ZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThiNzNmLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0XzEuMC4wLioKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjExYWYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzBiNGJjLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZTQyYmIuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gUnVudGltZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQ4MTI2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvbGljZW5zZS5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTQ0NjkzLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdC50ZXN0c18xLjAuMC4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0ODk5Yy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2FjYjY1Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTE6MDUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjU4ZmU2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBwcm9qZWN0IFRlc3RzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBwcm9qZWN0IFRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWZiNjRiLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvbGljZW5zZS5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyYWJmNy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotKi5iaW4uZGlzdC56aXAKLWJ1aWxkLnhtbAotZmVhdHVyZXMKLXBsdWdpbnMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwMTM3Mi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjAwOTM5Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjBjODguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBwcm9qZWN0IFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgcHJvamVjdCBTREsKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0YjliYS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvbGljZW5zZS5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZhYmZiNC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5jdnNpZ25vcmUgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTQwMWEyLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0XzEuMC4wLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdCBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTFiMDRjLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWVjMjlkLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTA6MDkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzYTllMC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4wLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lmh0bWwgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTYwNmIxLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5pbmkgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OGEzMjUuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ0aXBzQW5kVHJpY2tzSHJlZiIgY29udGFpbnMgdGhlIEhlbHAgdG9waWMgaHJlZiB0byBhIHRpcHMgYW5kIHRyaWNrcyBwYWdlIAotIyBvcHRpb25hbAotdGlwc0FuZFRyaWNrc0hyZWY9L29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCi0KLQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQubWFwcGluZ3MgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU5YmZjZS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1KYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29sc1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA2LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2NmYjBlLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5wbmcsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvY29tcG9uZW50LnhtbCBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZjEzM2YuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQiPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdCIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmRiLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5nZW4iIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5IiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5naWYgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIucG5nIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvcGx1Z2luLnByb3BlcnRpZXMgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1YTA4ZC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2YxOWIxLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjU4MzcuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTA6NDcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwMDkzOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjBmZDgwLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCAoT3B0aW9uYWwpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IChPcHRpb25hbCkKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LTA4IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4MTc2YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAoSlBBKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanB0LmZlYXR1cmUiIHZlcnNpb249IjIuMC4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzc3MzcyLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjMGE5ZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjZmNkNi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyoqLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGIxZDUwLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkp1bmUgMDYsIDIwMDc8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci0gIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZDVmMWMuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2FiZTY2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTY2NDA2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCAoT3B0aW9uYWwpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgSlBBIEVjbGlwc2VMaW5rIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkp1bmUgMDYsIDIwMDc8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGMwYTllLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1KYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmY2Q2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjFkNTAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkNWYxYy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjVkM2QuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1mZWF0dXJlLnRlbXAuZm9sZGVyCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZV8xLjAuMS4qCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmOTE1Ny4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjN2Q0Yi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MDk6NTkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDc5Y2NiLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkNDdkNy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCBTREsgKE9wdGlvbmFsKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIEpQQSBFY2xpcHNlTGluayBTdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNi0wOCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiODkyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzc3MzcyLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGViMmYwLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjU4MzcuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTA6NDcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwMDkzOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmIzOWYzLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgVG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LTA3IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYwNDBjNi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjAuMTAxLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIChKUEEpIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZ2VmIiB2ZXJzaW9uPSIzLjQuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZHQiIHZlcnNpb249IjMuNC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLnhzZCIgdmVyc2lvbj0iMi40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4iIHZlcnNpb249IjIuNC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIgdmVyc2lvbj0iMi40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUiIHZlcnNpb249IjMuMC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX2NvcmUuZmVhdHVyZSIgdmVyc2lvbj0iMy4wLjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZSIgdmVyc2lvbj0iMy4wLjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbGRldnRvb2xzLmZlYXR1cmUiIHZlcnNpb249IjEuNi4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZmVhdHVyZSIgdmVyc2lvbj0iMS42LjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5nZW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzczNzIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQxN2ZmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIFRvb2xzIFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5NTI5Yi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgZWNsaXBzZTMyLmdpZiwgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZiBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjFkNTAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0ODU0Ny4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgVG9vbHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MGRhZDMuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2N2Y1MzQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBUb29scwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgVG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IDIwMDggT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNGE0OC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDE3ZmYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgVG9vbHMgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTk1MjliLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBlY2xpcHNlMzIuZ2lmLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiMWQ1MC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ4NTQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBUb29scwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE3NjBmMi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzViODRhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjExOjE3IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTRkY2UuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZWM1MzYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi0jIFRPUkVWSUVXIC0gdXBkYXRlU2l0ZU5hbWUKLXVwZGF0ZVNpdGVOYW1lPVdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIFRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDNiZTMuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAoSlBBKSBKVW5pdCBUZXN0cyIKLSAgICAgIHZlcnNpb249IjIuMC4xLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzY1ZDNkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotZmVhdHVyZS50ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmVfMS4wLjEuKgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZGE3NTAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzdkNGIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjA5OjU5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ3YWI4ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanB0LmZlYXR1cmUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDIwNGEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyBQbHVnLWluIFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIEpQQSBUb29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYtMDcgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MWJmYzguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjAuMTAxLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRvYy5pc3YiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzczNzIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKaW5kZXggNTZmMDFjMy4uNjZhZmFkNyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpAQCAtMSwzICsxLDQgQEAKLSNUdWUgSmFuIDE1IDExOjEwOjMzIEVTVCAyMDA4CisjRnJpIFNlcCAyNSAxNTo0MTozOCBFRFQgMjAwOQogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2VuY29kaW5nLy9zY2hlbWEvb3JtXzJfMC54c2Q9VVRGOAogZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMmY5ZmE0OS4uMjE2ZDU3ZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNjUgKzMsOTAgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4wLjEwMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiAyLjMuMC5xdWFsaWZpZXIKIEJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW4KK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtQ2xhc3NQYXRoOiAuCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQogUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCiAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbTtidW5kbGUtdmVyc2lvbj0iWzIuMC4yMDAsMy4wLjApIiwKICBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjEwMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5kYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xLDIuMC4wKSIsCisgb3JnLmVjbGlwc2UuanB0LmRiO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKICBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCisgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMTAwLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuamVlLmVqYjtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjMuMCkiLAogIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKKyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMy4wKSIsCiAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS54c2Q7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiCisgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwyLjAuMCkiCiBFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmNvcmUsCiAgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dCwKICBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEsCiAgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0sCiAgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm07eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wcmVmczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmNvbW1vbi50cmFuc2xhdG9yczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpLG9yZy5lY2xpcHNlLmpwdC5nZW4iLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLnRyYW5zbGF0b3JzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuc3luY2g7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldDt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTE7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLnJlc291cmNlLmphdmEuYmluYXJ5O3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5yZXNvdXJjZS5qYXZhLnNvdXJjZTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbjt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucHJlZnM7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS54bWwsCisgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuc3luY2g7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5lbWY7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24sCisgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIsCisgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0sCisgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZSwKICBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLAogIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMCwKICBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZSwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbCwKICBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LAogIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKK0ltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS50ZXh0O3ZlcnNpb249IjQuMC4xIgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvY29tbW9uLmVjb3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvY29tbW9uLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNDE1YzAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9jb21tb24uZWNvcmUKQEAgLTAsMCArMSwxNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ieG1sIgorICAgIG5zVVJJPSJqcHQuY29tbW9uLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbCI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWJzdHJhY3RKcGFSb290RU9iamVjdCIgYWJzdHJhY3Q9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iIy8vSnBhUm9vdEVPYmplY3QiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKcGFSb290RU9iamVjdCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGxvd2VyQm91bmQ9IjEiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZW1hTG9jYXRpb24iIGxvd2VyQm91bmQ9IjEiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgPC9lQ2xhc3NpZmllcnM+Cis8L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvanBhUmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9qcGFSZXNvdXJjZU1vZGVscy5nZW5tb2RlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTVjNGZlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvanBhUmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwKQEAgLTAsMCArMSw1MjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgorICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYyIKKyAgICBjcmVhdGlvbkNvbW1hbmRzPSJmYWxzZSIgY3JlYXRpb25JY29ucz0iZmFsc2UiIGVkaXREaXJlY3Rvcnk9IiIgZWRpdG9yRGlyZWN0b3J5PSIiCisgICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanB0LmNvcmUiIG1vZGVsTmFtZT0iQ29yZSIgZWRpdFBsdWdpbkNsYXNzPSIiIGVkaXRvclBsdWdpbkNsYXNzPSIiCisgICAgdXBkYXRlQ2xhc3NwYXRoPSJmYWxzZSIgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0IgorICAgIHJvb3RFeHRlbmRzQ2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3QiIHN1cHByZXNzSW50ZXJmYWNlcz0idHJ1ZSIKKyAgICB0ZXN0c0RpcmVjdG9yeT0iIiB0ZXN0U3VpdGVDbGFzcz0iIiBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIuZWNvcmUiCisgICAgY29tcGxpYW5jZUxldmVsPSI1LjAiIGNvcHlyaWdodEZpZWxkcz0iZmFsc2UiIHVzZWRHZW5QYWNrYWdlcz0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZSI+CisgIDxmb3JlaWduTW9kZWw+Y29tbW9uLmVjb3JlPC9mb3JlaWduTW9kZWw+CisgIDxmb3JlaWduTW9kZWw+b3JtLmVjb3JlPC9mb3JlaWduTW9kZWw+CisgIDxmb3JlaWduTW9kZWw+cGVyc2lzdGVuY2UuZWNvcmU8L2ZvcmVpZ25Nb2RlbD4KKyAgPGdlblBhY2thZ2VzIHByZWZpeD0iQ29tbW9uIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCisgICAgICBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGVjb3JlUGFja2FnZT0iY29tbW9uLmVjb3JlIy8iPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vQWJzdHJhY3RKcGFSb290RU9iamVjdCIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iY29tbW9uLmVjb3JlIy8vSnBhUm9vdEVPYmplY3QiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0pwYVJvb3RFT2JqZWN0L3ZlcnNpb24iLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21tb24uZWNvcmUjLy9KcGFSb290RU9iamVjdC9zY2hlbWFMb2NhdGlvbiIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgPC9nZW5QYWNrYWdlcz4KKyAgPGdlblBhY2thZ2VzIHByZWZpeD0iT3JtIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCisgICAgICBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGVjb3JlUGFja2FnZT0ib3JtLmVjb3JlIy8iPgorICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJvcm0uZWNvcmUjLy9BY2Nlc3NUeXBlIj4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vQWNjZXNzVHlwZS9QUk9QRVJUWSIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9BY2Nlc3NUeXBlL0ZJRUxEIi8+CisgICAgPC9nZW5FbnVtcz4KKyAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib3JtLmVjb3JlIy8vRGlzY3JpbWluYXRvclR5cGUiPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9EaXNjcmltaW5hdG9yVHlwZS9TVFJJTkciLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vRGlzY3JpbWluYXRvclR5cGUvQ0hBUiIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9EaXNjcmltaW5hdG9yVHlwZS9JTlRFR0VSIi8+CisgICAgPC9nZW5FbnVtcz4KKyAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib3JtLmVjb3JlIy8vRW51bVR5cGUiPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9FbnVtVHlwZS9PUkRJTkFMIi8+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0VudW1UeXBlL1NUUklORyIvPgorICAgIDwvZ2VuRW51bXM+CisgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09Im9ybS5lY29yZSMvL0ZldGNoVHlwZSI+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0ZldGNoVHlwZS9MQVpZIi8+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0ZldGNoVHlwZS9FQUdFUiIvPgorICAgIDwvZ2VuRW51bXM+CisgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09Im9ybS5lY29yZSMvL0dlbmVyYXRpb25UeXBlIj4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vR2VuZXJhdGlvblR5cGUvVEFCTEUiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vR2VuZXJhdGlvblR5cGUvU0VRVUVOQ0UiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vR2VuZXJhdGlvblR5cGUvSURFTlRJVFkiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vR2VuZXJhdGlvblR5cGUvQVVUTyIvPgorICAgIDwvZ2VuRW51bXM+CisgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09Im9ybS5lY29yZSMvL0luaGVyaXRhbmNlVHlwZSI+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0luaGVyaXRhbmNlVHlwZS9TSU5HTEVfVEFCTEUiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vSW5oZXJpdGFuY2VUeXBlL0pPSU5FRCIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9Jbmhlcml0YW5jZVR5cGUvVEFCTEVfUEVSX0NMQVNTIi8+CisgICAgPC9nZW5FbnVtcz4KKyAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib3JtLmVjb3JlIy8vVGVtcG9yYWxUeXBlIj4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vVGVtcG9yYWxUeXBlL0RBVEUiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vVGVtcG9yYWxUeXBlL1RJTUUiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vVGVtcG9yYWxUeXBlL1RJTUVTVEFNUCIvPgorICAgIDwvZ2VuRW51bXM+CisgICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJvcm0uZWNvcmUjLy9EaXNjcmltaW5hdG9yVmFsdWUiLz4KKyAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im9ybS5lY29yZSMvL0VudW1lcmF0ZWQiLz4KKyAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im9ybS5lY29yZSMvL09yZGVyQnkiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxDb2x1bW4iPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0Fic3RyYWN0WG1sQ29sdW1uL2luc2VydGFibGUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbENvbHVtbi9udWxsYWJsZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0Fic3RyYWN0WG1sQ29sdW1uL3RhYmxlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxDb2x1bW4vdW5pcXVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxDb2x1bW4vdXBkYXRhYmxlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxFbWJlZGRlZCIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmciPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0Fic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nL29yZGVyQnkiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcvbWFwS2V5Ii8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxOYW1lZENvbHVtbiI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxOYW1lZENvbHVtbi9jb2x1bW5EZWZpbml0aW9uIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxOYW1lZENvbHVtbi9uYW1lIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcvdGFyZ2V0RW50aXR5Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nL2ZldGNoIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0Fic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZy9jYXNjYWRlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcvb3B0aW9uYWwiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbFRhYmxlIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbFRhYmxlL25hbWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbFRhYmxlL2NhdGFsb2ciLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbFRhYmxlL3NjaGVtYSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbFRhYmxlL3VuaXF1ZUNvbnN0cmFpbnRzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxUeXBlTWFwcGluZyIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQWNjZXNzSG9sZGVyIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxBY2Nlc3NIb2xkZXIvYWNjZXNzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQXR0cmlidXRlTWFwcGluZyI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQXR0cmlidXRlTWFwcGluZy9uYW1lIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGUiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGUvbmFtZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci9hc3NvY2lhdGlvbk92ZXJyaWRlcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sQXR0cmlidXRlT3ZlcnJpZGUvY29sdW1uIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQXR0cmlidXRlT3ZlcnJpZGUvbmFtZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyL2F0dHJpYnV0ZU92ZXJyaWRlcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQXR0cmlidXRlcy9pZHMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQXR0cmlidXRlcy9lbWJlZGRlZElkcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL2Jhc2ljcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL3ZlcnNpb25zIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0F0dHJpYnV0ZXMvbWFueVRvT25lcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL29uZVRvTWFueXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQXR0cmlidXRlcy9vbmVUb09uZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQXR0cmlidXRlcy9tYW55VG9NYW55cyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL2VtYmVkZGVkcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL3RyYW5zaWVudHMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxCYXNpYyI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQmFzaWMvZmV0Y2giLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxCYXNpYy9vcHRpb25hbCIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9DYXNjYWRlVHlwZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0Nhc2NhZGVUeXBlL2Nhc2NhZGVBbGwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQ2FzY2FkZVR5cGUvY2FzY2FkZVBlcnNpc3QiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQ2FzY2FkZVR5cGUvY2FzY2FkZU1lcmdlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0Nhc2NhZGVUeXBlL2Nhc2NhZGVSZW1vdmUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQ2FzY2FkZVR5cGUvY2FzY2FkZVJlZnJlc2giLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQ29sbGVjdGlvblRhYmxlIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxDb2x1bW4iPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbENvbHVtbi9sZW5ndGgiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxDb2x1bW4vcHJlY2lzaW9uIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQ29sdW1uL3NjYWxlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0NvbHVtbk1hcHBpbmciPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9Db2x1bW5NYXBwaW5nL2NvbHVtbiIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9Db2x1bW5SZXN1bHQiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0NvbHVtblJlc3VsdC9uYW1lIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQ29udmVydGlibGVNYXBwaW5nIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmcvbG9iIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQ29udmVydGlibGVNYXBwaW5nL3RlbXBvcmFsIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQ29udmVydGlibGVNYXBwaW5nL2VudW1lcmF0ZWQiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sRGlzY3JpbWluYXRvckNvbHVtbiI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRGlzY3JpbWluYXRvckNvbHVtbi9kaXNjcmltaW5hdG9yVHlwZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbERpc2NyaW1pbmF0b3JDb2x1bW4vbGVuZ3RoIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEVsZW1lbnRDb2xsZWN0aW9uIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sRW1iZWRkYWJsZSIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sRW1iZWRkZWQiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEVtYmVkZGVkSWQiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxFbnRpdHkiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEVudGl0eS9uYW1lIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS90YWJsZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvc2Vjb25kYXJ5VGFibGVzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS9wcmltYXJ5S2V5Sm9pbkNvbHVtbnMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L2lkQ2xhc3MiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L2luaGVyaXRhbmNlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRW50aXR5L2Rpc2NyaW1pbmF0b3JWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvZGlzY3JpbWluYXRvckNvbHVtbiIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvc3FsUmVzdWx0U2V0TWFwcGluZ3MiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L2VudGl0eUxpc3RlbmVycyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9FbnRpdHlMaXN0ZW5lciI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vRW50aXR5TGlzdGVuZXIvY2xhc3NOYW1lIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0VudGl0eUxpc3RlbmVycyI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0VudGl0eUxpc3RlbmVycy9lbnRpdHlMaXN0ZW5lcnMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL2Rlc2NyaXB0aW9uIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL3BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MvcGFja2FnZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL3NjaGVtYSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL2NhdGFsb2ciLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3Mvc2VxdWVuY2VHZW5lcmF0b3JzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL3RhYmxlR2VuZXJhdG9ycyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9zcWxSZXN1bHRTZXRNYXBwaW5ncyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9tYXBwZWRTdXBlcmNsYXNzZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MvZW50aXRpZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MvZW1iZWRkYWJsZXMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vRW50aXR5UmVzdWx0Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9FbnRpdHlSZXN1bHQvZGlzY3JpbWluYXRvckNvbHVtbiIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0VudGl0eVJlc3VsdC9lbnRpdHlDbGFzcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9FbnRpdHlSZXN1bHQvZmllbGRSZXN1bHRzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0V2ZW50TWV0aG9kIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9FdmVudE1ldGhvZC9tZXRob2ROYW1lIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sRXZlbnRNZXRob2RDb250YWluZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFdmVudE1ldGhvZENvbnRhaW5lci9wcmVQZXJzaXN0Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEV2ZW50TWV0aG9kQ29udGFpbmVyL3Bvc3RQZXJzaXN0Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEV2ZW50TWV0aG9kQ29udGFpbmVyL3ByZVJlbW92ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFdmVudE1ldGhvZENvbnRhaW5lci9wb3N0UmVtb3ZlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEV2ZW50TWV0aG9kQ29udGFpbmVyL3ByZVVwZGF0ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFdmVudE1ldGhvZENvbnRhaW5lci9wb3N0VXBkYXRlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEV2ZW50TWV0aG9kQ29udGFpbmVyL3Bvc3RMb2FkIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0ZpZWxkUmVzdWx0Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9GaWVsZFJlc3VsdC9uYW1lIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vRmllbGRSZXN1bHQvY29sdW1uIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sR2VuZXJhdGVkVmFsdWUiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEdlbmVyYXRlZFZhbHVlL2dlbmVyYXRvciIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEdlbmVyYXRlZFZhbHVlL3N0cmF0ZWd5Ii8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sR2VuZXJhdG9yIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxHZW5lcmF0b3IvbmFtZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEdlbmVyYXRvci9pbml0aWFsVmFsdWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxHZW5lcmF0b3IvYWxsb2NhdGlvblNpemUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxHZW5lcmF0b3JDb250YWluZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxHZW5lcmF0b3JDb250YWluZXIvc2VxdWVuY2VHZW5lcmF0b3IiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sR2VuZXJhdG9yQ29udGFpbmVyL3RhYmxlR2VuZXJhdG9yIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sSWQiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxJZC9nZW5lcmF0ZWRWYWx1ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxJZENsYXNzIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxJZENsYXNzL2NsYXNzTmFtZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9Jbmhlcml0YW5jZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vSW5oZXJpdGFuY2Uvc3RyYXRlZ3kiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxKb2luQ29sdW1uIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxKb2luQ29sdW1uL3JlZmVyZW5jZWRDb2x1bW5OYW1lIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sSm9pbkNvbHVtbnNNYXBwaW5nIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sSm9pbkNvbHVtbnNNYXBwaW5nL2pvaW5Db2x1bW5zIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sSm9pblRhYmxlIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sSm9pblRhYmxlL2pvaW5Db2x1bW5zIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEpvaW5UYWJsZS9pbnZlcnNlSm9pbkNvbHVtbnMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sSm9pblRhYmxlTWFwcGluZyI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEpvaW5UYWJsZU1hcHBpbmcvam9pblRhYmxlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0xvYiIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTWFueVRvTWFueSIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTWFueVRvT25lIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vTWFwS2V5Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9NYXBLZXkvbmFtZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxNYXBLZXlDbGFzcyIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTWFwcGVkQnlNYXBwaW5nIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxNYXBwZWRCeU1hcHBpbmcvbWFwcGVkQnkiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTWFwcGVkU3VwZXJjbGFzcyI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvaWRDbGFzcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL2V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvZW50aXR5TGlzdGVuZXJzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE5hbWVkTmF0aXZlUXVlcnkiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbE5hbWVkTmF0aXZlUXVlcnkvcmVzdWx0Q2xhc3MiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxOYW1lZE5hdGl2ZVF1ZXJ5L3Jlc3VsdFNldE1hcHBpbmciLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTmFtZWRRdWVyeSIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmciLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE9uZVRvTWFueSIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sT25lVG9PbmUiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxPbmVUb09uZS9wcmltYXJ5S2V5Sm9pbkNvbHVtbnMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sT3JkZXJDb2x1bW4iLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMvc2NoZW1hIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMvY2F0YWxvZyIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzL2Nhc2NhZGVQZXJzaXN0Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzL2VudGl0eUxpc3RlbmVycyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEveG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEvcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vUG9zdExvYWQiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9Qb3N0UGVyc2lzdCIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1Bvc3RSZW1vdmUiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9Qb3N0VXBkYXRlIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vUHJlUGVyc2lzdCIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1ByZVJlbW92ZSIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1ByZVVwZGF0ZSIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFByaW1hcnlLZXlKb2luQ29sdW1uIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi9yZWZlcmVuY2VkQ29sdW1uTmFtZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFF1ZXJ5Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxRdWVyeS9uYW1lIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sUXVlcnkvcXVlcnkiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sUXVlcnkvaGludHMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxRdWVyeUNvbnRhaW5lciI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbFF1ZXJ5Q29udGFpbmVyL25hbWVkUXVlcmllcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxRdWVyeUNvbnRhaW5lci9uYW1lZE5hdGl2ZVF1ZXJpZXMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sUXVlcnlIaW50Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxRdWVyeUhpbnQvbmFtZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFF1ZXJ5SGludC92YWx1ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxTZWNvbmRhcnlUYWJsZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbFNlY29uZGFyeVRhYmxlL3ByaW1hcnlLZXlKb2luQ29sdW1ucyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFNlcXVlbmNlR2VuZXJhdG9yIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxTZXF1ZW5jZUdlbmVyYXRvci9zZXF1ZW5jZU5hbWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vU3FsUmVzdWx0U2V0TWFwcGluZyI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vU3FsUmVzdWx0U2V0TWFwcGluZy9uYW1lIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1NxbFJlc3VsdFNldE1hcHBpbmcvZW50aXR5UmVzdWx0cyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9TcWxSZXN1bHRTZXRNYXBwaW5nL2NvbHVtblJlc3VsdHMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sVGFibGUiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxUYWJsZUdlbmVyYXRvci90YWJsZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yL2NhdGFsb2ciLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxUYWJsZUdlbmVyYXRvci9zY2hlbWEiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxUYWJsZUdlbmVyYXRvci9wa0NvbHVtbk5hbWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxUYWJsZUdlbmVyYXRvci92YWx1ZUNvbHVtbk5hbWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxUYWJsZUdlbmVyYXRvci9wa0NvbHVtblZhbHVlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yL3VuaXF1ZUNvbnN0cmFpbnRzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sVHJhbnNpZW50Ii8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxUeXBlTWFwcGluZyI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sVHlwZU1hcHBpbmcvY2xhc3NOYW1lIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sVHlwZU1hcHBpbmcvbWV0YWRhdGFDb21wbGV0ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFR5cGVNYXBwaW5nL2Rlc2NyaXB0aW9uIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbFR5cGVNYXBwaW5nL2F0dHJpYnV0ZXMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sVW5pcXVlQ29uc3RyYWludCI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sVW5pcXVlQ29uc3RyYWludC9jb2x1bW5OYW1lcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFZlcnNpb24iLz4KKyAgICA8bmVzdGVkR2VuUGFja2FnZXMgcHJlZml4PSJPcm1WMl8wIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtIgorICAgICAgICBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIiBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGVjb3JlUGFja2FnZT0ib3JtLmVjb3JlIy8vdjJfMCI+CisgICAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib3JtLmVjb3JlIy8vdjJfMC9Mb2NrTW9kZVR5cGVfMl8wIj4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy92Ml8wL0xvY2tNb2RlVHlwZV8yXzAvUkVBRCIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL3YyXzAvTG9ja01vZGVUeXBlXzJfMC9XUklURSIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL3YyXzAvTG9ja01vZGVUeXBlXzJfMC9PUFRJTUlTVElDIi8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vdjJfMC9Mb2NrTW9kZVR5cGVfMl8wL09QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vdjJfMC9Mb2NrTW9kZVR5cGVfMl8wL1BFU1NJTUlTVElDX1JFQUQiLz4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy92Ml8wL0xvY2tNb2RlVHlwZV8yXzAvUEVTU0lNSVNUSUNfV1JJVEUiLz4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy92Ml8wL0xvY2tNb2RlVHlwZV8yXzAvUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+CisgICAgICA8L2dlbkVudW1zPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbEF0dHJpYnV0ZU1hcHBpbmdfMl8wIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMC9kZXNjcmlwdGlvbiIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL3YyXzAvWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAvam9pblRhYmxlIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wIj4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wL2Rlc2NyaXB0aW9uIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sQXR0cmlidXRlc18yXzAiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxBdHRyaWJ1dGVzXzJfMC9kZXNjcmlwdGlvbiIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL3YyXzAvWG1sQXR0cmlidXRlc18yXzAvZWxlbWVudENvbGxlY3Rpb25zIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sQ29sbGVjdGlvblRhYmxlXzJfMCI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vdjJfMC9YbWxDb2xsZWN0aW9uVGFibGVfMl8wL2pvaW5Db2x1bW5zIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sRGVyaXZlZElkXzJfMCI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbERlcml2ZWRJZF8yXzAvaWQiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAvdGFyZ2V0Q2xhc3MiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wL2ZldGNoIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC9vcmRlckJ5Ii8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAvb3JkZXJDb2x1bW4iLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC9tYXBLZXkiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC9tYXBLZXlDbGFzcyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAvbWFwS2V5VGVtcG9yYWwiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wL21hcEtleUVudW1lcmF0ZWQiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC9tYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC9tYXBLZXlDb2x1bW4iLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC9tYXBLZXlKb2luQ29sdW1ucyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wL2NvbHVtbiIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wL2F0dHJpYnV0ZU92ZXJyaWRlcyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wL2Fzc29jaWF0aW9uT3ZlcnJpZGVzIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAvY29sbGVjdGlvblRhYmxlIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sRW1iZWRkZWRfMl8wIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sRW50aXR5XzJfMCIvPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbEVudGl0eUxpc3RlbmVyXzJfMCI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbEVudGl0eUxpc3RlbmVyXzJfMC9kZXNjcmlwdGlvbiIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbEV2ZW50TWV0aG9kXzJfMCI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbEV2ZW50TWV0aG9kXzJfMC9kZXNjcmlwdGlvbiIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbEdlbmVyYXRvcl8yXzAiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxHZW5lcmF0b3JfMl8wL2Rlc2NyaXB0aW9uIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sTWFueVRvTWFueV8yXzAiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL3YyXzAvWG1sTWFueVRvTWFueV8yXzAvb3JkZXJDb2x1bW4iLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy92Ml8wL1htbE1hbnlUb01hbnlfMl8wL21hcEtleUNsYXNzIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbE1hbnlUb01hbnlfMl8wL21hcEtleVRlbXBvcmFsIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbE1hbnlUb01hbnlfMl8wL21hcEtleUVudW1lcmF0ZWQiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy92Ml8wL1htbE1hbnlUb01hbnlfMl8wL21hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL3YyXzAvWG1sTWFueVRvTWFueV8yXzAvbWFwS2V5Q29sdW1uIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vdjJfMC9YbWxNYW55VG9NYW55XzJfMC9tYXBLZXlKb2luQ29sdW1ucyIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbE1hcEtleUNsYXNzXzJfMCI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbE1hcEtleUNsYXNzXzJfMC9jbGFzc05hbWUiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxNYXBzSWRfMl8wIj4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sTWFwc0lkXzJfMC9tYXBzSWQiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxOYW1lZFF1ZXJ5XzJfMCI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbE5hbWVkUXVlcnlfMl8wL2xvY2tNb2RlIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sT25lVG9NYW55XzJfMCI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vdjJfMC9YbWxPbmVUb01hbnlfMl8wL29yZGVyQ29sdW1uIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vdjJfMC9YbWxPbmVUb01hbnlfMl8wL21hcEtleUNsYXNzIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbE9uZVRvTWFueV8yXzAvbWFwS2V5VGVtcG9yYWwiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sT25lVG9NYW55XzJfMC9tYXBLZXlFbnVtZXJhdGVkIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vdjJfMC9YbWxPbmVUb01hbnlfMl8wL21hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL3YyXzAvWG1sT25lVG9NYW55XzJfMC9tYXBLZXlDb2x1bW4iLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy92Ml8wL1htbE9uZVRvTWFueV8yXzAvbWFwS2V5Sm9pbkNvbHVtbnMiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxPbmVUb09uZV8yXzAiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxPcmRlckNvbHVtbl8yXzAiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxPcmRlckNvbHVtbl8yXzAvbnVsbGFibGUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wL2luc2VydGFibGUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wL3VwZGF0YWJsZSIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMC9kZXNjcmlwdGlvbiIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAvZGVsaW1pdGVkSWRlbnRpZmllcnMiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wIj4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wL2Rlc2NyaXB0aW9uIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sUXVlcnlfMl8wIj4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sUXVlcnlfMl8wL2Rlc2NyaXB0aW9uIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sUXVlcnlIaW50XzJfMCI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbFF1ZXJ5SGludF8yXzAvZGVzY3JpcHRpb24iLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAvY2F0YWxvZyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAvc2NoZW1hIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMCI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wL2Rlc2NyaXB0aW9uIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sVW5pcXVlQ29uc3RyYWludF8yXzAiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxVbmlxdWVDb25zdHJhaW50XzJfMC9uYW1lIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbENhY2hlYWJsZTJfMCI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbENhY2hlYWJsZTJfMC9jYWNoZWFibGUiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxPcnBoYW5SZW1vdmFibGUyXzAiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxPcnBoYW5SZW1vdmFibGUyXzAvb3JwaGFuUmVtb3ZhbCIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgIDwvbmVzdGVkR2VuUGFja2FnZXM+CisgIDwvZ2VuUGFja2FnZXM+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlBlcnNpc3RlbmNlIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCisgICAgICBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGVjb3JlUGFja2FnZT0icGVyc2lzdGVuY2UuZWNvcmUjLyI+CisgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIj4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0icGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUvSlRBIi8+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlL1JFU09VUkNFX0xPQ0FMIi8+CisgICAgPC9nZW5FbnVtcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1htbEphdmFDbGFzc1JlZiI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxKYXZhQ2xhc3NSZWYvamF2YUNsYXNzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sSmFyRmlsZVJlZiI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxKYXJGaWxlUmVmL2ZpbGVOYW1lIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sTWFwcGluZ0ZpbGVSZWYiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sTWFwcGluZ0ZpbGVSZWYvZmlsZU5hbWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VVbml0cyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdCI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXQvZGVzY3JpcHRpb24iLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdC9wcm92aWRlciIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L2p0YURhdGFTb3VyY2UiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdC9ub25KdGFEYXRhU291cmNlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L21hcHBpbmdGaWxlcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L2phckZpbGVzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L2NsYXNzZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdC9leGNsdWRlVW5saXN0ZWRDbGFzc2VzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L3Byb3BlcnRpZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdC9uYW1lIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXQvdHJhbnNhY3Rpb25UeXBlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUHJvcGVydGllcyI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUHJvcGVydGllcy9wcm9wZXJ0aWVzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUHJvcGVydHkiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUHJvcGVydHkvbmFtZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUHJvcGVydHkvdmFsdWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPG5lc3RlZEdlblBhY2thZ2VzIHByZWZpeD0iUGVyc2lzdGVuY2VWMl8wIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UiCisgICAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIGFkYXB0ZXJGYWN0b3J5PSJmYWxzZSIgZWNvcmVQYWNrYWdlPSJwZXJzaXN0ZW5jZS5lY29yZSMvL3YyXzAiPgorICAgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09InBlcnNpc3RlbmNlLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAiPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InBlcnNpc3RlbmNlLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAvQUxMIi8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0icGVyc2lzdGVuY2UuZWNvcmUjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC9OT05FIi8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0icGVyc2lzdGVuY2UuZWNvcmUjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC9FTkFCTEVfU0VMRUNUSVZFIi8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0icGVyc2lzdGVuY2UuZWNvcmUjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC9ESVNBQkxFX1NFTEVDVElWRSIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InBlcnNpc3RlbmNlLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAvVU5TUEVDSUZJRUQiLz4KKyAgICAgIDwvZ2VuRW51bXM+CisgICAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0icGVyc2lzdGVuY2UuZWNvcmUjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAiPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InBlcnNpc3RlbmNlLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wL0FVVE8iLz4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJwZXJzaXN0ZW5jZS5lY29yZSMvL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMC9DQUxMQkFDSyIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InBlcnNpc3RlbmNlLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wL05PTkUiLz4KKyAgICAgIDwvZ2VuRW51bXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InBlcnNpc3RlbmNlLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wIj4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wL3NoYXJlZENhY2hlTW9kZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdF8yXzAvdmFsaWRhdGlvbk1vZGUiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8L25lc3RlZEdlblBhY2thZ2VzPgorICA8L2dlblBhY2thZ2VzPgorPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL2pwdFJlc291cmNlTW9kZWxzLmdlbm1vZGVsIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvanB0UmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMGUwY2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvanB0UmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjIgotICAgIGNyZWF0aW9uQ29tbWFuZHM9ImZhbHNlIiBjcmVhdGlvbkljb25zPSJmYWxzZSIgZWRpdERpcmVjdG9yeT0iIiBlZGl0b3JEaXJlY3Rvcnk9IiIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5qcHQuY29yZSIgbW9kZWxOYW1lPSJDb3JlIiBlZGl0UGx1Z2luQ2xhc3M9IiIgZWRpdG9yUGx1Z2luQ2xhc3M9IiIKLSAgICByb290RXh0ZW5kc0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYUVPYmplY3QiIHJvb3RFeHRlbmRzQ2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3QiCi0gICAgc3VwcHJlc3NJbnRlcmZhY2VzPSJ0cnVlIiB0ZXN0c0RpcmVjdG9yeT0iIiB0ZXN0U3VpdGVDbGFzcz0iIiBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIuZWNvcmUiCi0gICAgY29tcGxpYW5jZUxldmVsPSI1LjAiIGNvcHlyaWdodEZpZWxkcz0iZmFsc2UiIHVzZWRHZW5QYWNrYWdlcz0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZSI+Ci0gIDxmb3JlaWduTW9kZWw+b3JtLmVjb3JlPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+cGVyc2lzdGVuY2UuZWNvcmU8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iT3JtIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGVjb3JlUGFja2FnZT0ib3JtLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJvcm0uZWNvcmUjLy9BY2Nlc3NUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vQWNjZXNzVHlwZS9QUk9QRVJUWSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9BY2Nlc3NUeXBlL0ZJRUxEIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib3JtLmVjb3JlIy8vRGlzY3JpbWluYXRvclR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9EaXNjcmltaW5hdG9yVHlwZS9TVFJJTkciLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vRGlzY3JpbWluYXRvclR5cGUvQ0hBUiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9EaXNjcmltaW5hdG9yVHlwZS9JTlRFR0VSIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib3JtLmVjb3JlIy8vRW51bVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9FbnVtVHlwZS9PUkRJTkFMIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0VudW1UeXBlL1NUUklORyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09Im9ybS5lY29yZSMvL0ZldGNoVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0ZldGNoVHlwZS9MQVpZIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0ZldGNoVHlwZS9FQUdFUiIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09Im9ybS5lY29yZSMvL0dlbmVyYXRpb25UeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vR2VuZXJhdGlvblR5cGUvVEFCTEUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vR2VuZXJhdGlvblR5cGUvU0VRVUVOQ0UiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vR2VuZXJhdGlvblR5cGUvSURFTlRJVFkiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vR2VuZXJhdGlvblR5cGUvQVVUTyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09Im9ybS5lY29yZSMvL0luaGVyaXRhbmNlVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0luaGVyaXRhbmNlVHlwZS9TSU5HTEVfVEFCTEUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vSW5oZXJpdGFuY2VUeXBlL0pPSU5FRCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9Jbmhlcml0YW5jZVR5cGUvVEFCTEVfUEVSX0NMQVNTIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib3JtLmVjb3JlIy8vVGVtcG9yYWxUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vVGVtcG9yYWxUeXBlL0RBVEUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vVGVtcG9yYWxUeXBlL1RJTUUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vVGVtcG9yYWxUeXBlL1RJTUVTVEFNUCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJvcm0uZWNvcmUjLy9EaXNjcmltaW5hdG9yVmFsdWUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im9ybS5lY29yZSMvL0VudW1lcmF0ZWQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im9ybS5lY29yZSMvL09yZGVyQnkiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im9ybS5lY29yZSMvL1ZlcnNpb25UeXBlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL3BhY2thZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9zY2hlbWEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9jYXRhbG9nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MvYWNjZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL3NlcXVlbmNlR2VuZXJhdG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy90YWJsZUdlbmVyYXRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MvbmFtZWRRdWVyaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL25hbWVkTmF0aXZlUXVlcmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9zcWxSZXN1bHRTZXRNYXBwaW5ncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9tYXBwZWRTdXBlcmNsYXNzZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MvZW50aXRpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MvZW1iZWRkYWJsZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhL3htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhL3BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy9zY2hlbWEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy9jYXRhbG9nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMvYWNjZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMvY2FzY2FkZVBlcnNpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMvZW50aXR5TGlzdGVuZXJzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxUeXBlTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxUeXBlTWFwcGluZy9jbGFzc05hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbFR5cGVNYXBwaW5nL2FjY2VzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0Fic3RyYWN0WG1sVHlwZU1hcHBpbmcvbWV0YWRhdGFDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0Fic3RyYWN0WG1sVHlwZU1hcHBpbmcvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxUeXBlTWFwcGluZy9hdHRyaWJ1dGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL2lkQ2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL2V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sTWFwcGVkU3VwZXJjbGFzcy9leGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL2VudGl0eUxpc3RlbmVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL3ByZVBlcnNpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sTWFwcGVkU3VwZXJjbGFzcy9wb3N0UGVyc2lzdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL3ByZVJlbW92ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL3Bvc3RSZW1vdmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sTWFwcGVkU3VwZXJjbGFzcy9wcmVVcGRhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sTWFwcGVkU3VwZXJjbGFzcy9wb3N0VXBkYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvcG9zdExvYWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sRW50aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvdGFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L3NlY29uZGFyeVRhYmxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvcHJpbWFyeUtleUpvaW5Db2x1bW5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS9pZENsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS9pbmhlcml0YW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEVudGl0eS9kaXNjcmltaW5hdG9yVmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L2Rpc2NyaW1pbmF0b3JDb2x1bW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L3NlcXVlbmNlR2VuZXJhdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS90YWJsZUdlbmVyYXRvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvbmFtZWRRdWVyaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS9uYW1lZE5hdGl2ZVF1ZXJpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L3NxbFJlc3VsdFNldE1hcHBpbmdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRW50aXR5L2V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRW50aXR5L2V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS9lbnRpdHlMaXN0ZW5lcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L3ByZVBlcnNpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L3Bvc3RQZXJzaXN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS9wcmVSZW1vdmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L3Bvc3RSZW1vdmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L3ByZVVwZGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvcG9zdFVwZGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvcG9zdExvYWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L2F0dHJpYnV0ZU92ZXJyaWRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvYXNzb2NpYXRpb25PdmVycmlkZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sRW1iZWRkYWJsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0F0dHJpYnV0ZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL2lkcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL2VtYmVkZGVkSWRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0F0dHJpYnV0ZXMvYmFzaWNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0F0dHJpYnV0ZXMvdmVyc2lvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQXR0cmlidXRlcy9tYW55VG9PbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0F0dHJpYnV0ZXMvb25lVG9NYW55cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL29uZVRvT25lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL21hbnlUb01hbnlzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0F0dHJpYnV0ZXMvZW1iZWRkZWRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0F0dHJpYnV0ZXMvdHJhbnNpZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU1hcHBpbmcvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmciLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9Db2x1bW5NYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQ29sdW1uTWFwcGluZy9jb2x1bW4iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxSZWxhdGlvbnNoaXBNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxSZWxhdGlvbnNoaXBNYXBwaW5nL3RhcmdldEVudGl0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFJlbGF0aW9uc2hpcE1hcHBpbmcvZmV0Y2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sUmVsYXRpb25zaGlwTWFwcGluZy9qb2luVGFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sUmVsYXRpb25zaGlwTWFwcGluZy9jYXNjYWRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcvbWFwcGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcvb3JkZXJCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcvbWFwS2V5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy9vcHRpb25hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nL2pvaW5Db2x1bW5zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sSWQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxJZC9nZW5lcmF0ZWRWYWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbElkL3RlbXBvcmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbElkL3RhYmxlR2VuZXJhdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbElkL3NlcXVlbmNlR2VuZXJhdG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbElkSW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQmFzZVhtbEVtYmVkZGVkIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQmFzZVhtbEVtYmVkZGVkL2F0dHJpYnV0ZU92ZXJyaWRlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEVtYmVkZGVkSWQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxFbWJlZGRlZElkSW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sRW1iZWRkZWQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxFbWJlZGRlZEltcGwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEJhc2ljIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxCYXNpYy9mZXRjaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEJhc2ljL29wdGlvbmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQmFzaWMvbG9iIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQmFzaWMvdGVtcG9yYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxCYXNpYy9lbnVtZXJhdGVkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEJhc2ljSW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sVmVyc2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sVmVyc2lvbi90ZW1wb3JhbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxWZXJzaW9uSW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTWFueVRvT25lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTWFueVRvT25lSW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sT25lVG9NYW55Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sT25lVG9NYW55L2pvaW5Db2x1bW5zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE9uZVRvTWFueUltcGwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE9uZVRvT25lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxPbmVUb09uZS9tYXBwZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxPbmVUb09uZS9wcmltYXJ5S2V5Sm9pbkNvbHVtbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sT25lVG9PbmVJbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxNYW55VG9NYW55Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTWFueVRvTWFueUltcGwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFRyYW5zaWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFRyYW5zaWVudEltcGwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sQXNzb2NpYXRpb25PdmVycmlkZS9qb2luQ29sdW1ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGUvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQXR0cmlidXRlT3ZlcnJpZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZS9jb2x1bW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZS9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0Nhc2NhZGVUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQ2FzY2FkZVR5cGUvY2FzY2FkZUFsbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9DYXNjYWRlVHlwZS9jYXNjYWRlUGVyc2lzdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9DYXNjYWRlVHlwZS9jYXNjYWRlTWVyZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQ2FzY2FkZVR5cGUvY2FzY2FkZVJlbW92ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9DYXNjYWRlVHlwZS9jYXNjYWRlUmVmcmVzaCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9DYXNjYWRlVHlwZUltcGwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE5hbWVkQ29sdW1uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxOYW1lZENvbHVtbi9jb2x1bW5EZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sTmFtZWRDb2x1bW4vbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0Fic3RyYWN0WG1sTmFtZWRDb2x1bW4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEFic3RyYWN0Q29sdW1uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxBYnN0cmFjdENvbHVtbi9pbnNlcnRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQWJzdHJhY3RDb2x1bW4vbnVsbGFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxBYnN0cmFjdENvbHVtbi90YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEFic3RyYWN0Q29sdW1uL3VuaXF1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEFic3RyYWN0Q29sdW1uL3VwZGF0YWJsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0Fic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbENvbHVtbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQ29sdW1uL2xlbmd0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbENvbHVtbi9wcmVjaXNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxDb2x1bW4vc2NhbGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQ29sdW1uSW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0NvbHVtblJlc3VsdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQ29sdW1uUmVzdWx0L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sRGlzY3JpbWluYXRvckNvbHVtbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRGlzY3JpbWluYXRvckNvbHVtbi9kaXNjcmltaW5hdG9yVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbERpc2NyaW1pbmF0b3JDb2x1bW4vbGVuZ3RoIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0VudGl0eUxpc3RlbmVycyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0VudGl0eUxpc3RlbmVycy9lbnRpdHlMaXN0ZW5lcnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vRW50aXR5TGlzdGVuZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0VudGl0eUxpc3RlbmVyL2NsYXNzTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9FbnRpdHlMaXN0ZW5lci9wcmVQZXJzaXN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0VudGl0eUxpc3RlbmVyL3Bvc3RQZXJzaXN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0VudGl0eUxpc3RlbmVyL3ByZVJlbW92ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9FbnRpdHlMaXN0ZW5lci9wb3N0UmVtb3ZlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0VudGl0eUxpc3RlbmVyL3ByZVVwZGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9FbnRpdHlMaXN0ZW5lci9wb3N0VXBkYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0VudGl0eUxpc3RlbmVyL3Bvc3RMb2FkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0VudGl0eVJlc3VsdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vRW50aXR5UmVzdWx0L2Rpc2NyaW1pbmF0b3JDb2x1bW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9FbnRpdHlSZXN1bHQvZW50aXR5Q2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vRW50aXR5UmVzdWx0L2ZpZWxkUmVzdWx0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9FdmVudE1ldGhvZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vRXZlbnRNZXRob2QvbWV0aG9kTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9GaWVsZFJlc3VsdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vRmllbGRSZXN1bHQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0ZpZWxkUmVzdWx0L2NvbHVtbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEdlbmVyYXRlZFZhbHVlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxHZW5lcmF0ZWRWYWx1ZS9nZW5lcmF0b3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxHZW5lcmF0ZWRWYWx1ZS9zdHJhdGVneSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxHZW5lcmF0ZWRWYWx1ZUltcGwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxJZENsYXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxJZENsYXNzL2NsYXNzTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9Jbmhlcml0YW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vSW5oZXJpdGFuY2Uvc3RyYXRlZ3kiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxKb2luQ29sdW1uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxKb2luQ29sdW1uL3JlZmVyZW5jZWRDb2x1bW5OYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEpvaW5Db2x1bW5JbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxKb2luVGFibGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxKb2luVGFibGUvam9pbkNvbHVtbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sSm9pblRhYmxlL2ludmVyc2VKb2luQ29sdW1ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxKb2luVGFibGVJbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vTG9iIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vTWFwS2V5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9NYXBLZXkvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9NYXBLZXlJbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxRdWVyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sUXVlcnkvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFF1ZXJ5L3F1ZXJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbFF1ZXJ5L2hpbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE5hbWVkTmF0aXZlUXVlcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbE5hbWVkTmF0aXZlUXVlcnkvcmVzdWx0Q2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxOYW1lZE5hdGl2ZVF1ZXJ5L3Jlc3VsdFNldE1hcHBpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTmFtZWRRdWVyeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1Bvc3RMb2FkIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vUG9zdFBlcnNpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9Qb3N0UmVtb3ZlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vUG9zdFVwZGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1ByZVBlcnNpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9QcmVSZW1vdmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9QcmVVcGRhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4vcmVmZXJlbmNlZENvbHVtbk5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sUXVlcnlIaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxRdWVyeUhpbnQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFF1ZXJ5SGludC92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0Fic3RyYWN0WG1sQmFzZVRhYmxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxCYXNlVGFibGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEJhc2VUYWJsZS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQmFzZVRhYmxlL2NhdGFsb2ciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxCYXNlVGFibGUvc2NoZW1hIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEJhc2VUYWJsZS91bmlxdWVDb25zdHJhaW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxUYWJsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFNlY29uZGFyeVRhYmxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sU2Vjb25kYXJ5VGFibGUvcHJpbWFyeUtleUpvaW5Db2x1bW5zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFNlY29uZGFyeVRhYmxlSW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sR2VuZXJhdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxHZW5lcmF0b3IvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEdlbmVyYXRvci9pbml0aWFsVmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxHZW5lcmF0b3IvYWxsb2NhdGlvblNpemUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxTZXF1ZW5jZUdlbmVyYXRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sU2VxdWVuY2VHZW5lcmF0b3Ivc2VxdWVuY2VOYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1NxbFJlc3VsdFNldE1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1NxbFJlc3VsdFNldE1hcHBpbmcvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9TcWxSZXN1bHRTZXRNYXBwaW5nL2VudGl0eVJlc3VsdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vU3FsUmVzdWx0U2V0TWFwcGluZy9jb2x1bW5SZXN1bHRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sVGFibGVHZW5lcmF0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yL3RhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sVGFibGVHZW5lcmF0b3IvY2F0YWxvZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yL3NjaGVtYSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yL3BrQ29sdW1uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yL3ZhbHVlQ29sdW1uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yL3BrQ29sdW1uVmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sVGFibGVHZW5lcmF0b3IvdW5pcXVlQ29uc3RyYWludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sVGFibGVHZW5lcmF0b3JJbXBsIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sVW5pcXVlQ29uc3RyYWludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sVW5pcXVlQ29uc3RyYWludC9jb2x1bW5OYW1lcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxVbmlxdWVDb25zdHJhaW50SW1wbCIvPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJQZXJzaXN0ZW5jZSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgYWRhcHRlckZhY3Rvcnk9ImZhbHNlIiBlY29yZVBhY2thZ2U9InBlcnNpc3RlbmNlLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlL0pUQSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS9SRVNPVVJDRV9MT0NBTCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZU9iamVjdCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0icGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxWZXJzaW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VVbml0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2UvdmVyc2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXQvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdC9wcm92aWRlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L2p0YURhdGFTb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdC9ub25KdGFEYXRhU291cmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L21hcHBpbmdGaWxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L2phckZpbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L2NsYXNzZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdC9leGNsdWRlVW5saXN0ZWRDbGFzc2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L3Byb3BlcnRpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXQvdHJhbnNhY3Rpb25UeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sTWFwcGluZ0ZpbGVSZWYiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sTWFwcGluZ0ZpbGVSZWYvZmlsZU5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxKYXZhQ2xhc3NSZWYiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sSmF2YUNsYXNzUmVmL2phdmFDbGFzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFByb3BlcnRpZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFByb3BlcnRpZXMvcHJvcGVydGllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFByb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFByb3BlcnR5L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFByb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZQppbmRleCBmMmZiNWZiLi4yMGI5ZGUxIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlCkBAIC0zLDEzNSArMyw3NCBAQAogICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKICAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ib3JtIgogICAgIG5zVVJJPSJqcHQub3JtLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybSI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5TWFwcGluZ3MiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVmVyc2lvblR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjEuMCIgdW5zZXR0YWJsZT0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2hlbWEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGFsb2ciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjY2VzcyIgZVR5cGU9IiMvL0FjY2Vzc1R5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IlBST1BFUlRZIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcXVlbmNlR2VuZXJhdG9ycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxTZXF1ZW5jZUdlbmVyYXRvciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YWJsZUdlbmVyYXRvcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sVGFibGVHZW5lcmF0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZWRRdWVyaWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbE5hbWVkUXVlcnkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZWROYXRpdmVRdWVyaWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbE5hbWVkTmF0aXZlUXVlcnkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3FsUmVzdWx0U2V0TWFwcGluZ3MiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vU3FsUmVzdWx0U2V0TWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXBwZWRTdXBlcmNsYXNzZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sTWFwcGVkU3VwZXJjbGFzcyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnRpdGllcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxFbnRpdHkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW1iZWRkYWJsZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sRW1iZWRkYWJsZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0WG1sQ29sdW1uIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sTmFtZWRDb2x1bW4iPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnNlcnRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVsbGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5pcXVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXBkYXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIgotICAgICAgICBlVHlwZT0iIy8vWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2hlbWEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGFsb2ciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjY2VzcyIgZVR5cGU9IiMvL0FjY2Vzc1R5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IlBST1BFUlRZIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVQZXJzaXN0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW50aXR5TGlzdGVuZXJzIiBlVHlwZT0iIy8vRW50aXR5TGlzdGVuZXJzIgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0WG1sRW1iZWRkZWQiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIgorICAgICAgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgIy8vWG1sTWFwcGVkQnlNYXBwaW5nICMvL1htbEpvaW5UYWJsZU1hcHBpbmciPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlckJ5IiBlVHlwZT0iIy8vT3JkZXJCeSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXBLZXkiIGVUeXBlPSIjLy9NYXBLZXkiCiAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWJzdHJhY3RYbWxUeXBlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbGFzc05hbWUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjY2VzcyIgZVR5cGU9IiMvL0FjY2Vzc1R5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IlBST1BFUlRZIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1ldGFkYXRhQ29tcGxldGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXR0cmlidXRlcyIgZVR5cGU9IiMvL0F0dHJpYnV0ZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwcGVkU3VwZXJjbGFzcyIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sVHlwZU1hcHBpbmciPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpZENsYXNzIiBlVHlwZT0iIy8vWG1sSWRDbGFzcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdWRlRGVmYXVsdExpc3RlbmVycyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW50aXR5TGlzdGVuZXJzIiBlVHlwZT0iIy8vRW50aXR5TGlzdGVuZXJzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZVBlcnNpc3QiIGVUeXBlPSIjLy9QcmVQZXJzaXN0IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc3RQZXJzaXN0IiBlVHlwZT0iIy8vUG9zdFBlcnNpc3QiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlUmVtb3ZlIiBlVHlwZT0iIy8vUHJlUmVtb3ZlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc3RSZW1vdmUiIGVUeXBlPSIjLy9Qb3N0UmVtb3ZlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZVVwZGF0ZSIgZVR5cGU9IiMvL1ByZVVwZGF0ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0VXBkYXRlIiBlVHlwZT0iIy8vUG9zdFVwZGF0ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0TG9hZCIgZVR5cGU9IiMvL1Bvc3RMb2FkIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sVHlwZU1hcHBpbmciPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0WG1sTmFtZWRDb2x1bW4iIGFic3RyYWN0PSJ0cnVlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29sdW1uRGVmaW5pdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFibGUiIGVUeXBlPSIjLy9YbWxUYWJsZSIKKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmciPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXJnZXRFbnRpdHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZldGNoIiBlVHlwZT0iIy8vRmV0Y2hUeXBlIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJMQVpZIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhc2NhZGUiIGVUeXBlPSIjLy9DYXNjYWRlVHlwZSIKICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWNvbmRhcnlUYWJsZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sU2Vjb25kYXJ5VGFibGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJpbWFyeUtleUpvaW5Db2x1bW5zIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1htbFByaW1hcnlLZXlKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImlkQ2xhc3MiIGVUeXBlPSIjLy9YbWxJZENsYXNzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaGVyaXRhbmNlIiBlVHlwZT0iIy8vSW5oZXJpdGFuY2UiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlzY3JpbWluYXRvclZhbHVlIiBlVHlwZT0iIy8vRGlzY3JpbWluYXRvclZhbHVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc2NyaW1pbmF0b3JDb2x1bW4iIGVUeXBlPSIjLy9YbWxEaXNjcmltaW5hdG9yQ29sdW1uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcXVlbmNlR2VuZXJhdG9yIiBlVHlwZT0iIy8vWG1sU2VxdWVuY2VHZW5lcmF0b3IiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFibGVHZW5lcmF0b3IiIGVUeXBlPSIjLy9YbWxUYWJsZUdlbmVyYXRvciIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lZFF1ZXJpZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sTmFtZWRRdWVyeSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lZE5hdGl2ZVF1ZXJpZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sTmFtZWROYXRpdmVRdWVyeSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzcWxSZXN1bHRTZXRNYXBwaW5ncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9TcWxSZXN1bHRTZXRNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnRpdHlMaXN0ZW5lcnMiIGVUeXBlPSIjLy9FbnRpdHlMaXN0ZW5lcnMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlUGVyc2lzdCIgZVR5cGU9IiMvL1ByZVBlcnNpc3QiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdFBlcnNpc3QiIGVUeXBlPSIjLy9Qb3N0UGVyc2lzdCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVSZW1vdmUiIGVUeXBlPSIjLy9QcmVSZW1vdmUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdFJlbW92ZSIgZVR5cGU9IiMvL1Bvc3RSZW1vdmUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlVXBkYXRlIiBlVHlwZT0iIy8vUHJlVXBkYXRlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc3RVcGRhdGUiIGVUeXBlPSIjLy9Qb3N0VXBkYXRlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc3RMb2FkIiBlVHlwZT0iIy8vUG9zdExvYWQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXR0cmlidXRlT3ZlcnJpZGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyIKKyAgICAgIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nICMvL1htbEpvaW5UYWJsZU1hcHBpbmcgIy8vWG1sSm9pbkNvbHVtbnNNYXBwaW5nICMvL3YyXzAvWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcHRpb25hbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0WG1sVGFibGUiIGFic3RyYWN0PSJ0cnVlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0YWxvZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZW1hIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ1bmlxdWVDb25zdHJhaW50cyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9YbWxVbmlxdWVDb25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0WG1sVHlwZU1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgorICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbFR5cGVNYXBwaW5nIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQWNjZXNzSG9sZGVyIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWNjZXNzIiBlVHlwZT0iIy8vQWNjZXNzVHlwZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBdHRyaWJ1dGVNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL3YyXzAvWG1sQXR0cmlidXRlTWFwcGluZ18yXzAiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIiBlU3VwZXJUeXBlcz0iIy8vWG1sSm9pbkNvbHVtbnNNYXBwaW5nICMvL3YyXzAvWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgIGludGVyZmFjZT0idHJ1ZSI+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc29jaWF0aW9uT3ZlcnJpZGVzIiB1cHBlckJvdW5kPSItMSIKICAgICAgICAgZVR5cGU9IiMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW1iZWRkYWJsZSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sVHlwZU1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdHRyaWJ1dGVzIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBdHRyaWJ1dGVPdmVycmlkZSIgZVN1cGVyVHlwZXM9IiMvL3YyXzAvWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29sdW1uIiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iIy8vWG1sQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgIGludGVyZmFjZT0idHJ1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF0dHJpYnV0ZU92ZXJyaWRlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdHRyaWJ1dGVzIiBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxBdHRyaWJ1dGVzXzJfMCI+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImlkcyIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9YbWxJZCIKICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbWJlZGRlZElkcyIgdXBwZXJCb3VuZD0iLTEiCkBAIC0xNTMsMTYwICs5MiwxMTEgQEAKICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHJhbnNpZW50cyIgdXBwZXJCb3VuZD0iLTEiCiAgICAgICAgIGVUeXBlPSIjLy9YbWxUcmFuc2llbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQXR0cmlidXRlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEF0dHJpYnV0ZU1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxOdWxsQXR0cmlidXRlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29sdW1uTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbHVtbiIgZVR5cGU9IiMvL1htbENvbHVtbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbEF0dHJpYnV0ZU1hcHBpbmciPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXJnZXRFbnRpdHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZldGNoIiBlVHlwZT0iIy8vRmV0Y2hUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJMQVpZIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImpvaW5UYWJsZSIgZVR5cGU9IiMvL1htbEpvaW5UYWJsZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYXNjYWRlIiBlVHlwZT0iIy8vQ2FzY2FkZVR5cGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbFJlbGF0aW9uc2hpcE1hcHBpbmciPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXBwZWRCeSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3JkZXJCeSIgZVR5cGU9IiMvL09yZGVyQnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFwS2V5IiBlVHlwZT0iIy8vTWFwS2V5IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sUmVsYXRpb25zaGlwTWFwcGluZyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9wdGlvbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iam9pbkNvbHVtbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sSm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxJZCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nICMvL0NvbHVtbk1hcHBpbmciPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJnZW5lcmF0ZWRWYWx1ZSIgZVR5cGU9IiMvL1htbEdlbmVyYXRlZFZhbHVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRlbXBvcmFsIiBlVHlwZT0iIy8vVGVtcG9yYWxUeXBlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhYmxlR2VuZXJhdG9yIiBlVHlwZT0iIy8vWG1sVGFibGVHZW5lcmF0b3IiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VxdWVuY2VHZW5lcmF0b3IiIGVUeXBlPSIjLy9YbWxTZXF1ZW5jZUdlbmVyYXRvciIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxJZEltcGwiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sSWQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCYXNlWG1sRW1iZWRkZWQiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF0dHJpYnV0ZU92ZXJyaWRlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbWJlZGRlZElkIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vQmFzZVhtbEVtYmVkZGVkIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW1iZWRkZWRJZEltcGwiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sRW1iZWRkZWRJZCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGVkIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0Jhc2VYbWxFbWJlZGRlZCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGVkSW1wbCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxFbWJlZGRlZCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2ljIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vQ29sdW1uTWFwcGluZyI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWMiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgIy8vQ29sdW1uTWFwcGluZyAjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmciPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmZXRjaCIgZVR5cGU9IiMvL0ZldGNoVHlwZSIKICAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iTEFaWSIvPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcHRpb25hbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvYiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRlbXBvcmFsIiBlVHlwZT0iIy8vVGVtcG9yYWxUeXBlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVudW1lcmF0ZWQiIGVUeXBlPSIjLy9FbnVtVHlwZSIvPgogICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxCYXNpY0ltcGwiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sQmFzaWMiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxWZXJzaW9uIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vQ29sdW1uTWFwcGluZyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRlbXBvcmFsIiBlVHlwZT0iIy8vVGVtcG9yYWxUeXBlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFZlcnNpb25JbXBsIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbFZlcnNpb24iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYW55VG9PbmUiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hbnlUb09uZUltcGwiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sTWFueVRvT25lIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9NYW55IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImpvaW5Db2x1bW5zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbEpvaW5Db2x1bW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9NYW55SW1wbCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxPbmVUb01hbnkiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPbmVUb09uZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFwcGVkQnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByaW1hcnlLZXlKb2luQ29sdW1ucyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPbmVUb09uZUltcGwiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sT25lVG9PbmUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYW55VG9NYW55IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hbnlUb01hbnlJbXBsIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbE1hbnlUb01hbnkiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUcmFuc2llbnQiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFRyYW5zaWVudEltcGwiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sVHJhbnNpZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQXNzb2NpYXRpb25PdmVycmlkZSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqb2luQ29sdW1ucyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9YbWxKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsIiBlU3VwZXJUeXBlcz0iIy8vWG1sQXNzb2NpYXRpb25PdmVycmlkZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEF0dHJpYnV0ZU92ZXJyaWRlIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbHVtbiIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbENvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwiIGVTdXBlclR5cGVzPSIjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhc2NhZGVUeXBlIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXNjYWRlVHlwZSI+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVBbGwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXNjYWRlUGVyc2lzdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVNZXJnZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVSZW1vdmUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXNjYWRlUmVmcmVzaCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+CiAgIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhc2NhZGVUeXBlSW1wbCIgZVN1cGVyVHlwZXM9IiMvL0Nhc2NhZGVUeXBlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTmFtZWRDb2x1bW4iIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb2x1bW5EZWZpbml0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBYnN0cmFjdFhtbE5hbWVkQ29sdW1uIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9YbWxOYW1lZENvbHVtbiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEFic3RyYWN0Q29sdW1uIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbE5hbWVkQ29sdW1uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5zZXJ0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bGxhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXF1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVwZGF0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4iIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sTmFtZWRDb2x1bW4gIy8vWG1sQWJzdHJhY3RDb2x1bW4iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb2x1bW4iIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sQWJzdHJhY3RDb2x1bW4iPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbGxlY3Rpb25UYWJsZSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sVGFibGUgIy8vdjJfMC9YbWxDb2xsZWN0aW9uVGFibGVfMl8wIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ29sdW1uIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxDb2x1bW4iPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWNpc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NhbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+CiAgIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbHVtbkltcGwiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uICMvL1htbENvbHVtbiIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbHVtbk1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb2x1bW4iIGVUeXBlPSIjLy9YbWxDb2x1bW4iCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CiAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29sdW1uUmVzdWx0Ij4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KICAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ29udmVydGlibGVNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgIGludGVyZmFjZT0idHJ1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvYiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRlbXBvcmFsIiBlVHlwZT0iIy8vVGVtcG9yYWxUeXBlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVudW1lcmF0ZWQiIGVUeXBlPSIjLy9FbnVtVHlwZSIvPgorICA8L2VDbGFzc2lmaWVycz4KICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxEaXNjcmltaW5hdG9yQ29sdW1uIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxOYW1lZENvbHVtbiI+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2NyaW1pbmF0b3JUeXBlIiBlVHlwZT0iIy8vRGlzY3JpbWluYXRvclR5cGUiCiAgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IlNUUklORyIvPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+CiAgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVsZW1lbnRDb2xsZWN0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW1iZWRkYWJsZSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sVHlwZU1hcHBpbmciLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbWJlZGRlZCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sRW1iZWRkZWQgIy8vdjJfMC9YbWxFbWJlZGRlZF8yXzAiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbWJlZGRlZElkIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxFbWJlZGRlZCIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sVHlwZU1hcHBpbmcgIy8vWG1sUXVlcnlDb250YWluZXIgIy8vWG1sR2VuZXJhdG9yQ29udGFpbmVyICMvL1htbEV2ZW50TWV0aG9kQ29udGFpbmVyICMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyICMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgIy8vdjJfMC9YbWxFbnRpdHlfMl8wIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFibGUiIGVUeXBlPSIjLy9YbWxUYWJsZSIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWNvbmRhcnlUYWJsZXMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vWG1sU2Vjb25kYXJ5VGFibGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJpbWFyeUtleUpvaW5Db2x1bW5zIgorICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1htbFByaW1hcnlLZXlKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImlkQ2xhc3MiIGVUeXBlPSIjLy9YbWxJZENsYXNzIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluaGVyaXRhbmNlIiBlVHlwZT0iIy8vSW5oZXJpdGFuY2UiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGlzY3JpbWluYXRvclZhbHVlIiBlVHlwZT0iIy8vRGlzY3JpbWluYXRvclZhbHVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc2NyaW1pbmF0b3JDb2x1bW4iIGVUeXBlPSIjLy9YbWxEaXNjcmltaW5hdG9yQ29sdW1uIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNxbFJlc3VsdFNldE1hcHBpbmdzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1NxbFJlc3VsdFNldE1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGl0eUxpc3RlbmVycyIgZVR5cGU9IiMvL0VudGl0eUxpc3RlbmVycyIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbnRpdHlMaXN0ZW5lciIgZVN1cGVyVHlwZXM9IiMvL1htbEV2ZW50TWV0aG9kQ29udGFpbmVyICMvL3YyXzAvWG1sRW50aXR5TGlzdGVuZXJfMl8wIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xhc3NOYW1lIiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbnRpdHlMaXN0ZW5lcnMiPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnRpdHlMaXN0ZW5lcnMiIHVwcGVyQm91bmQ9Ii0xIgogICAgICAgICBlVHlwZT0iIy8vRW50aXR5TGlzdGVuZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRW50aXR5TGlzdGVuZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbGFzc05hbWUiIGxvd2VyQm91bmQ9IjEiCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5TWFwcGluZ3MiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9BYnN0cmFjdEpwYVJvb3RFT2JqZWN0ICMvL1htbFF1ZXJ5Q29udGFpbmVyICMvL1htbEFjY2Vzc0hvbGRlciI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSIKKyAgICAgICAgZVR5cGU9IiMvL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhY2thZ2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjaGVtYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0YWxvZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VxdWVuY2VHZW5lcmF0b3JzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1htbFNlcXVlbmNlR2VuZXJhdG9yIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhYmxlR2VuZXJhdG9ycyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9YbWxUYWJsZUdlbmVyYXRvciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzcWxSZXN1bHRTZXRNYXBwaW5ncyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9TcWxSZXN1bHRTZXRNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hcHBlZFN1cGVyY2xhc3NlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9YbWxNYXBwZWRTdXBlcmNsYXNzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGl0aWVzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1htbEVudGl0eSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbWJlZGRhYmxlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9YbWxFbWJlZGRhYmxlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVudGl0eVJlc3VsdCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2NyaW1pbmF0b3JDb2x1bW4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVudGl0eUNsYXNzIiBsb3dlckJvdW5kPSIxIgogICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWVsZFJlc3VsdHMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vRmllbGRSZXN1bHQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXZlbnRNZXRob2QiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxFdmVudE1ldGhvZF8yXzAiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXRob2ROYW1lIiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFdmVudE1ldGhvZENvbnRhaW5lciIgYWJzdHJhY3Q9InRydWUiCisgICAgICBpbnRlcmZhY2U9InRydWUiPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVQZXJzaXN0IiBlVHlwZT0iIy8vUHJlUGVyc2lzdCIKICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0UGVyc2lzdCIgZVR5cGU9IiMvL1Bvc3RQZXJzaXN0IgpAQCAtMzIyLDI4ICsyMTIsMzMgQEAKICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdExvYWQiIGVUeXBlPSIjLy9Qb3N0TG9hZCIKICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgogICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbnRpdHlSZXN1bHQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXNjcmltaW5hdG9yQ29sdW1uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbnRpdHlDbGFzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmllbGRSZXN1bHRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0ZpZWxkUmVzdWx0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV2ZW50TWV0aG9kIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0aG9kTmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+CiAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRmllbGRSZXN1bHQiPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb2x1bW4iIGxvd2VyQm91bmQ9IjEiCiAgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CiAgIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEdlbmVyYXRlZFZhbHVlIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxHZW5lcmF0ZWRWYWx1ZSI+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRvciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RyYXRlZ3kiIGVUeXBlPSIjLy9HZW5lcmF0aW9uVHlwZSIKICAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iVEFCTEUiLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sR2VuZXJhdGVkVmFsdWVJbXBsIiBlU3VwZXJUeXBlcz0iIy8vWG1sR2VuZXJhdGVkVmFsdWUiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxHZW5lcmF0b3IiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxHZW5lcmF0b3JfMl8wIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5pdGlhbFZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludE9iamVjdCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGxvY2F0aW9uU2l6ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sR2VuZXJhdG9yQ29udGFpbmVyIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgIGludGVyZmFjZT0idHJ1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcXVlbmNlR2VuZXJhdG9yIiBlVHlwZT0iIy8vWG1sU2VxdWVuY2VHZW5lcmF0b3IiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFibGVHZW5lcmF0b3IiIGVUeXBlPSIjLy9YbWxUYWJsZUdlbmVyYXRvciIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxJZCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyAjLy9Db2x1bW5NYXBwaW5nICMvL1htbENvbnZlcnRpYmxlTWFwcGluZyAjLy9YbWxHZW5lcmF0b3JDb250YWluZXIiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJnZW5lcmF0ZWRWYWx1ZSIgZVR5cGU9IiMvL1htbEdlbmVyYXRlZFZhbHVlIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgogICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbElkQ2xhc3MiPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbGFzc05hbWUiIGxvd2VyQm91bmQ9IjEiCiAgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CkBAIC0zNTIsMzUgKzI0Nyw3MiBAQAogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdHJhdGVneSIgZVR5cGU9IiMvL0luaGVyaXRhbmNlVHlwZSIKICAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iU0lOR0xFX1RBQkxFIi8+CiAgIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEpvaW5Db2x1bW4iIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sQWJzdHJhY3RDb2x1bW4iPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEpvaW5Db2x1bW4iIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbENvbHVtbiI+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmVyZW5jZWRDb2x1bW5OYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgogICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxKb2luQ29sdW1uSW1wbCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4gIy8vWG1sSm9pbkNvbHVtbiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEpvaW5UYWJsZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9YbWxCYXNlVGFibGUiPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEpvaW5Db2x1bW5zTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCisgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqb2luQ29sdW1ucyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9YbWxKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEpvaW5UYWJsZSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sVGFibGUiPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqb2luQ29sdW1ucyIgdXBwZXJCb3VuZD0iLTEiCiAgICAgICAgIGVUeXBlPSIjLy9YbWxKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludmVyc2VKb2luQ29sdW1ucyIgdXBwZXJCb3VuZD0iLTEiCiAgICAgICAgIGVUeXBlPSIjLy9YbWxKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CiAgIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEpvaW5UYWJsZUltcGwiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEJhc2VUYWJsZSAjLy9YbWxKb2luVGFibGUiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxKb2luVGFibGVNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgIGludGVyZmFjZT0idHJ1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImpvaW5UYWJsZSIgZVR5cGU9IiMvL1htbEpvaW5UYWJsZSIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMb2IiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNYXBLZXkiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hbnlUb01hbnkiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyAjLy92Ml8wL1htbE1hbnlUb01hbnlfMl8wIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvT25lIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWFwS2V5Ij4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWFwS2V5SW1wbCIgZVN1cGVyVHlwZXM9IiMvL01hcEtleSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icXVlcnkiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImhpbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFF1ZXJ5SGludCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hcEtleUNsYXNzIiBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxNYXBLZXlDbGFzc18yXzAiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYXBwZWRCeU1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgorICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFwcGVkQnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hcHBlZFN1cGVyY2xhc3MiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbFR5cGVNYXBwaW5nIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaWRDbGFzcyIgZVR5cGU9IiMvL1htbElkQ2xhc3MiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGl0eUxpc3RlbmVycyIgZVR5cGU9IiMvL0VudGl0eUxpc3RlbmVycyIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgogICA8L2VDbGFzc2lmaWVycz4KICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxOYW1lZE5hdGl2ZVF1ZXJ5IiBlU3VwZXJUeXBlcz0iIy8vWG1sUXVlcnkiPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN1bHRDbGFzcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdWx0U2V0TWFwcGluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTmFtZWRRdWVyeSIgZVN1cGVyVHlwZXM9IiMvL1htbFF1ZXJ5Ii8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTmFtZWRRdWVyeSIgZVN1cGVyVHlwZXM9IiMvL1htbFF1ZXJ5ICMvL3YyXzAvWG1sTmFtZWRRdWVyeV8yXzAiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxOdWxsQXR0cmlidXRlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9NYW55IiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgIy8vWG1sSm9pbkNvbHVtbnNNYXBwaW5nICMvL3YyXzAvWG1sT25lVG9NYW55XzJfMCIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9uZVRvT25lIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nICMvL1htbE1hcHBlZEJ5TWFwcGluZyAjLy92Ml8wL1htbE9uZVRvT25lXzJfMCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByaW1hcnlLZXlKb2luQ29sdW1ucyIKKyAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPcmRlckNvbHVtbiIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sTmFtZWRDb2x1bW4gIy8vdjJfMC9YbWxPcmRlckNvbHVtbl8yXzAiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyIgZVN1cGVyVHlwZXM9IiMvL1htbEFjY2Vzc0hvbGRlciAjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjaGVtYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0YWxvZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZVBlcnNpc3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnRpdHlMaXN0ZW5lcnMiIGVUeXBlPSIjLy9FbnRpdHlMaXN0ZW5lcnMiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyc2lzdGVuY2VVbml0RGVmYXVsdHMiCisgICAgICAgIGVUeXBlPSIjLy9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3N0TG9hZCIgZVN1cGVyVHlwZXM9IiMvL0V2ZW50TWV0aG9kIi8+CiAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9zdFBlcnNpc3QiIGVTdXBlclR5cGVzPSIjLy9FdmVudE1ldGhvZCIvPgogICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvc3RSZW1vdmUiIGVTdXBlclR5cGVzPSIjLy9FdmVudE1ldGhvZCIvPgpAQCAtMzg4LDUwICszMjAsNDIgQEAKICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmVQZXJzaXN0IiBlU3VwZXJUeXBlcz0iIy8vRXZlbnRNZXRob2QiLz4KICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmVSZW1vdmUiIGVTdXBlclR5cGVzPSIjLy9FdmVudE1ldGhvZCIvPgogICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByZVVwZGF0ZSIgZVN1cGVyVHlwZXM9IiMvL0V2ZW50TWV0aG9kIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4iIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sTmFtZWRDb2x1bW4iPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByaW1hcnlLZXlKb2luQ29sdW1uIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxOYW1lZENvbHVtbiI+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmVyZW5jZWRDb2x1bW5OYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgogICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbE5hbWVkQ29sdW1uICMvL1htbFByaW1hcnlLZXlKb2luQ29sdW1uIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUXVlcnlIaW50Ij4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxRdWVyeSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbFF1ZXJ5XzJfMCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InF1ZXJ5IiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJoaW50cyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9YbWxRdWVyeUhpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUXVlcnlDb250YWluZXIiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lZFF1ZXJpZXMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vWG1sTmFtZWRRdWVyeSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lZE5hdGl2ZVF1ZXJpZXMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vWG1sTmFtZWROYXRpdmVRdWVyeSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxRdWVyeUhpbnQiIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbFF1ZXJ5SGludF8yXzAiPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWJzdHJhY3RYbWxCYXNlVGFibGUiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEJhc2VUYWJsZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2VUYWJsZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGFsb2ciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjaGVtYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idW5pcXVlQ29uc3RyYWludHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sVW5pcXVlQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUYWJsZSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQmFzZVRhYmxlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU2Vjb25kYXJ5VGFibGUiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sQmFzZVRhYmxlIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxTZWNvbmRhcnlUYWJsZSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sVGFibGUiPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmltYXJ5S2V5Sm9pbkNvbHVtbnMiCiAgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU2Vjb25kYXJ5VGFibGVJbXBsIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxCYXNlVGFibGUgIy8vWG1sU2Vjb25kYXJ5VGFibGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxHZW5lcmF0b3IiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbml0aWFsVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsbG9jYXRpb25TaXplIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludE9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxTZXF1ZW5jZUdlbmVyYXRvciIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9YbWxHZW5lcmF0b3IiPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFNlcXVlbmNlR2VuZXJhdG9yIiBlU3VwZXJUeXBlcz0iIy8vWG1sR2VuZXJhdG9yICMvL3YyXzAvWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wIj4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VxdWVuY2VOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgogICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwiIGVTdXBlclR5cGVzPSIjLy9YbWxTZXF1ZW5jZUdlbmVyYXRvciIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNxbFJlc3VsdFNldE1hcHBpbmciPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNxbFJlc3VsdFNldE1hcHBpbmciIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wIj4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW50aXR5UmVzdWx0cyIgdXBwZXJCb3VuZD0iLTEiCiAgICAgICAgIGVUeXBlPSIjLy9FbnRpdHlSZXN1bHQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29sdW1uUmVzdWx0cyIgdXBwZXJCb3VuZD0iLTEiCiAgICAgICAgIGVUeXBlPSIjLy9Db2x1bW5SZXN1bHQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVGFibGVHZW5lcmF0b3IiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sR2VuZXJhdG9yIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUYWJsZSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sVGFibGUiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUYWJsZUdlbmVyYXRvciIgZVN1cGVyVHlwZXM9IiMvL1htbEdlbmVyYXRvciI+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRhbG9nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2hlbWEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CkBAIC00NDEsMTcgKzM2NSwyNCBAQAogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ1bmlxdWVDb25zdHJhaW50cyIgdXBwZXJCb3VuZD0iLTEiCiAgICAgICAgIGVUeXBlPSIjLy9YbWxVbmlxdWVDb25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CiAgIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFRhYmxlR2VuZXJhdG9ySW1wbCIgZVN1cGVyVHlwZXM9IiMvL1htbFRhYmxlR2VuZXJhdG9yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVW5pcXVlQ29uc3RyYWludCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFRyYW5zaWVudCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFR5cGVNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEFjY2Vzc0hvbGRlciI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsYXNzTmFtZSIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0YWRhdGFDb21wbGV0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdHRyaWJ1dGVzIiBlVHlwZT0iIy8vQXR0cmlidXRlcyIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxVbmlxdWVDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxVbmlxdWVDb25zdHJhaW50XzJfMCI+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbHVtbk5hbWVzIiB1bmlxdWU9ImZhbHNlIgogICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVW5pcXVlQ29uc3RyYWludEltcGwiIGVTdXBlclR5cGVzPSIjLy9YbWxVbmlxdWVDb25zdHJhaW50Ii8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVmVyc2lvbiIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyAjLy9Db2x1bW5NYXBwaW5nICMvL1htbENvbnZlcnRpYmxlTWFwcGluZyIvPgogICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRpc2NyaW1pbmF0b3JWYWx1ZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciLz4KICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFbnVtZXJhdGVkIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IiLz4KICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJPcmRlckJ5IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlZlcnNpb25UeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyIvPgogICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iQWNjZXNzVHlwZSI+CiAgICAgPGVMaXRlcmFscyBuYW1lPSJQUk9QRVJUWSIvPgogICAgIDxlTGl0ZXJhbHMgbmFtZT0iRklFTEQiIHZhbHVlPSIxIi8+CkBAIC00ODUsNCArNDE2LDE3NSBAQAogICAgIDxlTGl0ZXJhbHMgbmFtZT0iVElNRSIgdmFsdWU9IjEiLz4KICAgICA8ZUxpdGVyYWxzIG5hbWU9IlRJTUVTVEFNUCIgdmFsdWU9IjIiLz4KICAgPC9lQ2xhc3NpZmllcnM+CisgIDxlU3VicGFja2FnZXMgbmFtZT0idjJfMCIgbnNVUkk9ImpwdC5vcm0udjJfMC54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMCI+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMCIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbEFjY2Vzc0hvbGRlciIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImpvaW5UYWJsZSIgZVR5cGU9IiMvL1htbEpvaW5UYWJsZSIKKyAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQXR0cmlidXRlc18yXzAiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnRDb2xsZWN0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgICAgZVR5cGU9IiMvL1htbEVsZW1lbnRDb2xsZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb2xsZWN0aW9uVGFibGVfMl8wIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqb2luQ29sdW1ucyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgICAgZVR5cGU9IiMvL1htbEpvaW5Db2x1bW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbERlcml2ZWRJZF8yXzAiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbENvbnZlcnRpYmxlTWFwcGluZyI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0Q2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmV0Y2giIGVUeXBlPSIjLy9GZXRjaFR5cGUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlckJ5IiBlVHlwZT0iIy8vT3JkZXJCeSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9yZGVyQ29sdW1uIiBlVHlwZT0iIy8vWG1sT3JkZXJDb2x1bW4iCisgICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hcEtleSIgZVR5cGU9IiMvL01hcEtleSIKKyAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFwS2V5Q2xhc3MiIGVUeXBlPSIjLy9YbWxNYXBLZXlDbGFzcyIKKyAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFwS2V5VGVtcG9yYWwiIGVUeXBlPSIjLy9UZW1wb3JhbFR5cGUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXBLZXlFbnVtZXJhdGVkIiBlVHlwZT0iIy8vRW51bVR5cGUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMiCisgICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hcEtleUNvbHVtbiIgZVR5cGU9IiMvL1htbENvbHVtbiIKKyAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFwS2V5Sm9pbkNvbHVtbnMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICAgIGVUeXBlPSIjLy9YbWxKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29sdW1uIiBlVHlwZT0iIy8vWG1sQ29sdW1uIgorICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdHRyaWJ1dGVPdmVycmlkZXMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICAgIGVUeXBlPSIjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc29jaWF0aW9uT3ZlcnJpZGVzIgorICAgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vWG1sQXNzb2NpYXRpb25PdmVycmlkZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbGxlY3Rpb25UYWJsZSIgZVR5cGU9IiMvL1htbENvbGxlY3Rpb25UYWJsZSIKKyAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbWJlZGRlZF8yXzAiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbnRpdHlfMl8wIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxDYWNoZWFibGUyXzAiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eUxpc3RlbmVyXzJfMCIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgIGludGVyZmFjZT0idHJ1ZSI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFdmVudE1ldGhvZF8yXzAiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sR2VuZXJhdG9yXzJfMCIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgIGludGVyZmFjZT0idHJ1ZSI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYW55VG9NYW55XzJfMCIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgIGludGVyZmFjZT0idHJ1ZSI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3JkZXJDb2x1bW4iIGVUeXBlPSIjLy9YbWxPcmRlckNvbHVtbiIKKyAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFwS2V5Q2xhc3MiIGVUeXBlPSIjLy9YbWxNYXBLZXlDbGFzcyIKKyAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFwS2V5VGVtcG9yYWwiIGVUeXBlPSIjLy9UZW1wb3JhbFR5cGUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXBLZXlFbnVtZXJhdGVkIiBlVHlwZT0iIy8vRW51bVR5cGUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMiCisgICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hcEtleUNvbHVtbiIgZVR5cGU9IiMvL1htbENvbHVtbiIKKyAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFwS2V5Sm9pbkNvbHVtbnMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICAgIGVUeXBlPSIjLy9YbWxKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYXBLZXlDbGFzc18yXzAiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsYXNzTmFtZSIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwc0lkXzJfMCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFwc0lkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTmFtZWRRdWVyeV8yXzAiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2tNb2RlIiBlVHlwZT0iIy8vdjJfMC9Mb2NrTW9kZVR5cGVfMl8wIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPbmVUb01hbnlfMl8wIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxPcnBoYW5SZW1vdmFibGUyXzAiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9yZGVyQ29sdW1uIiBlVHlwZT0iIy8vWG1sT3JkZXJDb2x1bW4iCisgICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hcEtleUNsYXNzIiBlVHlwZT0iIy8vWG1sTWFwS2V5Q2xhc3MiCisgICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hcEtleVRlbXBvcmFsIiBlVHlwZT0iIy8vVGVtcG9yYWxUeXBlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFwS2V5RW51bWVyYXRlZCIgZVR5cGU9IiMvL0VudW1UeXBlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzIgorICAgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vWG1sQXR0cmlidXRlT3ZlcnJpZGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXBLZXlDb2x1bW4iIGVUeXBlPSIjLy9YbWxDb2x1bW4iCisgICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hcEtleUpvaW5Db2x1bW5zIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgICBlVHlwZT0iIy8vWG1sSm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9PbmVfMl8wIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCAjLy92Ml8wL1htbE9ycGhhblJlbW92YWJsZTJfMCIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT3JkZXJDb2x1bW5fMl8wIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudWxsYWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5zZXJ0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXBkYXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgIGludGVyZmFjZT0idHJ1ZSI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVsaW1pdGVkSWRlbnRpZmllcnMiCisgICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUXVlcnlfMl8wIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFF1ZXJ5SGludF8yXzAiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRhbG9nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjaGVtYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wIgorICAgICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxEZXJpdmVkSWRfMl8wICMvL3YyXzAvWG1sTWFwc0lkXzJfMCIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVW5pcXVlQ29uc3RyYWludF8yXzAiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkxvY2tNb2RlVHlwZV8yXzAiPgorICAgICAgPGVMaXRlcmFscyBuYW1lPSJSRUFEIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IldSSVRFIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9QVElNSVNUSUMiLz4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iUEVTU0lNSVNUSUNfUkVBRCIvPgorICAgICAgPGVMaXRlcmFscyBuYW1lPSJQRVNTSU1JU1RJQ19XUklURSIvPgorICAgICAgPGVMaXRlcmFscyBuYW1lPSJQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENhY2hlYWJsZTJfMCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FjaGVhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9ycGhhblJlbW92YWJsZTJfMCIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgIGludGVyZmFjZT0idHJ1ZSI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3JwaGFuUmVtb3ZhbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgIDwvZVN1YnBhY2thZ2VzPgogPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL3BlcnNpc3RlbmNlLmVjb3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvcGVyc2lzdGVuY2UuZWNvcmUKaW5kZXggOTJkNjJlYS4uMDM1OTljYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvcGVyc2lzdGVuY2UuZWNvcmUKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvcGVyc2lzdGVuY2UuZWNvcmUKQEAgLTMsMTMgKzMsMjYgQEAKICAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InBlcnNpc3RlbmNlIgogICAgIG5zVVJJPSJqcHQucGVyc2lzdGVuY2UueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBlcnNpc3RlbmNlIj4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxKYXZhQ2xhc3NSZWYiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqYXZhQ2xhc3MiIG9yZGVyZWQ9ImZhbHNlIgorICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEphckZpbGVSZWYiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWxlTmFtZSIgb3JkZXJlZD0iZmFsc2UiCisgICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwcGluZ0ZpbGVSZWYiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWxlTmFtZSIgb3JkZXJlZD0iZmFsc2UiCisgICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGVyc2lzdGVuY2UiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9BYnN0cmFjdEpwYVJvb3RFT2JqZWN0Ij4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyc2lzdGVuY2VVbml0cyIgdXBwZXJCb3VuZD0iLTEiCiAgICAgICAgIGVUeXBlPSIjLy9YbWxQZXJzaXN0ZW5jZVVuaXQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1htbFZlcnNpb24iLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0Ij4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQZXJzaXN0ZW5jZVVuaXQiIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdF8yXzAiPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvdmlkZXIiIHVuaXF1ZT0iZmFsc2UiCkBAIC0xOCwxMiArMzEsMTIgQEAKICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9uSnRhRGF0YVNvdXJjZSIgdW5pcXVlPSJmYWxzZSIKICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFwcGluZ0ZpbGVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1htbE1hcHBpbmdGaWxlUmVmIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImphckZpbGVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2xhc3NlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9YbWxKYXZhQ2xhc3NSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFwcGluZ0ZpbGVzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1htbE1hcHBpbmdGaWxlUmVmIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImphckZpbGVzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1htbEphckZpbGVSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2xhc3NlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9YbWxKYXZhQ2xhc3NSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZVVubGlzdGVkQ2xhc3NlcyIKICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnRpZXMiIGVUeXBlPSIjLy9YbWxQcm9wZXJ0aWVzIgpAQCAtMzMsMTUgKzQ2LDkgQEAKICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHJhbnNhY3Rpb25UeXBlIiB1bmlxdWU9ImZhbHNlIgogICAgICAgICBlVHlwZT0iIy8vWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJKVEEiLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwcGluZ0ZpbGVSZWYiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWxlTmFtZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSmF2YUNsYXNzUmVmIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF2YUNsYXNzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIj4KKyAgICA8ZUxpdGVyYWxzIG5hbWU9IkpUQSIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iUkVTT1VSQ0VfTE9DQUwiIHZhbHVlPSIxIi8+CiAgIDwvZUNsYXNzaWZpZXJzPgogICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByb3BlcnRpZXMiPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9wZXJ0aWVzIiB1cHBlckJvdW5kPSItMSIKQEAgLTUzLDExICs2MCwyNSBAQAogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSlRBIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSRVNPVVJDRV9MT0NBTCIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0IgotICAgICAgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iWG1sVmVyc2lvbiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgPGVTdWJwYWNrYWdlcyBuYW1lPSJ2Ml8wIiBuc1VSST0ianB0LnBlcnNpc3RlbmNlLnYyXzAueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMCI+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzaGFyZWRDYWNoZU1vZGUiIHVuaXF1ZT0iZmFsc2UiCisgICAgICAgICAgZVR5cGU9IiMvL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJVTlNQRUNJRklFRCIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbGlkYXRpb25Nb2RlIiB1bmlxdWU9ImZhbHNlIgorICAgICAgICAgIGVUeXBlPSIjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkFVVE8iLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIj4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iQUxMIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5PTkUiIHZhbHVlPSIxIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IkVOQUJMRV9TRUxFQ1RJVkUiIHZhbHVlPSIyIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IkRJU0FCTEVfU0VMRUNUSVZFIiB2YWx1ZT0iMyIvPgorICAgICAgPGVMaXRlcmFscyBuYW1lPSJVTlNQRUNJRklFRCIgdmFsdWU9IjQiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCI+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IkFVVE8iLz4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0FMTEJBQ0siIHZhbHVlPSIxIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5PTkUiIHZhbHVlPSIyIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgIDwvZVN1YnBhY2thZ2VzPgogPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKaW5kZXggYjdmYjNiNy4uODFjNzdkYyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTEsMTIgKzEsMTEgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisjIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAjIAogIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMgVG8gY29kZSBkZXZlbG9wZXI6CkBAIC0yMCwyMCArMTksMjkgQEAKICMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIENvcmUKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCitwbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29yZQorcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KIAotSlBBX1BMQVRGT1JNPSJKUEEgUGxhdGZvcm0iCitKUEFfUExBVEZPUk09SlBBIFBsYXRmb3JtCitKUEFfUkVTT1VSQ0VfTU9ERUxfUFJPVklERVJTPUpQQSBSZXNvdXJjZSBNb2RlbCBQcm92aWRlcnMKIEpQQV9QUk9CTEVNX01BUktFUj1KUEEgUHJvYmxlbSBNYXJrZXIKIEpQQV9GSUxFX0NPTlRFTlQ9SlBBIEZpbGUgQ29udGVudAogCi1HRU5FUklDX1BMQVRGT1JNX0xBQkVMPUdlbmVyaWMKK0JBU0VfSlBBX0NPTlRFTlQgPSBCYXNlIGNvbnRlbnQgZm9yIEpQQSBYTUwgZmlsZXMKK1BFUlNJU1RFTkNFX1hNTF9DT05URU5UID0gSlBBIHBlcnNpc3RlbmNlLnhtbCBmaWxlcworTUFQUElOR19GSUxFX0NPTlRFTlQgPSBCYXNlIGNvbnRlbnQgZm9yIEpQQSBYTUwgbWFwcGluZyBmaWxlcworT1JNX1hNTF9DT05URU5UID0gSlBBIG9ybS54bWwgbWFwcGluZyBmaWxlcworSkFSX0NPTlRFTlQgPSBKQVIgQ29udGVudAorCitHRU5FUklDXzFfMF9QTEFURk9STV9MQUJFTD1HZW5lcmljIDEuMAorR0VORVJJQ18yXzBfUExBVEZPUk1fTEFCRUw9R2VuZXJpYyAyLjAKKworTk9fT1BfTElCUkFSWV9QUk9WSURFUl9XQVJOSU5HID0gTGlicmFyeSBjb25maWd1cmF0aW9uIGlzIGRpc2FibGVkLiBUaGUgdXNlciBtYXkgbmVlZCB0byBjb25maWd1cmUgZnVydGhlciBjbGFzc3BhdGggY2hhbmdlcyBsYXRlci4KK05PX09QX0xJQlJBUllfUFJPVklERVJfTUVTU0FHRSA9IFRoZSBKUEEgZmFjZXQgcmVxdWlyZXMgYSBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSB0byBiZSBwcmVzZW50IG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aC4gQnkgZGlzYWJsaW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbiwgdGhlIHVzZXIgdGFrZXMgb24gdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGVuc3VyaW5nIHRoYXQgdGhlIGNsYXNzcGF0aCBpcyBjb25maWd1cmVkIGFwcHJvcHJpYXRlbHkgdmlhIGFsdGVybmF0ZSBtZWFucy4KIAogSlBBX0ZBQ0VUX0xBQkVMPUphdmEgUGVyc2lzdGVuY2UKIEpQQV9GQUNFVF9ERVNDUklQVElPTj1BZGRzIHN1cHBvcnQgZm9yIHdyaXRpbmcgcGVyc2lzdGVudCBtZXRhLWRhdGEgdXNpbmcgSmF2YSBQZXJzaXN0ZW5jZSBBcmNoaXRlY3R1cmUuCi1KUEFfUFJFU0VUX0xBQkVMPVV0aWxpdHkgSlBBIHByb2plY3Qgd2l0aCBKYXZhIDUuMAorSlBBXzEuMF9QUkVTRVRfTEFCRUw9TWluaW1hbCBKUEEgMS4wIENvbmZpZ3VyYXRpb24KK0pQQV8yLjBfUFJFU0VUX0xBQkVMPU1pbmltYWwgSlBBIDIuMCBDb25maWd1cmF0aW9uCiBKUEFfVEVNUExBVEVfTEFCRUw9SlBBIFByb2plY3QKIEpQQV9WQUxJREFUT1I9SlBBIFZhbGlkYXRvcgotCi1PUk1fWE1MX0NPTlRFTlQgPSBPUk0gWE1MIENvbnRlbnQKLVBFUlNJU1RFTkNFX1hNTF9DT05URU5UID0gUGVyc2lzdGVuY2UgWE1MIENvbnRlbnQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3BsdWdpbi54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9wbHVnaW4ueG1sCmluZGV4IGU0ZGI3Y2YuLmZjNzIxMzYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3BsdWdpbi54bWwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvcGx1Z2luLnhtbApAQCAtNiwxNCArNiw3MyBAQAogCTwhLS0gKioqKiogZXh0ZW5zaW9uIHBvaW50cyAqKioqKiAtLT4KIAogCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9ImpwYVBsYXRmb3JtIgorCQlpZD0ianBhUGxhdGZvcm1zIgogCQluYW1lPSIlSlBBX1BMQVRGT1JNIgotCQlzY2hlbWE9InNjaGVtYS9qcGFQbGF0Zm9ybS5leHNkIgorCQlzY2hlbWE9InNjaGVtYS9qcGFQbGF0Zm9ybXMuZXhzZCIKIAkvPgogCQogCQogCTwhLS0gKioqKiogRWNsaXBzZSBjb3JlIGV4dGVuc2lvbnMgKioqKiogLS0+CiAJCisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZS5jb250ZW50VHlwZXMiPgorCQkKKwkJPCEtLSAiYWJzdHJhY3QiIGNvbnRlbnQgdHlwZSB0byBiZSBleHRlbmRlZCBieSBhbGwgSlBBIFhNTCBmaWxlIGNvbnRlbnQgdHlwZXMgLS0+CisJCTxjb250ZW50LXR5cGUKKwkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZW50LmJhc2VKcGFDb250ZW50IgorCQkJbmFtZT0iJUJBU0VfSlBBX0NPTlRFTlQiCisJCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCisJCQlkZXNjcmliZXI9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLkluZGV0ZXJtaW5hdGVDb250ZW50RGVzY3JpYmVyIj4KKwkJPC9jb250ZW50LXR5cGU+CisJCQorCQk8IS0tIHBlcnNpc3RlbmNlLnhtbCBjb250ZW50IHR5cGUgLS0+CisgIAkJPGNvbnRlbnQtdHlwZQorCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRlbnQucGVyc2lzdGVuY2UiCisJCQluYW1lPSIlUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlQiCisJCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRlbnQuYmFzZUpwYUNvbnRlbnQiCisJCQlmaWxlLW5hbWVzPSJwZXJzaXN0ZW5jZS54bWwiPgorCQkJPGRlc2NyaWJlcgorCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5YTUxSb290RWxlbWVudENvbnRlbnREZXNjcmliZXIyIj4KKwkJCQk8cGFyYW1ldGVyIAorCQkJCQluYW1lPSJlbGVtZW50IiAKKwkJCQkJdmFsdWU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZX1wZXJzaXN0ZW5jZSIvPgorCQkJPC9kZXNjcmliZXI+CisJCTwvY29udGVudC10eXBlPgorCQkKKwkJPCEtLSAiYWJzdHJhY3QiIG1hcHBpbmcgZmlsZSBjb250ZW50IHR5cGUgLS0+CisJCTxjb250ZW50LXR5cGUKKwkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZW50Lm1hcHBpbmdGaWxlIgorCQkJbmFtZT0iJU1BUFBJTkdfRklMRV9DT05URU5UIgorCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZW50LmJhc2VKcGFDb250ZW50Ij4KKwkJPC9jb250ZW50LXR5cGU+CisJCQorCQk8IS0tIG9ybS54bWwgY29udGVudCB0eXBlIC0tPgorCQk8Y29udGVudC10eXBlCisJCQlpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGVudC5vcm0iCisJCQluYW1lPSIlT1JNX1hNTF9DT05URU5UIgorCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZW50Lm1hcHBpbmdGaWxlIj4KKwkJCTxkZXNjcmliZXIKKwkJCQljbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuWE1MUm9vdEVsZW1lbnRDb250ZW50RGVzY3JpYmVyMiI+CisJCQkJPHBhcmFtZXRlciAKKwkJCQkJbmFtZT0iZWxlbWVudCIgCisJCQkJCXZhbHVlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtfWVudGl0eS1tYXBwaW5ncyIvPgorCQkJPC9kZXNjcmliZXI+CisJCTwvY29udGVudC10eXBlPgorCQkKKwkJPCEtLSBKQVIgY29udGVudCB0eXBlIC0tPgorCQk8Y29udGVudC10eXBlCisJCQlpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGVudC5qYXIiCisJCQluYW1lPSIlSkFSX0NPTlRFTlQiCisJCQlmaWxlLWV4dGVuc2lvbnM9ImphciwgemlwIj4KKwkJCTxkZXNjcmliZXIKKwkJCQljbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuQmluYXJ5U2lnbmF0dXJlRGVzY3JpYmVyIj4KKwkJCQk8cGFyYW1ldGVyIG5hbWU9InNpZ25hdHVyZSIgdmFsdWU9IjUwIDRCIDAzIDA0Ii8+CisJCQk8L2Rlc2NyaWJlcj4KKwkJPC9jb250ZW50LXR5cGU+CisJCQorCTwvZXh0ZW5zaW9uPgorCQorCQogCTxleHRlbnNpb24gCiAJCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+CiAJCQpAQCAtMjIsMjUgKzgxLDM2IEBACiAJCQl0eXBlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGUiCiAJCQluYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIgogCQkJcHJvcGVydGllcz0iaXNNYXBwZWQsIGlzVmlydHVhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGVQcm9wZXJ0eVRlc3RlciI+Ci0JCTwvcHJvcGVydHlUZXN0ZXI+CisJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlUHJvcGVydHlUZXN0ZXIiLz4KIAkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIKLQkJaWQ9ImpwYVByb2JsZW1NYXJrZXIiCi0JCW5hbWU9IiVKUEFfUFJPQkxFTV9NQVJLRVIiPgotCi0JCTxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+CisJCTxwcm9wZXJ0eVRlc3RlcgorCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnByb3BlcnR5VGVzdGVyLnBsYXRmb3JtUmVzb3VyY2UiCisJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiCisJCQluYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIgorCQkJcHJvcGVydGllcz0ianBhUGxhdGZvcm0iCisJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhUGxhdGZvcm1UZXN0ZXIiLz4KIAkJCi0JCTwhLS0gQ2FuJ3QgdXNlIHRleHQgbWFya2VyIHVudGlsIHdlIGhhdmUgc3BlY2lmaWMgbW9kZWxzIGZvciBlYWNoIGlucHV0IHR5cGUgKFhNTCwgamF2YSkKLQkJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRleHRtYXJrZXIiLz4KLQkJLS0+CisJCTxwcm9wZXJ0eVRlc3RlcgorCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnByb3BlcnR5VGVzdGVyLmphdmFFbGVtZW50IgorCQkJdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50IgorCQkJbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuY29yZSIKKwkJCXByb3BlcnRpZXM9ImpwYVBsYXRmb3JtIgorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwYVBsYXRmb3JtVGVzdGVyIi8+CiAJCQotCQk8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJvYmxlbW1hcmtlciIvPgotCisJCTxwcm9wZXJ0eVRlc3RlcgorCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnByb3BlcnR5VGVzdGVyLnhtbFJlc291cmNlIgorCQkJdHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlIgorCQkJbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuY29yZSIKKwkJCXByb3BlcnRpZXM9ImlzTGF0ZXN0U3VwcG9ydGVkVmVyc2lvbiIKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2VQcm9wZXJ0eVRlc3RlciIvPgorCQkKKwkJPHByb3BlcnR5VGVzdGVyCisJCQlpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUucHJvcGVydHlUZXN0ZXIueG1sRmlsZSIKKwkJCXR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sRmlsZSIKKwkJCW5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUiCisJCQlwcm9wZXJ0aWVzPSJpc0xhdGVzdFN1cHBvcnRlZFZlcnNpb24iCisJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlUHJvcGVydHlUZXN0ZXIiLz4KKwkJCiAJPC9leHRlbnNpb24+CiAJCiAJCkBAIC00OCw0NSArMTE4LDI5IEBACiAJCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgogCQkKIAkJPGZhY3RvcnkKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcGFQcm9qZWN0QWRhcHRlckZhY3RvcnkiCisJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuUHJvamVjdEFkYXB0ZXJGYWN0b3J5IgogCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgogCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCIvPgogCQk8L2ZhY3Rvcnk+CiAJCQogCQk8ZmFjdG9yeQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwYVByb2plY3RBZGFwdGVyRmFjdG9yeSIKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5Qcm9qZWN0QWRhcHRlckZhY3RvcnkiCiAJCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QiPgogCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCIvPgogCQk8L2ZhY3Rvcnk+CiAJCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgorCQk8ZmFjdG9yeQorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLlJlc291cmNlQWRhcHRlckZhY3RvcnkiCisJCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgorCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuSVJlc291cmNlUGFydCIvPgorCQk8L2ZhY3Rvcnk+CiAJCQotCQk8Y29udGVudC10eXBlCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGVudC5vcm0iCi0JCQluYW1lPSIlT1JNX1hNTF9DT05URU5UIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJZmlsZS1uYW1lcz0ib3JtLnhtbCI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LlhNTFJvb3RFbGVtZW50Q29udGVudERlc2NyaWJlciI+Ci0JCQkJPHBhcmFtZXRlciBuYW1lPSJlbGVtZW50IiB2YWx1ZT0iZW50aXR5LW1hcHBpbmdzIi8+Ci0JCQk8L2Rlc2NyaWJlcj4KLQkJPC9jb250ZW50LXR5cGU+Ci0gIAkJCi0gIAkJPGNvbnRlbnQtdHlwZQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRlbnQucGVyc2lzdGVuY2UiCi0JCQluYW1lPSIlUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlQiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQlmaWxlLW5hbWVzPSJwZXJzaXN0ZW5jZS54bWwiPgotCQkJPGRlc2NyaWJlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5YTUxSb290RWxlbWVudENvbnRlbnREZXNjcmliZXIiPgotCQkJCTxwYXJhbWV0ZXIgbmFtZT0iZWxlbWVudCIgdmFsdWU9InBlcnNpc3RlbmNlIi8+Ci0JCQk8L2Rlc2NyaWJlcj4KLQkJPC9jb250ZW50LXR5cGU+Ci0gCQorCQk8ZmFjdG9yeQorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZUFkYXB0ZXJGYWN0b3J5IgorCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgorCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlIi8+CisJCTwvZmFjdG9yeT4KKwkJCiAJPC9leHRlbnNpb24+CiAJCiAJCkBAIC0xMDIsMzUgKzE1NiwxMzkgQEAKIAk8IS0tICoqKioqIEpQVCBleHRlbnNpb25zIChlYXQgb3VyIG93biBkb2dmb29kKSAqKioqKiAtLT4KIAogCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYVBsYXRmb3JtIj4KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYVBsYXRmb3JtcyI+CiAJCQogCQk8anBhUGxhdGZvcm0KIAkJCWlkPSJnZW5lcmljIgotCQkJbGFiZWw9IiVHRU5FUklDX1BMQVRGT1JNX0xBQkVMIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkdlbmVyaWNKcGFQbGF0Zm9ybSIKLQkJCWRlZmF1bHQ9ImZhbHNlIi8+CisJCQlsYWJlbD0iJUdFTkVSSUNfMV8wX1BMQVRGT1JNX0xBQkVMIgorCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5IgorCQkJanBhRmFjZXRWZXJzaW9uPSIxLjAiCisJCQlkZWZhdWx0PSJmYWxzZSI+CisJCTwvanBhUGxhdGZvcm0+CisJCQkKKwkgIDxqcGFQbGF0Zm9ybQorCSAgICAgICAgaWQ9ImdlbmVyaWMyXzAiCisJICAgICAgICBsYWJlbD0iJUdFTkVSSUNfMl8wX1BMQVRGT1JNX0xBQkVMIgorCSAgICAgICAgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLkdlbmVyaWMyXzBKcGFQbGF0Zm9ybUZhY3RvcnkiCisJICAgICAgICBqcGFGYWNldFZlcnNpb249IjIuMCIKKwkgICAgICAgIGRlZmF1bHQ9ImZhbHNlIj4KKwkgIDwvanBhUGxhdGZvcm0+CiAJCQogCTwvZXh0ZW5zaW9uPgogCQogCQorCTwhLS0KKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqIExpYnJhcnkgUHJvdmlkZXIgRnJhbWV3b3JrIEludGVncmF0aW9uICoKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwktLT4KKwkKKwk8ZXh0ZW5zaW9uIAorCQlwb2ludD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicmFyeVByb3ZpZGVycyI+CisJCQorCQk8cHJvdmlkZXIgCisJCQlpZD0ianBhLWxlZ2FjeS1saWJyYXJ5LXByb3ZpZGVyIiAKKwkJCWV4dGVuZHM9ImxlZ2FjeS1saWJyYXJ5LXByb3ZpZGVyIgorCQkJaGlkZGVuPSJ0cnVlIj4KKwkJCTxhY3Rpb24gdHlwZT0iVU5JTlNUQUxMIj4KKwkJCQk8b3BlcmF0aW9uCisJCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5MZWdhY3lKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uIi8+CisJCQk8L2FjdGlvbj4KKwkJPC9wcm92aWRlcj4JCQorCQkKKwkJPHByb3ZpZGVyIAorCQkJaWQ9ImpwYS1uby1vcC1saWJyYXJ5LXByb3ZpZGVyIiAKKwkJCWV4dGVuZHM9Im5vLW9wLWxpYnJhcnktcHJvdmlkZXIiPgorCQkJPHBhcmFtIG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSIlTk9fT1BfTElCUkFSWV9QUk9WSURFUl9XQVJOSU5HIi8+CisJCQk8cGFyYW0gbmFtZT0id2FybmluZyIgdmFsdWU9IiVOT19PUF9MSUJSQVJZX1BST1ZJREVSX01FU1NBR0UiLz4KKwkJCTxlbmFibGVtZW50PgorCQkJCTx3aXRoIHZhcmlhYmxlPSJyZXF1ZXN0aW5nUHJvamVjdEZhY2V0Ij4KKwkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGEiIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgorCQkJCTwvd2l0aD4KKwkJCTwvZW5hYmxlbWVudD4KKwkJPC9wcm92aWRlcj4KKwkJCisJCTxwcm92aWRlciAKKwkJCWlkPSJqcGEtZ2VuZXJpYy11c2VyLWxpYnJhcnktcHJvdmlkZXIiIAorCQkJZXh0ZW5kcz0id3RwLXVzZXItbGlicmFyeS1wcm92aWRlciI+CisJCQk8cGFyYW0gbmFtZT0idmFsaWRhdG9yIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi51c2VyLktleUNsYXNzZXNWYWxpZGF0b3IiLz4KKwkJCTxwYXJhbSBuYW1lPSJ2YWxpZGF0b3IucGFyYW0uMCIgdmFsdWU9ImphdmF4LnBlcnNpc3RlbmNlLkVudGl0eSIvPgorCQkJPGVuYWJsZW1lbnQ+CisJCQkJPGFuZD4KKwkJCQkJPHdpdGggdmFyaWFibGU9InJlcXVlc3RpbmdQcm9qZWN0RmFjZXQiPgorCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGEiIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgorCQkJCQk8L3dpdGg+CisJCQkJCTx3aXRoIHZhcmlhYmxlPSJqcGFQbGF0Zm9ybSI+CisJCQkJCQk8b3I+CisJCQkJCQkJPGVxdWFscyB2YWx1ZT0iZ2VuZXJpYyIvPgorCQkJCQkJCTxlcXVhbHMgdmFsdWU9ImdlbmVyaWMyXzAiLz4KKwkJCQkJCTwvb3I+CisJCQkJCTwvd2l0aD4KKwkJCQk8L2FuZD4KKwkJCTwvZW5hYmxlbWVudD4KKwkJPC9wcm92aWRlcj4KKwkJCisJPC9leHRlbnNpb24+CisJCisJCisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGVnYWN5TGlicmFyeVByb3ZpZGVyRGV0ZWN0b3JzIj4KKwkJCisJCTxkZXRlY3RvcgorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkxlZ2FjeUpwYUxpYnJhcnlQcm92aWRlckRldGVjdG9yIi8+CisJCQorCTwvZXh0ZW5zaW9uPgorCQorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnJhcnlQcm92aWRlcnMiPgorCQorCQk8cHJvdmlkZXIgaWQ9ImVjbGlwc2VsaW5rLTEwMi1vc2dpLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIgZXh0ZW5kcz0id3RwLW9zZ2ktYnVuZGxlcy1saWJyYXJ5LXByb3ZpZGVyIj4KKwkJCTxsYWJlbD5FY2xpcHNlTGluayAxLjAueDwvbGFiZWw+CisJCQkJPHBhcmFtIG5hbWU9ImNvbnRhaW5lci5sYWJlbCIgdmFsdWU9IkVjbGlwc2VMaW5rIDEuMC54Ii8+CisJCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS4wIiB2YWx1ZT0iamF2YXgucGVyc2lzdGVuY2U6WzEuMC4wLCAyLjAuMCkiLz4KKwkJCQk8cGFyYW0gbmFtZT0iYnVuZGxlLjEiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlOlsxLjAuMCwgMS4xLjApIi8+CisJCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS4yIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhOlsxLjAuMCwgMS4xLjApIi8+CisJCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS4zIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYXNtOlsxLjAuMCwgMS4xLjApIi8+CisJCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS40IiB2YWx1ZT0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW50bHI6WzEuMC4wLCAxLjEuMCkiLz4KKwkJCTxlbmFibGVtZW50PgorCQkJCTx3aXRoIHZhcmlhYmxlPSJyZXF1ZXN0aW5nUHJvamVjdEZhY2V0Ij4KKwkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGEiIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgorCQkJCTwvd2l0aD4KKwkJCTwvZW5hYmxlbWVudD4KKwkJPC9wcm92aWRlcj4KKworCQk8cHJvdmlkZXIgaWQ9ImVjbGlwc2VsaW5rLTExMC1vc2dpLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIgZXh0ZW5kcz0id3RwLW9zZ2ktYnVuZGxlcy1saWJyYXJ5LXByb3ZpZGVyIj4KKwkJCTxsYWJlbD5FY2xpcHNlTGluayAxLjEueDwvbGFiZWw+CisJCQkJPHBhcmFtIG5hbWU9ImNvbnRhaW5lci5sYWJlbCIgdmFsdWU9IkVjbGlwc2VMaW5rIDEuMS54Ii8+CisJCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS4wIiB2YWx1ZT0iamF2YXgucGVyc2lzdGVuY2U6WzEuMC4wLCAyLjAuMCkiLz4KKwkJCQk8cGFyYW0gbmFtZT0iYnVuZGxlLjEiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlOlsxLjEuMCwgMi4wLjApIi8+CisJCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS4yIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhOlsxLjEuMCwgMi4wLjApIi8+CisJCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS4zIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYXNtOlsxLjEuMCwgMi4wLjApIi8+CisJCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS40IiB2YWx1ZT0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW50bHI6WzEuMS4wLCAyLjAuMCkiLz4KKwkJCTxlbmFibGVtZW50PgorCQkJCTx3aXRoIHZhcmlhYmxlPSJyZXF1ZXN0aW5nUHJvamVjdEZhY2V0Ij4KKwkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGEiIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgorCQkJCTwvd2l0aD4KKwkJCTwvZW5hYmxlbWVudD4KKwkJPC9wcm92aWRlcj4KKworCTwvZXh0ZW5zaW9uPgorCiAJPCEtLSAqKioqKiBXVFAgZXh0ZW5zaW9ucyAqKioqKiAtLT4KIAogCTxleHRlbnNpb24KIAkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5yZXNvdXJjZUZhY3RvcmllcyI+CiAJCQogCQk8cmVzb3VyY2VGYWN0b3J5Ci0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VSZXNvdXJjZUZhY3RvcnkiCi0JCQlpc0RlZmF1bHQ9InRydWUiCi0JCQlzaG9ydFNlZ21lbnQ9InBlcnNpc3RlbmNlLnhtbCI+CisJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxSZXNvdXJjZUZhY3RvcnkiCisJCQlpc0RlZmF1bHQ9InRydWUiPgogCQkJPGNvbnRlbnRUeXBlQmluZGluZwogCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRlbnQucGVyc2lzdGVuY2UiPgogCQkJPC9jb250ZW50VHlwZUJpbmRpbmc+CiAJCTwvcmVzb3VyY2VGYWN0b3J5PgogCQkKIAkJPHJlc291cmNlRmFjdG9yeQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1SZXNvdXJjZUZhY3RvcnkiCi0JCQlpc0RlZmF1bHQ9InRydWUiCi0JCQlzaG9ydFNlZ21lbnQ9Im9ybS54bWwiPgorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1YbWxSZXNvdXJjZUZhY3RvcnkiCisJCQlpc0RlZmF1bHQ9InRydWUiPgogCQkJPGNvbnRlbnRUeXBlQmluZGluZwogCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRlbnQub3JtIj4KIAkJCTwvY29udGVudFR5cGVCaW5kaW5nPgpAQCAtMTYyLDE2ICszMjAsMjkgQEAKIAkJCTwvY29uc3RyYWludD4KIAkJPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+CiAJCQorCQk8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqcHQuanBhIiB2ZXJzaW9uPSIyLjAiPgorCQkJPGNvbnN0cmFpbnQ+CisJCQkJPGFuZD4KKwkJCQkJPHJlcXVpcmVzIGZhY2V0PSJqc3QuamF2YSIgdmVyc2lvbj0iWzUuMCIvPgorCQkJCQk8b3I+CisJCQkJCQk8cmVxdWlyZXMgZmFjZXQ9ImpzdC51dGlsaXR5IiB2ZXJzaW9uPSJbMS4wIi8+CisJCQkJCQk8cmVxdWlyZXMgZmFjZXQ9ImpzdC5hcHBjbGllbnQiIHZlcnNpb249IlsxLjIiLz4KKwkJCQkJCTxyZXF1aXJlcyBmYWNldD0ianN0LmVqYiIgdmVyc2lvbj0iWzEuMSIvPgorCQkJCQkJPHJlcXVpcmVzIGZhY2V0PSJqc3QuY29ubmVjdG9yIiB2ZXJzaW9uPSJbMS4wIi8+CisJCQkJCQk8cmVxdWlyZXMgZmFjZXQ9ImpzdC53ZWIiIHZlcnNpb249IlsyLjIiLz4KKwkJCQkJPC9vcj4KKwkJCQk8L2FuZD4KKwkJCTwvY29uc3RyYWludD4KKwkJPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+CisJCQogCQk8dGVtcGxhdGUgaWQ9ImpwdC5qcGEudGVtcGxhdGUiPgogCQkJPGxhYmVsPiVKUEFfVEVNUExBVEVfTEFCRUw8L2xhYmVsPgogCQkJPGZpeGVkIGZhY2V0PSJqc3QuamF2YSIvPgotCQkJPGZpeGVkIGZhY2V0PSJqc3QudXRpbGl0eSIvPgogCQkJPGZpeGVkIGZhY2V0PSJqcHQuanBhIi8+Ci0JCQk8cHJlc2V0IGlkPSJqcHQuanBhLnByZXNldCIvPgogCQk8L3RlbXBsYXRlPgogCQkKIAkJPGFjdGlvbiBmYWNldD0ianB0LmpwYSIgdHlwZT0iaW5zdGFsbCIgaWQ9ImpwdC5qcGEuaW5zdGFsbCI+Ci0JCQk8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIiLz4KKwkJCTxjb25maWctZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIiLz4KIAkJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KIAkJPC9hY3Rpb24+CiAJCQpAQCAtMTg0LDIzICszNTUsNDYgQEAKIAkJPC9hY3Rpb24+CiAJCQogCQk8IS0tIAotCQkJVGhlcmUgaXMgbm8gdmVyc2lvbiBjaGFuZ2UgZGVsZWdhdGUsIGJlY2F1c2UgYXMgb2Ygbm93LCB0aGVyZSBpcyAKLQkJICAgIG9ubHkgYSBzaW5nbGUgdmVyc2lvbiBvZiBKUEEgCisJCQlUaGUgdmVyc2lvbiBjaGFuZ2UgIAogCQktLT4KKwkJPGFjdGlvbiBmYWNldD0ianB0LmpwYSIgdHlwZT0idmVyc2lvbi1jaGFuZ2UiIGlkPSJqcHQuanBhLnZlcnNpb24tY2hhbmdlIj4KKwkJCTxjb25maWctZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRWZXJzaW9uQ2hhbmdlRGF0YU1vZGVsUHJvdmlkZXIiLz4KKwkJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUiLz4KKwkJPC9hY3Rpb24+CiAJCQogCTwvZXh0ZW5zaW9uPgogCQotCisJCisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZGVmYXVsdEZhY2V0cyI+CisJCQorCQk8ZGVmYXVsdC1mYWNldHM+CisJCQk8Y29udGV4dD4KKwkJCQk8Zml4ZWQtZmFjZXQgaWQ9ImpwdC5qcGEiLz4KKwkJCTwvY29udGV4dD4KKwkJCTxmYWNldCBpZD0ianN0LnV0aWxpdHkiIHZlcnNpb249IjEuMCIvPgorICAgIAk8L2RlZmF1bHQtZmFjZXRzPgorCQkKKwk8L2V4dGVuc2lvbj4KKwkKKwkKIAk8ZXh0ZW5zaW9uCiAJCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcmVzZXRzIj4KIAkJCi0JCTxzdGF0aWMtcHJlc2V0IGlkPSJqcHQuanBhLnByZXNldCI+Ci0JCQk8bGFiZWw+JUpQQV9QUkVTRVRfTEFCRUw8L2xhYmVsPgorCQk8c3RhdGljLXByZXNldCBpZD0ianB0LmpwYS4xXzAucHJlc2V0Ij4KKwkJCTxsYWJlbD4lSlBBXzEuMF9QUkVTRVRfTEFCRUw8L2xhYmVsPgogCQkJPGZhY2V0IGlkPSJqc3QuamF2YSIgdmVyc2lvbj0iNS4wIi8+CiAJCQk8ZmFjZXQgaWQ9ImpzdC51dGlsaXR5IiB2ZXJzaW9uPSIxLjAiLz4KIAkJCTxmYWNldCBpZD0ianB0LmpwYSIgdmVyc2lvbj0iMS4wIi8+CiAJCTwvc3RhdGljLXByZXNldD4KIAkJCisJCTxzdGF0aWMtcHJlc2V0IGlkPSJqcHQuanBhLjJfMC5wcmVzZXQiPgorCQkJPGxhYmVsPiVKUEFfMi4wX1BSRVNFVF9MQUJFTDwvbGFiZWw+CisJCQk8ZmFjZXQgaWQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSI2LjAiLz4KKwkJCTxmYWNldCBpZD0ianN0LnV0aWxpdHkiIHZlcnNpb249IjEuMCIvPgorCQkJPGZhY2V0IGlkPSJqcHQuanBhIiB2ZXJzaW9uPSIyLjAiLz4KKwkJPC9zdGF0aWMtcHJlc2V0PgorCQkKIAk8L2V4dGVuc2lvbj4KIAkKIAkKQEAgLTIxNiwzOSArNDEwLDUzIEBACiAJCQogCQogCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciIKLSAgICAJaWQ9ImpwYVZhbGlkYXRvciIKKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIgorCQlpZD0ianBhVmFsaWRhdG9yIgogCQluYW1lPSIlSlBBX1ZBTElEQVRPUiI+CiAJCQotCQk8dmFsaWRhdG9yPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPGFuZD4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGEiLz4KLQkJCQk8L2FuZD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJCQotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSJvcm0ueG1sIi8+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9InBlcnNpc3RlbmNlLnhtbCIvPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmphdmEiLz4KLSAgICAgICAgIAkKLSAgICAgICAgIAk8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRvciIvPgotCQkJPGhlbHBlciBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFIZWxwZXIiLz4KLQkJCQotCQkJPG1hcmtlcklkIG1hcmtlcklkVmFsdWU9ImpwYVByb2JsZW1NYXJrZXIiLz4KLQkJCQotICAgICAgICAgCTwhLS0gZG9uJ3Qga25vdyB3aGF0IHRoaXMgZG9lcwotCQkJPGRlcGVuZGVudFZhbGlkYXRvciBkZXBWYWxWYWx1ZT0idHJ1ZSIvPgotCQkJLS0+Ci0JCQkKKwkJPHZhbGlkYXRvcgorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdG9yIj4KKwkJCTxpbmNsdWRlPgorCQkJCTxydWxlcz4KKwkJCQkJPGZhY2V0IGlkPSJqcHQuanBhIi8+CisJCQkJPC9ydWxlcz4KKwkJCTwvaW5jbHVkZT4KKwkJCTxpbmNsdWRlPgorCQkJCTxydWxlcz4KKwkJCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhU291cmNlIi8+CisJCQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGVudC5qYXIiLz4KKwkJCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZW50LmJhc2VKcGFDb250ZW50IiBleGFjdE1hdGNoPSJmYWxzZSIvPgorCQkJCTwvcnVsZXM+CisJCQk8L2luY2x1ZGU+CiAJCTwvdmFsaWRhdG9yPgogCQkKIAk8L2V4dGVuc2lvbj4KIAkKIAkKKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY2F0YWxvZ0NvbnRyaWJ1dGlvbnMiPgorCQkKKwkJPGNhdGFsb2dDb250cmlidXRpb24gaWQ9ImRlZmF1bHQiPgorCQkJCisJCQk8cHVibGljCisJCQkJcHVibGljSWQ9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybSIKKwkJCQl1cmk9InNjaGVtYS9vcm1fMl8wLnhzZCIvPgorCQkJCisJCQk8cHVibGljCisJCQkJcHVibGljSWQ9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlIgorCQkJCXVyaT0ic2NoZW1hL3BlcnNpc3RlbmNlXzJfMC54c2QiLz4KKwkJCQorCQk8IS0tIG1vdmUgdGhlc2Ugc2NoZW1hcyB0byBvcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcyAtLT4KKwkJCQorCQkJPHVyaQorCQkJCW5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybV8yXzAueHNkIgorCQkJCXVyaT0ic2NoZW1hL29ybV8yXzAueHNkIiAvPgorCQkJCisJCQk8dXJpCisJCQkJbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfMl8wLnhzZCIKKwkJCQl1cmk9InNjaGVtYS9wZXJzaXN0ZW5jZV8yXzAueHNkIiAvPgorCQkJCisJCTwvY2F0YWxvZ0NvbnRyaWJ1dGlvbj4KKwkJCisJPC9leHRlbnNpb24+CisJCiA8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwYV9jb3JlLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9wcm9wZXJ0eV9maWxlcy9qcGFfY29yZS5wcm9wZXJ0aWVzCmluZGV4IDBkMWM0ZDkuLjUyNDE0NzMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwYV9jb3JlLnByb3BlcnRpZXMKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvcHJvcGVydHlfZmlsZXMvanBhX2NvcmUucHJvcGVydGllcwpAQCAtMSwyOSArMSwzNiBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisjIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAjIAogIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIE5PTkU9PE5vbmU+CitWQUxJREFURV9KT0I9VmFsaWRhdGlvbgogVkFMSURBVEVfUFJPSkVDVF9OT1RfU1BFQ0lGSUVEPVByb2plY3QgbXVzdCBiZSBzcGVjaWZpZWQKIFZBTElEQVRFX1NPVVJDRV9GT0xERVJfTk9UX1NQRUNJRklFRD1Tb3VyY2UgZm9sZGVyIG11c3QgYmUgc3BlY2lmaWVkCiBWQUxJREFURV9TT1VSQ0VfRk9MREVSX0lMTEVHQUw9U291cmNlIGZvbGRlciBwYXRoIGlzIGlsbGVnYWwKIFZBTElEQVRFX1NPVVJDRV9GT0xERVJfRE9FU19OT1RfRVhJU1Q9U291cmNlIGZvbGRlciAnJ3swfScnIGRvZXMgbm90IGV4aXN0CiBWQUxJREFURV9TT1VSQ0VfRk9MREVSX05PVF9JTl9QUk9KRUNUPVNvdXJjZSBmb2xkZXIgJyd7MH0nJyBpcyBub3QgaW4gcHJvamVjdCAnJ3sxfScnCiBWQUxJREFURV9TT1VSQ0VfRk9MREVSX05PVF9TT1VSQ0VfRk9MREVSPVNvdXJjZSBmb2xkZXIgJyd7MH0nJyBpcyBub3QgYW4gYWN0dWFsIHNvdXJjZSBmb2xkZXIKLVZBTElEQVRFX09STV9GSUxFX0FMUkVBRFlfRVhJU1RTPUZpbGUgYWxyZWFkeSBleGlzdHMgYXQgdGhpcyBsb2NhdGlvbgorVkFMSURBVEVfRklMRV9QQVRIX05PVF9TUEVDSUZJRUQ9RmlsZSBwYXRoIG11c3QgYmUgc3BlY2lmaWVkCitWQUxJREFURV9GSUxFX0FMUkVBRFlfRVhJU1RTPUZpbGUgYWxyZWFkeSBleGlzdHMgYXQgdGhpcyBsb2NhdGlvbgorVkFMSURBVEVfRklMRV9WRVJTSU9OX05PVF9TVVBQT1JURUQ9RmlsZSB2ZXJzaW9uIG5vdCBzdXBwb3J0ZWQKK1ZBTElEQVRFX0ZJTEVfVkVSU0lPTl9OT1RfU1VQUE9SVEVEX0ZPUl9GQUNFVF9WRVJTSU9OPUZpbGUgdmVyc2lvbiBub3Qgc3VwcG9ydGVkIGZvciBKUEEgZmFjZXQgdmVyc2lvbgogVkFMSURBVEVfUEVSU0lTVEVOQ0VfVU5JVF9ET0VTX05PVF9TUEVDSUZJRUQ9UGVyc2lzdGVuY2UgdW5pdCBub3Qgc3BlY2lmaWVkCiBWQUxJREFURV9QRVJTSVNURU5DRV9VTklUX05PVF9JTl9QUk9KRUNUPVBlcnNpc3RlbmNlIHVuaXQgJyd7MH0nJyBub3QgZGVmaW5lZCBpbiBwcm9qZWN0ICcnezF9JycKIFZBTElEQVRFX1BMQVRGT1JNX05PVF9TUEVDSUZJRUQ9UGxhdGZvcm0gbXVzdCBiZSBzcGVjaWZpZWQKK1ZBTElEQVRFX1BMQVRGT1JNX0RPRVNfTk9UX1NVUFBPUlRfRkFDRVRfVkVSU0lPTj1QbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjdXJyZW50IEpQQSBmYWNldCB2ZXJzaW9uCiBWQUxJREFURV9DT05ORUNUSU9OX05PVF9TUEVDSUZJRUQ9Q29ubmVjdGlvbiBtdXN0IGJlIHNwZWNpZmllZAogVkFMSURBVEVfQ09OTkVDVElPTl9JTlZBTElEPUNvbm5lY3Rpb24gcHJvZmlsZSAnJ3swfScnIGRvZXMgbm90IGV4aXN0CiBWQUxJREFURV9DT05ORUNUSU9OX05PVF9DT05ORUNURUQ9Q29ubmVjdGlvbiBtdXN0IGJlIGFjdGl2ZSB0byBnZXQgZGF0YSBzb3VyY2Ugc3BlY2lmaWMgaGVscCBhbmQgdmFsaWRhdGlvbi4KK1ZBTElEQVRFX0RFRkFVTFRfQ0FUQUxPR19OT1RfU1BFQ0lGSUVEPURlZmF1bHQgY2F0YWxvZyBpcyBub3Qgc3BlY2lmaWVkCitWQUxJREFURV9DT05ORUNUSU9OX0RPRVNOVF9DT05UQUlOX0NBVEFMT0c9Q2F0YWxvZyAnJ3swfScnIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBjb25uZWN0aW9uIHNwZWNpZmllZAogVkFMSURBVEVfREVGQVVMVF9TQ0hFTUFfTk9UX1NQRUNJRklFRD1EZWZhdWx0IHNjaGVtYSBpcyBub3Qgc3BlY2lmaWVkCitWQUxJREFURV9DT05ORUNUSU9OX0RPRVNOVF9DT05UQUlOX1NDSEVNQT1TY2hlbWEgJyd7MH0nJyBkb2VzIG5vdCBleGlzdCBvbiB0aGUgY29ubmVjdGlvbiBzcGVjaWZpZWQKIFZBTElEQVRFX1JVTlRJTUVfTk9UX1NQRUNJRklFRD1UaGVyZSBpcyBubyBzZXJ2ZXIgcnVudGltZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0IHRvIHByb3ZpZGUgYSBKUEEgaW1wbGVtZW50YXRpb24KIFZBTElEQVRFX1JVTlRJTUVfRE9FU19OT1RfU1VQUE9SVF9FSkJfMzA9VGhlIHNlcnZlciBydW50aW1lIHNlbGVjdGVkIGRvZXMgbm90IHN1cHBvcnQgRUpCIDMuMCwgc28gaXQgbGlrZWx5IGRvZXMgbm90IHByb3ZpZGUgYSBKUEEgaW1wbGVtZW50YXRpb24KIFZBTElEQVRFX0xJQlJBUllfTk9UX1NQRUNJRklFRD1ObyBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSBzcGVjaWZpZWQKQEAgLTMxLDQgKzM4LDEyIEBACiBTWU5DSFJPTklaSU5HX0NMQVNTRVNfVEFTSz1TeW5jaHJvbml6aW5nIGNsYXNzZXMgLi4uCiBJTlZBTElEX1BFUlNJU1RFTkNFX1hNTF9DT05URU5UPUludmFsaWQgcGVyc2lzdGVuY2UueG1sIGNvbnRlbnQKIEVSUk9SX1NZTkNIUk9OSVpJTkdfQ0xBU1NFU19DT1VMRF9OT1RfVkFMSURBVEU9RXJyb3Igc3luY2hyb25pemluZyBjbGFzc2VzLiAgQ291bGQgbm90IHZhbGlkYXRlLgotRVJST1JfV1JJVElOR19GSUxFPUNvdWxkIG5vdCB3cml0ZSB0byBwZXJzaXN0ZW5jZS54bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitFUlJPUl9XUklUSU5HX0ZJTEU9Q291bGQgbm90IHdyaXRlIHRvIHBlcnNpc3RlbmNlLnhtbAorUkVHSVNUUllfTUlTU0lOR19BVFRSSUJVVEU9VGhlIGV4dGVuc2lvbiBlbGVtZW50ICcnezB9JycgaW4gcGx1Zy1pbiAnJ3sxfScnIGlzIG1pc3NpbmcgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSAnJ3syfScnLgorUkVHSVNUUllfRFVQTElDQVRFPVRoZSBwbHVnLWlucyAnJ3swfScnIGFuZCAnJ3sxfScnIGhhdmUgcmVnaXN0ZXJlZCBhIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgJyd7Mn0nJyBmb3IgdGhlIGV4dGVuc2lvbiBlbGVtZW50ICcnezN9Jyc6ICcnezR9JycuCitSRUdJU1RSWV9GQUlMRURfSU5TVEFOVElBVElPTj1VbmFibGUgdG8gaW5zdGFudGlhdGUgdGhlIGNsYXNzICcnezB9JycgZm9yIHRoZSBleHRlbnNpb24gZWxlbWVudCAnJ3sxfScnIGluIHRoZSBwbHVnLWluICcnezJ9JycuCitVUERBVEVfSk9CX05BTUU9VXBkYXRlIEpQQSBwcm9qZWN0OiAnJ3swfScnCitTWU5DSFJPTklaRV9NRVRBTU9ERUxfSk9CX05BTUU9U3luY2hyb25pemUgSlBBIENhbm9uaWNhbCBNZXRhbW9kZWw6ICcnezB9JycKK1BMQVRGT1JNX0lEX0RPRVNfTk9UX0VYSVNUPU5vIEpQQSBwbGF0Zm9ybSBleGlzdHMgZm9yIHRoZSBpZDogJyd7MH0nJy4gVGhlIEpQQSBwcm9qZWN0IHdhcyBub3QgY3JlYXRlZCBmb3IgcHJvamVjdCAnJ3sxfScnLiAgRW5zdXJlIHRoYXQgdGhlIHBsYXRmb3JtJydzIHBsdWdpbiBoYXMgYmVlbiBhZGRlZCB0byB0aGlzIEVjbGlwc2UgaW5zdGFsbGF0aW9uLgorREFMSV9FVkVOVF9IQU5ETEVSX1RIUkVBRF9OQU1FPURhbGkgRXZlbnQgSGFuZGxlcgorUFJFRkVSRU5DRVNfRkxVU0hfSk9CX05BTUU9Rmx1c2ggUHJlZmVyZW5jZXM6IHswfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvcHJvcGVydHlfZmlsZXMvanBhX3ZhbGlkYXRpb24ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwYV92YWxpZGF0aW9uLnByb3BlcnRpZXMKaW5kZXggYTRkYzE0ZS4uNzY3MGFkNiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvcHJvcGVydHlfZmlsZXMvanBhX3ZhbGlkYXRpb24ucHJvcGVydGllcworKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9wcm9wZXJ0eV9maWxlcy9qcGFfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCkBAIC0xLDQwICsxLDUzIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KICMgCiAjIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogUFJPSkVDVF9OT19DT05ORUNUSU9OPU5vIGNvbm5lY3Rpb24gc3BlY2lmaWVkIGZvciBwcm9qZWN0LiAgTm8gZGF0YWJhc2Utc3BlY2lmaWMgdmFsaWRhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4KIFBST0pFQ1RfSU5WQUxJRF9DT05ORUNUSU9OPUNvbm5lY3Rpb24gXCJ7MH1cIiBkb2VzIG5vdCBleGlzdC4gIE5vIGRhdGFiYXNlLXNwZWNpZmljIHZhbGlkYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuCiBQUk9KRUNUX0lOQUNUSVZFX0NPTk5FQ1RJT049Q29ubmVjdGlvbiBcInswfVwiIGlzIG5vdCBhY3RpdmUuICBObyB2YWxpZGF0aW9uIHdpbGwgYmUgZG9uZSBhZ2FpbnN0IHRoZSBkYXRhIHNvdXJjZS4KIFBST0pFQ1RfTk9fUEVSU0lTVEVOQ0VfWE1MPU5vIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGZvdW5kIGluIHByb2plY3QKIFBST0pFQ1RfTVVMVElQTEVfUEVSU0lTVEVOQ0VfWE1MPU11bHRpcGxlIHBlcnNpc3RlbmNlLnhtbCBmaWxlcyBpbiBwcm9qZWN0CitYTUxfVkVSU0lPTl9OT1RfTEFURVNUPUEgbW9yZSByZWNlbnQgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGlzIHN1cHBvcnRlZCBieSB0aGlzIEpQQSBwbGF0Zm9ybQogUEVSU0lTVEVOQ0VfWE1MX0lOVkFMSURfQ09OVEVOVD1JbnZhbGlkIGNvbnRlbnQgKG5vIHJvb3Qgbm9kZSkKIFBFUlNJU1RFTkNFX05PX1BFUlNJU1RFTkNFX1VOSVQ9Tm8gcGVyc2lzdGVuY2UgdW5pdCBkZWZpbmVkCi1QRVJTSVNURU5DRV9NVUxUSVBMRV9QRVJTSVNURU5DRV9VTklUUz1NdWx0aXBsZSBwZXJzaXN0ZW5jZSB1bml0cyBkZWZpbmVkIC0gdG9vbGluZyBvbmx5IHN1cHBvcnRzIDEgcGVyc2lzdGVuY2UgdW5pdCBwZXIgcHJvamVjdAorUEVSU0lTVEVOQ0VfTVVMVElQTEVfUEVSU0lTVEVOQ0VfVU5JVFM9TXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdHMgZGVmaW5lZCAtIG9ubHkgdGhlIGZpcnN0IHBlcnNpc3RlbmNlIHVuaXQgd2lsbCBiZSByZWNvZ25pemVkCiBQRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX01BUFBJTkdfRklMRT1VbnNwZWNpZmllZCBtYXBwaW5nIGZpbGUKK1BFUlNJU1RFTkNFX1VOSVRfVU5TVVBQT1JURURfTUFQUElOR19GSUxFX0NPTlRFTlQ9TWFwcGluZyBmaWxlIFwiezB9XCIgZG9lcyBub3QgaGF2ZSBzdXBwb3J0ZWQgY29udGVudCBmb3IgdGhpcyBKUEEgcGxhdGZvcm0KIFBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfTUFQUElOR19GSUxFPU1hcHBpbmcgZmlsZSBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZAogUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX01BUFBJTkdfRklMRT1NYXBwaW5nIGZpbGUgXCJ7MH1cIiBkb2VzIG5vdCBoYXZlIE9STSBjb250ZW50CiBQRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9NQVBQSU5HX0ZJTEU9RHVwbGljYXRlIG1hcHBpbmcgZmlsZSBcInswfVwiCiBQRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0NMQVNTPVVuc3BlY2lmaWVkIGNsYXNzCiBQRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX0NMQVNTPUNsYXNzIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1QRVJTSVNURU5DRV9VTklUX0lOVkFMSURfQ0xBU1M9Q2xhc3MgXCJ7MH1cIiBpcyBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGJ1dCBub3QgbWFwcGVkCitQRVJTSVNURU5DRV9VTklUX0lOVkFMSURfQ0xBU1M9Q2xhc3MgXCJ7MH1cIiBpcyBpbmNsdWRlZCBpbiBhIHBlcnNpc3RlbmNlIHVuaXQsIGJ1dCBpcyBub3QgbWFwcGVkCiBQRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9DTEFTUz1EdXBsaWNhdGUgY2xhc3MgXCJ7MH1cIgogUEVSU0lTVEVOQ0VfVU5JVF9SRURVTkRBTlRfQ0xBU1M9Q2xhc3MgXCJ7MH1cIiBpcyBhbHJlYWR5IHNwZWNpZmllZCBpbiBtYXBwaW5nIGZpbGUgXCJ7MX1cIgorUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfSkFSX0ZJTEU9RHVwbGljYXRlIEpBUiBmaWxlIFwiezB9XCIKK1BFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfSkFSX0ZJTEU9VW5zcGVjaWZpZWQgSkFSIGZpbGUKK1BFUlNJU1RFTkNFX1VOSVRfSkFSX0ZJTEVfREVQTE9ZTUVOVF9QQVRIX1dBUk5JTkc9VGhlIHBhdGggdG8gdGhlIEpBUiBmaWxlIHdpbGwgdmFyeSBvbiB5b3VyIGRlcGxveW1lbnQgZW52aXJvbm1lbnQuICBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzcGVjaWZpZWQgcGF0aCBmaXRzIHlvdXIgcGFydGljdWxhciBlbnZpcm9ubWVudC4KK1BFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfSkFSX0ZJTEU9SkFSIGZpbGUgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKIEdFTkVSQVRPUl9EVVBMSUNBVEVfTkFNRT1EdXBsaWNhdGUgZ2VuZXJhdG9yIG5hbWVkIFwiezB9XCIgZGVmaW5lZCBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQKIFFVRVJZX0RVUExJQ0FURV9OQU1FPUR1cGxpY2F0ZSBxdWVyeSBuYW1lZCBcInswfVwiIGRlZmluZWQgaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0Ci1FTlRJVFlfTUFQUElOR1NfTVVMVElQTEVfTUVUQURBVEE9TWV0YWRhdGEgZm9yIHBlcnNpc3RlbmNlIHVuaXQgXCJ7MH1cIiBzcGVjaWZpZWQgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcwotUEVSU0lTVEVOVF9UWVBFX1VOU1BFQ0lGSUVEX0NPTlRFWFQ9VGhpcyBtYXBwZWQgY2xhc3MgaXMgbm90IHNwZWNpZmllZCBpbiBwZXJzaXN0ZW5jZSB1bml0IFwiezB9XCIKK01BUFBJTkdfRklMRV9FWFRSQU5FT1VTX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM9RXh0cmFuZW91cyBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzIGZvdW5kIGZvciBtYXBwaW5nIGZpbGUgXCJ7MH1cIi4gIFRoZXNlIGRlZmF1bHRzIHdpbGwgbm90IGJlIHVzZWQuCitQRVJTSVNURU5UX1RZUEVfTUFQUEVEX0JVVF9OT1RfSU5DTFVERURfSU5fUEVSU0lTVEVOQ0VfVU5JVD1DbGFzcyBcInswfVwiIGlzIG1hcHBlZCwgYnV0IGlzIG5vdCBpbmNsdWRlZCBpbiBhbnkgcGVyc2lzdGVuY2UgdW5pdAorUEVSU0lTVEVOVF9UWVBFX0FOTk9UQVRFRF9CVVRfTk9UX0lOQ0xVREVEX0lOX1BFUlNJU1RFTkNFX1VOSVQ9Q2xhc3MgXCJ7MH1cIiBpcyBhbm5vdGF0ZWQsIGJ1dCBpcyBub3QgaW5jbHVkZWQgaW4gYW55IHBlcnNpc3RlbmNlIHVuaXQKIFBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DTEFTUz1VbnNwZWNpZmllZCBjbGFzcwogUEVSU0lTVEVOVF9UWVBFX1VOUkVTT0xWRURfQ0xBU1M9Q2xhc3MgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKLUVOVElUWV9OT19JRD1FbnRpdHkgXCJ7MH1cIiBoYXMgbm8gSWQgb3IgRW1iZWRkZWRJZAorRU5USVRZX05PX0lEPUVudGl0eSBcInswfVwiIGhhcyBubyBwcmltYXJ5IGtleQorRU5USVRZX1NJTkdMRV9UQUJMRV9ERVNDRU5EQU5UX0RFRklORVNfVEFCTEU9Tm8gdGFibGUgc2hvdWxkIGJlIGRlZmluZWQgZm9yIG5vbi1yb290IGVudGl0eSBcInswfVwiIHVzaW5nIHNpbmdsZS10YWJsZSBpbmhlcml0YW5jZQorRU5USVRZX0FCU1RSQUNUX1RBQkxFX1BFUl9DTEFTU19ERUZJTkVTX1RBQkxFPU5vIHRhYmxlIHNob3VsZCBiZSBkZWZpbmVkIGZvciBhYnN0cmFjdCBlbnRpdHkgXCJ7MH1cIiB1c2luZyB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2UKK0VOVElUWV9BQlNUUkFDVF9ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQgPSBObyBkaXNjcmltaW5hdG9yIHZhbHVlIHNob3VsZCBiZSBkZWZpbmVkIGZvciBhYnN0cmFjdCBlbnRpdHkgXCJ7MH1cIgorRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQgPSBObyBkaXNjcmltaW5hdG9yIHZhbHVlIHNob3VsZCBiZSBkZWZpbmVkIGZvciBlbnRpdHkgXCJ7MH1cIiB1c2luZyB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2UKK0VOVElUWV9OT05fUk9PVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVEID1ObyBkaXNjcmltaW5hdG9yIGNvbHVtbiBzaG91bGQgYmUgZGVmaW5lZCBmb3Igbm9uLXJvb3QgZW50aXR5IFwiezB9XCIKK0VOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRCA9IE5vIGRpc2NyaW1pbmF0b3IgY29sdW1uIHNob3VsZCBiZSBkZWZpbmVkIGZvciBlbnRpdHkgXCJ7MH1cIiB1c2luZyB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2UKIFBFUlNJU1RFTlRfQVRUUklCVVRFX1VOU1BFQ0lGSUVEX05BTUU9VW5zcGVjaWZpZWQgbmFtZQogUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5SRVNPTFZFRF9OQU1FPUF0dHJpYnV0ZSBcInswfVwiIGluIGNsYXNzIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkCitQRVJTSVNURU5UX0FUVFJJQlVURV9JTkhFUklURURfQVRUUklCVVRFU19OT1RfU1VQUE9SVEVEPUF0dHJpYnV0ZSBcInswfVwiIGlzIGluaGVyaXRlZDsgcmVmZXJyaW5nIHRvIGluaGVyaXRlZCBhdHRyaWJ1dGVzIGluIHRoZSBvcm0ueG1sIG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IGFsbCBwZXJzaXN0ZW5jZSBwcm92aWRlcnMKIFBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfTUFQUElORz1BdHRyaWJ1dGUgXCJ7MH1cIiBoYXMgaW52YWxpZCBtYXBwaW5nIHR5cGUgaW4gdGhpcyBjb250ZXh0CiBQRVJTSVNURU5UX0FUVFJJQlVURV9GSU5BTF9GSUVMRD1UaGUgamF2YSBmaWVsZCBmb3IgYXR0cmlidXRlIFwiezB9XCIgaXMgZmluYWwKIFBFUlNJU1RFTlRfQVRUUklCVVRFX1BVQkxJQ19GSUVMRD1UaGUgamF2YSBmaWVsZCBmb3IgYXR0cmlidXRlIFwiezB9XCIgaXMgcHVibGljCkBAIC00MywxMSArNTYsMTUgQEAKIE1BUFBJTkdfTUFQUEVEX0JZX1dJVEhfSk9JTl9UQUJMRT1DYW5ub3Qgc3BlY2lmeSBqb2luIHRhYmxlIGlmIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZCBieSBhbm90aGVyIGF0dHJpYnV0ZQogTUFQUElOR19NQVBQRURfQllfT05fQk9USF9TSURFUz1SZWxhdGlvbnNoaXAgbXVzdCBoYXZlIGFuIG93bmVyCiBJRF9NQVBQSU5HX1VOUkVTT0xWRURfR0VORVJBVE9SX05BTUU9VW5yZXNvbHZlZCBnZW5lcmF0b3IgbmFtZSBcInswfVwiCitUQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c9Q2F0YWxvZyBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBmb3IgdGFibGUgXCJ7MX1cIgogVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE9U2NoZW1hIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkIGZvciB0YWJsZSBcInsxfVwiCiBUQUJMRV9VTlJFU09MVkVEX05BTUU9VGFibGUgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKK1NFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c9Q2F0YWxvZyBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBmb3Igc2Vjb25kYXJ5IHRhYmxlIFwiezF9XCIKIFNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQT1TY2hlbWEgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIHNlY29uZGFyeSB0YWJsZSBcInsxfVwiCiBTRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9OQU1FPVNlY29uZGFyeSB0YWJsZSBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZAorSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c9Q2F0YWxvZyBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBmb3Igam9pbiB0YWJsZSBcInsxfVwiCiBKT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BPVNjaGVtYSBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBmb3Igam9pbiB0YWJsZSBcInsxfVwiCitWSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRz1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBjYXRhbG9nIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkIGZvciBqb2luIHRhYmxlIFwiezJ9XCIKIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgc2NoZW1hIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkIGZvciBqb2luIHRhYmxlIFwiezJ9XCIKIEpPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FPUpvaW4gdGFibGUgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIGpvaW4gdGFibGUgXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKQEAgLTU4LDE0ICs3NSwyNiBAQAogVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBjb2x1bW4gXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKIFZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9SW4gaW1wbGllZCBhdHRyaWJ1dGUgb3ZlcnJpZGUgXCJ7MH1cIiwgY29sdW1uIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkCiBKT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFPVRhYmxlIFwiezB9XCIgZm9yIGpvaW4gY29sdW1uIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIHRhYmxlIFwiezF9XCIgZm9yIGpvaW4gY29sdW1uIFwiezJ9XCIgY2Fubm90IGJlIHJlc29sdmVkIAotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFPUluIGltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgXCJ7MH1cIiwgdGFibGUgXCJ7MX1cIiBmb3Igam9pbiBjb2x1bW4gXCJ7Mn1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgCitWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIHRhYmxlIFwiezF9XCIgZm9yIGpvaW4gY29sdW1uIFwiezJ9XCIgY2Fubm90IGJlIHJlc29sdmVkCitWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEU9SW4gaW1wbGllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSBcInswfVwiLCB0YWJsZSBcInsxfVwiIGZvciBqb2luIGNvbHVtbiBcInsyfVwiIGNhbm5vdCBiZSByZXNvbHZlZAogSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUpvaW4gY29sdW1uIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkCitKT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUVfTVVMVElQTEVfSk9JTl9DT0xVTU5TPUpvaW4gY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgam9pbiBjb2x1bW5zCiBWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgam9pbiBjb2x1bW4gXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKK1ZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRV9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgam9pbiBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBqb2luIGNvbHVtbnMKIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUluIGltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgXCJ7MH1cIiwgam9pbiBjb2x1bW4gXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKLUpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1SZWZlcmVuY2VkIGNvbHVtbiBcInswfVwiIGluIGpvaW4gY29sdW1uIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkIAotVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIHJlZmVyZW5jZWQgY29sdW1uIFwiezF9XCIgaW4gam9pbiBjb2x1bW4gXCJ7Mn1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgCi1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbiBpbXBsaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlIFwiezB9XCIsIHJlZmVyZW5jZWQgY29sdW1uIFwiezF9XCIgaW4gam9pbiBjb2x1bW4gXCJ7Mn1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgCitKT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9UmVmZXJlbmNlZCBjb2x1bW4gXCJ7MH1cIiBpbiBqb2luIGNvbHVtbiBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZAorSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUz0gSm9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBqb2luIGNvbHVtbnMKK1ZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCByZWZlcmVuY2VkIGNvbHVtbiBcInsxfVwiIGluIGpvaW4gY29sdW1uIFwiezJ9XCIgY2Fubm90IGJlIHJlc29sdmVkCitWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUVfTVVMVElQTEVfSk9JTl9DT0xVTU5TPSBJbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGpvaW4gY29sdW1ucworVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9SW4gaW1wbGllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSBcInswfVwiLCByZWZlcmVuY2VkIGNvbHVtbiBcInsxfVwiIGluIGpvaW4gY29sdW1uIFwiezJ9XCIgY2Fubm90IGJlIHJlc29sdmVkCiBHRU5FUkFURURfVkFMVUVfVU5SRVNPTFZFRF9HRU5FUkFUT1I9Tm8gZ2VuZXJhdG9yIG5hbWVkIFwiezB9XCIgaXMgZGVmaW5lZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAogUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPVByaW1hcnkga2V5IGpvaW4gY29sdW1uIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkCiBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU9UmVmZXJlbmNlZCBDb2x1bW4gXCJ7MH1cIiBpbiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZAorTk9fSlBBX1BST0pFQ1Q9VGhpcyBwcm9qZWN0IGhhcyB0aGUgSlBBIGZhY2V0LCBidXQgbm8gSlBBIHByb2plY3QgY291bGQgYmUgY3JlYXRlZC4gIFNlZSB0aGUgZXJyb3IgbG9nIGZvciBtb3JlIGRldGFpbHMuCitUQVJHRVRfRU5USVRZX05PVF9ERUZJTkVEPVRhcmdldCBlbnRpdHkgZm9yIFwiezB9XCIgaXMgbm90IGRlZmluZWQKK1ZJUlRVQUxfQVRUUklCVVRFX1RBUkdFVF9FTlRJVFlfTk9UX0RFRklORUQ9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgdGFyZ2V0IGVudGl0eSBpcyBub3QgZGVmaW5lZAorVEFSR0VUX0VOVElUWV9JU19OT1RfQU5fRU5USVRZPVRhcmdldCBlbnRpdHkgXCJ7MH1cIiBmb3IgXCJ7MX1cIiBpcyBub3QgYW4gRW50aXR5CitWSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFk9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgdGFyZ2V0IGVudGl0eSBcInsxfVwiIGlzIG5vdCBhbiBFbnRpdHkKK0RJU0NSSU1JTkFUT1JfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1EaXNjcmltaW5hdG9yIFwiezB9XCIgY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZAorRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfU1VQUE9SVEVEX09OX1BMQVRGT1JNPUVudGl0eSBcInswfVwiIGNhbm5vdCB1c2UgdGFibGUtcGVyLWNvbmNyZXRlLWNsYXNzIGluaGVyaXRhbmNlIGJlY2F1c2UgdGhlIGNob3NlbiBKUEEgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBpdAorRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfUE9SVEFCTEVfT05fUExBVEZPUk09RW50aXR5IFwiezB9XCIgdXNlcyB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2Ugd2hpY2ggaXMgbm90IHBvcnRhYmxlIGFuZCBtYXkgbm90IGJlIHN1cHBvcnRlZCBieSB0aGUgSlBBIHByb3ZpZGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zY2hlbWEvanBhUGxhdGZvcm0uZXhzZCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NjaGVtYS9qcGFQbGF0Zm9ybS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTk1NmNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NjaGVtYS9qcGFQbGF0Zm9ybS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC5jb3JlIiBpZD0ianBhUGxhdGZvcm0iIG5hbWU9IkpQQSBQbGF0Zm9ybSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJqcGFQbGF0Zm9ybSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJqcGFQbGF0Zm9ybSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVjbGFyZXMgYSBKUEEgcGxhdGZvcm0uIFNlZSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybSZsdDsvc2FtcCZndDsgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gSlBBIHBsYXRmb3Jtcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB0cmFuc2xhdGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwbGF0Zm9ybS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm0mbHQ7L3NhbXAmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0iZmFsc2UiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIERlY2xhcmVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBzaG91bGQgYmUgdXNlZCBhcyBhIGRlZmF1bHQgSlBBIHBsYXRmb3JtIGZvciBuZXcgSlBBIHByb2plY3QgY29udGVudC4gIE5vdGUgdGhhdCBpZiBhIHdvcmtzcGFjZSBjb250YWlucyBtb3JlIHRoYW4gb25lIGRlZmF1bHQgcGxhdGZvcm0sIG9uZSBvZiB0aGVtIHdpbGwgYmUgY2hvc2VuIGF0IHJhbmRvbS4gIEJ5IGRlZmF1bHQsIGEgcGxhdGZvcm0gaXMgbm90IGEgZGVmYXVsdCBwbGF0Zm9ybS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc2NoZW1hL2pwYVBsYXRmb3Jtcy5leHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc2NoZW1hL2pwYVBsYXRmb3Jtcy5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MjNhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zY2hlbWEvanBhUGxhdGZvcm1zLmV4c2QKQEAgLTAsMCArMSwxNjYgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC5jb3JlIiBpZD0ianBhUGxhdGZvcm1zIiBuYW1lPSJKUEEgUGxhdGZvcm1zIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFVzZWQgdG8gYWRkIEpQQSBwbGF0Zm9ybXMgYXMgY2hvaWNlcyB3aGVuIGNvbmZpZ3VyaW5nIGEgcHJvamVjdCB3aXRoIHRoZSBKUEEgZmFjZXQuICBUaGUgb3B0aW9uYWwgJnF1b3Q7anBhRmFjZXRWZXJzaW9uJnF1b3Q7IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHRpZSBhIHBsYXRmb3JtIHRvIGEgcGFydGljdWxhciBKUEEgZmFjZXQgdmVyc2lvbiAoaWYgbm90IHByZXNlbnQsIHRoZSBwbGF0Zm9ybSBpcyBhdmFpbGFibGUgZm9yIGFsbCBmYWNldCB2ZXJzaW9ucy4pICBUaGUgb3B0aW9uYWwgJnF1b3Q7ZGVmYXVsdCZxdW90OyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBwbGF0Zm9ybSBzaG91bGQgaGF2ZSBhIGhpZ2hlciBwcmlvcml0eSB3aGVuIGNhbGN1bGF0aW5nIHRoZSBkZWZhdWx0IHBsYXRmb3JtIGZvciBhIHByb2plY3QuCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgIDxhcHBJbmZvPgorICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgorICAgICAgICAgPC9hcHBJbmZvPgorICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJqcGFQbGF0Zm9ybSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPgorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgorICAgICAgICAgICAgICAgPC9hcHBJbmZvPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8ZWxlbWVudCBuYW1lPSJqcGFQbGF0Zm9ybSI+CisgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgRGVjbGFyZXMgYSBKUEEgcGxhdGZvcm0sIG9uZSBqcGFQbGF0Zm9ybSB3aWxsIGJlIGNob3NlbiBwZXIgSnBhUHJvamVjdC4gU2VlICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtJmx0Oy9zYW1wJmd0OyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBKUEEgcGxhdGZvcm1zLiAgQWxzbyBzZWUgdGhlIG9yZy5lY2xpcHNlLmpwdC51aS5qcGFQbGF0Zm9ybXMgZXh0ZW5zaW9uIHBvaW50LgorICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBBIHRyYW5zbGF0YWJsZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBsYXRmb3JtLgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcEluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjdG9yeUNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm1GYWN0b3J5Jmx0Oy9zYW1wJmd0Oy4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPgorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybUZhY3RvcnkiLz4KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqcGFGYWNldFZlcnNpb24iIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgRGVjbGFyZXMgdGhlIEpQQSBmYWNldCB2ZXJzaW9uIGZvciB3aGljaCB0aGlzIHBsYXRmb3JtIG1heSBiZSB1c2VkLiBJZiBubyBKUEEgZmFjZXQgdmVyc2lvbiBpcyBzcGVjaWZpZWQsIHRoaXMgcGxhdGZvcm0gaXMgYXZhaWxhYmxlIGZvciBhbGwgSlBBIGZhY2V0IHZlcnNpb25zLgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiIHR5cGU9ImJvb2xlYW4iIHVzZT0iZGVmYXVsdCIgdmFsdWU9ImZhbHNlIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBEZWNsYXJlcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0gc2hvdWxkIGJlIHVzZWQgYXMgYSBkZWZhdWx0IEpQQSBwbGF0Zm9ybSBmb3IgbmV3IEpQQSBwcm9qZWN0IGNvbnRlbnQuICBOb3RlIHRoYXQgaWYgYSB3b3Jrc3BhY2UgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBkZWZhdWx0IHBsYXRmb3JtIGZvciBhIEpQQSBmYWNldCB2ZXJzaW9uLCBvbmUgb2YgdGhlbSB3aWxsIGJlIGNob3NlbiBhdCByYW5kb20uICBCeSBkZWZhdWx0LCBhIHBsYXRmb3JtIGlzIG5vdCBhIGRlZmF1bHQgcGxhdGZvcm0uCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIDIuMgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgYSBiYXNpYyBKUEEgcGxhdGZvcm0gd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBwcm9taW5lbnQgcGxhdGZvcm0gZm9yIEpQQSAxLjAKKworJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGFQbGF0Zm9ybXMmcXVvdDsmZ3Q7CisgICAmbHQ7anBhUGxhdGZvcm0KKyAgICAgIGlkPSZxdW90O215SnBhUGxhdGZvcm0mcXVvdDsKKyAgICAgIGxhYmVsPSZxdW90O015IEpQQSBQbGF0Zm9ybSZxdW90OworICAgICAgZmFjdG9yeUNsYXNzPSZxdW90O29yZy5mb28uTXlKcGFQbGF0Zm9ybUZhY3RvcnkmcXVvdDsKKyAgICAgIGpwYUZhY2V0VmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsKKyAgICAgIGRlZmF1bHQ9JnF1b3Q7dHJ1ZSZxdW90OyZndDsKKyAgICZsdDsvanBhUGxhdGZvcm0mZ3Q7CismbHQ7L2V4dGVuc2lvbiZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAordW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KK3Bpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKK3dpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKK3Rlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCithbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorIAorQ29udHJpYnV0b3JzOgorT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc2NoZW1hL29ybV8yXzAueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc2NoZW1hL29ybV8yXzAueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OTViMGEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zY2hlbWEvb3JtXzJfMC54c2QKQEAgLTAsMCArMSwxOTM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgorPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iIAorICB4bWxuczpvcm09Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybSIgCisgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAorICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgCisgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgCisgIHZlcnNpb249IjIuMCI+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIEAoIylvcm1fMl8wLnhzZCAyLjAgIE9jdG9iZXIgMSAyMDA5CisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBTdW4gTWljcm9zeXN0ZW1zLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKyAgCisgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAKKyAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgCisgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAKKyAgVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgCisgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAgCisgIENvbnRyaWJ1dG9yczoKKyAgICAgIExpbmRhIERlTWljaGllbCAtIEphdmEgUGVyc2lzdGVuY2UgMi4wLCBWZXJzaW9uIDIuMCAoT2N0b2JlciAxLCAyMDA5KQorICAgICAgU3BlY2lmaWNhdGlvbiBhdmFpbGFibGUgZnJvbSBodHRwOi8vamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTMxNworICAKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWworCisgICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIHBlcnNpc3RlbmNlIG9iamVjdC9yZWxhdGlvbmFsIAorICAgICAgIG1hcHBpbmcgZmlsZS4KKyAgICAgICBUaGUgZmlsZSBtYXkgYmUgbmFtZWQgIk1FVEEtSU5GL29ybS54bWwiIGluIHRoZSBwZXJzaXN0ZW5jZSAKKyAgICAgICBhcmNoaXZlIG9yIGl0IG1heSBiZSBuYW1lZCBzb21lIG90aGVyIG5hbWUgd2hpY2ggd291bGQgYmUgCisgICAgICAgdXNlZCB0byBsb2NhdGUgdGhlIGZpbGUgYXMgcmVzb3VyY2Ugb24gdGhlIGNsYXNzcGF0aC4KKworICAgICAgIE9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZXMgbXVzdCBpbmRpY2F0ZSB0aGUgb2JqZWN0L3JlbGF0aW9uYWwKKyAgICAgICBtYXBwaW5nIGZpbGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSBwZXJzaXN0ZW5jZSBuYW1lc3BhY2U6CisKKyAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZQorCisgICAgICAgYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKKyAgICAgICB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgorCisgICAgICA8ZW50aXR5LW1hcHBpbmdzIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iCisgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtCisgICAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtL29ybV8yXzAueHNkIgorICAgICAgICB2ZXJzaW9uPSIyLjAiPgorICAgICAgICAgIC4uLgorICAgICAgPC9lbnRpdHktbWFwcGluZ3M+CisKKworICAgICBdXT48L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIi8+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbWFwcGluZ3MiPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOmFubm90YXRpb24+CisgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIG1hcHBpbmcKKyAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgorCisgICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKKyAgICAgICAgZm9yIHRoZSBlbnRpcmUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIGlmIHRoaXMgZWxlbWVudAorICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KKyAgICAgICAgCisgICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKKyAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgorICAgICAgICB0aGUgc2FtZSBmaWxlIGluIHdoaWNoIHRoZXkgb2NjdXIuCisKKyAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKKyAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKKyAgICAgICAgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUKKyAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCisgICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbyAKKyAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSwgbmFtZWQtbmF0aXZlLXF1ZXJ5LCBvcgorICAgICAgICByZXN1bHQtc2V0LW1hcHBpbmcgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZyAKKyAgICAgICAgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LgorCisgICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCisgICAgICAgIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIG1hbmFnZWQgcGVyc2lzdGVudCBjbGFzcy4gVGhlIG1hcHBpbmcKKyAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKKyAgICAgICAgYmUgcGFydGlhbC4KKworICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgCisgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCisgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyIgdHlwZT0ib3JtOm1hcHBlZC1zdXBlcmNsYXNzIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eSIgdHlwZT0ib3JtOmVudGl0eSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRhYmxlIiB0eXBlPSJvcm06ZW1iZWRkYWJsZSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uVHlwZSIgCisgICAgICAgICAgICAgICAgICAgICBmaXhlZD0iMi4wIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCisgICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKKworICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQsCisgICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQgCisgICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgCisgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBUaGVzZSBkZWZhdWx0cyBhcmUgYXBwbGllZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhcyBhIHdob2xlIAorICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTCAKKyAgICAgICAgZWxlbWVudCBzZXR0aW5ncy4gCisgICAgICAgIAorICAgICAgICBzY2hlbWEgLSBVc2VkIGFzIHRoZSBzY2hlbWEgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsIGpvaW4KKyAgICAgICAgICAgIHRhYmxlcywgY29sbGVjdGlvbiB0YWJsZXMsIHNlcXVlbmNlIGdlbmVyYXRvcnMsIGFuZCB0YWJsZSAKKyAgICAgICAgICAgIGdlbmVyYXRvcnMgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAorICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywgam9pbgorICAgICAgICAgICAgdGFibGVzLCBjb2xsZWN0aW9uIHRhYmxlcywgc2VxdWVuY2UgZ2VuZXJhdG9ycywgYW5kIHRhYmxlIAorICAgICAgICAgICAgZ2VuZXJhdG9ycyB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0CisgICAgICAgIGRlbGltaXRlZC1pZGVudGlmaWVycyAtIFVzZWQgdG8gdHJlYXQgZGF0YWJhc2UgaWRlbnRpZmllcnMgYXMKKyAgICAgICAgICAgIGRlbGltaXRlZCBpZGVudGlmaWVycy4KKyAgICAgICAgYWNjZXNzIC0gVXNlZCBhcyB0aGUgYWNjZXNzIHR5cGUgZm9yIGFsbCBtYW5hZ2VkIGNsYXNzZXMgaW4KKyAgICAgICAgICAgIHRoZSBwZXJzaXN0ZW5jZSB1bml0CisgICAgICAgIGNhc2NhZGUtcGVyc2lzdCAtIEFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zCisgICAgICAgICAgICBpbiBhbGwgZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQKKyAgICAgICAgZW50aXR5LWxpc3RlbmVycyAtIExpc3Qgb2YgZGVmYXVsdCBlbnRpdHkgbGlzdGVuZXJzIHRvIGJlIGludm9rZWQgCisgICAgICAgICAgICBvbiBlYWNoIGVudGl0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxpbWl0ZWQtaWRlbnRpZmllcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhbiBlbnRpdHkuIElzIGFsbG93ZWQgdG8gYmUKKyAgICAgICAgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGFubm90YXRpb25zLgorICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIAorICAgICAgICBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIG9uIHRoZSBlbnRpdHkgY2xhc3MgKGFuZCBpdHMgZmllbGRzCisgICAgICAgIG9yIHByb3BlcnRpZXMpIGFyZSB0byBiZSBwcm9jZXNzZWQuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiAKKyAgICAgICAgdGhlIGRlZmF1bHRpbmcgcnVsZXMgZm9yIHRoZSBlbnRpdHkgYW5kIGl0cyBzdWJlbGVtZW50cyB3aWxsIAorICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgorCisgICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ib3JtOnRhYmxlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWNvbmRhcnktdGFibGUiIHR5cGU9Im9ybTpzZWNvbmRhcnktdGFibGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9Im9ybTppbmhlcml0YW5jZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdmFsdWUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCisgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIAorICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FjaGVhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJhY2Nlc3MtdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIFRoaXMgZWxlbWVudCBkZXRlcm1pbmVzIGhvdyB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgYWNjZXNzZXMgdGhlCisgICAgICAgIHN0YXRlIG9mIGFuIGVudGl0eSBvciBlbWJlZGRlZCBvYmplY3QuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9QRVJUWSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHR7fTsKKyAgICAgICAgICBKb2luVGFibGUgam9pblRhYmxlKCkgZGVmYXVsdCBASm9pblRhYmxlOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXR0cmlidXRlT3ZlcnJpZGUgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgQ29sdW1uIGNvbHVtbigpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGVzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgVGhpcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBlbnRpdHkgZmllbGQgb3IgcHJvcGVydHkgbWFwcGluZ3MuCisgICAgICAgIEl0IG1heSBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgdG8gaW5jbHVkZSBvbmx5IGEgc3Vic2V0IG9mIHRoZQorICAgICAgICBmaWVsZHMgb3IgcHJvcGVydGllcy4gSWYgbWV0YWRhdGEtY29tcGxldGUgZm9yIHRoZSBlbnRpdHkgaXMgdHJ1ZQorICAgICAgICB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBkZWZhdWx0ZWQgYWNjb3JkaW5nCisgICAgICAgIHRvIHRoZSBkZWZhdWx0IHJ1bGVzLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJvcm06aWQiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQtaWQiIHR5cGU9Im9ybTplbWJlZGRlZC1pZCIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYyIgdHlwZT0ib3JtOmJhc2ljIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvbiIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW9uZSIgdHlwZT0ib3JtOm9uZS10by1vbmUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tbWFueSIgdHlwZT0ib3JtOm1hbnktdG8tbWFueSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsZW1lbnQtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmVsZW1lbnQtY29sbGVjdGlvbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljIHsKKyAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOworICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9iIiB0eXBlPSJvcm06bG9iIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FzY2FkZS10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgcHVibGljIGVudW0gQ2FzY2FkZVR5cGUgeyBBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0gsIERFVEFDSH07CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtYWxsIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWRldGFjaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgeworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOworICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKKyAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgorICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQorICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uLXJlc3VsdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uUmVzdWx0IHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDb2x1bW4geworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiRFRZUEUiOworICAgICAgICAgIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKCkgZGVmYXVsdCBTVFJJTkc7CisgICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOworICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDMxOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgcHVibGljIGVudW0gRGlzY3JpbWluYXRvclR5cGUgeyBTVFJJTkcsIENIQVIsIElOVEVHRVIgfTsKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBUiIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdFUiIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgeworICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCis8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnQtY29sbGVjdGlvbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVsZW1lbnRDb2xsZWN0aW9uIHsKKyAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIKKyAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIgorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIgorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bG9iIgorICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKKyAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgorICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTpjb2xsZWN0aW9uLXRhYmxlIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Cis8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgZW1iZWRkYWJsZSBvYmplY3RzLiBJcyAKKyAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKKyAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAorICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCisgICAgICAgIGluIHRoZSBjbGFzcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgCisgICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkYWJsZSB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmVtYmVkZGFibGUtYXR0cmlidXRlcyIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZS1hdHRyaWJ1dGVzIj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW9uZSIgdHlwZT0ib3JtOm1hbnktdG8tb25lIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tbWFueSIgdHlwZT0ib3JtOm9uZS10by1tYW55IgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tb25lIiB0eXBlPSJvcm06b25lLXRvLW9uZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIiB0eXBlPSJvcm06ZWxlbWVudC1jb2xsZWN0aW9uIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IiB0eXBlPSJvcm06dHJhbnNpZW50IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWQge30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIAorICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZC1pZCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkSWQge30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXIiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBEZWZpbmVzIGFuIGVudGl0eSBsaXN0ZW5lciB0byBiZSBpbnZva2VkIGF0IGxpZmVjeWNsZSBldmVudHMKKyAgICAgICAgZm9yIHRoZSBlbnRpdGllcyB0aGF0IGxpc3QgdGhpcyBsaXN0ZW5lci4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5TGlzdGVuZXJzIHsKKyAgICAgICAgICBDbGFzc1tdIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVyIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVyIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktcmVzdWx0Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlSZXN1bHQgeworICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzKCk7CisgICAgICAgICAgRmllbGRSZXN1bHRbXSBmaWVsZHMoKSBkZWZhdWx0IHt9OworICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1yZXN1bHQiIHR5cGU9Im9ybTpmaWVsZC1yZXN1bHQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJlbnRpdHktY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBFbnVtVHlwZSB7CisgICAgICAgICAgT1JESU5BTCwKKyAgICAgICAgICBTVFJJTkcKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1JESU5BTCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bWVyYXRlZCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudW1lcmF0ZWQgeworICAgICAgICAgIEVudW1UeXBlIHZhbHVlKCkgZGVmYXVsdCBPUkRJTkFMOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTplbnVtLXR5cGUiLz4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmZXRjaC10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgcHVibGljIGVudW0gRmV0Y2hUeXBlIHsgTEFaWSwgRUFHRVIgfTsKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBWlkiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBR0VSIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXJlc3VsdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmllbGRSZXN1bHQgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgU3RyaW5nIGNvbHVtbigpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBHZW5lcmF0ZWRWYWx1ZSB7CisgICAgICAgICAgR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IEFVVE87CisgICAgICAgICAgU3RyaW5nIGdlbmVyYXRvcigpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06Z2VuZXJhdGlvbi10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJhdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImdlbmVyYXRpb24tdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIHB1YmxpYyBlbnVtIEdlbmVyYXRpb25UeXBlIHsgVEFCTEUsIFNFUVVFTkNFLCBJREVOVElUWSwgQVVUTyB9OworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEUiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFUVVFTkNFIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJREVOVElUWSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQtY2xhc3MiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZENsYXNzIHsKKyAgICAgICAgICBDbGFzcyB2YWx1ZSgpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7CisgICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUKKyAgICAgICAgICB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1N9OworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLWNvbHVtbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5Db2x1bW4geworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKKyAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi10YWJsZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5UYWJsZSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEpvaW5Db2x1bW5bXSBpbnZlcnNlSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OworICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludmVyc2Utam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9iIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTG9iIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jay1tb2RlLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBMb2NrTW9kZVR5cGUgeyBSRUFELCBXUklURSwgT1BUSU1JU1RJQywgT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQsIFBFU1NJTUlTVElDX1JFQUQsIFBFU1NJTUlTVElDX1dSSVRFLCBQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQsIE5PTkV9OworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1JJVEUiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUMiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19SRUFEIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19XUklURSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKKyAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisgICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7CisgICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnRlbXBvcmFsIgorICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIgorICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWNvbHVtbiIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIgorICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgeworICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7CisgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Y2hvaWNlPiAgICAgICAKKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8L3hzZDpjaG9pY2U+ICAgICAgIAorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY2xhc3MiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDbGFzcyB7CisgICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY29sdW1uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Q29sdW1uIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOworICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOworICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7CisgICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KKyAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlKb2luQ29sdW1uIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7CisgICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7CisgICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcyAKKyAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKKyAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAorICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCisgICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IAorICAgICAgICBhcHBsaWVkLgorCisgICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKKyAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307CisgICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisgICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOyAvL25hbWVkIFNxbFJlc3VsdFNldE1hcHBpbmcKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKKyAgICAgICAgICBMb2NrTW9kZVR5cGUgbG9ja01vZGUoKSBkZWZhdWx0IE5PTkU7CisgICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2stbW9kZSIgdHlwZT0ib3JtOmxvY2stbW9kZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKzwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKzx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb01hbnkgeworICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKKyAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIgorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCisgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9ycGhhbi1yZW1vdmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvT25lIHsKKyAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisgICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOworICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBib29sZWFuIG9ycGhhblJlbW92YWwoKSBkZWZhdWx0IGZhbHNlOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcy1pZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3JkZXItYnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcmRlckJ5IHsKKyAgICAgICAgICBTdHJpbmcgdmFsdWUoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3JkZXItY29sdW1uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJDb2x1bW4geworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7CisgICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1sb2FkIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0TG9hZCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcGVyc2lzdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFBlcnNpc3Qge30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXJlbW92ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFJlbW92ZSB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtdXBkYXRlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0VXBkYXRlIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXBlcnNpc3QiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVBlcnNpc3Qge30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcmVtb3ZlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVSZW1vdmUge30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtdXBkYXRlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVVcGRhdGUge30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpIAorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBRdWVyeUhpbnQgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgU3RyaW5nIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGUgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307CisgICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgIH0KKworICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKKyAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMTsKKyAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3FsUmVzdWx0U2V0TWFwcGluZyB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBFbnRpdHlSZXN1bHRbXSBlbnRpdGllcygpIGRlZmF1bHQge307CisgICAgICAgICAgQ29sdW1uUmVzdWx0W10gY29sdW1ucygpIGRlZmF1bHQge307CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1yZXN1bHQiIHR5cGU9Im9ybTplbnRpdHktcmVzdWx0IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLXJlc3VsdCIgdHlwZT0ib3JtOmNvbHVtbi1yZXN1bHQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKKyAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOworICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7CisgICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgeworICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKKyAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCisgICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAorICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFURSIvPgorICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+CisgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgorICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNpZW50Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNpZW50IHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIAorICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NjaGVtYS9wZXJzaXN0ZW5jZV8yXzAueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc2NoZW1hL3BlcnNpc3RlbmNlXzJfMC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2OTBhYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NjaGVtYS9wZXJzaXN0ZW5jZV8yXzAueHNkCkBAIC0wLDAgKzEsMzU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBwZXJzaXN0ZW5jZS54bWwgc2NoZW1hIC0tPgorPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSIgCisgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgIHhtbG5zOnBlcnNpc3RlbmNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSIKKyAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAorICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAorICB2ZXJzaW9uPSIyLjAiPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICBAKCMpcGVyc2lzdGVuY2VfMl8wLnhzZCAgMS4wICBPY3RvYmVyIDEgMjAwOQorICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgU3VuIE1pY3Jvc3lzdGVtcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgIAorICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgCisgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIAorICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gCisgIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IAorICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgIAorICBDb250cmlidXRvcnM6CisgICAgICBMaW5kYSBEZU1pY2hpZWwgLSBKYXZhIFBlcnNpc3RlbmNlIDIuMCwgVmVyc2lvbiAyLjAgKE9jdG9iZXIgMSwgMjAwOSkKKyAgICAgIFNwZWNpZmljYXRpb24gYXZhaWxhYmxlIGZyb20gaHR0cDovL2pjcC5vcmcvZW4vanNyL2RldGFpbD9pZD0zMTcKKyAKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgICA8eHNkOmFubm90YXRpb24+CisgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKKworICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgcGVyc2lzdGVuY2UgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICBUaGUgZmlsZSBtdXN0IGJlIG5hbWVkICJNRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiIGluIHRoZSAKKyAgICAgcGVyc2lzdGVuY2UgYXJjaGl2ZS4KKworICAgICBQZXJzaXN0ZW5jZSBjb25maWd1cmF0aW9uIGZpbGVzIG11c3QgaW5kaWNhdGUKKyAgICAgdGhlIHBlcnNpc3RlbmNlIHNjaGVtYSBieSB1c2luZyB0aGUgcGVyc2lzdGVuY2UgbmFtZXNwYWNlOgorCisgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlCisKKyAgICAgYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKKyAgICAgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKKworICAgICAgPHBlcnNpc3RlbmNlIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSIKKyAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZQorICAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlXzJfMC54c2QiCisgICAgICAgIHZlcnNpb249IjIuMCI+CisgICAgICAgICAgLi4uCisgICAgICA8L3BlcnNpc3RlbmNlPgorCisgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlIj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDpzZXF1ZW5jZT4KKworICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBvZiBhIHBlcnNpc3RlbmNlIHVuaXQuCisKKyAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorCisgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uIG9mIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KKworICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvdmlkZXIiIHR5cGU9InhzZDpzdHJpbmciIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXIgY2xhc3MgdGhhdCBzdXBwbGllcyBFbnRpdHlNYW5hZ2VycyBmb3IgdGhpcyAKKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdC4KKworICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianRhLWRhdGEtc291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgICAgICAgICAgICAgIFRoZSBjb250YWluZXItc3BlY2lmaWMgbmFtZSBvZiB0aGUgSlRBIGRhdGFzb3VyY2UgdG8gdXNlLgorCisgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub24tanRhLWRhdGEtc291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgICAgICAgICAgICAgIFRoZSBjb250YWluZXItc3BlY2lmaWMgbmFtZSBvZiBhIG5vbi1KVEEgZGF0YXNvdXJjZSB0byB1c2UuCisKKyAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBpbmctZmlsZSIgdHlwZT0ieHNkOnN0cmluZyIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBjb250YWluaW5nIG1hcHBpbmcgaW5mb3JtYXRpb24uIExvYWRlZCBhcyBhIHJlc291cmNlIAorICAgICAgICAgICAgICAgICAgICBieSB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIuCisKKyAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imphci1maWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAgICAgICAgICAgICBKYXIgZmlsZSB0aGF0IGlzIHRvIGJlIHNjYW5uZWQgZm9yIG1hbmFnZWQgY2xhc3Nlcy4gCisKKyAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAgICAgICAgICAgICBNYW5hZ2VkIGNsYXNzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZAorICAgICAgICAgICAgICAgICAgICB0byBzY2FuIGZvciBhbm5vdGF0aW9ucy4gIEl0IHNob3VsZCBiZSBhbm5vdGF0ZWQgCisgICAgICAgICAgICAgICAgICAgIHdpdGggZWl0aGVyIEBFbnRpdHksIEBFbWJlZGRhYmxlIG9yIEBNYXBwZWRTdXBlcmNsYXNzLgorCisgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXVubGlzdGVkLWNsYXNzZXMiIHR5cGU9InhzZDpib29sZWFuIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgICAgICAgICAgICAgIFdoZW4gc2V0IHRvIHRydWUgdGhlbiBvbmx5IGxpc3RlZCBjbGFzc2VzIGFuZCBqYXJzIHdpbGwgCisgICAgICAgICAgICAgICAgICAgIGJlIHNjYW5uZWQgZm9yIHBlcnNpc3RlbnQgY2xhc3Nlcywgb3RoZXJ3aXNlIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgZW5jbG9zaW5nIGphciBvciBkaXJlY3Rvcnkgd2lsbCBhbHNvIGJlIHNjYW5uZWQuIAorICAgICAgICAgICAgICAgICAgICBOb3QgYXBwbGljYWJsZSB0byBKYXZhIFNFIHBlcnNpc3RlbmNlIHVuaXRzLgorCisgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzaGFyZWQtY2FjaGUtbW9kZSIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJwZXJzaXN0ZW5jZTpwZXJzaXN0ZW5jZS11bml0LWNhY2hpbmctdHlwZSIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIHdoZXRoZXIgY2FjaGluZyBpcyBlbmFibGVkIGZvciB0aGUgCisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgaWYgY2FjaGluZyBpcyBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHByb3ZpZGVyLiBXaGVuIHNldCB0byBBTEwsIGFsbCBlbnRpdGllcyAKKyAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBjYWNoZWQuIFdoZW4gc2V0IHRvIE5PTkUsIG5vIGVudGl0aWVzIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgYmUgY2FjaGVkLiBXaGVuIHNldCB0byBFTkFCTEVfU0VMRUNUSVZFLCBvbmx5IGVudGl0aWVzCisgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBhcyBjYWNoZWFibGUgd2lsbCBiZSBjYWNoZWQuIFdoZW4gc2V0IHRvCisgICAgICAgICAgICAgICAgICAgIERJU0FCTEVfU0VMRUNUSVZFLCBlbnRpdGllcyBzcGVjaWZpZWQgYXMgbm90IGNhY2hlYWJsZQorICAgICAgICAgICAgICAgICAgICB3aWxsIG5vdCBiZSBjYWNoZWQuIFdoZW4gbm90IHNwZWNpZmllZCBvciB3aGVuIHNldCB0bworICAgICAgICAgICAgICAgICAgICBVTlNQRUNJRklFRCwgcHJvdmlkZXIgZGVmYXVsdHMgbWF5IGFwcGx5LgorCisgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0aW9uLW1vZGUiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icGVyc2lzdGVuY2U6cGVyc2lzdGVuY2UtdW5pdC12YWxpZGF0aW9uLW1vZGUtdHlwZSIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAgICAgICAgICAgICBUaGUgdmFsaWRhdGlvbiBtb2RlIHRvIGJlIHVzZWQgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCisgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisKKworICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgICAgICAgICAgICAgIEEgbGlzdCBvZiBzdGFuZGFyZCBhbmQgdmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMgCisgICAgICAgICAgICAgICAgICAgIGFuZCBoaW50cy4KKworICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICBBIG5hbWUtdmFsdWUgcGFpci4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+CisgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisKKyAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgICAgICAgICAgIE5hbWUgdXNlZCBpbiBjb2RlIHRvIHJlZmVyZW5jZSB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCisKKyAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgPC94c2Q6YXR0cmlidXRlPgorCisgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zYWN0aW9uLXR5cGUiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icGVyc2lzdGVuY2U6cGVyc2lzdGVuY2UtdW5pdC10cmFuc2FjdGlvbi10eXBlIj4KKyAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAgICAgICAgICAgVHlwZSBvZiB0cmFuc2FjdGlvbnMgdXNlZCBieSBFbnRpdHlNYW5hZ2VycyBmcm9tIHRoaXMgCisgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0LgorCisgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KKworICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJwZXJzaXN0ZW5jZTp2ZXJzaW9uVHlwZSIgCisgICAgICAgICAgICAgICAgICAgICBmaXhlZD0iMi4wIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXRyYW5zYWN0aW9uLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUge0pUQSwgUkVTT1VSQ0VfTE9DQUx9OworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlRBIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRVNPVVJDRV9MT0NBTCIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtY2FjaGluZy10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgcHVibGljIGVudW0gU2hhcmVkQ2FjaGVNb2RlIHsgQUxMLCBOT05FLCBFTkFCTEVfU0VMRUNUSVZFLCBESVNBQkxFX1NFTEVDVElWRSwgVU5TUEVDSUZJRUR9OworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFTkFCTEVfU0VMRUNUSVZFIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESVNBQkxFX1NFTEVDVElWRSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU5TUEVDSUZJRUQiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXZhbGlkYXRpb24tbW9kZS10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgcHVibGljIGVudW0gVmFsaWRhdGlvbk1vZGUgeyBBVVRPLCBDQUxMQkFDSywgTk9ORX07CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUxMQkFDSyIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCis8L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9FbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDFmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CisKKy8qKgorICogUHJvdmlkZSBhIHBsdWdnYWJsZSB3YXkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW5kIGhvdyB0aGUgZW50aXR5IGdlbmVyYXRvcgorICogcHJpbnRzIHRoZSBuYW1lcyBvZiB2YXJpb3VzIGRhdGFiYXNlIG9iamVjdHMuCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEVudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIHsKKworCS8qKgorCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGVudGl0eSBhbmQgdGhlIHRhYmxlIHRvIHdoaWNoIGl0IGlzIG1hcHBlZCwKKwkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgZW50aXR5J3MKKwkgKiBUYWJsZSBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuIFJldHVybiBudWxsIGlmIHRoZSBlbnRpdHkKKwkgKiBtYXBzIHRvIHRoZSB0YWJsZSBieSBkZWZhdWx0LgorCSAqLworCVN0cmluZyBidWlsZFRhYmxlQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGVudGl0eU5hbWUsIFRhYmxlIHRhYmxlKTsKKworCS8qKgorCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSAoZmllbGQgb3IgcHJvcGVydHkpIGFuZCB0aGUgY29sdW1uCisJICogdG8gd2hpY2ggaXQgaXMgbWFwcGVkLAorCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUncworCSAqIENvbHVtbiBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuIFJldHVybiBudWxsIGlmIHRoZSBhdHRyaWJ1dGUKKwkgKiBtYXBzIHRvIHRoZSBjb2x1bW4gYnkgZGVmYXVsdC4KKwkgKi8KKwlTdHJpbmcgYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgQ29sdW1uIGNvbHVtbik7CisKKwkvKioKKwkgKiBHaXZlbiB0aGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KSBhbmQgdGhlCisJICogbWFueS10by1vbmUgb3IgbWFueS10by1tYW55IGZvcmVpZ24ga2V5IHRvIHdoaWNoIGl0IGlzIG1hcHBlZCwKKwkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlJ3MKKwkgKiBKb2luQ29sdW1uIGFubm90YXRpb24ncyAnbmFtZScgZWxlbWVudC4gUmV0dXJuIG51bGwgaWYgdGhlIGF0dHJpYnV0ZQorCSAqIG1hcHMgdG8gdGhlIGpvaW4gY29sdW1uIGJ5IGRlZmF1bHQuCisJICogVGhlIHNwZWNpZmllZCBmb3JlaWduIGtleSBjb25zaXN0cyBvZiBhIHNpbmdsZSBjb2x1bW4gcGFpciB3aG9zZQorCSAqIHJlZmVyZW5jZWQgY29sdW1uIGlzIHRoZSBzaW5nbGUtY29sdW1uIHByaW1hcnkga2V5IG9mIHRoZSBmb3JlaWduCisJICoga2V5J3MgcmVmZXJlbmNlZCB0YWJsZS4KKwkgKi8KKwlTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSk7CisKKwkvKioKKwkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciBhIEpvaW5Db2x1bW4KKwkgKiBhbm5vdGF0aW9uJ3MgJ25hbWUnIG9yICdyZWZlcmVuY2VkQ29sdW1uTmFtZScgZWxlbWVudC4KKwkgKiBUaGlzIGlzIGNhbGxlZCBmb3IgbWFueS10by1vbmUgYW5kIG1hbnktdG8tbWFueSBtYXBwaW5ncyB3aGVuCisJICogdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gbmFtZSBhbmQvb3IgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBhcmUvaXMKKwkgKiBub3QgYXBwbGljYWJsZS4KKwkgKiBAc2VlICNidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcsIEZvcmVpZ25LZXkpCisJICovCisJU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKENvbHVtbiBjb2x1bW4pOworCisJLyoqCisJICogQnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgYSBKb2luVGFibGUKKwkgKiBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuCisJICogVGhpcyBpcyBjYWxsZWQgZm9yIG1hbnktdG8tbWFueSBtYXBwaW5ncyB3aGVuIHRoZSBkZWZhdWx0CisJICogam9pbiB0YWJsZSBuYW1lIGlzIG5vdCBhcHBsaWNhYmxlLgorCSAqLworCVN0cmluZyBidWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKFRhYmxlIHRhYmxlKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0dlbmVyaWNKcGFNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0dlbmVyaWNKcGFNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMWZiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvR2VuZXJpY0pwYU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMTYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5Bc3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcHRDb3JlTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuU2ltcGxlSnBhUHJvamVjdENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CaXRUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVDb21tYW5kRXhlY3V0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RhdGVmdWxDb21tYW5kRXhlY3V0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklQcm9qZWN0RmFjZXRBY3Rpb25FdmVudDsKKworLyoqCisgKiBUaGUgSlBBIG1vZGVsIG1haW50YWlucyBhIGxpc3Qgb2YgYWxsIEpQQSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLgorICogSXQga2VlcHMgdGhlIGxpc3QgKGFuZCB0aGUgc3RhdGUgb2YgdGhlIEpQQSBwcm9qZWN0cyB0aGVtc2VsdmVzKQorICogc3luY2hyb25pemVkIHdpdGggdGhlIHdvcmtzcGFjZSBieSBsaXN0ZW5pbmcgZm9yIHZhcmlvdXMKKyAqIGNoYW5nZXM6PHVsPgorICogPGxpPlJlc291cmNlCisgKiA8bGk+SmF2YQorICogPGxpPkZhY2V0ZWQgUHJvamVjdAorICogPC91bD4KKyAqIFdlIHVzZSBhbiBFY2xpcHNlIHtAbGluayBJTG9jayBsb2NrfSB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIEpQQQorICogcHJvamVjdHMgd2hlbiBkZWFsaW5nIHdpdGggdGhlc2UgZXZlbnRzLiBJbiBhbiBlZmZvcnQgdG8gcmVkdWNlIGRlYWRsb2NrcywKKyAqIHRoZSBzaW1wbGUgUmVzb3VyY2UgYW5kIEphdmEgY2hhbmdlIGV2ZW50cyBhcmUgZGlzcGF0Y2hlZCB0byBhIGJhY2tncm91bmQKKyAqIHRocmVhZCwgYWxsb3dpbmcgdXMgdG8gaGFuZGxlIHRoZSBldmVudHMgb3V0c2lkZSBvZiB0aGUgd29ya3NwYWNlIGxvY2sgaGVsZAorICogZHVyaW5nIHJlc291cmNlIGFuZCBKYXZhIGNoYW5nZSBub3RpZmljYXRpb25zLgorICogPHA+CisgKiBFdmVudHMgdGhhdCB0cmlnZ2VyIGVpdGhlciB0aGUgYWRkaW5nIG9yIHJlbW92aW5nIG9mIGEgSlBBIHByb2plY3QgKGUuZy4KKyAqIHtAbGluayBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlI1BPU1RfSU5TVEFMTH0pIGFyZSBoYW5kbGVkICJzeW5jaHJvbm91c2x5IgorICogYnkgYWxsb3dpbmcgdGhlIGJhY2tncm91bmQgdGhyZWFkIHRvIGhhbmRsZSBhbnkgb3V0c3RhbmRpbmcgZXZlbnRzIGJlZm9yZQorICogdXBkYXRpbmcgdGhlIGxpc3Qgb2YgSlBBIHByb2plY3RzIGFuZCByZXR1cm5pbmcgZXhlY3V0aW9uIHRvIHRoZSBldmVudAorICogc291cmNlLgorICogPHA+CisgKiBWYXJpb3VzIHRoaW5ncyB0aGF0IGNhdXNlIHVzIHRvIGFkZCBvciByZW1vdmUgYSBKUEEgcHJvamVjdDo8dWw+CisgKiA8bGk+U3RhcnR1cCBvZiB0aGUgRGFsaSBwbHVnLWluIHdpbGwgdHJpZ2dlciBhbGwgdGhlIHByZS1leGlzdGluZyBKUEEKKyAqICAgICBwcm9qZWN0cyB0byBiZSBhZGRlZAorICogCisgKiA8bGk+UHJvamVjdCBjcmVhdGVkIGFuZCBmYWNldCBpbnN0YWxsZWQ8cD4KKyAqICAgICB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZSNQT1NUX0lOU1RBTEx9CisgKiA8bGk+UHJvamVjdCBmYWNldCB1bmluc3RhbGxlZDxwPgorICogICAgIHtAbGluayBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlI1BSRV9VTklOU1RBTEx9CisgKiAKKyAqIDxsaT5Qcm9qZWN0IG9wZW5lZDxwPgorICogICAgIHtAbGluayBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlI1BST0pFQ1RfTU9ESUZJRUR9CisgKiA8bGk+UHJvamVjdCBjbG9zZWQ8cD4KKyAqICAgICB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZSNQUk9KRUNUX01PRElGSUVEfQorICogCisgKiA8bGk+UHJlLWV4aXN0aW5nIHByb2plY3QgaW1wb3J0ZWQgZnJvbSBkaXJlY3Rvcnkgb3IgYXJjaGl2ZSAoY3JlYXRlZCBhbmQgb3BlbmVkKTxwPgorICogICAgIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0KKyAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlI1BST0pFQ1R9CisgKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZURlbHRhI0FEREVEfQorICogICAgIC0+IHtAbGluayBJUmVzb3VyY2VEZWx0YSNPUEVOfQorICogPGxpPlByb2plY3QgcmVuYW1lZDxwPgorICogICAgIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0KKyAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlI1BST0pFQ1R9CisgKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZURlbHRhI0FEREVEfQorICogICAgIC0+IHtAbGluayBJUmVzb3VyY2VEZWx0YSNNT1ZFRF9GUk9NfQorICogPGxpPlByb2plY3QgZGVsZXRlZDxwPgorICogICAgIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQUkVfREVMRVRFfQorICogCisgKiA8bGk+UHJvamVjdCBmYWNldCBpbnN0YWxsZWQgYnkgZWRpdGluZyB0aGUgZmFjZXRzIHNldHRpbmdzIGZpbGUgZGlyZWN0bHk8cD4KKyAqICAgICB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZSNQUk9KRUNUX01PRElGSUVEfQorICogPGxpPlByb2plY3QgZmFjZXQgdW5pbnN0YWxsZWQgYnkgZWRpdGluZyB0aGUgZmFjZXRzIHNldHRpbmdzIGZpbGUgZGlyZWN0bHk8cD4KKyAqICAgICB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZSNQUk9KRUNUX01PRElGSUVEfQorICogPC91bD4KKyAqLworY2xhc3MgR2VuZXJpY0pwYU1vZGVsCisJZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCisJaW1wbGVtZW50cyBKcGFNb2RlbAoreworCS8qKgorCSAqIEFsbCB0aGUgSlBBIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UuCisJICovCisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SnBhUHJvamVjdD4ganBhUHJvamVjdHMgPSBuZXcgVmVjdG9yPEpwYVByb2plY3Q+KCk7CisKKwkvKioKKwkgKiBTeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIEpQQSBwcm9qZWN0cy4KKwkgKi8KKwkvKiBwcml2YXRlICovIGZpbmFsIElMb2NrIGxvY2sgPSB0aGlzLmdldEpvYk1hbmFnZXIoKS5uZXdMb2NrKCk7CisKKwkvKioKKwkgKiBEZXRlcm1pbmUgaG93IFJlc291cmNlIGFuZCBKYXZhIGNoYW5nZSBldmVudHMgYXJlCisJICogaGFuZGxlZCAoaS5lLiBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5KS4KKwkgKi8KKwlwcml2YXRlIHZvbGF0aWxlIFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yIGV2ZW50SGFuZGxlciA9IG5ldyBBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IoSnB0Q29yZU1lc3NhZ2VzLkRBTElfRVZFTlRfSEFORExFUl9USFJFQURfTkFNRSk7CisKKwkvKioKKwkgKiBMaXN0ZW4gZm9yPHVsPgorCSAqIDxsaT5jaGFuZ2VzIHRvIHByb2plY3RzIGFuZCBmaWxlcworCSAqIDxsaT5kZWxldGVkIHByb2plY3RzCisJICogPGxpPmNsZWFuIGJ1aWxkcworCSAqIDwvdWw+CisJICovCisJcHJpdmF0ZSBmaW5hbCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKKworCS8qKgorCSAqIFRoZSB0eXBlcyBvZiByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzIHRoYXQgaW50ZXJlc3QKKwkgKiB7QGxpbmsgI3Jlc291cmNlQ2hhbmdlTGlzdGVuZXJ9LgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9DSEFOR0VfRVZFTlRfVFlQRVMgPQorCQkJSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSB8CisJCQlJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSB8CisJCQlJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEOworCisJLyoqCisJICogTGlzdGVuIGZvciB0aGUgSlBBIGZhY2V0IGJlaW5nIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSBhICJmYWNldGVkIiBwcm9qZWN0LgorCSAqLworCXByaXZhdGUgZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgZmFjZXRlZFByb2plY3RMaXN0ZW5lciA9IG5ldyBGYWNldGVkUHJvamVjdExpc3RlbmVyKCk7CisKKwkvKioKKwkgKiBMaXN0ZW4gZm9yIEphdmEgY2hhbmdlcyAodW5sZXNzIHRoZSBEYWxpIFVJIGlzIGFjdGl2ZSkuCisJICogQHNlZSAjamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcklzQWN0aXZlCisJICovCisJcHJpdmF0ZSBmaW5hbCBKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyIGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIgPSBuZXcgSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcigpOworCisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKKworCS8qKgorCSAqIGludGVybmFsIC0gY2FsbGVkIGJ5IHRoZSBEYWxpIHBsdWctaW4KKwkgKi8KKwlHZW5lcmljSnBhTW9kZWwoKSB7CisJCXN1cGVyKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHBsdWctaW4gY29udHJvbGxlZCBsaWZlLWN5Y2xlICoqKioqKioqKioKKworCS8qKgorCSAqIGludGVybmFsIC0gY2FsbGVkIGJ5IHRoZSBEYWxpIHBsdWctaW4KKwkgKi8KKwl2b2lkIHN0YXJ0KCkgeworCQl0cnkgeworCQkJdGhpcy5sb2NrLmFjcXVpcmUoKTsKKwkJCXRoaXMuc3RhcnRfKCk7CisJCX0gZmluYWxseSB7CisJCQl0aGlzLmxvY2sucmVsZWFzZSgpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHN0YXJ0XygpIHsKKwkJZGVidWcoIioqKiBKUEEgbW9kZWwgU1RBUlQgKioqIik7IC8vJE5PTi1OTFMtMSQKKwkJdHJ5IHsKKwkJCXRoaXMuYnVpbGRKcGFQcm9qZWN0cygpOworCQkJdGhpcy5ldmVudEhhbmRsZXIuc3RhcnQoKTsKKwkJCXRoaXMuZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIFJFU09VUkNFX0NIQU5HRV9FVkVOVF9UWVBFUyk7CisJCQlGYWNldGVkUHJvamVjdEZyYW1ld29yay5hZGRMaXN0ZW5lcih0aGlzLmZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUudmFsdWVzKCkpOworCQkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzLmphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIpOworCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7CisJCQlKcHRDb3JlUGx1Z2luLmxvZyhleCk7CisJCQl0aGlzLnN0b3BfKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBzaWRlLWVmZmVjdDogJ2pwYVByb2plY3RzJyBwb3B1bGF0ZWQKKwkgKi8KKwlwcml2YXRlIHZvaWQgYnVpbGRKcGFQcm9qZWN0cygpIHsKKwkJdHJ5IHsKKwkJCXRoaXMuYnVpbGRKcGFQcm9qZWN0c18oKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgeworCQkJLy8gaWYgd2UgaGF2ZSBhIHByb2JsZW0sIGxlYXZlIHRoZSBjdXJyZW50bHkgYnVpbHQgSlBBIHByb2plY3RzIGluCisJCQkvLyBwbGFjZSBhbmQga2VlcCBleGVjdXRpbmcgKHNob3VsZCBiZSBPSy4uLikKKwkJCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBidWlsZEpwYVByb2plY3RzXygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdGhpcy5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuYWNjZXB0KG5ldyBSZXNvdXJjZVByb3h5VmlzaXRvcigpLCBJUmVzb3VyY2UuTk9ORSk7CisJfQorCisJLyoqCisJICogaW50ZXJuYWwgLSBjYWxsZWQgYnkgdGhlIERhbGkgcGx1Zy1pbgorCSAqLworCXZvaWQgc3RvcCgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJdGhpcy5sb2NrLmFjcXVpcmUoKTsKKwkJCXRoaXMuc3RvcF8oKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRoaXMubG9jay5yZWxlYXNlKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgc3RvcF8oKSB7CisJCWRlYnVnKCIqKiogSlBBIG1vZGVsIFNUT1AgKioqIik7IC8vJE5PTi1OTFMtMSQKKwkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzLmphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIpOworCQlGYWNldGVkUHJvamVjdEZyYW1ld29yay5yZW1vdmVMaXN0ZW5lcih0aGlzLmZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIpOworCQl0aGlzLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5yZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5ldmVudEhhbmRsZXIuc3RvcCgpOworCQl0aGlzLmNsZWFySnBhUHJvamVjdHMoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2xlYXJKcGFQcm9qZWN0cygpIHsKKwkJLy8gY2xvbmUgdG8gcHJldmVudCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBleGNlcHRpb25zCisJCWZvciAoSnBhUHJvamVjdCBqcGFQcm9qZWN0IDogdGhpcy5nZXRKcGFQcm9qZWN0c18oKSkgeworCQkJdGhpcy5yZW1vdmVKcGFQcm9qZWN0KGpwYVByb2plY3QpOworCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIEpwYU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBJdGVyYWJsZTxKcGFQcm9qZWN0PiBnZXRKcGFQcm9qZWN0cygpIHsKKwkJdHJ5IHsKKwkJCXRoaXMubG9jay5hY3F1aXJlKCk7CisJCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0c18oKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRoaXMubG9jay5yZWxlYXNlKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIEl0ZXJhYmxlPEpwYVByb2plY3Q+IGdldEpwYVByb2plY3RzXygpIHsKKwkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKcGFQcm9qZWN0Pih0aGlzLmpwYVByb2plY3RzKTsKKwl9CisKKwlwdWJsaWMgaW50IGdldEpwYVByb2plY3RzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuanBhUHJvamVjdHMuc2l6ZSgpOworCX0KKworCXB1YmxpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgeworCQl0cnkgeworCQkJdGhpcy5sb2NrLmFjcXVpcmUoKTsKKwkJCXJldHVybiB0aGlzLmdldEpwYVByb2plY3RfKHByb2plY3QpOworCQl9IGZpbmFsbHkgeworCQkJdGhpcy5sb2NrLnJlbGVhc2UoKTsKKwkJfQorCX0KKworCXByaXZhdGUgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0XyhJUHJvamVjdCBwcm9qZWN0KSB7CisJCWZvciAoSnBhUHJvamVjdCBqcGFQcm9qZWN0IDogdGhpcy5qcGFQcm9qZWN0cykgeworCQkJaWYgKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkgeworCQkJCXJldHVybiBqcGFQcm9qZWN0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBKcGFGaWxlIGdldEpwYUZpbGUoSUZpbGUgZmlsZSkgeworCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSB0aGlzLmdldEpwYVByb2plY3QoZmlsZS5nZXRQcm9qZWN0KCkpOworCQlyZXR1cm4gKGpwYVByb2plY3QgPT0gbnVsbCkgPyBudWxsIDoganBhUHJvamVjdC5nZXRKcGFGaWxlKGZpbGUpOworCX0KKworCXB1YmxpYyB2b2lkIHJlYnVpbGRKcGFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKKwkJdHJ5IHsKKwkJCXRoaXMubG9jay5hY3F1aXJlKCk7CisJCQl0aGlzLnJlYnVpbGRKcGFQcm9qZWN0Xyhwcm9qZWN0KTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRoaXMubG9jay5yZWxlYXNlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBhc3N1bXB0aW9uOiB0aGUgSlBBIHByb2plY3QgaG9sZGVyIGV4aXN0cworCSAqLworCXByaXZhdGUgdm9pZCByZWJ1aWxkSnBhUHJvamVjdF8oSVByb2plY3QgcHJvamVjdCkgeworCQl0aGlzLnJlbW92ZUpwYVByb2plY3QodGhpcy5nZXRKcGFQcm9qZWN0Xyhwcm9qZWN0KSk7CisJCXRoaXMuYWRkSnBhUHJvamVjdChwcm9qZWN0KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBqYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUoKSB7CisJCXJldHVybiB0aGlzLmphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIuaXNBY3RpdmUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUoYm9vbGVhbiBqYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUpIHsKKwkJdGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyLnNldEFjdGl2ZShqYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUpOworCX0KKworCXB1YmxpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKKwkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKKwl9CisKKwlwdWJsaWMgSUpvYk1hbmFnZXIgZ2V0Sm9iTWFuYWdlcigpIHsKKwkJcmV0dXJuIEpvYi5nZXRKb2JNYW5hZ2VyKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIGFkZGluZy9yZW1vdmluZyBKUEEgcHJvamVjdHMgKioqKioqKioqKgorCisJLyogcHJpdmF0ZSAqLyB2b2lkIGFkZEpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgeworCQl0aGlzLmFkZEpwYVByb2plY3QodGhpcy5idWlsZEpwYVByb2plY3QocHJvamVjdCkpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRKcGFQcm9qZWN0KEpwYVByb2plY3QganBhUHJvamVjdCkgeworCQkvLyBmaWd1cmUgb3V0IGV4YWN0bHkgd2hlbiBKUEEgcHJvamVjdHMgYXJlIGFkZGVkCisJCWR1bXBTdGFja1RyYWNlKCJhZGQ6ICIsIGpwYVByb2plY3QpOyAvLyROT04tTkxTLTEkCisJCS8vIHRoZSBKUEEgcHJvamVjdCB3aWxsIGJlIG51bGwgaWYgd2UgaGF2ZSBhbnkgcHJvYmxlbXMgYnVpbGRpbmcgaXQuLi4KKwkJLy8gKGUuZy4gaWYgd2UgaGF2ZSBwcm9ibGVtcyBnZXR0aW5nIHRoZSBKUEEgcGxhdGZvcm0pCisJCWlmIChqcGFQcm9qZWN0ICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihqcGFQcm9qZWN0LCB0aGlzLmpwYVByb2plY3RzLCBKUEFfUFJPSkVDVFNfQ09MTEVDVElPTik7CisJCX0KKwl9CisKKwkvKioKKwkgKiByZXR1cm4gbnVsbCBpZiB3ZSBoYXZlIGFueSBwcm9ibGVtcy4uLgorCSAqLworCXByaXZhdGUgSnBhUHJvamVjdCBidWlsZEpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgeworCQlyZXR1cm4gdGhpcy5idWlsZEpwYVByb2plY3QodGhpcy5idWlsZEpwYVByb2plY3RDb25maWcocHJvamVjdCkpOworCX0KKworCS8qKgorCSAqIHJldHVybiBudWxsIGlmIHdlIGhhdmUgYW55IHByb2JsZW1zLi4uCisJICovCisJcHJpdmF0ZSBKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChKcGFQcm9qZWN0LkNvbmZpZyBjb25maWcpIHsKKwkJSnBhUGxhdGZvcm0ganBhUGxhdGZvcm0gPSBjb25maWcuZ2V0SnBhUGxhdGZvcm0oKTsKKwkJaWYgKGpwYVBsYXRmb3JtID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUpwYVByb2plY3QganBhUHJvamVjdCA9IHRoaXMuYnVpbGRKcGFQcm9qZWN0KGpwYVBsYXRmb3JtLCBjb25maWcpOworCQlpZiAoanBhUHJvamVjdCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlqcGFQcm9qZWN0LnNldFVwZGF0ZXIobmV3IEFzeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyKGpwYVByb2plY3QpKTsKKwkJcmV0dXJuIGpwYVByb2plY3Q7CisJfQorCisJLyoqCisJICogcmV0dXJuIG51bGwgaWYgd2UgaGF2ZSBhbnkgcHJvYmxlbXMuLi4KKwkgKi8KKwlwcml2YXRlIEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KEpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtLCBKcGFQcm9qZWN0LkNvbmZpZyBjb25maWcpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBqcGFQbGF0Zm9ybS5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKcGFQcm9qZWN0KGNvbmZpZyk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwcml2YXRlIEpwYVByb2plY3QuQ29uZmlnIGJ1aWxkSnBhUHJvamVjdENvbmZpZyhJUHJvamVjdCBwcm9qZWN0KSB7CisJCVNpbXBsZUpwYVByb2plY3RDb25maWcgY29uZmlnID0gbmV3IFNpbXBsZUpwYVByb2plY3RDb25maWcoKTsKKwkJY29uZmlnLnNldFByb2plY3QocHJvamVjdCk7CisJCWNvbmZpZy5zZXRKcGFQbGF0Zm9ybShKcHRDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtKHByb2plY3QpKTsKKwkJY29uZmlnLnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShKcHRDb3JlUGx1Z2luLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZShwcm9qZWN0KSk7CisJCWNvbmZpZy5zZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZyhKcHRDb3JlUGx1Z2luLmdldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKHByb2plY3QpKTsKKwkJY29uZmlnLnNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoSnB0Q29yZVBsdWdpbi5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKHByb2plY3QpKTsKKwkJY29uZmlnLnNldERpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyhKcHRDb3JlUGx1Z2luLmRpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlcyhwcm9qZWN0KSk7CisJCWNvbmZpZy5zZXRNZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKEpwdENvcmVQbHVnaW4uZ2V0TWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZShwcm9qZWN0KSk7CisJCXJldHVybiBjb25maWc7CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlbW92ZUpwYVByb2plY3QoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7CisJCS8vIGZpZ3VyZSBvdXQgZXhhY3RseSB3aGVuIEpQQSBwcm9qZWN0cyBhcmUgcmVtb3ZlZAorCQlkdW1wU3RhY2tUcmFjZSgicmVtb3ZlOiAiLCBqcGFQcm9qZWN0KTsgLy8kTk9OLU5MUy0xJAorCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihqcGFQcm9qZWN0LCB0aGlzLmpwYVByb2plY3RzLCBKUEFfUFJPSkVDVFNfQ09MTEVDVElPTik7CisJCWpwYVByb2plY3QuZGlzcG9zZSgpOworCX0KKworCisJLy8gKioqKioqKioqKiBQcm9qZWN0IFBPU1RfQ0hBTkdFICoqKioqKioqKioKKworCS8qIHByaXZhdGUgKi8gdm9pZCBwcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCQl0aGlzLmV2ZW50SGFuZGxlci5leGVjdXRlKHRoaXMuYnVpbGRQcm9qZWN0Q2hhbmdlZENvbW1hbmQoZGVsdGEpKTsKKwl9CisKKwlwcml2YXRlIENvbW1hbmQgYnVpbGRQcm9qZWN0Q2hhbmdlZENvbW1hbmQoZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJcmV0dXJuIG5ldyBFdmVudEhhbmRsZXJDb21tYW5kKCkgeworCQkJQE92ZXJyaWRlCisJCQl2b2lkIGV4ZWN1dGVfKCkgeworCQkJCUdlbmVyaWNKcGFNb2RlbC50aGlzLnByb2plY3RDaGFuZ2VkXyhkZWx0YSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJQcm9qZWN0IFBPU1RfQ0hBTkdFIENvbW1hbmQiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJfQorCisJLyoqCisJICogRm9yd2FyZCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGRlbHRhIHRvIGFsbCBvdXIgSlBBIHByb2plY3RzOworCSAqIHRoZXkgd2lsbCBlYWNoIGRldGVybWluZSB3aGV0aGVyIHRoZSBldmVudCBpcyBzaWduaWZpY2FudC4KKwkgKi8KKwkvKiBwcml2YXRlICovIHZvaWQgcHJvamVjdENoYW5nZWRfKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CisJCWZvciAoSnBhUHJvamVjdCBqcGFQcm9qZWN0IDogdGhpcy5qcGFQcm9qZWN0cykgeworCQkJanBhUHJvamVjdC5wcm9qZWN0Q2hhbmdlZChkZWx0YSk7CisJCX0KKwl9CisKKworCS8vICoqKioqKioqKiogUHJvamVjdCBQT1NUX0JVSUxEIChDTEVBTl9CVUlMRCkgKioqKioqKioqKgorCisJLyogcHJpdmF0ZSAqLyB2b2lkIHByb2plY3RQb3N0Q2xlYW5CdWlsZChJUHJvamVjdCBwcm9qZWN0KSB7CisJCXRoaXMuZXhlY3V0ZUFmdGVyRXZlbnRzSGFuZGxlZCh0aGlzLmJ1aWxkUHJvamVjdFBvc3RDbGVhbkJ1aWxkQ29tbWFuZChwcm9qZWN0KSk7CisJfQorCisJcHJpdmF0ZSBDb21tYW5kIGJ1aWxkUHJvamVjdFBvc3RDbGVhbkJ1aWxkQ29tbWFuZChmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7CisJCXJldHVybiBuZXcgRXZlbnRIYW5kbGVyQ29tbWFuZCgpIHsKKwkJCUBPdmVycmlkZQorCQkJdm9pZCBleGVjdXRlXygpIHsKKwkJCQlHZW5lcmljSnBhTW9kZWwudGhpcy5wcm9qZWN0UG9zdENsZWFuQnVpbGRfKHByb2plY3QpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiUHJvamVjdCBQT1NUX0JVSUxEIChDTEVBTl9CVUlMRCkgQ29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfTsKKwl9CisKKwkvKiBwcml2YXRlICovIHZvaWQgcHJvamVjdFBvc3RDbGVhbkJ1aWxkXyhJUHJvamVjdCBwcm9qZWN0KSB7CisJCUpwYVByb2plY3QganBhUHJvamVjdCA9IHRoaXMuZ2V0SnBhUHJvamVjdF8ocHJvamVjdCk7CisJCWlmIChqcGFQcm9qZWN0ICE9IG51bGwpIHsKKwkJCXRoaXMucmVtb3ZlSnBhUHJvamVjdChqcGFQcm9qZWN0KTsKKwkJCXRoaXMuYWRkSnBhUHJvamVjdChwcm9qZWN0KTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBQcm9qZWN0IFBSRV9ERUxFVEUgKioqKioqKioqKgorCisJLyogcHJpdmF0ZSAqLyB2b2lkIHByb2plY3RQcmVEZWxldGUoSVByb2plY3QgcHJvamVjdCkgeworCQl0aGlzLmV4ZWN1dGVBZnRlckV2ZW50c0hhbmRsZWQodGhpcy5idWlsZFByb2plY3RQcmVEZWxldGVDb21tYW5kKHByb2plY3QpKTsKKwl9CisKKwlwcml2YXRlIENvbW1hbmQgYnVpbGRQcm9qZWN0UHJlRGVsZXRlQ29tbWFuZChmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7CisJCXJldHVybiBuZXcgRXZlbnRIYW5kbGVyQ29tbWFuZCgpIHsKKwkJCUBPdmVycmlkZQorCQkJdm9pZCBleGVjdXRlXygpIHsKKwkJCQlHZW5lcmljSnBhTW9kZWwudGhpcy5wcm9qZWN0UHJlRGVsZXRlXyhwcm9qZWN0KTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gIlByb2plY3QgUFJFX0RFTEVURSBDb21tYW5kIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIEEgcHJvamVjdCBpcyBiZWluZyBkZWxldGVkLiBSZW1vdmUgaXRzIGNvcnJlc3BvbmRpbmcKKwkgKiBKUEEgcHJvamVjdCBpZiBhcHByb3ByaWF0ZS4KKwkgKi8KKwkvKiBwcml2YXRlICovIHZvaWQgcHJvamVjdFByZURlbGV0ZV8oSVByb2plY3QgcHJvamVjdCkgeworCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSB0aGlzLmdldEpwYVByb2plY3QocHJvamVjdCk7CisJCWlmIChqcGFQcm9qZWN0ICE9IG51bGwpIHsKKwkJCXRoaXMucmVtb3ZlSnBhUHJvamVjdChqcGFQcm9qZWN0KTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBSZXNvdXJjZSBhbmQvb3IgRmFjZXQgZXZlbnRzICoqKioqKioqKioKKworCS8qIHByaXZhdGUgKi8gdm9pZCBjaGVja0ZvckpwYUZhY2V0VHJhbnNpdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7CisJCXRoaXMuZXhlY3V0ZUFmdGVyRXZlbnRzSGFuZGxlZCh0aGlzLmJ1aWxkQ2hlY2tGb3JKcGFGYWNldFRyYW5zaXRpb25Db21tYW5kKHByb2plY3QpKTsKKwl9CisKKwlwcml2YXRlIENvbW1hbmQgYnVpbGRDaGVja0ZvckpwYUZhY2V0VHJhbnNpdGlvbkNvbW1hbmQoZmluYWwgSVByb2plY3QgcHJvamVjdCkgeworCQlyZXR1cm4gbmV3IEV2ZW50SGFuZGxlckNvbW1hbmQoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXZvaWQgZXhlY3V0ZV8oKSB7CisJCQkJR2VuZXJpY0pwYU1vZGVsLnRoaXMuY2hlY2tGb3JKcGFGYWNldFRyYW5zaXRpb25fKHByb2plY3QpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiSlBBIEZhY2V0IFRyYW5zaXRpb24gQ29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBDaGVjayB3aGV0aGVyIHRoZSBKUEEgZmFjZXQgaGFzIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZC4KKwkgKi8KKwkvKiBwcml2YXRlICovIHZvaWQgY2hlY2tGb3JKcGFGYWNldFRyYW5zaXRpb25fKElQcm9qZWN0IHByb2plY3QpIHsKKwkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gdGhpcy5nZXRKcGFQcm9qZWN0Xyhwcm9qZWN0KTsKKworCQlpZiAoSnB0Q29yZVBsdWdpbi5wcm9qZWN0SGFzSnBhRmFjZXQocHJvamVjdCkpIHsKKwkJCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsgIC8vIEpQQSBmYWNldCBhZGRlZAorCQkJCXRoaXMuYWRkSnBhUHJvamVjdChwcm9qZWN0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChqcGFQcm9qZWN0ICE9IG51bGwpIHsgIC8vIEpQQSBmYWNldCByZW1vdmVkCisJCQkJdGhpcy5yZW1vdmVKcGFQcm9qZWN0KGpwYVByb2plY3QpOworCQkJfQorCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIEZhY2V0ZWRQcm9qZWN0IFBPU1RfSU5TVEFMTCAqKioqKioqKioqCisKKwkvKiBwcml2YXRlICovIHZvaWQganBhRmFjZXRlZFByb2plY3RQb3N0SW5zdGFsbChJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJdGhpcy5leGVjdXRlQWZ0ZXJFdmVudHNIYW5kbGVkKHRoaXMuYnVpbGRKcGFGYWNldGVkUHJvamVjdFBvc3RJbnN0YWxsQ29tbWFuZChldmVudCkpOworCX0KKworCXByaXZhdGUgQ29tbWFuZCBidWlsZEpwYUZhY2V0ZWRQcm9qZWN0UG9zdEluc3RhbGxDb21tYW5kKGZpbmFsIElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCBldmVudCkgeworCQlyZXR1cm4gbmV3IEV2ZW50SGFuZGxlckNvbW1hbmQoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXZvaWQgZXhlY3V0ZV8oKSB7CisJCQkJR2VuZXJpY0pwYU1vZGVsLnRoaXMuanBhRmFjZXRlZFByb2plY3RQb3N0SW5zdGFsbF8oZXZlbnQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiRmFjZXRlZCBQcm9qZWN0IFBPU1RfSU5TVEFMTCBDb21tYW5kIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KKworCS8qIHByaXZhdGUgKi8gdm9pZCBqcGFGYWNldGVkUHJvamVjdFBvc3RJbnN0YWxsXyhJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJSVByb2plY3QgcHJvamVjdCA9IGV2ZW50LmdldFByb2plY3QoKS5nZXRQcm9qZWN0KCk7CisJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gKElEYXRhTW9kZWwpIGV2ZW50LmdldEFjdGlvbkNvbmZpZygpOworCisJCS8vIGFzc3VtZSg/KSB0aGlzIGlzIHRoZSBmaXJzdCBldmVudCB0byBpbmRpY2F0ZSB3ZSBuZWVkIHRvIGFkZCB0aGUgSlBBIHByb2plY3QgdG8gdGhlIEpQQSBtb2RlbAorCQl0aGlzLmFkZEpwYVByb2plY3QocHJvamVjdCk7CisKKwkJYm9vbGVhbiBidWlsZE9ybVhtbCA9IGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCk7CisJCXRoaXMuY3JlYXRlUHJvamVjdFhtbChwcm9qZWN0LCBidWlsZE9ybVhtbCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3RYbWwoSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBidWlsZE9ybVhtbCkgeworCQl0aGlzLmNyZWF0ZVBlcnNpc3RlbmNlWG1sKHByb2plY3QpOworCisJCWlmIChidWlsZE9ybVhtbCkgeworCQkJdGhpcy5jcmVhdGVPcm1YbWwocHJvamVjdCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlUGVyc2lzdGVuY2VYbWwoSVByb2plY3QgcHJvamVjdCkgeworCQlJRGF0YU1vZGVsIGNvbmZpZyA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBQZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOworCQljb25maWcuc2V0UHJvcGVydHkoSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKKwkJLy8gZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBvdGhlciBwcm9wZXJ0aWVzIHNob3VsZCBzdWZmaWNlCisJCXRyeSB7CisJCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7CisJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZU9ybVhtbChJUHJvamVjdCBwcm9qZWN0KSB7CisJCUlEYXRhTW9kZWwgY29uZmlnID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOworCQljb25maWcuc2V0UHJvcGVydHkoSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKKwkJLy8gZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBvdGhlciBwcm9wZXJ0aWVzIHNob3VsZCBzdWZmaWNlCisJCXRyeSB7CisJCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7CisJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIEZhY2V0ZWRQcm9qZWN0IFBSRV9VTklOU1RBTEwgKioqKioqKioqKgorCisJLyogcHJpdmF0ZSAqLyB2b2lkIGpwYUZhY2V0ZWRQcm9qZWN0UHJlVW5pbnN0YWxsKElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCBldmVudCkgeworCQlJUHJvamVjdCBwcm9qZWN0ID0gZXZlbnQuZ2V0UHJvamVjdCgpLmdldFByb2plY3QoKTsKKwkJdGhpcy5leGVjdXRlQWZ0ZXJFdmVudHNIYW5kbGVkKHRoaXMuYnVpbGRKcGFGYWNldGVkUHJvamVjdFByZVVuaW5zdGFsbENvbW1hbmQocHJvamVjdCkpOworCX0KKworCXByaXZhdGUgQ29tbWFuZCBidWlsZEpwYUZhY2V0ZWRQcm9qZWN0UHJlVW5pbnN0YWxsQ29tbWFuZChmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7CisJCXJldHVybiBuZXcgRXZlbnRIYW5kbGVyQ29tbWFuZCgpIHsKKwkJCUBPdmVycmlkZQorCQkJdm9pZCBleGVjdXRlXygpIHsKKwkJCQlHZW5lcmljSnBhTW9kZWwudGhpcy5qcGFGYWNldGVkUHJvamVjdFByZVVuaW5zdGFsbF8ocHJvamVjdCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJGYWNldGVkIFByb2plY3QgUFJFX1VOSU5TVEFMTCBDb21tYW5kIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KKworCS8qIHByaXZhdGUgKi8gdm9pZCBqcGFGYWNldGVkUHJvamVjdFByZVVuaW5zdGFsbF8oSVByb2plY3QgcHJvamVjdCkgeworCQkvLyBhc3N1bWUoPykgdGhpcyBpcyB0aGUgZmlyc3QgZXZlbnQgdG8gaW5kaWNhdGUgd2UgbmVlZCB0byByZW1vdmUgdGhlIEpQQSBwcm9qZWN0IHRvIHRoZSBKUEEgbW9kZWwKKwkJdGhpcy5yZW1vdmVKcGFQcm9qZWN0KHRoaXMuZ2V0SnBhUHJvamVjdF8ocHJvamVjdCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhIGVsZW1lbnQgY2hhbmdlZCAqKioqKioqKioqCisKKwkvKiBwcml2YXRlICovIHZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJdGhpcy5ldmVudEhhbmRsZXIuZXhlY3V0ZSh0aGlzLmJ1aWxkSmF2YUVsZW1lbnRDaGFuZ2VkQ29tbWFuZChldmVudCkpOworCX0KKworCXByaXZhdGUgQ29tbWFuZCBidWlsZEphdmFFbGVtZW50Q2hhbmdlZENvbW1hbmQoZmluYWwgRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgeworCQlyZXR1cm4gbmV3IEV2ZW50SGFuZGxlckNvbW1hbmQoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXZvaWQgZXhlY3V0ZV8oKSB7CisJCQkJR2VuZXJpY0pwYU1vZGVsLnRoaXMuamF2YUVsZW1lbnRDaGFuZ2VkXyhldmVudCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJKYXZhIGVsZW1lbnQgY2hhbmdlZCBDb21tYW5kIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIEZvcndhcmQgdGhlIEphdmEgZWxlbWVudCBjaGFuZ2VkIGV2ZW50IHRvIGFsbCB0aGUgSlBBIHByb2plY3RzCisJICogYmVjYXVzZSB0aGUgZXZlbnQgY291bGQgYWZmZWN0IG11bHRpcGxlIHByb2plY3RzLgorCSAqLworCS8qIHByaXZhdGUgKi8gdm9pZCBqYXZhRWxlbWVudENoYW5nZWRfKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJZm9yIChKcGFQcm9qZWN0IGpwYVByb2plY3QgOiB0aGlzLmpwYVByb2plY3RzKSB7CisJCQlqcGFQcm9qZWN0LmphdmFFbGVtZW50Q2hhbmdlZChldmVudCk7CisJCX0KKwl9CisKKworCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLmpwYVByb2plY3RzKTsKKwl9CisKKworCS8vICoqKioqKioqKiogZXZlbnQgaGFuZGxlciAqKioqKioqKioqCisKKwkvKioKKwkgKiBJZiB0aGUgZXZlbnQgaGFuZGxlciBpcyBleGVjdXRpbmcgYXN5bmNocm9ub3VzbHk6PGJyPgorCSAqIEFsbG93IGFsbCB0aGUgY29tbWFuZHMgY3VycmVudGx5IG9uIHRoZSBjb21tYW5kIGV4ZWN1dG9yJ3MgcXVldWUgdG8gZXhlY3V0ZS4KKwkgKiBPbmNlIHRoZXkgaGF2ZSBleGVjdXRlZCwgc3VzcGVuZCB0aGUgY29tbWFuZCBleGVjdXRvciBhbmQgcHJvY2VzcyB0aGUKKwkgKiBzcGVjaWZpZWQgY29tbWFuZCAob24gPGVtPnRoaXM8L2VtPiB0aHJlYWQsIDxlbT5ub3Q8L2VtPiB0aGUgY29tbWFuZAorCSAqIGV4ZWN1dG9yIHRocmVhZCkuIE9uY2UgdGhlIHNwZWNpZmllZCBjb21tYW5kIGlzIGZpbmlzaGVkLCBhbGxvdyB0aGUKKwkgKiBjb21tYW5kIGV4ZWN1dG9yIHRvIHJlc3VtZSBwcm9jZXNzaW5nIGl0cyBjb21tYW5kIHF1ZXVlLgorCSAqIDxwPgorCSAqIElmIHRoZSBldmVudCBoYW5kbGVyIGlzIGV4ZWN1dGluZyBzeW5jaHJvbm91c2x5Ojxicj4KKwkgKiBBbGwgdGhlIGV2ZW50cyBoYXZlIGFscmVhZHkgYmVlbiBoYW5kbGVkIHN5bmNocm9ub3VzbHksIHNvIHdlIHNpbXBseQorCSAqIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIFtzb3J0YV0gZGlyZWN0bHkuCisJICovCisJcHJpdmF0ZSB2b2lkIGV4ZWN1dGVBZnRlckV2ZW50c0hhbmRsZWQoQ29tbWFuZCBjb21tYW5kKSB7CisJCVN5bmNocm9uaXplZEJvb2xlYW4gZmxhZyA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlKTsKKwkJdGhpcy5ldmVudEhhbmRsZXIuZXhlY3V0ZShuZXcgUGF1c2VDb21tYW5kKFRocmVhZC5jdXJyZW50VGhyZWFkKCksIGZsYWcpKTsKKwkJdHJ5IHsKKwkJCWZsYWcud2FpdFVudGlsVHJ1ZSgpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworCQkJLy8gaWdub3JlIC0gbm90IHN1cmUgd2h5IHRoaXMgdGhyZWFkIHdvdWxkIGJlIGludGVycnVwdGVkCisJCX0KKwkJdHJ5IHsKKwkJCWNvbW1hbmQuZXhlY3V0ZSgpOworCQl9IGZpbmFsbHkgeworCQkJZmxhZy5zZXRGYWxzZSgpOworCQl9CisJfQorCisJLyoqCisJICogSWYgdGhpcyAicGF1c2UiIGNvbW1hbmQgaXMgZXhlY3V0aW5nIChhc3luY2hyb25vdXNseSkgb24gYSBkaWZmZXJlbnQKKwkgKiB0aHJlYWQgdGhhbiB0aGUgSlBBIG1vZGVsOjxvbD4KKwkgKiA8bGk+aXQgd2lsbCBzZXQgdGhlIGZsYWcgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIGFsbG93aW5nIHRoZSBKUEEgbW9kZWwgdG8KKwkgKiByZXN1bWUgZXhlY3V0aW5nIG9uIGl0cyBvd24gdGhyZWFkCisJICogPGxpPnRoZW4gaXQgd2lsbCBzdXNwZW5kIGl0cyBjb21tYW5kIGV4ZWN1dG9yIHVudGlsIHRoZSBKUEEgbW9kZWwgc2V0cworCSAqIHRoZSBmbGFnIGJhY2sgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgorCSAqIDwvb2w+CisJICogSWYgdGhpcyAicGF1c2UiIGNvbW1hbmQgaXMgZXhlY3V0aW5nIChzeW5jaHJvbm91c2x5KSBvbiB0aGUgc2FtZSB0aHJlYWQKKwkgKiBhcyB0aGUgSlBBIG1vZGVsLCBpdCB3aWxsIHNpbXBseSBzZXQgdGhlIGZsYWcgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gYW5kCisJICogcmV0dXJuLgorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIFBhdXNlQ29tbWFuZAorCQlpbXBsZW1lbnRzIENvbW1hbmQKKwl7CisJCXByaXZhdGUgZmluYWwgVGhyZWFkIHByb2R1Y2VyVGhyZWFkOworCQlwcml2YXRlIGZpbmFsIFN5bmNocm9uaXplZEJvb2xlYW4gZmxhZzsKKworCQlQYXVzZUNvbW1hbmQoVGhyZWFkIHByb2R1Y2VyVGhyZWFkLCBTeW5jaHJvbml6ZWRCb29sZWFuIGZsYWcpIHsKKwkJCXN1cGVyKCk7CisJCQl0aGlzLnByb2R1Y2VyVGhyZWFkID0gcHJvZHVjZXJUaHJlYWQ7CisJCQl0aGlzLmZsYWcgPSBmbGFnOworCQl9CisKKwkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKwkJCXRoaXMuZmxhZy5zZXRUcnVlKCk7CisJCQlpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSAhPSB0aGlzLnByb2R1Y2VyVGhyZWFkKSB7CisJCQkJdHJ5IHsKKwkJCQkJdGhpcy5mbGFnLndhaXRVbnRpbEZhbHNlKCk7CisJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKwkJCQkJLy8gaWdub3JlIC0gdGhlIGNvbW1hbmQgZXhlY3V0b3Igd2lsbCBjaGVjayBmb3IgaW50ZXJydXB0aW9ucworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCAodmlhIHJlZmxlY3Rpb24pIHdoZW4gdGhlIHRlc3QgcGx1Zy1pbiBpcyBsb2FkZWQuCisJICogQHNlZSBKcHRDb3JlVGVzdHNQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudHNTeW5jaHJvbm91c2x5KCkgeworCQl0cnkgeworCQkJdGhpcy5sb2NrLmFjcXVpcmUoKTsKKwkJCXRoaXMuaGFuZGxlRXZlbnRzU3luY2hyb25vdXNseV8oKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRoaXMubG9jay5yZWxlYXNlKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgaGFuZGxlRXZlbnRzU3luY2hyb25vdXNseV8oKSB7CisJCXRoaXMuZXZlbnRIYW5kbGVyLnN0b3AoKTsKKwkJdGhpcy5ldmVudEhhbmRsZXIgPSBuZXcgU2ltcGxlQ29tbWFuZEV4ZWN1dG9yKCk7CisJCXRoaXMuZXZlbnRIYW5kbGVyLnN0YXJ0KCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHJlc291cmNlIHByb3h5IHZpc2l0b3IgKioqKioqKioqKgorCisJLyoqCisJICogVmlzaXQgdGhlIHdvcmtzcGFjZSByZXNvdXJjZSB0cmVlLCBhZGRpbmcgYSBKUEEgcHJvamVjdCB0byB0aGUKKwkgKiBKUEEgbW9kZWwgZm9yIGVhY2ggb3BlbiBFY2xpcHNlIHByb2plY3QgdGhhdCBoYXMgYSBKUEEgZmFjZXQuCisJICovCisJcHJpdmF0ZSBjbGFzcyBSZXNvdXJjZVByb3h5VmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7CisJCVJlc291cmNlUHJveHlWaXNpdG9yKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHJlc291cmNlUHJveHkpIHsKKwkJCXN3aXRjaCAocmVzb3VyY2VQcm94eS5nZXRUeXBlKCkpIHsKKwkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKKwkJCQkJcmV0dXJuIHRydWU7ICAvLyBhbGwgcHJvamVjdHMgYXJlIGluIHRoZSAicm9vdCIKKwkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKKwkJCQkJdGhpcy5wcm9jZXNzUHJvamVjdChyZXNvdXJjZVByb3h5KTsKKwkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gbm8gbmVzdGVkIHByb2plY3RzCisJCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKKwkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gaWdub3JlCisJCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6CisJCQkJCXJldHVybiBmYWxzZTsgIC8vIGlnbm9yZQorCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKworCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Byb2plY3QoSVJlc291cmNlUHJveHkgcmVzb3VyY2VQcm94eSkgeworCQkJaWYgKHJlc291cmNlUHJveHkuaXNBY2Nlc3NpYmxlKCkpIHsgIC8vIHRoZSBwcm9qZWN0IGV4aXN0cyBhbmQgaXMgb3BlbgorCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlUHJveHkucmVxdWVzdFJlc291cmNlKCk7CisJCQkJaWYgKEpwdENvcmVQbHVnaW4ucHJvamVjdEhhc0pwYUZhY2V0KHByb2plY3QpKSB7CisJCQkJCUdlbmVyaWNKcGFNb2RlbC50aGlzLmFkZEpwYVByb2plY3QocHJvamVjdCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKKwkJfQorCisJfQorCisKKwkvLyAqKioqKioqKioqIGNvbW1hbmQgKioqKioqKioqKgorCisJLyoqCisJICogQ29tbWFuZCB0aGF0IGhvbGRzIHRoZSBKUEEgbW9kZWwgbG9jayB3aGlsZQorCSAqIGV4ZWN1dGluZy4KKwkgKi8KKwlwcml2YXRlIGFic3RyYWN0IGNsYXNzIEV2ZW50SGFuZGxlckNvbW1hbmQKKwkJaW1wbGVtZW50cyBDb21tYW5kCisJeworCQlFdmVudEhhbmRsZXJDb21tYW5kKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCisJCXB1YmxpYyBmaW5hbCB2b2lkIGV4ZWN1dGUoKSB7CisJCQl0cnkgeworCQkJCUdlbmVyaWNKcGFNb2RlbC50aGlzLmxvY2suYWNxdWlyZSgpOworCQkJCXRoaXMuZXhlY3V0ZV8oKTsKKwkJCX0gZmluYWxseSB7CisJCQkJR2VuZXJpY0pwYU1vZGVsLnRoaXMubG9jay5yZWxlYXNlKCk7CisJCQl9CisJCX0KKworCQlhYnN0cmFjdCB2b2lkIGV4ZWN1dGVfKCk7CisKKwl9CisKKworCS8vICoqKioqKioqKiogcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyICoqKioqKioqKioKKworCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKKworCQlSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCisJCS8qKgorCQkgKiBDaGVjayBmb3I6PHVsPgorCQkgKiA8bGk+cHJvamVjdCBjbG9zZS9kZWxldGUKKwkJICogPGxpPmZpbGUgYWRkL3JlbW92ZQorCQkgKiA8bGk+cHJvamVjdCBvcGVuL3JlbmFtZQorCQkgKiA8L3VsPgorCQkgKi8KKwkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQlzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgeworCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgOgorCQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2hhbmdlRXZlbnQoZXZlbnQpOworCQkJCQlicmVhazsKKworCQkJCS8vIHdvcmtzcGFjZSBvciBwcm9qZWN0IGV2ZW50cworCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX1JFRlJFU0ggOgorCQkJCQlicmVhazsgIC8vIGlnbm9yZQorCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0JVSUxEIDoKKwkJCQkJYnJlYWs7ICAvLyBpZ25vcmUKKwkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQgOgorCQkJCQl0aGlzLnByb2Nlc3NQb3N0QnVpbGRFdmVudChldmVudCk7CisJCQkJCWJyZWFrOworCisJCQkJLy8gcHJvamVjdC1vbmx5IGV2ZW50cworCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIDogIAorCQkJCQlicmVhazsgIC8vIGlnbm9yZQorCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSA6CisJCQkJCXRoaXMucHJvY2Vzc1ByZURlbGV0ZUV2ZW50KGV2ZW50KTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdCA6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIEEgcmVzb3VyY2UgaGFzIGNoYW5nZWQgc29tZWhvdy4KKwkJICogQ2hlY2sgZm9yIGZpbGVzIGJlaW5nIGFkZGVkIG9yIHJlbW92ZWQuCisJCSAqIChUaGUgSlBBIHByb2plY3Qgb25seSBoYW5kbGVzIGFkZGVkIGFuZCByZW1vdmVkIGZpbGVzIGhlcmUKKwkJICogRmlsZSBjaGFuZ2VzIGFyZSBoYW5kbGVkIHZpYSB0aGUgSmF2YSBFbGVtZW50IENoYW5nZWQgZXZlbnQuKQorCQkgKiBBbHNvIGNoZWNrIGZvciBvcGVuZWQgcHJvamVjdHMuCisJCSAqLworCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Bvc3RDaGFuZ2VFdmVudChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQkJZGVidWcoIlJlc291cmNlIFBPU1RfQ0hBTkdFIik7IC8vJE5PTi1OTFMtMSQKKwkJCXRoaXMucHJvY2Vzc1Bvc3RDaGFuZ2VEZWx0YShldmVudC5nZXREZWx0YSgpKTsKKwkJfQorCisJCXByaXZhdGUgdm9pZCBwcm9jZXNzUG9zdENoYW5nZURlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CisJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOworCQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKKwkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKKwkJCQkJdGhpcy5wcm9jZXNzUG9zdENoYW5nZURlbHRhQ2hpbGRyZW4oZGVsdGEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKKwkJCQkJdGhpcy5wcm9jZXNzUG9zdENoYW5nZVByb2plY3REZWx0YSgoSVByb2plY3QpIHJlc291cmNlLCBkZWx0YSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6CisJCQkJCWJyZWFrOyAgLy8gaWdub3JlCisJCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6CisJCQkJCWJyZWFrOyAgLy8gaWdub3JlCisJCQkJZGVmYXVsdCA6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb3N0Q2hhbmdlRGVsdGFDaGlsZHJlbihJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCQkJZm9yIChJUmVzb3VyY2VEZWx0YSBjaGlsZCA6IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkgeworCQkJCXRoaXMucHJvY2Vzc1Bvc3RDaGFuZ2VEZWx0YShjaGlsZCk7ICAvLyByZWN1cnNlCisJCQl9CisJCX0KKworCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Bvc3RDaGFuZ2VQcm9qZWN0RGVsdGEoSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJCUdlbmVyaWNKcGFNb2RlbC50aGlzLnByb2plY3RDaGFuZ2VkKGRlbHRhKTsKKwkJCXRoaXMuY2hlY2tGb3JPcGVuZWRQcm9qZWN0KHByb2plY3QsIGRlbHRhKTsKKwkJfQorCisKKwkJLyoqCisJCSAqIENyYXdsIHRoZSBzcGVjaWZpZWQgZGVsdGEsIGxvb2tpbmcgZm9yIHByb2plY3RzIGJlaW5nIG9wZW5lZC4KKwkJICogUHJvamVjdHMgYmVpbmcgZGVsZXRlZCBhcmUgaGFuZGxlZCBpbiB7QGxpbmsgSVJlc291cmNlQ2hhbmdlRXZlbnQjUFJFX0RFTEVURX0uCisJCSAqIFByb2plY3RzIGJlaW5nIGNsb3NlZCBhcmUgaGFuZGxlZCBpbiB7QGxpbmsgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZSNQUk9KRUNUX01PRElGSUVEfS4KKwkJICovCisJCXByaXZhdGUgdm9pZCBjaGVja0Zvck9wZW5lZFByb2plY3QoSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7CisJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6ICAvLyBhbGwgYnV0IHByb2plY3QgaW1wb3J0IGFuZCByZW5hbWUgaGFuZGxlZCB3aXRoIHRoZSBmYWNldCBQT1NUX0lOU1RBTEwgZXZlbnQKKwkJCQkJdGhpcy5jaGVja0RlbHRhRmxhZ3NGb3JSZW5hbWVkUHJvamVjdChwcm9qZWN0LCBkZWx0YSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6ICAvLyBhbHJlYWR5IGhhbmRsZWQgd2l0aCB0aGUgUFJFX0RFTEVURSBldmVudAorCQkJCQlicmVhazsKKwkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOiAKKwkJCQkJdGhpcy5jaGVja0RlbHRhRmxhZ3NGb3JPcGVuZWRQcm9qZWN0KHByb2plY3QsIGRlbHRhKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRF9QSEFOVE9NIDoKKwkJCQkJYnJlYWs7ICAvLyBpZ25vcmUKKwkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRURfUEhBTlRPTSA6CisJCQkJCWJyZWFrOyAgLy8gaWdub3JlCisJCQkJZGVmYXVsdCA6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIFdlIGRvbid0IGdldCBhbnkgZXZlbnRzIGZyb20gdGhlIEZhY2V0cyBGcmFtZXdvcmsgd2hlbiBhIHByZS1leGlzdGluZworCQkgKiBwcm9qZWN0IGlzIGltcG9ydGVkLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGZvciB0aGUgbmV3bHkgaW1wb3J0ZWQgcHJvamVjdCBoZXJlLgorCQkgKiA8cD4KKwkJICogVGhpcyBldmVudCBhbHNvIG9jY3VycyB3aGVuIGEgcHJvamVjdCBpcyBzaW1wbHkgb3BlbmVkLiBQcm9qZWN0IG9wZW5pbmcKKwkJICogYWxzbyB0cmlnZ2VycyBhIHtAbGluayBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlI1BST0pFQ1RfTU9ESUZJRUR9IGV2ZW50CisJCSAqIGFuZCB0aGF0IGlzIHdoZXJlIHdlIGFkZCB0aGUgSlBBIHByb2plY3QsIG5vdCBoZXJlLgorCQkgKiA8cD4KKwkJICogcHJlLWNvbmRpdGlvbjogZGVsdGEga2luZCBpcyBDSEFOR0VECisJCSAqLworCQlwcml2YXRlIHZvaWQgY2hlY2tEZWx0YUZsYWdzRm9yT3BlbmVkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCQkJaWYgKEJpdFRvb2xzLmZsYWdJc1NldChkZWx0YS5nZXRGbGFncygpLCBJUmVzb3VyY2VEZWx0YS5PUEVOKSAmJiBwcm9qZWN0LmlzT3BlbigpKSB7CisJCQkJZGVidWcoIlx0UHJvamVjdCBDSEFOR0VEIC0gT1BFTjogIiwgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJR2VuZXJpY0pwYU1vZGVsLnRoaXMuY2hlY2tGb3JKcGFGYWNldFRyYW5zaXRpb24ocHJvamVjdCk7CisJCQl9CisJCX0KKworCQkvKioKKwkJICogV2UgZG9uJ3QgZ2V0IGFueSBldmVudHMgZnJvbSB0aGUgRmFjZXRzIEZyYW1ld29yayB3aGVuIGEgcHJvamVjdCBpcyByZW5hbWVkLAorCQkgKiBzbyB3ZSBuZWVkIHRvIGNoZWNrIGZvciB0aGUgcmVuYW1lZCBwcm9qZWN0cyBoZXJlLgorCQkgKiA8cD4KKwkJICogcHJlLWNvbmRpdGlvbjogZGVsdGEga2luZCBpcyBBRERFRAorCQkgKi8KKwkJcHJpdmF0ZSB2b2lkIGNoZWNrRGVsdGFGbGFnc0ZvclJlbmFtZWRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CisJCQlpZiAoQml0VG9vbHMuZmxhZ0lzU2V0KGRlbHRhLmdldEZsYWdzKCksIElSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00pICYmIHByb2plY3QuaXNPcGVuKCkpIHsKKwkJCQlkZWJ1ZygiXHRQcm9qZWN0IEFEREVEIC0gTU9WRURfRlJPTTogIiwgZGVsdGEuZ2V0TW92ZWRGcm9tUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCUdlbmVyaWNKcGFNb2RlbC50aGlzLmNoZWNrRm9ySnBhRmFjZXRUcmFuc2l0aW9uKHByb2plY3QpOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIEEgcG9zdCBidWlsZCBldmVudCBoYXMgb2NjdXJyZWQuCisJCSAqIENoZWNrIGZvciB3aGV0aGVyIHRoZSBidWlsZCB3YXMgYSAiY2xlYW4iIGJ1aWxkIGFuZCB0cmlnZ2VyIHByb2plY3QgdXBkYXRlLgorCQkgKi8KKwkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb3N0QnVpbGRFdmVudChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQkJZGVidWcoIlJlc291cmNlIFBPU1RfQlVJTEQ6ICIsIGV2ZW50LmdldFJlc291cmNlKCkpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZXZlbnQuZ2V0QnVpbGRLaW5kKCkgPT0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCkgeworCQkJCXRoaXMucHJvY2Vzc1Bvc3RDbGVhbkJ1aWxkRGVsdGEoZXZlbnQuZ2V0RGVsdGEoKSk7CisJCQl9CisJCX0KKworCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Bvc3RDbGVhbkJ1aWxkRGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7CisJCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgeworCQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgorCQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2xlYW5CdWlsZERlbHRhQ2hpbGRyZW4oZGVsdGEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKKwkJCQkJdGhpcy5wcm9jZXNzUHJvamVjdFBvc3RDbGVhbkJ1aWxkKChJUHJvamVjdCkgcmVzb3VyY2UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgorCQkJCQlicmVhazsgIC8vIGlnbm9yZQorCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgorCQkJCQlicmVhazsgIC8vIGlnbm9yZQorCQkJCWRlZmF1bHQgOgorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXByaXZhdGUgdm9pZCBwcm9jZXNzUG9zdENsZWFuQnVpbGREZWx0YUNoaWxkcmVuKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CisJCQlmb3IgKElSZXNvdXJjZURlbHRhIGNoaWxkIDogZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKSB7CisJCQkJdGhpcy5wcm9jZXNzUG9zdENsZWFuQnVpbGREZWx0YShjaGlsZCk7ICAvLyByZWN1cnNlCisJCQl9CisJCX0KKworCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Byb2plY3RQb3N0Q2xlYW5CdWlsZChJUHJvamVjdCBwcm9qZWN0KSB7CisJCQlkZWJ1ZygiXHRQcm9qZWN0IENMRUFOOiAiLCBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCUdlbmVyaWNKcGFNb2RlbC50aGlzLnByb2plY3RQb3N0Q2xlYW5CdWlsZChwcm9qZWN0KTsKKwkJfQorCisJCS8qKgorCQkgKiBBIHByb2plY3QgaXMgYmVpbmcgZGVsZXRlZC4gUmVtb3ZlIGl0cyBjb3JyZXNwb25kaW5nCisJCSAqIEpQQSBwcm9qZWN0IGlmIGFwcHJvcHJpYXRlLgorCQkgKi8KKwkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQcmVEZWxldGVFdmVudChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZXZlbnQuZ2V0UmVzb3VyY2UoKTsKKwkJCWRlYnVnKCJSZXNvdXJjZSAoUHJvamVjdCkgUFJFX0RFTEVURTogIiwgcHJvamVjdCk7IC8vJE5PTi1OTFMtMSQKKwkJCUdlbmVyaWNKcGFNb2RlbC50aGlzLnByb2plY3RQcmVEZWxldGUocHJvamVjdCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOworCQl9CisKKwl9CisKKworCS8vICoqKioqKioqKiogZmFjZXRlZCBwcm9qZWN0IGxpc3RlbmVyICoqKioqKioqKioKKworCS8qKgorCSAqIEZvcndhcmQgdGhlIEZhY2V0ZWQgcHJvamVjdCBjaGFuZ2UgZXZlbnQgYmFjayB0byB0aGUgSlBBIG1vZGVsLgorCSAqLworCXByaXZhdGUgY2xhc3MgRmFjZXRlZFByb2plY3RMaXN0ZW5lciBpbXBsZW1lbnRzIElGYWNldGVkUHJvamVjdExpc3RlbmVyIHsKKworCQlGYWNldGVkUHJvamVjdExpc3RlbmVyKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCisJCS8qKgorCQkgKiBDaGVjayBmb3I6PHVsPgorCQkgKiA8bGk+aW5zdGFsbCBvZiBKUEEgZmFjZXQKKwkJICogPGxpPnVuLWluc3RhbGwgb2YgSlBBIGZhY2V0CisJCSAqIDxsaT5hbnkgb3RoZXIgYXBwZWFyYW5jZSBvciBkaXNhcHBlYXJhbmNlIG9mIHRoZSBKUEEgZmFjZXQKKwkJICogPC91bD4KKwkJICovCisJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50KSB7CisJCQlzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgeworCQkJCWNhc2UgUE9TVF9JTlNUQUxMIDoKKwkJCQkJdGhpcy5wcm9jZXNzUG9zdEluc3RhbGxFdmVudCgoSVByb2plY3RGYWNldEFjdGlvbkV2ZW50KSBldmVudCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUFJFX1VOSU5TVEFMTCA6CisJCQkJCXRoaXMucHJvY2Vzc1ByZVVuaW5zdGFsbEV2ZW50KChJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQpIGV2ZW50KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQUk9KRUNUX01PRElGSUVEIDoKKwkJCQkJdGhpcy5wcm9jZXNzUHJvamVjdE1vZGlmaWVkRXZlbnQoZXZlbnQuZ2V0UHJvamVjdCgpLmdldFByb2plY3QoKSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQgOgorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXByaXZhdGUgdm9pZCBwcm9jZXNzUG9zdEluc3RhbGxFdmVudChJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCWRlYnVnKCJGYWNldCBQT1NUX0lOU1RBTEw6ICIsIGV2ZW50LmdldFByb2plY3RGYWNldCgpKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGV2ZW50LmdldFByb2plY3RGYWNldCgpLmdldElkKCkuZXF1YWxzKEpwdENvcmVQbHVnaW4uRkFDRVRfSUQpKSB7CisJCQkJR2VuZXJpY0pwYU1vZGVsLnRoaXMuanBhRmFjZXRlZFByb2plY3RQb3N0SW5zdGFsbChldmVudCk7CisJCQl9CisJCX0KKworCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1ByZVVuaW5zdGFsbEV2ZW50KElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCBldmVudCkgeworCQkJZGVidWcoIkZhY2V0IFBSRV9VTklOU1RBTEw6ICIsIGV2ZW50LmdldFByb2plY3RGYWNldCgpKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGV2ZW50LmdldFByb2plY3RGYWNldCgpLmdldElkKCkuZXF1YWxzKEpwdENvcmVQbHVnaW4uRkFDRVRfSUQpKSB7CisJCQkJR2VuZXJpY0pwYU1vZGVsLnRoaXMuanBhRmFjZXRlZFByb2plY3RQcmVVbmluc3RhbGwoZXZlbnQpOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIGZvciBhbnkgY2hhbmdlIHRvIGEgZmFjZXRlZCBwcm9qZWN0LgorCQkgKiBXZSB1c2UgdGhlIGV2ZW50IHRvIHdhdGNoIGZvciB0aGUgZm9sbG93aW5nOjx1bD4KKwkJICogPGxpPmFuIG9wZW4gcHJvamVjdCBpcyBjbG9zZWQKKwkJICogPGxpPmEgY2xvc2VkIHByb2plY3QgaXMgb3BlbmVkCisJCSAqIDxsaT5vbmUgb2YgYSBwcm9qZWN0J3MgKGZhY2V0KSBtZXRhZGF0YSBmaWxlcyBpcyBlZGl0ZWQgZGlyZWN0bHkKKwkJICogPC91bD4KKwkJICovCisJCXByaXZhdGUgdm9pZCBwcm9jZXNzUHJvamVjdE1vZGlmaWVkRXZlbnQoSVByb2plY3QgcHJvamVjdCkgeworCQkJZGVidWcoIkZhY2V0IFBST0pFQ1RfTU9ESUZJRUQ6ICIsIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJR2VuZXJpY0pwYU1vZGVsLnRoaXMuY2hlY2tGb3JKcGFGYWNldFRyYW5zaXRpb24ocHJvamVjdCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOworCQl9CisKKwl9CisKKworCS8vICoqKioqKioqKiogSmF2YSBlbGVtZW50IGNoYW5nZSBsaXN0ZW5lciAqKioqKioqKioqCisKKwkvKioKKwkgKiBGb3J3YXJkIHRoZSBKYXZhIGVsZW1lbnQgY2hhbmdlIGV2ZW50IGJhY2sgdG8gdGhlIEpQQSBtb2RlbC4KKwkgKi8KKwlwcml2YXRlIGNsYXNzIEphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7CisJCS8qKgorCQkgKiBBIGZsYWcgdG8gYWN0aXZhdGUvZGVhY3RpdmF0ZSB0aGUgbGlzdGVuZXIKKwkJICogc28gd2UgY2FuIGlnbm9yZSBKYXZhIGV2ZW50cyB3aGVuZXZlciBEYWxpIGlzIG1hbmlwdWxhdGluZyB0aGUgSmF2YQorCQkgKiBzb3VyY2UgY29kZSB2aWEgdGhlIERhbGkgbW9kZWwuIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGUgMC41IHNlYyBkZWxheQorCQkgKiBiZXR3ZWVuIHRoZSBKYXZhIHNvdXJjZSBiZWluZyBjaGFuZ2VkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBldmVudAorCQkgKiBiZWluZyBmaXJlZCBjYXVzZXMgdXMgbm8gZW5kIG9mIHBhaW4uCisJCSAqLworCQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gYWN0aXZlID0gdHJ1ZTsKKworCQlKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCWlmICh0aGlzLmFjdGl2ZSkgeworCQkJCUdlbmVyaWNKcGFNb2RlbC50aGlzLmphdmFFbGVtZW50Q2hhbmdlZChldmVudCk7CisJCQl9CisJCX0KKworCQl2b2lkIHNldEFjdGl2ZShib29sZWFuIGFjdGl2ZSkgeworCQkJdGhpcy5hY3RpdmUgPSBhY3RpdmU7CisJCX0KKworCQlib29sZWFuIGlzQWN0aXZlKCkgeworCQkJcmV0dXJuIHRoaXMuYWN0aXZlOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKKwkJfQorCisJfQorCisKKwkvLyAqKioqKioqKioqIERFQlVHICoqKioqKioqKioKKworCS8vIEBzZWUgSnBhTW9kZWxUZXN0cyN0ZXN0REVCVUcoKQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworCS8qKgorCSAqIHRyaWdnZXIgI3RvU3RyaW5nKCkgY2FsbCBhbmQgc3RyaW5nIGNvbmNhdGVuYXRpb24gb25seSBpZiBERUJVRyBpcyB0cnVlCisJICovCisJLyogcHJpdmF0ZSAqLyBzdGF0aWMgdm9pZCBkZWJ1ZyhTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG9iamVjdCkgeworCQlpZiAoREVCVUcpIHsKKwkJCWRlYnVnXyhtZXNzYWdlICsgb2JqZWN0KTsKKwkJfQorCX0KKworCS8qIHByaXZhdGUgKi8gc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UpIHsKKwkJaWYgKERFQlVHKSB7CisJCQlkZWJ1Z18obWVzc2FnZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGRlYnVnXyhTdHJpbmcgbWVzc2FnZSkgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiOiAiICsgbWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKiBwcml2YXRlICovIHN0YXRpYyB2b2lkIGR1bXBTdGFja1RyYWNlKCkgeworCQlkdW1wU3RhY2tUcmFjZShudWxsKTsKKwl9CisKKwkvKiBwcml2YXRlICovIHN0YXRpYyB2b2lkIGR1bXBTdGFja1RyYWNlKFN0cmluZyBtZXNzYWdlLCBPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChERUJVRykgeworCQkJZHVtcFN0YWNrVHJhY2VfKG1lc3NhZ2UgKyBvYmplY3QpOworCQl9CisJfQorCisJLyogcHJpdmF0ZSAqLyBzdGF0aWMgdm9pZCBkdW1wU3RhY2tUcmFjZShTdHJpbmcgbWVzc2FnZSkgeworCQlpZiAoREVCVUcpIHsKKwkJCWR1bXBTdGFja1RyYWNlXyhtZXNzYWdlKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcFN0YWNrVHJhY2VfKFN0cmluZyBtZXNzYWdlKSB7CisJCS8vIGxvY2sgU3lzdGVtLm91dCBzbyB0aGUgc3RhY2sgZWxlbWVudHMgYXJlIHByaW50ZWQgb3V0IGNvbnRpZ3VvdXNseQorCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKKwkJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKKwkJCQlkZWJ1Z18obWVzc2FnZSk7CisJCQl9CisJCQlTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrVHJhY2UgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldFN0YWNrVHJhY2UoKTsKKwkJCS8vIHNraXAgdGhlIGZpcnN0IDMgZWxlbWVudHMgLSB0aG9zZSBhcmUgdGhpcyBtZXRob2QgYW5kIDIgbWV0aG9kcyBpbiBUaHJlYWQKKwkJCWZvciAoaW50IGkgPSAzOyBpIDwgc3RhY2tUcmFjZS5sZW5ndGg7IGkrKykgeworCQkJCVN0YWNrVHJhY2VFbGVtZW50IGVsZW1lbnQgPSBzdGFja1RyYWNlW2ldOworCQkJCWlmIChlbGVtZW50LmdldE1ldGhvZE5hbWUoKS5lcXVhbHMoImludm9rZTAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOyAgLy8gc2tpcCBhbGwgZWxlbWVudHMgb3V0c2lkZSBvZiB0aGUgSlVuaXQgdGVzdAorCQkJCX0KKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9JUmVzb3VyY2VQYXJ0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSVJlc291cmNlUGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyN2RhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSVJlc291cmNlUGFydC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIGRlc2NyaWJlZCBhcyBiZWluZyBwYXJ0IG9mIGFuIHtAbGluayBJUmVzb3VyY2V9CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlUGFydAoreworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2Ugb2Ygd2hpY2ggdGhpcyBvYmplY3QgaXMgYSBwYXJ0CisJICovCisJSVJlc291cmNlIGdldFJlc291cmNlKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2VhODdkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CisKKy8qKgorICogUHJvdmlkZXMgYW5ub3RhdGlvbkRlZmluaXRpb25zIGZvciB0eXBlcyBhbmQgYXR0cmlidXRlcy4gSnBhQW5ub3RhdGlvblByb3ZpZGVyCisgKiB0aGVuIHVzZXMgYSBjb2xsZWN0aW9uIG9mIHRoZXNlIHRvIGJ1aWxkIGFubm90YXRpb25zLgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMi4yCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcgoreworCS8qKgorCSAqIFJldHVybiBhbGwgYW5ub3RhdGlvbiBkZWZpbml0aW9ucyB3aGljaCBjYW4gYXBwZWFyIG9uIGEgdHlwZQorCSAqLworCUl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiB0eXBlQW5ub3RhdGlvbkRlZmluaXRpb25zKCk7CisJCisJLyoqCisJICogUmV0dXJuIGFsbCBhbm5vdGF0aW9uIGRlZmluaXRpb25zIHdoaWNoIGNhbiBhcHBlYXIgb24gYSB0eXBlIGFuZCBhcmUgdXNlZCB0byBkZXRlcm1pbmUKKwkgKiB3aGV0aGVyIGFuZCBob3cgdGhlIHR5cGUgaXMgcGVyc2lzdGVkIChob3cgaXQgaXMgIm1hcHBlZCIpLgorCSAqIFRoaXMgc2hvdWxkIGJlIGEgc3Vic2V0IG9mIHtAbGluayAjdHlwZUFubm90YXRpb25EZWZpbml0aW9ucygpfS4KKwkgKi8KKwlJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gdHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gYWxsIGFubm90YXRpb24gZGVmaW5pdGlvbnMgd2hpY2ggY2FuIGFwcGVhciBvbiBhbiBhdHRyaWJ1dGUKKwkgKi8KKwlJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhQW5ub3RhdGlvblByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhQW5ub3RhdGlvblByb3ZpZGVyLmphdmEKaW5kZXggMTI5N2NhMi4uZTVhMzg0YSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYUFubm90YXRpb25Qcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFBbm5vdGF0aW9uUHJvdmlkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3ICsxMCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwpAQCAtMTgsNzUgKzE4LDkzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKIAogLyoqCisgKiBUaGlzIGlzIHVzZWQgdG8gcHJvdmlkZSB0eXBlIGFuZCBhdHRyaWJ1dGUgYW5ub3RhdGlvbnMuCisgKiBBbHNvIHByb3ZpZGVzIGxpc3Qgb2Ygc3VwcG9ydGVkIGFubm90YXRpb24gbmFtZXMsIGNoZWNrIHRoZSBhcHByb3ByaWF0ZSBsaXN0CisgKiBiZWZvcmUgdHJ5aW5nIHRvIGJ1aWxkIGFuIGFubm90YXRpb24gd2l0aCB0aGF0IG5hbWUuIEFuIGV4Y2VwdGlvbiB3aWxsCisgKiBiZSB0aHJvd24gb24gYW4gYXR0ZW1wdCB0byBidWlsZCBhbiBhbm5vdGF0aW9uIHRoYXQgZG9lcyBub3QgZXhpc3QuCiAgKiAKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4gIEluc3RlYWQgaW1wbGVtZW50IAorICogSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciB0byBleHRlbmQgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGFubm90YXRpb24gZGVmaW5pdGlvbnMuCiAgKiAKKyAqIEBzZWUgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcgorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMi4wPworICogIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKICAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhQW5ub3RhdGlvblByb3ZpZGVyCitwdWJsaWMgaW50ZXJmYWNlIEpwYUFubm90YXRpb25Qcm92aWRlciAKIHsKLQkvKioKLQkgKiBCdWlsZCBhbiBBbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmlmZWQgYW5ub3RhdGlvbiBuYW1lLgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIG1hcHBpbmdBbm5vdGF0aW9uTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlBbm5vdGF0aW9uIGJ1aWxkVHlwZU1hcHBpbmdBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlLCBTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lKTsKLQotCUFubm90YXRpb24gYnVpbGROdWxsVHlwZU1hcHBpbmdBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlLCBTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lKTsKLQotCS8qKgotCSAqIEJ1aWxkIGFuIEFubm90YXRpb24gd2l0aCB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWZlZCBhbm5vdGF0aW9uIG5hbWUuCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JQW5ub3RhdGlvbiBidWlsZFR5cGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCQotCUFubm90YXRpb24gYnVpbGROdWxsVHlwZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBUeXBlIHR5cGUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7CisJLy8gKioqKioqKioqKiB0eXBlIGFubm90YXRpb25zICoqKioqKioqKioKIAkKIAkvKioKLQkgKiBPcmRlcmVkIGl0ZXJhdG9yIG9mIGZ1bGx5IHF1YWxpZmllZCBhbm5vdGF0aW9uIG5hbWVzIHRoYXQgY2FuIGFwcGx5IHRvIGEgVHlwZQotCSAqLwotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHR5cGVNYXBwaW5nQW5ub3RhdGlvbk5hbWVzKCk7Ci0JCi0JLyoqCi0JICogSXRlcmF0b3Igb2YgZnVsbHkgcXVhbGlmaWVkIGFubm90YXRpb24obm9uLW1hcHBpbmcpIG5hbWVzIHRoYXQgY2FuIGFwcGx5IHRvIGEgVHlwZQorCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGFubm90YXRpb25zIHRoYXQgY2FuIGFwcGVhciBvbiBhIHR5cGUuCiAJICovCiAJSXRlcmF0b3I8U3RyaW5nPiB0eXBlQW5ub3RhdGlvbk5hbWVzKCk7CiAJCiAJLyoqCi0JICogQnVpbGQgYSBBbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmlmZWQgYW5ub3RhdGlvbiBuYW1lLgotCSAqIEBwYXJhbSBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gbWFwcGluZ0Fubm90YXRpb25OYW1lCi0JICogQHJldHVybgorCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGFubm90YXRpb25zIHRoYXQgY2FuIGFwcGVhciBvbiBhIHR5cGUgYW5kIGFyZSB1c2VkIHRvIAorCSAqIGRldGVybWluZSB3aGV0aGVyIGFuZCBob3cgdGhlIHR5cGUgaXMgcGVyc2lzdGVkIChob3cgaXQgaXMgIm1hcHBlZCIpLgorCSAqIFRoaXMgc2hvdWxkIGJlIGEgc3Vic2V0IG9mIHtAbGluayAjdHlwZUFubm90YXRpb25OYW1lcygpfS4KIAkgKi8KLQlBbm5vdGF0aW9uIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIFN0cmluZyBtYXBwaW5nQW5ub3RhdGlvbk5hbWUpOwotCQotCUFubm90YXRpb24gYnVpbGROdWxsQXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIFN0cmluZyBtYXBwaW5nQW5ub3RhdGlvbk5hbWUpOwotCi0JLyoqCi0JICogQnVpbGQgYW4gQW5ub3RhdGlvbiB3aXRoIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZmVkIGFubm90YXRpb24gbmFtZS4KLQkgKiBAcGFyYW0gYXR0cmlidXRlCi0JICogQHBhcmFtIGFubm90YXRpb25OYW1lCi0JICogQHJldHVybgotCSAqLwotCUFubm90YXRpb24gYnVpbGRBdHRyaWJ1dGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCQotCUFubm90YXRpb24gYnVpbGROdWxsQXR0cmlidXRlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSwgU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQorCUl0ZXJhdG9yPFN0cmluZz4gdHlwZU1hcHBpbmdBbm5vdGF0aW9uTmFtZXMoKTsKIAkKIAkvKioKLQkgKiBPcmRlcmVkIGl0ZXJhdG9yIG9mIGZ1bGx5IHF1YWxpZmllZCBhbm5vdGF0aW9uIG5hbWVzIHRoYXQgY2FuIGFwcGx5IHRvIGFuIEF0dHJpYnV0ZQorCSAqIEJ1aWxkIGEgdHlwZSBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgdW5zdXBwb3J0ZWQuCisJICogQHNlZSAjdHlwZUFubm90YXRpb25OYW1lcygpCiAJICovCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb25OYW1lcygpOworCUFubm90YXRpb24gYnVpbGRUeXBlQW5ub3RhdGlvbigKKwkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwogCQogCS8qKgotCSAqIEl0ZXJhdG9yIG9mIGZ1bGx5IHF1YWxpZmllZCBhbm5vdGF0aW9uKG5vbi1tYXBwaW5nKSBuYW1lcyB0aGF0IGNhbiBhcHBseSB0byBhbiBBdHRyaWJ1dGUKKwkgKiBCdWlsZCBhIHR5cGUgYW5ub3RhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBKRFQgYW5ub3RhdGlvbi4KKwkgKiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGlzIHVuc3VwcG9ydGVkLgorCSAqIEBzZWUgI3R5cGVBbm5vdGF0aW9uTmFtZXMoKQogCSAqLwotCUl0ZXJhdG9yPFN0cmluZz4gIGF0dHJpYnV0ZUFubm90YXRpb25OYW1lcygpOwotCisJQW5ub3RhdGlvbiBidWlsZFR5cGVBbm5vdGF0aW9uKAorCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKTsKKwkKKwkvKioKKwkgKiBCdWlsZCBhIG51bGwgdHlwZSBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gaXMgdW5zdXBwb3J0ZWQuCisJICogQHNlZSAjdHlwZUFubm90YXRpb25OYW1lcygpCisJICovCisJQW5ub3RhdGlvbiBidWlsZE51bGxUeXBlQW5ub3RhdGlvbigKKwkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgU3RyaW5nIGFubm90YXRpb25OYW1lKTsKKwkKKwkKKwkvLyAqKioqKioqKioqIGF0dHJpYnV0ZSBhbm5vdGF0aW9ucyAqKioqKioqKioqCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgYW5ub3RhdGlvbnMgdGhhdCBjYW4gYXBwZWFyIG9uIGFuIGF0dHJpYnV0ZS4KKwkgKi8KKwlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZUFubm90YXRpb25OYW1lcygpOworCQorCS8qKgorCSAqIEJ1aWxkIGFuIGF0dHJpYnV0ZSBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgdW5zdXBwb3J0ZWQuCisJICogQHNlZSAjYXR0cmlidXRlQW5ub3RhdGlvbk5hbWVzKCkKKwkgKi8KKwlBbm5vdGF0aW9uIGJ1aWxkQXR0cmlidXRlQW5ub3RhdGlvbigKKwkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOworCQorCS8qKgorCSAqIEJ1aWxkIGFuIGF0dHJpYnV0ZSBhbm5vdGF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEpEVCBhbm5vdGF0aW9uLgorCSAqIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gaXMgdW5zdXBwb3J0ZWQuCisJICogQHNlZSAjYXR0cmlidXRlQW5ub3RhdGlvbk5hbWVzKCkKKwkgKi8KKwlBbm5vdGF0aW9uIGJ1aWxkQXR0cmlidXRlQW5ub3RhdGlvbigKKwkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKTsKKwkKKwkvKioKKwkgKiBCdWlsZCBhIG51bGwgYXR0cmlidXRlIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBpcyB1bnN1cHBvcnRlZC4KKwkgKiBAc2VlICNhdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbk5hbWVzKCkKKwkgKi8KKwlBbm5vdGF0aW9uIGJ1aWxkTnVsbEF0dHJpYnV0ZUFubm90YXRpb24oCisJCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgU3RyaW5nIGFubm90YXRpb25OYW1lKTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFEYXRhU291cmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhRGF0YVNvdXJjZS5qYXZhCmluZGV4IDljZDY0MGMuLjdhMDBiMDIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFEYXRhU291cmNlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYURhdGFTb3VyY2UuamF2YQpAQCAtMTAsOSArMTAsMTEgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZU9iamVjdDsKIAogLyoqCi0gKiAKKyAqIEludGVyZmFjZSB0byB0aGUgY29ubmVjdGlvbiBwcm9maWxlLgogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjcsMzUgKzI5LDQ5IEBACiAJICogVGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyBsb29rZWQgdXAgYmFzZWQgb24gdGhpcyBzZXR0aW5nLgogCSAqLwogCVN0cmluZyBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKTsKLQkKKwogCS8qKgogCSAqIFNldCB0aGUgZGF0YSBzb3VyY2UncyBjb25uZWN0aW9uIHByb2ZpbGUgbmFtZS4KIAkgKiBUaGUgY29ubmVjdGlvbiBwcm9maWxlIGlzIGxvb2tlZCB1cCBiYXNlZCBvbiB0aGlzIHNldHRpbmcuCiAJICovCiAJdm9pZCBzZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoU3RyaW5nIGNvbm5lY3Rpb25Qcm9maWxlTmFtZSk7Ci0JCisKIAkvKioKIAkgKiBJRCBzdHJpbmcgdXNlZCB3aGVuIGNvbm5lY3Rpb25Qcm9maWxlTmFtZSBwcm9wZXJ0eSBpcyBjaGFuZ2VkCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbCNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZywgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX1BST0ZJTEVfTkFNRV9QUk9QRVJUWSA9ICJjb25uZWN0aW9uUHJvZmlsZU5hbWUiOwotCQorCVN0cmluZyBDT05ORUNUSU9OX1BST0ZJTEVfTkFNRV9QUk9QRVJUWSA9ICJjb25uZWN0aW9uUHJvZmlsZU5hbWUiOyAvLyROT04tTkxTLTEkCisKIAkvKioKLQkgKiBUaGUgZGF0YSBzb3VyY2UncyBjb25uZWN0aW9uIHByb2ZpbGUgc2hvdWxkIG5ldmVyIGJlIG51bGwuCi0JICogSWYgd2UgZG8gbm90IGhhdmUgYSBjb25uZWN0aW9uLCByZXR1cm4gYSAibnVsbCIgY29ubmVjdGlvbiBwcm9maWxlLgorCSAqIFRoZSBjb25uZWN0aW9uIHByb2ZpbGUgaXMgbnVsbCBpZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIG5hbWUgaXMgaW52YWxpZC4KIAkgKi8KIAlDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCQorCiAJLyoqCiAJICogSUQgc3RyaW5nIHVzZWQgd2hlbiBjb25uZWN0aW9uUHJvZmlsZSBwcm9wZXJ0eSBpcyBjaGFuZ2VkCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbCNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZywgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX1BST0ZJTEVfUFJPUEVSVFkgPSAiY29ubmVjdGlvblByb2ZpbGUiOwotCQorCVN0cmluZyBDT05ORUNUSU9OX1BST0ZJTEVfUFJPUEVSVFkgPSAiY29ubmVjdGlvblByb2ZpbGUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvZmlsZSBpcyBlaXRoZXIgY29ubmVjdGVkIHRvIGEgbGl2ZSBkYXRhYmFzZQorCSAqIHNlc3Npb24gb3Igd29ya2luZyBvZmYtbGluZSAoaS5lLiBpdCBoYXMgYWNjZXNzIHRvIG1ldGEtZGF0YSkuCisJICovCiAJYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JCi0JYm9vbGVhbiBoYXNBQ29ubmVjdGlvbigpOwotCQorCisJLyoqCisJICogSWYgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyBhY3RpdmUsIHJldHVybiBpdHMgZGF0YWJhc2UuCisJICovCisJRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKTsKKworCS8qKgorCSAqIFNlbGVjdCBhbmQgcmV0dXJuIHRoZSBkYXRhYmFzZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuCisJICovCisJPFQgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdD4gVCBzZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIoVFtdIGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIGlkZW50aWZpZXIpOworCisJLyoqCisJICogRGlzcG9zZSB0aGUgZGF0YSBzb3VyY2UuCisJICovCiAJdm9pZCBkaXNwb3NlKCk7CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhRmFjdG9yeS5qYXZhCmluZGV4IDdiYTE0MDIuLmVkMzY5M2UgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFGYWN0b3J5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYUZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCwzMiArMTAsNDMgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzZUpvaW5Db2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFDYXNjYWRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRGlzY3JpbWluYXRvckNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0ZWRWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRvckNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUxvYkNvbnZlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZENvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkTmF0aXZlUXVlcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZFF1ZXJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKQEAgLTQ0LDI0MiArNTUsODQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVF1ZXJ5Q29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUXVlcnlIaW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVsYXRpb25zaGlwTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlY29uZGFyeVRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2VxdWVuY2VHZW5lcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGVtcG9yYWxDb252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLlBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5OwogCiAvKioKLSAqIFVzZSBKcGFGYWN0b3J5IHRvIGNyZWF0ZSBhbnkgY29yZSAoZS5nLiBKcGFQcm9qZWN0KSwgcmVzb3VyY2UgCi0gKiAoZS5nLiBQZXJzaXN0ZW5jZVJlc291cmNlKSwgb3IgY29udGV4dCAoZS5nLiBBdHRyaWJ1dGVNYXBwaW5nKSBtb2RlbCBvYmplY3RzLgotICogCisgKiBVc2UgYSBKUEEgZmFjdG9yeSB0byBidWlsZCBhbnkgY29yZSAoZS5nLiB7QGxpbmsgSnBhUHJvamVjdH0pCisgKiBtb2RlbCBvYmplY3Qgb3IgYW55IEphdmEgKGUuZy4ge0BsaW5rIEphdmFFbnRpdHl9KSwgT1JNIChlLmcuCisgKiB7QGxpbmsgRW50aXR5TWFwcGluZ3N9KSwgb3IgcGVyc2lzdGVuY2UgKGUuZy4ge0BsaW5rIFBlcnNpc3RlbmNlVW5pdH0pCisgKiBjb250ZXh0IG1vZGVsIG9iamVjdHMuCisgKiA8cD4KICAqIEFzc3VtZXMgYSBiYXNlIEpQQSBwcm9qZWN0IGNvbnRleHQgc3RydWN0dXJlIAogICogY29ycmVzcG9uZGluZyB0byB0aGUgSlBBIHNwZWM6Ci0gKiAKLSAqIAlSb290Q29udGVudAotICogCSB8LSBwZXJzaXN0ZW5jZS54bWwKLSAqIAkgICAgIHwtIHBlcnNpc3RlbmNlIHVuaXQocykKLSAqICAgICAgICAgICB8LSBtYXBwaW5nIGZpbGUocykgIChlLmcuIG9ybS54bWwpCi0gKiAgICAgICAgICAgfCAgIHwtIHBlcnNpc3RlbnQgdHlwZSBtYXBwaW5nKHMpICAoZS5nLiBFbnRpdHkpCi0gKiAgICAgICAgICAgfCAgICAgICAgfC0gcGVyc2lzdGVudCBhdHRyaWJ1dGUgbWFwcGluZyhzKSAgKGUuZy4gQmFzaWMpCi0gKiAgICAgICAgICAgfC0gcGVyc2lzdGVudCB0eXBlIG1hcHBpbmcocykKLSAqICAgCisgKiA8cHJlPgorICogICAgIFJvb3RDb250ZXh0CisgKiAgICAgIHwtIHBlcnNpc3RlbmNlLnhtbAorICogICAgICAgICAgfC0gcGVyc2lzdGVuY2UgdW5pdChzKQorICogICAgICAgICAgICAgICB8LSBtYXBwaW5nIGZpbGUocykgIChlLmcuIG9ybS54bWwpCisgKiAgICAgICAgICAgICAgIHwgICB8LSBwZXJzaXN0ZW50IHR5cGUgbWFwcGluZyhzKSAgKGUuZy4gRW50aXR5KQorICogICAgICAgICAgICAgICB8ICAgICAgIHwtIHBlcnNpc3RlbnQgYXR0cmlidXRlIG1hcHBpbmcocykgIChlLmcuIEJhc2ljKQorICogICAgICAgICAgICAgICB8LSBwZXJzaXN0ZW50IHR5cGUgbWFwcGluZyhzKQorICogPC9wcmU+CiAgKiAgIC4uLiBhbmQgYXNzb2NpYXRlZCBvYmplY3RzLgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uR2VuZXJpY0pwYUZhY3RvcnkKLSAqIAorICo8cD4gCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuR2VuZXJpY0pwYUZhY3RvcnkKICAqLwogcHVibGljIGludGVyZmFjZSBKcGFGYWN0b3J5IAogewotCS8vICoqKioqKioqKioqKioqKiogY29yZSBvYmplY3RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkvLyAqKioqKioqKioqIENvcmUgTW9kZWwgKioqKioqKioqKgogCQogCS8qKgogCSAqIENvbnN0cnVjdCBhIEpwYVByb2plY3QgZm9yIHRoZSBzcGVjaWZpZWQgY29uZmlnLCB0byBiZQogCSAqIGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgSlBBIHByb2plY3QuIFJldHVybiBudWxsIGlmIHVuYWJsZSB0byBjcmVhdGUKIAkgKiB0aGUgSlBBIGZpbGUgKGUuZy4gdGhlIGNvbnRlbnQgdHlwZSBpcyB1bnJlY29nbml6ZWQpLgogCSAqLwotCUpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb247CisJSnBhUHJvamVjdCBidWlsZEpwYVByb2plY3QoSnBhUHJvamVjdC5Db25maWcgY29uZmlnKTsKIAkKIAlKcGFEYXRhU291cmNlIGJ1aWxkSnBhRGF0YVNvdXJjZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIFN0cmluZyBjb25uZWN0aW9uUHJvZmlsZU5hbWUpOwotCQorCiAJLyoqCi0JICogQ29uc3RydWN0IGEgSlBBIGZpbGUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZSBhbmQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlc291cmNlCi0JICogbW9kZWwsIHRvIGJlIGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgSlBBIHByb2plY3QuCi0JICogVGhpcyBzaG91bGQgYmUgbm9uLW51bGwgaWZmIChpZiBhbmQgb25seSBpZikge0BsaW5rICNoYXNSZWxldmFudENvbnRlbnQoSUZpbGUpfQotCSAqIHJldHVybnMgdHJ1ZS4KKwkgKiBDb25zdHJ1Y3QgYSBKUEEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBKUEEgcHJvamVjdCwgZmlsZSwgY29udGVudCB0eXBlLAorCSAqIGFuZCByZXNvdXJjZSBtb2RlbC4KIAkgKi8KLQlKcGFGaWxlIGJ1aWxkSnBhRmlsZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIElGaWxlIGZpbGUsIFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCk7CisJSnBhRmlsZSBidWlsZEpwYUZpbGUoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlLCBJQ29udGVudFR5cGUgY29udGVudFR5cGUsIEpwYVJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCk7CiAJCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYSByZXNvdXJjZSBtb2RlbCB3aWxsIGJlIHByb3ZpZGVkIGZvciB0aGUgZ2l2ZW4gZmlsZQotCSAqICh0aGlzIG1ldGhvZCBzaG91bGQgYmUgbW92ZWQgdG8gSnBhUGxhdGZvcm0pCi0JICovCi0JYm9vbGVhbiBoYXNSZWxldmFudENvbnRlbnQoSUZpbGUgZmlsZSk7CiAJCi0JLyoqCi0JICogQnVpbGQgYSByZXNvdXJjZSBtb2RlbCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpbGUuCi0JICogVGhpcyBzaG91bGQgYmUgbm9uLW51bGwgaWZmIChpZiBhbmQgb25seSBpZikge0BsaW5rICNoYXNSZWxldmFudENvbnRlbnQoSUZpbGUpfQotCSAqIHJldHVybnMgdHJ1ZS4gCi0JICovCi0JUmVzb3VyY2VNb2RlbCBidWlsZFJlc291cmNlTW9kZWwoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlKTsKKwkvLyAqKioqKioqKioqIENvbnRleHQgTm9kZXMgKioqKioqKioqKgogCQogCS8qKgogCSAqIEJ1aWxkIGEgKC9hbiB1cGRhdGVkKSByb290IGNvbnRleHQgbm9kZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIAogCSAqIEpQQSBwcm9qZWN0LgogCSAqIFRoZSByb290IGNvbnRleHQgbm9kZSB3aWxsIGJlIGJ1aWx0IG9uY2UsIGJ1dCB1cGRhdGVkIG1hbnkgdGltZXMuCi0JICogQHNlZSBKcGFQcm9qZWN0LnVwZGF0ZShQcm9ncmVzc01vbml0b3IpCisJICogQHNlZSBKcGFQcm9qZWN0I3VwZGF0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKIAkgKi8KLQlKcGFSb290Q29udGV4dE5vZGUgYnVpbGRSb290Q29udGV4dChKcGFQcm9qZWN0IGpwYVByb2plY3QpOworCUpwYVJvb3RDb250ZXh0Tm9kZSBidWlsZFJvb3RDb250ZXh0Tm9kZShKcGFQcm9qZWN0IGpwYVByb2plY3QpOworCQkJCiAJCisJLy8gKioqKioqKioqKiBKYXZhIENvbnRleHQgTW9kZWwgKioqKioqKioqKgogCQotCS8vICoqKioqKioqKioqKioqKiogcGVyc2lzdGVuY2UgY29udGV4dCBvYmplY3RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlQZXJzaXN0ZW5jZVhtbCBidWlsZFBlcnNpc3RlbmNlWG1sKEpwYVJvb3RDb250ZXh0Tm9kZSBwYXJlbnQsIFBlcnNpc3RlbmNlUmVzb3VyY2UgcGVyc2lzdGVuY2VSZXNvdXJjZSk7Ci0JCi0JUGVyc2lzdGVuY2UgYnVpbGRQZXJzaXN0ZW5jZShQZXJzaXN0ZW5jZVhtbCBwYXJlbnQsIFhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlKTsKLQkKLQlQZXJzaXN0ZW5jZVVuaXQgYnVpbGRQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KTsKLQkKLQkvKioKLQkgKiB4bWxNYXBwaW5nRmlsZVJlZiBpcyBhbGxvd2VkIHRvIGJlIG51bGwsIHRoaXMgd291bGQgYmUgdXNlZCBmb3IgdGhlIGltcGxpZWQgbWFwcGluZyBmaWxlIHJlZgotCSAqLwotCU1hcHBpbmdGaWxlUmVmIGJ1aWxkTWFwcGluZ0ZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQotCUNsYXNzUmVmIGJ1aWxkQ2xhc3NSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmKTsKLQkKLQlDbGFzc1JlZiBidWlsZENsYXNzUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFN0cmluZyBjbGFzc05hbWUpOwotCi0JUHJvcGVydHkgYnVpbGRQcm9wZXJ0eShQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBYbWxQcm9wZXJ0eSBwcm9wZXJ0eSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBvcm0gY29udGV4dCBvYmplY3RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCU9ybVhtbCBidWlsZE9ybVhtbChNYXBwaW5nRmlsZVJlZiBwYXJlbnQsIE9ybVJlc291cmNlIG9ybVJlc291cmNlKTsKLQotCUVudGl0eU1hcHBpbmdzIGJ1aWxkRW50aXR5TWFwcGluZ3MoT3JtWG1sIHBhcmVudCwgWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpOwotCQotCVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGJ1aWxkUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRW50aXR5TWFwcGluZ3MgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyk7Ci0JCi0JUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgYnVpbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwYXJlbnQsIFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKTsKLQkKLQlPcm1QZXJzaXN0ZW50VHlwZSBidWlsZE9ybVBlcnNpc3RlbnRUeXBlKEVudGl0eU1hcHBpbmdzIHBhcmVudCwgU3RyaW5nIG1hcHBpbmdLZXkpOwotCQotCU9ybUVudGl0eSBidWlsZE9ybUVudGl0eShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQpOwotCQotCU9ybU1hcHBlZFN1cGVyY2xhc3MgYnVpbGRPcm1NYXBwZWRTdXBlcmNsYXNzKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCk7Ci0JCi0JT3JtRW1iZWRkYWJsZSBidWlsZE9ybUVtYmVkZGFibGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50KTsKLQkKLQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFN0cmluZyBtYXBwaW5nS2V5KTsKLQkKLQlPcm1UYWJsZSBidWlsZE9ybVRhYmxlKE9ybUVudGl0eSBwYXJlbnQpOwotCQotCU9ybVNlY29uZGFyeVRhYmxlIGJ1aWxkT3JtU2Vjb25kYXJ5VGFibGUoT3JtRW50aXR5IHBhcmVudCwgWG1sU2Vjb25kYXJ5VGFibGUgeG1sU2Vjb25kYXJ5VGFibGUpOwotCQotCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4oT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPcm1CYXNlSm9pbkNvbHVtbi5Pd25lciBvd25lcik7Ci0JCi0JT3JtSm9pblRhYmxlIGJ1aWxkT3JtSm9pblRhYmxlKE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcgcGFyZW50KTsKLQkKLQlPcm1Kb2luQ29sdW1uIGJ1aWxkT3JtSm9pbkNvbHVtbihPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybUpvaW5Db2x1bW4uT3duZXIgb3duZXIpOwotCQotCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkT3JtQXR0cmlidXRlT3ZlcnJpZGUoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50LCBBdHRyaWJ1dGVPdmVycmlkZS5Pd25lciBvd25lciwgWG1sQXR0cmlidXRlT3ZlcnJpZGUgeG1sQXR0cmlidXRlT3ZlcnJpZGUpOwotCQotCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgQXNzb2NpYXRpb25PdmVycmlkZS5Pd25lciBvd25lciwgWG1sQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQotCU9ybURpc2NyaW1pbmF0b3JDb2x1bW4gYnVpbGRPcm1EaXNjcmltaW5hdG9yQ29sdW1uKE9ybUVudGl0eSBwYXJlbnQsIE9ybU5hbWVkQ29sdW1uLk93bmVyIG93bmVyKTsKLQkKLQlPcm1Db2x1bW4gYnVpbGRPcm1Db2x1bW4oT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPcm1Db2x1bW4uT3duZXIgb3duZXIpOwotCQotCU9ybUdlbmVyYXRlZFZhbHVlIGJ1aWxkT3JtR2VuZXJhdGVkVmFsdWUoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50KTsKLQkKLQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBidWlsZE9ybVNlcXVlbmNlR2VuZXJhdG9yKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCk7Ci0JCi0JT3JtVGFibGVHZW5lcmF0b3IgYnVpbGRPcm1UYWJsZUdlbmVyYXRvcihPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQpOwotCQotCU9ybU5hbWVkTmF0aXZlUXVlcnkgYnVpbGRPcm1OYW1lZE5hdGl2ZVF1ZXJ5KE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCk7Ci0KLQlPcm1OYW1lZFF1ZXJ5IGJ1aWxkT3JtTmFtZWRRdWVyeShPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQpOwotCQotCU9ybVF1ZXJ5SGludCBidWlsZE9ybVF1ZXJ5SGludChPcm1RdWVyeSBwYXJlbnQpOwotCi0JT3JtQmFzaWNNYXBwaW5nIGJ1aWxkT3JtQmFzaWNNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlPcm1NYW55VG9NYW55TWFwcGluZyBidWlsZE9ybU1hbnlUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlPcm1PbmVUb01hbnlNYXBwaW5nIGJ1aWxkT3JtT25lVG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JT3JtTWFueVRvT25lTWFwcGluZyBidWlsZE9ybU1hbnlUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCU9ybU9uZVRvT25lTWFwcGluZyBidWlsZE9ybU9uZVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JT3JtRW1iZWRkZWRJZE1hcHBpbmcgYnVpbGRPcm1FbWJlZGRlZElkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JT3JtRW1iZWRkZWRNYXBwaW5nIGJ1aWxkT3JtRW1iZWRkZWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlPcm1JZE1hcHBpbmcgYnVpbGRPcm1JZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCU9ybVRyYW5zaWVudE1hcHBpbmcgYnVpbGRPcm1UcmFuc2llbnRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlPcm1WZXJzaW9uTWFwcGluZyBidWlsZE9ybVZlcnNpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCU9ybVVuaXF1ZUNvbnN0cmFpbnQgYnVpbGRPcm1VbmlxdWVDb25zdHJhaW50KE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgVW5pcXVlQ29uc3RyYWludC5Pd25lciBvd25lciwgWG1sVW5pcXVlQ29uc3RyYWludCB4bWxVbmlxdWVDb25zdHJhaW50KTsKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgY29udGV4dCBvYmplY3RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JSmF2YVBlcnNpc3RlbnRUeXBlIGJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKEpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7CisJSmF2YVBlcnNpc3RlbnRUeXBlIGJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKFBlcnNpc3RlbnRUeXBlLk93bmVyIG93bmVyLCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KTsKIAkKIAlKYXZhRW50aXR5IGJ1aWxkSmF2YUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KTsKIAkKQEAgLTI4OSwxNCArMTQyLDE2IEBACiAJCiAJSmF2YVR5cGVNYXBwaW5nIGJ1aWxkSmF2YU51bGxUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KTsKIAkKLQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpOwotCisJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSk7CisJCiAJSmF2YUJhc2ljTWFwcGluZyBidWlsZEphdmFCYXNpY01hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKIAkKIAlKYXZhRW1iZWRkZWRJZE1hcHBpbmcgYnVpbGRKYXZhRW1iZWRkZWRJZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKIAkKIAlKYXZhRW1iZWRkZWRNYXBwaW5nIGJ1aWxkSmF2YUVtYmVkZGVkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwogCQorCUphdmFHZW5lcmF0b3JDb250YWluZXIgYnVpbGRKYXZhR2VuZXJhdG9yQ29udGFpbmVyKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpOworCiAJSmF2YUlkTWFwcGluZyBidWlsZEphdmFJZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKIAkKIAlKYXZhTWFueVRvTWFueU1hcHBpbmcgYnVpbGRKYXZhTWFueVRvTWFueU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKQEAgLTMwNiw3ICsxNjEsNyBAQAogCUphdmFPbmVUb01hbnlNYXBwaW5nIGJ1aWxkSmF2YU9uZVRvTWFueU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKIAkKIAlKYXZhT25lVG9PbmVNYXBwaW5nIGJ1aWxkSmF2YU9uZVRvT25lTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCisJCiAJSmF2YVRyYW5zaWVudE1hcHBpbmcgYnVpbGRKYXZhVHJhbnNpZW50TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwogCQogCUphdmFWZXJzaW9uTWFwcGluZyBidWlsZEphdmFWZXJzaW9uTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwpAQCAtMzE1LDI3ICsxNzAsMzcgQEAKIAkKIAlKYXZhVGFibGUgYnVpbGRKYXZhVGFibGUoSmF2YUVudGl0eSBwYXJlbnQpOwogCQotCUphdmFKb2luVGFibGUgYnVpbGRKYXZhSm9pblRhYmxlKEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nIHBhcmVudCk7CisJSmF2YUpvaW5UYWJsZSBidWlsZEphdmFKb2luVGFibGUoSmF2YUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSBwYXJlbnQpOworCQorCUphdmFDYXNjYWRlIGJ1aWxkSmF2YUNhc2NhZGUoSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgcGFyZW50KTsKIAkKIAlKYXZhQ29sdW1uIGJ1aWxkSmF2YUNvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhQ29sdW1uLk93bmVyIG93bmVyKTsKLQotCUphdmFEaXNjcmltaW5hdG9yQ29sdW1uIGJ1aWxkSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4oSmF2YUVudGl0eSBwYXJlbnQsIEphdmFOYW1lZENvbHVtbi5Pd25lciBvd25lcik7CisJCisJSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4gYnVpbGRKYXZhRGlzY3JpbWluYXRvckNvbHVtbihKYXZhRW50aXR5IHBhcmVudCwgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXIgb3duZXIpOwogCQogCUphdmFKb2luQ29sdW1uIGJ1aWxkSmF2YUpvaW5Db2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUpvaW5Db2x1bW4uT3duZXIgb3duZXIpOwotCisJCiAJSmF2YVNlY29uZGFyeVRhYmxlIGJ1aWxkSmF2YVNlY29uZGFyeVRhYmxlKEphdmFFbnRpdHkgcGFyZW50KTsKIAkKIAlKYXZhU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRKYXZhU2VxdWVuY2VHZW5lcmF0b3IoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCk7CiAJCiAJSmF2YVRhYmxlR2VuZXJhdG9yIGJ1aWxkSmF2YVRhYmxlR2VuZXJhdG9yKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpOwogCQotCUphdmFHZW5lcmF0ZWRWYWx1ZSBidWlsZEphdmFHZW5lcmF0ZWRWYWx1ZShKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQpOworCUphdmFHZW5lcmF0ZWRWYWx1ZSBidWlsZEphdmFHZW5lcmF0ZWRWYWx1ZShKYXZhSWRNYXBwaW5nIHBhcmVudCk7CiAJCiAJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFCYXNlSm9pbkNvbHVtbi5Pd25lciBvd25lcik7CiAJCi0JSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEF0dHJpYnV0ZU92ZXJyaWRlLk93bmVyIG93bmVyKTsKKwlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYnVpbGRKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuT3duZXIgb3duZXIpOworCisJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIEF0dHJpYnV0ZU92ZXJyaWRlLk93bmVyIG93bmVyKTsKIAkKLQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBidWlsZEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEFzc29jaWF0aW9uT3ZlcnJpZGUuT3duZXIgb3duZXIpOworCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoSmF2YUVudGl0eSBwYXJlbnQsIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuT3duZXIgb3duZXIpOworCisJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZShKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIEFzc29jaWF0aW9uT3ZlcnJpZGUuT3duZXIgb3duZXIpOworCQorCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlIGJ1aWxkSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgcGFyZW50KTsKKwkKKwlKYXZhUXVlcnlDb250YWluZXIgYnVpbGRKYXZhUXVlcnlDb250YWluZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCk7CiAKIAlKYXZhTmFtZWRRdWVyeSBidWlsZEphdmFOYW1lZFF1ZXJ5KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpOwogCQpAQCAtMzQ0LDQgKzIwOSwxNSBAQAogCUphdmFRdWVyeUhpbnQgYnVpbGRKYXZhUXVlcnlIaW50KEphdmFRdWVyeSBwYXJlbnQpOwogCQogCUphdmFVbmlxdWVDb25zdHJhaW50IGJ1aWxkSmF2YVVuaXF1ZUNvbnN0cmFpbnQoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgVW5pcXVlQ29uc3RyYWludC5Pd25lciBvd25lcik7CisJCisJSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIgYnVpbGRKYXZhRW51bWVyYXRlZENvbnZlcnRlcihKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSk7CisJCisJSmF2YVRlbXBvcmFsQ29udmVydGVyIGJ1aWxkSmF2YVRlbXBvcmFsQ29udmVydGVyKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKTsKKwkKKwlKYXZhTG9iQ29udmVydGVyIGJ1aWxkSmF2YUxvYkNvbnZlcnRlcihKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSk7CisKKwlKYXZhQ29udmVydGVyIGJ1aWxkSmF2YU51bGxDb252ZXJ0ZXIoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KTsKKwkKKwlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBidWlsZEphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqcnBtLCBTdHJpbmcgbmFtZSwgSm9pbmluZ1N0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSk7CisJCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhRmlsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYUZpbGUuamF2YQppbmRleCBjYTE0NzNmLi43OWRiNTNiIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhRmlsZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFGaWxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTEsMTIgKzExLDExIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CiAKIC8qKgotICogQSBKcGFQcm9qZWN0IGNvbnRhaW5zIEpwYSBmaWxlcyBmb3IgYWxsIElGaWxlcyBpbiB0aGUgcHJvamVjdCB0aGF0Ci0gKiBhcmUgcmVsZXZhbnQgdG8gdGhlIEpwYVBsYXRmb3JtLgotICogQHNlZSBKcGFGYWN0b3J5I2hhc1JlbGV2YW50Q29udGVudChJRmlsZSksIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBtb3ZlZCB0byBKcGFQbGF0Zm9ybQorICogQSBKUEEgUHJvamVjdCBjb250YWlucyBKUEEgZmlsZXMgZm9yIGFsbCBmaWxlcyBpbiB0aGUgcHJvamVjdCB0aGF0CisgKiBhcmUgcmVsZXZhbnQgdG8gdGhlIEpQQSBzcGVjLgogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjQsNzYgKzIzLDY2IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhRmlsZSBleHRlbmRzIEpwYU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgSnBhRmlsZQorCWV4dGVuZHMgSnBhTm9kZQogewogCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBvZiByZXNvdXJjZSByZXByZXNlbnRlZCBieSB0aGlzIEpQQSBmaWxlCi0JICogQHNlZSBSZXNvdXJjZU1vZGVsI2dldFJlc291cmNlVHlwZSgpCi0JICovCi0JU3RyaW5nIGdldFJlc291cmNlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBKUEEgZmlsZQorCSAqIFJldHVybiB0aGUgSlBBIGZpbGUncyBFY2xpcHNlIGZpbGUuCiAJICovCiAJSUZpbGUgZ2V0RmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBtb2RlbCByZXByZXNlbnRlZCBieSB0aGlzIEpQQSBmaWxlCi0JICovCi0JUmVzb3VyY2VNb2RlbCBnZXRSZXNvdXJjZU1vZGVsKCk7CiAJCiAJLyoqCi0JICogRm9yd2FyZCB0aGUgSmF2YSBlbGVtZW50IGNoYW5nZWQgZXZlbnQgdG8gdGhlIEpQQSBmaWxlJ3MgY29udGVudC4KKwkgKiBSZXR1cm4gdGhlIEpQQSBmaWxlJ3MgY29udGVudCB0eXBlLgogCSAqLwotCXZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBKUEEgcmVzb3VyY2UgbW9kZWwgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZS4KLQkgKi8KLQl2b2lkIHVwZGF0ZUZyb21SZXNvdXJjZSgpOwotCi0JLyoqCi0JICogVGhlIEpQQSBmaWxlIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgSlBBIHByb2plY3QuIENsZWFuIHVwIGFueQotCSAqIGhvb2tzIHRvIGV4dGVybmFsIHJlc291cmNlcyBldGMuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci0JCi0KLQkvLyAqKioqKioqKioqKioqKioqIHJvb3Qgc3RydWN0dXJlIG5vZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKTsKIAkKIAkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHJvb3Qgc3RydWN0dXJlIG5vZGVzIGNvbGxlY3Rpb24KKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIG1vZGVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpQQSBmaWxlOyB0eXBpY2FsbHkgYSBKUEEKKwkgKiBjb21waWxhdGlvbiB1bml0LCBhIEpQQSBYTUwgcmVzb3VyY2UsIG9yIGEgSlBBIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCAoSkFSKS4KIAkgKi8KLQlTdHJpbmcgUk9PVF9TVFJVQ1RVUkVfTk9ERVNfQ09MTEVDVElPTiA9ICJyb290U3RydWN0dXJlTm9kZXMiOworCUpwYVJlc291cmNlTW9kZWwgZ2V0UmVzb3VyY2VNb2RlbCgpOwogCQogCS8qKgotCSAqIFJldHVybiB0aGUgcm9vdCBjb250ZXh0IG1vZGVsIG9iamVjdHMgcmVwcmVzZW50ZWQgYnkgdGhpcyBKUEEgZmlsZS4KKwkgKiBDb252ZW5pZW5jZSBtZXRob2QuIFJldHVybiB0aGUgcmVzb3VyY2UgbW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUgSlBBCisJICogZmlsZSBpZiB0aGUgZmlsZSdzIGNvbnRlbnQgaXMgYSAia2luZC1vZiIgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGU7CisJICogb3RoZXJ3aXNlLCByZXR1cm4gbnVsbC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIGNsaWVudCBoYXMgbG9va2VkIHVwIHRoZQorCSAqIEpQQSBmaWxlIHZpYSBhIGZpbGUgbmFtZSBbYW5kIGFzc3VtZWQgY29udGVudCB0eXBlXS4KKwkgKiBAc2VlICNnZXRSZXNvdXJjZU1vZGVsKCkKKwkgKi8KKwlKcGFSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKTsKKwkKKwkKKwkvLyAqKioqKioqKioqIHJvb3Qgc3RydWN0dXJlIG5vZGVzICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgSlBBIGZpbGUncyByb290IHN0cnVjdHVyZSBub2Rlcy4KIAkgKi8KIAlJdGVyYXRvcjxKcGFTdHJ1Y3R1cmVOb2RlPiByb290U3RydWN0dXJlTm9kZXMoKTsKLQkKKwkJU3RyaW5nIFJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04gPSAicm9vdFN0cnVjdHVyZU5vZGVzIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygcm9vdCBjb250ZXh0IG1vZGVsIG9iamVjdHMgcmVwcmVzZW50ZWQgYnkgdGhpcyBKUEEgZmlsZS4KKwkgKiBSZXR1cm4gdGhlIGNvdW50IG9mIHRoZSBKUEEgZmlsZSdzIHJvb3QgY29udGV4dCBtb2RlbCBvYmplY3RzLgogCSAqLwogCWludCByb290U3RydWN0dXJlTm9kZXNTaXplKCk7CiAKIAkvKioKLQkgKiBBZGQgYSByb290IGNvbnRleHQgbW9kZWwgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgSlBBIGZpbGUuCisJICogQWRkIGEgcm9vdCBzdHJ1Y3R1cmUgbm9kZS4KIAkgKiBUaGVyZSBpcyB0aGUgcG90ZW50aWFsIGZvciBtdWx0aXBsZSByb290IHN0cnVjdHVyZSBub2RlcyAKLQkgKiBmb3IgYSBwYXJ0aWN1bGFyIGtleS4gIEZvciBleGFtcGxlIGEgamF2YSBmaWxlIHRoYXQgaXMgbGlzdGVkCisJICogZm9yIGEgcGFydGljdWxhciBrZXkuIEZvciBleGFtcGxlLCBhIEphdmEgZmlsZSB0aGF0IGlzIGxpc3RlZAogCSAqIGJvdGggYXMgYSA8Y2xhc3M+IGluIHRoZSBwZXJzaXN0ZW5jZS54bWwgYW5kIGFzIGFuIDxlbnRpdHk+IGluCi0JICogYW4gb3JtLnhtbCBmaWxlLiAgSW4gdGhpcyBjYXNlIHRoZSBvcm0ueG1sIGZpbGUgbmVlZHMgdG8gc2V0Ci0JICogdGhlIHJvb3Qgc3RydWN0dXJlIG5vZGUgYWZ0ZXIgdGhlIGphdmEgY2xhc3MgcmVmZXJlbmNlLgotCSAqIExhc3Qgb25lIGluIGR1cmluZyBwcm9qZWN0IHVwZGF0ZSB3aW5zLgotCSAqIAotCSAqIENhbGwgcmVtb3ZlUm9vdFN0cnVjdHVyZU5vZGUoT2JqZWN0KSB0byBjbGVhbiB1cCB3aGVuIGEgZmlsZSBpcwotCSAqIGRlbGV0ZWQuCisJICogYW4gb3JtLnhtbCBmaWxlLiBJbiB0aGlzIGNhc2UgdGhlIG9ybS54bWwgZmlsZSBuZWVkcyB0byBzZXQKKwkgKiB0aGUgcm9vdCBzdHJ1Y3R1cmUgbm9kZSBhZnRlciB0aGUgSmF2YSBjbGFzcyByZWZlcmVuY2UuCisJICogTGFzdCBvbmUgaW4gZHVyaW5nIHByb2plY3QgInVwZGF0ZSIgd2lucy4KIAkgKi8KLQl2b2lkIGFkZFJvb3RTdHJ1Y3R1cmVOb2RlKE9iamVjdCBrZXksIEpwYVN0cnVjdHVyZU5vZGUgcm9vdFN0cnVjdHVyZU5vZGUpOwkKLQkKKwl2b2lkIGFkZFJvb3RTdHJ1Y3R1cmVOb2RlKE9iamVjdCBrZXksIEpwYVN0cnVjdHVyZU5vZGUgcm9vdFN0cnVjdHVyZU5vZGUpOworCisJLyoqCisJICogQHNlZSAjYWRkUm9vdFN0cnVjdHVyZU5vZGUoT2JqZWN0LCBKcGFTdHJ1Y3R1cmVOb2RlKQorCSAqLwogCXZvaWQgcmVtb3ZlUm9vdFN0cnVjdHVyZU5vZGUoT2JqZWN0IGtleSk7CiAKIAkvKioKLQkgKiBSZXR1cm4gdGhlIHN0cnVjdHVyZSBub2RlIGJlc3QgcmVwcmVzZW50ZWQgYnkgdGhlIGxvY2F0aW9uIGluIHRoZSBmaWxlLgorCSAqIFJldHVybiB0aGUgc3RydWN0dXJlIG5vZGUgYmVzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgZmlsZS4KIAkgKi8KIAlKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpOwogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFNb2RlbC5qYXZhCmluZGV4IDg0MjEzNGYuLjA5NTE4ZTUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFNb2RlbC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFNb2RlbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMTUgKzksMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlOwogCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwogCiAvKioKLSAqIFRoZSBKUEEgbW9kZWwgaG9sZHMgYWxsIHRoZSBKUEEgcHJvamVjdHMuCi0gKiAKKyAqIFRoZSBKUEEgbW9kZWwgaG9sZHMgYWxsIHRoZSBKUEEgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4KKyAqIDxwPgogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKICAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCkBAIC0yNywzNCArMjUsNDUgQEAKIHB1YmxpYyBpbnRlcmZhY2UgSnBhTW9kZWwgZXh0ZW5kcyBNb2RlbCB7CiAKIAkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QuCi0JICogUmV0dXJuIG51bGwgaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdAotCSAqIHdpdGggYSBKUEEgcHJvamVjdC4KKwkgKiBSZXR1cm4gdGhlIEpQQSBtb2RlbCdzIEpQQSBwcm9qZWN0cy4KIAkgKi8KLQlKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgSlBBIG1vZGVsIGNvbnRhaW5zIGEgSlBBIHByb2plY3QgY29ycmVzcG9uZGluZwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgotCSAqLwotCWJvb2xlYW4gY29udGFpbnNKcGFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgbW9kZWwncyBKUEEgcHJvamVjdHMuIFRoaXMgaGFzIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucywKLQkgKiBpdCB3aWxsIGJ1aWxkIGFsbCB0aGUgSlBBIHByb2plY3RzLgotCSAqLwotCUl0ZXJhdG9yPEpwYVByb2plY3Q+IGpwYVByb2plY3RzKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9QUk9KRUNUU19DT0xMRUNUSU9OID0gImpwYVByb2plY3RzIjsKKwlJdGVyYWJsZTxKcGFQcm9qZWN0PiBnZXRKcGFQcm9qZWN0cygpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfUFJPSkVDVFNfQ09MTEVDVElPTiA9ICJqcGFQcm9qZWN0cyI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgogCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgSlBBIG1vZGVsJ3MgbGlzdCBvZiBKUEEgcHJvamVjdHMuCiAJICovCi0JaW50IGpwYVByb2plY3RzU2l6ZSgpOwotCQorCWludCBnZXRKcGFQcm9qZWN0c1NpemUoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KKwkgKiBSZXR1cm4gbnVsbCBpZiB1bmFibGUgdG8gYXNzb2NpYXRlIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0CisJICogd2l0aCBhIEpQQSBwcm9qZWN0LgorCSAqLworCUpwYVByb2plY3QgZ2V0SnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KTsKKwogCS8qKgogCSAqIFJldHVybiB0aGUgSlBBIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgZmlsZSwKIAkgKiBvciBudWxsIGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIHNwZWNpZmllZCBmaWxlIHdpdGggYSBKUEEgZmlsZS4KIAkgKi8KLQlKcGFGaWxlIGdldEpwYUZpbGUoSUZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb247CisJSnBhRmlsZSBnZXRKcGFGaWxlKElGaWxlIGZpbGUpOworCisJLyoqCisJICogVGhlIEpQQSBzZXR0aW5ncyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QKKwkgKiBoYXZlIGNoYW5nZWQgaW4gc3VjaCBhIHdheSBhcyB0byByZXF1aXJlIHRoZSBhc3NvY2lhdGVkCisJICogSlBBIHByb2plY3QgdG8gYmUgY29tcGxldGVseSByZWJ1aWx0CisJICogKGUuZy4gd2hlbiB0aGUgdXNlciBjaGFuZ2VzIGEgcHJvamVjdCdzIEpQQSBwbGF0Zm9ybSkuCisJICovCisJdm9pZCByZWJ1aWxkSnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KTsKKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCdzIEphdmEgY2hhbmdlIGxpc3RlbmVyIGlzIGFjdGl2ZS4KKwkgKi8KKwlib29sZWFuIGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSgpOworCisJLyoqCisJICogU2V0IHdoZXRoZXIgdGhlIG1vZGVsJ3MgSmF2YSBjaGFuZ2UgbGlzdGVuZXIgaXMgYWN0aXZlLgorCSAqLworCXZvaWQgc2V0SmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcklzQWN0aXZlKGJvb2xlYW4gamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcklzQWN0aXZlKTsKIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYU5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFOb2RlLmphdmEKaW5kZXggNjllMzcyOS4uYjg1ZDg5YyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYU5vZGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhTm9kZS5qYXZhCkBAIC05LDEyICs5LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKIAogLyoqCi0gKiBKUEEtc3BlY2lmaWMgcHJvdG9jb2wuCisgKiBKUEEtc3BlY2lmaWMgcHJvdG9jb2wuIEFsbCBKUEEgb2JqZWN0cyBiZWxvbmcgdG8gYSBKUEEgcHJvamVjdCwgYXJlCisgKiBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSwgYW5kIGhhdmUgYSBwYXJlbnQgKGV4Y2VwdGluZyB0aGUgSlBBIHByb2plY3QpLgogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjIsMjMgKzIyLDE2IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhTm9kZSBleHRlbmRzIE1vZGVsLCBJQWRhcHRhYmxlCitwdWJsaWMgaW50ZXJmYWNlIEpwYU5vZGUKKwlleHRlbmRzIE1vZGVsLCBJQWRhcHRhYmxlLCBJUmVzb3VyY2VQYXJ0CiB7Ci0KIAkvKioKIAkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0IHRoZSBub2RlIGJlbG9uZ3MgdG8uCiAJICovCiAJSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCk7CiAKIAkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIHRoYXQgbW9zdCBkaXJlY3RseSBjb250YWlucyB0aGUgbm9kZS4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgSnBhSGVscGVyLgotCSAqLwotCUlSZXNvdXJjZSBnZXRSZXNvdXJjZSgpOwotCi0JLyoqCiAJICogUmV0dXJuIHRoZSBKUEEgbm9kZSdzIHBhcmVudC4gVGhlIEpQQSBwcm9qZWN0IHdpbGwgbm90IGhhdmUgYSBwYXJlbnQuCiAJICovCiAJSnBhTm9kZSBnZXRQYXJlbnQoKTsKLQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYVBsYXRmb3JtLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUGxhdGZvcm0uamF2YQppbmRleCA3ZWJjNzlmLi5kMjUwYjVhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUGxhdGZvcm0uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUGxhdGZvcm0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDMwICs5LDM5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZTsKIAotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLk51bGxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5OdWxsSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuTnVsbFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZUZpbmRlcjsKIAogLyoqCiAgKiBUaGlzIGludGVyZmFjZSBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIEpQQSB2ZW5kb3IgdG8gcHJvdmlkZSBleHRlbnNpb25zIHRvIAotICogdGhlIGNvcmUgSlBBIG1vZGVsLiAgVGhlIGNvcmUgSlBBIG1vZGVsIHdpbGwgcHJvdmlkZSBmdW5jdGlvbmFsaXR5IGZvciBKUEEKLSAqIHNwZWMgYW5ub3RhdGlvbnMgaW4gamF2YSwgcGVyc2lzdGVuY2UueG1sIGFuZCAob3JtLnhtbCkgbWFwcGluZyBmaWxlcy4KLSAqIFRoZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5nZW5lcmljUGxhdGZvcm0gZXh0ZW5zaW9uIHN1cHBsaWVzIAotICogcmVzb3VyY2UgbW9kZWxzIGZvciB0aG9zZSBmaWxlIHR5cGVzLiAgQXMgYW5vdGhlciB2ZW5kb3Igb3B0aW9uIHlvdSAKKyAqIHRoZSBjb3JlIEpQQSBtb2RlbC4gVGhlIGNvcmUgSlBBIG1vZGVsIHdpbGwgcHJvdmlkZSBmdW5jdGlvbmFsaXR5IGZvciBKUEEKKyAqIHNwZWMgYW5ub3RhdGlvbnMgaW4gSmF2YSwgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBhbmQgbWFwcGluZworICogKDxjb2RlPm9ybS54bWw8L2NvZGU+KSBmaWxlcy4KKyAqIFRoZSA8Y29kZT5vcmcuZWNsaXBzZS5qcHQuY29yZS5nZW5lcmljPC9jb2RlPiBleHRlbnNpb24gc3VwcGxpZXMgCisgKiByZXNvdXJjZSBtb2RlbHMgZm9yIHRob3NlIGZpbGUgdHlwZXMuIEFzIGFub3RoZXIgdmVuZG9yIG9wdGlvbiB5b3UgCiAgKiB3aWxsIGhhdmUgdG8gc3VwcGx5IHRob3NlIHJlc291cmNlIG1vZGVscyBhcyB3ZWxsIG9yIGRpZmZlcmVudCBvbmVzIAotICogYXMgbmVjZXNzYXJ5LgotICogCi0gKiBTZWUgdGhlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYVBsYXRmb3JtIGV4dGVuc2lvbiBwb2ludAotICogCisgKiBhcyBuZWNlc3NhcnkuIEluIHRoZSBleHRlbnNpb24gcG9pbnQgeW91IGFjdHVhbGx5IHByb3ZpZGUgYQorICoge0BsaW5rIEpwYVBsYXRmb3JtRmFjdG9yeX0gdGhhdCB3aWxsIGJ1aWxkIHRoZSBKUEEgcGxhdGZvcm0uCisgKiA8cD4KICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCiAgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogPHA+CisgKiBTZWUgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYVBsYXRmb3JtczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgorICogQHNlZSBKcGFQbGF0Zm9ybUZhY3RvcnkKKyAqIEBzZWUgSnBhUGxhdGZvcm1Qcm92aWRlcgogICovCiBwdWJsaWMgaW50ZXJmYWNlIEpwYVBsYXRmb3JtCiB7CkBAIC00MCwxMDEgKzQ5LDE2NyBAQAogCSAqIEdldCB0aGUgSUQgZm9yIHRoaXMgcGxhdGZvcm0KIAkgKi8KIAlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgSUQgZm9yIHRoaXMgcGxhdGZvcm0uICBUaGlzIGlzIGFuIGV4dGVuc2lvbgotCSAqIHNvIHlvdSBjYW4ndCB1c2UgYSBub24tZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiAqKioqKioqKioqKioqCi0JICogKiBJTVBPUlRBTlQgKiAgRm9yIElOVEVSTkFMIHVzZSBvbmx5ISEKLQkgKiAqKioqKioqKioqKioqCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdGhlSWQpOwotCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBNb2RlbCBjb25zdHJ1Y3Rpb24gLyB1cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQogCS8qKgotCSAqIENvbnN0cnVjdCBhIEpQQSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUsIHRvIGJlIGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgCi0JICogSlBBIHByb2plY3QuIChEZWZlciB0byB0aGUgZmFjdG9yeSBmb3IgYWN0dWFsIG9iamVjdCBjcmVhdGlvbi4pICAKLQkgKiBSZXR1cm4gbnVsbCBpZiB1bmFibGUgdG8gY3JlYXRlIHRoZSBKUEEgZmlsZSAoZS5nLiB0aGUgY29udGVudCB0eXBlIGlzIAotCSAqIHVucmVjb2duaXplZCkuCisJICogR2V0IHRoZSB2ZXJzaW9uIG9iamVjdCBmb3IgdGhpcyBwbGF0Zm9ybS4gCiAJICovCi0JSnBhRmlsZSBidWlsZEpwYUZpbGUoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlKTsKKwlWZXJzaW9uIGdldEpwYVZlcnNpb24oKTsKIAkKKwkvLyAqKioqKioqKioqIGZhY3RvcnkgKioqKioqKioqKgorCiAJLyoqCiAJICogUmV0dXJuIGEgZmFjdG9yeSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgY29yZSAoZS5nLiBKcGFQcm9qZWN0KSwgcmVzb3VyY2UKIAkgKiAoZS5nLiBQZXJzaXN0ZW5jZVJlc291cmNlKSwgYW5kIGNvbnRleHQgKGUuZy4gUGVyc2lzdGVuY2VVbml0KSBtb2RlbAogCSAqIG9iamVjdHMKIAkgKi8KIAlKcGFGYWN0b3J5IGdldEpwYUZhY3RvcnkoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIEphdmEgYW5ub3RhdGlvbiBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCisKKworCS8vICoqKioqKioqKiogSlBBIGZpbGVzICoqKioqKioqKioKKwogCS8qKgotCSAqIFJldHVybiBhbiBhbm5vdGF0aW9uIHByb3ZpZGVyIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB3aGF0IGFubm90YXRpb25zCi0JICogYXJlIHN1cHBvcnRlZCBhbmQgY29uc3RydWN0aW5nIGphdmEgcmVzb3VyY2UgbW9kZWwgb2JqZWN0cworCSAqIFJldHVybiBhIEpQQSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBFY2xpcHNlIGZpbGUuCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGZpbGUncyBjb250ZW50IGlzIHVuc3VwcG9ydGVkLgorCSAqLworCUpwYUZpbGUgYnVpbGRKcGFGaWxlKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSk7CisKKworCS8vICoqKioqKioqKiogSmF2YSBhbm5vdGF0aW9ucyAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gYW4gYW5ub3RhdGlvbiBwcm92aWRlciByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgd2hhdCBKYXZhCisJICogYW5ub3RhdGlvbnMgYXJlIHN1cHBvcnRlZCBhbmQgY29uc3RydWN0aW5nIGphdmEgcmVzb3VyY2UgbW9kZWwgb2JqZWN0cy4KIAkgKi8KIAlKcGFBbm5vdGF0aW9uUHJvdmlkZXIgZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZyBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogQnVpbGQgYSBKYXZhIHR5cGUgbWFwcGluZyB3aXRoIHRoZSBnaXZlbiBtYXBwaW5nIGtleSBhbmQgcGFyZW50LiAgVGhyb3dzIGEgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogaWYgdGhlIHR5cGVNYXBwaW5nS2V5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybS4KLQkgKiBPdmVycmlkZSB7QGxpbmsgI0dlbmVyaWNKcGFQbGF0Zm9ybS5hZGRKYXZhVHlwZU1hcHBpbmdQcm92aWRlcnNUbyhDb2xsZWN0aW9uPEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyPil9Ci0JICogdG8gYWRkIG5ldyBzdXBwb3J0ZWQgdHlwZSBtYXBwaW5ncyB0byB0aGUgcGxhdGZvcm0KLQkgKi8KLQlKYXZhVHlwZU1hcHBpbmcgYnVpbGRKYXZhVHlwZU1hcHBpbmdGcm9tTWFwcGluZ0tleShTdHJpbmcgdHlwZU1hcHBpbmdLZXksIEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpOwotCQotCS8qKgotCSAqIEJ1aWxkIGEgSmF2YSB0eXBlIG1hcHBpbmcgd2l0aCB0aGUgZ2l2ZW4gbWFwcGluZyBhbm5vdGF0aW9uIGFuZCBwYXJlbnQuICBUaHJvd3MgYSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiBpZiB0aGUgbWFwcGluZyBhbm5vdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybS4KLQkgKiBPdmVycmlkZSB7QGxpbmsgI0dlbmVyaWNKcGFQbGF0Zm9ybS5hZGRKYXZhVHlwZU1hcHBpbmdQcm92aWRlcnNUbyhDb2xsZWN0aW9uPEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyPil9Ci0JICogdG8gYWRkIG5ldyBzdXBwb3J0ZWQgdHlwZSBtYXBwaW5ncyB0byB0aGUgcGxhdGZvcm0KLQkgKi8KLQlKYXZhVHlwZU1hcHBpbmcgYnVpbGRKYXZhVHlwZU1hcHBpbmdGcm9tQW5ub3RhdGlvbihTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lLCBKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KTsKLQotCS8vICoqKioqKioqKioqKioqKiogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZyBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKIAkvKioKLQkgKiBCdWlsZCBhIEphdmEgYXR0cmlidXRlIG1hcHBpbmcgd2l0aCB0aGUgZ2l2ZW4gbWFwcGluZyBrZXkgYW5kIHBhcmVudC4gIFRocm93cyBhIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIGlmIHRoZSBhdHRyaWJ1dGVNYXBwaW5nS2V5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybS4KLQkgKiBPdmVycmlkZSB7QGxpbmsgI0dlbmVyaWNKcGFQbGF0Zm9ybS5hZGRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyc1RvKENvbGxlY3Rpb248SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4pfQotCSAqIHRvIGFkZCBuZXcgc3VwcG9ydGVkIGF0dHJpYnV0ZSBtYXBwaW5ncyB0byB0aGUgcGxhdGZvcm0KKwkgKiBSZXR1cm4gYSBmb3JtYXR0ZXIgdGhhdCBjYW4gY2xlYW4gdXAgdGhlIEphdmEgYW5ub3RhdGlvbnMgYWRkZWQgdG8gc291cmNlCisJICogY29kZS4KIAkgKi8KLQlKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZEphdmFBdHRyaWJ1dGVNYXBwaW5nRnJvbU1hcHBpbmdLZXkoU3RyaW5nIGF0dHJpYnV0ZU1hcHBpbmdLZXksIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7CisJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKTsKKworCisJLy8gKioqKioqKioqKiBKYXZhIHR5cGUvYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKioKIAkKIAkvKioKLQkgKiBCdWlsZCBhIEphdmEgYXR0cmlidXRlIG1hcHBpbmcgd2l0aCB0aGUgZ2l2ZW4gbWFwcGluZyBhbm5vdGF0aW9uIGFuZCBwYXJlbnQuICBUaHJvd3MgYSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiBpZiB0aGUgbWFwcGluZyBhbm5vdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybS4KLQkgKiBPdmVycmlkZSB7QGxpbmsgI0dlbmVyaWNKcGFQbGF0Zm9ybS5hZGRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyc1RvKENvbGxlY3Rpb248SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4pfQotCSAqIHRvIGFkZCBuZXcgc3VwcG9ydGVkIGF0dHJpYnV0ZSBtYXBwaW5ncyB0byB0aGUgcGxhdGZvcm0KKwkgKiBSZXR1cm4gYSB7QGxpbmsgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbn0gdGhhdCBkZXNjcmliZXMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSB0eXBlCisJICogYXMgaXQgZXhpc3RzLCBjb21wbGV0ZSB3aXRoIGFubm90YXRpb25zLgorCSAqIFRoaXMgbWF5IG5vdCBiZSBudWxsIChAc2VlIHtAbGluayBOdWxsSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbn0sKSBlbHNlCisJICogYW4ge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaXMgdGhyb3duLgorCSAqIAorCSAqIEBwYXJhbSB0eXBlIFRoZSBwZXJzaXN0ZW50IHR5cGUgdG8gYW5hbHl6ZQorCSAqIEByZXR1cm4gVGhlIG1hcHBpbmcgZGVmaW5pdGlvbiB1c2VkIHRvIGRlc2NyaWJlIHRoZSBhbm5vdGF0ZWQgc3RhdGUgb2YgdGhlIHR5cGUKIAkgKi8KLQlKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZEphdmFBdHRyaWJ1dGVNYXBwaW5nRnJvbUFubm90YXRpb24oU3RyaW5nIG1hcHBpbmdBbm5vdGF0aW9uTmFtZSwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKKwlKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGdldEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIHR5cGUpOwogCQogCS8qKgotCSAqIEJ1aWxkIGEgZGVmYXVsdCBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5nIHdpdGggdGhlIGdpdmVuIG1hcHBpbmcgYW5ub3RhdGlvbiBhbmQgcGFyZW50LiAgVGhyb3dzIGEgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogaWYgdGhlIG1hcHBpbmcgYW5ub3RhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcGxhdGZvcm0uCi0JICogT3ZlcnJpZGUge0BsaW5rICNHZW5lcmljSnBhUGxhdGZvcm0uYWRkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzVG8oQ29sbGVjdGlvbjxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4pfQotCSAqIHRvIGFkZCBuZXcgc3VwcG9ydGVkIGF0dHJpYnV0ZSBtYXBwaW5ncyB0byB0aGUgcGxhdGZvcm0KKwkgKiBSZXR1cm4gYSB7QGxpbmsgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbn0gZm9yIHRoZSBnaXZlbiBtYXBwaW5nIGtleS4KKwkgKiBUaHJvdyBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZiB0aGUga2V5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLgogCSAqLwotCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7CisJSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBnZXRKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KTsKIAkKIAkvKioKLQkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBtYXBwaW5nIGtleSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZWZhdWx0IGF0cmlidXRlIG1hcHBpbmcKLQkgKiB0aGF0IGFwcGxpZXMgdG8gdGhlIEphdmEgcGVyc2lzdGVudCBhdHRyaWJ1dGUuICBUaGlzIHdpbGwgYmUgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZSdzCi0JICogdHlwZS4gIFNlZSB7QGxpbmsgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuI2RlZmF1bHRBcHBsaWVzKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKX0KKwkgKiBSZXR1cm4gYSB7QGxpbmsgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ufSB0aGF0IGRlc2NyaWJlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGF0dHJpYnV0ZQorCSAqIGFzIGl0IGV4aXN0cywgaWdub3JpbmcgYWxsIGFubm90YXRpb25zLgorCSAqIFRoaXMgbWF5IG5vdCBiZSBudWxsIChAc2VlIHtAbGluayBOdWxsRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbn0sKSBlbHNlCisJICogYW4ge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaXMgdGhyb3duLgorCSAqIAorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgVGhlIHBlcnNpc3RlbnQgYXR0cmlidXRlIHRvIGFuYWx5emUKKwkgKiBAcmV0dXJuIFRoZSBtYXBwaW5nIGRlZmluaXRpb24gZGVzY3JpYmluZyB0aGUgdW5hbm5vdGF0ZWQgc3RhdGUgb2YgdGhlIGF0dHJpYnV0ZQogCSAqLwotCVN0cmluZyBkZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdLZXkoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCi0JLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCUphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSk7CiAJCiAJLyoqCi0JICogQWRkcyB2YWxpZGF0aW9uIG1lc3NhZ2VzIHRvIHRoZSBncm93aW5nIGxpc3Qgb2YgbWVzc2FnZXMgZm9yIGEgZ2l2ZW4gcHJvamVjdAorCSAqIFJldHVybiBhIHtAbGluayBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb259IHRoYXQgZGVzY3JpYmVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgYXR0cmlidXRlCisJICogYXMgaXQgZXhpc3RzLCBjb21wbGV0ZSB3aXRoIGFubm90YXRpb25zLiAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBhdHRyaWJ1dGUncyBkZWZhdWx0IG1hcHBpbmcKKwkgKiBoYXMgYWxyZWFkeSBiZWVuIGRldGVybWluZWQuCisJICogVGhpcyBtYXkgbm90IGJlIG51bGwgKEBzZWUge0BsaW5rIE51bGxTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb259LCkgZWxzZQorCSAqIGFuIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlzIHRocm93bi4KKwkgKiAKKwkgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSB0byBhbmFseXplCisJICogQHJldHVybiBUaGUgbWFwcGluZyBkZWZpbml0aW9uIGRlc2NyaWJpbmcgdGhlIGFubm90YXRlZCBzdGF0ZSBvZiB0aGUgYXR0cmlidXRlCiAJICovCi0Jdm9pZCBhZGRUb01lc3NhZ2VzKEpwYVByb2plY3QgcHJvamVjdCwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpOworCUphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKTsKIAkKKwkvKioKKwkgKiBSZXR1cm4gYSB7QGxpbmsgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ufSBmb3IgdGhlIGdpdmVuIG1hcHBpbmcga2V5LgorCSAqIFRocm93IGFuIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IGlmIHRoZSBrZXkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0uCisJICovCisJSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSk7CisJCisJCisJLy8gKioqKioqKioqKiByZXNvdXJjZSB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgKioqKioqKioqKgorCQorCS8qKgorCSAqIFJldHVybiBhIHtAbGluayBSZXNvdXJjZURlZmluaXRpb259IHRvIGRlc2NyaWJlIHRoZSBjb250ZXh0IG1vZGVsIGZvciBhIGZpbGUgb2YgdGhlIGdpdmVuCisJICogcmVzb3VyY2UgdHlwZS4KKwkgKiBUaHJvdyBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZiB0aGUgcmVzb3VyY2UgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybS4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIFRoZSByZXNvdXJjZSB0eXBlIG9mIGEgcG90ZW50aWFsIHJlc291cmNlIGRlZmluaXRpb24KKwkgKiBAcmV0dXJuIFRoZSByZXNvdXJjZSBkZWZpbml0aW9uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHN1Y2ggYSBmaWxlCisJICovCisJUmVzb3VyY2VEZWZpbml0aW9uIGdldFJlc291cmNlRGVmaW5pdGlvbihKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG1vc3QgcmVjZW50IHN1cHBvcnRlZCB7QGxpbmsgSnBhUmVzb3VyY2VUeXBlfSBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgdHlwZS4KKwkgKiBUaHJvdyBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZiB0aGUgY29udGVudCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLgorCSAqIAorCSAqIEBwYXJhbSBjb250ZW50VHlwZSBBIGNvbnRlbnQgdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtCisJICogQHJldHVybiBUaGUgbW9zdCByZWNlbnQgcmVzb3VyY2UgdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtCisJICovCisJSnBhUmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKTsKKwkKKwkKKwkvLyAqKioqKioqKioqIGRhdGFiYXNlICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiBhIGNvbm5lY3Rpb24gcmVwb3NpdG9yeSB0aGF0IGNhbiBiZSB1c2VkIHRvIHF1ZXJ5IHRoZSBkYXRhYmFzZQorCSAqIGFib3V0IGRhdGFiYXNlIG1ldGFkYXRhLgorCSAqLworCUNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBnZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKTsKKworCS8qKgorCSAqIFJldHVybiBhbiBlbnRpdHkgZ2VuZXJhdG9yIGRhdGFiYXNlIGFubm90YXRpb24gbmFtZSBidWlsZGVyLCB3aGljaCBpcworCSAqIHVzZWQgYnkgRW50aXR5IEdlbmVyYXRpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW5kIGhvdyB0aGUgZW50aXR5IGdlbmVyYXRvcgorCSAqIHByaW50cyB0aGUgbmFtZXMgb2YgdmFyaW91cyBkYXRhYmFzZSBvYmplY3RzLgorCSAqLworCUVudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGdldEVudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gYSBmaW5kZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBsb29rIHVwIHZhcmlvdXMgb2JqZWN0cyAoc2NoZW1hdGEsCisJICogdGFibGVzLCBjb2x1bW5zLCBldGMuKSBvbiB0aGUgZGF0YWJhc2UsIHJlc3BlY3RpbmcgdGhlIHBsYXRmb3JtJ3MgYW5kCisJICogZGF0YWJhc2UncyBjYXNlLXNlbnNpdGl2aXR5LgorCSAqLworCURhdGFiYXNlRmluZGVyIGdldERhdGFiYXNlRmluZGVyKCk7CisKKwkKKwkvLyAqKioqKioqKioqIHBsYXRmb3JtIHZhcmlhdGlvbiAqKioqKioqKioqCisJLyoqCisJICogUmV0dXJuIGEgcGxhdGZvcm0gdmFyaWF0aW9uIHRoYXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgZGlmZmVyZW5jZXMgcGxhdGZvcm1zIGFuZC9vciBKUEEgc3BlY2lmaWNhdGlvbiB2ZXJzaW9ucworCSAqLworCUpwYVBsYXRmb3JtVmFyaWF0aW9uIGdldEpwYVZhcmlhdGlvbigpOworCisJCisJaW50ZXJmYWNlIFZlcnNpb24gCisJeworCQkvKioKKwkJICogUmV0dXJuIHRoZSBwbGF0Zm9ybSdzIHZlcnNpb24uCisJCSAqLworCQlTdHJpbmcgZ2V0VmVyc2lvbigpOworCQkKKwkJLyoqCisJCSAqIFJldHVybiB0aGUgaGlnaGVzdCBKUEEgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0uCisJCSAqIEBzZWUgSnB0Q29yZVBsdWdpbiNKUEFfRkFDRVRfVkVSU0lPTl8xXzAKKwkJICogQHNlZSBKcHRDb3JlUGx1Z2luI0pQQV9GQUNFVF9WRVJTSU9OXzJfMAorCQkgKi8KKwkJU3RyaW5nIGdldEpwYVZlcnNpb24oKTsKKwkJCisJCS8qKgorCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGxhdGZvcm0gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgSlBBCisJCSAqIHNwZWNpZmljYXRpb24gdmVyc2lvbi4KKwkJICogQHNlZSBKcHRDb3JlUGx1Z2luI0pQQV9GQUNFVF9WRVJTSU9OXzFfMAorCQkgKiBAc2VlIEpwdENvcmVQbHVnaW4jSlBBX0ZBQ0VUX1ZFUlNJT05fMl8wCisJCSAqLworCQlib29sZWFuIGlzQ29tcGF0aWJsZVdpdGhKcGFWZXJzaW9uKFN0cmluZyBqcGFWZXJzaW9uKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQyNjIyNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgSlBBIHZlbmRvciB0byBidWlsZCBhCisgKiB7QGxpbmsgSnBhUGxhdGZvcm19LgorICogPHA+CisgKiBTZWUgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYVBsYXRmb3JtczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgorICogPHA+CisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBKcGFQbGF0Zm9ybUZhY3RvcnkgeworCS8qKgorCSAqIEJ1aWxkIHRoZSBKUEEgcGxhdGZvcm0gd2l0aCB0aGUgc3BlY2lmaWVkIElELgorCSAqLworCUpwYVBsYXRmb3JtIGJ1aWxkSnBhUGxhdGZvcm0oU3RyaW5nIGlkKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNTJlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgSlBBIHZlbmRvciB0byBwcm92aWRlIGV4dGVuc2lvbnMgdG8gCisgKiB0aGUgY29yZSBKUEEgbW9kZWwuICBUaGUgY29yZSBKUEEgbW9kZWwgd2lsbCBwcm92aWRlIGZ1bmN0aW9uYWxpdHkgZm9yIEpQQQorICogc3BlYyBhbm5vdGF0aW9ucyBpbiBqYXZhLCBwZXJzaXN0ZW5jZS54bWwgYW5kIG1hcHBpbmcgKG9ybS54bWwpIGZpbGVzLgorICogVGhlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmdlbmVyaWMgZXh0ZW5zaW9uIHN1cHBsaWVzIAorICogcmVzb3VyY2UgbW9kZWxzIGZvciB0aG9zZSBmaWxlIHR5cGVzIGluIEdlbmVyaWNKcGFQbGF0Zm9ybVByb3ZpZGVyLiAKKyAqIAorICogVGhpcyBKcGFQbGF0Zm9ybVByb3ZpZGVyIGltcGxlbWVudGF0aW9uIG1vc3QgbGlrZWx5IG9ubHkgcmV0dXJucyBwcm92aWRlcnMKKyAqIHRoYXQgYXJlIGV4dGVuc2lvbnMgb2Ygb3RoZXIgcGxhdGZvcm1zLiAgVGhlbiBpbiB0aGUgR2VuZXJpY0pwYVBsYXRmb3JtIGltcGxlbWVudGF0aW9uCisgKiB5b3UgcGFzcyBpbiAxIG9yIG1vcmUgSnBhUGxhdGZvcm1Qcm92aWRlcnMuCisgKiAKKyAqIFNlZSB0aGUgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhUGxhdGZvcm1zIGV4dGVuc2lvbiBwb2ludAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBKcGFQbGF0Zm9ybVByb3ZpZGVyCit7CisJLyoqCisJICogUmV0dXJuIHRoZSBtb3N0IHJlY2VudCByZXNvdXJjZSB0eXBlIGZvciB0aGUgZ2l2ZW4gY29udGVudCB0eXBlIHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtCisJICovCisJcHVibGljIEpwYVJlc291cmNlVHlwZSBnZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBtb2RlbCBwcm92aWRlcnMgdGhhdCBhcHBseSB0byB0aGlzIHBsYXRmb3JtLgorCSAqLworCUxpc3RJdGVyYXRvcjxKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI+IHJlc291cmNlTW9kZWxQcm92aWRlcnMoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgZGVmaW5pdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgcGxhdGZvcm0uCisJICovCisJTGlzdEl0ZXJhdG9yPFJlc291cmNlRGVmaW5pdGlvbj4gcmVzb3VyY2VEZWZpbml0aW9ucygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBqYXZhIHR5cGUgbWFwcGluZyBkZWZpbml0aW9ucyB0aGF0IGFwcGx5IHRvIHRoaXMgcGxhdGZvcm0uCisJICovCisJTGlzdEl0ZXJhdG9yPEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24+IGphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBtYXBwaW5nIGRlZmluaXRpb25zIHRvIHVzZSBmb3IgZGVmYXVsdCBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyBmb3IgdGhpcyBwbGF0Zm9ybS4KKwkgKi8KKwlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBtYXBwaW5nIGRlZmluaXRpb25zIHRvIHVzZSBmb3Igc3BlY2lmaWVkIGphdmEgYXR0cmlidXRlIG1hcHBpbmdzIGZvciB0aGlzIHBsYXRmb3JtLgorCSAqLworCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IHNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFQbGF0Zm9ybVZhcmlhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYVBsYXRmb3JtVmFyaWF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlZGYyNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFQbGF0Zm9ybVZhcmlhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmU7CisKKy8qKgorICogQSBKcGFQbGF0Zm9ybSBjb250YWlucyBhIEpwYVBsYXRmb3JtVmFyaWF0aW9uLiAgVGhpcyBpcyB1c2VkIGZvciB2YXJpb3VzIGpwYSBzcGVjCisgKiBpdGVtcyB0aGF0IGFyZSBlaXRoZXIgb3B0aW9uYWwgb3Igb25seSBzdXBwb3J0ZWQgYnkgY2VydGFpbiB2ZXJzaW9uIG9mIHRoZSBzcGVjLgorICogRWFjaCBwbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbiBtdXN0IGRldGVybWluZSBpZiBpdCBzdXBwb3J0cyB0aGVzZSB0aGluZ3MuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSnBhUGxhdGZvcm1WYXJpYXRpb24KK3sKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaXMgYSBzdXBwb3J0ZWQKKwkgKiBpbmhlcml0YW5jZSBzdHJhdGVneSBpbiB0aGUgSlBBIHBsYXRmb3JtLgorCSAqIFN1cHBvcnRlZC5NQVlCRSBtZWFucyB0aGF0IGl0IGlzIGluIHRoZSBKUEEgc3BlYywgYnV0IG5vdCBwb3J0YWJsZQorCSAqIG9yIG1pZ2h0IG5vdCBiZSBzdXBwb3J0ZWQgYnkgYSBwYXJ0aWN1bGFyIHByb3ZpZGVyLiAKKwkgKiBAcmV0dXJuCisJICovCisJU3VwcG9ydGVkIGdldFRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQoKTsKKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSByZWxhdGlvbnNoaXAgbWFwcGluZyB0aGF0IHVzZXMgYSBqb2luIHRhYmxlCisJICogY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBhbiBhc3NvY2lhdGlvbiBvdmVycmlkZS4KKwkgKi8KKwlib29sZWFuIGlzSm9pblRhYmxlT3ZlcnJpZGFibGUoKTsKKwkKKworCXB1YmxpYyBlbnVtIFN1cHBvcnRlZCB7CisJCS8qKgorCQkgKiBmdWxseSBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtCisJCSAqLworCQlZRVMsCisJCQorCQkvKioKKwkJICogbm90IHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0KKwkJICovCisJCU5PLAorCQkKKwkJLyoqCisJCSAqIGluIHRoZSBKUEEgc3BlYywgbWlnaHQgbm90IHN1cHBvcnRlZCBiZSBzdXBwb3J0ZWQgYnkgYSBwYXJ0aWN1bGFyIHByb3ZpZGVyCisJCSAqLworCQlNQVlCRSwKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUHJvamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYVByb2plY3QuamF2YQppbmRleCAyYjRhYmI1Li40ZjYzZGE4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUHJvamVjdC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFQcm9qZWN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsMzYgKzEwLDUyIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ2F0YWxvZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3JQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwogCiAvKioKLSAqIAotICogCisgKiBBIEpQQSBwcm9qZWN0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBFY2xpcHNlIHByb2plY3QgKGFuZCBpdHMgY29ycmVzcG9uZGluZworICogSmF2YSBwcm9qZWN0KS4gSXQgaG9sZHMgdGhlICJyZXNvdXJjZSIgbW9kZWwgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdmFyaW91cworICogSlBBLXJlbGF0ZWQgcmVzb3VyY2VzICh0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLCBpdHMgbWFwcGluZyBmaWxlcworICogWzxjb2RlPm9ybS54bWw8L2NvZGU+XSwKKyAqIGFuZCB0aGUgSmF2YSBzb3VyY2UgZmlsZXMpLiBJdCBhbHNvIGhvbGRzIHRoZSAiY29udGV4dCIgbW9kZWwgdGhhdCByZXByZXNlbnRzCisgKiB0aGUgSlBBIG1ldGFkYXRhLCBhcyBkZXJpdmVkIGZyb20gc3BlYy1kZWZpbmVkIGRlZmF1bHRzLCBKYXZhIHNvdXJjZSBjb2RlCisgKiBhbm5vdGF0aW9ucywgYW5kIFhNTCBkZXNjcmlwdG9ycy4KKyAqIDxwPgogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKICAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhUHJvamVjdCBleHRlbmRzIEpwYU5vZGUgeworcHVibGljIGludGVyZmFjZSBKcGFQcm9qZWN0CisJZXh0ZW5kcyBKcGFOb2RlCit7CisKKwkvLyAqKioqKioqKioqIGdlbmVyYWwgKioqKioqKioqKgogCiAJLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIG5hbWUsIHdoaWNoIGlzIHRoZSBFY2xpcHNlIHByb2plY3QncyBuYW1lLgorCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QncyBuYW1lLCB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgYXNzb2NpYXRlZAorCSAqIEVjbGlwc2UgcHJvamVjdCdzIG5hbWUuCiAJICovCiAJU3RyaW5nIGdldE5hbWUoKTsKIApAQCAtNjAsOTUgKzc2LDMwIEBACiAJSnBhUGxhdGZvcm0gZ2V0SnBhUGxhdGZvcm0oKTsKIAogCS8qKgotCSAqIFJldHVybiB0aGUgcHJvamVjdCdzIGNvbm5lY3Rpb24KKwkgKiBSZXR1cm4gdGhlIHJvb3Qgb2YgdGhlIEpQQSBwcm9qZWN0J3MgY29udGV4dCBtb2RlbC4KIAkgKi8KLQlDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpOworCUpwYVJvb3RDb250ZXh0Tm9kZSBnZXRSb290Q29udGV4dE5vZGUoKTsKIAogCS8qKgotCSAqIFJldHVybiB0aGUgcHJpbWFyeSBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdCwgd2hpY2ggdW5sZXNzIG92ZXJyaWRkZW4sIAotCSAqIGlzIHRoZSBkZWZhdWx0IHNjaGVtYSBmcm9tIHRoZSBjb25uZWN0aW9uCi0JICogQHNlZSBKcGFQcm9qZWN0I2dldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKQotCSAqIEByZXR1cm4gVGhlIGRlZmF1bHQgc2NoZW1hLiAgTWF5IGJlIG51bGwgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGNvbm5lY3RlZC4KKwkgKiBUaGUgSlBBIHByb2plY3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBKUEEgbW9kZWwuIENsZWFuIHVwIGFueQorCSAqIGhvb2tzIHRvIGV4dGVybmFsIHJlc291cmNlcyBldGMuCiAJICovCi0JU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVzZXIgc3BlY2lmaWVkIHNjaGVtYSB0byBiZSB1c2VkIGFzIGEgZGVmYXVsdCBmb3IgdGhpcyBwcm9qZWN0LgotCSAqIEBzZWUgSnBhUHJvamVjdCNnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSgpCi0JICogQHJldHVybiAgVGhlIHVzZXIgc3BlY2lmaWVkIGRlZmF1bHQgc2NoZW1hLiBNYXkgYmUgbnVsbCBpZiB0aGUgY29ubmVjdGlvbgotCSAqICAgaXMgbm90IGNvbm5lY3RlZCBvciBpZiB0aGUgdXNlciBoYXMgbm90IG92ZXJyaWRkZW4gdGhlIHNjaGVtYSAoaW1wbGllcyAKLQkgKiAgIHRoZSBkZWZhdWx0IHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBzaG91bGQgYmUgdXNlZCkuCi0JICovCi0JU2NoZW1hIGdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGEgc291cmNlIHRoZSBKUEEgcHJvamVjdCBpcyBtYXBwZWQgdG8uCi0JICovCi0JSnBhRGF0YVNvdXJjZSBnZXREYXRhU291cmNlKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB1c2VyIG92ZXJyaWRlIGRlZmF1bHQgc2NoZW1hIG5hbWUgKioqKioqKioqKioqKioqKioqKioqKgotCQorCXZvaWQgZGlzcG9zZSgpOworCisKKwkvLyAqKioqKioqKioqIEpQQSBmaWxlcyAqKioqKioqKioqCisKIAkvKiogCi0JICogSUQgc3RyaW5nIHVzZWQgd2hlbiB1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSBwcm9wZXJ0eSBpcyBjaGFuZ2VkLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWwjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCisJICogSUQgc3RyaW5nIHVzZWQgd2hlbiB0aGUgSlBBIHByb2plY3QncyBjb2xsZWN0aW9uIG9mIEpQQSBmaWxlcyBjaGFuZ2VzLgorCSAqIEBzZWUgI2FkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcikKIAkgKi8KLQlTdHJpbmcgVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQV9OQU1FX1BST1BFUlRZID0gInVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lIjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNjaGVtYSB0byBiZSB1c2VkIGFzIGEgZGVmYXVsdCBmb3IgdGhlIHByb2plY3QKLQkgKiBpbnN0ZWFkIG9mIHRoZSBvbmUgdGhhdCBpcyBkZWZhdWx0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICogQHJldHVybiBUaGUgc2NoZW1hIG5hbWUuIE1heSBiZSBudWxsIChpbXBsaWVzIHRoYXQgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZQotCSAqICAgZGVmYXVsdCBzY2hlbWEgc2hvdWxkIGJlIHVzZWQpLgotCSAqLwotCVN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgc2NoZW1hIHRvIGJlIHVzZWQgYXMgYSBkZWZhdWx0IGZvciB0aGUgcHJvamVjdAotCSAqIGluc3RlYWQgb2YgdGhlIG9uZSB0aGF0IGlzIGRlZmF1bHRseSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbm5lY3Rpb24gcHJvZmlsZS4KLQkgKiBAcGFyYW1ldGVyIGRlZmF1bHRTY2hlbWFOYW1lIC0gVGhlIGRlZmF1bHQgc2NoZW1hIG5hbWUgdG8gdXNlIGluc3RlYWQgb2YKLQkgKiAgIHRoZSBkZWZhdWx0IHNjaGVtYSBvZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlLiBNYXkgYmUgbnVsbCAoaW1wbGllcyB0aGF0Ci0JICogICB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGRlZmF1bHQgc2NoZW1hIHNob3VsZCBiZSB1c2VkKS4KLQkgKi8KLQl2b2lkIHNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKFN0cmluZyBkZWZhdWx0U2NoZW1hTmFtZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBkaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKiAKLQkgKiBJRCBzdHJpbmcgdXNlZCB3aGVuIGRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMgcHJvcGVydHkgaXMgY2hhbmdlZC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCVN0cmluZyBESVNDT1ZFUlNfQU5OT1RBVEVEX0NMQVNTRVNfUFJPUEVSVFkgPSAiZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcyI7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIEpQQSBwcm9qZWN0IHdpbGwgImRpc2NvdmVyIiBhbm5vdGF0ZWQgY2xhc3NlcwotCSAqIGF1dG9tYXRpY2FsbHksIGFzIG9wcG9zZWQgdG8gcmVxdWlyaW5nIHRoZSBjbGFzc2VzIHRvIGJlCi0JICogbGlzdGVkIGluIHBlcnNpc3RlbmNlLnhtbC4KLQkgKi8KLQlib29sZWFuIGRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoKTsKLQkKLQkvKioKLQkgKiBTZXQgd2hldGhlciB0aGUgSlBBIHByb2plY3Qgd2lsbCAiZGlzY292ZXIiIGFubm90YXRlZCBjbGFzc2VzCi0JICogYXV0b21hdGljYWxseSwgYXMgb3Bwb3NlZCB0byByZXF1aXJpbmcgdGhlIGNsYXNzZXMgdG8gYmUKLQkgKiBsaXN0ZWQgaW4gcGVyc2lzdGVuY2UueG1sLgotCSAqLwotCXZvaWQgc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyhib29sZWFuIGRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKioganBhIGZpbGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKiogCi0JICogSUQgc3RyaW5nIHVzZWQgd2hlbiBqcGFGaWxlcyBjb2xsZWN0aW9uIGlzIGNoYW5nZWQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbCNhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JU3RyaW5nIEpQQV9GSUxFU19DT0xMRUNUSU9OID0gImpwYUZpbGVzIjsKKwlTdHJpbmcgSlBBX0ZJTEVTX0NPTExFQ1RJT04gPSAianBhRmlsZXMiOyAvLyROT04tTkxTLTEkCiAKIAkvKioKIAkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0J3MgSlBBIGZpbGVzLgogCSAqLwogCUl0ZXJhdG9yPEpwYUZpbGU+IGpwYUZpbGVzKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIEpQQSBwcm9qZWN0J3MgSlBBIGZpbGVzLgogCSAqLwpAQCAtMTU2LDEzMCArMTA3LDE0OCBAQAogCiAJLyoqCiAJICogUmV0dXJuIHRoZSBKUEEgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB1bmFibGUgdG8gYXNzb2NpYXRlIHRoZSBnaXZlbiBmaWxlCi0JICogd2l0aCBhIEpQQSBmaWxlLgorCSAqIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIEpQQSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGZpbGUuCiAJICovCiAJSnBhRmlsZSBnZXRKcGFGaWxlKElGaWxlIGZpbGUpOwogCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIEpQQSBmaWxlcyBmb3IgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUgSUQuCi0JICogVGhlIGNvbnRlbnQgdHlwZSBJRCBzaG91bGQgbWF0Y2ggdGhhdCBnaXZlbiBpbiB0aGUKLQkgKiBKUEEgZmlsZSBjb250ZW50IHByb3ZpZGVyLgorCisJLy8gKioqKioqKioqKiBleHRlcm5hbCBKYXZhIHJlc291cmNlIGNvbXBpbGF0aW9uIHVuaXRzICoqKioqKioqKioKKworCS8qKiAKKwkgKiBJRCBzdHJpbmcgdXNlZCB3aGVuIHRoZSBKUEEgcHJvamVjdCdzIGNvbGxlY3Rpb24gb2YgZXh0ZXJuYWwgSmF2YQorCSAqIHJlc291cmNlIGNvbXBpbGF0aW9uIHVuaXRzIGNoYW5nZXMuCisJICogQHNlZSAjYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZywgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKQogCSAqLwotCUl0ZXJhdG9yPEpwYUZpbGU+IGpwYUZpbGVzKFN0cmluZyBjb250ZW50VHlwZUlkKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhcmlvdXMgcXVlcmllcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIHJvb3QgImRlcGxveSBwYXRoIi4KLQkgKiBKUEEgcHJvamVjdHMgYXNzb2NpYXRlZCB3aXRoIFdlYiBwcm9qZWN0cyByZXR1cm4gIldFQi1JTkYvY2xhc3NlcyI7Ci0JICogYWxsIG90aGVycyBzaW1wbHkgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KLQkgKi8KLQlTdHJpbmcgZ2V0Um9vdERlcGxveUxvY2F0aW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgSnBhUm9vdENvbnRleHROb2RlfSByZXByZXNlbnRpbmcgdGhlIEpQQSBjb250ZW50IG9mIHRoaXMgcHJvamVjdAotCSAqLwotCUpwYVJvb3RDb250ZXh0Tm9kZSBnZXRSb290Q29udGV4dCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIEpQQSBwcm9qZWN0J3MgYW5ub3RhdGVkIGNsYXNzZXMuCi0JICovCi0JSXRlcmF0b3I8U3RyaW5nPiBhbm5vdGF0ZWRDbGFzc05hbWVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHBlcnNpc3RlbnQgdHlwZSByZXNvdXJjZSBmb3IgdGhlIHNwZWNpZmllZCBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lOwotCSAqIG51bGwsIGlmIG5vbmUgZXhpc3RzLgotCSAqLwotCS8vIFRPRE8gcmVuYW1lIGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFN0cmluZykKLQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShTdHJpbmcgdHlwZU5hbWUpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKioganBhIG1vZGVsIHN5bmNocm9uaXphdGlvbiBhbmQgbGlmZWN5Y2xlICoqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgSlBBIHByb2plY3QncyBKUEEgZmlsZXMgd2l0aCB0aGUgc3BlY2lmaWVkIHJlc291cmNlCi0JICogZGVsdGEsIHdhdGNoaW5nIGZvciBhZGRlZCBhbmQgcmVtb3ZlZCBmaWxlcy4KLQkgKi8KLQl2b2lkIHN5bmNocm9uaXplSnBhRmlsZXMoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uOworCVN0cmluZyBFWFRFUk5BTF9KQVZBX1JFU09VUkNFX0NPTVBJTEFUSU9OX1VOSVRTX0NPTExFQ1RJT04gPSAiZXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzIjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogRm9yd2FyZCB0aGUgSmF2YSBlbGVtZW50IGNoYW5nZSBldmVudCB0byB0aGUgSlBBIHByb2plY3QncyBKUEEgZmlsZXMuCisJICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIGV4dGVybmFsIEphdmEgcmVzb3VyY2UgY29tcGlsYXRpb24gdW5pdHMuCisJICovCisJSXRlcmF0b3I8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0PiBleHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgSlBBIHByb2plY3QncyBleHRlcm5hbCBKYXZhIHJlc291cmNlIGNvbXBpbGF0aW9uIHVuaXRzLgorCSAqLworCWludCBleHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHNTaXplKCk7CisKKworCS8vICoqKioqKioqKiogZXh0ZXJuYWwgSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IHR5cGVzICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QncyBleHRlcm5hbCBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZSBjYWNoZS4KKwkgKi8KKwlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlIGdldEV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZSgpOworCisKKwkvLyAqKioqKioqKioqIFhNTCByZXNvdXJjZXMgKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIHRoZSBYTUwgcmVzb3VyY2UgbW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUgZmlsZQorCSAqIDxjb2RlPk1FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbDwvY29kZT4gaWYgdGhhdCBmaWxlIGhhcyB0aGUgcGVyc2lzdGVuY2UgY29udGVudCB0eXBlCisJICogKDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZW50LnBlcnNpc3RlbmNlIjwvY29kZT4pLgorCSAqIAorCSAqIEBzZWUgSnB0Q29yZVBsdWdpbi5ERUZBVUxUX1BFUlNJU1RFTkNFX1hNTF9GSUxFX1BBVEgKKwkgKi8KKwlKcGFYbWxSZXNvdXJjZSBnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBYTUwgcmVzb3VyY2UgbW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGZpbGUKKwkgKiBpZiB0aGF0IGZpbGUgaGFzIHRoZSBtYXBwaW5nIGZpbGUgY29udGVudCB0eXBlCisJICogKDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZW50Lm1hcHBpbmdGaWxlIjwvY29kZT4pCisJICogCisJICogQHNlZSBKcHRDb3JlUGx1Z2luI01BUFBJTkdfRklMRV9DT05URU5UX1RZUEUKKwkgKi8KKwlKcGFYbWxSZXNvdXJjZSBnZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKFN0cmluZyBmaWxlUGF0aCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIFhNTCByZXNvdXJjZSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWxlCisJICogPGNvZGU+TUVUQS1JTkYvb3JtLnhtbDwvY29kZT4gaWYgdGhhdCBmaWxlIGhhcyB0aGUgbWFwcGluZyBmaWxlIGNvbnRlbnQgdHlwZS4KKwkgKiAKKwkgKiBAc2VlIEpwdENvcmVQbHVnaW4jREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSAorCSAqLworCUpwYVhtbFJlc291cmNlIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOworCQorCQorCS8vICoqKioqKioqKiogSmF2YSByZXNvdXJjZXMgKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgSlBBIHByb2plY3QncyBhbm5vdGF0ZWQgSmF2YSBjbGFzc2VzCisJICogKGlnbm9yaW5nIGNsYXNzZXMgaW4gSkFScyByZWZlcmVuY2VkIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwpLgorCSAqLworCUl0ZXJhdG9yPFN0cmluZz4gYW5ub3RhdGVkSmF2YVNvdXJjZUNsYXNzTmFtZXMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBKUEEgcHJvamVjdCdzIG1hcHBlZCAoaS5lLiBhbm5vdGF0ZWQgd2l0aCBARW50aXR5LCBldGMuKSBKYXZhIAorCSAqIGNsYXNzZXMgKGlnbm9yaW5nIGNsYXNzZXMgaW4gSkFScyByZWZlcmVuY2VkIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwpLgorCSAqLworCUl0ZXJhdG9yPFN0cmluZz4gbWFwcGVkSmF2YVNvdXJjZUNsYXNzTmFtZXMoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4KKwkgKiBSZXR1cm4gbnVsbCBpZiBpbnZhbGlkIG9yIGFic2VudC4KKwkgKi8KKwlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShTdHJpbmcgdHlwZU5hbWUpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBKYXZhIHJlc291cmNlIHBhY2thZ2UgZnJhZ2VtZW50IHJvb3QgZm9yIHRoZSBzcGVjaWZpZWQgSkFSLgorCSAqIFJldHVybiBudWxsIGlmIGFic2VudC4KKwkgKi8KKwlKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IGdldEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QoU3RyaW5nIGphckZpbGVOYW1lKTsKKworCisJLy8gKioqKioqKioqKiBtb2RlbCBzeW5jaHJvbml6YXRpb24gKioqKioqKioqKgorCisJLyoqCisJICogU3luY2hyb25pemUgdGhlIEpQQSBwcm9qZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwcm9qZWN0IHJlc291cmNlCisJICogZGVsdGEsIHdhdGNoaW5nIGZvciBhZGRlZCBhbmQgcmVtb3ZlZCBmaWxlcyBpbiBwYXJ0aWN1bGFyLgorCSAqLworCXZvaWQgcHJvamVjdENoYW5nZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpOworCisJLyoqCisJICogU3luY2hyb25pemUgdGhlIEpQQSBwcm9qZWN0IHdpdGggdGhlIHNwZWNpZmllZCBKYXZhIGNoYW5nZS4KIAkgKi8KIAl2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KTsKIAotCS8qKgotCSAqIFRoZSBKUEEgcHJvamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIEpQQSBtb2RlbC4gQ2xlYW4gdXAgYW55Ci0JICogaG9va3MgdG8gZXh0ZXJuYWwgcmVzb3VyY2VzIGV0Yy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHByb2plY3QncyB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotCSAqLwotCUl0ZXJhdG9yPElNZXNzYWdlPiB2YWxpZGF0aW9uTWVzc2FnZXMoKTsKIAotCS8qKgotCSAqIEFkZCB0byB0aGUgbGlzdCBvZiBjdXJyZW50IHZhbGlkYXRpb24gbWVzc2FnZXMKLQkgKi8KLQl2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpOwotCi0KLQkvLyAqKioqKioqKioqKioqKioqIHN1cHBvcnQgZm9yIG1vZGlmeWluZyBzaGFyZWQgZG9jdW1lbnRzICoqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgYSB0aHJlYWQtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIENvbW1hbmRFeGVjdXRvcgotCSAqIGludGVyZmFjZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBleGVjdXRlIGEgY29tbWFuZCB0byBtb2RpZnkgYSBzaGFyZWQKLQkgKiBkb2N1bWVudC4gSWYgbmVjZXNzYXJ5LCB0aGUgY29tbWFuZCBleGVjdXRvciBjYW4gYmUgY2xlYXJlZCBieQotCSAqIHNldHRpbmcgaXQgdG8gbnVsbC4KLQkgKiBUaGlzIGFsbG93cyBiYWNrZ3JvdW5kIGNsaWVudHMgdG8gbW9kaWZ5IGRvY3VtZW50cyB0aGF0IGFyZQotCSAqIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgVUkuIFNlZSBpbXBsZW1lbnRhdGlvbnMgb2YgQ29tbWFuZEV4ZWN1dG9yLgotCSAqLwotCXZvaWQgc2V0VGhyZWFkTG9jYWxNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcihDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvamVjdC13aWRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21tYW5kRXhlY3V0b3JQcm92aWRlcgotCSAqIGludGVyZmFjZS4KLQkgKi8KLQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBnZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCk7Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogcHJvamVjdCAidXBkYXRlIiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkvLyAqKioqKioqKioqIHByb2plY3QgInVwZGF0ZSIgKioqKioqKioqKgogCiAJLyoqCiAJICogUmV0dXJuIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVXBkYXRlcgotCSAqIGludGVyZmFjZSB0aGF0IHdpbGwgYmUgdXNlZCB0byAidXBkYXRlIiBhIEpQQSBwcm9qZWN0LgorCSAqIGludGVyZmFjZSB0aGF0IHdpbGwgYmUgdXNlZCB0byAidXBkYXRlIiB0aGUgSlBBIHByb2plY3QuCiAJICovCiAJVXBkYXRlciBnZXRVcGRhdGVyKCk7CiAKIAkvKioKIAkgKiBTZXQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVcGRhdGVyCi0JICogaW50ZXJmYWNlIHRoYXQgd2lsbCBiZSB1c2VkIHRvICJ1cGRhdGUiIGEgSlBBIHByb2plY3QuCi0JICogQmVmb3JlIHNldHRpbmcgdGhlIHVwZGF0ZXIsIENsaWVudHMgc2hvdWxkIHNhdmUgdGhlIGN1cnJlbnQgdXBkYXRlciBzbworCSAqIGludGVyZmFjZSB0aGF0IHdpbGwgYmUgdXNlZCB0byAidXBkYXRlIiB0aGUgSlBBIHByb2plY3QuCisJICogQmVmb3JlIHNldHRpbmcgdGhlIHVwZGF0ZXIsIGNsaWVudHMgc2hvdWxkIHNhdmUgdGhlIGN1cnJlbnQgdXBkYXRlciBzbwogCSAqIGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlci4KIAkgKi8KIAl2b2lkIHNldFVwZGF0ZXIoVXBkYXRlciB1cGRhdGVyKTsKIAogCS8qKgotCSAqIFNvbWV0aGluZyBpbiB0aGUgSlBBIHByb2plY3QgaGFzIGNoYW5nZWQsICJ1cGRhdGUiIHRob3NlIHBhcnRzIG9mIHRoZQorCSAqIFRoZSBKUEEgcHJvamVjdCdzIHN0YXRlIGhhcyBjaGFuZ2VkLCAidXBkYXRlIiB0aG9zZSBwYXJ0cyBvZiB0aGUKIAkgKiBKUEEgcHJvamVjdCB0aGF0IGFyZSBkZXBlbmRlbnQgb24gb3RoZXIgcGFydHMgb2YgdGhlIEpQQSBwcm9qZWN0LgotCSAqIFRoaXMgaXMgY2FsbGVkIHdoZW4KLQkgKiAtIFRoZSBKUEEgcHJvamVjdCB1cGRhdGVyIGlzIGNoYW5nZWQge0BsaW5rIEpwYVByb2plY3Qjc2V0VXBkYXRlcihVcGRhdGVyKX0KLQkgKiAtIGFueXRoaW5nIGluIHRoZSBKUEEgcHJvamVjdCBjaGFuZ2VzCi0JICogLSB0aGUgSlBBIHByb2plY3QncyBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGNoYW5nZWQsIG9wZW5lZCwgb3IgY2xvc2VkCisJICogVGhpcyBpcyBjYWxsZWQgd2hlbjx1bD4KKwkgKiA8bGk+KGFsbW9zdCkgYW55IHN0YXRlIGluIHRoZSBKUEEgcHJvamVjdCBjaGFuZ2VzCisJICogPGxpPnRoZSBKUEEgcHJvamVjdCdzIGRhdGFiYXNlIGNvbm5lY3Rpb24gaXMgY2hhbmdlZCwgb3BlbmVkLCBvciBjbG9zZWQKKwkgKiA8L3VsPgogCSAqLwogCXZvaWQgdXBkYXRlKCk7CiAKIAkvKioKIAkgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayB1c2VkIGJ5IHRoZSB1cGRhdGVyIHRvIHBlcmZvcm0gdGhlIGFjdHVhbAotCSAqICJ1cGRhdGUiLgorCSAqICJ1cGRhdGUiLCB3aGljaCBtb3N0IGxpa2VseSB3aWxsIGhhcHBlbiBhc3luY2hyb25vdXNseS4KIAkgKi8KIAlJU3RhdHVzIHVwZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwogCisJLyoqCisJICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgdXNlZCBieSB0aGUgdXBkYXRlciB0byBub3RpZnkgdGhlIEpQQSBwcm9qZWN0IHRoYXQKKwkgKiB0aGUgInVwZGF0ZSIgaGFzIHF1aWVzY2VkIChpLmUuIHRoZSAidXBkYXRlIiBoYXMgY29tcGxldGVkIGFuZCB0aGVyZQorCSAqIGFyZSBubyBvdXRzdGFuZGluZyByZXF1ZXN0cyBmb3IgZnVydGhlciAidXBkYXRlcyIpLgorCSAqLworCXZvaWQgdXBkYXRlUXVpZXNjZWQoKTsKKwogCiAJLyoqCiAJICogRGVmaW5lIGEgc3RyYXRlZ3kgdGhhdCBjYW4gYmUgdXNlZCB0byAidXBkYXRlIiBhIEpQQSBwcm9qZWN0IHdoZW5ldmVyCkBAIC0yOTQsMTMgKzI2MywxOSBAQAogCiAJCS8qKgogCQkgKiBVcGRhdGUgdGhlIEpQQSBwcm9qZWN0LgorCQkgKiA8cD4KKwkJICoge0BsaW5rIEpwYVByb2plY3QjdXBkYXRlKCl9IHdpbGwgY2FsbCB7QGxpbmsgVXBkYXRlciN1cGRhdGUoKX0sCisJCSAqIGZyb20gd2hpY2ggdGhlIHVwZGF0ZXIgaXMgdG8gY2FsbCB7QGxpbmsgSnBhUHJvamVjdCN1cGRhdGUoSVByb2dyZXNzTW9uaXRvcil9CisJCSAqIGFzIGFwcHJvcHJpYXRlICh0eXBpY2FsbHkgZnJvbSBhbiBhc3luY2hyb25vdXNseSBleGVjdXRpbmcgam9iKS4KKwkJICogT25jZSB0aGUgdXBkYXRpbmcgaGFzIHF1aWVzY2VkIChpLmUuIHRoZXJlIGFyZSBubyBvdXRzdGFuZGluZyByZXF1ZXN0cworCQkgKiBmb3IgYW5vdGhlciB1cGRhdGUpLCB0aGUgdXBkYXRlciBpcyB0byBjYWxsIHtAbGluayBKcGFQcm9qZWN0I3VwZGF0ZVF1aWVzY2VkKCl9LgogCQkgKi8KIAkJdm9pZCB1cGRhdGUoKTsKIAogCQkvKioKLQkJICogVGhlIEpQQSBwcm9qZWN0IGlzIGRpc3Bvc2VkOyBkaXNwb3NlIHRoZSB1cGRhdGVyLgorCQkgKiBUaGUgSlBBIHByb2plY3QgaXMgZGlzcG9zZWQ7IHN0b3AgdGhlIHVwZGF0ZXIuCiAJCSAqLwotCQl2b2lkIGRpc3Bvc2UoKTsKKwkJdm9pZCBzdG9wKCk7CiAKIAkJLyoqCiAJCSAqIFRoaXMgdXBkYXRlciBkb2VzIG5vdGhpbmcuIFVzZWZ1bCBmb3IgdGVzdGluZy4KQEAgLTMyMCwxOSArMjk1LDE5NiBAQAogCQkJcHVibGljIHZvaWQgdXBkYXRlKCkgewogCQkJCS8vIGRvIG5vdGhpbmcKIAkJCX0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQlwdWJsaWMgdm9pZCBzdG9wKCkgewogCQkJCS8vIGRvIG5vdGhpbmcKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIklKcGFQcm9qZWN0LlVwZGF0ZXIuTnVsbCI7CisJCQkJcmV0dXJuICJKcGFQcm9qZWN0LlVwZGF0ZXIuTnVsbCI7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfQogCiAJfQogCiAKLQkvLyAqKioqKioqKioqKioqKioqIGNvbmZpZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBhIEpQQSBwcm9qZWN0ICoqKioqCisJLy8gKioqKioqKioqKiB1dGlsaXR5ICoqKioqKioqKioKKworCS8qKgorCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgdG8gYSBmaWxlIG1hcHBlZCB0byB0aGUgYXBwcm9wcmlhdGUKKwkgKiBkZXBsb3ltZW50IGxvY2F0aW9uLgorCSAqLworCUlGaWxlIGNvbnZlcnRUb1BsYXRmb3JtRmlsZShTdHJpbmcgZmlsZU5hbWUpOworCisKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIEpQQSBwcm9qZWN0J3MgdmFsaWRhdGlvbiBtZXNzYWdlcy4KKwkgKi8KKwlJdGVyYXRvcjxJTWVzc2FnZT4gdmFsaWRhdGlvbk1lc3NhZ2VzKElSZXBvcnRlciByZXBvcnRlcik7CisKKworCS8vICoqKioqKioqKiogZGF0YWJhc2UgKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIHRoZSBkYXRhIHNvdXJjZSB0aGUgSlBBIHByb2plY3QgaXMgbWFwcGVkIHRvLgorCSAqLworCUpwYURhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZSgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIGNvbm5lY3Rpb24uCisJICogVGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyBudWxsIGlmIHRoZSBKUEEgcHJvamVjdCdzIGNvbm5lY3Rpb24gcHJvZmlsZQorCSAqIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIG5hbWUgb2YgYSBEVFAgY29ubmVjdGlvbiBwcm9maWxlLgorCSAqLworCUNvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0J3MgZGVmYXVsdCBkYXRhYmFzZSBzY2hlbWEgY29udGFpbmVyOworCSAqIHdoaWNoIGlzIGVpdGhlciB0aGUgSlBBIHByb2plY3QncyBkZWZhdWx0IGNhdGFsb2cgb3IgdGhlIEpQQSBwcm9qZWN0J3MKKwkgKiBkYXRhYmFzZSwgZGVwZW5kaW5nIG9uIGhvdyB0aGUgRFRQIG1vZGVsIGlzIGltcGxlbWVudGVkLgorCSAqLworCVNjaGVtYUNvbnRhaW5lciBnZXREZWZhdWx0RGJTY2hlbWFDb250YWluZXIoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QncyBkZWZhdWx0IGNhdGFsb2c7IHdoaWNoIGlzIGVpdGhlciB0aGUgdXNlcgorCSAqIG92ZXJyaWRlIGNhdGFsb2cgb3IgdGhlIGRhdGFiYXNlJ3MgZGVmYXVsdCBjYXRhbG9nLgorCSAqLworCVN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIGRlZmF1bHQgZGF0YWJhc2UgY2F0YWxvZy4KKwkgKiBAc2VlICNnZXREZWZhdWx0Q2F0YWxvZygpCisJICovCisJQ2F0YWxvZyBnZXREZWZhdWx0RGJDYXRhbG9nKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0J3MgZGVmYXVsdCBzY2hlbWE7IHdoaWNoIGNhbiBiZSBvbmUgb2YgdGhlCisJICogZm9sbG93aW5nOjx1bD4KKwkgKiA8bGk+dGhlIHVzZXIgb3ZlcnJpZGUgc2NoZW1hCisJICogPGxpPnRoZSBkZWZhdWx0IGNhdGFsb2cncyBkZWZhdWx0IHNjaGVtYQorCSAqIDxsaT50aGUgZGF0YWJhc2UncyBkZWZhdWx0IHNjaGVtYSAoaWYgY2F0YWxvZ3MgYXJlIG5vdCBzdXBwb3J0ZWQpCisJICogPC91bD4KKwkgKi8KKwlTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIGRlZmF1bHQgZGF0YWJhc2Ugc2NoZW1hLgorCSAqIEBzZWUgI2dldERlZmF1bHRTY2hlbWEoKQorCSAqIEBzZWUgI2dldERlZmF1bHREYlNjaGVtYUNvbnRhaW5lcigpCisJICovCisJU2NoZW1hIGdldERlZmF1bHREYlNjaGVtYSgpOworCisKKwkvLyAqKioqKioqKioqIHVzZXIgb3ZlcnJpZGUgZGVmYXVsdCBjYXRhbG9nICoqKioqKioqKioKKworCS8qKiAKKwkgKiBJRCBzdHJpbmcgdXNlZCB3aGVuIHRoZSBKUEEgcHJvamVjdCdzIHVzZXIgb3ZlcnJpZGUgZGVmYXVsdCBjYXRhbG9nIGNoYW5nZXMuCisJICogQHNlZSAjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCisJICovCisJU3RyaW5nIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZID0gInVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIHRoZSA8ZW0+aWRlbnRpZmllcjwvZW0+IG9mIHRoZSBjYXRhbG9nIHRvIGJlIHVzZWQgYXMgYSBkZWZhdWx0CisJICogZm9yIHRoZSBKUEEgcHJvamVjdCBpbnN0ZWFkIG9mIHRoZSBvbmUgdGhhdCBpcyBhc3NvY2lhdGVkIGJ5IGRlZmF1bHQKKwkgKiB3aXRoIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUuCisJICogQHJldHVybiBUaGUgY2F0YWxvZyBpZGVudGlmaWVyLiBNYXkgYmUgbnVsbCAoaW1wbHlpbmcgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZQorCSAqIGRlZmF1bHQgY2F0YWxvZyBzaG91bGQgYmUgdXNlZCkuCisJICovCisJU3RyaW5nIGdldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCk7CisKKwkvKioKKwkgKiBTZXQgdGhlIDxlbT5pZGVudGlmaWVyPC9lbT4gb2YgdGhlIGNhdGFsb2cgdG8gYmUgdXNlZCBhcyBhIGRlZmF1bHQKKwkgKiBmb3IgdGhlIEpQQSBwcm9qZWN0IGluc3RlYWQgb2YgdGhlIG9uZSB0aGF0IGlzIGFzc29jaWF0ZWQgYnkgZGVmYXVsdAorCSAqIHdpdGggdGhlIGNvbm5lY3Rpb24gcHJvZmlsZS4KKwkgKiBAcGFyYW1ldGVyIGNhdGFsb2cgVGhlIGNhdGFsb2cgaWRlbnRpZmllci4gTWF5IGJlIG51bGwgKGltcGx5aW5nIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUKKwkgKiBkZWZhdWx0IGNhdGFsb2cgc2hvdWxkIGJlIHVzZWQpLgorCSAqLworCXZvaWQgc2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coU3RyaW5nIGNhdGFsb2cpOworCisKKwkvLyAqKioqKioqKioqIHVzZXIgb3ZlcnJpZGUgZGVmYXVsdCBzY2hlbWEgKioqKioqKioqKgorCisJLyoqIAorCSAqIElEIHN0cmluZyB1c2VkIHdoZW4gdGhlIEpQQSBwcm9qZWN0J3MgdXNlciBvdmVycmlkZSBkZWZhdWx0IHNjaGVtYSBjaGFuZ2VzLgorCSAqIEBzZWUgI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQorCSAqLworCVN0cmluZyBVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BX1BST1BFUlRZID0gInVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIDxlbT5pZGVudGlmaWVyPC9lbT4gb2YgdGhlIHNjaGVtYSB0byBiZSB1c2VkIGFzIGEgZGVmYXVsdAorCSAqIGZvciB0aGUgSlBBIHByb2plY3QgaW5zdGVhZCBvZiB0aGUgb25lIHRoYXQgaXMgYXNzb2NpYXRlZCBieSBkZWZhdWx0CisJICogd2l0aCB0aGUgY29ubmVjdGlvbiBwcm9maWxlLgorCSAqIEByZXR1cm4gVGhlIHNjaGVtYSBpZGVudGlmaWVyLiBNYXkgYmUgbnVsbCAoaW1wbHlpbmcgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZQorCSAqIGRlZmF1bHQgc2NoZW1hIHNob3VsZCBiZSB1c2VkKS4KKwkgKi8KKwlTdHJpbmcgZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSgpOworCisJLyoqCisJICogU2V0IHRoZSA8ZW0+aWRlbnRpZmllcjwvZW0+IG9mIHRoZSBzY2hlbWEgdG8gYmUgdXNlZCBhcyBhIGRlZmF1bHQKKwkgKiBmb3IgdGhlIEpQQSBwcm9qZWN0IGluc3RlYWQgb2YgdGhlIG9uZSB0aGF0IGlzIGFzc29jaWF0ZWQgYnkgZGVmYXVsdAorCSAqIHdpdGggdGhlIGNvbm5lY3Rpb24gcHJvZmlsZS4KKwkgKiBAcGFyYW1ldGVyIHNjaGVtYSBUaGUgc2NoZW1hIGlkZW50aWZpZXIuIE1heSBiZSBudWxsIChpbXBseWluZyB0aGUgY29ubmVjdGlvbiBwcm9maWxlCisJICogZGVmYXVsdCBzY2hlbWEgc2hvdWxkIGJlIHVzZWQpLgorCSAqLworCXZvaWQgc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYShTdHJpbmcgc2NoZW1hKTsKKworCisJLy8gKioqKioqKioqKiBkaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyAqKioqKioqKioqCisKKwkvKiogCisJICogSUQgc3RyaW5nIHVzZWQgd2hlbiBkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzIHByb3BlcnR5IGlzIGNoYW5nZWQuCisJICogQHNlZSAjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCisJICovCisJU3RyaW5nIERJU0NPVkVSU19BTk5PVEFURURfQ0xBU1NFU19QUk9QRVJUWSA9ICJkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIEpQQSBwcm9qZWN0IHdpbGwgImRpc2NvdmVyIiBhbm5vdGF0ZWQgY2xhc3NlcworCSAqIGF1dG9tYXRpY2FsbHksIGFzIG9wcG9zZWQgdG8gcmVxdWlyaW5nIHRoZSBjbGFzc2VzIHRvIGJlIGxpc3RlZCBpbiB0aGUKKwkgKiBwZXJzaXN0ZW5jZS54bWwgb3Igb25lIG9mIGl0cyBtYXBwaW5nIGZpbGVzLgorCSAqIFRoaXMgaXMgYSB1c2VyLXNwZWNpZmllZCBwcmVmZXJlbmNlIHRoYXQgaXMgcHJvYmFibHkKKwkgKiBvbmx5IGhlbHBmdWwgd2hlbiBkZXBsb3lpbmcgdG8gYSBKYXZhU0UgZW52aXJvbm1lbnQuIFRoZSBKUEEgc3BlYworCSAqIHNheXMgYW5ub3RhdGVkIGNsYXNzZXMgYXJlIHRvIGJlIGRpc2NvdmVyZWQgYXV0b21hdGljYWxseSBpbiBhIEphdmFFRQorCSAqIGVudmlyb25tZW50OyB3aGlsZSB0aGUgbWFuYWdlZCBwZXJzaXN0ZW5jZSBjbGFzc2VzIG11c3QgYmUgZXhwbGljaXRseQorCSAqIGxpc3RlZCBpbiBhIEphdmFTRSBlbnZpcm9ubWVudDogIkEgbGlzdCBvZiBhbGwgbmFtZWQgbWFuYWdlZCBwZXJzaXN0ZW5jZQorCSAqIGNsYXNzZXMgbXVzdCBiZSBzcGVjaWZpZWQgaW4gSmF2YSBTRSBlbnZpcm9ubWVudHMgdG8gaW5zdXJlIHBvcnRhYmlsaXR5Ii4KKwkgKiBUaGlzIGZsYWcgYWxsb3dzIERhbGkgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aXRoIHRoZSB1c2VyJ3MgSlBBCisJICogaW1wbGVtZW50YXRpb24sIHdoaWNoIG1heSBhbGxvdyAiZGlzY292ZXJ5IiBpbiBhIEphdmFTRSBlbnZpcm9ubWVudAorCSAqIChlLmcuIEVjbGlwc2VMaW5rKS4gVGhpcyBzZXR0aW5nIGNhbiBhbHNvIGJlIHVzZWQgd2hlbiB0aGUgdXNlciB3YW50cworCSAqIHRvIGV4cGxpY2l0bHkgbGlzdCBjbGFzc2VzLCBldmVuIHdoZW4gdGhlIGNsYXNzZXMgYXJlICJkaXNjb3ZlcmVkIgorCSAqIGJ5IHRoZSBKUEEgaW1wbGVtZW50YXRpb24uIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gZmFsc2UsIGVycm9yIG1lc3NhZ2VzCisJICogd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIGFsbCBvZiB0aGUgYW5ub3RhdGVkIGNsYXNzZXMgdGhhdCBhcmUgbm90CisJICogZXhwbGljaXRseSBsaXN0ZWQuCisJICovCisJYm9vbGVhbiBkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCk7CisKKwkvKioKKwkgKiBTZXQgd2hldGhlciB0aGUgSlBBIHByb2plY3Qgd2lsbCAiZGlzY292ZXIiIGFubm90YXRlZCBjbGFzc2VzCisJICogYXV0b21hdGljYWxseSwgYXMgb3Bwb3NlZCB0byByZXF1aXJpbmcgdGhlIGNsYXNzZXMgdG8gYmUgbGlzdGVkIGluIHRoZQorCSAqIHBlcnNpc3RlbmNlLnhtbC4KKwkgKi8KKwl2b2lkIHNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoYm9vbGVhbiBkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKTsKKworCisJLy8gKioqKioqKioqKiBtb2RpZnlpbmcgc2hhcmVkIGRvY3VtZW50cyAqKioqKioqKioqCisKKwkvKioKKwkgKiBTZXQgYSB0aHJlYWQtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBDb21tYW5kRXhlY3V0b3J9CisJICogaW50ZXJmYWNlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGV4ZWN1dGUgYSBjb21tYW5kIHRvIG1vZGlmeSBhIHNoYXJlZAorCSAqIGRvY3VtZW50LiBJZiBuZWNlc3NhcnksIHRoZSBjb21tYW5kIGV4ZWN1dG9yIGNhbiBiZSBjbGVhcmVkIGJ5CisJICogc2V0dGluZyBpdCB0byBudWxsLgorCSAqIFRoaXMgYWxsb3dzIGJhY2tncm91bmQgY2xpZW50cyB0byBtb2RpZnkgZG9jdW1lbnRzIHRoYXQgYXJlCisJICogYWxyZWFkeSBwcmVzZW50IGluIHRoZSBVSS4gU2VlIGltcGxlbWVudGF0aW9ucyBvZiB7QGxpbmsgQ29tbWFuZEV4ZWN1dG9yfS4KKwkgKi8KKwl2b2lkIHNldFRocmVhZExvY2FsTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcik7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHByb2plY3Qtd2lkZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKwkgKiB7QGxpbmsgQ29tbWFuZEV4ZWN1dG9yfSBpbnRlcmZhY2UuCisJICovCisJQ29tbWFuZEV4ZWN1dG9yIGdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCk7CisKKworCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uIGNvbmZpZyAqKioqKioqKioqCiAKIAkvKioKIAkgKiBUaGUgc2V0dGluZ3MgdXNlZCB0byBjb25zdHJ1Y3QgYSBKUEEgcHJvamVjdC4KQEAgLTM1NSwxMyArNTA3LDIwIEBACiAJCSAqIGNvbm5lY3Rpb24gcHJvZmlsZS4pCiAJCSAqLwogCQlTdHJpbmcgZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCk7Ci0JCQorCisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIGNhdGFsb2cgdG8gdXNlIGluc3RlYWQgb2YgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSdzCisJCSAqIGRlZmF1bHQgY2F0YWxvZy4KKwkJICogTWF5IGJlIG51bGwuCisJCSAqLworCQlTdHJpbmcgZ2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coKTsKKwogCQkvKioKIAkJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzY2hlbWEgdG8gdXNlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgc2NoZW1hCiAJCSAqIG9mIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUuCiAJCSAqIE1heSBiZSBudWxsLgogCQkgKi8KLQkJU3RyaW5nIGdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKCk7CisJCVN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCk7CiAKIAkJLyoqCiAJCSAqIFJldHVybiB3aGV0aGVyIHRoZSBuZXcgSlBBIHByb2plY3QgaXMgdG8gImRpc2NvdmVyIiBhbm5vdGF0ZWQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFSZXNvdXJjZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUmVzb3VyY2VNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTNjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUmVzb3VyY2VNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmU7CisKKy8qKgorICogTGlzdGVuZXJzIGFyZSBub3RpZmllZCB3aGVuZXZlciBhbnl0aGluZyBpbiB0aGUgSlBBIHJlc291cmNlIG1vZGVsIGNoYW5nZXMuCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEpwYVJlc291cmNlTW9kZWwgCit7CisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSB0eXBlIG9mIHRoZSBtb2RlbC4gIFRoaXMgbWF5IHBvdGVudGlhbGx5IGNoYW5nZS4KKwkgKiBSZXR1cm4gbnVsbCBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIGNvbnRlbnQgdHlwZSBvciB2ZXJzaW9uIGlzIG51bGwuCisJICovCisJSnBhUmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpOworCQorCS8qKgorCSAqIENoYW5nZXMgdG8gdGhlIHJlc291cmNlIG1vZGVsIHJlc3VsdCBpbiBldmVudHMuCisJICogSW4gcGFydGljdWxhciwgdGhlIEpQQSBwcm9qZWN0IHBlcmZvcm1zIGFuICJ1cGRhdGUiIHdoZW5ldmVyIGEgcmVzb3VyY2UKKwkgKiBtb2RlbCBjaGFuZ2VzLgorCSAqLworCXZvaWQgYWRkUmVzb3VyY2VNb2RlbExpc3RlbmVyKEpwYVJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcik7CisKKwkvKioKKwkgKiBAc2VlICNhZGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoUmVzb3VyY2VNb2RlbExpc3RlbmVyKQorCSAqLworCXZvaWQgcmVtb3ZlUmVzb3VyY2VNb2RlbExpc3RlbmVyKEpwYVJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcik7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUmVzb3VyY2VNb2RlbExpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUmVzb3VyY2VNb2RlbExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkOGQ4NQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFSZXNvdXJjZU1vZGVsTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CisKKy8qKgorICogVGhlIGxpc3RlbmVyIGlzIG5vdGlmaWVkIHdoZW5ldmVyIGFueXRoaW5nIGluIHRoZSBKUEEgcmVzb3VyY2UgbW9kZWwgY2hhbmdlcy4KKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSnBhUmVzb3VyY2VNb2RlbExpc3RlbmVyCisJZXh0ZW5kcyBFdmVudExpc3RlbmVyCit7CisJdm9pZCByZXNvdXJjZU1vZGVsQ2hhbmdlZCgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmQxOWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKKworLyoqCisgKiBNYXAgYSBjb250ZW50IHR5cGUgdG8gYSBKUEEgcmVzb3VyY2UgbW9kZWwuCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEpwYVJlc291cmNlTW9kZWxQcm92aWRlciAKK3sKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGZpbGUgY29udGVudCB0eXBlIHRoZSBwcm92aWRlciBpcyBmb3IuCisJICovCisJSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCk7CisKKwkvKioKKwkgKiBCdWlsZCBhIEpQQSByZXNvdXJjZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBKUEEgcHJvamVjdCBhbmQgZmlsZS4KKwkgKiBVc2UgdGhlIHNwZWNpZmllZCBmYWN0b3J5IGZvciBjcmVhdGlvbiBzbyBleHRlbmRlcnMgY2FuIHNpbXBseSBvdmVycmlkZQorCSAqIHRoZSBhcHByb3ByaWF0ZSBjcmVhdGlvbiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZyBhIHByb3ZpZGVyIGZvciB0aGUKKwkgKiBzYW1lIGNvbnRlbnQuCisJICovCisJSnBhUmVzb3VyY2VNb2RlbCBidWlsZFJlc291cmNlTW9kZWwoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFSZXNvdXJjZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFSZXNvdXJjZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTI3OGRhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYVJlc291cmNlVHlwZS5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7CisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBmaWxlIGNvbnRlbnQgdHlwZSBhbmQgdmVyc2lvbiBmb3IgSlBBIHJlc291cmNlcworICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGNsYXNzIEpwYVJlc291cmNlVHlwZQoreworCS8qKgorCSAqIFZlcnNpb24gdG8gYmUgdXNlZCB3aGVuIHZlcnNpb24gY2FuIG5vdCBiZSBkZXRlcm1pbmVkLCBvciB3aGVuIHRoZXJlIGlzIG5vCisJICogc2Vuc2Ugb2YgdmVyc2lvbiAoZS5nLiBqYXZhKQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOREVURVJNSU5FRF9WRVJTSU9OID0gInVuZGV0ZXJtaW5lZCB2ZXJzaW9uIjsKKwkKKwkKKwlwcm90ZWN0ZWQgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlOworCQorCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbjsKKwkKKwkKKwlwdWJsaWMgSnBhUmVzb3VyY2VUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgeworCQl0aGlzKGNvbnRlbnRUeXBlLCBVTkRFVEVSTUlORURfVkVSU0lPTik7CisJfQorCQorCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlLCBTdHJpbmcgdmVyc2lvbikgeworCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29udGVudCB0eXBlIG1heSBub3QgYmUgbnVsbC4iKTsKKwkJfQorCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWZXJzaW9uIG1heSBub3QgYmUgbnVsbC4iKTsKKwkJfQorCQl0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CisJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247CisJfQorCQorCQorCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7CisJCXJldHVybiB0aGlzLmNvbnRlbnRUeXBlOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiB0aGlzLnZlcnNpb247CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICgob2JqID09IG51bGwpIHx8IChvYmouZ2V0Q2xhc3MoKSAhPSB0aGlzLmdldENsYXNzKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJSnBhUmVzb3VyY2VUeXBlIG90aGVyID0gKEpwYVJlc291cmNlVHlwZSkgb2JqOworCQlyZXR1cm4gdGhpcy5jb250ZW50VHlwZS5lcXVhbHMob3RoZXIuY29udGVudFR5cGUpICYmIHRoaXMudmVyc2lvbi5lcXVhbHMob3RoZXIudmVyc2lvbik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCWludCBoYXNoID0gMzsKKwkJaGFzaCA9IDMxICogaGFzaCArIHRoaXMuY29udGVudFR5cGUuaGFzaENvZGUoKTsKKwkJaGFzaCA9IDMxICogaGFzaCArIHRoaXMudmVyc2lvbi5oYXNoQ29kZSgpOworCQlyZXR1cm4gaGFzaDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCXNiLmFwcGVuZChDbGFzc1Rvb2xzLnRvU3RyaW5nQ2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKKwkJc2IuYXBwZW5kKCcoJyk7CisJCXNiLmFwcGVuZCgiY29udGVudCA9ICIgKyB0aGlzLmNvbnRlbnRUeXBlLnRvU3RyaW5nKCkgKyAnLCcpOworCQlzYi5hcHBlbmQoInZlcnNpb24gPSAiICsgdGhpcy52ZXJzaW9uKTsKKwkJc2IuYXBwZW5kKCcpJyk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFTdHJ1Y3R1cmVOb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnBhU3RydWN0dXJlTm9kZS5qYXZhCmluZGV4IDEzYWNiY2IuLjkyOWQyMzYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcGFTdHJ1Y3R1cmVOb2RlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwYVN0cnVjdHVyZU5vZGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC00NCw5ICs0NCwxNSBAQAogCSAqIFJldHVybiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbGwgb2YgdGhpcyBjbGFzcyBvZiBzdHJ1Y3R1cmUgbm9kZXMKIAkgKi8KIAlTdHJpbmcgZ2V0SWQoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgc3RydWN0dXJlIG5vZGUncyByZXNvdXJjZS4KKwkgKiBUaGlzIGlzIHVzZWQgdG8gZmluZCB0aGUgYXBwcm9wcmlhdGUgdWkgcHJvdmlkZXIgZm9yIGJ1aWxkaW5nIGNvbXBvc2l0ZXMgCisJICovCisJSnBhUmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpOwogCiAJLyoqCi0JICogRGlzcG9zZSBvZiB0aGlzIHN0cnVjdHVyZU5vZGUgYW5kIGRpc3Bvc2Ugb2YgY2hpbCBzdHJ1Y3R1cmVOb2Rlcy4KKwkgKiBEaXNwb3NlIG9mIHRoaXMgc3RydWN0dXJlTm9kZSBhbmQgZGlzcG9zZSBvZiBjaGlsZCBzdHJ1Y3R1cmVOb2Rlcy4KIAkgKiBUeXBpY2FsbHkgdGhpcyB3b3VsZCBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgSnBhRmlsZSByb290U3RydWN0dXJlTm9kZXMuCiAJICovCiAJdm9pZCBkaXNwb3NlKCk7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnB0Q29yZVBsdWdpbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL0pwdENvcmVQbHVnaW4uamF2YQppbmRleCAzMTdjODk1Li41MmUzZjIwIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvSnB0Q29yZVBsdWdpbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9KcHRDb3JlUGx1Z2luLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw0NiArOSw1OCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmU7CiAKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcGFNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucHJlZnMuSnBhUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wcmVmcy5KcGFQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhUGxhdGZvcm1SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcHRDb3JlTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5HZW5lcmljMl8wSnBhUGxhdGZvcm1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKIGltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKIAogLyoqCi0gKiBUaGUgSlBUIHBsdWctaW4gbGlmZWN5Y2xlIGltcGxlbWVudGF0aW9uLgorICogVGhlIERhbGkgY29yZSBwbHVnLWluIGxpZmVjeWNsZSBpbXBsZW1lbnRhdGlvbi4KICAqIEEgbnVtYmVyIG9mIGdsb2JhbGx5LWF2YWlsYWJsZSBjb25zdGFudHMgYW5kIG1ldGhvZHMuCi0gKiAKKyAqIDxwPgogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotLy8gVE9ETyBrZWVwIHByZWZlcmVuY2VzIGluIHN5bmNoIHdpdGggdGhlIEpQQSBwcm9qZWN0Ci0vLyAoY29ubmVjdGlvbiBwcm9maWxlIG5hbWUsICJkaXNjb3ZlciIgZmxhZykKLS8vIHVzZSBsaXN0ZW5lcnM/CiBwdWJsaWMgY2xhc3MgSnB0Q29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7CiAKKwlwcml2YXRlIHZvbGF0aWxlIEdlbmVyaWNKcGFNb2RlbCBqcGFNb2RlbDsKKwlwcml2YXRlIHZvbGF0aWxlIFNlcnZpY2VUcmFja2VyIHBhcnNlclRyYWNrZXI7CisKIAogCS8vICoqKioqKioqKiogcHVibGljIGNvbnN0YW50cyAqKioqKioqKioqCiAKQEAgLTU3LDI0ICs2OSw0NyBAQAogCSAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvcmUiPC9jb2RlPikuCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5jb3JlIjsgIC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSURfID0gUExVR0lOX0lEICsgJy4nOwogCiAJLyoqCiAJICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBKUEEgZmFjZXQKIAkgKiAodmFsdWUgPGNvZGU+ImpwdC5qcGEiPC9jb2RlPikuCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRfSUQgPSAianB0LmpwYSI7ICAvLyROT04tTkxTLTEkCi0KKwkKIAkvKioKLQkgKiBUaGUga2V5IGZvciBzdG9yaW5nIGEgSlBBIHByb2plY3QncyBwbGF0Zm9ybSBpbiB0aGUgRWNsaXBzZQorCSAqIFZlcnNpb24gc3RyaW5nIGZvciBKUEEgZmFjZXQgdmVyc2lvbiAxLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfRkFDRVRfVkVSU0lPTl8xXzAgPSAiMS4wIjsgIC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBWZXJzaW9uIHN0cmluZyBmb3IgSlBBIGZhY2V0IHZlcnNpb24gMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX0ZBQ0VUX1ZFUlNJT05fMl8wID0gIjIuMCI7ICAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogVGhlIGtleSBmb3Igc3RvcmluZyBhIEpQQSBwcm9qZWN0J3MgcGxhdGZvcm0gSUQgaW4gdGhlIEVjbGlwc2UKIAkgKiBwcm9qZWN0J3MgcHJlZmVyZW5jZXMuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX1BMQVRGT1JNID0gUExVR0lOX0lEICsgIi5wbGF0Zm9ybSI7ICAvLyROT04tTkxTLTEkCi0JCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9QTEFURk9STV9QUkVGX0tFWSA9IFBMVUdJTl9JRF8gKyAicGxhdGZvcm0iOyAgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIGtleSBmb3Igc3RvcmluZyB0aGUgZGVmYXVsdCBKUEEgcGxhdGZvcm0gSUQgaW4gdGhlIHdvcmtzcGFjZQorCSAqIHByZWZlcmVuY2VzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0pQQV9QTEFURk9STV9QUkVGX0tFWSA9ICJkZWZhdWx0SnBhUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCisKIAkvKioKIAkgKiBUaGUga2V5IGZvciBzdG9yaW5nIGEgSlBBIHByb2plY3QncyAiZGlzY292ZXIiIGZsYWcgaW4gdGhlIEVjbGlwc2UKIAkgKiBwcm9qZWN0J3MgcHJlZmVyZW5jZXMuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMgPSBQTFVHSU5fSUQgKyAiLmRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyI7ICAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMgPSBQTFVHSU5fSURfICsgImRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyI7ICAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUga2V5IGZvciBzdG9yaW5nIHRoZSBuYW1lIG9mIGEgSlBBIHByb2plY3QncyBtZXRhbW9kZWwgc291cmNlIGZvbGRlcgorCSAqIGluIHRoZSBFY2xpcHNlIHByb2plY3QncyBwcmVmZXJlbmNlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBTU9ERUxfU09VUkNFX0ZPTERFUl9OQU1FID0gUExVR0lOX0lEXyArICJtZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lIjsgIC8vJE5PTi1OTFMtMSQKIAogCS8qKgogCSAqIFRoZSBrZXkgZm9yIHN0b3JpbmcgYSBKUEEgcHJvamVjdCdzIGRhdGEgc291cmNlIGNvbm5lY3Rpb24gcHJvZmlsZSBuYW1lCkBAIC04NCwzMyArMTE5LDg0IEBACiAJCQluZXcgUXVhbGlmaWVkTmFtZShQTFVHSU5fSUQsICJkYXRhU291cmNlLmNvbm5lY3Rpb25Qcm9maWxlTmFtZSIpOyAgLy8kTk9OLU5MUy0xJAogCiAJLyoqCisJICogVGhlIGtleSBmb3Igc3RvcmluZyBhIEpQQSBwcm9qZWN0J3MgdXNlciBvdmVycmlkZGVuIGRlZmF1bHQgY2F0YWxvZyBuYW1lCisJICogaW4gdGhlIEVjbGlwc2UgcHJvamVjdCdzIHBlcnNpc3RlbnQgcHJvcGVydGllcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cgPSAKKwkJbmV3IFF1YWxpZmllZE5hbWUoUExVR0lOX0lELCAidXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dOYW1lIik7ICAvLyROT04tTkxTLTEkCisKKwkvKioKIAkgKiBUaGUga2V5IGZvciBzdG9yaW5nIGEgSlBBIHByb2plY3QncyB1c2VyIG92ZXJyaWRkZW4gZGVmYXVsdCBzY2hlbWEgbmFtZQogCSAqIGluIHRoZSBFY2xpcHNlIHByb2plY3QncyBwZXJzaXN0ZW50IHByb3BlcnRpZXMuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUFfTkFNRSA9IAorCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BID0gCiAJCQluZXcgUXVhbGlmaWVkTmFtZShQTFVHSU5fSUQsICJ1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSIpOyAgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBKUEEgdmFsaWRhdG9yCisJICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGFWYWxpZGF0b3IiPC9jb2RlPikuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX0lEID0gUExVR0lOX0lEXyArICJqcGFWYWxpZGF0b3IiOyAgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIGNvbnRlbnQgdHlwZSBmb3IgSmF2YSBzb3VyY2UgY29kZSBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBKQVZBX1NPVVJDRV9DT05URU5UX1RZUEUgPSBnZXRDb250ZW50VHlwZShKYXZhQ29yZS5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpOwogCQogCS8qKgotCSAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgSlBBIHZhbGlkYXRpb24gbWFya2VyCi0JICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGFQcm9ibGVtTWFya2VyIjwvY29kZT4pLgorCSAqIFRoZSByZXNvdXJjZSB0eXBlIGZvciBKYXZhIHNvdXJjZSBjb2RlIGZpbGVzCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfSUQgPSBQTFVHSU5fSUQgKyAiLmpwYVByb2JsZW1NYXJrZXIiOyAgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VUeXBlIEpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEUgPSBuZXcgSnBhUmVzb3VyY2VUeXBlKEpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSk7CisJCisJLyoqCisJICogVGhlIGNvbnRlbnQgdHlwZSBmb3IgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBQRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFID0gZ2V0SnBhQ29udGVudFR5cGUoInBlcnNpc3RlbmNlIik7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiB2ZXJzaW9uIDEuMCBmaWxlcworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VUeXBlIFBFUlNJU1RFTkNFX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRSA9IAorCQkJbmV3IEpwYVJlc291cmNlVHlwZShQRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFLCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5KUEEuU0NIRU1BX1ZFUlNJT04pOworCQorCS8qKgorCSAqIFRoZSByZXNvdXJjZSB0eXBlIGZvciA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IHZlcnNpb24gMi4wIGZpbGVzCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBKcGFSZXNvdXJjZVR5cGUgUEVSU0lTVEVOQ0VfWE1MXzJfMF9SRVNPVVJDRV9UWVBFID0gCisJCQluZXcgSnBhUmVzb3VyY2VUeXBlKFBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuSlBBMl8wLlNDSEVNQV9WRVJTSU9OKTsKKwkKKwkvKioKKwkgKiBUaGUgYmFzZSBjb250ZW50IHR5cGUgZm9yIGFsbCBtYXBwaW5nIGZpbGVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbnRlbnRUeXBlIE1BUFBJTkdfRklMRV9DT05URU5UX1RZUEUgPSBnZXRKcGFDb250ZW50VHlwZSgibWFwcGluZ0ZpbGUiKTsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogVmFsdWUgb2YgdGhlIGNvbnRlbnQtdHlwZSBmb3Igb3JtLnhtbCBtYXBwaW5ncyBmaWxlcy4gVXNlIHRoaXMgdmFsdWUgdG8gcmV0cmlldmUgCi0JICogdGhlIE9STSB4bWwgY29udGVudCB0eXBlIGZyb20gdGhlIGNvbnRlbnQgdHlwZSBtYW5hZ2VyIGFuZCB0byBhZGQgbmV3IAotCSAqIG9ybS54bWwtbGlrZSBleHRlbnNpb25zIHRvIHRoaXMgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlciNnZXRDb250ZW50VHlwZShTdHJpbmcpCisJICogVGhlIGNvbnRlbnQgdHlwZSBmb3IgPGNvZGU+b3JtLnhtbDwvY29kZT4gbWFwcGluZyBmaWxlcy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUk1fWE1MX0NPTlRFTlRfVFlQRSA9IFBMVUdJTl9JRCArICIuY29udGVudC5vcm0iOyAvLyROT04tTkxTLTEkCi0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBPUk1fWE1MX0NPTlRFTlRfVFlQRSA9IGdldEpwYUNvbnRlbnRUeXBlKCJvcm0iKTsgLy8kTk9OLU5MUy0xJAorCQogCS8qKgotCSAqIERpdHRvIGZvciBwZXJzaXN0ZW5jZS54bWwuCi0JICogQHNlZSAjT1JNX1hNTF9DT05URU5UX1RZUEUKKwkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgPGNvZGU+b3JtLnhtbDwvY29kZT4gdmVyc2lvbiAxLjAgbWFwcGluZyBmaWxlcwogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUgPSBQTFVHSU5fSUQgKyAiLmNvbnRlbnQucGVyc2lzdGVuY2UiOyAvLyROT04tTkxTLTEkCi0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYVJlc291cmNlVHlwZSBPUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFID0gCisJCQluZXcgSnBhUmVzb3VyY2VUeXBlKE9STV9YTUxfQ09OVEVOVF9UWVBFLCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSlBBLlNDSEVNQV9WRVJTSU9OKTsKKwkKKwkvKioKKwkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgPGNvZGU+b3JtLnhtbDwvY29kZT4gdmVyc2lvbiAyLjAgbWFwcGluZyBmaWxlcworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VUeXBlIE9STV9YTUxfMl8wX1JFU09VUkNFX1RZUEUgPSAKKwkJCW5ldyBKcGFSZXNvdXJjZVR5cGUoT1JNX1hNTF9DT05URU5UX1RZUEUsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkpQQTJfMC5TQ0hFTUFfVkVSU0lPTik7CisJCisJLyoqCisJICogVGhlIGNvbnRlbnQgdHlwZSBmb3IgSmF2YSBhcmNoaXZlcyAoSkFScykuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBJQ29udGVudFR5cGUgSkFSX0NPTlRFTlRfVFlQRSA9IGdldEpwYUNvbnRlbnRUeXBlKCJqYXIiKTsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFRoZSByZXNvdXJjZSB0eXBlIGZvciBKYXZhIGFyY2hpdmVzIChKQVJzKS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYVJlc291cmNlVHlwZSBKQVJfUkVTT1VSQ0VfVFlQRSA9IG5ldyBKcGFSZXNvdXJjZVR5cGUoSkFSX0NPTlRFTlRfVFlQRSk7CisJCiAJLyoqCiAJICogV2ViIHByb2plY3RzIGhhdmUgc29tZSBzcGVjaWFsIGV4Y2VwdGlvbnMuCiAJICovCkBAIC0xMjEsMTcgKzIwNywyOSBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QUk9KRUNUX0RFUExPWV9QUkVGSVggPSBKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUzsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEVSU0lTVEVOQ0VfWE1MX0ZJTEVfUEFUSCA9ICJNRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEVSU0lTVEVOQ0VfWE1MX0ZJTEVfUEFUSCA9ICJNRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiOyAvLyROT04tTkxTLTEkCiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX09STV9YTUxfRklMRV9QQVRIID0gIk1FVEEtSU5GL29ybS54bWwiOwotCi0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX09STV9YTUxfRklMRV9QQVRIID0gIk1FVEEtSU5GL29ybS54bWwiOyAvLyROT04tTkxTLTEkCisJCisJcHJpdmF0ZSBzdGF0aWMgSUNvbnRlbnRUeXBlIGdldEpwYUNvbnRlbnRUeXBlKFN0cmluZyBqcGFDb250ZW50VHlwZSkgeworCQlyZXR1cm4gZ2V0Q29udGVudFR5cGUoQ09OVEVOVF9QUkVGSVhfICsganBhQ29udGVudFR5cGUpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1BSRUZJWCA9IFBMVUdJTl9JRF8gKyAiY29udGVudCI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1BSRUZJWF8gPSBDT05URU5UX1BSRUZJWCArICcuJzsKKwkKKwlwcml2YXRlIHN0YXRpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisJCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7CisJfQorCQorCQogCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKIAogCXByaXZhdGUgc3RhdGljIEpwdENvcmVQbHVnaW4gSU5TVEFOQ0U7CiAKIAkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbiBKUFQgcGx1Zy1pbi4KKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbiBEYWxpIGNvcmUgcGx1Zy1pbi4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIEpwdENvcmVQbHVnaW4gaW5zdGFuY2UoKSB7CiAJCXJldHVybiBJTlNUQU5DRTsKQEAgLTE0NCwzNCArMjQyLDM0IEBACiAJICogUmV0dXJuIHRoZSBzaW5ndWxhciBKUEEgbW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCiAJICovCiAJcHVibGljIHN0YXRpYyBKcGFNb2RlbCBnZXRKcGFNb2RlbCgpIHsKLQkJcmV0dXJuIEpwYU1vZGVsTWFuYWdlci5pbnN0YW5jZSgpLmdldEpwYU1vZGVsKCk7CisJCXJldHVybiBJTlNUQU5DRS5nZXRKcGFNb2RlbF8oKTsKIAl9CiAKIAkvKioKIAkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QsCi0JICogb3IgbnVsbCBpZiB1bmFibGUgdG8gYXNzb2NpYXRlIHRoZSBzcGVjaWZpZWQgcHJvamVjdCB3aXRoIGEKKwkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gYXNzb2NpYXRlIHRoZSBzcGVjaWZpZWQgcHJvamVjdCB3aXRoIGEKIAkgKiBKUEEgcHJvamVjdC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSnBhTW9kZWxNYW5hZ2VyLmluc3RhbmNlKCkuZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJbG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9CisJCXJldHVybiBnZXRKcGFNb2RlbCgpLmdldEpwYVByb2plY3QocHJvamVjdCk7CiAJfQogCiAJLyoqCiAJICogUmV0dXJuIHRoZSBKUEEgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBmaWxlLAotCSAqIG9yIG51bGwgaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIGZpbGUgd2l0aCBhIEpQQSBmaWxlLgorCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIHNwZWNpZmllZCBmaWxlIHdpdGggYSBKUEEgZmlsZS4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIEpwYUZpbGUgZ2V0SnBhRmlsZShJRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSnBhTW9kZWxNYW5hZ2VyLmluc3RhbmNlKCkuZ2V0SnBhRmlsZShmaWxlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJbG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9CisJCXJldHVybiBnZXRKcGFNb2RlbCgpLmdldEpwYUZpbGUoZmlsZSk7CisJfQorCisJLyoqCisJICogVGhlIEpQQSBzZXR0aW5ncyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QKKwkgKiBoYXZlIGNoYW5nZWQgaW4gc3VjaCBhIHdheSBhcyB0byByZXF1aXJlIHRoZSBhc3NvY2lhdGVkCisJICogSlBBIHByb2plY3QgdG8gYmUgY29tcGxldGVseSByZWJ1aWx0CisJICogKGUuZy4gd2hlbiB0aGUgdXNlciBjaGFuZ2VzIGEgcHJvamVjdCdzIEpQQSBwbGF0Zm9ybSkuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHJlYnVpbGRKcGFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKKwkJZ2V0SnBhTW9kZWwoKS5yZWJ1aWxkSnBhUHJvamVjdChwcm9qZWN0KTsKIAl9CiAKIAkvKioKQEAgLTE4Miw3ICsyODAsNyBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0IGhhcyBhIEpQQSBmYWNldC4KKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdCBoYXMgYSBXZWIgZmFjZXQuCiAJICovCiAJcHVibGljIHN0YXRpYyBib29sZWFuIHByb2plY3RIYXNXZWJGYWNldChJUHJvamVjdCBwcm9qZWN0KSB7CiAJCXJldHVybiBwcm9qZWN0SGFzRmFjZXQocHJvamVjdCwgV0VCX1BST0pFQ1RfRkFDRVRfSUQpOwpAQCAtMjAxLDcgKzI5OSw3IEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZS54bWwgKHNwZWNpZmllZCBhcyAiTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIikKKwkgKiBSZXR1cm4gdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gKHNwZWNpZmllZCBhcyA8Y29kZT4iTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIjwvY29kZT4pCiAJICogZGVwbG95bWVudCBVUkkgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQZXJzaXN0ZW5jZVhtbERlcGxveW1lbnRVUkkoSVByb2plY3QgcHJvamVjdCkgewpAQCAtMjA5LDg5ICszMDcsMTM2IEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IG1hcHBpbmcgZmlsZSAoc3BlY2lmaWVkIGFzICJNRVRBLUlORi9vcm0ueG1sIikKKwkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgbWFwcGluZyBmaWxlIChzcGVjaWZpZWQgYXMgPGNvZGU+Ik1FVEEtSU5GL29ybS54bWwiPC9jb2RlPikKIAkgKiBkZXBsb3ltZW50IFVSSSBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LgogCSAqLwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRPcm1YbWxEZXBsb3ltZW50VVJJKElQcm9qZWN0IHByb2plY3QpIHsKIAkJcmV0dXJuIGdldERlcGxveW1lbnRVUkkocHJvamVjdCwgREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7CiAJfQotCQorCiAJLyoqCi0JICogUmV0dXJuIHRoZSBtYXBwaW5nIGZpbGUgKHNwZWNpZmllZCBhcyAiTUVUQS1JTkYvPG1hcHBpbmdGaWxlTmFtZT4iKQorCSAqIFJldHVybiB0aGUgbWFwcGluZyBmaWxlIChzcGVjaWZpZWQgYXMge0Bjb2RlIk1FVEEtSU5GLzxtYXBwaW5nRmlsZU5hbWU+In0pCiAJICogZGVwbG95bWVudCBVUkkgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPcm1YbWxEZXBsb3ltZW50VVJJKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBtYXBwaW5nRmlsZU5hbWUpIHsKIAkJcmV0dXJuIGdldERlcGxveW1lbnRVUkkocHJvamVjdCwgbWFwcGluZ0ZpbGVOYW1lKTsKIAl9Ci0JCisKIAkvKioKIAkgKiBUd2VhayB0aGUgc3BlY2lmaWVkIGRlcGxveW1lbnQgVVJJIGlmIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotCSAqIGhhcyBhIHdlYiBmYWNldC4KKwkgKiBoYXMgYSBXZWIgZmFjZXQuCiAJICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERlcGxveW1lbnRVUkkoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGRlZmF1bHRVUkkpIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXBsb3ltZW50VVJJKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBkZWZhdWx0VVJJKSB7CiAJCXJldHVybiBwcm9qZWN0SGFzV2ViRmFjZXQocHJvamVjdCkgPwotCQkJCVdFQl9QUk9KRUNUX0RFUExPWV9QUkVGSVggKyAiLyIgKyBkZWZhdWx0VVJJCisJCQkJV0VCX1BST0pFQ1RfREVQTE9ZX1BSRUZJWCArICcvJyArIGRlZmF1bHRVUkkKIAkJCToKIAkJCQlkZWZhdWx0VVJJOwogCX0KLQkKKwogCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBKUEEgcHJlZmVyZW5jZXMKKwkgKiBSZXR1cm4gdGhlIGRlcGxveW1lbnQgcGF0aCB0byB3aGljaCBKQVJzIGFyZSByZWxhdGl2ZWx5IHNwZWNpZmllZCBmb3IgCisJICogdGhlIGdpdmVuIHByb2plY3QuCisJICogKFdlYiBwcm9qZWN0cyBoYXZlIGEgZGlmZmVyZW50IGRlcGxveW1lbnQgc3RydWN0dXJlIHRoYW4gbm9uLXdlYiBwcm9qZWN0cy4pCisJICovCisJcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXJEZXBsb3ltZW50Um9vdFBhdGgoSVByb2plY3QgcHJvamVjdCkgeworCQlyZXR1cm4gbmV3IFBhdGgoZ2V0SmFyRGVwbG95bWVudFJvb3RQYXRoTmFtZShwcm9qZWN0KSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEphckRlcGxveW1lbnRSb290UGF0aE5hbWUoSVByb2plY3QgcHJvamVjdCkgeworCQlyZXR1cm4gcHJvamVjdEhhc1dlYkZhY2V0KHByb2plY3QpID8gKCIvIiArIEoyRUVDb25zdGFudHMuV0VCX0lORikgOiAiLyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0UGxhdGZvcm1GaWxlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBkZWZhdWx0VVJJKSB7CisJCUlQYXRoIGRlcGxveW1lbnRQYXRoID0gbmV3IFBhdGgoZ2V0RGVwbG95bWVudFVSSShwcm9qZWN0LCBkZWZhdWx0VVJJKSk7CisJCUlWaXJ0dWFsRmlsZSB2RmlsZSA9IENvbXBvbmVudENvcmUuY3JlYXRlRmlsZShwcm9qZWN0LCBkZXBsb3ltZW50UGF0aCk7CisJCXJldHVybiB2RmlsZS5nZXRVbmRlcmx5aW5nRmlsZSgpOworCisJfQorCisJcHVibGljIHN0YXRpYyBKcGFGaWxlIGdldEpwYUZpbGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGRlZmF1bHRVUkkpIHsKKwkJSUZpbGUgeG1sRmlsZSA9IGdldFBsYXRmb3JtRmlsZShwcm9qZWN0LCBkZWZhdWx0VVJJKTsKKwkJcmV0dXJuIHhtbEZpbGUuZXhpc3RzKCkgPyBnZXRKcGFGaWxlKHhtbEZpbGUpIDogbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKKwkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gZ2V0RGVmYXVsdFByZWZlcmVuY2VzKCk7CisKKwkJLy8gZGVmYXVsdCBKUEEgcGxhdGZvcm0KKwkJU3RyaW5nIGRlZmF1bHRQbGF0Zm9ybUlkID0gSnBhUGxhdGZvcm1SZWdpc3RyeS5pbnN0YW5jZSgpLmdldERlZmF1bHRKcGFQbGF0Zm9ybUlkKCk7CisJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGRlZmF1bHRQbGF0Zm9ybUlkKSkgeworCQkJZGVmYXVsdFBsYXRmb3JtSWQgPSBHZW5lcmljSnBhUGxhdGZvcm1Qcm92aWRlci5JRDsKKwkJfQorCQlub2RlLnB1dChERUZBVUxUX0pQQV9QTEFURk9STV9QUkVGX0tFWSwgZGVmYXVsdFBsYXRmb3JtSWQpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgZGVmYXVsdCBEYWxpIHByZWZlcmVuY2VzCiAJICogQHNlZSBKcGFQcmVmZXJlbmNlSW5pdGlhbGl6ZXIKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0RGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJU2NvcGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRGVmYXVsdFNjb3BlKCk7Ci0JCXJldHVybiBjb250ZXh0LmdldE5vZGUoUExVR0lOX0lEKTsKKwkJcmV0dXJuIGdldFByZWZlcmVuY2VzKG5ldyBEZWZhdWx0U2NvcGUoKSk7CiAJfQotCQorCiAJLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJlZmVyZW5jZXMgZm9yIHRoZSBjdXJyZW50IHdvcmtzcGFjZSBpbnN0YW5jZS4KKwkgKiBSZXR1cm4gdGhlIERhbGkgcHJlZmVyZW5jZXMgZm9yIHRoZSBjdXJyZW50IHdvcmtzcGFjZSBpbnN0YW5jZS4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0V29ya3NwYWNlUHJlZmVyZW5jZXMoKSB7Ci0JCUlTY29wZUNvbnRleHQgY29udGV4dCA9IG5ldyBJbnN0YW5jZVNjb3BlKCk7Ci0JCXJldHVybiBjb250ZXh0LmdldE5vZGUoUExVR0lOX0lEKTsKKwkJcmV0dXJuIGdldFByZWZlcmVuY2VzKG5ldyBJbnN0YW5jZVNjb3BlKCkpOwogCX0KLQkKKwogCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIHByZWZlcmVuY2VzIGZvciB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KKwkgKiBSZXR1cm4gdGhlIERhbGkgcHJlZmVyZW5jZXMgZm9yIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgogCSAqLwogCXB1YmxpYyBzdGF0aWMgSUVjbGlwc2VQcmVmZXJlbmNlcyBnZXRQcm9qZWN0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlJU2NvcGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpOworCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMobmV3IFByb2plY3RTY29wZShwcm9qZWN0KSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBEYWxpIHByZWZlcmVuY2VzIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRleHQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgSUVjbGlwc2VQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcyhJU2NvcGVDb250ZXh0IGNvbnRleHQpIHsKIAkJcmV0dXJuIGNvbnRleHQuZ2V0Tm9kZShQTFVHSU5fSUQpOwogCX0KIAkKIAkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgSlBBIGxpYnJhcnkgZm9yIGNyZWF0aW5nIG5ldyBKUEEgcHJvamVjdHMKKwkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgSlBBIFBsYXRmb3JtIElEIGZvciBuZXcgSlBBIHByb2plY3RzIHdpdGggdGhlIGdpdmVuIEpQQSBmYWNldCB2ZXJzaW9uLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRKcGFMaWJyYXJ5KCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0KAotCQkJCUpwYVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0pQQV9MSUIsIG51bGwsCi0JCQkJbmV3IFByZWZlcmVuY2VzW10ge2dldFdvcmtzcGFjZVByZWZlcmVuY2VzKCksIGdldERlZmF1bHRQcmVmZXJlbmNlcygpfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBKUEEgcGxhdGZvcm0gSUQgZm9yIGNyZWF0aW5nIG5ldyBKUEEgcHJvamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0SnBhUGxhdGZvcm1JZCgpIHsKLQkJU3RyaW5nIHBsYXRmb3JtSWQgPSAKLQkJCVBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldCgKLQkJCQlKcGFQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9KUEFfUExBVEZPUk0sIEdlbmVyaWNKcGFQbGF0Zm9ybS5JRCwKLQkJCQluZXcgUHJlZmVyZW5jZXNbXSB7Z2V0V29ya3NwYWNlUHJlZmVyZW5jZXMoKSwgZ2V0RGVmYXVsdFByZWZlcmVuY2VzKCl9KTsKLQkJaWYgKCEgSnBhUGxhdGZvcm1SZWdpc3RyeS5pbnN0YW5jZSgpLmNvbnRhaW5zUGxhdGZvcm0ocGxhdGZvcm1JZCkpIHsKLQkJCXBsYXRmb3JtSWQgPSAKLQkJCQlQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXQoCi0JCQkJCUpwYVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0pQQV9QTEFURk9STSwgR2VuZXJpY0pwYVBsYXRmb3JtLklELAotCQkJCQluZXcgUHJlZmVyZW5jZXNbXSB7Z2V0RGVmYXVsdFByZWZlcmVuY2VzKCl9KTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0SnBhUGxhdGZvcm1JZChTdHJpbmcganBhRmFjZXRWZXJzaW9uKSB7CisJCVN0cmluZyBwbGF0Zm9ybUlkID0gZ2V0RGVmYXVsdEpwYVBsYXRmb3JtSWQoZ2V0V29ya3NwYWNlUHJlZmVyZW5jZXMoKSwgZ2V0RGVmYXVsdFByZWZlcmVuY2VzKCkpOworCQlpZiAoanBhUGxhdGZvcm1JZElzVmFsaWQocGxhdGZvcm1JZCkgCisJCQkJJiYgSnBhUGxhdGZvcm1SZWdpc3RyeS5pbnN0YW5jZSgpLnBsYXRmb3JtU3VwcG9ydHNKcGFGYWNldFZlcnNpb24ocGxhdGZvcm1JZCwganBhRmFjZXRWZXJzaW9uKSkgeworCQkJcmV0dXJuIHBsYXRmb3JtSWQ7CiAJCX0KLQkJcmV0dXJuIHBsYXRmb3JtSWQ7CisJCS8vIGlmIHRoZSBwbGF0Zm9ybSBJRCBzdG9yZWQgaW4gdGhlIHdvcmtzcGFjZSBwcmVmcyBpcyBpbnZhbGlkLCBsb29rIGluIHRoZSBkZWZhdWx0IHByZWZzCisJCXBsYXRmb3JtSWQgPSBnZXREZWZhdWx0SnBhUGxhdGZvcm1JZChnZXREZWZhdWx0UHJlZmVyZW5jZXMoKSk7CisJCWlmIChqcGFQbGF0Zm9ybUlkSXNWYWxpZChwbGF0Zm9ybUlkKQorCQkJCSYmIEpwYVBsYXRmb3JtUmVnaXN0cnkuaW5zdGFuY2UoKS5wbGF0Zm9ybVN1cHBvcnRzSnBhRmFjZXRWZXJzaW9uKHBsYXRmb3JtSWQsIGpwYUZhY2V0VmVyc2lvbikpIHsKKwkJCXJldHVybiBwbGF0Zm9ybUlkOworCQl9CisJCS8vIGlmIHRoZSBwbGF0Zm9ybSBJRCBzdG9yZWQgaW4gdGhlIGRlZmF1bHQgcHJlZnMgaXMgaW52YWxpZCwgdXNlIHRoZSBHZW5lcmljIHBsYXRmb3JtIElECisJCWlmIChqcGFGYWNldFZlcnNpb24uZXF1YWxzKEpQQV9GQUNFVF9WRVJTSU9OXzFfMCkpIHsKKwkJCXJldHVybiBHZW5lcmljSnBhUGxhdGZvcm1Qcm92aWRlci5JRDsKKwkJfQorCQlpZiAoanBhRmFjZXRWZXJzaW9uLmVxdWFscyhKUEFfRkFDRVRfVkVSU0lPTl8yXzApKSB7CisJCQlyZXR1cm4gR2VuZXJpYzJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuSUQ7CisJCX0KKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBKUEEgZmFjZXQgdmVyc2lvbjogIiArIGpwYUZhY2V0VmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRKcGFQbGF0Zm9ybUlkKFByZWZlcmVuY2VzLi4uIG5vZGVzKSB7CisJCXJldHVybiBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXQoREVGQVVMVF9KUEFfUExBVEZPUk1fUFJFRl9LRVksIEdlbmVyaWNKcGFQbGF0Zm9ybVByb3ZpZGVyLklELCBub2Rlcyk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGJvb2xlYW4ganBhUGxhdGZvcm1JZElzVmFsaWQoU3RyaW5nIHBsYXRmb3JtSWQpIHsKKwkJcmV0dXJuIEpwYVBsYXRmb3JtUmVnaXN0cnkuaW5zdGFuY2UoKS5jb250YWluc1BsYXRmb3JtKHBsYXRmb3JtSWQpOworCX0KKwogCS8qKgogCSAqIFNldCB0aGUgZGVmYXVsdCBKUEEgcGxhdGZvcm0gSUQgZm9yIGNyZWF0aW5nIG5ldyBKUEEgcHJvamVjdHMKIAkgKi8KIAlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEpwYVBsYXRmb3JtSWQoU3RyaW5nIHBsYXRmb3JtSWQpIHsKIAkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFdvcmtzcGFjZVByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLnB1dChKcGFQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9KUEFfUExBVEZPUk0sIHBsYXRmb3JtSWQpOworCQlwcmVmcy5wdXQoREVGQVVMVF9KUEFfUExBVEZPUk1fUFJFRl9LRVksIHBsYXRmb3JtSWQpOwogCQlmbHVzaChwcmVmcyk7CiAJfQogCkBAIC0yOTksMTQgKzQ0NCwxNCBAQAogCSAqIFJldHVybiB0aGUgSlBBIHBsYXRmb3JtIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtIGdldEpwYVBsYXRmb3JtKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEpwYVBsYXRmb3JtUmVnaXN0cnkuaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybShnZXRKcGFQbGF0Zm9ybUlkKHByb2plY3QpKTsKKwkJcmV0dXJuIEpwYVBsYXRmb3JtUmVnaXN0cnkuaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybShwcm9qZWN0KTsKIAl9Ci0JCisKIAkvKioKIAkgKiBSZXR1cm4gdGhlIEpQQSBwbGF0Zm9ybSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QuCiAJICovCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SnBhUGxhdGZvcm1JZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCkuZ2V0KEpQQV9QTEFURk9STSwgR2VuZXJpY0pwYVBsYXRmb3JtLklEKTsKKwkJcmV0dXJuIGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KS5nZXQoSlBBX1BMQVRGT1JNX1BSRUZfS0VZLCBHZW5lcmljSnBhUGxhdGZvcm1Qcm92aWRlci5JRCk7CiAJfQogCiAJLyoqCkBAIC0zMTQsMTAgKzQ1OSwxOCBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRKcGFQbGF0Zm9ybUlkKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBqcGFQbGF0Zm9ybUlkKSB7CiAJCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCk7Ci0JCXByZWZzLnB1dChKUEFfUExBVEZPUk0sIGpwYVBsYXRmb3JtSWQpOworCQlwcmVmcy5wdXQoSlBBX1BMQVRGT1JNX1BSRUZfS0VZLCBqcGFQbGF0Zm9ybUlkKTsKIAkJZmx1c2gocHJlZnMpOwogCX0KLQkKKworCS8qKgorCSAqIFJldHVybiB0aGUgcHJlZmVyZW5jZXMga2V5IHVzZWQgdG8gbG9vayB1cCBhbiBFY2xpcHNlIHByb2plY3QncworCSAqIEpQQSBwbGF0Zm9ybSBJRC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKcGFQbGF0Zm9ybUlkUHJlZktleSgpIHsKKwkJcmV0dXJuIEpQQV9QTEFURk9STV9QUkVGX0tFWTsKKwl9CisKIAkvKioKIAkgKiBSZXR1cm4gdGhlIEpQQSAiZGlzY292ZXIiIGZsYWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKIAkgKiBFY2xpcHNlIHByb2plY3QuCkBAIC0zMzcsMTMgKzQ5MCw1MSBAQAogCX0KIAogCS8qKgotCSAqIGNoZWNrZWQgZXhjZXB0aW9ucyBiaXRlCisJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBtZXRhbW9kZWwgc291cmNlIGZvbGRlciBhc3NvY2lhdGVkIHdpdGggdGhlCisJICogc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKElQcm9qZWN0IHByb2plY3QpIHsKKwkJcmV0dXJuIGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KS5nZXQoTUVUQU1PREVMX1NPVVJDRV9GT0xERVJfTkFNRSwgbnVsbCk7CisJfQorCisJLyoqCisJICogU2V0IHRoZSBuYW1lIG9mIHRoZSBtZXRhbW9kZWwgc291cmNlIGZvbGRlciBhc3NvY2lhdGVkIHdpdGggdGhlCisJICogc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSkgeworCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpOworCQlpZiAobWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSA9PSBudWxsKSB7CisJCQlwcmVmcy5yZW1vdmUoTUVUQU1PREVMX1NPVVJDRV9GT0xERVJfTkFNRSk7CisJCX0KKwkJZWxzZSB7CisJCQlwcmVmcy5wdXQoTUVUQU1PREVMX1NPVVJDRV9GT0xERVJfTkFNRSwgbWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSk7CisJCX0KKwkJZmx1c2gocHJlZnMpOworCX0KKworCS8qKgorCSAqIEZsdXNoIHByZWZlcmVuY2VzIGluIGFuIGFzeW5jaHJvbm91cyBKb2IgYmVjYXVzZSB0aGUgZmx1c2ggcmVxdWVzdCB3aWxsCisJICogdHJpZ2dlciBhIGxvY2sgb24gdGhlIHByb2plY3QsIHdoaWNoIGNhbiBjYXVzZSB1cyBzb21lIGRlYWRsb2NrcyAoZS5nLgorCSAqIHdoZW4gZGVsZXRpbmcgdGhlIG1ldGFtb2RlbCBzb3VyY2UgZm9sZGVyKS4KIAkgKi8KIAlwcml2YXRlIHN0YXRpYyB2b2lkIGZsdXNoKElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMpIHsKLQkJdHJ5IHsKLQkJCXByZWZzLmZsdXNoKCk7Ci0JCX0gY2F0Y2goQmFja2luZ1N0b3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2coZXgpOworCQluZXcgUHJlZmVyZW5jZXNGbHVzaEpvYihwcmVmcykuc2NoZWR1bGUoKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBQcmVmZXJlbmNlc0ZsdXNoSm9iIGV4dGVuZHMgSm9iIHsKKwkJcHJpdmF0ZSBmaW5hbCBJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzOworCQlQcmVmZXJlbmNlc0ZsdXNoSm9iKElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMpIHsKKwkJCXN1cGVyKE5MUy5iaW5kKEpwdENvcmVNZXNzYWdlcy5QUkVGRVJFTkNFU19GTFVTSF9KT0JfTkFNRSwgcHJlZnMuYWJzb2x1dGVQYXRoKCkpKTsKKwkJCXRoaXMucHJlZnMgPSBwcmVmczsKKwkJfQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJdHJ5IHsKKwkJCQlwcmVmcy5mbHVzaCgpOworCQkJfSBjYXRjaChCYWNraW5nU3RvcmVFeGNlcHRpb24gZXgpIHsKKwkJCQlsb2coZXgpOworCQkJfQorCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CiAJCX0KIAl9CiAKQEAgLTM1Myw3ICs1NDQsMTAgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoSVByb2plY3QgcHJvamVjdCkgewogCQl0cnkgewotCQkJcmV0dXJuIHByb2plY3QuZ2V0UGVyc2lzdGVudFByb3BlcnR5KERBVEFfU09VUkNFX0NPTk5FQ1RJT05fUFJPRklMRV9OQU1FKTsKKwkJCVN0cmluZyBjb25uZWN0aW9uUHJvZmlsZU5hbWUgPSBwcm9qZWN0LmdldFBlcnNpc3RlbnRQcm9wZXJ0eShEQVRBX1NPVVJDRV9DT05ORUNUSU9OX1BST0ZJTEVfTkFNRSk7CisJCQkvLyBzb21lIG9sZCBjb25uZWN0aW9uIHByb2ZpbGUgbmFtZXMgd2VyZSBzdG9yZWQgYXMgZW1wdHkgc3RyaW5ncyBpbnN0ZWFkIG9mIG51bGxzIDotKAorCQkJLy8gY29udmVydCB0aGVtIGhlcmUKKwkJCXJldHVybiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShjb25uZWN0aW9uUHJvZmlsZU5hbWUpKSA/IG51bGwgOiBjb25uZWN0aW9uUHJvZmlsZU5hbWU7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKIAkJCWxvZyhleCk7CiAJCQlyZXR1cm4gbnVsbDsKQEAgLTM3MSwzNSArNTY1LDcyIEBACiAJCQlsb2coZXgpOwogCQl9CiAJfQotCQorCiAJLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHNjaGVtYSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKiBAc2VlIEpwYVByb2plY3QjZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWUoKQorCSAqIFJldHVybiB0aGUgZGVmYXVsdCBjYXRhbG9nIChpZGVudGlmaWVyKSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QuCisJICogQHNlZSBKcGFQcm9qZWN0I2dldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCkKIAkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZShJUHJvamVjdCBwcm9qZWN0KSB7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coSVByb2plY3QgcHJvamVjdCkgewogCQl0cnkgewotCQkJcmV0dXJuIHByb2plY3QuZ2V0UGVyc2lzdGVudFByb3BlcnR5KFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUFfTkFNRSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWxvZyhjZSk7CisJCQlyZXR1cm4gcHJvamVjdC5nZXRQZXJzaXN0ZW50UHJvcGVydHkoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7CisJCQlsb2coZXgpOwogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAl9Ci0JCisKIAkvKioKLQkgKiBTZXQgdGhlIGRlZmF1bHQgc2NoZW1hIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgotCSAqIEBzZWUgSnBhUHJvamVjdCNzZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSgpCisJICogU2V0IHRoZSBkZWZhdWx0IGNhdGFsb2cgKGlkZW50aWZpZXIpIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KKwkgKiBAc2VlIEpwYVByb2plY3Qjc2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coU3RyaW5nKQogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZGVmYXVsdFNjaGVtYU5hbWUpIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGRlZmF1bHRDYXRhbG9nKSB7CiAJCXRyeSB7Ci0JCQlwcm9qZWN0LnNldFBlcnNpc3RlbnRQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BX05BTUUsIGRlZmF1bHRTY2hlbWFOYW1lKTsKKwkJCXByb2plY3Quc2V0UGVyc2lzdGVudFByb3BlcnR5KFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HLCBkZWZhdWx0Q2F0YWxvZyk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKKwkJCWxvZyhleCk7CiAJCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWxvZyhjZSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBkZWZhdWx0IHNjaGVtYSAoaWRlbnRpZmllcikgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgorCSAqIEBzZWUgSnBhUHJvamVjdCNnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKElQcm9qZWN0IHByb2plY3QpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBwcm9qZWN0LmdldFBlcnNpc3RlbnRQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgeworCQkJbG9nKGV4KTsKKwkJCXJldHVybiBudWxsOwogCQl9CiAJfQogCiAJLyoqCisJICogU2V0IHRoZSBkZWZhdWx0IHNjaGVtYSAoaWRlbnRpZmllcikgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgorCSAqIEBzZWUgSnBhUHJvamVjdCNzZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZGVmYXVsdFNjaGVtYSkgeworCQl0cnkgeworCQkJcHJvamVjdC5zZXRQZXJzaXN0ZW50UHJvcGVydHkoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgZGVmYXVsdFNjaGVtYSk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKKwkJCWxvZyhleCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgbWFuYWdlcidzIEphdmEgY2hhbmdlIGxpc3RlbmVyIGlzIGFjdGl2ZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcklzQWN0aXZlKCkgeworCQlyZXR1cm4gZ2V0SnBhTW9kZWwoKS5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUoKTsKKwl9CisKKwkvKioKKwkgKiBTZXQgd2hldGhlciB0aGUgbW9kZWwgbWFuYWdlcidzIEphdmEgY2hhbmdlIGxpc3RlbmVyIGlzIGFjdGl2ZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcklzQWN0aXZlKGJvb2xlYW4gamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcklzQWN0aXZlKSB7CisJCWdldEpwYU1vZGVsKCkuc2V0SmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcklzQWN0aXZlKGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSk7CisJfQorCisJLyoqCiAJICogTG9nIHRoZSBzcGVjaWZpZWQgc3RhdHVzLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKQEAgLTQzNiwxNiArNjY3LDU1IEBACiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUpwYU1vZGVsTWFuYWdlci5pbnN0YW5jZSgpLnN0YXJ0KCk7CisJCS8vIG5vdGhpbmcgeWV0Li4uCiAJfQogCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewogCQl0cnkgewotCQkJSnBhTW9kZWxNYW5hZ2VyLmluc3RhbmNlKCkuc3RvcCgpOworCQkJaWYgKHRoaXMuanBhTW9kZWwgIT0gbnVsbCkgeworCQkJCXRoaXMuanBhTW9kZWwuc3RvcCgpOworCQkJCXRoaXMuanBhTW9kZWwgPSBudWxsOworCQkJfQorCQkJaWYgKHRoaXMucGFyc2VyVHJhY2tlciAhPSBudWxsKSB7CisJCQkJdGhpcy5wYXJzZXJUcmFja2VyLmNsb3NlKCk7CisJCQkJdGhpcy5wYXJzZXJUcmFja2VyID0gbnVsbDsKKwkJCX0KIAkJfSBmaW5hbGx5IHsKIAkJCXN1cGVyLnN0b3AoY29udGV4dCk7CiAJCX0KIAl9CiAKKwlwcml2YXRlIHN5bmNocm9uaXplZCBHZW5lcmljSnBhTW9kZWwgZ2V0SnBhTW9kZWxfKCkgeworCQlpZiAodGhpcy5qcGFNb2RlbCA9PSBudWxsKSB7CisJCQl0aGlzLmpwYU1vZGVsID0gdGhpcy5idWlsZEpwYU1vZGVsKCk7CisJCQl0aGlzLmpwYU1vZGVsLnN0YXJ0KCk7CisJCX0KKwkJcmV0dXJuIHRoaXMuanBhTW9kZWw7CisJfQorCisJcHJpdmF0ZSBHZW5lcmljSnBhTW9kZWwgYnVpbGRKcGFNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSnBhTW9kZWwoKTsKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIFNBWFBhcnNlckZhY3RvcnkgZ2V0U0FYUGFyc2VyRmFjdG9yeSgpIHsKKwkJU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gKFNBWFBhcnNlckZhY3RvcnkpIHRoaXMuZ2V0UGFyc2VyVHJhY2tlcigpLmdldFNlcnZpY2UoKTsKKwkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworCQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKwkJfQorCQlyZXR1cm4gZmFjdG9yeTsKKwl9CisKKwlwcml2YXRlIFNlcnZpY2VUcmFja2VyIGdldFBhcnNlclRyYWNrZXIoKSB7CisJCWlmICh0aGlzLnBhcnNlclRyYWNrZXIgPT0gbnVsbCkgeworCQkJdGhpcy5wYXJzZXJUcmFja2VyID0gdGhpcy5idWlsZFBhcnNlclRyYWNrZXIoKTsKKwkJCXRoaXMucGFyc2VyVHJhY2tlci5vcGVuKCk7CisJCX0KKwkJcmV0dXJuIHRoaXMucGFyc2VyVHJhY2tlcjsKKwl9CisKKwlwcml2YXRlIFNlcnZpY2VUcmFja2VyIGJ1aWxkUGFyc2VyVHJhY2tlcigpIHsKKwkJcmV0dXJuIG5ldyBTZXJ2aWNlVHJhY2tlcih0aGlzLmdldEJ1bmRsZSgpLmdldEJ1bmRsZUNvbnRleHQoKSwgImphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCX0KKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL01hcHBpbmdLZXlzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvTWFwcGluZ0tleXMuamF2YQppbmRleCA1Zjg3YzkyLi5jNjZiODkyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvTWFwcGluZ0tleXMuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvTWFwcGluZ0tleXMuamF2YQpAQCAtMTgsOCArMTgsOSBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdLZXlzCi17CitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBpbnRlcmZhY2UgTWFwcGluZ0tleXMgeworCiAJU3RyaW5nIEVOVElUWV9UWVBFX01BUFBJTkdfS0VZID0gImVudGl0eSI7CiAJU3RyaW5nIE1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkgPSAibWFwcGVkU3VwZXJjbGFzcyI7CiAJU3RyaW5nIEVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSA9ICJlbWJlZGRhYmxlIjsKQEAgLTM2LDQgKzM3LDUgQEAKIAlTdHJpbmcgRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gImVtYmVkZGVkSWQiOwogCVN0cmluZyBUUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gInRyYW5zaWVudCI7CiAJU3RyaW5nIE5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gbnVsbDsKKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL1Jlc291cmNlRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL1Jlc291cmNlRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZmUxNmEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvUmVzb3VyY2VEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZTsKKworLyoqCisgKiBBIEpwYVBsYXRmb3JtIGNhbiBzdXBwb3J0IG11bHRpcGxlIHJlc291cmNlcy4gIEVhY2ggd2lsbAorICogaGF2ZSBhIHVuaXF1ZSByZXNvdXJjZSB0eXBlIGFuZCBtdXN0IGJlIGRlZmluZWQgd2l0aCBhIHJlc291cmNlIGRlZmluaXRpb24uCisgKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VEZWZpbml0aW9uCit7CisJLyoqCisJICogUmV0dXJuIHRoZSBhc3NvY2lhdGVkIHJlc291cmNlIHR5cGUuCisJICovCisJSnBhUmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL1Jlc291cmNlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9SZXNvdXJjZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYzFmNjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL1Jlc291cmNlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZU1vZGVsIGV4dGVuZHMgTW9kZWwKLXsKLQkvKioKLQkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBKYXZhIHJlc291cmNlIHR5cGUKLQkgKiBAc2VlIFJlc291cmNlTW9kZWwjZ2V0UmVzb3VyY2VUeXBlKCkKLQkgKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfUkVTT1VSQ0VfVFlQRSA9ICJKQVZBX1JFU09VUkNFX1RZUEUiOwotCQotCS8qKgotCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIHBlcnNpc3RlbmNlLnhtbCByZXNvdXJjZSB0eXBlCi0JICogQHNlZSBSZXNvdXJjZU1vZGVsI2dldFJlc291cmNlVHlwZSgpCi0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9SRVNPVVJDRV9UWVBFID0gIlBFUlNJU1RFTkNFX1JFU09VUkNFX1RZUEUiOwotCQotCS8qKgotCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIG1hcHBpbmcgZmlsZSAoZS5nLiBvcm0ueG1sKSByZXNvdXJjZSB0eXBlCi0JICogQHNlZSBSZXNvdXJjZU1vZGVsI2dldFJlc291cmNlVHlwZSgpCi0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBPUk1fUkVTT1VSQ0VfVFlQRSA9ICJPUk1fUkVTT1VSQ0VfVFlQRSI7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGFsbCByZXNvdXJjZSBtb2RlbHMgb2YgdGhpcyB0eXBlCi0JICovCi0JU3RyaW5nIGdldFJlc291cmNlVHlwZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSUZpbGUgdGhhdCB0aGlzIHJlc291cmNlIG1vZGVsIHJlcHJlc2VudHMKLQkgKi8KLQlJRmlsZSBnZXRGaWxlKCk7Ci0JCi0Jdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCk7Ci0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSByZXNvdXJjZSBtb2RlbCBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLgotCSAqLwotCXZvaWQgdXBkYXRlRnJvbVJlc291cmNlKCk7Ci0KLQkKLQl2b2lkIGFkZFJlc291cmNlTW9kZWxDaGFuZ2VMaXN0ZW5lcihSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpOwotCQotCXZvaWQgcmVtb3ZlUmVzb3VyY2VNb2RlbENoYW5nZUxpc3RlbmVyKFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JCi0Jdm9pZCBkaXNwb3NlKCk7Ci0JCi0JLyoqCi0JICogVXNlZCB0byByZXNvbHZlIHR5cGUgaW5mb3JtYXRpb24gdGhhdCBjb3VsZCBiZSBkZXBlbmRlbnQgb24gb3RoZXIgZmlsZXMgYmVpbmcgYWRkZWQvcmVtb3ZlZC4KLQkgKi8KLQl2b2lkIHJlc29sdmVUeXBlcygpOwotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvUmVzb3VyY2VNb2RlbExpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvUmVzb3VyY2VNb2RlbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODgyZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL1Jlc291cmNlTW9kZWxMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZU1vZGVsTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcgotewotCXZvaWQgcmVzb3VyY2VNb2RlbENoYW5nZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0FjY2Vzc0hvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQWNjZXNzSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiNGQwZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0FjY2Vzc0hvbGRlci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKKworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4yCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQWNjZXNzSG9sZGVyIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKK3sKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGFjY2VzcyB0eXBlLCB3aGV0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQuCisJICogVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuIG51bGwgc2luY2UgYXQgbGVhc3QgdGhlIGRlZmF1bHQgd2lsbCBiZSBzZXQKKwkgKi8KKwlBY2Nlc3NUeXBlIGdldEFjY2VzcygpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgZGVmYXVsdCBhY2Nlc3MgdHlwZSwgbmV2ZXIgbnVsbAorCSAqLworCUFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2VzcygpOworCisJLyoqCisJICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBkZWZhdWx0IGFjY2VzcyB0eXBlCisJICovCisJU3RyaW5nIERFRkFVTFRfQUNDRVNTX1BST1BFUlRZID0gImRlZmF1bHRBY2Nlc3MiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBhY2Nlc3MgdHlwZTsKKwkgKi8KKwlBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2VzcygpOworCQorCS8qKgorCSAqIFNldCB0aGUgc3BlY2lmaWVkIGFjY2VzcyB0eXBlLgorCSAqLworCXZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUgbmV3U3BlY2lmaWVkQWNjZXNzKTsKKworCS8qKgorCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIGFjY2VzcyB0eXBlCisJICovCisJU3RyaW5nIFNQRUNJRklFRF9BQ0NFU1NfUFJPUEVSVFkgPSAic3BlY2lmaWVkQWNjZXNzIjsgLy8kTk9OLU5MUy0xJAorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9BY2Nlc3NUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9BY2Nlc3NUeXBlLmphdmEKaW5kZXggZTU3Y2FhNS4uNmJiYzMyNiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQWNjZXNzVHlwZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0FjY2Vzc1R5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3ICsxMCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CiAKIC8qKgotICogCisgKiBBY2Nlc3MgVHlwZQogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjAsNTAgKzIwLDczIEBACiAgKi8KIHB1YmxpYyBlbnVtIEFjY2Vzc1R5cGUgewogCi0JRklFTEQsCi0JUFJPUEVSVFk7CisJRklFTEQoCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFjY2Vzc1R5cGUuRklFTEQsCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRAorCQkpLAorCVBST1BFUlRZKAorCQkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BY2Nlc3NUeXBlLlBST1BFUlRZLAorCQkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFkKKwkJKTsKIAogCisJcHJpdmF0ZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFjY2Vzc1R5cGUgamF2YUFjY2Vzc1R5cGU7CisJcHJpdmF0ZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZSBvcm1BY2Nlc3NUeXBlOworCisJQWNjZXNzVHlwZShvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFjY2Vzc1R5cGUgamF2YUFjY2Vzc1R5cGUsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlIG9ybUFjY2Vzc1R5cGUpIHsKKwkJaWYgKGphdmFBY2Nlc3NUeXBlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCWlmIChvcm1BY2Nlc3NUeXBlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMuamF2YUFjY2Vzc1R5cGUgPSBqYXZhQWNjZXNzVHlwZTsKKwkJdGhpcy5vcm1BY2Nlc3NUeXBlID0gb3JtQWNjZXNzVHlwZTsKKwl9CisKKwlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BY2Nlc3NUeXBlIGdldEphdmFBY2Nlc3NUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5qYXZhQWNjZXNzVHlwZTsKKwl9CisKKwlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUgZ2V0T3JtQWNjZXNzVHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtQWNjZXNzVHlwZTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCiAJcHVibGljIHN0YXRpYyBBY2Nlc3NUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFjY2Vzc1R5cGUgamF2YUFjY2Vzc1R5cGUpIHsKLQkJaWYgKGphdmFBY2Nlc3NUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YUFjY2Vzc1R5cGUpIHsKLQkJCWNhc2UgRklFTEQ6Ci0JCQkJcmV0dXJuIEZJRUxEOwotCQkJY2FzZSBQUk9QRVJUWToKLQkJCQlyZXR1cm4gUFJPUEVSVFk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYWNjZXNzIHR5cGU6ICIgKyBqYXZhQWNjZXNzVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChqYXZhQWNjZXNzVHlwZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YVJlc291cmNlTW9kZWxfKGphdmFBY2Nlc3NUeXBlKTsKIAl9Ci0JCi0JcHVibGljIHN0YXRpYyBBY2Nlc3NUeXBlIGZyb21YbWxSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlIG9ybUFjY2Vzc1R5cGUpIHsKLQkJaWYgKG9ybUFjY2Vzc1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7CisKKwlwcml2YXRlIHN0YXRpYyBBY2Nlc3NUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbF8ob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BY2Nlc3NUeXBlIGphdmFBY2Nlc3NUeXBlKSB7CisJCWZvciAoQWNjZXNzVHlwZSBhY2Nlc3NUeXBlIDogQWNjZXNzVHlwZS52YWx1ZXMoKSkgeworCQkJaWYgKGFjY2Vzc1R5cGUuZ2V0SmF2YUFjY2Vzc1R5cGUoKSA9PSBqYXZhQWNjZXNzVHlwZSkgeworCQkJCXJldHVybiBhY2Nlc3NUeXBlOworCQkJfQogCQl9Ci0JCXN3aXRjaCAob3JtQWNjZXNzVHlwZSkgewotCQkJY2FzZSBGSUVMRDoKLQkJCQlyZXR1cm4gRklFTEQ7Ci0JCQljYXNlIFBST1BFUlRZOgotCQkJCXJldHVybiBQUk9QRVJUWTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBhY2Nlc3MgdHlwZTogIiArIG9ybUFjY2Vzc1R5cGUpOwotCQl9CisJCXJldHVybiBudWxsOwogCX0KLQkKLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlIHRvWG1sUmVzb3VyY2VNb2RlbChBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUpIHsKLQkJaWYgKGFjY2Vzc1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7CisKKwlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEFjY2Vzc1R5cGUgYWNjZXNzVHlwZSkgeworCQlyZXR1cm4gKGFjY2Vzc1R5cGUgPT0gbnVsbCkgPyBudWxsIDogYWNjZXNzVHlwZS5nZXRKYXZhQWNjZXNzVHlwZSgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgQWNjZXNzVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZSBvcm1BY2Nlc3NUeXBlKSB7CisJCXJldHVybiAob3JtQWNjZXNzVHlwZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tT3JtUmVzb3VyY2VNb2RlbF8ob3JtQWNjZXNzVHlwZSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgQWNjZXNzVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbF8ob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUgb3JtQWNjZXNzVHlwZSkgeworCQlmb3IgKEFjY2Vzc1R5cGUgYWNjZXNzVHlwZSA6IEFjY2Vzc1R5cGUudmFsdWVzKCkpIHsKKwkJCWlmIChhY2Nlc3NUeXBlLmdldE9ybUFjY2Vzc1R5cGUoKSA9PSBvcm1BY2Nlc3NUeXBlKSB7CisJCQkJcmV0dXJuIGFjY2Vzc1R5cGU7CisJCQl9CiAJCX0KLQkJc3dpdGNoIChhY2Nlc3NUeXBlKSB7Ci0JCQljYXNlIEZJRUxEOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRDsKLQkJCWNhc2UgUFJPUEVSVFk6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGFjY2VzcyB0eXBlOiAiICsgYWNjZXNzVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZSB0b09ybVJlc291cmNlTW9kZWwoQWNjZXNzVHlwZSBhY2Nlc3NUeXBlKSB7CisJCXJldHVybiAoYWNjZXNzVHlwZSA9PSBudWxsKSA/IG51bGwgOiBhY2Nlc3NUeXBlLmdldE9ybUFjY2Vzc1R5cGUoKTsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Fzc29jaWF0aW9uT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Fzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQppbmRleCAwZDZlNDJkLi40YjM5NjA3IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Bc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksOCArOSw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQogLyoqCiAgKiAKICAqIApAQCAtMjIsMjQgKzIwLDE0IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSBleHRlbmRzIEJhc2VPdmVycmlkZQogewotCTxUIGV4dGVuZHMgSm9pbkNvbHVtbj4gTGlzdEl0ZXJhdG9yPFQ+IGpvaW5Db2x1bW5zKCk7Ci0JPFQgZXh0ZW5kcyBKb2luQ29sdW1uPiBMaXN0SXRlcmF0b3I8VD4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQk8VCBleHRlbmRzIEpvaW5Db2x1bW4+IExpc3RJdGVyYXRvcjxUPiBkZWZhdWx0Sm9pbkNvbHVtbnMoKTsKLQlpbnQgam9pbkNvbHVtbnNTaXplKCk7Ci0JaW50IHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpOwotCWludCBkZWZhdWx0Sm9pbkNvbHVtbnNTaXplKCk7Ci0JSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0Jdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0Jdm9pZCBtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QgPSAic3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0IjsKLQkJU3RyaW5nIERFRkFVTFRfSk9JTl9DT0xVTU5TX0xJU1QgPSAiZGVmYXVsdEpvaW5Db2x1bW5zTGlzdCI7Ci0JCQotCWJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCisJQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwkKIAlBc3NvY2lhdGlvbk92ZXJyaWRlLk93bmVyIGdldE93bmVyKCk7CiAJCiAJQXNzb2NpYXRpb25PdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCk7CiAJCisJdm9pZCBpbml0aWFsaXplRnJvbShBc3NvY2lhdGlvbk92ZXJyaWRlIG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUpOworCiAJaW50ZXJmYWNlIE93bmVyIGV4dGVuZHMgQmFzZU92ZXJyaWRlLk93bmVyCiAJewogCQkvKioKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Fzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Fzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGQ2ZDNlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcgorCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKK3sKKworCS8vICoqKioqKioqKioqKioqKiogYXNzb2NpYXRpb24gb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBhc3NvY2lhdGlvbiBvdmVycmlkZXMgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KKwkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCisJICovCisJPFQgZXh0ZW5kcyBBc3NvY2lhdGlvbk92ZXJyaWRlPiBMaXN0SXRlcmF0b3I8VD4gYXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGFzc29jaWF0aW9uIG92ZXJyaWRlcywgYm90aCBzcGVjaWZpZWQgYW5kIGRlZmF1bHQuCisJICovCisJaW50IGFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpOworCisJLyoqCisJICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgc3BlY2lmaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlcy4KKwkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuICBObyBhZGQvcmVtb3ZlIGZvciBzcGVjaWZpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGVzLCB0aGUKKwkgKiB2aXJ0dWFsIGFzc29jaWF0aW9uIG92ZXJyaWRlcyB3aWxsIGJlIHBvcHVsYXRlZCBmcm9tIHN1cGVyY2xhc3NlcywgdGhlbiB1c2UKKwkgKiB7QGxpbmsgQXNzb2NpYXRpb25PdmVycmlkZSNzZXRWaXJ0dWFsKGJvb2xlYW4pfSB0byBhZGQvcmVtb3ZlIHRoZSBhc3NvY2lhdGlvbgorCSAqIG92ZXJyaWRlIGZyb20gdGhlIHNvdXJjZQorCSAqLworCTxUIGV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZT4gTGlzdEl0ZXJhdG9yPFQ+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzcGVjaWZpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGVzLgorCSAqLworCWludCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGRlZmF1bHQgYXNzb2NpYXRpb24gb3ZlcnJpZGVzLgorCSAqLworCTxUIGV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZT4gTGlzdEl0ZXJhdG9yPFQ+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGVmYXVsdCBhc3NvY2lhdGlvbiBvdmVycmlkZXMuCisJICovCisJaW50IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKTsKKworCS8qKgorCSAqIE1vdmUgdGhlIHNwZWNpZmllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KKwkgKi8KKwl2b2lkIG1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKKwkJU3RyaW5nIFNQRUNJRklFRF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCA9ICJzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QgPSAidmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIHRoZSBhc3NvY2lhdGlvbiBvdmVycmlkZSwgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdCwKKwkgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqLworCUFzc29jaWF0aW9uT3ZlcnJpZGUgZ2V0QXNzb2NpYXRpb25PdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKTsKKwkKKwkKKwlPd25lciBnZXRPd25lcigpOworCQorCWludGVyZmFjZSBPd25lcgorCXsKKwkJLyoqCisJCSAqIFJldHVybiB0aGUgdHlwZSBtYXBwaW5nIG9mIHRoZSBvd25pbmcgcGVyc2lzdGVudCB0eXBlLgorCQkgKi8KKwkJVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKTsKKwkJCisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIG92ZXJyaWRhYmxlIHBlcnNpc3RlbnQgdHlwZSwgbm90IHRoZSBvd25pbmcgcGVyc2lzdGVudCB0eXBlLgorCQkgKiBUaGlzIHdpbGwgYmUgdGhlIHBlcnNpc3RlbnQgdHlwZSBvZiB0aGUgbWFwcGVkIHN1cGVyY2xhc3Mgb3IgZW1iZWRkYWJsZS4KKwkJICovCisJCVR5cGVNYXBwaW5nIGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKKwkJCisJCVJlbGF0aW9uc2hpcFJlZmVyZW5jZSByZXNvbHZlUmVsYXRpb25zaGlwUmVmZXJlbmNlKFN0cmluZyBhc3NvY2lhdGlvbk92ZXJyaWRlTmFtZSk7CisJfQorCisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Fzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Fzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODQ4ZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CisKKy8qKgorICogQW4gPGNvZGU+QXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTwvY29kZT4gaXMgYSB0eXBlIG9mIAorICoge0BsaW5rIFJlbGF0aW9uc2hpcFJlZmVyZW5jZX0gdGhhdCBtYXkgdXRpbGl6ZSBhIAorICoge0BsaW5rIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3l9CisgKiA8cD4KKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAc2VlIEFzc29jaWF0aW9uT3ZlcnJpZGUKKyAqLworcHVibGljIGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlIAorCWV4dGVuZHMgCisJCVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwKKwkJSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwlBc3NvY2lhdGlvbk92ZXJyaWRlIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKKwkKKwl2b2lkIGluaXRpYWxpemVGcm9tKEFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2Ugb2xkQXNzb2NpYXRpb25PdmVycmlkZSk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0F0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0F0dHJpYnV0ZU1hcHBpbmcuamF2YQppbmRleCBhZWM5MGZmLi4wNDE2MTcxIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9BdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQXR0cmlidXRlTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMzIgKzksNDMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKIC8qKgotICogCi0gKiAKKyAqIEpQQSBhdHRyaWJ1dGUgbWFwcGluZy4KKyAqIDxwPgogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKICAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlTWFwcGluZyBleHRlbmRzIEpwYUNvbnRleHROb2RlCitwdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZU1hcHBpbmcKKwlleHRlbmRzIEpwYUNvbnRleHROb2RlCiB7CiAJUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCisJU3RyaW5nIGdldE5hbWUoKTsKIAogCWJvb2xlYW4gaXNEZWZhdWx0KCk7CiAKIAkvKioKLQkgKiBSZXR1cm4gYSB1bmlxdWUga2V5IGZvciB0aGUgSVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBwaW5nLiAgSWYgdGhpcyBpcyBkZWZpbmVkIGluCisJICogUmV0dXJuIGEgdW5pcXVlIGtleSBmb3IgdGhlIGF0dHJpYnV0ZSBtYXBwaW5nLiAgSWYgdGhpcyBpcyBkZWZpbmVkIGluCiAJICogYW4gZXh0ZW5zaW9uIHRoZXkgc2hvdWxkIGJlIGVxdWFsLgogCSAqLwogCVN0cmluZyBnZXRLZXkoKTsKIAogCS8qKgotCSAqIElmIHRoZSBtYXBwaW5nIGlzIGZvciBhIHByaW1hcnkga2V5IGNvbHVtbiwgcmV0dXJuIHRoZSBjb2x1bW4ncyBuYW1lLAotCSAqIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgImF0dHJpYnV0ZSIgbWFwcGluZyBjYW4gYmUgb3ZlcnJpZGRlbi4KKwkgKiBNdXN0IGJlIGEge0BsaW5rIENvbHVtbk1hcHBpbmd9CiAJICovCi0JU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7CisJYm9vbGVhbiBpc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpOworCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlICJhc3NvY2lhdGlvbiIgbWFwcGluZyBjYW4gYmUgb3ZlcnJpZGRlbi4KKwkgKiBNdXN0IGJlIGEge0BsaW5rIFJlbGF0aW9uc2hpcE1hcHBpbmd9CisJICovCisJYm9vbGVhbiBpc092ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nKCk7CiAKIAkvKioKIAkgKiBSZXR1cm4gdGhlIG1hcHBpbmcgZm9yIHRoZSBhdHRyaWJ1dGUgbWFwcGluZydzIGF0dHJpYnV0ZSdzIHR5cGUuCkBAIC00MiwxNyArNTMsNTMgQEAKIAlUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpOwogCiAJLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlICJhdHRyaWJ1dGUiIG1hcHBpbmcgY2FuIGJlIG92ZXJyaWRkZW4uCi0JICovCi0JYm9vbGVhbiBpc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlICJhc3NvY2lhdGlvbiIgbWFwcGluZyBjYW4gYmUgb3ZlcnJpZGRlbi4KLQkgKi8KLQlib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmcoKTsKLQotCS8qKgogCSAqIFJldHVybiB3aGV0aGVyIHRoZSAiYXR0cmlidXRlIiBtYXBwaW5nIGlzIGZvciBhbiBJRC4KIAkgKi8KIAlib29sZWFuIGlzSWRNYXBwaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCisJLyoqCisJICogSWYgdGhlIG1hcHBpbmcgaXMgZm9yIGEgcHJpbWFyeSBrZXkgY29sdW1uLCByZXR1cm4gdGhlIGNvbHVtbidzIG5hbWUsCisJICogb3RoZXJ3aXNlIHJldHVybiBudWxsLgorCSAqLworCVN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpOworCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBtYXBwaW5nIG1hbmFnZXMgYSByZWxhdGlvbnNoaXAgd2l0aCB0aGlzIG1hcHBpbmcKKwkgKi8KKwlib29sZWFuIGlzT3duZWRCeShSZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmcpOworCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIGFueSBkYXRhYmFzZSBtZXRhZGF0YSBzcGVjaWZpYyB2YWxpZGF0aW9uIHNob3VsZCBvY2N1ci4KKwkgKiAoRm9yIGluc3RhbmNlLCBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgYWN0aXZlLCB0aGVuIGl0IHNob3VsZCBub3QuKQorCSAqLworCWJvb2xlYW4gc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKTsKKworCS8qKgorCSAqIFR5cGljYWxseSB0aGlzIHdpbGwganVzdCBiZSBhIHNpbmdsZSBlbGVtZW50IGl0ZXJhdG9yIHdpdGggdGhlIG5hbWUgb2YgdGhlIG1hcHBpbmcuCisJICogSW4gYSAyLjAgcHJvamVjdCwgYW4gZW1iZWRkZWQgbWFwcGluZyBzaG91bGQgcmV0dXJuIGl0cyBvd24gbmFtZSBhcyB3ZWxsIGFzIAorCSAqIHRoZSBuYW1lIG9mIGl0cyB0YXJnZXQgRW1iZWRkYWJsZSdzIG1hcHBpbmdzIHdpdGggdGhlIGVtYmVkZGVkIG1hcHBpbmcgbmFtZSAKKwkgKiBwcmVwZW5kZWQgOiAiZW1iZWRkZWQiLCAiZW1iZWRkZWQuZm9vIiwgImVtYmVkZGVkLmJhciIuCisJICovCisJSXRlcmF0b3I8U3RyaW5nPiBhbGxNYXBwaW5nTmFtZXMoKTsKKwkKKwlJdGVyYXRvcjxTdHJpbmc+IGFsbE92ZXJyaWRlYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpOworCQorCUl0ZXJhdG9yPFN0cmluZz4gYWxsT3ZlcnJpZGVhYmxlQXNzb2NpYXRpb25NYXBwaW5nTmFtZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhpcyBhdHRyaWJ1dGUgbWFwcGluZyBpZiBpdHMgbmFtZSBtYXRjaGVzIHRoZSBuYW1lLgorCSAqIEluIDIuMCB0aGlzIG5hbWUgY291bGQgdXNlIGRvdC1ub3RhdGlvbiBmb3IgbmVzdGVkIG1hcHBpbmdzLgorCSAqIDIuMCBFbWJlZGRlZCBtYXBwaW5ncyB3aWxsIGhhdmUgdG8gcGFyc2UgdGhpcyBuYW1lIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIAorCSAqIG5lc3RlZCBhdHRyaWJ1dGUgbWFwcGluZy4KKwkgKi8KKwlBdHRyaWJ1dGVNYXBwaW5nIHJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBDb2x1bW4gb2YgdGhlIG92ZXJyaWRhYmxlIGF0dHJpYnV0ZSBtYXBwaW5nIHdpdGggdGhlIGdpdmVuIAorCSAqIGF0dHJpYnV0ZSBuYW1lLiBJbiAyLjAgdGhpcyBuYW1lIGNvdWxkIHVzZSBkb3Qtbm90YXRpb24gZm9yIG5lc3RlZCBtYXBwaW5ncy4KKwkgKi8KKwlDb2x1bW4gcmVzb2x2ZU92ZXJyaWRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlTmFtZSk7CisKKwlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcmVzb2x2ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShTdHJpbmcgYXR0cmlidXRlTmFtZSk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0F0dHJpYnV0ZU92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9BdHRyaWJ1dGVPdmVycmlkZS5qYXZhCmluZGV4IDYwNDYzNmQuLmI0NmQyODQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0F0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0yOSwxMCArMjksMTAgQEAKIAlpbnRlcmZhY2UgT3duZXIgZXh0ZW5kcyBCYXNlT3ZlcnJpZGUuT3duZXIKIAl7CiAJCS8qKgotCQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBtYXBwaW5nIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZSBuYW1lLgorCQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBvZiB0aGUgbWFwcGluZyBvciBhdHRyaWJ1dGUgb3ZlcnJpZGUgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlIG5hbWUuCiAJCSAqIFJldHVybiBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAgVGhpcyBjb2x1bW4gbWFwcGluZwogCQkgKiB3aWxsIGJlIGZvdW5kIGluIHRoZSBtYXBwZWQgc3VwZXJjbGFzcyAob3IgZW1iZWRkYWJsZSksIG5vdCBpbiB0aGUgb3duaW5nIGVudGl0eQogCQkgKi8KLQkJQ29sdW1uTWFwcGluZyBnZXRDb2x1bW5NYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKKwkJQ29sdW1uIHJlc29sdmVPdmVycmlkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpOwogCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmE4NzkxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyCisJZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQoreworCisJLy8gKioqKioqKioqKioqKioqKiBhdHRyaWJ1dGUgb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHdoZXRoZXIgc3BlY2lmaWVkIG9yIGRlZmF1bHQuCisJICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgorCSAqLworCTxUIGV4dGVuZHMgQXR0cmlidXRlT3ZlcnJpZGU+IExpc3RJdGVyYXRvcjxUPiBhdHRyaWJ1dGVPdmVycmlkZXMoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZSBvdmVycmlkZXMsIGJvdGggc3BlY2lmaWVkIGFuZCBkZWZhdWx0LgorCSAqLworCWludCBhdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcy4KKwkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuICBObyBhZGQvcmVtb3ZlIGZvciBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcywgdGhlCisJICogdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHdpbGwgYmUgcG9wdWxhdGVkIGZyb20gc3VwZXJjbGFzc2VzLCB0aGVuIHVzZQorCSAqIHtAbGluayBBdHRyaWJ1dGVPdmVycmlkZSNzZXRWaXJ0dWFsKGJvb2xlYW4pfSB0byBhZGQvcmVtb3ZlIHRoZSBhdHRyaWJ1dGUKKwkgKiBvdmVycmlkZSBmcm9tIHRoZSBzb3VyY2UKKwkgKi8KKwk8VCBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBMaXN0SXRlcmF0b3I8VD4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcy4KKwkgKi8KKwlpbnQgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOworCisJLyoqCisJICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGVzLCB0aG9zZSBub3Qgc3BlY2lmaWVkLgorCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KKwkgKi8KKwk8VCBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBMaXN0SXRlcmF0b3I8VD4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGVmYXVsdCBhdHRyaWJ1dGUgb3ZlcnJpZGVzLgorCSAqLworCWludCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOworCisJLyoqCisJICogTW92ZSB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBvdmVycmlkZSBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KKwkgKi8KKwl2b2lkIG1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7CisJCVN0cmluZyBTUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUID0gInNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNUID0gInZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBvdmVycmlkZSwgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdCwKKwkgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqLworCUF0dHJpYnV0ZU92ZXJyaWRlIGdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpOworCQorCQorCU93bmVyIGdldE93bmVyKCk7CisJCisJaW50ZXJmYWNlIE93bmVyCisJeworCQkKKwkJLyoqCisJCSAqIFJldHVybiB0aGUgdHlwZSBtYXBwaW5nIG9mIHRoZSBvd25pbmcgcGVyc2lzdGVudCB0eXBlLgorCQkgKi8KKwkJVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKTsKKwkJCisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIG92ZXJyaWRhYmxlIHBlcnNpc3RlbnQgdHlwZSwgbm90IHRoZSBvd25pbmcgcGVyc2lzdGVudCB0eXBlLgorCQkgKiBUaGlzIHdpbGwgYmUgdGhlIHBlcnNpc3RlbnQgdHlwZSBvZiB0aGUgbWFwcGVkIHN1cGVyY2xhc3Mgb3IgZW1iZWRkYWJsZS4KKwkJICovCisJCVR5cGVNYXBwaW5nIGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKKwkJCisJCQorCQlDb2x1bW4gcmVzb2x2ZU92ZXJyaWRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlT3ZlcnJpZGVOYW1lKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Jhc2VDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Jhc2VDb2x1bW4uamF2YQppbmRleCBiODE0YzJhLi5kNWMxNWI3IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9CYXNlQ29sdW1uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQmFzZUNvbHVtbi5qYXZhCkBAIC0yNCw1MSArMjQsNTEgQEAKIAlTdHJpbmcgZ2V0VGFibGUoKTsKIAogCVN0cmluZyBnZXREZWZhdWx0VGFibGUoKTsKLQkJU3RyaW5nIERFRkFVTFRfVEFCTEVfUFJPUEVSVFkgPSAiZGVmYXVsdFRhYmxlUHJvcGVydHkiOworCQlTdHJpbmcgREVGQVVMVF9UQUJMRV9QUk9QRVJUWSA9ICJkZWZhdWx0VGFibGUiOyAvLyROT04tTkxTLTEkCiAKIAlTdHJpbmcgZ2V0U3BlY2lmaWVkVGFibGUoKTsKIAl2b2lkIHNldFNwZWNpZmllZFRhYmxlKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVGFibGVQcm9wZXJ0eSI7CisJCVN0cmluZyBTUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVGFibGUiOyAvLyROT04tTkxTLTEkCiAKIAkKLQlCb29sZWFuIGdldFVuaXF1ZSgpOworCWJvb2xlYW4gaXNVbmlxdWUoKTsKIAkKLQlCb29sZWFuIGdldERlZmF1bHRVbmlxdWUoKTsKLQkJU3RyaW5nIERFRkFVTFRfVU5JUVVFX1BST1BFUlRZID0gImRlZmF1bHRVbmlxdWVQcm9wZXJ0eSI7Ci0JCUJvb2xlYW4gREVGQVVMVF9VTklRVUUgPSBCb29sZWFuLkZBTFNFOworCWJvb2xlYW4gaXNEZWZhdWx0VW5pcXVlKCk7CisJCVN0cmluZyBERUZBVUxUX1VOSVFVRV9QUk9QRVJUWSA9ICJkZWZhdWx0VW5pcXVlIjsgLy8kTk9OLU5MUy0xJAorCQlib29sZWFuIERFRkFVTFRfVU5JUVVFID0gZmFsc2U7CiAJQm9vbGVhbiBnZXRTcGVjaWZpZWRVbmlxdWUoKTsKIAl2b2lkIHNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuIG5ld1NwZWNpZmllZFVuaXF1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfVU5JUVVFX1BST1BFUlRZID0gInNwZWNpZmllZFVuaXF1ZVByb3BlcnR5IjsKKwkJU3RyaW5nIFNQRUNJRklFRF9VTklRVUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVW5pcXVlIjsgLy8kTk9OLU5MUy0xJAogCQogCi0JQm9vbGVhbiBnZXROdWxsYWJsZSgpOworCWJvb2xlYW4gaXNOdWxsYWJsZSgpOwogCQkKLQlCb29sZWFuIGdldERlZmF1bHROdWxsYWJsZSgpOwotCQlTdHJpbmcgREVGQVVMVF9OVUxMQUJMRV9QUk9QRVJUWSA9ICJkZWZhdWx0TnVsbGFibGVQcm9wZXJ0eSI7Ci0JCUJvb2xlYW4gREVGQVVMVF9OVUxMQUJMRSA9IEJvb2xlYW4uVFJVRTsKKwlib29sZWFuIGlzRGVmYXVsdE51bGxhYmxlKCk7CisJCVN0cmluZyBERUZBVUxUX05VTExBQkxFX1BST1BFUlRZID0gImRlZmF1bHROdWxsYWJsZSI7IC8vJE5PTi1OTFMtMSQKKwkJYm9vbGVhbiBERUZBVUxUX05VTExBQkxFID0gdHJ1ZTsKIAlCb29sZWFuIGdldFNwZWNpZmllZE51bGxhYmxlKCk7CiAJdm9pZCBzZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuIG5ld1NwZWNpZmllZE51bGxhYmxlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9OVUxMQUJMRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWROdWxsYWJsZVByb3BlcnR5IjsKKwkJU3RyaW5nIFNQRUNJRklFRF9OVUxMQUJMRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWROdWxsYWJsZSI7IC8vJE5PTi1OTFMtMSQKIAogCi0JQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCk7CisJYm9vbGVhbiBpc0luc2VydGFibGUoKTsKIAkKLQlCb29sZWFuIGdldERlZmF1bHRJbnNlcnRhYmxlKCk7Ci0JCVN0cmluZyBERUZBVUxUX0lOU0VSVEFCTEVfUFJPUEVSVFkgPSAiZGVmYXVsSW5zZXJ0YWJsZVByb3BlcnR5IjsKLQkJQm9vbGVhbiBERUZBVUxUX0lOU0VSVEFCTEUgPSBCb29sZWFuLlRSVUU7CisJYm9vbGVhbiBpc0RlZmF1bHRJbnNlcnRhYmxlKCk7CisJCVN0cmluZyBERUZBVUxUX0lOU0VSVEFCTEVfUFJPUEVSVFkgPSAiZGVmYXVsdEluc2VydGFibGUiOyAvLyROT04tTkxTLTEkCisJCWJvb2xlYW4gREVGQVVMVF9JTlNFUlRBQkxFID0gdHJ1ZTsKIAlCb29sZWFuIGdldFNwZWNpZmllZEluc2VydGFibGUoKTsKIAl2b2lkIHNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRJbnNlcnRhYmxlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9JTlNFUlRBQkxFX1BST1BFUlRZID0gInNwZWNpZmllZEluc2VydGFibGVQcm9wZXJ0eSI7CisJCVN0cmluZyBTUEVDSUZJRURfSU5TRVJUQUJMRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRJbnNlcnRhYmxlIjsgLy8kTk9OLU5MUy0xJAogCQogCQotCUJvb2xlYW4gZ2V0VXBkYXRhYmxlKCk7CisJYm9vbGVhbiBpc1VwZGF0YWJsZSgpOwogCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFVwZGF0YWJsZSgpOwotCQlTdHJpbmcgREVGQVVMVF9VUERBVEFCTEVfUFJPUEVSVFkgPSAiZGVmYXVsVXBkYXRhYmxlUHJvcGVydHkiOwotCQlCb29sZWFuIERFRkFVTFRfVVBEQVRBQkxFID0gQm9vbGVhbi5UUlVFOworCWJvb2xlYW4gaXNEZWZhdWx0VXBkYXRhYmxlKCk7CisJCVN0cmluZyBERUZBVUxUX1VQREFUQUJMRV9QUk9QRVJUWSA9ICJkZWZhdWx0VXBkYXRhYmxlIjsgLy8kTk9OLU5MUy0xJAorCQlib29sZWFuIERFRkFVTFRfVVBEQVRBQkxFID0gdHJ1ZTsKIAlCb29sZWFuIGdldFNwZWNpZmllZFVwZGF0YWJsZSgpOwogCXZvaWQgc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4gbmV3U3BlY2lmaWVkVXBkYXRhYmxlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9VUERBVEFCTEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVXBkYXRhYmxlUHJvcGVydHkiOworCQlTdHJpbmcgU1BFQ0lGSUVEX1VQREFUQUJMRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRVcGRhdGFibGUiOyAvLyROT04tTkxTLTEkCiAKIAkvL1RPRE8gbm90IHN1cmUgd2UgcmVhbGx5IG5lZWQvd2FudCB0aGlzIHRvIGJlIHB1YmxpYy4gIFRoaXMKIAkvL2lzIHVzZWQgYnkgQ29sdW1uQ29tcG9zaXRlIHRvIGdldCBhIGxpc3Qgb2YgcG9zc2libGUgYXNzb2NpYXRlZCB0YWJsZXMsIGJ1dApAQCAtODIsNyArODIsNyBAQAogCWludGVyZmFjZSBPd25lciBleHRlbmRzIE5hbWVkQ29sdW1uLk93bmVyCiAJewogCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSB0aGF0IGNvbnRhaW5zIHRoZSBjb2x1bW4uCisJCSAqIFJldHVybiB0aGUgdGFibGUgdG8gd2hpY2ggdGhlIGNvbHVtbiBiZWxvbmdzIGJ5IGRlZmF1bHQuCiAJCSAqLwogCQlTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwogCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Jhc2VFbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Jhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQppbmRleCBjZWQxNzdhLi5hNTI1M2M3IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9CYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQmFzZUVtYmVkZGVkTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksOCArOSw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQogLyoqCiAgKiAKICAqIApAQCAtMjAsNTMgKzE4LDggQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBCYXNlRW1iZWRkZWRNYXBwaW5nIGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZywgQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIKK3B1YmxpYyBpbnRlcmZhY2UgQmFzZUVtYmVkZGVkTWFwcGluZyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcKIHsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIGF0dHJpYnV0ZSBvdmVycmlkZXMgd2hldGhlciBzcGVjaWZpZWQgb3IgdmlydHVhbC4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JPFQgZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZT4gTGlzdEl0ZXJhdG9yPFQ+IGF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZSBvdmVycmlkZXMsIGJvdGggc3BlY2lmaWVkIGFuZCBkZWZhdWx0LgotCSAqLwotCWludCBhdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JPFQgZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZT4gTGlzdEl0ZXJhdG9yPFQ+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCA9ICJzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0IjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcy4KLQkgKi8KLQlpbnQgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGVzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBMaXN0SXRlcmF0b3I8VD4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QgPSAidmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc0xpc3QiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGVzLgotCSAqLwotCWludCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCQkKLQkvKioKLQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBvdmVycmlkZXMsIHdoZXRoZXIgc3BlY2lmaWVkIG9yIGRlZmF1bHQsCi0JICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKi8KLQlBdHRyaWJ1dGVPdmVycmlkZSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKTsKKwlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwogCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9CYXNlSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQmFzZUpvaW5Db2x1bW4uamF2YQppbmRleCA2Yjc5NDMwLi5lZDE4Njk1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9CYXNlSm9pbkNvbHVtbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Jhc2VKb2luQ29sdW1uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMjEsMjEgKzIxLDI3IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmFzZUpvaW5Db2x1bW4gZXh0ZW5kcyBOYW1lZENvbHVtbgorcHVibGljIGludGVyZmFjZSBCYXNlSm9pbkNvbHVtbgorCWV4dGVuZHMgTmFtZWRDb2x1bW4KIHsKIAlTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQlTdHJpbmcgZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7CiAJU3RyaW5nIGdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7CiAJdm9pZCBzZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUiOwotCQlTdHJpbmcgREVGQVVMVF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gImRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSI7CisJCVN0cmluZyBTUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7CisJCVN0cmluZyBERUZBVUxUX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAiZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lIjsgLy8kTk9OLU5MUy0xJAogCQogCS8qKgogCSAqIFJldHVybiB0aGUgd3JhcHBlciBmb3IgdGhlIGRhdGFzb3VyY2UgcmVmZXJlbmNlZCBjb2x1bW4KIAkgKi8KLQlDb2x1bW4gZ2V0RGJSZWZlcmVuY2VkQ29sdW1uKCk7CisJQ29sdW1uIGdldFJlZmVyZW5jZWREYkNvbHVtbigpOwogCiAJLyoqCisJICogUmV0dXJuIHRoZSB3cmFwcGVyIGZvciB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gZGF0YXNvdXJjZSB0YWJsZQorCSAqLworCVRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCk7CisJCisJLyoqCiAJICogUmV0dXJuIHdoZXRoZXIgdGhlIHJlZmVyZW5jZSBjb2x1bW4gaXMgZm91bmQgb24gdGhlIGRhdGFzb3VyY2UKIAkgKi8KIAlib29sZWFuIGlzUmVmZXJlbmNlZENvbHVtblJlc29sdmVkKCk7CkBAIC00Nyw3ICs1Myw3IEBACiAJCS8qKgogCQkgKiBSZXR1cm4gdGhlIHdyYXBwZXIgZm9yIHRoZSBkYXRhc291cmNlIHRhYmxlIGZvciB0aGUgcmVmZXJlbmNlZCBjb2x1bW4KIAkJICovCi0JCVRhYmxlIGdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCk7CisJCVRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCk7CiAJCQogCQlib29sZWFuIGlzVmlydHVhbChCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKTsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9CYXNlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Jhc2VPdmVycmlkZS5qYXZhCmluZGV4IGZhMmFiZWQuLjhiNTU3M2UgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Jhc2VPdmVycmlkZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Jhc2VPdmVycmlkZS5qYXZhCkBAIC0yMyw3ICsyMyw3IEBACiAKIAlTdHJpbmcgZ2V0TmFtZSgpOwogCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOworCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAogCQogCS8qKgogCSAqIFJldHVybiB0cnVlIGlmIG92ZXJyaWRlIGV4aXN0cyBhcyBzcGVjaWZpZWQgb24gdGhlIG93bmluZyBvYmplY3QsIG9yIGZhbHNlCkBAIC0zMSw2ICszMSwxMiBAQAogCSAqLwogCWJvb2xlYW4gaXNWaXJ0dWFsKCk7CiAKKwkvKioKKwkgKiBJZiBmYWxzZSwgYWRkIHRoZSBnaXZlbiBvdmVycmlkZSBhcyBhIHNwZWNpZmllZCBvdmVycmlkZSBhbmQgcmVtb3ZlCisJICogaXQgZnJvbSB0aGUgbGlzdCBvZiB2aXJ0dWFsIG92ZXJyaWRlcy4gIElmIHRydWUsIHRoZW4gcmVtb3ZlIGl0CisJICogZnJvbSB0aGUgc3BlY2lmaWVkIG92ZXJyaWRlcyBhbmQgYWRkIGl0IHRvIHRoZSB2aXJ0dWFsIG92ZXJyaWRlcworCSAqIGFzIGFwcGxpY2FibGUuICBSZXR1cm4gdGhlIG5ldyBvdmVycmlkZSAod2hldGhlciB2aXJ0dWFsIG9yIHNwZWNpZmllZCkKKwkgKi8KIAlCYXNlT3ZlcnJpZGUgc2V0VmlydHVhbChib29sZWFuIHZpcnR1YWwpOwogCQogCWludGVyZmFjZSBPd25lcgpAQCAtNDksNyArNTUsNyBAQAogCQlib29sZWFuIGlzVmlydHVhbChCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUpOwogCQkKIAkJLyoqCi0JCSAqIElmIGZhbHNlLCBhZGQgdGhlIGdpdmUgb3ZlcnJpZGUgYXMgYSBzcGVjaWZpZWQgb3ZlcnJpZGUgYW5kIHJlbW92ZQorCQkgKiBJZiBmYWxzZSwgYWRkIHRoZSBnaXZlbiBvdmVycmlkZSBhcyBhIHNwZWNpZmllZCBvdmVycmlkZSBhbmQgcmVtb3ZlCiAJCSAqIGl0IGZyb20gdGhlIGxpc3Qgb2YgdmlydHVhbCBvdmVycmlkZXMuICBJZiB0cnVlLCB0aGVuIHJlbW92ZSBpdAogCQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgb3ZlcnJpZGVzIGFuZCBhZGQgaXQgdG8gdGhlIHZpcnR1YWwgb3ZlcnJpZGVzCiAJCSAqIGFzIGFwcGxpY2FibGUuICBSZXR1cm4gdGhlIG5ldyBvdmVycmlkZSAod2hldGhlciB2aXJ0dWFsIG9yIHNwZWNpZmllZCkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Jhc2ljTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQmFzaWNNYXBwaW5nLmphdmEKaW5kZXggNDQwMDVhZC4uY2IyOGM2YSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQmFzaWNNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQmFzaWNNYXBwaW5nLmphdmEKQEAgLTE4LDIzICsxOCwxMCBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2ljTWFwcGluZyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcsIENvbHVtbk1hcHBpbmcsIEZldGNoYWJsZSwgTnVsbGFibGUKK3B1YmxpYyBpbnRlcmZhY2UgQmFzaWNNYXBwaW5nIAorCWV4dGVuZHMgQXR0cmlidXRlTWFwcGluZywgQ29sdW1uTWFwcGluZywgRmV0Y2hhYmxlLCBOdWxsYWJsZSwgQ29udmVydGlibGVNYXBwaW5nCiB7CiAJRmV0Y2hUeXBlIERFRkFVTFRfRkVUQ0hfVFlQRSA9IEZldGNoVHlwZS5FQUdFUjsKIAotCWJvb2xlYW4gaXNMb2IoKTsKLQotCXZvaWQgc2V0TG9iKGJvb2xlYW4gdmFsdWUpOwotCQlTdHJpbmcgTE9CX1BST1BFUlRZID0gImxvYlByb3BlcnR5IjsKIAkKLQlFbnVtVHlwZSBnZXRFbnVtZXJhdGVkKCk7Ci0JCi0JRW51bVR5cGUgZ2V0RGVmYXVsdEVudW1lcmF0ZWQoKTsKLQkJU3RyaW5nIERFRkFVTFRfRU5VTUVSQVRFRF9QUk9QRVJUWSA9ICJkZWZhdWx0RW51bWVyYXRlZFByb3BlcnR5IjsKLQkJRW51bVR5cGUgREVGQVVMVF9FTlVNRVJBVEVEID0gRW51bVR5cGUuT1JESU5BTDsKLQotCUVudW1UeXBlIGdldFNwZWNpZmllZEVudW1lcmF0ZWQoKTsKLQl2b2lkIHNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUgbmV3U3BlY2lmaWVkRW51bWVyYXRlZCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfRU5VTUVSQVRFRF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRFbnVtZXJhdGVkUHJvcGVydHkiOwotCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9DYXNjYWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9DYXNjYWRlLmphdmEKaW5kZXggYWY2ODY1NC4uM2EwM2Y1OCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQ2FzY2FkZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Nhc2NhZGUuamF2YQpAQCAtMjMsMjEgKzIzLDIxIEBACiAKIAlib29sZWFuIGlzQWxsKCk7CiAJdm9pZCBzZXRBbGwoYm9vbGVhbiB2YWx1ZSk7Ci0JCVN0cmluZyBBTExfUFJPUEVSVFkgPSAiYWxsUHJvcGVydHkiOworCQlTdHJpbmcgQUxMX1BST1BFUlRZID0gImFsbCI7IC8vJE5PTi1OTFMtMSQKIAogCWJvb2xlYW4gaXNQZXJzaXN0KCk7CiAJdm9pZCBzZXRQZXJzaXN0KGJvb2xlYW4gdmFsdWUpOwotCQlTdHJpbmcgUEVSU0lTVF9QUk9QRVJUWSA9ICJwZXJzaXN0UHJvcGVydHkiOworCQlTdHJpbmcgUEVSU0lTVF9QUk9QRVJUWSA9ICJwZXJzaXN0IjsgLy8kTk9OLU5MUy0xJAogCiAJYm9vbGVhbiBpc01lcmdlKCk7CiAJdm9pZCBzZXRNZXJnZShib29sZWFuIHZhbHVlKTsKLQkJU3RyaW5nIE1FUkdFX1BST1BFUlRZID0gIm1lcmdlUHJvcGVydHkiOworCQlTdHJpbmcgTUVSR0VfUFJPUEVSVFkgPSAibWVyZ2UiOyAvLyROT04tTkxTLTEkCiAKIAlib29sZWFuIGlzUmVtb3ZlKCk7CiAJdm9pZCBzZXRSZW1vdmUoYm9vbGVhbiB2YWx1ZSk7Ci0JCVN0cmluZyBSRU1PVkVfUFJPUEVSVFkgPSAicmVtb3ZlUHJvcGVydHkiOworCQlTdHJpbmcgUkVNT1ZFX1BST1BFUlRZID0gInJlbW92ZSI7IC8vJE5PTi1OTFMtMSQKIAogCWJvb2xlYW4gaXNSZWZyZXNoKCk7CiAJdm9pZCBzZXRSZWZyZXNoKGJvb2xlYW4gdmFsdWUpOwotCQlTdHJpbmcgUkVGUkVTSF9QUk9QRVJUWSA9ICJyZWZyZXNoUHJvcGVydHkiOworCQlTdHJpbmcgUkVGUkVTSF9QUk9QRVJUWSA9ICJyZWZyZXNoIjsgLy8kTk9OLU5MUy0xJAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Db2x1bW4uamF2YQppbmRleCA1NTgzNGMyLi5mM2E3YTY1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Db2x1bW4uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Db2x1bW4uamF2YQpAQCAtMjAsNDAgKzIwLDM1IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ29sdW1uIGV4dGVuZHMgQmFzZUNvbHVtbgogewotCUludGVnZXIgZ2V0TGVuZ3RoKCk7CisJaW50IGdldExlbmd0aCgpOwogCi0JSW50ZWdlciBnZXREZWZhdWx0TGVuZ3RoKCk7Ci0JSW50ZWdlciBERUZBVUxUX0xFTkdUSCA9IEludGVnZXIudmFsdWVPZigyNTUpOwotCQlTdHJpbmcgREVGQVVMVF9MRU5HVEhfUFJPUEVSVFkgPSAiZGVmYXVsdExlbmd0aFByb3BlcnR5IjsKKwlpbnQgZ2V0RGVmYXVsdExlbmd0aCgpOworCQlpbnQgREVGQVVMVF9MRU5HVEggPSAyNTU7CisJCVN0cmluZyBERUZBVUxUX0xFTkdUSF9QUk9QRVJUWSA9ICJkZWZhdWx0TGVuZ3RoIjsgLy8kTk9OLU5MUy0xJAogCiAJSW50ZWdlciBnZXRTcGVjaWZpZWRMZW5ndGgoKTsKIAl2b2lkIHNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyIG5ld1NwZWNpZmllZExlbmd0aCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfTEVOR1RIX1BST1BFUlRZID0gInNwY2lmaWVkTGVuZ3RoUHJvcGVydHkiOworCQlTdHJpbmcgU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRMZW5ndGgiOyAvLyROT04tTkxTLTEkCiAJCQotCUludGVnZXIgZ2V0UHJlY2lzaW9uKCk7CisJaW50IGdldFByZWNpc2lvbigpOwogCi0JSW50ZWdlciBnZXREZWZhdWx0UHJlY2lzaW9uKCk7Ci0JCUludGVnZXIgREVGQVVMVF9QUkVDSVNJT04gPSBJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0JCVN0cmluZyBERUZBVUxUX1BSRUNJU0lPTl9QUk9QRVJUWSA9ICJkZWZhdWx0UHJlY2lzaW9uUHJvcGVydHkiOworCWludCBnZXREZWZhdWx0UHJlY2lzaW9uKCk7CisJCWludCBERUZBVUxUX1BSRUNJU0lPTiA9IDA7CisJCVN0cmluZyBERUZBVUxUX1BSRUNJU0lPTl9QUk9QRVJUWSA9ICJkZWZhdWx0UHJlY2lzaW9uIjsgLy8kTk9OLU5MUy0xJAogCiAJSW50ZWdlciBnZXRTcGVjaWZpZWRQcmVjaXNpb24oKTsKIAl2b2lkIHNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyIG5ld1NwZWNpZmllZFByZWNpc2lvbik7Ci0JCVN0cmluZyBTUEVDSUZJRURfUFJFQ0lTSU9OX1BST1BFUlRZID0gInNwY2lmaWVkUHJlY2lzaW9uUHJvcGVydHkiOworCQlTdHJpbmcgU1BFQ0lGSUVEX1BSRUNJU0lPTl9QUk9QRVJUWSA9ICJzcGVjaWZpZWRQcmVjaXNpb24iOyAvLyROT04tTkxTLTEkCiAKIAkKLQlJbnRlZ2VyIGdldFNjYWxlKCk7CisJaW50IGdldFNjYWxlKCk7CiAKLQlJbnRlZ2VyIGdldERlZmF1bHRTY2FsZSgpOwotCQlJbnRlZ2VyIERFRkFVTFRfU0NBTEUgPSBJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0JCVN0cmluZyBERUZBVUxUX1NDQUxFX1BST1BFUlRZID0gImRlZmF1bHRTY2FsZVByb3BlcnR5IjsKKwlpbnQgZ2V0RGVmYXVsdFNjYWxlKCk7CisJCWludCBERUZBVUxUX1NDQUxFID0gMDsKKwkJU3RyaW5nIERFRkFVTFRfU0NBTEVfUFJPUEVSVFkgPSAiZGVmYXVsdFNjYWxlIjsgLy8kTk9OLU5MUy0xJAogCiAJSW50ZWdlciBnZXRTcGVjaWZpZWRTY2FsZSgpOwogCXZvaWQgc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlciBuZXdTcGVjaWZpZWRTY2FsZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfU0NBTEVfUFJPUEVSVFkgPSAic3BjaWZpZWRTY2FsZVByb3BlcnR5IjsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgZm91bmQgb24gdGhlIGRhdGFzb3VyY2UKLQkgKi8KLQlib29sZWFuIGlzUmVzb2x2ZWQoKTsKKwkJU3RyaW5nIFNQRUNJRklFRF9TQ0FMRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTY2FsZSI7IC8vJE5PTi1OTFMtMSQKIAkKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0NvbHVtbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0NvbHVtbk1hcHBpbmcuamF2YQppbmRleCBhOTZhZDIyLi43MzQyYWI2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Db2x1bW5NYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvQ29sdW1uTWFwcGluZy5qYXZhCkBAIC0xOCwxMiArMTgsOCBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbHVtbk1hcHBpbmcgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZSwgQ29sdW1uLk93bmVyCitwdWJsaWMgaW50ZXJmYWNlIENvbHVtbk1hcHBpbmcgZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nLCBDb2x1bW4uT3duZXIKIHsKIAlDb2x1bW4gZ2V0Q29sdW1uKCk7Ci0JCi0JVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCk7Ci0Jdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgdmFsdWUpOwotCQlTdHJpbmcgVEVNUE9SQUxfUFJPUEVSVFkgPSAidGVtcG9yYWxQcm9wZXJ0eSI7CiAKIH0gCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0NvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NjU0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Db252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBDb252ZXJ0ZXIgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQoreworCS8qKgorCSAqIFJldHVybiBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgY29udmVydGVyLgorCSAqIFBvc3NpYmlsaXRpZXMgYXJlIGJlbG93LCBOT19DT05WRVJURVIsIExPQl9DT05WRVJURVIsIEVOVU1FUkFURURfQ09OVkVSVEVSLCBURU1QT1JBTF9DT05WRVJURVIKKwkgKi8KKwlTdHJpbmcgZ2V0VHlwZSgpOworCQorCVN0cmluZyBOT19DT05WRVJURVIgPSAibm9Db252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIExPQl9DT05WRVJURVIgPSAibG9iQ29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBFTlVNRVJBVEVEX0NPTlZFUlRFUiA9ICJlbnVtZXJhdGVkQ29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBURU1QT1JBTF9DT05WRVJURVIgPSAidGVtcG9yYWxDb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogUmVtb3ZlIHRoZSBDb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwKKwkgKi8KKwl2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKCk7CisJCisJLyoqCisJICogQWRkIHRoZSBhcHByb3ByaWF0ZSBDb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsCisJICovCisJdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwoKTsKKwkKKwkKKwkvLyoqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKgorCUF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCk7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Db252ZXJ0aWJsZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0NvbnZlcnRpYmxlTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZTIwOWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Db252ZXJ0aWJsZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIENvbnZlcnRpYmxlTWFwcGluZworeworCS8qKgorCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNvbnZlcnRlciBpZiBpdCBpcyBub3QgbnVsbCBhbmQgdGhlIGRlZmF1bHQgY29udmVydGVyIG90aGVyd2lzZS4KKwkgKi8KKwlDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBkZWZhdWx0IGNvbnZlcnRlciwgTk9fQ09OVkVSVEVSIGV4Y2VwdCBpbiBpbnN0YW5jZXMgd2hlcmUgYW4gdW5kZXJseWluZworCSAqIG1vZGVsIGhhcyBhIGNvbnZlcnRlciBzZXQgKGFuIHhtbCBtYXBwaW5nIGNvdWxkIHJldHVybiBhIGRlZmF1bHQgY29udmVydGVyIGlmIG9uZSBpcyBzZXQgaW4gamF2YSkKKwkgKi8KKwlDb252ZXJ0ZXIgZ2V0RGVmYXVsdENvbnZlcnRlcigpOworCQlTdHJpbmcgREVGQVVMVF9DT05WRVJURVJfUFJPUEVSVFkgPSAiZGVmYXVsdENvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjb252ZXJ0ZXIgb3IgbnVsbCwgaWYgbm9uZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgbW9kZWwKKwkgKi8KKwlDb252ZXJ0ZXIgZ2V0U3BlY2lmaWVkQ29udmVydGVyKCk7CisJCisJLyoqCisJICogU2V0IHRoZSBzcGVjaWZpZWQgY29udmVydGVyIHR5cGUsIGFkZGluZyB0aGUgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbAorCSAqIGFuZCByZW1vdmluZyB0aGUgb2xkIGNvbnZlcnRlciwgaWYgYW55LCBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4gIEpQQSAxLjAKKwkgKiBzdXBwb3J0IEVudW1lcmF0ZWQsIExvYiwgYW5kIFRlbXBvcmFsIGFzIGNvbnZlcnRlciB0eXBlcyBmb3IgYmFzaWMgbWFwcHBpbmdzLgorCSAqIHtAbGluayBDb252ZXJ0ZXIjRU5VTUVSQVRFRF9DT05WRVJURVJ9CisJICoge0BsaW5rIENvbnZlcnRlciNMT0JfQ09OVkVSVEVSfQorCSAqIHtAbGluayBDb252ZXJ0ZXIjVEVNUE9SQUxfQ09OVkVSVEVSfQorCSAqIHtAbGluayBDb252ZXJ0ZXIjTk9fQ09OVkVSVEVSfQorCSAqLworCXZvaWQgc2V0U3BlY2lmaWVkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKTsKKwkJU3RyaW5nIFNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAorCQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9EaXNjcmltaW5hdG9yQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9EaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKaW5kZXggMDdiZTMxYy4uZjliYTJhMCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Rpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0yMCwyNyArMjAsNDggQEAKICAqLwogcHVibGljIGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIGV4dGVuZHMgTmFtZWRDb2x1bW4KIHsKLQlTdHJpbmcgREVGQVVMVF9OQU1FID0gIkRUWVBFIjsKKwlTdHJpbmcgREVGQVVMVF9OQU1FID0gIkRUWVBFIjsgLy8kTk9OLU5MUy0xJAogCiAJRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKTsKIAogCURpc2NyaW1pbmF0b3JUeXBlIGdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpOwotCQlTdHJpbmcgREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlUHJvcGVydHkiOworCQlTdHJpbmcgREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlIjsgLy8kTk9OLU5MUy0xJAogCQlEaXNjcmltaW5hdG9yVHlwZSBERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRSA9IERpc2NyaW1pbmF0b3JUeXBlLlNUUklORzsKIAkJCiAJRGlzY3JpbWluYXRvclR5cGUgZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKTsKIAl2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9ESVNDUklNSU5BVE9SX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGVQcm9wZXJ0eSI7CisJCVN0cmluZyBTUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZID0gInNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlIjsgLy8kTk9OLU5MUy0xJAogCiAKLQlJbnRlZ2VyIGdldExlbmd0aCgpOworCWludCBnZXRMZW5ndGgoKTsKIAotCUludGVnZXIgZ2V0RGVmYXVsdExlbmd0aCgpOwotCQlJbnRlZ2VyIERFRkFVTFRfTEVOR1RIID0gSW50ZWdlci52YWx1ZU9mKDMxKTsKLQkJU3RyaW5nIERFRkFVTFRfTEVOR1RIX1BST1BFUlRZID0gImRlZmF1bHRMZW5ndGhQcm9wZXJ0eSI7CisJaW50IGdldERlZmF1bHRMZW5ndGgoKTsKKwkJaW50IERFRkFVTFRfTEVOR1RIID0gMzE7CisJCVN0cmluZyBERUZBVUxUX0xFTkdUSF9QUk9QRVJUWSA9ICJkZWZhdWx0TGVuZ3RoIjsgLy8kTk9OLU5MUy0xJAogCiAJSW50ZWdlciBnZXRTcGVjaWZpZWRMZW5ndGgoKTsKIAl2b2lkIHNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFkgPSAic3BjaWZpZWRMZW5ndGhQcm9wZXJ0eSI7CisJCVN0cmluZyBTUEVDSUZJRURfTEVOR1RIX1BST1BFUlRZID0gInNwZWNpZmllZExlbmd0aCI7IC8vJE5PTi1OTFMtMSQKIAorCQkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgcmVzb3VyY2UuCisJICovCisJYm9vbGVhbiBpc1Jlc291cmNlU3BlY2lmaWVkKCk7CisJCQorCS8qKgorCSAqIGludGVyZmFjZSBhbGxvd2luZyBjb2x1bW5zIHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzCisJICovCisJaW50ZXJmYWNlIE93bmVyIGV4dGVuZHMgTmFtZWRDb2x1bW4uT3duZXIgeworCQkKKwkJLyoqCisJCSAqIFJldHVybiB0aGUgZGVmYXVsdCBkaXNjcmltaW5hdG9yIGNvbHVtbiBsZW5ndGgKKwkJICovCisJCWludCBnZXREZWZhdWx0TGVuZ3RoKCk7CisJCQorCQkvKioKKwkJICogUmV0dXJuIHRoZSBkZWZhdWx0IGRpc2NyaW1pbmF0b3IgY29sdW1uIHR5cGUKKwkJICovCisJCURpc2NyaW1pbmF0b3JUeXBlIGdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpOworCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Rpc2NyaW1pbmF0b3JUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9EaXNjcmltaW5hdG9yVHlwZS5qYXZhCmluZGV4IGVlMTQ2ZjUuLjY4MTViODkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0Rpc2NyaW1pbmF0b3JUeXBlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRGlzY3JpbWluYXRvclR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3ICsxMCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CiAKIC8qKgotICogCisgKiBEaXNjcmltaW5hdG9yIFR5cGUKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIwLDczICsyMCw3NyBAQAogICovCiBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7CiAKLQlTVFJJTkcsCi0JQ0hBUiwKLQlJTlRFR0VSOwotCQorCVNUUklORygKKwkJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HLAorCQkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlLlNUUklORworCQkpLAorCUNIQVIoCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlLkNIQVIsCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUuQ0hBUgorCQkpLAorCUlOVEVHRVIoCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIsCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUgorCQkpOworCisKKwlwcml2YXRlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGUgamF2YURpc2NyaW1pbmF0b3JUeXBlOworCXByaXZhdGUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlIG9ybURpc2NyaW1pbmF0b3JUeXBlOworCisJRGlzY3JpbWluYXRvclR5cGUob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVHlwZSBqYXZhRGlzY3JpbWluYXRvclR5cGUsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZSBvcm1EaXNjcmltaW5hdG9yVHlwZSkgeworCQlpZiAoamF2YURpc2NyaW1pbmF0b3JUeXBlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCWlmIChvcm1EaXNjcmltaW5hdG9yVHlwZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKwkJfQorCQl0aGlzLmphdmFEaXNjcmltaW5hdG9yVHlwZSA9IGphdmFEaXNjcmltaW5hdG9yVHlwZTsKKwkJdGhpcy5vcm1EaXNjcmltaW5hdG9yVHlwZSA9IG9ybURpc2NyaW1pbmF0b3JUeXBlOworCX0KKworCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlIGdldEphdmFEaXNjcmltaW5hdG9yVHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuamF2YURpc2NyaW1pbmF0b3JUeXBlOworCX0KKworCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUgZ2V0T3JtRGlzY3JpbWluYXRvclR5cGUoKSB7CisJCXJldHVybiB0aGlzLm9ybURpc2NyaW1pbmF0b3JUeXBlOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCiAKIAlwdWJsaWMgc3RhdGljIERpc2NyaW1pbmF0b3JUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlIGphdmFEaXNjcmltaW5hdG9yVHlwZSkgewotCQlpZiAoamF2YURpc2NyaW1pbmF0b3JUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YURpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCQljYXNlIFNUUklORzoKLQkJCQlyZXR1cm4gU1RSSU5HOwotCQkJY2FzZSBDSEFSOgotCQkJCXJldHVybiBDSEFSOwotCQkJY2FzZSBJTlRFR0VSOgotCQkJCXJldHVybiBJTlRFR0VSOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGRpc2NyaW1pbmF0b3IgdHlwZTogIiArIGphdmFEaXNjcmltaW5hdG9yVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChqYXZhRGlzY3JpbWluYXRvclR5cGUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFSZXNvdXJjZU1vZGVsXyhqYXZhRGlzY3JpbWluYXRvclR5cGUpOwogCX0KLQkKKworCXByaXZhdGUgc3RhdGljIERpc2NyaW1pbmF0b3JUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbF8ob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVHlwZSBqYXZhRGlzY3JpbWluYXRvclR5cGUpIHsKKwkJZm9yIChEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSA6IERpc2NyaW1pbmF0b3JUeXBlLnZhbHVlcygpKSB7CisJCQlpZiAoZGlzY3JpbWluYXRvclR5cGUuZ2V0SmF2YURpc2NyaW1pbmF0b3JUeXBlKCkgPT0gamF2YURpc2NyaW1pbmF0b3JUeXBlKSB7CisJCQkJcmV0dXJuIGRpc2NyaW1pbmF0b3JUeXBlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwogCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCWlmIChkaXNjcmltaW5hdG9yVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGRpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCQljYXNlIFNUUklORzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVHlwZS5TVFJJTkc7Ci0JCQljYXNlIENIQVI6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGUuQ0hBUjsKLQkJCWNhc2UgSU5URUdFUjoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGRpc2NyaW1pbmF0b3IgdHlwZTogIiArIGRpc2NyaW1pbmF0b3JUeXBlKTsKLQkJfQorCQlyZXR1cm4gKGRpc2NyaW1pbmF0b3JUeXBlID09IG51bGwpID8gbnVsbCA6IGRpc2NyaW1pbmF0b3JUeXBlLmdldEphdmFEaXNjcmltaW5hdG9yVHlwZSgpOwogCX0KIAogCXB1YmxpYyBzdGF0aWMgRGlzY3JpbWluYXRvclR5cGUgZnJvbU9ybVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlIG9ybURpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCWlmIChvcm1EaXNjcmltaW5hdG9yVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKG9ybURpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCQljYXNlIFNUUklORzoKLQkJCQlyZXR1cm4gU1RSSU5HOwotCQkJY2FzZSBDSEFSOgotCQkJCXJldHVybiBDSEFSOwotCQkJY2FzZSBJTlRFR0VSOgotCQkJCXJldHVybiBJTlRFR0VSOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGRpc2NyaW1pbmF0b3IgdHlwZTogIiArIG9ybURpc2NyaW1pbmF0b3JUeXBlKTsKLQkJfQorCQlyZXR1cm4gKG9ybURpc2NyaW1pbmF0b3JUeXBlID09IG51bGwpID8gbnVsbCA6IGZyb21Pcm1SZXNvdXJjZU1vZGVsXyhvcm1EaXNjcmltaW5hdG9yVHlwZSk7CiAJfQotCQorCisJcHJpdmF0ZSBzdGF0aWMgRGlzY3JpbWluYXRvclR5cGUgZnJvbU9ybVJlc291cmNlTW9kZWxfKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZSBvcm1EaXNjcmltaW5hdG9yVHlwZSkgeworCQlmb3IgKERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlIDogRGlzY3JpbWluYXRvclR5cGUudmFsdWVzKCkpIHsKKwkJCWlmIChkaXNjcmltaW5hdG9yVHlwZS5nZXRPcm1EaXNjcmltaW5hdG9yVHlwZSgpID09IG9ybURpc2NyaW1pbmF0b3JUeXBlKSB7CisJCQkJcmV0dXJuIGRpc2NyaW1pbmF0b3JUeXBlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwogCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlIHRvT3JtUmVzb3VyY2VNb2RlbChEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSkgewotCQlpZiAoZGlzY3JpbWluYXRvclR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChkaXNjcmltaW5hdG9yVHlwZSkgewotCQkJY2FzZSBTVFJJTkc6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZS5TVFJJTkc7Ci0JCQljYXNlIENIQVI6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZS5DSEFSOwotCQkJY2FzZSBJTlRFR0VSOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUjsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBkaXNjcmltaW5hdG9yIHR5cGU6ICIgKyBkaXNjcmltaW5hdG9yVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChkaXNjcmltaW5hdG9yVHlwZSA9PSBudWxsKSA/IG51bGwgOiBkaXNjcmltaW5hdG9yVHlwZS5nZXRPcm1EaXNjcmltaW5hdG9yVHlwZSgpOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9FbnRpdHkuamF2YQppbmRleCBmNzdkYjgyLi5lMWNiOTI1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9FbnRpdHkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9FbnRpdHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMiwxNSArMTIsMTYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogCiAvKioKLSAqIAotICogCisgKiBFbnRpdHkKKyAqIDxwPgogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKICAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW50aXR5IGV4dGVuZHMgVHlwZU1hcHBpbmcsIEdlbmVyYXRvckhvbGRlciwgUXVlcnlIb2xkZXIsIElkQ2xhc3MKK3B1YmxpYyBpbnRlcmZhY2UgRW50aXR5CisJZXh0ZW5kcyBUeXBlTWFwcGluZywgSWRDbGFzc0hvbGRlcgogewogCS8vICoqKioqKioqKioqKioqKiogbmFtZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCkBAIC0yOCwzMyArMjksNTggQEAKIAkgKiBSZXR1cm4gdGhlIG5hbWUsIHNwZWNpZmllZCBvciBkZWZhdWx0IGlmIG5vdCBzcGVjaWZpZWQuCiAJICovCiAJU3RyaW5nIGdldE5hbWUoKTsKLQkKKwogCS8qKgogCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIG5hbWUuCiAJICovCiAJU3RyaW5nIGdldFNwZWNpZmllZE5hbWUoKTsKLQkKKwogCS8qKgogCSAqIFNldCB0aGUgc3BlY2lmaWVkIG5hbWUgb24gdGhlIGVudGl0eS4KIAkgKi8KIAl2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9OQU1FX1BST1BFUlRZID0gInNwZWNpZmllZE5hbWVQcm9wZXJ0eSI7Ci0JCisJCVN0cmluZyBTUEVDSUZJRURfTkFNRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWROYW1lIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqCiAJICogUmV0dXJuIHRoZSBkZWZhdWx0IG5hbWUsIGJhc2VkIG9uIHRoZSBjbGFzcyBuYW1lLgogCSAqLwogCVN0cmluZyBnZXREZWZhdWx0TmFtZSgpOwotCQlTdHJpbmcgREVGQVVMVF9OQU1FX1BST1BFUlRZID0gImRlZmF1bHROYW1lUHJvcGVydHkiOworCQlTdHJpbmcgREVGQVVMVF9OQU1FX1BST1BFUlRZID0gImRlZmF1bHROYW1lIjsgLy8kTk9OLU5MUy0xJAogCi0JCisKIAkvLyAqKioqKioqKioqKioqKioqIHRhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCisKIAkvKioKIAkgKiBSZXR1cm4gdGhlIHRhYmxlIGZvciB0aGlzIGVudGl0eSwgZWl0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0LgogCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KIAkgKi8KIAlUYWJsZSBnZXRUYWJsZSgpOwogCisJLyoqCisJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkncyBwcmltYXJ5IGtleSBjb2x1bW4uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVudGl0eSdzIHByaW1hcnkga2V5IGlzICJjb21wb3VuZCIKKwkgKiAoaS5lLiB0aGUgcHJpbWFyeSBrZXkgaXMgY29tcG9zZWQgb2YgbXVsdGlwbGUgY29sdW1ucykuCisJICovCisJU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGVudGl0eSdzIGRlZmF1bHQgdGFibGUgbmFtZSwgd2hpY2ggZGVwZW5kcyBvbiB0aGUgZW50aXR5J3MKKwkgKiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisJICovCisJU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgZW50aXR5J3MgZGVmYXVsdCBzY2hlbWEsIHdoaWNoIGRlcGVuZHMgb24gdGhlIGVudGl0eSdzCisJICogaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorCSAqLworCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGVudGl0eSdzIGRlZmF1bHQgY2F0YWxvZywgd2hpY2ggZGVwZW5kcyBvbiB0aGUgZW50aXR5J3MKKwkgKiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisJICovCisJU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCk7CisKIAogCS8vICoqKioqKioqKioqKioqKiogc2Vjb25kYXJ5IHRhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCkBAIC02Myw4MiArODksMTMwIEBACiAJICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgogCSAqLwogCTxUIGV4dGVuZHMgU2Vjb25kYXJ5VGFibGU+IExpc3RJdGVyYXRvcjxUPiBzZWNvbmRhcnlUYWJsZXMoKTsKLQkKKwogCS8qKgogCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNlY29uZGFyeSB0YWJsZXMsIGJvdGggc3BlY2lmaWVkIGFuZCBkZWZhdWx0LgogCSAqLwogCWludCBzZWNvbmRhcnlUYWJsZXNTaXplKCk7Ci0JCisKIAkvKioKIAkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBzcGVjaWZpZWQgc2Vjb25kYXJ5IHRhYmxlcy4KIAkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCiAJICovCiAJPFQgZXh0ZW5kcyBTZWNvbmRhcnlUYWJsZT4gTGlzdEl0ZXJhdG9yPFQ+IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQorCiAJLyoqCiAJICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZXMuCiAJICovCiAJaW50IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkKKwogCS8qKgogCSAqIEFkZCBhIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGUgdG8gdGhlIGVudGl0eSByZXR1cm4gdGhlIG9iamVjdCAKIAkgKiByZXByZXNlbnRpbmcgaXQuCiAJICovCiAJU2Vjb25kYXJ5VGFibGUgYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW50IGluZGV4KTsKLQkKKworCS8qKgorCSAqIEFkZCBhIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGUgdG8gdGhlIGVudGl0eSByZXR1cm4gdGhlIG9iamVjdCAKKwkgKiByZXByZXNlbnRpbmcgaXQuCisJICovCisJU2Vjb25kYXJ5VGFibGUgYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoKTsKKwogCS8qKgogCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZSBmcm9tIHRoZSBlbnRpdHkuCiAJICovCiAJdm9pZCByZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgaW5kZXgpOwotCQorCiAJLyoqCiAJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgc2Vjb25kYXJ5IHRhYmxlIGF0IHRoZSBpbmRleCBmcm9tIHRoZSBlbnRpdHkuCiAJICovCiAJdm9pZCByZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSk7Ci0JCisKIAkvKioKIAkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgc2Vjb25kYXJ5IHRhYmxlIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgogCSAqLwogCXZvaWQgbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkJU3RyaW5nIFNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QgPSAic3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzTGlzdCI7Ci0JCi0JCQotCS8vICoqKioqKioqKioqKioqKiogaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKKwkJU3RyaW5nIFNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QgPSAic3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzIjsgLy8kTk9OLU5MUy0xJAorCisKKwkvLyAqKioqKioqKioqKioqKioqIGluaGVyaXRhbmNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKIAlJbmhlcml0YW5jZVR5cGUgZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpOwotCQorCiAJSW5oZXJpdGFuY2VUeXBlIGdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JCVN0cmluZyBERUZBVUxUX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZID0gImRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5UHJvcGVydHkiOwotCQkKKwkJU3RyaW5nIERFRkFVTFRfSU5IRVJJVEFOQ0VfU1RSQVRFR1lfUFJPUEVSVFkgPSAiZGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3kiOyAvLyROT04tTkxTLTEkCisKIAlJbmhlcml0YW5jZVR5cGUgZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpOwogCXZvaWQgc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgbmV3SW5oZXJpdGFuY2VUeXBlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9JTkhFUklUQU5DRV9TVFJBVEVHWV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5UHJvcGVydHkiOwotCQotCQkKLQkvLyAqKioqKioqKioqKioqKioqIGRpc2NyaW1pbmF0b3IgY29sdW1uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCQorCQlTdHJpbmcgU1BFQ0lGSUVEX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZID0gInNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgZmlyc3QgcGFyZW50IGluIHRoZSBjbGFzcyBoaWVyYXJjaHkgdGhhdCBpcyBhbiBlbnRpdHkuIAorCSAqIFRoaXMgaXMgdGhlIHBhcmVudCBpbiB0aGUgZW50aXR5IChwZXJzaXN0ZW50KSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKwkgKiAodnMgY2xhc3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5KS4gIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIHBhcmVudCBlbnRpdHkuCisJICovCisJRW50aXR5IGdldFBhcmVudEVudGl0eSgpOworCiAJRGlzY3JpbWluYXRvckNvbHVtbiBnZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7CiAKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGRpc2NyaW1pbmF0b3IgdmFsdWUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKIAlTdHJpbmcgZ2V0RGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCisKIAlTdHJpbmcgZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQlTdHJpbmcgREVGQVVMVF9ESVNDUklNSU5BVE9SX1ZBTFVFX1BST1BFUlRZID0gImRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWVQcm9wZXJ0eSI7CisJCVN0cmluZyBERUZBVUxUX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFkgPSAiZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKIAogCVN0cmluZyBnZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKTsKIAl2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlUHJvcGVydHkiOworCQlTdHJpbmcgU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqIAorCSAqIFJldHVybiB3aGV0aGVyIGEgRGlzY3JpbWluYXRvclZhbHVlIGlzIGFsbG93ZWQgZm9yIHRoaXMgRW50aXR5LgorCSAqIEl0IGlzIGFsbG93ZWQgaWYgdGhlIGVudGl0eSBpcyBub3QgYWJzdHJhY3QgYW5kIG5vdCBwYXJ0IG9mIAorCSAqIGEgdGFibGUtcGVyLWNsYXNzIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorCSAqLworCWJvb2xlYW4gc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkKCk7CisgCQlTdHJpbmcgU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfSVNfQUxMT1dFRF9QUk9QRVJUWSA9ICJkaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQiOyAvLyROT04tTkxTLTEkCisKKwkgLyoqCisJICogUmV0dXJuIHdoZXRoZXIgYSBEaXNjcmltaW5hdG9yVmFsdWUgaXMgdW5kZWZpbmVkIGZvciB0aGlzIEVudGl0eS4KKwkgKiBJdCBpcyB1bmRlZmluZWQgaWYgdGhlIGVudGl0eSBpcyBhYnN0cmFjdCBvciBpZiBpdAorCSAqIGlzIHBhcnQgb2YgYSB0YWJsZS1wZXItY2xhc3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisJICovCisJYm9vbGVhbiBkaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpOworIAkJU3RyaW5nIERJU0NSSU1JTkFUT1JfVkFMVUVfSVNfVU5ERUZJTkVEX1BST1BFUlRZID0gImRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkIjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSBEaXNjcmltaW5hdG9yVmFsdWUgaXMgYWxsb3dlZCBmb3IgdGhpcyBFbnRpdHkKLQkgKiBJdCBpcyBhbGxvd2VkIGlmIHRoZSBJVHlwZSBpcyBjb25jcmV0ZSAobm90IGFic3RyYWN0KQorCSAqIFJldHVybiB3aGV0aGVyIGEgRGlzY3JpbWluYXRvckNvbHVtbiBpcyBhbGxvd2VkIGZvciB0aGlzIEVudGl0eS4KKwkgKiBJdCBpcyBhbGxvd2VkIGlmIHRoZSBlbnRpdHkgaXMgdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSAod2l0aCBkZXNjZW5kYW50IGVudGl0aWVzKQorCSAqIGFuZCB0aGUgc3RyYXRlZ3kgaXMgbm90IHRhYmxlLXBlci1jbGFzcwogCSAqLwotCWJvb2xlYW4gaXNEaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkKCk7Ci0gCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9WQUxVRV9BTExPV0VEX1BST1BFUlRZID0gImRpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWRQcm9wZXJ0eSI7Ci0KKwlib29sZWFuIHNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKTsKKyAJCVN0cmluZyBTUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9DT0xVTU5fSVNfQUxMT1dFRF9QUk9QRVJUWSA9ICJzcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkIjsgLy8kTk9OLU5MUy0xJAorIAkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciBhIERpc2NyaW1pbmF0b3JDb2x1bW4gaXMgdW5kZWZpbmVkIGZvciB0aGlzIEVudGl0eS4KKwkgKiBJdCBpcyB1bmRlZmluZWQgaWYgdGhlIGluaGVyaXRhbmNlIHN0cmF0ZWd5IGlzIHRhYmxlLXBlci1jbGFzcworCSAqLworIAlib29sZWFuIGRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZCgpOworCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9DT0xVTU5fSVNfVU5ERUZJTkVEX1BST1BFUlRZID0gImRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZCI7IC8vJE5PTi1OTFMtMSQKIAkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciBhIFRhYmxlIGlzIGFsbG93ZWQgZm9yIHRoaXMgRW50aXR5LgorCSAqIElmIHRoZSBpbmhlcml0YW5jZSBzdHJhdGVneSBpcyBzaW5nbGUtdGFibGUsIFRhYmxlIGlzIGFsbG93ZWQgb25seSAgCisJICogb24gdGhlIHJvb3QgZW50aXR5LgorCSAqIElmIHRoZSBpbmhlcml0YW5jZSBzdHJhdGVneSBpcyB0YWJsZS1wZXItY2xhc3MgaXQgaXMgYWxsb3dlZCBvbmx5CisJICogb24gY29uY3JldGUgZW50aXRpZXMuCisJICovCisgCWJvb2xlYW4gc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQoKTsKKyAJCVN0cmluZyBTUEVDSUZJRURfVEFCTEVfSVNfQUxMT1dFRF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRUYWJsZUlzQWxsb3dlZCI7IC8vJE5PTi1OTFMtMSQKKyAJCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIGEgVGFibGUgaXMgdW5kZWZpbmVkIGZvciB0aGlzIEVudGl0eS4KKwkgKiBJZiB0aGUgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgaXMgdGFibGUtcGVyLWNsYXNzIGFuZCB0aGUgZW50aXR5IGlzCisJICogYWJzdHJhY3QsIHRoZW4gYSBUYWJsZSBvYmplY3QgaXMgdW5kZWZpbmVkCisJICovCisgCWJvb2xlYW4gdGFibGVJc1VuZGVmaW5lZCgpOworIAkJU3RyaW5nIFRBQkxFX0lTX1VOREVGSU5FRF9QUk9QRVJUWSA9ICJ0YWJsZUlzVW5kZWZpbmVkIjsgLy8kTk9OLU5MUy0xJAorCiAJLy8gKioqKioqKioqKioqKioqKiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogCTxUIGV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW4+IExpc3RJdGVyYXRvcjxUPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKQEAgLTE0NiwxMiArMjIwLDEyIEBACiAJaW50IHByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKIAogCTxUIGV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW4+IExpc3RJdGVyYXRvcjxUPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCA9ICJzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0IjsKKwkJU3RyaW5nIFNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCA9ICJzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMiOyAvLyROT04tTkxTLTEkCiAKIAlpbnQgc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwogCiAJUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCVN0cmluZyBERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OID0gImRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiI7CisJCVN0cmluZyBERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OID0gImRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiI7IC8vJE5PTi1OTFMtMSQKIAogCVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7CiAKQEAgLTE2MSwxMjUgKzIzNSwzNCBAQAogCiAJdm9pZCBtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwogCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBhdHRyaWJ1dGUgb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHdoZXRoZXIgc3BlY2lmaWVkIG9yIGRlZmF1bHQuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCTxUIGV4dGVuZHMgQXR0cmlidXRlT3ZlcnJpZGU+IExpc3RJdGVyYXRvcjxUPiBhdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgorCisJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKworCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwlRdWVyeUNvbnRhaW5lciBnZXRRdWVyeUNvbnRhaW5lcigpOworCQorCUdlbmVyYXRvckNvbnRhaW5lciBnZXRHZW5lcmF0b3JDb250YWluZXIoKTsKIAkKIAkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhdHRyaWJ1dGUgb3ZlcnJpZGVzLCBib3RoIHNwZWNpZmllZCBhbmQgZGVmYXVsdC4KKwkgKiBUaGUgZ2l2ZW4gRW50aXR5IGhhcyB0aGlzIGVudGl0eSBhcyBpdHMgcm9vdCBlbnRpdHksIGFkZAorCSAqIGl0IGFzIGEgc3ViIGVudGl0eS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2FkZFJvb3RXaXRoU3ViRW50aXRpZXMoU3RyaW5nKQogCSAqLwotCWludCBhdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuICBObyBhZGQvcmVtb3ZlIGZvciBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcywgdGhlCi0JICogdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHdpbGwgYmUgcG9wdWxhdGVkIGZyb20gc3VwZXJjbGFzc2VzLCB0aGVuIHVzZQotCSAqIHtAbGluayBBdHRyaWJ1dGVPdmVycmlkZSNzZXRWaXJ0dWFsKGJvb2xlYW4pfSB0byBhZGQvcmVtb3ZlIHRoZSBhdHRyaWJ1dGUKLQkgKiBvdmVycmlkZSBmcm9tIHRoZSBzb3VyY2UKLQkgKi8KLQk8VCBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBMaXN0SXRlcmF0b3I8VD4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJdm9pZCBhZGRTdWJFbnRpdHkoRW50aXR5IHN1YkVudGl0eSk7CiAJCiAJLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWVkIGF0dHJpYnV0ZSBvdmVycmlkZXMuCisJICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG1hcHBpbmcgdGhhdCBtYXRjaGVzIHRoZSBuYW1lLgorCSAqIEluIDIuMCB0aGlzIG5hbWUgY291bGQgdXNlIGRvdC1ub3RhdGlvbiBmb3IgbmVzdGVkIG1hcHBpbmdzLgogCSAqLwotCWludCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7CisJQXR0cmlidXRlTWFwcGluZyByZXNvbHZlQXR0cmlidXRlTWFwcGluZyhTdHJpbmcgbmFtZSk7CiAKIAkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMsIHRob3NlIG5vdCBzcGVjaWZpZWQuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgorCSAqIFJldHVybiB0aGUgZW50aXR5J3MgSUQgYXR0cmlidXRlLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbnRpdHkgaGFzIG11bHRpcGxlIElEIGF0dHJpYnV0ZXMuCiAJICovCi0JPFQgZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZT4gTGlzdEl0ZXJhdG9yPFQ+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGRlZmF1bHQgYXR0cmlidXRlIG92ZXJyaWRlcy4KLQkgKi8KLQlpbnQgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKTsKLQkKLQkvKioKLQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkJU3RyaW5nIFNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QgPSAic3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzTGlzdCI7Ci0JCVN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCA9ICJ2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzTGlzdCI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBvdmVycmlkZXMsIHdoZXRoZXIgc3BlY2lmaWVkIG9yIGRlZmF1bHQsCi0JICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKi8KLQlBdHRyaWJ1dGVPdmVycmlkZSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKTsKLQotCS8vICoqKioqKioqKioqKioqKiogYXNzb2NpYXRpb24gb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgYXNzb2NpYXRpb24gb3ZlcnJpZGVzIHdoZXRoZXIgc3BlY2lmaWVkIG9yIGRlZmF1bHQuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCTxUIGV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZT4gTGlzdEl0ZXJhdG9yPFQ+IGFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYXNzb2NpYXRpb24gb3ZlcnJpZGVzLCBib3RoIHNwZWNpZmllZCBhbmQgZGVmYXVsdC4KLQkgKi8KLQlpbnQgYXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgc3BlY2lmaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlcy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuICBObyBhZGQvcmVtb3ZlIGZvciBzcGVjaWZpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGVzLCB0aGUKLQkgKiB2aXJ0dWFsIGFzc29jaWF0aW9uIG92ZXJyaWRlcyB3aWxsIGJlIHBvcHVsYXRlZCBmcm9tIHN1cGVyY2xhc3NlcywgdGhlbiB1c2UKLQkgKiB7QGxpbmsgQXNzb2NpYXRpb25PdmVycmlkZSNzZXRWaXJ0dWFsKGJvb2xlYW4pfSB0byBhZGQvcmVtb3ZlIHRoZSBhc3NvY2lhdGlvbgotCSAqIG92ZXJyaWRlIGZyb20gdGhlIHNvdXJjZQotCSAqLwotCTxUIGV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZT4gTGlzdEl0ZXJhdG9yPFQ+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlcy4KLQkgKi8KLQlpbnQgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkZWZhdWx0IGFzc29jaWF0aW9uIG92ZXJyaWRlcy4KLQkgKi8KLQk8VCBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGU+IExpc3RJdGVyYXRvcjxUPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGRlZmF1bHQgYXNzb2NpYXRpb24gb3ZlcnJpZGVzLgotCSAqLwotCWludCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCi0JICovCi0Jdm9pZCBtb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QgPSAic3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNMaXN0IjsKLQkJU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QgPSAidmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzTGlzdCI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVsdGltYXRlIHRvcCBvZiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IAotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBuZXZlciByZXR1cm4gbnVsbC4gVGhlIHJvb3QKLQkgKiBpcyBkZWZpbmVkIGFzIHRoZSBwZXJzaXN0ZW50IHR5cGUgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotCSAqIHRoYXQgaGFzIG5vIHBhcmVudC4gIFRoZSByb290IHNob3VsZCBiZSBhbiBlbnRpdHkKLQkgKiAgCi0JICogTm9uLWVudGl0aWVzIGluIHRoZSBoaWVyYXJjaHkgc2hvdWxkIGJlIGlnbm9yZWQsIGllIHNraXAKLQkgKiBvdmVyIHRoZW0gaW4gdGhlIHNlYXJjaCBmb3IgdGhlIHJvb3QuIAotCSAqLwotCUVudGl0eSBnZXRSb290RW50aXR5KCk7Ci0KLQkvKioKLQkgKiBUaGUgZmlyc3QgcGFyZW50IGluIHRoZSBjbGFzcyBoaWVyYXJjaHkgdGhhdCBpcyBhbiBlbnRpdHkuIAotCSAqIFRoaXMgaXMgdGhlIHBhcmVudCBpbiB0aGUgZW50aXR5IChwZXJzaXN0ZW50KSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLQkgKiAodnMgY2xhc3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5KQotCSAqLwotCUVudGl0eSBnZXRQYXJlbnRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZW50aXR5J3MgcHJpbWFyeSBrZXkgY29sdW1uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbnRpdHkncyBwcmltYXJ5IGtleSBpcyAiY29tcG91bmQiCi0JICogKGkuZS4gdGhlIHByaW1hcnkga2V5IGlzIGNvbXBvc2VkIG9mIG11bHRpcGxlIGNvbHVtbnMpLgotCSAqLwotCVN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpOworCVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SWRBdHRyaWJ1dGUoKTsKIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRW51bVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0VudW1UeXBlLmphdmEKaW5kZXggMDlmYWIwYS4uZWMwOTc0ZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRW51bVR5cGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9FbnVtVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDcgKzEwLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKIAogLyoqCi0gKiAKKyAqIEVudW0gVHlwZQogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjAsNjQgKzIwLDczIEBACiAgKi8KIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKIAotCU9SRElOQUwsCi0JU1RSSU5HOwotCQorCU9SRElOQUwoCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLk9SRElOQUwsCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTAorCQkpLAorCVNUUklORygKKwkJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUuU1RSSU5HLAorCQkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORworCQkpOworCisKKwlwcml2YXRlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUgamF2YUVudW1UeXBlOworCXByaXZhdGUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlIG9ybUVudW1UeXBlOworCisJRW51bVR5cGUob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZSBqYXZhRW51bVR5cGUsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZSBvcm1FbnVtVHlwZSkgeworCQlpZiAoamF2YUVudW1UeXBlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCWlmIChvcm1FbnVtVHlwZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKwkJfQorCQl0aGlzLmphdmFFbnVtVHlwZSA9IGphdmFFbnVtVHlwZTsKKwkJdGhpcy5vcm1FbnVtVHlwZSA9IG9ybUVudW1UeXBlOworCX0KKworCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlIGdldEphdmFFbnVtVHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuamF2YUVudW1UeXBlOworCX0KKworCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUgZ2V0T3JtRW51bVR5cGUoKSB7CisJCXJldHVybiB0aGlzLm9ybUVudW1UeXBlOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCiAKIAlwdWJsaWMgc3RhdGljIEVudW1UeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlIGphdmFFbnVtVHlwZSkgewotCQlpZiAoamF2YUVudW1UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YUVudW1UeXBlKSB7Ci0JCQljYXNlIE9SRElOQUw6Ci0JCQkJcmV0dXJuIE9SRElOQUw7Ci0JCQljYXNlIFNUUklORzoKLQkJCQlyZXR1cm4gU1RSSU5HOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGVudW0gdHlwZTogIiArIGphdmFFbnVtVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChqYXZhRW51bVR5cGUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFSZXNvdXJjZU1vZGVsXyhqYXZhRW51bVR5cGUpOwogCX0KLQkKKworCXByaXZhdGUgc3RhdGljIEVudW1UeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbF8ob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZSBqYXZhRW51bVR5cGUpIHsKKwkJZm9yIChFbnVtVHlwZSBlbnVtVHlwZSA6IEVudW1UeXBlLnZhbHVlcygpKSB7CisJCQlpZiAoZW51bVR5cGUuZ2V0SmF2YUVudW1UeXBlKCkgPT0gamF2YUVudW1UeXBlKSB7CisJCQkJcmV0dXJuIGVudW1UeXBlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwogCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEVudW1UeXBlIGVudW1UeXBlKSB7Ci0JCWlmIChlbnVtVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGVudW1UeXBlKSB7Ci0JCQljYXNlIE9SRElOQUw6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUuT1JESU5BTDsKLQkJCWNhc2UgU1RSSU5HOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBlbnVtIHR5cGU6ICIgKyBlbnVtVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChlbnVtVHlwZSA9PSBudWxsKSA/IG51bGwgOiBlbnVtVHlwZS5nZXRKYXZhRW51bVR5cGUoKTsKIAl9Ci0JCiAKIAlwdWJsaWMgc3RhdGljIEVudW1UeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZSBvcm1FbnVtVHlwZSkgewotCQlpZiAob3JtRW51bVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChvcm1FbnVtVHlwZSkgewotCQkJY2FzZSBPUkRJTkFMOgotCQkJCXJldHVybiBPUkRJTkFMOwotCQkJY2FzZSBTVFJJTkc6Ci0JCQkJcmV0dXJuIFNUUklORzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBlbnVtIHR5cGU6ICIgKyBvcm1FbnVtVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChvcm1FbnVtVHlwZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tT3JtUmVzb3VyY2VNb2RlbF8ob3JtRW51bVR5cGUpOwogCX0KLQkKKworCXByaXZhdGUgc3RhdGljIEVudW1UeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsXyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUgb3JtRW51bVR5cGUpIHsKKwkJZm9yIChFbnVtVHlwZSBlbnVtVHlwZSA6IEVudW1UeXBlLnZhbHVlcygpKSB7CisJCQlpZiAoZW51bVR5cGUuZ2V0T3JtRW51bVR5cGUoKSA9PSBvcm1FbnVtVHlwZSkgeworCQkJCXJldHVybiBlbnVtVHlwZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKIAlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZSB0b09ybVJlc291cmNlTW9kZWwoRW51bVR5cGUgZW51bVR5cGUpIHsKLQkJaWYgKGVudW1UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoZW51bVR5cGUpIHsKLQkJCWNhc2UgT1JESU5BTDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUw7Ci0JCQljYXNlIFNUUklORzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBlbnVtIHR5cGU6ICIgKyBlbnVtVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChlbnVtVHlwZSA9PSBudWxsKSA/IG51bGwgOiBlbnVtVHlwZS5nZXRPcm1FbnVtVHlwZSgpOwogCX0KKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRW51bWVyYXRlZENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRW51bWVyYXRlZENvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZTM5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9FbnVtZXJhdGVkQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRW51bWVyYXRlZENvbnZlcnRlciBleHRlbmRzIENvbnZlcnRlcgoreworCUVudW1UeXBlIGdldEVudW1UeXBlKCk7CisJCisJRW51bVR5cGUgZ2V0RGVmYXVsdEVudW1UeXBlKCk7CisJCUVudW1UeXBlIERFRkFVTFRfRU5VTV9UWVBFID0gRW51bVR5cGUuT1JESU5BTDsKKworCUVudW1UeXBlIGdldFNwZWNpZmllZEVudW1UeXBlKCk7CisJdm9pZCBzZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZSBuZXdTcGVjaWZpZWRFbnVtVHlwZSk7CisJCVN0cmluZyBTUEVDSUZJRURfRU5VTV9UWVBFX1BST1BFUlRZID0gInNwZWNpZmllZEVudW1UeXBlIjsgLy8kTk9OLU5MUy0xJAorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRmV0Y2hUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9GZXRjaFR5cGUuamF2YQppbmRleCA4NmFhZGVlLi5jZGEyODViIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9GZXRjaFR5cGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9GZXRjaFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3ICsxMCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CiAKIC8qKgotICogCisgKiBGZXRjaCBUeXBlCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMCw2NSArMjAsNzMgQEAKICAqLwogcHVibGljIGVudW0gRmV0Y2hUeXBlIHsKIAotCUVBR0VSLAotCUxBWlk7Ci0JCisJRUFHRVIoCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUiwKKwkJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIKKwkJKSwKKwlMQVpZKAorCQkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwKKwkJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWQorCQkpOworCisKKwlwcml2YXRlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlIGphdmFGZXRjaFR5cGU7CisJcHJpdmF0ZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlIG9ybUZldGNoVHlwZTsKKworCUZldGNoVHlwZShvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZSBqYXZhRmV0Y2hUeXBlLCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlIG9ybUZldGNoVHlwZSkgeworCQlpZiAoamF2YUZldGNoVHlwZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKwkJfQorCQlpZiAob3JtRmV0Y2hUeXBlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMuamF2YUZldGNoVHlwZSA9IGphdmFGZXRjaFR5cGU7CisJCXRoaXMub3JtRmV0Y2hUeXBlID0gb3JtRmV0Y2hUeXBlOworCX0KKworCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZSBnZXRKYXZhRmV0Y2hUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5qYXZhRmV0Y2hUeXBlOworCX0KKworCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlIGdldE9ybUZldGNoVHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtRmV0Y2hUeXBlOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCiAKIAlwdWJsaWMgc3RhdGljIEZldGNoVHlwZSBmcm9tSmF2YVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUgamF2YUZldGNoVHlwZSkgewotCQlpZiAoamF2YUZldGNoVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChqYXZhRmV0Y2hUeXBlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhUmVzb3VyY2VNb2RlbF8oamF2YUZldGNoVHlwZSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRmV0Y2hUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbF8ob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUgamF2YUZldGNoVHlwZSkgeworCQlmb3IgKEZldGNoVHlwZSBmZXRjaFR5cGUgOiBGZXRjaFR5cGUudmFsdWVzKCkpIHsKKwkJCWlmIChmZXRjaFR5cGUuZ2V0SmF2YUZldGNoVHlwZSgpID09IGphdmFGZXRjaFR5cGUpIHsKKwkJCQlyZXR1cm4gZmV0Y2hUeXBlOworCQkJfQogCQl9Ci0JCXN3aXRjaCAoamF2YUZldGNoVHlwZSkgewotCQkJY2FzZSBFQUdFUjoKLQkJCQlyZXR1cm4gRUFHRVI7Ci0JCQljYXNlIExBWlk6Ci0JCQkJcmV0dXJuIExBWlk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZmV0Y2ggdHlwZTogIiArIGphdmFGZXRjaFR5cGUpOwotCQl9CisJCXJldHVybiBudWxsOwogCX0KIAogCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUgdG9KYXZhUmVzb3VyY2VNb2RlbChGZXRjaFR5cGUgZmV0Y2hUeXBlKSB7Ci0JCWlmIChmZXRjaFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChmZXRjaFR5cGUpIHsKLQkJCWNhc2UgRUFHRVI6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSOwotCQkJY2FzZSBMQVpZOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGZldGNoIHR5cGU6ICIgKyBmZXRjaFR5cGUpOwotCQl9CisJCXJldHVybiAoZmV0Y2hUeXBlID09IG51bGwpID8gbnVsbCA6IGZldGNoVHlwZS5nZXRKYXZhRmV0Y2hUeXBlKCk7CiAJfQotCQogCiAJcHVibGljIHN0YXRpYyBGZXRjaFR5cGUgZnJvbU9ybVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZSBvcm1GZXRjaFR5cGUpIHsKLQkJaWYgKG9ybUZldGNoVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKG9ybUZldGNoVHlwZSkgewotCQkJY2FzZSBFQUdFUjoKLQkJCQlyZXR1cm4gRUFHRVI7Ci0JCQljYXNlIExBWlk6Ci0JCQkJcmV0dXJuIExBWlk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZmV0Y2ggdHlwZTogIiArIG9ybUZldGNoVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChvcm1GZXRjaFR5cGUgPT0gbnVsbCkgPyBudWxsIDogZnJvbU9ybVJlc291cmNlTW9kZWxfKG9ybUZldGNoVHlwZSk7CiAJfQotCQorCisJcHJpdmF0ZSBzdGF0aWMgRmV0Y2hUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsXyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlIG9ybUZldGNoVHlwZSkgeworCQlmb3IgKEZldGNoVHlwZSBmZXRjaFR5cGUgOiBGZXRjaFR5cGUudmFsdWVzKCkpIHsKKwkJCWlmIChmZXRjaFR5cGUuZ2V0T3JtRmV0Y2hUeXBlKCkgPT0gb3JtRmV0Y2hUeXBlKSB7CisJCQkJcmV0dXJuIGZldGNoVHlwZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKIAlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEZldGNoVHlwZSBmZXRjaFR5cGUpIHsKLQkJaWYgKGZldGNoVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGZldGNoVHlwZSkgewotCQkJY2FzZSBFQUdFUjoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUjsKLQkJCWNhc2UgTEFaWToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGZldGNoIHR5cGU6ICIgKyBmZXRjaFR5cGUpOwotCQl9CisJCXJldHVybiAoZmV0Y2hUeXBlID09IG51bGwpID8gbnVsbCA6IGZldGNoVHlwZS5nZXRPcm1GZXRjaFR5cGUoKTsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0ZldGNoYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRmV0Y2hhYmxlLmphdmEKaW5kZXggODdlM2QyYS4uZDU4M2FhMCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRmV0Y2hhYmxlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvRmV0Y2hhYmxlLmphdmEKQEAgLTIzLDEwICsyMywxMCBAQAogCUZldGNoVHlwZSBnZXRGZXRjaCgpOwogCiAJRmV0Y2hUeXBlIGdldERlZmF1bHRGZXRjaCgpOwotCQlTdHJpbmcgREVGQVVMVF9GRVRDSF9QUk9QRVJUWSA9ICJkZWZhdWx0RmV0Y2hQcm9wZXJ0eSI7CisJCVN0cmluZyBERUZBVUxUX0ZFVENIX1BST1BFUlRZID0gImRlZmF1bHRGZXRjaCI7IC8vJE5PTi1OTFMtMSQKIAkJCiAJRmV0Y2hUeXBlIGdldFNwZWNpZmllZEZldGNoKCk7CiAJdm9pZCBzZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUgbmV3U3BlY2lmaWVkRmV0Y2gpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZID0gInNwZWNpZmllZEZldGNoUHJvcGVydHkiOworCQlTdHJpbmcgU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZID0gInNwZWNpZmllZEZldGNoIjsgLy8kTk9OLU5MUy0xJAogCQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdGVkVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0dlbmVyYXRlZFZhbHVlLmphdmEKaW5kZXggYmZkODczZi4uMjJiYWNkNCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdGVkVmFsdWUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9HZW5lcmF0ZWRWYWx1ZS5qYXZhCkBAIC0xOCwyMiArMTgsMjMgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBHZW5lcmF0ZWRWYWx1ZSBleHRlbmRzIEpwYUNvbnRleHROb2RlCitwdWJsaWMgaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlCisJZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQogewogCiAJR2VuZXJhdGlvblR5cGUgZ2V0U3RyYXRlZ3koKTsKIAlHZW5lcmF0aW9uVHlwZSBnZXREZWZhdWx0U3RyYXRlZ3koKTsKKwkJU3RyaW5nIERFRkFVTFRfU1RSQVRFR1lfUFJPUEVSVFkgPSAiZGVmYXVsdFN0cmF0ZWd5IjsgLy8kTk9OLU5MUy0xJAorCQlHZW5lcmF0aW9uVHlwZSBERUZBVUxUX1NUUkFURUdZID0gR2VuZXJhdGlvblR5cGUuQVVUTzsKIAlHZW5lcmF0aW9uVHlwZSBnZXRTcGVjaWZpZWRTdHJhdGVneSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkU3RyYXRlZ3koR2VuZXJhdGlvblR5cGUgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1NUUkFURUdZX1BST1BFUlRZID0gInNwZWNpZmllZFN0cmF0ZWd5UHJvcGVydHkiOwotCQlTdHJpbmcgREVGQVVMVF9TVFJBVEVHWV9QUk9QRVJUWSA9ICJkZWZhdWx0U3RyYXRlZ3lQcm9wZXJ0eSI7CisJdm9pZCBzZXRTcGVjaWZpZWRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSk7CisJCVN0cmluZyBTUEVDSUZJRURfU1RSQVRFR1lfUFJPUEVSVFkgPSAic3BlY2lmaWVkU3RyYXRlZ3kiOyAvLyROT04tTkxTLTEkCiAJCiAJU3RyaW5nIGdldEdlbmVyYXRvcigpOwogCVN0cmluZyBnZXREZWZhdWx0R2VuZXJhdG9yKCk7Ci0JCUdlbmVyYXRpb25UeXBlIERFRkFVTFRfU1RSQVRFR1kgPSBHZW5lcmF0aW9uVHlwZS5BVVRPOworCQlTdHJpbmcgREVGQVVMVF9HRU5FUkFUT1JfUFJPUEVSVFkgPSAiZGVmYXVsdEdlbmVyYXRvciI7IC8vJE5PTi1OTFMtMSQKIAlTdHJpbmcgZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRHZW5lcmF0b3IoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9HRU5FUkFUT1JfUFJPUEVSVFkgPSAic3BlY2lmaWVkR2VuZXJhdG9yUHJvcGVydHkiOwotCQlTdHJpbmcgREVGQVVMVF9HRU5FUkFUT1JfUFJPUEVSVFkgPSAiZGVmYXVsdEdlbmVyYXRvclByb3BlcnR5IjsKKwl2b2lkIHNldFNwZWNpZmllZEdlbmVyYXRvcihTdHJpbmcgZ2VuZXJhdG9yKTsKKwkJU3RyaW5nIFNQRUNJRklFRF9HRU5FUkFUT1JfUFJPUEVSVFkgPSAic3BlY2lmaWVkR2VuZXJhdG9yIjsgLy8kTk9OLU5MUy0xJAogCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9HZW5lcmF0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdGlvblR5cGUuamF2YQppbmRleCBkNDY5OTBkLi43ZGQ2MzY3IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9HZW5lcmF0aW9uVHlwZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0dlbmVyYXRpb25UeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwogCiAvKioKLSAqIAorICogR2VuZXJhdGlvbiBUeXBlCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMCw4MSArMjAsODEgQEAKICAqLwogcHVibGljIGVudW0gR2VuZXJhdGlvblR5cGUgewogCi0JVEFCTEUsCi0JU0VRVUVOQ0UsCi0JSURFTlRJVFksCi0JQVVUTzsKLQkKKwlUQUJMRSgKKwkJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuVEFCTEUsCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUuVEFCTEUKKwkJKSwKKwlTRVFVRU5DRSgKKwkJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UsCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UKKwkJKSwKKwlJREVOVElUWSgKKwkJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuSURFTlRJVFksCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUuSURFTlRJVFkKKwkJKSwKKwlBVVRPKAorCQkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0aW9uVHlwZS5BVVRPLAorCQkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlLkFVVE8KKwkJKTsKKworCisJcHJpdmF0ZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRpb25UeXBlIGphdmFHZW5lcmF0aW9uVHlwZTsKKwlwcml2YXRlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZSBvcm1HZW5lcmF0aW9uVHlwZTsKKworCUdlbmVyYXRpb25UeXBlKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUgamF2YUdlbmVyYXRpb25UeXBlLCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUgb3JtR2VuZXJhdGlvblR5cGUpIHsKKwkJaWYgKGphdmFHZW5lcmF0aW9uVHlwZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKwkJfQorCQlpZiAob3JtR2VuZXJhdGlvblR5cGUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy5qYXZhR2VuZXJhdGlvblR5cGUgPSBqYXZhR2VuZXJhdGlvblR5cGU7CisJCXRoaXMub3JtR2VuZXJhdGlvblR5cGUgPSBvcm1HZW5lcmF0aW9uVHlwZTsKKwl9CisKKwlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0aW9uVHlwZSBnZXRKYXZhR2VuZXJhdGlvblR5cGUoKSB7CisJCXJldHVybiB0aGlzLmphdmFHZW5lcmF0aW9uVHlwZTsKKwl9CisKKwlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlIGdldE9ybUdlbmVyYXRpb25UeXBlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1HZW5lcmF0aW9uVHlwZTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgogCiAJcHVibGljIHN0YXRpYyBHZW5lcmF0aW9uVHlwZSBmcm9tSmF2YVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0aW9uVHlwZSBqYXZhR2VuZXJhdGlvblR5cGUpIHsKLQkJaWYgKGphdmFHZW5lcmF0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGphdmFHZW5lcmF0aW9uVHlwZSkgewotCQkJY2FzZSBUQUJMRToKLQkJCQlyZXR1cm4gVEFCTEU7Ci0JCQljYXNlIFNFUVVFTkNFOgotCQkJCXJldHVybiBTRVFVRU5DRTsKLQkJCWNhc2UgSURFTlRJVFk6Ci0JCQkJcmV0dXJuIElERU5USVRZOwotCQkJY2FzZSBBVVRPOgotCQkJCXJldHVybiBBVVRPOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGdlbmVyYXRpb24gdHlwZTogIiArIGphdmFHZW5lcmF0aW9uVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChqYXZhR2VuZXJhdGlvblR5cGUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFSZXNvdXJjZU1vZGVsXyhqYXZhR2VuZXJhdGlvblR5cGUpOwogCX0KLQkKKworCXByaXZhdGUgc3RhdGljIEdlbmVyYXRpb25UeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbF8ob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0aW9uVHlwZSBqYXZhR2VuZXJhdGlvblR5cGUpIHsKKwkJZm9yIChHZW5lcmF0aW9uVHlwZSBnZW5lcmF0aW9uVHlwZSA6IEdlbmVyYXRpb25UeXBlLnZhbHVlcygpKSB7CisJCQlpZiAoZ2VuZXJhdGlvblR5cGUuZ2V0SmF2YUdlbmVyYXRpb25UeXBlKCkgPT0gamF2YUdlbmVyYXRpb25UeXBlKSB7CisJCQkJcmV0dXJuIGdlbmVyYXRpb25UeXBlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwogCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0aW9uVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEdlbmVyYXRpb25UeXBlIGdlbmVyYXRpb25UeXBlKSB7Ci0JCWlmIChnZW5lcmF0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGdlbmVyYXRpb25UeXBlKSB7Ci0JCQljYXNlIFRBQkxFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRpb25UeXBlLlRBQkxFOwotCQkJY2FzZSBTRVFVRU5DRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0aW9uVHlwZS5TRVFVRU5DRTsKLQkJCWNhc2UgSURFTlRJVFk6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuSURFTlRJVFk7Ci0JCQljYXNlIEFVVE86Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuQVVUTzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBnZW5lcmF0aW9uIHR5cGU6ICIgKyBnZW5lcmF0aW9uVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChnZW5lcmF0aW9uVHlwZSA9PSBudWxsKSA/IG51bGwgOiBnZW5lcmF0aW9uVHlwZS5nZXRKYXZhR2VuZXJhdGlvblR5cGUoKTsKIAl9CiAKIAlwdWJsaWMgc3RhdGljIEdlbmVyYXRpb25UeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZSBvcm1HZW5lcmF0aW9uVHlwZSkgewotCQlpZiAob3JtR2VuZXJhdGlvblR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChvcm1HZW5lcmF0aW9uVHlwZSkgewotCQkJY2FzZSBUQUJMRToKLQkJCQlyZXR1cm4gVEFCTEU7Ci0JCQljYXNlIFNFUVVFTkNFOgotCQkJCXJldHVybiBTRVFVRU5DRTsKLQkJCWNhc2UgSURFTlRJVFk6Ci0JCQkJcmV0dXJuIElERU5USVRZOwotCQkJY2FzZSBBVVRPOgotCQkJCXJldHVybiBBVVRPOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGdlbmVyYXRpb24gdHlwZTogIiArIG9ybUdlbmVyYXRpb25UeXBlKTsKLQkJfQorCQlyZXR1cm4gKG9ybUdlbmVyYXRpb25UeXBlID09IG51bGwpID8gbnVsbCA6IGZyb21Pcm1SZXNvdXJjZU1vZGVsXyhvcm1HZW5lcmF0aW9uVHlwZSk7CiAJfQotCQorCisJcHJpdmF0ZSBzdGF0aWMgR2VuZXJhdGlvblR5cGUgZnJvbU9ybVJlc291cmNlTW9kZWxfKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZSBvcm1HZW5lcmF0aW9uVHlwZSkgeworCQlmb3IgKEdlbmVyYXRpb25UeXBlIGdlbmVyYXRpb25UeXBlIDogR2VuZXJhdGlvblR5cGUudmFsdWVzKCkpIHsKKwkJCWlmIChnZW5lcmF0aW9uVHlwZS5nZXRPcm1HZW5lcmF0aW9uVHlwZSgpID09IG9ybUdlbmVyYXRpb25UeXBlKSB7CisJCQkJcmV0dXJuIGdlbmVyYXRpb25UeXBlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwogCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlIHRvT3JtUmVzb3VyY2VNb2RlbChHZW5lcmF0aW9uVHlwZSBnZW5lcmF0aW9uVHlwZSkgewotCQlpZiAoZ2VuZXJhdGlvblR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChnZW5lcmF0aW9uVHlwZSkgewotCQkJY2FzZSBUQUJMRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlLlRBQkxFOwotCQkJY2FzZSBTRVFVRU5DRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlLlNFUVVFTkNFOwotCQkJY2FzZSBJREVOVElUWToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlLklERU5USVRZOwotCQkJY2FzZSBBVVRPOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUuQVVUTzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBnZW5lcmF0aW9uIHR5cGU6ICIgKyBnZW5lcmF0aW9uVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChnZW5lcmF0aW9uVHlwZSA9PSBudWxsKSA/IG51bGwgOiBnZW5lcmF0aW9uVHlwZS5nZXRPcm1HZW5lcmF0aW9uVHlwZSgpOwogCX0KKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9HZW5lcmF0b3IuamF2YQppbmRleCA4MzgwYWNmLi43M2MwNGI3IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9HZW5lcmF0b3IuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9HZW5lcmF0b3IuamF2YQpAQCAtOSw2OSArOSw4NyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKIAogLyoqCi0gKiAKLSAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKICAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgR2VuZXJhdG9yIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgR2VuZXJhdG9yCisJZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQogewotCS8vICoqKioqKioqKioqKioqKiogbmFtZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOwotCQorCVN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1IgPSAic2VxdWVuY2VHZW5lcmF0b3IiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIFRBQkxFX0dFTkVSQVRPUiA9ICJ0YWJsZUdlbmVyYXRvciI7IC8vJE5PTi1OTFMtMSQKKworCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCisKIAlTdHJpbmcgZ2V0TmFtZSgpOwotCQogCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogaW5pdGlhbCB2YWx1ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlJbnRlZ2VyIGdldEluaXRpYWxWYWx1ZSgpOwotCQotCVN0cmluZyBERUZBVUxUX0lOSVRJQUxfVkFMVUVfUFJPUEVSVFkgPSAiZGVmYXVsdEluaXRpYWxWYWx1ZVByb3BlcnR5IjsKLQkKLQlJbnRlZ2VyIGdldERlZmF1bHRJbml0aWFsVmFsdWUoKTsKLQkKLQlTdHJpbmcgU1BFQ0lGSUVEX0lOSVRJQUxfVkFMVUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkSW5pdGlhbFZhbHVlUHJvcGVydHkiOwotCQorCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAorCisKKwkvLyAqKioqKioqKioqIGluaXRpYWwgdmFsdWUgKioqKioqKioqKgorCisJaW50IGdldEluaXRpYWxWYWx1ZSgpOwogCUludGVnZXIgZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCk7Ci0JCiAJdm9pZCBzZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlciB2YWx1ZSk7CisJCVN0cmluZyBTUEVDSUZJRURfSU5JVElBTF9WQUxVRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRJbml0aWFsVmFsdWUiOyAvLyROT04tTkxTLTEkCisJaW50IGdldERlZmF1bHRJbml0aWFsVmFsdWUoKTsKKwkJU3RyaW5nIERFRkFVTFRfSU5JVElBTF9WQUxVRV9QUk9QRVJUWSA9ICJkZWZhdWx0SW5pdGlhbFZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCisKKwkvLyAqKioqKioqKioqIGFsbG9jYXRpb24gc2l6ZSAqKioqKioqKioqCiAJCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBhbGxvY2F0aW9uIHNpemUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUludGVnZXIgZ2V0QWxsb2NhdGlvblNpemUoKTsKLQkKLQlTdHJpbmcgREVGQVVMVF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFkgPSAiZGVmYXVsdEFsbG9jYXRpb25TaXplUHJvcGVydHkiOwotCQotCUludGVnZXIgREVGQVVMVF9BTExPQ0FUSU9OX1NJWkUgPSBJbnRlZ2VyLnZhbHVlT2YoNTApOwotCQotCUludGVnZXIgZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCk7Ci0JCQotCVN0cmluZyBTUEVDSUZJRURfQUxMT0NBVElPTl9TSVpFX1BST1BFUlRZID0gInNwZWNpZmllZEFsbG9jYXRpb25TaXplUHJvcGVydHkiOwotCQorCWludCBnZXRBbGxvY2F0aW9uU2l6ZSgpOwogCUludGVnZXIgZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKTsKLQkKIAl2b2lkIHNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIgdmFsdWUpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJU3RyaW5nIFNQRUNJRklFRF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFkgPSAic3BlY2lmaWVkQWxsb2NhdGlvblNpemUiOyAvLyROT04tTkxTLTEkCisJaW50IGdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpOworCWludCBERUZBVUxUX0FMTE9DQVRJT05fU0laRSA9IDUwOworCQlTdHJpbmcgREVGQVVMVF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFkgPSAiZGVmYXVsdEFsbG9jYXRpb25TaXplIjsgLy8kTk9OLU5MUy0xJAorCisKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgogCQogCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgZ2VuZXJhdG9yIG92ZXJyaWRlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgc3BlY2lmaWVkCi0JICogZ2VuZXJhdG9yCi0JICogKGZvciBleGFtcGxlLCBhIGdlbmVyYXRvciBkZWZpbmVkIGluIG9ybS54bWwgb3ZlcnJpZGVzIG9uZSBkZWZpbmVkIGluIGphdmEpCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGdlbmVyYXRvciBvdmVycmlkZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGdpdmVuIGdlbmVyYXRvcgorCSAqIChlLmcuIGEgZ2VuZXJhdG9yIGRlZmluZWQgaW4gb3JtLnhtbCBvdmVycmlkZXMgb25lIGRlZmluZWQgaW4gamF2YSkuCiAJICovCiAJYm9vbGVhbiBvdmVycmlkZXMoR2VuZXJhdG9yIGdlbmVyYXRvcik7CiAJCi0JCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGdlbmVyYXRvciBpcyBhIGR1cGxpY2F0ZSBvZiB0aGUgZ2l2ZW4gZ2VuZXJhdG9yLgorCSAqIEEgZ2VuZXJhdG9yIGlzIG5vdCBhIGR1cGxpY2F0ZSBvZiBhbm90aGVyIGdlbmVyYXRvciBpZiBpcyB0aGUgc2FtZSBleGFjdCBnZW5lcmF0b3IsCisJICogaWYgaXQgaXMgYSBuYW1lbGVzcyBnZW5lcmF0b3IgKHdoaWNoIGlzIGFuIGVycm9yIGNvbmRpdGlvbiksIG9yIGlmIGl0IG92ZXJyaWRlcyAKKwkgKiBvciBpcyBvdmVycmlkZGVuIGJ5IHRoZSBvdGhlciBnZW5lcmF0b3IuIAorCSAqLworCWJvb2xlYW4gZHVwbGljYXRlcyhHZW5lcmF0b3IgZ2VuZXJhdG9yKTsKKwogCWJvb2xlYW4gaXNWaXJ0dWFsKCk7CiAKKworCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIGEgZGIgU2NoZW1hIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQvZGVmYXVsdCBzY2hlbWEgbmFtZS4KKwkgKiBUaGlzIGNhbiByZXR1cm4gbnVsbCBpZiBubyBTY2hlbWEgZXhpc3RzIG9uIHRoZSBkYXRhYmFzZSB3aXRoIHRoYXQgbmFtZS4KKwkgKi8KKwlTY2hlbWEgZ2V0RGJTY2hlbWEoKTsKKworCS8qKgorCSAqIFJldHVybiBhIGRiIENhdGFsb2cgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZC9kZWZhdWx0IGNhdGFsb2cgbmFtZS4KKwkgKiBUaGlzIGNhbiByZXR1cm4gbnVsbCBpZiBubyBDYXRhbG9nIGV4aXN0cyBvbiB0aGUgZGF0YWJhc2Ugd2l0aCB0aGF0IG5hbWUuCisJICovCisJQ2F0YWxvZyBnZXREYkNhdGFsb2coKTsKKworCS8qKgorCSAqIFJldHVybiBhIGRiIGNvbnRhaW5lciBvYmplY3QgdGhhdCBob2xkIHRoZSByZWxldmFudCBzY2hlbWF0YS4KKwkgKi8KKwlTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdG9yQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9HZW5lcmF0b3JDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzE2Y2MzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdG9yQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEdlbmVyYXRvckNvbnRhaW5lcgorCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKK3sKKwkvLyoqKioqKioqKioqKioqKioqKioqIHRhYmxlIGdlbmVyYXRvciAqKioqKioqKioqKioqKioqKgorCQorCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFkgPSAidGFibGVHZW5lcmF0b3IiOyAvLyROT04tTkxTLTEkCisJCisJVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKTsKKwkKKwlUYWJsZUdlbmVyYXRvciBhZGRUYWJsZUdlbmVyYXRvcigpOworCQorCXZvaWQgcmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsKKwkKKwkKKwkvLyoqKioqKioqKioqKioqKioqKioqIHNlcXVlbmNlIGdlbmVyYXRvciAqKioqKioqKioqKioqKioqKgorCQorCVN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFkgPSAic2VxdWVuY2VHZW5lcmF0b3IiOyAvLyROT04tTkxTLTEkCisJCisJU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkKKwlTZXF1ZW5jZUdlbmVyYXRvciBhZGRTZXF1ZW5jZUdlbmVyYXRvcigpOworCQorCXZvaWQgcmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0dlbmVyYXRvckhvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdG9ySG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjRlZmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvR2VuZXJhdG9ySG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdlbmVyYXRvckhvbGRlciBleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JLy8qKioqKioqKioqKioqKioqKioqKiB0YWJsZSBnZW5lcmF0b3IgKioqKioqKioqKioqKioqKioKLQlUYWJsZUdlbmVyYXRvciBnZXRUYWJsZUdlbmVyYXRvcigpOwotCi0JVGFibGVHZW5lcmF0b3IgYWRkVGFibGVHZW5lcmF0b3IoKTsKLQotCXZvaWQgcmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsKLQotCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFkgPSAidGFibGVHZW5lcmF0b3JQcm9wZXJ0eSI7Ci0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKioqIHNlcXVlbmNlIGdlbmVyYXRvciAqKioqKioqKioqKioqKioqKgotCVNlcXVlbmNlR2VuZXJhdG9yIGdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0KLQlTZXF1ZW5jZUdlbmVyYXRvciBhZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0Jdm9pZCByZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0JU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSA9ICJzZXF1ZW5jZUdlbmVyYXRvclByb3BlcnR5IjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9JZENsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9JZENsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MmFlMjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSWRDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJZENsYXNzIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlTdHJpbmcgZ2V0SWRDbGFzcygpOwotCQotCXZvaWQgc2V0SWRDbGFzcyhTdHJpbmcgdmFsdWUpOwotCQotCQlTdHJpbmcgSURfQ0xBU1NfUFJPUEVSVFkgPSAiaWRDbGFzc1Byb3BlcnR5IjsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0lkQ2xhc3NIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0lkQ2xhc3NIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWViMGFiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSWRDbGFzc0hvbGRlci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7CisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIElkQ2xhc3NIb2xkZXIKKwlleHRlbmRzIEpwYU5vZGUKK3sKKwlTdHJpbmcgZ2V0SWRDbGFzcygpOworCQorCXZvaWQgc2V0SWRDbGFzcyhTdHJpbmcgdmFsdWUpOworCQorCQlTdHJpbmcgSURfQ0xBU1NfUFJPUEVSVFkgPSAiaWRDbGFzcyI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGNoYXIgdG8gYmUgdXNlZCBmb3IgYnJvd3Npbmcgb3IgY3JlYXRpbmcgdGhlIGlkIGNsYXNzIElUeXBlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUjZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIpCisJICovCisJY2hhciBnZXRJZENsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpOworCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9JZE1hcHBpbmcuamF2YQppbmRleCA1ZjNmN2Q3Li41ZjZkMTg2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9JZE1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9JZE1hcHBpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xOCwxMSArMTgsMTMgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBJZE1hcHBpbmcgZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nLCBDb2x1bW5NYXBwaW5nLCBHZW5lcmF0b3JIb2xkZXIKK3B1YmxpYyBpbnRlcmZhY2UgSWRNYXBwaW5nIGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZywgQ29sdW1uTWFwcGluZywgQ29udmVydGlibGVNYXBwaW5nCiB7CisJR2VuZXJhdG9yQ29udGFpbmVyIGdldEdlbmVyYXRvckNvbnRhaW5lcigpOworCiAJR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKTsKIAlHZW5lcmF0ZWRWYWx1ZSBhZGRHZW5lcmF0ZWRWYWx1ZSgpOwogCXZvaWQgcmVtb3ZlR2VuZXJhdGVkVmFsdWUoKTsKLQkJU3RyaW5nIEdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSA9ICJnZW5lcmF0ZWRWYWx1ZVByb3BlcnR5IjsKKwkJU3RyaW5nIEdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSA9ICJnZW5lcmF0ZWRWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSW5oZXJpdGFuY2VUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Jbmhlcml0YW5jZVR5cGUuamF2YQppbmRleCBhODRiODA1Li5mOGM4NjI4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Jbmhlcml0YW5jZVR5cGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Jbmhlcml0YW5jZVR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3ICsxMCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CiAKIC8qKgotICogCisgKiBJbmhlcml0YW5jZSBUeXBlCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMCw3NSArMjAsNzcgQEAKICAqLwogcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlIHsKIAorCVNJTkdMRV9UQUJMRSgKKwkJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwKKwkJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFCisJCSksCisJSk9JTkVEKAorCQkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGUuSk9JTkVELAorCQkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZS5KT0lORUQKKwkJKSwKKwlUQUJMRV9QRVJfQ0xBU1MoCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUworCQkpOwogCi0JU0lOR0xFX1RBQkxFLAotCUpPSU5FRCwKLQlUQUJMRV9QRVJfQ0xBU1M7CiAKKwlwcml2YXRlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlIGphdmFJbmhlcml0YW5jZVR5cGU7CisJcHJpdmF0ZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlIG9ybUluaGVyaXRhbmNlVHlwZTsKKworCUluaGVyaXRhbmNlVHlwZShvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlVHlwZSBqYXZhSW5oZXJpdGFuY2VUeXBlLCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlIG9ybUluaGVyaXRhbmNlVHlwZSkgeworCQlpZiAoamF2YUluaGVyaXRhbmNlVHlwZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKwkJfQorCQlpZiAob3JtSW5oZXJpdGFuY2VUeXBlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMuamF2YUluaGVyaXRhbmNlVHlwZSA9IGphdmFJbmhlcml0YW5jZVR5cGU7CisJCXRoaXMub3JtSW5oZXJpdGFuY2VUeXBlID0gb3JtSW5oZXJpdGFuY2VUeXBlOworCX0KKworCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlVHlwZSBnZXRKYXZhSW5oZXJpdGFuY2VUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5qYXZhSW5oZXJpdGFuY2VUeXBlOworCX0KKworCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlIGdldE9ybUluaGVyaXRhbmNlVHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtSW5oZXJpdGFuY2VUeXBlOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCiAKIAlwdWJsaWMgc3RhdGljIEluaGVyaXRhbmNlVHlwZSBmcm9tSmF2YVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGUgamF2YUluaGVyaXRhbmNlVHlwZSkgewotCQlpZiAoamF2YUluaGVyaXRhbmNlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGphdmFJbmhlcml0YW5jZVR5cGUpIHsKLQkJCWNhc2UgU0lOR0xFX1RBQkxFOgotCQkJCXJldHVybiBTSU5HTEVfVEFCTEU7Ci0JCQljYXNlIEpPSU5FRDoKLQkJCQlyZXR1cm4gSk9JTkVEOwotCQkJY2FzZSBUQUJMRV9QRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIFRBQkxFX1BFUl9DTEFTUzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBpbmhlcml0YW5jZSB0eXBlOiAiICsgamF2YUluaGVyaXRhbmNlVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChqYXZhSW5oZXJpdGFuY2VUeXBlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhUmVzb3VyY2VNb2RlbF8oamF2YUluaGVyaXRhbmNlVHlwZSk7CiAJfQotCQorCisJcHJpdmF0ZSBzdGF0aWMgSW5oZXJpdGFuY2VUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbF8ob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGUgamF2YUluaGVyaXRhbmNlVHlwZSkgeworCQlmb3IgKEluaGVyaXRhbmNlVHlwZSBpbmhlcml0YW5jZVR5cGUgOiBJbmhlcml0YW5jZVR5cGUudmFsdWVzKCkpIHsKKwkJCWlmIChpbmhlcml0YW5jZVR5cGUuZ2V0SmF2YUluaGVyaXRhbmNlVHlwZSgpID09IGphdmFJbmhlcml0YW5jZVR5cGUpIHsKKwkJCQlyZXR1cm4gaW5oZXJpdGFuY2VUeXBlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwogCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGUgdG9KYXZhUmVzb3VyY2VNb2RlbChJbmhlcml0YW5jZVR5cGUgaW5oZXJpdGFuY2VUeXBlKSB7Ci0JCWlmIChpbmhlcml0YW5jZVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChpbmhlcml0YW5jZVR5cGUpIHsKLQkJCWNhc2UgU0lOR0xFX1RBQkxFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEU7Ci0JCQljYXNlIEpPSU5FRDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGUuSk9JTkVEOwotCQkJY2FzZSBUQUJMRV9QRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBpbmhlcml0YW5jZSB0eXBlOiAiICsgaW5oZXJpdGFuY2VUeXBlKTsKLQkJfQorCQlyZXR1cm4gKGluaGVyaXRhbmNlVHlwZSA9PSBudWxsKSA/IG51bGwgOiBpbmhlcml0YW5jZVR5cGUuZ2V0SmF2YUluaGVyaXRhbmNlVHlwZSgpOwogCX0KLQkKIAogCXB1YmxpYyBzdGF0aWMgSW5oZXJpdGFuY2VUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUgb3JtSW5oZXJpdGFuY2VUeXBlKSB7Ci0JCWlmIChvcm1Jbmhlcml0YW5jZVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChvcm1Jbmhlcml0YW5jZVR5cGUpIHsKLQkJCWNhc2UgU0lOR0xFX1RBQkxFOgotCQkJCXJldHVybiBTSU5HTEVfVEFCTEU7Ci0JCQljYXNlIEpPSU5FRDoKLQkJCQlyZXR1cm4gSk9JTkVEOwotCQkJY2FzZSBUQUJMRV9QRVJfQ0xBU1M6Ci0JCQkJcmV0dXJuIFRBQkxFX1BFUl9DTEFTUzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBpbmhlcml0YW5jZSB0eXBlOiAiICsgb3JtSW5oZXJpdGFuY2VUeXBlKTsKLQkJfQorCQlyZXR1cm4gKG9ybUluaGVyaXRhbmNlVHlwZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tT3JtUmVzb3VyY2VNb2RlbF8ob3JtSW5oZXJpdGFuY2VUeXBlKTsKIAl9Ci0JCisKKwlwcml2YXRlIHN0YXRpYyBJbmhlcml0YW5jZVR5cGUgZnJvbU9ybVJlc291cmNlTW9kZWxfKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUgb3JtSW5oZXJpdGFuY2VUeXBlKSB7CisJCWZvciAoSW5oZXJpdGFuY2VUeXBlIGluaGVyaXRhbmNlVHlwZSA6IEluaGVyaXRhbmNlVHlwZS52YWx1ZXMoKSkgeworCQkJaWYgKGluaGVyaXRhbmNlVHlwZS5nZXRPcm1Jbmhlcml0YW5jZVR5cGUoKSA9PSBvcm1Jbmhlcml0YW5jZVR5cGUpIHsKKwkJCQlyZXR1cm4gaW5oZXJpdGFuY2VUeXBlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwogCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZSB0b09ybVJlc291cmNlTW9kZWwoSW5oZXJpdGFuY2VUeXBlIGluaGVyaXRhbmNlVHlwZSkgewotCQlpZiAoaW5oZXJpdGFuY2VUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoaW5oZXJpdGFuY2VUeXBlKSB7Ci0JCQljYXNlIFNJTkdMRV9UQUJMRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEU7Ci0JCQljYXNlIEpPSU5FRDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZS5KT0lORUQ7Ci0JCQljYXNlIFRBQkxFX1BFUl9DTEFTUzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1M7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gaW5oZXJpdGFuY2UgdHlwZTogIiArIGluaGVyaXRhbmNlVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChpbmhlcml0YW5jZVR5cGUgPT0gbnVsbCkgPyBudWxsIDogaW5oZXJpdGFuY2VUeXBlLmdldE9ybUluaGVyaXRhbmNlVHlwZSgpOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSm9pbkNvbHVtbi5qYXZhCmluZGV4IDk0OGExMjAuLjBiODMwMmIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0pvaW5Db2x1bW4uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Kb2luQ29sdW1uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwogCiAvKioKLSAqIAorICogam9pbiBjb2x1bW4KICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTE4LDE1ICsxOCwxNyBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEpvaW5Db2x1bW4gZXh0ZW5kcyBCYXNlQ29sdW1uLCBCYXNlSm9pbkNvbHVtbgorcHVibGljIGludGVyZmFjZSBKb2luQ29sdW1uCisJZXh0ZW5kcyBCYXNlQ29sdW1uLCBCYXNlSm9pbkNvbHVtbgogewotCUpvaW5Db2x1bW4uT3duZXIgZ2V0T3duZXIoKTsKKwlPd25lciBnZXRPd25lcigpOwogCiAJLyoqCiAJICogaW50ZXJmYWNlIGFsbG93aW5nIGpvaW4gY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwogCSAqIChlLmcuIDE6MSBtYXBwaW5ncyBhbmQgam9pbiB0YWJsZXMpCiAJICovCi0JaW50ZXJmYWNlIE93bmVyIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW4uT3duZXIsIEJhc2VDb2x1bW4uT3duZXIKKwlpbnRlcmZhY2UgT3duZXIKKwkJZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbi5Pd25lciwgQmFzZUNvbHVtbi5Pd25lcgogCXsKIAkJLyoqCiAJCSAqIHJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdGFibGUgY2Fubm90IGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGVmNDVkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OworCisvKioKKyAqIEEgPGNvZGU+Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U8L2NvZGU+IGlzIGEgdHlwZSBvZiAKKyAqIHtAbGluayBSZWxhdGlvbnNoaXBSZWZlcmVuY2V9IHRoYXQgbWF5IHV0aWxpemUgYSAKKyAqIHtAbGluayBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5fQorICogPHA+CisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHNlZSBSZWxhdGlvbnNoaXBNYXBwaW5nCisgKiBAc2VlIFJlbGF0aW9uc2hpcFJlZmVyZW5jZQorICogQHNlZSBKb2luQ29sdW1uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZXh0ZW5kcyBSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGFnZ3JlZ2F0ZSAobmV2ZXIgbnVsbCkgb2JqZWN0IHVzZWQgdG8gY29uZmlndXJlIHRoZSBqb2luIGNvbHVtbiAKKwkgKiBqb2luaW5nIHN0cmF0ZWd5CisJICovCisJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBnZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGpvaW4gY29sdW1uIGpvaW5pbmcgc3RyYXRlZ3kgaXMgY3VycmVudGx5IHRoZSAKKwkgKiBwcmVkb21pbmFudCBqb2luaW5nIHN0cmF0ZWd5CisJICovCisJYm9vbGVhbiB1c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQorCS8qKgorCSAqIFNldCB0aGUgam9pbiBjb2x1bW4gam9pbmluZyBzdHJhdGVneSBhcyB0aGUgcHJlZG9taW5hbnQgam9pbmluZyBzdHJhdGVneQorCSAqLworCXZvaWQgc2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQorCS8qKgorCSAqIFVuc2V0IHRoZSBqb2luIGNvbHVtbiBqb2luaW5nIHN0cmF0ZWd5IGFzIHRoZSBwcmVkb21pbmFudCBqb2luaW5nIHN0cmF0ZWd5LgorCSAqIFRoaXMgd2lsbCBub3Qgc2V0IGFueSBvdGhlciBqb2luaW5nIHN0cmF0ZWd5IGFzIHRoZSBwcmVkb21pbmFudCBvbmUsIHNvCisJICogd2hpY2hldmVyIG9uZSBpcyBhbHNvIGNvbmZpZ3VyZWQgKGlzIHNwZWNpZmllZCkgb3IgdGhlIGRlZmF1bHQgc3RyYXRlZ3kKKwkgKiB3aWxsIGFwcGx5IGF0IHRoYXQgcG9pbnQuCisJICovCisJdm9pZCB1bnNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHJlZmVyZW5jZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBhIGRlZmF1bHQgam9pbiBjb2x1bW4uCisJICogKEZvciBleGFtcGxlLCBhIDEtMSBtYXBwaW5nIG1heSBoYXZlIG9uZSBpZiBpdCBkb2VzIG5vdCBzcGVjaWZ5IGEgbWFwcGVkQnkKKwkgKiBvciBhIGpvaW4gdGFibGUsIGJ1dCBhIDEtTSBtYXBwaW5nIG1heSBub3QuKQorCSAqLworCWJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luQ29sdW1uKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxOGFmYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKKy8qKgorICogSm9pbmluZyBzdHJhdGVneSB0aGF0IHVzZXMgam9pbiBjb2x1bW5zCisgKiA8cD4KKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAyLjEKKyAqIAorICogQHNlZSB7QGxpbmsgUmVsYXRpb25zaGlwTWFwcGluZ30KKyAqIEBzZWUge0BsaW5rIEpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlfQorICovCitwdWJsaWMgaW50ZXJmYWNlIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kKKwlleHRlbmRzIEpvaW5pbmdTdHJhdGVneQoreworCQorCXZvaWQgaW5pdGlhbGl6ZUZyb20oSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBvbGRTdHJhdGVneSk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBUeXBlTWFwcGluZyB0aGF0IHRoaXMgam9pbiBjb2x1bW4gaXMgY29udGFpbmVkIGluLgorCSAqLworCVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBqb2luIGNvbHVtbnMgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KKwkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCisJICovCisJPFQgZXh0ZW5kcyBKb2luQ29sdW1uPiBMaXN0SXRlcmF0b3I8VD4gam9pbkNvbHVtbnMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBqb2luIGNvbHVtbnMsIGJvdGggc3BlY2lmaWVkIGFuZCBkZWZhdWx0LgorCSAqLworCWludCBqb2luQ29sdW1uc1NpemUoKTsKKwkKKwkvKioKKwkgKiBDaGFuZ2Ugbm90aWZpY2F0aW9uIGlkZW50aWZpZXIgZm9yICJkZWZhdWx0Sm9pbkNvbHVtbiIgcHJvcGVydHkKKwkgKi8KKwlTdHJpbmcgREVGQVVMVF9KT0lOX0NPTFVNTl9QUk9QRVJUWSA9ICJkZWZhdWx0Sm9pbkNvbHVtbiI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gb3IgbnVsbC4gIElmIHRoZXJlIGFyZSBzcGVjaWZpZWQgam9pbiAKKwkgKiBjb2x1bW5zLCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gZGVmYXVsdCBqb2luIGNvbHVtbiAodGhvdWdoIHRoZXJlIGFyZSAKKwkgKiB0aW1lcyB0aGF0IHRoZXJlIG1heSBiZSBubyBkZWZhdWx0IGpvaW4gY29sdW1uIGV2ZW4gaWYgdGhlcmUgYXJlIG5vCisJICogc3BlY2lmaWVkIGpvaW4gY29sdW1ucy4pCisJICovCisJSm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbigpOworCQorCS8qKgorCSAqIENoYW5nZSBub3RpZmljYXRpb24gaWRlbnRpZmllciBmb3IgInNwZWNpZmllZEpvaW5Db2x1bW5zIiBsaXN0CisJICovCisJU3RyaW5nIFNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCA9ICJzcGVjaWZpZWRKb2luQ29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW5zLgorCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KKwkgKi8KKwk8VCBleHRlbmRzIEpvaW5Db2x1bW4+IExpc3RJdGVyYXRvcjxUPiBzcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNwZWNpZmllZCBqb2luIGNvbHVtbnMuCisJICovCisJaW50IHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpOworCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgaGFzIGFueSBzcGVjaWZpZWQgam9pbiBjb2x1bW5zLgorCSAqIChFcXVpdmFsZW50IHRvIHtAbGluayAjc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCl9ID09IDApCisJICovCisJYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQorCS8qKgorCSAqIEFkZCBhIHNwZWNpZmllZCBqb2luIGNvbHVtbiB0byB0aGUgam9pbiB0YWJsZSByZXR1cm4gdGhlIG9iamVjdCAKKwkgKiByZXByZXNlbnRpbmcgaXQuCisJICovCisJSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7CisJCisJLyoqCisJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gZnJvbSB0aGUgam9pbiB0YWJsZS4KKwkgKi8KKwl2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KTsKKwkKKwkvKioKKwkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbiBhdCB0aGUgaW5kZXggZnJvbSB0aGUgam9pbiB0YWJsZS4KKwkgKi8KKwl2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKTsKKwkKKwkvKioKKwkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCisJICovCisJdm9pZCBtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Kb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0pvaW5UYWJsZS5qYXZhCmluZGV4IGNlMTMyZmUuLmE3NmYxZmIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0pvaW5UYWJsZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0pvaW5UYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEyLDcgKzEyLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogCiAvKioKLSAqIAorICogVXNlZCBieSBNYW55VG9NYW55IGFuZCBPbmVUb01hbnkgbWFwcGluZ3MuCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMCwxMjEgKzIwLDE0NyBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEpvaW5UYWJsZSBleHRlbmRzIFRhYmxlCitwdWJsaWMgaW50ZXJmYWNlIEpvaW5UYWJsZQorCWV4dGVuZHMgVGFibGUKIHsKKwlSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKIAotCVJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UGFyZW50KCk7Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKKwlKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgZ2V0UGFyZW50KCk7CisKKwkvLyAqKioqKioqKioqIGpvaW4gY29sdW1ucyAqKioqKioqKioqCisKIAkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBqb2luIGNvbHVtbnMgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCisJICogUmV0dXJuIHRoZSBqb2luIHRhYmxlJ3Mgam9pbiBjb2x1bW5zLCB3aGV0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0LgogCSAqLwogCTxUIGV4dGVuZHMgSm9pbkNvbHVtbj4gTGlzdEl0ZXJhdG9yPFQ+IGpvaW5Db2x1bW5zKCk7CiAKIAkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBqb2luIGNvbHVtbnMsIGJvdGggc3BlY2lmaWVkIGFuZCBkZWZhdWx0LgorCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGpvaW4gY29sdW1ucywgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KIAkgKi8KIAlpbnQgam9pbkNvbHVtbnNTaXplKCk7Ci0JCisKIAkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW5zLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KKwkgKiBDb252ZXJ0IHRoZSBqb2luIHRhYmxlJ3MgZGVmYXVsdCBqb2luIGNvbHVtbiB0byBhIHNwZWNpZmllZCBqb2luIGNvbHVtbi4KKwkgKi8KKwl2b2lkIGNvbnZlcnREZWZhdWx0VG9TcGVjaWZpZWRKb2luQ29sdW1uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbnMuCiAJICovCiAJPFQgZXh0ZW5kcyBKb2luQ29sdW1uPiBMaXN0SXRlcmF0b3I8VD4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCA9ICJzcGVjaWZpZWRKb2luQ29sdW1uc0xpc3QiOwotCQorCQlTdHJpbmcgU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUID0gInNwZWNpZmllZEpvaW5Db2x1bW5zIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqCiAJICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWVkIGpvaW4gY29sdW1ucy4KIAkgKi8KIAlpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7CiAKIAkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gb3IgbnVsbC4gIEEgZGVmYXVsdCBqb2luIGNvbHVtbgorCSAqIFJldHVybiB0aGUgZGVmYXVsdCBqb2luIGNvbHVtbiBvciBudWxsLiBBIGRlZmF1bHQgam9pbiBjb2x1bW4KIAkgKiBvbmx5IGV4aXN0cyBpZiB0aGVyZSBhcmUgbm8gc3BlY2lmaWVkIGpvaW4gY29sdW1ucy4KIAkgKi8KIAlKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCVN0cmluZyBERUZBVUxUX0pPSU5fQ09MVU1OID0gImRlZmF1bHRKb2luQ29sdW1uIjsKLQkJCisJCVN0cmluZyBERUZBVUxUX0pPSU5fQ09MVU1OID0gImRlZmF1bHRKb2luQ29sdW1uIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqCi0JICogQWRkIGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uIHRvIHRoZSBqb2luIHRhYmxlIHJldHVybiB0aGUgb2JqZWN0IAotCSAqIHJlcHJlc2VudGluZyBpdC4KKwkgKiBBZGQgYSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gdG8gdGhlIGpvaW4gdGFibGUuCisJICogUmV0dXJuIHRoZSBuZXdseS1jcmVhdGVkIGpvaW4gY29sdW1uLgogCSAqLwogCUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQorCisJLyoqCisJICogUmVtb3ZlIHRoZSBqb2luIGNvbHVtbiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIGpvaW4gdGFibGUuCisJICovCisJdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7CisKIAkvKioKIAkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbiBmcm9tIHRoZSBqb2luIHRhYmxlLgogCSAqLwotCXZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGpvaW4gY29sdW1uIGF0IHRoZSBpbmRleCBmcm9tIHRoZSBqb2luIHRhYmxlLgotCSAqLwogCXZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pOwotCQorCiAJLyoqCi0JICogTW92ZSB0aGUgc3BlY2lmaWVkIGpvaW4gY29sdW1uIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgorCSAqIE1vdmUgYSBqb2luIGNvbHVtbiBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZQorCSAqIHNwZWNpZmllZCB0YXJnZXQgaW5kZXguCiAJICovCiAJdm9pZCBtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCi0JYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCiAKLQkvLyAqKioqKioqKioqKioqKioqIGludmVyc2Ugam9pbiBjb2x1bW5zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCiAJLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgaW52ZXJzZSBqb2luIGNvbHVtbnMgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGpvaW4gdGFibGUgaGFzIHNwZWNpZmllZCBqb2luIGNvbHVtbnMuCisJICovCisJYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpOworCisJLyoqCisJICogUmVtb3ZlIGFsbCB0aGUgam9pbiB0YWJsZSdzIGpvaW4gY29sdW1ucy4KKwkgKi8KKwl2b2lkIGNsZWFyU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKworCisJLy8gKioqKioqKioqKiBpbnZlcnNlIGpvaW4gY29sdW1ucyAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGpvaW4gdGFibGUncyBpbnZlcnNlIGpvaW4gY29sdW1ucywgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KIAkgKi8KIAk8VCBleHRlbmRzIEpvaW5Db2x1bW4+IExpc3RJdGVyYXRvcjxUPiBpbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkKKwogCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGludmVyc2Ugam9pbiBjb2x1bW5zLCBib3RoIHNwZWNpZmllZCBhbmQgZGVmYXVsdC4KKwkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpbnZlcnNlIGpvaW4gY29sdW1ucywgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KIAkgKi8KIAlpbnQgaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOwotCQorCiAJLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgc3BlY2lmaWVkIGludmVyc2Ugam9pbiBjb2x1bW5zLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KKwkgKiBDb252ZXJ0IHRoZSBqb2luIHRhYmxlJ3MgZGVmYXVsdCBpbnZlcnNlIGpvaW4gY29sdW1uIHRvIGEgc3BlY2lmaWVkCisJICogaW52ZXJzZSBqb2luIGNvbHVtbi4KKwkgKi8KKwl2b2lkIGNvbnZlcnREZWZhdWx0VG9TcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgaW52ZXJzZSBqb2luIGNvbHVtbnMuCiAJICovCiAJPFQgZXh0ZW5kcyBKb2luQ29sdW1uPiBMaXN0SXRlcmF0b3I8VD4gc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfSU5WRVJTRV9KT0lOX0NPTFVNTlNfTElTVCA9ICJzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNMaXN0IjsKLQkKKwkJU3RyaW5nIFNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUID0gInNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKKwogCS8qKgogCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNwZWNpZmllZCBpbnZlcnNlIGpvaW4gY29sdW1ucy4KIAkgKi8KIAlpbnQgc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOwogCiAJLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IGludmVyc2Ugam9pbiBjb2x1bW4gb3IgbnVsbC4gIEEgZGVmYXVsdCBpbnZlcnNlIGpvaW4gY29sdW1uCisJICogUmV0dXJuIHRoZSBkZWZhdWx0IGludmVyc2Ugam9pbiBjb2x1bW4gb3IgbnVsbC4gQSBkZWZhdWx0IGludmVyc2Ugam9pbiBjb2x1bW4KIAkgKiBvbmx5IGV4aXN0cyBpZiB0aGVyZSBhcmUgbm8gc3BlY2lmaWVkIGludmVyc2Ugam9pbiBjb2x1bW5zLgogCSAqLwogCUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0JCVN0cmluZyBERUZBVUxUX0lOVkVSU0VfSk9JTl9DT0xVTU4gPSAiZGVmYXVsdEludmVyc2VKb2luQ29sdW1uIjsKLQkKKwkJU3RyaW5nIERFRkFVTFRfSU5WRVJTRV9KT0lOX0NPTFVNTiA9ICJkZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4iOyAvLyROT04tTkxTLTEkCisKIAkvKioKLQkgKiBBZGQgYSBzcGVjaWZpZWQgaW52ZXJzZSBqb2luIGNvbHVtbiB0byB0aGUgam9pbiB0YWJsZSByZXR1cm4gdGhlIG9iamVjdCAKLQkgKiByZXByZXNlbnRpbmcgaXQuCisJICogQWRkIGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uIHRvIHRoZSBqb2luIHRhYmxlLgorCSAqIFJldHVybiB0aGUgbmV3bHktY3JlYXRlZCBqb2luIGNvbHVtbi4KIAkgKi8KIAlKb2luQ29sdW1uIGFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JCisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIGludmVyc2Ugam9pbiBjb2x1bW4gYXQgdGhlIHNwZWNpZmllZCBpbmRleCBmcm9tIHRoZSBqb2luIHRhYmxlLgorCSAqLworCXZvaWQgcmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KTsKKwogCS8qKgogCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGludmVyc2Ugam9pbiBjb2x1bW4gZnJvbSB0aGUgam9pbiB0YWJsZS4KIAkgKi8KLQl2b2lkIHJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaW52ZXJzZSBqb2luIGNvbHVtbiBhdCB0aGUgaW5kZXggZnJvbSB0aGUgam9pbiB0YWJsZS4KLQkgKi8KIAl2b2lkIHJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbik7Ci0JCi0JCisKIAkvKioKLQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgaW52ZXJzZSBqb2luIGNvbHVtbiBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KKwkgKiBNb3ZlIGFuIGludmVyc2Ugam9pbiBjb2x1bW4gZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUKKwkgKiBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4LgogCSAqLwogCXZvaWQgbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKIAotCWJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgam9pbiB0YWJsZSBoYXMgc3BlY2lmaWVkIGludmVyc2Ugam9pbiBjb2x1bW5zLgorCSAqLworCWJvb2xlYW4gaGFzU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7CisKKwkvKioKKwkgKiBSZW1vdmUgYWxsIHRoZSBqb2luIHRhYmxlJ3MgaW52ZXJzZSBqb2luIGNvbHVtbnMuCisJICovCisJdm9pZCBjbGVhclNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwogCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Kb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Kb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4NjRkYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0pvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OworCisvKioKKyAqIEEgPGNvZGU+Sm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZTwvY29kZT4gaXMgYSB0eXBlIG9mIAorICoge0BsaW5rIFJlbGF0aW9uc2hpcFJlZmVyZW5jZX0gdGhhdCBtYXkgdXRpbGl6ZSBhIAorICoge0BsaW5rIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneX0KKyAqIDxwPgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEBzZWUgUmVsYXRpb25zaGlwTWFwcGluZworICogQHNlZSBSZWxhdGlvbnNoaXBSZWZlcmVuY2UKKyAqIEBzZWUgSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5CisgKiBAc2VlIEpvaW5UYWJsZQorICovCitwdWJsaWMgaW50ZXJmYWNlIEpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZXh0ZW5kcyBSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGFnZ3JlZ2F0ZSAobmV2ZXIgbnVsbCkgb2JqZWN0IHVzZWQgdG8gY29uZmlndXJlIHRoZSBqb2luIHRhYmxlIAorCSAqIGpvaW5pbmcgc3RyYXRlZ3kKKwkgKi8KKwlKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGpvaW4gdGFibGUgam9pbmluZyBzdHJhdGVneSBpcyBjdXJyZW50bHkgdGhlIAorCSAqIHByZWRvbWluYW50IGpvaW5pbmcgc3RyYXRlZ3kKKwkgKi8KKwlib29sZWFuIHVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKKwkKKwkvKioKKwkgKiBTZXQgdGhlIGpvaW4gdGFibGUgam9pbmluZyBzdHJhdGVneSBhcyB0aGUgcHJlZG9taW5hbnQgam9pbmluZyBzdHJhdGVneQorCSAqLworCXZvaWQgc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7CisJCisJLyoqCisJICogVW5zZXQgdGhlIGpvaW4gdGFibGUgam9pbmluZyBzdHJhdGVneSBhcyB0aGUgcHJlZG9taW5hbnQgam9pbmluZyBzdHJhdGVneS4KKwkgKiBUaGlzIHdpbGwgbm90IHNldCBhbnkgb3RoZXIgam9pbmluZyBzdHJhdGVneSBhcyB0aGUgcHJlZG9taW5hbnQgb25lLCBzbworCSAqIHdoaWNoZXZlciBvbmUgaXMgYWxzbyBjb25maWd1cmVkIChpcyBzcGVjaWZpZWQpIG9yIHRoZSBkZWZhdWx0IHN0cmF0ZWd5CisJICogd2lsbCBhcHBseSBhdCB0aGF0IHBvaW50LgorCSAqLworCXZvaWQgdW5zZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHJlZmVyZW5jZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBhIGRlZmF1bHQgam9pbiB0YWJsZS4KKwkgKiAoRm9yIGV4YW1wbGUsIGEgTS1NIG1hcHBpbmcgbWF5IGhhdmUgb25lIGlmIGl0IGRvZXMgbm90IHNwZWNpZnkgYSAKKwkgKiBtYXBwZWRCeSkKKwkgKi8KKwlib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pblRhYmxlKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYjkzNWEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OworCisvKioKKyAqIEpvaW5pbmcgc3RyYXRlZ3kgdGhhdCB1c2VzIGEgam9pbiB0YWJsZQorICogPHA+CisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMi4xCisgKiAKKyAqIEBzZWUge0BsaW5rIFJlbGF0aW9uc2hpcE1hcHBpbmd9CisgKiBAc2VlIHtAbGluayBKb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlfQorICovCitwdWJsaWMgaW50ZXJmYWNlIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSAKKwlleHRlbmRzIEpvaW5pbmdTdHJhdGVneQoreworCQkKKwl2b2lkIGluaXRpYWxpemVGcm9tKEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSBvbGRTdHJhdGVneSk7CisJCisJLyoqCisJICogQ2hhbmdlIG5vdGlmaWNhdGlvbiBpZGVudGlmaWVyIGZvciAiam9pblRhYmxlIiBwcm9wZXJ0eQorCSAqLworCVN0cmluZyBKT0lOX1RBQkxFX1BST1BFUlRZID0gImpvaW5UYWJsZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGpvaW4gdGFibGUgdXNlZCBpbiB0aGlzIHJlZmVyZW5jZSBvciBudWxsLiAgVGhpcyB3aWxsIGJlIHRoZSAKKwkgKiBzcGVjaWZpZWQgb3IgZGVmYXVsdCBqb2luIHRhYmxlIGlmIG9uZSBoYXMgYmVlbiBzcGVjaWZpZWQgb3IgYSBkZWZhdWx0IAorCSAqIGpvaW4gdGFibGUgYXBwbGllcywgb3RoZXJ3aXNlIG51bGwuCisJICovCisJSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgZGVmYXVsdCBuYW1lIGZvciB0aGUgSm9pblRhYmxlIGluIHRoaXMgY29udGV4dAorCSAqLworCVN0cmluZyBnZXRKb2luVGFibGVEZWZhdWx0TmFtZSgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Kb2luaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGVhYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSm9pbmluZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKKworLyoqCisgKiBSZXByZXNlbnRzIGhvdyB0aGUgaW5mb3JtYXRpb24gaW4gdHdvIGVudGl0aWVzIGFyZSBqb2luZWQgdG9nZXRoZXIgdmlhIGEgCisgKiB7QGxpbmsgUmVsYXRpb25zaGlwTWFwcGluZ30KKyAqIDxwPgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiBAc2VlIHtAbGluayBSZWxhdGlvbnNoaXBNYXBwaW5nfQorICogQHNlZSB7QGxpbmsgUmVsYXRpb25zaGlwUmVmZXJlbmNlfQorICovCitwdWJsaWMgaW50ZXJmYWNlIEpvaW5pbmdTdHJhdGVneSBleHRlbmRzIEpwYUNvbnRleHROb2RlCit7CisJLyoqCisJICogUmV0dXJuIHRoZSByZWxhdGlvbnNoaXAgcmVmZXJlbmNlIHRoYXQgb3ducyB0aGlzIHN0cmF0ZWd5CisJICovCisJUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOworCQorCS8qKgorCSAqIEFkZCB0aGlzIHN0cmF0ZWd5IHRvIHRoZSByZWxhdGlvbnNoaXAgcmVmZXJlbmNlCisJICovCisJdm9pZCBhZGRTdHJhdGVneSgpOworCQorCS8qKgorCSAqIFJlbW92ZSB0aGlzIHN0cmF0ZWd5IGZyb20gdGhlIHJlbGF0aW9uc2hpcCByZWZlcmVuY2UKKwkgKi8KKwl2b2lkIHJlbW92ZVN0cmF0ZWd5KCk7CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIG1hcHBpbmcgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBhbiBhc3NvY2lhdGlvbiBvdmVycmlkZQorCSAqLworCWJvb2xlYW4gaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9KcGFDb250ZXh0Tm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvSnBhQ29udGV4dE5vZGUuamF2YQppbmRleCBjMWNmNTNkLi4yYmRmMjY0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9KcGFDb250ZXh0Tm9kZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0pwYUNvbnRleHROb2RlLmphdmEKQEAgLTEwLDEyICsxMCwxNSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNhdGFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOwogCiAvKioKLSAqIAorICogQ29tbW9uIHByb3RvY29sIGZvciBKUEEgb2JqZWN0cyB0aGF0IGhhdmUgYSBjb250ZXh0LCBhcyBvcHBvc2VkIHRvCisgKiByZXNvdXJjZSBvYmplY3RzLgogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjMsMTUgKzI2LDM5IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhQ29udGV4dE5vZGUgZXh0ZW5kcyBKcGFOb2RlCitwdWJsaWMgaW50ZXJmYWNlIEpwYUNvbnRleHROb2RlCisJZXh0ZW5kcyBKcGFOb2RlCiB7CisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSB0eXBlIG9mIHRoZSBjb250ZXh0IG5vZGUncyByZXNvdXJjZS4KKwkgKi8KKwlKcGFSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGlmIHRoZSBjb250ZXh0IG5vZGUgaXMgd2l0aGluIGEgCisJICogcGVyc2lzdGVuY2UueG1sIGNvbnRleHQuICBPdGhlcndpc2UgcmV0dXJuIG51bGwuCisJICovCiAJUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpOwogCQogCS8qKgotCSAqIFJldHVybiB0aGUgRW50aXR5TWFwcGluZ3MgaWYgdGhpcyBjb250ZXh0Tm9kZSBpcyB3aXRoaW4gYW4gb3JtLnhtbCBjb250ZXh0Ci0JICogUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgorCSAqIFJldHVybiB0aGUgbWFwcGluZyBmaWxlIHJvb3Qgb2JqZWN0IGlmIHRoZSBjb250ZXh0IG5vZGUgaXMgd2l0aGluIGEgCisJICogbWFwcGluZyBmaWxlIGNvbnRleHQuICBPdGhlcndpc2UgcmV0dXJuIG51bGwuCiAJICovCi0JRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKTsKKwlNYXBwaW5nRmlsZVJvb3QgZ2V0TWFwcGluZ0ZpbGVSb290KCk7CiAKLQlPcm1QZXJzaXN0ZW50VHlwZSBnZXRPcm1QZXJzaXN0ZW50VHlwZSgpOworCVNjaGVtYUNvbnRhaW5lciBnZXRDb250ZXh0RGVmYXVsdERiU2NoZW1hQ29udGFpbmVyKCk7CisJCisJQ2F0YWxvZyBnZXRDb250ZXh0RGVmYXVsdERiQ2F0YWxvZygpOworCQorCVNjaGVtYSBnZXRDb250ZXh0RGVmYXVsdERiU2NoZW1hKCk7CisKKwkvKioKKwkgKiAiUG9zdCB1cGRhdGUiIGlzIGNhbGxlZCBvbmNlIHRoZSBKUEEgcHJvamVjdCAidXBkYXRlIiBpcyBjb21wbGV0ZS4KKwkgKiBXZSB1c2UgdGhpcyB0byBjYWxjdWxhdGUgKHR5cGljYWxseSBkZWZhdWx0KSBzdGF0ZSB0aGF0IGlzIGRlcGVuZGVudAorCSAqIG9uIHRoZSBlbnRpdHkgaW5oZXJpdGFuY2UgaGllcmFyY2h5IChlLmcuIGRpc2NyaW1pbmF0b3IgY29sdW1uIG5hbWUpLgorCSAqIE9mIGNvdXJzZSwgaWYgdGhlc2Ugc2V0dGluZ3MgY2hhbmdlLCB5ZXQgYW5vdGhlciAidXBkYXRlIiB3aWxsIGJlCisJICogdHJpZ2dlcmVkLCBmb2xsb3dlZCBieSB5ZXQgYW5vdGhlciAicG9zdCB1cGRhdGUiOyB1bnRpbCB0aGUgSlBBCisJICogcHJvamVjdCdzIHN0YXRlIHF1aWVzY2VzCisJICovCisJdm9pZCBwb3N0VXBkYXRlKCk7CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9KcGFSb290Q29udGV4dE5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0pwYVJvb3RDb250ZXh0Tm9kZS5qYXZhCmluZGV4IGZhNzNlZWYuLjJkYWU1YTAgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0pwYVJvb3RDb250ZXh0Tm9kZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0pwYVJvb3RDb250ZXh0Tm9kZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEyLDU4ICsxMiw1MiBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5NZXRhbW9kZWxHZW5lcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKIAogLyoqCi0gKiAKLSAqIAorICogUm9vdCBvZiB0aGUgRGFsaSBjb250ZXh0IG1vZGVsLgorICogPHA+CiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBKcGFSb290Q29udGV4dE5vZGUgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQorcHVibGljIGludGVyZmFjZSBKcGFSb290Q29udGV4dE5vZGUKKwlleHRlbmRzIEpwYUNvbnRleHROb2RlLCBNZXRhbW9kZWxHZW5lcmF0b3IKIHsKKworCS8vICoqKioqKioqKiogcGVyc2lzdGVuY2UueG1sICoqKioqKioqKioKKwogCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2VYbWwgcHJvcGVydHkKKwkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIFhNTCBwcm9wZXJ0eQorCSAqIEBzZWUgI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQogCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1hNTF9QUk9QRVJUWSA9ICJwZXJzaXN0ZW5jZVhtbCI7Ci0JCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX1BST1BFUlRZID0gInBlcnNpc3RlbmNlWG1sIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqIAotCSAqIFJldHVybiB0aGUgY29udGVudCByZXByZXNlbnRlZCBieSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgYXNzb2NpYXRlZCB3aXRoIAotCSAqIHRoaXMgcHJvamVjdC4KKwkgKiBSZXR1cm4gdGhlIGNvbnRlbnQgcmVwcmVzZW50ZWQgYnkgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4KKwkgKiBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcm9vdCBjb250ZXh0IG5vZGUncyBKUEEgcHJvamVjdC4KIAkgKiBUaGlzIG1heSBiZSBudWxsLiAKIAkgKi8KIAlQZXJzaXN0ZW5jZVhtbCBnZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQorCisKKwkvLyAqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioKKwogCS8qKgotCSAqIEFkZCBhIHBlcnNpc3RlbmNlLnhtbCBmaWxlIHRvIHRoaXMgY29udGVudCBhbmQgcmV0dXJuIHRoZSBjb250ZW50IGFzc29jaWF0ZWQKLQkgKiB3aXRoIGl0LgotCSAqIFRocm93cyB7QGxpbmsgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSBpZiBhIHBlcnNpc3RlbmNlLnhtbCBhbHJlYWR5IGV4aXN0cy4KLQkgKi8KLQlQZXJzaXN0ZW5jZVhtbCBhZGRQZXJzaXN0ZW5jZVhtbCgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgZnJvbSB0aGlzIGNvbnRlbnQuCi0JICogVGhyb3dzIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlmIGEgcGVyc2lzdGVuY2UueG1sIGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXZvaWQgcmVtb3ZlUGVyc2lzdGVuY2VYbWwoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSBjb250ZXh0IG1vZGVsIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIEpQQSBwcm9qZWN0CisJICogVXBkYXRlIHRoZSBjb250ZXh0IG1vZGVsIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIEpQQSByZXNvdXJjZSBtb2RlbC4KIAkgKi8KIAl2b2lkIHVwZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKKworCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKKwogCS8qKgotCSAqIEFsbCBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvbnMge0BsaW5rICNhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+KX0gCi0JICogc2hvdWxkIGJlIHByZWNlZGVkIGJ5IGEgInN1cGVyIiBjYWxsIHRvIHRoaXMgbWV0aG9kCisJICogQWRkIHZhbGlkYXRpb24gbWVzc2FnZXMgdG8gdGhlIHNwZWNpZmllZCBsaXN0LgogCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpOworCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpOworCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Mb2JDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L0xvYkNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODFjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Mb2JDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBMb2JDb252ZXJ0ZXIgZXh0ZW5kcyBDb252ZXJ0ZXIKK3t9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYW55VG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTWFueVRvTWFueU1hcHBpbmcuamF2YQppbmRleCA3ZmFjN2E4Li5hMmJhNGI5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYW55VG9NYW55TWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hbnlUb01hbnlNYXBwaW5nLmphdmEKQEAgLTIwLDUgKzIwLDUgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBNYW55VG9NYW55TWFwcGluZyBleHRlbmRzIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZwogewotCS8vIG5vdGhpbmcgeWV0CisJcHVibGljIE1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkNWUwNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OworCisKKy8qKgorICogUmVwcmVzZW50cyB0aGUge0BsaW5rIFJlbGF0aW9uc2hpcFJlZmVyZW5jZX0gb2YgYSB7QGxpbmsgTWFueVRvTWFueU1hcHBpbmd9CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UKKwlleHRlbmRzIE93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIEpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hbnlUb09uZU1hcHBpbmcuamF2YQppbmRleCBjMjg1NzZjLi5jMGY2YzQ2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYW55VG9PbmVNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTWFueVRvT25lTWFwcGluZy5qYXZhCkBAIC0yMCw1ICsyMCw1IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgTWFueVRvT25lTWFwcGluZyBleHRlbmRzIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKIHsKLQkvLyBub3RoaW5nIHlldAorCU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5MTUxYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CisKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSB7QGxpbmsgUmVsYXRpb25zaGlwUmVmZXJlbmNlfSBvZiBhIHtAbGluayBNYW55VG9PbmVNYXBwaW5nfQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBNYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UKKwlleHRlbmRzIFJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZjYwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBKb2luaW5nIHN0cmF0ZWd5IHRoYXQgZGVwZW5kcyBvbiBhbm90aGVyIG1hcHBpbmcgKHRoZSBvd25pbmcgc2lkZSBvZiB0aGUgCisgKiByZWxhdGlvbnNoaXApIHRvIGpvaW4gdGhlIHR3byBlbnRpdGllcy4gIFVzZXMgIm1hcHBlZEJ5IiBtZXRhLWRhdGEuCisgKiA8cD4KKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqIAorICogQHNlZSB7QGxpbmsgUmVsYXRpb25zaGlwTWFwcGluZ30KKyAqIEBzZWUge0BsaW5rIE93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2V9CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kKKwlleHRlbmRzIEpvaW5pbmdTdHJhdGVneQoreworCS8qKgorCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgYXR0cmlidXRlIHByb3BlcnR5IG9mIHRoaXMgb2JqZWN0CisJICovCisJU3RyaW5nIE1BUFBFRF9CWV9BVFRSSUJVVEVfUFJPUEVSVFkgPSAibWFwcGVkQnlBdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUgb2YgdGhpcyBvYmplY3QuICBBIG51bGwgaW5kaWNhdGVzIHRoYXQgdGhlIHJlc291cmNlCisJICogZWxlbWVudCBkb2VzIG5vdCBleGlzdAorCSAqLworCVN0cmluZyBnZXRNYXBwZWRCeUF0dHJpYnV0ZSgpOworCQorCS8qKgorCSAqIFNldCB0aGUgYXR0cmlidXRlIG9mIHRoaXMgb2JqZWN0LiAgQSBudWxsIHdpbGwgcmVzdWx0IGluIHJlbW92YWwgb2YgdGhlIAorCSAqIHJlc291cmNlIGVsZW1lbnQKKwkgKi8KKwl2b2lkIHNldE1hcHBlZEJ5QXR0cmlidXRlKFN0cmluZyBuZXdBdHRyaWJ1dGUpOworCQorCS8qKgorCSAqIFJldHVybiBhbiBpdGVyYXRvciBvZiBwb3NzaWJsZSBhdHRyaWJ1dGUgbmFtZXMgdGhhdCB0aGlzIG9iamVjdCBtaWdodCB1c2UKKwkgKi8KKwlJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHN0cmF0ZWd5J3MgcmVsYXRpb25zaGlwIGlzIG93bmVkIGJ5IHRoZSBnaXZlbiBvdGhlcgorCSAqIHJlbGF0aW9uc2hpcCBtYXBwaW5nCisJICovCisJYm9vbGVhbiByZWxhdGlvbnNoaXBJc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBvdGhlck1hcHBpbmcpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTWFwcGVkU3VwZXJjbGFzcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTWFwcGVkU3VwZXJjbGFzcy5qYXZhCmluZGV4IGFmNGVjMjUuLjhlZDBmNDYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYXBwZWRTdXBlcmNsYXNzLmphdmEKQEAgLTE4LDcgKzE4LDggQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNzIGV4dGVuZHMgVHlwZU1hcHBpbmcsIElkQ2xhc3MKK3B1YmxpYyBpbnRlcmZhY2UgTWFwcGVkU3VwZXJjbGFzcworCWV4dGVuZHMgVHlwZU1hcHBpbmcsIElkQ2xhc3NIb2xkZXIKIHsKIAkvL25vdGhpbmcgeWV0CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYXBwaW5nRmlsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTWFwcGluZ0ZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzQ5NWQyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTWFwcGluZ0ZpbGUuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbnRUeXBlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKKworLyoqCisgKiBKUEEgbWFwcGluZyBmaWxlICh0eXBpY2FsbHkgPGNvZGU+b3JtLnhtbDwvY29kZT4pLgorICogPHA+CisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBNYXBwaW5nRmlsZQorCWV4dGVuZHMgWG1sRmlsZSwgUGVyc2lzdGVudFR5cGVDb250YWluZXIKK3sKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJvb3Qgb2JqZWN0IG9mIHRoaXMgbWFwcGluZyBmaWxlCisJICovCisJTWFwcGluZ0ZpbGVSb290IGdldFJvb3QoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIFBlcnNpc3RlbnRUeXBlIGxpc3RlZCBpbiB0aGlzIG1hcHBpbmcgZmlsZQorCSAqIHdpdGggdGhlIGdpdmVuIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUuICBSZXR1cm4gbnVsbCBpZiBub25lIGV4aXN0cy4KKwkgKi8KKwlQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJLyoqCisJICogVXBkYXRlIHRoZSBNYXBwaW5nRmlsZSBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgSnBhWG1sUmVzb3VyY2UgCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCisJdm9pZCB1cGRhdGUoSnBhWG1sUmVzb3VyY2UgbWFwcGluZ0ZpbGVSZXNvdXJjZSk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyZjQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L01hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKK3sKKwlBY2Nlc3NUeXBlIGdldEFjY2VzcygpOworCQorCVN0cmluZyBnZXRDYXRhbG9nKCk7CisJCisJU3RyaW5nIGdldFNjaGVtYSgpOworCQorCWJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpOworCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGV4aXN0cyBmb3IgdGhlIE1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgb2JqZWN0CisJICogSWYgdGhlcmUgaXMgYSBub2RlIGluIHRoZSBvcm0ueG1sIGZpbGUgZm9yIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdCwgdGhpcyByZXR1cm5zIHRydWUsIG90aGVyd2lzZSBmYWxzZS4KKwkgKiBAcmV0dXJuCisJICovCisJYm9vbGVhbiByZXNvdXJjZUV4aXN0cygpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTWFwcGluZ0ZpbGVSb290LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9NYXBwaW5nRmlsZVJvb3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2VkZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTWFwcGluZ0ZpbGVSb290LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWFwcGluZ0ZpbGVSb290IGV4dGVuZHMgWG1sQ29udGV4dE5vZGUsIEpwYVN0cnVjdHVyZU5vZGUKK3sKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBhY2Nlc3MgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdAorCSAqIGFjY2Vzcy4KKwkgKi8KKwlBY2Nlc3NUeXBlIGdldEFjY2VzcygpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNhdGFsb2cgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdAorCSAqIGNhdGFsb2cuCisJICovCisJU3RyaW5nIGdldENhdGFsb2coKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzY2hlbWEgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdAorCSAqIHNjaGVtYS4KKwkgKi8KKwlTdHJpbmcgZ2V0U2NoZW1hKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBkZWZhdWx0cyBkZWZpbmVkIHdpdGhpbiB0aGlzIG1hcHBpbmcgZmlsZSAqZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ki4KKwkgKiBSZXR1cm4gbnVsbCBpZiBub25lIGV4aXN0cy4KKwkgKiBAc2VlIE1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMucmVzb3VyY2VFeGlzdHMoKQorCSAqLworCU1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L011bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKaW5kZXggZGQxMTQxYS4uZDMwZTllMiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTIsNDQgKzEyLDU3IEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiAvKioKLSAqIAotICogCisgKiBNdWx0aS12YWx1ZWQgKDE6bSwgbTptKSByZWxhdGlvbnNoaXAgbWFwcGluZy4KKyAqIDxwPgogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKICAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIGV4dGVuZHMgTm9uT3duaW5nTWFwcGluZworcHVibGljIGludGVyZmFjZSBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKKwlleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmcKIHsKIAlGZXRjaFR5cGUgREVGQVVMVF9GRVRDSF9UWVBFID0gRmV0Y2hUeXBlLkxBWlk7CiAKIAlTdHJpbmcgZ2V0T3JkZXJCeSgpOwotCXZvaWQgc2V0T3JkZXJCeShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgT1JERVJfQllfUFJPUEVSVFkgPSAib3JkZXJCeVByb3BlcnR5IjsKIAotCisJU3RyaW5nIGdldFNwZWNpZmllZE9yZGVyQnkoKTsKKwl2b2lkIHNldFNwZWNpZmllZE9yZGVyQnkoU3RyaW5nIG9yZGVyQnkpOworCQlTdHJpbmcgU1BFQ0lGSUVEX09SREVSX0JZX1BST1BFUlRZID0gInNwZWNpZmllZE9yZGVyQnkiOyAvLyROT04tTkxTLTEkCisJCiAJYm9vbGVhbiBpc05vT3JkZXJpbmcoKTsKLQl2b2lkIHNldE5vT3JkZXJpbmcoYm9vbGVhbiBuZXdOb09yZGVyaW5nKTsKLQkJU3RyaW5nIE5PX09SREVSSU5HX1BST1BFUlRZID0gIm5vT3JkZXJpbmdQcm9wZXJ0eSI7Ci0KKwl2b2lkIHNldE5vT3JkZXJpbmcoYm9vbGVhbiBub09yZGVyaW5nKTsKKwkJU3RyaW5nIE5PX09SREVSSU5HX1BST1BFUlRZID0gIm5vT3JkZXJpbmciOyAvLyROT04tTkxTLTEkCisJCiAJYm9vbGVhbiBpc1BrT3JkZXJpbmcoKTsKLQl2b2lkIHNldFBrT3JkZXJpbmcoYm9vbGVhbiBuZXdQa09yZGVyaW5nKTsKLQlTdHJpbmcgUEtfT1JERVJJTkdfUFJPUEVSVFkgPSAicGtPcmRlcmluZ1Byb3BlcnR5IjsKLQorCXZvaWQgc2V0UGtPcmRlcmluZyhib29sZWFuIHBrT3JkZXJpbmcpOworCQlTdHJpbmcgUEtfT1JERVJJTkdfUFJPUEVSVFkgPSAicGtPcmRlcmluZyI7IC8vJE5PTi1OTFMtMSQKKwkKIAlib29sZWFuIGlzQ3VzdG9tT3JkZXJpbmcoKTsKLQl2b2lkIHNldEN1c3RvbU9yZGVyaW5nKGJvb2xlYW4gbmV3Q3VzdG9tT3JkZXJpbmcpOwotCVN0cmluZyBDVVNUT01fT1JERVJJTkdfUFJPUEVSVFkgPSAiY3VzdG9tT3JkZXJpbmdQcm9wZXJ0eSI7Ci0KLQkKLQlKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCk7Ci0JCi0JYm9vbGVhbiBpc0pvaW5UYWJsZVNwZWNpZmllZCgpOworCXZvaWQgc2V0Q3VzdG9tT3JkZXJpbmcoYm9vbGVhbiBjdXN0b21PcmRlcmluZyk7CisJCVN0cmluZyBDVVNUT01fT1JERVJJTkdfUFJPUEVSVFkgPSAiY3VzdG9tT3JkZXJpbmciOyAvLyROT04tTkxTLTEkCiAKIAogCVN0cmluZyBnZXRNYXBLZXkoKTsKLQl2b2lkIHNldE1hcEtleShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgTUFQX0tFWV9QUk9QRVJUWSA9ICJtYXBLZXlQcm9wZXJ0eSI7CisKKwlTdHJpbmcgZ2V0U3BlY2lmaWVkTWFwS2V5KCk7CisJdm9pZCBzZXRTcGVjaWZpZWRNYXBLZXkoU3RyaW5nIG1hcEtleSk7CisJCVN0cmluZyBTUEVDSUZJRURfTUFQX0tFWV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRNYXBLZXkiOyAvLyROT04tTkxTLTEkCisKKwlib29sZWFuIGlzTm9NYXBLZXkoKTsKKwl2b2lkIHNldE5vTWFwS2V5KGJvb2xlYW4gbm9NYXBLZXkpOworCQlTdHJpbmcgTk9fTUFQX0tFWV9QUk9QRVJUWSA9ICJub01hcEtleSI7IC8vJE5PTi1OTFMtMSQKKwkKKwlib29sZWFuIGlzUGtNYXBLZXkoKTsKKwl2b2lkIHNldFBrTWFwS2V5KGJvb2xlYW4gcGtNYXBLZXkpOworCQlTdHJpbmcgUEtfTUFQX0tFWV9QUk9QRVJUWSA9ICJwa01hcEtleSI7IC8vJE5PTi1OTFMtMSQKKwkKKwlib29sZWFuIGlzQ3VzdG9tTWFwS2V5KCk7CisJdm9pZCBzZXRDdXN0b21NYXBLZXkoYm9vbGVhbiBjdXN0b21NYXBLZXkpOworCQlTdHJpbmcgQ1VTVE9NX01BUF9LRVlfUFJPUEVSVFkgPSAiY3VzdG9tTWFwS2V5IjsgLy8kTk9OLU5MUy0xJAogCiAJSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBLZXlOYW1lcygpOworCisJU3RyaW5nIGdldE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZU5hbWUoKTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L05hbWVkQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9OYW1lZENvbHVtbi5qYXZhCmluZGV4IGY5Y2E4MjQuLmQ5ZDUxOGEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L05hbWVkQ29sdW1uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTmFtZWRDb2x1bW4uamF2YQpAQCAtMjEsMjIgKzIxLDIzIEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWRDb2x1bW4gZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQorcHVibGljIGludGVyZmFjZSBOYW1lZENvbHVtbgorCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKIHsKIAlTdHJpbmcgZ2V0TmFtZSgpOwogCiAJU3RyaW5nIGdldERlZmF1bHROYW1lKCk7Ci0JCVN0cmluZyBERUZBVUxUX05BTUVfUFJPUEVSVFkgPSAiZGVmYXVsdE5hbWVQcm9wZXJ0eSI7CisJCVN0cmluZyBERUZBVUxUX05BTUVfUFJPUEVSVFkgPSAiZGVmYXVsdE5hbWUiOyAvLyROT04tTkxTLTEkCiAKIAlTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpOwogCXZvaWQgc2V0U3BlY2lmaWVkTmFtZShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkTmFtZVByb3BlcnR5IjsKKwkJU3RyaW5nIFNQRUNJRklFRF9OQU1FX1BST1BFUlRZID0gInNwZWNpZmllZE5hbWUiOyAvLyROT04tTkxTLTEkCiAKIAogCVN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uKCk7CiAKIAl2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIENPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZID0gImNvbHVtbkRlZmluaXRpb25Qcm9wZXJ0eSI7CisJCVN0cmluZyBDT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSA9ICJjb2x1bW5EZWZpbml0aW9uIjsgLy8kTk9OLU5MUy0xJAogCiAKIAkvKioKQEAgLTYwLDE1ICs2MSwxNCBAQAogCSAqIGludGVyZmFjZSBhbGxvd2luZyBjb2x1bW5zIHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzCiAJICogKGUuZy4gYmFzaWMgbWFwcGluZ3MgYW5kIGF0dHJpYnV0ZSBvdmVycmlkZXMpCiAJICovCi0JaW50ZXJmYWNlIE93bmVyCi0JeworCWludGVyZmFjZSBPd25lciB7CiAJCS8qKgogCQkgKiBSZXR1cm4gdGhlIHR5cGUgbWFwcGluZyB0aGF0IGNvbnRhaW5zIHRoZSBjb2x1bW4uCiAJCSAqLwogCQlUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpOwogCiAJCS8qKgotCQkgKiBSZXR1cm4gdGhlIHdyYXBwZXIgZm9yIHRoZSBkYXRhc291cmNlIHRhYmxlIGZvciB0aGUgZ2l2ZW4gdGFibGUgbmFtZQorCQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHRhYmxlIG5hbWUKIAkJICovCiAJCVRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSk7CiAJCQpAQCAtNzcsNCArNzcsNSBAQAogCQkgKi8KIAkJU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCk7CiAJfQorCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKaW5kZXggZjkzZTllZS4uYjViOTRmNSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTmFtZWROYXRpdmVRdWVyeS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L05hbWVkTmF0aXZlUXVlcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0yMiwxMCArMjIsMTYgQEAKIHsKIAlTdHJpbmcgZ2V0UmVzdWx0Q2xhc3MoKTsKIAl2b2lkIHNldFJlc3VsdENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBSRVNVTFRfQ0xBU1NfUFJPUEVSVFkgPSAicmVzdWx0Q2xhc3NQcm9wZXJ0eSI7CisJCVN0cmluZyBSRVNVTFRfQ0xBU1NfUFJPUEVSVFkgPSAicmVzdWx0Q2xhc3MiOyAvLyROT04tTkxTLTEkCiAKIAlTdHJpbmcgZ2V0UmVzdWx0U2V0TWFwcGluZygpOwogCXZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgUkVTVUxUX1NFVF9NQVBQSU5HX1BST1BFUlRZID0gInJlc3VsdFNldE1hcHBpbmdQcm9wZXJ0eSI7CisJCVN0cmluZyBSRVNVTFRfU0VUX01BUFBJTkdfUFJPUEVSVFkgPSAicmVzdWx0U2V0TWFwcGluZyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFJldHVybiB0aGUgY2hhciB0byBiZSB1c2VkIGZvciBicm93c2luZyBvciBjcmVhdGluZyB0aGUgcmVzdWx0IGNsYXNzIElUeXBlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUjZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIpCisJICovCisJY2hhciBnZXRSZXN1bHRDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTm9uT3duaW5nTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTm9uT3duaW5nTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODMwMzFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L05vbk93bmluZ01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTm9uT3duaW5nTWFwcGluZyBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQlTdHJpbmcgZ2V0TWFwcGVkQnkoKTsKLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBNQVBQRURfQllfUFJPUEVSVFkgPSAibWFwcGVkQnlQcm9wZXJ0eSI7Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQotCWJvb2xlYW4gbWFwcGVkQnlJc1ZhbGlkKEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGVkQnlNYXBwaW5nKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L051bGxhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9OdWxsYWJsZS5qYXZhCmluZGV4IGNjMjkyZjYuLmMyYWFiOTggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L051bGxhYmxlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvTnVsbGFibGUuamF2YQpAQCAtMjQsMTQgKzI0LDE0IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgTnVsbGFibGUgZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nCiB7Ci0JQm9vbGVhbiBnZXRPcHRpb25hbCgpOworCWJvb2xlYW4gaXNPcHRpb25hbCgpOwogCQotCUJvb2xlYW4gZ2V0RGVmYXVsdE9wdGlvbmFsKCk7Ci0JCVN0cmluZyBERUZBVUxUX09QVElPTkFMX1BST1BFUlRZID0gImRlZmF1bHRPcHRpb25hbFByb3BlcnR5IjsKLQkJQm9vbGVhbiBERUZBVUxUX09QVElPTkFMID0gQm9vbGVhbi5UUlVFOworCWJvb2xlYW4gaXNEZWZhdWx0T3B0aW9uYWwoKTsKKwkJU3RyaW5nIERFRkFVTFRfT1BUSU9OQUxfUFJPUEVSVFkgPSAiZGVmYXVsdE9wdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAorCQlib29sZWFuIERFRkFVTFRfT1BUSU9OQUwgPSB0cnVlOwogCQogCUJvb2xlYW4gZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKTsKIAl2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4gbmV3U3BlY2lmaWVkT3B0aW9uYWwpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZID0gInNwZWNpZmllZE9wdGlvbmFsUHJvcGVydHkiOworCQlTdHJpbmcgU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZID0gInNwZWNpZmllZE9wdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAogCQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvT25lVG9NYW55TWFwcGluZy5qYXZhCmluZGV4IDMzOWYyYjguLjg4NDQ0ZTYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L09uZVRvTWFueU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9PbmVUb01hbnlNYXBwaW5nLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBPbmVUb01hbnlNYXBwaW5nIGV4dGVuZHMgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIHsKLQkvLyBub3RoaW5nIHlldAorcHVibGljIGludGVyZmFjZSBPbmVUb01hbnlNYXBwaW5nIGV4dGVuZHMgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCit7CisJcHVibGljIE9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiZjE1OAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CisKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSB7QGxpbmsgUmVsYXRpb25zaGlwUmVmZXJlbmNlfSBvZiBhIHtAbGluayBPbmVUb01hbnlNYXBwaW5nfQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UKKwlleHRlbmRzIE93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIAorCQlKb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9PbmVUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L09uZVRvT25lTWFwcGluZy5qYXZhCmluZGV4IGM2MTYwN2YuLjk4NjM3ZjAgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L09uZVRvT25lTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L09uZVRvT25lTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMTAgKzksOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKIAotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiAKIC8qKgotICogCisgKiBPbmUtdG8tb25lIG1hcHBpbmcKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIxLDQyICsyMCwxMCBAQAogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIE9uZVRvT25lTWFwcGluZwotCWV4dGVuZHMgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZywgTm9uT3duaW5nTWFwcGluZworCWV4dGVuZHMgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwogewotCS8vICoqKioqKioqKioqKioqKiogcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KIAkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgorCSAqIGNvdmFyaWFudCBvdmVycmlkZQogCSAqLwotCTxUIGV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW4+IExpc3RJdGVyYXRvcjxUPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGpvaW4gY29sdW1ucywgYm90aCBzcGVjaWZpZWQgYW5kIGRlZmF1bHQuCi0JICovCi0JaW50IHByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQkvKioKLQkgKiBBZGQgYSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gdG8gdGhlIGpvaW4gdGFibGUgcmV0dXJuIHRoZSBvYmplY3QgCi0JICogcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gZnJvbSB0aGUgam9pbiB0YWJsZS4KLQkgKi8KLQl2b2lkIHJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gYXQgdGhlIGluZGV4IGZyb20gdGhlIGpvaW4gdGFibGUuCi0JICovCi0Jdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCi0JLyoqCi0JICogTW92ZSB0aGUgc3BlY2lmaWVkIGpvaW4gY29sdW1uIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCWJvb2xlYW4gY29udGFpbnNQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJU3RyaW5nIFBSSU1BWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QgPSAicHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdCI7Ci0KKwlPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L09uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMWZkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CisKKy8qKgorICogUmVwcmVzZW50cyB0aGUge0BsaW5rIFJlbGF0aW9uc2hpcFJlZmVyZW5jZX0gb2YgYSB7QGxpbmsgT25lVG9PbmVNYXBwaW5nfQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWV4dGVuZHMgT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UsCisJCVByaW1hcnlLZXlKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZQoreworCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTgyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9Pd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKKworCisvKioKKyAqIEFuIDxjb2RlPk93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U8L2NvZGU+IGlzIGEgdHlwZSBvZiAKKyAqIHtAbGluayBSZWxhdGlvbnNoaXBSZWZlcmVuY2V9IHRoYXQgbWF5IGJlIHRoZSBvd25lZCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuCisgKiAoaS5lLiBJdCBtYXkgdXNlIGEgIm1hcHBlZEJ5IiBqb2luaW5nIHN0cmF0ZWd5LikKKyAqIDxwPgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEBzZWUgUmVsYXRpb25zaGlwTWFwcGluZworICogQHNlZSBSZWxhdGlvbnNoaXBSZWZlcmVuY2UKKyAqLworcHVibGljIGludGVyZmFjZSBPd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlIGV4dGVuZHMgUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisJLyoqCisJICogUmV0dXJuIHRoZSBhZ2dyZWdhdGUgKG5ldmVyIG51bGwpIG9iamVjdCB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgbWFwcGVkIGJ5CisJICogam9pbmluZyBzdHJhdGVneQorCSAqLworCU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IGdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCk7CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIG1hcHBlZCBieSBqb2luaW5nIHN0cmF0ZWd5IGlzIGN1cnJlbnRseSB0aGUgcHJlZG9taW5hbnQKKwkgKiBqb2luaW5nIHN0cmF0ZWd5CisJICovCisJYm9vbGVhbiB1c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKTsKKwkKKwkvKioKKwkgKiBTZXQgdGhlIG1hcHBlZCBieSBqb2luaW5nIHN0cmF0ZWd5IGFzIHRoZSBwcmVkb21pbmFudCBqb2luaW5nIHN0cmF0ZWd5CisJICovCisJdm9pZCBzZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpOworCQorCS8qKgorCSAqIFVuc2V0IHRoZSBtYXBwZWQgYnkgam9pbmluZyBzdHJhdGVneSBhcyB0aGUgcHJlZG9taW5hbnQgam9pbmluZyBzdHJhdGVneS4KKwkgKiBUaGlzIHdpbGwgbm90IHNldCBhbnkgb3RoZXIgam9pbmluZyBzdHJhdGVneSBhcyB0aGUgcHJlZG9taW5hbnQgb25lLCBzbworCSAqIHdoaWNoZXZlciBvbmUgaXMgYWxzbyBiZWluZyB1c2VkIChpcyBzcGVjaWZpZWQpIG9yIHRoZSBkZWZhdWx0IHN0cmF0ZWd5CisJICogd2lsbCBhcHBseSBhdCB0aGF0IHBvaW50LgorCSAqLworCXZvaWQgdW5zZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpOworCQorCS8qKgorCSAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiBtYXBwaW5nIG1heSBvd24gdGhlIHJlbGF0aW9uc2hpcAorCSAqLworCWJvb2xlYW4gbWF5QmVNYXBwZWRCeShBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCmluZGV4IDRlNTIwNWYuLmRmMTk3ZjAgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1BlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTEsMjAgKzExLDIwIEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwogCi0KIC8qKgotICogCi0gKiAKKyAqIFBlcnNpc3RlbnQgImF0dHJpYnV0ZSIgKGZpZWxkIG9yIHByb3BlcnR5KQorICogPHA+CiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW50QXR0cmlidXRlIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUsIEpwYVN0cnVjdHVyZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVudEF0dHJpYnV0ZQorCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUsIEpwYVN0cnVjdHVyZU5vZGUsIEFjY2Vzc0hvbGRlcgogewogCVN0cmluZyBnZXROYW1lKCk7Ci0JCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWVQcm9wZXJ0eSI7CisJCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCiAKIAkvKioKIAkgKiBSZXR1cm4gdGhlIGtleSBmb3IgdGhlIGF0dHJpYnV0ZSdzIG1hcHBpbmcuCkBAIC00MCwxNCArNDAsMTYgQEAKIAogCS8qKgogCSAqIFJldHVybiB0aGUgYXR0cmlidXRlJ3MgInNwZWNpZmllZCIgbWFwcGluZywgb3IgaWYgaXQgaXMgbnVsbAotCSAqIHJldHVybiB0aGUgImRlZmF1bHQiIG1hcHBpbmcuICBXSWxsIG5vdCByZXR1cm4gbnVsbC4KKwkgKiByZXR1cm4gdGhlIGF0dHJpYnV0ZSdzICJkZWZhdWx0IiBtYXBwaW5nLiBEbyBub3QgcmV0dXJuIG51bGwuCiAJICovCiAJQXR0cmlidXRlTWFwcGluZyBnZXRNYXBwaW5nKCk7CisJCVN0cmluZyBERUZBVUxUX01BUFBJTkdfUFJPUEVSVFkgPSAiZGVmYXVsdE1hcHBpbmciOyAvLyROT04tTkxTLTEkCiAKIAkvKioKLQkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSdzICJzcGVjaWZpZWQiIG1hcHBpbmcsIGNvdWxkIGJlIG51bGwKKwkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSdzICJzcGVjaWZpZWQiIG1hcHBpbmcgLSBjb3VsZCBiZSBudWxsLgogCSAqLwogCUF0dHJpYnV0ZU1hcHBpbmcgZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlTdHJpbmcgU1BFQ0lGSUVEX01BUFBJTkdfUFJPUEVSVFkgPSAic3BlY2lmaWVkTWFwcGluZyI7IC8vJE5PTi1OTFMtMSQKIAkKIAkvKioKIAkgKiBDbGllbnRzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgYXR0cmlidXRlJ3MgbWFwcGluZy4KQEAgLTU1LDggKzU3LDYgQEAKIAkgKiBjbGVhcmVkIGFuZCB0aGUgYXR0cmlidXRlJ3MgbWFwcGluZyB0byBiZSBpdHMgImRlZmF1bHQiIG1hcHBpbmcuCiAJICovCiAJdm9pZCBzZXRTcGVjaWZpZWRNYXBwaW5nS2V5KFN0cmluZyBrZXkpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX01BUFBJTkdfUFJPUEVSVFkgPSAic3BlY2lmaWVkTWFwcGluZ1Byb3BlcnR5IjsKLQkJU3RyaW5nIERFRkFVTFRfTUFQUElOR19QUk9QRVJUWSA9ICJkZWZhdWx0TWFwcGluZ1Byb3BlcnR5IjsKIAkKIAlUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpOwogCkBAIC02OSwyMyArNjksMTQgQEAKIAlTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKIAogCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUncyAiYXR0cmlidXRlIiBtYXBwaW5nIGNhbiBiZSBvdmVycmlkZGVuLgotCSAqLwotCWJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSdzICJhc3NvY2lhdGlvbiIgbWFwcGluZyBjYW4gYmUgb3ZlcnJpZGRlbi4KLQkgKi8KLQlib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSdzICJhdHRyaWJ1dGUiIG1hcHBpbmcgaXMgZm9yIGFuIElELgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUncyBtYXBwaW5nIGlzIGZvciBhbiBJRC4KIAkgKi8KIAlib29sZWFuIGlzSWRBdHRyaWJ1dGUoKTsKIAkKIAkvKioKIAkgKiBSZXR1cm4gd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBhY3R1YWxseSBoYXMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uCi0JICogaW4gaXRzIHVuZGVybHlpbmcgcmVzb3VyY2UgKGZhbHNlID0gbm8pCisJICogaW4gaXRzIHVuZGVybHlpbmcgcmVzb3VyY2UgKGZhbHNlID0gbm8pLgogCSAqLwogCWJvb2xlYW4gaXNWaXJ0dWFsKCk7CisKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1BlcnNpc3RlbnRUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9QZXJzaXN0ZW50VHlwZS5qYXZhCmluZGV4IDVkNzFkMjEuLjA2OGJiMjkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1BlcnNpc3RlbnRUeXBlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUGVyc2lzdGVudFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMiw5OCArMTIsMTg0IEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuTWV0YW1vZGVsR2VuZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CiAKIC8qKgotICogCi0gKiAKKyAqIENvbnRleHQgcGVyc2lzdGVudCB0eXBlLgorICogPHA+CiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW50VHlwZSBleHRlbmRzIEpwYUNvbnRleHROb2RlLCBKcGFTdHJ1Y3R1cmVOb2RlCitwdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbnRUeXBlCisJZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZSwgSnBhU3RydWN0dXJlTm9kZSwgQWNjZXNzSG9sZGVyLCBNZXRhbW9kZWxHZW5lcmF0b3IKIHsKKworCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbnQgdHlwZSdzIFtmdWxseS1xdWFsaWZpZWRdIG5hbWUuCisJICogQHNlZSAjZ2V0U2hvcnROYW1lKCkKKwkgKi8KIAlTdHJpbmcgZ2V0TmFtZSgpOwotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOwotCQotCUFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCk7Ci0JCVN0cmluZyBBQ0NFU1NfUFJPUEVSVFkgPSAiYWNjZXNzUHJvcGVydHkiOwotCQkKKwkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFJldHVybiB0aGUgcGVyc2lzdGVudCB0eXBlJ3Mgc2hvcnQgbmFtZS4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKi8KKwlTdHJpbmcgZ2V0U2hvcnROYW1lKCk7CisKKworCS8vICoqKioqKioqKiogbWFwcGluZyAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbnQgdHlwZSdzIG1hcHBpbmcuCisJICogU2V0IHRoZSBtYXBwaW5nIHZpYSB7QGxpbmsgI3NldE1hcHBpbmdLZXkoU3RyaW5nKX0uCisJICovCiAJVHlwZU1hcHBpbmcgZ2V0TWFwcGluZygpOworCQlTdHJpbmcgTUFQUElOR19QUk9QRVJUWSA9ICJtYXBwaW5nIjsgLy8kTk9OLU5MUy0xJAorCiAJU3RyaW5nIGdldE1hcHBpbmdLZXkoKTsKKwogCXZvaWQgc2V0TWFwcGluZ0tleShTdHJpbmcga2V5KTsKLQkJU3RyaW5nIE1BUFBJTkdfUFJPUEVSVFkgPSAibWFwcGluZ1Byb3BlcnR5IjsKIAogCWJvb2xlYW4gaXNNYXBwZWQoKTsKLQkKKworCisJLy8gKioqKioqKioqKiBhdHRyaWJ1dGVzICoqKioqKioqKioKIAogCS8qKgotCSAqIFJldHVybiB0aGUgcGFyZW50IHtAbGluayBQZXJzaXN0ZW50VHlwZX0gZnJvbSB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotCSAqIElmIHRoZSBqYXZhIGluaGVyaXRhbmNlIHBhcmVudCBpcyBub3QgYSB7QGxpbmsgUGVyc2lzdGVudFR5cGV9IHRoZW4gY29udGludWUKLQkgKiB1cCB0aGUgaGllcmFyY2h5KHRoZSBKUEEgc3BlYyBhbGxvd3Mgbm9uLXBlcnNpc3RlbnQgdHlwZXMgdG8gYmUgcGFydCBvZiB0aGUgaGllcmFyY2h5LikgIAotCSAqIFJldHVybiBudWxsIGlmIHRoaXMgcGVyc2lzdGVudFR5cGUgaXMgdGhlIHJvb3QgcGVyc2lzdGVudCB0eXBlLiAKLQkgKiBFeGFtcGxlOgotCSAqIDxwcmU+Ci0JICogJiM2NDtFbnRpdHkKLQkgKiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW9kZWwge30KLQkgKiA8YT4KLQkgKiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5pbWFsIGV4dGVuZHMgTW9kZWwge30KLQkgKiA8YT4KLQkgKiAmIzY0O0VudGl0eQotCSAqIHB1YmxpYyBjbGFzcyBDYXQgZXh0ZW5kcyBBbmltYWwge30KLQkgKiA8L3ByZT4gCi0JICogCi0JICogSWYgdGhpcyBpcyB0aGUgQ2F0IEphdmFQZXJzaXN0ZW50VHlwZSB0aGVuIHBhcmVudFBlcnNpc3RlbnRUeXBlIGlzIHRoZSBNb2RlbCBKYXZhUGVyc2lzdGVudFR5cGUKLQkgKiBUaGUgcGFyZW50UGVyc2lzdGVudFR5cGUgY291bGQgYmUgZm91bmQgaW4gamF2YSBvciB4bWwuCi0JICovCi0JUGVyc2lzdGVudFR5cGUgZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKTsKLQkJU3RyaW5nIFBBUkVOVF9QRVJTSVNURU5UX1RZUEVfUFJPUEVSVFkgPSAicGFyZW50UGVyc2lzdGVudFR5cGVQcm9wZXJ0eSI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSByZWFkLW9ubHkgaXRlcmF0b3Igb2YgdGhlIGNvbnRhaW5lZCB7QGxpbmsgUGVyc2lzdGVudEF0dHJpYnV0ZX0KKwkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbnQgdHlwZSdzIHBlcnNpc3RlbnQgYXR0cmlidXRlcy4KIAkgKi8KIAk8VCBleHRlbmRzIFBlcnNpc3RlbnRBdHRyaWJ1dGU+IExpc3RJdGVyYXRvcjxUPiBhdHRyaWJ1dGVzKCk7Ci0JCisJCVN0cmluZyBBVFRSSUJVVEVTX0xJU1QgPSAiYXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKKwogCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB7QGxpbmsgUGVyc2lzdGVudEF0dHJpYnV0ZX1zIGxpc3QKLQkgKiBAcmV0dXJuCisJICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGhlIHBlcnNpc3RlbnQgdHlwZSdzIHBlcnNpc3RlbnQgYXR0cmlidXRlcy4KIAkgKi8KIAlpbnQgYXR0cmlidXRlc1NpemUoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9BVFRSSUJVVEVTX0xJU1QgPSAic3BlY2lmaWVkQXR0cmlidXRlc0xpc3QiOwotCQorCisJLyoqCisJICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgcGVyc2lzdGVudCB0eXBlJ3MgcGVyc2lzdGVudCBhdHRyaWJ1dGVzLgorCSAqLwogCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMoKTsKIAogCS8qKgotCSAqIFJldHVybiBhIHJlYWQtb25seSBpdGVyYXRvciBvZiB0aGUgYWxsIHRoZSB7QGxpbmsgUGVyc2lzdGVudEF0dHJpYnV0ZX1zCi0JICogaW4gdGhlIGhpZXJhcmNoeQorCSAqIFJldHVybiBhbGwgdGhlIHBlcnNpc3RlbnQgYXR0cmlidXRlcyBpbiB0aGUgcGVyc2lzdGVudCB0eXBlJ3MKKwkgKiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCiAJICovCiAJSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsQXR0cmlidXRlcygpOwogCisJLyoqCisJICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHBlcnNpc3RlbnQgYXR0cmlidXRlcyBpbiB0aGUKKwkgKiBwZXJzaXN0ZW50IHR5cGUncyBoaWVyYXJjaHkuCisJICovCiAJSXRlcmF0b3I8U3RyaW5nPiBhbGxBdHRyaWJ1dGVOYW1lcygpOwogCiAJLyoqCi0JICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUgbmFtZWQgPGNvZGU+YXR0cmlidXRlTmFtZTwvY29kZT4gaWYKLQkgKiBpdCBleGlzdHMgbG9jYWxseSBvbiB0aGlzIHR5cGUKKwkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbnQgYXR0cmlidXRlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLAorCSAqIGlmIGl0IGV4aXN0cyBsb2NhbGx5IG9uIHRoZSBwZXJzaXN0ZW50IHR5cGUgKGFzIG9wcG9zZWQgdG8gaW4gaXRzCisJICogaW5oZXJpdGFuY2UgaGllcmFyY2h5KS4KIAkgKi8KIAlQZXJzaXN0ZW50QXR0cmlidXRlIGdldEF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKIAogCS8qKgotCSAqIFJlc29sdmUgYW5kIHJldHVybiB0aGUgYXR0cmlidXRlIG5hbWVkIDxjb2RlPmF0dHJpYnV0ZU5hbWU8L2NvZGU+IGlmIGl0Ci0JICogaXMgZGlzdGluY3QgYW5kIGV4aXN0cyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpcyB0eXBlCisJICogUmVzb2x2ZSBhbmQgcmV0dXJuIHRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgaWYgaXQKKwkgKiBpcyBkaXN0aW5jdCBhbmQgZXhpc3RzIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgcGVyc2lzdGVudCB0eXBlLgogCSAqLwogCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb2x2ZUF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSk7CiAKKworCS8vICoqKioqKioqKiogaW5oZXJpdGFuY2UgKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIHRoZSAic3VwZXIiIHtAbGluayBQZXJzaXN0ZW50VHlwZX0gZnJvbSB0aGUgInBlcnNpc3RlbmNlIgorCSAqIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKwkgKiBJZiB0aGUgSmF2YSBpbmhlcml0YW5jZSBwYXJlbnQgaXMgbm90IGEge0BsaW5rIFBlcnNpc3RlbnRUeXBlfSwgdGhlbiBjb250aW51ZQorCSAqIHVwIHRoZSBoaWVyYXJjaHkgKHRoZSBKUEEgc3BlYyBhbGxvd3Mgbm9uLXBlcnNpc3RlbnQgdHlwZXMgdG8gYmUgcGFydCBvZiB0aGUgaGllcmFyY2h5LikKKwkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHBlcnNpc3RlbnQgdHlwZSBpcyB0aGUgcm9vdCBwZXJzaXN0ZW50IHR5cGUuCisJICogPHA+CisJICogRXhhbXBsZToKKwkgKiA8cHJlPgorCSAqICYjNjQ7RW50aXR5CisJICogcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZGVsIHt9CisJICogCisJICogcHVibGljIGFic3RyYWN0IGNsYXNzIEFuaW1hbCBleHRlbmRzIE1vZGVsIHt9CisJICogCisJICogJiM2NDtFbnRpdHkKKwkgKiBwdWJsaWMgY2xhc3MgQ2F0IGV4dGVuZHMgQW5pbWFsIHt9CisJICogPC9wcmU+CisJICogVGhlICJzdXBlciIgcGVyc2lzdGVudCB0eXBlIG9mIHRoZSA8Y29kZT5DYXQ8L2NvZGU+IHBlcnNpc3RlbnQgdHlwZSBpcworCSAqIHRoZSA8Y29kZT5Nb2RlbDwvY29kZT4gcGVyc2lzdGVudCB0eXBlLiBUaGUgInN1cGVyIiBwZXJzaXN0ZW50IHR5cGUgY2FuCisJICogYmUgZWl0aGVyIGEgSmF2YSBhbm5vdGF0ZWQgY2xhc3Mgb3IgZGVjbGFyZWQgaW4gdGhlIFhNTCBmaWxlcy4KKwkgKi8KKwlQZXJzaXN0ZW50VHlwZSBnZXRTdXBlclBlcnNpc3RlbnRUeXBlKCk7CisJCVN0cmluZyBTVVBFUl9QRVJTSVNURU5UX1RZUEVfUFJPUEVSVFkgPSAic3VwZXJQZXJzaXN0ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFJldHVybiB0aGUgcGVyc2lzdGVudCB0eXBlJ3MgInBlcnNpc3RlbmNlIiBpbmhlcml0YW5jZSBoaWVyYXJjaHksCisJICogPGVtPmluY2x1ZGluZzwvZW0+IHRoZSBwZXJzaXN0ZW50IHR5cGUgaXRzZWxmLgorCSAqIFRoZSByZXR1cm5lZCBpdGVyYXRvciB3aWxsIHJldHVybiBlbGVtZW50cyBpbmZpbml0ZWx5IGlmIHRoZSBoaWVyYXJjaHkKKwkgKiBoYXMgYSBsb29wLgorCSAqLwogCUl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlPiBpbmhlcml0YW5jZUhpZXJhcmNoeSgpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIHRoZSBwZXJzaXN0ZW50IHR5cGUncyAicGVyc2lzdGVuY2UiIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwKKwkgKiA8ZW0+ZXhjbHVkaW5nPC9lbT4gdGhlIHBlcnNpc3RlbnQgdHlwZSBpdHNlbGYuCisJICogVGhlIHJldHVybmVkIGl0ZXJhdG9yIHdpbGwgcmV0dXJuIGVsZW1lbnRzIGluZmluaXRlbHkgaWYgdGhlIGhpZXJhcmNoeQorCSAqIGhhcyBhIGxvb3AuCisJICovCisJSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IGFuY2VzdG9ycygpOworCisKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgogCiAJLyoqCiAJICogQWRkIHRvIHRoZSBsaXN0IG9mIGN1cnJlbnQgdmFsaWRhdGlvbiBtZXNzYWdlcwogCSAqLwotCXZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcyk7CisJdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKTsKKworCisJLy8gKioqKioqKioqKiBvd25lciAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGFjY2VzcyB0eXBlIHRoYXQgb3ZlcnJpZGVzIHRoZSBjbGllbnQgcGVyc2lzdGVudCB0eXBlJ3MKKwkgKiBhY2Nlc3MgdHlwZTsgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCBhY2Nlc3Mgb3ZlcnJpZGUuCisJICovCisJQWNjZXNzVHlwZSBnZXRPd25lck92ZXJyaWRlQWNjZXNzKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGNsaWVudCBwZXJzaXN0ZW50IHR5cGUncyBkZWZhdWx0IGFjY2VzcyB0eXBlOworCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2ggYWNjZXNzIGRlZmF1bHQuCisJICovCisJQWNjZXNzVHlwZSBnZXRPd25lckRlZmF1bHRBY2Nlc3MoKTsKKworCisJLy8gKioqKioqKioqKiBvd25lciBpbnRlcmZhY2UgKioqKioqKioqKgorCisJaW50ZXJmYWNlIE93bmVyCisJCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKKwl7CisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIGFjY2VzcyB0eXBlIHRoYXQgb3ZlcnJpZGVzIHRoZSBjbGllbnQgcGVyc2lzdGVudCB0eXBlJ3MKKwkJICogYWNjZXNzIHR5cGU7IDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2ggYWNjZXNzIG92ZXJyaWRlCisJCSAqLworCQlBY2Nlc3NUeXBlIGdldE92ZXJyaWRlUGVyc2lzdGVudFR5cGVBY2Nlc3MoKTsKKworCQkvKioKKwkJICogUmV0dXJuIHRoZSBjbGllbnQgcGVyc2lzdGVudCB0eXBlJ3MgZGVmYXVsdCBhY2Nlc3MgdHlwZTsKKwkJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCBhY2Nlc3MgZGVmYXVsdC4KKwkJICovCisJCUFjY2Vzc1R5cGUgZ2V0RGVmYXVsdFBlcnNpc3RlbnRUeXBlQWNjZXNzKCk7CisKKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1ByaW1hcnlLZXlKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4NTJlOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1ByaW1hcnlLZXlKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CisKKy8qKgorICogQSA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U8L2NvZGU+IGlzIGEgdHlwZSBvZiAKKyAqIHtAbGluayBSZWxhdGlvbnNoaXBSZWZlcmVuY2V9IHRoYXQgbWF5IHV0aWxpemUgYSAKKyAqIHtAbGluayBQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneX0KKyAqIDxwPgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcKKyAqIEBzZWUgUmVsYXRpb25zaGlwUmVmZXJlbmNlCisgKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCisJZXh0ZW5kcyBSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGFnZ3JlZ2F0ZSAobmV2ZXIgbnVsbCkgb2JqZWN0IHVzZWQgdG8gY29uZmlndXJlIHRoZSBwcmltYXJ5CisJICoga2V5IGpvaW4gY29sdW1uIGpvaW5pbmcgc3RyYXRlZ3kKKwkgKi8KKwlQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBqb2luaW5nIHN0cmF0ZWd5IGlzIGN1cnJlbnRseSAKKwkgKiB0aGUgcHJlZG9taW5hbnQgam9pbmluZyBzdHJhdGVneQorCSAqLworCWJvb2xlYW4gdXNlc1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCisJLyoqCisJICogU2V0IHRoZSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBqb2luaW5nIHN0cmF0ZWd5IGFzIHRoZSBwcmVkb21pbmFudCAKKwkgKiBqb2luaW5nIHN0cmF0ZWd5CisJICovCisJdm9pZCBzZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQorCS8qKgorCSAqIFVuc2V0IHRoZSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBqb2luaW5nIHN0cmF0ZWd5IGFzIHRoZSBwcmVkb21pbmFudCAKKwkgKiBqb2luaW5nIHN0cmF0ZWd5LgorCSAqIFRoaXMgd2lsbCBub3Qgc2V0IGFueSBvdGhlciBqb2luaW5nIHN0cmF0ZWd5IGFzIHRoZSBwcmVkb21pbmFudCBvbmUsIHNvCisJICogd2hpY2hldmVyIG9uZSBpcyBhbHNvIGNvbmZpZ3VyZWQgKGlzIHNwZWNpZmllZCkgb3IgdGhlIGRlZmF1bHQgc3RyYXRlZ3kKKwkgKiB3aWxsIGFwcGx5IGF0IHRoYXQgcG9pbnQuCisJICovCisJdm9pZCB1bnNldFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhpcyByZWZlcmVuY2UgbWF5IHBvdGVudGlhbGx5IGhhdmUgYSBkZWZhdWx0IHByaW1hcnkga2V5CisJICogam9pbiBjb2x1bW4uCisJICovCisJYm9vbGVhbiBtYXlIYXZlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9QcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDZhNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKworCisvKioKKyAqIEpvaW5pbmcgc3RyYXRlZ3kgdGhhdCB1c2VzIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucworICogPHA+CisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKiAKKyAqIEBzZWUge0BsaW5rIFJlbGF0aW9uc2hpcE1hcHBpbmd9CisgKiBAc2VlIHtAbGluayBQcmltYXJ5S2V5Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2V9CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kKKwlleHRlbmRzIEpvaW5pbmdTdHJhdGVneQoreworCS8qKgorCSAqIENoYW5nZSBub3RpZmljYXRpb24gaWRlbnRpZmllciBmb3IgInByaW1hcnlLZXlKb2luQ29sdW1ucyIgbGlzdAorCSAqLworCVN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCA9ICJwcmltYXJ5S2V5Sm9pbkNvbHVtbnMiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zLgorCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KKwkgKi8KKwk8VCBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBMaXN0SXRlcmF0b3I8VD4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygam9pbiBjb2x1bW5zLCBib3RoIHNwZWNpZmllZCBhbmQgZGVmYXVsdC4KKwkgKi8KKwlpbnQgcHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOworCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgaGFzIGFueSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMuCisJICogKEVxdWl2YWxlbnQgdG8ge0BsaW5rICNwcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCl9ID09IDApCisJICovCisJYm9vbGVhbiBoYXNQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkKKwkvKioKKwkgKiBBZGQgYSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gdG8gdGhlIGpvaW4gdGFibGUgcmV0dXJuIHRoZSBvYmplY3QgCisJICogcmVwcmVzZW50aW5nIGl0LgorCSAqLworCVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7CisJCisJLyoqCisJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gZnJvbSB0aGUgam9pbiB0YWJsZS4KKwkgKi8KKwl2b2lkIHJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7CisJCisJLyoqCisJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gYXQgdGhlIGluZGV4IGZyb20gdGhlIGpvaW4gdGFibGUuCisJICovCisJdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbik7CisJCisJLyoqCisJICogTW92ZSB0aGUgc3BlY2lmaWVkIGpvaW4gY29sdW1uIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgorCSAqLworCXZvaWQgbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1F1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9RdWVyeS5qYXZhCmluZGV4IGJjMzY3ZjkuLmViOTY0ZmQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1F1ZXJ5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUXVlcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0yMCwxMSArMjAsMTUgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBRdWVyeSBleHRlbmRzIEpwYUNvbnRleHROb2RlCitwdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5CisJZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQogeworCVN0cmluZyBOQU1FRF9RVUVSWT0ibmFtZWRRdWVyeSI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgTkFNRURfTkFUSVZFX1FVRVJZPSJuYW1lZE5hdGl2ZVF1ZXJ5IjsgLy8kTk9OLU5MUy0xJAorCQogCS8vICoqKioqKioqKioqKioqKiogbmFtZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkKLQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOworCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCiAJCiAJU3RyaW5nIGdldE5hbWUoKTsKIAkKQEAgLTMzLDcgKzM3LDcgQEAKIAkKIAkvLyoqKioqKioqKioqKioqKioqKioqKioqKiBxdWVyeSAqKioqKioqKioqKioqKioqKioqKioqKgogCQotCVN0cmluZyBRVUVSWV9QUk9QRVJUWSA9ICJxdWVyeVByb3BlcnR5IjsKKwlTdHJpbmcgUVVFUllfUFJPUEVSVFkgPSAicXVlcnkiOyAvLyROT04tTkxTLTEkCiAJCiAJU3RyaW5nIGdldFF1ZXJ5KCk7CiAJCkBAIC00Miw3ICs0Niw3IEBACiAJCiAJLy8qKioqKioqKioqKioqKioqKioqKioqKiogaGludHMgKioqKioqKioqKioqKioqKioqKioqKioKIAkKLQlTdHJpbmcgSElOVFNfTElTVCA9ICJoaW50c0xpc3QiOworCVN0cmluZyBISU5UU19MSVNUID0gImhpbnRzIjsgLy8kTk9OLU5MUy0xJAogCQogCS8qKgogCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIGhpbnRzLiAgVGhpcyB3aWxsIG5vdCBiZSBudWxsLgpAQCAtNzgsOSArODIsMTYgQEAKIAkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJCiAJLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBxdWVyeSBvdmVycmlkZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIHNwZWNpZmllZAotCSAqIHF1ZXJ5Ci0JICogKGZvciBleGFtcGxlLCBhIHF1ZXJ5IGRlZmluZWQgaW4gb3JtLnhtbCBvdmVycmlkZXMgb25lIGRlZmluZWQgaW4gamF2YSkKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgcXVlcnkgb3ZlcnJpZGVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBnaXZlbiBxdWVyeQorCSAqIChlLmcuIGEgcXVlcnkgZGVmaW5lZCBpbiBvcm0ueG1sIG92ZXJyaWRlcyBvbmUgZGVmaW5lZCBpbiBqYXZhKS4KIAkgKi8KIAlib29sZWFuIG92ZXJyaWRlcyhRdWVyeSBxdWVyeSk7CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHF1ZXJ5IGlzIGEgZHVwbGljYXRlIG9mIHRoZSBnaXZlbiBxdWVyeS4KKwkgKiBBIHF1ZXJ5IGlzIG5vdCBhIGR1cGxpY2F0ZSBvZiBhbm90aGVyIHF1ZXJ5IGlmIGlzIHRoZSBzYW1lIGV4YWN0IHF1ZXJ5LAorCSAqIGlmIGl0IGlzIGEgbmFtZWxlc3MgcXVlcnkgKHdoaWNoIGlzIGFuIGVycm9yIGNvbmRpdGlvbiksIG9yIGlmIGl0IG92ZXJyaWRlcyAKKwkgKiBvciBpcyBvdmVycmlkZGVuIGJ5IHRoZSBvdGhlciBxdWVyeS4gCisJICovCisJYm9vbGVhbiBkdXBsaWNhdGVzKFF1ZXJ5IHF1ZXJ5KTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1F1ZXJ5Q29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9RdWVyeUNvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YTljYjYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9RdWVyeUNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUXVlcnlDb250YWluZXIKKwlleHRlbmRzIEpwYUNvbnRleHROb2RlCit7CisKKwkvLyAqKioqKioqKioqIG5hbWVkIHF1ZXJpZXMgKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgbmFtZWQgcXVlcmllcy4KKwkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCisJICovCisJPFQgZXh0ZW5kcyBOYW1lZFF1ZXJ5PiBMaXN0SXRlcmF0b3I8VD4gbmFtZWRRdWVyaWVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBuYW1lZCBxdWVyaWVzLgorCSAqLworCWludCBuYW1lZFF1ZXJpZXNTaXplKCk7CisKKwkvKioKKwkgKiBBZGQgYSBuYW1lZCBxdWVyeSB0byB0aGUgZW50aXR5IHJldHVybiB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyBpdC4KKwkgKi8KKwlOYW1lZFF1ZXJ5IGFkZE5hbWVkUXVlcnkoaW50IGluZGV4KTsKKworCS8qKgorCSAqIFJlbW92ZSB0aGUgbmFtZWQgcXVlcnkgYXQgdGhlIGluZGV4IGZyb20gdGhlIGVudGl0eS4KKwkgKi8KKwl2b2lkIHJlbW92ZU5hbWVkUXVlcnkoaW50IGluZGV4KTsKKworCS8qKgorCSAqIFJlbW92ZSB0aGUgbmFtZWQgcXVlcnkgYXQgZnJvbSB0aGUgZW50aXR5LgorCSAqLworCXZvaWQgcmVtb3ZlTmFtZWRRdWVyeShOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkpOworCisJLyoqCisJICogTW92ZSB0aGUgbmFtZWQgcXVlcnkgZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCisJICovCisJdm9pZCBtb3ZlTmFtZWRRdWVyeShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7CisKKwlTdHJpbmcgTkFNRURfUVVFUklFU19MSVNUID0gIm5hbWVkUXVlcmllcyI7IC8vJE5PTi1OTFMtMSQKKworCisJLy8gKioqKioqKioqKiBuYW1lZCBuYXRpdmUgcXVlcmllcyAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBzcGVjaWZpZWQgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuCisJICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgorCSAqLworCTxUIGV4dGVuZHMgTmFtZWROYXRpdmVRdWVyeT4gTGlzdEl0ZXJhdG9yPFQ+IG5hbWVkTmF0aXZlUXVlcmllcygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuCisJICovCisJaW50IG5hbWVkTmF0aXZlUXVlcmllc1NpemUoKTsKKworCS8qKgorCSAqIEFkZCBhIG5hbWVkIG5hdGl2ZSBxdWVyeSB0byB0aGUgZW50aXR5IHJldHVybiB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyBpdC4KKwkgKi8KKwlOYW1lZE5hdGl2ZVF1ZXJ5IGFkZE5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4KTsKKworCS8qKgorCSAqIFJlbW92ZSB0aGUgbmFtZWQgbmF0aXZlIHF1ZXJ5IGF0IHRoZSBpbmRleCBmcm9tIHRoZSBlbnRpdHkuCisJICovCisJdm9pZCByZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCk7CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIG5hbWVkIG5hdGl2ZSBxdWVyeSBhdCBmcm9tIHRoZSBlbnRpdHkuCisJICovCisJdm9pZCByZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSk7CisKKwkvKioKKwkgKiBNb3ZlIHRoZSBuYW1lZCBuYXRpdmUgcXVlcnkgZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCisJICovCisJdm9pZCBtb3ZlTmFtZWROYXRpdmVRdWVyeShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7CisKKwlTdHJpbmcgTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCA9ICJuYW1lZE5hdGl2ZVF1ZXJpZXMiOyAvLyROT04tTkxTLTEkCisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1F1ZXJ5SGludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUXVlcnlIaW50LmphdmEKaW5kZXggYTRmNTFjOC4uYzdlOWFlNyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUXVlcnlIaW50LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUXVlcnlIaW50LmphdmEKQEAgLTIzLDEwICsyMywxMCBAQAogCiAJU3RyaW5nIGdldE5hbWUoKTsKIAl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZVByb3BlcnR5IjsKKwkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKIAogCVN0cmluZyBnZXRWYWx1ZSgpOwogCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlUHJvcGVydHkiOworCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCiAJCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9RdWVyeUhvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUXVlcnlIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdmMDE4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9RdWVyeUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUXVlcnlIb2xkZXIgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIG5hbWVkIHF1ZXJpZXMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCTxUIGV4dGVuZHMgTmFtZWRRdWVyeT4gTGlzdEl0ZXJhdG9yPFQ+IG5hbWVkUXVlcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbmFtZWQgcXVlcmllcy4KLQkgKi8KLQlpbnQgbmFtZWRRdWVyaWVzU2l6ZSgpOwotCi0JLyoqCi0JICogQWRkIGEgbmFtZWQgcXVlcnkgdG8gdGhlIGVudGl0eSByZXR1cm4gdGhlIG9iamVjdCByZXByZXNlbnRpbmcgaXQuCi0JICovCi0JTmFtZWRRdWVyeSBhZGROYW1lZFF1ZXJ5KGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIG5hbWVkIHF1ZXJ5IGF0IHRoZSBpbmRleCBmcm9tIHRoZSBlbnRpdHkuCi0JICovCi0Jdm9pZCByZW1vdmVOYW1lZFF1ZXJ5KGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIG5hbWVkIHF1ZXJ5IGF0IGZyb20gdGhlIGVudGl0eS4KLQkgKi8KLQl2b2lkIHJlbW92ZU5hbWVkUXVlcnkoTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5KTsKLQotCS8qKgotCSAqIE1vdmUgdGhlIG5hbWVkIHF1ZXJ5IGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZU5hbWVkUXVlcnkoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JU3RyaW5nIE5BTUVEX1FVRVJJRVNfTElTVCA9ICJuYW1lZFF1ZXJpZXNMaXN0IjsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIHNwZWNpZmllZCBuYW1lZCBuYXRpdmUgcXVlcmllcy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JPFQgZXh0ZW5kcyBOYW1lZE5hdGl2ZVF1ZXJ5PiBMaXN0SXRlcmF0b3I8VD4gbmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBuYW1lZCBuYXRpdmUgcXVlcmllcy4KLQkgKi8KLQlpbnQgbmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpOwotCi0JLyoqCi0JICogQWRkIGEgbmFtZWQgbmF0aXZlIHF1ZXJ5IHRvIHRoZSBlbnRpdHkgcmV0dXJuIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCU5hbWVkTmF0aXZlUXVlcnkgYWRkTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBuYW1lZCBuYXRpdmUgcXVlcnkgYXQgdGhlIGluZGV4IGZyb20gdGhlIGVudGl0eS4KLQkgKi8KLQl2b2lkIHJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgbmFtZWQgbmF0aXZlIHF1ZXJ5IGF0IGZyb20gdGhlIGVudGl0eS4KLQkgKi8KLQl2b2lkIHJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5KTsKLQotCS8qKgotCSAqIE1vdmUgdGhlIG5hbWVkIG5hdGl2ZSBxdWVyeSBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCVN0cmluZyBOQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUID0gIm5hbWVkTmF0aXZlUXVlcmllc0xpc3QiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1JlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1JlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQppbmRleCBlNDE2NGRkLi45NmUwYjk5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9SZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMTcgKzksMzUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKIC8qKgotICogCi0gKiAKKyAqIFJlbGF0aW9uc2hpcCAoMToxLCAxOm0sIG06MSwgbTptKSBtYXBwaW5nLgorICogPHA+CiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBSZWxhdGlvbnNoaXBNYXBwaW5nIGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZywgRmV0Y2hhYmxlCitwdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcE1hcHBpbmcKKwlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcsIEZldGNoYWJsZQogeworCS8qKgorCSAqIFJldHVybiB0aGUgbWV0YS1pbmZvcm1hdGlvbiB1c2VkIHRvIHBvcHVsYXRlIHRoZSBlbnRpdGllcyBvZiB0aGUgCisJICogcmVsYXRpb25zaGlwCisJICovCisJUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOworCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtYXBwaW5nIGlzIHRoZSBvd25pbmcgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLgorCSAqIEVpdGhlciB0aGlzIGlzIGEgdW5pZGlyZWN0aW9uYWwgbWFwcGluZyBvciBpdCBpcyB0aGUgb3duaW5nIHNpZGUgb2YgYQorCSAqIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwLiBJZiBiaWRpcmVjdGlvbmFsLCB0aGUgb3duaW5nIHNpZGUgaXMgdGhlCisJICogc2lkZSB0aGF0IGRvZXMgbm90IHNwZWNpZnkgJ21hcHBlZEJ5Jy4gVGhlIG93bmluZyBzaWRlIGlzIHRoZSBzaWRlIHdoZXJlCisJICogdGhlIGpvaW4gdGFibGUgd291bGQgYmUgc3BlY2lmaWVkCisJICovCisJYm9vbGVhbiBpc1JlbGF0aW9uc2hpcE93bmVyKCk7CisKIAogCS8vICoqKioqKioqKioqKioqKiogdGFyZ2V0IGVudGl0eSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQpAQCAtMjcsMzYgKzQ1LDI3IEBACiAKIAlTdHJpbmcgZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCk7CiAJdm9pZCBzZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZID0gInNwZWNpZmllZFRhcmdldEVudGl0eVByb3BlcnR5IjsKKwkJU3RyaW5nIFNQRUNJRklFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZID0gInNwZWNpZmllZFRhcmdldEVudGl0eSI7IC8vJE5PTi1OTFMtMSQKIAogCVN0cmluZyBnZXREZWZhdWx0VGFyZ2V0RW50aXR5KCk7Ci0JCVN0cmluZyBERUZBVUxUX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFkgPSAiZGVmYXVsdFRhcmdldEVudGl0eVByb3BlcnR5IjsKKwkJU3RyaW5nIERFRkFVTFRfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSA9ICJkZWZhdWx0VGFyZ2V0RW50aXR5IjsgLy8kTk9OLU5MUy0xJAogCiAJRW50aXR5IGdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCVN0cmluZyBSRVNPTFZFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZID0gInJlc29sdmVkVGFyZ2V0RW50aXR5UHJvcGVydHkiOworCQlTdHJpbmcgUkVTT0xWRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSA9ICJyZXNvbHZlZFRhcmdldEVudGl0eSI7IC8vJE5PTi1OTFMtMSQKIAkKIAkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICd0YXJnZXRFbnRpdHknIGlzIHZhbGlkLgorCSAqIFJldHVybiBhbGwgYXR0cmlidXRlIG5hbWVzIG9uIHRoZSB0YXJnZXQgZW50aXR5LCBwcm92aWRlZCB0YXJnZXQgZW50aXR5CisJICogcmVzb2x2ZXMKIAkgKi8KLQlib29sZWFuIHRhcmdldEVudGl0eUlzVmFsaWQoU3RyaW5nIHRhcmdldEVudGl0eSk7Ci0KKwlJdGVyYXRvcjxTdHJpbmc+IGFsbFRhcmdldEVudGl0eUF0dHJpYnV0ZU5hbWVzKCk7CiAJCisJLyoqCisJICogUmV0dXJuIHRoZSBjaGFyIHRvIGJlIHVzZWQgZm9yIGJyb3dzaW5nIG9yIGNyZWF0aW5nIHRoZSB0YXJnZXQgZW50aXR5IElUeXBlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUjZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIpCisJICovCisJY2hhciBnZXRUYXJnZXRFbnRpdHlFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7CisJCQogCS8vICoqKioqKioqKioqKioqKiogY2FzY2FkZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAJQ2FzY2FkZSBnZXRDYXNjYWRlKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgRW50aXR5IHRoYXQgb3ducyB0aGlzIHJlbGF0aW9uc2hpcCBtYXBwaW5nCi0JICogQHJldHVybgotCSAqLwotCUVudGl0eSBnZXRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbWFwcGluZyBpcyB0aGUgb3duaW5nIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC4KLQkgKiBFaXRoZXIgdGhpcyBpcyBhIHVuaWRpcmVjdGlvbmFsIG1hcHBpbmcgb3IgaXQgaXMgdGhlIG93bmluZyBzaWRlIG9mIGEgYmlkaXJlY3Rpb25hbAotCSAqIHJlbGF0aW9uc2hpcC4gIElmIGJpZGlyZWN0aW9uYWwsIHRoZSBvd25pbmcgc2lkZSBpcyB0aGUgc2lkZSB0aGF0IGRvZXNuJ3Qgc3BlY2lmeQotCSAqIG1hcHBlZEJ5LiAgVGhpcyBpcyB0aGUgc2lkZSB3aGVyZSBhIGpvaW4gdGFibGUgd291bGQgYmUgc3BlY2lmaWVkCi0JICovCi0JYm9vbGVhbiBpc1JlbGF0aW9uc2hpcE93bmVyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9SZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzE2M2FiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKKworLyoqCisgKiBBIDxjb2RlPlJlbGF0aW9uc2hpcFJlZmVyZW5jZTwvY29kZT4gcmVwcmVzZW50cyB0aGUgbWV0YS1pbmZvcm1hdGlvbiByZXF1aXJlZCAKKyAqIHRvIHBvcHVsYXRlIHRoZSBlbnRpdGllcyBpbnZvbHZlZCBpbiBhIDxjb2RlPlJlbGF0aW9uc2hpcE1hcHBpbmc8L2NvZGU+LiBUaGlzIAorICogbWlnaHQgaW5jbHVkZXMgam9pbiB0YWJsZSBpbmZvcm1hdGlvbiwgam9pbiBjb2x1bW4gaW5mb3JtYXRpb24sIGFuZC9vciAKKyAqICJtYXBwZWRCeSIgaW5mb3JtYXRpb24sIHRvIG5hbWUgYSBmZXcuCisgKiA8cD4KKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcKKyAqLworcHVibGljIGludGVyZmFjZSBSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQoreworCVJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBUeXBlTWFwcGluZyB0aGF0IG93bnMgdGhpcyByZWxhdGlvbnNoaXAgcmVmZXJlbmNlCisJICovCisJVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGVudGl0eSB0aGF0IG93bnMgdGhlIHJlbGF0aW9uc2hpcCBtYXBwaW5nLiBUaGlzIGlzCisJICoganVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNhbGxzIGdldFR5cGVNYXBwaW5nKCkgYW5kIHJldHVybnMKKwkgKiBudWxsIGlmIGl0IGlzIG5vdCBhbiBFbnRpdHkKKwkgKi8KKwlFbnRpdHkgZ2V0RW50aXR5KCk7CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhpcyBpcyB0aGUgb3duaW5nIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC4KKwkgKiBAc2VlIHtAbGluayBSZWxhdGlvbnNoaXBNYXBwaW5nI2lzUmVsYXRpb25zaGlwT3duZXIoKX0KKwkgKi8KKwlib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG1hcHBpbmcgaXMgdGhlIG93bmluZyBzaWRlIG9mIGEgcmVsYXRpb25zaGlwCisJICogd2l0aCB0aGlzIHJlbGF0aW9uc2hpcCByZWZlcmVuY2UKKwkgKi8KKwlib29sZWFuIGlzT3duZWRCeShSZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmcpOworCQorCS8qKgorCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcHJlZG9taW5hbnQgc3RyYXRlZ3kgcHJvcGVydHkKKwkgKi8KKwlmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRURPTUlOQU5UX0pPSU5JTkdfU1RSQVRFR1lfUFJPUEVSVFkgPSAKKwkJInByZWRvbWluYW50U3RyYXRlZ3kiOyAgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFJldHVybiB0aGUgcHJlZG9taW5hbnQgam9pbmluZyBzdHJhdGVneSwgdGhpcyBzaG91bGQgbm90IGJlIG51bGwKKwkgKi8KKwlKb2luaW5nU3RyYXRlZ3kgZ2V0UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWFwcGluZyBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIGFuIGFzc29jaWF0aW9uIG92ZXJyaWRlCisJICovCisJYm9vbGVhbiBpc092ZXJyaWRhYmxlQXNzb2NpYXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGFyZW50IG9mIHRoaXMgcmVsYXRpb25zaGlwIHJlZmVyZW5jZSBpcyB2aXJ0dWFsCisJICogQHJldHVybgorCSAqLworCWJvb2xlYW4gaXNQYXJlbnRWaXJ0dWFsKCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1NlY29uZGFyeVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9TZWNvbmRhcnlUYWJsZS5qYXZhCmluZGV4IGY2MGEwYWMuLmU5NjI4NDEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1NlY29uZGFyeVRhYmxlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvU2Vjb25kYXJ5VGFibGUuamF2YQpAQCAtMzAsNyArMzAsNyBAQAogCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KIAkgKi8KIAk8VCBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBMaXN0SXRlcmF0b3I8VD4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QgPSAic3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdCI7CisJCVN0cmluZyBTUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QgPSAic3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zIjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCiAJICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zLCBib3RoIHNwZWNpZmllZCBhbmQgZGVmYXVsdC4KQEAgLTUzLDcgKzUzLDcgQEAKIAkgKiBvbmx5IGV4aXN0cyBpZiB0aGVyZSBhcmUgbm8gc3BlY2lmaWVkIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucy4KIAkgKi8KIAlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJU3RyaW5nIERFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4gPSAiZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uIjsKKwkJU3RyaW5nIERFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4gPSAiZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uIjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCiAJICogQWRkIGEgc3BlY2lmaWVkIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIHRvIHRoZSBzZWNvbmRhcnkgdGFibGUgcmV0dXJuIHRoZSBvYmplY3QgCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9TZXF1ZW5jZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvU2VxdWVuY2VHZW5lcmF0b3IuamF2YQppbmRleCAyYzBhMjUyLi4zODExNmU0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9TZXF1ZW5jZUdlbmVyYXRvci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1NlcXVlbmNlR2VuZXJhdG9yLmphdmEKQEAgLTE4LDE1ICsxOCwxOSBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yCitwdWJsaWMgaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yCisJZXh0ZW5kcyBHZW5lcmF0b3IKIHsKLQlJbnRlZ2VyIERFRkFVTFRfSU5JVElBTF9WQUxVRSA9IEludGVnZXIudmFsdWVPZigxKTsKKwlpbnQgREVGQVVMVF9JTklUSUFMX1ZBTFVFID0gMTsKIAotCVN0cmluZyBnZXRTZXF1ZW5jZU5hbWUoKTsKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFNlcXVlbmNlTmFtZSgpOwotCQlTdHJpbmcgREVGQVVMVF9TRVFVRU5DRV9OQU1FX1BST1BFUlRZID0gImRlZmF1bHRTZXF1ZW5jZU5hbWVQcm9wZXJ0eSI7CisKKwkvLyAqKioqKioqKioqIHNlcXVlbmNlIG5hbWUgKioqKioqKioqKgorCiAJU3RyaW5nIGdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpOwogCXZvaWQgc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTZXF1ZW5jZU5hbWVQcm9wZXJ0eSI7CisJCVN0cmluZyBTUEVDSUZJRURfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTZXF1ZW5jZU5hbWUiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIGdldFNlcXVlbmNlTmFtZSgpOworCVN0cmluZyBnZXREZWZhdWx0U2VxdWVuY2VOYW1lKCk7CisJCVN0cmluZyBERUZBVUxUX1NFUVVFTkNFX05BTUVfUFJPUEVSVFkgPSAiZGVmYXVsdFNlcXVlbmNlTmFtZSI7IC8vJE5PTi1OTFMtMSQKKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmluZGV4IDRiMDk2MmUuLjg5ZWQzNzIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1NpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKQEAgLTksMTEgKzksNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dDsKIAotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KIC8qKgotICogCi0gKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCiAgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQpAQCAtMjIsNjQgKzE4LDcgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIGV4dGVuZHMgUmVsYXRpb25zaGlwTWFwcGluZywgTnVsbGFibGUKIHsKLQkKIAkvLyAqKioqKioqKioqKioqKioqIGZldGNoIHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQorCQogCUZldGNoVHlwZSBERUZBVUxUX0ZFVENIX1RZUEUgPSBGZXRjaFR5cGUuRUFHRVI7Ci0KLQkvLyAqKioqKioqKioqKioqKioqIGpvaW4gY29sdW1ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgam9pbiBjb2x1bW5zIHdoZXRoZXIgc3BlY2lmaWVkIG9yIGRlZmF1bHQuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCTxUIGV4dGVuZHMgSm9pbkNvbHVtbj4gTGlzdEl0ZXJhdG9yPFQ+IGpvaW5Db2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBqb2luIGNvbHVtbnMsIGJvdGggc3BlY2lmaWVkIGFuZCBkZWZhdWx0LgotCSAqLwotCWludCBqb2luQ29sdW1uc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbnMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCTxUIGV4dGVuZHMgSm9pbkNvbHVtbj4gTGlzdEl0ZXJhdG9yPFQ+IHNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QgPSAic3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0IjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNwZWNpZmllZCBqb2luIGNvbHVtbnMuCi0JICovCi0JaW50IHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IGpvaW4gY29sdW1uIG9yIG51bGwuICBBIGRlZmF1bHQgam9pbiBjb2x1bW4KLQkgKiBvbmx5IGV4aXN0cyBpZiB0aGVyZSBhcmUgbm8gc3BlY2lmaWVkIGpvaW4gY29sdW1ucy4KLQkgKi8KLQlKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCVN0cmluZyBERUZBVUxUX0pPSU5fQ09MVU1OID0gImRlZmF1bHRKb2luQ29sdW1uIjsKLQotCS8qKgotCSAqIEFkZCBhIHNwZWNpZmllZCBqb2luIGNvbHVtbiB0byB0aGUgam9pbiB0YWJsZSByZXR1cm4gdGhlIG9iamVjdCAKLQkgKiByZXByZXNlbnRpbmcgaXQuCi0JICovCi0JSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gZnJvbSB0aGUgam9pbiB0YWJsZS4KLQkgKi8KLQl2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbiBhdCB0aGUgaW5kZXggZnJvbSB0aGUgam9pbiB0YWJsZS4KLQkgKi8KLQl2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKTsKLQkKLQkvKioKLQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCi0JICovCi0Jdm9pZCBtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0KLQlib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1RhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9UYWJsZS5qYXZhCmluZGV4IDVmMzk1NGUuLjY5NGVjYTcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1RhYmxlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVGFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3ICsxMCw5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKIAogLyoqCiAgKiAKQEAgLTIxLDkwICsyMyw5MCBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgVGFibGUKKwlleHRlbmRzIEpwYUNvbnRleHROb2RlCiB7Ci0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKTsKLQkJU3RyaW5nIERFRkFVTFRfTkFNRV9QUk9QRVJUWSA9ICJkZWZhdWx0TmFtZVByb3BlcnR5IjsKIAorCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBuYW1lIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQKKwkgKiBuYW1lLgorCSAqLworCVN0cmluZyBnZXROYW1lKCk7CiAJU3RyaW5nIGdldFNwZWNpZmllZE5hbWUoKTsKIAl2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9OQU1FX1BST1BFUlRZID0gInNwZWNpZmllZE5hbWVQcm9wZXJ0eSI7Ci0KLQlTdHJpbmcgZ2V0Q2F0YWxvZygpOwotCi0JU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCVN0cmluZyBERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkgPSAiZGVmYXVsdENhdGFsb2dQcm9wZXJ0eSI7Ci0KLQlTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCXZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ2F0YWxvZ1Byb3BlcnR5IjsKKwkJU3RyaW5nIFNQRUNJRklFRF9OQU1FX1BST1BFUlRZID0gInNwZWNpZmllZE5hbWUiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIGdldERlZmF1bHROYW1lKCk7CisJCVN0cmluZyBERUZBVUxUX05BTUVfUFJPUEVSVFkgPSAiZGVmYXVsdE5hbWUiOyAvLyROT04tTkxTLTEkCiAKIAorCS8vICoqKioqKioqKiogc2NoZW1hICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHNjaGVtYSBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0CisJICogc2NoZW1hLgorCSAqLwogCVN0cmluZyBnZXRTY2hlbWEoKTsKLQotCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCk7Ci0JCVN0cmluZyBERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSA9ICJkZWZhdWx0U2NoZW1hUHJvcGVydHkiOwotCiAJU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpOwogCXZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZID0gInNwZWNpZmllZFNjaGVtYVByb3BlcnR5IjsKKwkJU3RyaW5nIFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkgPSAic3BlY2lmaWVkU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCk7CisJCVN0cmluZyBERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSA9ICJkZWZhdWx0U2NoZW1hIjsgLy8kTk9OLU5MUy0xJAogCiAKLQkvLyAqKioqKioqKioqKioqKioqIHVuaXF1ZSBjb25zdHJhaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCiAKIAkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSB1bmlxdWUgY29uc3RyYWludHMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgorCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNhdGFsb2cgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdAorCSAqIGNhdGFsb2cuCiAJICovCisJU3RyaW5nIGdldENhdGFsb2coKTsKKwlTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOworCXZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgdmFsdWUpOworCQlTdHJpbmcgU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKTsKKwkJU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSA9ICJkZWZhdWx0Q2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKKworCisJLy8gKioqKioqKioqKiB1bmlxdWUgY29uc3RyYWludHMgKioqKioqKioqKgorCiAJPFQgZXh0ZW5kcyBVbmlxdWVDb25zdHJhaW50PiBMaXN0SXRlcmF0b3I8VD4gdW5pcXVlQ29uc3RyYWludHMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB1bmlxdWUgY29uc3RyYWludHMuCi0JICovCiAJaW50IHVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpOwotCQkKLQkvKioKLQkgKiBBZGQgYSB1bmlxdWUgY29uc3RyYWludCB0byB0aGUgdGFibGUgYW5kIHJldHVybiB0aGUgb2JqZWN0IAotCSAqIHJlcHJlc2VudGluZyBpdC4KLQkgKi8KIAlVbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdW5pcXVlIGNvbnN0cmFpbnQgYXQgdGhlIGdpdmVuIGluZGV4IGZyb20gdGhlIFRhYmxlCi0JICovCiAJdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSB1bmlxdWUgY29uc3RyYWludCBmcm9tIHRoZSBUYWJsZQotCSAqLwogCXZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpOwotCQotCS8qKgotCSAqIE1vdmUgdGhlIHVuaXF1ZSBjb25zdHJhaW50IGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwogCXZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQlTdHJpbmcgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QgPSAidW5pcXVlQ29uc3RyYWludHNMaXN0IjsKKwkJU3RyaW5nIFVOSVFVRV9DT05TVFJBSU5UU19MSVNUID0gInVuaXF1ZUNvbnN0cmFpbnRzIjsgLy8kTk9OLU5MUy0xJAogCiAKKwkvLyAqKioqKioqKioqIGRhdGFiYXNlIHN0dWZmICoqKioqKioqKioKIAogCW9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlRhYmxlKCk7Ci0KIAlTY2hlbWEgZ2V0RGJTY2hlbWEoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHRhYmxlIGlzIGNvbm5lY3RlZCB0byBhIGRhdGFzb3VyY2UKLQkgKi8KLQlib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKKwlDYXRhbG9nIGdldERiQ2F0YWxvZygpOworCVNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcigpOwogCi0JLyoqIAotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgdGFibGUncyBzY2hlbWEgY2FuIGJlIHJlc29sdmVkIHRvIGEgc2NoZW1hIG9uIHRoZSBhY3RpdmUgY29ubmVjdGlvbgorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0YWJsZSBjYW4gYmUgcmVzb2x2ZWQgdG8gYSB0YWJsZSBvbiB0aGUgZGF0YWJhc2UuCisJICovCisJYm9vbGVhbiBpc1Jlc29sdmVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGFibGUncyBzY2hlbWEgY2FuIGJlIHJlc29sdmVkIHRvIGEgc2NoZW1hIG9uIHRoZQorCSAqIGRhdGFiYXNlLgogCSAqLwogCWJvb2xlYW4gaGFzUmVzb2x2ZWRTY2hlbWEoKTsKIAotCS8qKiAKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGNhbiBiZSByZXNvbHZlZCB0byBhIHRhYmxlIG9uIHRoZSBhY3RpdmUgY29ubmVjdGlvbgorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0YWJsZSBoYXMgYSBjYXRhbG9nIGFuZCBpdCBjYW4gYmUgcmVzb2x2ZWQgdG8gYQorCSAqIGNhdGFsb2cgb24gdGhlIGRhdGFiYXNlLgogCSAqLwotCWJvb2xlYW4gaXNSZXNvbHZlZCgpOworCWJvb2xlYW4gaGFzUmVzb2x2ZWRDYXRhbG9nKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGFibGUgaXMgc3BlY2lmaWVkIGluIHRoZSByZXNvdXJjZS4KKwkgKi8KKwlib29sZWFuIGlzUmVzb3VyY2VTcGVjaWZpZWQoKTsKKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVGFibGVHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1RhYmxlR2VuZXJhdG9yLmphdmEKaW5kZXggZjU1NDgwOS4uODdmNTk2MiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVGFibGVHZW5lcmF0b3IuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9UYWJsZUdlbmVyYXRvci5qYXZhCkBAIC0xMCw3ICsxMCw2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwogCiAvKioKQEAgLTIyLDExNiArMjEsMTEzIEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IKK3B1YmxpYyBpbnRlcmZhY2UgVGFibGVHZW5lcmF0b3IKKwlleHRlbmRzIEdlbmVyYXRvcgogewotCUludGVnZXIgREVGQVVMVF9JTklUSUFMX1ZBTFVFID0gSW50ZWdlci52YWx1ZU9mKDApOworCWludCBERUZBVUxUX0lOSVRJQUxfVkFMVUUgPSAwOwogCisKKwkvLyAqKioqKioqKioqIHRhYmxlICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHRhYmxlIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQKKwkgKiB0YWJsZS4KKwkgKi8KIAlTdHJpbmcgZ2V0VGFibGUoKTsKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCk7Ci0JCVN0cmluZyBERUZBVUxUX1RBQkxFX1BST1BFUlRZID0gImRlZmF1bHRUYWJsZVByb3BlcnR5IjsKIAlTdHJpbmcgZ2V0U3BlY2lmaWVkVGFibGUoKTsKIAl2b2lkIHNldFNwZWNpZmllZFRhYmxlKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVGFibGVQcm9wZXJ0eSI7CisJCVN0cmluZyBTUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVGFibGUiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpOworCQlTdHJpbmcgREVGQVVMVF9UQUJMRV9QUk9QRVJUWSA9ICJkZWZhdWx0VGFibGUiOyAvLyROT04tTkxTLTEkCiAKIAorCS8vICoqKioqKioqKiogc2NoZW1hICoqKioqKioqKioKIAotCVN0cmluZyBnZXRDYXRhbG9nKCk7Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSA9ICJkZWZhdWx0Q2F0YWxvZ1Byb3BlcnR5IjsKLQotCVN0cmluZyBnZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSA9ICJzcGVjaWZpZWRDYXRhbG9nUHJvcGVydHkiOwotCi0KLQorCS8qKgorCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHNjaGVtYSBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0CisJICogc2NoZW1hLgorCSAqLwogCVN0cmluZyBnZXRTY2hlbWEoKTsKLQotCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCk7Ci0JCVN0cmluZyBERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSA9ICJkZWZhdWx0U2NoZW1hUHJvcGVydHkiOwotCiAJU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpOwogCXZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZID0gInNwZWNpZmllZFNjaGVtYVByb3BlcnR5IjsKKwkJU3RyaW5nIFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkgPSAic3BlY2lmaWVkU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCk7CisJCVN0cmluZyBERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSA9ICJkZWZhdWx0U2NoZW1hIjsgLy8kTk9OLU5MUy0xJAogCiAKKwkvLyAqKioqKioqKioqIGNhdGFsb2cgKioqKioqKioqKgogCisJLyoqCisJICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2F0YWxvZyBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0CisJICogY2F0YWxvZy4KKwkgKi8KKwlTdHJpbmcgZ2V0Q2F0YWxvZygpOworCVN0cmluZyBnZXRTcGVjaWZpZWRDYXRhbG9nKCk7CisJdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nKFN0cmluZyB2YWx1ZSk7CisJCVN0cmluZyBTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSA9ICJzcGVjaWZpZWRDYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZygpOworCQlTdHJpbmcgREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZID0gImRlZmF1bHRDYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAorCisKKwkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGNvbHVtbiBuYW1lICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHByaW1hcnkga2V5IGNvbHVtIG5hbWUgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybgorCSAqIHRoZSBkZWZhdWx0IHByaW1hcnkga2V5IGNvbHVtIG5hbWUuCisJICovCiAJU3RyaW5nIGdldFBrQ29sdW1uTmFtZSgpOwotCi0JU3RyaW5nIGdldERlZmF1bHRQa0NvbHVtbk5hbWUoKTsKLQkJU3RyaW5nIERFRkFVTFRfUEtfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAiZGVmYXVsdFBrQ29sdW1uTmFtZVByb3BlcnR5IjsKLQogCVN0cmluZyBnZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKTsKIAl2b2lkIHNldFNwZWNpZmllZFBrQ29sdW1uTmFtZShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gInNwZWNpZmllZFBrQ29sdW1uTmFtZVByb3BlcnR5IjsKKwkJU3RyaW5nIFNQRUNJRklFRF9QS19DT0xVTU5fTkFNRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRQa0NvbHVtbk5hbWUiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIGdldERlZmF1bHRQa0NvbHVtbk5hbWUoKTsKKwkJU3RyaW5nIERFRkFVTFRfUEtfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAiZGVmYXVsdFBrQ29sdW1uTmFtZSI7IC8vJE5PTi1OTFMtMSQKIAogCisJLy8gKioqKioqKioqKiB2YWx1ZSBjb2x1bW4gbmFtZSAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCB2YWx1ZSBjb2x1bSBuYW1lIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4KKwkgKiB0aGUgZGVmYXVsdCB2YWx1ZSBjb2x1bSBuYW1lLgorCSAqLwogCVN0cmluZyBnZXRWYWx1ZUNvbHVtbk5hbWUoKTsKLQotCVN0cmluZyBnZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKCk7Ci0JCVN0cmluZyBERUZBVUxUX1ZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gImRlZmF1bHRWYWx1ZUNvbHVtbk5hbWVQcm9wZXJ0eSI7Ci0JCiAJU3RyaW5nIGdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpOwogCXZvaWQgc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lUHJvcGVydHkiOworCQlTdHJpbmcgU1BFQ0lGSUVEX1ZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gInNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpOworCQlTdHJpbmcgREVGQVVMVF9WQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSA9ICJkZWZhdWx0VmFsdWVDb2x1bW5OYW1lIjsgLy8kTk9OLU5MUy0xJAogCiAKKwkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGNvbHVtbiB2YWx1ZSAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBwcmltYXJ5IGtleSBjb2x1bSB2YWx1ZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuCisJICogdGhlIGRlZmF1bHQgcHJpbWFyeSBrZXkgY29sdW0gdmFsdWUuCisJICovCiAJU3RyaW5nIGdldFBrQ29sdW1uVmFsdWUoKTsKLQotCVN0cmluZyBnZXREZWZhdWx0UGtDb2x1bW5WYWx1ZSgpOwotCQlTdHJpbmcgREVGQVVMVF9QS19DT0xVTU5fVkFMVUVfUFJPUEVSVFkgPSAiZGVmYXVsdFBrQ29sdW1tVmFsdWVQcm9wZXJ0eSI7Ci0KIAlTdHJpbmcgZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpOwogCXZvaWQgc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1BLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRQa0NvbHVtbVZhbHVlUHJvcGVydHkiOworCQlTdHJpbmcgU1BFQ0lGSUVEX1BLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRQa0NvbHVtbVZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBnZXREZWZhdWx0UGtDb2x1bW5WYWx1ZSgpOworCQlTdHJpbmcgREVGQVVMVF9QS19DT0xVTU5fVkFMVUVfUFJPUEVSVFkgPSAiZGVmYXVsdFBrQ29sdW1tVmFsdWUiOyAvLyROT04tTkxTLTEkCiAKIAotCS8vICoqKioqKioqKioqKioqKiogdW5pcXVlIGNvbnN0cmFpbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy8gKioqKioqKioqKiB1bmlxdWUgY29uc3RyYWludHMgKioqKioqKioqKgogCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgdW5pcXVlIGNvbnN0cmFpbnRzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KIAk8VCBleHRlbmRzIFVuaXF1ZUNvbnN0cmFpbnQ+IExpc3RJdGVyYXRvcjxUPiB1bmlxdWVDb25zdHJhaW50cygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBjb25zdHJhaW50cy4KLQkgKi8KIAlpbnQgdW5pcXVlQ29uc3RyYWludHNTaXplKCk7Ci0JCQotCS8qKgotCSAqIEFkZCBhIHVuaXF1ZSBjb25zdHJhaW50IHRvIHRoZSB0YWJsZSBhbmQgcmV0dXJuIHRoZSBvYmplY3QgCi0JICogcmVwcmVzZW50aW5nIGl0LgotCSAqLwogCVVuaXF1ZUNvbnN0cmFpbnQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB1bmlxdWUgY29uc3RyYWludCBhdCB0aGUgZ2l2ZW4gaW5kZXggZnJvbSB0aGUgVGFibGUKLQkgKi8KIAl2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHVuaXF1ZSBjb25zdHJhaW50IGZyb20gdGhlIFRhYmxlCi0JICovCiAJdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCk7Ci0JCi0JLyoqCi0JICogTW92ZSB0aGUgdW5pcXVlIGNvbnN0cmFpbnQgZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCi0JICovCiAJdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCVN0cmluZyBVTklRVUVfQ09OU1RSQUlOVFNfTElTVCA9ICJ1bmlxdWVDb25zdHJhaW50c0xpc3QiOworCQlTdHJpbmcgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QgPSAidW5pcXVlQ29uc3RyYWludHMiOyAvLyROT04tTkxTLTEkCiAKLQkvKioKLQkgKiBSZXR1cm4gYSBkYiBTY2hlbWEgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZC9kZWZhdWx0IHNjaGVtYSBuYW1lLgotCSAqIFRoaXMgY2FuIHJldHVybiBudWxsIGlmIG5vIFNjaGVtYSBleGlzdHMgb24gdGhlIGRhdGFiYXNlIHdpdGggdGhhdCBuYW1lLgotCSAqLwotCVNjaGVtYSBnZXREYlNjaGVtYSgpOworCisJLy8gKioqKioqKioqKiBkYXRhYmFzZSBzdHVmZiAqKioqKioqKioqCiAKIAkvKioKIAkgKiBSZXR1cm4gYSBkYiBUYWJsZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkL2RlZmF1bHQgdGFibGUgbmFtZS4KIAkgKiBUaGlzIGNhbiByZXR1cm4gbnVsbCBpZiBubyBUYWJsZSBleGlzdHMgb24gdGhlIGRhdGFiYXNlIHdpdGggdGhhdCBuYW1lLgogCSAqLwogCVRhYmxlIGdldERiVGFibGUoKTsKKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVGVtcG9yYWxDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1RlbXBvcmFsQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4YTU1MwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1RlbXBvcmFsQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGVtcG9yYWxDb252ZXJ0ZXIgZXh0ZW5kcyBDb252ZXJ0ZXIKK3sKKwlUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWxUeXBlKCk7CisJdm9pZCBzZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZSk7CisJCVN0cmluZyBURU1QT1JBTF9UWVBFX1BST1BFUlRZID0gInRlbXBvcmFsVHlwZSI7IC8vJE5PTi1OTFMtMSQKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVGVtcG9yYWxUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9UZW1wb3JhbFR5cGUuamF2YQppbmRleCBiYzEwYmJiLi5jNmVlZThkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9UZW1wb3JhbFR5cGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9UZW1wb3JhbFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3ICsxMCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CiAKIC8qKgotICogCisgKiBUZW1wb3JhbCBUeXBlCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMCw3NCArMjAsNzcgQEAKICAqLwogcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKIAotCURBVEUsCi0JVElNRSwKLQlUSU1FU1RBTVA7Ci0JCisJREFURSgKKwkJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLkRBVEUsCisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUKKwkJKSwKKwlUSU1FKAorCQkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwKKwkJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRQorCQkpLAorCVRJTUVTVEFNUCgKKwkJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwKKwkJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QCisJCSk7CisKKworCXByaXZhdGUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUgamF2YVRlbXBvcmFsVHlwZTsKKwlwcml2YXRlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUgb3JtVGVtcG9yYWxUeXBlOworCisJVGVtcG9yYWxUeXBlKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlIGphdmFUZW1wb3JhbFR5cGUsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUgb3JtVGVtcG9yYWxUeXBlKSB7CisJCWlmIChqYXZhVGVtcG9yYWxUeXBlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCWlmIChvcm1UZW1wb3JhbFR5cGUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy5qYXZhVGVtcG9yYWxUeXBlID0gamF2YVRlbXBvcmFsVHlwZTsKKwkJdGhpcy5vcm1UZW1wb3JhbFR5cGUgPSBvcm1UZW1wb3JhbFR5cGU7CisJfQorCisJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlIGdldEphdmFUZW1wb3JhbFR5cGUoKSB7CisJCXJldHVybiB0aGlzLmphdmFUZW1wb3JhbFR5cGU7CisJfQorCisJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUgZ2V0T3JtVGVtcG9yYWxUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UZW1wb3JhbFR5cGU7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKIAogCXB1YmxpYyBzdGF0aWMgVGVtcG9yYWxUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZSBqYXZhVGVtcG9yYWxUeXBlKSB7Ci0JCWlmIChqYXZhVGVtcG9yYWxUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YVRlbXBvcmFsVHlwZSkgewotCQkJY2FzZSBEQVRFOgotCQkJCXJldHVybiBEQVRFOwotCQkJY2FzZSBUSU1FOgotCQkJCXJldHVybiBUSU1FOwotCQkJY2FzZSBUSU1FU1RBTVA6Ci0JCQkJcmV0dXJuIFRJTUVTVEFNUDsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biB0ZW1wb3JhbCB0eXBlOiAiICsgamF2YVRlbXBvcmFsVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChqYXZhVGVtcG9yYWxUeXBlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhUmVzb3VyY2VNb2RlbF8oamF2YVRlbXBvcmFsVHlwZSk7CiAJfQotCQorCisJcHJpdmF0ZSBzdGF0aWMgVGVtcG9yYWxUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbF8ob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUgamF2YVRlbXBvcmFsVHlwZSkgeworCQlmb3IgKFRlbXBvcmFsVHlwZSB0ZW1wb3JhbFR5cGUgOiBUZW1wb3JhbFR5cGUudmFsdWVzKCkpIHsKKwkJCWlmICh0ZW1wb3JhbFR5cGUuZ2V0SmF2YVRlbXBvcmFsVHlwZSgpID09IGphdmFUZW1wb3JhbFR5cGUpIHsKKwkJCQlyZXR1cm4gdGVtcG9yYWxUeXBlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwogCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUgdG9KYXZhUmVzb3VyY2VNb2RlbChUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlKSB7Ci0JCWlmICh0ZW1wb3JhbFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoICh0ZW1wb3JhbFR5cGUpIHsKLQkJCWNhc2UgREFURToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuREFURTsKLQkJCWNhc2UgVElNRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRTsKLQkJCWNhc2UgVElNRVNUQU1QOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FU1RBTVA7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gdGVtcG9yYWwgdHlwZTogIiArIHRlbXBvcmFsVHlwZSk7Ci0JCX0KKwkJcmV0dXJuICh0ZW1wb3JhbFR5cGUgPT0gbnVsbCkgPyBudWxsIDogdGVtcG9yYWxUeXBlLmdldEphdmFUZW1wb3JhbFR5cGUoKTsKIAl9Ci0JCiAKIAlwdWJsaWMgc3RhdGljIFRlbXBvcmFsVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlIG9ybVRlbXBvcmFsVHlwZSkgewotCQlpZiAob3JtVGVtcG9yYWxUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAob3JtVGVtcG9yYWxUeXBlKSB7Ci0JCQljYXNlIERBVEU6Ci0JCQkJcmV0dXJuIERBVEU7Ci0JCQljYXNlIFRJTUU6Ci0JCQkJcmV0dXJuIFRJTUU7Ci0JCQljYXNlIFRJTUVTVEFNUDoKLQkJCQlyZXR1cm4gVElNRVNUQU1QOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIHRlbXBvcmFsIHR5cGU6ICIgKyBvcm1UZW1wb3JhbFR5cGUpOwotCQl9CisJCXJldHVybiAob3JtVGVtcG9yYWxUeXBlID09IG51bGwpID8gbnVsbCA6IGZyb21Pcm1SZXNvdXJjZU1vZGVsXyhvcm1UZW1wb3JhbFR5cGUpOwogCX0KLQkKKworCXByaXZhdGUgc3RhdGljIFRlbXBvcmFsVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbF8ob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZSBvcm1UZW1wb3JhbFR5cGUpIHsKKwkJZm9yIChUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlIDogVGVtcG9yYWxUeXBlLnZhbHVlcygpKSB7CisJCQlpZiAodGVtcG9yYWxUeXBlLmdldE9ybVRlbXBvcmFsVHlwZSgpID09IG9ybVRlbXBvcmFsVHlwZSkgeworCQkJCXJldHVybiB0ZW1wb3JhbFR5cGU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCiAJcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlIHRvT3JtUmVzb3VyY2VNb2RlbChUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlKSB7Ci0JCWlmICh0ZW1wb3JhbFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoICh0ZW1wb3JhbFR5cGUpIHsKLQkJCWNhc2UgREFURToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFOwotCQkJY2FzZSBUSU1FOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUU7Ci0JCQljYXNlIFRJTUVTVEFNUDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVA7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gdGVtcG9yYWwgdHlwZTogIiArIHRlbXBvcmFsVHlwZSk7Ci0JCX0KKwkJcmV0dXJuICh0ZW1wb3JhbFR5cGUgPT0gbnVsbCkgPyBudWxsIDogdGVtcG9yYWxUeXBlLmdldE9ybVRlbXBvcmFsVHlwZSgpOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1R5cGVNYXBwaW5nLmphdmEKaW5kZXggNDg4ODE4NC4uZDhiNTM1NCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVHlwZU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9UeXBlTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDY0ICsxMCw3MSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwogCiAvKioKICAqIAogICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCisgKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4KKyAqIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nCisgKiBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdAorICogY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVNYXBwaW5nIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKK3B1YmxpYyBpbnRlcmZhY2UgVHlwZU1hcHBpbmcgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZSB7CiAJLyoqCi0JICogUmV0dXJuIGEgdW5pcXVlIGtleSBmb3IgdGhlIElUeXBlTWFwcGluZy4gIElmIHRoaXMgaXMgZGVmaW5lZCBpbgotCSAqIGFuIGV4dGVuc2lvbiB0aGV5IHNob3VsZCBiZSBlcXVhbC4KLQkgKiBAcmV0dXJuCisJICogUmV0dXJuIGEgdW5pcXVlIGtleSBmb3IgdGhlIElUeXBlTWFwcGluZy4gSWYgdGhpcyBpcyBkZWZpbmVkIGluIGFuCisJICogZXh0ZW5zaW9uIHRoZXkgc2hvdWxkIGJlIGVxdWFsLgogCSAqLwogCVN0cmluZyBnZXRLZXkoKTsKIAogCVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKCk7CiAKIAlib29sZWFuIGlzTWFwcGVkKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG1hcHBpbmcncyBwcmltYXJ5IHRhYmxlIG5hbWUsIG51bGwgaWYgYSBwcmltYXJ5IHRhYmxlIGRvZXMgbm90IGFwcGx5Ci0JICovCi0JU3RyaW5nIGdldFRhYmxlTmFtZSgpOwogCiAJLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG1hcHBpbmcncyAiYXNzb2NpYXRlZCIgdGFibGVzLCB3aGljaCBpbmNsdWRlcyB0aGUKLQkgKiBwcmltYXJ5IHRhYmxlIGFuZCB0aGUgY29sbGVjdGlvbiBvZiBzZWNvbmRhcnkgdGFibGVzLgorCSAqIFJldHVybiB0aGUgdHlwZSBtYXBwaW5nJ3MgcHJpbWFyeSB0YWJsZSBuYW1lLCBudWxsIGlmIGEgcHJpbWFyeSB0YWJsZQorCSAqIGRvZXMgbm90IGFwcGx5LgogCSAqLwotCUl0ZXJhdG9yPFRhYmxlPiBhc3NvY2lhdGVkVGFibGVzKCk7CisJU3RyaW5nIGdldFByaW1hcnlUYWJsZU5hbWUoKTsKIAogCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBtYXBwaW5nJ3MgImFzc29jaWF0ZWQiIHRhYmxlcywgd2hpY2ggaW5jbHVkZXMgdGhlCi0JICogcHJpbWFyeSB0YWJsZSBhbmQgdGhlIGNvbGxlY3Rpb24gb2Ygc2Vjb25kYXJ5IHRhYmxlcywgYXMgd2VsbCBhcyBhbGwKLQkgKiBpbmhlcml0ZWQgImFzc29jaWF0ZWQiIHRhYmxlcy4KLQkgKi8KLQlJdGVyYXRvcjxUYWJsZT4gYXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgdHlwZSBtYXBwaW5nJ3MgImFzc29jaWF0ZWQiIHRhYmxlcywKLQkgKiB3aGljaCBpbmNsdWRlcyB0aGUgcHJpbWFyeSB0YWJsZSBhbmQgdGhlIGNvbGxlY3Rpb24gb2Ygc2Vjb25kYXJ5Ci0JICogdGFibGVzLCBhcyB3ZWxsIGFzIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGluaGVyaXRlZCAiYXNzb2NpYXRlZCIgdGFibGVzLgotCSAqLwotCUl0ZXJhdG9yPFN0cmluZz4gYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKTsKLQotCS8qKgotCSAqIHJldHVybiB0aGUgcmVzb2x2ZWQgcHJpbWFyeSBkYiB0YWJsZQorCSAqIFJldHVybiB0aGUgdHlwZSBtYXBwaW5nJ3MgcHJpbWFyeSBkYXRhYmFzZSB0YWJsZS4KIAkgKi8KIAlvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0UHJpbWFyeURiVGFibGUoKTsKIAogCVNjaGVtYSBnZXREYlNjaGVtYSgpOwogCiAJLyoqCisJICogUmV0dXJuIHRoZSB0eXBlIG1hcHBpbmcncyAicGVyc2lzdGVuY2UiIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwKKwkgKiA8ZW0+aW5jbHVkaW5nPC9lbT4gdGhlIHR5cGUgbWFwcGluZyBpdHNlbGYuCisJICogVGhlIHJldHVybmVkIGl0ZXJhdG9yIHdpbGwgcmV0dXJuIGVsZW1lbnRzIGluZmluaXRlbHkgaWYgdGhlIGhpZXJhcmNoeQorCSAqIGhhcyBhIGxvb3AuCisJICovCisJSXRlcmF0b3I8VHlwZU1hcHBpbmc+IGluaGVyaXRhbmNlSGllcmFyY2h5KCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSB0eXBlIG1hcHBpbmcncyAiYXNzb2NpYXRlZCIgdGFibGVzLCB3aGljaCBpbmNsdWRlcyB0aGUgcHJpbWFyeQorCSAqIHRhYmxlIGFuZCB0aGUgY29sbGVjdGlvbiBvZiBzZWNvbmRhcnkgdGFibGVzLgorCSAqLworCUl0ZXJhdG9yPFRhYmxlPiBhc3NvY2lhdGVkVGFibGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHR5cGUgbWFwcGluZydzICJhc3NvY2lhdGVkIiB0YWJsZXMsIHdoaWNoIGluY2x1ZGVzIHRoZSBwcmltYXJ5CisJICogdGFibGUgYW5kIHRoZSBjb2xsZWN0aW9uIG9mIHNlY29uZGFyeSB0YWJsZXMsIGFzIHdlbGwgYXMgYWxsIGluaGVyaXRlZAorCSAqICJhc3NvY2lhdGVkIiB0YWJsZXMuCisJICovCisJSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgaWRlbnRpZmllcnMgb2YgdGhlIHR5cGUgbWFwcGluZydzICJhc3NvY2lhdGVkIiB0YWJsZXMsIHdoaWNoCisJICogaW5jbHVkZXMgdGhlIHByaW1hcnkgdGFibGUgYW5kIHRoZSBjb2xsZWN0aW9uIG9mIHNlY29uZGFyeSB0YWJsZXMsIGFzCisJICogd2VsbCBhcyBhbGwgdGhlIGluaGVyaXRlZCAiYXNzb2NpYXRlZCIgdGFibGVzLgorCSAqLworCUl0ZXJhdG9yPFN0cmluZz4gYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKTsKKworCS8qKgogCSAqIHJldHVybiB0aGUgcmVzb2x2ZWQgYXNzb2NpYXRlZCBkYiB0YWJsZSB3aXRoIHRoZSBwYXNzZWQgaW4gbmFtZQogCSAqLwogCW9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpOwpAQCAtNzcsNjQgKzg0LDYzIEBACiAJICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlIG1hcHBpbmcuCiAJICovCiAJYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSk7CisJCiAKIAkvKioKLQkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb2YgYXR0cmlidXRlcy4gIFRoZSBhdHRyaWJ1dGVzIG11c3QgYmUgQmFzaWNNYXBwaW5ncyBvciBJZE1hcHBpbmdzCi0JICogZm91bmQgaW4gdGhpcyB0eXBlIG1hcHBpbmcKKwkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGdldHRpbmcgdGhlIGF0dHJpYnV0ZSBtYXBwaW5ncyBmcm9tIFBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKQogCSAqLwotCTxUIGV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZT4gSXRlcmF0b3I8VD4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCk7CisJPFQgZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBMaXN0SXRlcmF0b3I8VD4gYXR0cmlidXRlTWFwcGluZ3MoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gYWxsIHRoZSBhdHRyaWJ1dGUgbWFwcGluZ3MgaW4gdGhlIHR5cGUgbWFwcGluZydzCisJICogaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorCSAqLworCUl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmc+IGFsbEF0dHJpYnV0ZU1hcHBpbmdzKCk7CiAKIAkvKioKLQkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb2YgYXR0cmlidXRlcyBuYW1lcy4gIFRoZSBhdHRyaWJ1dGVzIG11c3QgYmUgQmFzaWNNYXBwaW5ncyBvciBJZE1hcHBpbmdzCi0JICogZm91bmQgaW4gdGhpcyB0eXBlIG1hcHBpbmcKKwkvKioKKwkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb2YgYXR0cmlidXRlIG5hbWVzIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSAKKwkgKiBzdWIgdHlwZSBtYXBwaW5nLgogCSAqLwogCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwogCiAJLyoqCi0JICogUmV0dXJuIGFuIEl0ZXJhdG9yIG9mIGF0dHJpYnV0ZXMuICBUaGUgYXR0cmlidXRlcyBtdXN0IGJlIEJhc2ljTWFwcGluZ3Mgb3IgSWRNYXBwaW5ncwotCSAqIGZvdW5kIGluIGFueSBNYXBwZWRTdXBlcmNsYXNzIGluIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIAotCSAqIFNlZSB7QGxpbmsgVHlwZU1hcHBpbmcjb3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCl9IGFuZCB7QGxpbmsgUGVyc2lzdGVudFR5cGUjaW5oZXJpdGFuY2VIaWVyYXJjaHkoKX0KLQkgKi8KLQlJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBJdGVyYXRvciBvZiBhdHRyaWJ1dGVzIG5hbWVzLiAgVGhlIGF0dHJpYnV0ZXMgbXVzdCBiZSBCYXNpY01hcHBpbmdzIG9yIElkTWFwcGluZ3MKLQkgKiBmb3VuZCBpbiBhbnkgTWFwcGVkU3VwZXJjbGFzcyBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiAgCi0JICogU2VlIHtAbGluayBUeXBlTWFwcGluZyNvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCl9IGFuZCB7QGxpbmsgUGVyc2lzdGVudFR5cGUjaW5oZXJpdGFuY2VIaWVyYXJjaHkoKX0KKwkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb2YgYWxsIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIGluIHRoaXMKKwkgKiB0eXBlIG1hcHBpbmcuCiAJICovCiAJSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0KIAkKIAkvKioKLQkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb2YgYXNzb2NpYXRpb25zIHRoYXQgY2FuIGJlIG92ZXJyaWRlbi4gIFRoZSBhc3NvY2lhdGlvbnMgbXVzdCBiZSAKLQkgKiBPbmVUb09uZU1hcHBpbmdzIG9yIE1hbnlUb09uZU1hcHBpbmdzIGZvdW5kIGluIHRoaXMgdHlwZSBtYXBwaW5nCisJICogUmV0dXJucyB0aGUgQ29sdW1uIG9mIHRoZSBvdmVycmlkYWJsZSBhdHRyaWJ1dGUgbWFwcGluZyB3aXRoIHRoZSBnaXZlbiAKKwkgKiBhdHRyaWJ1dGUgbmFtZS4gSW4gMi4wIHRoaXMgbmFtZSBjb3VsZCB1c2UgZG90LW5vdGF0aW9uIGZvciBuZXN0ZWQgbWFwcGluZ3MuCiAJICovCi0JPFQgZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlPiBJdGVyYXRvcjxUPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucygpOworCUNvbHVtbiByZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKKworCisJUmVsYXRpb25zaGlwUmVmZXJlbmNlIHJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoU3RyaW5nIGFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lKTsKIAogCS8qKgotCSAqIFJldHVybiBhbiBJdGVyYXRvciBvZiBhc3NvY2lhdGlvbiBuYW1lcy4gIFRoZSBhc3NvY2lhdGlvbnMgbXVzdCBiZSBPbmVUb09uZU1hcHBpbmdzIG9yIE1hbnlUb09uZU1hcHBpbmdzCi0JICogZm91bmQgaW4gYW55IE1hcHBlZFN1cGVyY2xhc3MgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorCSAqIFJldHVybiBhbiBJdGVyYXRvciBvZiBhc3NvY2lhdGlvbnMgbmFtZXMgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiB0aGlzCisJICogdHlwZSBtYXBwaW5nLgogCSAqLwogCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0KKwkKIAkvKioKLQkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb2YgYXNzb2NpYXRpb25zLiAgVGhlIGFzc29jaWF0aW9ucyBtdXN0IGJlIE9uZVRvT25lTWFwcGluZ3Mgb3IgTWFueVRvT25lTWFwcGluZ3MKLQkgKiBmb3VuZCBpbiBhbnkgTWFwcGVkU3VwZXJjbGFzcyBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0JICogU2VlIHtAbGluayBUeXBlTWFwcGluZyNvdmVycmlkYWJsZUFzc29jaWF0aW9ucygpfSBhbmQge0BsaW5rIFBlcnNpc3RlbnRUeXBlI2luaGVyaXRhbmNlSGllcmFyY2h5KCl9Ci0JICovCi0JSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBJdGVyYXRvciBvZiBhc3NvY2lhdGlvbiBuYW1lcy4gIFRoZSBhc3NvY2lhdGlvbnMgbXVzdCBiZSBPbmVUb09uZU1hcHBpbmdzIG9yIE1hbnlUb09uZU1hcHBpbmdzCi0JICogZm91bmQgaW4gYW55IE1hcHBlZFN1cGVyY2xhc3MgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotCSAqIFNlZSB7QGxpbmsgVHlwZU1hcHBpbmcjb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCl9IGFuZCB7QGxpbmsgUGVyc2lzdGVudFR5cGUjaW5oZXJpdGFuY2VIaWVyYXJjaHkoKX0KKwkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb2YgYWxsIGFzc29jaWF0aW9ucyBuYW1lcyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIGluIHRoaXMKKwkgKiB0eXBlIG1hcHBpbmcuCiAJICovCiAJSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKIAogCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBhdHRyaWJ1dGUgbWFwcGluZyBrZXkgaXMgdmFsaWQgZm9yIHRoaXMgcGFydGljdWxhcgotCSAqIHR5cGUgbWFwcGluZwotCSAqIChmb3IgZXhhbXBsZSwgaWQncyBhcmUgbm90IHZhbGlkIGZvciBhbiBlbWJlZGRhYmxlIHR5cGUgbWFwcGluZykKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gYXR0cmlidXRlIG1hcHBpbmcga2V5IGlzIHZhbGlkIGZvciB0aGlzCisJICogcGFydGljdWxhciB0eXBlIG1hcHBpbmcgKGZvciBleGFtcGxlLCBpZCdzIGFyZSBub3QgdmFsaWQgZm9yIGFuCisJICogZW1iZWRkYWJsZSB0eXBlIG1hcHBpbmcpCiAJICovCiAJYm9vbGVhbiBhdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChTdHJpbmcgYXR0cmlidXRlTWFwcGluZ0tleSk7CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgYW55IGRhdGFiYXNlIG1ldGFkYXRhIHNwZWNpZmljIHZhbGlkYXRpb24gc2hvdWxkIG9jY3VyLgorCSAqIChGb3IgaW5zdGFuY2UsIGlmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBhY3RpdmUsIHRoZW4gaXQgc2hvdWxkIG5vdC4pCisJICovCisJYm9vbGVhbiBzaG91bGRWYWxpZGF0ZUFnYWluc3REYXRhYmFzZSgpOwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVW5pcXVlQ29uc3RyYWludC5qYXZhCmluZGV4IDk0ZGI2OTkuLmQ3N2FjZTQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1VuaXF1ZUNvbnN0cmFpbnQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9VbmlxdWVDb25zdHJhaW50LmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKIAkgKiBNb3ZlIHRoZSBjb2x1bW4gbmFtZSBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KIAkgKi8KIAl2b2lkIG1vdmVDb2x1bW5OYW1lKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkJU3RyaW5nIENPTFVNTl9OQU1FU19MSVNUID0gImNvbHVtbk5hbWVzTGlzdCI7CisJCVN0cmluZyBDT0xVTU5fTkFNRVNfTElTVCA9ICJjb2x1bW5OYW1lcyI7IC8vJE5PTi1OTFMtMSQKIAkJCiAJLyoqCiAJICogQWxsIGNvbnRhaW5lcnMgbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9WZXJzaW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvVmVyc2lvbk1hcHBpbmcuamF2YQppbmRleCAzMzNkMGRlLi41NjY1MTJmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9WZXJzaW9uTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1ZlcnNpb25NYXBwaW5nLmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwogcHVibGljIGludGVyZmFjZSBWZXJzaW9uTWFwcGluZwotCWV4dGVuZHMgQXR0cmlidXRlTWFwcGluZywgQ29sdW1uTWFwcGluZworCWV4dGVuZHMgQXR0cmlidXRlTWFwcGluZywgQ29sdW1uTWFwcGluZywgQ29udmVydGlibGVNYXBwaW5nCiB7Ci0JLy8gbm90aGluZyB5ZXQKKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvWG1sQ29udGV4dE5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1htbENvbnRleHROb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3YmFlMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1htbENvbnRleHROb2RlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbENvbnRleHROb2RlCisJZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQoreworCS8qKgorCSAqIEFkZCB0byB0aGUgbGlzdCBvZiBjdXJyZW50IHZhbGlkYXRpb24gbWVzc2FnZXMKKwkgKi8KKwl2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpOworCisJVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9YbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTVhODA5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7CisKK3B1YmxpYyBpbnRlcmZhY2UgWG1sQ29udGV4dE5vZGVGYWN0b3J5IHsKKworCU1hcHBpbmdGaWxlIGJ1aWxkTWFwcGluZ0ZpbGUoTWFwcGluZ0ZpbGVSZWYgcGFyZW50LCBKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1htbEZpbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L1htbEZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTU0YjcxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvWG1sRmlsZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKKworLyoqCisgKiBDb250ZXh0IHJlcHJlc2VudGF0aW9uIG9mIGFueSBKUEEgWE1MIGZpbGUuCisgKiA8cD4KKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbEZpbGUKKwlleHRlbmRzIFhtbENvbnRleHROb2RlLCBKcGFTdHJ1Y3R1cmVOb2RlCit7CisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBtb2RlbCBvYmplY3QKKwkgKi8KKwlKcGFYbWxSZXNvdXJjZSBnZXRYbWxSZXNvdXJjZSgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2YzNzAwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi0KLS8qKgotICogTWFwIGEgc3RyaW5nIGtleSB0byBhbiBhdHRyaWJ1dGUgbWFwcGluZyBhbmQgaXRzIGNvcnJlc3BvbmRpbmcKLSAqIEphdmEgYW5ub3RhdGlvbiBhZGFwdGVyLiAgCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgSUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHJldHVybiB3aGV0aGVyIHRoZSBkZWZhdWx0IG1hcHBpbmcgYXBwbGllcy4KLQkgKiBUaGlzIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgbWFwcGluZyBpbiB0aGUgY2FzZSB3aGVyZSBubyAKLQkgKiBtYXBwaW5nIGhhcyBiZWVuIHNwZWNpZmllZC4KLQkgKi8KLQlib29sZWFuIGRlZmF1bHRBcHBsaWVzKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phckZpbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmFyRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZWY4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phckZpbGUuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVudFR5cGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKKy8qKgorICogQSBKQVIgZmlsZSBpZGVudGlmaWVkIGJ5IGEgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiA8Y29kZT5qYXItZmlsZTwvY29kZT4gZWxlbWVudC4KKyAqIEhvbGRzIHBlcnNpc3RlbnQgdHlwZXMgY29ycmVzcG9uZGluZyB0byBhbGwgdGhlICJwZXJzaXN0YWJsZSIgdHlwZXMKKyAqIGRpc2NvdmVyZWQgaW4gdGhlIEpBUi4KKyAqIDxwPgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmFyRmlsZQorCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUsIEpwYVN0cnVjdHVyZU5vZGUsIFBlcnNpc3RlbnRUeXBlQ29udGFpbmVyCit7CisJLyoqCisJICogUmV0dXJuIHRoZSBKQVIgZmlsZSdzIEphdmEgcGVyc2lzdGVudCB0eXBlcy4KKwkgKiBSZXR1cm4gb25seSB0aGUgdHlwZXMgdGhhdCBhcmUgYW5ub3RhdGVkIHdpdGggSlBBIGFubm90YXRpb25zLgorCSAqLworCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50VHlwZT4gamF2YVBlcnNpc3RlbnRUeXBlcygpOworCQlTdHJpbmcgSkFWQV9QRVJTSVNURU5UX1RZUEVTX0NPTExFQ1RJT04gPSAiamF2YVBlcnNpc3RlbnRUeXBlcyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgSkFSIGZpbGUncyBKYXZhIHBlcnNpc3RlbnQgdHlwZXMuCisJICovCisJaW50IGphdmFQZXJzaXN0ZW50VHlwZXNTaXplKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbnQgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgcGVyc2lzdGVudCB0eXBlIGlzIG5vdCBmb3VuZC4KKwkgKi8KKwlQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgdHlwZU5hbWUpOworCisJLyoqCisJICogU3luY2hyb25pemUgdGhlIGNvbnRleHQgSkFSIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBKYXZhIHBhY2thZ2UgZnJhZ21lbnQKKwkgKiByb290LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKQorCSAqLworCXZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QganJwZnIpOworCisJLyoqCisJICogQWRkIHRvIHRoZSBsaXN0IG9mIGN1cnJlbnQgdmFsaWRhdGlvbiBtZXNzYWdlcworCSAqLworCXZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcik7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQppbmRleCA4ZTAxNWI0Li40NTRiOWVjIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksNyArOSw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7CiAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwogCkBAIC0yNCwxNiArMjMsMTcgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGUsIEphdmFKcGFDb250ZXh0Tm9kZQogewotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMoKTsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBkZWZhdWx0Sm9pbkNvbHVtbnMoKTsKLQlKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7CisJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CisKKwlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCk7CiAJCi0Jdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpOwogCQorCXZvaWQgaW5pdGlhbGl6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkKKwkvKioKKwkgKiBVcGRhdGUgdGhlIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KIAl2b2lkIHVwZGF0ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKIAkKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWIwNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciwgSmF2YUpwYUNvbnRleHROb2RlCit7CisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQorCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSk7CisKKwl2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqcnBtKTsKKwkKKwkvKioKKwkgKiBVcGRhdGUgdGhlIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIAorCSAqIHJlc291cmNlIG1vZGVsIG9iamVjdC4gc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQorCSAqLworCXZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIganJwbSk7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjZDIxOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOworCisvKioKKyAqIEFuIDxjb2RlPkFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U8L2NvZGU+IGlzIGEgdHlwZSBvZiAKKyAqIHtAbGluayBSZWxhdGlvbnNoaXBSZWZlcmVuY2V9IHRoYXQgbWF5IHV0aWxpemUgYSAKKyAqIHtAbGluayBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5fQorICogPHA+CisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHNlZSBSZWxhdGlvbnNoaXBNYXBwaW5nCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgCisJZXh0ZW5kcyBBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlLCBKYXZhSnBhQ29udGV4dE5vZGUKK3sKKwlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCk7CisJCisJSmF2YUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kgZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCisJdm9pZCBpbml0aWFsaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQorCXZvaWQgdXBkYXRlKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZy5qYXZhCmluZGV4IDc3MjVkMTcuLjc0ZTdhZjggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsMTEgKzEwLDEyIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwogCiAvKioKLSAqIAorICogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZwogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjIsMjAgKzIzLDMzIEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nLCBKYXZhSnBhQ29udGV4dE5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgSmF2YUF0dHJpYnV0ZU1hcHBpbmcKKwlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcsIEphdmFKcGFDb250ZXh0Tm9kZQogeworCS8qKgorCSAqIENvdmFyaWFudCBvdmVycmlkZS4KKwkgKi8KIAlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCi0Jdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKIAotCXZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKKwlBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisKKwl2b2lkIGluaXRpYWxpemUoQW5ub3RhdGlvbiBtYXBwaW5nQW5ub3RhdGlvbik7CisKKwkvKioKKwkgKiBVcGRhdGUgdGhlIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIAorCSAqIHJlc291cmNlIG1vZGVsIG9iamVjdC4gc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQorCSAqLworCS8vVE9ETyB3YW50IHRvIHJlbW92ZSBwYXJhbWV0ZXIgZnJvbSB0aGUgdXBkYXRlIG1ldGhvZCwgYnV0IHdlIGhhdmUgdG8gaGF2ZQorCS8vaXQgYmVjYXVzZSBvZiBHZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleSgpLCBpdCBpcyB1bmFibGUKKwkvL3RvIGNhbGwgaW5pdGlhbGl6ZSBhbmQgcGFzcyB0aGUgcmVzb3VyY2Ugb2JqZWN0IGluIGJlZm9yZSB0aGUgdXBkYXRlIGlzIGNhbGxlZC4KKwl2b2lkIHVwZGF0ZShBbm5vdGF0aW9uIG1hcHBpbmdBbm5vdGF0aW9uKTsKIAkKIAlTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKTsKIAkKIAkvKioKLQkgKiBSZXR1cm4gYWxsIGZ1bGx5IHF1YWxmaWVkIGFubm90YXRpb24gbmFtZXMgdGhhdCBhcmUgc3VwcG9ydGVkIHdpdGggdGhpcyBtYXBwaW5nIHR5cGUuCisJICogUmV0dXJuIGFsbCBmdWxseSBxdWFsaWZpZWQgYW5ub3RhdGlvbiBuYW1lcyB0aGF0IGFyZSBzdXBwb3J0ZWQgd2l0aCB0aGlzIG1hcHBpbmcgdHlwZS4KIAkgKiBUaGlzIGluY2x1ZGVzIGFsbCBwb3NzaWJsZSBhbm5vdGF0aW9ucywgbm90IGp1c3QgdGhlIG9uZXMgdGhhdCBjdXJyZW50bHkgZXhpc3Qgb24gdGhlIGF0dHJpYnV0ZS4KIAkgKi8KLQlJdGVyYXRvcjxTdHJpbmc+IGNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKTsKKwlJdGVyYXRvcjxTdHJpbmc+IHN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKTsKIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdmYzNmNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OworCisvKioKKyAqIE1hcCBhIHN0cmluZyBrZXkgdG8gYW4gYXR0cmlidXRlIG1hcHBpbmcgYW5kIGl0cyBjb3JyZXNwb25kaW5nCisgKiBKYXZhIGFubm90YXRpb24uCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiAKK3sKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBtYXBwaW5nJ3Mga2V5LgorCSAqLworCVN0cmluZyBnZXRLZXkoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBtYXBwaW5nJ3MgSmF2YSBhbm5vdGF0aW9uIG5hbWUuCisJICovCisJU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCk7CisJCisJLyoqCisJICogQnVpbGQgYSBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZS4gVXNlIHRoZSBzcGVjaWZpZWQKKwkgKiBmYWN0b3J5IGZvciBjcmVhdGlvbiBzbyBleHRlbmRlcnMgY2FuIHNpbXBseSBvdmVycmlkZSB0aGUgYXBwcm9wcmlhdGUKKwkgKiBjcmVhdGlvbiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZyBhIHByb3ZpZGVyIGZvciB0aGUgc2FtZSBrZXkuCisJICovCisJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSwgSnBhRmFjdG9yeSBmYWN0b3J5KTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1hcHBpbmcgcHJvdmlkZXIgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiB7QGxpbmsgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGV9IAorCSAqIGluIHRoZSBkZWZhdWx0IChpZ25vcmluZyBhbGwgbWFwcGluZyBhbm5vdGF0aW9ucykgY2FzZS4KKwkgKi8KKwlib29sZWFuIHRlc3REZWZhdWx0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbWFwcGluZyBwcm92aWRlciBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGdpdmVuIHtAbGluayBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZX0gCisJICogaW4gdGhlIHNwZWNpZmllZCAob2JzZXJ2aW5nIGFsbCBtYXBwaW5nIGFubm90YXRpb25zKSBjYXNlLgorCSAqLworCWJvb2xlYW4gdGVzdFNwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MGQ0ZjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci0KLS8qKgotICogTWFwIGEgc3RyaW5nIGtleSB0byBhIHR5cGUgbWFwcGluZyBhbmQgaXRzIGNvcnJlc3BvbmRpbmcKLSAqIEphdmEgYW5ub3RhdGlvbiBhZGFwdGVyLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIHsKLQotCS8qKgotCSAqIEEgdW5pcXVlIFN0cmluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBJSmF2YUF0dHJpYnV0ZU1hcHBpbmcga2V5IAotCSAqLwotCVN0cmluZyBnZXRLZXkoKTsKLQotCVN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCQotCS8qKgotCSAqIENyZWF0ZSBhbiB7QGxpbmsgSmF2YUF0dHJpYnV0ZU1hcHBpbmd9IGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlLiAgVXNlIHRoZSB7QGxpbmsgSnBhRmFjdG9yeX0KLQkgKiBmb3IgY3JlYXRpb24gc28gdGhhdCBleHRlbmRlcnMgY2FuIGNyZWF0ZSB0aGVpciBvd24ge0BsaW5rIEpwYUZhY3Rvcnl9IGluc3RlYWQgb2YgCi0JICogY3JlYXRpbmcgdGhlaXIgb3duIHtAbGluayBKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyfS4KLQkgKi8KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCmluZGV4IGRlNjllYjcuLmQ1MDU2ZmMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpAQCAtMjUsOCArMjUsMTIgQEAKIHsKIAlKYXZhQ29sdW1uIGdldENvbHVtbigpOwogCQotCXZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUpOworCXZvaWQgaW5pdGlhbGl6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUpOwogCQorCS8qKgorCSAqIFVwZGF0ZSB0aGUgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCiAJdm9pZCB1cGRhdGUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlKTsKIAkKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YzQxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciwgSmF2YUpwYUNvbnRleHROb2RlCit7CisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQorCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKTsKKwkKKwl2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqcnBtKTsKKwkKKwkvKioKKwkgKiBVcGRhdGUgdGhlIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KKwl2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQmFzZUVtYmVkZGVkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQmFzZUVtYmVkZGVkTWFwcGluZy5qYXZhCmluZGV4IDU4MzU2ZmYuLmQ2ZWMwODIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFCYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw3ICs5LDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKIAotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlRW1iZWRkZWRNYXBwaW5nOwogCiAvKioKQEAgLTIxLDE1ICsyMCw4IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcgZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZywgQmFzZUVtYmVkZGVkTWFwcGluZworcHVibGljIGludGVyZmFjZSBKYXZhQmFzZUVtYmVkZGVkTWFwcGluZworCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcsIEJhc2VFbWJlZGRlZE1hcHBpbmcKIHsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCi0JSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpOwotCisJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUJhc2ljTWFwcGluZy5qYXZhCmluZGV4IDFjNjhhNDUuLjhjMmZiODggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUJhc2ljTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUJhc2ljTWFwcGluZy5qYXZhCkBAIC0yMyw1ICsyMyw4IEBACiBwdWJsaWMgaW50ZXJmYWNlIEphdmFCYXNpY01hcHBpbmcKIAlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nLCBCYXNpY01hcHBpbmcsIEphdmFDb2x1bW5NYXBwaW5nCiB7Ci0JLy8gbm90aGluZyB5ZXQKKwkvLyoqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioKKwlKYXZhQ29udmVydGVyIGdldERlZmF1bHRDb252ZXJ0ZXIoKTsKKwlKYXZhQ29udmVydGVyIGdldFNwZWNpZmllZENvbnZlcnRlcigpOworCQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ2FzY2FkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ2FzY2FkZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTA0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFDYXNjYWRlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5SZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbjsKKworLyoqCisgKiAKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YUNhc2NhZGUgZXh0ZW5kcyBDYXNjYWRlCit7CisKKwl2b2lkIGluaXRpYWxpemUoUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gcmVsYXRpb25zaGlwTWFwcGluZyk7CisKKwl2b2lkIHVwZGF0ZShSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiByZWxhdGlvbnNoaXBNYXBwaW5nKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFDb2x1bW4uamF2YQppbmRleCBkMjA5ZDFkLi5jYjcxN2M1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFDb2x1bW4uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFDb2x1bW4uamF2YQpAQCAtMjMsMTEgKzIzLDEzIEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSmF2YUNvbHVtbiBleHRlbmRzIENvbHVtbiwgSmF2YUJhc2VDb2x1bW4KIHsKLQl2b2lkIGluaXRpYWxpemVGcm9tUmVzb3VyY2UoQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5SZXNvdXJjZSk7CisJdm9pZCBpbml0aWFsaXplKENvbHVtbkFubm90YXRpb24gcmVzb3VyY2VDb2x1bW4pOwogCQotCXZvaWQgdXBkYXRlKENvbHVtbkFubm90YXRpb24gY29sdW1uUmVzb3VyY2UpOwotCQotCWJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOworCS8qKgorCSAqIFVwZGF0ZSB0aGUgSmF2YUNvbHVtbiBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgQ29sdW1uQW5ub3RhdGlvbiAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KKwl2b2lkIHVwZGF0ZShDb2x1bW5Bbm5vdGF0aW9uIHJlc291cmNlQ29sdW1uKTsKIAkKIAlPd25lciBnZXRPd25lcigpOwogCS8qKgpAQCAtMzYsNyArMzgsNyBAQAogCSAqLwogCWludGVyZmFjZSBPd25lciBleHRlbmRzIEphdmFCYXNlQ29sdW1uLk93bmVyCiAJewotCQlDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtblJlc291cmNlKCk7CisJCUNvbHVtbkFubm90YXRpb24gZ2V0UmVzb3VyY2VDb2x1bW4oKTsKIAl9CiAKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YWJhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKKworLyoqCisgKiAKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCisgcHVibGljIGludGVyZmFjZSBKYXZhQ29udmVydGVyIGV4dGVuZHMgSmF2YUpwYUNvbnRleHROb2RlLCBDb252ZXJ0ZXIKK3sJCisJCisJLyoqCisJICogVXBkYXRlIHRoZSBKYXZhQ29udmVydGVyIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIAorCSAqIHJlc291cmNlIG1vZGVsIG9iamVjdC4gc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQorCSAqLworCXZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFEaXNjcmltaW5hdG9yQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFEaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKaW5kZXggYTMxZjFjOC4uYjIwMjUzOCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0yMyw4ICsyMywyMCBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uIGV4dGVuZHMgSmF2YU5hbWVkQ29sdW1uLCBEaXNjcmltaW5hdG9yQ29sdW1uCiB7CQotCXZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBlcnNpc3RlbnRSZXNvdXJjZSk7CisJdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIganJwbSk7CiAJCi0Jdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwZXJzaXN0ZW50UmVzb3VyY2UpOworCS8qKgorCSAqIFVwZGF0ZSB0aGUgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4gY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCisJdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqcnBtKTsKKwkJCisJLyoqCisJICogaW50ZXJmYWNlIGFsbG93aW5nIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKKwkgKi8KKwlpbnRlcmZhY2UgT3duZXIgZXh0ZW5kcyBKYXZhTmFtZWRDb2x1bW4uT3duZXIsIERpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXIKKwl7CisKKwl9CiAKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFFbWJlZGRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFFbWJlZGRhYmxlLmphdmEKaW5kZXggNWQ2N2YyMi4uMjFjYTcxYSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkYWJsZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDcgKzksNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwogCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKIAogLyoqCkBAIC0yNCw4ICsyMyw1IEBACiBwdWJsaWMgaW50ZXJmYWNlIEphdmFFbWJlZGRhYmxlCiAJZXh0ZW5kcyBKYXZhVHlwZU1hcHBpbmcsIEVtYmVkZGFibGUKIHsKLQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCk7Ci0JCi0JSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCk7CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkSWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZy5qYXZhCmluZGV4IDgxZWI0YzcuLjZlMjdlOWQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkSWRNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDcgKzksNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwogCiAvKioKQEAgLTIxLDkgKzIwLDcgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRW1iZWRkZWRJZE1hcHBpbmcgZXh0ZW5kcyBKYXZhQmFzZUVtYmVkZGVkTWFwcGluZywgRW1iZWRkZWRJZE1hcHBpbmcKK3B1YmxpYyBpbnRlcmZhY2UgSmF2YUVtYmVkZGVkSWRNYXBwaW5nCisJZXh0ZW5kcyBKYXZhQmFzZUVtYmVkZGVkTWFwcGluZywgRW1iZWRkZWRJZE1hcHBpbmcKIHsKLQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZy5qYXZhCmluZGV4IGVmOTY1ZDIuLjI5NGNmN2UgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksNyArOSw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7CiAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwogCiAvKioKQEAgLTIxLDkgKzIwLDcgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRW1iZWRkZWRNYXBwaW5nIGV4dGVuZHMgSmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcsIEVtYmVkZGVkTWFwcGluZworcHVibGljIGludGVyZmFjZSBKYXZhRW1iZWRkZWRNYXBwaW5nIAorCWV4dGVuZHMgSmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcsIEVtYmVkZGVkTWFwcGluZwogewotCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUVudGl0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW50aXR5LmphdmEKaW5kZXggNGY0ODE4ZS4uZTNmMzJjMiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW50aXR5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW50aXR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw3ICs5LDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwogCkBAIC0yMiw3ICsyMSw3IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUVudGl0eSBleHRlbmRzIEphdmFUeXBlTWFwcGluZywgRW50aXR5LCBKYXZhR2VuZXJhdG9ySG9sZGVyCitwdWJsaWMgaW50ZXJmYWNlIEphdmFFbnRpdHkgZXh0ZW5kcyBKYXZhVHlwZU1hcHBpbmcsIEVudGl0eQogewogCUphdmFUYWJsZSBnZXRUYWJsZSgpOwogCQpAQCAtMzMsNiArMzIsNyBAQAogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCUxpc3RJdGVyYXRvcjxKYXZhU2Vjb25kYXJ5VGFibGU+IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwogCUphdmFTZWNvbmRhcnlUYWJsZSBhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgaW5kZXgpOworCUphdmFTZWNvbmRhcnlUYWJsZSBhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgpOwogCQogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCUxpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucygpOwpAQCAtNDEsMzEgKzQxLDEzIEBACiAJTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CiAJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7CiAJCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKTsKKworCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwogCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CiAJCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFOYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMoKTsKLQlKYXZhTmFtZWRRdWVyeSBhZGROYW1lZFF1ZXJ5KGludCBpbmRleCk7CisJSmF2YVF1ZXJ5Q29udGFpbmVyIGdldFF1ZXJ5Q29udGFpbmVyKCk7CiAJCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFOYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQlKYXZhTmFtZWROYXRpdmVRdWVyeSBhZGROYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCk7Ci0JCi0JSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotCQotCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucygpOworCUphdmFHZW5lcmF0b3JDb250YWluZXIgZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCk7CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmNmZDFjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW51bWVyYXRlZENvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnVtZXJhdGVkQ29udmVydGVyOworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KKyBwdWJsaWMgaW50ZXJmYWNlIEphdmFFbnVtZXJhdGVkQ29udmVydGVyIGV4dGVuZHMgSmF2YUNvbnZlcnRlciwgRW51bWVyYXRlZENvbnZlcnRlcgorewkKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRlZFZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFHZW5lcmF0ZWRWYWx1ZS5qYXZhCmluZGV4IGYxYjYwMmUuLjhlMjZmZjUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRlZFZhbHVlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhR2VuZXJhdGVkVmFsdWUuamF2YQpAQCAtMjMsNyArMjMsOCBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFHZW5lcmF0ZWRWYWx1ZSBleHRlbmRzIEdlbmVyYXRlZFZhbHVlLCBKYXZhSnBhQ29udGV4dE5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgSmF2YUdlbmVyYXRlZFZhbHVlCisJZXh0ZW5kcyBHZW5lcmF0ZWRWYWx1ZSwgSmF2YUpwYUNvbnRleHROb2RlCiB7CiAKIAkvKioKQEAgLTMxLDggKzMyLDEyIEBACiAJICovCiAJVGV4dFJhbmdlIGdldEdlbmVyYXRvclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAJCi0Jdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZSk7CisJdm9pZCBpbml0aWFsaXplKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24pOwogCQotCXZvaWQgdXBkYXRlKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZSk7CisJLyoqCisJICogVXBkYXRlIHRoZSBKYXZhR2VuZXJhdGVkVmFsdWUgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KKwl2b2lkIHVwZGF0ZShHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKTsKIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhR2VuZXJhdG9yLmphdmEKaW5kZXggZmNlZTM5OC4uY2NjNGQzYyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhR2VuZXJhdG9yLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhR2VuZXJhdG9yLmphdmEKQEAgLTE0LDE1ICsxNCwxNCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogCiAvKioKLSAqIAotICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBKYXZhR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yLCBKYXZhSnBhQ29udGV4dE5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgSmF2YUdlbmVyYXRvciAKKwlleHRlbmRzIEdlbmVyYXRvciwgSmF2YUpwYUNvbnRleHROb2RlCiB7CiAJVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRvckNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhR2VuZXJhdG9yQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmZTdiNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRvckNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3JDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFHZW5lcmF0b3JDb250YWluZXIgZXh0ZW5kcyBHZW5lcmF0b3JDb250YWluZXIsIEphdmFKcGFDb250ZXh0Tm9kZQoreworCUphdmFTZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpOworCisJSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CisKKwlKYXZhVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKTsKKworCUphdmFUYWJsZUdlbmVyYXRvciBhZGRUYWJsZUdlbmVyYXRvcigpOworCQorCXZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pOworCQorCS8qKgorCSAqIFVwZGF0ZSB0aGUgSmF2YUdlbmVyYXRvckNvbnRhaW5lciBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KKwl2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhR2VuZXJhdG9ySG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFHZW5lcmF0b3JIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBjZTNlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFHZW5lcmF0b3JIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3JIb2xkZXI7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFHZW5lcmF0b3JIb2xkZXIgZXh0ZW5kcyBHZW5lcmF0b3JIb2xkZXIKLXsKLQlKYXZhU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQotCUphdmFTZXF1ZW5jZUdlbmVyYXRvciBhZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0JSmF2YVRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCk7Ci0KLQlKYXZhVGFibGVHZW5lcmF0b3IgYWRkVGFibGVHZW5lcmF0b3IoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZy5qYXZhCmluZGV4IDUwNmJmYTQuLjRmYmVlNjggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTIwLDggKzIwLDE1IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUlkTWFwcGluZyBleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nLCBJZE1hcHBpbmcsIEphdmFDb2x1bW5NYXBwaW5nLCBKYXZhR2VuZXJhdG9ySG9sZGVyCitwdWJsaWMgaW50ZXJmYWNlIEphdmFJZE1hcHBpbmcKKwlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nLCBJZE1hcHBpbmcsIEphdmFDb2x1bW5NYXBwaW5nCiB7CisJLy8qKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqCisJSmF2YUdlbmVyYXRvckNvbnRhaW5lciBnZXRHZW5lcmF0b3JDb250YWluZXIoKTsKKwkKKwlKYXZhQ29udmVydGVyIGdldERlZmF1bHRDb252ZXJ0ZXIoKTsKKwlKYXZhQ29udmVydGVyIGdldFNwZWNpZmllZENvbnZlcnRlcigpOworCiAJSmF2YUdlbmVyYXRlZFZhbHVlIGdldEdlbmVyYXRlZFZhbHVlKCk7CiAJSmF2YUdlbmVyYXRlZFZhbHVlIGFkZEdlbmVyYXRlZFZhbHVlKCk7CiB9IApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pbkNvbHVtbi5qYXZhCmluZGV4IDAyNjI2N2MuLmVmMTc2OWYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5Db2x1bW4uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTMsNyArMTMsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247CiAKIC8qKgotICogCisgKiBKYXZhIGpvaW4gY29sdW1uCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMSwyMiArMjEsMjYgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBKYXZhSm9pbkNvbHVtbiBleHRlbmRzIEpvaW5Db2x1bW4sIEphdmFCYXNlSm9pbkNvbHVtbiwgSmF2YUJhc2VDb2x1bW4KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YUpvaW5Db2x1bW4KKwlleHRlbmRzIEpvaW5Db2x1bW4sIEphdmFCYXNlSm9pbkNvbHVtbiwgSmF2YUJhc2VDb2x1bW4KIHsKLQl2b2lkIGluaXRpYWxpemVGcm9tUmVzb3VyY2UoSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbik7Ci0JCi0JYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JCi0Jdm9pZCB1cGRhdGUoSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbik7CisJLyoqCisJICogSW5pdGlhbGl6ZSB0aGUgam9pbiBjb2x1bW4gZnJvbSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24uCisJICovCisJdm9pZCBpbml0aWFsaXplKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5Bbm5vdGF0aW9uKTsKKworCS8qKgorCSAqIFVwZGF0ZSB0aGUgam9pbiBjb2x1bW4gZnJvbSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24uCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpCisJICovCisJdm9pZCB1cGRhdGUoSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbkFubm90YXRpb24pOwogCiAJT3duZXIgZ2V0T3duZXIoKTsKIAkKLQkvKioKLQkgKiBpbnRlcmZhY2UgYWxsb3dpbmcgam9pbiBjb2x1bW5zIHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzCi0JICogKGUuZy4gMToxIG1hcHBpbmdzIGFuZCBqb2luIHRhYmxlcykKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIgZXh0ZW5kcyBKb2luQ29sdW1uLk93bmVyLCBKYXZhQmFzZUpvaW5Db2x1bW4uT3duZXIsIEphdmFCYXNlQ29sdW1uLk93bmVyCisJaW50ZXJmYWNlIE93bmVyCisJCWV4dGVuZHMgSm9pbkNvbHVtbi5Pd25lciwgSmF2YUJhc2VKb2luQ29sdW1uLk93bmVyLCBKYXZhQmFzZUNvbHVtbi5Pd25lcgogCXsKLQkJLy8gbm90aGluZyB5ZXQKKwkJLy8gbm90aGluZz8KIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTE0Y2UwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWV4dGVuZHMgSmF2YVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwlKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBnZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViMzVjYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKKworcHVibGljIGludGVyZmFjZSBKYXZhSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneSAKKwlleHRlbmRzIAorCQlKYXZhSnBhQ29udGV4dE5vZGUsCisJCUphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5Cit7CisKKwl2b2lkIGluaXRpYWxpemUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSk7CisJCisJdm9pZCB1cGRhdGUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSk7CisJCisJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucygpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkNjRiMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKKworLyoqCisgKiBUaGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5fQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneQorCWV4dGVuZHMgSmF2YUpvaW5pbmdTdHJhdGVneSwgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneQoreworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMoKTsKKwkKKwlKYXZhSm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbigpOworCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkKKwlKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZS5qYXZhCmluZGV4IDc3NDZhYjEuLmRhMzUxZDggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTExLDEwICsxMSwxMCBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwogCiAvKioKLSAqIAorICogSmF2YSBqb2luIHRhYmxlCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMiw0MCArMjIsNDAgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBKYXZhSm9pblRhYmxlIGV4dGVuZHMgSm9pblRhYmxlLCBKYXZhSnBhQ29udGV4dE5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgSmF2YUpvaW5UYWJsZQorCWV4dGVuZHMgSm9pblRhYmxlLCBKYXZhSnBhQ29udGV4dE5vZGUKIHsKLQl2b2lkIGluaXRpYWxpemVGcm9tUmVzb3VyY2UoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSk7Ci0JCi0Jdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSk7Ci0JCi0JYm9vbGVhbiBpc1NwZWNpZmllZCgpOwotCQotCQotCS8vKioqKioqKioqKioqKioqKioqIGNvdmFyaWFudCBvdmVycmlkZXMgKioqKioqKioqKioqKioqKioqKgorCXZvaWQgaW5pdGlhbGl6ZShKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24pOworCisJdm9pZCB1cGRhdGUoSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uKTsKKworCisJLy8gKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioKIAogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMoKTsKLQkKKwogCUphdmFKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCisKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCisKIAlKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JCi0JCisKKwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gaW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCisKIAlKYXZhSm9pbkNvbHVtbiBnZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQkKKwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCisKIAlKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpOwogCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cygpOwotCQorCiAJSmF2YVVuaXF1ZUNvbnN0cmFpbnQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlM2Y5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFKb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCisJZXh0ZW5kcyBKYXZhUmVsYXRpb25zaGlwUmVmZXJlbmNlLCBKb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisJSmF2YUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSBnZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwZDA3YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKKworLyoqCisgKiBUaGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3l9CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kKKwlleHRlbmRzIEphdmFKb2luaW5nU3RyYXRlZ3ksIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneQoreworCUphdmFKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBqb2luIHRhYmxlIGFubm90YXRpb24sIHVzZSBhIG51bGwgb2JqZWN0IGluc3RlYWQgb2YgcmV0dXJuaW5nIG51bGwKKwkgKiBpZiB0aGUgam9pbiB0YWJsZSBhbm5vdGF0aW9uIGRvZXMgbm90IGV4aXN0LgorCSAqLworCUpvaW5UYWJsZUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWU2MTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pbmluZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luaW5nU3RyYXRlZ3k7CisKK3B1YmxpYyBpbnRlcmZhY2UgSmF2YUpvaW5pbmdTdHJhdGVneQorCWV4dGVuZHMgSmF2YUpwYUNvbnRleHROb2RlLCBKb2luaW5nU3RyYXRlZ3kKK3sKKwl2b2lkIGluaXRpYWxpemUoKTsKKwkKKwl2b2lkIHVwZGF0ZSgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhSnBhQ29udGV4dE5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUpwYUNvbnRleHROb2RlLmphdmEKaW5kZXggMDMwMTIzMy4uMmZjZWE3MiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhSnBhQ29udGV4dE5vZGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFKcGFDb250ZXh0Tm9kZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE2LDYgKzE2LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKIAogLyoqCiAgKiAKQEAgLTQxLDcgKzQyLDcgQEAKIAkvKioKIAkgKiBBZGRzIHRvIHRoZSBsaXN0IG9mIGN1cnJlbnQgdmFsaWRhdGlvbiBtZXNzYWdlcwogCSAqLwotCXZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCXZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogCiAJVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFMb2JDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YUxvYkNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NWZjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFMb2JDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTG9iQ29udmVydGVyOworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KKyBwdWJsaWMgaW50ZXJmYWNlIEphdmFMb2JDb252ZXJ0ZXIgZXh0ZW5kcyBKYXZhQ29udmVydGVyLCBMb2JDb252ZXJ0ZXIKK3sJCisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmcuamF2YQppbmRleCBjOWM2ZTY4Li5iZDhiYjYxIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nLmphdmEKQEAgLTEwLDkgKzEwLDEwIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKIAogLyoqCi0gKiAKKyAqIFRoZSBqYXZhIHJlcHJlc2VudGF0aW9uIG9mIGEge0BsaW5rIE1hbnlUb01hbnlNYXBwaW5nfQogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjMsNSArMjQsNyBAQAogcHVibGljIGludGVyZmFjZSBKYXZhTWFueVRvTWFueU1hcHBpbmcKIAlleHRlbmRzIEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcsIE1hbnlUb01hbnlNYXBwaW5nCiB7Ci0JLy8gbm90aGluZyB5ZXQKKwlNYW55VG9NYW55QW5ub3RhdGlvbiBnZXRNYXBwaW5nQW5ub3RhdGlvbigpOworCQorCUphdmFNYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MjkyODAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFNYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwUmVmZXJlbmNlOworCisvKioKKyAqIFJlcHJlc2VudHMgdGhlIHtAbGluayBSZWxhdGlvbnNoaXBSZWZlcmVuY2V9IG9mIGEge0BsaW5rIEphdmFNYW55VG9NYW55TWFwcGluZ30KKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YU1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UKKwlleHRlbmRzIE1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIEphdmFPd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlLCAKKwkJSmF2YUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmcuamF2YQppbmRleCBlZjM0MTFiLi4wOGEwYTRjIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZy5qYXZhCkBAIC05LDExICs5LDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7CiAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247CiAKIC8qKgotICogCisgKiBUaGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBNYW55VG9PbmVNYXBwaW5nfQogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjQsMTAgKzI0LDcgQEAKIHB1YmxpYyBpbnRlcmZhY2UgSmF2YU1hbnlUb09uZU1hcHBpbmcKIAlleHRlbmRzIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLCBNYW55VG9PbmVNYXBwaW5nCiB7Ci0JLy8gKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioKKwlNYW55VG9PbmVBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CiAJCi0JTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucygpOwotCi0JTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCisJSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2NDEzMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlOworCitwdWJsaWMgaW50ZXJmYWNlIEphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UKKwlleHRlbmRzIE1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgCisJCUphdmFKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZQoreworCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0NzY4OAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKKworLyoqCisgKiBUaGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneX0KKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5CisJZXh0ZW5kcyBKYXZhSm9pbmluZ1N0cmF0ZWd5LCBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneQoreworCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzcy5qYXZhCmluZGV4IDk3YjhkYjIuLmQ5NWIxYzcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw3ICs5LDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7CiAKIC8qKgpAQCAtMjQsNyArMjMsNCBAQAogcHVibGljIGludGVyZmFjZSBKYXZhTWFwcGVkU3VwZXJjbGFzcwogCWV4dGVuZHMgSmF2YVR5cGVNYXBwaW5nLCBNYXBwZWRTdXBlcmNsYXNzCiB7Ci0JSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotCQotCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucygpOwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQppbmRleCBmYjQ3Zjg4Li4wYWJmOTBlIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpAQCAtMjAsOCArMjAsOCBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgZXh0ZW5kcyBKYXZhUmVsYXRpb25zaGlwTWFwcGluZywgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCitwdWJsaWMgaW50ZXJmYWNlIEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKKwlleHRlbmRzIEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLCBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKIHsKLQotCUphdmFKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCk7CisJCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFOYW1lZE5hdGl2ZVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFOYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKaW5kZXggMWZiNWI4YS4uMTVhM2QyMSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTmFtZWROYXRpdmVRdWVyeS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU5hbWVkTmF0aXZlUXVlcnkuamF2YQpAQCAtMjgsOCArMjgsMTIgQEAKIAogCUxpc3RJdGVyYXRvcjxKYXZhUXVlcnlIaW50PiBoaW50cygpOwogCi0Jdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5UmVzb3VyY2UpOworCXZvaWQgaW5pdGlhbGl6ZShOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiByZXNvdXJjZVF1ZXJ5KTsKIAotCXZvaWQgdXBkYXRlKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5UmVzb3VyY2UpOworCS8qKgorCSAqIFVwZGF0ZSB0aGUgSmF2YU5hbWVkTmF0aXZlUXVlcnkgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIAorCSAqIHJlc291cmNlIG1vZGVsIG9iamVjdC4gc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQorCSAqLworCXZvaWQgdXBkYXRlKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIHJlc291cmNlUXVlcnkpOwogCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFOYW1lZFF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFOYW1lZFF1ZXJ5LmphdmEKaW5kZXggMzNmMDU4Ny4uNzhlNzdiYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhTmFtZWRRdWVyeS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU5hbWVkUXVlcnkuamF2YQpAQCAtMjgsOCArMjgsMTIgQEAKIAogCUxpc3RJdGVyYXRvcjxKYXZhUXVlcnlIaW50PiBoaW50cygpOwogCi0Jdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKE5hbWVkUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5UmVzb3VyY2UpOworCXZvaWQgaW5pdGlhbGl6ZShOYW1lZFF1ZXJ5QW5ub3RhdGlvbiByZXNvdXJjZU5hbWVkUXVlcnkpOwogCi0Jdm9pZCB1cGRhdGUoTmFtZWRRdWVyeUFubm90YXRpb24gcXVlcnlSZXNvdXJjZSk7CisJLyoqCisJICogVXBkYXRlIHRoZSBKYXZhTmFtZWRRdWVyeSBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgTmFtZWRRdWVyeUFubm90YXRpb24gCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCisJdm9pZCB1cGRhdGUoTmFtZWRRdWVyeUFubm90YXRpb24gcmVzb3VyY2VOYW1lZFF1ZXJ5KTsKIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZy5qYXZhCmluZGV4IDFiZGIxMjMuLjkwM2MxYWMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nLmphdmEKQEAgLTEwLDkgKzEwLDEwIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247CiAKIC8qKgotICogCisgKiBUaGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBPbmVUb01hbnlNYXBwaW5nfQogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjMsNSArMjQsNyBAQAogcHVibGljIGludGVyZmFjZSBKYXZhT25lVG9NYW55TWFwcGluZwogCWV4dGVuZHMgSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZywgT25lVG9NYW55TWFwcGluZwogewotCS8vIG5vdGhpbmcgeWV0CisJT25lVG9NYW55QW5ub3RhdGlvbiBnZXRNYXBwaW5nQW5ub3RhdGlvbigpOworCQorCUphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkN2RhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSB7QGxpbmsgUmVsYXRpb25zaGlwUmVmZXJlbmNlfSBvZiBhIHtAbGluayBKYXZhT25lVG9NYW55TWFwcGluZ30KKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWV4dGVuZHMgT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLCBKYXZhT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwKKwkJSmF2YUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nLmphdmEKaW5kZXggOGQ4YTFhZC4uODg0ODY5NSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nLmphdmEKQEAgLTksMTEgKzksMTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKIAotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247CiAKIC8qKgotICogCisgKiBUaGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBPbmVUb09uZU1hcHBpbmd9CiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yNCwxNCArMjQsNyBAQAogcHVibGljIGludGVyZmFjZSBKYXZhT25lVG9PbmVNYXBwaW5nCiAJZXh0ZW5kcyBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZywgT25lVG9PbmVNYXBwaW5nCiB7Ci0JLy8gKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioKKwlPbmVUb09uZUFubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKIAkKLQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zKCk7Ci0KLQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCi0JSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7CisJSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOwkKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZGU2ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CisKKy8qKgorICogUmVwcmVzZW50cyB0aGUge0BsaW5rIFJlbGF0aW9uc2hpcFJlZmVyZW5jZX0gb2YgYSB7QGxpbmsgSmF2YU9uZVRvT25lTWFwcGluZ30KKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlCisJZXh0ZW5kcyBPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgSmF2YU93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIAorCQlKYXZhSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIAorCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFPd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFPd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiYzkxNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YU93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Pd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YU93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UKKwlleHRlbmRzIEphdmFSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIE93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sJCisJT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCisJSmF2YU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IGdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKaW5kZXggMTcxMjRhNy4uZmY3NWI5NSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw0MCArMTAsMTAzIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CiAKIC8qKgotICogCi0gKiAKKyAqIEphdmEgcGVyc2lzdGVudCBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KQorICogPHA+CiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBleHRlbmRzIFBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFKcGFDb250ZXh0Tm9kZQorcHVibGljIGludGVyZmFjZSBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZQorCWV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YUpwYUNvbnRleHROb2RlCiB7Ci0JCisJLyoqCisJICogY292YXJpYW50IG92ZXJyaWRlCisJICovCiAJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0TWFwcGluZygpOwotCQotCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkKLQlKYXZhQXR0cmlidXRlTWFwcGluZyBnZXREZWZhdWx0TWFwcGluZygpOwotCQotCUphdmFUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpOwotCQotCUphdmFQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpOwotCQotCXZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7CiAKLQl2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCisJLyoqCisJICogY292YXJpYW50IG92ZXJyaWRlCisJICovCisJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyBkZWZhdWx0IG1hcHBpbmcuCisJICovCisJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0RGVmYXVsdE1hcHBpbmcoKTsKKworCS8qKgorCSAqIFVwZGF0ZSB0aGUgY29udGV4dCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSB0byBtYXRjaCBpdHMKKwkgKiByZXNvdXJjZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSAocGFzc2VkIGluIHRvIHRoZSBjb25zdHJ1Y3RvcikuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpCisJICovCisJdm9pZCB1cGRhdGUoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgInJlc291cmNlIiBwZXJzaXN0ZW50IGF0dHJpYnV0ZS4KKwkgKi8KIAlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtYXBwaW5nIGlzIHRoZSBhdHRyaWJ1dGUncyBkZWZhdWx0IG1hcHBpbmcuCisJICovCisJYm9vbGVhbiBtYXBwaW5nSXNEZWZhdWx0KEphdmFBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcpOworCiAJLyoqCiAJICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBjb250YWlucyB0aGUgZ2l2ZW4gb2Zmc2V0IGludG8gdGhlIHRleHQgZmlsZS4KIAkgKi8KIAlib29sZWFuIGNvbnRhaW5zKGludCBvZmZzZXQsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGVtYmVkZGFibGUgKHR5cGUgbWFwcGluZykgY29ycmVzcG9uZGluZyB0byB0aGUgcGVyc2lzdGVudAorCSAqIGF0dHJpYnV0ZSdzIHR5cGUuIFJldHVybiBudWxsIGlmIGl0IGlzIG5vdCBmb3VuZC4KKwkgKi8KKwlFbWJlZGRhYmxlIGdldEVtYmVkZGFibGUoKTsKKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgYSBmaWVsZCAoYXMgb3Bwb3NlZCB0byBhIHByb3BlcnR5KS4KKwkgKi8KKwlib29sZWFuIGlzRmllbGQoKTsKKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgYSBwcm9wZXJ0eSAoYXMgb3Bwb3NlZCB0byBhIGZpZWxkKS4KKwkgKi8KKwlib29sZWFuIGlzUHJvcGVydHkoKTsKKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgJ3B1YmxpYycsIHdoaWNoIGlzIHByb2JsZW1hdGljIGZvciBmaWVsZHMuCisJICovCisJYm9vbGVhbiBpc1B1YmxpYygpOworCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyAnZmluYWwnLCB3aGljaCBpcyBwcm9ibGVtYXRpYy4KKwkgKi8KKwlib29sZWFuIGlzRmluYWwoKTsKKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUncyB0eXBlIGlzIHZhbGlkIGZvciBhIGRlZmF1bHQgQmFzaWMgbWFwcGluZy4KKwkgKi8KKwlib29sZWFuIHR5cGVJc0Jhc2ljKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIHR5cGUgbmFtZSBpZiBpdCBpcyB2YWxpZCBhcyBhIHRhcmdldCBlbnRpdHkgdHlwZQorCSAqIChpLmUuIHRoZSB0eXBlIGlzIG5laXRoZXIgYW4gYXJyYXkgbm9yIGEgImNvbnRhaW5lciIpLgorCSAqLworCVN0cmluZyBnZXRTaW5nbGVSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSgpOworCisJLyoqCisJICogSWYgdGhlIGF0dHJpYnV0ZSdzIHR5cGUgaXMgYW4gYXBwcm9wcmlhdGUgImNvbnRhaW5lciIgdHlwZSwKKwkgKiByZXR1cm4gdGhlIHR5cGUgcGFyYW1ldGVyIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSB0YXJnZXQgZW50aXR5LgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IGEgY29udGFpbmVyIG9yIGlmIHRoZSB0eXBlCisJICogcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCBhcyBhIHRhcmdldCBlbnRpdHkgdHlwZSAoaS5lLiBpdCBpcyBlaXRoZXIKKwkgKiBhbiBhcnJheSBvciBhICJjb250YWluZXIiKS4KKwkgKi8KKwlTdHJpbmcgZ2V0TXVsdGlSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSgpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50VHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudFR5cGUuamF2YQppbmRleCBlYWQzNzVlLi5mOGZlZjI2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50VHlwZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVBlcnNpc3RlbnRUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNDEgKzEwLDU3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogCiAvKioKLSAqIAotICogCisgKiBDb250ZXh0IEphdmEgcGVyc2lzdGVudCB0eXBlLgorICogPHA+CiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUGVyc2lzdGVudFR5cGUgZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZSwgSmF2YUpwYUNvbnRleHROb2RlCitwdWJsaWMgaW50ZXJmYWNlIEphdmFQZXJzaXN0ZW50VHlwZQorCWV4dGVuZHMgUGVyc2lzdGVudFR5cGUsIEphdmFKcGFDb250ZXh0Tm9kZQogeworCS8vICoqKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqCisKIAlKYXZhVHlwZU1hcHBpbmcgZ2V0TWFwcGluZygpOwogCQogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcygpOwogCQogCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQotCS8qKgotCSAqIFJlc29sdmUgYW5kIHJldHVybiB0aGUgYXR0cmlidXRlIG5hbWVkIDxjb2RlPmF0dHJpYnV0ZU5hbWU8L2NvZGU+IGlmIGl0Ci0JICogaXMgZGlzdGluY3QgYW5kIGV4aXN0cyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpcyB0eXBlCi0JICovCi0JUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlQXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKKwkKKwkKKwkvLyAqKioqKioqKioqIEphdmEgKioqKioqKioqKgogCQogCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBhdHRyaWJ1dGUgaW4gdGhpcyBwZXJzaXN0ZW50IHR5cGUgY29udGFpbnMgYSBtYXBwaW5nIGFubm90YXRpb24KLQkgKiBAcmV0dXJuCisJICogUmV0dXJuIHdoZXRoZXIgYW55IGF0dHJpYnV0ZSBpbiB0aGlzIHBlcnNpc3RlbnQgdHlwZSBpcyBhbm5vdGF0ZWQKIAkgKi8KLQlib29sZWFuIGhhc0FueUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9ucygpOwotCisJYm9vbGVhbiBoYXNBbnlBbm5vdGF0ZWRBdHRyaWJ1dGVzKCk7CiAJCi0Jdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSk7CisJLyoqCisJICogUmV0dXJuIHRoZSBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZS4KKwkgKi8KKwlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7CiAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisKKwkvLyAqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioKKworCS8qKgorCSAqIFN5bmNocm9uaXplIHRoZSBKYXZhIHBlcnNpc3RlbnQgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCkKKwkgKi8KKwl2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KTsKKworCS8qKgorCSAqIFJlLXN5bmNocm9uaXplIHRoZSBKYXZhIHBlcnNpc3RlbnQgdHlwZSB3aXRoIGl0cyByZXNvdXJjZSB0eXBlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKQorCSAqLworCXZvaWQgdXBkYXRlKCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCmluZGV4IGQ4ZDljMjYuLjYyZjA2YWMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQpAQCAtMjMsOCArMjMsMTIgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbiwgSmF2YUJhc2VKb2luQ29sdW1uCiB7Ci0Jdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbik7CisJdm9pZCBpbml0aWFsaXplKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbik7CiAJCisJLyoqCisJICogVXBkYXRlIHRoZSBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KIAl2b2lkIHVwZGF0ZShQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcHJpbWFyeUtleUpvaW5Db2x1bW4pOwogCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDYzYzlhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWV4dGVuZHMgSmF2YVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGdldFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2M5YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisKKy8qKgorICogVGhlIGphdmEgcmVwcmVzZW50YXRpb24gb2YgYSB7QGxpbmsgUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3l9CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneQorCWV4dGVuZHMgSmF2YUpvaW5pbmdTdHJhdGVneSwgUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kKK3sKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCisJcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUXVlcnlDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVF1ZXJ5Q29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxMjRiZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVF1ZXJ5Q29udGFpbmVyLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworCitwdWJsaWMgaW50ZXJmYWNlIEphdmFRdWVyeUNvbnRhaW5lciBleHRlbmRzIFF1ZXJ5Q29udGFpbmVyLCBKYXZhSnBhQ29udGV4dE5vZGUKK3sKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcygpOworCisJSmF2YU5hbWVkUXVlcnkgYWRkTmFtZWRRdWVyeShpbnQgaW5kZXgpOworCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJTGlzdEl0ZXJhdG9yPEphdmFOYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKKworCUphdmFOYW1lZE5hdGl2ZVF1ZXJ5IGFkZE5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4KTsKKwkKKwl2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqcnBtKTsKKwkKKwkvKioKKwkgKiBVcGRhdGUgdGhlIEphdmFHZW5lcmF0b3JDb250YWluZXIgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCisJdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqcnBtKTsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVF1ZXJ5SGludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUXVlcnlIaW50LmphdmEKaW5kZXggMjEwMThkNi4uNDUyODMzYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUXVlcnlIaW50LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUXVlcnlIaW50LmphdmEKQEAgLTIzLDcgKzIzLDExIEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSmF2YVF1ZXJ5SGludCBleHRlbmRzIFF1ZXJ5SGludCwgSmF2YUpwYUNvbnRleHROb2RlCiB7Ci0Jdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKFF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50KTsKKwl2b2lkIGluaXRpYWxpemUoUXVlcnlIaW50QW5ub3RhdGlvbiBxdWVyeUhpbnRSZXNvdXJjZSk7CiAJCi0Jdm9pZCB1cGRhdGUoUXVlcnlIaW50QW5ub3RhdGlvbiBxdWVyeUhpbnQpOworCS8qKgorCSAqIFVwZGF0ZSB0aGUgSmF2YVF1ZXJ5SGludCBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgUXVlcnlIaW50QW5ub3RhdGlvbiAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KKwl2b2lkIHVwZGF0ZShRdWVyeUhpbnRBbm5vdGF0aW9uIHF1ZXJ5SGludFJlc291cmNlKTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQppbmRleCAxZDc5MWU4Li4xZTU3NGUwIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCkBAIC0yMyw1ICsyMyw1IEBACiBwdWJsaWMgaW50ZXJmYWNlIEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nCiAJZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZywgUmVsYXRpb25zaGlwTWFwcGluZwogewotCS8vIG5vdGhpbmcgeWV0CisJSmF2YUNhc2NhZGUgZ2V0Q2FzY2FkZSgpOwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjZjY2M4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YVJlbGF0aW9uc2hpcFJlZmVyZW5jZSAKKwlleHRlbmRzIEphdmFKcGFDb250ZXh0Tm9kZSwgUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisJSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOworCQorCXZvaWQgaW5pdGlhbGl6ZSgpOworCQorCXZvaWQgdXBkYXRlKCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVNlY29uZGFyeVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFTZWNvbmRhcnlUYWJsZS5qYXZhCmluZGV4IGViMWY3NmUuLmZhYjRhOTcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVNlY29uZGFyeVRhYmxlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhU2Vjb25kYXJ5VGFibGUuamF2YQpAQCAtMjUsOSArMjUsMTMgQEAKIHB1YmxpYyBpbnRlcmZhY2UgSmF2YVNlY29uZGFyeVRhYmxlIGV4dGVuZHMgU2Vjb25kYXJ5VGFibGUsIEphdmFKcGFDb250ZXh0Tm9kZQogewogCi0Jdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSk7CisJdm9pZCBpbml0aWFsaXplKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZVJlc291cmNlKTsKIAkKLQl2b2lkIHVwZGF0ZShTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUpOworCS8qKgorCSAqIFVwZGF0ZSB0aGUgSmF2YVNlY29uZGFyeVRhYmxlIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCisJdm9pZCB1cGRhdGUoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UpOwogCiAKIAkvLyoqKioqKioqKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVNlcXVlbmNlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFTZXF1ZW5jZUdlbmVyYXRvci5qYXZhCmluZGV4IDc4NjdiOWUuLjQyODMyNGUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVNlcXVlbmNlR2VuZXJhdG9yLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhU2VxdWVuY2VHZW5lcmF0b3IuamF2YQpAQCAtMjUsOCArMjUsMTIgQEAKIAlleHRlbmRzIEphdmFHZW5lcmF0b3IsIFNlcXVlbmNlR2VuZXJhdG9yCiB7CiAKLQl2b2lkIGluaXRpYWxpemVGcm9tUmVzb3VyY2UoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIGdlbmVyYXRvcik7CisJdm9pZCBpbml0aWFsaXplKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3JSZXNvdXJjZSk7CiAJCi0Jdm9pZCB1cGRhdGUoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIGdlbmVyYXRvcik7CisJLyoqCisJICogVXBkYXRlIHRoZSBKYXZhU2VxdWVuY2VHZW5lcmF0b3IgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KKwl2b2lkIHVwZGF0ZShTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yUmVzb3VyY2UpOwogCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKaW5kZXggMmM5Mjk2NC4uMDM0YjcyNSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpAQCAtOSwyNyArOSwxNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7CiAKIC8qKgotICogCi0gKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCiAgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIGV4dGVuZHMgSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcsIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKK3B1YmxpYyBpbnRlcmZhY2UgSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKKwlleHRlbmRzIEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLCBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCiB7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucygpOwogCQotCUphdmFKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQotCUphdmFKb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVN0cnVjdHVyZU5vZGVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFTdHJ1Y3R1cmVOb2Rlcy5qYXZhCmluZGV4IDUzNGRlNzguLjFmNjI4ZGEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVN0cnVjdHVyZU5vZGVzLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhU3RydWN0dXJlTm9kZXMuamF2YQpAQCAtMjMsMTEgKzIzLDExIEBACiBwdWJsaWMgaW50ZXJmYWNlIEphdmFTdHJ1Y3R1cmVOb2RlcyAKIHsKIAlTdHJpbmcgQ09NUElMQVRJT05fVU5JVF9JRCA9IAotCQlKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuamF2YS5jb21waWxhdGlvblVuaXQiOworCQlKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuamF2YS5jb21waWxhdGlvblVuaXQiOyAvLyROT04tTkxTLTEkCiAJCiAJU3RyaW5nIFBFUlNJU1RFTlRfVFlQRV9JRCA9IAotCQlKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuamF2YS5wZXJzaXN0ZW50VHlwZSI7CisJCUpwdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5qYXZhLnBlcnNpc3RlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAogCQogCVN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9JRCA9IAotCQlKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuamF2YS5wZXJzaXN0ZW50QXR0cmlidXRlIjsKKwkJSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLmphdmEucGVyc2lzdGVudEF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFUYWJsZS5qYXZhCmluZGV4IGRhNzRmZWUuLjZlMDUxMWQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVRhYmxlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVGFibGUuamF2YQpAQCAtMjQsOSArMjQsMTMgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBKYXZhVGFibGUgZXh0ZW5kcyBUYWJsZSwgSmF2YUpwYUNvbnRleHROb2RlCiB7Ci0Jdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGVyc2lzdGVudFJlc291cmNlKTsKKwl2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqcnBtKTsKIAkKLQl2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBlcnNpc3RlbnRSZXNvdXJjZSk7CisJLyoqCisJICogVXBkYXRlIHRoZSBKYXZhVGFibGUgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCisJdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqcnBtKTsKIAogCQogCS8vKioqKioqKioqKioqKioqKioqIGNvdmFyaWFudCBvdmVycmlkZXMgKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVGFibGVHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVRhYmxlR2VuZXJhdG9yLmphdmEKaW5kZXggMjVmZGQxOS4uOWExMjczYSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVGFibGVHZW5lcmF0b3IuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFUYWJsZUdlbmVyYXRvci5qYXZhCkBAIC0yNSw5ICsyNSwxMyBAQAogcHVibGljIGludGVyZmFjZSBKYXZhVGFibGVHZW5lcmF0b3IKIAlleHRlbmRzIEphdmFHZW5lcmF0b3IsIFRhYmxlR2VuZXJhdG9yCiB7Ci0Jdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3IpOworCXZvaWQgaW5pdGlhbGl6ZShUYWJsZUdlbmVyYXRvckFubm90YXRpb24gcmVzb3VyY2VHZW5lcmF0b3IpOwogCQotCXZvaWQgdXBkYXRlKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3IpOworCS8qKgorCSAqIFVwZGF0ZSB0aGUgSmF2YVRhYmxlR2VuZXJhdG9yIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBUYWJsZUdlbmVyYXRvckFubm90YXRpb24gCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCisJdm9pZCB1cGRhdGUoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHJlc291cmNlR2VuZXJhdG9yKTsKIAkKIAkKIAkvLyoqKioqKioqKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVRlbXBvcmFsQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFUZW1wb3JhbENvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMGY0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFUZW1wb3JhbENvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKKworLyoqCisgKiAKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCisgcHVibGljIGludGVyZmFjZSBKYXZhVGVtcG9yYWxDb252ZXJ0ZXIgZXh0ZW5kcyBKYXZhQ29udmVydGVyLCBUZW1wb3JhbENvbnZlcnRlcgorewkKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVR5cGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFUeXBlTWFwcGluZy5qYXZhCmluZGV4IDM3ZGU1NjcuLjJjOGYzNGYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVR5cGVNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVHlwZU1hcHBpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw2ICsxMCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKIApAQCAtMjQsMTkgKzI1LDIzIEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSmF2YVR5cGVNYXBwaW5nIGV4dGVuZHMgVHlwZU1hcHBpbmcsIEphdmFKcGFDb250ZXh0Tm9kZQogewotCXZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlKTsKKwl2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCk7CiAJCi0Jdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSk7Ci0JCisJLyoqCisJICogVXBkYXRlIHRoZSBKYXZhVHlwZU1hcHBpbmcgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIAorCSAqIHJlc291cmNlIG1vZGVsIG9iamVjdC4gc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQorCSAqLworCXZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpOworCiAJU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCk7CiAJCi0JSXRlcmF0b3I8U3RyaW5nPiBjb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCk7CisJSXRlcmF0b3I8U3RyaW5nPiBzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCk7CiAJCisJCisJLy8gKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioKKwogCUphdmFQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpOwogCQogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMoKTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKKwlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU1hcHBpbmc+IGF0dHJpYnV0ZU1hcHBpbmdzKCk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFUeXBlTWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQzMmMxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OworCisvKioKKyAqIE1hcCBhIHN0cmluZyBrZXkgdG8gYSB0eXBlIG1hcHBpbmcgYW5kIGl0cyBjb3JyZXNwb25kaW5nCisgKiBKYXZhIGFubm90YXRpb24uCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gCit7CisJLyoqCisJICogUmV0dXJuIHRoZSB0eXBlIG1hcHBpbmcncyBrZXkuCisJICovCisJU3RyaW5nIGdldEtleSgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB0eXBlIG1hcHBpbmcncyBKYXZhIGFubm90YXRpb24gbmFtZS4KKwkgKi8KKwlTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKTsKKworCS8qKgorCSAqIEJ1aWxkIGEgSmF2YSB0eXBlIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4gVXNlIHRoZSBzcGVjaWZpZWQKKwkgKiBmYWN0b3J5IGZvciBjcmVhdGlvbiBzbyBleHRlbmRlcnMgY2FuIHNpbXBseSBvdmVycmlkZSB0aGUgYXBwcm9wcmlhdGUKKwkgKiBjcmVhdGlvbiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZyBhIHByb3ZpZGVyIGZvciB0aGUgc2FtZSBrZXkuCisJICovCisJcHVibGljIEphdmFUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHR5cGUsIEpwYUZhY3RvcnkgZmFjdG9yeSk7CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtYXBwaW5nIGRlZmluaXRpb24gc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiB7QGxpbmsgSmF2YVBlcnNpc3RlbnRUeXBlfSwgCisJICogY29uc2lkZXJpbmcgYWxsIGFubm90YXRpb25zLgorCSAqLworCWJvb2xlYW4gdGVzdChKYXZhUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVHlwZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVHlwZU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGU5ZTk0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLQotLyoqCi0gKiBNYXAgYSBzdHJpbmcga2V5IHRvIGEgdHlwZSBtYXBwaW5nIGFuZCBpdHMgY29ycmVzcG9uZGluZwotICogSmF2YSBhbm5vdGF0aW9uIGFkYXB0ZXIuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyIHsKLQotCS8qKgotCSAqIEEgdW5pcXVlIFN0cmluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBJSmF2YVR5cGVNYXBwaW5nIGtleSAKLQkgKi8KLQlTdHJpbmcgZ2V0S2V5KCk7Ci0KLQlTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gSUphdmFUeXBlTWFwcGluZyBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZS4gIFVzZSB0aGUgSUpwYUZhY3RvcnkKLQkgKiBmb3IgY3JlYXRpb24gc28gdGhhdCBleHRlbmRlcnMgY2FuIGNyZWF0ZSB0aGVpciBvd24gSUpwYUZhY3RvcnkgaW5zdGVhZCBvZiAKLQkgKiBjcmVhdGluZyB0aGVpciBvd24gdHlwZU1hcHBpbmdQcm92aWRlci4KLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBqcGFGYWN0b3J5Ci0JICovCi0JcHVibGljIEphdmFUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVW5pcXVlQ29uc3RyYWludC5qYXZhCmluZGV4IDRhMjZlZjIuLmMxNTdlMmIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVVuaXF1ZUNvbnN0cmFpbnQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFVbmlxdWVDb25zdHJhaW50LmphdmEKQEAgLTI1LDUgKzI1LDkgQEAKIHsKIAl2b2lkIGluaXRpYWxpemUoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pOwogCQorCS8qKgorCSAqIFVwZGF0ZSB0aGUgSmF2YVVuaXF1ZUNvbnN0cmFpbnQgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIAorCSAqIHJlc291cmNlIG1vZGVsIG9iamVjdC4gc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQorCSAqLwogCXZvaWQgdXBkYXRlKFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFWZXJzaW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmcuamF2YQppbmRleCAxMDc3YjFmLi44MWM0NGU0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL0phdmFWZXJzaW9uTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvSmF2YVZlcnNpb25NYXBwaW5nLmphdmEKQEAgLTIzLDUgKzIzLDggQEAKIHB1YmxpYyBpbnRlcmZhY2UgSmF2YVZlcnNpb25NYXBwaW5nCiAJZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZywgVmVyc2lvbk1hcHBpbmcsIEphdmFDb2x1bW5NYXBwaW5nCiB7Ci0JLy8gbm90aGluZyB5ZXQKKwkvLyoqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioKKwlKYXZhQ29udmVydGVyIGdldERlZmF1bHRDb252ZXJ0ZXIoKTsKKwlKYXZhQ29udmVydGVyIGdldFNwZWNpZmllZENvbnZlcnRlcigpOworCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL051bGxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL051bGxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjMTgyOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvTnVsbERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CisKKy8qKgorICogVGhpcyBtYXBwaW5nIGRlZmluaXRpb24gaW1wbGVtZW50YXRpb24gaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgZGVmYXVsdCBtYXBwaW5nIGZvciAKKyAqIGEgamF2YSBhdHRyaWJ1dGUgd2hlbiBubyBvdGhlciBtYXBwaW5nIGFwcGxpZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgorCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVsbERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IE51bGxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIE51bGxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogRGVmYXVsdCBtYXBwaW5ncyBzaG91bGQgbmV2ZXIgYmUgbnVsbAorCSAqLworCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcocGFyZW50KTsKKwl9CisJCisJLyoqCisJICogVGhpcyBpcyB0eXBpY2FsbHkgdGhlIGZpbmFsIHRlc3QsIHNvIGl0IHNob3VsZCBhbHdheXMgYXBwbHkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB0ZXN0RGVmYXVsdChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwkvKioKKwkgKiBPYnZpb3VzbHksIGFsd2F5cyBmYWxzZQorCSAqLworCXB1YmxpYyBib29sZWFuIHRlc3RTcGVjaWZpZWQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9OdWxsSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvamF2YS9OdWxsSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTdkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL051bGxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworCisvKioKKyAqIFRoaXMgbWFwcGluZyBkZWZpbml0aW9uIGltcGxlbWVudGF0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nLgorICogQSBKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcgc2hvdWxkIGJlIHVzZWQgd2hlbiBubyAibWFwcGluZyIgYW5ub3RhdGlvbgorICogZXhpc3RzIG9uIGEgSmF2YSB0eXBlLiAKKyAqLworcHVibGljIGNsYXNzIE51bGxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uCisJaW1wbGVtZW50cyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVsbEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJCW5ldyBOdWxsSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgTnVsbEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBKYXZhVHlwZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFOdWxsVHlwZU1hcHBpbmcocGFyZW50KTsKKwl9CisJCisJLyoqCisJICogVGhpcyBpcyB0eXBpY2FsbHkgdGhlIGZpbmFsIHRlc3QsIHNvIGl0IHNob3VsZCBhbHdheXMgYXBwbHkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB0ZXN0KEphdmFQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL051bGxTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L2phdmEvTnVsbFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NGMwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9qYXZhL051bGxTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CisKKy8qKgorICogVGhpcyBtYXBwaW5nIGRlZmluaXRpb24gaW1wbGVtZW50YXRpb24gaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgc3BlY2lmaWVkIG1hcHBpbmcgZm9yIAorICogYSBqYXZhIGF0dHJpYnV0ZSB3aGVuIG5vIG90aGVyIG1hcHBpbmcgYXBwbGllcy4KKyAqLworcHVibGljIGNsYXNzIE51bGxTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KKwlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IE51bGxTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgTnVsbFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIFRoZXJlIGlzIG5vIHNwZWNpZmllZCBtYXBwaW5nIGluIHRoaXMgY2FzZSwgYXR0cmlidXRlcyBzaG91bGQgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0CisJICovCisJcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogT2J2aW91c2x5IGZhbHNlCisJICovCisJcHVibGljIGJvb2xlYW4gdGVzdERlZmF1bHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIFRoaXMgaXMgdHlwaWNhbGx5IHRoZSBmaW5hbCB0ZXN0LCBzbyBpdCBzaG91bGQgYWx3YXlzIGFwcGx5CisJICovCisJcHVibGljIGJvb2xlYW4gdGVzdFNwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7CisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9FbnRpdHlNYXBwaW5ncy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL0VudGl0eU1hcHBpbmdzLmphdmEKaW5kZXggYmI4N2FhNC4uZjljOWM5ZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL0VudGl0eU1hcHBpbmdzLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL0VudGl0eU1hcHBpbmdzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTIsODIgKzEyLDkzIEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5SG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGVSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW50VHlwZUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNhdGFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOwogCiAvKioKLSAqIAotICogCisgKiBDb250ZXh0IDxjb2RlPm9ybS54bWw8L2NvZGU+IGVudGl0eSBtYXBwaW5ncy4KKyAqIDxwPgogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKICAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW50aXR5TWFwcGluZ3MgZXh0ZW5kcyBPcm1KcGFDb250ZXh0Tm9kZSwgSnBhU3RydWN0dXJlTm9kZSwgUXVlcnlIb2xkZXIKK3B1YmxpYyBpbnRlcmZhY2UgRW50aXR5TWFwcGluZ3MgCisJZXh0ZW5kcyBNYXBwaW5nRmlsZVJvb3QsIEpwYVN0cnVjdHVyZU5vZGUsIFBlcnNpc3RlbnRUeXBlLk93bmVyLCBQZXJzaXN0ZW50VHlwZUNvbnRhaW5lcgogeworCVhtbEVudGl0eU1hcHBpbmdzIGdldFhtbEVudGl0eU1hcHBpbmdzKCk7CiAJCiAJU3RyaW5nIGdldFZlcnNpb24oKTsKIAkJCiAJU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CiAJdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pOwotCQlTdHJpbmcgREVTQ1JJUFRJT05fUFJPUEVSVFkgPSAiZGVzY3JpcHRpb25Qcm9wZXJ0eSI7CisJCVN0cmluZyBERVNDUklQVElPTl9QUk9QRVJUWSA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKIAogCVN0cmluZyBnZXRQYWNrYWdlKCk7CiAJdm9pZCBzZXRQYWNrYWdlKFN0cmluZyBuZXdQYWNrYWdlKTsKLQkJU3RyaW5nIFBBQ0tBR0VfUFJPUEVSVFkgPSAicGFja2FnZVByb3BlcnR5IjsKKwkJU3RyaW5nIFBBQ0tBR0VfUFJPUEVSVFkgPSAicGFja2FnZSI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkU2NoZW1hIGlmIG5vdCBudWxsLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0U2NoZW1hLgotCSAqLwotCVN0cmluZyBnZXRTY2hlbWEoKTsKLQlTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlTdHJpbmcgREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkgPSAiZGVmYXVsdFNjaGVtYVByb3BlcnR5IjsKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIG5ld1NwZWNpZmllZFNjaGVtYSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZID0gInNwZWNpZmllZFNjaGVtYVByb3BlcnR5IjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkQ2F0YWxvZyBpZiBub3QgbnVsbCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdENhdGFsb2cuCi0JICovCi0JU3RyaW5nIGdldENhdGFsb2coKTsKLQlTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSA9ICJkZWZhdWx0Q2F0YWxvZ1Byb3BlcnR5IjsKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCXZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgbmV3U3BlY2lmaWVkQ2F0YWxvZyk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSA9ICJzcGVjaWZpZWRDYXRhbG9nUHJvcGVydHkiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWRBY2Nlc3MgaWYgbm90IG51bGwsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHRBY2Nlc3MuCisJICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgYWNjZXNzIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQKKwkgKiBhY2Nlc3MuCiAJICovCiAJQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKTsKLQlBY2Nlc3NUeXBlIGdldERlZmF1bHRBY2Nlc3MoKTsKLQkJU3RyaW5nIERFRkFVTFRfQUNDRVNTX1BST1BFUlRZID0gImRlZmF1bHRBY2Nlc3NQcm9wZXJ0eSI7CiAJQWNjZXNzVHlwZSBnZXRTcGVjaWZpZWRBY2Nlc3MoKTsKLQl2b2lkIHNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlIG5ld1NwZWNpZmllZEFjY2Vzcyk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZID0gInNwZWNpZmllZEFjY2Vzc1Byb3BlcnR5IjsKKwl2b2lkIHNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlIGFjY2Vzcyk7CisJCVN0cmluZyBTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZID0gInNwZWNpZmllZEFjY2VzcyI7IC8vJE5PTi1OTFMtMSQKKwlBY2Nlc3NUeXBlIGdldERlZmF1bHRBY2Nlc3MoKTsKKwkJU3RyaW5nIERFRkFVTFRfQUNDRVNTX1BST1BFUlRZID0gImRlZmF1bHRBY2Nlc3MiOyAvLyROT04tTkxTLTEkCiAKLQkJCisJU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjYXRhbG9nIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQKKwkgKiBjYXRhbG9nLgorCSAqLworCVN0cmluZyBnZXRDYXRhbG9nKCk7CisJU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKTsKKwl2b2lkIHNldFNwZWNpZmllZENhdGFsb2coU3RyaW5nIGNhdGFsb2cpOworCQlTdHJpbmcgU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKTsKKwkJU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSA9ICJkZWZhdWx0Q2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKKwlDYXRhbG9nIGdldERiQ2F0YWxvZygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc2NoZW1hIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQKKwkgKiBzY2hlbWEuCisJICovCisJU3RyaW5nIGdldFNjaGVtYSgpOworCVN0cmluZyBnZXRTcGVjaWZpZWRTY2hlbWEoKTsKKwl2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgc2NoZW1hKTsKKwkJU3RyaW5nIFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkgPSAic3BlY2lmaWVkU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCk7CisJCVN0cmluZyBERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSA9ICJkZWZhdWx0U2NoZW1hIjsgLy8kTk9OLU5MUy0xJAorCVNjaGVtYSBnZXREYlNjaGVtYSgpOworCiAJUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKIAkKLQkKLQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IG9ybVBlcnNpc3RlbnRUeXBlcygpOwotCWludCBvcm1QZXJzaXN0ZW50VHlwZXNTaXplKCk7Ci0JT3JtUGVyc2lzdGVudFR5cGUgYWRkT3JtUGVyc2lzdGVudFR5cGUoU3RyaW5nIG1hcHBpbmdLZXksIFN0cmluZyBjbGFzc05hbWUpOwotCXZvaWQgcmVtb3ZlT3JtUGVyc2lzdGVudFR5cGUoaW50IGluZGV4KTsKLQl2b2lkIHJlbW92ZU9ybVBlcnNpc3RlbnRUeXBlKE9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlKTsKLQkvL3ZvaWQgbW92ZU9ybVBlcnNpc3RlbnRUeXBlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKKwlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IHBlcnNpc3RlbnRUeXBlcygpOworCWludCBwZXJzaXN0ZW50VHlwZXNTaXplKCk7CisJT3JtUGVyc2lzdGVudFR5cGUgYWRkUGVyc2lzdGVudFR5cGUoU3RyaW5nIG1hcHBpbmdLZXksIFN0cmluZyBjbGFzc05hbWUpOworCXZvaWQgcmVtb3ZlUGVyc2lzdGVudFR5cGUoaW50IGluZGV4KTsKKwl2b2lkIHJlbW92ZVBlcnNpc3RlbnRUeXBlKE9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKTsKKwkvL3ZvaWQgbW92ZVBlcnNpc3RlbnRUeXBlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKIAlib29sZWFuIGNvbnRhaW5zUGVyc2lzdGVudFR5cGUoU3RyaW5nIGNsYXNzTmFtZSk7Ci0JCVN0cmluZyBQRVJTSVNURU5UX1RZUEVTX0xJU1QgPSAicGVyc2lzdGVudFR5cGVzIjsKKwkJU3RyaW5nIFBFUlNJU1RFTlRfVFlQRVNfTElTVCA9ICJwZXJzaXN0ZW50VHlwZXMiOyAvLyROT04tTkxTLTEkCiAJCi0KIAlMaXN0SXRlcmF0b3I8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9ycygpOwogCWludCBzZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCk7CiAJT3JtU2VxdWVuY2VHZW5lcmF0b3IgYWRkU2VxdWVuY2VHZW5lcmF0b3IoaW50IGluZGV4KTsKIAl2b2lkIHJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKGludCBpbmRleCk7CiAJdm9pZCByZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcihPcm1TZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcik7CiAJdm9pZCBtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQlTdHJpbmcgU0VRVUVOQ0VfR0VORVJBVE9SU19MSVNUID0gInNlcXVlbmNlR2VuZXJhdG9yc0xpc3QiOworCQlTdHJpbmcgU0VRVUVOQ0VfR0VORVJBVE9SU19MSVNUID0gInNlcXVlbmNlR2VuZXJhdG9ycyI7IC8vJE5PTi1OTFMtMSQKIAogCUxpc3RJdGVyYXRvcjxPcm1UYWJsZUdlbmVyYXRvcj4gdGFibGVHZW5lcmF0b3JzKCk7CiAJaW50IHRhYmxlR2VuZXJhdG9yc1NpemUoKTsKQEAgLTk1LDM3ICsxMDYsMzggQEAKIAl2b2lkIHJlbW92ZVRhYmxlR2VuZXJhdG9yKGludCBpbmRleCk7CiAJdm9pZCByZW1vdmVUYWJsZUdlbmVyYXRvcihPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcik7CiAJdm9pZCBtb3ZlVGFibGVHZW5lcmF0b3IoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SU19MSVNUID0gInRhYmxlR2VuZXJhdG9yc0xpc3QiOworCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SU19MSVNUID0gInRhYmxlR2VuZXJhdG9ycyI7IC8vJE5PTi1OTFMtMSQKIAotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMoKTsKLQlpbnQgbmFtZWRRdWVyaWVzU2l6ZSgpOwotCU9ybU5hbWVkUXVlcnkgYWRkTmFtZWRRdWVyeShpbnQgaW5kZXgpOwotCXZvaWQgcmVtb3ZlTmFtZWRRdWVyeShpbnQgaW5kZXgpOwotCXZvaWQgbW92ZU5hbWVkUXVlcnkoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcygpOwotCWludCBuYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCk7Ci0JT3JtTmFtZWROYXRpdmVRdWVyeSBhZGROYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCk7Ci0Jdm9pZCByZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCk7Ci0Jdm9pZCBtb3ZlTmFtZWROYXRpdmVRdWVyeShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0KLQkJCisJT3JtUXVlcnlDb250YWluZXIgZ2V0UXVlcnlDb250YWluZXIoKTsKIAkKLQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CiAJCiAJLyoqCiAJICogUmV0dXJuIHRoZSB7QGxpbmsgT3JtUGVyc2lzdGVudFR5cGUpIGxpc3RlZCBpbiB0aGlzIG1hcHBpbmcgZmlsZQotCSAqIHdpdGggdGhlIGdpdmVuIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUuICBSZXR1cm4gbnVsbCBpZiBub25lIGV4aXN0cy4KKwkgKiB3aXRoIHRoZSBnaXZlbiB0eXBlIG5hbWUuIFJldHVybiBudWxsIGlmIG5vbmUgZXhpc3RzLgogCSAqLwotCU9ybVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKKwlPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgdHlwZU5hbWUpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgZGVmYXVsdCBwYWNrYWdlIHRvIGJlIHVzZWQgZm9yIHBlcnNpc3RlbnQgdHlwZXMgaW4gdGhpcyBjb250ZXh0CisJICovCisJU3RyaW5nIGdldERlZmF1bHRQZXJzaXN0ZW50VHlwZVBhY2thZ2UoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgbWV0YWRhdGEgY29tcGxldGUgdmFsdWUgZm9yIHBlcnNpc3RlbnQgdHlwZXMgaW4gdGhpcyBjb250ZXh0CisJICovCisJYm9vbGVhbiBpc0RlZmF1bHRQZXJzaXN0ZW50VHlwZU1ldGFkYXRhQ29tcGxldGUoKTsKIAkKIAl2b2lkIGNoYW5nZU1hcHBpbmcoT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUsIE9ybVR5cGVNYXBwaW5nIG9sZE1hcHBpbmcsIE9ybVR5cGVNYXBwaW5nIG5ld01hcHBpbmcpOwogCQogCS8vICoqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCi0Jdm9pZCB1cGRhdGUoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpOworCQorCS8qKgorCSAqIFVwZGF0ZSB0aGUgRW50aXR5TWFwcGluZ3MgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIFhtbEVudGl0eU1hcHBpbmdzIAorCSAqIHJlc291cmNlIG1vZGVsIG9iamVjdC4gc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQorCSAqLworCXZvaWQgdXBkYXRlKCk7CisJCiAJCiAJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL01hcHBpbmdGaWxlRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL01hcHBpbmdGaWxlRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOTgzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vTWFwcGluZ0ZpbGVEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CisKKy8qKgorICogQSBKcGFQbGF0Zm9ybSBjYW4gc3VwcG9ydCBtdWx0aXBsZSBtYXBwaW5nIGZpbGVzLiAgRWFjaCB3aWxsCisgKiBoYXZlIGEgdW5pcXVlIHJlc291cmNlIHR5cGUgYW5kIG11c3QgYmUgZGVmaW5lZCB3aXRoIGEgbWFwcGluZyBmaWxlIGRlZmluaXRpb24uCisgKiBVc2UgdGhlIHhtbCBjb250ZXh0IG5vZGUgZmFjdG9yeSB0byBidWlsZCB0aGUgbWFwcGluZyBmaWxlIGl0c2VsZiBhcyB3ZWxsIGFzIAorICogdGhlIG9iamVjdHMgdGhhdCBhcmUgYSBwYXJ0IG9mIHRoZSBtYXBwaW5nIGZpbGUuCisgKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWFwcGluZ0ZpbGVEZWZpbml0aW9uIGV4dGVuZHMgUmVzb3VyY2VEZWZpbml0aW9uCit7CisJLyoqCisJICogUmV0dXJuIHRoZSBmYWN0b3J5IGZvciBidWlsZGluZyB4bWwgcmVzb3VyY2Ugbm9kZXMKKwkgKi8KKwlFRmFjdG9yeSBnZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBmYWN0b3J5IGZvciBidWlsZGluZyB4bWwgY29udGV4dCBub2RlcworCSAqLworCVhtbENvbnRleHROb2RlRmFjdG9yeSBnZXRDb250ZXh0Tm9kZUZhY3RvcnkoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9OdWxsT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9OdWxsT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTZjODMzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL051bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZzsKKworcHVibGljIGNsYXNzIE51bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IE51bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIE51bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcocGFyZW50LCAoWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcpIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFJlc291cmNlTWFwcGluZyhPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKG9ybVR5cGVNYXBwaW5nLCBqYXZhQXR0cmlidXRlTWFwcGluZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKaW5kZXggMzIyYWVmOS4uODkxOTgzOCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksOCArOSw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKIAotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CiAKIC8qKgpAQCAtMjIsMTggKzIyLDE1IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQXNzb2NpYXRpb25PdmVycmlkZSBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGUsIE9ybUpwYUNvbnRleHROb2RlCitwdWJsaWMgaW50ZXJmYWNlIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgZXh0ZW5kcyBBc3NvY2lhdGlvbk92ZXJyaWRlLCBYbWxDb250ZXh0Tm9kZQogewotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucygpOworCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CisJCisJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCk7CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gZGVmYXVsdEpvaW5Db2x1bW5zKCk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQotCU9ybUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCisJLyoqCisJICogVXBkYXRlIHRoZSBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIAorCSAqIHJlc291cmNlIG1vZGVsIG9iamVjdC4gc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQorCSAqLwogCXZvaWQgdXBkYXRlKFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5Yzg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIsIFhtbENvbnRleHROb2RlCit7CisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkKKwlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSk7CisJCisJdm9pZCB1cGRhdGUoKTsKKwkKKwlPd25lciBnZXRPd25lcigpOworCQorCWludGVyZmFjZSBPd25lciBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuT3duZXIKKwl7CQkKKwkJT3JtVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2ZDAwMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOworCisvKioKKyAqIEFuIDxjb2RlPkFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U8L2NvZGU+IGlzIGEgdHlwZSBvZiAKKyAqIHtAbGluayBSZWxhdGlvbnNoaXBSZWZlcmVuY2V9IHRoYXQgbWF5IHV0aWxpemUgYSB7QGxpbmsgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneX0uCisgKiBUaGlzIGNhbm5vdCBiZSBhbiBPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UgYmVjYXVzZSByZWZlcmVuY2VkIG1hcHBpbmcgY29tZXMKKyAqIGZyb20gYW5vdGhlciBjbGFzcywgdGhlIGNsYXNzIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCB0aGUgYXNzb2NpYXRpb24gb3ZlcnJpZGUKKyAqIHBvaW50cyB0byBieSBuYW1lLgorICogPHA+CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcKKyAqLworcHVibGljIGludGVyZmFjZSBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlIAorCWV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgWG1sQ29udGV4dE5vZGUKK3sKKwlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKKworCU9ybUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kgZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQorCXZvaWQgdXBkYXRlKFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeGFvKSA7CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU1hcHBpbmcuamF2YQppbmRleCAyNWYxMGM1Li5mMjE2ZGZkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1BdHRyaWJ1dGVNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsOCArMTAsOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIApAQCAtMjQsMTggKzI0LDE2IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQXR0cmlidXRlTWFwcGluZyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcsIE9ybUpwYUNvbnRleHROb2RlCitwdWJsaWMgaW50ZXJmYWNlIE9ybUF0dHJpYnV0ZU1hcHBpbmcgZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nLCBYbWxDb250ZXh0Tm9kZQogewogCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQorCVhtbEF0dHJpYnV0ZU1hcHBpbmcgZ2V0UmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKCk7CiAKIAlTdHJpbmcgZ2V0TmFtZSgpOwogCXZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSk7Ci0JU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZVByb3BlcnR5IjsKKwlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAogCi0KLQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCVN0cmluZyBKQVZBX1BFUlNJU1RFTlRfQVRUUklCVVRFX1BST1BFUlRZID0gImphdmFQZXJzaXN0ZW50QXR0cmlidXRlUHJvcGVydHkiOwotCQogCS8qKgogCSAqIEF0dHJpYnV0ZXMgYXJlIGEgc2VxdWVuY2UgaW4gdGhlIG9ybSBzY2hlbWEuIFdlIG11c3Qga2VlcAogCSAqIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgaW4gdGhlIGFwcHJvcHJpYXRlIG9yZGVyIHNvIHRoZSB3dHAgeG1sIApAQCAtNDgsMTAgKzQ2LDkgQEAKIAkgKi8KIAlpbnQgZ2V0WG1sU2VxdWVuY2UoKTsKIAotCXZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZyk7CisJdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwoQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpOwogCQotCVhtbEF0dHJpYnV0ZU1hcHBpbmcgYWRkVG9SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpOwotCisJdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcyk7CiAKIAl2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpOwogCkBAIC03Niw4ICs3MywxOSBAQAogCXZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1PbmVUb09uZU1hcHBpbmcoT3JtT25lVG9PbmVNYXBwaW5nIG9sZE1hcHBpbmcpOwogCiAJdm9pZCBpbml0aWFsaXplRnJvbU9ybU1hbnlUb01hbnlNYXBwaW5nKE9ybU1hbnlUb01hbnlNYXBwaW5nIG9sZE1hcHBpbmcpOwotCisJCiAJYm9vbGVhbiBjb250YWlucyhpbnQgdGV4dE9mZnNldCk7CiAKIAlUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7CisJCisJVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKTsKKwkKKwkvLyoqKioqKioqKioqKioqKioqKiogaW5pdGlhbGl6YXRpb24vdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKgorCisJLyoqCisJICogVXBkYXRlIHRoZSBPcm1BdHRyaWJ1dGVNYXBwaW5nIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KKwl2b2lkIHVwZGF0ZSgpOworCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNmNlODEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKKworLyoqCisgKiBQYXJ0IG9mIG1lY2hhbmlzbSB0byBleHRlbmQgdGhlIHR5cGVzIG9mIE9STSBhdHRyaWJ1dGUgbWFwcGluZ3MuCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLyoqCisJICogUmV0dXJuIHRoZSBtYXBwaW5nIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm92aWRlcgorCSAqIEBzZWUge0BsaW5rIE1hcHBpbmdLZXlzfQorCSAqLworCVN0cmluZyBnZXRLZXkoKTsKKwkKKwkvKioKKwkgKiBCdWlsZCBhIHJlc291cmNlIG1hcHBpbmcKKwkgKi8KKwlYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpOworCQorCS8qKgorCSAqIEJ1aWxkIGEgdmlydHVhbCByZXNvdXJjZSBtYXBwaW5nCisJICovCisJWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFZpcnR1YWxSZXNvdXJjZU1hcHBpbmcoCisJCQlPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgCisJCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZywgCisJCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSk7CisJCisJLyoqCisJICogQnVpbGQgYSBjb250ZXh0IG1hcHBpbmcKKwkgKi8KKwlPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkQ29udGV4dE1hcHBpbmcoCisJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgCisJCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCisJCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSk7CQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTA0NjIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQlTdHJpbmcgZ2V0S2V5KCk7Ci0JCi0JT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZEF0dHJpYnV0ZU1hcHBpbmcoSnBhRmFjdG9yeSBmYWN0b3J5LCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1BdHRyaWJ1dGVPdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKaW5kZXggODE2NDZmNS4uNzljN2I2ZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKQEAgLTEwLDYgKzEwLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwogCiAvKioKQEAgLTIxLDkgKzIyLDEzIEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQXR0cmlidXRlT3ZlcnJpZGUgZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZSwgT3JtSnBhQ29udGV4dE5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgT3JtQXR0cmlidXRlT3ZlcnJpZGUgZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZSwgWG1sQ29udGV4dE5vZGUKIHsKIAlPcm1Db2x1bW4gZ2V0Q29sdW1uKCk7CiAKKwkvKioKKwkgKiBVcGRhdGUgdGhlIE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBYbWxBdHRyaWJ1dGVPdmVycmlkZSAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KIAl2b2lkIHVwZGF0ZShYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjU1MTNhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47CisKK3B1YmxpYyBpbnRlcmZhY2UgT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciwgWG1sQ29udGV4dE5vZGUKK3sKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcygpOworCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQkKKwlPcm1BdHRyaWJ1dGVPdmVycmlkZSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKTsKKwkKKwl2b2lkIHVwZGF0ZSgpOworCQorCXZvaWQgaW5pdGlhbGl6ZUZyb21BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcihPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvbGRDb250YWluZXIpOworCisJT3duZXIgZ2V0T3duZXIoKTsKKwkKKwlpbnRlcmZhY2UgT3duZXIgZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lcgorCXsJCQorCQlPcm1UeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpOworCQkKKwkJLyoqCisJCSAqIEJ1aWxkIGEgdmlydHVhbCB4bWwgY29sdW1uIGJhc2VkIG9uIHRoZSBvdmVycmlkYWJsZSBjb2x1bW4uCisJCSAqLworCQlYbWxDb2x1bW4gYnVpbGRWaXJ0dWFsWG1sQ29sdW1uKENvbHVtbiBvdmVycmlkYWJsZUNvbHVtbiwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGJvb2xlYW4gaXNNZXRhZGF0YUNvbXBsZXRlKTsKKworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQmFzZUVtYmVkZGVkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQppbmRleCA1ODRiNjljLi5mOTBkZTNhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQmFzZUVtYmVkZGVkTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1CYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw3ICs5LDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VFbWJlZGRlZE1hcHBpbmc7CiAKIC8qKgpAQCAtMjMsMTIgKzIyLDYgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBPcm1CYXNlRW1iZWRkZWRNYXBwaW5nIGV4dGVuZHMgQmFzZUVtYmVkZGVkTWFwcGluZywgT3JtQXR0cmlidXRlTWFwcGluZwogewotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwogCi0JT3JtQXR0cmlidXRlT3ZlcnJpZGUgZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUJhc2ljTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUJhc2ljTWFwcGluZy5qYXZhCmluZGV4IDEzZjkwYjEuLmM3MmZiMTYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1CYXNpY01hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQmFzaWNNYXBwaW5nLmphdmEKQEAgLTEwLDcgKzEwLDYgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7CiAKIC8qKgogICogCkBAIC0yMyw3ICsyMiw5IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgT3JtQmFzaWNNYXBwaW5nIGV4dGVuZHMgQmFzaWNNYXBwaW5nLCBPcm1BdHRyaWJ1dGVNYXBwaW5nLCBPcm1Db2x1bW5NYXBwaW5nCiB7Ci0Jdm9pZCBpbml0aWFsaXplKFhtbEJhc2ljIGJhc2ljKTsKKwkKKwkvLyoqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioKKwlPcm1Db252ZXJ0ZXIgZ2V0RGVmYXVsdENvbnZlcnRlcigpOworCU9ybUNvbnZlcnRlciBnZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKTsKIAotCXZvaWQgdXBkYXRlKFhtbEJhc2ljIGJhc2ljKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQ2FzY2FkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUNhc2NhZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njc3ZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUNhc2NhZGUuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5DYXNjYWRlOworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBPcm1DYXNjYWRlIGV4dGVuZHMgQ2FzY2FkZQoreworCXZvaWQgaW5pdGlhbGl6ZUZyb20oQ2FzY2FkZSBvbGRDYXNjYWRlKTsKKworCXZvaWQgdXBkYXRlKCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Db2x1bW4uamF2YQppbmRleCBhOTY3MDVlLi4wMDA4MjY4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQ29sdW1uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUNvbHVtbi5qYXZhCkBAIC0yOCwxOSArMjgsMjQgQEAKIAkKIAl2b2lkIGluaXRpYWxpemVGcm9tKENvbHVtbiBvbGRDb2x1bW4pOwogCXZvaWQgaW5pdGlhbGl6ZShYbWxDb2x1bW4gY29sdW1uKTsKKwkKKwkvKioKKwkgKiBVcGRhdGUgdGhlIE9ybUNvbHVtbiBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgWG1sQ29sdW1uIAorCSAqIHJlc291cmNlIG1vZGVsIG9iamVjdC4gc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQorCSAqLwogCXZvaWQgdXBkYXRlKFhtbENvbHVtbiBjb2x1bW4pOwogCi0JCS8qKgorCS8qKgogCSAqIGludGVyZmFjZSBhbGxvd2luZyBjb2x1bW5zIHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzCiAJICogKGUuZy4gYmFzaWMgbWFwcGluZ3MgYW5kIGF0dHJpYnV0ZSBvdmVycmlkZXMpCiAJICovCiAJaW50ZXJmYWNlIE93bmVyIGV4dGVuZHMgT3JtQmFzZUNvbHVtbi5Pd25lcgogCXsKLQkJWG1sQ29sdW1uIGdldENvbHVtblJlc291cmNlKCk7CisJCVhtbENvbHVtbiBnZXRSZXNvdXJjZUNvbHVtbigpOwogCQkKLQkJdm9pZCBhZGRDb2x1bW5SZXNvdXJjZSgpOworCQl2b2lkIGFkZFJlc291cmNlQ29sdW1uKCk7CiAJCQotCQl2b2lkIHJlbW92ZUNvbHVtblJlc291cmNlKCk7CisJCXZvaWQgcmVtb3ZlUmVzb3VyY2VDb2x1bW4oKTsKIAl9CiAKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4ZDYyOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Db252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKKworLyoqCisgKiAKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ybUNvbnZlcnRlciBleHRlbmRzIFhtbENvbnRleHROb2RlLCBDb252ZXJ0ZXIKK3sKKwkvKioKKwkgKiBVcGRhdGUgdGhlIE9ybUNvbnZlcnRlciBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgWG1sQ29udmVydGlibGVNYXBwaW5nIAorCSAqIHJlc291cmNlIG1vZGVsIG9iamVjdC4gc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQorCSAqLworCXZvaWQgdXBkYXRlKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQppbmRleCBhNjAwMTU5Li42MTY3OTFiIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1EaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNiArMTAsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlzY3JpbWluYXRvckNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwogCiAvKioKQEAgLTI1LDUgKzI2LDE5IEBACiB7CiAJdm9pZCBpbml0aWFsaXplKFhtbEVudGl0eSBlbnRpdHkpOwogCisJLyoqCisJICogVXBkYXRlIHRoZSBPcm1EaXNjcmltaW5hdG9yQ29sdW1uIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBYbWxFbnRpdHkgCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCiAJdm9pZCB1cGRhdGUoWG1sRW50aXR5IGVudGl0eSk7CisJCisJWG1sRGlzY3JpbWluYXRvckNvbHVtbiBnZXRSZXNvdXJjZUNvbHVtbigpOworCQorCS8qKgorCSAqIGludGVyZmFjZSBhbGxvd2luZyBjb2x1bW5zIHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzCisJICovCisJaW50ZXJmYWNlIE93bmVyIGV4dGVuZHMgT3JtTmFtZWRDb2x1bW4uT3duZXIsIERpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXIKKwl7CisKKwl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1FbWJlZGRhYmxlLmphdmEKaW5kZXggZjRiOGIwOC4uYWUzNTkwZSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtRW1iZWRkYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksOSArOSw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwogCiAvKioKICAqIApAQCAtMjIsMTMgKzIxLDEzIEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtRW1iZWRkYWJsZSBleHRlbmRzIEVtYmVkZGFibGUsIE9ybVR5cGVNYXBwaW5nCitwdWJsaWMgaW50ZXJmYWNlIE9ybUVtYmVkZGFibGUKKwlleHRlbmRzIEVtYmVkZGFibGUsIE9ybVR5cGVNYXBwaW5nCiB7Ci0Jdm9pZCBpbml0aWFsaXplKFhtbEVtYmVkZGFibGUgbWFwcGVkU3VwZXJjbGFzcyk7CisJLyoqCisJICogUmV0dXJuIHRoZSBKYXZhIEVtYmVkZGFibGUgdGhpcyBPUk0gRW1iZWRkYWJsZSBjb3JyZXNwb25kcyB0by4gIAorCSAqIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIGphdmEgcGVyc2lzdGVudCB0eXBlIG9yIGl0IGlzIG5vdCBhbiBlbWJlZGRhYmxlLgorCSAqLworCUphdmFFbWJlZGRhYmxlIGdldEphdmFFbWJlZGRhYmxlKCk7CiAKLQl2b2lkIHVwZGF0ZShYbWxFbWJlZGRhYmxlIG1hcHBlZFN1cGVyY2xhc3MpOwotCQotCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotCi0JSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZy5qYXZhCmluZGV4IDk5MjI5OGEuLmM5YzIzNzIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksOSArOSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKIAotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZDsKIAogLyoqCiAgKiAKQEAgLTI0LDExICsyMiw1IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgT3JtRW1iZWRkZWRJZE1hcHBpbmcgZXh0ZW5kcyBFbWJlZGRlZElkTWFwcGluZywgT3JtQmFzZUVtYmVkZGVkTWFwcGluZwogewotCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAotCXZvaWQgaW5pdGlhbGl6ZShYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWQpOwotCi0JIHZvaWQgdXBkYXRlKFhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZCk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkTWFwcGluZy5qYXZhCmluZGV4IGY0NjBhNmYuLjhmYWI5MDggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw5ICs5LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQ7CiAKIC8qKgogICogCkBAIC0yNCwxMSArMjIsNCBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIE9ybUVtYmVkZGVkTWFwcGluZyBleHRlbmRzIEVtYmVkZGVkTWFwcGluZywgT3JtQmFzZUVtYmVkZGVkTWFwcGluZwogewotCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQotCXZvaWQgaW5pdGlhbGl6ZShYbWxFbWJlZGRlZCBlbWJlZGRlZCk7Ci0KLQl2b2lkIHVwZGF0ZShYbWxFbWJlZGRlZCBlbWJlZGRlZCk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUVudGl0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUVudGl0eS5qYXZhCmluZGV4IDFkODQ4NDcuLjJkYzUzMDQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1FbnRpdHkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtRW50aXR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwzMCArOSwyNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07CiAKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwogCiAvKioKLSAqIAotICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBPcm1FbnRpdHkgZXh0ZW5kcyBPcm1UeXBlTWFwcGluZywgRW50aXR5LCBPcm1HZW5lcmF0b3JIb2xkZXIKK3B1YmxpYyBpbnRlcmZhY2UgT3JtRW50aXR5IAorCWV4dGVuZHMgRW50aXR5LCBPcm1UeXBlTWFwcGluZwogewotCiAJLyoqCiAJICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgdmlydHVhbChub3Qgc3BlY2lmaWVkKSBzZWNvbmRhcnkgdGFibGVzLgogCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KIAkgKi8KIAlMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKTsKLQkJU3RyaW5nIFZJUlRVQUxfU0VDT05EQVJZX1RBQkxFU19MSVNUID0gInZpcnR1YWxTZWNvbmRhcnlUYWJsZXNMaXN0IjsKKwkJU3RyaW5nIFZJUlRVQUxfU0VDT05EQVJZX1RBQkxFU19MSVNUID0gInZpcnR1YWxTZWNvbmRhcnlUYWJsZXMiOyAvLyROT04tTkxTLTEkCiAJCiAJLyoqCiAJICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdmlydHVhbCBzZWNvbmRhcnkgdGFibGVzLgpAQCAtNjQsMTIgKzYwLDcgQEAKIAkgKiBSZXR1cm4gdGhlIEphdmEgRW50aXR5IHRoaXMgT1JNIEVudGl0eSBjb3JyZXNwb25kcyB0by4gIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vCiAJICogamF2YSBlbnRpdHkuCiAJICovCi0JSmF2YUVudGl0eSBnZXRKYXZhRW50aXR5KCk7Ci0KLQl2b2lkIGluaXRpYWxpemUoWG1sRW50aXR5IGVudGl0eSk7Ci0KLQl2b2lkIHVwZGF0ZShYbWxFbnRpdHkgZW50aXR5KTsKLQkKKwlKYXZhRW50aXR5IGdldEphdmFFbnRpdHkoKTsJCiAJCiAJLy8qKioqKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqKioqCiAJCkBAIC04Miw0MiArNzMsMjQgQEAKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwogCU9ybVNlY29uZGFyeVRhYmxlIGFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGludCBpbmRleCk7CisJT3JtU2Vjb25kYXJ5VGFibGUgYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoKTsKIAogCQogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCUxpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CiAJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CiAJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCVN0cmluZyBERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUID0gImRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0IjsKKwkJU3RyaW5nIERFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QgPSAiZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwogCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7CisJCiAKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JT3JtQXR0cmlidXRlT3ZlcnJpZGUgZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSk7CisJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKIAkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CiAJCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcygpOwotCU9ybU5hbWVkUXVlcnkgYWRkTmFtZWRRdWVyeShpbnQgaW5kZXgpOworCU9ybVF1ZXJ5Q29udGFpbmVyIGdldFF1ZXJ5Q29udGFpbmVyKCk7CiAJCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcygpOwotCU9ybU5hbWVkTmF0aXZlUXVlcnkgYWRkTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpOwotCQotCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotCi0JSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwlPcm1HZW5lcmF0b3JDb250YWluZXIgZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtR2VuZXJhdGVkVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1HZW5lcmF0ZWRWYWx1ZS5qYXZhCmluZGV4IDNjMDMxZTEuLjI3N2MxYzMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1HZW5lcmF0ZWRWYWx1ZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1HZW5lcmF0ZWRWYWx1ZS5qYXZhCkBAIC0xMCw2ICsxMCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0ZWRWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIApAQCAtMjIsMTQgKzIzLDE4IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtR2VuZXJhdGVkVmFsdWUgZXh0ZW5kcyBHZW5lcmF0ZWRWYWx1ZSwgT3JtSnBhQ29udGV4dE5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgT3JtR2VuZXJhdGVkVmFsdWUKKwlleHRlbmRzIEdlbmVyYXRlZFZhbHVlLCBYbWxDb250ZXh0Tm9kZQogewogCS8qKgogCSAqIFJldHVybiB0aGUgKGJlc3QgZ3Vlc3MpIHRleHQgbG9jYXRpb24gb2YgdGhlIGdlbmVyYXRvci4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKCk7CiAKLQl2b2lkIGluaXRpYWxpemUoWG1sR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUpOwotCisJLyoqCisJICogVXBkYXRlIHRoZSBPcm1HZW5lcmF0ZWRWYWx1ZSBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgWG1sR2VuZXJhdGVkVmFsdWUgCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCiAJdm9pZCB1cGRhdGUoWG1sR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUdlbmVyYXRvci5qYXZhCmluZGV4IDFjZmE2YTYuLmYyOWU4MzggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1HZW5lcmF0b3IuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtR2VuZXJhdG9yLmphdmEKQEAgLTE0LDggKzE0LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIAogLyoqCi0gKiAKLSAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKICAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCkBAIC0yNCw3ICsyMiw2IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgT3JtR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yCiB7Ci0JCiAJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQogCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCk7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtR2VuZXJhdG9yQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtR2VuZXJhdG9yQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0OGUwNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1HZW5lcmF0b3JDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3JDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBPcm1HZW5lcmF0b3JDb250YWluZXIgZXh0ZW5kcyBHZW5lcmF0b3JDb250YWluZXIsIFhtbENvbnRleHROb2RlCit7CisJT3JtU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKKworCU9ybVNlcXVlbmNlR2VuZXJhdG9yIGFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CisKKwlPcm1UYWJsZUdlbmVyYXRvciBnZXRUYWJsZUdlbmVyYXRvcigpOworCisJT3JtVGFibGVHZW5lcmF0b3IgYWRkVGFibGVHZW5lcmF0b3IoKTsKKwkKKwl2b2lkIHVwZGF0ZSgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1HZW5lcmF0b3JIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1HZW5lcmF0b3JIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjNWQ3MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtR2VuZXJhdG9ySG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3JIb2xkZXI7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUdlbmVyYXRvckhvbGRlciBleHRlbmRzIEdlbmVyYXRvckhvbGRlcgotewotCU9ybVNlcXVlbmNlR2VuZXJhdG9yIGdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0KLQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBhZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0JT3JtVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQotCU9ybVRhYmxlR2VuZXJhdG9yIGFkZFRhYmxlR2VuZXJhdG9yKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUlkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUlkTWFwcGluZy5qYXZhCmluZGV4IGU3NjMyNzMuLjk2NGRjYjYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1JZE1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtSWRNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsMjMgKzEwLDI0IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOwogCiAvKioKLSAqIAotICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBPcm1JZE1hcHBpbmcgZXh0ZW5kcyBJZE1hcHBpbmcsIE9ybUNvbHVtbk1hcHBpbmcsIE9ybUF0dHJpYnV0ZU1hcHBpbmcsIE9ybUdlbmVyYXRvckhvbGRlcgorcHVibGljIGludGVyZmFjZSBPcm1JZE1hcHBpbmcgCisJZXh0ZW5kcyBJZE1hcHBpbmcsIE9ybUNvbHVtbk1hcHBpbmcsIE9ybUF0dHJpYnV0ZU1hcHBpbmcKIHsKKwkKKwkvLyoqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioKKwlPcm1HZW5lcmF0b3JDb250YWluZXIgZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCk7CisJCisJT3JtQ29udmVydGVyIGdldERlZmF1bHRDb252ZXJ0ZXIoKTsKKwlPcm1Db252ZXJ0ZXIgZ2V0U3BlY2lmaWVkQ29udmVydGVyKCk7CisJCiAJT3JtR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKTsKIAlPcm1HZW5lcmF0ZWRWYWx1ZSBhZGRHZW5lcmF0ZWRWYWx1ZSgpOwkKLQkKLQl2b2lkIGluaXRpYWxpemUoWG1sSWQgaWQpOwotCi0Jdm9pZCB1cGRhdGUoWG1sSWQgaWQpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtbi5qYXZhCmluZGV4IGE1ZjZkMWUuLjI5YTk4OWQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5Db2x1bW4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47CiAKIC8qKgotICogCisgKiBvcm0ueG1sIGpvaW4gY29sdW1uCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMSwyMiArMjEsMjYgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBPcm1Kb2luQ29sdW1uIGV4dGVuZHMgSm9pbkNvbHVtbiwgT3JtQmFzZUpvaW5Db2x1bW4sIE9ybUJhc2VDb2x1bW4KK3B1YmxpYyBpbnRlcmZhY2UgT3JtSm9pbkNvbHVtbgorCWV4dGVuZHMgSm9pbkNvbHVtbiwgT3JtQmFzZUpvaW5Db2x1bW4sIE9ybUJhc2VDb2x1bW4KIHsKLQl2b2lkIGluaXRpYWxpemVGcm9tKEpvaW5Db2x1bW4gb2xkQ29sdW1uKTsKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSBqb2luIGNvbHVtbiBmcm9tIHRoZSBzcGVjaWZpZWQgb2xkIGpvaW4gY29sdW1uLgorCSAqLworCXZvaWQgaW5pdGlhbGl6ZUZyb20oSm9pbkNvbHVtbiBvbGRKb2luQ29sdW1uKTsKIAkKLQl2b2lkIGluaXRpYWxpemUoWG1sSm9pbkNvbHVtbiBjb2x1bW4pOwotCQotCXZvaWQgdXBkYXRlKFhtbEpvaW5Db2x1bW4gY29sdW1uKTsKKwkvKioKKwkgKiBVcGRhdGUgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHNwZWNpZmllZCBYTUwuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpCisJICovCisJdm9pZCB1cGRhdGUoWG1sSm9pbkNvbHVtbiB4bWxKb2luQ29sdW1uKTsKIAkKIAlPd25lciBnZXRPd25lcigpOwogCi0JLyoqCi0JICogaW50ZXJmYWNlIGFsbG93aW5nIGpvaW4gY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChlLmcuIDE6MSBtYXBwaW5ncyBhbmQgam9pbiB0YWJsZXMpCi0JICovCi0JaW50ZXJmYWNlIE93bmVyIGV4dGVuZHMgSm9pbkNvbHVtbi5Pd25lciwgT3JtQmFzZUpvaW5Db2x1bW4uT3duZXIsIE9ybUJhc2VDb2x1bW4uT3duZXIKKwlpbnRlcmZhY2UgT3duZXIKKwkJZXh0ZW5kcyBKb2luQ29sdW1uLk93bmVyLCBPcm1CYXNlSm9pbkNvbHVtbi5Pd25lciwgT3JtQmFzZUNvbHVtbi5Pd25lcgogCXsKLQorCQkvLyBub3RoaW5nPwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxYmU2OAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbnNNYXBwaW5nOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ybUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCisJZXh0ZW5kcyBPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UsIEpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisJWG1sSm9pbkNvbHVtbnNNYXBwaW5nIGdldFJlc291cmNlTWFwcGluZygpOworCQorCU9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjMTk2ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKKworcHVibGljIGludGVyZmFjZSBPcm1Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5IAorCWV4dGVuZHMgCisJCVhtbENvbnRleHROb2RlLAorCQlPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5Cit7CisJdm9pZCB1cGRhdGUoWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4YW8pOworCisJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzNkNTEyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCisvKioKKyAqIFRoZSBvcm0ueG1sIHJlcHJlc2VudGF0aW9uIG9mIGEge0BsaW5rIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3l9CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kKKwlleHRlbmRzIE9ybUpvaW5pbmdTdHJhdGVneSwgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneQoreworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucygpOworCQorCU9ybUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkKKwlPcm1Kb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luVGFibGUuamF2YQppbmRleCA3MTc5NDFmLi43NTc0MzZhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtSm9pblRhYmxlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5UYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTExLDEwICsxMSwxMCBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwogCiAvKioKLSAqIAorICogb3JtLnhtbCBqb2luIHRhYmxlCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMiwyMSArMjIsMTUgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBPcm1Kb2luVGFibGUgZXh0ZW5kcyBKb2luVGFibGUsIE9ybUpwYUNvbnRleHROb2RlCitwdWJsaWMgaW50ZXJmYWNlIE9ybUpvaW5UYWJsZQorCWV4dGVuZHMgSm9pblRhYmxlLCBYbWxDb250ZXh0Tm9kZQogewotCi0JYm9vbGVhbiBpc1NwZWNpZmllZCgpOwotCi0Jdm9pZCBpbml0aWFsaXplKFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyk7Ci0KLQl2b2lkIHVwZGF0ZShYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcpOworCXZvaWQgdXBkYXRlKCk7CiAJCQogCXZvaWQgaW5pdGlhbGl6ZUZyb20oSm9pblRhYmxlIG9sZEpvaW5UYWJsZSk7CiAKIAkKLQkvLyoqKioqKioqKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioKLQkKLQlPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIGdldFBhcmVudCgpOworCS8vICoqKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqCiAJCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zKCk7CkBAIC02Miw0ICs1Niw1IEBACiAJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzKCk7CiAJCiAJT3JtVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2EyMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlTWFwcGluZzsKKworcHVibGljIGludGVyZmFjZSBPcm1Kb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCisJZXh0ZW5kcyBPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UsIEpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwlYbWxKb2luVGFibGVNYXBwaW5nIGdldFJlc291cmNlTWFwcGluZygpOworCQorCU9ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSBnZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2IwZmZkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKKworLyoqCisgKiBUaGUgb3JtLnhtbCByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3l9CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneQorCWV4dGVuZHMgT3JtSm9pbmluZ1N0cmF0ZWd5LCBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kKK3sKKwlPcm1Kb2luVGFibGUgZ2V0Sm9pblRhYmxlKCk7CisJCisJT3JtSm9pblRhYmxlIGFkZEpvaW5UYWJsZSgpOworCQorCVhtbEpvaW5UYWJsZSBnZXRSZXNvdXJjZUpvaW5UYWJsZSgpOworCQorCVhtbEpvaW5UYWJsZSBhZGRSZXNvdXJjZUpvaW5UYWJsZSgpOworCisJdm9pZCByZW1vdmVSZXNvdXJjZUpvaW5UYWJsZSgpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtSm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtSm9pbmluZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MzMGJhNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luaW5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgT3JtSm9pbmluZ1N0cmF0ZWd5IAorCWV4dGVuZHMgWG1sQ29udGV4dE5vZGUsIEpvaW5pbmdTdHJhdGVneQoreworCXZvaWQgdXBkYXRlKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtSnBhQ29udGV4dE5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1KcGFDb250ZXh0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmEzNDYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1KcGFDb250ZXh0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtSnBhQ29udGV4dE5vZGUgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIHRvIHRoZSBsaXN0IG9mIGN1cnJlbnQgdmFsaWRhdGlvbiBtZXNzYWdlcwotCSAqLwotCXZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcyk7Ci0KLQlUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55TWFwcGluZy5qYXZhCmluZGV4IDNkMGZhNzkuLjY4ZmRlZDAgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55TWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55TWFwcGluZy5qYXZhCkBAIC0xMyw3ICsxMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7CiAKIC8qKgotICogCisgKiBUaGUgb3JtLnhtbCByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBNYW55VG9NYW55TWFwcGluZ30KICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIxLDEwICsyMSwxMCBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU1hbnlUb01hbnlNYXBwaW5nIGV4dGVuZHMgTWFueVRvTWFueU1hcHBpbmcsIE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZworcHVibGljIGludGVyZmFjZSBPcm1NYW55VG9NYW55TWFwcGluZyAKKwlleHRlbmRzIE1hbnlUb01hbnlNYXBwaW5nLCBPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKIHsKLQotCXZvaWQgaW5pdGlhbGl6ZShYbWxNYW55VG9NYW55IHhtbE1hbnlUb01hbnkpOwotCi0Jdm9pZCB1cGRhdGUoWG1sTWFueVRvTWFueSB4bWxNYW55VG9NYW55KTsKKwlYbWxNYW55VG9NYW55IGdldFJlc291cmNlQXR0cmlidXRlTWFwcGluZygpOworCQorCU9ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBhMzc1NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7CisKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSB7QGxpbmsgUmVsYXRpb25zaGlwUmVmZXJlbmNlfSBvZiBhbiB7QGxpbmsgT3JtTWFueVRvTWFueU1hcHBpbmd9CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UKKwlleHRlbmRzIE1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIE9ybU93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UsCisJCU9ybUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwlYbWxNYW55VG9NYW55IGdldFJlc291cmNlTWFwcGluZygpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nLmphdmEKaW5kZXggOWIzM2I4OS4uODZkODI3YSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTWFueVRvT25lTWFwcGluZy5qYXZhCkBAIC05LDEyICs5LDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKIAotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7CiAKIC8qKgotICogCisgKiBUaGUgb3JtLnhtbCByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBNYW55VG9PbmVNYXBwaW5nfQogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjQsMTIgKzIzLDcgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBPcm1NYW55VG9PbmVNYXBwaW5nIGV4dGVuZHMgTWFueVRvT25lTWFwcGluZywgT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwogewotCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucygpOworCVhtbE1hbnlUb09uZSBnZXRSZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcoKTsKIAkKLQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQotCXZvaWQgaW5pdGlhbGl6ZShYbWxNYW55VG9PbmUgeG1sTWFueVRvT25lKTsKLQotCXZvaWQgdXBkYXRlKFhtbE1hbnlUb09uZSB4bWxNYW55VG9PbmUpOwotCisJT3JtTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTg1NjIxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSB7QGxpbmsgUmVsYXRpb25zaGlwUmVmZXJlbmNlfSBvZiBhbiB7QGxpbmsgT3JtTWFueVRvT25lTWFwcGluZ30KKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3JtTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlCisJZXh0ZW5kcyBNYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UsCisJCU9ybUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisJWG1sTWFueVRvT25lIGdldFJlc291cmNlTWFwcGluZygpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDIxNTZhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5OworCisvKioKKyAqIFRoZSBvcm0ueG1sIHJlcHJlc2VudGF0aW9uIG9mIGEge0BsaW5rIE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5fQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBPcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneQorCWV4dGVuZHMgT3JtSm9pbmluZ1N0cmF0ZWd5LCBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneQoreworCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzLmphdmEKaW5kZXggNDU4YTg4OS4uMzA1NWFkNiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksOSArOSw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwogCiAvKioKICAqIApAQCAtMjIsMTMgKzIxLDEzIEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTWFwcGVkU3VwZXJjbGFzcyBleHRlbmRzIE1hcHBlZFN1cGVyY2xhc3MsIE9ybVR5cGVNYXBwaW5nCitwdWJsaWMgaW50ZXJmYWNlIE9ybU1hcHBlZFN1cGVyY2xhc3MKKwlleHRlbmRzIE1hcHBlZFN1cGVyY2xhc3MsIE9ybVR5cGVNYXBwaW5nCiB7Ci0Jdm9pZCBpbml0aWFsaXplKFhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyk7CisJLyoqCisJICogUmV0dXJuIHRoZSBKYXZhIE1hcHBlZCBTdXBlcmNsYXNzIHRoaXMgT1JNIE1hcHBlZFN1cGVyY2xhc3MgY29ycmVzcG9uZHMgdG8uICAKKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBqYXZhIHBlcnNpc3RlbnQgdHlwZSBvciBpdCBpcyBub3QgYSBtYXBwZWQgc3VwZXJjbGFzcy4KKwkgKi8KKwlKYXZhTWFwcGVkU3VwZXJjbGFzcyBnZXRKYXZhTWFwcGVkU3VwZXJjbGFzcygpOwogCi0Jdm9pZCB1cGRhdGUoWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzKTsKLQkKLQlJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMoKTsKLQotCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmluZGV4IGE2NTUyM2EuLjMzNmZlZWQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKQEAgLTEyLDE2ICsxMiwxNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwogCiAvKioKLSAqIAotICogCisgKiBPUk0gbXVsdGktdmFsdWVkICgxOm0sIG06bSkgcmVsYXRpb25zaGlwIG1hcHBpbmcuCisgKiA8cD4KICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCiAgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBleHRlbmRzIE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcsIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZworcHVibGljIGludGVyZmFjZSBPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgCisJZXh0ZW5kcyBPcm1SZWxhdGlvbnNoaXBNYXBwaW5nLCBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKIHsKLQotCU9ybUpvaW5UYWJsZSBnZXRKb2luVGFibGUoKTsKKwkvLyBub3RoaW5nIHlldAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU5hbWVkQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTmFtZWRDb2x1bW4uamF2YQppbmRleCBiMzZhOWQ1Li5kNmRhZGQ3IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTmFtZWRDb2x1bW4uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTmFtZWRDb2x1bW4uamF2YQpAQCAtMTAsNiArMTAsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIAogCkBAIC0yMiw3ICsyMyw3IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTmFtZWRDb2x1bW4gZXh0ZW5kcyBOYW1lZENvbHVtbiwgT3JtSnBhQ29udGV4dE5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgT3JtTmFtZWRDb2x1bW4gZXh0ZW5kcyBOYW1lZENvbHVtbiwgWG1sQ29udGV4dE5vZGUKIHsKIAogCU93bmVyIGdldE93bmVyKCk7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTmFtZWROYXRpdmVRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU5hbWVkTmF0aXZlUXVlcnkuamF2YQppbmRleCBkODBlMTEzLi4yMGIzYzIwIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTmFtZWROYXRpdmVRdWVyeS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKQEAgLTI2LDggKzI2LDEwIEBACiB7CiAJTGlzdEl0ZXJhdG9yPE9ybVF1ZXJ5SGludD4gaGludHMoKTsKIAotCXZvaWQgaW5pdGlhbGl6ZShYbWxOYW1lZE5hdGl2ZVF1ZXJ5IHF1ZXJ5UmVzb3VyY2UpOwotCi0Jdm9pZCB1cGRhdGUoWG1sTmFtZWROYXRpdmVRdWVyeSBxdWVyeVJlc291cmNlKTsKKwkvKioKKwkgKiBVcGRhdGUgdGhlIE9ybU5hbWVkTmF0aXZlUXVlcnkgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIFhtbE5hbWVkTmF0aXZlUXVlcnkgCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCisJdm9pZCB1cGRhdGUoWG1sTmFtZWROYXRpdmVRdWVyeSByZXNvdXJjZVF1ZXJ5KTsKIAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1OYW1lZFF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtTmFtZWRRdWVyeS5qYXZhCmluZGV4IDhkMzdiYTUuLmE1ODg2YmUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1OYW1lZFF1ZXJ5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU5hbWVkUXVlcnkuamF2YQpAQCAtMjYsNyArMjYsOSBAQAogewkKIAlMaXN0SXRlcmF0b3I8T3JtUXVlcnlIaW50PiBoaW50cygpOwogCQotCXZvaWQgaW5pdGlhbGl6ZShYbWxOYW1lZFF1ZXJ5IHF1ZXJ5UmVzb3VyY2UpOwotCisJLyoqCisJICogVXBkYXRlIHRoZSBPcm1OYW1lZFF1ZXJ5IGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBYbWxOYW1lZFF1ZXJ5IAorCSAqIHJlc291cmNlIG1vZGVsIG9iamVjdC4gc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQorCSAqLwogCXZvaWQgdXBkYXRlKFhtbE5hbWVkUXVlcnkgcXVlcnlSZXNvdXJjZSk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nLmphdmEKaW5kZXggYmIwNTYwYS4uYTZkZTUyYSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtT25lVG9NYW55TWFwcGluZy5qYXZhCkBAIC0xMyw3ICsxMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKIAogLyoqCi0gKiAKKyAqIFRoZSBvcm0ueG1sIHJlcHJlc2VudGF0aW9uIG9mIGEge0BsaW5rIE9uZVRvTWFueU1hcHBpbmd9CiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMyw5ICsyMyw3IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgT3JtT25lVG9NYW55TWFwcGluZyBleHRlbmRzIE9uZVRvTWFueU1hcHBpbmcsIE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZwogewotCi0Jdm9pZCBpbml0aWFsaXplKFhtbE9uZVRvTWFueSB4bWxPbmVUb01hbnkpOwotCi0Jdm9pZCB1cGRhdGUoWG1sT25lVG9NYW55IHhtbE9uZVRvTWFueSk7CisJWG1sT25lVG9NYW55IGdldFJlc291cmNlQXR0cmlidXRlTWFwcGluZygpOwogCQorCU9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhOTg0OQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7CisKKy8qKgorICogUmVwcmVzZW50cyB0aGUge0BsaW5rIFJlbGF0aW9uc2hpcFJlZmVyZW5jZX0gb2YgYW4ge0BsaW5rIE9ybU9uZVRvTWFueU1hcHBpbmd9CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWV4dGVuZHMgT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLCBPcm1Pd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlLAorCQlPcm1Kb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisJWG1sT25lVG9NYW55IGdldFJlc291cmNlTWFwcGluZygpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZy5qYXZhCmluZGV4IDliZTJhYWIuLjZlMGY0MGEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1PbmVUb09uZU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtT25lVG9PbmVNYXBwaW5nLmphdmEKQEAgLTksMTIgKzksMTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7CiAKIC8qKgotICogCisgKiBUaGUgb3JtLnhtbCByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBPbmVUb09uZU1hcHBpbmd9CiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMiwyMiArMjEsMTAgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBPcm1PbmVUb09uZU1hcHBpbmcgZXh0ZW5kcyBPbmVUb09uZU1hcHBpbmcsIE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKK3B1YmxpYyBpbnRlcmZhY2UgT3JtT25lVG9PbmVNYXBwaW5nIAorCWV4dGVuZHMgT25lVG9PbmVNYXBwaW5nLCBPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCiB7Ci0KLQl2b2lkIGluaXRpYWxpemUoWG1sT25lVG9PbmUgb25lVG9PbmUpOwotCi0Jdm9pZCB1cGRhdGUoWG1sT25lVG9PbmUgb25lVG9PbmUpOworCVhtbE9uZVRvT25lIGdldFJlc291cmNlQXR0cmlidXRlTWFwcGluZygpOwogCQotCQotCS8vICoqKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqCi0JTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zKCk7Ci0KLQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQotCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KKwlPcm1PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NjFmOGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOworCisvKioKKyAqIFJlcHJlc2VudHMgdGhlIHtAbGluayBSZWxhdGlvbnNoaXBSZWZlcmVuY2V9IG9mIGFuIHtAbGluayBPcm1PbmVUb09uZU1hcHBpbmd9CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ybU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlCisJZXh0ZW5kcyBPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgCisJCU9ybU93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UsCisJCU9ybUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlLAorCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwlYbWxPbmVUb09uZSBnZXRSZXNvdXJjZU1hcHBpbmcoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1Pd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMTk3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Pd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRCeU1hcHBpbmc7CisKK3B1YmxpYyBpbnRlcmZhY2UgT3JtT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWV4dGVuZHMgT3JtUmVsYXRpb25zaGlwUmVmZXJlbmNlLCBPd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisJWG1sTWFwcGVkQnlNYXBwaW5nIGdldFJlc291cmNlTWFwcGluZygpOworCQorCU9ybU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IGdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZjAyNzgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cworCWV4dGVuZHMgWG1sQ29udGV4dE5vZGUsIE1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKK3sJCisJQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKTsKKwl2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKTsKKwkJU3RyaW5nIEFDQ0VTU19QUk9QRVJUWSA9ICJhY2Nlc3MiOyAvLyROT04tTkxTLTEkCisKKwlTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNhdGFsb2cgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdCBjYXRhbG9nLgorCSAqLworCVN0cmluZyBnZXRDYXRhbG9nKCk7CisJU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKTsKKwl2b2lkIHNldFNwZWNpZmllZENhdGFsb2coU3RyaW5nIG5ld1NwZWNpZmllZENhdGFsb2cpOworCQlTdHJpbmcgU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKTsKKwkJU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSA9ICJkZWZhdWx0Q2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKKwlDYXRhbG9nIGdldERiQ2F0YWxvZygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc2NoZW1hIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQgc2NoZW1hLgorCSAqLworCVN0cmluZyBnZXRTY2hlbWEoKTsKKwlTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCk7CisJdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIG5ld1NwZWNpZmllZFNjaGVtYSk7CisJCVN0cmluZyBTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZID0gInNwZWNpZmllZFNjaGVtYSI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpOworCQlTdHJpbmcgREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkgPSAiZGVmYXVsdFNjaGVtYSI7IC8vJE5PTi1OTFMtMSQKKwlTY2hlbWEgZ2V0RGJTY2hlbWEoKTsKKworCWJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpOworCXZvaWQgc2V0Q2FzY2FkZVBlcnNpc3QoYm9vbGVhbiB2YWx1ZSk7CisJCVN0cmluZyBDQVNDQURFX1BFUlNJU1RfUFJPUEVSVFkgPSAiY2FzY2FkZVBlcnNpc3QiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogVXBkYXRlIHRoZSBPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgWG1sRW50aXR5TWFwcGluZ3MgCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCisJdm9pZCB1cGRhdGUoKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKaW5kZXggMGNhZGYzZS4uMjdlZWQxNCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDIwICsxMCwxMSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwogCiAvKioKLSAqIAorICogT1JNIHBlcnNpc3RlbnQgYXR0cmlidXRlCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0zMSwzMCArMjIsMjggQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZSwgT3JtSnBhQ29udGV4dE5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZQorCWV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZSwgWG1sQ29udGV4dE5vZGUKIHsKLQkKLQkvKioKLQkgKiBPdmVycmlkZW4gdG8gcmV0dXJuIHtAbGluayBPcm1BdHRyaWJ1dGVNYXBwaW5nfXMKLQkgKi8KKworCS8vICoqKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqCisKIAlPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldE1hcHBpbmcoKTsKIAkKLQkvKioKLQkgKiBPdmVycmlkZW4gdG8gcmV0dXJuIHtAbGluayBPcm1BdHRyaWJ1dGVNYXBwaW5nfXMKLQkgKi8KIAlPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldFNwZWNpZmllZE1hcHBpbmcoKTsKIAkKLQkvKioKLQkgKiBPdmVycmlkZW4gdG8gcmV0dXJuIHtAbGluayBPcm1UeXBlTWFwcGluZ31zCi0JICovCiAJT3JtVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKTsKIAkKLQkvKioKLQkgKiBPdmVycmlkZW4gdG8gcmV0dXJuIHtAbGluayBPcm1QZXJzaXN0ZW50VHlwZX1zCi0JICovCiAJT3JtUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoKTsKKwogCQotCWJvb2xlYW4gY29udGFpbnMoaW50IHRleHRPZmZzZXQpOworCS8vICoqKioqKioqKiogamF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSAqKioqKioqKioqCisKKwlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQlTdHJpbmcgSkFWQV9QRVJTSVNURU5UX0FUVFJJQlVURV9QUk9QRVJUWSA9ICJqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKKworCisJLy8gKioqKioqKioqKiB2aXJ0dWFsIDwtPiBzcGVjaWZpZWQgKioqKioqKioqKgogCiAJLyoqCiAJICogTWFrZSB0aGUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgdmlydHVhbC4gVGhlIGF0dHJpYnV0ZSB3aWxsIGJlIHJlbW92ZWQKQEAgLTg3LDUzICs3Niw0MCBAQAogCSAqLwogCXZvaWQgbWFrZVNwZWNpZmllZChTdHJpbmcgbWFwcGluZ0tleSk7CiAJCisKKwkvLyAqKioqKioqKioqIG1pc2NlbGxhbmVvdXMgKioqKioqKioqKgorCisJYm9vbGVhbiBjb250YWlucyhpbnQgdGV4dE9mZnNldCk7CisKIAl2b2lkIG5hbWVDaGFuZ2VkKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSk7CisJCisJLy8gKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqCisJCisJLyoqCisJICogVXBkYXRlIHRoZSBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KKwl2b2lkIHVwZGF0ZSgpOworCQorCQorCS8qKgorCSAqIGludGVyZmFjZSBhbGxvd2luZyBwZXJzaXN0ZW50IGF0dHJpYnV0ZXMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKKwkgKiAoZS5nLiB2aXJ0dWFsIGFuZCBzcGVjaWZpZWQgb3JtIHBlcnNpc3RlbnQgYXR0cmlidXRlcykKKwkgKi8KKwlpbnRlcmZhY2UgT3duZXIKKwl7CisJCS8qKgorCSAJICogUmV0dXJuIHRoZSBqYXZhIHBlcnNpc3RlbnQgYXR0cmlidXRlIHRoYXQgY29ycmVzcG9uZHMgKHNhbWUgbmFtZSBhbmQgYWNjZXNzIHR5cGUpCisJCSAqIHRvIHRoZSBnaXZlbiBvcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCisJIAkgKi8KKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZmluZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCQorCQkvKioKKwkgCSAqIFVwZGF0ZSB0aGUgamF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBpZiBuZWNlc3NhcnksIGlmIGl0IGlzIG93bmVkIGJ5IHRoaXMgb2JqZWN0LAorCQkgKiBpdCBuZWVkcyB0byBiZSB1cGRhdGVkLgorCSAJICovCisJCXZvaWQgdXBkYXRlSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwl9CiAKLQkKLQkvLyoqKioqKioqKioqKioqKioqKiogaW5pdGlhbGl6YXRpb24vdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKgogCi0Jdm9pZCBpbml0aWFsaXplKFhtbEJhc2ljIGJhc2ljKTsKLQkKLQl2b2lkIGluaXRpYWxpemUoWG1sRW1iZWRkZWQgZW1iZWRkZWQpOwotCQotCXZvaWQgaW5pdGlhbGl6ZShYbWxWZXJzaW9uIHZlcnNpb24pOwotCQotCXZvaWQgaW5pdGlhbGl6ZShYbWxNYW55VG9PbmUgbWFueVRvT25lKTsKLQkKLQl2b2lkIGluaXRpYWxpemUoWG1sT25lVG9NYW55IG9uZVRvTWFueSk7Ci0JCi0Jdm9pZCBpbml0aWFsaXplKFhtbE9uZVRvT25lIG9uZVRvT25lKTsKLQkKLQl2b2lkIGluaXRpYWxpemUoWG1sTWFueVRvTWFueSBtYW55VG9NYW55KTsKLQkKLQl2b2lkIGluaXRpYWxpemUoWG1sSWQgaWQpOwotCQotCXZvaWQgaW5pdGlhbGl6ZShYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWQpOwotCQotCXZvaWQgaW5pdGlhbGl6ZShYbWxUcmFuc2llbnQgdHJhbnNpZW50UmVzb3VyY2UpOwotCQotCXZvaWQgaW5pdGlhbGl6ZShYbWxOdWxsQXR0cmlidXRlTWFwcGluZyB4bWxOdWxsQXR0cmlidXRlTWFwcGluZyk7Ci0JCi0Jdm9pZCB1cGRhdGUoWG1sSWQgaWQpOwotCQotCXZvaWQgdXBkYXRlKFhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZCk7Ci0KLQl2b2lkIHVwZGF0ZShYbWxCYXNpYyBiYXNpYyk7Ci0JCi0Jdm9pZCB1cGRhdGUoWG1sVmVyc2lvbiB2ZXJzaW9uKTsKLQkKLQl2b2lkIHVwZGF0ZShYbWxNYW55VG9PbmUgbWFueVRvT25lKTsKLQkKLQl2b2lkIHVwZGF0ZShYbWxPbmVUb01hbnkgb25lVG9NYW55KTsKLQkKLQl2b2lkIHVwZGF0ZShYbWxPbmVUb09uZSBvbmVUb09uZSk7Ci0JCi0Jdm9pZCB1cGRhdGUoWG1sTWFueVRvTWFueSBtYW55VG9NYW55KTsKLQotCXZvaWQgdXBkYXRlKFhtbEVtYmVkZGVkIGVtYmVkZGVkKTsKLQkKLQl2b2lkIHVwZGF0ZShYbWxUcmFuc2llbnQgdHJhbnNpZW50UmVzb3VyY2UpOwotCQotCXZvaWQgdXBkYXRlKFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIHhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW50VHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRUeXBlLmphdmEKaW5kZXggZWQwN2RlMS4uNGMwOTIxMCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRUeXBlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNDEgKzEwLDM3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7CiAKIC8qKgotICogCi0gKiAKKyAqIENvbnRleHQgPGNvZGU+b3JtLnhtbDwvY29kZT4gcGVyc2lzdGVudCB0eXBlLgorICogPHA+CiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBPcm1QZXJzaXN0ZW50VHlwZSBleHRlbmRzIFBlcnNpc3RlbnRUeXBlLCBPcm1KcGFDb250ZXh0Tm9kZQorcHVibGljIGludGVyZmFjZSBPcm1QZXJzaXN0ZW50VHlwZQorCWV4dGVuZHMgUGVyc2lzdGVudFR5cGUsIFBlcnNpc3RlbnRUeXBlLk93bmVyLCBYbWxDb250ZXh0Tm9kZQogewotCS8qKgotCSAqIE92ZXJyaWRlbiB0byByZXR1cm4ge0BsaW5rIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGV9cwotCSAqLworCS8vICoqKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqCisKKwlFbnRpdHlNYXBwaW5ncyBnZXRQYXJlbnQoKTsKKwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzKCk7CiAJCi0JLyoqCi0JICogT3ZlcnJpZGVuIHRvIHJldHVybiBhbiB7QGxpbmsgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZX0KLQkgKi8KIAlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGdldEF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKIAotCS8qKgotCSAqIE92ZXJyaWRlbiB0byByZXR1cm4gYW4ge0BsaW5rIE9ybVR5cGVNYXBwaW5nfQotCSAqLwogCU9ybVR5cGVNYXBwaW5nIGdldE1hcHBpbmcoKTsKLQotCS8vKioqKioqKioqKioqKioqKioqKiBzcGVjaWZpZWQgYXR0cmlidXRlcyAqKioqKioqKioqKioqKioqKioqCi0KKwkKKwkKKwkvLyoqKioqKioqKioqKioqKioqIHNwZWNpZmllZCBhdHRyaWJ1dGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCiAJLyoqCiAJICogUmV0dXJuIGEgcmVhZCBvbmx5IGl0ZXJhdG9yIG9mIHRoZSBzcGVjaWZpZWQge0BsaW5rIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGV9cy4KIAkgKi8KQEAgLTU0LDE0ICs1MCwxNiBAQAogCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNwZWNpZmllZCB7QGxpbmsgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZX1zLgogCSAqLwogCWludCBzcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpOwotCisJCiAJLy9UT0RPIHRoZXNlIGFyZSBjdXJyZW50bHkgb25seSB1c2VkIGJ5IHRlc3RzLCBwb3NzaWJseSByZW1vdmUgdGhlbS4gIE9ybVBlcnNpc3RlbkF0dHJpYnV0ZXMuc2V0VmlydHVhbChib29sZWFuKSBpcyB1c2VkIGJ5IHRoZSBVSQogCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShTdHJpbmcgbWFwcGluZ0tleSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpOwotCXZvaWQgcmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwogCisJdm9pZCByZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CiAJCi0JLy8qKioqKioqKioqKioqKioqKioqIHZyaXR1YWwgYXR0cmlidXRlcyAqKioqKioqKioqKioqKioqKioqCi0JU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFU19MSVNUID0gInZpcnR1YWxBdHRyaWJ1dGVzTGlzdCI7CisJCisJLy8qKioqKioqKioqKioqKioqKiB2aXJ0dWFsIGF0dHJpYnV0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCVN0cmluZyBWSVJUVUFMX0FUVFJJQlVURVNfTElTVCA9ICJ2aXJ0dWFsQXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgogCSAqIFJldHVybiBhIHJlYWQgb25seSBpdGVyYXRvciBvZiB0aGUgdmlydHVhbCBvcm0gcGVyc2lzdGVudCBhdHRyaWJ1dGVzLiAgVGhlc2UKQEAgLTEwMiw0MSArMTAwLDQ2IEBACiAJICovCiAJdm9pZCBtYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVNwZWNpZmllZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZyBtYXBwaW5nS2V5KTsKIAorCiAJLy8qKioqKioqKioqKioqKioqKioqIG1hcHBpbmcgbW9ycGhpbmcgKioqKioqKioqKioqKioqKioqKgorCiAJdm9pZCBjaGFuZ2VNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgT3JtQXR0cmlidXRlTWFwcGluZyBvbGRNYXBwaW5nLCBPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpOwogCQogCQotCS8vKioqKioqKioqKioqKioqKioqKiBpbml0aWFsaXphdGlvbi91cGRhdGluZyAqKioqKioqKioqKioqKioqKioqCisJLy8qKioqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioKIAotCXZvaWQgaW5pdGlhbGl6ZShYbWxFbnRpdHkgZW50aXR5KTsKKwkvKioKKwkgKiBVcGRhdGUgdGhlIE9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KKwl2b2lkIHVwZGF0ZSgpOwogCQotCXZvaWQgaW5pdGlhbGl6ZShYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MpOwotCQkKLQl2b2lkIGluaXRpYWxpemUoWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlKTsKLQkKLQl2b2lkIHVwZGF0ZShYbWxFbnRpdHkgZW50aXR5KTsKLQkKLQl2b2lkIHVwZGF0ZShYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MpOwotCQotCXZvaWQgdXBkYXRlKFhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZSk7CiAKLQkKLQkKIAlib29sZWFuIGNvbnRhaW5zKGludCB0ZXh0T2Zmc2V0KTsKIAkKIAkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHtAbGluayBPcm1QZXJzaXN0ZW50VHlwZSkgYXBwbGllcyB0byB0aGUKLQkgKiBnaXZlbiBmdWxseVF1YWxpZmllZFR5cGVOYW1lLgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwZXJzaXN0ZW50IHR5cGUgYXBwbGllcyB0byB0aGUKKwkgKiBzcGVjaWZpZWQgdHlwZS4KIAkgKi8KLQlib29sZWFuIGlzRm9yKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKKwlib29sZWFuIGlzRm9yKFN0cmluZyB0eXBlTmFtZSk7CiAJCiAJdm9pZCBjbGFzc0NoYW5nZWQoU3RyaW5nIG9sZENsYXNzLCBTdHJpbmcgbmV3Q2xhc3MpOwogCQogCS8qKgogCSAqIFJldHVybiB0aGUgSmF2YSBwZXJzaXN0ZW50IHR5cGUgdGhhdCBpcyByZWZlcnJlZCB0byBieSB0aGlzIG9ybS54bWwgcGVyc2lzdGVudCB0eXBlLgogCSAqIElmIHRoZXJlIGlzIG5vIHVuZGVybHlpbmcgamF2YSBwZXJzaXN0ZW50IHR5cGUsIHRoZW4gbnVsbCBpcyByZXR1cm5lZC4KLQkgKiBAcmV0dXJuCiAJICovCiAJSmF2YVBlcnNpc3RlbnRUeXBlIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlTdHJpbmcgSkFWQV9QRVJTSVNURU5UX1RZUEVfUFJPUEVSVFkgPSAiamF2YVBlcnNpc3RlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIHRoZSBwZXJzaXN0ZW50IHR5cGUncyBkZWZhdWx0IHBhY2thZ2UuCisJICovCisJU3RyaW5nIGdldERlZmF1bHRQYWNrYWdlKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGVyc2lzdGVudCB0eXBlIGlzIGRlZmF1bHQgbWV0YWRhdGEgY29tcGxldGUuCisJICovCisJYm9vbGVhbiBpc0RlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCk7CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKaW5kZXggODNlZmVlMi4uMDM1YjZmNiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKQEAgLTIyLDkgKzIyLDExIEBACiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbiwgT3JtQmFzZUpvaW5Db2x1bW4KLXsKLQl2b2lkIGluaXRpYWxpemUoWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gY29sdW1uKTsKLQkKK3sJCisJLyoqCisJICogVXBkYXRlIHRoZSBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCiAJdm9pZCB1cGRhdGUoWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gY29sdW1uKTsKIAkKIAl2b2lkIGluaXRpYWxpemVGcm9tKFByaW1hcnlLZXlKb2luQ29sdW1uIG9sZFBrSm9pbkNvbHVtbik7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjMmIwYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOworCitwdWJsaWMgaW50ZXJmYWNlIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWV4dGVuZHMgT3JtUmVsYXRpb25zaGlwUmVmZXJlbmNlLAorCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmJhYmU0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisKKy8qKgorICogVGhlIG9ybS54bWwgcmVwcmVzZW50YXRpb24gb2YgYSB7QGxpbmsgUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3l9CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5CisJZXh0ZW5kcyBPcm1Kb2luaW5nU3RyYXRlZ3ksIFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5Cit7CisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCisJcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1RdWVyeS5qYXZhCmluZGV4IGYzNzkwY2MuLmI1MzUyMzIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1RdWVyeS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1RdWVyeS5qYXZhCkBAIC0xMSw2ICsxMSw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIAogLyoqCkBAIC0yMiw3ICsyMyw3IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUXVlcnkgZXh0ZW5kcyBRdWVyeSwgT3JtSnBhQ29udGV4dE5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgT3JtUXVlcnkgZXh0ZW5kcyBRdWVyeSwgWG1sQ29udGV4dE5vZGUKIHsKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlMaXN0SXRlcmF0b3I8T3JtUXVlcnlIaW50PiBoaW50cygpOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVF1ZXJ5Q29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUXVlcnlDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGQzYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVF1ZXJ5Q29udGFpbmVyLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworCitwdWJsaWMgaW50ZXJmYWNlIE9ybVF1ZXJ5Q29udGFpbmVyIGV4dGVuZHMgUXVlcnlDb250YWluZXIsIFhtbENvbnRleHROb2RlCit7CisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcygpOworCisJT3JtTmFtZWRRdWVyeSBhZGROYW1lZFF1ZXJ5KGludCBpbmRleCk7CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzKCk7CisKKwlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IGFkZE5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4KTsKKwkKKwl2b2lkIHVwZGF0ZSgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1RdWVyeUhpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1RdWVyeUhpbnQuamF2YQppbmRleCAzMDMxZmY2Li5jNmVmYzlhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUXVlcnlIaW50LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVF1ZXJ5SGludC5qYXZhCkBAIC0xMCw2ICsxMCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeUhpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50OwogCiAvKioKQEAgLTIxLDkgKzIyLDExIEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUXVlcnlIaW50IGV4dGVuZHMgUXVlcnlIaW50LCBPcm1KcGFDb250ZXh0Tm9kZQorcHVibGljIGludGVyZmFjZSBPcm1RdWVyeUhpbnQgZXh0ZW5kcyBRdWVyeUhpbnQsIFhtbENvbnRleHROb2RlCiB7Ci0Jdm9pZCBpbml0aWFsaXplKFhtbFF1ZXJ5SGludCBxdWVyeUhpbnQpOwotCi0Jdm9pZCB1cGRhdGUoWG1sUXVlcnlIaW50IHF1ZXJ5SGludCk7CisJLyoqCisJICogVXBkYXRlIHRoZSBPcm1RdWVyeUhpbnQgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIFhtbFF1ZXJ5SGludCAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KKwl2b2lkIHVwZGF0ZShYbWxRdWVyeUhpbnQgcmVzb3VyY2VRdWVyeUhpbnQpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmluZGV4IDZlMzVlYTUuLmQ1ODc3OWQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpAQCAtMTIsOCArMTIsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKIAogLyoqCi0gKiAKLSAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKICAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCkBAIC0yMyw1ICsyMSw3IEBACiBwdWJsaWMgaW50ZXJmYWNlIE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcKIAlleHRlbmRzIE9ybUF0dHJpYnV0ZU1hcHBpbmcsIFJlbGF0aW9uc2hpcE1hcHBpbmcKIHsKLQkvLyBub3RoaW5nIHlldAorCU9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwkKKwlPcm1DYXNjYWRlIGdldENhc2NhZGUoKTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGYyNjkzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UKKwlleHRlbmRzIFhtbENvbnRleHROb2RlLCBSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwlPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKwkKKwl2b2lkIHVwZGF0ZSgpOworCisJdm9pZCBpbml0aWFsaXplT24oT3JtUmVsYXRpb25zaGlwUmVmZXJlbmNlIG5ld1JlbGF0aW9uc2hpcFJlZmVyZW5jZSk7CisJCisJdm9pZCBpbml0aWFsaXplRnJvbU93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCisJCU9ybU93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2Ugb2xkUmVsYXRpb25zaGlwUmVmZXJlbmNlKTsKKwkKKwl2b2lkIGluaXRpYWxpemVGcm9tSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCisJCU9ybUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlIG9sZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSk7CisJCisJdm9pZCBpbml0aWFsaXplRnJvbUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCisJCU9ybUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2Ugb2xkUmVsYXRpb25zaGlwUmVmZXJlbmNlKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1TZWNvbmRhcnlUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVNlY29uZGFyeVRhYmxlLmphdmEKaW5kZXggNDdlNWNiNC4uNWI4ZTFlNCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVNlY29uZGFyeVRhYmxlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVNlY29uZGFyeVRhYmxlLmphdmEKQEAgLTExLDYgKzExLDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZTsKIAogLyoqCkBAIC0yMiw5ICsyMywxMyBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVNlY29uZGFyeVRhYmxlIGV4dGVuZHMgU2Vjb25kYXJ5VGFibGUsIE9ybUpwYUNvbnRleHROb2RlCitwdWJsaWMgaW50ZXJmYWNlIE9ybVNlY29uZGFyeVRhYmxlIGV4dGVuZHMgU2Vjb25kYXJ5VGFibGUsIFhtbENvbnRleHROb2RlCiB7CiAKKwkvKioKKwkgKiBVcGRhdGUgdGhlIE9ybVNlY29uZGFyeVRhYmxlIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBYbWxTZWNvbmRhcnlUYWJsZSAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KIAl2b2lkIHVwZGF0ZShYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSk7CiAKIAl2b2lkIGluaXRpYWxpemVGcm9tKFNlY29uZGFyeVRhYmxlIG9sZFNlY29uZGFyeVRhYmxlKTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1TZXF1ZW5jZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVNlcXVlbmNlR2VuZXJhdG9yLmphdmEKaW5kZXggZWQ3NWEzYi4uYzgwNzA3OSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVNlcXVlbmNlR2VuZXJhdG9yLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVNlcXVlbmNlR2VuZXJhdG9yLmphdmEKQEAgLTEwLDYgKzEwLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwogCiAvKioKQEAgLTIxLDkgKzIyLDEyIEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtU2VxdWVuY2VHZW5lcmF0b3IgZXh0ZW5kcyBTZXF1ZW5jZUdlbmVyYXRvciwgT3JtR2VuZXJhdG9yLCBPcm1KcGFDb250ZXh0Tm9kZQorcHVibGljIGludGVyZmFjZSBPcm1TZXF1ZW5jZUdlbmVyYXRvciBleHRlbmRzIFNlcXVlbmNlR2VuZXJhdG9yLCBPcm1HZW5lcmF0b3IsIFhtbENvbnRleHROb2RlCiB7Ci0Jdm9pZCBpbml0aWFsaXplKFhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yKTsKLQorCQorCS8qKgorCSAqIFVwZGF0ZSB0aGUgT3JtU2VxdWVuY2VHZW5lcmF0b3IgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIFhtbFNlcXVlbmNlR2VuZXJhdG9yIAorCSAqIHJlc291cmNlIG1vZGVsIG9iamVjdC4gc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQorCSAqLwogCXZvaWQgdXBkYXRlKFhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQppbmRleCBiZmNlZDEzLi5jMDlhYmJmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKQEAgLTksNyArOSw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKIAotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nOwogCiAvKioKQEAgLTIxLDE3ICsyMCw4IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBleHRlbmRzIE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcsIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKK3B1YmxpYyBpbnRlcmZhY2UgT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyAKKwlleHRlbmRzIE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcsIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKIHsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMoKTsKLQkKLQlPcm1Kb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCi0JT3JtSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JCiAJCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtU3RydWN0dXJlTm9kZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1TdHJ1Y3R1cmVOb2Rlcy5qYXZhCmluZGV4IGY2ZTVkYmEuLjRhMzdmYmUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1TdHJ1Y3R1cmVOb2Rlcy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1TdHJ1Y3R1cmVOb2Rlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTIzLDEyICsyMywxMCBAQAogcHVibGljIGludGVyZmFjZSBPcm1TdHJ1Y3R1cmVOb2RlcyAKIHsKIAkKLQlTdHJpbmcgRU5USVRZX01BUFBJTkdTX0lEID0gCi0JCUpwdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5vcm0uZW50aXR5TWFwcGluZ3MiOworCVN0cmluZyBFTlRJVFlfTUFQUElOR1NfSUQgPSBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIub3JtLmVudGl0eU1hcHBpbmdzIjsgLy8kTk9OLU5MUy0xJAogCQotCVN0cmluZyBQRVJTSVNURU5UX1RZUEVfSUQgPSAKLQkJSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLm9ybS5wZXJzaXN0ZW50VHlwZSI7CisJU3RyaW5nIFBFUlNJU1RFTlRfVFlQRV9JRCA9IEpwdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5vcm0ucGVyc2lzdGVudFR5cGUiOyAvLyROT04tTkxTLTEkCiAJCi0JU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0lEID0KLQkJSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLm9ybS5wZXJzaXN0ZW50QXR0cmlidXRlIjsKKwlTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfSUQgPSBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIub3JtLnBlcnNpc3RlbnRBdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCisKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVRhYmxlLmphdmEKaW5kZXggY2EwZDJiNy4uNTAxNDFhNSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVRhYmxlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVRhYmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTEsNiArMTEsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKIAogLyoqCkBAIC0yMiwxMSArMjMsMTUgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBPcm1UYWJsZSBleHRlbmRzIFRhYmxlLCBPcm1KcGFDb250ZXh0Tm9kZQorcHVibGljIGludGVyZmFjZSBPcm1UYWJsZSBleHRlbmRzIFRhYmxlLCBYbWxDb250ZXh0Tm9kZQogewotCXZvaWQgaW5pdGlhbGl6ZShYbWxFbnRpdHkgZW50aXR5KTsKKwl2b2lkIGluaXRpYWxpemUoWG1sRW50aXR5IHJlc291cmNlRW50aXR5KTsKIAotCXZvaWQgdXBkYXRlKFhtbEVudGl0eSBlbnRpdHkpOworCS8qKgorCSAqIFVwZGF0ZSB0aGUgT3JtVGFibGUgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIFhtbEVudGl0eSAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KKwl2b2lkIHVwZGF0ZShYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkpOwogCiAJCiAJLy8qKioqKioqKioqKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqKioqKioqKioqCkBAIC0zNSw0ICs0MCw1IEBACiAJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzKCk7CiAJCiAJT3JtVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVGFibGVHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UYWJsZUdlbmVyYXRvci5qYXZhCmluZGV4IDlmMzE4M2EuLjQ3MmU5N2EgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UYWJsZUdlbmVyYXRvci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UYWJsZUdlbmVyYXRvci5qYXZhCkBAIC0xMSw2ICsxMSw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7CiAKIC8qKgpAQCAtMjIsMTAgKzIzLDEzIEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtVGFibGVHZW5lcmF0b3IgZXh0ZW5kcyBUYWJsZUdlbmVyYXRvciwgT3JtR2VuZXJhdG9yLCBPcm1KcGFDb250ZXh0Tm9kZQorcHVibGljIGludGVyZmFjZSBPcm1UYWJsZUdlbmVyYXRvciBleHRlbmRzIFRhYmxlR2VuZXJhdG9yLCBPcm1HZW5lcmF0b3IsIFhtbENvbnRleHROb2RlCiB7Ci0Jdm9pZCBpbml0aWFsaXplKFhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yKTsKIAorCS8qKgorCSAqIFVwZGF0ZSB0aGUgT3JtVGFibGVHZW5lcmF0b3IgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIFhtbFRhYmxlR2VuZXJhdG9yIAorCSAqIHJlc291cmNlIG1vZGVsIG9iamVjdC4gc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQorCSAqLwogCXZvaWQgdXBkYXRlKFhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yKTsKIAkKIAkvLyoqKioqKioqKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UcmFuc2llbnRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVHJhbnNpZW50TWFwcGluZy5qYXZhCmluZGV4IDQ4ZmZlYzQuLmI2NWFlMDggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UcmFuc2llbnRNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVRyYW5zaWVudE1hcHBpbmcuamF2YQpAQCAtMTAsNyArMTAsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50OwogCiAvKioKICAqIApAQCAtMjMsNyArMjIsNCBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIE9ybVRyYW5zaWVudE1hcHBpbmcgZXh0ZW5kcyBUcmFuc2llbnRNYXBwaW5nLCBPcm1BdHRyaWJ1dGVNYXBwaW5nCiB7Ci0Jdm9pZCBpbml0aWFsaXplKFhtbFRyYW5zaWVudCB0cmFuc2llbnRSZXNvdXJjZSk7Ci0KLQl2b2lkIHVwZGF0ZShYbWxUcmFuc2llbnQgdHJhbnNpZW50UmVzb3VyY2UpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVR5cGVNYXBwaW5nLmphdmEKaW5kZXggYWY0MjRhYi4uNjE4OWNhYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVR5cGVNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVR5cGVNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwxMiArOSwxMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07CiAKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIAogLyoqCkBAIC0yNiwzMCArMjUsMjIgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBPcm1UeXBlTWFwcGluZyBleHRlbmRzIFR5cGVNYXBwaW5nLCBPcm1KcGFDb250ZXh0Tm9kZQorcHVibGljIGludGVyZmFjZSBPcm1UeXBlTWFwcGluZworCWV4dGVuZHMgVHlwZU1hcHBpbmcsIFhtbENvbnRleHROb2RlCiB7Ci0JU3RyaW5nIEpBVkFfUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZID0gImphdmFQZXJzaXN0ZW50VHlwZVByb3BlcnR5IjsKLQorCQogCVN0cmluZyBnZXRDbGFzc18oKTsKIAl2b2lkIHNldENsYXNzKFN0cmluZyBuZXdDbGFzcyk7Ci0JU3RyaW5nIENMQVNTX1BST1BFUlRZID0gImNsYXNzUHJvcGVydHkiOwotCi0JQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKTsKLQlBY2Nlc3NUeXBlIGdldERlZmF1bHRBY2Nlc3MoKTsKLQlTdHJpbmcgREVGQVVMVF9BQ0NFU1NfUFJPUEVSVFkgPSAiZGVmYXVsdEFjY2Vzc1Byb3BlcnR5IjsKLQotCUFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdTcGVjaWZpZWRBY2Nlc3MpOwotCVN0cmluZyBTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZID0gInNwZWNpZmllZEFjY2Vzc1Byb3BlcnR5IjsKKwlTdHJpbmcgQ0xBU1NfUFJPUEVSVFkgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCiAKIAkKIAlib29sZWFuIGlzTWV0YWRhdGFDb21wbGV0ZSgpOwogCUJvb2xlYW4gZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpOwogCXZvaWQgc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuIG5ld1NwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZID0gInNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGVQcm9wZXJ0eSI7CisJCVN0cmluZyBTUEVDSUZJRURfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSI7IC8vJE5PTi1OTFMtMSQKIAogCWJvb2xlYW4gaXNEZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpOwotCQlTdHJpbmcgREVGQVVMVF9NRVRBREFUQV9DT01QTEVURV9QUk9QRVJUWSA9ICJkZWZhdWx0TWV0YWRhdGFDb21wbGV0ZVByb3BlcnR5IjsKKwkJU3RyaW5nIERFRkFVTFRfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFkgPSAiZGVmYXVsdE1ldGFkYXRhQ29tcGxldGUiOyAvLyROT04tTkxTLTEkCiAKIAkKIAkvKioKQEAgLTYzLDI4ICs1NCwzNCBAQAogCSAqIEByZXR1cm4KIAkgKi8KIAlpbnQgZ2V0WG1sU2VxdWVuY2UoKTsKKwkKKwl2b2lkIGFkZFRvUmVzb3VyY2VNb2RlbChYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyk7CiAKIAl2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKTsKLQkJCi0JQWJzdHJhY3RYbWxUeXBlTWFwcGluZyBhZGRUb1Jlc291cmNlTW9kZWwoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpOwogCiAJdm9pZCBpbml0aWFsaXplRnJvbShPcm1UeXBlTWFwcGluZyBvbGRNYXBwaW5nKTsKIAotCUFic3RyYWN0WG1sVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpOwotCQotCUphdmFQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwlYbWxUeXBlTWFwcGluZyBnZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7CiAKIAlUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7CiAKKwlUZXh0UmFuZ2UgZ2V0Q2xhc3NUZXh0UmFuZ2UoKTsKKwogCVRleHRSYW5nZSBnZXRBdHRyaWJ1dGVzVGV4dFJhbmdlKCk7CiAJCiAJYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCk7Ci0JCisKKwkvKioKKwkgKiBVcGRhdGUgdGhlIE9ybVR5cGVNYXBwaW5nIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KKwl2b2lkIHVwZGF0ZSgpOworCisJLy8gKioqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioKKwogCU9ybVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKCk7CiAJCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCk7Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKKwlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlTWFwcGluZz4gYXR0cmlidXRlTWFwcGluZ3MoKTsKKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjVkNTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmc7CisKKy8qKgorICogUGFydCBvZiBtZWNoYW5pc20gdG8gZXh0ZW5kIHRoZSB0eXBlcyBvZiBPUk0gdHlwZSBtYXBwaW5ncy4KKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLyoqCisJICogUmV0dXJuIHRoZSBtYXBwaW5nIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm92aWRlcgorCSAqIEBzZWUge0BsaW5rIE1hcHBpbmdLZXlzfQorCSAqLworCVN0cmluZyBnZXRLZXkoKTsKKwkKKwkvKioKKwkgKiBCdWlsZCBhIHJlc291cmNlIG1hcHBpbmcKKwkgKi8KKwlYbWxUeXBlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KTsKKwkKKwkvKioKKwkgKiBCdWlsZCBhIGNvbnRleHQgbWFwcGluZworCSAqLworCU9ybVR5cGVNYXBwaW5nIGJ1aWxkQ29udGV4dE1hcHBpbmcoCisJCQlPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIAorCQkJWG1sVHlwZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UeXBlTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVHlwZU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjYwZjYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1UeXBlTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtVHlwZU1hcHBpbmdQcm92aWRlcgotewotCVN0cmluZyBnZXRLZXkoKTsKLQkKLQlPcm1UeXBlTWFwcGluZyBidWlsZFR5cGVNYXBwaW5nKEpwYUZhY3RvcnkgZmFjdG9yeSwgT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50KTsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1VbmlxdWVDb25zdHJhaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtVW5pcXVlQ29uc3RyYWludC5qYXZhCmluZGV4IDk5YWJjYzUuLjNlNGExNjcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1VbmlxdWVDb25zdHJhaW50LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVVuaXF1ZUNvbnN0cmFpbnQuamF2YQpAQCAtMTAsNiArMTAsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwogCiAvKioKQEAgLTIxLDcgKzIyLDExIEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtVW5pcXVlQ29uc3RyYWludCBleHRlbmRzIFVuaXF1ZUNvbnN0cmFpbnQsIE9ybUpwYUNvbnRleHROb2RlCitwdWJsaWMgaW50ZXJmYWNlIE9ybVVuaXF1ZUNvbnN0cmFpbnQgZXh0ZW5kcyBVbmlxdWVDb25zdHJhaW50LCBYbWxDb250ZXh0Tm9kZQogeworCS8qKgorCSAqIFVwZGF0ZSB0aGUgT3JtVW5pcXVlQ29uc3RyYWludCBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgWG1sVW5pcXVlQ29uc3RyYWludCAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KIAl2b2lkIHVwZGF0ZShYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1WZXJzaW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVZlcnNpb25NYXBwaW5nLmphdmEKaW5kZXggMzYxOTJjOC4uYTYxMzQ1NiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVZlcnNpb25NYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVZlcnNpb25NYXBwaW5nLmphdmEKQEAgLTEwLDcgKzEwLDYgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uOwogCiAvKioKICAqIApAQCAtMjMsNyArMjIsOSBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIE9ybVZlcnNpb25NYXBwaW5nIGV4dGVuZHMgVmVyc2lvbk1hcHBpbmcsIE9ybUNvbHVtbk1hcHBpbmcsIE9ybUF0dHJpYnV0ZU1hcHBpbmcKIHsKLQl2b2lkIGluaXRpYWxpemUoWG1sVmVyc2lvbiB2ZXJzaW9uKTsKKwkKKwkvLyoqKioqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqKioqKioKKwlPcm1Db252ZXJ0ZXIgZ2V0RGVmYXVsdENvbnZlcnRlcigpOworCU9ybUNvbnZlcnRlciBnZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKTsKIAotCXZvaWQgdXBkYXRlKFhtbFZlcnNpb24gdmVyc2lvbik7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVhtbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVhtbC5qYXZhCmluZGV4IDVlYjZhZjguLmE5Yzc4MmUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1YbWwuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtWG1sLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw1OSArOSwzOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1SZXNvdXJjZTsKIAogLyoqCi0gKiAKLSAqIAorICogSlBBIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuCisgKiA8cD4KICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCiAgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVhtbCBleHRlbmRzIE9ybUpwYUNvbnRleHROb2RlLCBKcGFTdHJ1Y3R1cmVOb2RlCitwdWJsaWMgaW50ZXJmYWNlIE9ybVhtbAorCWV4dGVuZHMgWG1sQ29udGV4dE5vZGUsIE1hcHBpbmdGaWxlCiB7Ci0JCisJLyoqCisJICogY292YXJpYW50IG92ZXJyaWRlCisJICovCiAJTWFwcGluZ0ZpbGVSZWYgZ2V0UGFyZW50KCk7Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBwZXJzaXN0ZW5jZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCisKKworCS8vICoqKioqKioqKiogZW50aXR5IG1hcHBpbmdzICoqKioqKioqKioKKwogCS8qKgogCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgZW50aXR5LW1hcHBpbmdzIHByb3BlcnR5CiAJICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU5USVRZX01BUFBJTkdTX1BST1BFUlRZID0gImVudGl0eU1hcHBpbmdzUHJvcGVydHkiOwotCQotCS8qKiAKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTlRJVFlfTUFQUElOR1NfUFJPUEVSVFkgPSAiZW50aXR5TWFwcGluZ3MiOyAvLyROT04tTkxTLTEkCisKKwkvKioKIAkgKiBSZXR1cm4gdGhlIGNvbnRlbnQgcmVwcmVzZW50ZWQgYnkgdGhlIHJvb3Qgb2YgdGhlIG9ybS54bWwgZmlsZS4KIAkgKiBUaGlzIG1heSBiZSBudWxsLgogCSAqLwogCUVudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCi0JLyoqCi0JICogQWRkIGEgZW50aXR5LW1hcHBpbmdzIG5vZGUgdG8gdGhlIG9ybS54bWwgZmlsZSBhbmQgcmV0dXJuIHRoZSBvYmplY3QgCi0JICogcmVwcmVzZW50aW5nIGl0LgotCSAqIFRocm93cyB7QGxpbmsgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSBpZiBhIGVudGl0eS1tYXBwaW5ncyBub2RlIGFscmVhZHkgZXhpc3RzLgotCSAqLwotCUVudGl0eU1hcHBpbmdzIGFkZEVudGl0eU1hcHBpbmdzKCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBlbnRpdHktbWFwcGluZ3Mgbm9kZSBmcm9tIHRoZSBvcm0ueG1sIGZpbGUuCi0JICogVGhyb3dzIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlmIGEgcGVyc2lzdGVuY2Ugbm9kZSBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQl2b2lkIHJlbW92ZUVudGl0eU1hcHBpbmdzKCk7Ci0JCi0JUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIE9ybVBlcnNpc3RlbnRUeXBlIGxpc3RlZCBpbiB0aGlzIG1hcHBpbmcgZmlsZQotCSAqIHdpdGggdGhlIGdpdmVuIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUuICBSZXR1cm4gbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0KLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQl2b2lkIHVwZGF0ZShPcm1SZXNvdXJjZSBvcm1SZXNvdXJjZSk7CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiMjVhNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9Pcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3JDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKKworcHVibGljIGludGVyZmFjZSBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZXh0ZW5kcyBYbWxDb250ZXh0Tm9kZUZhY3RvcnkKK3sKKwkvLyAqKioqKioqKioqIE9STSBDb250ZXh0IE1vZGVsICoqKioqKioqKioKKworCS8vY292YXJpYW50IG92ZXJyaWRlCisJT3JtWG1sIGJ1aWxkTWFwcGluZ0ZpbGUoTWFwcGluZ0ZpbGVSZWYgcGFyZW50LCBKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSk7CisKKwlFbnRpdHlNYXBwaW5ncyBidWlsZEVudGl0eU1hcHBpbmdzKE9ybVhtbCBwYXJlbnQsIFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKTsKKwkKKwlQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBidWlsZFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVudGl0eU1hcHBpbmdzIHBhcmVudCwgWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpOworCQorCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGJ1aWxkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyk7CisJCisJT3JtUGVyc2lzdGVudFR5cGUgYnVpbGRPcm1QZXJzaXN0ZW50VHlwZShFbnRpdHlNYXBwaW5ncyBwYXJlbnQsIFhtbFR5cGVNYXBwaW5nIHJlc291cmNlTWFwcGluZyk7CisJCisJT3JtRW50aXR5IGJ1aWxkT3JtRW50aXR5KE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sRW50aXR5IHJlc291cmNlTWFwcGluZyk7CisJCisJT3JtTWFwcGVkU3VwZXJjbGFzcyBidWlsZE9ybU1hcHBlZFN1cGVyY2xhc3MoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGluZyk7CisJCisJT3JtRW1iZWRkYWJsZSBidWlsZE9ybUVtYmVkZGFibGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxFbWJlZGRhYmxlIHJlc291cmNlTWFwcGluZyk7CisJCisJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlLk93bmVyIG93bmVyLCBYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZyk7CisJCisJT3JtVGFibGUgYnVpbGRPcm1UYWJsZShPcm1FbnRpdHkgcGFyZW50KTsKKwkKKwlPcm1TZWNvbmRhcnlUYWJsZSBidWlsZE9ybVNlY29uZGFyeVRhYmxlKE9ybUVudGl0eSBwYXJlbnQsIFhtbFNlY29uZGFyeVRhYmxlIHhtbFNlY29uZGFyeVRhYmxlKTsKKwkKKwlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZE9ybVByaW1hcnlLZXlKb2luQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtQmFzZUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHJlc291cmNlUGtKb2luQ29sdW1uKTsKKwkKKwlPcm1Kb2luVGFibGUgYnVpbGRPcm1Kb2luVGFibGUoT3JtSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5IHBhcmVudCwgWG1sSm9pblRhYmxlIHJlc291cmNlSm9pblRhYmxlKTsKKwkKKwlPcm1Kb2luQ29sdW1uIGJ1aWxkT3JtSm9pbkNvbHVtbihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIFhtbEpvaW5Db2x1bW4gcmVzb3VyY2VKb2luQ29sdW1uKTsKKwkKKwlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBidWlsZE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuT3duZXIgb3duZXIsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIpOworCisJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBidWlsZE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoT3JtRW50aXR5IHBhcmVudCwgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciBvd25lciwgWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciByZXNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIpOworCisJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRPcm1BdHRyaWJ1dGVPdmVycmlkZShPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIEF0dHJpYnV0ZU92ZXJyaWRlLk93bmVyIG93bmVyLCBYbWxBdHRyaWJ1dGVPdmVycmlkZSB4bWxBdHRyaWJ1dGVPdmVycmlkZSk7CisJCisJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBidWlsZE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUoT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIEFzc29jaWF0aW9uT3ZlcnJpZGUuT3duZXIgb3duZXIsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSk7CisJCisJT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBidWlsZE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoT3JtQXNzb2NpYXRpb25PdmVycmlkZSBwYXJlbnQsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSk7CisKKwlPcm1EaXNjcmltaW5hdG9yQ29sdW1uIGJ1aWxkT3JtRGlzY3JpbWluYXRvckNvbHVtbihPcm1FbnRpdHkgcGFyZW50LCBPcm1EaXNjcmltaW5hdG9yQ29sdW1uLk93bmVyIG93bmVyKTsKKwkKKwlPcm1DYXNjYWRlIGJ1aWxkT3JtQ2FzY2FkZShPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIHBhcmVudCwgQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIHJlc291cmNlTWFwcGluZyk7CisJCisJT3JtQ29sdW1uIGJ1aWxkT3JtQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtQ29sdW1uLk93bmVyIG93bmVyKTsKKwkKKwlPcm1HZW5lcmF0ZWRWYWx1ZSBidWlsZE9ybUdlbmVyYXRlZFZhbHVlKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sR2VuZXJhdGVkVmFsdWUgcmVzb3VyY2VHZW5lcmF0ZWRWYWx1ZSk7CisJCisJT3JtR2VuZXJhdG9yQ29udGFpbmVyIGJ1aWxkT3JtR2VuZXJhdG9yQ29udGFpbmVyKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sR2VuZXJhdG9yQ29udGFpbmVyIHJlc291cmNlR2VuZXJhdG9yQ29udGFpbmVyKTsKKworCU9ybVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkT3JtU2VxdWVuY2VHZW5lcmF0b3IoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxTZXF1ZW5jZUdlbmVyYXRvciByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKTsKKwkKKwlPcm1UYWJsZUdlbmVyYXRvciBidWlsZE9ybVRhYmxlR2VuZXJhdG9yKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sVGFibGVHZW5lcmF0b3IgcmVzb3VyY2VUYWJsZUdlbmVyYXRvcik7CisJCisJT3JtUXVlcnlDb250YWluZXIgYnVpbGRPcm1RdWVyeUNvbnRhaW5lcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbFF1ZXJ5Q29udGFpbmVyIHJlc291cmNlUXVlcnlDb250YWluZXIpOworCisJT3JtTmFtZWROYXRpdmVRdWVyeSBidWlsZE9ybU5hbWVkTmF0aXZlUXVlcnkoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxOYW1lZE5hdGl2ZVF1ZXJ5IHJlc291cmNlTmFtZWRRdWVyeSk7CisJCisJT3JtTmFtZWRRdWVyeSBidWlsZE9ybU5hbWVkUXVlcnkoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxOYW1lZFF1ZXJ5IHJlc291cmNlTmFtZWRRdWVyeSk7CisJCisJT3JtUXVlcnlIaW50IGJ1aWxkT3JtUXVlcnlIaW50KE9ybVF1ZXJ5IHBhcmVudCwgWG1sUXVlcnlIaW50IHJlc291cmNlUXVlcnloaW50KTsKKwkKKwlPcm1CYXNpY01hcHBpbmcgYnVpbGRPcm1CYXNpY01hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljIHJlc291cmNlTWFwcGluZyk7CisJCisJT3JtTWFueVRvTWFueU1hcHBpbmcgYnVpbGRPcm1NYW55VG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sTWFueVRvTWFueSByZXNvdXJjZU1hcHBpbmcpOworCQorCU9ybU9uZVRvTWFueU1hcHBpbmcgYnVpbGRPcm1PbmVUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxPbmVUb01hbnkgcmVzb3VyY2VNYXBwaW5nKTsKKwkKKwlPcm1NYW55VG9PbmVNYXBwaW5nIGJ1aWxkT3JtTWFueVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZyk7CisJCisJT3JtT25lVG9PbmVNYXBwaW5nIGJ1aWxkT3JtT25lVG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcpOworCQorCU9ybUVtYmVkZGVkSWRNYXBwaW5nIGJ1aWxkT3JtRW1iZWRkZWRJZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEVtYmVkZGVkSWQgcmVzb3VyY2VNYXBwaW5nKTsKKwkKKwlPcm1FbWJlZGRlZE1hcHBpbmcgYnVpbGRPcm1FbWJlZGRlZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEVtYmVkZGVkIHJlc291cmNlTWFwcGluZyk7CisJCisJT3JtSWRNYXBwaW5nIGJ1aWxkT3JtSWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxJZCByZXNvdXJjZU1hcHBpbmcpOworCQorCU9ybVRyYW5zaWVudE1hcHBpbmcgYnVpbGRPcm1UcmFuc2llbnRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxUcmFuc2llbnQgcmVzb3VyY2VNYXBwaW5nKTsKKwkKKwlPcm1WZXJzaW9uTWFwcGluZyBidWlsZE9ybVZlcnNpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxWZXJzaW9uIHJlc291cmNlTWFwcGluZyk7CisJCisJT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZE9ybU51bGxBdHRyaWJ1dGVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxOdWxsQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpOworCQorCU9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRVbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZyk7CisKKwlPcm1VbmlxdWVDb25zdHJhaW50IGJ1aWxkT3JtVW5pcXVlQ29uc3RyYWludChYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIgb3duZXIsIFhtbFVuaXF1ZUNvbnN0cmFpbnQgcmVzb3VyY2VVbmlxdWVDb25zdHJhaW50KTsKKwkKKwlPcm1Db252ZXJ0ZXIgYnVpbGRPcm1FbnVtZXJhdGVkQ29udmVydGVyKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBYbWxDb252ZXJ0aWJsZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nKTsKKwkKKwlPcm1Db252ZXJ0ZXIgYnVpbGRPcm1UZW1wb3JhbENvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgWG1sQ29udmVydGlibGVNYXBwaW5nIHJlc291cmNlTWFwcGluZyk7CisJCisJT3JtQ29udmVydGVyIGJ1aWxkT3JtTG9iQ29udmVydGVyKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBYbWxDb252ZXJ0aWJsZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nKTsKKworCU9ybUNvbnZlcnRlciBidWlsZE9ybU51bGxDb252ZXJ0ZXIoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQpOworCQorCQorCS8vICoqKioqKioqKiogT1JNIFZpcnR1YWwgUmVzb3VyY2UgTW9kZWwgKioqKioqKioqKgorCQorCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsWG1sQXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSwgT3JtVHlwZU1hcHBpbmcgcGFyZW50LCBKb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5KTsKKwkKKwlYbWxCYXNpYyBidWlsZFZpcnR1YWxYbWxCYXNpYyhPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nKTsKKwkKKwlYbWxFbWJlZGRlZElkIGJ1aWxkVmlydHVhbFhtbEVtYmVkZGVkSWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbWJlZGRlZElkTWFwcGluZyBqYXZhRW1iZWRkZWRJZE1hcHBpbmcpOworCQorCVhtbEVtYmVkZGVkIGJ1aWxkVmlydHVhbFhtbEVtYmVkZGVkKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRW1iZWRkZWRNYXBwaW5nIGphdmFFbWJlZGRlZE1hcHBpbmcpOworCQorCVhtbElkIGJ1aWxkVmlydHVhbFhtbElkKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcpOworCQorCVhtbE1hbnlUb09uZSBidWlsZFZpcnR1YWxYbWxNYW55VG9PbmUoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFNYW55VG9PbmVNYXBwaW5nIGphdmFNYW55VG9PbmVNYXBwaW5nKTsKKwkKKwlYbWxNYW55VG9NYW55IGJ1aWxkVmlydHVhbFhtbE1hbnlUb01hbnkoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmcpOworCQorCVhtbE9uZVRvTWFueSBidWlsZFZpcnR1YWxYbWxPbmVUb01hbnkoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nKTsKKwkKKwlYbWxPbmVUb09uZSBidWlsZFZpcnR1YWxYbWxPbmVUb09uZShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YU9uZVRvT25lTWFwcGluZyBqYXZhT25lVG9PbmVNYXBwaW5nKTsKKwkKKwlYbWxUcmFuc2llbnQgYnVpbGRWaXJ0dWFsWG1sVHJhbnNpZW50KE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhVHJhbnNpZW50TWFwcGluZyBqYXZhVHJhbnNpZW50TWFwcGluZyk7CisJCisJWG1sVmVyc2lvbiBidWlsZFZpcnR1YWxYbWxWZXJzaW9uKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhVmVyc2lvbk1hcHBpbmcgamF2YVZlcnNpb25NYXBwaW5nKTsKKwkKKwlYbWxOdWxsQXR0cmlidXRlTWFwcGluZyBidWlsZFZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZyhPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vT3JtWG1sRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVhtbERlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDNlNmRlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL09ybVhtbERlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ybVhtbERlZmluaXRpb24gCisJZXh0ZW5kcyBNYXBwaW5nRmlsZURlZmluaXRpb24KK3sKKwkvL2NvdmFyaWFudCBvdmVycmlkZQorCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBnZXRDb250ZXh0Tm9kZUZhY3RvcnkoKTsKKwkKKwkKKwkvLyAqKioqKioqKioqIE9STSB0eXBlL2F0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCisJCisJLyoqCisJICogUmV0dXJuIGFuIHtAbGluayBPcm1UeXBlTWFwcGluZ0RlZmluaXRpb259IGZvciB0aGUgZ2l2ZW4gdHlwZSBtYXBwaW5nIGtleS4KKwkgKiBUaHJvd3MgYW4ge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaWYgdGhlIG1hcHBpbmcga2V5IGlzIG5vdCBzdXBwb3J0ZWQuCisJICogCisJICogQHBhcmFtIG1hcHBpbmdLZXkgVGhlIHR5cGUgbWFwcGluZyBrZXkKKwkgKiBAcmV0dXJuIFRoZSBtYXBwaW5nIHByb3ZpZGVyIGZvciB0aGUgZ2l2ZW4gbWFwcGluZyBrZXkKKwkgKi8KKwlPcm1UeXBlTWFwcGluZ0RlZmluaXRpb24gZ2V0T3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gYW4ge0BsaW5rIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ufSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSBtYXBwaW5nIGtleS4KKwkgKiBUaGlzIG11c3Qgbm90IHJldHVybiBudWxsLiAgKEBzZWUge0BsaW5rIE51bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbn0pCisJICogVGhyb3dzIGFuIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IGlmIHRoZSBtYXBwaW5nIGtleSBpcyBub3Qgc3VwcG9ydGVkLgorCSAqIAorCSAqIEBwYXJhbSBtYXBwaW5nS2V5IFRoZSBhdHRyaWJ1dGUgbWFwcGluZyBrZXkKKwkgKiBAcmV0dXJuIFRoZSBtYXBwaW5nIGRlZmluaXRpb24gZm9yIHRoZSBnaXZlbiBtYXBwaW5nIGtleQorCSAqLworCU9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MjJmYmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZXh0ZW5kcyBPcm1KcGFDb250ZXh0Tm9kZQotewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWRTY2hlbWEgaWYgbm90IG51bGwsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHRTY2hlbWEuCi0JICovCi0JU3RyaW5nIGdldFNjaGVtYSgpOwotCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCk7Ci0JCVN0cmluZyBERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSA9ICJkZWZhdWx0U2NoZW1hUHJvcGVydHkiOwotCVN0cmluZyBnZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQl2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgbmV3U3BlY2lmaWVkU2NoZW1hKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkgPSAic3BlY2lmaWVkU2NoZW1hUHJvcGVydHkiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWRDYXRhbG9nIGlmIG5vdCBudWxsLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0Q2F0YWxvZy4KLQkgKi8KLQlTdHJpbmcgZ2V0Q2F0YWxvZygpOwotCVN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZygpOwotCQlTdHJpbmcgREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZID0gImRlZmF1bHRDYXRhbG9nUHJvcGVydHkiOwotCVN0cmluZyBnZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nKFN0cmluZyBuZXdTcGVjaWZpZWRDYXRhbG9nKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZID0gInNwZWNpZmllZENhdGFsb2dQcm9wZXJ0eSI7Ci0KLQlBY2Nlc3NUeXBlIGdldEFjY2VzcygpOwotCXZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpOwotCQlTdHJpbmcgQUNDRVNTX1BST1BFUlRZID0gImFjY2Vzc1Byb3BlcnR5IjsKLQotCWJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpOwotCi0Jdm9pZCBzZXRDYXNjYWRlUGVyc2lzdChib29sZWFuIHZhbHVlKTsKLQlTdHJpbmcgQ0FTQ0FERV9QRVJTSVNUX1BST1BFUlRZID0gImNhc2NhZGVQZXJzaXN0UHJvcGVydHkiOwotCQotCQotCXZvaWQgdXBkYXRlKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQppbmRleCA0YjAwZjA1Li44ZDE4N2UyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDcgKzksOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm07CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7CiAKIC8qKgogICogCkBAIC0yMCwxNCArMjEsMjIgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBleHRlbmRzIE9ybUpwYUNvbnRleHROb2RlCitwdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGV4dGVuZHMgWG1sQ29udGV4dE5vZGUKIHsKIAlib29sZWFuIGlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKTsKIAl2b2lkIHNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4gdmFsdWUpOwotCQlTdHJpbmcgWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFkgPSAieG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVQcm9wZXJ0eSI7CisJCVN0cmluZyBYTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURV9QUk9QRVJUWSA9ICJ4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSI7IC8vJE5PTi1OTFMtMSQKIAotCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCQotCXZvaWQgdXBkYXRlKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKTsKKwlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCQorCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGdldFJlc291cmNlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKKwkKKwlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBjcmVhdGVSZXNvdXJjZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7CisJCisJLyoqCisJICogVXBkYXRlIHRoZSBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgWG1sRW50aXR5TWFwcGluZ3MgCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCisJdm9pZCB1cGRhdGUoKTsKIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvb3JtL1Vuc3VwcG9ydGVkT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9VbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgwMjk0YwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L29ybS9VbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nOworCitwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IFVuc3VwcG9ydGVkT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBVbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwkKKwlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuYnVpbGRVbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmcocGFyZW50LCAoWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcpIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFJlc291cmNlTWFwcGluZyhPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKG9ybVR5cGVNYXBwaW5nLCBqYXZhQXR0cmlidXRlTWFwcGluZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2xhc3NSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0NsYXNzUmVmLmphdmEKaW5kZXggNTM0MGEwYi4uM2ZhNGVmMyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2xhc3NSZWYuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9DbGFzc1JlZi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDI4ICsxMCwzNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7CiAKIC8qKgotICogCi0gKiAKKyAqIENvbnRleHQgbW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUgWE1MIHJlc291cmNlIG1vZGVsCisgKiB7QGxpbmsgWG1sSmF2YUNsYXNzUmVmfSwgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPmNsYXNzPGNvZGU+IGVsZW1lbnQKKyAqIGluIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuCisgKiBUaGlzIGlzIGFsc28gdXNlZCBmb3IgImltcGxpZWQiIGNsYXNzIHJlZnM7IGkuZS4gY2xhc3MgcmVmcyB0aGF0IGFyZSBub3QKKyAqIGV4cGxpY2l0bHkgbGlzdGVkIGluIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuCisgKiA8cD4KICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCiAgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzUmVmIGV4dGVuZHMgUGVyc2lzdGVuY2VKcGFDb250ZXh0Tm9kZSwgSnBhU3RydWN0dXJlTm9kZQorcHVibGljIGludGVyZmFjZSBDbGFzc1JlZgorCWV4dGVuZHMgWG1sQ29udGV4dE5vZGUsIEpwYVN0cnVjdHVyZU5vZGUsIFBlcnNpc3RlbnRUeXBlLk93bmVyCiB7CiAJLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIElDbGFzc1JlZiBtYXRjaGVzIHRoZSBmdWxseVF1YWxmaWVkVHlwZU5hbWUKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgY2xhc3MgcmVmIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KIAkgKi8KLQlib29sZWFuIGlzRm9yKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKKwlib29sZWFuIGlzRm9yKFN0cmluZyB0eXBlTmFtZSk7CiAJCiAJLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtYXBwaW5nIGZpbGUgcmVmIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVudHJ5IGluIHRoZQotCSAqIHBlcnNpc3RlbmNlLnhtbCAoZmFsc2UpIG9yIGlmIGl0IGlzIGluc3RlYWQgdmlydHVhbAorCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtYXBwaW5nIGZpbGUgcmVmIGlzICJ2aXJ0dWFsIjsKKwkgKiByZXR1cm4gZmFsc2UgaWYgdGhlIG1hcHBpbmcgZmlsZSByZWYgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW50cnkgaW4gdGhlCisJICogcGVyc2lzdGVuY2UueG1sIGZpbGUuCiAJICovCiAJYm9vbGVhbiBpc1ZpcnR1YWwoKTsKIAkKQEAgLTQxLDcgKzQ5LDcgQEAKIAkvKioKIAkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIGNsYXNzIG5hbWUKIAkgKi8KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX05BTUVfUFJPUEVSVFkgPSAiY2xhc3NOYW1lIjsKKwlmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX05BTUVfUFJPUEVSVFkgPSAiY2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAogCQogCS8qKgogCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MgcmVmLgpAQCAtNTksNyArNjcsNyBAQAogCS8qKgogCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgamF2YSBwZXJzaXN0ZW50IHR5cGUKIAkgKi8KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZID0gImphdmFQZXJzaXN0ZW50VHlwZSI7CisJZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX1BFUlNJU1RFTlRfVFlQRV9QUk9QRVJUWSA9ICJqYXZhUGVyc2lzdGVudFR5cGUiOyAvLyROT04tTkxTLTEkCiAJCiAJLyoqCiAJICogUmV0dXJuIHRoZSBKYXZhUGVyc2lzdGVudFR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIElDbGFzc1JlZi4KQEAgLTcxLDggKzc5LDE3IEBACiAJCiAJLy8gKioqKioqKioqKioqKioqKiB1cGRhdGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkKKwkvKioKKwkgKiBVcGRhdGUgdGhlIENsYXNzUmVmIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBYbWxKYXZhQ2xhc3NSZWYgCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCiAJdm9pZCB1cGRhdGUoWG1sSmF2YUNsYXNzUmVmIGNsYXNzUmVmKTsKIAkKKwkvKioKKwkgKiBVcGRhdGUgdGhlIENsYXNzUmVmIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBjbGFzc05hbWUuIFRoaXMgaXMgdXNlZAorCSAqIGZvciBpbXBsaWVkQ2xhc3NSZWZzIGluIHRoZSBQZXJzaXN0ZW5jZVVuaXQuCisJICogc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0I3VwZGF0ZSgpfQorCSAqLwogCXZvaWQgdXBkYXRlKFN0cmluZyBjbGFzc05hbWUpOwogCQogCQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvSmFyRmlsZVJlZi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvSmFyRmlsZVJlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjQ0YzcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9KYXJGaWxlUmVmLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphckZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZjsKKworLyoqCisgKiBDb250ZXh0IG1vZGVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIAorICogWE1MIHJlc291cmNlIG1vZGVsIHtAbGluayBYbWxKYXJSZWZ9LAorICogd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPmphci1maWxlPC9jb2RlPgorICogZWxlbWVudCBpbiB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLgorICogPHA+CisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBKYXJGaWxlUmVmCisJZXh0ZW5kcyBYbWxDb250ZXh0Tm9kZSwgSnBhU3RydWN0dXJlTm9kZSwgUGVyc2lzdGVudFR5cGVDb250YWluZXIKK3sKKwkvLyAqKioqKioqKioqKioqKioqIGZpbGUgbmFtZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJLyoqCisJICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBmaWxlIG5hbWUuCisJICovCisJU3RyaW5nIEZJTEVfTkFNRV9QUk9QRVJUWSA9ICJmaWxlTmFtZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGZpbGUgbmFtZSBvZiB0aGUgamFyIGZpbGUgcmVmLgorCSAqLworCVN0cmluZyBnZXRGaWxlTmFtZSgpOworCQorCS8qKgorCSAqIFNldCB0aGUgZmlsZSBuYW1lIG9mIHRoZSBqYXIgZmlsZSByZWYuCisJICovCisJdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpOworCQorCQorCS8vICoqKioqKioqKioqKioqKiogSkFSIGZpbGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwkvKioKKwkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIEpBUiBmaWxlLgorCSAqLworCVN0cmluZyBKQVJfRklMRV9QUk9QRVJUWSA9ICJqYXJGaWxlIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFJldHVybiB0aGUgSkFSIGZpbGUgcmVmJ3MgSkFSIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgZmlsZSBuYW1lLgorCSAqLworCUphckZpbGUgZ2V0SmFyRmlsZSgpOworCQorCQorCS8vICoqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwkvKioKKwkgKiBVcGRhdGUgdGhlIGNvbnRleHQgSkFSIGZpbGUgcmVmIHRvIG1hdGNoIHRoZSBzcGVjaWZpZWQgWE1MIEpBUiBmaWxlIHJlZi4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCkKKwkgKi8KKwl2b2lkIHVwZGF0ZShYbWxKYXJGaWxlUmVmIHhtbEphckZpbGVSZWYpOworCQorCQorCS8vICoqKioqKioqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgcGVyc2lzdGVudCB0eXBlLCBhcyBsaXN0ZWQgaW4gdGhlIEpBUiBmaWxlLAorCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBSZXR1cm4gbnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdHMuCisJICovCisJUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoU3RyaW5nIHR5cGVOYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgSkFSIGZpbGUgcmVmIGNvbnRhaW5zCisJICogdGhlIHNwZWNpZmllZCB0ZXh0IG9mZnNldC4KKwkgKi8KKwlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL01hcHBpbmdGaWxlUmVmLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9NYXBwaW5nRmlsZVJlZi5qYXZhCmluZGV4IDllNmZhMTUuLjgwZTZlNWQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL01hcHBpbmdGaWxlUmVmLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvTWFwcGluZ0ZpbGVSZWYuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3MyArMTAsOTUgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLlBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKIAogLyoqCi0gKiAKLSAqIAorICogQ29udGV4dCBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZQorICogWE1MIHJlc291cmNlIG1vZGVsIHtAbGluayBYbWxNYXBwaW5nRmlsZVJlZn0sCisgKiB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+bWFwcGluZy1maWxlPC9jb2RlPiBlbGVtZW50CisgKiBpbiB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLgorICogPHA+CiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBNYXBwaW5nRmlsZVJlZiBleHRlbmRzIFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUsIEpwYVN0cnVjdHVyZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgTWFwcGluZ0ZpbGVSZWYKKwlleHRlbmRzIFhtbENvbnRleHROb2RlLCBKcGFTdHJ1Y3R1cmVOb2RlLCBQZXJzaXN0ZW50VHlwZUNvbnRhaW5lcgogeworCisJLy8gKioqKioqKioqKiBmaWxlIG5hbWUgKioqKioqKioqKgorCiAJLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtYXBwaW5nIGZpbGUgcmVmIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVudHJ5IGluIHRoZQotCSAqIHBlcnNpc3RlbmNlLnhtbCAoZmFsc2UpIG9yIGlmIGl0IGlzIGluc3RlYWQgdmlydHVhbAorCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgZmlsZSBuYW1lLgogCSAqLwotCWJvb2xlYW4gaXNWaXJ0dWFsKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBmaWxlIG5hbWUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgZmlsZSBuYW1lCi0JICovCi0JU3RyaW5nIEZJTEVfTkFNRV9QUk9QRVJUWSA9ICJmaWxlTmFtZVByb3BlcnR5IjsKLQkKKwlTdHJpbmcgRklMRV9OQU1FX1BST1BFUlRZID0gImZpbGVOYW1lIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqCiAJICogUmV0dXJuIHRoZSBmaWxlIG5hbWUgb2YgdGhlIG1hcHBpbmcgZmlsZSByZWYuCiAJICovCiAJU3RyaW5nIGdldEZpbGVOYW1lKCk7Ci0JCisKIAkvKioKIAkgKiBTZXQgdGhlIGZpbGUgbmFtZSBvZiB0aGUgbWFwcGluZyBmaWxlIHJlZi4KIAkgKi8KIAl2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBvcm0geG1sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCVN0cmluZyBPUk1fWE1MX1BST1BFUlRZID0gIm9ybVhtbFByb3BlcnR5IjsKLQkKLQlPcm1YbWwgZ2V0T3JtWG1sKCk7CQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdWRwYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQl2b2lkIHVwZGF0ZShYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZik7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCisKKworCS8vICoqKioqKioqKiogbWFwcGluZyBmaWxlIChvcm0ueG1sKSAqKioqKioqKioqCisKIAkvKioKLQkgKiBSZXR1cm4gdGhlIE9ybVBlcnNpc3RlbnRUeXBlIGxpc3RlZCBpbiB0aGlzIG1hcHBpbmcgZmlsZQotCSAqIHdpdGggdGhlIGdpdmVuIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUuICBSZXR1cm4gbnVsbCBpZiBub25lIGV4aXN0cy4KKwkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIG1hcHBpbmcgZmlsZS4KIAkgKi8KLQlPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JCisJU3RyaW5nIE1BUFBJTkdfRklMRV9QUk9QRVJUWSA9ICJtYXBwaW5nRmlsZSI7IC8vJE5PTi1OTFMtMSQKKwogCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGVyc2lzdGVuY2UgdW5pdCBjb250YWlucwotCSAqIHRoZSBnaXZlbiB0ZXh0IG9mZnNldAorCSAqIFJldHVybiB0aGUgbWFwcGluZyBmaWxlIHJlZidzIG1hcHBpbmcgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWxlIG5hbWUuCisJICovCisJTWFwcGluZ0ZpbGUgZ2V0TWFwcGluZ0ZpbGUoKTsKKworCisJLy8gKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqCisKKwkvKioKKwkgKiBVcGRhdGUgdGhlIE1hcHBpbmdGaWxlUmVmIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBYbWxNYXBwaW5nRmlsZVJlZiAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KKwl2b2lkIHVwZGF0ZShYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZik7CisKKworCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWFwcGluZyBmaWxlIHJlZiBpcyAiaW1wbGllZCIgYnksIG9yIGV4cGxpY2l0bHkKKwkgKiBzcGVjaWZpZWQgaW4sIHRoZSBwZXJzaXN0ZW5jZS54bWwuCisJICovCisJYm9vbGVhbiBpc0ltcGxpZWQoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgbWFwcGluZyBmaWxlJ3MgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cy4KKwkgKi8KKwlNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWFwcGluZyBmaWxlJ3MgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cyBleGlzdC4KKwkgKi8KKwlib29sZWFuIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRXhpc3RzKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbnQgdHlwZSwgYXMgbGlzdGVkIGluIHRoZSBtYXBwaW5nIGZpbGUsCisJICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFJldHVybiBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0cy4KKwkgKi8KKwlQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgdHlwZU5hbWUpOworCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hcHBpbmcgZmlsZSBjb250YWlucworCSAqIHRoZSBzcGVjaWZpZWQgdGV4dCBvZmZzZXQuCiAJICovCiAJYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCk7Ci0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZS5qYXZhCmluZGV4IGE0MjFmMDkuLmUzNDE0MWQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2UuamF2YQpAQCAtMTEsMjUgKzExLDM4IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLk1ldGFtb2RlbEdlbmVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKIAogLyoqCi0gKiAKLSAqIAorICogVGhlIDxjb2RlPnBlcnNpc3RlbmNlPC9jb2RlPiBlbGVtZW50IGluIHRoZSBKUEEgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLgorICogPHA+CiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZSBleHRlbmRzIFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUsIEpwYVN0cnVjdHVyZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2UKKwlleHRlbmRzIFhtbENvbnRleHROb2RlLCBKcGFTdHJ1Y3R1cmVOb2RlLCBNZXRhbW9kZWxHZW5lcmF0b3IKIHsKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIG1vZGVsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZXh0IG1vZGVsIG9iamVjdAorCSAqLworCVhtbFBlcnNpc3RlbmNlIGdldFhtbFBlcnNpc3RlbmNlKCk7CisJCisJLyoqCisJICogQ292YXJpYW50IG92ZXJyaWRlLgorCSAqLworCVBlcnNpc3RlbmNlWG1sIGdldFBhcmVudCgpOworCQogCS8vICoqKioqKioqKioqKioqKiogcGVyc2lzdGVuY2UgdW5pdHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkKIAkvKioKIAkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXRzIGxpc3QKIAkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9VTklUU19MSVNUID0gInBlcnNpc3RlbmNlVW5pdHMiOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRTX0xJU1QgPSAicGVyc2lzdGVuY2VVbml0cyI7IC8vJE5PTi1OTFMtMSQKIAkKIAkvKioKIAkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGxpc3Qgb2YgcGVyc2lzdGVuY2UgdW5pdHMuCkBAIC02OCw2ICs4MSwxMCBAQAogCQogCS8vICoqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkJCisJLyoqCisJICogVXBkYXRlIHRoZSBQZXJzaXN0ZW5jZSBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgWG1sUGVyc2lzdGVuY2UgCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCiAJdm9pZCB1cGRhdGUoWG1sUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UpOwogCQogCQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VKcGFDb250ZXh0Tm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VKcGFDb250ZXh0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjQ2OGNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VKcGFDb250ZXh0Tm9kZSBleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgdG8gdGhlIGxpc3Qgb2YgY3VycmVudCB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0JICovCi0Jdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKTsKLQotCVRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuamF2YQppbmRleCAxYTdlZWZlLi43MjAwMDVkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VTdHJ1Y3R1cmVOb2Rlcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTIyLDE2ICsyMiwxMyBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMgCiB7CisJU3RyaW5nIFBSRUZJWCA9IEpwdENvcmVQbHVnaW4uUExVR0lOX0lEXyArICJwZXJzaXN0ZW5jZSI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgUFJFRklYXyA9IFBSRUZJWCArICcuJzsKKworCVN0cmluZyBQRVJTSVNURU5DRV9JRCA9IFBSRUZJWF8gKyAicGVyc2lzdGVuY2UiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfSUQgPSBQUkVGSVhfICsgInBlcnNpc3RlbmNlVW5pdCI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgQ0xBU1NfUkVGX0lEID0gUFJFRklYXyArICJjbGFzc1JlZiI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgTUFQUElOR19GSUxFX1JFRl9JRCA9IFBSRUZJWF8gKyAibWFwcGluZ0ZpbGVSZWYiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIEpBUl9GSUxFX1JFRl9JRCA9IFBSRUZJWF8gKyAiamFyRmlsZVJlZiI7IC8vJE5PTi1OTFMtMSQKIAkKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfSUQgPSAKLQkJSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLnBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlIjsKLQkKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9JRCA9IAotCQlKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIucGVyc2lzdGVuY2UucGVyc2lzdGVuY2VVbml0IjsKLQkKLQlTdHJpbmcgQ0xBU1NfUkVGX0lEID0KLQkJSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLnBlcnNpc3RlbmNlLmNsYXNzUmVmIjsKLQkKLQlTdHJpbmcgTUFQUElOR19GSUxFX1JFRl9JRCA9Ci0JCUpwdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5wZXJzaXN0ZW5jZS5tYXBwaW5nRmlsZVJlZiI7CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdC5qYXZhCmluZGV4IGM0ZDdiMjQuLmY3MDA2NmYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksNDYyICs5LDY5OCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKIAoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuTWV0YW1vZGVsR2VuZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eTsKIAogLyoqCi0gKiAKLSAqIAorICogQ29udGV4dCBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBYTUwgcmVzb3VyY2UgbW9kZWwge0BsaW5rIFhtbFBlcnNpc3RlbmNlVW5pdH0sCisgKiB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+cGVyc2lzdGVuY2UtdW5pdDwvY29kZT4gZWxlbWVudCBpbiB0aGUKKyAqIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS4KKyAqIDxwPgogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKICAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VVbml0IGV4dGVuZHMgUGVyc2lzdGVuY2VKcGFDb250ZXh0Tm9kZSwgSnBhU3RydWN0dXJlTm9kZQorcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZVVuaXQKKwlleHRlbmRzIFhtbENvbnRleHROb2RlLCBKcGFTdHJ1Y3R1cmVOb2RlLCBNZXRhbW9kZWxHZW5lcmF0b3IKIHsKLQkvLyAqKioqKioqKioqKioqKioqIHBhcmVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JUGVyc2lzdGVuY2UgZ2V0UGFyZW50KCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBuYW1lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQogCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIG5hbWUKKwkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCiAJICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQorCVBlcnNpc3RlbmNlIGdldFBhcmVudCgpOworCisKKwkvLyAqKioqKioqKioqIG5hbWUgKioqKioqKioqKgorCiAJLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIG5hbWUuCisJICovCisJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIG5hbWUuCiAJICovCiAJU3RyaW5nIGdldE5hbWUoKTsKLQkKKwogCS8qKgotCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KKwkgKiBTZXQgdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBuYW1lLgogCSAqLwogCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB0cmFuc2FjdGlvbiB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQorCisKKwkvLyAqKioqKioqKioqIHRyYW5zYWN0aW9uIHR5cGUgKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgdHJhbnNhY3Rpb24gdHlwZSwKKwkgKiB3aGV0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQuCisJICovCiAJUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldFRyYW5zYWN0aW9uVHlwZSgpOwogCiAJLyoqCiAJICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgCiAJICogc3BlY2lmaWVkIHRyYW5zYWN0aW9uIHR5cGUKIAkgKi8KLQlTdHJpbmcgU1BFQ0lGSUVEX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkgPSAidHJhbnNhY3Rpb25UeXBlIjsKLQkKKwlTdHJpbmcgU1BFQ0lGSUVEX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqIAotCSAqIFJldHVybiB0aGUgdHJhbnNhY3Rpb24gdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgb25lIG9mIHRoZSB2YWx1ZXMgb2YgCi0JICoge0BsaW5rIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZX0gCisJICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3Mgc3BlY2lmaWVkIHRyYW5zYWN0aW9uIHR5cGUuCiAJICovCiAJUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSgpOwotCQorCiAJLyoqIAotCSAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgb25lIG9mIHRoZSB2YWx1ZXMgb2YgCi0JICoge0BsaW5rIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZX0gCisJICogU2V0IHRoZSBwZXJzaXN0ZW5jZSB1bml0J3Mgc3BlY2lmaWVkIHRyYW5zYWN0aW9uIHR5cGUuCiAJICovCiAJdm9pZCBzZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHRyYW5zYWN0aW9uVHlwZSk7Ci0JCisKIAkvKioKIAkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyAKLQkgKiBkZWZhdWx0IHRyYW5zYWN0aW9uIHR5cGUgKG5vdCB0eXBpY2FsbHkgY2hhbmdlZCkKKwkgKiBkZWZhdWx0IHRyYW5zYWN0aW9uIHR5cGUgKG5vdCB0eXBpY2FsbHkgY2hhbmdlZCkuCiAJICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdFRyYW5zYWN0aW9uVHlwZSI7Ci0JCisJU3RyaW5nIERFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSA9ICJkZWZhdWx0VHJhbnNhY3Rpb25UeXBlIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqIAotCSAqIFJldHVybiB0aGUgZGVmYXVsdCB0cmFuc2FjdGlvbiB0eXBlIAorCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGRlZmF1bHQgdHJhbnNhY3Rpb24gdHlwZS4KIAkgKi8KIAlQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0RGVmYXVsdFRyYW5zYWN0aW9uVHlwZSgpOwotCQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogZGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKKworCisJLy8gKioqKioqKioqKiBkZXNjcmlwdGlvbiAqKioqKioqKioqCisKIAkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBkZXNjcmlwdGlvbgorCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGRlc2NyaXB0aW9uLgogCSAqLwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT05fUFJPUEVSVFkgPSAiZGVzY3JpcHRpb24iOwotCQorCVN0cmluZyBERVNDUklQVElPTl9QUk9QRVJUWSA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwogCS8qKgotCSAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisJICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgZGVzY3JpcHRpb24uCiAJICovCiAJU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0JCisKIAkvKioKLQkgKiBTZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqIFNldCB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGRlc2NyaXB0aW9uLgogCSAqLwogCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHByb3ZpZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCisKKworCS8vICoqKioqKioqKiogcHJvdmlkZXIgKioqKioqKioqKgorCiAJLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgcHJvdmlkZXIKKwkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBwcm92aWRlci4KIAkgKi8KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1ZJREVSX1BST1BFUlRZID0gInByb3ZpZGVyIjsKLQkKKwlTdHJpbmcgUFJPVklERVJfUFJPUEVSVFkgPSAicHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCisKIAkvKioKLQkgKiBSZXR1cm4gdGhlIHByb3ZpZGVyIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHByb3ZpZGVyLgogCSAqLwogCVN0cmluZyBnZXRQcm92aWRlcigpOwotCQorCiAJLyoqCi0JICogU2V0IHRoZSBwcm92aWRlciBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KKwkgKiBTZXQgdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBwcm92aWRlci4KIAkgKi8KIAl2b2lkIHNldFByb3ZpZGVyKFN0cmluZyBwcm92aWRlcik7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBqdGEgZGF0YSBzb3VyY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQorCisKKwkvLyAqKioqKioqKioqIEpUQSBkYXRhIHNvdXJjZSAqKioqKioqKioqCisKIAkvKioKIAkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBKVEEgZGF0YSBzb3VyY2UKIAkgKi8KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEpUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSA9ICJqdGFEYXRhU291cmNlIjsKLQkKKwlTdHJpbmcgSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZID0gImp0YURhdGFTb3VyY2UiOyAvLyROT04tTkxTLTEkCisKIAkvKioKLQkgKiBSZXR1cm4gdGhlIEpUQSBkYXRhIHNvdXJjZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KKwkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBKVEEgZGF0YSBzb3VyY2UuCiAJICovCiAJU3RyaW5nIGdldEp0YURhdGFTb3VyY2UoKTsKLQkKKwogCS8qKgotCSAqIFNldCB0aGUgSlRBIGRhdGEgc291cmNlIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqIFNldCB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIEpUQSBkYXRhIHNvdXJjZS4KIAkgKi8KIAl2b2lkIHNldEp0YURhdGFTb3VyY2UoU3RyaW5nIGp0YURhdGFTb3VyY2UpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogbm9uLWp0YSBkYXRhIHNvdXJjZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKKworCisJLy8gKioqKioqKioqKiBub24tSlRBIGRhdGEgc291cmNlICoqKioqKioqKioKKwogCS8qKgogCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIG5vbi1KVEEgZGF0YSBzb3VyY2UKIAkgKi8KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE5PTl9KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkgPSAibm9uSnRhRGF0YVNvdXJjZSI7Ci0JCisJU3RyaW5nIE5PTl9KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkgPSAibm9uSnRhRGF0YVNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKKwogCS8qKgotCSAqIFJldHVybiB0aGUgbm9uLUpUQSBkYXRhIHNvdXJjZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KKwkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBub24tSlRBIGRhdGEgc291cmNlLgogCSAqLwogCVN0cmluZyBnZXROb25KdGFEYXRhU291cmNlKCk7Ci0JCisKIAkvKioKLQkgKiBTZXQgdGhlIG5vbi1KVEEgZGF0YSBzb3VyY2Ugb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisJICogU2V0IHRoZSBwZXJzaXN0ZW5jZSB1bml0J3Mgbm9uLUpUQSBkYXRhIHNvdXJjZS4KIAkgKi8KIAl2b2lkIHNldE5vbkp0YURhdGFTb3VyY2UoU3RyaW5nIG5vbkp0YURhdGFTb3VyY2UpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogbWFwcGluZyBmaWxlIHJlZnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKKworCisJLy8gKioqKioqKioqKiBtYXBwaW5nIGZpbGUgcmVmcyAqKioqKioqKioqCisKIAkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGxpc3Qgb2YgbWFwcGluZyBmaWxlIHJlZnMsIHdoZXRoZXIgc3BlY2lmaWVkIG9yCi0JICogaW1wbGllZC4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCisJICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBtYXBwaW5nIGZpbGUgcmVmcywKKwkgKiBib3RoIHNwZWNpZmllZCBhbmQgaW1wbGllZC4KIAkgKi8KIAlMaXN0SXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IG1hcHBpbmdGaWxlUmVmcygpOwotCQorCiAJLyoqCi0JICogUmV0dXJuIG9mIG1hcHBpbmcgZmlsZSByZWZzLCBzcGVjaWZpZWQgYW5kIGltcGxpZWQuCisJICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBtYXBwaW5nIGZpbGUgcmVmcywKKwkgKiBib3RoIHNwZWNpZmllZCBhbmQgaW1wbGllZC4KIAkgKi8KIAlpbnQgbWFwcGluZ0ZpbGVSZWZzU2l6ZSgpOwotCQotCS8vICoqKioqKioqKioqKioqKiogc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKKwogCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWZzIGxpc3QKKwkgKiBSZXR1cm4gYWxsIHRoZSBtYXBwaW5nIGZpbGUgcmVmcywgYm90aCBzcGVjaWZpZWQgYW5kIGltcGxpZWQsCisJICogY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIHR5cGUuCiAJICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBTUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRl9MSVNUID0gInNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcyI7Ci0JCisJSXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IG1hcHBpbmdGaWxlUmVmc0NvbnRhaW5pbmcoU3RyaW5nIHR5cGVOYW1lKTsKKworCisJLy8gKioqKioqKioqKiBzcGVjaWZpZWQgbWFwcGluZyBmaWxlIHJlZnMgKioqKioqKioqKgorCiAJLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHRoZSBsaXN0IG9mIHNwZWNpZmllZCBtYXBwaW5nIGZpbGUgcmVmcy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCisJICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKKwkgKiBzcGVjaWZpZWQgbWFwcGluZyBmaWxlIHJlZnMuCisJICovCisJU3RyaW5nIFNQRUNJRklFRF9NQVBQSU5HX0ZJTEVfUkVGU19MSVNUID0gInNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2Ygc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWZzLgogCSAqLwogCUxpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCk7Ci0JCisKIAkvKioKLQkgKiBSZXR1cm4gb2Ygc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWZzLgorCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2Ygc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWZzLgogCSAqLwogCWludCBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCk7CiAKIAkvKioKLQkgKiBBZGQgYSBzcGVjaWZpZWQgbWFwcGluZyBmaWxlIHJlZiB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgcmV0dXJuIHRoZSBvYmplY3QgCi0JICogcmVwcmVzZW50aW5nIGl0LgorCSAqIEFkZCBhIG5ldyBzcGVjaWZpZWQgbWFwcGluZyBmaWxlIHJlZiB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdDsKKwkgKiByZXR1cm4gdGhlIG5ld2x5LWNyZWF0ZWQgbWFwcGluZyBmaWxlIHJlZi4KIAkgKi8KIAlNYXBwaW5nRmlsZVJlZiBhZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZigpOwotCQorCiAJLyoqCi0JICogQWRkIGEgc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWYgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBhbmQgCi0JICogcmV0dXJuIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIGl0LgorCSAqIEFkZCBhIG5ldyBzcGVjaWZpZWQgbWFwcGluZyBmaWxlIHJlZiB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4OworCSAqIHJldHVybiB0aGUgbmV3bHktY3JlYXRlZCBtYXBwaW5nIGZpbGUgcmVmLgogCSAqLwogCU1hcHBpbmdGaWxlUmVmIGFkZFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKGludCBpbmRleCk7Ci0JCisKIAkvKioKIAkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBtYXBwaW5nIGZpbGUgcmVmIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCiAJICovCiAJdm9pZCByZW1vdmVTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZihNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZik7Ci0JCisKIAkvKioKIAkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBtYXBwaW5nIGZpbGUgcmVmIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KIAkgKi8KIAl2b2lkIHJlbW92ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKGludCBpbmRleCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBpbXBsaWVkIG1hcHBpbmcgZmlsZSByZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQorCisKKwkvLyAqKioqKioqKioqIGltcGxpZWQgbWFwcGluZyBmaWxlIHJlZiAqKioqKioqKioqCisKIAkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIGltcGxpZWQgbWFwcGluZyBmaWxlIHJlZgorCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzCisJICogaW1wbGllZCBtYXBwaW5nIGZpbGUgcmVmLgogCSAqLwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QTElFRF9NQVBQSU5HX0ZJTEVfUkVGX1BST1BFUlRZID0gImltcGxpZWRNYXBwaW5nRmlsZVJlZiI7Ci0JCisJU3RyaW5nIElNUExJRURfTUFQUElOR19GSUxFX1JFRl9QUk9QRVJUWSA9ICJpbXBsaWVkTWFwcGluZ0ZpbGVSZWYiOyAvLyROT04tTkxTLTEkCisKIAkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgaW1wbGllZCBtYXBwaW5nIGZpbGUgcmVmLgotCSAqIFRoaXMgbWF5IGJlIG51bGwuCisJICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgaW1wbGllZCBtYXBwaW5nIGZpbGUgcmVmLgogCSAqLwogCU1hcHBpbmdGaWxlUmVmIGdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogY2xhc3MgcmVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKKworCisJLy8gKioqKioqKioqKiBqYXIgZmlsZSByZWZzICoqKioqKioqKioKKwogCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUgbGlzdCBvZiBjbGFzcyByZWZzLCB3aGV0aGVyIHNwZWNpZmllZCBvciBpbXBsaWVkLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KKwkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncworCSAqIEpBUiBmaWxlIHJlZnMuCiAJICovCi0JTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMoKTsKLQkKKwlTdHJpbmcgSkFSX0ZJTEVfUkVGU19MSVNUID0gImphckZpbGVSZWZzIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWVkIGFuZCBpbXBsaWVkIGNsYXNzIHJlZnMuCisJICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBKQVIgZmlsZSByZWZzLgorCSAqLworCUxpc3RJdGVyYXRvcjxKYXJGaWxlUmVmPiBqYXJGaWxlUmVmcygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBKQVIgZmlsZSByZWZzLgorCSAqLworCWludCBqYXJGaWxlUmVmc1NpemUoKTsKKworCS8qKgorCSAqIEFkZCBhIG5ldyBKQVIgZmlsZSByZWYgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQ7CisJICogcmV0dXJuIHRoZSBuZXdseS1jcmVhdGVkIEpBUiBmaWxlIHJlZi4KKwkgKi8KKwlKYXJGaWxlUmVmIGFkZEphckZpbGVSZWYoKTsKKworCS8qKgorCSAqIEFkZCBhIG5ldyBKQVIgZmlsZSByZWYgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXQgdGhlIHNwZWNpZmllZCBpbmRleDsKKwkgKiByZXR1cm4gdGhlIG5ld2x5LWNyZWF0ZWQgSkFSIGZpbGUgcmVmLgorCSAqLworCUphckZpbGVSZWYgYWRkSmFyRmlsZVJlZihpbnQgaW5kZXgpOworCisJLyoqCisJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgSkFSIGZpbGUgcmVmIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisJICovCisJdm9pZCByZW1vdmVKYXJGaWxlUmVmKEphckZpbGVSZWYgamFyRmlsZVJlZik7CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIEpBUiBmaWxlIHJlZiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisJICovCisJdm9pZCByZW1vdmVKYXJGaWxlUmVmKGludCBpbmRleCk7CisKKworCS8vICoqKioqKioqKiogY2xhc3MgcmVmcyAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBsaXN0IG9mIGNsYXNzIHJlZnMsCisJICogYm90aCBzcGVjaWZpZWQgYW5kIGltcGxpZWQuCisJICovCisJSXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBjbGFzcyByZWZzLAorCSAqIGJvdGggc3BlY2lmaWVkIGFuZCBpbXBsaWVkLgogCSAqLwogCWludCBjbGFzc1JlZnNTaXplKCk7Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBzcGVjaWZpZWQgY2xhc3MgcmVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQorCisKKwkvLyAqKioqKioqKioqIHNwZWNpZmllZCBjbGFzcyByZWZzICoqKioqKioqKioKKwogCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIGNsYXNzIHJlZnMgbGlzdAorCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzCisJICogc3BlY2lmaWVkIGNsYXNzIHJlZnMuCiAJICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBTUEVDSUZJRURfQ0xBU1NfUkVGX0xJU1QgPSAic3BlY2lmaWVkQ2xhc3NSZWZzIjsKLQkKKwlTdHJpbmcgU1BFQ0lGSUVEX0NMQVNTX1JFRlNfTElTVCA9ICJzcGVjaWZpZWRDbGFzc1JlZnMiOyAvLyROT04tTkxTLTEkCisKIAkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGxpc3Qgb2Ygc3BlY2lmaWVkIGNsYXNzIHJlZnMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgorCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2Ygc3BlY2lmaWVkIGNsYXNzIHJlZnMuCiAJICovCiAJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkKKwogCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNwZWNpZmllZCBjbGFzcyByZWZzLgorCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2Ygc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWZzLgogCSAqLwogCWludCBzcGVjaWZpZWRDbGFzc1JlZnNTaXplKCk7Ci0JCisKIAkvKioKLQkgKiBBZGQgYSBzcGVjaWZpZWQgY2xhc3MgcmVmIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZCByZXR1cm4gdGhlIG9iamVjdCAKLQkgKiByZXByZXNlbnRpbmcgaXQuCisJICogQWRkIGEgbmV3IHNwZWNpZmllZCBjbGFzcyByZWYgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQ7CisJICogcmV0dXJuIHRoZSBuZXdseS1jcmVhdGVkIGNsYXNzIHJlZi4KIAkgKi8KIAlDbGFzc1JlZiBhZGRTcGVjaWZpZWRDbGFzc1JlZigpOwotCQorCiAJLyoqCi0JICogQWRkIGEgc3BlY2lmaWVkIGNsYXNzIHJlZiB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGFuZCAKLQkgKiByZXR1cm4gdGhlIG9iamVjdCByZXByZXNlbnRpbmcgaXQuCisJICogQWRkIGEgbmV3IHNwZWNpZmllZCBjbGFzcyByZWYgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXQgdGhlIHNwZWNpZmllZCBpbmRleDsKKwkgKiByZXR1cm4gdGhlIG5ld2x5LWNyZWF0ZWQgY2xhc3MgcmVmLgogCSAqLwogCUNsYXNzUmVmIGFkZFNwZWNpZmllZENsYXNzUmVmKGludCBpbmRleCk7Ci0JCisKIAkvKioKIAkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjbGFzcyByZWYgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KIAkgKi8KIAl2b2lkIHJlbW92ZVNwZWNpZmllZENsYXNzUmVmKENsYXNzUmVmIGNsYXNzUmVmKTsKLQkKKwogCS8qKgogCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNsYXNzIHJlZiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCiAJICovCiAJdm9pZCByZW1vdmVTcGVjaWZpZWRDbGFzc1JlZihpbnQgaW5kZXgpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogaW1wbGllZCBjbGFzcyByZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKKworCisJLy8gKioqKioqKioqKiBpbXBsaWVkIGNsYXNzIHJlZnMgKioqKioqKioqKgorCiAJLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBpbXBsaWVkIGNsYXNzIHJlZnMgbGlzdAorCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzCisJICogaW1wbGllZCBjbGFzcyByZWZzLgogCSAqLwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QTElFRF9DTEFTU19SRUZfTElTVCA9ICJpbXBsaWVkQ2xhc3NSZWZzIjsKLQkKKwlTdHJpbmcgSU1QTElFRF9DTEFTU19SRUZTX0NPTExFQ1RJT04gPSAiaW1wbGllZENsYXNzUmVmcyI7IC8vJE5PTi1OTFMtMSQKKwogCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUgbGlzdCBvZiBpbXBsaWVkIGNsYXNzIHJlZnMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgorCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2YgaW1wbGllZCBjbGFzcyByZWZzLgogCSAqLwotCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gaW1wbGllZENsYXNzUmVmcygpOwotCQorCUl0ZXJhdG9yPENsYXNzUmVmPiBpbXBsaWVkQ2xhc3NSZWZzKCk7CisKIAkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpbXBsaWVkIGNsYXNzIHJlZnMuCisJICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBpbXBsaWVkIGNsYXNzIHJlZnMuCiAJICovCiAJaW50IGltcGxpZWRDbGFzc1JlZnNTaXplKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBleGNsdWRlIHVubGlzdGVkIGNsYXNzZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQorCisKKwkvLyAqKioqKioqKioqIGV4Y2x1ZGUgdW5saXN0ZWQgY2xhc3NlcyAqKioqKioqKioqCisKIAkvKiogCi0JICogUmV0dXJuIHRoZSAiZXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzIiBzZXR0aW5nIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGV4Y2x1ZGVzIHVubGlzdGVkIGNsYXNzZXMuCiAJICovCi0JYm9vbGVhbiBpc0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKTsKKwlib29sZWFuIGV4Y2x1ZGVzVW5saXN0ZWRDbGFzc2VzKCk7CiAKIAkvKioKIAkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyAKLQkgKiAiZXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzIiBzZXR0aW5nCisJICogImV4Y2x1ZGUgdW5saXN0ZWQgY2xhc3NlcyIgZmxhZy4KIAkgKi8KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNQRUNJRklFRF9FWENMVURFX1VOTElTVEVEX0NMQVNTRURfUFJPUEVSVFkgPSAic3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyI7Ci0JCisJU3RyaW5nIFNQRUNJRklFRF9FWENMVURFX1VOTElTVEVEX0NMQVNTRVNfUFJPUEVSVFkgPSAic3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyI7IC8vJE5PTi1OTFMtMSQKKwogCS8qKiAKLQkgKiBSZXR1cm4gdGhlICJleGNsdWRlIHVubGlzdGVkIGNsYXNzZXMiIHNldHRpbmcgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisJICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3Mgc3BlY2lmaWVkICJleGNsdWRlIHVubGlzdGVkIGNsYXNzZXMiIGZsYWcuCiAJICovCiAJQm9vbGVhbiBnZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCk7Ci0JCisKIAkvKiogCi0JICogU2V0IHRoZSAiZXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzIiBzZXR0aW5nIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqIFNldCB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHNwZWNpZmllZCAiZXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzIiBmbGFnLgogCSAqLwogCXZvaWQgc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhCb29sZWFuIGV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMpOwotCQkKKwogCS8qKgogCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIAotCSAqIGRlZmF1bHQgImV4Y2x1ZGUgdW5saXN0ZWQgY2xhc3NlcyIgc2V0dGluZyAobm90IHR5cGljYWxseSBjaGFuZ2VkKQorCSAqIGRlZmF1bHQgImV4Y2x1ZGUgdW5saXN0ZWQgY2xhc3NlcyIgZmxhZyAobm90IHR5cGljYWxseSBjaGFuZ2VkKS4KIAkgKi8KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VEX1BST1BFUlRZID0gImRlZmF1bHRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzIjsKLQkKKwlTdHJpbmcgREVGQVVMVF9FWENMVURFX1VOTElTVEVEX0NMQVNTRVNfUFJPUEVSVFkgPSAiZGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMiOyAvLyROT04tTkxTLTEkCisKIAkvKiogCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0ICJleGNsdWRlIHVubGlzdGVkIGNsYXNzZXMiIHNldHRpbmcKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGVyc2lzdGVuY2UgdW5pdCBleGNsdWRlcyB1bmxpc3RlZCBjbGFzc2VzIGJ5IGRlZmF1bHQuCiAJICovCiAJYm9vbGVhbiBnZXREZWZhdWx0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogcHJvcGVydGllcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKKworCisJLy8gKioqKioqKioqKiBwcm9wZXJ0aWVzICoqKioqKioqKioKKwogCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcHJvcGVydGllcyBsaXN0CisJICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKKwkgKiBwcm9wZXJ0aWVzLgogCSAqLwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVElFU19MSVNUID0gInByb3BlcnRpZXMiOwotCQorCVN0cmluZyBQUk9QRVJUSUVTX0xJU1QgPSAicHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKKwogCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KKwkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBsaXN0IG9mIHByb3BlcnRpZXMuCiAJICovCiAJTGlzdEl0ZXJhdG9yPFByb3BlcnR5PiBwcm9wZXJ0aWVzKCk7Ci0JCi0JaW50IHByb3BlcnRpZXNTaXplKCk7Ci0JCisKIAkvKioKLQkgKiBBZGQgYSBwcm9wZXJ0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgcmV0dXJuIHRoZSBvYmplY3QgCi0JICogcmVwcmVzZW50aW5nIGl0LgorCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2YgcHJvcGVydGllcy4KKwkgKi8KKwlpbnQgcHJvcGVydGllc1NpemUoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgKmZpcnN0KiBwcm9wZXJ0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHByb3BlcnR5IGxpc3Qgd2l0aAorCSAqIHRoZSBzcGVjaWZpZWQgbmFtZS4gUmV0dXJuIG51bGwgaWYgdGhlIGxpc3QgZG9lcyBub3QgY29udGFpbiBhIHByb3BlcnR5CisJICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICovCisJUHJvcGVydHkgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBwcm9wZXJ0aWVzIHdpdGggbmFtZXMgYmVnaW5uaW5nIHdpdGggdGhlCisJICogc3BlY2lmaWVkIHByZWZpeC4KKwkgKi8KKwlJdGVyYXRvcjxQcm9wZXJ0eT4gcHJvcGVydGllc1dpdGhOYW1lUHJlZml4KFN0cmluZyBwcm9wZXJ0eU5hbWVQcmVmaXgpOworCisJLyoqCisJICogQWRkIGEgbmV3IHByb3BlcnR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0OworCSAqIHJldHVybiB0aGUgbmV3bHktY3JlYXRlZCBwcm9wZXJ0eS4KIAkgKi8KIAlQcm9wZXJ0eSBhZGRQcm9wZXJ0eSgpOwotCQorCisJLyoqCisJICogQWRkIGEgbmV3IHByb3BlcnR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXg7CisJICogcmV0dXJuIHRoZSBuZXdseS1jcmVhdGVkIHByb3BlcnR5LgorCSAqLwogCVByb3BlcnR5IGFkZFByb3BlcnR5KGludCBpbmRleCk7CiAKLQlQcm9wZXJ0eSBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KTsKLQkKLQlQcm9wZXJ0eSBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwotCi0JTGlzdEl0ZXJhdG9yPFByb3BlcnR5PiBwcm9wZXJ0aWVzV2l0aFByZWZpeChTdHJpbmcga2V5UHJlZml4KTsKLQkKLQl2b2lkIHB1dFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZXMpOwotCQotCXZvaWQgcmVwbGFjZVByb3BlcnR5VmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIG9sZFZhbHVlLCBTdHJpbmcgbmV3VmFsdWUpOwotCQotCWJvb2xlYW4gY29udGFpbnNQcm9wZXJ0eShTdHJpbmcga2V5KTsKKwkvKioKKwkgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSAqZmlyc3QqIHByb3BlcnR5IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgcHJvcGVydHkKKwkgKiBsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUsIGNyZWF0aW5nIGEgbmV3CisJICogcHJvcGVydHkgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuIElmIGEgcHJvcGVydHkgZXhpc3RzIGFuZCB0aGUKKwkgKiBzcGVjaWZpZWQgdmFsdWUgaXMgbnVsbCwgdGhlIGV4aXN0aW5nIHByb3BlcnR5IGlzIHJlbW92ZWQuCisJICovCisJdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUpOwogCiAJLyoqCi0JICogUmVtb3ZlIHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBjcmVhdGluZyBhIG5ldworCSAqIHByb3BlcnR5IGlmIG9uZSBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGUgc3BlY2lmaWVkIGZsYWcgaW5kaWNhdGVzCisJICogZHVwbGljYXRlIHByb3BlcnR5IG5hbWVzIGFyZSBhbGxvd2VkLiBJZiBhIHByb3BlcnR5IGV4aXN0cyBhbmQgZHVwbGljYXRlCisJICogdmFsdWVzIGFyZSBub3QgYWxsb3dlZCBhbmQgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBudWxsLCB0aGUgZXhpc3RpbmcKKwkgKiBwcm9wZXJ0eSBpcyByZW1vdmVkLgorCSAqLworCXZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGR1cGxpY2F0ZVByb3BlcnR5TmFtZXNBbGxvd2VkKTsKKworCS8qKgorCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCiAJICovCiAJdm9pZCByZW1vdmVQcm9wZXJ0eShQcm9wZXJ0eSBwcm9wZXJ0eSk7CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlICpmaXJzdCogcHJvcGVydHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBwcm9wZXJ0eSBsaXN0CisJICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICovCisJdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKKworCS8qKgorCSAqIFJlbW92ZSB0aGUgKmZpcnN0KiBwcm9wZXJ0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHByb3BlcnR5IGxpc3QKKwkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdmFsdWUsIGFsbG93aW5nIHRoZSByZW1vdmFsIG9mIHByb3BlcnRpZXMKKwkgKiB3aXRoIGR1cGxpY2F0ZSBwcm9wZXJ0eSBuYW1lcy4KKwkgKi8KKwl2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBDYWxsIGJhY2sgbWV0aG9kIGZvciBQcm9wZXJ0eSBuYW1lIGNoYW5naW5nLiAKKwkgKi8KKwl2b2lkIHByb3BlcnR5TmFtZUNoYW5nZWQoU3RyaW5nIG9sZFByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1Byb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlKTsJCisKKwkvKioKKwkgKiBDYWxsIGJhY2sgbWV0aG9kIGZvciBQcm9wZXJ0eSB2YWx1ZSBjaGFuZ2luZy4gCisJICovCisJdm9pZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3VmFsdWUpOwogCQogCS8qKgotCSAqIFJlbW92ZSB0aGUgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisJICogU2ltcGxlIHByb3BlcnR5IGludGVyZmFjZS4KIAkgKi8KLQl2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBrZXkpOwotCQorCWludGVyZmFjZSBQcm9wZXJ0eQorCQlleHRlbmRzIFhtbENvbnRleHROb2RlCisJeworCQlQZXJzaXN0ZW5jZVVuaXQgZ2V0UGFyZW50KCk7CisKKwkJQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCisJCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBnZXROYW1lKCk7CisJCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7CisKKwkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7CisJCVN0cmluZyBnZXRWYWx1ZSgpOworCisJCVhtbFByb3BlcnR5IGdldFhtbFByb3BlcnR5KCk7CisJCXZvaWQgdXBkYXRlKCk7CisJfQorCisJLy8gKioqKioqKioqKiBPUk0gcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cyAqKioqKioqKioqCisKIAkvKioKLQkgKiBSZW1vdmUgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleSBhbmQgdmFsdWVmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzCisJICogZGVmYXVsdCBhY2Nlc3MgdHlwZS4KIAkgKi8KLQl2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCk7Ci0JCVN0cmluZyBERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSA9ICJkZWZhdWx0U2NoZW1hIjsKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCVN0cmluZyBERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkgPSAiZGVmYXVsdENhdGFsb2ciOwotCQorCVN0cmluZyBERUZBVUxUX0FDQ0VTU19QUk9QRVJUWSA9ICJkZWZhdWx0QWNjZXNzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIHRoZSBkZWZhdWx0IGFjY2VzcyB0eXBlIGZyb20gdGhlIGZpcnN0IHBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMKKwkgKiBmb3VuZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2YgbWFwcGluZyBmaWxlcy4KKwkgKi8KIAlBY2Nlc3NUeXBlIGdldERlZmF1bHRBY2Nlc3MoKTsKLQkJU3RyaW5nIERFRkFVTFRfQUNDRVNTX1BST1BFUlRZID0gImRlZmF1bHRBY2Nlc3MiOwotCQotCWJvb2xlYW4gZ2V0RGVmYXVsdENhc2NhZGVQZXJzaXN0KCk7Ci0JCVN0cmluZyBERUZBVUxUX0NBU0NBREVfUEVSU0lTVF9QUk9QRVJUWSA9ICJkZWZhdWx0Q2FzY2FkZVBlcnNpc3QiOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogZ2xvYmFsIGdlbmVyYXRvciBhbmQgcXVlcnkgc3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioKLQkKKwogCS8qKgotCSAqIElkZW50aWZpZXIgZm9yIGNoYW5nZXMgdG8gdGhlIGxpc3Qgb2YgZ2xvYmFsIGdlbmVyYXRvcnMuCi0JICogTm90ZSB0aGF0IHRoZXJlIGFyZSBubyBncmFudWxhciBjaGFuZ2VzIHRvIHRoaXMgbGlzdC4gIFRoZXJlIGlzIG9ubHkKLQkgKiBub3RpZmljYXRpb24gdGhhdCB0aGUgZW50aXJlIGxpc3QgaGFzIGNoYW5nZWQuCisJICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKKwkgKiBkZWZhdWx0IGRhdGFiYXNlIGNhdGFsb2cuCiAJICovCi0JU3RyaW5nIEdFTkVSQVRPUlNfTElTVCA9ICJnZW5lcmF0b3JzIjsKLQkKKwlTdHJpbmcgREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZID0gImRlZmF1bHRDYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqCi0JICogQWRkIHRoZSBnZW5lcmF0b3IgKGRlZmluZWQgZWxzZXdoZXJlKSB0byB0aGUgbGlzdCBvZiBnZW5lcmF0b3JzIGRlZmluZWQKLQkgKiB3aXRoaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0LgotCSAqIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgdXBkYXRpbmcgdGhlCi0JICogbG9jYWwgZ2VuZXJhdG9yIGRlZmluaXRpb24uCi0JICogTm8gY2hhbmdlIG5vdGlmaWNhdGlvbiBhY2NvbXBhbmllcyB0aGlzIGFjdGlvbiBzcGVjaWZpY2FsbHkuCisJICogUmV0dXJuIHRoZSBkZWZhdWx0IGRhdGFiYXNlIGNhdGFsb2cgZnJvbSB0aGUgZmlyc3QgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cworCSAqIGZvdW5kIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBtYXBwaW5nIGZpbGVzLgorCSAqLworCVN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZygpOworCisJLyoqCisJICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKKwkgKiBkZWZhdWx0IGRhdGFiYXNlIHNjaGVtYS4KKwkgKi8KKwlTdHJpbmcgREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkgPSAiZGVmYXVsdFNjaGVtYSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFJldHVybiB0aGUgZGVmYXVsdCBkYXRhYmFzZSBzY2hlbWEgZnJvbSB0aGUgZmlyc3QgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cworCSAqIGZvdW5kIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBtYXBwaW5nIGZpbGVzLgorCSAqLworCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCk7CisKKwkvKioKKwkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncworCSAqIGRlZmF1bHQgImNhc2NhZGUgcGVyc2lzdCIgZmxhZy4KKwkgKi8KKwlTdHJpbmcgREVGQVVMVF9DQVNDQURFX1BFUlNJU1RfUFJPUEVSVFkgPSAiZGVmYXVsdENhc2NhZGVQZXJzaXN0IjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIHRoZSBkZWZhdWx0ICJjYXNjYWRlIHBlcnNpc3QiIGZsYWcgZnJvbSB0aGUgZmlyc3QgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cworCSAqIGZvdW5kIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBtYXBwaW5nIGZpbGVzLgorCSAqLworCWJvb2xlYW4gZ2V0RGVmYXVsdENhc2NhZGVQZXJzaXN0KCk7CisKKworCS8vICoqKioqKioqKiogZ2VuZXJhdG9ycyAqKioqKioqKioqCisKKwkvKioKKwkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncworCSAqIGxpc3Qgb2YgImdsb2JhbCIgZ2VuZXJhdG9ycy4KKwkgKiBOQjogVGhlcmUgYXJlIG5vIGdyYW51bGFyIGxpc3QgY2hhbmdlIG5vdGlmaWNhdGlvbnM7IG9ubHkgYSAibGlzdCBjaGFuZ2VkIgorCSAqIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBsaXN0IGlzIHJlYnVpbHQgYXQgdGhlIGZpbmlzaCBvZiB0aGUgcGVyc2lzdGVuY2UKKwkgKiB1bml0J3MgInVwZGF0ZSIuCisJICovCisJU3RyaW5nIEdFTkVSQVRPUlNfTElTVCA9ICJnZW5lcmF0b3JzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIHRoZSBsaXN0IG9mIGdlbmVyYXRvcnMgZGVmaW5lZCB3aXRoaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBzY29wZSwKKwkgKiBpbmNsdWRpbmcgZ2VuZXJhdG9ycyB3aXRoIGR1cGxpY2F0ZSBuYW1lcy4KKwkgKi8KKwlMaXN0SXRlcmF0b3I8R2VuZXJhdG9yPiBnZW5lcmF0b3JzKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxpc3Qgb2YgZ2VuZXJhdG9ycyBkZWZpbmVkIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHNjb3BlLAorCSAqIGluY2x1ZGluZyBnZW5lcmF0b3JzIHdpdGggZHVwbGljYXRlIG5hbWVzLgorCSAqLworCWludCBnZW5lcmF0b3JzU2l6ZSgpOworCisJLyoqCisJICogQWRkIHRoZSBzcGVjaWZpZWQgZ2VuZXJhdG9yICh0aGF0IGlzIGRlZmluZWQgZWxzZXdoZXJlKSB0byB0aGUKKwkgKiBsaXN0IG9mIGdlbmVyYXRvcnMgZGVmaW5lZCB3aXRoaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBzY29wZS4KKwkgKiBOQjogVGhpcyBpcyB0byBiZSBjYWxsZWQgYnkgZXZlcnkgZ2VuZXJhdG9yIGR1cmluZyAidXBkYXRlIi4KKwkgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBkaXJlY3RseSBnZW5lcmF0ZSBhIGNoYW5nZSBub3RpZmljYXRpb24uCisJICogVGhlIGNoYW5nZSBub3RpZmljYXRpb24gaXMgZmlyZWQgYXQgdGhlIGVuZCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzCisJICogInVwZGF0ZSIsIG9uY2UgYWxsIHRoZSBnZW5lcmF0b3JzIGhhdmUgYWRkZWQgdGhlbXNlbHZlcy4KIAkgKi8KIAl2b2lkIGFkZEdlbmVyYXRvcihHZW5lcmF0b3IgZ2VuZXJhdG9yKTsKLQkKKwogCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgZ2VuZXJhdG9ycyBkZWZpbmVkIHdpdGhpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQsCi0JICogaW5jbHVkZWQgZHVwbGljYXRlbHkgbmFtZWQgZ2VuZXJhdG9ycy4KKwkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBnZW5lcmF0b3JzIGRlZmluZWQgaW4gdGhlIHBlcnNpc3RlbmNlCisJICogdW5pdCdzIHNjb3BlLCB3aXRoIGR1cGxpY2F0ZXMgcmVtb3ZlZC4KIAkgKi8KLQlMaXN0SXRlcmF0b3I8R2VuZXJhdG9yPiBhbGxHZW5lcmF0b3JzKCk7Ci0JCisJU3RyaW5nW10gdW5pcXVlR2VuZXJhdG9yTmFtZXMoKTsKKworCisJLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKKwogCS8qKgotCSAqIElkZW50aWZpZXIgZm9yIGNoYW5nZXMgdG8gdGhlIGxpc3Qgb2YgZ2xvYmFsIHF1ZXJpZXMuCi0JICogTm90ZSB0aGF0IHRoZXJlIGFyZSBubyBncmFudWxhciBjaGFuZ2VzIHRvIHRoaXMgbGlzdC4gIFRoZXJlIGlzIG9ubHkKLQkgKiBub3RpZmljYXRpb24gdGhhdCB0aGUgZW50aXJlIGxpc3QgaGFzIGNoYW5nZWQuCisJICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKKwkgKiBsaXN0IG9mICJnbG9iYWwiIHF1ZXJpZXMuCisJICogTkI6IFRoZXJlIGFyZSBubyBncmFudWxhciBsaXN0IGNoYW5nZSBub3RpZmljYXRpb25zOyBvbmx5IGEgImxpc3QgY2hhbmdlZCIKKwkgKiBub3RpZmljYXRpb24gd2hlbiB0aGUgbGlzdCBpcyByZWJ1aWx0IGF0IHRoZSBmaW5pc2ggb2YgdGhlIHBlcnNpc3RlbmNlCisJICogdW5pdCdzICJ1cGRhdGUiLgogCSAqLwotCVN0cmluZyBRVUVSSUVTX0xJU1QgPSAicXVlcmllcyI7Ci0JCisJU3RyaW5nIFFVRVJJRVNfTElTVCA9ICJxdWVyaWVzIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqCi0JICogQWRkIHRoZSBxdWVyeSAoZGVmaW5lZCBlbHNld2hlcmUpIHRvIHRoZSBsaXN0IG9mIHF1ZXJpZXMgZGVmaW5lZCAKLQkgKiB3aXRoaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0LgotCSAqIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgdXBkYXRpbmcgdGhlCi0JICogbG9jYWwgcXVlcnkgZGVmaW5pdGlvbi4KLQkgKiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFjY29tcGFuaWVzIHRoaXMgYWN0aW9uIHNwZWNpZmljYWxseS4KKwkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgcXVlcmllcyBkZWZpbmVkIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHNjb3BlLAorCSAqIGluY2x1ZGluZyBxdWVyaWVzIHdpdGggZHVwbGljYXRlIG5hbWVzLgorCSAqLworCUxpc3RJdGVyYXRvcjxRdWVyeT4gcXVlcmllcygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBsaXN0IG9mIHF1ZXJpZXMgZGVmaW5lZCB3aXRoaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBzY29wZSwKKwkgKiBpbmNsdWRpbmcgcXVlcmllcyB3aXRoIGR1cGxpY2F0ZSBuYW1lcy4KKwkgKi8KKwlpbnQgcXVlcmllc1NpemUoKTsKKworCS8qKgorCSAqIEFkZCB0aGUgc3BlY2lmaWVkIHF1ZXJ5ICh0aGF0IGlzIGRlZmluZWQgZWxzZXdoZXJlKSB0byB0aGUKKwkgKiBsaXN0IG9mIHF1ZXJpZXMgZGVmaW5lZCB3aXRoaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBzY29wZS4KKwkgKiBOQjogVGhpcyBpcyB0byBiZSBjYWxsZWQgYnkgZXZlcnkgcXVlcnkgZHVyaW5nICJ1cGRhdGUiLgorCSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGRpcmVjdGx5IGdlbmVyYXRlIGEgY2hhbmdlIG5vdGlmaWNhdGlvbi4KKwkgKiBUaGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcyBmaXJlZCBhdCB0aGUgZW5kIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKKwkgKiAidXBkYXRlIiwgb25jZSBhbGwgdGhlIHF1ZXJpZXMgaGF2ZSBhZGRlZCB0aGVtc2VsdmVzLgogCSAqLwogCXZvaWQgYWRkUXVlcnkoUXVlcnkgcXVlcnkpOworCisJCisJLy8gKioqKioqKioqKiByb290IGVudGl0aWVzICoqKioqKioqKioKIAkKIAkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHF1ZXJpZXMgZGVmaW5lZCB3aXRoaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0LAotCSAqIGluY2x1ZGVkIGR1cGxpY2F0ZWx5IG5hbWVkIHF1ZXJpZXMuCisJICogVGhlIGVudGl0eSB3aXRoIHRoZSBnaXZlbiBuYW1lIHNob3VsZCBiZSBhIHJvb3QgZW50aXR5IHRoYXQgaGFzIHN1YiBlbnRpdGllcy4KKwkgKiBUaGlzIHdpbGwgYmUgc3RvcmVkIGJ5IHRoZSBwZXJzaXN0ZW5jZSB1bml0IHNvIHRoYXQgdGhlIGVudGl0eSBjYW4gbGF0ZXIKKwkgKiBjYWxsIHtAbGluayAjaXNSb290V2l0aFN1YkVudGl0aWVzKFN0cmluZyl9CiAJICovCi0JTGlzdEl0ZXJhdG9yPFF1ZXJ5PiBhbGxRdWVyaWVzKCk7CisJdm9pZCBhZGRSb290V2l0aFN1YkVudGl0aWVzKFN0cmluZyBlbnRpdHlOYW1lKTsKIAkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIGEgcm9vdCBlbnRpdHkKKwkgKiB0aGF0IGFsc28gaGFzIHN1YiBlbnRpdGllcy4KKwkgKiBAc2VlICNhZGRSb290V2l0aFN1YkVudGl0aWVzKFN0cmluZykKKwkgKi8KKwlib29sZWFuIGlzUm9vdFdpdGhTdWJFbnRpdGllcyhTdHJpbmcgZW50aXR5TmFtZSk7CisKKwkvLyAqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioKKwkgCisJLyoqCisJICogVXBkYXRlIHRoZSBQZXJzaXN0ZW5jZVVuaXQgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIFhtbFBlcnNpc3RlbmNlVW5pdCAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KIAl2b2lkIHVwZGF0ZShYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KTsKKworCisJLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgcGVyc2lzdGVudCB0eXBlIHNwZWNpZmllZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCB3aXRoIHRoZQorCSAqIHNwZWNpZmllZCBuYW1lLgorCSAqLworCVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKFN0cmluZyB0eXBlTmFtZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGVyc2lzdGVuY2UgdW5pdCBzcGVjaWZpZXMgYSBwZXJzaXN0ZW50IHR5cGUgd2l0aCB0aGUKKwkgKiBzcGVjaWZpZWQgbmFtZSAoaS5lLiB0aGUgdHlwZSBpcyBsaXN0ZWQgZWl0aGVyIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKKwkgKiBsaXN0IG9mIHNwZWNpZmllZCBjbGFzc2VzIG9yIGluIG9uZSBvZiB0aGUgcGVyc2lzdGVudCB1bml0J3MgbWFwcGluZyBmaWxlcykuCisJICovCisJYm9vbGVhbiBzcGVjaWZpZXNQZXJzaXN0ZW50VHlwZShTdHJpbmcgdHlwZU5hbWUpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBlbnRpdHkgc3BlY2lmaWVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHdpdGggdGhlCisJICogc3BlY2lmaWVkIG5hbWUuIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIHBlcnNpc3RlbnQgdHlwZSAKKwkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBvciBpZiB0aGUgcGVyc2lzdGVudCB0eXBlIGlzIG5vdCBtYXBwZWQgYXMgYW4KKwkgKiBlbnRpdHkuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5cyNFTlRJVFlfVFlQRV9NQVBQSU5HX0tFWQorCSAqLworCUVudGl0eSBnZXRFbnRpdHkoU3RyaW5nIHR5cGVOYW1lKTsKIAkKIAkKLQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQogCS8qKgotCSAqIFJldHVybiB0aGUgUGVyc2lzdGVudFR5cGUgc3BlY2lmaWVkIGluIHRoaXMgUGVyc2lzdGVuY2VVbml0IHdpdGggdGhlIGdpdmVuCi0JICogZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZQorCSAqIFJldHVybiB0aGUgZW1iZWRkYWJsZSBzcGVjaWZpZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgd2l0aCB0aGUKKwkgKiBzcGVjaWZpZWQgbmFtZS4gUmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gcGVyc2lzdGVudCB0eXBlIAorCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIG9yIGlmIHRoZSBwZXJzaXN0ZW50IHR5cGUgaXMgbm90IG1hcHBlZCBhcyBhbgorCSAqIGVtYmVkZGFibGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5cyNFTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkKIAkgKi8KLQlQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JCisJRW1iZWRkYWJsZSBnZXRFbWJlZGRhYmxlKFN0cmluZyB0eXBlTmFtZSk7CisKIAkvKioKIAkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQgY29udGFpbnMKIAkgKiB0aGUgZ2l2ZW4gdGV4dCBvZmZzZXQKIAkgKi8KIAlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KTsKLQorCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIGFueSBkYXRhYmFzZSBtZXRhZGF0YSBzcGVjaWZpYyB2YWxpZGF0aW9uIHNob3VsZCBvY2N1ci4KKwkgKiAoRm9yIGluc3RhbmNlLCBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgYWN0aXZlLCB0aGVuIGl0IHNob3VsZCBub3QuKQorCSAqLworCWJvb2xlYW4gc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGM5OWVlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKKworLyoqCisgKiBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBleHRlbmRzIE1vZGVsCit7CisJLyoqCisJICogTWV0aG9kIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKwkgKi8KKwlib29sZWFuIGl0ZW1Jc1Byb3BlcnR5KFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBpdGVtKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgdXNlZCBmb3IgY2hhbmdlIG5vdGlmaWNhdGlvbiBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuCisJICovCisJU3RyaW5nIHByb3BlcnR5SWRPZihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgUGVyc2lzdGVuY2VVbml0IG9mIHRoaXMgUHJvcGVydGllcy4KKwkgKi8KKwlQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCB0aGUgUGVyc2lzdGVuY2VVbml0IGJlbG9uZ3MgdG8uCisJICovCisJSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCk7CisJCisJLyoqCisJICogQSBQcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lIGhhZCBpdHMgdmFsdWUgY2hhbmdlZAorCSAqLworCXZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKTsKKwkKKwkvKioKKwkgKiBBIFByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUgd2FzIHJlbW92ZWQKKwkgKi8KKwl2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKTsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLmphdmEKaW5kZXggNTVmNTJmZC4uMjc5MDY4OCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMjIsMTAgKzIyLDEwIEBACiAgKi8KIHB1YmxpYyBlbnVtIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSAKIHsKLQkvKiogQ29ycmVzcG9uZHMgdG8gSlRBIHRyYW5zYWN0aW9uIHR5cGUgKiovCisJLyoqIENvcnJlc3BvbmRzIHRvIEpUQSB0cmFuc2FjdGlvbiB0eXBlICovCiAJSlRBLAogCQotCS8qKiBDb3JyZXNwb25kcyB0byBSRVNPVVJDRV9MT0NBTCB0cmFuc2FjdGlvbiB0eXBlICoqLworCS8qKiBDb3JyZXNwb25kcyB0byBSRVNPVVJDRV9MT0NBTCB0cmFuc2FjdGlvbiB0eXBlICovCiAJUkVTT1VSQ0VfTE9DQUw7CiAJCiAJcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZnJvbVhtbFJlc291cmNlTW9kZWwoWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHRyYW5zYWN0aW9uVHlwZSkgewpAQCAtMzgsNyArMzgsNyBAQAogCQkJY2FzZSBSRVNPVVJDRV9MT0NBTDoKIAkJCQlyZXR1cm4gUkVTT1VSQ0VfTE9DQUw7CiAJCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gdHJhbnNhY3Rpb24gdHlwZTogIiArIHRyYW5zYWN0aW9uVHlwZSk7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biB0cmFuc2FjdGlvbiB0eXBlOiAiICsgdHJhbnNhY3Rpb25UeXBlKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfQogCQpAQCAtNTIsNyArNTIsNyBAQAogCQkJY2FzZSBSRVNPVVJDRV9MT0NBTDoKIAkJCQlyZXR1cm4gWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMOwogCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIHRyYW5zYWN0aW9uIHR5cGU6ICIgKyB0cmFuc2FjdGlvblR5cGUpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gdHJhbnNhY3Rpb24gdHlwZTogIiArIHRyYW5zYWN0aW9uVHlwZSk7IC8vJE5PTi1OTFMtMSQKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbC5qYXZhCmluZGV4IGMwY2JjZGIuLmE4N2E1YzkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDQ4ICs5LDQyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLk1ldGFtb2RlbEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7CiAKIC8qKgotICogCi0gKiAKKyAqIEpQQSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuCisgKiA8cD4KICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCiAgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbmNlWG1sIGV4dGVuZHMgUGVyc2lzdGVuY2VKcGFDb250ZXh0Tm9kZSwgSnBhU3RydWN0dXJlTm9kZQorcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZVhtbAorCWV4dGVuZHMgWG1sRmlsZSwgTWV0YW1vZGVsR2VuZXJhdG9yCiB7CiAJLy8gKioqKioqKioqKioqKioqKiBwZXJzaXN0ZW5jZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJCiAJLyoqCiAJICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm9wZXJ0eQogCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1BST1BFUlRZID0gInBlcnNpc3RlbmNlIjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9QUk9QRVJUWSA9ICJwZXJzaXN0ZW5jZSI7IC8vJE5PTi1OTFMtMSQKIAkKLQkvKiogCisJLyoqCiAJICogUmV0dXJuIHRoZSBjb250ZW50IHJlcHJlc2VudGVkIGJ5IHRoZSByb290IG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZS4KIAkgKiBUaGlzIG1heSBiZSBudWxsLgogCSAqLwogCVBlcnNpc3RlbmNlIGdldFBlcnNpc3RlbmNlKCk7CiAJCi0JLyoqCi0JICogQWRkIGEgcGVyc2lzdGVuY2Ugbm9kZSB0byB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgYW5kIHJldHVybiB0aGUgb2JqZWN0IAotCSAqIHJlcHJlc2VudGluZyBpdC4KLQkgKiBUaHJvd3Mge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaWYgYSBwZXJzaXN0ZW5jZSBub2RlIGFscmVhZHkgZXhpc3RzLgotCSAqLwotCVBlcnNpc3RlbmNlIGFkZFBlcnNpc3RlbmNlKCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBwZXJzaXN0ZW5jZSBub2RlIGZyb20gdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLgotCSAqIFRocm93cyB7QGxpbmsgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSBpZiBhIHBlcnNpc3RlbmNlIG5vZGUgZG9lcyBub3QgZXhpc3QuCi0JICovCi0Jdm9pZCByZW1vdmVQZXJzaXN0ZW5jZSgpOwotCQogCQogCS8vICoqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQotCXZvaWQgdXBkYXRlKFBlcnNpc3RlbmNlUmVzb3VyY2UgcGVyc2lzdGVuY2VSZXNvdXJjZSk7CisJLyoqCisJICogVXBkYXRlIHRoZSBQZXJzaXN0ZW5jZVhtbCBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgSnBhWG1sUmVzb3VyY2UgCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKQorCSAqLworCXZvaWQgdXBkYXRlKEpwYVhtbFJlc291cmNlIHJlc291cmNlKTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYmUxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXJGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphckZpbGVSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7CisKK3B1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkKK3sJCisJUGVyc2lzdGVuY2VYbWwgYnVpbGRQZXJzaXN0ZW5jZVhtbChKcGFSb290Q29udGV4dE5vZGUgcGFyZW50LCBKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSk7CisJCisJUGVyc2lzdGVuY2UgYnVpbGRQZXJzaXN0ZW5jZShQZXJzaXN0ZW5jZVhtbCBwYXJlbnQsIFhtbFBlcnNpc3RlbmNlIHJlc291cmNlUGVyc2lzdGVuY2UpOworCQorCVBlcnNpc3RlbmNlVW5pdCBidWlsZFBlcnNpc3RlbmNlVW5pdChQZXJzaXN0ZW5jZSBwYXJlbnQsIFhtbFBlcnNpc3RlbmNlVW5pdCByZXNvdXJjZVBlcnNpc3RlbmNlVW5pdCk7CisJCisJLyoqCisJICogQnVpbGQgYSAic3BlY2lmaWVkIiBtYXBwaW5nIGZpbGUgcmVmLgorCSAqLworCU1hcHBpbmdGaWxlUmVmIGJ1aWxkTWFwcGluZ0ZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYpOworCisJLyoqCisJICogQnVpbGQgYSAiaW1wbGllZCIgbWFwcGluZyBmaWxlIHJlZi4KKwkgKi8KKwlNYXBwaW5nRmlsZVJlZiBidWlsZEltcGxpZWRNYXBwaW5nRmlsZVJlZihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KTsKKworCS8qKgorCSAqIEJ1aWxkIGEgInNwZWNpZmllZCIgY2xhc3MgcmVmLgorCSAqLworCUNsYXNzUmVmIGJ1aWxkQ2xhc3NSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmKTsKKwkKKwkvKioKKwkgKiBCdWlsZCBhbiAiaW1wbGllZCIgY2xhc3MgcmVmLgorCSAqLworCUNsYXNzUmVmIGJ1aWxkQ2xhc3NSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgU3RyaW5nIGNsYXNzTmFtZSk7CisJCisJSmFyRmlsZVJlZiBidWlsZEphckZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmKTsKKworCUphckZpbGUgYnVpbGRKYXJGaWxlKEphckZpbGVSZWYgcGFyZW50LCBKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IGphclJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCk7CisKKwlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgYnVpbGRQcm9wZXJ0eShQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBYbWxQcm9wZXJ0eSBwcm9wZXJ0eSk7CisJCisJUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBidWlsZENvbm5lY3Rpb24oUGVyc2lzdGVuY2VVbml0IHBhcmVudCk7CisJCisJUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBidWlsZE9wdGlvbnMoUGVyc2lzdGVuY2VVbml0IHBhcmVudCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2MzcxMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZURlZmluaXRpb247CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uIAorCWV4dGVuZHMgUmVzb3VyY2VEZWZpbml0aW9uCit7CisJUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkgZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCk7CisJCisJRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW50VHlwZUNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVudFR5cGVDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTMxYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVudFR5cGVDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworCisvKioKKyAqIEludGVyZmFjZSB1c2VkIGJ5IHBlcnNpc3RlbmNlIHVuaXQgdG8gZ2F0aGVyIHVwIHBlcnNpc3RlbnQgdHlwZXMuCisgKiA8cD4KKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbnRUeXBlQ29udGFpbmVyIHsKKworCS8qKgorCSAqIFJldHVybiB0aGUgY29udGFpbmVyJ3MgcGVyc2lzdGVudCB0eXBlcy4KKwkgKi8KKwlJdGVyYWJsZTw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGU+IGdldFBlcnNpc3RlbnRUeXBlcygpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9Qcm9wZXJ0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcyZTBhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHk7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5IGV4dGVuZHMgUGVyc2lzdGVuY2VKcGFDb250ZXh0Tm9kZQotewotCS8vICoqKioqKioqKioqKioqKiogbmFtZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsdWUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsKLQkKLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0JCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkKLQl2b2lkIHVwZGF0ZShYbWxQcm9wZXJ0eSBwcm9wZXJ0eSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKcGFBbm5vdGF0aW9uRGVmaW50aW9uUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEpwYUFubm90YXRpb25EZWZpbnRpb25Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNDIwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKcGFBbm5vdGF0aW9uRGVmaW50aW9uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmludGlvblByb3ZpZGVyCisJaW1wbGVtZW50cyBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyCit7CisJcHJpdmF0ZSBBbm5vdGF0aW9uRGVmaW5pdGlvbltdIHR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnM7CisJCisJcHJpdmF0ZSBBbm5vdGF0aW9uRGVmaW5pdGlvbltdIHR5cGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zOworCQorCXByaXZhdGUgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBhdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbnM7CisJCisJCisJcHJvdGVjdGVkIEFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmludGlvblByb3ZpZGVyKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHR5cGUgYW5ub3RhdGlvbiBkZWZpbml0aW9ucyAqKioqKioqKioqCisJCisJcHVibGljIHN5bmNocm9uaXplZCBJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gdHlwZUFubm90YXRpb25EZWZpbml0aW9ucygpIHsKKwkJaWYgKHRoaXMudHlwZUFubm90YXRpb25EZWZpbml0aW9ucyA9PSBudWxsKSB7CisJCQl0aGlzLnR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSB0aGlzLmJ1aWxkVHlwZUFubm90YXRpb25EZWZpbml0aW9ucygpOworCQl9CisJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4odGhpcy50eXBlQW5ub3RhdGlvbkRlZmluaXRpb25zKTsKKwl9CisJCisJcHJvdGVjdGVkIEFubm90YXRpb25EZWZpbml0aW9uW10gYnVpbGRUeXBlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgeworCQlBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKKwkJdGhpcy5hZGRUeXBlQW5ub3RhdGlvbkRlZmluaXRpb25zVG8oZGVmaW5pdGlvbnMpOworCQlyZXR1cm4gZGVmaW5pdGlvbnMudG9BcnJheShuZXcgQW5ub3RhdGlvbkRlZmluaXRpb25bZGVmaW5pdGlvbnMuc2l6ZSgpXSk7CisJfQorCQorCS8qKgorCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgdHlwZSBhbm5vdGF0aW9uIGRlZmluaXRpb25zLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgeworCQkvLyBubyBvcAorCX0KKwkKKwlwdWJsaWMgc3luY2hyb25pemVkIEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiB0eXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucygpIHsKKwkJaWYgKHRoaXMudHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMgPT0gbnVsbCkgeworCQkJdGhpcy50eXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucyA9IHRoaXMuYnVpbGRUeXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucygpOworCQl9CisJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4odGhpcy50eXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucyk7CisJfQorCQorCXByb3RlY3RlZCBBbm5vdGF0aW9uRGVmaW5pdGlvbltdIGJ1aWxkVHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7CisJCUFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPigpOworCQl0aGlzLmFkZFR5cGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zVG8oZGVmaW5pdGlvbnMpOworCQlyZXR1cm4gZGVmaW5pdGlvbnMudG9BcnJheShuZXcgQW5ub3RhdGlvbkRlZmluaXRpb25bZGVmaW5pdGlvbnMuc2l6ZSgpXSk7CisJfQorCQorCS8qKgorCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgdHlwZSBtYXBwaW5nIGFubm90YXRpb24gZGVmaW5pdGlvbnMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkVHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgeworCQkvLyBubyBvcAorCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIGF0dHJpYnV0ZSBhbm5vdGF0aW9uIGRlZmluaXRpb25zICoqKioqKioqKioKKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgSXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24+IGF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9ucygpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zID09IG51bGwpIHsKKwkJCXRoaXMuYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zID0gdGhpcy5idWlsZEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9ucygpOworCQl9CisJCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24+KHRoaXMuYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zKTsKKwl9CisJCisJcHJvdGVjdGVkIEFubm90YXRpb25EZWZpbml0aW9uW10gYnVpbGRBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7CisJCUFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPigpOworCQl0aGlzLmFkZEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKKwkJcmV0dXJuIGRlZmluaXRpb25zLnRvQXJyYXkobmV3IEFubm90YXRpb25EZWZpbml0aW9uW2RlZmluaXRpb25zLnNpemUoKV0pOworCX0KKwkKKwkvKioKKwkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyB0byBzcGVjaWZ5IGF0dHJpYnV0ZSBhbm5vdGF0aW9uIGRlZmluaXRpb25zLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uc1RvKExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7CisJCS8vIG5vIG9wCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Mjg4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKcGFGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRGF0YVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2VKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ2FzY2FkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YURpc2NyaW1pbmF0b3JDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnVtZXJhdGVkQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhR2VuZXJhdGVkVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0b3JDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFMb2JDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWROYXRpdmVRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVF1ZXJ5Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUXVlcnlIaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlY29uZGFyeVRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGVtcG9yYWxDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFOdWxsVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5HZW5lcmljSnBhRGF0YVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLkdlbmVyaWNKcGFGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuR2VuZXJpY0pwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkdlbmVyaWNSb290Q29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQ2FzY2FkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YURpc2NyaW1pbmF0b3JDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbnVtZXJhdGVkQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhR2VuZXJhdGVkVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFHZW5lcmF0b3JDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTG9iQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU5hbWVkTmF0aXZlUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOYW1lZFF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOdWxsQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhUXVlcnlDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFRdWVyeUhpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVRlbXBvcmFsQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhVHJhbnNpZW50TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5OdWxsSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuTnVsbE1ldGFtb2RlbFN5bmNocm9uaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLk51bGxQZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5OdWxsSmF2YUNhY2hlYWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5OdWxsSmF2YURlcml2ZWRJZDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5OdWxsSmF2YU1hcHNJZDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5OdWxsSmF2YU9ycGhhblJlbW92YWwyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5KcGFGYWN0b3J5Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuSnBhUHJvamVjdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLk1ldGFtb2RlbFN5bmNocm9uaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLlBlcnNpc3RlbnRUeXBlTWV0YW1vZGVsU3luY2hyb25pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZUhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRGVyaXZlZElkMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFwc0lkMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOworCisvKioKKyAqIENlbnRyYWwgY2xhc3MgdGhhdCBhbGxvd3MgZXh0ZW5kZXJzIHRvIGVhc2lseSByZXBsYWNlIGltcGxlbWVudGF0aW9ucyBvZgorICogdmFyaW91cyBEYWxpIGludGVyZmFjZXMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpwYUZhY3RvcnkKKwlpbXBsZW1lbnRzIEpwYUZhY3RvcnkyXzAKK3sKKwlwcm90ZWN0ZWQgQWJzdHJhY3RKcGFGYWN0b3J5KCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIENvcmUgTW9kZWwgKioqKioqKioqKgorCQorCXB1YmxpYyBKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChKcGFQcm9qZWN0LkNvbmZpZyBjb25maWcpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUHJvamVjdCgoSnBhUHJvamVjdDJfMC5Db25maWcpIGNvbmZpZyk7CisJfQorCQorCXB1YmxpYyBNZXRhbW9kZWxTeW5jaHJvbml6ZXIgYnVpbGRNZXRhbW9kZWxTeW5jaHJvbml6ZXIoSnBhUHJvamVjdDJfMCBqcGFQcm9qZWN0KSB7CisJCXJldHVybiBOdWxsTWV0YW1vZGVsU3luY2hyb25pemVyLmluc3RhbmNlKCk7CisJfQorCQorCXB1YmxpYyBQZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplciBidWlsZFBlcnNpc3RlbnRUeXBlTWV0YW1vZGVsU3luY2hyb25pemVyKFBlcnNpc3RlbnRUeXBlTWV0YW1vZGVsU3luY2hyb25pemVyLk93bmVyIG93bmVyLCBQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgeworCQlyZXR1cm4gbmV3IE51bGxQZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplcigpOworCX0KKwkKKwlwdWJsaWMgSnBhRGF0YVNvdXJjZSBidWlsZEpwYURhdGFTb3VyY2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0pwYURhdGFTb3VyY2UoanBhUHJvamVjdCwgY29ubmVjdGlvblByb2ZpbGVOYW1lKTsKKwl9CisJCisJcHVibGljIEpwYUZpbGUgYnVpbGRKcGFGaWxlKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlLCBKcGFSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSnBhRmlsZShqcGFQcm9qZWN0LCBmaWxlLCBjb250ZW50VHlwZSwgcmVzb3VyY2VNb2RlbCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIENvbnRleHQgTm9kZXMgKioqKioqKioqKgorCQorCXB1YmxpYyBKcGFSb290Q29udGV4dE5vZGUgYnVpbGRSb290Q29udGV4dE5vZGUoSnBhUHJvamVjdCBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljUm9vdENvbnRleHROb2RlKHBhcmVudCk7CisJfQorCisJCisKKwkvLyAqKioqKioqKioqIEphdmEgQ29udGV4dCBNb2RlbCAqKioqKioqKioqCisJCisJcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFQZXJzaXN0ZW50VHlwZShQZXJzaXN0ZW50VHlwZS5Pd25lciBvd25lciwgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUob3duZXIsIGpycHQpOworCX0KKwkKKwlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShwYXJlbnQsIGpycGEpOworCX0KKwkKKwlwdWJsaWMgSmF2YVR5cGVNYXBwaW5nIGJ1aWxkSmF2YU51bGxUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgSmF2YU51bGxUeXBlTWFwcGluZyhwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSmF2YUVudGl0eSBidWlsZEphdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhRW50aXR5KHBhcmVudCk7CisJfQorCisJcHVibGljIEphdmFNYXBwZWRTdXBlcmNsYXNzIGJ1aWxkSmF2YU1hcHBlZFN1cGVyY2xhc3MoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFwcGVkU3VwZXJjbGFzcyhwYXJlbnQpOworCX0KKworCXB1YmxpYyBKYXZhRW1iZWRkYWJsZSBidWlsZEphdmFFbWJlZGRhYmxlKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUVtYmVkZGFibGUocGFyZW50KTsKKwl9CisJCisJcHVibGljIEphdmFUYWJsZSBidWlsZEphdmFUYWJsZShKYXZhRW50aXR5IHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhVGFibGUocGFyZW50KTsKKwl9CisJCisJcHVibGljIEphdmFDYXNjYWRlIGJ1aWxkSmF2YUNhc2NhZGUoSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFDYXNjYWRlKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBKYXZhQ29sdW1uIGJ1aWxkSmF2YUNvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhQ29sdW1uLk93bmVyIG93bmVyKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFDb2x1bW4ocGFyZW50LCBvd25lcik7CisJfQorCQorCXB1YmxpYyBKYXZhRGlzY3JpbWluYXRvckNvbHVtbiBidWlsZEphdmFEaXNjcmltaW5hdG9yQ29sdW1uKEphdmFFbnRpdHkgcGFyZW50LCBKYXZhRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lciBvd25lcikgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhRGlzY3JpbWluYXRvckNvbHVtbihwYXJlbnQsIG93bmVyKTsKKwl9CisJCisJcHVibGljIEphdmFKb2luQ29sdW1uIGJ1aWxkSmF2YUpvaW5Db2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUpvaW5Db2x1bW4uT3duZXIgb3duZXIpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUpvaW5Db2x1bW4ocGFyZW50LCBvd25lcik7CisJfQorCQorCXB1YmxpYyBKYXZhSm9pblRhYmxlIGJ1aWxkSmF2YUpvaW5UYWJsZShKYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5IHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhSm9pblRhYmxlKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBKYXZhU2Vjb25kYXJ5VGFibGUgYnVpbGRKYXZhU2Vjb25kYXJ5VGFibGUoSmF2YUVudGl0eSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVNlY29uZGFyeVRhYmxlKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBKYXZhQmFzaWNNYXBwaW5nIGJ1aWxkSmF2YUJhc2ljTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUJhc2ljTWFwcGluZyhwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGJ1aWxkSmF2YUVtYmVkZGVkSWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmcocGFyZW50KTsKKwl9CisJCisJcHVibGljIEphdmFFbWJlZGRlZE1hcHBpbmcgYnVpbGRKYXZhRW1iZWRkZWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBKYXZhSWRNYXBwaW5nIGJ1aWxkSmF2YUlkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUlkTWFwcGluZyhwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSmF2YU1hbnlUb01hbnlNYXBwaW5nIGJ1aWxkSmF2YU1hbnlUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcocGFyZW50KTsKKwl9CisJCisJcHVibGljIEphdmFNYW55VG9PbmVNYXBwaW5nIGJ1aWxkSmF2YU1hbnlUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBKYXZhT25lVG9NYW55TWFwcGluZyBidWlsZEphdmFPbmVUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZzxPbmVUb01hbnlBbm5vdGF0aW9uPihwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSmF2YU9uZVRvT25lTWFwcGluZyBidWlsZEphdmFPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcocGFyZW50KTsKKwl9CisJCisJcHVibGljIEphdmFUcmFuc2llbnRNYXBwaW5nIGJ1aWxkSmF2YVRyYW5zaWVudE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFUcmFuc2llbnRNYXBwaW5nKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBKYXZhVmVyc2lvbk1hcHBpbmcgYnVpbGRKYXZhVmVyc2lvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZyhwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSmF2YUdlbmVyYXRvckNvbnRhaW5lciBidWlsZEphdmFHZW5lcmF0b3JDb250YWluZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhR2VuZXJhdG9yQ29udGFpbmVyKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBKYXZhU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRKYXZhU2VxdWVuY2VHZW5lcmF0b3IoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IocGFyZW50KTsKKwl9CisJCisJcHVibGljIEphdmFUYWJsZUdlbmVyYXRvciBidWlsZEphdmFUYWJsZUdlbmVyYXRvcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvcihwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSmF2YUdlbmVyYXRlZFZhbHVlIGJ1aWxkSmF2YUdlbmVyYXRlZFZhbHVlKEphdmFJZE1hcHBpbmcgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFHZW5lcmF0ZWRWYWx1ZShwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFCYXNlSm9pbkNvbHVtbi5Pd25lciBvd25lcikgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4ocGFyZW50LCBvd25lcik7CisJfQorCQorCXB1YmxpYyBKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYnVpbGRKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLk93bmVyIG93bmVyKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcihwYXJlbnQsIG93bmVyKTsKKwl9CisJCisJcHVibGljIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoSmF2YUVudGl0eSBwYXJlbnQsIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuT3duZXIgb3duZXIpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIocGFyZW50LCBvd25lcik7CisJfQorCQorCXB1YmxpYyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBidWlsZEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKEphdmFFbWJlZGRlZE1hcHBpbmcyXzAgcGFyZW50LCBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyIG93bmVyKSB7CisJCXJldHVybiBuZXcgTnVsbEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKHBhcmVudCwgb3duZXIpOworCX0KKwkKKwlwdWJsaWMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIEF0dHJpYnV0ZU92ZXJyaWRlLk93bmVyIG93bmVyKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZShwYXJlbnQsIG93bmVyKTsKKwl9CisJCisJcHVibGljIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGJ1aWxkSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgcGFyZW50LCBBc3NvY2lhdGlvbk92ZXJyaWRlLk93bmVyIG93bmVyKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlKHBhcmVudCwgb3duZXIpOworCX0KKwkKKwlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UocGFyZW50KTsKKwl9CisJCisJcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGJ1aWxkSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0sIFN0cmluZyBuYW1lLCBKb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5KSB7CisJCXJldHVybiBuZXcgVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uKGpycG0sIG5hbWUsIGpvaW5pbmdTdHJhdGVneSk7CisJfQorCQorCXB1YmxpYyBKYXZhUXVlcnlDb250YWluZXIgYnVpbGRKYXZhUXVlcnlDb250YWluZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUXVlcnlDb250YWluZXIocGFyZW50KTsKKwl9CisJCisJcHVibGljIEphdmFOYW1lZFF1ZXJ5IGJ1aWxkSmF2YU5hbWVkUXVlcnkoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTmFtZWRRdWVyeShwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSmF2YU5hbWVkTmF0aXZlUXVlcnkgYnVpbGRKYXZhTmFtZWROYXRpdmVRdWVyeShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFOYW1lZE5hdGl2ZVF1ZXJ5KHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBKYXZhUXVlcnlIaW50IGJ1aWxkSmF2YVF1ZXJ5SGludChKYXZhUXVlcnkgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFRdWVyeUhpbnQocGFyZW50KTsKKwl9CisJCisJcHVibGljIEphdmFVbmlxdWVDb25zdHJhaW50IGJ1aWxkSmF2YVVuaXF1ZUNvbnN0cmFpbnQoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgVW5pcXVlQ29uc3RyYWludC5Pd25lciBvd25lcikgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhVW5pcXVlQ29uc3RyYWludChwYXJlbnQsIG93bmVyKTsKKwl9CisJCisJcHVibGljIEphdmFFbnVtZXJhdGVkQ29udmVydGVyIGJ1aWxkSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIocGFyZW50LCBqcnBhKTsKKwl9CisJCisJcHVibGljIEphdmFUZW1wb3JhbENvbnZlcnRlciBidWlsZEphdmFUZW1wb3JhbENvbnZlcnRlcihKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhVGVtcG9yYWxDb252ZXJ0ZXIocGFyZW50LCBqcnBhKTsKKwl9CisJCisJcHVibGljIEphdmFMb2JDb252ZXJ0ZXIgYnVpbGRKYXZhTG9iQ29udmVydGVyKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFMb2JDb252ZXJ0ZXIocGFyZW50LCBqcnBhKTsKKwl9CisJCisJcHVibGljIEphdmFDb252ZXJ0ZXIgYnVpbGRKYXZhTnVsbENvbnZlcnRlcihKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU51bGxDb252ZXJ0ZXIocGFyZW50KTsKKwl9CisJCisJcHVibGljIEphdmFEZXJpdmVkSWQyXzAgYnVpbGRKYXZhRGVyaXZlZElkKEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IE51bGxKYXZhRGVyaXZlZElkMl8wKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGJ1aWxkSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCQorCXB1YmxpYyBKYXZhTWFwc0lkMl8wIGJ1aWxkSmF2YU1hcHNJZChKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBOdWxsSmF2YU1hcHNJZDJfMChwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSmF2YUNhY2hlYWJsZTJfMCBidWlsZEphdmFDYWNoZWFibGUoSmF2YUNhY2hlYWJsZUhvbGRlcjJfMCBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBOdWxsSmF2YUNhY2hlYWJsZTJfMChwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBidWlsZEphdmFPcnBoYW5SZW1vdmFsKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IE51bGxKYXZhT3JwaGFuUmVtb3ZhbDJfMChwYXJlbnQpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEpwYU5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEpwYU5vZGUuamF2YQppbmRleCBjYmM2YmNhLi5mMDRiZTU1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKcGFOb2RlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhTm9kZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEyLDQ2ICsxMiw1MyBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYURhdGFTb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ2F0YWxvZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DYWxsYmFja0NoYW5nZVN1cHBvcnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKIAogLyoqCi0gKiAKKyAqIFNvbWUgY29tbW9uIERhbGkgYmVoYXZpb3I6PHVsPgorICogPGxpPmNvbnRhaW5tZW50IGhpZXJhcmNoeQorICogPGxpPkVjbGlwc2UgYWRhcHRhYmxlCisgKiA8bGk+dXBkYXRlIHRyaWdnZXJzCisgKiA8L3VsPgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFOb2RlCiAJZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBKcGFOb2RlLCBDYWxsYmFja0NoYW5nZVN1cHBvcnQuU291cmNlCisJaW1wbGVtZW50cyBKcGFOb2RlCiB7CiAJcHJpdmF0ZSBmaW5hbCBKcGFOb2RlIHBhcmVudDsKIAogCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCiAKIAlwcm90ZWN0ZWQgQWJzdHJhY3RKcGFOb2RlKEpwYU5vZGUgcGFyZW50KSB7CiAJCXN1cGVyKCk7CiAJCXRoaXMuY2hlY2tQYXJlbnQocGFyZW50KTsKIAkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAJfQotCQorCiAJcHJvdGVjdGVkIHZvaWQgY2hlY2tQYXJlbnQoSnBhTm9kZSBwKSB7CiAJCWlmIChwID09IG51bGwpIHsKIAkJCWlmICh0aGlzLnJlcXVpcmVzUGFyZW50KCkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIncGFyZW50JyBjYW5ub3QgYmUgbnVsbCIpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidwYXJlbnQnIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmICh0aGlzLmZvcmJpZHNQYXJlbnQoKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidwYXJlbnQnIG11c3QgYmUgbnVsbCIpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidwYXJlbnQnIG11c3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX0KIAl9CkBAIC02NiwyNCArNzMsMzIgQEAKIAogCUBPdmVycmlkZQogCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBDYWxsYmFja0NoYW5nZVN1cHBvcnQodGhpcyk7CisJCXJldHVybiBuZXcgQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0KHRoaXMsIHRoaXMuYnVpbGRDaGFuZ2VTdXBwb3J0TGlzdGVuZXIoKSk7CiAJfQogCi0JCisJcHJvdGVjdGVkIENhbGxiYWNrQ2hhbmdlU3VwcG9ydC5MaXN0ZW5lciBidWlsZENoYW5nZVN1cHBvcnRMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBDYWxsYmFja0NoYW5nZVN1cHBvcnQuTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhc3BlY3RDaGFuZ2VkKFN0cmluZyBhc3BlY3ROYW1lKSB7CisJCQkJQWJzdHJhY3RKcGFOb2RlLnRoaXMuYXNwZWN0Q2hhbmdlZChhc3BlY3ROYW1lKTsKKwkJCX0KKwkJfTsKKwl9CisKKwogCS8vICoqKioqKioqKiogSUFkYXB0YWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCisKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewogCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwogCX0KIAogCi0JLy8gKioqKioqKioqKiBJSnBhTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJLy8gKioqKioqKioqKiBKcGFOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKIAogCXB1YmxpYyBKcGFOb2RlIGdldFBhcmVudCgpIHsKIAkJcmV0dXJuIHRoaXMucGFyZW50OwogCX0KLQkKKwogCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7CiAJCXJldHVybiB0aGlzLnBhcmVudC5nZXRSZXNvdXJjZSgpOwogCX0KQEAgLTkyLDQyICsxMDcsNTQgQEAKIAkJcmV0dXJuIHRoaXMucGFyZW50LmdldEpwYVByb2plY3QoKTsKIAl9CiAKLQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnRvU3RyaW5nKCk7Ci0JfQotCiAKIAkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgogCiAJcHJvdGVjdGVkIEpwYVBsYXRmb3JtIGdldEpwYVBsYXRmb3JtKCkgewogCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKTsKIAl9CisJCisJcHJvdGVjdGVkIEpwYVBsYXRmb3JtLlZlcnNpb24gZ2V0SnBhUGxhdGZvcm1WZXJzaW9uKCkgeworCQlyZXR1cm4gdGhpcy5nZXRKcGFQbGF0Zm9ybSgpLmdldEpwYVZlcnNpb24oKTsKKwl9CiAKIAlwcm90ZWN0ZWQgSnBhRmFjdG9yeSBnZXRKcGFGYWN0b3J5KCkgewogCQlyZXR1cm4gdGhpcy5nZXRKcGFQbGF0Zm9ybSgpLmdldEpwYUZhY3RvcnkoKTsKIAl9CiAKLQlwcm90ZWN0ZWQgSnBhRmlsZSBnZXRKcGFGaWxlKFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCkgewotCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmdldEpwYUZpbGUocmVzb3VyY2VNb2RlbC5nZXRGaWxlKCkpOworCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBnZXRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0SnBhUGxhdGZvcm0oKS5nZXRKcGFWYXJpYXRpb24oKTsKIAl9CiAKLQlwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOworCXByb3RlY3RlZCBKcGFGaWxlIGdldEpwYUZpbGUoSUZpbGUgZmlsZSkgeworCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhRmlsZShmaWxlKTsKKwl9CisKKwlwcm90ZWN0ZWQgSnBhRGF0YVNvdXJjZSBnZXREYXRhU291cmNlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGF0YVNvdXJjZSgpOwogCX0KIAogCXByb3RlY3RlZCBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXREYXRhYmFzZSgpOworCQlyZXR1cm4gdGhpcy5nZXREYXRhU291cmNlKCkuZ2V0RGF0YWJhc2UoKTsKIAl9CiAKLQlwdWJsaWMgYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmlzQWN0aXZlKCk7CisJcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RGF0YVNvdXJjZSgpLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKIAl9CiAKLQkvLyAqKioqKioqKioqIHVwZGF0ZSBtb2RlbCAqKioqKioqKioqCisJLyoqCisJICogUHJlLWNvbmRpdGlvbjogc3BlY2lmaWVkIGNhdGFsb2cgPGVtPmlkZW50aWZpZXI8L2VtPiBpcyBub3QgbnVsbC4KKwkgKiBOQjogRG8gbm90IHVzZSB0aGUgY2F0YWxvZyA8ZW0+bmFtZTwvZW0+LgorCSAqLworCXByb3RlY3RlZCBDYXRhbG9nIGdldERiQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgeworCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwkJcmV0dXJuIChkYXRhYmFzZSA9PSBudWxsKSA/IG51bGwgOiBkYXRhYmFzZS5nZXRDYXRhbG9nRm9ySWRlbnRpZmllcihjYXRhbG9nKTsKKwl9CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdEpwYU5vZGU+LCBIYXNoU2V0PFN0cmluZz4+IG5vblVwZGF0ZUFzcGVjdE5hbWVTZXRzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0SnBhTm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4oKTsKIAotCXB1YmxpYyB2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKKwkvLyAqKioqKioqKioqIENhbGxiYWNrQ2hhbmdlU3VwcG9ydC5MaXN0ZW5lciBzdXBwb3J0ICoqKioqKioqKioKKworCXByb3RlY3RlZCB2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKIAkJaWYgKHRoaXMuYXNwZWN0VHJpZ2dlcnNVcGRhdGUoYXNwZWN0TmFtZSkpIHsKIAkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBcInVwZGF0ZVwiIGNoYW5nZTogIiArIHRoaXMgKyAiOiAiICsgYXNwZWN0TmFtZSk7CiAJCQl0aGlzLmdldEpwYVByb2plY3QoKS51cGRhdGUoKTsKQEAgLTE1NCw3ICsxODEsOSBAQAogCQl9CiAJfQogCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhTZXQ8U3RyaW5nPiBub25VcGRhdGVBc3BlY3ROYW1lcykgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0SnBhTm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4gbm9uVXBkYXRlQXNwZWN0TmFtZVNldHMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3RKcGFOb2RlPiwgSGFzaFNldDxTdHJpbmc+PigpOworCisJcHJvdGVjdGVkIHZvaWQgYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2V0PFN0cmluZz4gbm9uVXBkYXRlQXNwZWN0TmFtZXMpIHsKIAkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6CiAJLy8Jc3VwZXIuYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhub25VcGRhdGVBc3BlY3ROYW1lcyk7CiAJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YWU4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5OdWxsRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuTnVsbEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLk51bGxTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlMaXN0SXRlcmF0b3I7CisKKy8qKgorICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKKyAqIGl0IGlzIGluaXRpYWxpemVkKS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcgorCWltcGxlbWVudHMgSnBhUGxhdGZvcm1Qcm92aWRlcgoreworCXByaXZhdGUgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gcmVzb3VyY2VNb2RlbFByb3ZpZGVyczsKKworCXByaXZhdGUgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIGphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zOworCisJcHJpdmF0ZSBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBzcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zOworCisJcHJpdmF0ZSBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBkZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uczsKKworCXByaXZhdGUgUmVzb3VyY2VEZWZpbml0aW9uW10gcmVzb3VyY2VEZWZpbml0aW9uczsKKworCisJLyoqCisJICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgorCSAqLworCXByb3RlY3RlZCBBYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHJlc291cmNlIG1vZGVscyAqKioqKioqKioqCisJCisJcHVibGljIExpc3RJdGVyYXRvcjxKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI+IHJlc291cmNlTW9kZWxQcm92aWRlcnMoKSB7CisJCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8SnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyPihnZXRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIGdldFJlc291cmNlTW9kZWxQcm92aWRlcnMoKSB7CisJCWlmICh0aGlzLnJlc291cmNlTW9kZWxQcm92aWRlcnMgPT0gbnVsbCkgeworCQkJdGhpcy5yZXNvdXJjZU1vZGVsUHJvdmlkZXJzID0gdGhpcy5idWlsZFJlc291cmNlTW9kZWxQcm92aWRlcnMoKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5yZXNvdXJjZU1vZGVsUHJvdmlkZXJzOworCX0KKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gYnVpbGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCk7CisJCisJCisJLy8gKioqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gamF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4oZ2V0SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIGdldEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCkgeworCQlpZiAodGhpcy5qYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9ucyA9PSBudWxsKSB7CisJCQl0aGlzLmphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zID0gdGhpcy5idWlsZEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCk7CisJCX0KKwkJcmV0dXJuIHRoaXMuamF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnM7CisJfQorCQorCS8qKgorCSAqIFJldHVybiBhbiBhcnJheSBvZiBtYXBwaW5nIGRlZmluaXRpb25zIHRvIHVzZSBmb3IgYW5hbHl6aW5nIHRoZSBtYXBwaW5nIG9mIGEgdHlwZSBnaXZlbiBhbGwgCisJICogYW5ub3RhdGlvbnMgb24gaXQuICBUaGUgb3JkZXIgaXMgaW1wb3J0YW50LCBhcyBvbmNlIGEgbWFwcGluZyBkZWZpbml0aW9uIHRlc3RzIHBvc2l0aXZlIGZvciBhbiAKKwkgKiBhdHRyaWJ1dGUsIGFsbCBmb2xsb3dpbmcgbWFwcGluZyBkZWZpbml0aW9ucyBhcmUgaWdub3JlZC4KKwkgKiBFeHRlbmRlcnMgbWF5IGVpdGhlciBvdmVyd3JpdGUgdGhpcyBtZXRob2Qgb3Ige0BsaW5rICNidWlsZE5vbk51bGxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9ucygpfS4KKwkgKiBEb2luZyB0aGUgZm9ybWVyIHBsYWNlcyB0aGUgYWRkaXRpb25hbCByZXF1aXJlbWVudCBvbiB0aGUgZXh0ZW5kZXIgdG8gcHJvdmlkZSBhICJudWxsIgorCSAqIG1hcHBpbmcgZGVmaW5pdGlvbiAoQHNlZSB7QGxpbmsgTnVsbEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb259LikKKwkgKi8KKwlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCXJldHVybiBBcnJheVRvb2xzLmFkZCgKKwkJCWJ1aWxkTm9uTnVsbEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCksIAorCQkJTnVsbEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJfQorCQorCS8qKgorCSAqIE5vLW9wIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLiAKKwkgKiBAc2VlICNidWlsZEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCkKKwkgKi8KKwlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCkgeworCQlyZXR1cm4gbmV3IEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bMF07CisJfQorCQorCQorCS8vICoqKioqKioqKiogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKKwkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+KGdldERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGdldERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgeworCQlpZiAodGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucyA9PSBudWxsKSB7CisJCQl0aGlzLmRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zID0gdGhpcy5idWlsZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCk7CisJCX0KKwkJcmV0dXJuIHRoaXMuZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnM7CisJfQorCQorCS8qKgorCSAqIFJldHVybiBhbiBhcnJheSBvZiBtYXBwaW5nIGRlZmluaXRpb25zIHRvIHVzZSBmb3IgYW5hbHl6aW5nIHRoZSBkZWZhdWx0IG1hcHBpbmcgb2YgYW4gYXR0cmlidXRlCisJICogaW4gdGhlIGFic2VuY2Ugb2YgYW55IGFubm90YXRpb25zLiAgVGhlIG9yZGVyIGlzIGltcG9ydGFudCwgYXMgb25jZSBhIG1hcHBpbmcgZGVmaW5pdGlvbiB0ZXN0cworCSAqIHBvc2l0aXZlbHkgZm9yIGEgZ2l2ZW4gYXR0cmlidXRlLCBhbGwgZm9sbG93aW5nIG1hcHBpbmcgZGVmaW5pdGlvbnMgYXJlIGlnbm9yZWQuCisJICogRXh0ZW5kZXJzIG1heSBlaXRoZXIgb3ZlcndyaXRlIHRoaXMgbWV0aG9kIG9yIAorCSAqIHtAbGluayAjYnVpbGROb25OdWxsRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKX0uCisJICogRG9pbmcgdGhlIGZvcm1lciBwbGFjZXMgdGhlIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnQgb24gdGhlIGV4dGVuZGVyIHRvIHByb3ZpZGUgYSAibnVsbCIKKwkgKiBtYXBwaW5nIGRlZmluaXRpb24gKEBzZWUge0BsaW5rIE51bGxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ufS4pCisJICovCisJcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCXJldHVybiBBcnJheVRvb2xzLmFkZCgKKwkJCWJ1aWxkTm9uTnVsbERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCksIAorCQkJTnVsbERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJfQorCQorCS8qKgorCSAqIE5vLW9wIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLiAKKwkgKiBAc2VlICNidWlsZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkKKwkgKi8KKwlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGROb25OdWxsRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCXJldHVybiBuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uWzBdOworCX0KKwkKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gc3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKKwkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+KAorCQkJZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN5bmNocm9uaXplZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBnZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgeworCQlpZiAodGhpcy5zcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zID09IG51bGwpIHsKKwkJCXRoaXMuc3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucyA9IHRoaXMuYnVpbGRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCk7CisJCX0KKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uczsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIGFuIGFycmF5IG9mIG1hcHBpbmcgZGVmaW5pdGlvbnMgdG8gdXNlIGZvciBhbmFseXppbmcgdGhlIHNwZWNpZmllZCBtYXBwaW5nIG9mIGFuIGF0dHJpYnV0ZQorCSAqIGdpdmVuIGFsbCBhbm5vdGF0aW9ucyBvbiBpdC4gIFRoZSBvcmRlciBpcyBpbXBvcnRhbnQsIGFzIG9uY2UgYSBtYXBwaW5nIGRlZmluaXRpb24gdGVzdHMKKwkgKiBwb3NpdGl2ZWx5IGZvciBhIGdpdmVuIGF0dHJpYnV0ZSwgYWxsIGZvbGxvd2luZyBtYXBwaW5nIGRlZmluaXRpb25zIGFyZSBpZ25vcmVkLgorCSAqIEV4dGVuZGVycyBtYXkgZWl0aGVyIG92ZXJ3cml0ZSB0aGlzIG1ldGhvZCBvciAKKwkgKiB7QGxpbmsgI2J1aWxkTm9uTnVsbFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKX0uCisJICogRG9pbmcgdGhlIGZvcm1lciBwbGFjZXMgdGhlIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnQgb24gdGhlIGV4dGVuZGVyIHRvIHByb3ZpZGUgYSAibnVsbCIKKwkgKiBtYXBwaW5nIGRlZmluaXRpb24gKEBzZWUge0BsaW5rIE51bGxTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb259LikKKwkgKi8KKwlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgeworCQlyZXR1cm4gQXJyYXlUb29scy5hZGQoCisJCQlidWlsZE5vbk51bGxTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCksIAorCQkJTnVsbFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9CisJCisJLyoqCisJICogTm8tb3AgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QuIAorCSAqIEBzZWUgI2J1aWxkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpCisJICovCisJcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCXJldHVybiBuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uWzBdOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIE1hcHBpbmcgRmlsZXMgKioqKioqKioqKgorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8UmVzb3VyY2VEZWZpbml0aW9uPiByZXNvdXJjZURlZmluaXRpb25zKCkgeworCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPFJlc291cmNlRGVmaW5pdGlvbj4oZ2V0UmVzb3VyY2VEZWZpbml0aW9ucygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN5bmNocm9uaXplZCBSZXNvdXJjZURlZmluaXRpb25bXSBnZXRSZXNvdXJjZURlZmluaXRpb25zKCkgeworCQlpZiAodGhpcy5yZXNvdXJjZURlZmluaXRpb25zID09IG51bGwpIHsKKwkJCXRoaXMucmVzb3VyY2VEZWZpbml0aW9ucyA9IHRoaXMuYnVpbGRSZXNvdXJjZURlZmluaXRpb25zKCk7CisJCX0KKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VEZWZpbml0aW9uczsKKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IFJlc291cmNlRGVmaW5pdGlvbltdIGJ1aWxkUmVzb3VyY2VEZWZpbml0aW9ucygpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhUHJvamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhUHJvamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NGRiZTcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKcGFQcm9qZWN0LmphdmEKQEAgLTAsMCArMSwxNTc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFEYXRhU291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlTW9kZWxMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5UGVyc2lzdGVudFR5cGVDYWNoZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5QbGF0Zm9ybVRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLkpwYUZhY3RvcnkyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5KcGFQcm9qZWN0Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuTWV0YW1vZGVsU3luY2hyb25pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlQ2FjaGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQml0VG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKKy8qKgorICogSlBBIHByb2plY3QuIEhvbGRzIGFsbCB0aGUgSlBBIHN0dWZmLgorICogCisgKiBUaGUgSlBBIHBsYXRmb3JtIHByb3ZpZGVzIHRoZSBob29rcyBmb3IgdmVuZG9yLXNwZWNpZmljIHN0dWZmLgorICogCisgKiBUaGUgSlBBIGZpbGVzIGFyZSB0aGUgInJlc291cmNlIiBtb2RlbCAoaS5lLiBvYmplY3RzIHRoYXQgY29ycmVzcG9uZCBkaXJlY3RseQorICogdG8gRWNsaXBzZSByZXNvdXJjZXM7IGUuZy4gSmF2YSBzb3VyY2UgY29kZSBmaWxlcywgWE1MIGZpbGVzLCBKQVIgZmlsZXMpLgorICogCisgKiBUaGUgcm9vdCBjb250ZXh0IG5vZGUgaXMgdGhlICJjb250ZXh0Im1vZGVsIChpLmUuIG9iamVjdHMgdGhhdCBhdHRlbXB0IHRvCisgKiBtb2RlbCB0aGUgSlBBIHNwZWMsIHVzaW5nIHRoZSAicmVzb3VyY2UiIG1vZGVsIGFzIGFuIGFkYXB0ZXIgdG8gdGhlIEVjbGlwc2UKKyAqIHJlc291cmNlcykuCisgKiAKKyAqIFRoZSBkYXRhIHNvdXJjZSBpcyBhbiBhZGFwdGVyIHRvIHRoZSBEVFAgbWV0YS1kYXRhIG1vZGVsLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFQcm9qZWN0CisJZXh0ZW5kcyBBYnN0cmFjdEpwYU5vZGUKKwlpbXBsZW1lbnRzIEpwYVByb2plY3QyXzAKK3sKKwkvKioKKwkgKiBUaGUgRWNsaXBzZSBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpQQSBwcm9qZWN0LgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OworCisJLyoqCisJICogVGhlIHZlbmRvci1zcGVjaWZpYyBKUEEgcGxhdGZvcm0gdGhhdCBidWlsZHMgdGhlIEpQQSBwcm9qZWN0CisJICogYW5kIGFsbCBpdHMgY29udGVudHMuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIEpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtOworCisJLyoqCisJICogVGhlIEpQQSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIEpQQSBwcm9qZWN0OgorCSAqICAgICBwZXJzaXN0ZW5jZS54bWwKKwkgKiAgICAgb3JtLnhtbAorCSAqICAgICBqYXZhCisJICovCisJcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxKcGFGaWxlPiBqcGFGaWxlcyA9IG5ldyBWZWN0b3I8SnBhRmlsZT4oKTsKKworCS8qKgorCSAqIFRoZSAiZXh0ZXJuYWwiIEphdmEgcmVzb3VyY2UgY29tcGlsYXRpb24gdW5pdHMgKHNvdXJjZSkuIFBvcHVsYXRlZCB1cG9uIGRlbWFuZC4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdD4gZXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzID0gbmV3IFZlY3RvcjxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ+KCk7CisKKwkvKioKKwkgKiBUaGUgImV4dGVybmFsIiBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZXMgKGJpbmFyeSkuIFBvcHVsYXRlZCB1cG9uIGRlbWFuZC4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZSBleHRlcm5hbEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlQ2FjaGU7CisKKwkvKioKKwkgKiBSZXNvdXJjZSBtb2RlbHMgbm90aWZ5IHRoaXMgbGlzdGVuZXIgd2hlbiB0aGV5IGNoYW5nZS4gQSBwcm9qZWN0IHVwZGF0ZQorCSAqIHNob3VsZCBvY2N1ciBhbnkgdGltZSBhIHJlc291cmNlIG1vZGVsIGNoYW5nZXMuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIEpwYVJlc291cmNlTW9kZWxMaXN0ZW5lciByZXNvdXJjZU1vZGVsTGlzdGVuZXI7CisKKwkvKioKKwkgKiBUaGUgcm9vdCBvZiB0aGUgbW9kZWwgcmVwcmVzZW50aW5nIHRoZSBjb2xsYXRlZCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIAorCSAqIHRoZSBKUEEgcHJvamVjdC4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgSnBhUm9vdENvbnRleHROb2RlIHJvb3RDb250ZXh0Tm9kZTsKKworCS8qKgorCSAqIEEgcGx1Z2dhYmxlIHVwZGF0ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byAidXBkYXRlIiB0aGUgSlBBIHByb2plY3QgZWl0aGVyCisJICogc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseSAob3Igbm90IGF0IGFsbCkuIEEgc3luY2hyb25vdXMgdXBkYXRlcgorCSAqIGlzIHRoZSBkZWZhdWx0LCBhbGxvd2luZyBhIG5ld2x5LWNvbnN0cnVjdGVkIEpQQSBwcm9qZWN0IHRvIGJlICJ1cGRhdGVkIgorCSAqIHVwb24gcmV0dXJuIGZyb20gdGhlIGNvbnN0cnVjdG9yLiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgYSBVSSBzaG91bGQKKwkgKiBpbW1lZGlhdGVseSBjaGFuZ2UgdGhpcyB0byBhbiBhc3luY2hyb25vdXMgdXBkYXRlci4gQSBzeW5jaHJvbm91cworCSAqIHVwZGF0ZXIgY2FuIGJlIHVzZWQgd2hlbiB0aGUgcHJvamVjdCBpcyBiZWluZyBtYW5pcHVsYXRlZCBieSBhICJiYXRjaCIKKwkgKiAob3Igbm9uLVVJKSBjbGllbnQgKGUuZy4gd2hlbiB0ZXN0aW5nIHRoZSAidXBkYXRlIiBiZWhhdmlvcikuIEEgbnVsbAorCSAqIHVwZGF0ZXIgY2FuIHVzZWQgZHVyaW5nIHRlc3RzIHRoYXQgZG8gbm90IGNhcmUgd2hldGhlciAidXBkYXRlcyIgb2NjdXIuCisJICogQ2xpZW50cyB3aWxsIG5lZWQgdG8gZXhwbGljaXRseSBjb25maWd1cmUgdGhlIHVwZGF0ZXIgaWYgdGhleSByZXF1aXJlCisJICogc29tZXRoaW5nIG90aGVyIHRoYW4gYSBzeW5jaHJvbm91cyB1cGRhdGVyLgorCSAqLworCXByb3RlY3RlZCBVcGRhdGVyIHVwZGF0ZXI7CisKKwkvKioKKwkgKiBUaGUgZGF0YSBzb3VyY2UgdGhhdCB3cmFwcyB0aGUgRFRQIG1vZGVsLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBKcGFEYXRhU291cmNlIGRhdGFTb3VyY2U7CisJCisJLyoqCisJICogQSBjYXRhbG9nIG5hbWUgdXNlZCB0byBvdmVycmlkZSB0aGUgY29ubmVjdGlvbidzIGRlZmF1bHQgY2F0YWxvZy4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nOworCisJLyoqCisJICogQSBzY2hlbWEgbmFtZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBjb25uZWN0aW9uJ3MgZGVmYXVsdCBzY2hlbWEuCisJICovCisJcHJvdGVjdGVkIFN0cmluZyB1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hOworCisJLyoqCisJICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHByb2plY3Qgc2hvdWxkICJkaXNjb3ZlciIgYW5ub3RhdGVkCisJICogY2xhc3NlcyBhdXRvbWF0aWNhbGx5LCBhcyBvcHBvc2VkIHRvIHJlcXVpcmluZyB0aGUgY2xhc3NlcyB0byBiZQorCSAqIGxpc3RlZCBpbiBwZXJzaXN0ZW5jZS54bWwuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlczsKKworCS8qKgorCSAqIFN1cHBvcnQgZm9yIG1vZGlmeWluZyBkb2N1bWVudHMgc2hhcmVkIHdpdGggdGhlIFVJLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcjsKKworCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKioKKwlwcm90ZWN0ZWQgU3RyaW5nIG1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWU7CisJcHJvdGVjdGVkIGZpbmFsIE1ldGFtb2RlbFN5bmNocm9uaXplciBtZXRhbW9kZWxTeW5jaHJvbml6ZXI7CisJcHJvdGVjdGVkIGZpbmFsIEpvYiBtZXRhbW9kZWxTeW5jaHJvbml6YXRpb25Kb2I7CisKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJcHJvdGVjdGVkIEFic3RyYWN0SnBhUHJvamVjdChKcGFQcm9qZWN0Ml8wLkNvbmZpZyBjb25maWcpIHsKKwkJc3VwZXIobnVsbCk7ICAvLyBKUEEgcHJvamVjdCBpcyB0aGUgcm9vdCBvZiB0aGUgY29udGFpbm1lbnQgdHJlZQorCQlpZiAoKGNvbmZpZy5nZXRQcm9qZWN0KCkgPT0gbnVsbCkgfHwgKGNvbmZpZy5nZXRKcGFQbGF0Zm9ybSgpID09IG51bGwpKSB7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKwkJfQorCQl0aGlzLnByb2plY3QgPSBjb25maWcuZ2V0UHJvamVjdCgpOworCQl0aGlzLmpwYVBsYXRmb3JtID0gY29uZmlnLmdldEpwYVBsYXRmb3JtKCk7CisJCXRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSnBhRGF0YVNvdXJjZSh0aGlzLCBjb25maWcuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCkpOworCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nID0gY29uZmlnLmdldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCk7CisJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSA9IGNvbmZpZy5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCk7CisJCXRoaXMuZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcyA9IGNvbmZpZy5kaXNjb3ZlckFubm90YXRlZENsYXNzZXMoKTsKKworCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yID0gdGhpcy5idWlsZE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCk7CisKKwkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUmVzb3VyY2VNb2RlbExpc3RlbmVyKCk7CisJCS8vIGJ1aWxkIHRoZSBKUEEgZmlsZXMgY29ycmVzcG9uZGluZyB0byB0aGUgRWNsaXBzZSBwcm9qZWN0J3MgZmlsZXMKKwkJSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yIHZpc2l0b3IgPSB0aGlzLmJ1aWxkSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yKCk7CisJCXZpc2l0b3IudmlzaXRQcm9qZWN0KHRoaXMucHJvamVjdCk7CisKKwkJdGhpcy5leHRlcm5hbEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlQ2FjaGUgPSB0aGlzLmJ1aWxkRXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlKCk7CisKKwkJdGhpcy5yb290Q29udGV4dE5vZGUgPSB0aGlzLmJ1aWxkUm9vdENvbnRleHROb2RlKCk7CisKKwkJdGhpcy5tZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lID0gY29uZmlnLmdldE1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUoKTsKKwkJaWYgKHRoaXMubWV0YW1vZGVsU291cmVGb2xkZXJOYW1lSXNJbnZhbGlkKCkpIHsKKwkJCXRoaXMubWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSA9IG51bGw7CisJCX0KKwkJdGhpcy5tZXRhbW9kZWxTeW5jaHJvbml6ZXIgPSB0aGlzLmJ1aWxkTWV0YW1vZGVsU3luY2hyb25pemVyKCk7CisJCXRoaXMubWV0YW1vZGVsU3luY2hyb25pemF0aW9uSm9iID0gdGhpcy5idWlsZE1ldGFtb2RlbFN5bmNocm9uaXphdGlvbkpvYigpOworCisJCS8vICJ1cGRhdGUiIHRoZSBwcm9qZWN0IGJlZm9yZSByZXR1cm5pbmcKKwkJdGhpcy5zZXRVcGRhdGVyXyhuZXcgU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlcih0aGlzKSk7CisKKwkJLy8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoaXMgY2FjaGUgb25jZSB0aGUgY29udGV4dCBtb2RlbCBoYXMgYmVlbiBidWlsdAorCQkvLyBhbmQgYWxsIHRoZSBleHRlcm5hbCB0eXBlcyBhcmUgZmF1bHRlZCBpbgorCQl0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZS5hZGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIodGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXIpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzUGFyZW50KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7CisJCXJldHVybiB0aGlzLnByb2plY3Q7CisJfQorCisJcHJvdGVjdGVkIFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yIGJ1aWxkTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKSB7CisJCXJldHVybiBuZXcgVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IoKTsKKwl9CisKKwlwcm90ZWN0ZWQgSnBhUmVzb3VyY2VNb2RlbExpc3RlbmVyIGJ1aWxkUmVzb3VyY2VNb2RlbExpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IERlZmF1bHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoKTsKKwl9CisKKwlwcm90ZWN0ZWQgSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yIGJ1aWxkSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yKCkgeworCQlyZXR1cm4gbmV3IEluaXRpYWxSZXNvdXJjZVByb3h5VmlzaXRvcigpOworCX0KKworCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlIGJ1aWxkRXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlKCkgeworCQlyZXR1cm4gbmV3IEJpbmFyeVBlcnNpc3RlbnRUeXBlQ2FjaGUodGhpcy5qcGFQbGF0Zm9ybS5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSk7CisJfQorCisJcHJvdGVjdGVkIEpwYVJvb3RDb250ZXh0Tm9kZSBidWlsZFJvb3RDb250ZXh0Tm9kZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkUm9vdENvbnRleHROb2RlKHRoaXMpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzSnBhMl8wQ29tcGF0aWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0SnBhUGxhdGZvcm1WZXJzaW9uKCkuaXNDb21wYXRpYmxlV2l0aEpwYVZlcnNpb24oSnB0Q29yZVBsdWdpbi5KUEFfRkFDRVRfVkVSU0lPTl8yXzApOworCX0KKworCXByb3RlY3RlZCBNZXRhbW9kZWxTeW5jaHJvbml6ZXIgYnVpbGRNZXRhbW9kZWxTeW5jaHJvbml6ZXIoKSB7CisJCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8KKwkJCQkJKChKcGFGYWN0b3J5Ml8wKSB0aGlzLmdldEpwYUZhY3RvcnkoKSkuYnVpbGRNZXRhbW9kZWxTeW5jaHJvbml6ZXIodGhpcykgOgorCQkJCQludWxsOworCX0KKworCXByb3RlY3RlZCBKb2IgYnVpbGRNZXRhbW9kZWxTeW5jaHJvbml6YXRpb25Kb2IoKSB7CisJCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8KKwkJCQkJdGhpcy5idWlsZE1ldGFtb2RlbFN5bmNocm9uaXphdGlvbkpvYl8oKSA6CisJCQkJCW51bGw7CisJfQorCisJcHJvdGVjdGVkIEpvYiBidWlsZE1ldGFtb2RlbFN5bmNocm9uaXphdGlvbkpvYl8oKSB7CisJCUpvYiBqb2IgPSBuZXcgTWV0YW1vZGVsU3luY2hyb25pemF0aW9uSm9iKHRoaXMuYnVpbGRNZXRhbW9kZWxTeW5jaHJvbml6YXRpb25Kb2JOYW1lKCkpOworCQlqb2Iuc2V0UnVsZSh0aGlzLnByb2plY3QpOworCQlyZXR1cm4gam9iOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRNZXRhbW9kZWxTeW5jaHJvbml6YXRpb25Kb2JOYW1lKCkgeworCQlyZXR1cm4gTkxTLmJpbmQoSnB0Q29yZU1lc3NhZ2VzLlNZTkNIUk9OSVpFX01FVEFNT0RFTF9KT0JfTkFNRSwgdGhpcy5nZXROYW1lKCkpOworCX0KKworCS8vICoqKioqIGlubmVyIGNsYXNzCisJcHJvdGVjdGVkIGNsYXNzIEluaXRpYWxSZXNvdXJjZVByb3h5VmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7CisJCXByb3RlY3RlZCBJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IoKSB7CisJCQlzdXBlcigpOworCQl9CisJCXByb3RlY3RlZCB2b2lkIHZpc2l0UHJvamVjdChJUHJvamVjdCBwKSB7CisJCQl0cnkgeworCQkJCXAuYWNjZXB0KHRoaXMsIElSZXNvdXJjZS5OT05FKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKKwkJCQkvLyBzaG91bGRuJ3QgaGFwcGVuIC0gd2UgZG9uJ3QgdGhyb3cgYW55IENvcmVFeGNlcHRpb25zCisJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworCQkJfQorCQl9CisJCS8vIGFkZCBhIEpQQSBmaWxlIGZvciBldmVyeSBbYXBwcm9wcmlhdGVdIGZpbGUgZW5jb3VudGVyZWQgYnkgdGhlIHZpc2l0b3IKKwkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcmVzb3VyY2UpIHsKKwkJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7CisJCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6ICAvLyBzaG91bGRuJ3QgaGFwcGVuCisJCQkJCXJldHVybiB0cnVlOyAgLy8gdmlzaXQgY2hpbGRyZW4KKwkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKKwkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgorCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6CisJCQkJCXJldHVybiB0cnVlOyAgLy8gdmlzaXQgY2hpbGRyZW4KKwkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKKwkJCQkJQWJzdHJhY3RKcGFQcm9qZWN0LnRoaXMuYWRkSnBhRmlsZV8oKElGaWxlKSByZXNvdXJjZS5yZXF1ZXN0UmVzb3VyY2UoKSk7CisJCQkJCXJldHVybiBmYWxzZTsgIC8vIG5vIGNoaWxkcmVuCisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiBmYWxzZTsgIC8vIG5vIGNoaWxkcmVuCisJCQl9CisJCX0KKwl9CisKKwkvLyAqKioqKiBpbm5lciBjbGFzcworCXByb3RlY3RlZCBjbGFzcyBNZXRhbW9kZWxTeW5jaHJvbml6YXRpb25Kb2IgZXh0ZW5kcyBKb2IgeworCQlwcm90ZWN0ZWQgTWV0YW1vZGVsU3luY2hyb25pemF0aW9uSm9iKFN0cmluZyBuYW1lKSB7CisJCQlzdXBlcihuYW1lKTsKKwkJfQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJQWJzdHJhY3RKcGFQcm9qZWN0LnRoaXMuc3luY2hyb25pemVNZXRhbW9kZWxfKCk7CisJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKKworCS8qKgorCSAqIElnbm9yZSBjaGFuZ2VzIHRvIHRoaXMgY29sbGVjdGlvbi4gQWRkcyBjYW4gYmUgaWdub3JlZCBzaW5jZSB0aGV5IGFyZSB0cmlnZ2VyZWQKKwkgKiBieSByZXF1ZXN0cyB0aGF0IHdpbGwsIHRoZW1zZWx2ZXMsIHRyaWdnZXIgdXBkYXRlcyAodHlwaWNhbGx5IGR1cmluZyB0aGUKKwkgKiB1cGRhdGUgb2YgYW4gb2JqZWN0IHRoYXQgY2FsbHMgYSBzZXR0ZXIgd2l0aCB0aGUgbmV3bHktY3JlYXRlZCByZXNvdXJjZQorCSAqIHR5cGUpLiBEZWxldGVzIHdpbGwgYmUgYWNjb21wYW5pZWQgYnkgbWFudWFsIHVwZGF0ZXMuCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhTZXQ8U3RyaW5nPiBub25VcGRhdGVBc3BlY3ROYW1lcykgeworCQlzdXBlci5hZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKG5vblVwZGF0ZUFzcGVjdE5hbWVzKTsKKwkJbm9uVXBkYXRlQXNwZWN0TmFtZXMuYWRkKEVYVEVSTkFMX0pBVkFfUkVTT1VSQ0VfQ09NUElMQVRJT05fVU5JVFNfQ09MTEVDVElPTik7CisJfQorCisKKwkvLyAqKioqKioqKioqIGdlbmVyYWwgcXVlcmllcyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgeworCQlyZXR1cm4gdGhpczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnByb2plY3QuZ2V0TmFtZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7CisJfQorCisJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7CisJCXJldHVybiB0aGlzLnByb2plY3Q7CisJfQorCisJcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKKwkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZSh0aGlzLnByb2plY3QpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBKcGFQbGF0Zm9ybSBnZXRKcGFQbGF0Zm9ybSgpIHsKKwkJcmV0dXJuIHRoaXMuanBhUGxhdGZvcm07CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdD4gZ2V0Q29tYmluZWRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkgeworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdD4oCisJCQkJCXRoaXMuZ2V0SW50ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCksCisJCQkJCXRoaXMuZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkKKwkJCQkpOworCX0KKworCisJLy8gKioqKioqKioqKiBkYXRhYmFzZSAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhRGF0YVNvdXJjZSBnZXREYXRhU291cmNlKCkgeworCQlyZXR1cm4gdGhpcy5kYXRhU291cmNlOworCX0KKworCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKKwkJcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOworCX0KKworCS8qKgorCSAqIElmIHdlIGRvbid0IGhhdmUgYSBjYXRhbG9nIChpLmUuIHdlIGRvbid0IGV2ZW4gaGF2ZSBhIDxlbT5kZWZhdWx0PC9lbT4KKwkgKiBjYXRhbG9nKSwgdGhlbiB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KKwkgKi8KKwlwdWJsaWMgQ2F0YWxvZyBnZXREZWZhdWx0RGJDYXRhbG9nKCkgeworCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKTsKKwkJcmV0dXJuIChjYXRhbG9nID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0RGJDYXRhbG9nKGNhdGFsb2cpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7CisJCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpOworCQlyZXR1cm4gKGNhdGFsb2cgIT0gbnVsbCkgPyBjYXRhbG9nIDogdGhpcy5nZXREYXRhYmFzZURlZmF1bHRDYXRhbG9nKCk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZURlZmF1bHRDYXRhbG9nKCkgeworCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwkJcmV0dXJuIChkYiA9PSBudWxsICkgPyBudWxsIDogZGIuZ2V0RGVmYXVsdENhdGFsb2dJZGVudGlmaWVyKCk7CisJfQorCisJLyoqCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPiBjYXRhbG9nKSwKKwkgKiB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzOyBhbmQgd2UgbmVlZCB0bworCSAqIGdldCB0aGUgc2NoZW1hIGRpcmVjdGx5IGZyb20gdGhlIGRhdGFiYXNlLgorCSAqLworCXB1YmxpYyBTY2hlbWFDb250YWluZXIgZ2V0RGVmYXVsdERiU2NoZW1hQ29udGFpbmVyKCkgeworCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKTsKKwkJcmV0dXJuIChjYXRhbG9nICE9IG51bGwpID8gdGhpcy5nZXREYkNhdGFsb2coY2F0YWxvZykgOiB0aGlzLmdldERhdGFiYXNlKCk7CisJfQorCisJcHVibGljIFNjaGVtYSBnZXREZWZhdWx0RGJTY2hlbWEoKSB7CisJCVNjaGVtYUNvbnRhaW5lciBzYyA9IHRoaXMuZ2V0RGVmYXVsdERiU2NoZW1hQ29udGFpbmVyKCk7CisJCXJldHVybiAoc2MgPT0gbnVsbCkgPyBudWxsIDogc2MuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcih0aGlzLmdldERlZmF1bHRTY2hlbWEoKSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgeworCQlTdHJpbmcgc2NoZW1hID0gdGhpcy5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCk7CisJCWlmIChzY2hlbWEgIT0gbnVsbCkgeworCQkJcmV0dXJuIHNjaGVtYTsKKwkJfQorCisJCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpOworCQlpZiAoY2F0YWxvZyA9PSBudWxsKSB7CisJCQkvLyBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IGNhdGFsb2cgKGVpdGhlciB1c2VyLW92ZXJyaWRlIG9yIGRhdGFiYXNlLWRldGVybWluZWQpLAorCQkJLy8gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3M7CisJCQkvLyByZXR1cm4gdGhlIGRhdGFiYXNlJ3MgZGVmYXVsdCBzY2hlbWEKKwkJCXJldHVybiB0aGlzLmdldERhdGFiYXNlRGVmYXVsdFNjaGVtYSgpOworCQl9CisKKwkJQ2F0YWxvZyBkYkNhdGFsb2cgPSB0aGlzLmdldERiQ2F0YWxvZyhjYXRhbG9nKTsKKwkJaWYgKGRiQ2F0YWxvZyAhPSBudWxsKSB7CisJCQlyZXR1cm4gZGJDYXRhbG9nLmdldERlZmF1bHRTY2hlbWFJZGVudGlmaWVyKCk7CisJCX0KKworCQkvLyBpZiB3ZSBjb3VsZCBub3QgZmluZCBhIGNhdGFsb2cgb24gdGhlIGRhdGFiYXNlIHRoYXQgbWF0Y2hlcyB0aGUgZGVmYXVsdAorCQkvLyBjYXRhbG9nIG5hbWUsIHJldHVybiB0aGUgZGF0YWJhc2UncyBkZWZhdWx0IHNjaGVtYSg/KSAtIGhtbW0KKwkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2VEZWZhdWx0U2NoZW1hKCk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZURlZmF1bHRTY2hlbWEoKSB7CisJCURhdGFiYXNlIGRiID0gdGhpcy5nZXREYXRhYmFzZSgpOworCQlyZXR1cm4gKGRiID09IG51bGwgKSA/IG51bGwgOiBkYi5nZXREZWZhdWx0U2NoZW1hSWRlbnRpZmllcigpOworCX0KKworCisJLy8gKioqKioqKioqKiB1c2VyIG92ZXJyaWRlIGRlZmF1bHQgY2F0YWxvZyAqKioqKioqKioqCisJCisJcHVibGljIFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpIHsKKwkJcmV0dXJuIHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2c7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nOworCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nID0gY2F0YWxvZzsKKwkJSnB0Q29yZVBsdWdpbi5zZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZyh0aGlzLnByb2plY3QsIGNhdGFsb2cpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogdXNlciBvdmVycmlkZSBkZWZhdWx0IHNjaGVtYSAqKioqKioqKioqCisJCisJcHVibGljIFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYTsKKwkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hID0gc2NoZW1hOworCQlKcHRDb3JlUGx1Z2luLnNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEodGhpcy5wcm9qZWN0LCBzY2hlbWEpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIGRpc2NvdmVyIGFubm90YXRlZCBjbGFzc2VzICoqKioqKioqKioKKwkKKwlwdWJsaWMgYm9vbGVhbiBkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCkgeworCQlyZXR1cm4gdGhpcy5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKGJvb2xlYW4gZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcykgeworCQlib29sZWFuIG9sZCA9IHRoaXMuZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlczsKKwkJdGhpcy5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzID0gZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlczsKKwkJSnB0Q29yZVBsdWdpbi5zZXREaXNjb3ZlckFubm90YXRlZENsYXNzZXModGhpcy5wcm9qZWN0LCBkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU0NPVkVSU19BTk5PVEFURURfQ0xBU1NFU19QUk9QRVJUWSwgb2xkLCBkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBKUEEgZmlsZXMgKioqKioqKioqKgorCisJcHVibGljIEl0ZXJhdG9yPEpwYUZpbGU+IGpwYUZpbGVzKCkgeworCQlyZXR1cm4gdGhpcy5nZXRKcGFGaWxlcygpLml0ZXJhdG9yKCk7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhYmxlPEpwYUZpbGU+IGdldEpwYUZpbGVzKCkgeworCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEpwYUZpbGU+KHRoaXMuanBhRmlsZXMpOyAgLy8gcmVhZC1vbmx5CisJfQorCisJcHVibGljIGludCBqcGFGaWxlc1NpemUoKSB7CisJCXJldHVybiB0aGlzLmpwYUZpbGVzLnNpemUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmFibGU8SnBhRmlsZT4gZ2V0SnBhRmlsZXMoZmluYWwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SnBhRmlsZSwgSnBhRmlsZT4odGhpcy5nZXRKcGFGaWxlcygpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKcGFGaWxlIGpwYUZpbGUpIHsKKwkJCQlyZXR1cm4ganBhRmlsZS5nZXRDb250ZW50VHlwZSgpLmlzS2luZE9mKGNvbnRlbnRUeXBlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhRmlsZSBnZXRKcGFGaWxlKElGaWxlIGZpbGUpIHsKKwkJZm9yIChKcGFGaWxlIGpwYUZpbGUgOiB0aGlzLmdldEpwYUZpbGVzKCkpIHsKKwkJCWlmIChqcGFGaWxlLmdldEZpbGUoKS5lcXVhbHMoZmlsZSkpIHsKKwkJCQlyZXR1cm4ganBhRmlsZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBBZGQgYSBKUEEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLCBpZiBhcHByb3ByaWF0ZS4KKwkgKiBSZXR1cm4gdHJ1ZSBpZiBhIEpQQSBGaWxlIHdhcyBjcmVhdGVkIGFuZCBhZGRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkSnBhRmlsZShJRmlsZSBmaWxlKSB7CisJCUpwYUZpbGUganBhRmlsZSA9IHRoaXMuYWRkSnBhRmlsZV8oZmlsZSk7CisJCWlmIChqcGFGaWxlICE9IG51bGwpIHsKKwkJCXRoaXMuZmlyZUl0ZW1BZGRlZChKUEFfRklMRVNfQ09MTEVDVElPTiwganBhRmlsZSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQWRkIGEgSlBBIGZpbGUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZSwgaWYgYXBwcm9wcmlhdGUsIHdpdGhvdXQgZmlyaW5nCisJICogYW4gZXZlbnQ7IHVzZWZ1bCBkdXJpbmcgY29uc3RydWN0aW9uLgorCSAqIFJldHVybiB0aGUgbmV3IEpQQSBmaWxlLCBudWxsIGlmIGl0IHdhcyBub3QgY3JlYXRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgSnBhRmlsZSBhZGRKcGFGaWxlXyhJRmlsZSBmaWxlKSB7CisJCWlmICggISB0aGlzLmdldEphdmFQcm9qZWN0KCkuaXNPbkNsYXNzcGF0aChmaWxlKSkgeworCQkJcmV0dXJuIG51bGw7ICAvLyB0aGUgZmlsZSBtdXN0IGJlIG9uIHRoZSBKYXZhIGNsYXNzcGF0aAorCQl9CisKKwkJSnBhRmlsZSBqcGFGaWxlID0gdGhpcy5nZXRKcGFQbGF0Zm9ybSgpLmJ1aWxkSnBhRmlsZSh0aGlzLCBmaWxlKTsKKwkJaWYgKGpwYUZpbGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJanBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCkuYWRkUmVzb3VyY2VNb2RlbExpc3RlbmVyKHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyKTsKKwkJdGhpcy5qcGFGaWxlcy5hZGQoanBhRmlsZSk7CisJCXJldHVybiBqcGFGaWxlOworCX0KKworCS8qKgorCSAqIFJlbW92ZSB0aGUgSlBBIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIElGaWxlLCBpZiBpdCBleGlzdHMuCisJICogUmV0dXJuIHRydWUgaWYgYSBKUEEgRmlsZSB3YXMgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSnBhRmlsZShJRmlsZSBmaWxlKSB7CisJCUpwYUZpbGUganBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZShmaWxlKTsKKwkJaWYgKGpwYUZpbGUgIT0gbnVsbCkgeyAgLy8gYSBKcGFGaWxlIGlzIG5vdCBhZGRlZCBmb3IgZXZlcnkgSUZpbGUKKwkJCXRoaXMucmVtb3ZlSnBhRmlsZShqcGFGaWxlKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgSlBBIGZpbGUgYW5kIHJlbW92ZSBpdC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVKcGFGaWxlKEpwYUZpbGUganBhRmlsZSkgeworCQlqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKS5yZW1vdmVSZXNvdXJjZU1vZGVsTGlzdGVuZXIodGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXIpOworCQlpZiAoICEgdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oanBhRmlsZSwgdGhpcy5qcGFGaWxlcywgSlBBX0ZJTEVTX0NPTExFQ1RJT04pKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGpwYUZpbGUudG9TdHJpbmcoKSk7CisJCX0KKwl9CisKKworCS8vICoqKioqKioqKiogZXh0ZXJuYWwgSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IHR5cGVzIChzb3VyY2Ugb3IgYmluYXJ5KSAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgYnVpbGRQZXJzaXN0YWJsZUV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7CisJCUlUeXBlIGpkdFR5cGUgPSB0aGlzLmZpbmRUeXBlKHR5cGVOYW1lKTsKKwkJcmV0dXJuIChqZHRUeXBlID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRQZXJzaXN0YWJsZUV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoamR0VHlwZSk7CisJfQorCisJcHJvdGVjdGVkIElUeXBlIGZpbmRUeXBlKFN0cmluZyB0eXBlTmFtZSkgeworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh0eXBlTmFtZSk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJcmV0dXJuIG51bGw7ICAvLyBpZ25vcmUgZXhjZXB0aW9uPworCQl9CisJfQorCisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGJ1aWxkUGVyc2lzdGFibGVFeHRlcm5hbEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKElUeXBlIGpkdFR5cGUpIHsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCA9IHRoaXMuYnVpbGRFeHRlcm5hbEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKGpkdFR5cGUpOworCQlyZXR1cm4gKChqcnB0ICE9IG51bGwpICYmIGpycHQuaXNQZXJzaXN0YWJsZSgpKSA/IGpycHQgOiBudWxsOworCX0KKworCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBidWlsZEV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoSVR5cGUgamR0VHlwZSkgeworCQlyZXR1cm4gamR0VHlwZS5pc0JpbmFyeSgpID8KKwkJCQl0aGlzLmJ1aWxkQmluYXJ5RXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShqZHRUeXBlKSA6CisJCQkJdGhpcy5idWlsZFNvdXJjZUV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoamR0VHlwZSk7CisJfQorCisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGJ1aWxkQmluYXJ5RXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShJVHlwZSBqZHRUeXBlKSB7CisJCXJldHVybiB0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZS5hZGRQZXJzaXN0ZW50VHlwZShqZHRUeXBlKTsKKwl9CisKKwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgYnVpbGRTb3VyY2VFeHRlcm5hbEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKElUeXBlIGpkdFR5cGUpIHsKKwkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGpyY3UgPSB0aGlzLmdldEV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KGpkdFR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkpOworCQlTdHJpbmcgamR0VHlwZU5hbWUgPSBqZHRUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpOyAgLy8gSkRUIG1lbWJlciB0eXBlIG5hbWVzIHVzZSAnJCcKKwkJZm9yIChJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gc3RyZWFtID0ganJjdS5wZXJzaXN0ZW50VHlwZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0gc3RyZWFtLm5leHQoKTsKKwkJCWlmIChqcnB0LmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoamR0VHlwZU5hbWUpKSB7CisJCQkJcmV0dXJuIGpycHQ7CisJCQl9CisJCX0KKwkJLy8gd2UgY2FuIGdldCBoZXJlIGlmIHRoZSBwcm9qZWN0IEpSRSBpcyByZW1vdmVkOworCQkvLyBzZWUgU291cmNlQ29tcGlsYXRpb25Vbml0I2dldFByaW1hcnlUeXBlKENvbXBpbGF0aW9uVW5pdCkKKwkJLy8gYnVnIDIyNTMzMgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKworCS8vICoqKioqKioqKiogZXh0ZXJuYWwgSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IHR5cGVzIChiaW5hcnkpICoqKioqKioqKioKKworCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlIGdldEV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZSgpIHsKKwkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlOworCX0KKworCisJLy8gKioqKioqKioqKiBleHRlcm5hbCBKYXZhIHJlc291cmNlIGNvbXBpbGF0aW9uIHVuaXRzIChzb3VyY2UpICoqKioqKioqKioKKworCXB1YmxpYyBJdGVyYXRvcjxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ+IGV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkuaXRlcmF0b3IoKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0PiBnZXRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSB7CisJCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0Pih0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cyk7ICAvLyByZWFkLW9ubHkKKwl9CisKKwlwdWJsaWMgaW50IGV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0c1NpemUoKSB7CisJCXJldHVybiB0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cy5zaXplKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBtb2RlbCBjb21waWxhdGlvbiB1bml0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZAorCSAqIEpEVCBjb21waWxhdGlvbiB1bml0LiBJZiBpdCBkb2VzIG5vdCBleGlzdCwgYnVpbGQgaXQuCisJICovCisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBnZXRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGpkdENvbXBpbGF0aW9uVW5pdCkgeworCQlmb3IgKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1IDogdGhpcy5nZXRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSkgeworCQkJaWYgKGpyY3UuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZXF1YWxzKGpkdENvbXBpbGF0aW9uVW5pdCkpIHsKKwkJCQkvLyB3ZSB3aWxsIGdldCBoZXJlIGlmIHRoZSBKUkNVIGNvdWxkIG5vdCBidWlsZCBpdHMgcGVyc2lzdGVudCB0eXBlLi4uCisJCQkJcmV0dXJuIGpyY3U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRoaXMuYWRkRXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoamR0Q29tcGlsYXRpb25Vbml0KTsKKwl9CisKKwkvKioKKwkgKiBBZGQgYW4gZXh0ZXJuYWwgSmF2YSByZXNvdXJjZSBjb21waWxhdGlvbiB1bml0LgorCSAqLworCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgYWRkRXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBqZHRDb21waWxhdGlvblVuaXQpIHsKKwkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGpyY3UgPSB0aGlzLmJ1aWxkSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KGpkdENvbXBpbGF0aW9uVW5pdCk7CisJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihqcmN1LCB0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cywgRVhURVJOQUxfSkFWQV9SRVNPVVJDRV9DT01QSUxBVElPTl9VTklUU19DT0xMRUNUSU9OKTsKKwkJanJjdS5hZGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIodGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXIpOworCQlyZXR1cm4ganJjdTsKKwl9CisKKwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGJ1aWxkSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgamR0Q29tcGlsYXRpb25Vbml0KSB7CisJCXJldHVybiBuZXcgU291cmNlQ29tcGlsYXRpb25Vbml0KAorCQkJCQlqZHRDb21waWxhdGlvblVuaXQsCisJCQkJCXRoaXMuanBhUGxhdGZvcm0uZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCksCisJCQkJCXRoaXMuanBhUGxhdGZvcm0uZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKSwKKwkJCQkJdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcgorCQkJCSk7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoSUZpbGUgZmlsZSkgeworCQlmb3IgKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1IDogdGhpcy5nZXRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSkgeworCQkJaWYgKGpyY3UuZ2V0RmlsZSgpLmVxdWFscyhmaWxlKSkgeworCQkJCXRoaXMucmVtb3ZlRXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoanJjdSk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZUV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1KSB7CisJCWpyY3UucmVtb3ZlUmVzb3VyY2VNb2RlbExpc3RlbmVyKHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyKTsKKwkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oanJjdSwgdGhpcy5leHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMsIEVYVEVSTkFMX0pBVkFfUkVTT1VSQ0VfQ09NUElMQVRJT05fVU5JVFNfQ09MTEVDVElPTik7CisJfQorCisKKwkvLyAqKioqKioqKioqIGNvbnRleHQgbW9kZWwgKioqKioqKioqKgorCisJcHVibGljIEpwYVJvb3RDb250ZXh0Tm9kZSBnZXRSb290Q29udGV4dE5vZGUoKSB7CisJCXJldHVybiB0aGlzLnJvb3RDb250ZXh0Tm9kZTsKKwl9CisKKworCS8vICoqKioqKioqKiogdXRpbGl0eSAqKioqKioqKioqCisKKwlwdWJsaWMgSUZpbGUgY29udmVydFRvUGxhdGZvcm1GaWxlKFN0cmluZyBmaWxlTmFtZSkgeworCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXRQbGF0Zm9ybUZpbGUodGhpcy5wcm9qZWN0LCBmaWxlTmFtZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIFhNTCBmaWxlcyAqKioqKioqKioqCisKKwlwdWJsaWMgSnBhWG1sUmVzb3VyY2UgZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIChKcGFYbWxSZXNvdXJjZSkgdGhpcy5nZXRSZXNvdXJjZU1vZGVsKAorCQkJCUpwdENvcmVQbHVnaW4uREVGQVVMVF9QRVJTSVNURU5DRV9YTUxfRklMRV9QQVRILAorCQkJCUpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRSk7CisJfQorCisJcHVibGljIEpwYVhtbFJlc291cmNlIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOworCX0KKworCXB1YmxpYyBKcGFYbWxSZXNvdXJjZSBnZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKFN0cmluZyBmaWxlTmFtZSkgeworCQlyZXR1cm4gKEpwYVhtbFJlc291cmNlKSB0aGlzLmdldFJlc291cmNlTW9kZWwoZmlsZU5hbWUsIEpwdENvcmVQbHVnaW4uTUFQUElOR19GSUxFX0NPTlRFTlRfVFlQRSk7CisJfQorCisJLyoqCisJICogSWYgdGhlIHNwZWNpZmllZCBmaWxlIGV4aXN0cywgaXMgc2lnbmlmaWNhbnQgdG8gdGhlIEpQQSBwcm9qZWN0LCBhbmQgaXRzCisJICogY29udGVudCBpcyBhICJraW5kIG9mIiB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZSwgcmV0dXJuIHRoZSBKUEEKKwkgKiByZXNvdXJjZSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWxlOyBvdGhlcndpc2UsIHJldHVybiBudWxsLgorCSAqLworCXByb3RlY3RlZCBKcGFSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoU3RyaW5nIGZpbGVOYW1lLCBJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKKwkJSUZpbGUgZmlsZSA9IHRoaXMuY29udmVydFRvUGxhdGZvcm1GaWxlKGZpbGVOYW1lKTsKKwkJcmV0dXJuIGZpbGUuZXhpc3RzKCkgPyB0aGlzLmdldFJlc291cmNlTW9kZWwoZmlsZSwgY29udGVudFR5cGUpIDogIG51bGw7CisJfQorCisJLyoqCisJICogSWYgdGhlIHNwZWNpZmllZCBmaWxlIGlzIHNpZ25pZmljYW50IHRvIHRoZSBKUEEgcHJvamVjdCBhbmQgaXRzIGNvbnRlbnQKKwkgKiBpcyBhICJraW5kIG9mIiB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZSwgcmV0dXJuIHRoZSBKUEEgcmVzb3VyY2UgbW9kZWwKKwkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWxlOyBvdGhlcndpc2UsIHJldHVybiBudWxsLgorCSAqLworCXByb3RlY3RlZCBKcGFSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoSUZpbGUgZmlsZSwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7CisJCUpwYUZpbGUganBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZShmaWxlKTsKKwkJcmV0dXJuIChqcGFGaWxlID09IG51bGwpID8gbnVsbCA6IGpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbChjb250ZW50VHlwZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIGFubm90YXRlZCBKYXZhIHNvdXJjZSBjbGFzc2VzICoqKioqKioqKioKKwkKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbm5vdGF0ZWRKYXZhU291cmNlQ2xhc3NOYW1lcygpIHsKKwkJcmV0dXJuIGdldEFubm90YXRlZEphdmFTb3VyY2VDbGFzc05hbWVzKCkuaXRlcmF0b3IoKTsKKwl9CisJCisJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QW5ub3RhdGVkSmF2YVNvdXJjZUNsYXNzTmFtZXMoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSwgU3RyaW5nPigKKwkJCQlnZXRJbnRlcm5hbEFubm90YXRlZFNvdXJjZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlcygpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycFR5cGUpIHsKKwkJCQlyZXR1cm4ganJwVHlwZS5nZXRRdWFsaWZpZWROYW1lKCk7CisJCQl9CisJCX07CisJfQorCQorCS8qKgorCSAqIHJldHVybiBvbmx5IHRob3NlIHZhbGlkIGFubm90YXRlZCBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgCisJICogSlBBIHByb2plY3QsIGlnbm9yaW5nIHRob3NlIGluIEpBUnMgcmVmZXJlbmNlZCBpbiBwZXJzaXN0ZW5jZS54bWwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpQVFRvb2xzI3R5cGVJc1BlcnNpc3RhYmxlKG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpQVFRvb2xzLlR5cGVBZGFwdGVyKQorCSAqLworCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gZ2V0SW50ZXJuYWxBbm5vdGF0ZWRTb3VyY2VKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZXMoKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPigKKwkJCQlnZXRJbnRlcm5hbFNvdXJjZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlcygpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnBUeXBlKSB7CisJCQkJcmV0dXJuIGpycFR5cGUuaXNQZXJzaXN0YWJsZSgpICYmIGpycFR5cGUuaXNBbm5vdGF0ZWQoKTsgIC8vIGkuZS4gdGhlIHR5cGUgaXMgdmFsaWQgYW5kIGhhcyBhIHZhbGlkIHR5cGUgYW5ub3RhdGlvbgorCQkJfQorCQl9OworCX0KKwkKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBtYXBwZWRKYXZhU291cmNlQ2xhc3NOYW1lcygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0TWFwcGVkSmF2YVNvdXJjZUNsYXNzTmFtZXMoKS5pdGVyYXRvcigpOworCX0KKworCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldE1hcHBlZEphdmFTb3VyY2VDbGFzc05hbWVzKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUsIFN0cmluZz4oCisJCQkJZ2V0SW50ZXJuYWxNYXBwZWRTb3VyY2VKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZXMoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnBUeXBlKSB7CisJCQkJcmV0dXJuIGpycFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpOworCQkJfQorCQl9OworCX0KKwkKKwkvKioKKwkgKiByZXR1cm4gb25seSB0aG9zZSB2YWxpZCAibWFwcGVkIiAoaS5lLiBhbm5vdGF0ZWQgd2l0aCBARW50aXR5LCBARW1iZWRkYWJsZSwgZXRjLikgSmF2YSAKKwkgKiByZXNvdXJjZSBwZXJzaXN0ZW50IHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIEpQQSBwcm9qZWN0LCBpZ25vcmluZyB0aG9zZSBpbiBKQVJzIAorCSAqIHJlZmVyZW5jZWQgaW4gcGVyc2lzdGVuY2UueG1sCisJICovCisJcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiBnZXRJbnRlcm5hbE1hcHBlZFNvdXJjZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlcygpIHsKKwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSwgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+KAorCQkJCWdldEludGVybmFsQW5ub3RhdGVkU291cmNlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycFR5cGUpIHsKKwkJCQlyZXR1cm4ganJwVHlwZS5pc01hcHBlZCgpOyAgLy8gaS5lLiB0aGUgdHlwZSBpcyBhbHJlYWR5IHBlcnNpc3RhYmxlIGFuZCBhbm5vdGF0ZWQKKwkJCX0KKwkJfTsKKwl9CisJCisJLyoqCisJICogcmV0dXJuIG9ubHkgdGhvc2UgSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IHR5cGVzIHRoYXQgYXJlCisJICogcGFydCBvZiB0aGUgSlBBIHByb2plY3QsIGlnbm9yaW5nIHRob3NlIGluIEpBUnMgcmVmZXJlbmNlZCBpbiBwZXJzaXN0ZW5jZS54bWwKKwkgKi8KKwlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IGdldEludGVybmFsU291cmNlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVzKCkgeworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPih0aGlzLmdldEludGVybmFsU291cmNlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVTZXRzKCkpOworCX0KKworCS8qKgorCSAqIHJldHVybiBvbmx5IHRob3NlIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCB0eXBlcyB0aGF0IGFyZQorCSAqIHBhcnQgb2YgdGhlIEpQQSBwcm9qZWN0LCBpZ25vcmluZyB0aG9zZSBpbiBKQVJzIHJlZmVyZW5jZWQgaW4gcGVyc2lzdGVuY2UueG1sCisJICovCisJcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPj4gZ2V0SW50ZXJuYWxTb3VyY2VKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZVNldHMoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQsIEl0ZXJhYmxlPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPj4odGhpcy5nZXRJbnRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IHRyYW5zZm9ybShmaW5hbCBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7CisJCQkJcmV0dXJuIG5ldyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4oKSB7CisJCQkJCXB1YmxpYyBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gaXRlcmF0b3IoKSB7CisJCQkJCQlyZXR1cm4gY29tcGlsYXRpb25Vbml0LnBlcnNpc3RlbnRUeXBlcygpOyAgLy8gKmFsbCogdGhlIHR5cGVzIGluIHRoZSBjb21waWxhdGlvbiB1bml0CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQl9OworCX0KKworCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ+IGdldEludGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEpwYUZpbGUsIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdD4odGhpcy5nZXRKYXZhU291cmNlSnBhRmlsZXMoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IHRyYW5zZm9ybShKcGFGaWxlIGpwYUZpbGUpIHsKKwkJCQlyZXR1cm4gKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCkganBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCk7CisJCQl9CisJCX07CisJfQorCisJLyoqCisJICogcmV0dXJuIEpQQSBmaWxlcyB3aXRoIEphdmEgc291cmNlICJjb250ZW50IgorCSAqLworCXByb3RlY3RlZCBJdGVyYWJsZTxKcGFGaWxlPiBnZXRKYXZhU291cmNlSnBhRmlsZXMoKSB7CisJCXJldHVybiB0aGlzLmdldEpwYUZpbGVzKEpwdENvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKTsKKwl9CisKKworCS8vICoqKioqKioqKiogSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IHR5cGUgbG9vay11cCAqKioqKioqKioqCisKKwlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7CisJCWZvciAoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwVHlwZSA6IHRoaXMuZ2V0UGVyc2lzdGFibGVKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZXMoKSkgeworCQkJaWYgKGpycFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0eXBlTmFtZSkpIHsKKwkJCQlyZXR1cm4ganJwVHlwZTsKKwkJCX0KKwkJfQorCQkvLyBpZiB3ZSBkb24ndCBoYXZlIGEgdHlwZSBhbHJlYWR5LCB0cnkgdG8gYnVpbGQgbmV3IG9uZSBmcm9tIHRoZSBwcm9qZWN0IGNsYXNzcGF0aAorCQlyZXR1cm4gdGhpcy5idWlsZFBlcnNpc3RhYmxlRXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSh0eXBlTmFtZSk7CisJfQorCisJLyoqCisJICogcmV0dXJuICphbGwqIHRoZSAicGVyc2lzdGFibGUiIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCB0eXBlcywgaW5jbHVkaW5nIHRob3NlIGluIEpBUnMgcmVmZXJlbmNlZCBpbgorCSAqIHBlcnNpc3RlbmNlLnhtbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSlBUVG9vbHMjdHlwZUlzUGVyc2lzdGFibGUob3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSlBUVG9vbHMuVHlwZUFkYXB0ZXIpCisJICovCisJcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiBnZXRQZXJzaXN0YWJsZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlcygpIHsKKwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSwgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+KHRoaXMuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycFR5cGUpIHsKKwkJCQlyZXR1cm4ganJwVHlwZS5pc1BlcnNpc3RhYmxlKCk7CisJCQl9CisJCX07CisJfQorCisJLyoqCisJICogcmV0dXJuICphbGwqIHRoZSBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZXMsIGluY2x1ZGluZyB0aG9zZSBpbiBKQVJzIHJlZmVyZW5jZWQgaW4KKwkgKiBwZXJzaXN0ZW5jZS54bWwKKwkgKi8KKwlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlcygpIHsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4odGhpcy5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZVNldHMoKSk7CisJfQorCisJLyoqCisJICogcmV0dXJuICphbGwqIHRoZSBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZXMsIGluY2x1ZGluZyB0aG9zZSBpbiBKQVJzIHJlZmVyZW5jZWQgaW4KKwkgKiBwZXJzaXN0ZW5jZS54bWwKKwkgKi8KKwlwcm90ZWN0ZWQgSXRlcmFibGU8SXRlcmFibGU8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+PiBnZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZVNldHMoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXZhUmVzb3VyY2VOb2RlLlJvb3QsIEl0ZXJhYmxlPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPj4odGhpcy5nZXRKYXZhUmVzb3VyY2VOb2RlUm9vdHMoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IHRyYW5zZm9ybShmaW5hbCBKYXZhUmVzb3VyY2VOb2RlLlJvb3Qgcm9vdCkgeworCQkJCXJldHVybiBuZXcgSXRlcmFibGU8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+KCkgeworCQkJCQlwdWJsaWMgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IGl0ZXJhdG9yKCkgeworCQkJCQkJcmV0dXJuIHJvb3QucGVyc2lzdGVudFR5cGVzKCk7ICAvLyAqYWxsKiB0aGUgdHlwZXMgaGVsZCBieSB0aGUgcm9vdAorCQkJCQl9CisJCQkJfTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlTm9kZS5Sb290PiBnZXRKYXZhUmVzb3VyY2VOb2RlUm9vdHMoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SmF2YVJlc291cmNlTm9kZS5Sb290PigKKwkJCQkJdGhpcy5nZXRJbnRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSwKKwkJCQkJdGhpcy5nZXRJbnRlcm5hbEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3RzKCksCisJCQkJCXRoaXMuZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCksCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbih0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZSkKKwkJCQkpOworCX0KKworCisJLy8gKioqKioqKioqKiBKQVJzICoqKioqKioqKioKKworCS8vIFRPRE8KKwlwdWJsaWMgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBnZXRKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KFN0cmluZyBqYXJGaWxlTmFtZSkgeworLy8JCXJldHVybiB0aGlzLmdldEphclJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCh0aGlzLmNvbnZlcnRUb1BsYXRmb3JtRmlsZShqYXJGaWxlTmFtZSkpOworCQlyZXR1cm4gdGhpcy5nZXRKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KHRoaXMuZ2V0UHJvamVjdCgpLmdldEZpbGUoamFyRmlsZU5hbWUpKTsKKwl9CisKKwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBnZXRKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KElGaWxlIGphckZpbGUpIHsKKwkJZm9yIChKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IHBmciA6IHRoaXMuZ2V0SW50ZXJuYWxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290cygpKSB7CisJCQlpZiAocGZyLmdldEZpbGUoKS5lcXVhbHMoamFyRmlsZSkpIHsKKwkJCQlyZXR1cm4gcGZyOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290PiBnZXRJbnRlcm5hbEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3RzKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SnBhRmlsZSwgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdD4odGhpcy5nZXRKYXJKcGFGaWxlcygpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IHRyYW5zZm9ybShKcGFGaWxlIGpwYUZpbGUpIHsKKwkJCQlyZXR1cm4gKEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QpIGpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpOworCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIHJldHVybiBKUEEgZmlsZXMgd2l0aCBKQVIgImNvbnRlbnQiCisJICovCisJcHJvdGVjdGVkIEl0ZXJhYmxlPEpwYUZpbGU+IGdldEphckpwYUZpbGVzKCkgeworCQlyZXR1cm4gdGhpcy5nZXRKcGFGaWxlcyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpOworCX0KKworCisJLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5tZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUoU3RyaW5nIG1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMubWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZTsKKwkJdGhpcy5tZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lID0gbWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZTsKKwkJSnB0Q29yZVBsdWdpbi5zZXRNZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKHRoaXMucHJvamVjdCwgbWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNRVRBTU9ERUxfU09VUkNFX0ZPTERFUl9OQU1FX1BST1BFUlRZLCBvbGQsIG1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUpOworCX0KKworCS8qKgorCSAqIFN5bmNocm9uaXplIHRoZSBtZXRhbW9kZWwgZm9yIDIuMC1jb21wYXRpYmxlIEpQQSBwcm9qZWN0cy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZU1ldGFtb2RlbCgpIHsKKwkJaWYgKHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkpIHsKKwkJCWlmICh0aGlzLm1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUgIT0gbnVsbCkgeworCQkJCXRoaXMubWV0YW1vZGVsU3luY2hyb25pemF0aW9uSm9iLnNjaGVkdWxlKCk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZU1ldGFtb2RlbF8oKSB7CisJCXRoaXMuZ2V0Um9vdENvbnRleHROb2RlKCkuc3luY2hyb25pemVNZXRhbW9kZWwoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZU1ldGFtb2RlbChQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgeworCQl0aGlzLm1ldGFtb2RlbFN5bmNocm9uaXplci5zeW5jaHJvbml6ZShwZXJzaXN0ZW50VHlwZSk7CisJfQorCisJcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGdldE1ldGFtb2RlbFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7CisJCXJldHVybiB0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCh0aGlzLmdldE1ldGFNb2RlbFNvdXJjZUZvbGRlcigpKTsKKwl9CisKKwlwcm90ZWN0ZWQgSUZvbGRlciBnZXRNZXRhTW9kZWxTb3VyY2VGb2xkZXIoKSB7CisJCXJldHVybiB0aGlzLmdldFByb2plY3QoKS5nZXRGb2xkZXIodGhpcy5tZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKTsKKwl9CisKKwkvKioKKwkgKiBJZiB0aGUgbWV0YW1vZGVsIHNvdXJjZSBmb2xkZXIgaXMgbm90IGxvbmdlciBhIEphdmEgcHJvamVjdCBzb3VyY2UKKwkgKiBmb2xkZXIsIGNsZWFyIGl0IG91dC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjaGVja01ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUoKSB7CisJCWlmICh0aGlzLm1ldGFtb2RlbFNvdXJlRm9sZGVyTmFtZUlzSW52YWxpZCgpKSB7CisJCQl0aGlzLnNldE1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUobnVsbCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhbW9kZWxTb3VyZUZvbGRlck5hbWVJc0ludmFsaWQoKSB7CisJCXJldHVybiAhIHRoaXMubWV0YW1vZGVsU291cmVGb2xkZXJOYW1lSXNWYWxpZCgpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIG1ldGFtb2RlbFNvdXJlRm9sZGVyTmFtZUlzVmFsaWQoKSB7CisJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRTb3VyY2VGb2xkZXJOYW1lcygpLCB0aGlzLm1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUpOworCX0KKworCisJLy8gKioqKioqKioqKiBzb3VyY2UgZm9sZGVyIG5hbWVzICoqKioqKioqKioKKworCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvdXJjZUZvbGRlck5hbWVzKCkgeworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuZ2V0U291cmNlRm9sZGVyTmFtZXNfKCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFNvdXJjZUZvbGRlck5hbWVzXygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SVBhY2thZ2VGcmFnbWVudFJvb3QsIFN0cmluZz4odGhpcy5nZXRTb3VyY2VGb2xkZXJzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSVBhY2thZ2VGcmFnbWVudFJvb3QgcGZyKSB7CisJCQkJcmV0dXJuIHBmci5nZXRFbGVtZW50TmFtZSgpOworCQkJfQorCQl9OworCX0KKworCXByb3RlY3RlZCBJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4gZ2V0U291cmNlRm9sZGVycygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPElQYWNrYWdlRnJhZ21lbnRSb290LCBJUGFja2FnZUZyYWdtZW50Um9vdD4oCisJCQkJdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpLAorCQkJCVNPVVJDRV9QQUNLQUdFX0ZSQUdNRU5UX1JPT1RfRklMVEVSCisJCQkpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRmlsdGVyPElQYWNrYWdlRnJhZ21lbnRSb290PiBTT1VSQ0VfUEFDS0FHRV9GUkFHTUVOVF9ST09UX0ZJTFRFUiA9CisJCW5ldyBGaWx0ZXI8SVBhY2thZ2VGcmFnbWVudFJvb3Q+KCkgeworCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KElQYWNrYWdlRnJhZ21lbnRSb290IHBmcikgeworCQkJCXRyeSB7CisJCQkJCXJldHVybiB0aGlzLmFjY2VwdF8ocGZyKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCXByaXZhdGUgYm9vbGVhbiBhY2NlcHRfKElQYWNrYWdlRnJhZ21lbnRSb290IHBmcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCQkJcmV0dXJuIHBmci5leGlzdHMoKSAmJiAocGZyLmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSk7CisJCQl9CisJCX07CisKKwlwcm90ZWN0ZWQgSXRlcmFibGU8SVBhY2thZ2VGcmFnbWVudFJvb3Q+IGdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4odGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhIGV2ZW50cyAqKioqKioqKioqCisKKwkvLyBUT0RPIGhhbmRsZSBjaGFuZ2VzIHRvIGV4dGVybmFsIHByb2plY3RzCisJcHVibGljIHZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJdGhpcy5wcm9jZXNzSmF2YURlbHRhKGV2ZW50LmdldERlbHRhKCkpOworCX0KKworCS8qKgorCSAqIFdlIHJlY3Vyc2UgYmFjayBoZXJlIGZyb20ge0BsaW5rICNwcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oSUphdmFFbGVtZW50RGVsdGEpfS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YURlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7CisJCXN3aXRjaCAoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUwgOgorCQkJCXRoaXMucHJvY2Vzc0phdmFNb2RlbERlbHRhKGRlbHRhKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA6CisJCQkJdGhpcy5wcm9jZXNzSmF2YVByb2plY3REZWx0YShkZWx0YSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgOgorCQkJCXRoaXMucHJvY2Vzc0phdmFQYWNrYWdlRnJhZ21lbnRSb290RGVsdGEoZGVsdGEpOworCQkJCWJyZWFrOworCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCA6CisJCQkJdGhpcy5wcm9jZXNzSmF2YVBhY2thZ2VGcmFnbWVudERlbHRhKGRlbHRhKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgorCQkJCXRoaXMucHJvY2Vzc0phdmFDb21waWxhdGlvblVuaXREZWx0YShkZWx0YSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQlicmVhazsgLy8gaWdub3JlIHRoZSBlbGVtZW50cyBpbnNpZGUgYSBjb21waWxhdGlvbiB1bml0CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKKwkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZCA6IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkgeworCQkJdGhpcy5wcm9jZXNzSmF2YURlbHRhKGNoaWxkKTsgLy8gcmVjdXJzZQorCQl9CisJfQorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBKYXZhIGVsZW1lbnQgZGVsdGEgaXMgZm9yIGEgQ0hBTkdFRAorCSAqIChhcyBvcHBvc2VkIHRvIEFEREVEIG9yIFJFTU9WRUQpIEphdmEgZWxlbWVudCBhbmQgdGhlIHNwZWNpZmllZCBmbGFnIGlzIHNldC4KKwkgKiAoVGhlIGRlbHRhIGZsYWdzIGFyZSBvbmx5IHNpZ25pZmljYW50IGlmIHRoZSBkZWx0YSAia2luZCIgaXMgQ0hBTkdFRC4pCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZGVsdGFGbGFnSXNTZXQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEsIGludCBmbGFnKSB7CisJCXJldHVybiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQpICYmCisJCQkJQml0VG9vbHMuZmxhZ0lzU2V0KGRlbHRhLmdldEZsYWdzKCksIGZsYWcpOworCX0KKworCS8vICoqKioqIG1vZGVsCisJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFNb2RlbERlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7CisJCS8vIHByb2Nlc3MgdGhlIEphdmEgbW9kZWwncyBwcm9qZWN0cworCQl0aGlzLnByb2Nlc3NKYXZhRGVsdGFDaGlsZHJlbihkZWx0YSk7CisJfQorCisJLy8gKioqKiogcHJvamVjdAorCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhUHJvamVjdERlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7CisJCS8vIHByb2Nlc3MgdGhlIEphdmEgcHJvamVjdCdzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMKKwkJdGhpcy5wcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oZGVsdGEpOworCisJCS8vIGEgY2xhc3NwYXRoIGNoYW5nZSBjYW4gaGF2ZSBwcmV0dHkgZmFyLXJlYWNoaW5nIGVmZmVjdHMuLi4KKwkJaWYgKHRoaXMuY2xhc3NwYXRoSGFzQ2hhbmdlZChkZWx0YSkpIHsKKwkJCXRoaXMucmVidWlsZCgoSUphdmFQcm9qZWN0KSBkZWx0YS5nZXRFbGVtZW50KCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhlIHNwZWNpZmllZCBKYXZhIHByb2plY3QncyBjbGFzc3BhdGggY2hhbmdlZC4gUmVidWlsZCB0aGUgSlBBIHByb2plY3QKKwkgKiBhcyBhcHByb3ByaWF0ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZWJ1aWxkKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgeworCQkvLyBpZiB0aGUgY2xhc3NwYXRoIGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHVwZGF0ZSBldmVyeXRoaW5nIHNpbmNlCisJCS8vIGNsYXNzIHJlZmVyZW5jZXMgY291bGQgbm93IGJlIHJlc29sdmVkIChvciBub3QpIGV0Yy4KKwkJaWYgKGphdmFQcm9qZWN0LmVxdWFscyh0aGlzLmdldEphdmFQcm9qZWN0KCkpKSB7CisJCQl0aGlzLnJlbW92ZURlYWRKcGFGaWxlcygpOworCQkJdGhpcy5jaGVja01ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUoKTsKKwkJCXRoaXMudXBkYXRlKHRoaXMuZ2V0SW50ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkpOworCQl9IGVsc2UgeworCQkJLy8gVE9ETyBzZWUgaWYgY2hhbmdlZCBwcm9qZWN0IGlzIG9uIG91ciBjbGFzc3BhdGg/CisJCQl0aGlzLnVwZGF0ZSh0aGlzLmdldEV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIExvb3AgdGhyb3VnaCBhbGwgb3VyIEpQQSBmaWxlcywgcmVtb3ZlIGFueSB0aGF0IGFyZSBubyBsb25nZXIgb24gdGhlCisJICogY2xhc3NwYXRoLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlbW92ZURlYWRKcGFGaWxlcygpIHsKKwkJZm9yIChKcGFGaWxlIGpwYUZpbGUgOiB0aGlzLmdldEpwYUZpbGVzKCkpIHsKKwkJCWlmICggISB0aGlzLmdldEphdmFQcm9qZWN0KCkuaXNPbkNsYXNzcGF0aChqcGFGaWxlLmdldEZpbGUoKSkpIHsKKwkJCQl0aGlzLnJlbW92ZUpwYUZpbGUoanBhRmlsZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBwcmUtY29uZGl0aW9uOiBkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY2xhc3NwYXRoSGFzQ2hhbmdlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgeworCQlyZXR1cm4gdGhpcy5kZWx0YUZsYWdJc1NldChkZWx0YSwgSUphdmFFbGVtZW50RGVsdGEuRl9SRVNPTFZFRF9DTEFTU1BBVEhfQ0hBTkdFRCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlKEl0ZXJhYmxlPEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdD4gamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cykgeworCQlmb3IgKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgOiBqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKSB7CisJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQudXBkYXRlKCk7CisJCX0KKwl9CisKKwkvLyAqKioqKiBwYWNrYWdlIGZyYWdtZW50IHJvb3QKKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YVBhY2thZ2VGcmFnbWVudFJvb3REZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgeworCQkvLyBwcm9jZXNzIHRoZSBKYXZhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCdzIHBhY2thZ2UgZnJhZ21lbnRzCisJCXRoaXMucHJvY2Vzc0phdmFEZWx0YUNoaWxkcmVuKGRlbHRhKTsKKworCQlpZiAodGhpcy5jbGFzc3BhdGhFbnRyeUhhc0JlZW5BZGRlZChkZWx0YSkpIHsKKwkJCS8vIFRPRE8KKwkJfSBlbHNlIGlmICh0aGlzLmNsYXNzcGF0aEVudHJ5SGFzQmVlblJlbW92ZWQoZGVsdGEpKSB7ICAvLyBzaG91bGQgYmUgbXV0dWFsbHktZXhjbHVzaXZlIHcvYWRkZWQgKD8pCisJCQkvLyBUT0RPCisJCX0KKwl9CisKKwkvKioKKwkgKiBwcmUtY29uZGl0aW9uOiBkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY2xhc3NwYXRoRW50cnlIYXNCZWVuQWRkZWQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKKwkJcmV0dXJuIHRoaXMuZGVsdGFGbGFnSXNTZXQoZGVsdGEsIElKYXZhRWxlbWVudERlbHRhLkZfQURERURfVE9fQ0xBU1NQQVRIKTsKKwl9CisKKwkvKioKKwkgKiBwcmUtY29uZGl0aW9uOiBkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY2xhc3NwYXRoRW50cnlIYXNCZWVuUmVtb3ZlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgeworCQlyZXR1cm4gdGhpcy5kZWx0YUZsYWdJc1NldChkZWx0YSwgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKTsKKwl9CisKKwkvLyAqKioqKiBwYWNrYWdlIGZyYWdtZW50CisJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFQYWNrYWdlRnJhZ21lbnREZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgeworCQkvLyBwcm9jZXNzIHRoZSBqYXZhIHBhY2thZ2UgZnJhZ21lbnQncyBjb21waWxhdGlvbiB1bml0cworCQl0aGlzLnByb2Nlc3NKYXZhRGVsdGFDaGlsZHJlbihkZWx0YSk7CisJfQorCisJLy8gKioqKiogY29tcGlsYXRpb24gdW5pdAorCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhQ29tcGlsYXRpb25Vbml0RGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKKwkJaWYgKHRoaXMuamF2YUNvbXBpbGF0aW9uVW5pdERlbHRhSXNSZWxldmFudChkZWx0YSkpIHsKKwkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKElDb21waWxhdGlvblVuaXQpIGRlbHRhLmdldEVsZW1lbnQoKTsKKwkJCWZvciAoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGpyY3UgOiB0aGlzLmdldENvbWJpbmVkSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpKSB7CisJCQkJaWYgKGpyY3UuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZXF1YWxzKGNvbXBpbGF0aW9uVW5pdCkpIHsKKwkJCQkJanJjdS51cGRhdGUoKTsKKwkJCQkJLy8gVE9ETyA/IHRoaXMucmVzb2x2ZUphdmFUeXBlcygpOyAgLy8gbWlnaHQgaGF2ZSBuZXcgbWVtYmVyIHR5cGVzIG5vdy4uLgorCQkJCQlicmVhazsgIC8vIHRoZXJlICpzaG91bGRuJ3QqIGJlIGFueSBtb3JlLi4uCisJCQkJfQorCQkJfQorCQl9CisJCS8vIGlnbm9yZSB0aGUgamF2YSBjb21waWxhdGlvbiB1bml0J3MgY2hpbGRyZW4KKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBqYXZhQ29tcGlsYXRpb25Vbml0RGVsdGFJc1JlbGV2YW50KElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7CisJCS8vIGlnbm9yZSBjaGFuZ2VzIHRvL2Zyb20gcHJpbWFyeSB3b3JraW5nIGNvcHkgLSBubyBjb250ZW50IGhhcyBjaGFuZ2VkOworCQkvLyBhbmQgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBvdGhlciBmbGFncyBzZXQgdGhhdCBpbmRpY2F0ZSAqYm90aCogYQorCQkvLyBjaGFuZ2UgdG8vZnJvbSBwcmltYXJ5IHdvcmtpbmcgY29weSAqYW5kKiBjb250ZW50IGhhcyBjaGFuZ2VkCisJCWlmIChCaXRUb29scy5vbmx5RmxhZ0lzU2V0KGRlbHRhLmdldEZsYWdzKCksIElKYXZhRWxlbWVudERlbHRhLkZfUFJJTUFSWV9XT1JLSU5HX0NPUFkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyBpZ25vcmUgamF2YSBub3RpZmljYXRpb24gZm9yIEFEREVEIG9yIFJFTU9WRUQ7CisJCS8vIHRoZXNlIGFyZSBoYW5kbGVkIHZpYSByZXNvdXJjZSBub3RpZmljYXRpb24KKwkJcmV0dXJuIGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEOworCX0KKworCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKKwkKKwlwdWJsaWMgSXRlcmF0b3I8SU1lc3NhZ2U+IHZhbGlkYXRpb25NZXNzYWdlcyhJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0PElNZXNzYWdlPigpOworCQl0aGlzLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCXJldHVybiBtZXNzYWdlcy5pdGVyYXRvcigpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCWlmIChyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7CisJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMudmFsaWRhdGVDb25uZWN0aW9uKG1lc3NhZ2VzKTsKKwkJdGhpcy5yb290Q29udGV4dE5vZGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbm5lY3Rpb24oTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKKwkJU3RyaW5nIGNwTmFtZSA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKTsKKwkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoY3BOYW1lKSkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX05PX0NPTk5FQ1RJT04sCisJCQkJCXRoaXMKKwkJCQkpCisJCQkpOworCQkJcmV0dXJuOworCQl9CisJCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5kYXRhU291cmNlLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7CisJCWlmIChjcCA9PSBudWxsKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfSU5WQUxJRF9DT05ORUNUSU9OLAorCQkJCQluZXcgU3RyaW5nW10ge2NwTmFtZX0sCisJCQkJCXRoaXMKKwkJCQkpCisJCQkpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChjcC5pc0luYWN0aXZlKCkpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUFJPSkVDVF9JTkFDVElWRV9DT05ORUNUSU9OLAorCQkJCQluZXcgU3RyaW5nW10ge2NwTmFtZX0sCisJCQkJCXRoaXMKKwkJCQkpCisJCQkpOworCQl9CisJfQorCQorCQorCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQl0aGlzLnVwZGF0ZXIuc3RvcCgpOworCQl0aGlzLmRhdGFTb3VyY2UuZGlzcG9zZSgpOworCX0KKworCisJLy8gKioqKioqKioqKiByZXNvdXJjZSBtb2RlbCBsaXN0ZW5lciAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdFJlc291cmNlTW9kZWxMaXN0ZW5lciBpbXBsZW1lbnRzIEpwYVJlc291cmNlTW9kZWxMaXN0ZW5lciB7CisJCXByb3RlY3RlZCBEZWZhdWx0UmVzb3VyY2VNb2RlbExpc3RlbmVyKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCQlwdWJsaWMgdm9pZCByZXNvdXJjZU1vZGVsQ2hhbmdlZCgpIHsKKwkJCUFic3RyYWN0SnBhUHJvamVjdC50aGlzLnVwZGF0ZSgpOworCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIHJlc291cmNlIGV2ZW50cyAqKioqKioqKioqCisKKwkvLyBUT0RPIG5lZWQgdG8gZG8gdGhlIHNhbWUgdGhpbmcgZm9yIGV4dGVybmFsIHByb2plY3RzIGFuZCBjb21waWxhdGlvbiB1bml0cworCXB1YmxpYyB2b2lkIHByb2plY3RDaGFuZ2VkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CisJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmVxdWFscyh0aGlzLmdldFByb2plY3QoKSkpIHsKKwkJCXRoaXMuaW50ZXJuYWxQcm9qZWN0Q2hhbmdlZChkZWx0YSk7CisJCX0gZWxzZSB7CisJCQl0aGlzLmV4dGVybmFsUHJvamVjdENoYW5nZWQoZGVsdGEpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxQcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCQlSZXNvdXJjZURlbHRhVmlzaXRvciByZXNvdXJjZURlbHRhVmlzaXRvciA9IHRoaXMuYnVpbGRJbnRlcm5hbFJlc291cmNlRGVsdGFWaXNpdG9yKCk7CisJCXJlc291cmNlRGVsdGFWaXNpdG9yLnZpc2l0RGVsdGEoZGVsdGEpOworCQkvLyBhdCB0aGlzIHBvaW50LCBpZiB3ZSBoYXZlIGFkZGVkIGFuZC9vciByZW1vdmVkIEpwYUZpbGVzLCBhbiAidXBkYXRlIiB3aWxsIGhhdmUgYmVlbiB0cmlnZ2VyZWQ7CisJCS8vIGFueSBjaGFuZ2VzIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBkdXJpbmcgdGhlICJyZXNvbHZlIiB3aWxsIHRyaWdnZXIgZnVydGhlciAidXBkYXRlcyI7CisJCS8vIHRoZXJlIHNob3VsZCBiZSBubyBuZWVkIHRvICJyZXNvbHZlIiBleHRlcm5hbCBKYXZhIHR5cGVzICh0aGV5IGNhbid0IGhhdmUgcmVmZXJlbmNlcyB0bworCQkvLyB0aGUgaW50ZXJuYWwgSmF2YSB0eXBlcykKKwkJaWYgKHJlc291cmNlRGVsdGFWaXNpdG9yLmVuY291bnRlcmVkU2lnbmlmaWNhbnRDaGFuZ2UoKSkgeworCQkJdGhpcy5yZXNvbHZlSW50ZXJuYWxKYXZhVHlwZXMoKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBSZXNvdXJjZURlbHRhVmlzaXRvciBidWlsZEludGVybmFsUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7CisJCXJldHVybiBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGZpbGVDaGFuZ2VJc1NpZ25pZmljYW50KElGaWxlIGZpbGUsIGludCBkZWx0YUtpbmQpIHsKKwkJCQlyZXR1cm4gQWJzdHJhY3RKcGFQcm9qZWN0LnRoaXMuc3luY2hyb25pemVKcGFGaWxlcyhmaWxlLCBkZWx0YUtpbmQpOworCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIEludGVybmFsIHJlc291cmNlIGRlbHRhIHZpc2l0b3IgY2FsbGJhY2suCisJICogUmV0dXJuIHRydWUgaWYgYSBKcGFGaWxlIHdhcyBlaXRoZXIgYWRkZWQgb3IgcmVtb3ZlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzeW5jaHJvbml6ZUpwYUZpbGVzKElGaWxlIGZpbGUsIGludCBkZWx0YUtpbmQpIHsKKwkJc3dpdGNoIChkZWx0YUtpbmQpIHsKKwkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOgorCQkJCXJldHVybiB0aGlzLmFkZEpwYUZpbGUoZmlsZSk7CisJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgorCQkJCXJldHVybiB0aGlzLnJlbW92ZUpwYUZpbGUoZmlsZSk7CisJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgorCQkJCXJldHVybiB0aGlzLmNoZWNrRm9yQ2hhbmdlZEZpbGVDb250ZW50KGZpbGUpOworCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRF9QSEFOVE9NIDoKKwkJCQlicmVhazsgIC8vIGlnbm9yZQorCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEX1BIQU5UT00gOgorCQkJCWJyZWFrOyAgLy8gaWdub3JlCisJCQlkZWZhdWx0IDoKKwkJCQlicmVhazsgIC8vIG9ubHkgd29ycmllZCBhYm91dCBhZGRlZC9yZW1vdmVkL2NoYW5nZWQgZmlsZXMKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0ZvckNoYW5nZWRGaWxlQ29udGVudChJRmlsZSBmaWxlKSB7CisJCUpwYUZpbGUganBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZShmaWxlKTsKKwkJaWYgKGpwYUZpbGUgPT0gbnVsbCkgeworCQkJLy8gdGhlIGZpbGUgbWlnaHQgaGF2ZSBjaGFuZ2VkIGl0cyBjb250ZW50IHRvIHNvbWV0aGluZyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluCisJCQlyZXR1cm4gdGhpcy5hZGRKcGFGaWxlKGZpbGUpOworCQl9CisKKwkJaWYgKGpwYUZpbGUuZ2V0Q29udGVudFR5cGUoKS5lcXVhbHMoUGxhdGZvcm1Ub29scy5nZXRDb250ZW50VHlwZShmaWxlKSkpIHsKKwkJCS8vIGNvbnRlbnQgaGFzIG5vdCBjaGFuZ2VkIC0gaWdub3JlCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQkvLyB0aGUgY29udGVudCB0eXBlIGNoYW5nZWQsIHdlIG5lZWQgdG8gYnVpbGQgYSBuZXcgSlBBIGZpbGUKKwkJLy8gKGUuZy4gdGhlIHNjaGVtYSBvZiBhbiBvcm0ueG1sIGZpbGUgY2hhbmdlZCBmcm9tIEpQQSB0byBFY2xpcHNlTGluaykKKwkJdGhpcy5yZW1vdmVKcGFGaWxlKGpwYUZpbGUpOworCQl0aGlzLmFkZEpwYUZpbGUoZmlsZSk7CisJCXJldHVybiB0cnVlOyAgLy8gYXQgdGhlIGxlYXN0LCB3ZSBoYXZlIHJlbW92ZWQgYSBKUEEgZmlsZQorCX0KKworCXByb3RlY3RlZCB2b2lkIHJlc29sdmVJbnRlcm5hbEphdmFUeXBlcygpIHsKKwkJZm9yIChKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQganJjdSA6IHRoaXMuZ2V0SW50ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkpIHsKKwkJCWpyY3UucmVzb2x2ZVR5cGVzKCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBleHRlcm5hbFByb2plY3RDaGFuZ2VkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CisJCWlmICh0aGlzLmdldEphdmFQcm9qZWN0KCkuaXNPbkNsYXNzcGF0aChkZWx0YS5nZXRSZXNvdXJjZSgpKSkgeworCQkJUmVzb3VyY2VEZWx0YVZpc2l0b3IgcmVzb3VyY2VEZWx0YVZpc2l0b3IgPSB0aGlzLmJ1aWxkRXh0ZXJuYWxSZXNvdXJjZURlbHRhVmlzaXRvcigpOworCQkJcmVzb3VyY2VEZWx0YVZpc2l0b3IudmlzaXREZWx0YShkZWx0YSk7CisJCQkvLyBmb3JjZSBhbiAidXBkYXRlIiBoZXJlIHNpbmNlIGFkZGluZyBhbmQvb3IgcmVtb3ZpbmcgYW4gZXh0ZXJuYWwgSmF2YSB0eXBlCisJCQkvLyB3aWxsIG9ubHkgdHJpZ2dlciBhbiAidXBkYXRlIiBpZiB0aGUgInJlc29sdmUiIGNhdXNlcyBzb21ldGhpbmcgaW4gdGhlIHJlc291cmNlIG1vZGVsIHRvIGNoYW5nZQorCQkJaWYgKHJlc291cmNlRGVsdGFWaXNpdG9yLmVuY291bnRlcmVkU2lnbmlmaWNhbnRDaGFuZ2UoKSkgeworCQkJCXRoaXMudXBkYXRlKCk7CisJCQkJdGhpcy5yZXNvbHZlRXh0ZXJuYWxKYXZhVHlwZXMoKTsKKwkJCQl0aGlzLnJlc29sdmVJbnRlcm5hbEphdmFUeXBlcygpOworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIFJlc291cmNlRGVsdGFWaXNpdG9yIGJ1aWxkRXh0ZXJuYWxSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKKwkJcmV0dXJuIG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gZmlsZUNoYW5nZUlzU2lnbmlmaWNhbnQoSUZpbGUgZmlsZSwgaW50IGRlbHRhS2luZCkgeworCQkJCXJldHVybiBBYnN0cmFjdEpwYVByb2plY3QudGhpcy5zeW5jaHJvbml6ZUV4dGVybmFsRmlsZXMoZmlsZSwgZGVsdGFLaW5kKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBleHRlcm5hbCByZXNvdXJjZSBkZWx0YSB2aXNpdG9yIGNhbGxiYWNrCisJICogUmV0dXJuIHRydWUgaWYgYW4gImV4dGVybmFsIiBKYXZhIHJlc291cmNlIGNvbXBpbGF0aW9uIHVuaXQKKwkgKiB3YXMgYWRkZWQgb3IgcmVtb3ZlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzeW5jaHJvbml6ZUV4dGVybmFsRmlsZXMoSUZpbGUgZmlsZSwgaW50IGRlbHRhS2luZCkgeworCQlzd2l0Y2ggKGRlbHRhS2luZCkgeworCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6CisJCQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxGaWxlQWRkZWQoZmlsZSk7CisJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgorCQkJCXJldHVybiB0aGlzLmV4dGVybmFsRmlsZVJlbW92ZWQoZmlsZSk7CisJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgorCQkJCWJyZWFrOyAgLy8gaWdub3JlCisJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEX1BIQU5UT00gOgorCQkJCWJyZWFrOyAgLy8gaWdub3JlCisJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRURfUEhBTlRPTSA6CisJCQkJYnJlYWs7ICAvLyBpZ25vcmUKKwkJCWRlZmF1bHQgOgorCQkJCWJyZWFrOyAgLy8gb25seSB3b3JyaWVkIGFib3V0IGFkZGVkL3JlbW92ZWQvY2hhbmdlZCBmaWxlcworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGV4dGVybmFsRmlsZUFkZGVkKElGaWxlIGZpbGUpIHsKKwkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm1Ub29scy5nZXRDb250ZW50VHlwZShmaWxlKTsKKwkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gZXh0ZXJuYWxGaWxlUmVtb3ZlZChJRmlsZSBmaWxlKSB7CisJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtVG9vbHMuZ2V0Q29udGVudFR5cGUoZmlsZSk7CisJCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSkpIHsKKwkJCXJldHVybiB0aGlzLnJlbW92ZUV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KGZpbGUpOworCQl9CisJCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KQVJfQ09OVEVOVF9UWVBFKSkgeworCQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlLnJlbW92ZVBlcnNpc3RlbnRUeXBlcyhmaWxlKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZUV4dGVybmFsSmF2YVR5cGVzKCkgeworCQlmb3IgKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1IDogdGhpcy5nZXRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSkgeworCQkJanJjdS5yZXNvbHZlVHlwZXMoKTsKKwkJfQorCX0KKworCS8vICoqKioqIHJlc291cmNlIGRlbHRhIHZpc2l0b3JzCisJLyoqCisJICogYWRkIG9yIHJlbW92ZSBhIEpQQSBmaWxlIGZvciBldmVyeSBbYXBwcm9wcmlhdGVdIGZpbGUgZW5jb3VudGVyZWQgYnkgdGhlIHZpc2l0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgeworCQlwcm90ZWN0ZWQgYm9vbGVhbiBlbmNvdW50ZXJlZFNpZ25pZmljYW50Q2hhbmdlID0gZmFsc2U7CisJCQorCQlwcm90ZWN0ZWQgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7CisJCQlzdXBlcigpOworCQl9CisKKwkJcHJvdGVjdGVkIHZvaWQgdmlzaXREZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCQkJdHJ5IHsKKwkJCQlkZWx0YS5hY2NlcHQodGhpcyk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7CisJCQkJLy8gc2hvdWxkbid0IGhhcHBlbiAtIHdlIGRvbid0IHRocm93IGFueSBDb3JlRXhjZXB0aW9ucworCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CisJCQlJUmVzb3VyY2UgcmVzID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKKwkJCXN3aXRjaCAocmVzLmdldFR5cGUoKSkgeworCQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgorCQkJCQlyZXR1cm4gdHJ1ZTsgIC8vIHZpc2l0IGNoaWxkcmVuCisJCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6CisJCQkJCXJldHVybiB0cnVlOyAgLy8gdmlzaXQgY2hpbGRyZW4KKwkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgorCQkJCQlyZXR1cm4gdHJ1ZTsgIC8vIHZpc2l0IGNoaWxkcmVuCisJCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6CisJCQkJCXRoaXMuZmlsZUNoYW5nZWQoKElGaWxlKSByZXMsIGRlbHRhLmdldEtpbmQoKSk7CisJCQkJCXJldHVybiBmYWxzZTsgIC8vIG5vIGNoaWxkcmVuCisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiBmYWxzZTsgIC8vIG5vIGNoaWxkcmVuIChwcm9iYWJseSBzaG91bGRuJ3QgZ2V0IGhlcmUuLi4pCisJCQl9CisJCX0KKworCQlwcm90ZWN0ZWQgdm9pZCBmaWxlQ2hhbmdlZChJRmlsZSBmaWxlLCBpbnQgZGVsdGFLaW5kKSB7CisJCQlpZiAodGhpcy5maWxlQ2hhbmdlSXNTaWduaWZpY2FudChmaWxlLCBkZWx0YUtpbmQpKSB7CisJCQkJdGhpcy5lbmNvdW50ZXJlZFNpZ25pZmljYW50Q2hhbmdlID0gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGZpbGVDaGFuZ2VJc1NpZ25pZmljYW50KElGaWxlIGZpbGUsIGludCBkZWx0YUtpbmQpOworCisJCS8qKgorCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdmlzaXRvciBlbmNvdW50ZXJlZCBzb21lIHNvcnQgb2YgInNpZ25pZmljYW50IgorCQkgKiBjaGFuZ2Ugd2hpbGUgdHJhdmVyc2luZyB0aGUgSVJlc291cmNlRGVsdGEKKwkJICogKGUuZy4gYSBKUEEgZmlsZSB3YXMgYWRkZWQgb3IgcmVtb3ZlZCkuCisJCSAqLworCQlwcm90ZWN0ZWQgYm9vbGVhbiBlbmNvdW50ZXJlZFNpZ25pZmljYW50Q2hhbmdlKCkgeworCQkJcmV0dXJuIHRoaXMuZW5jb3VudGVyZWRTaWduaWZpY2FudENoYW5nZTsKKwkJfQorCisJfQorCisKKwkvLyAqKioqKioqKioqIHN1cHBvcnQgZm9yIG1vZGlmeWluZyBkb2N1bWVudHMgc2hhcmVkIHdpdGggdGhlIFVJICoqKioqKioqKioKKworCXB1YmxpYyB2b2lkIHNldFRocmVhZExvY2FsTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcikgeworCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLnNldChjb21tYW5kRXhlY3V0b3IpOworCX0KKworCXB1YmxpYyBDb21tYW5kRXhlY3V0b3IgZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKSB7CisJCXJldHVybiB0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yOworCX0KKworCisJLy8gKioqKioqKioqKiBwcm9qZWN0ICJ1cGRhdGUiICoqKioqKioqKioKKworCXB1YmxpYyBVcGRhdGVyIGdldFVwZGF0ZXIoKSB7CisJCXJldHVybiB0aGlzLnVwZGF0ZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXBkYXRlcihVcGRhdGVyIHVwZGF0ZXIpIHsKKwkJaWYgKHVwZGF0ZXIgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy51cGRhdGVyLnN0b3AoKTsKKwkJdGhpcy5zZXRVcGRhdGVyXyh1cGRhdGVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcGRhdGVyXyhVcGRhdGVyIHVwZGF0ZXIpIHsKKwkJdGhpcy51cGRhdGVyID0gdXBkYXRlcjsKKwkJdGhpcy51cGRhdGVyLnN0YXJ0KCk7CisJfQorCisJLyoqCisJICogRGVsZWdhdGUgdG8gdGhlIHVwZGF0ZXIgc28gY2xpZW50cyBjYW4gY29uZmlndXJlIGhvdyB1cGRhdGVzIG9jY3VyLgorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJdGhpcy51cGRhdGVyLnVwZGF0ZSgpOworCX0KKworCS8qKgorCSAqIENhbGxlZCBieSB0aGUgdXBkYXRlci4KKwkgKi8KKwlwdWJsaWMgSVN0YXR1cyB1cGRhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXRoaXMudXBkYXRlXyhtb25pdG9yKTsKKwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlXyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJdGhpcy5yb290Q29udGV4dE5vZGUudXBkYXRlKG1vbml0b3IpOworCQl0aGlzLnJvb3RDb250ZXh0Tm9kZS5wb3N0VXBkYXRlKCk7CisJfQorCisJLyoqCisJICogQWxzbyBjYWxsZWQgYnkgdGhlIHVwZGF0ZXIuCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlUXVpZXNjZWQoKSB7CisJCXRoaXMuc3luY2hyb25pemVNZXRhbW9kZWwoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9BYnN0cmFjdFJlc291cmNlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9BYnN0cmFjdFJlc291cmNlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2NzQ1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RSZXNvdXJjZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXNvdXJjZU1vZGVsCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBSZXNvdXJjZU1vZGVsCi17Ci0JcHJvdGVjdGVkIGZpbmFsIElGaWxlIGZpbGU7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RSZXNvdXJjZU1vZGVsKElGaWxlIGZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmZpbGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0Fic3RyYWN0U3luY2hyb25pemVySnBhUHJvamVjdFVwZGF0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9BYnN0cmFjdFN5bmNocm9uaXplckpwYVByb2plY3RVcGRhdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyYWY2OQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9BYnN0cmFjdFN5bmNocm9uaXplckpwYVByb2plY3RVcGRhdGVyLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9uaXplcjsKKworLyoqCisgKiBBZGFwdCB0aGUgImNhbGxiYWNrIHN5bmNocm9uaXplciIgaW50ZXJmYWNlIHRvIHRoZSBKUEEgcHJvamVjdCAidXBkYXRlciIKKyAqIGludGVyZmFjZS4KKyAqIDxwPgorICogU3ViY2xhc3NlcyBhcmUgdG8gYnVpbGQgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrIHN5bmNocm9uaXplci4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3luY2hyb25pemVySnBhUHJvamVjdFVwZGF0ZXIKKwlpbXBsZW1lbnRzIEpwYVByb2plY3QuVXBkYXRlcgoreworCXByb3RlY3RlZCBmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7CisJcHJvdGVjdGVkIGZpbmFsIENhbGxiYWNrU3luY2hyb25pemVyIHN5bmNocm9uaXplcjsKKworCisJcHJvdGVjdGVkIEFic3RyYWN0U3luY2hyb25pemVySnBhUHJvamVjdFVwZGF0ZXIoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7CisJCXN1cGVyKCk7CisJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7CisJCXRoaXMuc3luY2hyb25pemVyID0gdGhpcy5idWlsZFN5bmNocm9uaXplcigpOworCQl0aGlzLnN5bmNocm9uaXplci5hZGRMaXN0ZW5lcih0aGlzLmJ1aWxkQ2FsbGJhY2tTeW5jaHJvbml6ZXJMaXN0ZW5lcigpKTsKKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgQ2FsbGJhY2tTeW5jaHJvbml6ZXIgYnVpbGRTeW5jaHJvbml6ZXIoKTsKKworCXByb3RlY3RlZCBDYWxsYmFja1N5bmNocm9uaXplci5MaXN0ZW5lciBidWlsZENhbGxiYWNrU3luY2hyb25pemVyTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgQ2FsbGJhY2tTeW5jaHJvbml6ZXIuTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6YXRpb25RdWllc2NlZChDYWxsYmFja1N5bmNocm9uaXplciBzKSB7CisJCQkJQWJzdHJhY3RTeW5jaHJvbml6ZXJKcGFQcm9qZWN0VXBkYXRlci50aGlzLmpwYVByb2plY3QudXBkYXRlUXVpZXNjZWQoKTsKKwkJCX0KKwkJfTsKKwl9CisKKworCS8vICoqKioqKioqKiogSnBhUHJvamVjdC5VcGRhdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyB2b2lkIHN0YXJ0KCkgeworCQl0aGlzLnN5bmNocm9uaXplci5zdGFydCgpOworCX0KKworCS8vIHJlY3Vyc2lvbjogd2UgY29tZSBiYWNrIGhlcmUgaWYgSUpwYVByb2plY3QjdXBkYXRlKCkgaXMgY2FsbGVkIGFnYWluLCBkdXJpbmcgdGhlICJ1cGRhdGUiCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl0aGlzLnN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHN0b3AoKSB7CisJCXRoaXMuc3luY2hyb25pemVyLnN0b3AoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnN5bmNocm9uaXplcik7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvQXN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9Bc3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlci5qYXZhCmluZGV4IGFhMWY1YzguLmEwZjY3YTEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9Bc3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9Bc3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTExLDEwNiArMTEsNTEgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LkNhbGxiYWNrSm9iU3luY2hyb25pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuSm9iQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzLkNhbGxiYWNrU3luY2hyb25pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CiAKIC8qKgotICogVGhpcyB1cGRhdGVyIHdpbGwgInVwZGF0ZSIgdGhlIHByb2plY3QgaW4gYSBqb2IgdGhhdCBleGVjdXRlcyBpbiBhIHNlcGFyYXRlCi0gKiB0aHJlYWQgYW5kIGFsbG93cyBjYWxscyB0byAjdXBkYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5LgorICogQWRhcHQgdGhlICJjYWxsYmFjayBzeW5jaHJvbml6ZXIiIGludGVyZmFjZSB0byB0aGUgSlBBIHByb2plY3QgInVwZGF0ZXIiCisgKiBpbnRlcmZhY2UuCisgKiA8cD4KKyAqIFRoaXMgdXBkYXRlciB3aWxsICJ1cGRhdGUiIHRoZSBKUEEgcHJvamVjdCBpbiBhbiBFY2xpcHNlIGpvYiB0aGF0IGV4ZWN1dGVzCisgKiBpbiBhIHNlcGFyYXRlIHRocmVhZCBhbGxvd2luZyBjYWxscyB0byB7QGxpbmsgSnBhUHJvamVjdC5VcGRhdGVyI3VwZGF0ZSgpfQorICogdG8gcmV0dXJuIGltbWVkaWF0ZWx5LgogICovCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIgaW1wbGVtZW50cyBKcGFQcm9qZWN0LlVwZGF0ZXIgewotCXByb3RlY3RlZCBmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0JcHJvdGVjdGVkIGZpbmFsIFVwZGF0ZUpvYiBqb2I7Ci0KK3B1YmxpYyBjbGFzcyBBc3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlcgorCWV4dGVuZHMgQWJzdHJhY3RTeW5jaHJvbml6ZXJKcGFQcm9qZWN0VXBkYXRlcgorewogCXB1YmxpYyBBc3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlcihKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5qb2IgPSB0aGlzLmJ1aWxkSm9iKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFVwZGF0ZUpvYiBidWlsZEpvYigpIHsKLQkJcmV0dXJuIG5ldyBVcGRhdGVKb2IoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvdyB0aGUgam9iIHRvIGJlIHNjaGVkdWxlZCBhbmQgZXhlY3V0ZSBhbiAidXBkYXRlIi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJdGhpcy5qb2Iuc3RhcnQoKTsKLQkJdGhpcy51cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBMZXQgdGhlIGpvYiBydW4gdG8gY29tcGxldGlvbiAoaS5lLiBkbyBub3QgY2FuY2VsIGl0KS4KLQkgKiBUaGlzIHNob3VsZCByZWR1Y2UgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgam9iIGlzIHJlLXNjaGVkdWxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXRoaXMuam9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5qb2IuZGlzcG9zZSgpOworCQlzdXBlcihqcGFQcm9qZWN0KTsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmpwYVByb2plY3QpOworCXByb3RlY3RlZCBDYWxsYmFja1N5bmNocm9uaXplciBidWlsZFN5bmNocm9uaXplcigpIHsKKwkJcmV0dXJuIG5ldyBDYWxsYmFja0pvYlN5bmNocm9uaXplcigKKwkJCQl0aGlzLmJ1aWxkSm9iTmFtZSgpLAorCQkJCXRoaXMuYnVpbGRKb2JDb21tYW5kKCksCisJCQkJdGhpcy5idWlsZEpvYlNjaGVkdWxpbmdSdWxlKCkKKwkJCSk7CiAJfQogCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZEpvYk5hbWUoKSB7CisJCXJldHVybiBOTFMuYmluZChKcHRDb3JlTWVzc2FnZXMuVVBEQVRFX0pPQl9OQU1FLCB0aGlzLmpwYVByb2plY3QuZ2V0TmFtZSgpKTsKKwl9CiAKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBqb2IgdGhhdCBnZXRzIHNjaGVkdWxlZCBieSB0aGUgYXN5bmNocm9ub3VzIHVwZGF0ZXIuCi0JICogV2hlbiB0aGUgam9iIGlzIHJ1biBpdCB0ZWxscyB0aGUgSlBBIHByb2plY3QgdG8gInVwZGF0ZSIuCi0JICogT25seSBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGlzIGpvYiBwZXIgcHJvamVjdCBjYW4gcnVuIGF0IGEgdGltZS4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgVXBkYXRlSm9iIGV4dGVuZHMgSm9iIHsKLQkJLyoqCi0JCSAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB0byBmYWxzZSwgdGhlIGpvYiBkb2VzIG5vdCBzdG9wIGltbWVkaWF0ZWx5OwotCQkgKiBidXQgaXQgY2Fubm90IGJlIHNjaGVkdWxlZCB0byBydW4gYWdhaW4uCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTY2hlZHVsZTsKLQotCQlwcm90ZWN0ZWQgVXBkYXRlSm9iKCkgewotCQkJc3VwZXIoIlVwZGF0ZSBKUEEgcHJvamVjdDogIiArIEFzeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyLnRoaXMuanBhUHJvamVjdC5nZXROYW1lKCkpOyAgLy8gVE9ETyBpMThuCi0JCQl0aGlzLnNob3VsZFNjaGVkdWxlID0gZmFsc2U7Ci0JCQl0aGlzLnNldFJ1bGUoQXN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIudGhpcy5qcGFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJcmV0dXJuIEFzeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyLnRoaXMuanBhUHJvamVjdC51cGRhdGUobW9uaXRvcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkU2NoZWR1bGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zaG91bGRTY2hlZHVsZTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHN0YXJ0KCkgewotCQkJaWYgKHRoaXMuc2hvdWxkU2NoZWR1bGUpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgVXBkYXRlciB3YXMgbm90IHN0b3BwZWQuIik7CisJcHJvdGVjdGVkIEpvYkNvbW1hbmQgYnVpbGRKb2JDb21tYW5kKCkgeworCQlyZXR1cm4gbmV3IEpvYkNvbW1hbmQoKSB7CisJCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJCXJldHVybiBBc3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlci50aGlzLmpwYVByb2plY3QudXBkYXRlKG1vbml0b3IpOwogCQkJfQotCQkJdGhpcy5zaG91bGRTY2hlZHVsZSA9IHRydWU7Ci0JCX0KKwkJfTsKKwl9CiAKLQkJLyoqCi0JCSAqIFByZXZlbnQgdGhlIGpvYiBmcm9tIHJ1bm5pbmcgYWdhaW4gYW5kIHdhaXQgZm9yIHRoZSBjdXJyZW50Ci0JCSAqIGV4ZWN1dGlvbiwgaWYgdGhlcmUgaXMgYW55LCB0byBlbmQgYmVmb3JlIHJldHVybmluZy4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkvLyB0aGlzIHdpbGwgcHJldmVudCB0aGUgam9iIGZyb20gYmVpbmcgc2NoZWR1bGVkIHRvIHJ1biBhZ2FpbgotCQkJdGhpcy5zaG91bGRTY2hlZHVsZSA9IGZhbHNlOwotCQkJLy8gdGhpcyB3aWxsIGNhbmNlbCB0aGUgam9iIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gc2NoZWR1bGVkLCBidXQgaXMgY3VycmVudGx5IFdBSVRJTkcKLQkJCXRoaXMuY2FuY2VsKCk7Ci0JCQl0cnkgewotCQkJCS8vIGlmIHRoZSBqb2IgaXMgY3VycmVudGx5IFJVTk5JTkcsIHdhaXQgdW50aWwgaXQgaXMgZG9uZSBiZWZvcmUgcmV0dXJuaW5nCi0JCQkJdGhpcy5qb2luKCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHRoZSBqb2IgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIC0gaWdub3JlCi0JCQl9Ci0JCX0KLQorCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgYnVpbGRKb2JTY2hlZHVsaW5nUnVsZSgpIHsKKwkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXRQcm9qZWN0KCk7CiAJfQogCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0VudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0VudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2MjIxMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9HZW5lcmljRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CisKKy8qKgorICogU2luZ2xldG9uIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSBkYiBvYmplY3QgcGFzc2VkIGluLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgR2VuZXJpY0VudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyCisJaW1wbGVtZW50cyBFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcgoreworCXB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgSU5TVEFOQ0UKKwkJCQk9IG5ldyBHZW5lcmljRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKTsKKworCXB1YmxpYyBzdGF0aWMgRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCisJcHJpdmF0ZSBHZW5lcmljRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFN0cmluZyBidWlsZFRhYmxlQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGVudGl0eU5hbWUsIFRhYmxlIHRhYmxlKSB7CisJCXJldHVybiB0YWJsZS5nZXRJZGVudGlmaWVyKGVudGl0eU5hbWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgQ29sdW1uIGNvbHVtbikgeworCQlyZXR1cm4gY29sdW1uLmdldElkZW50aWZpZXIoYXR0cmlidXRlTmFtZSk7CisJfQorCisJcHVibGljIFN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7CisJCXJldHVybiBmb3JlaWduS2V5LmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcihhdHRyaWJ1dGVOYW1lKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKENvbHVtbiBjb2x1bW4pIHsKKwkJcmV0dXJuIGNvbHVtbi5nZXRJZGVudGlmaWVyKCk7CisJfQorCisJcHVibGljIFN0cmluZyBidWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKFRhYmxlIHRhYmxlKSB7CisJCXJldHVybiB0YWJsZS5nZXRJZGVudGlmaWVyKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZDE3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLklkQ2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Mb2JBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlc0Fubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcgorCWV4dGVuZHMgQWJzdHJhY3RKcGFBbm5vdGF0aW9uRGVmaW50aW9uUHJvdmlkZXIKK3sJCisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBJTlNUQU5DRSA9IAorCQkJbmV3IEdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByb3RlY3RlZCBHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkVHlwZUFubm90YXRpb25EZWZpbml0aW9uc1RvKExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7CisJCWRlZmluaXRpb25zLmFkZChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChFbWJlZGRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChFbnRpdHlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKElkQ2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEluaGVyaXRhbmNlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChOYW1lZFF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKFRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChUYWJsZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9uc1RvKExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7CisJCWRlZmluaXRpb25zLmFkZChFbWJlZGRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChFbnRpdHlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zVG8oTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKKwkJZGVmaW5pdGlvbnMuYWRkKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChCYXNpY0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChFbWJlZGRlZEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRW51bWVyYXRlZEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKElkQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSm9pblRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChMb2JBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE1hbnlUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE1hbnlUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoTWFwS2V5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPbmVUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcmRlckJ5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKFRlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChUcmFuc2llbnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKFZlcnNpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDBiNGJmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhQW5ub3RhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7CisKKy8qKgorICogRGVsZWdhdGUgdG8gYW5ub3RhdGlvbiBkZWZpbml0aW9uIHByb3ZpZGVycy4KKyAqIFRoZSBwbGF0Zm9ybSBmYWN0b3J5IHdpbGwgYnVpbGQgYW4gaW5zdGFuY2Ugb2YgdGhpcyBhbm5vdGF0aW9uIHByb3ZpZGVyLAorICogcGFzc2luZyBpbiB0aGUgYXBwcm9wcmlhdGUgYXJyYXkgb2YgYW5ub3RhdGlvbiBkZWZpbml0aW9uIHByb3ZpZGVycyBuZWNlc3NhcnkKKyAqIHRvIGJ1aWxkIHRoZSBhbm5vdGF0aW9ucyBmb3IgdGhlIHBsYXRmb3JtICh2ZW5kb3IgYW5kL29yIHZlcnNpb24pLgorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcgorCWltcGxlbWVudHMgSnBhQW5ub3RhdGlvblByb3ZpZGVyCit7CisJcHJpdmF0ZSBmaW5hbCBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyW10gYW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcnM7CisJCisJcHVibGljIEdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIoSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci4uLiBhbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVycykgeworCQlzdXBlcigpOworCQl0aGlzLmFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXJzID0gYW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcnM7CisJfQorCQorCQorCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCQorCXByb3RlY3RlZCBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBhbm5vdGF0aW9uTmFtZXMoCisJCQlJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbiwgU3RyaW5nPihhbm5vdGF0aW9uRGVmaW5pdGlvbnMpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24pIHsKKwkJCQlyZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbigKKwkJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSwgSXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25EZWZpbml0aW9ucykgeworCQl3aGlsZSAoYW5ub3RhdGlvbkRlZmluaXRpb25zLmhhc05leHQoKSkgeworCQkJQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSBhbm5vdGF0aW9uRGVmaW5pdGlvbnMubmV4dCgpOworCQkJaWYgKGFubm90YXRpb25EZWZpbml0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKGFubm90YXRpb25OYW1lKSkgeworCQkJCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBhbm5vdGF0aW9uIGRlZmluaXRpb24gcHJvdmlkZXJzICoqKioqKioqKioKKworCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8SnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcj4gYW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcnMoKSB7CisJCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8SnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcj4odGhpcy5hbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVycyk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHR5cGUgYW5ub3RhdGlvbnMgKioqKioqKioqKgorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IHR5cGVBbm5vdGF0aW9uTmFtZXMoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPigKKwkJCQlhbm5vdGF0aW9uTmFtZXModHlwZUFubm90YXRpb25EZWZpbml0aW9ucygpKSk7CisJfQorCQorCXByb3RlY3RlZCBJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gdHlwZUFubm90YXRpb25EZWZpbml0aW9ucygpIHsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gKCAKKwkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIsIEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPj4oCisJCQkJCXRoaXMuYW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcnMoKSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gdHJhbnNmb3JtKAorCQkJCQkJSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBhbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyKSB7CisJCQkJCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLnR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKKwkJCQl9CisJCQl9KTsKKwl9CisJCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gdHlwZU1hcHBpbmdBbm5vdGF0aW9uTmFtZXMoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPigKKwkJCQlhbm5vdGF0aW9uTmFtZXModHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSkpOworCX0KKwkKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24+IHR5cGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgeworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiAoIAorCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8SnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciwgSXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24+PigKKwkJCQkJdGhpcy5hbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVycygpKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiB0cmFuc2Zvcm0oCisJCQkJCQlKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIGFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIpIHsKKwkJCQkJcmV0dXJuIGFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIudHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKKwkJCQl9CisJCQl9KTsKKwl9CisJCisJcHVibGljIEFubm90YXRpb24gYnVpbGRUeXBlQW5ub3RhdGlvbigKKwkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0VHlwZUFubm90YXRpb25EZWZpbml0aW9uKGFubm90YXRpb25OYW1lKS5idWlsZEFubm90YXRpb24ocGFyZW50LCB0eXBlKTsKKwl9CisJCisJcHVibGljIEFubm90YXRpb24gYnVpbGRUeXBlQW5ub3RhdGlvbigKKwkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gdGhpcy5nZXRUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24oamR0QW5ub3RhdGlvbi5nZXRFbGVtZW50TmFtZSgpKS4KKwkJCQlidWlsZEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisJCisJcHJvdGVjdGVkIEFubm90YXRpb25EZWZpbml0aW9uIGdldFR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSAKKwkJCQlnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbihhbm5vdGF0aW9uTmFtZSwgdGhpcy50eXBlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkpOworCQlpZiAoYW5ub3RhdGlvbkRlZmluaXRpb24gPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5zdXBwb3J0ZWQgdHlwZSBhbm5vdGF0aW9uOiAiICsgYW5ub3RhdGlvbk5hbWUpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIGFubm90YXRpb25EZWZpbml0aW9uOworCX0KKwkKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxUeXBlQW5ub3RhdGlvbigKKwkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7CisJCXJldHVybiB0aGlzLmdldFR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbihhbm5vdGF0aW9uTmFtZSkuYnVpbGROdWxsQW5ub3RhdGlvbihwYXJlbnQpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIGF0dHJpYnV0ZSBhbm5vdGF0aW9ucyAqKioqKioqKioqCisJCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlQW5ub3RhdGlvbk5hbWVzKCkgeworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4oCisJCQkJYW5ub3RhdGlvbk5hbWVzKGF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9ucygpKSk7CisJfQorCQorCXByb3RlY3RlZCBJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgeworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiAoIAorCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8SnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciwgSXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24+PigKKwkJCQkJdGhpcy5hbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVycygpKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiB0cmFuc2Zvcm0oCisJCQkJCQlKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIGFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIpIHsKKwkJCQkJcmV0dXJuIGFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zKCk7CisJCQkJfQorCQkJfSk7CisJfQorCQorCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQXR0cmlidXRlQW5ub3RhdGlvbigKKwkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb24oYW5ub3RhdGlvbk5hbWUpLmJ1aWxkQW5ub3RhdGlvbihwYXJlbnQsIGF0dHJpYnV0ZSk7CisJfQorCQorCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQXR0cmlidXRlQW5ub3RhdGlvbigKKwkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uKGpkdEFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKSkuCisJCQkJYnVpbGRBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCQorCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEF0dHJpYnV0ZUFubm90YXRpb24oCisJCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7CisJCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uKGFubm90YXRpb25OYW1lKS5idWlsZE51bGxBbm5vdGF0aW9uKHBhcmVudCk7CisJfQorCQorCXByb3RlY3RlZCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBnZXRBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSAKKwkJCQlnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbihhbm5vdGF0aW9uTmFtZSwgdGhpcy5hdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSk7CisJCWlmIChhbm5vdGF0aW9uRGVmaW5pdGlvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bnN1cHBvcnRlZCBhdHRyaWJ1dGUgYW5ub3RhdGlvbjogIiArIGFubm90YXRpb25OYW1lKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbjsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYURhdGFTb3VyY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9HZW5lcmljSnBhRGF0YVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2FhNTQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9HZW5lcmljSnBhRGF0YVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFEYXRhU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuSnB0RGJQbHVnaW47Ci0KLS8qKgotICogR2VuZXJpY0pwYURhdGFTb3VyY2UKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKcGFEYXRhU291cmNlCi0JZXh0ZW5kcyBBYnN0cmFjdEpwYU5vZGUKLQlpbXBsZW1lbnRzIEpwYURhdGFTb3VyY2UKLXsKLQkvKioKLQkgKiBjYWNoZSB0aGUgY29ubmVjdGlvbiBwcm9maWxlIG5hbWUgc28gd2UgY2FuIGRldGVjdCB3aGVuCi0JICogaXQgY2hhbmdlcyBhbmQgbm90aWZ5IGxpc3RlbmVycwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lOwotCi0JLyoqCi0JICogdGhpcyBzaG91bGQgbmV2ZXIgYmUgbnVsbDsgaWYgd2UgZG8gbm90IGhhdmUgYSBjb25uZWN0aW9uLCB0aGlzIHdpbGwgYmUKLQkgKiBhICJudWxsIiBjb25uZWN0aW9uIHByb2ZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgdHJhbnNpZW50IENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlOwotCi0JLyoqCi0JICogbGlzdGVuIGZvciB0aGUgY29ubmVjdGlvbiB0byBiZSBhZGRlZCBvciByZW1vdmVkIG9yIGl0cyBuYW1lIGNoYW5nZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBjb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyOwotCi0JLyoqCi0JICogbGlzdGVuIGZvciB0aGUgY29ubmVjdGlvbiB0byBiZSBvcGVuZWQgb3IgY2xvc2VkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5KCkgewotCQlyZXR1cm4gSnB0RGJQbHVnaW4uaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0pwYURhdGFTb3VyY2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lKSB7Ci0JCXN1cGVyKGpwYVByb2plY3QpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5KCkuYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIpOwotCi0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTmFtZSA9IGNvbm5lY3Rpb25Qcm9maWxlTmFtZTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lZChjb25uZWN0aW9uUHJvZmlsZU5hbWUpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExvY2FsQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSUpwYURhdGFTb3VyY2UgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoU3RyaW5nIGNvbm5lY3Rpb25Qcm9maWxlTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZU5hbWU7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lID0gY29ubmVjdGlvblByb2ZpbGVOYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OTkVDVElPTl9QUk9GSUxFX05BTUVfUFJPUEVSVFksIG9sZCwgY29ubmVjdGlvblByb2ZpbGVOYW1lKTsKLQkJIC8vIHN5bmNoIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgd2hlbiB0aGUgbmFtZSBjaGFuZ2VzCi0JCXRoaXMuc2V0Q29ubmVjdGlvblByb2ZpbGUodGhpcy5jb25uZWN0aW9uUHJvZmlsZU5hbWVkKGNvbm5lY3Rpb25Qcm9maWxlTmFtZSkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQUNvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiAhIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNOdWxsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSgpLnJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5KCkuY29ubmVjdGlvblByb2ZpbGVOYW1lZChuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb25uZWN0aW9uUHJvZmlsZShDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBvbGQgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSBjb25uZWN0aW9uUHJvZmlsZTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OTkVDVElPTl9QUk9GSUxFX1BST1BFUlRZLCBvbGQsIGNvbm5lY3Rpb25Qcm9maWxlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzQWN0aXZlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5jb25uZWN0aW9uUHJvZmlsZU5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBMaXN0ZW4gZm9yIGEgY29ubmVjdGlvbiBwcm9maWxlIHdpdGggb3VyIG5hbWUgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiBBbHNvIGxpc3RlbiBmb3Igb3VyIGNvbm5lY3Rpb24ncyBuYW1lIGJlaW5nIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIExvY2FsQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBpbXBsZW1lbnRzIENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgTG9jYWxDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8vIHBvc3NpYmxlIG5hbWUgY2hhbmdlCi0JCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQlpZiAocHJvZmlsZSA9PSBHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLmNvbm5lY3Rpb25Qcm9maWxlKSB7Ci0JCQkJR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5zZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUocHJvZmlsZS5nZXROYW1lKCkpOwotCQkJCS8vIGJ1ZyAyMzIyMjUgLSBhbHNvIHVwZGF0ZSBwcm9qZWN0IHNldHRpbmcgd2hlbiBjb25uZWN0aW9uIHByb2ZpbGUKLQkJCQkvLyAgIG5hbWUgaGFzIGNoYW5nZWQKLQkJCQlKcHRDb3JlUGx1Z2luLnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLCBwcm9maWxlLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBwcm9maWxlIGFkZGVkIG9yIHJlbW92ZWQKLQkJcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZXBsYWNlZChDb25uZWN0aW9uUHJvZmlsZSBvbGRQcm9maWxlLCBDb25uZWN0aW9uUHJvZmlsZSBuZXdQcm9maWxlKSB7Ci0JCQlpZiAoR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5oYXNBQ29ubmVjdGlvbigpICYmCi0JCQkJKG9sZFByb2ZpbGUgPT0gR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5jb25uZWN0aW9uUHJvZmlsZSkpIHsKLQkJCQkJR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5zZXRDb25uZWN0aW9uUHJvZmlsZShuZXdQcm9maWxlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBXaGVuZXZlciB0aGUgY29ubmVjdGlvbiBpcyBvcGVuZWQgb3IgY2xvc2VkIHRyaWdnZXIgYSBwcm9qZWN0IHVwZGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBDb25uZWN0aW9uQWRhcHRlciB7Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQlHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLmdldEpwYVByb2plY3QoKS51cGRhdGUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5nZXRKcGFQcm9qZWN0KCkudXBkYXRlKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFGaWxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhZTcyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSnBhRmlsZSBleHRlbmRzIEFic3RyYWN0SnBhTm9kZSBpbXBsZW1lbnRzIEpwYUZpbGUKLXsKLQkvKioKLQkgKiBUaGUgSUZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSlBBIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSUZpbGUgZmlsZTsKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgbW9kZWwgcmVwcmVzZW50ZWQgYnkgdGhpcyBKUEEgZmlsZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWw7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnRleHQgbW9kZWwgcm9vdCBub2RlcyByZXByZXNlbnRlZCBieSB0aGlzIEpQQSBmaWxlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEhhc2h0YWJsZTxPYmplY3QsIEpwYVN0cnVjdHVyZU5vZGU+IHJvb3RTdHJ1Y3R1cmVOb2RlczsKLQkKLQlwdWJsaWMgR2VuZXJpY0pwYUZpbGUoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlLCBSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwpIHsKLQkJc3VwZXIoanBhUHJvamVjdCk7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbCA9IHJlc291cmNlTW9kZWw7Ci0JCXRoaXMucm9vdFN0cnVjdHVyZU5vZGVzID0gbmV3IEhhc2h0YWJsZTxPYmplY3QsIEpwYVN0cnVjdHVyZU5vZGU+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhTZXQ8U3RyaW5nPiBub25VcGRhdGVBc3BlY3ROYW1lcykgewotCQlzdXBlci5hZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKG5vblVwZGF0ZUFzcGVjdE5hbWVzKTsKLQkJLy9KcGFGaWxlLlJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04gZG9lcyBub3QgbmVlZCB0byB0cmlnZ2VyIGEgcHJvamVjdCB1cGRhdGUsIAotCQkvL29ubHkgdGhlIFVJIGNhcmVzIGFib3V0IHRoZSByb290U3RydWN0dXJlTm9kZS4KLQkJLy9JZiB5b3UgZG8gYSBwcm9qZWN0IHVwZGF0ZSBvbiB0aGlzIHlvdSBnZXQgaW4gYW4gaW5maW5pdGUgbG9vcCBpZiB5b3UKLQkJLy9zcGVjaWZ5IGEgamF2YSBjbGFzcyBpbiBtb3JlIHRoYW4gb25lIGxvY2F0aW9uIGluIHlvdXIgcGVyc2lzdGVuY2UgdW5pdC4KLQkJbm9uVXBkYXRlQXNwZWN0TmFtZXMuYWRkKEpwYUZpbGUuUk9PVF9TVFJVQ1RVUkVfTk9ERVNfQ09MTEVDVElPTik7Ci0JfQotCQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gdGhpcy5maWxlOwotCX0KLQkKLQlwdWJsaWMgUmVzb3VyY2VNb2RlbCBnZXRSZXNvdXJjZU1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZU1vZGVsOwotCX0KLQkKLQlwdWJsaWMgSXRlcmF0b3I8SnBhU3RydWN0dXJlTm9kZT4gcm9vdFN0cnVjdHVyZU5vZGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8SnBhU3RydWN0dXJlTm9kZT4odGhpcy5yb290U3RydWN0dXJlTm9kZXMudmFsdWVzKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgcm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucm9vdFN0cnVjdHVyZU5vZGVzLnNpemUoKTsKLQl9Ci0KLQkvLyBUT0RPIG1vdmUgZXZlbnRzIG91dHNpZGUgb2YgJ3N5bmNocm9uaXplZCcgYmxvY2s/Ci0JLy8gbmVlZCBmaXJlSXRlbVJlcGxhY2VkKFN0cmluZywgT2JqZWN0LCBPYmplY3QpIGZvciBDb2xsZWN0aW9uPwotCXB1YmxpYyB2b2lkIGFkZFJvb3RTdHJ1Y3R1cmVOb2RlKE9iamVjdCBrZXksIEpwYVN0cnVjdHVyZU5vZGUgcm9vdFN0cnVjdHVyZU5vZGUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLnJvb3RTdHJ1Y3R1cmVOb2RlcykgewotCQkJSnBhU3RydWN0dXJlTm9kZSBub2RlID0gdGhpcy5yb290U3RydWN0dXJlTm9kZXMuZ2V0KGtleSk7Ci0JCQlpZiAobm9kZSA9PSByb290U3RydWN0dXJlTm9kZSkgewotCQkJCXJldHVybjsgIC8vIG5vIGR1cGxpY2F0ZXMKLQkJCX0KLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQl0aGlzLnJvb3RTdHJ1Y3R1cmVOb2Rlcy5yZW1vdmUoa2V5KTsKLQkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChKcGFGaWxlLlJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04sIG5vZGUpOwotCQkJfQotCQkJdGhpcy5yb290U3RydWN0dXJlTm9kZXMucHV0KGtleSwgcm9vdFN0cnVjdHVyZU5vZGUpOwotCQkJdGhpcy5maXJlSXRlbUFkZGVkKEpwYUZpbGUuUk9PVF9TVFJVQ1RVUkVfTk9ERVNfQ09MTEVDVElPTiwgcm9vdFN0cnVjdHVyZU5vZGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVJvb3RTdHJ1Y3R1cmVOb2RlKE9iamVjdCBrZXkpIHsKLQkJSnBhU3RydWN0dXJlTm9kZSByZW1vdmVkU3RydWN0dXJlTm9kZSA9IHRoaXMucm9vdFN0cnVjdHVyZU5vZGVzLnJlbW92ZShrZXkpOwotCQlmaXJlSXRlbVJlbW92ZWQoSnBhRmlsZS5ST09UX1NUUlVDVFVSRV9OT0RFU19DT0xMRUNUSU9OLCByZW1vdmVkU3RydWN0dXJlTm9kZSk7Ci0JfQotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKLQkJZm9yIChKcGFTdHJ1Y3R1cmVOb2RlIHJvb3ROb2RlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHJvb3RTdHJ1Y3R1cmVOb2RlcygpKSkgewotCQkJSnBhU3RydWN0dXJlTm9kZSBub2RlID0gcm9vdE5vZGUuZ2V0U3RydWN0dXJlTm9kZSh0ZXh0T2Zmc2V0KTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPE9iamVjdD4gcm9vdFN0cnVjdHVyZU5vZGVLZXlzKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8T2JqZWN0Pih0aGlzLnJvb3RTdHJ1Y3R1cmVOb2Rlcy5rZXlTZXQoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZU1vZGVsKCkuZ2V0UmVzb3VyY2VUeXBlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWdldFJlc291cmNlTW9kZWwoKS5kaXNwb3NlKCk7Ci0KLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMucm9vdFN0cnVjdHVyZU5vZGVLZXlzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5yZW1vdmVSb290U3RydWN0dXJlTm9kZShzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQlnZXRSZXNvdXJjZU1vZGVsKCkuamF2YUVsZW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoZ2V0RmlsZSgpLnRvU3RyaW5nKCkpOwotCQlzYi5hcHBlbmQoIiAocmVzb3VyY2VUeXBlOiAiKTsKLQkJc2IuYXBwZW5kKGdldFJlc291cmNlVHlwZSgpKTsKLQkJc2IuYXBwZW5kKCIpIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbVJlc291cmNlKCkgewotCQl0aGlzLnJlc291cmNlTW9kZWwudXBkYXRlRnJvbVJlc291cmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMzE2ZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0LkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVByb2plY3RGYWNldEFjdGlvbkV2ZW50OwotCi0vKioKLSAqIFRoZSBKUEEgbW9kZWwgaXMgc3luY2hyb25pemVkIHNvIGFsbCBjaGFuZ2VzIHRvIHRoZSBsaXN0IG9mIEpQQSBwcm9qZWN0cwotICogYXJlIHRocmVhZC1zYWZlLgotICogCi0gKiBUaGUgSlBBIG1vZGVsIGhvbGRzIG9uIHRvIGEgbGlzdCBvZiBKUEEgcHJvamVjdCBjb25maWdzIGFuZCBvbmx5IGluc3RhbnRpYXRlcwotICogdGhlaXIgYXNzb2NpYXRlZCBKUEEgcHJvamVjdHMgd2hlbiBuZWNlc3NhcnkuIE90aGVyIHRoYW4gcGVyZm9ybWFuY2UsCi0gKiB0aGlzIHNob3VsZCBiZSB0cmFuc3BhcmVudCB0byBjbGllbnRzLgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYU1vZGVsCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBKcGFNb2RlbAotewotCi0JLyoqIG1haW50YWluIGEgbGlzdCBvZiBhbGwgdGhlIGN1cnJlbnQgSlBBIHByb2plY3RzICovCi0JcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SnBhUHJvamVjdEhvbGRlcj4ganBhUHJvamVjdEhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PEpwYVByb2plY3RIb2xkZXI+KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSlBBIG1vZGVsIGFuZCBwb3B1bGF0ZSBpdCB3aXRoIEpQQSBwcm9qZWN0cyBmb3IgYWxsIHRoZQotCSAqIGN1cnJlbnQgRWNsaXBzZSBwcm9qZWN0cyB3aXRoIEpQQSBmYWNldHMuCi0JICogVGhlIEpQQSBtb2RlbCBjYW4gb25seSBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlIEpQQSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCUdlbmVyaWNKcGFNb2RlbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5hY2NlcHQobmV3IFJlc291cmNlUHJveHlWaXNpdG9yKCksIElSZXNvdXJjZS5OT05FKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSUpwYU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBpbnN0YW50aWF0aW9uIG9mIHRoZSBKUEEgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVByb2plY3RIb2xkZXIocHJvamVjdCkuanBhUHJvamVjdCgpOwotCX0KLQotCS8qKgotCSAqIFdlIGNhbiBhbnN3ZXIgdGhpcyBxdWVzdGlvbiB3aXRob3V0IGluc3RhbnRpYXRpbmcgdGhlCi0JICogYXNzb2NpYXRlZCBKUEEgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29udGFpbnNKcGFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdEhvbGRlcihwcm9qZWN0KS5ob2xkc0pwYVByb2plY3RGb3IocHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHRyaWdnZXIgdGhlIGluc3RhbnRpYXRpb24gb2YgYWxsIHRoZSBKUEEgcHJvamVjdHMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJdGVyYXRvcjxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZm9yY2UgdGhlIENvcmVFeGNlcHRpb24gdG8gb2NjdXIgaGVyZSAoaW5zdGVhZCBvZiBsYXRlciwgaW4gSXRlcmF0b3IjbmV4dCgpKQotCQlBcnJheUxpc3Q8SnBhUHJvamVjdD4ganBhUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0PEpwYVByb2plY3Q+KHRoaXMuanBhUHJvamVjdEhvbGRlcnMuc2l6ZSgpKTsKLQkJZm9yIChKcGFQcm9qZWN0SG9sZGVyIGhvbGRlciA6IHRoaXMuanBhUHJvamVjdEhvbGRlcnMpIHsKLQkJCWpwYVByb2plY3RzLmFkZChob2xkZXIuanBhUHJvamVjdCgpKTsKLQkJfQotCQlyZXR1cm4ganBhUHJvamVjdHMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBjYW4gYW5zd2VyIHRoaXMgcXVlc3Rpb24gd2l0aG91dCBpbnN0YW50aWF0aW5nIGFueSBKUEEgcHJvamVjdHMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQganBhUHJvamVjdHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0SG9sZGVycy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHRyaWdnZXIgdGhlIGluc3RhbnRpYXRpb24gb2YgdGhlIEpQQSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIEpwYUZpbGUgZ2V0SnBhRmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IHRoaXMuZ2V0SnBhUHJvamVjdChmaWxlLmdldFByb2plY3QoKSk7Ci0JCXJldHVybiAoanBhUHJvamVjdCA9PSBudWxsKSA/IG51bGwgOiBqcGFQcm9qZWN0LmdldEpwYUZpbGUoZmlsZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogbmV2ZXIgcmV0dXJuIG51bGwKLQkgKi8KLQlwcml2YXRlIEpwYVByb2plY3RIb2xkZXIgZ2V0SnBhUHJvamVjdEhvbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZvciAoSnBhUHJvamVjdEhvbGRlciBob2xkZXIgOiB0aGlzLmpwYVByb2plY3RIb2xkZXJzKSB7Ci0JCQlpZiAoaG9sZGVyLmhvbGRzSnBhUHJvamVjdEZvcihwcm9qZWN0KSkgewotCQkJCXJldHVybiBob2xkZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIE51bGxKcGFQcm9qZWN0SG9sZGVyLmluc3RhbmNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBKcGFQcm9qZWN0LkNvbmZpZyBidWlsZEpwYVByb2plY3RDb25maWcoSVByb2plY3QgcHJvamVjdCkgewotCQlTaW1wbGVKcGFQcm9qZWN0Q29uZmlnIGNvbmZpZyA9IG5ldyBTaW1wbGVKcGFQcm9qZWN0Q29uZmlnKCk7Ci0JCWNvbmZpZy5zZXRQcm9qZWN0KHByb2plY3QpOwotCQljb25maWcuc2V0SnBhUGxhdGZvcm0oSnB0Q29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybShwcm9qZWN0KSk7Ci0JCWNvbmZpZy5zZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUocHJvamVjdCkpOwotCQljb25maWcuc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWUoSnB0Q29yZVBsdWdpbi5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZShwcm9qZWN0KSk7Ci0JCWNvbmZpZy5zZXREaXNjb3ZlckFubm90YXRlZENsYXNzZXMoSnB0Q29yZVBsdWdpbi5kaXNjb3ZlckFubm90YXRlZENsYXNzZXMocHJvamVjdCkpOwotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCS8qIHByaXZhdGUgKi8gdm9pZCBhZGRKcGFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5hZGRKcGFQcm9qZWN0KHRoaXMuYnVpbGRKcGFQcm9qZWN0Q29uZmlnKHByb2plY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBKUEEgcHJvamVjdCB0byB0aGUgSlBBIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKiBKUEEgcHJvamVjdHMgY2FuIG9ubHkgYmUgYWRkZWQgYnkgdGhlIEpQQSBtb2RlbCBtYW5hZ2VyLgotCSAqIFRoZSBKUEEgcHJvamVjdCB3aWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGxhdGVyLCBvbiBkZW1hbmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEpwYVByb2plY3QoSnBhUHJvamVjdC5Db25maWcgY29uZmlnKSB7Ci0JCWR1bXBTdGFja1RyYWNlKCk7ICAvLyBmaWd1cmUgb3V0IGV4YWN0bHkgd2hlbiBKUEEgcHJvamVjdHMgYXJlIGFkZGVkCi0JCXRoaXMuanBhUHJvamVjdEhvbGRlcnMuYWRkKHRoaXMuZ2V0SnBhUHJvamVjdEhvbGRlcihjb25maWcuZ2V0UHJvamVjdCgpKS5idWlsZEpwYVByb2plY3RIb2xkZXIodGhpcywgY29uZmlnKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBKUEEgcHJvamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0Ci0JICogZnJvbSB0aGUgSlBBIG1vZGVsLiBSZXR1cm4gd2hldGhlciB0aGUgcmVtb3ZhbCBhY3R1YWxseSBoYXBwZW5lZC4KLQkgKiBKUEEgcHJvamVjdHMgY2FuIG9ubHkgYmUgcmVtb3ZlZCBieSB0aGUgSlBBIG1vZGVsIG1hbmFnZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlkdW1wU3RhY2tUcmFjZSgpOyAgLy8gZmlndXJlIG91dCBleGFjdGx5IHdoZW4gSlBBIHByb2plY3RzIGFyZSByZW1vdmVkCi0JCXRoaXMuZ2V0SnBhUHJvamVjdEhvbGRlcihwcm9qZWN0KS5yZW1vdmUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUmVzb3VyY2UgZXZlbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgcHJvamVjdCBpcyBiZWluZyBkZWxldGVkLiBSZW1vdmUgaXRzIGNvcnJlc3BvbmRpbmcKLQkgKiBKUEEgcHJvamVjdCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLQlzeW5jaHJvbml6ZWQgdm9pZCBwcm9qZWN0UHJlRGVsZXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5yZW1vdmVKcGFQcm9qZWN0KHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBkZWx0YSB0byB0aGUgSlBBIHByb2plY3QgY29ycmVzcG9uZGluZwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgotCSAqLwotCXN5bmNocm9uaXplZCB2b2lkIHN5bmNocm9uaXplRmlsZXMoSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdEhvbGRlcihwcm9qZWN0KS5zeW5jaHJvbml6ZUpwYUZpbGVzKGRlbHRhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUmVzb3VyY2UgYW5kL29yIEZhY2V0IGV2ZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZSBKUEEgZmFjZXQgaGFzIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKi8KLQlzeW5jaHJvbml6ZWQgdm9pZCBjaGVja0ZvclRyYW5zaXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlib29sZWFuIGpwYUZhY2V0ID0gSnB0Q29yZVBsdWdpbi5wcm9qZWN0SGFzSnBhRmFjZXQocHJvamVjdCk7Ci0JCWJvb2xlYW4ganBhUHJvamVjdCA9IHRoaXMuY29udGFpbnNKcGFQcm9qZWN0KHByb2plY3QpOwotCi0JCWlmIChqcGFGYWNldCkgewotCQkJaWYgKCAhIGpwYVByb2plY3QpIHsgIC8vIEpQQSBmYWNldCBhZGRlZAotCQkJCXRoaXMuYWRkSnBhUHJvamVjdChwcm9qZWN0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChqcGFQcm9qZWN0KSB7ICAvLyBKUEEgZmFjZXQgcmVtb3ZlZAotCQkJCXRoaXMucmVtb3ZlSnBhUHJvamVjdChwcm9qZWN0KTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBGYWNldCBldmVudHMgKioqKioqKioqKgotCi0JLy8gY3JlYXRlIHBlcnNpc3RlbmNlLnhtbCBhbmQgb3JtLnhtbCBpbiBqb2JzIHNvIHdlIGRvbid0IGRlYWRsb2NrCi0JLy8gd2l0aCB0aGUgUmVzb3VyY2UgQ2hhbmdlIEV2ZW50IHRoYXQgY29tZXMgaW4gZnJvbSBhbm90aGVyCi0JLy8gdGhyZWFkIGFmdGVyIHRoZSBFY2xpcHNlIHByb2plY3QgaXMgY3JlYXRlZCBieSB0aGUgcHJvamVjdCBmYWNldAotCS8vIHdpemFyZCAod2hpY2ggaGFwcGVucyBiZWZvcmUgdGhlIHdpemFyZCBub3RpZmllcyB1cyk7IHRoZSBBcnRpZmFjdAotCS8vIEVkaXRzIHdpbGwgaGFuZyBkdXJpbmcgI3NhdmUoKSwgd2FpdGluZyBmb3IgdGhlIHdvcmtzcGFjZSBsb2NrIGhlbGQKLQkvLyBieSB0aGUgUmVzb3VyY2UgQ2hhbmdlIE5vdGlmaWNhdGlvbiBsb29wCi0Jc3luY2hyb25pemVkIHZvaWQganBhRmFjZXRlZFByb2plY3RQb3N0SW5zdGFsbChJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGV2ZW50LmdldFByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gKElEYXRhTW9kZWwpIGV2ZW50LmdldEFjdGlvbkNvbmZpZygpOwotCi0JCWJvb2xlYW4gYnVpbGRPcm1YbWwgPSBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCk7Ci0JCXRoaXMuYnVpbGRQcm9qZWN0WG1sSm9iKHByb2plY3QsIGJ1aWxkT3JtWG1sKS5zY2hlZHVsZSgpOwotCi0JCS8vIGFzc3VtZSg/KSB0aGlzIGlzIHRoZSBmaXJzdCBldmVudCB0byBpbmRpY2F0ZSB3ZSBuZWVkIHRvIGFkZCB0aGUgSlBBIHByb2plY3QgdG8gdGhlIEpQQSBtb2RlbAotCQl0aGlzLmFkZEpwYVByb2plY3QocHJvamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSBKb2IgYnVpbGRQcm9qZWN0WG1sSm9iKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIGJvb2xlYW4gYnVpbGRPcm1YbWwpIHsKLQkJSm9iIGpvYiA9IG5ldyBKb2IoIkNyZWF0ZSBQcm9qZWN0IFhNTCBmaWxlcyIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCUdlbmVyaWNKcGFNb2RlbC50aGlzLmNyZWF0ZVByb2plY3RYbWwocHJvamVjdCwgYnVpbGRPcm1YbWwpOwotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQlqb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJcmV0dXJuIGpvYjsKLQl9Ci0KLQkvKiBwcml2YXRlICovIHZvaWQgY3JlYXRlUHJvamVjdFhtbChJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGJ1aWxkT3JtWG1sKSB7Ci0JCXRoaXMuY3JlYXRlUGVyc2lzdGVuY2VYbWwocHJvamVjdCk7Ci0KLQkJaWYgKGJ1aWxkT3JtWG1sKSB7Ci0JCQl0aGlzLmNyZWF0ZU9ybVhtbChwcm9qZWN0KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVBlcnNpc3RlbmNlWG1sKElQcm9qZWN0IHByb2plY3QpIHsKLQkJUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgcGFlID0gUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQotCQkvLyAyMDI4MTEgLSBkbyBub3QgYWRkIGNvbnRlbnQgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcmVzb3VyY2UgPSBwYWUuZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKCEgcmVzb3VyY2UuZ2V0RmlsZSgpLmV4aXN0cygpKSB7Ci0JCQlwYWUuY3JlYXRlRGVmYXVsdFJlc291cmNlKCk7Ci0JCX0KLQkJCi0JCXBhZS5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU9ybVhtbChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCU9ybUFydGlmYWN0RWRpdCBvYWUgPSBPcm1BcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCU9ybVJlc291cmNlIHJlc291cmNlID0gb2FlLmdldFJlc291cmNlKEpwdENvcmVQbHVnaW4uZ2V0RGVmYXVsdE9ybVhtbERlcGxveW1lbnRVUkkocHJvamVjdCkpOwotCi0JCS8vIDIwMjgxMSAtIGRvIG5vdCBhZGQgY29udGVudCBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQKLQkJaWYgKHJlc291cmNlLmdldEVudGl0eU1hcHBpbmdzKCkgPT0gbnVsbCkgewotCQkJWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpOwotCQkJZW50aXR5TWFwcGluZ3Muc2V0VmVyc2lvbigiMS4wIik7Ci0JCQl0aGlzLmdldFJlc291cmNlQ29udGVudHMocmVzb3VyY2UpLmFkZChlbnRpdHlNYXBwaW5ncyk7Ci0JCQlvYWUuc2F2ZShudWxsKTsKLQkJfQotCQkKLQkJb2FlLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEVMaXN0PEVPYmplY3Q+IGdldFJlc291cmNlQ29udGVudHMoT3JtUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIHJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0JfQotCi0JLy8gVE9ETyByZW1vdmUgY2xhc3NwYXRoIGl0ZW1zPyBwZXJzaXN0ZW5jZS54bWw/IG9ybS54bWw/Ci0Jc3luY2hyb25pemVkIHZvaWQganBhRmFjZXRlZFByb2plY3RQcmVVbmluc3RhbGwoSVByb2plY3RGYWNldEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCS8vIGFzc3VtZSg/KSB0aGlzIGlzIHRoZSBmaXJzdCBldmVudCB0byBpbmRpY2F0ZSB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgSlBBIHByb2plY3QgdG8gdGhlIEpQQSBtb2RlbAotCQl0aGlzLnJlbW92ZUpwYVByb2plY3QoZXZlbnQuZ2V0UHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgZXZlbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIEZvcndhcmQgdGhlIEphdmEgZWxlbWVudCBjaGFuZ2VkIGV2ZW50IHRvIGFsbCB0aGUgSlBBIHByb2plY3RzCi0JICogYmVjYXVzZSB0aGUgZXZlbnQgY291bGQgYWZmZWN0IG11bHRpcGxlIHByb2plY3RzLgotCSAqLwotCXN5bmNocm9uaXplZCB2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoSnBhUHJvamVjdEhvbGRlciBqcGFQcm9qZWN0SG9sZGVyIDogdGhpcy5qcGFQcm9qZWN0SG9sZGVycykgewotCQkJanBhUHJvamVjdEhvbGRlci5qYXZhRWxlbWVudENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2NlbGxhbmVvdXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIEpQQSBzZXR0aW5ncyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QKLQkgKiBoYXZlIGNoYW5nZWQgaW4gc3VjaCBhIHdheSBhcyB0byByZXF1aXJlIHRoZSBhc3NvY2lhdGVkCi0JICogSlBBIHByb2plY3QgdG8gYmUgY29tcGxldGVseSByZWJ1aWx0Ci0JICogKGUuZy4gd2hlbiB0aGUgdXNlciBjaGFuZ2VzIGEgcHJvamVjdCdzIEpQQSBwbGF0Zm9ybSkuCi0JICovCi0Jc3luY2hyb25pemVkIHZvaWQgcmVidWlsZEpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzLnJlbW92ZUpwYVByb2plY3QocHJvamVjdCk7Ci0JCXRoaXMuYWRkSnBhUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIHRoZSBKUEEgbW9kZWwgYnkgZGlzcG9zaW5nIGFuZCByZW1vdmluZyBhbGwgaXRzIEpQQSBwcm9qZWN0cy4KLQkgKiBUaGUgSlBBIG1vZGVsIGNhbiBvbmx5IGJlIGRpc3Bvc2VkIGJ5IHRoZSBKUEEgbW9kZWwgbWFuYWdlci4KLQkgKi8KLQlzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBjbG9uZSB0aGUgbGlzdCB0byBwcmV2ZW50IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGV4Y2VwdGlvbnMKLQkJSnBhUHJvamVjdEhvbGRlcltdIGhvbGRlcnMgPSB0aGlzLmpwYVByb2plY3RIb2xkZXJzLnRvQXJyYXkobmV3IEpwYVByb2plY3RIb2xkZXJbdGhpcy5qcGFQcm9qZWN0SG9sZGVycy5zaXplKCldKTsKLQkJZm9yIChKcGFQcm9qZWN0SG9sZGVyIGhvbGRlciA6IGhvbGRlcnMpIHsKLQkJCWhvbGRlci5yZW1vdmUoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKCJKUEEgcHJvamVjdHMgc2l6ZTogIiArIHRoaXMuanBhUHJvamVjdHNTaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBob2xkZXIgY2FsbGJhY2tzICoqKioqKioqKioKLQotCS8qKgotCSAqIGNhbGxlZCBieSB0aGUgSlBBIHByb2plY3QgaG9sZGVyIHdoZW4gdGhlIEpQQSBwcm9qZWN0IGlzIGFjdHVhbGx5Ci0JICogaW5zdGFudGlhdGVkCi0JICovCi0JLyogcHJpdmF0ZSAqLyB2b2lkIGpwYVByb2plY3RCdWlsdChKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKEpQQV9QUk9KRUNUU19DT0xMRUNUSU9OLCBqcGFQcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBjYWxsZWQgYnkgdGhlIEpQQSBwcm9qZWN0IGhvbGRlciBpZiB0aGUgSlBBIHByb2plY3QgaGFzIGJlZW4KLQkgKiBpbnN0YW50aWF0ZWQgYW5kIHdlIG5lZWQgdG8gcmVtb3ZlIGl0Ci0JICovCi0JLyogcHJpdmF0ZSAqLyB2b2lkIGpwYVByb2plY3RSZW1vdmVkKEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChKUEFfUFJPSkVDVFNfQ09MTEVDVElPTiwganBhUHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogY2FsbGVkIGJ5IHRoZSBKUEEgcHJvamVjdCBob2xkZXIKLQkgKi8KLQkvKiBwcml2YXRlICovIHZvaWQgcmVtb3ZlSnBhUHJvamVjdEhvbGRlcihKcGFQcm9qZWN0SG9sZGVyIGpwYVByb2plY3RIb2xkZXIpIHsKLQkJdGhpcy5qcGFQcm9qZWN0SG9sZGVycy5yZW1vdmUoanBhUHJvamVjdEhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpQQSBwcm9qZWN0IGhvbGRlcnMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgSnBhUHJvamVjdEhvbGRlciB7Ci0KLQkJYm9vbGVhbiBob2xkc0pwYVByb2plY3RGb3IoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkJdm9pZCBzeW5jaHJvbml6ZUpwYUZpbGVzKElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCQl2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KTsKLQotCQlKcGFQcm9qZWN0SG9sZGVyIGJ1aWxkSnBhUHJvamVjdEhvbGRlcihHZW5lcmljSnBhTW9kZWwganBhTW9kZWwsIEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZyk7Ci0KLQkJdm9pZCByZW1vdmUoKTsKLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxKcGFQcm9qZWN0SG9sZGVyIGltcGxlbWVudHMgSnBhUHJvamVjdEhvbGRlciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVByb2plY3RIb2xkZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbEpwYVByb2plY3RIb2xkZXIoKTsKLQotCQlzdGF0aWMgSnBhUHJvamVjdEhvbGRlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsSnBhUHJvamVjdEhvbGRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBob2xkc0pwYVByb2plY3RGb3IoSVByb2plY3QgcHJvamVjdCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIEpwYVByb2plY3QganBhUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3luY2hyb25pemVKcGFGaWxlcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyBKcGFQcm9qZWN0SG9sZGVyIGJ1aWxkSnBhUHJvamVjdEhvbGRlcihHZW5lcmljSnBhTW9kZWwganBhTW9kZWwsIENvbmZpZyBjb25maWcpIHsKLQkJCXJldHVybiBuZXcgRGVmYXVsdEpwYVByb2plY3RIb2xkZXIoanBhTW9kZWwsIGNvbmZpZyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFpciBhIEpQQSBwcm9qZWN0IGNvbmZpZyB3aXRoIGl0cyBsYXppbHktaW5pdGlhbGl6ZWQgSlBBIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVmYXVsdEpwYVByb2plY3RIb2xkZXIgaW1wbGVtZW50cyBKcGFQcm9qZWN0SG9sZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBHZW5lcmljSnBhTW9kZWwganBhTW9kZWw7Ci0JCXByaXZhdGUgZmluYWwgSnBhUHJvamVjdC5Db25maWcgY29uZmlnOwotCQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCQlEZWZhdWx0SnBhUHJvamVjdEhvbGRlcihHZW5lcmljSnBhTW9kZWwganBhTW9kZWwsIEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuanBhTW9kZWwgPSBqcGFNb2RlbDsKLQkJCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaG9sZHNKcGFQcm9qZWN0Rm9yKElQcm9qZWN0IHByb2plY3QpIHsKLQkJCXJldHVybiB0aGlzLmNvbmZpZy5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpOwotCQl9Ci0KLQkJcHVibGljIEpwYVByb2plY3QganBhUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWlmICh0aGlzLmpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJCXRoaXMuanBhUHJvamVjdCA9IHRoaXMuYnVpbGRKcGFQcm9qZWN0KCk7Ci0JCQkJLy8gbm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgSlBBIG1vZGVsCi0JCQkJdGhpcy5qcGFNb2RlbC5qcGFQcm9qZWN0QnVpbHQodGhpcy5qcGFQcm9qZWN0KTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLmpwYVByb2plY3Q7Ci0JCX0KLQotCQlwcml2YXRlIEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gdGhpcy5jb25maWcuZ2V0SnBhUGxhdGZvcm0oKS5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKcGFQcm9qZWN0KHRoaXMuY29uZmlnKTsKLQkJCWpwYVByb2plY3Quc2V0VXBkYXRlcihuZXcgQXN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIoanBhUHJvamVjdCkpOwotCQkJcmV0dXJuIGpwYVByb2plY3Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZUpwYUZpbGVzKElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlpZiAodGhpcy5qcGFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmpwYVByb2plY3Quc3luY2hyb25pemVKcGFGaWxlcyhkZWx0YSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQkJaWYgKHRoaXMuanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5qcGFQcm9qZWN0LmphdmFFbGVtZW50Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgSnBhUHJvamVjdEhvbGRlciBidWlsZEpwYVByb2plY3RIb2xkZXIoR2VuZXJpY0pwYU1vZGVsIGptLCBDb25maWcgYykgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhpcy5qcGFNb2RlbC5yZW1vdmVKcGFQcm9qZWN0SG9sZGVyKHRoaXMpOwotCQkJaWYgKHRoaXMuanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5qcGFNb2RlbC5qcGFQcm9qZWN0UmVtb3ZlZCh0aGlzLmpwYVByb2plY3QpOwotCQkJCXRoaXMuanBhUHJvamVjdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY29uZmlnLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgcHJveHkgdmlzaXRvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBWaXNpdCB0aGUgd29ya3NwYWNlIHJlc291cmNlIHRyZWUsIGFkZGluZyBhIEpQQSBwcm9qZWN0IHRvIHRoZQotCSAqIEpQQSBtb2RlbCBmb3IgZWFjaCBvcGVuIEVjbGlwc2UgcHJvamVjdCB0aGF0IGhhcyBhIEpQQSBmYWNldC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJlc291cmNlUHJveHlWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yIHsKLQotCQlSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSByZXNvdXJjZVByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlzd2l0Y2ggKHJlc291cmNlUHJveHkuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6Ci0JCQkJCXJldHVybiB0cnVlOyAgLy8gYWxsIHByb2plY3RzIGFyZSBpbiB0aGUgInJvb3QiCi0JCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJCXRoaXMuY2hlY2tQcm9qZWN0KHJlc291cmNlUHJveHkpOwotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBuZXN0ZWQgcHJvamVjdHMKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNoZWNrUHJvamVjdChJUmVzb3VyY2VQcm94eSByZXNvdXJjZVByb3h5KSB7Ci0JCQlpZiAocmVzb3VyY2VQcm94eS5pc0FjY2Vzc2libGUoKSkgeyAgLy8gdGhlIHByb2plY3QgZXhpc3RzIGFuZCBpcyBvcGVuCi0JCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2VQcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQlpZiAoSnB0Q29yZVBsdWdpbi5wcm9qZWN0SGFzSnBhRmFjZXQocHJvamVjdCkpIHsKLQkJCQkJR2VuZXJpY0pwYU1vZGVsLnRoaXMuYWRkSnBhUHJvamVjdChwcm9qZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogREVCVUcgKioqKioqKioqKgotCi0JLy8gQHNlZSBKcGFNb2RlbFRlc3RzI3Rlc3RERUJVRygpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkdW1wU3RhY2tUcmFjZSgpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQkvLyBsb2NrIFN5c3RlbS5vdXQgc28gdGhlIHN0YWNrIGVsZW1lbnRzIGFyZSBwcmludGVkIG91dCBjb250aWd1b3VzbHkKLQkJCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJCVN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0U3RhY2tUcmFjZSgpOwotCQkJCS8vIHNraXAgdGhlIGZpcnN0IDMgZWxlbWVudHMgLSB0aG9zZSBhcmUgdGhpcyBtZXRob2QgYW5kIDIgbWV0aG9kcyBpbiBUaHJlYWQKLQkJCQlmb3IgKGludCBpID0gMzsgaSA8IHN0YWNrVHJhY2UubGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RhY2tUcmFjZUVsZW1lbnQgZWxlbWVudCA9IHN0YWNrVHJhY2VbaV07Ci0JCQkJCWlmIChlbGVtZW50LmdldE1ldGhvZE5hbWUoKS5lcXVhbHMoImludm9rZTAiKSkgewotCQkJCQkJYnJlYWs7ICAvLyBza2lwIGFsbCBlbGVtZW50cyBvdXRzaWRlIG9mIHRoZSBKVW5pdCB0ZXN0Ci0JCQkJCX0KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9HZW5lcmljSnBhUGxhdGZvcm0uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9HZW5lcmljSnBhUGxhdGZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTRmMTZhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFQbGF0Zm9ybS5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhQW5ub3RhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtVmFyaWF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuUGxhdGZvcm1Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5EZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VGaW5kZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKKworLyoqCisgKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBKUEEgcGxhdGZvcm0gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZQorICogaXQgaXMgaW5pdGlhbGl6ZWQpLgorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY0pwYVBsYXRmb3JtCisJaW1wbGVtZW50cyBKcGFQbGF0Zm9ybQoreworCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOworCQorCXByaXZhdGUgZmluYWwgVmVyc2lvbiBqcGFWZXJzaW9uOworCQorCXByaXZhdGUgZmluYWwgSnBhRmFjdG9yeSBqcGFGYWN0b3J5OworCQorCXByaXZhdGUgZmluYWwgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlcjsKKwkKKwlwcml2YXRlIGZpbmFsIEpwYVBsYXRmb3JtUHJvdmlkZXIgcGxhdGZvcm1Qcm92aWRlcjsKKwkKKwlwcml2YXRlIGZpbmFsIEpwYVBsYXRmb3JtVmFyaWF0aW9uIGpwYVZhcmlhdGlvbjsKKwkKKwkKKwlwdWJsaWMgR2VuZXJpY0pwYVBsYXRmb3JtKFN0cmluZyBpZCwgVmVyc2lvbiBqcGFWZXJzaW9uLCBKcGFGYWN0b3J5IGpwYUZhY3RvcnksIEpwYUFubm90YXRpb25Qcm92aWRlciBqcGFBbm5vdGF0aW9uUHJvdmlkZXIsIEpwYVBsYXRmb3JtUHJvdmlkZXIgcGxhdGZvcm1Qcm92aWRlciwgSnBhUGxhdGZvcm1WYXJpYXRpb24ganBhVmFyaWF0aW9uKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuaWQgPSBpZDsKKwkJdGhpcy5qcGFWZXJzaW9uID0ganBhVmVyc2lvbjsKKwkJdGhpcy5qcGFGYWN0b3J5ID0ganBhRmFjdG9yeTsKKwkJdGhpcy5hbm5vdGF0aW9uUHJvdmlkZXIgPSBqcGFBbm5vdGF0aW9uUHJvdmlkZXI7CisJCXRoaXMuanBhVmFyaWF0aW9uID0ganBhVmFyaWF0aW9uOworCQl0aGlzLnBsYXRmb3JtUHJvdmlkZXIgPSBwbGF0Zm9ybVByb3ZpZGVyOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gdGhpcy5pZDsKKwl9CisJCisJcHVibGljIFZlcnNpb24gZ2V0SnBhVmVyc2lvbigpIHsKKwkJcmV0dXJuIHRoaXMuanBhVmVyc2lvbjsKKwl9CisJCisJLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKKworCXB1YmxpYyBKcGFGYWN0b3J5IGdldEpwYUZhY3RvcnkoKSB7CisJCXJldHVybiB0aGlzLmpwYUZhY3Rvcnk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogcGxhdGZvcm0gcHJvdmlkZXJzICoqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1Qcm92aWRlciBnZXRQbGF0Zm9ybVByb3ZpZGVyKCkgeworCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3ZpZGVyOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIEpQQSBmaWxlL3Jlc291cmNlIG1vZGVscyAqKioqKioqKioqCisKKwlwdWJsaWMgSnBhRmlsZSBidWlsZEpwYUZpbGUoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlKSB7CisJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtVG9vbHMuZ2V0Q29udGVudFR5cGUoZmlsZSk7CisJCXJldHVybiAoY29udGVudFR5cGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZEpwYUZpbGUoanBhUHJvamVjdCwgZmlsZSwgY29udGVudFR5cGUpOworCX0KKworCXByb3RlY3RlZCBKcGFGaWxlIGJ1aWxkSnBhRmlsZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIElGaWxlIGZpbGUsIElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgeworCQlKcGFSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwgPSB0aGlzLmJ1aWxkUmVzb3VyY2VNb2RlbChqcGFQcm9qZWN0LCBmaWxlLCBjb250ZW50VHlwZSk7CisJCXJldHVybiAocmVzb3VyY2VNb2RlbCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmpwYUZhY3RvcnkuYnVpbGRKcGFGaWxlKGpwYVByb2plY3QsIGZpbGUsIGNvbnRlbnRUeXBlLCByZXNvdXJjZU1vZGVsKTsKKwl9CisKKwlwcm90ZWN0ZWQgSnBhUmVzb3VyY2VNb2RlbCBidWlsZFJlc291cmNlTW9kZWwoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlLCBJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKKwkJSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gdGhpcy5nZXRSZXNvdXJjZU1vZGVsUHJvdmlkZXIoY29udGVudFR5cGUpOworCQlyZXR1cm4gKHByb3ZpZGVyID09IG51bGwpID8gbnVsbCA6IHByb3ZpZGVyLmJ1aWxkUmVzb3VyY2VNb2RlbChqcGFQcm9qZWN0LCBmaWxlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gbnVsbCBpZiB3ZSBkb24ndCBoYXZlIGEgcHJvdmlkZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlCisJICogKHNpbmNlIHdlIGRvbid0IGhhdmUgY29udHJvbCBvdmVyIHRoZSBwb3NzaWJsZSBjb250ZW50IHR5cGVzKS4KKwkgKi8KKwlwcm90ZWN0ZWQgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyIGdldFJlc291cmNlTW9kZWxQcm92aWRlcihJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKKwkJZm9yIChKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUocmVzb3VyY2VNb2RlbFByb3ZpZGVycygpKSkgeworCQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhwcm92aWRlci5nZXRDb250ZW50VHlwZSgpKSkgeworCQkJCXJldHVybiBwcm92aWRlcjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEpwYVJlc291cmNlTW9kZWxQcm92aWRlcj4gcmVzb3VyY2VNb2RlbFByb3ZpZGVycygpIHsKKwkJcmV0dXJuIHRoaXMucGxhdGZvcm1Qcm92aWRlci5yZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogSmF2YSBhbm5vdGF0aW9ucyAqKioqKioqKioqCisKKwlwdWJsaWMgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGdldEFubm90YXRpb25Qcm92aWRlcigpIHsKKwkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvblByb3ZpZGVyOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBnZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpIHsKKwkJcmV0dXJuIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpOworCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgorCQorCXB1YmxpYyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGdldEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIHR5cGUpIHsKKwkJZm9yIChKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24gOiAKKwkJCQlDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoamF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSkpIHsKKwkJCWlmIChkZWZpbml0aW9uLnRlc3QodHlwZSkpIHsKKwkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKKwkJCX0KKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBtdXN0IGJlIGEgbWFwcGluZyBkZWZpbml0aW9uIGZvciBhbGwgdHlwZXMiKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlwdWJsaWMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBnZXRKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KSB7CisJCWZvciAoSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBkZWZpbml0aW9uIDogCisJCQkJQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCkpKSB7CisJCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwoZGVmaW5pdGlvbi5nZXRLZXkoKSwgbWFwcGluZ0tleSkpIHsKKwkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKKwkJCX0KKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHR5cGUgbWFwcGluZyBrZXk6ICIgKyBtYXBwaW5nS2V5KTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24+IGphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCkgeworCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3ZpZGVyLmphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgorCQorCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbigKKwkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlmb3IgKEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBkZWZpbml0aW9uIDogCisJCQkJQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkpKSB7CisJCQlpZiAoZGVmaW5pdGlvbi50ZXN0RGVmYXVsdChhdHRyaWJ1dGUpKSB7CisJCQkJcmV0dXJuIGRlZmluaXRpb247CisJCQl9CisJCX0KKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgbXVzdCBiZSBhIG1hcHBpbmcgZGVmaW5pdGlvbiBmb3IgYWxsIGF0dHJpYnV0ZXMiKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvdmlkZXIuZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKKwl9CisJCisJcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oCisJCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJZm9yIChKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbiA6IAorCQkJCUNvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkpKSB7CisJCQlpZiAoZGVmaW5pdGlvbi50ZXN0U3BlY2lmaWVkKGF0dHJpYnV0ZSkpIHsKKwkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKKwkJCX0KKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBtdXN0IGJlIGEgbWFwcGluZyBkZWZpbml0aW9uIGZvciBhbGwgYXR0cmlidXRlcyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBzcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgeworCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3ZpZGVyLnNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKKwl9CisJCisJcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oU3RyaW5nIG1hcHBpbmdLZXkpIHsKKwkJZm9yIChKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbiA6IAorCQkJCUNvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkpKSB7CisJCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwoZGVmaW5pdGlvbi5nZXRLZXkoKSwgbWFwcGluZ0tleSkpIHsKKwkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKKwkJCX0KKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGF0dHJpYnV0ZSBtYXBwaW5nIGtleTogIiArIG1hcHBpbmdLZXkpOyAvLyROT04tTkxTLTEkCisJfQorCQorCQorCS8vICoqKioqKioqKiogcmVzb3VyY2UgdHlwZXMgYW5kIGRlZmluaXRpb25zICoqKioqKioqKioKKwkKKwlwdWJsaWMgUmVzb3VyY2VEZWZpbml0aW9uIGdldFJlc291cmNlRGVmaW5pdGlvbihKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7CisJCWZvciAoUmVzb3VyY2VEZWZpbml0aW9uIHJlc291cmNlRGVmaW5pdGlvbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShyZXNvdXJjZURlZmluaXRpb25zKCkpKSB7CisJCQlpZiAocmVzb3VyY2VEZWZpbml0aW9uLmdldFJlc291cmNlVHlwZSgpLmVxdWFscyhyZXNvdXJjZVR5cGUpKSB7CisJCQkJcmV0dXJuIHJlc291cmNlRGVmaW5pdGlvbjsKKwkJCX0KKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHJlc291cmNlIHR5cGU6ICIgKyByZXNvdXJjZVR5cGUpOyAvLyROT04tTkxTLTEkCisJfQorCQorCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UmVzb3VyY2VEZWZpbml0aW9uPiByZXNvdXJjZURlZmluaXRpb25zKCkgeworCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3ZpZGVyLnJlc291cmNlRGVmaW5pdGlvbnMoKTsKKwl9CisJCisJcHVibGljIEpwYVJlc291cmNlVHlwZSBnZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgeworCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3ZpZGVyLmdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoY29udGVudFR5cGUpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIGRhdGFiYXNlICoqKioqKioqKioKKworCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgeworCQlyZXR1cm4gSnB0RGJQbHVnaW4uaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKTsKKwl9CisKKwlwdWJsaWMgRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgZ2V0RW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKSB7CisJCXJldHVybiBHZW5lcmljRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuaW5zdGFuY2UoKTsKKwl9CisKKwlwdWJsaWMgRGF0YWJhc2VGaW5kZXIgZ2V0RGF0YWJhc2VGaW5kZXIoKSB7CisJCXJldHVybiBEYXRhYmFzZUZpbmRlci5EZWZhdWx0Lmluc3RhbmNlKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCisJCisJcHVibGljIEpwYVBsYXRmb3JtVmFyaWF0aW9uIGdldEpwYVZhcmlhdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuanBhVmFyaWF0aW9uOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9HZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZDIxYjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuR2VuZXJpY0pwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRGVmYXVsdFZlcnNpb25Db21wYXJhdG9yOworCisvKioKKyAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpQQSBwbGF0Zm9ybSBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlCisgKiBpdCBpcyBpbml0aWFsaXplZCkuCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5CisJaW1wbGVtZW50cyBKcGFQbGF0Zm9ybUZhY3RvcnkKK3sKKwkvKioKKwkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEdlbmVyaWNKcGFQbGF0Zm9ybUZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtKFN0cmluZyBpZCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybSgKKwkJCWlkLAorCQkJdGhpcy5idWlsZEpwYVZlcnNpb24oKSwKKwkJCW5ldyBHZW5lcmljSnBhRmFjdG9yeSgpLCAKKwkJCW5ldyBHZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyKEdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpLAorCQkJR2VuZXJpY0pwYVBsYXRmb3JtUHJvdmlkZXIuaW5zdGFuY2UoKSwgCisJCQl0aGlzLmJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSk7CisJfQorCQorCQorCXByaXZhdGUgSnBhUGxhdGZvcm0uVmVyc2lvbiBidWlsZEpwYVZlcnNpb24oKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVmVyc2lvbihKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzFfMCk7CisJfQorCQorCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBidWlsZEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgeworCQlyZXR1cm4gbmV3IEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgeworCQkJcHVibGljIFN1cHBvcnRlZCBnZXRUYWJsZVBlckNvbmNyZXRlQ2xhc3NJbmhlcml0YW5jZUlzU3VwcG9ydGVkKCkgeworCQkJCXJldHVybiBTdXBwb3J0ZWQuTUFZQkU7CisJCQl9CisJCQlwdWJsaWMgYm9vbGVhbiBpc0pvaW5UYWJsZU92ZXJyaWRhYmxlKCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfTsKKwl9CisKKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlVmVyc2lvbiBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtLlZlcnNpb24geworCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGpwYVZlcnNpb247CisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFN0cmluZz4gSlBBX1ZFUlNJT05fQ09NUEFSQVRPUiA9IG5ldyBEZWZhdWx0VmVyc2lvbkNvbXBhcmF0b3IoKTsKKworCQlwdWJsaWMgU2ltcGxlVmVyc2lvbihTdHJpbmcganBhVmVyc2lvbikgeworCQkJc3VwZXIoKTsKKwkJCXRoaXMuanBhVmVyc2lvbiA9IGpwYVZlcnNpb247CisJCX0KKworCQkvKioKKwkJICogVGhlIGdlbmVyaWMgcGxhdGZvcm0ncyB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBKUEEgdmVyc2lvbi4KKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKKwkJCXJldHVybiB0aGlzLmdldEpwYVZlcnNpb24oKTsKKwkJfQorCQkKKwkJcHVibGljIFN0cmluZyBnZXRKcGFWZXJzaW9uKCkgeworCQkJcmV0dXJuIHRoaXMuanBhVmVyc2lvbjsKKwkJfQorCisJCS8qKgorCQkgKiBGb3Igbm93LCBnZW5lcmljIHBsYXRmb3JtcyBhcmUgYmFja3dhcmQtY29tcGF0aWJsZS4KKwkJICovCisJCXB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZVdpdGhKcGFWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCQlyZXR1cm4gSlBBX1ZFUlNJT05fQ09NUEFSQVRPUi5jb21wYXJlKHRoaXMuanBhVmVyc2lvbiwgdmVyc2lvbikgPj0gMDsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gIkpQQSB2ZXJzaW9uOiAiICsgdGhpcy5nZXRKcGFWZXJzaW9uKCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9HZW5lcmljSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MWI2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbnRpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1YbWxEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOworCisvKioKKyAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpQQSBwbGF0Zm9ybSBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlCisgKiBpdCBpcyBpbml0aWFsaXplZCkuCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljSnBhUGxhdGZvcm1Qcm92aWRlcgorCWV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVByb3ZpZGVyCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiZ2VuZXJpYyI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybVByb3ZpZGVyIElOU1RBTkNFID0gCisJCW5ldyBHZW5lcmljSnBhUGxhdGZvcm1Qcm92aWRlcigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgR2VuZXJpY0pwYVBsYXRmb3JtUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKioKKwkKKwlwdWJsaWMgSnBhUmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7CisJCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7CisJCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOworCQl9CisJCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7CisJCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKKwkJfQorCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKSkgeworCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzFfMF9SRVNPVVJDRV9UWVBFOworCQl9CisJCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKSkgeworCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKKwkJfQorCQllbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29udGVudFR5cGUudG9TdHJpbmcoKSk7CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIGJ1aWxkUmVzb3VyY2VNb2RlbFByb3ZpZGVycygpIHsKKwkJLy8gb3JkZXIgc2hvdWxkIG5vdCBiZSBpbXBvcnRhbnQgaGVyZQorCQlyZXR1cm4gbmV3IEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIHsKKwkJCUphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKKwkJCUphclJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAorCQkJUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKKwkJCU9ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpfTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGROb25OdWxsSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCS8vIG9yZGVyIGRldGVybWluZWQgYnkgYW5hbHl6aW5nIG9yZGVyIHRoYXQgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uICh0b3BsaW5rKSB1c2VzCisJCXJldHVybiBuZXcgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKKwkJCUphdmFFbnRpdHlEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgeworCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiAodG9wbGluaykgdXNlcworCQlyZXR1cm4gbmV3IEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKKwkJCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCS8vIG9yZGVyIGRldGVybWluZWQgYnkgYW5hbHl6aW5nIG9yZGVyIHRoYXQgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIChlY2xpcHNlbGluaykgdXNlcworCQlyZXR1cm4gbmV3IEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKKwkJCUphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUlkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCl9OworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIE1hcHBpbmcgRmlsZXMgKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBSZXNvdXJjZURlZmluaXRpb25bXSBidWlsZFJlc291cmNlRGVmaW5pdGlvbnMoKSB7CisJCXJldHVybiBuZXcgUmVzb3VyY2VEZWZpbml0aW9uW10geworCQkJR2VuZXJpY1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJR2VuZXJpY09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFQcm9qZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkZDkzMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYVByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFEYXRhU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLlJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KcGFDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYVByb2plY3QgZXh0ZW5kcyBBYnN0cmFjdEpwYU5vZGUgaW1wbGVtZW50cyBKcGFQcm9qZWN0IHsKLQotCS8qKgotCSAqIFRoZSBFY2xpcHNlIHByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgSlBBIHByb2plY3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0KLQkvKioKLQkgKiBUaGUgdmVuZG9yLXNwZWNpZmljIEpQQSBwbGF0Zm9ybSB0aGF0IGJ1aWxkcyB0aGUgSlBBIHByb2plY3QKLQkgKiBhbmQgYWxsIGl0cyBjb250ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSnBhUGxhdGZvcm0ganBhUGxhdGZvcm07Ci0KLQkvKioKLQkgKiBUaGUgZGF0YSBzb3VyY2UgdGhhdCB3cmFwcyB0aGUgRFRQIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBKcGFEYXRhU291cmNlIGRhdGFTb3VyY2U7Ci0JCi0JLyoqCi0JICogQSBzY2hlbWEgbmFtZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBjb25uZWN0aW9uJ3MgZGVmYXVsdCBzY2hlbWEKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lOwotCi0JLyoqCi0JICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHByb2plY3Qgc2hvdWxkICJkaXNjb3ZlciIgYW5ub3RhdGVkCi0JICogY2xhc3NlcyBhdXRvbWF0aWNhbGx5LCBhcyBvcHBvc2VkIHRvIHJlcXVpcmluZyB0aGUgY2xhc3NlcyB0byBiZQotCSAqIGxpc3RlZCBpbiBwZXJzaXN0ZW5jZS54bWwuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlczsKLQotCS8qKgotCSAqIFRoZSBKUEEgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBKUEEgcHJvamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPEpwYUZpbGU+IGpwYUZpbGVzOwotCi0JLyoqCi0JICogVGhlIHJvb3Qgb2YgdGhlIG1vZGVsIHJlcHJlc2VudGluZyB0aGUgY29sbGF0ZWQgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCAKLQkgKiB0aGUgSlBBIHByb2plY3QuCi0JICovCi0JcHJvdGVjdGVkIEpwYVJvb3RDb250ZXh0Tm9kZSByb290Q29udGV4dE5vZGU7Ci0KLQkvKioKLQkgKiBTdXBwb3J0IGZvciBtb2RpZnlpbmcgZG9jdW1lbnRzIHNoYXJlZCB3aXRoIHRoZSBVSS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGhyZWFkTG9jYWw8Q29tbWFuZEV4ZWN1dG9yPiB0aHJlYWRMb2NhbE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yOwotCXByb3RlY3RlZCBmaW5hbCBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotCi0JLyoqCi0JICogQSBwbHVnZ2FibGUgdXBkYXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvICJ1cGRhdGUiIHRoZSBwcm9qZWN0IGVpdGhlcgotCSAqIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkgKG9yIG5vdCBhdCBhbGwpLiBBbiBhc3luY2hyb25vdXMKLQkgKiB1cGRhdGVyIGlzIHRoZSBkZWZhdWx0IGFuZCBpcyB1c2VkIHdoZW4gdGhlIHByb2plY3QgaXMgYmVpbmcgbWFuaXB1bGF0ZWQKLQkgKiBieSB0aGUgVUkuIEEgc3luY2hyb25vdXMgdXBkYXRlciBpcyB1c2VkIHdoZW4gdGhlIHByb2plY3QgaXMgYmVpbmcKLQkgKiBtYW5pcHVsYXRlZCBieSBhICJiYXRjaCIgKG9yIG5vbi1VSSkgY2xpZW50IChlLmcuIHdoZW4gdGVzdGluZyB0aGUKLQkgKiAidXBkYXRlIiBiZWhhdmlvcikuIEEgbnVsbCB1cGRhdGVyIGlzIHVzZWQgZHVyaW5nIHRlc3RzIHRoYXQKLQkgKiBkbyBub3QgY2FyZSB3aGV0aGVyICJ1cGRhdGVzIiBvY2N1ci4gQ2xpZW50cyB3aWxsIG5lZWQgdG8gZXhwbGljaXRseQotCSAqIGNvbmZpZ3VyZSB0aGUgdXBkYXRlciBpZiB0aGV5IHJlcXVpcmUgc29tZXRoaW5nIG90aGVyIHRoYW4gYW4KLQkgKiBhc3luY2hyb25vdXMgdXBkYXRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgVXBkYXRlciB1cGRhdGVyOwotCi0JLyoqCi0JICogUmVzb3VyY2UgbW9kZWxzIG5vdGlmeSB0aGlzIGxpc3RlbmVyIHdoZW4gdGhleSBjaGFuZ2UuIEEgcHJvamVjdCB1cGRhdGUKLQkgKiBzaG91bGQgb2NjdXIgYW55IHRpbWUgYSByZXNvdXJjZSBtb2RlbCBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZU1vZGVsTGlzdGVuZXIgcmVzb3VyY2VNb2RlbExpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBwcm9qZWN0IGFuZCBKUEEgcGxhdGZvcm0gYXJlIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBHZW5lcmljSnBhUHJvamVjdChKcGFQcm9qZWN0LkNvbmZpZyBjb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIobnVsbCk7ICAvLyBKUEEgcHJvamVjdCBpcyB0aGUgcm9vdCBvZiB0aGUgY29udGFpbm1lbnQgdHJlZQotCQlpZiAoKGNvbmZpZy5nZXRQcm9qZWN0KCkgPT0gbnVsbCkgfHwgKGNvbmZpZy5nZXRKcGFQbGF0Zm9ybSgpID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnByb2plY3QgPSBjb25maWcuZ2V0UHJvamVjdCgpOwotCQl0aGlzLmpwYVBsYXRmb3JtID0gY29uZmlnLmdldEpwYVBsYXRmb3JtKCk7Ci0JCXRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSnBhRGF0YVNvdXJjZSh0aGlzLCBjb25maWcuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCkpOwotCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lID0gY29uZmlnLmdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKCk7Ci0JCXRoaXMuZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcyA9IGNvbmZpZy5kaXNjb3ZlckFubm90YXRlZENsYXNzZXMoKTsKLQkJdGhpcy5qcGFGaWxlcyA9IHRoaXMuYnVpbGRFbXB0eUpwYUZpbGVzKCk7Ci0KLQkJdGhpcy50aHJlYWRMb2NhbE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yID0gdGhpcy5idWlsZFRocmVhZExvY2FsTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKTsKLQkJdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyID0gdGhpcy5idWlsZE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIoKTsKLQotCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lciA9IHRoaXMuYnVpbGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoKTsKLQkJLy8gYnVpbGQgdGhlIEpQQSBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBFY2xpcHNlIHByb2plY3QncyBmaWxlcwotCQl0aGlzLnByb2plY3QuYWNjZXB0KHRoaXMuYnVpbGRJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IoKSwgSVJlc291cmNlLk5PTkUpOwotCi0JCXRoaXMucm9vdENvbnRleHROb2RlID0gdGhpcy5idWlsZFJvb3RDb250ZXh0Tm9kZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzUGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFZlY3RvcjxKcGFGaWxlPiBidWlsZEVtcHR5SnBhRmlsZXMoKSB7Ci0JCXJldHVybiBuZXcgVmVjdG9yPEpwYUZpbGU+KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlRGVsdGFWaXNpdG9yIGJ1aWxkUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkTG9jYWw8Q29tbWFuZEV4ZWN1dG9yPiBidWlsZFRocmVhZExvY2FsTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXJldHVybiBuZXcgVGhyZWFkTG9jYWw8Q29tbWFuZEV4ZWN1dG9yPigpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBidWlsZE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcigpOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZU1vZGVsTGlzdGVuZXIgYnVpbGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFJlc291cmNlTW9kZWxMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBJUmVzb3VyY2VQcm94eVZpc2l0b3IgYnVpbGRJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IoKSB7Ci0JCXJldHVybiBuZXcgSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVJvb3RDb250ZXh0Tm9kZSBidWlsZFJvb3RDb250ZXh0Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkUm9vdENvbnRleHQodGhpcyk7Ci0JfQotCi0JLy8gKioqKiogaW5uZXIgY2xhc3MKLQlwcm90ZWN0ZWQgY2xhc3MgSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yIHsKLQkJcHJvdGVjdGVkIEluaXRpYWxSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gYWRkIGEgSlBBIGZpbGUgZm9yIGV2ZXJ5IFthcHByb3ByaWF0ZV0gZmlsZSBlbmNvdW50ZXJlZCBieSB0aGUgdmlzaXRvcgotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDogIC8vIHNob3VsZG4ndCBoYXBwZW4KLQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCQlyZXR1cm4gdHJ1ZTsgIC8vIHZpc2l0IGNoaWxkcmVuCi0JCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCUdlbmVyaWNKcGFQcm9qZWN0LnRoaXMuYWRkSnBhRmlsZUludGVybmFsKChJRmlsZSkgcmVzb3VyY2UucmVxdWVzdFJlc291cmNlKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbgotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbgotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYWwgcXVlcmllcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb2plY3QuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLnByb2plY3Q7Ci0JfQotCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZSh0aGlzLnByb2plY3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFQbGF0Zm9ybSBnZXRKcGFQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUGxhdGZvcm07Ci0JfQotCi0JcHVibGljIEpwYURhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVNvdXJjZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQl9Ci0JCi0JcHVibGljIFNjaGVtYSBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlTY2hlbWEgZGVmYXVsdFNjaGVtYSA9IGdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKTsKLQkJaWYgKGRlZmF1bHRTY2hlbWEgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlZmF1bHRTY2hlbWE7Ci0JCX0KLQkJcmV0dXJuIGdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQkKLQlwdWJsaWMgU2NoZW1hIGdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKSB7Ci0JCWlmICh0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldERhdGFiYXNlKCkuc2NoZW1hTmFtZWQodGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdXNlciBvdmVycmlkZSBkZWZhdWx0IHNjaGVtYSBuYW1lICoqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKCkgewotCQlyZXR1cm4gdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWUoU3RyaW5nIG5ld0RlZmF1bHRTY2hlbWFOYW1lKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0U2NoZW1hTmFtZSA9IHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWU7Ci0JCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWUgPSBuZXdEZWZhdWx0U2NoZW1hTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUFfTkFNRV9QUk9QRVJUWSwgCi0JCQkJb2xkRGVmYXVsdFNjaGVtYU5hbWUsIG5ld0RlZmF1bHRTY2hlbWFOYW1lKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBkaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoKSB7Ci0JCXJldHVybiB0aGlzLmRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoYm9vbGVhbiBkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzOwotCQl0aGlzLmRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMgPSBkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTQ09WRVJTX0FOTk9UQVRFRF9DTEFTU0VTX1BST1BFUlRZLCBvbGQsIGRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIEpQQSBmaWxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8SnBhRmlsZT4ganBhRmlsZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxKcGFGaWxlPih0aGlzLmpwYUZpbGVzKTsgIC8vIHJlYWQtb25seQotCX0KLQotCXB1YmxpYyBpbnQganBhRmlsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5qcGFGaWxlcy5zaXplKCk7Ci0JfQotCi0JcHVibGljIEpwYUZpbGUgZ2V0SnBhRmlsZShJRmlsZSBmaWxlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5qcGFGaWxlcykgewotCQkJZm9yIChKcGFGaWxlIGpwYUZpbGUgOiB0aGlzLmpwYUZpbGVzKSB7Ci0JCQkJaWYgKGpwYUZpbGUuZ2V0RmlsZSgpLmVxdWFscyhmaWxlKSkgewotCQkJCQlyZXR1cm4ganBhRmlsZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEpwYUZpbGU+IGpwYUZpbGVzKGZpbmFsIFN0cmluZyByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxKcGFGaWxlLCBKcGFGaWxlPih0aGlzLmpwYUZpbGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEpwYUZpbGUgbykgewotCQkJCXJldHVybiBvLmdldFJlc291cmNlVHlwZSgpLmVxdWFscyhyZXNvdXJjZVR5cGUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEFkZCBhIEpQQSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUsIGlmIGFwcHJvcHJpYXRlLgotCSAqIFJldHVybiB0cnVlIGlmIGEgSlBBIEZpbGUgd2FzIGNyZWF0ZWQgYW5kIGFkZGVkLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRKcGFGaWxlKElGaWxlIGZpbGUpIHsKLQkJSnBhRmlsZSBqcGFGaWxlID0gdGhpcy5hZGRKcGFGaWxlSW50ZXJuYWwoZmlsZSk7Ci0JCWlmIChqcGFGaWxlICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChKUEFfRklMRVNfQ09MTEVDVElPTiwganBhRmlsZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgSlBBIGZpbGUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZSwgaWYgYXBwcm9wcmlhdGUsIHdpdGhvdXQgZmlyaW5nCi0JICogYW4gZXZlbnQ7IHVzZWZ1bCBkdXJpbmcgY29uc3RydWN0aW9uLgotCSAqIFJldHVybiB0aGUgbmV3IEpQQSBmaWxlLCBudWxsIGlmIGl0IHdhcyBub3QgY3JlYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSnBhRmlsZSBhZGRKcGFGaWxlSW50ZXJuYWwoSUZpbGUgZmlsZSkgewotCQlKcGFGaWxlIGpwYUZpbGUgPSB0aGlzLmpwYVBsYXRmb3JtLmJ1aWxkSnBhRmlsZSh0aGlzLCBmaWxlKTsKLQkJaWYgKGpwYUZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdGhpcy5qcGFGaWxlcy5hZGQoanBhRmlsZSk7Ci0JCWpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpLmFkZFJlc291cmNlTW9kZWxDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcik7Ci0JCXJldHVybiBqcGFGaWxlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgSlBBIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIElGaWxlLCBpZiBpdCBleGlzdHMuCi0JICogUmV0dXJuIHRydWUgaWYgYSBKUEEgRmlsZSB3YXMgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSnBhRmlsZShJRmlsZSBmaWxlKSB7Ci0JCUpwYUZpbGUganBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZShmaWxlKTsKLQkJaWYgKGpwYUZpbGUgIT0gbnVsbCkgeyAvL2EgSnBhRmlsZSBpcyBub3QgYWRkZWQgZm9yIGV2ZXJ5IElGaWxlCi0JCQlyZW1vdmVKcGFGaWxlKGpwYUZpbGUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIEpQQSBmaWxlIGFuZCBkaXNwb3NlIG9mIGl0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSnBhRmlsZShKcGFGaWxlIGpwYUZpbGUpIHsKLQkJanBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCkucmVtb3ZlUmVzb3VyY2VNb2RlbENoYW5nZUxpc3RlbmVyKHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyKTsKLQkJanBhRmlsZS5kaXNwb3NlKCk7Ci0JCWlmICggISB0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihqcGFGaWxlLCB0aGlzLmpwYUZpbGVzLCBKUEFfRklMRVNfQ09MTEVDVElPTikpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkpQQSBmaWxlOiAiICsganBhRmlsZS5nZXRGaWxlKCkuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zSnBhRmlsZShJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiAodGhpcy5nZXRKcGFGaWxlKGZpbGUpICE9IG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250ZXh0IG1vZGVsICoqKioqKioqKioKLQotCXB1YmxpYyBKcGFSb290Q29udGV4dE5vZGUgZ2V0Um9vdENvbnRleHQoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3RDb250ZXh0Tm9kZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbW9yZSBxdWVyaWVzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFubm90YXRlZENsYXNzTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSwgU3RyaW5nPih0aGlzLmFubm90YXRlZEphdmFQZXJzaXN0ZW50VHlwZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IGFubm90YXRlZEphdmFQZXJzaXN0ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPih0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgewotCQkJCXJldHVybiAocGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgPyBmYWxzZSA6IHBlcnNpc3RlbnRUeXBlLmlzUGVyc2lzdGVkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEpwYUNvbXBpbGF0aW9uVW5pdCwgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+PihqcGFDb21waWxhdGlvblVuaXRSZXNvdXJjZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gdHJhbnNmb3JtKEpwYUNvbXBpbGF0aW9uVW5pdCBuZXh0KSB7Ci0JCQkJCWlmIChuZXh0LmdldFBlcnNpc3RlbnRUeXBlKCkgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPihuZXh0LmdldFBlcnNpc3RlbnRUeXBlKCksIG5leHQuZ2V0UGVyc2lzdGVudFR5cGUoKS5uZXN0ZWRUeXBlcygpKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8SnBhRmlsZT4gamF2YUpwYUZpbGVzKCkgewotCQlyZXR1cm4gdGhpcy5qcGFGaWxlcyhSZXNvdXJjZU1vZGVsLkpBVkFfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYXRvcjxKcGFDb21waWxhdGlvblVuaXQ+IGpwYUNvbXBpbGF0aW9uVW5pdFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEpwYUZpbGUsIEpwYUNvbXBpbGF0aW9uVW5pdD4odGhpcy5qYXZhSnBhRmlsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhQ29tcGlsYXRpb25Vbml0IHRyYW5zZm9ybShKcGFGaWxlIGpwYUZpbGUpIHsKLQkJCQlyZXR1cm4gKChKYXZhUmVzb3VyY2VNb2RlbCkganBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCkpLmdldEpwYUNvbXBpbGF0aW9uVW5pdCgpOwotCQkJfQotCQl9OwotCX0KLQotCS8vIGxvb2sgZm9yIGJpbmFyeSBzdHVmZiBoZXJlLi4uCi0JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKFN0cmluZyB0eXBlTmFtZSkgewotCQlmb3IgKEpwYUNvbXBpbGF0aW9uVW5pdCBqcENvbXBpbGF0aW9uVW5pdFJlc291cmNlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuanBhQ29tcGlsYXRpb25Vbml0UmVzb3VyY2VzKCkpKSB7Ci0JCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcHRyID0gIGpwQ29tcGlsYXRpb25Vbml0UmVzb3VyY2UuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UodHlwZU5hbWUpOwotCQkJaWYgKGpwdHIgIT0gbnVsbCkgewotCQkJCXJldHVybiBqcHRyOwotCQkJfQotCQl9Ci0vLwkJdGhpcy5qYXZhUHJvamVjdCgpLmZpbmRUeXBlKHR5cGVOYW1lKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgY2hhbmdlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoSXRlcmF0b3I8SnBhRmlsZT4gc3RyZWFtID0gdGhpcy5qcGFGaWxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXN0cmVhbS5uZXh0KCkuamF2YUVsZW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgSXRlcmF0b3I8SU1lc3NhZ2U+IHZhbGlkYXRpb25NZXNzYWdlcygpIHsKLQkJTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0PElNZXNzYWdlPigpOwotCQl0aGlzLmpwYVBsYXRmb3JtLmFkZFRvTWVzc2FnZXModGhpcywgbWVzc2FnZXMpOwotCQlyZXR1cm4gbWVzc2FnZXMuaXRlcmF0b3IoKTsKLQl9Ci0JCi0JLyogSWYgdGhpcyBpcyB0cnVlLCBpdCBtYXkgYmUgYXNzdW1lZCB0aGF0IGFsbCB0aGUgcmVxdWlyZW1lbnRzIGFyZSB2YWxpZCAKLQkgKiBmb3IgZnVydGhlciB2YWxpZGF0aW9uLiAgRm9yIGV4YW1wbGUsIGlmIHRoaXMgaXMgdHJ1ZSBhdCB0aGUgcG9pbnQgd2UKLQkgKiBhcmUgdmFsaWRhdGluZyBwZXJzaXN0ZW5jZSB1bml0cywgaXQgbWF5IGJlIGFzc3VtZWQgdGhhdCB0aGVyZSBpcyBhIAotCSAqIHNpbmdsZSBwZXJzaXN0ZW5jZS54bWwgYW5kIHRoYXQgaXQgaGFzIHZhbGlkIGNvbnRlbnQgZG93biB0byB0aGUgCi0JICogcGVyc2lzdGVuY2UgdW5pdCBsZXZlbC4gICovCi0JcHJpdmF0ZSBib29sZWFuIG9rVG9Db250aW51ZVZhbGlkYXRpb24gPSB0cnVlOwotCQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJLy9zdGFydCB3aXRoIHRoZSBwcm9qZWN0IC0gdGhlbiBkb3duCi0JCS8vcHJvamVjdCB2YWxpZGF0aW9uCi0JCWFkZFByb2plY3RMZXZlbE1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJCi0JCS8vY29udGV4dCBtb2RlbCB2YWxpZGF0aW9uCi0JCWdldFJvb3RDb250ZXh0KCkuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvamVjdExldmVsTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJYWRkQ29ubmVjdGlvbk1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJYWRkTXVsdGlwbGVQZXJzaXN0ZW5jZVhtbE1lc3NhZ2UobWVzc2FnZXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0aW9uTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJYWRkTm9Db25uZWN0aW9uTWVzc2FnZShtZXNzYWdlcyk7Ci0JCWFkZEludmFsaWRDb25uZWN0aW9uTWVzc2FnZShtZXNzYWdlcyk7Ci0JCWFkZEluYWN0aXZlQ29ubmVjdGlvbk1lc3NhZ2UobWVzc2FnZXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBva1RvUHJvY2VlZEZvckNvbm5lY3Rpb25WYWxpZGF0aW9uID0gdHJ1ZTsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGROb0Nvbm5lY3Rpb25NZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2V0RGF0YVNvdXJjZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX05PX0NPTk5FQ1RJT04sCi0JCQkJCQl0aGlzKQotCQkJCSk7Ci0JCQlva1RvUHJvY2VlZEZvckNvbm5lY3Rpb25WYWxpZGF0aW9uID0gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW52YWxpZENvbm5lY3Rpb25NZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmIChva1RvUHJvY2VlZEZvckNvbm5lY3Rpb25WYWxpZGF0aW9uICYmICEgdGhpcy5nZXREYXRhU291cmNlKCkuaGFzQUNvbm5lY3Rpb24oKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX0lOVkFMSURfQ09OTkVDVElPTiwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXREYXRhU291cmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCl9LAotCQkJCQkJdGhpcykKLQkJCQkpOwotCQkJb2tUb1Byb2NlZWRGb3JDb25uZWN0aW9uVmFsaWRhdGlvbiA9IGZhbHNlOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEluYWN0aXZlQ29ubmVjdGlvbk1lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKG9rVG9Qcm9jZWVkRm9yQ29ubmVjdGlvblZhbGlkYXRpb24gJiYgISB0aGlzLmdldERhdGFTb3VyY2UoKS5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUFJPSkVDVF9JTkFDVElWRV9DT05ORUNUSU9OLAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldERhdGFTb3VyY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKX0sCi0JCQkJCQl0aGlzKQotCQkJCSk7Ci0JCX0KLQkJb2tUb1Byb2NlZWRGb3JDb25uZWN0aW9uVmFsaWRhdGlvbiA9IHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE11bHRpcGxlUGVyc2lzdGVuY2VYbWxNZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0vLwkJaWYgKHZhbGlkUGVyc2lzdGVuY2VYbWxGaWxlcy5zaXplKCkgPiAxKSB7Ci0vLwkJCW1lc3NhZ2VzLmFkZCgKLS8vCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotLy8JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotLy8JCQkJCQlJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfTVVMVElQTEVfUEVSU0lTVEVOQ0VfWE1MLAotLy8JCQkJCQlqcGFQcm9qZWN0KQotLy8JCQkJKTsKLS8vCQkJb2tUb0NvbnRpbnVlVmFsaWRhdGlvbiA9IGZhbHNlOwotLy8JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiByb290IGRlcGxveSBsb2NhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfUFJPSkVDVF9ST09UX0RFUExPWV9MT0NBVElPTiA9IEoyRUVDb25zdGFudHMuV0VCX0lORl9DTEFTU0VTOwotCi0JcHVibGljIFN0cmluZyBnZXRSb290RGVwbG95TG9jYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmlzV2ViUHJvamVjdCgpID8gV0VCX1BST0pFQ1RfUk9PVF9ERVBMT1lfTE9DQVRJT04gOiAiIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKU1RfV0VCX01PRFVMRSA9IElNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dlYlByb2plY3QoKSB7Ci0JCXJldHVybiBKcHRDb3JlUGx1Z2luLnByb2plY3RIYXNXZWJGYWNldCh0aGlzLnByb2plY3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh0aGlzLnVwZGF0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy51cGRhdGVyLmRpc3Bvc2UoKTsKLQkJfQotCQkvLyB1c2UgY2xvbmUgaXRlcmF0b3Igd2hpbGUgZGVsZXRpbmcgSlBBIGZpbGVzCi0JCWZvciAoSXRlcmF0b3I8SnBhRmlsZT4gc3RyZWFtID0gdGhpcy5qcGFGaWxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucmVtb3ZlSnBhRmlsZShzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQl0aGlzLmRhdGFTb3VyY2UuZGlzcG9zZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBtb2RlbCBsaXN0ZW5lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdFJlc291cmNlTW9kZWxMaXN0ZW5lciBpbXBsZW1lbnRzIFJlc291cmNlTW9kZWxMaXN0ZW5lciB7Ci0JCXByb3RlY3RlZCBEZWZhdWx0UmVzb3VyY2VNb2RlbExpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZXNvdXJjZU1vZGVsQ2hhbmdlZCgpIHsKLQkJCUdlbmVyaWNKcGFQcm9qZWN0LnRoaXMudXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaGFuZGxpbmcgcmVzb3VyY2UgZGVsdGFzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplSnBhRmlsZXMoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VEZWx0YVZpc2l0b3IgcmVzb3VyY2VEZWx0YVZpc2l0b3IgPSB0aGlzLmJ1aWxkUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKLQkJZGVsdGEuYWNjZXB0KHJlc291cmNlRGVsdGFWaXNpdG9yKTsKLQkJaWYgKHJlc291cmNlRGVsdGFWaXNpdG9yLmpwYUZpbGVzQ2hhbmdlZCgpKSB7Ci0JCQlmb3IoSnBhRmlsZSBqcGFGaWxlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGpwYUZpbGVzKCkpKSB7Ci0JCQkJanBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCkucmVzb2x2ZVR5cGVzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZXNvdXJjZSBkZWx0YSB2aXNpdG9yIGNhbGxiYWNrCi0JICogUmV0dXJuIHRydWUgaWYgYSBKcGFGaWxlIHdhcyBlaXRoZXIgYWRkZWQgb3IgcmVtb3ZlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN5bmNocm9uaXplSnBhRmlsZXMoSUZpbGUgZmlsZSwgaW50IGRlbHRhS2luZCkgewotCQlzd2l0Y2ggKGRlbHRhS2luZCkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6Ci0JCQkJcmV0dXJuIHRoaXMuYWRkSnBhRmlsZShmaWxlKTsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6Ci0JCQkJcmV0dXJuIHRoaXMucmVtb3ZlSnBhRmlsZShmaWxlKTsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEX1BIQU5UT00gOgotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEX1BIQU5UT00gOgotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7ICAvLyBvbmx5IHdvcnJpZWQgYWJvdXQgYWRkZWQgYW5kIHJlbW92ZWQgZmlsZXMKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAqKioqKiBpbm5lciBjbGFzcwotCS8qKgotCSAqIGFkZCBhIEpQQSBmaWxlIGZvciBldmVyeSBbYXBwcm9wcmlhdGVdIGZpbGUgZW5jb3VudGVyZWQgYnkgdGhlIHZpc2l0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQlwcml2YXRlIGJvb2xlYW4ganBhRmlsZXNDaGFuZ2VkID0gZmFsc2U7Ci0JCQotCQlwcm90ZWN0ZWQgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJUmVzb3VyY2UgcmVzID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCXN3aXRjaCAocmVzLmdldFR5cGUoKSkgewotCQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJCXJldHVybiB0cnVlOyAgLy8gdmlzaXQgY2hpbGRyZW4KLQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQkJaWYgKEdlbmVyaWNKcGFQcm9qZWN0LnRoaXMuc3luY2hyb25pemVKcGFGaWxlcygoSUZpbGUpIHJlcywgZGVsdGEuZ2V0S2luZCgpKSkgewotCQkJCQkJdGhpcy5qcGFGaWxlc0NoYW5nZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsgIC8vIG5vIGNoaWxkcmVuCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBmYWxzZTsgIC8vIG5vIGNoaWxkcmVuCi0JCQl9Ci0JCX0KLQkJLyoqCi0JCSAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBKUEEgZmlsZXMgY29sbGVjdGlvbiB3YXMgbW9kaWZpZWQgd2hpbGUKLQkJICogdHJhdmVyc2luZyB0aGUgSVJlc291cmNlRGVsdGEuICBSZXR1cm4gdHJ1ZSBpZiBhIEpQQSBmaWxlIHdhcyBhZGRlZC9yZW1vdmVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBqcGFGaWxlc0NoYW5nZWQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qcGFGaWxlc0NoYW5nZWQ7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3VwcG9ydCBmb3IgbW9kaWZ5aW5nIGRvY3VtZW50cyBzaGFyZWQgd2l0aCB0aGUgVUkgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgdGhlcmUgaXMgbm8gdGhyZWFkLXNwZWNpZmljIGNvbW1hbmQgZXhlY3V0b3IsIHVzZSB0aGUgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uLCB3aGljaCBzaW1wbHkgZXhlY3V0ZXMgdGhlIGNvbW1hbmQgZGlyZWN0bHkuCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRFeGVjdXRvciBnZXRUaHJlYWRMb2NhbE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCkgewotCQlDb21tYW5kRXhlY3V0b3IgY2UgPSB0aGlzLnRocmVhZExvY2FsTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IuZ2V0KCk7Ci0JCXJldHVybiAoY2UgIT0gbnVsbCkgPyBjZSA6IENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGhyZWFkTG9jYWxNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcihDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMudGhyZWFkTG9jYWxNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvci5zZXQoY29tbWFuZEV4ZWN1dG9yKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcigpIHsKLQkJcmV0dXJuIHRoaXMubW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcjsKLQl9Ci0KLQkvLyAqKioqKiBpbm5lciBjbGFzcwotCXByb3RlY3RlZCBjbGFzcyBNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyIGltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgewotCQlwcm90ZWN0ZWQgTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIENvbW1hbmRFeGVjdXRvciBnZXRDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0pwYVByb2plY3QudGhpcy5nZXRUaHJlYWRMb2NhbE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvamVjdCAidXBkYXRlIiAqKioqKioqKioqCi0KLQlwdWJsaWMgVXBkYXRlciBnZXRVcGRhdGVyKCkgewotCQlyZXR1cm4gdGhpcy51cGRhdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZXIoVXBkYXRlciB1cGRhdGVyKSB7Ci0JCWlmICh0aGlzLnVwZGF0ZXIgIT0gbnVsbCkgeyAgLy8gZmlyc3QgdGltZSB0aHJvdWdoLCB0aGUgdXBkYXRlciB3aWxsIGJlIG51bGwKLQkJCXRoaXMudXBkYXRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJdGhpcy51cGRhdGVyID0gdXBkYXRlcjsKLQkJdGhpcy51cGRhdGVyLnN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogRGVsZWdhdGUgdG8gdGhlIHVwZGF0ZXIgc28gY2xpZW50cyBjYW4gY29uZmlndXJlIGhvdyB1cGRhdGVzIG9jY3VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJaWYgKHRoaXMudXBkYXRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1cGRhdGVyIGlzIG51bGwsIHVzZSBzZXRVcGRhdGVyKFVwZGF0ZXIpIGFmdGVyIGNvbnN0cnVjdGlvbiBvZiBHZW5lcmljSnBhUHJvamVjdCIpOwotCQl9Ci0JCXRoaXMudXBkYXRlci51cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgdGhlIHVwZGF0ZXIuCi0JICovCi0JcHVibGljIElTdGF0dXMgdXBkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJdGhpcy5nZXRSb290Q29udGV4dCgpLnVwZGF0ZShtb25pdG9yKTsKLQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQkvLyBFeGNlcHRpb25zIGNhbiBvY2N1ciB3aGVuIHRoZSB1cGRhdGUgaXMgcnVubmluZyBhbmQgY2hhbmdlcyBhcmUKLQkJCS8vIG1hZGUgY29uY3VycmVudGx5IHRvIHRoZSBKYXZhIHNvdXJjZS4gV2hlbiB0aGF0IGhhcHBlbnMsIG91cgotCQkJLy8gbW9kZWwgbWlnaHQgYmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlIGJlY2F1c2UgaXQgaXMgbm90IHlldCBpbgotCQkJLy8gc3luYyB3aXRoIHRoZSBjaGFuZ2VkIEphdmEgc291cmNlLgotCQkJLy8gTG9nIHRoZXNlIGV4Y2VwdGlvbnMgYW5kIGFzc3VtZSB0aGV5IHdvbid0IGhhcHBlbiB3aGVuIHRoZQotCQkJLy8gdXBkYXRlIHJ1bnMgYWdhaW4gYXMgYSByZXN1bHQgb2YgdGhlIGNvbmN1cnJlbnQgSmF2YSBzb3VyY2UgY2hhbmdlcy4KLQkJCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzQ3ZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0phclJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVBhY2thZ2VGcmFnbWVudFJvb3Q7CisKKy8qKgorICogSkFSIGZpbGVzCisgKi8KK3B1YmxpYyBjbGFzcyBKYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXIKKwlpbXBsZW1lbnRzIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVJlc291cmNlTW9kZWxQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXIoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEphclJlc291cmNlTW9kZWxQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgeworCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVJfQ09OVEVOVF9UWVBFOworCX0KKworCS8qKgorCSAqIE5COiBEZXNwaXRlIHRoZSBjaGVjayBpbiBHZW5lcmljSnBhUHJvamVjdC5hZGRKcGFGaWxlXyhJRmlsZSksCisJICogd2UgY2FuIGdldCBoZXJlIGFuZAorCSAqIHRoZSBQRlIgd2lsbCBiZSBudWxsIGlmIHRoZSBKQVIgaXMgdW5kZXJuZWF0aCBhIGRpcmVjdG9yeSBvbiB0aGUKKwkgKiBjbGFzc3BhdGggYnV0IHRoZSBKQVIgaXRzZWxmIGlzIG5vdCBvbiB0aGUgY2xhc3NwYXRoLgorCSAqIFJldHVybmluZyBudWxsIHNob3VsZCBiZSBPSy4KKwkgKi8KKwlwdWJsaWMgSnBhUmVzb3VyY2VNb2RlbCBidWlsZFJlc291cmNlTW9kZWwoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlKSB7CisJCUlQYWNrYWdlRnJhZ21lbnRSb290IHBmciA9IEphdmFDb3JlLmNyZWF0ZUphclBhY2thZ2VGcmFnbWVudFJvb3RGcm9tKGZpbGUpOworCQlyZXR1cm4gKHBmciA9PW51bGwpID8gbnVsbCA6IG5ldyBCaW5hcnlQYWNrYWdlRnJhZ21lbnRSb290KHBmciwganBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpLmdldEFubm90YXRpb25Qcm92aWRlcigpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODdjMDMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ7CisKKy8qKgorICogSmF2YSBzb3VyY2UgY29kZQorICovCitwdWJsaWMgY2xhc3MgSmF2YVJlc291cmNlTW9kZWxQcm92aWRlcgorCWltcGxlbWVudHMgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKKwkJcmV0dXJuIEpwdENvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFOworCX0KKworCXB1YmxpYyBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgYnVpbGRSZXNvdXJjZU1vZGVsKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSkgeworCQlyZXR1cm4gbmV3IFNvdXJjZUNvbXBpbGF0aW9uVW5pdCgKKwkJCQkJSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlKSwKKwkJCQkJanBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpLmdldEFubm90YXRpb25Qcm92aWRlcigpLAorCQkJCQlqcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkuZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKSwKKwkJCQkJanBhUHJvamVjdC5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpCisJCQkJKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFNb2RlbE1hbmFnZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFNb2RlbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyMWUzOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhTW9kZWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU9wZW5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wcmVmcy5KcGFQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpdFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklQcm9qZWN0RmFjZXRBY3Rpb25FdmVudDsKLQotLyoqCi0gKiAiSW50ZXJuYWwiIGdsb2JhbCBzdHVmZi4KLSAqIFByb3ZpZGUgYWNjZXNzIHZpYSBhIHNpbmdsZXRvbi4KLSAqIEhvbGQgYW5kIG1hbmFnZSB0aGUgSlBBIG1vZGVsICh3aGljaCBob2xkcyBhbGwgdGhlIEpQQSBwcm9qZWN0cykKLSAqIGFuZCB0aGUgdmFyaW91cyBnbG9iYWwgbGlzdGVuZXJzLiBXZSBhdHRlbXB0IHRvIGRldGVybWluZSB3aGV0aGVyIGV2ZW50cwotICogYXJlIHJlbGV2YW50IGJlZm9yZSBmb3J3YXJkaW5nIHRoZW0gdG8gdGhlIEpQQSBtb2RlbC4KLSAqIAotICogVmFyaW91cyB0aGluZ3MgdGhhdCBjYXVzZSB1cyB0byBhZGQgb3IgcmVtb3ZlIGEgSlBBIHByb2plY3Q6Ci0gKiAtIFN0YXJ0dXAgb2YgdGhlIERhbGkgcGx1Zy1pbiB3aWxsIHRyaWdnZXIgYWxsIHRoZSBKUEEgcHJvamVjdHMgdG8gYmUgYWRkZWQKLSAqIAotICogLSBQcm9qZWN0IGNyZWF0ZWQgYW5kIGZhY2V0IGluc3RhbGxlZAotICogICAgIGZhY2V0IFBPU1RfSU5TVEFMTAotICogLSBQcm9qZWN0IGZhY2V0IHVuaW5zdGFsbGVkCi0gKiAgICAgZmFjZXQgUFJFX1VOSU5TVEFMTAotICogCi0gKiAtIFByb2plY3Qgb3BlbmVkCi0gKiAgICAgZmFjZXQgUFJPSkVDVF9NT0RJRklFRAotICogLSBQcm9qZWN0IGNsb3NlZAotICogICAgIGZhY2V0IFBST0pFQ1RfTU9ESUZJRUQKLSAqIAotICogLSBQcmUtZXhpc3RpbmcgcHJvamVjdCBpbXBvcnRlZCAoY3JlYXRlZCBhbmQgb3BlbmVkKQotICogICAgIHJlc291cmNlIFBPU1RfQ0hBTkdFIC0+IFBST0pFQ1QgLT4gQ0hBTkdFRCAtPiBPUEVOCi0gKiAtIFByb2plY3QgZGVsZXRlZAotICogICAgIHJlc291cmNlIFBSRV9ERUxFVEUKLSAqIAotICogLSBQcm9qZWN0IGZhY2V0IGluc3RhbGxlZCBieSBlZGl0aW5nIHRoZSBmYWNldHMgc2V0dGluZ3MgZmlsZSBkaXJlY3RseQotICogICAgIGZhY2V0IFBST0pFQ1RfTU9ESUZJRUQKLSAqIC0gUHJvamVjdCBmYWNldCB1bmluc3RhbGxlZCBieSBlZGl0aW5nIHRoZSBmYWNldHMgc2V0dGluZ3MgZmlsZSBkaXJlY3RseQotICogICAgIGZhY2V0IFBST0pFQ1RfTU9ESUZJRUQKLSAqLwotcHVibGljIGNsYXNzIEpwYU1vZGVsTWFuYWdlciB7Ci0KLQkvKioKLQkgKiBUaGUgSlBBIG1vZGVsIC0gbnVsbCB1bnRpbCB0aGUgcGx1Zy1pbiBpcyBzdGFydGVkLgotCSAqLwotCXByaXZhdGUgR2VuZXJpY0pwYU1vZGVsIGpwYU1vZGVsOwotCi0JLyoqCi0JICogTGlzdGVuIGZvciBjaGFuZ2VzIHRvIHByb2plY3RzIGFuZCBmaWxlcy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBMaXN0ZW4gZm9yIHRoZSBKUEEgZmFjZXQgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIGEgcHJvamVjdC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBMaXN0ZW4gZm9yIEphdmEgY2hhbmdlcyBhbmQgZm9yd2FyZCB0aGVtIHRvIHRoZSBKUEEgbW9kZWwsCi0JICogd2hpY2ggd2lsbCBmb3J3YXJkIHRoZW0gdG8gdGhlIEpQQSBwcm9qZWN0cy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBMaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlICJEZWZhdWx0IEpQQSBMaWIiIHByZWZlcmVuY2UKLQkgKiBzbyB3ZSBjYW4gdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzcGF0aCB2YXJpYWJsZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByZWZlcmVuY2VzTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYU1vZGVsTWFuYWdlciBJTlNUQU5DRSA9IG5ldyBKcGFNb2RlbE1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uIEpQQSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhTW9kZWxNYW5hZ2VyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFByaXZhdGUgLSBlbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSnBhTW9kZWxNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLnJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgPSBuZXcgRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpOwotCQl0aGlzLmphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIgPSBuZXcgSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnByZWZlcmVuY2VzTGlzdGVuZXIgPSBuZXcgUHJlZmVyZW5jZXNMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwbHVnLWluIGNvbnRyb2xsZWQgbGlmZS1jeWNsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBpbnRlcm5hbCAtIGNhbGxlZCBieSBKcHRDb3JlUGx1Z2luCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWRlYnVnKCIqKiogU1RBUlQgSlBBIG1vZGVsIG1hbmFnZXIgKioqIik7Ci0JCXRyeSB7Ci0JCQl0aGlzLmpwYU1vZGVsID0gbmV3IEdlbmVyaWNKcGFNb2RlbCgpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5yZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJCUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmFkZExpc3RlbmVyKHRoaXMuZmFjZXRlZFByb2plY3RMaXN0ZW5lciwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS52YWx1ZXMoKSk7Ci0JCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcik7Ci0JCQlKcHRDb3JlUGx1Z2luLmluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZXNMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCXRoaXMubG9nKGV4KTsKLQkJCXRoaXMuc3RvcCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaW50ZXJuYWwgLSBjYWxsZWQgYnkgSnB0Q29yZVBsdWdpbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWRlYnVnKCIqKiogU1RPUCBKUEEgbW9kZWwgbWFuYWdlciAqKioiKTsKLQkJSnB0Q29yZVBsdWdpbi5pbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VzTGlzdGVuZXIpOwotCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcik7Ci0JCUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLnJlbW92ZUxpc3RlbmVyKHRoaXMuZmFjZXRlZFByb2plY3RMaXN0ZW5lcik7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMucmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuanBhTW9kZWwuZGlzcG9zZSgpOwotCQl0aGlzLmpwYU1vZGVsID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgd29ya3NwYWNlLXdpZGUgSlBBIG1vZGVsLgotCSAqLwotCXB1YmxpYyBKcGFNb2RlbCBnZXRKcGFNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuanBhTW9kZWw7Ci0JfQotCi0JLyoqIAotCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdCwKLQkgKiBvciBudWxsIGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIHNwZWNpZmllZCBwcm9qZWN0IHdpdGggYQotCSAqIEpQQSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qcGFNb2RlbC5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgZmlsZSwKLQkgKiBvciBudWxsIGlmIHVuYWJsZSB0byBhc3NvY2lhdGUgdGhlIHNwZWNpZmllZCBmaWxlIHdpdGggYSBKUEEgZmlsZS4KLQkgKi8KLQlwdWJsaWMgSnBhRmlsZSBnZXRKcGFGaWxlKElGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuanBhTW9kZWwuZ2V0SnBhRmlsZShmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgSlBBIHNldHRpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdAotCSAqIGhhdmUgY2hhbmdlZCBpbiBzdWNoIGEgd2F5IGFzIHRvIHJlcXVpcmUgdGhlIGFzc29jaWF0ZWQKLQkgKiBKUEEgcHJvamVjdCB0byBiZSBjb21wbGV0ZWx5IHJlYnVpbHQKLQkgKiAoZS5nLiB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgYSBwcm9qZWN0J3MgSlBBIHBsYXRmb3JtKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWJ1aWxkSnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMuanBhTW9kZWwucmVidWlsZEpwYVByb2plY3QocHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgc3RhdHVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlKcHRDb3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgIH0KLQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLQkJSnB0Q29yZVBsdWdpbi5sb2cobXNnKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gb3IgZXJyb3IuCi0JICovCi0JcHVibGljIHZvaWQgbG9nKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJSnB0Q29yZVBsdWdpbi5sb2codGhyb3dhYmxlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgY2hhbmdlZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDaGVjayBmb3I6Ci0JICogICAtIHByb2plY3QgY2xvc2UvZGVsZXRlCi0JICogICAtIGZpbGUgYWRkL3JlbW92ZQotCSAqLwotCS8qIHByaXZhdGUgKi8gdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCEgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSVdvcmtzcGFjZSkpIHsKLQkJCXJldHVybjsgIC8vIHRoaXMgcHJvYmFibHkgc2hvdWxkbid0IGhhcHBlbi4uLgotCQl9Ci0JCXN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKXsKLQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSA6ICAvLyBwcm9qZWN0LW9ubHkgZXZlbnQKLQkJCQl0aGlzLnJlc291cmNlUHJlRGVsZXRlKGV2ZW50KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgOgotCQkJCXRoaXMucmVzb3VyY2VQb3N0Q2hhbmdlKGV2ZW50KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIDogIC8vIHByb2plY3Qtb25seSBldmVudAotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQgOgotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEIDoKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBwcm9qZWN0IGlzIGJlaW5nIGRlbGV0ZWQuIFJlbW92ZSBpdHMgY29ycmVzcG9uZGluZwotCSAqIEpQQSBwcm9qZWN0IGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXByaXZhdGUgdm9pZCByZXNvdXJjZVByZURlbGV0ZShJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlkZWJ1ZygiUmVzb3VyY2UgKFByb2plY3QpIFBSRV9ERUxFVEU6ICIgKyBldmVudC5nZXRSZXNvdXJjZSgpKTsKLQkJdGhpcy5qcGFNb2RlbC5wcm9qZWN0UHJlRGVsZXRlKChJUHJvamVjdCkgZXZlbnQuZ2V0UmVzb3VyY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQSByZXNvdXJjZSBoYXMgY2hhbmdlZCBzb21laG93LgotCSAqIENoZWNrIGZvciBmaWxlcyBiZWluZyBhZGRlZCBvciByZW1vdmVkLgotCSAqIChUaGUgSlBBIHByb2plY3Qgb25seSBoYW5kbGVzIGFkZGVkIGFuZCByZW1vdmVkIGZpbGVzIGhlcmUsIGlnbm9yaW5nCi0JICogY2hhbmdlZCBmaWxlcy4pCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc291cmNlUG9zdENoYW5nZShJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlkZWJ1ZygiUmVzb3VyY2UgUE9TVF9DSEFOR0UiKTsKLQkJdGhpcy5zeW5jaHJvbml6ZUZpbGVzKGV2ZW50LmdldERlbHRhKCkpOwotCQl0aGlzLmNoZWNrRm9yT3BlbmVkUHJvamVjdHMoZXZlbnQuZ2V0RGVsdGEoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNocm9uaXplRmlsZXMoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgotCQkJCXRoaXMuc3luY2hyb25pemVGaWxlcyhkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpOyAgLy8gcmVjdXJzZQotCQkJCWJyZWFrOwotCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJdGhpcy5zeW5jaHJvbml6ZUZpbGVzKChJUHJvamVjdCkgcmVzb3VyY2UsIGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNocm9uaXplRmlsZXMoSVJlc291cmNlRGVsdGFbXSBkZWx0YXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCXRoaXMuc3luY2hyb25pemVGaWxlcyhkZWx0YXNbaV0pOyAgLy8gcmVjdXJzZQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tlZCBleGNlcHRpb25zIGJpdGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNocm9uaXplRmlsZXMoSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuanBhTW9kZWwuc3luY2hyb25pemVGaWxlcyhwcm9qZWN0LCBkZWx0YSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCXRoaXMubG9nKGV4KTsgIC8vIHByb2JsZW0gdHJhdmVyc2luZyB0aGUgcHJvamVjdCdzIHJlc291cmNlcyAtIG5vdCBtdWNoIHdlIGNhbiBkbwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3Jhd2wgdGhlIHNwZWNpZmllZCBkZWx0YSwgbG9va2luZyBmb3IgcHJvamVjdHMgYmVpbmcgb3BlbmVkLgotCSAqIFByb2plY3RzIGJlaW5nIGRlbGV0ZWQgYXJlIGhhbmRsZWQgaW4gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURS4KLQkgKiBQcm9qZWN0cyBiZWluZyBjbG9zZWQgYXJlIGhhbmRsZWQgaW4gSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUk9KRUNUX01PRElGSUVELgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0Zvck9wZW5lZFByb2plY3RzKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIElSZXNvdXJjZS5ST09UIDoKLQkJCQl0aGlzLmNoZWNrRm9yT3BlbmVkUHJvamVjdHMoZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKTsgIC8vIHJlY3Vyc2UKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCXRoaXMuY2hlY2tGb3JPcGVuZWRQcm9qZWN0KChJUHJvamVjdCkgcmVzb3VyY2UsIGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yT3BlbmVkUHJvamVjdHMoSVJlc291cmNlRGVsdGFbXSBkZWx0YXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCXRoaXMuY2hlY2tGb3JPcGVuZWRQcm9qZWN0cyhkZWx0YXNbaV0pOyAgLy8gcmVjdXJzZQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yT3BlbmVkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDogCi0JCQkJdGhpcy5jaGVja0RlbHRhRmxhZ3NGb3JPcGVuZWRQcm9qZWN0KHByb2plY3QsIGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6ICAvLyBhbHJlYWR5IGhhbmRsZWQgd2l0aCB0aGUgUFJFX0RFTEVURSBldmVudAotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6ICAvLyBhbGwgYnV0IHByb2plY3QgcmVuYW1lIGhhbmRsZWQgd2l0aCB0aGUgZmFjZXQgUE9TVF9JTlNUQUxMIGV2ZW50Ci0JCQkJdGhpcy5jaGVja0RlbHRhRmxhZ3NGb3JSZW5hbWVkUHJvamVjdChwcm9qZWN0LCBkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEX1BIQU5UT00gOiAgLy8gaWdub3JlCi0JCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRURfUEhBTlRPTSA6ICAvLyBpZ25vcmUKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV2UgZG9uJ3QgZ2V0IGFueSBldmVudHMgZnJvbSB0aGUgRmFjZXRzIEZyYW1ld29yayB3aGVuIGEgcHJlLWV4aXN0aW5nCi0JICogcHJvamVjdCBpcyBpbXBvcnRlZCwgc28gd2UgbmVlZCB0byBjaGVjayBmb3IgdGhlIG5ld2x5IGltcG9ydGVkIHByb2plY3QgaGVyZS4KLQkgKiAKLQkgKiBUaGlzIGV2ZW50IGFsc28gb2NjdXJzIHdoZW4gYSBwcm9qZWN0IGlzIHNpbXBseSBvcGVuZWQuIFByb2plY3Qgb3BlbmluZwotCSAqIGFsc28gdHJpZ2dlcnMgYSBGYWNldCBQUk9KRUNUX01PRElGSUVEIGV2ZW50IGFuZCB0aGF0IGlzIHdoZXJlIHdlIGFkZAotCSAqIHRoZSBKUEEgcHJvamVjdCwgbm90IGhlcmUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tEZWx0YUZsYWdzRm9yT3BlbmVkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlpZiAoQml0VG9vbHMuZmxhZ0lzU2V0KGRlbHRhLmdldEZsYWdzKCksIElSZXNvdXJjZURlbHRhLk9QRU4pICYmIHByb2plY3QuaXNPcGVuKCkpIHsKLQkJCWRlYnVnKCJcdFByb2plY3QgQ0hBTkdFRCAtIE9QRU46ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQl0aGlzLmpwYU1vZGVsLmNoZWNrRm9yVHJhbnNpdGlvbihwcm9qZWN0KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBXZSBkb24ndCBnZXQgYW55IGV2ZW50cyBmcm9tIHRoZSBGYWNldHMgRnJhbWV3b3JrIHdoZW4gYSBwcm9qZWN0IGlzIHJlbmFtZWQsCi0JICogc28gd2UgbmVlZCB0byBjaGVjayBmb3IgdGhlIHJlbmFtZWQgcHJvamVjdHMgaGVyZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tEZWx0YUZsYWdzRm9yUmVuYW1lZFByb2plY3QoSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJaWYgKEJpdFRvb2xzLmZsYWdJc1NldChkZWx0YS5nZXRGbGFncygpLCBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAmJiBwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQlkZWJ1ZygiXHRQcm9qZWN0IEFEREVEIC0gTU9WRURfRlJPTTogIiArIGRlbHRhLmdldE1vdmVkRnJvbVBhdGgoKSk7Ci0JCQl0aGlzLmpwYU1vZGVsLmNoZWNrRm9yVHJhbnNpdGlvbihwcm9qZWN0KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWNldGVkIHByb2plY3QgY2hhbmdlZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDaGVjayBmb3I6Ci0JICogICAtIGluc3RhbGwgb2YgSlBBIGZhY2V0Ci0JICogICAtIHVuLWluc3RhbGwgb2YgSlBBIGZhY2V0Ci0JICogICAtIGFueSBvdGhlciBhcHBlYXJhbmNlIG9yIGRpc2FwcGVhcmFuY2Ugb2YgdGhlIEpQQSBmYWNldAotCSAqLwotCS8qIHByaXZhdGUgKi8gdm9pZCBmYWNldGVkUHJvamVjdENoYW5nZWQoSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQpIHsKLQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgUE9TVF9JTlNUQUxMIDoKLQkJCQl0aGlzLmZhY2V0ZWRQcm9qZWN0UG9zdEluc3RhbGwoKElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCkgZXZlbnQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQUkVfVU5JTlNUQUxMIDoKLQkJCQl0aGlzLmZhY2V0ZWRQcm9qZWN0UHJlVW5pbnN0YWxsKChJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQpIGV2ZW50KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUFJPSkVDVF9NT0RJRklFRCA6Ci0JCQkJdGhpcy5mYWNldGVkUHJvamVjdE1vZGlmaWVkKGV2ZW50LmdldFByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmFjZXRlZFByb2plY3RQb3N0SW5zdGFsbChJUHJvamVjdEZhY2V0QWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJZGVidWcoIkZhY2V0IFBPU1RfSU5TVEFMTDogIiArIGV2ZW50LmdldFByb2plY3RGYWNldCgpKTsKLQkJaWYgKGV2ZW50LmdldFByb2plY3RGYWNldCgpLmdldElkKCkuZXF1YWxzKEpwdENvcmVQbHVnaW4uRkFDRVRfSUQpKSB7Ci0JCQl0aGlzLmpwYU1vZGVsLmpwYUZhY2V0ZWRQcm9qZWN0UG9zdEluc3RhbGwoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZhY2V0ZWRQcm9qZWN0UHJlVW5pbnN0YWxsKElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCBldmVudCkgewotCQlkZWJ1ZygiRmFjZXQgUFJFX1VOSU5TVEFMTDogIiArIGV2ZW50LmdldFByb2plY3RGYWNldCgpKTsKLQkJaWYgKGV2ZW50LmdldFByb2plY3RGYWNldCgpLmdldElkKCkuZXF1YWxzKEpwdENvcmVQbHVnaW4uRkFDRVRfSUQpKSB7Ci0JCQl0aGlzLmpwYU1vZGVsLmpwYUZhY2V0ZWRQcm9qZWN0UHJlVW5pbnN0YWxsKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIGZvciBhbnkgY2hhbmdlIHRvIGEgZmFjZXRlZCBwcm9qZWN0LgotCSAqIFdlIHVzZSB0aGUgZXZlbnQgdG8gd2F0Y2ggZm9yIHRoZSBmb2xsb3dpbmc6Ci0JICogICAtIGFuIG9wZW4gcHJvamVjdCBpcyBjbG9zZWQKLQkgKiAgIC0gYSBjbG9zZWQgcHJvamVjdCBpcyBvcGVuZWQKLQkgKiAgIC0gb25lIG9mIGEgcHJvamVjdCdzIChmYWNldCkgbWV0YWRhdGEgZmlsZXMgaXMgZWRpdGVkIGRpcmVjdGx5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGZhY2V0ZWRQcm9qZWN0TW9kaWZpZWQoSVByb2plY3QgcHJvamVjdCkgewotCQlkZWJ1ZygiRmFjZXQgUFJPSkVDVF9NT0RJRklFRDogIiArIHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJdGhpcy5qcGFNb2RlbC5jaGVja0ZvclRyYW5zaXRpb24ocHJvamVjdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgZWxlbWVudCBjaGFuZ2VkICoqKioqKioqKioKLQotCS8qKgotCSAqIEZvcndhcmQgdGhlIGV2ZW50IHRvIHRoZSBKUEEgbW9kZWwuCi0JICovCi0JLyogcHJpdmF0ZSAqLyB2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmV2ZW50SW5kaWNhdGVzUHJvamVjdEFkZGVkQnV0Tm90T3BlbihldmVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmpwYU1vZGVsLmphdmFFbGVtZW50Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JLy8yMDkyNzUgLSBUaGlzIHBhcnRpY3VsYXIgZXZlbnQgb25seSBjYXVzZXMgcHJvYmxlbXMgaW4gYSBjbGVhbiB3b3Jrc3BhY2UgdGhlIGZpcnN0IHRpbWUgYSBKUEEgcHJvamVjdAotCS8vaXMgY3JlYXRlZCB0aHJvdWdoIHRoZSBKUEEgd2l6YXJkLiBUaGUgc2Vjb25kIHRpbWUgYSBKUEEgcHJvamVjdCBpcyBjcmVhdGVkLCB0aGlzIGV2ZW50IG9jY3VycywgYnV0IAotCS8vaXQgb2NjdXJzIGFzIHRoZSB3aXphcmQgaXMgY2xvc2luZyBzbyBpdCBkb2VzIG5vdCBjYXVzZSBhIGRlYWRsb2NrLgotCXByaXZhdGUgYm9vbGVhbiBldmVudEluZGljYXRlc1Byb2plY3RBZGRlZEJ1dE5vdE9wZW4oRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQlJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCkgewotCQkJaWYgKGRlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX01PREVMKSB7Ci0JCQkJSUphdmFFbGVtZW50RGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDEpIHsKLQkJCQkJSUphdmFFbGVtZW50RGVsdGEgY2hpbGREZWx0YSA9IGNoaWxkcmVuWzBdOwotCQkJCQlpZiAoY2hpbGREZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQpIHsKLQkJCQkJCUlKYXZhRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBjaGlsZERlbHRhLmdldEVsZW1lbnQoKTsKLQkJCQkJCWlmIChjaGlsZEVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUKSB7Ci0JCQkJCQkJaWYgKGNoaWxkRGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQkJCWlmICghKChJT3BlbmFibGUpIGNoaWxkRWxlbWVudCkuaXNPcGVuKCkpIHsKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcmVmZXJlbmNlIGNoYW5nZWQgKioqKioqKioqKgotCi0JLyoqCi0JICogV2hlbiB0aGUgIkRlZmF1bHQgSlBBIExpYiIgcHJlZmVyZW5jZSBjaGFuZ2VzLAotCSAqIHVwZGF0ZSB0aGUgYXBwcm9wcmlhdGUgSkRUIENvcmUgY2xhc3NwYXRoIHZhcmlhYmxlLgotCSAqLwotCS8qIHByaXZhdGUgKi8gdm9pZCBwcmVmZXJlbmNlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpID09IEpwYVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0pQQV9MSUIpIHsKLQkJCXRyeSB7Ci0JCQkJSmF2YUNvcmUuc2V0Q2xhc3NwYXRoVmFyaWFibGUoIkRFRkFVTFRfSlBBX0xJQiIsIG5ldyBQYXRoKChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJCXRoaXMubG9nKGV4KTsgIC8vIG5vdCBzdXJlIHdoYXQgd291bGQgY2F1c2UgdGhpcy4uLgotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBGb3J3YXJkIHRoZSBSZXNvdXJjZSBjaGFuZ2UgZXZlbnQgYmFjayB0byB0aGUgSlBBIG1vZGVsIG1hbmFnZXIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQlSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUpwYU1vZGVsTWFuYWdlci50aGlzLnJlc291cmNlQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWNldGVkIHByb2plY3QgbGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogRm9yd2FyZCB0aGUgRmFjZXRlZCBwcm9qZWN0IGNoYW5nZSBldmVudCBiYWNrIHRvIHRoZSBKUEEgbW9kZWwgbWFuYWdlci4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgaW1wbGVtZW50cyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciB7Ci0JCUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50KSB7Ci0JCQlKcGFNb2RlbE1hbmFnZXIudGhpcy5mYWNldGVkUHJvamVjdENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBlbGVtZW50IGNoYW5nZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBGb3J3YXJkIHRoZSBKYXZhIGVsZW1lbnQgY2hhbmdlIGV2ZW50IGJhY2sgdG8gdGhlIEpQQSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgY2xhc3MgSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIHsKLQkJSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQkJSnBhTW9kZWxNYW5hZ2VyLnRoaXMuamF2YUVsZW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByZWZlcmVuY2VzIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIEZvcndhcmQgdGhlIFByZWZlcmVuY2VzIGNoYW5nZSBldmVudCBiYWNrIHRvIHRoZSBKUEEgbW9kZWwgbWFuYWdlci4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFByZWZlcmVuY2VzTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCVByZWZlcmVuY2VzTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUpwYU1vZGVsTWFuYWdlci50aGlzLnByZWZlcmVuY2VDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlYnVnICoqKioqKioqKioKLQotCS8vIEBzZWUgSnBhTW9kZWxUZXN0cyN0ZXN0REVCVUcoKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiOiAiICsgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFQbGF0Zm9ybVJlZ2lzdHJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhUGxhdGZvcm1SZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MWQ3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhUGxhdGZvcm1SZWdpc3RyeS5qYXZhCkBAIC0wLDAgKzEsMjc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKKy8qKgorICogU2luZ2xldG9uIHJlZ2lzdHJ5IGZvciBzdG9yaW5nIGFsbCB0aGUgcmVnaXN0ZXJlZCBKUEEgcGxhdGZvcm0gY29uZmlndXJhdGlvbgorICogZWxlbWVudHMgYW5kIGluc3RhbnRpYXRpbmcgSlBBIHBsYXRmb3JtcyBmcm9tIHRoZW0uCisgKi8KK3B1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybVJlZ2lzdHJ5IHsKKworCXByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4ganBhUGxhdGZvcm1Db25maWd1cmF0aW9uRWxlbWVudHM7CisKKworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUmVnaXN0cnkgSU5TVEFOQ0UgPSBuZXcgSnBhUGxhdGZvcm1SZWdpc3RyeSgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVJlZ2lzdHJ5IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9JRCA9ICJqcGFQbGF0Zm9ybXMiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX0VMRU1FTlRfTkFNRSA9ICJqcGFQbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQVRUUklCVVRFX05BTUUgPSAiaWQiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX0FUVFJJQlVURV9OQU1FID0gImxhYmVsIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZX0NMQVNTX0FUVFJJQlVURV9OQU1FID0gImZhY3RvcnlDbGFzcyI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX0ZBQ0VUX1ZFUlNJT05fQVRUUklCVVRFX05BTUUgPSAianBhRmFjZXRWZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FUVFJJQlVURV9OQU1FID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCisKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJLyoqCisJICogZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQorCSAqLworCXByaXZhdGUgSnBhUGxhdGZvcm1SZWdpc3RyeSgpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5qcGFQbGF0Zm9ybUNvbmZpZ3VyYXRpb25FbGVtZW50cyA9IHRoaXMuYnVpbGRKcGFQbGF0Zm9ybUNvbmZpZ3VyYXRpb25FbGVtZW50cygpOworCX0KKworCisJcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb25FbGVtZW50PiBidWlsZEpwYVBsYXRmb3JtQ29uZmlndXJhdGlvbkVsZW1lbnRzKCkgeworCQlIYXNoTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb25FbGVtZW50PiBjb25maWdFbGVtZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOworCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50IDogdGhpcy5nZXRDb25maWdFbGVtZW50cygpKSB7CisJCQl0aGlzLmFkZENvbmZpZ0VsZW1lbnRUbyhjb25maWdFbGVtZW50LCBjb25maWdFbGVtZW50cyk7CisJCX0KKwkJcmV0dXJuIGNvbmZpZ0VsZW1lbnRzOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50cyBmcm9tIHRoZSBFY2xpcHNlIHBsYXRmb3JtIGV4dGVuc2lvbgorCSAqIHJlZ2lzdHJ5LgorCSAqLworCXByaXZhdGUgSXRlcmFibGU8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBnZXRDb25maWdFbGVtZW50cygpIHsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KAorCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPElFeHRlbnNpb24sIEl0ZXJhYmxlPElDb25maWd1cmF0aW9uRWxlbWVudD4+KHRoaXMuZ2V0RXh0ZW5zaW9ucygpKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiB0cmFuc2Zvcm0oSUV4dGVuc2lvbiBleHRlbnNpb24pIHsKKwkJCQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKTsKKwkJCQkJfQorCQkJCX0KKwkJKTsKKwl9CisKKwlwcml2YXRlIEl0ZXJhYmxlPElFeHRlbnNpb24+IGdldEV4dGVuc2lvbnMoKSB7CisJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5nZXRFeHRlbnNpb25Qb2ludCgpLmdldEV4dGVuc2lvbnMoKSk7CisJfQorCisJcHJpdmF0ZSBJRXh0ZW5zaW9uUG9pbnQgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7CisJCXJldHVybiBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KEpwdENvcmVQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fSUQpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRDb25maWdFbGVtZW50VG8oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQsIEhhc2hNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGNvbmZpZ0VsZW1lbnRzKSB7CisJCWlmICggISBjb25maWdFbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoUExBVEZPUk1fRUxFTUVOVF9OQU1FKSkgeworCQkJcmV0dXJuOworCQl9CisJCWlmICggISB0aGlzLmNvbmZpZ0VsZW1lbnRJc1ZhbGlkKGNvbmZpZ0VsZW1lbnQpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShJRF9BVFRSSUJVVEVfTkFNRSk7CisJCUlDb25maWd1cmF0aW9uRWxlbWVudCBwcmV2ID0gY29uZmlnRWxlbWVudHMucHV0KGlkLCBjb25maWdFbGVtZW50KTsKKwkJaWYgKHByZXYgIT0gbnVsbCkgeworCQkJY29uZmlnRWxlbWVudHMucHV0KGlkLCBwcmV2KTsgIC8vIHJlcGxhY2UgcHJldmlvdXMoPykKKwkJCXRoaXMubG9nRHVwbGljYXRlUGxhdGZvcm0ocHJldiwgY29uZmlnRWxlbWVudCwgaWQpOworCQl9CisJfQorCisJLyoqCisJICogY2hlY2sgKmFsbCogYXR0cmlidXRlcyBiZWZvcmUgcmV0dXJuaW5nCisJICovCisJcHJpdmF0ZSBib29sZWFuIGNvbmZpZ0VsZW1lbnRJc1ZhbGlkKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7CisJCWJvb2xlYW4gdmFsaWQgPSB0cnVlOworCQlpZiAoY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoSURfQVRUUklCVVRFX05BTUUpID09IG51bGwpIHsKKwkJCXRoaXMubG9nTWlzc2luZ0F0dHJpYnV0ZShjb25maWdFbGVtZW50LCBJRF9BVFRSSUJVVEVfTkFNRSk7CisJCQl2YWxpZCA9IGZhbHNlOworCQl9CisJCWlmIChjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShMQUJFTF9BVFRSSUJVVEVfTkFNRSkgPT0gbnVsbCkgeworCQkJdGhpcy5sb2dNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIExBQkVMX0FUVFJJQlVURV9OQU1FKTsKKwkJCXZhbGlkID0gZmFsc2U7CisJCX0KKwkJaWYgKGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEZBQ1RPUllfQ0xBU1NfQVRUUklCVVRFX05BTUUpID09IG51bGwpIHsKKwkJCXRoaXMubG9nTWlzc2luZ0F0dHJpYnV0ZShjb25maWdFbGVtZW50LCBGQUNUT1JZX0NMQVNTX0FUVFJJQlVURV9OQU1FKTsKKwkJCXZhbGlkID0gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHZhbGlkOworCX0KKworCisJLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIElEcyBmb3IgdGhlIHJlZ2lzdGVyZWQgSlBBIHBsYXRmb3Jtcy4KKwkgKiBUaGlzIGRvZXMgbm90IGFjdGl2YXRlIGFueSBvZiB0aGUgSlBBIHBsYXRmb3JtcycgcGx1Zy1pbnMuCisJICovCisJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SnBhUGxhdGZvcm1JZHMoKSB7CisJCXJldHVybiB0aGlzLmpwYVBsYXRmb3JtQ29uZmlndXJhdGlvbkVsZW1lbnRzLmtleVNldCgpOworCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwbGF0Zm9ybSBpZCBpcyByZWdpc3RlcmVkCisJICovCisJcHVibGljIGJvb2xlYW4gY29udGFpbnNQbGF0Zm9ybShTdHJpbmcgcGxhdGZvcm1JZCkgeworCQlyZXR1cm4gdGhpcy5qcGFQbGF0Zm9ybUNvbmZpZ3VyYXRpb25FbGVtZW50cy5jb250YWluc0tleShwbGF0Zm9ybUlkKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGxhYmVsIGZvciB0aGUgSlBBIHBsYXRmb3JtIHdpdGggdGhlIHNwZWNpZmllZCBJRC4KKwkgKiBUaGlzIGRvZXMgbm90IGFjdGl2YXRlIHRoZSBKUEEgcGxhdGZvcm0ncyBwbHVnLWluLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SnBhUGxhdGZvcm1MYWJlbChTdHJpbmcgaWQpIHsKKwkJcmV0dXJuIHRoaXMuanBhUGxhdGZvcm1Db25maWd1cmF0aW9uRWxlbWVudHMuZ2V0KGlkKS5nZXRBdHRyaWJ1dGUoTEFCRUxfQVRUUklCVVRFX05BTUUpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGxhdGZvcm0gcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGlkIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgSlBBIGZhY2V0IHZlcnNpb24uCisJICogVGhpcyBkb2VzIG5vdCBhY3RpdmUgdGhlIEpQQSBwbGF0Zm9ybSdzIHBsdWctaW4uCisJICovCisJcHVibGljIGJvb2xlYW4gcGxhdGZvcm1TdXBwb3J0c0pwYUZhY2V0VmVyc2lvbihTdHJpbmcgcGxhdGZvcm1JZCwgU3RyaW5nIGpwYUZhY2V0VmVyc2lvbikgeworCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IHRoaXMuanBhUGxhdGZvcm1Db25maWd1cmF0aW9uRWxlbWVudHMuZ2V0KHBsYXRmb3JtSWQpOworCQlyZXR1cm4gY29uZmlnRWxlbWVudFN1cHBvcnRzSnBhRmFjZXRWZXJzaW9uKGNvbmZpZ0VsZW1lbnQsIGpwYUZhY2V0VmVyc2lvbik7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBjb25maWdFbGVtZW50U3VwcG9ydHNKcGFGYWNldFZlcnNpb24oCisJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgU3RyaW5nIGpwYUZhY2V0VmVyc2lvbikgeworCQkKKwkJLy8gY29uZmlnIGVsZW1lbnQgc3VwcG9ydHMgdmVyc2lvbiBpZiBpdCBleHBsaWNpdGx5IHNldHMgaXQgdG8gdGhhdCB2ZXJzaW9uCisJCS8vIG9yIGlmIGl0IHNwZWNpZmllcyBubyB2ZXJzaW9uIGF0IGFsbAorCQlTdHJpbmcgdmVyID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoSlBBX0ZBQ0VUX1ZFUlNJT05fQVRUUklCVVRFX05BTUUpOworCQlyZXR1cm4gKHZlciA9PSBudWxsKSB8fCB2ZXIuZXF1YWxzKGpwYUZhY2V0VmVyc2lvbik7CisJfQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgSURzIGZvciB0aGUgcmVnaXN0ZXJlZCBKUEEgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCB0aGUKKwkgKiBzcGVjaWZpZWQgSlBBIGZhY2V0IHZlcnNpb24uCisJICogVGhpcyBkb2VzIG5vdCBhY3RpdmF0ZSB0aGUgSlBBIHBsYXRmb3JtcycgcGx1Zy1pbi4KKwkgKi8KKwlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKcGFQbGF0Zm9ybUlkc0ZvckpwYUZhY2V0VmVyc2lvbihmaW5hbCBTdHJpbmcganBhRmFjZXRWZXJzaW9uKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJQ29uZmlndXJhdGlvbkVsZW1lbnQsIFN0cmluZz4odGhpcy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3JKcGFGYWNldFZlcnNpb24oanBhRmFjZXRWZXJzaW9uKSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7CisJCQkJCXJldHVybiBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShJRF9BVFRSSUJVVEVfTkFNRSk7CisJCQkJfQorCQkJfTsKKwl9CisJCisJcHJpdmF0ZSBJdGVyYWJsZTxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvckpwYUZhY2V0VmVyc2lvbihmaW5hbCBTdHJpbmcganBhRmFjZXRWZXJzaW9uKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SUNvbmZpZ3VyYXRpb25FbGVtZW50LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KHRoaXMuanBhUGxhdGZvcm1Db25maWd1cmF0aW9uRWxlbWVudHMudmFsdWVzKCkpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKKwkJCQkJcmV0dXJuIGNvbmZpZ0VsZW1lbnRTdXBwb3J0c0pwYUZhY2V0VmVyc2lvbihjb25maWdFbGVtZW50LCBqcGFGYWNldFZlcnNpb24pOworCQkJCX0KKwkJCX07CisJfQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgSUQgZm9yIGEgSlBBIHBsYXRmb3JtIHJlZ2lzdGVyZWQgYXMgYSBkZWZhdWx0IHBsYXRmb3JtLgorCSAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBhcmUgbm8gc3VjaCByZWdpc3RlcmVkIHBsYXRmb3Jtcy4KKwkgKiBSZXR1cm5zIHRoZSBmaXJzdCBwbGF0Zm9ybSBJRCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3VjaCByZWdpc3RlcmVkIHBsYXRmb3Jtcy4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRKcGFQbGF0Zm9ybUlkKCkgeworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4gZW50cnk6IHRoaXMuanBhUGxhdGZvcm1Db25maWd1cmF0aW9uRWxlbWVudHMuZW50cnlTZXQoKSkgeworCQkJU3RyaW5nIGRlZmF1bHRGbGFnID0gZW50cnkuZ2V0VmFsdWUoKS5nZXRBdHRyaWJ1dGUoREVGQVVMVF9BVFRSSUJVVEVfTkFNRSk7CisJCQlpZiAoKGRlZmF1bHRGbGFnICE9IG51bGwpICYmIGRlZmF1bHRGbGFnLmVxdWFscygidHJ1ZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXR1cm4gZW50cnkuZ2V0S2V5KCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgbmV3IEpQQSBwbGF0Zm9ybSBmb3IgdGhlIHNwZWNpZmllZCBJRC4KKwkgKiBOQjogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBpbnN0YW50aWF0aW5nIGEgSlBBIHBsYXRmb3JtCisJICogd2hlbiBidWlsZGluZyBhIG5ldyBKUEEgcHJvamVjdC4KKwkgKiBVbmxpa2Ugb3RoZXIgcmVnaXN0cnkgbWV0aG9kcywgaW52b2tpbmcgdGhpcyBtZXRob2QgbWF5IGFjdGl2YXRlIAorCSAqIHRoZSBwbHVnLWluLgorCSAqLworCXB1YmxpYyBKcGFQbGF0Zm9ybSBnZXRKcGFQbGF0Zm9ybShJUHJvamVjdCBwcm9qZWN0KSB7CisJCVN0cmluZyBpZCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1JZChwcm9qZWN0KTsKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSB0aGlzLmpwYVBsYXRmb3JtQ29uZmlndXJhdGlvbkVsZW1lbnRzLmdldChpZCk7CisJCWlmIChjb25maWdFbGVtZW50ID09IG51bGwpIHsKKwkJCXRoaXMubG9nKEpwdENvcmVNZXNzYWdlcy5QTEFURk9STV9JRF9ET0VTX05PVF9FWElTVCwgaWQsIHByb2plY3QuZ2V0TmFtZSgpKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUpwYVBsYXRmb3JtRmFjdG9yeSBwbGF0Zm9ybUZhY3Rvcnk7CisJCXRyeSB7CisJCQlwbGF0Zm9ybUZhY3RvcnkgPSAoSnBhUGxhdGZvcm1GYWN0b3J5KSBjb25maWdFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oRkFDVE9SWV9DTEFTU19BVFRSSUJVVEVfTkFNRSk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKKwkJCXRoaXMubG9nRmFpbGVkSW5zdGFudGlhdGlvbihjb25maWdFbGVtZW50LCBleCk7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGlkKTsKKwkJfQorCQlyZXR1cm4gcGxhdGZvcm1GYWN0b3J5LmJ1aWxkSnBhUGxhdGZvcm0oaWQpOworCX0KKworCisJLy8gKioqKioqKioqKiBlcnJvcnMgKioqKioqKioqKgorCisJcHJpdmF0ZSB2b2lkIGxvZ01pc3NpbmdBdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCXRoaXMubG9nKEpwdENvcmVNZXNzYWdlcy5SRUdJU1RSWV9NSVNTSU5HX0FUVFJJQlVURSwKKwkJCQkJCWNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpLAorCQkJCQkJY29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSwKKwkJCQkJCWF0dHJpYnV0ZU5hbWUKKwkJCQkJKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgbG9nRHVwbGljYXRlUGxhdGZvcm0oSUNvbmZpZ3VyYXRpb25FbGVtZW50IHByZXZDb25maWdFbGVtZW50LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgbmV3Q29uZmlnRWxlbWVudCwgU3RyaW5nIGlkKSB7CisJCXRoaXMubG9nKEpwdENvcmVNZXNzYWdlcy5SRUdJU1RSWV9EVVBMSUNBVEUsCisJCQkJCQlwcmV2Q29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSwKKwkJCQkJCW5ld0NvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksCisJCQkJCQlJRF9BVFRSSUJVVEVfTkFNRSwKKwkJCQkJCVBMQVRGT1JNX0VMRU1FTlRfTkFNRSwKKwkJCQkJCWlkCisJCQkJCSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGxvZ0ZhaWxlZEluc3RhbnRpYXRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQsIENvcmVFeGNlcHRpb24gZXgpIHsKKwkJdGhpcy5sb2coSnB0Q29yZU1lc3NhZ2VzLlJFR0lTVFJZX0ZBSUxFRF9JTlNUQU5USUFUSU9OLAorCQkJCQkJY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoRkFDVE9SWV9DTEFTU19BVFRSSUJVVEVfTkFNRSksCisJCQkJCQljb25maWdFbGVtZW50LmdldE5hbWUoKSwKKwkJCQkJCWNvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkKKwkJCQkJKTsKKwkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCX0KKworCXByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZywgT2JqZWN0Li4uIGJpbmRpbmdzKSB7CisJCUpwdENvcmVQbHVnaW4ubG9nKE5MUy5iaW5kKG1zZywgYmluZGluZ3MpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFQbGF0Zm9ybVRlc3Rlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYVBsYXRmb3JtVGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE2Yzk4ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFQbGF0Zm9ybVRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgICAgICAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKKworcHVibGljIGNsYXNzIEpwYVBsYXRmb3JtVGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIgeworCQorCXB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7CisJCWlmICghIHByb3BlcnR5LmVxdWFscygianBhUGxhdGZvcm0iKSkgeyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCisJCVN0cmluZyBwbGF0Zm9ybUlkID0gbnVsbDsKKwkJCisJCWlmIChyZWNlaXZlciBpbnN0YW5jZW9mIElSZXNvdXJjZSkgeworCQkJcGxhdGZvcm1JZCA9IHBsYXRmb3JtSWQoKChJUmVzb3VyY2UpIHJlY2VpdmVyKS5nZXRQcm9qZWN0KCkpOworCQl9IAorCQllbHNlIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgeworCQkJcGxhdGZvcm1JZCA9IHBsYXRmb3JtSWQoKChJSmF2YUVsZW1lbnQpIHJlY2VpdmVyKS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKSk7CisJCX0gCisJCQorCQkKKwkJcmV0dXJuIHBsYXRmb3JtSWQgPT0gbnVsbCA/IGZhbHNlIDogcGxhdGZvcm1JZC5lcXVhbHMoZXhwZWN0ZWRWYWx1ZSk7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIHBsYXRmb3JtSWQoSVByb2plY3QgcHJvamVjdCkgeworCQlyZXR1cm4gKHByb2plY3QgPT0gbnVsbCkgPyBudWxsIDogSnB0Q29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybUlkKHByb2plY3QpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFQcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFQcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0NGQ2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhUHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgSnBhUHJvamVjdEFkYXB0ZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLXsKLQlwcml2YXRlIHN0YXRpYyBDbGFzc1tdIFBST1BFUlRJRVM9IG5ldyBDbGFzc1tdIHsKLQkJSnBhUHJvamVjdC5jbGFzcwotCX07Ci0JCQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gUFJPUEVSVElFUzsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBlbGVtZW50LCBDbGFzcyBrZXkpIHsKLQkJSVByb2plY3QgcHJvamVjdDsKLQkJCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCXByb2plY3QgPSAoSVByb2plY3QpIGVsZW1lbnQ7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJcHJvamVjdCA9ICgoSUphdmFQcm9qZWN0KSBlbGVtZW50KS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYVRlc3Rlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYVRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMzJhOTUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhVGVzdGVyLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCisgKiAgICBPcmFjbGUgLSBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRlZFByb2plY3RQcm9wZXJ0eVRlc3RlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOworCitwdWJsaWMgY2xhc3MgSnBhVGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIgeworCQorCXB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7CisJCWlmICghcHJvcGVydHkuZXF1YWxzKCJwcm9qZWN0RmFjZXQiKSkgeyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKyAgICAgICAgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7CisgICAgICAgIAlJUHJvamVjdCBwcm9qZWN0ID0gKChJSmF2YUVsZW1lbnQpIHJlY2VpdmVyKS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKTsgICAgICAgIAkKKyAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgIFN0cmluZyB2YWwgPSAoU3RyaW5nKSBleHBlY3RlZFZhbHVlOworICAgICAgICAgICAgICAgIGludCBjb2xvbiA9IHZhbC5pbmRleE9mKCAnOicgKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RyaW5nIGZhY2V0SUQ7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZhY2V0VmVyOworICAgICAgICAgICAgICAgIGlmKCBjb2xvbiA9PSAtMSB8fCBjb2xvbiA9PSB2YWwubGVuZ3RoKCkgLSAxICkgIHsKKyAgICAgICAgICAgICAgICAgICAgZmFjZXRJRCA9IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgZmFjZXRWZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZhY2V0SUQgPSB2YWwuc3Vic3RyaW5nKCAwLCBjb2xvbiApOworICAgICAgICAgICAgICAgICAgICBmYWNldFZlciA9IHZhbC5zdWJzdHJpbmcoIGNvbG9uICsgMSApOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAJCisgICAgICAgICAgICAJdHJ5IHsgICAgICAgICAgICAJCQorICAgICAgICAgICAgCQlyZXR1cm4gRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuaGFzUHJvamVjdEZhY2V0KCBwcm9qZWN0LCBmYWNldElELCBmYWNldFZlciApOyAgICAgICAgICAgIAkJCisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCUpwdENvcmVQbHVnaW4ubG9nKGUuZ2V0U3RhdHVzKCkpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCX0JCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwdENvcmVNZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwdENvcmVNZXNzYWdlcy5qYXZhCmluZGV4IDM5YzIxNzEuLmUwOTE1ZDEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcHRDb3JlTWVzc2FnZXMuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnB0Q29yZU1lc3NhZ2VzLmphdmEKQEAgLTEsOCArMSw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgpAQCAtMTEsNjMgKzExLDU5IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwogCi1wdWJsaWMgY2xhc3MgSnB0Q29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwYV9jb3JlIjsgLy8kTk9OLU5MUy0xJAotCQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpwdENvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCQorLyoqCisgKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIGNvcmUuCisgKi8KK3B1YmxpYyBjbGFzcyBKcHRDb3JlTWVzc2FnZXMgeworCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgTk9ORTsKLQkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9KT0I7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfUFJPSkVDVF9OT1RfU1BFQ0lGSUVEOwotCQogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX1NPVVJDRV9GT0xERVJfTk9UX1NQRUNJRklFRDsKLQkKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9TT1VSQ0VfRk9MREVSX0lMTEVHQUw7Ci0JCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfU09VUkNFX0ZPTERFUl9ET0VTX05PVF9FWElTVDsKLQkKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9TT1VSQ0VfRk9MREVSX05PVF9JTl9QUk9KRUNUOwotCQogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX1NPVVJDRV9GT0xERVJfTk9UX1NPVVJDRV9GT0xERVI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfT1JNX0ZJTEVfQUxSRUFEWV9FWElTVFM7Ci0JCisJcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfRklMRV9QQVRIX05PVF9TUEVDSUZJRUQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfRklMRV9BTFJFQURZX0VYSVNUUzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9GSUxFX1ZFUlNJT05fTk9UX1NVUFBPUlRFRDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9GSUxFX1ZFUlNJT05fTk9UX1NVUFBPUlRFRF9GT1JfRkFDRVRfVkVSU0lPTjsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9QRVJTSVNURU5DRV9VTklUX0RPRVNfTk9UX1NQRUNJRklFRDsKLQkKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9QRVJTSVNURU5DRV9VTklUX05PVF9JTl9QUk9KRUNUOwotCQogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX1BMQVRGT1JNX05PVF9TUEVDSUZJRUQ7Ci0JCisJcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfUExBVEZPUk1fRE9FU19OT1RfU1VQUE9SVF9GQUNFVF9WRVJTSU9OOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0NPTk5FQ1RJT05fTk9UX1NQRUNJRklFRDsKLQkKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9DT05ORUNUSU9OX0lOVkFMSUQ7Ci0JCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfQ09OTkVDVElPTl9OT1RfQ09OTkVDVEVEOwotCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0RFRkFVTFRfQ0FUQUxPR19OT1RfU1BFQ0lGSUVEOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0NPTk5FQ1RJT05fRE9FU05UX0NPTlRBSU5fQ0FUQUxPRzsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9ERUZBVUxUX1NDSEVNQV9OT1RfU1BFQ0lGSUVEOwotCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0NPTk5FQ1RJT05fRE9FU05UX0NPTlRBSU5fU0NIRU1BOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX1JVTlRJTUVfTk9UX1NQRUNJRklFRDsKLQkKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9SVU5USU1FX0RPRVNfTk9UX1NVUFBPUlRfRUpCXzMwOwotCQogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0xJQlJBUllfTk9UX1NQRUNJRklFRDsKLQkKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBTWU5DSFJPTklaRV9DTEFTU0VTX0pPQjsKLQkKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBTWU5DSFJPTklaSU5HX0NMQVNTRVNfVEFTSzsKLQkKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1BFUlNJU1RFTkNFX1hNTF9DT05URU5UOwotCQogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1NZTkNIUk9OSVpJTkdfQ0xBU1NFU19DT1VMRF9OT1RfVkFMSURBVEU7Ci0JCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfV1JJVElOR19GSUxFOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFR0lTVFJZX01JU1NJTkdfQVRUUklCVVRFOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFR0lTVFJZX0RVUExJQ0FURTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSRUdJU1RSWV9GQUlMRURfSU5TVEFOVElBVElPTjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVUERBVEVfSk9CX05BTUU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU1lOQ0hST05JWkVfTUVUQU1PREVMX0pPQl9OQU1FOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBMQVRGT1JNX0lEX0RPRVNfTk9UX0VYSVNUOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERBTElfRVZFTlRfSEFORExFUl9USFJFQURfTkFNRTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQUkVGRVJFTkNFU19GTFVTSF9KT0JfTkFNRTsKIAkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianBhX2NvcmUiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0Q29yZU1lc3NhZ2VzLmNsYXNzOworCXN0YXRpYyB7CisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7CisJfQogCQogCXByaXZhdGUgSnB0Q29yZU1lc3NhZ2VzKCkgewogCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKIAl9CisKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9Pcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9Pcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzc3ODRmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL09ybVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0uT3JtWG1sUmVzb3VyY2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7CisKKy8qKgorICogb3JtLnhtbAorICovCitwdWJsaWMgY2xhc3MgT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyCisJaW1wbGVtZW50cyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpwYVJlc291cmNlTW9kZWxQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKKwkJcmV0dXJuIEpwdENvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEU7CisJfQorCisJcHVibGljIEpwYVhtbFJlc291cmNlIGJ1aWxkUmVzb3VyY2VNb2RlbChKcGFQcm9qZWN0IGpwYVByb2plY3QsIElGaWxlIGZpbGUpIHsKKwkJcmV0dXJuIE9ybVhtbFJlc291cmNlUHJvdmlkZXIuZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihmaWxlKS5nZXRYbWxSZXNvdXJjZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxMjg3OAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOworCisvKioKKyAqIHBlcnNpc3RlbmNlLnhtbAorICovCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXIKKwlpbXBsZW1lbnRzIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVJlc291cmNlTW9kZWxQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlcigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKKwkJcmV0dXJuIEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRTsKKwl9CisKKwlwdWJsaWMgSnBhWG1sUmVzb3VyY2UgYnVpbGRSZXNvdXJjZU1vZGVsKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSkgeworCQlyZXR1cm4gUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVByb3ZpZGVyLmdldFhtbFJlc291cmNlUHJvdmlkZXIoZmlsZSkuZ2V0WG1sUmVzb3VyY2UoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9Qcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9Qcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTgwMjcxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL1Byb2plY3RBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CisKKy8qKgorICogW0RvdWJsZS1kdXR5XSBmYWN0b3J5IHRvIGJ1aWxkIGFkYXB0ZXJzIGZvciBlaXRoZXIgc3RhbmRhcmQgcHJvamVjdHMgb3IKKyAqIEphdmEgcHJvamVjdHM6CisgKiAgIC0gSlBBIHByb2plY3QKKyAqIAorICogU2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlIHBsdWdpbi54bWwuCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9qZWN0QWRhcHRlckZhY3RvcnkKKwlpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gQURBUFRFUl9MSVNUID0gbmV3IENsYXNzW10geyBKcGFQcm9qZWN0LmNsYXNzIH07CisKKwlwdWJsaWMgQ2xhc3M8Pz5bXSBnZXRBZGFwdGVyTGlzdCgpIHsKKwkJcmV0dXJuIEFEQVBURVJfTElTVDsKKwl9CisJCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBDbGFzcyBhZGFwdGVyVHlwZSkgeworCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSVByb2plY3QpIHsKKwkJCXJldHVybiB0aGlzLmdldEFkYXB0ZXIoKElQcm9qZWN0KSBhZGFwdGFibGVPYmplY3QsIGFkYXB0ZXJUeXBlKTsKKwkJfQorCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7CisJCQlyZXR1cm4gdGhpcy5nZXRBZGFwdGVyKChJSmF2YVByb2plY3QpIGFkYXB0YWJsZU9iamVjdCwgYWRhcHRlclR5cGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0JCisKKwlwcml2YXRlIE9iamVjdCBnZXRBZGFwdGVyKElQcm9qZWN0IHByb2plY3QsIENsYXNzIDw/PmFkYXB0ZXJUeXBlKSB7CisJCWlmIChhZGFwdGVyVHlwZSA9PSBKcGFQcm9qZWN0LmNsYXNzKSB7CisJCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KHByb2plY3QpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgT2JqZWN0IGdldEFkYXB0ZXIoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBDbGFzcyA8Pz5hZGFwdGVyVHlwZSkgeworCQlpZiAoYWRhcHRlclR5cGUgPT0gSnBhUHJvamVjdC5jbGFzcykgeworCQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdChqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKKwkJcmV0dXJuIEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9SZXNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvUmVzb3VyY2VBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZmEyNDUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvUmVzb3VyY2VBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5JUmVzb3VyY2VQYXJ0OworCisvKioKKyAqIEZhY3RvcnkgdG8gYnVpbGQgYWRhcHRlcnMgZm9yIEVjbGlwc2UgcmVzb3VyY2VzOgorICogICAtIHJlc291cmNlIHBhcnQKKyAqIAorICogU2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlIHBsdWdpbi54bWwuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUFkYXB0ZXJGYWN0b3J5CisJaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIEFEQVBURVJfTElTVCA9IG5ldyBDbGFzc1tdIHsgSVJlc291cmNlUGFydC5jbGFzcyB9OworCisJcHVibGljIENsYXNzPD8+W10gZ2V0QWRhcHRlckxpc3QoKSB7CisJCXJldHVybiBBREFQVEVSX0xJU1Q7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBDbGFzcyBhZGFwdGVyVHlwZSkgeworCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKSB7CisJCQlyZXR1cm4gdGhpcy5nZXRBZGFwdGVyKChJUmVzb3VyY2UpIGFkYXB0YWJsZU9iamVjdCwgYWRhcHRlclR5cGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgT2JqZWN0IGdldEFkYXB0ZXIoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBDbGFzcyA8Pz5hZGFwdGVyVHlwZSkgeworCQlpZiAoYWRhcHRlclR5cGUgPT0gSVJlc291cmNlUGFydC5jbGFzcykgeworCQkJcmV0dXJuIG5ldyBJUmVzb3VyY2VQYXJ0KCkgeworCQkJCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7CisJCQkJCXJldHVybiByZXNvdXJjZTsKKwkJCQl9CisJCQl9OworCQl9CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL1NpbXBsZUpwYVByb2plY3RDb25maWcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9TaW1wbGVKcGFQcm9qZWN0Q29uZmlnLmphdmEKaW5kZXggZjY0MmVmMy4uMjQzM2ZhMiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL1NpbXBsZUpwYVByb2plY3RDb25maWcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvU2ltcGxlSnBhUHJvamVjdENvbmZpZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTExLDE4ICsxMSwyMCBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLkpwYVByb2plY3QyXzA7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CiAKIC8qKgogICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKUEEgcHJvamVjdCBjb25maWcuCiAgKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVKcGFQcm9qZWN0Q29uZmlnIGltcGxlbWVudHMgSnBhUHJvamVjdC5Db25maWcgeworcHVibGljIGNsYXNzIFNpbXBsZUpwYVByb2plY3RDb25maWcgaW1wbGVtZW50cyBKcGFQcm9qZWN0Ml8wLkNvbmZpZyB7CiAJcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7CiAJcHJvdGVjdGVkIEpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtOwogCXByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgdXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWU7CisJcHJvdGVjdGVkIFN0cmluZyB1c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZzsKKwlwcm90ZWN0ZWQgU3RyaW5nIHVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWE7CiAJcHJvdGVjdGVkIGJvb2xlYW4gZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzOworCXByb3RlY3RlZCBTdHJpbmcgbWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZTsKIAogCXB1YmxpYyBTaW1wbGVKcGFQcm9qZWN0Q29uZmlnKCkgewogCQlzdXBlcigpOwpAQCAtNTIsMTIgKzU0LDIwIEBACiAJCXRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lID0gY29ubmVjdGlvblByb2ZpbGVOYW1lOwogCX0KIAkKLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKCkgewotCQlyZXR1cm4gdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZTsKKwlwdWJsaWMgU3RyaW5nIGdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWE7CiAJfQogCQotCXB1YmxpYyB2b2lkIHNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKFN0cmluZyB1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSkgewotCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lID0gdXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWU7CisJcHVibGljIHZvaWQgc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYShTdHJpbmcgdXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSkgeworCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEgPSB1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCkgeworCQlyZXR1cm4gdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZzsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coU3RyaW5nIHVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKSB7CisJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2cgPSB1c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZzsKIAl9CiAJCiAJcHVibGljIGJvb2xlYW4gZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKCkgewpAQCAtNjgsNiArNzgsMTQgQEAKIAkJdGhpcy5kaXNjb3ZlckFubm90YXRlZENsYXNzZXMgPSBkaXNjb3ZlckFubm90YXRlZENsYXNzZXM7CiAJfQogCisJcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5tZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUoU3RyaW5nIG1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUpIHsKKwkJdGhpcy5tZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lID0gbWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZTsKKwl9CisKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnByb2plY3QuZ2V0TmFtZSgpKTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9TeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlci5qYXZhCmluZGV4IDM3YTYyMWYuLjMxNGI5MmUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9TeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL1N5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDEzICs5LDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnMuQ2FsbGJhY2tTeW5jaHJvbml6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyOwogCiAvKioKKyAqIEFkYXB0IHRoZSAiY2FsbGJhY2sgc3luY2hyb25pemVyIiBpbnRlcmZhY2UgdG8gdGhlIEpQQSBwcm9qZWN0ICJ1cGRhdGVyIgorICogaW50ZXJmYWNlLgorICogPHA+CiAgKiBUaGlzIHVwZGF0ZXIgd2lsbCAidXBkYXRlIiB0aGUgSlBBIHByb2plY3QgaW1tZWRpYXRlbHkgYW5kIG5vdCByZXR1cm4gdW50aWwKICAqIHRoZSAidXBkYXRlIiBhbmQgYWxsIHJlc3VsdGluZyAidXBkYXRlcyIgYXJlIGNvbXBsZXRlLiBUaGlzIGltcGxlbWVudGF0aW9uCiAgKiBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkgYW5kIGZvciBhcyBzaG9ydCBhIHRpbWUgYXMgcG9zc2libGUsIGFzIGl0IGluY3JlYXNlcwpAQCAtMjMsMTEwICsyNiwyNCBAQAogICogdXBkYXRlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMgYW5kIHZhcmlvdXMgcmVzb3VyY2VzIGFyZSBsb2NrZWQgaW4gdmFyeWluZwogICogb3JkZXJzLgogICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlciBpbXBsZW1lbnRzIEpwYVByb2plY3QuVXBkYXRlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdDsKLQlwcm90ZWN0ZWQgZmluYWwgU3luY2hyb25pemVkRmxhZ3MgZmxhZ3M7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElQcm9ncmVzc01vbml0b3IgTlVMTF9QUk9HUkVTU19NT05JVE9SID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQorcHVibGljIGNsYXNzIFN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIKKwlleHRlbmRzIEFic3RyYWN0U3luY2hyb25pemVySnBhUHJvamVjdFVwZGF0ZXIKK3sKIAlwdWJsaWMgU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlcihKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5mbGFncyA9IG5ldyBTeW5jaHJvbml6ZWRGbGFncygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGZsYWdzIGFuZCBleGVjdXRlIGFuICJ1cGRhdGUiLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQl0aGlzLmZsYWdzLnN0YXJ0KCk7Ci0JCXRoaXMudXBkYXRlKCk7Ci0JfQotCi0JLy8gcmVjdXJzaW9uOiB3ZSBjb21lIGJhY2sgaGVyZSB3aGVuIElKcGFQcm9qZWN0I3VwZGF0ZSgpIGlzIGNhbGxlZCBkdXJpbmcgdGhlICJ1cGRhdGUiCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlpZiAodGhpcy5mbGFncy51cGRhdGVDYW5TdGFydCgpKSB7Ci0JCQlkbyB7Ci0JCQkJdGhpcy5qcGFQcm9qZWN0LnVwZGF0ZShOVUxMX1BST0dSRVNTX01PTklUT1IpOwotCQkJfSB3aGlsZSAodGhpcy5mbGFncy51cGRhdGVNdXN0RXhlY3V0ZUFnYWluKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5mbGFncy5kaXNwb3NlKCk7CisJCXN1cGVyKGpwYVByb2plY3QpOwogCX0KIAogCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuanBhUHJvamVjdCk7CisJcHJvdGVjdGVkIENhbGxiYWNrU3luY2hyb25pemVyIGJ1aWxkU3luY2hyb25pemVyKCkgeworCQlyZXR1cm4gbmV3IENhbGxiYWNrU3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5idWlsZENvbW1hbmQoKSk7CiAJfQogCi0KLQkvKioKLQkgKiBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIHBhaXIgb2YgJ3VwZGF0aW5nJyBhbmQgJ2FnYWluJyBmbGFncwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgU3luY2hyb25pemVkRmxhZ3MgewotCQlwcm90ZWN0ZWQgU3luY2hyb25pemVkQm9vbGVhbiB1cGRhdGluZyA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlLCB0aGlzKTsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gYWdhaW4gPSBmYWxzZTsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gc3RvcCA9IHRydWU7Ci0KLQkJcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgewotCQkJaWYgKCAhIHRoaXMuc3RvcCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBVcGRhdGVyIHdhcyBub3Qgc3RvcHBlZC4iKTsKKwlwcm90ZWN0ZWQgQ29tbWFuZCBidWlsZENvbW1hbmQoKSB7CisJCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKKwkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisJCQkJU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlci50aGlzLmpwYVByb2plY3QudXBkYXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwogCQkJfQotCQkJdGhpcy5zdG9wID0gZmFsc2U7Ci0JCX0KLQotCQkvKioKLQkJICogQSBjbGllbnQgaGFzIHJlcXVlc3RlZCBhbiAidXBkYXRlIjsKLQkJICogcmV0dXJuIHdoZXRoZXIgdGhlIHVwZGF0ZXIgY2FuIHN0YXJ0IGFuICJ1cGRhdGUiLgotCQkgKiBTaWRlLWVmZmVjdHM6Ci0JCSAqICAgLSBJZiB3ZSBhcmUgY3VycmVudGx5IHVwZGF0aW5nLCBzZXQgdGhlICdhZ2FpbicgZmxhZy4KLQkJICogICAtIElmIHdlIGFyZSBub3QgY3VycmVudGx5IHVwZGF0aW5nLCBzZXQgdGhlICd1cGRhdGluZycgZmxhZyBhbmQgY2xlYXIgdGhlICdhZ2FpbicgZmxhZy4KLQkJICovCi0JCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiB1cGRhdGVDYW5TdGFydCgpIHsKLQkJCWlmICh0aGlzLnN0b3ApIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAodGhpcy51cGRhdGluZy5pc1RydWUoKSkgewotCQkJCXRoaXMuYWdhaW4gPSB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXRoaXMudXBkYXRpbmcuc2V0VHJ1ZSgpOwotCQkJdGhpcy5hZ2FpbiA9IGZhbHNlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlICJ1cGRhdGUiIGhhcyBmaW5pc2hlZDsKLQkJICogcmV0dXJuIHdoZXRoZXIgdGhlIHVwZGF0ZXIgbXVzdCBleGVjdXRlIGFub3RoZXIgInVwZGF0ZSIuCi0JCSAqIFNpZGUtZWZmZWN0czoKLQkJICogICAtIElmIHdlIGFyZSBzdXBwb3NlZCB0byBzdG9wLCBjbGVhciB0aGUgYm90aCB0aGUgJ3VwZGF0aW5nJyBhbmQgJ2FnYWluJyBmbGFncy4KLQkJICogICAtIElmIHdlIGhhdmUgdG8gInVwZGF0ZSIgYWdhaW4sIGNsZWFyIHRoZSAnYWdhaW4nIGZsYWcgYW5kIGxlYXZlIHRoZSAndXBkYXRpbmcnIGZsYWcgc2V0LgotCQkgKiAgIC0gSWYgd2UgYXJlIGZpbmlzaGVkLCBjbGVhciB0aGUgJ3VwZGF0aW5nJyBmbGFnLgotCQkgKi8KLQkJcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIHVwZGF0ZU11c3RFeGVjdXRlQWdhaW4oKSB7Ci0JCQlpZiAodGhpcy5zdG9wKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHRoaXMuYWdhaW4pIHsKLQkJCQl0aGlzLmFnYWluID0gZmFsc2U7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQl0aGlzLnVwZGF0aW5nLnNldEZhbHNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXRoaXMuc3RvcCA9IHRydWU7Ci0JCQl0aGlzLmFnYWluID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCXRoaXMudXBkYXRpbmcud2FpdFVudGlsRmFsc2UoKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gdGhlICJ1cGRhdGUiIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyAtIGlnbm9yZQotCQkJfQotCQl9Ci0KKwkJfTsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L0Fic3RyYWN0SnBhQ29udGV4dE5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L0Fic3RyYWN0SnBhQ29udGV4dE5vZGUuamF2YQppbmRleCBjYjdjYWIwLi43ODY4YmExIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9BYnN0cmFjdEpwYUNvbnRleHROb2RlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvQWJzdHJhY3RKcGFDb250ZXh0Tm9kZS5qYXZhCkBAIC0xLDYzICsxLDEwMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGVSb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ2F0YWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWFDb250YWluZXI7CiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpwYUNvbnRleHROb2RlIGV4dGVuZHMgQWJzdHJhY3RKcGFOb2RlCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFDb250ZXh0Tm9kZQorCWV4dGVuZHMgQWJzdHJhY3RKcGFOb2RlCiAJaW1wbGVtZW50cyBKcGFDb250ZXh0Tm9kZQogewotCS8vICoqKioqKioqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgorCiAJcHJvdGVjdGVkIEFic3RyYWN0SnBhQ29udGV4dE5vZGUoSnBhTm9kZSBwYXJlbnQpIHsKIAkJc3VwZXIocGFyZW50KTsKIAl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBKcGFOb2RlIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQorCisKKwkvLyAqKioqKioqKioqIEpwYU5vZGUgaW1wbGVudGF0aW9uICoqKioqKioqKioKKworCS8qKgorCSAqIGNvdmFyaWFudCBvdmVycmlkZQorCSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBKcGFDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7CiAJCXJldHVybiAoSnBhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwogCX0KKworCisJLy8gKioqKioqKioqKiBKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCiAJCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBKcGFDb250ZXh0Tm9kZSBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgeworCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2VUeXBlKCk7CisJfQogCQogCS8qKgotCSAqIE92ZXJpZGRlbiBpbiBCYXNlSnBhQ29udGV4dCwgUGVyc2lzdGVuY2UsIFBlcnNpdHNlbmNlWG1sIHRvIHRocm93IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0JICogT3ZlcmlkZGVuIGluIFBlcnNpc3RlbmNlVW5pdCB0byByZXR1cm4gaXQuCisJICogT3ZlcnJpZGRlbiBpbiBHZW5lcmljUGVyc2lzdGVuY2UgYW5kIEdlbmVyaWNQZXJzaXN0ZW5jZVhtbCB0byB0aHJvdworCSAqIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorCSAqIE92ZXJyaWRkZW4gaW4gR2VuZXJpY1Jvb3RDb250ZXh0Tm9kZSB0byByZXR1cm4gbnVsbC4KKwkgKiBPdmVycmlkZGVuIGluIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQgdG8gcmV0dXJuIGl0c2VsZi4KIAkgKi8KIAlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwl9CisKKwlwdWJsaWMgTWFwcGluZ0ZpbGVSb290IGdldE1hcHBpbmdGaWxlUm9vdCgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0TWFwcGluZ0ZpbGVSb290KCk7CisJfQorCisJcHVibGljIFNjaGVtYSBnZXRDb250ZXh0RGVmYXVsdERiU2NoZW1hKCkgeworCQlTY2hlbWFDb250YWluZXIgZGJTY2hlbWFDb250YWluZXIgPSB0aGlzLmdldENvbnRleHREZWZhdWx0RGJTY2hlbWFDb250YWluZXIoKTsKKwkJcmV0dXJuIChkYlNjaGVtYUNvbnRhaW5lciA9PSBudWxsKSA/IG51bGwgOiBkYlNjaGVtYUNvbnRhaW5lci5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHRoaXMuZ2V0Q29udGV4dERlZmF1bHRTY2hlbWEoKSk7CisJfQorCisJLyoqCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPiBjYXRhbG9nKSwKKwkgKiB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzOyBhbmQgd2UgbmVlZCB0bworCSAqIGdldCB0aGUgc2NoZW1hIGRpcmVjdGx5IGZyb20gdGhlIGRhdGFiYXNlLgorCSAqLworCXB1YmxpYyBTY2hlbWFDb250YWluZXIgZ2V0Q29udGV4dERlZmF1bHREYlNjaGVtYUNvbnRhaW5lcigpIHsKKwkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldENvbnRleHREZWZhdWx0Q2F0YWxvZygpOworCQlyZXR1cm4gKGNhdGFsb2cgIT0gbnVsbCkgPyB0aGlzLmdldERiQ2F0YWxvZyhjYXRhbG9nKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHREZWZhdWx0U2NoZW1hKCkgeworCQlNYXBwaW5nRmlsZVJvb3QgbWZyID0gdGhpcy5nZXRNYXBwaW5nRmlsZVJvb3QoKTsKKwkJcmV0dXJuIChtZnIgIT0gbnVsbCkgPyBtZnIuZ2V0U2NoZW1hKCkgOiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldERlZmF1bHRTY2hlbWEoKTsKKwl9CisKKwkvKioKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+CisJICogY2F0YWxvZyksIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCisJICovCisJcHVibGljIENhdGFsb2cgZ2V0Q29udGV4dERlZmF1bHREYkNhdGFsb2coKSB7CisJCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRDb250ZXh0RGVmYXVsdENhdGFsb2coKTsKKwkJcmV0dXJuIChjYXRhbG9nID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0RGJDYXRhbG9nKGNhdGFsb2cpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dERlZmF1bHRDYXRhbG9nKCkgeworCQlNYXBwaW5nRmlsZVJvb3QgbWZyID0gdGhpcy5nZXRNYXBwaW5nRmlsZVJvb3QoKTsKKwkJcmV0dXJuIChtZnIgIT0gbnVsbCkgPyBtZnIuZ2V0Q2F0YWxvZygpIDogdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwogCX0KIAkKLQkvKioKLQkgKiBPdmVyaWRkZW4gaW4gQmFzZUpwYUNvbnRleHQgdG8gcmV0dXJuIG51bGwKLQkgKiBPdmVyaWRkZW4gaW4gRW50aXR5TWFwcGluZ3MgdG8gcmV0dXJuIGl0LgotCSAqLwotCXB1YmxpYyBFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldEVudGl0eU1hcHBpbmdzKCk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJpZGRlbiBpbiBCYXNlSnBhQ29udGV4dCB0byByZXR1cm4gbnVsbAotCSAqIE92ZXJpZGRlbiBpbiBPcm1QZXJzaXN0ZW50VHlwZSB0byByZXR1cm4gaXQuCi0JICovCi0JcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlIGdldE9ybVBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0T3JtUGVyc2lzdGVudFR5cGUoKTsKKwlwdWJsaWMgdm9pZCBwb3N0VXBkYXRlKCkgeworCQkvLyBkbyBub3RoaW5nCiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvQWJzdHJhY3RYbWxDb250ZXh0Tm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvQWJzdHJhY3RYbWxDb250ZXh0Tm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZWVjOTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9BYnN0cmFjdFhtbENvbnRleHROb2RlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhtbENvbnRleHROb2RlCisJZXh0ZW5kcyBBYnN0cmFjdEpwYUNvbnRleHROb2RlCisJaW1wbGVtZW50cyBYbWxDb250ZXh0Tm9kZQoreworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgQWJzdHJhY3RYbWxDb250ZXh0Tm9kZShKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKworCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCisKKwkvKioKKwkgKiBBbGwgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25zIHtAbGluayAjdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4pfSAKKwkgKiBzaG91bGQgYmUgcHJlY2VkZWQgYnkgYSAic3VwZXIiIGNhbGwgdG8gdGhpcyBtZXRob2QKKwkgKi8KKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCWlmIChyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7CisJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbigpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9HZW5lcmljUm9vdENvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9HZW5lcmljUm9vdENvbnRleHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTFhMDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvR2VuZXJpY1Jvb3RDb250ZXh0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1Jvb3RDb250ZXh0Tm9kZSBleHRlbmRzIEFic3RyYWN0SnBhQ29udGV4dE5vZGUgCi0JaW1wbGVtZW50cyBKcGFSb290Q29udGV4dE5vZGUKLXsKLQkvKiBUaGlzIG9iamVjdCBoYXMgbm8gcGFyZW50LCBzbyBpdCBtdXN0IHBvaW50IHRvIHRoZSBKUEEgcHJvamVjdCAqLwotCXByb3RlY3RlZCBmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0JCi0JLyogTWFpbiBjb250ZXh0IG9iamVjdCAqLwotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbDsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY1Jvb3RDb250ZXh0Tm9kZShKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBKUEEgcHJvamVjdCBtdXN0IG5vdCBiZSBudWxsIik7Ci0JCX0KLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgcGFlID0gUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChqcGFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcHIgPSBwYWUuZ2V0UmVzb3VyY2UoKTsKLQkJCi0JCWlmIChwci5leGlzdHMoKSkgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVhtbCA9IHRoaXMuYnVpbGRQZXJzaXN0ZW5jZVhtbChwcik7Ci0JCX0KLQkJCi0JCXBhZS5kaXNwb3NlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzUGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSnBhTm9kZSBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSnBhQ29udGV4dE5vZGUgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJLy8gTm8gUGVyc2lzdGVuY2VVbml0IGluIHRoaXMgY29udGV4dAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCkgewotCQkvLyBObyBFbnRpdHlNYXBwaW5ncyBpbiB0aGlzIGNvbnRleHQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRPcm1QZXJzaXN0ZW50VHlwZSgpIHsKLQkJLy8gTm8gT3JtUGVyc2lzdGVudFR5cGUgaW4gdGhpcyBjb250ZXh0Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHBlcnNpc3RlbmNlIHhtbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sIGdldFBlcnNpc3RlbmNlWG1sKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVhtbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGVyc2lzdGVuY2VYbWwoUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwpIHsKLQkJUGVyc2lzdGVuY2VYbWwgb2xkID0gdGhpcy5wZXJzaXN0ZW5jZVhtbDsKLQkJdGhpcy5wZXJzaXN0ZW5jZVhtbCA9IHBlcnNpc3RlbmNlWG1sOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEVSU0lTVEVOQ0VfWE1MX1BST1BFUlRZLCBvbGQsIHBlcnNpc3RlbmNlWG1sKTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sIGFkZFBlcnNpc3RlbmNlWG1sKCkgewotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVhtbCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgcGFlID0gUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUodGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJUGVyc2lzdGVuY2VSZXNvdXJjZSBwciA9IHBhZS5jcmVhdGVEZWZhdWx0UmVzb3VyY2UoKTsKLQkJcGFlLmRpc3Bvc2UoKTsKLQkJUGVyc2lzdGVuY2VYbWwgcHggPSB0aGlzLmJ1aWxkUGVyc2lzdGVuY2VYbWwocHIpOwotCQl0aGlzLnNldFBlcnNpc3RlbmNlWG1sKHB4KTsKLQkJcmV0dXJuIHB4OwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVQZXJzaXN0ZW5jZVhtbCgpIHsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucGVyc2lzdGVuY2VYbWwuZGlzcG9zZSgpOwotCQlQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCBwYWUgPSBQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJUGVyc2lzdGVuY2VSZXNvdXJjZSBwciA9IHBhZS5nZXRSZXNvdXJjZSgpOwotCQlwYWUuZGlzcG9zZSgpOwotCQl0cnkgewotCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZGVsZXRlUmVzb3VyY2UocHIpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlKcHRDb3JlUGx1Z2luLmxvZyhjZSk7Ci0JCX0KLQkJCi0JCWlmICghIHByLmV4aXN0cygpKSB7Ci0JCQlzZXRQZXJzaXN0ZW5jZVhtbChudWxsKTsKLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgdXBkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCBwYWUgPSBQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKGdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQlQZXJzaXN0ZW5jZVJlc291cmNlIHByID0gcGFlLmdldFJlc291cmNlKCk7Ci0JCQotCQlpZiAocHIuZXhpc3RzKCkpIHsKLQkJCWlmICh0aGlzLnBlcnNpc3RlbmNlWG1sICE9IG51bGwpIHsKLQkJCQl0aGlzLnBlcnNpc3RlbmNlWG1sLnVwZGF0ZShwcik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRQZXJzaXN0ZW5jZVhtbCh0aGlzLmJ1aWxkUGVyc2lzdGVuY2VYbWwocHIpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFBlcnNpc3RlbmNlWG1sKG51bGwpOwotCQl9Ci0JCQotCQlwYWUuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbCBidWlsZFBlcnNpc3RlbmNlWG1sKFBlcnNpc3RlbmNlUmVzb3VyY2UgcGVyc2lzdGVuY2VSZXNvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRQZXJzaXN0ZW5jZVhtbCh0aGlzLCBwZXJzaXN0ZW5jZVJlc291cmNlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qIElmIHRoaXMgaXMgdHJ1ZSwgaXQgbWF5IGJlIGFzc3VtZWQgdGhhdCBhbGwgdGhlIHJlcXVpcmVtZW50cyBhcmUgdmFsaWQgCi0JICogZm9yIGZ1cnRoZXIgdmFsaWRhdGlvbi4gIEZvciBleGFtcGxlLCBpZiB0aGlzIGlzIHRydWUgYXQgdGhlIHBvaW50IHdlCi0JICogYXJlIHZhbGlkYXRpbmcgcGVyc2lzdGVuY2UgdW5pdHMsIGl0IG1heSBiZSBhc3N1bWVkIHRoYXQgdGhlcmUgaXMgYSAKLQkgKiBzaW5nbGUgcGVyc2lzdGVuY2UueG1sIGFuZCB0aGF0IGl0IGhhcyB2YWxpZCBjb250ZW50IGRvd24gdG8gdGhlIAotCSAqIHBlcnNpc3RlbmNlIHVuaXQgbGV2ZWwuICAqLwotCXByaXZhdGUgYm9vbGVhbiBva1RvQ29udGludWVWYWxpZGF0aW9uID0gdHJ1ZTsKLQkKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWFkZE5vUGVyc2lzdGVuY2VYbWxNZXNzYWdlKG1lc3NhZ2VzKTsKLQkJLy9UT0RPIC0gbXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdCBtZXNzYWdlCi0JCWFkZE9ycGhhbmVkSmF2YUNsYXNzTWVzc2FnZXMobWVzc2FnZXMpOwotCQkKLQkJaWYob2tUb0NvbnRpbnVlVmFsaWRhdGlvbikgewotCQkJZ2V0UGVyc2lzdGVuY2VYbWwoKS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJfQotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9QZXJzaXN0ZW5jZVhtbE1lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKHBlcnNpc3RlbmNlWG1sID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCAKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX05PX1BFUlNJU1RFTkNFX1hNTCwKLQkJCQkJCXRoaXMpCi0JCQkJKTsKLQkJCW9rVG9Db250aW51ZVZhbGlkYXRpb24gPSBmYWxzZTsKLQkJfQotCX0KLQkKLQkKLQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE9ycGhhbmVkSmF2YUNsYXNzTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKGdldFBlcnNpc3RlbmNlWG1sKCkgPT0gbnVsbCkgewotCQkJLy9oYW5kbGVkIHdpdGggb3RoZXIgdmFsaWRhdGlvbgotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkgPT0gbnVsbCkgewotCQkJLy9oYW5kbGVkIHdpdGggb3RoZXIgdmFsaWRhdGlvbgotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXRKcGFQcm9qZWN0KCkuZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG9ycGhhbmVkQ2xhc3NOYW1lcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGdldEpwYVByb2plY3QoKS5hbm5vdGF0ZWRDbGFzc05hbWVzKCkpOwotCQlpZiAoZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpLnBlcnNpc3RlbmNlVW5pdHNTaXplKCkgIT0gMSkgewotCQkJLy9jb250ZXh0IG1vZGVsIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIDEgcGVyc2lzdGVuY2VVbml0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKS5wZXJzaXN0ZW5jZVVuaXRzKCkubmV4dCgpOwotCQlmb3IgKFN0cmluZyB0eXBlTmFtZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShnZXRKcGFQcm9qZWN0KCkuYW5ub3RhdGVkQ2xhc3NOYW1lcygpKSkgewotCQkJZm9yIChDbGFzc1JlZiBjbGFzc1JlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVkQ2xhc3NSZWZzKCkpKSB7Ci0JCQkJaWYgKGNsYXNzUmVmLmlzRm9yKHR5cGVOYW1lKSkgewotCQkJCQlvcnBoYW5lZENsYXNzTmFtZXMucmVtb3ZlKHR5cGVOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHBlcnNpc3RlbmNlVW5pdC5tYXBwaW5nRmlsZVJlZnMoKSkpIHsKLQkJCQlpZiAobWFwcGluZ0ZpbGVSZWYuZ2V0T3JtWG1sKCkgPT0gbnVsbCB8fCBtYXBwaW5nRmlsZVJlZi5nZXRPcm1YbWwoKS5nZXRFbnRpdHlNYXBwaW5ncygpID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChtYXBwaW5nRmlsZVJlZi5nZXRPcm1YbWwoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKHR5cGVOYW1lKSAhPSBudWxsKSB7Ci0JCQkJCW9ycGhhbmVkQ2xhc3NOYW1lcy5yZW1vdmUodHlwZU5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJZm9yIChTdHJpbmcgb3JwaGFuZWRUeXBlTmFtZSA6IG9ycGhhbmVkQ2xhc3NOYW1lcykgewotCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2Uob3JwaGFuZWRUeXBlTmFtZSk7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9UWVBFX1VOU1BFQ0lGSUVEX0NPTlRFWFQsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpfSwKLQkJCQkJCQlqYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZU1vZGVsKCkuZ2V0RmlsZSgpLAotCQkJCQkJCWphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChqYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRKcGFDb21waWxhdGlvblVuaXQoKS5nZXRDb21waWxhdGlvblVuaXQoKSkpKQotCQkJCQkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvSnBhQ29udGV4dE5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvSnBhQ29udGV4dE5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWRiY2EyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L0pwYUNvbnRleHROb2RlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotCi1wdWJsaWMgY2xhc3MgSnBhQ29udGV4dE5vZGVBZGFwdGVyRmFjdG9yeQotCWltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBQUk9QRVJUSUVTID0gCi0JCW5ldyBDbGFzc1tdIHsgSVJlc291cmNlLmNsYXNzLCBJRmlsZS5jbGFzcyB9OwotCQotCQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gUFJPUEVSVElFUzsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBlbGVtZW50LCBDbGFzcyBrZXkpIHsKLQkJSnBhQ29udGV4dE5vZGUgbm9kZTsKLQkJCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSnBhQ29udGV4dE5vZGUpIHsKLQkJCW5vZGUgPSAoSnBhQ29udGV4dE5vZGUpIGVsZW1lbnQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSVJlc291cmNlIHJlc291cmNlID0gbm9kZS5nZXRSZXNvdXJjZSgpOwotCQkKLQkJaWYgKGtleS5lcXVhbHMoSVJlc291cmNlLmNsYXNzKSkgewotCQkJcmV0dXJuIHJlc291cmNlOwotCQl9Ci0JCWVsc2UgaWYgKGtleS5lcXVhbHMoSUZpbGUuY2xhc3MpICYmIHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQlyZXR1cm4gKElGaWxlKSByZXNvdXJjZTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9NYXBwaW5nVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L01hcHBpbmdUb29scy5qYXZhCmluZGV4IGMxOWY1ZTMuLjg1MjRlNTcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L01hcHBpbmdUb29scy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L01hcHBpbmdUb29scy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCiAgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDE1NCArMTAsMjM2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CiAKLXB1YmxpYyBjbGFzcyBNYXBwaW5nVG9vbHMKLXsJCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRhcmdldEVudGl0eUlzVmFsaWQoU3RyaW5nIHRhcmdldEVudGl0eSkgewotCQlpZiAodGFyZ2V0RW50aXR5ID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGJhbGFuY2UgaXMgIyBvZiBuYW1lIHRva2VucyAtICMgb2YgcGVyaW9kIHRva2VucyBzZWVuIHNvIGZhcgotCQkvLyBpbml0aWFsbHkgMDsgZmluYWxseSAxOyBzaG91bGQgbmV2ZXIgZHJvcCA8IDAgb3IgPiAxCi0JCWludCBiYWxhbmNlID0gMDsKLQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGFyZ2V0RW50aXR5LCAiLiIsIHRydWUpOyB0Lmhhc01vcmVUb2tlbnMoKTspIHsKLQkJCVN0cmluZyBzID0gdC5uZXh0VG9rZW4oKTsKLQkJCWlmIChzLmluZGV4T2YoJy4nKSA+PSAwKSB7Ci0JCQkJLy8gdGhpcyBpcyBhIGRlbGltaXRlcgotCQkJCWlmIChzLmxlbmd0aCgpID4gMSkgewotCQkJCQkvLyB0b28gbWFueSBwZXJpb2RzIGluIGEgcm93Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJYmFsYW5jZS0tOwotCQkJCWlmIChiYWxhbmNlIDwgMCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyB0aGlzIGlzIGFuIGlkZW50aWZpZXIgc2VnbWVudAotCQkJCWJhbGFuY2UrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKGJhbGFuY2UgPT0gMSk7Ci0JfQotCQorLyoqCisgKiBHYXRoZXIgc29tZSBvZiB0aGUgYmVoYXZpb3IgY29tbW9uIHRvIHRoZSBKYXZhIGFuZCBYTUwgbW9kZWxzLiA6LSgKKyAqLworcHVibGljIGNsYXNzIE1hcHBpbmdUb29scyB7CisKIAkvKioKIAkgKiBEZWZhdWx0IGpvaW4gdGFibGUgbmFtZSBmcm9tIHRoZSBKUEEgc3BlYzoKIAkgKiAJVGhlIGNvbmNhdGVuYXRlZCBuYW1lcyBvZiB0aGUgdHdvIGFzc29jaWF0ZWQgcHJpbWFyeQogCSAqIAllbnRpdHkgdGFibGVzLCBzZXBhcmF0ZWQgYnkgYSB1bmRlcnNjb3JlLgogCSAqIAogCSAqIFtvd25pbmcgdGFibGUgbmFtZV1fW3RhcmdldCB0YWJsZSBuYW1lXQorCSAqIAorCSAqIE5COiBUaGUgKm5hbWVzKiBhcmUgY29uY2F0ZW5hdGVkLCAqbm90KiB0aGUgKmlkZW50aWZpZXJzKi4KKwkgKiBFLmcuIHRoZSBqb2luIHRhYmxlIGZvciAiRm9vIiBhbmQgImJhUiIgKHdoZXJlIHRoZSAiZGVsaW1pdGVkIiBpZGVudGlmaWVyCisJICogaXMgcmVxdWlyZWQpIGlzCisJICogICAgICJGb29fYmFSIgorCSAqIG5vdAorCSAqICAgICAiRm9vIl8iYmFSIgorCSAqIEFzIGEgcmVzdWx0LCB3ZSBjYW5ub3QgaG9uZXN0bHkgY2FsY3VsYXRlIHRoZSBkZWZhdWx0IG5hbWUgd2l0aG91dCBhCisJICogZGF0YWJhc2UgY29ubmVjdGlvbi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZEpvaW5UYWJsZURlZmF1bHROYW1lKFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZykgewotCQlpZiAoIXJlbGF0aW9uc2hpcE1hcHBpbmcuaXNSZWxhdGlvbnNoaXBPd25lcigpKSB7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRKb2luVGFibGVEZWZhdWx0TmFtZShSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcmVsYXRpb25zaGlwUmVmZXJlbmNlKSB7CisJCWlmIChyZWxhdGlvbnNoaXBSZWZlcmVuY2UuZ2V0SnBhUHJvamVjdCgpLmdldERhdGFTb3VyY2UoKS5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkpIHsKKwkJCXJldHVybiBidWlsZERiSm9pblRhYmxlRGVmYXVsdE5hbWUocmVsYXRpb25zaGlwUmVmZXJlbmNlKTsKKwkJfQorCQkvLyBjb250aW51ZSB3aXRoIGEgImJlc3QgZWZmb3J0IjoKKwkJU3RyaW5nIG93bmluZ1RhYmxlTmFtZSA9IHJlbGF0aW9uc2hpcFJlZmVyZW5jZS5nZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlUYWJsZU5hbWUoKTsKKwkJaWYgKG93bmluZ1RhYmxlTmFtZSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlTdHJpbmcgb3duaW5nVGFibGVOYW1lID0gcmVsYXRpb25zaGlwTWFwcGluZy5nZXRUeXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCQlpZiAob3duaW5nVGFibGVOYW1lID09IG51bGwpIHsKKwkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gcmVsYXRpb25zaGlwUmVmZXJlbmNlLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKwkJaWYgKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAkJRW50aXR5IHRhcmdldEVudGl0eSA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKIAkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlTdHJpbmcgdGFyZ2V0VGFibGVOYW1lID0gdGFyZ2V0RW50aXR5LmdldFRhYmxlTmFtZSgpOworCQlTdHJpbmcgdGFyZ2V0VGFibGVOYW1lID0gdGFyZ2V0RW50aXR5LmdldFByaW1hcnlUYWJsZU5hbWUoKTsKIAkJaWYgKHRhcmdldFRhYmxlTmFtZSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gb3duaW5nVGFibGVOYW1lICsgIl8iICsgdGFyZ2V0VGFibGVOYW1lOworCQlyZXR1cm4gb3duaW5nVGFibGVOYW1lICsgJ18nICsgdGFyZ2V0VGFibGVOYW1lOwogCX0KIAogCS8qKgotCSAqIHJldHVybiB0aGUgam9pbiBjb2x1bW4ncyBkZWZhdWx0IG5hbWU7Ci0JICogd2hpY2ggaXMgdHlwaWNhbGx5ICZsdDthdHRyaWJ1dGUgbmFtZSZndDtfJmx0O3JlZmVyZW5jZWQgY29sdW1uIG5hbWUmZ3Q7Ci0JICogYnV0LCBpZiB3ZSBkb24ndCBoYXZlIGFuIGF0dHJpYnV0ZSBuYW1lIChlLmcuIGluIGEgdW5pZGlyZWN0aW9uYWwKLQkgKiBPbmVUb01hbnkgb3IgTWFueVRvTWFueSkgaXMKLQkgKiAmbHQ7dGFyZ2V0IGVudGl0eSBuYW1lJmd0O18mbHQ7cmVmZXJlbmNlZCBjb2x1bW4gbmFtZSZndDsKKwkgKiBVc2UgdGhlIGRhdGFiYXNlIHRvIGJ1aWxkIGEgbW9yZSBhY2N1cmF0ZSBkZWZhdWx0IG5hbWUuCiAJICovCi0JLy8gPGF0dHJpYnV0ZSBuYW1lPl88cmVmZXJlbmNlZCBjb2x1bW4gbmFtZT4KLQkvLyAgICAgb3IKLQkvLyA8dGFyZ2V0IGVudGl0eSBuYW1lPl88cmVmZXJlbmNlZCBjb2x1bW4gbmFtZT4KKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBidWlsZERiSm9pblRhYmxlRGVmYXVsdE5hbWUoUmVsYXRpb25zaGlwUmVmZXJlbmNlIHJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgeworCQlUYWJsZSBvd25pbmdUYWJsZSA9IHJlbGF0aW9uc2hpcFJlZmVyZW5jZS5nZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlEYlRhYmxlKCk7CisJCWlmIChvd25pbmdUYWJsZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcgPSByZWxhdGlvbnNoaXBSZWZlcmVuY2UuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOworCQlpZiAocmVsYXRpb25zaGlwTWFwcGluZyA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gcmVsYXRpb25zaGlwTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOworCQlpZiAodGFyZ2V0RW50aXR5ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCVRhYmxlIHRhcmdldFRhYmxlID0gdGFyZ2V0RW50aXR5LmdldFByaW1hcnlEYlRhYmxlKCk7CisJCWlmICh0YXJnZXRUYWJsZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlTdHJpbmcgbmFtZSA9IG93bmluZ1RhYmxlLmdldE5hbWUoKSArICdfJyArIHRhcmdldFRhYmxlLmdldE5hbWUoKTsKKwkJcmV0dXJuIG93bmluZ1RhYmxlLmdldERhdGFiYXNlKCkuY29udmVydE5hbWVUb0lkZW50aWZpZXIobmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBqb2luIGNvbHVtbidzIGRlZmF1bHQgbmFtZTsKKwkgKiB3aGljaCBpcyB0eXBpY2FsbHkKKwkgKiAgICAgW2F0dHJpYnV0ZSBuYW1lXV9bcmVmZXJlbmNlZCBjb2x1bW4gbmFtZV0KKwkgKiBCdXQsIGlmIHdlIGRvbid0IGhhdmUgYW4gYXR0cmlidXRlIG5hbWUgKGUuZy4gaW4gYSB1bmlkaXJlY3Rpb25hbAorCSAqIE9uZVRvTWFueSBvciBNYW55VG9NYW55KSBpcworCSAqICAgICBbdGFyZ2V0IGVudGl0eSBuYW1lXV9bcmVmZXJlbmNlZCBjb2x1bW4gbmFtZV0KKwkgKiAKKwkgKiBAc2VlICNidWlsZEpvaW5UYWJsZURlZmF1bHROYW1lKFJlbGF0aW9uc2hpcE1hcHBpbmcpCisJICovCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRKb2luQ29sdW1uRGVmYXVsdE5hbWUoSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWlmIChqb2luQ29sdW1uLmdldE93bmVyKCkuam9pbkNvbHVtbnNTaXplKCkgIT0gMSkgeworCQlKb2luQ29sdW1uLk93bmVyIG93bmVyID0gam9pbkNvbHVtbi5nZXRPd25lcigpOworCQlSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcgPSBvd25lci5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7CisJCWlmIChyZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCVN0cmluZyBwcmVmaXggPSBqb2luQ29sdW1uLmdldE93bmVyKCkuZ2V0QXR0cmlidXRlTmFtZSgpOwotCQlpZiAocHJlZml4ID09IG51bGwpIHsKLQkJCXByZWZpeCA9IHRhcmdldEVudGl0eU5hbWUoam9pbkNvbHVtbik7Ci0JCX0KLQkJaWYgKHByZWZpeCA9PSBudWxsKSB7CisJCWlmIChvd25lci5qb2luQ29sdW1uc1NpemUoKSAhPSAxKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQkvLyBUT0RPIG5vdCBzdXJlIHdoaWNoIG9mIHRoZXNlIGlzIGNvcnJlY3QuLi4KKwkJU3RyaW5nIHByZWZpeCA9IG93bmVyLmdldEF0dHJpYnV0ZU5hbWUoKTsKKwkJaWYgKHByZWZpeCA9PSBudWxsKSB7CisJCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gb3duZXIuZ2V0VGFyZ2V0RW50aXR5KCk7CisJCQlpZiAodGFyZ2V0RW50aXR5ID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXByZWZpeCA9IHRhcmdldEVudGl0eS5nZXROYW1lKCk7CisJCX0KKwkJLy8gbm90IHN1cmUgd2hpY2ggb2YgdGhlc2UgaXMgY29ycmVjdC4uLgogCQkvLyAodGhlIHNwZWMgaW1wbGllcyB0aGF0IHRoZSByZWZlcmVuY2VkIGNvbHVtbiBpcyBhbHdheXMgdGhlCiAJCS8vIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgdGFyZ2V0IGVudGl0eSkKLQkJLy8gU3RyaW5nIHRhcmdldENvbHVtbiA9IHRoaXMudGFyZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKLQkJU3RyaW5nIHRhcmdldENvbHVtbiA9IGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJaWYgKHRhcmdldENvbHVtbiA9PSBudWxsKSB7CisJCS8vIENvbHVtbiB0YXJnZXRDb2x1bW4gPSBqb2luQ29sdW1uLmdldFRhcmdldFByaW1hcnlLZXlEYkNvbHVtbigpOworCQlTdHJpbmcgdGFyZ2V0Q29sdW1uTmFtZSA9IGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKKwkJaWYgKHRhcmdldENvbHVtbk5hbWUgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJcmV0dXJuIHByZWZpeCArICJfIiArIHRhcmdldENvbHVtbjsKKwkJU3RyaW5nIG5hbWUgPSBwcmVmaXggKyAnXycgKyB0YXJnZXRDb2x1bW5OYW1lOworCQkvLyBub3Qgc3VyZSB3aGljaCBvZiB0aGVzZSBpcyBjb3JyZWN0Li4uCisJCS8vIGNvbnZlcnRpbmcgdGhlIG5hbWUgdG8gYW4gaWRlbnRpZmllciB3aWxsIHJlc3VsdCBpbiB0aGUgaWRlbnRpZmllcgorCQkvLyBiZWluZyBkZWxpbWl0ZWQgbmVhcmx5IGV2ZXJ5IHRpbWUgKGF0IGxlYXN0IG9uIG5vbi1TeWJhc2UvTVMKKwkJLy8gZGF0YWJhc2VzKTsgYnV0IHRoYXQgcHJvYmFibHkgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhlIHNwZWMuLi4KKwkJLy8gcmV0dXJuIHRhcmdldENvbHVtbi5nZXREYXRhYmFzZSgpLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKG5hbWUpOworCQlyZXR1cm4gbmFtZTsKIAl9CiAKIAkvKioKLQkgKiByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBlbnRpdHkKKwkgKiBJZiBhcHByb3ByaWF0ZSwgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzaW5nbGUgcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZQorCSAqIHRhcmdldCBlbnRpdHkuCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgdGFyZ2V0RW50aXR5TmFtZShKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJRW50aXR5IHRhcmdldEVudGl0eSA9IGpvaW5Db2x1bW4uZ2V0T3duZXIoKS5nZXRUYXJnZXRFbnRpdHkoKTsKLQkJcmV0dXJuICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogdGFyZ2V0RW50aXR5LmdldE5hbWUoKTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZEpvaW5Db2x1bW5EZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoSm9pbkNvbHVtbi5Pd25lciBqb2luQ29sdW1uT3duZXIpIHsKKwkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gam9pbkNvbHVtbk93bmVyLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKwkJaWYgKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKGpvaW5Db2x1bW5Pd25lci5qb2luQ29sdW1uc1NpemUoKSAhPSAxKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gam9pbkNvbHVtbk93bmVyLmdldFRhcmdldEVudGl0eSgpOworCQlpZiAodGFyZ2V0RW50aXR5ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiB0YXJnZXRFbnRpdHkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKIAl9CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZEpvaW5Db2x1bW5EZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWlmIChqb2luQ29sdW1uLmdldE93bmVyKCkuam9pbkNvbHVtbnNTaXplKCkgIT0gMSkgeworCXB1YmxpYyBzdGF0aWMgQ29sdW1uTWFwcGluZyBnZXRDb2x1bW5NYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgeworCQlpZiAoYXR0cmlidXRlTmFtZSA9PSBudWxsIHx8IHBlcnNpc3RlbnRUeXBlID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiB0YXJnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZShqb2luQ29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNpbmdsZSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHRhcmdldCBlbnRpdHkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyB0YXJnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZShKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJRW50aXR5IHRhcmdldEVudGl0eSA9IGpvaW5Db2x1bW4uZ2V0T3duZXIoKS5nZXRUYXJnZXRFbnRpdHkoKTsKLQkJcmV0dXJuICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogdGFyZ2V0RW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgRW1iZWRkYWJsZSBnZXRFbWJlZGRhYmxlRm9yKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRRdWFsaWZpZWRUeXBlTmFtZSgpOwotCQlpZiAocXVhbGlmaWVkVHlwZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKHF1YWxpZmllZFR5cGVOYW1lKTsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCWlmIChwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nS2V5KCkgPT0gTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKSB7Ci0JCQkJcmV0dXJuIChFbWJlZGRhYmxlKSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29sdW1uTWFwcGluZyBnZXRDb2x1bW5NYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBFbWJlZGRhYmxlIGVtYmVkZGFibGUpIHsKLQkJaWYgKGF0dHJpYnV0ZU5hbWUgPT0gbnVsbCB8fCBlbWJlZGRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gZW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKKwkJZm9yIChJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBwZXJzaXN0ZW50VHlwZS5hbGxBdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewogCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzQXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKIAkJCWlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhwZXJzQXR0cmlidXRlLmdldE5hbWUoKSkpIHsKIAkJCQlpZiAocGVyc0F0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBDb2x1bW5NYXBwaW5nKSB7CiAJCQkJCXJldHVybiAoQ29sdW1uTWFwcGluZykgcGVyc0F0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQkJfQorCQkJCS8vIGtlZXAgbG9va2luZyBvciByZXR1cm4gbnVsbD8/PwogCQkJfQogCQl9CiAJCXJldHVybiBudWxsOwkJCiAJfQorCQorCXB1YmxpYyBzdGF0aWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgeworCQlpZiAoYXR0cmlidXRlTmFtZSA9PSBudWxsIHx8IHR5cGVNYXBwaW5nID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWZvciAoSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZz4gc3RyZWFtID0gdHlwZU1hcHBpbmcuYWxsQXR0cmlidXRlTWFwcGluZ3MoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSBzdHJlYW0ubmV4dCgpOworCQkJaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZSgpKSkgeworCQkJCWlmIChhdHRyaWJ1dGVNYXBwaW5nIGluc3RhbmNlb2YgUmVsYXRpb25zaGlwTWFwcGluZykgeworCQkJCQlyZXR1cm4gKFJlbGF0aW9uc2hpcE1hcHBpbmcpIGF0dHJpYnV0ZU1hcHBpbmc7CisJCQkJfQorCQkJCS8vIGtlZXAgbG9va2luZyBvciByZXR1cm4gbnVsbD8/PworCQkJfQorCQl9CisJCXJldHVybiBudWxsOwkJCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRKb2luVGFibGVEZWZhdWx0VG9TcGVjaWZpZWRKb2luQ29sdW1uKEpvaW5UYWJsZSBqb2luVGFibGUpIHsKKwkJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOworCQlpZiAoZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgeworCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOworCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7CisJCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShjb2x1bW5OYW1lKTsKKwkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRKb2luVGFibGVEZWZhdWx0VG9TcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihKb2luVGFibGUgam9pblRhYmxlKSB7CisJCUpvaW5Db2x1bW4gZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gam9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpOworCQlpZiAoZGVmYXVsdEludmVyc2VKb2luQ29sdW1uICE9IG51bGwpIHsKKwkJCVN0cmluZyBjb2x1bW5OYW1lID0gZGVmYXVsdEludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCk7CisJCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7CisJCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7CisJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoY29sdW1uTmFtZSk7CisJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZU5hbWUoTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmcpIHsKKwkJRW50aXR5IHRhcmdldEVudGl0eSA9IG1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKKwkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7CisJCQlyZXR1cm4gTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7CisJCX0KKwkJU3RyaW5nIG1hcEtleSA9IG1hcHBpbmcuZ2V0TWFwS2V5KCk7CisJCWlmIChtYXBLZXkgPT0gbnVsbCkgeworCQkJcmV0dXJuIE1ldGFtb2RlbEZpZWxkLkRFRkFVTFRfVFlQRV9OQU1FOworCQl9CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgbWFwS2V5QXR0cmlidXRlID0gdGFyZ2V0RW50aXR5LmdldFBlcnNpc3RlbnRUeXBlKCkucmVzb2x2ZUF0dHJpYnV0ZShtYXBLZXkpOworCQlpZiAobWFwS2V5QXR0cmlidXRlID09IG51bGwpIHsKKwkJCXJldHVybiBNZXRhbW9kZWxGaWVsZC5ERUZBVUxUX1RZUEVfTkFNRTsKKwkJfQorCQlBdHRyaWJ1dGVNYXBwaW5nMl8wIG1hcEtleU1hcHBpbmcgPSAoQXR0cmlidXRlTWFwcGluZzJfMCkgbWFwS2V5QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJaWYgKG1hcEtleU1hcHBpbmcgPT0gbnVsbCkgeworCQkJcmV0dXJuIE1ldGFtb2RlbEZpZWxkLkRFRkFVTFRfVFlQRV9OQU1FOworCQl9CisJCXJldHVybiBtYXBLZXlNYXBwaW5nLmdldE1ldGFtb2RlbFR5cGVOYW1lKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKKworCS8qKgorCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCisJICovCisJcHJpdmF0ZSBNYXBwaW5nVG9vbHMoKSB7CisJCXN1cGVyKCk7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTBmOTgyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwyNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCisJaW1wbGVtZW50cyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZQoreworCisJLy8gY2FjaGUgdGhlIHN0cmF0ZWd5IGZvciBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZpY2F0aW9uCisJcHJvdGVjdGVkIEpvaW5pbmdTdHJhdGVneSBjYWNoZWRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneTsKKworCXByb3RlY3RlZCBmaW5hbCBKYXZhSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCisJcHJvdGVjdGVkIEFic3RyYWN0SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSA9IGJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kgYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneSh0aGlzKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChKYXZhQXNzb2NpYXRpb25PdmVycmlkZSkgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkgeworCQlyZXR1cm4gZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbigpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCXJldHVybiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0T3duZXIoKS5nZXRUeXBlTWFwcGluZygpOworCX0KKworCXB1YmxpYyBFbnRpdHkgZ2V0RW50aXR5KCkgeworCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IGdldFR5cGVNYXBwaW5nKCk7CisJCXJldHVybiAodHlwZU1hcHBpbmcgaW5zdGFuY2VvZiBFbnRpdHkpID8gKEVudGl0eSkgdHlwZU1hcHBpbmcgOiBudWxsOworCX0KKworCS8vICoqKioqKioqKioqKioqKiogUmVsYXRpb25zaGlwTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIGJvb2xlYW4gaXNQYXJlbnRWaXJ0dWFsKCkgeworCQlyZXR1cm4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmlzVmlydHVhbCgpOworCX0KKwkKKwkvLyAqKioqKioqKioqKioqKioqIHByZWRvbWluYW50IGpvaW5pbmcgc3RyYXRlZ3kgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEpvaW5pbmdTdHJhdGVneSBnZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIHRoaXMuY2FjaGVkUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KEpvaW5pbmdTdHJhdGVneSBuZXdKb2luaW5nU3RyYXRlZ3kpIHsKKwkJSm9pbmluZ1N0cmF0ZWd5IG9sZEpvaW5pbmdTdHJhdGVneSA9IHRoaXMuY2FjaGVkUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3k7CisJCXRoaXMuY2FjaGVkUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3kgPSBuZXdKb2luaW5nU3RyYXRlZ3k7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJFRE9NSU5BTlRfSk9JTklOR19TVFJBVEVHWV9QUk9QRVJUWSwgb2xkSm9pbmluZ1N0cmF0ZWd5LCBuZXdKb2luaW5nU3RyYXRlZ3kpOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSkgeworCQlpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWdpZXMoYXNzb2NpYXRpb25PdmVycmlkZSk7CisJCXRoaXMuY2FjaGVkUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3kgPSBjYWxjdWxhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpOworCX0JCQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luaW5nU3RyYXRlZ2llcyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5pbml0aWFsaXplKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwkJCisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJdXBkYXRlSm9pbmluZ1N0cmF0ZWdpZXMoYXNzb2NpYXRpb25PdmVycmlkZSk7CisJCXNldFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KGNhbGN1bGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkpOworCX0JCisJCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUpvaW5pbmdTdHJhdGVnaWVzKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnVwZGF0ZShhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IEpvaW5pbmdTdHJhdGVneSBjYWxjdWxhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpOworCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXJlc3VsdCA9IHRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpKSB7CisJCQl0aGlzLnZhbGlkYXRlSm9pbkNvbHVtbnMobWVzc2FnZXMsIGFzdFJvb3QpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSm9pbkNvbHVtbnMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCWZvciAoSXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IHN0cmVhbSA9IHRoaXMuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmpvaW5Db2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJdGhpcy52YWxpZGF0ZUpvaW5Db2x1bW4oc3RyZWFtLm5leHQoKSwgbWVzc2FnZXMsIGFzdFJvb3QpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVKb2luQ29sdW1uKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4sIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlTdHJpbmcgdGFibGVOYW1lID0gam9pbkNvbHVtbi5nZXRUYWJsZSgpOworCQlpZiAodGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0T3duZXIoKS5nZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpKSB7CisJCQlpZiAodGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuaXNWaXJ0dWFsKCkpIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldE5hbWUoKSwgdGFibGVOYW1lLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sCisJCQkJCQlqb2luQ29sdW1uLCAKKwkJCQkJCWpvaW5Db2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJKQorCQkJCSk7CisJCQl9IGVsc2UgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RhYmxlTmFtZSwgam9pbkNvbHVtbi5nZXROYW1lKCl9LCAKKwkJCQkJCWpvaW5Db2x1bW4sCisJCQkJCQlqb2luQ29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKGFzdFJvb3QpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoICEgam9pbkNvbHVtbi5pc1Jlc29sdmVkKCkpIHsKKwkJCWlmICh0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5pc1ZpcnR1YWwoKSkgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAorCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0TmFtZSgpfSwgCisJCQkJCQlqb2luQ29sdW1uLAorCQkJCQkJam9pbkNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpCisJCQkJCSkKKwkJCQkpOworCQkJfSBlbHNlIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCisJCQkJCQluZXcgU3RyaW5nW10ge2pvaW5Db2x1bW4uZ2V0TmFtZSgpfSwgCisJCQkJCQlqb2luQ29sdW1uLCAKKwkJCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KQorCQkJCQkpCisJCQkJKTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKCAhIGpvaW5Db2x1bW4uaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSkgeworCQkJaWYgKHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmlzVmlydHVhbCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldE5hbWUoKSwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQkJam9pbkNvbHVtbiwKKwkJCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJKQorCQkJCSk7CisJCQl9IGVsc2UgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQkJam9pbkNvbHVtbiwKKwkJCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJKQorCQkJCSk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKworCS8vICoqKioqKioqKioqKioqKiogam9pbiBjb2x1bW5zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKworCXB1YmxpYyBKYXZhSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneSBnZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiB1c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIGdldFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgPT0gdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuYWRkU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIHZvaWQgdW5zZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luQ29sdW1uKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKKwkJcmV0dXJuIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXRPd25lcigpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldE5hbWUoKSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNPd25lZEJ5KFJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZykgeworCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmlzT3duZWRCeShtYXBwaW5nKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aW9uc2hpcE93bmVyKCkgeworCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmlzUmVsYXRpb25zaGlwT3duZXIoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nLmphdmEKaW5kZXggMjRlYzJlMS4uOWQyMzQ4ZSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw0NyArOSw2OSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuU2ltcGxlTWV0YW1vZGVsRmllbGQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwogCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPFQgZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlPiBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZworLyoqCisgKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5nCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPgorCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nLCBBdHRyaWJ1dGVNYXBwaW5nMl8wCiB7Ci0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworCXByb3RlY3RlZCBUIG1hcHBpbmdBbm5vdGF0aW9uOworCQorCXByaXZhdGUgU3RyaW5nW10gc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lczsKIAkKIAogCXByb3RlY3RlZCBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewogCQlzdXBlcihwYXJlbnQpOwogCX0KIAkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgVCBnZXRNYXBwaW5nUmVzb3VyY2UoKSB7Ci0JCWlmIChpc0RlZmF1bHQoKSkgewotCQkJcmV0dXJuIChUKSB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROdWxsTWFwcGluZ0Fubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIChUKSB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBzdXBlci5nZXRQYXJlbnQoKTsKIAl9CiAJCi0JcHVibGljIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gKEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgdGhpcy5nZXRQYXJlbnQoKTsKKwlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7CiAJfQogCiAJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CisJCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwogCX0KIAkKKwlwdWJsaWMgVCBnZXRNYXBwaW5nQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMubWFwcGluZ0Fubm90YXRpb247CisJfQorCQkKIAkvKioKIAkgKiB0aGUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgY2FuIHRlbGwgd2hldGhlciB0aGVyZSBpcyBhICJzcGVjaWZpZWQiIG1hcHBpbmcKIAkgKiBvciBhICJkZWZhdWx0IiBvbmUKQEAgLTU4LDM1ICs4MCwyMiBAQAogCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkubWFwcGluZ0lzRGVmYXVsdCh0aGlzKTsKIAl9CiAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbWJlZGRhYmxlT3duZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbnRpdHlPd25lZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWTsKKwlwdWJsaWMgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZUFnYWluc3REYXRhYmFzZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5zaG91bGRWYWxpZGF0ZUFnYWluc3REYXRhYmFzZSgpOwogCX0KIAkKIAlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CiAJCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRUeXBlTWFwcGluZygpOwogCX0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAJCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCk7CiAJfQogCQogCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOworCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldERiVGFibGUodGFibGVOYW1lKTsKIAl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBudWxsOwotCQlUIG1hcHBpbmdSZXNvdXJjZSA9IGdldE1hcHBpbmdSZXNvdXJjZSgpOwotCQlpZiAobWFwcGluZ1Jlc291cmNlICE9IG51bGwpIHsKLQkJCXRleHRSYW5nZSA9IG1hcHBpbmdSZXNvdXJjZS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKKwogCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSB7CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTEwMiw3NSArMTExLDE4MiBAQAogCXB1YmxpYyBib29sZWFuIGlzSWRNYXBwaW5nKCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQkJaW5pdGlhbGl6ZShnZXRNYXBwaW5nUmVzb3VyY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShUIG1hcHBpbmdSZXNvdXJjZSkgewotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JCXRoaXMudXBkYXRlKGdldE1hcHBpbmdSZXNvdXJjZSgpKTsKKwkKKwlwdWJsaWMgYm9vbGVhbiBpc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7CisJCXJldHVybiBmYWxzZTsKIAl9CiAJCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKFQgbWFwcGluZ1Jlc291cmNlKSB7Ci0JCQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbE1hcHBpbmdOYW1lcygpIHsKKwkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8U3RyaW5nPihnZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgQXR0cmlidXRlTWFwcGluZyByZXNvbHZlQXR0cmlidXRlTWFwcGluZyhTdHJpbmcgbmFtZSkgeworCQlpZiAoZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbE92ZXJyaWRlYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpIHsKKwkJaWYgKGlzT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nKCkpIHsKKwkJCXJldHVybiBhbGxNYXBwaW5nTmFtZXMoKTsKKwkJfQorCQlyZXR1cm4gRW1wdHlJdGVyYXRvci48U3RyaW5nPiBpbnN0YW5jZSgpOworCX0KKwkKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkZWFibGVBc3NvY2lhdGlvbk1hcHBpbmdOYW1lcygpIHsKKwkJaWYgKGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmcoKSkgeworCQkJcmV0dXJuIGFsbE1hcHBpbmdOYW1lcygpOworCQl9CisJCXJldHVybiBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+IGluc3RhbmNlKCk7CisJfQorCQorCXB1YmxpYyBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworCQlDb2x1bW5NYXBwaW5nIGNvbHVtbk1hcHBpbmcgPSB0aGlzLnJlc29sdmVDb2x1bW5NYXBwaW5nKGF0dHJpYnV0ZU5hbWUpOworCQlyZXR1cm4gY29sdW1uTWFwcGluZyA9PSBudWxsID8gbnVsbCA6IGNvbHVtbk1hcHBpbmcuZ2V0Q29sdW1uKCk7CisJfQorCQorCXByb3RlY3RlZCBDb2x1bW5NYXBwaW5nIHJlc29sdmVDb2x1bW5NYXBwaW5nKFN0cmluZyBuYW1lKSB7CisJCUF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IHJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKG5hbWUpOworCQlpZiAoYXR0cmlidXRlTWFwcGluZyAhPSBudWxsICYmIGF0dHJpYnV0ZU1hcHBpbmcuaXNPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmcoKSkgeworCQkJcmV0dXJuIChDb2x1bW5NYXBwaW5nKSBhdHRyaWJ1dGVNYXBwaW5nOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgUmVsYXRpb25zaGlwUmVmZXJlbmNlIHJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKwkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gdGhpcy5yZXNvbHZlUmVsYXRpb25zaGlwTWFwcGluZyhhdHRyaWJ1dGVOYW1lKTsKKwkJcmV0dXJuIHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCA/IG51bGwgOiByZWxhdGlvbnNoaXBNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwTWFwcGluZyByZXNvbHZlUmVsYXRpb25zaGlwTWFwcGluZyhTdHJpbmcgbmFtZSkgeworCQlBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSByZXNvbHZlQXR0cmlidXRlTWFwcGluZyhuYW1lKTsKKwkJaWYgKGF0dHJpYnV0ZU1hcHBpbmcgIT0gbnVsbCAmJiBhdHRyaWJ1dGVNYXBwaW5nLmlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmcoKSkgeworCQkJcmV0dXJuIChSZWxhdGlvbnNoaXBNYXBwaW5nKSBhdHRyaWJ1dGVNYXBwaW5nOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvLyAqKioqKioqKioqIHN1cHBvcnRpbmcgYW5ub3RhdGlvbiBuYW1lcyAqKioqKioqKioqCisJCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKKwkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxTdHJpbmc+KGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKKwkJaWYgKHRoaXMuc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcyA9PSBudWxsKSB7CisJCQl0aGlzLnN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMgPSB0aGlzLmJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpOworCQl9CisJCXJldHVybiB0aGlzLnN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXM7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmdbXSBidWlsZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nWzBdOwogCX0KIAorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKKwkJdGhpcy5tYXBwaW5nQW5ub3RhdGlvbiA9IChUKSBhbm5vdGF0aW9uOworCQl0aGlzLmluaXRpYWxpemUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewkKKwkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIHZvaWQgdXBkYXRlKEFubm90YXRpb24gYW5ub3RhdGlvbikgeworCQl0aGlzLm1hcHBpbmdBbm5vdGF0aW9uID0gKFQpIGFubm90YXRpb247CisJCXRoaXMudXBkYXRlKCk7CisJfQogCQotCS8vKioqKioqKioqKioqIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKgorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKKwkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5nZXROYW1lKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKgorCisJcHVibGljIE1ldGFtb2RlbEZpZWxkIGdldE1ldGFtb2RlbEZpZWxkKCkgeworCQlyZXR1cm4gbmV3IFNpbXBsZU1ldGFtb2RlbEZpZWxkKAorCQkJCXRoaXMuZ2V0TWV0YW1vZGVsRmllbGRNb2RpZmllcnMoKSwKKwkJCQl0aGlzLmdldE1ldGFtb2RlbEZpZWxkVHlwZU5hbWUoKSwKKwkJCQl0aGlzLmdldE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXMoKSwKKwkJCQl0aGlzLmdldE1ldGFtb2RlbEZpZWxkTmFtZSgpCisJCQkpOworCX0KKworCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldE1ldGFtb2RlbEZpZWxkTW9kaWZpZXJzKCkgeworCQlyZXR1cm4gU1RBTkRBUkRfTUVUQU1PREVMX0ZJRUxEX01PRElGSUVSUzsKKwl9CisKKwkvKioKKwkgKiBtb3N0IG1hcHBpbmdzIGFyZSAic2luZ3VsYXIiCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRNZXRhbW9kZWxGaWVsZFR5cGVOYW1lKCkgeworCQlyZXR1cm4gSlBBMl8wLlNJTkdVTEFSX0FUVFJJQlVURTsKKwl9CisKKwlwcm90ZWN0ZWQgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBnZXRNZXRhbW9kZWxGaWVsZFR5cGVBcmd1bWVudE5hbWVzKCkgeworCQlBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigzKTsKKwkJdHlwZUFyZ3VtZW50TmFtZXMuYWRkKHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKSk7CisJCXRoaXMuYWRkTWV0YW1vZGVsRmllbGRUeXBlQXJndW1lbnROYW1lc1RvKHR5cGVBcmd1bWVudE5hbWVzKTsKKwkJcmV0dXJuIHR5cGVBcmd1bWVudE5hbWVzOworCX0KKworCS8qKgorCSAqIGJ5IGRlZmF1bHQsIHdlIGFkZCBvbmx5IHRoZSBtYXBwaW5nJ3MgYXR0cmlidXRlIHR5cGUgbmFtZTsKKwkgKiBidXQgY29sbGVjdGlvbiByZWxhdGlvbnNoaXAgbWFwcGluZ3Mgd2lsbCBhbHNvIG5lZWQgdG8gYWRkIHRoZSBrZXkgdHlwZQorCSAqIG5hbWUgaWYgdGhlICJjb2xsZWN0aW9uIiBpcyBvZiB0eXBlIGphdmEudXRpbC5NYXAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRhbW9kZWxGaWVsZFR5cGVBcmd1bWVudE5hbWVzVG8oQXJyYXlMaXN0PFN0cmluZz4gdHlwZUFyZ3VtZW50TmFtZXMpIHsKKwkJdHlwZUFyZ3VtZW50TmFtZXMuYWRkKHRoaXMuZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpIHsKKwkJcmV0dXJuICgoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzApIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpKS5nZXRNZXRhbW9kZWxUeXBlTmFtZSgpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWV0YW1vZGVsRmllbGROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5nZXROYW1lKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgogCQogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQkKLQkJYWRkTW9kaWZpZXJNZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCWFkZEludmFsaWRNYXBwaW5nTWVzc2FnZShtZXNzYWdlcywgYXN0Um9vdCk7CisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy52YWxpZGF0ZU1hcHBpbmdUeXBlKG1lc3NhZ2VzLCBhc3RSb290KTsKIAl9CiAJCi0JcHJvdGVjdGVkIHZvaWQgYWRkTW9kaWZpZXJNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlpZiAoYXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICggdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNGb3JGaWVsZCgpKSB7Ci0JCQlpZiAodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNGaW5hbCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfRklFTEQsCi0JCQkJCQluZXcgU3RyaW5nW10ge2F0dHJpYnV0ZS5nZXROYW1lKCl9LAotCQkJCQkJYXR0cmlidXRlLCBhdHRyaWJ1dGUuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQkJCi0JCQlpZiAodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNQdWJsaWMoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX1BVQkxJQ19GSUVMRCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7YXR0cmlidXRlLmdldE5hbWUoKX0sCi0JCQkJCQlhdHRyaWJ1dGUsIGF0dHJpYnV0ZS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW52YWxpZE1hcHBpbmdNZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAoISBnZXRUeXBlTWFwcGluZygpLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKHRoaXMuZ2V0S2V5KCkpKSB7CisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNYXBwaW5nVHlwZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJaWYgKCAhIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCh0aGlzLmdldEtleSgpKSkgewogCQkJbWVzc2FnZXMuYWRkKAogCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAogCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAogCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9NQVBQSU5HLAotCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKX0sCi0JCQkJCXRoaXMsIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkKKwkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCisJCQkJCXRoaXMsCisJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQorCQkJCSkKIAkJCSk7CiAJCX0KIAl9CiAJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOworCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKKwl9CisJCisJcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRNYXBwaW5nQW5ub3RhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gKHRoaXMubWFwcGluZ0Fubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogdGhpcy5tYXBwaW5nQW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorCQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YmJhZDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCisJaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KK3sKKwlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCS8qKgorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24uICBPdmVycmlkZSBpZiB0aGUgbWFwcGluZyBkZWZpbml0aW9uIGFwcGxpZXMgaW4gdGhlIGFubm90YXRpb25sZXNzIGNhc2UuCisJICovCisJcHVibGljIGJvb2xlYW4gdGVzdERlZmF1bHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24uICBPdmVycmlkZSBpZiB0aGUgbWFwcGluZyBkZWZpbml0aW9uIG5lZWRzIHRvIGRvIG1vcmUgYW5hbHlzaXMuCisJICovCisJcHVibGljIGJvb2xlYW4gdGVzdFNwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7CisJCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSkgCisJCQkhPSBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQmFzZUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFCYXNlQ29sdW1uLmphdmEKaW5kZXggNzBhMTIwYi4uZmQ1NWY0NyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFCYXNlQ29sdW1uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFCYXNlQ29sdW1uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtNDIsMTQgKzQyLDE0IEBACiAJfQogCQogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tUmVzb3VyY2UoVCBjb2x1bW4pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShjb2x1bW4pOwotCQl0aGlzLmRlZmF1bHRUYWJsZSA9IHRoaXMuZGVmYXVsdFRhYmxlKCk7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSB0aGlzLnNwZWNpZmllZFRhYmxlKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkVW5pcXVlID0gdGhpcy5zcGVjaWZpZWRVbmlxdWUoY29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWROdWxsYWJsZSA9IHRoaXMuc3BlY2lmaWVkTnVsbGFibGUoY29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlID0gdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlID0gdGhpcy5zcGVjaWZpZWRVcGRhdGFibGUoY29sdW1uKTsKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFQgY29sdW1uKSB7CisJCXN1cGVyLmluaXRpYWxpemUoY29sdW1uKTsKKwkJdGhpcy5kZWZhdWx0VGFibGUgPSB0aGlzLmJ1aWxkRGVmYXVsdFRhYmxlKCk7CisJCXRoaXMuc3BlY2lmaWVkVGFibGUgPSB0aGlzLmdldFJlc291cmNlVGFibGUoY29sdW1uKTsKKwkJdGhpcy5zcGVjaWZpZWRVbmlxdWUgPSB0aGlzLmdldFJlc291cmNlVW5pcXVlKGNvbHVtbik7CisJCXRoaXMuc3BlY2lmaWVkTnVsbGFibGUgPSB0aGlzLmdldFJlc291cmNlTnVsbGFibGUoY29sdW1uKTsKKwkJdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlID0gdGhpcy5nZXRSZXNvdXJjZUluc2VydGFibGUoY29sdW1uKTsKKwkJdGhpcy5zcGVjaWZpZWRVcGRhdGFibGUgPSB0aGlzLmdldFJlc291cmNlVXBkYXRhYmxlKGNvbHVtbik7CiAJfQogCQogCUBPdmVycmlkZQpAQCAtNzEsNyArNzEsNyBAQAogCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFRhYmxlKFN0cmluZyBuZXdTcGVjaWZpZWRUYWJsZSkgewogCQlTdHJpbmcgb2xkU3BlY2lmaWVkVGFibGUgPSB0aGlzLnNwZWNpZmllZFRhYmxlOwogCQl0aGlzLnNwZWNpZmllZFRhYmxlID0gbmV3U3BlY2lmaWVkVGFibGU7Ci0JCWdldENvbHVtblJlc291cmNlKCkuc2V0VGFibGUobmV3U3BlY2lmaWVkVGFibGUpOworCQlnZXRSZXNvdXJjZUNvbHVtbigpLnNldFRhYmxlKG5ld1NwZWNpZmllZFRhYmxlKTsKIAkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlQ29sdW1uLlNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVGFibGUsIG5ld1NwZWNpZmllZFRhYmxlKTsKIAl9CiAJCkBAIC05NywxMSArOTcsMTEgQEAKIAkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlQ29sdW1uLkRFRkFVTFRfVEFCTEVfUFJPUEVSVFksIG9sZERlZmF1bHRUYWJsZSwgbmV3RGVmYXVsdFRhYmxlKTsKIAl9CiAKLQlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRVbmlxdWUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFVuaXF1ZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRVbmlxdWUoKTsKKwlwdWJsaWMgYm9vbGVhbiBpc1VuaXF1ZSgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFVuaXF1ZSgpID09IG51bGwpID8gdGhpcy5pc0RlZmF1bHRVbmlxdWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkVW5pcXVlKCkuYm9vbGVhblZhbHVlKCk7CiAJfQogCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRVbmlxdWUoKSB7CisJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VW5pcXVlKCkgewogCQlyZXR1cm4gQmFzZUNvbHVtbi5ERUZBVUxUX1VOSVFVRTsKIAl9CiAJCkBAIC0xMTIsNyArMTEyLDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbiBuZXdTcGVjaWZpZWRVbmlxdWUpIHsKIAkJQm9vbGVhbiBvbGRTcGVjaWZpZWRVbmlxdWUgPSB0aGlzLnNwZWNpZmllZFVuaXF1ZTsKIAkJdGhpcy5zcGVjaWZpZWRVbmlxdWUgPSBuZXdTcGVjaWZpZWRVbmlxdWU7Ci0JCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRVbmlxdWUobmV3U3BlY2lmaWVkVW5pcXVlKTsKKwkJdGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpLnNldFVuaXF1ZShuZXdTcGVjaWZpZWRVbmlxdWUpOwogCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VDb2x1bW4uU1BFQ0lGSUVEX1VOSVFVRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVW5pcXVlLCBuZXdTcGVjaWZpZWRVbmlxdWUpOwogCX0KIAkKQEAgLTEyOCwxMSArMTI4LDExIEBACiAJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUNvbHVtbi5TUEVDSUZJRURfVU5JUVVFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRVbmlxdWUsIG5ld1NwZWNpZmllZFVuaXF1ZSk7CiAJfQogCQotCXB1YmxpYyBCb29sZWFuIGdldE51bGxhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdE51bGxhYmxlKCkgOiB0aGlzLmdldFNwZWNpZmllZE51bGxhYmxlKCk7CisJcHVibGljIGJvb2xlYW4gaXNOdWxsYWJsZSgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZE51bGxhYmxlKCkgPT0gbnVsbCkgPyB0aGlzLmlzRGVmYXVsdE51bGxhYmxlKCkgOiB0aGlzLmdldFNwZWNpZmllZE51bGxhYmxlKCkuYm9vbGVhblZhbHVlKCk7CiAJfQogCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHROdWxsYWJsZSgpIHsKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROdWxsYWJsZSgpIHsKIAkJcmV0dXJuIEJhc2VDb2x1bW4uREVGQVVMVF9OVUxMQUJMRTsKIAl9CiAJCkBAIC0xNDMsNyArMTQzLDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuIG5ld1NwZWNpZmllZE51bGxhYmxlKSB7CiAJCUJvb2xlYW4gb2xkU3BlY2lmaWVkTnVsbGFibGUgPSB0aGlzLnNwZWNpZmllZE51bGxhYmxlOwogCQl0aGlzLnNwZWNpZmllZE51bGxhYmxlID0gbmV3U3BlY2lmaWVkTnVsbGFibGU7Ci0JCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXROdWxsYWJsZShuZXdTcGVjaWZpZWROdWxsYWJsZSk7CisJCXRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXROdWxsYWJsZShuZXdTcGVjaWZpZWROdWxsYWJsZSk7CiAJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUNvbHVtbi5TUEVDSUZJRURfTlVMTEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE51bGxhYmxlLCBuZXdTcGVjaWZpZWROdWxsYWJsZSk7CiAJfQogCQpAQCAtMTU5LDExICsxNTksMTEgQEAKIAkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlQ29sdW1uLlNQRUNJRklFRF9OVUxMQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTnVsbGFibGUsIG5ld1NwZWNpZmllZE51bGxhYmxlKTsKIAl9CiAJCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEluc2VydGFibGUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEluc2VydGFibGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpOworCXB1YmxpYyBib29sZWFuIGlzSW5zZXJ0YWJsZSgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEluc2VydGFibGUoKSA9PSBudWxsKSA/IHRoaXMuaXNEZWZhdWx0SW5zZXJ0YWJsZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkuYm9vbGVhblZhbHVlKCk7CiAJfQogCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRJbnNlcnRhYmxlKCkgeworCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdEluc2VydGFibGUoKSB7CiAJCXJldHVybiBCYXNlQ29sdW1uLkRFRkFVTFRfSU5TRVJUQUJMRTsKIAl9CiAJCkBAIC0xNzQsNyArMTc0LDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4gbmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSkgewogCQlCb29sZWFuIG9sZFNwZWNpZmllZEluc2VydGFibGUgPSB0aGlzLnNwZWNpZmllZEluc2VydGFibGU7CiAJCXRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZSA9IG5ld1NwZWNpZmllZEluc2VydGFibGU7Ci0JCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRJbnNlcnRhYmxlKG5ld1NwZWNpZmllZEluc2VydGFibGUpOworCQl0aGlzLmdldFJlc291cmNlQ29sdW1uKCkuc2V0SW5zZXJ0YWJsZShuZXdTcGVjaWZpZWRJbnNlcnRhYmxlKTsKIAkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlQ29sdW1uLlNQRUNJRklFRF9JTlNFUlRBQkxFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRJbnNlcnRhYmxlLCBuZXdTcGVjaWZpZWRJbnNlcnRhYmxlKTsKIAl9CiAJCkBAIC0xOTAsMTEgKzE5MCwxMSBAQAogCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VDb2x1bW4uU1BFQ0lGSUVEX0lOU0VSVEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZEluc2VydGFibGUsIG5ld1NwZWNpZmllZEluc2VydGFibGUpOwogCX0KIAkKLQlwdWJsaWMgQm9vbGVhbiBnZXRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFVwZGF0YWJsZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKTsKKwlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0YWJsZSgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpID09IG51bGwpID8gdGhpcy5pc0RlZmF1bHRVcGRhdGFibGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkuYm9vbGVhblZhbHVlKCk7CiAJfQogCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRVcGRhdGFibGUoKSB7CisJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VXBkYXRhYmxlKCkgewogCQlyZXR1cm4gQmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRTsKIAl9CiAJCkBAIC0yMDUsNyArMjA1LDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRVcGRhdGFibGUpIHsKIAkJQm9vbGVhbiBvbGRTcGVjaWZpZWRVcGRhdGFibGUgPSB0aGlzLnNwZWNpZmllZFVwZGF0YWJsZTsKIAkJdGhpcy5zcGVjaWZpZWRVcGRhdGFibGUgPSBuZXdTcGVjaWZpZWRVcGRhdGFibGU7Ci0JCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRVcGRhdGFibGUobmV3U3BlY2lmaWVkVXBkYXRhYmxlKTsKKwkJdGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpLnNldFVwZGF0YWJsZShuZXdTcGVjaWZpZWRVcGRhdGFibGUpOwogCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VDb2x1bW4uU1BFQ0lGSUVEX1VQREFUQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVXBkYXRhYmxlLCBuZXdTcGVjaWZpZWRVcGRhdGFibGUpOwogCX0KIApAQCAtMjI3LDEyICsyMjcsMTIgQEAKIAl9CiAKIAlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldENvbHVtblJlc291cmNlKCkuZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCk7CisJCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldFJlc291cmNlQ29sdW1uKCkuZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCk7CiAJCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRPd25lcigpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gdGFibGVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRDb2x1bW5SZXNvdXJjZSgpLnRhYmxlVG91Y2hlcyhwb3MsIGFzdFJvb3QpOworCQlyZXR1cm4gZ2V0UmVzb3VyY2VDb2x1bW4oKS50YWJsZVRvdWNoZXMocG9zLCBhc3RSb290KTsKIAl9CiAKIAlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlVGFibGVOYW1lcygpIHsKQEAgLTI0Myw4ICsyNDMsOCBAQAogCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPih0aGlzLmNhbmRpZGF0ZVRhYmxlTmFtZXMoKSwgZmlsdGVyKTsKIAl9CiAKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gcXVvdGVkQ2FuZGlkYXRlVGFibGVOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnF1b3RlKHRoaXMuY2FuZGlkYXRlVGFibGVOYW1lcyhmaWx0ZXIpKTsKKwlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNhbmRpZGF0ZVRhYmxlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5jYW5kaWRhdGVUYWJsZU5hbWVzKGZpbHRlcikpOwogCX0KIAogCS8qKgpAQCAtMjYwLDcgKzI2MCw3IEBACiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9CiAJCWlmICh0aGlzLnRhYmxlVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gdGhpcy5xdW90ZWRDYW5kaWRhdGVUYWJsZU5hbWVzKGZpbHRlcik7CisJCQlyZXR1cm4gdGhpcy5qYXZhQ2FuZGlkYXRlVGFibGVOYW1lcyhmaWx0ZXIpOwogCQl9CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTI2OCwzNSArMjY4LDM1IEBACiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgdXBkYXRlKFQgY29sdW1uKSB7CiAJCXN1cGVyLnVwZGF0ZShjb2x1bW4pOwotCQl0aGlzLnNldERlZmF1bHRUYWJsZSh0aGlzLmRlZmF1bHRUYWJsZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUYWJsZV8odGhpcy5zcGVjaWZpZWRUYWJsZShjb2x1bW4pKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRVbmlxdWVfKHRoaXMuc3BlY2lmaWVkVW5pcXVlKGNvbHVtbikpOwotCQl0aGlzLnNldFNwZWNpZmllZE51bGxhYmxlXyh0aGlzLnNwZWNpZmllZE51bGxhYmxlKGNvbHVtbikpOwotCQl0aGlzLnNldFNwZWNpZmllZEluc2VydGFibGVfKHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZShjb2x1bW4pKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRVcGRhdGFibGVfKHRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlKGNvbHVtbikpOworCQl0aGlzLnNldERlZmF1bHRUYWJsZSh0aGlzLmJ1aWxkRGVmYXVsdFRhYmxlKCkpOworCQl0aGlzLnNldFNwZWNpZmllZFRhYmxlXyh0aGlzLmdldFJlc291cmNlVGFibGUoY29sdW1uKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkVW5pcXVlXyh0aGlzLmdldFJlc291cmNlVW5pcXVlKGNvbHVtbikpOworCQl0aGlzLnNldFNwZWNpZmllZE51bGxhYmxlXyh0aGlzLmdldFJlc291cmNlTnVsbGFibGUoY29sdW1uKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZV8odGhpcy5nZXRSZXNvdXJjZUluc2VydGFibGUoY29sdW1uKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkVXBkYXRhYmxlXyh0aGlzLmdldFJlc291cmNlVXBkYXRhYmxlKGNvbHVtbikpOwogCX0KIAotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhYmxlKCkgeworCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0VGFibGUoKSB7CiAJCXJldHVybiB0aGlzLmdldE93bmVyKCkuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwogCX0KIAkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFRhYmxlKEJhc2VDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbikgeworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VUYWJsZShCYXNlQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4pIHsKIAkJcmV0dXJuIGNvbHVtbi5nZXRUYWJsZSgpOwogCX0KIAkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRVbmlxdWUoQmFzZUNvbHVtbkFubm90YXRpb24gY29sdW1uKSB7CisJcHJvdGVjdGVkIEJvb2xlYW4gZ2V0UmVzb3VyY2VVbmlxdWUoQmFzZUNvbHVtbkFubm90YXRpb24gY29sdW1uKSB7CiAJCXJldHVybiBjb2x1bW4uZ2V0VW5pcXVlKCk7CiAJfQogCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE51bGxhYmxlKEJhc2VDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbikgeworCXByb3RlY3RlZCBCb29sZWFuIGdldFJlc291cmNlTnVsbGFibGUoQmFzZUNvbHVtbkFubm90YXRpb24gY29sdW1uKSB7CiAJCXJldHVybiBjb2x1bW4uZ2V0TnVsbGFibGUoKTsKIAl9CiAJCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkSW5zZXJ0YWJsZShCYXNlQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4pIHsKKwlwcm90ZWN0ZWQgQm9vbGVhbiBnZXRSZXNvdXJjZUluc2VydGFibGUoQmFzZUNvbHVtbkFubm90YXRpb24gY29sdW1uKSB7CiAJCXJldHVybiBjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpOwogCX0KIAkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRVcGRhdGFibGUoQmFzZUNvbHVtbkFubm90YXRpb24gY29sdW1uKSB7CisJcHJvdGVjdGVkIEJvb2xlYW4gZ2V0UmVzb3VyY2VVcGRhdGFibGUoQmFzZUNvbHVtbkFubm90YXRpb24gY29sdW1uKSB7CiAJCXJldHVybiBjb2x1bW4uZ2V0VXBkYXRhYmxlKCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQppbmRleCA2NGRjNmNmLi5iNzE4MWZjIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDM0MiArOSwxNzEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzZUVtYmVkZGVkTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwogCiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nPFQgZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlPiBleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8VD4KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPgorCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxUPgogCWltcGxlbWVudHMgSmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcKIHsKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlczsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlczsKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwogCiAJcHJpdmF0ZSBFbWJlZGRhYmxlIGVtYmVkZGFibGU7CiAKIAlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhQmFzZUVtYmVkZGVkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKIAkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVPdmVycmlkZT4oKTsKLQkJdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEFycmF5TGlzdDxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KCk7CisJCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcih0aGlzLCBuZXcgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcigpKTsKIAl9CiAKLQkvLyoqKioqKioqKioqKioqKioqKiBKYXZhQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbmF0aW9uICoqKioqKioqKioqKioqKioqKioKKwlwdWJsaWMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkgeworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKKwl9CiAKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigKKwlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpIHsKKwkJcmV0dXJuIHRoaXMuZW1iZWRkYWJsZTsKKwl9CisJCisJLy8qKioqKioqKioqKioqKioqKiogSmF2YUF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ1tdIGJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKKwkJcmV0dXJuIEFycmF5VG9vbHMuYWRkQWxsKAorCQkJc3VwZXIuYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCiAJCQlKUEEuQVRUUklCVVRFX09WRVJSSURFLAogCQkJSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCX0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKiBBdHRyaWJ1dGVPdmVycmlkZS5Pd25lciBpbXBsZW1lbmF0aW9uICoqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgQ29sdW1uTWFwcGluZyBnZXRDb2x1bW5NYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMuZ2V0Q29sdW1uTWFwcGluZyhhdHRyaWJ1dGVOYW1lLCBlbWJlZGRhYmxlKCkpOwotCX0KIAotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5jb250YWlucyhvdmVycmlkZSk7CisJcHVibGljIEVtYmVkZGFibGUgZ2V0RW1iZWRkYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuZW1iZWRkYWJsZTsKIAl9CiAJCi0JcHVibGljIEJhc2VPdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgQmFzZU92ZXJyaWRlIG92ZXJyaWRlKSB7Ci0JCS8vIEFkZCBhIG5ldyBhdHRyaWJ1dGUgb3ZlcnJpZGUKLQkJaWYgKHZpcnR1YWwpIHsKLQkJCXJldHVybiBzZXRBdHRyaWJ1dGVPdmVycmlkZVZpcnR1YWwoKEphdmFBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUpOworCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCXN1cGVyLmluaXRpYWxpemUoKTsKKwkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQl0aGlzLmVtYmVkZGFibGUgPSB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRFbWJlZGRhYmxlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuZW1iZWRkYWJsZSA9IHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEVtYmVkZGFibGUoKTsKKwkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci51cGRhdGUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJfQorCQorCXByb3RlY3RlZCBJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nPiBlbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ3MoKSB7CisJCWlmICh0aGlzLmdldEVtYmVkZGFibGUoKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwogCQl9Ci0JCXJldHVybiBzZXRBdHRyaWJ1dGVPdmVycmlkZVNwZWNpZmllZCgoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKSBvdmVycmlkZSk7CisJCXJldHVybiB0aGlzLmdldEVtYmVkZGFibGUoKS5hdHRyaWJ1dGVNYXBwaW5ncygpOwogCX0KIAkKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIHNldEF0dHJpYnV0ZU92ZXJyaWRlVmlydHVhbChKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaW5kZXhPZihhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLnJlbW92ZShpbmRleCk7Ci0JCVN0cmluZyBhdHRyaWJ1dGVPdmVycmlkZU5hbWUgPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCk7Ci0JCS8vYWRkIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZSBzbyB0aGF0IEkgY2FuIGNvbnRyb2wgdGhlIG9yZGVyIHRoYXQgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcyBzZW50LgotCQkvL290aGVyd2lzZSB3aGVuIHdlIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIGphdmEgd2Ugd2lsbCBnZXQgYW4gdXBkYXRlIGFuZCBhZGQgdGhlIGF0dHJpYnV0ZSBvdmVycmlkZQotCQkvL2R1cmluZyB0aGUgdWRwYXRlLiAgVGhpcyBjYXVzZXMgdGhlIFVJIHRvIGJlIGZsYWt5LCBzaW5jZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1pZ2h0IG5vdCBvY2N1ciBpbiB0aGUgY29ycmVjdCBvcmRlcgotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gbnVsbDsKLQkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSAhPSBudWxsKSB7Ci0JCQlmb3IgKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSkpIHsKLQkJCQlpZiAocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSkpIHsKLQkJCQkJLy9zdG9yZSB0aGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHNvIHdlIGNhbiBmaXJlIGNoYW5nZSBub3RpZmljYXRpb24gbGF0ZXIKLQkJCQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCQkJdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmFkZCh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpOwotCQkJCQlicmVhazsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkZWFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKSB7CisJCWlmIChnZXRKcGFQbGF0Zm9ybVZlcnNpb24oKS5pc0NvbXBhdGlibGVXaXRoSnBhVmVyc2lvbihKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzJfMCkpIHsKKwkJCXJldHVybiBlbWJlZGRhYmxlT3ZlcnJpZGVhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmFsbE92ZXJyaWRlYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkZWFibGVBc3NvY2lhdGlvbk1hcHBpbmdOYW1lcygpIHsKKwkJaWYgKGdldEpwYVBsYXRmb3JtVmVyc2lvbigpLmlzQ29tcGF0aWJsZVdpdGhKcGFWZXJzaW9uKEpwdENvcmVQbHVnaW4uSlBBX0ZBQ0VUX1ZFUlNJT05fMl8wKSkgeworCQkJcmV0dXJuIGVtYmVkZGFibGVPdmVycmlkZWFibGVBc3NvY2lhdGlvbk1hcHBpbmdOYW1lcygpOworCQl9CisJCXJldHVybiBzdXBlci5hbGxPdmVycmlkZWFibGVBc3NvY2lhdGlvbk1hcHBpbmdOYW1lcygpOworCX0KKwkKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBlbWJlZGRhYmxlT3ZlcnJpZGVhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KAorCQkJbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4oCisJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZywgSXRlcmF0b3I8U3RyaW5nPj4odGhpcy5lbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ3MoKSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdHJhbnNmb3JtKEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgeworCQkJCQkJcmV0dXJuIG1hcHBpbmcuYWxsT3ZlcnJpZGVhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCk7CisJCQkJCX0KIAkJCQl9CisJCQkpCisJCSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgeworCQkJCXJldHVybiBnZXROYW1lKCkgKyAnLicgKyBuZXh0OwogCQkJfQotCQl9Ci0KLQkJZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihpbmRleCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlmaXJlSXRlbVJlbW92ZWQoRW50aXR5LlNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQotCQlpZiAodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlICE9IG51bGwpIHsKLQkJCWZpcmVJdGVtQWRkZWQoRW50aXR5LlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIC0gMSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJfQotCQlyZXR1cm4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOworCQl9OwogCX0KIAkKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIHNldEF0dHJpYnV0ZU92ZXJyaWRlU3BlY2lmaWVkKEphdmFBdHRyaWJ1dGVPdmVycmlkZSBvbGRBdHRyaWJ1dGVPdmVycmlkZSkgewotCQlpbnQgaW5kZXggPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBuZXdBdHRyaWJ1dGVPdmVycmlkZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFBdHRyaWJ1dGVPdmVycmlkZSh0aGlzLCB0aGlzKTsKLQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKGluZGV4LCBuZXdBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oaW5kZXgsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbmV3QXR0cmlidXRlT3ZlcnJpZGUuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKTsKLQkJCi0JCWludCBkZWZhdWx0SW5kZXggPSB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaW5kZXhPZihvbGRBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5yZW1vdmUoZGVmYXVsdEluZGV4KTsKLQotCQluZXdBdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKG9sZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW5ld0F0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUob2xkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKEVudGl0eS5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgZGVmYXVsdEluZGV4LCBvbGRBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChFbnRpdHkuU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgaW5kZXgsIG5ld0F0dHJpYnV0ZU92ZXJyaWRlKTsJCQotCi0JCXJldHVybiBuZXdBdHRyaWJ1dGVPdmVycmlkZTsKLQl9Ci0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKiBCYXNlRW1iZWRkZWRNYXBwaW5nIGltcGxlbWVuYXRpb24gKioqKioqKioqKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLCB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0JfQotCQotCXB1YmxpYyBpbnQgYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpICsgdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4odGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5zaXplKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGludCBpbmRleCwgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGF0dHJpYnV0ZU92ZXJyaWRlLCB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcywgQmFzZUVtYmVkZGVkTWFwcGluZy5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZV8oSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMsIEJhc2VFbWJlZGRlZE1hcHBpbmcuU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlmaXJlSXRlbU1vdmVkKEJhc2VFbWJlZGRlZE1hcHBpbmcuU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoYXR0cmlidXRlT3ZlcnJpZGUsIHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcywgQmFzZUVtYmVkZGVkTWFwcGluZy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGF0dHJpYnV0ZU92ZXJyaWRlLCB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMsIEJhc2VFbWJlZGRlZE1hcHBpbmcuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKEphdmFBdHRyaWJ1dGVPdmVycmlkZSkgZ2V0T3ZlcnJpZGVOYW1lZChuYW1lLCBhdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBdHRyaWJ1dGVPdmVycmlkZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCBhdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNEZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJhc2VPdmVycmlkZSBnZXRPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lLCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEJhc2VPdmVycmlkZT4gb3ZlcnJpZGVzKSB7Ci0JCWZvciAoQmFzZU92ZXJyaWRlIG92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG92ZXJyaWRlcykpIHsKLQkJCVN0cmluZyBvdmVycmlkZU5hbWUgPSBvdmVycmlkZS5nZXROYW1lKCk7Ci0JCQlpZiAob3ZlcnJpZGVOYW1lID09IG51bGwgJiYgbmFtZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG92ZXJyaWRlOworCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGVtYmVkZGFibGVPdmVycmlkZWFibGVBc3NvY2lhdGlvbk1hcHBpbmdOYW1lcygpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPigKKwkJCW5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KAorCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhdG9yPFN0cmluZz4+KHRoaXMuZW1iZWRkYWJsZUF0dHJpYnV0ZU1hcHBpbmdzKCkpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHRyYW5zZm9ybShBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcpIHsKKwkJCQkJCXJldHVybiBtYXBwaW5nLmFsbE92ZXJyaWRlYWJsZUFzc29jaWF0aW9uTWFwcGluZ05hbWVzKCk7CisJCQkJCX0KKwkJCQl9CisJCQkpCisJCSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgeworCQkJCXJldHVybiBnZXROYW1lKCkgKyAnLicgKyBuZXh0OwogCQkJfQotCQkJaWYgKG92ZXJyaWRlTmFtZSAhPSBudWxsICYmIG92ZXJyaWRlTmFtZS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gb3ZlcnJpZGU7CisJCX07CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENvbHVtbiByZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCWlmIChnZXRKcGFQbGF0Zm9ybVZlcnNpb24oKS5pc0NvbXBhdGlibGVXaXRoSnBhVmVyc2lvbihKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzJfMCkpIHsKKwkJCWludCBkb3RJbmRleCA9IGF0dHJpYnV0ZU5hbWUuaW5kZXhPZignLicpOworCQkJaWYgKGRvdEluZGV4ICE9IC0xKSB7CisJCQkJaWYgKGdldE5hbWUoKS5lcXVhbHMoYXR0cmlidXRlTmFtZS5zdWJzdHJpbmcoMCwgZG90SW5kZXgpKSkgeworCQkJCQlhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZS5zdWJzdHJpbmcoZG90SW5kZXggKyAxKTsKKwkJCQkJQXR0cmlidXRlT3ZlcnJpZGUgb3ZlcnJpZGUgPSBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoYXR0cmlidXRlTmFtZSk7CisJCQkJCWlmIChvdmVycmlkZSAhPSBudWxsICYmICFvdmVycmlkZS5pc1ZpcnR1YWwoKSkgeworCQkJCQkJcmV0dXJuIG92ZXJyaWRlLmdldENvbHVtbigpOworCQkJCQl9CisJCQkJCWlmICh0aGlzLmdldEVtYmVkZGFibGUoKSA9PSBudWxsKSB7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdGhpcy5nZXRFbWJlZGRhYmxlKCkucmVzb2x2ZU92ZXJyaWRlbkNvbHVtbihhdHRyaWJ1dGVOYW1lKTsKKwkJCQl9CiAJCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNPdmVycmlkZShTdHJpbmcgbmFtZSwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBCYXNlT3ZlcnJpZGU+IG92ZXJyaWRlcykgewotCQlyZXR1cm4gZ2V0T3ZlcnJpZGVOYW1lZChuYW1lLCBvdmVycmlkZXMpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIEVtYmVkZGFibGUgZW1iZWRkYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW1iZWRkYWJsZTsKLQl9Ci0KIAkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tUmVzb3VyY2UocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy5pbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVzKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZURlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy5lbWJlZGRhYmxlID0gTWFwcGluZ1Rvb2xzLmdldEVtYmVkZGFibGVGb3IoZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlcyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYW5ub3RhdGlvbnMgPSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJd2hpbGUoYW5ub3RhdGlvbnMuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXR0cmlidXRlT3ZlcnJpZGUodGhpcywgdGhpcyk7Ci0JCQlhdHRyaWJ1dGVPdmVycmlkZS5pbml0aWFsaXplRnJvbVJlc291cmNlKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGFubm90YXRpb25zLm5leHQoKSk7Ci0JCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoYXR0cmlidXRlT3ZlcnJpZGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpID0gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGkubmV4dCgpOwotCQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQkJCWlmIChhdHRyaWJ1dGVPdmVycmlkZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmFkZChidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUsIGF0dHJpYnV0ZU5hbWUpKTsKLQkJCX0KLQkJfQotCX0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXN1cGVyLnVwZGF0ZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLmVtYmVkZGFibGUgPSBNYXBwaW5nVG9vbHMuZ2V0RW1iZWRkYWJsZUZvcihnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyhyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLnVwZGF0ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCi0JfQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCXdoaWxlIChhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSkgewotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlLnVwZGF0ZSgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVfKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSkgewotCQkJYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpLCBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkpOwotCQl9CQotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UpIHsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKHRoaXMsIHRoaXMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5pbml0aWFsaXplRnJvbVJlc291cmNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UpOwotCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGU7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlKGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLCBhdHRyaWJ1dGVOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlDb2x1bW5NYXBwaW5nIGNvbHVtbk1hcHBpbmcgPSAoQ29sdW1uTWFwcGluZykgdGhpcy5lbWJlZGRhYmxlKCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyaWJ1dGVOYW1lKS5nZXRNYXBwaW5nKCk7Ci0JCXJldHVybiBuZXcgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSwgYXR0cmlidXRlTmFtZSwgY29sdW1uTWFwcGluZy5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaSA9IGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBpLm5leHQoKTsKLQkJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGUgPT0gbnVsbCkgewotCQkJCWFkZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUsIGF0dHJpYnV0ZU5hbWUpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKSB7Ci0JCQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkudXBkYXRlKG5ldyBOdWxsQ29sdW1uKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkpOwotCQkJfQotCQl9Ci0JCQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkpOwotCQotCQkvL3JlbW92ZSBhbnkgZGVmYXVsdCBtYXBwaW5ncyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGF0dHJpYnV0ZU5hbWVzIGNvbGxlY3Rpb24KLQkJZm9yIChKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpKSkgewotCQkJaWYgKCFhdHRyaWJ1dGVOYW1lcy5jb250YWlucyhhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpCi0JCQkJfHwgY29udGFpbnNTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZShhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpKSB7Ci0JCQkJcmVtb3ZlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZz4odGhpcy5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB7Ci0JCWlmICh0aGlzLmVtYmVkZGFibGUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZSwgUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5lbWJlZGRhYmxlKCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFBlcnNpc3RlbnRBdHRyaWJ1dGUgbykgewotCQkJCXJldHVybiBvLmlzT3ZlcnJpZGFibGVBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CiAJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwogCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKIAkJCXJldHVybiByZXN1bHQ7CiAJCX0KLQkJZm9yIChBdHRyaWJ1dGVPdmVycmlkZSBvdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlcygpKSkgewotCQkJcmVzdWx0ID0gKChKYXZhQXR0cmlidXRlT3ZlcnJpZGUpIG92ZXJyaWRlKS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQorCQkKKwkJcmVzdWx0ID0gZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CkBAIC0zNTIsMTEgKzE4MSwzNSBAQAogCS8vKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioKIAkKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQlnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJfQorCQorCQorCS8vKioqKioqKioqKiBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioJCisJCisJY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lciBpbXBsZW1lbnRzIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLk93bmVyIHsKKwkJcHVibGljIFR5cGVNYXBwaW5nIGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gQWJzdHJhY3RKYXZhQmFzZUVtYmVkZGVkTWFwcGluZy50aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKKwkJfQogCQkKLQkJZm9yIChJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHN0cmVhbSA9IGF0dHJpYnV0ZU92ZXJyaWRlcygpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKKwkJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgeworCQkJcmV0dXJuIEFic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcudGhpcy5nZXRUeXBlTWFwcGluZygpOworCQl9CisJCQorCQlwdWJsaWMgQ29sdW1uIHJlc29sdmVPdmVycmlkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSkgeworCQkJVHlwZU1hcHBpbmcgb3ZlcnJpZGFibGVUeXBlTWFwcGluZyA9IGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKKwkJCUNvbHVtbiBjb2x1bW4gPSBudWxsOworCQkJaWYgKG92ZXJyaWRhYmxlVHlwZU1hcHBpbmcgIT0gbnVsbCkgeworCQkJCWZvciAoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3ZlcnJpZGFibGVUeXBlTWFwcGluZy5pbmhlcml0YW5jZUhpZXJhcmNoeSgpKSkgeworCQkJCQljb2x1bW4gPSB0eXBlTWFwcGluZy5yZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSk7CisJCQkJCWlmIChjb2x1bW4gIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIGNvbHVtbjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBjb2x1bW47CiAJCX0KIAl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFCYXNpY01hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjN2MyOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nLmphdmEKQEAgLTAsMCArMSwzMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk51bGxhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW51bWVyYXRlZEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Mb2JBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUJhc2ljTWFwcGluZworCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxCYXNpY0Fubm90YXRpb24+CisJaW1wbGVtZW50cyBKYXZhQmFzaWNNYXBwaW5nCit7CisJcHJvdGVjdGVkIEZldGNoVHlwZSBzcGVjaWZpZWRGZXRjaDsKKworCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE9wdGlvbmFsOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhQ29sdW1uIGNvbHVtbjsKKworCXByb3RlY3RlZCBmaW5hbCBKYXZhQ29udmVydGVyIGRlZmF1bHRDb252ZXJ0ZXI7CisJCisJcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIgc3BlY2lmaWVkQ29udmVydGVyOworCQorCQorCXByb3RlY3RlZCBBYnN0cmFjdEphdmFCYXNpY01hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuY29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUNvbHVtbih0aGlzLCB0aGlzKTsKKwkJdGhpcy5kZWZhdWx0Q29udmVydGVyID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YU51bGxDb252ZXJ0ZXIodGhpcyk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZSgpOworCQl0aGlzLmNvbHVtbi5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKSk7CisJCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyID0gdGhpcy5idWlsZFNwZWNpZmllZENvbnZlcnRlcih0aGlzLmdldFJlc291cmNlQ29udmVydGVyVHlwZSgpKTsKKwkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IHRoaXMuZ2V0UmVzb3VyY2VGZXRjaCgpOworCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gdGhpcy5nZXRSZXNvdXJjZU9wdGlvbmFsKCk7CisJfQorCQorCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGdldFJlc291cmNlQ29sdW1uKCkgeworCQlyZXR1cm4gKENvbHVtbkFubm90YXRpb24pIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwl9CisJCisJLy8qKioqKioqKioqKioqKiBBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKworCS8vKioqKioqKioqKioqKiogSmF2YUF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmdbXSBidWlsZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7CisJCXJldHVybiBBcnJheVRvb2xzLmFkZEFsbCgKKwkJCXN1cGVyLmJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAorCQkJSlBBLkNPTFVNTiwKKwkJCUpQQS5MT0IsCisJCQlKUEEuVEVNUE9SQUwsCisJCQlKUEEuRU5VTUVSQVRFRCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7CisJCXJldHVybiBnZXROYW1lKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgeworCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7CisJfQorCQorCS8vKioqKioqKioqKioqKiogQmFzaWNNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgorCisJcHVibGljIEphdmFDb2x1bW4gZ2V0Q29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy5jb2x1bW47CisJfQorCQorCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRGZXRjaCgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0RmV0Y2goKSA6IHRoaXMuZ2V0U3BlY2lmaWVkRmV0Y2goKTsKKwl9CisKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldERlZmF1bHRGZXRjaCgpIHsKKwkJcmV0dXJuIERFRkFVTFRfRkVUQ0hfVFlQRTsKKwl9CisJCQorCXB1YmxpYyBGZXRjaFR5cGUgZ2V0U3BlY2lmaWVkRmV0Y2goKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEZldGNoOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUgbmV3U3BlY2lmaWVkRmV0Y2gpIHsKKwkJRmV0Y2hUeXBlIG9sZEZldGNoID0gdGhpcy5zcGVjaWZpZWRGZXRjaDsKKwkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IG5ld1NwZWNpZmllZEZldGNoOworCQl0aGlzLm1hcHBpbmdBbm5vdGF0aW9uLnNldEZldGNoKEZldGNoVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZEZldGNoKSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRmV0Y2hhYmxlLlNQRUNJRklFRF9GRVRDSF9QUk9QRVJUWSwgb2xkRmV0Y2gsIG5ld1NwZWNpZmllZEZldGNoKTsKKwl9CisJCisJLyoqCisJICogaW50ZXJuYWwgc2V0dGVyIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCisJICogVGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIEludmFsaWRUaHJlYWRBY2Nlc3MgZXhjZXB0aW9ucyBpbiB0aGUgVUkKKwkgKiB3aGVuIHlvdSBzZXQgYSB2YWx1ZSBmcm9tIHRoZSBVSSBhbmQgdGhlIGFubm90YXRpb24gZG9lc24ndCBleGlzdCB5ZXQuCisJICogQWRkaW5nIHRoZSBhbm5vdGF0aW9uIGNhdXNlcyBhbiB1cGRhdGUgdG8gb2NjdXIgYW5kIHRoZW4gdGhlIGV4Y2VwdGlvbi4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaF8oRmV0Y2hUeXBlIG5ld1NwZWNpZmllZEZldGNoKSB7CisJCUZldGNoVHlwZSBvbGRGZXRjaCA9IHRoaXMuc3BlY2lmaWVkRmV0Y2g7CisJCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSBuZXdTcGVjaWZpZWRGZXRjaDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChGZXRjaGFibGUuU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGRGZXRjaCwgbmV3U3BlY2lmaWVkRmV0Y2gpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpID09IG51bGwpID8gdGhpcy5pc0RlZmF1bHRPcHRpb25hbCgpIDogdGhpcy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpLmJvb2xlYW5WYWx1ZSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRPcHRpb25hbCgpIHsKKwkJcmV0dXJuIE51bGxhYmxlLkRFRkFVTFRfT1BUSU9OQUw7CisJfQorCQorCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE9wdGlvbmFsKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRPcHRpb25hbDsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbiBuZXdTcGVjaWZpZWRPcHRpb25hbCkgeworCQlCb29sZWFuIG9sZE9wdGlvbmFsID0gdGhpcy5zcGVjaWZpZWRPcHRpb25hbDsKKwkJdGhpcy5zcGVjaWZpZWRPcHRpb25hbCA9IG5ld1NwZWNpZmllZE9wdGlvbmFsOworCQl0aGlzLm1hcHBpbmdBbm5vdGF0aW9uLnNldE9wdGlvbmFsKG5ld1NwZWNpZmllZE9wdGlvbmFsKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChOdWxsYWJsZS5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIG9sZE9wdGlvbmFsLCBuZXdTcGVjaWZpZWRPcHRpb25hbCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkT3B0aW9uYWxfKEJvb2xlYW4gbmV3U3BlY2lmaWVkT3B0aW9uYWwpIHsKKwkJQm9vbGVhbiBvbGRPcHRpb25hbCA9IHRoaXMuc3BlY2lmaWVkT3B0aW9uYWw7CisJCXRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgPSBuZXdTcGVjaWZpZWRPcHRpb25hbDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChOdWxsYWJsZS5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIG9sZE9wdGlvbmFsLCBuZXdTcGVjaWZpZWRPcHRpb25hbCk7CisJfQorCisJcHVibGljIEphdmFDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkgeworCQlyZXR1cm4gZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkgPT0gbnVsbCA/IGdldERlZmF1bHRDb252ZXJ0ZXIoKSA6IGdldFNwZWNpZmllZENvbnZlcnRlcigpOworCX0KKwkKKwlwdWJsaWMgSmF2YUNvbnZlcnRlciBnZXREZWZhdWx0Q29udmVydGVyKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q29udmVydGVyOworCX0KKwkKKwlwdWJsaWMgSmF2YUNvbnZlcnRlciBnZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZENvbnZlcnRlcjsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjaWZlZENvbnZlcnRlclR5cGUoKSB7CisJCWlmICh0aGlzLnNwZWNpZmllZENvbnZlcnRlciA9PSBudWxsKSB7CisJCQlyZXR1cm4gQ29udmVydGVyLk5PX0NPTlZFUlRFUjsKKwkJfQorCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXIuZ2V0VHlwZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlclR5cGUpIHsKKwkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwoZ2V0U3BlY2lmZWRDb252ZXJ0ZXJUeXBlKCksIGNvbnZlcnRlclR5cGUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJSmF2YUNvbnZlcnRlciBvbGRDb252ZXJ0ZXIgPSB0aGlzLnNwZWNpZmllZENvbnZlcnRlcjsKKwkJSmF2YUNvbnZlcnRlciBuZXdDb252ZXJ0ZXIgPSBidWlsZFNwZWNpZmllZENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlKTsKKwkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXIgPSBudWxsOworCQlpZiAob2xkQ29udmVydGVyICE9IG51bGwpIHsKKwkJCW9sZENvbnZlcnRlci5yZW1vdmVGcm9tUmVzb3VyY2VNb2RlbCgpOworCQl9CisJCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyID0gbmV3Q29udmVydGVyOworCQlpZiAobmV3Q29udmVydGVyICE9IG51bGwpIHsKKwkJCW5ld0NvbnZlcnRlci5hZGRUb1Jlc291cmNlTW9kZWwoKTsKKwkJfQorCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFksIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ29udmVydGVyKEphdmFDb252ZXJ0ZXIgbmV3Q29udmVydGVyKSB7CisJCUphdmFDb252ZXJ0ZXIgb2xkQ29udmVydGVyID0gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXI7CisJCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyID0gbmV3Q29udmVydGVyOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFksIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLmNvbHVtbi51cGRhdGUodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpKTsKKwkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwoZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCksIGdldFNwZWNpZmVkQ29udmVydGVyVHlwZSgpKSkgeworCQkJZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQl9CisJCWVsc2UgeworCQkJSmF2YUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXIoZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCkpOworCQkJc2V0U3BlY2lmaWVkQ29udmVydGVyKGphdmFDb252ZXJ0ZXIpOworCQl9CisJCXRoaXMuc2V0U3BlY2lmaWVkRmV0Y2hfKHRoaXMuZ2V0UmVzb3VyY2VGZXRjaCgpKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRPcHRpb25hbF8odGhpcy5nZXRSZXNvdXJjZU9wdGlvbmFsKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGdldFJlc291cmNlRmV0Y2goKSB7CisJCXJldHVybiBGZXRjaFR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKHRoaXMubWFwcGluZ0Fubm90YXRpb24uZ2V0RmV0Y2goKSk7CisJfQorCQorCXByb3RlY3RlZCBCb29sZWFuIGdldFJlc291cmNlT3B0aW9uYWwoKSB7CisJCXJldHVybiB0aGlzLm1hcHBpbmdBbm5vdGF0aW9uLmdldE9wdGlvbmFsKCk7CisJfQorCQorCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGJ1aWxkU3BlY2lmaWVkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7CisJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGNvbnZlcnRlclR5cGUsIENvbnZlcnRlci5FTlVNRVJBVEVEX0NPTlZFUlRFUikpIHsKKwkJCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhRW51bWVyYXRlZENvbnZlcnRlcih0aGlzLCB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJfQorCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChjb252ZXJ0ZXJUeXBlLCBDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKSkgeworCQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFUZW1wb3JhbENvbnZlcnRlcih0aGlzLCB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJfQorCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChjb252ZXJ0ZXJUeXBlLCBDb252ZXJ0ZXIuTE9CX0NPTlZFUlRFUikpIHsKKwkJCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhTG9iQ29udmVydGVyKHRoaXMsIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlQ29udmVydGVyVHlwZSgpIHsKKwkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpICE9IG51bGwpIHsKKwkJCXJldHVybiBDb252ZXJ0ZXIuRU5VTUVSQVRFRF9DT05WRVJURVI7CisJCX0KKwkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUjsKKwkJfQorCQlpZiAodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gQ29udmVydGVyLkxPQl9DT05WRVJURVI7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmcoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlyZXN1bHQgPSB0aGlzLmdldENvbHVtbigpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQlpZiAodGhpcy5zaG91bGRWYWxpZGF0ZUFnYWluc3REYXRhYmFzZSgpKSB7CisJCQl0aGlzLnZhbGlkYXRlQ29sdW1uKG1lc3NhZ2VzLCBhc3RSb290KTsKKwkJfQorCQlpZiAodGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXIgIT0gbnVsbCkgeworCQkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbHVtbihMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJaWYgKHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGhpcy5jb2x1bW4uZ2V0VGFibGUoKSkpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuY29sdW1uLmdldFRhYmxlKCksIHRoaXMuY29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQl0aGlzLmNvbHVtbiwKKwkJCQkJdGhpcy5jb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkpCisJCQkpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoICEgdGhpcy5jb2x1bW4uaXNSZXNvbHZlZCgpICYmIHRoaXMuY29sdW1uLmdldERiVGFibGUoKSAhPSBudWxsKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuY29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQl0aGlzLmNvbHVtbiwKKwkJCQkJdGhpcy5jb2x1bW4uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KQorCQkJCSkKKwkJCSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUVtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhRW1iZWRkYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MmQwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUVtYmVkZGFibGUuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFFbWJlZGRhYmxlCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZworCWltcGxlbWVudHMgSmF2YUVtYmVkZGFibGUKK3sKKwlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhRW1iZWRkYWJsZShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgeworCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUVudGl0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzY3NDQwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFFbnRpdHkuamF2YQpAQCAtMCwwICsxLDE2MjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm1WYXJpYXRpb24uU3VwcG9ydGVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNlSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YURpc2NyaW1pbmF0b3JDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0b3JDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUXVlcnlDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTZWNvbmRhcnlUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZUhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSWRDbGFzc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFFbnRpdHkKKwlleHRlbmRzIEFic3RyYWN0SmF2YVR5cGVNYXBwaW5nCisJaW1wbGVtZW50cyBKYXZhRW50aXR5LCBKYXZhQ2FjaGVhYmxlSG9sZGVyMl8wCit7CisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lOworCisJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZTsKKworCXByb3RlY3RlZCBmaW5hbCBKYXZhVGFibGUgdGFibGU7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWZpZWRUYWJsZUlzQWxsb3dlZDsKKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiB0YWJsZUlzVW5kZWZpbmVkOworCisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YVNlY29uZGFyeVRhYmxlPiBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXM7CisKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uczsKKworCXByb3RlY3RlZCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOworCisJcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZSBzcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5OworCQorCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgZGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3k7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWU7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZTsKKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQ7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZDsKKwkJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW47CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkOworCQorCXByb3RlY3RlZCBib29sZWFuIGRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZDsKKworCXByb3RlY3RlZCBmaW5hbCBKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFRdWVyeUNvbnRhaW5lciBxdWVyeUNvbnRhaW5lcjsKKworCXByb3RlY3RlZCBmaW5hbCBKYXZhR2VuZXJhdG9yQ29udGFpbmVyIGdlbmVyYXRvckNvbnRhaW5lcjsKKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGlkQ2xhc3M7CisJCisJcHJvdGVjdGVkIEVudGl0eSByb290RW50aXR5OworCQorCXByb3RlY3RlZCBBYnN0cmFjdEphdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLnRhYmxlID0gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhVGFibGUodGhpcyk7CisJCXRoaXMuZGlzY3JpbWluYXRvckNvbHVtbiA9IGJ1aWxkSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4oKTsKKwkJdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMgPSBuZXcgQXJyYXlMaXN0PEphdmFTZWNvbmRhcnlUYWJsZT4oKTsKKwkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oKTsKKwkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKHRoaXMsIG5ldyBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyKCkpOworCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgPSB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKHRoaXMsIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyT3duZXIoKSk7CisJCXRoaXMucXVlcnlDb250YWluZXIgPSB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFRdWVyeUNvbnRhaW5lcih0aGlzKTsKKwkJdGhpcy5nZW5lcmF0b3JDb250YWluZXIgPSB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFHZW5lcmF0b3JDb250YWluZXIodGhpcyk7CisJfQorCQorCXByb3RlY3RlZCBKYXZhQmFzZUpvaW5Db2x1bW4uT3duZXIgYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCkgeworCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uIGJ1aWxkSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4oKSB7CisJCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFEaXNjcmltaW5hdG9yQ29sdW1uKHRoaXMsIGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbk93bmVyKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXIgYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uT3duZXIoKSB7CisJCXJldHVybiBuZXcgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXIoKXsKKwkJCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7CisJCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS50aGlzLmdldERiVGFibGUodGFibGVOYW1lKTsKKwkJCX0KKworCQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CisJCQl9CisKKwkJCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKKwkJCQlyZXR1cm4gQWJzdHJhY3RKYXZhRW50aXR5LnRoaXM7CisJCQl9CisJCQkKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7CisJCQkJcmV0dXJuIGlzRGVzY2VuZGFudCgpID8KKwkJCQkJCWdldFJvb3RFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpCisJCQkJCToKKwkJCQkJCWRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZCgpPyAKKwkJCQkJCQludWxsCisJCQkJCQk6CisJCQkJCQkJRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX05BTUU7CisJCQl9CisJCQkKKwkJCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdExlbmd0aCgpIHsKKwkJCQlyZXR1cm4gaXNEZXNjZW5kYW50KCkgPworCQkJCQlnZXRSb290RW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpCisJCQkJOgorCQkJCQlkaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKT8gCisJCQkJCQkwLy9UT0RPIHRoaW5rIGkgd2FudCB0byByZXR1cm4gbnVsbCBoZXJlCisJCQkJCToKKwkJCQkJCURpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEg7CisJCQl9CisJCQkKKwkJCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSB7CisJCQkJcmV0dXJuIGlzRGVzY2VuZGFudCgpID8KKwkJCQkJZ2V0Um9vdEVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpCisJCQkJOgorCQkJCQlkaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKT8gCisJCQkJCQludWxsCisJCQkJCToKKwkJCQkJCURpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEU7CisJCQl9CisJCX07CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7CisJCXN1cGVyLmluaXRpYWxpemUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7CisJCQorCQl0aGlzLnNwZWNpZmllZE5hbWUgPSB0aGlzLmdldFJlc291cmNlTmFtZSgpOworCQl0aGlzLmRlZmF1bHROYW1lID0gdGhpcy5nZXRSZXNvdXJjZURlZmF1bHROYW1lKCk7CisJCXRoaXMucm9vdEVudGl0eSA9IGNhbGN1bGF0ZVJvb3RFbnRpdHkoKTsKKwkJdGhpcy5kZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSA9IHRoaXMuYnVpbGREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpOworCQl0aGlzLnNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kgPSB0aGlzLmdldFJlc291cmNlSW5oZXJpdGFuY2VTdHJhdGVneShnZXRSZXNvdXJjZUluaGVyaXRhbmNlKCkpOworCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCA9IHRoaXMuYnVpbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQoKTsKKwkJdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCA9IHRoaXMuYnVpbGREaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpOworCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSA9IHRoaXMuZ2V0UmVzb3VyY2VEaXNjcmltaW5hdG9yVmFsdWUoKS5nZXRWYWx1ZSgpOworCQl0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLmJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpOworCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpOworCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZCA9IHRoaXMuYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKTsKKwkJdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uLmluaXRpYWxpemUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7CisJCXRoaXMuc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkVGFibGVJc0FsbG93ZWQoKTsKKwkJdGhpcy50YWJsZUlzVW5kZWZpbmVkID0gdGhpcy5idWlsZFRhYmxlSXNVbmRlZmluZWQoKTsKKwkJdGhpcy50YWJsZS5pbml0aWFsaXplKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOworCQl0aGlzLmluaXRpYWxpemVTZWNvbmRhcnlUYWJsZXMoKTsKKwkJdGhpcy5nZW5lcmF0b3JDb250YWluZXIuaW5pdGlhbGl6ZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKKwkJdGhpcy5xdWVyeUNvbnRhaW5lci5pbml0aWFsaXplKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOworCQl0aGlzLmluaXRpYWxpemVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkJdGhpcy5pbml0aWFsaXplRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CisJCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuaW5pdGlhbGl6ZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKKwkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmluaXRpYWxpemUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7CisJCXRoaXMuaW5pdGlhbGl6ZUlkQ2xhc3MoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNlY29uZGFyeVRhYmxlcygpIHsKKwkJZm9yIChJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IHN0cmVhbSA9IAorCQkJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuYW5ub3RhdGlvbnMoCisJCQkJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIAorCQkJCQlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7IAorCQkJCXN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMuYWRkKAorCQkJCQlidWlsZFNlY29uZGFyeVRhYmxlKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHN0cmVhbS5uZXh0KCkpKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQlmb3IgKEl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gc3RyZWFtID0gCisJCQkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hbm5vdGF0aW9ucygKKwkJCQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgCisJCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsgCisJCQkJc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoCisJCQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgc3RyZWFtLm5leHQoKSkpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEJ1aWxkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgeworCQlyZXR1cm4gIWNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKKwkJaWYgKCFzaG91bGRCdWlsZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG5ldyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpKTsKKwl9CQorCisJLy9xdWVyeSBmb3IgdGhlIGluaGVyaXRhbmNlIHJlc291cmNlIGV2ZXJ5IHRpbWUgb24gc2V0dGVycy4KKwkvL2NhbGwgb25lIHNldHRlciBhbmQgdGhlIGluaGVyaXRhbmNlUmVzb3VyY2UgY291bGQgY2hhbmdlLiAKKwkvL1lvdSBjb3VsZCBjYWxsIG1vcmUgdGhhbiBvbmUgc2V0dGVyIGJlZm9yZSB0aGlzIG9iamVjdCBoYXMgcmVjZWl2ZWQgYW55IG5vdGlmaWNhdGlvbgorCS8vZnJvbSB0aGUgamF2YSByZXNvdXJjZSBtb2RlbAorCXByb3RlY3RlZCBJbmhlcml0YW5jZUFubm90YXRpb24gZ2V0UmVzb3VyY2VJbmhlcml0YW5jZSgpIHsKKwkJcmV0dXJuIChJbmhlcml0YW5jZUFubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuCisJCQkJZ2V0Tm9uTnVsbEFubm90YXRpb24oSW5oZXJpdGFuY2VBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJfQorCQorCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGdldFJlc291cmNlRGlzY3JpbWluYXRvclZhbHVlKCkgeworCQlyZXR1cm4gKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuCisJCQkJZ2V0Tm9uTnVsbEFubm90YXRpb24oRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSWRDbGFzcygpIHsKKwkJSWRDbGFzc0Fubm90YXRpb24gcmVzb3VyY2VJZENsYXNzID0gZ2V0UmVzb3VyY2VJZENsYXNzKCk7CisJCWlmIChyZXNvdXJjZUlkQ2xhc3MgIT0gbnVsbCkgeworCQkJdGhpcy5pZENsYXNzID0gcmVzb3VyY2VJZENsYXNzLmdldFZhbHVlKCk7CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVudGl0eUFubm90YXRpb24gZ2V0UmVzb3VyY2VNYXBwaW5nQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIChFbnRpdHlBbm5vdGF0aW9uKSBzdXBlci5nZXRSZXNvdXJjZU1hcHBpbmdBbm5vdGF0aW9uKCk7CisJfQorCQorCS8vKioqKioqKioqKioqKioqKioqIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioKKworCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKKwkJcmV0dXJuIHRoaXM7CisJfQorCQorCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCkgeworCQlQZXJzaXN0ZW50VHlwZSBzdXBlclBlcnNpc3RlbnRUeXBlID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCk7CisJCXJldHVybiBzdXBlclBlcnNpc3RlbnRUeXBlID09IG51bGwgPyBudWxsIDogc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJfQorCQorCS8vKioqKioqKioqKioqKioqKioqIFR5cGVNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzTWFwcGVkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlUYWJsZU5hbWUoKSB7CisJCXJldHVybiB0aGlzLmdldFRhYmxlKCkuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0UHJpbWFyeURiVGFibGUoKSB7CisJCXJldHVybiBnZXRUYWJsZSgpLmdldERiVGFibGUoKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGVbXSBFTVBUWV9EQl9UQUJMRV9BUlJBWSA9IG5ldyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGVbMF07CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgeworCQkvLyB0aGUgSlBBIHBsYXRmb3JtIHNlYXJjaGVzIGRhdGFiYXNlIG9iamVjdHMgZm9yIHVzCisJCXJldHVybiB0aGlzLmdldERhdGFTb3VyY2UoKS5zZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIoCisJCQkJCQlBcnJheVRvb2xzLmFycmF5KHRoaXMuYXNzb2NpYXRlZERiVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCksIEVNUFRZX0RCX1RBQkxFX0FSUkFZKSwKKwkJCQkJCXRhYmxlTmFtZQorCQkJCQkpOworCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU+IGFzc29jaWF0ZWREYlRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpIHsKKwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUsIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZT4odGhpcy5hc3NvY2lhdGVkRGJUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWRfKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSB0KSB7CisJCQkJcmV0dXJuIHQgIT0gbnVsbDsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8b3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlPiBhc3NvY2lhdGVkRGJUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWRfKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VGFibGUsIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZT4odGhpcy5hc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSB0cmFuc2Zvcm0oVGFibGUgdCkgeworCQkJCXJldHVybiB0LmdldERiVGFibGUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU2NoZW1hIGdldERiU2NoZW1hKCkgeworCQlyZXR1cm4gZ2V0VGFibGUoKS5nZXREYlNjaGVtYSgpOworCX0KKworCisJLy8qKioqKioqKioqKioqKioqKiogSmF2YVR5cGVNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgeworCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigKKwkJCUpQQS5UQUJMRSwKKwkJCUpQQS5TRUNPTkRBUllfVEFCTEUsCisJCQlKUEEuU0VDT05EQVJZX1RBQkxFUywKKwkJCUpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwKKwkJCUpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMsCisJCQlKUEEuSURfQ0xBU1MsCisJCQlKUEEuSU5IRVJJVEFOQ0UsCisJCQlKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRSwKKwkJCUpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTiwKKwkJCUpQQS5TRVFVRU5DRV9HRU5FUkFUT1IsCisJCQlKUEEuVEFCTEVfR0VORVJBVE9SLAorCQkJSlBBLk5BTUVEX1FVRVJZLAorCQkJSlBBLk5BTUVEX1FVRVJJRVMsCisJCQlKUEEuTkFNRURfTkFUSVZFX1FVRVJZLAorCQkJSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTLAorCQkJSlBBLlNRTF9SRVNVTFRfU0VUX01BUFBJTkcsCisJCQlKUEEuRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUywKKwkJCUpQQS5FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTLAorCQkJSlBBLkVOVElUWV9MSVNURU5FUlMsCisJCQlKUEEuUFJFX1BFUlNJU1QsCisJCQlKUEEuUE9TVF9QRVJTSVNULAorCQkJSlBBLlBSRV9SRU1PVkUsCisJCQlKUEEuUE9TVF9SRU1PVkUsCisJCQlKUEEuUFJFX1VQREFURSwKKwkJCUpQQS5QT1NUX1VQREFURSwKKwkJCUpQQS5QT1NUX0xPQUQsCisJCQlKUEEuQVRUUklCVVRFX09WRVJSSURFLAorCQkJSlBBLkFUVFJJQlVURV9PVkVSUklERVMsCisJCQlKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsCisJCQlKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwl9CisKKwkvLyoqKioqKioqKioqKioqKioqKiBFbnRpdHkgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdE5hbWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkTmFtZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWROYW1lKFN0cmluZyBuZXdTcGVjaWZpZWROYW1lKSB7CisJCVN0cmluZyBvbGRTcGVjaWZpZWROYW1lID0gdGhpcy5zcGVjaWZpZWROYW1lOworCQl0aGlzLnNwZWNpZmllZE5hbWUgPSBuZXdTcGVjaWZpZWROYW1lOworCQl0aGlzLmdldFJlc291cmNlTWFwcGluZ0Fubm90YXRpb24oKS5zZXROYW1lKG5ld1NwZWNpZmllZE5hbWUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWROYW1lLCBuZXdTcGVjaWZpZWROYW1lKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTmFtZV8oU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKKwkJU3RyaW5nIG9sZFNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWU7CisJCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5ld1NwZWNpZmllZE5hbWU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE5hbWUsIG5ld1NwZWNpZmllZE5hbWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHROYW1lOworCX0KKwkKKwlwcm90ZWN0ZWQvKnByaXZhdGUtcHJvdGVjdGVkKi8gdm9pZCBzZXREZWZhdWx0TmFtZShTdHJpbmcgbmV3RGVmYXVsdE5hbWUpIHsKKwkJU3RyaW5nIG9sZERlZmF1bHROYW1lID0gdGhpcy5kZWZhdWx0TmFtZTsKKwkJdGhpcy5kZWZhdWx0TmFtZSA9IG5ld0RlZmF1bHROYW1lOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTkFNRV9QUk9QRVJUWSwgb2xkRGVmYXVsdE5hbWUsIG5ld0RlZmF1bHROYW1lKTsKKwl9CisKKwlwdWJsaWMgSmF2YVRhYmxlIGdldFRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy50YWJsZTsKKwl9CisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4odGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMpOworCX0KKwkKKwlwdWJsaWMgaW50IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5zaXplKCk7CisJfQorCQorCXB1YmxpYyBKYXZhU2Vjb25kYXJ5VGFibGUgYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW50IGluZGV4KSB7CisJCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFTZWNvbmRhcnlUYWJsZSh0aGlzKTsKKwkJdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMuYWRkKGluZGV4LCBzZWNvbmRhcnlUYWJsZSk7CisJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gCisJCQkJKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS4KKwkJCQkJYWRkQW5ub3RhdGlvbigKKwkJCQkJCWluZGV4LCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCAKKwkJCQkJCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJc2Vjb25kYXJ5VGFibGUuaW5pdGlhbGl6ZShzZWNvbmRhcnlUYWJsZVJlc291cmNlKTsKKwkJZmlyZUl0ZW1BZGRlZChTUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNULCBpbmRleCwgc2Vjb25kYXJ5VGFibGUpOworCQlyZXR1cm4gc2Vjb25kYXJ5VGFibGU7CisJfQorCisJcHVibGljIEphdmFTZWNvbmRhcnlUYWJsZSBhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUodGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMuc2l6ZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW50IGluZGV4LCBKYXZhU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKKwkJYWRkSXRlbVRvTGlzdChpbmRleCwgc2Vjb25kYXJ5VGFibGUsIHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLCBTUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNUKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoSmF2YVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7CisJCXRoaXMuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUodGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMuc2l6ZSgpLCBzZWNvbmRhcnlUYWJsZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7CisJCXRoaXMucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUodGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMuaW5kZXhPZihzZWNvbmRhcnlUYWJsZSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgaW5kZXgpIHsKKwkJSmF2YVNlY29uZGFyeVRhYmxlIHJlbW92ZWRTZWNvbmRhcnlUYWJsZSA9IHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLnJlbW92ZShpbmRleCk7CisJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUucmVtb3ZlQW5ub3RhdGlvbigKKwkJCQlpbmRleCwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlmaXJlSXRlbVJlbW92ZWQoU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCwgaW5kZXgsIHJlbW92ZWRTZWNvbmRhcnlUYWJsZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlXyhKYXZhU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KHNlY29uZGFyeVRhYmxlLCB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcywgU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCk7CisJfQorCQorCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5tb3ZlQW5ub3RhdGlvbigKKwkJCQl0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJZmlyZUl0ZW1Nb3ZlZChTUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCisJfQorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXMoKSB7CisJCXJldHVybiBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKKwl9CisKKwlwdWJsaWMgaW50IHNlY29uZGFyeVRhYmxlc1NpemUoKSB7CisJCXJldHVybiBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCk7CisJfQorCisJcHVibGljIEluaGVyaXRhbmNlVHlwZSBnZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpIDogdGhpcy5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7CisJfQorCQorCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgbmV3SW5oZXJpdGFuY2VUeXBlKSB7CisJCUluaGVyaXRhbmNlVHlwZSBvbGRJbmhlcml0YW5jZVR5cGUgPSB0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OworCQl0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gbmV3SW5oZXJpdGFuY2VUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSU5IRVJJVEFOQ0VfU1RSQVRFR1lfUFJPUEVSVFksIG9sZEluaGVyaXRhbmNlVHlwZSwgbmV3SW5oZXJpdGFuY2VUeXBlKTsKKwl9CisJCisJcHVibGljIEluaGVyaXRhbmNlVHlwZSBnZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5OworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZSBuZXdJbmhlcml0YW5jZVR5cGUpIHsKKwkJSW5oZXJpdGFuY2VUeXBlIG9sZEluaGVyaXRhbmNlVHlwZSA9IHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneTsKKwkJdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gbmV3SW5oZXJpdGFuY2VUeXBlOworCQlnZXRSZXNvdXJjZUluaGVyaXRhbmNlKCkuc2V0U3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3SW5oZXJpdGFuY2VUeXBlKSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZLCBvbGRJbmhlcml0YW5jZVR5cGUsIG5ld0luaGVyaXRhbmNlVHlwZSk7CisJfQorCQorCS8qKgorCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgorCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCisJICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgorCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneV8oSW5oZXJpdGFuY2VUeXBlIG5ld0luaGVyaXRhbmNlVHlwZSkgeworCQlJbmhlcml0YW5jZVR5cGUgb2xkSW5oZXJpdGFuY2VUeXBlID0gdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5OworCQl0aGlzLnNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kgPSBuZXdJbmhlcml0YW5jZVR5cGU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZLCBvbGRJbmhlcml0YW5jZVR5cGUsIG5ld0luaGVyaXRhbmNlVHlwZSk7CisJfQorCisJcHVibGljIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uIGdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSB7CisJCXJldHVybiB0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW47CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoU3RyaW5nIG5ld0RlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUpIHsKKwkJU3RyaW5nIG9sZERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWU7CisJCXRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSA9IG5ld0RlZmF1bHREaXNjcmltaW5hdG9yVmFsdWU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9ESVNDUklNSU5BVE9SX1ZBTFVFX1BST1BFUlRZLCBvbGREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlLCBuZXdEZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZShTdHJpbmcgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKSB7CisJCVN0cmluZyBvbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZTsKKwkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUgPSBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWU7CisJCWdldFJlc291cmNlRGlzY3JpbWluYXRvclZhbHVlKCkuc2V0VmFsdWUobmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlLCBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUpOworCX0KKworCS8qKgorCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgorCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCisJICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgorCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlXyhTdHJpbmcgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKSB7CisJCVN0cmluZyBvbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZTsKKwkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUgPSBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSwgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpIDogdGhpcy5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQ7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZChib29sZWFuIHNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCkgeworCQlib29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkOworCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCA9IHNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChFbnRpdHkuU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfSVNfQUxMT1dFRF9QUk9QRVJUWSwgb2xkLCBzcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQpOworCX0KKworCXB1YmxpYyBib29sZWFuIGRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkgeworCQlyZXR1cm4gdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZDsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoYm9vbGVhbiBkaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCkgeworCQlib29sZWFuIG9sZCA9IHRoaXMuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQ7CisJCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQgPSBkaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChESVNDUklNSU5BVE9SX1ZBTFVFX0lTX1VOREVGSU5FRF9QUk9QRVJUWSwgb2xkLCBkaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQ7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoYm9vbGVhbiBzcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKSB7CisJCWJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkOworCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQgPSBzcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9ESVNDUklNSU5BVE9SX0NPTFVNTl9JU19BTExPV0VEX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBkaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKSB7CisJCXJldHVybiB0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZDsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkKGJvb2xlYW4gZGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkKSB7CisJCWJvb2xlYW4gb2xkID0gdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQ7CisJCXRoaXMuZGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkID0gZGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERJU0NSSU1JTkFUT1JfQ09MVU1OX0lTX1VOREVGSU5FRF9QUk9QRVJUWSwgb2xkLCBkaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQpOworCX0KKworCXB1YmxpYyBib29sZWFuIHNwZWNpZmllZFRhYmxlSXNBbGxvd2VkKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUYWJsZUlzQWxsb3dlZDsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVGFibGVJc0FsbG93ZWQoYm9vbGVhbiBzcGVjaWZpZWRUYWJsZUlzQWxsb3dlZCkgeworCQlib29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQ7CisJCXRoaXMuc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQgPSBzcGVjaWZpZWRUYWJsZUlzQWxsb3dlZDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEFCTEVfSVNfQUxMT1dFRF9QUk9QRVJUWSwgb2xkLCBzcGVjaWZpZWRUYWJsZUlzQWxsb3dlZCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHRhYmxlSXNVbmRlZmluZWQoKSB7CisJCXJldHVybiB0aGlzLnRhYmxlSXNVbmRlZmluZWQ7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFRhYmxlSXNVbmRlZmluZWQoYm9vbGVhbiB0YWJsZUlzVW5kZWZpbmVkKSB7CisJCWJvb2xlYW4gb2xkID0gdGhpcy50YWJsZUlzVW5kZWZpbmVkOworCQl0aGlzLnRhYmxlSXNVbmRlZmluZWQgPSB0YWJsZUlzVW5kZWZpbmVkOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0lTX1VOREVGSU5FRF9QUk9QRVJUWSwgb2xkLCB0YWJsZUlzVW5kZWZpbmVkKTsKKwl9CisJCisJcHVibGljIEphdmFHZW5lcmF0b3JDb250YWluZXIgZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkgeworCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3JDb250YWluZXI7CisJfQorCisJcHVibGljIExpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIHRoaXMuY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA/IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgOiB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwl9CisJCisJcHVibGljIGludCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7CisJfQorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyk7CisJfQorCQorCXB1YmxpYyBpbnQgc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiAhdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpOworCX0JCisJCisJcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBuZXdQa0pvaW5Db2x1bW4pIHsKKwkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIG9sZFBrSm9pbkNvbHVtbiA9IHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOworCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG5ld1BrSm9pbkNvbHVtbjsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBvbGRQa0pvaW5Db2x1bW4sIG5ld1BrSm9pbkNvbHVtbik7CisJfQorCisJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7CisJCWlmICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiAhPSBudWxsKSB7CisJCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbik7CisJCX0KKwkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7CisJfQorCQorCXByb3RlY3RlZCBpbnQgZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiAodGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPT0gbnVsbCkgPyAwIDogMTsKKwl9CisKKwlwdWJsaWMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgeworCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gb2xkRGVmYXVsdFBrSm9pbkNvbHVtbiA9IHRoaXMuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CisJCWlmIChvbGREZWZhdWx0UGtKb2luQ29sdW1uICE9IG51bGwpIHsKKwkJCS8vbnVsbCB0aGUgZGVmYXVsdCBqb2luIGNvbHVtbiBub3cgaWYgb25lIGFscmVhZHkgZXhpc3RzLgorCQkJLy9pZiBvbmUgZG9lcyBub3QgZXhpc3QsIHRoZXJlIGlzIGFscmVhZHkgYSBzcGVjaWZpZWQgam9pbiBjb2x1bW4uCisJCQkvL1JlbW92ZSBpdCBub3cgc28gdGhhdCBpdCBkb2Vzbid0IGdldCByZW1vdmVkIGR1cmluZyBhbiB1cGRhdGUgYW5kCisJCQkvL2NhdXNlIGNoYW5nZSBub3RpZmljYXRpb25zIHRvIGJlIHNlbnQgdG8gdGhlIFVJIGluIHRoZSB3cm9uZyBvcmRlcgorCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBudWxsOworCQl9CisJCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLCBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKSk7CisJCXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLmFkZChpbmRleCwgcHJpbWFyeUtleUpvaW5Db2x1bW4pOworCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uUmVzb3VyY2UgPSAKKwkJCQkoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLgorCQkJCQlhZGRBbm5vdGF0aW9uKAorCQkJCQkJaW5kZXgsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIAorCQkJCQkJUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbi5pbml0aWFsaXplKHBrSm9pbkNvbHVtblJlc291cmNlKTsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKFNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHByaW1hcnlLZXlKb2luQ29sdW1uKTsKKwkJaWYgKG9sZERlZmF1bHRQa0pvaW5Db2x1bW4gIT0gbnVsbCkgeworCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIG9sZERlZmF1bHRQa0pvaW5Db2x1bW4sIG51bGwpOworCQl9CisJCXJldHVybiBwcmltYXJ5S2V5Sm9pbkNvbHVtbjsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgsIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgeworCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBwcmltYXJ5S2V5Sm9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIFNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCk7CisJfQorCQkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4pIHsKKwkJdGhpcy5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5zaXplKCksIHByaW1hcnlLZXlKb2luQ29sdW1uKTsKKwl9CisJCQorCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uKSB7CisJCXJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLmluZGV4T2YocHJpbWFyeUtleUpvaW5Db2x1bW4pKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiByZW1vdmVkUHJpbWFyeUtleUpvaW5Db2x1bW4gPSB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOworCQlpZiAoIWNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpIHsKKwkJCS8vY3JlYXRlIHRoZSBkZWZhdWx0Sm9pbkNvbHVtbiBub3cgb3IgdGhpcyB3aWxsIGhhcHBlbiBkdXJpbmcgcHJvamVjdCB1cGRhdGUgCisJCQkvL2FmdGVyIHJlbW92aW5nIHRoZSBqb2luIGNvbHVtbiBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4gVGhhdCBjYXVzZXMgcHJvYmxlbXMgCisJCQkvL2luIHRoZSBVSSBiZWNhdXNlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBlbmQgdXAgaW4gdGhlIHdyb25nIG9yZGVyLgorCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG5ldyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpKTsKKwkJfQorCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oCisJCQkJaW5kZXgsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIAorCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJZmlyZUl0ZW1SZW1vdmVkKFNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHJlbW92ZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbik7CisJCWlmICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiAhPSBudWxsKSB7CisJCQkvL2ZpcmUgY2hhbmdlIG5vdGlmaWNhdGlvbiBpZiBhIGRlZmF1bHRKb2luQ29sdW1uIHdhcyBjcmVhdGVkIGFib3ZlCisJCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgbnVsbCwgdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4pOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5fKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgeworCQlyZW1vdmVJdGVtRnJvbUxpc3QocHJpbWFyeUtleUpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLCBTUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5tb3ZlQW5ub3RhdGlvbigKKwkJCQl0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJbW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucywgU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsJCQorCX0KKwkKKwlwdWJsaWMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkgeworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKKwl9CisJCisJcHVibGljIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKSB7CisJCXJldHVybiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CisJfQorCQorCXB1YmxpYyBKYXZhUXVlcnlDb250YWluZXIgZ2V0UXVlcnlDb250YWluZXIoKSB7CisJCXJldHVybiB0aGlzLnF1ZXJ5Q29udGFpbmVyOworCX0KKwkKKwlwdWJsaWMgY2hhciBnZXRJZENsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKKwkJcmV0dXJuICcuJzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldElkQ2xhc3MoKSB7CisJCXJldHVybiB0aGlzLmlkQ2xhc3M7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldElkQ2xhc3MoU3RyaW5nIG5ld0lkQ2xhc3MpIHsKKwkJU3RyaW5nIG9sZElkQ2xhc3MgPSB0aGlzLmlkQ2xhc3M7CisJCXRoaXMuaWRDbGFzcyA9IG5ld0lkQ2xhc3M7CisJCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChuZXdJZENsYXNzLCBvbGRJZENsYXNzKSkgeworCQkJaWYgKG5ld0lkQ2xhc3MgIT0gbnVsbCkgeworCQkJCWlmIChnZXRSZXNvdXJjZUlkQ2xhc3MoKSA9PSBudWxsKSB7CisJCQkJCWFkZFJlc291cmNlSWRDbGFzcygpOworCQkJCX0KKwkJCQlnZXRSZXNvdXJjZUlkQ2xhc3MoKS5zZXRWYWx1ZShuZXdJZENsYXNzKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZVJlc291cmNlSWRDbGFzcygpOworCQkJfQorCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSURfQ0xBU1NfUFJPUEVSVFksIG9sZElkQ2xhc3MsIG5ld0lkQ2xhc3MpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRJZENsYXNzXyhTdHJpbmcgbmV3SWRDbGFzcykgeworCQlTdHJpbmcgb2xkSWRDbGFzcyA9IHRoaXMuaWRDbGFzczsKKwkJdGhpcy5pZENsYXNzID0gbmV3SWRDbGFzczsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChJRF9DTEFTU19QUk9QRVJUWSwgb2xkSWRDbGFzcywgbmV3SWRDbGFzcyk7CisJfQorCisJcHJvdGVjdGVkIElkQ2xhc3NBbm5vdGF0aW9uIGdldFJlc291cmNlSWRDbGFzcygpIHsKKwkJcmV0dXJuIChJZENsYXNzQW5ub3RhdGlvbikgdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS4KKwkJCQlnZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlSWRDbGFzcygpIHsKKwkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hZGRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlSWRDbGFzcygpIHsKKwkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJfQorCisJcHVibGljIEVudGl0eSBnZXRQYXJlbnRFbnRpdHkoKSB7CisJCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IHN0cmVhbSA9IGdldFBlcnNpc3RlbnRUeXBlKCkuYW5jZXN0b3JzKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7CisJCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHN0cmVhbS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQkJaWYgKHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5KSB7CisJCQkJcmV0dXJuIChFbnRpdHkpIHR5cGVNYXBwaW5nOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgdWx0aW1hdGUgdG9wIG9mIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkgCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIHJldHVybiBudWxsLiBUaGUgcm9vdAorCSAqIGlzIGRlZmluZWQgYXMgdGhlIHBlcnNpc3RlbnQgdHlwZSBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisJICogdGhhdCBoYXMgbm8gcGFyZW50LiAgVGhlIHJvb3Qgc2hvdWxkIGJlIGFuIGVudGl0eQorCSAqICAKKwkgKiBOb24tZW50aXRpZXMgaW4gdGhlIGhpZXJhcmNoeSBzaG91bGQgYmUgaWdub3JlZCwgaWUgc2tpcAorCSAqIG92ZXIgdGhlbSBpbiB0aGUgc2VhcmNoIGZvciB0aGUgcm9vdC4gCisJICovCisJcHJvdGVjdGVkIEVudGl0eSBnZXRSb290RW50aXR5KCkgeworCQlyZXR1cm4gdGhpcy5yb290RW50aXR5OworCX0KKworCS8qKgorCSAqIFRhYmxlIG5hbWUgZGVmYXVsdHMgdG8gdGhlIGVudGl0eSBuYW1lLgorCSAqIElmIHRoZSBlbnRpdHkgaXMgcGFydCBvZiBhIHNpbmdsZSB0YWJsZSBpbmhlcml0YW5jZSBoaWVyYXJjaHksIHRhYmxlCisJICogbmFtZSBkZWZhdWx0cyB0byB0aGUgcm9vdCBlbnRpdHkncyB0YWJsZSBuYW1lLgorCSAqIElmIHRoZSBlbnRpdHkgaXMgYWJzdHJhY3QgYW5kIHBhcnQgb2YgYSB0YWJsZSBwZXIgY2xhc3MKKwkgKiBpbmhlcml0YW5jZSBoaWVyYXJjaHksIHRoZSB0YWJsZSBuYW1lIGRlZmF1bHRzIHRvIG51bGwsIG5vIHRhYmxlIGFwcGxpZXMKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7CisJCXJldHVybiB0aGlzLmlzU2luZ2xlVGFibGVEZXNjZW5kYW50KCkgPworCQkJCQkJdGhpcy5nZXRSb290RW50aXR5KCkuZ2V0VGFibGUoKS5nZXROYW1lKCkKKwkJCQkJOgorCQkJCQkJdGhpcy5pc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpID8KKwkJCQkJCQkJbnVsbAorCQkJCQkJCToKKwkJCQkJCQkJdGhpcy5nZXROYW1lKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy5pc1NpbmdsZVRhYmxlRGVzY2VuZGFudCgpID8KKwkJCQkJCXRoaXMuZ2V0Um9vdEVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkKKwkJCQkJOgorCQkJCQkJdGhpcy5pc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpID8KKwkJCQkJCQludWxsCisJCQkJCQk6CisJCQkJCQkJdGhpcy5nZXRDb250ZXh0RGVmYXVsdFNjaGVtYSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLmlzU2luZ2xlVGFibGVEZXNjZW5kYW50KCkgPworCQkJCQkJdGhpcy5nZXRSb290RW50aXR5KCkuZ2V0VGFibGUoKS5nZXRDYXRhbG9nKCkKKwkJCQkJOgorCQkJCQkJdGhpcy5pc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpID8KKwkJCQkJCQludWxsCisJCQkJCQk6CisJCQkJCQkJdGhpcy5nZXRDb250ZXh0RGVmYXVsdENhdGFsb2coKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgcm9vdCBlbnRpdHkKKwkgKiBvZiBhICJzaW5nbGUgdGFibGUiIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NpbmdsZVRhYmxlRGVzY2VuZGFudCgpIHsKKwkJcmV0dXJuICh0aGlzLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFKQorCQkJCQkmJiB0aGlzLmlzRGVzY2VuZGFudCgpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGlzIGEgZGVzY2VuZGFudCBpbiAoYXMgb3Bwb3NlZCB0byB0aGUgcm9vdCBvZikKKwkgKiBhbiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNEZXNjZW5kYW50KCkgeworCQlyZXR1cm4gISB0aGlzLmlzUm9vdCgpOworCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRpdHkgaXMgdGhlIHRvcCBvZiBhbiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNSb290KCkgeworCQlyZXR1cm4gdGhpcyA9PSB0aGlzLmdldFJvb3RFbnRpdHkoKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSBpcyB0aGUgdG9wIG9mIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorCSAqIGFuZCBoYXMgbm8gZGVzY2VuZGFudHMgYW5kIG5vIHNwZWNpZmllZCBpbmhlcml0YW5jZSBzdHJhdGVneSBoYXMgYmVlbiBkZWZpbmVkLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzUm9vdE5vRGVzY2VuZGFudHNOb1N0cmF0ZWd5RGVmaW5lZCgpIHsKKwkJcmV0dXJuIGlzUm9vdCgpICYmICFnZXRQZXJzaXN0ZW5jZVVuaXQoKS5pc1Jvb3RXaXRoU3ViRW50aXRpZXModGhpcy5nZXROYW1lKCkpICYmIGdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRpdHkgaXMgYWJzdHJhY3QgYW5kIGlzIGEgcGFydCBvZiBhIAorCSAqICJ0YWJsZSBwZXIgY2xhc3MiIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpIHsKKwkJcmV0dXJuIGlzQWJzdHJhY3QoKSAmJiBpc1RhYmxlUGVyQ2xhc3MoKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSBpcyBhIHBhcnQgb2YgYSAidGFibGUgcGVyIGNsYXNzIiAKKwkgKiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWJsZVBlckNsYXNzKCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGlzIGEgcGFydCBvZiBhICJ0YWJsZSBwZXIgY2xhc3MiIAorCSAqIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhYmxlUGVyQ2xhc3NEZXNjZW5kYW50KCkgeworCQlyZXR1cm4gaXNUYWJsZVBlckNsYXNzKCkgJiYgaXNEZXNjZW5kYW50KCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGFic3RyYWN0LgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzQWJzdHJhY3QoKSB7CisJCXJldHVybiB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmlzQWJzdHJhY3QoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKHRoaXMpOworCX0KKwkKKwkvKioKKwkgKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHNoYXJlZCB3aXRoIE9STS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZShFbnRpdHkgZW50aXR5KSB7CisJCVN0cmluZyBwa0NvbHVtbk5hbWUgPSBudWxsOworCQlmb3IgKEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IGVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7CisJCQlTdHJpbmcgY3VycmVudCA9IGF0dHJpYnV0ZS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpOworCQkJaWYgKGN1cnJlbnQgIT0gbnVsbCkgeworCQkJCS8vIDIyOTQyMyAtIGlmIHRoZSBhdHRyaWJ1dGUgaXMgYSBwcmltYXJ5IGtleSwgYnV0IGl0IGhhcyBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUsCisJCQkJLy8gdXNlIHRoZSBvdmVycmlkZSBjb2x1bW4gaW5zdGVhZAorCQkJCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGUgIT0gbnVsbCkgeworCQkJCQljdXJyZW50ID0gYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpOworCQkJCX0KKwkJCX0KKwkJCWlmIChwa0NvbHVtbk5hbWUgPT0gbnVsbCkgeworCQkJCXBrQ29sdW1uTmFtZSA9IGN1cnJlbnQ7CisJCQl9CisJCQllbHNlIGlmIChjdXJyZW50ICE9IG51bGwpIHsKKwkJCQkvLyBpZiB3ZSBlbmNvdW50ZXIgYSBjb21wb3NpdGUgcHJpbWFyeSBrZXksIHJldHVybiBudWxsCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwkJLy8gaWYgd2UgZW5jb3VudGVyIG9ubHkgYSBzaW5nbGUgcHJpbWFyeSBrZXkgY29sdW1uIG5hbWUsIHJldHVybiBpdAorCQlyZXR1cm4gcGtDb2x1bW5OYW1lOworCX0KKworCXB1YmxpYyBQZXJzaXN0ZW50QXR0cmlidXRlIGdldElkQXR0cmlidXRlKCkgeworCQlJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSB0aGlzLmFsbElkQXR0cmlidXRlcygpOworCQlpZiAoc3RyZWFtLmhhc05leHQoKSkgeworCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBzdHJlYW0ubmV4dCgpOworCQkJcmV0dXJuIHN0cmVhbS5oYXNOZXh0KCkgPyBudWxsIC8qbW9yZSB0aGFuIG9uZSovOiBhdHRyaWJ1dGU7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGFsbElkQXR0cmlidXRlcygpIHsKKwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlLCBQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuYWxsQXR0cmlidXRlcygpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChQZXJzaXN0ZW50QXR0cmlidXRlIHBhKSB7CisJCQkJcmV0dXJuIHBhLmlzSWRBdHRyaWJ1dGUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgeworCQlyZXR1cm4gISBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5hc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpLCB0YWJsZU5hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZUFnYWluc3REYXRhYmFzZSgpIHsKKwkJcmV0dXJuIHN1cGVyLnNob3VsZFZhbGlkYXRlQWdhaW5zdERhdGFiYXNlKCkgJiYgISBpc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXMoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8VGFibGU+KHRoaXMuZ2V0VGFibGUoKSwgdGhpcy5zZWNvbmRhcnlUYWJsZXMoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFRhYmxlPiBhc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgeworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFRhYmxlPihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUeXBlTWFwcGluZywgSXRlcmF0b3I8VGFibGU+Pih0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFRhYmxlPiB0cmFuc2Zvcm0oVHlwZU1hcHBpbmcgbWFwcGluZykgeworCQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8VGFibGUsIFRhYmxlPihtYXBwaW5nLmFzc29jaWF0ZWRUYWJsZXMoKSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFRhYmxlIG8pIHsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJLy9UT0RPCisJCQkJCQkvL2ZpbHRlcmluZyB0aGVzZSBvdXQgc28gYXMgdG8gYXZvaWQgdGhlIGR1cGxpY2F0ZSB0YWJsZSwgcm9vdCBhbmQgY2hpbGRyZW4gc2hhcmUgdGhlIHNhbWUgdGFibGUKKwkJCQkJCS8vcmV0dXJuICEobyBpbnN0YW5jZW9mIFNpbmdsZVRhYmxlSW5oZXJpdGFuY2VDaGlsZFRhYmxlSW1wbCk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQl9KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpIHsKKwkJcmV0dXJuIHRoaXMubm9uTnVsbFRhYmxlTmFtZXModGhpcy5hc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkpOworCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IG5vbk51bGxUYWJsZU5hbWVzKEl0ZXJhdG9yPFRhYmxlPiB0YWJsZXMpIHsKKwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odGhpcy50YWJsZU5hbWVzKHRhYmxlcykpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBvKSB7CisJCQkJcmV0dXJuIG8gIT0gbnVsbDsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB0YWJsZU5hbWVzKEl0ZXJhdG9yPFRhYmxlPiB0YWJsZXMpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFRhYmxlLCBTdHJpbmc+KHRhYmxlcykgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShUYWJsZSB0KSB7CisJCQkJcmV0dXJuIHQuZ2V0TmFtZSgpOworCQkJfQorCQl9OworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb2YgRW50aXRpZXMsIGVhY2ggd2hpY2ggaW5oZXJpdHMgZnJvbSB0aGUgb25lIGJlZm9yZSwKKwkgKiBhbmQgdGVybWluYXRlcyBhdCB0aGUgcm9vdCBlbnRpdHkgKG9yIGF0IHRoZSBwb2ludCBvZiBjeWNsaWNpdHkpLgorCSAqLworCXByb3RlY3RlZCBJdGVyYXRvcjxUeXBlTWFwcGluZz4gYW5jZXN0b3JzKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGVyc2lzdGVudFR5cGUsIFR5cGVNYXBwaW5nPihnZXRQZXJzaXN0ZW50VHlwZSgpLmFuY2VzdG9ycygpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBUeXBlTWFwcGluZyB0cmFuc2Zvcm0oUGVyc2lzdGVudFR5cGUgdHlwZSkgeworCQkJCXJldHVybiB0eXBlLmdldE1hcHBpbmcoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKKwkJaWYgKCFpc1RhYmxlUGVyQ2xhc3MoKSkgeworCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29sdW1uIHJlc29sdmVPdmVycmlkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgb3ZlcnJpZGUgPSBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoYXR0cmlidXRlTmFtZSk7CisJCWlmIChvdmVycmlkZSAhPSBudWxsICYmICFvdmVycmlkZS5pc1ZpcnR1YWwoKSkgeworCQkJcmV0dXJuIG92ZXJyaWRlLmdldENvbHVtbigpOworCQl9CisJCXJldHVybiBzdXBlci5yZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKGF0dHJpYnV0ZU5hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVsYXRpb25zaGlwUmVmZXJlbmNlIHJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKwkJQXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZSA9IGdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlTmFtZWQoYXR0cmlidXRlTmFtZSk7CisJCWlmIChvdmVycmlkZSAhPSBudWxsICYmICFvdmVycmlkZS5pc1ZpcnR1YWwoKSkgeworCQkJcmV0dXJuIG92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOworCQl9CisJCXJldHVybiBzdXBlci5yZXNvbHZlUmVsYXRpb25zaGlwUmVmZXJlbmNlKGF0dHJpYnV0ZU5hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB7CisJCWlmICghaXNUYWJsZVBlckNsYXNzKCkpIHsKKwkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLm92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOworCX0KKwkKKwlwdWJsaWMgQXR0cmlidXRlTWFwcGluZyByZXNvbHZlQXR0cmlidXRlTWFwcGluZyhTdHJpbmcgbmFtZSkgeworCQlmb3IgKEF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmFsbEF0dHJpYnV0ZU1hcHBpbmdzKCkpKSB7CisJCQlBdHRyaWJ1dGVNYXBwaW5nIHJlc29sdmVkTWFwcGluZyA9IGF0dHJpYnV0ZU1hcHBpbmcucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcobmFtZSk7CisJCQlpZiAocmVzb2x2ZWRNYXBwaW5nICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzb2x2ZWRNYXBwaW5nOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgeworCQlzdXBlci51cGRhdGUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7CisJCQorCQl0aGlzLnNldFNwZWNpZmllZE5hbWVfKHRoaXMuZ2V0UmVzb3VyY2VOYW1lKCkpOworCQl0aGlzLnNldERlZmF1bHROYW1lKHRoaXMuZ2V0UmVzb3VyY2VEZWZhdWx0TmFtZSgpKTsKKwkJCisJCXRoaXMudXBkYXRlUm9vdEVudGl0eSgpOworCQl0aGlzLnVwZGF0ZUluaGVyaXRhbmNlKHRoaXMuZ2V0UmVzb3VyY2VJbmhlcml0YW5jZSgpKTsKKwkJdGhpcy51cGRhdGVEaXNjcmltaW5hdG9yQ29sdW1uKCk7CisJCXRoaXMudXBkYXRlRGlzY3JpbWluYXRvclZhbHVlKHRoaXMuZ2V0UmVzb3VyY2VEaXNjcmltaW5hdG9yVmFsdWUoKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkVGFibGVJc0FsbG93ZWQodGhpcy5idWlsZFNwZWNpZmllZFRhYmxlSXNBbGxvd2VkKCkpOworCQl0aGlzLnNldFRhYmxlSXNVbmRlZmluZWQodGhpcy5idWlsZFRhYmxlSXNVbmRlZmluZWQoKSk7CisJCXRoaXMudXBkYXRlVGFibGUoKTsKKwkJdGhpcy51cGRhdGVTZWNvbmRhcnlUYWJsZXMoKTsKKwkJdGhpcy5nZW5lcmF0b3JDb250YWluZXIudXBkYXRlKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOworCQl0aGlzLnF1ZXJ5Q29udGFpbmVyLnVwZGF0ZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKKwkJdGhpcy51cGRhdGVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkJdGhpcy51cGRhdGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKKwkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci51cGRhdGUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7CisJCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci51cGRhdGUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7CisJCXRoaXMudXBkYXRlSWRDbGFzcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwb3N0VXBkYXRlKCkgeworCQlzdXBlci5wb3N0VXBkYXRlKCk7CisJCXRoaXMucG9zdFVwZGF0ZURpc2NyaW1pbmF0b3JDb2x1bW4oKTsKKwkJdGhpcy5wb3N0VXBkYXRlRGlzY3JpbWluYXRvclZhbHVlKCk7CisJCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5wb3N0VXBkYXRlKCk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZU1hcHBpbmdBbm5vdGF0aW9uKCkuZ2V0TmFtZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlRGVmYXVsdE5hbWUoKSB7CisJCXJldHVybiB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYWJsZSgpIHsKKwkJZ2V0VGFibGUoKS51cGRhdGUodGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUluaGVyaXRhbmNlKEluaGVyaXRhbmNlQW5ub3RhdGlvbiBpbmhlcml0YW5jZVJlc291cmNlKSB7CisJCXRoaXMuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneV8odGhpcy5nZXRSZXNvdXJjZUluaGVyaXRhbmNlU3RyYXRlZ3koaW5oZXJpdGFuY2VSZXNvdXJjZSkpOworCQl0aGlzLnNldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KHRoaXMuYnVpbGREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZSBnZXRSZXNvdXJjZUluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VBbm5vdGF0aW9uIGluaGVyaXRhbmNlUmVzb3VyY2UpIHsKKwkJcmV0dXJuIEluaGVyaXRhbmNlVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwoaW5oZXJpdGFuY2VSZXNvdXJjZS5nZXRTdHJhdGVneSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZSBidWlsZERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5pc1Jvb3QoKSA/IEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUgOiB0aGlzLmdldFJvb3RFbnRpdHkoKS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJvb3RFbnRpdHkoKSB7CisJCS8vSSBhbSBtYWtpbmcgYW4gYXNzdW1wdGlvbiBoZXJlIHRoYXQgd2UgZG9uJ3QgbmVlZCBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZvciByb290RW50aXR5LCB0aGlzIG1pZ2h0IGJlIHdyb25nCisJCXRoaXMucm9vdEVudGl0eSA9IGNhbGN1bGF0ZVJvb3RFbnRpdHkoKTsKKwkJaWYgKHRoaXMucm9vdEVudGl0eSAhPSB0aGlzKSB7CisJCQl0aGlzLnJvb3RFbnRpdHkuYWRkU3ViRW50aXR5KHRoaXMpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBFbnRpdHkgY2FsY3VsYXRlUm9vdEVudGl0eSgpIHsKKwkJRW50aXR5IHJvb3QgPSB0aGlzOworCQlmb3IgKEl0ZXJhdG9yPFR5cGVNYXBwaW5nPiBzdHJlYW0gPSBpbmhlcml0YW5jZUhpZXJhcmNoeSgpOyBzdHJlYW0uaGFzTmV4dCgpOykgeworCQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSBzdHJlYW0ubmV4dCgpOworCQkJaWYgKHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5KSB7CisJCQkJcm9vdCA9IChFbnRpdHkpIHR5cGVNYXBwaW5nOworCQkJfQorCQl9CisJCXJldHVybiByb290OworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRTdWJFbnRpdHkoRW50aXR5IHN1YkVudGl0eSkgeworCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hZGRSb290V2l0aFN1YkVudGl0aWVzKGdldE5hbWUoKSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURpc2NyaW1pbmF0b3JDb2x1bW4oKSB7CisJCXRoaXMuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCh0aGlzLmJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpKTsKKwkJZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnVwZGF0ZSh0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcG9zdFVwZGF0ZURpc2NyaW1pbmF0b3JDb2x1bW4oKSB7CisJCXRoaXMuc2V0RGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkKHRoaXMuYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKSk7CisJCXRoaXMuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnBvc3RVcGRhdGUoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGlzY3JpbWluYXRvclZhbHVlKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24gZGlzY3JpbWluYXRvclZhbHVlUmVzb3VyY2UpIHsKKwkJdGhpcy5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQodGhpcy5idWlsZFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCgpKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVfKGRpc2NyaW1pbmF0b3JWYWx1ZVJlc291cmNlLmdldFZhbHVlKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBwb3N0VXBkYXRlRGlzY3JpbWluYXRvclZhbHVlKCkgeworCQl0aGlzLnNldERpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKHRoaXMuYnVpbGREaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKKwkJdGhpcy5zZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKHRoaXMuYnVpbGREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOworCX0KKwkKKwkvKioKKwkgKiBGcm9tIHRoZSBTcGVjOgorCSAqIElmIHRoZSBEaXNjcmltaW5hdG9yVmFsdWUgYW5ub3RhdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhCisJICogcHJvdmlkZXItc3BlY2lmaWMgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSB2YWx1ZSByZXByZXNlbnRpbmcKKwkgKiB0aGUgZW50aXR5IHR5cGUgaXMgdXNlZCBmb3IgdGhlIHZhbHVlIG9mIHRoZSBkaXNjcmltaW5hdG9yCisJICogY29sdW1uLiBJZiB0aGUgRGlzY3JpbWluYXRvclR5cGUgaXMgU1RSSU5HLCB0aGUgZGlzY3JpbWluYXRvcgorCSAqIHZhbHVlIGRlZmF1bHQgaXMgdGhlIGVudGl0eSBuYW1lLgorCSAqIAorCSAqIFRPRE8gZXh0ZW5zaW9uIHBvaW50IGZvciBwcm92aWRlci1zcGVjaWZpYyBmdW5jdGlvbj8KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKKwkJaWYgKGRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmICh0aGlzLmdldERpc2NyaW1pbmF0b3JUeXBlKCkgIT0gRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gdGhpcy5nZXROYW1lKCk7CisJfQorCisJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGdldERpc2NyaW1pbmF0b3JUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQoKSB7CisJCXJldHVybiAhaXNUYWJsZVBlckNsYXNzKCkgJiYgIWlzQWJzdHJhY3QoKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGREaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpIHsKKwkJcmV0dXJuIGlzVGFibGVQZXJDbGFzcygpIHx8IGlzQWJzdHJhY3QoKSB8fCBpc1Jvb3ROb0Rlc2NlbmRhbnRzTm9TdHJhdGVneURlZmluZWQoKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKCkgeworCQlyZXR1cm4gIWlzVGFibGVQZXJDbGFzcygpICYmIGlzUm9vdCgpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZCgpIHsKKwkJcmV0dXJuIGlzVGFibGVQZXJDbGFzcygpIHx8IGlzUm9vdE5vRGVzY2VuZGFudHNOb1N0cmF0ZWd5RGVmaW5lZCgpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFNwZWNpZmllZFRhYmxlSXNBbGxvd2VkKCkgeworCQlyZXR1cm4gIWlzQWJzdHJhY3RUYWJsZVBlckNsYXNzKCkgJiYgIWlzU2luZ2xlVGFibGVEZXNjZW5kYW50KCk7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkVGFibGVJc1VuZGVmaW5lZCgpIHsKKwkJcmV0dXJuIGlzQWJzdHJhY3RUYWJsZVBlckNsYXNzKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlY29uZGFyeVRhYmxlcygpIHsKKwkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gcmVzb3VyY2VTZWNvbmRhcnlUYWJsZXMgPSAKKwkJCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFubm90YXRpb25zKAorCQkJCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQl3aGlsZSAoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSkgeworCQkJSmF2YVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5leHQoKTsKKwkJCWlmIChyZXNvdXJjZVNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKKwkJCQlzZWNvbmRhcnlUYWJsZS51cGRhdGUoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VTZWNvbmRhcnlUYWJsZXMubmV4dCgpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlXyhzZWNvbmRhcnlUYWJsZSk7CisJCQl9CisJCX0KKwkJCisJCXdoaWxlIChyZXNvdXJjZVNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKKwkJCWFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGJ1aWxkU2Vjb25kYXJ5VGFibGUoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VTZWNvbmRhcnlUYWJsZXMubmV4dCgpKSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgSmF2YVNlY29uZGFyeVRhYmxlIGJ1aWxkU2Vjb25kYXJ5VGFibGUoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UpIHsKKwkJSmF2YVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVNlY29uZGFyeVRhYmxlKHRoaXMpOworCQlzZWNvbmRhcnlUYWJsZS5pbml0aWFsaXplKHNlY29uZGFyeVRhYmxlUmVzb3VyY2UpOworCQlyZXR1cm4gc2Vjb25kYXJ5VGFibGU7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKKwkJTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gcmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSAKKwkJCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFubm90YXRpb25zKAorCQkJCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCAKKwkJCQkJUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJd2hpbGUgKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKKwkJCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCk7CisJCQlpZiAocmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7CisJCQkJcHJpbWFyeUtleUpvaW5Db2x1bW4udXBkYXRlKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbl8ocHJpbWFyeUtleUpvaW5Db2x1bW4pOworCQkJfQorCQl9CisJCQorCQl3aGlsZSAocmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7CisJCQlhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSkpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZSkgeworCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcywgYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCkpOworCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbi5pbml0aWFsaXplKHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UpOworCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW47CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgeworCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpIHsKKwkJCXNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihudWxsKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgPT0gbnVsbCkgeworCQkJdGhpcy5zZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihuZXcgTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbih0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSkpOworCQl9CisJCWVsc2UgeworCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4udXBkYXRlKG5ldyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUlkQ2xhc3MoICkgeworCQlJZENsYXNzQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0UmVzb3VyY2VJZENsYXNzKCk7CisJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKKwkJCXNldElkQ2xhc3NfKGFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCX0KKwkJZWxzZSB7CisJCQlzZXRJZENsYXNzXyhudWxsKTsKKwkJfQorCX0KKworCisJLy8qKioqKioqKioqKioqKioqKioqKiBDb2RlIENvbXBsZXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXJlc3VsdCA9IHRoaXMuZ2V0VGFibGUoKS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlmb3IgKEphdmFTZWNvbmRhcnlUYWJsZSBzVGFibGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5zZWNvbmRhcnlUYWJsZXMoKSkpIHsKKwkJCXJlc3VsdCA9IHNUYWJsZS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCWZvciAoSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucygpKSkgeworCQkJcmVzdWx0ID0gY29sdW1uLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmVzdWx0ID0gdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXJlc3VsdCA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXJlc3VsdCA9IHRoaXMuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXJlc3VsdCA9IHRoaXMuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCQorCS8vKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJCisJCXRoaXMudmFsaWRhdGVUYWJsZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLnZhbGlkYXRlSWQobWVzc2FnZXMsIGFzdFJvb3QpOworCQl0aGlzLnZhbGlkYXRlSW5oZXJpdGFuY2UobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLmdldFF1ZXJ5Q29udGFpbmVyKCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCQorCQlmb3IgKEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc3RyZWFtID0gdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKKwkJCXN0cmVhbS5uZXh0KCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVRhYmxlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCWlmIChpc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpKSB7CisJCQlpZiAodGhpcy50YWJsZS5pc1Jlc291cmNlU3BlY2lmaWVkKCkpIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfQUJTVFJBQ1RfVEFCTEVfUEVSX0NMQVNTX0RFRklORVNfVEFCTEUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKKwkJCQkJCXRoaXMsCisJCQkJCQl0aGlzLmdldFRhYmxlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQorCQkJCQkpCisJCQkJKTsKKwkJCX0JCQkKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoaXNTaW5nbGVUYWJsZURlc2NlbmRhbnQoKSkgeworCQkJaWYgKHRoaXMudGFibGUuaXNSZXNvdXJjZVNwZWNpZmllZCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1NJTkdMRV9UQUJMRV9ERVNDRU5EQU5UX0RFRklORVNfVEFCTEUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKKwkJCQkJCXRoaXMsCisJCQkJCQl0aGlzLmdldFRhYmxlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQorCQkJCQkpCisJCQkJKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQl0aGlzLnRhYmxlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSWQoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCWlmICh0aGlzLmhhc05vSWRNYXBwaW5nKCkpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9OT19JRCwKKwkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCisJCQkJCXRoaXMsCisJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQorCQkJCSkKKwkJCSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVJbmhlcml0YW5jZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl2YWxpZGF0ZUluaGVyaXRhbmNlU3RyYXRlZ3kobWVzc2FnZXMsIGFzdFJvb3QpOworCQl2YWxpZGF0ZURpc2NyaW1pbmF0b3JDb2x1bW4obWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdmFsaWRhdGVEaXNjcmltaW5hdG9yVmFsdWUobWVzc2FnZXMsIGFzdFJvb3QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZURpc2NyaW1pbmF0b3JDb2x1bW4oTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJaWYgKHNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSAmJiAhZGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkKCkpIHsKKwkJCWdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl9CisJCWVsc2UgaWYgKGdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5pc1Jlc291cmNlU3BlY2lmaWVkKCkpIHsKKwkJCWlmICghaXNSb290KCkpIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTk9OX1JPT1RfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRCwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAorCQkJCQkJdGhpcywKKwkJCQkJCXRoaXMuZ2V0RGlzY3JpbWluYXRvckNvbHVtblRleHRSYW5nZShhc3RSb290KQorCQkJCQkpCisJCQkJKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGlzVGFibGVQZXJDbGFzcygpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVELAorCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCisJCQkJCQl0aGlzLAorCQkJCQkJdGhpcy5nZXREaXNjcmltaW5hdG9yQ29sdW1uVGV4dFJhbmdlKGFzdFJvb3QpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRGlzY3JpbWluYXRvclZhbHVlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlpZiAoZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSAmJiBnZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSAhPSBudWxsKSB7CisJCQlpZiAoaXNBYnN0cmFjdCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfQUJTVFJBQ1RfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVELAorCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCisJCQkJCQl0aGlzLAorCQkJCQkJdGhpcy5nZXREaXNjcmltaW5hdG9yVmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJKQorCQkJCSk7CisJCQl9CisJCQllbHNlIGlmIChpc1RhYmxlUGVyQ2xhc3MoKSkgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKKwkJCQkJCXRoaXMsCisJCQkJCQl0aGlzLmdldERpc2NyaW1pbmF0b3JWYWx1ZVRleHRSYW5nZShhc3RSb290KQorCQkJCQkpCisJCQkJKTsJCQkJCisJCQl9CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVJbmhlcml0YW5jZVN0cmF0ZWd5KExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlTdXBwb3J0ZWQgdGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCA9IGdldEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkuZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpOworCQlpZiAodGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCA9PSBTdXBwb3J0ZWQuWUVTKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKChnZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgPT0gSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykgJiYgaXNSb290KCkpIHsKKwkJCWlmICh0YWJsZVBlckNvbmNyZXRlQ2xhc3NJbmhlcml0YW5jZUlzU3VwcG9ydGVkID09IFN1cHBvcnRlZC5OTykgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfTk9UX1NVUFBPUlRFRF9PTl9QTEFURk9STSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAorCQkJCQkJdGhpcywKKwkJCQkJCXRoaXMuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneVRleHRSYW5nZShhc3RSb290KQorCQkJCQkpCisJCQkJKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfUE9SVEFCTEVfT05fUExBVEZPUk0sCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKKwkJCQkJCXRoaXMsCisJCQkJCQl0aGlzLmdldEluaGVyaXRhbmNlU3RyYXRlZ3lUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJKQorCQkJCSk7CisJCQl9CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIFRleHRSYW5nZSBnZXREaXNjcmltaW5hdG9yVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIGdldFJlc291cmNlRGlzY3JpbWluYXRvclZhbHVlKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKwkKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldERpc2NyaW1pbmF0b3JDb2x1bW5UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIGdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKwkKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEluaGVyaXRhbmNlU3RyYXRlZ3lUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIGdldFJlc291cmNlSW5oZXJpdGFuY2UoKS5nZXRTdHJhdGVneVRleHRSYW5nZShhc3RSb290KTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0lkTWFwcGluZygpIHsKKwkJcmV0dXJuICEgdGhpcy5oYXNJZE1hcHBpbmcoKTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNJZE1hcHBpbmcoKSB7CisJCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJaWYgKHN0cmVhbS5uZXh0KCkuaXNJZEF0dHJpYnV0ZSgpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIGFzc29jaWF0aW9uIG92ZXJyaWRlIGNvbnRhaW5lciBvd25lciAqKioqKioqKioqCisKKwljbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyT3duZXIgaW1wbGVtZW50cyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyIHsKKwkJCisJCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCkgeworCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS50aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKKwkJfQorCQkKKwkJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgeworCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS50aGlzLmdldFR5cGVNYXBwaW5nKCk7CisJCX0KKworCQlwdWJsaWMgUmVsYXRpb25zaGlwUmVmZXJlbmNlIHJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoU3RyaW5nIGFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lKSB7CisJCQlUeXBlTWFwcGluZyBvdmVycmlkYWJsZVR5cGVNYXBwaW5nID0gZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpOworCQkJaWYgKG92ZXJyaWRhYmxlVHlwZU1hcHBpbmcgIT0gbnVsbCkgeworCQkJCWZvciAoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3ZlcnJpZGFibGVUeXBlTWFwcGluZy5pbmhlcml0YW5jZUhpZXJhcmNoeSgpKSkgeworCQkJCQlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcmVsYXRpb25zaGlwUmVmZXJlbmNlID0gdHlwZU1hcHBpbmcucmVzb2x2ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShhc3NvY2lhdGlvbk92ZXJyaWRlTmFtZSk7CisJCQkJCWlmIChyZWxhdGlvbnNoaXBSZWZlcmVuY2UgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCQorCS8vKioqKioqKioqKiBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioJCisJCisJY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lciBpbXBsZW1lbnRzIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLk93bmVyIHsKKwkJcHVibGljIFR5cGVNYXBwaW5nIGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gQWJzdHJhY3RKYXZhRW50aXR5LnRoaXMuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpOworCQl9CisJCQorCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gQWJzdHJhY3RKYXZhRW50aXR5LnRoaXMuZ2V0VHlwZU1hcHBpbmcoKTsKKwkJfQorCisJCXB1YmxpYyBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlT3ZlcnJpZGVOYW1lKSB7CisJCQlUeXBlTWFwcGluZyBvdmVycmlkYWJsZVR5cGVNYXBwaW5nID0gZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpOworCQkJaWYgKG92ZXJyaWRhYmxlVHlwZU1hcHBpbmcgIT0gbnVsbCkgeworCQkJCWZvciAoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3ZlcnJpZGFibGVUeXBlTWFwcGluZy5pbmhlcml0YW5jZUhpZXJhcmNoeSgpKSkgeworCQkJCQlDb2x1bW4gY29sdW1uID0gdHlwZU1hcHBpbmcucmVzb2x2ZU92ZXJyaWRlbkNvbHVtbihhdHRyaWJ1dGVPdmVycmlkZU5hbWUpOworCQkJCQlpZiAoY29sdW1uICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiBjb2x1bW47CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHBrIGpvaW4gY29sdW1uIG93bmVyICoqKioqKioqKioKKworCWNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIgaW1wbGVtZW50cyBKYXZhQmFzZUpvaW5Db2x1bW4uT3duZXIKKwl7CisJCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CisJCX0KKworCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gQWJzdHJhY3RKYXZhRW50aXR5LnRoaXM7CisJCX0KKworCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgeworCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS50aGlzLmdldERiVGFibGUodGFibGVOYW1lKTsKKwkJfQorCisJCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7CisJCQlFbnRpdHkgcGFyZW50RW50aXR5ID0gQWJzdHJhY3RKYXZhRW50aXR5LnRoaXMuZ2V0UGFyZW50RW50aXR5KCk7CisJCQlyZXR1cm4gKHBhcmVudEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiBwYXJlbnRFbnRpdHkuZ2V0UHJpbWFyeURiVGFibGUoKTsKKwkJfQorCisJCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgeworCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS50aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKKwkJfQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJCXJldHVybiBBYnN0cmFjdEphdmFFbnRpdHkudGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPT0gam9pbkNvbHVtbjsKKwkJfQorCQkKKwkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKKwkJCWlmIChqb2luQ29sdW1uc1NpemUoKSAhPSAxKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlFbnRpdHkgcGFyZW50RW50aXR5ID0gQWJzdHJhY3RKYXZhRW50aXR5LnRoaXMuZ2V0UGFyZW50RW50aXR5KCk7CisJCQlyZXR1cm4gKHBhcmVudEVudGl0eSA9PSBudWxsKSA/IGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkgOiBwYXJlbnRFbnRpdHkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKKwkJfQorCX0KKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUdlbmVyYXRvci5qYXZhCmluZGV4IGU5YWNjMDQuLjFiN2FjYjQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhR2VuZXJhdG9yLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFHZW5lcmF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xNSw5ICsxNSwxNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0b3JBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKIAotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUgCisvKioKKyAqIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhR2VuZXJhdG9yCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZSAKIAlpbXBsZW1lbnRzIEphdmFHZW5lcmF0b3IKIHsKIAlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CkBAIC0yNiwxMjMgKzMzLDE3NyBAQAogCQogCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZEFsbG9jYXRpb25TaXplOwogCi0JcHJvdGVjdGVkIEdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yUmVzb3VyY2U7CisJcHJvdGVjdGVkIEdlbmVyYXRvckFubm90YXRpb24gcmVzb3VyY2VHZW5lcmF0b3I7CiAJCisKIAlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhR2VuZXJhdG9yKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKIAkJc3VwZXIocGFyZW50KTsKIAl9CiAKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKEdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJdGhpcy5nZW5lcmF0b3JSZXNvdXJjZSA9IGdlbmVyYXRvclJlc291cmNlOwotCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUoZ2VuZXJhdG9yUmVzb3VyY2UpOwotCQl0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZSA9IHRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlKGdlbmVyYXRvclJlc291cmNlKTsKLQkJdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSA9IHRoaXMuc3BlY2lmaWVkQWxsb2NhdGlvblNpemUoZ2VuZXJhdG9yUmVzb3VyY2UpOworCXByb3RlY3RlZCBHZW5lcmF0b3JBbm5vdGF0aW9uIGdldFJlc291cmNlR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUdlbmVyYXRvcjsKIAl9Ci0JCi0JcHJvdGVjdGVkIEdlbmVyYXRvckFubm90YXRpb24gZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvclJlc291cmNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUoR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3JSZXNvdXJjZSkgewotCQlyZXR1cm4gZ2VuZXJhdG9yUmVzb3VyY2UuZ2V0TmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRJbml0aWFsVmFsdWUoR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3JSZXNvdXJjZSkgewotCQlyZXR1cm4gZ2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZEFsbG9jYXRpb25TaXplKEdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGdlbmVyYXRvclJlc291cmNlLmdldEFsbG9jYXRpb25TaXplKCk7Ci0JfQotCQorCisKKwkvLyAqKioqKioqKioqIG5hbWUgKioqKioqKioqKgorCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogCQlyZXR1cm4gdGhpcy5uYW1lOwogCX0KIAotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuc2V0TmFtZShuZXdOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChHZW5lcmF0b3IuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7CisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLnJlc291cmNlR2VuZXJhdG9yLnNldE5hbWUobmFtZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChHZW5lcmF0b3IuTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChHZW5lcmF0b3IuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7CisJcHJvdGVjdGVkIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEdlbmVyYXRvci5OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwogCX0KIAotCXB1YmxpYyBJbnRlZ2VyIGdldEluaXRpYWxWYWx1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkgOiB0aGlzLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpOworCisJLy8gKioqKioqKioqKiBpbml0aWFsIHZhbHVlICoqKioqKioqKioKKworCXB1YmxpYyBpbnQgZ2V0SW5pdGlhbFZhbHVlKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWUuaW50VmFsdWUoKSA6IHRoaXMuZ2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpOwogCX0KIAogCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpIHsKIAkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlOwogCX0KIAotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShJbnRlZ2VyIG5ld1NwZWNpZmllZEluaXRpYWxWYWx1ZSkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZEluaXRpYWxWYWx1ZSA9IHRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlOwotCQl0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZSA9IG5ld1NwZWNpZmllZEluaXRpYWxWYWx1ZTsKLQkJZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5zZXRJbml0aWFsVmFsdWUobmV3U3BlY2lmaWVkSW5pdGlhbFZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChHZW5lcmF0b3IuU1BFQ0lGSUVEX0lOSVRJQUxfVkFMVUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZEluaXRpYWxWYWx1ZSwgbmV3U3BlY2lmaWVkSW5pdGlhbFZhbHVlKTsKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlciBzcGVjaWZpZWRJbml0aWFsVmFsdWUpIHsKKwkJSW50ZWdlciBvbGQgPSB0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZTsKKwkJdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWUgPSBzcGVjaWZpZWRJbml0aWFsVmFsdWU7CisJCXRoaXMucmVzb3VyY2VHZW5lcmF0b3Iuc2V0SW5pdGlhbFZhbHVlKHNwZWNpZmllZEluaXRpYWxWYWx1ZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChHZW5lcmF0b3IuU1BFQ0lGSUVEX0lOSVRJQUxfVkFMVUVfUFJPUEVSVFksIG9sZCwgc3BlY2lmaWVkSW5pdGlhbFZhbHVlKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRJbml0aWFsVmFsdWVfKEludGVnZXIgbmV3U3BlY2lmaWVkSW5pdGlhbFZhbHVlKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkSW5pdGlhbFZhbHVlID0gdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWU7Ci0JCXRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlID0gbmV3U3BlY2lmaWVkSW5pdGlhbFZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdlbmVyYXRvci5TUEVDSUZJRURfSU5JVElBTF9WQUxVRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkSW5pdGlhbFZhbHVlLCBuZXdTcGVjaWZpZWRJbml0aWFsVmFsdWUpOworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEluaXRpYWxWYWx1ZV8oSW50ZWdlciBzcGVjaWZpZWRJbml0aWFsVmFsdWUpIHsKKwkJSW50ZWdlciBvbGQgPSB0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZTsKKwkJdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWUgPSBzcGVjaWZpZWRJbml0aWFsVmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChHZW5lcmF0b3IuU1BFQ0lGSUVEX0lOSVRJQUxfVkFMVUVfUFJPUEVSVFksIG9sZCwgc3BlY2lmaWVkSW5pdGlhbFZhbHVlKTsKIAl9CiAKLQlwdWJsaWMgSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpOworCisJLy8gKioqKioqKioqKiBhbGxvY2F0aW9uIHNpemUgKioqKioqKioqKgorCisJcHVibGljIGludCBnZXRBbGxvY2F0aW9uU2l6ZSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZS5pbnRWYWx1ZSgpIDogdGhpcy5nZXREZWZhdWx0QWxsb2NhdGlvblNpemUoKTsKIAl9CiAKIAlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHsKIAkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWxsb2NhdGlvblNpemU7CiAJfQogCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoSW50ZWdlciBuZXdTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZEFsbG9jYXRpb25TaXplID0gdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZTsKLQkJdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSA9IG5ld1NwZWNpZmllZEFsbG9jYXRpb25TaXplOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldEFsbG9jYXRpb25TaXplKG5ld1NwZWNpZmllZEFsbG9jYXRpb25TaXplKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChHZW5lcmF0b3IuU1BFQ0lGSUVEX0FMTE9DQVRJT05fU0laRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQWxsb2NhdGlvblNpemUsIG5ld1NwZWNpZmllZEFsbG9jYXRpb25TaXplKTsKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyIHNwZWNpZmllZEFsbG9jYXRpb25TaXplKSB7CisJCUludGVnZXIgb2xkID0gdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZTsKKwkJdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSA9IHNwZWNpZmllZEFsbG9jYXRpb25TaXplOworCQl0aGlzLnJlc291cmNlR2VuZXJhdG9yLnNldEFsbG9jYXRpb25TaXplKHNwZWNpZmllZEFsbG9jYXRpb25TaXplKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEdlbmVyYXRvci5TUEVDSUZJRURfQUxMT0NBVElPTl9TSVpFX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZEFsbG9jYXRpb25TaXplKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZV8oSW50ZWdlciBuZXdTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZEFsbG9jYXRpb25TaXplID0gdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZTsKLQkJdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSA9IG5ld1NwZWNpZmllZEFsbG9jYXRpb25TaXplOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdlbmVyYXRvci5TUEVDSUZJRURfQUxMT0NBVElPTl9TSVpFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSwgbmV3U3BlY2lmaWVkQWxsb2NhdGlvblNpemUpOworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplXyhJbnRlZ2VyIHNwZWNpZmllZEFsbG9jYXRpb25TaXplKSB7CisJCUludGVnZXIgb2xkID0gdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZTsKKwkJdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSA9IHNwZWNpZmllZEFsbG9jYXRpb25TaXplOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoR2VuZXJhdG9yLlNQRUNJRklFRF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFksIG9sZCwgc3BlY2lmaWVkQWxsb2NhdGlvblNpemUpOwogCX0KIAotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpIHsKKwlwdWJsaWMgaW50IGdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpIHsKIAkJcmV0dXJuIEdlbmVyYXRvci5ERUZBVUxUX0FMTE9DQVRJT05fU0laRTsKIAl9CiAKLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCisKKwkvLyAqKioqKioqKioqIHRleHQgcmFuZ2VzICoqKioqKioqKioKKwogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewogCQlyZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CiAJfQogCiAJcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yUmVzb3VyY2UuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUdlbmVyYXRvci5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7CiAJfQogCQogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3JSZXNvdXJjZS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUdlbmVyYXRvci5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShHZW5lcmF0b3JBbm5vdGF0aW9uIGdlbmVyYXRvclJlc291cmNlKSB7Ci0JCXRoaXMuZ2VuZXJhdG9yUmVzb3VyY2UgPSBnZW5lcmF0b3JSZXNvdXJjZTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLm5hbWUoZ2VuZXJhdG9yUmVzb3VyY2UpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWVfKHRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlKGdlbmVyYXRvclJlc291cmNlKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemVfKHRoaXMuc3BlY2lmaWVkQWxsb2NhdGlvblNpemUoZ2VuZXJhdG9yUmVzb3VyY2UpKTsKKworCS8vICoqKioqKioqKiogcmVzb3VyY2UgPT4gY29udGV4dCAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yQW5ub3RhdGlvbikgeworCQl0aGlzLnJlc291cmNlR2VuZXJhdG9yID0gZ2VuZXJhdG9yQW5ub3RhdGlvbjsKKwkJdGhpcy5uYW1lID0gZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXROYW1lKCk7CisJCXRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlID0gIGdlbmVyYXRvckFubm90YXRpb24uZ2V0SW5pdGlhbFZhbHVlKCk7CisJCXRoaXMuc3BlY2lmaWVkQWxsb2NhdGlvblNpemUgPSBnZW5lcmF0b3JBbm5vdGF0aW9uLmdldEFsbG9jYXRpb25TaXplKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShHZW5lcmF0b3JBbm5vdGF0aW9uIGdlbmVyYXRvckFubm90YXRpb24pIHsKKwkJdGhpcy5yZXNvdXJjZUdlbmVyYXRvciA9IGdlbmVyYXRvckFubm90YXRpb247CisJCXRoaXMuc2V0TmFtZV8oZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXROYW1lKCkpOworCQl0aGlzLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZV8oZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRJbml0aWFsVmFsdWUoKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemVfKGdlbmVyYXRvckFubm90YXRpb24uZ2V0QWxsb2NhdGlvblNpemUoKSk7CisJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZEdlbmVyYXRvcih0aGlzKTsKKwl9CisJCisKKwkvLyAqKioqKioqKioqIGRhdGFiYXNlIHN0dWZmICoqKioqKioqKioKKworCXB1YmxpYyBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7CisJCVNjaGVtYUNvbnRhaW5lciBkYlNjaGVtYUNvbnRhaW5lciA9IHRoaXMuZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKKwkJcmV0dXJuIChkYlNjaGVtYUNvbnRhaW5lciA9PSBudWxsKSA/IG51bGwgOiBkYlNjaGVtYUNvbnRhaW5lci5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHRoaXMuZ2V0U2NoZW1hKCkpOworCX0KKworCS8qKgorCSAqIElmIHdlIGRvbid0IGhhdmUgYSBjYXRhbG9nIChpLmUuIHdlIGRvbid0IGV2ZW4gaGF2ZSBhIDxlbT5kZWZhdWx0PC9lbT4gY2F0YWxvZyksCisJICogdGhlbiB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9nczsgYW5kIHdlIG5lZWQgdG8KKwkgKiBnZXQgdGhlIHNjaGVtYSBkaXJlY3RseSBmcm9tIHRoZSBkYXRhYmFzZS4KKwkgKi8KKwlwdWJsaWMgU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyKCkgeworCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygpOworCQlyZXR1cm4gKGNhdGFsb2cgIT0gbnVsbCkgPyB0aGlzLmdldERiQ2F0YWxvZyhjYXRhbG9nKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFNjaGVtYSgpOworCisJLyoqCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPgorCSAqIGNhdGFsb2cpLCB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgorCSAqLworCXB1YmxpYyBDYXRhbG9nIGdldERiQ2F0YWxvZygpIHsKKwkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2coKTsKKwkJcmV0dXJuIChjYXRhbG9nID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0RGJDYXRhbG9nKGNhdGFsb2cpOworCX0KKworCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2F0YWxvZygpOworCisKKwkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgorCisJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgeworCQlyZXR1cm4gZmFsc2U7CiAJfQogCQogCXB1YmxpYyBib29sZWFuIG92ZXJyaWRlcyhHZW5lcmF0b3IgZ2VuZXJhdG9yKSB7CiAJCS8vIGphdmEgaXMgYXQgdGhlIGJhc2Ugb2YgdGhlIHRyZWUKIAkJcmV0dXJuIGZhbHNlOwogCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBkdXBsaWNhdGVzKEdlbmVyYXRvciBvdGhlcikgeworCQlyZXR1cm4gKHRoaXMgIT0gb3RoZXIpCisJCQkJJiYgISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMubmFtZSkKKwkJCQkmJiB0aGlzLm5hbWUuZXF1YWxzKG90aGVyLmdldE5hbWUoKSkKKwkJCQkmJiAhIHRoaXMub3ZlcnJpZGVzKG90aGVyKQorCQkJCSYmICEgb3RoZXIub3ZlcnJpZGVzKHRoaXMpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXN1cGVyLnRvU3RyaW5nKHNiKTsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUlkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFJZE1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzcyNWQwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFJZE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDM4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhR2VuZXJhdGVkVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0b3JDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFJZE1hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8SWRBbm5vdGF0aW9uPgorCWltcGxlbWVudHMgSmF2YUlkTWFwcGluZworeworCXByb3RlY3RlZCBmaW5hbCBKYXZhQ29sdW1uIGNvbHVtbjsKKworCXByb3RlY3RlZCBKYXZhR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWU7CisKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUdlbmVyYXRvckNvbnRhaW5lciBnZW5lcmF0b3JDb250YWluZXI7CisKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUNvbnZlcnRlciBkZWZhdWx0Q29udmVydGVyOworCQorCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIHNwZWNpZmllZENvbnZlcnRlcjsKKwkKKwkKKwlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhSWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmNvbHVtbiA9IHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUNvbHVtbih0aGlzLCB0aGlzKTsKKwkJdGhpcy5kZWZhdWx0Q29udmVydGVyID0gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhTnVsbENvbnZlcnRlcih0aGlzKTsKKwkJdGhpcy5nZW5lcmF0b3JDb250YWluZXIgPSB0aGlzLmJ1aWxkR2VuZXJhdG9yQ29udGFpbmVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZSgpOworCQl0aGlzLmNvbHVtbi5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKSk7CisJCXRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyLmluaXRpYWxpemUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCXRoaXMuaW5pdGlhbGl6ZUdlbmVyYXRlZFZhbHVlKCk7CisJCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyID0gdGhpcy5idWlsZFNwZWNpZmllZENvbnZlcnRlcih0aGlzLmdldFJlc291cmNlQ29udmVydGVyVHlwZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhdGVkVmFsdWUoKSB7CisJCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiByZXNvdXJjZUdlbmVyYXRlZFZhbHVlID0gdGhpcy5nZXRSZXNvdXJjZUdlbmVyYXRlZFZhbHVlKCk7CisJCWlmIChyZXNvdXJjZUdlbmVyYXRlZFZhbHVlICE9IG51bGwpIHsKKwkJCXRoaXMuZ2VuZXJhdGVkVmFsdWUgPSB0aGlzLmJ1aWxkR2VuZXJhdGVkVmFsdWUocmVzb3VyY2VHZW5lcmF0ZWRWYWx1ZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXRSZXNvdXJjZUNvbHVtbigpIHsKKwkJcmV0dXJuIChDb2x1bW5Bbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLgorCQkJCWdldE5vbk51bGxBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwl9CisKKwlwcml2YXRlIEphdmFHZW5lcmF0b3JDb250YWluZXIgYnVpbGRHZW5lcmF0b3JDb250YWluZXIoKSB7CisJCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFHZW5lcmF0b3JDb250YWluZXIodGhpcyk7CisJfQorCisJLy8qKioqKioqKioqKioqKiBKYXZhQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nW10gYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgeworCQlyZXR1cm4gQXJyYXlUb29scy5hZGRBbGwoCisJCQlzdXBlci5idWlsZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKKwkJCUpQQS5DT0xVTU4sCisJCQlKUEEuR0VORVJBVEVEX1ZBTFVFLAorCQkJSlBBLlRFTVBPUkFMLAorCQkJSlBBLlRBQkxFX0dFTkVSQVRPUiwKKwkJCUpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gZ2V0TmFtZSgpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7CisJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlUYWJsZU5hbWUoKTsKKwl9CisKKwkvLyoqKioqKioqKioqKioqIElkTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgSmF2YUNvbHVtbiBnZXRDb2x1bW4oKSB7CisJCXJldHVybiB0aGlzLmNvbHVtbjsKKwl9CisJCisJcHVibGljIEphdmFHZW5lcmF0ZWRWYWx1ZSBhZGRHZW5lcmF0ZWRWYWx1ZSgpIHsKKwkJaWYgKGdldEdlbmVyYXRlZFZhbHVlKCkgIT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2VtZXJhdGVkVmFsdWUgYWxyZWFkeSBleGlzdHMiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXRoaXMuZ2VuZXJhdGVkVmFsdWUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhR2VuZXJhdGVkVmFsdWUodGhpcyk7CisJCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gCisJCQkJKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuCisJCQkJCWFkZEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCXRoaXMuZ2VuZXJhdGVkVmFsdWUuaW5pdGlhbGl6ZShnZW5lcmF0ZWRWYWx1ZVJlc291cmNlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChHRU5FUkFURURfVkFMVUVfUFJPUEVSVFksIG51bGwsIHRoaXMuZ2VuZXJhdGVkVmFsdWUpOworCQlyZXR1cm4gdGhpcy5nZW5lcmF0ZWRWYWx1ZTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlR2VuZXJhdGVkVmFsdWUoKSB7CisJCWlmIChnZXRHZW5lcmF0ZWRWYWx1ZSgpID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdlbWVyYXRlZFZhbHVlIGRvZXMgbm90IGV4aXN0LCBjYW5ub3QgYmUgcmVtb3ZlZCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJSmF2YUdlbmVyYXRlZFZhbHVlIG9sZEdlbmVyYXRlZFZhbHVlID0gdGhpcy5nZW5lcmF0ZWRWYWx1ZTsKKwkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IG51bGw7CisJCWdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZLCBvbGRHZW5lcmF0ZWRWYWx1ZSwgbnVsbCk7CisJfQorCQorCXB1YmxpYyBKYXZhR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmdlbmVyYXRlZFZhbHVlOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRHZW5lcmF0ZWRWYWx1ZShKYXZhR2VuZXJhdGVkVmFsdWUgbmV3R2VuZXJhdGVkVmFsdWUpIHsKKwkJSmF2YUdlbmVyYXRlZFZhbHVlIG9sZEdlbmVyYXRlZFZhbHVlID0gdGhpcy5nZW5lcmF0ZWRWYWx1ZTsKKwkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IG5ld0dlbmVyYXRlZFZhbHVlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSwgb2xkR2VuZXJhdGVkVmFsdWUsIG5ld0dlbmVyYXRlZFZhbHVlKTsKKwl9CisJCisJcHVibGljIEphdmFHZW5lcmF0b3JDb250YWluZXIgZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkgeworCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3JDb250YWluZXI7CisJfQorCQorCQorCXB1YmxpYyBKYXZhQ29udmVydGVyIGdldENvbnZlcnRlcigpIHsKKwkJcmV0dXJuIGdldFNwZWNpZmllZENvbnZlcnRlcigpID09IG51bGwgPyBnZXREZWZhdWx0Q29udmVydGVyKCkgOiBnZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKTsKKwl9CisJCisJcHVibGljIEphdmFDb252ZXJ0ZXIgZ2V0RGVmYXVsdENvbnZlcnRlcigpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdENvbnZlcnRlcjsKKwl9CisJCisJcHVibGljIEphdmFDb252ZXJ0ZXIgZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXI7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY2lmZWRDb252ZXJ0ZXJUeXBlKCkgeworCQlpZiAodGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuIENvbnZlcnRlci5OT19DT05WRVJURVI7CisJCX0KKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ29udmVydGVyLmdldFR5cGUoKTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7CisJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGdldFNwZWNpZmVkQ29udmVydGVyVHlwZSgpLCBjb252ZXJ0ZXJUeXBlKSkgeworCQkJcmV0dXJuOworCQl9CisJCUphdmFDb252ZXJ0ZXIgb2xkQ29udmVydGVyID0gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXI7CisJCUphdmFDb252ZXJ0ZXIgbmV3Q29udmVydGVyID0gYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXIoY29udmVydGVyVHlwZSk7CisJCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyID0gbnVsbDsKKwkJaWYgKG9sZENvbnZlcnRlciAhPSBudWxsKSB7CisJCQlvbGRDb252ZXJ0ZXIucmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoKTsKKwkJfQorCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlciA9IG5ld0NvbnZlcnRlcjsKKwkJaWYgKG5ld0NvbnZlcnRlciAhPSBudWxsKSB7CisJCQluZXdDb252ZXJ0ZXIuYWRkVG9SZXNvdXJjZU1vZGVsKCk7CisJCX0KKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ09OVkVSVEVSX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXIsIG5ld0NvbnZlcnRlcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENvbnZlcnRlcihKYXZhQ29udmVydGVyIG5ld0NvbnZlcnRlcikgeworCQlKYXZhQ29udmVydGVyIG9sZENvbnZlcnRlciA9IHRoaXMuc3BlY2lmaWVkQ29udmVydGVyOworCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlciA9IG5ld0NvbnZlcnRlcjsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ09OVkVSVEVSX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXIsIG5ld0NvbnZlcnRlcik7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuY29sdW1uLnVwZGF0ZSh0aGlzLmdldFJlc291cmNlQ29sdW1uKCkpOworCQl0aGlzLmdlbmVyYXRvckNvbnRhaW5lci51cGRhdGUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCXRoaXMudXBkYXRlR2VuZXJhdGVkVmFsdWUoKTsKKwkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwoZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCksIGdldFNwZWNpZmVkQ29udmVydGVyVHlwZSgpKSkgeworCQkJZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQl9CisJCWVsc2UgeworCQkJSmF2YUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXIoZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCkpOworCQkJc2V0U3BlY2lmaWVkQ29udmVydGVyKGphdmFDb252ZXJ0ZXIpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlR2VuZXJhdGVkVmFsdWUoKSB7CisJCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiByZXNvdXJjZUdlbmVyYXRlZFZhbHVlID0gZ2V0UmVzb3VyY2VHZW5lcmF0ZWRWYWx1ZSgpOworCQlpZiAocmVzb3VyY2VHZW5lcmF0ZWRWYWx1ZSA9PSBudWxsKSB7CisJCQlpZiAoZ2V0R2VuZXJhdGVkVmFsdWUoKSAhPSBudWxsKSB7CisJCQkJc2V0R2VuZXJhdGVkVmFsdWUobnVsbCk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoZ2V0R2VuZXJhdGVkVmFsdWUoKSA9PSBudWxsKSB7CisJCQkJc2V0R2VuZXJhdGVkVmFsdWUoYnVpbGRHZW5lcmF0ZWRWYWx1ZShyZXNvdXJjZUdlbmVyYXRlZFZhbHVlKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlnZXRHZW5lcmF0ZWRWYWx1ZSgpLnVwZGF0ZShyZXNvdXJjZUdlbmVyYXRlZFZhbHVlKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YUdlbmVyYXRlZFZhbHVlIGJ1aWxkR2VuZXJhdGVkVmFsdWUoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIHJlc291cmNlR2VuZXJhdGVkVmFsdWUpIHsKKwkJSmF2YUdlbmVyYXRlZFZhbHVlIGd2ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUdlbmVyYXRlZFZhbHVlKHRoaXMpOworCQlndi5pbml0aWFsaXplKHJlc291cmNlR2VuZXJhdGVkVmFsdWUpOworCQlyZXR1cm4gZ3Y7CisJfQorCisJcHJvdGVjdGVkIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZXRSZXNvdXJjZVRhYmxlR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS4KKwkJCQlnZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCX0KKwkKKwlwcm90ZWN0ZWQgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIGdldFJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IoKSB7CisJCXJldHVybiAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLgorCQkJCWdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJfQorCQorCXByb3RlY3RlZCBHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2V0UmVzb3VyY2VHZW5lcmF0ZWRWYWx1ZSgpIHsKKwkJcmV0dXJuIChHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuCisJCQkJZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIgYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlclR5cGUpIHsKKwkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwoY29udmVydGVyVHlwZSwgQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUikpIHsKKwkJCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhVGVtcG9yYWxDb252ZXJ0ZXIodGhpcywgdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCkgeworCQlpZiAodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpICE9IG51bGwpIHsKKwkJCXJldHVybiBDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSOworCQl9CisJCQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvLyAqKioqKioqKioqIGNvZGUgYXNzaXN0ICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlyZXN1bHQgPSB0aGlzLmdldENvbHVtbigpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWlmICh0aGlzLmdlbmVyYXRvclRvdWNoZXMocG9zLCBhc3RSb290KSkgeworCQkJcmVzdWx0ID0gdGhpcy5wZXJzaXN0ZW5jZUdlbmVyYXRvck5hbWVzKGZpbHRlcik7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJlc3VsdCA9IHRoaXMuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLy8gKioqKioqKioqKiBjb2RlIGFzc2lzdDogZ2VuZXJhdG9yIAorCQorCXByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRvclRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJaWYgKGdldFJlc291cmNlR2VuZXJhdGVkVmFsdWUoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUdlbmVyYXRlZFZhbHVlKCkuZ2VuZXJhdG9yVG91Y2hlcyhwb3MsIGFzdFJvb3QpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gcGVyc2lzdGVuY2VHZW5lcmF0b3JOYW1lcygpIHsKKwkJaWYodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpID09IDApIHsKKwkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+IGluc3RhbmNlKCk7CisJCX0KKwkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcih0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnVuaXF1ZUdlbmVyYXRvck5hbWVzKCkpOworCX0KKwkKKwlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gZ2VuZXJhdG9yTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMucGVyc2lzdGVuY2VHZW5lcmF0b3JOYW1lcygpLCBmaWx0ZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBwZXJzaXN0ZW5jZUdlbmVyYXRvck5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgeworCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKHRoaXMuZ2VuZXJhdG9yTmFtZXMoZmlsdGVyKSk7CisJfQorCisJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSB7CisJCXJldHVybiB0aGlzLmdldENvbHVtbigpLmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNJZE1hcHBpbmcoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8vKioqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQkKKwkJaWYgKHRoaXMuc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKSkgeworCQkJdGhpcy52YWxpZGF0ZUNvbHVtbihtZXNzYWdlcywgYXN0Um9vdCk7CisJCX0KKwkJaWYgKHRoaXMuZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgeworCQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl9CisJCWdldEdlbmVyYXRvckNvbnRhaW5lcigpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCWlmICh0aGlzLnNwZWNpZmllZENvbnZlcnRlciAhPSBudWxsKSB7CisJCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl9CisJfQorCQkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbHVtbihMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJaWYgKHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGhpcy5jb2x1bW4uZ2V0VGFibGUoKSkpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuY29sdW1uLmdldFRhYmxlKCksIHRoaXMuY29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQl0aGlzLmNvbHVtbiwKKwkJCQkJdGhpcy5jb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkpCisJCQkpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoICEgdGhpcy5jb2x1bW4uaXNSZXNvbHZlZCgpICYmIHRoaXMuY29sdW1uLmdldERiVGFibGUoKSAhPSBudWxsKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuY29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQl0aGlzLmNvbHVtbiwKKwkJCQkJdGhpcy5jb2x1bW4uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KQorCQkJCSkKKwkJCSk7CisJCX0KKwl9CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUlkTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZmNlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUlkTWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFJZE1hcHBpbmdEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgoreworCXByb3RlY3RlZCBBYnN0cmFjdEphdmFJZE1hcHBpbmdEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhSWRNYXBwaW5nKHBhcmVudCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDhjNmZkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwzODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kKK3sKKwlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW47CisJCisJcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxKYXZhSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBuZXcgVmVjdG9yPEphdmFKb2luQ29sdW1uPigpOworCXByb3RlY3RlZCBmaW5hbCBKYXZhSm9pbkNvbHVtbi5Pd25lciBqb2luQ29sdW1uT3duZXI7CisJCisJCisJcHJvdGVjdGVkIEFic3RyYWN0SmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuam9pbkNvbHVtbk93bmVyID0gdGhpcy5idWlsZEpvaW5Db2x1bW5Pd25lcigpOworCX0KKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgSmF2YUpvaW5Db2x1bW4uT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKTsKKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IG9sZFN0cmF0ZWd5KSB7CisJCWZvciAoSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9sZFN0cmF0ZWd5LmpvaW5Db2x1bW5zKCkpKSB7CisJCQlKb2luQ29sdW1uIG5ld0pvaW5Db2x1bW4gPSB0aGlzLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7CisJCQluZXdKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoam9pbkNvbHVtbi5nZXROYW1lKCkpOworCQkJbmV3Sm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwkJCQorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiB0aGlzLmdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFN0cmF0ZWd5KCkgeworCQlpZiAoc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgPT0gMCkgeworCQkJYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVTdHJhdGVneSgpIHsKKwkJZm9yIChKb2luQ29sdW1uIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoc3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkpIHsKKwkJCXJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oZWFjaCk7CisJCX0KKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpID8gCisJCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkgOiB0aGlzLmRlZmF1bHRKb2luQ29sdW1ucygpOworCX0KKwkKKwlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA/IAorCQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGRlZmF1bHQgam9pbiBjb2x1bW4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEphdmFKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbjsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEpvaW5Db2x1bW4oSmF2YUpvaW5Db2x1bW4gY29sdW1uKSB7CisJCUphdmFKb2luQ29sdW1uIG9sZCA9IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47CisJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBjb2x1bW47CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0pPSU5fQ09MVU1OX1BST1BFUlRZLCBvbGQsIGNvbHVtbik7CisJfQorCisJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gZGVmYXVsdEpvaW5Db2x1bW5zKCkgeworCQlpZiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7CisJCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4pOworCQl9CisJCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgaW50IGRlZmF1bHRKb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHNwZWNpZmllZCBqb2luIGNvbHVtbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+KHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMpOworCX0KKwkKKwlwdWJsaWMgaW50IHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuc2l6ZSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuICEgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5pc0VtcHR5KCk7CisJfQorCQorCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgeworCQkvLyBDbGVhciBvdXQgdGhlIGRlZmF1bHQgbm93IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQgZHVyaW5nIGFuIHVwZGF0ZSBhbmQKKwkJLy8gY2F1c2UgY2hhbmdlIG5vdGlmaWNhdGlvbnMgdG8gYmUgc2VudCB0byB0aGUgVUkgaW4gdGhlIHdyb25nIG9yZGVyLgorCQlKYXZhSm9pbkNvbHVtbiBvbGREZWZhdWx0ID0gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbjsKKwkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9IG51bGw7CisKKwkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUpvaW5Db2x1bW4odGhpcywgdGhpcy5qb2luQ29sdW1uT3duZXIpOworCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmFkZChpbmRleCwgam9pbkNvbHVtbik7CisJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5Bbm5vdGF0aW9uID0gdGhpcy5hZGRBbm5vdGF0aW9uKGluZGV4KTsKKwkJam9pbkNvbHVtbi5pbml0aWFsaXplKGpvaW5Db2x1bW5Bbm5vdGF0aW9uKTsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKFNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIGpvaW5Db2x1bW4pOworCisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0pPSU5fQ09MVU1OX1BST1BFUlRZLCBvbGREZWZhdWx0LCBudWxsKTsKKwkJcmV0dXJuIGpvaW5Db2x1bW47CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgsIEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJYWRkSXRlbVRvTGlzdChpbmRleCwgam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJYWRkU3BlY2lmaWVkSm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLnNpemUoKSwgam9pbkNvbHVtbik7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmluZGV4T2Yoam9pbkNvbHVtbikpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgeworCQlKYXZhSm9pbkNvbHVtbiByZW1vdmVkSm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKKwkJaWYgKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuaXNFbXB0eSgpKSB7CisJCQkvL2NyZWF0ZSB0aGUgZGVmYXVsdEpvaW5Db2x1bW4gbm93IG9yIHRoaXMgd2lsbCBoYXBwZW4gZHVyaW5nIHByb2plY3QgdXBkYXRlIAorCQkJLy9hZnRlciByZW1vdmluZyB0aGUgam9pbiBjb2x1bW4gZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuIFRoYXQgY2F1c2VzIHByb2JsZW1zIAorCQkJLy9pbiB0aGUgVUkgYmVjYXVzZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgZW5kIHVwIGluIHRoZSB3cm9uZyBvcmRlci4KKwkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBidWlsZEpvaW5Db2x1bW4oYnVpbGROdWxsSm9pbkNvbHVtbkFubm90YXRpb24oKSk7CisJCX0KKwkJcmVtb3ZlQW5ub3RhdGlvbihpbmRleCk7CisJCWZpcmVJdGVtUmVtb3ZlZChTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCByZW1vdmVkSm9pbkNvbHVtbik7CisJCWlmICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKKwkJCS8vZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIGEgZGVmYXVsdEpvaW5Db2x1bW4gd2FzIGNyZWF0ZWQgYWJvdmUKKwkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9KT0lOX0NPTFVNTl9QUk9QRVJUWSwgbnVsbCwgdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbik7CQkKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW5fKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KGpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIFNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCk7CisJfQorCQorCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCW1vdmVBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCWZpcmVJdGVtTW92ZWQoU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCisJfQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKGludCBpbmRleCk7CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihpbnQgaW5kZXgpOworCQorCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5Bbm5vdGF0aW9ucygpOworCQorCXByb3RlY3RlZCBhYnN0cmFjdCBKb2luQ29sdW1uQW5ub3RhdGlvbiBidWlsZE51bGxKb2luQ29sdW1uQW5ub3RhdGlvbigpOworCQorCQorCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgPT4gY29udGV4dCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CisJCWluaXRpYWxpemVTcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlpbml0aWFsaXplRGVmYXVsdEpvaW5Db2x1bW4oKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEpvaW5Db2x1bW5zKCkgeworCQlJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBqb2luQ29sdW1uQW5ub3RhdGlvbnMoKTsKKwkJd2hpbGUgKGFubm90YXRpb25zLmhhc05leHQoKSkgeworCQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5hZGQoYnVpbGRKb2luQ29sdW1uKGFubm90YXRpb25zLm5leHQoKSkpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0Sm9pbkNvbHVtbigpIHsKKwkJaWYgKG1heUhhdmVEZWZhdWx0Sm9pbkNvbHVtbigpKSB7CisJCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gCisJCQkJYnVpbGRKb2luQ29sdW1uKGJ1aWxkTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJdXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJdXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4oKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7CisJCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBzcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gcmVzb3VyY2VKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5Bbm5vdGF0aW9ucygpOworCQkKKwkJd2hpbGUgKGpvaW5Db2x1bW5zLmhhc05leHQoKSkgeworCQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLm5leHQoKTsKKwkJCWlmIChyZXNvdXJjZUpvaW5Db2x1bW5zLmhhc05leHQoKSkgeworCQkJCWpvaW5Db2x1bW4udXBkYXRlKHJlc291cmNlSm9pbkNvbHVtbnMubmV4dCgpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW5fKGpvaW5Db2x1bW4pOworCQkJfQorCQl9CisJCQorCQl3aGlsZSAocmVzb3VyY2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKKwkJCWFkZFNwZWNpZmllZEpvaW5Db2x1bW4oYnVpbGRKb2luQ29sdW1uKHJlc291cmNlSm9pbkNvbHVtbnMubmV4dCgpKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4oKSB7CisJCWlmIChtYXlIYXZlRGVmYXVsdEpvaW5Db2x1bW4oKSkgeworCQkJSm9pbkNvbHVtbkFubm90YXRpb24gbnVsbEFubm90YXRpb24gPSBidWlsZE51bGxKb2luQ29sdW1uQW5ub3RhdGlvbigpOworCQkJaWYgKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPT0gbnVsbCkgeworCQkJCXNldERlZmF1bHRKb2luQ29sdW1uKHRoaXMuYnVpbGRKb2luQ29sdW1uKG51bGxBbm5vdGF0aW9uKSk7CisJCQl9CisJCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uLnVwZGF0ZShudWxsQW5ub3RhdGlvbik7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7CisJCQkJc2V0RGVmYXVsdEpvaW5Db2x1bW4obnVsbCk7CisJCQl9CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luQ29sdW1uKCkgeworCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkubWF5SGF2ZURlZmF1bHRKb2luQ29sdW1uKCkKKwkJCSYmICEgaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwl9CisKKwlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4gYnVpbGRKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5SZXNvdXJjZSkgeworCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUpvaW5Db2x1bW4odGhpcywgdGhpcy5qb2luQ29sdW1uT3duZXIpOworCQlqb2luQ29sdW1uLmluaXRpYWxpemUoam9pbkNvbHVtblJlc291cmNlKTsKKwkJcmV0dXJuIGpvaW5Db2x1bW47CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogSmF2YSBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJZm9yIChKYXZhSm9pbkNvbHVtbiBjb2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5qb2luQ29sdW1ucygpKSkgeworCQkJcmVzdWx0ID0gY29sdW1uLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQlpZiAoZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLnNob3VsZFZhbGlkYXRlQWdhaW5zdERhdGFiYXNlKCkpIHsKKwkJCWZvciAoSXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IHN0cmVhbSA9IHRoaXMuam9pbkNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQkJdmFsaWRhdGVKb2luQ29sdW1uKHN0cmVhbS5uZXh0KCksIG1lc3NhZ2VzLCBhc3RSb290KTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSm9pbkNvbHVtbihKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJaWYgKGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZChqb2luQ29sdW1uLmdldFRhYmxlKCkpKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAorCQkJCQluZXcgU3RyaW5nW10ge2pvaW5Db2x1bW4uZ2V0VGFibGUoKSwgam9pbkNvbHVtbi5nZXROYW1lKCl9LCAKKwkJCQkJam9pbkNvbHVtbiwKKwkJCQkJam9pbkNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZShhc3RSb290KQorCQkJCSkKKwkJCSk7CisJCQlyZXR1cm47CisJCX0KKwkJdmFsaWRhdGVKb2luQ29sdW1uTmFtZShqb2luQ29sdW1uLCBtZXNzYWdlcywgYXN0Um9vdCk7CisJCXZhbGlkYXRpb25Kb2luQ29sdW1uUmVmZXJlbmNlZENvbHVtbk5hbWUoam9pbkNvbHVtbiwgbWVzc2FnZXMsIGFzdFJvb3QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUpvaW5Db2x1bW5OYW1lKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4sIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlpZiAoICEgam9pbkNvbHVtbi5pc1Jlc29sdmVkKCkgJiYgam9pbkNvbHVtbi5nZXREYlRhYmxlKCkgIT0gbnVsbCkgeworCQkJaWYgKGpvaW5Db2x1bW4uZ2V0TmFtZSgpICE9IG51bGwpIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCisJCQkJCQluZXcgU3RyaW5nW10ge2pvaW5Db2x1bW4uZ2V0TmFtZSgpfSwgCisJCQkJCQlqb2luQ29sdW1uLAorCQkJCQkJam9pbkNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRPd25lcigpLmpvaW5Db2x1bW5zU2l6ZSgpID4gMSkgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRV9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsCisJCQkJCQkJam9pbkNvbHVtbiwKKwkJCQkJCQlqb2luQ29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJCSkKKwkJCQkJKTsKKwkJCX0KKwkJCS8vSWYgdGhlIG5hbWUgaXMgbnVsbCBhbmQgdGhlcmUgaXMgb25seSBvbmUgam9pbi1jb2x1bW4sIG9uZSBvZiB0aGVzZSB2YWxpZGF0aW9uIG1lc3NhZ2VzIHdpbGwgYXBwbHkKKwkJCS8vIDEuIHRhcmdldCBlbnRpdHkgZG9lcyBub3QgaGF2ZSBhIHByaW1hcnkga2V5CisJCQkvLyAyLiB0YXJnZXQgZW50aXR5IGlzIG5vdCBzcGVjaWZpZWQKKwkJCS8vIDMuIHRhcmdldCBlbnRpdHkgaXMgbm90IGFuIGVudGl0eQorCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRpb25Kb2luQ29sdW1uUmVmZXJlbmNlZENvbHVtbk5hbWUoSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCWlmICggISBqb2luQ29sdW1uLmlzUmVmZXJlbmNlZENvbHVtblJlc29sdmVkKCkgJiYgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpICE9IG51bGwpIHsKKwkJCWlmIChqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgIT0gbnVsbCkgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQkJam9pbkNvbHVtbiwKKwkJCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJKQorCQkJCSk7CisJCQl9CisJCQllbHNlIGlmIChqb2luQ29sdW1uLmdldE93bmVyKCkuam9pbkNvbHVtbnNTaXplKCkgPiAxKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUywKKwkJCQkJCQlqb2luQ29sdW1uLAorCQkJCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJCSkKKwkJCQkJKTsKKwkJCX0KKwkJCS8vSWYgdGhlIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgaXMgbnVsbCBhbmQgdGhlcmUgaXMgb25seSBvbmUgam9pbi1jb2x1bW4sIG9uZSBvZiB0aGVzZSB2YWxpZGF0aW9uIG1lc3NhZ2VzIHdpbGwgYXBwbHkKKwkJCS8vIDEuIHRhcmdldCBlbnRpdHkgZG9lcyBub3QgaGF2ZSBhIHByaW1hcnkga2V5CisJCQkvLyAyLiB0YXJnZXQgZW50aXR5IGlzIG5vdCBzcGVjaWZpZWQKKwkJCS8vIDMuIHRhcmdldCBlbnRpdHkgaXMgbm90IGFuIGVudGl0eQkJCQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTRhNDA3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSAKKwlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCisJaW1wbGVtZW50cyBKYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5Cit7CisJcHJvdGVjdGVkIEphdmFKb2luVGFibGUgam9pblRhYmxlOworCQorCQorCXByb3RlY3RlZCBBYnN0cmFjdEphdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHVibGljIEpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiB0aGlzLmdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0Sm9pblRhYmxlRGVmYXVsdE5hbWUoKSB7CisJCXJldHVybiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luVGFibGVEZWZhdWx0TmFtZSh0aGlzLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRTdHJhdGVneSgpIHsKKwkJaWYgKHRoaXMuam9pblRhYmxlID09IG51bGwpIHsKKwkJCXRoaXMuam9pblRhYmxlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUpvaW5UYWJsZSh0aGlzKTsKKwkJCWFkZEFubm90YXRpb24oKTsKKwkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChKT0lOX1RBQkxFX1BST1BFUlRZLCBudWxsLCB0aGlzLmpvaW5UYWJsZSk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlU3RyYXRlZ3koKSB7CisJCWlmICh0aGlzLmpvaW5UYWJsZSAhPSBudWxsKSB7CisJCQlKYXZhSm9pblRhYmxlIG9sZEpvaW5UYWJsZSA9IHRoaXMuam9pblRhYmxlOworCQkJdGhpcy5qb2luVGFibGUgPSBudWxsOworCQkJcmVtb3ZlQW5ub3RhdGlvbigpOworCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpPSU5fVEFCTEVfUFJPUEVSVFksIG9sZEpvaW5UYWJsZSwgbnVsbCk7CisJCX0KKwl9CisJCQkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgb2xkU3RyYXRlZ3kpIHsKKwkJSm9pblRhYmxlIG9sZEpvaW5UYWJsZSA9IChvbGRTdHJhdGVneS5nZXRKb2luVGFibGUoKSk7CisJCWlmIChvbGRKb2luVGFibGUgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRTdHJhdGVneSgpOworCQkJdGhpcy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKG9sZEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOworCQkJdGhpcy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWRTY2hlbWEob2xkSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKKwkJCXRoaXMuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZShvbGRKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJfQorCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGpvaW4gdGFibGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEphdmFKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5qb2luVGFibGU7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldEpvaW5UYWJsZV8oSmF2YUpvaW5UYWJsZSBuZXdKb2luVGFibGUpIHsKKwkJSmF2YUpvaW5UYWJsZSBvbGRKb2luVGFibGUgPSB0aGlzLmpvaW5UYWJsZTsKKwkJdGhpcy5qb2luVGFibGUgPSBuZXdKb2luVGFibGU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChKT0lOX1RBQkxFX1BST1BFUlRZLCBvbGRKb2luVGFibGUsIG5ld0pvaW5UYWJsZSk7CisJfQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBKb2luVGFibGVBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKTsKKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCk7CisJCQorCQorCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgPT4gY29udGV4dCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CisJCUpvaW5UYWJsZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oKTsKKwkJaWYgKGFubm90YXRpb24uaXNTcGVjaWZpZWQoKSB8fCBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5tYXlIYXZlRGVmYXVsdEpvaW5UYWJsZSgpKSB7CisJCQl0aGlzLmpvaW5UYWJsZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFKb2luVGFibGUodGhpcyk7CisJCQl0aGlzLmpvaW5UYWJsZS5pbml0aWFsaXplKGFubm90YXRpb24pOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbigpOworCQlpZiAoYW5ub3RhdGlvbi5pc1NwZWNpZmllZCgpIHx8IGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLm1heUhhdmVEZWZhdWx0Sm9pblRhYmxlKCkpIHsKKwkJCWlmICh0aGlzLmpvaW5UYWJsZSA9PSBudWxsKSB7CisJCQkJc2V0Sm9pblRhYmxlXyhnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhSm9pblRhYmxlKHRoaXMpKTsKKwkJCX0KKwkJCXRoaXMuam9pblRhYmxlLnVwZGF0ZShhbm5vdGF0aW9uKTsKKwkJfQorCQllbHNlIHsKKwkJCWlmICh0aGlzLmpvaW5UYWJsZSAhPSBudWxsKSB7CisJCQkJLy8gbm8gYW5ub3RhdGlvbiwgc28gbm8gY2xlYW4gdXAKKwkJCQlzZXRKb2luVGFibGVfKG51bGwpOworCQkJfQorCQl9CisJfQorCQorCS8vICoqKioqKioqKioqKioqKiogSmF2YSBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ID09IG51bGwgJiYgdGhpcy5qb2luVGFibGUgIT0gbnVsbCkgeworCQkJcmVzdWx0ID0gdGhpcy5qb2luVGFibGUuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQlpZiAodGhpcy5qb2luVGFibGUgIT0gbnVsbCAmJiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKSkgeworCQkJdGhpcy5qb2luVGFibGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZS5qYXZhCmluZGV4IDM0YmNjMDguLjhhNTVkNGEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTIsMjAgKzEyLDMxIEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuQWJzdHJhY3RKcGFDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZSBleHRlbmRzIEFic3RyYWN0SnBhQ29udGV4dE5vZGUgaW1wbGVtZW50cyBKYXZhSnBhQ29udGV4dE5vZGUKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQorCWV4dGVuZHMgQWJzdHJhY3RKcGFDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgSmF2YUpwYUNvbnRleHROb2RlCiB7CiAJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCiAKIAlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUoSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7CiAJCXN1cGVyKHBhcmVudCk7CiAJfQotCisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYVJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7CisJCXJldHVybiBKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEU7CisJfQorCQogCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKIAkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpKSB7CiAJCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHRoaXMuY29ubmVjdGVkSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwpAQCAtNDMsNiArNTQsNyBAQAogCSAqIG9ubHkgcmV0dXJuIGNhbmRpZGF0ZXMgZm9yIHRoZSBjdXJyZW50IG9iamVjdC4gVGhlIGNhc2NhZGluZyBpcwogCSAqIGhhbmRsZWQgYnkgI2phdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCwgRmlsdGVyLCBDb21waWxhdGlvblVuaXQpLgogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtNTAsMTEgKzYyLDEzIEBACiAJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKIAkKIAkvKioKLQkgKiBBbGwgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25zIHtAbGluayAjYWRkVG9NZXNzYWdlcyhMaXN0LCBDb21waWxhdGlvblVuaXQpKX0gCisJICogQWxsIHN1YmNsYXNzIGltcGxlbWVudGF0aW9ucyB7QGxpbmsgI3ZhbGlkYXRlKExpc3QsIENvbXBpbGF0aW9uVW5pdCkpfSAKIAkgKiBzaG91bGQgYmUgcHJlY2VkZWQgYnkgYSAic3VwZXIiIGNhbGwgdG8gdGhpcyBtZXRob2QKIAkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlpZiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgeworCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKTsKKwkJfQogCX0KIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFNYW55VG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFNYW55VG9NYW55TWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MDlkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU1hbnlUb01hbnlNYXBwaW5nLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKKworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhTWFueVRvTWFueU1hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzxNYW55VG9NYW55QW5ub3RhdGlvbj4KKwlpbXBsZW1lbnRzIEphdmFNYW55VG9NYW55TWFwcGluZworeworCXByb3RlY3RlZCBBYnN0cmFjdEphdmFNYW55VG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEphdmFSZWxhdGlvbnNoaXBSZWZlcmVuY2UgYnVpbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFNYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlKHRoaXMpOworCX0KKwkJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE1hbnlUb01hbnlBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gc3VwZXIuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YU1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gKEphdmFNYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlKSBzdXBlci5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU1hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTWFueVRvT25lTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzY2VkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU1hbnlUb09uZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247CisKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YU1hbnlUb09uZU1hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc8TWFueVRvT25lQW5ub3RhdGlvbj4KKwlpbXBsZW1lbnRzIEphdmFNYW55VG9PbmVNYXBwaW5nMl8wCit7CisJcHJvdGVjdGVkIEFic3RyYWN0SmF2YU1hbnlUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlIGJ1aWxkUmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlKHRoaXMpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBNYW55VG9PbmVBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gc3VwZXIuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIChKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlKSBzdXBlci5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwl9CisJCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBCb29sZWFuIGdldFJlc291cmNlT3B0aW9uYWwoKSB7CisJCXJldHVybiB0aGlzLm1hcHBpbmdBbm5vdGF0aW9uLmdldE9wdGlvbmFsKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFJlc291cmNlT3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkgeworCQl0aGlzLm1hcHBpbmdBbm5vdGF0aW9uLnNldE9wdGlvbmFsKG5ld09wdGlvbmFsKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU1hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTWFwcGVkU3VwZXJjbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZWNjYWEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU1hcHBlZFN1cGVyY2xhc3MuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQ2xhc3NBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YU1hcHBlZFN1cGVyY2xhc3MgZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZworCWltcGxlbWVudHMgSmF2YU1hcHBlZFN1cGVyY2xhc3MKK3sKKworCXByb3RlY3RlZCBTdHJpbmcgaWRDbGFzczsKKworCXByb3RlY3RlZCBBYnN0cmFjdEphdmFNYXBwZWRTdXBlcmNsYXNzKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IHN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7CisJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KAorCQkJSlBBLklEX0NMQVNTLAorCQkJSlBBLkVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMsCisJCQlKUEEuRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUywKKwkJCUpQQS5FTlRJVFlfTElTVEVORVJTLAorCQkJSlBBLlBSRV9QRVJTSVNULAorCQkJSlBBLlBPU1RfUEVSU0lTVCwKKwkJCUpQQS5QUkVfUkVNT1ZFLAorCQkJSlBBLlBPU1RfUkVNT1ZFLAorCQkJSlBBLlBSRV9VUERBVEUsCisJCQlKUEEuUE9TVF9VUERBVEUsCisJCQlKUEEuUE9TVF9MT0FEKTsKKwl9CisJCisJcHVibGljIGNoYXIgZ2V0SWRDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7CisJCXJldHVybiAnLic7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0SWRDbGFzcygpIHsKKwkJcmV0dXJuIHRoaXMuaWRDbGFzczsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0SWRDbGFzcyhTdHJpbmcgbmV3SWRDbGFzcykgeworCQlTdHJpbmcgb2xkSWRDbGFzcyA9IHRoaXMuaWRDbGFzczsKKwkJdGhpcy5pZENsYXNzID0gbmV3SWRDbGFzczsKKwkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG5ld0lkQ2xhc3MsIG9sZElkQ2xhc3MpKSB7CisJCQlpZiAobmV3SWRDbGFzcyAhPSBudWxsKSB7CisJCQkJaWYgKGdldFJlc291cmNlSWRDbGFzcygpID09IG51bGwpIHsKKwkJCQkJYWRkUmVzb3VyY2VJZENsYXNzKCk7CisJCQkJfQorCQkJCWdldFJlc291cmNlSWRDbGFzcygpLnNldFZhbHVlKG5ld0lkQ2xhc3MpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlUmVzb3VyY2VJZENsYXNzKCk7CisJCQl9CisJCX0KKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChJRF9DTEFTU19QUk9QRVJUWSwgb2xkSWRDbGFzcywgbmV3SWRDbGFzcyk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldElkQ2xhc3NfKFN0cmluZyBuZXdJZENsYXNzKSB7CisJCVN0cmluZyBvbGRJZENsYXNzID0gdGhpcy5pZENsYXNzOworCQl0aGlzLmlkQ2xhc3MgPSBuZXdJZENsYXNzOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElEX0NMQVNTX1BST1BFUlRZLCBvbGRJZENsYXNzLCBuZXdJZENsYXNzKTsKKwl9CisKKwlwcm90ZWN0ZWQgSWRDbGFzc0Fubm90YXRpb24gZ2V0UmVzb3VyY2VJZENsYXNzKCkgeworCQlyZXR1cm4gKElkQ2xhc3NBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLgorCQkJCWdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VJZENsYXNzKCkgeworCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVzb3VyY2VJZENsYXNzKCkgeworCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlQWdhaW5zdERhdGFiYXNlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlKSB7CisJCXN1cGVyLmluaXRpYWxpemUocGVyc2lzdGVudFR5cGVSZXNvdXJjZSk7CisJCXRoaXMuaWRDbGFzcyA9IHRoaXMuZ2V0UmVzb3VyY2VJZENsYXNzTmFtZSh0aGlzLmdldFJlc291cmNlSWRDbGFzcygpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgeworCQlzdXBlci51cGRhdGUocGVyc2lzdGVudFR5cGVSZXNvdXJjZSk7CisJCXRoaXMuc2V0SWRDbGFzc18odGhpcy5nZXRSZXNvdXJjZUlkQ2xhc3NOYW1lKHRoaXMuZ2V0UmVzb3VyY2VJZENsYXNzKCkpKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlSWRDbGFzc05hbWUoSWRDbGFzc0Fubm90YXRpb24gcmVzb3VyY2VJZENsYXNzKSB7CisJCXJldHVybiByZXNvdXJjZUlkQ2xhc3MgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZUlkQ2xhc3MuZ2V0VmFsdWUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQppbmRleCBjNzU1NjM1Li5iMzJiYTMzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw0NTAgKzksNDgxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Ob25Pd25pbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PcmRlckJ5QW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwogCi0KKy8qKgorICogSmF2YSBtdWx0aS1yZWxhdGlvbnNoaXAgKG06bSwgMTptKSBtYXBwaW5nCisgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc8VCBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uPgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhUmVsYXRpb25zaGlwTWFwcGluZzxUPiBpbXBsZW1lbnRzIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZworCWV4dGVuZHMgQWJzdHJhY3RKYXZhUmVsYXRpb25zaGlwTWFwcGluZzxUPiAKKwlpbXBsZW1lbnRzIEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE9yZGVyQnkgPSBudWxsOworCXByb3RlY3RlZCBib29sZWFuIG5vT3JkZXJpbmcgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBwa09yZGVyaW5nID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gY3VzdG9tT3JkZXJpbmcgPSBmYWxzZTsKIAotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkQnk7CisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRNYXBLZXk7CisJcHJvdGVjdGVkIGJvb2xlYW4gbm9NYXBLZXkgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBwa01hcEtleSA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIGN1c3RvbU1hcEtleSA9IGZhbHNlOwogCi0JcHJvdGVjdGVkIFN0cmluZyBvcmRlckJ5OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOb09yZGVyaW5nOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQa09yZGVyaW5nOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDdXN0b21PcmRlcmluZzsKLQkKLQkvL1RPRE8gc2hvdWxkIHRoaXMgYmUgbnVsbCBpZiB0aGlzIGlzIHRoZSBub24tb3duaW5nIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcD8/Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFKb2luVGFibGUgam9pblRhYmxlOyAKLQotCXByb3RlY3RlZCBTdHJpbmcgbWFwS2V5OwogCiAJcHJvdGVjdGVkIEFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKIAkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qb2luVGFibGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhSm9pblRhYmxlKHRoaXMpOyAKIAl9CiAKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbmV3TWFwcGVkQnkpIHsKLQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gdGhpcy5tYXBwZWRCeTsKLQkJdGhpcy5tYXBwZWRCeSA9IG5ld01hcHBlZEJ5OwotCQl0aGlzLnNldE1hcHBlZEJ5T25SZXNvdXJjZU1vZGVsKG5ld01hcHBlZEJ5KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOb25Pd25pbmdNYXBwaW5nLk1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkTWFwcGVkQnksIG5ld01hcHBlZEJ5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwZWRCeV8oU3RyaW5nIG5ld01hcHBlZEJ5KSB7Ci0JCVN0cmluZyBvbGRNYXBwZWRCeSA9IHRoaXMubWFwcGVkQnk7Ci0JCXRoaXMubWFwcGVkQnkgPSBuZXdNYXBwZWRCeTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOb25Pd25pbmdNYXBwaW5nLk1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkTWFwcGVkQnksIG5ld01hcHBlZEJ5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRNYXBwZWRCeU9uUmVzb3VyY2VNb2RlbChTdHJpbmcgbWFwcGVkQnkpOwotCi0JcHVibGljIFN0cmluZyBnZXRPcmRlckJ5KCkgewotCQlyZXR1cm4gdGhpcy5vcmRlckJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9yZGVyQnkoU3RyaW5nIG5ld09yZGVyQnkpIHsKLQkJU3RyaW5nIG9sZE9yZGVyQnkgPSB0aGlzLm9yZGVyQnk7Ci0JCXRoaXMub3JkZXJCeSA9IG5ld09yZGVyQnk7Ci0JCWlmIChuZXdPcmRlckJ5ID09IG51bGwpIHsKLQkJCWlmIChnZXRPcmRlckJ5UmVzb3VyY2UoKSAhPSBudWxsKSB7IAotCQkJCXJlbW92ZU9yZGVyQnlSZXNvdXJjZSgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldE9yZGVyQnlSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQlhZGRPcmRlckJ5UmVzb3VyY2UoKTsKLQkJCX0KLQkJCWdldE9yZGVyQnlSZXNvdXJjZSgpLnNldFZhbHVlKG5ld09yZGVyQnkpOwotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLk9SREVSX0JZX1BST1BFUlRZLCBvbGRPcmRlckJ5LCBuZXdPcmRlckJ5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3JkZXJCeV8oU3RyaW5nIG5ld09yZGVyQnkpIHsKLQkJU3RyaW5nIG9sZE9yZGVyQnkgPSB0aGlzLm9yZGVyQnk7Ci0JCXRoaXMub3JkZXJCeSA9IG5ld09yZGVyQnk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLk9SREVSX0JZX1BST1BFUlRZLCBvbGRPcmRlckJ5LCBuZXdPcmRlckJ5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9yZGVyQnlBbm5vdGF0aW9uIGdldE9yZGVyQnlSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChPcmRlckJ5QW5ub3RhdGlvbikgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JkZXJCeUFubm90YXRpb24gYWRkT3JkZXJCeVJlc291cmNlKCkgewotCQlyZXR1cm4gKE9yZGVyQnlBbm5vdGF0aW9uKSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU9yZGVyQnlSZXNvdXJjZSgpIHsKLQkJZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc05vT3JkZXJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmlzTm9PcmRlcmluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb09yZGVyaW5nKGJvb2xlYW4gbmV3Tm9PcmRlcmluZykgewotCQlib29sZWFuIG9sZE5vT3JkZXJpbmcgPSB0aGlzLmlzTm9PcmRlcmluZzsKLQkJdGhpcy5pc05vT3JkZXJpbmcgPSBuZXdOb09yZGVyaW5nOwotCQlpZiAobmV3Tm9PcmRlcmluZykgewotCQkJaWYgKGdldE9yZGVyQnlSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlyZW1vdmVPcmRlckJ5UmVzb3VyY2UoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vPz8KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5PX09SREVSSU5HX1BST1BFUlRZLCBvbGROb09yZGVyaW5nLCBuZXdOb09yZGVyaW5nKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Tm9PcmRlcmluZ18oYm9vbGVhbiBuZXdOb09yZGVyaW5nKSB7Ci0JCWJvb2xlYW4gb2xkTm9PcmRlcmluZyA9IHRoaXMuaXNOb09yZGVyaW5nOwotCQl0aGlzLmlzTm9PcmRlcmluZyA9IG5ld05vT3JkZXJpbmc7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9fT1JERVJJTkdfUFJPUEVSVFksIG9sZE5vT3JkZXJpbmcsIG5ld05vT3JkZXJpbmcpOwkJCQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGtPcmRlcmluZygpIHsKLQkJcmV0dXJuIHRoaXMuaXNQa09yZGVyaW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQa09yZGVyaW5nKGJvb2xlYW4gbmV3UGtPcmRlcmluZykgewotCQlib29sZWFuIG9sZFBrT3JkZXJpbmcgPSB0aGlzLmlzUGtPcmRlcmluZzsKLQkJdGhpcy5pc1BrT3JkZXJpbmcgPSBuZXdQa09yZGVyaW5nOwotCQlpZiAobmV3UGtPcmRlcmluZykgewotCQkJaWYgKGdldE9yZGVyQnlSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQlhZGRPcmRlckJ5UmVzb3VyY2UoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWdldE9yZGVyQnlSZXNvdXJjZSgpLnNldFZhbHVlKG51bGwpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUEtfT1JERVJJTkdfUFJPUEVSVFksIG9sZFBrT3JkZXJpbmcsIG5ld1BrT3JkZXJpbmcpOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGtPcmRlcmluZ18oYm9vbGVhbiBuZXdQa09yZGVyaW5nKSB7Ci0JCWJvb2xlYW4gb2xkUGtPcmRlcmluZyA9IHRoaXMuaXNQa09yZGVyaW5nOwotCQl0aGlzLmlzUGtPcmRlcmluZyA9IG5ld1BrT3JkZXJpbmc7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUEtfT1JERVJJTkdfUFJPUEVSVFksIG9sZFBrT3JkZXJpbmcsIG5ld1BrT3JkZXJpbmcpOwkKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0N1c3RvbU9yZGVyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5pc0N1c3RvbU9yZGVyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1c3RvbU9yZGVyaW5nKGJvb2xlYW4gbmV3Q3VzdG9tT3JkZXJpbmcpIHsKLQkJYm9vbGVhbiBvbGRDdXN0b21PcmRlcmluZyA9IHRoaXMuaXNDdXN0b21PcmRlcmluZzsKLQkJdGhpcy5pc0N1c3RvbU9yZGVyaW5nID0gbmV3Q3VzdG9tT3JkZXJpbmc7Ci0JCWlmIChuZXdDdXN0b21PcmRlcmluZykgewotCQkJc2V0T3JkZXJCeSgiIik7Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDVVNUT01fT1JERVJJTkdfUFJPUEVSVFksIG9sZEN1c3RvbU9yZGVyaW5nLCBuZXdDdXN0b21PcmRlcmluZyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbU9yZGVyaW5nXyhib29sZWFuIG5ld0N1c3RvbU9yZGVyaW5nKSB7Ci0JCWJvb2xlYW4gb2xkQ3VzdG9tT3JkZXJpbmcgPSB0aGlzLmlzQ3VzdG9tT3JkZXJpbmc7Ci0JCXRoaXMuaXNDdXN0b21PcmRlcmluZyA9IG5ld0N1c3RvbU9yZGVyaW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENVU1RPTV9PUkRFUklOR19QUk9QRVJUWSwgb2xkQ3VzdG9tT3JkZXJpbmcsIG5ld0N1c3RvbU9yZGVyaW5nKTsKLQl9Ci0JCi0JcHVibGljIEZldGNoVHlwZSBnZXREZWZhdWx0RmV0Y2goKSB7Ci0JCXJldHVybiBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuREVGQVVMVF9GRVRDSF9UWVBFOwotCX0KLQotCXB1YmxpYyBKYXZhSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSm9pblRhYmxlU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gZ2V0Sm9pblRhYmxlKCkuaXNTcGVjaWZpZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aW9uc2hpcE93bmVyKCkgewotCQlyZXR1cm4gZ2V0TWFwcGVkQnkoKSA9PSBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcEtleSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwS2V5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcEtleShTdHJpbmcgbmV3TWFwS2V5KSB7Ci0JCVN0cmluZyBvbGRNYXBLZXkgPSB0aGlzLm1hcEtleTsKLQkJdGhpcy5tYXBLZXkgPSBuZXdNYXBLZXk7Ci0JCWlmIChvbGRNYXBLZXkgIT0gbmV3TWFwS2V5KSB7Ci0JCQlpZiAodGhpcy5nZXRNYXBLZXlSZXNvdXJjZShnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkgIT0gbnVsbCkgewotCQkJCWlmIChuZXdNYXBLZXkgIT0gbnVsbCkgewotCQkJCQl0aGlzLmdldE1hcEtleVJlc291cmNlKGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKS5zZXROYW1lKG5ld01hcEtleSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQkJCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3TWFwS2V5ICE9IG51bGwpIHsKLQkJCQlnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCQlnZXRNYXBLZXlSZXNvdXJjZShnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkuc2V0TmFtZShuZXdNYXBLZXkpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLk1BUF9LRVlfUFJPUEVSVFksIG9sZE1hcEtleSwgbmV3TWFwS2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBLZXlfKFN0cmluZyBuZXdNYXBLZXkpIHsKLQkJU3RyaW5nIG9sZE1hcEtleSA9IHRoaXMubWFwS2V5OwotCQl0aGlzLm1hcEtleSA9IG5ld01hcEtleTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuTUFQX0tFWV9QUk9QRVJUWSwgb2xkTWFwS2V5LCBuZXdNYXBLZXkpOwotCX0KLQotLy9UT0RPIGRlZmF1bHQgb3JkZXJCeSAtIHRoaXMgd2Fzbid0IHN1cHBvcnRlZCBpbiAxLjAgZWl0aGVyCi0vLwlwdWJsaWMgdm9pZCByZWZyZXNoRGVmYXVsdHMoRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewotLy8JCXN1cGVyLnJlZnJlc2hEZWZhdWx0cyhkZWZhdWx0c0NvbnRleHQpOwotLy8JCS8vCQlpZiAoaXNPcmRlckJ5UGsoKSkgewotLy8JCS8vCQkJcmVmcmVzaERlZmF1bHRPcmRlckJ5KGRlZmF1bHRzQ29udGV4dCk7Ci0vLwkJLy8JCX0KLS8vCX0KLS8vCi0vLwkvL3ByaW1hcnkga2V5IG9yZGVyaW5nIHdoZW4ganVzdCB0aGUgQE9yZGVyQnkgYW5ub3RhdGlvbiBpcyBwcmVzZW50Ci0vLwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRGVmYXVsdE9yZGVyQnkoRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewotLy8JCUlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLS8vCQlpZiAodGFyZ2V0RW50aXR5ICE9IG51bGwpIHsKLS8vCQkJc2V0T3JkZXJCeSh0YXJnZXRFbnRpdHkucHJpbWFyeUtleUF0dHJpYnV0ZU5hbWUoKSArICIgQVNDIik7Ci0vLwkJfQotLy8JfQotCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFyZ2V0RW50aXR5KEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCWlmICghcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLnR5cGVJc0NvbnRhaW5lcigpKSB7CisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZSgpOworCQl0aGlzLmluaXRpYWxpemVPcmRlckJ5KCk7CisJCXRoaXMuaW5pdGlhbGl6ZU1hcEtleSgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMudXBkYXRlT3JkZXJCeSgpOworCQl0aGlzLnVwZGF0ZU1hcEtleSgpOworCX0KKworCS8vICoqKioqKioqKiogQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqICAKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmdbXSBidWlsZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7CisJCXJldHVybiBBcnJheVRvb2xzLmFkZEFsbCgKKwkJCXN1cGVyLmJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAorCQkJSlBBLkpPSU5fVEFCTEUsCisJCQlKUEEuTUFQX0tFWSwKKwkJCUpQQS5PUkRFUl9CWQorCQkJKTsKKwl9CisKKwkvLyAqKioqKioqKioqIEFic3RyYWN0SmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKiAgCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE11bHRpUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogb3JkZXIgYnkgKioqKioqKioqKiAgCisKKwlwdWJsaWMgU3RyaW5nIGdldE9yZGVyQnkoKSB7CisJCWlmICh0aGlzLm5vT3JkZXJpbmcpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lKCk7CisJCWlmICh0aGlzLnBrT3JkZXJpbmcpIHsKKwkJCXJldHVybiB0aGlzLmdldFRhcmdldEVudGl0eUlkQXR0cmlidXRlTmFtZSgpOworCQl9CisJCWlmICh0aGlzLmN1c3RvbU9yZGVyaW5nKSB7CisJCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRPcmRlckJ5OworCQl9CisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gb3JkZXJpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBtYXBwZWRCeVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRPcmRlckJ5KCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRPcmRlckJ5OworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE9yZGVyQnkoU3RyaW5nIG9yZGVyQnkpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkT3JkZXJCeTsKKwkJdGhpcy5zcGVjaWZpZWRPcmRlckJ5ID0gb3JkZXJCeTsKKwkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeUFubm90YXRpb24gPSB0aGlzLmdldE9yZGVyQnlBbm5vdGF0aW9uKCk7CisJCWlmIChvcmRlckJ5ID09IG51bGwpIHsKKwkJCWlmIChvcmRlckJ5QW5ub3RhdGlvbiAhPSBudWxsKSB7IAorCQkJCXRoaXMucmVtb3ZlT3JkZXJCeUFubm90YXRpb24oKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChvcmRlckJ5QW5ub3RhdGlvbiA9PSBudWxsKSB7CisJCQkJb3JkZXJCeUFubm90YXRpb24gPSB0aGlzLmFkZE9yZGVyQnlBbm5vdGF0aW9uKCk7CisJCQl9CisJCQlvcmRlckJ5QW5ub3RhdGlvbi5zZXRWYWx1ZShvcmRlckJ5KTsKKwkJfQorCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX09SREVSX0JZX1BST1BFUlRZLCBvbGQsIG9yZGVyQnkpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE9yZGVyQnlfKFN0cmluZyBvcmRlckJ5KSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZE9yZGVyQnk7CisJCXRoaXMuc3BlY2lmaWVkT3JkZXJCeSA9IG9yZGVyQnk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfT1JERVJfQllfUFJPUEVSVFksIG9sZCwgb3JkZXJCeSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9yZGVyQnkoKSB7CisJCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnlBbm5vdGF0aW9uID0gdGhpcy5nZXRPcmRlckJ5QW5ub3RhdGlvbigpOworCQlpZiAob3JkZXJCeUFubm90YXRpb24gPT0gbnVsbCkgeworCQkJdGhpcy5ub09yZGVyaW5nID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuc3BlY2lmaWVkT3JkZXJCeSA9IG9yZGVyQnlBbm5vdGF0aW9uLmdldFZhbHVlKCk7CisJCQlpZiAodGhpcy5zcGVjaWZpZWRPcmRlckJ5ID09IG51bGwpIHsKKwkJCQl0aGlzLnBrT3JkZXJpbmcgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmN1c3RvbU9yZGVyaW5nID0gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9yZGVyQnkoKSB7CisJCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnlBbm5vdGF0aW9uID0gdGhpcy5nZXRPcmRlckJ5QW5ub3RhdGlvbigpOworCQlpZiAob3JkZXJCeUFubm90YXRpb24gPT0gbnVsbCkgeworCQkJdGhpcy5zZXRTcGVjaWZpZWRPcmRlckJ5XyhudWxsKTsKKwkJCXRoaXMuc2V0Tm9PcmRlcmluZ18odHJ1ZSk7CisJCQl0aGlzLnNldFBrT3JkZXJpbmdfKGZhbHNlKTsKKwkJCXRoaXMuc2V0Q3VzdG9tT3JkZXJpbmdfKGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBvYiA9IG9yZGVyQnlBbm5vdGF0aW9uLmdldFZhbHVlKCk7CisJCQl0aGlzLnNldFNwZWNpZmllZE9yZGVyQnlfKG9iKTsKKwkJCXRoaXMuc2V0Tm9PcmRlcmluZ18oZmFsc2UpOworCQkJdGhpcy5zZXRQa09yZGVyaW5nXyhvYiA9PSBudWxsKTsKKwkJCXRoaXMuc2V0Q3VzdG9tT3JkZXJpbmdfKG9iICE9IG51bGwpOworCQl9CisJfQorCisJcHJvdGVjdGVkIE9yZGVyQnlBbm5vdGF0aW9uIGdldE9yZGVyQnlBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKE9yZGVyQnlBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwl9CisKKwlwcm90ZWN0ZWQgT3JkZXJCeUFubm90YXRpb24gYWRkT3JkZXJCeUFubm90YXRpb24oKSB7CisJCXJldHVybiAoT3JkZXJCeUFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZU9yZGVyQnlBbm5vdGF0aW9uKCkgeworCQl0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwl9CisKKworCS8vICoqKioqKioqKiogbm8gb3JkZXJpbmcgKioqKioqKioqKiAgCisKKwlwdWJsaWMgYm9vbGVhbiBpc05vT3JkZXJpbmcoKSB7CisJCXJldHVybiB0aGlzLm5vT3JkZXJpbmc7CisJfQorCisJcHVibGljIHZvaWQgc2V0Tm9PcmRlcmluZyhib29sZWFuIG5vT3JkZXJpbmcpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLm5vT3JkZXJpbmc7CisJCXRoaXMubm9PcmRlcmluZyA9IG5vT3JkZXJpbmc7CisJCWlmIChub09yZGVyaW5nKSB7CisJCQlpZiAodGhpcy5nZXRPcmRlckJ5QW5ub3RhdGlvbigpICE9IG51bGwpIHsKKwkJCQl0aGlzLnJlbW92ZU9yZGVyQnlBbm5vdGF0aW9uKCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyB0aGUgJ25vT3JkZXJpbmcnIGZsYWcgaXMgY2xlYXJlZCBhcyBhCisJCQkvLyBzaWRlLWVmZmVjdCBvZiBzZXR0aW5nIHRoZSBvdGhlciBmbGFncywKKwkJCS8vIHZpYSBhIGNhbGwgdG8gI3NldE5vT3JkZXJpbmdfKGJvb2xlYW4pCisJCX0KKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PX09SREVSSU5HX1BST1BFUlRZLCBvbGQsIG5vT3JkZXJpbmcpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldE5vT3JkZXJpbmdfKGJvb2xlYW4gbm9PcmRlcmluZykgeworCQlib29sZWFuIG9sZCA9IHRoaXMubm9PcmRlcmluZzsKKwkJdGhpcy5ub09yZGVyaW5nID0gbm9PcmRlcmluZzsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PX09SREVSSU5HX1BST1BFUlRZLCBvbGQsIG5vT3JkZXJpbmcpOwkKKwl9CisKKworCS8vICoqKioqKioqKiogcGsgb3JkZXJpbmcgKioqKioqKioqKiAgCisKKwlwdWJsaWMgYm9vbGVhbiBpc1BrT3JkZXJpbmcoKSB7CisJCXJldHVybiB0aGlzLnBrT3JkZXJpbmc7CisJfQorCisJcHVibGljIHZvaWQgc2V0UGtPcmRlcmluZyhib29sZWFuIHBrT3JkZXJpbmcpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLnBrT3JkZXJpbmc7CisJCXRoaXMucGtPcmRlcmluZyA9IHBrT3JkZXJpbmc7CisJCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnlBbm5vdGF0aW9uID0gdGhpcy5nZXRPcmRlckJ5QW5ub3RhdGlvbigpOworCQlpZiAocGtPcmRlcmluZykgeworCQkJaWYgKG9yZGVyQnlBbm5vdGF0aW9uID09IG51bGwpIHsKKwkJCQl0aGlzLmFkZE9yZGVyQnlBbm5vdGF0aW9uKCk7CisJCQl9IGVsc2UgeworCQkJCW9yZGVyQnlBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOworCQkJfQorCQl9IGVsc2UgeworCQkJLy8gdGhlICdwa09yZGVyaW5nJyBmbGFnIGlzIGNsZWFyZWQgYXMgYQorCQkJLy8gc2lkZS1lZmZlY3Qgb2Ygc2V0dGluZyB0aGUgb3RoZXIgZmxhZ3MsCisJCQkvLyB2aWEgYSBjYWxsIHRvICNzZXRQa09yZGVyaW5nXyhib29sZWFuKQorCQl9CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQS19PUkRFUklOR19QUk9QRVJUWSwgb2xkLCBwa09yZGVyaW5nKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQa09yZGVyaW5nXyhib29sZWFuIHBrT3JkZXJpbmcpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLnBrT3JkZXJpbmc7CisJCXRoaXMucGtPcmRlcmluZyA9IHBrT3JkZXJpbmc7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQS19PUkRFUklOR19QUk9QRVJUWSwgb2xkLCBwa09yZGVyaW5nKTsKKwl9CisKKworCS8vICoqKioqKioqKiogY3VzdG9tIG9yZGVyaW5nICoqKioqKioqKiogIAorCisJcHVibGljIGJvb2xlYW4gaXNDdXN0b21PcmRlcmluZygpIHsKKwkJcmV0dXJuIHRoaXMuY3VzdG9tT3JkZXJpbmc7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q3VzdG9tT3JkZXJpbmcoYm9vbGVhbiBjdXN0b21PcmRlcmluZykgeworCQlib29sZWFuIG9sZCA9IHRoaXMuY3VzdG9tT3JkZXJpbmc7CisJCXRoaXMuY3VzdG9tT3JkZXJpbmcgPSBjdXN0b21PcmRlcmluZzsKKwkJaWYgKGN1c3RvbU9yZGVyaW5nKSB7CisJCQl0aGlzLnNldFNwZWNpZmllZE9yZGVyQnkoIiIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQkvLyB0aGUgJ2N1c3RvbU9yZGVyaW5nJyBmbGFnIGlzIGNsZWFyZWQgYXMgYQorCQkJLy8gc2lkZS1lZmZlY3Qgb2Ygc2V0dGluZyB0aGUgb3RoZXIgZmxhZ3MsCisJCQkvLyB2aWEgYSBjYWxsIHRvICNzZXRDdXN0b21PcmRlcmluZ18oYm9vbGVhbikKKwkJfQorCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ1VTVE9NX09SREVSSU5HX1BST1BFUlRZLCBvbGQsIGN1c3RvbU9yZGVyaW5nKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21PcmRlcmluZ18oYm9vbGVhbiBjdXN0b21PcmRlcmluZykgeworCQlib29sZWFuIG9sZCA9IHRoaXMuY3VzdG9tT3JkZXJpbmc7CisJCXRoaXMuY3VzdG9tT3JkZXJpbmcgPSBjdXN0b21PcmRlcmluZzsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENVU1RPTV9PUkRFUklOR19QUk9QRVJUWSwgb2xkLCBjdXN0b21PcmRlcmluZyk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEZldGNoYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqICAKKworCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RGVmYXVsdEZldGNoKCkgeworCQlyZXR1cm4gREVGQVVMVF9GRVRDSF9UWVBFOworCX0KKworCisJLy8gKioqKioqKioqKiBtYXAga2V5ICoqKioqKioqKiogIAorCisJcHVibGljIFN0cmluZyBnZXRNYXBLZXkoKSB7CisJCWlmICh0aGlzLm5vTWFwS2V5KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAodGhpcy5wa01hcEtleSkgeworCQkJcmV0dXJuIHRoaXMuZ2V0VGFyZ2V0RW50aXR5SWRBdHRyaWJ1dGVOYW1lKCk7CisJCX0KKwkJaWYgKHRoaXMuY3VzdG9tTWFwS2V5KSB7CisJCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRNYXBLZXk7CisJCX0KKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBtYXAga2V5Iik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZE1hcEtleSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWFwS2V5OworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE1hcEtleShTdHJpbmcgbWFwS2V5KSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZE1hcEtleTsKKwkJdGhpcy5zcGVjaWZpZWRNYXBLZXkgPSBtYXBLZXk7CisJCU1hcEtleUFubm90YXRpb24gbWFwS2V5QW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwS2V5QW5ub3RhdGlvbigpOworCQlpZiAobWFwS2V5ID09IG51bGwpIHsKKwkJCWlmIChtYXBLZXlBbm5vdGF0aW9uICE9IG51bGwpIHsKKwkJCQl0aGlzLnJlbW92ZU1hcEtleUFubm90YXRpb24oKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChtYXBLZXlBbm5vdGF0aW9uID09IG51bGwpIHsKKwkJCQltYXBLZXlBbm5vdGF0aW9uID0gdGhpcy5hZGRNYXBLZXlBbm5vdGF0aW9uKCk7CisJCQl9CisJCQltYXBLZXlBbm5vdGF0aW9uLnNldE5hbWUobWFwS2V5KTsKKwkJfQorCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01BUF9LRVlfUFJPUEVSVFksIG9sZCwgbWFwS2V5KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRNYXBLZXlfKFN0cmluZyBtYXBLZXkpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkTWFwS2V5OworCQl0aGlzLnNwZWNpZmllZE1hcEtleSA9IG1hcEtleTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9NQVBfS0VZX1BST1BFUlRZLCBvbGQsIG1hcEtleSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hcEtleSgpIHsKKwkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXlBbm5vdGF0aW9uID0gdGhpcy5nZXRNYXBLZXlBbm5vdGF0aW9uKCk7CisJCWlmIChtYXBLZXlBbm5vdGF0aW9uID09IG51bGwpIHsKKwkJCXRoaXMubm9NYXBLZXkgPSB0cnVlOworCQl9IGVsc2UgeworCQkJdGhpcy5zcGVjaWZpZWRNYXBLZXkgPSBtYXBLZXlBbm5vdGF0aW9uLmdldE5hbWUoKTsKKwkJCWlmICh0aGlzLnNwZWNpZmllZE1hcEtleSA9PSBudWxsKSB7CisJCQkJdGhpcy5wa01hcEtleSA9IHRydWU7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuY3VzdG9tTWFwS2V5ID0gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1hcEtleSgpIHsKKwkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXlBbm5vdGF0aW9uID0gdGhpcy5nZXRNYXBLZXlBbm5vdGF0aW9uKCk7CisJCWlmIChtYXBLZXlBbm5vdGF0aW9uID09IG51bGwpIHsKKwkJCXRoaXMuc2V0U3BlY2lmaWVkTWFwS2V5XyhudWxsKTsKKwkJCXRoaXMuc2V0Tm9NYXBLZXlfKHRydWUpOworCQkJdGhpcy5zZXRQa01hcEtleV8oZmFsc2UpOworCQkJdGhpcy5zZXRDdXN0b21NYXBLZXlfKGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBtayA9IG1hcEtleUFubm90YXRpb24uZ2V0TmFtZSgpOworCQkJdGhpcy5zZXRTcGVjaWZpZWRNYXBLZXlfKG1rKTsKKwkJCXRoaXMuc2V0Tm9NYXBLZXlfKGZhbHNlKTsKKwkJCXRoaXMuc2V0UGtNYXBLZXlfKG1rID09IG51bGwpOworCQkJdGhpcy5zZXRDdXN0b21NYXBLZXlfKG1rICE9IG51bGwpOworCQl9CisJfQorCisJcHJvdGVjdGVkIE1hcEtleUFubm90YXRpb24gZ2V0TWFwS2V5QW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIChNYXBLZXlBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCX0KKworCXByb3RlY3RlZCBNYXBLZXlBbm5vdGF0aW9uIGFkZE1hcEtleUFubm90YXRpb24oKSB7CisJCXJldHVybiAoTWFwS2V5QW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNYXBLZXlBbm5vdGF0aW9uKCkgeworCQl0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCX0KIAogCXByb3RlY3RlZCBib29sZWFuIG1hcEtleU5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmIChnZXRNYXBLZXlSZXNvdXJjZShnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE1hcEtleVJlc291cmNlKGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKS5uYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOworCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleUFubm90YXRpb24gPSB0aGlzLmdldE1hcEtleUFubm90YXRpb24oKTsKKwkJcmV0dXJuIChtYXBLZXlBbm5vdGF0aW9uICE9IG51bGwpICYmIG1hcEtleUFubm90YXRpb24ubmFtZVRvdWNoZXMocG9zLCBhc3RSb290KTsKKwl9CisKKworCS8vICoqKioqKioqKiogbm8gbWFwIGtleSAqKioqKioqKioqICAKKworCXB1YmxpYyBib29sZWFuIGlzTm9NYXBLZXkoKSB7CisJCXJldHVybiB0aGlzLm5vTWFwS2V5OworCX0KKworCXB1YmxpYyB2b2lkIHNldE5vTWFwS2V5KGJvb2xlYW4gbm9NYXBLZXkpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLm5vTWFwS2V5OworCQl0aGlzLm5vTWFwS2V5ID0gbm9NYXBLZXk7CisJCWlmIChub01hcEtleSkgeworCQkJaWYgKHRoaXMuZ2V0TWFwS2V5QW5ub3RhdGlvbigpICE9IG51bGwpIHsKKwkJCQl0aGlzLnJlbW92ZU1hcEtleUFubm90YXRpb24oKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIHRoZSAnbm9NYXBLZXknIGZsYWcgaXMgY2xlYXJlZCBhcyBhCisJCQkvLyBzaWRlLWVmZmVjdCBvZiBzZXR0aW5nIHRoZSBvdGhlciBmbGFncywKKwkJCS8vIHZpYSBhIGNhbGwgdG8gI3NldE5vTWFwS2V5Xyhib29sZWFuKQogCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcEtleUFubm90YXRpb24gZ2V0TWFwS2V5UmVzb3VyY2UoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOT19NQVBfS0VZX1BST1BFUlRZLCBvbGQsIG5vTWFwS2V5KTsKIAl9CiAKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBLZXlOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuYWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTmFtZXMoKTsKKwlwcm90ZWN0ZWQgdm9pZCBzZXROb01hcEtleV8oYm9vbGVhbiBub01hcEtleSkgeworCQlib29sZWFuIG9sZCA9IHRoaXMubm9NYXBLZXk7CisJCXRoaXMubm9NYXBLZXkgPSBub01hcEtleTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PX01BUF9LRVlfUFJPUEVSVFksIG9sZCwgbm9NYXBLZXkpOwkKIAl9CiAKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBLZXlOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odGhpcy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpLCBmaWx0ZXIpOworCisJLy8gKioqKioqKioqKiBwayBtYXAga2V5ICoqKioqKioqKiogIAorCisJcHVibGljIGJvb2xlYW4gaXNQa01hcEtleSgpIHsKKwkJcmV0dXJuIHRoaXMucGtNYXBLZXk7CiAJfQogCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gcXVvdGVkQ2FuZGlkYXRlTWFwS2V5TmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5xdW90ZSh0aGlzLmNhbmRpZGF0ZU1hcEtleU5hbWVzKGZpbHRlcikpOworCXB1YmxpYyB2b2lkIHNldFBrTWFwS2V5KGJvb2xlYW4gcGtNYXBLZXkpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLnBrTWFwS2V5OworCQl0aGlzLnBrTWFwS2V5ID0gcGtNYXBLZXk7CisJCU1hcEtleUFubm90YXRpb24gbWFwS2V5QW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwS2V5QW5ub3RhdGlvbigpOworCQlpZiAocGtNYXBLZXkpIHsKKwkJCWlmIChtYXBLZXlBbm5vdGF0aW9uID09IG51bGwpIHsKKwkJCQl0aGlzLmFkZE1hcEtleUFubm90YXRpb24oKTsKKwkJCX0gZWxzZSB7CisJCQkJbWFwS2V5QW5ub3RhdGlvbi5zZXROYW1lKG51bGwpOworCQkJfQorCQl9IGVsc2UgeworCQkJLy8gdGhlICdwa01hcEtleScgZmxhZyBpcyBjbGVhcmVkIGFzIGEKKwkJCS8vIHNpZGUtZWZmZWN0IG9mIHNldHRpbmcgdGhlIG90aGVyIGZsYWdzLAorCQkJLy8gdmlhIGEgY2FsbCB0byAjc2V0UGtNYXBLZXlfKGJvb2xlYW4pCisJCX0KKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBLX01BUF9LRVlfUFJPUEVSVFksIG9sZCwgcGtNYXBLZXkpOwogCX0KIAorCXByb3RlY3RlZCB2b2lkIHNldFBrTWFwS2V5Xyhib29sZWFuIHBrTWFwS2V5KSB7CisJCWJvb2xlYW4gb2xkID0gdGhpcy5wa01hcEtleTsKKwkJdGhpcy5wa01hcEtleSA9IHBrTWFwS2V5OworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEtfTUFQX0tFWV9QUk9QRVJUWSwgb2xkLCBwa01hcEtleSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIGN1c3RvbSBtYXAga2V5ICoqKioqKioqKiogIAorCisJcHVibGljIGJvb2xlYW4gaXNDdXN0b21NYXBLZXkoKSB7CisJCXJldHVybiB0aGlzLmN1c3RvbU1hcEtleTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDdXN0b21NYXBLZXkoYm9vbGVhbiBjdXN0b21NYXBLZXkpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLmN1c3RvbU1hcEtleTsKKwkJdGhpcy5jdXN0b21NYXBLZXkgPSBjdXN0b21NYXBLZXk7CisJCWlmIChjdXN0b21NYXBLZXkpIHsKKwkJCXRoaXMuc2V0U3BlY2lmaWVkTWFwS2V5KCIiKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJLy8gdGhlICdjdXN0b21NYXBLZXknIGZsYWcgaXMgY2xlYXJlZCBhcyBhCisJCQkvLyBzaWRlLWVmZmVjdCBvZiBzZXR0aW5nIHRoZSBvdGhlciBmbGFncywKKwkJCS8vIHZpYSBhIGNhbGwgdG8gI3NldEN1c3RvbU1hcEtleV8oYm9vbGVhbikKKwkJfQorCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ1VTVE9NX01BUF9LRVlfUFJPUEVSVFksIG9sZCwgY3VzdG9tTWFwS2V5KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21NYXBLZXlfKGJvb2xlYW4gY3VzdG9tTWFwS2V5KSB7CisJCWJvb2xlYW4gb2xkID0gdGhpcy5jdXN0b21NYXBLZXk7CisJCXRoaXMuY3VzdG9tTWFwS2V5ID0gY3VzdG9tTWFwS2V5OworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ1VTVE9NX01BUF9LRVlfUFJPUEVSVFksIG9sZCwgY3VzdG9tTWFwS2V5KTsKKwl9CisKKworCS8vICoqKioqKioqKiogSmF2YSBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqICAKKwogCUBPdmVycmlkZQogCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKIAkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CiAJCWlmIChyZXN1bHQgIT0gbnVsbCkgewogCQkJcmV0dXJuIHJlc3VsdDsKIAkJfQotCQlyZXN1bHQgPSB0aGlzLmdldEpvaW5UYWJsZSgpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWlmICh0aGlzLm1hcHBlZEJ5VG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gdGhpcy5xdW90ZWRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKGZpbHRlcik7Ci0JCX0KIAkJaWYgKHRoaXMubWFwS2V5TmFtZVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmV0dXJuIHRoaXMucXVvdGVkQ2FuZGlkYXRlTWFwS2V5TmFtZXMoZmlsdGVyKTsKKwkJCXJldHVybiB0aGlzLmphdmFDYW5kaWRhdGVNYXBLZXlOYW1lcyhmaWx0ZXIpOwogCQl9CiAJCXJldHVybiBudWxsOwogCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tUmVzb3VyY2UocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSB0aGlzLmdldE1hcEtleVJlc291cmNlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCWlmIChtYXBLZXkgIT0gbnVsbCkgewotCQkJdGhpcy5tYXBLZXkgPSBtYXBLZXkuZ2V0TmFtZSgpOwotCQl9Ci0JCXRoaXMuaW5pdGlhbGl6ZU9yZGVyQnkodGhpcy5nZXRPcmRlckJ5UmVzb3VyY2UoKSk7Ci0JCXRoaXMuam9pblRhYmxlLmluaXRpYWxpemVGcm9tUmVzb3VyY2UocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShUIHJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShyZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQkJdGhpcy5tYXBwZWRCeSA9IHRoaXMubWFwcGVkQnkocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcmRlckJ5KE9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkpIHsKLQkJaWYgKG9yZGVyQnkgIT0gbnVsbCkgewotCQkJdGhpcy5vcmRlckJ5ID0gb3JkZXJCeS5nZXRWYWx1ZSgpOwotCQkJaWYgKG9yZGVyQnkuZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5pc1BrT3JkZXJpbmcgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5pc0N1c3RvbU9yZGVyaW5nID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuaXNOb09yZGVyaW5nID0gdHJ1ZTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJc3VwZXIudXBkYXRlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMudXBkYXRlTWFwS2V5KHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMudXBkYXRlT3JkZXJCeSh0aGlzLmdldE9yZGVyQnlSZXNvdXJjZSgpKTsKLQkJdGhpcy5qb2luVGFibGUudXBkYXRlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoVCByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXN1cGVyLnVwZGF0ZShyZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQkJdGhpcy5zZXRNYXBwZWRCeV8odGhpcy5tYXBwZWRCeShyZWxhdGlvbnNoaXBNYXBwaW5nKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1hcEtleShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IHRoaXMuZ2V0TWFwS2V5UmVzb3VyY2UocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJaWYgKG1hcEtleSAhPSBudWxsKSB7Ci0JCQlzZXRNYXBLZXlfKG1hcEtleS5nZXROYW1lKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0TWFwS2V5XyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPcmRlckJ5KE9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkpIHsKLQkJaWYgKG9yZGVyQnkgIT0gbnVsbCkgewotCQkJc2V0T3JkZXJCeV8ob3JkZXJCeS5nZXRWYWx1ZSgpKTsKLQkJCWlmIChvcmRlckJ5LmdldFZhbHVlKCkgPT0gbnVsbCkgewotCQkJCXNldFBrT3JkZXJpbmdfKHRydWUpOwotCQkJCXNldEN1c3RvbU9yZGVyaW5nXyhmYWxzZSk7Ci0JCQkJc2V0Tm9PcmRlcmluZ18oZmFsc2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0UGtPcmRlcmluZ18oZmFsc2UpOwotCQkJCXNldEN1c3RvbU9yZGVyaW5nXyh0cnVlKTsKLQkJCQlzZXROb09yZGVyaW5nXyhmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRPcmRlckJ5XyhudWxsKTsKLQkJCXNldFBrT3JkZXJpbmdfKGZhbHNlKTsKLQkJCXNldEN1c3RvbU9yZGVyaW5nXyhmYWxzZSk7Ci0JCQlzZXROb09yZGVyaW5nXyh0cnVlKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIG1hcHBlZEJ5KFQgcmVsYXRpb25zaGlwTWFwcGluZyk7CiAKLQkvLyoqKioqKioqIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgYWJzdHJhY3QgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ2FuZGlkYXRlTWFwS2V5TmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5jYW5kaWRhdGVNYXBLZXlOYW1lcyhmaWx0ZXIpKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBLZXlOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKKwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odGhpcy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpLCBmaWx0ZXIpOworCX0KKworCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZU1hcEtleU5hbWVzKCkgeworCQlyZXR1cm4gdGhpcy5hbGxUYXJnZXRFbnRpdHlBdHRyaWJ1dGVOYW1lcygpOworCX0KKworCisJLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKiAgCisKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJCi0JCWlmIChlbnRpdHlPd25lZCgpICYmICh0aGlzLmlzSm9pblRhYmxlU3BlY2lmaWVkKCkgfHwgaXNSZWxhdGlvbnNoaXBPd25lcigpKSkgewotCQkJZ2V0Sm9pblRhYmxlKCkuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0TWFwcGVkQnkoKSAhPSBudWxsKSB7Ci0JCQlhZGRNYXBwZWRCeU1lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldE1ldGFtb2RlbEZpZWxkVHlwZU5hbWUoKSB7CisJCXJldHVybiAoKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wKSB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkuZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcykgeworCQl0aGlzLmFkZE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZUFyZ3VtZW50TmFtZVRvKHR5cGVBcmd1bWVudE5hbWVzKTsKKwkJc3VwZXIuYWRkTWV0YW1vZGVsRmllbGRUeXBlQXJndW1lbnROYW1lc1RvKHR5cGVBcmd1bWVudE5hbWVzKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRhbW9kZWxGaWVsZE1hcEtleVR5cGVBcmd1bWVudE5hbWVUbyhBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcykgeworCQlTdHJpbmcga2V5VHlwZU5hbWUgPSAoKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wKSB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkuZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRNYXBLZXlUeXBlTmFtZSgpOworCQlpZiAoa2V5VHlwZU5hbWUgIT0gbnVsbCkgeworCQkJdHlwZUFyZ3VtZW50TmFtZXMuYWRkKGtleVR5cGVOYW1lKTsKIAkJfQogCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYXBwZWRCeU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmcgbWFwcGVkQnkgPSB0aGlzLmdldE1hcHBlZEJ5KCk7Ci0JCQotCQlpZiAodGhpcy5pc0pvaW5UYWJsZVNwZWNpZmllZCgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX01BUFBFRF9CWV9XSVRIX0pPSU5fVEFCTEUsCi0JCQkJCQl0aGlzLmdldEpvaW5UYWJsZSgpLCAKLQkJCQkJCXRoaXMuZ2V0Sm9pblRhYmxlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJCQkJCi0JCX0KLQkJCi0JCUVudGl0eSB0YXJnZXRFbnRpdHkgPSB0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCQotCQlpZiAodGFyZ2V0RW50aXR5ID09IG51bGwpIHsKLQkJCS8vIGFscmVhZHkgaGF2ZSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvciB0aGF0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gdGFyZ2V0RW50aXR5LmdldFBlcnNpc3RlbnRUeXBlKCkucmVzb2x2ZUF0dHJpYnV0ZShtYXBwZWRCeSk7Ci0JCQotCQlpZiAoYXR0cmlidXRlID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfVU5SRVNPTFZFRF9NQVBQRURfQlksCi0JCQkJCQluZXcgU3RyaW5nW10ge21hcHBlZEJ5fSwgCi0JCQkJCQl0aGlzLCAKLQkJCQkJCXRoaXMuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCEgdGhpcy5tYXBwZWRCeUlzVmFsaWQoYXR0cmlidXRlLmdldE1hcHBpbmcoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfSU5WQUxJRF9NQVBQRURfQlksCi0JCQkJCQluZXcgU3RyaW5nW10ge21hcHBlZEJ5fSwgCi0JCQkJCQl0aGlzLCAKLQkJCQkJCXRoaXMuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTm9uT3duaW5nTWFwcGluZyBtYXBwZWRCeU1hcHBpbmc7Ci0JCXRyeSB7Ci0JCQltYXBwZWRCeU1hcHBpbmcgPSAoTm9uT3duaW5nTWFwcGluZykgYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgewotCQkJLy8gdGhlcmUgaXMgbm8gZXJyb3IgdGhlbgotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAobWFwcGVkQnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkgIT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19NQVBQRURfQllfT05fQk9USF9TSURFUywKLQkJCQkJCXRoaXMsIAotCQkJCQkJdGhpcy5nZXRNYXBwZWRCeVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZU5hbWUoKSB7CisJCXJldHVybiBNYXBwaW5nVG9vbHMuZ2V0TWV0YW1vZGVsRmllbGRNYXBLZXlUeXBlTmFtZSh0aGlzKTsKIAl9CisKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW4uamF2YQppbmRleCA0ZTgwMzYzLi4xMjNkZDVmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU5hbWVkQ29sdW1uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFOYW1lZENvbHVtbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTQzLDE5ICs0MywxOSBAQAogCiAJLy8gKioqKioqKioqKioqKioqKioqKiBpbml0aWFsaXphdGlvbiBmcm9tIGphdmEgcmVzb3VyY2UgbW9kZWwgKioqKioqKioqKioqKioqKioqKioKIAkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKFQgY29sdW1uKSB7CisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShUIGNvbHVtbikgewogCQl0aGlzLnNwZWNpZmllZE5hbWUgPSBjb2x1bW4uZ2V0TmFtZSgpOwotCQl0aGlzLmRlZmF1bHROYW1lID0gdGhpcy5kZWZhdWx0TmFtZSgpOworCQl0aGlzLmRlZmF1bHROYW1lID0gdGhpcy5idWlsZERlZmF1bHROYW1lKCk7CiAJCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCk7CQogCX0KIAkKIAotCXByb3RlY3RlZCBhYnN0cmFjdCBUIGdldENvbHVtblJlc291cmNlKCk7CisJcHJvdGVjdGVkIGFic3RyYWN0IFQgZ2V0UmVzb3VyY2VDb2x1bW4oKTsKIAogCQogCS8vKioqKioqKioqKioqKiogSU5hbWVkQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdE5hbWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkTmFtZSgpOworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTmFtZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkTmFtZSA6IHRoaXMuZGVmYXVsdE5hbWU7CiAJfQogCiAJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWROYW1lKCkgewpAQCAtNjUsNyArNjUsNyBAQAogCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKIAkJU3RyaW5nIG9sZFNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWU7CiAJCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5ld1NwZWNpZmllZE5hbWU7Ci0JCWdldENvbHVtblJlc291cmNlKCkuc2V0TmFtZShuZXdTcGVjaWZpZWROYW1lKTsKKwkJZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXROYW1lKG5ld1NwZWNpZmllZE5hbWUpOwogCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5hbWVkQ29sdW1uLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWROYW1lLCBuZXdTcGVjaWZpZWROYW1lKTsKIAl9CiAJCkBAIC05OCw3ICs5OCw3IEBACiAJcHVibGljIHZvaWQgc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcgbmV3Q29sdW1uRGVmaW5pdGlvbikgewogCQlTdHJpbmcgb2xkQ29sdW1uRGVmaW5pdGlvbiA9IHRoaXMuY29sdW1uRGVmaW5pdGlvbjsKIAkJdGhpcy5jb2x1bW5EZWZpbml0aW9uID0gbmV3Q29sdW1uRGVmaW5pdGlvbjsKLQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRDb2x1bW5EZWZpbml0aW9uKG5ld0NvbHVtbkRlZmluaXRpb24pOworCQlnZXRSZXNvdXJjZUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obmV3Q29sdW1uRGVmaW5pdGlvbik7CiAJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTmFtZWRDb2x1bW4uQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFksIG9sZENvbHVtbkRlZmluaXRpb24sIG5ld0NvbHVtbkRlZmluaXRpb24pOwogCX0KIAkKQEAgLTExOSwxNyArMTE5LDE3IEBACiAJfQogCiAJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldENvbHVtblJlc291cmNlKCkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKKwkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwogCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0T3duZXIoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwogCX0KIAogCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtblJlc291cmNlKCkubmFtZVRvdWNoZXMocG9zLCBhc3RSb290KTsKKwkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKS5uYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwogCX0KIAkKIAlwdWJsaWMgQ29sdW1uIGdldERiQ29sdW1uKCkgewogCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGJUYWJsZSgpOwotCQlyZXR1cm4gKHRhYmxlID09IG51bGwpID8gbnVsbCA6IHRhYmxlLmNvbHVtbk5hbWVkKHRoaXMuZ2V0TmFtZSgpKTsKKwkJcmV0dXJuICh0YWJsZSA9PSBudWxsKSA/IG51bGwgOiB0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKHRoaXMuZ2V0TmFtZSgpKTsKIAl9CiAKIAlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZSgpIHsKQEAgLTE1MiwyMiArMTUyLDI3IEBACiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9CiAJCWlmICh0aGlzLm5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLnF1b3RlZENhbmRpZGF0ZU5hbWVzKGZpbHRlcik7CisJCQlyZXR1cm4gdGhpcy5qYXZhQ2FuZGlkYXRlTmFtZXMoZmlsdGVyKTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlTmFtZXMoKSB7Ci0JCVRhYmxlIGRiVGFibGUgPSB0aGlzLmdldERiVGFibGUoKTsKLQkJcmV0dXJuIChkYlRhYmxlICE9IG51bGwpID8gZGJUYWJsZS5jb2x1bW5OYW1lcygpIDogRW1wdHlJdGVyYXRvci48U3RyaW5nPiBpbnN0YW5jZSgpOworCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ2FuZGlkYXRlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5jYW5kaWRhdGVOYW1lcyhmaWx0ZXIpKTsKIAl9CiAKIAlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CiAJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2FuZGlkYXRlTmFtZXMoKSwgZmlsdGVyKTsKIAl9CiAKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gcXVvdGVkQ2FuZGlkYXRlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5xdW90ZSh0aGlzLmNhbmRpZGF0ZU5hbWVzKGZpbHRlcikpOworCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVOYW1lcygpIHsKKwkJVGFibGUgZGJUYWJsZSA9IHRoaXMuZ2V0RGJUYWJsZSgpOworCQlyZXR1cm4gKGRiVGFibGUgIT0gbnVsbCkgPyBkYlRhYmxlLnNvcnRlZENvbHVtbklkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+IGluc3RhbmNlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5nZXROYW1lKCkpOwogCX0KIAkKIAkKQEAgLTE3NSwxNCArMTgwLDE0IEBACiAKIAlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoVCBjb2x1bW4pIHsKIAkJdGhpcy5zZXRTcGVjaWZpZWROYW1lXyhjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0TmFtZSh0aGlzLmRlZmF1bHROYW1lKCkpOworCQl0aGlzLnNldERlZmF1bHROYW1lKHRoaXMuYnVpbGREZWZhdWx0TmFtZSgpKTsKIAkJdGhpcy5zZXRDb2x1bW5EZWZpbml0aW9uXyhjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKIAl9CiAJCiAJLyoqCiAJICogUmV0dXJuIHRoZSBkZWZhdWx0IGNvbHVtbiBuYW1lLgogCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWUoKSB7CisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHROYW1lKCkgewogCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldERlZmF1bHRDb2x1bW5OYW1lKCk7CiAJfQogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU9uZVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhT25lVG9NYW55TWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNjM4M2UKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU9uZVRvTWFueU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLkpwYUZhY3RvcnkyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKKworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhT25lVG9NYW55TWFwcGluZzxUIGV4dGVuZHMgT25lVG9NYW55QW5ub3RhdGlvbj4KKwlleHRlbmRzIEFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzxUPgorCWltcGxlbWVudHMgSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAsIEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wCit7CisJcHJvdGVjdGVkIGZpbmFsIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgb3JwaGFuUmVtb3ZhbDsKKwkKKwlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhT25lVG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5vcnBoYW5SZW1vdmFsID0gKChKcGFGYWN0b3J5Ml8wKSB0aGlzLmdldEpwYUZhY3RvcnkoKSkuYnVpbGRKYXZhT3JwaGFuUmVtb3ZhbCh0aGlzKTsKKwl9CisKKwkvLyAqKioqKioqKioqIGluaXRpYWxpemUvdXBkYXRlICoqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisJCXRoaXMub3JwaGFuUmVtb3ZhbC5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLm9ycGhhblJlbW92YWwudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmdbXSBidWlsZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7CisJCXJldHVybiBBcnJheVRvb2xzLmFkZEFsbCgKKwkJCXN1cGVyLmJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAorCQkJSlBBLkpPSU5fQ09MVU1OLAorCQkJSlBBLkpPSU5fQ09MVU1OUyk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKworCS8vICoqKioqKioqKiogSmF2YU9uZVRvTWFueU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIFQgZ2V0TWFwcGluZ0Fubm90YXRpb24oKSB7CisJCXJldHVybiBzdXBlci5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiAoSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgc3VwZXIuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CisJfQorCisJLy8gKioqKioqKioqKiBKYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBnZXRPcnBoYW5SZW1vdmFsKCkgeworCQlyZXR1cm4gdGhpcy5vcnBoYW5SZW1vdmFsOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ODZiODQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWV4dGVuZHMgQWJzdHJhY3RKYXZhUmVsYXRpb25zaGlwUmVmZXJlbmNlCisJaW1wbGVtZW50cyBKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisJcHJvdGVjdGVkIGZpbmFsIEphdmFNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSBtYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSBqb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CisJCisJCisJcHJvdGVjdGVkIEFic3RyYWN0SmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZShKYXZhT25lVG9NYW55TWFwcGluZyBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneSA9IGJ1aWxkTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKTsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgPSBidWlsZEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IGJ1aWxkTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSh0aGlzKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgYnVpbGRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kodGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhT25lVG9NYW55TWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBnZXRQYXJlbnQoKTsKKwl9CisJCisJcHVibGljIE9uZVRvTWFueUFubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb24oKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNSZWxhdGlvbnNoaXBPd25lcigpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpID09IG51bGw7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzT3duZWRCeShSZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmcpIHsKKwkJcmV0dXJuIHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kucmVsYXRpb25zaGlwSXNPd25lZEJ5KG1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCXJlc3VsdCA9IHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQl9CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJcmVzdWx0ID0gdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogbWFwcGVkIGJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgSmF2YU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IGdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuYWRkU3RyYXRlZ3koKTsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIHZvaWQgdW5zZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiB1c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiB0aGlzLmdldFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgPT0gdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gbWF5QmVNYXBwZWRCeShBdHRyaWJ1dGVNYXBwaW5nIG1hcHBlZEJ5TWFwcGluZykgeworCQlyZXR1cm4gbWFwcGVkQnlNYXBwaW5nLmdldEtleSgpID09IE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBqb2luIHRhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBKYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5IGdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiB1c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gZ2V0UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSA9PSB0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkgeworCQkvLyBqb2luIHRhYmxlIGlzIGRlZmF1bHQsIHNvIG5vIG5lZWQgdG8gYWRkIGFubm90YXRpb24KKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1bnNldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luVGFibGUoKSB7CisJCXJldHVybiB0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkgPT0gbnVsbDsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZSA9PiBjb250ZXh0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luaW5nU3RyYXRlZ2llcygpIHsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5pbml0aWFsaXplKCk7CisJCXRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5LmluaXRpYWxpemUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlSm9pbmluZ1N0cmF0ZWdpZXMoKSB7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kudXBkYXRlKCk7CisJCXRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5LnVwZGF0ZSgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhT25lVG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU9uZVRvT25lTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NTNkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU9uZVRvT25lTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5KcGFGYWN0b3J5Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFPbmVUb09uZU1hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc8T25lVG9PbmVBbm5vdGF0aW9uPgorCWltcGxlbWVudHMgSmF2YU9uZVRvT25lTWFwcGluZzJfMCwgSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzAKK3sKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBvcnBoYW5SZW1vdmFsOworCQorCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgorCXByb3RlY3RlZCBBYnN0cmFjdEphdmFPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMub3JwaGFuUmVtb3ZhbCA9ICgoSnBhRmFjdG9yeTJfMCkgdGhpcy5nZXRKcGFGYWN0b3J5KCkpLmJ1aWxkSmF2YU9ycGhhblJlbW92YWwodGhpcyk7CisJfQorCisJLy8gKioqKioqKioqKiBpbml0aWFsaXplL3VwZGF0ZSAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZSgpOworCQl0aGlzLm9ycGhhblJlbW92YWwuaW5pdGlhbGl6ZSh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5vcnBoYW5SZW1vdmFsLnVwZGF0ZSh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSmF2YVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBidWlsZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlKHRoaXMpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ1tdIGJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKKwkJcmV0dXJuIEFycmF5VG9vbHMuYWRkQWxsKAorCQkJc3VwZXIuYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCisJCQlKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sCisJCQlKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEJvb2xlYW4gZ2V0UmVzb3VyY2VPcHRpb25hbCgpIHsKKwkJcmV0dXJuIHRoaXMubWFwcGluZ0Fubm90YXRpb24uZ2V0T3B0aW9uYWwoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0UmVzb3VyY2VPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKSB7CisJCXRoaXMubWFwcGluZ0Fubm90YXRpb24uc2V0T3B0aW9uYWwobmV3T3B0aW9uYWwpOworCX0KKworCS8vICoqKioqKioqKiogSmF2YU9uZVRvT25lTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIE9uZVRvT25lQW5ub3RhdGlvbiBnZXRNYXBwaW5nQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIHN1cGVyLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gKEphdmFPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgc3VwZXIuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CisJfQorCisJLy8gKioqKioqKioqKiBKYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBnZXRPcnBoYW5SZW1vdmFsKCkgeworCQlyZXR1cm4gdGhpcy5vcnBoYW5SZW1vdmFsOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU92ZXJyaWRlLmphdmEKaW5kZXggYjljMzgyNC4uY2EwN2IwOSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFPdmVycmlkZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhT3ZlcnJpZGUuamF2YQpAQCAtMjcsMjAgKzI3LDIwIEBACiAKIAlwcm90ZWN0ZWQgZmluYWwgT3duZXIgb3duZXI7CiAKLQlwcm90ZWN0ZWQgT3ZlcnJpZGVBbm5vdGF0aW9uIG92ZXJyaWRlUmVzb3VyY2U7CisJcHJvdGVjdGVkIE92ZXJyaWRlQW5ub3RhdGlvbiBvdmVycmlkZUFubm90YXRpb247CiAJCiAJcHVibGljIEFic3RyYWN0SmF2YU92ZXJyaWRlKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIE93bmVyIG93bmVyKSB7CiAJCXN1cGVyKHBhcmVudCk7CiAJCXRoaXMub3duZXIgPSBvd25lcjsKIAl9CiAJCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShPdmVycmlkZUFubm90YXRpb24gb3ZlcnJpZGVSZXNvdXJjZSkgewotCQl0aGlzLm92ZXJyaWRlUmVzb3VyY2UgPSBvdmVycmlkZVJlc291cmNlOwotCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUob3ZlcnJpZGVSZXNvdXJjZSk7CisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShPdmVycmlkZUFubm90YXRpb24gb3ZlcnJpZGVBbm5vdGF0aW9uKSB7CisJCXRoaXMub3ZlcnJpZGVBbm5vdGF0aW9uID0gb3ZlcnJpZGVBbm5vdGF0aW9uOworCQl0aGlzLm5hbWUgPSB0aGlzLmdldFJlc291cmNlTmFtZShvdmVycmlkZUFubm90YXRpb24pOwogCX0KIAotCXByb3RlY3RlZCBPdmVycmlkZUFubm90YXRpb24gZ2V0T3ZlcnJpZGVSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGVSZXNvdXJjZTsKKwlwcm90ZWN0ZWQgT3ZlcnJpZGVBbm5vdGF0aW9uIGdldE92ZXJyaWRlQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMub3ZlcnJpZGVBbm5vdGF0aW9uOwogCX0KIAkKIAlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CkBAIC01MCw3ICs1MCw3IEBACiAJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewogCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKIAkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJdGhpcy5vdmVycmlkZVJlc291cmNlLnNldE5hbWUobmV3TmFtZSk7CisJCXRoaXMub3ZlcnJpZGVBbm5vdGF0aW9uLnNldE5hbWUobmV3TmFtZSk7CiAJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7CiAJfQogCQpAQCAtNjEsMTIgKzYxLDEyIEBACiAJfQogCiAJcHJvdGVjdGVkIHZvaWQgdXBkYXRlKE92ZXJyaWRlQW5ub3RhdGlvbiBvdmVycmlkZVJlc291cmNlKSB7Ci0JCXRoaXMub3ZlcnJpZGVSZXNvdXJjZSA9IG92ZXJyaWRlUmVzb3VyY2U7Ci0JCXRoaXMuc2V0TmFtZV8odGhpcy5uYW1lKG92ZXJyaWRlUmVzb3VyY2UpKTsKKwkJdGhpcy5vdmVycmlkZUFubm90YXRpb24gPSBvdmVycmlkZVJlc291cmNlOworCQl0aGlzLnNldE5hbWVfKHRoaXMuZ2V0UmVzb3VyY2VOYW1lKG92ZXJyaWRlUmVzb3VyY2UpKTsKIAl9CiAKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUoT3ZlcnJpZGVBbm5vdGF0aW9uIG92ZXJyaWRlUmVzb3VyY2UpIHsKLQkJcmV0dXJuIG92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpOworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKE92ZXJyaWRlQW5ub3RhdGlvbiBvdmVycmlkZUFubm90YXRpb24pIHsKKwkJcmV0dXJuIG92ZXJyaWRlQW5ub3RhdGlvbi5nZXROYW1lKCk7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewpAQCAtOTIsOCArOTIsOCBAQAogCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPih0aGlzLmNhbmRpZGF0ZU5hbWVzKCksIGZpbHRlcik7CiAJfQogCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IHF1b3RlZENhbmRpZGF0ZU5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMucXVvdGUodGhpcy5jYW5kaWRhdGVOYW1lcyhmaWx0ZXIpKTsKKwlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNhbmRpZGF0ZU5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgeworCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKHRoaXMuY2FuZGlkYXRlTmFtZXMoZmlsdGVyKSk7CiAJfQogCiAJQE92ZXJyaWRlCkBAIC0xMDMsMTcgKzEwMywxNyBAQAogCQkJcmV0dXJuIHJlc3VsdDsKIAkJfQogCQlpZiAodGhpcy5uYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gdGhpcy5xdW90ZWRDYW5kaWRhdGVOYW1lcyhmaWx0ZXIpOworCQkJcmV0dXJuIHRoaXMuamF2YUNhbmRpZGF0ZU5hbWVzKGZpbHRlcik7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCQogCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm92ZXJyaWRlUmVzb3VyY2UubmFtZVRvdWNoZXMocG9zLCBhc3RSb290KTsKKwkJcmV0dXJuIHRoaXMub3ZlcnJpZGVBbm5vdGF0aW9uLm5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCk7CiAJfQogCQogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5vdmVycmlkZVJlc291cmNlLmdldFRleHRSYW5nZShhc3RSb290KTsKKwkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMub3ZlcnJpZGVBbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKIAkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CiAJfQogCQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTcwMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw3MTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTdHJ1Y3R1cmVOb2RlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworLyoqCisgKiBjb21tb24gc3RhdGUvYmVoYXZpb3IgYmV0d2VlbiBHZW5lcmljIGFuZCBFY2xpcHNlTGluayBwZXJzaXN0ZW50IGF0dHJpYnV0ZXMKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUKKwlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCisJaW1wbGVtZW50cyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZQoreworCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKKworCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZyBkZWZhdWx0TWFwcGluZzsKKworCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZyBzcGVjaWZpZWRNYXBwaW5nOworCisJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZGVmYXVsdEFjY2VzczsKKworCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKKworCisJcHJvdGVjdGVkIEFic3RyYWN0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKKwkJdGhpcy5uYW1lID0gYnVpbGROYW1lKCk7CisJCXRoaXMuZGVmYXVsdE1hcHBpbmcgPSBidWlsZERlZmF1bHRNYXBwaW5nKCk7CisJCXRoaXMuc3BlY2lmaWVkTWFwcGluZyA9IGJ1aWxkU3BlY2lmaWVkTWFwcGluZygpOworCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSBidWlsZERlZmF1bHRBY2Nlc3MoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXRoaXMuc2V0TmFtZSh0aGlzLmJ1aWxkTmFtZSgpKTsKKwkJdGhpcy51cGRhdGVEZWZhdWx0TWFwcGluZygpOworCQl0aGlzLnVwZGF0ZVNwZWNpZmllZE1hcHBpbmcoKTsKKwkJdGhpcy5zZXREZWZhdWx0QWNjZXNzKHRoaXMuYnVpbGREZWZhdWx0QWNjZXNzKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHBvc3RVcGRhdGUoKSB7CisJCXN1cGVyLnBvc3RVcGRhdGUoKTsKKwkJZ2V0TWFwcGluZygpLnBvc3RVcGRhdGUoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogSnBhU3RydWN0dXJlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gSmF2YVN0cnVjdHVyZU5vZGVzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lEOworCX0KKworCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLmdldFNlbGVjdGlvblRleHRSYW5nZSh0aGlzLmJ1aWxkQVNUUm9vdCgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdCgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpLmJ1aWxkQVNUUm9vdCgpOworCX0KKworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vbm90aGluZyB0byBkaXNwb3NlCisJfQorCisKKwkvLyAqKioqKioqKioqIEFjY2Vzc0hvbGRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCUFjY2Vzc1R5cGUgYWNjZXNzID0gdGhpcy5nZXRTcGVjaWZpZWRBY2Nlc3MoKTsKKwkJcmV0dXJuIChhY2Nlc3MgIT0gbnVsbCkgPyBhY2Nlc3MgOiB0aGlzLmdldERlZmF1bHRBY2Nlc3MoKTsKKwl9CisKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXREZWZhdWx0QWNjZXNzKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWNjZXNzOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0QWNjZXNzKEFjY2Vzc1R5cGUgZGVmYXVsdEFjY2VzcykgeworCQlBY2Nlc3NUeXBlIG9sZCA9IHRoaXMuZGVmYXVsdEFjY2VzczsKKwkJdGhpcy5kZWZhdWx0QWNjZXNzID0gZGVmYXVsdEFjY2VzczsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUNDRVNTX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRBY2Nlc3MpOworCX0KKworCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGJ1aWxkRGVmYXVsdEFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmlzRmllbGQoKSA/IEFjY2Vzc1R5cGUuRklFTEQgOiBBY2Nlc3NUeXBlLlBST1BFUlRZOworCX0KKworCisJLy8gKioqKioqKioqKiBbSmF2YV1QZXJzaXN0ZW50QXR0cmlidXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworCX0KKworCXB1YmxpYyBQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7CisJfQorCisJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgeworCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0lkQXR0cmlidXRlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuaXNJZE1hcHBpbmcoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgb2Zmc2V0LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlUZXh0UmFuZ2UgZnVsbFRleHRSYW5nZSA9IHRoaXMuZ2V0RnVsbFRleHRSYW5nZShhc3RSb290KTsKKwkJLy8gJ2Z1bGxUZXh0UmFuZ2UnIHdpbGwgYmUgbnVsbCBpZiB0aGUgYXR0cmlidXRlIG5vIGxvbmdlciBleGlzdHMgaW4gdGhlIGphdmE7CisJCS8vIHRoZSBjb250ZXh0IG1vZGVsIGNhbiBiZSBvdXQgb2Ygc3luY2ggd2l0aCB0aGUgcmVzb3VyY2UgbW9kZWwKKwkJLy8gd2hlbiBhIHNlbGVjdGlvbiBldmVudCBvY2N1cnMgYmVmb3JlIHRoZSBjb250ZXh0IG1vZGVsIGhhcyBhCisJCS8vIGNoYW5jZSB0byBzeW5jaCB3aXRoIHRoZSByZXNvdXJjZSBtb2RlbCB2aWEgdGhlIHVwZGF0ZSB0aHJlYWQKKwkJcmV0dXJuIChmdWxsVGV4dFJhbmdlID09IG51bGwpID8gZmFsc2UgOiBmdWxsVGV4dFJhbmdlLmluY2x1ZGVzKG9mZnNldCk7CisJfQorCisJcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRGdWxsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorCisJcHVibGljIEVtYmVkZGFibGUgZ2V0RW1iZWRkYWJsZSgpIHsKKwkJU3RyaW5nIHR5cGVOYW1lID0gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0VHlwZU5hbWUoKTsKKwkJcmV0dXJuICh0eXBlTmFtZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVtYmVkZGFibGUodHlwZU5hbWUpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRmllbGQoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5pc0ZpZWxkKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmlzUHJvcGVydHkoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKKwkJcmV0dXJuIE1vZGlmaWVyLmlzUHVibGljKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1vZGlmaWVycygpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0ZpbmFsKCkgeworCQlyZXR1cm4gTW9kaWZpZXIuaXNGaW5hbCh0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNb2RpZmllcnMoKSk7CisJfQorCisJLy8gKioqKiogQmFzaWMgZGVmYXVsdHMKKwkvKioKKwkgKiBGcm9tIHRoZSBKUEEgc3BlYywgd2hlbiB0aGUgYmFzaWMgbWFwcGluZyBhcHBsaWVzOgorCSAqIElmIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZworCSAqIGl0IG11c3QgYmUgbWFwcGVkIGFzIEBCYXNpYzoKKwkgKiAgICAgYnl0ZVtdCisJICogICAgIGphdmEubGFuZy5CeXRlW10KKwkgKiAgICAgY2hhcltdCisJICogICAgIGphdmEubGFuZy5DaGFyYWN0ZXJbXQorCSAqICAgICBwcmltaXRpdmUgdHlwZXMgKGV4Y2VwdCAndm9pZCcpCisJICogICAgIHByaW1pdGl2ZSB3cmFwcGVycyAoZXhjZXB0ICdqYXZhLmxhbmcuVm9pZCcpCisJICogICAgIGphdmEubGFuZy5TdHJpbmcKKwkgKiAgICAgamF2YS5tYXRoLkJpZ0ludGVnZXIKKwkgKiAgICAgamF2YS5tYXRoLkJpZ0RlY2ltYWwKKwkgKiAgICAgamF2YS51dGlsLkRhdGUKKwkgKiAgICAgamF2YS51dGlsLkNhbGVuZGFyCisJICogICAgIGphdmEuc3FsLkRhdGUKKwkgKiAgICAgamF2YS5zcWwuVGltZQorCSAqICAgICBqYXZhLnNxbC5UaW1lc3RhbXAKKwkgKiAgICAgZW51bXMKKwkgKiAgICAgYW55IG90aGVyIHR5cGUgdGhhdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCisJICovCisJcHVibGljIGJvb2xlYW4gdHlwZUlzQmFzaWMoKSB7CisJCS8vICd0eXBlTmFtZScgbWF5IGluY2x1ZGUgYXJyYXkgYnJhY2tldHMgYnV0IG5vdCBnZW5lcmljIHR5cGUgYXJndW1lbnRzCisJCVN0cmluZyB0eXBlTmFtZSA9IHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldFR5cGVOYW1lKCk7CisJCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpbnQgYXJyYXlEZXB0aCA9IENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbih0eXBlTmFtZSk7CisJCWlmIChhcnJheURlcHRoID4gMSkgeworCQkJcmV0dXJuIGZhbHNlOyAgLy8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkCisJCX0KKworCQlpZiAoYXJyYXlEZXB0aCA9PSAxKSB7CisJCQlTdHJpbmcgZWxlbWVudFR5cGVOYW1lID0gQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24odHlwZU5hbWUsIDEpOworCQkJcmV0dXJuIHRoaXMuZWxlbWVudFR5cGVJc1ZhbGlkRm9yQmFzaWNBcnJheShlbGVtZW50VHlwZU5hbWUpOworCQl9CisKKwkJLy8gYXJyYXlEZXB0aCA9PSAwCisJCWlmIChDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKHR5cGVOYW1lKSkgeworCQkJcmV0dXJuIHRydWU7ICAvLyBhbnkgcHJpbWl0aXZlIGJ1dCAndm9pZCcKKwkJfQorCQlpZiAoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyh0eXBlTmFtZSkpIHsKKwkJCXJldHVybiB0cnVlOyAgLy8gYW55IHByaW1pdGl2ZSB3cmFwcGVyIGJ1dCAnamF2YS5sYW5nLlZvaWQnCisJCX0KKwkJaWYgKHRoaXMudHlwZUlzT3RoZXJWYWxpZEJhc2ljVHlwZSh0eXBlTmFtZSkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmICh0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS50eXBlSXNFbnVtKCkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmICh0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS50eXBlSXNTdWJUeXBlT2YoU0VSSUFMSVpBQkxFX1RZUEVfTkFNRSkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgYSB2YWxpZCBlbGVtZW50IHR5cGUgZm9yCisJICogYSBvbmUtZGltZW5zaW9uYWwgYXJyYXkgdGhhdCBjYW4gZGVmYXVsdCB0byBhIEJhc2ljIG1hcHBpbmc6CisJICogICAgIGJ5dGUKKwkgKiAgICAgY2hhcgorCSAqICAgICBqYXZhLmxhbmcuQnl0ZQorCSAqICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZWxlbWVudFR5cGVJc1ZhbGlkRm9yQmFzaWNBcnJheShTdHJpbmcgZWxlbWVudFR5cGVOYW1lKSB7CisJCXJldHVybiBBcnJheVRvb2xzLmNvbnRhaW5zKFZBTElEX0JBU0lDX0FSUkFZX0VMRU1FTlRfVFlQRV9OQU1FUywgZWxlbWVudFR5cGVOYW1lKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZBTElEX0JBU0lDX0FSUkFZX0VMRU1FTlRfVFlQRV9OQU1FUyA9IHsKKwkJYnl0ZS5jbGFzcy5nZXROYW1lKCksCisJCWNoYXIuY2xhc3MuZ2V0TmFtZSgpLAorCQlqYXZhLmxhbmcuQnl0ZS5jbGFzcy5nZXROYW1lKCksCisJCWphdmEubGFuZy5DaGFyYWN0ZXIuY2xhc3MuZ2V0TmFtZSgpCisJfTsKKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyBhbW9uZyB0aGUgdmFyaW91cyAib3RoZXIiIHR5cGVzCisJICogdGhhdCBjYW4gZGVmYXVsdCB0byBhIEJhc2ljIG1hcHBpbmcuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdHlwZUlzT3RoZXJWYWxpZEJhc2ljVHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKKwkJcmV0dXJuIEFycmF5VG9vbHMuY29udGFpbnMoT1RIRVJfVkFMSURfQkFTSUNfVFlQRV9OQU1FUywgdHlwZU5hbWUpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gT1RIRVJfVkFMSURfQkFTSUNfVFlQRV9OQU1FUyA9IHsKKwkJamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCksCisJCWphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwKKwkJamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MuZ2V0TmFtZSgpLAorCQlqYXZhLnV0aWwuRGF0ZS5jbGFzcy5nZXROYW1lKCksCisJCWphdmEudXRpbC5DYWxlbmRhci5jbGFzcy5nZXROYW1lKCksCisJCWphdmEuc3FsLkRhdGUuY2xhc3MuZ2V0TmFtZSgpLAorCQlqYXZhLnNxbC5UaW1lLmNsYXNzLmdldE5hbWUoKSwKKwkJamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLmdldE5hbWUoKSwKKwl9OworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSSUFMSVpBQkxFX1RZUEVfTkFNRSA9IGphdmEuaW8uU2VyaWFsaXphYmxlLmNsYXNzLmdldE5hbWUoKTsKKworCS8vICoqKioqIHJlZmVyZW5jZSBlbnRpdGllcworCXB1YmxpYyBTdHJpbmcgZ2V0U2luZ2xlUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoKSB7CisJCS8vICd0eXBlTmFtZScgbWF5IGluY2x1ZGUgYXJyYXkgYnJhY2tldHMgKCJbXSIpCisJCS8vIGJ1dCBub3QgZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cyAoZS5nLiAiPGphdmEubGFuZy5TdHJpbmc+IikKKwkJU3RyaW5nIHR5cGVOYW1lID0gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0VHlwZU5hbWUoKTsKKwkJaWYgKHR5cGVOYW1lID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmIChDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24odHlwZU5hbWUpICE9IDApIHsKKwkJCXJldHVybiBudWxsOyAgLy8gYXJyYXlzIGNhbm5vdCBiZSBlbnRpdGllcworCQl9CisJCWlmICh0aGlzLnR5cGVJc0NvbnRhaW5lcih0eXBlTmFtZSkpIHsKKwkJCXJldHVybiBudWxsOyAgLy8gImNvbnRhaW5lcnMiIGNhbm5vdCBiZSBlbnRpdGllcworCQl9CisJCXJldHVybiB0eXBlTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE11bHRpUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoKSB7CisJCS8vICd0eXBlTmFtZScgbWF5IGluY2x1ZGUgYXJyYXkgYnJhY2tldHMgKCJbXSIpCisJCS8vIGJ1dCBub3QgZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cyAoZS5nLiAiPGphdmEubGFuZy5TdHJpbmc+IikKKwkJU3RyaW5nIHR5cGVOYW1lID0gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0VHlwZU5hbWUoKTsKKwkJcmV0dXJuICh0eXBlTmFtZSA9PSBudWxsKSA/IG51bGwgOgorCQkJCXRoaXMuZ2V0SnBhQ29udGFpbmVyKHR5cGVOYW1lKS5nZXRNdWx0aVJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKKwl9CisKKwkvKioKKwkgKiByZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgb25lIG9mIHRoZSBjb250YWluZXIKKwkgKiB0eXBlcyBhbGxvd2VkIGJ5IHRoZSBKUEEgc3BlYworCSAqLworCXByb3RlY3RlZCBib29sZWFuIHR5cGVJc0NvbnRhaW5lcihTdHJpbmcgdHlwZU5hbWUpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0SnBhQ29udGFpbmVyKHR5cGVOYW1lKS5pc0NvbnRhaW5lcigpOworCX0KKworCS8vICoqKioqIG5hbWUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLm5hbWU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKTsKKwl9CisKKwkvLyAqKioqKiBtYXBwaW5nCisJcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGdldE1hcHBpbmcoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRNYXBwaW5nICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRNYXBwaW5nIDogdGhpcy5kZWZhdWx0TWFwcGluZzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5nZXRLZXkoKTsKKwl9CisKKworCS8vICoqKioqIGRlZmF1bHQgbWFwcGluZworCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBnZXREZWZhdWx0TWFwcGluZygpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdE1hcHBpbmc7CisJfQorCisJLyoqCisJICogY2xpZW50cyBkbyBub3Qgc2V0IHRoZSAiZGVmYXVsdCIgbWFwcGluZworCSAqLworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRNYXBwaW5nKEphdmFBdHRyaWJ1dGVNYXBwaW5nIGRlZmF1bHRNYXBwaW5nKSB7CisJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG9sZCA9IHRoaXMuZGVmYXVsdE1hcHBpbmc7CisJCXRoaXMuZGVmYXVsdE1hcHBpbmcgPSBkZWZhdWx0TWFwcGluZzsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTUFQUElOR19QUk9QRVJUWSwgb2xkLCBkZWZhdWx0TWFwcGluZyk7CisJfQorCisJcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkRGVmYXVsdE1hcHBpbmcoKSB7CisJCUphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBtYXBwaW5nRGVmaW5pdGlvbiA9IAorCQkJZ2V0SnBhUGxhdGZvcm0oKS5nZXREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKHRoaXMpOworCQlyZXR1cm4gYnVpbGREZWZhdWx0TWFwcGluZyhtYXBwaW5nRGVmaW5pdGlvbik7CisJfQorCQorCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZERlZmF1bHRNYXBwaW5nKEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBtYXBwaW5nRGVmaW5pdGlvbikgeworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS4KKwkJCQlidWlsZE51bGxBbm5vdGF0aW9uKG1hcHBpbmdEZWZpbml0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOworCQlKYXZhQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gbWFwcGluZ0RlZmluaXRpb24uYnVpbGRNYXBwaW5nKHRoaXMsIGdldEpwYUZhY3RvcnkoKSk7CisJCW1hcHBpbmcuaW5pdGlhbGl6ZShhbm5vdGF0aW9uKTsKKwkJcmV0dXJuIG1hcHBpbmc7CisJfQorCQorCS8qKgorCSAqIHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vICJkZWZhdWx0IiBtYXBwaW5nIGZvciB0aGUgYXR0cmlidXRlCisJICovCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdE1hcHBpbmcuZ2V0S2V5KCk7CisJfQorCisJLyoqCisJICogdGhlIG1hcHBpbmcgbWlnaHQgYmUgImRlZmF1bHQiLCBidXQgaXQgc3RpbGwgbWlnaHQgYmUgYSAibnVsbCIgbWFwcGluZy4uLgorCSAqLworCXB1YmxpYyBib29sZWFuIG1hcHBpbmdJc0RlZmF1bHQoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0TWFwcGluZyA9PSBtYXBwaW5nOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRNYXBwaW5nKCkgeworCQkvLyBUaGVyZSB3aWxsIGFsd2F5cyBiZSBhIG1hcHBpbmcgZGVmaW5pdGlvbiwgZXZlbiBpZiBpdCBpcyBhICJudWxsIiBtYXBwaW5nIGRlZmluaXRpb24gLi4uCisJCUphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBtYXBwaW5nRGVmaW5pdGlvbiA9IAorCQkJCWdldEpwYVBsYXRmb3JtKCkuZ2V0RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbih0aGlzKTsKKwkJU3RyaW5nIG1hcHBpbmdLZXkgPSBtYXBwaW5nRGVmaW5pdGlvbi5nZXRLZXkoKTsKKwkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwodGhpcy5kZWZhdWx0TWFwcGluZy5nZXRLZXkoKSwgbWFwcGluZ0tleSkpIHsKKwkJCXRoaXMuZGVmYXVsdE1hcHBpbmcudXBkYXRlKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLgorCQkJCQlidWlsZE51bGxBbm5vdGF0aW9uKG1hcHBpbmdEZWZpbml0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsKKwkJfSAKKwkJZWxzZSB7CisJCQlzZXREZWZhdWx0TWFwcGluZyhidWlsZERlZmF1bHRNYXBwaW5nKG1hcHBpbmdEZWZpbml0aW9uKSk7CisJCX0KKwl9CisKKwkvLyAqKioqKiBzcGVjaWZpZWQgbWFwcGluZworCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBnZXRTcGVjaWZpZWRNYXBwaW5nKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRNYXBwaW5nOworCX0KKworCS8qKgorCSAqIGNsaWVudHMgZG8gbm90IHNldCB0aGUgInNwZWNpZmllZCIgbWFwcGluZzsKKwkgKiBAc2VlICNzZXRTcGVjaWZpZWRNYXBwaW5nS2V5KFN0cmluZykKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRNYXBwaW5nKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHNwZWNpZmllZE1hcHBpbmcpIHsKKwkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRNYXBwaW5nOworCQl0aGlzLnNwZWNpZmllZE1hcHBpbmcgPSBzcGVjaWZpZWRNYXBwaW5nOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01BUFBJTkdfUFJPUEVSVFksIG9sZCwgc3BlY2lmaWVkTWFwcGluZyk7CisJfQorCisJcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkU3BlY2lmaWVkTWFwcGluZygpIHsKKwkJSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIG1hcHBpbmdEZWZpbml0aW9uID0gCisJCQkJZ2V0SnBhUGxhdGZvcm0oKS5nZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24odGhpcyk7CisJCXJldHVybiBidWlsZFNwZWNpZmllZE1hcHBpbmcobWFwcGluZ0RlZmluaXRpb24pOworCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRTcGVjaWZpZWRNYXBwaW5nKEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBtYXBwaW5nRGVmaW5pdGlvbikgeworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS4KKwkJCQlnZXRBbm5vdGF0aW9uKG1hcHBpbmdEZWZpbml0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOworCQlKYXZhQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gbWFwcGluZ0RlZmluaXRpb24uYnVpbGRNYXBwaW5nKHRoaXMsIGdldEpwYUZhY3RvcnkoKSk7CisJCS8vIHNwZWNpZmllZCBtYXBwaW5ncyBtYXkgYmUgbnVsbAorCQlpZiAobWFwcGluZyAhPSBudWxsKSB7CisJCQltYXBwaW5nLmluaXRpYWxpemUoYW5ub3RhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1hcHBpbmc7CisJfQorCQorCS8qKgorCSAqIHJldHVybiB0aGUga2V5IG9mIHRoZSBjdXJyZW50bHkgc3BlY2lmaWVkIG1hcHBpbmcgb3IgbnVsbCAKKwkgKiBpZiB0aGVyZSBpcyBubyBzcGVjaWZpZWQgbWFwcGluZyBmb3IgdGhlIGF0dHJpYnV0ZQorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY2lmaWVkTWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5zcGVjaWZpZWRNYXBwaW5nLmdldEtleSgpOworCX0KKworCS8vIFRPRE8gc3VwcG9ydCBtb3JwaGluZyBtYXBwaW5ncywgaS5lLiBjb3B5aW5nIGNvbW1vbiBzZXR0aW5ncyBvdmVyCisJLy8gdG8gdGhlIG5ldyBtYXBwaW5nOyB0aGlzIGNhbid0IGJlIGRvbmUgaW4gdGhlIHNhbWUgd2FzIGFzIFhtbEF0dHJpYnV0ZU1hcHBpbmcKKwkvLyBzaW5jZSB3ZSBkb24ndCBrbm93IGFsbCB0aGUgcG9zc2libGUgbWFwcGluZyB0eXBlcworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE1hcHBpbmdLZXkoU3RyaW5nIGtleSkgeworCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwoa2V5LCB0aGlzLmdldFNwZWNpZmllZE1hcHBpbmdLZXkoKSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlKYXZhQXR0cmlidXRlTWFwcGluZyBvbGQgPSB0aGlzLnNwZWNpZmllZE1hcHBpbmc7CisJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcgPSB0aGlzLmJ1aWxkTWFwcGluZ0Zyb21NYXBwaW5nS2V5KGtleSk7CisJCQorCQl0aGlzLnNwZWNpZmllZE1hcHBpbmcgPSBuZXdNYXBwaW5nOworCQkKKwkJU3RyaW5nIG5ld0Fubm90YXRpb24gPSAobmV3TWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiBuZXdNYXBwaW5nLmdldEFubm90YXRpb25OYW1lKCk7CisJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSAobmV3TWFwcGluZyA9PSBudWxsKSA/IHRoaXMuZGVmYXVsdE1hcHBpbmcgOiBuZXdNYXBwaW5nOworCQlTdHJpbmdbXSBuZXdTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzID0gQXJyYXlUb29scy5hcnJheShtYXBwaW5nLnN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwgRU1QVFlfU1RSSU5HX0FSUkFZKTsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0UHJpbWFyeUFubm90YXRpb24obmV3QW5ub3RhdGlvbiwgbmV3U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcyk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTUFQUElOR19QUk9QRVJUWSwgb2xkLCBuZXdNYXBwaW5nKTsKKwl9CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOworCQorCS8qKgorCSAqIHJldHVybiB0aGUgYW5ub3RhdGlvbiBuYW1lIG9mIHRoZSBjdXJyZW50bHkgc3BlY2lmaWVkIG1hcHBpbmcgb3IgbnVsbCAKKwkgKiBpZiB0aGVyZSBpcyBubyBzcGVjaWZpZWQgbWFwcGluZyBmb3IgdGhlIGF0dHJpYnV0ZQorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY2lmaWVkTWFwcGluZ0Fubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnNwZWNpZmllZE1hcHBpbmcuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZ0Zyb21NYXBwaW5nS2V5KFN0cmluZyBrZXkpIHsKKwkJSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIG1hcHBpbmdEZWZpbml0aW9uID0gZ2V0SnBhUGxhdGZvcm0oKS5nZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oa2V5KTsKKwkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IG1hcHBpbmdEZWZpbml0aW9uLmJ1aWxkTWFwcGluZyh0aGlzLCBnZXRKcGFGYWN0b3J5KCkpOworCQkvL25vIG1hcHBpbmcuaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBjYWxsIGhlcmUKKwkJLy93ZSBkbyBub3QgeWV0IGhhdmUgYSBtYXBwaW5nIGFubm90YXRpb24gc28gd2UgY2FuJ3QgY2FsbCBpbml0aWFsaXplCisJCXJldHVybiBtYXBwaW5nOworCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7CisJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSB0aGlzLmdldE1hcHBpbmcoKTsKKwkJcmV0dXJuIChtYXBwaW5nICE9IG51bGwpID8gbWFwcGluZy5zdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgOiBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRNYXBwaW5nKCkgeworCQkvLyBUaGVyZSB3aWxsIGFsd2F5cyBiZSBhIG1hcHBpbmcgZGVmaW5pdGlvbiwgZXZlbiBpZiBpdCBpcyBhICJudWxsIiBtYXBwaW5nIHByb3ZpZGVyIC4uLgorCQlKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gbWFwcGluZ0RlZmluaXRpb24gPSAKKwkJCQlnZXRKcGFQbGF0Zm9ybSgpLmdldFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbih0aGlzKTsKKwkJU3RyaW5nIG1hcHBpbmdLZXkgPSBtYXBwaW5nRGVmaW5pdGlvbi5nZXRLZXkoKTsKKwkJaWYgKHRoaXMuc3BlY2lmaWVkTWFwcGluZyAhPSBudWxsCisJCQkJJiYgdGhpcy5zcGVjaWZpZWRNYXBwaW5nLmdldEtleSgpLmVxdWFscyhtYXBwaW5nS2V5KSkgeworCQkJdGhpcy5zcGVjaWZpZWRNYXBwaW5nLnVwZGF0ZSh0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS4KKwkJCQkJZ2V0QW5ub3RhdGlvbihtYXBwaW5nRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7CisJCX0gCisJCWVsc2UgeworCQkJc2V0U3BlY2lmaWVkTWFwcGluZyhidWlsZFNwZWNpZmllZE1hcHBpbmcobWFwcGluZ0RlZmluaXRpb24pKTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBtaXNjIG92ZXJyaWRlcyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUGVyc2lzdGVudFR5cGUgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKFBlcnNpc3RlbnRUeXBlKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXN1cGVyLnRvU3RyaW5nKHNiKTsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldFNlbGVjdGlvblRleHRSYW5nZShhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCisJCXRoaXMudmFsaWRhdGVNb2RpZmllcnMobWVzc2FnZXMsIGFzdFJvb3QpOworCisJCWlmICh0aGlzLnNwZWNpZmllZE1hcHBpbmcgIT0gbnVsbCkgeworCQkJdGhpcy5zcGVjaWZpZWRNYXBwaW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5kZWZhdWx0TWFwcGluZyAhPSBudWxsKSB7CisJCQl0aGlzLmRlZmF1bHRNYXBwaW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCX0KKwl9CisKKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTW9kaWZpZXJzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlpZiAodGhpcy5nZXRNYXBwaW5nS2V5KCkgPT0gTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHRoaXMuaXNGaWVsZCgpKSB7CisJCQlpZiAodGhpcy5pc0ZpbmFsKCkpIHsKKwkJCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZEF0dHJpYnV0ZU1lc3NhZ2UoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0ZJTkFMX0ZJRUxELCBhc3RSb290KSk7CisJCQl9CisJCQlpZiAodGhpcy5pc1B1YmxpYygpKSB7CisJCQkJbWVzc2FnZXMuYWRkKHRoaXMuYnVpbGRBdHRyaWJ1dGVNZXNzYWdlKEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9QVUJMSUNfRklFTEQsIGFzdFJvb3QpKTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZEF0dHJpYnV0ZU1lc3NhZ2UoU3RyaW5nIG1zZ0lELCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQltc2dJRCwKKwkJCQluZXcgU3RyaW5nW10ge2dldE5hbWUoKX0sCisJCQkJdGhpcywKKwkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEpQQSBjb250YWluZXJzICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgSlBBIGNvbnRhaW5lciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgdHlwZTsKKwkgKiByZXR1cm4gYSAibnVsbCIgSlBBIGNvbnRhaW5lciBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgbm90IG9uZSBvZiB0aGUKKwkgKiBjb250YWluZXIgdHlwZXMgYWxsb3dlZCBieSB0aGUgSlBBIHNwZWMuCisJICovCisJcHJvdGVjdGVkIEpwYUNvbnRhaW5lciBnZXRKcGFDb250YWluZXIoU3RyaW5nIHR5cGVOYW1lKSB7CisJCWZvciAoSnBhQ29udGFpbmVyIGpwYUNvbnRhaW5lciA6IEpQQV9DT05UQUlORVJTKSB7CisJCQlpZiAoanBhQ29udGFpbmVyLmdldFR5cGVOYW1lKCkuZXF1YWxzKHR5cGVOYW1lKSkgeworCQkJCXJldHVybiBqcGFDb250YWluZXI7CisJCQl9CisJCX0KKwkJcmV0dXJuIEpwYUNvbnRhaW5lci5OdWxsLmluc3RhbmNlKCk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxKcGFDb250YWluZXI+IEpQQV9DT05UQUlORVJTID0KKwkJbmV3IEFycmF5SXRlcmFibGU8SnBhQ29udGFpbmVyPihuZXcgSnBhQ29udGFpbmVyW10geworCQkJbmV3IENvbGxlY3Rpb25KcGFDb250YWluZXIoamF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3MsIEpQQTJfMC5DT0xMRUNUSU9OX0FUVFJJQlVURSksCisJCQluZXcgQ29sbGVjdGlvbkpwYUNvbnRhaW5lcihqYXZhLnV0aWwuU2V0LmNsYXNzLCBKUEEyXzAuU0VUX0FUVFJJQlVURSksCisJCQluZXcgQ29sbGVjdGlvbkpwYUNvbnRhaW5lcihqYXZhLnV0aWwuTGlzdC5jbGFzcywgSlBBMl8wLkxJU1RfQVRUUklCVVRFKSwKKwkJCW5ldyBNYXBKcGFDb250YWluZXIoamF2YS51dGlsLk1hcC5jbGFzcywgSlBBMl8wLk1BUF9BVFRSSUJVVEUpCisJCX0pOworCisJLyoqCisJICogSlBBIGNvbnRhaW5lciBpbnRlcmZhY2UgKGFuZCBudWxsIGltcGxlbWVudGF0aW9uKQorCSAqLworCXByb3RlY3RlZCBpbnRlcmZhY2UgSnBhQ29udGFpbmVyIHsKKwkJU3RyaW5nIGdldFR5cGVOYW1lKCk7CisJCWJvb2xlYW4gaXNDb250YWluZXIoKTsKKwkJU3RyaW5nIGdldE11bHRpUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQlTdHJpbmcgZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpOworCQlTdHJpbmcgZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRNYXBLZXlUeXBlTmFtZShNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZyk7CisKKwkJZmluYWwgY2xhc3MgTnVsbCBpbXBsZW1lbnRzIEpwYUNvbnRhaW5lciB7CisJCQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYUNvbnRhaW5lciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7CisJCQlwdWJsaWMgc3RhdGljIEpwYUNvbnRhaW5lciBpbnN0YW5jZSgpIHsKKwkJCQlyZXR1cm4gSU5TVEFOQ0U7CisJCQl9CisJCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCisJCQlwcml2YXRlIE51bGwoKSB7CisJCQkJc3VwZXIoKTsKKwkJCX0KKwkJCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlwdWJsaWMgU3RyaW5nIGdldE11bHRpUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpIHsKKwkJCQlyZXR1cm4gSlBBMl8wLkNPTExFQ1RJT05fQVRUUklCVVRFOworCQkJfQorCQkJcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZE1hcEtleVR5cGVOYW1lKE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJKcGFDb250YWluZXIuTnVsbCI7ICAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKworCX0KKworCS8qKgorCSAqIEFic3RyYWN0IEpQQSBjb250YWluZXIKKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEFic3RyYWN0SnBhQ29udGFpbmVyIGltcGxlbWVudHMgSnBhQ29udGFpbmVyIHsKKwkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB0eXBlTmFtZTsKKwkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBtZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lOworCisJCXByb3RlY3RlZCBBYnN0cmFjdEpwYUNvbnRhaW5lcihDbGFzczw/PiBjb250YWluZXJDbGFzcywgU3RyaW5nIG1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUpIHsKKwkJCXRoaXMoY29udGFpbmVyQ2xhc3MuZ2V0TmFtZSgpLCBtZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lKTsKKwkJfQorCisJCXByb3RlY3RlZCBBYnN0cmFjdEpwYUNvbnRhaW5lcihTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBtZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lKSB7CisJCQlzdXBlcigpOworCQkJaWYgKCh0eXBlTmFtZSA9PSBudWxsKSB8fCAobWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSA9PSBudWxsKSkgeworCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQkJfQorCQkJdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOworCQkJdGhpcy5tZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lID0gbWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7CisJCQlyZXR1cm4gdGhpcy50eXBlTmFtZTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyKCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUoKSB7CisJCQlyZXR1cm4gdGhpcy5tZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBDb2xsZWN0aW9uIEpQQSBjb250YWluZXIKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENvbGxlY3Rpb25KcGFDb250YWluZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYUNvbnRhaW5lciB7CisJCXByb3RlY3RlZCBDb2xsZWN0aW9uSnBhQ29udGFpbmVyKENsYXNzPD8+IGNvbGxlY3Rpb25DbGFzcywgU3RyaW5nIHN0YXRpY01ldGFtb2RlbFR5cGVEZWNsYXJhdGlvblR5cGVOYW1lKSB7CisJCQlzdXBlcihjb2xsZWN0aW9uQ2xhc3MsIHN0YXRpY01ldGFtb2RlbFR5cGVEZWNsYXJhdGlvblR5cGVOYW1lKTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0TXVsdGlSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgeworCQkJcmV0dXJuIChyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUudHlwZVR5cGVBcmd1bWVudE5hbWVzU2l6ZSgpID09IDEpID8KKwkJCQkJCXJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZSgwKSA6CisJCQkJCQludWxsOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZE1hcEtleVR5cGVOYW1lKE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIE1hcCBKUEEgY29udGFpbmVyCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBNYXBKcGFDb250YWluZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYUNvbnRhaW5lciB7CisJCXByb3RlY3RlZCBNYXBKcGFDb250YWluZXIoQ2xhc3M8Pz4gbWFwQ2xhc3MsIFN0cmluZyBzdGF0aWNNZXRhbW9kZWxUeXBlRGVjbGFyYXRpb25UeXBlTmFtZSkgeworCQkJc3VwZXIobWFwQ2xhc3MsIHN0YXRpY01ldGFtb2RlbFR5cGVEZWNsYXJhdGlvblR5cGVOYW1lKTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0TXVsdGlSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgeworCQkJcmV0dXJuIChyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUudHlwZVR5cGVBcmd1bWVudE5hbWVzU2l6ZSgpID09IDIpID8KKwkJCQkJCXJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZSgxKSA6CisJCQkJCQludWxsOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZE1hcEtleVR5cGVOYW1lKE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7CisJCQlyZXR1cm4gbWFwcGluZy5nZXRNZXRhbW9kZWxGaWVsZE1hcEtleVR5cGVOYW1lKCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhUGVyc2lzdGVudFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhUGVyc2lzdGVudFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjEzZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFQZXJzaXN0ZW50VHlwZS5qYXZhCkBAIC0wLDAgKzEsNjUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVN0cnVjdHVyZU5vZGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLkpwYVByb2plY3QyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DaGFpbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhUGVyc2lzdGVudFR5cGUKKwlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCisJaW1wbGVtZW50cyBKYXZhUGVyc2lzdGVudFR5cGUKK3sKKwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKKwkKKwlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZTsKKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CisJCisJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZGVmYXVsdEFjY2VzczsKKworCXByb3RlY3RlZCBBY2Nlc3NUeXBlIHNwZWNpZmllZEFjY2VzczsKKwkKKwlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nIG1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IAorCQkJbmV3IFZlY3RvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKKwkKKwkKKwlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhUGVyc2lzdGVudFR5cGUoUGVyc2lzdGVudFR5cGUuT3duZXIgcGFyZW50LCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuaW5pdGlhbGl6ZShqcnB0KTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRGaWxlKCk7CisJfQorCQorCQorCS8vKioqKioqKioqKioqKioqKioqIEpwYVN0cnVjdHVyZU5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBKYXZhU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9UWVBFX0lEOworCX0KKwkKKwkKKwkvLyoqKioqKioqKioqKioqKioqKiBQZXJzaXN0ZW50VHlwZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGU7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBQZXJzaXN0ZW50VHlwZS5Pd25lciBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoUGVyc2lzdGVudFR5cGUuT3duZXIpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIG5hbWUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLm5hbWU7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCl7CisJCXJldHVybiBnZXROYW1lKCkuc3Vic3RyaW5nKGdldE5hbWUoKS5sYXN0SW5kZXhPZignLicpICsgMSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7CisJCXRoaXMubmFtZSA9IG5ld05hbWU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgYnVpbGROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldFF1YWxpZmllZE5hbWUoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBhY2Nlc3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQWNjZXNzICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRBY2Nlc3MgOiB0aGlzLmRlZmF1bHRBY2Nlc3M7CisJfQorCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdEFjY2VzczsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEFjY2VzcyhBY2Nlc3NUeXBlIG5ld0RlZmF1bHRBY2Nlc3MpIHsKKwkJQWNjZXNzVHlwZSBvbGRBY2Nlc3MgPSB0aGlzLmRlZmF1bHRBY2Nlc3M7CisJCXRoaXMuZGVmYXVsdEFjY2VzcyA9IG5ld0RlZmF1bHRBY2Nlc3M7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9BQ0NFU1NfUFJPUEVSVFksIG9sZEFjY2VzcywgbmV3RGVmYXVsdEFjY2Vzcyk7CisJfQorCQorCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWNjZXNzOworCX0KKwkKKwkvKioKKwkgKiBDaGVjayB0aGUgYWNjZXNzICJzcGVjaWZpZWQiIGJ5IHRoZSBqYXZhIHJlc291cmNlIG1vZGVsLgorCSAqIAkJQ2hlY2sgamF2YSBhbm5vdGF0aW9ucyBmaXJzdC4KKwkgKiAJCUlmIHN0aWxsIG51bGwgY2hlY2sgeG1sIG1hcHBpbmcgc3BlY2lmaWVkIGFjY2VzcworCSAqCQlJZiBzdGlsbCBudWxsIHRoZW4gc2V0IHRvIHN1cGVyUGVyc2lzdGVudFR5cGUgYWNjZXNzLgorCSAqIAkJSWYgc3RpbGwgbnVsbCBjaGVjayBlbnRpdHktbWFwcGluZ3Mgc3BlY2lmaWVkIGFjY2VzcyBzZXR0aW5nIGlmIHRoaXMgcGVyc2lzdGVudC10eXBlIGlzIGxpc3RlZCBpbiBhbiBvcm0ueG1sIGZpbGUKKwkgKiAJCUlmIHN0aWxsIG51bGwgY2hlY2sgdGhlIHBlcnNpc3RlbmNlLXVuaXQgZGVmYXVsdCBBY2Nlc3MKKwkgKiAJCURlZmF1bHQgdG8gRklFTEQgaWYgYWxsIGVsc2UgZmFpbHMuCisJICovCisJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYnVpbGREZWZhdWx0QWNjZXNzKCkgeworCQlBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUgPSBBY2Nlc3NUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbCh0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCQlpZiAoYWNjZXNzVHlwZSAhPSBudWxsKSB7CisJCQlyZXR1cm4gYWNjZXNzVHlwZTsKKwkJfQorCQlhY2Nlc3NUeXBlID0gdGhpcy5nZXRPd25lck92ZXJyaWRlQWNjZXNzKCk7CisJCWlmIChhY2Nlc3NUeXBlICE9IG51bGwpIHsKKwkJCXJldHVybiBhY2Nlc3NUeXBlOworCQl9CisKKwkJaWYgKHRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7CisJCQlhY2Nlc3NUeXBlID0gdGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKTsKKwkJCWlmIChhY2Nlc3NUeXBlICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gYWNjZXNzVHlwZTsKKwkJCX0KKwkJfQorCisJCWFjY2Vzc1R5cGUgPSB0aGlzLmdldE93bmVyRGVmYXVsdEFjY2VzcygpOworCQlpZiAoYWNjZXNzVHlwZSAhPSBudWxsKSB7CisJCQlyZXR1cm4gYWNjZXNzVHlwZTsKKwkJfQorCisJCS8vIGxhc3QgZGl0Y2ggYXR0ZW1wdCB0byBhbGxvdyB0aGUgdXNlciB0byBhbm5vdGF0ZSAqc29tZXRoaW5nKgorCQlyZXR1cm4gQWNjZXNzVHlwZS5GSUVMRDsKKwl9CisJCisJLyoqCisJICogQnVpbGQgYW4gYWNjZXNzIHR5cGUgYmFzZWQgb24gYW5ub3RhdGlvbnMgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCisJICogKFRoaXMgaXMgcGxhdGZvcm0gZGVwZW5kZW50KQorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBBY2Nlc3NUeXBlIGJ1aWxkU3BlY2lmaWVkQWNjZXNzKCk7CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBtYXBwaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEphdmFUeXBlTWFwcGluZyBnZXRNYXBwaW5nKCkgeworCQlyZXR1cm4gdGhpcy5tYXBwaW5nOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIGdldE1hcHBpbmcoKS5nZXRLZXkoKTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0TWFwcGluZ0tleShTdHJpbmcga2V5KSB7CisJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGtleSwgdGhpcy5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJSmF2YVR5cGVNYXBwaW5nIG9sZE1hcHBpbmcgPSBnZXRNYXBwaW5nKCk7CisJCUphdmFUeXBlTWFwcGluZyBuZXdNYXBwaW5nID0gYnVpbGRNYXBwaW5nRnJvbU1hcHBpbmdLZXkoa2V5KTsKKwkJCisJCXRoaXMubWFwcGluZyA9IG5ld01hcHBpbmc7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5zZXRQcmltYXJ5QW5ub3RhdGlvbigKKwkJCQluZXdNYXBwaW5nLmdldEFubm90YXRpb25OYW1lKCksCisJCQkJQXJyYXlUb29scy5hcnJheShuZXdNYXBwaW5nLnN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwgbmV3IFN0cmluZ1swXSkpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1BUFBJTkdfUFJPUEVSVFksIG9sZE1hcHBpbmcsIG5ld01hcHBpbmcpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwaW5nKEphdmFUeXBlTWFwcGluZyBuZXdNYXBwaW5nKSB7CisJCUphdmFUeXBlTWFwcGluZyBvbGRNYXBwaW5nID0gdGhpcy5tYXBwaW5nOworCQl0aGlzLm1hcHBpbmcgPSBuZXdNYXBwaW5nOwkKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQSU5HX1BST1BFUlRZLCBvbGRNYXBwaW5nLCBuZXdNYXBwaW5nKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoKSB7CisJCUphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gbWFwcGluZ0RlZmluaXRpb24gPSAKKwkJCQlnZXRKcGFQbGF0Zm9ybSgpLmdldEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24odGhpcyk7CisJCXJldHVybiBidWlsZE1hcHBpbmcobWFwcGluZ0RlZmluaXRpb24pOworCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIG1hcHBpbmdEZWZpbml0aW9uKSB7CisJCUphdmFUeXBlTWFwcGluZyBqdE1hcHBpbmcgPSBtYXBwaW5nRGVmaW5pdGlvbi5idWlsZE1hcHBpbmcodGhpcywgZ2V0SnBhRmFjdG9yeSgpKTsKKwkJLy8gbWFwcGluZyBtYXkgYmUgbnVsbAorCQlpZiAoanRNYXBwaW5nICE9IG51bGwpIHsKKwkJCWp0TWFwcGluZy5pbml0aWFsaXplKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7CisJCX0KKwkJcmV0dXJuIGp0TWFwcGluZzsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZyBidWlsZE1hcHBpbmdGcm9tTWFwcGluZ0tleShTdHJpbmcga2V5KSB7CisJCUphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gbWFwcGluZ0RlZmluaXRpb24gPSAKKwkJCQlnZXRKcGFQbGF0Zm9ybSgpLmdldEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24oa2V5KTsKKwkJSmF2YVR5cGVNYXBwaW5nIGp0TWFwcGluZyA9IG1hcHBpbmdEZWZpbml0aW9uLmJ1aWxkTWFwcGluZyh0aGlzLCBnZXRKcGFGYWN0b3J5KCkpOworCQkvL25vIG1hcHBpbmcuaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgY2FsbCBoZXJlCisJCS8vd2UgZG8gbm90IHlldCBoYXZlIGEgbWFwcGluZyBhbm5vdGF0aW9uIHNvIHdlIGNhbid0IGNhbGwgaW5pdGlhbGl6ZQorCQlyZXR1cm4ganRNYXBwaW5nOworCX0KKwkKKwkKKwlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKKwkJcmV0dXJuIGdldE1hcHBpbmcoKS5pc01hcHBlZCgpOworCX0KKworCXB1YmxpYyBBY2Nlc3NUeXBlIGdldE93bmVyT3ZlcnJpZGVBY2Nlc3MoKSB7CisJCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdldE92ZXJyaWRlUGVyc2lzdGVudFR5cGVBY2Nlc3MoKTsKKwl9CisKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRPd25lckRlZmF1bHRBY2Nlc3MoKSB7CisJCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdldERlZmF1bHRQZXJzaXN0ZW50VHlwZUFjY2VzcygpOworCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlc05hbWVkKGZpbmFsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPihhdHRyaWJ1dGVzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG8pIHsKKwkJCQlyZXR1cm4gYXR0cmlidXRlTmFtZS5lcXVhbHMoby5nZXROYW1lKCkpOworCQkJfQorCQl9OworCX0KKworCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVOYW1lZChTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gYXR0cmlidXRlc05hbWVkKGF0dHJpYnV0ZU5hbWUpOworCQlyZXR1cm4gc3RyZWFtLmhhc05leHQoKSA/IHN0cmVhbS5uZXh0KCkgOiBudWxsOworCX0KKworCXB1YmxpYyBQZXJzaXN0ZW50QXR0cmlidXRlIHJlc29sdmVBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKwkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IGF0dHJpYnV0ZXNOYW1lZChhdHRyaWJ1dGVOYW1lKTsKKwkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKKwkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7CisJCQlyZXR1cm4gc3RyZWFtLmhhc05leHQoKSA/IG51bGwgLyptb3JlIHRoYW4gb25lKi86IGF0dHJpYnV0ZTsKKwkJfQorCQlyZXR1cm4gKHRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnN1cGVyUGVyc2lzdGVudFR5cGUucmVzb2x2ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKKwl9CisJCisJcHVibGljIExpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5hdHRyaWJ1dGVzKTsKKwl9CisJCisJcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLmF0dHJpYnV0ZXMpOworCX0KKwkKKwlwdWJsaWMgaW50IGF0dHJpYnV0ZXNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLnNpemUoKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZEF0dHJpYnV0ZShpbnQgaW5kZXgsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBhdHRyaWJ1dGUsIHRoaXMuYXR0cmlidXRlcywgQVRUUklCVVRFU19MSVNUKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVtb3ZlQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlyZW1vdmVJdGVtRnJvbUxpc3QoYXR0cmlidXRlLCB0aGlzLmF0dHJpYnV0ZXMsIEFUVFJJQlVURVNfTElTVCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBtb3ZlQXR0cmlidXRlKGludCBpbmRleCwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCW1vdmVJdGVtSW5MaXN0KGluZGV4LCB0aGlzLmF0dHJpYnV0ZXMuaW5kZXhPZihhdHRyaWJ1dGUpLCB0aGlzLmF0dHJpYnV0ZXMsIEFUVFJJQlVURVNfTElTVCk7CisJfQorCQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzKCkgeworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVOYW1lcyh0aGlzLmF0dHJpYnV0ZXMoKSk7CisJfQorCQorCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzKEl0ZXJhdG9yPD8gZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRycykgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZSwgU3RyaW5nPihhdHRycykgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlwdWJsaWMgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsQXR0cmlidXRlcygpIHsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxQZXJzaXN0ZW50VHlwZSwgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4+KHRoaXMuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gdHJhbnNmb3JtKFBlcnNpc3RlbnRUeXBlIHB0KSB7CisJCQkJcmV0dXJuIHB0LmF0dHJpYnV0ZXMoKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbEF0dHJpYnV0ZU5hbWVzKCkgeworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVOYW1lcyh0aGlzLmFsbEF0dHJpYnV0ZXMoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCUl0ZXJhdG9yPFN0cmluZz4gdmFsdWVzID0gdGhpcy5tYXBwaW5nLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHZhbHVlcyAhPSBudWxsKSB7CisJCQlyZXR1cm4gdmFsdWVzOworCQl9CisJCWZvciAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogdGhpcy5nZXRBdHRyaWJ1dGVzKCkpIHsKKwkJCXZhbHVlcyA9IGF0dHJpYnV0ZS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCQlpZiAodmFsdWVzICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdmFsdWVzOworCQkJfQorCQl9CisJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7CisJfQorCQorCS8vIGl0IHdvdWxkIGJlIG5pY2UgaWYgdGhlIHdlIHBhc3NlZCBpbiBhbiBhc3RSb290IGhlcmUsIGJ1dCB0aGVuIHdlCisJLy8gd291bGQgbmVlZCB0byBwYXNzIGl0IHRvIHRoZSBYTUwgc3RydWN0dXJlIG5vZGVzIHRvby4uLgorCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IG9mZnNldCkgeworCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KCk7IAorCQkKKwkJaWYgKHRoaXMuY29udGFpbnMob2Zmc2V0LCBhc3RSb290KSkgeworCQkJZm9yIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlIDogdGhpcy5nZXRBdHRyaWJ1dGVzKCkpIHsKKwkJCQlpZiAocGVyc2lzdGVudEF0dHJpYnV0ZS5jb250YWlucyhvZmZzZXQsIGFzdFJvb3QpKSB7CisJCQkJCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiB0aGlzOworCQl9CisJCXJldHVybiBudWxsOwkJCisJfQorCisJcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KCkuYnVpbGRBU1RSb290KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCBvZmZzZXQsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCVRleHRSYW5nZSBmdWxsVGV4dFJhbmdlID0gdGhpcy5nZXRGdWxsVGV4dFJhbmdlKGFzdFJvb3QpOworCQkvLyAnZnVsbFRleHRSYW5nZScgd2lsbCBiZSBudWxsIGlmIHRoZSB0eXBlIG5vIGxvbmdlciBleGlzdHMgaW4gdGhlIGphdmE7CisJCS8vIHRoZSBjb250ZXh0IG1vZGVsIGNhbiBiZSBvdXQgb2Ygc3luY2ggd2l0aCB0aGUgcmVzb3VyY2UgbW9kZWwKKwkJLy8gd2hlbiBhIHNlbGVjdGlvbiBldmVudCBvY2N1cnMgYmVmb3JlIHRoZSBjb250ZXh0IG1vZGVsIGhhcyBhCisJCS8vIGNoYW5jZSB0byBzeW5jaCB3aXRoIHRoZSByZXNvdXJjZSBtb2RlbCB2aWEgdGhlIHVwZGF0ZSB0aHJlYWQKKwkJcmV0dXJuIChmdWxsVGV4dFJhbmdlID09IG51bGwpID8gZmFsc2UgOiBmdWxsVGV4dFJhbmdlLmluY2x1ZGVzKG9mZnNldCk7CisJfQorCisKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEZ1bGxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldFNlbGVjdGlvblRleHRSYW5nZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UodGhpcy5idWlsZEFTVFJvb3QoKSk7CisJfQorCQorCQorCXB1YmxpYyBJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4gaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSB7CisJCXJldHVybiB0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5T2YodGhpcyk7CisJfQorCisJcHVibGljIEl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlPiBhbmNlc3RvcnMoKSB7CisJCXJldHVybiB0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5T2YodGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IGluaGVyaXRhbmNlSGllcmFyY2h5T2YoUGVyc2lzdGVudFR5cGUgc3RhcnQpIHsKKwkJLy8gdXNpbmcgYSBjaGFpbiBpdGVyYXRvciB0byB0cmF2ZXJzZSB1cCB0aGUgaW5oZXJpdGFuY2UgdHJlZQorCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+KHN0YXJ0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSBuZXh0TGluayhQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgeworCQkJCXJldHVybiBwZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCk7CisJCQl9CisJCX07CisJfQorCisJcHVibGljIFBlcnNpc3RlbnRUeXBlIGdldFN1cGVyUGVyc2lzdGVudFR5cGUoKSB7CisJCXJldHVybiB0aGlzLnN1cGVyUGVyc2lzdGVudFR5cGU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U3VwZXJQZXJzaXN0ZW50VHlwZShQZXJzaXN0ZW50VHlwZSBzdXBlclBlcnNpc3RlbnRUeXBlKSB7CisJCVBlcnNpc3RlbnRUeXBlIG9sZCA9IHRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZTsKKwkJdGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlID0gc3VwZXJQZXJzaXN0ZW50VHlwZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNVUEVSX1BFUlNJU1RFTlRfVFlQRV9QUk9QRVJUWSwgb2xkLCBzdXBlclBlcnNpc3RlbnRUeXBlKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaGFzQW55QW5ub3RhdGVkQXR0cmlidXRlcygpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5oYXNBbnlBbm5vdGF0ZWRBdHRyaWJ1dGVzKCk7CisJfQorCQorCS8vICoqKioqKioqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgc3luY2hyb25pemVNZXRhbW9kZWwoKSB7CisJCSgoSnBhUHJvamVjdDJfMCkgdGhpcy5nZXRKcGFQcm9qZWN0KCkpLnN5bmNocm9uaXplTWV0YW1vZGVsKHRoaXMpOworCX0KKwkKKwkvLyAqKioqKioqKioqKioqKioqIGluaXRpYWxpemF0aW9uIC8gdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0ganJwdDsKKwkJdGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlID0gdGhpcy5idWlsZFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKKwkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKKwkJdGhpcy5kZWZhdWx0QWNjZXNzID0gYnVpbGREZWZhdWx0QWNjZXNzKCk7CisJCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gYnVpbGRTcGVjaWZpZWRBY2Nlc3MoKTsKKwkJdGhpcy5tYXBwaW5nID0gYnVpbGRNYXBwaW5nKCk7CisJCXRoaXMuaW5pdGlhbGl6ZUF0dHJpYnV0ZXMoKTsJCQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQXR0cmlidXRlcygpIHsKKwkJZm9yIChJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSB0aGlzLnJlc291cmNlQXR0cmlidXRlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCXRoaXMuYXR0cmlidXRlcy5hZGQodGhpcy5jcmVhdGVBdHRyaWJ1dGUoc3RyZWFtLm5leHQoKSkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHJlc291cmNlQXR0cmlidXRlcygpIHsKKwkJcmV0dXJuICh0aGlzLmdldEFjY2VzcygpID09IEFjY2Vzc1R5cGUuUFJPUEVSVFkpID8KKwkJCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUucGVyc2lzdGFibGVQcm9wZXJ0aWVzKCkgOgorCQkJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5wZXJzaXN0YWJsZUZpZWxkcygpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpycHQ7CisJCXRoaXMudXBkYXRlKCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlKcGFGaWxlIGpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoKTsKKwkJaWYgKGpwYUZpbGUgIT0gbnVsbCkgeworCQkJLy8gdGhlIEpQQSBmaWxlIGNhbiBiZSBudWxsIGlmIHRoZSByZXNvdXJjZSB0eXBlIGlzICJleHRlcm5hbCIKKwkJCWpwYUZpbGUuYWRkUm9vdFN0cnVjdHVyZU5vZGUodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldFF1YWxpZmllZE5hbWUoKSwgdGhpcyk7CisJCX0KKwkJdGhpcy5zZXRTdXBlclBlcnNpc3RlbnRUeXBlKHRoaXMuYnVpbGRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOworCQl0aGlzLnNldE5hbWUodGhpcy5idWlsZE5hbWUoKSk7CQorCQl0aGlzLnVwZGF0ZUFjY2VzcygpOworCQl0aGlzLnVwZGF0ZU1hcHBpbmcoKTsKKwkJdGhpcy51cGRhdGVBdHRyaWJ1dGVzKCk7CQkKKwl9CisKKwlwcm90ZWN0ZWQgSnBhRmlsZSBnZXRKcGFGaWxlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRKcGFGaWxlKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRGaWxlKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBY2Nlc3MoKSB7CisJCXRoaXMuc2V0RGVmYXVsdEFjY2Vzcyh0aGlzLmJ1aWxkRGVmYXVsdEFjY2VzcygpKTsKKwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1hcHBpbmcoKSB7CisJCS8vIFRoZXJlIHdpbGwgYWx3YXlzIGJlIGEgbWFwcGluZyBkZWZpbml0aW9uLCBldmVuIGlmIGl0IGlzIGEgIm51bGwiIG1hcHBpbmcgZGVmaW5pdGlvbiAuLi4KKwkJSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBtYXBwaW5nRGVmaW5pdGlvbiA9IAorCQkJCWdldEpwYVBsYXRmb3JtKCkuZ2V0SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbih0aGlzKTsKKwkJU3RyaW5nIG1hcHBpbmdLZXkgPSBtYXBwaW5nRGVmaW5pdGlvbi5nZXRLZXkoKTsKKwkJaWYgKHRoaXMubWFwcGluZyAhPSBudWxsCisJCQkJJiYgdmFsdWVzQXJlRXF1YWwodGhpcy5tYXBwaW5nLmdldEtleSgpLCBtYXBwaW5nS2V5KSkgeworCQkJdGhpcy5tYXBwaW5nLnVwZGF0ZSh0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUpOworCQl9IAorCQllbHNlIHsKKwkJCXNldE1hcHBpbmcoYnVpbGRNYXBwaW5nKG1hcHBpbmdEZWZpbml0aW9uKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlQXR0cmlidXRlcygpIHsKKwkJSGFzaEJhZzxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gY29udGV4dEF0dHJpYnV0ZXNUb1JlbW92ZSA9IENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hdHRyaWJ1dGVzKCksIHRoaXMuYXR0cmlidXRlc1NpemUoKSk7CisJCUFycmF5TGlzdDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gY29udGV4dEF0dHJpYnV0ZXNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3Q8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMuYXR0cmlidXRlc1NpemUoKSk7CisJCWludCByZXNvdXJjZUluZGV4ID0gMDsKKwkJCisJCWZvciAoSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcmVzb3VyY2VBdHRyaWJ1dGVzID0gdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZXMoKTsgcmVzb3VyY2VBdHRyaWJ1dGVzLmhhc05leHQoKTsgKSB7CisJCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2VBdHRyaWJ1dGVzLm5leHQoKTsKKwkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKKwkJCWZvciAoSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzID0gY29udGV4dEF0dHJpYnV0ZXNUb1JlbW92ZS5pdGVyYXRvcigpOyBjb250ZXh0QXR0cmlidXRlcy5oYXNOZXh0KCk7ICkgeworCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0QXR0cmlidXRlcy5uZXh0KCk7CisJCQkJaWYgKGNvbnRleHRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkgPT0gcmVzb3VyY2VBdHRyaWJ1dGUpIHsKKwkJCQkJdGhpcy5tb3ZlQXR0cmlidXRlKHJlc291cmNlSW5kZXgsIGNvbnRleHRBdHRyaWJ1dGUpOworCQkJCQljb250ZXh0QXR0cmlidXRlcy5yZW1vdmUoKTsKKwkJCQkJY29udGV4dEF0dHJpYnV0ZXNUb1VwZGF0ZS5hZGQoY29udGV4dEF0dHJpYnV0ZSk7CisJCQkJCW1hdGNoID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKCAhIG1hdGNoKSB7CisJCQkJdGhpcy5hZGRBdHRyaWJ1dGUocmVzb3VyY2VJbmRleCwgdGhpcy5jcmVhdGVBdHRyaWJ1dGUocmVzb3VyY2VBdHRyaWJ1dGUpKTsKKwkJCX0KKwkJCXJlc291cmNlSW5kZXgrKzsKKwkJfQorCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgOiBjb250ZXh0QXR0cmlidXRlc1RvUmVtb3ZlKSB7CisJCQl0aGlzLnJlbW92ZUF0dHJpYnV0ZShjb250ZXh0QXR0cmlidXRlKTsKKwkJfQorCQkvLyBoYW5kbGUgYWRkaW5nIGFuZCByZW1vdmluZyBhdHRyaWJ1dGVzIGZpcnN0LCB1cGRhdGUgdGhlCisJCS8vIHJlbWFpbmluZyBhdHRyaWJ1dGVzIGxhc3Q7IHRoaXMgcmVkdWNlcyB0aGUgY2h1cm4gZHVyaW5nICJ1cGRhdGUiCisJCWZvciAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA6IGNvbnRleHRBdHRyaWJ1dGVzVG9VcGRhdGUpIHsKKwkJCWNvbnRleHRBdHRyaWJ1dGUudXBkYXRlKCk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNyZWF0ZUF0dHJpYnV0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKKwkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIGpycGEpOworCX0KKworCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSBidWlsZFN1cGVyUGVyc2lzdGVudFR5cGUoKSB7CisJCUhhc2hTZXQ8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IHZpc2l0ZWQgPSBuZXcgSGFzaFNldDxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4oKTsKKwkJdmlzaXRlZC5hZGQodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKKwkJUGVyc2lzdGVudFR5cGUgc3B0ID0gdGhpcy5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSgpLCB2aXNpdGVkKTsKKwkJaWYgKHNwdCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHNwdC5pbmhlcml0YW5jZUhpZXJhcmNoeSgpLCB0aGlzKSkgeworCQkJcmV0dXJuIG51bGw7ICAvLyBzaG9ydC1jaXJjdWl0IGluIHRoaXMgY2FzZSwgd2UgaGF2ZSBjaXJjdWxhciBpbmhlcml0YW5jZQorCQl9CisJCXJldHVybiBzcHQuaXNNYXBwZWQoKSA/IHNwdCA6IHNwdC5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCk7CisJfQorCisJLyoqCisJICogVGhlIEpQQSBzcGVjIGFsbG93cyBub24tcGVyc2lzdGVudCB0eXBlcyBpbiBhIHBlcnNpc3RlbnQgdHlwZSdzCisJICogaW5oZXJpdGFuY2UgaGllcmFyY2h5LiBXZSBjaGVjayBmb3IgYSBwZXJzaXN0ZW50IHR5cGUgd2l0aCB0aGUKKwkgKiBzcGVjaWZpZWQgbmFtZSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gSWYgaXQgaXMgbm90IGZvdW5kIHdlIHVzZQorCSAqIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZSBhbmQgbG9vayBmb3IgKml0cyogc3VwZXIgdHlwZS4KKwkgKiAKKwkgKiBUaGUgJ3Zpc2l0ZWQnIGNvbGxlY3Rpb24gaXMgdXNlZCB0byBkZXRlY3QgYSBjeWNsZSBpbiB0aGUgKnJlc291cmNlKiB0eXBlCisJICogaW5oZXJpdGFuY2UgaGllcmFyY2h5IGFuZCBwcmV2ZW50IHRoZSByZXN1bHRpbmcgc3RhY2sgb3ZlcmZsb3cuCisJICogQW55IGN5Y2xlcyBpbiB0aGUgKmNvbnRleHQqIHR5cGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IGFyZSBoYW5kbGVkIGluCisJICogI2J1aWxkU3VwZXJQZXJzaXN0ZW50VHlwZSgpLgorCSAqLworCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSBnZXRTdXBlclBlcnNpc3RlbnRUeXBlKFN0cmluZyB0eXBlTmFtZSwgQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gdmlzaXRlZCkgeworCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VUeXBlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUodHlwZU5hbWUpOworCQlpZiAoKHJlc291cmNlVHlwZSA9PSBudWxsKSB8fCB2aXNpdGVkLmNvbnRhaW5zKHJlc291cmNlVHlwZSkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXZpc2l0ZWQuYWRkKHJlc291cmNlVHlwZSk7CisJCVBlcnNpc3RlbnRUeXBlIHNwdCA9IHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUodHlwZU5hbWUpOworCQlyZXR1cm4gKHNwdCAhPSBudWxsKSA/IHNwdCA6IHRoaXMuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZShyZXNvdXJjZVR5cGUuZ2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKSwgdmlzaXRlZCk7ICAvLyByZWN1cnNlCisJfQorCisJcHJvdGVjdGVkIFBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7CisJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwb3N0VXBkYXRlKCkgeworCQlzdXBlci5wb3N0VXBkYXRlKCk7CisJCWdldE1hcHBpbmcoKS5wb3N0VXBkYXRlKCk7CisJCWZvciAoUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoYXR0cmlidXRlcygpKSkgeworCQkJYXR0cmlidXRlLnBvc3RVcGRhdGUoKTsKKwkJfQorCX0KKwkKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlpZiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgeworCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKTsKKwkJfQorCQkvLyBUT0RPIHRlbXBvcmFyeSBoYWNrIHNpbmNlIHdlIGRvbid0IGtub3cgeWV0IHdoZXJlIHRvIHB1dAorCQkvLyBhbnkgbWVzc2FnZXMgZm9yIHR5cGVzIGluIGFub3RoZXIgcHJvamVjdCAoZS5nLiByZWZlcmVuY2VkIGJ5CisJCS8vIHBlcnNpc3RlbmNlLnhtbCkKKwkJSUZpbGUgZmlsZSA9IHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRGaWxlKCk7CisJCS8vICdmaWxlJyB3aWxsIGJlIG51bGwgaWYgdGhlIHR5cGUgaXMgImV4dGVybmFsIiBhbmQgYmluYXJ5OworCQkvLyB0aGUgZmlsZSB3aWxsIGJlIGluIGEgZGlmZmVyZW50IHByb2plY3QgaWYgdGhlIHR5cGUgaXMgImV4dGVybmFsIiBhbmQgc291cmNlOworCQkvLyB0aGUgdHlwZSB3aWxsIGJlIGJpbmFyeSBpZiBpdCBpcyBpbiBhIEpBUiBpbiB0aGUgY3VycmVudCBwcm9qZWN0CisJCWlmICgoZmlsZSAhPSBudWxsKSAmJiBmaWxlLmdldFByb2plY3QoKS5lcXVhbHModGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSAmJgorCQkJCSh0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUgaW5zdGFuY2VvZiBTb3VyY2VOb2RlKSkgeworCQkJLy8gYnVpbGQgdGhlIEFTVCByb290IGhlcmUgdG8gcGFzcyBkb3duCisJCQl0aGlzLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgdGhpcy5idWlsZEFTVFJvb3QoKSk7CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy52YWxpZGF0ZU1hcHBpbmcobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy52YWxpZGF0ZUF0dHJpYnV0ZXMobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNYXBwaW5nKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRyeSB7CisJCQl0aGlzLm1hcHBpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJfSBjYXRjaChUaHJvd2FibGUgdCkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2codCk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCWZvciAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogdGhpcy5nZXRBdHRyaWJ1dGVzKCkpIHsKKwkJCXRoaXMudmFsaWRhdGVBdHRyaWJ1dGUoYXR0cmlidXRlLCByZXBvcnRlciwgbWVzc2FnZXMsIGFzdFJvb3QpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSwgSVJlcG9ydGVyIHJlcG9ydGVyLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdHJ5IHsKKwkJCWF0dHJpYnV0ZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl9IGNhdGNoKFRocm93YWJsZSB0KSB7CisJCQlKcHRDb3JlUGx1Z2luLmxvZyh0KTsKKwkJfQorCX0KKwkKKworCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXN1cGVyLnRvU3RyaW5nKHNiKTsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJSnBhRmlsZSBqcGFGaWxlID0gdGhpcy5nZXRKcGFGaWxlKCk7CisJCWlmIChqcGFGaWxlICE9IG51bGwpIHsKKwkJCS8vIHRoZSBKUEEgZmlsZSBjYW4gYmUgbnVsbCBpZiB0aGUgLmphdmEgZmlsZSB3YXMgZGVsZXRlZAorCQkJLy8gb3IgdGhlIHJlc291cmNlIHR5cGUgaXMgImV4dGVybmFsIgorCQkJanBhRmlsZS5yZW1vdmVSb290U3RydWN0dXJlTm9kZSh0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFRdWVyeS5qYXZhCmluZGV4IGJiZTQ5ODguLjBkNGE0MTIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhUXVlcnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVF1ZXJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTgsMTAgKzE4LDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVF1ZXJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUXVlcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUXVlcnlIaW50QW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwogCiAKQEAgLTM0LDE1ICszNSwxNSBAQAogCiAJcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YVF1ZXJ5SGludD4gaGludHM7CiAKLQlwcm90ZWN0ZWQgUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5QW5ub3RhdGlvbjsKKwlwcm90ZWN0ZWQgQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uIHJlc291cmNlUXVlcnk7CiAJCiAJcHJvdGVjdGVkIEFic3RyYWN0SmF2YVF1ZXJ5KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKIAkJc3VwZXIocGFyZW50KTsKIAkJdGhpcy5oaW50cyA9IG5ldyBBcnJheUxpc3Q8SmF2YVF1ZXJ5SGludD4oKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUXVlcnlBbm5vdGF0aW9uIGdldFF1ZXJ5UmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnF1ZXJ5QW5ub3RhdGlvbjsKKwlwcm90ZWN0ZWQgQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uIGdldFJlc291cmNlUXVlcnkoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlUXVlcnk7CiAJfQogCQogCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKQEAgLTUyLDcgKzUzLDcgQEAKIAlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CiAJCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwogCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQl0aGlzLnF1ZXJ5QW5ub3RhdGlvbi5zZXROYW1lKG5ld05hbWUpOworCQl0aGlzLnJlc291cmNlUXVlcnkuc2V0TmFtZShuZXdOYW1lKTsKIAkJZmlyZVByb3BlcnR5Q2hhbmdlZChRdWVyeS5OQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKIAl9CiAJCkBAIC02OSw3ICs3MCw3IEBACiAJcHVibGljIHZvaWQgc2V0UXVlcnkoU3RyaW5nIG5ld1F1ZXJ5KSB7CiAJCVN0cmluZyBvbGRRdWVyeSA9IHRoaXMucXVlcnk7CiAJCXRoaXMucXVlcnkgPSBuZXdRdWVyeTsKLQkJdGhpcy5xdWVyeUFubm90YXRpb24uc2V0UXVlcnkobmV3UXVlcnkpOworCQl0aGlzLnJlc291cmNlUXVlcnkuc2V0UXVlcnkobmV3UXVlcnkpOwogCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFF1ZXJ5LlFVRVJZX1BST1BFUlRZLCBvbGRRdWVyeSwgbmV3UXVlcnkpOwogCX0KIAkKQEAgLTkwLDcgKzkxLDcgQEAKIAlwdWJsaWMgSmF2YVF1ZXJ5SGludCBhZGRIaW50KGludCBpbmRleCkgewogCQlKYXZhUXVlcnlIaW50IGhpbnQgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUXVlcnlIaW50KHRoaXMpOwogCQl0aGlzLmhpbnRzLmFkZChpbmRleCwgaGludCk7Ci0JCXRoaXMuZ2V0UXVlcnlSZXNvdXJjZSgpLmFkZEhpbnQoaW5kZXgpOworCQl0aGlzLmdldFJlc291cmNlUXVlcnkoKS5hZGRIaW50KGluZGV4KTsKIAkJdGhpcy5maXJlSXRlbUFkZGVkKFF1ZXJ5LkhJTlRTX0xJU1QsIGluZGV4LCBoaW50KTsKIAkJcmV0dXJuIGhpbnQ7CiAJfQpAQCAtOTksMTMgKzEwMCwxNyBAQAogCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBoaW50LCB0aGlzLmhpbnRzLCBRdWVyeS5ISU5UU19MSVNUKTsKIAl9CiAJCisJcHJvdGVjdGVkIHZvaWQgYWRkSGludChKYXZhUXVlcnlIaW50IGhpbnQpIHsKKwkJYWRkSGludCh0aGlzLmhpbnRzLnNpemUoKSwgaGludCk7CisJfQorCQogCXB1YmxpYyB2b2lkIHJlbW92ZUhpbnQoUXVlcnlIaW50IHF1ZXJ5SGludCkgewogCQlyZW1vdmVIaW50KHRoaXMuaGludHMuaW5kZXhPZihxdWVyeUhpbnQpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgcmVtb3ZlSGludChpbnQgaW5kZXgpIHsKIAkJSmF2YVF1ZXJ5SGludCByZW1vdmVkSGludCA9IHRoaXMuaGludHMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5nZXRRdWVyeVJlc291cmNlKCkucmVtb3ZlSGludChpbmRleCk7CisJCXRoaXMuZ2V0UmVzb3VyY2VRdWVyeSgpLnJlbW92ZUhpbnQoaW5kZXgpOwogCQlmaXJlSXRlbVJlbW92ZWQoUXVlcnkuSElOVFNfTElTVCwgaW5kZXgsIHJlbW92ZWRIaW50KTsKIAl9CiAJCkBAIC0xMTUsMzggKzEyMCwzOSBAQAogCQogCXB1YmxpYyB2b2lkIG1vdmVIaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CiAJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuaGludHMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0UXVlcnlSZXNvdXJjZSgpLm1vdmVIaW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCXRoaXMuZ2V0UmVzb3VyY2VRdWVyeSgpLm1vdmVIaW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CiAJCWZpcmVJdGVtTW92ZWQoUXVlcnkuSElOVFNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQogCX0KIAkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKFF1ZXJ5QW5ub3RhdGlvbiBxdWVyeUFubm90YXRpb24pIHsKLQkJdGhpcy5xdWVyeUFubm90YXRpb24gPSBxdWVyeUFubm90YXRpb247CisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShCYXNlTmFtZWRRdWVyeUFubm90YXRpb24gcXVlcnlBbm5vdGF0aW9uKSB7CisJCXRoaXMucmVzb3VyY2VRdWVyeSA9IHF1ZXJ5QW5ub3RhdGlvbjsKIAkJdGhpcy5uYW1lID0gcXVlcnlBbm5vdGF0aW9uLmdldE5hbWUoKTsKIAkJdGhpcy5xdWVyeSA9IHF1ZXJ5QW5ub3RhdGlvbi5nZXRRdWVyeSgpOwotCQl0aGlzLmluaXRpYWxpemVRdWVyeUhpbnRzKHF1ZXJ5QW5ub3RhdGlvbik7CisJCXRoaXMuaW5pdGlhbGl6ZVF1ZXJ5SGludHMoKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5QW5ub3RhdGlvbikgewotCQl0aGlzLnF1ZXJ5QW5ub3RhdGlvbiA9IHF1ZXJ5QW5ub3RhdGlvbjsKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5QW5ub3RhdGlvbikgeworCQl0aGlzLnJlc291cmNlUXVlcnkgPSBxdWVyeUFubm90YXRpb247CiAJCXRoaXMuc2V0TmFtZV8ocXVlcnlBbm5vdGF0aW9uLmdldE5hbWUoKSk7CiAJCXRoaXMuc2V0UXVlcnlfKHF1ZXJ5QW5ub3RhdGlvbi5nZXRRdWVyeSgpKTsKLQkJdGhpcy51cGRhdGVRdWVyeUhpbnRzKHF1ZXJ5QW5ub3RhdGlvbik7CisJCXRoaXMudXBkYXRlUXVlcnlIaW50cygpOworCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hZGRRdWVyeSh0aGlzKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUXVlcnlIaW50cyhRdWVyeUFubm90YXRpb24gcXVlcnlSZXNvdXJjZSkgewotCQlMaXN0SXRlcmF0b3I8UXVlcnlIaW50QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBxdWVyeVJlc291cmNlLmhpbnRzKCk7CisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVF1ZXJ5SGludHMoKSB7CisJCUxpc3RJdGVyYXRvcjxRdWVyeUhpbnRBbm5vdGF0aW9uPiByZXNvdXJjZUhpbnRzID0gdGhpcy5yZXNvdXJjZVF1ZXJ5LmhpbnRzKCk7CiAJCQotCQl3aGlsZShhbm5vdGF0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMuaGludHMuYWRkKGNyZWF0ZVF1ZXJ5SGludChhbm5vdGF0aW9ucy5uZXh0KCkpKTsKKwkJd2hpbGUocmVzb3VyY2VIaW50cy5oYXNOZXh0KCkpIHsKKwkJCXRoaXMuaGludHMuYWRkKGNyZWF0ZVF1ZXJ5SGludChyZXNvdXJjZUhpbnRzLm5leHQoKSkpOwogCQl9CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVF1ZXJ5SGludHMoUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5UmVzb3VyY2UpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFRdWVyeUhpbnQ+IGhpbnRzID0gaGludHMoKTsKLQkJTGlzdEl0ZXJhdG9yPFF1ZXJ5SGludEFubm90YXRpb24+IHJlc291cmNlSGludHMgPSBxdWVyeVJlc291cmNlLmhpbnRzKCk7CisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUXVlcnlIaW50cygpIHsKKwkJTGlzdEl0ZXJhdG9yPEphdmFRdWVyeUhpbnQ+IGNvbnRleHRIaW50cyA9IGhpbnRzKCk7CisJCUxpc3RJdGVyYXRvcjxRdWVyeUhpbnRBbm5vdGF0aW9uPiByZXNvdXJjZUhpbnRzID0gdGhpcy5yZXNvdXJjZVF1ZXJ5LmhpbnRzKCk7CiAJCQotCQl3aGlsZSAoaGludHMuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUXVlcnlIaW50IGhpbnQgPSBoaW50cy5uZXh0KCk7CisJCXdoaWxlIChjb250ZXh0SGludHMuaGFzTmV4dCgpKSB7CisJCQlKYXZhUXVlcnlIaW50IGhpbnQgPSBjb250ZXh0SGludHMubmV4dCgpOwogCQkJaWYgKHJlc291cmNlSGludHMuaGFzTmV4dCgpKSB7CiAJCQkJaGludC51cGRhdGUocmVzb3VyY2VIaW50cy5uZXh0KCkpOwogCQkJfQpAQCAtMTU2LDI2ICsxNjIsMzkgQEAKIAkJfQogCQkKIAkJd2hpbGUgKHJlc291cmNlSGludHMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRIaW50KGhpbnRzU2l6ZSgpLCBjcmVhdGVRdWVyeUhpbnQocmVzb3VyY2VIaW50cy5uZXh0KCkpKTsKKwkJCWFkZEhpbnQoY3JlYXRlUXVlcnlIaW50KHJlc291cmNlSGludHMubmV4dCgpKSk7CiAJCX0KIAl9CiAKLQlwcm90ZWN0ZWQgSmF2YVF1ZXJ5SGludCBjcmVhdGVRdWVyeUhpbnQoUXVlcnlIaW50QW5ub3RhdGlvbiBoaW50UmVzb3VyY2UpIHsKKwlwcm90ZWN0ZWQgSmF2YVF1ZXJ5SGludCBjcmVhdGVRdWVyeUhpbnQoUXVlcnlIaW50QW5ub3RhdGlvbiByZXNvdXJjZVF1ZXJ5SGludCkgewogCQlKYXZhUXVlcnlIaW50IHF1ZXJ5SGludCA9ICBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUXVlcnlIaW50KHRoaXMpOwotCQlxdWVyeUhpbnQuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShoaW50UmVzb3VyY2UpOworCQlxdWVyeUhpbnQuaW5pdGlhbGl6ZShyZXNvdXJjZVF1ZXJ5SGludCk7CiAJCXJldHVybiBxdWVyeUhpbnQ7CiAJfQogCiAJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnF1ZXJ5QW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7CisJCXJldHVybiB0aGlzLnJlc291cmNlUXVlcnkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwogCX0KIAkKIAlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlBbm5vdGF0aW9uLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7CisJCXJldHVybiB0aGlzLnJlc291cmNlUXVlcnkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKIAl9CiAJCi0JcHVibGljIGJvb2xlYW4gb3ZlcnJpZGVzKFF1ZXJ5IHF1ZXJ5KSB7CisJcHVibGljIGJvb2xlYW4gb3ZlcnJpZGVzKFF1ZXJ5IG90aGVyKSB7CiAJCS8vIGphdmEgaXMgYXQgdGhlIGJhc2Ugb2YgdGhlIHRyZWUKIAkJcmV0dXJuIGZhbHNlOwogCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBkdXBsaWNhdGVzKFF1ZXJ5IG90aGVyKSB7CisJCXJldHVybiAodGhpcyAhPSBvdGhlcikKKwkJCQkmJiAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKQorCQkJCSYmIHRoaXMubmFtZS5lcXVhbHMob3RoZXIuZ2V0TmFtZSgpKQorCQkJCSYmICEgdGhpcy5vdmVycmlkZXMob3RoZXIpCisJCQkJJiYgISBvdGhlci5vdmVycmlkZXModGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQppbmRleCA5YmUyYjRiLi5lY2RlYTI2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCwxODkgKzEwLDI4MiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFDYXNjYWRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5SZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwogCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhUmVsYXRpb25zaGlwTWFwcGluZzxUIGV4dGVuZHMgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24+IGV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxUPgorLyoqCisgKiBKYXZhIHJlbGF0aW9uc2hpcCBtYXBwaW5nCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nPFQgZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbj4KKwlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8VD4KIAlpbXBsZW1lbnRzIEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nCiB7Ci0KIAlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFRhcmdldEVudGl0eTsKLQogCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhcmdldEVudGl0eTsKLQogCXByb3RlY3RlZCBFbnRpdHkgcmVzb2x2ZWRUYXJnZXRFbnRpdHk7CiAKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YVJlbGF0aW9uc2hpcFJlZmVyZW5jZSByZWxhdGlvbnNoaXBSZWZlcmVuY2U7CisKIAlwcm90ZWN0ZWQgZmluYWwgSmF2YUNhc2NhZGUgY2FzY2FkZTsKLQkKKwogCXByb3RlY3RlZCBGZXRjaFR5cGUgc3BlY2lmaWVkRmV0Y2g7Ci0JCisKKwogCXByb3RlY3RlZCBBYnN0cmFjdEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewogCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNhc2NhZGUgPSBuZXcgSmF2YUNhc2NhZGUodGhpcyk7CisJCXRoaXMucmVsYXRpb25zaGlwUmVmZXJlbmNlID0gdGhpcy5idWlsZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOworCQl0aGlzLmNhc2NhZGUgPSB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFDYXNjYWRlKHRoaXMpOwogCX0KLQkKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCXN1cGVyLmluaXRpYWxpemUoKTsKKwkJdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5ID0gdGhpcy5idWlsZERlZmF1bHRUYXJnZXRFbnRpdHkoKTsKKwkJdGhpcy5yZWxhdGlvbnNoaXBSZWZlcmVuY2UuaW5pdGlhbGl6ZSgpOworCQl0aGlzLnNwZWNpZmllZEZldGNoID0gdGhpcy5nZXRSZXNvdXJjZUZldGNoKCk7CisJCXRoaXMuY2FzY2FkZS5pbml0aWFsaXplKHRoaXMubWFwcGluZ0Fubm90YXRpb24pOworCQl0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eSA9IHRoaXMuZ2V0UmVzb3VyY2VUYXJnZXRFbnRpdHkoKTsKKwkJdGhpcy5yZXNvbHZlZFRhcmdldEVudGl0eSA9IHRoaXMuYnVpbGRSZXNvbHZlZFRhcmdldEVudGl0eSgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0RGVmYXVsdFRhcmdldEVudGl0eSh0aGlzLmJ1aWxkRGVmYXVsdFRhcmdldEVudGl0eSgpKTsKKwkJdGhpcy5yZWxhdGlvbnNoaXBSZWZlcmVuY2UudXBkYXRlKCk7CisJCXRoaXMuc2V0U3BlY2lmaWVkRmV0Y2hfKHRoaXMuZ2V0UmVzb3VyY2VGZXRjaCgpKTsKKwkJdGhpcy5jYXNjYWRlLnVwZGF0ZSh0aGlzLm1hcHBpbmdBbm5vdGF0aW9uKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHlfKHRoaXMuZ2V0UmVzb3VyY2VUYXJnZXRFbnRpdHkoKSk7CisJCXRoaXMuc2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkodGhpcy5idWlsZFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOworCX0KKworCisJLy8gKioqKioqKioqKiB0YXJnZXQgZW50aXR5ICoqKioqKioqKioKKwogCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkgOiB0aGlzLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpOworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5ICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHkgOiB0aGlzLmRlZmF1bHRUYXJnZXRFbnRpdHk7CiAJfQogCiAJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSB7CiAJCXJldHVybiB0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eTsKIAl9CiAKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoU3RyaW5nIG5ld1NwZWNpZmllZFRhcmdldEVudGl0eSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkVGFyZ2V0RW50aXR5ID0gdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHk7Ci0JCXRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5ID0gbmV3U3BlY2lmaWVkVGFyZ2V0RW50aXR5OwotCQl0aGlzLmdldE1hcHBpbmdSZXNvdXJjZSgpLnNldFRhcmdldEVudGl0eShuZXdTcGVjaWZpZWRUYXJnZXRFbnRpdHkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFJlbGF0aW9uc2hpcE1hcHBpbmcuU1BFQ0lGSUVEX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFksIG9sZFNwZWNpZmllZFRhcmdldEVudGl0eSwgbmV3U3BlY2lmaWVkVGFyZ2V0RW50aXR5KTsKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoU3RyaW5nIHRhcmdldEVudGl0eSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHk7CisJCXRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5ID0gdGFyZ2V0RW50aXR5OworCQl0aGlzLm1hcHBpbmdBbm5vdGF0aW9uLnNldFRhcmdldEVudGl0eSh0YXJnZXRFbnRpdHkpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFksIG9sZCwgdGFyZ2V0RW50aXR5KTsKIAl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5XyhTdHJpbmcgbmV3U3BlY2lmaWVkVGFyZ2V0RW50aXR5KSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRUYXJnZXRFbnRpdHkgPSB0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eTsKLQkJdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHkgPSBuZXdTcGVjaWZpZWRUYXJnZXRFbnRpdHk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUmVsYXRpb25zaGlwTWFwcGluZy5TUEVDSUZJRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVGFyZ2V0RW50aXR5LCBuZXdTcGVjaWZpZWRUYXJnZXRFbnRpdHkpOworCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5XyhTdHJpbmcgdGFyZ2V0RW50aXR5KSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eTsKKwkJdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHkgPSB0YXJnZXRFbnRpdHk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkLCB0YXJnZXRFbnRpdHkpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VUYXJnZXRFbnRpdHkoKSB7CisJCXJldHVybiB0aGlzLm1hcHBpbmdBbm5vdGF0aW9uLmdldFRhcmdldEVudGl0eSgpOwogCX0KIAogCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpIHsKIAkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhcmdldEVudGl0eTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VGFyZ2V0RW50aXR5KFN0cmluZyBuZXdEZWZhdWx0VGFyZ2V0RW50aXR5KSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0VGFyZ2V0RW50aXR5ID0gdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5OwotCQl0aGlzLmRlZmF1bHRUYXJnZXRFbnRpdHkgPSBuZXdEZWZhdWx0VGFyZ2V0RW50aXR5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFJlbGF0aW9uc2hpcE1hcHBpbmcuREVGQVVMVF9UQVJHRVRfRU5USVRZX1BST1BFUlRZLCBvbGREZWZhdWx0VGFyZ2V0RW50aXR5LCBuZXdEZWZhdWx0VGFyZ2V0RW50aXR5KTsKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VGFyZ2V0RW50aXR5KFN0cmluZyB0YXJnZXRFbnRpdHkpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFRhcmdldEVudGl0eTsKKwkJdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5ID0gdGFyZ2V0RW50aXR5OworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9UQVJHRVRfRU5USVRZX1BST1BFUlRZLCBvbGQsIHRhcmdldEVudGl0eSk7CiAJfQogCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBidWlsZERlZmF1bHRUYXJnZXRFbnRpdHkoKTsKKwogCXB1YmxpYyBFbnRpdHkgZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSB7CiAJCXJldHVybiB0aGlzLnJlc29sdmVkVGFyZ2V0RW50aXR5OwogCX0KIAotCXByb3RlY3RlZCB2b2lkIHNldFJlc29sdmVkVGFyZ2V0RW50aXR5KEVudGl0eSBuZXdSZXNvbHZlZFRhcmdldEVudGl0eSkgewotCQlFbnRpdHkgb2xkUmVzb2x2ZWRUYXJnZXRFbnRpdHkgPSB0aGlzLnJlc29sdmVkVGFyZ2V0RW50aXR5OwotCQl0aGlzLnJlc29sdmVkVGFyZ2V0RW50aXR5ID0gbmV3UmVzb2x2ZWRUYXJnZXRFbnRpdHk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUmVsYXRpb25zaGlwTWFwcGluZy5SRVNPTFZFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZLCBvbGRSZXNvbHZlZFRhcmdldEVudGl0eSwgbmV3UmVzb2x2ZWRUYXJnZXRFbnRpdHkpOworCXByb3RlY3RlZCB2b2lkIHNldFJlc29sdmVkVGFyZ2V0RW50aXR5KEVudGl0eSBlbnRpdHkpIHsKKwkJRW50aXR5IG9sZCA9IHRoaXMucmVzb2x2ZWRUYXJnZXRFbnRpdHk7CisJCXRoaXMucmVzb2x2ZWRUYXJnZXRFbnRpdHkgPSBlbnRpdHk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRVNPTFZFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZLCBvbGQsIGVudGl0eSk7CiAJfQogCisJcHJvdGVjdGVkIEVudGl0eSBidWlsZFJlc29sdmVkVGFyZ2V0RW50aXR5KCkgeworCQlTdHJpbmcgdGFyZ2V0RW50aXR5Q2xhc3NOYW1lID0gKHRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5ID09IG51bGwpID8KKwkJCQkJCXRoaXMuZGVmYXVsdFRhcmdldEVudGl0eSA6CisJCQkJCQl0aGlzLm1hcHBpbmdBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCk7CisJCXJldHVybiAodGFyZ2V0RW50aXR5Q2xhc3NOYW1lID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RW50aXR5KHRhcmdldEVudGl0eUNsYXNzTmFtZSk7CisJfQorCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTmFtZXMoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPigKKwkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhdG9yPFN0cmluZz4+KHRoaXMuYWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTWFwcGluZ3MoKSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHRyYW5zZm9ybShBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcpIHsKKwkJCQkJcmV0dXJuIG1hcHBpbmcuYWxsTWFwcGluZ05hbWVzKCk7CisJCQkJfQorCQl9KTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZz4gYWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTWFwcGluZ3MoKSB7CisJCXJldHVybiAodGhpcy5yZXNvbHZlZFRhcmdldEVudGl0eSAhPSBudWxsKSA/CisJCQkJdGhpcy5yZXNvbHZlZFRhcmdldEVudGl0eS5hbGxBdHRyaWJ1dGVNYXBwaW5ncygpIDoKKwkJCQlFbXB0eUl0ZXJhdG9yLjxBdHRyaWJ1dGVNYXBwaW5nPiBpbnN0YW5jZSgpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5SWRBdHRyaWJ1dGVOYW1lKCkgeworCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHRoaXMuZ2V0VGFyZ2V0RW50aXR5SWRBdHRyaWJ1dGUoKTsKKwkJcmV0dXJuIChhdHRyaWJ1dGUgPT0gbnVsbCkgPyBudWxsIDogYXR0cmlidXRlLmdldE5hbWUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRUYXJnZXRFbnRpdHlJZEF0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuICh0aGlzLnJlc29sdmVkVGFyZ2V0RW50aXR5ID09IG51bGwpID8gbnVsbCA6IHRoaXMucmVzb2x2ZWRUYXJnZXRFbnRpdHkuZ2V0SWRBdHRyaWJ1dGUoKTsKKwl9CisKKwlwdWJsaWMgY2hhciBnZXRUYXJnZXRFbnRpdHlFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgeworCQlyZXR1cm4gJy4nOworCX0KKworCisJLy8gKioqKioqKioqKiByZWxhdGlvbnNoaXAgcmVmZXJlbmNlICoqKioqKioqKiogIAorCisJcHVibGljIEphdmFSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBSZWZlcmVuY2U7CisJfQorCisJcHJvdGVjdGVkIGFic3RyYWN0IEphdmFSZWxhdGlvbnNoaXBSZWZlcmVuY2UgYnVpbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKworCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKSB7CisJCXJldHVybiB0aGlzLnJlbGF0aW9uc2hpcFJlZmVyZW5jZS5pc1JlbGF0aW9uc2hpcE93bmVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNPd25lZEJ5KFJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZykgeworCQlyZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBSZWZlcmVuY2UuaXNPd25lZEJ5KG1hcHBpbmcpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmcoKSB7CisJCXJldHVybiB0aGlzLnJlbGF0aW9uc2hpcFJlZmVyZW5jZS5pc092ZXJyaWRhYmxlQXNzb2NpYXRpb24oKTsKKwl9CisKKworCS8vICoqKioqKioqKiogY2FzY2FkZSAqKioqKioqKioqICAKKwogCXB1YmxpYyBKYXZhQ2FzY2FkZSBnZXRDYXNjYWRlKCkgewogCQlyZXR1cm4gdGhpcy5jYXNjYWRlOwogCX0KIAorCisJLy8gKioqKioqKioqKiBmZXRjaCAqKioqKioqKioqICAKKwogCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRGZXRjaCgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0RmV0Y2goKSA6IHRoaXMuZ2V0U3BlY2lmaWVkRmV0Y2goKTsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEZldGNoICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRGZXRjaCA6IHRoaXMuZ2V0RGVmYXVsdEZldGNoKCk7CiAJfQotCQorCiAJcHVibGljIEZldGNoVHlwZSBnZXRTcGVjaWZpZWRGZXRjaCgpIHsKIAkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRmV0Y2g7CiAJfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZSBuZXdTcGVjaWZpZWRGZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkRmV0Y2ggPSB0aGlzLnNwZWNpZmllZEZldGNoOwotCQl0aGlzLnNwZWNpZmllZEZldGNoID0gbmV3U3BlY2lmaWVkRmV0Y2g7Ci0JCXRoaXMuZ2V0TWFwcGluZ1Jlc291cmNlKCkuc2V0RmV0Y2goRmV0Y2hUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRmV0Y2gpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChGZXRjaGFibGUuU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGRGZXRjaCwgbmV3U3BlY2lmaWVkRmV0Y2gpOworCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlIGZldGNoKSB7CisJCUZldGNoVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZEZldGNoOworCQl0aGlzLnNwZWNpZmllZEZldGNoID0gZmV0Y2g7CisJCXRoaXMubWFwcGluZ0Fubm90YXRpb24uc2V0RmV0Y2goRmV0Y2hUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwoZmV0Y2gpKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9GRVRDSF9QUk9QRVJUWSwgb2xkLCBmZXRjaCk7CiAJfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEZldGNoXyhGZXRjaFR5cGUgbmV3U3BlY2lmaWVkRmV0Y2gpIHsKLQkJRmV0Y2hUeXBlIG9sZEZldGNoID0gdGhpcy5zcGVjaWZpZWRGZXRjaDsKLQkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IG5ld1NwZWNpZmllZEZldGNoOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEZldGNoYWJsZS5TUEVDSUZJRURfRkVUQ0hfUFJPUEVSVFksIG9sZEZldGNoLCBuZXdTcGVjaWZpZWRGZXRjaCk7CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaF8oRmV0Y2hUeXBlIGZldGNoKSB7CisJCUZldGNoVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZEZldGNoOworCQl0aGlzLnNwZWNpZmllZEZldGNoID0gZmV0Y2g7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRkVUQ0hfUFJPUEVSVFksIG9sZCwgZmV0Y2gpOwogCX0KIAorCXByb3RlY3RlZCBGZXRjaFR5cGUgZ2V0UmVzb3VyY2VGZXRjaCgpIHsKKwkJcmV0dXJuIEZldGNoVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwodGhpcy5tYXBwaW5nQW5ub3RhdGlvbi5nZXRGZXRjaCgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogSmF2YSBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqICAKKwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tUmVzb3VyY2UoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5ID0gdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5KHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tUmVzb3VyY2UocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKIAl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXRoaXMuc2V0RGVmYXVsdFRhcmdldEVudGl0eSh0aGlzLmRlZmF1bHRUYXJnZXRFbnRpdHkocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSk7Ci0JCXN1cGVyLnVwZGF0ZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFQgcmVsYXRpb25zaGlwTWFwcGluZykgewotCQl0aGlzLnNwZWNpZmllZEZldGNoID0gdGhpcy5mZXRjaChyZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQkJdGhpcy5jYXNjYWRlLmluaXRpYWxpemUocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5ID0gdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHkocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMucmVzb2x2ZWRUYXJnZXRFbnRpdHkgPSB0aGlzLnJlc29sdmVUYXJnZXRFbnRpdHkocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JfQorCisKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKiAgCiAKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoVCByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXN1cGVyLnVwZGF0ZShyZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRGZXRjaF8odGhpcy5mZXRjaChyZWxhdGlvbnNoaXBNYXBwaW5nKSk7Ci0JCXRoaXMuY2FzY2FkZS51cGRhdGUocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5Xyh0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eShyZWxhdGlvbnNoaXBNYXBwaW5nKSk7Ci0JCXRoaXMuc2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkodGhpcy5yZXNvbHZlVGFyZ2V0RW50aXR5KHJlbGF0aW9uc2hpcE1hcHBpbmcpKTsKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLnZhbGlkYXRlVGFyZ2V0RW50aXR5KG1lc3NhZ2VzLCBhc3RSb290KTsKKwkJdGhpcy5yZWxhdGlvbnNoaXBSZWZlcmVuY2UudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKIAl9Ci0JCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBmZXRjaChUIHJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJcmV0dXJuIEZldGNoVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwocmVsYXRpb25zaGlwTWFwcGluZy5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYXJnZXRFbnRpdHkoVCByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXJldHVybiByZWxhdGlvbnNoaXBNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRlZmF1bHRUYXJnZXRFbnRpdHkoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQotCXByb3RlY3RlZCBFbnRpdHkgcmVzb2x2ZVRhcmdldEVudGl0eShUIHJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJU3RyaW5nIHF1YWxpZmllZFRhcmdldEVudGl0eSA9IGdldERlZmF1bHRUYXJnZXRFbnRpdHkoKTsKLQkJaWYgKGdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpICE9IG51bGwpIHsKLQkJCXF1YWxpZmllZFRhcmdldEVudGl0eSA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKTsKKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVGFyZ2V0RW50aXR5KExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlpZiAodGhpcy5nZXRUYXJnZXRFbnRpdHkoKSA9PSBudWxsKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UQVJHRVRfRU5USVRZX05PVF9ERUZJTkVELAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwgCisJCQkJCXRoaXMsIAorCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkpCisJCQkpOwogCQl9Ci0JCWlmIChxdWFsaWZpZWRUYXJnZXRFbnRpdHkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7CisJCWVsc2UgaWYgKHRoaXMucmVzb2x2ZWRUYXJnZXRFbnRpdHkgPT0gbnVsbCkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFSR0VUX0VOVElUWV9JU19OT1RfQU5fRU5USVRZLAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0VGFyZ2V0RW50aXR5KCksIHRoaXMuZ2V0TmFtZSgpfSwgCisJCQkJCXRoaXMsIAorCQkJCQl0aGlzLmdldFRhcmdldEVudGl0eVRleHRSYW5nZShhc3RSb290KQorCQkJCSkKKwkJCSk7CiAJCX0KLQkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZShxdWFsaWZpZWRUYXJnZXRFbnRpdHkpOwotCQlpZiAocGVyc2lzdGVudFR5cGUgIT0gbnVsbCAmJiBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nS2V5KCkgPT0gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpIHsKLQkJCXJldHVybiAoRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CiAJfQogCi0JcHVibGljIEVudGl0eSBnZXRFbnRpdHkoKSB7Ci0JCWlmIChnZXRUeXBlTWFwcGluZygpIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlyZXR1cm4gKEVudGl0eSkgZ2V0VHlwZU1hcHBpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFRhcmdldEVudGl0eVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRUZXh0UmFuZ2UodGhpcy5tYXBwaW5nQW5ub3RhdGlvbi5nZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoYXN0Um9vdCksIGFzdFJvb3QpOwogCX0KIAotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbFRhcmdldEVudGl0eUF0dHJpYnV0ZU5hbWVzKCkgewotCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQlyZXR1cm4gKHRhcmdldEVudGl0eSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPFN0cmluZz4gaW5zdGFuY2UoKSA6IHRhcmdldEVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZU5hbWVzKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuYWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTmFtZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPih0aGlzLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBxdW90ZWRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMucXVvdGUodGhpcy5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKGZpbHRlcikpOworCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKFRleHRSYW5nZSB0ZXh0UmFuZ2UsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwogCX0KIAogCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisJLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKiAKIAotCXB1YmxpYyBib29sZWFuIHRhcmdldEVudGl0eUlzVmFsaWQoU3RyaW5nIHRhcmdldEVudGl0eSkgewotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLnRhcmdldEVudGl0eUlzVmFsaWQodGFyZ2V0RW50aXR5KTsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbFR5cGVOYW1lKCkgeworCQlTdHJpbmcgdGFyZ2V0RW50aXR5ID0gdGhpcy5nZXRUYXJnZXRFbnRpdHkoKTsKKwkJcmV0dXJuICh0YXJnZXRFbnRpdHkgIT0gbnVsbCkgPyB0YXJnZXRFbnRpdHkgOiBNZXRhbW9kZWxGaWVsZC5ERUZBVUxUX1RZUEVfTkFNRTsKIAl9CisKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYzc3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFSZWxhdGlvbnNoaXBSZWZlcmVuY2UKKwlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlIAorCWltcGxlbWVudHMgSmF2YVJlbGF0aW9uc2hpcFJlZmVyZW5jZQoreworCS8vIGNhY2hlIHRoZSBzdHJhdGVneSBmb3IgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbgorCXByb3RlY3RlZCBKb2luaW5nU3RyYXRlZ3kgY2FjaGVkUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3k7CisJCisJCisJcHVibGljIEFic3RyYWN0SmF2YVJlbGF0aW9uc2hpcFJlZmVyZW5jZShKYXZhUmVsYXRpb25zaGlwTWFwcGluZyBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJCisJcHVibGljIEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7CisJCXJldHVybiAoSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcpIGdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmcoKTsKKwl9CisJCisJcHVibGljIEVudGl0eSBnZXRFbnRpdHkoKSB7CisJCVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gZ2V0VHlwZU1hcHBpbmcoKTsKKwkJcmV0dXJuICh0eXBlTWFwcGluZyBpbnN0YW5jZW9mIEVudGl0eSkgPyAoRW50aXR5KSB0eXBlTWFwcGluZyA6IG51bGw7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbigpIHsKKwkJcmV0dXJuIGdldFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkuaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNQYXJlbnRWaXJ0dWFsKCkgeworCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKiBwcmVkb21pbmFudCBqb2luaW5nIHN0cmF0ZWd5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBKb2luaW5nU3RyYXRlZ3kgZ2V0UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiB0aGlzLmNhY2hlZFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5OworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneShKb2luaW5nU3RyYXRlZ3kgbmV3Sm9pbmluZ1N0cmF0ZWd5KSB7CisJCUpvaW5pbmdTdHJhdGVneSBvbGRKb2luaW5nU3RyYXRlZ3kgPSB0aGlzLmNhY2hlZFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5OworCQl0aGlzLmNhY2hlZFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5ID0gbmV3Sm9pbmluZ1N0cmF0ZWd5OworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBSRURPTUlOQU5UX0pPSU5JTkdfU1RSQVRFR1lfUFJPUEVSVFksIG9sZEpvaW5pbmdTdHJhdGVneSwgbmV3Sm9pbmluZ1N0cmF0ZWd5KTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZSAtPiBjb250ZXh0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CisJCWluaXRpYWxpemVKb2luaW5nU3RyYXRlZ2llcygpOworCQl0aGlzLmNhY2hlZFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5ID0gY2FsY3VsYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKTsKKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVnaWVzKCk7CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl1cGRhdGVKb2luaW5nU3RyYXRlZ2llcygpOworCQlzZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneShjYWxjdWxhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdXBkYXRlSm9pbmluZ1N0cmF0ZWdpZXMoKTsKKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgSm9pbmluZ1N0cmF0ZWd5IGNhbGN1bGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCk7CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFTZXF1ZW5jZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFTZXF1ZW5jZUdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNTk0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVNlcXVlbmNlR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOworCisvKioKKyAqIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhU2VxdWVuY2VHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEphdmFHZW5lcmF0b3IKKwlpbXBsZW1lbnRzIEphdmFTZXF1ZW5jZUdlbmVyYXRvcgoreworCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2VxdWVuY2VOYW1lOworCisKKwlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhU2VxdWVuY2VHZW5lcmF0b3IoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKworCisJLy8gKioqKioqKioqKiBzZXF1ZW5jZSBuYW1lICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0U2VxdWVuY2VOYW1lKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWUgOiB0aGlzLmdldERlZmF1bHRTZXF1ZW5jZU5hbWUoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNlcXVlbmNlTmFtZShTdHJpbmcgc3BlY2lmaWVkU2VxdWVuY2VOYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZTsKKwkJdGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWUgPSBzcGVjaWZpZWRTZXF1ZW5jZU5hbWU7CisJCXRoaXMuZ2V0UmVzb3VyY2VHZW5lcmF0b3IoKS5zZXRTZXF1ZW5jZU5hbWUoc3BlY2lmaWVkU2VxdWVuY2VOYW1lKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TRVFVRU5DRV9OQU1FX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZFNlcXVlbmNlTmFtZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lXyhTdHJpbmcgc3BlY2lmaWVkU2VxdWVuY2VOYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZTsKKwkJdGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWUgPSBzcGVjaWZpZWRTZXF1ZW5jZU5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkLCBzcGVjaWZpZWRTZXF1ZW5jZU5hbWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlcXVlbmNlTmFtZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisKKwkvLyAqKioqKioqKioqIHJlc291cmNlID0+IGNvbnRleHQgKioqKioqKioqKgorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gcmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcikgeworCQlzdXBlci5pbml0aWFsaXplKHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IpOworCQl0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IuZ2V0U2VxdWVuY2VOYW1lKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZShTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gcmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcikgeworCQlzdXBlci51cGRhdGUocmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcik7CisJCXRoaXMuc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lXyhyZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yLmdldFNlcXVlbmNlTmFtZSgpKTsgCisJfQorCisKKwkvLyAqKioqKioqKioqIEphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgorCisJLyoqCisJICogY2FsbGVkIGlmIHRoZSBkYXRhYmFzZSBpcyBjb25uZWN0ZWQ6CisJICogc2VxdWVuY2VOYW1lCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY29ubmVjdGVkSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmNvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWlmICh0aGlzLnNlcXVlbmNlTmFtZVRvdWNoZXMocG9zLCBhc3RSb290KSkgeworCQkJcmV0dXJuIHRoaXMuamF2YUNhbmRpZGF0ZVNlcXVlbmNlcyhmaWx0ZXIpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIHNlcXVlbmNlTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VHZW5lcmF0b3IoKS5zZXF1ZW5jZU5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCk7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNhbmRpZGF0ZVNlcXVlbmNlcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKKwkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmNhbmRpZGF0ZVNlcXVlbmNlcyhmaWx0ZXIpKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVTZXF1ZW5jZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2FuZGlkYXRlU2VxdWVuY2VzKCksIGZpbHRlcik7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlU2VxdWVuY2VzKCkgeworCQlTY2hlbWEgZGJTY2hlbWEgPSB0aGlzLmdldERiU2NoZW1hKCk7CisJCXJldHVybiAoZGJTY2hlbWEgIT0gbnVsbCkgPyBkYlNjaGVtYS5zb3J0ZWRTZXF1ZW5jZUlkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+IGluc3RhbmNlKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgorCisJcHVibGljIGludCBnZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkgeworCQlyZXR1cm4gU2VxdWVuY2VHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIGdldFJlc291cmNlR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgc3VwZXIuZ2V0UmVzb3VyY2VHZW5lcmF0b3IoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKaW5kZXggMWYwOWEyYy4uMDkxMzU3NyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw0MjUgKzksMTU1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk51bGxhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5KcGFGYWN0b3J5Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NYXBzSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YURlcml2ZWRJZDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFwc0lkMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5SZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKIAotCisvKioKKyAqIEphdmEgc2luZ2xlIHJlbGF0aW9uc2hpcCAoMToxLCBtOjEpIG1hcHBpbmcKKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc8VCBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uPgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhUmVsYXRpb25zaGlwTWFwcGluZzxUPiBpbXBsZW1lbnRzIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nPFQ+CisJaW1wbGVtZW50cyBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMAogewotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1uczsKLQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbjsKLQogCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE9wdGlvbmFsOwogCisJcHJvdGVjdGVkIGZpbmFsIEphdmFEZXJpdmVkSWQyXzAgZGVyaXZlZElkOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhTWFwc0lkMl8wIG1hcHNJZDsKKwkKKwkKIAlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKIAkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8SmF2YUpvaW5Db2x1bW4+KCk7CisJCXRoaXMuZGVyaXZlZElkID0gYnVpbGREZXJpdmVkSWQoKTsKKwkJdGhpcy5tYXBzSWQgPSBidWlsZE1hcHNJZCgpOwogCX0KIAkKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldERlZmF1bHRGZXRjaCgpIHsKLQkJcmV0dXJuIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuREVGQVVMVF9GRVRDSF9UWVBFOworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCXN1cGVyLmluaXRpYWxpemUoKTsKKwkJdGhpcy5zcGVjaWZpZWRPcHRpb25hbCA9IHRoaXMuZ2V0UmVzb3VyY2VPcHRpb25hbCgpOworCQl0aGlzLmRlcml2ZWRJZC5pbml0aWFsaXplKCk7CisJCXRoaXMubWFwc0lkLmluaXRpYWxpemUoKTsKIAl9CiAJCi0JLy8qKioqKioqKioqKioqKioqKiBJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKgotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkgOiB0aGlzLmRlZmF1bHRKb2luQ29sdW1ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbnNTaXplKCk7CisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRPcHRpb25hbF8odGhpcy5nZXRSZXNvdXJjZU9wdGlvbmFsKCkpOworCQl0aGlzLmRlcml2ZWRJZC51cGRhdGUoKTsKKwkJdGhpcy5tYXBzSWQudXBkYXRlKCk7CiAJfQogCQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRKb2luQ29sdW1uKEphdmFKb2luQ29sdW1uIG5ld0pvaW5Db2x1bW4pIHsKLQkJSmF2YUpvaW5Db2x1bW4gb2xkSm9pbkNvbHVtbiA9IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBuZXdKb2luQ29sdW1uOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuREVGQVVMVF9KT0lOX0NPTFVNTiwgb2xkSm9pbkNvbHVtbiwgbmV3Sm9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gZGVmYXVsdEpvaW5Db2x1bW5zKCkgewotCQlpZiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4pOworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmdbXSBidWlsZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7CisJCVN0cmluZ1tdIGFubm90YXRpb25OYW1lcyA9IEFycmF5VG9vbHMuYWRkQWxsKAorCQkJc3VwZXIuYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCisJCQlKUEEuSk9JTl9DT0xVTU4sCisJCQlKUEEuSk9JTl9DT0xVTU5TLAorCQkJSlBBLkpPSU5fVEFCTEUpOworCQkKKwkJaWYgKGdldEpwYVBsYXRmb3JtVmVyc2lvbigpLmlzQ29tcGF0aWJsZVdpdGhKcGFWZXJzaW9uKEpwdENvcmVQbHVnaW4uSlBBX0ZBQ0VUX1ZFUlNJT05fMl8wKSkgeworCQkJYW5ub3RhdGlvbk5hbWVzID0gQXJyYXlUb29scy5hZGRBbGwoCisJCQkJYW5ub3RhdGlvbk5hbWVzLAorCQkJCUpQQS5JRCwKKwkJCQlKUEEyXzAuTUFQU19JRCk7CiAJCX0KLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7CisJCQorCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWVzOwogCX0KIAkKLQlwcm90ZWN0ZWQgaW50IGRlZmF1bHRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KIAkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4odGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucyk7Ci0JfQotCi0JcHVibGljIGludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gIXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlKYXZhSm9pbkNvbHVtbiBvbGREZWZhdWx0Sm9pbkNvbHVtbiA9IHRoaXMuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkJaWYgKG9sZERlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCS8vbnVsbCB0aGUgZGVmYXVsdCBqb2luIGNvbHVtbiBub3cgaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCQkJLy9pZiBvbmUgZG9lcyBub3QgZXhpc3QsIHRoZXJlIGlzIGFscmVhZHkgYSBzcGVjaWZpZWQgam9pbiBjb2x1bW4uCi0JCQkvL1JlbW92ZSBpdCBub3cgc28gdGhhdCBpdCBkb2Vzbid0IGdldCByZW1vdmVkIGR1cmluZyBhbiB1cGRhdGUgYW5kCi0JCQkvL2NhdXNlIGNoYW5nZSBub3RpZmljYXRpb25zIHRvIGJlIHNlbnQgdG8gdGhlIFVJIGluIHRoZSB3cm9uZyBvcmRlcgotCQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9IG51bGw7Ci0JCX0KLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFKb2luQ29sdW1uKHRoaXMsIGNyZWF0ZUpvaW5Db2x1bW5Pd25lcigpKTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5hZGQoaW5kZXgsIGpvaW5Db2x1bW4pOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uUmVzb3VyY2UgPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oaW5kZXgsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5Db2x1bW4uaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShqb2luQ29sdW1uUmVzb3VyY2UpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBqb2luQ29sdW1uKTsKLQkJaWYgKG9sZERlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLkRFRkFVTFRfSk9JTl9DT0xVTU4sIG9sZERlZmF1bHRKb2luQ29sdW1uLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gam9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCwgSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBqb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuaW5kZXhPZihqb2luQ29sdW1uKSk7Ci0JfQorCS8vICoqKioqKioqKiogb3B0aW9uYWwgKioqKioqKioqKgogCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCUphdmFKb2luQ29sdW1uIHJlbW92ZWRKb2luQ29sdW1uID0gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOwotCQlpZiAoIWNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkgewotCQkJLy9jcmVhdGUgdGhlIGRlZmF1bHRKb2luQ29sdW1uIG5vdyBvciB0aGlzIHdpbGwgaGFwcGVuIGR1cmluZyBwcm9qZWN0IHVwZGF0ZSAKLQkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLiBUaGF0IGNhdXNlcyBwcm9ibGVtcyAKLQkJCS8vaW4gdGhlIFVJIGJlY2F1c2UgdGhlIGNoYW5nZSBub3RpZmljYXRpb25zIGVuZCB1cCBpbiB0aGUgd3Jvbmcgb3JkZXIuCi0JCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gYnVpbGRKb2luQ29sdW1uKG5ldyBOdWxsSm9pbkNvbHVtbihnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkpOwotCQl9Ci0JCWdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oaW5kZXgsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHJlbW92ZWRKb2luQ29sdW1uKTsKLQkJaWYgKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJLy9maXJlIGNoYW5nZSBub3RpZmljYXRpb24gaWYgYSBkZWZhdWx0Sm9pbkNvbHVtbiB3YXMgY3JlYXRlZCBhYm92ZQotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuREVGQVVMVF9KT0lOX0NPTFVNTiwgbnVsbCwgdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbik7CQkKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW5fKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlmaXJlSXRlbU1vdmVkKFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiBnZXRTcGVjaWZpZWRPcHRpb25hbCgpID09IG51bGwgPyBnZXREZWZhdWx0T3B0aW9uYWwoKSA6IGdldFNwZWNpZmllZE9wdGlvbmFsKCk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIE51bGxhYmxlLkRFRkFVTFRfT1BUSU9OQUw7CisJcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE9wdGlvbmFsICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRPcHRpb25hbC5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0T3B0aW9uYWwoKTsKIAl9CiAJCiAJcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSB7CiAJCXJldHVybiB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOwogCX0KIAkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuIG5ld1NwZWNpZmllZE9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkU3BlY2lmaWVkT3B0aW9uYWwgPSB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOwotCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gbmV3U3BlY2lmaWVkT3B0aW9uYWw7Ci0JCXNldE9wdGlvbmFsT25SZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZE9wdGlvbmFsKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOdWxsYWJsZS5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIG9sZFNwZWNpZmllZE9wdGlvbmFsLCBuZXdTcGVjaWZpZWRPcHRpb25hbCk7CisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCkgeworCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkT3B0aW9uYWw7CisJCXRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgPSBvcHRpb25hbDsKKwkJdGhpcy5zZXRSZXNvdXJjZU9wdGlvbmFsKG9wdGlvbmFsKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE51bGxhYmxlLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgb2xkLCBvcHRpb25hbCk7CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsXyhCb29sZWFuIG5ld1NwZWNpZmllZE9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkU3BlY2lmaWVkT3B0aW9uYWwgPSB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOwotCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gbmV3U3BlY2lmaWVkT3B0aW9uYWw7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTnVsbGFibGUuU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRPcHRpb25hbCwgbmV3U3BlY2lmaWVkT3B0aW9uYWwpOworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsXyhCb29sZWFuIG9wdGlvbmFsKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRPcHRpb25hbDsKKwkJdGhpcy5zcGVjaWZpZWRPcHRpb25hbCA9IG9wdGlvbmFsOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTnVsbGFibGUuU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZLCBvbGQsIG9wdGlvbmFsKTsKIAl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRPcHRpb25hbE9uUmVzb3VyY2VNb2RlbChCb29sZWFuIG5ld09wdGlvbmFsKTsKLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVJlc291cmNlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZEpvaW5Db2x1bW5zKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZURlZmF1bHRKb2luQ29sdW1uKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCisJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0T3B0aW9uYWwoKSB7CisJCXJldHVybiBOdWxsYWJsZS5ERUZBVUxUX09QVElPTkFMOworCX0KKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgQm9vbGVhbiBnZXRSZXNvdXJjZU9wdGlvbmFsKCk7CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0UmVzb3VyY2VPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKTsKKwkKKwkKKwkvLyAqKioqKioqKioqIDIuMCBkZXJpdmVkIGlkICoqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgSmF2YURlcml2ZWRJZDJfMCBidWlsZERlcml2ZWRJZCgpIHsKKwkJcmV0dXJuICgoSnBhRmFjdG9yeTJfMCkgZ2V0SnBhRmFjdG9yeSgpKS5idWlsZEphdmFEZXJpdmVkSWQodGhpcyk7CisJfQorCQorCXB1YmxpYyBKYXZhRGVyaXZlZElkMl8wIGdldERlcml2ZWRJZCgpIHsKKwkJcmV0dXJuIHRoaXMuZGVyaXZlZElkOwogCX0KIAkKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFQgcmVsYXRpb25zaGlwTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplKHJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gdGhpcy5zcGVjaWZpZWRPcHRpb25hbChyZWxhdGlvbnNoaXBNYXBwaW5nKTsKKwlwdWJsaWMgYm9vbGVhbiBpc0lkTWFwcGluZygpIHsKKwkJcmV0dXJuIHRoaXMuZGVyaXZlZElkLmdldFZhbHVlKCk7CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRKb2luQ29sdW1ucyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYW5ub3RhdGlvbnMgPSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCXdoaWxlKGFubm90YXRpb25zLmhhc05leHQoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5hZGQoYnVpbGRKb2luQ29sdW1uKChKb2luQ29sdW1uQW5ub3RhdGlvbikgYW5ub3RhdGlvbnMubmV4dCgpKSk7Ci0JCX0KKwkKKwkvLyAqKioqKioqKioqIDIuMCBtYXBzIGlkICoqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgSmF2YU1hcHNJZDJfMCBidWlsZE1hcHNJZCgpIHsKKwkJcmV0dXJuICgoSnBhRmFjdG9yeTJfMCkgZ2V0SnBhRmFjdG9yeSgpKS5idWlsZEphdmFNYXBzSWQodGhpcyk7CiAJfQogCQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEJ1aWxkRGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpICYmIGlzUmVsYXRpb25zaGlwT3duZXIoKTsKKwlwdWJsaWMgTWFwc0lkMl8wIGdldE1hcHNJZCgpIHsKKwkJcmV0dXJuIHRoaXMubWFwc0lkOwogCX0KIAkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdEpvaW5Db2x1bW4oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJaWYgKCFzaG91bGRCdWlsZERlZmF1bHRKb2luQ29sdW1uKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gYnVpbGRKb2luQ29sdW1uKG5ldyBOdWxsSm9pbkNvbHVtbihyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpKTsKLQl9CQogCQorCS8vICoqKioqKioqKiogQWJzdHJhY3RKYXZhUmVsYXRpb25zaGlwTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCiAJCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXN1cGVyLnVwZGF0ZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4ocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFNpbmdsZVJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogRmV0Y2hhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKwkKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldERlZmF1bHRGZXRjaCgpIHsKKwkJcmV0dXJuIERFRkFVTFRfRkVUQ0hfVFlQRTsKIAl9CiAJCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKFQgcmVsYXRpb25zaGlwTWFwcGluZykgewotCQlzdXBlci51cGRhdGUocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkT3B0aW9uYWxfKHRoaXMuc3BlY2lmaWVkT3B0aW9uYWwocmVsYXRpb25zaGlwTWFwcGluZykpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQm9vbGVhbiBzcGVjaWZpZWRPcHRpb25hbChUIHJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBzcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gcmVzb3VyY2VKb2luQ29sdW1ucyA9IHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJd2hpbGUgKGpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJCWpvaW5Db2x1bW4udXBkYXRlKChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbl8oam9pbkNvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSwgYnVpbGRKb2luQ29sdW1uKChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VKb2luQ29sdW1ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0Sm9pbkNvbHVtbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdEpvaW5Db2x1bW4oKSkgewotCQkJc2V0RGVmYXVsdEpvaW5Db2x1bW4obnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGdldERlZmF1bHRKb2luQ29sdW1uKCkgPT0gbnVsbCkgewotCQkJdGhpcy5zZXREZWZhdWx0Sm9pbkNvbHVtbihidWlsZEpvaW5Db2x1bW4obmV3IE51bGxKb2luQ29sdW1uKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4udXBkYXRlKG5ldyBOdWxsSm9pbkNvbHVtbihyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpKTsKLQkJfQotCX0JCi0KLQlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4gYnVpbGRKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5SZXNvdXJjZSkgewotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUpvaW5Db2x1bW4odGhpcywgY3JlYXRlSm9pbkNvbHVtbk93bmVyKCkpOwotCQlqb2luQ29sdW1uLmluaXRpYWxpemVGcm9tUmVzb3VyY2Uoam9pbkNvbHVtblJlc291cmNlKTsKLQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbi5Pd25lciBjcmVhdGVKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCQotCS8qKgotCSAqIGVsaW1pbmF0ZSBhbnkgImNvbnRhaW5lciIgdHlwZXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYXJnZXRFbnRpdHkoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJaWYgKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS50eXBlSXNDb250YWluZXIoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRRdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKEphdmFKb2luQ29sdW1uIGNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlyZXN1bHQgPSBjb2x1bW4uamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqIFZhbGlkYXRpb24gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJCi0JCWlmIChhZGRKb2luQ29sdW1uTWVzc2FnZXMoKSkgewotCQkJYWRkSm9pbkNvbHVtbk1lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQkvL2J1ZyAxOTIyODcgLSBkbyBub3Qgd2FudCBqb2luQ29sdW1uIHZhbGlkYXRpb24gZXJyb3JzIG9uIHRoZSBub24tb3duaW5nIHNpZGUKLQkvL29mIGEgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXAuICBUaGlzIGlzIGEgbG93IHJpc2sgZml4IGZvciBSQzMsIGJ1dCBhIGJldHRlcgotCS8vc29sdXRpb24gd291bGQgYmUgdG8gbm90IGhhdmUgdGhlIGRlZmF1bHQgam9pbkNvbHVtbnMgb24gdGhlIG5vbi1vd25pbmcgc2lkZS4KLQkvL1RoaXMgd291bGQgZml4IGFub3RoZXIgYnVnIHRoYXQgd2Ugc2hvdyBkZWZhdWx0IGpvaW5Db2x1bW5zIGluIHRoaXMgc2l0dWF0aW9uLgotCXByb3RlY3RlZCBib29sZWFuIGFkZEpvaW5Db2x1bW5NZXNzYWdlcygpIHsKLQkJcmV0dXJuIChlbnRpdHlPd25lZCgpICYmIGlzUmVsYXRpb25zaGlwT3duZXIoKSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKb2luQ29sdW1uTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBzdHJlYW0gPSB0aGlzLmpvaW5Db2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc3RyZWFtLm5leHQoKTsKLQkJCVN0cmluZyB0YWJsZSA9IGpvaW5Db2x1bW4uZ2V0VGFibGUoKTsKLQkJCWJvb2xlYW4gZG9Db250aW51ZSA9IGpvaW5Db2x1bW4uY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQkJCi0JCQlpZiAoZG9Db250aW51ZSAmJiB0aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RhYmxlLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJam9pbkNvbHVtbiwgam9pbkNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYgKGRvQ29udGludWUgJiYgISBqb2luQ29sdW1uLmlzUmVzb2x2ZWQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWpvaW5Db2x1bW4sIGpvaW5Db2x1bW4uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQkJCi0JCQlpZiAoZG9Db250aW51ZSAmJiAhIGpvaW5Db2x1bW4uaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJam9pbkNvbHVtbiwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQotCQotCi0JcHVibGljIGNsYXNzIEpvaW5Db2x1bW5Pd25lciBpbXBsZW1lbnRzIEphdmFKb2luQ29sdW1uLk93bmVyCi0JewotCi0JCXB1YmxpYyBKb2luQ29sdW1uT3duZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGJ5IGRlZmF1bHQsIHRoZSBqb2luIGNvbHVtbiBpcyBpbiB0aGUgdHlwZSBtYXBwaW5nJ3MgcHJpbWFyeSB0YWJsZQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIEVudGl0eSBnZXRUYXJnZXRFbnRpdHkoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpczsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQkvKioKLQkJICogdGhlIGpvaW4gY29sdW1uIGNhbiBiZSBvbiBhIHNlY29uZGFyeSB0YWJsZQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdGFibGVJc0FsbG93ZWQoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0VHlwZU1hcHBpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldERiVGFibGUodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSBnZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBnZXRUYXJnZXRFbnRpdHkoKTsKLQkJCXJldHVybiAodGFyZ2V0RW50aXR5ID09IG51bGwpID8gbnVsbCA6IHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBqb2luQ29sdW1uOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuam9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLmRlcml2ZWRJZC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVGFibGUuamF2YQppbmRleCA2Y2U3MzY5Li5lZTk5NTkwIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVRhYmxlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFUYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMTkgKzksMjIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5CYXNlVGFibGVBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNhdGFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLk5hbWVUb29sczsKQEAgLTMwLDExOSArMzMsMTA5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwogCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhVGFibGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIKKy8qKgorICogSmF2YSB0YWJsZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhVGFibGUKKwlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCisJaW1wbGVtZW50cyBUYWJsZSwgVW5pcXVlQ29uc3RyYWludC5Pd25lcgogewotCiAJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lOwogCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWU7CiAKKwlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNjaGVtYTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWE7CisKIAlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENhdGFsb2c7CiAJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKIAotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2NoZW1hOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHM7CisJcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBuZXcgVmVjdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PigpOwogCiAKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKKwogCXByb3RlY3RlZCBBYnN0cmFjdEphdmFUYWJsZShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7CiAJCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludHMgPSBuZXcgQXJyYXlMaXN0PEphdmFVbmlxdWVDb25zdHJhaW50PigpOwogCX0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhSnBhQ29udGV4dE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFKcGFDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQorCisJLy8gKioqKioqKioqKiBhYnN0cmFjdCBtZXRob2RzICoqKioqKioqKioKIAogCS8qKgotCSAqIFJldHVybiB0aGUgamF2YSB0YWJsZSByZXNvdXJjZSwgZG8gbm90IHJldHVybiBudWxsIGlmIHRoZSBqYXZhIGFubm90YXRpb24gZG9lcyBub3QgZXhpc3QuCi0JICogVXNlIGEgbnVsbCByZXNvdXJjZSBvYmplY3QgaW5zdGVhZCBvZiBudWxsLgorCSAqIFJldHVybiB0aGUgSmF2YSB0YWJsZSBhbm5vdGF0aW9uLiBEbyBub3QgcmV0dXJuIG51bGwgaWYgdGhlIEphdmEKKwkgKiBhbm5vdGF0aW9uIGRvZXMgbm90IGV4aXN0OyByZXR1cm4gYSBudWxsIHRhYmxlIGFubm90YXRpb24gaW5zdGVhZC4KIAkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVGFibGVBbm5vdGF0aW9uIGdldFRhYmxlUmVzb3VyY2UoKTsKLQkKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgQmFzZVRhYmxlQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCk7CisKIAkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBhbm5vdGF0aW9uIG5hbWUgb2YgdGhlIGphdmEgdGFibGUgcmVzb3VyY2UKKwkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIEphdmEgYW5ub3RhdGlvbi4KIAkgKi8KIAlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCk7Ci0JCisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGJ1aWxkRGVmYXVsdE5hbWUoKTsKKworCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hKCk7CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2coKTsKKworCisJLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKKwogCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsKSA/IGdldERlZmF1bHROYW1lKCkgOiB0aGlzLmdldFNwZWNpZmllZE5hbWUoKTsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE5hbWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE5hbWUgOiB0aGlzLmRlZmF1bHROYW1lOwogCX0KIAogCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpIHsKIAkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTmFtZTsKIAl9CiAKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWROYW1lKFN0cmluZyBuZXdTcGVjaWZpZWROYW1lKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWROYW1lID0gdGhpcy5zcGVjaWZpZWROYW1lOwotCQl0aGlzLnNwZWNpZmllZE5hbWUgPSBuZXdTcGVjaWZpZWROYW1lOwotCQlnZXRUYWJsZVJlc291cmNlKCkuc2V0TmFtZShuZXdTcGVjaWZpZWROYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTmFtZSwgbmV3U3BlY2lmaWVkTmFtZSk7CisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTmFtZShTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWROYW1lOworCQl0aGlzLnNwZWNpZmllZE5hbWUgPSBuYW1lOworCQl0aGlzLmdldEFubm90YXRpb24oKS5zZXROYW1lKG5hbWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CiAJfQotCQorCiAJLyoqCiAJICogaW50ZXJuYWwgc2V0dGVyIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCiAJICogVGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIEludmFsaWRUaHJlYWRBY2Nlc3MgZXhjZXB0aW9ucyBpbiB0aGUgVUkKIAkgKiB3aGVuIHlvdSBzZXQgYSB2YWx1ZSBmcm9tIHRoZSBVSSBhbmQgdGhlIGFubm90YXRpb24gZG9lc24ndCBleGlzdCB5ZXQuCiAJICogQWRkaW5nIHRoZSBhbm5vdGF0aW9uIGNhdXNlcyBhbiB1cGRhdGUgdG8gb2NjdXIgYW5kIHRoZW4gdGhlIGV4Y2VwdGlvbi4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWROYW1lXyhTdHJpbmcgbmV3U3BlY2lmaWVkTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkTmFtZSA9IHRoaXMuc3BlY2lmaWVkTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gbmV3U3BlY2lmaWVkTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTmFtZSwgbmV3U3BlY2lmaWVkTmFtZSk7CisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTmFtZV8oU3RyaW5nIG5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkTmFtZTsKKwkJdGhpcy5zcGVjaWZpZWROYW1lID0gbmFtZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwogCX0KIAogCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7CiAJCXJldHVybiB0aGlzLmRlZmF1bHROYW1lOwogCX0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZENhdGFsb2coKSA9PSBudWxsKSA/IGdldERlZmF1bHRDYXRhbG9nKCkgOiB0aGlzLmdldFNwZWNpZmllZENhdGFsb2coKTsKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TmFtZShTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0TmFtZTsKKwkJdGhpcy5kZWZhdWx0TmFtZSA9IG5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CiAJfQogCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCX0KIAotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENhdGFsb2coU3RyaW5nIG5ld1NwZWNpZmllZENhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZENhdGFsb2cgPSB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IG5ld1NwZWNpZmllZENhdGFsb2c7Ci0JCWdldFRhYmxlUmVzb3VyY2UoKS5zZXRDYXRhbG9nKG5ld1NwZWNpZmllZENhdGFsb2cpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRhYmxlLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRDYXRhbG9nLCBuZXdTcGVjaWZpZWRDYXRhbG9nKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4KLQkgKiBUaGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggSW52YWxpZFRocmVhZEFjY2VzcyBleGNlcHRpb25zIGluIHRoZSBVSQotCSAqIHdoZW4geW91IHNldCBhIHZhbHVlIGZyb20gdGhlIFVJIGFuZCB0aGUgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHlldC4KLQkgKiBBZGRpbmcgdGhlIGFubm90YXRpb24gY2F1c2VzIGFuIHVwZGF0ZSB0byBvY2N1ciBhbmQgdGhlbiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENhdGFsb2dfKFN0cmluZyBuZXdTcGVjaWZpZWRDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBuZXdTcGVjaWZpZWRDYXRhbG9nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRhYmxlLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRDYXRhbG9nLCBuZXdTcGVjaWZpZWRDYXRhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9CisJLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgogCiAJcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRTY2hlbWEoKSA9PSBudWxsKSA/IGdldERlZmF1bHRTY2hlbWEoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRTY2hlbWEgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFNjaGVtYSA6IHRoaXMuZGVmYXVsdFNjaGVtYTsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpIHsKIAkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NoZW1hOwogCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIG5ld1NwZWNpZmllZFNjaGVtYSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkU2NoZW1hID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gbmV3U3BlY2lmaWVkU2NoZW1hOwotCQlnZXRUYWJsZVJlc291cmNlKCkuc2V0U2NoZW1hKG5ld1NwZWNpZmllZFNjaGVtYSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVGFibGUuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2NoZW1hLCBuZXdTcGVjaWZpZWRTY2hlbWEpOworCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOworCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IHNjaGVtYTsKKwkJdGhpcy5nZXRBbm5vdGF0aW9uKCkuc2V0U2NoZW1hKHNjaGVtYSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7CiAJfQotCQorCiAJLyoqCiAJICogaW50ZXJuYWwgc2V0dGVyIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCiAJICogVGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIEludmFsaWRUaHJlYWRBY2Nlc3MgZXhjZXB0aW9ucyBpbiB0aGUgVUkKQEAgLTE1MiwyMDcgKzE0NSwyNjMgQEAKIAlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWFfKFN0cmluZyBuZXdTcGVjaWZpZWRTY2hlbWEpIHsKIAkJU3RyaW5nIG9sZFNwZWNpZmllZFNjaGVtYSA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOwogCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IG5ld1NwZWNpZmllZFNjaGVtYTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTY2hlbWEsIG5ld1NwZWNpZmllZFNjaGVtYSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2NoZW1hLCBuZXdTcGVjaWZpZWRTY2hlbWEpOwogCX0KIAogCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKIAkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYTsKIAl9Ci0JCi0JCisKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFNjaGVtYTsKKwkJdGhpcy5kZWZhdWx0U2NoZW1hID0gc2NoZW1hOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKKwl9CisKKworCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRDYXRhbG9nICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDYXRhbG9nIDogdGhpcy5kZWZhdWx0Q2F0YWxvZzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZENhdGFsb2c7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOworCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBjYXRhbG9nOworCQl0aGlzLmdldEFubm90YXRpb24oKS5zZXRDYXRhbG9nKGNhdGFsb2cpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7CisJfQorCisJLyoqCisJICogaW50ZXJuYWwgc2V0dGVyIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCisJICogVGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIEludmFsaWRUaHJlYWRBY2Nlc3MgZXhjZXB0aW9ucyBpbiB0aGUgVUkKKwkgKiB3aGVuIHlvdSBzZXQgYSB2YWx1ZSBmcm9tIHRoZSBVSSBhbmQgdGhlIGFubm90YXRpb24gZG9lc24ndCBleGlzdCB5ZXQuCisJICogQWRkaW5nIHRoZSBhbm5vdGF0aW9uIGNhdXNlcyBhbiB1cGRhdGUgdG8gb2NjdXIgYW5kIHRoZW4gdGhlIGV4Y2VwdGlvbi4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nXyhTdHJpbmcgY2F0YWxvZykgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOworCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBjYXRhbG9nOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZygpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdENhdGFsb2c7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdENhdGFsb2c7CisJCXRoaXMuZGVmYXVsdENhdGFsb2cgPSBjYXRhbG9nOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOworCX0KKworCiAJLy8gKioqKioqKioqKiB1bmlxdWUgY29uc3RyYWludHMgKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzKCkgeworCisJcHVibGljIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzKCkgewogCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50Pih0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKTsKIAl9Ci0JCisKIAlwdWJsaWMgaW50IHVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHsKIAkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludHMuc2l6ZSgpOwogCX0KLQkKKwogCXB1YmxpYyBKYXZhVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewogCQlKYXZhVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVVuaXF1ZUNvbnN0cmFpbnQodGhpcywgdGhpcyk7CiAJCXRoaXMudW5pcXVlQ29uc3RyYWludHMuYWRkKGluZGV4LCB1bmlxdWVDb25zdHJhaW50KTsKLQkJVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gPSB0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5hZGRVbmlxdWVDb25zdHJhaW50KGluZGV4KTsKKwkJVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gPSB0aGlzLmdldEFubm90YXRpb24oKS5hZGRVbmlxdWVDb25zdHJhaW50KGluZGV4KTsKIAkJdW5pcXVlQ29uc3RyYWludC5pbml0aWFsaXplKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1BZGRlZChUYWJsZS5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnQpOworCQlmaXJlSXRlbUFkZGVkKFVOSVFVRV9DT05TVFJBSU5UU19MSVNULCBpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7CiAJCXJldHVybiB1bmlxdWVDb25zdHJhaW50OwogCX0KLQkJCisKIAlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgewogCQl0aGlzLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQodGhpcy51bmlxdWVDb25zdHJhaW50cy5pbmRleE9mKHVuaXF1ZUNvbnN0cmFpbnQpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewogCQlKYXZhVW5pcXVlQ29uc3RyYWludCByZW1vdmVkVW5pcXVlQ29uc3RyYWludCA9IHRoaXMudW5pcXVlQ29uc3RyYWludHMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5nZXRUYWJsZVJlc291cmNlKCkucmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChUYWJsZS5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIHJlbW92ZWRVbmlxdWVDb25zdHJhaW50KTsKKwkJdGhpcy5nZXRBbm5vdGF0aW9uKCkucmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbmRleCk7CisJCWZpcmVJdGVtUmVtb3ZlZChVTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIHJlbW92ZWRVbmlxdWVDb25zdHJhaW50KTsKIAl9Ci0JCisKIAlwdWJsaWMgdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewogCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5tb3ZlVW5pcXVlQ29uc3RyYWludCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKFRhYmxlLlVOSVFVRV9DT05TVFJBSU5UU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCisJCXRoaXMuZ2V0QW5ub3RhdGlvbigpLm1vdmVVbmlxdWVDb25zdHJhaW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCWZpcmVJdGVtTW92ZWQoVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CiAJfQotCQorCiAJcHJvdGVjdGVkIHZvaWQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgsIEphdmFVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgdW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVGFibGUuVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOworCQlhZGRJdGVtVG9MaXN0KGluZGV4LCB1bmlxdWVDb25zdHJhaW50LCB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCBVTklRVUVfQ09OU1RSQUlOVFNfTElTVCk7CiAJfQotCQorCisJcHJvdGVjdGVkIHZvaWQgYWRkVW5pcXVlQ29uc3RyYWludChKYXZhVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7CisJCXRoaXMuYWRkVW5pcXVlQ29uc3RyYWludCh0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnNpemUoKSwgdW5pcXVlQ29uc3RyYWludCk7CisJfQorCiAJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludF8oSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QodW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVGFibGUuVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOworCQlyZW1vdmVJdGVtRnJvbUxpc3QodW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOwogCX0KIAotCi0JLy8gKioqKioqKioqKiBUYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldFRhYmxlUmVzb3VyY2UoKS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0VGFibGVSZXNvdXJjZSgpLm5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldFRhYmxlUmVzb3VyY2UoKS5nZXRTY2hlbWFUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNjaGVtYVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldFRhYmxlUmVzb3VyY2UoKS5zY2hlbWFUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRUYWJsZVJlc291cmNlKCkuZ2V0Q2F0YWxvZ1RleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYXRhbG9nVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0VGFibGVSZXNvdXJjZSgpLmNhdGFsb2dUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE5hbWUoU3RyaW5nIG5ld0RlZmF1bHROYW1lKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0TmFtZSA9IHRoaXMuZGVmYXVsdE5hbWU7Ci0JCXRoaXMuZGVmYXVsdE5hbWUgPSBuZXdEZWZhdWx0TmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5ERUZBVUxUX05BTUVfUFJPUEVSVFksIG9sZERlZmF1bHROYW1lLCBuZXdEZWZhdWx0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdENhdGFsb2coU3RyaW5nIG5ld0RlZmF1bHRDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0Q2F0YWxvZyA9IHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JCXRoaXMuZGVmYXVsdENhdGFsb2cgPSBuZXdEZWZhdWx0Q2F0YWxvZzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZERlZmF1bHRDYXRhbG9nLCBuZXdEZWZhdWx0Q2F0YWxvZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNjaGVtYShTdHJpbmcgbmV3RGVmYXVsdFNjaGVtYSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFNjaGVtYSA9IHRoaXMuZGVmYXVsdFNjaGVtYTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gbmV3RGVmYXVsdFNjaGVtYTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSwgb2xkRGVmYXVsdFNjaGVtYSwgbmV3RGVmYXVsdFNjaGVtYSk7Ci0JfQotCQotCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShUYWJsZUFubm90YXRpb24gdGFibGUpIHsKLQkJdGhpcy5kZWZhdWx0TmFtZSA9IHRoaXMuZGVmYXVsdE5hbWUoKTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gdGhpcy5kZWZhdWx0U2NoZW1hKCk7Ci0JCXRoaXMuZGVmYXVsdENhdGFsb2cgPSB0aGlzLmRlZmF1bHRDYXRhbG9nKCk7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IHRhYmxlLmdldE5hbWUoKTsKLQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSB0YWJsZS5nZXRTY2hlbWEoKTsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gdGFibGUuZ2V0Q2F0YWxvZygpOwotCQl0aGlzLmluaXRpYWxpemVVbmlxdWVDb25zdHJhaW50cyh0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVVuaXF1ZUNvbnN0cmFpbnRzKFRhYmxlQW5ub3RhdGlvbiB0YWJsZSkgewotCQlmb3IgKFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCkpKSB7Ci0JCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmFkZChidWlsZFVuaXF1ZUNvbnN0cmFpbnQodW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pKTsKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVW5pcXVlQ29uc3RyYWludHMoQmFzZVRhYmxlQW5ub3RhdGlvbiBiYXNlVGFibGVBbm5vdGF0aW9uKSB7CisJCWZvciAoSXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHN0cmVhbSA9IGJhc2VUYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmFkZChidWlsZFVuaXF1ZUNvbnN0cmFpbnQoc3RyZWFtLm5leHQoKSkpOwogCQl9CiAJfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShUYWJsZUFubm90YXRpb24gdGFibGUpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWROYW1lXyh0YWJsZS5nZXROYW1lKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8odGFibGUuZ2V0U2NoZW1hKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZENhdGFsb2dfKHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdE5hbWUodGhpcy5kZWZhdWx0TmFtZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0U2NoZW1hKHRoaXMuZGVmYXVsdFNjaGVtYSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0Q2F0YWxvZyh0aGlzLmRlZmF1bHRDYXRhbG9nKCkpOwotCQl0aGlzLnVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKHRhYmxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkZWZhdWx0TmFtZSgpOwogCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hKCkgewotCQlpZiAoZ2V0RW50aXR5TWFwcGluZ3MoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKTsKLQkJfQotCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nKCkgewotCQlpZiAoZ2V0RW50aXR5TWFwcGluZ3MoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCk7Ci0JCX0KLQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKFRhYmxlQW5ub3RhdGlvbiB0YWJsZSkgewotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdW5pcXVlQ29uc3RyYWludHMoKTsKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiByZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJCi0JCXdoaWxlICh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKLQkJCUphdmFVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgPSB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VVbmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKLQkJCQl1bmlxdWVDb25zdHJhaW50LnVwZGF0ZShyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVVbmlxdWVDb25zdHJhaW50Xyh1bmlxdWVDb25zdHJhaW50KTsKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVbmlxdWVDb25zdHJhaW50cyhCYXNlVGFibGVBbm5vdGF0aW9uIGJhc2VUYWJsZUFubm90YXRpb24pIHsKKwkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiBjb25zdHJhaW50QW5ub3RhdGlvbnMgPSBiYXNlVGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7CisJCUxpc3RJdGVyYXRvcjxKYXZhVW5pcXVlQ29uc3RyYWludD4gY29uc3RyYWludHMgPSB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKCk7CisJCXdoaWxlIChjb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKKwkJCUphdmFVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgPSBjb25zdHJhaW50cy5uZXh0KCk7CisJCQlpZiAoY29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSkgeworCQkJCXVuaXF1ZUNvbnN0cmFpbnQudXBkYXRlKGNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkpOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnRfKHVuaXF1ZUNvbnN0cmFpbnQpOwogCQkJfQogCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VVbmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKLQkJCWFkZFVuaXF1ZUNvbnN0cmFpbnQodW5pcXVlQ29uc3RyYWludHNTaXplKCksIGJ1aWxkVW5pcXVlQ29uc3RyYWludChyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKSkpOworCisJCXdoaWxlIChjb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKSB7CisJCQl0aGlzLmFkZFVuaXF1ZUNvbnN0cmFpbnQodGhpcy5idWlsZFVuaXF1ZUNvbnN0cmFpbnQoY29uc3RyYWludEFubm90YXRpb25zLm5leHQoKSkpOwogCQl9CiAJfQogCiAJcHJvdGVjdGVkIEphdmFVbmlxdWVDb25zdHJhaW50IGJ1aWxkVW5pcXVlQ29uc3RyYWludChVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbikgewotCQlKYXZhVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVVuaXF1ZUNvbnN0cmFpbnQodGhpcywgdGhpcyk7CisJCUphdmFVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgPSB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFVbmlxdWVDb25zdHJhaW50KHRoaXMsIHRoaXMpOwogCQl1bmlxdWVDb25zdHJhaW50LmluaXRpYWxpemUodW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pOwogCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludDsKIAl9Ci0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKioqIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlVW5pcXVlQ29uc3RyYWludENvbHVtbk5hbWVzKCkgewotCQlvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZGJUYWJsZSA9IGdldERiVGFibGUoKTsKLQkJaWYgKGRiVGFibGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRiVGFibGUuY29sdW1uTmFtZXMoKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldFRhYmxlUmVzb3VyY2UoKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7CisKKworCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFRleHRSYW5nZShUZXh0UmFuZ2UgdGV4dFJhbmdlLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewogCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKIAl9CiAKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0VGV4dFJhbmdlKHRoaXMuZ2V0QW5ub3RhdGlvbigpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCksIGFzdFJvb3QpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEFubm90YXRpb24oKS5uYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOworCX0KKworCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldFRleHRSYW5nZSh0aGlzLmdldEFubm90YXRpb24oKS5nZXRTY2hlbWFUZXh0UmFuZ2UoYXN0Um9vdCksIGFzdFJvb3QpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIHNjaGVtYVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvbigpLnNjaGVtYVRvdWNoZXMocG9zLCBhc3RSb290KTsKKwl9CisKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0VGV4dFJhbmdlKHRoaXMuZ2V0QW5ub3RhdGlvbigpLmdldENhdGFsb2dUZXh0UmFuZ2UoYXN0Um9vdCksIGFzdFJvb3QpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGNhdGFsb2dUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEFubm90YXRpb24oKS5jYXRhbG9nVG91Y2hlcyhwb3MsIGFzdFJvb3QpOworCX0KKworCisJLy8gKioqKioqKioqKiByZXNvdXJjZSA9PiBjb250ZXh0ICoqKioqKioqKioKKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoQmFzZVRhYmxlQW5ub3RhdGlvbiBiYXNlVGFibGVBbm5vdGF0aW9uKSB7CisJCXRoaXMuZGVmYXVsdE5hbWUgPSB0aGlzLmJ1aWxkRGVmYXVsdE5hbWUoKTsKKwkJdGhpcy5zcGVjaWZpZWROYW1lID0gYmFzZVRhYmxlQW5ub3RhdGlvbi5nZXROYW1lKCk7CisKKwkJdGhpcy5kZWZhdWx0U2NoZW1hID0gdGhpcy5idWlsZERlZmF1bHRTY2hlbWEoKTsKKwkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBiYXNlVGFibGVBbm5vdGF0aW9uLmdldFNjaGVtYSgpOworCisJCXRoaXMuZGVmYXVsdENhdGFsb2cgPSB0aGlzLmJ1aWxkRGVmYXVsdENhdGFsb2coKTsKKwkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gYmFzZVRhYmxlQW5ub3RhdGlvbi5nZXRDYXRhbG9nKCk7CisKKwkJdGhpcy5pbml0aWFsaXplVW5pcXVlQ29uc3RyYWludHMoYmFzZVRhYmxlQW5ub3RhdGlvbik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlKEJhc2VUYWJsZUFubm90YXRpb24gYmFzZVRhYmxlQW5ub3RhdGlvbikgeworCQl0aGlzLnNldERlZmF1bHROYW1lKHRoaXMuYnVpbGREZWZhdWx0TmFtZSgpKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWROYW1lXyhiYXNlVGFibGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7CisKKwkJdGhpcy5zZXREZWZhdWx0U2NoZW1hKHRoaXMuYnVpbGREZWZhdWx0U2NoZW1hKCkpOworCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8oYmFzZVRhYmxlQW5ub3RhdGlvbi5nZXRTY2hlbWEoKSk7CisKKwkJdGhpcy5zZXREZWZhdWx0Q2F0YWxvZyh0aGlzLmJ1aWxkRGVmYXVsdENhdGFsb2coKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18oYmFzZVRhYmxlQW5ub3RhdGlvbi5nZXRDYXRhbG9nKCkpOworCisJCXRoaXMudXBkYXRlVW5pcXVlQ29uc3RyYWludHMoYmFzZVRhYmxlQW5ub3RhdGlvbik7CisJfQorCisKKwkvLyAqKioqKioqKioqIGRhdGFiYXNlICoqKioqKioqKioKKwogCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGJTY2hlbWEoKTsKLQkJcmV0dXJuIChzY2hlbWEgPT0gbnVsbCkgPyBudWxsIDogc2NoZW1hLnRhYmxlTmFtZWQodGhpcy5nZXROYW1lKCkpOworCQlTY2hlbWEgZGJTY2hlbWEgPSB0aGlzLmdldERiU2NoZW1hKCk7CisJCXJldHVybiAoZGJTY2hlbWEgPT0gbnVsbCkgPyBudWxsIDogZGJTY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRoaXMuZ2V0TmFtZSgpKTsKIAl9CiAKIAlwdWJsaWMgU2NoZW1hIGdldERiU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXREYXRhYmFzZSgpLnNjaGVtYU5hbWVkKHRoaXMuZ2V0U2NoZW1hKCkpOworCQlTY2hlbWFDb250YWluZXIgZGJTY2hlbWFDb250YWluZXIgPSB0aGlzLmdldERiU2NoZW1hQ29udGFpbmVyKCk7CisJCXJldHVybiAoZGJTY2hlbWFDb250YWluZXIgPT0gbnVsbCkgPyBudWxsIDogZGJTY2hlbWFDb250YWluZXIuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcih0aGlzLmdldFNjaGVtYSgpKTsKKwl9CisKKwkvKioKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+IGNhdGFsb2cpLAorCSAqIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3M7IGFuZCB3ZSBuZWVkIHRvCisJICogZ2V0IHRoZSBzY2hlbWEgZGlyZWN0bHkgZnJvbSB0aGUgZGF0YWJhc2UuCisJICovCisJcHVibGljIFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcigpIHsKKwkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2coKTsKKwkJcmV0dXJuIChjYXRhbG9nICE9IG51bGwpID8gdGhpcy5nZXREYkNhdGFsb2coY2F0YWxvZykgOiB0aGlzLmdldERhdGFiYXNlKCk7CisJfQorCisJLyoqCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPgorCSAqIGNhdGFsb2cpLCB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgorCSAqLworCXB1YmxpYyBDYXRhbG9nIGdldERiQ2F0YWxvZygpIHsKKwkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2coKTsKKwkJcmV0dXJuIChjYXRhbG9nID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0RGJDYXRhbG9nKGNhdGFsb2cpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7CisJCXJldHVybiB0aGlzLmdldERiVGFibGUoKSAhPSBudWxsOwogCX0KIAogCXB1YmxpYyBib29sZWFuIGhhc1Jlc29sdmVkU2NoZW1hKCkgewogCQlyZXR1cm4gdGhpcy5nZXREYlNjaGVtYSgpICE9IG51bGw7CiAJfQogCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGJUYWJsZSgpICE9IG51bGw7CisJLyoqCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPgorCSAqIGNhdGFsb2cpLCB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1Jlc29sdmVkQ2F0YWxvZygpIHsKKwkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2coKTsKKwkJcmV0dXJuIChjYXRhbG9nID09IG51bGwpIHx8ICh0aGlzLmdldERiQ2F0YWxvZyhjYXRhbG9nKSAhPSBudWxsKTsKIAl9CiAKKworCS8vICoqKioqKioqKiogVW5pcXVlQ29uc3RyYWludC5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVVbmlxdWVDb25zdHJhaW50Q29sdW1uTmFtZXMoKSB7CisJCW9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBkYlRhYmxlID0gdGhpcy5nZXREYlRhYmxlKCk7CisJCXJldHVybiAoZGJUYWJsZSAhPSBudWxsKSA/IGRiVGFibGUuc29ydGVkQ29sdW1uSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpOworCX0KKworCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRUZXh0UmFuZ2UodGhpcy5nZXRBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpLCBhc3RSb290KTsKKwl9CisKKworCS8vICoqKioqKioqKiogSmF2YSBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqCisKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CiAJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwpAQCAtMzY5LDcgKzQxOCw3IEBACiAJfQogCiAJLyoqCi0JICogY2FsbGVkIGlmIHRoZSBkYXRhYmFzZSBpcyBjb25uZWN0ZWQKKwkgKiBjYWxsZWQgaWYgdGhlIGRhdGFiYXNlIGlzIGNvbm5lY3RlZDoKIAkgKiBuYW1lLCBzY2hlbWEsIGNhdGFsb2cKIAkgKi8KIAlAT3ZlcnJpZGUKQEAgLTM3OSw2NiArNDI4LDc0IEBACiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9CiAJCWlmICh0aGlzLm5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLnF1b3RlZENhbmRpZGF0ZU5hbWVzKGZpbHRlcik7CisJCQlyZXR1cm4gdGhpcy5qYXZhQ2FuZGlkYXRlTmFtZXMoZmlsdGVyKTsKIAkJfQogCQlpZiAodGhpcy5zY2hlbWFUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLnF1b3RlZENhbmRpZGF0ZVNjaGVtYXMoZmlsdGVyKTsKKwkJCXJldHVybiB0aGlzLmphdmFDYW5kaWRhdGVTY2hlbWF0YShmaWx0ZXIpOwogCQl9CiAJCWlmICh0aGlzLmNhdGFsb2dUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLnF1b3RlZENhbmRpZGF0ZUNhdGFsb2dzKGZpbHRlcik7CisJCQlyZXR1cm4gdGhpcy5qYXZhQ2FuZGlkYXRlQ2F0YWxvZ3MoZmlsdGVyKTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlTmFtZXMoKSB7Ci0JCVNjaGVtYSBkYlNjaGVtYSA9IHRoaXMuZ2V0RGJTY2hlbWEoKTsKLQkJcmV0dXJuIChkYlNjaGVtYSAhPSBudWxsKSA/IGRiU2NoZW1hLnRhYmxlTmFtZXMoKSA6IEVtcHR5SXRlcmF0b3IuPFN0cmluZz4gaW5zdGFuY2UoKTsKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ2FuZGlkYXRlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5jYW5kaWRhdGVOYW1lcyhmaWx0ZXIpKTsKIAl9CiAKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CiAJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2FuZGlkYXRlTmFtZXMoKSwgZmlsdGVyKTsKIAl9CiAKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gcXVvdGVkQ2FuZGlkYXRlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5xdW90ZSh0aGlzLmNhbmRpZGF0ZU5hbWVzKGZpbHRlcikpOworCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZU5hbWVzKCkgeworCQlTY2hlbWEgZGJTY2hlbWEgPSB0aGlzLmdldERiU2NoZW1hKCk7CisJCXJldHVybiAoZGJTY2hlbWEgIT0gbnVsbCkgPyBkYlNjaGVtYS5zb3J0ZWRUYWJsZUlkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+IGluc3RhbmNlKCk7CiAJfQogCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZVNjaGVtYXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuc2NoZW1hTmFtZXMoKTsKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ2FuZGlkYXRlU2NoZW1hdGEoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5jYW5kaWRhdGVTY2hlbWF0YShmaWx0ZXIpKTsKIAl9CiAKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlU2NoZW1hcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odGhpcy5jYW5kaWRhdGVTY2hlbWFzKCksIGZpbHRlcik7CisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlU2NoZW1hdGEoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2FuZGlkYXRlU2NoZW1hdGEoKSwgZmlsdGVyKTsKIAl9CiAKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gcXVvdGVkQ2FuZGlkYXRlU2NoZW1hcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnF1b3RlKHRoaXMuY2FuZGlkYXRlU2NoZW1hcyhmaWx0ZXIpKTsKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVTY2hlbWF0YSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RGJTY2hlbWFDb250YWluZXIoKS5zb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpOwogCX0KIAotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2UoKS5jYXRhbG9nTmFtZXMoKTsKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ2FuZGlkYXRlQ2F0YWxvZ3MoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5jYW5kaWRhdGVDYXRhbG9ncyhmaWx0ZXIpKTsKIAl9CiAKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlQ2F0YWxvZ3MoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlQ2F0YWxvZ3MoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CiAJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2FuZGlkYXRlQ2F0YWxvZ3MoKSwgZmlsdGVyKTsKIAl9CiAKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gcXVvdGVkQ2FuZGlkYXRlQ2F0YWxvZ3MoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5xdW90ZSh0aGlzLmNhbmRpZGF0ZUNhdGFsb2dzKGZpbHRlcikpOworCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZUNhdGFsb2dzKCkgeworCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwkJcmV0dXJuIChkYiAhPSBudWxsKSA/IGRiLnNvcnRlZENhdGFsb2dJZGVudGlmaWVycygpIDogRW1wdHlJdGVyYXRvci48U3RyaW5nPiBpbnN0YW5jZSgpOwogCX0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIE5hbWVUb29scy5idWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZSh0aGlzLmdldENhdGFsb2coKSwgdGhpcy5nZXRTY2hlbWEoKSwgdGhpcy5nZXROYW1lKCkpOworCisJLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKKworCS8qKgorCSAqIGNvdmFyaWFudCBvdmVycmlkZQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhSnBhQ29udGV4dE5vZGUgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEphdmFKcGFDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7CiAJfQogCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewogCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZChnZXRRdWFsaWZpZWROYW1lKCkpOworCQlzYi5hcHBlbmQodGhpcy5nZXRRdWFsaWZpZWROYW1lKCkpOwogCX0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIGdldFF1YWxpZmllZE5hbWUoKTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7CisJCXJldHVybiBOYW1lVG9vbHMuYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUodGhpcy5nZXRDYXRhbG9nKCksIHRoaXMuZ2V0U2NoZW1hKCksIHRoaXMuZ2V0TmFtZSgpKTsKIAl9CisKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcuamF2YQppbmRleCA1YWUwNzhlLi4zYTI5YTNkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVR5cGVNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFUeXBlTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDE3ICsxMCwyNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I7CiAKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVR5cGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKQEAgLTMzLDE3ICs0MywyMiBAQAogCQlzdXBlcihwYXJlbnQpOwogCX0KIAkKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlTm9kZSBnZXRNYXBwaW5nUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmdBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOworCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEphdmFQZXJzaXN0ZW50VHlwZSkgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCQorCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFJlc291cmNlTWFwcGluZ0Fubm90YXRpb24oKSB7CisJCXJldHVybiB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7CiAJfQogCi0JLy8qKioqKioqKioqKioqKioqKiBJVHlwZU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioKKwkvLyoqKioqKioqKioqKioqKioqIFR5cGVNYXBwaW5nIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJCiAJcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIChKYXZhUGVyc2lzdGVudFR5cGUpIGdldFBhcmVudCgpOworCQlyZXR1cm4gZ2V0UGFyZW50KCk7CiAJfQogCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7CisJcHVibGljIFN0cmluZyBnZXRQcmltYXJ5VGFibGVOYW1lKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKQEAgLTc1LDU1ICs5MCwxMTkgQEAKIAkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKIAl9CiAKLQlwdWJsaWMgSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwkvKioKKwkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb2YgVHlwZU1hcHBpbmdzLCBlYWNoIHdoaWNoIGluaGVyaXRzIGZyb20gdGhlIG9uZSBiZWZvcmUsCisJICogYW5kIHRlcm1pbmF0ZXMgYXQgdGhlIHJvb3QgZW50aXR5IChvciBhdCB0aGUgcG9pbnQgb2YgY3ljbGljaXR5KS4KKwkgKi8KKwlwdWJsaWMgSXRlcmF0b3I8VHlwZU1hcHBpbmc+IGluaGVyaXRhbmNlSGllcmFyY2h5KCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGVyc2lzdGVudFR5cGUsIFR5cGVNYXBwaW5nPihnZXRQZXJzaXN0ZW50VHlwZSgpLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFR5cGVNYXBwaW5nIHRyYW5zZm9ybShQZXJzaXN0ZW50VHlwZSB0eXBlKSB7CisJCQkJcmV0dXJuIHR5cGUuZ2V0TWFwcGluZygpOworCQkJfQorCQl9OwogCX0KLQkKLQlwdWJsaWMgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOworCisJcHVibGljIExpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlTWFwcGluZz4gYXR0cmlidXRlTWFwcGluZ3MoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFBdHRyaWJ1dGVNYXBwaW5nPihnZXRQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgdHJhbnNmb3JtKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQkJfQorCQl9OworCX0KKworCXB1YmxpYyBJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nPiBhbGxBdHRyaWJ1dGVNYXBwaW5ncygpIHsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nPigKKwkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFR5cGVNYXBwaW5nLCBJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nPj4odGhpcy5pbmhlcml0YW5jZUhpZXJhcmNoeSgpKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmc+IHRyYW5zZm9ybShUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgeworCQkJCQlyZXR1cm4gdHlwZU1hcHBpbmcgPT0gbnVsbCA/IEVtcHR5SXRlcmF0b3IuPEF0dHJpYnV0ZU1hcHBpbmc+IGluc3RhbmNlKCkgOiB0eXBlTWFwcGluZy5hdHRyaWJ1dGVNYXBwaW5ncygpOworCQkJCX0KKwkJfSk7CiAJfQogCQogCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPigKKwkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhdG9yPFN0cmluZz4+KHRoaXMuYXR0cmlidXRlTWFwcGluZ3MoKSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHRyYW5zZm9ybShBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcpIHsKKwkJCQkJcmV0dXJuIG1hcHBpbmcuYWxsT3ZlcnJpZGVhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCk7CisJCQkJfQorCQkJfSk7CiAJfQogCiAJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFR5cGVNYXBwaW5nLCBJdGVyYXRvcjxTdHJpbmc+Pih0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdHJhbnNmb3JtKFR5cGVNYXBwaW5nIG1hcHBpbmcpIHsKKwkJCQlyZXR1cm4gbWFwcGluZy5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCQl9CisJCX0pOwogCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7CisJCisJcHVibGljIENvbHVtbiByZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCWZvciAoQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGF0dHJpYnV0ZU1hcHBpbmdzKCkpKSB7CisJCQlDb2x1bW4gcmVzb2x2ZWRDb2x1bW4gPSBhdHRyaWJ1dGVNYXBwaW5nLnJlc29sdmVPdmVycmlkZW5Db2x1bW4oYXR0cmlidXRlTmFtZSk7CisJCQlpZiAocmVzb2x2ZWRDb2x1bW4gIT0gbnVsbCkgeworCQkJCXJldHVybiByZXNvbHZlZENvbHVtbjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIFJlbGF0aW9uc2hpcFJlZmVyZW5jZSByZXNvbHZlUmVsYXRpb25zaGlwUmVmZXJlbmNlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCWZvciAoQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGF0dHJpYnV0ZU1hcHBpbmdzKCkpKSB7CisJCQlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcmVzb2x2ZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgPSBhdHRyaWJ1dGVNYXBwaW5nLnJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoYXR0cmlidXRlTmFtZSk7CisJCQlpZiAocmVzb2x2ZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXNvbHZlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKIAl9CiAJCiAJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9ucygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KAorCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZywgSXRlcmF0b3I8U3RyaW5nPj4odGhpcy5hdHRyaWJ1dGVNYXBwaW5ncygpKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdHJhbnNmb3JtKEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgeworCQkJCQlyZXR1cm4gbWFwcGluZy5hbGxPdmVycmlkZWFibGVBc3NvY2lhdGlvbk1hcHBpbmdOYW1lcygpOworCQkJCX0KKwkJCX0pOwogCX0KIAkKIAlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4obmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VHlwZU1hcHBpbmcsIEl0ZXJhdG9yPFN0cmluZz4+KHRoaXMuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB0cmFuc2Zvcm0oVHlwZU1hcHBpbmcgbWFwcGluZykgeworCQkJCXJldHVybiBtYXBwaW5nLm92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOworCQkJfQorCQl9KTsKIAl9CiAJCi0JLy8qKioqKioqKioqKioqKioqKioqKiB1cGRhdGF0aW5nICoqKioqKioqKioqKioqKioqKioqKgotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tUmVzb3VyY2UoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKLQkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworCQorCS8vKioqKioqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7CisJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBqcnB0OwogCX0KIAotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0gamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpycHQ7CiAJfQogCQogCS8vKioqKioqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioKLQorCQorCXB1YmxpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlQWdhaW5zdERhdGFiYXNlKCkgeworCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKTsKKwl9CisJCiAJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldE1hcHBpbmdSZXNvdXJjZSgpLmdldFRleHRSYW5nZShhc3RSb290KTsKKwkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0UmVzb3VyY2VNYXBwaW5nQW5ub3RhdGlvbigpLmdldFRleHRSYW5nZShhc3RSb290KTsKIAkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKIAl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWU2ODUwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uCisJaW1wbGVtZW50cyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uCit7CisJcHJvdGVjdGVkIEFic3RyYWN0SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJLyoqCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4gIE92ZXJyaWRlIGlmIHRoZSBtYXBwaW5nIGRlZmluaXRpb24gbmVlZHMgdG8gZG8gbW9yZSBhbmFseXNpcy4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB0ZXN0KEphdmFQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgeworCQlyZXR1cm4gcGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSkgCisJCQkhPSBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldEFubm90YXRpb25OYW1lKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVmVyc2lvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVmVyc2lvbk1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWI4NDdjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFWZXJzaW9uTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVZlcnNpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFWZXJzaW9uTWFwcGluZworCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxWZXJzaW9uQW5ub3RhdGlvbj4gCisJaW1wbGVtZW50cyBKYXZhVmVyc2lvbk1hcHBpbmcKK3sKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUNvbHVtbiBjb2x1bW47CisKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUNvbnZlcnRlciBkZWZhdWx0Q29udmVydGVyOworCQorCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIHNwZWNpZmllZENvbnZlcnRlcjsKKworCXByb3RlY3RlZCBBYnN0cmFjdEphdmFWZXJzaW9uTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5jb2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQ29sdW1uKHRoaXMsIHRoaXMpOworCQl0aGlzLmRlZmF1bHRDb252ZXJ0ZXIgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhTnVsbENvbnZlcnRlcih0aGlzKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSggKSB7CisJCXN1cGVyLmluaXRpYWxpemUoKTsKKwkJdGhpcy5jb2x1bW4uaW5pdGlhbGl6ZSh0aGlzLmdldFJlc291cmNlQ29sdW1uKCkpOworCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXIodGhpcy5nZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKSk7CisJfQorCQkKKwlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXRSZXNvdXJjZUNvbHVtbigpIHsKKwkJcmV0dXJuIChDb2x1bW5Bbm5vdGF0aW9uKSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS4KKwkJCQlnZXROb25OdWxsQW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJfQorCisJLy8qKioqKioqKioqKioqKiBKYXZhQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ1tdIGJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKKwkJcmV0dXJuIEFycmF5VG9vbHMuYWRkQWxsKAorCQkJc3VwZXIuYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCisJCQlKUEEuQ09MVU1OLAorCQkJSlBBLlRFTVBPUkFMKTsKKwl9CisKKwkvLyoqKioqKioqKioqKioqIE5hbWVkQ29sdW1uLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuIGdldE5hbWUoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgeworCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7CisJfQorCisJLy8qKioqKioqKioqKioqKiBWZXJzaW9uTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgSmF2YUNvbHVtbiBnZXRDb2x1bW4oKSB7CisJCXJldHVybiB0aGlzLmNvbHVtbjsKKwl9CisJCisJcHVibGljIEphdmFDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkgeworCQlyZXR1cm4gZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkgPT0gbnVsbCA/IGdldERlZmF1bHRDb252ZXJ0ZXIoKSA6IGdldFNwZWNpZmllZENvbnZlcnRlcigpOworCX0KKwkKKwlwdWJsaWMgSmF2YUNvbnZlcnRlciBnZXREZWZhdWx0Q29udmVydGVyKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q29udmVydGVyOworCX0KKwkKKwlwdWJsaWMgSmF2YUNvbnZlcnRlciBnZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZENvbnZlcnRlcjsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjaWZlZENvbnZlcnRlclR5cGUoKSB7CisJCWlmICh0aGlzLnNwZWNpZmllZENvbnZlcnRlciA9PSBudWxsKSB7CisJCQlyZXR1cm4gQ29udmVydGVyLk5PX0NPTlZFUlRFUjsKKwkJfQorCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXIuZ2V0VHlwZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlclR5cGUpIHsKKwkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwoZ2V0U3BlY2lmZWRDb252ZXJ0ZXJUeXBlKCksIGNvbnZlcnRlclR5cGUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJSmF2YUNvbnZlcnRlciBvbGRDb252ZXJ0ZXIgPSB0aGlzLnNwZWNpZmllZENvbnZlcnRlcjsKKwkJSmF2YUNvbnZlcnRlciBuZXdDb252ZXJ0ZXIgPSBidWlsZFNwZWNpZmllZENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlKTsKKwkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXIgPSBudWxsOworCQlpZiAob2xkQ29udmVydGVyICE9IG51bGwpIHsKKwkJCW9sZENvbnZlcnRlci5yZW1vdmVGcm9tUmVzb3VyY2VNb2RlbCgpOworCQl9CisJCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyID0gbmV3Q29udmVydGVyOworCQlpZiAobmV3Q29udmVydGVyICE9IG51bGwpIHsKKwkJCW5ld0NvbnZlcnRlci5hZGRUb1Jlc291cmNlTW9kZWwoKTsKKwkJfQorCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFksIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ29udmVydGVyKEphdmFDb252ZXJ0ZXIgbmV3Q29udmVydGVyKSB7CisJCUphdmFDb252ZXJ0ZXIgb2xkQ29udmVydGVyID0gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXI7CisJCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyID0gbmV3Q29udmVydGVyOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFksIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKKwl9CisKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLmNvbHVtbi51cGRhdGUodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpKTsKKwkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwoZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCksIGdldFNwZWNpZmVkQ29udmVydGVyVHlwZSgpKSkgeworCQkJZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQl9CisJCWVsc2UgeworCQkJSmF2YUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXIoZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCkpOworCQkJc2V0U3BlY2lmaWVkQ29udmVydGVyKGphdmFDb252ZXJ0ZXIpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGJ1aWxkU3BlY2lmaWVkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7CisJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGNvbnZlcnRlclR5cGUsIENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpKSB7CisJCQlyZXR1cm4gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVRlbXBvcmFsQ29udmVydGVyKHRoaXMsIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlQ29udmVydGVyVHlwZSgpIHsKKwkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJcmVzdWx0ID0gdGhpcy5nZXRDb2x1bW4oKS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLy8qKioqKioqKioqKiAgVmFsaWRhdGlvbiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJaWYgKHRoaXMuc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKSkgeworCQkJdGhpcy52YWxpZGF0ZUNvbHVtbihtZXNzYWdlcywgYXN0Um9vdCk7CisJCX0KKwkJaWYgKHRoaXMuc3BlY2lmaWVkQ29udmVydGVyICE9IG51bGwpIHsKKwkJCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDb2x1bW4oTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCVN0cmluZyB0YWJsZU5hbWUgPSB0aGlzLmNvbHVtbi5nZXRUYWJsZSgpOworCQlpZiAodGhpcy5nZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKKwkJCQkJbmV3IFN0cmluZ1tdIHt0YWJsZU5hbWUsIHRoaXMuY29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQl0aGlzLmNvbHVtbiwKKwkJCQkJdGhpcy5jb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkpCisJCQkpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoICEgdGhpcy5jb2x1bW4uaXNSZXNvbHZlZCgpICYmIHRoaXMuY29sdW1uLmdldERiVGFibGUoKSAhPSBudWxsKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuY29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQl0aGlzLmNvbHVtbiwKKwkJCQkJdGhpcy5jb2x1bW4uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KQorCQkJCSkKKwkJCSk7CisJCX0KKwl9CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U3Mjk5Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhT3ZlcnJpZGUKLQlpbXBsZW1lbnRzIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlCi17Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhSm9pbkNvbHVtbj4gZGVmYXVsdEpvaW5Db2x1bW5zOwotCi0KLQlwdWJsaWMgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEFzc29jaWF0aW9uT3ZlcnJpZGUuT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PEphdmFKb2luQ29sdW1uPigpOwotCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8SmF2YUpvaW5Db2x1bW4+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIHNldFZpcnR1YWwoYm9vbGVhbiB2aXJ0dWFsKSB7Ci0JCXJldHVybiAoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUpIHN1cGVyLnNldFZpcnR1YWwodmlydHVhbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGdldE92ZXJyaWRlUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHN1cGVyLmdldE92ZXJyaWRlUmVzb3VyY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGUuT3duZXIgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoQXNzb2NpYXRpb25PdmVycmlkZS5Pd25lcikgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmlzRW1wdHkoKSA/IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zKCkgOiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5pc0VtcHR5KCkgPyB0aGlzLmRlZmF1bHRKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGRlZmF1bHRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0Sm9pbkNvbHVtbnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGRlZmF1bHRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKTsKLQl9Ci0JCi0JcHVibGljIGludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIEphdmFKb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhSm9pbkNvbHVtbih0aGlzLCBjcmVhdGVKb2luQ29sdW1uT3duZXIoKSk7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuYWRkKGluZGV4LCBqb2luQ29sdW1uKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtblJlc291cmNlID0gZ2V0T3ZlcnJpZGVSZXNvdXJjZSgpLmFkZEpvaW5Db2x1bW4oaW5kZXgpOwotCQlqb2luQ29sdW1uLmluaXRpYWxpemVGcm9tUmVzb3VyY2Uoam9pbkNvbHVtblJlc291cmNlKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKEFzc29jaWF0aW9uT3ZlcnJpZGUuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgam9pbkNvbHVtbik7Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4uT3duZXIgY3JlYXRlSm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5Pd25lcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4LCBKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIEFzc29jaWF0aW9uT3ZlcnJpZGUuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJSmF2YUpvaW5Db2x1bW4gcmVtb3ZlZEpvaW5Db2x1bW4gPSB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7Ci0JCWdldE92ZXJyaWRlUmVzb3VyY2UoKS5yZW1vdmVKb2luQ29sdW1uKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKEVudGl0eS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCByZW1vdmVkSm9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChqb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCBBc3NvY2lhdGlvbk92ZXJyaWRlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWdldE92ZXJyaWRlUmVzb3VyY2UoKS5tb3ZlSm9pbkNvbHVtbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQltb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIEFzc29jaWF0aW9uT3ZlcnJpZGUuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKTsJCQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAhdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXIoKS5nZXRUeXBlTWFwcGluZygpLmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKEphdmFKb2luQ29sdW1uIGNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlyZXN1bHQgPSBjb2x1bW4uamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJdGhpcy5uYW1lID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCk7Ci0JCWluaXRpYWxpemVTcGVjaWZpZWRKb2luQ29sdW1ucyhhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEpvaW5Db2x1bW5zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKTsKLQkJCi0JCXdoaWxlKGFubm90YXRpb25zLmhhc05leHQoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5hZGQoY3JlYXRlSm9pbkNvbHVtbihhbm5vdGF0aW9ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCXN1cGVyLnVwZGF0ZShhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJdXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSkgewotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiByZXNvdXJjZUpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpOwotCQkKLQkJd2hpbGUgKGpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJCWpvaW5Db2x1bW4udXBkYXRlKHJlc291cmNlSm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSwgY3JlYXRlSm9pbkNvbHVtbihyZXNvdXJjZUpvaW5Db2x1bW5zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBjcmVhdGVKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5SZXNvdXJjZSkgewotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUpvaW5Db2x1bW4odGhpcywgY3JlYXRlSm9pbkNvbHVtbk93bmVyKCkpOwotCQlqb2luQ29sdW1uLmluaXRpYWxpemVGcm9tUmVzb3VyY2Uoam9pbkNvbHVtblJlc291cmNlKTsKLQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JfQotCi0JCi0JLy8qKioqKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCQotCQlhZGRKb2luQ29sdW1uTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKb2luQ29sdW1uTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWZvciAoSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShqb2luQ29sdW1ucygpKSkgewotCQkJU3RyaW5nIHRhYmxlID0gam9pbkNvbHVtbi5nZXRUYWJsZSgpOwotCQkJYm9vbGVhbiBkb0NvbnRpbnVlID0gY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQkJCi0JCQlpZiAoZG9Db250aW51ZSAmJiBnZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlKSkgewotCQkJCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lKCksIHRhYmxlLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sCi0JCQkJCQkJam9pbkNvbHVtbiwgCi0JCQkJCQkJam9pbkNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHt0YWJsZSwgam9pbkNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCQlqb2luQ29sdW1uLCAKLQkJCQkJCQlqb2luQ29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCQkpOwotCQkJCX0KLQkJCQlkb0NvbnRpbnVlID0gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCWlmIChkb0NvbnRpbnVlICYmICEgam9pbkNvbHVtbi5pc1Jlc29sdmVkKCkpIHsKLQkJCQlpZiAoaXNWaXJ0dWFsKCkpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQkJam9pbkNvbHVtbiwgCi0JCQkJCQkJam9pbkNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCQkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCQlqb2luQ29sdW1uLCAKLQkJCQkJCQlqb2luQ29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoZG9Db250aW51ZSAmJiAhIGpvaW5Db2x1bW4uaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSkgewotCQkJCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge2dldE5hbWUoKSwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJCWpvaW5Db2x1bW4sIAotCQkJCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCksIGpvaW5Db2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQkJam9pbkNvbHVtbiwKLQkJCQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCQkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlwdWJsaWMgY2xhc3MgSm9pbkNvbHVtbk93bmVyIGltcGxlbWVudHMgSmF2YUpvaW5Db2x1bW4uT3duZXIKLQl7Ci0KLQkJcHVibGljIEpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogYnkgZGVmYXVsdCwgdGhlIGpvaW4gY29sdW1uIGlzIGluIHRoZSB0eXBlIG1hcHBpbmcncyBwcmltYXJ5IHRhYmxlCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnRoaXMub3duZXIuZ2V0VHlwZU1hcHBpbmcoKS5nZXRUYWJsZU5hbWUoKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgRW50aXR5IGdldFRhcmdldEVudGl0eSgpIHsKLQkJCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJCXJldHVybiByZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwgPyBudWxsIDogcmVsYXRpb25zaGlwTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZS50aGlzLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnRoaXMuZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZS50aGlzLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQkvKioKLQkJICogdGhlIGpvaW4gY29sdW1uIGNhbiBiZSBvbiBhIHNlY29uZGFyeSB0YWJsZQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdGFibGVJc0FsbG93ZWQoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnRoaXMub3duZXIuZ2V0VHlwZU1hcHBpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldERiVGFibGUodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSBnZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBnZXRUYXJnZXRFbnRpdHkoKTsKLQkJCXJldHVybiAodGFyZ2V0RW50aXR5ID09IG51bGwpID8gbnVsbCA6IHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZS50aGlzLmRlZmF1bHRKb2luQ29sdW1ucy5jb250YWlucyhqb2luQ29sdW1uKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZS50aGlzLmpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM5ZmM5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhT3ZlcnJpZGUKLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVPdmVycmlkZQotewotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFDb2x1bW4gY29sdW1uOwotCQotCi0JcHVibGljIEdlbmVyaWNKYXZhQXR0cmlidXRlT3ZlcnJpZGUoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JCXRoaXMuY29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUNvbHVtbih0aGlzLCB0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFBdHRyaWJ1dGVPdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCkgewotCQlyZXR1cm4gKEphdmFBdHRyaWJ1dGVPdmVycmlkZSkgc3VwZXIuc2V0VmlydHVhbCh2aXJ0dWFsKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBnZXRPdmVycmlkZVJlc291cmNlKCkgewotCQlyZXR1cm4gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgc3VwZXIuZ2V0T3ZlcnJpZGVSZXNvdXJjZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotCQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtblJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZVJlc291cmNlKCkuZ2V0Tm9uTnVsbENvbHVtbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCUNvbHVtbk1hcHBpbmcgY29sdW1uTWFwcGluZyA9IGdldENvbHVtbk1hcHBpbmcoKTsKLQkJaWYgKGNvbHVtbk1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGNvbHVtbk1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCUNvbHVtbk1hcHBpbmcgY29sdW1uTWFwcGluZyA9IGdldENvbHVtbk1hcHBpbmcoKTsKLQkJaWYgKGNvbHVtbk1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHRhYmxlTmFtZSA9IGNvbHVtbk1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQkJaWYgKHRhYmxlTmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGFibGVOYW1lOwotCQl9Ci0JCXJldHVybiBnZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb2x1bW5NYXBwaW5nIGdldENvbHVtbk1hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldENvbHVtbk1hcHBpbmcoZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvLyoqKioqKioqKioqKiogSUNvbHVtbi5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXIoKS5nZXRUeXBlTWFwcGluZygpOwotCX0KLQkKLQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCX0KLQkKLQkvLyoqKioqKioqKioqKiogSUF0dHJpYnV0ZU92ZXJyaWRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCi0JCi0JcHVibGljIEphdmFDb2x1bW4gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JLy8qKioqKioqKioqKioqIEphdmFPdmVycmlkZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCX0KLQkKLQkvLyoqKioqKioqKioqKiogamF2YSByZXNvdXJjZSBtb2RlbCAtPiBqYXZhIGNvbnRleHQgbW9kZWwgKioqKioqKioqKioqKioJCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVJlc291cmNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UpOwotCQl0aGlzLmNvbHVtbi5pbml0aWFsaXplRnJvbVJlc291cmNlKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKSB7Ci0JCXN1cGVyLnVwZGF0ZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKTsKLQkJdGhpcy5jb2x1bW4udXBkYXRlKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKSk7CQkKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmVzdWx0ID0gdGhpcy5nZXRDb2x1bW4oKS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkKLQkJYWRkQ29sdW1uTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nIHRhYmxlID0gZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKTsKLQkJYm9vbGVhbiBkb0NvbnRpbnVlID0gY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGUpKSB7Ci0JCQlpZiAoaXNWaXJ0dWFsKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpLCB0YWJsZSwgZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpfSwKLQkJCQkJCWdldENvbHVtbigpLCAKLQkJCQkJCWdldENvbHVtbigpLmdldFRhYmxlVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge3RhYmxlLCBnZXRDb2x1bW4oKS5nZXROYW1lKCl9LCAKLQkJCQkJCQlnZXRDb2x1bW4oKSwgCi0JCQkJCQkJZ2V0Q29sdW1uKCkuZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJCSk7Ci0JCQl9Ci0JCQlkb0NvbnRpbnVlID0gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmICEgZ2V0Q29sdW1uKCkuaXNSZXNvbHZlZCgpKSB7Ci0JCQlpZiAoaXNWaXJ0dWFsKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lKCksIGdldENvbHVtbigpLmdldE5hbWUoKX0sIAotCQkJCQkJZ2V0Q29sdW1uKCksIAotCQkJCQkJZ2V0Q29sdW1uKCkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge2dldENvbHVtbigpLmdldE5hbWUoKX0sIAotCQkJCQkJCWdldENvbHVtbigpLCAKLQkJCQkJCQlnZXRDb2x1bW4oKS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCQkpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQmFzaWNNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQmFzaWNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOTA5NjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUJhc2ljTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OdWxsYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQmFzaWNNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxCYXNpY0Fubm90YXRpb24+IGltcGxlbWVudHMgSmF2YUJhc2ljTWFwcGluZwotewotCXByb3RlY3RlZCBGZXRjaFR5cGUgc3BlY2lmaWVkRmV0Y2g7Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRPcHRpb25hbDsKLQkKLQlwcm90ZWN0ZWQgRW51bVR5cGUgc3BlY2lmaWVkRW51bWVyYXRlZDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUNvbHVtbiBjb2x1bW47Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gbG9iOwotCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSB0ZW1wb3JhbDsKLQotCXB1YmxpYyBHZW5lcmljSmF2YUJhc2ljTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb2x1bW4gPSBjcmVhdGVKYXZhQ29sdW1uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb2x1bW4gY3JlYXRlSmF2YUNvbHVtbigpIHsKLQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFDb2x1bW4odGhpcywgdGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVJlc291cmNlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMuY29sdW1uLmluaXRpYWxpemVGcm9tUmVzb3VyY2UodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpKTsKLQkJdGhpcy5zcGVjaWZpZWRFbnVtZXJhdGVkID0gdGhpcy5zcGVjaWZpZWRFbnVtZXJhdGVkKHRoaXMuZ2V0RW51bWVyYXRlZFJlc291cmNlKCkpOwotCQl0aGlzLmxvYiA9IHRoaXMubG9iKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMudGVtcG9yYWwgPSB0aGlzLnRlbXBvcmFsKHRoaXMuZ2V0VGVtcG9yYWxSZXNvdXJjZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShCYXNpY0Fubm90YXRpb24gYmFzaWNSZXNvdXJjZSkgewotCQl0aGlzLnNwZWNpZmllZEZldGNoID0gdGhpcy5zcGVjaWZpZWRGZXRjaFR5cGUoYmFzaWNSZXNvdXJjZSk7Ci0JCXRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgPSB0aGlzLnNwZWNpZmllZE9wdGlvbmFsKGJhc2ljUmVzb3VyY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRW51bWVyYXRlZEFubm90YXRpb24gZ2V0RW51bWVyYXRlZFJlc291cmNlKCkgewotCQlyZXR1cm4gKEVudW1lcmF0ZWRBbm5vdGF0aW9uKSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROb25OdWxsQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGVtcG9yYWxBbm5vdGF0aW9uIGdldFRlbXBvcmFsUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoVGVtcG9yYWxBbm5vdGF0aW9uKSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROb25OdWxsQW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChDb2x1bW5Bbm5vdGF0aW9uKSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROb25OdWxsQW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKiogSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigKLQkJCUpQQS5DT0xVTU4sCi0JCQlKUEEuTE9CLAotCQkJSlBBLlRFTVBPUkFMLAotCQkJSlBBLkVOVU1FUkFURUQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKiogSUJhc2ljTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBKYXZhQ29sdW1uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCX0KLQkKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkRmV0Y2goKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEZldGNoKCkgOiB0aGlzLmdldFNwZWNpZmllZEZldGNoKCk7Ci0JfQotCi0JcHVibGljIEZldGNoVHlwZSBnZXREZWZhdWx0RmV0Y2goKSB7Ci0JCXJldHVybiBCYXNpY01hcHBpbmcuREVGQVVMVF9GRVRDSF9UWVBFOwotCX0KLQkJCi0JcHVibGljIEZldGNoVHlwZSBnZXRTcGVjaWZpZWRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRmV0Y2g7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZSBuZXdTcGVjaWZpZWRGZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkRmV0Y2ggPSB0aGlzLnNwZWNpZmllZEZldGNoOwotCQl0aGlzLnNwZWNpZmllZEZldGNoID0gbmV3U3BlY2lmaWVkRmV0Y2g7Ci0JCXRoaXMuZ2V0TWFwcGluZ1Jlc291cmNlKCkuc2V0RmV0Y2goRmV0Y2hUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRmV0Y2gpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChGZXRjaGFibGUuU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGRGZXRjaCwgbmV3U3BlY2lmaWVkRmV0Y2gpOwotCX0KLQkKLQkvKioKLQkgKiBpbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4KLQkgKiBUaGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggSW52YWxpZFRocmVhZEFjY2VzcyBleGNlcHRpb25zIGluIHRoZSBVSQotCSAqIHdoZW4geW91IHNldCBhIHZhbHVlIGZyb20gdGhlIFVJIGFuZCB0aGUgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHlldC4KLQkgKiBBZGRpbmcgdGhlIGFubm90YXRpb24gY2F1c2VzIGFuIHVwZGF0ZSB0byBvY2N1ciBhbmQgdGhlbiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEZldGNoXyhGZXRjaFR5cGUgbmV3U3BlY2lmaWVkRmV0Y2gpIHsKLQkJRmV0Y2hUeXBlIG9sZEZldGNoID0gdGhpcy5zcGVjaWZpZWRGZXRjaDsKLQkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IG5ld1NwZWNpZmllZEZldGNoOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEZldGNoYWJsZS5TUEVDSUZJRURfRkVUQ0hfUFJPUEVSVFksIG9sZEZldGNoLCBuZXdTcGVjaWZpZWRGZXRjaCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0T3B0aW9uYWwoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdE9wdGlvbmFsKCkgewotCQlyZXR1cm4gTnVsbGFibGUuREVGQVVMVF9PUFRJT05BTDsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuIG5ld1NwZWNpZmllZE9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkT3B0aW9uYWwgPSB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOwotCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gbmV3U3BlY2lmaWVkT3B0aW9uYWw7Ci0JCXRoaXMuZ2V0TWFwcGluZ1Jlc291cmNlKCkuc2V0T3B0aW9uYWwobmV3U3BlY2lmaWVkT3B0aW9uYWwpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE51bGxhYmxlLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgb2xkT3B0aW9uYWwsIG5ld1NwZWNpZmllZE9wdGlvbmFsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRPcHRpb25hbF8oQm9vbGVhbiBuZXdTcGVjaWZpZWRPcHRpb25hbCkgewotCQlCb29sZWFuIG9sZE9wdGlvbmFsID0gdGhpcy5zcGVjaWZpZWRPcHRpb25hbDsKLQkJdGhpcy5zcGVjaWZpZWRPcHRpb25hbCA9IG5ld1NwZWNpZmllZE9wdGlvbmFsOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE51bGxhYmxlLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgb2xkT3B0aW9uYWwsIG5ld1NwZWNpZmllZE9wdGlvbmFsKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYigpIHsKLQkJcmV0dXJuIHRoaXMubG9iOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvYihib29sZWFuIG5ld0xvYikgewotCQlib29sZWFuIG9sZExvYiA9IHRoaXMubG9iOwotCQl0aGlzLmxvYiA9IG5ld0xvYjsKLQkJaWYgKG5ld0xvYikgewotCQkJaWYgKGxvYlJlc291cmNlKGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKSA9PSBudWxsKSB7Ci0JCQkJZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobG9iUmVzb3VyY2UoZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpICE9IG51bGwpIHsKLQkJCQlnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2ljTWFwcGluZy5MT0JfUFJPUEVSVFksIG9sZExvYiwgbmV3TG9iKTsKLQl9Ci0KLQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkgewotCQlyZXR1cm4gdGhpcy50ZW1wb3JhbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpIHsKLQkJVGVtcG9yYWxUeXBlIG9sZFRlbXBvcmFsID0gdGhpcy50ZW1wb3JhbDsKLQkJdGhpcy50ZW1wb3JhbCA9IG5ld1RlbXBvcmFsOwotCQl0aGlzLmdldFRlbXBvcmFsUmVzb3VyY2UoKS5zZXRWYWx1ZShUZW1wb3JhbFR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChuZXdUZW1wb3JhbCkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENvbHVtbk1hcHBpbmcuVEVNUE9SQUxfUFJPUEVSVFksIG9sZFRlbXBvcmFsLCBuZXdUZW1wb3JhbCk7Ci0JfQotCQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGVtcG9yYWxfKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkgewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0aGlzLnRlbXBvcmFsOwotCQl0aGlzLnRlbXBvcmFsID0gbmV3VGVtcG9yYWw7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ29sdW1uTWFwcGluZy5URU1QT1JBTF9QUk9QRVJUWSwgb2xkVGVtcG9yYWwsIG5ld1RlbXBvcmFsKTsKLQl9Ci0JCi0JcHVibGljIEVudW1UeXBlIGdldEVudW1lcmF0ZWQoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRFbnVtZXJhdGVkKCkgOiB0aGlzLmdldFNwZWNpZmllZEVudW1lcmF0ZWQoKTsKLQl9Ci0JCi0JcHVibGljIEVudW1UeXBlIGdldERlZmF1bHRFbnVtZXJhdGVkKCkgewotCQlyZXR1cm4gQmFzaWNNYXBwaW5nLkRFRkFVTFRfRU5VTUVSQVRFRDsKLQl9Ci0JCi0JcHVibGljIEVudW1UeXBlIGdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEVudW1lcmF0ZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUgbmV3U3BlY2lmaWVkRW51bWVyYXRlZCkgewotCQlFbnVtVHlwZSBvbGRFbnVtZXJhdGVkID0gdGhpcy5zcGVjaWZpZWRFbnVtZXJhdGVkOwotCQl0aGlzLnNwZWNpZmllZEVudW1lcmF0ZWQgPSBuZXdTcGVjaWZpZWRFbnVtZXJhdGVkOwotCQl0aGlzLmdldEVudW1lcmF0ZWRSZXNvdXJjZSgpLnNldFZhbHVlKEVudW1UeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRW51bWVyYXRlZCkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2ljTWFwcGluZy5TUEVDSUZJRURfRU5VTUVSQVRFRF9QUk9QRVJUWSwgb2xkRW51bWVyYXRlZCwgbmV3U3BlY2lmaWVkRW51bWVyYXRlZCk7Ci0JfQotCQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRW51bWVyYXRlZF8oRW51bVR5cGUgbmV3U3BlY2lmaWVkRW51bWVyYXRlZCkgewotCQlFbnVtVHlwZSBvbGRFbnVtZXJhdGVkID0gdGhpcy5zcGVjaWZpZWRFbnVtZXJhdGVkOwotCQl0aGlzLnNwZWNpZmllZEVudW1lcmF0ZWQgPSBuZXdTcGVjaWZpZWRFbnVtZXJhdGVkOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2ljTWFwcGluZy5TUEVDSUZJRURfRU5VTUVSQVRFRF9QUk9QRVJUWSwgb2xkRW51bWVyYXRlZCwgbmV3U3BlY2lmaWVkRW51bWVyYXRlZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXN1cGVyLnVwZGF0ZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLmNvbHVtbi51cGRhdGUodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkXyh0aGlzLnNwZWNpZmllZEVudW1lcmF0ZWQodGhpcy5nZXRFbnVtZXJhdGVkUmVzb3VyY2UoKSkpOwotCQl0aGlzLnNldExvYih0aGlzLmxvYihyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpKTsKLQkJdGhpcy5zZXRUZW1wb3JhbF8odGhpcy50ZW1wb3JhbCh0aGlzLmdldFRlbXBvcmFsUmVzb3VyY2UoKSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoQmFzaWNBbm5vdGF0aW9uIGJhc2ljUmVzb3VyY2UpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRGZXRjaF8odGhpcy5zcGVjaWZpZWRGZXRjaFR5cGUoYmFzaWNSZXNvdXJjZSkpOwotCQl0aGlzLnNldFNwZWNpZmllZE9wdGlvbmFsXyh0aGlzLnNwZWNpZmllZE9wdGlvbmFsKGJhc2ljUmVzb3VyY2UpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBzcGVjaWZpZWRGZXRjaFR5cGUoQmFzaWNBbm5vdGF0aW9uIGJhc2ljKSB7Ci0JCXJldHVybiBGZXRjaFR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKGJhc2ljLmdldEZldGNoKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRPcHRpb25hbChCYXNpY0Fubm90YXRpb24gYmFzaWMpIHsKLQkJcmV0dXJuIGJhc2ljLmdldE9wdGlvbmFsKCk7Ci0JfQotCQotCXByb3RlY3RlZCBFbnVtVHlwZSBzcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1lcmF0ZWRBbm5vdGF0aW9uIGVudW1lcmF0ZWQpIHsKLQkJcmV0dXJuIEVudW1UeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBsb2IoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIGxvYlJlc291cmNlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgIT0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIExvYkFubm90YXRpb24gbG9iUmVzb3VyY2UoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIChMb2JBbm5vdGF0aW9uKSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCQotCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgdGVtcG9yYWwoVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsKSB7Ci0JCXJldHVybiBUZW1wb3JhbFR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKHRlbXBvcmFsLmdldFZhbHVlKCkpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLmdldENvbHVtbigpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzICxhc3RSb290KTsKLQkJCi0JCWFkZENvbHVtbk1lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29sdW1uTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUphdmFDb2x1bW4gY29sdW1uID0gdGhpcy5nZXRDb2x1bW4oKTsKLQkJU3RyaW5nIHRhYmxlID0gY29sdW1uLmdldFRhYmxlKCk7Ci0JCWJvb2xlYW4gZG9Db250aW51ZSA9IGVudGl0eU93bmVkKCkgJiYgY29sdW1uLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGUpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7dGFibGUsIGNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWNvbHVtbiwgY29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCSk7Ci0JCQlkb0NvbnRpbnVlID0gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmICEgY29sdW1uLmlzUmVzb2x2ZWQoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Y29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJY29sdW1uLCBjb2x1bW4uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzFhNzcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUNvbHVtbiBleHRlbmRzIEFic3RyYWN0SmF2YUJhc2VDb2x1bW48Q29sdW1uQW5ub3RhdGlvbj4gaW1wbGVtZW50cyBKYXZhQ29sdW1uCi17Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRMZW5ndGg7Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRQcmVjaXNpb247Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRTY2FsZTsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFDb2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUNvbHVtbi5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbikgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVJlc291cmNlKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5zcGVjaWZpZWRMZW5ndGgoY29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWRQcmVjaXNpb24gPSB0aGlzLnNwZWNpZmllZFByZWNpc2lvbihjb2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZFNjYWxlID0gdGhpcy5zcGVjaWZpZWRTY2FsZShjb2x1bW4pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUNvbHVtbi5Pd25lciBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChKYXZhQ29sdW1uLk93bmVyKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtblJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldENvbHVtblJlc291cmNlKCk7Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldExlbmd0aCgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZExlbmd0aCgpID09IG51bGwpID8gZ2V0RGVmYXVsdExlbmd0aCgpIDogdGhpcy5nZXRTcGVjaWZpZWRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0TGVuZ3RoKCkgewotCQlyZXR1cm4gQ29sdW1uLkRFRkFVTFRfTEVOR1RIOwotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlciBuZXdTcGVjaWZpZWRMZW5ndGgpIHsKLQkJSW50ZWdlciBvbGRTcGVjaWZpZWRMZW5ndGggPSB0aGlzLnNwZWNpZmllZExlbmd0aDsKLQkJdGhpcy5zcGVjaWZpZWRMZW5ndGggPSBuZXdTcGVjaWZpZWRMZW5ndGg7Ci0JCWdldENvbHVtblJlc291cmNlKCkuc2V0TGVuZ3RoKG5ld1NwZWNpZmllZExlbmd0aCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTGVuZ3RoLCBuZXdTcGVjaWZpZWRMZW5ndGgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRMZW5ndGhfKEludGVnZXIgbmV3U3BlY2lmaWVkTGVuZ3RoKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gbmV3U3BlY2lmaWVkTGVuZ3RoOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFksIG9sZFNwZWNpZmllZExlbmd0aCwgbmV3U3BlY2lmaWVkTGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRQcmVjaXNpb24oKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSA9PSBudWxsKSA/IGdldERlZmF1bHRQcmVjaXNpb24oKSA6IHRoaXMuZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTjsKLQl9Ci0JCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQcmVjaXNpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIgbmV3U3BlY2lmaWVkUHJlY2lzaW9uKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkUHJlY2lzaW9uID0gdGhpcy5zcGVjaWZpZWRQcmVjaXNpb247Ci0JCXRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uID0gbmV3U3BlY2lmaWVkUHJlY2lzaW9uOwotCQlnZXRDb2x1bW5SZXNvdXJjZSgpLnNldFByZWNpc2lvbihuZXdTcGVjaWZpZWRQcmVjaXNpb24pOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QUkVDSVNJT05fUFJPUEVSVFksIG9sZFNwZWNpZmllZFByZWNpc2lvbiwgbmV3U3BlY2lmaWVkUHJlY2lzaW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUHJlY2lzaW9uXyhJbnRlZ2VyIG5ld1NwZWNpZmllZFByZWNpc2lvbikgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZFByZWNpc2lvbiA9IHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uOwotCQl0aGlzLnNwZWNpZmllZFByZWNpc2lvbiA9IG5ld1NwZWNpZmllZFByZWNpc2lvbjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUFJFQ0lTSU9OX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRQcmVjaXNpb24sIG5ld1NwZWNpZmllZFByZWNpc2lvbik7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U2NhbGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRTY2FsZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFNjYWxlKCkgOiB0aGlzLmdldFNwZWNpZmllZFNjYWxlKCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFNjYWxlKCkgewotCQlyZXR1cm4gQ29sdW1uLkRFRkFVTFRfU0NBTEU7Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZFNjYWxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTY2FsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyIG5ld1NwZWNpZmllZFNjYWxlKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkU2NhbGUgPSB0aGlzLnNwZWNpZmllZFNjYWxlOwotCQl0aGlzLnNwZWNpZmllZFNjYWxlID0gbmV3U3BlY2lmaWVkU2NhbGU7Ci0JCWdldENvbHVtblJlc291cmNlKCkuc2V0U2NhbGUobmV3U3BlY2lmaWVkU2NhbGUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0FMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2NhbGUsIG5ld1NwZWNpZmllZFNjYWxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2NhbGVfKEludGVnZXIgbmV3U3BlY2lmaWVkU2NhbGUpIHsKLQkJSW50ZWdlciBvbGRTcGVjaWZpZWRTY2FsZSA9IHRoaXMuc3BlY2lmaWVkU2NhbGU7Ci0JCXRoaXMuc3BlY2lmaWVkU2NhbGUgPSBuZXdTcGVjaWZpZWRTY2FsZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NBTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFNjYWxlLCBuZXdTcGVjaWZpZWRTY2FsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdGFibGVJc0FsbG93ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldENvbHVtblJlc291cmNlKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0T3duZXIoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKENvbHVtbkFubm90YXRpb24gY29sdW1uKSB7Ci0JCXN1cGVyLnVwZGF0ZShjb2x1bW4pOwotCQl0aGlzLnNldFNwZWNpZmllZExlbmd0aF8odGhpcy5zcGVjaWZpZWRMZW5ndGgoY29sdW1uKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUHJlY2lzaW9uXyh0aGlzLnNwZWNpZmllZFByZWNpc2lvbihjb2x1bW4pKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTY2FsZV8odGhpcy5zcGVjaWZpZWRTY2FsZShjb2x1bW4pKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkTGVuZ3RoKENvbHVtbkFubm90YXRpb24gY29sdW1uKSB7Ci0JCXJldHVybiBjb2x1bW4uZ2V0TGVuZ3RoKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZFByZWNpc2lvbihDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbikgewotCQlyZXR1cm4gY29sdW1uLmdldFByZWNpc2lvbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRTY2FsZShDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbikgewotCQlyZXR1cm4gY29sdW1uLmdldFNjYWxlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFEaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ODNiZDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFEaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4gZXh0ZW5kcyBBYnN0cmFjdEphdmFOYW1lZENvbHVtbjxEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uCi17Ci0KLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGU7Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRMZW5ndGg7Ci0JCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGVyc2lzdGVuY2VSZXNvdXJjZTsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFEaXNjcmltaW5hdG9yQ29sdW1uKEphdmFFbnRpdHkgcGFyZW50LCBKYXZhTmFtZWRDb2x1bW4uT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBlcnNpc3RlbnRSZXNvdXJjZSkgewotCQl0aGlzLnBlcnNpc3RlbmNlUmVzb3VyY2UgPSBwZXJzaXN0ZW50UmVzb3VyY2U7Ci0JCXRoaXMuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZSh0aGlzLmdldENvbHVtblJlc291cmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbikgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVJlc291cmNlKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUgPSB0aGlzLmRpc2NyaW1pbmF0b3JUeXBlKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5sZW5ndGgoY29sdW1uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFFbnRpdHkgZ2V0SmF2YUVudGl0eSgpIHsKLQkJcmV0dXJuIChKYXZhRW50aXR5KSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHRoaXMucGVyc2lzdGVuY2VSZXNvdXJjZS5nZXROb25OdWxsQW5ub3RhdGlvbihEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRTsKLQl9Ci0JCQotCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCURpc2NyaW1pbmF0b3JUeXBlIG9sZERpc2NyaW1pbmF0b3JUeXBlID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSA9IG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOwotCQlnZXRDb2x1bW5SZXNvdXJjZSgpLnNldERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChEaXNjcmltaW5hdG9yQ29sdW1uLlNQRUNJRklFRF9ESVNDUklNSU5BVE9SX1RZUEVfUFJPUEVSVFksIG9sZERpc2NyaW1pbmF0b3JUeXBlLCBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgotCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCi0JICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgotCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGVfKERpc2NyaW1pbmF0b3JUeXBlIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCURpc2NyaW1pbmF0b3JUeXBlIG9sZERpc2NyaW1pbmF0b3JUeXBlID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSA9IG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERpc2NyaW1pbmF0b3JDb2x1bW4uU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkRGlzY3JpbWluYXRvclR5cGUsIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKTsKLQl9Ci0JCQotCXB1YmxpYyBJbnRlZ2VyIGdldExlbmd0aCgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZExlbmd0aCgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0TGVuZ3RoKCkgOiB0aGlzLmdldFNwZWNpZmllZExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRMZW5ndGgoKSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RIOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyIG5ld1NwZWNpZmllZExlbmd0aCkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZExlbmd0aCA9IHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IG5ld1NwZWNpZmllZExlbmd0aDsKLQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRMZW5ndGgobmV3U3BlY2lmaWVkTGVuZ3RoKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChEaXNjcmltaW5hdG9yQ29sdW1uLlNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFksIG9sZFNwZWNpZmllZExlbmd0aCwgbmV3U3BlY2lmaWVkTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4KLQkgKiBUaGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggSW52YWxpZFRocmVhZEFjY2VzcyBleGNlcHRpb25zIGluIHRoZSBVSQotCSAqIHdoZW4geW91IHNldCBhIHZhbHVlIGZyb20gdGhlIFVJIGFuZCB0aGUgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHlldC4KLQkgKiBBZGRpbmcgdGhlIGFubm90YXRpb24gY2F1c2VzIGFuIHVwZGF0ZSB0byBvY2N1ciBhbmQgdGhlbiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZExlbmd0aF8oSW50ZWdlciBuZXdTcGVjaWZpZWRMZW5ndGgpIHsKLQkJSW50ZWdlciBvbGRTcGVjaWZpZWRMZW5ndGggPSB0aGlzLnNwZWNpZmllZExlbmd0aDsKLQkJdGhpcy5zcGVjaWZpZWRMZW5ndGggPSBuZXdTcGVjaWZpZWRMZW5ndGg7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRGlzY3JpbWluYXRvckNvbHVtbi5TUEVDSUZJRURfTEVOR1RIX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRMZW5ndGgsIG5ld1NwZWNpZmllZExlbmd0aCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gZ2V0Q29sdW1uUmVzb3VyY2UoKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRPd25lcigpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CQotCX0KLQotCQotCS8vICoqKioqKioqKiogamF2YSBhbm5vdGF0aW9ucyAtPiBwZXJzaXN0ZW5jZSBtb2RlbCAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGVyc2lzdGVudFJlc291cmNlKSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VSZXNvdXJjZSA9IHBlcnNpc3RlbnRSZXNvdXJjZTsKLQkJdGhpcy51cGRhdGUodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JDb2x1bW4pIHsKLQkJc3VwZXIudXBkYXRlKGRpc2NyaW1pbmF0b3JDb2x1bW4pOwotCQl0aGlzLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlXyh0aGlzLmRpc2NyaW1pbmF0b3JUeXBlKGRpc2NyaW1pbmF0b3JDb2x1bW4pKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGhfKHRoaXMubGVuZ3RoKGRpc2NyaW1pbmF0b3JDb2x1bW4pKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JDb2x1bW4pIHsKLQkJcmV0dXJuIERpc2NyaW1pbmF0b3JUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChkaXNjcmltaW5hdG9yQ29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBsZW5ndGgoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gZGlzY3JpbWluYXRvckNvbHVtbikgewotCQlyZXR1cm4gZGlzY3JpbWluYXRvckNvbHVtbi5nZXRMZW5ndGgoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkMmJjYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbWJlZGRhYmxlIGV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcgaW1wbGVtZW50cyBKYXZhRW1iZWRkYWJsZQotewotCXB1YmxpYyBHZW5lcmljSmF2YUVtYmVkZGFibGUoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFbWJlZGRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY29ycmVzcG9uZGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNYXBwZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBhdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChTdHJpbmcgYXR0cmlidXRlTWFwcGluZ0tleSkgewotCQlyZXR1cm4gYXR0cmlidXRlTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkgfHwgYXR0cmlidXRlTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRlZElkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZTRiNTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nPEVtYmVkZGVkSWRBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgSmF2YUVtYmVkZGVkSWRNYXBwaW5nCi17Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFFbWJlZGRlZElkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvLyoqKioqKioqKioqKioqKioqKiBJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW5hdGlvbiAqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0lkTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBmZTljOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nPEVtYmVkZGVkQW5ub3RhdGlvbj4gaW1wbGVtZW50cyBKYXZhRW1iZWRkZWRNYXBwaW5nCi17Ci0JcHVibGljIEdlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKiBJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW5hdGlvbiAqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudGl0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmFhYTQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZENsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFEaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZENsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcmllc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbnRpdHkgZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZyBpbXBsZW1lbnRzIEphdmFFbnRpdHkKLXsKLQlwcm90ZWN0ZWQgRW50aXR5QW5ub3RhdGlvbiBlbnRpdHlSZXNvdXJjZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFUYWJsZSB0YWJsZTsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFTZWNvbmRhcnlUYWJsZT4gc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci0KLQlwcm90ZWN0ZWQgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQotCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneTsKLQkKLQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIGRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZDsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbjsKLQotCXByb3RlY3RlZCBKYXZhU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3I7Ci0KLQlwcm90ZWN0ZWQgSmF2YVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllczsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFOYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXM7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkQ2xhc3M7Ci0KLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnRhYmxlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVRhYmxlKHRoaXMpOwotCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4gPSBidWlsZEphdmFEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzID0gbmV3IEFycmF5TGlzdDxKYXZhU2Vjb25kYXJ5VGFibGU+KCk7Ci0JCXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+KCk7Ci0JCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEFycmF5TGlzdDxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KCk7Ci0JCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPigpOwotCQl0aGlzLm5hbWVkUXVlcmllcyA9IG5ldyBBcnJheUxpc3Q8SmF2YU5hbWVkUXVlcnk+KCk7Ci0JCXRoaXMubmFtZWROYXRpdmVRdWVyaWVzID0gbmV3IEFycmF5TGlzdDxKYXZhTmFtZWROYXRpdmVRdWVyeT4oKTsKLQkJdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+KCk7Ci0JCXRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gbmV3IEFycmF5TGlzdDxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFCYXNlSm9pbkNvbHVtbi5Pd25lciBjcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uIGJ1aWxkSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4oKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhRGlzY3JpbWluYXRvckNvbHVtbih0aGlzLCBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFOYW1lZENvbHVtbi5Pd25lciBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhTmFtZWRDb2x1bW4uT3duZXIoKXsKLQkJCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW50aXR5LnRoaXMuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCQkJfQotCi0JCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCQlyZXR1cm4gR2VuZXJpY0phdmFFbnRpdHkudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQkJfQotCi0JCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW50aXR5LnRoaXM7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCQkJcmV0dXJuIERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9OQU1FOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tUmVzb3VyY2UoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVJlc291cmNlKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLmVudGl0eVJlc291cmNlID0gKEVudGl0eUFubm90YXRpb24pIHJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gdGhpcy5zcGVjaWZpZWROYW1lKHRoaXMuZW50aXR5UmVzb3VyY2UpOwotCQl0aGlzLmRlZmF1bHROYW1lID0gdGhpcy5kZWZhdWx0TmFtZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy5kZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSA9IHRoaXMuZGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKTsKLQkJdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KGdldEluaGVyaXRhbmNlUmVzb3VyY2UoKSk7Ci0JCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlID0gdGhpcy5nZXREaXNjcmltaW5hdG9yVmFsdWVSZXNvdXJjZSgpLmdldFZhbHVlKCk7Ci0JCXRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSA9IHRoaXMuamF2YURlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkID0gdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi5pbml0aWFsaXplRnJvbVJlc291cmNlKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnRhYmxlLmluaXRpYWxpemVGcm9tUmVzb3VyY2UocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlY29uZGFyeVRhYmxlcyhyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy5pbml0aWFsaXplVGFibGVHZW5lcmF0b3IocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9yKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLmluaXRpYWxpemVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy5pbml0aWFsaXplU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLmluaXRpYWxpemVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyhyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy5pbml0aWFsaXplRGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLmluaXRpYWxpemVOYW1lZFF1ZXJpZXMocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZU5hbWVkTmF0aXZlUXVlcmllcyhyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy5pbml0aWFsaXplSWRDbGFzcyhyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy51cGRhdGVQZXJzaXN0ZW5jZVVuaXRHZW5lcmF0b3JzQW5kUXVlcmllcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGFubm90YXRpb25zID0gcmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQl3aGlsZShhbm5vdGF0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLmFkZChidWlsZFNlY29uZGFyeVRhYmxlKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIGFubm90YXRpb25zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUYWJsZUdlbmVyYXRvcihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gdGFibGVHZW5lcmF0b3IocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCWlmICh0YWJsZUdlbmVyYXRvclJlc291cmNlICE9IG51bGwpIHsKLQkJCXRoaXMudGFibGVHZW5lcmF0b3IgPSBidWlsZFRhYmxlR2VuZXJhdG9yKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvcihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gc2VxdWVuY2VHZW5lcmF0b3IocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCWlmIChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlICE9IG51bGwpIHsKLQkJCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBidWlsZFNlcXVlbmNlR2VuZXJhdG9yKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYW5ub3RhdGlvbnMgPSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJd2hpbGUoYW5ub3RhdGlvbnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhbm5vdGF0aW9ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRCdWlsZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuICFjb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4obmV3IE51bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbihwZXJzaXN0ZW50VHlwZVJlc291cmNlKSk7Ci0JfQkKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYW5ub3RhdGlvbnMgPSBwZXJzaXN0ZW50VHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCXdoaWxlKGFubm90YXRpb25zLmhhc05leHQoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYW5ub3RhdGlvbnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlmb3IgKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSkpIHsKLQkJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlID09IG51bGwpIHsKLQkJCQl0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UsIHBlcnNpc3RlbnRBdHRyaWJ1dGUpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYW5ub3RhdGlvbnMgPSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQl3aGlsZShhbm5vdGF0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuYWRkKGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFubm90YXRpb25zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaSA9IGFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgYXNzb2NpYXRpb25OYW1lID0gaS5uZXh0KCk7Ci0JCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gZ2V0QXNzb2NpYXRpb25PdmVycmlkZU5hbWVkKGFzc29jaWF0aW9uTmFtZSk7Ci0JCQlpZiAoYXNzb2NpYXRpb25PdmVycmlkZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuYWRkKGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZShuZXcgTnVsbEFzc29jaWF0aW9uT3ZlcnJpZGUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSwgYXNzb2NpYXRpb25OYW1lKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU5hbWVkUXVlcmllcyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBhbm5vdGF0aW9ucyA9IHJlc291cmNlUGVyc2lzdGVudFR5cGUuYW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQl3aGlsZShhbm5vdGF0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmFtZWRRdWVyaWVzLmFkZChidWlsZE5hbWVkUXVlcnkoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBhbm5vdGF0aW9ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTmFtZWROYXRpdmVRdWVyaWVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGFubm90YXRpb25zID0gcmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCXdoaWxlKGFubm90YXRpb25zLmhhc05leHQoKSkgewotCQkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuYWRkKGJ1aWxkTmFtZWROYXRpdmVRdWVyeSgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGFubm90YXRpb25zLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JLy9xdWVyeSBmb3IgdGhlIGluaGVyaXRhbmNlIHJlc291cmNlIGV2ZXJ5IHRpbWUgb24gc2V0dGVycy4KLQkvL2NhbGwgb25lIHNldHRlciBhbmQgdGhlIGluaGVyaXRhbmNlUmVzb3VyY2UgY291bGQgY2hhbmdlLiAKLQkvL1lvdSBjb3VsZCBjYWxsIG1vcmUgdGhhbiBvbmUgc2V0dGVyIGJlZm9yZSB0aGlzIG9iamVjdCBoYXMgcmVjZWl2ZWQgYW55IG5vdGlmaWNhdGlvbgotCS8vZnJvbSB0aGUgamF2YSByZXNvdXJjZSBtb2RlbAotCXByb3RlY3RlZCBJbmhlcml0YW5jZUFubm90YXRpb24gZ2V0SW5oZXJpdGFuY2VSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChJbmhlcml0YW5jZUFubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0Tm9uTnVsbEFubm90YXRpb24oSW5oZXJpdGFuY2VBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCQotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGdldERpc2NyaW1pbmF0b3JWYWx1ZVJlc291cmNlKCkgewotCQlyZXR1cm4gKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0Tm9uTnVsbEFubm90YXRpb24oRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJZENsYXNzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSkgewotCQlJZENsYXNzQW5ub3RhdGlvbiBpZENsYXNzUmVzb3VyY2UgPSAoSWRDbGFzc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWlmIChpZENsYXNzUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdGhpcy5pZENsYXNzID0gaWRDbGFzc1Jlc291cmNlLmdldFZhbHVlKCk7Ci0JCX0KLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKioqKiogSVR5cGVNYXBwaW5nIGltcGxlbWVuYXRpb24gKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYXBwZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0VGFibGUoKS5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXRQcmltYXJ5RGJUYWJsZSgpIHsKLQkJcmV0dXJuIGdldFRhYmxlKCkuZ2V0RGJUYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8VGFibGU+IHN0cmVhbSA9IHRoaXMuYXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGRiVGFibGUgPSBzdHJlYW0ubmV4dCgpLmdldERiVGFibGUoKTsKLQkJCWlmIChkYlRhYmxlICE9IG51bGwgJiYgZGJUYWJsZS5tYXRjaGVzU2hvcnRKYXZhQ2xhc3NOYW1lKHRhYmxlTmFtZSkpIHsKLQkJCQlyZXR1cm4gZGJUYWJsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2NoZW1hIGdldERiU2NoZW1hKCkgewotCQlyZXR1cm4gZ2V0VGFibGUoKS5nZXREYlNjaGVtYSgpOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqKioqKiogSUphdmFUeXBlTWFwcGluZyBpbXBsZW1lbmF0aW9uICoqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigKLQkJCUpQQS5UQUJMRSwKLQkJCUpQQS5TRUNPTkRBUllfVEFCTEUsCi0JCQlKUEEuU0VDT05EQVJZX1RBQkxFUywKLQkJCUpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwKLQkJCUpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMsCi0JCQlKUEEuSURfQ0xBU1MsCi0JCQlKUEEuSU5IRVJJVEFOQ0UsCi0JCQlKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRSwKLQkJCUpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTiwKLQkJCUpQQS5TRVFVRU5DRV9HRU5FUkFUT1IsCi0JCQlKUEEuVEFCTEVfR0VORVJBVE9SLAotCQkJSlBBLk5BTUVEX1FVRVJZLAotCQkJSlBBLk5BTUVEX1FVRVJJRVMsCi0JCQlKUEEuTkFNRURfTkFUSVZFX1FVRVJZLAotCQkJSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTLAotCQkJSlBBLlNRTF9SRVNVTFRfU0VUX01BUFBJTkcsCi0JCQlKUEEuRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUywKLQkJCUpQQS5FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTLAotCQkJSlBBLkVOVElUWV9MSVNURU5FUlMsCi0JCQlKUEEuUFJFX1BFUlNJU1QsCi0JCQlKUEEuUE9TVF9QRVJTSVNULAotCQkJSlBBLlBSRV9SRU1PVkUsCi0JCQlKUEEuUE9TVF9SRU1PVkUsCi0JCQlKUEEuUFJFX1VQREFURSwKLQkJCUpQQS5QT1NUX1VQREFURSwKLQkJCUpQQS5QT1NUX0xPQUQsCi0JCQlKUEEuQVRUUklCVVRFX09WRVJSSURFLAotCQkJSlBBLkFUVFJJQlVURV9PVkVSUklERVMsCi0JCQlKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsCi0JCQlKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQl9Ci0KLQkvLyoqKioqKioqKioqKioqKioqKiBJRW50aXR5IGltcGxlbWVuYXRpb24gKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdE5hbWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWROYW1lKFN0cmluZyBuZXdTcGVjaWZpZWROYW1lKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWROYW1lID0gdGhpcy5zcGVjaWZpZWROYW1lOwotCQl0aGlzLnNwZWNpZmllZE5hbWUgPSBuZXdTcGVjaWZpZWROYW1lOwotCQl0aGlzLmVudGl0eVJlc291cmNlLnNldE5hbWUobmV3U3BlY2lmaWVkTmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRW50aXR5LlNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWROYW1lLCBuZXdTcGVjaWZpZWROYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTmFtZV8oU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5ld1NwZWNpZmllZE5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRW50aXR5LlNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWROYW1lLCBuZXdTcGVjaWZpZWROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkLypwcml2YXRlLXByb3RlY3RlZCovIHZvaWQgc2V0RGVmYXVsdE5hbWUoU3RyaW5nIG5ld0RlZmF1bHROYW1lKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0TmFtZSA9IHRoaXMuZGVmYXVsdE5hbWU7Ci0JCXRoaXMuZGVmYXVsdE5hbWUgPSBuZXdEZWZhdWx0TmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFbnRpdHkuREVGQVVMVF9OQU1FX1BST1BFUlRZLCBvbGREZWZhdWx0TmFtZSwgbmV3RGVmYXVsdE5hbWUpOwotCX0KLQotCXB1YmxpYyBKYXZhVGFibGUgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVNlY29uZGFyeVRhYmxlPiBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YVNlY29uZGFyeVRhYmxlPih0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIEphdmFTZWNvbmRhcnlUYWJsZSBhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgaW5kZXgpIHsKLQkJSmF2YVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVNlY29uZGFyeVRhYmxlKHRoaXMpOwotCQl0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5hZGQoaW5kZXgsIHNlY29uZGFyeVRhYmxlKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oaW5kZXgsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJc2Vjb25kYXJ5VGFibGUuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShzZWNvbmRhcnlUYWJsZVJlc291cmNlKTsKLQkJZmlyZUl0ZW1BZGRlZChFbnRpdHkuU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCwgaW5kZXgsIHNlY29uZGFyeVRhYmxlKTsKLQkJcmV0dXJuIHNlY29uZGFyeVRhYmxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgaW5kZXgsIEphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBzZWNvbmRhcnlUYWJsZSwgdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMsIEVudGl0eS5TUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSh0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5pbmRleE9mKHNlY29uZGFyeVRhYmxlKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGludCBpbmRleCkgewotCQlKYXZhU2Vjb25kYXJ5VGFibGUgcmVtb3ZlZFNlY29uZGFyeVRhYmxlID0gdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCwgaW5kZXgsIHJlbW92ZWRTZWNvbmRhcnlUYWJsZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlXyhKYXZhU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KHNlY29uZGFyeVRhYmxlLCB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcywgRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZmlyZUl0ZW1Nb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzKCkgewotCQlyZXR1cm4gc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7Ci0JfQotCi0JcHVibGljIGludCBzZWNvbmRhcnlUYWJsZXNTaXplKCkgewotCQlyZXR1cm4gc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSA6IHRoaXMuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpOwotCX0KLQkKLQlwdWJsaWMgSW5oZXJpdGFuY2VUeXBlIGdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlIG5ld0luaGVyaXRhbmNlVHlwZSkgewotCQlJbmhlcml0YW5jZVR5cGUgb2xkSW5oZXJpdGFuY2VUeXBlID0gdGhpcy5kZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneTsKLQkJdGhpcy5kZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSA9IG5ld0luaGVyaXRhbmNlVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZLCBvbGRJbmhlcml0YW5jZVR5cGUsIG5ld0luaGVyaXRhbmNlVHlwZSk7Ci0JfQotCQotCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgbmV3SW5oZXJpdGFuY2VUeXBlKSB7Ci0JCUluaGVyaXRhbmNlVHlwZSBvbGRJbmhlcml0YW5jZVR5cGUgPSB0aGlzLnNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3k7Ci0JCXRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSA9IG5ld0luaGVyaXRhbmNlVHlwZTsKLQkJZ2V0SW5oZXJpdGFuY2VSZXNvdXJjZSgpLnNldFN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKG5ld0luaGVyaXRhbmNlVHlwZSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9JTkhFUklUQU5DRV9TVFJBVEVHWV9QUk9QRVJUWSwgb2xkSW5oZXJpdGFuY2VUeXBlLCBuZXdJbmhlcml0YW5jZVR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBpbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4KLQkgKiBUaGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggSW52YWxpZFRocmVhZEFjY2VzcyBleGNlcHRpb25zIGluIHRoZSBVSQotCSAqIHdoZW4geW91IHNldCBhIHZhbHVlIGZyb20gdGhlIFVJIGFuZCB0aGUgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHlldC4KLQkgKiBBZGRpbmcgdGhlIGFubm90YXRpb24gY2F1c2VzIGFuIHVwZGF0ZSB0byBvY2N1ciBhbmQgdGhlbiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3lfKEluaGVyaXRhbmNlVHlwZSBuZXdJbmhlcml0YW5jZVR5cGUpIHsKLQkJSW5oZXJpdGFuY2VUeXBlIG9sZEluaGVyaXRhbmNlVHlwZSA9IHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneTsKLQkJdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gbmV3SW5oZXJpdGFuY2VUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9JTkhFUklUQU5DRV9TVFJBVEVHWV9QUk9QRVJUWSwgb2xkSW5oZXJpdGFuY2VUeXBlLCBuZXdJbmhlcml0YW5jZVR5cGUpOwotCX0KLQotCXB1YmxpYyBKYXZhRGlzY3JpbWluYXRvckNvbHVtbiBnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKFN0cmluZyBuZXdEZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlID0gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOwotCQl0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUgPSBuZXdEZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSwgb2xkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSwgbmV3RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoU3RyaW5nIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWU7Ci0JCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlID0gbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlOwotCQlnZXREaXNjcmltaW5hdG9yVmFsdWVSZXNvdXJjZSgpLnNldFZhbHVlKG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSwgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4KLQkgKiBUaGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggSW52YWxpZFRocmVhZEFjY2VzcyBleGNlcHRpb25zIGluIHRoZSBVSQotCSAqIHdoZW4geW91IHNldCBhIHZhbHVlIGZyb20gdGhlIFVJIGFuZCB0aGUgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHlldC4KLQkgKiBBZGRpbmcgdGhlIGFubm90YXRpb24gY2F1c2VzIGFuIHVwZGF0ZSB0byBvY2N1ciBhbmQgdGhlbiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZV8oU3RyaW5nIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWU7Ci0JCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlID0gbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9ESVNDUklNSU5BVE9SX1ZBTFVFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUsIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaXNjcmltaW5hdG9yVmFsdWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSA9PSBudWxsKSA/IGdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkKCkgewotCQlyZXR1cm4gdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkKGJvb2xlYW4gbmV3RGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCkgewotCQlib29sZWFuIG9sZERpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWQgPSB0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWQ7Ci0JCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCA9IG5ld0Rpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRW50aXR5LkRJU0NSSU1JTkFUT1JfVkFMVUVfQUxMT1dFRF9QUk9QRVJUWSwgb2xkRGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCwgbmV3RGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGFibGVHZW5lcmF0b3IgYWRkVGFibGVHZW5lcmF0b3IoKSB7Ci0JCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRhYmxlR2VuZXJhdG9yIGFscmVhZHkgZXhpc3RzIik7Ci0JCX0KLQkJdGhpcy50YWJsZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFUYWJsZUdlbmVyYXRvcih0aGlzKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3IuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZSh0YWJsZUdlbmVyYXRvclJlc291cmNlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFksIG51bGwsIHRoaXMudGFibGVHZW5lcmF0b3IpOwotCQlyZXR1cm4gdGhpcy50YWJsZUdlbmVyYXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFibGVHZW5lcmF0b3IoKSB7Ci0JCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRhYmxlR2VuZXJhdG9yIGRvZXMgbm90IGV4aXN0LCBjYW5ub3QgYmUgcmVtb3ZlZCIpOwotCQl9Ci0JCUphdmFUYWJsZUdlbmVyYXRvciBvbGRUYWJsZUdlbmVyYXRvciA9IHRoaXMudGFibGVHZW5lcmF0b3I7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3IgPSBudWxsOwotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRUYWJsZUdlbmVyYXRvciwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlR2VuZXJhdG9yOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZUdlbmVyYXRvcihKYXZhVGFibGVHZW5lcmF0b3IgbmV3VGFibGVHZW5lcmF0b3IpIHsKLQkJSmF2YVRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGhpcy50YWJsZUdlbmVyYXRvcjsKLQkJdGhpcy50YWJsZUdlbmVyYXRvciA9IG5ld1RhYmxlR2VuZXJhdG9yOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkVGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGFkZFNlcXVlbmNlR2VuZXJhdG9yKCkgewotCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZXF1ZW5jZUdlbmVyYXRvciBhbHJlYWR5IGV4aXN0cyIpOwotCQl9Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhU2VxdWVuY2VHZW5lcmF0b3IodGhpcyk7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hZGRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yLmluaXRpYWxpemVGcm9tUmVzb3VyY2Uoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VRVUVOQ0VfR0VORVJBVE9SX1BST1BFUlRZLCBudWxsLCB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJcmV0dXJuIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3I7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCkgewotCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZXF1ZW5jZUdlbmVyYXRvciBkb2VzIG5vdCBleGlzdCwgY2Fubm90IGJlIHJlbW92ZWQiKTsKLQkJfQotCQlKYXZhU2VxdWVuY2VHZW5lcmF0b3Igb2xkU2VxdWVuY2VHZW5lcmF0b3IgPSB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yID0gbnVsbDsKLQkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkU2VxdWVuY2VHZW5lcmF0b3IsbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNlcXVlbmNlR2VuZXJhdG9yKEphdmFTZXF1ZW5jZUdlbmVyYXRvciBuZXdTZXF1ZW5jZUdlbmVyYXRvcikgewotCQlKYXZhU2VxdWVuY2VHZW5lcmF0b3Igb2xkU2VxdWVuY2VHZW5lcmF0b3IgPSB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yID0gbmV3U2VxdWVuY2VHZW5lcmF0b3I7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VRVUVOQ0VfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRTZXF1ZW5jZUdlbmVyYXRvciwgbmV3U2VxdWVuY2VHZW5lcmF0b3IpOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8SmF2YUdlbmVyYXRvcj4gZ2VuZXJhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxKYXZhR2VuZXJhdG9yPigKLQkJCShnZXRTZXF1ZW5jZUdlbmVyYXRvcigpID09IG51bGwpID8gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpIDogbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcihnZXRTZXF1ZW5jZUdlbmVyYXRvcigpKSwKLQkJCShnZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpID8gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpIDogbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcihnZXRUYWJsZUdlbmVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA/IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgOiB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAhdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCX0JCi0JCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBuZXdQa0pvaW5Db2x1bW4pIHsKLQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIG9sZFBrSm9pbkNvbHVtbiA9IHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOwotCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG5ld1BrSm9pbkNvbHVtbjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFbnRpdHkuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgb2xkUGtKb2luQ29sdW1uLCBuZXdQa0pvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlpZiAodGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQl9Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID09IG51bGwpID8gMCA6IDE7Ci0JfQotCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIG9sZERlZmF1bHRQa0pvaW5Db2x1bW4gPSB0aGlzLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlpZiAob2xkRGVmYXVsdFBrSm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkvL251bGwgdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gbm93IGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkJCS8vaWYgb25lIGRvZXMgbm90IGV4aXN0LCB0aGVyZSBpcyBhbHJlYWR5IGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uLgotCQkJLy9SZW1vdmUgaXQgbm93IHNvIHRoYXQgaXQgZG9lc24ndCBnZXQgcmVtb3ZlZCBkdXJpbmcgYW4gdXBkYXRlIGFuZAotCQkJLy9jYXVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBiZSBzZW50IHRvIHRoZSBVSSBpbiB0aGUgd3Jvbmcgb3JkZXIKLQkJCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID0gbnVsbDsKLQkJfQotCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcywgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpKTsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuYWRkKGluZGV4LCBwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW5SZXNvdXJjZSA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbihpbmRleCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1uLmluaXRpYWxpemVGcm9tUmVzb3VyY2UocGtKb2luQ29sdW1uUmVzb3VyY2UpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoRW50aXR5LlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJaWYgKG9sZERlZmF1bHRQa0pvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVudGl0eS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBvbGREZWZhdWx0UGtKb2luQ29sdW1uLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4LCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4pIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgcHJpbWFyeUtleUpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLCBFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uKSB7Ci0JCXJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLmluZGV4T2YocHJpbWFyeUtleUpvaW5Db2x1bW4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiByZW1vdmVkUHJpbWFyeUtleUpvaW5Db2x1bW4gPSB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOwotCQlpZiAoIWNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpIHsKLQkJCS8vY3JlYXRlIHRoZSBkZWZhdWx0Sm9pbkNvbHVtbiBub3cgb3IgdGhpcyB3aWxsIGhhcHBlbiBkdXJpbmcgcHJvamVjdCB1cGRhdGUgCi0JCQkvL2FmdGVyIHJlbW92aW5nIHRoZSBqb2luIGNvbHVtbiBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4gVGhhdCBjYXVzZXMgcHJvYmxlbXMgCi0JCQkvL2luIHRoZSBVSSBiZWNhdXNlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBlbmQgdXAgaW4gdGhlIHdyb25nIG9yZGVyLgotCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG5ldyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkpOwotCQl9Ci0JCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUucmVtb3ZlQW5ub3RhdGlvbihpbmRleCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcmVtb3ZlZFByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJaWYgKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCS8vZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIGEgZGVmYXVsdEpvaW5Db2x1bW4gd2FzIGNyZWF0ZWQgYWJvdmUKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFbnRpdHkuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgbnVsbCwgdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5fKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QocHJpbWFyeUtleUpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLCBFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpOwotCQltb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLCBFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsJCQotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQkKLQlwdWJsaWMgaW50IGF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSArIHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuc2l6ZSgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoaW50IGluZGV4KSB7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFBdHRyaWJ1dGVPdmVycmlkZSh0aGlzLCBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZU93bmVyKCkpOwotCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoaW5kZXgsIGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oaW5kZXgsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKEVudGl0eS5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGUpOwotCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGU7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgc2V0QXR0cmlidXRlT3ZlcnJpZGVWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCS8vIEFkZCBhIG5ldyBhdHRyaWJ1dGUgb3ZlcnJpZGUKLQkJaWYgKHZpcnR1YWwpIHsKLQkJCXJldHVybiBzZXRBdHRyaWJ1dGVPdmVycmlkZVZpcnR1YWwoYXR0cmlidXRlT3ZlcnJpZGUpOwotCQl9Ci0JCXJldHVybiBzZXRBdHRyaWJ1dGVPdmVycmlkZVNwZWNpZmllZChhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgc2V0QXR0cmlidXRlT3ZlcnJpZGVWaXJ0dWFsKEphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlpbnQgaW5kZXggPSB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5pbmRleE9mKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMucmVtb3ZlKGluZGV4KTsKLQkJU3RyaW5nIGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKTsKLQkJLy9hZGQgdGhlIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlIHNvIHRoYXQgSSBjYW4gY29udHJvbCB0aGUgb3JkZXIgdGhhdCBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlzIHNlbnQuCi0JCS8vb3RoZXJ3aXNlIHdoZW4gd2UgcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGZyb20gamF2YSB3ZSB3aWxsIGdldCBhbiB1cGRhdGUgYW5kIGFkZCB0aGUgYXR0cmlidXRlIG92ZXJyaWRlCi0JCS8vZHVyaW5nIHRoZSB1ZHBhdGUuICBUaGlzIGNhdXNlcyB0aGUgVUkgdG8gYmUgZmxha3ksIHNpbmNlIGNoYW5nZSBub3RpZmljYXRpb24gbWlnaHQgbm90IG9jY3VyIGluIHRoZSBjb3JyZWN0IG9yZGVyCi0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBudWxsOwotCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGVOYW1lICE9IG51bGwpIHsKLQkJCWZvciAoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpKSkgewotCQkJCWlmIChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKS5lcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGVOYW1lKSkgewotCQkJCQkvL3N0b3JlIHRoZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgc28gd2UgY2FuIGZpcmUgY2hhbmdlIG5vdGlmaWNhdGlvbiBsYXRlcgotCQkJCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSh0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLCBwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCQkJdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmFkZCh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oaW5kZXgsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZmlyZUl0ZW1SZW1vdmVkKEVudGl0eS5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGUpOwotCQkKLQkJaWYgKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSAhPSBudWxsKSB7Ci0JCQlmaXJlSXRlbUFkZGVkKEVudGl0eS5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSAtIDEsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCX0KLQkJcmV0dXJuIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVPdmVycmlkZSBzZXRBdHRyaWJ1dGVPdmVycmlkZVNwZWNpZmllZChKYXZhQXR0cmlidXRlT3ZlcnJpZGUgb2xkQXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJaW50IGluZGV4ID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgbmV3QXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXR0cmlidXRlT3ZlcnJpZGUodGhpcywgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVPd25lcigpKTsKLQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKGluZGV4LCBuZXdBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbihpbmRleCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQluZXdBdHRyaWJ1dGVPdmVycmlkZS5pbml0aWFsaXplRnJvbVJlc291cmNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UpOwotCQkKLQkJaW50IGRlZmF1bHRJbmRleCA9IHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5pbmRleE9mKG9sZEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLnJlbW92ZShkZWZhdWx0SW5kZXgpOwotCi0JCW5ld0F0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUob2xkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJbmV3QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShvbGRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoRW50aXR5LlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBkZWZhdWx0SW5kZXgsIG9sZEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKEVudGl0eS5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBpbmRleCwgbmV3QXR0cmlidXRlT3ZlcnJpZGUpOwkJCi0KLQkJcmV0dXJuIG5ld0F0dHJpYnV0ZU92ZXJyaWRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVPdmVycmlkZU93bmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGludCBpbmRleCwgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGF0dHJpYnV0ZU92ZXJyaWRlLCB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcywgRW50aXR5LlNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZV8oSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMsIEVudGl0eS5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZmlyZUl0ZW1Nb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoYXR0cmlidXRlT3ZlcnJpZGUsIHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcywgRW50aXR5LlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKEphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoYXR0cmlidXRlT3ZlcnJpZGUsIHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcywgRW50aXR5LlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChKYXZhQXR0cmlidXRlT3ZlcnJpZGUpIGdldE92ZXJyaWRlTmFtZWQobmFtZSwgYXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXR0cmlidXRlT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgYXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlKSBnZXRPdmVycmlkZU5hbWVkKG5hbWUsIGFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCBhc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNEZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBCYXNlT3ZlcnJpZGUgZ2V0T3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBCYXNlT3ZlcnJpZGU+IG92ZXJyaWRlcykgewotCQlmb3IgKEJhc2VPdmVycmlkZSBvdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvdmVycmlkZXMpKSB7Ci0JCQlTdHJpbmcgb3ZlcnJpZGVOYW1lID0gb3ZlcnJpZGUuZ2V0TmFtZSgpOwotCQkJaWYgKG92ZXJyaWRlTmFtZSA9PSBudWxsICYmIG5hbWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBvdmVycmlkZTsKLQkJCX0KLQkJCWlmIChvdmVycmlkZU5hbWUgIT0gbnVsbCAmJiBvdmVycmlkZU5hbWUuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIG92ZXJyaWRlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb250YWluc092ZXJyaWRlKFN0cmluZyBuYW1lLCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEJhc2VPdmVycmlkZT4gb3ZlcnJpZGVzKSB7Ci0JCXJldHVybiBnZXRPdmVycmlkZU5hbWVkKG5hbWUsIG92ZXJyaWRlcykgIT0gbnVsbDsKLQl9Ci0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4oc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotCX0KLQkKLQlwdWJsaWMgaW50IGFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgKyB0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgIExpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPih0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+KHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBhZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKGludCBpbmRleCkgewotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUodGhpcywgY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZU93bmVyKCkpOwotCQl0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmFkZChpbmRleCwgYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hZGRBbm5vdGF0aW9uKGluZGV4LCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmluaXRpYWxpemVGcm9tUmVzb3VyY2UoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKEVudGl0eS5TUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJcmV0dXJuIGFzc29jaWF0aW9uT3ZlcnJpZGU7Ci0JfQotCQotCXByb3RlY3RlZCBBc3NvY2lhdGlvbk92ZXJyaWRlLk93bmVyIGNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGVPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlT3duZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShpbnQgaW5kZXgsIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgYXNzb2NpYXRpb25PdmVycmlkZSwgdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcywgRW50aXR5LlNQRUNJRklFRF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVfKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGFzc29jaWF0aW9uT3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMsIEVudGl0eS5TUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZmlyZUl0ZW1Nb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCi0JcHJvdGVjdGVkIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIHNldEFzc29jaWF0aW9uT3ZlcnJpZGVWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgewotCQkvLyBBZGQgYSBuZXcgYXR0cmlidXRlIG92ZXJyaWRlCi0JCWlmICh2aXJ0dWFsKSB7Ci0JCQlyZXR1cm4gc2V0QXNzb2NpYXRpb25PdmVycmlkZVZpcnR1YWwoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCX0KLQkJcmV0dXJuIHNldEFzc29jaWF0aW9uT3ZlcnJpZGVTcGVjaWZpZWQoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBzZXRBc3NvY2lhdGlvbk92ZXJyaWRlVmlydHVhbChKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCWludCBpbmRleCA9IHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaW5kZXhPZihhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5yZW1vdmUoaW5kZXgpOwotCQlTdHJpbmcgYXNzb2NpYXRpb25PdmVycmlkZU5hbWUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKTsKLQkJLy9hZGQgdGhlIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlIHNvIHRoYXQgSSBjYW4gY29udHJvbCB0aGUgb3JkZXIgdGhhdCBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlzIHNlbnQuCi0JCS8vb3RoZXJ3aXNlIHdoZW4gd2UgcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGZyb20gamF2YSB3ZSB3aWxsIGdldCBhbiB1cGRhdGUgYW5kIGFkZCB0aGUgYXR0cmlidXRlIG92ZXJyaWRlCi0JCS8vZHVyaW5nIHRoZSB1ZHBhdGUuICBUaGlzIGNhdXNlcyB0aGUgVUkgdG8gYmUgZmxha3ksIHNpbmNlIGNoYW5nZSBub3RpZmljYXRpb24gbWlnaHQgbm90IG9jY3VyIGluIHRoZSBjb3JyZWN0IG9yZGVyCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gbnVsbDsKLQkJaWYgKGFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lICE9IG51bGwpIHsKLQkJCWZvciAoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkpKSB7Ci0JCQkJaWYgKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpLmVxdWFscyhhc3NvY2lhdGlvbk92ZXJyaWRlTmFtZSkpIHsKLQkJCQkJLy9zdG9yZSB0aGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgc28gd2UgY2FuIGZpcmUgY2hhbmdlIG5vdGlmaWNhdGlvbiBsYXRlcgotCQkJCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZShuZXcgTnVsbEFzc29jaWF0aW9uT3ZlcnJpZGUodGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSwgYXNzb2NpYXRpb25PdmVycmlkZU5hbWUpKTsKLQkJCQkJdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuYWRkKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlmaXJlSXRlbVJlbW92ZWQoRW50aXR5LlNQRUNJRklFRF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCwgaW5kZXgsIGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQkKLQkJaWYgKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlICE9IG51bGwpIHsKLQkJCWZpcmVJdGVtQWRkZWQoRW50aXR5LlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSAtIDEsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJfQotCQlyZXR1cm4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBzZXRBc3NvY2lhdGlvbk92ZXJyaWRlU3BlY2lmaWVkKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJaW50IGluZGV4ID0gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCk7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIG5ld0Fzc29jaWF0aW9uT3ZlcnJpZGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZSh0aGlzLCBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlT3duZXIoKSk7Ci0JCXRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuYWRkKGluZGV4LCBuZXdBc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbihpbmRleCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbmV3QXNzb2NpYXRpb25PdmVycmlkZS5pbml0aWFsaXplRnJvbVJlc291cmNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UpOwotCQkKLQkJaW50IHZpcnR1YWxJbmRleCA9IHRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmluZGV4T2Yob2xkQXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCXRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLnJlbW92ZSh2aXJ0dWFsSW5kZXgpOwotCi0JCW5ld0Fzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShvbGRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChFbnRpdHkuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCwgdmlydHVhbEluZGV4LCBvbGRBc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKEVudGl0eS5TUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBuZXdBc3NvY2lhdGlvbk92ZXJyaWRlKTsJCQotCi0JCXJldHVybiBuZXdBc3NvY2lhdGlvbk92ZXJyaWRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZShKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoYXNzb2NpYXRpb25PdmVycmlkZSwgdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMsIEVudGl0eS5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoYXNzb2NpYXRpb25PdmVycmlkZSwgdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMsIEVudGl0eS5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFOYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YU5hbWVkUXVlcnk+KHRoaXMubmFtZWRRdWVyaWVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBuYW1lZFF1ZXJpZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lZFF1ZXJpZXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgSmF2YU5hbWVkUXVlcnkgYWRkTmFtZWRRdWVyeShpbnQgaW5kZXgpIHsKLQkJSmF2YU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFOYW1lZFF1ZXJ5KHRoaXMpOwotCQl0aGlzLm5hbWVkUXVlcmllcy5hZGQoaW5kZXgsIG5hbWVkUXVlcnkpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5QW5ub3RhdGlvbiA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hZGRBbm5vdGF0aW9uKGluZGV4LCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbmFtZWRRdWVyeS5pbml0aWFsaXplRnJvbVJlc291cmNlKG5hbWVkUXVlcnlBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1BZGRlZChRdWVyeUhvbGRlci5OQU1FRF9RVUVSSUVTX0xJU1QsIGluZGV4LCBuYW1lZFF1ZXJ5KTsKLQkJcmV0dXJuIG5hbWVkUXVlcnk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVkUXVlcnkoaW50IGluZGV4LCBKYXZhTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5KSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIG5hbWVkUXVlcnksIHRoaXMubmFtZWRRdWVyaWVzLCBRdWVyeUhvbGRlci5OQU1FRF9RVUVSSUVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVOYW1lZFF1ZXJ5KE5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlyZW1vdmVOYW1lZFF1ZXJ5KHRoaXMubmFtZWRRdWVyaWVzLmluZGV4T2YobmFtZWRRdWVyeSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVOYW1lZFF1ZXJ5KGludCBpbmRleCkgewotCQlKYXZhTmFtZWRRdWVyeSByZW1vdmVkTmFtZWRRdWVyeSA9IHRoaXMubmFtZWRRdWVyaWVzLnJlbW92ZShpbmRleCk7Ci0JCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUucmVtb3ZlQW5ub3RhdGlvbihpbmRleCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChRdWVyeUhvbGRlci5OQU1FRF9RVUVSSUVTX0xJU1QsIGluZGV4LCByZW1vdmVkTmFtZWRRdWVyeSk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOYW1lZFF1ZXJ5XyhKYXZhTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChuYW1lZFF1ZXJ5LCB0aGlzLm5hbWVkUXVlcmllcywgUXVlcnlIb2xkZXIuTkFNRURfUVVFUklFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZU5hbWVkUXVlcnkoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5uYW1lZFF1ZXJpZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZmlyZUl0ZW1Nb3ZlZChRdWVyeUhvbGRlci5OQU1FRF9RVUVSSUVTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFOYW1lZE5hdGl2ZVF1ZXJ5Pih0aGlzLm5hbWVkTmF0aXZlUXVlcmllcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgbmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIEphdmFOYW1lZE5hdGl2ZVF1ZXJ5IGFkZE5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4KSB7Ci0JCUphdmFOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhTmFtZWROYXRpdmVRdWVyeSh0aGlzKTsKLQkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuYWRkKGluZGV4LCBuYW1lZE5hdGl2ZVF1ZXJ5KTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbihpbmRleCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW5hbWVkTmF0aXZlUXVlcnkuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShuYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbik7CQkKLQkJZmlyZUl0ZW1BZGRlZChRdWVyeUhvbGRlci5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNULCBpbmRleCwgbmFtZWROYXRpdmVRdWVyeSk7Ci0JCXJldHVybiBuYW1lZE5hdGl2ZVF1ZXJ5OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCwgSmF2YU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBuYW1lZE5hdGl2ZVF1ZXJ5LCB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgUXVlcnlIb2xkZXIuTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5KSB7Ci0JCXRoaXMucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSh0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5pbmRleE9mKG5hbWVkTmF0aXZlUXVlcnkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpIHsKLQkJSmF2YU5hbWVkTmF0aXZlUXVlcnkgcmVtb3ZlZE5hbWVkTmF0aXZlUXVlcnkgPSB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oaW5kZXgsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlmaXJlSXRlbVJlbW92ZWQoUXVlcnlIb2xkZXIuTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCwgaW5kZXgsIHJlbW92ZWROYW1lZE5hdGl2ZVF1ZXJ5KTsKLQl9CQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5hbWVkTmF0aXZlUXVlcnlfKEphdmFOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KG5hbWVkTmF0aXZlUXVlcnksIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLCBRdWVyeUhvbGRlci5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZU5hbWVkTmF0aXZlUXVlcnkoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZmlyZUl0ZW1Nb3ZlZChRdWVyeUhvbGRlci5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYXRvcjxKYXZhUXVlcnk+IHF1ZXJpZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8SmF2YVF1ZXJ5Pih0aGlzLm5hbWVkTmF0aXZlUXVlcmllcygpLCB0aGlzLm5hbWVkUXVlcmllcygpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmlkQ2xhc3M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldElkQ2xhc3MoU3RyaW5nIG5ld0lkQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZElkQ2xhc3MgPSB0aGlzLmlkQ2xhc3M7Ci0JCXRoaXMuaWRDbGFzcyA9IG5ld0lkQ2xhc3M7Ci0JCWlmIChuZXdJZENsYXNzICE9IG9sZElkQ2xhc3MpIHsKLQkJCWlmIChuZXdJZENsYXNzICE9IG51bGwpIHsKLQkJCQlpZiAoZ2V0SWRDbGFzc1Jlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCQlhZGRJZENsYXNzUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQkJZ2V0SWRDbGFzc1Jlc291cmNlKCkuc2V0VmFsdWUobmV3SWRDbGFzcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVJZENsYXNzUmVzb3VyY2UoKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElkQ2xhc3MuSURfQ0xBU1NfUFJPUEVSVFksIG9sZElkQ2xhc3MsIG5ld0lkQ2xhc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRJZENsYXNzXyhTdHJpbmcgbmV3SWRDbGFzcykgewotCQlTdHJpbmcgb2xkSWRDbGFzcyA9IHRoaXMuaWRDbGFzczsKLQkJdGhpcy5pZENsYXNzID0gbmV3SWRDbGFzczsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChJZENsYXNzLklEX0NMQVNTX1BST1BFUlRZLCBvbGRJZENsYXNzLCBuZXdJZENsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSWRDbGFzc0Fubm90YXRpb24gZ2V0SWRDbGFzc1Jlc291cmNlKCkgewotCQlyZXR1cm4gKElkQ2xhc3NBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRDbGFzc1Jlc291cmNlKCkgewotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSWRDbGFzc1Jlc291cmNlKCkgewotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5IGdldFBhcmVudEVudGl0eSgpIHsKLQkJZm9yIChJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4gaSA9IGdldFBlcnNpc3RlbnRUeXBlKCkuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IGkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCWlmICh0eXBlTWFwcGluZyAhPSB0aGlzICYmIHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJcmV0dXJuIChFbnRpdHkpIHR5cGVNYXBwaW5nOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBFbnRpdHkgZ2V0Um9vdEVudGl0eSgpIHsKLQkJRW50aXR5IHJvb3RFbnRpdHkgPSB0aGlzOwotCQlmb3IgKEl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlPiBpID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5pbmhlcml0YW5jZUhpZXJhcmNoeSgpOyBpLmhhc05leHQoKTspIHsKLQkJCVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gaS5uZXh0KCk7Ci0JCQlpZiAocGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJcm9vdEVudGl0eSA9IChFbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9vdEVudGl0eTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCkpOwotCX0KLQkKLQkvL2NvcGllZCBpbiBHZW5lcmljT3JtRW50aXR5IHRvIGF2b2lkIGFuIEFQSSBjaGFuZ2UgZm9yIGZpeGluZyBidWcgMjI5NDIzIGluIFJDMQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcykgewotCQlTdHJpbmcgcGtDb2x1bW5OYW1lID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBhdHRyaWJ1dGVzOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGUuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKLQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkvL2lmIHRoZSBhdHRyaWJ1dGUgaXMgYSBwcmltYXJ5IGtleSB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgYW4gYXR0cmlidXRlIG92ZXJyaWRlCi0JCQkJLy9hbmQgdXNlIGl0cyBjb2x1bW4gbmFtZSBpbnN0ZWFkIChidWcgMjI5NDIzKQotCQkJCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGUgIT0gbnVsbCkgewotCQkJCQluYW1lID0gYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChwa0NvbHVtbk5hbWUgPT0gbnVsbCkgewotCQkJCXBrQ29sdW1uTmFtZSA9IG5hbWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkvLyBpZiB3ZSBlbmNvdW50ZXIgYSBjb21wb3NpdGUgcHJpbWFyeSBrZXksIHJldHVybiBudWxsCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgd2UgZW5jb3VudGVyIG9ubHkgYSBzaW5nbGUgcHJpbWFyeSBrZXkgY29sdW1uIG5hbWUsIHJldHVybiBpdAotCQlyZXR1cm4gcGtDb2x1bW5OYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiAhQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSwgdGFibGVOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8VGFibGU+KHRoaXMuZ2V0VGFibGUoKSwgdGhpcy5zZWNvbmRhcnlUYWJsZXMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFRhYmxlPiBhc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFRhYmxlPihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUeXBlTWFwcGluZywgSXRlcmF0b3I8VGFibGU+Pih0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFRhYmxlPiB0cmFuc2Zvcm0oVHlwZU1hcHBpbmcgbWFwcGluZykgewotCQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8VGFibGUsIFRhYmxlPihtYXBwaW5nLmFzc29jaWF0ZWRUYWJsZXMoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFRhYmxlIG8pIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJLy9UT0RPCi0JCQkJCQkvL2ZpbHRlcmluZyB0aGVzZSBvdXQgc28gYXMgdG8gYXZvaWQgdGhlIGR1cGxpY2F0ZSB0YWJsZSwgcm9vdCBhbmQgY2hpbGRyZW4gc2hhcmUgdGhlIHNhbWUgdGFibGUKLQkJCQkJCS8vcmV0dXJuICEobyBpbnN0YW5jZW9mIFNpbmdsZVRhYmxlSW5oZXJpdGFuY2VDaGlsZFRhYmxlSW1wbCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpIHsKLQkJcmV0dXJuIHRoaXMubm9uTnVsbFRhYmxlTmFtZXModGhpcy5hc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IG5vbk51bGxUYWJsZU5hbWVzKEl0ZXJhdG9yPFRhYmxlPiB0YWJsZXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odGhpcy50YWJsZU5hbWVzKHRhYmxlcykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBvKSB7Ci0JCQkJcmV0dXJuIG8gIT0gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB0YWJsZU5hbWVzKEl0ZXJhdG9yPFRhYmxlPiB0YWJsZXMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFRhYmxlLCBTdHJpbmc+KHRhYmxlcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShUYWJsZSB0KSB7Ci0JCQkJcmV0dXJuIHQuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvZiBFbnRpdGllcywgZWFjaCB3aGljaCBpbmhlcml0cyBmcm9tIHRoZSBvbmUgYmVmb3JlLAotCSAqIGFuZCB0ZXJtaW5hdGVzIGF0IHRoZSByb290IGVudGl0eSAob3IgYXQgdGhlIHBvaW50IG9mIGN5Y2xpY2l0eSkuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFR5cGVNYXBwaW5nPiBpbmhlcml0YW5jZUhpZXJhcmNoeSgpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlLCBUeXBlTWFwcGluZz4oZ2V0UGVyc2lzdGVudFR5cGUoKS5pbmhlcml0YW5jZUhpZXJhcmNoeSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUeXBlTWFwcGluZyB0cmFuc2Zvcm0oUGVyc2lzdGVudFR5cGUgdHlwZSkgewotCQkJCXJldHVybiB0eXBlLmdldE1hcHBpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4obmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VHlwZU1hcHBpbmcsIEl0ZXJhdG9yPFN0cmluZz4+KHRoaXMuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB0cmFuc2Zvcm0oVHlwZU1hcHBpbmcgbWFwcGluZykgewotCQkJCXJldHVybiBtYXBwaW5nLm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+KG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFR5cGVNYXBwaW5nLCBJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPj4odGhpcy5pbmhlcml0YW5jZUhpZXJhcmNoeSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiB0cmFuc2Zvcm0oVHlwZU1hcHBpbmcgbWFwcGluZykgewotCQkJCXJldHVybiBtYXBwaW5nLm92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4obmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VHlwZU1hcHBpbmcsIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+Pih0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IHRyYW5zZm9ybShUeXBlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQkJcmV0dXJuIG1hcHBpbmcub3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFR5cGVNYXBwaW5nLCBJdGVyYXRvcjxTdHJpbmc+Pih0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdHJhbnNmb3JtKFR5cGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCQlyZXR1cm4gbWFwcGluZy5vdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCXN1cGVyLnVwZGF0ZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy5lbnRpdHlSZXNvdXJjZSA9IChFbnRpdHlBbm5vdGF0aW9uKSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCXRoaXMuc2V0U3BlY2lmaWVkTmFtZV8odGhpcy5zcGVjaWZpZWROYW1lKHRoaXMuZW50aXR5UmVzb3VyY2UpKTsKLQkJdGhpcy5zZXREZWZhdWx0TmFtZSh0aGlzLmRlZmF1bHROYW1lKHJlc291cmNlUGVyc2lzdGVudFR5cGUpKTsKLQkJCi0JCXRoaXMudXBkYXRlSW5oZXJpdGFuY2UoZ2V0SW5oZXJpdGFuY2VSZXNvdXJjZSgpKTsKLQkJdGhpcy51cGRhdGVEaXNjcmltaW5hdG9yQ29sdW1uKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnVwZGF0ZURpc2NyaW1pbmF0b3JWYWx1ZShnZXREaXNjcmltaW5hdG9yVmFsdWVSZXNvdXJjZSgpKTsKLQkJdGhpcy5zZXREaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkKGRpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZChyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSk7Ci0JCXRoaXMudXBkYXRlVGFibGUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMudXBkYXRlU2Vjb25kYXJ5VGFibGVzKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnVwZGF0ZVRhYmxlR2VuZXJhdG9yKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnVwZGF0ZVNlcXVlbmNlR2VuZXJhdG9yKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyhyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy51cGRhdGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4ocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMudXBkYXRlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnVwZGF0ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMudXBkYXRlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMudXBkYXRlVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnVwZGF0ZU5hbWVkUXVlcmllcyhyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy51cGRhdGVOYW1lZE5hdGl2ZVF1ZXJpZXMocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMudXBkYXRlSWRDbGFzcyhyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy51cGRhdGVQZXJzaXN0ZW5jZVVuaXRHZW5lcmF0b3JzQW5kUXVlcmllcygpOwotCX0KLQkJCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lKEVudGl0eUFubm90YXRpb24gZW50aXR5UmVzb3VyY2UpIHsKLQkJcmV0dXJuIGVudGl0eVJlc291cmNlLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50VHlwZVJlc291cmNlLmdldE5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYWJsZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlKSB7Ci0JCWdldFRhYmxlKCkudXBkYXRlKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJbmhlcml0YW5jZShJbmhlcml0YW5jZUFubm90YXRpb24gaW5oZXJpdGFuY2VSZXNvdXJjZSkgewotCQl0aGlzLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3lfKHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShpbmhlcml0YW5jZVJlc291cmNlKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3kodGhpcy5kZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZSBzcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlQW5ub3RhdGlvbiBpbmhlcml0YW5jZVJlc291cmNlKSB7Ci0JCXJldHVybiBJbmhlcml0YW5jZVR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKGluaGVyaXRhbmNlUmVzb3VyY2UuZ2V0U3RyYXRlZ3koKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgZGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSB7Ci0JCWlmIChnZXRSb290RW50aXR5KCkgPT0gdGhpcykgewotCQkJcmV0dXJuIEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEU7Ci0JCX0KLQkJcmV0dXJuIGdldFJvb3RFbnRpdHkoKS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURpc2NyaW1pbmF0b3JDb2x1bW4oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkudXBkYXRlKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEaXNjcmltaW5hdG9yVmFsdWUoRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yVmFsdWVSZXNvdXJjZSkgewotCQl0aGlzLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZV8oZGlzY3JpbWluYXRvclZhbHVlUmVzb3VyY2UuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSh0aGlzLmphdmFEZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBGcm9tIHRoZSBTcGVjOgotCSAqIElmIHRoZSBEaXNjcmltaW5hdG9yVmFsdWUgYW5ub3RhdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhCi0JICogcHJvdmlkZXItc3BlY2lmaWMgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSB2YWx1ZSByZXByZXNlbnRpbmcKLQkgKiB0aGUgZW50aXR5IHR5cGUgaXMgdXNlZCBmb3IgdGhlIHZhbHVlIG9mIHRoZSBkaXNjcmltaW5hdG9yCi0JICogY29sdW1uLiBJZiB0aGUgRGlzY3JpbWluYXRvclR5cGUgaXMgU1RSSU5HLCB0aGUgZGlzY3JpbWluYXRvcgotCSAqIHZhbHVlIGRlZmF1bHQgaXMgdGhlIGVudGl0eSBuYW1lLgotCSAqIAotCSAqIFRPRE8gZXh0ZW5zaW9uIHBvaW50IGZvciBwcm92aWRlci1zcGVjaWZpYyBmdW5jdGlvbj8KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGphdmFEZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkgewotCQlpZiAodGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5pc0Fic3RyYWN0KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0aGlzLmdldERpc2NyaW1pbmF0b3JUeXBlKCkgIT0gRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXROYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGdldERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpIHsKLQkJcmV0dXJuICFwZXJzaXN0ZW50VHlwZVJlc291cmNlLmlzQWJzdHJhY3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2Vjb25kYXJ5VGFibGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiByZXNvdXJjZVNlY29uZGFyeVRhYmxlcyA9IHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJd2hpbGUgKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VTZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKSB7Ci0JCQkJc2Vjb25kYXJ5VGFibGUudXBkYXRlKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlU2Vjb25kYXJ5VGFibGVzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZV8oc2Vjb25kYXJ5VGFibGUpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VTZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCksIGJ1aWxkU2Vjb25kYXJ5VGFibGUoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VTZWNvbmRhcnlUYWJsZXMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVNlY29uZGFyeVRhYmxlIGJ1aWxkU2Vjb25kYXJ5VGFibGUoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UpIHsKLQkJSmF2YVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVNlY29uZGFyeVRhYmxlKHRoaXMpOwotCQlzZWNvbmRhcnlUYWJsZS5pbml0aWFsaXplRnJvbVJlc291cmNlKHNlY29uZGFyeVRhYmxlUmVzb3VyY2UpOwotCQlyZXR1cm4gc2Vjb25kYXJ5VGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGFibGVHZW5lcmF0b3IoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IHRhYmxlR2VuZXJhdG9yKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpOwotCQlpZiAodGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQkJc2V0VGFibGVHZW5lcmF0b3IobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQkJc2V0VGFibGVHZW5lcmF0b3IoYnVpbGRUYWJsZUdlbmVyYXRvcih0YWJsZUdlbmVyYXRvclJlc291cmNlKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlnZXRUYWJsZUdlbmVyYXRvcigpLnVwZGF0ZSh0YWJsZUdlbmVyYXRvclJlc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YVRhYmxlR2VuZXJhdG9yIGJ1aWxkVGFibGVHZW5lcmF0b3IoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJSmF2YVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVRhYmxlR2VuZXJhdG9yKHRoaXMpOwotCQl0YWJsZUdlbmVyYXRvci5pbml0aWFsaXplRnJvbVJlc291cmNlKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQlyZXR1cm4gdGFibGVHZW5lcmF0b3I7Ci0JfQotCQotCXByb3RlY3RlZCBUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlyZXR1cm4gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcGVyc2lzdGVudFR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlcXVlbmNlR2VuZXJhdG9yKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBzZXF1ZW5jZUdlbmVyYXRvcihwZXJzaXN0ZW50VHlwZVJlc291cmNlKTsKLQkJaWYgKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJaWYgKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJCXNldFNlcXVlbmNlR2VuZXJhdG9yKG51bGwpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgPT0gbnVsbCkgewotCQkJCXNldFNlcXVlbmNlR2VuZXJhdG9yKGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3Ioc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS51cGRhdGUoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFTZXF1ZW5jZUdlbmVyYXRvciBidWlsZFNlcXVlbmNlR2VuZXJhdG9yKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKSB7Ci0JCUphdmFTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFTZXF1ZW5jZUdlbmVyYXRvcih0aGlzKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3IuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKTsKLQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQkKLQlwcm90ZWN0ZWQgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpIHsKLQkJcmV0dXJuIChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gcGVyc2lzdGVudFR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCXdoaWxlIChwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJCXByaW1hcnlLZXlKb2luQ29sdW1uLnVwZGF0ZSgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5fKHByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpLCBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZSkgewotCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcywgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW4uaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlKTsKLQkJcmV0dXJuIHByaW1hcnlLZXlKb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlKSB7Ci0JCWlmICghc2hvdWxkQnVpbGREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSkgewotCQkJc2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG5ldyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uLnVwZGF0ZShuZXcgTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpKTsKLQkJfQotCX0KLQkJCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiByZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJd2hpbGUgKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKSB7Ci0JCQkJYXR0cmlidXRlT3ZlcnJpZGUudXBkYXRlKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZV8oYXR0cmlidXRlT3ZlcnJpZGUpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCksIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKSk7Ci0JCX0JCi0JfQotCQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSkgewotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXR0cmlidXRlT3ZlcnJpZGUodGhpcywgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVPd25lcigpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKTsKLQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUsIFBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXJldHVybiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlKGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSwgYXR0cmlidXRlKSk7Ci0JfQotCQotCXByb3RlY3RlZCBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlLCBQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlDb2x1bW5NYXBwaW5nIGNvbHVtbk1hcHBpbmcgPSAoQ29sdW1uTWFwcGluZykgYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSwgYXR0cmlidXRlLmdldE5hbWUoKSwgY29sdW1uTWFwcGluZy5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCWZvciAoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpKSkgewotCQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGUgPT0gbnVsbCkgewotCQkJCWFkZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlLCBwZXJzaXN0ZW50QXR0cmlidXRlKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSkgewotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlLnVwZGF0ZShidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKHJlc291cmNlUGVyc2lzdGVudFR5cGUsIHBlcnNpc3RlbnRBdHRyaWJ1dGUpKTsKLQkJCX0KLQkJfQotCQkKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpKTsKLQkKLQkJLy9yZW1vdmUgYW55IGRlZmF1bHQgbWFwcGluZ3MgdGhhdCBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBhdHRyaWJ1dGVOYW1lcyBjb2xsZWN0aW9uCi0JCWZvciAoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSkpIHsKLQkJCWlmICghYXR0cmlidXRlTmFtZXMuY29udGFpbnMoYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKQotCQkJCXx8IGNvbnRhaW5zU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKSkgewotCQkJCXJlbW92ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gcmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlUGVyc2lzdGVudFR5cGUuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCXdoaWxlIChhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnVwZGF0ZSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVfKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCksIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKSk7Ci0JCX0JCi0JfQotCQotCXByb3RlY3RlZCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlKSB7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZSh0aGlzLCBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlT3duZXIoKSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UpOwotCQlyZXR1cm4gYXNzb2NpYXRpb25PdmVycmlkZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGkgPSBhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIGFzc29jaWF0aW9uTmFtZSA9IGkubmV4dCgpOwotCQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IGdldEFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lZChhc3NvY2lhdGlvbk5hbWUpOwotCQkJaWYgKGFzc29jaWF0aW9uT3ZlcnJpZGUgPT0gbnVsbCkgewotCQkJCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGUobmV3IE51bGxBc3NvY2lhdGlvbk92ZXJyaWRlKHJlc291cmNlUGVyc2lzdGVudFR5cGUsIGFzc29jaWF0aW9uTmFtZSkpOwotCQkJCWFkZFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQkJfQotCQkJZWxzZSBpZiAoYXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSkgewotCQkJCWFzc29jaWF0aW9uT3ZlcnJpZGUudXBkYXRlKG5ldyBOdWxsQXNzb2NpYXRpb25PdmVycmlkZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlLCBhc3NvY2lhdGlvbk5hbWUpKTsKLQkJCX0KLQkJfQotCQkKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFzc29jaWF0aW9uTmFtZXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSk7Ci0JCi0JCS8vcmVtb3ZlIGFueSBkZWZhdWx0IG1hcHBpbmdzIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgYXNzb2NpYXRpb25OYW1lcyBjb2xsZWN0aW9uCi0JCWZvciAoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSkpIHsKLQkJCWlmICghYXNzb2NpYXRpb25OYW1lcy5jb250YWlucyhhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSkKLQkJCQl8fCBjb250YWluc1NwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpKSB7Ci0JCQkJcmVtb3ZlVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVOYW1lZFF1ZXJpZXMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IG5hbWVkUXVlcmllcygpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gcmVzb3VyY2VOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJd2hpbGUgKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpIHsKLQkJCUphdmFOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBuYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlTmFtZWRRdWVyaWVzLmhhc05leHQoKSkgewotCQkJCW5hbWVkUXVlcnkudXBkYXRlKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VOYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZU5hbWVkUXVlcnlfKG5hbWVkUXVlcnkpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VOYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKSB7Ci0JCQlhZGROYW1lZFF1ZXJ5KG5hbWVkUXVlcmllc1NpemUoKSwgYnVpbGROYW1lZFF1ZXJ5KChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VOYW1lZFF1ZXJpZXMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTmFtZWROYXRpdmVRdWVyaWVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFOYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMgPSBuYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IHJlc291cmNlTmFtZWROYXRpdmVRdWVyaWVzID0gcmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCXdoaWxlIChuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhTmFtZWROYXRpdmVRdWVyeSBuYW1lZFF1ZXJ5ID0gbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpIHsKLQkJCQluYW1lZFF1ZXJ5LnVwZGF0ZSgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlTmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5XyhuYW1lZFF1ZXJ5KTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlTmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSkgewotCQkJYWRkTmFtZWROYXRpdmVRdWVyeShuYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCksIGJ1aWxkTmFtZWROYXRpdmVRdWVyeSgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlTmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSkpOwotCQl9CQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSmF2YU5hbWVkUXVlcnkgYnVpbGROYW1lZFF1ZXJ5KE5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnlSZXNvdXJjZSkgewotCQlKYXZhTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YU5hbWVkUXVlcnkodGhpcyk7Ci0JCW5hbWVkUXVlcnkuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShuYW1lZFF1ZXJ5UmVzb3VyY2UpOwotCQlyZXR1cm4gbmFtZWRRdWVyeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFOYW1lZE5hdGl2ZVF1ZXJ5IGJ1aWxkTmFtZWROYXRpdmVRdWVyeShOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UpIHsKLQkJSmF2YU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFOYW1lZE5hdGl2ZVF1ZXJ5KHRoaXMpOwotCQluYW1lZE5hdGl2ZVF1ZXJ5LmluaXRpYWxpemVGcm9tUmVzb3VyY2UobmFtZWROYXRpdmVRdWVyeVJlc291cmNlKTsKLQkJcmV0dXJuIG5hbWVkTmF0aXZlUXVlcnk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSWRDbGFzcyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCUlkQ2xhc3NBbm5vdGF0aW9uIGlkQ2xhc3MgPSAoSWRDbGFzc0Fubm90YXRpb24pIHJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlpZiAoaWRDbGFzcyAhPSBudWxsKSB7Ci0JCQlzZXRJZENsYXNzXyhpZENsYXNzLmdldFZhbHVlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0SWRDbGFzc18obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGVyc2lzdGVuY2VVbml0R2VuZXJhdG9yc0FuZFF1ZXJpZXMoKSB7Ci0JCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZEdlbmVyYXRvcihnZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJfQotCQkKLQkJaWYgKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkR2VuZXJhdG9yKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQl9Ci0JCQotCQlmb3IgKFF1ZXJ5IHF1ZXJ5IDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG5hbWVkUXVlcmllcygpKSkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkUXVlcnkocXVlcnkpOwotCQl9Ci0JCQotCQlmb3IgKFF1ZXJ5IHF1ZXJ5IDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG5hbWVkTmF0aXZlUXVlcmllcygpKSkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkUXVlcnkocXVlcnkpOwotCQl9Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKioqKioqIENvZGUgQ29tcGxldGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmVzdWx0ID0gdGhpcy5nZXRUYWJsZSgpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWZvciAoSmF2YVNlY29uZGFyeVRhYmxlIHNUYWJsZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLnNlY29uZGFyeVRhYmxlcygpKSkgewotCQkJcmVzdWx0ID0gc1RhYmxlLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJZm9yIChKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gY29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlyZXN1bHQgPSBjb2x1bW4uamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlmb3IgKEphdmFBdHRyaWJ1dGVPdmVycmlkZSBvdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlcygpKSkgewotCQkJcmVzdWx0ID0gb3ZlcnJpZGUuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlmb3IgKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMoKSkpIHsKLQkJCXJlc3VsdCA9IG92ZXJyaWRlLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmVzdWx0ID0gdGhpcy5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSB0aGlzLmdldFRhYmxlR2VuZXJhdG9yKCkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlpZiAodGhpcy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQkKLQkJZ2V0VGFibGUoKS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJYWRkSWRNZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCWFkZEdlbmVyYXRvck1lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJYWRkUXVlcnlNZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc3RyZWFtID0gdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCkuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3RyZWFtID0gdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCkuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHN0cmVhbSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCkuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCX0KLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZElkTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWFkZE5vSWRNZXNzYWdlKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9JZE1lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmIChlbnRpdHlIYXNOb0lkKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9OT19JRCwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCXRoaXMsIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkKLQkJCSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGVudGl0eUhhc05vSWQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZW50aXR5SGFzSWQoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW50aXR5SGFzSWQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaXNJZEF0dHJpYnV0ZSgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmF0b3JNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJTGlzdDxHZW5lcmF0b3I+IG1hc3Rlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpOwotCQkKLQkJZm9yIChJdGVyYXRvcjxKYXZhR2VuZXJhdG9yPiBzdHJlYW0gPSB0aGlzLmdlbmVyYXRvcnMoKTsgc3RyZWFtLmhhc05leHQoKSA7ICkgewotCQkJSmF2YUdlbmVyYXRvciBjdXJyZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJCW1hc3Rlckxpc3QucmVtb3ZlKGN1cnJlbnQpOwotCQkJCi0JCQlmb3IgKEdlbmVyYXRvciBlYWNoIDogbWFzdGVyTGlzdCkgewotCQkJCWlmICghIGVhY2gub3ZlcnJpZGVzKGN1cnJlbnQpICYmIGVhY2guZ2V0TmFtZSgpICE9IG51bGwgJiYgZWFjaC5nZXROYW1lKCkuZXF1YWxzKGN1cnJlbnQuZ2V0TmFtZSgpKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5HRU5FUkFUT1JfRFVQTElDQVRFX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtjdXJyZW50LmdldE5hbWUoKX0sCi0JCQkJCQkJY3VycmVudCwKLQkJCQkJCQljdXJyZW50LmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQltYXN0ZXJMaXN0LmFkZChjdXJyZW50KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRRdWVyeU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlMaXN0PFF1ZXJ5PiBtYXN0ZXJMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8SmF2YVF1ZXJ5PiBzdHJlYW0gPSB0aGlzLnF1ZXJpZXMoKTsgc3RyZWFtLmhhc05leHQoKSA7ICkgewotCQkJSmF2YVF1ZXJ5IGN1cnJlbnQgPSBzdHJlYW0ubmV4dCgpOwotCQkJbWFzdGVyTGlzdC5yZW1vdmUoY3VycmVudCk7Ci0JCQkKLQkJCWZvciAoUXVlcnkgZWFjaCA6IG1hc3Rlckxpc3QpIHsKLQkJCQlpZiAoISBlYWNoLm92ZXJyaWRlcyhjdXJyZW50KSAmJiBlYWNoLmdldE5hbWUoKSAhPSBudWxsICYmIGVhY2guZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUVVFUllfRFVQTElDQVRFX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtjdXJyZW50LmdldE5hbWUoKX0sCi0JCQkJCQkJY3VycmVudCwKLQkJCQkJCQljdXJyZW50LmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQltYXN0ZXJMaXN0LmFkZChjdXJyZW50KTsKLQkJfQotCX0KLQkKLQljbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyIGltcGxlbWVudHMgSmF2YUJhc2VKb2luQ29sdW1uLk93bmVyCi0JewotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUVudGl0eS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFFbnRpdHkudGhpczsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFFbnRpdHkudGhpcy5nZXREYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCkgewotCQkJRW50aXR5IHBhcmVudEVudGl0eSA9IEdlbmVyaWNKYXZhRW50aXR5LnRoaXMuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCQlyZXR1cm4gKHBhcmVudEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiBwYXJlbnRFbnRpdHkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW50aXR5LnRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW50aXR5LnRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID09IGpvaW5Db2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCQlpZiAoam9pbkNvbHVtbnNTaXplKCkgIT0gMSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW50aXR5LnRoaXMuZ2V0UGFyZW50RW50aXR5KCkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKLQkJfQotCX0KLQkKLQljbGFzcyBBdHRyaWJ1dGVPdmVycmlkZU93bmVyIGltcGxlbWVudHMgQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIgewotCi0JCXB1YmxpYyBDb2x1bW5NYXBwaW5nIGdldENvbHVtbk1hcHBpbmcoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJCWlmIChhdHRyaWJ1dGVOYW1lID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzQXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMocGVyc0F0dHJpYnV0ZS5nZXROYW1lKCkpKSB7Ci0JCQkJCWlmIChwZXJzQXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIENvbHVtbk1hcHBpbmcpIHsKLQkJCQkJCXJldHVybiAoQ29sdW1uTWFwcGluZykgcGVyc0F0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUVudGl0eS50aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuY29udGFpbnMob3ZlcnJpZGUpOwotCQl9Ci0KLQkJcHVibGljIEJhc2VPdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgQmFzZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFFbnRpdHkudGhpcy5zZXRBdHRyaWJ1dGVPdmVycmlkZVZpcnR1YWwodmlydHVhbCwgKEphdmFBdHRyaWJ1dGVPdmVycmlkZSkgYXR0cmlidXRlT3ZlcnJpZGUpOwotCQl9Ci0KLQkJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW50aXR5LnRoaXM7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIHZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZU93bmVyIGltcGxlbWVudHMgQXNzb2NpYXRpb25PdmVycmlkZS5Pd25lciB7Ci0KLQkJcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZyhTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkJaWYgKGF0dHJpYnV0ZU5hbWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJZm9yIChJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBnZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNBdHRyaWJ1dGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhwZXJzQXR0cmlidXRlLmdldE5hbWUoKSkpIHsKLQkJCQkJaWYgKHBlcnNBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgUmVsYXRpb25zaGlwTWFwcGluZykgewotCQkJCQkJcmV0dXJuIChSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VPdmVycmlkZSBvdmVycmlkZSkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW50aXR5LnRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmNvbnRhaW5zKG92ZXJyaWRlKTsKLQkJfQotCQkKLQkJcHVibGljIEJhc2VPdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgQmFzZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFFbnRpdHkudGhpcy5zZXRBc3NvY2lhdGlvbk92ZXJyaWRlVmlydHVhbCh2aXJ0dWFsLCAoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUVudGl0eS50aGlzOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSB2YWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFHZW5lcmF0ZWRWYWx1ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUdlbmVyYXRlZFZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYjczN2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUdlbmVyYXRlZFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFHZW5lcmF0ZWRWYWx1ZSBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgSmF2YUdlbmVyYXRlZFZhbHVlCi17Ci0JcHJvdGVjdGVkIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0b3I7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRHZW5lcmF0b3I7Ci0JCi0JcHJvdGVjdGVkIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlOwotCQotCXB1YmxpYyBHZW5lcmljSmF2YUdlbmVyYXRlZFZhbHVlKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tUmVzb3VyY2UoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlKSB7Ci0JCXRoaXMuZ2VuZXJhdGVkVmFsdWVSZXNvdXJjZSA9IGdlbmVyYXRlZFZhbHVlOwotCQl0aGlzLnN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVneShnZW5lcmF0ZWRWYWx1ZSk7Ci0JCXRoaXMuZ2VuZXJhdG9yID0gdGhpcy5nZW5lcmF0b3IoZ2VuZXJhdGVkVmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRTdHJhdGVneSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0U3RyYXRlZ3koKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0RGVmYXVsdFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gR2VuZXJhdGVkVmFsdWUuREVGQVVMVF9TVFJBVEVHWTsKLQl9Ci0JCi0JcHVibGljIEdlbmVyYXRpb25UeXBlIGdldFNwZWNpZmllZFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSBuZXdTdHJhdGVneSkgewotCQlHZW5lcmF0aW9uVHlwZSBvbGRTdHJhdGVneSA9IHRoaXMuc3RyYXRlZ3k7Ci0JCXRoaXMuc3RyYXRlZ3kgPSBuZXdTdHJhdGVneTsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZVJlc291cmNlLnNldFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3U3RyYXRlZ3kpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChHZW5lcmF0ZWRWYWx1ZS5TUEVDSUZJRURfU1RSQVRFR1lfUFJPUEVSVFksIG9sZFN0cmF0ZWd5LCBuZXdTdHJhdGVneSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU3RyYXRlZ3lfKEdlbmVyYXRpb25UeXBlIG5ld1N0cmF0ZWd5KSB7Ci0JCUdlbmVyYXRpb25UeXBlIG9sZFN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVneTsKLQkJdGhpcy5zdHJhdGVneSA9IG5ld1N0cmF0ZWd5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdlbmVyYXRlZFZhbHVlLlNQRUNJRklFRF9TVFJBVEVHWV9QUk9QRVJUWSwgb2xkU3RyYXRlZ3ksIG5ld1N0cmF0ZWd5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEdlbmVyYXRvcigpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0R2VuZXJhdG9yKCkgOiB0aGlzLmdldFNwZWNpZmllZEdlbmVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3I7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0R2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0R2VuZXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRHZW5lcmF0b3IoU3RyaW5nIG5ld0dlbmVyYXRvcikgewotCQlTdHJpbmcgb2xkR2VuZXJhdG9yID0gdGhpcy5nZW5lcmF0b3I7Ci0JCXRoaXMuZ2VuZXJhdG9yID0gbmV3R2VuZXJhdG9yOwotCQl0aGlzLmdlbmVyYXRlZFZhbHVlUmVzb3VyY2Uuc2V0R2VuZXJhdG9yKG5ld0dlbmVyYXRvcik7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR2VuZXJhdGVkVmFsdWUuU1BFQ0lGSUVEX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkR2VuZXJhdG9yLCBuZXdHZW5lcmF0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEdlbmVyYXRvcl8oU3RyaW5nIG5ld0dlbmVyYXRvcikgewotCQlTdHJpbmcgb2xkR2VuZXJhdG9yID0gdGhpcy5nZW5lcmF0b3I7Ci0JCXRoaXMuZ2VuZXJhdG9yID0gbmV3R2VuZXJhdG9yOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdlbmVyYXRlZFZhbHVlLlNQRUNJRklFRF9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZEdlbmVyYXRvciwgbmV3R2VuZXJhdG9yKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlZFZhbHVlUmVzb3VyY2UuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlZFZhbHVlUmVzb3VyY2UuZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWwgLT4gamF2YSBjb250ZXh0IG1vZGVsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUpIHsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gZ2VuZXJhdGVkVmFsdWU7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU3RyYXRlZ3lfKHRoaXMuc3RyYXRlZ3koZ2VuZXJhdGVkVmFsdWUpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRHZW5lcmF0b3JfKHRoaXMuZ2VuZXJhdG9yKGdlbmVyYXRlZFZhbHVlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZSkgewotCQlyZXR1cm4gR2VuZXJhdGlvblR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKGdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRvcihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUpIHsKLQkJcmV0dXJuIGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzYjFiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFJZE1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPElkQW5ub3RhdGlvbj4gaW1wbGVtZW50cyBKYXZhSWRNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFDb2x1bW4gY29sdW1uOwotCi0JcHJvdGVjdGVkIEphdmFHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZTsKLQotCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgdGVtcG9yYWw7Ci0KLQlwcm90ZWN0ZWQgSmF2YVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yOwotCi0JcHJvdGVjdGVkIEphdmFTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjsKLQotCXB1YmxpYyBHZW5lcmljSmF2YUlkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb2x1bW4gPSBjcmVhdGVKYXZhQ29sdW1uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb2x1bW4gY3JlYXRlSmF2YUNvbHVtbigpIHsKLQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFDb2x1bW4odGhpcywgdGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVJlc291cmNlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMuY29sdW1uLmluaXRpYWxpemVGcm9tUmVzb3VyY2UodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpKTsKLQkJdGhpcy50ZW1wb3JhbCA9IHRoaXMudGVtcG9yYWwodGhpcy5nZXRUZW1wb3JhbFJlc291cmNlKCkpOwotCQl0aGlzLmluaXRpYWxpemVUYWJsZUdlbmVyYXRvcihyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLmluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvcihyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLmluaXRpYWxpemVHZW5lcmF0ZWRWYWx1ZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlVW5pdEdlbmVyYXRvcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlR2VuZXJhdG9yKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gdGFibGVHZW5lcmF0b3IocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJaWYgKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdGhpcy50YWJsZUdlbmVyYXRvciA9IGJ1aWxkVGFibGVHZW5lcmF0b3IodGFibGVHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9yKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gc2VxdWVuY2VHZW5lcmF0b3IocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJaWYgKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3Ioc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYXRlZFZhbHVlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gZ2VuZXJhdGVkVmFsdWUocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJaWYgKGdlbmVyYXRlZFZhbHVlUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IGJ1aWxkR2VuZXJhdGVkVmFsdWUoZ2VuZXJhdGVkVmFsdWVSZXNvdXJjZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFRlbXBvcmFsQW5ub3RhdGlvbiBnZXRUZW1wb3JhbFJlc291cmNlKCkgewotCQlyZXR1cm4gKFRlbXBvcmFsQW5ub3RhdGlvbikgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0Tm9uTnVsbEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtblJlc291cmNlKCkgewotCQlyZXR1cm4gKENvbHVtbkFubm90YXRpb24pIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQkvLyoqKioqKioqKioqKioqIElKYXZhQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigKLQkJCUpQQS5DT0xVTU4sCi0JCQlKUEEuR0VORVJBVEVEX1ZBTFVFLAotCQkJSlBBLlRFTVBPUkFMLAotCQkJSlBBLlRBQkxFX0dFTkVSQVRPUiwKLQkJCUpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKiBJSWRNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBKYXZhQ29sdW1uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCX0KLQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKSB7Ci0JCXJldHVybiB0aGlzLnRlbXBvcmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkgewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0aGlzLnRlbXBvcmFsOwotCQl0aGlzLnRlbXBvcmFsID0gbmV3VGVtcG9yYWw7Ci0JCXRoaXMuZ2V0VGVtcG9yYWxSZXNvdXJjZSgpLnNldFZhbHVlKFRlbXBvcmFsVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKG5ld1RlbXBvcmFsKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ29sdW1uTWFwcGluZy5URU1QT1JBTF9QUk9QRVJUWSwgb2xkVGVtcG9yYWwsIG5ld1RlbXBvcmFsKTsKLQl9Ci0JCi0JLyoqCi0JICogaW50ZXJuYWwgc2V0dGVyIHVzZWQgb25seSBmb3IgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuCi0JICogVGhlcmUgd2VyZSBwcm9ibGVtcyB3aXRoIEludmFsaWRUaHJlYWRBY2Nlc3MgZXhjZXB0aW9ucyBpbiB0aGUgVUkKLQkgKiB3aGVuIHlvdSBzZXQgYSB2YWx1ZSBmcm9tIHRoZSBVSSBhbmQgdGhlIGFubm90YXRpb24gZG9lc24ndCBleGlzdCB5ZXQuCi0JICogQWRkaW5nIHRoZSBhbm5vdGF0aW9uIGNhdXNlcyBhbiB1cGRhdGUgdG8gb2NjdXIgYW5kIHRoZW4gdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUZW1wb3JhbF8oVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKSB7Ci0JCVRlbXBvcmFsVHlwZSBvbGRUZW1wb3JhbCA9IHRoaXMudGVtcG9yYWw7Ci0JCXRoaXMudGVtcG9yYWwgPSBuZXdUZW1wb3JhbDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDb2x1bW5NYXBwaW5nLlRFTVBPUkFMX1BST1BFUlRZLCBvbGRUZW1wb3JhbCwgbmV3VGVtcG9yYWwpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUdlbmVyYXRlZFZhbHVlIGFkZEdlbmVyYXRlZFZhbHVlKCkgewotCQlpZiAoZ2V0R2VuZXJhdGVkVmFsdWUoKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZW1lcmF0ZWRWYWx1ZSBhbHJlYWR5IGV4aXN0cyIpOwotCQl9Ci0JCXRoaXMuZ2VuZXJhdGVkVmFsdWUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhR2VuZXJhdGVkVmFsdWUodGhpcyk7Ci0JCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZS5pbml0aWFsaXplRnJvbVJlc291cmNlKGdlbmVyYXRlZFZhbHVlUmVzb3VyY2UpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSwgbnVsbCwgdGhpcy5nZW5lcmF0ZWRWYWx1ZSk7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlZFZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVHZW5lcmF0ZWRWYWx1ZSgpIHsKLQkJaWYgKGdldEdlbmVyYXRlZFZhbHVlKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2VtZXJhdGVkVmFsdWUgZG9lcyBub3QgZXhpc3QsIGNhbm5vdCBiZSByZW1vdmVkIik7Ci0JCX0KLQkJSmF2YUdlbmVyYXRlZFZhbHVlIG9sZEdlbmVyYXRlZFZhbHVlID0gdGhpcy5nZW5lcmF0ZWRWYWx1ZTsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IG51bGw7Ci0JCWdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZLCBvbGRHZW5lcmF0ZWRWYWx1ZSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlZFZhbHVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRHZW5lcmF0ZWRWYWx1ZShKYXZhR2VuZXJhdGVkVmFsdWUgbmV3R2VuZXJhdGVkVmFsdWUpIHsKLQkJSmF2YUdlbmVyYXRlZFZhbHVlIG9sZEdlbmVyYXRlZFZhbHVlID0gdGhpcy5nZW5lcmF0ZWRWYWx1ZTsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IG5ld0dlbmVyYXRlZFZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSwgb2xkR2VuZXJhdGVkVmFsdWUsIG5ld0dlbmVyYXRlZFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVRhYmxlR2VuZXJhdG9yIGFkZFRhYmxlR2VuZXJhdG9yKCkgewotCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0YWJsZUdlbmVyYXRvciBhbHJlYWR5IGV4aXN0cyIpOwotCQl9Ci0JCXRoaXMudGFibGVHZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhVGFibGVHZW5lcmF0b3IodGhpcyk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGhpcy50YWJsZUdlbmVyYXRvci5pbml0aWFsaXplRnJvbVJlc291cmNlKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSwgbnVsbCwgdGhpcy50YWJsZUdlbmVyYXRvcik7Ci0JCXJldHVybiB0aGlzLnRhYmxlR2VuZXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVUYWJsZUdlbmVyYXRvcigpIHsKLQkJaWYgKGdldFRhYmxlR2VuZXJhdG9yKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGFibGVHZW5lcmF0b3IgZG9lcyBub3QgZXhpc3QsIGNhbm5vdCBiZSByZW1vdmVkIik7Ci0JCX0KLQkJSmF2YVRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGhpcy50YWJsZUdlbmVyYXRvcjsKLQkJdGhpcy50YWJsZUdlbmVyYXRvciA9IG51bGw7Ci0JCWdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRUYWJsZUdlbmVyYXRvciwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlR2VuZXJhdG9yOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZUdlbmVyYXRvcihKYXZhVGFibGVHZW5lcmF0b3IgbmV3VGFibGVHZW5lcmF0b3IpIHsKLQkJSmF2YVRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGhpcy50YWJsZUdlbmVyYXRvcjsKLQkJdGhpcy50YWJsZUdlbmVyYXRvciA9IG5ld1RhYmxlR2VuZXJhdG9yOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkVGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGFkZFNlcXVlbmNlR2VuZXJhdG9yKCkgewotCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZXF1ZW5jZUdlbmVyYXRvciBhbHJlYWR5IGV4aXN0cyIpOwotCQl9Ci0JCQotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVNlcXVlbmNlR2VuZXJhdG9yKHRoaXMpOwotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFksIG51bGwsIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3IpOwotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCWlmIChnZXRTZXF1ZW5jZUdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNlcXVlbmNlR2VuZXJhdG9yIGRvZXMgbm90IGV4aXN0LCBjYW5ub3QgYmUgcmVtb3ZlZCIpOwotCQl9Ci0JCUphdmFTZXF1ZW5jZUdlbmVyYXRvciBvbGRTZXF1ZW5jZUdlbmVyYXRvciA9IHRoaXMuc2VxdWVuY2VHZW5lcmF0b3I7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBudWxsOwotCQlnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkU2VxdWVuY2VHZW5lcmF0b3IsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZXF1ZW5jZUdlbmVyYXRvcihKYXZhU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJSmF2YVNlcXVlbmNlR2VuZXJhdG9yIG9sZFNlcXVlbmNlR2VuZXJhdG9yID0gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IG5ld1NlcXVlbmNlR2VuZXJhdG9yOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkU2VxdWVuY2VHZW5lcmF0b3IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEphdmFHZW5lcmF0b3I+IGdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8SmF2YUdlbmVyYXRvcj4oCi0JCQkoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSA6IG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3IoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSksCi0JCQkoZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSA6IG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3IoZ2V0VGFibGVHZW5lcmF0b3IoKSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJc3VwZXIudXBkYXRlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZSh0aGlzLmdldENvbHVtblJlc291cmNlKCkpOwotCQl0aGlzLnNldFRlbXBvcmFsXyh0aGlzLnRlbXBvcmFsKHRoaXMuZ2V0VGVtcG9yYWxSZXNvdXJjZSgpKSk7Ci0JCXRoaXMudXBkYXRlVGFibGVHZW5lcmF0b3IocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy51cGRhdGVTZXF1ZW5jZUdlbmVyYXRvcihyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLnVwZGF0ZUdlbmVyYXRlZFZhbHVlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMudXBkYXRlUGVyc2lzdGVuY2VVbml0R2VuZXJhdG9ycygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHRlbXBvcmFsKFRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCkgewotCQlyZXR1cm4gVGVtcG9yYWxUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbCh0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYWJsZUdlbmVyYXRvcihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IHRhYmxlR2VuZXJhdG9yKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCWlmICh0YWJsZUdlbmVyYXRvclJlc291cmNlID09IG51bGwpIHsKLQkJCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcihudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcihidWlsZFRhYmxlR2VuZXJhdG9yKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWdldFRhYmxlR2VuZXJhdG9yKCkudXBkYXRlKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhVGFibGVHZW5lcmF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvcihUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JSZXNvdXJjZSkgewotCQlKYXZhVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhVGFibGVHZW5lcmF0b3IodGhpcyk7Ci0JCXRhYmxlR2VuZXJhdG9yLmluaXRpYWxpemVGcm9tUmVzb3VyY2UodGFibGVHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VxdWVuY2VHZW5lcmF0b3IoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBzZXF1ZW5jZUdlbmVyYXRvcihyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlpZiAoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlnZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnVwZGF0ZShzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3IoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJSmF2YVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVNlcXVlbmNlR2VuZXJhdG9yKHRoaXMpOwotCQlzZXF1ZW5jZUdlbmVyYXRvci5pbml0aWFsaXplRnJvbVJlc291cmNlKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3I7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUdlbmVyYXRlZFZhbHVlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gZ2VuZXJhdGVkVmFsdWUocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJaWYgKGdlbmVyYXRlZFZhbHVlUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJaWYgKGdldEdlbmVyYXRlZFZhbHVlKCkgIT0gbnVsbCkgewotCQkJCXNldEdlbmVyYXRlZFZhbHVlKG51bGwpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldEdlbmVyYXRlZFZhbHVlKCkgPT0gbnVsbCkgewotCQkJCXNldEdlbmVyYXRlZFZhbHVlKGJ1aWxkR2VuZXJhdGVkVmFsdWUoZ2VuZXJhdGVkVmFsdWVSZXNvdXJjZSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ2V0R2VuZXJhdGVkVmFsdWUoKS51cGRhdGUoZ2VuZXJhdGVkVmFsdWVSZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFHZW5lcmF0ZWRWYWx1ZSBidWlsZEdlbmVyYXRlZFZhbHVlKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlKSB7Ci0JCUphdmFHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFHZW5lcmF0ZWRWYWx1ZSh0aGlzKTsKLQkJZ2VuZXJhdGVkVmFsdWUuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShnZW5lcmF0ZWRWYWx1ZVJlc291cmNlKTsKLQkJcmV0dXJuIGdlbmVyYXRlZFZhbHVlOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBlcnNpc3RlbmNlVW5pdEdlbmVyYXRvcnMoKSB7Ci0JCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZEdlbmVyYXRvcihnZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJfQotCQkKLQkJaWYgKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkR2VuZXJhdG9yKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLmdldENvbHVtbigpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbigpLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJZE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vKioqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJCi0JCWFkZENvbHVtbk1lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJYWRkR2VuZXJhdGVkVmFsdWVNZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCWFkZEdlbmVyYXRvck1lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIGFkZENvbHVtbk1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlKYXZhQ29sdW1uIGNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uKCk7Ci0JCVN0cmluZyB0YWJsZSA9IGNvbHVtbi5nZXRUYWJsZSgpOwotCQlib29sZWFuIGRvQ29udGludWUgPSBlbnRpdHlPd25lZCgpICYmIGNvbHVtbi5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JCQotCQlpZiAoZG9Db250aW51ZSAmJiB0aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RhYmxlLCBjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQljb2x1bW4sIGNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJZG9Db250aW51ZSA9IGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoZG9Db250aW51ZSAmJiAhIGNvbHVtbi5pc1Jlc29sdmVkKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQluZXcgU3RyaW5nW10ge2NvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWNvbHVtbiwgY29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmF0ZWRWYWx1ZU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlKYXZhR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSB0aGlzLmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlmIChnZW5lcmF0ZWRWYWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGdlbmVyYXRvck5hbWUgPSBnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKTsKLQkJaWYgKGdlbmVyYXRvck5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlmb3IgKEdlbmVyYXRvciBuZXh0TWFzdGVyR2VuZXJhdG9yIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpIHsKLQkJCWlmIChnZW5lcmF0b3JOYW1lLmVxdWFscyhuZXh0TWFzdGVyR2VuZXJhdG9yLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCW1lc3NhZ2VzLmFkZCgKLQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLklEX01BUFBJTkdfVU5SRVNPTFZFRF9HRU5FUkFUT1JfTkFNRSwKLQkJCQluZXcgU3RyaW5nW10ge2dlbmVyYXRvck5hbWV9LAotCQkJCXRoaXMsCi0JCQkJZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkR2VuZXJhdG9yTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUxpc3Q8R2VuZXJhdG9yPiBtYXN0ZXJMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8SmF2YUdlbmVyYXRvcj4gc3RyZWFtID0gdGhpcy5nZW5lcmF0b3JzKCk7IHN0cmVhbS5oYXNOZXh0KCkgOyApIHsKLQkJCUphdmFHZW5lcmF0b3IgY3VycmVudCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQltYXN0ZXJMaXN0LnJlbW92ZShjdXJyZW50KTsKLQkJCQotCQkJZm9yIChHZW5lcmF0b3IgZWFjaCA6IG1hc3Rlckxpc3QpIHsKLQkJCQlpZiAoISBlYWNoLm92ZXJyaWRlcyhjdXJyZW50KSAmJiBlYWNoLmdldE5hbWUoKSAhPSBudWxsICYmIGVhY2guZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7Y3VycmVudC5nZXROYW1lKCl9LAotCQkJCQkJCWN1cnJlbnQsCi0JCQkJCQkJY3VycmVudC5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCQkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJbWFzdGVyTGlzdC5hZGQoY3VycmVudCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkNTAyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUpvaW5Db2x1bW4gZXh0ZW5kcyBBYnN0cmFjdEphdmFCYXNlQ29sdW1uPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbXBsZW1lbnRzIEphdmFKb2luQ29sdW1uCi17Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0KLQlwcm90ZWN0ZWQgSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbjsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFKb2luQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFKb2luQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2luQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID09IG51bGwpID8gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgOiB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUpvaW5Db2x1bW4uU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUpvaW5Db2x1bW4uU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5ld0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VKb2luQ29sdW1uLkRFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdEZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFKb2luQ29sdW1uLk93bmVyIGdldE93bmVyKCkgewotCQlyZXR1cm4gKEphdmFKb2luQ29sdW1uLk93bmVyKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuaXNWaXJ0dWFsKHRoaXMpOwotCX0KLQotCXB1YmxpYyBUYWJsZSBnZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0RGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ29sdW1uIGdldERiUmVmZXJlbmNlZENvbHVtbigpIHsKLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCk7Ci0JCXJldHVybiAodGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGFibGUuY29sdW1uTmFtZWQodGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB0YWJsZUlzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXIoKS50YWJsZUlzQWxsb3dlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0Q29sdW1uUmVzb3VyY2UoKS5yZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKCkgewotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0T3duZXIoKS5nZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpOwotCQlyZXR1cm4gKHRhYmxlICE9IG51bGwpID8gdGFibGUuY29sdW1uTmFtZXMoKSA6IEVtcHR5SXRlcmF0b3IuPFN0cmluZz4gaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPih0aGlzLmNhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBxdW90ZWRDYW5kaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5xdW90ZSh0aGlzLmNhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcyhmaWx0ZXIpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuY29ubmVjdGVkSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLnF1b3RlZENhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcyhmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlZENvbHVtblJlc29sdmVkKCkgewotCQlyZXR1cm4gZ2V0RGJSZWZlcmVuY2VkQ29sdW1uKCkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRDb2x1bW5SZXNvdXJjZSgpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IGdldE93bmVyKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMuam9pbkNvbHVtbiA9IGpvaW5Db2x1bW47Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tUmVzb3VyY2Uoam9pbkNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCXRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5qb2luQ29sdW1uID0gam9pbkNvbHVtbjsKLQkJc3VwZXIudXBkYXRlKGpvaW5Db2x1bW4pOwotCQl0aGlzLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lXyhqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQl0aGlzLnNldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSh0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCWlmIChyZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuaXNSZWxhdGlvbnNoaXBPd25lcigpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pbkNvbHVtbkRlZmF1bHROYW1lKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCWlmIChyZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuaXNSZWxhdGlvbnNoaXBPd25lcigpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pbkNvbHVtbkRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSh0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFibGUoKSB7Ci0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IGdldE93bmVyKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOwotCQlpZiAocmVsYXRpb25zaGlwTWFwcGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoIWdldE93bmVyKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmlzUmVsYXRpb25zaGlwT3duZXIoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmRlZmF1bHRUYWJsZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTVlZmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW4uT3duZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsSm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneSAKKwlleHRlbmRzIEFic3RyYWN0SmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kKKwlpbXBsZW1lbnRzIEphdmFKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5Cit7CisJcHJvdGVjdGVkIHRyYW5zaWVudCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5KEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKSB7CisJCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7CisJfQorCQorCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKKwkJcmV0dXJuIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbigpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlKSBzdXBlci5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbkFubm90YXRpb25zKCkgeworCQlyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qb2luQ29sdW1ucygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pbkNvbHVtbkFubm90YXRpb24gYnVpbGROdWxsSm9pbkNvbHVtbkFubm90YXRpb24oKSB7CisJCXJldHVybiBuZXcgTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pOworCX0KKwkJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEFubm90YXRpb24oaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLmFkZEpvaW5Db2x1bW4oaW5kZXgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbm5vdGF0aW9uKGludCBpbmRleCkgeworCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLnJlbW92ZUpvaW5Db2x1bW4oaW5kZXgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLm1vdmVKb2luQ29sdW1uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSkgeworCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uID0gYXNzb2NpYXRpb25PdmVycmlkZTsKKwkJc3VwZXIuaW5pdGlhbGl6ZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSkgeworCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uID0gYXNzb2NpYXRpb25PdmVycmlkZTsKKwkJc3VwZXIudXBkYXRlKCk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKwkKKy8vCSAqKioqKioqKioqIGpvaW4gY29sdW1uIG93bmVyIGFkYXB0ZXIgKioqKioqKioqKgorCQorCXByb3RlY3RlZCBjbGFzcyBKb2luQ29sdW1uT3duZXIKKwkJaW1wbGVtZW50cyBKYXZhSm9pbkNvbHVtbi5Pd25lcgorCXsKKworCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbk93bmVyKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCisJCS8qKgorCQkgKiBieSBkZWZhdWx0LCB0aGUgam9pbiBjb2x1bW4gaXMgaW4gdGhlIHR5cGUgbWFwcGluZydzIHByaW1hcnkgdGFibGUKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKKwkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlUYWJsZU5hbWUoKTsKKwkJfQorCQkKKwkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKKwkJCS8vYnVpbHQgaW4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pbkNvbHVtbkRlZmF1bHROYW1lKCkKKwkJCXJldHVybiBudWxsOworCQl9CisJCQorCQlwdWJsaWMgRW50aXR5IGdldFRhcmdldEVudGl0eSgpIHsKKwkJCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKwkJCXJldHVybiByZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwgPyBudWxsIDogcmVsYXRpb25zaGlwTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgeworCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneS50aGlzLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXROYW1lKCk7CisJCX0KKworCQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneS50aGlzLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXRPd25lcigpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoR2VuZXJpY0phdmFKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5LnRoaXMuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldE5hbWUoKSk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgeworCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7CisJCX0KKworCQkvKioKKwkJICogdGhlIGpvaW4gY29sdW1uIGNhbiBiZSBvbiBhIHNlY29uZGFyeSB0YWJsZQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gdGFibGVJc0FsbG93ZWQoKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CisJCX0KKworCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5LnRoaXMuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKTsKKwkJfQorCisJCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKKwkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldERiVGFibGUodGFibGVOYW1lKTsKKwkJfQorCisJCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpIHsKKwkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBnZXRUYXJnZXRFbnRpdHkoKTsKKwkJCXJldHVybiAodGFyZ2V0RW50aXR5ID09IG51bGwpID8gbnVsbCA6IHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOworCQl9CisJCQorCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7CisJCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5LnRoaXMuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmpvaW5Db2x1bW5zU2l6ZSgpOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYThmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbnNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSAKKwlleHRlbmRzIEFic3RyYWN0SmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kKK3sKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KEphdmFKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uLk93bmVyIGJ1aWxkSm9pbkNvbHVtbk93bmVyKCkgeworCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5Pd25lcigpOworCX0KKwkKKwlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmcoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiAoSmF2YUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlKSBzdXBlci5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7CisJfQorCQorCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbkFubm90YXRpb25zKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uLCBKb2luQ29sdW1uQW5ub3RhdGlvbj4oCisJCQl0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmFubm90YXRpb25zKAorCQkJCQlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIHRyYW5zZm9ybShOZXN0YWJsZUFubm90YXRpb24gbmV4dCkgeworCQkJCQlyZXR1cm4gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBuZXh0OworCQkJCX0KKwkJCX07CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKb2luQ29sdW1uQW5ub3RhdGlvbiBidWlsZE51bGxKb2luQ29sdW1uQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBOdWxsSm9pbkNvbHVtbkFubm90YXRpb24odGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJfQorCQkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIChKb2luQ29sdW1uQW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS4KKwkJCWFkZEFubm90YXRpb24oCisJCQkJaW5kZXgsIAorCQkJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgCisJCQkJSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFubm90YXRpb24oaW50IGluZGV4KSB7CisJCXRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuCisJCQlyZW1vdmVBbm5vdGF0aW9uKAorCQkJCWluZGV4LCAKKwkJCQlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIAorCQkJCUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQl0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLgorCQkJbW92ZUFubm90YXRpb24oCisJCQkJdGFyZ2V0SW5kZXgsIAorCQkJCXNvdXJjZUluZGV4LCAKKwkJCQlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorCXByb3RlY3RlZCBjbGFzcyBKb2luQ29sdW1uT3duZXIgCisJaW1wbGVtZW50cyBKYXZhSm9pbkNvbHVtbi5Pd25lciAKK3sKKwlwcm90ZWN0ZWQgSm9pbkNvbHVtbk93bmVyKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwkvKioKKwkgKiBieSBkZWZhdWx0LCB0aGUgam9pbiBjb2x1bW4gaXMgaW4gdGhlIHR5cGUgbWFwcGluZydzIHByaW1hcnkgdGFibGUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7CQkKKwkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgeworCQkvL2J1aWx0IGluIE1hcHBpbmdUb29scy5idWlsZEpvaW5Db2x1bW5EZWZhdWx0TmFtZSgpCisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgRW50aXR5IGdldFRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKTsKKwl9CisJCisJcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKKwkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKKwkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7CisJfQorCQorCS8qKgorCSAqIHRoZSBqb2luIGNvbHVtbiBjYW4gYmUgb24gYSBzZWNvbmRhcnkgdGFibGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB0YWJsZUlzQWxsb3dlZCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKKwkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZygpOworCX0KKwkKKwlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7CisJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldERiVGFibGUodGFibGVOYW1lKTsKKwl9CisJCisJcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgeworCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0VGFyZ2V0RW50aXR5KCk7CisJCXJldHVybiAodGFyZ2V0RW50aXR5ID09IG51bGwpID8gbnVsbCA6IHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPT0gam9pbkNvbHVtbjsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBHZW5lcmljSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKwkKKwlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS50aGlzLmpvaW5Db2x1bW5zU2l6ZSgpOworCX0KK30KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1OWYwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSm9pblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTm9uT3duaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUpvaW5UYWJsZSBleHRlbmRzIEFic3RyYWN0SmF2YVRhYmxlIGltcGxlbWVudHMgSmF2YUpvaW5UYWJsZQotewotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1uczsKLQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbjsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFKb2luQ29sdW1uPiBzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnM7Ci0KLQlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4gZGVmYXVsdEludmVyc2VKb2luQ29sdW1uOwotCQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlOwotCQotCXB1YmxpYyBHZW5lcmljSmF2YUpvaW5UYWJsZShKYXZhUmVsYXRpb25zaGlwTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8SmF2YUpvaW5Db2x1bW4+KCk7Ci0JCXRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxKYXZhSm9pbkNvbHVtbj4oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVsYXRpb25zaGlwTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKioqKiBBYnN0cmFjdEphdmFUYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQkvKioKLQkgKiBEZWZhdWx0IGpvaW4gdGFibGUgbmFtZSBmcm9tIHRoZSBKUEEgc3BlYzoKLQkgKiAJVGhlIGNvbmNhdGVuYXRlZCBuYW1lcyBvZiB0aGUgdHdvIGFzc29jaWF0ZWQgcHJpbWFyeQotCSAqIAllbnRpdHkgdGFibGVzLCBzZXBhcmF0ZWQgYnkgYSB1bmRlcnNjb3JlLgotCSAqIAotCSAqIFtvd25pbmcgdGFibGUgbmFtZV1fW3RhcmdldCB0YWJsZSBuYW1lXQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luVGFibGVEZWZhdWx0TmFtZShnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2coKSB7Ci0JCWlmICghZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmlzUmVsYXRpb25zaGlwT3duZXIoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmRlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYSgpIHsKLQkJaWYgKCFnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuaXNSZWxhdGlvbnNoaXBPd25lcigpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZGVmYXVsdFNjaGVtYSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSm9pblRhYmxlQW5ub3RhdGlvbiBnZXRUYWJsZVJlc291cmNlKCkgewotCQlyZXR1cm4gKEpvaW5UYWJsZUFubm90YXRpb24pIHRoaXMuYXR0cmlidXRlUmVzb3VyY2UuZ2V0Tm9uTnVsbEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGpvaW4gdGFibGUgamF2YSByZXNvdXJjZSwgbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBkb2VzIG5vdCBleGlzdC4KLQkgKiBVc2UgdGFibGVSZXNvdXJjZSgpIGlmIHlvdSB3YW50IGEgbm9uIG51bGwgaW1wbGVtZW50YXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSm9pblRhYmxlQW5ub3RhdGlvbiBnZXRKb2luVGFibGVSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChKb2luVGFibGVBbm5vdGF0aW9uKSB0aGlzLmF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKb2luVGFibGVSZXNvdXJjZSgpIHsKLQkJdGhpcy5hdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKioqIElKb2luVGFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkgOiB0aGlzLmRlZmF1bHRKb2luQ29sdW1ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRKb2luQ29sdW1uKEphdmFKb2luQ29sdW1uIG5ld0pvaW5Db2x1bW4pIHsKLQkJSmF2YUpvaW5Db2x1bW4gb2xkSm9pbkNvbHVtbiA9IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBuZXdKb2luQ29sdW1uOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEpvaW5UYWJsZS5ERUZBVUxUX0pPSU5fQ09MVU1OLCBvbGRKb2luQ29sdW1uLCBuZXdKb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBkZWZhdWx0Sm9pbkNvbHVtbnMoKSB7Ci0JCWlmICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0Sm9pbkNvbHVtbik7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IG51bGwpID8gMCA6IDE7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAhdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEphdmFKb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCUpvaW5Db2x1bW4gb2xkRGVmYXVsdEpvaW5Db2x1bW4gPSB0aGlzLmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCWlmIChvbGREZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkvL251bGwgdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gbm93IGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkJCS8vaWYgb25lIGRvZXMgbm90IGV4aXN0LCB0aGVyZSBpcyBhbHJlYWR5IGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uLgotCQkJLy9SZW1vdmUgaXQgbm93IHNvIHRoYXQgaXQgZG9lc24ndCBnZXQgcmVtb3ZlZCBkdXJpbmcgYW4gdXBkYXRlIGFuZAotCQkJLy9jYXVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBiZSBzZW50IHRvIHRoZSBVSSBpbiB0aGUgd3Jvbmcgb3JkZXIKLQkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBudWxsOwotCQl9Ci0JCWlmIChnZXRKb2luVGFibGVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCS8vQWRkIHRoZSBKb2luVGFibGUgYmVmb3JlIGNyZWF0aW5nIHRoZSBzcGVjaWZpZWRKb2luQ29sdW1uLgotCQkJLy9PdGhlcndpc2Ugd2Ugd2lsbCByZW1vdmUgaXQgYW5kIGNyZWF0ZSBhbm90aGVyIGR1cmluZyBhbiB1cGRhdGUKLQkJCS8vZnJvbSB0aGUgamF2YSByZXNvdXJjZSBtb2RlbAotCQkJYWRkSm9pblRhYmxlUmVzb3VyY2UoKTsKLQkJfQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUpvaW5Db2x1bW4odGhpcywgY3JlYXRlSm9pbkNvbHVtbk93bmVyKCkpOwotCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmFkZChpbmRleCwgam9pbkNvbHVtbik7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IHRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpLmFkZEpvaW5Db2x1bW4oaW5kZXgpOwotCQlqb2luQ29sdW1uLmluaXRpYWxpemVGcm9tUmVzb3VyY2Uoam9pbkNvbHVtblJlc291cmNlKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKEpvaW5UYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBqb2luQ29sdW1uKTsKLQkJaWYgKG9sZERlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChKb2luVGFibGUuREVGQVVMVF9KT0lOX0NPTFVNTiwgb2xkRGVmYXVsdEpvaW5Db2x1bW4sIG51bGwpOwotCQl9Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4LCBKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIEpvaW5UYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuaW5kZXhPZihqb2luQ29sdW1uKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCUphdmFKb2luQ29sdW1uIHJlbW92ZWRKb2luQ29sdW1uID0gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOwotCQlpZiAoIWNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkgewotCQkJLy9jcmVhdGUgdGhlIGRlZmF1bHRKb2luQ29sdW1uIG5vdyBvciB0aGlzIHdpbGwgaGFwcGVuIGR1cmluZyBwcm9qZWN0IHVwZGF0ZSAKLQkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLiBUaGF0IGNhdXNlcyBwcm9ibGVtcyAKLQkJCS8vaW4gdGhlIFVJIGJlY2F1c2UgdGhlIGNoYW5nZSBub3RpZmljYXRpb25zIGVuZCB1cCBpbiB0aGUgd3Jvbmcgb3JkZXIuCi0JCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gYnVpbGRKb2luQ29sdW1uKG5ldyBOdWxsSm9pbkNvbHVtbihnZXRUYWJsZVJlc291cmNlKCkpKTsKLQkJfQotCQl0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5yZW1vdmVKb2luQ29sdW1uKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKEpvaW5UYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCByZW1vdmVkSm9pbkNvbHVtbik7Ci0JCWlmICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCS8vZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIGEgZGVmYXVsdEpvaW5Db2x1bW4gd2FzIGNyZWF0ZWQgYWJvdmUKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChKb2luVGFibGUuREVGQVVMVF9KT0lOX0NPTFVNTiwgbnVsbCwgdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbik7CQkKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW5fKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIEpvaW5UYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5tb3ZlSm9pbkNvbHVtbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKEpvaW5UYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBpbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRhaW5zU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpIDogdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBpbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBnZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKEphdmFKb2luQ29sdW1uIG5ld0ludmVyc2VKb2luQ29sdW1uKSB7Ci0JCUphdmFKb2luQ29sdW1uIG9sZEludmVyc2VKb2luQ29sdW1uID0gdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gbmV3SW52ZXJzZUpvaW5Db2x1bW47Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSm9pblRhYmxlLkRFRkFVTFRfSU5WRVJTRV9KT0lOX0NPTFVNTiwgb2xkSW52ZXJzZUpvaW5Db2x1bW4sIG5ld0ludmVyc2VKb2luQ29sdW1uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gZGVmYXVsdEludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJaWYgKHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4pOwotCQl9Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZGVmYXVsdEludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyk7Ci0JfQotCi0JcHVibGljIGludCBzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gIXRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCUpvaW5Db2x1bW4gb2xkRGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gdGhpcy5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQkJaWYgKG9sZERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkvL251bGwgdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gbm93IGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkJCS8vaWYgb25lIGRvZXMgbm90IGV4aXN0LCB0aGVyZSBpcyBhbHJlYWR5IGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uLgotCQkJLy9SZW1vdmUgaXQgbm93IHNvIHRoYXQgaXQgZG9lc24ndCBnZXQgcmVtb3ZlZCBkdXJpbmcgYW4gdXBkYXRlIGFuZAotCQkJLy9jYXVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBiZSBzZW50IHRvIHRoZSBVSSBpbiB0aGUgd3Jvbmcgb3JkZXIKLQkJCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gbnVsbDsKLQkJfQotCQlpZiAoZ2V0Sm9pblRhYmxlUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQkvL0FkZCB0aGUgSm9pblRhYmxlIGJlZm9yZSBjcmVhdGluZyB0aGUgc3BlY2lmaWVkSm9pbkNvbHVtbi4KLQkJCS8vT3RoZXJ3aXNlIHdlIHdpbGwgcmVtb3ZlIGl0IGFuZCBjcmVhdGUgYW5vdGhlciBkdXJpbmcgYW4gdXBkYXRlCi0JCQkvL2Zyb20gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKLQkJCWFkZEpvaW5UYWJsZVJlc291cmNlKCk7Ci0JCX0KLQkJSmF2YUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhSm9pbkNvbHVtbih0aGlzLCBjcmVhdGVJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCkpOwotCQl0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucy5hZGQoaW5kZXgsIGludmVyc2VKb2luQ29sdW1uKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtblJlc291cmNlID0gdGhpcy5nZXRUYWJsZVJlc291cmNlKCkuYWRkSW52ZXJzZUpvaW5Db2x1bW4oaW5kZXgpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5pbml0aWFsaXplRnJvbVJlc291cmNlKGpvaW5Db2x1bW5SZXNvdXJjZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChKb2luVGFibGUuU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBpbnZlcnNlSm9pbkNvbHVtbik7Ci0JCWlmIChvbGREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpvaW5UYWJsZS5ERUZBVUxUX0lOVkVSU0VfSk9JTl9DT0xVTU4sIG9sZERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGludmVyc2VKb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgsIEphdmFKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGludmVyc2VKb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucywgSm9pblRhYmxlLlNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbikgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLmluZGV4T2YoaW52ZXJzZUpvaW5Db2x1bW4pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJSmF2YUpvaW5Db2x1bW4gcmVtb3ZlZEpvaW5Db2x1bW4gPSB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOwotCQlpZiAoIWNvbnRhaW5zU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkpIHsKLQkJCS8vY3JlYXRlIHRoZSBkZWZhdWx0Sm9pbkNvbHVtbiBub3cgb3IgdGhpcyB3aWxsIGhhcHBlbiBkdXJpbmcgcHJvamVjdCB1cGRhdGUgCi0JCQkvL2FmdGVyIHJlbW92aW5nIHRoZSBqb2luIGNvbHVtbiBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4gVGhhdCBjYXVzZXMgcHJvYmxlbXMgCi0JCQkvL2luIHRoZSBVSSBiZWNhdXNlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBlbmQgdXAgaW4gdGhlIHdyb25nIG9yZGVyLgotCQkJdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPSBidWlsZEludmVyc2VKb2luQ29sdW1uKG5ldyBOdWxsSm9pbkNvbHVtbihnZXRUYWJsZVJlc291cmNlKCkpKTsKLQkJfQotCQl0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbihpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChKb2luVGFibGUuU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCByZW1vdmVkSm9pbkNvbHVtbik7Ci0JCWlmICh0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkvL2ZpcmUgY2hhbmdlIG5vdGlmaWNhdGlvbiBpZiBhIGRlZmF1bHRKb2luQ29sdW1uIHdhcyBjcmVhdGVkIGFib3ZlCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSm9pblRhYmxlLkRFRkFVTFRfSU5WRVJTRV9KT0lOX0NPTFVNTiwgbnVsbCwgdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4pOwkJCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbl8oSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3Qoam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMsIEpvaW5UYWJsZS5TUEVDSUZJRURfSU5WRVJTRV9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5nZXRUYWJsZVJlc291cmNlKCkubW92ZUludmVyc2VKb2luQ29sdW1uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoSm9pblRhYmxlLlNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCi0KLQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZCgpIHsKLQkJcmV0dXJuIGdldEpvaW5UYWJsZVJlc291cmNlKCkgIT0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZm9yIChKYXZhSm9pbkNvbHVtbiBjb2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5qb2luQ29sdW1ucygpKSkgewotCQkJcmVzdWx0ID0gY29sdW1uLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJZm9yIChKYXZhSm9pbkNvbHVtbiBjb2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5pbnZlcnNlSm9pbkNvbHVtbnMoKSkpIHsKLQkJCXJlc3VsdCA9IGNvbHVtbi5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbi5Pd25lciBjcmVhdGVKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbi5Pd25lciBjcmVhdGVJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IEludmVyc2VKb2luQ29sdW1uT3duZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UpIHsKLQkJdGhpcy5hdHRyaWJ1dGVSZXNvdXJjZSA9IGF0dHJpYnV0ZVJlc291cmNlOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSA9IGdldFRhYmxlUmVzb3VyY2UoKTsKLQkJdGhpcy5pbml0aWFsaXplRnJvbVJlc291cmNlKGpvaW5UYWJsZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZEpvaW5Db2x1bW5zKGpvaW5UYWJsZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZURlZmF1bHRKb2luQ29sdW1uKGpvaW5UYWJsZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyhqb2luVGFibGUpOwotCQl0aGlzLmluaXRpYWxpemVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oam9pblRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkSm9pbkNvbHVtbnMoSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSkgewotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGFubm90YXRpb25zID0gam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbnMoKTsKLQkJCi0JCXdoaWxlKGFubm90YXRpb25zLmhhc05leHQoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5hZGQoYnVpbGRKb2luQ29sdW1uKGFubm90YXRpb25zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEJ1aWxkRGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpICYmIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5pc1JlbGF0aW9uc2hpcE93bmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0Sm9pbkNvbHVtbihKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdEpvaW5Db2x1bW4oKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBidWlsZEpvaW5Db2x1bW4obmV3IE51bGxKb2luQ29sdW1uKGpvaW5UYWJsZSkpOwotCX0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyhKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJCi0JCXdoaWxlKGFubm90YXRpb25zLmhhc05leHQoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMuYWRkKGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW4oYW5ub3RhdGlvbnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQnVpbGREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhY29udGFpbnNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSAmJiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuaXNSZWxhdGlvbnNoaXBPd25lcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKEpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlKSB7Ci0JCWlmICghc2hvdWxkQnVpbGREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihuZXcgTnVsbEpvaW5Db2x1bW4oam9pblRhYmxlKSk7CQkKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlKSB7Ci0JCXRoaXMuYXR0cmlidXRlUmVzb3VyY2UgPSBhdHRyaWJ1dGVSZXNvdXJjZTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGUgPSBnZXRUYWJsZVJlc291cmNlKCk7Ci0JCXRoaXMudXBkYXRlKGpvaW5UYWJsZSk7Ci0JCXRoaXMudXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoam9pblRhYmxlKTsKLQkJdGhpcy51cGRhdGVEZWZhdWx0Sm9pbkNvbHVtbihqb2luVGFibGUpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyhqb2luVGFibGUpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbihqb2luVGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRKb2luQ29sdW1ucyhKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBzcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IHJlc291cmNlSm9pbkNvbHVtbnMgPSBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1ucygpOwotCQkKLQkJd2hpbGUgKGpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJCWpvaW5Db2x1bW4udXBkYXRlKHJlc291cmNlSm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW5fKGpvaW5Db2x1bW4pOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZEpvaW5Db2x1bW4oc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCksIGJ1aWxkSm9pbkNvbHVtbihyZXNvdXJjZUpvaW5Db2x1bW5zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRKb2luQ29sdW1uKEpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlKSB7Ci0JCWlmICghc2hvdWxkQnVpbGREZWZhdWx0Sm9pbkNvbHVtbigpKSB7Ci0JCQlzZXREZWZhdWx0Sm9pbkNvbHVtbihudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldERlZmF1bHRKb2luQ29sdW1uKGJ1aWxkSm9pbkNvbHVtbihuZXcgTnVsbEpvaW5Db2x1bW4oam9pblRhYmxlKSkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbi51cGRhdGUobmV3IE51bGxKb2luQ29sdW1uKGpvaW5UYWJsZSkpOwotCQl9Ci0JfQkKLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyhKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiByZXNvdXJjZUpvaW5Db2x1bW5zID0gam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCQotCQl3aGlsZSAoam9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJam9pbkNvbHVtbi51cGRhdGUocmVzb3VyY2VKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5fKGpvaW5Db2x1bW4pOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKHNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSwgYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihyZXNvdXJjZUpvaW5Db2x1bW5zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbihKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkpIHsKLQkJCXNldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbihudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkgPT0gbnVsbCkgewotCQkJdGhpcy5zZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihuZXcgTnVsbEpvaW5Db2x1bW4oam9pblRhYmxlKSkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4udXBkYXRlKG5ldyBOdWxsSm9pbkNvbHVtbihqb2luVGFibGUpKTsKLQkJfQotCX0JCi0JCi0JcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uIGJ1aWxkSm9pbkNvbHVtbihKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uUmVzb3VyY2UpIHsKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFKb2luQ29sdW1uKHRoaXMsIGNyZWF0ZUpvaW5Db2x1bW5Pd25lcigpKTsKLQkJam9pbkNvbHVtbi5pbml0aWFsaXplRnJvbVJlc291cmNlKGpvaW5Db2x1bW5SZXNvdXJjZSk7Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4gYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uUmVzb3VyY2UpIHsKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFKb2luQ29sdW1uKHRoaXMsIGNyZWF0ZUludmVyc2VKb2luQ29sdW1uT3duZXIoKSk7Ci0JCWpvaW5Db2x1bW4uaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShqb2luQ29sdW1uUmVzb3VyY2UpOwotCQlyZXR1cm4gam9pbkNvbHVtbjsKLQl9Ci0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCWJvb2xlYW4gZG9Db250aW51ZSA9IGNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKLQkJU3RyaW5nIHNjaGVtYSA9IGdldFNjaGVtYSgpOwotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgISBoYXNSZXNvbHZlZFNjaGVtYSgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtzY2hlbWEsIGdldE5hbWUoKX0sIAotCQkJCQkJdGhpcywgCi0JCQkJCQlnZXRTY2hlbWFUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgIWlzUmVzb2x2ZWQoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpfSwgCi0JCQkJCQl0aGlzLCAKLQkJCQkJCWdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gc3RyZWFtID0gam9pbkNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc3RyZWFtLm5leHQoKTsKLQkJCQotCQkJaWYgKGRvQ29udGludWUgJiYgISBqb2luQ29sdW1uLmlzUmVzb2x2ZWQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWpvaW5Db2x1bW4sIGpvaW5Db2x1bW4uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQkJCi0JCQlpZiAoZG9Db250aW51ZSAmJiAhIGpvaW5Db2x1bW4uaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJam9pbkNvbHVtbiwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBzdHJlYW0gPSBpbnZlcnNlSm9pbkNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc3RyZWFtLm5leHQoKTsKLQkJCQotCQkJaWYgKGRvQ29udGludWUgJiYgISBqb2luQ29sdW1uLmlzUmVzb2x2ZWQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWpvaW5Db2x1bW4sIGpvaW5Db2x1bW4uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQkJCi0JCQlpZiAoZG9Db250aW51ZSAmJiAhIGpvaW5Db2x1bW4uaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJam9pbkNvbHVtbiwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQkJCi0JCi0JLyoqCi0JICoganVzdCBhIGxpdHRsZSBjb21tb24gYmVoYXZpb3IKLQkgKi8KLQlhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpvaW5Db2x1bW5Pd25lciBpbXBsZW1lbnRzIEphdmFKb2luQ29sdW1uLk93bmVyCi0JewotCQlBYnN0cmFjdEpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFR5cGVNYXBwaW5nKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCX0KLQotCQkvKioKLQkJICogdGhlIGRlZmF1bHQgdGFibGUgbmFtZSBpcyBhbHdheXMgdmFsaWQgYW5kIGEgc3BlY2lmaWVkIHRhYmxlIG5hbWUKLQkJICogaXMgcHJvaGliaXRlZCAod2hpY2ggd2lsbCBiZSBoYW5kbGVkIGVsc2V3aGVyZSkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKioKLQkJICogdGhlIGpvaW4gY29sdW1uIGNhbiBvbmx5IGJlIG9uIHRoZSBqb2luIHRhYmxlIGl0c2VsZgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdGFibGVJc0FsbG93ZWQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJaWYgKEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiAoR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXROYW1lKCkuZXF1YWxzKHRhYmxlTmFtZSkpID8gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXREYlRhYmxlKCkgOiBudWxsOwotCQl9Ci0JCQotCQkvKioKLQkJICogYnkgZGVmYXVsdCwgdGhlIGpvaW4gY29sdW1uIGlzLCBvYnZpb3VzbHksIGluIHRoZSBqb2luIHRhYmxlOwotCQkgKiBub3Qgc3VyZSB3aGV0aGVyIGl0IGNhbiBiZSBhbnl3aGVyZSBlbHNlLi4uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogb3duZXIgZm9yICJmb3J3YXJkLXBvaW50ZXIiIEpvaW5Db2x1bW5zOwotCSAqIHRoZXNlIHBvaW50IGF0IHRoZSB0YXJnZXQvaW52ZXJzZSBlbnRpdHkKLQkgKi8KLQljbGFzcyBJbnZlcnNlSm9pbkNvbHVtbk93bmVyIGV4dGVuZHMgQWJzdHJhY3RKb2luQ29sdW1uT3duZXIKLQl7Ci0JCXB1YmxpYyBJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnRpdHkgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGRiVGFibGUgPSBzdXBlci5nZXREYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCQlpZiAoZGJUYWJsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGRiVGFibGU7Ci0JCQl9Ci0JCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0VGFyZ2V0RW50aXR5KCk7Ci0JCQlyZXR1cm4gKHRhcmdldEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiB0YXJnZXRFbnRpdHkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBnZXRUYXJnZXRFbnRpdHkoKTsKLQkJCXJldHVybiAodGFyZ2V0RW50aXR5ID09IG51bGwpID8gbnVsbCA6IHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID09IGpvaW5Db2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIG93bmVyIGZvciAiYmFjay1wb2ludGVyIiBKb2luQ29sdW1uczsKLQkgKiB0aGVzZSBwb2ludCBhdCB0aGUgc291cmNlL293bmluZyBlbnRpdHkKLQkgKi8KLQljbGFzcyBKb2luQ29sdW1uT3duZXIgZXh0ZW5kcyBBYnN0cmFjdEpvaW5Db2x1bW5Pd25lcgotCXsKLQkJcHVibGljIEpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW50aXR5IGdldFRhcmdldEVudGl0eSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRFbnRpdHkoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IHRhcmdldEVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCQlpZiAobWFwcGluZyBpbnN0YW5jZW9mIE5vbk93bmluZ01hcHBpbmcpIHsKLQkJCQkJU3RyaW5nIG1hcHBlZEJ5ID0gKChOb25Pd25pbmdNYXBwaW5nKSBtYXBwaW5nKS5nZXRNYXBwZWRCeSgpOwotCQkJCQlpZiAoKG1hcHBlZEJ5ICE9IG51bGwpICYmIG1hcHBlZEJ5LmVxdWFscyhhdHRyaWJ1dGVOYW1lKSkgewotCQkJCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGRiVGFibGUgPSBzdXBlci5nZXREYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCQlpZiAoZGJUYWJsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGRiVGFibGU7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXREYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCkgewotCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IGpvaW5Db2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5qb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2JjYTJjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSAKKwlleHRlbmRzIEFic3RyYWN0SmF2YUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneQoreworCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKKwkKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koSmF2YUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbigpIHsKKwkJcmV0dXJuIGdldEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkuaXNKb2luVGFibGVPdmVycmlkYWJsZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEphdmFKb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFKb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogam9pbiB0YWJsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pblRhYmxlQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKEpvaW5UYWJsZUFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLgorCQkJCWFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS4KKwkJCQlyZW1vdmVBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZSA9PiBjb250ZXh0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAKKwkJCWdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS4KKwkJCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCXN1cGVyLmluaXRpYWxpemUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IAorCQkJZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLgorCQkJCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwkJc3VwZXIudXBkYXRlKCk7CisJfQorCQorCXB1YmxpYyBKb2luVGFibGVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7CisJCXJldHVybiAJKEpvaW5UYWJsZUFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLgorCQkJCWdldE5vbk51bGxBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOWJmMGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc8TWFueVRvTWFueUFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBKYXZhTWFueVRvTWFueU1hcHBpbmcKLXsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigKLQkJCUpQQS5PUkRFUl9CWSwKLQkJCUpQQS5NQVBfS0VZLAotCQkJSlBBLkpPSU5fVEFCTEUpOwotCX0KLQkJCi0JLy8gKioqKioqKioqKiBKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nUmVzb3VyY2UoKS5tYXBwZWRCeVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFwcGVkQnlPblJlc291cmNlTW9kZWwoU3RyaW5nIG1hcHBlZEJ5KSB7Ci0JCWdldE1hcHBpbmdSZXNvdXJjZSgpLnNldE1hcHBlZEJ5KG1hcHBlZEJ5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWRCeShNYW55VG9NYW55QW5ub3RhdGlvbiByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXJldHVybiByZWxhdGlvbnNoaXBNYXBwaW5nLmdldE1hcHBlZEJ5KCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogSU5vbk93bmluZ01hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5SXNWYWxpZChBdHRyaWJ1dGVNYXBwaW5nIG1hcHBlZEJ5TWFwcGluZykgewotCQlTdHJpbmcgbWFwcGVkQnlLZXkgPSBtYXBwZWRCeU1hcHBpbmcuZ2V0S2V5KCk7Ci0JCXJldHVybiAobWFwcGVkQnlLZXkgPT0gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZ1Jlc291cmNlKCkuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDhjNGIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Pd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UKKwlleHRlbmRzIEFic3RyYWN0SmF2YVJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWltcGxlbWVudHMgSmF2YU1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IG1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5OworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5IGpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKKwkKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFNYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlKEphdmFNYW55VG9NYW55TWFwcGluZyBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneSA9IGJ1aWxkTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKTsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgPSBidWlsZEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOworCX0KKwkKKwkKKwlwcm90ZWN0ZWQgSmF2YU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IGJ1aWxkTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSh0aGlzKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgYnVpbGRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kodGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhTWFueVRvTWFueU1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKKwkJcmV0dXJuIChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKSB7CisJCXJldHVybiB0aGlzLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSA9PSBudWxsOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7CisJCXJldHVybiB0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LnJlbGF0aW9uc2hpcElzT3duZWRCeShtYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpvaW5pbmdTdHJhdGVneSBjYWxjdWxhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHsKKwkJaWYgKHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiB0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKKwkJfQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCXJlc3VsdCA9IHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQl9CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJcmVzdWx0ID0gdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogbWFwcGVkIGJ5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgSmF2YU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IGdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuYWRkU3RyYXRlZ3koKTsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIHZvaWQgdW5zZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiB1c2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBnZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpID09IHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyBib29sZWFuIG1heUJlTWFwcGVkQnkoQXR0cmlidXRlTWFwcGluZyBtYXBwZWRCeU1hcHBpbmcpIHsKKwkJcmV0dXJuIG1hcHBlZEJ5TWFwcGluZy5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGpvaW4gdGFibGUgam9pbmluZyBzdHJhdGVneSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEphdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBnZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpID09IHRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSB7CisJCS8vIGpvaW4gdGFibGUgaXMgZGVmYXVsdCBvcHRpb24sIHNvIG5vIG5lZWQgdG8gYWRkIHRvIHJlc291cmNlCisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIHZvaWQgdW5zZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pblRhYmxlKCkgeworCQlyZXR1cm4gZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpID09IG51bGw7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgPT4gY29udGV4dCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWdpZXMoKSB7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuaW5pdGlhbGl6ZSgpOworCQl0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5pbml0aWFsaXplKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUpvaW5pbmdTdHJhdGVnaWVzKCkgeworCQl0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LnVwZGF0ZSgpOworCQl0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS51cGRhdGUoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExY2E0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzxNYW55VG9PbmVBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgSmF2YU1hbnlUb09uZU1hcHBpbmcKLXsKLQotCXB1YmxpYyBHZW5lcmljSmF2YU1hbnlUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY29ycmVzcG9uZGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oCi0JCQlKUEEuSk9JTl9DT0xVTU4sCi0JCQlKUEEuSk9JTl9DT0xVTU5TLAotCQkJSlBBLkpPSU5fVEFCTEUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldE9wdGlvbmFsT25SZXNvdXJjZU1vZGVsKEJvb2xlYW4gbmV3T3B0aW9uYWwpIHsKLQkJdGhpcy5nZXRNYXBwaW5nUmVzb3VyY2UoKS5zZXRPcHRpb25hbChuZXdPcHRpb25hbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE9wdGlvbmFsKE1hbnlUb09uZUFubm90YXRpb24gcmVsYXRpb25zaGlwTWFwcGluZykgewotCQlyZXR1cm4gcmVsYXRpb25zaGlwTWFwcGluZy5nZXRPcHRpb25hbCgpOwotCX0KLQkKLQkvL01hbnlUb09uZSBtYXBwaW5nIGlzIGFsd2F5cyB0aGUgb3duaW5nIHNpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aW9uc2hpcE93bmVyKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhNWQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWV4dGVuZHMgQWJzdHJhY3RKYXZhUmVsYXRpb25zaGlwUmVmZXJlbmNlCisJaW1wbGVtZW50cyBKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisJcHJvdGVjdGVkIGZpbmFsIEphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJCisJCisJcHVibGljIEdlbmVyaWNKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlKEphdmFNYW55VG9PbmVNYXBwaW5nIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgPSBidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwl9CisJCisJCisJcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kodGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhTWFueVRvT25lTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gKEphdmFNYW55VG9PbmVNYXBwaW5nKSBnZXRQYXJlbnQoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNSZWxhdGlvbnNoaXBPd25lcigpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzT3duZWRCeShSZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmcpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pbmluZ1N0cmF0ZWd5IGNhbGN1bGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgeworCQkvLyB0aGUgb25seSBqb2luaW5nIHN0cmF0ZWd5CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJcmVzdWx0ID0gdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGpvaW4gY29sdW1ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gZ2V0UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSA9PSB0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCS8vIGpvaW4gY29sdW1ucyBhcmUgZGVmYXVsdCAoYW5kIG9ubHksIHNvIGZhcikgc3RyYXRlZ3ksIHNvIG5vIG5lZWQKKwkJLy8gdG8gYWRkIHRvIHJlc291cmNlIG1vZGVsCisJfQorCQorCXB1YmxpYyB2b2lkIHVuc2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpIHsKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pbkNvbHVtbigpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgPT4gY29udGV4dCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWdpZXMoKSB7CisJCS8vIGluaXRpYWxpemUgam9pbiBjb2x1bW4gc3RyYXRlZ3kgbGFzdCwgYXMgdGhlIGV4aXN0ZW5jZSBvZiBhIGRlZmF1bHQgCisJCS8vIGpvaW4gY29sdW1uIGlzIGRlcGVuZGVudCBvbiB0aGUgb3RoZXIgbWVjaGFuaXNtcyAoam9pbiB0YWJsZSkgbm90IAorCQkvLyBiZWluZyBzcGVjaWZpZWQKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmluaXRpYWxpemUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlSm9pbmluZ1N0cmF0ZWdpZXMoKSB7CisJCS8vIHVwZGF0ZSBqb2luIGNvbHVtbiBzdHJhdGVneSBsYXN0LCBhcyB0aGUgZXhpc3RlbmNlIG9mIGEgZGVmYXVsdCBqb2luIAorCQkvLyBjb2x1bW4gaXMgZGVwZW5kZW50IG9uIHRoZSBvdGhlciBtZWNoYW5pc21zIChqb2luIHRhYmxlKSBub3QgYmVpbmcgCisJCS8vIHNwZWNpZmllZAorCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kudXBkYXRlKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NTI3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDIwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kKKwlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlIAorCWltcGxlbWVudHMgSmF2YU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5Cit7CisJcHJvdGVjdGVkIE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBtYXBwaW5nQW5ub3RhdGlvbjsKKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZEJ5QXR0cmlidXRlOworCQorCQorCXB1YmxpYyBHZW5lcmljSmF2YU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KEphdmFPd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YU93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEphdmFPd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisJCisJcHVibGljIEphdmFPd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBKYXZhUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXNzb2NpYXRpb24oKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gcmVsYXRpb25zaGlwSXNPd25lZEJ5KFJlbGF0aW9uc2hpcE1hcHBpbmcgb3RoZXJNYXBwaW5nKSB7CisJCVN0cmluZyB0aGlzRW50aXR5ID0gCisJCQkoZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0RW50aXR5KCkpID09IG51bGwgPworCQkJCW51bGwgOiBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRFbnRpdHkoKS5nZXROYW1lKCk7CisJCVN0cmluZyB0YXJnZXRFbnRpdHkgPSAKKwkJCShnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSA9PSBudWxsKSA/CisJCQkJbnVsbCA6IGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLmdldE5hbWUoKTsKKwkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgKKwkJCQl0aGlzRW50aXR5LAorCQkJCXRhcmdldEVudGl0eSkKKwkJCSYmIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgKKwkJCQlnZXRNYXBwZWRCeUF0dHJpYnV0ZSgpLCAKKwkJCQlvdGhlck1hcHBpbmcuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeUF0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMubWFwcGVkQnlBdHRyaWJ1dGU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5QXR0cmlidXRlKFN0cmluZyBuZXdNYXBwZWRCeUF0dHJpYnV0ZSkgeworCQlTdHJpbmcgb2xkTWFwcGVkQnlBdHRyaWJ1dGUgPSB0aGlzLm1hcHBlZEJ5QXR0cmlidXRlOworCQl0aGlzLm1hcHBlZEJ5QXR0cmlidXRlID0gbmV3TWFwcGVkQnlBdHRyaWJ1dGU7CisJCXRoaXMubWFwcGluZ0Fubm90YXRpb24uc2V0TWFwcGVkQnkobmV3TWFwcGVkQnlBdHRyaWJ1dGUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1BUFBFRF9CWV9BVFRSSUJVVEVfUFJPUEVSVFksIG9sZE1hcHBlZEJ5QXR0cmlidXRlLCBuZXdNYXBwZWRCeUF0dHJpYnV0ZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldE1hcHBlZEJ5QXR0cmlidXRlXyhTdHJpbmcgbmV3TWFwcGVkQnlBdHRyaWJ1dGUpIHsKKwkJU3RyaW5nIG9sZE1hcHBlZEJ5QXR0cmlidXRlID0gdGhpcy5tYXBwZWRCeUF0dHJpYnV0ZTsKKwkJdGhpcy5tYXBwZWRCeUF0dHJpYnV0ZSA9IG5ld01hcHBlZEJ5QXR0cmlidXRlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1BUFBFRF9CWV9BVFRSSUJVVEVfUFJPUEVSVFksIG9sZE1hcHBlZEJ5QXR0cmlidXRlLCBuZXdNYXBwZWRCeUF0dHJpYnV0ZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFN0cmF0ZWd5KCkgeworCQlpZiAodGhpcy5tYXBwZWRCeUF0dHJpYnV0ZSA9PSBudWxsKSB7CisJCQlzZXRNYXBwZWRCeUF0dHJpYnV0ZSgiIik7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlU3RyYXRlZ3koKSB7CisJCWlmICh0aGlzLm1hcHBlZEJ5QXR0cmlidXRlICE9IG51bGwpIHsKKwkJCXNldE1hcHBlZEJ5QXR0cmlidXRlKG51bGwpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CisJCXRoaXMubWFwcGluZ0Fubm90YXRpb24gPSB0aGlzLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCXRoaXMubWFwcGVkQnlBdHRyaWJ1dGUgPSB0aGlzLm1hcHBpbmdBbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJdGhpcy5tYXBwaW5nQW5ub3RhdGlvbiA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJc2V0TWFwcGVkQnlBdHRyaWJ1dGVfKHRoaXMubWFwcGluZ0Fubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlpZiAodGhpcy5tYXBwaW5nQW5ub3RhdGlvbi5tYXBwZWRCeVRvdWNoZXMocG9zLCBhc3RSb290KSkgeworCQkJcmVzdWx0ID0gamF2YUNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoZmlsdGVyKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgeworCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmFsbFRhcmdldEVudGl0eUF0dHJpYnV0ZU5hbWVzKCk7CQorCX0KKwkKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgeworCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPih0aGlzLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSwgZmlsdGVyKTsKKwl9CisJCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKGZpbHRlcikpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJCisJCWlmIChnZXRNYXBwZWRCeUF0dHJpYnV0ZSgpID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJRW50aXR5IHRhcmdldEVudGl0eSA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7CisJCWlmICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgeworCQkJcmV0dXJuOyAgLy8gbnVsbCB0YXJnZXQgZW50aXR5IGlzIHZhbGlkYXRlZCBlbHNld2hlcmUKKwkJfQorCQkKKwkJQXR0cmlidXRlTWFwcGluZyBtYXBwZWRCeU1hcHBpbmcgPSB0YXJnZXRFbnRpdHkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcodGhpcy5tYXBwZWRCeUF0dHJpYnV0ZSk7CisJCQorCQlpZiAobWFwcGVkQnlNYXBwaW5nID09IG51bGwpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfVU5SRVNPTFZFRF9NQVBQRURfQlksCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5tYXBwZWRCeUF0dHJpYnV0ZX0sCisJCQkJCXRoaXMsCisJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQorCQkJCSkKKwkJCSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmICggISB0aGlzLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLm1heUJlTWFwcGVkQnkobWFwcGVkQnlNYXBwaW5nKSkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19JTlZBTElEX01BUFBFRF9CWSwKKwkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLm1hcHBlZEJ5QXR0cmlidXRlfSwgCisJCQkJCXRoaXMsCisJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQorCQkJCSkKKwkJCSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCS8vIGlmIG1hcHBlZEJ5TWFwcGluZyBpcyBub3QgYSByZWxhdGlvbnNoaXAgb3duZXIsIHRoZW4gaXQgc2hvdWxkIGhhdmUgCisJCS8vIGJlZW4gZmxhZ2dlZCBpbiBhYm92ZSBydWxlIChtYXBwZWRCeUlzVmFsaWQpCisJCWlmICghICgoUmVsYXRpb25zaGlwTWFwcGluZykgbWFwcGVkQnlNYXBwaW5nKS5pc1JlbGF0aW9uc2hpcE93bmVyKCkpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfTUFQUEVEX0JZX09OX0JPVEhfU0lERVMsCisJCQkJCXRoaXMsCisJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQorCQkJCSkKKwkJCSk7CisJCX0KKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLm1hcHBpbmdBbm5vdGF0aW9uLmdldE1hcHBlZEJ5VGV4dFJhbmdlKGFzdFJvb3QpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFwcGVkU3VwZXJjbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBlZTc0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYXBwZWRTdXBlcmNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZENsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQ2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU1hcHBlZFN1cGVyY2xhc3MgZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZwotCWltcGxlbWVudHMgSmF2YU1hcHBlZFN1cGVyY2xhc3MKLXsKLQotCXByb3RlY3RlZCBTdHJpbmcgaWRDbGFzczsKLQotCXB1YmxpYyBHZW5lcmljSmF2YU1hcHBlZFN1cGVyY2xhc3MoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFwcGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY29ycmVzcG9uZGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oCi0JCQlKUEEuSURfQ0xBU1MsCi0JCQlKUEEuRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUywKLQkJCUpQQS5FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTLAotCQkJSlBBLkVOVElUWV9MSVNURU5FUlMsCi0JCQlKUEEuUFJFX1BFUlNJU1QsCi0JCQlKUEEuUE9TVF9QRVJTSVNULAotCQkJSlBBLlBSRV9SRU1PVkUsCi0JCQlKUEEuUE9TVF9SRU1PVkUsCi0JCQlKUEEuUFJFX1VQREFURSwKLQkJCUpQQS5QT1NUX1VQREFURSwKLQkJCUpQQS5QT1NUX0xPQUQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmlkQ2xhc3M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldElkQ2xhc3MoU3RyaW5nIG5ld0lkQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZElkQ2xhc3MgPSB0aGlzLmlkQ2xhc3M7Ci0JCXRoaXMuaWRDbGFzcyA9IG5ld0lkQ2xhc3M7Ci0JCWlmIChuZXdJZENsYXNzICE9IG9sZElkQ2xhc3MpIHsKLQkJCWlmIChuZXdJZENsYXNzICE9IG51bGwpIHsKLQkJCQlpZiAoZ2V0SWRDbGFzc1Jlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCQlhZGRJZENsYXNzUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQkJZ2V0SWRDbGFzc1Jlc291cmNlKCkuc2V0VmFsdWUobmV3SWRDbGFzcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVJZENsYXNzUmVzb3VyY2UoKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElkQ2xhc3MuSURfQ0xBU1NfUFJPUEVSVFksIG9sZElkQ2xhc3MsIG5ld0lkQ2xhc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRJZENsYXNzXyhTdHJpbmcgbmV3SWRDbGFzcykgewotCQlTdHJpbmcgb2xkSWRDbGFzcyA9IHRoaXMuaWRDbGFzczsKLQkJdGhpcy5pZENsYXNzID0gbmV3SWRDbGFzczsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChJZENsYXNzLklEX0NMQVNTX1BST1BFUlRZLCBvbGRJZENsYXNzLCBuZXdJZENsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSWRDbGFzc0Fubm90YXRpb24gZ2V0SWRDbGFzc1Jlc291cmNlKCkgewotCQlyZXR1cm4gKElkQ2xhc3NBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRDbGFzc1Jlc291cmNlKCkgewotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSWRDbGFzc1Jlc291cmNlKCkgewotCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNPZih0aGlzLm92ZXJyaWRhYmxlQXR0cmlidXRlcygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG8pIHsKLQkJCQlyZXR1cm4gby5pc092ZXJyaWRhYmxlQXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc09mKHRoaXMub3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG8pIHsKLQkJCQlyZXR1cm4gby5pc092ZXJyaWRhYmxlQXNzb2NpYXRpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBuYW1lc09mKEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgU3RyaW5nPihhdHRyaWJ1dGVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tUmVzb3VyY2UoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVJlc291cmNlKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpOwotCQl0aGlzLmluaXRpYWxpemVJZENsYXNzKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJZENsYXNzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSkgewotCQlJZENsYXNzQW5ub3RhdGlvbiBpZENsYXNzUmVzb3VyY2UgPSAoSWRDbGFzc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWlmIChpZENsYXNzUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdGhpcy5pZENsYXNzID0gaWRDbGFzc1Jlc291cmNlLmdldFZhbHVlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlzdXBlci51cGRhdGUocGVyc2lzdGVudFR5cGVSZXNvdXJjZSk7Ci0JCXRoaXMudXBkYXRlSWRDbGFzcyhwZXJzaXN0ZW50VHlwZVJlc291cmNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSWRDbGFzcyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UpIHsKLQkJSWRDbGFzc0Fubm90YXRpb24gaWRDbGFzcyA9IChJZENsYXNzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJaWYgKGlkQ2xhc3MgIT0gbnVsbCkgewotCQkJc2V0SWRDbGFzc18oaWRDbGFzcy5nZXRWYWx1ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldElkQ2xhc3NfKG51bGwpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTmFtZWROYXRpdmVRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU5hbWVkTmF0aXZlUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4NGVkZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTmFtZWROYXRpdmVRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFOYW1lZE5hdGl2ZVF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RKYXZhUXVlcnkKLQlpbXBsZW1lbnRzIEphdmFOYW1lZE5hdGl2ZVF1ZXJ5Ci17Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdENsYXNzOwotCi0JcHJvdGVjdGVkIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nOwotCi0JcHVibGljIEdlbmVyaWNKYXZhTmFtZWROYXRpdmVRdWVyeShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGdldFF1ZXJ5UmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHN1cGVyLmdldFF1ZXJ5UmVzb3VyY2UoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRSZXN1bHRDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMucmVzdWx0Q2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0Q2xhc3MoU3RyaW5nIG5ld1Jlc3VsdENsYXNzKSB7Ci0JCVN0cmluZyBvbGRSZXN1bHRDbGFzcyA9IHRoaXMucmVzdWx0Q2xhc3M7Ci0JCXRoaXMucmVzdWx0Q2xhc3MgPSBuZXdSZXN1bHRDbGFzczsKLQkJZ2V0UXVlcnlSZXNvdXJjZSgpLnNldFJlc3VsdENsYXNzKG5ld1Jlc3VsdENsYXNzKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOYW1lZE5hdGl2ZVF1ZXJ5LlJFU1VMVF9DTEFTU19QUk9QRVJUWSwgb2xkUmVzdWx0Q2xhc3MsIG5ld1Jlc3VsdENsYXNzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVzdWx0Q2xhc3NfKFN0cmluZyBuZXdSZXN1bHRDbGFzcykgewotCQlTdHJpbmcgb2xkUmVzdWx0Q2xhc3MgPSB0aGlzLnJlc3VsdENsYXNzOwotCQl0aGlzLnJlc3VsdENsYXNzID0gbmV3UmVzdWx0Q2xhc3M7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTmFtZWROYXRpdmVRdWVyeS5SRVNVTFRfQ0xBU1NfUFJPUEVSVFksIG9sZFJlc3VsdENsYXNzLCBuZXdSZXN1bHRDbGFzcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXN1bHRTZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5yZXN1bHRTZXRNYXBwaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc3VsdFNldE1hcHBpbmcoU3RyaW5nIG5ld1Jlc3VsdFNldE1hcHBpbmcpIHsKLQkJU3RyaW5nIG9sZFJlc3VsdFNldE1hcHBpbmcgPSB0aGlzLnJlc3VsdFNldE1hcHBpbmc7Ci0JCXRoaXMucmVzdWx0U2V0TWFwcGluZyA9IG5ld1Jlc3VsdFNldE1hcHBpbmc7Ci0JCWdldFF1ZXJ5UmVzb3VyY2UoKS5zZXRSZXN1bHRTZXRNYXBwaW5nKG5ld1Jlc3VsdFNldE1hcHBpbmcpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5hbWVkTmF0aXZlUXVlcnkuUkVTVUxUX1NFVF9NQVBQSU5HX1BST1BFUlRZLCBvbGRSZXN1bHRTZXRNYXBwaW5nLCBuZXdSZXN1bHRTZXRNYXBwaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZXN1bHRTZXRNYXBwaW5nXyhTdHJpbmcgbmV3UmVzdWx0U2V0TWFwcGluZykgewotCQlTdHJpbmcgb2xkUmVzdWx0U2V0TWFwcGluZyA9IHRoaXMucmVzdWx0U2V0TWFwcGluZzsKLQkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nID0gbmV3UmVzdWx0U2V0TWFwcGluZzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOYW1lZE5hdGl2ZVF1ZXJ5LlJFU1VMVF9TRVRfTUFQUElOR19QUk9QRVJUWSwgb2xkUmVzdWx0U2V0TWFwcGluZywgbmV3UmVzdWx0U2V0TWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBxdWVyeVJlc291cmNlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tUmVzb3VyY2UocXVlcnlSZXNvdXJjZSk7Ci0JCXRoaXMucmVzdWx0Q2xhc3MgPSBxdWVyeVJlc291cmNlLmdldFJlc3VsdENsYXNzKCk7Ci0JCXRoaXMucmVzdWx0U2V0TWFwcGluZyA9IHF1ZXJ5UmVzb3VyY2UuZ2V0UmVzdWx0U2V0TWFwcGluZygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gcXVlcnlSZXNvdXJjZSkgewotCQlzdXBlci51cGRhdGUocXVlcnlSZXNvdXJjZSk7Ci0JCXRoaXMuc2V0UmVzdWx0Q2xhc3NfKHF1ZXJ5UmVzb3VyY2UuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCXRoaXMuc2V0UmVzdWx0U2V0TWFwcGluZ18ocXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU5hbWVkUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOYW1lZFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliODM0MDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU5hbWVkUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU5hbWVkUXVlcnkgZXh0ZW5kcyBBYnN0cmFjdEphdmFRdWVyeSBpbXBsZW1lbnRzIEphdmFOYW1lZFF1ZXJ5Ci17Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhTmFtZWRRdWVyeShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBnZXRRdWVyeVJlc291cmNlKCkgewotCQlyZXR1cm4gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBzdXBlci5nZXRRdWVyeVJlc291cmNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBxdWVyeVJlc291cmNlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tUmVzb3VyY2UocXVlcnlSZXNvdXJjZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBxdWVyeVJlc291cmNlKSB7Ci0JCXN1cGVyLnVwZGF0ZShxdWVyeVJlc291cmNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRiNjkyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZyBleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8SmF2YVJlc291cmNlTm9kZT4KLXsKLQlwdWJsaWMgR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VOb2RlIGdldE1hcHBpbmdSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTY4MmRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc8T25lVG9NYW55QW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFPbmVUb01hbnlNYXBwaW5nCi17Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigKLQkJCUpQQS5PUkRFUl9CWSwKLQkJCUpQQS5NQVBfS0VZLAotCQkJSlBBLkpPSU5fVEFCTEUsCi0JCQlKUEEuSk9JTl9DT0xVTU4sCi0JCQlKUEEuSk9JTl9DT0xVTU5TKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCS8vICoqKioqKioqKiogSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXBwZWRCeVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZ1Jlc291cmNlKCkubWFwcGVkQnlUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFwcGVkQnlPblJlc291cmNlTW9kZWwoU3RyaW5nIG1hcHBlZEJ5KSB7Ci0JCXRoaXMuZ2V0TWFwcGluZ1Jlc291cmNlKCkuc2V0TWFwcGVkQnkobWFwcGVkQnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZEJ5KE9uZVRvTWFueUFubm90YXRpb24gcmVsYXRpb25zaGlwTWFwcGluZykgewotCQlyZXR1cm4gcmVsYXRpb25zaGlwTWFwcGluZy5nZXRNYXBwZWRCeSgpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogSU5vbk93bmluZ01hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5SXNWYWxpZChBdHRyaWJ1dGVNYXBwaW5nIG1hcHBlZEJ5TWFwcGluZykgewotCQlTdHJpbmcgbWFwcGVkQnlLZXkgPSBtYXBwZWRCeU1hcHBpbmcuZ2V0S2V5KCk7Ci0JCXJldHVybiAobWFwcGVkQnlLZXkgPT0gTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmdSZXNvdXJjZSgpLmdldE1hcHBlZEJ5VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNDU4MWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5vbk93bmluZ01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzxPbmVUb09uZUFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBKYXZhT25lVG9PbmVNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWRCeTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1uczsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+KCk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KAotCQkJSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLAotCQkJSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUywKLQkJCUpQQS5KT0lOX0NPTFVNTiwKLQkJCUpQQS5KT0lOX0NPTFVNTlMsCi0JCQlKUEEuSk9JTl9UQUJMRSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKSB7Ci0JCXJldHVybiBnZXRNYXBwZWRCeSgpID09IG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgcHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLCBjcmVhdGVKb2luQ29sdW1uT3duZXIoKSk7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLmFkZChpbmRleCwgcGtKb2luQ29sdW1uKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtblJlc291cmNlID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihpbmRleCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXBrSm9pbkNvbHVtbi5pbml0aWFsaXplRnJvbVJlc291cmNlKHBrSm9pbkNvbHVtblJlc291cmNlKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKE9uZVRvT25lTWFwcGluZy5QUklNQVlfS0VZX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcGtKb2luQ29sdW1uKTsKLQkJcmV0dXJuIHBrSm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgsIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGpvaW5Db2x1bW4sIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLCBPbmVUb09uZU1hcHBpbmcuUFJJTUFZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaW5kZXhPZihwa0pvaW5Db2x1bW4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiByZW1vdmVkUGtKb2luQ29sdW1uID0gdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKLQkJZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihpbmRleCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChPbmVUb09uZU1hcHBpbmcuUFJJTUFZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHJlbW92ZWRQa0pvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uXyhKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3Qoam9pbkNvbHVtbiwgdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIE9uZVRvT25lTWFwcGluZy5QUklNQVlfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWZpcmVJdGVtTW92ZWQoT25lVG9PbmVNYXBwaW5nLlBSSU1BWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAhdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbmV3TWFwcGVkQnkpIHsKLQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gdGhpcy5tYXBwZWRCeTsKLQkJdGhpcy5tYXBwZWRCeSA9IG5ld01hcHBlZEJ5OwotCQl0aGlzLmdldE1hcHBpbmdSZXNvdXJjZSgpLnNldE1hcHBlZEJ5KG5ld01hcHBlZEJ5KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOb25Pd25pbmdNYXBwaW5nLk1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkTWFwcGVkQnksIG5ld01hcHBlZEJ5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwZWRCeV8oU3RyaW5nIG5ld01hcHBlZEJ5KSB7Ci0JCVN0cmluZyBvbGRNYXBwZWRCeSA9IHRoaXMubWFwcGVkQnk7Ci0JCXRoaXMubWFwcGVkQnkgPSBuZXdNYXBwZWRCeTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOb25Pd25pbmdNYXBwaW5nLk1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkTWFwcGVkQnksIG5ld01hcHBlZEJ5KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXBwZWRCeUlzVmFsaWQoQXR0cmlidXRlTWFwcGluZyBtYXBwZWRCeU1hcHBpbmcpIHsKLQkJU3RyaW5nIG1hcHBlZEJ5S2V5ID0gbWFwcGVkQnlNYXBwaW5nLmdldEtleSgpOwotCQlyZXR1cm4gKG1hcHBlZEJ5S2V5ID09IE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRPcHRpb25hbE9uUmVzb3VyY2VNb2RlbChCb29sZWFuIG5ld09wdGlvbmFsKSB7Ci0JCXRoaXMuZ2V0TWFwcGluZ1Jlc291cmNlKCkuc2V0T3B0aW9uYWwobmV3T3B0aW9uYWwpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmdSZXNvdXJjZSgpLmdldE1hcHBlZEJ5VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nUmVzb3VyY2UoKS5tYXBwZWRCeVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMubWFwcGVkQnlUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLnF1b3RlZENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoZmlsdGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lUmVzb3VyY2UpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShvbmVUb09uZVJlc291cmNlKTsKLQkJdGhpcy5tYXBwZWRCeSA9IG9uZVRvT25lUmVzb3VyY2UuZ2V0TWFwcGVkQnkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRPcHRpb25hbChPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmVSZXNvdXJjZSkgewotCQlyZXR1cm4gb25lVG9PbmVSZXNvdXJjZS5nZXRPcHRpb25hbCgpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tUmVzb3VyY2UocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy5pbml0aWFsaXplUHJpbWFyeUtleUpvaW5Db2x1bW5zKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGFubm90YXRpb25zID0gcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJd2hpbGUoYW5ub3RhdGlvbnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhbm5vdGF0aW9ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZSkgewotCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIGNyZWF0ZUpvaW5Db2x1bW5Pd25lcigpKTsKLQkJcGtKb2luQ29sdW1uLmluaXRpYWxpemVGcm9tUmVzb3VyY2UocHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZSk7Ci0JCXJldHVybiBwa0pvaW5Db2x1bW47Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmVSZXNvdXJjZSkgewotCQlzdXBlci51cGRhdGUob25lVG9PbmVSZXNvdXJjZSk7Ci0JCXRoaXMuc2V0TWFwcGVkQnlfKG9uZVRvT25lUmVzb3VyY2UuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXN1cGVyLnVwZGF0ZShyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLnVwZGF0ZVByaW1hcnlLZXlKb2luQ29sdW1ucyhyZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcGtKb2luQ29sdW1ucyA9IHByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gcmVzb3VyY2VQa0pvaW5Db2x1bW5zID0gcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJd2hpbGUgKHBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gcGtKb2luQ29sdW1ucy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VQa0pvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJCXBrSm9pbkNvbHVtbi51cGRhdGUoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VQa0pvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbl8ocGtKb2luQ29sdW1uKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCWFkZFByaW1hcnlLZXlKb2luQ29sdW1uKHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpLCBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlUGtKb2luQ29sdW1ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQotCi0JLy8qKioqKioqKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCQotCQlpZiAodGhpcy5nZXRNYXBwZWRCeSgpICE9IG51bGwpIHsKLQkJCWFkZE1hcHBlZEJ5TWVzc2FnZXMobWVzc2FnZXMgLGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGFkZEpvaW5Db2x1bW5NZXNzYWdlcygpIHsKLQkJaWYgKGNvbnRhaW5zUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgJiYgIWNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdXBlci5hZGRKb2luQ29sdW1uTWVzc2FnZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGVkQnlNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nIG1hcHBlZEJ5ID0gdGhpcy5nZXRNYXBwZWRCeSgpOwotCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQkKLQkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7Ci0JCQkvLyBhbHJlYWR5IGhhdmUgdmFsaWRhdGlvbiBtZXNzYWdlcyBmb3IgdGhhdAotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHRhcmdldEVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLnJlc29sdmVBdHRyaWJ1dGUobWFwcGVkQnkpOwotCQkKLQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX1VOUkVTT0xWRURfTUFQUEVEX0JZLAotCQkJCQkJbmV3IFN0cmluZ1tdIHttYXBwZWRCeX0sIAotCQkJCQkJdGhpcywgdGhpcy5nZXRNYXBwZWRCeVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoISB0aGlzLm1hcHBlZEJ5SXNWYWxpZChhdHRyaWJ1dGUuZ2V0TWFwcGluZygpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19JTlZBTElEX01BUFBFRF9CWSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7bWFwcGVkQnl9LCAKLQkJCQkJCXRoaXMsIHRoaXMuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTm9uT3duaW5nTWFwcGluZyBtYXBwZWRCeU1hcHBpbmc7Ci0JCXRyeSB7Ci0JCQltYXBwZWRCeU1hcHBpbmcgPSAoTm9uT3duaW5nTWFwcGluZykgYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgewotCQkJLy8gdGhlcmUgaXMgbm8gZXJyb3IgdGhlbgotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAobWFwcGVkQnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkgIT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19NQVBQRURfQllfT05fQk9USF9TSURFUywKLQkJCQkJCXRoaXMsIHRoaXMuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGY4M2VmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWV4dGVuZHMgQWJzdHJhY3RKYXZhUmVsYXRpb25zaGlwUmVmZXJlbmNlCisJaW1wbGVtZW50cyBKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IG1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5OworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgcHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJCisJCisJcHVibGljIEdlbmVyaWNKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoSmF2YU9uZVRvT25lTWFwcGluZyBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneSA9IGJ1aWxkTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKTsKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5ID0gYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgPSBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJfQorCQorCQorCXByb3RlY3RlZCBKYXZhTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kgYnVpbGRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KHRoaXMpOworCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSh0aGlzKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kodGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhT25lVG9PbmVNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7CisJCXJldHVybiAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb24oKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNSZWxhdGlvbnNoaXBPd25lcigpIHsKKwkJcmV0dXJuIHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSA9PSBudWxsOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7CisJCXJldHVybiB0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LnJlbGF0aW9uc2hpcElzT3duZWRCeShtYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpvaW5pbmdTdHJhdGVneSBjYWxjdWxhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHsKKwkJaWYgKHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKKwkJfQorCQllbHNlIGlmICh0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSA+IDApIHsKKwkJCXJldHVybiB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKKwkJfQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCXJlc3VsdCA9IHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQl9CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJcmVzdWx0ID0gdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIG1hcHBlZCBieSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEphdmFNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSBnZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIGdldFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgPT0gdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuYWRkU3RyYXRlZ3koKTsKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7CisJCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIHZvaWQgdW5zZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBtYXlCZU1hcHBlZEJ5KEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGVkQnlNYXBwaW5nKSB7CisJCXJldHVybiBtYXBwZWRCeU1hcHBpbmcuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogam9pbiBjb2x1bW5zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gdXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBnZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpID09IHRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpIHsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7CisJCS8vIGpvaW4gY29sdW1ucyBhcmUgZGVmYXVsdCwgc28gbm8gbmVlZCB0byBhZGQgYW5ub3RhdGlvbnMKKwl9CisJCisJcHVibGljIHZvaWQgdW5zZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luQ29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkgPT0gbnVsbCAKKwkJCSYmIHRoaXMuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgPT0gMDsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiB1c2VzUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBnZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpID09IHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVuc2V0UHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlID0+IGNvbnRleHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVnaWVzKCkgeworCQl0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmluaXRpYWxpemUoKTsKKwkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5pbml0aWFsaXplKCk7CisJCQorCQkvLyBpbml0aWFsaXplIGpvaW4gY29sdW1ucyBsYXN0LCBhcyB0aGUgZXhpc3RlbmNlIG9mIGEgZGVmYXVsdCBqb2luIAorCQkvLyBjb2x1bW4gaXMgZGVwZW5kZW50IG9uIHRoZSBvdGhlciBtZWNoYW5pc21zIChtYXBwZWRCeSwgam9pbiB0YWJsZSkKKwkJLy8gbm90IGJlaW5nIHNwZWNpZmllZAorCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuaW5pdGlhbGl6ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKb2luaW5nU3RyYXRlZ2llcygpIHsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS51cGRhdGUoKTsKKwkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS51cGRhdGUoKTsKKwkJCisJCS8vIHVwZGF0ZSBqb2luIGNvbHVtbnMgbGFzdCwgYXMgdGhlIGV4aXN0ZW5jZSBvZiBhIGRlZmF1bHQgam9pbiAKKwkJLy8gY29sdW1uIGlzIGRlcGVuZGVudCBvbiB0aGUgb3RoZXIgbWVjaGFuaXNtcyAobWFwcGVkQnksIGpvaW4gdGFibGUpCisJCS8vIG5vdCBiZWluZyBzcGVjaWZpZWQKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnVwZGF0ZSgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzBjZmNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTdHJ1Y3R1cmVOb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGRlZmF1bHRNYXBwaW5nOwotCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nIHNwZWNpZmllZE1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIEphdmFTdHJ1Y3R1cmVOb2Rlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JRDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlKSB7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0gcGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlOwotCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUocGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRNYXBwaW5nKHBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSk7Ci0JCWluaXRpYWxpemVTcGVjaWZpZWRNYXBwaW5nKHBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0TWFwcGluZyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSkgewotCQl0aGlzLmRlZmF1bHRNYXBwaW5nID0gZ2V0SnBhUGxhdGZvcm0oKS5idWlsZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZyh0aGlzKTsKLQkJdGhpcy5kZWZhdWx0TWFwcGluZy5pbml0aWFsaXplRnJvbVJlc291cmNlKHBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZE1hcHBpbmcoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlUmVzb3VyY2UpIHsKLQkJU3RyaW5nIGphdmFNYXBwaW5nQW5ub3RhdGlvbk5hbWUgPSB0aGlzLmphdmFNYXBwaW5nQW5ub3RhdGlvbk5hbWUocGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlKTsKLQkJdGhpcy5zcGVjaWZpZWRNYXBwaW5nID0gY3JlYXRlSmF2YUF0dHJpYnV0ZU1hcHBpbmdGcm9tQW5ub3RhdGlvbihqYXZhTWFwcGluZ0Fubm90YXRpb25OYW1lLCBwZXJzaXN0ZW50QXR0cmlidXRlUmVzb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQl9Ci0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIChKYXZhUGVyc2lzdGVudFR5cGUpIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIEphdmFUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmlzT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5pc0lkTWFwcGluZygpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBnZXREZWZhdWx0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogY2xpZW50cyBkbyBub3Qgc2V0IHRoZSAiZGVmYXVsdCIgbWFwcGluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRNYXBwaW5nKEphdmFBdHRyaWJ1dGVNYXBwaW5nIG5ld0RlZmF1bHRNYXBwaW5nKSB7Ci0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG9sZE1hcHBpbmcgPSB0aGlzLmRlZmF1bHRNYXBwaW5nOwotCQl0aGlzLmRlZmF1bHRNYXBwaW5nID0gbmV3RGVmYXVsdE1hcHBpbmc7CQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBlcnNpc3RlbnRBdHRyaWJ1dGUuREVGQVVMVF9NQVBQSU5HX1BST1BFUlRZLCBvbGRNYXBwaW5nLCBuZXdEZWZhdWx0TWFwcGluZyk7Ci0JfQotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGdldFNwZWNpZmllZE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogY2xpZW50cyBkbyBub3Qgc2V0IHRoZSAic3BlY2lmaWVkIiBtYXBwaW5nOwotCSAqIHVzZSAjc2V0TWFwcGluZ0tleShTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTWFwcGluZyhKYXZhQXR0cmlidXRlTWFwcGluZyBuZXdTcGVjaWZpZWRNYXBwaW5nKSB7Ci0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG9sZE1hcHBpbmcgPSB0aGlzLnNwZWNpZmllZE1hcHBpbmc7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwcGluZyA9IG5ld1NwZWNpZmllZE1hcHBpbmc7CQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBlcnNpc3RlbnRBdHRyaWJ1dGUuU1BFQ0lGSUVEX01BUFBJTkdfUFJPUEVSVFksIG9sZE1hcHBpbmcsIG5ld1NwZWNpZmllZE1hcHBpbmcpOwotCX0KLQotCQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTWFwcGluZyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkTWFwcGluZyA6IHRoaXMuZGVmYXVsdE1hcHBpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuZ2V0S2V5KCk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gImRlZmF1bHQiIG1hcHBpbmcgZm9yIHRoZSBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TWFwcGluZy5nZXRLZXkoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyAic3BlY2lmaWVkIiBtYXBwaW5nIGZvciB0aGUgYXR0cmlidXRlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnNwZWNpZmllZE1hcHBpbmcuZ2V0S2V5KCk7Ci0JfQotCi0JLy8gVE9ETyBzdXBwb3J0IG1vcnBoaW5nIG1hcHBpbmdzLCBpLmUuIGNvcHlpbmcgY29tbW9uIHNldHRpbmdzIG92ZXIKLQkvLyB0byB0aGUgbmV3IG1hcHBpbmc7IHRoaXMgY2FuJ3QgYmUgZG9uZSBpbiB0aGUgc2FtZSB3YXMgYXMgWG1sQXR0cmlidXRlTWFwcGluZwotCS8vIHNpbmNlIHdlIGRvbid0IGtub3cgYWxsIHRoZSBwb3NzaWJsZSBtYXBwaW5nIHR5cGVzCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTWFwcGluZ0tleShTdHJpbmcgbmV3S2V5KSB7Ci0JCWlmIChuZXdLZXkgPT0gZ2V0U3BlY2lmaWVkTWFwcGluZ0tleSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgb2xkTWFwcGluZyA9IGdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZyA9IGNyZWF0ZUphdmFBdHRyaWJ1dGVNYXBwaW5nRnJvbU1hcHBpbmdLZXkobmV3S2V5KTsKLQotCQl0aGlzLnNwZWNpZmllZE1hcHBpbmcgPSBuZXdNYXBwaW5nOwkKLQkJaWYgKG5ld01hcHBpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0Fubm90YXRpb24obmV3TWFwcGluZy5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdBbm5vdGF0aW9uKG51bGwpOwkJCQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVudEF0dHJpYnV0ZS5TUEVDSUZJRURfTUFQUElOR19QUk9QRVJUWSwgb2xkTWFwcGluZywgbmV3TWFwcGluZyk7Ci0JCQotCQlpZiAob2xkTWFwcGluZyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uPFN0cmluZz4gYW5ub3RhdGlvbnNUb1JlbW92ZSA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG9sZE1hcHBpbmcuY29ycmVzcG9uZGluZ0Fubm90YXRpb25OYW1lcygpKTsKLQkJCWlmIChnZXRNYXBwaW5nKCkgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYW5ub3RhdGlvbnNUb1JlbW92ZSwgZ2V0TWFwcGluZygpLmNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKSk7Ci0JCQl9Ci0JCQkKLQkJCWZvciAoU3RyaW5nIGFubm90YXRpb25OYW1lIDogYW5ub3RhdGlvbnNUb1JlbW92ZSkgewotCQkJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IG9mZnNldCwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIGZ1bGxUZXh0UmFuZ2UgPSB0aGlzLmdldEZ1bGxUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCS8vICdmdWxsVGV4dFJhbmdlJyB3aWxsIGJlIG51bGwgaWYgdGhlIGF0dHJpYnV0ZSBubyBsb25nZXIgZXhpc3RzIGluIHRoZSBqYXZhOwotCQkvLyB0aGUgY29udGV4dCBtb2RlbCBjYW4gYmUgb3V0IG9mIHN5bmNoIHdpdGggdGhlIHJlc291cmNlIG1vZGVsCi0JCS8vIHdoZW4gYSBzZWxlY3Rpb24gZXZlbnQgb2NjdXJzIGJlZm9yZSB0aGUgY29udGV4dCBtb2RlbCBoYXMgYQotCQkvLyBjaGFuY2UgdG8gc3luY2ggd2l0aCB0aGUgcmVzb3VyY2UgbW9kZWwgdmlhIHRoZSB1cGRhdGUgdGhyZWFkCi0JCXJldHVybiAoZnVsbFRleHRSYW5nZSA9PSBudWxsKSA/IGZhbHNlIDogZnVsbFRleHRSYW5nZS5pbmNsdWRlcyhvZmZzZXQpOwotCX0KLQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRGdWxsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFNlbGVjdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UodGhpcy5idWlsZEFTVFJvb3QoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoKSB7Ci0JCXJldHVybiBKRFRUb29scy5idWlsZEFTVFJvb3QodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SnBhQ29tcGlsYXRpb25Vbml0KCkuZ2V0Q29tcGlsYXRpb25Vbml0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqcnBhOwotCQl0aGlzLnNldE5hbWUodGhpcy5uYW1lKGpycGEpKTsKLQkJdGhpcy51cGRhdGVEZWZhdWx0TWFwcGluZyhqcnBhKTsKLQkJdGhpcy51cGRhdGVTcGVjaWZpZWRNYXBwaW5nKGpycGEpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7Ci0JCXJldHVybiBqcnBhLmdldE5hbWUoKTsJCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgc3BlY2lmaWVkTWFwcGluZ0Fubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnNwZWNpZmllZE1hcHBpbmcuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkTWFwcGluZyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKLQkJU3RyaW5nIGphdmFNYXBwaW5nQW5ub3RhdGlvbk5hbWUgPSB0aGlzLmphdmFNYXBwaW5nQW5ub3RhdGlvbk5hbWUoanJwYSk7Ci0JCWlmIChzcGVjaWZpZWRNYXBwaW5nQW5ub3RhdGlvbk5hbWUoKSAhPSBqYXZhTWFwcGluZ0Fubm90YXRpb25OYW1lKSB7Ci0JCQlzZXRTcGVjaWZpZWRNYXBwaW5nKGNyZWF0ZUphdmFBdHRyaWJ1dGVNYXBwaW5nRnJvbUFubm90YXRpb24oamF2YU1hcHBpbmdBbm5vdGF0aW9uTmFtZSwganJwYSkpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldFNwZWNpZmllZE1hcHBpbmcoKSAhPSBudWxsKSB7Ci0JCQkJZ2V0U3BlY2lmaWVkTWFwcGluZygpLnVwZGF0ZShqcnBhKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0TWFwcGluZyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKLQkJU3RyaW5nIGRlZmF1bHRNYXBwaW5nS2V5ID0gZ2V0SnBhUGxhdGZvcm0oKS5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdLZXkodGhpcyk7Ci0JCWlmIChnZXREZWZhdWx0TWFwcGluZygpLmdldEtleSgpICE9IGRlZmF1bHRNYXBwaW5nS2V5KSB7Ci0JCQlKYXZhQXR0cmlidXRlTWFwcGluZyBvbGREZWZhdWx0TWFwcGluZyA9IHRoaXMuZGVmYXVsdE1hcHBpbmc7Ci0JCQl0aGlzLmRlZmF1bHRNYXBwaW5nID0gZ2V0SnBhUGxhdGZvcm0oKS5idWlsZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZyh0aGlzKTsKLQkJCXRoaXMuZGVmYXVsdE1hcHBpbmcuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShqcnBhKTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVudEF0dHJpYnV0ZS5ERUZBVUxUX01BUFBJTkdfUFJPUEVSVFksIG9sZERlZmF1bHRNYXBwaW5nLCB0aGlzLmRlZmF1bHRNYXBwaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCWdldERlZmF1bHRNYXBwaW5nKCkudXBkYXRlKGpycGEpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgamF2YU1hcHBpbmdBbm5vdGF0aW9uTmFtZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKLQkJQW5ub3RhdGlvbiBtYXBwaW5nQW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSBqcnBhLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCWlmIChtYXBwaW5nQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbWFwcGluZ0Fubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGNyZWF0ZUphdmFBdHRyaWJ1dGVNYXBwaW5nRnJvbU1hcHBpbmdLZXkoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ID09IE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0SnBhUGxhdGZvcm0oKS5idWlsZEphdmFBdHRyaWJ1dGVNYXBwaW5nRnJvbU1hcHBpbmdLZXkoa2V5LCB0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgY3JlYXRlSmF2YUF0dHJpYnV0ZU1hcHBpbmdGcm9tQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgewotCQlpZiAoYW5ub3RhdGlvbk5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IGdldEpwYVBsYXRmb3JtKCkuYnVpbGRKYXZhQXR0cmlidXRlTWFwcGluZ0Zyb21Bbm5vdGF0aW9uKGFubm90YXRpb25OYW1lLCB0aGlzKTsKLQkJbWFwcGluZy5pbml0aWFsaXplRnJvbVJlc291cmNlKGpycGEpOwotCQlyZXR1cm4gbWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgbWFwcGluZyBtaWdodCBiZSAiZGVmYXVsdCIsIGJ1dCBpdCBzdGlsbCBtaWdodCBiZSBhICJudWxsIiBtYXBwaW5nLi4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWFwcGluZ0lzRGVmYXVsdChKYXZhQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRNYXBwaW5nID09IG1hcHBpbmc7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQkKLQkJaWYgKHRoaXMuc3BlY2lmaWVkTWFwcGluZyAhPSBudWxsKSB7Ci0JCQl0aGlzLnNwZWNpZmllZE1hcHBpbmcuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5kZWZhdWx0TWFwcGluZyAhPSBudWxsKSB7Ci0JCQl0aGlzLmRlZmF1bHRNYXBwaW5nLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9ub3RoaW5nIHRvIGRpc3Bvc2UKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2U5MjU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2hhaW5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZSBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgSmF2YVBlcnNpc3RlbnRUeXBlCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmcgbWFwcGluZzsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzOwotCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYWNjZXNzOwotCi0JcHJvdGVjdGVkIFBlcnNpc3RlbnRUeXBlIHBhcmVudFBlcnNpc3RlbnRUeXBlOwotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZShKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5hdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJdGhpcy5pbml0aWFsaXplKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlTW9kZWwoKS5nZXRKcGFDb21waWxhdGlvblVuaXQoKS5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRSZXNvdXJjZSgpOwotCX0KLQotCS8vKioqKioqKioqKioqKioqKioqIEpwYVN0cnVjdHVyZU5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBKYXZhU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9UWVBFX0lEOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKiBQZXJzaXN0ZW50VHlwZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVR5cGVNYXBwaW5nIGdldE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gZ2V0TWFwcGluZygpLmdldEtleSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNYXBwaW5nS2V5KFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleSA9PSBnZXRNYXBwaW5nKCkuZ2V0S2V5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlKYXZhVHlwZU1hcHBpbmcgb2xkTWFwcGluZyA9IGdldE1hcHBpbmcoKTsKLQkJSmF2YVR5cGVNYXBwaW5nIG5ld01hcHBpbmcgPSBjcmVhdGVKYXZhVHlwZU1hcHBpbmdGcm9tTWFwcGluZ0tleShrZXkpOwotCQotCQl0aGlzLm1hcHBpbmcgPSBuZXdNYXBwaW5nOwkKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdBbm5vdGF0aW9uKG5ld01hcHBpbmcuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVudFR5cGUuTUFQUElOR19QUk9QRVJUWSwgb2xkTWFwcGluZywgbmV3TWFwcGluZyk7Ci0JCi0JCWlmIChvbGRNYXBwaW5nICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb248U3RyaW5nPiBhbm5vdGF0aW9uc1RvUmVtb3ZlID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24ob2xkTWFwcGluZy5jb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkpOwotCQkJaWYgKGdldE1hcHBpbmcoKSAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChhbm5vdGF0aW9uc1RvUmVtb3ZlLCBnZXRNYXBwaW5nKCkuY29ycmVzcG9uZGluZ0Fubm90YXRpb25OYW1lcygpKTsKLQkJCX0KLQkJCQotCQkJZm9yIChTdHJpbmcgYW5ub3RhdGlvbk5hbWUgOiBhbm5vdGF0aW9uc1RvUmVtb3ZlKSB7Ci0JCQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE1hcHBpbmcoSmF2YVR5cGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJSmF2YVR5cGVNYXBwaW5nIG9sZE1hcHBpbmcgPSB0aGlzLm1hcHBpbmc7Ci0JCXRoaXMubWFwcGluZyA9IG5ld01hcHBpbmc7CQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBlcnNpc3RlbnRUeXBlLk1BUFBJTkdfUFJPUEVSVFksIG9sZE1hcHBpbmcsIG5ld01hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKLQkJcmV0dXJuIGdldE1hcHBpbmcoKS5pc01hcHBlZCgpOwotCX0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuYWNjZXNzOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdBY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGRBY2Nlc3MgPSB0aGlzLmFjY2VzczsKLQkJdGhpcy5hY2Nlc3MgPSBuZXdBY2Nlc3M7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVudFR5cGUuQUNDRVNTX1BST1BFUlRZLCBvbGRBY2Nlc3MsIG5ld0FjY2Vzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzTmFtZWQoZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KGF0dHJpYnV0ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbykgewotCQkJCXJldHVybiBhdHRyaWJ1dGVOYW1lLmVxdWFscyhvLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBhdHRyaWJ1dGVzTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCXJldHVybiAoc3RyZWFtLmhhc05leHQoKSkgPyBzdHJlYW0ubmV4dCgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlQXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBhdHRyaWJ1dGVzTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJcmV0dXJuIChzdHJlYW0uaGFzTmV4dCgpKSA/IG51bGwgLyptb3JlIHRoYW4gb25lKi86IGF0dHJpYnV0ZTsKLQkJfQotCQlyZXR1cm4gKGdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCkgPT0gbnVsbCkgPyBudWxsIDogZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKS5yZXNvbHZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLmF0dHJpYnV0ZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGF0dHJpYnV0ZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLnNpemUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEF0dHJpYnV0ZShpbnQgaW5kZXgsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBhdHRyaWJ1dGUsIHRoaXMuYXR0cmlidXRlcywgUGVyc2lzdGVudFR5cGUuU1BFQ0lGSUVEX0FUVFJJQlVURVNfTElTVCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGF0dHJpYnV0ZSwgdGhpcy5hdHRyaWJ1dGVzLCBQZXJzaXN0ZW50VHlwZS5TUEVDSUZJRURfQVRUUklCVVRFU19MSVNUKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1vdmVBdHRyaWJ1dGUoaW50IGluZGV4LCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJbW92ZUl0ZW1Jbkxpc3QoaW5kZXgsIHRoaXMuYXR0cmlidXRlcy5pbmRleE9mKGF0dHJpYnV0ZSksIHRoaXMuYXR0cmlidXRlcywgUGVyc2lzdGVudFR5cGUuU1BFQ0lGSUVEX0FUVFJJQlVURVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVOYW1lcyh0aGlzLmF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzKEl0ZXJhdG9yPD8gZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRycykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZSwgU3RyaW5nPihhdHRycykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxQZXJzaXN0ZW50VHlwZSwgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4+KHRoaXMuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gdHJhbnNmb3JtKFBlcnNpc3RlbnRUeXBlIHB0KSB7Ci0JCQkJcmV0dXJuIHB0LmF0dHJpYnV0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbEF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVOYW1lcyh0aGlzLmFsbEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCUl0ZXJhdG9yPFN0cmluZz4gdmFsdWVzID0gdGhpcy5tYXBwaW5nLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdmFsdWVzOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IGF0dHJpYnV0ZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXZhbHVlcyA9IHN0cmVhbS5uZXh0KCkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHZhbHVlczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQkKLQkvLyBpdCB3b3VsZCBiZSBuaWNlIGlmIHRoZSB3ZSBwYXNzZWQgaW4gYW4gYXN0Um9vdCBoZXJlLCBidXQgdGhlbiB3ZQotCS8vIHdvdWxkIG5lZWQgdG8gcGFzcyBpdCB0byB0aGUgWE1MIHN0cnVjdHVyZSBub2RlcyB0b28uLi4KLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCBvZmZzZXQpIHsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdCgpOyAKLQkJCi0JCWlmICh0aGlzLmNvbnRhaW5zKG9mZnNldCwgYXN0Um9vdCkpIHsKLQkJCWZvciAoSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IHRoaXMuYXR0cmlidXRlcygpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChwZXJzaXN0ZW50QXR0cmlidXRlLmNvbnRhaW5zKG9mZnNldCwgYXN0Um9vdCkpIHsKLQkJCQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQkKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdCgpIHsKLQkJcmV0dXJuIEpEVFRvb2xzLmJ1aWxkQVNUUm9vdCh0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0SnBhQ29tcGlsYXRpb25Vbml0KCkuZ2V0Q29tcGlsYXRpb25Vbml0KCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgb2Zmc2V0LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgZnVsbFRleHRSYW5nZSA9IHRoaXMuZ2V0RnVsbFRleHRSYW5nZShhc3RSb290KTsKLQkJLy8gJ2Z1bGxUZXh0UmFuZ2UnIHdpbGwgYmUgbnVsbCBpZiB0aGUgdHlwZSBubyBsb25nZXIgZXhpc3RzIGluIHRoZSBqYXZhOwotCQkvLyB0aGUgY29udGV4dCBtb2RlbCBjYW4gYmUgb3V0IG9mIHN5bmNoIHdpdGggdGhlIHJlc291cmNlIG1vZGVsCi0JCS8vIHdoZW4gYSBzZWxlY3Rpb24gZXZlbnQgb2NjdXJzIGJlZm9yZSB0aGUgY29udGV4dCBtb2RlbCBoYXMgYQotCQkvLyBjaGFuY2UgdG8gc3luY2ggd2l0aCB0aGUgcmVzb3VyY2UgbW9kZWwgdmlhIHRoZSB1cGRhdGUgdGhyZWFkCi0JCXJldHVybiAoZnVsbFRleHRSYW5nZSA9PSBudWxsKSA/IGZhbHNlIDogZnVsbFRleHRSYW5nZS5pbmNsdWRlcyhvZmZzZXQpOwotCX0KLQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRGdWxsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKHRoaXMuYnVpbGRBU1RSb290KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IGluaGVyaXRhbmNlSGllcmFyY2h5KCkgewotCQkvLyB1c2luZyBhIGNoYWluIGl0ZXJhdG9yIHRvIHRyYXZlcnNlIHVwIHRoZSBpbmhlcml0YW5jZSB0cmVlCi0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4odGhpcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgbmV4dExpbmsoUGVyc2lzdGVudFR5cGUgcHQpIHsKLQkJCQlyZXR1cm4gcHQuZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVudFR5cGUgZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudFBlcnNpc3RlbnRUeXBlKFBlcnNpc3RlbnRUeXBlIG5ld1BhcmVudFBlcnNpc3RlbnRUeXBlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5wYXJlbnRQZXJzaXN0ZW50VHlwZSwgbmV3UGFyZW50UGVyc2lzdGVudFR5cGUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJUGVyc2lzdGVudFR5cGUgb2xkUGFyZW50UGVyc2lzdGVudFR5cGUgPSB0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlOwotCQl0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlID0gbmV3UGFyZW50UGVyc2lzdGVudFR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVudFR5cGUuUEFSRU5UX1BFUlNJU1RFTlRfVFlQRV9QUk9QRVJUWSwgb2xkUGFyZW50UGVyc2lzdGVudFR5cGUsIG5ld1BhcmVudFBlcnNpc3RlbnRUeXBlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzQW55QXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb25zKCkgewotCQlpZiAodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmhhc0FueUF0dHJpYnV0ZUFubm90YXRpb25zKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKioqKiogVXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKgotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgewotCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBqcnB0OwotCQl0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlID0gdGhpcy5wYXJlbnRQZXJzaXN0ZW50VHlwZShqcnB0KTsKLQkJdGhpcy5hY2Nlc3MgPSB0aGlzLmFjY2VzcyhqcnB0KTsKLQkJdGhpcy5uYW1lID0gdGhpcy5uYW1lKGpycHQpOwotCQl0aGlzLmluaXRpYWxpemVNYXBwaW5nKGpycHQpOwotCQl0aGlzLmluaXRpYWxpemVQZXJzaXN0ZW50QXR0cmlidXRlcyhqcnB0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hcHBpbmcoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQl0aGlzLm1hcHBpbmcgID0gZ2V0SnBhUGxhdGZvcm0oKS5idWlsZEphdmFUeXBlTWFwcGluZ0Zyb21Bbm5vdGF0aW9uKHRoaXMuamF2YU1hcHBpbmdBbm5vdGF0aW9uTmFtZShwZXJzaXN0ZW50VHlwZVJlc291cmNlKSwgdGhpcyk7Ci0JCXRoaXMubWFwcGluZy5pbml0aWFsaXplRnJvbVJlc291cmNlKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUGVyc2lzdGVudEF0dHJpYnV0ZXMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiByZXNvdXJjZUF0dHJpYnV0ZXMgPSBwZXJzaXN0ZW50VHlwZVJlc291cmNlLmZpZWxkcygpOwotCQlpZiAoZ2V0QWNjZXNzKCkgPT0gQWNjZXNzVHlwZS5QUk9QRVJUWSkgewotCQkJcmVzb3VyY2VBdHRyaWJ1dGVzID0gcGVyc2lzdGVudFR5cGVSZXNvdXJjZS5wcm9wZXJ0aWVzKCk7Ci0JCX0JCQotCQkKLQkJd2hpbGUgKHJlc291cmNlQXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMuYXR0cmlidXRlcy5hZGQoY3JlYXRlQXR0cmlidXRlKHJlc291cmNlQXR0cmlidXRlcy5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpycHQ7Ci0JCWdldEpwYUZpbGUodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlTW9kZWwoKSkuYWRkUm9vdFN0cnVjdHVyZU5vZGUodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldFF1YWxpZmllZE5hbWUoKSwgdGhpcyk7Ci0JCXVwZGF0ZVBhcmVudFBlcnNpc3RlbnRUeXBlKGpycHQpOwotCQl1cGRhdGVBY2Nlc3MoanJwdCk7Ci0JCXVwZGF0ZU5hbWUoanJwdCk7Ci0JCXVwZGF0ZU1hcHBpbmcoanJwdCk7Ci0JCXVwZGF0ZVBlcnNpc3RlbnRBdHRyaWJ1dGVzKGpycHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBY2Nlc3MoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgewotCQl0aGlzLnNldEFjY2Vzcyh0aGlzLmFjY2VzcyhqcnB0KSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdGhlIGFjY2VzcyAic3BlY2lmaWVkIiBieSB0aGUgamF2YSByZXNvdXJjZSBtb2RlbC4KLQkgKiAJCUNoZWNrIHhtbCBtYXBwaW5nIHNwZWNpZmllZCBhY2Nlc3MgZmlyc3QKLQkgKiAJCUlmIHN0aWxsIG51bGwgY2hlY2sgamF2YSBhbm5vdGF0aW9ucyBpZiB0aGUgeG1sIGlzIG5vdCBtZXRhZGF0YS1jb21wbGV0ZSA9IHRydWUKLQkgKgkJSWYgc3RpbGwgbnVsbCB0aGVuIHNldCB0byBwYXJlbnRQZXJzaXN0ZW50VHlwZSBhY2Nlc3MuCi0JICogCQlJZiBzdGlsbCBudWxsIGNoZWNrIGVudGl0eS1tYXBwaW5ncyBzcGVjaWZpZWQgYWNjZXNzIHNldHRpbmcgaWYgdGhpcyBwZXJzaXN0ZW50LXR5cGUgaXMgbGlzdGVkIGluIGFuIG9ybS54bWwgZmlsZQotCSAqIAkJSWYgc3RpbGwgbnVsbCBjaGVjayB0aGUgcGVyc2lzdGVuY2UtdW5pdCBkZWZhdWx0IEFjY2VzcwotCSAqIAkJRGVmYXVsdCB0byBGSUVMRCBpZiBhbGwgZWxzZSBmYWlscy4KLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBhY2Nlc3MoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgewotCQlBY2Nlc3NUeXBlIGphdmFBY2Nlc3MgPSBudWxsOwotCQlib29sZWFuIG1ldGFkYXRhQ29tcGxldGUgPSBmYWxzZTsKLQkJaWYgKGdldE9ybVBlcnNpc3RlbnRUeXBlKCkgIT0gbnVsbCkgewotCQkJamF2YUFjY2VzcyA9IGdldE9ybVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpLmdldFNwZWNpZmllZEFjY2VzcygpOwotCQkJbWV0YWRhdGFDb21wbGV0ZSA9IGdldE9ybVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCQl9Ci0JCWlmIChqYXZhQWNjZXNzID09IG51bGwgJiYgIW1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCWphdmFBY2Nlc3MgPSBBY2Nlc3NUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChqcnB0LmdldEFjY2VzcygpKTsKLQkJfQotCQlpZiAoamF2YUFjY2VzcyA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJamF2YUFjY2VzcyA9IGdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGphdmFBY2Nlc3MgPT0gbnVsbCkgewotCQkJaWYgKGdldEVudGl0eU1hcHBpbmdzKCkgIT0gbnVsbCkgewotCQkJCWphdmFBY2Nlc3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpOwotCQkJfQotCQl9Ci0JCWlmIChqYXZhQWNjZXNzID09IG51bGwpIHsKLQkJCS8vaGF2ZSB0byBjaGVjayBwZXJzaXN0ZW5jZS11bml0IHNlcGFyYXRlbHkgaW4gdGhlIGNhc2Ugd2hlcmUgaXQgaXMgbm90IGxpc3RlZCBkaXJlY3RseSBpbiBhbiBvcm0ueG1sCi0JCQkvL2lmIGl0IGlzIGxpc3RlZCBpbiBhbiBvcm0ueG1sIHRoZW4gdGhlIGVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkgY2hlY2sgd2lsbCBjb3ZlciBwZXJzaXN0ZW5jZS11bml0LmRlZmF1bHRBY2Nlc3MKLQkJCWlmIChnZXRQZXJzaXN0ZW5jZVVuaXQoKSAhPSBudWxsKSB7Ci0JCQkJamF2YUFjY2VzcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldERlZmF1bHRBY2Nlc3MoKTsKLQkJCX0KLQkJfQotCQlpZiAoamF2YUFjY2VzcyA9PSBudWxsKSB7Ci0JCQlqYXZhQWNjZXNzID0gQWNjZXNzVHlwZS5GSUVMRDsKLQkJfQotCQlyZXR1cm4gamF2YUFjY2VzczsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTmFtZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCXRoaXMuc2V0TmFtZSh0aGlzLm5hbWUoanJwdCkpOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKLQkJcmV0dXJuIGpycHQuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNYXBwaW5nKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKLQkJU3RyaW5nIGphdmFNYXBwaW5nQW5ub3RhdGlvbk5hbWUgPSB0aGlzLmphdmFNYXBwaW5nQW5ub3RhdGlvbk5hbWUoanJwdCk7Ci0JCWlmIChnZXRNYXBwaW5nKCkuZ2V0QW5ub3RhdGlvbk5hbWUoKSAhPSBqYXZhTWFwcGluZ0Fubm90YXRpb25OYW1lKSB7Ci0JCQlzZXRNYXBwaW5nKGNyZWF0ZUphdmFUeXBlTWFwcGluZ0Zyb21Bbm5vdGF0aW9uKGphdmFNYXBwaW5nQW5ub3RhdGlvbk5hbWUsIGpycHQpKTsKLQkJfQotCQllbHNlIHsKLQkJCWdldE1hcHBpbmcoKS51cGRhdGUoanJwdCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZyBjcmVhdGVKYXZhVHlwZU1hcHBpbmdGcm9tTWFwcGluZ0tleShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRKcGFQbGF0Zm9ybSgpLmJ1aWxkSmF2YVR5cGVNYXBwaW5nRnJvbU1hcHBpbmdLZXkoa2V5LCB0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZyBjcmVhdGVKYXZhVHlwZU1hcHBpbmdGcm9tQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKLQkJSmF2YVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gZ2V0SnBhUGxhdGZvcm0oKS5idWlsZEphdmFUeXBlTWFwcGluZ0Zyb21Bbm5vdGF0aW9uKGFubm90YXRpb25OYW1lLCB0aGlzKTsKLQkJdHlwZU1hcHBpbmcuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShqcnB0KTsKLQkJcmV0dXJuIHR5cGVNYXBwaW5nOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgamF2YU1hcHBpbmdBbm5vdGF0aW9uTmFtZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCUFubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24gPSAoQW5ub3RhdGlvbikganJwdC5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlpZiAobWFwcGluZ0Fubm90YXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIG1hcHBpbmdBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGVyc2lzdGVudEF0dHJpYnV0ZXMoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgewotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiByZXNvdXJjZUF0dHJpYnV0ZXMgPSBqcnB0LmZpZWxkcygpOwotCQlpZiAoZ2V0QWNjZXNzKCkgPT0gQWNjZXNzVHlwZS5QUk9QRVJUWSkgewotCQkJcmVzb3VyY2VBdHRyaWJ1dGVzID0ganJwdC5wcm9wZXJ0aWVzKCk7Ci0JCX0KLQkJQ29sbGVjdGlvbjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gY29udGV4dEF0dHJpYnV0ZXNUb1JlbW92ZSA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGF0dHJpYnV0ZXMoKSk7Ci0JCUNvbGxlY3Rpb248SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzVG9VcGRhdGUgPSBuZXcgQXJyYXlMaXN0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCQlpbnQgcmVzb3VyY2VJbmRleCA9IDA7Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VBdHRyaWJ1dGVzLmhhc05leHQoKSkgewotCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlQXR0cmlidXRlcy5uZXh0KCk7Ci0JCQlib29sZWFuIGNvbnRleHRBdHRyaWJ1dGVGb3VuZCA9IGZhbHNlOwotCQkJZm9yIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlIDogY29udGV4dEF0dHJpYnV0ZXNUb1JlbW92ZSkgewotCQkJCWlmIChjb250ZXh0QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpID09IHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCQkJCW1vdmVBdHRyaWJ1dGUocmVzb3VyY2VJbmRleCwgY29udGV4dEF0dHJpYnV0ZSk7Ci0JCQkJCWNvbnRleHRBdHRyaWJ1dGVzVG9SZW1vdmUucmVtb3ZlKGNvbnRleHRBdHRyaWJ1dGUpOwotCQkJCQljb250ZXh0QXR0cmlidXRlc1RvVXBkYXRlLmFkZChjb250ZXh0QXR0cmlidXRlKTsKLQkJCQkJY29udGV4dEF0dHJpYnV0ZUZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFjb250ZXh0QXR0cmlidXRlRm91bmQpIHsKLQkJCQlhZGRBdHRyaWJ1dGUocmVzb3VyY2VJbmRleCwgY3JlYXRlQXR0cmlidXRlKHJlc291cmNlQXR0cmlidXRlKSk7Ci0JCQl9Ci0JCQlyZXNvdXJjZUluZGV4Kys7Ci0JCX0KLQkJZm9yIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlIDogY29udGV4dEF0dHJpYnV0ZXNUb1JlbW92ZSkgewotCQkJcmVtb3ZlQXR0cmlidXRlKGNvbnRleHRBdHRyaWJ1dGUpOwotCQl9Ci0JCS8vZmlyc3QgaGFuZGxlIGFkZGluZy9yZW1vdmluZyBvZiB0aGUgcGVyc2lzdGVudCBhdHRyaWJ1dGVzLCB0aGVuIHVwZGF0ZSB0aGUgb3RoZXJzIGxhc3QsIAotCQkvL3RoaXMgY2F1c2VzIGxlc3MgY2h1cm4gaW4gdGhlIHVwZGF0ZSBwcm9jZXNzCi0JCWZvciAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA6IGNvbnRleHRBdHRyaWJ1dGVzVG9VcGRhdGUpIHsKLQkJCWNvbnRleHRBdHRyaWJ1dGUudXBkYXRlKGNvbnRleHRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjcmVhdGVBdHRyaWJ1dGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlUmVzb3VyY2UpIHsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzKTsKLQkJamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShwZXJzaXN0ZW50QXR0cmlidXRlUmVzb3VyY2UpOwotCQlyZXR1cm4gamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZVBhcmVudFBlcnNpc3RlbnRUeXBlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UpIHsKLQkJc2V0UGFyZW50UGVyc2lzdGVudFR5cGUocGFyZW50UGVyc2lzdGVudFR5cGUocGVyc2lzdGVudFR5cGVSZXNvdXJjZSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgcGFyZW50UGVyc2lzdGVudFR5cGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSkgewotCQlyZXR1cm4gcGFyZW50UGVyc2lzdGVudFR5cGUocGVyc2lzdGVudFR5cGVSZXNvdXJjZS5nZXRTdXBlckNsYXNzUXVhbGlmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbnRUeXBlIHBhcmVudFBlcnNpc3RlbnRUeXBlKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCVBlcnNpc3RlbnRUeXBlIHBvc3NpYmxlUGFyZW50ID0gcG9zc2libGVQYXJlbnQoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JCWlmIChwb3NzaWJsZVBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAocG9zc2libGVQYXJlbnQuaXNNYXBwZWQoKSkgewotCQkJcmV0dXJuIHBvc3NpYmxlUGFyZW50OwotCQl9Ci0JCXJldHVybiBwb3NzaWJsZVBhcmVudC5nZXRQYXJlbnRQZXJzaXN0ZW50VHlwZSgpOwotCX0KLQotCS8qKgotCSAqIEpQQSBzcGVjIHN1cHBvcnRzIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGFyZSBub24tcGVyc2lzdGVudCB0eXBlcyBpbiB0aGUgaGllcmFyY2h5Ci0JICogVGhpcyB3aWxsIGNoZWNrIGZvciBhIFBlcnNpc3RlbnRUeXBlIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhpcyBQZXJzaXN0ZW5jZVVuaXQuCi0JICogSWYgaXQgaXMgbm90IGZvdW5kIHRoZW4gZmluZCB0aGUgSmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UgYW5kIGxvb2sgZm9yIGl0cyBwYXJlbnQgdHlwZQotCSAqLwotCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSBwb3NzaWJsZVBhcmVudChTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlQZXJzaXN0ZW50VHlwZSBwb3NzaWJsZVBhcmVudCA9IGdldFBlcnNpc3RlbnRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwotCQlpZiAocG9zc2libGVQYXJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBvc3NpYmxlUGFyZW50OwotCQl9Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JCXJldHVybiAoanJwdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnBvc3NpYmxlUGFyZW50KGpycHQuZ2V0U3VwZXJDbGFzc1F1YWxpZmllZE5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UGVyc2lzdGVudFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCS8vZ2V0IGFzdFJvb3QgaGVyZSB0byBwYXNzIGRvd24KLQkJYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgdGhpcy5idWlsZEFTVFJvb3QoKSk7CQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0cnkgewotCQkJdGhpcy5tYXBwaW5nLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQl9IGNhdGNoKFRocm93YWJsZSB0KSB7Ci0JCQlKcHRDb3JlUGx1Z2luLmxvZyh0KTsKLQkJfQotCQlhZGRBdHRyaWJ1dGVNZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgOiB0aGlzLmF0dHJpYnV0ZXMpIHsKLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJCX0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKLQkJCQlKcHRDb3JlUGx1Z2luLmxvZyh0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKGdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJSnBhRmlsZSBqcGFGaWxlID0gZ2V0SnBhRmlsZSh0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2VNb2RlbCgpKTsKLQkJCi0JCWlmIChqcGFGaWxlICE9IG51bGwpIHsKLQkJCS8vanBhRmlsZSBjYW4gYmUgbnVsbCBpZiB0aGUgLmphdmEgZmlsZSB3YXMgZGVsZXRlZCwKLQkJCS8vcm9vdFN0cnVjdHVyZU5vZGVzIGFyZSBjbGVhcmVkIGluIHRoZSBkaXNwb3NlIG9mIEpwYUZpbGUKLQkJCWpwYUZpbGUucmVtb3ZlUm9vdFN0cnVjdHVyZU5vZGUodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYzFmNzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW48UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPgotCWltcGxlbWVudHMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCi0JcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlOwotCQotCXB1YmxpYyBHZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFCYXNlSm9pbkNvbHVtbi5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4pIHsKLQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlID0gY29sdW1uOwotCQlzdXBlci5pbml0aWFsaXplRnJvbVJlc291cmNlKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKGNvbHVtbik7Ci0JCXRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0KLQkvLyoqKioqKioqKioqKioqIEphdmFOYW1lZENvbHVtbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUJhc2VKb2luQ29sdW1uLk93bmVyIGdldE93bmVyKCkgewotCQlyZXR1cm4gKEphdmFCYXNlSm9pbkNvbHVtbi5Pd25lcikgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKiBJQWJzdHJhY3RKb2luQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9PSBudWxsKSA/IHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lIDogdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQlnZXRDb2x1bW5SZXNvdXJjZSgpLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUsIG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8oU3RyaW5nIG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUsIG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmV3RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuZXdEZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUsIG5ld0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuaXNWaXJ0dWFsKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIENvbHVtbiBnZXREYlJlZmVyZW5jZWRDb2x1bW4oKSB7Ci0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpOwotCQlyZXR1cm4gKHRhYmxlID09IG51bGwpID8gbnVsbCA6IHRhYmxlLmNvbHVtbk5hbWVkKHRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFRhYmxlIGdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLnJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKSB7Ci0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXRPd25lcigpLmdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCk7Ci0JCXJldHVybiAodGFibGUgIT0gbnVsbCkgPyB0YWJsZS5jb2x1bW5OYW1lcygpIDogRW1wdHlJdGVyYXRvci48U3RyaW5nPiBpbnN0YW5jZSgpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKCksIGZpbHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IHF1b3RlZENhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnF1b3RlKHRoaXMuY2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKGZpbHRlcikpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5jb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAodGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmV0dXJuIHRoaXMucXVvdGVkQ2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKGZpbHRlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSB7Ci0JCXJldHVybiBnZXREYlJlZmVyZW5jZWRDb2x1bW4oKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRDb2x1bW5SZXNvdXJjZSgpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldE93bmVyKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsJCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4pIHsKLQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlID0gY29sdW1uOwotCQlzdXBlci51cGRhdGUoY29sdW1uKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8odGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShjb2x1bW4pKTsKLQkJdGhpcy5zZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUodGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbikgewotCQlyZXR1cm4gY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JfQotCQotCS8vVE9ETyBub3QgY29ycmVjdCB3aGVuIHdlIHN0YXJ0IHN1cHBvcnRpbmcgcHJpbWFyeUtleUpvaW5Db2x1bW5zIGluIDEtMSBtYXBwaW5ncwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gZGVmYXVsdE5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3ZmE3MAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMzIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5CisJZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5Cit7CisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworCQorCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBuZXcgVmVjdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oKTsKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUpvaW5Db2x1bW4uT3duZXIgam9pbkNvbHVtbk93bmVyOworCQorCQorCXB1YmxpYyBHZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KAorCQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5qb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbk93bmVyKCk7CisJfQorCQorCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbi5Pd25lciBidWlsZEpvaW5Db2x1bW5Pd25lcigpIHsKKwkJcmV0dXJuIG5ldyBKb2luQ29sdW1uT3duZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIGdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXNzb2NpYXRpb24oKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucyk7CisJfQorCQorCXB1YmxpYyBpbnQgcHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaGFzUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gISB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7CisJfQorCQorCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSAKKwkJCWdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLCB0aGlzLmpvaW5Db2x1bW5Pd25lcik7CisJCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLmFkZChpbmRleCwgcGtKb2luQ29sdW1uKTsKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtbkFubm90YXRpb24gPSBhZGRBbm5vdGF0aW9uKGluZGV4KTsKKwkJcGtKb2luQ29sdW1uLmluaXRpYWxpemUocGtKb2luQ29sdW1uQW5ub3RhdGlvbik7CisJCWZpcmVJdGVtQWRkZWQoUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBwa0pvaW5Db2x1bW4pOworCQlyZXR1cm4gcGtKb2luQ29sdW1uOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgsIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGpvaW5Db2x1bW4sIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLCBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCWFkZFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKSwgam9pbkNvbHVtbik7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbikgeworCQlyZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucy5pbmRleE9mKHBrSm9pbkNvbHVtbikpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKKwkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7CisJCXJlbW92ZUFubm90YXRpb24oaW5kZXgpOworCQlmaXJlSXRlbVJlbW92ZWQoUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBwa0pvaW5Db2x1bW4pOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uXyhKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQlyZW1vdmVJdGVtRnJvbUxpc3Qoam9pbkNvbHVtbiwgdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKKwl9CisJCisJcHVibGljIHZvaWQgbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQltb3ZlQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQlmaXJlSXRlbU1vdmVkKFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCisJfQorCQorCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gYWRkQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLgorCQkJYWRkQW5ub3RhdGlvbigKKwkJCQlpbmRleCwgCisJCQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgCisJCQkJUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbm5vdGF0aW9uKGludCBpbmRleCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS4KKwkJCXJlbW92ZUFubm90YXRpb24oCisJCQkJaW5kZXgsIAorCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIAorCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgbW92ZUFubm90YXRpb24oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuCisJCQltb3ZlQW5ub3RhdGlvbigKKwkJCQl0YXJnZXRJbmRleCwgCisJCQkJc291cmNlSW5kZXgsIAorCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkU3RyYXRlZ3koKSB7CisJCWlmIChwcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgPT0gMCkgeworCQkJYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlU3RyYXRlZ3koKSB7CisJCWZvciAoUHJpbWFyeUtleUpvaW5Db2x1bW4gZWFjaCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkpIHsKKwkJCXJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGVhY2gpOworCQl9CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgLT4gY29udGV4dCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IAorCQkJZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLgorCQkJCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwkJaW5pdGlhbGl6ZVByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGFubm90YXRpb25zID0gCisJCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5hbm5vdGF0aW9ucygKKwkJCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCAKKwkJCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQl3aGlsZSAoYW5ub3RhdGlvbnMuaGFzTmV4dCgpKSB7CisJCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoCisJCQkJYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigKKwkJCQkJKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYW5ub3RhdGlvbnMubmV4dCgpKSk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IAorCQkJZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLgorCQkJCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwkJdXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKKwkJTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IAorCQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuYW5ub3RhdGlvbnMoCisJCQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgCisJCQkJUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJd2hpbGUgKGpvaW5Db2x1bW5zLmhhc05leHQoKSkgeworCQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5uZXh0KCk7CisJCQlpZiAoYW5ub3RhdGlvbnMuaGFzTmV4dCgpKSB7CisJCQkJam9pbkNvbHVtbi51cGRhdGUoCisJCQkJCShQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGFubm90YXRpb25zLm5leHQoKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbl8oam9pbkNvbHVtbik7CisJCQl9CisJCX0KKwkJCisJCXdoaWxlIChhbm5vdGF0aW9ucy5oYXNOZXh0KCkpIHsKKwkJCWFkZFByaW1hcnlLZXlKb2luQ29sdW1uKAorCQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oCisJCQkJCShQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGFubm90YXRpb25zLm5leHQoKSkpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigKKwkJCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7CisJCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gCisJCQlnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcywgdGhpcy5qb2luQ29sdW1uT3duZXIpOworCQlqb2luQ29sdW1uLmluaXRpYWxpemUoYW5ub3RhdGlvbik7CisJCXJldHVybiBqb2luQ29sdW1uOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIEphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWZvciAoSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucygpKSkgeworCQkJcmVzdWx0ID0gY29sdW1uLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBqb2luIGNvbHVtbiBvd25lciBhZGFwdGVyICoqKioqKioqKioKKworCXByb3RlY3RlZCBjbGFzcyBKb2luQ29sdW1uT3duZXIgCisJCWltcGxlbWVudHMgSmF2YUpvaW5Db2x1bW4uT3duZXIgCisJeworCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbk93bmVyKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCQkKKwkJCisJCS8qKgorCQkgKiBieSBkZWZhdWx0LCB0aGUgam9pbiBjb2x1bW4gaXMgaW4gdGhlIHR5cGUgbWFwcGluZydzIHByaW1hcnkgdGFibGUKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKKwkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlUYWJsZU5hbWUoKTsKKwkJfQorCQkKKwkJcHVibGljIEVudGl0eSBnZXRUYXJnZXRFbnRpdHkoKSB7CisJCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7CisJCX0KKwkJCisJCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKKwkJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0TmFtZSgpOworCQl9CisJCQorCQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQkJcmV0dXJuIEdlbmVyaWNKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7CisJCX0KKwkJCisJCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7CisJCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIHRoZSBqb2luIGNvbHVtbiBjYW4gYmUgb24gYSBzZWNvbmRhcnkgdGFibGUKKwkJICovCisJCXB1YmxpYyBib29sZWFuIHRhYmxlSXNBbGxvd2VkKCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJCisJCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKKwkJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmcoKTsKKwkJfQorCQkKKwkJcHVibGljIFRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgeworCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOworCQl9CisJCQorCQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7CisJCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0VGFyZ2V0RW50aXR5KCk7CisJCQlyZXR1cm4gKHRhcmdldEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiB0YXJnZXRFbnRpdHkuZ2V0UHJpbWFyeURiVGFibGUoKTsKKwkJfQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKKwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCXJldHVybiBudWxsOworCQl9CisJCQorCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJCXJldHVybiBHZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKKwkJfQorCQkKKwkJcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7CisJCQlyZXR1cm4gR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS50aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFRdWVyeUhpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFRdWVyeUhpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2YThkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUXVlcnlIaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlF1ZXJ5SGludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVF1ZXJ5SGludCBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgSmF2YVF1ZXJ5SGludAotewotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0KLQlwcm90ZWN0ZWQgUXVlcnlIaW50QW5ub3RhdGlvbiBxdWVyeUhpbnQ7Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhUXVlcnlIaW50KEphdmFRdWVyeSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJdGhpcy5xdWVyeUhpbnQuc2V0TmFtZShuZXdOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChRdWVyeUhpbnQuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5xdWVyeUhpbnQuc2V0VmFsdWUobmV3VmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFF1ZXJ5SGludC5WQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tUmVzb3VyY2UoUXVlcnlIaW50QW5ub3RhdGlvbiBxdWVyeUhpbnQpIHsKLQkJdGhpcy5xdWVyeUhpbnQgPSBxdWVyeUhpbnQ7Ci0JCXRoaXMubmFtZSA9IHF1ZXJ5SGludC5nZXROYW1lKCk7Ci0JCXRoaXMudmFsdWUgPSBxdWVyeUhpbnQuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50KSB7Ci0JCXRoaXMucXVlcnlIaW50ID0gcXVlcnlIaW50OwotCQl0aGlzLnNldE5hbWUocXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JCXRoaXMuc2V0VmFsdWUocXVlcnlIaW50LmdldFZhbHVlKCkpOwotCX0KLQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVNlY29uZGFyeVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYzA0ODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVNlY29uZGFyeVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZSBleHRlbmRzIEFic3RyYWN0SmF2YVRhYmxlCi0JaW1wbGVtZW50cyBKYXZhU2Vjb25kYXJ5VGFibGUKLXsKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uczsKLQotCXByb3RlY3RlZCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOwotCi0JcHJvdGVjdGVkIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZVJlc291cmNlOwotCQotCXB1YmxpYyBHZW5lcmljSmF2YVNlY29uZGFyeVRhYmxlKEphdmFFbnRpdHkgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRW50aXR5IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhRW50aXR5KSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQkvLyoqKioqKioqKioqKioqKioqIEFic3RyYWN0SmF2YVRhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gZ2V0VGFibGVSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2Vjb25kYXJ5VGFibGVSZXNvdXJjZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKioqKiBJU2Vjb25kYXJ5VGFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioKLQkKLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIDogdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgcHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA/IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4odGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gIXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQl9CQotCQotCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gbmV3UGtKb2luQ29sdW1uKSB7Ci0JCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBvbGRQa0pvaW5Db2x1bW4gPSB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBuZXdQa0pvaW5Db2x1bW47Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU2Vjb25kYXJ5VGFibGUuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgb2xkUGtKb2luQ29sdW1uLCBuZXdQa0pvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlpZiAodGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQl9Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID09IG51bGwpID8gMCA6IDE7Ci0JfQotCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIG9sZERlZmF1bHRQa0pvaW5Db2x1bW4gPSB0aGlzLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlpZiAob2xkRGVmYXVsdFBrSm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkvL251bGwgdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gbm93IGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkJCS8vaWYgb25lIGRvZXMgbm90IGV4aXN0LCB0aGVyZSBpcyBhbHJlYWR5IGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uLgotCQkJLy9SZW1vdmUgaXQgbm93IHNvIHRoYXQgaXQgZG9lc24ndCBnZXQgcmVtb3ZlZCBkdXJpbmcgYW4gdXBkYXRlIGFuZAotCQkJLy9jYXVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBiZSBzZW50IHRvIHRoZSBVSSBpbiB0aGUgd3Jvbmcgb3JkZXIKLQkJCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID0gbnVsbDsKLQkJfQotCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcywgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpKTsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuYWRkKGluZGV4LCBwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW5SZXNvdXJjZSA9IHRoaXMuc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5hZGRQa0pvaW5Db2x1bW4oaW5kZXgpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbi5pbml0aWFsaXplRnJvbVJlc291cmNlKHBrSm9pbkNvbHVtblJlc291cmNlKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKFNlY29uZGFyeVRhYmxlLlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJaWYgKG9sZERlZmF1bHRQa0pvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNlY29uZGFyeVRhYmxlLkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIG9sZERlZmF1bHRQa0pvaW5Db2x1bW4sIG51bGwpOwotCQl9Ci0JCXJldHVybiBwcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgsIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBwcmltYXJ5S2V5Sm9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIFNlY29uZGFyeVRhYmxlLlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5pbmRleE9mKGpvaW5Db2x1bW4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiByZW1vdmVkUHJpbWFyeUtleUpvaW5Db2x1bW4gPSB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOwotCQlpZiAoIWNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpIHsKLQkJCS8vY3JlYXRlIHRoZSBkZWZhdWx0Sm9pbkNvbHVtbiBub3cgb3IgdGhpcyB3aWxsIGhhcHBlbiBkdXJpbmcgcHJvamVjdCB1cGRhdGUgCi0JCQkvL2FmdGVyIHJlbW92aW5nIHRoZSBqb2luIGNvbHVtbiBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4gVGhhdCBjYXVzZXMgcHJvYmxlbXMgCi0JCQkvL2luIHRoZSBVSSBiZWNhdXNlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBlbmQgdXAgaW4gdGhlIHdyb25nIG9yZGVyLgotCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG5ldyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5zZWNvbmRhcnlUYWJsZVJlc291cmNlKSk7Ci0JCX0KLQkJdGhpcy5zZWNvbmRhcnlUYWJsZVJlc291cmNlLnJlbW92ZVBrSm9pbkNvbHVtbihpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChTZWNvbmRhcnlUYWJsZS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCByZW1vdmVkUHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQlpZiAodGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJLy9maXJlIGNoYW5nZSBub3RpZmljYXRpb24gaWYgYSBkZWZhdWx0Sm9pbkNvbHVtbiB3YXMgY3JlYXRlZCBhYm92ZQotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVudGl0eS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBudWxsLCB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCX0KLQl9CQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5fKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QocHJpbWFyeUtleUpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLCBTZWNvbmRhcnlUYWJsZS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5tb3ZlUGtKb2luQ29sdW1uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoU2Vjb25kYXJ5VGFibGUuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCXB1YmxpYyBKYXZhRW50aXR5IGdldEphdmFFbnRpdHkoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnQoKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShzZWNvbmRhcnlUYWJsZSk7Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IHNlY29uZGFyeVRhYmxlOwotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoc2Vjb25kYXJ5VGFibGUpOwotCQl0aGlzLmluaXRpYWxpemVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oc2Vjb25kYXJ5VGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSkgewotCQlMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IHNlY29uZGFyeVRhYmxlLnBrSm9pbkNvbHVtbnMoKTsKLQkJCi0JCXdoaWxlKGFubm90YXRpb25zLmhhc05leHQoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuYWRkKGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oYW5ub3RhdGlvbnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQnVpbGREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUpIHsKLQkJaWYgKCFzaG91bGRCdWlsZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG5ldyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW4oc2Vjb25kYXJ5VGFibGUpKTsKLQl9CQotCi0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZVJlc291cmNlKSB7Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IHNlY29uZGFyeVRhYmxlUmVzb3VyY2U7Ci0JCXN1cGVyLnVwZGF0ZShzZWNvbmRhcnlUYWJsZVJlc291cmNlKTsKLQkJdGhpcy51cGRhdGVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKHNlY29uZGFyeVRhYmxlUmVzb3VyY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCUxpc3RJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5wa0pvaW5Db2x1bW5zKCk7Ci0JCQotCQl3aGlsZSAocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uID0gcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbi51cGRhdGUocmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uXyhwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSwgYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UpIHsKLQkJaWYgKCFzaG91bGRCdWlsZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKSB7Ci0JCQlzZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4obnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpID09IG51bGwpIHsKLQkJCXRoaXMuc2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4obmV3IE51bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbihzZWNvbmRhcnlUYWJsZVJlc291cmNlKSkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4udXBkYXRlKG5ldyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW4oc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSkpOwotCQl9Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UpIHsKLQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1uLmluaXRpYWxpemVGcm9tUmVzb3VyY2UocHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZSk7Ci0JCXJldHVybiBwcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFCYXNlSm9pbkNvbHVtbi5Pd25lciBjcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCWJvb2xlYW4gZG9Db250aW51ZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQlTdHJpbmcgc2NoZW1hID0gZ2V0U2NoZW1hKCk7Ci0JCQotCQlpZiAoZG9Db250aW51ZSAmJiAhIGhhc1Jlc29sdmVkU2NoZW1hKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7c2NoZW1hLCBnZXROYW1lKCl9LCAKLQkJCQkJCXRoaXMsIAotCQkJCQkJZ2V0U2NoZW1hVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCSk7Ci0JCQlkb0NvbnRpbnVlID0gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmICEgaXNSZXNvbHZlZCgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5TRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lKCl9LCAKLQkJCQkJCXRoaXMsIAotCQkJCQkJZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQl9Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKioqKioqKiBjb2RlIGNvbXBsZXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZm9yIChKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gY29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlyZXN1bHQgPSBjb2x1bW4uamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lciBpbXBsZW1lbnRzIEphdmFCYXNlSm9pbkNvbHVtbi5Pd25lcgotCXsKLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS50aGlzLmdldEphdmFFbnRpdHkoKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVNlY29uZGFyeVRhYmxlLnRoaXMuZ2V0RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIGdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCkgewotCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUudGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS50aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9PSBqb2luQ29sdW1uOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewotCQkJaWYgKGpvaW5Db2x1bW5zU2l6ZSgpICE9IDEpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBnZXRKYXZhRW50aXR5KCkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKLQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzQwNjQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0SmF2YUdlbmVyYXRvcgotCWltcGxlbWVudHMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTZXF1ZW5jZU5hbWU7Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZXRHZW5lcmF0b3JSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHN1cGVyLmdldEdlbmVyYXRvclJlc291cmNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShzZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCXRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lID0gdGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWUoc2VxdWVuY2VHZW5lcmF0b3IpOwotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkgewotCQlyZXR1cm4gU2VxdWVuY2VHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNlcXVlbmNlTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFNlcXVlbmNlTmFtZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNlcXVlbmNlTmFtZShTdHJpbmcgbmV3U3BlY2lmaWVkU2VxdWVuY2VOYW1lKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUgPSB0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWUgPSBuZXdTcGVjaWZpZWRTZXF1ZW5jZU5hbWU7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuc2V0U2VxdWVuY2VOYW1lKG5ld1NwZWNpZmllZFNlcXVlbmNlTmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NFUVVFTkNFX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFNlcXVlbmNlTmFtZSwgbmV3U3BlY2lmaWVkU2VxdWVuY2VOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRTZXF1ZW5jZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lOwotCQl0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IG5ld1NwZWNpZmllZFNlcXVlbmNlTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2VxdWVuY2VOYW1lLCBuZXdTcGVjaWZpZWRTZXF1ZW5jZU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlcXVlbmNlTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvcikgewotCQlzdXBlci51cGRhdGUoc2VxdWVuY2VHZW5lcmF0b3IpOwotCQl0aGlzLnNldFNwZWNpZmllZFNlcXVlbmNlTmFtZV8odGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWUoc2VxdWVuY2VHZW5lcmF0b3IpKTsgCi0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2VxdWVuY2VOYW1lKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3JSZXNvdXJjZSkgewotCQlyZXR1cm4gZ2VuZXJhdG9yUmVzb3VyY2UuZ2V0U2VxdWVuY2VOYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjIyZjJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFUYWJsZSBleHRlbmRzIEFic3RyYWN0SmF2YVRhYmxlIGltcGxlbWVudHMgSmF2YVRhYmxlCi17Ci0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGVyc2lzdGVudFJlc291cmNlOwotCi0JcHVibGljIEdlbmVyaWNKYXZhVGFibGUoSmF2YUVudGl0eSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBlcnNpc3RlbnRSZXNvdXJjZSkgewotCQl0aGlzLnBlcnNpc3RlbnRSZXNvdXJjZSA9IHBlcnNpc3RlbnRSZXNvdXJjZTsKLQkJaW5pdGlhbGl6ZUZyb21SZXNvdXJjZShnZXRUYWJsZVJlc291cmNlKCkpOwotCX0KLQotCQotCS8vcXVlcnkgZm9yIHRoZSB0YWJsZSByZXNvdXJjZSBldmVyeSB0aW1lIG9uIHNldHRlcnMuCi0JLy9jYWxsIG9uZSBzZXR0ZXIgYW5kIHRoZSB0YWJsZVJlc291cmNlIGNvdWxkIGNoYW5nZS4gCi0JLy9Zb3UgY291bGQgY2FsbCBtb3JlIHRoYW4gb25lIHNldHRlciBiZWZvcmUgdGhpcyBvYmplY3QgaGFzIHJlY2VpdmVkIGFueSBub3RpZmljYXRpb24KLQkvL2Zyb20gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGFibGVBbm5vdGF0aW9uIGdldFRhYmxlUmVzb3VyY2UoKSB7Ci0JCS8vVE9ETyBnZXQgdGhlIE51bGxUYWJsZSBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCBvciBidWlsZCBpdCBoZXJlIGluIHRoZSBjb250ZXh0IG1vZGVsPz8KLQkJcmV0dXJuIChUYWJsZUFubm90YXRpb24pIHRoaXMucGVyc2lzdGVudFJlc291cmNlLmdldE5vbk51bGxBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVudGl0eSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YUVudGl0eSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhRW50aXR5IGdldEphdmFFbnRpdHkoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVudGl0eSBnZXRSb290RW50aXR5KCkgewotCQlyZXR1cm4gZ2V0SmF2YUVudGl0eSgpLmdldFJvb3RFbnRpdHkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JLyoqCi0JICogVGFibGUgbmFtZSBkZWZhdWx0IHRvIHRoZSBvd25pbmcgamF2YSBlbnRpdHkgbmFtZS4KLQkgKiBJZiB0aGlzIGVudGl0eSBpcyBwYXJ0IG9mIGEgc2luZ2xlIHRhYmxlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwgdGFibGUKLQkgKiBuYW1lIGRlZmF1bHRzIHRvIHRoZSByb290IGVudGl0eSdzIHRhYmxlIG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZSgpIHsKLQkJaWYgKGdldEphdmFFbnRpdHkoKS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgPT0gSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSkgewotCQkJaWYgKGdldFJvb3RFbnRpdHkoKSAhPSBnZXRKYXZhRW50aXR5KCkpIHsKLQkJCQlyZXR1cm4gZ2V0Um9vdEVudGl0eSgpLmdldFRhYmxlKCkuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRKYXZhRW50aXR5KCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWEoKSB7Ci0JCWlmIChnZXRKYXZhRW50aXR5KCkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUpIHsKLQkJCWlmIChnZXRSb290RW50aXR5KCkgIT0gZ2V0SmF2YUVudGl0eSgpKSB7Ci0JCQkJcmV0dXJuIGdldFJvb3RFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNjaGVtYSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5kZWZhdWx0U2NoZW1hKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2coKSB7Ci0JCWlmIChnZXRKYXZhRW50aXR5KCkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUpIHsKLQkJCWlmIChnZXRSb290RW50aXR5KCkgIT0gZ2V0SmF2YUVudGl0eSgpKSB7Ci0JCQkJcmV0dXJuIGdldFJvb3RFbnRpdHkoKS5nZXRUYWJsZSgpLmdldENhdGFsb2coKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZGVmYXVsdENhdGFsb2coKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGVyc2lzdGVudFJlc291cmNlKSB7Ci0JCXRoaXMucGVyc2lzdGVudFJlc291cmNlID0gcGVyc2lzdGVudFJlc291cmNlOwotCQl0aGlzLnVwZGF0ZShnZXRUYWJsZVJlc291cmNlKCkpOwotCX0KLQotCS8vKioqKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJYm9vbGVhbiBkb0NvbnRpbnVlID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JCVN0cmluZyBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmICEgaGFzUmVzb2x2ZWRTY2hlbWEoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsCi0JCQkJCQluZXcgU3RyaW5nW10ge3NjaGVtYSwgZ2V0TmFtZSgpfSwgCi0JCQkJCQl0aGlzLCAKLQkJCQkJCWdldFNjaGVtYVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQkJZG9Db250aW51ZSA9IGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoZG9Db250aW51ZSAmJiAhIGlzUmVzb2x2ZWQoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lKCl9LCAKLQkJCQkJCXRoaXMsIAotCQkJCQkJZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkKLQkJCQkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVRhYmxlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVGFibGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNkNjg3Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVGFibGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVGFibGVHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEphdmFHZW5lcmF0b3IKLQlpbXBsZW1lbnRzIEphdmFUYWJsZUdlbmVyYXRvciwgVW5pcXVlQ29uc3RyYWludC5Pd25lcgotewotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYWJsZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhYmxlOwotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ2F0YWxvZzsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nOwotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2NoZW1hOwotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFBrQ29sdW1uTmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFBrQ29sdW1uTmFtZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlQ29sdW1uTmFtZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFBrQ29sdW1uVmFsdWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRQa0NvbHVtblZhbHVlOwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50czsKLQotCXB1YmxpYyBHZW5lcmljSmF2YVRhYmxlR2VuZXJhdG9yKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50cyA9IG5ldyBBcnJheUxpc3Q8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZXRHZW5lcmF0b3JSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHN1cGVyLmdldEdlbmVyYXRvclJlc291cmNlKCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpIHsKLQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfSU5JVElBTF9WQUxVRTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFRhYmxlKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0VGFibGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVGFibGUoU3RyaW5nIG5ld1NwZWNpZmllZFRhYmxlKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRUYWJsZSA9IHRoaXMuc3BlY2lmaWVkVGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSBuZXdTcGVjaWZpZWRUYWJsZTsKLQkJZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5zZXRUYWJsZShuZXdTcGVjaWZpZWRUYWJsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRUYWJsZSwgbmV3U3BlY2lmaWVkVGFibGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFRhYmxlXyhTdHJpbmcgbmV3U3BlY2lmaWVkVGFibGUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFRhYmxlID0gdGhpcy5zcGVjaWZpZWRUYWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IG5ld1NwZWNpZmllZFRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVGFibGUsIG5ld1NwZWNpZmllZFRhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZENhdGFsb2coKSA9PSBudWxsKSA/IGdldERlZmF1bHRDYXRhbG9nKCkgOiB0aGlzLmdldFNwZWNpZmllZENhdGFsb2coKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgbmV3U3BlY2lmaWVkQ2F0YWxvZykgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkQ2F0YWxvZyA9IHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gbmV3U3BlY2lmaWVkQ2F0YWxvZzsKLQkJZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5zZXRDYXRhbG9nKG5ld1NwZWNpZmllZENhdGFsb2cpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRDYXRhbG9nLCBuZXdTcGVjaWZpZWRDYXRhbG9nKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZ18oU3RyaW5nIG5ld1NwZWNpZmllZENhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZENhdGFsb2cgPSB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IG5ld1NwZWNpZmllZENhdGFsb2c7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFksIG9sZFNwZWNpZmllZENhdGFsb2csIG5ld1NwZWNpZmllZENhdGFsb2cpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDYXRhbG9nKFN0cmluZyBuZXdEZWZhdWx0Q2F0YWxvZykgewotCQlTdHJpbmcgb2xkRGVmYXVsdENhdGFsb2cgPSB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gbmV3RGVmYXVsdENhdGFsb2c7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZLCBvbGREZWZhdWx0Q2F0YWxvZywgbmV3RGVmYXVsdENhdGFsb2cpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkU2NoZW1hKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0U2NoZW1hKCkgOiB0aGlzLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hKFN0cmluZyBuZXdTcGVjaWZpZWRTY2hlbWEpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFNjaGVtYSA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IG5ld1NwZWNpZmllZFNjaGVtYTsKLQkJZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5zZXRTY2hlbWEobmV3U3BlY2lmaWVkU2NoZW1hKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTY2hlbWEsIG5ld1NwZWNpZmllZFNjaGVtYSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hXyhTdHJpbmcgbmV3U3BlY2lmaWVkU2NoZW1hKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRTY2hlbWEgPSB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBuZXdTcGVjaWZpZWRTY2hlbWE7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2NoZW1hLCBuZXdTcGVjaWZpZWRTY2hlbWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NoZW1hKFN0cmluZyBuZXdEZWZhdWx0U2NoZW1hKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0U2NoZW1hID0gdGhpcy5kZWZhdWx0U2NoZW1hOwotCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBuZXdEZWZhdWx0U2NoZW1hOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0NIRU1BX1BST1BFUlRZLCBvbGREZWZhdWx0U2NoZW1hLCBuZXdEZWZhdWx0U2NoZW1hKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBrQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFBrQ29sdW1uTmFtZShTdHJpbmcgbmV3U3BlY2lmaWVkUGtDb2x1bW5OYW1lKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRQa0NvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWUgPSBuZXdTcGVjaWZpZWRQa0NvbHVtbk5hbWU7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuc2V0UGtDb2x1bW5OYW1lKG5ld1NwZWNpZmllZFBrQ29sdW1uTmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRQa0NvbHVtbk5hbWUsIG5ld1NwZWNpZmllZFBrQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lXyhTdHJpbmcgbmV3U3BlY2lmaWVkUGtDb2x1bW5OYW1lKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRQa0NvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWUgPSBuZXdTcGVjaWZpZWRQa0NvbHVtbk5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRQa0NvbHVtbk5hbWUsIG5ld1NwZWNpZmllZFBrQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGtDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UGtDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKCkgOiB0aGlzLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKFN0cmluZyBuZXdTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSA9IHRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSA9IG5ld1NwZWNpZmllZFZhbHVlQ29sdW1uTmFtZTsKLQkJZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5zZXRWYWx1ZUNvbHVtbk5hbWUobmV3U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSwgbmV3U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSA9IHRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSA9IG5ld1NwZWNpZmllZFZhbHVlQ29sdW1uTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSwgbmV3U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZUNvbHVtbk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQa0NvbHVtblZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKFN0cmluZyBuZXdTcGVjaWZpZWRQa0NvbHVtblZhbHVlKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRQa0NvbHVtblZhbHVlID0gdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlOwotCQl0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWUgPSBuZXdTcGVjaWZpZWRQa0NvbHVtblZhbHVlOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldFBrQ29sdW1uVmFsdWUobmV3U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1BLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSwgbmV3U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZV8oU3RyaW5nIG5ld1NwZWNpZmllZFBrQ29sdW1uVmFsdWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFBrQ29sdW1uVmFsdWUgPSB0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWU7Ci0JCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSA9IG5ld1NwZWNpZmllZFBrQ29sdW1uVmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1BLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSwgbmV3U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGtDb2x1bW5WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFBrQ29sdW1uVmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVuaXF1ZSBjb25zdHJhaW50cyAqKioqKioqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+KHRoaXMudW5pcXVlQ29uc3RyYWludHMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludHMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVVuaXF1ZUNvbnN0cmFpbnQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFVbmlxdWVDb25zdHJhaW50KHRoaXMsIHRoaXMpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmFkZChpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7Ci0JCVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uID0gdGhpcy5nZXRHZW5lcmF0b3JSZXNvdXJjZSgpLmFkZFVuaXF1ZUNvbnN0cmFpbnQoaW5kZXgpOwotCQl1bmlxdWVDb25zdHJhaW50LmluaXRpYWxpemUodW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pOwotCQlmaXJlSXRlbUFkZGVkKFRhYmxlR2VuZXJhdG9yLlVOSVFVRV9DT05TVFJBSU5UU19MSVNULCBpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7Ci0JCXJldHVybiB1bmlxdWVDb25zdHJhaW50OwotCX0KLQkJCi0JcHVibGljIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJdGhpcy5yZW1vdmVVbmlxdWVDb25zdHJhaW50KHRoaXMudW5pcXVlQ29uc3RyYWludHMuaW5kZXhPZih1bmlxdWVDb25zdHJhaW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJSmF2YVVuaXF1ZUNvbnN0cmFpbnQgcmVtb3ZlZFVuaXF1ZUNvbnN0cmFpbnQgPSB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnJlbW92ZShpbmRleCk7Ci0JCXRoaXMuZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFRhYmxlR2VuZXJhdG9yLlVOSVFVRV9DT05TVFJBSU5UU19MSVNULCBpbmRleCwgcmVtb3ZlZFVuaXF1ZUNvbnN0cmFpbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldEdlbmVyYXRvclJlc291cmNlKCkubW92ZVVuaXF1ZUNvbnN0cmFpbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChUYWJsZUdlbmVyYXRvci5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCwgSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCB1bmlxdWVDb25zdHJhaW50LCB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCBUYWJsZUdlbmVyYXRvci5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnRfKEphdmFVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KHVuaXF1ZUNvbnN0cmFpbnQsIHRoaXMudW5pcXVlQ29uc3RyYWludHMsIFRhYmxlR2VuZXJhdG9yLlVOSVFVRV9DT05TVFJBSU5UU19MSVNUKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKioqIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVVbmlxdWVDb25zdHJhaW50Q29sdW1uTmFtZXMoKSB7Ci0JCW9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBkYlRhYmxlID0gZ2V0RGJUYWJsZSgpOwotCQlpZiAoZGJUYWJsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGJUYWJsZS5jb2x1bW5OYW1lcygpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGphdmEgcmVzb3VyY2UgbW9kZWwgLT4gamF2YSBjb250ZXh0IG1vZGVsICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvcikgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVJlc291cmNlKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IHRoaXMuc3BlY2lmaWVkVGFibGUodGFibGVHZW5lcmF0b3IpOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSB0aGlzLnNwZWNpZmllZENhdGFsb2codGFibGVHZW5lcmF0b3IpOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gdGhpcy5kZWZhdWx0Q2F0YWxvZygpOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gdGhpcy5kZWZhdWx0U2NoZW1hKCk7Ci0JCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWUodGFibGVHZW5lcmF0b3IpOwotCQl0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSA9IHRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlID0gdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5pbml0aWFsaXplVW5pcXVlQ29uc3RyYWludHModGFibGVHZW5lcmF0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVVbmlxdWVDb25zdHJhaW50cyhUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IpIHsKLQkJZm9yIChVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50cygpKSkgewotCQkJdGhpcy51bmlxdWVDb25zdHJhaW50cy5hZGQoYnVpbGRVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCXN1cGVyLnVwZGF0ZSh0YWJsZUdlbmVyYXRvcik7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVGFibGVfKHRoaXMuc3BlY2lmaWVkVGFibGUodGFibGVHZW5lcmF0b3IpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRDYXRhbG9nXyh0aGlzLnNwZWNpZmllZENhdGFsb2codGFibGVHZW5lcmF0b3IpKTsKLQkJdGhpcy5zZXREZWZhdWx0Q2F0YWxvZyh0aGlzLmRlZmF1bHRDYXRhbG9nKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8odGhpcy5zcGVjaWZpZWRTY2hlbWEodGFibGVHZW5lcmF0b3IpKTsKLQkJdGhpcy5zZXREZWZhdWx0U2NoZW1hKHRoaXMuZGVmYXVsdFNjaGVtYSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWVfKHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lKHRhYmxlR2VuZXJhdG9yKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lXyh0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSh0YWJsZUdlbmVyYXRvcikpOwotCQl0aGlzLnNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWVfKHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSh0YWJsZUdlbmVyYXRvcikpOwotCQl0aGlzLnVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKHRhYmxlR2VuZXJhdG9yKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVW5pcXVlQ29uc3RyYWludHMoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB1bmlxdWVDb25zdHJhaW50cygpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHJlc291cmNlVW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50cygpOwotCQkKLQkJd2hpbGUgKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSkgewotCQkJSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSkgewotCQkJCXVuaXF1ZUNvbnN0cmFpbnQudXBkYXRlKHJlc291cmNlVW5pcXVlQ29uc3RyYWludHMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVVuaXF1ZUNvbnN0cmFpbnRfKHVuaXF1ZUNvbnN0cmFpbnQpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VVbmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKLQkJCWFkZFVuaXF1ZUNvbnN0cmFpbnQodW5pcXVlQ29uc3RyYWludHNTaXplKCksIGJ1aWxkVW5pcXVlQ29uc3RyYWludChyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFVbmlxdWVDb25zdHJhaW50IGJ1aWxkVW5pcXVlQ29uc3RyYWludChVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbikgewotCQlKYXZhVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVVuaXF1ZUNvbnN0cmFpbnQodGhpcywgdGhpcyk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnQuaW5pdGlhbGl6ZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbik7Ci0JCXJldHVybiB1bmlxdWVDb25zdHJhaW50OwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFRhYmxlKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvcikgewotCQlyZXR1cm4gdGFibGVHZW5lcmF0b3IuZ2V0VGFibGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDYXRhbG9nKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvcikgewotCQlyZXR1cm4gdGFibGVHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNjaGVtYShUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IpIHsKLQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yLmdldFNjaGVtYSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFBrQ29sdW1uTmFtZShUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IpIHsKLQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yLmdldFBrQ29sdW1uTmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZShUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IpIHsKLQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yLmdldFZhbHVlQ29sdW1uTmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFBrQ29sdW1uVmFsdWUoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtblZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hKCkgewotCQlpZiAoZ2V0RW50aXR5TWFwcGluZ3MoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKTsKLQkJfQotCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nKCkgewotCQlpZiAoZ2V0RW50aXR5TWFwcGluZ3MoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCk7Ci0JCX0KLQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCi0JcHVibGljIFRhYmxlIGdldERiVGFibGUoKSB7Ci0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERiU2NoZW1hKCk7Ci0JCXJldHVybiAoc2NoZW1hID09IG51bGwpID8gbnVsbCA6IHNjaGVtYS50YWJsZU5hbWVkKHRoaXMuZ2V0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lZCh0aGlzLmdldFNjaGVtYSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUcmFuc2llbnRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVHJhbnNpZW50TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2Q5MTlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUcmFuc2llbnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVHJhbnNpZW50TWFwcGluZyBleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8VHJhbnNpZW50QW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFUcmFuc2llbnRNYXBwaW5nCi17Ci0JcHVibGljIEdlbmVyaWNKYXZhVHJhbnNpZW50TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY29ycmVzcG9uZGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVVuaXF1ZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczMzJjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVW5pcXVlQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhVW5pcXVlQ29uc3RyYWludAotewotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lczsKLQotCXByb3RlY3RlZCBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLQkKLQlwcm90ZWN0ZWQgT3duZXIgb3duZXI7Ci0JcHVibGljIEdlbmVyaWNKYXZhVW5pcXVlQ29uc3RyYWludChKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMuY29sdW1uTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQl9Ci0KLQlwdWJsaWMgT3duZXIgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmNvbHVtbk5hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbHVtbk5hbWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uTmFtZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbHVtbk5hbWUoaW50IGluZGV4LCBTdHJpbmcgY29sdW1uTmFtZSkgewotCQl0aGlzLmNvbHVtbk5hbWVzLmFkZChpbmRleCwgY29sdW1uTmFtZSk7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludEFubm90YXRpb24uYWRkQ29sdW1uTmFtZShpbmRleCwgY29sdW1uTmFtZSk7Ci0JCWZpcmVJdGVtQWRkZWQoVW5pcXVlQ29uc3RyYWludC5DT0xVTU5fTkFNRVNfTElTVCwgaW5kZXgsIGNvbHVtbk5hbWUpOwkJCi0JfQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5OYW1lXyhpbnQgaW5kZXgsIFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0JCXRoaXMuY29sdW1uTmFtZXMuYWRkKGluZGV4LCBjb2x1bW5OYW1lKTsKLQkJZmlyZUl0ZW1BZGRlZChVbmlxdWVDb25zdHJhaW50LkNPTFVNTl9OQU1FU19MSVNULCBpbmRleCwgY29sdW1uTmFtZSk7CQkKLQl9CQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSkgewotCQl0aGlzLnJlbW92ZUNvbHVtbk5hbWUodGhpcy5jb2x1bW5OYW1lcy5pbmRleE9mKGNvbHVtbk5hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5OYW1lKGludCBpbmRleCkgewotCQlTdHJpbmcgcmVtb3ZlZENvbHVtbk5hbWUgPSB0aGlzLmNvbHVtbk5hbWVzLnJlbW92ZShpbmRleCk7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludEFubm90YXRpb24ucmVtb3ZlQ29sdW1uTmFtZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChVbmlxdWVDb25zdHJhaW50LkNPTFVNTl9OQU1FU19MSVNULCBpbmRleCwgcmVtb3ZlZENvbHVtbk5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb2x1bW5OYW1lXyhpbnQgaW5kZXgpIHsKLQkJU3RyaW5nIHJlbW92ZWRDb2x1bW5OYW1lID0gdGhpcy5jb2x1bW5OYW1lcy5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoVW5pcXVlQ29uc3RyYWludC5DT0xVTU5fTkFNRVNfTElTVCwgaW5kZXgsIHJlbW92ZWRDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQ29sdW1uTmFtZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmNvbHVtbk5hbWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLm1vdmVDb2x1bW5OYW1lKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoVW5pcXVlQ29uc3RyYWludC5DT0xVTU5fTkFNRVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pIHsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiA9IHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotCQl0aGlzLmluaXRpYWxpemVDb2x1bW5OYW1lcyh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb2x1bW5OYW1lcyhVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbikgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBhbm5vdGF0aW9uQ29sdW1uTmFtZXMgPSB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbi5jb2x1bW5OYW1lcygpOwotCQkKLQkJZm9yIChTdHJpbmcgYW5ub3RhdGlvbkNvbHVtbk5hbWUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoYW5ub3RhdGlvbkNvbHVtbk5hbWVzKSkgewotCQkJdGhpcy5jb2x1bW5OYW1lcy5hZGQoYW5ub3RhdGlvbkNvbHVtbk5hbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKSB7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gPSB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLQkJdGhpcy51cGRhdGVDb2x1bW5OYW1lcyh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29sdW1uTmFtZXMoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gYW5ub3RhdGlvbkNvbHVtbk5hbWVzID0gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb24uY29sdW1uTmFtZXMoKTsKLQkJCi0JCWludCBpbmRleCA9IDA7Ci0JCWZvciAoU3RyaW5nIGFubm90YXRpb25Db2x1bW5OYW1lIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFubm90YXRpb25Db2x1bW5OYW1lcykpIHsKLQkJCWlmIChjb2x1bW5OYW1lc1NpemUoKSA+IGluZGV4KSB7Ci0JCQkJaWYgKHRoaXMuY29sdW1uTmFtZXMuZ2V0KGluZGV4KSAhPSBhbm5vdGF0aW9uQ29sdW1uTmFtZSkgewotCQkJCQlhZGRDb2x1bW5OYW1lXyhpbmRleCwgYW5ub3RhdGlvbkNvbHVtbk5hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWFkZENvbHVtbk5hbWVfKGluZGV4LCBhbm5vdGF0aW9uQ29sdW1uTmFtZSk7CQkJCi0JCQl9Ci0JCQlpbmRleCsrOwotCQl9Ci0JCQotCQlmb3IgKCA7IGluZGV4IDwgY29sdW1uTmFtZXNTaXplKCk7ICkgewotCQkJcmVtb3ZlQ29sdW1uTmFtZV8oaW5kZXgpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludEFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0JCi0KLQlwcml2YXRlIGJvb2xlYW4gY29sdW1uTmFtZXNUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmNvbHVtbk5hbWVzVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVDb2x1bW5OYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXIoKS5jYW5kaWRhdGVVbmlxdWVDb25zdHJhaW50Q29sdW1uTmFtZXMoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlQ29sdW1uTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2FuZGlkYXRlQ29sdW1uTmFtZXMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gcXVvdGVkQ2FuZGlkYXRlQ29sdW1uTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5xdW90ZSh0aGlzLmNhbmRpZGF0ZUNvbHVtbk5hbWVzKGZpbHRlcikpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5jb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAodGhpcy5jb2x1bW5OYW1lc1RvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmV0dXJuIHRoaXMucXVvdGVkQ2FuZGlkYXRlQ29sdW1uTmFtZXMoZmlsdGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmU3Zjg3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPFZlcnNpb25Bbm5vdGF0aW9uPiBpbXBsZW1lbnRzIEphdmFWZXJzaW9uTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhQ29sdW1uIGNvbHVtbjsKLQkKLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHRlbXBvcmFsOwotCi0JcHVibGljIEdlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29sdW1uID0gY3JlYXRlSmF2YUNvbHVtbigpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29sdW1uIGNyZWF0ZUphdmFDb2x1bW4oKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQ29sdW1uKHRoaXMsIHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVJlc291cmNlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tUmVzb3VyY2UocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy5jb2x1bW4uaW5pdGlhbGl6ZUZyb21SZXNvdXJjZSh0aGlzLmdldENvbHVtblJlc291cmNlKCkpOwotCQl0aGlzLnRlbXBvcmFsID0gdGhpcy50ZW1wb3JhbCh0aGlzLnRlbXBvcmFsUmVzb3VyY2UoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChUZW1wb3JhbEFubm90YXRpb24pIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChDb2x1bW5Bbm5vdGF0aW9uKSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROb25OdWxsQW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKiBJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvcnJlc3BvbmRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KAotCQkJSlBBLkNPTFVNTiwKLQkJCUpQQS5URU1QT1JBTCk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKiBJTmFtZWRDb2x1bW4uT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCX0KLQotCS8vKioqKioqKioqKioqKiogSVZlcnNpb25NYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBKYXZhQ29sdW1uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCX0KLQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKSB7Ci0JCXJldHVybiB0aGlzLnRlbXBvcmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkgewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0aGlzLnRlbXBvcmFsOwotCQl0aGlzLnRlbXBvcmFsID0gbmV3VGVtcG9yYWw7Ci0JCXRoaXMudGVtcG9yYWxSZXNvdXJjZSgpLnNldFZhbHVlKFRlbXBvcmFsVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKG5ld1RlbXBvcmFsKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ29sdW1uTWFwcGluZy5URU1QT1JBTF9QUk9QRVJUWSwgb2xkVGVtcG9yYWwsIG5ld1RlbXBvcmFsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJc3VwZXIudXBkYXRlKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZSh0aGlzLmdldENvbHVtblJlc291cmNlKCkpOwotCQl0aGlzLnNldFRlbXBvcmFsKHRoaXMudGVtcG9yYWwodGhpcy50ZW1wb3JhbFJlc291cmNlKCkpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSB0ZW1wb3JhbChUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwpIHsKLQkJcmV0dXJuIFRlbXBvcmFsVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwodGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJlc3VsdCA9IHRoaXMuZ2V0Q29sdW1uKCkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8vKioqKioqKioqKiogIFZhbGlkYXRpb24gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQkKLQkJYWRkQ29sdW1uTWVzc2FnZXMobWVzc2FnZXMsIGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSmF2YUNvbHVtbiBjb2x1bW4gPSB0aGlzLmdldENvbHVtbigpOwotCQlTdHJpbmcgdGFibGUgPSBjb2x1bW4uZ2V0VGFibGUoKTsKLQkJYm9vbGVhbiBkb0NvbnRpbnVlID0gZW50aXR5T3duZWQoKSAmJiBjb2x1bW4uY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgdGhpcy5nZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0YWJsZSwgY29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJY29sdW1uLCBjb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCkpCi0JCQkJKTsKLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgISBjb2x1bW4uaXNSZXNvbHZlZCgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQljb2x1bW4sIGNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpKQotCQkJCSk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzMGFkNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOworCitwdWJsaWMgY2xhc3MgSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IEphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhQmFzaWNNYXBwaW5nKHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHRlc3REZWZhdWx0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKKwkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUudHlwZUlzQmFzaWMoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQmFzaWNNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzN2Q3Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUJhc2ljTWFwcGluZ1Byb3ZpZGVyCi0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUJhc2ljTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFCYXNpY01hcHBpbmdQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSmF2YUJhc2ljTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YUJhc2ljTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkZWZhdWx0QXBwbGllcyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnR5cGVJc0Jhc2ljKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFDYXNjYWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFDYXNjYWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YTIxZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQ2FzY2FkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQ2FzY2FkZSBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgQ2FzY2FkZQotewotCXByb3RlY3RlZCBib29sZWFuIGFsbDsKLQotCXByb3RlY3RlZCBib29sZWFuIHBlcnNpc3Q7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXJnZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlZnJlc2g7Ci0KLQlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gcmVsYXRpb25zaGlwTWFwcGluZzsKLQotCXByb3RlY3RlZCBKYXZhQ2FzY2FkZShKYXZhUmVsYXRpb25zaGlwTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbCgpIHsKLQkJcmV0dXJuIHRoaXMuYWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsbChib29sZWFuIG5ld0FsbCkgewotCQlib29sZWFuIG9sZEFsbCA9IHRoaXMuYWxsOwotCQl0aGlzLmFsbCA9IG5ld0FsbDsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLnNldENhc2NhZGVBbGwobmV3QWxsKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDYXNjYWRlLkFMTF9QUk9QRVJUWSwgb2xkQWxsLCBuZXdBbGwpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdCgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0KGJvb2xlYW4gbmV3UGVyc2lzdCkgewotCQlib29sZWFuIG9sZFBlcnNpc3QgPSB0aGlzLnBlcnNpc3Q7Ci0JCXRoaXMucGVyc2lzdCA9IG5ld1BlcnNpc3Q7Ci0JCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5zZXRDYXNjYWRlUGVyc2lzdChuZXdQZXJzaXN0KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDYXNjYWRlLlBFUlNJU1RfUFJPUEVSVFksIG9sZFBlcnNpc3QsIG5ld1BlcnNpc3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWVyZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm1lcmdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1lcmdlKGJvb2xlYW4gbmV3TWVyZ2UpIHsKLQkJYm9vbGVhbiBvbGRNZXJnZSA9IHRoaXMubWVyZ2U7Ci0JCXRoaXMubWVyZ2UgPSBuZXdNZXJnZTsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLnNldENhc2NhZGVNZXJnZShuZXdNZXJnZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ2FzY2FkZS5NRVJHRV9QUk9QRVJUWSwgb2xkTWVyZ2UsIG5ld01lcmdlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlbW92ZShib29sZWFuIG5ld1JlbW92ZSkgewotCQlib29sZWFuIG9sZFJlbW92ZSA9IHRoaXMucmVtb3ZlOwotCQl0aGlzLnJlbW92ZSA9IG5ld1JlbW92ZTsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLnNldENhc2NhZGVSZW1vdmUobmV3UmVtb3ZlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDYXNjYWRlLlJFTU9WRV9QUk9QRVJUWSwgb2xkUmVtb3ZlLCBuZXdSZW1vdmUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIHRoaXMucmVmcmVzaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoKGJvb2xlYW4gbmV3UmVmcmVzaCkgewotCQlib29sZWFuIG9sZFJlZnJlc2ggPSB0aGlzLnJlZnJlc2g7Ci0JCXRoaXMucmVmcmVzaCA9IG5ld1JlZnJlc2g7Ci0JCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5zZXRDYXNjYWRlUmVmcmVzaChuZXdSZWZyZXNoKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDYXNjYWRlLlJFRlJFU0hfUFJPUEVSVFksIG9sZFJlZnJlc2gsIG5ld1JlZnJlc2gpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLmdldENhc2NhZGVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gcmVsYXRpb25zaGlwTWFwcGluZykgewotCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcgPSByZWxhdGlvbnNoaXBNYXBwaW5nOwotCQl0aGlzLmFsbCA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlQWxsKCk7Ci0JCXRoaXMucGVyc2lzdCA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlUGVyc2lzdCgpOwotCQl0aGlzLm1lcmdlID0gcmVsYXRpb25zaGlwTWFwcGluZy5pc0Nhc2NhZGVNZXJnZSgpOwotCQl0aGlzLnJlbW92ZSA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlUmVtb3ZlKCk7Ci0JCXRoaXMucmVmcmVzaCA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlUmVmcmVzaCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gcmVsYXRpb25zaGlwTWFwcGluZykgewotCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcgPSByZWxhdGlvbnNoaXBNYXBwaW5nOwotCQl0aGlzLnNldEFsbChyZWxhdGlvbnNoaXBNYXBwaW5nLmlzQ2FzY2FkZUFsbCgpKTsKLQkJdGhpcy5zZXRQZXJzaXN0KHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJdGhpcy5zZXRNZXJnZShyZWxhdGlvbnNoaXBNYXBwaW5nLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQl0aGlzLnNldFJlbW92ZShyZWxhdGlvbnNoaXBNYXBwaW5nLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkJdGhpcy5zZXRSZWZyZXNoKHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRhYmxlRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkYWJsZURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTk0ZWFiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkYWJsZURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFFbWJlZGRhYmxlRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCQluZXcgSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEphdmFFbWJlZGRhYmxlRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFbWJlZGRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIEphdmFFbWJlZGRhYmxlIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhRW1iZWRkYWJsZShwYXJlbnQpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGFibGVQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkYWJsZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmODU2NzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkYWJsZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkYWJsZUFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkYWJsZVByb3ZpZGVyCi0JaW1wbGVtZW50cyBKYXZhVHlwZU1hcHBpbmdQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVtYmVkZGFibGVQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhRW1iZWRkYWJsZVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKYXZhRW1iZWRkYWJsZVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhRW1iZWRkYWJsZSBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YUVtYmVkZGFibGUocGFyZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3OGNhZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uZyB1c2FnZQorCSAqLworCXByaXZhdGUgSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhRW1iZWRkZWRJZE1hcHBpbmcocGFyZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzBhY2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFbWJlZGRlZElkTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFFbWJlZGRlZElkTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKYXZhRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YUVtYmVkZGVkSWRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRlZmF1bHRBcHBsaWVzKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIE1hcHBpbmdUb29scy5nZXRFbWJlZGRhYmxlRm9yKHBlcnNpc3RlbnRBdHRyaWJ1dGUpICE9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MTBhNTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCW5ldyBKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YUVtYmVkZGVkTWFwcGluZyhwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiB0ZXN0RGVmYXVsdChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7CisJCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlLmdldEVtYmVkZGFibGUoKSAhPSBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZE1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGQ2ZjEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkZWRNYXBwaW5nUHJvdmlkZXIKLQlpbXBsZW1lbnRzIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyCi17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRW1iZWRkZWRNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YUVtYmVkZGVkTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKYXZhRW1iZWRkZWRNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhRW1iZWRkZWRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRlZmF1bHRBcHBsaWVzKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIE1hcHBpbmdUb29scy5nZXRFbWJlZGRhYmxlRm9yKHBlcnNpc3RlbnRBdHRyaWJ1dGUpICE9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW50aXR5RGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW50aXR5RGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZGYxMDIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbnRpdHlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOworCitwdWJsaWMgY2xhc3MgSmF2YUVudGl0eURlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFbnRpdHlEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCQluZXcgSmF2YUVudGl0eURlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgSmF2YUVudGl0eURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJcHVibGljIEphdmFFbnRpdHkgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFFbnRpdHkocGFyZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbnRpdHlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW50aXR5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExNGEwOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbnRpdHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFFbnRpdHlQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFbnRpdHlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhRW50aXR5UHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEphdmFFbnRpdHlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIEphdmFFbnRpdHkgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFFbnRpdHkocGFyZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2Y2YmJlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFJZE1hcHBpbmdEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFJZE1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUlkTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IEphdmFJZE1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEphdmFJZE1hcHBpbmdEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFJZE1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmRiNzk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFJZE1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUlkTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFJZE1hcHBpbmdQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKYXZhSWRNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhSWRNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWM5MjgxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOworCitwdWJsaWMgY2xhc3MgSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCW5ldyBKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YU1hbnlUb01hbnlNYXBwaW5nKHBhcmVudCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjgzNzBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhTWFueVRvTWFueU1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSmF2YU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhTWFueVRvTWFueU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDVjZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IEphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhTWFueVRvT25lTWFwcGluZyhwYXJlbnQpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1N2E5YzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhTWFueVRvT25lTWFwcGluZ1Byb3ZpZGVyCi0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyCi17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhTWFueVRvT25lTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFNYW55VG9PbmVNYXBwaW5nUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSmF2YU1hbnlUb09uZU1hcHBpbmdQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhTWFueVRvT25lTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNGM2MWMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOworCitwdWJsaWMgY2xhc3MgSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJCW5ldyBKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXB1YmxpYyBKYXZhTWFwcGVkU3VwZXJjbGFzcyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YU1hcHBlZFN1cGVyY2xhc3MocGFyZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjMzMTdjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFNYXBwZWRTdXBlcmNsYXNzUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIEphdmFNYXBwZWRTdXBlcmNsYXNzIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhTWFwcGVkU3VwZXJjbGFzcyhwYXJlbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDIwOWI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCi0vKioKLSAqIFRoaXMgbWFwcGluZyBwcm92aWRlciBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIEphdmFOdWxsQXR0cmlidXRlTWFwcGluZy4KLSAqIEEgSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nIHNob3VsZCBiZSB1c2VkIHdoZW4gbm8gIm1hcHBpbmciIGFubm90YXRpb24KLSAqIGV4aXN0cyBvbiBhIEphdmEgYXR0cmlidXRlICphbmQqIG5vIGRlZmF1bHQgbWFwcGluZyBhcHBsaWVzLgotICovCi1wdWJsaWMgY2xhc3MgSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFOdWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFOdWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEphdmFOdWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFOdWxsQXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU51bGxUeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTnVsbFR5cGVNYXBwaW5nLmphdmEKaW5kZXggYjMwNjdlNy4uZmVmZWNiZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTnVsbFR5cGVNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTnVsbFR5cGVNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CiAKIAogcHVibGljIGNsYXNzIEphdmFOdWxsVHlwZU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZwpAQCAtMzksMjIgKzQwLDM5IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAJCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY29ycmVzcG9uZGluZ0Fubm90YXRpb25OYW1lcygpIHsKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewogCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwogCX0KKworCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CiAJCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9BZGRpbmcgdGhpcyBtZXNzYWdlIGhlcmUgYmVjYXVzZSB0aGUgbGlrZWx5IHNvbHV0aW9uIGlzIHRvIGFkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSBqYXZhIGZpbGUuCi0JCS8vVGhpcyBtZXNzYWdlIHVzZWQgdG8gYmUgZm91bmQgb24gdGhlIDxjbGFzcz4gdGFnIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwuICBUaGUgb3RoZXIgcG9zc2libGUKLQkJLy93YXkgdG8gZml4IHRoZSBlcnJvciBpcyB0byByZW1vdmUgaXQgZnJvbSB0aGUgcGVyc2lzdG5jZS54bWwuICBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQKLQkJLy93aXRoIHRoZSBTeW5jaHJvbml6ZSBDbGFzc2VzIGFjdGlvbi4gIFdlIGNvdWxkIGFsc28gYWRkIGEgcXVpY2sgZml4IGZvciB0aGlzIGVycm9yLgotCQltZXNzYWdlcy5hZGQoRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfSU5WQUxJRF9DTEFTUywKLQkJCW5ldyBTdHJpbmdbXSB7IHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCkgfSwKLQkJCXRoaXMsCi0JCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkpKTsKKwlwdWJsaWMgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZUFnYWluc3REYXRhYmFzZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKioKKwkgKiBXZSBhZGRlZCB0aGlzIG1lc3NhZ2UgaGVyZSBiZWNhdXNlIHRoZSBtb3N0IGxpa2VseSBzb2x1dGlvbiBpcyB0byBhZGQKKwkgKiBhbiBhbm5vdGF0aW9uIHRvIHRoZSAuamF2YSBmaWxlLgorCSAqIFRoaXMgbWVzc2FnZSB1c2VkIHRvIGJlIGZvdW5kIG9uIHRoZSA8Y2xhc3M+IHRhZyBpbiBwZXJzaXN0ZW5jZS54bWwuCisJICogVGhlIG90aGVyIHBvc3NpYmxlIHdheSB0byBmaXggdGhlIGVycm9yIGlzIHRvIHJlbW92ZSBpdCBmcm9tIHBlcnNpc3RlbmNlLnhtbC4KKwkgKiBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgd2l0aCB0aGUgU3luY2hyb25pemUgQ2xhc3NlcyBhY3Rpb24uCisJICogV2UgY291bGQgYWxzbyBhZGQgYSBxdWljayBmaXggZm9yIHRoaXMgZXJyb3IuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJbWVzc2FnZXMuYWRkKAorCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX0NMQVNTLAorCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKX0sCisJCQkJdGhpcywKKwkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCSkKKwkJKTsKIAl9CiAJCiAJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOdWxsVHlwZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTnVsbFR5cGVNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjNjMxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOdWxsVHlwZU1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI7Ci0KLS8qKgotICogVGhpcyBtYXBwaW5nIHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nLgotICogQSBKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcgc2hvdWxkIGJlIHVzZWQgd2hlbiBubyAibWFwcGluZyIgYW5ub3RhdGlvbgotICogZXhpc3RzIG9uIGEgSmF2YSB0eXBlLiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFOdWxsVHlwZU1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFOdWxsVHlwZU1hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhTnVsbFR5cGVNYXBwaW5nUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEphdmFOdWxsVHlwZU1hcHBpbmdQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBKYXZhVHlwZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFOdWxsVHlwZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYTkzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOworCitwdWJsaWMgY2xhc3MgSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YU9uZVRvTWFueU1hcHBpbmcocGFyZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWI5MWY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YU9uZVRvTWFueU1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YU9uZVRvTWFueU1hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhT25lVG9NYW55TWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEphdmFPbmVUb01hbnlNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YU9uZVRvTWFueU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkwYmRjMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOworCitwdWJsaWMgY2xhc3MgSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IEphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFPbmVUb09uZU1hcHBpbmcocGFyZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5YjllZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhT25lVG9PbmVNYXBwaW5nUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFPbmVUb09uZU1hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhT25lVG9PbmVNYXBwaW5nUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSmF2YU9uZVRvT25lTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhT25lVG9PbmVNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhNjhjYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247CisKK3B1YmxpYyBjbGFzcyBKYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCW5ldyBKYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YVRyYW5zaWVudE1hcHBpbmcocGFyZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUcmFuc2llbnRNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRyYW5zaWVudE1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmI1YWEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRyYW5zaWVudE1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRyYW5zaWVudE1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVRyYW5zaWVudE1hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhVHJhbnNpZW50TWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEphdmFUcmFuc2llbnRNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFUcmFuc2llbnRNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDQyYWM2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOworCitwdWJsaWMgY2xhc3MgSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCW5ldyBKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhVmVyc2lvbk1hcHBpbmcocGFyZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFWZXJzaW9uTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFWZXJzaW9uTWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxN2VkYjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFWZXJzaW9uTWFwcGluZ1Byb3ZpZGVyCi0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyCi17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVmVyc2lvbk1hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhVmVyc2lvbk1hcHBpbmdQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKYXZhVmVyc2lvbk1hcHBpbmdQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhVmVyc2lvbk1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1ZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjdiN2IxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24KKwlleHRlbmRzIFZpcnR1YWxPdmVycmlkZUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uCit7CisJcHJvdGVjdGVkIEpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3k7CisKKwlwcml2YXRlIGZpbmFsIFZlY3RvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnM7CisJCisJcHJvdGVjdGVkIFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgU3RyaW5nIG5hbWUsIEpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kpIHsKKwkJc3VwZXIocGFyZW50LCBuYW1lKTsKKwkJdGhpcy5qb2luaW5nU3RyYXRlZ3kgPSBqb2luaW5nU3RyYXRlZ3k7CisJCXRoaXMuam9pbkNvbHVtbnMgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbnMoKTsKKwl9CisJCisJcHJvdGVjdGVkIFZlY3RvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gYnVpbGRKb2luQ29sdW1ucygpIHsKKwkJaWYgKHRoaXMuam9pbmluZ1N0cmF0ZWd5IGluc3RhbmNlb2YgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSkgeworCQkJVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPigoKEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kpIHRoaXMuam9pbmluZ1N0cmF0ZWd5KS5qb2luQ29sdW1uc1NpemUoKSk7CisJCQlmb3IgKEpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSgoKEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kpIHRoaXMuam9pbmluZ1N0cmF0ZWd5KS5qb2luQ29sdW1ucygpKSkgeworCQkJCXJlc3VsdC5hZGQobmV3IFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtbkFubm90YXRpb24odGhpcywgam9pbkNvbHVtbikpOworCQkJfQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlyZXR1cm4gbmV3IFZlY3RvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4oKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBzdXBlci5hZGRBbm5vdGF0aW9uKCk7CisJfQorCisJLy8gKioqKiogam9pbiBjb2x1bW5zCisJcHVibGljIExpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMoKSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLmxpc3RJdGVyYXRvcigpOworCX0KKwkKKwlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbkF0KGludCBpbmRleCkgeworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5lbGVtZW50QXQoaW5kZXgpOworCX0KKwkKKwlwdWJsaWMgaW50IGluZGV4T2ZKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pIHsKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbnMuaW5kZXhPZihqb2luQ29sdW1uKTsKKwl9CisJCisJcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisJCisJcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1uKGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJcHVibGljIHZvaWQgbW92ZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnVwZGF0ZShhc3RSb290KTsKKwkJLy9SZWJ1aWx0IGV2ZXJ5IHRpbWUgc28gbm8gbmVlZCB0byBpbXBsZW1lbnQgdXBkYXRlKCkKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1ZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ODIyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1ZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxCYXNlQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtbkFubm90YXRpb24gZXh0ZW5kcyBOdWxsQmFzZUNvbHVtbkFubm90YXRpb24KKwlpbXBsZW1lbnRzIEpvaW5Db2x1bW5Bbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBKb2luQ29sdW1uIGpvaW5Db2x1bW47CisKKwlwdWJsaWMgVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luQ29sdW1uQW5ub3RhdGlvbihBbm5vdGF0aW9uIHBhcmVudCwgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuam9pbkNvbHVtbiA9IGpvaW5Db2x1bW47CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcgY29sdW1uRGVmaW5pdGlvbikgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyB0YWJsZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0SW5zZXJ0YWJsZShCb29sZWFuIGluc2VydGFibGUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGdldFVwZGF0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRVcGRhdGFibGUoQm9vbGVhbiB1cGRhdGFibGUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGdldE51bGxhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiBudWxsYWJsZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEJvb2xlYW4gZ2V0VW5pcXVlKCkgeworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFVuaXF1ZShCb29sZWFuIHVuaXF1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1ZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmJjMWQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgY2xhc3MgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudHMgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXByaXZhdGUgZmluYWwgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uIGNvbHVtbjsKLQkKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkKLQlwdWJsaWMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSwgQ29sdW1uIGNvbHVtbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmNvbHVtbiA9IG5ldyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4odGhpcywgY29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbnVsbCwgbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSgpLnNldE5hbWUobmFtZSk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGdldE5vbk51bGxDb2x1bW4oKSB7Ci0JCXJldHVybiBnZXRDb2x1bW4oKTsKLQl9Ci0JCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGFkZENvbHVtbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKCkgewotCQlyZXR1cm4gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgZ2V0UGFyZW50KCkuYWRkQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVlNzFmYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uCisJZXh0ZW5kcyBWaXJ0dWFsT3ZlcnJpZGVBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gCit7CisJcHJpdmF0ZSBmaW5hbCBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbjsKKworCisJcHVibGljIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIFN0cmluZyBuYW1lLCBDb2x1bW4gY29sdW1uKSB7CisJCXN1cGVyKHBhcmVudCwgbmFtZSk7CisJCXRoaXMuY29sdW1uID0gbmV3IFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbkFubm90YXRpb24odGhpcywgY29sdW1uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKKwl9CisKKwkvLyAqKioqKiogY29sdW1uCisJcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy5jb2x1bW47CisJfQorCisJcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Tm9uTnVsbENvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uKCk7CisJfQorCisJcHVibGljIENvbHVtbkFubm90YXRpb24gYWRkQ29sdW1uKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW4oKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMGU4ZWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4gZXh0ZW5kcyBOdWxsQmFzZUNvbHVtbiBpbXBsZW1lbnRzIENvbHVtbkFubm90YXRpb24sIEFubm90YXRpb24KLXsJCi0JcHJpdmF0ZSBDb2x1bW4gY29sdW1uOwotCQotCXB1YmxpYyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIHBhcmVudCwgQ29sdW1uIGNvbHVtbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbHVtbiA9IGNvbHVtbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbHVtbkFubm90YXRpb24gY3JlYXRlQ29sdW1uUmVzb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnQoKS5hZGRDb2x1bW4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmICh0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJaWYgKHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBCb29sZWFuIGdldEluc2VydGFibGUoKSB7Ci0JCWlmICh0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEJvb2xlYW4gZ2V0VXBkYXRhYmxlKCkgewotCQlpZiAodGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpIHsKLQkJaWYgKHRoaXMuY29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBCb29sZWFuIGdldFVuaXF1ZSgpIHsKLQkJaWYgKHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0JCWlmICh0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIGxlbmd0aCkgewotCQlpZiAobGVuZ3RoICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEludGVnZXIgZ2V0U2NhbGUoKSB7Ci0JCWlmICh0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTY2FsZShJbnRlZ2VyIHNjYWxlKSB7Ci0JCWlmIChzY2FsZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVDb2x1bW5SZXNvdXJjZSgpLnNldFNjYWxlKHNjYWxlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRQcmVjaXNpb24oKSB7Ci0JCWlmICh0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByZWNpc2lvbihJbnRlZ2VyIHByZWNpc2lvbikgewotCQlpZiAocHJlY2lzaW9uICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0UHJlY2lzaW9uKHByZWNpc2lvbik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY2FsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRMZW5ndGhUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJlY2lzaW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllYmNhYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uQW5ub3RhdGlvbgorCWV4dGVuZHMgTnVsbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uQW5ub3RhdGlvbgoreworCXByaXZhdGUgQ29sdW1uIGNvbHVtbjsKKworCXB1YmxpYyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5Bbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBwYXJlbnQsIENvbHVtbiBjb2x1bW4pIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5jb2x1bW4gPSBjb2x1bW47CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGdldFVwZGF0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGdldE51bGxhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKSB7CisJCXJldHVybiB0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKSB7CisJCXJldHVybiB0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSW50ZWdlciBnZXRTY2FsZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEludGVnZXIgZ2V0UHJlY2lzaW9uKCkgeworCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1ZpcnR1YWxPdmVycmlkZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvVmlydHVhbE92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjE2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1ZpcnR1YWxPdmVycmlkZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogQ29tbW9uIGJlaGF2aW9yIGZvciB2aXJ0dWFsIHZlcnNpb25zIG9mCisgKiAgICAgamF2YXgucGVyc2lzdGVuY2UuQXR0cmlidXRlT3ZlcnJpZGUKKyAqIGFuZAorICogICAgIGphdmF4LnBlcnNpc3RlbmNlLkFzc29jaWF0aW9uT3ZlcnJpZGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFZpcnR1YWxPdmVycmlkZUFubm90YXRpb24KKwlleHRlbmRzIE51bGxBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBPdmVycmlkZUFubm90YXRpb24KK3sKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJcHVibGljIFZpcnR1YWxPdmVycmlkZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE92ZXJyaWRlQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKE92ZXJyaWRlQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCisJLy8gKioqKiogbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQlpZiAobmFtZSAhPSBudWxsKSB7CisJCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXROYW1lKG5hbWUpOworCQl9CQkKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdEVudGl0eU1hcHBpbmdzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RFbnRpdHlNYXBwaW5ncy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NDkxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RFbnRpdHlNYXBwaW5ncy5qYXZhCkBAIC0wLDAgKzEsNzg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGVSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVN0cnVjdHVyZU5vZGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ2F0YWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWFDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBFbnRpdHlNYXBwaW5ncworeworCXByb3RlY3RlZCBmaW5hbCBYbWxFbnRpdHlNYXBwaW5ncyB4bWxFbnRpdHlNYXBwaW5nczsKKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOworCisJcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdlXzsKKworCXByb3RlY3RlZCBBY2Nlc3NUeXBlIHNwZWNpZmllZEFjY2VzczsKKwlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBkZWZhdWx0QWNjZXNzOworCQkKKwlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENhdGFsb2c7CisJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKKworCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2NoZW1hOworCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYTsKKworCXByb3RlY3RlZCAvKmZpbmFsKi8gUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7CisKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1QZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzOworCisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9yczsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1UYWJsZUdlbmVyYXRvcj4gdGFibGVHZW5lcmF0b3JzOworCisJcHJvdGVjdGVkIGZpbmFsIE9ybVF1ZXJ5Q29udGFpbmVyIHF1ZXJ5Q29udGFpbmVyOworCisKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbnRpdHlNYXBwaW5ncyhPcm1YbWwgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyB4bWxFbnRpdHlNYXBwaW5ncykgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzID0geG1sRW50aXR5TWFwcGluZ3M7CisJCXRoaXMucGVyc2lzdGVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxPcm1QZXJzaXN0ZW50VHlwZT4oKTsKKwkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcnMgPSBuZXcgQXJyYXlMaXN0PE9ybVNlcXVlbmNlR2VuZXJhdG9yPigpOworCQl0aGlzLnRhYmxlR2VuZXJhdG9ycyA9IG5ldyBBcnJheUxpc3Q8T3JtVGFibGVHZW5lcmF0b3I+KCk7CisJCXRoaXMucXVlcnlDb250YWluZXIgPSBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVF1ZXJ5Q29udGFpbmVyKHRoaXMsIHhtbEVudGl0eU1hcHBpbmdzKTsKKworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gYnVpbGRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOworCQl0aGlzLmRlc2NyaXB0aW9uID0gdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXREZXNjcmlwdGlvbigpOworCQl0aGlzLnBhY2thZ2VfID0gdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRQYWNrYWdlKCk7CisKKwkJdGhpcy5kZWZhdWx0QWNjZXNzID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0QWNjZXNzKCk7CisJCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gdGhpcy5nZXRSZXNvdXJjZUFjY2VzcygpOworCisJCXRoaXMuZGVmYXVsdENhdGFsb2cgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldERlZmF1bHRDYXRhbG9nKCk7CisJCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0Q2F0YWxvZygpOworCisJCXRoaXMuZGVmYXVsdFNjaGVtYSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOworCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0U2NoZW1hKCk7CisKKwkJdGhpcy5pbml0aWFsaXplUGVyc2lzdGVudFR5cGVzKCk7CisJCXRoaXMuaW5pdGlhbGl6ZVRhYmxlR2VuZXJhdG9ycygpOworCQl0aGlzLmluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvcnMoKTsKKwl9CisJCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGJ1aWxkUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSB7CisJCXJldHVybiBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKHRoaXMsIHRoaXMueG1sRW50aXR5TWFwcGluZ3MpOworCX0KKwkKKwlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVudFR5cGUgYnVpbGRQZXJzaXN0ZW50VHlwZShYbWxUeXBlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudFR5cGUodGhpcywgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CQorCQorCS8vICoqKioqKioqKioqKioqKiogSnBhTm9kZSBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtWG1sIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChPcm1YbWwpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKworCXByb3RlY3RlZCBPcm1YbWwgZ2V0T3JtWG1sKCkgeworCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBKcGFDb250ZXh0Tm9kZSBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBNYXBwaW5nRmlsZVJvb3QgZ2V0TWFwcGluZ0ZpbGVSb290KCkgeworCQlyZXR1cm4gdGhpczsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBKcGFTdHJ1Y3R1cmVOb2RlIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBPcm1TdHJ1Y3R1cmVOb2Rlcy5FTlRJVFlfTUFQUElOR1NfSUQ7CisJfQorCQorCQorCS8vICoqKioqKioqKiogUGVyc2lzdGVudFR5cGUuT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0T3ZlcnJpZGVQZXJzaXN0ZW50VHlwZUFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpID8gdGhpcy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSA6IG51bGw7CisJfQorCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdFBlcnNpc3RlbnRUeXBlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2V0QWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBlcnNpc3RlbnRUeXBlUGFja2FnZSgpIHsKKwkJcmV0dXJuIGdldFBhY2thZ2UoKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFBlcnNpc3RlbnRUeXBlTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIEVudGl0eU1hcHBpbmdzIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFhtbEVudGl0eU1hcHBpbmdzIGdldFhtbEVudGl0eU1hcHBpbmdzKCkgeworCQlyZXR1cm4gdGhpcy54bWxFbnRpdHlNYXBwaW5nczsKKwl9CisJCisJcHVibGljIHZvaWQgY2hhbmdlTWFwcGluZyhPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSwgT3JtVHlwZU1hcHBpbmcgb2xkTWFwcGluZywgT3JtVHlwZU1hcHBpbmcgbmV3TWFwcGluZykgeworCQlBY2Nlc3NUeXBlIHNhdmVkQWNjZXNzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCk7CisJCW9ybVBlcnNpc3RlbnRUeXBlLmRpc3Bvc2UoKTsKKwkJaW50IHNvdXJjZUluZGV4ID0gdGhpcy5wZXJzaXN0ZW50VHlwZXMuaW5kZXhPZihvcm1QZXJzaXN0ZW50VHlwZSk7CisJCXRoaXMucGVyc2lzdGVudFR5cGVzLnJlbW92ZShzb3VyY2VJbmRleCk7CisJCW9sZE1hcHBpbmcucmVtb3ZlRnJvbVJlc291cmNlTW9kZWwodGhpcy54bWxFbnRpdHlNYXBwaW5ncyk7CisJCWludCB0YXJnZXRJbmRleCA9IGluc2VydGlvbkluZGV4KG9ybVBlcnNpc3RlbnRUeXBlKTsKKwkJdGhpcy5wZXJzaXN0ZW50VHlwZXMuYWRkKHRhcmdldEluZGV4LCBvcm1QZXJzaXN0ZW50VHlwZSk7CisJCW5ld01hcHBpbmcuYWRkVG9SZXNvdXJjZU1vZGVsKHRoaXMueG1sRW50aXR5TWFwcGluZ3MpOworCQkKKwkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbShvbGRNYXBwaW5nKTsKKwkJLy9ub3Qgc3VyZSB3aGVyZSBlbHNlIHRvIHB1dCB0aGlzLCBuZWVkIHRvIHNldCB0aGUgYWNjZXNzIG9uIHRoZSByZXNvdXJjZSBtb2RlbAorCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3Moc2F2ZWRBY2Nlc3MpOworCQlmaXJlSXRlbU1vdmVkKFBFUlNJU1RFTlRfVFlQRVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwl9CisJCisJcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7CisJCWZvciAoT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgOiB0aGlzLmdldFBlcnNpc3RlbnRUeXBlcygpKSB7CisJCQlpZiAob3JtUGVyc2lzdGVudFR5cGUuaXNGb3IoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkpIHsKKwkJCQlyZXR1cm4gb3JtUGVyc2lzdGVudFR5cGU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkgeworCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2UoKSB7CisJCXJldHVybiB0aGlzLnBhY2thZ2VfOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRQYWNrYWdlKFN0cmluZyBuZXdQYWNrYWdlKSB7CisJCVN0cmluZyBvbGRQYWNrYWdlID0gdGhpcy5wYWNrYWdlXzsKKwkJdGhpcy5wYWNrYWdlXyA9IG5ld1BhY2thZ2U7CisJCXRoaXMueG1sRW50aXR5TWFwcGluZ3Muc2V0UGFja2FnZShuZXdQYWNrYWdlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChQQUNLQUdFX1BST1BFUlRZLCBvbGRQYWNrYWdlLCBuZXdQYWNrYWdlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiB0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFZlcnNpb24oKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKKwkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbjsKKwkJdGhpcy5kZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOworCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLnNldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERVNDUklQVElPTl9QUk9QRVJUWSwgb2xkRGVzY3JpcHRpb24sIG5ld0Rlc2NyaXB0aW9uKTsKKwl9CisKKworCS8vICoqKioqKioqKiogYWNjZXNzICoqKioqKioqKioKKworCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEFjY2VzcyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQWNjZXNzIDogdGhpcy5kZWZhdWx0QWNjZXNzOworCX0KKworCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWNjZXNzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlIGFjY2VzcykgeworCQlBY2Nlc3NUeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzOworCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IGFjY2VzczsKKwkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5zZXRBY2Nlc3MoQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwoYWNjZXNzKSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZLCBvbGQsIGFjY2Vzcyk7CisJfQorCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdEFjY2VzczsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0QWNjZXNzKEFjY2Vzc1R5cGUgYWNjZXNzKSB7CisJCUFjY2Vzc1R5cGUgb2xkID0gdGhpcy5kZWZhdWx0QWNjZXNzOworCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSBhY2Nlc3M7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0FDQ0VTU19QUk9QRVJUWSwgb2xkLCBhY2Nlc3MpOworCX0KKworCisJLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRTY2hlbWEgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFNjaGVtYSA6IHRoaXMuZGVmYXVsdFNjaGVtYTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NoZW1hOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFNjaGVtYTsKKwkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBzY2hlbWE7CisJCXRoaXMueG1sRW50aXR5TWFwcGluZ3Muc2V0U2NoZW1hKHNjaGVtYSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NoZW1hOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0U2NoZW1hOworCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBzY2hlbWE7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOworCX0KKworCXB1YmxpYyBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7CisJCVNjaGVtYUNvbnRhaW5lciBkYlNjaGVtYUNvbnRhaW5lciA9IHRoaXMuZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKKwkJcmV0dXJuIChkYlNjaGVtYUNvbnRhaW5lciA9PSBudWxsKSA/IG51bGwgOiBkYlNjaGVtYUNvbnRhaW5lci5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHRoaXMuZ2V0U2NoZW1hKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZENhdGFsb2cgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZENhdGFsb2cgOiB0aGlzLmRlZmF1bHRDYXRhbG9nOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZENhdGFsb2c7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOworCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBjYXRhbG9nOworCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLnNldENhdGFsb2coY2F0YWxvZyk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgeworCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKKwkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IGNhdGFsb2c7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7CisJfQorCisJLyoqCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPgorCSAqIGNhdGFsb2cpLCB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgorCSAqLworCXB1YmxpYyBDYXRhbG9nIGdldERiQ2F0YWxvZygpIHsKKwkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2coKTsKKwkJcmV0dXJuIChjYXRhbG9nID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0RGJDYXRhbG9nKGNhdGFsb2cpOworCX0KKworCisJLy8gKioqKioqKioqKiBzY2hlbWEgY29udGFpbmVyICoqKioqKioqKioKKworCS8qKgorCSAqIElmIHdlIGRvbid0IGhhdmUgYSBjYXRhbG9nIChpLmUuIHdlIGRvbid0IGV2ZW4gaGF2ZSBhIDxlbT5kZWZhdWx0PC9lbT4gY2F0YWxvZyksCisJICogdGhlbiB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9nczsgYW5kIHdlIG5lZWQgdG8KKwkgKiBnZXQgdGhlIHNjaGVtYSBkaXJlY3RseSBmcm9tIHRoZSBkYXRhYmFzZS4KKwkgKi8KKwlwdWJsaWMgU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyKCkgeworCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygpOworCQlyZXR1cm4gKGNhdGFsb2cgIT0gbnVsbCkgPyB0aGlzLmdldERiQ2F0YWxvZyhjYXRhbG9nKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogT1JNIHBlcnNpc3RlbnQgdHlwZXMgKioqKioqKioqKgorCisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPih0aGlzLnBlcnNpc3RlbnRUeXBlcyk7CisJfQorCQorCXB1YmxpYyBJdGVyYWJsZTxPcm1QZXJzaXN0ZW50VHlwZT4gZ2V0UGVyc2lzdGVudFR5cGVzKCkgeworCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRUeXBlPih0aGlzLnBlcnNpc3RlbnRUeXBlcyk7CisJfQorCQorCXB1YmxpYyBpbnQgcGVyc2lzdGVudFR5cGVzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMucGVyc2lzdGVudFR5cGVzLnNpemUoKTsKKwl9CisJCisJcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlIGFkZFBlcnNpc3RlbnRUeXBlKFN0cmluZyBtYXBwaW5nS2V5LCBTdHJpbmcgY2xhc3NOYW1lKSB7CisJCU9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBtYXBwaW5nRGVmaW5pdGlvbiA9IAorCQkJCWdldE1hcHBpbmdGaWxlRGVmaW5pdGlvbigpLmdldE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbihtYXBwaW5nS2V5KTsKKwkJWG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSAKKwkJCQltYXBwaW5nRGVmaW5pdGlvbi5idWlsZFJlc291cmNlTWFwcGluZyhnZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCkpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGJ1aWxkUGVyc2lzdGVudFR5cGUodHlwZU1hcHBpbmcpOworCQlpbnQgaW5kZXggPSBpbnNlcnRpb25JbmRleChwZXJzaXN0ZW50VHlwZSk7CisJCXRoaXMucGVyc2lzdGVudFR5cGVzLmFkZChpbmRleCwgcGVyc2lzdGVudFR5cGUpOworCQlpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoZ2V0UGFja2FnZSgpICsgJy4nKSkgeworCQkJLy8gYWRkcyBzaG9ydCBuYW1lIGlmIHBhY2thZ2UgbmFtZSBpcyBzcGVjaWZpZWQKKwkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoZ2V0UGFja2FnZSgpLmxlbmd0aCgpICsgMSk7CisJCX0KKwkJcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLmFkZFRvUmVzb3VyY2VNb2RlbCh0aGlzLnhtbEVudGl0eU1hcHBpbmdzKTsKKwkJdHlwZU1hcHBpbmcuc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7CisJCWZpcmVJdGVtQWRkZWQoUEVSU0lTVEVOVF9UWVBFU19MSVNULCBpbmRleCwgcGVyc2lzdGVudFR5cGUpOworCQlyZXR1cm4gcGVyc2lzdGVudFR5cGU7CisJfQorCisJcHJvdGVjdGVkIGludCBpbnNlcnRpb25JbmRleChPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSkgeworCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YoCisJCQkJdGhpcy5wZXJzaXN0ZW50VHlwZXMsIG9ybVBlcnNpc3RlbnRUeXBlLCBidWlsZE1hcHBpbmdDb21wYXJhdG9yKCkpOworCX0KKworCXByaXZhdGUgQ29tcGFyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gYnVpbGRNYXBwaW5nQ29tcGFyYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPigpIHsKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShPcm1QZXJzaXN0ZW50VHlwZSBvMSwgT3JtUGVyc2lzdGVudFR5cGUgbzIpIHsKKwkJCQlpbnQgbzFTZXF1ZW5jZSA9IG8xLmdldE1hcHBpbmcoKS5nZXRYbWxTZXF1ZW5jZSgpOworCQkJCWludCBvMlNlcXVlbmNlID0gbzIuZ2V0TWFwcGluZygpLmdldFhtbFNlcXVlbmNlKCk7CisJCQkJaWYgKG8xU2VxdWVuY2UgPCBvMlNlcXVlbmNlKSB7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJaWYgKG8xU2VxdWVuY2UgPT0gbzJTZXF1ZW5jZSkgeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX07CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlUGVyc2lzdGVudFR5cGUoaW50IGluZGV4KSB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gdGhpcy5wZXJzaXN0ZW50VHlwZXMuZ2V0KGluZGV4KTsKKwkJcGVyc2lzdGVudFR5cGUuZGlzcG9zZSgpOworCQl0aGlzLnBlcnNpc3RlbnRUeXBlcy5yZW1vdmUoaW5kZXgpOworCQlwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkucmVtb3ZlRnJvbVJlc291cmNlTW9kZWwodGhpcy54bWxFbnRpdHlNYXBwaW5ncyk7CisJCWZpcmVJdGVtUmVtb3ZlZChQRVJTSVNURU5UX1RZUEVTX0xJU1QsIGluZGV4LCBwZXJzaXN0ZW50VHlwZSk7CQkKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlUGVyc2lzdGVudFR5cGUoT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKKwkJcmVtb3ZlUGVyc2lzdGVudFR5cGUodGhpcy5wZXJzaXN0ZW50VHlwZXMuaW5kZXhPZihwZXJzaXN0ZW50VHlwZSkpOwkKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUGVyc2lzdGVudFR5cGVfKE9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKSB7CisJCXBlcnNpc3RlbnRUeXBlLmRpc3Bvc2UoKTsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KHBlcnNpc3RlbnRUeXBlLCB0aGlzLnBlcnNpc3RlbnRUeXBlcywgUEVSU0lTVEVOVF9UWVBFU19MSVNUKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgbW92ZVBlcnNpc3RlbnRUeXBlXyhpbnQgaW5kZXgsIE9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKSB7CisJCW1vdmVJdGVtSW5MaXN0KGluZGV4LCB0aGlzLnBlcnNpc3RlbnRUeXBlcy5pbmRleE9mKHBlcnNpc3RlbnRUeXBlKSwgdGhpcy5wZXJzaXN0ZW50VHlwZXMsIFBFUlNJU1RFTlRfVFlQRVNfTElTVCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHNlcXVlbmNlIGdlbmVyYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybVNlcXVlbmNlR2VuZXJhdG9yPih0aGlzLnNlcXVlbmNlR2VuZXJhdG9ycyk7CisJfQorCQorCXB1YmxpYyBpbnQgc2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3JzLnNpemUoKTsKKwl9CisJCisJcHVibGljIE9ybVNlcXVlbmNlR2VuZXJhdG9yIGFkZFNlcXVlbmNlR2VuZXJhdG9yKGludCBpbmRleCkgeworCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yID0gdGhpcy5idWlsZFJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJT3JtU2VxdWVuY2VHZW5lcmF0b3IgY29udGV4dFNlcXVlbmNlR2VuZXJhdG9yID0gIHRoaXMuYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihyZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKTsKKwkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcnMuYWRkKGluZGV4LCBjb250ZXh0U2VxdWVuY2VHZW5lcmF0b3IpOworCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmFkZChpbmRleCwgcmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcik7CisJCWZpcmVJdGVtQWRkZWQoU0VRVUVOQ0VfR0VORVJBVE9SU19MSVNULCBpbmRleCwgY29udGV4dFNlcXVlbmNlR2VuZXJhdG9yKTsKKwkJcmV0dXJuIGNvbnRleHRTZXF1ZW5jZUdlbmVyYXRvcjsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZXF1ZW5jZUdlbmVyYXRvcihpbnQgaW5kZXgsIE9ybVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yKSB7CisJCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHNlcXVlbmNlR2VuZXJhdG9yLCB0aGlzLnNlcXVlbmNlR2VuZXJhdG9ycywgRW50aXR5TWFwcGluZ3MuU0VRVUVOQ0VfR0VORVJBVE9SU19MSVNUKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZXF1ZW5jZUdlbmVyYXRvcihPcm1TZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcikgeworCQl0aGlzLmFkZFNlcXVlbmNlR2VuZXJhdG9yKHRoaXMuc2VxdWVuY2VHZW5lcmF0b3JzLnNpemUoKSwgc2VxdWVuY2VHZW5lcmF0b3IpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKE9ybVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yKSB7CisJCXJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKHRoaXMuc2VxdWVuY2VHZW5lcmF0b3JzLmluZGV4T2Yoc2VxdWVuY2VHZW5lcmF0b3IpKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoaW50IGluZGV4KSB7CisJCU9ybVNlcXVlbmNlR2VuZXJhdG9yIHJlbW92ZWRTZXF1ZW5jZUdlbmVyYXRvciA9IHRoaXMuc2VxdWVuY2VHZW5lcmF0b3JzLnJlbW92ZShpbmRleCk7CisJCWZpcmVJdGVtUmVtb3ZlZChTRVFVRU5DRV9HRU5FUkFUT1JTX0xJU1QsIGluZGV4LCByZW1vdmVkU2VxdWVuY2VHZW5lcmF0b3IpOworCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnJlbW92ZShpbmRleCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yXyhPcm1TZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcikgeworCQlyZW1vdmVJdGVtRnJvbUxpc3Qoc2VxdWVuY2VHZW5lcmF0b3IsIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3JzLCBFbnRpdHlNYXBwaW5ncy5TRVFVRU5DRV9HRU5FUkFUT1JTX0xJU1QpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVTZXF1ZW5jZUdlbmVyYXRvcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNlcXVlbmNlR2VuZXJhdG9ycywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCWZpcmVJdGVtTW92ZWQoRW50aXR5TWFwcGluZ3MuU0VRVUVOQ0VfR0VORVJBVE9SU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkKKwl9CisJCisJcHJvdGVjdGVkIFhtbFNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkUmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJfQorCisJLy8gKioqKioqKioqKiB0YWJsZSBnZW5lcmF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtVGFibGVHZW5lcmF0b3I+IHRhYmxlR2VuZXJhdG9ycygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1UYWJsZUdlbmVyYXRvcj4odGhpcy50YWJsZUdlbmVyYXRvcnMpOworCX0KKworCXB1YmxpYyBpbnQgdGFibGVHZW5lcmF0b3JzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMudGFibGVHZW5lcmF0b3JzLnNpemUoKTsKKwl9CisJCisJcHVibGljIE9ybVRhYmxlR2VuZXJhdG9yIGFkZFRhYmxlR2VuZXJhdG9yKGludCBpbmRleCkgeworCQlYbWxUYWJsZUdlbmVyYXRvciByZXNvdXJjZVRhYmxlR2VuZXJhdG9yID0gYnVpbGRSZXNvdXJjZVRhYmxlR2VuZXJhdG9yKCk7CisJCU9ybVRhYmxlR2VuZXJhdG9yIGNvbnRleHRUYWJsZUdlbmVyYXRvciA9IGJ1aWxkVGFibGVHZW5lcmF0b3IocmVzb3VyY2VUYWJsZUdlbmVyYXRvcik7CisJCXRoaXMudGFibGVHZW5lcmF0b3JzLmFkZChpbmRleCwgY29udGV4dFRhYmxlR2VuZXJhdG9yKTsKKwkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRUYWJsZUdlbmVyYXRvcnMoKS5hZGQoaW5kZXgsIHJlc291cmNlVGFibGVHZW5lcmF0b3IpOworCQlmaXJlSXRlbUFkZGVkKFRBQkxFX0dFTkVSQVRPUlNfTElTVCwgaW5kZXgsIGNvbnRleHRUYWJsZUdlbmVyYXRvcik7CisJCXJldHVybiBjb250ZXh0VGFibGVHZW5lcmF0b3I7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFRhYmxlR2VuZXJhdG9yKGludCBpbmRleCwgT3JtVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IpIHsKKwkJYWRkSXRlbVRvTGlzdChpbmRleCwgdGFibGVHZW5lcmF0b3IsIHRoaXMudGFibGVHZW5lcmF0b3JzLCBFbnRpdHlNYXBwaW5ncy5UQUJMRV9HRU5FUkFUT1JTX0xJU1QpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZFRhYmxlR2VuZXJhdG9yKE9ybVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yKSB7CisJCXRoaXMuYWRkVGFibGVHZW5lcmF0b3IodGhpcy50YWJsZUdlbmVyYXRvcnMuc2l6ZSgpLCB0YWJsZUdlbmVyYXRvcik7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlVGFibGVHZW5lcmF0b3IoT3JtVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IpIHsKKwkJcmVtb3ZlVGFibGVHZW5lcmF0b3IodGhpcy50YWJsZUdlbmVyYXRvcnMuaW5kZXhPZih0YWJsZUdlbmVyYXRvcikpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVRhYmxlR2VuZXJhdG9yKGludCBpbmRleCkgeworCQlPcm1UYWJsZUdlbmVyYXRvciByZW1vdmVkVGFibGVHZW5lcmF0b3IgPSB0aGlzLnRhYmxlR2VuZXJhdG9ycy5yZW1vdmUoaW5kZXgpOworCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFRhYmxlR2VuZXJhdG9ycygpLnJlbW92ZShpbmRleCk7CisJCWZpcmVJdGVtUmVtb3ZlZChUQUJMRV9HRU5FUkFUT1JTX0xJU1QsIGluZGV4LCByZW1vdmVkVGFibGVHZW5lcmF0b3IpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVUYWJsZUdlbmVyYXRvcl8oT3JtVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IpIHsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KHRhYmxlR2VuZXJhdG9yLCB0aGlzLnRhYmxlR2VuZXJhdG9ycywgRW50aXR5TWFwcGluZ3MuVEFCTEVfR0VORVJBVE9SU19MSVNUKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlVGFibGVHZW5lcmF0b3IoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy50YWJsZUdlbmVyYXRvcnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCXRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0VGFibGVHZW5lcmF0b3JzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQlmaXJlSXRlbU1vdmVkKEVudGl0eU1hcHBpbmdzLlRBQkxFX0dFTkVSQVRPUlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCisJfQorCQorCXByb3RlY3RlZCBYbWxUYWJsZUdlbmVyYXRvciBidWlsZFJlc291cmNlVGFibGVHZW5lcmF0b3IoKSB7CisJCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvcigpOworCX0KKworCisJLy8gKioqKioqKioqKiBuYW1lZCBxdWVyaWVzICoqKioqKioqKioKKwlwdWJsaWMgT3JtUXVlcnlDb250YWluZXIgZ2V0UXVlcnlDb250YWluZXIoKSB7CisJCXJldHVybiB0aGlzLnF1ZXJ5Q29udGFpbmVyOworCX0KKworCisJLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKKworCS8vVE9ETyB3aGF0IGFib3V0IHF1YWxpZmllZCBuYW1lPyAgcGFja2FnZSArIGNsYXNzCisJLy90aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgYm90aCBmb3IgY2xhc3NOYW1lIGFuZCBwZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkuCisJLy9tb3Zpbmcgb24gZm9yIG5vdyBzaW5jZSBJIGFtIGp1c3QgdHJ5aW5nIHRvIGdldCB0aGUgdWkgY29tcGlsZWQhICBqdXN0IGEgd2FybmluZyB0aGF0IHRoaXMgaXNuJ3QgZ29vZCBhcGkKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc1BlcnNpc3RlbnRUeXBlKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJZm9yIChPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA6IHRoaXMuZ2V0UGVyc2lzdGVudFR5cGVzKCkpIHsKKwkJCWlmIChwZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgeworCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCX0KKworCisJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVBlcnNpc3RlbnRUeXBlcygpIHsKKwkJZm9yIChYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA6IHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0VHlwZU1hcHBpbmdzKCkpIHsKKwkJCWFkZFBlcnNpc3RlbnRUeXBlKHR5cGVNYXBwaW5nKTsKKwkJfQkKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlR2VuZXJhdG9ycygpIHsKKwkJZm9yIChYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA6IHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0VGFibGVHZW5lcmF0b3JzKCkpIHsKKwkJCXRoaXMudGFibGVHZW5lcmF0b3JzLmFkZChidWlsZFRhYmxlR2VuZXJhdG9yKHRhYmxlR2VuZXJhdG9yKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9ycygpIHsKKwkJZm9yIChYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA6IHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkpIHsKKwkJCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JzLmFkZChidWlsZFNlcXVlbmNlR2VuZXJhdG9yKHNlcXVlbmNlR2VuZXJhdG9yKSk7CisJCX0KKwl9CisKKwkKKwkvLyAqKioqKioqKioqIHVwZGF0ZSAqKioqKioqKioqCisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXRoaXMuc2V0RGVzY3JpcHRpb24odGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXREZXNjcmlwdGlvbigpKTsKKwkJdGhpcy5zZXRQYWNrYWdlKHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0UGFja2FnZSgpKTsKKworCQl0aGlzLnNldERlZmF1bHRBY2Nlc3ModGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQl0aGlzLnNldFNwZWNpZmllZEFjY2Vzcyh0aGlzLmdldFJlc291cmNlQWNjZXNzKCkpOworCisJCXRoaXMuc2V0RGVmYXVsdENhdGFsb2codGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRDYXRhbG9nKHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0Q2F0YWxvZygpKTsKKworCQl0aGlzLnNldERlZmF1bHRTY2hlbWEodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0U2NoZW1hKCkpOworCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYSh0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFNjaGVtYSgpKTsKKworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnVwZGF0ZSgpOworCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbnRUeXBlcygpOworCQl0aGlzLnVwZGF0ZVRhYmxlR2VuZXJhdG9ycygpOworCQl0aGlzLnVwZGF0ZVNlcXVlbmNlR2VuZXJhdG9ycygpOworCQlnZXRRdWVyeUNvbnRhaW5lcigpLnVwZGF0ZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBnZXRSZXNvdXJjZUFjY2VzcygpIHsKKwkJcmV0dXJuIEFjY2Vzc1R5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwodGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRBY2Nlc3MoKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGVyc2lzdGVudFR5cGVzKCkgeworCQlDb2xsZWN0aW9uPE9ybVBlcnNpc3RlbnRUeXBlPiBjb250ZXh0VHlwZXNUb1JlbW92ZSA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHBlcnNpc3RlbnRUeXBlcygpKTsKKwkJQ29sbGVjdGlvbjxPcm1QZXJzaXN0ZW50VHlwZT4gY29udGV4dFR5cGVzVG9VcGRhdGUgPSBuZXcgQXJyYXlMaXN0PE9ybVBlcnNpc3RlbnRUeXBlPigpOworCQlpbnQgcmVzb3VyY2VJbmRleCA9IDA7CisJCQorCQlMaXN0PFhtbFR5cGVNYXBwaW5nPiB4bWxUeXBlTWFwcGluZ3MgPSB0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFR5cGVNYXBwaW5ncygpOworCQlmb3IgKFhtbFR5cGVNYXBwaW5nIHhtbFR5cGVNYXBwaW5nIDogeG1sVHlwZU1hcHBpbmdzLnRvQXJyYXkobmV3IFhtbFR5cGVNYXBwaW5nW3htbFR5cGVNYXBwaW5ncy5zaXplKCldKSkgeworCQkJYm9vbGVhbiBjb250ZXh0QXR0cmlidXRlRm91bmQgPSBmYWxzZTsKKwkJCWZvciAoT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgOiBjb250ZXh0VHlwZXNUb1JlbW92ZSkgeworCQkJCWlmIChjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0UmVzb3VyY2VUeXBlTWFwcGluZygpID09IHhtbFR5cGVNYXBwaW5nKSB7CisJCQkJCW1vdmVQZXJzaXN0ZW50VHlwZV8ocmVzb3VyY2VJbmRleCwgY29udGV4dFR5cGUpOworCQkJCQljb250ZXh0VHlwZXNUb1JlbW92ZS5yZW1vdmUoY29udGV4dFR5cGUpOworCQkJCQljb250ZXh0VHlwZXNUb1VwZGF0ZS5hZGQoY29udGV4dFR5cGUpOworCQkJCQljb250ZXh0QXR0cmlidXRlRm91bmQgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoIWNvbnRleHRBdHRyaWJ1dGVGb3VuZCkgeworCQkJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gYWRkUGVyc2lzdGVudFR5cGUoeG1sVHlwZU1hcHBpbmcpOworCQkJCWZpcmVJdGVtQWRkZWQoUEVSU0lTVEVOVF9UWVBFU19MSVNULCBwZXJzaXN0ZW50VHlwZXNTaXplKCksIG9ybVBlcnNpc3RlbnRUeXBlKTsKKwkJCX0KKwkJCXJlc291cmNlSW5kZXgrKzsKKwkJfQorCQlmb3IgKE9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlIDogY29udGV4dFR5cGVzVG9SZW1vdmUpIHsKKwkJCXJlbW92ZVBlcnNpc3RlbnRUeXBlXyhjb250ZXh0VHlwZSk7CisJCX0KKwkJLy9maXJzdCBoYW5kbGUgYWRkaW5nL3JlbW92aW5nIG9mIHRoZSBwZXJzaXN0ZW50IHR5cGVzLCB0aGVuIHVwZGF0ZSB0aGUgb3RoZXJzIGxhc3QsIAorCQkvL3RoaXMgY2F1c2VzIGxlc3MgY2h1cm4gaW4gdGhlIHVwZGF0ZSBwcm9jZXNzCisJCWZvciAoT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgOiBjb250ZXh0VHlwZXNUb1VwZGF0ZSkgeworCQkJY29udGV4dFR5cGUudXBkYXRlKCk7CisJCX0JCisJfQorCQorCS8vbm90IGZpcmluZyBjaGFuZ2Ugbm90aWZpY2F0aW9uIHNvIHRoaXMgY2FuIGJlIHJldXNlZCBpbiBpbml0aWFsaXplIGFuZCB1cGRhdGUKKwlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVudFR5cGUgYWRkUGVyc2lzdGVudFR5cGUoWG1sVHlwZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nKSB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gYnVpbGRQZXJzaXN0ZW50VHlwZShyZXNvdXJjZU1hcHBpbmcpOworCQl0aGlzLnBlcnNpc3RlbnRUeXBlcy5hZGQob3JtUGVyc2lzdGVudFR5cGUpOworCQlyZXR1cm4gb3JtUGVyc2lzdGVudFR5cGU7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRhYmxlR2VuZXJhdG9ycygpIHsKKwkJLy8gbWFrZSBhIGNvcHkgb2YgdGhlIFhNTCBnZW5lcmF0b3JzICh0byBwcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24pCisJCUl0ZXJhdG9yPFhtbFRhYmxlR2VuZXJhdG9yPiB4bWxHZW5lcmF0b3JzID0gbmV3IENsb25lSXRlcmF0b3I8WG1sVGFibGVHZW5lcmF0b3I+KHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0VGFibGVHZW5lcmF0b3JzKCkpOworCisJCWZvciAoSXRlcmF0b3I8T3JtVGFibGVHZW5lcmF0b3I+IGNvbnRleHRHZW5lcmF0b3JzID0gdGhpcy50YWJsZUdlbmVyYXRvcnMoKTsgY29udGV4dEdlbmVyYXRvcnMuaGFzTmV4dCgpOyApIHsKKwkJCU9ybVRhYmxlR2VuZXJhdG9yIGNvbnRleHRHZW5lcmF0b3IgPSBjb250ZXh0R2VuZXJhdG9ycy5uZXh0KCk7CisJCQlpZiAoeG1sR2VuZXJhdG9ycy5oYXNOZXh0KCkpIHsKKwkJCQljb250ZXh0R2VuZXJhdG9yLnVwZGF0ZSh4bWxHZW5lcmF0b3JzLm5leHQoKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZW1vdmVUYWJsZUdlbmVyYXRvcl8oY29udGV4dEdlbmVyYXRvcik7CisJCQl9CisJCX0KKwkJCisJCXdoaWxlICh4bWxHZW5lcmF0b3JzLmhhc05leHQoKSkgeworCQkJYWRkVGFibGVHZW5lcmF0b3IoYnVpbGRUYWJsZUdlbmVyYXRvcih4bWxHZW5lcmF0b3JzLm5leHQoKSkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIE9ybVRhYmxlR2VuZXJhdG9yIGJ1aWxkVGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IgcmVzb3VyY2VUYWJsZUdlbmVyYXRvcikgeworCQlyZXR1cm4gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1UYWJsZUdlbmVyYXRvcih0aGlzLCByZXNvdXJjZVRhYmxlR2VuZXJhdG9yKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZXF1ZW5jZUdlbmVyYXRvcnMoKSB7CisJCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBYTUwgc2VxdWVuY2UgZ2VuZXJhdG9ycyAodG8gcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKQorCQlJdGVyYXRvcjxYbWxTZXF1ZW5jZUdlbmVyYXRvcj4geG1sU2VxdWVuY2VHZW5lcmF0b3JzID0gbmV3IENsb25lSXRlcmF0b3I8WG1sU2VxdWVuY2VHZW5lcmF0b3I+KHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgorCisJCWZvciAoSXRlcmF0b3I8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IGNvbnRleHRTZXF1ZW5jZUdlbmVyYXRvcnMgPSB0aGlzLnNlcXVlbmNlR2VuZXJhdG9ycygpOyBjb250ZXh0U2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKTsgKSB7CisJCQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBjb250ZXh0U2VxdWVuY2VHZW5lcmF0b3IgPSBjb250ZXh0U2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKTsKKwkJCWlmICh4bWxTZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKSB7CisJCQkJY29udGV4dFNlcXVlbmNlR2VuZXJhdG9yLnVwZGF0ZSh4bWxTZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yXyhjb250ZXh0U2VxdWVuY2VHZW5lcmF0b3IpOworCQkJfQorCQl9CisJCQorCQl3aGlsZSAoeG1sU2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSkgeworCQkJYWRkU2VxdWVuY2VHZW5lcmF0b3IoYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcih4bWxTZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpKSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgT3JtU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvciByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKSB7CisJCXJldHVybiBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVNlcXVlbmNlR2VuZXJhdG9yKHRoaXMsIHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHBvc3RVcGRhdGUoKSB7CisJCXN1cGVyLnBvc3RVcGRhdGUoKTsKKwkJZm9yIChQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA6IHRoaXMuZ2V0UGVyc2lzdGVudFR5cGVzKCkpIHsKKwkJCXBlcnNpc3RlbnRUeXBlLnBvc3RVcGRhdGUoKTsKKwkJfQorCX0KKworCS8vICoqKioqKioqKiogdGV4dCAqKioqKioqKioqCisKKwlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7CisJCWZvciAoT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGU6IHRoaXMuZ2V0UGVyc2lzdGVudFR5cGVzKCkpIHsKKwkJCWlmIChwZXJzaXN0ZW50VHlwZS5jb250YWlucyh0ZXh0T2Zmc2V0KSkgeworCQkJCXJldHVybiBwZXJzaXN0ZW50VHlwZS5nZXRTdHJ1Y3R1cmVOb2RlKHRleHRPZmZzZXQpOworCQkJfQorCQl9CisJCXJldHVybiB0aGlzOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCkgeworCQlyZXR1cm4gKHRoaXMueG1sRW50aXR5TWFwcGluZ3MgIT0gbnVsbCkgJiYgdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy52YWxpZGF0ZVZlcnNpb24obWVzc2FnZXMpOworCQl0aGlzLnZhbGlkYXRlR2VuZXJhdG9ycyhtZXNzYWdlcyk7CisJCXRoaXMucXVlcnlDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJZm9yIChPcm1QZXJzaXN0ZW50VHlwZSAgb3JtUGVyc2lzdGVudFR5cGUgOiB0aGlzLmdldFBlcnNpc3RlbnRUeXBlcygpKSB7CisJCQl0aGlzLnZhbGlkYXRlUGVyc2lzdGVudFR5cGUob3JtUGVyc2lzdGVudFR5cGUsIG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVWZXJzaW9uKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7CisJCWlmICghIGxhdGVzdERvY3VtZW50VmVyc2lvbigpLmVxdWFscyh0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFZlcnNpb24oKSkpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5MT1dfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1ZFUlNJT05fTk9UX0xBVEVTVCwKKwkJCQkJCXRoaXMsCisJCQkJCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFZlcnNpb25UZXh0UmFuZ2UoKSkpOworCQl9CisJfQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIGRvY3VtZW50IHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGxhdGVzdERvY3VtZW50VmVyc2lvbigpOworCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlR2VuZXJhdG9ycyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlmb3IgKEl0ZXJhdG9yPE9ybUdlbmVyYXRvcj4gbG9jYWxHZW5lcmF0b3JzID0gdGhpcy5nZW5lcmF0b3JzKCk7IGxvY2FsR2VuZXJhdG9ycy5oYXNOZXh0KCk7ICkgeworCQkJT3JtR2VuZXJhdG9yIGxvY2FsR2VuZXJhdG9yID0gbG9jYWxHZW5lcmF0b3JzLm5leHQoKTsKKwkJCWZvciAoSXRlcmF0b3I8R2VuZXJhdG9yPiBnbG9iYWxHZW5lcmF0b3JzID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzKCk7IGdsb2JhbEdlbmVyYXRvcnMuaGFzTmV4dCgpOyApIHsKKwkJCQlpZiAobG9jYWxHZW5lcmF0b3IuZHVwbGljYXRlcyhnbG9iYWxHZW5lcmF0b3JzLm5leHQoKSkpIHsKKwkJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FLAorCQkJCQkJCW5ldyBTdHJpbmdbXSB7bG9jYWxHZW5lcmF0b3IuZ2V0TmFtZSgpfSwKKwkJCQkJCQlsb2NhbEdlbmVyYXRvciwKKwkJCQkJCQlsb2NhbEdlbmVyYXRvci5nZXROYW1lVGV4dFJhbmdlKCkKKwkJCQkJCSkKKwkJCQkJKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogUmV0dXJuIGFsbCB0aGUgZ2VuZXJhdG9ycywgdGFibGUgYW5kIHNlcXVlbmNlLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBJdGVyYXRvcjxPcm1HZW5lcmF0b3I+IGdlbmVyYXRvcnMoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8T3JtR2VuZXJhdG9yPigKKwkJCQkJCXRoaXMudGFibGVHZW5lcmF0b3JzKCksCisJCQkJCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9ycygpCisJCQkJKTsKKwl9CisJCisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBlcnNpc3RlbnRUeXBlKE9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXRyeSB7CisJCQlwZXJzaXN0ZW50VHlwZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl9IGNhdGNoIChUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCQlKcHRDb3JlUGx1Z2luLmxvZyhleGNlcHRpb24pOwkJCQorCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIGRpc3Bvc2UgKioqKioqKioqKgorCQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWZvciAoT3JtUGVyc2lzdGVudFR5cGUgIG9ybVBlcnNpc3RlbnRUeXBlIDogdGhpcy5nZXRQZXJzaXN0ZW50VHlwZXMoKSkgeworCQkJb3JtUGVyc2lzdGVudFR5cGUuZGlzcG9zZSgpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YzYyZDEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisKKwkvLyBjYWNoZSB0aGUgc3RyYXRlZ3kgZm9yIHByb3BlcnR5IGNoYW5nZSBub3RpZmljYXRpb24KKwlwcm90ZWN0ZWQgSm9pbmluZ1N0cmF0ZWd5IGNhY2hlZFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5OworCisJcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKKworCXByb3RlY3RlZCBBYnN0cmFjdE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoT3JtQXNzb2NpYXRpb25PdmVycmlkZSBwYXJlbnQsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeGFvKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVnaWVzKHhhbyk7CisJfQorCQorCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5IGJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneShYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhhbykgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5KHRoaXMsIHhhbyk7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKEFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2Ugb2xkQXNzb2NpYXRpb25PdmVycmlkZSkgeworCQlpZiAob2xkQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkgeworCQkJZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmluaXRpYWxpemVGcm9tKG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKKwkJfQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtQXNzb2NpYXRpb25PdmVycmlkZSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoT3JtQXNzb2NpYXRpb25PdmVycmlkZSkgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB7CisJCXJldHVybiBnZXRQYXJlbnQoKTsKKwl9CisKKwlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCXJldHVybiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0T3duZXIoKS5nZXRUeXBlTWFwcGluZygpOworCX0KKwkKKwlwdWJsaWMgRW50aXR5IGdldEVudGl0eSgpIHsKKwkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSBnZXRUeXBlTWFwcGluZygpOworCQlyZXR1cm4gKHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5KSA/IChFbnRpdHkpIHR5cGVNYXBwaW5nIDogbnVsbDsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzUGFyZW50VmlydHVhbCgpIHsKKwkJcmV0dXJuIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5pc1ZpcnR1YWwoKTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKiBwcmVkb21pbmFudCBqb2luaW5nIHN0cmF0ZWd5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBKb2luaW5nU3RyYXRlZ3kgZ2V0UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiB0aGlzLmNhY2hlZFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5OworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneShKb2luaW5nU3RyYXRlZ3kgbmV3Sm9pbmluZ1N0cmF0ZWd5KSB7CisJCUpvaW5pbmdTdHJhdGVneSBvbGRKb2luaW5nU3RyYXRlZ3kgPSB0aGlzLmNhY2hlZFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5OworCQl0aGlzLmNhY2hlZFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5ID0gbmV3Sm9pbmluZ1N0cmF0ZWd5OworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBSRURPTUlOQU5UX0pPSU5JTkdfU1RSQVRFR1lfUFJPUEVSVFksIG9sZEpvaW5pbmdTdHJhdGVneSwgbmV3Sm9pbmluZ1N0cmF0ZWd5KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgeworCQlpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWdpZXMoYXNzb2NpYXRpb25PdmVycmlkZSk7CisJCXRoaXMuY2FjaGVkUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3kgPSBjYWxjdWxhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpOworCX0JCQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luaW5nU3RyYXRlZ2llcyhYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhhbykgeworCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgPSBidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koeGFvKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCXVwZGF0ZUpvaW5pbmdTdHJhdGVnaWVzKGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQlzZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneShjYWxjdWxhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpKTsKKwl9CQorCQkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKb2luaW5nU3RyYXRlZ2llcyhYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnVwZGF0ZShhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IEpvaW5pbmdTdHJhdGVneSBjYWxjdWxhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpOworCQorCS8vICoqKioqKioqKioqKioqKiogam9pbiBjb2x1bW5zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKworCXB1YmxpYyBPcm1Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5IGdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gZ2V0UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSA9PSB0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5hZGRTdHJhdGVneSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1bnNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBtYXlIYXZlRGVmYXVsdEpvaW5Db2x1bW4oKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldE93bmVyKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZyhnZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuaXNPd25lZEJ5KG1hcHBpbmcpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuaXNSZWxhdGlvbnNoaXBPd25lcigpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZy5qYXZhCmluZGV4IGVjMTE1M2EuLjFlZWI2YTEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwxMSArOSwxNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5vbk93bmluZ01hcHBpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW5NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2VFbWJlZGRlZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwpAQCAtMzIsNjYgKzM3LDY3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHJhbnNpZW50TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuU2ltcGxlTWV0YW1vZGVsRmllbGQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CiAKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxUIGV4dGVuZHMgWG1sQXR0cmlidXRlTWFwcGluZz4gZXh0ZW5kcyBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFQgZXh0ZW5kcyBYbWxBdHRyaWJ1dGVNYXBwaW5nPgorCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZywgQXR0cmlidXRlTWFwcGluZzJfMAogewogCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKIAkKLQlwcm90ZWN0ZWQgVCBhdHRyaWJ1dGVNYXBwaW5nOworCXByb3RlY3RlZCBmaW5hbCBUIHJlc291cmNlQXR0cmlidXRlTWFwcGluZzsKIAotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJcHJvdGVjdGVkIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgVCByZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpIHsKIAkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcgPSByZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmc7CisJCXRoaXMubmFtZSA9IHRoaXMuZ2V0UmVzb3VyY2VNYXBwaW5nTmFtZSgpOwogCX0JCiAJCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKKwlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7CisJCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwogCX0KIAkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvbGRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHRoaXMuamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JCXRoaXMuamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBuZXdKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChPcm1BdHRyaWJ1dGVNYXBwaW5nLkpBVkFfUEVSU0lTVEVOVF9BVFRSSUJVVEVfUFJPUEVSVFksIG9sZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBuZXdKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQorCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7CisJCXJldHVybiB0aGlzLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7CiAJfQogCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogCQlyZXR1cm4gdGhpcy5uYW1lOwogCX0KIAotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMuYXR0cmlidXRlTWFwcGluZy5zZXROYW1lKG5ld05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9ybUF0dHJpYnV0ZU1hcHBpbmcuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5uYW1lQ2hhbmdlZChvbGROYW1lLCBuZXdOYW1lKTsKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLnNldE5hbWUobmFtZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOworCQl0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5uYW1lQ2hhbmdlZChvbGQsIG5hbWUpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVfKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9ybUF0dHJpYnV0ZU1hcHBpbmcuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5uYW1lQ2hhbmdlZChvbGROYW1lLCBuZXdOYW1lKTsKKwlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKKwkJdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkubmFtZUNoYW5nZWQob2xkLCBuYW1lKTsKIAl9CiAJCiAJcHVibGljIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKIAkJcmV0dXJuIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBnZXRQYXJlbnQoKTsKIAl9CiAKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCk7Ci0JfQotCiAJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMTAwLDIwICsxMDYsMTYgQEAKIAkJc2V0TmFtZShvbGRNYXBwaW5nLmdldE5hbWUoKSk7CiAJfQogCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21YbWxDb2x1bW5NYXBwaW5nKE9ybUNvbHVtbk1hcHBpbmcgb2xkTWFwcGluZykgewotCQlpbml0aWFsaXplRnJvbU9ybUF0dHJpYnV0ZU1hcHBpbmcoKE9ybUF0dHJpYnV0ZU1hcHBpbmcpIG9sZE1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tWG1sTm9uT3duaW5nTWFwcGluZyhOb25Pd25pbmdNYXBwaW5nIG9sZE1hcHBpbmcpIHsKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybUNvbHVtbk1hcHBpbmcoT3JtQ29sdW1uTWFwcGluZyBvbGRNYXBwaW5nKSB7CiAJCWluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZygoT3JtQXR0cmlidXRlTWFwcGluZykgb2xkTWFwcGluZyk7CiAJfQogCiAJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1CYXNpY01hcHBpbmcoT3JtQmFzaWNNYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJaW5pdGlhbGl6ZUZyb21YbWxDb2x1bW5NYXBwaW5nKG9sZE1hcHBpbmcpOworCQlpbml0aWFsaXplRnJvbU9ybUNvbHVtbk1hcHBpbmcob2xkTWFwcGluZyk7CiAJfQogCiAJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1JZE1hcHBpbmcoT3JtSWRNYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJaW5pdGlhbGl6ZUZyb21YbWxDb2x1bW5NYXBwaW5nKG9sZE1hcHBpbmcpOworCQlpbml0aWFsaXplRnJvbU9ybUNvbHVtbk1hcHBpbmcob2xkTWFwcGluZyk7CiAJfQogCiAJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1UcmFuc2llbnRNYXBwaW5nKE9ybVRyYW5zaWVudE1hcHBpbmcgb2xkTWFwcGluZykgewpAQCAtMTMzLDM4ICsxMzUsMzUgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybVZlcnNpb25NYXBwaW5nKE9ybVZlcnNpb25NYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJaW5pdGlhbGl6ZUZyb21YbWxDb2x1bW5NYXBwaW5nKG9sZE1hcHBpbmcpOworCQlpbml0aWFsaXplRnJvbU9ybUNvbHVtbk1hcHBpbmcob2xkTWFwcGluZyk7CiAJfQogCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21YbWxSZWxhdGlvbnNoaXBNYXBwaW5nKE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcgb2xkTWFwcGluZykgeworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tT3JtUmVsYXRpb25zaGlwTWFwcGluZyhPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIG9sZE1hcHBpbmcpIHsKIAkJaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKG9sZE1hcHBpbmcpOwogCX0KIAotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tWG1sTXVsaXRSZWxhdGlvbnNoaXBNYXBwaW5nKE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCWluaXRpYWxpemVGcm9tWG1sUmVsYXRpb25zaGlwTWFwcGluZyhvbGRNYXBwaW5nKTsKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyhPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgb2xkTWFwcGluZykgeworCQlpbml0aWFsaXplRnJvbU9ybVJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7CiAJfQogCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgb2xkTWFwcGluZykgewotCQlpbml0aWFsaXplRnJvbVhtbFJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7CisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgb2xkTWFwcGluZykgeworCQlpbml0aWFsaXplRnJvbU9ybVJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7CiAJfQogCiAJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1PbmVUb01hbnlNYXBwaW5nKE9ybU9uZVRvTWFueU1hcHBpbmcgb2xkTWFwcGluZykgewotCQlpbml0aWFsaXplRnJvbVhtbE5vbk93bmluZ01hcHBpbmcob2xkTWFwcGluZyk7Ci0JCWluaXRpYWxpemVGcm9tWG1sTXVsaXRSZWxhdGlvbnNoaXBNYXBwaW5nKG9sZE1hcHBpbmcpOworCQlpbml0aWFsaXplRnJvbU9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyhvbGRNYXBwaW5nKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybU1hbnlUb09uZU1hcHBpbmcoT3JtTWFueVRvT25lTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCWluaXRpYWxpemVGcm9tWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyhvbGRNYXBwaW5nKTsKKwkJaW5pdGlhbGl6ZUZyb21Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKG9sZE1hcHBpbmcpOwogCX0KIAogCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tT3JtT25lVG9PbmVNYXBwaW5nKE9ybU9uZVRvT25lTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCWluaXRpYWxpemVGcm9tWG1sTm9uT3duaW5nTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJaW5pdGlhbGl6ZUZyb21YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKG9sZE1hcHBpbmcpOworCQlpbml0aWFsaXplRnJvbU9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7CiAJfQogCiAJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1NYW55VG9NYW55TWFwcGluZyhPcm1NYW55VG9NYW55TWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCWluaXRpYWxpemVGcm9tWG1sTm9uT3duaW5nTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJaW5pdGlhbGl6ZUZyb21YbWxNdWxpdFJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7CisJCWluaXRpYWxpemVGcm9tT3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKG9sZE1hcHBpbmcpOwogCX0KIAogCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSB7CkBAIC0xODcsMTM5ICsxODYsMTg2IEBACiAJcHVibGljIGJvb2xlYW4gaXNJZE1hcHBpbmcoKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0KLQlwcm90ZWN0ZWQgVCBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVCBhdHRyaWJ1dGVNYXBwaW5nKSB7Ci0JCXRoaXMuYXR0cmlidXRlTWFwcGluZyA9IGF0dHJpYnV0ZU1hcHBpbmc7Ci0JCXRoaXMubmFtZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZSgpOwotCQl0aGlzLmphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gZmluZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCisJcHVibGljIGJvb2xlYW4gaXNPd25lZEJ5KFJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZykgeworCQkvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIC0gb3ZlcnJpZGUgd2hlcmUgbmVlZGVkCisJCXJldHVybiBmYWxzZTsKIAl9CiAJCi0JcHVibGljIHZvaWQgdXBkYXRlKFQgYXR0cmlidXRlTWFwcGluZykgewotCQl0aGlzLmF0dHJpYnV0ZU1hcHBpbmcgPSBhdHRyaWJ1dGVNYXBwaW5nOwotCQl0aGlzLnNldE5hbWVfKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJdGhpcy5zZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShmaW5kSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYWxsTWFwcGluZ05hbWVzKCkgeworCQlyZXR1cm4gZ2V0TmFtZSgpID09IG51bGwgPyBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+IGluc3RhbmNlKCkgOiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPFN0cmluZz4oZ2V0TmFtZSgpKTsKIAl9CiAJCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGZpbmRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlpZiAoamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwgJiYgZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoZ2V0TmFtZSgpKTsKKwlwdWJsaWMgQXR0cmlidXRlTWFwcGluZyByZXNvbHZlQXR0cmlidXRlTWFwcGluZyhTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworCQlpZiAoZ2V0TmFtZSgpICE9IG51bGwgJiYgZ2V0TmFtZSgpLmVxdWFscyhhdHRyaWJ1dGVOYW1lKSkgeworCQkJcmV0dXJuIHRoaXM7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbE92ZXJyaWRlYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpIHsKKwkJaWYgKGlzT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nKCkpIHsKKwkJCXJldHVybiBhbGxNYXBwaW5nTmFtZXMoKTsKKwkJfQorCQlyZXR1cm4gRW1wdHlJdGVyYXRvci48U3RyaW5nPiBpbnN0YW5jZSgpOworCX0KIAkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbnRpdHlPd25lZCgpIHsKLQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVk7CisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYWxsT3ZlcnJpZGVhYmxlQXNzb2NpYXRpb25NYXBwaW5nTmFtZXMoKSB7CisJCWlmIChpc092ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nKCkpIHsKKwkJCXJldHVybiBhbGxNYXBwaW5nTmFtZXMoKTsKKwkJfQorCQlyZXR1cm4gRW1wdHlJdGVyYXRvci48U3RyaW5nPiBpbnN0YW5jZSgpOworCX0KKwkKKwlwdWJsaWMgQ29sdW1uIHJlc29sdmVPdmVycmlkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKwkJQ29sdW1uTWFwcGluZyBjb2x1bW5NYXBwaW5nID0gdGhpcy5yZXNvbHZlQ29sdW1uTWFwcGluZyhhdHRyaWJ1dGVOYW1lKTsKKwkJcmV0dXJuIGNvbHVtbk1hcHBpbmcgPT0gbnVsbCA/IG51bGwgOiBjb2x1bW5NYXBwaW5nLmdldENvbHVtbigpOworCX0KKwkKKwlwcm90ZWN0ZWQgQ29sdW1uTWFwcGluZyByZXNvbHZlQ29sdW1uTWFwcGluZyhTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworCQlBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSByZXNvbHZlQXR0cmlidXRlTWFwcGluZyhhdHRyaWJ1dGVOYW1lKTsKKwkJaWYgKGF0dHJpYnV0ZU1hcHBpbmcgIT0gbnVsbCAmJiBhdHRyaWJ1dGVNYXBwaW5nLmlzT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nKCkpIHsKKwkJCXJldHVybiAoQ29sdW1uTWFwcGluZykgYXR0cmlidXRlTWFwcGluZzsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CQorCisJcHVibGljIFJlbGF0aW9uc2hpcFJlZmVyZW5jZSByZXNvbHZlUmVsYXRpb25zaGlwUmVmZXJlbmNlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IHRoaXMucmVzb2x2ZVJlbGF0aW9uc2hpcE1hcHBpbmcoYXR0cmlidXRlTmFtZSk7CisJCXJldHVybiByZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwgPyBudWxsIDogcmVsYXRpb25zaGlwTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwl9CisJCisJcHJvdGVjdGVkIFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVzb2x2ZVJlbGF0aW9uc2hpcE1hcHBpbmcoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKwkJQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gcmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoYXR0cmlidXRlTmFtZSk7CisJCWlmIChhdHRyaWJ1dGVNYXBwaW5nICE9IG51bGwgJiYgYXR0cmlidXRlTWFwcGluZy5pc092ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nKCkpIHsKKwkJCXJldHVybiAoUmVsYXRpb25zaGlwTWFwcGluZykgYXR0cmlidXRlTWFwcGluZzsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CQorCisJcHVibGljIFQgZ2V0UmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmc7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJdGhpcy5zZXROYW1lXyh0aGlzLmdldFJlc291cmNlTWFwcGluZ05hbWUoKSk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VNYXBwaW5nTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKSB7CisJCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgdGV4dE9mZnNldCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nLmNvbnRhaW5zT2Zmc2V0KHRleHRPZmZzZXQpOworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCk7CiAJfQogCQogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7CiAJfQkKIAkKIAlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpID8gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldEF0dHJpYnV0ZXNUZXh0UmFuZ2UoKSA6IHRoaXMuYXR0cmlidXRlTWFwcGluZy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJCXJldHVybiAodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpID8gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldEF0dHJpYnV0ZXNUZXh0UmFuZ2UoKSA6IHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKIAl9CiAJCiAJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWVUZXh0UmFuZ2UoKTsKIAl9Ci0JCisKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQlhZGRBdHRyaWJ1dGVNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCWFkZEludmFsaWRNYXBwaW5nTWVzc2FnZShtZXNzYWdlcyk7CisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5nZXROYW1lKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKgorCisJcHVibGljIE1ldGFtb2RlbEZpZWxkIGdldE1ldGFtb2RlbEZpZWxkKCkgeworCQkvLyBpZiB3ZSBkb24ndCBoYXZlIGEgbmFtZSB3ZSBjYW4ndCBidWlsZCBhIG1ldGFtb2RlbCBmaWVsZC4uLgorCQlTdHJpbmcgbWV0YW1vZGVsRmllbGROYW1lID0gdGhpcy5nZXRNZXRhbW9kZWxGaWVsZE5hbWUoKTsKKwkJcmV0dXJuIChtZXRhbW9kZWxGaWVsZE5hbWUgPT0gbnVsbCkgPyBudWxsIDoKKwkJCQkJbmV3IFNpbXBsZU1ldGFtb2RlbEZpZWxkKAorCQkJCQkJdGhpcy5nZXRNZXRhbW9kZWxGaWVsZE1vZGlmaWVycygpLAorCQkJCQkJdGhpcy5nZXRNZXRhbW9kZWxGaWVsZFR5cGVOYW1lKCksCisJCQkJCQl0aGlzLmdldE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXMoKSwKKwkJCQkJCW1ldGFtb2RlbEZpZWxkTmFtZQorCQkJCQkpOworCX0KKworCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldE1ldGFtb2RlbEZpZWxkTW9kaWZpZXJzKCkgeworCQlyZXR1cm4gU1RBTkRBUkRfTUVUQU1PREVMX0ZJRUxEX01PRElGSUVSUzsKKwl9CisKKwkvKioKKwkgKiBtb3N0IG1hcHBpbmdzIGFyZSAic2luZ3VsYXIiCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRNZXRhbW9kZWxGaWVsZFR5cGVOYW1lKCkgeworCQlyZXR1cm4gSlBBMl8wLlNJTkdVTEFSX0FUVFJJQlVURTsKKwl9CisKKwlwcm90ZWN0ZWQgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBnZXRNZXRhbW9kZWxGaWVsZFR5cGVBcmd1bWVudE5hbWVzKCkgeworCQlBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigzKTsKKwkJdHlwZUFyZ3VtZW50TmFtZXMuYWRkKHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKSk7CisJCXRoaXMuYWRkTWV0YW1vZGVsRmllbGRUeXBlQXJndW1lbnROYW1lc1RvKHR5cGVBcmd1bWVudE5hbWVzKTsKKwkJcmV0dXJuIHR5cGVBcmd1bWVudE5hbWVzOworCX0KKworCS8qKgorCSAqIGJ5IGRlZmF1bHQsIHdlIGFkZCBvbmx5IHRoZSBtYXBwaW5nJ3MgYXR0cmlidXRlIHR5cGUgbmFtZTsKKwkgKiBidXQgY29sbGVjdGlvbiByZWxhdGlvbnNoaXAgbWFwcGluZ3Mgd2lsbCBhbHNvIG5lZWQgdG8gYWRkIHRoZSBrZXkgdHlwZQorCSAqIG5hbWUgaWYgdGhlICJjb2xsZWN0aW9uIiBpcyBvZiB0eXBlIGphdmEudXRpbC5NYXAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRhbW9kZWxGaWVsZFR5cGVBcmd1bWVudE5hbWVzVG8oQXJyYXlMaXN0PFN0cmluZz4gdHlwZUFyZ3VtZW50TmFtZXMpIHsKKwkJdHlwZUFyZ3VtZW50TmFtZXMuYWRkKHRoaXMuZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpIHsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAganBhID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wKSB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQlyZXR1cm4gKGpwYSA9PSBudWxsKSA/IE1ldGFtb2RlbEZpZWxkLkRFRkFVTFRfVFlQRV9OQU1FIDoganBhLmdldE1ldGFtb2RlbFR5cGVOYW1lKCk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRNZXRhbW9kZWxGaWVsZE5hbWUoKSB7CisJCXJldHVybiB0aGlzLmdldE5hbWUoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCXRoaXMudmFsaWRhdGVBdHRyaWJ1dGUobWVzc2FnZXMpOworCQl0aGlzLnZhbGlkYXRlTWFwcGluZyhtZXNzYWdlcyk7CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWFkZFVuc3BlY2lmaWVkQXR0cmlidXRlTWVzc2FnZShtZXNzYWdlcyk7Ci0JCWFkZFVucmVzb2x2ZWRBdHRyaWJ1dGVNZXNzYWdlKG1lc3NhZ2VzKTsKLQkJYWRkTW9kaWZpZXJNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFVuc3BlY2lmaWVkQXR0cmlidXRlTWVzc2FnZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXROYW1lKCkpKSB7CisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKKwkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKSkgewogCQkJbWVzc2FnZXMuYWRkKAogCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAogCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAogCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5TUEVDSUZJRURfTkFNRSwKIAkJCQkJdGhpcywgCi0JCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSkKKwkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKKwkJCQkpCiAJCQkpOworCQkJcmV0dXJuOwogCQl9CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIGFkZFVucmVzb2x2ZWRBdHRyaWJ1dGVNZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0TmFtZSgpKQotCQkJCSYmIGZpbmRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lKCksIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKX0sCi0JCQkJCXRoaXMsIAotCQkJCQlnZXROYW1lVGV4dFJhbmdlKCkpCi0JCQkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE1vZGlmaWVyTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKGdldEtleSgpID09IE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKGdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQotCQlpZiAocmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmlzRm9yRmllbGQoKSkgewotCQkJLy9UT0RPIHZhbGlkYXRpb24gOiBuZWVkIHRvIGhhdmUgYSB2YWxpZGF0aW9uIG1lc3NhZ2UgZm9yIGZpbmFsIG1ldGhvZHMgYXMgd2VsbC4KLQkJCS8vRnJvbSB0aGUgSlBBIHNwZWMgOiBObyBtZXRob2RzIG9yIHBlcnNpc3RlbnQgaW5zdGFuY2UgdmFyaWFibGVzIG9mIHRoZSBlbnRpdHkgY2xhc3MgbWF5IGJlIGZpbmFsLgotCQkJaWYgKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5pc0ZpbmFsKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9GSU5BTF9GSUVMRCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpfSwKLQkJCQkJCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwKLQkJCQkJCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJCQotCQkJaWYgKHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1B1YmxpYygpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfUFVCTElDX0ZJRUxELAotCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lKCl9LAotCQkJCQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAKLQkJCQkJCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCQkKLQkJCX0KLQkJfQotCX0KLQogCS8vVE9ETyB2YWxpZGF0aW9uIG1lc3NhZ2UgLSBpIHRoaW5rIG1vcmUgaW5mbyBpcyBuZWVkZWQgaW4gdGhpcyBtZXNzYWdlLiAgaW5jbHVkZSB0eXBlIG1hcHBpbmcgdHlwZT8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbnZhbGlkTWFwcGluZ01lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKCEgZ2V0VHlwZU1hcHBpbmcoKS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChnZXRLZXkoKSkpIHsKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1hcHBpbmcoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKKwkJaWYgKCAhIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCh0aGlzLmdldEtleSgpKSkgewogCQkJbWVzc2FnZXMuYWRkKAogCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAogCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAogCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9NQVBQSU5HLAotCQkJCQluZXcgU3RyaW5nW10ge2dldE5hbWUoKX0sCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5uYW1lfSwKIAkJCQkJdGhpcywgCi0JCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSkKKwkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKKwkJCQkpCiAJCQkpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQmFzZUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQmFzZUNvbHVtbi5qYXZhCmluZGV4IDZjMTU2MTYuLmYzNzU5YTEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUJhc2VDb2x1bW4uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1CYXNlQ29sdW1uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsMTMgKzEwLDEzIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQ29sdW1uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogCiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUJhc2VDb2x1bW48VCBleHRlbmRzIFhtbEFic3RyYWN0Q29sdW1uPiBleHRlbmRzIEFic3RyYWN0T3JtTmFtZWRDb2x1bW48VD4KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUJhc2VDb2x1bW48VCBleHRlbmRzIEFic3RyYWN0WG1sQ29sdW1uPiBleHRlbmRzIEFic3RyYWN0T3JtTmFtZWRDb2x1bW48VD4KIAlpbXBsZW1lbnRzIE9ybUJhc2VDb2x1bW4KIHsKIAlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFRhYmxlOwpAQCAtMzEsNyArMzEsNyBAQAogCQogCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZFVwZGF0YWJsZTsKIAotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUJhc2VDb2x1bW4oT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPcm1CYXNlQ29sdW1uLk93bmVyIG93bmVyKSB7CisJcHJvdGVjdGVkIEFic3RyYWN0T3JtQmFzZUNvbHVtbihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybUJhc2VDb2x1bW4uT3duZXIgb3duZXIpIHsKIAkJc3VwZXIocGFyZW50LCBvd25lcik7CiAJfQogCQpAQCAtNjcsMTYgKzY3LDE2IEBACiAJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVGFibGUoU3RyaW5nIG5ld1NwZWNpZmllZFRhYmxlKSB7CiAJCVN0cmluZyBvbGRTcGVjaWZpZWRUYWJsZSA9IHRoaXMuc3BlY2lmaWVkVGFibGU7CiAJCXRoaXMuc3BlY2lmaWVkVGFibGUgPSBuZXdTcGVjaWZpZWRUYWJsZTsKLQkJaWYgKG9sZFNwZWNpZmllZFRhYmxlICE9IG5ld1NwZWNpZmllZFRhYmxlKSB7Ci0JCQlpZiAodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldENvbHVtblJlc291cmNlKCkuc2V0VGFibGUobmV3U3BlY2lmaWVkVGFibGUpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKTsKKwkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG9sZFNwZWNpZmllZFRhYmxlLCBuZXdTcGVjaWZpZWRUYWJsZSkpIHsKKwkJCWlmICh0aGlzLmdldFJlc291cmNlQ29sdW1uKCkgIT0gbnVsbCkgeworCQkJCXRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXRUYWJsZShuZXdTcGVjaWZpZWRUYWJsZSk7CQkJCQkJCisJCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKS5pc1Vuc2V0KCkpIHsKKwkJCQkJcmVtb3ZlUmVzb3VyY2VDb2x1bW4oKTsKIAkJCQl9CiAJCQl9CiAJCQllbHNlIGlmIChuZXdTcGVjaWZpZWRUYWJsZSAhPSBudWxsKSB7Ci0JCQkJYWRkQ29sdW1uUmVzb3VyY2UoKTsKLQkJCQlnZXRDb2x1bW5SZXNvdXJjZSgpLnNldFRhYmxlKG5ld1NwZWNpZmllZFRhYmxlKTsKKwkJCQlhZGRSZXNvdXJjZUNvbHVtbigpOworCQkJCWdldFJlc291cmNlQ29sdW1uKCkuc2V0VGFibGUobmV3U3BlY2lmaWVkVGFibGUpOwogCQkJfQogCQl9CiAJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUNvbHVtbi5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFRhYmxlLCBuZXdTcGVjaWZpZWRUYWJsZSk7CkBAIC05OCwxMSArOTgsMTEgQEAKIAkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlQ29sdW1uLkRFRkFVTFRfVEFCTEVfUFJPUEVSVFksIG9sZERlZmF1bHRUYWJsZSwgbmV3RGVmYXVsdFRhYmxlKTsKIAl9CiAKLQlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRVbmlxdWUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFVuaXF1ZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRVbmlxdWUoKTsKKwlwdWJsaWMgYm9vbGVhbiBpc1VuaXF1ZSgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFVuaXF1ZSgpID09IG51bGwpID8gdGhpcy5pc0RlZmF1bHRVbmlxdWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkVW5pcXVlKCkuYm9vbGVhblZhbHVlKCk7CiAJfQogCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRVbmlxdWUoKSB7CisJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VW5pcXVlKCkgewogCQlyZXR1cm4gQmFzZUNvbHVtbi5ERUZBVUxUX1VOSVFVRTsKIAl9CiAJCkBAIC0xMTMsMTYgKzExMywxNiBAQAogCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuIG5ld1NwZWNpZmllZFVuaXF1ZSkgewogCQlCb29sZWFuIG9sZFNwZWNpZmllZFVuaXF1ZSA9IHRoaXMuc3BlY2lmaWVkVW5pcXVlOwogCQl0aGlzLnNwZWNpZmllZFVuaXF1ZSA9IG5ld1NwZWNpZmllZFVuaXF1ZTsKLQkJaWYgKG9sZFNwZWNpZmllZFVuaXF1ZSAhPSBuZXdTcGVjaWZpZWRVbmlxdWUpIHsKLQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRVbmlxdWUobmV3U3BlY2lmaWVkVW5pcXVlKTsJCQkJCQkKLQkJCQlpZiAodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZUNvbHVtblJlc291cmNlKCk7CisJCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChvbGRTcGVjaWZpZWRVbmlxdWUsIG5ld1NwZWNpZmllZFVuaXF1ZSkpIHsKKwkJCWlmICh0aGlzLmdldFJlc291cmNlQ29sdW1uKCkgIT0gbnVsbCkgeworCQkJCXRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXRVbmlxdWUobmV3U3BlY2lmaWVkVW5pcXVlKTsJCQkJCQkKKwkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpLmlzVW5zZXQoKSkgeworCQkJCQlyZW1vdmVSZXNvdXJjZUNvbHVtbigpOwogCQkJCX0KIAkJCX0KIAkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZFVuaXF1ZSAhPSBudWxsKSB7Ci0JCQkJYWRkQ29sdW1uUmVzb3VyY2UoKTsKLQkJCQlnZXRDb2x1bW5SZXNvdXJjZSgpLnNldFVuaXF1ZShuZXdTcGVjaWZpZWRVbmlxdWUpOworCQkJCWFkZFJlc291cmNlQ29sdW1uKCk7CisJCQkJZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXRVbmlxdWUobmV3U3BlY2lmaWVkVW5pcXVlKTsKIAkJCX0KIAkJfQogCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VDb2x1bW4uU1BFQ0lGSUVEX1VOSVFVRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVW5pcXVlLCBuZXdTcGVjaWZpZWRVbmlxdWUpOwpAQCAtMTM0LDExICsxMzQsMTEgQEAKIAkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlQ29sdW1uLlNQRUNJRklFRF9VTklRVUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFVuaXF1ZSwgbmV3U3BlY2lmaWVkVW5pcXVlKTsKIAl9CiAJCi0JcHVibGljIEJvb2xlYW4gZ2V0TnVsbGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWROdWxsYWJsZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0TnVsbGFibGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKTsKKwlwdWJsaWMgYm9vbGVhbiBpc051bGxhYmxlKCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSA9PSBudWxsKSA/IHRoaXMuaXNEZWZhdWx0TnVsbGFibGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKS5ib29sZWFuVmFsdWUoKTsKIAl9CiAJCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdE51bGxhYmxlKCkgeworCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE51bGxhYmxlKCkgewogCQlyZXR1cm4gQmFzZUNvbHVtbi5ERUZBVUxUX05VTExBQkxFOwogCX0KIAkKQEAgLTE0OSwxNiArMTQ5LDE2IEBACiAJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWROdWxsYWJsZSkgewogCQlCb29sZWFuIG9sZFNwZWNpZmllZE51bGxhYmxlID0gdGhpcy5zcGVjaWZpZWROdWxsYWJsZTsKIAkJdGhpcy5zcGVjaWZpZWROdWxsYWJsZSA9IG5ld1NwZWNpZmllZE51bGxhYmxlOwotCQlpZiAob2xkU3BlY2lmaWVkTnVsbGFibGUgIT0gbmV3U3BlY2lmaWVkTnVsbGFibGUpIHsKLQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXROdWxsYWJsZShuZXdTcGVjaWZpZWROdWxsYWJsZSk7CQkJCQkJCi0JCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVDb2x1bW5SZXNvdXJjZSgpOworCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQob2xkU3BlY2lmaWVkTnVsbGFibGUsIG5ld1NwZWNpZmllZE51bGxhYmxlKSkgeworCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKSAhPSBudWxsKSB7CisJCQkJdGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpLnNldE51bGxhYmxlKG5ld1NwZWNpZmllZE51bGxhYmxlKTsJCQkJCQkKKwkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpLmlzVW5zZXQoKSkgeworCQkJCQlyZW1vdmVSZXNvdXJjZUNvbHVtbigpOwogCQkJCX0KIAkJCX0KIAkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZE51bGxhYmxlICE9IG51bGwpIHsKLQkJCQlhZGRDb2x1bW5SZXNvdXJjZSgpOwotCQkJCWdldENvbHVtblJlc291cmNlKCkuc2V0TnVsbGFibGUobmV3U3BlY2lmaWVkTnVsbGFibGUpOworCQkJCWFkZFJlc291cmNlQ29sdW1uKCk7CisJCQkJZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXROdWxsYWJsZShuZXdTcGVjaWZpZWROdWxsYWJsZSk7CiAJCQl9CiAJCX0KIAkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlQ29sdW1uLlNQRUNJRklFRF9OVUxMQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTnVsbGFibGUsIG5ld1NwZWNpZmllZE51bGxhYmxlKTsKQEAgLTE3MCwxMSArMTcwLDExIEBACiAJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUNvbHVtbi5TUEVDSUZJRURfTlVMTEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE51bGxhYmxlLCBuZXdTcGVjaWZpZWROdWxsYWJsZSk7CiAJfQogCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEluc2VydGFibGUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEluc2VydGFibGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpOworCXB1YmxpYyBib29sZWFuIGlzSW5zZXJ0YWJsZSgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEluc2VydGFibGUoKSA9PSBudWxsKSA/IHRoaXMuaXNEZWZhdWx0SW5zZXJ0YWJsZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkuYm9vbGVhblZhbHVlKCk7CiAJfQogCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRJbnNlcnRhYmxlKCkgeworCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdEluc2VydGFibGUoKSB7CiAJCXJldHVybiBCYXNlQ29sdW1uLkRFRkFVTFRfSU5TRVJUQUJMRTsKIAl9CiAJCkBAIC0xODUsMTYgKzE4NSwxNiBAQAogCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRJbnNlcnRhYmxlKSB7CiAJCUJvb2xlYW4gb2xkU3BlY2lmaWVkSW5zZXJ0YWJsZSA9IHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZTsKIAkJdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlID0gbmV3U3BlY2lmaWVkSW5zZXJ0YWJsZTsKLQkJaWYgKG9sZFNwZWNpZmllZEluc2VydGFibGUgIT0gbmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSkgewotCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLnNldEluc2VydGFibGUobmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSk7CQkJCQkJCi0JCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVDb2x1bW5SZXNvdXJjZSgpOworCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQob2xkU3BlY2lmaWVkSW5zZXJ0YWJsZSwgbmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSkpIHsKKwkJCWlmICh0aGlzLmdldFJlc291cmNlQ29sdW1uKCkgIT0gbnVsbCkgeworCQkJCXRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXRJbnNlcnRhYmxlKG5ld1NwZWNpZmllZEluc2VydGFibGUpOwkJCQkJCQorCQkJCWlmICh0aGlzLmdldFJlc291cmNlQ29sdW1uKCkuaXNVbnNldCgpKSB7CisJCQkJCXJlbW92ZVJlc291cmNlQ29sdW1uKCk7CiAJCQkJfQogCQkJfQogCQkJZWxzZSBpZiAobmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSAhPSBudWxsKSB7Ci0JCQkJYWRkQ29sdW1uUmVzb3VyY2UoKTsKLQkJCQlnZXRDb2x1bW5SZXNvdXJjZSgpLnNldEluc2VydGFibGUobmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSk7CisJCQkJYWRkUmVzb3VyY2VDb2x1bW4oKTsKKwkJCQlnZXRSZXNvdXJjZUNvbHVtbigpLnNldEluc2VydGFibGUobmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSk7CiAJCQl9CiAJCX0KIAkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlQ29sdW1uLlNQRUNJRklFRF9JTlNFUlRBQkxFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRJbnNlcnRhYmxlLCBuZXdTcGVjaWZpZWRJbnNlcnRhYmxlKTsKQEAgLTIwNiwxMSArMjA2LDExIEBACiAJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUNvbHVtbi5TUEVDSUZJRURfSU5TRVJUQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkSW5zZXJ0YWJsZSwgbmV3U3BlY2lmaWVkSW5zZXJ0YWJsZSk7CiAJfQogCi0JcHVibGljIEJvb2xlYW4gZ2V0VXBkYXRhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRVcGRhdGFibGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCk7CisJcHVibGljIGJvb2xlYW4gaXNVcGRhdGFibGUoKSB7CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSA9PSBudWxsKSA/IHRoaXMuaXNEZWZhdWx0VXBkYXRhYmxlKCkgOiB0aGlzLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpOwogCX0KIAkKLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VXBkYXRhYmxlKCkgeworCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFVwZGF0YWJsZSgpIHsKIAkJcmV0dXJuIEJhc2VDb2x1bW4uREVGQVVMVF9VUERBVEFCTEU7CiAJfQogCQpAQCAtMjIxLDE2ICsyMjEsMTYgQEAKIAlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRVcGRhdGFibGUpIHsKIAkJQm9vbGVhbiBvbGRTcGVjaWZpZWRVcGRhdGFibGUgPSB0aGlzLnNwZWNpZmllZFVwZGF0YWJsZTsKIAkJdGhpcy5zcGVjaWZpZWRVcGRhdGFibGUgPSBuZXdTcGVjaWZpZWRVcGRhdGFibGU7Ci0JCWlmIChvbGRTcGVjaWZpZWRVcGRhdGFibGUgIT0gbmV3U3BlY2lmaWVkVXBkYXRhYmxlKSB7Ci0JCQlpZiAodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldENvbHVtblJlc291cmNlKCkuc2V0VXBkYXRhYmxlKG5ld1NwZWNpZmllZFVwZGF0YWJsZSk7CQkJCQkJCi0JCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVDb2x1bW5SZXNvdXJjZSgpOworCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQob2xkU3BlY2lmaWVkVXBkYXRhYmxlLCBuZXdTcGVjaWZpZWRVcGRhdGFibGUpKSB7CisJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpICE9IG51bGwpIHsKKwkJCQl0aGlzLmdldFJlc291cmNlQ29sdW1uKCkuc2V0VXBkYXRhYmxlKG5ld1NwZWNpZmllZFVwZGF0YWJsZSk7CQkJCQkJCisJCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKS5pc1Vuc2V0KCkpIHsKKwkJCQkJcmVtb3ZlUmVzb3VyY2VDb2x1bW4oKTsKIAkJCQl9CiAJCQl9CiAJCQllbHNlIGlmIChuZXdTcGVjaWZpZWRVcGRhdGFibGUgIT0gbnVsbCkgewotCQkJCWFkZENvbHVtblJlc291cmNlKCk7Ci0JCQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRVcGRhdGFibGUobmV3U3BlY2lmaWVkVXBkYXRhYmxlKTsKKwkJCQlhZGRSZXNvdXJjZUNvbHVtbigpOworCQkJCWdldFJlc291cmNlQ29sdW1uKCkuc2V0VXBkYXRhYmxlKG5ld1NwZWNpZmllZFVwZGF0YWJsZSk7CiAJCQl9CiAJCX0KIAkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlQ29sdW1uLlNQRUNJRklFRF9VUERBVEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFVwZGF0YWJsZSwgbmV3U3BlY2lmaWVkVXBkYXRhYmxlKTsKQEAgLTI0MywxNCArMjQzLDE0IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyB0YWJsZU5hbWUoKSB7CisJcHJvdGVjdGVkIFN0cmluZyBnZXRPd25pbmdUYWJsZU5hbWUoKSB7CiAJCXJldHVybiB0aGlzLmdldFRhYmxlKCk7CiAJfQogCiAKIAlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKCkgewotCQlpZiAoZ2V0Q29sdW1uUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gZ2V0Q29sdW1uUmVzb3VyY2UoKS5nZXRUYWJsZVRleHRSYW5nZSgpOworCQlpZiAoZ2V0UmVzb3VyY2VDb2x1bW4oKSAhPSBudWxsKSB7CisJCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gZ2V0UmVzb3VyY2VDb2x1bW4oKS5nZXRUYWJsZVRleHRSYW5nZSgpOwogCQkJaWYgKHRleHRSYW5nZSAhPSBudWxsKSB7CiAJCQkJcmV0dXJuIHRleHRSYW5nZTsKIAkJCX0KQEAgLTI2MSw0NyArMjYxLDQ3IEBACiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShUIGNvbHVtbikgewogCQlzdXBlci5pbml0aWFsaXplKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSB0aGlzLnNwZWNpZmllZFRhYmxlKGNvbHVtbik7Ci0JCXRoaXMuZGVmYXVsdFRhYmxlID0gdGhpcy5kZWZhdWx0VGFibGUoKTsKKwkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IHRoaXMuZ2V0UmVzb3VyY2VUYWJsZShjb2x1bW4pOworCQl0aGlzLmRlZmF1bHRUYWJsZSA9IHRoaXMuYnVpbGREZWZhdWx0VGFibGVOYW1lKCk7CiAJCS8vVE9ETyBkZWZhdWx0IGZyb20gamF2YSBmb3IgYWxsIG9mIHRoZXNlIHNldHRpbmdzCi0JCXRoaXMuc3BlY2lmaWVkTnVsbGFibGUgPSB0aGlzLnNwZWNpZmllZE51bGxhYmxlKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlID0gdGhpcy5zcGVjaWZpZWRVcGRhdGFibGUoY29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWRVbmlxdWUgPSB0aGlzLnNwZWNpZmllZFVuaXF1ZShjb2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZEluc2VydGFibGUgPSB0aGlzLnNwZWNpZmllZEluc2VydGFibGUoY29sdW1uKTsKKwkJdGhpcy5zcGVjaWZpZWROdWxsYWJsZSA9IHRoaXMuZ2V0UmVzb3VyY2VOdWxsYWJsZShjb2x1bW4pOworCQl0aGlzLnNwZWNpZmllZFVwZGF0YWJsZSA9IHRoaXMuZ2V0UmVzb3VyY2VVcGRhdGFibGUoY29sdW1uKTsKKwkJdGhpcy5zcGVjaWZpZWRVbmlxdWUgPSB0aGlzLmdldFJlc291cmNlVW5pcXVlKGNvbHVtbik7CisJCXRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZSA9IHRoaXMuZ2V0UmVzb3VyY2VJbnNlcnRhYmxlKGNvbHVtbik7CiAJfQogCQogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShUIGNvbHVtbikgewogCQlzdXBlci51cGRhdGUoY29sdW1uKTsKLQkJc2V0U3BlY2lmaWVkVGFibGVfKHRoaXMuc3BlY2lmaWVkVGFibGUoY29sdW1uKSk7Ci0JCXNldERlZmF1bHRUYWJsZSh0aGlzLmRlZmF1bHRUYWJsZSgpKTsKLQkJc2V0U3BlY2lmaWVkTnVsbGFibGVfKHRoaXMuc3BlY2lmaWVkTnVsbGFibGUoY29sdW1uKSk7Ci0JCXNldFNwZWNpZmllZFVwZGF0YWJsZV8odGhpcy5zcGVjaWZpZWRVcGRhdGFibGUoY29sdW1uKSk7Ci0JCXNldFNwZWNpZmllZFVuaXF1ZV8odGhpcy5zcGVjaWZpZWRVbmlxdWUoY29sdW1uKSk7Ci0JCXNldFNwZWNpZmllZEluc2VydGFibGVfKHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZShjb2x1bW4pKTsKKwkJc2V0U3BlY2lmaWVkVGFibGVfKHRoaXMuZ2V0UmVzb3VyY2VUYWJsZShjb2x1bW4pKTsKKwkJc2V0RGVmYXVsdFRhYmxlKHRoaXMuYnVpbGREZWZhdWx0VGFibGVOYW1lKCkpOworCQlzZXRTcGVjaWZpZWROdWxsYWJsZV8odGhpcy5nZXRSZXNvdXJjZU51bGxhYmxlKGNvbHVtbikpOworCQlzZXRTcGVjaWZpZWRVcGRhdGFibGVfKHRoaXMuZ2V0UmVzb3VyY2VVcGRhdGFibGUoY29sdW1uKSk7CisJCXNldFNwZWNpZmllZFVuaXF1ZV8odGhpcy5nZXRSZXNvdXJjZVVuaXF1ZShjb2x1bW4pKTsKKwkJc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZV8odGhpcy5nZXRSZXNvdXJjZUluc2VydGFibGUoY29sdW1uKSk7CiAJfQogCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYWJsZShUIGNvbHVtbikgeworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VUYWJsZShUIGNvbHVtbikgewogCQlyZXR1cm4gY29sdW1uID09IG51bGwgPyBudWxsIDogY29sdW1uLmdldFRhYmxlKCk7CiAJfQogCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkTnVsbGFibGUoVCBjb2x1bW4pIHsKKwlwcm90ZWN0ZWQgQm9vbGVhbiBnZXRSZXNvdXJjZU51bGxhYmxlKFQgY29sdW1uKSB7CiAJCXJldHVybiBjb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBjb2x1bW4uZ2V0TnVsbGFibGUoKTsKIAl9CiAJCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkVXBkYXRhYmxlKFQgY29sdW1uKSB7CisJcHJvdGVjdGVkIEJvb2xlYW4gZ2V0UmVzb3VyY2VVcGRhdGFibGUoVCBjb2x1bW4pIHsKIAkJcmV0dXJuIGNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGNvbHVtbi5nZXRVcGRhdGFibGUoKTsKIAl9CiAJCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkVW5pcXVlKFQgY29sdW1uKSB7CisJcHJvdGVjdGVkIEJvb2xlYW4gZ2V0UmVzb3VyY2VVbmlxdWUoVCBjb2x1bW4pIHsKIAkJcmV0dXJuIGNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGNvbHVtbi5nZXRVbmlxdWUoKTsKIAl9CiAJCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkSW5zZXJ0YWJsZShUIGNvbHVtbikgeworCXByb3RlY3RlZCBCb29sZWFuIGdldFJlc291cmNlSW5zZXJ0YWJsZShUIGNvbHVtbikgewogCQlyZXR1cm4gY29sdW1uID09IG51bGwgPyBudWxsIDogY29sdW1uLmdldEluc2VydGFibGUoKTsKIAl9CiAJCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFibGUoKSB7CisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUYWJsZU5hbWUoKSB7CiAJCXJldHVybiBnZXRPd25lcigpLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQppbmRleCBhYTljMWJhLi4xMmIwZTFlIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMzUzICs5LDIwMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2VFbWJlZGRlZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2VFbWJlZGRlZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQmFzZUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQmFzZVhtbEVtYmVkZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxFbWJlZGRlZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CiAKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZzxUIGV4dGVuZHMgQmFzZVhtbEVtYmVkZGVkPiBleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxUPiBpbXBsZW1lbnRzIE9ybUJhc2VFbWJlZGRlZE1hcHBpbmcKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUJhc2VFbWJlZGRlZE1hcHBpbmc8VCBleHRlbmRzIEFic3RyYWN0WG1sRW1iZWRkZWQ+IGV4dGVuZHMgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFQ+IGltcGxlbWVudHMgT3JtQmFzZUVtYmVkZGVkTWFwcGluZwogewotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXM7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXM7CisJcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwogCi0JcHJpdmF0ZSBFbWJlZGRhYmxlIGVtYmVkZGFibGU7CisJcHJpdmF0ZSBFbWJlZGRhYmxlIGVtYmVkZGFibGU7Ly9UT0RPIGhtbSwgd2h5IG5vIHByb3BlcnR5IGNoYW5nZSBub3RpZmljYXRpb24gZm9yIHNldHRpbmcgdGhpcz8/CiAJCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8T3JtQXR0cmlidXRlT3ZlcnJpZGU+KCk7Ci0JCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8T3JtQXR0cmlidXRlT3ZlcnJpZGU+KCk7CisJcHJvdGVjdGVkIEFic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgVCByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCQl0aGlzLmVtYmVkZGFibGUgPSBlbWJlZGRhYmxlRm9yKHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKHRoaXMsIG5ldyBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyKCksIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKIAl9CiAKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybUJhc2VFbWJlZGRlZE1hcHBpbmcoT3JtQmFzZUVtYmVkZGVkTWFwcGluZyBvbGRNYXBwaW5nKSB7CiAJCXN1cGVyLmluaXRpYWxpemVGcm9tT3JtQmFzZUVtYmVkZGVkTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yIChPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvbGRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpKSkgewotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBuZXdBdHRyaWJ1dGVPdmVycmlkZSA9IGFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGluZGV4KyspOwotCQkJbmV3QXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZShhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkJbmV3QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaW5pdGlhbGl6ZUZyb20oYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkpOwotCQl9CisJCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuaW5pdGlhbGl6ZUZyb21BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcihvbGRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkpOwogCX0KIAotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+KHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkpOworCXB1YmxpYyBPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpIHsKKwkJcmV0dXJuIHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7CiAJfQogCi0JcHVibGljIGludCBhdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgKyB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+KHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGFkZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlhZGRJdGVtVG9MaXN0KGF0dHJpYnV0ZU92ZXJyaWRlLCB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMsIEJhc2VFbWJlZGRlZE1hcHBpbmcuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGF0dHJpYnV0ZU92ZXJyaWRlLCB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMsIEJhc2VFbWJlZGRlZE1hcHBpbmcuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpOwotCX0KLQotCXB1YmxpYyBpbnQgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+KHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5zaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGludCBpbmRleCkgewotCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSB4bWxBdHRyaWJ1dGVPdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoeG1sQXR0cmlidXRlT3ZlcnJpZGUpOwotCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoaW5kZXgsIGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKGluZGV4LCB4bWxBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChCYXNlRW1iZWRkZWRNYXBwaW5nLlNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZShpbnQgaW5kZXgsIE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGF0dHJpYnV0ZU92ZXJyaWRlLCB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcywgQmFzZUVtYmVkZGVkTWFwcGluZy5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlXyhPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoYXR0cmlidXRlT3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLCBCYXNlRW1iZWRkZWRNYXBwaW5nLlNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChCYXNlRW1iZWRkZWRNYXBwaW5nLlNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0KLQlwdWJsaWMgT3JtQXR0cmlidXRlT3ZlcnJpZGUgZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKE9ybUF0dHJpYnV0ZU92ZXJyaWRlKSBnZXRPdmVycmlkZU5hbWVkKG5hbWUsIGF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQmFzZU92ZXJyaWRlIGdldE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgQmFzZU92ZXJyaWRlPiBvdmVycmlkZXMpIHsKLQkJZm9yIChCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3ZlcnJpZGVzKSkgewotCQkJU3RyaW5nIG92ZXJyaWRlTmFtZSA9IG92ZXJyaWRlLmdldE5hbWUoKTsKLQkJCWlmIChvdmVycmlkZU5hbWUgPT0gbnVsbCAmJiBuYW1lID09IG51bGwpIHsKLQkJCQlyZXR1cm4gb3ZlcnJpZGU7Ci0JCQl9Ci0JCQlpZiAob3ZlcnJpZGVOYW1lICE9IG51bGwgJiYgb3ZlcnJpZGVOYW1lLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBvdmVycmlkZTsKLQkJCX0KKwlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGdldEphdmFBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCWlmIChnZXRKYXZhRW1iZWRkZWRNYXBwaW5nKCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIGdldEphdmFFbWJlZGRlZE1hcHBpbmcoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoYXR0cmlidXRlTmFtZSk7CiAJCX0KIAkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKioqKiogQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIgaW1wbGVtZW5hdGlvbiAqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZU92ZXJyaWRlIG92ZXJyaWRlKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuY29udGFpbnMob3ZlcnJpZGUpOwotCX0KLQotCXB1YmxpYyBCYXNlT3ZlcnJpZGUgc2V0VmlydHVhbChib29sZWFuIHZpcnR1YWwsIEJhc2VPdmVycmlkZSBvdmVycmlkZSkgewotCQkvLyBBZGQgYSBuZXcgYXR0cmlidXRlIG92ZXJyaWRlCi0JCWlmICh2aXJ0dWFsKSB7Ci0JCQlyZXR1cm4gc2V0VmlydHVhbCgoT3JtQXR0cmlidXRlT3ZlcnJpZGUpIG92ZXJyaWRlKTsKLQkJfQotCQlyZXR1cm4gc2V0U3BlY2lmaWVkKChPcm1BdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUpOwotCX0KKwl9CQogCQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVPdmVycmlkZSBzZXRWaXJ0dWFsKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCWludCBpbmRleCA9IHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmluZGV4T2YoYXR0cmlidXRlT3ZlcnJpZGUpOwotCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5yZW1vdmUoaW5kZXgpOwotCQlTdHJpbmcgYXR0cmlidXRlT3ZlcnJpZGVOYW1lID0gYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpOwotCQkvL2FkZCB0aGUgdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGUgc28gdGhhdCBJIGNhbiBjb250cm9sIHRoZSBvcmRlciB0aGF0IGNoYW5nZSBub3RpZmljYXRpb24gaXMgc2VudC4KLQkJLy9vdGhlcndpc2Ugd2hlbiB3ZSByZW1vdmUgdGhlIGFubm90YXRpb24gZnJvbSBqYXZhIHdlIHdpbGwgZ2V0IGFuIHVwZGF0ZSBhbmQgYWRkIHRoZSBhdHRyaWJ1dGUgb3ZlcnJpZGUKLQkJLy9kdXJpbmcgdGhlIHVkcGF0ZS4gIFRoaXMgY2F1c2VzIHRoZSBVSSB0byBiZSBmbGFreSwgc2luY2UgY2hhbmdlIG5vdGlmaWNhdGlvbiBtaWdodCBub3Qgb2NjdXIgaW4gdGhlIGNvcnJlY3Qgb3JkZXIKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gbnVsbDsKLQkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSAhPSBudWxsKSB7Ci0JCQlmb3IgKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSkpIHsKLQkJCQlpZiAocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSkpIHsKLQkJCQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGphdmFBdHRyaWJ1dGVPdmVycmlkZSA9IG51bGw7Ci0JCQkJCWlmIChnZXRKYXZhRW1iZWRkZWRNYXBwaW5nKCkgIT0gbnVsbCkgewotCQkJCQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0SmF2YUVtYmVkZGVkTWFwcGluZygpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoYXR0cmlidXRlT3ZlcnJpZGVOYW1lKTsKLQkJCQkJfQotCQkJCQkvL3N0b3JlIHRoZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgc28gd2UgY2FuIGZpcmUgY2hhbmdlIG5vdGlmaWNhdGlvbiBsYXRlcgotCQkJCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShwZXJzaXN0ZW50QXR0cmlidXRlLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUpOwotCQkJCQl0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChCYXNlRW1iZWRkZWRNYXBwaW5nLlNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQotCQlpZiAodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlICE9IG51bGwpIHsKLQkJCWZpcmVJdGVtQWRkZWQoQmFzZUVtYmVkZGVkTWFwcGluZy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSAtIDEsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCX0KLQkJcmV0dXJuIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU92ZXJyaWRlIHNldFNwZWNpZmllZChPcm1BdHRyaWJ1dGVPdmVycmlkZSBvbGRBdHRyaWJ1dGVPdmVycmlkZSkgewotCQlpbnQgaW5kZXggPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7Ci0JCVhtbEF0dHJpYnV0ZU92ZXJyaWRlIHhtbEF0dHJpYnV0ZU92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIG5ld0F0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtQXR0cmlidXRlT3ZlcnJpZGUodGhpcywgdGhpcywgeG1sQXR0cmlidXRlT3ZlcnJpZGUpOwotCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoaW5kZXgsIG5ld0F0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCi0JCWdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoeG1sQXR0cmlidXRlT3ZlcnJpZGUpOwotCQkKLQkJaW50IGRlZmF1bHRJbmRleCA9IHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5pbmRleE9mKG9sZEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLnJlbW92ZShkZWZhdWx0SW5kZXgpOwotCi0JCW5ld0F0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUob2xkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJbmV3QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShvbGRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoQmFzZUVtYmVkZGVkTWFwcGluZy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgZGVmYXVsdEluZGV4LCBvbGRBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChCYXNlRW1iZWRkZWRNYXBwaW5nLlNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBuZXdBdHRyaWJ1dGVPdmVycmlkZSk7CQkKLQotCQlyZXR1cm4gbmV3QXR0cmlidXRlT3ZlcnJpZGU7Ci0JfQotCi0JcHVibGljIENvbHVtbk1hcHBpbmcgZ2V0Q29sdW1uTWFwcGluZyhTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmdldENvbHVtbk1hcHBpbmcoYXR0cmlidXRlTmFtZSwgZ2V0RW1iZWRkYWJsZSgpKTsKLQl9Ci0KIAlwdWJsaWMgRW1iZWRkYWJsZSBnZXRFbWJlZGRhYmxlKCkgewogCQlyZXR1cm4gdGhpcy5lbWJlZGRhYmxlOwogCX0KIAkKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZSwgU3RyaW5nPih0aGlzLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHsKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZz4gZW1iZWRkYWJsZUF0dHJpYnV0ZU1hcHBpbmdzKCkgewogCQlpZiAodGhpcy5nZXRFbWJlZGRhYmxlKCkgPT0gbnVsbCkgewogCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKIAkJfQotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIFBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMuZ2V0RW1iZWRkYWJsZSgpLmdldFBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpKSB7CisJCXJldHVybiB0aGlzLmdldEVtYmVkZGFibGUoKS5hdHRyaWJ1dGVNYXBwaW5ncygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkZWFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKSB7CisJCWlmIChnZXRKcGFQbGF0Zm9ybVZlcnNpb24oKS5pc0NvbXBhdGlibGVXaXRoSnBhVmVyc2lvbihKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzJfMCkpIHsKKwkJCXJldHVybiBlbWJlZGRhYmxlT3ZlcnJpZGVhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmFsbE92ZXJyaWRlYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpOworCX0KKwkKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBlbWJlZGRhYmxlT3ZlcnJpZGVhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KAorCQkJbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4oCisJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZywgSXRlcmF0b3I8U3RyaW5nPj4odGhpcy5lbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ3MoKSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdHJhbnNmb3JtKEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgeworCQkJCQkJcmV0dXJuIG1hcHBpbmcuYWxsT3ZlcnJpZGVhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCk7CisJCQkJCX0KKwkJCQl9CisJCQkpCisJCSkgewogCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoUGVyc2lzdGVudEF0dHJpYnV0ZSBvKSB7Ci0JCQkJcmV0dXJuIG8uaXNPdmVycmlkYWJsZUF0dHJpYnV0ZSgpOworCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpICsgJy4nICsgbmV4dDsKIAkJCX0KIAkJfTsKIAl9CiAKLQlwdWJsaWMgQWJzdHJhY3RKYXZhQmFzZUVtYmVkZGVkTWFwcGluZzw/PiBnZXRKYXZhRW1iZWRkZWRNYXBwaW5nKCkgewotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCWlmIChqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSAhPSBudWxsICYmIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBnZXRLZXkoKSkgewotCQkJcmV0dXJuIChBYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nPD8+KSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYWxsT3ZlcnJpZGVhYmxlQXNzb2NpYXRpb25NYXBwaW5nTmFtZXMoKSB7CisJCWlmIChnZXRKcGFQbGF0Zm9ybVZlcnNpb24oKS5pc0NvbXBhdGlibGVXaXRoSnBhVmVyc2lvbihKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzJfMCkpIHsKKwkJCXJldHVybiBlbWJlZGRhYmxlT3ZlcnJpZGVhYmxlQXNzb2NpYXRpb25NYXBwaW5nTmFtZXMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuYWxsT3ZlcnJpZGVhYmxlQXNzb2NpYXRpb25NYXBwaW5nTmFtZXMoKTsKKwl9CisJCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gZW1iZWRkYWJsZU92ZXJyaWRlYWJsZUFzc29jaWF0aW9uTWFwcGluZ05hbWVzKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KAorCQkJbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4oCisJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZywgSXRlcmF0b3I8U3RyaW5nPj4odGhpcy5lbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ3MoKSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdHJhbnNmb3JtKEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgeworCQkJCQkJcmV0dXJuIG1hcHBpbmcuYWxsT3ZlcnJpZGVhYmxlQXNzb2NpYXRpb25NYXBwaW5nTmFtZXMoKTsKKwkJCQkJfQorCQkJCX0KKwkJCSkKKwkJKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7CisJCQkJcmV0dXJuIGdldE5hbWUoKSArICcuJyArIG5leHQ7CisJCQl9CisJCX07CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmIChnZXRKcGFQbGF0Zm9ybVZlcnNpb24oKS5pc0NvbXBhdGlibGVXaXRoSnBhVmVyc2lvbihKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzJfMCkpIHsKKwkJCWludCBkb3RJbmRleCA9IGF0dHJpYnV0ZU5hbWUuaW5kZXhPZignLicpOworCQkJaWYgKGRvdEluZGV4ICE9IC0xKSB7CisJCQkJaWYgKGdldE5hbWUoKS5lcXVhbHMoYXR0cmlidXRlTmFtZS5zdWJzdHJpbmcoMCwgZG90SW5kZXgpKSkgeworCQkJCQlhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZS5zdWJzdHJpbmcoZG90SW5kZXggKyAxKTsKKwkJCQkJQXR0cmlidXRlT3ZlcnJpZGUgb3ZlcnJpZGUgPSBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoYXR0cmlidXRlTmFtZSk7CisJCQkJCWlmIChvdmVycmlkZSAhPSBudWxsICYmICFvdmVycmlkZS5pc1ZpcnR1YWwoKSkgeworCQkJCQkJcmV0dXJuIG92ZXJyaWRlLmdldENvbHVtbigpOworCQkJCQl9CisJCQkJCWlmICh0aGlzLmdldEVtYmVkZGFibGUoKSA9PSBudWxsKSB7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdGhpcy5nZXRFbWJlZGRhYmxlKCkucmVzb2x2ZU92ZXJyaWRlbkNvbHVtbihhdHRyaWJ1dGVOYW1lKTsKKwkJCQl9CisJCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVCBlbWJlZGRlZCkgewotCQlzdXBlci5pbml0aWFsaXplKGVtYmVkZGVkKTsKLQkJdGhpcy5lbWJlZGRhYmxlID0gZW1iZWRkYWJsZUZvcihmaW5kSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyhlbWJlZGRlZCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyhUIGVtYmVkZGVkKSB7Ci0JCWZvciAoWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgOiBlbWJlZGRlZC5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoYXR0cmlidXRlT3ZlcnJpZGUpKTsKKworCXB1YmxpYyBKYXZhQmFzZUVtYmVkZGVkTWFwcGluZyBnZXRKYXZhRW1iZWRkZWRNYXBwaW5nKCkgeworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSB0aGlzLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCWlmICgoanBhICE9IG51bGwpICYmIHRoaXMudmFsdWVzQXJlRXF1YWwoanBhLmdldE1hcHBpbmdLZXkoKSwgdGhpcy5nZXRLZXkoKSkpIHsKKwkJCXJldHVybiAoSmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcpIGpwYS5nZXRNYXBwaW5nKCk7CiAJCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB7Ci0JCWlmIChnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKLQkJCS8vc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzIGFyZSB1c2VkIGlmIHRoZSBwZXJzaXN0ZW50QXR0cmlidXRlIGlzIHZpcnR1YWwKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSkpIHsKLQkJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGUgPT0gbnVsbCkgewotCQkJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBudWxsOwotCQkJCWlmIChnZXRKYXZhRW1iZWRkZWRNYXBwaW5nKCkgIT0gbnVsbCkgewotCQkJCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKYXZhRW1iZWRkZWRNYXBwaW5nKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUocGVyc2lzdGVudEF0dHJpYnV0ZSwgamF2YUF0dHJpYnV0ZU92ZXJyaWRlKSk7Ci0JCQl9Ci0JCX0KKwkJcmV0dXJuIG51bGw7CiAJfQogCi0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGphdmFBdHRyaWJ1dGVPdmVycmlkZSkgewotCQlyZXR1cm4gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZShidWlsZFZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZShwZXJzaXN0ZW50QXR0cmlidXRlLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkVmlydHVhbFhtbEF0dHJpYnV0ZU92ZXJyaWRlKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGphdmFBdHRyaWJ1dGVPdmVycmlkZSkgewotCQlYbWxDb2x1bW4geG1sQ29sdW1uOwotCQlpZiAoamF2YUF0dHJpYnV0ZU92ZXJyaWRlID09IG51bGwpIHsKLQkJCUNvbHVtbk1hcHBpbmcgY29sdW1uTWFwcGluZyA9IChDb2x1bW5NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCXhtbENvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sQ29sdW1uKGdldFR5cGVNYXBwaW5nKCksIGNvbHVtbk1hcHBpbmcuZ2V0Q29sdW1uKCksIGZhbHNlKTsJCQkKLQkJfQotCQllbHNlIHsKLQkJCXhtbENvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sQ29sdW1uKGdldFR5cGVNYXBwaW5nKCksIGphdmFBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKSwgdHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBWaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCksIHhtbENvbHVtbik7Ci0JfQotCQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVPdmVycmlkZSBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlKFhtbEF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1BdHRyaWJ1dGVPdmVycmlkZSh0aGlzLCB0aGlzLCBhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JfQogCQogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShUIGVtYmVkZGVkKSB7Ci0JCXN1cGVyLnVwZGF0ZShlbWJlZGRlZCk7Ci0JCXRoaXMuZW1iZWRkYWJsZSA9IGVtYmVkZGFibGVGb3IoZmluZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyhlbWJlZGRlZCk7Ci0JCXRoaXMudXBkYXRlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoVCBlbWJlZGRlZCkgewotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbEF0dHJpYnV0ZU92ZXJyaWRlPihlbWJlZGRlZC5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCQotCQl3aGlsZSAoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSkgewotCQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSkgewotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlLnVwZGF0ZShyZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVfKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSkgewotCQkJYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpLCBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlKHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJCi0JCWlmICghZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkvL3NwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyBhcmUgdXNlZCBpZiB0aGUgcGVyc2lzdGVudEF0dHJpYnV0ZSBpcyB2aXJ0dWFsCi0JCQlmb3IgKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMpKSB7Ci0JCQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCQlpZiAob3JtQXR0cmlidXRlT3ZlcnJpZGUgIT0gbnVsbCAmJiAhb3JtQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBudWxsOwotCQkJCWlmIChnZXRKYXZhRW1iZWRkZWRNYXBwaW5nKCkgIT0gbnVsbCkgewotCQkJCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKYXZhRW1iZWRkZWRNYXBwaW5nKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCWlmIChvcm1BdHRyaWJ1dGVPdmVycmlkZSAhPSBudWxsKSB7Ci0JCQkJCWlmICh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSkgewotCQkJCQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCQkJCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUudXBkYXRlKGJ1aWxkVmlydHVhbFhtbEF0dHJpYnV0ZU92ZXJyaWRlKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIGphdmFBdHRyaWJ1dGVPdmVycmlkZSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYWRkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIGphdmFBdHRyaWJ1dGVPdmVycmlkZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlhZGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUocGVyc2lzdGVudEF0dHJpYnV0ZSwgamF2YUF0dHJpYnV0ZU92ZXJyaWRlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZvciAoT3JtQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMpKSB7Ci0JCQlyZW1vdmVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJfQotCQkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLmVtYmVkZGFibGUgPSBlbWJlZGRhYmxlRm9yKHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCWdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkudXBkYXRlKCk7CiAJfQogCQogCS8vKioqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioqKgogCQogCXB1YmxpYyBzdGF0aWMgRW1iZWRkYWJsZSBlbWJlZGRhYmxlRm9yKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCWlmIChqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9PSBudWxsKSA/IG51bGwgOiBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRFbWJlZGRhYmxlKCk7CisJfQorCQorCQorCS8vKioqKioqKioqKiBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioJCisJCisJY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lciBpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLk93bmVyIHsKKwkJcHVibGljIFR5cGVNYXBwaW5nIGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nLnRoaXMuZ2V0RW1iZWRkYWJsZSgpOwogCQl9Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMuZ2V0RW1iZWRkYWJsZUZvcihqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCQorCQlwdWJsaWMgT3JtVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nLnRoaXMuZ2V0VHlwZU1hcHBpbmcoKTsKKwkJfQorCQkKKwkJcHVibGljIENvbHVtbiByZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKFN0cmluZyBhdHRyaWJ1dGVPdmVycmlkZU5hbWUpIHsKKwkJCWlmIChnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkgJiYgIWdldFR5cGVNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgamF2YUF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0SmF2YUF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoYXR0cmlidXRlT3ZlcnJpZGVOYW1lKTsKKwkJCQlpZiAoamF2YUF0dHJpYnV0ZU92ZXJyaWRlICE9IG51bGwgJiYgIWphdmFBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSkgeworCQkJCQlyZXR1cm4gamF2YUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOworCQkJCX0KKwkJCX0KKwkJCVR5cGVNYXBwaW5nIG92ZXJyaWRhYmxlVHlwZU1hcHBpbmcgPSBnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCk7CisJCQlDb2x1bW4gY29sdW1uID0gbnVsbDsKKwkJCWlmIChvdmVycmlkYWJsZVR5cGVNYXBwaW5nICE9IG51bGwpIHsKKwkJCQlmb3IgKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG92ZXJyaWRhYmxlVHlwZU1hcHBpbmcuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkpIHsKKwkJCQkJY29sdW1uID0gdHlwZU1hcHBpbmcucmVzb2x2ZU92ZXJyaWRlbkNvbHVtbihhdHRyaWJ1dGVPdmVycmlkZU5hbWUpOworCQkJCQlpZiAoY29sdW1uICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiBjb2x1bW47CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gY29sdW1uOworCQl9CisJCQorCQlwdWJsaWMgWG1sQ29sdW1uIGJ1aWxkVmlydHVhbFhtbENvbHVtbihDb2x1bW4gb3ZlcnJpZGFibGVDb2x1bW4sIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBib29sZWFuIGlzTWV0YWRhdGFDb21wbGV0ZSkgeworCQkJcmV0dXJuIG5ldyBWaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4ob3ZlcnJpZGFibGVDb2x1bW4pOworCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQmFzaWNNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1CYXNpY01hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDg0ODdkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQmFzaWNNYXBwaW5nLmphdmEKQEAgLTAsMCArMSwzMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTnVsbGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUJhc2ljTWFwcGluZzxUIGV4dGVuZHMgWG1sQmFzaWM+CisJZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8VD4KKwlpbXBsZW1lbnRzIE9ybUJhc2ljTWFwcGluZworeworCXByb3RlY3RlZCBmaW5hbCBPcm1Db2x1bW4gY29sdW1uOworCQorCXByb3RlY3RlZCBGZXRjaFR5cGUgc3BlY2lmaWVkRmV0Y2g7CisKKwlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRPcHRpb25hbDsKKwkKKwlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGRlZmF1bHRDb252ZXJ0ZXI7CisJCisJcHJvdGVjdGVkIE9ybUNvbnZlcnRlciBzcGVjaWZpZWRDb252ZXJ0ZXI7CisJCisJcHJvdGVjdGVkIEFic3RyYWN0T3JtQmFzaWNNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBUIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJCXRoaXMuY29sdW1uID0gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1Db2x1bW4odGhpcywgdGhpcyk7CisJCXRoaXMuY29sdW1uLmluaXRpYWxpemUodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpKTsvL1RPRE8gcGFzcyBpbiB0byBmYWN0b3J5CisJCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSB0aGlzLmdldFJlc291cmNlRmV0Y2goKTsKKwkJdGhpcy5zcGVjaWZpZWRPcHRpb25hbCA9IHRoaXMuZ2V0UmVzb3VyY2VPcHRpb25hbCgpOworCQl0aGlzLmRlZmF1bHRDb252ZXJ0ZXIgPSBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybU51bGxDb252ZXJ0ZXIodGhpcyk7CisJCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyID0gdGhpcy5idWlsZFNwZWNpZmllZENvbnZlcnRlcih0aGlzLmdldFJlc291cmNlQ29udmVydGVyVHlwZSgpKTsKKwl9CisKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkRmV0Y2goKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEZldGNoKCkgOiB0aGlzLmdldFNwZWNpZmllZEZldGNoKCk7CisJfQorCisJcHVibGljIEZldGNoVHlwZSBnZXREZWZhdWx0RmV0Y2goKSB7CisJCXJldHVybiBCYXNpY01hcHBpbmcuREVGQVVMVF9GRVRDSF9UWVBFOworCX0KKworCXB1YmxpYyBGZXRjaFR5cGUgZ2V0U3BlY2lmaWVkRmV0Y2goKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEZldGNoOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUgbmV3U3BlY2lmaWVkRmV0Y2gpIHsKKwkJRmV0Y2hUeXBlIG9sZEZldGNoID0gdGhpcy5zcGVjaWZpZWRGZXRjaDsKKwkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IG5ld1NwZWNpZmllZEZldGNoOworCQl0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5zZXRGZXRjaChGZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZEZldGNoKSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRmV0Y2hhYmxlLlNQRUNJRklFRF9GRVRDSF9QUk9QRVJUWSwgb2xkRmV0Y2gsIG5ld1NwZWNpZmllZEZldGNoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaF8oRmV0Y2hUeXBlIG5ld1NwZWNpZmllZEZldGNoKSB7CisJCUZldGNoVHlwZSBvbGRGZXRjaCA9IHRoaXMuc3BlY2lmaWVkRmV0Y2g7CisJCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSBuZXdTcGVjaWZpZWRGZXRjaDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChGZXRjaGFibGUuU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGRGZXRjaCwgbmV3U3BlY2lmaWVkRmV0Y2gpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpID09IG51bGwpID8gdGhpcy5pc0RlZmF1bHRPcHRpb25hbCgpIDogdGhpcy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpLmJvb2xlYW5WYWx1ZSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRPcHRpb25hbCgpIHsKKwkJcmV0dXJuIE51bGxhYmxlLkRFRkFVTFRfT1BUSU9OQUw7CisJfQorCisJcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuIG5ld1NwZWNpZmllZE9wdGlvbmFsKSB7CisJCUJvb2xlYW4gb2xkT3B0aW9uYWwgPSB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOworCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gbmV3U3BlY2lmaWVkT3B0aW9uYWw7CisJCXRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLnNldE9wdGlvbmFsKG5ld1NwZWNpZmllZE9wdGlvbmFsKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChOdWxsYWJsZS5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIG9sZE9wdGlvbmFsLCBuZXdTcGVjaWZpZWRPcHRpb25hbCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsXyhCb29sZWFuIG5ld1NwZWNpZmllZE9wdGlvbmFsKSB7CisJCUJvb2xlYW4gb2xkT3B0aW9uYWwgPSB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOworCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gbmV3U3BlY2lmaWVkT3B0aW9uYWw7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTnVsbGFibGUuU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZLCBvbGRPcHRpb25hbCwgbmV3U3BlY2lmaWVkT3B0aW9uYWwpOworCX0KKwkKKwlwdWJsaWMgT3JtQ29udmVydGVyIGdldENvbnZlcnRlcigpIHsKKwkJcmV0dXJuIGdldFNwZWNpZmllZENvbnZlcnRlcigpID09IG51bGwgPyBnZXREZWZhdWx0Q29udmVydGVyKCkgOiBnZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKTsKKwl9CisJCisJcHVibGljIE9ybUNvbnZlcnRlciBnZXREZWZhdWx0Q29udmVydGVyKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q29udmVydGVyOworCX0KKwkKKwlwdWJsaWMgT3JtQ29udmVydGVyIGdldFNwZWNpZmllZENvbnZlcnRlcigpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ29udmVydGVyOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNpZmVkQ29udmVydGVyVHlwZSgpIHsKKwkJaWYgKHRoaXMuc3BlY2lmaWVkQ29udmVydGVyID09IG51bGwpIHsKKwkJCXJldHVybiBDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSOworCQl9CisJCXJldHVybiB0aGlzLnNwZWNpZmllZENvbnZlcnRlci5nZXRUeXBlKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENvbnZlcnRlcihTdHJpbmcgY29udmVydGVyVHlwZSkgeworCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChnZXRTcGVjaWZlZENvbnZlcnRlclR5cGUoKSwgY29udmVydGVyVHlwZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlPcm1Db252ZXJ0ZXIgb2xkQ29udmVydGVyID0gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXI7CisJCU9ybUNvbnZlcnRlciBuZXdDb252ZXJ0ZXIgPSBidWlsZFNwZWNpZmllZENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlKTsKKwkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXIgPSBudWxsOworCQlpZiAob2xkQ29udmVydGVyICE9IG51bGwpIHsKKwkJCW9sZENvbnZlcnRlci5yZW1vdmVGcm9tUmVzb3VyY2VNb2RlbCgpOworCQl9CisJCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyID0gbmV3Q29udmVydGVyOworCQlpZiAobmV3Q29udmVydGVyICE9IG51bGwpIHsKKwkJCW5ld0NvbnZlcnRlci5hZGRUb1Jlc291cmNlTW9kZWwoKTsKKwkJfQorCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFksIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ29udmVydGVyKE9ybUNvbnZlcnRlciBuZXdDb252ZXJ0ZXIpIHsKKwkJT3JtQ29udmVydGVyIG9sZENvbnZlcnRlciA9IHRoaXMuc3BlY2lmaWVkQ29udmVydGVyOworCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlciA9IG5ld0NvbnZlcnRlcjsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ09OVkVSVEVSX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXIsIG5ld0NvbnZlcnRlcik7CisJfQkKKworCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKKwkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybUJhc2ljTWFwcGluZyh0aGlzKTsKKwl9CisKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tT3JtQ29sdW1uTWFwcGluZyhPcm1Db2x1bW5NYXBwaW5nIG9sZE1hcHBpbmcpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZUZyb21Pcm1Db2x1bW5NYXBwaW5nKG9sZE1hcHBpbmcpOworCQlnZXRDb2x1bW4oKS5pbml0aWFsaXplRnJvbShvbGRNYXBwaW5nLmdldENvbHVtbigpKTsKKwl9CisKKwlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgeworCQlyZXR1cm4gMjA7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmcoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBPcm1Db2x1bW4gZ2V0Q29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy5jb2x1bW47CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsJCQorCQlyZXR1cm4gZ2V0TmFtZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKKwkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOworCX0KKworCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKKwkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFNwZWNpZmllZEZldGNoXyh0aGlzLmdldFJlc291cmNlRmV0Y2goKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkT3B0aW9uYWxfKHRoaXMuZ2V0UmVzb3VyY2VPcHRpb25hbCgpKTsKKwkJdGhpcy5jb2x1bW4udXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKSk7CisJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGdldFJlc291cmNlQ29udmVydGVyVHlwZSgpLCBnZXRTcGVjaWZlZENvbnZlcnRlclR5cGUoKSkpIHsKKwkJCWdldFNwZWNpZmllZENvbnZlcnRlcigpLnVwZGF0ZSgpOworCQl9CisJCWVsc2UgeworCQkJc2V0U3BlY2lmaWVkQ29udmVydGVyKGJ1aWxkU3BlY2lmaWVkQ29udmVydGVyKGdldFJlc291cmNlQ29udmVydGVyVHlwZSgpKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIEJvb2xlYW4gZ2V0UmVzb3VyY2VPcHRpb25hbCgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLmdldE9wdGlvbmFsKCk7CisJfQorCQorCXByb3RlY3RlZCBGZXRjaFR5cGUgZ2V0UmVzb3VyY2VGZXRjaCgpIHsKKwkJcmV0dXJuIEZldGNoVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5nZXRGZXRjaCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybUNvbnZlcnRlciBidWlsZFNwZWNpZmllZENvbnZlcnRlcihTdHJpbmcgY29udmVydGVyVHlwZSkgeworCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChjb252ZXJ0ZXJUeXBlLCBDb252ZXJ0ZXIuRU5VTUVSQVRFRF9DT05WRVJURVIpKSB7CisJCQlyZXR1cm4gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1FbnVtZXJhdGVkQ29udmVydGVyKHRoaXMsIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwkJfQorCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChjb252ZXJ0ZXJUeXBlLCBDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKSkgeworCQkJcmV0dXJuIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtVGVtcG9yYWxDb252ZXJ0ZXIodGhpcywgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCQl9CisJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGNvbnZlcnRlclR5cGUsIENvbnZlcnRlci5MT0JfQ09OVkVSVEVSKSkgeworCQkJcmV0dXJuIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtTG9iQ29udmVydGVyKHRoaXMsIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKSB7CisJCWlmICh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5nZXRFbnVtZXJhdGVkKCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIENvbnZlcnRlci5FTlVNRVJBVEVEX0NPTlZFUlRFUjsKKwkJfQorCQllbHNlIGlmICh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5nZXRUZW1wb3JhbCgpICE9IG51bGwpIHsKKwkJCXJldHVybiBDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSOworCQl9CisJCWVsc2UgaWYgKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLmlzTG9iKCkpIHsKKwkJCXJldHVybiBDb252ZXJ0ZXIuTE9CX0NPTlZFUlRFUjsKKwkJfQorCQkKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFRvUmVzb3VyY2VNb2RlbChBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0QmFzaWNzKCkuYWRkKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKKwkJcmVzb3VyY2VBdHRyaWJ1dGVzLmdldEJhc2ljcygpLnJlbW92ZSh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCQorCS8vKioqKioqKioqKioqKioqKiogWG1sQ29sdW1uLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgWG1sQ29sdW1uIGdldFJlc291cmNlQ29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29sdW1uKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlQ29sdW1uKCkgeworCQl0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZUNvbHVtbigpIHsKKwkJdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuc2V0Q29sdW1uKG51bGwpOworCX0KKwkKKwkvLyAqKioqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQlpZiAodGhpcy5zaG91bGRWYWxpZGF0ZUFnYWluc3REYXRhYmFzZSgpKSB7CisJCQl0aGlzLnZhbGlkYXRlQ29sdW1uKG1lc3NhZ2VzKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbHVtbihMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlTdHJpbmcgdGFibGVOYW1lID0gdGhpcy5jb2x1bW4uZ2V0VGFibGUoKTsKKwkJaWYgKHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKSkgeworCQkJaWYgKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpLCB0YWJsZU5hbWUsIHRoaXMuY29sdW1uLmdldE5hbWUoKX0sCisJCQkJCQl0aGlzLmNvbHVtbiwgCisJCQkJCQl0aGlzLmNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZSgpCisJCQkJCSkKKwkJCQkpOworCQkJfSBlbHNlIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7dGFibGVOYW1lLCB0aGlzLmNvbHVtbi5nZXROYW1lKCl9LCAKKwkJCQkJCXRoaXMuY29sdW1uLCAKKwkJCQkJCXRoaXMuY29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKCkKKwkJCQkJKQorCQkJCSk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmICggISB0aGlzLmNvbHVtbi5pc1Jlc29sdmVkKCkgJiYgdGhpcy5jb2x1bW4uZ2V0RGJUYWJsZSgpICE9IG51bGwpIHsKKwkJCWlmICh0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpLCB0aGlzLmNvbHVtbi5nZXROYW1lKCl9LCAKKwkJCQkJCXRoaXMuY29sdW1uLCAKKwkJCQkJCXRoaXMuY29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoKQorCQkJCQkpCisJCQkJKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5jb2x1bW4uZ2V0TmFtZSgpfSwgCisJCQkJCQl0aGlzLmNvbHVtbiwgCisJCQkJCQl0aGlzLmNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKCkKKwkJCQkJKQorCQkJCSk7CisJCQl9CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUVtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUVtYmVkZGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGM0N2UzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRW1iZWRkYWJsZS5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUVtYmVkZGFibGUgZXh0ZW5kcyBBYnN0cmFjdE9ybVR5cGVNYXBwaW5nPFhtbEVtYmVkZGFibGU+IGltcGxlbWVudHMgT3JtRW1iZWRkYWJsZQoreworCXByb3RlY3RlZCBBYnN0cmFjdE9ybUVtYmVkZGFibGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxFbWJlZGRhYmxlIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZOworCX0KKworCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7CisJCXJldHVybiAyOworCX0KKwkKKwlwdWJsaWMgSmF2YUVtYmVkZGFibGUgZ2V0SmF2YUVtYmVkZGFibGUoKSB7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSB0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlpZiAoamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwgJiYgamF2YVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpIHsKKwkJCXJldHVybiAoSmF2YUVtYmVkZGFibGUpIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVGhpcyBjaGVja3MgbWV0YURhdGFDb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nIHRoZSBKYXZhRW1iZWRkYWJsZS4KKwkgKiBBcyBmYXIgYXMgZGVmYXVsdHMgYXJlIGNvbmNlcm5lZCwgaWYgbWV0YWRhdGFDb21wbGV0ZSBpcyB0cnVlLCB0aGUgSmF2YUVtYmVkZGFibGUgaXMgaWdub3JlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgSmF2YUVtYmVkZGFibGUgZ2V0SmF2YUVtYmVkZGFibGVGb3JEZWZhdWx0cygpIHsKKwkJaWYgKGlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gZ2V0SmF2YUVtYmVkZGFibGUoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlQWdhaW5zdERhdGFiYXNlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB7CisJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7CisJfQorCisJcHVibGljIEl0ZXJhdG9yPFRhYmxlPiBhc3NvY2lhdGVkVGFibGVzKCkgeworCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOworCX0KKworCXB1YmxpYyBJdGVyYXRvcjxUYWJsZT4gYXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpIHsKKwkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKKwkJZW50aXR5TWFwcGluZ3MuZ2V0RW1iZWRkYWJsZXMoKS5hZGQodGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKKwkJZW50aXR5TWFwcGluZ3MuZ2V0RW1iZWRkYWJsZXMoKS5yZW1vdmUodGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUVtYmVkZGVkTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzgyMjYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FbWJlZGRlZE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDIzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7CisKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtRW1iZWRkZWRNYXBwaW5nPFQgZXh0ZW5kcyBYbWxFbWJlZGRlZD4KKwlleHRlbmRzIEFic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZzxUPiAKKwlpbXBsZW1lbnRzIE9ybUVtYmVkZGVkTWFwcGluZzJfMAoreworCXByb3RlY3RlZCBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CisKKwlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1FbWJlZGRlZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFQgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyID0gCisJCQkoKE9ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeSkgZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkpLgorCQkJCWJ1aWxkT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcih0aGlzLCBuZXcgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lck93bmVyKCksIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpLnVwZGF0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwb3N0VXBkYXRlKCkgeworCQlzdXBlci5wb3N0VXBkYXRlKCk7CisJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKS5wb3N0VXBkYXRlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFFbWJlZGRlZE1hcHBpbmcyXzAgZ2V0SmF2YUVtYmVkZGVkTWFwcGluZygpIHsKKwkJcmV0dXJuIChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBzdXBlci5nZXRKYXZhRW1iZWRkZWRNYXBwaW5nKCk7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgeworCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtRW1iZWRkZWRNYXBwaW5nKHRoaXMpOworCX0KKworCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7CisJCXJldHVybiA4MDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwoQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKKwkJcmVzb3VyY2VBdHRyaWJ1dGVzLmdldEVtYmVkZGVkcygpLmFkZCh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKKwkJcmVzb3VyY2VBdHRyaWJ1dGVzLmdldEVtYmVkZGVkcygpLnJlbW92ZSh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCQorCS8vb25seSBwdXR0aW5nIHRoaXMgaW4gRW1iZWRkZWRNYXBwaW5nIHNpbmNlIHJlbGF0aW9uc2hpcCBtYXBwaW5ncworCS8vZGVmaW5lZCB3aXRoaW4gYW4gZW1iZWRkZWQgaWQgY2xhc3MgYXJlIG5vdCBzdXBwb3J0ZWQgIGJ5IHRoZSAyLjAgc3BlYy4KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxNYXBwaW5nTmFtZXMoKSB7CisJCWlmIChnZXRKcGFQbGF0Zm9ybVZlcnNpb24oKS5pc0NvbXBhdGlibGVXaXRoSnBhVmVyc2lvbihKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzJfMCkpIHsKKwkJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPigKKwkJCQlnZXROYW1lKCksCisJCQkJZW1iZWRkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpCisJCQkpOworCQl9CisJCXJldHVybiBzdXBlci5hbGxNYXBwaW5nTmFtZXMoKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBlbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KAorCQkJbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4oCisJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZywgSXRlcmF0b3I8U3RyaW5nPj4odGhpcy5lbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ3MoKSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdHJhbnNmb3JtKEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgeworCQkJCQkJcmV0dXJuIG1hcHBpbmcuYWxsTWFwcGluZ05hbWVzKCk7CisJCQkJCX0KKwkJCQl9CisJCQkpCisJCSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgeworCQkJCXJldHVybiBnZXROYW1lKCkgKyAnLicgKyBuZXh0OworCQkJfQorCQl9OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBBdHRyaWJ1dGVNYXBwaW5nIHJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKFN0cmluZyBuYW1lKSB7CisJCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJQXR0cmlidXRlTWFwcGluZyByZXNvbHZlZE1hcHBpbmcgPSBzdXBlci5yZXNvbHZlQXR0cmlidXRlTWFwcGluZyhuYW1lKTsKKwkJaWYgKHJlc29sdmVkTWFwcGluZyAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzb2x2ZWRNYXBwaW5nOworCQl9CisJCWlmIChnZXRKcGFQbGF0Zm9ybVZlcnNpb24oKS5pc0NvbXBhdGlibGVXaXRoSnBhVmVyc2lvbihKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzJfMCkpIHsKKwkJCWludCBkb3RJbmRleCA9IG5hbWUuaW5kZXhPZignLicpOworCQkJaWYgKGRvdEluZGV4ICE9IC0xKSB7CisJCQkJaWYgKGdldE5hbWUoKS5lcXVhbHMobmFtZS5zdWJzdHJpbmcoMCwgZG90SW5kZXgpKSkgeworCQkJCQlmb3IgKEF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ3MoKSkpIHsKKwkJCQkJCXJlc29sdmVkTWFwcGluZyA9IGF0dHJpYnV0ZU1hcHBpbmcucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcobmFtZS5zdWJzdHJpbmcoZG90SW5kZXggKyAxKSk7CisJCQkJCQlpZiAocmVzb2x2ZWRNYXBwaW5nICE9IG51bGwpIHsKKwkJCQkJCQlyZXR1cm4gcmVzb2x2ZWRNYXBwaW5nOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVsYXRpb25zaGlwUmVmZXJlbmNlIHJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKwkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoZ2V0SnBhUGxhdGZvcm1WZXJzaW9uKCkuaXNDb21wYXRpYmxlV2l0aEpwYVZlcnNpb24oSnB0Q29yZVBsdWdpbi5KUEFfRkFDRVRfVkVSU0lPTl8yXzApKSB7CisJCQlpbnQgZG90SW5kZXggPSBhdHRyaWJ1dGVOYW1lLmluZGV4T2YoJy4nKTsKKwkJCWlmIChkb3RJbmRleCAhPSAtMSkgeworCQkJCWlmIChnZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZU5hbWUuc3Vic3RyaW5nKDAsIGRvdEluZGV4KSkpIHsKKwkJCQkJYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWUuc3Vic3RyaW5nKGRvdEluZGV4ICsgMSk7CisJCQkJCUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUgPSBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZU5hbWVkKGF0dHJpYnV0ZU5hbWUpOworCQkJCQlpZiAob3ZlcnJpZGUgIT0gbnVsbCAmJiAhb3ZlcnJpZGUuaXNWaXJ0dWFsKCkpIHsKKwkJCQkJCXJldHVybiBvdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwkJCQkJfQorCQkJCQlpZiAodGhpcy5nZXRFbWJlZGRhYmxlKCkgPT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQkJcmV0dXJuIHRoaXMuZ2V0RW1iZWRkYWJsZSgpLnJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoYXR0cmlidXRlTmFtZSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkgeworCQlyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworCX0KKworCXByb3RlY3RlZCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBnZXRKYXZhQXNzb2NpYXRpb25PdmVycmlkZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCWlmIChnZXRKYXZhRW1iZWRkZWRNYXBwaW5nKCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIGdldEphdmFFbWJlZGRlZE1hcHBpbmcoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZU5hbWVkKGF0dHJpYnV0ZU5hbWUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkKKwkvLyoqKioqKioqKioqKiogQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxSZWxhdGlvbnNoaXBNYXBwaW5nLCBTdHJpbmc+KHRoaXMuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShSZWxhdGlvbnNoaXBNYXBwaW5nIG92ZXJyaWRhYmxlQXNzb2NpYXRpb24pIHsKKwkJCQlyZXR1cm4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbi5nZXROYW1lKCk7CisJCQl9CisJCX07CisJfQorCisJcHVibGljIEl0ZXJhdG9yPFJlbGF0aW9uc2hpcE1hcHBpbmc+IGFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkgeworCQlpZiAodGhpcy5nZXRFbWJlZGRhYmxlKCkgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwkJfQorCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmcsIFJlbGF0aW9uc2hpcE1hcHBpbmc+KHRoaXMuZ2V0RW1iZWRkYWJsZSgpLmF0dHJpYnV0ZU1hcHBpbmdzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEF0dHJpYnV0ZU1hcHBpbmcgbykgeworCQkJCXJldHVybiBvLmlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmcoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkKKwkvLyoqKioqKioqKiogT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioJCisJCisJY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lck93bmVyIGltcGxlbWVudHMgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciB7CisJCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCkgeworCQkJcmV0dXJuIEFic3RyYWN0T3JtRW1iZWRkZWRNYXBwaW5nLnRoaXMuZ2V0RW1iZWRkYWJsZSgpOworCQl9CisJCQorCQlwdWJsaWMgT3JtVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gQWJzdHJhY3RPcm1FbWJlZGRlZE1hcHBpbmcudGhpcy5nZXRUeXBlTWFwcGluZygpOworCQl9CisKKwkJcHVibGljIFJlbGF0aW9uc2hpcFJlZmVyZW5jZSByZXNvbHZlUmVsYXRpb25zaGlwUmVmZXJlbmNlKFN0cmluZyBhc3NvY2lhdGlvbk92ZXJyaWRlTmFtZSkgeworCQkJUmVsYXRpb25zaGlwUmVmZXJlbmNlIHJlbGF0aW9uc2hpcFJlZmVyZW5jZSA9IG51bGw7CisJCQlpZiAoZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpICYmICFnZXRUeXBlTWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBnZXRKYXZhQXNzb2NpYXRpb25PdmVycmlkZU5hbWVkKGFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lKTsKKwkJCQlpZiAoamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgIT0gbnVsbCAmJiAhamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpIHsKKwkJCQkJcmV0dXJuIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOworCQkJCX0KKwkJCX0KKwkJCVR5cGVNYXBwaW5nIG92ZXJyaWRhYmxlVHlwZU1hcHBpbmcgPSBnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCk7CisJCQlpZiAob3ZlcnJpZGFibGVUeXBlTWFwcGluZyAhPSBudWxsKSB7CisJCQkJZm9yIChUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvdmVycmlkYWJsZVR5cGVNYXBwaW5nLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpKSB7CisJCQkJCXJlbGF0aW9uc2hpcFJlZmVyZW5jZSA9IHR5cGVNYXBwaW5nLnJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoYXNzb2NpYXRpb25PdmVycmlkZU5hbWUpOworCQkJCQlpZiAocmVsYXRpb25zaGlwUmVmZXJlbmNlICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZWxhdGlvbnNoaXBSZWZlcmVuY2U7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmVsYXRpb25zaGlwUmVmZXJlbmNlOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGViMDg3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRW50aXR5LmphdmEKQEAgLTAsMCArMSwxODg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm1WYXJpYXRpb24uU3VwcG9ydGVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2VKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybURpc2NyaW1pbmF0b3JDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUdlbmVyYXRvckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZWNvbmRhcnlUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUNhY2hlYWJsZUhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1FbnRpdHkKKwlleHRlbmRzIEFic3RyYWN0T3JtVHlwZU1hcHBpbmc8WG1sRW50aXR5PgorCWltcGxlbWVudHMgT3JtRW50aXR5LCBPcm1DYWNoZWFibGVIb2xkZXIyXzAKK3sKKwlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE5hbWU7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lOworCisJcHJvdGVjdGVkIFN0cmluZyBpZENsYXNzOworCisJcHJvdGVjdGVkIGZpbmFsIE9ybVRhYmxlIHRhYmxlOworCisJcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQ7CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gdGFibGVJc1VuZGVmaW5lZDsKKworCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybVNlY29uZGFyeVRhYmxlPiBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXM7CisJCisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtU2Vjb25kYXJ5VGFibGU+IHZpcnR1YWxTZWNvbmRhcnlUYWJsZXM7CisJCisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uczsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uczsKKworCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneTsKKwkKKwlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIGRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OworCisJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOworCisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWU7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQ7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZDsKKworCXByb3RlY3RlZCBmaW5hbCBPcm1EaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW47CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkOworCQorCXByb3RlY3RlZCBib29sZWFuIGRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZDsKKworCXByb3RlY3RlZCBmaW5hbCBPcm1HZW5lcmF0b3JDb250YWluZXIgZ2VuZXJhdG9yQ29udGFpbmVyOworCisJcHJvdGVjdGVkIGZpbmFsIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOworCQorCXByb3RlY3RlZCBmaW5hbCBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CisKKwlwcm90ZWN0ZWQgZmluYWwgT3JtUXVlcnlDb250YWluZXIgcXVlcnlDb250YWluZXI7CisJCisJcHJvdGVjdGVkIEVudGl0eSByb290RW50aXR5OworCQorCXByb3RlY3RlZCBBYnN0cmFjdE9ybUVudGl0eShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFhtbEVudGl0eSByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCQl0aGlzLnRhYmxlID0gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1UYWJsZSh0aGlzKTsKKwkJdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMgPSBuZXcgQXJyYXlMaXN0PE9ybVNlY29uZGFyeVRhYmxlPigpOworCQl0aGlzLnZpcnR1YWxTZWNvbmRhcnlUYWJsZXMgPSBuZXcgQXJyYXlMaXN0PE9ybVNlY29uZGFyeVRhYmxlPigpOworCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4gPSBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKKwkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPigpOworCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPigpOworCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgPSBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJdGhpcy5xdWVyeUNvbnRhaW5lciA9IHRoaXMuYnVpbGRRdWVyeUNvbnRhaW5lcigpOworCQl0aGlzLmdlbmVyYXRvckNvbnRhaW5lciA9IHRoaXMuYnVpbGRHZW5lcmF0b3JDb250YWluZXIoKTsKKwkJdGhpcy5zcGVjaWZpZWROYW1lID0gdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLmdldE5hbWUoKTsKKwkJdGhpcy5kZWZhdWx0TmFtZSA9IHRoaXMuYnVpbGREZWZhdWx0TmFtZSgpOworCQl0aGlzLnJvb3RFbnRpdHkgPSB0aGlzLmNhbGN1bGF0ZVJvb3RFbnRpdHkoKTsKKwkJdGhpcy5pbml0aWFsaXplSW5oZXJpdGFuY2UodGhpcy5nZXRSZXNvdXJjZUluaGVyaXRhbmNlKCkpOworCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpOworCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZCA9IHRoaXMuYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKTsKKwkJdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uLmluaXRpYWxpemUodGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nKTsgLy9UT0RPIHBhc3MgaW4gdG8gY29uc3RydWN0b3IKKwkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkKCk7CisJCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQgPSB0aGlzLmJ1aWxkRGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKTsKKwkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCk7CisJCXRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSA9IHRoaXMuYnVpbGREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCk7CisJCXRoaXMuc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkVGFibGVJc0FsbG93ZWQoKTsKKwkJdGhpcy50YWJsZUlzVW5kZWZpbmVkID0gdGhpcy5idWlsZFRhYmxlSXNVbmRlZmluZWQoKTsKKwkJdGhpcy50YWJsZS5pbml0aWFsaXplKHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZyk7Ly9UT0RPIHBhc3MgaW4gdG8gY29uc3RydWN0b3IKKwkJdGhpcy5pbml0aWFsaXplU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7CisJCXRoaXMuaW5pdGlhbGl6ZVZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKTsKKwkJdGhpcy5pbml0aWFsaXplU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCXRoaXMuaW5pdGlhbGl6ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkJdGhpcy5pbml0aWFsaXplSWRDbGFzcyh0aGlzLmdldFJlc291cmNlSWRDbGFzcygpKTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybURpc2NyaW1pbmF0b3JDb2x1bW4gYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uKCkgeworCQlyZXR1cm4gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1EaXNjcmltaW5hdG9yQ29sdW1uKHRoaXMsIGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbk93bmVyKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgT3JtRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lciBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcigpIHsKKwkJcmV0dXJuIG5ldyBPcm1EaXNjcmltaW5hdG9yQ29sdW1uLk93bmVyKCl7CisJCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgeworCQkJCXJldHVybiBBYnN0cmFjdE9ybUVudGl0eS50aGlzLmdldERiVGFibGUodGFibGVOYW1lKTsKKwkJCX0KKworCQkJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgeworCQkJCXJldHVybiBBYnN0cmFjdE9ybUVudGl0eS50aGlzOworCQkJfQorCQkJCisJCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgeworCQkJCWlmIChnZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpID09IG51bGwpIHsKKwkJCQkJaWYgKCFpc01ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJCQkJaWYgKGdldEphdmFFbnRpdHkoKSAhPSBudWxsICYmIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpICE9IG51bGwpIHsKKwkJCQkJCQlyZXR1cm4gZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIGlzRGVzY2VuZGFudCgpID8KKwkJCQkJCWdldFJvb3RFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpCisJCQkJCToKKwkJCQkJCWlzVGFibGVQZXJDbGFzcygpID8gCisJCQkJCQkJbnVsbAorCQkJCQkJOgorCQkJCQkJCURpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9OQU1FOworCQkJfQorCQkJCisJCQlwdWJsaWMgaW50IGdldERlZmF1bHRMZW5ndGgoKSB7CisJCQkJaWYgKGdldFJlc291cmNlVHlwZU1hcHBpbmcoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkgPT0gbnVsbCkgeworCQkJCQlpZiAoIWlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQkJCQlpZiAoZ2V0SmF2YUVudGl0eSgpICE9IG51bGwgJiYgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSAhPSBudWxsKSB7CisJCQkJCQkJcmV0dXJuIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkuaW50VmFsdWUoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gaXNEZXNjZW5kYW50KCkgPworCQkJCQlnZXRSb290RW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpCisJCQkJOgorCQkJCQlpc1RhYmxlUGVyQ2xhc3MoKSA/IAorCQkJCQkJMC8vVE9ETyB0aGluayBpIHdhbnQgdG8gcmV0dXJuIG51bGwgaGVyZQorCQkJCQk6CisJCQkJCQlEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RIOworCQkJfQorCQkJCisJCQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkgeworCQkJCWlmIChnZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpID09IG51bGwpIHsKKwkJCQkJaWYgKCFpc01ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJCQkJaWYgKGdldEphdmFFbnRpdHkoKSAhPSBudWxsICYmIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSAhPSBudWxsKSB7CisJCQkJCQkJcmV0dXJuIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gaXNEZXNjZW5kYW50KCkgPworCQkJCQlnZXRSb290RW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkKKwkJCQk6CisJCQkJCWlzVGFibGVQZXJDbGFzcygpID8gCisJCQkJCQludWxsCisJCQkJCToKKwkJCQkJCURpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEU7CisJCQl9CisJCQkKKwkJCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkgeworCQlyZXR1cm4gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKHRoaXMsIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyT3duZXIoKSwgdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nKTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKSB7CisJCXJldHVybiBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKHRoaXMsIG5ldyBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyKCksIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZyk7CisJfQorCisJcHJvdGVjdGVkIE9ybUdlbmVyYXRvckNvbnRhaW5lciBidWlsZEdlbmVyYXRvckNvbnRhaW5lcigpIHsKKwkJcmV0dXJuIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtR2VuZXJhdG9yQ29udGFpbmVyKHRoaXMsIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZyk7CisJfQorCisJcHJvdGVjdGVkIE9ybVF1ZXJ5Q29udGFpbmVyIGJ1aWxkUXVlcnlDb250YWluZXIoKSB7CisJCXJldHVybiBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVF1ZXJ5Q29udGFpbmVyKHRoaXMsIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZyk7CisJfQorCQorCisJLy8gKioqKioqKioqKioqKioqKioqKiBUeXBlTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWTsKKwl9CQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRQcmltYXJ5VGFibGVOYW1lKCkgeworCQlyZXR1cm4gdGhpcy50YWJsZS5nZXROYW1lKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0UHJpbWFyeURiVGFibGUoKSB7CisJCXJldHVybiB0aGlzLnRhYmxlLmdldERiVGFibGUoKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGVbXSBFTVBUWV9EQl9UQUJMRV9BUlJBWSA9IG5ldyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGVbMF07CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgeworCQkvLyB0aGUgSlBBIHBsYXRmb3JtIHNlYXJjaGVzIGRhdGFiYXNlIG9iamVjdHMgZm9yIHVzCisJCXJldHVybiB0aGlzLmdldERhdGFTb3VyY2UoKS5zZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIoCisJCQkJCQlBcnJheVRvb2xzLmFycmF5KHRoaXMuYXNzb2NpYXRlZERiVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCksIEVNUFRZX0RCX1RBQkxFX0FSUkFZKSwKKwkJCQkJCXRhYmxlTmFtZQorCQkJCQkpOworCX0KKworCXByaXZhdGUgSXRlcmF0b3I8b3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlPiBhc3NvY2lhdGVkRGJUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8b3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlLCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU+KHRoaXMuYXNzb2NpYXRlZERiVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkXygpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgdCkgeworCQkJCXJldHVybiB0ICE9IG51bGw7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBJdGVyYXRvcjxvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU+IGFzc29jaWF0ZWREYlRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZF8oKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUYWJsZSwgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlPih0aGlzLmFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIHRyYW5zZm9ybShUYWJsZSB0KSB7CisJCQkJcmV0dXJuIHQuZ2V0RGJUYWJsZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU2NoZW1hIGdldERiU2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy50YWJsZS5nZXREYlNjaGVtYSgpOworCX0KKwkKKwlwdWJsaWMgSmF2YUVudGl0eSBnZXRKYXZhRW50aXR5KCkgeworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gdGhpcy5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJaWYgKGphdmFQZXJzaXN0ZW50VHlwZSAhPSBudWxsICYmIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nS2V5KCkgPT0gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpIHsKKwkJCXJldHVybiAoSmF2YUVudGl0eSkgamF2YVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNoZWNrcyBtZXRhRGF0YUNvbXBsZXRlIGJlZm9yZSByZXR1cm5pbmcgdGhlIEphdmFFbnRpdHkuCisJICogQXMgZmFyIGFzIGRlZmF1bHRzIGFyZSBjb25jZXJuZWQsIGlmIG1ldGFkYXRhQ29tcGxldGUgaXMgdHJ1ZSwgdGhlIEphdmFFbnRpdHkgaXMgaWdub3JlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgSmF2YUVudGl0eSBnZXRKYXZhRW50aXR5Rm9yRGVmYXVsdHMoKSB7CisJCWlmIChpc01ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGdldEphdmFFbnRpdHkoKTsKKwl9CisJCisJCisJLy8qKioqKioqKioqKioqKioqKiogT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCkgeworCQlQZXJzaXN0ZW50VHlwZSBzdXBlclBlcnNpc3RlbnRUeXBlID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCk7CisJCXJldHVybiBzdXBlclBlcnNpc3RlbnRUeXBlID09IG51bGwgPyBudWxsIDogc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJfQorCisJcHVibGljIE9ybVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgeworCQlyZXR1cm4gdGhpczsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVPdmVycmlkZSBnZXRKYXZhQXR0cmlidXRlT3ZlcnJpZGVOYW1lZChTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworCQlpZiAoZ2V0SmF2YUVudGl0eSgpICE9IG51bGwpIHsKKwkJCXJldHVybiBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKGF0dHJpYnV0ZU5hbWUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVsYXRpb25zaGlwUmVmZXJlbmNlIHJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoU3RyaW5nIG5hbWUpIHsKKwkJaWYgKGdldEpwYVBsYXRmb3JtVmVyc2lvbigpLmlzQ29tcGF0aWJsZVdpdGhKcGFWZXJzaW9uKEpwdENvcmVQbHVnaW4uSlBBX0ZBQ0VUX1ZFUlNJT05fMl8wKSkgeworCQkJaW50IGRvdEluZGV4ID0gbmFtZS5pbmRleE9mKCcuJyk7CisJCQlpZiAoZG90SW5kZXggIT0gLTEpIHsKKwkJCQlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlID0gZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lZChuYW1lLnN1YnN0cmluZyhkb3RJbmRleCArIDEpKTsKKwkJCQlpZiAob3ZlcnJpZGUgIT0gbnVsbCAmJiAhb3ZlcnJpZGUuaXNWaXJ0dWFsKCkpIHsKKwkJCQkJcmV0dXJuIG92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIucmVzb2x2ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShuYW1lKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGdldEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlTmFtZWQoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKwkJaWYgKGdldEphdmFFbnRpdHkoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlTmFtZWQoYXR0cmlidXRlTmFtZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQkKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0TmFtZSgpIDogdGhpcy5nZXRTcGVjaWZpZWROYW1lKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKKwkJU3RyaW5nIG9sZFNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWU7CisJCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5ld1NwZWNpZmllZE5hbWU7CisJCXRoaXMucmVzb3VyY2VUeXBlTWFwcGluZy5zZXROYW1lKG5ld1NwZWNpZmllZE5hbWUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWROYW1lLCBuZXdTcGVjaWZpZWROYW1lKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0TmFtZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TmFtZShTdHJpbmcgbmV3RGVmYXVsdE5hbWUpIHsKKwkJU3RyaW5nIG9sZERlZmF1bHROYW1lID0gdGhpcy5kZWZhdWx0TmFtZTsKKwkJdGhpcy5kZWZhdWx0TmFtZSA9IG5ld0RlZmF1bHROYW1lOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTkFNRV9QUk9QRVJUWSwgb2xkRGVmYXVsdE5hbWUsIG5ld0RlZmF1bHROYW1lKTsKKwl9CisKKwlwdWJsaWMgT3JtVGFibGUgZ2V0VGFibGUoKSB7CisJCXJldHVybiB0aGlzLnRhYmxlOworCX0KKworCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcygpIHsKKwkJaWYgKHNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSA+IDApIHsKKwkJCXJldHVybiBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKKwkJfQorCQlyZXR1cm4gdmlydHVhbFNlY29uZGFyeVRhYmxlcygpOworCX0KKworCXB1YmxpYyBpbnQgc2Vjb25kYXJ5VGFibGVzU2l6ZSgpIHsKKwkJaWYgKHNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSA+IDApIHsKKwkJCXJldHVybiBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCk7CisJCX0KKwkJcmV0dXJuIHZpcnR1YWxTZWNvbmRhcnlUYWJsZXNTaXplKCk7CisJfQorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+KHRoaXMudmlydHVhbFNlY29uZGFyeVRhYmxlcyk7CisJfQorCisJcHVibGljIGludCB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFNlY29uZGFyeVRhYmxlcy5zaXplKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFZpcnR1YWxTZWNvbmRhcnlUYWJsZShPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgeworCQlhZGRJdGVtVG9MaXN0KHNlY29uZGFyeVRhYmxlLCB0aGlzLnZpcnR1YWxTZWNvbmRhcnlUYWJsZXMsIE9ybUVudGl0eS5WSVJUVUFMX1NFQ09OREFSWV9UQUJMRVNfTElTVCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVZpcnR1YWxTZWNvbmRhcnlUYWJsZShPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgeworCQlyZW1vdmVJdGVtRnJvbUxpc3Qoc2Vjb25kYXJ5VGFibGUsIHRoaXMudmlydHVhbFNlY29uZGFyeVRhYmxlcywgT3JtRW50aXR5LlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFU19MSVNUKTsKKwl9CisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVNlY29uZGFyeVRhYmxlPiBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+KHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKTsKKwl9CisKKwlwdWJsaWMgaW50IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5zaXplKCk7CisJfQorCQorCXB1YmxpYyBPcm1TZWNvbmRhcnlUYWJsZSBhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgaW5kZXgpIHsKKwkJaWYgKCFzZWNvbmRhcnlUYWJsZXNEZWZpbmVkSW5YbWwoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVmlydHVhbCBzZWNvbmRhcnkgdGFibGVzIGV4aXN0LCBtdXN0IGZpcnN0IGNhbGwgc2V0U2Vjb25kYXJ5VGFibGVzRGVmaW5lZEluWG1sKHRydWUpIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2Vjb25kYXJ5VGFibGUoKTsKKwkJT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSAgYnVpbGRTZWNvbmRhcnlUYWJsZShzZWNvbmRhcnlUYWJsZVJlc291cmNlKTsKKwkJdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMuYWRkKGluZGV4LCBzZWNvbmRhcnlUYWJsZSk7CisJCXRoaXMucmVzb3VyY2VUeXBlTWFwcGluZy5nZXRTZWNvbmRhcnlUYWJsZXMoKS5hZGQoaW5kZXgsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UpOworCQlmaXJlSXRlbUFkZGVkKEVudGl0eS5TUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNULCBpbmRleCwgc2Vjb25kYXJ5VGFibGUpOworCQlyZXR1cm4gc2Vjb25kYXJ5VGFibGU7CisJfQorCisJcHVibGljIE9ybVNlY29uZGFyeVRhYmxlIGFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSh0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5zaXplKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgaW5kZXgsIE9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7CisJCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHNlY29uZGFyeVRhYmxlLCB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcywgRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgeworCQl0aGlzLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLnNpemUoKSwgc2Vjb25kYXJ5VGFibGUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgeworCQl0aGlzLnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLmluZGV4T2Yoc2Vjb25kYXJ5VGFibGUpKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW50IGluZGV4KSB7CisJCU9ybVNlY29uZGFyeVRhYmxlIHJlbW92ZWRTZWNvbmRhcnlUYWJsZSA9IHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLnJlbW92ZShpbmRleCk7CisJCXRoaXMucmVzb3VyY2VUeXBlTWFwcGluZy5nZXRTZWNvbmRhcnlUYWJsZXMoKS5yZW1vdmUoaW5kZXgpOworCQlmaXJlSXRlbVJlbW92ZWQoRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QsIGluZGV4LCByZW1vdmVkU2Vjb25kYXJ5VGFibGUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZV8oT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KHNlY29uZGFyeVRhYmxlLCB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcywgRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCXRoaXMucmVzb3VyY2VUeXBlTWFwcGluZy5nZXRTZWNvbmRhcnlUYWJsZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCWZpcmVJdGVtTW92ZWQoRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY29udGFpbnNTZWNvbmRhcnlUYWJsZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gY29udGFpbnNTZWNvbmRhcnlUYWJsZShuYW1lLCBzZWNvbmRhcnlUYWJsZXMoKSk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGNvbnRhaW5zU2Vjb25kYXJ5VGFibGUobmFtZSwgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZpcnR1YWxTZWNvbmRhcnlUYWJsZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gY29udGFpbnNTZWNvbmRhcnlUYWJsZShuYW1lLCB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZpcnR1YWxTZWNvbmRhcnlUYWJsZShPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzLmNvbnRhaW5zKHNlY29uZGFyeVRhYmxlKTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc1NlY29uZGFyeVRhYmxlKFN0cmluZyBuYW1lLCBMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcykgeworCQlmb3IgKE9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHNlY29uZGFyeVRhYmxlcykpIHsKKwkJCVN0cmluZyBzZWNvbmRhcnlUYWJsZU5hbWUgPSBzZWNvbmRhcnlUYWJsZS5nZXROYW1lKCk7CisJCQlpZiAoc2Vjb25kYXJ5VGFibGVOYW1lICE9IG51bGwgJiYgc2Vjb25kYXJ5VGFibGVOYW1lLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBzZWNvbmRhcnlUYWJsZXNEZWZpbmVkSW5YbWwoKSB7CisJCXJldHVybiB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpID09IDA7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNlY29uZGFyeVRhYmxlc0RlZmluZWRJblhtbChib29sZWFuIGRlZmluZUluWG1sKSB7CisJCWlmIChkZWZpbmVJblhtbCA9PSBzZWNvbmRhcnlUYWJsZXNEZWZpbmVkSW5YbWwoKSkgeworCQkJcmV0dXJuOworCQl9CisJCWlmIChkZWZpbmVJblhtbCkgeworCQkJc3BlY2lmeVNlY29uZGFyeVRhYmxlc0luWG1sKCk7CisJCX0KKwkJZWxzZSB7CisJCQlyZW1vdmVTZWNvbmRhcnlUYWJsZXNGcm9tWG1sKCk7CisJCX0KKwl9CisJCisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIHRha2UgYWxsIHRoZSBqYXZhIHNlY29uZGFyeSB0YWJsZXMgYW5kIHNwZWNpZnkgdGhlbSBpbiB0aGUgeG1sLiAgWW91IG11c3QKKwkgKiB1c2Ugc2V0U2Vjb25kYXJ5VGFibGVzRGVmaW5lZEluWG1sKGJvb2xlYW4pIGJlZm9yZSBjYWxsaW5nIGFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCkuCisJICogCisJICogWWVzIHRoaXMgY29kZSBsb29rcyBvZGQsIGJ1dCBiZSBjYXJlZnVsIG1ha2luZyBjaGFuZ2VzIHRvIGl0CisJICovCisJcHJvdGVjdGVkIHZvaWQgc3BlY2lmeVNlY29uZGFyeVRhYmxlc0luWG1sKCkgeworCQlpZiAodmlydHVhbFNlY29uZGFyeVRhYmxlc1NpemUoKSAhPSAwKSB7CisJCQlMaXN0PE9ybVNlY29uZGFyeVRhYmxlPiB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzMSA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMudmlydHVhbFNlY29uZGFyeVRhYmxlcygpKTsKKwkJCUxpc3Q8T3JtU2Vjb25kYXJ5VGFibGU+IHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMyID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkpOworCQkJLy9yZW1vdmUgYWxsIHRoZSB2aXJ0dWFsIHNlY29uZGFyeSB0YWJsZXMgd2l0aG91dCBmaXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbi4KKwkJCWZvciAoT3JtU2Vjb25kYXJ5VGFibGUgdmlydHVhbFNlY29uZGFyeVRhYmxlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKSkpIHsKKwkJCQl0aGlzLnZpcnR1YWxTZWNvbmRhcnlUYWJsZXMucmVtb3ZlKHZpcnR1YWxTZWNvbmRhcnlUYWJsZSk7CQkJCQorCQkJfQorCQkJLy9hZGQgc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZXMgZm9yIGVhY2ggdmlydHVhbCBzZWNvbmRhcnkgdGFibGUuIElmIHRoZSB2aXJ0dWFsIHNlY29uZGFyeSB0YWJsZXMKKwkJCS8vYXJlIG5vdCByZW1vdmVkIGZpcnN0LCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIGFkZGluZyB0aGUgZmlyc3Qgc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZS4KKwkJCS8vVGhpcyBzY3Jld3MgdXAgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gdG8gdGhlIFVJLCBzaW5jZSB0aGF0IGNoYW5nZSBub3RpZmljYXRpb24gaXMgaW4gYSBkaWZmZXJlbnQgdGhyZWFkCisJCQlmb3IgKE9ybVNlY29uZGFyeVRhYmxlIHZpcnR1YWxTZWNvbmRhcnlUYWJsZSA6IHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMyKSB7CisJCQkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlKCk7CisJCQkJT3JtU2Vjb25kYXJ5VGFibGUgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUgPSAgYnVpbGRTZWNvbmRhcnlUYWJsZShzZWNvbmRhcnlUYWJsZVJlc291cmNlKTsKKwkJCQl0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5hZGQoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUpOworCQkJCXRoaXMucmVzb3VyY2VUeXBlTWFwcGluZy5nZXRTZWNvbmRhcnlUYWJsZXMoKS5hZGQoc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSk7CisJCQkJc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUuaW5pdGlhbGl6ZUZyb20odmlydHVhbFNlY29uZGFyeVRhYmxlKTsKKwkJCX0KKwkJCS8vZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGF0IHRoZSBlbmQKKwkJCWZpcmVJdGVtc1JlbW92ZWQoT3JtRW50aXR5LlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFU19MSVNULCAwLCB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzMSk7CisJCQlmaXJlSXRlbXNBZGRlZChFbnRpdHkuU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCwgMCwgdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMpOwkJCisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2Vjb25kYXJ5VGFibGVzRnJvbVhtbCgpIHsKKwkJaWYgKHNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSAhPSAwKSB7CisJCQlMaXN0PE9ybVNlY29uZGFyeVRhYmxlPiBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNDb3B5ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKSk7CisJCQlmb3IgKE9ybVNlY29uZGFyeVRhYmxlIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpKSkgeworCQkJCWludCBpbmRleCA9IHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLmluZGV4T2Yoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUpOworCQkJCXRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLnJlbW92ZShzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSk7CisJCQkJaWYgKHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLnNpemUoKSA9PSAwKSB7CisJCQkJCWluaXRpYWxpemVWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCk7CisJCQkJfQorCQkJCXRoaXMucmVzb3VyY2VUeXBlTWFwcGluZy5nZXRTZWNvbmRhcnlUYWJsZXMoKS5yZW1vdmUoaW5kZXgpOworCQkJfQorCQkJZmlyZUl0ZW1zUmVtb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCwgMCwgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzQ29weSk7CisJCQlpZiAodGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzLnNpemUoKSAhPSAwKSB7CisJCQkJZmlyZUl0ZW1zQWRkZWQoT3JtRW50aXR5LlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFU19MSVNULCAwLCB0aGlzLnZpcnR1YWxTZWNvbmRhcnlUYWJsZXMpOworCQkJfQorCQl9CisJfQorCQorCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHRhYmxlTmFtZXMoSXRlcmF0b3I8VGFibGU+IHRhYmxlcykgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VGFibGUsIFN0cmluZz4odGFibGVzKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFRhYmxlIHQpIHsKKwkJCQlyZXR1cm4gdC5nZXROYW1lKCk7CisJCQl9CisJCX07CisJfQorCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB7CisJCXJldHVybiB0aGlzLm5vbk51bGxUYWJsZU5hbWVzKHRoaXMuYXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBub25OdWxsVGFibGVOYW1lcyhJdGVyYXRvcjxUYWJsZT4gdGFibGVzKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMudGFibGVOYW1lcyh0YWJsZXMpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChTdHJpbmcgbykgeworCQkJCXJldHVybiBvICE9IG51bGw7CisJCQl9CisJCX07CisJfQorCisJcHVibGljIEl0ZXJhdG9yPFRhYmxlPiBhc3NvY2lhdGVkVGFibGVzKCkgeworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFRhYmxlPih0aGlzLnRhYmxlLCB0aGlzLnNlY29uZGFyeVRhYmxlcygpKTsKKwl9CisKKwlwdWJsaWMgSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8VGFibGU+KG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFR5cGVNYXBwaW5nLCBJdGVyYXRvcjxUYWJsZT4+KHRoaXMuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8VGFibGU+IHRyYW5zZm9ybShUeXBlTWFwcGluZyBtYXBwaW5nKSB7CisJCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxUYWJsZSwgVGFibGU+KG1hcHBpbmcuYXNzb2NpYXRlZFRhYmxlcygpKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoVGFibGUgbykgeworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQkvL1RPRE8KKwkJCQkJCS8vZmlsdGVyaW5nIHRoZXNlIG91dCBzbyBhcyB0byBhdm9pZCB0aGUgZHVwbGljYXRlIHRhYmxlLCByb290IGFuZCBjaGlsZHJlbiBzaGFyZSB0aGUgc2FtZSB0YWJsZQorCQkJCQkJLy9yZXR1cm4gIShvIGluc3RhbmNlb2YgU2luZ2xlVGFibGVJbmhlcml0YW5jZUNoaWxkVGFibGVJbXBsKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7CisJCXJldHVybiAhIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmFzc29jaWF0ZWRUYWJsZU5hbWVzSW5jbHVkaW5nSW5oZXJpdGVkKCksIHRhYmxlTmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlQWdhaW5zdERhdGFiYXNlKCkgeworCQlyZXR1cm4gc3VwZXIuc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKSAmJiAhIGlzQWJzdHJhY3RUYWJsZVBlckNsYXNzKCk7CisJfQorCisJcHVibGljIEluaGVyaXRhbmNlVHlwZSBnZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpIDogdGhpcy5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7CisJfQorCQorCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgbmV3SW5oZXJpdGFuY2VUeXBlKSB7CisJCUluaGVyaXRhbmNlVHlwZSBvbGRJbmhlcml0YW5jZVR5cGUgPSB0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OworCQl0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gbmV3SW5oZXJpdGFuY2VUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSU5IRVJJVEFOQ0VfU1RSQVRFR1lfUFJPUEVSVFksIG9sZEluaGVyaXRhbmNlVHlwZSwgbmV3SW5oZXJpdGFuY2VUeXBlKTsKKwl9CisJCisJcHVibGljIEluaGVyaXRhbmNlVHlwZSBnZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5OworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZSBuZXdJbmhlcml0YW5jZVR5cGUpIHsKKwkJSW5oZXJpdGFuY2VUeXBlIG9sZEluaGVyaXRhbmNlVHlwZSA9IHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneTsKKwkJdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gbmV3SW5oZXJpdGFuY2VUeXBlOworCQlpZiAob2xkSW5oZXJpdGFuY2VUeXBlICE9IG5ld0luaGVyaXRhbmNlVHlwZSkgeworCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VJbmhlcml0YW5jZSgpICE9IG51bGwpIHsKKwkJCQl0aGlzLmdldFJlc291cmNlSW5oZXJpdGFuY2UoKS5zZXRTdHJhdGVneShJbmhlcml0YW5jZVR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld0luaGVyaXRhbmNlVHlwZSkpOwkJCQkJCQorCQkJCWlmICh0aGlzLmdldFJlc291cmNlSW5oZXJpdGFuY2UoKS5pc1Vuc2V0KCkpIHsKKwkJCQkJcmVtb3ZlUmVzb3VyY2VJbmhlcml0YW5jZSgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKG5ld0luaGVyaXRhbmNlVHlwZSAhPSBudWxsKSB7CisJCQkJYWRkUmVzb3VyY2VJbmhlcml0YW5jZSgpOworCQkJCWdldFJlc291cmNlSW5oZXJpdGFuY2UoKS5zZXRTdHJhdGVneShJbmhlcml0YW5jZVR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld0luaGVyaXRhbmNlVHlwZSkpOworCQkJfQorCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZLCBvbGRJbmhlcml0YW5jZVR5cGUsIG5ld0luaGVyaXRhbmNlVHlwZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3lfKEluaGVyaXRhbmNlVHlwZSBuZXdJbmhlcml0YW5jZVR5cGUpIHsKKwkJSW5oZXJpdGFuY2VUeXBlIG9sZEluaGVyaXRhbmNlVHlwZSA9IHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneTsKKwkJdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gbmV3SW5oZXJpdGFuY2VUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9JTkhFUklUQU5DRV9TVFJBVEVHWV9QUk9QRVJUWSwgb2xkSW5oZXJpdGFuY2VUeXBlLCBuZXdJbmhlcml0YW5jZVR5cGUpOworCX0KKworCXByb3RlY3RlZCBJbmhlcml0YW5jZSBnZXRSZXNvdXJjZUluaGVyaXRhbmNlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLmdldEluaGVyaXRhbmNlKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlSW5oZXJpdGFuY2UoKSB7CisJCXRoaXMucmVzb3VyY2VUeXBlTWFwcGluZy5zZXRJbmhlcml0YW5jZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbmhlcml0YW5jZSgpKTsJCQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZUluaGVyaXRhbmNlKCkgeworCQl0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcuc2V0SW5oZXJpdGFuY2UobnVsbCk7CisJfQorCisJcHVibGljIE9ybURpc2NyaW1pbmF0b3JDb2x1bW4gZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbjsKKwl9CisKKwlwdWJsaWMgT3JtR2VuZXJhdG9yQ29udGFpbmVyIGdldEdlbmVyYXRvckNvbnRhaW5lcigpIHsKKwkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKFN0cmluZyBuZXdEZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKSB7CisJCVN0cmluZyBvbGREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlID0gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOworCQl0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUgPSBuZXdEZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSwgb2xkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSwgbmV3RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoU3RyaW5nIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSkgeworCQlTdHJpbmcgb2xkU3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWU7CisJCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlID0gbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlOworCQl0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcuc2V0RGlzY3JpbWluYXRvclZhbHVlKG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSwgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpIDogdGhpcy5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQ7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZChib29sZWFuIHNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCkgeworCQlib29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkOworCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCA9IHNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChFbnRpdHkuU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfSVNfQUxMT1dFRF9QUk9QRVJUWSwgb2xkLCBzcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBkaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpIHsKKwkJcmV0dXJuIHRoaXMuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQ7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldERpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKGJvb2xlYW4gZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkOworCQl0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkID0gZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQ7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRW50aXR5LkRJU0NSSU1JTkFUT1JfVkFMVUVfSVNfVU5ERUZJTkVEX1BST1BFUlRZLCBvbGQsIGRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZDsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZChib29sZWFuIHNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQ7CisJCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCA9IHNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQ7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRW50aXR5LlNQRUNJRklFRF9ESVNDUklNSU5BVE9SX0NPTFVNTl9JU19BTExPV0VEX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBkaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKSB7CisJCXJldHVybiB0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZDsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkKGJvb2xlYW4gZGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkKSB7CisJCWJvb2xlYW4gb2xkID0gdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQ7CisJCXRoaXMuZGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkID0gZGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVudGl0eS5ESVNDUklNSU5BVE9SX0NPTFVNTl9JU19VTkRFRklORURfUFJPUEVSVFksIG9sZCwgZGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkKTsKKwl9CisKKwkKKwlwdWJsaWMgYm9vbGVhbiBzcGVjaWZpZWRUYWJsZUlzQWxsb3dlZCgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQ7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFRhYmxlSXNBbGxvd2VkKGJvb2xlYW4gc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZFRhYmxlSXNBbGxvd2VkOworCQl0aGlzLnNwZWNpZmllZFRhYmxlSXNBbGxvd2VkID0gc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQ7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRW50aXR5LlNQRUNJRklFRF9UQUJMRV9JU19BTExPV0VEX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZFRhYmxlSXNBbGxvd2VkKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gdGFibGVJc1VuZGVmaW5lZCgpIHsKKwkJcmV0dXJuIHRoaXMudGFibGVJc1VuZGVmaW5lZDsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0VGFibGVJc1VuZGVmaW5lZChib29sZWFuIHRhYmxlSXNVbmRlZmluZWQpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLnRhYmxlSXNVbmRlZmluZWQ7CisJCXRoaXMudGFibGVJc1VuZGVmaW5lZCA9IHRhYmxlSXNVbmRlZmluZWQ7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRW50aXR5LlRBQkxFX0lTX1VOREVGSU5FRF9QUk9QRVJUWSwgb2xkLCB0YWJsZUlzVW5kZWZpbmVkKTsKKwl9CisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMpOworCX0KKwkKKwlwdWJsaWMgaW50IGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVzZSBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgaW5zdGVhZCIpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRQa0pvaW5Db2x1bW4pIHsKKwkJYWRkSXRlbVRvTGlzdChkZWZhdWx0UGtKb2luQ29sdW1uLCB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIE9ybUVudGl0eS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRQa0pvaW5Db2x1bW4pIHsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KGRlZmF1bHRQa0pvaW5Db2x1bW4sIHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucywgT3JtRW50aXR5LkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOworCX0KKwkKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCkgPyB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA6IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJfQorCQorCXB1YmxpYyBpbnQgcHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLmlzRW1wdHkoKSA/IHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOworCX0KKwkKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+KHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKTsKKwl9CisKKwlwdWJsaWMgaW50IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5zaXplKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gIXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKKwl9CQorCisJcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgeworCQlpZiAoIXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCkpIHsKKwkJCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucy5jbGVhcigpOworCQl9CisJCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHJlc291cmNlUGtKb2luQ29sdW1uID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKKwkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gY29udGV4dFBrSm9pbkNvbHVtbiA9IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVzb3VyY2VQa0pvaW5Db2x1bW4pOworCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoaW5kZXgsIGNvbnRleHRQa0pvaW5Db2x1bW4pOworCQl0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKGluZGV4LCByZXNvdXJjZVBrSm9pbkNvbHVtbik7CisKKwkJdGhpcy5maXJlSXRlbUFkZGVkKEVudGl0eS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBjb250ZXh0UGtKb2luQ29sdW1uKTsKKwkJdGhpcy5maXJlTGlzdENsZWFyZWQoT3JtRW50aXR5LkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOworCQlyZXR1cm4gY29udGV4dFBrSm9pbkNvbHVtbjsKKwl9CisJCisJcHJvdGVjdGVkIE9ybUJhc2VKb2luQ29sdW1uLk93bmVyIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKSB7CisJCXJldHVybiBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCwgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4pIHsKKwkJYWRkSXRlbVRvTGlzdChpbmRleCwgcHJpbWFyeUtleUpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLCBFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4pIHsKKwkJdGhpcy5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5zaXplKCksIHByaW1hcnlLZXlKb2luQ29sdW1uKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4pIHsKKwkJdGhpcy5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5pbmRleE9mKHByaW1hcnlLZXlKb2luQ29sdW1uKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgeworCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiByZW1vdmVkUHJpbWFyeUtleUpvaW5Db2x1bW4gPSB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOworCQlpZiAoIWNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpIHsKKwkJCS8vY3JlYXRlIHRoZSBkZWZhdWx0Sm9pbkNvbHVtbiBub3cgb3IgdGhpcyB3aWxsIGhhcHBlbiBkdXJpbmcgcHJvamVjdCB1cGRhdGUgCisJCQkvL2FmdGVyIHJlbW92aW5nIHRoZSBqb2luIGNvbHVtbiBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4gVGhhdCBjYXVzZXMgcHJvYmxlbXMgCisJCQkvL2luIHRoZSBVSSBiZWNhdXNlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBlbmQgdXAgaW4gdGhlIHdyb25nIG9yZGVyLgorCQkJaW5pdGlhbGl6ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkJfQorCQl0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKGluZGV4KTsKKwkJZmlyZUl0ZW1SZW1vdmVkKEVudGl0eS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCByZW1vdmVkUHJpbWFyeUtleUpvaW5Db2x1bW4pOworCQlpZiAoIXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCkpIHsKKwkJCWZpcmVMaXN0Q2hhbmdlZChPcm1FbnRpdHkuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uXyhPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgeworCQlyZW1vdmVJdGVtRnJvbUxpc3QocHJpbWFyeUtleUpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLCBFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKKwl9CisJCisJcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQlmaXJlSXRlbU1vdmVkKEVudGl0eS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKKwl9CisKKwlwdWJsaWMgT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKSB7CisJCXJldHVybiB0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOworCX0KKwkKKwlwdWJsaWMgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkgeworCQlyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworCX0KKwkKKwlwdWJsaWMgT3JtUXVlcnlDb250YWluZXIgZ2V0UXVlcnlDb250YWluZXIoKSB7CisJCXJldHVybiB0aGlzLnF1ZXJ5Q29udGFpbmVyOworCX0KKwkKKwlwdWJsaWMgY2hhciBnZXRJZENsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKKwkJcmV0dXJuICckJzsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRJZENsYXNzKCkgeworCQlyZXR1cm4gdGhpcy5pZENsYXNzOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRJZENsYXNzKFN0cmluZyBuZXdJZENsYXNzKSB7CisJCVN0cmluZyBvbGRJZENsYXNzID0gdGhpcy5pZENsYXNzOworCQl0aGlzLmlkQ2xhc3MgPSBuZXdJZENsYXNzOworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQob2xkSWRDbGFzcywgbmV3SWRDbGFzcykpIHsKKwkJCWlmICh0aGlzLmdldFJlc291cmNlSWRDbGFzcygpICE9IG51bGwpIHsKKwkJCQl0aGlzLmdldFJlc291cmNlSWRDbGFzcygpLnNldENsYXNzTmFtZShuZXdJZENsYXNzKTsJCQkJCQkKKwkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUlkQ2xhc3MoKS5pc1Vuc2V0KCkpIHsKKwkJCQkJcmVtb3ZlUmVzb3VyY2VJZENsYXNzKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAobmV3SWRDbGFzcyAhPSBudWxsKSB7CisJCQkJYWRkUmVzb3VyY2VJZENsYXNzKCk7CisJCQkJZ2V0UmVzb3VyY2VJZENsYXNzKCkuc2V0Q2xhc3NOYW1lKG5ld0lkQ2xhc3MpOworCQkJfQorCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSURfQ0xBU1NfUFJPUEVSVFksIG9sZElkQ2xhc3MsIG5ld0lkQ2xhc3MpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRJZENsYXNzXyhTdHJpbmcgbmV3SWRDbGFzcykgeworCQlTdHJpbmcgb2xkSWRDbGFzcyA9IHRoaXMuaWRDbGFzczsKKwkJdGhpcy5pZENsYXNzID0gbmV3SWRDbGFzczsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChJRF9DTEFTU19QUk9QRVJUWSwgb2xkSWRDbGFzcywgbmV3SWRDbGFzcyk7CisJfQorCisJcHJvdGVjdGVkIFhtbElkQ2xhc3MgZ2V0UmVzb3VyY2VJZENsYXNzKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLmdldElkQ2xhc3MoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VJZENsYXNzKCkgeworCQl0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcuc2V0SWRDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxJZENsYXNzKCkpOwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlSWRDbGFzcygpIHsKKwkJdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLnNldElkQ2xhc3MobnVsbCk7CisJfQorCisJcHVibGljIEVudGl0eSBnZXRQYXJlbnRFbnRpdHkoKSB7CisJCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IHN0cmVhbSA9IGdldFBlcnNpc3RlbnRUeXBlKCkuYW5jZXN0b3JzKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7CisJCQlUeXBlTWFwcGluZyB0bSA9IHN0cmVhbS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQkJaWYgKHRtIGluc3RhbmNlb2YgRW50aXR5KSB7CisJCQkJcmV0dXJuIChFbnRpdHkpIHRtOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgdWx0aW1hdGUgdG9wIG9mIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkgCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIHJldHVybiBudWxsLiBUaGUgcm9vdAorCSAqIGlzIGRlZmluZWQgYXMgdGhlIHBlcnNpc3RlbnQgdHlwZSBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisJICogdGhhdCBoYXMgbm8gcGFyZW50LiAgVGhlIHJvb3Qgc2hvdWxkIGJlIGFuIGVudGl0eQorCSAqICAKKwkgKiBOb24tZW50aXRpZXMgaW4gdGhlIGhpZXJhcmNoeSBzaG91bGQgYmUgaWdub3JlZCwgaWUgc2tpcAorCSAqIG92ZXIgdGhlbSBpbiB0aGUgc2VhcmNoIGZvciB0aGUgcm9vdC4gCisJICovCisJcHJvdGVjdGVkIEVudGl0eSBnZXRSb290RW50aXR5KCkgeworCQlyZXR1cm4gdGhpcy5yb290RW50aXR5OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKKwkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gdGhpcy5nZXRKYXZhRW50aXR5KCk7CisJCWlmIChqYXZhRW50aXR5ICE9IG51bGwpIHsKKwkJCUphdmFUYWJsZSBqYXZhVGFibGUgPSBqYXZhRW50aXR5LmdldFRhYmxlKCk7CisJCQlpZiAoICEgdGhpcy5pc01ldGFkYXRhQ29tcGxldGUoKQorCQkJCQkmJiAhIHRoaXMudGFibGUuaXNSZXNvdXJjZVNwZWNpZmllZCgpCisJCQkJCSYmIGphdmFUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgeworCQkJCXJldHVybiBqYXZhVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpOworCQkJfQorCQl9CisJCXJldHVybiB0aGlzLmlzU2luZ2xlVGFibGVEZXNjZW5kYW50KCkgPworCQkJCQkJdGhpcy5nZXRSb290RW50aXR5KCkuZ2V0VGFibGUoKS5nZXROYW1lKCkKKwkJCQkJOgorCQkJCQkJdGhpcy5pc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpID8KKwkJCQkJCQkJbnVsbAorCQkJCQkJCToKKwkJCQkJCQkJdGhpcy5nZXROYW1lKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgeworCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSB0aGlzLmdldEphdmFFbnRpdHkoKTsKKwkJaWYgKGphdmFFbnRpdHkgIT0gbnVsbCkgeworCQkJSmF2YVRhYmxlIGphdmFUYWJsZSA9IGphdmFFbnRpdHkuZ2V0VGFibGUoKTsKKwkJCWlmICggISB0aGlzLmlzTWV0YWRhdGFDb21wbGV0ZSgpCisJCQkJCSYmICEgdGhpcy50YWJsZS5pc1Jlc291cmNlU3BlY2lmaWVkKCkKKwkJCQkJJiYgamF2YVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gamF2YVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXMuaXNTaW5nbGVUYWJsZURlc2NlbmRhbnQoKSA/CisJCQkJCQl0aGlzLmdldFJvb3RFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNjaGVtYSgpCisJCQkJCToKKwkJCQkJCXRoaXMuaXNBYnN0cmFjdFRhYmxlUGVyQ2xhc3MoKSA/CisJCQkJCQkJCW51bGwKKwkJCQkJCQk6CisJCQkJCQkJCXRoaXMuZ2V0Q29udGV4dERlZmF1bHRTY2hlbWEoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgeworCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSB0aGlzLmdldEphdmFFbnRpdHkoKTsKKwkJaWYgKGphdmFFbnRpdHkgIT0gbnVsbCkgeworCQkJSmF2YVRhYmxlIGphdmFUYWJsZSA9IGphdmFFbnRpdHkuZ2V0VGFibGUoKTsKKwkJCWlmICggISB0aGlzLmlzTWV0YWRhdGFDb21wbGV0ZSgpCisJCQkJCSYmICEgdGhpcy50YWJsZS5pc1Jlc291cmNlU3BlY2lmaWVkKCkKKwkJCQkJJiYgamF2YVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGphdmFUYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdGhpcy5pc1NpbmdsZVRhYmxlRGVzY2VuZGFudCgpID8KKwkJCQkJCXRoaXMuZ2V0Um9vdEVudGl0eSgpLmdldFRhYmxlKCkuZ2V0Q2F0YWxvZygpCisJCQkJCToKKwkJCQkJCXRoaXMuaXNBYnN0cmFjdFRhYmxlUGVyQ2xhc3MoKSA/CisJCQkJCQkJbnVsbAorCQkJCQkJOgorCQkJCQkJCXRoaXMuZ2V0Q29udGV4dERlZmF1bHRDYXRhbG9nKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIHJvb3QgZW50aXR5CisJICogb2YgYSAic2luZ2xlIHRhYmxlIiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNTaW5nbGVUYWJsZURlc2NlbmRhbnQoKSB7CisJCXJldHVybiB0aGlzLmlzRGVzY2VuZGFudCgpICYmICh0aGlzLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSBpcyBhIGRlc2NlbmRhbnQgaW4gKGFzIG9wcG9zZWQgdG8gdGhlIHJvb3Qgb2YpCisJICogYW4gaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzRGVzY2VuZGFudCgpIHsKKwkJcmV0dXJuICEgdGhpcy5pc1Jvb3QoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGlzIHRoZSB0b3Agb2YgYW4gaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzUm9vdCgpIHsKKwkJcmV0dXJuIHRoaXMgPT0gdGhpcy5nZXRSb290RW50aXR5KCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRpdHkgaXMgdGhlIHRvcCBvZiBhbiBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKwkgKiBhbmQgaGFzIG5vIGRlc2NlbmRhbnRzIGFuZCBubyBzcGVjaWZpZWQgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgaGFzIGJlZW4gZGVmaW5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jvb3ROb0Rlc2NlbmRhbnRzTm9TdHJhdGVneURlZmluZWQoKSB7CisJCXJldHVybiBpc1Jvb3QoKSAmJiAhZ2V0UGVyc2lzdGVuY2VVbml0KCkuaXNSb290V2l0aFN1YkVudGl0aWVzKHRoaXMuZ2V0TmFtZSgpKSAmJiBnZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgPT0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGlzIGFic3RyYWN0IGFuZCBpcyBhIHBhcnQgb2YgYSAKKwkgKiAidGFibGUgcGVyIGNsYXNzIiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNBYnN0cmFjdFRhYmxlUGVyQ2xhc3MoKSB7CisJCXJldHVybiBpc0Fic3RyYWN0KCkgJiYgaXNUYWJsZVBlckNsYXNzKCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRpdHkgaXMgYSBwYXJ0IG9mIGEgInRhYmxlIHBlciBjbGFzcyIgCisJICogaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVQZXJDbGFzcygpIHsKKwkJcmV0dXJuICh0aGlzLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgaXMgYWJzdHJhY3QsIGZhbHNlIGlmIG5vIGphdmEgdHlwZSBleGlzdHMuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNBYnN0cmFjdCgpIHsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpOworCQlyZXR1cm4gamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgPT0gbnVsbCA/IGZhbHNlIDogamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuaXNBYnN0cmFjdCgpOworCX0KKworLy8JcHVibGljIFN0cmluZyBwcmltYXJ5S2V5Q29sdW1uTmFtZSgpIHsKKy8vCQlTdHJpbmcgcGtDb2x1bW5OYW1lID0gbnVsbDsKKy8vCQlmb3IgKEl0ZXJhdG9yPElQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBnZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKKy8vCQkJSVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKKy8vCQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGUucHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKKy8vCQkJaWYgKHBrQ29sdW1uTmFtZSA9PSBudWxsKSB7CisvLwkJCQlwa0NvbHVtbk5hbWUgPSBuYW1lOworLy8JCQl9CisvLwkJCWVsc2UgaWYgKG5hbWUgIT0gbnVsbCkgeworLy8JCQkJLy8gaWYgd2UgZW5jb3VudGVyIGEgY29tcG9zaXRlIHByaW1hcnkga2V5LCByZXR1cm4gbnVsbAorLy8JCQkJcmV0dXJuIG51bGw7CisvLwkJCX0KKy8vCQl9CisvLwkJLy8gaWYgd2UgZW5jb3VudGVyIG9ubHkgYSBzaW5nbGUgcHJpbWFyeSBrZXkgY29sdW1uIG5hbWUsIHJldHVybiBpdAorLy8JCXJldHVybiBwa0NvbHVtbk5hbWU7CisvLwl9CisvLworLy8JcHVibGljIFN0cmluZyBwcmltYXJ5S2V5QXR0cmlidXRlTmFtZSgpIHsKKy8vCQlTdHJpbmcgcGtDb2x1bW5OYW1lID0gbnVsbDsKKy8vCQlTdHJpbmcgcGtBdHRyaWJ1dGVOYW1lID0gbnVsbDsKKy8vCQlmb3IgKEl0ZXJhdG9yPElQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBnZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZXMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKKy8vCQkJSVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKKy8vCQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGUucHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKKy8vCQkJaWYgKHBrQ29sdW1uTmFtZSA9PSBudWxsKSB7CisvLwkJCQlwa0NvbHVtbk5hbWUgPSBuYW1lOworLy8JCQkJcGtBdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKKy8vCQkJfQorLy8JCQllbHNlIGlmIChuYW1lICE9IG51bGwpIHsKKy8vCQkJCS8vIGlmIHdlIGVuY291bnRlciBhIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgcmV0dXJuIG51bGwKKy8vCQkJCXJldHVybiBudWxsOworLy8JCQl9CisvLwkJfQorLy8JCS8vIGlmIHdlIGVuY291bnRlciBvbmx5IGEgc2luZ2xlIHByaW1hcnkga2V5IGNvbHVtbiBuYW1lLCByZXR1cm4gaXQKKy8vCQlyZXR1cm4gcGtBdHRyaWJ1dGVOYW1lOworLy8JfQorLy8KKworCisJcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoqCisJICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9mIEVudGl0aWVzLCBlYWNoIHdoaWNoIGluaGVyaXRzIGZyb20gdGhlIG9uZSBiZWZvcmUsCisJICogYW5kIHRlcm1pbmF0ZXMgYXQgdGhlIHJvb3QgZW50aXR5IChvciBhdCB0aGUgcG9pbnQgb2YgY3ljbGljaXR5KS4KKwkgKi8KKwlwcm90ZWN0ZWQgSXRlcmF0b3I8VHlwZU1hcHBpbmc+IGFuY2VzdG9ycygpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlLCBUeXBlTWFwcGluZz4oZ2V0UGVyc2lzdGVudFR5cGUoKS5hbmNlc3RvcnMoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgdHJhbnNmb3JtKFBlcnNpc3RlbnRUeXBlIHR5cGUpIHsKKwkJCQlyZXR1cm4gdHlwZS5nZXRNYXBwaW5nKCk7CisJCQl9CisJCX07CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB7CisJCWlmICghaXNUYWJsZVBlckNsYXNzKCkpIHsKKwkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIENvbHVtbiByZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCWlmIChnZXRKcGFQbGF0Zm9ybVZlcnNpb24oKS5pc0NvbXBhdGlibGVXaXRoSnBhVmVyc2lvbihKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzJfMCkpIHsKKwkJCWludCBkb3RJbmRleCA9IGF0dHJpYnV0ZU5hbWUuaW5kZXhPZignLicpOworCQkJaWYgKGRvdEluZGV4ICE9IC0xKSB7CisJCQkJQXR0cmlidXRlT3ZlcnJpZGUgb3ZlcnJpZGUgPSBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoYXR0cmlidXRlTmFtZS5zdWJzdHJpbmcoZG90SW5kZXggKyAxKSk7CisJCQkJaWYgKG92ZXJyaWRlICE9IG51bGwgJiYgIW92ZXJyaWRlLmlzVmlydHVhbCgpKSB7CisJCQkJCXJldHVybiBvdmVycmlkZS5nZXRDb2x1bW4oKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLnJlc29sdmVPdmVycmlkZW5Db2x1bW4oYXR0cmlidXRlTmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHsKKwkJaWYgKCFpc1RhYmxlUGVyQ2xhc3MoKSkgeworCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIub3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7CisJfQorCQorCXB1YmxpYyBBdHRyaWJ1dGVNYXBwaW5nIHJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKFN0cmluZyBuYW1lKSB7CisJCWZvciAoQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuYWxsQXR0cmlidXRlTWFwcGluZ3MoKSkpIHsKKwkJCUF0dHJpYnV0ZU1hcHBpbmcgcmVzb2x2ZWRNYXBwaW5nID0gYXR0cmlidXRlTWFwcGluZy5yZXNvbHZlQXR0cmlidXRlTWFwcGluZyhuYW1lKTsKKwkJCWlmIChyZXNvbHZlZE1hcHBpbmcgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXNvbHZlZE1hcHBpbmc7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisvLworLy8JcHVibGljIElBdHRyaWJ1dGVPdmVycmlkZSBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZShpbnQgaW5kZXgpIHsKKy8vCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUobmV3IElFbnRpdHkuQXR0cmlidXRlT3ZlcnJpZGVPd25lcih0aGlzKSk7CisvLwl9CisvLworLy8JcHVibGljIElBc3NvY2lhdGlvbk92ZXJyaWRlIGNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGUoaW50IGluZGV4KSB7CisvLwkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUobmV3IElFbnRpdHkuQXNzb2NpYXRpb25PdmVycmlkZU93bmVyKHRoaXMpKTsKKy8vCX0KKy8vCisvLwlwdWJsaWMgSUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpIHsKKy8vCQlyZXR1cm4gKElBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGVOYW1lZChuYW1lLCBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSk7CisvLwl9CisvLworLy8JcHVibGljIGJvb2xlYW4gY29udGFpbnNBdHRyaWJ1dGVPdmVycmlkZShTdHJpbmcgbmFtZSkgeworLy8JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKKy8vCX0KKy8vCisvLwlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKFN0cmluZyBuYW1lKSB7CisvLwkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgZ2V0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkpOworLy8JfQorLy8KKy8vCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgeworLy8JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOworLy8JfQorLy8KKy8vCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgeworLy8JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIGdldFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOworLy8JfQorLy8KKy8vCXByaXZhdGUgSU92ZXJyaWRlIG92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUsIExpc3Q8PyBleHRlbmRzIElPdmVycmlkZT4gb3ZlcnJpZGVzKSB7CisvLwkJZm9yIChJT3ZlcnJpZGUgb3ZlcnJpZGUgOiBvdmVycmlkZXMpIHsKKy8vCQkJU3RyaW5nIG92ZXJyaWRlTmFtZSA9IG92ZXJyaWRlLmdldE5hbWUoKTsKKy8vCQkJaWYgKG92ZXJyaWRlTmFtZSA9PSBudWxsICYmIG5hbWUgPT0gbnVsbCkgeworLy8JCQkJcmV0dXJuIG92ZXJyaWRlOworLy8JCQl9CisvLwkJCWlmIChvdmVycmlkZU5hbWUgIT0gbnVsbCAmJiBvdmVycmlkZU5hbWUuZXF1YWxzKG5hbWUpKSB7CisvLwkJCQlyZXR1cm4gb3ZlcnJpZGU7CisvLwkJCX0KKy8vCQl9CisvLwkJcmV0dXJuIG51bGw7CisvLwl9CisvLworLy8JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zT3ZlcnJpZGUoU3RyaW5nIG5hbWUsIExpc3Q8PyBleHRlbmRzIElPdmVycmlkZT4gb3ZlcnJpZGVzKSB7CisvLwkJcmV0dXJuIG92ZXJyaWRlTmFtZWQobmFtZSwgb3ZlcnJpZGVzKSAhPSBudWxsOworLy8JfQorLy8KKy8vCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworLy8JCXJldHVybiAhdGhpcy5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCk7CisvLwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUluaGVyaXRhbmNlKEluaGVyaXRhbmNlIGluaGVyaXRhbmNlUmVzb3VyY2UpIHsKKwkJdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gdGhpcy5nZXRSZXNvdXJjZUluaGVyaXRhbmNlU3RyYXRlZ3koaW5oZXJpdGFuY2VSZXNvdXJjZSk7CisJCS8vbm8gbmVlZCB0byBpbml0aWFsaXplIGRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5LCBuZWVkIHRvIGdldCBhbGwgdGhlIHBlcnNpc3RlbnRUeXBlcyBpbiB0aGUgbW9kZWwgZmlyc3QKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkgeworCQlmb3IgKFhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlIDogdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLmdldFNlY29uZGFyeVRhYmxlcygpKSB7CisJCQl0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5hZGQoYnVpbGRTZWNvbmRhcnlUYWJsZShzZWNvbmRhcnlUYWJsZSkpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkgeworCQlpZiAoaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoZ2V0SmF2YUVudGl0eSgpID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpID4gMCkgeworCQkJcmV0dXJuOworCQl9CisJCUxpc3RJdGVyYXRvcjxKYXZhU2Vjb25kYXJ5VGFibGU+IGphdmFTZWNvbmRhcnlUYWJsZXMgPSBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7CisJCXdoaWxlKGphdmFTZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKSB7CisJCQlKYXZhU2Vjb25kYXJ5VGFibGUgamF2YVNlY29uZGFyeVRhYmxlID0gamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCk7CisJCQlpZiAoamF2YVNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSAhPSBudWxsKSB7CisJCQkJdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzLmFkZChidWlsZFZpcnR1YWxTZWNvbmRhcnlUYWJsZShqYXZhU2Vjb25kYXJ5VGFibGUpKTsKKwkJCX0KKwkJfQorCX0JCisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7CisJCWlmIChpc01ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuOworCQl9CisJCWlmIChnZXRKYXZhRW50aXR5KCkgPT0gbnVsbCkgeworCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLmFkZChidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG51bGwpKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpID4gMCkgeworCQkJcmV0dXJuOworCQl9CisJCUxpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IGphdmFQa0pvaW5Db2x1bW5zID0gZ2V0SmF2YUVudGl0eSgpLnByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCQl3aGlsZShqYXZhUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKKwkJCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqYXZhUGtKb2luQ29sdW1uID0gamF2YVBrSm9pbkNvbHVtbnMubmV4dCgpOworCQkJaWYgKGphdmFQa0pvaW5Db2x1bW4uZ2V0TmFtZSgpICE9IG51bGwpIHsKKwkJCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuYWRkKGJ1aWxkVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uKGphdmFQa0pvaW5Db2x1bW4pKTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7CisJCWZvciAoWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcmVzb3VyY2VQa0pvaW5Db2x1bW4gOiB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpIHsKKwkJCXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLmFkZChidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKHJlc291cmNlUGtKb2luQ29sdW1uKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUlkQ2xhc3MoWG1sSWRDbGFzcyBpZENsYXNzUmVzb3VyY2UpIHsKKwkJdGhpcy5pZENsYXNzID0gdGhpcy5nZXRSZXNvdXJjZUlkQ2xhc3MoaWRDbGFzc1Jlc291cmNlKTsJCisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUlkQ2xhc3MoWG1sSWRDbGFzcyBpZENsYXNzUmVzb3VyY2UpIHsKKwkJcmV0dXJuIGlkQ2xhc3NSZXNvdXJjZSA9PSBudWxsID8gbnVsbCA6IGlkQ2xhc3NSZXNvdXJjZS5nZXRDbGFzc05hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFNwZWNpZmllZE5hbWUodGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLmdldE5hbWUoKSk7CisJCXRoaXMuc2V0RGVmYXVsdE5hbWUodGhpcy5idWlsZERlZmF1bHROYW1lKCkpOworCQl0aGlzLnVwZGF0ZUluaGVyaXRhbmNlKHRoaXMuZ2V0UmVzb3VyY2VJbmhlcml0YW5jZSgpKTsKKwkJdGhpcy51cGRhdGVSb290RW50aXR5KCk7CisJCXRoaXMudXBkYXRlRGlzY3JpbWluYXRvckNvbHVtbigpOworCQl0aGlzLnVwZGF0ZURpc2NyaW1pbmF0b3JWYWx1ZSgpOworCQl0aGlzLnNldFNwZWNpZmllZFRhYmxlSXNBbGxvd2VkKHRoaXMuYnVpbGRTcGVjaWZpZWRUYWJsZUlzQWxsb3dlZCgpKTsKKwkJdGhpcy5zZXRUYWJsZUlzVW5kZWZpbmVkKHRoaXMuYnVpbGRUYWJsZUlzVW5kZWZpbmVkKCkpOworCQl0aGlzLnRhYmxlLnVwZGF0ZSh0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcpOworCQl0aGlzLnVwZGF0ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOworCQl0aGlzLnVwZGF0ZVZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKTsKKwkJdGhpcy5nZW5lcmF0b3JDb250YWluZXIudXBkYXRlKCk7CisJCXRoaXMudXBkYXRlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCXRoaXMudXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCQlnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnVwZGF0ZSgpOworCQlnZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkudXBkYXRlKCk7CisJCWdldFF1ZXJ5Q29udGFpbmVyKCkudXBkYXRlKCk7CisJCXRoaXMudXBkYXRlSWRDbGFzcyh0aGlzLmdldFJlc291cmNlSWRDbGFzcygpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcG9zdFVwZGF0ZSgpIHsKKwkJc3VwZXIucG9zdFVwZGF0ZSgpOworCQl0aGlzLnBvc3RVcGRhdGVEaXNjcmltaW5hdG9yQ29sdW1uKCk7CisJCXRoaXMucG9zdFVwZGF0ZURpc2NyaW1pbmF0b3JWYWx1ZSgpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0TmFtZSgpIHsKKwkJaWYgKCFpc01ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOworCQkJaWYgKGphdmFFbnRpdHkgIT0gbnVsbCkgeworCQkJCXJldHVybiBqYXZhRW50aXR5LmdldE5hbWUoKTsKKwkJCX0KKwkJfQorCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NfKCk7CisJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgeworCQkJcmV0dXJuIENsYXNzVG9vbHMuc2hvcnROYW1lRm9yQ2xhc3NOYW1lZChjbGFzc05hbWUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEaXNjcmltaW5hdG9yQ29sdW1uKCkgeworCQl0aGlzLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQodGhpcy5idWlsZFNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7CisJCWdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS51cGRhdGUodGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcG9zdFVwZGF0ZURpc2NyaW1pbmF0b3JDb2x1bW4oKSB7CisJCXRoaXMuc2V0RGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkKHRoaXMuYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKSk7CisJCXRoaXMuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnBvc3RVcGRhdGUoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGlzY3JpbWluYXRvclZhbHVlKCkgeworCQl0aGlzLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCh0aGlzLmJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkKCkpOworCQl0aGlzLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSh0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBwb3N0VXBkYXRlRGlzY3JpbWluYXRvclZhbHVlKCkgeworCQl0aGlzLnNldERpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKHRoaXMuYnVpbGREaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKKwkJdGhpcy5zZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKHRoaXMuYnVpbGREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOworCX0KKwkKKwkvKioKKwkgKiBGcm9tIHRoZSBTcGVjOgorCSAqIElmIHRoZSBEaXNjcmltaW5hdG9yVmFsdWUgYW5ub3RhdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhCisJICogcHJvdmlkZXItc3BlY2lmaWMgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSB2YWx1ZSByZXByZXNlbnRpbmcKKwkgKiB0aGUgZW50aXR5IHR5cGUgaXMgdXNlZCBmb3IgdGhlIHZhbHVlIG9mIHRoZSBkaXNjcmltaW5hdG9yCisJICogY29sdW1uLiBJZiB0aGUgRGlzY3JpbWluYXRvclR5cGUgaXMgU1RSSU5HLCB0aGUgZGlzY3JpbWluYXRvcgorCSAqIHZhbHVlIGRlZmF1bHQgaXMgdGhlIGVudGl0eSBuYW1lLgorCSAqIAorCSAqIFRPRE8gZXh0ZW5zaW9uIHBvaW50IGZvciBwcm92aWRlci1zcGVjaWZpYyBmdW5jdGlvbj8KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKKwkJaWYgKCFpc01ldGFkYXRhQ29tcGxldGUoKSAmJiBnZXRKYXZhRW50aXR5KCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKTsKKwkJfQorCQlpZiAoZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKHRoaXMuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSAhPSBEaXNjcmltaW5hdG9yVHlwZS5TVFJJTkcpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiB0aGlzLmdldE5hbWUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKSB7CisJCXJldHVybiB0aGlzLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKSB7CisJCWlmIChnZXRQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpICE9IG51bGwpIHsKKwkJCXJldHVybiBnZXRQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQoKSB7CisJCXJldHVybiAhaXNUYWJsZVBlckNsYXNzKCkgJiYgIWlzQWJzdHJhY3QoKTsKKwl9CisJCQorCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSB7CisJCXJldHVybiBpc1RhYmxlUGVyQ2xhc3MoKSB8fCBpc0Fic3RyYWN0KCkgfHwgaXNSb290Tm9EZXNjZW5kYW50c05vU3RyYXRlZ3lEZWZpbmVkKCk7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpIHsKKwkJcmV0dXJuICFpc1RhYmxlUGVyQ2xhc3MoKSAmJiBpc1Jvb3QoKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKSB7CisJCXJldHVybiBpc1RhYmxlUGVyQ2xhc3MoKSB8fCBpc1Jvb3ROb0Rlc2NlbmRhbnRzTm9TdHJhdGVneURlZmluZWQoKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRTcGVjaWZpZWRUYWJsZUlzQWxsb3dlZCgpIHsKKwkJcmV0dXJuICFpc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpICYmICFpc1NpbmdsZVRhYmxlRGVzY2VuZGFudCgpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFRhYmxlSXNVbmRlZmluZWQoKSB7CisJCXJldHVybiBpc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpOworCX0KKwkKKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUluaGVyaXRhbmNlKEluaGVyaXRhbmNlIGluaGVyaXRhbmNlUmVzb3VyY2UpIHsKKwkJdGhpcy5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5Xyh0aGlzLmdldFJlc291cmNlSW5oZXJpdGFuY2VTdHJhdGVneShpbmhlcml0YW5jZVJlc291cmNlKSk7CisJCXRoaXMuc2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3kodGhpcy5idWlsZERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSb290RW50aXR5KCkgeworCQkvL0kgYW0gbWFraW5nIGFuIGFzc3VtcHRpb24gaGVyZSB0aGF0IHdlIGRvbid0IG5lZWQgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbiBmb3Igcm9vdEVudGl0eSwgdGhpcyBtaWdodCBiZSB3cm9uZworCQl0aGlzLnJvb3RFbnRpdHkgPSBjYWxjdWxhdGVSb290RW50aXR5KCk7CisJCWlmICh0aGlzLnJvb3RFbnRpdHkgIT0gdGhpcykgeworCQkJdGhpcy5yb290RW50aXR5LmFkZFN1YkVudGl0eSh0aGlzKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgRW50aXR5IGNhbGN1bGF0ZVJvb3RFbnRpdHkoKSB7CisJCUVudGl0eSByb290ID0gdGhpczsKKwkJZm9yIChJdGVyYXRvcjxUeXBlTWFwcGluZz4gc3RyZWFtID0gaW5oZXJpdGFuY2VIaWVyYXJjaHkoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKKwkJCVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gc3RyZWFtLm5leHQoKTsKKwkJCWlmICh0eXBlTWFwcGluZyBpbnN0YW5jZW9mIEVudGl0eSkgeworCQkJCXJvb3QgPSAoRW50aXR5KSB0eXBlTWFwcGluZzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcm9vdDsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkU3ViRW50aXR5KEVudGl0eSBzdWJFbnRpdHkpIHsKKwkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkUm9vdFdpdGhTdWJFbnRpdGllcyhnZXROYW1lKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKSB7CisJCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBYTUwgdGFibGVzICh0byBwcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24pCisJCUl0ZXJhdG9yPFhtbFNlY29uZGFyeVRhYmxlPiB4bWxUYWJsZXMgPSBuZXcgQ2xvbmVJdGVyYXRvcjxYbWxTZWNvbmRhcnlUYWJsZT4odGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLmdldFNlY29uZGFyeVRhYmxlcygpKTsKKwkJCisJCWZvciAoSXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IGNvbnRleHRUYWJsZXMgPSB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOyBjb250ZXh0VGFibGVzLmhhc05leHQoKTsgKSB7CisJCQlPcm1TZWNvbmRhcnlUYWJsZSBjb250ZXh0VGFibGUgPSBjb250ZXh0VGFibGVzLm5leHQoKTsKKwkJCWlmICh4bWxUYWJsZXMuaGFzTmV4dCgpKSB7CisJCQkJY29udGV4dFRhYmxlLnVwZGF0ZSh4bWxUYWJsZXMubmV4dCgpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlXyhjb250ZXh0VGFibGUpOworCQkJfQorCQl9CisJCQorCQl3aGlsZSAoeG1sVGFibGVzLmhhc05leHQoKSkgeworCQkJYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoYnVpbGRTZWNvbmRhcnlUYWJsZSh4bWxUYWJsZXMubmV4dCgpKSk7CisJCX0KKwl9CisJCisJLy9pZiBhbnkgc2Vjb25kYXJ5LXRhYmxlcyBhcmUgc3BlY2lmaWVkIGluIHRoZSB4bWwgZmlsZSwgdGhlbiBhbGwgb2YgdGhlIGphdmEgc2Vjb25kYXJ5VGFibGVzIGFyZSBvdmVycmlkZW4KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkgeworCQlMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gamF2YVNlY29uZGFyeVRhYmxlcyA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7CisJCQorCQlpZiAoZ2V0SmF2YUVudGl0eSgpICE9IG51bGwgJiYgIWlzTWV0YWRhdGFDb21wbGV0ZSgpICYmIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSA9PSAwKSB7CisJCQlqYXZhU2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOworCQl9CisJCXdoaWxlIChzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKSB7CisJCQlPcm1TZWNvbmRhcnlUYWJsZSB2aXJ0dWFsU2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpOworCQkJaWYgKGphdmFTZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKSB7CisJCQkJSmF2YVNlY29uZGFyeVRhYmxlIGphdmFTZWNvbmRhcnlUYWJsZSA9IGphdmFTZWNvbmRhcnlUYWJsZXMubmV4dCgpOworCQkJCXZpcnR1YWxTZWNvbmRhcnlUYWJsZS51cGRhdGUobmV3IFZpcnR1YWxYbWxTZWNvbmRhcnlUYWJsZShqYXZhU2Vjb25kYXJ5VGFibGUpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZVZpcnR1YWxTZWNvbmRhcnlUYWJsZSh2aXJ0dWFsU2Vjb25kYXJ5VGFibGUpOworCQkJfQorCQl9CisJCQorCQl3aGlsZSAoamF2YVNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKKwkJCUphdmFTZWNvbmRhcnlUYWJsZSBqYXZhU2Vjb25kYXJ5VGFibGUgPSBqYXZhU2Vjb25kYXJ5VGFibGVzLm5leHQoKTsKKwkJCWFkZFZpcnR1YWxTZWNvbmRhcnlUYWJsZShidWlsZFZpcnR1YWxTZWNvbmRhcnlUYWJsZShqYXZhU2Vjb25kYXJ5VGFibGUpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBPcm1TZWNvbmRhcnlUYWJsZSBidWlsZFNlY29uZGFyeVRhYmxlKFhtbFNlY29uZGFyeVRhYmxlIHhtbFNlY29uZGFyeVRhYmxlKSB7CisJCXJldHVybiBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVNlY29uZGFyeVRhYmxlKHRoaXMsIHhtbFNlY29uZGFyeVRhYmxlKTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybVNlY29uZGFyeVRhYmxlIGJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlKEphdmFTZWNvbmRhcnlUYWJsZSBqYXZhU2Vjb25kYXJ5VGFibGUpIHsKKwkJcmV0dXJuIGJ1aWxkU2Vjb25kYXJ5VGFibGUobmV3IFZpcnR1YWxYbWxTZWNvbmRhcnlUYWJsZShqYXZhU2Vjb25kYXJ5VGFibGUpKTsKKwl9CisKKwlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIGdldFJlc291cmNlSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZSBpbmhlcml0YW5jZVJlc291cmNlKSB7CisJCWlmIChpbmhlcml0YW5jZVJlc291cmNlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBJbmhlcml0YW5jZVR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoaW5oZXJpdGFuY2VSZXNvdXJjZS5nZXRTdHJhdGVneSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZSBidWlsZERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgeworCQlpZiAoKHRoaXMuZ2V0UmVzb3VyY2VJbmhlcml0YW5jZSgpID09IG51bGwpCisJCQkJJiYgISB0aGlzLmlzTWV0YWRhdGFDb21wbGV0ZSgpCisJCQkJJiYgKHRoaXMuZ2V0SmF2YUVudGl0eSgpICE9IG51bGwpKSB7CisJCQlyZXR1cm4gdGhpcy5nZXRKYXZhRW50aXR5KCkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpOworCQl9CisJCXJldHVybiB0aGlzLmlzUm9vdCgpID8gSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSA6IHRoaXMuZ2V0Um9vdEVudGl0eSgpLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgWE1MIGpvaW4gY29sdW1ucyAodG8gcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKQorCQlJdGVyYXRvcjxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4geG1sUGtKb2luQ29sdW1ucyA9IG5ldyBDbG9uZUl0ZXJhdG9yPFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOworCQkKKwkJZm9yIChJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gY29udGV4dFBrSm9pbkNvbHVtbnMgPSB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOyBjb250ZXh0UGtKb2luQ29sdW1ucy5oYXNOZXh0KCk7ICkgeworCQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gY29udGV4dFBrSm9pbkNvbHVtbiA9IGNvbnRleHRQa0pvaW5Db2x1bW5zLm5leHQoKTsKKwkJCWlmICh4bWxQa0pvaW5Db2x1bW5zLmhhc05leHQoKSkgeworCQkJCWNvbnRleHRQa0pvaW5Db2x1bW4udXBkYXRlKHhtbFBrSm9pbkNvbHVtbnMubmV4dCgpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uXyhjb250ZXh0UGtKb2luQ29sdW1uKTsKKwkJCX0KKwkJfQorCQkKKwkJd2hpbGUgKHhtbFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7CisJCQlhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKHhtbFBrSm9pbkNvbHVtbnMubmV4dCgpKSk7CisJCX0KKwl9CisJCisJLy9pZiB0aGVyZSBhcmUgYW55IHNwZWNpZmllZCBwa0pvaW5Db2x1bW5zLCB0aGVuIG5vIGRlZmF1bHQgcGtKb2luQ29sdW1ucworCS8vaWYgdGhlIGphdmEgaGFzIHNwZWNpZmllZCBwa0pvaW5Db2x1bW5zLCB0aGVuIHRob3NlIGFyZSB0aGUgZGVmYXVsdCBwa0pvaW5Db2x1bW5zCisJLy9vdGhlcndpc2UsIGp1c3QgMSBwa0pvaW5Db2x1bW4sIGRlZmF1bHRzIGJlaW5nIG51bGwgaWYgbXVsdGlwbGUgcHJpbWFyeUtleSBjb2x1bW5zCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKKwkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBkZWZhdWx0UGtKb2luQ29sdW1ucyA9IGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gamF2YVBrSm9pbkNvbHVtbnMgPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOworCQkKKwkJaWYgKGdldEphdmFFbnRpdHkoKSAhPSBudWxsICYmICFpc01ldGFkYXRhQ29tcGxldGUoKSAmJiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgPT0gMCkgeworCQkJamF2YVBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCX0KKwkJd2hpbGUgKGRlZmF1bHRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSkgeworCQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdFBrSm9pbkNvbHVtbiA9IGRlZmF1bHRQa0pvaW5Db2x1bW5zLm5leHQoKTsKKwkJCWlmIChqYXZhUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKKwkJCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gamF2YVBrSm9pbkNvbHVtbiA9IGphdmFQa0pvaW5Db2x1bW5zLm5leHQoKTsKKwkJCQlkZWZhdWx0UGtKb2luQ29sdW1uLnVwZGF0ZShuZXcgVmlydHVhbFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKGphdmFQa0pvaW5Db2x1bW4pKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlmIChkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpID09IDEpIHsKKwkJCQkJZGVmYXVsdFBrSm9pbkNvbHVtbi51cGRhdGUobnVsbCk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlyZW1vdmVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oZGVmYXVsdFBrSm9pbkNvbHVtbik7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQl3aGlsZSAoamF2YVBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7CisJCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gamF2YVBrSm9pbkNvbHVtbiA9IGphdmFQa0pvaW5Db2x1bW5zLm5leHQoKTsKKwkJCWFkZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihidWlsZFZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbihqYXZhUGtKb2luQ29sdW1uKSk7CisJCX0KKwkJCisJCWlmIChkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpID09IDAgJiYgc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpID09IDApIHsKKwkJCWFkZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG51bGwpKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRWaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4oSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGphdmFTZWNvbmRhcnlUYWJsZSkgeworCQlyZXR1cm4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihuZXcgVmlydHVhbFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKGphdmFTZWNvbmRhcnlUYWJsZSkpOworCX0KKwkKKwlwcm90ZWN0ZWQgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiByZXNvdXJjZVBrSm9pbkNvbHVtbikgeworCQlyZXR1cm4gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLCBjcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCksIHJlc291cmNlUGtKb2luQ29sdW1uKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlSWRDbGFzcyhYbWxJZENsYXNzIGlkQ2xhc3NSZXNvdXJjZSkgeworCQl0aGlzLnNldElkQ2xhc3NfKHRoaXMuZ2V0UmVzb3VyY2VJZENsYXNzKGlkQ2xhc3NSZXNvdXJjZSkpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSh0aGlzKTsKKwl9CisJCisJcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SWRBdHRyaWJ1dGUoKSB7CisJCUl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IHRoaXMuYWxsSWRBdHRyaWJ1dGVzKCk7CisJCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7CisJCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7CisJCQlyZXR1cm4gc3RyZWFtLmhhc05leHQoKSA/IG51bGwgLyptb3JlIHRoYW4gb25lKi86IGF0dHJpYnV0ZTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsSWRBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIFBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGEpIHsKKwkJCQlyZXR1cm4gcGEuaXNJZEF0dHJpYnV0ZSgpOworCQkJfQorCQl9OworCX0KKworCXB1YmxpYyB2b2lkIGFkZFRvUmVzb3VyY2VNb2RlbChYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgeworCQllbnRpdHlNYXBwaW5ncy5nZXRFbnRpdGllcygpLmFkZCh0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgeworCQllbnRpdHlNYXBwaW5ncy5nZXRFbnRpdGllcygpLnJlbW92ZSh0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCisJCXRoaXMudmFsaWRhdGVUYWJsZShtZXNzYWdlcywgcmVwb3J0ZXIpOwkKKwkJdGhpcy52YWxpZGF0ZUlkKG1lc3NhZ2VzKTsKKwkJdGhpcy52YWxpZGF0ZUluaGVyaXRhbmNlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCXRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCXRoaXMucXVlcnlDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJCisJCWZvciAoSXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHN0cmVhbSA9IHRoaXMuc2Vjb25kYXJ5VGFibGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJc3RyZWFtLm5leHQoKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVGFibGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlpZiAoaXNBYnN0cmFjdFRhYmxlUGVyQ2xhc3MoKSkgeworCQkJaWYgKHRoaXMudGFibGUuaXNSZXNvdXJjZVNwZWNpZmllZCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX0FCU1RSQUNUX1RBQkxFX1BFUl9DTEFTU19ERUZJTkVTX1RBQkxFLAorCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCisJCQkJCQl0aGlzLAorCQkJCQkJdGhpcy5nZXRUYWJsZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQorCQkJCQkpCisJCQkJKTsKKwkJCX0JCQkKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoaXNTaW5nbGVUYWJsZURlc2NlbmRhbnQoKSkgeworCQkJaWYgKHRoaXMudGFibGUuaXNSZXNvdXJjZVNwZWNpZmllZCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1NJTkdMRV9UQUJMRV9ERVNDRU5EQU5UX0RFRklORVNfVEFCTEUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKKwkJCQkJCXRoaXMsCisJCQkJCQl0aGlzLmdldFRhYmxlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCXRoaXMudGFibGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVJZChMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlpZiAodGhpcy5oYXNOb0lkTWFwcGluZygpKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTk9fSUQsCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAorCQkJCQl0aGlzLCAKKwkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKKwkJCQkpCisJCQkpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSW5oZXJpdGFuY2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQl2YWxpZGF0ZUluaGVyaXRhbmNlU3RyYXRlZ3kobWVzc2FnZXMpOworCQl2YWxpZGF0ZURpc2NyaW1pbmF0b3JDb2x1bW4obWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdmFsaWRhdGVEaXNjcmltaW5hdG9yVmFsdWUobWVzc2FnZXMpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZURpc2NyaW1pbmF0b3JDb2x1bW4oTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlpZiAoc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpICYmICFkaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKSkgeworCQkJZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCX0KKwkJZWxzZSBpZiAoZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmlzUmVzb3VyY2VTcGVjaWZpZWQoKSkgeworCQkJaWYgKCFpc1Jvb3QoKSkgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9OT05fUk9PVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVELAorCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCisJCQkJCQl0aGlzLAorCQkJCQkJdGhpcy5nZXREaXNjcmltaW5hdG9yQ29sdW1uVGV4dFJhbmdlKCkKKwkJCQkJKQorCQkJCSk7CQkJCQorCQkJfQorCQkJZWxzZSBpZiAoaXNUYWJsZVBlckNsYXNzKCkpIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0RFRklORUQsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKKwkJCQkJCXRoaXMsCisJCQkJCQl0aGlzLmdldERpc2NyaW1pbmF0b3JDb2x1bW5UZXh0UmFuZ2UoKQorCQkJCQkpCisJCQkJKTsJCQkJCisJCQkJCisJCQl9CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVEaXNjcmltaW5hdG9yVmFsdWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKKwkJaWYgKGRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkgJiYgZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkgIT0gbnVsbCkgeworCQkJaWYgKGlzQWJzdHJhY3QoKSkgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX0FCU1RSQUNUX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRCwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAorCQkJCQkJdGhpcywKKwkJCQkJCXRoaXMuZ2V0RGlzY3JpbWluYXRvclZhbHVlVGV4dFJhbmdlKCkKKwkJCQkJKQorCQkJCSk7CisJCQl9CisJCQllbHNlIGlmIChpc1RhYmxlUGVyQ2xhc3MoKSkgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKKwkJCQkJCXRoaXMsCisJCQkJCQl0aGlzLmdldERpc2NyaW1pbmF0b3JWYWx1ZVRleHRSYW5nZSgpCisJCQkJCSkKKwkJCQkpOwkJCQkKKwkJCX0KKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUluaGVyaXRhbmNlU3RyYXRlZ3koTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKKwkJU3VwcG9ydGVkIHRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQgPSBnZXRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpLmdldFRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQoKTsKKwkJaWYgKHRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQgPT0gU3VwcG9ydGVkLllFUykgeworCQkJcmV0dXJuOworCQl9CisJCWlmICgoZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpICYmIGlzUm9vdCgpKSB7CisJCQlpZiAodGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCA9PSBTdXBwb3J0ZWQuTk8pIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9TVVBQT1JURURfT05fUExBVEZPUk0sCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKKwkJCQkJCXRoaXMsCisJCQkJCQl0aGlzLmdldEluaGVyaXRhbmNlU3RyYXRlZ3lUZXh0UmFuZ2UoKQorCQkJCQkpCisJCQkJKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfUE9SVEFCTEVfT05fUExBVEZPUk0sCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKKwkJCQkJCXRoaXMsCisJCQkJCQl0aGlzLmdldEluaGVyaXRhbmNlU3RyYXRlZ3lUZXh0UmFuZ2UoKQorCQkJCQkpCisJCQkJKTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0RGlzY3JpbWluYXRvclZhbHVlVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLmdldERpc2NyaW1pbmF0b3JWYWx1ZVRleHRSYW5nZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldERpc2NyaW1pbmF0b3JDb2x1bW5UZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9CisKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEluaGVyaXRhbmNlU3RyYXRlZ3lUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneVRleHRSYW5nZSgpOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBoYXNOb0lkTWFwcGluZygpIHsKKwkJcmV0dXJuICEgdGhpcy5oYXNJZE1hcHBpbmcoKTsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGhhc0lkTWFwcGluZygpIHsKKwkJZm9yIChJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuYWxsQXR0cmlidXRlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCWlmIChzdHJlYW0ubmV4dCgpLmlzSWRBdHRyaWJ1dGUoKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkKKwljbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyT3duZXIgaW1wbGVtZW50cyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyIHsKKwkJcHVibGljIFR5cGVNYXBwaW5nIGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5nZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCk7CisJCX0KKwkJCisJCXB1YmxpYyBPcm1UeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKKwkJCXJldHVybiBBYnN0cmFjdE9ybUVudGl0eS50aGlzLmdldFR5cGVNYXBwaW5nKCk7CisJCX0KKworCQlwdWJsaWMgUmVsYXRpb25zaGlwUmVmZXJlbmNlIHJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoU3RyaW5nIGFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lKSB7CisJCQlpZiAoIWlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCQkJaWYgKGphdmFQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7CisJCQkJCVJlbGF0aW9uc2hpcFJlZmVyZW5jZSByZWxhdGlvbnNoaXBSZWZlcmVuY2UgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoYXNzb2NpYXRpb25PdmVycmlkZU5hbWUpOworCQkJCQlpZiAocmVsYXRpb25zaGlwUmVmZXJlbmNlICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiByZWxhdGlvbnNoaXBSZWZlcmVuY2U7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlUeXBlTWFwcGluZyBvdmVycmlkYWJsZVR5cGVNYXBwaW5nID0gZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpOworCQkJaWYgKG92ZXJyaWRhYmxlVHlwZU1hcHBpbmcgIT0gbnVsbCkgeworCQkJCWZvciAoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3ZlcnJpZGFibGVUeXBlTWFwcGluZy5pbmhlcml0YW5jZUhpZXJhcmNoeSgpKSkgeworCQkJCQlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcmVsYXRpb25zaGlwUmVmZXJlbmNlID0gdHlwZU1hcHBpbmcucmVzb2x2ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShhc3NvY2lhdGlvbk92ZXJyaWRlTmFtZSk7CisJCQkJCWlmIChyZWxhdGlvbnNoaXBSZWZlcmVuY2UgIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIHJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCQorCS8vKioqKioqKioqKiBPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioJCisJCisJY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lciBpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLk93bmVyIHsKKwkJcHVibGljIFR5cGVNYXBwaW5nIGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5nZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCk7CisJCX0KKwkJCisJCXB1YmxpYyBPcm1UeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKKwkJCXJldHVybiBBYnN0cmFjdE9ybUVudGl0eS50aGlzLmdldFR5cGVNYXBwaW5nKCk7CisJCX0KKworCQlwdWJsaWMgQ29sdW1uIHJlc29sdmVPdmVycmlkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSkgeworCQkJaWYgKCFpc01ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkJCWlmIChqYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgeworCQkJCQlDb2x1bW4gY29sdW1uID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5yZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSk7CisJCQkJCWlmIChjb2x1bW4gIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIGNvbHVtbjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCVR5cGVNYXBwaW5nIG92ZXJyaWRhYmxlVHlwZU1hcHBpbmcgPSBnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCk7CisJCQlpZiAob3ZlcnJpZGFibGVUeXBlTWFwcGluZyAhPSBudWxsKSB7CisJCQkJZm9yIChUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvdmVycmlkYWJsZVR5cGVNYXBwaW5nLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpKSB7CisJCQkJCUNvbHVtbiBjb2x1bW4gPSB0eXBlTWFwcGluZy5yZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSk7CisJCQkJCWlmIChjb2x1bW4gIT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIGNvbHVtbjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisJCQorCQlwdWJsaWMgWG1sQ29sdW1uIGJ1aWxkVmlydHVhbFhtbENvbHVtbihDb2x1bW4gb3ZlcnJpZGFibGVDb2x1bW4sIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBib29sZWFuIGlzTWV0YWRhdGFDb21wbGV0ZSkgeworCQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGphdmFBdHRyaWJ1dGVPdmVycmlkZSA9IG51bGw7CisJCQlpZiAoIWlzTWV0YWRhdGFDb21wbGV0ZSkgeworCQkJCWphdmFBdHRyaWJ1dGVPdmVycmlkZSA9IGdldEphdmFBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKGF0dHJpYnV0ZU5hbWUpOworCQkJfQorCQkJaWYgKGphdmFBdHRyaWJ1dGVPdmVycmlkZSA9PSBudWxsKSB7CisJCQkJLy9UT0RPIG5vdCB0aGUgZ3JlYXRlc3Qgc29sdXRpb24gaGVyZSwgYnV0IHRoaW5ncyBzZWVtcyB0byB3b3JrLCBzbyBJJ20gc3RlcHBpbmcgYXdheSBzbG93bHkKKwkJCQlpZiAob3ZlcnJpZGFibGVDb2x1bW4gaW5zdGFuY2VvZiBKYXZhQ29sdW1uKSB7CisJCQkJCXJldHVybiBuZXcgVmlydHVhbFhtbENvbHVtbihBYnN0cmFjdE9ybUVudGl0eS50aGlzLCBvdmVycmlkYWJsZUNvbHVtbik7CisJCQkJfQorCQkJCXJldHVybiBuZXcgVmlydHVhbFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uKG92ZXJyaWRhYmxlQ29sdW1uKTsKKwkJCX0KKwkJCXJldHVybiBuZXcgVmlydHVhbFhtbENvbHVtbihBYnN0cmFjdE9ybUVudGl0eS50aGlzLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkpOworCQl9CisJfQorCQorCWNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIgaW1wbGVtZW50cyBPcm1CYXNlSm9pbkNvbHVtbi5Pd25lcgorCXsKKwkJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgeworCQkJcmV0dXJuIEFic3RyYWN0T3JtRW50aXR5LnRoaXM7CisJCX0KKworCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgeworCQkJcmV0dXJuIEFic3RyYWN0T3JtRW50aXR5LnRoaXMuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOworCQl9CisKKwkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpIHsKKwkJCUVudGl0eSBwYXJlbnRFbnRpdHkgPSBBYnN0cmFjdE9ybUVudGl0eS50aGlzLmdldFBhcmVudEVudGl0eSgpOworCQkJcmV0dXJuIChwYXJlbnRFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogcGFyZW50RW50aXR5LmdldFByaW1hcnlEYlRhYmxlKCk7CisJCX0KKworCQlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJCXJldHVybiBBYnN0cmFjdE9ybUVudGl0eS50aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKKwkJfQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJCXJldHVybiBBYnN0cmFjdE9ybUVudGl0eS50aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuY29udGFpbnMoam9pbkNvbHVtbik7CisJCX0KKwkJCisJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7CisJCQlpZiAoam9pbkNvbHVtbnNTaXplKCkgIT0gMSkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJRW50aXR5IHBhcmVudEVudGl0eSA9IEFic3RyYWN0T3JtRW50aXR5LnRoaXMuZ2V0UGFyZW50RW50aXR5KCk7CisJCQlyZXR1cm4gKHBhcmVudEVudGl0eSA9PSBudWxsKSA/IGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkgOiBwYXJlbnRFbnRpdHkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKKwkJfQorCQkKKwkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1HZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUdlbmVyYXRvci5qYXZhCmluZGV4IDA0ODc1MWQuLjI1YmNiZjcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUdlbmVyYXRvci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUdlbmVyYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDEzNiArMTAsMjA3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSnBhQ29udGV4dE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ2F0YWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWFDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CiAKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtR2VuZXJhdG9yPFQgZXh0ZW5kcyBYbWxHZW5lcmF0b3I+IGV4dGVuZHMgQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZSAKKy8qKgorICogCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUdlbmVyYXRvcjxUIGV4dGVuZHMgWG1sR2VuZXJhdG9yPgorCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZSAKIAlpbXBsZW1lbnRzIE9ybUdlbmVyYXRvcgogewogCiAJcHJvdGVjdGVkIFN0cmluZyBuYW1lOwogCiAJcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkSW5pdGlhbFZhbHVlOwotCXByb3RlY3RlZCBJbnRlZ2VyIGRlZmF1bHRJbml0aWFsVmFsdWU7CisJcHJvdGVjdGVkIGludCBkZWZhdWx0SW5pdGlhbFZhbHVlOwogCiAJcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkQWxsb2NhdGlvblNpemU7Ci0JcHJvdGVjdGVkIEludGVnZXIgZGVmYXVsdEFsbG9jYXRpb25TaXplOworCXByb3RlY3RlZCBpbnQgZGVmYXVsdEFsbG9jYXRpb25TaXplOwogCi0JcHJvdGVjdGVkIFQgZ2VuZXJhdG9yUmVzb3VyY2U7CisJcHJvdGVjdGVkIFQgcmVzb3VyY2VHZW5lcmF0b3I7CiAKLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1HZW5lcmF0b3IoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7CisKKwlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1HZW5lcmF0b3IoWG1sQ29udGV4dE5vZGUgcGFyZW50KSB7CiAJCXN1cGVyKHBhcmVudCk7CiAJfQogCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5pc1ZpcnR1YWwoKTsKKwlwcm90ZWN0ZWQgVCBnZXRSZXNvdXJjZUdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VHZW5lcmF0b3I7CiAJfQogCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1KcGFDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtSnBhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKKworCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCisKIAlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAJCXJldHVybiB0aGlzLm5hbWU7CiAJfQogCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5zZXROYW1lKG5ld05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5nZXRSZXNvdXJjZUdlbmVyYXRvcigpLnNldE5hbWUobmFtZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwogCX0KIAkKLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKKwlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKIAl9CiAKLQlwdWJsaWMgSW50ZWdlciBnZXRJbml0aWFsVmFsdWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKTsKKworCS8vICoqKioqKioqKiogaW5pdGlhbCB2YWx1ZSAqKioqKioqKioqCisKKwlwdWJsaWMgaW50IGdldEluaXRpYWxWYWx1ZSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlLmludFZhbHVlKCkgOiB0aGlzLmRlZmF1bHRJbml0aWFsVmFsdWU7CiAJfQogCiAJcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkgewogCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWU7CiAJfQogCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIgbmV3U3BlY2lmaWVkSW5pdGlhbFZhbHVlKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkSW5pdGlhbFZhbHVlID0gdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWU7Ci0JCXRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlID0gbmV3U3BlY2lmaWVkSW5pdGlhbFZhbHVlOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldEluaXRpYWxWYWx1ZShuZXdTcGVjaWZpZWRJbml0aWFsVmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9JTklUSUFMX1ZBTFVFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRJbml0aWFsVmFsdWUsIG5ld1NwZWNpZmllZEluaXRpYWxWYWx1ZSk7CisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIgc3BlY2lmaWVkSW5pdGlhbFZhbHVlKSB7CisJCUludGVnZXIgb2xkID0gdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWU7CisJCXRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlID0gc3BlY2lmaWVkSW5pdGlhbFZhbHVlOworCQl0aGlzLmdldFJlc291cmNlR2VuZXJhdG9yKCkuc2V0SW5pdGlhbFZhbHVlKHNwZWNpZmllZEluaXRpYWxWYWx1ZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfSU5JVElBTF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBzcGVjaWZpZWRJbml0aWFsVmFsdWUpOwogCX0KIAkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRJbml0aWFsVmFsdWVfKEludGVnZXIgbmV3U3BlY2lmaWVkSW5pdGlhbFZhbHVlKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkSW5pdGlhbFZhbHVlID0gdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWU7Ci0JCXRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlID0gbmV3U3BlY2lmaWVkSW5pdGlhbFZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9JTklUSUFMX1ZBTFVFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRJbml0aWFsVmFsdWUsIG5ld1NwZWNpZmllZEluaXRpYWxWYWx1ZSk7CisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlXyhJbnRlZ2VyIHNwZWNpZmllZEluaXRpYWxWYWx1ZSkgeworCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlOworCQl0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZSA9IHNwZWNpZmllZEluaXRpYWxWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9JTklUSUFMX1ZBTFVFX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZEluaXRpYWxWYWx1ZSk7CiAJfQogCQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRJbml0aWFsVmFsdWUoKSB7CisJcHVibGljIGludCBnZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkgewogCQlyZXR1cm4gdGhpcy5kZWZhdWx0SW5pdGlhbFZhbHVlOwogCX0KIAkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0SW5pdGlhbFZhbHVlKEludGVnZXIgbmV3RGVmYXVsdEluaXRpYWxWYWx1ZSkgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZEluaXRpYWxWYWx1ZSA9IHRoaXMuZGVmYXVsdEluaXRpYWxWYWx1ZTsKLQkJdGhpcy5kZWZhdWx0SW5pdGlhbFZhbHVlID0gbmV3RGVmYXVsdEluaXRpYWxWYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0lOSVRJQUxfVkFMVUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZEluaXRpYWxWYWx1ZSwgbmV3RGVmYXVsdEluaXRpYWxWYWx1ZSk7CisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEluaXRpYWxWYWx1ZShpbnQgZGVmYXVsdEluaXRpYWxWYWx1ZSkgeworCQlpbnQgb2xkID0gdGhpcy5kZWZhdWx0SW5pdGlhbFZhbHVlOworCQl0aGlzLmRlZmF1bHRJbml0aWFsVmFsdWUgPSBkZWZhdWx0SW5pdGlhbFZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9JTklUSUFMX1ZBTFVFX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRJbml0aWFsVmFsdWUpOwogCX0KIAkKLQlwdWJsaWMgSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpOworCisJLy8gKioqKioqKioqKiBhbGxvY2F0aW9uIHNpemUgKioqKioqKioqKgorCisJcHVibGljIGludCBnZXRBbGxvY2F0aW9uU2l6ZSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZS5pbnRWYWx1ZSgpIDogdGhpcy5kZWZhdWx0QWxsb2NhdGlvblNpemU7CiAJfQogCiAJcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSB7CiAJCXJldHVybiB0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplOwogCX0KIAotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIgbmV3U3BlY2lmaWVkQWxsb2NhdGlvblNpemUpIHsKLQkJSW50ZWdlciBvbGRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSA9IHRoaXMuc3BlY2lmaWVkQWxsb2NhdGlvblNpemU7Ci0JCXRoaXMuc3BlY2lmaWVkQWxsb2NhdGlvblNpemUgPSBuZXdTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZTsKLQkJZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5zZXRBbGxvY2F0aW9uU2l6ZShuZXdTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0FMTE9DQVRJT05fU0laRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQWxsb2NhdGlvblNpemUsIG5ld1NwZWNpZmllZEFsbG9jYXRpb25TaXplKTsKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyIHNwZWNpZmllZEFsbG9jYXRpb25TaXplKSB7CisJCUludGVnZXIgb2xkID0gdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZTsKKwkJdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSA9IHNwZWNpZmllZEFsbG9jYXRpb25TaXplOworCQl0aGlzLmdldFJlc291cmNlR2VuZXJhdG9yKCkuc2V0QWxsb2NhdGlvblNpemUoc3BlY2lmaWVkQWxsb2NhdGlvblNpemUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0FMTE9DQVRJT05fU0laRV9QUk9QRVJUWSwgb2xkLCBzcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSk7CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplXyhJbnRlZ2VyIG5ld1NwZWNpZmllZEFsbG9jYXRpb25TaXplKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkQWxsb2NhdGlvblNpemUgPSB0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplOwotCQl0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplID0gbmV3U3BlY2lmaWVkQWxsb2NhdGlvblNpemU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0FMTE9DQVRJT05fU0laRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQWxsb2NhdGlvblNpemUsIG5ld1NwZWNpZmllZEFsbG9jYXRpb25TaXplKTsKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZV8oSW50ZWdlciBzcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSkgeworCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWxsb2NhdGlvblNpemU7CisJCXRoaXMuc3BlY2lmaWVkQWxsb2NhdGlvblNpemUgPSBzcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFksIG9sZCwgc3BlY2lmaWVkQWxsb2NhdGlvblNpemUpOwogCX0KIAotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEFsbG9jYXRpb25TaXplOworCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCkgeworCQlyZXR1cm4gR2VuZXJhdG9yLkRFRkFVTFRfQUxMT0NBVElPTl9TSVpFOwogCX0KIAkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0QWxsb2NhdGlvblNpemUoSW50ZWdlciBuZXdEZWZhdWx0QWxsb2NhdGlvblNpemUpIHsKLQkJSW50ZWdlciBvbGRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSA9IHRoaXMuZGVmYXVsdEFsbG9jYXRpb25TaXplOwotCQl0aGlzLmRlZmF1bHRBbGxvY2F0aW9uU2l6ZSA9IG5ld0RlZmF1bHRBbGxvY2F0aW9uU2l6ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0FMTE9DQVRJT05fU0laRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQWxsb2NhdGlvblNpemUsIG5ld0RlZmF1bHRBbGxvY2F0aW9uU2l6ZSk7CisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKGludCBkZWZhdWx0QWxsb2NhdGlvblNpemUpIHsKKwkJaW50IG9sZCA9IHRoaXMuZGVmYXVsdEFsbG9jYXRpb25TaXplOworCQl0aGlzLmRlZmF1bHRBbGxvY2F0aW9uU2l6ZSA9IGRlZmF1bHRBbGxvY2F0aW9uU2l6ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUxMT0NBVElPTl9TSVpFX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRBbGxvY2F0aW9uU2l6ZSk7CiAJfQogCisKKwkvLyAqKioqKioqKioqIHRleHQgcmFuZ2VzICoqKioqKioqKioKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJVGV4dFJhbmdlIHZhbGlkYXRpb25UZXh0UmFuZ2UgPSB0aGlzLmdldFJlc291cmNlR2VuZXJhdG9yKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCQlyZXR1cm4gdmFsaWRhdGlvblRleHRSYW5nZSAhPSBudWxsID8gdmFsaWRhdGlvblRleHRSYW5nZSA6IGdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9CiAJCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShUIGdlbmVyYXRvclJlc291cmNlKSB7Ci0JCXRoaXMuZ2VuZXJhdG9yUmVzb3VyY2UgPSBnZW5lcmF0b3JSZXNvdXJjZTsKLQkJdGhpcy5uYW1lID0gdGhpcy5uYW1lKGdlbmVyYXRvclJlc291cmNlKTsKLQkJdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWUgPSB0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZShnZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCXRoaXMuc3BlY2lmaWVkQWxsb2NhdGlvblNpemUgPSB0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplKGdlbmVyYXRvclJlc291cmNlKTsKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCVRleHRSYW5nZSBuYW1lVGV4dFJhbmdlID0gdGhpcy5nZXRSZXNvdXJjZUdlbmVyYXRvcigpLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwkJcmV0dXJuIG5hbWVUZXh0UmFuZ2UgIT0gbnVsbCA/IG5hbWVUZXh0UmFuZ2UgOiBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHJlc291cmNlID0+IGNvbnRleHQgKioqKioqKioqKgorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShUIHhtbFJlc291cmNlR2VuZXJhdG9yKSB7CisJCXRoaXMucmVzb3VyY2VHZW5lcmF0b3IgPSB4bWxSZXNvdXJjZUdlbmVyYXRvcjsKKwkJdGhpcy5uYW1lID0geG1sUmVzb3VyY2VHZW5lcmF0b3IuZ2V0TmFtZSgpOworCQl0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZSA9IHhtbFJlc291cmNlR2VuZXJhdG9yLmdldEluaXRpYWxWYWx1ZSgpOworCQl0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplID0geG1sUmVzb3VyY2VHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKTsKIAkJLy9UT0RPIGRlZmF1bHRzCiAJfQogCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShUIGdlbmVyYXRvclJlc291cmNlKSB7Ci0JCXRoaXMuZ2VuZXJhdG9yUmVzb3VyY2UgPSBnZW5lcmF0b3JSZXNvdXJjZTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLm5hbWUoZ2VuZXJhdG9yUmVzb3VyY2UpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWVfKHRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlKGdlbmVyYXRvclJlc291cmNlKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemVfKHRoaXMuc3BlY2lmaWVkQWxsb2NhdGlvblNpemUoZ2VuZXJhdG9yUmVzb3VyY2UpKTsKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoVCB4bWxSZXNvdXJjZUdlbmVyYXRvcikgeworCQl0aGlzLnJlc291cmNlR2VuZXJhdG9yID0geG1sUmVzb3VyY2VHZW5lcmF0b3I7CisJCXRoaXMuc2V0TmFtZV8oeG1sUmVzb3VyY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWVfKHhtbFJlc291cmNlR2VuZXJhdG9yLmdldEluaXRpYWxWYWx1ZSgpKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZV8oeG1sUmVzb3VyY2VHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKSk7CisJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZEdlbmVyYXRvcih0aGlzKTsKIAkJLy9UT0RPIGRlZmF1bHRzCiAJfQogCQorCisJLy8gKioqKioqKioqKiBkYXRhYmFzZSBzdHVmZiAqKioqKioqKioqCisKKwlwdWJsaWMgU2NoZW1hIGdldERiU2NoZW1hKCkgeworCQlTY2hlbWFDb250YWluZXIgZGJTY2hlbWFDb250YWluZXIgPSB0aGlzLmdldERiU2NoZW1hQ29udGFpbmVyKCk7CisJCXJldHVybiAoZGJTY2hlbWFDb250YWluZXIgPT0gbnVsbCkgPyBudWxsIDogZGJTY2hlbWFDb250YWluZXIuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcih0aGlzLmdldFNjaGVtYSgpKTsKKwl9CisKKwkvKioKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+IGNhdGFsb2cpLAorCSAqIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3M7IGFuZCB3ZSBuZWVkIHRvCisJICogZ2V0IHRoZSBzY2hlbWEgZGlyZWN0bHkgZnJvbSB0aGUgZGF0YWJhc2UuCisJICovCisJcHVibGljIFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcigpIHsKKwkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2coKTsKKwkJcmV0dXJuIChjYXRhbG9nICE9IG51bGwpID8gdGhpcy5nZXREYkNhdGFsb2coY2F0YWxvZykgOiB0aGlzLmdldERhdGFiYXNlKCk7CisJfQorCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRTY2hlbWEoKTsKKworCS8qKgorCSAqIElmIHdlIGRvbid0IGhhdmUgYSBjYXRhbG9nIChpLmUuIHdlIGRvbid0IGV2ZW4gaGF2ZSBhIDxlbT5kZWZhdWx0PC9lbT4KKwkgKiBjYXRhbG9nKSwgdGhlbiB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KKwkgKi8KKwlwdWJsaWMgQ2F0YWxvZyBnZXREYkNhdGFsb2coKSB7CisJCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nKCk7CisJCXJldHVybiAoY2F0YWxvZyA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldERiQ2F0YWxvZyhjYXRhbG9nKTsKKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENhdGFsb2coKTsKKworCisJLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKKworCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKKwkJcmV0dXJuIGdldFJlc291cmNlR2VuZXJhdG9yKCkuaXNWaXJ0dWFsKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoWG1sQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKIAlwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXMoR2VuZXJhdG9yIGdlbmVyYXRvcikgewogCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKIAkJCXJldHVybiBmYWxzZTsKQEAgLTE0NywzMCArMjE4LDE5IEBACiAJCS8vIHRoaXMgaXNuJ3QgaWRlYWwsIGJ1dCBpdCB3aWxsIGhhdmUgdG8gZG8gdW50aWwgd2UgaGF2ZSBmdXJ0aGVyIGFkb3B0ZXIgaW5wdXQKIAkJcmV0dXJuIHRoaXMuZ2V0TmFtZSgpLmVxdWFscyhnZW5lcmF0b3IuZ2V0TmFtZSgpKSAmJiBnZW5lcmF0b3IgaW5zdGFuY2VvZiBKYXZhR2VuZXJhdG9yOwogCX0KLQotCXByb3RlY3RlZCBUIGdldEdlbmVyYXRvclJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3JSZXNvdXJjZTsKKwkKKwlwdWJsaWMgYm9vbGVhbiBkdXBsaWNhdGVzKEdlbmVyYXRvciBvdGhlcikgeworCQlyZXR1cm4gKHRoaXMgIT0gb3RoZXIpCisJCQkJJiYgISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMubmFtZSkKKwkJCQkmJiB0aGlzLm5hbWUuZXF1YWxzKG90aGVyLmdldE5hbWUoKSkKKwkJCQkmJiAhIHRoaXMub3ZlcnJpZGVzKG90aGVyKQorCQkJCSYmICEgb3RoZXIub3ZlcnJpZGVzKHRoaXMpOwogCX0KIAkKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUoWG1sR2VuZXJhdG9yIGdlbmVyYXRvclJlc291cmNlKSB7Ci0JCXJldHVybiBnZW5lcmF0b3JSZXNvdXJjZS5nZXROYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZEluaXRpYWxWYWx1ZShYbWxHZW5lcmF0b3IgZ2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGdlbmVyYXRvclJlc291cmNlLmdldEluaXRpYWxWYWx1ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShYbWxHZW5lcmF0b3IgZ2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGdlbmVyYXRvclJlc291cmNlLmdldEFsbG9jYXRpb25TaXplKCk7CisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzdXBlci50b1N0cmluZyhzYik7CisJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwogCX0KIAotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHZhbGlkYXRpb25UZXh0UmFuZ2UgPSB0aGlzLmdldEdlbmVyYXRvclJlc291cmNlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gdmFsaWRhdGlvblRleHRSYW5nZSAhPSBudWxsID8gdmFsaWRhdGlvblRleHRSYW5nZSA6IGdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgbmFtZVRleHRSYW5nZSA9IHRoaXMuZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5nZXROYW1lVGV4dFJhbmdlKCk7Ci0JCXJldHVybiBuYW1lVGV4dFJhbmdlICE9IG51bGwgPyBuYW1lVGV4dFJhbmdlIDogZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUlkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtSWRNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI0ODIwNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUlkTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsMzM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW5NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0ZWRWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0b3JDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtSWRNYXBwaW5nPFQgZXh0ZW5kcyBYbWxJZD4KKwlleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxUPgorCWltcGxlbWVudHMgT3JtSWRNYXBwaW5nCit7CisJcHJvdGVjdGVkIGZpbmFsIE9ybUNvbHVtbiBjb2x1bW47CisKKwlwcm90ZWN0ZWQgT3JtR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWU7CisJCisJcHJvdGVjdGVkIE9ybUNvbnZlcnRlciBkZWZhdWx0Q29udmVydGVyOworCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIgc3BlY2lmaWVkQ29udmVydGVyOworCQorCXByb3RlY3RlZCBmaW5hbCBPcm1HZW5lcmF0b3JDb250YWluZXIgZ2VuZXJhdG9yQ29udGFpbmVyOworCisJCisJcHJvdGVjdGVkIEFic3RyYWN0T3JtSWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBUIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJCXRoaXMuY29sdW1uID0gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1Db2x1bW4odGhpcywgdGhpcyk7CisJCXRoaXMuY29sdW1uLmluaXRpYWxpemUodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29sdW1uKCkpOy8vVE9ETyBwYXNzIGluIHRvIGNvbnN0cnVjdG9yCisJCXRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyID0gYnVpbGRHZW5lcmF0b3JDb250YWluZXIoKTsKKwkJdGhpcy5pbml0aWFsaXplR2VuZXJhdGVkVmFsdWUoKTsKKwkJdGhpcy5kZWZhdWx0Q29udmVydGVyID0gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1OdWxsQ29udmVydGVyKHRoaXMpOworCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXIodGhpcy5nZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKSk7CisJfQorCisJcHJvdGVjdGVkIE9ybUdlbmVyYXRvckNvbnRhaW5lciBidWlsZEdlbmVyYXRvckNvbnRhaW5lcigpIHsKKwkJcmV0dXJuIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtR2VuZXJhdG9yQ29udGFpbmVyKHRoaXMsIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCisJcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgeworCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtSWRNYXBwaW5nKHRoaXMpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tT3JtQ29sdW1uTWFwcGluZyhPcm1Db2x1bW5NYXBwaW5nIG9sZE1hcHBpbmcpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZUZyb21Pcm1Db2x1bW5NYXBwaW5nKG9sZE1hcHBpbmcpOworCQlnZXRDb2x1bW4oKS5pbml0aWFsaXplRnJvbShvbGRNYXBwaW5nLmdldENvbHVtbigpKTsKKwl9CisKKwkKKwlwdWJsaWMgT3JtQ29sdW1uIGdldENvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uOworCX0KKwkKKwlwdWJsaWMgT3JtQ29udmVydGVyIGdldENvbnZlcnRlcigpIHsKKwkJcmV0dXJuIGdldFNwZWNpZmllZENvbnZlcnRlcigpID09IG51bGwgPyBnZXREZWZhdWx0Q29udmVydGVyKCkgOiBnZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKTsKKwl9CisJCisJcHVibGljIE9ybUNvbnZlcnRlciBnZXREZWZhdWx0Q29udmVydGVyKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q29udmVydGVyOworCX0KKwkKKwlwdWJsaWMgT3JtQ29udmVydGVyIGdldFNwZWNpZmllZENvbnZlcnRlcigpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ29udmVydGVyOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNpZmVkQ29udmVydGVyVHlwZSgpIHsKKwkJaWYgKHRoaXMuc3BlY2lmaWVkQ29udmVydGVyID09IG51bGwpIHsKKwkJCXJldHVybiBDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSOworCQl9CisJCXJldHVybiB0aGlzLnNwZWNpZmllZENvbnZlcnRlci5nZXRUeXBlKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENvbnZlcnRlcihTdHJpbmcgY29udmVydGVyVHlwZSkgeworCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChnZXRTcGVjaWZlZENvbnZlcnRlclR5cGUoKSwgY29udmVydGVyVHlwZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlPcm1Db252ZXJ0ZXIgb2xkQ29udmVydGVyID0gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXI7CisJCU9ybUNvbnZlcnRlciBuZXdDb252ZXJ0ZXIgPSBidWlsZFNwZWNpZmllZENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlKTsKKwkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXIgPSBudWxsOworCQlpZiAob2xkQ29udmVydGVyICE9IG51bGwpIHsKKwkJCW9sZENvbnZlcnRlci5yZW1vdmVGcm9tUmVzb3VyY2VNb2RlbCgpOworCQl9CisJCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyID0gbmV3Q29udmVydGVyOworCQlpZiAobmV3Q29udmVydGVyICE9IG51bGwpIHsKKwkJCW5ld0NvbnZlcnRlci5hZGRUb1Jlc291cmNlTW9kZWwoKTsKKwkJfQorCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFksIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ29udmVydGVyKE9ybUNvbnZlcnRlciBuZXdDb252ZXJ0ZXIpIHsKKwkJT3JtQ29udmVydGVyIG9sZENvbnZlcnRlciA9IHRoaXMuc3BlY2lmaWVkQ29udmVydGVyOworCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlciA9IG5ld0NvbnZlcnRlcjsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ09OVkVSVEVSX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXIsIG5ld0NvbnZlcnRlcik7CisJfQorCisJcHVibGljIE9ybUdlbmVyYXRlZFZhbHVlIGFkZEdlbmVyYXRlZFZhbHVlKCkgeworCQlpZiAoZ2V0R2VuZXJhdGVkVmFsdWUoKSAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZW1lcmF0ZWRWYWx1ZSBhbHJlYWR5IGV4aXN0cyIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJWG1sR2VuZXJhdGVkVmFsdWUgcmVzb3VyY2VHZW5lcmF0ZWRWYWx1ZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEdlbmVyYXRlZFZhbHVlKCk7CisJCXRoaXMuZ2VuZXJhdGVkVmFsdWUgPSBidWlsZEdlbmVyYXRlZFZhbHVlKHJlc291cmNlR2VuZXJhdGVkVmFsdWUpOworCQl0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5zZXRHZW5lcmF0ZWRWYWx1ZShyZXNvdXJjZUdlbmVyYXRlZFZhbHVlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChHRU5FUkFURURfVkFMVUVfUFJPUEVSVFksIG51bGwsIHRoaXMuZ2VuZXJhdGVkVmFsdWUpOworCQlyZXR1cm4gdGhpcy5nZW5lcmF0ZWRWYWx1ZTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlR2VuZXJhdGVkVmFsdWUoKSB7CisJCWlmIChnZXRHZW5lcmF0ZWRWYWx1ZSgpID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdlbWVyYXRlZFZhbHVlIGRvZXMgbm90IGV4aXN0LCBjYW5ub3QgYmUgcmVtb3ZlZCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJT3JtR2VuZXJhdGVkVmFsdWUgb2xkR2VuZXJhdGVkVmFsdWUgPSB0aGlzLmdlbmVyYXRlZFZhbHVlOworCQl0aGlzLmdlbmVyYXRlZFZhbHVlID0gbnVsbDsKKwkJdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuc2V0R2VuZXJhdGVkVmFsdWUobnVsbCk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZLCBvbGRHZW5lcmF0ZWRWYWx1ZSwgbnVsbCk7CisJfQorCQorCXB1YmxpYyBPcm1HZW5lcmF0ZWRWYWx1ZSBnZXRHZW5lcmF0ZWRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVkVmFsdWU7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldEdlbmVyYXRlZFZhbHVlKE9ybUdlbmVyYXRlZFZhbHVlIG5ld0dlbmVyYXRlZFZhbHVlKSB7CisJCU9ybUdlbmVyYXRlZFZhbHVlIG9sZEdlbmVyYXRlZFZhbHVlID0gdGhpcy5nZW5lcmF0ZWRWYWx1ZTsKKwkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IG5ld0dlbmVyYXRlZFZhbHVlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSwgb2xkR2VuZXJhdGVkVmFsdWUsIG5ld0dlbmVyYXRlZFZhbHVlKTsKKwl9CisJCisJcHVibGljIE9ybUdlbmVyYXRvckNvbnRhaW5lciBnZXRHZW5lcmF0b3JDb250YWluZXIoKSB7CisJCXJldHVybiB0aGlzLmdlbmVyYXRvckNvbnRhaW5lcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW4oKS5nZXROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmcoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzSWRNYXBwaW5nKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkVG9SZXNvdXJjZU1vZGVsKEF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7CisJCXJlc291cmNlQXR0cmlidXRlcy5nZXRJZHMoKS5hZGQodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0SWRzKCkucmVtb3ZlKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisKKwlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7CisJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldERiVGFibGUodGFibGVOYW1lKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewkJCisJCXJldHVybiBnZXROYW1lKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgeworCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7CisJfQorCQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYXRlZFZhbHVlKCkgeworCQlpZiAodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSAhPSBudWxsKSB7CisJCQl0aGlzLmdlbmVyYXRlZFZhbHVlID0gYnVpbGRHZW5lcmF0ZWRWYWx1ZSh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgT3JtR2VuZXJhdGVkVmFsdWUgYnVpbGRHZW5lcmF0ZWRWYWx1ZShYbWxHZW5lcmF0ZWRWYWx1ZSByZXNvdXJjZUdlbmVyYXRlZFZhbHVlKSB7CisJCXJldHVybiBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUdlbmVyYXRlZFZhbHVlKHRoaXMsIHJlc291cmNlR2VuZXJhdGVkVmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLmNvbHVtbi51cGRhdGUoZ2V0UmVzb3VyY2VDb2x1bW4oKSk7CisJCXRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyLnVwZGF0ZSgpOworCQl0aGlzLnVwZGF0ZUdlbmVyYXRlZFZhbHVlKCk7CisJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGdldFJlc291cmNlQ29udmVydGVyVHlwZSgpLCBnZXRTcGVjaWZlZENvbnZlcnRlclR5cGUoKSkpIHsKKwkJCWdldFNwZWNpZmllZENvbnZlcnRlcigpLnVwZGF0ZSgpOworCQl9CisJCWVsc2UgeworCQkJc2V0U3BlY2lmaWVkQ29udmVydGVyKGJ1aWxkU3BlY2lmaWVkQ29udmVydGVyKGdldFJlc291cmNlQ29udmVydGVyVHlwZSgpKSk7CisJCX0KKwl9CisJCisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlR2VuZXJhdGVkVmFsdWUoKSB7CisJCWlmICh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpID09IG51bGwpIHsKKwkJCWlmIChnZXRHZW5lcmF0ZWRWYWx1ZSgpICE9IG51bGwpIHsKKwkJCQlzZXRHZW5lcmF0ZWRWYWx1ZShudWxsKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWlmIChnZXRHZW5lcmF0ZWRWYWx1ZSgpID09IG51bGwpIHsKKwkJCQlzZXRHZW5lcmF0ZWRWYWx1ZShidWlsZEdlbmVyYXRlZFZhbHVlKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWdldEdlbmVyYXRlZFZhbHVlKCkudXBkYXRlKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOworCQkJfQorCQl9CisJfQorCQorCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIgYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlclR5cGUpIHsKKwkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwoY29udmVydGVyVHlwZSwgQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUikpIHsKKwkJCXJldHVybiBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVRlbXBvcmFsQ29udmVydGVyKHRoaXMsIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKSB7CisJCWlmICh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5nZXRUZW1wb3JhbCgpICE9IG51bGwpIHsKKwkJCXJldHVybiBDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSOworCQl9CisJCQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvLyoqKioqKioqKioqKioqKioqIFhtbENvbHVtbi5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFhtbENvbHVtbiBnZXRSZXNvdXJjZUNvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLmdldENvbHVtbigpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZUNvbHVtbigpIHsKKwkJdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VDb2x1bW4oKSB7CisJCXRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLnNldENvbHVtbihudWxsKTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQkKKwkJaWYgKHRoaXMuc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKSkgeworCQkJdGhpcy52YWxpZGF0ZUNvbHVtbihtZXNzYWdlcyk7CisJCX0KKwkJaWYgKHRoaXMuZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgeworCQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl9CisJCXRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29sdW1uKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGEgPSB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwkJU3RyaW5nIHRhYmxlTmFtZSA9IHRoaXMuY29sdW1uLmdldFRhYmxlKCk7CisJCWlmICh0aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSkpIHsKKwkJCWlmIChwYS5pc1ZpcnR1YWwoKSkgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAorCQkJCQkJbmV3IFN0cmluZ1tdIHtwYS5nZXROYW1lKCksIHRhYmxlTmFtZSwgdGhpcy5jb2x1bW4uZ2V0TmFtZSgpfSwKKwkJCQkJCXRoaXMuY29sdW1uLCAKKwkJCQkJCXRoaXMuY29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKCkKKwkJCQkJKQorCQkJCSk7CisJCQl9IGVsc2UgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAorCQkJCQkJbmV3IFN0cmluZ1tdIHt0YWJsZU5hbWUsIHRoaXMuY29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQkJdGhpcy5jb2x1bW4sIAorCQkJCQkJdGhpcy5jb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoKQorCQkJCQkpCisJCQkJKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKCAhIHRoaXMuY29sdW1uLmlzUmVzb2x2ZWQoKSAmJiB0aGlzLmNvbHVtbi5nZXREYlRhYmxlKCkgIT0gbnVsbCkgeworCQkJaWYgKHBhLmlzVmlydHVhbCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7cGEuZ2V0TmFtZSgpLCB0aGlzLmNvbHVtbi5nZXROYW1lKCl9LCAKKwkJCQkJCXRoaXMuY29sdW1uLCAKKwkJCQkJCXRoaXMuY29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoKQorCQkJCQkpCisJCQkJKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5jb2x1bW4uZ2V0TmFtZSgpfSwgCisJCQkJCQl0aGlzLmNvbHVtbiwgCisJCQkJCQl0aGlzLmNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKCkKKwkJCQkJKQorCQkJCSk7CisJCQl9CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWIyNGU4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsNDA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW5zTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IAorCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneQoreworCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uOworCQorCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBuZXcgVmVjdG9yPE9ybUpvaW5Db2x1bW4+KCk7CisKKwlwcm90ZWN0ZWQgZmluYWwgT3JtSm9pbkNvbHVtbi5Pd25lciBqb2luQ29sdW1uT3duZXI7CisJCisJcHJvdGVjdGVkIFhtbEpvaW5Db2x1bW5zTWFwcGluZyByZXNvdXJjZTsKKwkKKwkKKwlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KAorCQkJSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcGFyZW50LAorCQkJWG1sSm9pbkNvbHVtbnNNYXBwaW5nIHJlc291cmNlKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKwkJdGhpcy5qb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbk93bmVyKCk7CisJCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCXRoaXMuaW5pdGlhbGl6ZURlZmF1bHRKb2luQ29sdW1uKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgb2xkU3RyYXRlZ3kpIHsKKwkJZm9yIChKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob2xkU3RyYXRlZ3kuam9pbkNvbHVtbnMoKSkpIHsKKwkJCUpvaW5Db2x1bW4gbmV3Sm9pbkNvbHVtbiA9IHRoaXMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJCW5ld0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShqb2luQ29sdW1uLmdldE5hbWUoKSk7CisJCQluZXdKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CQkJCisJCX0KKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IE9ybUpvaW5Db2x1bW4uT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKTsKKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7CisJCWZvciAoWG1sSm9pbkNvbHVtbiByZXNvdXJjZUpvaW5Db2x1bW4gOiB0aGlzLnJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkpIHsKKwkJCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuYWRkKGJ1aWxkSm9pbkNvbHVtbihyZXNvdXJjZUpvaW5Db2x1bW4pKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdEpvaW5Db2x1bW4oKSB7CisJCWlmIChtYXlIYXZlRGVmYXVsdEpvaW5Db2x1bW4oKSkgeworCQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9IHRoaXMuYnVpbGRKb2luQ29sdW1uKG51bGwpOworCQl9CisJfQkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisJCisJcHVibGljIEpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7CisJCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkU3RyYXRlZ3koKSB7CisJCWlmIChzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSA9PSAwKSB7CisJCQlhZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZVN0cmF0ZWd5KCkgeworCQlmb3IgKEpvaW5Db2x1bW4gZWFjaCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzcGVjaWZpZWRKb2luQ29sdW1ucygpKSkgeworCQkJcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihlYWNoKTsKKwkJfQorCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGpvaW4gY29sdW1ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA/IAorCQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucygpIDogdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbnMoKTsKKwl9CisJCisJcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyAKKwkJCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmRlZmF1bHRKb2luQ29sdW1uc1NpemUoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBkZWZhdWx0IGpvaW4gY29sdW1uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbjsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEpvaW5Db2x1bW4oT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCU9ybUpvaW5Db2x1bW4gb2xkID0gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbjsKKwkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9IGpvaW5Db2x1bW47CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0pPSU5fQ09MVU1OX1BST1BFUlRZLCBvbGQsIGpvaW5Db2x1bW4pOworCX0KKwkKKwlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGRlZmF1bHRKb2luQ29sdW1ucygpIHsKKwkJaWYgKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4pOworCQl9CisJCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgaW50IGRlZmF1bHRKb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHNwZWNpZmllZCBqb2luIGNvbHVtbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKTsKKwl9CisKKwlwdWJsaWMgaW50IHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuc2l6ZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gISB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKKwl9CisKKwlwdWJsaWMgT3JtSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgeworCQlPcm1Kb2luQ29sdW1uIG9sZERlZmF1bHRKb2luQ29sdW1uID0gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbjsKKwkJaWYgKG9sZERlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKKwkJCS8vbnVsbCB0aGUgZGVmYXVsdCBqb2luIGNvbHVtbiBub3cgaWYgb25lIGFscmVhZHkgZXhpc3RzLgorCQkJLy9pZiBvbmUgZG9lcyBub3QgZXhpc3QsIHRoZXJlIGlzIGFscmVhZHkgYSBzcGVjaWZpZWQgam9pbiBjb2x1bW4uCisJCQkvL1JlbW92ZSBpdCBub3cgc28gdGhhdCBpdCBkb2Vzbid0IGdldCByZW1vdmVkIGR1cmluZyBhbiB1cGRhdGUgYW5kCisJCQkvL2NhdXNlIGNoYW5nZSBub3RpZmljYXRpb25zIHRvIGJlIHNlbnQgdG8gdGhlIFVJIGluIHRoZSB3cm9uZyBvcmRlcgorCQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9IG51bGw7CisJCX0KKwkJWG1sSm9pbkNvbHVtbiByZXNvdXJjZUpvaW5Db2x1bW4gPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCk7CisJCU9ybUpvaW5Db2x1bW4gY29udGV4dEpvaW5Db2x1bW4gPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbihyZXNvdXJjZUpvaW5Db2x1bW4pOworCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmFkZChpbmRleCwgY29udGV4dEpvaW5Db2x1bW4pOworCQl0aGlzLnJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuYWRkKGluZGV4LCByZXNvdXJjZUpvaW5Db2x1bW4pOworCQl0aGlzLmZpcmVJdGVtQWRkZWQoU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgY29udGV4dEpvaW5Db2x1bW4pOworCQlpZiAob2xkRGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgeworCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSk9JTl9DT0xVTU5fUFJPUEVSVFksIG9sZERlZmF1bHRKb2luQ29sdW1uLCBudWxsKTsKKwkJfQorCQlyZXR1cm4gY29udGV4dEpvaW5Db2x1bW47CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgsIE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIFNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJdGhpcy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuc2l6ZSgpLCBqb2luQ29sdW1uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQl0aGlzLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5pbmRleE9mKGpvaW5Db2x1bW4pKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKKwkJT3JtSm9pbkNvbHVtbiByZW1vdmVkSm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKKwkJaWYgKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuaXNFbXB0eSgpKSB7CisJCQkvL2NyZWF0ZSB0aGUgZGVmYXVsdEpvaW5Db2x1bW4gbm93IG9yIHRoaXMgd2lsbCBoYXBwZW4gZHVyaW5nIHByb2plY3QgdXBkYXRlIAorCQkJLy9hZnRlciByZW1vdmluZyB0aGUgam9pbiBjb2x1bW4gZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuIFRoYXQgY2F1c2VzIHByb2JsZW1zIAorCQkJLy9pbiB0aGUgVUkgYmVjYXVzZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgZW5kIHVwIGluIHRoZSB3cm9uZyBvcmRlci4KKwkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbihudWxsKTsKKwkJfQorCQl0aGlzLnJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKGluZGV4KTsKKwkJdGhpcy5maXJlSXRlbVJlbW92ZWQoU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcmVtb3ZlZEpvaW5Db2x1bW4pOworCQlpZiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7CisJCQkvL2ZpcmUgY2hhbmdlIG5vdGlmaWNhdGlvbiBpZiBhIGRlZmF1bHRKb2luQ29sdW1uIHdhcyBjcmVhdGVkIGFib3ZlCisJCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9KT0lOX0NPTFVNTl9QUk9QRVJUWSwgbnVsbCwgdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbik7CQkKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW5fKE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQlyZW1vdmVJdGVtRnJvbUxpc3Qoam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKTsKKwl9CisJCisJcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJdGhpcy5yZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJZmlyZUl0ZW1Nb3ZlZChTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKKwl9CisJCisJcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW4gYnVpbGRKb2luQ29sdW1uKFhtbEpvaW5Db2x1bW4gcmVzb3VyY2VKb2luQ29sdW1uKSB7CisJCXJldHVybiB0aGlzLmdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtSm9pbkNvbHVtbih0aGlzLCB0aGlzLmpvaW5Db2x1bW5Pd25lciwgcmVzb3VyY2VKb2luQ29sdW1uKTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZSA9PiBjb250ZXh0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJdXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJdXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4oKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7CisJCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBYTUwgam9pbiBjb2x1bW5zICh0byBwcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24pCisJCUl0ZXJhdG9yPFhtbEpvaW5Db2x1bW4+IHhtbEpvaW5Db2x1bW5zID0gCisJCQluZXcgQ2xvbmVJdGVyYXRvcjxYbWxKb2luQ29sdW1uPih0aGlzLnJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkpOworCQkKKwkJZm9yIChJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBjb250ZXh0Sm9pbkNvbHVtbnMgPSB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7IAorCQkJCWNvbnRleHRKb2luQ29sdW1ucy5oYXNOZXh0KCk7ICkgeworCQkJT3JtSm9pbkNvbHVtbiBjb250ZXh0Sm9pbkNvbHVtbiA9IGNvbnRleHRKb2luQ29sdW1ucy5uZXh0KCk7CisJCQlpZiAoeG1sSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7CisJCQkJY29udGV4dEpvaW5Db2x1bW4udXBkYXRlKHhtbEpvaW5Db2x1bW5zLm5leHQoKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uXyhjb250ZXh0Sm9pbkNvbHVtbik7CisJCQl9CisJCX0KKwkJCisJCXdoaWxlICh4bWxKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKKwkJCWFkZFNwZWNpZmllZEpvaW5Db2x1bW4oYnVpbGRKb2luQ29sdW1uKHhtbEpvaW5Db2x1bW5zLm5leHQoKSkpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRKb2luQ29sdW1uKCkgeworCQlpZiAobWF5SGF2ZURlZmF1bHRKb2luQ29sdW1uKCkpIHsKKwkJCWlmICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IG51bGwpIHsKKwkJCQl0aGlzLnNldERlZmF1bHRKb2luQ29sdW1uKHRoaXMuYnVpbGRKb2luQ29sdW1uKG51bGwpKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbi51cGRhdGUobnVsbCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aGlzLnNldERlZmF1bHRKb2luQ29sdW1uKG51bGwpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pbkNvbHVtbigpIHsKKwkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLm1heUhhdmVEZWZhdWx0Sm9pbkNvbHVtbigpCisJCQkmJiAhIGhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCWlmIChnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKSkgeworCQkJZm9yIChJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBzdHJlYW0gPSB0aGlzLmpvaW5Db2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJCXRoaXMudmFsaWRhdGVKb2luQ29sdW1uKHN0cmVhbS5uZXh0KCksIG1lc3NhZ2VzKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUpvaW5Db2x1bW4oT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlpZiAoZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKGpvaW5Db2x1bW4uZ2V0VGFibGUoKSkpIHsKKwkJCWlmICh0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAorCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0TmFtZSgpLCBqb2luQ29sdW1uLmdldFRhYmxlKCksIGpvaW5Db2x1bW4uZ2V0TmFtZSgpfSwKKwkJCQkJCWpvaW5Db2x1bW4sCisJCQkJCQlqb2luQ29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKCkKKwkJCQkJKQorCQkJCSk7CisJCQl9IAorCQkJZWxzZSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7am9pbkNvbHVtbi5nZXRUYWJsZSgpLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQkJam9pbkNvbHVtbiwgCisJCQkJCQlqb2luQ29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKCkKKwkJCQkJKQorCQkJCSk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkJdmFsaWRhdGVKb2luQ29sdW1uTmFtZShqb2luQ29sdW1uLCBtZXNzYWdlcyk7CisJCXZhbGlkYXRpb25Kb2luQ29sdW1uUmVmZXJlbmNlZENvbHVtbk5hbWUoam9pbkNvbHVtbiwgbWVzc2FnZXMpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUpvaW5Db2x1bW5OYW1lKE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKKwkJaWYgKCAhIGpvaW5Db2x1bW4uaXNSZXNvbHZlZCgpICYmIGpvaW5Db2x1bW4uZ2V0RGJUYWJsZSgpICE9IG51bGwpIHsKKwkJCWlmIChqb2luQ29sdW1uLmdldE5hbWUoKSAhPSBudWxsKSB7CisJCQkJaWYgKGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKKwkJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAorCQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldE5hbWUoKSwgam9pbkNvbHVtbi5nZXROYW1lKCl9LCAKKwkJCQkJCQlqb2luQ29sdW1uLCAKKwkJCQkJCQlqb2luQ29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoKQorCQkJCQkJKQorCQkJCQkpOworCQkJCX0gZWxzZSB7CisJCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJCQluZXcgU3RyaW5nW10ge2pvaW5Db2x1bW4uZ2V0TmFtZSgpfSwgCisJCQkJCQkJam9pbkNvbHVtbiwgCisJCQkJCQkJam9pbkNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKCkKKwkJCQkJCSkKKwkJCQkJKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChqb2luQ29sdW1uLmdldE93bmVyKCkuam9pbkNvbHVtbnNTaXplKCkgPiAxKSB7CisJCQkJaWYgKGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKKwkJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUywKKwkJCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0TmFtZSgpfSwgCisJCQkJCQkJCWpvaW5Db2x1bW4sCisJCQkJCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZVRleHRSYW5nZSgpCisJCQkJCQkJKQorCQkJCQkJKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRV9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsCisJCQkJCQkJCWpvaW5Db2x1bW4sCisJCQkJCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZVRleHRSYW5nZSgpCisJCQkJCQkJKQorCQkJCQkJKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGlvbkpvaW5Db2x1bW5SZWZlcmVuY2VkQ29sdW1uTmFtZShPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4sIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7CisJCWlmICggISBqb2luQ29sdW1uLmlzUmVmZXJlbmNlZENvbHVtblJlc29sdmVkKCkgJiYgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpICE9IG51bGwpIHsKKwkJCWlmIChqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgIT0gbnVsbCkgeworCQkJCWlmIChnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7CisJCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJCQluZXcgU3RyaW5nW10ge2dldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSwgam9pbkNvbHVtbi5nZXROYW1lKCl9LCAKKwkJCQkJCQlqb2luQ29sdW1uLCAKKwkJCQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCkKKwkJCQkJCSkKKwkJCQkJKTsKKwkJCQl9IGVsc2UgeworCQkJCQltZXNzYWdlcy5hZGQoCisJCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCisJCQkJCQkJbmV3IFN0cmluZ1tdIHtqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCksIGpvaW5Db2x1bW4uZ2V0TmFtZSgpfSwgCisJCQkJCQkJam9pbkNvbHVtbiwgCisJCQkJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpCisJCQkJCQkpCisJCQkJCSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRPd25lcigpLmpvaW5Db2x1bW5zU2l6ZSgpID4gMSkgeworCQkJCWlmIChnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7CisJCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRV9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsCisJCQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldE5hbWUoKSwgam9pbkNvbHVtbi5nZXROYW1lKCl9LCAKKwkJCQkJCQkJam9pbkNvbHVtbiwKKwkJCQkJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpCisJCQkJCQkJKQorCQkJCQkJKTsJCQkJCQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUywKKwkJCQkJCQkJam9pbkNvbHVtbiwKKwkJCQkJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpCisJCQkJCQkJKQorCQkJCQkJKTsKKwkJCQl9CisJCQl9CQkJCisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4N2U0MQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSAKKwlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIE9ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneQoreworCXByb3RlY3RlZCBPcm1Kb2luVGFibGUgam9pblRhYmxlOworCQorCQorCXByb3RlY3RlZCBBYnN0cmFjdE9ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgKKwkJCUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQkKKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgb2xkU3RyYXRlZ3kpIHsKKwkJSm9pblRhYmxlIG9sZEpvaW5UYWJsZSA9IChvbGRTdHJhdGVneS5nZXRKb2luVGFibGUoKSk7CisJCWlmIChvbGRKb2luVGFibGUgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRTdHJhdGVneSgpOworCQkJdGhpcy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKG9sZEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOworCQkJdGhpcy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWRTY2hlbWEob2xkSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKKwkJCXRoaXMuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZShvbGRKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJfQorCX0JCisJCisJQE92ZXJyaWRlCisJcHVibGljIEpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiB0aGlzLmdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0Sm9pblRhYmxlRGVmYXVsdE5hbWUoKSB7CisJCXJldHVybiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luVGFibGVEZWZhdWx0TmFtZSh0aGlzLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkU3RyYXRlZ3koKSB7CisJCWlmICh0aGlzLmpvaW5UYWJsZSA9PSBudWxsKSB7CisJCQlYbWxKb2luVGFibGUgcmVzb3VyY2VKb2luVGFibGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKTsKKwkJCXRoaXMuam9pblRhYmxlID0gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1Kb2luVGFibGUodGhpcywgcmVzb3VyY2VKb2luVGFibGUpOworCQkJc2V0UmVzb3VyY2VKb2luVGFibGUocmVzb3VyY2VKb2luVGFibGUpOworCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpPSU5fVEFCTEVfUFJPUEVSVFksIG51bGwsIHRoaXMuam9pblRhYmxlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVTdHJhdGVneSgpIHsKKwkJaWYgKHRoaXMuam9pblRhYmxlICE9IG51bGwpIHsKKwkJCU9ybUpvaW5UYWJsZSBvbGRKb2luVGFibGUgPSB0aGlzLmpvaW5UYWJsZTsKKwkJCXRoaXMuam9pblRhYmxlID0gbnVsbDsKKwkJCXJlbW92ZVJlc291cmNlSm9pblRhYmxlKCk7CisJCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSk9JTl9UQUJMRV9QUk9QRVJUWSwgb2xkSm9pblRhYmxlLCBudWxsKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRSZXNvdXJjZUpvaW5UYWJsZShYbWxKb2luVGFibGUgcmVzb3VyY2VKb2luVGFibGUpOworCisJCisJLy8gKioqKioqKioqKioqKioqKiBqb2luIHRhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBPcm1Kb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5qb2luVGFibGU7CisJfQorCQorCXB1YmxpYyBPcm1Kb2luVGFibGUgYWRkSm9pblRhYmxlKCkgeworCQlhZGRTdHJhdGVneSgpOworCQlyZXR1cm4gdGhpcy5qb2luVGFibGU7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldEpvaW5UYWJsZV8oT3JtSm9pblRhYmxlIG5ld0pvaW5UYWJsZSkgeworCQlPcm1Kb2luVGFibGUgb2xkSm9pblRhYmxlID0gdGhpcy5qb2luVGFibGU7CisJCXRoaXMuam9pblRhYmxlID0gbmV3Sm9pblRhYmxlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSk9JTl9UQUJMRV9QUk9QRVJUWSwgb2xkSm9pblRhYmxlLCBuZXdKb2luVGFibGUpOworCX0KKwkKKwlwdWJsaWMgWG1sSm9pblRhYmxlIGFkZFJlc291cmNlSm9pblRhYmxlKCkgeworCQlYbWxKb2luVGFibGUgcmVzb3VyY2VKb2luVGFibGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKTsKKwkJc2V0UmVzb3VyY2VKb2luVGFibGUocmVzb3VyY2VKb2luVGFibGUpOworCQlyZXR1cm4gcmVzb3VyY2VKb2luVGFibGU7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIG1heUhhdmVKb2luVGFibGUoKSB7CisJCXJldHVybiBnZXRSZXNvdXJjZUpvaW5UYWJsZSgpICE9IG51bGwgCisJCQl8fCBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5tYXlIYXZlRGVmYXVsdEpvaW5UYWJsZSgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIC0+IGNvbnRleHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJaWYgKG1heUhhdmVKb2luVGFibGUoKSkgeworCQkJdGhpcy5qb2luVGFibGUgPSBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUpvaW5UYWJsZSh0aGlzLCBnZXRSZXNvdXJjZUpvaW5UYWJsZSgpKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCWlmIChtYXlIYXZlSm9pblRhYmxlKCkpIHsKKwkJCWlmICh0aGlzLmpvaW5UYWJsZSA9PSBudWxsKSB7CisJCQkJc2V0Sm9pblRhYmxlXyhnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUpvaW5UYWJsZSh0aGlzLCBnZXRSZXNvdXJjZUpvaW5UYWJsZSgpKSk7CisJCQl9CisJCQl0aGlzLmpvaW5UYWJsZS51cGRhdGUoKTsKKwkJfQorCQllbHNlIHsKKwkJCWlmICh0aGlzLmpvaW5UYWJsZSAhPSBudWxsKSB7CisJCQkJLy8gbm8gcmVzb3VyY2UsIHNvIG5vIGNsZWFuIHVwCisJCQkJc2V0Sm9pblRhYmxlXyhudWxsKTsKKwkJCX0KKwkJfQorCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQlpZiAodGhpcy5qb2luVGFibGUgIT0gbnVsbCAmJiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKSkgeworCQkJdGhpcy5qb2luVGFibGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQxZDg4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5BYnN0cmFjdEpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlIGV4dGVuZHMgQWJzdHJhY3RKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIE9ybUpwYUNvbnRleHROb2RlCi17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZShKcGFOb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCS8qKgotCSAqIEFsbCBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvbnMge0BsaW5rICNhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+KX0gCi0JICogc2hvdWxkIGJlIHByZWNlZGVkIGJ5IGEgInN1cGVyIiBjYWxsIHRvIHRoaXMgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU1hbnlUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1NYW55VG9NYW55TWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDQ3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1NYW55VG9NYW55TWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybU1hbnlUb01hbnlNYXBwaW5nPFQgZXh0ZW5kcyBYbWxNYW55VG9NYW55PiAKKwlleHRlbmRzIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nPFQ+CisJaW1wbGVtZW50cyBPcm1NYW55VG9NYW55TWFwcGluZworeworCXByb3RlY3RlZCBBYnN0cmFjdE9ybU1hbnlUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBUIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UgYnVpbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UodGhpcywgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgeworCQlyZXR1cm4gNzA7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgeworCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtTWFueVRvTWFueU1hcHBpbmcodGhpcyk7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFRvUmVzb3VyY2VNb2RlbChBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0TWFueVRvTWFueXMoKS5hZGQodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0TWFueVRvTWFueXMoKS5yZW1vdmUodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiAoT3JtTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgc3VwZXIuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTWFueVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTWFueVRvT25lTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZjczNTkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1NYW55VG9PbmVNYXBwaW5nLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybU1hbnlUb09uZU1hcHBpbmc8VCBleHRlbmRzIFhtbE1hbnlUb09uZT4KKwlleHRlbmRzIEFic3RyYWN0T3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzxUPgorCWltcGxlbWVudHMgT3JtTWFueVRvT25lTWFwcGluZzJfMAoreworCXByb3RlY3RlZCBBYnN0cmFjdE9ybU1hbnlUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFQgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBidWlsZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlKHRoaXMsIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIDQwOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgeworCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtTWFueVRvT25lTWFwcGluZyh0aGlzKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkVG9SZXNvdXJjZU1vZGVsKEF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7CisJCXJlc291cmNlQXR0cmlidXRlcy5nZXRNYW55VG9PbmVzKCkuYWRkKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKKwkJcmVzb3VyY2VBdHRyaWJ1dGVzLmdldE1hbnlUb09uZXMoKS5yZW1vdmUodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIChPcm1NYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UpIHN1cGVyLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU1hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU1hcHBlZFN1cGVyY2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjQ5MmJjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTWFwcGVkU3VwZXJjbGFzcy5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKKworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1NYXBwZWRTdXBlcmNsYXNzIGV4dGVuZHMgQWJzdHJhY3RPcm1UeXBlTWFwcGluZzxYbWxNYXBwZWRTdXBlcmNsYXNzPgorCWltcGxlbWVudHMgT3JtTWFwcGVkU3VwZXJjbGFzcworeworCXByb3RlY3RlZCBTdHJpbmcgaWRDbGFzczsKKwkKKwlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1NYXBwZWRTdXBlcmNsYXNzKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCQl0aGlzLmlkQ2xhc3MgPSB0aGlzLmdldFJlc291cmNlSWRDbGFzc05hbWUodGhpcy5nZXRSZXNvdXJjZUlkQ2xhc3MoKSk7CisJfQorCQorCXB1YmxpYyBKYXZhTWFwcGVkU3VwZXJjbGFzcyBnZXRKYXZhTWFwcGVkU3VwZXJjbGFzcygpIHsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCWlmIChqYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCAmJiBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpIHsKKwkJCXJldHVybiAoSmF2YU1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVGhpcyBjaGVja3MgbWV0YURhdGFDb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nIHRoZSBKYXZhTWFwcGVkU3VwZXJjbGFzcy4KKwkgKiBBcyBmYXIgYXMgZGVmYXVsdHMgYXJlIGNvbmNlcm5lZCwgaWYgbWV0YWRhdGFDb21wbGV0ZSBpcyB0cnVlLCB0aGUgSmF2YU1hcHBlZFN1cGVyY2xhc3MgaXMgaWdub3JlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgSmF2YU1hcHBlZFN1cGVyY2xhc3MgZ2V0SmF2YU1hcHBlZFN1cGVyY2xhc3NGb3JEZWZhdWx0cygpIHsKKwkJaWYgKGlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gZ2V0SmF2YU1hcHBlZFN1cGVyY2xhc3MoKTsKKwl9CisKKwkKKwlwdWJsaWMgY2hhciBnZXRJZENsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKKwkJcmV0dXJuICckJzsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRJZENsYXNzKCkgeworCQlyZXR1cm4gdGhpcy5pZENsYXNzOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRJZENsYXNzKFN0cmluZyBuZXdJZENsYXNzKSB7CisJCVN0cmluZyBvbGRJZENsYXNzID0gdGhpcy5pZENsYXNzOworCQl0aGlzLmlkQ2xhc3MgPSBuZXdJZENsYXNzOworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQob2xkSWRDbGFzcywgbmV3SWRDbGFzcykpIHsKKwkJCWlmICh0aGlzLmdldFJlc291cmNlSWRDbGFzcygpICE9IG51bGwpIHsKKwkJCQl0aGlzLmdldFJlc291cmNlSWRDbGFzcygpLnNldENsYXNzTmFtZShuZXdJZENsYXNzKTsJCQkJCQkKKwkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUlkQ2xhc3MoKS5pc1Vuc2V0KCkpIHsKKwkJCQkJcmVtb3ZlUmVzb3VyY2VJZENsYXNzKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAobmV3SWRDbGFzcyAhPSBudWxsKSB7CisJCQkJYWRkUmVzb3VyY2VJZENsYXNzKCk7CisJCQkJZ2V0UmVzb3VyY2VJZENsYXNzKCkuc2V0Q2xhc3NOYW1lKG5ld0lkQ2xhc3MpOworCQkJfQorCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSURfQ0xBU1NfUFJPUEVSVFksIG9sZElkQ2xhc3MsIG5ld0lkQ2xhc3MpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRJZENsYXNzXyhTdHJpbmcgbmV3SWRDbGFzcykgeworCQlTdHJpbmcgb2xkSWRDbGFzcyA9IHRoaXMuaWRDbGFzczsKKwkJdGhpcy5pZENsYXNzID0gbmV3SWRDbGFzczsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChJRF9DTEFTU19QUk9QRVJUWSwgb2xkSWRDbGFzcywgbmV3SWRDbGFzcyk7CisJfQorCisJcHJvdGVjdGVkIFhtbElkQ2xhc3MgZ2V0UmVzb3VyY2VJZENsYXNzKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLmdldElkQ2xhc3MoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VJZENsYXNzKCkgeworCQl0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcuc2V0SWRDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxJZENsYXNzKCkpOwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlSWRDbGFzcygpIHsKKwkJdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLnNldElkQ2xhc3MobnVsbCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZOworCX0KKworCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB7CisJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7CisJfQorCisJcHVibGljIEl0ZXJhdG9yPFRhYmxlPiBhc3NvY2lhdGVkVGFibGVzKCkgeworCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOworCX0KKworCXB1YmxpYyBJdGVyYXRvcjxUYWJsZT4gYXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpIHsKKwkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwl9CisKKwlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgeworCQlyZXR1cm4gMDsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkVG9SZXNvdXJjZU1vZGVsKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7CisJCWVudGl0eU1hcHBpbmdzLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmFkZCh0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgeworCQllbnRpdHlNYXBwaW5ncy5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5yZW1vdmUodGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRJZENsYXNzXyh0aGlzLmdldFJlc291cmNlSWRDbGFzc05hbWUodGhpcy5nZXRSZXNvdXJjZUlkQ2xhc3MoKSkpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VJZENsYXNzTmFtZShYbWxJZENsYXNzIGlkQ2xhc3NSZXNvdXJjZSkgeworCQlyZXR1cm4gaWRDbGFzc1Jlc291cmNlID09IG51bGwgPyBudWxsIDogaWRDbGFzc1Jlc291cmNlLmdldENsYXNzTmFtZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKaW5kZXggZTI4M2JhZi4uZTk3NDM0ZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwzNjYgKzksMzc5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Ob25Pd25pbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CiAKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nPFQgZXh0ZW5kcyBYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc+CisvKioKKyAqIE9STSBtdWx0aS1yZWxhdGlvbnNoaXAgKG06bSwgMTptKSBtYXBwaW5nCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzxUIGV4dGVuZHMgQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc+CiAJZXh0ZW5kcyBBYnN0cmFjdE9ybVJlbGF0aW9uc2hpcE1hcHBpbmc8VD4KIAlpbXBsZW1lbnRzIE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZwogewotCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWRCeTsKLQotCXByb3RlY3RlZCBTdHJpbmcgb3JkZXJCeTsvL1RPRE8gY2hhbmdlIHRoaXMgdG8gZGVmYXVsdE9yZGVyQnkgYW5kIHNwZWNpZmllZE9yZGVyQnk/Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vT3JkZXJpbmc7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BrT3JkZXJpbmc7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1c3RvbU9yZGVyaW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUpvaW5UYWJsZSBqb2luVGFibGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcEtleTsKLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmpvaW5UYWJsZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybUpvaW5UYWJsZSh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVhtbE11bGl0UmVsYXRpb25zaGlwTWFwcGluZyhPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgb2xkTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVhtbE11bGl0UmVsYXRpb25zaGlwTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJZ2V0Sm9pblRhYmxlKCkuaW5pdGlhbGl6ZUZyb20ob2xkTWFwcGluZy5nZXRKb2luVGFibGUoKSk7CisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRPcmRlckJ5OworCXByb3RlY3RlZCBib29sZWFuIG5vT3JkZXJpbmcgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBwa09yZGVyaW5nID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gY3VzdG9tT3JkZXJpbmcgPSBmYWxzZTsKKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE1hcEtleTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBub01hcEtleSA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHBrTWFwS2V5ID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gY3VzdG9tTWFwS2V5ID0gZmFsc2U7CisJCisJCisJcHJvdGVjdGVkIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBUIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJCXRoaXMuaW5pdGlhbGl6ZU9yZGVyQnkoKTsKKwkJdGhpcy5pbml0aWFsaXplTWFwS2V5KCk7CiAJfQogCQotCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKSB7Ci0JCXJldHVybiBnZXRNYXBwZWRCeSgpID09IG51bGw7CisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy51cGRhdGVPcmRlckJ5KCk7CisJCXRoaXMudXBkYXRlTWFwS2V5KCk7CiAJfQotCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZURlZmF1bHRUYXJnZXRFbnRpdHkoKSB7CisJCXJldHVybiB0aGlzLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TXVsdGlSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSgpOworCX0KKwkKIAlwdWJsaWMgRmV0Y2hUeXBlIGdldERlZmF1bHRGZXRjaCgpIHsKIAkJcmV0dXJuIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5ERUZBVUxUX0ZFVENIX1RZUEU7CiAJfQogCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBuZXdNYXBwZWRCeSkgewotCQlTdHJpbmcgb2xkTWFwcGVkQnkgPSB0aGlzLm1hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5ID0gbmV3TWFwcGVkQnk7Ci0JCWdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRNYXBwZWRCeShuZXdNYXBwZWRCeSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX1BST1BFUlRZLCBvbGRNYXBwZWRCeSwgbmV3TWFwcGVkQnkpOwotCX0KIAkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwZWRCeV8oU3RyaW5nIG5ld01hcHBlZEJ5KSB7Ci0JCVN0cmluZyBvbGRNYXBwZWRCeSA9IHRoaXMubWFwcGVkQnk7Ci0JCXRoaXMubWFwcGVkQnkgPSBuZXdNYXBwZWRCeTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQRURfQllfUFJPUEVSVFksIG9sZE1hcHBlZEJ5LCBuZXdNYXBwZWRCeSk7Ci0JfQotCisJLy8gKioqKioqKioqKioqKioqKiBvcmRlciBieSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQogCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpIHsKLQkJcmV0dXJuIHRoaXMub3JkZXJCeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5KFN0cmluZyBuZXdPcmRlckJ5KSB7Ci0JCVN0cmluZyBvbGRPcmRlckJ5ID0gdGhpcy5vcmRlckJ5OwotCQl0aGlzLm9yZGVyQnkgPSBuZXdPcmRlckJ5OwotCQlnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0T3JkZXJCeShuZXdPcmRlckJ5KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChPUkRFUl9CWV9QUk9QRVJUWSwgb2xkT3JkZXJCeSwgbmV3T3JkZXJCeSk7CisJCWlmICh0aGlzLm5vT3JkZXJpbmcpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmICh0aGlzLnBrT3JkZXJpbmcpIHsKKwkJCXJldHVybiB0aGlzLmdldFRhcmdldEVudGl0eUlkQXR0cmlidXRlTmFtZSgpOworCQl9CisJCWlmICh0aGlzLmN1c3RvbU9yZGVyaW5nKSB7CisJCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRPcmRlckJ5OworCQl9CisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gb3JkZXJpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRPcmRlckJ5XyhTdHJpbmcgbmV3T3JkZXJCeSkgewotCQlTdHJpbmcgb2xkT3JkZXJCeSA9IHRoaXMub3JkZXJCeTsKLQkJdGhpcy5vcmRlckJ5ID0gbmV3T3JkZXJCeTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChPUkRFUl9CWV9QUk9QRVJUWSwgb2xkT3JkZXJCeSwgbmV3T3JkZXJCeSk7CisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRPcmRlckJ5KCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRPcmRlckJ5OwogCX0KIAorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE9yZGVyQnkoU3RyaW5nIG9yZGVyQnkpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkT3JkZXJCeTsKKwkJdGhpcy5zcGVjaWZpZWRPcmRlckJ5ID0gb3JkZXJCeTsKKwkJdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuc2V0T3JkZXJCeShvcmRlckJ5KTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9PUkRFUl9CWV9QUk9QRVJUWSwgb2xkLCBvcmRlckJ5KTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkT3JkZXJCeV8oU3RyaW5nIG9yZGVyQnkpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkT3JkZXJCeTsKKwkJdGhpcy5zcGVjaWZpZWRPcmRlckJ5ID0gb3JkZXJCeTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9PUkRFUl9CWV9QUk9QRVJUWSwgb2xkLCBvcmRlckJ5KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3JkZXJCeSgpIHsKKwkJdGhpcy5zcGVjaWZpZWRPcmRlckJ5ID0gdGhpcy5nZXRYbWxPcmRlckJ5KCk7CisJCWlmICh0aGlzLnNwZWNpZmllZE9yZGVyQnkgPT0gbnVsbCkgeyAKKwkJCXRoaXMubm9PcmRlcmluZyA9IHRydWU7CisJCX0gZWxzZSBpZiAodGhpcy5zcGVjaWZpZWRPcmRlckJ5LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJdGhpcy5wa09yZGVyaW5nID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuY3VzdG9tT3JkZXJpbmcgPSB0cnVlOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9yZGVyQnkoKSB7CisJCXRoaXMuc2V0U3BlY2lmaWVkT3JkZXJCeV8odGhpcy5nZXRYbWxPcmRlckJ5KCkpOworCQlpZiAodGhpcy5zcGVjaWZpZWRPcmRlckJ5ID09IG51bGwpIHsgCisJCQl0aGlzLnNldE5vT3JkZXJpbmdfKHRydWUpOworCQkJdGhpcy5zZXRQa09yZGVyaW5nXyhmYWxzZSk7CisJCQl0aGlzLnNldEN1c3RvbU9yZGVyaW5nXyhmYWxzZSk7CisJCX0gZWxzZSBpZiAodGhpcy5zcGVjaWZpZWRPcmRlckJ5LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJdGhpcy5zZXROb09yZGVyaW5nXyhmYWxzZSk7CisJCQl0aGlzLnNldFBrT3JkZXJpbmdfKHRydWUpOworCQkJdGhpcy5zZXRDdXN0b21PcmRlcmluZ18oZmFsc2UpOworCQl9IGVsc2UgeworCQkJdGhpcy5zZXROb09yZGVyaW5nXyhmYWxzZSk7CisJCQl0aGlzLnNldFBrT3JkZXJpbmdfKGZhbHNlKTsKKwkJCXRoaXMuc2V0Q3VzdG9tT3JkZXJpbmdfKHRydWUpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0WG1sT3JkZXJCeSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLmdldE9yZGVyQnkoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBubyBvcmRlcmluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkKIAlwdWJsaWMgYm9vbGVhbiBpc05vT3JkZXJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmlzTm9PcmRlcmluZzsKKwkJcmV0dXJuIHRoaXMubm9PcmRlcmluZzsKIAl9CiAKLQlwdWJsaWMgdm9pZCBzZXROb09yZGVyaW5nKGJvb2xlYW4gbmV3Tm9PcmRlcmluZykgewotCQlib29sZWFuIG9sZE5vT3JkZXJpbmcgPSB0aGlzLmlzTm9PcmRlcmluZzsKLQkJdGhpcy5pc05vT3JkZXJpbmcgPSBuZXdOb09yZGVyaW5nOwotCQlpZiAobmV3Tm9PcmRlcmluZykgewotCQkJZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldE9yZGVyQnkobnVsbCk7CisJcHVibGljIHZvaWQgc2V0Tm9PcmRlcmluZyhib29sZWFuIG5vT3JkZXJpbmcpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLm5vT3JkZXJpbmc7CisJCXRoaXMubm9PcmRlcmluZyA9IG5vT3JkZXJpbmc7CisJCWlmIChub09yZGVyaW5nKSB7CisJCQl0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5zZXRPcmRlckJ5KG51bGwpOwogCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9fT1JERVJJTkdfUFJPUEVSVFksIG9sZE5vT3JkZXJpbmcsIG5ld05vT3JkZXJpbmcpOwkJCQorCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9fT1JERVJJTkdfUFJPUEVSVFksIG9sZCwgbm9PcmRlcmluZyk7CQkJCiAJfQogCQotCXByb3RlY3RlZCB2b2lkIHNldE5vT3JkZXJpbmdfKGJvb2xlYW4gbmV3Tm9PcmRlcmluZykgewotCQlib29sZWFuIG9sZE5vT3JkZXJpbmcgPSB0aGlzLmlzTm9PcmRlcmluZzsKLQkJdGhpcy5pc05vT3JkZXJpbmcgPSBuZXdOb09yZGVyaW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5PX09SREVSSU5HX1BST1BFUlRZLCBvbGROb09yZGVyaW5nLCBuZXdOb09yZGVyaW5nKTsJCQkKKwlwcm90ZWN0ZWQgdm9pZCBzZXROb09yZGVyaW5nXyhib29sZWFuIG5vT3JkZXJpbmcpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLm5vT3JkZXJpbmc7CisJCXRoaXMubm9PcmRlcmluZyA9IG5vT3JkZXJpbmc7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOT19PUkRFUklOR19QUk9QRVJUWSwgb2xkLCBub09yZGVyaW5nKTsJCQkKIAl9CiAJCisJCisJLy8gKioqKioqKioqKioqKioqKiBwayBvcmRlcmluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkKIAlwdWJsaWMgYm9vbGVhbiBpc1BrT3JkZXJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmlzUGtPcmRlcmluZzsKKwkJcmV0dXJuIHRoaXMucGtPcmRlcmluZzsKIAl9CiAJCi0JcHVibGljIHZvaWQgc2V0UGtPcmRlcmluZyhib29sZWFuIG5ld1BrT3JkZXJpbmcpIHsKLQkJYm9vbGVhbiBvbGRQa09yZGVyaW5nID0gdGhpcy5pc1BrT3JkZXJpbmc7Ci0JCXRoaXMuaXNQa09yZGVyaW5nID0gbmV3UGtPcmRlcmluZzsKLQkJaWYgKG5ld1BrT3JkZXJpbmcpIHsKLQkJCWdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRPcmRlckJ5KCIiKTsKKwlwdWJsaWMgdm9pZCBzZXRQa09yZGVyaW5nKGJvb2xlYW4gcGtPcmRlcmluZykgeworCQlib29sZWFuIG9sZCA9IHRoaXMucGtPcmRlcmluZzsKKwkJdGhpcy5wa09yZGVyaW5nID0gcGtPcmRlcmluZzsKKwkJaWYgKHBrT3JkZXJpbmcpIHsKKwkJCXRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLnNldE9yZGVyQnkoIiIpOyAvLyROT04tTkxTLTEkCiAJCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQS19PUkRFUklOR19QUk9QRVJUWSwgb2xkUGtPcmRlcmluZywgbmV3UGtPcmRlcmluZyk7CQorCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEtfT1JERVJJTkdfUFJPUEVSVFksIG9sZCwgcGtPcmRlcmluZyk7CQogCX0KIAkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQa09yZGVyaW5nXyhib29sZWFuIG5ld1BrT3JkZXJpbmcpIHsKLQkJYm9vbGVhbiBvbGRQa09yZGVyaW5nID0gdGhpcy5pc1BrT3JkZXJpbmc7Ci0JCXRoaXMuaXNQa09yZGVyaW5nID0gbmV3UGtPcmRlcmluZzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQS19PUkRFUklOR19QUk9QRVJUWSwgb2xkUGtPcmRlcmluZywgbmV3UGtPcmRlcmluZyk7CQorCXByb3RlY3RlZCB2b2lkIHNldFBrT3JkZXJpbmdfKGJvb2xlYW4gcGtPcmRlcmluZykgeworCQlib29sZWFuIG9sZCA9IHRoaXMucGtPcmRlcmluZzsKKwkJdGhpcy5wa09yZGVyaW5nID0gcGtPcmRlcmluZzsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBLX09SREVSSU5HX1BST1BFUlRZLCBvbGQsIHBrT3JkZXJpbmcpOwkKIAl9CiAJCisJCisJLy8gKioqKioqKioqKioqKioqKiBjdXN0b20gb3JkZXJpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCiAJcHVibGljIGJvb2xlYW4gaXNDdXN0b21PcmRlcmluZygpIHsKLQkJcmV0dXJuIHRoaXMuaXNDdXN0b21PcmRlcmluZzsKKwkJcmV0dXJuIHRoaXMuY3VzdG9tT3JkZXJpbmc7CiAJfQogCi0JcHVibGljIHZvaWQgc2V0Q3VzdG9tT3JkZXJpbmcoYm9vbGVhbiBuZXdDdXN0b21PcmRlcmluZykgewotCQlib29sZWFuIG9sZEN1c3RvbU9yZGVyaW5nID0gdGhpcy5pc0N1c3RvbU9yZGVyaW5nOwotCQl0aGlzLmlzQ3VzdG9tT3JkZXJpbmcgPSBuZXdDdXN0b21PcmRlcmluZzsKLQkJaWYgKG5ld0N1c3RvbU9yZGVyaW5nKSB7Ci0JCQlzZXRPcmRlckJ5KCIiKTsKKwlwdWJsaWMgdm9pZCBzZXRDdXN0b21PcmRlcmluZyhib29sZWFuIGN1c3RvbU9yZGVyaW5nKSB7CisJCWJvb2xlYW4gb2xkID0gdGhpcy5jdXN0b21PcmRlcmluZzsKKwkJdGhpcy5jdXN0b21PcmRlcmluZyA9IGN1c3RvbU9yZGVyaW5nOworCQlpZiAoY3VzdG9tT3JkZXJpbmcpIHsKKwkJCXRoaXMuc2V0U3BlY2lmaWVkT3JkZXJCeSgiIik7IC8vJE5PTi1OTFMtMSQKIAkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENVU1RPTV9PUkRFUklOR19QUk9QRVJUWSwgb2xkQ3VzdG9tT3JkZXJpbmcsIG5ld0N1c3RvbU9yZGVyaW5nKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENVU1RPTV9PUkRFUklOR19QUk9QRVJUWSwgb2xkLCBjdXN0b21PcmRlcmluZyk7CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbU9yZGVyaW5nXyhib29sZWFuIG5ld0N1c3RvbU9yZGVyaW5nKSB7Ci0JCWJvb2xlYW4gb2xkQ3VzdG9tT3JkZXJpbmcgPSB0aGlzLmlzQ3VzdG9tT3JkZXJpbmc7Ci0JCXRoaXMuaXNDdXN0b21PcmRlcmluZyA9IG5ld0N1c3RvbU9yZGVyaW5nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENVU1RPTV9PUkRFUklOR19QUk9QRVJUWSwgb2xkQ3VzdG9tT3JkZXJpbmcsIG5ld0N1c3RvbU9yZGVyaW5nKTsKKwlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21PcmRlcmluZ18oYm9vbGVhbiBjdXN0b21PcmRlcmluZykgeworCQlib29sZWFuIG9sZCA9IHRoaXMuY3VzdG9tT3JkZXJpbmc7CisJCXRoaXMuY3VzdG9tT3JkZXJpbmcgPSBjdXN0b21PcmRlcmluZzsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENVU1RPTV9PUkRFUklOR19QUk9QRVJUWSwgb2xkLCBjdXN0b21PcmRlcmluZyk7CiAJfQogCQotCXB1YmxpYyBPcm1Kb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVTcGVjaWZpZWQoKSB7Ci0JCXJldHVybiBnZXRKb2luVGFibGUoKS5pc1NwZWNpZmllZCgpOwotCX0KLQorCQorCS8vICoqKioqKioqKioqKioqKiogbWFwIGtleSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKIAlwdWJsaWMgU3RyaW5nIGdldE1hcEtleSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwS2V5OworCQlpZiAodGhpcy5ub01hcEtleSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKHRoaXMucGtNYXBLZXkpIHsKKwkJCXJldHVybiB0aGlzLmdldFRhcmdldEVudGl0eUlkQXR0cmlidXRlTmFtZSgpOworCQl9CisJCWlmICh0aGlzLmN1c3RvbU1hcEtleSkgeworCQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWFwS2V5OworCQl9CisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gbWFwIGtleSIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTWFwS2V5KCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRNYXBLZXk7CiAJfQogCi0JcHVibGljIHZvaWQgc2V0TWFwS2V5KFN0cmluZyBuZXdNYXBLZXkpIHsKLQkJU3RyaW5nIG9sZE1hcEtleSA9IHRoaXMubWFwS2V5OwotCQl0aGlzLm1hcEtleSA9IG5ld01hcEtleTsKLQkJaWYgKG9sZE1hcEtleSAhPSBuZXdNYXBLZXkpIHsKLQkJCWlmICh0aGlzLmdldE1hcEtleVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0TWFwS2V5UmVzb3VyY2UoKS5zZXROYW1lKG5ld01hcEtleSk7CQkJCQkJCi0JCQkJaWYgKHRoaXMuZ2V0TWFwS2V5UmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVNYXBLZXlSZXNvdXJjZSgpOworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE1hcEtleShTdHJpbmcgbWFwS2V5KSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZE1hcEtleTsKKwkJdGhpcy5zcGVjaWZpZWRNYXBLZXkgPSBtYXBLZXk7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChvbGQsIG1hcEtleSkpIHsKKwkJCU1hcEtleSB4bWxNYXBLZXkgPSB0aGlzLmdldFhtbE1hcEtleSgpOworCQkJaWYgKG1hcEtleSA9PSBudWxsKSB7CisJCQkJaWYgKHhtbE1hcEtleSAhPSBudWxsKSB7CisJCQkJCXRoaXMucmVtb3ZlWG1sTWFwS2V5KCk7CiAJCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3TWFwS2V5ICE9IG51bGwpIHsKLQkJCQlhZGRNYXBLZXlSZXNvdXJjZSgpOwotCQkJCWdldE1hcEtleVJlc291cmNlKCkuc2V0TmFtZShuZXdNYXBLZXkpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoeG1sTWFwS2V5ID09IG51bGwpIHsKKwkJCQkJeG1sTWFwS2V5ID0gdGhpcy5hZGRYbWxNYXBLZXkoKTsKKwkJCQl9CisJCQkJeG1sTWFwS2V5LnNldE5hbWUobWFwS2V5KTsKIAkJCX0KIAkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1BUF9LRVlfUFJPUEVSVFksIG9sZE1hcEtleSwgbmV3TWFwS2V5KTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9NQVBfS0VZX1BST1BFUlRZLCBvbGQsIG1hcEtleSk7CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIHNldE1hcEtleV8oU3RyaW5nIG5ld01hcEtleSkgewotCQlTdHJpbmcgb2xkTWFwS2V5ID0gdGhpcy5tYXBLZXk7Ci0JCXRoaXMubWFwS2V5ID0gbmV3TWFwS2V5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1BUF9LRVlfUFJPUEVSVFksIG9sZE1hcEtleSwgbmV3TWFwS2V5KTsKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRNYXBLZXlfKFN0cmluZyBtYXBLZXkpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkTWFwS2V5OworCQl0aGlzLnNwZWNpZmllZE1hcEtleSA9IG1hcEtleTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9NQVBfS0VZX1BST1BFUlRZLCBvbGQsIG1hcEtleSk7CiAJfQogCQotCXByb3RlY3RlZCBNYXBLZXkgZ2V0TWFwS2V5UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0TWFwS2V5KCk7CisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hcEtleSgpIHsKKwkJTWFwS2V5IHhtbE1hcEtleSA9IHRoaXMuZ2V0WG1sTWFwS2V5KCk7CisJCWlmICh4bWxNYXBLZXkgPT0gbnVsbCkgeyAKKwkJCXRoaXMubm9NYXBLZXkgPSB0cnVlOworCQl9IGVsc2UgeworCQkJdGhpcy5zcGVjaWZpZWRNYXBLZXkgPSB4bWxNYXBLZXkuZ2V0TmFtZSgpOworCQkJaWYgKHRoaXMuc3BlY2lmaWVkTWFwS2V5ID09IG51bGwpIHsKKwkJCQl0aGlzLnBrTWFwS2V5ID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5jdXN0b21NYXBLZXkgPSB0cnVlOworCQkJfQorCQl9CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1hcEtleVJlc291cmNlKCkgewotCQlnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0TWFwS2V5KG51bGwpOworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1hcEtleSgpIHsKKwkJTWFwS2V5IHhtbE1hcEtleSA9IHRoaXMuZ2V0WG1sTWFwS2V5KCk7CisJCWlmICh4bWxNYXBLZXkgPT0gbnVsbCkgeworCQkJdGhpcy5zZXRTcGVjaWZpZWRNYXBLZXlfKG51bGwpOworCQkJdGhpcy5zZXROb01hcEtleV8odHJ1ZSk7CisJCQl0aGlzLnNldFBrTWFwS2V5XyhmYWxzZSk7CisJCQl0aGlzLnNldEN1c3RvbU1hcEtleV8oZmFsc2UpOworCQl9IGVsc2UgeworCQkJU3RyaW5nIG1rID0geG1sTWFwS2V5LmdldE5hbWUoKTsKKwkJCXRoaXMuc2V0U3BlY2lmaWVkTWFwS2V5Xyhtayk7CisJCQl0aGlzLnNldE5vTWFwS2V5XyhmYWxzZSk7CisJCQl0aGlzLnNldFBrTWFwS2V5XyhtayA9PSBudWxsKTsKKwkJCXRoaXMuc2V0Q3VzdG9tTWFwS2V5XyhtayAhPSBudWxsKTsKKwkJfQogCX0KIAkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYXBLZXlSZXNvdXJjZSgpIHsKLQkJZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldE1hcEtleShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNYXBLZXlJbXBsKCkpOworCXByb3RlY3RlZCBNYXBLZXkgZ2V0WG1sTWFwS2V5KCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuZ2V0TWFwS2V5KCk7CisJfQorCQorCXByb3RlY3RlZCBNYXBLZXkgYWRkWG1sTWFwS2V5KCkgeworCQlNYXBLZXkgbWFwS2V5ID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWFwS2V5KCk7CisJCXRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLnNldE1hcEtleShtYXBLZXkpOworCQlyZXR1cm4gbWFwS2V5OwogCX0KIAorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbE1hcEtleSgpIHsKKwkJdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuc2V0TWFwS2V5KG51bGwpOworCX0KKwkKIAlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBLZXlOYW1lcygpIHsKIAkJcmV0dXJuIHRoaXMuYWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTmFtZXMoKTsKIAl9Ci0KLS8vCXB1YmxpYyB2b2lkIHJlZnJlc2hEZWZhdWx0cyhEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7Ci0vLwkJc3VwZXIucmVmcmVzaERlZmF1bHRzKGRlZmF1bHRzQ29udGV4dCk7Ci0vLwkJLy8gVE9ETwotLy8JCS8vCQlpZiAoaXNPcmRlckJ5UGsoKSkgewotLy8JCS8vCQkJcmVmcmVzaERlZmF1bHRPcmRlckJ5KGRlZmF1bHRzQ29udGV4dCk7Ci0vLwkJLy8JCX0KLS8vCX0KLS8vCi0vLwkvL3ByaW1hcnkga2V5IG9yZGVyaW5nIHdoZW4ganVzdCB0aGUgQE9yZGVyQnkgYW5ub3RhdGlvbiBpcyBwcmVzZW50Ci0vLwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRGVmYXVsdE9yZGVyQnkoRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewotLy8JCUlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLS8vCQlpZiAodGFyZ2V0RW50aXR5ICE9IG51bGwpIHsKLS8vCQkJc2V0T3JkZXJCeSh0YXJnZXRFbnRpdHkucHJpbWFyeUtleUF0dHJpYnV0ZU5hbWUoKSArICIgQVNDIik7Ci0vLwkJfQotLy8JfQotLy8KLS8vCS8vVE9ETyBjb3BpZWQgZnJvbSBKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi0vLwkvKioKLS8vCSAqIGV4dHJhY3QgdGhlIGVsZW1lbnQgdHlwZSBmcm9tIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIHNpZ25hdHVyZSBhbmQKLS8vCSAqIGNvbnZlcnQgaXQgaW50byBhIHJlZmVyZW5jZSBlbnRpdHkgdHlwZSBuYW1lOwotLy8JICogcmV0dXJuIG51bGwgaWYgdGhlIHR5cGUgaXMgbm90IGEgdmFsaWQgcmVmZXJlbmNlIGVudGl0eSB0eXBlIChlLmcuIGl0J3MKLS8vCSAqIGFub3RoZXIgY29udGFpbmVyIG9yIGFuIGFycmF5IG9yIGEgcHJpbWl0aXZlIG9yIG90aGVyIEJhc2ljIHR5cGUpCi0vLwkgKi8KLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIFN0cmluZyBqYXZhRGVmYXVsdFRhcmdldEVudGl0eShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKLS8vCQlTdHJpbmcgdHlwZU5hbWUgPSBzdXBlci5qYXZhRGVmYXVsdFRhcmdldEVudGl0eSh0eXBlQmluZGluZyk7Ci0vLwkJcmV0dXJuIEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLnR5cGVOYW1lZElzQ29udGFpbmVyKHR5cGVOYW1lKSA/IHRoaXMuamF2YURlZmF1bHRUYXJnZXRFbnRpdHlGcm9tQ29udGFpbmVyKHR5cGVCaW5kaW5nKSA6IG51bGw7Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIFN0cmluZyBqYXZhRGVmYXVsdFRhcmdldEVudGl0eUZyb21Db250YWluZXIoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0vLwkJcmV0dXJuIEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YURlZmF1bHRUYXJnZXRFbnRpdHlGcm9tQ29udGFpbmVyKHR5cGVCaW5kaW5nKTsKLS8vCX0KIAkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgbWFwcGVkQnlUZXh0UmFuZ2UgPSBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKTsKLQkJcmV0dXJuIG1hcHBlZEJ5VGV4dFJhbmdlICE9IG51bGwgPyBtYXBwZWRCeVRleHRSYW5nZSA6IGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9CiAJCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShUIG11bHRpUmVsYXRpb25zaGlwTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplKG11bHRpUmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMubWFwcGVkQnkgPSBtdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0TWFwcGVkQnkoKTsKLQkJdGhpcy5tYXBLZXkgPSB0aGlzLm1hcEtleShtdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQl0aGlzLm9yZGVyQnkgPSB0aGlzLm9yZGVyQnkobXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQkJaWYgKHRoaXMub3JkZXJCeSA9PSBudWxsKSB7IAotCQkJdGhpcy5pc05vT3JkZXJpbmcgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5pc0N1c3RvbU9yZGVyaW5nID0gdHJ1ZTsKLQkJfQotCQl0aGlzLmpvaW5UYWJsZS5pbml0aWFsaXplKG11bHRpUmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShUIG11bHRpUmVsYXRpb25zaGlwTWFwcGluZykgewotCQlzdXBlci51cGRhdGUobXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQkJdGhpcy5zZXRNYXBwZWRCeV8obXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQl0aGlzLnNldE1hcEtleV8odGhpcy5tYXBLZXkobXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKSk7Ci0JCXRoaXMuc2V0T3JkZXJCeV8odGhpcy5vcmRlckJ5KG11bHRpUmVsYXRpb25zaGlwTWFwcGluZykpOwotCQlpZiAoZ2V0T3JkZXJCeSgpID09IG51bGwpIHsgCi0JCQlzZXROb09yZGVyaW5nXyh0cnVlKTsKLQkJCXNldFBrT3JkZXJpbmdfKGZhbHNlKTsKLQkJCXNldEN1c3RvbU9yZGVyaW5nXyhmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXROb09yZGVyaW5nXyhmYWxzZSk7Ci0JCQlzZXRQa09yZGVyaW5nXyhmYWxzZSk7Ci0JCQlzZXRDdXN0b21PcmRlcmluZ18odHJ1ZSk7Ci0JCX0KLQkJdGhpcy5qb2luVGFibGUudXBkYXRlKG11bHRpUmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgbWFwS2V5KFQgbXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXJldHVybiBtdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0TWFwS2V5KCkgPT0gbnVsbCA/IG51bGwgOiBtdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG9yZGVyQnkoVCBtdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJcmV0dXJuIG11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5nZXRPcmRlckJ5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhcmdldEVudGl0eShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSkgewotCQlpZiAoIXBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZS50eXBlSXNDb250YWluZXIoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZS5nZXRRdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlFbGVtZW50VHlwZU5hbWUoKTsKKwkvLyAqKioqKioqKioqKioqKioqIG5vIG1hcCBrZXkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCisJcHVibGljIGJvb2xlYW4gaXNOb01hcEtleSgpIHsKKwkJcmV0dXJuIHRoaXMubm9NYXBLZXk7CiAJfQogCi0JLy8qKioqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKio4CisJcHVibGljIHZvaWQgc2V0Tm9NYXBLZXkoYm9vbGVhbiBub01hcEtleSkgeworCQlib29sZWFuIG9sZCA9IHRoaXMubm9NYXBLZXk7CisJCXRoaXMubm9NYXBLZXkgPSBub01hcEtleTsKKwkJaWYgKG5vTWFwS2V5KSB7CisJCQlpZiAodGhpcy5nZXRYbWxNYXBLZXkoKSAhPSBudWxsKSB7CisJCQkJdGhpcy5yZW1vdmVYbWxNYXBLZXkoKTsKKwkJCX0KKwkJfQorCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9fTUFQX0tFWV9QUk9QRVJUWSwgb2xkLCBub01hcEtleSk7CQkJCisJfQogCQorCXByb3RlY3RlZCB2b2lkIHNldE5vTWFwS2V5Xyhib29sZWFuIG5vTWFwS2V5KSB7CisJCWJvb2xlYW4gb2xkID0gdGhpcy5ub01hcEtleTsKKwkJdGhpcy5ub01hcEtleSA9IG5vTWFwS2V5OworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9fTUFQX0tFWV9QUk9QRVJUWSwgb2xkLCBub01hcEtleSk7CQkJCisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogcGsgbWFwIGtleSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkKKwlwdWJsaWMgYm9vbGVhbiBpc1BrTWFwS2V5KCkgeworCQlyZXR1cm4gdGhpcy5wa01hcEtleTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0UGtNYXBLZXkoYm9vbGVhbiBwa01hcEtleSkgeworCQlib29sZWFuIG9sZCA9IHRoaXMucGtNYXBLZXk7CisJCXRoaXMucGtNYXBLZXkgPSBwa01hcEtleTsKKwkJTWFwS2V5IHhtbE1hcEtleSA9IHRoaXMuZ2V0WG1sTWFwS2V5KCk7CisJCWlmIChwa01hcEtleSkgeworCQkJaWYgKHhtbE1hcEtleSA9PSBudWxsKSB7CisJCQkJdGhpcy5hZGRYbWxNYXBLZXkoKTsKKwkJCX0gZWxzZSB7CisJCQkJeG1sTWFwS2V5LnNldE5hbWUobnVsbCk7CisJCQl9CisJCX0KKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBLX01BUF9LRVlfUFJPUEVSVFksIG9sZCwgcGtNYXBLZXkpOwkKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0UGtNYXBLZXlfKGJvb2xlYW4gcGtNYXBLZXkpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLnBrTWFwS2V5OworCQl0aGlzLnBrTWFwS2V5ID0gcGtNYXBLZXk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQS19NQVBfS0VZX1BST1BFUlRZLCBvbGQsIHBrTWFwS2V5KTsJCisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogY3VzdG9tIG1hcCBrZXkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCisJcHVibGljIGJvb2xlYW4gaXNDdXN0b21NYXBLZXkoKSB7CisJCXJldHVybiB0aGlzLmN1c3RvbU1hcEtleTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDdXN0b21NYXBLZXkoYm9vbGVhbiBjdXN0b21NYXBLZXkpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLmN1c3RvbU1hcEtleTsKKwkJdGhpcy5jdXN0b21NYXBLZXkgPSBjdXN0b21NYXBLZXk7CisJCWlmIChjdXN0b21NYXBLZXkpIHsKKwkJCXRoaXMuc2V0U3BlY2lmaWVkTWFwS2V5KCIiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDVVNUT01fTUFQX0tFWV9QUk9QRVJUWSwgb2xkLCBjdXN0b21NYXBLZXkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21NYXBLZXlfKGJvb2xlYW4gY3VzdG9tTWFwS2V5KSB7CisJCWJvb2xlYW4gb2xkID0gdGhpcy5jdXN0b21NYXBLZXk7CisJCXRoaXMuY3VzdG9tTWFwS2V5ID0gY3VzdG9tTWFwS2V5OworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ1VTVE9NX01BUF9LRVlfUFJPUEVSVFksIG9sZCwgY3VzdG9tTWFwS2V5KTsKKwl9CisJCisKKwkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqICAKKwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCQotCQlpZiAoZW50aXR5T3duZWQoKSAmJiAodGhpcy5pc0pvaW5UYWJsZVNwZWNpZmllZCgpIHx8IGlzUmVsYXRpb25zaGlwT3duZXIoKSkpIHsKLQkJCWdldEpvaW5UYWJsZSgpLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQl9Ci0JCWlmIChnZXRNYXBwZWRCeSgpICE9IG51bGwpIHsKLQkJCWFkZE1hcHBlZEJ5TWVzc2FnZXMobWVzc2FnZXMpOworCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWV0YW1vZGVsRmllbGRUeXBlTmFtZSgpIHsKKwkJcmV0dXJuICgoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzApIHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkuZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcykgeworCQl0aGlzLmFkZE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZUFyZ3VtZW50TmFtZVRvKHR5cGVBcmd1bWVudE5hbWVzKTsKKwkJc3VwZXIuYWRkTWV0YW1vZGVsRmllbGRUeXBlQXJndW1lbnROYW1lc1RvKHR5cGVBcmd1bWVudE5hbWVzKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRhbW9kZWxGaWVsZE1hcEtleVR5cGVBcmd1bWVudE5hbWVUbyhBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcykgeworCQlTdHJpbmcga2V5VHlwZU5hbWUgPSAoKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wKSB0aGlzLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpLmdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkTWFwS2V5VHlwZU5hbWUoKTsKKwkJaWYgKGtleVR5cGVOYW1lICE9IG51bGwpIHsKKwkJCXR5cGVBcmd1bWVudE5hbWVzLmFkZChrZXlUeXBlTmFtZSk7CiAJCX0KIAl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGVkQnlNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewkKLQkJaWYgKGlzSm9pblRhYmxlU3BlY2lmaWVkKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfTUFQUEVEX0JZX1dJVEhfSk9JTl9UQUJMRSwKLQkJCQkJCWdldEpvaW5UYWJsZSgpLAotCQkJCQkJZ2V0Sm9pblRhYmxlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCX0KLQkJCi0JCWlmIChnZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpID09IG51bGwpIHsKLQkJCS8vIGFscmVhZHkgaGF2ZSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvciB0aGF0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLnJlc29sdmVBdHRyaWJ1dGUoZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlpZiAoYXR0cmlidXRlID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfVU5SRVNPTFZFRF9NQVBQRURfQlksCi0JCQkJCQluZXcgU3RyaW5nW10ge2dldE1hcHBlZEJ5KCl9LCAKLQkJCQkJCXRoaXMsCi0JCQkJCQlnZXRNYXBwZWRCeVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICghIG1hcHBlZEJ5SXNWYWxpZChhdHRyaWJ1dGUuZ2V0TWFwcGluZygpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19JTlZBTElEX01BUFBFRF9CWSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TWFwcGVkQnkoKX0sIAotCQkJCQkJdGhpcywKLQkJCQkJCWdldE1hcHBlZEJ5VGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTm9uT3duaW5nTWFwcGluZyBtYXBwZWRCeU1hcHBpbmc7Ci0JCXRyeSB7Ci0JCQltYXBwZWRCeU1hcHBpbmcgPSAoTm9uT3duaW5nTWFwcGluZykgYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgewotCQkJLy8gdGhlcmUgaXMgbm8gZXJyb3IgdGhlbgotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAobWFwcGVkQnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkgIT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19NQVBQRURfQllfT05fQk9USF9TSURFUywKLQkJCQkJCXRoaXMsCi0JCQkJCQlnZXRNYXBwZWRCeVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsRmllbGRNYXBLZXlUeXBlTmFtZSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdUb29scy5nZXRNZXRhbW9kZWxGaWVsZE1hcEtleVR5cGVOYW1lKHRoaXMpOwogCX0KKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTmFtZWRDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU5hbWVkQ29sdW1uLmphdmEKaW5kZXggZjA3ZjI3ZS4uZTgzNzYyMSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTmFtZWRDb2x1bW4uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1OYW1lZENvbHVtbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDE1ICsxMCwxNSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTmFtZWRDb2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CiAKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtTmFtZWRDb2x1bW48VCBleHRlbmRzIFhtbE5hbWVkQ29sdW1uPiAgZXh0ZW5kcyBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1OYW1lZENvbHVtbjxUIGV4dGVuZHMgQWJzdHJhY3RYbWxOYW1lZENvbHVtbj4gZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCiAJaW1wbGVtZW50cyBPcm1OYW1lZENvbHVtbgogewogCXByb3RlY3RlZCBPd25lciBvd25lcjsKQEAgLTI5LDE0ICsyOSwxNCBAQAogCiAJcHJvdGVjdGVkIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uOwogCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtTmFtZWRDb2x1bW4oT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPd25lciBvd25lcikgeworCXByb3RlY3RlZCBBYnN0cmFjdE9ybU5hbWVkQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3duZXIgb3duZXIpIHsKIAkJc3VwZXIocGFyZW50KTsKIAkJdGhpcy5vd25lciA9IG93bmVyOwogCX0KIAogCUBPdmVycmlkZQotCXB1YmxpYyBPcm1KcGFDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtSnBhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOworCXB1YmxpYyBYbWxDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoWG1sQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShOYW1lZENvbHVtbiBvbGRDb2x1bW4pIHsKQEAgLTQ0LDExICs0NCwxMSBAQAogCQlzZXRDb2x1bW5EZWZpbml0aW9uKG9sZENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwogCX0KIAotCXByb3RlY3RlZCBhYnN0cmFjdCBUIGdldENvbHVtblJlc291cmNlKCk7CisJcHJvdGVjdGVkIGFic3RyYWN0IFQgZ2V0UmVzb3VyY2VDb2x1bW4oKTsKIAkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW1vdmVDb2x1bW5SZXNvdXJjZSgpOworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlbW92ZVJlc291cmNlQ29sdW1uKCk7CiAJCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkQ29sdW1uUmVzb3VyY2UoKTsKKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRSZXNvdXJjZUNvbHVtbigpOwogCiAJcHVibGljIE93bmVyIGdldE93bmVyKCkgewogCQlyZXR1cm4gdGhpcy5vd25lcjsKQEAgLTY1LDE2ICs2NSwxNiBAQAogCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKIAkJU3RyaW5nIG9sZFNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWU7CiAJCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5ld1NwZWNpZmllZE5hbWU7Ci0JCWlmIChvbGRTcGVjaWZpZWROYW1lICE9IG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXROYW1lKG5ld1NwZWNpZmllZE5hbWUpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKTsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKG9sZFNwZWNpZmllZE5hbWUsIG5ld1NwZWNpZmllZE5hbWUpKSB7CisJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpICE9IG51bGwpIHsKKwkJCQl0aGlzLmdldFJlc291cmNlQ29sdW1uKCkuc2V0TmFtZShuZXdTcGVjaWZpZWROYW1lKTsJCQkJCQkKKwkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpLmlzVW5zZXQoKSkgeworCQkJCQlyZW1vdmVSZXNvdXJjZUNvbHVtbigpOwogCQkJCX0KIAkJCX0KIAkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZE5hbWUgIT0gbnVsbCkgewotCQkJCWFkZENvbHVtblJlc291cmNlKCk7Ci0JCQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXROYW1lKG5ld1NwZWNpZmllZE5hbWUpOworCQkJCWFkZFJlc291cmNlQ29sdW1uKCk7CisJCQkJZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXROYW1lKG5ld1NwZWNpZmllZE5hbWUpOwogCQkJfQogCQl9CiAJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE5hbWUsIG5ld1NwZWNpZmllZE5hbWUpOwpAQCAtMTAzLDE2ICsxMDMsMTYgQEAKIAlwdWJsaWMgdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uKFN0cmluZyBuZXdDb2x1bW5EZWZpbml0aW9uKSB7CiAJCVN0cmluZyBvbGRDb2x1bW5EZWZpbml0aW9uID0gdGhpcy5jb2x1bW5EZWZpbml0aW9uOwogCQl0aGlzLmNvbHVtbkRlZmluaXRpb24gPSBuZXdDb2x1bW5EZWZpbml0aW9uOwotCQlpZiAob2xkQ29sdW1uRGVmaW5pdGlvbiAhPSBuZXdDb2x1bW5EZWZpbml0aW9uKSB7Ci0JCQlpZiAodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldENvbHVtblJlc291cmNlKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihuZXdDb2x1bW5EZWZpbml0aW9uKTsJCQkJCQkKLQkJCQlpZiAodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZUNvbHVtblJlc291cmNlKCk7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChvbGRDb2x1bW5EZWZpbml0aW9uLCBuZXdDb2x1bW5EZWZpbml0aW9uKSkgeworCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKSAhPSBudWxsKSB7CisJCQkJdGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obmV3Q29sdW1uRGVmaW5pdGlvbik7CQkJCQkJCisJCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKS5pc1Vuc2V0KCkpIHsKKwkJCQkJcmVtb3ZlUmVzb3VyY2VDb2x1bW4oKTsKIAkJCQl9CiAJCQl9CiAJCQllbHNlIGlmIChuZXdDb2x1bW5EZWZpbml0aW9uICE9IG51bGwpIHsKLQkJCQlhZGRDb2x1bW5SZXNvdXJjZSgpOwotCQkJCWdldENvbHVtblJlc291cmNlKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihuZXdDb2x1bW5EZWZpbml0aW9uKTsKKwkJCQlhZGRSZXNvdXJjZUNvbHVtbigpOworCQkJCWdldFJlc291cmNlQ29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihuZXdDb2x1bW5EZWZpbml0aW9uKTsKIAkJCX0KIAkJfQogCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZLCBvbGRDb2x1bW5EZWZpbml0aW9uLCBuZXdDb2x1bW5EZWZpbml0aW9uKTsKQEAgLTEyNiwyMiArMTI2LDIyIEBACiAKIAlwdWJsaWMgQ29sdW1uIGdldERiQ29sdW1uKCkgewogCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGJUYWJsZSgpOwotCQlyZXR1cm4gKHRhYmxlID09IG51bGwpID8gbnVsbCA6IHRhYmxlLmNvbHVtbk5hbWVkKGdldE5hbWUoKSk7CisJCXJldHVybiAodGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcihnZXROYW1lKCkpOwogCX0KIAogCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXREYlRhYmxlKHRoaXMudGFibGVOYW1lKCkpOworCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXREYlRhYmxlKHRoaXMuZ2V0T3duaW5nVGFibGVOYW1lKCkpOwogCX0KIAotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgdGFibGVOYW1lKCk7CisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRPd25pbmdUYWJsZU5hbWUoKTsKIAogCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7CiAJCXJldHVybiBnZXREYkNvbHVtbigpICE9IG51bGw7CiAJfQogCiAJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlpZiAoZ2V0Q29sdW1uUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gZ2V0Q29sdW1uUmVzb3VyY2UoKS5nZXROYW1lVGV4dFJhbmdlKCk7CisJCWlmIChnZXRSZXNvdXJjZUNvbHVtbigpICE9IG51bGwpIHsKKwkJCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRSZXNvdXJjZUNvbHVtbigpLmdldE5hbWVUZXh0UmFuZ2UoKTsKIAkJCWlmICh0ZXh0UmFuZ2UgIT0gbnVsbCkgewogCQkJCXJldHVybiB0ZXh0UmFuZ2U7CiAJCQl9CkBAIC0xNTAsNyArMTUwLDcgQEAKIAl9CiAKIAlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRDb2x1bW5SZXNvdXJjZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldFJlc291cmNlQ29sdW1uKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwogCQlpZiAodGV4dFJhbmdlICE9IG51bGwpIHsKIAkJCXJldHVybiB0ZXh0UmFuZ2U7CiAJCX0KQEAgLTE2MSwzMSArMTYxLDM1IEBACiAJLy8gKioqKioqKioqKioqKioqKioqKiBpbml0aWFsaXphdGlvbiBmcm9tIG9ybSB4bWwgcmVzb3VyY2UgbW9kZWwgKioqKioqKioqKioqKioqKioqKioKIAkKIAlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFQgY29sdW1uKSB7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IHRoaXMuc3BlY2lmaWVkTmFtZShjb2x1bW4pOwotCQl0aGlzLmRlZmF1bHROYW1lID0gdGhpcy5kZWZhdWx0TmFtZSgpOwotCQl0aGlzLmNvbHVtbkRlZmluaXRpb24gPSB0aGlzLnNwZWNpZmllZENvbHVtbkRlZmluaXRpb24oY29sdW1uKTsKKwkJdGhpcy5zcGVjaWZpZWROYW1lID0gdGhpcy5nZXRSZXNvdXJjZUNvbHVtbk5hbWUoY29sdW1uKTsKKwkJdGhpcy5kZWZhdWx0TmFtZSA9IHRoaXMuYnVpbGREZWZhdWx0TmFtZSgpOworCQl0aGlzLmNvbHVtbkRlZmluaXRpb24gPSB0aGlzLmdldFJlc291cmNlQ29sdW1uRGVmaW5pdGlvbihjb2x1bW4pOwogCX0KIAkKIAlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoVCBjb2x1bW4pIHsKLQkJc2V0U3BlY2lmaWVkTmFtZV8odGhpcy5zcGVjaWZpZWROYW1lKGNvbHVtbikpOwotCQlzZXREZWZhdWx0TmFtZSh0aGlzLmRlZmF1bHROYW1lKCkpOwotCQlzZXRDb2x1bW5EZWZpbml0aW9uXyh0aGlzLnNwZWNpZmllZENvbHVtbkRlZmluaXRpb24oY29sdW1uKSk7CQorCQlzZXRTcGVjaWZpZWROYW1lXyh0aGlzLmdldFJlc291cmNlQ29sdW1uTmFtZShjb2x1bW4pKTsKKwkJc2V0RGVmYXVsdE5hbWUodGhpcy5idWlsZERlZmF1bHROYW1lKCkpOworCQlzZXRDb2x1bW5EZWZpbml0aW9uXyh0aGlzLmdldFJlc291cmNlQ29sdW1uRGVmaW5pdGlvbihjb2x1bW4pKTsJCiAJfQogCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lKFQgY29sdW1uKSB7CisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUNvbHVtbk5hbWUoVCBjb2x1bW4pIHsKIAkJcmV0dXJuIGNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGNvbHVtbi5nZXROYW1lKCk7CiAJfQogCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ29sdW1uRGVmaW5pdGlvbihUIGNvbHVtbikgeworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VDb2x1bW5EZWZpbml0aW9uKFQgY29sdW1uKSB7CiAJCXJldHVybiBjb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwogCX0KIAkKIAkvKioKIAkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgY29sdW1uIG5hbWUuCiAJICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZSgpIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdE5hbWUoKSB7CiAJCXJldHVybiB0aGlzLmdldE93bmVyKCkuZ2V0RGVmYXVsdENvbHVtbk5hbWUoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7CisJfQogCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtT25lVG9NYW55TWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjA2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1PbmVUb01hbnlNYXBwaW5nLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybU9uZVRvTWFueU1hcHBpbmc8VCBleHRlbmRzIFhtbE9uZVRvTWFueT4KKwlleHRlbmRzIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nPFQ+CisJaW1wbGVtZW50cyBPcm1PbmVUb01hbnlNYXBwaW5nMl8wLCBPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wCit7CisJcHJvdGVjdGVkIGZpbmFsIE9ybU9ycGhhblJlbW92YWJsZTJfMCBvcnBoYW5SZW1vdmFsOworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCisJcHJvdGVjdGVkIEFic3RyYWN0T3JtT25lVG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgVCByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCQl0aGlzLm9ycGhhblJlbW92YWwgPSAoKE9ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeSkgZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkpLmJ1aWxkT3JtT3JwaGFuUmVtb3ZhbCh0aGlzLCByZXNvdXJjZU1hcHBpbmcpOworCX0KKworCS8vICoqKioqKioqKiogdXBkYXRlICoqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLmdldE9ycGhhblJlbW92YWwoKS51cGRhdGUoKTsKKwl9CisKKwlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgeworCQlyZXR1cm4gNTA7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7CisJCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1PbmVUb01hbnlNYXBwaW5nKHRoaXMpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwoQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKKwkJcmVzb3VyY2VBdHRyaWJ1dGVzLmdldE9uZVRvTWFueXMoKS5hZGQodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0T25lVG9NYW55cygpLnJlbW92ZSh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gKE9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgc3VwZXIuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CisJfQorCisJLy8gKioqKioqKioqKiBPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBPcm1PcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbCgpIHsKKwkJcmV0dXJuIHRoaXMub3JwaGFuUmVtb3ZhbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5Y2YxZDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Pd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWV4dGVuZHMgQWJzdHJhY3RPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UKKwlpbXBsZW1lbnRzIE9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZQoreworCXByb3RlY3RlZCBPcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneSBtYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKKwkKKwlwcm90ZWN0ZWQgT3JtSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5IGpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKKwkKKwkKKwlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCisJCQlPcm1PbmVUb01hbnlNYXBwaW5nIHBhcmVudCwgWG1sT25lVG9NYW55IHJlc291cmNlKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2UpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWdpZXMoKSB7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kgPSBidWlsZE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCk7CisJCQorCQkvLyBpbml0aWFsaXplIGpvaW4gdGFibGUgbGFzdCwgYXMgdGhlIGV4aXN0ZW5jZSBvZiBhIGRlZmF1bHQgam9pbiAKKwkJLy8gdGFibGUgaXMgZGVwZW5kZW50IG9uIHRoZSBvdGhlciBtZWNoYW5pc21zIChtYXBwZWRCeSkKKwkJLy8gbm90IGJlaW5nIHNwZWNpZmllZAorCQl0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSA9IGJ1aWxkSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7CisJfQorCQorCXByb3RlY3RlZCBPcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneSBidWlsZE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneSh0aGlzLCBnZXRSZXNvdXJjZU1hcHBpbmcoKSk7CisJfQorCQorCXByb3RlY3RlZCBPcm1Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgYnVpbGRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiAJbmV3IEdlbmVyaWNPcm1Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3kodGhpcywgZ2V0UmVzb3VyY2VNYXBwaW5nKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtUmVsYXRpb25zaGlwUmVmZXJlbmNlIG5ld1JlbGF0aW9uc2hpcFJlZmVyZW5jZSkgeworCQluZXdSZWxhdGlvbnNoaXBSZWZlcmVuY2UuaW5pdGlhbGl6ZUZyb21Pd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlKHRoaXMpOworCQluZXdSZWxhdGlvbnNoaXBSZWZlcmVuY2UuaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlKHRoaXMpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCisJCQlPcm1Pd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlIG9sZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgeworCQlzdXBlci5pbml0aWFsaXplRnJvbU93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2Uob2xkUmVsYXRpb25zaGlwUmVmZXJlbmNlKTsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgKKwkJCW9sZFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCisJCQlPcm1Kb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlIG9sZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgeworCQlzdXBlci5pbml0aWFsaXplRnJvbUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2Uob2xkUmVsYXRpb25zaGlwUmVmZXJlbmNlKTsKKwkJT3JtSm9pblRhYmxlIG9sZFRhYmxlID0gCisJCQlvbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CisJCWlmIChvbGRUYWJsZSAhPSBudWxsKSB7CisJCQl0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5hZGRKb2luVGFibGUoKS5pbml0aWFsaXplRnJvbShvbGRUYWJsZSk7CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybU9uZVRvTWFueU1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKKwkJcmV0dXJuIChPcm1PbmVUb01hbnlNYXBwaW5nKSBnZXRQYXJlbnQoKTsKKwl9CisJCisJcHVibGljIFhtbE9uZVRvTWFueSBnZXRSZXNvdXJjZU1hcHBpbmcoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKSB7CisJCXJldHVybiB0aGlzLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSA9PSBudWxsOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7CisJCXJldHVybiB0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LnJlbGF0aW9uc2hpcElzT3duZWRCeShtYXBwaW5nKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBtYXBwZWQgYnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBPcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneSBnZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkgeworCQl0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7CisJCXRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVuc2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gdXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5nZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpID09IHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyBib29sZWFuIG1heUJlTWFwcGVkQnkoQXR0cmlidXRlTWFwcGluZyBtYXBwZWRCeU1hcHBpbmcpIHsKKwkJcmV0dXJuIG1hcHBlZEJ5TWFwcGluZy5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogam9pbiB0YWJsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgT3JtSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5IGdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiB1c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gZ2V0UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSA9PSB0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkgeworCQkvLyBqb2luIHRhYmxlIGlzIGRlZmF1bHQsIHNvIG5vIG5lZWQgdG8gYWRkIHRvIHJlc291cmNlCisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIHZvaWQgdW5zZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pblRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpID09IG51bGw7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgPT4gY29udGV4dCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKb2luaW5nU3RyYXRlZ2llcygpIHsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS51cGRhdGUoKTsKKwkJCisJCS8vIHVwZGF0ZSBqb2luIHRhYmxlIGxhc3QsIGFzIHRoZSBleGlzdGVuY2Ugb2YgYSBkZWZhdWx0IGpvaW4gCisJCS8vIHRhYmxlIGlzIGRlcGVuZGVudCBvbiB0aGUgb3RoZXIgbWVjaGFuaXNtcyAobWFwcGVkQnkpCisJCS8vIG5vdCBiZWluZyBzcGVjaWZpZWQKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kudXBkYXRlKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1PbmVUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU9uZVRvT25lTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDU2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1PbmVUb09uZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybU9uZVRvT25lTWFwcGluZzxUIGV4dGVuZHMgWG1sT25lVG9PbmU+CisJZXh0ZW5kcyBBYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc8VD4KKwlpbXBsZW1lbnRzIE9ybU9uZVRvT25lTWFwcGluZzJfMCwgT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMAoreworCXByb3RlY3RlZCBmaW5hbCBPcm1PcnBoYW5SZW1vdmFibGUyXzAgb3JwaGFuUmVtb3ZhbDsKKwkKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKKwlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1PbmVUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFQgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwkJdGhpcy5vcnBoYW5SZW1vdmFsID0gKChPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkpIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpKS5idWlsZE9ybU9ycGhhblJlbW92YWwodGhpcywgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisKKwkvLyAqKioqKioqKioqIHVwZGF0ZSAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5nZXRPcnBoYW5SZW1vdmFsKCkudXBkYXRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UgYnVpbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlKHRoaXMsIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIDYwOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7CisJCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1PbmVUb09uZU1hcHBpbmcodGhpcyk7CisJfQorCisJcHVibGljIHZvaWQgYWRkVG9SZXNvdXJjZU1vZGVsKEF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7CisJCXJlc291cmNlQXR0cmlidXRlcy5nZXRPbmVUb09uZXMoKS5hZGQodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0T25lVG9PbmVzKCkucmVtb3ZlKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIChPcm1PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgc3VwZXIuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CisJfQorCisJLy8gKioqKioqKioqKiBPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBPcm1PcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbCgpIHsKKwkJcmV0dXJuIHRoaXMub3JwaGFuUmVtb3ZhbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5YTE2MAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDI4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TdHJ1Y3R1cmVOb2RlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworLyoqCisgKiBPUk0gcGVyc2lzdGVudCBhdHRyaWJ1dGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtUGVyc2lzdGVudEF0dHJpYnV0ZQorCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZQoreworCXByb3RlY3RlZCBmaW5hbCBPd25lciBvd25lcjsKKworCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CQorCQorCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGRlZmF1bHRBY2Nlc3M7CisJCisJcHJvdGVjdGVkIEFic3RyYWN0T3JtUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIE93bmVyIG93bmVyLCBYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLm93bmVyID0gb3duZXI7CisJCXRoaXMuYXR0cmlidXRlTWFwcGluZyA9IGJ1aWxkQXR0cmlidXRlTWFwcGluZyhyZXNvdXJjZU1hcHBpbmcpOworCQl0aGlzLmphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gZmluZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCXRoaXMuZGVmYXVsdEFjY2VzcyA9IGJ1aWxkRGVmYXVsdEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBnZXRSZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcoKSB7CisJCXJldHVybiB0aGlzLmF0dHJpYnV0ZU1hcHBpbmcuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKCk7CisJfQorCQorCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMuamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSB7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG9sZCA9IHRoaXMuamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CisJCXRoaXMuamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpBVkFfUEVSU0lTVEVOVF9BVFRSSUJVVEVfUFJPUEVSVFksIG9sZCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCX0KKworCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkQXR0cmlidXRlTWFwcGluZyhYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZykgeworCQlPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBtYXBwaW5nRGVmaW5pdGlvbiA9IAorCQkJCWdldE1hcHBpbmdGaWxlRGVmaW5pdGlvbigpLmdldE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKHJlc291cmNlTWFwcGluZy5nZXRNYXBwaW5nS2V5KCkpOworCQlyZXR1cm4gbWFwcGluZ0RlZmluaXRpb24uYnVpbGRDb250ZXh0TWFwcGluZyh0aGlzLCByZXNvdXJjZU1hcHBpbmcsIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIE9ybVN0cnVjdHVyZU5vZGVzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lEOworCX0KKwkKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCSByZXR1cm4gZ2V0U3BlY2lmaWVkQWNjZXNzKCkgIT0gbnVsbCA/IGdldFNwZWNpZmllZEFjY2VzcygpIDogZ2V0RGVmYXVsdEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXREZWZhdWx0QWNjZXNzKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWNjZXNzOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdBY2Nlc3MpIHsKKwkJQWNjZXNzVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRBY2Nlc3M7CisJCXRoaXMuZGVmYXVsdEFjY2VzcyA9IG5ld0FjY2VzczsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0FDQ0VTU19QUk9QRVJUWSwgb2xkLCB0aGlzLmRlZmF1bHRBY2Nlc3MpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLmF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZSgpOworCX0KKworCXB1YmxpYyB2b2lkIG5hbWVDaGFuZ2VkKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgeworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOworCX0KKworCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldFNwZWNpZmllZE1hcHBpbmcoKSB7CisJCXJldHVybiB0aGlzLmF0dHJpYnV0ZU1hcHBpbmc7CisJfQorCQorCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldE1hcHBpbmcoKSB7CisJCXJldHVybiB0aGlzLmF0dHJpYnV0ZU1hcHBpbmc7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nLmdldEtleSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE1hcHBpbmdLZXkoU3RyaW5nIG5ld01hcHBpbmdLZXkpIHsKKwkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwodGhpcy5nZXRNYXBwaW5nS2V5KCksIG5ld01hcHBpbmdLZXkpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJT3JtQXR0cmlidXRlTWFwcGluZyBvbGRNYXBwaW5nID0gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nOworCQlPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBtYXBwaW5nRGVmaW5pdGlvbiA9IAorCQkJCWdldE1hcHBpbmdGaWxlRGVmaW5pdGlvbigpLmdldE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKG5ld01hcHBpbmdLZXkpOworCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlQXR0cmlidXRlTWFwcGluZyA9IAorCQkJCW1hcHBpbmdEZWZpbml0aW9uLmJ1aWxkUmVzb3VyY2VNYXBwaW5nKGdldFJlc291cmNlTm9kZUZhY3RvcnkoKSk7CisJCXRoaXMuYXR0cmlidXRlTWFwcGluZyA9IGJ1aWxkQXR0cmlidXRlTWFwcGluZyhyZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCQkKKwkJZ2V0UGVyc2lzdGVudFR5cGUoKS5jaGFuZ2VNYXBwaW5nKHRoaXMsIG9sZE1hcHBpbmcsIHRoaXMuYXR0cmlidXRlTWFwcGluZyk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01BUFBJTkdfUFJPUEVSVFksIG9sZE1hcHBpbmcsIHRoaXMuYXR0cmlidXRlTWFwcGluZyk7CisJfQorCisJcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKCkgeworCQlyZXR1cm4gKE9ybVBlcnNpc3RlbnRUeXBlKSBnZXRQYXJlbnQoKTsKKwl9CisKKwlwdWJsaWMgT3JtVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCXJldHVybiBnZXRQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7CisJCXJldHVybiBnZXRQZXJzaXN0ZW50VHlwZSgpLmNvbnRhaW5zVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcyk7CisJfQorCisJcHVibGljIHZvaWQgbWFrZVZpcnR1YWwoKSB7CisJCWlmIChpc1ZpcnR1YWwoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXR0cmlidXRlIGlzIGFscmVhZHkgdmlydHVhbCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJZ2V0UGVyc2lzdGVudFR5cGUoKS5tYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVZpcnR1YWwodGhpcyk7CisJfQorCQorCXB1YmxpYyB2b2lkIG1ha2VTcGVjaWZpZWQoKSB7CisJCWlmICghaXNWaXJ0dWFsKCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dHJpYnV0ZSBpcyBhbHJlYWR5IHNwZWNpZmllZCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKGdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVXNlIG1ha2VTcGVjaWZpZWQoU3RyaW5nKSBpbnN0ZWFkIGFuZCBzcGVjaWZ5IGEgbWFwcGluZyB0eXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlnZXRQZXJzaXN0ZW50VHlwZSgpLm1ha2VQZXJzaXN0ZW50QXR0cmlidXRlU3BlY2lmaWVkKHRoaXMpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBtYWtlU3BlY2lmaWVkKFN0cmluZyBtYXBwaW5nS2V5KSB7CisJCWlmICghaXNWaXJ0dWFsKCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dHJpYnV0ZSBpcyBhbHJlYWR5IHNwZWNpZmllZCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJZ2V0UGVyc2lzdGVudFR5cGUoKS5tYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVNwZWNpZmllZCh0aGlzLCBtYXBwaW5nS2V5KTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwcGluZy5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzSWRBdHRyaWJ1dGUoKSB7CisJCXJldHVybiB0aGlzLmF0dHJpYnV0ZU1hcHBpbmcuaXNJZE1hcHBpbmcoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl0aGlzLmF0dHJpYnV0ZU1hcHBpbmcudXBkYXRlKCk7CisJCXRoaXMuc2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoZmluZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQl0aGlzLm93bmVyLnVwZGF0ZUphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCXRoaXMuc2V0RGVmYXVsdEFjY2VzcyhidWlsZERlZmF1bHRBY2Nlc3MoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcG9zdFVwZGF0ZSgpIHsKKwkJc3VwZXIucG9zdFVwZGF0ZSgpOworCQlnZXRNYXBwaW5nKCkucG9zdFVwZGF0ZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZmluZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgeworCQlyZXR1cm4gdGhpcy5vd25lci5maW5kSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcyk7CisJfQorCQorCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGJ1aWxkRGVmYXVsdEFjY2VzcygpIHsKKwkJcmV0dXJuIGdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IG9mZnNldCkgeworCQlyZXR1cm4gdGhpczsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgdGV4dE9mZnNldCkgeworCQlpZiAoaXNWaXJ0dWFsKCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nLmNvbnRhaW5zKHRleHRPZmZzZXQpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKKwkJaWYgKGlzVmlydHVhbCgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCXRoaXMudmFsaWRhdGVBdHRyaWJ1dGUobWVzc2FnZXMpOworCQl0aGlzLnZhbGlkYXRlTW9kaWZpZXJzKG1lc3NhZ2VzKTsKKwkJdGhpcy5hdHRyaWJ1dGVNYXBwaW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXR0cmlidXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7CisJCWlmICh0aGlzLmphdmFQZXJzaXN0ZW50QXR0cmlidXRlID09IG51bGwpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKSwgdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKX0sCisJCQkJCXRoaXMuYXR0cmlidXRlTWFwcGluZywgCisJCQkJCXRoaXMuYXR0cmlidXRlTWFwcGluZy5nZXROYW1lVGV4dFJhbmdlKCkKKwkJCQkpCisJCQkpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTW9kaWZpZXJzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7CisJCWlmICh0aGlzLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHRoaXMuamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHRoaXMuamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNGaWVsZCgpKSB7CisJCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5pc0ZpbmFsKCkpIHsKKwkJCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZEF0dHJpYnV0ZU1lc3NhZ2UoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0ZJTkFMX0ZJRUxEKSk7CisJCQl9CisJCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1B1YmxpYygpKSB7CisJCQkJbWVzc2FnZXMuYWRkKHRoaXMuYnVpbGRBdHRyaWJ1dGVNZXNzYWdlKEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9QVUJMSUNfRklFTEQpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vVE9ETyB2YWxpZGF0aW9uIDogbmVlZCB0byBoYXZlIGEgdmFsaWRhdGlvbiBtZXNzYWdlIGZvciBmaW5hbCBtZXRob2RzIGFzIHdlbGwuCisJCQkvL0Zyb20gdGhlIEpQQSBzcGVjIDogTm8gbWV0aG9kcyBvciBwZXJzaXN0ZW50IGluc3RhbmNlIHZhcmlhYmxlcyBvZiB0aGUgZW50aXR5IGNsYXNzIG1heSBiZSBmaW5hbC4KKwkJfQorCX0KKworCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZEF0dHJpYnV0ZU1lc3NhZ2UoU3RyaW5nIG1zZ0lEKSB7CisJCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQltc2dJRCwKKwkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAorCQkJdGhpcywgCisJCQlnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKKwkJKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCWlmIChpc1ZpcnR1YWwoKSkgeworCQkJcmV0dXJuIGdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpLmdldEF0dHJpYnV0ZXNUZXh0UmFuZ2UoKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vbm90aGluZyB0byBkaXNwb3NlCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1RdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtUXVlcnkuamF2YQppbmRleCBhM2NmMzZmLi5mZTlhZWRmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1RdWVyeS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVF1ZXJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsMjIgKzEwLDI2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeUhpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpwYUNvbnRleHROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5SGludDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CiAKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtUXVlcnk8RSBleHRlbmRzIFhtbFF1ZXJ5PiBleHRlbmRzIEFic3RyYWN0T3JtSnBhQ29udGV4dE5vZGUgCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1RdWVyeTxFIGV4dGVuZHMgWG1sUXVlcnk+IGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZSAKIAlpbXBsZW1lbnRzIE9ybVF1ZXJ5CiB7CiAKQEAgLTM1LDE1ICszOSwxNiBAQAogCiAJcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtUXVlcnlIaW50PiBoaW50czsKIAotCXByb3RlY3RlZCBFIHF1ZXJ5UmVzb3VyY2U7CisJcHJvdGVjdGVkIEUgcmVzb3VyY2VRdWVyeTsKIAkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1RdWVyeShPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1RdWVyeShYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIEUgcmVzb3VyY2VRdWVyeSkgewogCQlzdXBlcihwYXJlbnQpOwogCQl0aGlzLmhpbnRzID0gbmV3IEFycmF5TGlzdDxPcm1RdWVyeUhpbnQ+KCk7CisJCXRoaXMuaW5pdGlhbGl6ZShyZXNvdXJjZVF1ZXJ5KTsKIAl9CiAKLQlwcm90ZWN0ZWQgRSBnZXRRdWVyeVJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5xdWVyeVJlc291cmNlOworCXByb3RlY3RlZCBFIGdldFJlc291cmNlUXVlcnkoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlUXVlcnk7CiAJfQogCQogCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKQEAgLTUzLDcgKzU4LDcgQEAKIAlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CiAJCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwogCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQl0aGlzLmdldFF1ZXJ5UmVzb3VyY2UoKS5zZXROYW1lKG5ld05hbWUpOworCQl0aGlzLmdldFJlc291cmNlUXVlcnkoKS5zZXROYW1lKG5ld05hbWUpOwogCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFF1ZXJ5Lk5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwogCX0KIApAQCAtNjQsNyArNjksNyBAQAogCXB1YmxpYyB2b2lkIHNldFF1ZXJ5KFN0cmluZyBuZXdRdWVyeSkgewogCQlTdHJpbmcgb2xkUXVlcnkgPSB0aGlzLnF1ZXJ5OwogCQl0aGlzLnF1ZXJ5ID0gbmV3UXVlcnk7Ci0JCXRoaXMuZ2V0UXVlcnlSZXNvdXJjZSgpLnNldFF1ZXJ5KG5ld1F1ZXJ5KTsKKwkJdGhpcy5nZXRSZXNvdXJjZVF1ZXJ5KCkuc2V0UXVlcnkobmV3UXVlcnkpOwogCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFF1ZXJ5LlFVRVJZX1BST1BFUlRZLCBvbGRRdWVyeSwgbmV3UXVlcnkpOwogCX0KIApAQCAtNzcsMjQgKzgyLDI5IEBACiAJfQogCQogCXB1YmxpYyBPcm1RdWVyeUhpbnQgYWRkSGludChpbnQgaW5kZXgpIHsKLQkJT3JtUXVlcnlIaW50IHF1ZXJ5SGludCA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVF1ZXJ5SGludCh0aGlzKTsKLQkJdGhpcy5oaW50cy5hZGQoaW5kZXgsIHF1ZXJ5SGludCk7Ci0JCXRoaXMuZ2V0UXVlcnlSZXNvdXJjZSgpLmdldEhpbnRzKCkuYWRkKGluZGV4LCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxRdWVyeUhpbnQoKSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChRdWVyeS5ISU5UU19MSVNULCBpbmRleCwgcXVlcnlIaW50KTsKLQkJcmV0dXJuIHF1ZXJ5SGludDsKKwkJWG1sUXVlcnlIaW50IHJlc291cmNlUXVlcnlIaW50ID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUXVlcnlIaW50KCk7CisJCU9ybVF1ZXJ5SGludCBjb250ZXh0UXVlcnlIaW50ID0gYnVpbGRRdWVyeUhpbnQocmVzb3VyY2VRdWVyeUhpbnQpOworCQl0aGlzLmhpbnRzLmFkZChpbmRleCwgY29udGV4dFF1ZXJ5SGludCk7CisJCXRoaXMuZ2V0UmVzb3VyY2VRdWVyeSgpLmdldEhpbnRzKCkuYWRkKGluZGV4LCByZXNvdXJjZVF1ZXJ5SGludCk7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChRdWVyeS5ISU5UU19MSVNULCBpbmRleCwgY29udGV4dFF1ZXJ5SGludCk7CisJCXJldHVybiBjb250ZXh0UXVlcnlIaW50OwogCX0KIAogCXByb3RlY3RlZCB2b2lkIGFkZEhpbnQoaW50IGluZGV4LCBPcm1RdWVyeUhpbnQgcXVlcnlIaW50KSB7CiAJCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHF1ZXJ5SGludCwgdGhpcy5oaW50cywgUXVlcnkuSElOVFNfTElTVCk7CiAJfQogCQorCXByb3RlY3RlZCB2b2lkIGFkZEhpbnQoT3JtUXVlcnlIaW50IHF1ZXJ5SGludCkgeworCQl0aGlzLmFkZEhpbnQodGhpcy5oaW50cy5zaXplKCksIHF1ZXJ5SGludCk7CisJfQorCQogCXB1YmxpYyB2b2lkIHJlbW92ZUhpbnQoUXVlcnlIaW50IHF1ZXJ5SGludCkgewogCQlyZW1vdmVIaW50KHRoaXMuaGludHMuaW5kZXhPZihxdWVyeUhpbnQpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgcmVtb3ZlSGludChpbnQgaW5kZXgpIHsKIAkJT3JtUXVlcnlIaW50IHF1ZXJ5SGludCA9IHRoaXMuaGludHMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5xdWVyeVJlc291cmNlLmdldEhpbnRzKCkucmVtb3ZlKGluZGV4KTsKKwkJdGhpcy5nZXRSZXNvdXJjZVF1ZXJ5KCkuZ2V0SGludHMoKS5yZW1vdmUoaW5kZXgpOwogCQlmaXJlSXRlbVJlbW92ZWQoUXVlcnkuSElOVFNfTElTVCwgaW5kZXgsIHF1ZXJ5SGludCk7CiAJfQogCkBAIC0xMDMsNzAgKzExMyw4MSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCBtb3ZlSGludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLnF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCXRoaXMuZ2V0UmVzb3VyY2VRdWVyeSgpLmdldEhpbnRzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwogCQltb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMuaGludHMsIFF1ZXJ5LkhJTlRTX0xJU1QpOwkJCi0JCQogCX0KIAogCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoRSBxdWVyeVJlc291cmNlKSB7Ci0JCXRoaXMucXVlcnlSZXNvdXJjZSA9IHF1ZXJ5UmVzb3VyY2U7Ci0JCXRoaXMubmFtZSA9IHF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpOwotCQl0aGlzLnF1ZXJ5ID0gcXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpOwotCQl0aGlzLmluaXRpYWxpemVIaW50cyhxdWVyeVJlc291cmNlKTsKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEUgeG1sUXVlcnkpIHsKKwkJdGhpcy5yZXNvdXJjZVF1ZXJ5ID0geG1sUXVlcnk7CisJCXRoaXMubmFtZSA9IHhtbFF1ZXJ5LmdldE5hbWUoKTsKKwkJdGhpcy5xdWVyeSA9IHhtbFF1ZXJ5LmdldFF1ZXJ5KCk7CisJCXRoaXMuaW5pdGlhbGl6ZUhpbnRzKCk7CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVIaW50cyhFIHF1ZXJ5UmVzb3VyY2UpIHsKLQkJZm9yIChYbWxRdWVyeUhpbnQgcXVlcnloaW50IDogcXVlcnlSZXNvdXJjZS5nZXRIaW50cygpKSB7Ci0JCQl0aGlzLmhpbnRzLmFkZChjcmVhdGVIaW50KHF1ZXJ5aGludCkpOworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVIaW50cygpIHsKKwkJZm9yIChYbWxRdWVyeUhpbnQgcmVzb3VyY2VRdWVyeUhpbnQgOiB0aGlzLnJlc291cmNlUXVlcnkuZ2V0SGludHMoKSkgeworCQkJdGhpcy5oaW50cy5hZGQoYnVpbGRRdWVyeUhpbnQocmVzb3VyY2VRdWVyeUhpbnQpKTsKIAkJfQogCX0KIAotCXByb3RlY3RlZCBPcm1RdWVyeUhpbnQgY3JlYXRlSGludChYbWxRdWVyeUhpbnQgcXVlcnlIaW50KSB7Ci0JCU9ybVF1ZXJ5SGludCBvcm1RdWVyeUhpbnQgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1RdWVyeUhpbnQodGhpcyk7Ci0JCW9ybVF1ZXJ5SGludC5pbml0aWFsaXplKHF1ZXJ5SGludCk7Ci0JCXJldHVybiBvcm1RdWVyeUhpbnQ7CisJcHJvdGVjdGVkIE9ybVF1ZXJ5SGludCBidWlsZFF1ZXJ5SGludChYbWxRdWVyeUhpbnQgcmVzb3VyY2VRdWVyeUhpbnQpIHsKKwkJcmV0dXJuIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtUXVlcnlIaW50KHRoaXMsIHJlc291cmNlUXVlcnlIaW50KTsKIAl9CiAJCi0JcHVibGljIHZvaWQgdXBkYXRlKEUgcXVlcnlSZXNvdXJjZSkgewotCQl0aGlzLnF1ZXJ5UmVzb3VyY2UgPSBxdWVyeVJlc291cmNlOwotCQl0aGlzLnNldE5hbWUocXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQl0aGlzLnNldFF1ZXJ5KHF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7Ci0JCXRoaXMudXBkYXRlSGludHMocXVlcnlSZXNvdXJjZSk7CisJcHVibGljIHZvaWQgdXBkYXRlKEUgeG1sUXVlcnkpIHsKKwkJdGhpcy5yZXNvdXJjZVF1ZXJ5ID0geG1sUXVlcnk7CisJCXRoaXMuc2V0TmFtZSh4bWxRdWVyeS5nZXROYW1lKCkpOworCQl0aGlzLnNldFF1ZXJ5KHhtbFF1ZXJ5LmdldFF1ZXJ5KCkpOworCQl0aGlzLnVwZGF0ZUhpbnRzKCk7CisJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZFF1ZXJ5KHRoaXMpOwogCX0KIAkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVIaW50cyhFIHF1ZXJ5UmVzb3VyY2UpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybVF1ZXJ5SGludD4gaGludHMgPSBoaW50cygpOwotCQlMaXN0SXRlcmF0b3I8WG1sUXVlcnlIaW50PiByZXNvdXJjZUhpbnRzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbFF1ZXJ5SGludD4ocXVlcnlSZXNvdXJjZS5nZXRIaW50cygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJCi0JCXdoaWxlIChoaW50cy5oYXNOZXh0KCkpIHsKLQkJCU9ybVF1ZXJ5SGludCBoaW50ID0gaGludHMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlSGludHMuaGFzTmV4dCgpKSB7Ci0JCQkJaGludC51cGRhdGUocmVzb3VyY2VIaW50cy5uZXh0KCkpOworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUhpbnRzKCkgeworCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgWE1MIGhpbnRzICh0byBwcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24pCisJCUl0ZXJhdG9yPFhtbFF1ZXJ5SGludD4geG1sSGludHMgPSBuZXcgQ2xvbmVJdGVyYXRvcjxYbWxRdWVyeUhpbnQ+KHRoaXMucmVzb3VyY2VRdWVyeS5nZXRIaW50cygpKTsKKworCQlmb3IgKEl0ZXJhdG9yPE9ybVF1ZXJ5SGludD4gY29udGV4dEhpbnRzID0gdGhpcy5oaW50cygpOyBjb250ZXh0SGludHMuaGFzTmV4dCgpOyApIHsKKwkJCU9ybVF1ZXJ5SGludCBjb250ZXh0SGludCA9IGNvbnRleHRIaW50cy5uZXh0KCk7CisJCQlpZiAoeG1sSGludHMuaGFzTmV4dCgpKSB7CisJCQkJY29udGV4dEhpbnQudXBkYXRlKHhtbEhpbnRzLm5leHQoKSk7CiAJCQl9CiAJCQllbHNlIHsKLQkJCQlyZW1vdmVIaW50XyhoaW50KTsKKwkJCQlyZW1vdmVIaW50Xyhjb250ZXh0SGludCk7CiAJCQl9CiAJCX0KIAkJCi0JCXdoaWxlIChyZXNvdXJjZUhpbnRzLmhhc05leHQoKSkgewotCQkJYWRkSGludChoaW50c1NpemUoKSwgY3JlYXRlSGludChyZXNvdXJjZUhpbnRzLm5leHQoKSkpOworCQl3aGlsZSAoeG1sSGludHMuaGFzTmV4dCgpKSB7CisJCQlhZGRIaW50KGJ1aWxkUXVlcnlIaW50KHhtbEhpbnRzLm5leHQoKSkpOwogCQl9CiAJfQogCQotCXB1YmxpYyBib29sZWFuIG92ZXJyaWRlcyhRdWVyeSBxdWVyeSkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQorCXB1YmxpYyBib29sZWFuIG92ZXJyaWRlcyhRdWVyeSBvdGhlcikgewogCQkvLyB0aGlzIGlzbid0IGlkZWFsLCBidXQgaXQgd2lsbCBoYXZlIHRvIGRvIHVudGlsIHdlIGhhdmUgZnVydGhlciBhZG9wdGVyIGlucHV0Ci0JCXJldHVybiB0aGlzLmdldE5hbWUoKS5lcXVhbHMocXVlcnkuZ2V0TmFtZSgpKSAmJiBxdWVyeSBpbnN0YW5jZW9mIEphdmFRdWVyeTsKKwkJcmV0dXJuICh0aGlzLm5hbWUgIT0gbnVsbCkKKwkJCQkmJiB0aGlzLm5hbWUuZXF1YWxzKG90aGVyLmdldE5hbWUoKSkKKwkJCQkmJiAob3RoZXIgaW5zdGFuY2VvZiBKYXZhUXVlcnkpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBkdXBsaWNhdGVzKFF1ZXJ5IG90aGVyKSB7CisJCXJldHVybiAodGhpcyAhPSBvdGhlcikKKwkJCQkmJiAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKQorCQkJCSYmIHRoaXMubmFtZS5lcXVhbHMob3RoZXIuZ2V0TmFtZSgpKQorCQkJCSYmICEgdGhpcy5vdmVycmlkZXMob3RoZXIpCisJCQkJJiYgISBvdGhlci5vdmVycmlkZXModGhpcyk7CiAJfQogCiAJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRRdWVyeVJlc291cmNlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZVF1ZXJ5KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwogCX0KIAkKIAlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFF1ZXJ5UmVzb3VyY2UoKS5nZXROYW1lVGV4dFJhbmdlKCk7CisJCXJldHVybiB0aGlzLmdldFJlc291cmNlUXVlcnkoKS5nZXROYW1lVGV4dFJhbmdlKCk7CiAJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKKwl9CisKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQppbmRleCA5NDE2NzBlLi5hYmIzZDJjIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1SZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDIwNSArMTAsMzQ4IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ2FzY2FkZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk1ldGFtb2RlbEZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CiAKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtUmVsYXRpb25zaGlwTWFwcGluZzxUIGV4dGVuZHMgWG1sUmVsYXRpb25zaGlwTWFwcGluZz4gZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8VD4KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVJlbGF0aW9uc2hpcE1hcHBpbmc8VCBleHRlbmRzIEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZz4KKwlleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxUPgogCWltcGxlbWVudHMgT3JtUmVsYXRpb25zaGlwTWFwcGluZwogewotCQogCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVGFyZ2V0RW50aXR5OwotCiAJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFyZ2V0RW50aXR5OwotCiAJcHJvdGVjdGVkIEVudGl0eSByZXNvbHZlZFRhcmdldEVudGl0eTsKIAkKLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIHNwZWNpZmllZEZldGNoOworCXByb3RlY3RlZCBmaW5hbCBPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UgcmVsYXRpb25zaGlwUmVmZXJlbmNlOwogCQogCXByb3RlY3RlZCBmaW5hbCBPcm1DYXNjYWRlIGNhc2NhZGU7CiAKKwlwcm90ZWN0ZWQgRmV0Y2hUeXBlIHNwZWNpZmllZEZldGNoOwogCQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jYXNjYWRlID0gbmV3IE9ybUNhc2NhZGUodGhpcyk7CisJCisJcHJvdGVjdGVkIEFic3RyYWN0T3JtUmVsYXRpb25zaGlwTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgVCByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCQl0aGlzLnJlbGF0aW9uc2hpcFJlZmVyZW5jZSA9IGJ1aWxkUmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CisJCXRoaXMuY2FzY2FkZSA9IGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtQ2FzY2FkZSh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJCXRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5ID0gZ2V0UmVzb3VyY2VUYXJnZXRFbnRpdHkoKTsKKwkJdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5ID0gYnVpbGREZWZhdWx0VGFyZ2V0RW50aXR5KCk7CisJCXRoaXMucmVzb2x2ZWRUYXJnZXRFbnRpdHkgPSBidWlsZFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7CisJCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSBnZXRSZXNvdXJjZUZldGNoKCk7CiAJfQorCQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UgYnVpbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKIAorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNSZWxhdGlvbnNoaXBPd25lcigpIHsKKwkJcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwUmVmZXJlbmNlLmlzUmVsYXRpb25zaGlwT3duZXIoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNPd25lZEJ5KFJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZykgeworCQlyZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBSZWZlcmVuY2UuaXNPd25lZEJ5KG1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nKCkgeworCQlyZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBSZWZlcmVuY2UuaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uKCk7CisJfQkKKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHRhcmdldCBlbnRpdHkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlwdWJsaWMgY2hhciBnZXRUYXJnZXRFbnRpdHlFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgeworCQlyZXR1cm4gJyQnOworCX0KKwkKIAlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpIDogdGhpcy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKTsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5IDogdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5OwogCX0KIAogCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgewogCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHk7CiAJfQogCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KFN0cmluZyBuZXdTcGVjaWZpZWRUYXJnZXRFbnRpdHkpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFRhcmdldEVudGl0eSA9IHRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5OwotCQl0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eSA9IG5ld1NwZWNpZmllZFRhcmdldEVudGl0eTsKLQkJZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldFRhcmdldEVudGl0eShuZXdTcGVjaWZpZWRUYXJnZXRFbnRpdHkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRUYXJnZXRFbnRpdHksIG5ld1NwZWNpZmllZFRhcmdldEVudGl0eSk7CisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KFN0cmluZyB0YXJnZXRFbnRpdHkpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5OworCQl0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eSA9IHRhcmdldEVudGl0eTsKKwkJdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuc2V0VGFyZ2V0RW50aXR5KHRhcmdldEVudGl0eSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkLCB0YXJnZXRFbnRpdHkpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFRhcmdldEVudGl0eV8oU3RyaW5nIG5ld1NwZWNpZmllZFRhcmdldEVudGl0eSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkVGFyZ2V0RW50aXR5ID0gdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHk7Ci0JCXRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5ID0gbmV3U3BlY2lmaWVkVGFyZ2V0RW50aXR5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRUYXJnZXRFbnRpdHksIG5ld1NwZWNpZmllZFRhcmdldEVudGl0eSk7CisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5XyhTdHJpbmcgdGFyZ2V0RW50aXR5KSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eTsKKwkJdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHkgPSB0YXJnZXRFbnRpdHk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkLCB0YXJnZXRFbnRpdHkpOwogCX0KIAogCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpIHsKIAkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhcmdldEVudGl0eTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VGFyZ2V0RW50aXR5KFN0cmluZyBuZXdEZWZhdWx0VGFyZ2V0RW50aXR5KSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0VGFyZ2V0RW50aXR5ID0gdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5OwotCQl0aGlzLmRlZmF1bHRUYXJnZXRFbnRpdHkgPSBuZXdEZWZhdWx0VGFyZ2V0RW50aXR5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkRGVmYXVsdFRhcmdldEVudGl0eSwgbmV3RGVmYXVsdFRhcmdldEVudGl0eSk7CisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFRhcmdldEVudGl0eShTdHJpbmcgdGFyZ2V0RW50aXR5KSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRUYXJnZXRFbnRpdHk7CisJCXRoaXMuZGVmYXVsdFRhcmdldEVudGl0eSA9IHRhcmdldEVudGl0eTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkLCB0YXJnZXRFbnRpdHkpOwogCX0KIAogCXB1YmxpYyBFbnRpdHkgZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSB7CiAJCXJldHVybiB0aGlzLnJlc29sdmVkVGFyZ2V0RW50aXR5OwogCX0KIAotCXByb3RlY3RlZCB2b2lkIHNldFJlc29sdmVkVGFyZ2V0RW50aXR5KEVudGl0eSBuZXdSZXNvbHZlZFRhcmdldEVudGl0eSkgewotCQlFbnRpdHkgb2xkUmVzb2x2ZWRUYXJnZXRFbnRpdHkgPSB0aGlzLnJlc29sdmVkVGFyZ2V0RW50aXR5OwotCQl0aGlzLnJlc29sdmVkVGFyZ2V0RW50aXR5ID0gbmV3UmVzb2x2ZWRUYXJnZXRFbnRpdHk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVTT0xWRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkUmVzb2x2ZWRUYXJnZXRFbnRpdHksIG5ld1Jlc29sdmVkVGFyZ2V0RW50aXR5KTsKKwlwcm90ZWN0ZWQgdm9pZCBzZXRSZXNvbHZlZFRhcmdldEVudGl0eShFbnRpdHkgdGFyZ2V0RW50aXR5KSB7CisJCUVudGl0eSBvbGQgPSB0aGlzLnJlc29sdmVkVGFyZ2V0RW50aXR5OworCQl0aGlzLnJlc29sdmVkVGFyZ2V0RW50aXR5ID0gdGFyZ2V0RW50aXR5OworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVTT0xWRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkLCB0YXJnZXRFbnRpdHkpOwogCX0KIAorCisJLy8gKioqKioqKioqKioqKioqKiByZWZlcmVuY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBSZWZlcmVuY2U7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogY2FzY2FkZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgT3JtQ2FzY2FkZSBnZXRDYXNjYWRlKCkgeworCQlyZXR1cm4gdGhpcy5jYXNjYWRlOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGZldGNoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKIAlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkRmV0Y2goKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEZldGNoKCkgOiB0aGlzLmdldFNwZWNpZmllZEZldGNoKCk7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRGZXRjaCAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkRmV0Y2ggOiB0aGlzLmdldERlZmF1bHRGZXRjaCgpOwogCX0KIAogCXB1YmxpYyBGZXRjaFR5cGUgZ2V0U3BlY2lmaWVkRmV0Y2goKSB7CiAJCXJldHVybiB0aGlzLnNwZWNpZmllZEZldGNoOwogCX0KIAkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUgbmV3U3BlY2lmaWVkRmV0Y2gpIHsKLQkJRmV0Y2hUeXBlIG9sZEZldGNoID0gdGhpcy5zcGVjaWZpZWRGZXRjaDsKLQkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IG5ld1NwZWNpZmllZEZldGNoOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRGZXRjaChGZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZEZldGNoKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRmV0Y2hhYmxlLlNQRUNJRklFRF9GRVRDSF9QUk9QRVJUWSwgb2xkRmV0Y2gsIG5ld1NwZWNpZmllZEZldGNoKTsKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpIHsKKwkJRmV0Y2hUeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkRmV0Y2g7CisJCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSBmZXRjaDsKKwkJdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuc2V0RmV0Y2goRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChmZXRjaCkpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaF8oRmV0Y2hUeXBlIG5ld1NwZWNpZmllZEZldGNoKSB7Ci0JCUZldGNoVHlwZSBvbGRGZXRjaCA9IHRoaXMuc3BlY2lmaWVkRmV0Y2g7Ci0JCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSBuZXdTcGVjaWZpZWRGZXRjaDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChGZXRjaGFibGUuU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGRGZXRjaCwgbmV3U3BlY2lmaWVkRmV0Y2gpOwotCX0KLQotCXB1YmxpYyBPcm1DYXNjYWRlIGdldENhc2NhZGUoKSB7Ci0JCXJldHVybiB0aGlzLmNhc2NhZGU7CisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRmV0Y2hfKEZldGNoVHlwZSBmZXRjaCkgeworCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRGZXRjaDsKKwkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IGZldGNoOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKIAl9CiAKIAorCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgPT4gY29udGV4dCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoT3JtUmVsYXRpb25zaGlwTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tWG1sUmVsYXRpb25zaGlwTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG9sZE1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlzZXRTcGVjaWZpZWRGZXRjaChvbGRNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlnZXRDYXNjYWRlKCkuaW5pdGlhbGl6ZUZyb20ob2xkTWFwcGluZy5nZXRDYXNjYWRlKCkpOwotCQkvL1RPRE8gc2hvdWxkIHdlIHNldCB0aGUgZmV0Y2ggdHlwZSBmcm9tIGEgQmFzaWNNYXBwaW5nPz8KKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFNwZWNpZmllZFRhcmdldEVudGl0eV8odGhpcy5nZXRSZXNvdXJjZVRhcmdldEVudGl0eSgpKTsKKwkJdGhpcy5zZXREZWZhdWx0VGFyZ2V0RW50aXR5KHRoaXMuYnVpbGREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOworCQl0aGlzLnNldFJlc29sdmVkVGFyZ2V0RW50aXR5KHRoaXMuYnVpbGRSZXNvbHZlZFRhcmdldEVudGl0eSgpKTsKKwkJdGhpcy5yZWxhdGlvbnNoaXBSZWZlcmVuY2UudXBkYXRlKCk7CisJCXRoaXMuc2V0U3BlY2lmaWVkRmV0Y2hfKHRoaXMuZ2V0UmVzb3VyY2VGZXRjaCgpKTsKKwkJdGhpcy5jYXNjYWRlLnVwZGF0ZSgpOwogCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbFRhcmdldEVudGl0eUF0dHJpYnV0ZU5hbWVzKCkgewotCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQlyZXR1cm4gKHRhcmdldEVudGl0eSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPFN0cmluZz4gaW5zdGFuY2UoKSA6IHRhcmdldEVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZU5hbWVzKCk7CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZVRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpOwogCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmFsbFRhcmdldEVudGl0eUF0dHJpYnV0ZU5hbWVzKCk7CisJCisJcHJvdGVjdGVkIEZldGNoVHlwZSBnZXRSZXNvdXJjZUZldGNoKCkgeworCQlyZXR1cm4gRmV0Y2hUeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLmdldEZldGNoKCkpOwogCX0KLQkJCi0JcHVibGljIEVudGl0eSBnZXRFbnRpdHkoKSB7Ci0JCWlmIChnZXRUeXBlTWFwcGluZygpIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlyZXR1cm4gKEVudGl0eSkgZ2V0VHlwZU1hcHBpbmcoKTsKKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFRhcmdldEVudGl0eSgpIHsKKwkJUmVsYXRpb25zaGlwTWFwcGluZyBqYXZhTWFwcGluZyA9IGdldEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nKCk7CisJCWlmIChqYXZhTWFwcGluZyAhPSBudWxsKSB7CisJCQlpZiAoZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpICYmICFnZXRUeXBlTWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQkJcmV0dXJuIGphdmFNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpOworCQkJfQorCQl9CisJCWlmICh0aGlzLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIGdldFJlc291cmNlRGVmYXVsdFRhcmdldEVudGl0eSgpOwogCQl9CiAJCXJldHVybiBudWxsOwogCX0KIAkKLQlwdWJsaWMgYm9vbGVhbiB0YXJnZXRFbnRpdHlJc1ZhbGlkKFN0cmluZyB0YXJnZXRFbnRpdHkpIHsKLQkJcmV0dXJuIE1hcHBpbmdUb29scy50YXJnZXRFbnRpdHlJc1ZhbGlkKHRhcmdldEVudGl0eSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVCByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5ID0gcmVsYXRpb25zaGlwTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKTsKLQkJdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5ID0gdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5KCk7Ci0JCXRoaXMucmVzb2x2ZWRUYXJnZXRFbnRpdHkgPSB0aGlzLnJlc29sdmVUYXJnZXRFbnRpdHkoKTsKLQkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IHRoaXMuc3BlY2lmaWVkRmV0Y2gocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JCXRoaXMuY2FzY2FkZS5pbml0aWFsaXplKHJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoVCByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXN1cGVyLnVwZGF0ZShyZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHlfKHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQl0aGlzLnNldERlZmF1bHRUYXJnZXRFbnRpdHkodGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQl0aGlzLnNldFJlc29sdmVkVGFyZ2V0RW50aXR5KHRoaXMucmVzb2x2ZVRhcmdldEVudGl0eSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRGZXRjaF8odGhpcy5zcGVjaWZpZWRGZXRjaChyZWxhdGlvbnNoaXBNYXBwaW5nKSk7Ci0JCXRoaXMuY2FzY2FkZS51cGRhdGUocmVsYXRpb25zaGlwTWFwcGluZyk7Ci0JfQotCQotCXByb3RlY3RlZCBGZXRjaFR5cGUgc3BlY2lmaWVkRmV0Y2goWG1sUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXJldHVybiBGZXRjaFR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwocmVsYXRpb25zaGlwTWFwcGluZy5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcE1hcHBpbmcgamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCWlmIChmaW5kSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSA9PSBudWxsKSB7CisJcHJvdGVjdGVkIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0SmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7CisJCWlmICh0aGlzLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZyA9IGZpbmRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZyA9IHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7CiAJCWlmIChqYXZhQXR0cmlidXRlTWFwcGluZyBpbnN0YW5jZW9mIFJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKIAkJCXJldHVybiAoKFJlbGF0aW9uc2hpcE1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAJCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFyZ2V0RW50aXR5KCkgewotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIGphdmFNYXBwaW5nID0gamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJaWYgKGphdmFNYXBwaW5nICE9IG51bGwpIHsKLQkJCWlmIChnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkgJiYgIWdldFR5cGVNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCQlyZXR1cm4gamF2YU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbmRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWZhdWx0VGFyZ2V0RW50aXR5KGZpbmRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkZWZhdWx0VGFyZ2V0RW50aXR5KEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlKTsKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFJlc291cmNlRGVmYXVsdFRhcmdldEVudGl0eSgpOwogCi0JcHJvdGVjdGVkIEVudGl0eSByZXNvbHZlVGFyZ2V0RW50aXR5KCkgewotCQlpZiAoZ2V0VGFyZ2V0RW50aXR5KCkgPT0gbnVsbCkgeworCXByb3RlY3RlZCBFbnRpdHkgYnVpbGRSZXNvbHZlZFRhcmdldEVudGl0eSgpIHsKKwkJU3RyaW5nIHRhcmdldEVudGl0eU5hbWUgPSB0aGlzLmdldFRhcmdldEVudGl0eSgpOworCQlpZiAodGFyZ2V0RW50aXR5TmFtZSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldFRhcmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCWlmIChwZXJzaXN0ZW50VHlwZSAhPSBudWxsICYmIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSkgewotCQkJcmV0dXJuIChFbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKworCQkvLyBmaXJzdCB0cnkgdG8gcmVzb2x2ZSB1c2luZyBvbmx5IHRoZSBsb2NhbGx5IHNwZWNpZmllZCBuYW1lLi4uCisJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSB0aGlzLmdldEVudGl0eSh0YXJnZXRFbnRpdHlOYW1lKTsKKwkJaWYgKHRhcmdldEVudGl0eSAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGFyZ2V0RW50aXR5OwogCQl9Ci0JCXJldHVybiBudWxsOworCisJCS8vIC4uLnRoZW4gdHJ5IHRvIHJlc29sdmUgYnkgcHJlcGVuZGluZyB0aGUgZ2xvYmFsIHBhY2thZ2UgbmFtZQorCQlTdHJpbmcgZGVmYXVsdFBhY2thZ2VOYW1lID0gdGhpcy5nZXREZWZhdWx0UGFja2FnZU5hbWUoKTsKKwkJaWYgKGRlZmF1bHRQYWNrYWdlTmFtZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHkoZGVmYXVsdFBhY2thZ2VOYW1lICsgJy4nICsgdGFyZ2V0RW50aXR5TmFtZSk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0UGFja2FnZU5hbWUoKSB7CisJCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldERlZmF1bHRQYWNrYWdlKCk7CisJfQorCisJcHJvdGVjdGVkIEVudGl0eSBnZXRFbnRpdHkoU3RyaW5nIHR5cGVOYW1lKSB7CisJCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eSh0eXBlTmFtZSk7CiAJfQogCQotCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSBnZXRUYXJnZXRQZXJzaXN0ZW50VHlwZSgpIHsKLQkJLy8gdHJ5IHRvIHJlc29sdmUgYnkgb25seSB0aGUgbG9jYWxseSBzcGVjaWZpZWQgbmFtZQotCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKGdldFRhcmdldEVudGl0eSgpKTsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlID09IG51bGwpIHsKLQkJCS8vIHRyeSB0byByZXNvbHZlIGJ5IHByZXBlbmRpbmcgdGhlIGdsb2JhbCBwYWNrYWdlIG5hbWUKLQkJCXBlcnNpc3RlbnRUeXBlID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UGVyc2lzdGVudFR5cGUoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkgKyAiLiIgKyBnZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlbnRUeXBlOworCQorCS8vICoqKioqKioqKiogUmVsYXRpb25zaGlwTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybVJlbGF0aW9uc2hpcE1hcHBpbmcoT3JtUmVsYXRpb25zaGlwTWFwcGluZyBvbGRNYXBwaW5nKSB7CisJCXN1cGVyLmluaXRpYWxpemVGcm9tT3JtUmVsYXRpb25zaGlwTWFwcGluZyhvbGRNYXBwaW5nKTsKKwkJc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG9sZE1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOworCQlzZXRTcGVjaWZpZWRGZXRjaChvbGRNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOworCQlvbGRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmluaXRpYWxpemVPbih0aGlzLnJlbGF0aW9uc2hpcFJlZmVyZW5jZSk7CisJCXRoaXMuY2FzY2FkZS5pbml0aWFsaXplRnJvbShvbGRNYXBwaW5nLmdldENhc2NhZGUoKSk7CisJCS8vVE9ETyBzaG91bGQgd2Ugc2V0IHRoZSBmZXRjaCB0eXBlIGZyb20gYSBCYXNpY01hcHBpbmc/PwogCX0KKwkKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxUYXJnZXRFbnRpdHlBdHRyaWJ1dGVOYW1lcygpIHsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KAorCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZywgSXRlcmF0b3I8U3RyaW5nPj4odGhpcy5hbGxUYXJnZXRFbnRpdHlBdHRyaWJ1dGVNYXBwaW5ncygpKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdHJhbnNmb3JtKEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgeworCQkJCQlyZXR1cm4gbWFwcGluZy5hbGxNYXBwaW5nTmFtZXMoKTsKKwkJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyBJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nPiBhbGxUYXJnZXRFbnRpdHlBdHRyaWJ1dGVNYXBwaW5ncygpIHsKKwkJcmV0dXJuICh0aGlzLnJlc29sdmVkVGFyZ2V0RW50aXR5ICE9IG51bGwpID8KKwkJCQl0aGlzLnJlc29sdmVkVGFyZ2V0RW50aXR5LmFsbEF0dHJpYnV0ZU1hcHBpbmdzKCkgOgorCQkJCUVtcHR5SXRlcmF0b3IuPEF0dHJpYnV0ZU1hcHBpbmc+IGluc3RhbmNlKCk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRFbnRpdHlJZEF0dHJpYnV0ZU5hbWUoKSB7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gdGhpcy5nZXRUYXJnZXRFbnRpdHlJZEF0dHJpYnV0ZSgpOworCQlyZXR1cm4gKGF0dHJpYnV0ZSA9PSBudWxsKSA/IG51bGwgOiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOworCX0KKworCXByb3RlY3RlZCBQZXJzaXN0ZW50QXR0cmlidXRlIGdldFRhcmdldEVudGl0eUlkQXR0cmlidXRlKCkgeworCQlyZXR1cm4gKHRoaXMucmVzb2x2ZWRUYXJnZXRFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5yZXNvbHZlZFRhcmdldEVudGl0eS5nZXRJZEF0dHJpYnV0ZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdmFsaWRhdGVUYXJnZXRFbnRpdHkobWVzc2FnZXMpOworCQl0aGlzLnJlbGF0aW9uc2hpcFJlZmVyZW5jZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVRhcmdldEVudGl0eShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlpZiAoZ2V0VGFyZ2V0RW50aXR5KCkgPT0gbnVsbCkgeworCQkJaWYgKGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX1RBUkdFVF9FTlRJVFlfTk9UX0RFRklORUQsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwgCisJCQkJCQl0aGlzLCAKKwkJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQkJZWxzZSB7IAorCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBUkdFVF9FTlRJVFlfTk9UX0RFRklORUQsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwgCisJCQkJCQl0aGlzLCAKKwkJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKGdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkgPT0gbnVsbCkgeworCQkJaWYgKGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX1RBUkdFVF9FTlRJVFlfSVNfTk9UX0FOX0VOVElUWSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCksIGdldFRhcmdldEVudGl0eSgpfSwgCisJCQkJCQl0aGlzLCAKKwkJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQkJZWxzZSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFSR0VUX0VOVElUWV9JU19OT1RfQU5fRU5USVRZLAorCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXRUYXJnZXRFbnRpdHkoKSwgdGhpcy5nZXROYW1lKCl9LCAKKwkJCQkJCXRoaXMsIAorCQkJCQkJdGhpcy5nZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKQorCQkJCQkpCisJCQkJKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFRleHRSYW5nZShUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7CisJCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorCisJcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLmdldFRleHRSYW5nZSh0aGlzLmdldFJlc291cmNlQXR0cmlidXRlTWFwcGluZygpLmdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpKTsKKwl9CQorCisKKwkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqIAorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpIHsKKwkJU3RyaW5nIHRhcmdldEVudGl0eSA9IHRoaXMuZ2V0VGFyZ2V0RW50aXR5KCk7CisJCXJldHVybiAodGFyZ2V0RW50aXR5ICE9IG51bGwpID8gdGFyZ2V0RW50aXR5IDogTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7CisJfQorCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYmQxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UgCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwlwcm90ZWN0ZWQgQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIHJlc291cmNlTWFwcGluZzsKKwkKKwkvLyBjYWNoZSB0aGUgc3RyYXRlZ3kgZm9yIHByb3BlcnR5IGNoYW5nZSBub3RpZmljYXRpb24KKwlwcm90ZWN0ZWQgSm9pbmluZ1N0cmF0ZWd5IGNhY2hlZFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5OworCQorCQorCXByb3RlY3RlZCBBYnN0cmFjdE9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZSgKKwkJCU9ybVJlbGF0aW9uc2hpcE1hcHBpbmcgcGFyZW50LCBBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMucmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VNYXBwaW5nOworCQl0aGlzLmluaXRpYWxpemUoKTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlKAorCQkJT3JtT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBvbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UpIHsKKwkJLy8gbm8gb3AKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgKKwkJCU9ybUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlIG9sZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgeworCQkvLyBubyBvcAorCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCisJCQlPcm1Kb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlIG9sZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgeworCQkvLyBubyBvcAorCX0KKwkKKwlwdWJsaWMgT3JtUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gKE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcpIGdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmcoKTsKKwl9CisJCisJcHVibGljIEVudGl0eSBnZXRFbnRpdHkoKSB7CisJCVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gZ2V0VHlwZU1hcHBpbmcoKTsKKwkJcmV0dXJuICh0eXBlTWFwcGluZyBpbnN0YW5jZW9mIEVudGl0eSkgPyAoRW50aXR5KSB0eXBlTWFwcGluZyA6IG51bGw7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbigpIHsKKwkJcmV0dXJuIGdldFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkuaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNQYXJlbnRWaXJ0dWFsKCkgeworCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBwcmVkb21pbmFudCBqb2luaW5nIHN0cmF0ZWd5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBKb2luaW5nU3RyYXRlZ3kgZ2V0UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiB0aGlzLmNhY2hlZFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5OworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneShKb2luaW5nU3RyYXRlZ3kgbmV3Sm9pbmluZ1N0cmF0ZWd5KSB7CisJCUpvaW5pbmdTdHJhdGVneSBvbGRKb2luaW5nU3RyYXRlZ3kgPSB0aGlzLmNhY2hlZFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5OworCQl0aGlzLmNhY2hlZFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5ID0gbmV3Sm9pbmluZ1N0cmF0ZWd5OworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBSRURPTUlOQU5UX0pPSU5JTkdfU1RSQVRFR1lfUFJPUEVSVFksIG9sZEpvaW5pbmdTdHJhdGVneSwgbmV3Sm9pbmluZ1N0cmF0ZWd5KTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZSAtPiBjb250ZXh0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCWluaXRpYWxpemVKb2luaW5nU3RyYXRlZ2llcygpOworCQl0aGlzLmNhY2hlZFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5ID0gY2FsY3VsYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKTsKKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVnaWVzKCk7CisJCisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXVwZGF0ZUpvaW5pbmdTdHJhdGVnaWVzKCk7CisJCXNldFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KGNhbGN1bGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB1cGRhdGVKb2luaW5nU3RyYXRlZ2llcygpOworCQorCXByb3RlY3RlZCBhYnN0cmFjdCBKb2luaW5nU3RyYXRlZ3kgY2FsY3VsYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKTsKKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1TZXF1ZW5jZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtU2VxdWVuY2VHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjNmNmRmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtU2VxdWVuY2VHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKKworLyoqCisgKiAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtU2VxdWVuY2VHZW5lcmF0b3IKKwlleHRlbmRzIEFic3RyYWN0T3JtR2VuZXJhdG9yPFhtbFNlcXVlbmNlR2VuZXJhdG9yPgorCWltcGxlbWVudHMgT3JtU2VxdWVuY2VHZW5lcmF0b3IKK3sKKworCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2VxdWVuY2VOYW1lOworCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNlcXVlbmNlTmFtZTsKKworCisJcHJvdGVjdGVkIEFic3RyYWN0T3JtU2VxdWVuY2VHZW5lcmF0b3IoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxTZXF1ZW5jZUdlbmVyYXRvciByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuaW5pdGlhbGl6ZShyZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKTsKKwl9CisKKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpIHsKKwkJcmV0dXJuIFNlcXVlbmNlR2VuZXJhdG9yLkRFRkFVTFRfSU5JVElBTF9WQUxVRTsKKwl9CisKKwkvLyAqKioqKioqKioqIHNlcXVlbmNlIG5hbWUgKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRTZXF1ZW5jZU5hbWUoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZSA6IHRoaXMuZGVmYXVsdFNlcXVlbmNlTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNlcXVlbmNlTmFtZShTdHJpbmcgc3BlY2lmaWVkU2VxdWVuY2VOYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZTsKKwkJdGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWUgPSBzcGVjaWZpZWRTZXF1ZW5jZU5hbWU7CisJCXRoaXMuZ2V0UmVzb3VyY2VHZW5lcmF0b3IoKS5zZXRTZXF1ZW5jZU5hbWUoc3BlY2lmaWVkU2VxdWVuY2VOYW1lKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TRVFVRU5DRV9OQU1FX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZFNlcXVlbmNlTmFtZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNlcXVlbmNlTmFtZV8oU3RyaW5nIHNwZWNpZmllZFNlcXVlbmNlTmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWU7CisJCXRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lID0gc3BlY2lmaWVkU2VxdWVuY2VOYW1lOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NFUVVFTkNFX05BTUVfUFJPUEVSVFksIG9sZCwgc3BlY2lmaWVkU2VxdWVuY2VOYW1lKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTZXF1ZW5jZU5hbWUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRTZXF1ZW5jZU5hbWU7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTZXF1ZW5jZU5hbWUoU3RyaW5nIGRlZmF1bHRTZXF1ZW5jZU5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFNlcXVlbmNlTmFtZTsKKwkJdGhpcy5kZWZhdWx0U2VxdWVuY2VOYW1lID0gZGVmYXVsdFNlcXVlbmNlTmFtZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkLCBkZWZhdWx0U2VxdWVuY2VOYW1lKTsKKwl9CisKKworCS8vICoqKioqKioqKiogcmVzb3VyY2UgPT4gY29udGV4dCAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yKSB7CisJCXN1cGVyLmluaXRpYWxpemUoc2VxdWVuY2VHZW5lcmF0b3IpOworCQl0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IHNlcXVlbmNlR2VuZXJhdG9yLmdldFNlcXVlbmNlTmFtZSgpOworCQkvL1RPRE8gZGVmYXVsdCBzZXF1ZW5jZSBuYW1lCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcikgeworCQlzdXBlci51cGRhdGUoc2VxdWVuY2VHZW5lcmF0b3IpOworCQl0aGlzLnNldFNwZWNpZmllZFNlcXVlbmNlTmFtZV8oc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U2VxdWVuY2VOYW1lKCkpOworCQkvL1RPRE8gZGVmYXVsdCBzZXF1ZW5jZSBuYW1lCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKaW5kZXggNWIwMmViYS4uMDQ5NjUwMyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDQzNiArOSwxMzggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTnVsbGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NYXBzSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1EZXJpdmVkSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYXBzSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRGVyaXZlZElkXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CiAKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzxUIGV4dGVuZHMgWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0T3JtUmVsYXRpb25zaGlwTWFwcGluZzxUPiBpbXBsZW1lbnRzIE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc8VCBleHRlbmRzIEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZz4KKwlleHRlbmRzIEFic3RyYWN0T3JtUmVsYXRpb25zaGlwTWFwcGluZzxUPgorCWltcGxlbWVudHMgT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMAogewotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zOwotCi0JcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW47Ci0KIAlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRPcHRpb25hbDsKLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8T3JtSm9pbkNvbHVtbj4oKTsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgT3JtRGVyaXZlZElkMl8wIGRlcml2ZWRJZDsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgT3JtTWFwc0lkMl8wIG1hcHNJZDsKKwkKKwkKKwlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBUIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJCXRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgPSB0aGlzLmdldFJlc291cmNlT3B0aW9uYWwoKTsKKwkJLy9UT0RPIGRlZmF1bHRPcHRpb25hbAorCQl0aGlzLmRlcml2ZWRJZCA9IGJ1aWxkRGVyaXZlZElkKCk7CisJCXRoaXMubWFwc0lkID0gYnVpbGRNYXBzSWQoKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgb2xkTWFwcGluZykgeworCQlzdXBlci5pbml0aWFsaXplRnJvbU9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7CisJCWdldERlcml2ZWRJZCgpLnNldFZhbHVlKCgoT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCkgb2xkTWFwcGluZykuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCWdldE1hcHNJZCgpLnNldFZhbHVlKCgoT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCkgb2xkTWFwcGluZykuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CiAJfQogCQogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyhPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKG9sZE1hcHBpbmcpOwotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKEpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvbGRNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlPcm1Kb2luQ29sdW1uIG5ld0pvaW5Db2x1bW4gPSBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGluZGV4KyspOwotCQkJbmV3Sm9pbkNvbHVtbi5pbml0aWFsaXplRnJvbShqb2luQ29sdW1uKTsKLQkJfQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VEZWZhdWx0VGFyZ2V0RW50aXR5KCkgeworCQlyZXR1cm4gdGhpcy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFNpbmdsZVJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKCk7CiAJfQogCQogCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RGVmYXVsdEZldGNoKCkgewotCQlyZXR1cm4gU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5ERUZBVUxUX0ZFVENIX1RZUEU7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKioqKiBJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKgotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmlzRW1wdHkoKSA/IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zKCkgOiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmlzRW1wdHkoKSA/IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKKwkJcmV0dXJuIERFRkFVTFRfRkVUQ0hfVFlQRTsKIAl9CiAJCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOworCQorCS8vICoqKioqKioqKioqKioqKiogb3B0aW9uYWwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRPcHRpb25hbCAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkT3B0aW9uYWwuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmlzRGVmYXVsdE9wdGlvbmFsKCk7CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRKb2luQ29sdW1uKE9ybUpvaW5Db2x1bW4gbmV3Sm9pbkNvbHVtbikgewotCQlPcm1Kb2luQ29sdW1uIG9sZEpvaW5Db2x1bW4gPSB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOwotCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gbmV3Sm9pbkNvbHVtbjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLkRFRkFVTFRfSk9JTl9DT0xVTU4sIG9sZEpvaW5Db2x1bW4sIG5ld0pvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gZGVmYXVsdEpvaW5Db2x1bW5zKCkgewotCQlpZiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0Sm9pbkNvbHVtbik7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IG51bGwpID8gMCA6IDE7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4odGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucyk7Ci0JfQotCi0JcHVibGljIGludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gIXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU9ybUpvaW5Db2x1bW4gb2xkRGVmYXVsdEpvaW5Db2x1bW4gPSB0aGlzLmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCWlmIChvbGREZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkvL251bGwgdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gbm93IGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkJCS8vaWYgb25lIGRvZXMgbm90IGV4aXN0LCB0aGVyZSBpcyBhbHJlYWR5IGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uLgotCQkJLy9SZW1vdmUgaXQgbm93IHNvIHRoYXQgaXQgZG9lc24ndCBnZXQgcmVtb3ZlZCBkdXJpbmcgYW4gdXBkYXRlIGFuZAotCQkJLy9jYXVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBiZSBzZW50IHRvIHRoZSBVSSBpbiB0aGUgd3Jvbmcgb3JkZXIKLQkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBudWxsOwotCQl9Ci0JCVhtbEpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW5JbXBsKCk7Ci0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGJ1aWxkSm9pbkNvbHVtbih4bWxKb2luQ29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5hZGQoaW5kZXgsIGpvaW5Db2x1bW4pOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRKb2luQ29sdW1ucygpLmFkZChpbmRleCwgeG1sSm9pbkNvbHVtbik7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIGpvaW5Db2x1bW4pOwotCQlpZiAob2xkRGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuREVGQVVMVF9KT0lOX0NPTFVNTiwgb2xkRGVmYXVsdEpvaW5Db2x1bW4sIG51bGwpOwotCQl9Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4LCBPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmluZGV4T2Yoam9pbkNvbHVtbikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlPcm1Kb2luQ29sdW1uIHJlbW92ZWRKb2luQ29sdW1uID0gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOwotCQlpZiAoIWNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkgewotCQkJLy9jcmVhdGUgdGhlIGRlZmF1bHRKb2luQ29sdW1uIG5vdyBvciB0aGlzIHdpbGwgaGFwcGVuIGR1cmluZyBwcm9qZWN0IHVwZGF0ZSAKLQkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLiBUaGF0IGNhdXNlcyBwcm9ibGVtcyAKLQkJCS8vaW4gdGhlIFVJIGJlY2F1c2UgdGhlIGNoYW5nZSBub3RpZmljYXRpb25zIGVuZCB1cCBpbiB0aGUgd3Jvbmcgb3JkZXIuCi0JCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gYnVpbGRKb2luQ29sdW1uKG51bGwpOwotCQl9Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcmVtb3ZlZEpvaW5Db2x1bW4pOwotCQlpZiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkvL2ZpcmUgY2hhbmdlIG5vdGlmaWNhdGlvbiBpZiBhIGRlZmF1bHRKb2luQ29sdW1uIHdhcyBjcmVhdGVkIGFib3ZlCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5ERUZBVUxUX0pPSU5fQ09MVU1OLCBudWxsLCB0aGlzLmRlZmF1bHRKb2luQ29sdW1uKTsJCQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbl8oT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChqb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldEpvaW5Db2x1bW5zKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiBnZXRTcGVjaWZpZWRPcHRpb25hbCgpID09IG51bGwgPyBnZXREZWZhdWx0T3B0aW9uYWwoKSA6IGdldFNwZWNpZmllZE9wdGlvbmFsKCk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIE51bGxhYmxlLkRFRkFVTFRfT1BUSU9OQUw7Ci0JfQotCiAJcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSB7CiAJCXJldHVybiB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOwogCX0KIAkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuIG5ld1NwZWNpZmllZE9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkU3BlY2lmaWVkT3B0aW9uYWwgPSB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOwotCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gbmV3U3BlY2lmaWVkT3B0aW9uYWw7Ci0JCWdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRPcHRpb25hbChuZXdTcGVjaWZpZWRPcHRpb25hbCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTnVsbGFibGUuU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRPcHRpb25hbCwgbmV3U3BlY2lmaWVkT3B0aW9uYWwpOworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOworCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gb3B0aW9uYWw7CisJCXRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLnNldE9wdGlvbmFsKG9wdGlvbmFsKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE51bGxhYmxlLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgb2xkLCBvcHRpb25hbCk7CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsXyhCb29sZWFuIG5ld1NwZWNpZmllZE9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkU3BlY2lmaWVkT3B0aW9uYWwgPSB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOwotCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gbmV3U3BlY2lmaWVkT3B0aW9uYWw7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTnVsbGFibGUuU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRPcHRpb25hbCwgbmV3U3BlY2lmaWVkT3B0aW9uYWwpOworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsXyhCb29sZWFuIG9wdGlvbmFsKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRPcHRpb25hbDsKKwkJdGhpcy5zcGVjaWZpZWRPcHRpb25hbCA9IG9wdGlvbmFsOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTnVsbGFibGUuU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZLCBvbGQsIG9wdGlvbmFsKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0T3B0aW9uYWwoKSB7CisJCXJldHVybiBOdWxsYWJsZS5ERUZBVUxUX09QVElPTkFMOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIDIuMCBkZXJpdmVkIGlkICoqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgT3JtRGVyaXZlZElkMl8wIGJ1aWxkRGVyaXZlZElkKCkgeworCQlyZXR1cm4gKChPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkpIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpKS4KKwkJCQlidWlsZE9ybURlcml2ZWRJZCh0aGlzLCAoWG1sRGVyaXZlZElkXzJfMCkgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtRGVyaXZlZElkMl8wIGdldERlcml2ZWRJZCgpIHsKKwkJcmV0dXJuIHRoaXMuZGVyaXZlZElkOwogCX0KIAkKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFQgc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplKHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5nZXRPcHRpb25hbCgpOwotCQkvL1RPRE8gZGVmYXVsdE9wdGlvbmFsCi0JCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZEpvaW5Db2x1bW5zKHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQl0aGlzLmluaXRpYWxpemVEZWZhdWx0Sm9pbkNvbHVtbigpOworCXB1YmxpYyBib29sZWFuIGlzSWRNYXBwaW5nKCkgeworCQlyZXR1cm4gdGhpcy5kZXJpdmVkSWQuZ2V0VmFsdWUoKTsKIAl9CiAJCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEpvaW5Db2x1bW5zKFQgc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZykgewotCQlpZiAoc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiBzaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkpIHsKLQkJCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuYWRkKGJ1aWxkSm9pbkNvbHVtbihqb2luQ29sdW1uKSk7Ci0JCX0KKwkKKwkvLyAqKioqKioqKioqIDIuMCBtYXBzIGlkICoqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgT3JtTWFwc0lkMl8wIGJ1aWxkTWFwc0lkKCkgeworCQlyZXR1cm4gKChPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkpIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpKS4KKwkJCQlidWlsZE9ybU1hcHNJZCh0aGlzLCAoWG1sTWFwc0lkXzJfMCkgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOwogCX0KIAkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRCdWlsZERlZmF1bHRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gIWNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSAmJiBpc1JlbGF0aW9uc2hpcE93bmVyKCk7CisJcHVibGljIE1hcHNJZDJfMCBnZXRNYXBzSWQoKSB7CisJCXJldHVybiB0aGlzLm1hcHNJZDsKIAl9CiAJCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRKb2luQ29sdW1uKCkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdEpvaW5Db2x1bW4oKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBidWlsZEpvaW5Db2x1bW4obnVsbCk7Ci0JfQkKIAkKLQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBidWlsZEpvaW5Db2x1bW4oWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybUpvaW5Db2x1bW4odGhpcywgbmV3IEpvaW5Db2x1bW5Pd25lcigpKTsKLQkJb3JtSm9pbkNvbHVtbi5pbml0aWFsaXplKGpvaW5Db2x1bW4pOwotCQlyZXR1cm4gb3JtSm9pbkNvbHVtbjsKLQl9CQotCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZSA9PiBjb250ZXh0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShUIHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJc3VwZXIudXBkYXRlKHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQl0aGlzLnNldFNwZWNpZmllZE9wdGlvbmFsXyhzaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmdldE9wdGlvbmFsKCkpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRKb2luQ29sdW1uKCk7CisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRPcHRpb25hbF8odGhpcy5nZXRSZXNvdXJjZU9wdGlvbmFsKCkpOworCQl0aGlzLmRlcml2ZWRJZC51cGRhdGUoKTsKKwkJdGhpcy5tYXBzSWQudXBkYXRlKCk7CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKFQgc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZykgewotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBzcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8WG1sSm9pbkNvbHVtbj4gcmVzb3VyY2VKb2luQ29sdW1ucyA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCWlmIChzaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nICE9IG51bGwpIHsKLQkJCXJlc291cmNlSm9pbkNvbHVtbnMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sSm9pbkNvbHVtbj4oc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5nZXRKb2luQ29sdW1ucygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJfQotCQkKLQkJd2hpbGUgKGpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJam9pbkNvbHVtbi51cGRhdGUocmVzb3VyY2VKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbl8oam9pbkNvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSwgYnVpbGRKb2luQ29sdW1uKHJlc291cmNlSm9pbkNvbHVtbnMubmV4dCgpKSk7Ci0JCX0KKwlwcm90ZWN0ZWQgQm9vbGVhbiBnZXRSZXNvdXJjZU9wdGlvbmFsKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuZ2V0T3B0aW9uYWwoKTsKIAl9CiAJCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCWlmICghc2hvdWxkQnVpbGREZWZhdWx0Sm9pbkNvbHVtbigpKSB7Ci0JCQlzZXREZWZhdWx0Sm9pbkNvbHVtbihudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldERlZmF1bHRKb2luQ29sdW1uKGJ1aWxkSm9pbkNvbHVtbihudWxsKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uLnVwZGF0ZShudWxsKTsKLQkJfQotCX0JCi0KLQkvKioKLQkgKiBlbGltaW5hdGUgYW55ICJjb250YWluZXIiIHR5cGVzCi0JICovCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQogCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhcmdldEVudGl0eShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSkgewotCQlpZiAocGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlLnR5cGVJc0NvbnRhaW5lcigpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVudEF0dHJpYnV0ZVJlc291cmNlLmdldFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKCk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQkKLQkJaWYgKGFkZEpvaW5Db2x1bW5NZXNzYWdlcygpKSB7Ci0JCQlhZGRKb2luQ29sdW1uTWVzc2FnZXMobWVzc2FnZXMpOwotCQl9Ci0JfQotCQotCS8vYnVnIDE5MjI4NyAtIGRvIG5vdCB3YW50IGpvaW5Db2x1bW4gdmFsaWRhdGlvbiBlcnJvcnMgb24gdGhlIG5vbi1vd25pbmcgc2lkZQotCS8vb2YgYSBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcC4gIFRoaXMgaXMgYSBsb3cgcmlzayBmaXggZm9yIFJDMywgYnV0IGEgYmV0dGVyCi0JLy9zb2x1dGlvbiB3b3VsZCBiZSB0byBub3QgaGF2ZSB0aGUgZGVmYXVsdCBqb2luQ29sdW1ucyBvbiB0aGUgbm9uLW93bmluZyBzaWRlLgotCS8vVGhpcyB3b3VsZCBmaXggYW5vdGhlciBidWcgdGhhdCB3ZSBzaG93IGRlZmF1bHQgam9pbkNvbHVtbnMgaW4gdGhpcyBzaXR1YXRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkSm9pbkNvbHVtbk1lc3NhZ2VzKCkgewotCQlyZXR1cm4gKGVudGl0eU93bmVkKCkgJiYgaXNSZWxhdGlvbnNoaXBPd25lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKb2luQ29sdW1uTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJYm9vbGVhbiBkb0NvbnRpbnVlID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JCQotCQlmb3IgKE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShqb2luQ29sdW1ucygpKSkgewotCQkJU3RyaW5nIHRhYmxlID0gam9pbkNvbHVtbi5nZXRUYWJsZSgpOwotCQkJCi0JCQlpZiAoZG9Db250aW51ZSAmJiBnZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZSkpIHsKLQkJCQlpZiAoZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lKCksIHRhYmxlLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sCi0JCQkJCQkJam9pbkNvbHVtbiwgCi0JCQkJCQkJam9pbkNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZSgpKQotCQkJCQkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge3RhYmxlLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJCWpvaW5Db2x1bW4sIAotCQkJCQkJCWpvaW5Db2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoKSkKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJZG9Db250aW51ZSA9IGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZiAoZG9Db250aW51ZSAmJiAhIGpvaW5Db2x1bW4uaXNSZXNvbHZlZCgpKSB7Ci0JCQkJaWYgKGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQkJam9pbkNvbHVtbiwgCi0JCQkJCQkJam9pbkNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJCWpvaW5Db2x1bW4sIAotCQkJCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJCQkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKGRvQ29udGludWUgJiYgISBqb2luQ29sdW1uLmlzUmVmZXJlbmNlZENvbHVtblJlc29sdmVkKCkpIHsKLQkJCQlpZiAoZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge2dldE5hbWUoKSwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJCWpvaW5Db2x1bW4sIAotCQkJCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge2pvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSwgam9pbkNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCQlqb2luQ29sdW1uLCAKLQkJCQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCQotCXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uT3duZXIgaW1wbGVtZW50cyBPcm1Kb2luQ29sdW1uLk93bmVyCi0JewotCi0JCXB1YmxpYyBKb2luQ29sdW1uT3duZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGJ5IGRlZmF1bHQsIHRoZSBqb2luIGNvbHVtbiBpcyBpbiB0aGUgdHlwZSBtYXBwaW5nJ3MgcHJpbWFyeSB0YWJsZQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0VGFibGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW50aXR5IGdldFRhcmdldEVudGl0eSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXM7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQkvKioKLQkJICogdGhlIGpvaW4gY29sdW1uIGNhbiBiZSBvbiBhIHNlY29uZGFyeSB0YWJsZQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdGFibGVJc0FsbG93ZWQoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRUeXBlTWFwcGluZygpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIGdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCkgewotCQkJRW50aXR5IHRhcmdldEVudGl0eSA9IGdldFRhcmdldEVudGl0eSgpOwotCQkJcmV0dXJuICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogdGFyZ2V0RW50aXR5LmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPT0gam9pbkNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuam9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCX0KKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCXRoaXMuZGVyaXZlZElkLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCXRoaXMubWFwc0lkLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVRhYmxlLmphdmEKaW5kZXggYzJjYzcwZC4uYTFhYmQyNiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVGFibGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1UYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEzLDEzNiArMTMsMTkyIEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVVuaXF1ZUNvbnN0cmFpbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ2F0YWxvZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWFDb250YWluZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLk5hbWVUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwogCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1UYWJsZSBleHRlbmRzIEFic3RyYWN0T3JtSnBhQ29udGV4dE5vZGUgaW1wbGVtZW50cyBVbmlxdWVDb25zdHJhaW50Lk93bmVyCisvKioKKyAqIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1UYWJsZQorCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgVGFibGUsIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIKIHsKIAlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE5hbWU7Ci0KIAlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lOwogCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDYXRhbG9nOwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKLQogCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2NoZW1hOwotCiAJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hOwogCQorCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ2F0YWxvZzsKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nOworCiAJcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHM7CiAKIAotCXByb3RlY3RlZCBBYnN0cmFjdE9ybVRhYmxlKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCkgeworCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgorCisJcHJvdGVjdGVkIEFic3RyYWN0T3JtVGFibGUoWG1sQ29udGV4dE5vZGUgcGFyZW50KSB7CiAJCXN1cGVyKHBhcmVudCk7CiAJCXRoaXMudW5pcXVlQ29uc3RyYWludHMgPSBuZXcgQXJyYXlMaXN0PE9ybVVuaXF1ZUNvbnN0cmFpbnQ+KCk7CiAJfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUpwYUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1KcGFDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7CisKKwkvLyAqKioqKioqKioqIGFic3RyYWN0IG1ldGhvZHMgKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIG51bGwgaWYgbm8gcmVzb3VyY2UgdGFibGUgZXhpc3RzLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdFhtbFRhYmxlIGdldFJlc291cmNlVGFibGUoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgYWRkZWQgcmVzb3VyY2UgdGFibGUuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0WG1sVGFibGUgYWRkUmVzb3VyY2VUYWJsZSgpOworCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVtb3ZlUmVzb3VyY2VUYWJsZSgpOworCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBidWlsZERlZmF1bHROYW1lKCk7CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBidWlsZERlZmF1bHRTY2hlbWEoKTsKKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2coKTsKKwkKKworCXB1YmxpYyBib29sZWFuIGlzUmVzb3VyY2VTcGVjaWZpZWQoKSB7CisJCXJldHVybiB0aGlzLmdldFJlc291cmNlVGFibGUoKSAhPSBudWxsOwogCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShUYWJsZSBvbGRUYWJsZSkgewotCQlzZXRTcGVjaWZpZWROYW1lKG9sZFRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCXNldFNwZWNpZmllZENhdGFsb2cob2xkVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJc2V0U3BlY2lmaWVkU2NoZW1hKG9sZFRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQl9Ci0JCi0JCisKKwkvLyAqKioqKioqKioqIG5hbWUgKioqKioqKioqKgorCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0TmFtZSgpIDogdGhpcy5nZXRTcGVjaWZpZWROYW1lKCk7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWROYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWROYW1lIDogdGhpcy5kZWZhdWx0TmFtZTsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZE5hbWUoKSB7CiAJCXJldHVybiB0aGlzLnNwZWNpZmllZE5hbWU7CiAJfQogCQotCS8qKgotCSAqIFJldHVybiBudWxsIGlmIG5vIHRhYmxlIHJlc291cmNlIGVsZW1lbnQgZXhpc3RzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFhtbEJhc2VUYWJsZSBnZXRUYWJsZVJlc291cmNlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW1vdmVUYWJsZVJlc291cmNlKCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkVGFibGVSZXNvdXJjZSgpOwotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5ld1NwZWNpZmllZE5hbWU7Ci0JCWlmIChvbGRTcGVjaWZpZWROYW1lICE9IG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJCWlmICh0aGlzLmdldFRhYmxlUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRUYWJsZVJlc291cmNlKCkuc2V0TmFtZShuZXdTcGVjaWZpZWROYW1lKTsJCQkJCQkKLQkJCQlpZiAodGhpcy5nZXRUYWJsZVJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlVGFibGVSZXNvdXJjZSgpOwotCQkJCX0KKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWROYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZE5hbWU7CisJCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5hbWU7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChvbGQsIG5hbWUpKSB7CisJCQlBYnN0cmFjdFhtbFRhYmxlIHJlc291cmNlVGFibGUgPSB0aGlzLmdldFJlc291cmNlVGFibGUoKTsKKwkJCWlmIChyZXNvdXJjZVRhYmxlID09IG51bGwpIHsKKwkJCQlyZXNvdXJjZVRhYmxlID0gdGhpcy5hZGRSZXNvdXJjZVRhYmxlKCk7CiAJCQl9Ci0JCQllbHNlIGlmIChuZXdTcGVjaWZpZWROYW1lICE9IG51bGwpIHsKLQkJCQlhZGRUYWJsZVJlc291cmNlKCk7Ci0JCQkJZ2V0VGFibGVSZXNvdXJjZSgpLnNldE5hbWUobmV3U3BlY2lmaWVkTmFtZSk7CisJCQlyZXNvdXJjZVRhYmxlLnNldE5hbWUobmFtZSk7CisJCQlpZiAocmVzb3VyY2VUYWJsZS5pc1Vuc2V0KCkpIHsKKwkJCQl0aGlzLnJlbW92ZVJlc291cmNlVGFibGUoKTsKIAkJCX0KKwkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKIAkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRhYmxlLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWROYW1lLCBuZXdTcGVjaWZpZWROYW1lKTsKIAl9CiAJCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTmFtZV8oU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5ld1NwZWNpZmllZE5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVGFibGUuU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE5hbWUsIG5ld1NwZWNpZmllZE5hbWUpOworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE5hbWVfKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZE5hbWU7CisJCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkgewogCQlyZXR1cm4gdGhpcy5kZWZhdWx0TmFtZTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TmFtZShTdHJpbmcgbmV3RGVmYXVsdE5hbWUpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHROYW1lID0gdGhpcy5kZWZhdWx0TmFtZTsKLQkJdGhpcy5kZWZhdWx0TmFtZSA9IG5ld0RlZmF1bHROYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRhYmxlLkRFRkFVTFRfTkFNRV9QUk9QRVJUWSwgb2xkRGVmYXVsdE5hbWUsIG5ld0RlZmF1bHROYW1lKTsKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TmFtZShTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0TmFtZTsKKwkJdGhpcy5kZWZhdWx0TmFtZSA9IG5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CiAJfQogCisKKwkvLyAqKioqKioqKioqIHNjaGVtYSAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNjaGVtYSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkU2NoZW1hIDogdGhpcy5kZWZhdWx0U2NoZW1hOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTY2hlbWE7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOworCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IHNjaGVtYTsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKG9sZCwgc2NoZW1hKSkgeworCQkJQWJzdHJhY3RYbWxUYWJsZSByZXNvdXJjZVRhYmxlID0gdGhpcy5nZXRSZXNvdXJjZVRhYmxlKCk7CisJCQlpZiAocmVzb3VyY2VUYWJsZSA9PSBudWxsKSB7CisJCQkJcmVzb3VyY2VUYWJsZSA9IHRoaXMuYWRkUmVzb3VyY2VUYWJsZSgpOworCQkJfQorCQkJcmVzb3VyY2VUYWJsZS5zZXRTY2hlbWEoc2NoZW1hKTsKKwkJCWlmIChyZXNvdXJjZVRhYmxlLmlzVW5zZXQoKSkgeworCQkJCXRoaXMucmVtb3ZlUmVzb3VyY2VUYWJsZSgpOworCQkJfQorCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWFfKFN0cmluZyBzY2hlbWEpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOworCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IHNjaGVtYTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRTY2hlbWE7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0U2NoZW1hOworCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBzY2hlbWE7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOworCX0KKworCisJLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKKwogCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZENhdGFsb2coKSA9PSBudWxsKSA/IGdldERlZmF1bHRDYXRhbG9nKCkgOiB0aGlzLmdldFNwZWNpZmllZENhdGFsb2coKTsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZENhdGFsb2cgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZENhdGFsb2cgOiB0aGlzLmRlZmF1bHRDYXRhbG9nOwogCX0KIAogCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpIHsKIAkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKIAl9CiAKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nKFN0cmluZyBuZXdTcGVjaWZpZWRDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBuZXdTcGVjaWZpZWRDYXRhbG9nOwotCQlpZiAob2xkU3BlY2lmaWVkQ2F0YWxvZyAhPSBuZXdTcGVjaWZpZWRDYXRhbG9nKSB7Ci0JCQlpZiAodGhpcy5nZXRUYWJsZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpLnNldENhdGFsb2cobmV3U3BlY2lmaWVkQ2F0YWxvZyk7CQkJCQkJCi0JCQkJaWYgKHRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZVRhYmxlUmVzb3VyY2UoKTsKLQkJCQl9CisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOworCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBjYXRhbG9nOworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQob2xkLCBjYXRhbG9nKSkgeworCQkJQWJzdHJhY3RYbWxUYWJsZSByZXNvdXJjZVRhYmxlID0gdGhpcy5nZXRSZXNvdXJjZVRhYmxlKCk7CisJCQlpZiAocmVzb3VyY2VUYWJsZSA9PSBudWxsKSB7CisJCQkJcmVzb3VyY2VUYWJsZSA9IHRoaXMuYWRkUmVzb3VyY2VUYWJsZSgpOwogCQkJfQotCQkJZWxzZSBpZiAobmV3U3BlY2lmaWVkQ2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJYWRkVGFibGVSZXNvdXJjZSgpOwotCQkJCWdldFRhYmxlUmVzb3VyY2UoKS5zZXRDYXRhbG9nKG5ld1NwZWNpZmllZENhdGFsb2cpOworCQkJcmVzb3VyY2VUYWJsZS5zZXRDYXRhbG9nKGNhdGFsb2cpOworCQkJaWYgKHJlc291cmNlVGFibGUuaXNVbnNldCgpKSB7CisJCQkJdGhpcy5yZW1vdmVSZXNvdXJjZVRhYmxlKCk7CiAJCQl9CisJCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7CiAJCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ2F0YWxvZywgbmV3U3BlY2lmaWVkQ2F0YWxvZyk7CiAJfQotCQorCiAJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZ18oU3RyaW5nIG5ld1NwZWNpZmllZENhdGFsb2cpIHsKIAkJU3RyaW5nIG9sZFNwZWNpZmllZENhdGFsb2cgPSB0aGlzLnNwZWNpZmllZENhdGFsb2c7CiAJCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IG5ld1NwZWNpZmllZENhdGFsb2c7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVGFibGUuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFksIG9sZFNwZWNpZmllZENhdGFsb2csIG5ld1NwZWNpZmllZENhdGFsb2cpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRDYXRhbG9nLCBuZXdTcGVjaWZpZWRDYXRhbG9nKTsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgewpAQCAtMTUyLDgxICsyMDgsNDIgQEAKIAlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2F0YWxvZyhTdHJpbmcgbmV3RGVmYXVsdENhdGFsb2cpIHsKIAkJU3RyaW5nIG9sZERlZmF1bHRDYXRhbG9nID0gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKIAkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IG5ld0RlZmF1bHRDYXRhbG9nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSwgb2xkRGVmYXVsdENhdGFsb2csIG5ld0RlZmF1bHRDYXRhbG9nKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZERlZmF1bHRDYXRhbG9nLCBuZXdEZWZhdWx0Q2F0YWxvZyk7CiAJfQogCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRTY2hlbWEoKSA9PSBudWxsKSA/IGdldERlZmF1bHRTY2hlbWEoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JfQogCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIG5ld1NwZWNpZmllZFNjaGVtYSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkU2NoZW1hID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gbmV3U3BlY2lmaWVkU2NoZW1hOwotCQlpZiAob2xkU3BlY2lmaWVkU2NoZW1hICE9IG5ld1NwZWNpZmllZFNjaGVtYSkgewotCQkJaWYgKHRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5zZXRTY2hlbWEobmV3U3BlY2lmaWVkU2NoZW1hKTsJCQkJCQkKLQkJCQlpZiAodGhpcy5nZXRUYWJsZVJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlVGFibGVSZXNvdXJjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZFNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJYWRkVGFibGVSZXNvdXJjZSgpOwotCQkJCWdldFRhYmxlUmVzb3VyY2UoKS5zZXRTY2hlbWEobmV3U3BlY2lmaWVkU2NoZW1hKTsKLQkJCX0KLQkJfQotCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVGFibGUuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2NoZW1hLCBuZXdTcGVjaWZpZWRTY2hlbWEpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWFfKFN0cmluZyBuZXdTcGVjaWZpZWRTY2hlbWEpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFNjaGVtYSA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IG5ld1NwZWNpZmllZFNjaGVtYTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZS5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTY2hlbWEsIG5ld1NwZWNpZmllZFNjaGVtYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NoZW1hOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NoZW1hKFN0cmluZyBuZXdEZWZhdWx0U2NoZW1hKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0U2NoZW1hID0gdGhpcy5kZWZhdWx0U2NoZW1hOwotCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBuZXdEZWZhdWx0U2NoZW1hOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRhYmxlLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZLCBvbGREZWZhdWx0U2NoZW1hLCBuZXdEZWZhdWx0U2NoZW1hKTsKLQl9Ci0KLQkKIAkvLyAqKioqKioqKioqIHVuaXF1ZSBjb25zdHJhaW50cyAqKioqKioqKioqCiAJCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cygpIHsKKwlwdWJsaWMgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIExpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cygpIHsKIAkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50Pih0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKTsKIAl9Ci0JCisKIAlwdWJsaWMgaW50IHVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHsKIAkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludHMuc2l6ZSgpOwogCX0KIAkKIAlwdWJsaWMgT3JtVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7Ci0JCU9ybVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9ICBidWlsZFVuaXF1ZUNvbnN0cmFpbnQodW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50cy5hZGQoaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnQpOworCQlYbWxVbmlxdWVDb25zdHJhaW50IHJlc291cmNlQ29uc3RyYWludCA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKKwkJT3JtVW5pcXVlQ29uc3RyYWludCBjb250ZXh0Q29uc3RyYWludCA9ICB0aGlzLmJ1aWxkVW5pcXVlQ29uc3RyYWludChyZXNvdXJjZUNvbnN0cmFpbnQpOworCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmFkZChpbmRleCwgY29udGV4dENvbnN0cmFpbnQpOwogCQkKLQkJaWYgKHRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCWFkZFRhYmxlUmVzb3VyY2UoKTsKKwkJQWJzdHJhY3RYbWxUYWJsZSByZXNvdXJjZVRhYmxlID0gdGhpcy5nZXRSZXNvdXJjZVRhYmxlKCk7CisJCWlmIChyZXNvdXJjZVRhYmxlID09IG51bGwpIHsKKwkJCXJlc291cmNlVGFibGUgPSB0aGlzLmFkZFJlc291cmNlVGFibGUoKTsKIAkJfQotCQkKLQkJZ2V0VGFibGVSZXNvdXJjZSgpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKGluZGV4LCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQlmaXJlSXRlbUFkZGVkKFRhYmxlLlVOSVFVRV9DT05TVFJBSU5UU19MSVNULCBpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7Ci0JCXJldHVybiB1bmlxdWVDb25zdHJhaW50OworCQlyZXNvdXJjZVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKGluZGV4LCByZXNvdXJjZUNvbnN0cmFpbnQpOworCisJCXRoaXMuZmlyZUl0ZW1BZGRlZChVTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIGNvbnRleHRDb25zdHJhaW50KTsKKwkJcmV0dXJuIGNvbnRleHRDb25zdHJhaW50OwogCX0KLQkKKwogCXByb3RlY3RlZCB2b2lkIGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4LCBPcm1VbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgdW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVGFibGUuVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOworCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnQsIHRoaXMudW5pcXVlQ29uc3RyYWludHMsIFVOSVFVRV9DT05TVFJBSU5UU19MSVNUKTsKIAl9CiAJCisJcHJvdGVjdGVkIHZvaWQgYWRkVW5pcXVlQ29uc3RyYWludChPcm1VbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKKwkJdGhpcy5hZGRVbmlxdWVDb25zdHJhaW50KHRoaXMudW5pcXVlQ29uc3RyYWludHMuc2l6ZSgpLCB1bmlxdWVDb25zdHJhaW50KTsKKwl9CiAJCiAJcHVibGljIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKIAkJdGhpcy5yZW1vdmVVbmlxdWVDb25zdHJhaW50KHRoaXMudW5pcXVlQ29uc3RyYWludHMuaW5kZXhPZih1bmlxdWVDb25zdHJhaW50KSk7CkBAIC0yMzQsMTc2ICsyNTEsMjI1IEBACiAJCiAJcHVibGljIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKIAkJT3JtVW5pcXVlQ29uc3RyYWludCByZW1vdmVkVW5pcXVlQ29uc3RyYWludCA9IHRoaXMudW5pcXVlQ29uc3RyYWludHMucmVtb3ZlKGluZGV4KTsKLQkJZ2V0VGFibGVSZXNvdXJjZSgpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFRhYmxlLlVOSVFVRV9DT05TVFJBSU5UU19MSVNULCBpbmRleCwgcmVtb3ZlZFVuaXF1ZUNvbnN0cmFpbnQpOworCQl0aGlzLmdldFJlc291cmNlVGFibGUoKS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZShpbmRleCk7CisJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFVOSVFVRV9DT05TVFJBSU5UU19MSVNULCBpbmRleCwgcmVtb3ZlZFVuaXF1ZUNvbnN0cmFpbnQpOwogCX0KIAkKIAlwcm90ZWN0ZWQgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50XyhPcm1VbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KHVuaXF1ZUNvbnN0cmFpbnQsIHRoaXMudW5pcXVlQ29uc3RyYWludHMsIFRhYmxlLlVOSVFVRV9DT05TVFJBSU5UU19MSVNUKTsKKwkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QodW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOwogCX0KLQkKKwogCXB1YmxpYyB2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CiAJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMudW5pcXVlQ29uc3RyYWludHMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKFRhYmxlLlVOSVFVRV9DT05TVFJBSU5UU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCS8vKioqKioqKioqKioqKioqKioqKiBVbmlxdWVDb25zdHJhaW50Lk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlVW5pcXVlQ29uc3RyYWludENvbHVtbk5hbWVzKCkgewotCQlvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZGJUYWJsZSA9IGdldERiVGFibGUoKTsKLQkJaWYgKGRiVGFibGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRiVGFibGUuY29sdW1uTmFtZXMoKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoKSB7Ci0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERiU2NoZW1hKCk7Ci0JCXJldHVybiAoc2NoZW1hID09IG51bGwpID8gbnVsbCA6IHNjaGVtYS50YWJsZU5hbWVkKGdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKLQkJcmV0dXJuIGdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lZChnZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUmVzb2x2ZWRTY2hlbWEoKSB7Ci0JCXJldHVybiBnZXREYlNjaGVtYSgpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKLQkJcmV0dXJuIGdldERiVGFibGUoKSAhPSBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbEJhc2VUYWJsZSB0YWJsZSkgewotCQl0aGlzLnNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWUodGFibGUpOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hKHRhYmxlKTsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nKHRhYmxlKTsKLQkJdGhpcy5kZWZhdWx0TmFtZSA9IHRoaXMuZGVmYXVsdE5hbWUoKTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gdGhpcy5kZWZhdWx0U2NoZW1hKCk7Ci0JCXRoaXMuZGVmYXVsdENhdGFsb2cgPSB0aGlzLmRlZmF1bHRDYXRhbG9nKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVVuaXF1ZUNvbnRyYWludHModGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVW5pcXVlQ29udHJhaW50cyhYbWxCYXNlVGFibGUgdGFibGUpIHsKLQkJaWYgKHRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKFhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA6IHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkpIHsKLQkJCXRoaXMudW5pcXVlQ29uc3RyYWludHMuYWRkKGJ1aWxkVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKFhtbEJhc2VUYWJsZSB0YWJsZSkgewotCQl0aGlzLnNldFNwZWNpZmllZE5hbWVfKHRoaXMuc3BlY2lmaWVkTmFtZSh0YWJsZSkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8odGhpcy5zcGVjaWZpZWRTY2hlbWEodGFibGUpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRDYXRhbG9nXyh0aGlzLnNwZWNpZmllZENhdGFsb2codGFibGUpKTsKLQkJdGhpcy5zZXREZWZhdWx0TmFtZSh0aGlzLmRlZmF1bHROYW1lKCkpOwotCQl0aGlzLnNldERlZmF1bHRTY2hlbWEodGhpcy5kZWZhdWx0U2NoZW1hKCkpOwotCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMuZGVmYXVsdENhdGFsb2coKSk7Ci0JCXRoaXMudXBkYXRlVW5pcXVlQ29uc3RyYWludHModGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTmFtZShYbWxCYXNlVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuIHRhYmxlID09IG51bGwgPyBudWxsIDogdGFibGUuZ2V0TmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNjaGVtYShYbWxCYXNlVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuIHRhYmxlID09IG51bGwgPyBudWxsIDogdGFibGUuZ2V0U2NoZW1hKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ2F0YWxvZyhYbWxCYXNlVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuIHRhYmxlID09IG51bGwgPyBudWxsIDogdGFibGUuZ2V0Q2F0YWxvZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRlZmF1bHROYW1lKCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkZWZhdWx0U2NoZW1hKCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkZWZhdWx0Q2F0YWxvZygpOwotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKFhtbEJhc2VUYWJsZSB0YWJsZSkgewotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB1bmlxdWVDb25zdHJhaW50cygpOwotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gcmVzb3VyY2VVbmlxdWVDb25zdHJhaW50czsKLQkJaWYgKHRhYmxlID09IG51bGwpIHsKLQkJCXJlc291cmNlVW5pcXVlQ29uc3RyYWludHMgPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzb3VyY2VVbmlxdWVDb25zdHJhaW50cyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50Pih0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJfQotCQl3aGlsZSAodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1VbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgPSB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VVbmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKLQkJCQl1bmlxdWVDb25zdHJhaW50LnVwZGF0ZShyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVVbmlxdWVDb25zdHJhaW50Xyh1bmlxdWVDb25zdHJhaW50KTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlVW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpLCBidWlsZFVuaXF1ZUNvbnN0cmFpbnQocmVzb3VyY2VVbmlxdWVDb25zdHJhaW50cy5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1VbmlxdWVDb25zdHJhaW50IGJ1aWxkVW5pcXVlQ29uc3RyYWludChYbWxVbmlxdWVDb25zdHJhaW50IHhtbFVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVVuaXF1ZUNvbnN0cmFpbnQodGhpcywgdGhpcywgeG1sVW5pcXVlQ29uc3RyYWludCk7CisJCXRoaXMuZ2V0UmVzb3VyY2VUYWJsZSgpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl0aGlzLmZpcmVJdGVtTW92ZWQoVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKIAl9CiAJCiAKLQlwdWJsaWMgU3RyaW5nIHF1YWxpZmllZE5hbWUoKSB7Ci0JCXJldHVybiBOYW1lVG9vbHMuYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUodGhpcy5nZXRDYXRhbG9nKCksIHRoaXMuZ2V0U2NoZW1hKCksIHRoaXMuZ2V0TmFtZSgpKTsKKwkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoVGV4dFJhbmdlIHRleHRSYW5nZSkgeworCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwogCX0KIAogCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJaWYgKGdldFRhYmxlUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gZ2V0VGFibGVSZXNvdXJjZSgpLmdldE5hbWVUZXh0UmFuZ2UoKTsKLQkJCWlmICh0ZXh0UmFuZ2UgIT0gbnVsbCkgewotCQkJCXJldHVybiB0ZXh0UmFuZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOyAKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKCkgewotCQlpZiAoZ2V0VGFibGVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRUYWJsZVJlc291cmNlKCkuZ2V0Q2F0YWxvZ1RleHRSYW5nZSgpOwotCQkJaWYgKHRleHRSYW5nZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRleHRSYW5nZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7IAotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZSgpIHsKLQkJaWYgKGdldFRhYmxlUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gZ2V0VGFibGVSZXNvdXJjZSgpLmdldFNjaGVtYVRleHRSYW5nZSgpOwotCQkJaWYgKHRleHRSYW5nZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRleHRSYW5nZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7IAotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCWlmIChnZXRUYWJsZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJCWlmICh0ZXh0UmFuZ2UgIT0gbnVsbCkgewotCQkJCXJldHVybiB0ZXh0UmFuZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwkJcmV0dXJuIHRoaXMuZ2V0VGV4dFJhbmdlKHRoaXMuZ2V0UmVzb3VyY2VUYWJsZU5hbWVUZXh0UmFuZ2UoKSk7CiAJfQogCisJcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRSZXNvdXJjZVRhYmxlTmFtZVRleHRSYW5nZSgpIHsKKwkJQWJzdHJhY3RYbWxUYWJsZSByZXNvdXJjZVRhYmxlID0gdGhpcy5nZXRSZXNvdXJjZVRhYmxlKCk7CisJCXJldHVybiAocmVzb3VyY2VUYWJsZSA9PSBudWxsKSA/IG51bGwgOiByZXNvdXJjZVRhYmxlLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0VGV4dFJhbmdlKHRoaXMuZ2V0UmVzb3VyY2VUYWJsZVNjaGVtYVRleHRSYW5nZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFJlc291cmNlVGFibGVTY2hlbWFUZXh0UmFuZ2UoKSB7CisJCUFic3RyYWN0WG1sVGFibGUgcmVzb3VyY2VUYWJsZSA9IHRoaXMuZ2V0UmVzb3VyY2VUYWJsZSgpOworCQlyZXR1cm4gKHJlc291cmNlVGFibGUgPT0gbnVsbCkgPyBudWxsIDogcmVzb3VyY2VUYWJsZS5nZXRTY2hlbWFUZXh0UmFuZ2UoKTsKKwl9CisKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLmdldFRleHRSYW5nZSh0aGlzLmdldFJlc291cmNlVGFibGVDYXRhbG9nVGV4dFJhbmdlKCkpOworCX0KKworCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0UmVzb3VyY2VUYWJsZUNhdGFsb2dUZXh0UmFuZ2UoKSB7CisJCUFic3RyYWN0WG1sVGFibGUgcmVzb3VyY2VUYWJsZSA9IHRoaXMuZ2V0UmVzb3VyY2VUYWJsZSgpOworCQlyZXR1cm4gKHJlc291cmNlVGFibGUgPT0gbnVsbCkgPyBudWxsIDogcmVzb3VyY2VUYWJsZS5nZXRDYXRhbG9nVGV4dFJhbmdlKCk7CisJfQorCisJcHJvdGVjdGVkIE9ybVVuaXF1ZUNvbnN0cmFpbnQgYnVpbGRVbmlxdWVDb25zdHJhaW50KFhtbFVuaXF1ZUNvbnN0cmFpbnQgcmVzb3VyY2VVbmlxdWVDb25zdHJhaW50KSB7CisJCXJldHVybiB0aGlzLmdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtVW5pcXVlQ29uc3RyYWludCh0aGlzLCB0aGlzLCByZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnQpOworCX0KKworCisJLy8gKioqKioqKioqKiByZXNvdXJjZSA9PiBjb250ZXh0ICoqKioqKioqKioKKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoQWJzdHJhY3RYbWxUYWJsZSB4bWxUYWJsZSkgeworCQl0aGlzLmRlZmF1bHROYW1lID0gdGhpcy5idWlsZERlZmF1bHROYW1lKCk7CisJCXRoaXMuc3BlY2lmaWVkTmFtZSA9IHRoaXMuZ2V0UmVzb3VyY2VUYWJsZU5hbWUoeG1sVGFibGUpOworCisJCXRoaXMuZGVmYXVsdFNjaGVtYSA9IHRoaXMuYnVpbGREZWZhdWx0U2NoZW1hKCk7CisJCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gdGhpcy5nZXRSZXNvdXJjZVRhYmxlU2NoZW1hKHhtbFRhYmxlKTsKKworCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gdGhpcy5idWlsZERlZmF1bHRDYXRhbG9nKCk7CisJCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IHRoaXMuZ2V0UmVzb3VyY2VUYWJsZUNhdGFsb2coeG1sVGFibGUpOworCisJCXRoaXMuaW5pdGlhbGl6ZVVuaXF1ZUNvbnRyYWludHMoeG1sVGFibGUpOworCX0KIAkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVW5pcXVlQ29udHJhaW50cyhBYnN0cmFjdFhtbFRhYmxlIHhtbFRhYmxlKSB7CisJCWlmICh4bWxUYWJsZSA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJZm9yIChYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgOiB4bWxUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpKSB7CisJCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmFkZCh0aGlzLmJ1aWxkVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoQWJzdHJhY3RYbWxUYWJsZSB4bWxUYWJsZSkgeworCQl0aGlzLnNldERlZmF1bHROYW1lKHRoaXMuYnVpbGREZWZhdWx0TmFtZSgpKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWROYW1lXyh0aGlzLmdldFJlc291cmNlVGFibGVOYW1lKHhtbFRhYmxlKSk7CisKKwkJdGhpcy5zZXREZWZhdWx0U2NoZW1hKHRoaXMuYnVpbGREZWZhdWx0U2NoZW1hKCkpOworCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8odGhpcy5nZXRSZXNvdXJjZVRhYmxlU2NoZW1hKHhtbFRhYmxlKSk7CisKKwkJdGhpcy5zZXREZWZhdWx0Q2F0YWxvZyh0aGlzLmJ1aWxkRGVmYXVsdENhdGFsb2coKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18odGhpcy5nZXRSZXNvdXJjZVRhYmxlQ2F0YWxvZyh4bWxUYWJsZSkpOworCisJCXRoaXMudXBkYXRlVW5pcXVlQ29uc3RyYWludHMoeG1sVGFibGUpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VUYWJsZU5hbWUoQWJzdHJhY3RYbWxUYWJsZSB4bWxUYWJsZSkgeworCQlyZXR1cm4gKHhtbFRhYmxlID09IG51bGwpID8gbnVsbCA6IHhtbFRhYmxlLmdldE5hbWUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlVGFibGVTY2hlbWEoQWJzdHJhY3RYbWxUYWJsZSB4bWxUYWJsZSkgeworCQlyZXR1cm4gKHhtbFRhYmxlID09IG51bGwpID8gbnVsbCA6IHhtbFRhYmxlLmdldFNjaGVtYSgpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VUYWJsZUNhdGFsb2coQWJzdHJhY3RYbWxUYWJsZSB4bWxUYWJsZSkgeworCQlyZXR1cm4gKHhtbFRhYmxlID09IG51bGwpID8gbnVsbCA6IHhtbFRhYmxlLmdldENhdGFsb2coKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVbmlxdWVDb25zdHJhaW50cyhBYnN0cmFjdFhtbFRhYmxlIHhtbFRhYmxlKSB7CisJCUl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHhtbENvbnN0cmFpbnRzID0gdGhpcy54bWxVbmlxdWVDb25zdHJhaW50cyh4bWxUYWJsZSk7CisKKwkJZm9yIChJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiBjb250ZXh0Q29uc3RyYWludHMgPSB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKCk7IGNvbnRleHRDb25zdHJhaW50cy5oYXNOZXh0KCk7ICkgeworCQkJT3JtVW5pcXVlQ29uc3RyYWludCBjb250ZXh0Q29uc3RyYWludCA9IGNvbnRleHRDb25zdHJhaW50cy5uZXh0KCk7CisJCQlpZiAoeG1sQ29uc3RyYWludHMuaGFzTmV4dCgpKSB7CisJCQkJY29udGV4dENvbnN0cmFpbnQudXBkYXRlKHhtbENvbnN0cmFpbnRzLm5leHQoKSk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMucmVtb3ZlVW5pcXVlQ29uc3RyYWludF8oY29udGV4dENvbnN0cmFpbnQpOworCQkJfQorCQl9CisJCQorCQl3aGlsZSAoeG1sQ29uc3RyYWludHMuaGFzTmV4dCgpKSB7CisJCQl0aGlzLmFkZFVuaXF1ZUNvbnN0cmFpbnQodGhpcy5idWlsZFVuaXF1ZUNvbnN0cmFpbnQoeG1sQ29uc3RyYWludHMubmV4dCgpKSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4geG1sVW5pcXVlQ29uc3RyYWludHMoQWJzdHJhY3RYbWxUYWJsZSB4bWxUYWJsZSkgeworCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgWE1MIGNvbnN0cmFpbnRzICh0byBwcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24pCisJCXJldHVybiAoeG1sVGFibGUgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhdG9yLjxYbWxVbmlxdWVDb25zdHJhaW50Pmluc3RhbmNlKCkKKwkJCQk6IG5ldyBDbG9uZUl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+KHhtbFRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkpOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKFRhYmxlIG9sZFRhYmxlKSB7CisJCXRoaXMuc2V0U3BlY2lmaWVkTmFtZShvbGRUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOworCQl0aGlzLnNldFNwZWNpZmllZENhdGFsb2cob2xkVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRTY2hlbWEob2xkVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBkYXRhYmFzZSBzdHVmZiAqKioqKioqKioqCisKKwlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoKSB7CisJCVNjaGVtYSBkYlNjaGVtYSA9IHRoaXMuZ2V0RGJTY2hlbWEoKTsKKwkJcmV0dXJuIChkYlNjaGVtYSA9PSBudWxsKSA/IG51bGwgOiBkYlNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIodGhpcy5nZXROYW1lKCkpOworCX0KKworCXB1YmxpYyBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7CisJCVNjaGVtYUNvbnRhaW5lciBkYlNjaGVtYUNvbnRhaW5lciA9IHRoaXMuZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKKwkJcmV0dXJuIChkYlNjaGVtYUNvbnRhaW5lciA9PSBudWxsKSA/IG51bGwgOiBkYlNjaGVtYUNvbnRhaW5lci5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHRoaXMuZ2V0U2NoZW1hKCkpOworCX0KKworCS8qKgorCSAqIElmIHdlIGRvbid0IGhhdmUgYSBjYXRhbG9nIChpLmUuIHdlIGRvbid0IGV2ZW4gaGF2ZSBhIDxlbT5kZWZhdWx0PC9lbT4gY2F0YWxvZyksCisJICogdGhlbiB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9nczsgYW5kIHdlIG5lZWQgdG8KKwkgKiBnZXQgdGhlIHNjaGVtYSBkaXJlY3RseSBmcm9tIHRoZSBkYXRhYmFzZS4KKwkgKi8KKwlwdWJsaWMgU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyKCkgeworCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygpOworCQlyZXR1cm4gKGNhdGFsb2cgIT0gbnVsbCkgPyB0aGlzLmdldERiQ2F0YWxvZyhjYXRhbG9nKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwl9CisKKwkvKioKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+CisJICogY2F0YWxvZyksIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCisJICovCisJcHVibGljIENhdGFsb2cgZ2V0RGJDYXRhbG9nKCkgeworCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygpOworCQlyZXR1cm4gKGNhdGFsb2cgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXREYkNhdGFsb2coY2F0YWxvZyk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RGJUYWJsZSgpICE9IG51bGw7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzUmVzb2x2ZWRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLmdldERiU2NoZW1hKCkgIT0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+CisJICogY2F0YWxvZyksIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzUmVzb2x2ZWRDYXRhbG9nKCkgeworCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygpOworCQlyZXR1cm4gKGNhdGFsb2cgPT0gbnVsbCkgfHwgKHRoaXMuZ2V0RGJDYXRhbG9nKGNhdGFsb2cpICE9IG51bGwpOworCX0KKworCisJLy8gKioqKioqKioqKiBVbmlxdWVDb25zdHJhaW50Lk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZVVuaXF1ZUNvbnN0cmFpbnRDb2x1bW5OYW1lcygpIHsKKwkJb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGRiVGFibGUgPSB0aGlzLmdldERiVGFibGUoKTsKKwkJcmV0dXJuIChkYlRhYmxlICE9IG51bGwpID8gZGJUYWJsZS5zb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpIDogRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRUZXh0UmFuZ2UodGhpcy5nZXRSZXNvdXJjZVRhYmxlVmFsaWRhdGlvblRleHRSYW5nZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFJlc291cmNlVGFibGVWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlBYnN0cmFjdFhtbFRhYmxlIHJlc291cmNlVGFibGUgPSB0aGlzLmdldFJlc291cmNlVGFibGUoKTsKKwkJcmV0dXJuIChyZXNvdXJjZVRhYmxlID09IG51bGwpID8gbnVsbCA6IHJlc291cmNlVGFibGUuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCX0KKworCisJLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKKworCS8qKgorCSAqIGNvdmFyaWFudCBvdmVycmlkZQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBYbWxDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoWG1sQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKIAkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQocXVhbGlmaWVkTmFtZSgpKTsKKwkJc2IuYXBwZW5kKHRoaXMuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKIAl9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBxdWFsaWZpZWROYW1lKCk7CisJcHJvdGVjdGVkIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgeworCQlyZXR1cm4gTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKHRoaXMuZ2V0Q2F0YWxvZygpLCB0aGlzLmdldFNjaGVtYSgpLCB0aGlzLmdldE5hbWUoKSk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVR5cGVNYXBwaW5nLmphdmEKaW5kZXggNjBjYzFlZi4uZTE5YzVmZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVHlwZU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1UeXBlTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTExLDUyICsxMSw3NCBAQAogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CiAKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtVHlwZU1hcHBpbmc8VCBleHRlbmRzIEFic3RyYWN0WG1sVHlwZU1hcHBpbmc+IGV4dGVuZHMgQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIE9ybVR5cGVNYXBwaW5nCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1UeXBlTWFwcGluZzxUIGV4dGVuZHMgWG1sVHlwZU1hcHBpbmc+CisJZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlIAorCWltcGxlbWVudHMgT3JtVHlwZU1hcHBpbmcKIHsKLQogCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NfOwogCQotCXB1YmxpYyBBY2Nlc3NUeXBlIGRlZmF1bHRBY2Nlc3M7Ci0KLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3M7Ci0KIAlwdWJsaWMgYm9vbGVhbiBkZWZhdWx0TWV0YWRhdGFDb21wbGV0ZTsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGU7Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZTsKLQotCXByb3RlY3RlZCBUIHR5cGVNYXBwaW5nOwogCQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybVR5cGVNYXBwaW5nKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgeworCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGU7CisJCisJcHJvdGVjdGVkIGZpbmFsIFQgcmVzb3VyY2VUeXBlTWFwcGluZzsKKwkKKwkKKwlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1UeXBlTWFwcGluZyhPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFQgcmVzb3VyY2VNYXBwaW5nKSB7CiAJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMucmVzb3VyY2VUeXBlTWFwcGluZyA9IHJlc291cmNlTWFwcGluZzsKKwkJdGhpcy5jbGFzc18gPSB0aGlzLmdldFJlc291cmNlQ2xhc3NOYW1lKCk7CisJCXRoaXMuc3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSA9IHRoaXMuZ2V0UmVzb3VyY2VNZXRhZGF0YUNvbXBsZXRlKCk7CisJCXRoaXMuZGVmYXVsdE1ldGFkYXRhQ29tcGxldGUgPSB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuaXNEZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpOworCX0JCisJCisJLy8gKioqKioqKioqKioqKioqKiBUeXBlIE1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoT3JtUGVyc2lzdGVudFR5cGUpIHN1cGVyLmdldFBhcmVudCgpOwogCX0KIAorCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7CisJfQorCQorCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCX0KKwkKIAlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7CisJcHVibGljIFN0cmluZyBnZXRQcmltYXJ5VGFibGVOYW1lKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKQEAgLTY3LDM1ICs4OSwxMSBAQAogCXB1YmxpYyB2b2lkIHNldENsYXNzKFN0cmluZyBuZXdDbGFzcykgewogCQlTdHJpbmcgb2xkQ2xhc3MgPSB0aGlzLmNsYXNzXzsKIAkJdGhpcy5jbGFzc18gPSBuZXdDbGFzczsKLQkJdGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0Q2xhc3NOYW1lKG5ld0NsYXNzKTsKKwkJdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLnNldENsYXNzTmFtZShuZXdDbGFzcyk7CiAJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0xBU1NfUFJPUEVSVFksIG9sZENsYXNzLCBuZXdDbGFzcyk7CiAJCWdldFBlcnNpc3RlbnRUeXBlKCkuY2xhc3NDaGFuZ2VkKG9sZENsYXNzLCBuZXdDbGFzcyk7CiAJfQogCQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldERlZmF1bHRBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBY2Nlc3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEFjY2VzcyhBY2Nlc3NUeXBlIG5ld0RlZmF1bHRBY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGREZWZhdWx0QWNjZXNzID0gdGhpcy5kZWZhdWx0QWNjZXNzOwotCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSBuZXdEZWZhdWx0QWNjZXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUNDRVNTX1BST1BFUlRZLCBvbGREZWZhdWx0QWNjZXNzLCBuZXdEZWZhdWx0QWNjZXNzKTsKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRTcGVjaWZpZWRBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFjY2VzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdTcGVjaWZpZWRBY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGRTcGVjaWZpZWRBY2Nlc3MgPSB0aGlzLnNwZWNpZmllZEFjY2VzczsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3MgPSBuZXdTcGVjaWZpZWRBY2Nlc3M7Ci0JCXRoaXMuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLnRvWG1sUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRBY2Nlc3MpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRBY2Nlc3MsIG5ld1NwZWNpZmllZEFjY2Vzcyk7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRBY2Nlc3MoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkQWNjZXNzKCk7Ci0JfQogCiAJcHVibGljIGJvb2xlYW4gaXNNZXRhZGF0YUNvbXBsZXRlKCkgewogCQlpZiAoaXNEZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpKSB7CkBAIC0xMjMsMjUgKzEyMSwxOCBAQAogCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKSB7CiAJCUJvb2xlYW4gb2xkTWV0YWRhdGFDb21wbGV0ZSA9IHRoaXMuc3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZTsKIAkJdGhpcy5zcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlID0gbmV3U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZTsKLQkJdGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0TWV0YWRhdGFDb21wbGV0ZShuZXdTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKTsKKwkJdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLnNldE1ldGFkYXRhQ29tcGxldGUobmV3U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSk7CiAJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZLCBvbGRNZXRhZGF0YUNvbXBsZXRlLCBuZXdTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKTsKIAl9CiAKLQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiAoT3JtUGVyc2lzdGVudFR5cGUpIGdldFBhcmVudCgpOwotCX0KLQogCS8qKgogCSAqIElUeXBlTWFwcGluZyBpcyBjaGFuZ2VkIGFuZCB2YXJpb3VzIElUeXBlTWFwcGluZ3MgbWF5IGhhdmUKIAkgKiBjb21tb24gc2V0dGluZ3MuICBJbiB0aGlzIG1ldGhvZCBpbml0aWFsaXplIHRoZSBuZXcgSVR5cGVNYXBwaW5nICh0aGlzKQogCSAqIGZyb210aGUgb2xkIElUeXBlTWFwcGluZyAob2xkTWFwcGluZykKLQkgKiBAcGFyYW0gb2xkTWFwcGluZwogCSAqLwogCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE9ybVR5cGVNYXBwaW5nIG9sZE1hcHBpbmcpIHsKIAkJdGhpcy5zZXRDbGFzcyhvbGRNYXBwaW5nLmdldENsYXNzXygpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBY2Nlc3Mob2xkTWFwcGluZy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CiAJCXRoaXMuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShvbGRNYXBwaW5nLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdEFjY2VzcyhvbGRNYXBwaW5nLmdldERlZmF1bHRBY2Nlc3MoKSk7CiAJCXRoaXMuc2V0RGVmYXVsdE1ldGFkYXRhQ29tcGxldGUob2xkTWFwcGluZy5pc0RlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCX0KIAkKQEAgLTE1NywyMTEgKzE0OCwxODggQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCi0JLyoqCi0JICogQHNlZSBUeXBlTWFwcGluZyNhdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChTdHJpbmcpCi0JICogCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogIG92ZXJyaWRlIHdoZXJlIG5lZWRlZAotCSAqLwogCXB1YmxpYyBib29sZWFuIGF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKFN0cmluZyBhdHRyaWJ1dGVNYXBwaW5nS2V5KSB7CiAJCXJldHVybiB0cnVlOwogCX0KIAotCXB1YmxpYyBJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7CisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVNYXBwaW5nPiBhdHRyaWJ1dGVNYXBwaW5ncygpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBPcm1BdHRyaWJ1dGVNYXBwaW5nPihnZXRQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZyB0cmFuc2Zvcm0oT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJCQlyZXR1cm4gYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb2YgVHlwZU1hcHBpbmdzLCBlYWNoIHdoaWNoIGluaGVyaXRzIGZyb20gdGhlIG9uZSBiZWZvcmUsCisJICogYW5kIHRlcm1pbmF0ZXMgYXQgdGhlIHJvb3QgZW50aXR5IChvciBhdCB0aGUgcG9pbnQgb2YgY3ljbGljaXR5KS4KKwkgKi8KKwlwdWJsaWMgSXRlcmF0b3I8VHlwZU1hcHBpbmc+IGluaGVyaXRhbmNlSGllcmFyY2h5KCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGVyc2lzdGVudFR5cGUsIFR5cGVNYXBwaW5nPihnZXRQZXJzaXN0ZW50VHlwZSgpLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFR5cGVNYXBwaW5nIHRyYW5zZm9ybShQZXJzaXN0ZW50VHlwZSB0eXBlKSB7CisJCQkJcmV0dXJuIHR5cGUuZ2V0TWFwcGluZygpOworCQkJfQorCQl9OworCX0KKwkKKwlwdWJsaWMgSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZz4gYWxsQXR0cmlidXRlTWFwcGluZ3MoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZz4oCisJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUeXBlTWFwcGluZywgSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZz4+KHRoaXMuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nPiB0cmFuc2Zvcm0oVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKKwkJCQkJcmV0dXJuIHR5cGVNYXBwaW5nLmF0dHJpYnV0ZU1hcHBpbmdzKCk7CisJCQkJfQorCQkJfSk7CiAJfQogCiAJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KAorCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZywgSXRlcmF0b3I8U3RyaW5nPj4odGhpcy5hdHRyaWJ1dGVNYXBwaW5ncygpKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdHJhbnNmb3JtKEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgeworCQkJCQlyZXR1cm4gbWFwcGluZy5hbGxPdmVycmlkZWFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKTsKKwkJCQl9CisJCQl9KTsKIAl9CiAKIAlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4obmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VHlwZU1hcHBpbmcsIEl0ZXJhdG9yPFN0cmluZz4+KHRoaXMuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB0cmFuc2Zvcm0oVHlwZU1hcHBpbmcgbWFwcGluZykgeworCQkJCXJldHVybiBtYXBwaW5nLm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJCX0KKwkJfSk7CiAJfQotCi0JcHVibGljIEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0JCisJCisJcHVibGljIENvbHVtbiByZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCWZvciAoQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGF0dHJpYnV0ZU1hcHBpbmdzKCkpKSB7CisJCQlDb2x1bW4gcmVzb2x2ZWRDb2x1bW4gPSBhdHRyaWJ1dGVNYXBwaW5nLnJlc29sdmVPdmVycmlkZW5Db2x1bW4oYXR0cmlidXRlTmFtZSk7CisJCQlpZiAocmVzb2x2ZWRDb2x1bW4gIT0gbnVsbCkgeworCQkJCXJldHVybiByZXNvbHZlZENvbHVtbjsKKwkJCX0KKwkJfQorCQlpZiAoIWlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCQlpZiAoamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gamF2YVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5yZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKGF0dHJpYnV0ZU5hbWUpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KIAkKIAlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4oCisJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYXRvcjxTdHJpbmc+Pih0aGlzLmF0dHJpYnV0ZU1hcHBpbmdzKCkpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB0cmFuc2Zvcm0oQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7CisJCQkJCXJldHVybiBtYXBwaW5nLmFsbE92ZXJyaWRlYWJsZUFzc29jaWF0aW9uTWFwcGluZ05hbWVzKCk7CisJCQkJfQorCQkJfSk7CiAJfQogCiAJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBUIGdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVNYXBwaW5nOworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4obmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VHlwZU1hcHBpbmcsIEl0ZXJhdG9yPFN0cmluZz4+KHRoaXMuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB0cmFuc2Zvcm0oVHlwZU1hcHBpbmcgbWFwcGluZykgeworCQkJCXJldHVybiBtYXBwaW5nLm92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOworCQkJfQorCQl9KTsKIAl9CiAJCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkgewotCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZGVmYXVsdEFjY2VzcygpIHsKKwlwdWJsaWMgUmVsYXRpb25zaGlwUmVmZXJlbmNlIHJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKwkJZm9yIChBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoYXR0cmlidXRlTWFwcGluZ3MoKSkpIHsKKwkJCVJlbGF0aW9uc2hpcFJlZmVyZW5jZSByZXNvbHZlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSA9IGF0dHJpYnV0ZU1hcHBpbmcucmVzb2x2ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShhdHRyaWJ1dGVOYW1lKTsKKwkJCWlmIChyZXNvbHZlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc29sdmVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOworCQkJfQorCQl9CiAJCWlmICghaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCWlmIChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmhhc0FueUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9ucygpKSB7Ci0JCQkJCXJldHVybiBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKTsKLQkJCQl9Ci0JCQkJaWYgKGdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBnZXRQZXJzaXN0ZW50VHlwZSgpLmdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCk7Ci0JCQkJfQorCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkJaWYgKGphdmFQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkucmVzb2x2ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShhdHRyaWJ1dGVOYW1lKTsKIAkJCX0KIAkJfQotCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKTsKLQl9Ci0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFQZXJzaXN0ZW50VHlwZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SmF2YVBlcnNpc3RlbnRUeXBlKEphdmFQZXJzaXN0ZW50VHlwZSBuZXdKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIG9sZEphdmFQZXJzaXN0ZW50VHlwZSA9IHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlOwotCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSA9IG5ld0phdmFQZXJzaXN0ZW50VHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChKQVZBX1BFUlNJU1RFTlRfVFlQRV9QUk9QRVJUWSwgb2xkSmF2YVBlcnNpc3RlbnRUeXBlLCBuZXdKYXZhUGVyc2lzdGVudFR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSmF2YVBlcnNpc3RlbnRUeXBlKCkgewotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlID0gZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgPSBidWlsZEphdmFQZXJzaXN0ZW50VHlwZShwZXJzaXN0ZW50VHlwZVJlc291cmNlKTsKLQkJfQkKKwkJcmV0dXJuIG51bGw7CiAJfQogCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkgewotCQkvLyB0cnkgdG8gcmVzb2x2ZSBieSBvbmx5IHRoZSBsb2NhbGx5IHNwZWNpZmllZCBuYW1lCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoZ2V0Q2xhc3NfKCkpOwotCQlpZiAocGVyc2lzdGVudFR5cGVSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkvLyB0cnkgdG8gcmVzb2x2ZSBieSBwcmVwZW5kaW5nIHRoZSBnbG9iYWwgcGFja2FnZSBuYW1lCi0JCQlwZXJzaXN0ZW50VHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpICsgIi4iICsgZ2V0Q2xhc3NfKCkpOwotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZW50VHlwZVJlc291cmNlOworCXB1YmxpYyBUIGdldFJlc291cmNlVHlwZU1hcHBpbmcoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmc7CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUphdmFQZXJzaXN0ZW50VHlwZSgpIHsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSA9IGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWlmIChwZXJzaXN0ZW50VHlwZVJlc291cmNlID09IG51bGwpIHsKLQkJCXNldEphdmFQZXJzaXN0ZW50VHlwZShudWxsKTsKLQkJfQotCQllbHNlIHsgCi0JCQlpZiAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkgIT0gbnVsbCkgewotCQkJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnVwZGF0ZShwZXJzaXN0ZW50VHlwZVJlc291cmNlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldEphdmFQZXJzaXN0ZW50VHlwZShidWlsZEphdmFQZXJzaXN0ZW50VHlwZShwZXJzaXN0ZW50VHlwZVJlc291cmNlKSk7Ci0JCQl9Ci0JCX0JCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJdGhpcy5zZXRDbGFzcyh0aGlzLmdldFJlc291cmNlQ2xhc3NOYW1lKCkpOworCQl0aGlzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUodGhpcy5nZXRSZXNvdXJjZU1ldGFkYXRhQ29tcGxldGUoKSk7CisJCXRoaXMuc2V0RGVmYXVsdE1ldGFkYXRhQ29tcGxldGUodGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmlzRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJfQogCQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQlyZXR1cm4gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKHRoaXMsIHJlc291cmNlUGVyc2lzdGVudFR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVCB0eXBlTWFwcGluZykgewotCQl0aGlzLnR5cGVNYXBwaW5nID0gdHlwZU1hcHBpbmc7Ci0JCXRoaXMuY2xhc3NfID0gdHlwZU1hcHBpbmcuZ2V0Q2xhc3NOYW1lKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQl0aGlzLnNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUgPSB0aGlzLm1ldGFkYXRhQ29tcGxldGUodHlwZU1hcHBpbmcpOwotCQl0aGlzLmRlZmF1bHRNZXRhZGF0YUNvbXBsZXRlID0gdGhpcy5kZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpOwotCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IEFjY2Vzc1R5cGUuZnJvbVhtbFJlc291cmNlTW9kZWwodHlwZU1hcHBpbmcuZ2V0QWNjZXNzKCkpOwotCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSB0aGlzLmRlZmF1bHRBY2Nlc3MoKTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlQ2xhc3NOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLmdldENsYXNzTmFtZSgpOwogCX0KIAkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoVCB0eXBlTWFwcGluZykgewotCQl0aGlzLnR5cGVNYXBwaW5nID0gdHlwZU1hcHBpbmc7Ci0JCXRoaXMuc2V0Q2xhc3ModHlwZU1hcHBpbmcuZ2V0Q2xhc3NOYW1lKCkpOwotCQl0aGlzLnVwZGF0ZUphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQl0aGlzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUodGhpcy5tZXRhZGF0YUNvbXBsZXRlKHR5cGVNYXBwaW5nKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdE1ldGFkYXRhQ29tcGxldGUodGhpcy5kZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5mcm9tWG1sUmVzb3VyY2VNb2RlbCh0eXBlTWFwcGluZy5nZXRBY2Nlc3MoKSkpOwotCQl0aGlzLnNldERlZmF1bHRBY2Nlc3ModGhpcy5kZWZhdWx0QWNjZXNzKCkpOworCXByb3RlY3RlZCBCb29sZWFuIGdldFJlc291cmNlTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZy5nZXRNZXRhZGF0YUNvbXBsZXRlKCk7CiAJfQotCQotCXByb3RlY3RlZCBCb29sZWFuIG1ldGFkYXRhQ29tcGxldGUoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlyZXR1cm4gdHlwZU1hcHBpbmcuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQogCiAJCiAJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQogCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IG9mZnNldCkgewotCQlpZiAodGhpcy50eXBlTWFwcGluZy5jb250YWluc09mZnNldChvZmZzZXQpKSB7CisJCWlmICh0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcuY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewogCQkJcmV0dXJuIGdldFBlcnNpc3RlbnRUeXBlKCk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCQogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlTWFwcGluZy5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZy5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKIAl9CiAJCiAJcHVibGljIFRleHRSYW5nZSBnZXRDbGFzc1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZU1hcHBpbmcuZ2V0Q2xhc3NUZXh0UmFuZ2UoKTsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZy5nZXRDbGFzc1RleHRSYW5nZSgpOwogCX0KIAkKIAlwdWJsaWMgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZXNUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXNUZXh0UmFuZ2UoKTsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzVGV4dFJhbmdlKCk7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IHRleHRPZmZzZXQpIHsKLQkJaWYgKHRoaXMudHlwZU1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLnR5cGVNYXBwaW5nLmNvbnRhaW5zT2Zmc2V0KHRleHRPZmZzZXQpOworCQlyZXR1cm4gKHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZyAhPSBudWxsKQorCQkJCSYmIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZy5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KTsKIAl9CiAJCiAJLy8qKioqKioqKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJYWRkQ2xhc3NNZXNzYWdlcyhtZXNzYWdlcyk7CisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl0aGlzLnZhbGlkYXRlQ2xhc3MobWVzc2FnZXMpOwogCX0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDbGFzc01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWFkZFVuc3BlY2lmaWVkQ2xhc3NNZXNzYWdlKG1lc3NhZ2VzKTsKLQkJYWRkVW5yZXNvbHZlZENsYXNzTWVzc2FnZShtZXNzYWdlcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFVuc3BlY2lmaWVkQ2xhc3NNZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldENsYXNzXygpKSkgeworCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDbGFzcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmNsYXNzXykpIHsKIAkJCW1lc3NhZ2VzLmFkZCgKIAkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKIAkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DTEFTUywKIAkJCQkJdGhpcywgCi0JCQkJCXRoaXMuZ2V0Q2xhc3NUZXh0UmFuZ2UoKSkKKwkJCQkJdGhpcy5nZXRDbGFzc1RleHRSYW5nZSgpCisJCQkJKQogCQkJKTsKKwkJCXJldHVybjsKIAkJfQogCX0KIAkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRVbnJlc29sdmVkQ2xhc3NNZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0Q2xhc3NfKCkpCi0JCQkJJiYgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9UWVBFX1VOUkVTT0xWRURfQ0xBU1MsCi0JCQkJCW5ldyBTdHJpbmdbXSB7Z2V0Q2xhc3NfKCl9LAotCQkJCQl0aGlzLCAKLQkJCQkJdGhpcy5nZXRDbGFzc1RleHRSYW5nZSgpKQotCQkJKTsKLQkJfQorCXB1YmxpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlQWdhaW5zdERhdGFiYXNlKCkgeworCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKIAl9CiAKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVNYXBwaW5nLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1WZXJzaW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVmVyc2lvbk1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjc1ZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVmVyc2lvbk1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDIzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1WZXJzaW9uTWFwcGluZzxUIGV4dGVuZHMgWG1sVmVyc2lvbj4KKwlleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxUPgorCWltcGxlbWVudHMgT3JtVmVyc2lvbk1hcHBpbmcKK3sKKwlwcm90ZWN0ZWQgZmluYWwgT3JtQ29sdW1uIGNvbHVtbjsKKworCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIgZGVmYXVsdENvbnZlcnRlcjsKKwlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIHNwZWNpZmllZENvbnZlcnRlcjsKKwkKKwlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1WZXJzaW9uTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgVCByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCQl0aGlzLmNvbHVtbiA9IGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtQ29sdW1uKHRoaXMsIHRoaXMpOworCQl0aGlzLmNvbHVtbi5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKSk7Ly9UT0RPIHBhc3MgaW4gdG8gY29uc3RydWN0b3IKKwkJdGhpcy5kZWZhdWx0Q29udmVydGVyID0gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1OdWxsQ29udmVydGVyKHRoaXMpOworCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXIodGhpcy5nZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKSk7CisJfQorCisJcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIDMwOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKKwkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybVZlcnNpb25NYXBwaW5nKHRoaXMpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tT3JtQ29sdW1uTWFwcGluZyhPcm1Db2x1bW5NYXBwaW5nIG9sZE1hcHBpbmcpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZUZyb21Pcm1Db2x1bW5NYXBwaW5nKG9sZE1hcHBpbmcpOworCQlnZXRDb2x1bW4oKS5pbml0aWFsaXplRnJvbShvbGRNYXBwaW5nLmdldENvbHVtbigpKTsKKwl9CisKKwlwdWJsaWMgT3JtQ29sdW1uIGdldENvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uOworCX0KKworCXB1YmxpYyBPcm1Db252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkgeworCQlyZXR1cm4gZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkgPT0gbnVsbCA/IGdldERlZmF1bHRDb252ZXJ0ZXIoKSA6IGdldFNwZWNpZmllZENvbnZlcnRlcigpOworCX0KKwkKKwlwdWJsaWMgT3JtQ29udmVydGVyIGdldERlZmF1bHRDb252ZXJ0ZXIoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRDb252ZXJ0ZXI7CisJfQorCQorCXB1YmxpYyBPcm1Db252ZXJ0ZXIgZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXI7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY2lmZWRDb252ZXJ0ZXJUeXBlKCkgeworCQlpZiAodGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuIENvbnZlcnRlci5OT19DT05WRVJURVI7CisJCX0KKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ29udmVydGVyLmdldFR5cGUoKTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7CisJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGdldFNwZWNpZmVkQ29udmVydGVyVHlwZSgpLCBjb252ZXJ0ZXJUeXBlKSkgeworCQkJcmV0dXJuOworCQl9CisJCU9ybUNvbnZlcnRlciBvbGRDb252ZXJ0ZXIgPSB0aGlzLnNwZWNpZmllZENvbnZlcnRlcjsKKwkJT3JtQ29udmVydGVyIG5ld0NvbnZlcnRlciA9IGJ1aWxkU3BlY2lmaWVkQ29udmVydGVyKGNvbnZlcnRlclR5cGUpOworCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlciA9IG51bGw7CisJCWlmIChvbGRDb252ZXJ0ZXIgIT0gbnVsbCkgeworCQkJb2xkQ29udmVydGVyLnJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKCk7CisJCX0KKwkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXIgPSBuZXdDb252ZXJ0ZXI7CisJCWlmIChuZXdDb252ZXJ0ZXIgIT0gbnVsbCkgeworCQkJbmV3Q29udmVydGVyLmFkZFRvUmVzb3VyY2VNb2RlbCgpOworCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NPTlZFUlRFUl9QUk9QRVJUWSwgb2xkQ29udmVydGVyLCBuZXdDb252ZXJ0ZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDb252ZXJ0ZXIoT3JtQ29udmVydGVyIG5ld0NvbnZlcnRlcikgeworCQlPcm1Db252ZXJ0ZXIgb2xkQ29udmVydGVyID0gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXI7CisJCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyID0gbmV3Q29udmVydGVyOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFksIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKKwl9CQorCisJcHVibGljIHZvaWQgYWRkVG9SZXNvdXJjZU1vZGVsKEF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7CisJCXJlc291cmNlQXR0cmlidXRlcy5nZXRWZXJzaW9ucygpLmFkZCh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKEF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7CisJCXJlc291cmNlQXR0cmlidXRlcy5nZXRWZXJzaW9ucygpLnJlbW92ZSh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsJCQorCQlyZXR1cm4gZ2V0TmFtZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKKwkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOworCX0KKworCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKKwkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLmNvbHVtbi51cGRhdGUodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpKTsKKwkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwoZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCksIGdldFNwZWNpZmVkQ29udmVydGVyVHlwZSgpKSkgeworCQkJZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkudXBkYXRlKCk7CisJCX0KKwkJZWxzZSB7CisJCQlzZXRTcGVjaWZpZWRDb252ZXJ0ZXIoYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXIoZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCkpKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGJ1aWxkU3BlY2lmaWVkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7CisJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGNvbnZlcnRlclR5cGUsIENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpKSB7CisJCQlyZXR1cm4gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1UZW1wb3JhbENvbnZlcnRlcih0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCkgeworCQlpZiAodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuZ2V0VGVtcG9yYWwoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUjsKKwkJfQorCQkKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLy8qKioqKioqKioqKioqKioqKiBYbWxDb2x1bW4uT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBYbWxDb2x1bW4gZ2V0UmVzb3VyY2VDb2x1bW4oKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5nZXRDb2x1bW4oKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkUmVzb3VyY2VDb2x1bW4oKSB7CisJCXRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW4oKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlQ29sdW1uKCkgeworCQl0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5zZXRDb2x1bW4obnVsbCk7CisJfQorCQorCS8vICoqKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCQorCQlpZiAodGhpcy5zaG91bGRWYWxpZGF0ZUFnYWluc3REYXRhYmFzZSgpKSB7CisJCQl0aGlzLnZhbGlkYXRlQ29sdW1uKG1lc3NhZ2VzKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbHVtbihMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhID0gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCVN0cmluZyB0YWJsZU5hbWUgPSB0aGlzLmNvbHVtbi5nZXRUYWJsZSgpOworCQlpZiAodGhpcy5nZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpKSB7CisJCQlpZiAocGEuaXNWaXJ0dWFsKCkpIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7cGEuZ2V0TmFtZSgpLCB0YWJsZU5hbWUsIHRoaXMuY29sdW1uLmdldE5hbWUoKX0sCisJCQkJCQl0aGlzLmNvbHVtbiwKKwkJCQkJCXRoaXMuY29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKCkKKwkJCQkJKQorCQkJCSk7CisJCQl9IGVsc2UgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAorCQkJCQkJbmV3IFN0cmluZ1tdIHt0YWJsZU5hbWUsIHRoaXMuY29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQkJdGhpcy5jb2x1bW4sCisJCQkJCQl0aGlzLmNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZSgpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoICEgdGhpcy5jb2x1bW4uaXNSZXNvbHZlZCgpICYmIHRoaXMuY29sdW1uLmdldERiVGFibGUoKSAhPSBudWxsKSB7CisJCQlpZiAocGEuaXNWaXJ0dWFsKCkpIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAorCQkJCQkJbmV3IFN0cmluZ1tdIHtwYS5nZXROYW1lKCksIHRoaXMuY29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQkJdGhpcy5jb2x1bW4sCisJCQkJCQl0aGlzLmNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKCkKKwkJCQkJKQorCQkJCSk7CisJCQl9IGVsc2UgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX05BTUUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuY29sdW1uLmdldE5hbWUoKX0sCisJCQkJCQl0aGlzLmNvbHVtbiwKKwkJCQkJCXRoaXMuY29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoKQorCQkJCQkpCisJCQkJKTsKKwkJCX0KKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3ZmQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbERlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5BYnN0cmFjdFhtbENvbnRleHROb2RlOworCisvKioKKyAqIFVzZSB0aGlzIGFic3RyYWN0IGNsYXNzIGZvciBjb250ZXh0IG5vZGVzIHRoYXQgYXJlIHBhcnQgb2YgYW4gT3JtWG1sIGZpbGUuCisgKiBUaGlzIHdpbGwgbm90IHdvcmsgZm9yIHB1cmVseSBNYXBwaW5nRmlsZSBpbXBsZW1lbnRhdGlvbnMKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKKwlleHRlbmRzIEFic3RyYWN0WG1sQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIFhtbENvbnRleHROb2RlCit7CisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKKworCXByb3RlY3RlZCBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlKEpwYUNvbnRleHROb2RlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgT3JtWG1sRGVmaW5pdGlvbiBnZXRNYXBwaW5nRmlsZURlZmluaXRpb24oKSB7CisJCXJldHVybiAoT3JtWG1sRGVmaW5pdGlvbikgZ2V0SnBhUGxhdGZvcm0oKS5nZXRSZXNvdXJjZURlZmluaXRpb24oZ2V0UmVzb3VyY2VUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpIHsKKwkJcmV0dXJuIGdldE1hcHBpbmdGaWxlRGVmaW5pdGlvbigpLmdldFJlc291cmNlTm9kZUZhY3RvcnkoKTsKKwl9CisJCisJcHVibGljIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKSB7CisJCXJldHVybiBnZXRNYXBwaW5nRmlsZURlZmluaXRpb24oKS5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZDllM2QKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2VKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1DYXNjYWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRGlzY3JpbWluYXRvckNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdGVkVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdG9yQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkTmF0aXZlUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5SGludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlY29uZGFyeVRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNFbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1CYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtQ2FzY2FkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtRGlzY3JpbWluYXRvckNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1FbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUVtYmVkZGVkSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtRW51bWVyYXRlZENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1HZW5lcmF0ZWRWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1HZW5lcmF0b3JDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUxvYkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybU1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtTmFtZWROYXRpdmVRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1OYW1lZFF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybU51bGxDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1RdWVyeUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1RdWVyeUhpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtU2Vjb25kYXJ5VGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtVGFibGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtVGVtcG9yYWxDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtVHJhbnNpZW50TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1VbmlxdWVDb25zdHJhaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVZlcnNpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLlVuc3VwcG9ydGVkT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLk51bGxPcm1DYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5OdWxsT3JtRGVyaXZlZElkMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uTnVsbE9ybU1hcHNJZDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLk51bGxPcm1PcnBoYW5SZW1vdmFsMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGVIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1EZXJpdmVkSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYXBzSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgaW1wbGVtZW50cyBPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkKK3sKKwlwdWJsaWMgT3JtWG1sIGJ1aWxkTWFwcGluZ0ZpbGUoTWFwcGluZ0ZpbGVSZWYgcGFyZW50LCBKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1YbWwocGFyZW50LCByZXNvdXJjZSk7CisJfQorCisJcHVibGljIEVudGl0eU1hcHBpbmdzIGJ1aWxkRW50aXR5TWFwcGluZ3MoT3JtWG1sIHBhcmVudCwgWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljRW50aXR5TWFwcGluZ3MocGFyZW50LCB4bWxFbnRpdHlNYXBwaW5ncyk7CisJfQorCQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBidWlsZFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVudGl0eU1hcHBpbmdzIHBhcmVudCwgWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocGFyZW50LCB4bWxFbnRpdHlNYXBwaW5ncyk7CisJfQorCQorCXB1YmxpYyBPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBidWlsZFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBhcmVudCwgWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocGFyZW50LCB4bWxFbnRpdHlNYXBwaW5ncyk7CisJfQorCisJcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlIGJ1aWxkT3JtUGVyc2lzdGVudFR5cGUoRW50aXR5TWFwcGluZ3MgcGFyZW50LCBYbWxUeXBlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtUGVyc2lzdGVudFR5cGUocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtRW50aXR5IGJ1aWxkT3JtRW50aXR5KE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sRW50aXR5IHJlc291cmNlTWFwcGluZykgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1FbnRpdHkocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtTWFwcGVkU3VwZXJjbGFzcyBidWlsZE9ybU1hcHBlZFN1cGVyY2xhc3MoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGluZykgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1NYXBwZWRTdXBlcmNsYXNzKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIE9ybUVtYmVkZGFibGUgYnVpbGRPcm1FbWJlZGRhYmxlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sRW1iZWRkYWJsZSByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtRW1iZWRkYWJsZShwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuT3duZXIgb3duZXIsIFhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUocGFyZW50LCBvd25lciwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIE9ybVRhYmxlIGJ1aWxkT3JtVGFibGUoT3JtRW50aXR5IHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1UYWJsZShwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgT3JtU2Vjb25kYXJ5VGFibGUgYnVpbGRPcm1TZWNvbmRhcnlUYWJsZShPcm1FbnRpdHkgcGFyZW50LCBYbWxTZWNvbmRhcnlUYWJsZSB4bWxTZWNvbmRhcnlUYWJsZSkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZShwYXJlbnQsIHhtbFNlY29uZGFyeVRhYmxlKTsKKwl9CisJCisJcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4oWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPcm1CYXNlSm9pbkNvbHVtbi5Pd25lciBvd25lciwgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcmVzb3VyY2VQa0pvaW5Db2x1bW4pIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4ocGFyZW50LCBvd25lciwgcmVzb3VyY2VQa0pvaW5Db2x1bW4pOworCX0KKwkKKwlwdWJsaWMgT3JtSm9pblRhYmxlIGJ1aWxkT3JtSm9pblRhYmxlKE9ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSBwYXJlbnQsIFhtbEpvaW5UYWJsZSByZXNvdXJjZUpvaW5UYWJsZSkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Kb2luVGFibGUocGFyZW50LCByZXNvdXJjZUpvaW5UYWJsZSk7CisJfQorCQorCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGJ1aWxkT3JtSm9pbkNvbHVtbihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIFhtbEpvaW5Db2x1bW4gcmVzb3VyY2VKb2luQ29sdW1uKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybUpvaW5Db2x1bW4ocGFyZW50LCBvd25lciwgcmVzb3VyY2VKb2luQ29sdW1uKTsKKwl9CisJCisJcHVibGljIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBvd25lciwgWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgcmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcihwYXJlbnQsIG93bmVyLCByZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKTsKKwl9CisJCisJcHVibGljIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKE9ybUVudGl0eSBwYXJlbnQsIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuT3duZXIgb3duZXIsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgcmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIocGFyZW50LCBvd25lciwgcmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKTsKKwl9CisJCisJcHVibGljIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKE9ybUVtYmVkZGVkTWFwcGluZzJfMCBwYXJlbnQsIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuT3duZXIgb3duZXIsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgcmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKSB7CisJCXJldHVybiBuZXcgTnVsbE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIocGFyZW50LCBvd25lcik7CisJfQorCQorCXB1YmxpYyBPcm1BdHRyaWJ1dGVPdmVycmlkZSBidWlsZE9ybUF0dHJpYnV0ZU92ZXJyaWRlKE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHBhcmVudCwgQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIgb3duZXIsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlIHhtbEF0dHJpYnV0ZU92ZXJyaWRlKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlKHBhcmVudCwgb3duZXIsIHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKKwl9CisJCisJcHVibGljIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlKE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgcGFyZW50LCBBc3NvY2lhdGlvbk92ZXJyaWRlLk93bmVyIG93bmVyLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZShwYXJlbnQsIG93bmVyLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwl9CisJCisJcHVibGljIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlKE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgcGFyZW50LCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShwYXJlbnQsIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCX0KKwkKKwlwdWJsaWMgT3JtRGlzY3JpbWluYXRvckNvbHVtbiBidWlsZE9ybURpc2NyaW1pbmF0b3JDb2x1bW4oT3JtRW50aXR5IHBhcmVudCwgT3JtRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lciBvd25lcikgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1EaXNjcmltaW5hdG9yQ29sdW1uKHBhcmVudCwgb3duZXIpOworCX0KKwkKKwlwdWJsaWMgT3JtQ2FzY2FkZSBidWlsZE9ybUNhc2NhZGUoT3JtUmVsYXRpb25zaGlwTWFwcGluZyBwYXJlbnQsIEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtQ2FzY2FkZShwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBPcm1Db2x1bW4gYnVpbGRPcm1Db2x1bW4oWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPcm1Db2x1bW4uT3duZXIgb3duZXIpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtQ29sdW1uKHBhcmVudCwgb3duZXIpOworCX0KKwkKKwlwdWJsaWMgT3JtR2VuZXJhdGVkVmFsdWUgYnVpbGRPcm1HZW5lcmF0ZWRWYWx1ZShYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbEdlbmVyYXRlZFZhbHVlIHJlc291cmNlR2VuZXJhdGVkVmFsdWUpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtR2VuZXJhdGVkVmFsdWUocGFyZW50LCByZXNvdXJjZUdlbmVyYXRlZFZhbHVlKTsKKwl9CisJCisJcHVibGljIE9ybUdlbmVyYXRvckNvbnRhaW5lciBidWlsZE9ybUdlbmVyYXRvckNvbnRhaW5lcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbEdlbmVyYXRvckNvbnRhaW5lciByZXNvdXJjZUdlbmVyYXRvckNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1HZW5lcmF0b3JDb250YWluZXIocGFyZW50LCByZXNvdXJjZUdlbmVyYXRvckNvbnRhaW5lcik7CisJfQorCQorCXB1YmxpYyBPcm1TZXF1ZW5jZUdlbmVyYXRvciBidWlsZE9ybVNlcXVlbmNlR2VuZXJhdG9yKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sU2VxdWVuY2VHZW5lcmF0b3IgcmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcikgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcihwYXJlbnQsIHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IpOworCX0KKwkKKwlwdWJsaWMgT3JtVGFibGVHZW5lcmF0b3IgYnVpbGRPcm1UYWJsZUdlbmVyYXRvcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbFRhYmxlR2VuZXJhdG9yIHJlc291cmNlVGFibGVHZW5lcmF0b3IpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVGFibGVHZW5lcmF0b3IocGFyZW50LCByZXNvdXJjZVRhYmxlR2VuZXJhdG9yKTsKKwl9CisJCisJcHVibGljIE9ybVF1ZXJ5Q29udGFpbmVyIGJ1aWxkT3JtUXVlcnlDb250YWluZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxRdWVyeUNvbnRhaW5lciByZXNvdXJjZVF1ZXJ5Q29udGFpbmVyKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybVF1ZXJ5Q29udGFpbmVyKHBhcmVudCwgcmVzb3VyY2VRdWVyeUNvbnRhaW5lcik7CisJfQorCQorCXB1YmxpYyBPcm1OYW1lZE5hdGl2ZVF1ZXJ5IGJ1aWxkT3JtTmFtZWROYXRpdmVRdWVyeShYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbE5hbWVkTmF0aXZlUXVlcnkgcmVzb3VyY2VOYW1lZE5hdGl2ZVF1ZXJ5KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybU5hbWVkTmF0aXZlUXVlcnkocGFyZW50LCByZXNvdXJjZU5hbWVkTmF0aXZlUXVlcnkpOworCX0KKwkKKwlwdWJsaWMgT3JtTmFtZWRRdWVyeSBidWlsZE9ybU5hbWVkUXVlcnkoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxOYW1lZFF1ZXJ5IHJlc291cmNlTmFtZWRRdWVyeSkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1OYW1lZFF1ZXJ5KHBhcmVudCwgcmVzb3VyY2VOYW1lZFF1ZXJ5KTsKKwl9CisJCisJcHVibGljIE9ybVF1ZXJ5SGludCBidWlsZE9ybVF1ZXJ5SGludChPcm1RdWVyeSBwYXJlbnQsIFhtbFF1ZXJ5SGludCByZXNvdXJjZVF1ZXJ5SGludCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1RdWVyeUhpbnQocGFyZW50LCByZXNvdXJjZVF1ZXJ5SGludCk7CisJfQorCQorCXB1YmxpYyBPcm1CYXNpY01hcHBpbmcgYnVpbGRPcm1CYXNpY01hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljIHJlc291cmNlTWFwcGluZykgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1CYXNpY01hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtRW1iZWRkZWRNYXBwaW5nIGJ1aWxkT3JtRW1iZWRkZWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxFbWJlZGRlZCByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIE9ybUVtYmVkZGVkSWRNYXBwaW5nIGJ1aWxkT3JtRW1iZWRkZWRJZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEVtYmVkZGVkSWQgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybUVtYmVkZGVkSWRNYXBwaW5nKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIE9ybUlkTWFwcGluZyBidWlsZE9ybUlkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sSWQgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybUlkTWFwcGluZyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBPcm1NYW55VG9NYW55TWFwcGluZyBidWlsZE9ybU1hbnlUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxNYW55VG9NYW55IHJlc291cmNlTWFwcGluZykgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBPcm1NYW55VG9PbmVNYXBwaW5nIGJ1aWxkT3JtTWFueVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZykgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIE9ybU9uZVRvTWFueU1hcHBpbmcgYnVpbGRPcm1PbmVUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxPbmVUb01hbnkgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybU9uZVRvTWFueU1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtT25lVG9PbmVNYXBwaW5nIGJ1aWxkT3JtT25lVG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtT25lVG9PbmVNYXBwaW5nKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIE9ybVRyYW5zaWVudE1hcHBpbmcgYnVpbGRPcm1UcmFuc2llbnRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxUcmFuc2llbnQgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybVRyYW5zaWVudE1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtVmVyc2lvbk1hcHBpbmcgYnVpbGRPcm1WZXJzaW9uTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sVmVyc2lvbiByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVmVyc2lvbk1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZE9ybU51bGxBdHRyaWJ1dGVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxOdWxsQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZFVuc3VwcG9ydGVkT3JtQXR0cmlidXRlTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVW5zdXBwb3J0ZWRPcm1BdHRyaWJ1dGVNYXBwaW5nKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIE9ybVVuaXF1ZUNvbnN0cmFpbnQgYnVpbGRPcm1VbmlxdWVDb25zdHJhaW50KFhtbENvbnRleHROb2RlIHBhcmVudCwgVW5pcXVlQ29uc3RyYWludC5Pd25lciBvd25lciwgWG1sVW5pcXVlQ29uc3RyYWludCByZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVW5pcXVlQ29uc3RyYWludChwYXJlbnQsIG93bmVyLCByZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnQpOworCX0KKwkKKwlwdWJsaWMgT3JtQ29udmVydGVyIGJ1aWxkT3JtRW51bWVyYXRlZENvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgWG1sQ29udmVydGlibGVNYXBwaW5nIHJlc291cmNlTWFwcGluZykgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1FbnVtZXJhdGVkQ29udmVydGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIE9ybUNvbnZlcnRlciBidWlsZE9ybUxvYkNvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgWG1sQ29udmVydGlibGVNYXBwaW5nIHJlc291cmNlTWFwcGluZykgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Mb2JDb252ZXJ0ZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtQ29udmVydGVyIGJ1aWxkT3JtVGVtcG9yYWxDb252ZXJ0ZXIoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIFhtbENvbnZlcnRpYmxlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVGVtcG9yYWxDb252ZXJ0ZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtQ29udmVydGVyIGJ1aWxkT3JtTnVsbENvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1OdWxsQ29udmVydGVyKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBPcm1EZXJpdmVkSWQyXzAgYnVpbGRPcm1EZXJpdmVkSWQoCisJCQlPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHBhcmVudCwgWG1sRGVyaXZlZElkXzJfMCByZXNvdXJjZSkgeworCQkKKwkJcmV0dXJuIG5ldyBOdWxsT3JtRGVyaXZlZElkMl8wKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBPcm1NYXBzSWQyXzAgYnVpbGRPcm1NYXBzSWQoCisJCQlPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHBhcmVudCwgWG1sTWFwc0lkXzJfMCByZXNvdXJjZSkgeworCQkKKwkJcmV0dXJuIG5ldyBOdWxsT3JtTWFwc0lkMl8wKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYnVpbGRPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoCisJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sRWxlbWVudENvbGxlY3Rpb24gcmVzb3VyY2VNYXBwaW5nKSB7CisJCQorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJcHVibGljIE9ybUNhY2hlYWJsZTJfMCBidWlsZE9ybUNhY2hlYWJsZShPcm1DYWNoZWFibGVIb2xkZXIyXzAgcGFyZW50LCBYbWxDYWNoZWFibGUyXzAgcmVzb3VyY2UpIHsKKwkJcmV0dXJuIG5ldyBOdWxsT3JtQ2FjaGVhYmxlMl8wKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBPcm1PcnBoYW5SZW1vdmFibGUyXzAgYnVpbGRPcm1PcnBoYW5SZW1vdmFsKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzAgcGFyZW50LCBYbWxPcnBoYW5SZW1vdmFibGUyXzAgcmVzb3VyY2UpIHsKKwkJcmV0dXJuIG5ldyBOdWxsT3JtT3JwaGFuUmVtb3ZhbDJfMChwYXJlbnQpOworCX0KKwkKKwkvLyAqKioqKioqKioqIE9STSBWaXJ0dWFsIFJlc291cmNlIE1vZGVsICoqKioqKioqKioKKworCXB1YmxpYyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGJ1aWxkVmlydHVhbFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoU3RyaW5nIG5hbWUsIE9ybVR5cGVNYXBwaW5nIHBhcmVudCwgSm9pbmluZ1N0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSkgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUsIHBhcmVudCwgam9pbmluZ1N0cmF0ZWd5KTsJCQorCX0KKwkKKwlwdWJsaWMgWG1sQmFzaWMgYnVpbGRWaXJ0dWFsWG1sQmFzaWMoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxCYXNpYyhvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljTWFwcGluZyk7CisJfQorCisJcHVibGljIFhtbEVtYmVkZGVkSWQgYnVpbGRWaXJ0dWFsWG1sRW1iZWRkZWRJZChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFFbWJlZGRlZElkTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxFbWJlZGRlZElkKG9ybVR5cGVNYXBwaW5nLCBqYXZhRW1iZWRkZWRJZE1hcHBpbmcpOworCX0KKworCXB1YmxpYyBYbWxFbWJlZGRlZCBidWlsZFZpcnR1YWxYbWxFbWJlZGRlZChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkTWFwcGluZyBqYXZhRW1iZWRkZWRNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbFhtbEVtYmVkZGVkKG9ybVR5cGVNYXBwaW5nLCBqYXZhRW1iZWRkZWRNYXBwaW5nKTsKKwl9CisKKwlwdWJsaWMgWG1sSWQgYnVpbGRWaXJ0dWFsWG1sSWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxJZChvcm1UeXBlTWFwcGluZywgamF2YUlkTWFwcGluZyk7CisJfQorCisJcHVibGljIFhtbE1hbnlUb01hbnkgYnVpbGRWaXJ0dWFsWG1sTWFueVRvTWFueShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxNYW55VG9NYW55KG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFueVRvTWFueU1hcHBpbmcpOworCX0KKworCXB1YmxpYyBYbWxNYW55VG9PbmUgYnVpbGRWaXJ0dWFsWG1sTWFueVRvT25lKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhTWFueVRvT25lTWFwcGluZyBqYXZhTWFueVRvT25lTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxNYW55VG9PbmUob3JtVHlwZU1hcHBpbmcsIGphdmFNYW55VG9PbmVNYXBwaW5nKTsKKwl9CisKKwlwdWJsaWMgWG1sT25lVG9NYW55IGJ1aWxkVmlydHVhbFhtbE9uZVRvTWFueShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsWG1sT25lVG9NYW55KG9ybVR5cGVNYXBwaW5nLCBqYXZhT25lVG9NYW55TWFwcGluZyk7CisJfQorCisJcHVibGljIFhtbE9uZVRvT25lIGJ1aWxkVmlydHVhbFhtbE9uZVRvT25lKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhT25lVG9PbmVNYXBwaW5nIGphdmFPbmVUb09uZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsWG1sT25lVG9PbmUob3JtVHlwZU1hcHBpbmcsIGphdmFPbmVUb09uZU1hcHBpbmcpOworCX0KKworCXB1YmxpYyBYbWxUcmFuc2llbnQgYnVpbGRWaXJ0dWFsWG1sVHJhbnNpZW50KE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhVHJhbnNpZW50TWFwcGluZyBqYXZhVHJhbnNpZW50TWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxUcmFuc2llbnQob3JtVHlwZU1hcHBpbmcsIGphdmFUcmFuc2llbnRNYXBwaW5nKTsKKwl9CisKKwlwdWJsaWMgWG1sVmVyc2lvbiBidWlsZFZpcnR1YWxYbWxWZXJzaW9uKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhVmVyc2lvbk1hcHBpbmcgamF2YVZlcnNpb25NYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbFhtbFZlcnNpb24ob3JtVHlwZU1hcHBpbmcsIGphdmFWZXJzaW9uTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBYbWxOdWxsQXR0cmlidXRlTWFwcGluZyBidWlsZFZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZyhPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcob3JtVHlwZU1hcHBpbmcsIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIFhtbEVsZW1lbnRDb2xsZWN0aW9uIGJ1aWxkVmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uMl8wKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFNYXBwaW5nKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVhtbERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVhtbERlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjdmMzhjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtWG1sRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbERlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uVW5zdXBwb3J0ZWRPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5TGlzdEl0ZXJhdG9yOworCisvKioKKyAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIGRlZmluaXRpb24gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZSBpdCBpcyBpbml0aWFsaXplZCkuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVhtbERlZmluaXRpb24KKwlpbXBsZW1lbnRzIE9ybVhtbERlZmluaXRpb24KK3sKKwlwcml2YXRlIE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIG9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbnM7CisJCisJcHJpdmF0ZSBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIG9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uczsKKwkKKwlwcml2YXRlIGZpbmFsIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5OworCQorCQorCS8qKgorCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1YbWxEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCQl0aGlzLmZhY3RvcnkgPSBidWlsZENvbnRleHROb2RlRmFjdG9yeSgpOworCX0KKwkKKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCk7CisJCisJcHVibGljIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBnZXRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7CisJCXJldHVybiB0aGlzLmZhY3Rvcnk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogT1JNIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgorCQorCXB1YmxpYyBPcm1UeXBlTWFwcGluZ0RlZmluaXRpb24gZ2V0T3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KSB7CisJCWZvciAoT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtVHlwZU1hcHBpbmdEZWZpbml0aW9ucygpKSkgeworCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKGRlZmluaXRpb24uZ2V0S2V5KCksIG1hcHBpbmdLZXkpKSB7CisJCQkJcmV0dXJuIGRlZmluaXRpb247CisJCQl9CisJCX0KKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCB0eXBlIG1hcHBpbmcga2V5OiAiICsgbWFwcGluZ0tleSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1UeXBlTWFwcGluZ0RlZmluaXRpb24+IG9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8T3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uPihnZXRPcm1UeXBlTWFwcGluZ0RlZmluaXRpb25zKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIGdldE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCWlmICh0aGlzLm9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMgPT0gbnVsbCkgeworCQkJdGhpcy5vcm1UeXBlTWFwcGluZ0RlZmluaXRpb25zID0gdGhpcy5idWlsZE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZ0RlZmluaXRpb25zOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgbWFwcGluZyBkZWZpbml0aW9ucyB0byB1c2UgZm9yIHR5cGVzIGluIG1hcHBpbmcgZmlsZXMgb2YgdGhpcyB0eXBlLiAgCisJICogVGhlIG9yZGVyIGlzIHVuaW1wb3J0YW50LgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBPcm1UeXBlTWFwcGluZ0RlZmluaXRpb25bXSBidWlsZE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKKwkKKwkKKwkvLyAqKioqKioqKioqIE9STSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgorCQorCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXRPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSkgeworCQlmb3IgKE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkpKSB7CisJCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwoZGVmaW5pdGlvbi5nZXRLZXkoKSwgbWFwcGluZ0tleSkpIHsKKwkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gVW5zdXBwb3J0ZWRPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpOworCX0KKwkKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBvcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+KGdldE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN5bmNocm9uaXplZCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGdldE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKKwkJaWYgKHRoaXMub3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zID09IG51bGwpIHsKKwkJCXRoaXMub3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zID0gdGhpcy5idWlsZE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpOworCQl9CisJCXJldHVybiB0aGlzLm9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uczsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIGFuIGFycmF5IG9mIG1hcHBpbmcgZGVmaW5pdGlvbnMgdG8gdXNlIGZvciBhdHRyaWJ1dGVzIGluIG1hcHBpbmcgZmlsZXMgb2YgdGhpcyB0eXBlLiAgCisJICogVGhlIG9yZGVyIGlzIHVuaW1wb3J0YW50LgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY0VudGl0eU1hcHBpbmdzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY0VudGl0eU1hcHBpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNzI5M2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNFbnRpdHlNYXBwaW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljRW50aXR5TWFwcGluZ3MgZXh0ZW5kcyBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgRW50aXR5TWFwcGluZ3MKLXsKLQlwcm90ZWN0ZWQgWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3M7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uOwotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhY2thZ2VfOwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTY2hlbWE7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDYXRhbG9nOwotCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZGVmYXVsdEFjY2VzczsKLQotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIHNwZWNpZmllZEFjY2VzczsKLQkJCi0JcHJvdGVjdGVkIGZpbmFsIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtUGVyc2lzdGVudFR5cGU+IHBlcnNpc3RlbnRUeXBlczsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybVNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvcnM7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtVGFibGVHZW5lcmF0b3I+IHRhYmxlR2VuZXJhdG9yczsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllczsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllczsKLQotCi0JcHVibGljIEdlbmVyaWNFbnRpdHlNYXBwaW5ncyhPcm1YbWwgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyB4bWxFbnRpdHlNYXBwaW5ncykgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEodGhpcywgeG1sRW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLnBlcnNpc3RlbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8T3JtUGVyc2lzdGVudFR5cGU+KCk7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JzID0gbmV3IEFycmF5TGlzdDxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4oKTsKLQkJdGhpcy50YWJsZUdlbmVyYXRvcnMgPSBuZXcgQXJyYXlMaXN0PE9ybVRhYmxlR2VuZXJhdG9yPigpOwotCQl0aGlzLm5hbWVkUXVlcmllcyA9IG5ldyBBcnJheUxpc3Q8T3JtTmFtZWRRdWVyeT4oKTsKLQkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMgPSBuZXcgQXJyYXlMaXN0PE9ybU5hbWVkTmF0aXZlUXVlcnk+KCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZSh4bWxFbnRpdHlNYXBwaW5ncyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBPcm1TdHJ1Y3R1cmVOb2Rlcy5FTlRJVFlfTUFQUElOR1NfSUQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1YbWwgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybVhtbCkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlmb3IgKE9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlcygpKSkgewotCQkJaWYgKG9ybVBlcnNpc3RlbnRUeXBlLmlzRm9yKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIG9ybVBlcnNpc3RlbnRUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gdGhpcy5wYWNrYWdlXzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGFja2FnZShTdHJpbmcgbmV3UGFja2FnZSkgewotCQlTdHJpbmcgb2xkUGFja2FnZSA9IHRoaXMucGFja2FnZV87Ci0JCXRoaXMucGFja2FnZV8gPSBuZXdQYWNrYWdlOwotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLnNldFBhY2thZ2UobmV3UGFja2FnZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUEFDS0FHRV9QUk9QRVJUWSwgb2xkUGFja2FnZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy52ZXJzaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3Muc2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24pOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFU0NSSVBUSU9OX1BST1BFUlRZLCBvbGREZXNjcmlwdGlvbiwgbmV3RGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NoZW1hKFN0cmluZyBuZXdEZWZhdWx0U2NoZW1hKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0U2NoZW1hID0gdGhpcy5kZWZhdWx0U2NoZW1hOwotCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBuZXdEZWZhdWx0U2NoZW1hOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0NIRU1BX1BST1BFUlRZLCBvbGREZWZhdWx0U2NoZW1hLCBuZXdEZWZhdWx0U2NoZW1hKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgbmV3U3BlY2lmaWVkU2NoZW1hKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRTY2hlbWEgPSB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBuZXdTcGVjaWZpZWRTY2hlbWE7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3Muc2V0U2NoZW1hKG5ld1NwZWNpZmllZFNjaGVtYSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2NoZW1hLCBuZXdTcGVjaWZpZWRTY2hlbWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkU2NoZW1hKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRTY2hlbWEoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdENhdGFsb2coU3RyaW5nIG5ld0RlZmF1bHRDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0Q2F0YWxvZyA9IHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JCXRoaXMuZGVmYXVsdENhdGFsb2cgPSBuZXdEZWZhdWx0Q2F0YWxvZzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZERlZmF1bHRDYXRhbG9nLCBuZXdEZWZhdWx0Q2F0YWxvZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENhdGFsb2coU3RyaW5nIG5ld1NwZWNpZmllZENhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZENhdGFsb2cgPSB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IG5ld1NwZWNpZmllZENhdGFsb2c7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3Muc2V0Q2F0YWxvZyhuZXdTcGVjaWZpZWRDYXRhbG9nKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ2F0YWxvZywgbmV3U3BlY2lmaWVkQ2F0YWxvZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpIDogdGhpcy5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JfQotCQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEFjY2VzcygpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0QWNjZXNzKCkgOiB0aGlzLmdldFNwZWNpZmllZEFjY2VzcygpOwotCX0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldERlZmF1bHRBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBY2Nlc3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEFjY2VzcyhBY2Nlc3NUeXBlIG5ld0RlZmF1bHRBY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGREZWZhdWx0QWNjZXNzID0gdGhpcy5kZWZhdWx0QWNjZXNzOwotCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSBuZXdEZWZhdWx0QWNjZXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUNDRVNTX1BST1BFUlRZLCBvbGREZWZhdWx0QWNjZXNzLCBuZXdEZWZhdWx0QWNjZXNzKTsKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRTcGVjaWZpZWRBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFjY2VzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdTcGVjaWZpZWRBY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGRTcGVjaWZpZWRBY2Nlc3MgPSB0aGlzLnNwZWNpZmllZEFjY2VzczsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3MgPSBuZXdTcGVjaWZpZWRBY2Nlc3M7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3Muc2V0QWNjZXNzKEFjY2Vzc1R5cGUudG9YbWxSZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZEFjY2VzcykpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BQ0NFU1NfUFJPUEVSVFksIG9sZFNwZWNpZmllZEFjY2VzcywgbmV3U3BlY2lmaWVkQWNjZXNzKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBvcm1QZXJzaXN0ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+KHRoaXMucGVyc2lzdGVudFR5cGVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBvcm1QZXJzaXN0ZW50VHlwZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW50VHlwZXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGUgYWRkT3JtUGVyc2lzdGVudFR5cGUoU3RyaW5nIG1hcHBpbmdLZXksIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50VHlwZSh0aGlzLCBtYXBwaW5nS2V5KTsKLQkJaW50IGluZGV4ID0gaW5zZXJ0aW9uSW5kZXgocGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnBlcnNpc3RlbnRUeXBlcy5hZGQoaW5kZXgsIHBlcnNpc3RlbnRUeXBlKTsKLQkJaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKGdldFBhY2thZ2UoKSArICIuIikpIHsKLQkJCS8vIGFkZHMgc2hvcnQgbmFtZSBpZiBwYWNrYWdlIG5hbWUgaXMgc3BlY2lmaWVkCi0JCQljbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGdldFBhY2thZ2UoKS5sZW5ndGgoKSArIDEpOwotCQl9Ci0JCUFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuYWRkVG9SZXNvdXJjZU1vZGVsKHRoaXMueG1sRW50aXR5TWFwcGluZ3MpOwotCQl0eXBlTWFwcGluZy5zZXRDbGFzc05hbWUoY2xhc3NOYW1lKTsKLQkJZmlyZUl0ZW1BZGRlZChQRVJTSVNURU5UX1RZUEVTX0xJU1QsIGluZGV4LCBwZXJzaXN0ZW50VHlwZSk7Ci0JCXJldHVybiBwZXJzaXN0ZW50VHlwZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtUGVyc2lzdGVudFR5cGUoT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUpIHsgCi0JCWFkZEl0ZW1Ub0xpc3Qob3JtUGVyc2lzdGVudFR5cGUsIHRoaXMucGVyc2lzdGVudFR5cGVzLCBQRVJTSVNURU5UX1RZUEVTX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgaW5zZXJ0aW9uSW5kZXgoT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKHRoaXMucGVyc2lzdGVudFR5cGVzLCBvcm1QZXJzaXN0ZW50VHlwZSwgYnVpbGRNYXBwaW5nQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IGJ1aWxkTWFwcGluZ0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT3JtUGVyc2lzdGVudFR5cGUgbzEsIE9ybVBlcnNpc3RlbnRUeXBlIG8yKSB7Ci0JCQkJaW50IG8xU2VxdWVuY2UgPSBvMS5nZXRNYXBwaW5nKCkuZ2V0WG1sU2VxdWVuY2UoKTsKLQkJCQlpbnQgbzJTZXF1ZW5jZSA9IG8yLmdldE1hcHBpbmcoKS5nZXRYbWxTZXF1ZW5jZSgpOwotCQkJCWlmIChvMVNlcXVlbmNlIDwgbzJTZXF1ZW5jZSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCWlmIChvMVNlcXVlbmNlID09IG8yU2VxdWVuY2UpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCXJldHVybiAxOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU9ybVBlcnNpc3RlbnRUeXBlKGludCBpbmRleCkgewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IHRoaXMucGVyc2lzdGVudFR5cGVzLmdldChpbmRleCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmRpc3Bvc2UoKTsKLQkJdGhpcy5wZXJzaXN0ZW50VHlwZXMucmVtb3ZlKGluZGV4KTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKHRoaXMueG1sRW50aXR5TWFwcGluZ3MpOwotCQlmaXJlSXRlbVJlbW92ZWQoUEVSU0lTVEVOVF9UWVBFU19MSVNULCBpbmRleCwgb3JtUGVyc2lzdGVudFR5cGUpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZU9ybVBlcnNpc3RlbnRUeXBlKE9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlKSB7Ci0JCXJlbW92ZU9ybVBlcnNpc3RlbnRUeXBlKHRoaXMucGVyc2lzdGVudFR5cGVzLmluZGV4T2Yob3JtUGVyc2lzdGVudFR5cGUpKTsJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU9ybVBlcnNpc3RlbnRUeXBlXyhPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSkgewotCQlvcm1QZXJzaXN0ZW50VHlwZS5kaXNwb3NlKCk7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChvcm1QZXJzaXN0ZW50VHlwZSwgdGhpcy5wZXJzaXN0ZW50VHlwZXMsIFBFUlNJU1RFTlRfVFlQRVNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2hhbmdlTWFwcGluZyhPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSwgT3JtVHlwZU1hcHBpbmcgb2xkTWFwcGluZywgT3JtVHlwZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQlvcm1QZXJzaXN0ZW50VHlwZS5kaXNwb3NlKCk7Ci0JCWludCBzb3VyY2VJbmRleCA9IHRoaXMucGVyc2lzdGVudFR5cGVzLmluZGV4T2Yob3JtUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnBlcnNpc3RlbnRUeXBlcy5yZW1vdmUoc291cmNlSW5kZXgpOwotCQlvbGRNYXBwaW5nLnJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKHRoaXMueG1sRW50aXR5TWFwcGluZ3MpOwotCQlpbnQgdGFyZ2V0SW5kZXggPSBpbnNlcnRpb25JbmRleChvcm1QZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMucGVyc2lzdGVudFR5cGVzLmFkZCh0YXJnZXRJbmRleCwgb3JtUGVyc2lzdGVudFR5cGUpOwotCQluZXdNYXBwaW5nLmFkZFRvUmVzb3VyY2VNb2RlbCh0aGlzLnhtbEVudGl0eU1hcHBpbmdzKTsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbShvbGRNYXBwaW5nKTsKLQkJLy9UT0RPIGFyZSB0aGUgc291cmNlIGFuZCB0YXJnZXQgY29ycmVjdCBpbiB0aGlzIGNhc2UsIG9yIGlzIHRhcmdldCBvZmYgYnkgb25lPz8/Ci0JCWZpcmVJdGVtTW92ZWQoUEVSU0lTVEVOVF9UWVBFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtU2VxdWVuY2VHZW5lcmF0b3I+KHRoaXMuc2VxdWVuY2VHZW5lcmF0b3JzKTsKLQl9Ci0JCi0JcHVibGljIGludCBzZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcnMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgT3JtU2VxdWVuY2VHZW5lcmF0b3IgYWRkU2VxdWVuY2VHZW5lcmF0b3IoaW50IGluZGV4KSB7Ci0JCU9ybVNlcXVlbmNlR2VuZXJhdG9yIG9ybVNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtU2VxdWVuY2VHZW5lcmF0b3IodGhpcyk7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JzLmFkZChpbmRleCwgb3JtU2VxdWVuY2VHZW5lcmF0b3IpOwotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCgpOwotCQlvcm1TZXF1ZW5jZUdlbmVyYXRvci5pbml0aWFsaXplKHNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5hZGQoaW5kZXgsIHNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJZmlyZUl0ZW1BZGRlZChTRVFVRU5DRV9HRU5FUkFUT1JTX0xJU1QsIGluZGV4LCBvcm1TZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCXJldHVybiBvcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXF1ZW5jZUdlbmVyYXRvcihpbnQgaW5kZXgsIE9ybVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHNlcXVlbmNlR2VuZXJhdG9yLCB0aGlzLnNlcXVlbmNlR2VuZXJhdG9ycywgRW50aXR5TWFwcGluZ3MuU0VRVUVOQ0VfR0VORVJBVE9SU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcihPcm1TZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcikgewotCQlyZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcih0aGlzLnNlcXVlbmNlR2VuZXJhdG9ycy5pbmRleE9mKHNlcXVlbmNlR2VuZXJhdG9yKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKGludCBpbmRleCkgewotCQlPcm1TZXF1ZW5jZUdlbmVyYXRvciByZW1vdmVkU2VxdWVuY2VHZW5lcmF0b3IgPSB0aGlzLnNlcXVlbmNlR2VuZXJhdG9ycy5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoU0VRVUVOQ0VfR0VORVJBVE9SU19MSVNULCBpbmRleCwgcmVtb3ZlZFNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcl8oT3JtU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KHNlcXVlbmNlR2VuZXJhdG9yLCB0aGlzLnNlcXVlbmNlR2VuZXJhdG9ycywgRW50aXR5TWFwcGluZ3MuU0VRVUVOQ0VfR0VORVJBVE9SU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zZXF1ZW5jZUdlbmVyYXRvcnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKEVudGl0eU1hcHBpbmdzLlNFUVVFTkNFX0dFTkVSQVRPUlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCi0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtVGFibGVHZW5lcmF0b3I+IHRhYmxlR2VuZXJhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1UYWJsZUdlbmVyYXRvcj4odGhpcy50YWJsZUdlbmVyYXRvcnMpOwotCX0KLQotCXB1YmxpYyBpbnQgdGFibGVHZW5lcmF0b3JzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGVHZW5lcmF0b3JzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE9ybVRhYmxlR2VuZXJhdG9yIGFkZFRhYmxlR2VuZXJhdG9yKGludCBpbmRleCkgewotCQlPcm1UYWJsZUdlbmVyYXRvciB4bWxUYWJsZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVRhYmxlR2VuZXJhdG9yKHRoaXMpOwotCQl0aGlzLnRhYmxlR2VuZXJhdG9ycy5hZGQoaW5kZXgsIHhtbFRhYmxlR2VuZXJhdG9yKTsKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvckltcGwoKTsKLQkJeG1sVGFibGVHZW5lcmF0b3IuaW5pdGlhbGl6ZSh0YWJsZUdlbmVyYXRvcik7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0VGFibGVHZW5lcmF0b3JzKCkuYWRkKGluZGV4LCB0YWJsZUdlbmVyYXRvcik7Ci0JCWZpcmVJdGVtQWRkZWQoVEFCTEVfR0VORVJBVE9SU19MSVNULCBpbmRleCwgeG1sVGFibGVHZW5lcmF0b3IpOwotCQlyZXR1cm4geG1sVGFibGVHZW5lcmF0b3I7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRhYmxlR2VuZXJhdG9yKGludCBpbmRleCwgT3JtVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgdGFibGVHZW5lcmF0b3IsIHRoaXMudGFibGVHZW5lcmF0b3JzLCBFbnRpdHlNYXBwaW5ncy5UQUJMRV9HRU5FUkFUT1JTX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVRhYmxlR2VuZXJhdG9yKE9ybVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCXJlbW92ZVRhYmxlR2VuZXJhdG9yKHRoaXMudGFibGVHZW5lcmF0b3JzLmluZGV4T2YodGFibGVHZW5lcmF0b3IpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUYWJsZUdlbmVyYXRvcihpbnQgaW5kZXgpIHsKLQkJT3JtVGFibGVHZW5lcmF0b3IgcmVtb3ZlZFRhYmxlR2VuZXJhdG9yID0gdGhpcy50YWJsZUdlbmVyYXRvcnMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRUYWJsZUdlbmVyYXRvcnMoKS5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoVEFCTEVfR0VORVJBVE9SU19MSVNULCBpbmRleCwgcmVtb3ZlZFRhYmxlR2VuZXJhdG9yKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVGFibGVHZW5lcmF0b3JfKE9ybVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdCh0YWJsZUdlbmVyYXRvciwgdGhpcy50YWJsZUdlbmVyYXRvcnMsIEVudGl0eU1hcHBpbmdzLlRBQkxFX0dFTkVSQVRPUlNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVRhYmxlR2VuZXJhdG9yKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMudGFibGVHZW5lcmF0b3JzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFRhYmxlR2VuZXJhdG9ycygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChFbnRpdHlNYXBwaW5ncy5UQUJMRV9HRU5FUkFUT1JTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+KHRoaXMubmFtZWRRdWVyaWVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBuYW1lZFF1ZXJpZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lZFF1ZXJpZXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgT3JtTmFtZWRRdWVyeSBhZGROYW1lZFF1ZXJ5KGludCBpbmRleCkgewotCQlPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1OYW1lZFF1ZXJ5KHRoaXMpOwotCQl0aGlzLm5hbWVkUXVlcmllcy5hZGQoaW5kZXgsIG5hbWVkUXVlcnkpOwotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldE5hbWVkUXVlcmllcygpLmFkZChpbmRleCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKFF1ZXJ5SG9sZGVyLk5BTUVEX1FVRVJJRVNfTElTVCwgaW5kZXgsIG5hbWVkUXVlcnkpOwotCQlyZXR1cm4gbmFtZWRRdWVyeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZWRRdWVyeShpbnQgaW5kZXgsIE9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBuYW1lZFF1ZXJ5LCB0aGlzLm5hbWVkUXVlcmllcywgUXVlcnlIb2xkZXIuTkFNRURfUVVFUklFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTmFtZWRRdWVyeShOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkpIHsKLQkJdGhpcy5yZW1vdmVOYW1lZFF1ZXJ5KHRoaXMubmFtZWRRdWVyaWVzLmluZGV4T2YobmFtZWRRdWVyeSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkUXVlcnkoaW50IGluZGV4KSB7Ci0JCU9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IHRoaXMubmFtZWRRdWVyaWVzLnJlbW92ZShpbmRleCk7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0TmFtZWRRdWVyaWVzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFF1ZXJ5SG9sZGVyLk5BTUVEX1FVRVJJRVNfTElTVCwgaW5kZXgsIG5hbWVkUXVlcnkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5hbWVkUXVlcnlfKE9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QobmFtZWRRdWVyeSwgdGhpcy5uYW1lZFF1ZXJpZXMsIFF1ZXJ5SG9sZGVyLk5BTUVEX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVOYW1lZFF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0TmFtZWRRdWVyaWVzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQltb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMubmFtZWRRdWVyaWVzLCBRdWVyeUhvbGRlci5OQU1FRF9RVUVSSUVTX0xJU1QpOwkJCi0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+KHRoaXMubmFtZWROYXRpdmVRdWVyaWVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBuYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgT3JtTmFtZWROYXRpdmVRdWVyeSBhZGROYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCkgewotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1OYW1lZE5hdGl2ZVF1ZXJ5KHRoaXMpOwotCQl0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5hZGQoaW5kZXgsIG5hbWVkTmF0aXZlUXVlcnkpOwotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZChpbmRleCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWROYXRpdmVRdWVyeSgpKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKFF1ZXJ5SG9sZGVyLk5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QsIGluZGV4LCBuYW1lZE5hdGl2ZVF1ZXJ5KTsKLQkJcmV0dXJuIG5hbWVkTmF0aXZlUXVlcnk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4LCBPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgbmFtZWROYXRpdmVRdWVyeSwgdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMsIFF1ZXJ5SG9sZGVyLk5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSkgewotCQlyZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLmluZGV4T2YobmFtZWROYXRpdmVRdWVyeSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4KSB7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLnJlbW92ZShpbmRleCk7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFF1ZXJ5SG9sZGVyLk5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QsIGluZGV4LCBuYW1lZE5hdGl2ZVF1ZXJ5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5XyhPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KG5hbWVkTmF0aXZlUXVlcnksIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLCBRdWVyeUhvbGRlci5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZU5hbWVkTmF0aXZlUXVlcnkoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCW1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMsIFF1ZXJ5SG9sZGVyLk5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QpOwkJCi0JfQotCi0JLy9UT0RPIHdoYXQgYWJvdXQgcXVhbGlmaWVkIG5hbWU/ICBwYWNrYWdlICsgY2xhc3MKLQkvL3RoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBib3RoIGZvciBjbGFzc05hbWUgYW5kIHBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKS4KLQkvL21vdmluZyBvbiBmb3Igbm93IHNpbmNlIEkgYW0ganVzdCB0cnlpbmcgdG8gZ2V0IHRoZSB1aSBjb21waWxlZCEgIGp1c3QgYSB3YXJuaW5nIHRoYXQgdGhpcyBpc24ndCBnb29kIGFwaQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUGVyc2lzdGVudFR5cGUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlmb3IgKE9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlcygpKSkgewotCQkJaWYgKHBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB7Ci0JCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncyA9IGVudGl0eU1hcHBpbmdzOwotCQl0aGlzLnZlcnNpb24gPSBlbnRpdHlNYXBwaW5ncy5nZXRWZXJzaW9uKCk7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBlbnRpdHlNYXBwaW5ncy5nZXREZXNjcmlwdGlvbigpOwotCQl0aGlzLnBhY2thZ2VfID0gZW50aXR5TWFwcGluZ3MuZ2V0UGFja2FnZSgpOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IGVudGl0eU1hcHBpbmdzLmdldFNjaGVtYSgpOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBlbnRpdHlNYXBwaW5ncy5nZXRDYXRhbG9nKCk7Ci0JCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gdGhpcy5zcGVjaWZpZWRBY2Nlc3MoZW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0QWNjZXNzKCk7Ci0JCXRoaXMuZGVmYXVsdENhdGFsb2cgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwotCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVBlcnNpc3RlbnRUeXBlcyhlbnRpdHlNYXBwaW5ncyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVRhYmxlR2VuZXJhdG9ycyhlbnRpdHlNYXBwaW5ncyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9ycyhlbnRpdHlNYXBwaW5ncyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZU5hbWVkUXVlcmllcyhlbnRpdHlNYXBwaW5ncyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZU5hbWVkTmF0aXZlUXVlcmllcyhlbnRpdHlNYXBwaW5ncyk7Ci0JCXRoaXMudXBkYXRlUGVyc2lzdGVuY2VVbml0R2VuZXJhdG9yc0FuZFF1ZXJpZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVBlcnNpc3RlbnRUeXBlcyhYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQl0aGlzLmluaXRpYWxpemVNYXBwZWRTdXBlcmNsYXNzZXMoZW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLmluaXRpYWxpemVFbnRpdGllcyhlbnRpdHlNYXBwaW5ncyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVtYmVkZGFibGVzKGVudGl0eU1hcHBpbmdzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hcHBlZFN1cGVyY2xhc3NlcyhYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQlmb3IgKFhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA6IGVudGl0eU1hcHBpbmdzLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpKSB7Ci0JCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRUeXBlKHRoaXMsIE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpOwotCQkJb3JtUGVyc2lzdGVudFR5cGUuaW5pdGlhbGl6ZShtYXBwZWRTdXBlcmNsYXNzKTsKLQkJCXRoaXMucGVyc2lzdGVudFR5cGVzLmFkZChvcm1QZXJzaXN0ZW50VHlwZSk7Ci0JCX0JCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbnRpdGllcyhYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQlmb3IgKFhtbEVudGl0eSBlbnRpdHkgOiBlbnRpdHlNYXBwaW5ncy5nZXRFbnRpdGllcygpKSB7Ci0JCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRUeXBlKHRoaXMsIE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmluaXRpYWxpemUoZW50aXR5KTsKLQkJCXRoaXMucGVyc2lzdGVudFR5cGVzLmFkZChvcm1QZXJzaXN0ZW50VHlwZSk7Ci0JCX0JCQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRhYmxlcyhYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQlmb3IgKFhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZSA6IGVudGl0eU1hcHBpbmdzLmdldEVtYmVkZGFibGVzKCkpIHsKLQkJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudFR5cGUodGhpcywgTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmluaXRpYWxpemUoZW1iZWRkYWJsZSk7Ci0JCQl0aGlzLnBlcnNpc3RlbnRUeXBlcy5hZGQob3JtUGVyc2lzdGVudFR5cGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUYWJsZUdlbmVyYXRvcnMoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJZm9yIChYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA6IGVudGl0eU1hcHBpbmdzLmdldFRhYmxlR2VuZXJhdG9ycygpKSB7Ci0JCQl0aGlzLnRhYmxlR2VuZXJhdG9ycy5hZGQoYnVpbGRUYWJsZUdlbmVyYXRvcih0YWJsZUdlbmVyYXRvcikpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvcnMoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJZm9yIChYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA6IGVudGl0eU1hcHBpbmdzLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpKSB7Ci0JCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9ycy5hZGQoYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihzZXF1ZW5jZUdlbmVyYXRvcikpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVOYW1lZFF1ZXJpZXMoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJZm9yIChYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgOiBlbnRpdHlNYXBwaW5ncy5nZXROYW1lZFF1ZXJpZXMoKSkgewotCQkJdGhpcy5uYW1lZFF1ZXJpZXMuYWRkKGJ1aWxkTmFtZWRRdWVyeShuYW1lZFF1ZXJ5KSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU5hbWVkTmF0aXZlUXVlcmllcyhYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQlmb3IgKFhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA6IGVudGl0eU1hcHBpbmdzLmdldE5hbWVkTmF0aXZlUXVlcmllcygpKSB7Ci0JCQl0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5hZGQoYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5KG5hbWVkTmF0aXZlUXVlcnkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzID0gZW50aXR5TWFwcGluZ3M7Ci0JCWdldEpwYUZpbGUoZW50aXR5TWFwcGluZ3MuZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZU1vZGVsKCkpLmFkZFJvb3RTdHJ1Y3R1cmVOb2RlKHRoaXMuZ2V0TWFwcGluZ0ZpbGVOYW1lKCksIHRoaXMpOwotCQl0aGlzLnNldERlc2NyaXB0aW9uKGVudGl0eU1hcHBpbmdzLmdldERlc2NyaXB0aW9uKCkpOwotCQl0aGlzLnNldFBhY2thZ2UoZW50aXR5TWFwcGluZ3MuZ2V0UGFja2FnZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTY2hlbWEoZW50aXR5TWFwcGluZ3MuZ2V0U2NoZW1hKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZENhdGFsb2coZW50aXR5TWFwcGluZ3MuZ2V0Q2F0YWxvZygpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBY2Nlc3ModGhpcy5zcGVjaWZpZWRBY2Nlc3MoZW50aXR5TWFwcGluZ3MpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS51cGRhdGUoZW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLnNldERlZmF1bHRBY2Nlc3MoZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJdGhpcy5zZXREZWZhdWx0Q2F0YWxvZyhnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJdGhpcy5zZXREZWZhdWx0U2NoZW1hKGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCXRoaXMudXBkYXRlUGVyc2lzdGVudFR5cGVzKGVudGl0eU1hcHBpbmdzKTsKLQkJdGhpcy51cGRhdGVUYWJsZUdlbmVyYXRvcnMoZW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLnVwZGF0ZVNlcXVlbmNlR2VuZXJhdG9ycyhlbnRpdHlNYXBwaW5ncyk7Ci0JCXRoaXMudXBkYXRlTmFtZWRRdWVyaWVzKGVudGl0eU1hcHBpbmdzKTsKLQkJdGhpcy51cGRhdGVOYW1lZE5hdGl2ZVF1ZXJpZXMoZW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlVW5pdEdlbmVyYXRvcnNBbmRRdWVyaWVzKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFwcGluZ0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0RmlsZU5hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgc3BlY2lmaWVkQWNjZXNzKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCXJldHVybiBBY2Nlc3NUeXBlLmZyb21YbWxSZXNvdXJjZU1vZGVsKGVudGl0eU1hcHBpbmdzLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGVyc2lzdGVudFR5cGVzKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gb3JtUGVyc2lzdGVudFR5cGVzID0gdGhpcy5vcm1QZXJzaXN0ZW50VHlwZXMoKTsKLQkJdGhpcy51cGRhdGVNYXBwZWRTdXBlcmNsYXNzZXMoZW50aXR5TWFwcGluZ3MsIG9ybVBlcnNpc3RlbnRUeXBlcyk7Ci0JCXRoaXMudXBkYXRlRW50aXRpZXMoZW50aXR5TWFwcGluZ3MsIG9ybVBlcnNpc3RlbnRUeXBlcyk7Ci0JCXRoaXMudXBkYXRlRW1iZWRkYWJsZXMoZW50aXR5TWFwcGluZ3MsIG9ybVBlcnNpc3RlbnRUeXBlcyk7Ci0JCQotCQl3aGlsZSAob3JtUGVyc2lzdGVudFR5cGVzLmhhc05leHQoKSkgewotCQkJdGhpcy5yZW1vdmVPcm1QZXJzaXN0ZW50VHlwZV8ob3JtUGVyc2lzdGVudFR5cGVzLm5leHQoKSk7Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNYXBwZWRTdXBlcmNsYXNzZXMoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MsIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gb3JtUGVyc2lzdGVudFR5cGVzKSB7Ci0JCUxpc3RJdGVyYXRvcjxYbWxNYXBwZWRTdXBlcmNsYXNzPiBtYXBwZWRTdXBlcmNsYXNzZXMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sTWFwcGVkU3VwZXJjbGFzcz4oZW50aXR5TWFwcGluZ3MuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQlmb3IgKFhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA6ICBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUobWFwcGVkU3VwZXJjbGFzc2VzKSkgewotCQkJaWYgKG9ybVBlcnNpc3RlbnRUeXBlcy5oYXNOZXh0KCkpIHsKLQkJCQlvcm1QZXJzaXN0ZW50VHlwZXMubmV4dCgpLnVwZGF0ZShtYXBwZWRTdXBlcmNsYXNzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudFR5cGUodGhpcywgTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQkJb3JtUGVyc2lzdGVudFR5cGUuaW5pdGlhbGl6ZShtYXBwZWRTdXBlcmNsYXNzKTsKLQkJCQlhZGRPcm1QZXJzaXN0ZW50VHlwZShvcm1QZXJzaXN0ZW50VHlwZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRW50aXRpZXMoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MsIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gb3JtUGVyc2lzdGVudFR5cGVzKSB7Ci0JCUxpc3RJdGVyYXRvcjxYbWxFbnRpdHk+IGVudGl0aWVzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbEVudGl0eT4oZW50aXR5TWFwcGluZ3MuZ2V0RW50aXRpZXMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCWZvciAoWG1sRW50aXR5IGVudGl0eSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbnRpdGllcykpIHsKLQkJCWlmIChvcm1QZXJzaXN0ZW50VHlwZXMuaGFzTmV4dCgpKSB7Ci0JCQkJb3JtUGVyc2lzdGVudFR5cGVzLm5leHQoKS51cGRhdGUoZW50aXR5KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudFR5cGUodGhpcywgTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQkJCW9ybVBlcnNpc3RlbnRUeXBlLmluaXRpYWxpemUoZW50aXR5KTsKLQkJCQlhZGRPcm1QZXJzaXN0ZW50VHlwZShvcm1QZXJzaXN0ZW50VHlwZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRW1iZWRkYWJsZXMoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MsIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gb3JtUGVyc2lzdGVudFR5cGVzKSB7Ci0JCUxpc3RJdGVyYXRvcjxYbWxFbWJlZGRhYmxlPiBlbWJlZGRhYmxlcyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxFbWJlZGRhYmxlPihlbnRpdHlNYXBwaW5ncy5nZXRFbWJlZGRhYmxlcygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJZm9yIChYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoZW1iZWRkYWJsZXMpKSB7Ci0JCQlpZiAob3JtUGVyc2lzdGVudFR5cGVzLmhhc05leHQoKSkgewotCQkJCW9ybVBlcnNpc3RlbnRUeXBlcy5uZXh0KCkudXBkYXRlKGVtYmVkZGFibGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50VHlwZSh0aGlzLCBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQkJCW9ybVBlcnNpc3RlbnRUeXBlLmluaXRpYWxpemUoZW1iZWRkYWJsZSk7Ci0JCQkJYWRkT3JtUGVyc2lzdGVudFR5cGUob3JtUGVyc2lzdGVudFR5cGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRhYmxlR2VuZXJhdG9ycyhYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQlMaXN0SXRlcmF0b3I8T3JtVGFibGVHZW5lcmF0b3I+IHRhYmxlR2VuZXJhdG9ycyA9IHRhYmxlR2VuZXJhdG9ycygpOwotCQlMaXN0SXRlcmF0b3I8WG1sVGFibGVHZW5lcmF0b3I+IHJlc291cmNlVGFibGVHZW5lcmF0b3JzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbFRhYmxlR2VuZXJhdG9yPihlbnRpdHlNYXBwaW5ncy5nZXRUYWJsZUdlbmVyYXRvcnMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCXdoaWxlICh0YWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IHRhYmxlR2VuZXJhdG9ycy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VUYWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKSB7Ci0JCQkJdGFibGVHZW5lcmF0b3IudXBkYXRlKHJlc291cmNlVGFibGVHZW5lcmF0b3JzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVUYWJsZUdlbmVyYXRvcl8odGFibGVHZW5lcmF0b3IpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VUYWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRUYWJsZUdlbmVyYXRvcih0YWJsZUdlbmVyYXRvcnNTaXplKCksIGJ1aWxkVGFibGVHZW5lcmF0b3IocmVzb3VyY2VUYWJsZUdlbmVyYXRvcnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVGFibGVHZW5lcmF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlKSB7Ci0JCU9ybVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtVGFibGVHZW5lcmF0b3IodGhpcyk7Ci0JCXRhYmxlR2VuZXJhdG9yLmluaXRpYWxpemUodGFibGVHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZXF1ZW5jZUdlbmVyYXRvcnMoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybVNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvcnMgPSBzZXF1ZW5jZUdlbmVyYXRvcnMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbFNlcXVlbmNlR2VuZXJhdG9yPiByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9ycyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxTZXF1ZW5jZUdlbmVyYXRvcj4oZW50aXR5TWFwcGluZ3MuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQl3aGlsZSAoc2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSkgewotCQkJT3JtU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSkgewotCQkJCXNlcXVlbmNlR2VuZXJhdG9yLnVwZGF0ZShyZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3JfKHNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSkgewotCQkJYWRkU2VxdWVuY2VHZW5lcmF0b3Ioc2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpLCBidWlsZFNlcXVlbmNlR2VuZXJhdG9yKHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSkgewotCQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVNlcXVlbmNlR2VuZXJhdG9yKHRoaXMpOwotCQlzZXF1ZW5jZUdlbmVyYXRvci5pbml0aWFsaXplKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3I7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU5hbWVkUXVlcmllcyhYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gbmFtZWRRdWVyaWVzKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxOYW1lZFF1ZXJ5PiByZXNvdXJjZU5hbWVkUXVlcmllcyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxOYW1lZFF1ZXJ5PihlbnRpdHlNYXBwaW5ncy5nZXROYW1lZFF1ZXJpZXMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCQotCQl3aGlsZSAobmFtZWRRdWVyaWVzLmhhc05leHQoKSkgewotCQkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gbmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZU5hbWVkUXVlcmllcy5oYXNOZXh0KCkpIHsKLQkJCQluYW1lZFF1ZXJ5LnVwZGF0ZShyZXNvdXJjZU5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlTmFtZWRRdWVyeV8obmFtZWRRdWVyeSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZU5hbWVkUXVlcmllcy5oYXNOZXh0KCkpIHsKLQkJCWFkZE5hbWVkUXVlcnkobmFtZWRRdWVyaWVzU2l6ZSgpLCBidWlsZE5hbWVkUXVlcnkocmVzb3VyY2VOYW1lZFF1ZXJpZXMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtTmFtZWRRdWVyeSBidWlsZE5hbWVkUXVlcnkoWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5KSB7Ci0JCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybU5hbWVkUXVlcnkodGhpcyk7Ci0JCW9ybU5hbWVkUXVlcnkuaW5pdGlhbGl6ZShuYW1lZFF1ZXJ5KTsKLQkJcmV0dXJuIG9ybU5hbWVkUXVlcnk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTmFtZWROYXRpdmVRdWVyaWVzKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMgPSBuYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbE5hbWVkTmF0aXZlUXVlcnk+IHJlc291cmNlTmFtZWROYXRpdmVRdWVyaWVzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbE5hbWVkTmF0aXZlUXVlcnk+KGVudGl0eU1hcHBpbmdzLmdldE5hbWVkTmF0aXZlUXVlcmllcygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJCi0JCXdoaWxlIChuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkUXVlcnkgPSBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlTmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSkgewotCQkJCW5hbWVkUXVlcnkudXBkYXRlKHJlc291cmNlTmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5XyhuYW1lZFF1ZXJ5KTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlTmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSkgewotCQkJYWRkTmFtZWROYXRpdmVRdWVyeShuYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCksIGJ1aWxkTmFtZWROYXRpdmVRdWVyeShyZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1OYW1lZE5hdGl2ZVF1ZXJ5IGJ1aWxkTmFtZWROYXRpdmVRdWVyeShYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkUXVlcnkpIHsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID1nZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1OYW1lZE5hdGl2ZVF1ZXJ5KHRoaXMpOwotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmluaXRpYWxpemUobmFtZWRRdWVyeSk7Ci0JCXJldHVybiBvcm1OYW1lZE5hdGl2ZVF1ZXJ5OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQZXJzaXN0ZW5jZVVuaXRHZW5lcmF0b3JzQW5kUXVlcmllcygpIHsKLQkJZm9yIChHZW5lcmF0b3IgZ2VuZXJhdG9yIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRhYmxlR2VuZXJhdG9ycygpKSkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkR2VuZXJhdG9yKGdlbmVyYXRvcik7Ci0JCX0KLQkJCi0JCWZvciAoR2VuZXJhdG9yIGdlbmVyYXRvciA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzZXF1ZW5jZUdlbmVyYXRvcnMoKSkpIHsKLQkJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZEdlbmVyYXRvcihnZW5lcmF0b3IpOwotCQl9Ci0JCQotCQlmb3IgKFF1ZXJ5IHF1ZXJ5IDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG5hbWVkUXVlcmllcygpKSkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkUXVlcnkocXVlcnkpOwotCQl9Ci0JCQotCQlmb3IgKFF1ZXJ5IHF1ZXJ5IDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG5hbWVkTmF0aXZlUXVlcmllcygpKSkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkUXVlcnkocXVlcnkpOwotCQl9Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKLQkJZm9yIChPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlcygpKSkgewotCQkJaWYgKHBlcnNpc3RlbnRUeXBlLmNvbnRhaW5zKHRleHRPZmZzZXQpKSB7Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbnRUeXBlLmdldFN0cnVjdHVyZU5vZGUodGV4dE9mZnNldCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KSB7Ci0JCWlmICh0aGlzLnhtbEVudGl0eU1hcHBpbmdzID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQl0cnkgewotCQkJYWRkR2VuZXJhdG9yTWVzc2FnZXMobWVzc2FnZXMpOwotCQkJYWRkUXVlcnlNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCUpwdENvcmVQbHVnaW4ubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJZm9yIChPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLm9ybVBlcnNpc3RlbnRUeXBlcygpKSkgewotCQkJdHJ5IHsKLQkJCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQlKcHRDb3JlUGx1Z2luLmxvZyhleGNlcHRpb24pOwkJCQotCQkJfQotCQl9Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCB2b2lkIGFkZEdlbmVyYXRvck1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCUxpc3Q8R2VuZXJhdG9yPiBtYXN0ZXJMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8T3JtR2VuZXJhdG9yPiBzdHJlYW0gPSBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8T3JtR2VuZXJhdG9yPih0aGlzLnRhYmxlR2VuZXJhdG9ycygpLCB0aGlzLnNlcXVlbmNlR2VuZXJhdG9ycygpKTsgc3RyZWFtLmhhc05leHQoKSA7ICkgewotCQkJT3JtR2VuZXJhdG9yIGN1cnJlbnQgPSBzdHJlYW0ubmV4dCgpOwotCQkJbWFzdGVyTGlzdC5yZW1vdmUoY3VycmVudCk7Ci0JCQkKLQkJCWZvciAoR2VuZXJhdG9yIGVhY2ggOiBtYXN0ZXJMaXN0KSB7Ci0JCQkJaWYgKCEgZWFjaC5vdmVycmlkZXMoY3VycmVudCkgJiYgZWFjaC5nZXROYW1lKCkgIT0gbnVsbCAmJiBlYWNoLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkdFTkVSQVRPUl9EVVBMSUNBVEVfTkFNRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge2N1cnJlbnQuZ2V0TmFtZSgpfSwKLQkJCQkJCQljdXJyZW50LAotCQkJCQkJCWN1cnJlbnQuZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJCQkpOwotCQkJCX0KLQkJCX0KLQkJCW1hc3Rlckxpc3QuYWRkKGN1cnJlbnQpOwotCQl9Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCB2b2lkIGFkZFF1ZXJ5TWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJTGlzdDxRdWVyeT4gbWFzdGVyTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KGdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPE9ybVF1ZXJ5PiBzdHJlYW0gPSBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8T3JtUXVlcnk+KHRoaXMubmFtZWRRdWVyaWVzKCksIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzKCkpOyBzdHJlYW0uaGFzTmV4dCgpIDsgKSB7Ci0JCQlPcm1RdWVyeSBjdXJyZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJCW1hc3Rlckxpc3QucmVtb3ZlKGN1cnJlbnQpOwotCQkJCi0JCQlmb3IgKFF1ZXJ5IGVhY2ggOiBtYXN0ZXJMaXN0KSB7Ci0JCQkJaWYgKCEgZWFjaC5vdmVycmlkZXMoY3VycmVudCkgJiYgZWFjaC5nZXROYW1lKCkgIT0gbnVsbCAmJiBlYWNoLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlFVRVJZX0RVUExJQ0FURV9OQU1FLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7Y3VycmVudC5nZXROYW1lKCl9LAotCQkJCQkJCWN1cnJlbnQsCi0JCQkJCQkJY3VycmVudC5nZXROYW1lVGV4dFJhbmdlKCkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJfQotCQkJbWFzdGVyTGlzdC5hZGQoY3VycmVudCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkvL3RoZSByZXNvdXJjZSBpcyBudWxsIGlmIHRoZSBvcm0ueG1sIGZpbGUgd2FzIGRlbGV0ZWQKLQkJCS8vcm9vdFN0cnVjdHVyZU5vZGVzIGFyZSBjbGVhcmVkIGluIHRoZSBkaXNwb3NlIG9mIEpwYUZpbGUKLQkJCUpwYUZpbGUganBhRmlsZSA9IGdldEpwYUZpbGUodGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRSZXNvdXJjZSgpLmdldFJlc291cmNlTW9kZWwoKSk7Ci0JCQotCQkJaWYgKGpwYUZpbGUgIT0gbnVsbCkgewotCQkJCS8veWVzLCB0aGlzIGNhbiBhbHNvIGJlIG51bGwsIHNlZW1zIHRoYXQgc29tZXRpbWVzIHRoZSByZXNvdXJjZSBpcyBudWxsIGFuZAotCQkJCS8vc29tZXRoaW5nIGl0IGlzIG5vdCB5ZXQgbnVsbCwgYnV0IHdlIHdpbGwgaGF2ZSBubyBqcGFGaWxlIGZvciBpdCBhZnRlciBhIGRlbGV0ZS4KLQkJCQlqcGFGaWxlLnJlbW92ZVJvb3RTdHJ1Y3R1cmVOb2RlKGdldE1hcHBpbmdGaWxlTmFtZSgpKTsKLQkJCX0KLQkJfQotCQkvL3N0aWxsIG5lZWQgdG8gZGlzcG9zZSB0aGVzZSBldmVuIGluIHRoZSBjYXNlIG9mIGEgZmlsZSBiZWluZyBkZWxldGVkLiAgCi0JCS8vSnBhRmlsZS5kaXNwb3NlKCkganVzdCByZW1vdmVzIHRoZSByb290IHN0cnVjdHVyZSBub2RlcyBmb3IgdGhpcyBmaWxlLCBub3Qgb3RoZXIgZmlsZXMgKGphdmEgZmlsZXMpCi0JCWZvciAoT3JtUGVyc2lzdGVudFR5cGUgIG9ybVBlcnNpc3RlbnRUeXBlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlcygpKSkgewotCQkJb3JtUGVyc2lzdGVudFR5cGUuZGlzcG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmMjk5OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGUgZXh0ZW5kcyBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlCi17Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1Kb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1uczsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybUpvaW5Db2x1bW4+IGRlZmF1bHRKb2luQ29sdW1uczsKLQotCXByaXZhdGUgZmluYWwgQXNzb2NpYXRpb25PdmVycmlkZS5Pd25lciBvd25lcjsKLQotCXByb3RlY3RlZCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGU7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZShPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEFzc29jaWF0aW9uT3ZlcnJpZGUuT3duZXIgb3duZXIsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE9ybUpvaW5Db2x1bW4+KCk7Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxPcm1Kb2luQ29sdW1uPigpOwotCQl0aGlzLmluaXRpYWxpemUoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JfQotCQotCXB1YmxpYyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIHNldFZpcnR1YWwoYm9vbGVhbiB2aXJ0dWFsKSB7Ci0JCXJldHVybiAoT3JtQXNzb2NpYXRpb25PdmVycmlkZSkgZ2V0T3duZXIoKS5zZXRWaXJ0dWFsKHZpcnR1YWwsIHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgT3duZXIgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyOwotCX0KLQotCS8vICoqKioqKioqKiogSUFzc29jaWF0aW9uT3ZlcnJpZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShuZXdOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlT3ZlcnJpZGUuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5pc0VtcHR5KCkgPyB0aGlzLmRlZmF1bHRKb2luQ29sdW1ucygpIDogdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCX0KLQkKLQlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuaXNFbXB0eSgpID8gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGRlZmF1bHRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPih0aGlzLmRlZmF1bHRKb2luQ29sdW1ucyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKTsKLQl9Ci0JCi0JcHVibGljIGludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtSm9pbkNvbHVtbih0aGlzLCBjcmVhdGVKb2luQ29sdW1uT3duZXIoKSk7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuYWRkKGluZGV4LCBqb2luQ29sdW1uKTsKLQkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuYWRkKGluZGV4LCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uSW1wbCgpKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKEFzc29jaWF0aW9uT3ZlcnJpZGUuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgam9pbkNvbHVtbik7Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbi5Pd25lciBjcmVhdGVKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgsIE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBqb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCBBc3NvY2lhdGlvbk92ZXJyaWRlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU9ybUpvaW5Db2x1bW4gcmVtb3ZlZEpvaW5Db2x1bW4gPSB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7Ci0JCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcmVtb3ZlZEpvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChqb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCBBc3NvY2lhdGlvbk92ZXJyaWRlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJbW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCBBc3NvY2lhdGlvbk92ZXJyaWRlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCk7CQkKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gIXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCX0JCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmlzVmlydHVhbCh0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZTsKLQkJdGhpcy5uYW1lID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCk7Ci0JCWluaXRpYWxpemVTcGVjaWZpZWRKb2luQ29sdW1ucyhhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEpvaW5Db2x1bW5zKFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgewotCQlmb3IgKFhtbEpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5hZGQoY3JlYXRlSm9pbkNvbHVtbihqb2luQ29sdW1uKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGU7Ci0JCXRoaXMuc2V0TmFtZShhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCX0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoWG1sQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxKb2luQ29sdW1uPiByZXNvdXJjZUpvaW5Db2x1bW5zID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbEpvaW5Db2x1bW4+KGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCQotCQl3aGlsZSAoam9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQlqb2luQ29sdW1uLnVwZGF0ZShyZXNvdXJjZUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZEpvaW5Db2x1bW4oc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCksIGNyZWF0ZUpvaW5Db2x1bW4ocmVzb3VyY2VKb2luQ29sdW1ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBjcmVhdGVKb2luQ29sdW1uKFhtbEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1Kb2luQ29sdW1uKHRoaXMsIG5ldyBKb2luQ29sdW1uT3duZXIoKSk7Ci0JCW9ybUpvaW5Db2x1bW4uaW5pdGlhbGl6ZShqb2luQ29sdW1uKTsKLQkJcmV0dXJuIG9ybUpvaW5Db2x1bW47Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCWNsYXNzIEpvaW5Db2x1bW5Pd25lciBpbXBsZW1lbnRzIE9ybUpvaW5Db2x1bW4uT3duZXIKLQl7Ci0KLQkJcHVibGljIEpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogYnkgZGVmYXVsdCwgdGhlIGpvaW4gY29sdW1uIGlzIGluIHRoZSB0eXBlIG1hcHBpbmcncyBwcmltYXJ5IHRhYmxlCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGUudGhpcy5vd25lci5nZXRUeXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFbnRpdHkgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOwotCQkJcmV0dXJuIHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCA/IG51bGwgOiByZWxhdGlvbnNoaXBNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGUudGhpcy5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnRoaXMub3duZXIuZ2V0UmVsYXRpb25zaGlwTWFwcGluZyhHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZS50aGlzLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQkvKioKLQkJICogdGhlIGpvaW4gY29sdW1uIGNhbiBiZSBvbiBhIHNlY29uZGFyeSB0YWJsZQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdGFibGVJc0FsbG93ZWQoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZS50aGlzLm93bmVyLmdldFR5cGVNYXBwaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXREYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgZ2V0RGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKSB7Ci0JCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0VGFyZ2V0RW50aXR5KCk7Ci0JCQlyZXR1cm4gKHRhcmdldEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiB0YXJnZXRFbnRpdHkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCXJldHVybiBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZS50aGlzLmRlZmF1bHRKb2luQ29sdW1ucy5jb250YWlucyhqb2luQ29sdW1uKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnRoaXMuam9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtQXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0NDcwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlIGV4dGVuZHMgQWJzdHJhY3RPcm1KcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlT3ZlcnJpZGUsIE9ybUNvbHVtbi5Pd25lcgotewotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBmaW5hbCBPd25lciBvd25lcjsKLQotCXByb3RlY3RlZCBYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZTsKLQkKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1Db2x1bW4gY29sdW1uOwotCi0JcHVibGljIEdlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZShPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEF0dHJpYnV0ZU92ZXJyaWRlLk93bmVyIG93bmVyLCBYbWxBdHRyaWJ1dGVPdmVycmlkZSB4bWxBdHRyaWJ1dGVPdmVycmlkZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMuY29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtQ29sdW1uKHRoaXMsIHRoaXMpOwotCQl0aGlzLmluaXRpYWxpemUoeG1sQXR0cmlidXRlT3ZlcnJpZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtSnBhQ29udGV4dE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUpwYUNvbnRleHROb2RlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtQXR0cmlidXRlT3ZlcnJpZGUgc2V0VmlydHVhbChib29sZWFuIHZpcnR1YWwpIHsKLQkJcmV0dXJuIChPcm1BdHRyaWJ1dGVPdmVycmlkZSkgZ2V0T3duZXIoKS5zZXRWaXJ0dWFsKHZpcnR1YWwsIHRoaXMpOwotCX0KLQotCXB1YmxpYyBPd25lciBnZXRPd25lcigpIHsKLQkJcmV0dXJuIHRoaXMub3duZXI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKG5ld05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VPdmVycmlkZS5OQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlT3ZlcnJpZGUuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIE9ybUNvbHVtbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIFRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldERiVGFibGUoZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCUNvbHVtbk1hcHBpbmcgY29sdW1uTWFwcGluZyA9IGdldENvbHVtbk1hcHBpbmcoKTsKLQkJaWYgKGNvbHVtbk1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGNvbHVtbk1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCUNvbHVtbk1hcHBpbmcgY29sdW1uTWFwcGluZyA9IGdldENvbHVtbk1hcHBpbmcoKTsKLQkJaWYgKGNvbHVtbk1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHRhYmxlTmFtZSA9IGNvbHVtbk1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQkJaWYgKHRhYmxlTmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGFibGVOYW1lOwotCQl9Ci0JCXJldHVybiBnZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb2x1bW5NYXBwaW5nIGdldENvbHVtbk1hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldENvbHVtbk1hcHBpbmcoZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmlzVmlydHVhbCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJcmV0dXJuIHRleHRSYW5nZSA9PSBudWxsID8gZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogdGV4dFJhbmdlOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqKioqKiBJWG1sQ29sdW1uLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtblJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkQ29sdW1uUmVzb3VyY2UoKSB7Ci0JCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGUuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbkltcGwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtblJlc291cmNlKCkgewotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlLnNldENvbHVtbihudWxsKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGU7Ci0JCXRoaXMubmFtZSA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKTsKLQkJdGhpcy5jb2x1bW4uaW5pdGlhbGl6ZShhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGU7Ci0JCXRoaXMuc2V0TmFtZV8oYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdGhpcy5jb2x1bW4udXBkYXRlKGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCi0JCWFkZENvbHVtbk1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29sdW1uTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJT3JtQ29sdW1uIGNvbHVtbiA9IGdldENvbHVtbigpOwotCQlTdHJpbmcgdGFibGUgPSBjb2x1bW4uZ2V0VGFibGUoKTsKLQkJYm9vbGVhbiBkb0NvbnRpbnVlID0gY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGUpKSB7Ci0JCQlpZiAoaXNWaXJ0dWFsKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpLCB0YWJsZSwgY29sdW1uLmdldE5hbWUoKX0sCi0JCQkJCQljb2x1bW4sIAotCQkJCQkJY29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7dGFibGUsIGNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCQljb2x1bW4sCi0JCQkJCQkJY29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKCkpCi0JCQkJCSk7Ci0JCQl9Ci0JCQlkb0NvbnRpbnVlID0gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmICFjb2x1bW4uaXNSZXNvbHZlZCgpKSB7Ci0JCQlpZiAoaXNWaXJ0dWFsKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lKCksIGNvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWNvbHVtbiwKLQkJCQkJCWNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge2NvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCQljb2x1bW4sCi0JCQkJCQkJY29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkJKTsKLQkJCX0KLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtQmFzaWNNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUJhc2ljTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjYzNGUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtQmFzaWNNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTnVsbGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1CYXNpY01hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WG1sQmFzaWM+Ci0JaW1wbGVtZW50cyBPcm1CYXNpY01hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtQ29sdW1uIGNvbHVtbjsKLQkKLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIHNwZWNpZmllZEZldGNoOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkT3B0aW9uYWw7Ci0JCi0JcHJvdGVjdGVkIEVudW1UeXBlIHNwZWNpZmllZEVudW1lcmF0ZWQ7Ci0JCQotCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgdGVtcG9yYWw7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gbG9iOwotCQotCXB1YmxpYyBHZW5lcmljT3JtQmFzaWNNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtQ29sdW1uKHRoaXMsIHRoaXMpOwotCX0KLQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRGZXRjaCgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0RmV0Y2goKSA6IHRoaXMuZ2V0U3BlY2lmaWVkRmV0Y2goKTsKLQl9Ci0KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldERlZmF1bHRGZXRjaCgpIHsKLQkJcmV0dXJuIEJhc2ljTWFwcGluZy5ERUZBVUxUX0ZFVENIX1RZUEU7Ci0JfQotCi0JcHVibGljIEZldGNoVHlwZSBnZXRTcGVjaWZpZWRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRmV0Y2g7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZSBuZXdTcGVjaWZpZWRGZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkRmV0Y2ggPSB0aGlzLnNwZWNpZmllZEZldGNoOwotCQl0aGlzLnNwZWNpZmllZEZldGNoID0gbmV3U3BlY2lmaWVkRmV0Y2g7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldEZldGNoKEZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRmV0Y2gpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChGZXRjaGFibGUuU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGRGZXRjaCwgbmV3U3BlY2lmaWVkRmV0Y2gpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEZldGNoXyhGZXRjaFR5cGUgbmV3U3BlY2lmaWVkRmV0Y2gpIHsKLQkJRmV0Y2hUeXBlIG9sZEZldGNoID0gdGhpcy5zcGVjaWZpZWRGZXRjaDsKLQkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IG5ld1NwZWNpZmllZEZldGNoOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEZldGNoYWJsZS5TUEVDSUZJRURfRkVUQ0hfUFJPUEVSVFksIG9sZEZldGNoLCBuZXdTcGVjaWZpZWRGZXRjaCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0T3B0aW9uYWwoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdE9wdGlvbmFsKCkgewotCQlyZXR1cm4gTnVsbGFibGUuREVGQVVMVF9PUFRJT05BTDsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkT3B0aW9uYWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4gbmV3U3BlY2lmaWVkT3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGRPcHRpb25hbCA9IHRoaXMuc3BlY2lmaWVkT3B0aW9uYWw7Ci0JCXRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgPSBuZXdTcGVjaWZpZWRPcHRpb25hbDsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0T3B0aW9uYWwobmV3U3BlY2lmaWVkT3B0aW9uYWwpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE51bGxhYmxlLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgb2xkT3B0aW9uYWwsIG5ld1NwZWNpZmllZE9wdGlvbmFsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkT3B0aW9uYWxfKEJvb2xlYW4gbmV3U3BlY2lmaWVkT3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGRPcHRpb25hbCA9IHRoaXMuc3BlY2lmaWVkT3B0aW9uYWw7Ci0JCXRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgPSBuZXdTcGVjaWZpZWRPcHRpb25hbDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOdWxsYWJsZS5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIG9sZE9wdGlvbmFsLCBuZXdTcGVjaWZpZWRPcHRpb25hbCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMb2IoKSB7Ci0JCXJldHVybiB0aGlzLmxvYjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiBuZXdMb2IpIHsKLQkJYm9vbGVhbiBvbGRMb2IgPSB0aGlzLmxvYjsKLQkJdGhpcy5sb2IgPSBuZXdMb2I7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldExvYihuZXdMb2IpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2ljTWFwcGluZy5MT0JfUFJPUEVSVFksIG9sZExvYiwgbmV3TG9iKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TG9iXyhib29sZWFuIG5ld0xvYikgewotCQlib29sZWFuIG9sZExvYiA9IHRoaXMubG9iOwotCQl0aGlzLmxvYiA9IG5ld0xvYjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNpY01hcHBpbmcuTE9CX1BST1BFUlRZLCBvbGRMb2IsIG5ld0xvYik7Ci0JfQotCi0JcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpIHsKLQkJcmV0dXJuIHRoaXMudGVtcG9yYWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKSB7Ci0JCVRlbXBvcmFsVHlwZSBvbGRUZW1wb3JhbCA9IHRoaXMudGVtcG9yYWw7Ci0JCXRoaXMudGVtcG9yYWwgPSBuZXdUZW1wb3JhbDsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChuZXdUZW1wb3JhbCkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENvbHVtbk1hcHBpbmcuVEVNUE9SQUxfUFJPUEVSVFksIG9sZFRlbXBvcmFsLCBuZXdUZW1wb3JhbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGVtcG9yYWxfKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkgewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0aGlzLnRlbXBvcmFsOwotCQl0aGlzLnRlbXBvcmFsID0gbmV3VGVtcG9yYWw7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ29sdW1uTWFwcGluZy5URU1QT1JBTF9QUk9QRVJUWSwgb2xkVGVtcG9yYWwsIG5ld1RlbXBvcmFsKTsKLQl9Ci0JCi0JcHVibGljIEVudW1UeXBlIGdldEVudW1lcmF0ZWQoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRFbnVtZXJhdGVkKCkgOiB0aGlzLmdldFNwZWNpZmllZEVudW1lcmF0ZWQoKTsKLQl9Ci0JCi0JcHVibGljIEVudW1UeXBlIGdldERlZmF1bHRFbnVtZXJhdGVkKCkgewotCQlyZXR1cm4gQmFzaWNNYXBwaW5nLkRFRkFVTFRfRU5VTUVSQVRFRDsKLQl9Ci0JCi0JcHVibGljIEVudW1UeXBlIGdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEVudW1lcmF0ZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUgbmV3U3BlY2lmaWVkRW51bWVyYXRlZCkgewotCQlFbnVtVHlwZSBvbGRFbnVtZXJhdGVkID0gdGhpcy5zcGVjaWZpZWRFbnVtZXJhdGVkOwotCQl0aGlzLnNwZWNpZmllZEVudW1lcmF0ZWQgPSBuZXdTcGVjaWZpZWRFbnVtZXJhdGVkOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRFbnVtZXJhdGVkKEVudW1UeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRFbnVtZXJhdGVkKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzaWNNYXBwaW5nLlNQRUNJRklFRF9FTlVNRVJBVEVEX1BST1BFUlRZLCBvbGRFbnVtZXJhdGVkLCBuZXdTcGVjaWZpZWRFbnVtZXJhdGVkKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRW51bWVyYXRlZF8oRW51bVR5cGUgbmV3U3BlY2lmaWVkRW51bWVyYXRlZCkgewotCQlFbnVtVHlwZSBvbGRFbnVtZXJhdGVkID0gdGhpcy5zcGVjaWZpZWRFbnVtZXJhdGVkOwotCQl0aGlzLnNwZWNpZmllZEVudW1lcmF0ZWQgPSBuZXdTcGVjaWZpZWRFbnVtZXJhdGVkOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2ljTWFwcGluZy5TUEVDSUZJRURfRU5VTUVSQVRFRF9QUk9QRVJUWSwgb2xkRW51bWVyYXRlZCwgbmV3U3BlY2lmaWVkRW51bWVyYXRlZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtQmFzaWNNYXBwaW5nKHRoaXMpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21YbWxDb2x1bW5NYXBwaW5nKE9ybUNvbHVtbk1hcHBpbmcgb2xkTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVhtbENvbHVtbk1hcHBpbmcob2xkTWFwcGluZyk7Ci0JCXNldFRlbXBvcmFsKG9sZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7Ci0JCWdldENvbHVtbigpLmluaXRpYWxpemVGcm9tKG9sZE1hcHBpbmcuZ2V0Q29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiAyOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgT3JtQ29sdW1uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7CQkKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbEJhc2ljIGJhc2ljKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYmFzaWMpOwotCQl0aGlzLnNwZWNpZmllZEZldGNoID0gdGhpcy5zcGVjaWZpZWRGZXRjaChiYXNpYyk7Ci0JCXRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgPSB0aGlzLnNwZWNpZmllZE9wdGlvbmFsKGJhc2ljKTsKLQkJdGhpcy5zcGVjaWZpZWRFbnVtZXJhdGVkID0gdGhpcy5zcGVjaWZpZWRFbnVtZXJhdGVkKGJhc2ljKTsKLQkJdGhpcy50ZW1wb3JhbCA9IHRoaXMuc3BlY2lmaWVkVGVtcG9yYWwoYmFzaWMpOwotCQl0aGlzLmxvYiA9IHNwZWNpZmllZExvYihiYXNpYyk7Ci0JCXRoaXMuY29sdW1uLmluaXRpYWxpemUoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sQmFzaWMgYmFzaWMpIHsKLQkJc3VwZXIudXBkYXRlKGJhc2ljKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRGZXRjaF8odGhpcy5zcGVjaWZpZWRGZXRjaChiYXNpYykpOwotCQl0aGlzLnNldFNwZWNpZmllZE9wdGlvbmFsXyh0aGlzLnNwZWNpZmllZE9wdGlvbmFsKGJhc2ljKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRW51bWVyYXRlZF8odGhpcy5zcGVjaWZpZWRFbnVtZXJhdGVkKGJhc2ljKSk7Ci0JCXRoaXMuc2V0VGVtcG9yYWxfKHRoaXMuc3BlY2lmaWVkVGVtcG9yYWwoYmFzaWMpKTsKLQkJdGhpcy5zZXRMb2JfKHRoaXMuc3BlY2lmaWVkTG9iKGJhc2ljKSk7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZShiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE9wdGlvbmFsKFhtbEJhc2ljIGJhc2ljKSB7Ci0JCXJldHVybiBiYXNpYy5nZXRPcHRpb25hbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIHNwZWNpZmllZEZldGNoKFhtbEJhc2ljIGJhc2ljKSB7Ci0JCXJldHVybiBGZXRjaFR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoYmFzaWMuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXByb3RlY3RlZCBFbnVtVHlwZSBzcGVjaWZpZWRFbnVtZXJhdGVkKFhtbEJhc2ljIGJhc2ljKSB7Ci0JCXJldHVybiBFbnVtVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbChiYXNpYy5nZXRFbnVtZXJhdGVkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHNwZWNpZmllZFRlbXBvcmFsKFhtbEJhc2ljIGJhc2ljKSB7Ci0JCXJldHVybiBUZW1wb3JhbFR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoYmFzaWMuZ2V0VGVtcG9yYWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lmaWVkTG9iKFhtbEJhc2ljIGJhc2ljKSB7Ci0JCXJldHVybiBiYXNpYy5pc0xvYigpOwotCX0KLQkKLQlwdWJsaWMgWG1sQmFzaWMgYWRkVG9SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJWG1sQmFzaWMgYmFzaWMgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxCYXNpY0ltcGwoKTsKLQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmluaXRpYWxpemUoYmFzaWMpOwotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuYWRkKGJhc2ljKTsKLQkJcmV0dXJuIGJhc2ljOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5yZW1vdmUodGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQlpZiAodHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQl0eXBlTWFwcGluZy5zZXRBdHRyaWJ1dGVzKG51bGwpOwotCQl9Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKiogSVhtbENvbHVtbi5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldENvbHVtbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbkltcGwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtblJlc291cmNlKCkgewotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRDb2x1bW4obnVsbCk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQlpZiAoZW50aXR5T3duZWQoKSkgewotCQkJYWRkQ29sdW1uTWVzc2FnZXMobWVzc2FnZXMpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENvbHVtbk1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCU9ybUNvbHVtbiBjb2x1bW4gPSBnZXRDb2x1bW4oKTsKLQkJU3RyaW5nIHRhYmxlID0gY29sdW1uLmdldFRhYmxlKCk7Ci0JCWJvb2xlYW4gZG9Db250aW51ZSA9IGNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmIGdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlKSkgewotCQkJaWYgKGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lKCksIHRhYmxlLCBjb2x1bW4uZ2V0TmFtZSgpfSwKLQkJCQkJCWNvbHVtbiwgCi0JCQkJCQljb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RhYmxlLCBjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQljb2x1bW4sIAotCQkJCQkJY29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgISBjb2x1bW4uaXNSZXNvbHZlZCgpKSB7Ci0JCQlpZiAoZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpLCBjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQljb2x1bW4sIAotCQkJCQkJY29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Y29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJY29sdW1uLCAKLQkJCQkJCWNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNjY0ZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RPcm1CYXNlQ29sdW1uPFhtbENvbHVtbj4gaW1wbGVtZW50cyBPcm1Db2x1bW4KLXsKLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRMZW5ndGg7Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRQcmVjaXNpb247Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRTY2FsZTsKLQotCXB1YmxpYyBHZW5lcmljT3JtQ29sdW1uKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3JtQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtQ29sdW1uLk93bmVyIGdldE93bmVyKCkgewotCQlyZXR1cm4gKE9ybUNvbHVtbi5Pd25lcikgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oQ29sdW1uIG9sZENvbHVtbikgewotCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRDb2x1bW4pOwotCQlzZXRTcGVjaWZpZWRMZW5ndGgob2xkQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG9sZENvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCXNldFNwZWNpZmllZFNjYWxlKG9sZENvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRMZW5ndGgoKSA9PSBudWxsKSA/IGdldERlZmF1bHRMZW5ndGgoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdExlbmd0aCgpIHsKLQkJcmV0dXJuIENvbHVtbi5ERUZBVUxUX0xFTkdUSDsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlciBuZXdTcGVjaWZpZWRMZW5ndGgpIHsKLQkJSW50ZWdlciBvbGRTcGVjaWZpZWRMZW5ndGggPSB0aGlzLnNwZWNpZmllZExlbmd0aDsKLQkJdGhpcy5zcGVjaWZpZWRMZW5ndGggPSBuZXdTcGVjaWZpZWRMZW5ndGg7Ci0JCWlmIChvbGRTcGVjaWZpZWRMZW5ndGggIT0gbmV3U3BlY2lmaWVkTGVuZ3RoKSB7Ci0JCQlpZiAodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldENvbHVtblJlc291cmNlKCkuc2V0TGVuZ3RoKG5ld1NwZWNpZmllZExlbmd0aCk7Ci0JCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVDb2x1bW5SZXNvdXJjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZExlbmd0aCAhPSBudWxsKSB7Ci0JCQkJYWRkQ29sdW1uUmVzb3VyY2UoKTsKLQkJCQlnZXRDb2x1bW5SZXNvdXJjZSgpLnNldExlbmd0aChuZXdTcGVjaWZpZWRMZW5ndGgpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTGVuZ3RoLCBuZXdTcGVjaWZpZWRMZW5ndGgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRMZW5ndGhfKEludGVnZXIgbmV3U3BlY2lmaWVkTGVuZ3RoKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gbmV3U3BlY2lmaWVkTGVuZ3RoOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFksIG9sZFNwZWNpZmllZExlbmd0aCwgbmV3U3BlY2lmaWVkTGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRQcmVjaXNpb24oKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSA9PSBudWxsKSA/IGdldERlZmF1bHRQcmVjaXNpb24oKSA6IHRoaXMuZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTjsKLQl9Ci0JCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQcmVjaXNpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIgbmV3U3BlY2lmaWVkUHJlY2lzaW9uKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkUHJlY2lzaW9uID0gdGhpcy5zcGVjaWZpZWRQcmVjaXNpb247Ci0JCXRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uID0gbmV3U3BlY2lmaWVkUHJlY2lzaW9uOwotCQlpZiAob2xkU3BlY2lmaWVkUHJlY2lzaW9uICE9IG5ld1NwZWNpZmllZFByZWNpc2lvbikgewotCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLnNldFByZWNpc2lvbihuZXdTcGVjaWZpZWRQcmVjaXNpb24pOwotCQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdTcGVjaWZpZWRQcmVjaXNpb24gIT0gbnVsbCkgewotCQkJCWFkZENvbHVtblJlc291cmNlKCk7Ci0JCQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRQcmVjaXNpb24obmV3U3BlY2lmaWVkUHJlY2lzaW9uKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QUkVDSVNJT05fUFJPUEVSVFksIG9sZFNwZWNpZmllZFByZWNpc2lvbiwgbmV3U3BlY2lmaWVkUHJlY2lzaW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUHJlY2lzaW9uXyhJbnRlZ2VyIG5ld1NwZWNpZmllZFByZWNpc2lvbikgewotCQlJbnRlZ2VyIG9sZFNwZWNpZmllZFByZWNpc2lvbiA9IHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uOwotCQl0aGlzLnNwZWNpZmllZFByZWNpc2lvbiA9IG5ld1NwZWNpZmllZFByZWNpc2lvbjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUFJFQ0lTSU9OX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRQcmVjaXNpb24sIG5ld1NwZWNpZmllZFByZWNpc2lvbik7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U2NhbGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRTY2FsZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFNjYWxlKCkgOiB0aGlzLmdldFNwZWNpZmllZFNjYWxlKCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFNjYWxlKCkgewotCQlyZXR1cm4gQ29sdW1uLkRFRkFVTFRfU0NBTEU7Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZFNjYWxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTY2FsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyIG5ld1NwZWNpZmllZFNjYWxlKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkU2NhbGUgPSB0aGlzLnNwZWNpZmllZFNjYWxlOwotCQl0aGlzLnNwZWNpZmllZFNjYWxlID0gbmV3U3BlY2lmaWVkU2NhbGU7Ci0JCWlmIChvbGRTcGVjaWZpZWRTY2FsZSAhPSBuZXdTcGVjaWZpZWRTY2FsZSkgewotCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLnNldFNjYWxlKG5ld1NwZWNpZmllZFNjYWxlKTsKLQkJCQlpZiAodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZUNvbHVtblJlc291cmNlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3U3BlY2lmaWVkU2NhbGUgIT0gbnVsbCkgewotCQkJCWFkZENvbHVtblJlc291cmNlKCk7Ci0JCQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRTY2FsZShuZXdTcGVjaWZpZWRTY2FsZSk7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NBTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFNjYWxlLCBuZXdTcGVjaWZpZWRTY2FsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2NhbGVfKEludGVnZXIgbmV3U3BlY2lmaWVkU2NhbGUpIHsKLQkJSW50ZWdlciBvbGRTcGVjaWZpZWRTY2FsZSA9IHRoaXMuc3BlY2lmaWVkU2NhbGU7Ci0JCXRoaXMuc3BlY2lmaWVkU2NhbGUgPSBuZXdTcGVjaWZpZWRTY2FsZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NBTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFNjYWxlLCBuZXdTcGVjaWZpZWRTY2FsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbENvbHVtbiBnZXRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0Q29sdW1uUmVzb3VyY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29sdW1uUmVzb3VyY2UoKSB7Ci0JCWdldE93bmVyKCkuYWRkQ29sdW1uUmVzb3VyY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKSB7Ci0JCWdldE93bmVyKCkucmVtb3ZlQ29sdW1uUmVzb3VyY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxDb2x1bW4gY29sdW1uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoY29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWRMZW5ndGggPSB0aGlzLnNwZWNpZmllZExlbmd0aChjb2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZFByZWNpc2lvbiA9IHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkU2NhbGUgPSB0aGlzLnNwZWNpZmllZFNjYWxlKGNvbHVtbik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxDb2x1bW4gY29sdW1uKSB7Ci0JCXN1cGVyLnVwZGF0ZShjb2x1bW4pOwotCQl0aGlzLnNldFNwZWNpZmllZExlbmd0aF8odGhpcy5zcGVjaWZpZWRMZW5ndGgoY29sdW1uKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUHJlY2lzaW9uXyh0aGlzLnNwZWNpZmllZFByZWNpc2lvbihjb2x1bW4pKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTY2FsZV8odGhpcy5zcGVjaWZpZWRTY2FsZShjb2x1bW4pKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRMZW5ndGgoWG1sQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gY29sdW1uID09IG51bGwgPyBudWxsIDogY29sdW1uLmdldExlbmd0aCgpOwotCX0KLQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZFByZWNpc2lvbihYbWxDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiBjb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBjb2x1bW4uZ2V0UHJlY2lzaW9uKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZFNjYWxlKFhtbENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIGNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGNvbHVtbi5nZXRTY2FsZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1EaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZjg2NjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1EaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybURpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbERpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1EaXNjcmltaW5hdG9yQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RPcm1OYW1lZENvbHVtbjxYbWxEaXNjcmltaW5hdG9yQ29sdW1uPgotCWltcGxlbWVudHMgT3JtRGlzY3JpbWluYXRvckNvbHVtbgotewotCi0JcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIHNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOwotCQotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBkZWZhdWx0RGlzY3JpbWluYXRvclR5cGU7Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRMZW5ndGg7Ci0KLQlwcm90ZWN0ZWQgWG1sRW50aXR5IGVudGl0eTsKLQkKLQlwdWJsaWMgR2VuZXJpY09ybURpc2NyaW1pbmF0b3JDb2x1bW4oT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPcm1OYW1lZENvbHVtbi5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRTsKLQl9Ci0JCQotCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCURpc2NyaW1pbmF0b3JUeXBlIG9sZERpc2NyaW1pbmF0b3JUeXBlID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSA9IG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOwotCQlpZiAob2xkRGlzY3JpbWluYXRvclR5cGUgIT0gbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUpIHsKLQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUpKTsKLQkJCQlpZiAodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZUNvbHVtblJlc291cmNlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUgIT0gbnVsbCkgewotCQkJCWFkZENvbHVtblJlc291cmNlKCk7Ci0JCQkJdGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLnNldERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSkpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRGlzY3JpbWluYXRvckNvbHVtbi5TUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZLCBvbGREaXNjcmltaW5hdG9yVHlwZSwgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZV8oRGlzY3JpbWluYXRvclR5cGUgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUpIHsKLQkJRGlzY3JpbWluYXRvclR5cGUgb2xkRGlzY3JpbWluYXRvclR5cGUgPSB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOwotCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlID0gbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRGlzY3JpbWluYXRvckNvbHVtbi5TUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZLCBvbGREaXNjcmltaW5hdG9yVHlwZSwgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUpOwotCX0KLQkJCi0JcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRMZW5ndGgoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdExlbmd0aCgpIHsKLQkJcmV0dXJuIERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEg7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIgbmV3U3BlY2lmaWVkTGVuZ3RoKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gbmV3U3BlY2lmaWVkTGVuZ3RoOwotCQlpZiAob2xkU3BlY2lmaWVkTGVuZ3RoICE9IG5ld1NwZWNpZmllZExlbmd0aCkgewotCQkJaWYgKHRoaXMuZ2V0Q29sdW1uUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpLnNldExlbmd0aChuZXdTcGVjaWZpZWRMZW5ndGgpOwotCQkJCWlmICh0aGlzLmdldENvbHVtblJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdTcGVjaWZpZWRMZW5ndGggIT0gbnVsbCkgewotCQkJCWFkZENvbHVtblJlc291cmNlKCk7Ci0JCQkJZ2V0Q29sdW1uUmVzb3VyY2UoKS5zZXRMZW5ndGgobmV3U3BlY2lmaWVkTGVuZ3RoKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFksIG9sZFNwZWNpZmllZExlbmd0aCwgbmV3U3BlY2lmaWVkTGVuZ3RoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRMZW5ndGhfKEludGVnZXIgbmV3U3BlY2lmaWVkTGVuZ3RoKSB7Ci0JCUludGVnZXIgb2xkU3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gbmV3U3BlY2lmaWVkTGVuZ3RoOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFksIG9sZFNwZWNpZmllZExlbmd0aCwgbmV3U3BlY2lmaWVkTGVuZ3RoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXIoKS5nZXRUeXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCX0KLQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxEaXNjcmltaW5hdG9yQ29sdW1uIGdldENvbHVtblJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJdGhpcy5lbnRpdHkuc2V0RGlzY3JpbWluYXRvckNvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxEaXNjcmltaW5hdG9yQ29sdW1uKCkpOwkJCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbHVtblJlc291cmNlKCkgewotCQl0aGlzLmVudGl0eS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbEVudGl0eSBlbnRpdHkpIHsKLQkJdGhpcy5lbnRpdHkgPSBlbnRpdHk7Ci0JCXRoaXMuaW5pdGlhbGl6ZSh0aGlzLmdldENvbHVtblJlc291cmNlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sRW50aXR5IGVudGl0eSkgewotCQl0aGlzLmVudGl0eSA9IGVudGl0eTsKLQkJdGhpcy51cGRhdGUodGhpcy5nZXRDb2x1bW5SZXNvdXJjZSgpKTsKLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbERpc2NyaW1pbmF0b3JDb2x1bW4gY29sdW1uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoY29sdW1uKTsKLQkJdGhpcy5zcGVjaWZpZWRMZW5ndGggPSB0aGlzLnNwZWNpZmllZExlbmd0aChjb2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShjb2x1bW4pOwotCQkvL1RPRE8gZGVmYXVsdExlbmd0aCwgZGlzY3JpbWluYXRvciB0eXBlIGphdmEgY29sdW1uCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShYbWxEaXNjcmltaW5hdG9yQ29sdW1uIGNvbHVtbikgewotCQlzdXBlci51cGRhdGUoY29sdW1uKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGhfKHRoaXMuc3BlY2lmaWVkTGVuZ3RoKGNvbHVtbikpOwotCQl0aGlzLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlXyh0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKGNvbHVtbikpOwotCQkvL1RPRE8gZGVmYXVsdExlbmd0aCwgc2NhbGUsIHByZWNpc2lvbiBmcm9tIGphdmEgY29sdW1uCi0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZExlbmd0aChYbWxEaXNjcmltaW5hdG9yQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gY29sdW1uID09IG51bGwgPyBudWxsIDogY29sdW1uLmdldExlbmd0aCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoWG1sRGlzY3JpbWluYXRvckNvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIGNvbHVtbiA9PSBudWxsID8gbnVsbCA6IERpc2NyaW1pbmF0b3JUeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKGNvbHVtbi5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzN2U0OTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUVtYmVkZGFibGUgZXh0ZW5kcyBBYnN0cmFjdE9ybVR5cGVNYXBwaW5nPFhtbEVtYmVkZGFibGU+IGltcGxlbWVudHMgT3JtRW1iZWRkYWJsZQotewotCXB1YmxpYyBHZW5lcmljT3JtRW1iZWRkYWJsZShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFzc29jaWF0ZWRUYWJsZU5hbWVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxUYWJsZT4gYXNzb2NpYXRlZFRhYmxlcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoU3RyaW5nIGF0dHJpYnV0ZU1hcHBpbmdLZXkpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZIHx8IGF0dHJpYnV0ZU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKFhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZSkgewotCQlyZXR1cm4gZW1iZWRkYWJsZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCWVudGl0eU1hcHBpbmdzLmdldEVtYmVkZGFibGVzKCkucmVtb3ZlKHRoaXMuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpKTsKLQl9Ci0KLQlwdWJsaWMgWG1sRW1iZWRkYWJsZSBhZGRUb1Jlc291cmNlTW9kZWwoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW1iZWRkYWJsZSgpOwotCQlnZXRQZXJzaXN0ZW50VHlwZSgpLmluaXRpYWxpemUoZW1iZWRkYWJsZSk7Ci0JCWVudGl0eU1hcHBpbmdzLmdldEVtYmVkZGFibGVzKCkuYWRkKGVtYmVkZGFibGUpOwotCQlyZXR1cm4gZW1iZWRkYWJsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUVtYmVkZGVkSWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUVtYmVkZGVkSWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOWIyMzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRlZElkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZDsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUVtYmVkZGVkSWRNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nPFhtbEVtYmVkZGVkSWQ+IGltcGxlbWVudHMgT3JtRW1iZWRkZWRJZE1hcHBpbmcKLXsKLQotCXB1YmxpYyBHZW5lcmljT3JtRW1iZWRkZWRJZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1FbWJlZGRlZElkTWFwcGluZyh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqIEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzSWRNYXBwaW5nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgWG1sRW1iZWRkZWRJZCBhZGRUb1Jlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWQgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbWJlZGRlZElkSW1wbCgpOwotCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaW5pdGlhbGl6ZShlbWJlZGRlZElkKTsKLQkJdHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuYWRkKGVtYmVkZGVkSWQpOwotCQlyZXR1cm4gZW1iZWRkZWRJZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5yZW1vdmUodGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQlpZiAodHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQl0eXBlTWFwcGluZy5zZXRBdHRyaWJ1dGVzKG51bGwpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sRW1iZWRkZWRJZCBlbWJlZGRlZCkgewotCQlzdXBlci5pbml0aWFsaXplKGVtYmVkZGVkKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbEVtYmVkZGVkSWQgZW1iZWRkZWQpIHsKLQkJc3VwZXIudXBkYXRlKGVtYmVkZGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRlZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkMDFkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nPFhtbEVtYmVkZGVkPiBpbXBsZW1lbnRzIE9ybUVtYmVkZGVkTWFwcGluZwotewotCQotCXB1YmxpYyBHZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtRW1iZWRkZWRNYXBwaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiA4OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBYbWxFbWJlZGRlZCBhZGRUb1Jlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZCA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVtYmVkZGVkSW1wbCgpOwotCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaW5pdGlhbGl6ZShlbWJlZGRlZCk7Ci0JCXR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5hZGQoZW1iZWRkZWQpOwotCQlyZXR1cm4gZW1iZWRkZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkucmVtb3ZlKHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpKTsKLQkJaWYgKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJdHlwZU1hcHBpbmcuc2V0QXR0cmlidXRlcyhudWxsKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbEVtYmVkZGVkIGVtYmVkZGVkKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoZW1iZWRkZWQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sRW1iZWRkZWQgZW1iZWRkZWQpIHsKLQkJc3VwZXIudXBkYXRlKGVtYmVkZGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUVudGl0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYzNzMwNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZENsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RPcm1UeXBlTWFwcGluZzxYbWxFbnRpdHk+IGltcGxlbWVudHMgT3JtRW50aXR5Ci17Ci0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgaWRDbGFzczsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1UYWJsZSB0YWJsZTsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybVNlY29uZGFyeVRhYmxlPiBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXM7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtU2Vjb25kYXJ5VGFibGU+IHZpcnR1YWxTZWNvbmRhcnlUYWJsZXM7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uczsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uczsKLQotCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneTsKLQkKLQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIGRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkOwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybURpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbjsKLQotCXByb3RlY3RlZCBPcm1TZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjsKLQotCXByb3RlY3RlZCBPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXM7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlczsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlczsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllczsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllczsKLQotCXB1YmxpYyBHZW5lcmljT3JtRW50aXR5KE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnRhYmxlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtVGFibGUodGhpcyk7Ci0JCXRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzID0gbmV3IEFycmF5TGlzdDxPcm1TZWNvbmRhcnlUYWJsZT4oKTsKLQkJdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzID0gbmV3IEFycmF5TGlzdDxPcm1TZWNvbmRhcnlUYWJsZT4oKTsKLQkJdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uID0gYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4oKTsKLQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4oKTsKLQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgQXJyYXlMaXN0PE9ybUF0dHJpYnV0ZU92ZXJyaWRlPigpOwotCQl0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgQXJyYXlMaXN0PE9ybUF0dHJpYnV0ZU92ZXJyaWRlPigpOwotCQl0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gbmV3IEFycmF5TGlzdDxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPigpOwotCQl0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4oKTsKLQkJdGhpcy5uYW1lZFF1ZXJpZXMgPSBuZXcgQXJyYXlMaXN0PE9ybU5hbWVkUXVlcnk+KCk7Ci0JCXRoaXMubmFtZWROYXRpdmVRdWVyaWVzID0gbmV3IEFycmF5TGlzdDxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtRGlzY3JpbWluYXRvckNvbHVtbiBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW4oKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1EaXNjcmltaW5hdG9yQ29sdW1uKHRoaXMsIGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbk93bmVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtTmFtZWRDb2x1bW4uT3duZXIgYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtTmFtZWRDb2x1bW4uT3duZXIoKXsKLQkJCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQkJcmV0dXJuIEdlbmVyaWNPcm1FbnRpdHkudGhpcy5nZXREYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCQlyZXR1cm4gR2VuZXJpY09ybUVudGl0eS50aGlzOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewotCQkJCS8vVE9ETyBkZWZhdWx0IGNvbHVtbiBuYW1lIGZyb20gamF2YSBoZXJlIG9yIGluIFhtbERpc2NyaW1pbmF0b3JDb2x1bW4/Ci0JCQkJcmV0dXJuIERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9OQU1FOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCX07Ci0JfQotCi0JLy8gKioqKioqKioqKioqKioqKioqKiBJVHlwZU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVk7Ci0JfQkKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0VGFibGUoKS5nZXROYW1lKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0UHJpbWFyeURiVGFibGUoKSB7Ci0JCXJldHVybiBnZXRUYWJsZSgpLmdldERiVGFibGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yPFRhYmxlPiBzdHJlYW0gPSB0aGlzLmFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCW9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBkYlRhYmxlID0gc3RyZWFtLm5leHQoKS5nZXREYlRhYmxlKCk7Ci0JCQlpZiAoZGJUYWJsZSAhPSBudWxsICYmIGRiVGFibGUubWF0Y2hlc1Nob3J0SmF2YUNsYXNzTmFtZSh0YWJsZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGRiVGFibGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7Ci0JCXJldHVybiBnZXRUYWJsZSgpLmdldERiU2NoZW1hKCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhRW50aXR5IGdldEphdmFFbnRpdHkoKSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJaWYgKGphdmFQZXJzaXN0ZW50VHlwZSAhPSBudWxsICYmIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nS2V5KCkgPT0gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpIHsKLQkJCXJldHVybiAoSmF2YUVudGl0eSkgamF2YVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0TmFtZSgpIDogdGhpcy5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZE5hbWUgPSB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5ld1NwZWNpZmllZE5hbWU7Ci0JCXRoaXMuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLnNldE5hbWUobmV3U3BlY2lmaWVkTmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE5hbWUsIG5ld1NwZWNpZmllZE5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHROYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHROYW1lKFN0cmluZyBuZXdEZWZhdWx0TmFtZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdE5hbWUgPSB0aGlzLmRlZmF1bHROYW1lOwotCQl0aGlzLmRlZmF1bHROYW1lID0gbmV3RGVmYXVsdE5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9OQU1FX1BST1BFUlRZLCBvbGREZWZhdWx0TmFtZSwgbmV3RGVmYXVsdE5hbWUpOwotCX0KLQotCXB1YmxpYyBPcm1UYWJsZSBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGU7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzKCkgewotCQlpZiAoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpID4gMCkgewotCQkJcmV0dXJuIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQl9Ci0JCXJldHVybiB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCk7Ci0JfQotCi0JcHVibGljIGludCBzZWNvbmRhcnlUYWJsZXNTaXplKCkgewotCQlpZiAoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpID4gMCkgewotCQkJcmV0dXJuIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkJfQotCQlyZXR1cm4gdmlydHVhbFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gdmlydHVhbFNlY29uZGFyeVRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4odGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHZpcnR1YWxTZWNvbmRhcnlUYWJsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzLnNpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmlydHVhbFNlY29uZGFyeVRhYmxlKE9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3Qoc2Vjb25kYXJ5VGFibGUsIHRoaXMudmlydHVhbFNlY29uZGFyeVRhYmxlcywgT3JtRW50aXR5LlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFU19MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVmlydHVhbFNlY29uZGFyeVRhYmxlKE9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChzZWNvbmRhcnlUYWJsZSwgdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzLCBPcm1FbnRpdHkuVklSVFVBTF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4odGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMpOwotCX0KLQotCXB1YmxpYyBpbnQgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE9ybVNlY29uZGFyeVRhYmxlIGFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGludCBpbmRleCkgewotCQlpZiAoIXNlY29uZGFyeVRhYmxlc0RlZmluZWRJblhtbCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJWaXJ0dWFsIHNlY29uZGFyeSB0YWJsZXMgZXhpc3QsIG11c3QgZmlyc3QgY2FsbCBzZXRTZWNvbmRhcnlUYWJsZXNEZWZpbmVkSW5YbWwodHJ1ZSkiKTsKLQkJfQotCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2Vjb25kYXJ5VGFibGVJbXBsKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gIGJ1aWxkU2Vjb25kYXJ5VGFibGUoc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSk7Ci0JCXRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLmFkZChpbmRleCwgc2Vjb25kYXJ5VGFibGUpOwotCQlnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkKGluZGV4LCBzZWNvbmRhcnlUYWJsZVJlc291cmNlKTsKLQkJZmlyZUl0ZW1BZGRlZChFbnRpdHkuU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCwgaW5kZXgsIHNlY29uZGFyeVRhYmxlKTsKLQkJcmV0dXJuIHNlY29uZGFyeVRhYmxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgaW5kZXgsIE9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHNlY29uZGFyeVRhYmxlLCB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcywgRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLmluZGV4T2Yoc2Vjb25kYXJ5VGFibGUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW50IGluZGV4KSB7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIHJlbW92ZWRTZWNvbmRhcnlUYWJsZSA9IHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLnJlbW92ZShpbmRleCk7Ci0JCWdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QsIGluZGV4LCByZW1vdmVkU2Vjb25kYXJ5VGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZV8oT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KHNlY29uZGFyeVRhYmxlLCB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcywgRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldFNlY29uZGFyeVRhYmxlcygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NlY29uZGFyeVRhYmxlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBjb250YWluc1NlY29uZGFyeVRhYmxlKG5hbWUsIHNlY29uZGFyeVRhYmxlcygpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY29udGFpbnNTZWNvbmRhcnlUYWJsZShuYW1lLCBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmlydHVhbFNlY29uZGFyeVRhYmxlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBjb250YWluc1NlY29uZGFyeVRhYmxlKG5hbWUsIHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmlydHVhbFNlY29uZGFyeVRhYmxlKE9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxTZWNvbmRhcnlUYWJsZXMuY29udGFpbnMoc2Vjb25kYXJ5VGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zU2Vjb25kYXJ5VGFibGUoU3RyaW5nIG5hbWUsIExpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzKSB7Ci0JCWZvciAoT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoc2Vjb25kYXJ5VGFibGVzKSkgewotCQkJU3RyaW5nIHNlY29uZGFyeVRhYmxlTmFtZSA9IHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKTsKLQkJCWlmIChzZWNvbmRhcnlUYWJsZU5hbWUgIT0gbnVsbCAmJiBzZWNvbmRhcnlUYWJsZU5hbWUuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNlY29uZGFyeVRhYmxlc0RlZmluZWRJblhtbCgpIHsKLQkJcmV0dXJuIHZpcnR1YWxTZWNvbmRhcnlUYWJsZXNTaXplKCkgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2Vjb25kYXJ5VGFibGVzRGVmaW5lZEluWG1sKGJvb2xlYW4gZGVmaW5lSW5YbWwpIHsKLQkJaWYgKGRlZmluZUluWG1sID09IHNlY29uZGFyeVRhYmxlc0RlZmluZWRJblhtbCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGRlZmluZUluWG1sKSB7Ci0JCQlzcGVjaWZ5U2Vjb25kYXJ5VGFibGVzSW5YbWwoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlbW92ZVNlY29uZGFyeVRhYmxlc0Zyb21YbWwoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gdGFrZSBhbGwgdGhlIGphdmEgc2Vjb25kYXJ5IHRhYmxlcyBhbmQgc3BlY2lmeSB0aGVtIGluIHRoZSB4bWwuICBZb3UgbXVzdAotCSAqIHVzZSBzZXRTZWNvbmRhcnlUYWJsZXNEZWZpbmVkSW5YbWwoYm9vbGVhbikgYmVmb3JlIGNhbGxpbmcgYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoKS4KLQkgKiAKLQkgKiBZZXMgdGhpcyBjb2RlIGxvb2tzIG9kZCwgYnV0IGJlIGNhcmVmdWwgbWFraW5nIGNoYW5nZXMgdG8gaXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWZ5U2Vjb25kYXJ5VGFibGVzSW5YbWwoKSB7Ci0JCWlmICh2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpICE9IDApIHsKLQkJCUxpc3Q8T3JtU2Vjb25kYXJ5VGFibGU+IHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKSk7Ci0JCQlMaXN0PE9ybVNlY29uZGFyeVRhYmxlPiB2aXJ0dWFsU2Vjb25kYXJ5VGFibGUyID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkpOwotCQkJLy9yZW1vdmUgYWxsIHRoZSB2aXJ0dWFsIHNlY29uZGFyeSB0YWJsZXMgd2l0aG91dCBmaXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkJCWZvciAoT3JtU2Vjb25kYXJ5VGFibGUgdmlydHVhbFNlY29uZGFyeVRhYmxlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKSkpIHsKLQkJCQl0aGlzLnZpcnR1YWxTZWNvbmRhcnlUYWJsZXMucmVtb3ZlKHZpcnR1YWxTZWNvbmRhcnlUYWJsZSk7CQkJCQotCQkJfQotCQkJLy9hZGQgc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZXMgZm9yIGVhY2ggdmlydHVhbCBzZWNvbmRhcnkgdGFibGUuIElmIHRoZSB2aXJ0dWFsIHNlY29uZGFyeSB0YWJsZXMKLQkJCS8vYXJlIG5vdCByZW1vdmVkIGZpcnN0LCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIGFkZGluZyB0aGUgZmlyc3Qgc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZS4KLQkJCS8vVGhpcyBzY3Jld3MgdXAgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gdG8gdGhlIFVJLCBzaW5jZSB0aGF0IGNoYW5nZSBub3RpZmljYXRpb24gaXMgaW4gYSBkaWZmZXJlbnQgdGhyZWFkCi0JCQlmb3IgKE9ybVNlY29uZGFyeVRhYmxlIHZpcnR1YWxTZWNvbmRhcnlUYWJsZSA6IHZpcnR1YWxTZWNvbmRhcnlUYWJsZTIpIHsKLQkJCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2Vjb25kYXJ5VGFibGVJbXBsKCk7Ci0JCQkJT3JtU2Vjb25kYXJ5VGFibGUgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUgPSAgYnVpbGRTZWNvbmRhcnlUYWJsZShzZWNvbmRhcnlUYWJsZVJlc291cmNlKTsKLQkJCQl0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5hZGQoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUpOwotCQkJCWdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5hZGQoc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSk7Ci0JCQkJc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUuaW5pdGlhbGl6ZUZyb20odmlydHVhbFNlY29uZGFyeVRhYmxlKTsKLQkJCX0KLQkJCS8vZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGF0IHRoZSBlbmQKLQkJCWZpcmVJdGVtc1JlbW92ZWQoT3JtRW50aXR5LlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFU19MSVNULCAwLCB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzKTsKLQkJCWZpcmVJdGVtc0FkZGVkKEVudGl0eS5TUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNULCAwLCB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcyk7CQkKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZWNvbmRhcnlUYWJsZXNGcm9tWG1sKCkgewotCQlpZiAoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpICE9IDApIHsKLQkJCUxpc3Q8T3JtU2Vjb25kYXJ5VGFibGU+IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcyA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkpOwotCQkJZm9yIChPcm1TZWNvbmRhcnlUYWJsZSBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKSkpIHsKLQkJCQlpbnQgaW5kZXggPSB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5pbmRleE9mKHNwZWNpZmllZFNlY29uZGFyeVRhYmxlKTsKLQkJCQl0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5yZW1vdmUoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUpOwotCQkJCWlmICh0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5zaXplKCkgPT0gMCkgewotCQkJCQlpbml0aWFsaXplVmlydHVhbFNlY29uZGFyeVRhYmxlcygpOwotCQkJCX0KLQkJCQlnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkucmVtb3ZlKGluZGV4KTsKLQkJCX0KLQkJCWZpcmVJdGVtc1JlbW92ZWQoRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QsIDAsIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcyk7Ci0JCQlpZiAodGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzLnNpemUoKSAhPSAwKSB7Ci0JCQkJZmlyZUl0ZW1zQWRkZWQoT3JtRW50aXR5LlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFU19MSVNULCAwLCB0aGlzLnZpcnR1YWxTZWNvbmRhcnlUYWJsZXMpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHRhYmxlTmFtZXMoSXRlcmF0b3I8VGFibGU+IHRhYmxlcykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VGFibGUsIFN0cmluZz4odGFibGVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFRhYmxlIHQpIHsKLQkJCQlyZXR1cm4gdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLm5vbk51bGxUYWJsZU5hbWVzKHRoaXMuYXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBub25OdWxsVGFibGVOYW1lcyhJdGVyYXRvcjxUYWJsZT4gdGFibGVzKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMudGFibGVOYW1lcyh0YWJsZXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChTdHJpbmcgbykgewotCQkJCXJldHVybiBvICE9IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFRhYmxlPiBhc3NvY2lhdGVkVGFibGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFRhYmxlPih0aGlzLmdldFRhYmxlKCksIHRoaXMuc2Vjb25kYXJ5VGFibGVzKCkpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxUYWJsZT4gYXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxUYWJsZT4obmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VHlwZU1hcHBpbmcsIEl0ZXJhdG9yPFRhYmxlPj4odGhpcy5pbmhlcml0YW5jZUhpZXJhcmNoeSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxUYWJsZT4gdHJhbnNmb3JtKFR5cGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFRhYmxlLCBUYWJsZT4obWFwcGluZy5hc3NvY2lhdGVkVGFibGVzKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChUYWJsZSBvKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCS8vVE9ETwotCQkJCQkJLy9maWx0ZXJpbmcgdGhlc2Ugb3V0IHNvIGFzIHRvIGF2b2lkIHRoZSBkdXBsaWNhdGUgdGFibGUsIHJvb3QgYW5kIGNoaWxkcmVuIHNoYXJlIHRoZSBzYW1lIHRhYmxlCi0JCQkJCQkvL3JldHVybiAhKG8gaW5zdGFuY2VvZiBTaW5nbGVUYWJsZUluaGVyaXRhbmNlQ2hpbGRUYWJsZUltcGwpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuICFDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5hc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpLCB0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSA6IHRoaXMuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpOwotCX0KLQkKLQlwdWJsaWMgSW5oZXJpdGFuY2VUeXBlIGdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlIG5ld0luaGVyaXRhbmNlVHlwZSkgewotCQlJbmhlcml0YW5jZVR5cGUgb2xkSW5oZXJpdGFuY2VUeXBlID0gdGhpcy5kZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneTsKLQkJdGhpcy5kZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSA9IG5ld0luaGVyaXRhbmNlVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZLCBvbGRJbmhlcml0YW5jZVR5cGUsIG5ld0luaGVyaXRhbmNlVHlwZSk7Ci0JfQotCQotCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgbmV3SW5oZXJpdGFuY2VUeXBlKSB7Ci0JCUluaGVyaXRhbmNlVHlwZSBvbGRJbmhlcml0YW5jZVR5cGUgPSB0aGlzLnNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3k7Ci0JCXRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSA9IG5ld0luaGVyaXRhbmNlVHlwZTsKLQkJaWYgKG9sZEluaGVyaXRhbmNlVHlwZSAhPSBuZXdJbmhlcml0YW5jZVR5cGUpIHsKLQkJCWlmICh0aGlzLmluaGVyaXRhbmNlUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5pbmhlcml0YW5jZVJlc291cmNlKCkuc2V0U3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChuZXdJbmhlcml0YW5jZVR5cGUpKTsJCQkJCQkKLQkJCQlpZiAodGhpcy5pbmhlcml0YW5jZVJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlSW5oZXJpdGFuY2VSZXNvdXJjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld0luaGVyaXRhbmNlVHlwZSAhPSBudWxsKSB7Ci0JCQkJYWRkSW5oZXJpdGFuY2VSZXNvdXJjZSgpOwotCQkJCWluaGVyaXRhbmNlUmVzb3VyY2UoKS5zZXRTdHJhdGVneShJbmhlcml0YW5jZVR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld0luaGVyaXRhbmNlVHlwZSkpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZLCBvbGRJbmhlcml0YW5jZVR5cGUsIG5ld0luaGVyaXRhbmNlVHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3lfKEluaGVyaXRhbmNlVHlwZSBuZXdJbmhlcml0YW5jZVR5cGUpIHsKLQkJSW5oZXJpdGFuY2VUeXBlIG9sZEluaGVyaXRhbmNlVHlwZSA9IHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneTsKLQkJdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gbmV3SW5oZXJpdGFuY2VUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9JTkhFUklUQU5DRV9TVFJBVEVHWV9QUk9QRVJUWSwgb2xkSW5oZXJpdGFuY2VUeXBlLCBuZXdJbmhlcml0YW5jZVR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBJbmhlcml0YW5jZSBpbmhlcml0YW5jZVJlc291cmNlKCkgewotCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldEluaGVyaXRhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEluaGVyaXRhbmNlUmVzb3VyY2UoKSB7Ci0JCWdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5zZXRJbmhlcml0YW5jZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbmhlcml0YW5jZSgpKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJbmhlcml0YW5jZVJlc291cmNlKCkgewotCQlnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0SW5oZXJpdGFuY2UobnVsbCk7Ci0JfQotCi0JcHVibGljIE9ybURpc2NyaW1pbmF0b3JDb2x1bW4gZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgT3JtU2VxdWVuY2VHZW5lcmF0b3IgYWRkU2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCWlmIChnZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNlcXVlbmNlR2VuZXJhdG9yIGFscmVhZHkgZXhpc3RzIik7Ci0JCX0KLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVNlcXVlbmNlR2VuZXJhdG9yKHRoaXMpOwotCQlnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0U2VxdWVuY2VHZW5lcmF0b3IoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSwgbnVsbCwgdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCXJldHVybiB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpIHsKLQkJaWYgKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2VxdWVuY2VHZW5lcmF0b3IgZG9lcyBub3QgZXhpc3QsIGNhbm5vdCBiZSByZW1vdmVkIik7Ci0JCX0KLQkJT3JtU2VxdWVuY2VHZW5lcmF0b3Igb2xkU2VxdWVuY2VHZW5lcmF0b3IgPSB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yID0gbnVsbDsKLQkJdGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0U2VxdWVuY2VHZW5lcmF0b3IobnVsbCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VRVUVOQ0VfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRTZXF1ZW5jZUdlbmVyYXRvciwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBPcm1TZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoT3JtU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJT3JtU2VxdWVuY2VHZW5lcmF0b3Igb2xkU2VxdWVuY2VHZW5lcmF0b3IgPSB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yID0gbmV3U2VxdWVuY2VHZW5lcmF0b3I7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VRVUVOQ0VfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRTZXF1ZW5jZUdlbmVyYXRvciwgbmV3U2VxdWVuY2VHZW5lcmF0b3IpOwotCX0KLQotCXB1YmxpYyBPcm1UYWJsZUdlbmVyYXRvciBhZGRUYWJsZUdlbmVyYXRvcigpIHsKLQkJaWYgKGdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGFibGVHZW5lcmF0b3IgYWxyZWFkeSBleGlzdHMiKTsKLQkJfQotCQl0aGlzLnRhYmxlR2VuZXJhdG9yID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtVGFibGVHZW5lcmF0b3IodGhpcyk7Ci0JCWdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5zZXRUYWJsZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvckltcGwoKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZLCBudWxsLCB0aGlzLnRhYmxlR2VuZXJhdG9yKTsKLQkJcmV0dXJuIHRoaXMudGFibGVHZW5lcmF0b3I7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVRhYmxlR2VuZXJhdG9yKCkgewotCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0YWJsZUdlbmVyYXRvciBkb2VzIG5vdCBleGlzdCwgY2Fubm90IGJlIHJlbW92ZWQiKTsKLQkJfQotCQlPcm1UYWJsZUdlbmVyYXRvciBvbGRUYWJsZUdlbmVyYXRvciA9IHRoaXMudGFibGVHZW5lcmF0b3I7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3IgPSBudWxsOwotCQl0aGlzLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5zZXRUYWJsZUdlbmVyYXRvcihudWxsKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZFRhYmxlR2VuZXJhdG9yLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIE9ybVRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZUdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZUdlbmVyYXRvcihPcm1UYWJsZUdlbmVyYXRvciBuZXdUYWJsZUdlbmVyYXRvcikgewotCQlPcm1UYWJsZUdlbmVyYXRvciBvbGRUYWJsZUdlbmVyYXRvciA9IHRoaXMudGFibGVHZW5lcmF0b3I7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3IgPSBuZXdUYWJsZUdlbmVyYXRvcjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZFRhYmxlR2VuZXJhdG9yLCBuZXdUYWJsZUdlbmVyYXRvcik7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYXRvcjxPcm1HZW5lcmF0b3I+IGdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8T3JtR2VuZXJhdG9yPigKLQkJCShnZXRTZXF1ZW5jZUdlbmVyYXRvcigpID09IG51bGwpID8gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpIDogbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcihnZXRTZXF1ZW5jZUdlbmVyYXRvcigpKSwKLQkJCShnZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpID8gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpIDogbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcihnZXRUYWJsZUdlbmVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoU3RyaW5nIG5ld0RlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWU7Ci0JCXRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSA9IG5ld0RlZmF1bHREaXNjcmltaW5hdG9yVmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9ESVNDUklNSU5BVE9SX1ZBTFVFX1BST1BFUlRZLCBvbGREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlLCBuZXdEZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZShTdHJpbmcgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZTsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUgPSBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWU7Ci0JCWdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5zZXREaXNjcmltaW5hdG9yVmFsdWUobmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlLCBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkgOiB0aGlzLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERpc2NyaW1pbmF0b3JWYWx1ZUFsbG93ZWQoYm9vbGVhbiBuZXdEaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkKSB7Ci0JCWJvb2xlYW4gb2xkRGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCA9IHRoaXMuZGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZDsKLQkJdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkID0gbmV3RGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFbnRpdHkuRElTQ1JJTUlOQVRPUl9WQUxVRV9BTExPV0VEX1BST1BFUlRZLCBvbGREaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkLCBuZXdEaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVzZSBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgaW5zdGVhZCIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UGtKb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoZGVmYXVsdFBrSm9pbkNvbHVtbiwgdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLCBPcm1FbnRpdHkuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UGtKb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChkZWZhdWx0UGtKb2luQ29sdW1uLCB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIE9ybUVudGl0eS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpID8gdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgOiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCX0KLQkKLQlwdWJsaWMgaW50IHByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCkgPyB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyk7Ci0JfQotCi0JcHVibGljIGludCBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICF0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JfQkKLQotCXB1YmxpYyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJaWYgKCF0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuY2xlYXIoKTsKLQkJfQotCQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpOwotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oeG1sUHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoaW5kZXgsIHByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJdGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKGluZGV4LCB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0KLQkJdGhpcy5maXJlSXRlbUFkZGVkKEVudGl0eS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCXRoaXMuZmlyZUxpc3RDbGVhcmVkKE9ybUVudGl0eS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQkJcmV0dXJuIHByaW1hcnlLZXlKb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtQmFzZUpvaW5Db2x1bW4uT3duZXIgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4LCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBwcmltYXJ5S2V5Sm9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIEVudGl0eS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLmluZGV4T2YocHJpbWFyeUtleUpvaW5Db2x1bW4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHJlbW92ZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7Ci0JCWlmICghY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJLy9jcmVhdGUgdGhlIGRlZmF1bHRKb2luQ29sdW1uIG5vdyBvciB0aGlzIHdpbGwgaGFwcGVuIGR1cmluZyBwcm9qZWN0IHVwZGF0ZSAKLQkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLiBUaGF0IGNhdXNlcyBwcm9ibGVtcyAKLQkJCS8vaW4gdGhlIFVJIGJlY2F1c2UgdGhlIGNoYW5nZSBub3RpZmljYXRpb25zIGVuZCB1cCBpbiB0aGUgd3Jvbmcgb3JkZXIuCi0JCQlpbml0aWFsaXplRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQl9Ci0JCXRoaXMuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcmVtb3ZlZFByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJaWYgKCF0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpKSB7Ci0JCQlmaXJlTGlzdENoYW5nZWQoT3JtRW50aXR5LkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5fKE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChwcmltYXJ5S2V5Sm9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIEVudGl0eS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+KHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpICsgdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLnNpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoYXR0cmlidXRlT3ZlcnJpZGUsIHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcywgRW50aXR5LlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLCBFbnRpdHkuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlT3ZlcnJpZGUgc2V0QXR0cmlidXRlT3ZlcnJpZGVWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJaWYgKHZpcnR1YWwpIHsKLQkJCXJldHVybiBzZXRBdHRyaWJ1dGVPdmVycmlkZVZpcnR1YWwoYXR0cmlidXRlT3ZlcnJpZGUpOwotCQl9Ci0JCXJldHVybiBzZXRBdHRyaWJ1dGVPdmVycmlkZVNwZWNpZmllZChhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JfQotCQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVPdmVycmlkZSBzZXRBdHRyaWJ1dGVPdmVycmlkZVZpcnR1YWwoT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaW5kZXhPZihhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLnJlbW92ZShpbmRleCk7Ci0JCVN0cmluZyBhdHRyaWJ1dGVPdmVycmlkZU5hbWUgPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCk7Ci0JCS8vYWRkIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZSBzbyB0aGF0IEkgY2FuIGNvbnRyb2wgdGhlIG9yZGVyIHRoYXQgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcyBzZW50LgotCQkvL290aGVyd2lzZSB3aGVuIHdlIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIGphdmEgd2Ugd2lsbCBnZXQgYW4gdXBkYXRlIGFuZCBhZGQgdGhlIGF0dHJpYnV0ZSBvdmVycmlkZQotCQkvL2R1cmluZyB0aGUgdWRwYXRlLiAgVGhpcyBjYXVzZXMgdGhlIFVJIHRvIGJlIGZsYWt5LCBzaW5jZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1pZ2h0IG5vdCBvY2N1ciBpbiB0aGUgY29ycmVjdCBvcmRlcgotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBudWxsOwotCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGVOYW1lICE9IG51bGwpIHsKLQkJCWZvciAoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpKSkgewotCQkJCWlmIChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKS5lcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGVOYW1lKSkgewotCQkJCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgamF2YUF0dHJpYnV0ZU92ZXJyaWRlID0gbnVsbDsKLQkJCQkJaWYgKGdldEphdmFFbnRpdHkoKSAhPSBudWxsKSB7Ci0JCQkJCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChhdHRyaWJ1dGVPdmVycmlkZU5hbWUpOwotCQkJCQl9Ci0JCQkJCS8vc3RvcmUgdGhlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBzbyB3ZSBjYW4gZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGxhdGVyCi0JCQkJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIGphdmFBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQkJCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKEVudGl0eS5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGUpOwotCQkKLQkJaWYgKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSAhPSBudWxsKSB7Ci0JCQlmaXJlSXRlbUFkZGVkKEVudGl0eS5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSAtIDEsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCX0KLQkJcmV0dXJuIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU92ZXJyaWRlIHNldEF0dHJpYnV0ZU92ZXJyaWRlU3BlY2lmaWVkKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIG9sZEF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCWludCBpbmRleCA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKTsKLQkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgeG1sQXR0cmlidXRlT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgbmV3QXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1BdHRyaWJ1dGVPdmVycmlkZSh0aGlzLCBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZU93bmVyKCksIHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKGluZGV4LCBuZXdBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQotCQlnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCi0JCWludCBkZWZhdWx0SW5kZXggPSB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaW5kZXhPZihvbGRBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5yZW1vdmUoZGVmYXVsdEluZGV4KTsKLQotCQluZXdBdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKG9sZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW5ld0F0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUob2xkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKEVudGl0eS5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgZGVmYXVsdEluZGV4LCBvbGRBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChFbnRpdHkuU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgaW5kZXgsIG5ld0F0dHJpYnV0ZU92ZXJyaWRlKTsJCQotCi0JCXJldHVybiBuZXdBdHRyaWJ1dGVPdmVycmlkZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+KHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5zaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoaW50IGluZGV4LCBPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMsIEVudGl0eS5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVfKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMsIEVudGl0eS5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoRW50aXR5LlNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPihzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIGludCBhc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpICsgdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4odGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4odGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyk7Ci0JfQotCi0JcHVibGljIGludCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLnNpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKGludCBpbmRleCwgT3JtQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGFzc29jaWF0aW9uT3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMsIEVudGl0eS5TUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlXyhPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGFzc29jaWF0aW9uT3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMsIEVudGl0eS5TUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChFbnRpdHkuU1BFQ0lGSUVEX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCi0JcHVibGljIE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChPcm1BdHRyaWJ1dGVPdmVycmlkZSkgZ2V0T3ZlcnJpZGVOYW1lZChuYW1lLCBhdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBdHRyaWJ1dGVPdmVycmlkZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCBhdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNEZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgT3JtQXNzb2NpYXRpb25PdmVycmlkZSBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlKSBnZXRPdmVycmlkZU5hbWVkKG5hbWUsIGFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCBhc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNEZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBCYXNlT3ZlcnJpZGUgZ2V0T3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBCYXNlT3ZlcnJpZGU+IG92ZXJyaWRlcykgewotCQlmb3IgKEJhc2VPdmVycmlkZSBvdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvdmVycmlkZXMpKSB7Ci0JCQlTdHJpbmcgb3ZlcnJpZGVOYW1lID0gb3ZlcnJpZGUuZ2V0TmFtZSgpOwotCQkJaWYgKG92ZXJyaWRlTmFtZSA9PSBudWxsICYmIG5hbWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBvdmVycmlkZTsKLQkJCX0KLQkJCWlmIChvdmVycmlkZU5hbWUgIT0gbnVsbCAmJiBvdmVycmlkZU5hbWUuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIG92ZXJyaWRlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb250YWluc092ZXJyaWRlKFN0cmluZyBuYW1lLCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEJhc2VPdmVycmlkZT4gb3ZlcnJpZGVzKSB7Ci0JCXJldHVybiBnZXRPdmVycmlkZU5hbWVkKG5hbWUsIG92ZXJyaWRlcykgIT0gbnVsbDsKLQl9Ci0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5Pih0aGlzLm5hbWVkUXVlcmllcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgbmFtZWRRdWVyaWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZWRRdWVyaWVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE9ybU5hbWVkUXVlcnkgYWRkTmFtZWRRdWVyeShpbnQgaW5kZXgpIHsKLQkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtTmFtZWRRdWVyeSh0aGlzKTsKLQkJdGhpcy5uYW1lZFF1ZXJpZXMuYWRkKGluZGV4LCBuYW1lZFF1ZXJ5KTsKLQkJWG1sTmFtZWRRdWVyeSB4bWxOYW1lZFF1ZXJ5ID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpOwotCQluYW1lZFF1ZXJ5LmluaXRpYWxpemUoeG1sTmFtZWRRdWVyeSk7Ci0JCXRoaXMuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldE5hbWVkUXVlcmllcygpLmFkZChpbmRleCwgeG1sTmFtZWRRdWVyeSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChRdWVyeUhvbGRlci5OQU1FRF9RVUVSSUVTX0xJU1QsIGluZGV4LCBuYW1lZFF1ZXJ5KTsKLQkJcmV0dXJuIG5hbWVkUXVlcnk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVkUXVlcnkoaW50IGluZGV4LCBPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgbmFtZWRRdWVyeSwgdGhpcy5uYW1lZFF1ZXJpZXMsIFF1ZXJ5SG9sZGVyLk5BTUVEX1FVRVJJRVNfTElTVCk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCByZW1vdmVOYW1lZFF1ZXJ5KE5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlyZW1vdmVOYW1lZFF1ZXJ5KHRoaXMubmFtZWRRdWVyaWVzLmluZGV4T2YobmFtZWRRdWVyeSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVOYW1lZFF1ZXJ5KGludCBpbmRleCkgewotCQlPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSB0aGlzLm5hbWVkUXVlcmllcy5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5nZXROYW1lZFF1ZXJpZXMoKS5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoUXVlcnlIb2xkZXIuTkFNRURfUVVFUklFU19MSVNULCBpbmRleCwgbmFtZWRRdWVyeSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5hbWVkUXVlcnlfKE9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QobmFtZWRRdWVyeSwgdGhpcy5uYW1lZFF1ZXJpZXMsIFF1ZXJ5SG9sZGVyLk5BTUVEX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVOYW1lZFF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMubmFtZWRRdWVyaWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5nZXROYW1lZFF1ZXJpZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoUXVlcnlIb2xkZXIuTkFNRURfUVVFUklFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+KHRoaXMubmFtZWROYXRpdmVRdWVyaWVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBuYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgT3JtTmFtZWROYXRpdmVRdWVyeSBhZGROYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCkgewotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1OYW1lZE5hdGl2ZVF1ZXJ5KHRoaXMpOwotCQl0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5hZGQoaW5kZXgsIG5hbWVkTmF0aXZlUXVlcnkpOwotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IHhtbE5hbWVkTmF0aXZlUXVlcnkgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCW5hbWVkTmF0aXZlUXVlcnkuaW5pdGlhbGl6ZSh4bWxOYW1lZE5hdGl2ZVF1ZXJ5KTsKLQkJdGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKGluZGV4LCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoUXVlcnlIb2xkZXIuTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCwgaW5kZXgsIG5hbWVkTmF0aXZlUXVlcnkpOwotCQlyZXR1cm4gbmFtZWROYXRpdmVRdWVyeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgsIE9ybU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBuYW1lZE5hdGl2ZVF1ZXJ5LCB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgUXVlcnlIb2xkZXIuTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5KSB7Ci0JCXRoaXMucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSh0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5pbmRleE9mKG5hbWVkTmF0aXZlUXVlcnkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpIHsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFF1ZXJ5SG9sZGVyLk5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QsIGluZGV4LCBuYW1lZE5hdGl2ZVF1ZXJ5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5XyhPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KG5hbWVkTmF0aXZlUXVlcnksIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLCBRdWVyeUhvbGRlci5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIG1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoUXVlcnlIb2xkZXIuTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8T3JtUXVlcnk+IHF1ZXJpZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8T3JtUXVlcnk+KHRoaXMubmFtZWRRdWVyaWVzKCksIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuaWRDbGFzczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SWRDbGFzcyhTdHJpbmcgbmV3SWRDbGFzcykgewotCQlTdHJpbmcgb2xkSWRDbGFzcyA9IHRoaXMuaWRDbGFzczsKLQkJdGhpcy5pZENsYXNzID0gbmV3SWRDbGFzczsKLQkJaWYgKG9sZElkQ2xhc3MgIT0gbmV3SWRDbGFzcykgewotCQkJaWYgKHRoaXMuaWRDbGFzc1Jlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuaWRDbGFzc1Jlc291cmNlKCkuc2V0Q2xhc3NOYW1lKG5ld0lkQ2xhc3MpOwkJCQkJCQotCQkJCWlmICh0aGlzLmlkQ2xhc3NSZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZUlkQ2xhc3NSZXNvdXJjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld0lkQ2xhc3MgIT0gbnVsbCkgewotCQkJCWFkZElkQ2xhc3NSZXNvdXJjZSgpOwotCQkJCWlkQ2xhc3NSZXNvdXJjZSgpLnNldENsYXNzTmFtZShuZXdJZENsYXNzKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElkQ2xhc3MuSURfQ0xBU1NfUFJPUEVSVFksIG9sZElkQ2xhc3MsIG5ld0lkQ2xhc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRJZENsYXNzXyhTdHJpbmcgbmV3SWRDbGFzcykgewotCQlTdHJpbmcgb2xkSWRDbGFzcyA9IHRoaXMuaWRDbGFzczsKLQkJdGhpcy5pZENsYXNzID0gbmV3SWRDbGFzczsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChJZENsYXNzLklEX0NMQVNTX1BST1BFUlRZLCBvbGRJZENsYXNzLCBuZXdJZENsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sSWRDbGFzcyBpZENsYXNzUmVzb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0SWRDbGFzcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZENsYXNzUmVzb3VyY2UoKSB7Ci0JCWdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5zZXRJZENsYXNzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbElkQ2xhc3MoKSk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSWRDbGFzc1Jlc291cmNlKCkgewotCQlnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0SWRDbGFzcyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5IGdldFBhcmVudEVudGl0eSgpIHsKLQkJZm9yIChJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4gaSA9IGdldFBlcnNpc3RlbnRUeXBlKCkuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IGkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCWlmICh0eXBlTWFwcGluZyAhPSB0aGlzICYmIHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJcmV0dXJuIChFbnRpdHkpIHR5cGVNYXBwaW5nOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBFbnRpdHkgZ2V0Um9vdEVudGl0eSgpIHsKLQkJRW50aXR5IHJvb3RFbnRpdHkgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlPiBpID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5pbmhlcml0YW5jZUhpZXJhcmNoeSgpOyBpLmhhc05leHQoKTspIHsKLQkJCVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gaS5uZXh0KCk7Ci0JCQlpZiAocGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJcm9vdEVudGl0eSA9IChFbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9vdEVudGl0eTsKLQl9Ci0KLS8vCXB1YmxpYyBTdHJpbmcgcHJpbWFyeUtleUNvbHVtbk5hbWUoKSB7Ci0vLwkJU3RyaW5nIHBrQ29sdW1uTmFtZSA9IG51bGw7Ci0vLwkJZm9yIChJdGVyYXRvcjxJUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0vLwkJCUlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0vLwkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlLnByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0vLwkJCWlmIChwa0NvbHVtbk5hbWUgPT0gbnVsbCkgewotLy8JCQkJcGtDb2x1bW5OYW1lID0gbmFtZTsKLS8vCQkJfQotLy8JCQllbHNlIGlmIChuYW1lICE9IG51bGwpIHsKLS8vCQkJCS8vIGlmIHdlIGVuY291bnRlciBhIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgcmV0dXJuIG51bGwKLS8vCQkJCXJldHVybiBudWxsOwotLy8JCQl9Ci0vLwkJfQotLy8JCS8vIGlmIHdlIGVuY291bnRlciBvbmx5IGEgc2luZ2xlIHByaW1hcnkga2V5IGNvbHVtbiBuYW1lLCByZXR1cm4gaXQKLS8vCQlyZXR1cm4gcGtDb2x1bW5OYW1lOwotLy8JfQotLy8KLS8vCXB1YmxpYyBTdHJpbmcgcHJpbWFyeUtleUF0dHJpYnV0ZU5hbWUoKSB7Ci0vLwkJU3RyaW5nIHBrQ29sdW1uTmFtZSA9IG51bGw7Ci0vLwkJU3RyaW5nIHBrQXR0cmlidXRlTmFtZSA9IG51bGw7Ci0vLwkJZm9yIChJdGVyYXRvcjxJUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0vLwkJCUlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0vLwkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlLnByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0vLwkJCWlmIChwa0NvbHVtbk5hbWUgPT0gbnVsbCkgewotLy8JCQkJcGtDb2x1bW5OYW1lID0gbmFtZTsKLS8vCQkJCXBrQXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0vLwkJCX0KLS8vCQkJZWxzZSBpZiAobmFtZSAhPSBudWxsKSB7Ci0vLwkJCQkvLyBpZiB3ZSBlbmNvdW50ZXIgYSBjb21wb3NpdGUgcHJpbWFyeSBrZXksIHJldHVybiBudWxsCi0vLwkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJfQotLy8JCX0KLS8vCQkvLyBpZiB3ZSBlbmNvdW50ZXIgb25seSBhIHNpbmdsZSBwcmltYXJ5IGtleSBjb2x1bW4gbmFtZSwgcmV0dXJuIGl0Ci0vLwkJcmV0dXJuIHBrQXR0cmlidXRlTmFtZTsKLS8vCX0KLS8vCi0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvZiBFbnRpdGllcywgZWFjaCB3aGljaCBpbmhlcml0cyBmcm9tIHRoZSBvbmUgYmVmb3JlLAotCSAqIGFuZCB0ZXJtaW5hdGVzIGF0IHRoZSByb290IGVudGl0eSAob3IgYXQgdGhlIHBvaW50IG9mIGN5Y2xpY2l0eSkuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFR5cGVNYXBwaW5nPiBpbmhlcml0YW5jZUhpZXJhcmNoeSgpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlLCBUeXBlTWFwcGluZz4oZ2V0UGVyc2lzdGVudFR5cGUoKS5pbmhlcml0YW5jZUhpZXJhcmNoeSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUeXBlTWFwcGluZyB0cmFuc2Zvcm0oUGVyc2lzdGVudFR5cGUgdHlwZSkgewotCQkJCXJldHVybiB0eXBlLmdldE1hcHBpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUeXBlTWFwcGluZywgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4+KHRoaXMuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gdHJhbnNmb3JtKFR5cGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCQlyZXR1cm4gbWFwcGluZy5vdmVycmlkYWJsZUF0dHJpYnV0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFR5cGVNYXBwaW5nLCBJdGVyYXRvcjxTdHJpbmc+Pih0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdHJhbnNmb3JtKFR5cGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCQlyZXR1cm4gbWFwcGluZy5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFR5cGVNYXBwaW5nLCBJdGVyYXRvcjxTdHJpbmc+Pih0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdHJhbnNmb3JtKFR5cGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCQlyZXR1cm4gbWFwcGluZy5vdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0vLwotLy8JcHVibGljIElBdHRyaWJ1dGVPdmVycmlkZSBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZShpbnQgaW5kZXgpIHsKLS8vCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUobmV3IElFbnRpdHkuQXR0cmlidXRlT3ZlcnJpZGVPd25lcih0aGlzKSk7Ci0vLwl9Ci0vLwotLy8JcHVibGljIElBc3NvY2lhdGlvbk92ZXJyaWRlIGNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGUoaW50IGluZGV4KSB7Ci0vLwkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUobmV3IElFbnRpdHkuQXNzb2NpYXRpb25PdmVycmlkZU93bmVyKHRoaXMpKTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgSUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLS8vCQlyZXR1cm4gKElBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGVOYW1lZChuYW1lLCBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0vLwl9Ci0vLwotLy8JcHVibGljIGJvb2xlYW4gY29udGFpbnNBdHRyaWJ1dGVPdmVycmlkZShTdHJpbmcgbmFtZSkgewotLy8JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKFN0cmluZyBuYW1lKSB7Ci0vLwkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgZ2V0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotLy8JfQotLy8KLS8vCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgewotLy8JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotLy8JfQotLy8KLS8vCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgewotLy8JCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIGdldFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotLy8JfQotLy8KLS8vCXByaXZhdGUgSU92ZXJyaWRlIG92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUsIExpc3Q8PyBleHRlbmRzIElPdmVycmlkZT4gb3ZlcnJpZGVzKSB7Ci0vLwkJZm9yIChJT3ZlcnJpZGUgb3ZlcnJpZGUgOiBvdmVycmlkZXMpIHsKLS8vCQkJU3RyaW5nIG92ZXJyaWRlTmFtZSA9IG92ZXJyaWRlLmdldE5hbWUoKTsKLS8vCQkJaWYgKG92ZXJyaWRlTmFtZSA9PSBudWxsICYmIG5hbWUgPT0gbnVsbCkgewotLy8JCQkJcmV0dXJuIG92ZXJyaWRlOwotLy8JCQl9Ci0vLwkJCWlmIChvdmVycmlkZU5hbWUgIT0gbnVsbCAmJiBvdmVycmlkZU5hbWUuZXF1YWxzKG5hbWUpKSB7Ci0vLwkJCQlyZXR1cm4gb3ZlcnJpZGU7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zT3ZlcnJpZGUoU3RyaW5nIG5hbWUsIExpc3Q8PyBleHRlbmRzIElPdmVycmlkZT4gb3ZlcnJpZGVzKSB7Ci0vLwkJcmV0dXJuIG92ZXJyaWRlTmFtZWQobmFtZSwgb3ZlcnJpZGVzKSAhPSBudWxsOwotLy8JfQotLy8KLS8vCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotLy8JCXJldHVybiAhdGhpcy5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCk7Ci0vLwl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxFbnRpdHkgZW50aXR5KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoZW50aXR5KTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gZW50aXR5LmdldE5hbWUoKTsKLQkJdGhpcy5kZWZhdWx0TmFtZSA9IHRoaXMuZGVmYXVsdE5hbWUoKTsKLQkJdGhpcy5pbml0aWFsaXplSW5oZXJpdGFuY2UodGhpcy5pbmhlcml0YW5jZVJlc291cmNlKCkpOwotCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4uaW5pdGlhbGl6ZShlbnRpdHkpOwotCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSA9IGVudGl0eS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlID0gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCA9IHRoaXMuZGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkKCk7Ci0JCXRoaXMudGFibGUuaW5pdGlhbGl6ZShlbnRpdHkpOwotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoZW50aXR5KTsKLQkJdGhpcy5pbml0aWFsaXplVmlydHVhbFNlY29uZGFyeVRhYmxlcygpOwotCQl0aGlzLmluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvcihlbnRpdHkpOwotCQl0aGlzLmluaXRpYWxpemVUYWJsZUdlbmVyYXRvcihlbnRpdHkpOwotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoZW50aXR5KTsKLQkJdGhpcy5pbml0aWFsaXplRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoZW50aXR5KTsKLQkJdGhpcy5pbml0aWFsaXplVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyhlbnRpdHkpOwotCQl0aGlzLmluaXRpYWxpemVOYW1lZFF1ZXJpZXMoZW50aXR5KTsKLQkJdGhpcy5pbml0aWFsaXplTmFtZWROYXRpdmVRdWVyaWVzKGVudGl0eSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUlkQ2xhc3ModGhpcy5pZENsYXNzUmVzb3VyY2UoKSk7Ci0JCXRoaXMudXBkYXRlUGVyc2lzdGVuY2VVbml0R2VuZXJhdG9yc0FuZFF1ZXJpZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUluaGVyaXRhbmNlKEluaGVyaXRhbmNlIGluaGVyaXRhbmNlUmVzb3VyY2UpIHsKLQkJdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KGluaGVyaXRhbmNlUmVzb3VyY2UpOwotCQl0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gdGhpcy5kZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoWG1sRW50aXR5IGVudGl0eSkgewotCQlmb3IgKFhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlIDogZW50aXR5LmdldFNlY29uZGFyeVRhYmxlcygpKSB7Ci0JCQl0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5hZGQoYnVpbGRTZWNvbmRhcnlUYWJsZShzZWNvbmRhcnlUYWJsZSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkgewotCQlpZiAoaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZ2V0SmF2YUVudGl0eSgpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpID4gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUxpc3RJdGVyYXRvcjxKYXZhU2Vjb25kYXJ5VGFibGU+IGphdmFTZWNvbmRhcnlUYWJsZXMgPSBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7Ci0JCXdoaWxlKGphdmFTZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhU2Vjb25kYXJ5VGFibGUgamF2YVNlY29uZGFyeVRhYmxlID0gamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCk7Ci0JCQlpZiAoamF2YVNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzLmFkZChidWlsZFZpcnR1YWxTZWNvbmRhcnlUYWJsZShqYXZhU2Vjb25kYXJ5VGFibGUpKTsKLQkJCX0KLQkJfQotCX0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCWlmIChpc01ldGFkYXRhQ29tcGxldGUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXRKYXZhRW50aXR5KCkgPT0gbnVsbCkgewotCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLmFkZChidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG51bGwpKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpID4gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IGphdmFQa0pvaW5Db2x1bW5zID0gZ2V0SmF2YUVudGl0eSgpLnByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQl3aGlsZShqYXZhUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqYXZhUGtKb2luQ29sdW1uID0gamF2YVBrSm9pbkNvbHVtbnMubmV4dCgpOwotCQkJaWYgKGphdmFQa0pvaW5Db2x1bW4uZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuYWRkKGJ1aWxkVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uKGphdmFQa0pvaW5Db2x1bW4pKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUYWJsZUdlbmVyYXRvcihYbWxFbnRpdHkgZW50aXR5KSB7Ci0JCWlmIChlbnRpdHkuZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnRhYmxlR2VuZXJhdG9yID0gYnVpbGRUYWJsZUdlbmVyYXRvcihlbnRpdHkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybVRhYmxlR2VuZXJhdG9yIGJ1aWxkVGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSkgewotCQlPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVRhYmxlR2VuZXJhdG9yKHRoaXMpOwotCQl0YWJsZUdlbmVyYXRvci5pbml0aWFsaXplKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpOwotCQlyZXR1cm4gdGFibGVHZW5lcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9yKFhtbEVudGl0eSBlbnRpdHkpIHsKLQkJaWYgKGVudGl0eS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBidWlsZFNlcXVlbmNlR2VuZXJhdG9yKGVudGl0eS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvciB4bWxTZXF1ZW5jZUdlbmVyYXRvcikgewotCQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVNlcXVlbmNlR2VuZXJhdG9yKHRoaXMpOwotCQlzZXF1ZW5jZUdlbmVyYXRvci5pbml0aWFsaXplKHhtbFNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoWG1sRW50aXR5IGVudGl0eSkgewotCQlmb3IgKFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uIDogZW50aXR5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihwcmltYXJ5S2V5Sm9pbkNvbHVtbikpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoWG1sRW50aXR5IGVudGl0eSkgewotCQlmb3IgKFhtbEF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlIDogZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpKSB7Ci0JCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoYnVpbGRBdHRyaWJ1dGVPdmVycmlkZShhdHRyaWJ1dGVPdmVycmlkZSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlmb3IgKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSkpIHsKLQkJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGUgPT0gbnVsbCkgewotCQkJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBudWxsOwotCQkJCWlmIChnZXRKYXZhRW50aXR5KCkgIT0gbnVsbCkgewotCQkJCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUocGVyc2lzdGVudEF0dHJpYnV0ZSwgamF2YUF0dHJpYnV0ZU92ZXJyaWRlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgamF2YUF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCXJldHVybiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlKGJ1aWxkVmlydHVhbFhtbEF0dHJpYnV0ZU92ZXJyaWRlKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIGphdmFBdHRyaWJ1dGVPdmVycmlkZSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGUoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgamF2YUF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCVhtbENvbHVtbiB4bWxDb2x1bW47Ci0JCWlmIChqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPT0gbnVsbCkgewotCQkJQ29sdW1uTWFwcGluZyBjb2x1bW5NYXBwaW5nID0gKENvbHVtbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkJeG1sQ29sdW1uID0gbmV3IFZpcnR1YWxYbWxDb2x1bW4odGhpcywgY29sdW1uTWFwcGluZy5nZXRDb2x1bW4oKSwgZmFsc2UpOwkJCi0JCX0KLQkJZWxzZSB7Ci0JCQl4bWxDb2x1bW4gPSBuZXcgVmlydHVhbFhtbENvbHVtbih0aGlzLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCksIGlzTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJfQotCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSwgeG1sQ29sdW1uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKFhtbEVudGl0eSBlbnRpdHkpIHsKLQkJZm9yIChYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgOiBlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5hZGQoYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlKGFzc29jaWF0aW9uT3ZlcnJpZGUpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTmFtZWRRdWVyaWVzKFhtbEVudGl0eSBlbnRpdHkpIHsKLQkJZm9yIChYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgOiBlbnRpdHkuZ2V0TmFtZWRRdWVyaWVzKCkpIHsKLQkJCXRoaXMubmFtZWRRdWVyaWVzLmFkZChidWlsZE5hbWVkUXVlcnkobmFtZWRRdWVyeSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVOYW1lZE5hdGl2ZVF1ZXJpZXMoWG1sRW50aXR5IGVudGl0eSkgewotCQlmb3IgKFhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA6IGVudGl0eS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSkgewotCQkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuYWRkKGJ1aWxkTmFtZWROYXRpdmVRdWVyeShuYW1lZE5hdGl2ZVF1ZXJ5KSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUlkQ2xhc3MoWG1sSWRDbGFzcyBpZENsYXNzUmVzb3VyY2UpIHsKLQkJdGhpcy5pZENsYXNzID0gdGhpcy5pZENsYXNzKGlkQ2xhc3NSZXNvdXJjZSk7CQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgaWRDbGFzcyhYbWxJZENsYXNzIGlkQ2xhc3NSZXNvdXJjZSkgewotCQlyZXR1cm4gaWRDbGFzc1Jlc291cmNlID09IG51bGwgPyBudWxsIDogaWRDbGFzc1Jlc291cmNlLmdldENsYXNzTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxFbnRpdHkgZW50aXR5KSB7Ci0JCXN1cGVyLnVwZGF0ZShlbnRpdHkpOwotCQl0aGlzLnNldFNwZWNpZmllZE5hbWUoZW50aXR5LmdldE5hbWUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdE5hbWUodGhpcy5kZWZhdWx0TmFtZSgpKTsKLQkJdGhpcy51cGRhdGVJbmhlcml0YW5jZSh0aGlzLmluaGVyaXRhbmNlUmVzb3VyY2UoKSk7Ci0JCXRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi51cGRhdGUoZW50aXR5KTsKLQkJdGhpcy5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoZW50aXR5LmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKGRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCXRoaXMuc2V0RGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCh0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCgpKTsKLQkJdGhpcy50YWJsZS51cGRhdGUoZW50aXR5KTsKLQkJdGhpcy51cGRhdGVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoZW50aXR5KTsKLQkJdGhpcy51cGRhdGVWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCXRoaXMudXBkYXRlU2VxdWVuY2VHZW5lcmF0b3IoZW50aXR5KTsKLQkJdGhpcy51cGRhdGVUYWJsZUdlbmVyYXRvcihlbnRpdHkpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyhlbnRpdHkpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJdGhpcy51cGRhdGVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoZW50aXR5KTsKLQkJdGhpcy51cGRhdGVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCXRoaXMudXBkYXRlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoZW50aXR5KTsKLQkJdGhpcy51cGRhdGVOYW1lZFF1ZXJpZXMoZW50aXR5KTsKLQkJdGhpcy51cGRhdGVOYW1lZE5hdGl2ZVF1ZXJpZXMoZW50aXR5KTsKLQkJdGhpcy51cGRhdGVJZENsYXNzKHRoaXMuaWRDbGFzc1Jlc291cmNlKCkpOwotCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlVW5pdEdlbmVyYXRvcnNBbmRRdWVyaWVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZSgpIHsKLQkJaWYgKCFpc01ldGFkYXRhQ29tcGxldGUoKSkgewotCQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQkJaWYgKGphdmFFbnRpdHkgIT0gbnVsbCkgewotCQkJCXJldHVybiBqYXZhRW50aXR5LmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NfKCk7Ci0JCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIENsYXNzVG9vbHMuc2hvcnROYW1lRm9yQ2xhc3NOYW1lZChjbGFzc05hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSB7Ci0JCS8vVE9ETyBkZWZhdWx0IGRpc2NyaW1pbmF0b3IgdmFsdWUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGRpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCgpIHsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpOwotCQlyZXR1cm4gamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgPT0gbnVsbCA/IGZhbHNlIDogIWphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmlzQWJzdHJhY3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJbmhlcml0YW5jZShJbmhlcml0YW5jZSBpbmhlcml0YW5jZVJlc291cmNlKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneV8odGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KGluaGVyaXRhbmNlUmVzb3VyY2UpKTsKLQkJdGhpcy5zZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSh0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoWG1sRW50aXR5IGVudGl0eSkgewotCQlMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQlMaXN0SXRlcmF0b3I8WG1sU2Vjb25kYXJ5VGFibGU+IHJlc291cmNlU2Vjb25kYXJ5VGFibGVzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbFNlY29uZGFyeVRhYmxlPihlbnRpdHkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQkKLQkJd2hpbGUgKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCQlzZWNvbmRhcnlUYWJsZS51cGRhdGUocmVzb3VyY2VTZWNvbmRhcnlUYWJsZXMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlXyhzZWNvbmRhcnlUYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZVNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKHNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSwgYnVpbGRTZWNvbmRhcnlUYWJsZShyZXNvdXJjZVNlY29uZGFyeVRhYmxlcy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQkvL2lmIGFueSBzZWNvbmRhcnktdGFibGVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHhtbCBmaWxlLCB0aGVuIGFsbCBvZiB0aGUgamF2YSBzZWNvbmRhcnlUYWJsZXMgYXJlIG92ZXJyaWRlbgotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gdmlydHVhbFNlY29uZGFyeVRhYmxlcygpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVNlY29uZGFyeVRhYmxlPiBqYXZhU2Vjb25kYXJ5VGFibGVzID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCi0JCWlmIChnZXRKYXZhRW50aXR5KCkgIT0gbnVsbCAmJiAhaXNNZXRhZGF0YUNvbXBsZXRlKCkgJiYgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpID09IDApIHsKLQkJCWphdmFTZWNvbmRhcnlUYWJsZXMgPSBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7Ci0JCX0KLQkJd2hpbGUgKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCU9ybVNlY29uZGFyeVRhYmxlIHZpcnR1YWxTZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXh0KCk7Ci0JCQlpZiAoamF2YVNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhU2Vjb25kYXJ5VGFibGUgamF2YVNlY29uZGFyeVRhYmxlID0gamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCk7Ci0JCQkJdmlydHVhbFNlY29uZGFyeVRhYmxlLnVwZGF0ZShuZXcgVmlydHVhbFhtbFNlY29uZGFyeVRhYmxlKGphdmFTZWNvbmRhcnlUYWJsZSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlVmlydHVhbFNlY29uZGFyeVRhYmxlKHZpcnR1YWxTZWNvbmRhcnlUYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChqYXZhU2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSkgewotCQkJSmF2YVNlY29uZGFyeVRhYmxlIGphdmFTZWNvbmRhcnlUYWJsZSA9IGphdmFTZWNvbmRhcnlUYWJsZXMubmV4dCgpOwotCQkJYWRkVmlydHVhbFNlY29uZGFyeVRhYmxlKGJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlKGphdmFTZWNvbmRhcnlUYWJsZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVNlY29uZGFyeVRhYmxlIGJ1aWxkU2Vjb25kYXJ5VGFibGUoWG1sU2Vjb25kYXJ5VGFibGUgeG1sU2Vjb25kYXJ5VGFibGUpIHsKLQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVNlY29uZGFyeVRhYmxlKHRoaXMsIHhtbFNlY29uZGFyeVRhYmxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybVNlY29uZGFyeVRhYmxlIGJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlKEphdmFTZWNvbmRhcnlUYWJsZSBqYXZhU2Vjb25kYXJ5VGFibGUpIHsKLQkJcmV0dXJuIGJ1aWxkU2Vjb25kYXJ5VGFibGUobmV3IFZpcnR1YWxYbWxTZWNvbmRhcnlUYWJsZShqYXZhU2Vjb25kYXJ5VGFibGUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGFibGVHZW5lcmF0b3IoWG1sRW50aXR5IGVudGl0eSkgewotCQlpZiAoZW50aXR5LmdldFRhYmxlR2VuZXJhdG9yKCkgPT0gbnVsbCkgewotCQkJaWYgKGdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJCXNldFRhYmxlR2VuZXJhdG9yKG51bGwpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldFRhYmxlR2VuZXJhdG9yKCkgPT0gbnVsbCkgewotCQkJCXNldFRhYmxlR2VuZXJhdG9yKGJ1aWxkVGFibGVHZW5lcmF0b3IoZW50aXR5LmdldFRhYmxlR2VuZXJhdG9yKCkpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWdldFRhYmxlR2VuZXJhdG9yKCkudXBkYXRlKGVudGl0eS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZXF1ZW5jZUdlbmVyYXRvcihYbWxFbnRpdHkgZW50aXR5KSB7Ci0JCWlmIChlbnRpdHkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihlbnRpdHkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS51cGRhdGUoZW50aXR5LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZSBzcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlIGluaGVyaXRhbmNlUmVzb3VyY2UpIHsKLQkJaWYgKGluaGVyaXRhbmNlUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIEluaGVyaXRhbmNlVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbChpbmhlcml0YW5jZVJlc291cmNlLmdldFN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIGRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgewotCQlpZiAoaW5oZXJpdGFuY2VSZXNvdXJjZSgpID09IG51bGwgJiYgIWlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlpZiAoZ2V0SmF2YUVudGl0eSgpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0SmF2YUVudGl0eSgpLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKTsKLQkJCX0KLQkJfQotCQlpZiAoZ2V0Um9vdEVudGl0eSgpID09IHRoaXMpIHsKLQkJCXJldHVybiBJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFOwotCQl9Ci0JCXJldHVybiBnZXRSb290RW50aXR5KCkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoWG1sRW50aXR5IGVudGl0eSkgewotCQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPihlbnRpdHkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQkKLQkJd2hpbGUgKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uID0gcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbi51cGRhdGUocmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uXyhwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSwgYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQkvL2lmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWVkIHBrSm9pbkNvbHVtbnMsIHRoZW4gbm8gZGVmYXVsdCBwa0pvaW5Db2x1bW5zCi0JLy9pZiB0aGUgamF2YSBoYXMgc3BlY2lmaWVkIHBrSm9pbkNvbHVtbnMsIHRoZW4gdGhvc2UgYXJlIHRoZSBkZWZhdWx0IHBrSm9pbkNvbHVtbnMKLQkvL290aGVyd2lzZSwganVzdCAxIHBrSm9pbkNvbHVtbiwgZGVmYXVsdHMgYmVpbmcgbnVsbCBpZiBtdWx0aXBsZSBwcmltYXJ5S2V5IGNvbHVtbnMKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGRlZmF1bHRQa0pvaW5Db2x1bW5zID0gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBqYXZhUGtKb2luQ29sdW1ucyA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQotCQlpZiAoZ2V0SmF2YUVudGl0eSgpICE9IG51bGwgJiYgIWlzTWV0YWRhdGFDb21wbGV0ZSgpICYmIHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSA9PSAwKSB7Ci0JCQlqYXZhUGtKb2luQ29sdW1ucyA9IGdldEphdmFFbnRpdHkoKS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJfQotCQl3aGlsZSAoZGVmYXVsdFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UGtKb2luQ29sdW1uID0gZGVmYXVsdFBrSm9pbkNvbHVtbnMubmV4dCgpOwotCQkJaWYgKGphdmFQa0pvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqYXZhUGtKb2luQ29sdW1uID0gamF2YVBrSm9pbkNvbHVtbnMubmV4dCgpOwotCQkJCWRlZmF1bHRQa0pvaW5Db2x1bW4udXBkYXRlKG5ldyBWaXJ0dWFsWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oamF2YVBrSm9pbkNvbHVtbikpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgPT0gMSkgewotCQkJCQlkZWZhdWx0UGtKb2luQ29sdW1uLnVwZGF0ZShudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlbW92ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihkZWZhdWx0UGtKb2luQ29sdW1uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChqYXZhUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqYXZhUGtKb2luQ29sdW1uID0gamF2YVBrSm9pbkNvbHVtbnMubmV4dCgpOwotCQkJYWRkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKGJ1aWxkVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uKGphdmFQa0pvaW5Db2x1bW4pKTsKLQkJfQotCQkKLQkJaWYgKGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgPT0gMCAmJiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgPT0gMCkgewotCQkJYWRkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4obnVsbCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZFZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gamF2YVNlY29uZGFyeVRhYmxlKSB7Ci0JCXJldHVybiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG5ldyBWaXJ0dWFsWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oamF2YVNlY29uZGFyeVRhYmxlKSk7Ci0JfQotCQotCXByb3RlY3RlZCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uKSB7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcywgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpKTsKLQkJb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uaW5pdGlhbGl6ZShwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCXJldHVybiBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoWG1sRW50aXR5IGVudGl0eSkgewotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbEF0dHJpYnV0ZU92ZXJyaWRlPihlbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQkKLQkJd2hpbGUgKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCQlhdHRyaWJ1dGVPdmVycmlkZS51cGRhdGUocmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlXyhhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSwgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZShyZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgewotCQlJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQkKLQkJZm9yIChQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3ZlcnJpZGFibGVBdHRyaWJ1dGVzKSkgewotCQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCWlmIChvcm1BdHRyaWJ1dGVPdmVycmlkZSAhPSBudWxsICYmICFvcm1BdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGphdmFBdHRyaWJ1dGVPdmVycmlkZSA9IG51bGw7Ci0JCQlpZiAoZ2V0SmF2YUVudGl0eSgpICE9IG51bGwpIHsKLQkJCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlpZiAob3JtQXR0cmlidXRlT3ZlcnJpZGUgIT0gbnVsbCkgewotCQkJCWlmICh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSkgewotCQkJCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJCQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLnVwZGF0ZShidWlsZFZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZShwZXJzaXN0ZW50QXR0cmlidXRlLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWFkZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShwZXJzaXN0ZW50QXR0cmlidXRlLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUocGVyc2lzdGVudEF0dHJpYnV0ZSwgamF2YUF0dHJpYnV0ZU92ZXJyaWRlKSk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChPcm1BdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcykpIHsKLQkJCXJlbW92ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVPdmVycmlkZSBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlKFhtbEF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1BdHRyaWJ1dGVPdmVycmlkZSh0aGlzLCBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZU93bmVyKCksIGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVPdmVycmlkZU93bmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoWG1sRW50aXR5IGVudGl0eSkgewotCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlMaXN0SXRlcmF0b3I8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gcmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPihlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCQotCQl3aGlsZSAoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKLQkJCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnVwZGF0ZShyZXNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlXyhhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpLCBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGUocmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtQXNzb2NpYXRpb25PdmVycmlkZSBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGUoWG1sQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlKHRoaXMsIGNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGVPd25lcigpLCBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXNzb2NpYXRpb25PdmVycmlkZS5Pd25lciBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZU93bmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU5hbWVkUXVlcmllcyhYbWxFbnRpdHkgZW50aXR5KSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBuYW1lZFF1ZXJpZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbE5hbWVkUXVlcnk+IHJlc291cmNlTmFtZWRRdWVyaWVzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbE5hbWVkUXVlcnk+KGVudGl0eS5nZXROYW1lZFF1ZXJpZXMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCQotCQl3aGlsZSAobmFtZWRRdWVyaWVzLmhhc05leHQoKSkgewotCQkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gbmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZU5hbWVkUXVlcmllcy5oYXNOZXh0KCkpIHsKLQkJCQluYW1lZFF1ZXJ5LnVwZGF0ZShyZXNvdXJjZU5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlTmFtZWRRdWVyeV8obmFtZWRRdWVyeSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZU5hbWVkUXVlcmllcy5oYXNOZXh0KCkpIHsKLQkJCWFkZE5hbWVkUXVlcnkobmFtZWRRdWVyaWVzU2l6ZSgpLCBidWlsZE5hbWVkUXVlcnkocmVzb3VyY2VOYW1lZFF1ZXJpZXMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtTmFtZWRRdWVyeSBidWlsZE5hbWVkUXVlcnkoWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5KSB7Ci0JCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybU5hbWVkUXVlcnkodGhpcyk7Ci0JCW9ybU5hbWVkUXVlcnkuaW5pdGlhbGl6ZShuYW1lZFF1ZXJ5KTsKLQkJcmV0dXJuIG9ybU5hbWVkUXVlcnk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTmFtZWROYXRpdmVRdWVyaWVzKFhtbEVudGl0eSBlbnRpdHkpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcyA9IG5hbWVkTmF0aXZlUXVlcmllcygpOwotCQlMaXN0SXRlcmF0b3I8WG1sTmFtZWROYXRpdmVRdWVyeT4gcmVzb3VyY2VOYW1lZE5hdGl2ZVF1ZXJpZXMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sTmFtZWROYXRpdmVRdWVyeT4oZW50aXR5LmdldE5hbWVkTmF0aXZlUXVlcmllcygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJCi0JCXdoaWxlIChuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkUXVlcnkgPSBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlTmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSkgewotCQkJCW5hbWVkUXVlcnkudXBkYXRlKHJlc291cmNlTmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5XyhuYW1lZFF1ZXJ5KTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlTmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSkgewotCQkJYWRkTmFtZWROYXRpdmVRdWVyeShuYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCksIGJ1aWxkTmFtZWROYXRpdmVRdWVyeShyZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1OYW1lZE5hdGl2ZVF1ZXJ5IGJ1aWxkTmFtZWROYXRpdmVRdWVyeShYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkUXVlcnkpIHsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtTmFtZWROYXRpdmVRdWVyeSh0aGlzKTsKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5pbml0aWFsaXplKG5hbWVkUXVlcnkpOwotCQlyZXR1cm4gb3JtTmFtZWROYXRpdmVRdWVyeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSWRDbGFzcyhYbWxJZENsYXNzIGlkQ2xhc3NSZXNvdXJjZSkgewotCQl0aGlzLnNldElkQ2xhc3NfKHRoaXMuaWRDbGFzcyhpZENsYXNzUmVzb3VyY2UpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGVyc2lzdGVuY2VVbml0R2VuZXJhdG9yc0FuZFF1ZXJpZXMoKSB7Ci0JCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZEdlbmVyYXRvcihnZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJfQotCQkKLQkJaWYgKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkR2VuZXJhdG9yKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQl9Ci0JCQotCQlmb3IgKFF1ZXJ5IHF1ZXJ5IDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG5hbWVkUXVlcmllcygpKSkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkUXVlcnkocXVlcnkpOwotCQl9Ci0JCQotCQlmb3IgKFF1ZXJ5IHF1ZXJ5IDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG5hbWVkTmF0aXZlUXVlcmllcygpKSkgewotCQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkUXVlcnkocXVlcnkpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCkpOwotCX0KLQkKLQkvL2NvcGllZCBpbiBHZW5lcmljSmF2YUVudGl0eSB0byBhdm9pZCBhbiBBUEkgY2hhbmdlIGZvciBmaXhpbmcgYnVnIDIyOTQyMyBpbiBSQzEKLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nIHBrQ29sdW1uTmFtZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gYXR0cmlidXRlczsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlLmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJLy9pZiB0aGUgYXR0cmlidXRlIGlzIGEgcHJpbWFyeSBrZXkgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGlzIGFuIGF0dHJpYnV0ZSBvdmVycmlkZQotCQkJCS8vYW5kIHVzZSBpdHMgY29sdW1uIG5hbWUgaW5zdGVhZCAoYnVnIDIyOTQyMykKLQkJCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlICE9IG51bGwpIHsKLQkJCQkJbmFtZSA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocGtDb2x1bW5OYW1lID09IG51bGwpIHsKLQkJCQlwa0NvbHVtbk5hbWUgPSBuYW1lOwotCQkJfQotCQkJZWxzZSBpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJLy8gaWYgd2UgZW5jb3VudGVyIGEgY29tcG9zaXRlIHByaW1hcnkga2V5LCByZXR1cm4gbnVsbAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCS8vIGlmIHdlIGVuY291bnRlciBvbmx5IGEgc2luZ2xlIHByaW1hcnkga2V5IGNvbHVtbiBuYW1lLCByZXR1cm4gaXQKLQkJcmV0dXJuIHBrQ29sdW1uTmFtZTsKLQl9Ci0KLQkvLyoqKioqKioqKiogIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQlnZXRUYWJsZSgpLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwkKLQkJYWRkSWRNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCWFkZEdlbmVyYXRvck1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJYWRkUXVlcnlNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCWZvciAoT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoc2Vjb25kYXJ5VGFibGVzKCkpKSB7Ci0JCQlzZWNvbmRhcnlUYWJsZS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJfQotCi0JCWZvciAoT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoYXR0cmlidXRlT3ZlcnJpZGVzKCkpKSB7Ci0JCQlhdHRyaWJ1dGVPdmVycmlkZS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJfQotCi0JCWZvciAoT3JtQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKSB7Ci0JCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZElkTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJYWRkTm9JZE1lc3NhZ2UobWVzc2FnZXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGROb0lkTWVzc2FnZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAoZW50aXR5SGFzTm9JZCgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTk9fSUQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQl0aGlzLCAKLQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkpCi0JCQkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBlbnRpdHlIYXNOb0lkKCkgewotCQlyZXR1cm4gISB0aGlzLmVudGl0eUhhc0lkKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEdlbmVyYXRvck1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCUxpc3Q8R2VuZXJhdG9yPiBtYXN0ZXJMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8T3JtR2VuZXJhdG9yPiBzdHJlYW0gPSB0aGlzLmdlbmVyYXRvcnMoKTsgc3RyZWFtLmhhc05leHQoKSA7ICkgewotCQkJT3JtR2VuZXJhdG9yIGN1cnJlbnQgPSBzdHJlYW0ubmV4dCgpOwotCQkJbWFzdGVyTGlzdC5yZW1vdmUoY3VycmVudCk7Ci0JCQkKLQkJCWZvciAoR2VuZXJhdG9yIGVhY2ggOiBtYXN0ZXJMaXN0KSB7Ci0JCQkJaWYgKCEgZWFjaC5vdmVycmlkZXMoY3VycmVudCkgJiYgZWFjaC5nZXROYW1lKCkgIT0gbnVsbCAmJiBlYWNoLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkdFTkVSQVRPUl9EVVBMSUNBVEVfTkFNRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge2N1cnJlbnQuZ2V0TmFtZSgpfSwKLQkJCQkJCQljdXJyZW50LAotCQkJCQkJCWN1cnJlbnQuZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJCQkpOwotCQkJCX0KLQkJCX0KLQkJCi0JCQltYXN0ZXJMaXN0LmFkZChjdXJyZW50KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRRdWVyeU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCUxpc3Q8UXVlcnk+IG1hc3Rlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpOwotCQkKLQkJZm9yIChJdGVyYXRvcjxPcm1RdWVyeT4gc3RyZWFtID0gdGhpcy5xdWVyaWVzKCk7IHN0cmVhbS5oYXNOZXh0KCkgOyApIHsKLQkJCU9ybVF1ZXJ5IGN1cnJlbnQgPSBzdHJlYW0ubmV4dCgpOwotCQkJbWFzdGVyTGlzdC5yZW1vdmUoY3VycmVudCk7Ci0JCQkKLQkJCWZvciAoUXVlcnkgZWFjaCA6IG1hc3Rlckxpc3QpIHsKLQkJCQlpZiAoISBlYWNoLm92ZXJyaWRlcyhjdXJyZW50KSAmJiBlYWNoLmdldE5hbWUoKSAhPSBudWxsICYmIGVhY2guZ2V0TmFtZSgpLmVxdWFscyhjdXJyZW50LmdldE5hbWUoKSkpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUVVFUllfRFVQTElDQVRFX05BTUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHtjdXJyZW50LmdldE5hbWUoKX0sCi0JCQkJCQkJY3VycmVudCwKLQkJCQkJCQljdXJyZW50LmdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkJKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCW1hc3Rlckxpc3QuYWRkKGN1cnJlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGVudGl0eUhhc0lkKCkgewotCQlmb3IgKEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaXNJZEF0dHJpYnV0ZSgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQllbnRpdHlNYXBwaW5ncy5nZXRFbnRpdGllcygpLnJlbW92ZSh0aGlzLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKSk7Ci0JfQotCQotCXB1YmxpYyBYbWxFbnRpdHkgYWRkVG9SZXNvdXJjZU1vZGVsKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCVhtbEVudGl0eSBlbnRpdHkgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbnRpdHkoKTsKLQkJZ2V0UGVyc2lzdGVudFR5cGUoKS5pbml0aWFsaXplKGVudGl0eSk7Ci0JCWVudGl0eU1hcHBpbmdzLmdldEVudGl0aWVzKCkuYWRkKGVudGl0eSk7Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lciBpbXBsZW1lbnRzIE9ybUJhc2VKb2luQ29sdW1uLk93bmVyCi0JewotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUVudGl0eS50aGlzOwotCQl9Ci0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtRW50aXR5LnRoaXMuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJCUVudGl0eSBwYXJlbnRFbnRpdHkgPSBHZW5lcmljT3JtRW50aXR5LnRoaXMuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCQlyZXR1cm4gKHBhcmVudEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiBwYXJlbnRFbnRpdHkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1FbnRpdHkudGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUVudGl0eS50aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuY29udGFpbnMoam9pbkNvbHVtbik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCQlpZiAoam9pbkNvbHVtbnNTaXplKCkgIT0gMSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIEdlbmVyaWNPcm1FbnRpdHkudGhpcy5nZXRQYXJlbnRFbnRpdHkoKS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQljbGFzcyBBdHRyaWJ1dGVPdmVycmlkZU93bmVyIGltcGxlbWVudHMgQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIgewotCi0JCXB1YmxpYyBDb2x1bW5NYXBwaW5nIGdldENvbHVtbk1hcHBpbmcoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJCWlmIChhdHRyaWJ1dGVOYW1lID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzQXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMocGVyc0F0dHJpYnV0ZS5nZXROYW1lKCkpKSB7Ci0JCQkJCWlmIChwZXJzQXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIENvbHVtbk1hcHBpbmcpIHsKLQkJCQkJCXJldHVybiAoQ29sdW1uTWFwcGluZykgcGVyc0F0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtRW50aXR5LnRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5jb250YWlucyhvdmVycmlkZSk7Ci0JCX0KLQotCQlwdWJsaWMgQmFzZU92ZXJyaWRlIHNldFZpcnR1YWwoYm9vbGVhbiB2aXJ0dWFsLCBCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtRW50aXR5LnRoaXMuc2V0QXR0cmlidXRlT3ZlcnJpZGVWaXJ0dWFsKHZpcnR1YWwsIChPcm1BdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUpOwotCQl9Ci0KLQkJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1FbnRpdHkudGhpczsKLQkJfQotCQkKLQl9Ci0KLQljbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlT3duZXIgaW1wbGVtZW50cyBBc3NvY2lhdGlvbk92ZXJyaWRlLk93bmVyIHsKLQotCQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCQlpZiAoYXR0cmlidXRlTmFtZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IGdldFBlcnNpc3RlbnRUeXBlKCkuYWxsQXR0cmlidXRlcygpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc0F0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKHBlcnNBdHRyaWJ1dGUuZ2V0TmFtZSgpKSkgewotCQkJCQlpZiAocGVyc0F0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBSZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCQkJCQlyZXR1cm4gKFJlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZU92ZXJyaWRlIG92ZXJyaWRlKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUVudGl0eS50aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5jb250YWlucyhvdmVycmlkZSk7Ci0JCX0KLQotCQlwdWJsaWMgQmFzZU92ZXJyaWRlIHNldFZpcnR1YWwoYm9vbGVhbiB2aXJ0dWFsLCBCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1FbnRpdHkudGhpczsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtR2VuZXJhdGVkVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtR2VuZXJhdGVkVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlNWRhYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUdlbmVyYXRlZFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtR2VuZXJhdGVkVmFsdWUgZXh0ZW5kcyBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgT3JtR2VuZXJhdGVkVmFsdWUKLXsKLQotCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBzcGVjaWZpZWRTdHJhdGVneTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkR2VuZXJhdG9yOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdEdlbmVyYXRvcjsKLQotCXByb3RlY3RlZCBYbWxHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZTsKLQkKLQlwdWJsaWMgR2VuZXJpY09ybUdlbmVyYXRlZFZhbHVlKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtSnBhQ29udGV4dE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUpwYUNvbnRleHROb2RlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHVibGljIEdlbmVyYXRpb25UeXBlIGdldFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFN0cmF0ZWd5KCkgOiB0aGlzLmdldFNwZWNpZmllZFN0cmF0ZWd5KCk7Ci0JfQotCi0JcHVibGljIEdlbmVyYXRpb25UeXBlIGdldERlZmF1bHRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIEdlbmVyYXRlZFZhbHVlLkRFRkFVTFRfU1RSQVRFR1k7Ci0JfQotCQotCXB1YmxpYyBHZW5lcmF0aW9uVHlwZSBnZXRTcGVjaWZpZWRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU3RyYXRlZ3koR2VuZXJhdGlvblR5cGUgbmV3U3BlY2lmaWVkU3RyYXRlZ3kpIHsKLQkJR2VuZXJhdGlvblR5cGUgb2xkU3RyYXRlZ3kgPSB0aGlzLnNwZWNpZmllZFN0cmF0ZWd5OwotCQl0aGlzLnNwZWNpZmllZFN0cmF0ZWd5ID0gbmV3U3BlY2lmaWVkU3RyYXRlZ3k7Ci0JCXRoaXMuZ2VuZXJhdGVkVmFsdWUuc2V0U3RyYXRlZ3koR2VuZXJhdGlvblR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZFN0cmF0ZWd5KSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NUUkFURUdZX1BST1BFUlRZLCBvbGRTdHJhdGVneSwgbmV3U3BlY2lmaWVkU3RyYXRlZ3kpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTdHJhdGVneV8oR2VuZXJhdGlvblR5cGUgbmV3U3BlY2lmaWVkU3RyYXRlZ3kpIHsKLQkJR2VuZXJhdGlvblR5cGUgb2xkU3RyYXRlZ3kgPSB0aGlzLnNwZWNpZmllZFN0cmF0ZWd5OwotCQl0aGlzLnNwZWNpZmllZFN0cmF0ZWd5ID0gbmV3U3BlY2lmaWVkU3RyYXRlZ3k7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NUUkFURUdZX1BST1BFUlRZLCBvbGRTdHJhdGVneSwgbmV3U3BlY2lmaWVkU3RyYXRlZ3kpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0R2VuZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRHZW5lcmF0b3IoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0R2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0R2VuZXJhdG9yOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0R2VuZXJhdG9yKFN0cmluZyBuZXdEZWZhdWx0R2VuZXJhdG9yKSB7Ci0JCVN0cmluZyBvbGRHZW5lcmF0b3IgPSB0aGlzLmRlZmF1bHRHZW5lcmF0b3I7Ci0JCXRoaXMuZGVmYXVsdEdlbmVyYXRvciA9IG5ld0RlZmF1bHRHZW5lcmF0b3I7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZEdlbmVyYXRvciwgbmV3RGVmYXVsdEdlbmVyYXRvcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEdlbmVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRHZW5lcmF0b3IoU3RyaW5nIG5ld1NwZWNpZmllZEdlbmVyYXRvcikgewotCQlTdHJpbmcgb2xkR2VuZXJhdG9yID0gdGhpcy5zcGVjaWZpZWRHZW5lcmF0b3I7Ci0JCXRoaXMuc3BlY2lmaWVkR2VuZXJhdG9yID0gbmV3U3BlY2lmaWVkR2VuZXJhdG9yOwotCQl0aGlzLmdlbmVyYXRlZFZhbHVlLnNldEdlbmVyYXRvcihuZXdTcGVjaWZpZWRHZW5lcmF0b3IpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZEdlbmVyYXRvciwgbmV3U3BlY2lmaWVkR2VuZXJhdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRHZW5lcmF0b3JfKFN0cmluZyBuZXdTcGVjaWZpZWRHZW5lcmF0b3IpIHsKLQkJU3RyaW5nIG9sZEdlbmVyYXRvciA9IHRoaXMuc3BlY2lmaWVkR2VuZXJhdG9yOwotCQl0aGlzLnNwZWNpZmllZEdlbmVyYXRvciA9IG5ld1NwZWNpZmllZEdlbmVyYXRvcjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRHZW5lcmF0b3IsIG5ld1NwZWNpZmllZEdlbmVyYXRvcik7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRHZW5lcmF0b3JUZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSAgdGhpcy5nZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3JUZXh0UmFuZ2UoKTsKLQkJcmV0dXJuIHRleHRSYW5nZSAhPSBudWxsID8gdGV4dFJhbmdlIDogZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWwgLT4gamF2YSBjb250ZXh0IG1vZGVsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUpIHsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IGdlbmVyYXRlZFZhbHVlOwotCQl0aGlzLnNwZWNpZmllZFN0cmF0ZWd5ID0gdGhpcy5zdHJhdGVneShnZW5lcmF0ZWRWYWx1ZSk7Ci0JCXRoaXMuc3BlY2lmaWVkR2VuZXJhdG9yID0gdGhpcy5nZW5lcmF0b3IoZ2VuZXJhdGVkVmFsdWUpOwotCQkvL1RPRE8KLQkJdGhpcy5kZWZhdWx0R2VuZXJhdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUpIHsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IGdlbmVyYXRlZFZhbHVlOwotCQl0aGlzLnNldFNwZWNpZmllZFN0cmF0ZWd5Xyh0aGlzLnN0cmF0ZWd5KGdlbmVyYXRlZFZhbHVlKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkR2VuZXJhdG9yXyh0aGlzLmdlbmVyYXRvcihnZW5lcmF0ZWRWYWx1ZSkpOwotCQkvL1RPRE8KLQkJdGhpcy5zZXREZWZhdWx0R2VuZXJhdG9yKG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneShYbWxHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSkgewotCQlyZXR1cm4gR2VuZXJhdGlvblR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoZ2VuZXJhdGVkVmFsdWUuZ2V0U3RyYXRlZ3koKSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdG9yKFhtbEdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlKSB7Ci0JCXJldHVybiBnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdmFsaWRhdGlvblRleHRSYW5nZSA9IHRoaXMuZ2VuZXJhdGVkVmFsdWUuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gdmFsaWRhdGlvblRleHRSYW5nZSAhPSBudWxsID8gdmFsaWRhdGlvblRleHRSYW5nZSA6IGdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUlkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1JZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiM2Y3NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUlkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1JZE1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WG1sSWQ+Ci0JaW1wbGVtZW50cyBPcm1JZE1hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtQ29sdW1uIGNvbHVtbjsKLQotCXByb3RlY3RlZCBPcm1HZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZTsKLQkKLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHRlbXBvcmFsOwotCQotCXByb3RlY3RlZCBPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjsKLQlwcm90ZWN0ZWQgT3JtU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3I7Ci0KLQkKLQlwdWJsaWMgR2VuZXJpY09ybUlkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybUNvbHVtbih0aGlzLCB0aGlzKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybUlkTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVhtbENvbHVtbk1hcHBpbmcoT3JtQ29sdW1uTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tWG1sQ29sdW1uTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJc2V0VGVtcG9yYWwob2xkTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQkJZ2V0Q29sdW1uKCkuaW5pdGlhbGl6ZUZyb20ob2xkTWFwcGluZy5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JCi0JcHVibGljIE9ybUNvbHVtbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkgewotCQlyZXR1cm4gdGhpcy50ZW1wb3JhbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpIHsKLQkJVGVtcG9yYWxUeXBlIG9sZFRlbXBvcmFsID0gdGhpcy50ZW1wb3JhbDsKLQkJdGhpcy50ZW1wb3JhbCA9IG5ld1RlbXBvcmFsOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld1RlbXBvcmFsKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ29sdW1uTWFwcGluZy5URU1QT1JBTF9QUk9QRVJUWSwgb2xkVGVtcG9yYWwsIG5ld1RlbXBvcmFsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGVtcG9yYWxfKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkgewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0aGlzLnRlbXBvcmFsOwotCQl0aGlzLnRlbXBvcmFsID0gbmV3VGVtcG9yYWw7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ29sdW1uTWFwcGluZy5URU1QT1JBTF9QUk9QRVJUWSwgb2xkVGVtcG9yYWwsIG5ld1RlbXBvcmFsKTsKLQl9Ci0KLQlwdWJsaWMgT3JtR2VuZXJhdGVkVmFsdWUgYWRkR2VuZXJhdGVkVmFsdWUoKSB7Ci0JCWlmIChnZXRHZW5lcmF0ZWRWYWx1ZSgpICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdlbWVyYXRlZFZhbHVlIGFscmVhZHkgZXhpc3RzIik7Ci0JCX0KLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybUdlbmVyYXRlZFZhbHVlKHRoaXMpOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRHZW5lcmF0ZWRWYWx1ZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxHZW5lcmF0ZWRWYWx1ZUltcGwoKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZLCBudWxsLCB0aGlzLmdlbmVyYXRlZFZhbHVlKTsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVkVmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUdlbmVyYXRlZFZhbHVlKCkgewotCQlpZiAoZ2V0R2VuZXJhdGVkVmFsdWUoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZW1lcmF0ZWRWYWx1ZSBkb2VzIG5vdCBleGlzdCwgY2Fubm90IGJlIHJlbW92ZWQiKTsKLQkJfQotCQlPcm1HZW5lcmF0ZWRWYWx1ZSBvbGRHZW5lcmF0ZWRWYWx1ZSA9IHRoaXMuZ2VuZXJhdGVkVmFsdWU7Ci0JCXRoaXMuZ2VuZXJhdGVkVmFsdWUgPSBudWxsOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRHZW5lcmF0ZWRWYWx1ZShudWxsKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChHRU5FUkFURURfVkFMVUVfUFJPUEVSVFksIG9sZEdlbmVyYXRlZFZhbHVlLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIE9ybUdlbmVyYXRlZFZhbHVlIGdldEdlbmVyYXRlZFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmF0ZWRWYWx1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0R2VuZXJhdGVkVmFsdWUoT3JtR2VuZXJhdGVkVmFsdWUgbmV3R2VuZXJhdGVkVmFsdWUpIHsKLQkJT3JtR2VuZXJhdGVkVmFsdWUgb2xkR2VuZXJhdGVkVmFsdWUgPSB0aGlzLmdlbmVyYXRlZFZhbHVlOwotCQl0aGlzLmdlbmVyYXRlZFZhbHVlID0gbmV3R2VuZXJhdGVkVmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZLCBvbGRHZW5lcmF0ZWRWYWx1ZSwgbmV3R2VuZXJhdGVkVmFsdWUpOwotCX0KLQotCXB1YmxpYyBPcm1TZXF1ZW5jZUdlbmVyYXRvciBhZGRTZXF1ZW5jZUdlbmVyYXRvcigpIHsKLQkJaWYgKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2VxdWVuY2VHZW5lcmF0b3IgYWxyZWFkeSBleGlzdHMiKTsKLQkJfQotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtU2VxdWVuY2VHZW5lcmF0b3IodGhpcyk7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldFNlcXVlbmNlR2VuZXJhdG9yKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCgpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFksIG51bGwsIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3IpOwotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCWlmIChnZXRTZXF1ZW5jZUdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNlcXVlbmNlR2VuZXJhdG9yIGRvZXMgbm90IGV4aXN0LCBjYW5ub3QgYmUgcmVtb3ZlZCIpOwotCQl9Ci0JCU9ybVNlcXVlbmNlR2VuZXJhdG9yIG9sZFNlcXVlbmNlR2VuZXJhdG9yID0gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IG51bGw7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldFNlcXVlbmNlR2VuZXJhdG9yKG51bGwpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkU2VxdWVuY2VHZW5lcmF0b3IsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgT3JtU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNlcXVlbmNlR2VuZXJhdG9yKE9ybVNlcXVlbmNlR2VuZXJhdG9yIG5ld1NlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCU9ybVNlcXVlbmNlR2VuZXJhdG9yIG9sZFNlcXVlbmNlR2VuZXJhdG9yID0gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IG5ld1NlcXVlbmNlR2VuZXJhdG9yOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkU2VxdWVuY2VHZW5lcmF0b3IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yKTsKLQl9Ci0KLQlwdWJsaWMgT3JtVGFibGVHZW5lcmF0b3IgYWRkVGFibGVHZW5lcmF0b3IoKSB7Ci0JCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRhYmxlR2VuZXJhdG9yIGFscmVhZHkgZXhpc3RzIik7Ci0JCX0KLQkJdGhpcy50YWJsZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVRhYmxlR2VuZXJhdG9yKHRoaXMpOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRUYWJsZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvckltcGwoKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZLCBudWxsLCB0aGlzLnRhYmxlR2VuZXJhdG9yKTsKLQkJcmV0dXJuIHRoaXMudGFibGVHZW5lcmF0b3I7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVRhYmxlR2VuZXJhdG9yKCkgewotCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0YWJsZUdlbmVyYXRvciBkb2VzIG5vdCBleGlzdCwgY2Fubm90IGJlIHJlbW92ZWQiKTsKLQkJfQotCQlPcm1UYWJsZUdlbmVyYXRvciBvbGRUYWJsZUdlbmVyYXRvciA9IHRoaXMudGFibGVHZW5lcmF0b3I7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3IgPSBudWxsOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRUYWJsZUdlbmVyYXRvcihudWxsKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZFRhYmxlR2VuZXJhdG9yLCBudWxsKTsJCi0JfQotCQotCXB1YmxpYyBPcm1UYWJsZUdlbmVyYXRvciBnZXRUYWJsZUdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMudGFibGVHZW5lcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFibGVHZW5lcmF0b3IoT3JtVGFibGVHZW5lcmF0b3IgbmV3VGFibGVHZW5lcmF0b3IpIHsKLQkJT3JtVGFibGVHZW5lcmF0b3Igb2xkVGFibGVHZW5lcmF0b3IgPSB0aGlzLnRhYmxlR2VuZXJhdG9yOwotCQl0aGlzLnRhYmxlR2VuZXJhdG9yID0gbmV3VGFibGVHZW5lcmF0b3I7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZLCBvbGRUYWJsZUdlbmVyYXRvciwgbmV3VGFibGVHZW5lcmF0b3IpOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8T3JtR2VuZXJhdG9yPiBnZW5lcmF0b3JzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPE9ybUdlbmVyYXRvcj4oCi0JCQkoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSA6IG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3IoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSksCi0JCQkoZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSA6IG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3IoZ2V0VGFibGVHZW5lcmF0b3IoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbigpLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJZE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgWG1sSWQgYWRkVG9SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJWG1sSWQgaWQgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxJZEltcGwoKTsKLQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmluaXRpYWxpemUoaWQpOwotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuYWRkKGlkKTsKLQkJcmV0dXJuIGlkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5yZW1vdmUodGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQlpZiAodHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQl0eXBlTWFwcGluZy5zZXRBdHRyaWJ1dGVzKG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIFRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXREYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsJCQotCQlyZXR1cm4gZ2V0QXR0cmlidXRlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sSWQgaWQpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShpZCk7Ci0JCXRoaXMudGVtcG9yYWwgPSB0aGlzLnNwZWNpZmllZFRlbXBvcmFsKGlkKTsKLQkJdGhpcy5jb2x1bW4uaW5pdGlhbGl6ZShpZC5nZXRDb2x1bW4oKSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9yKGlkKTsKLQkJdGhpcy5pbml0aWFsaXplVGFibGVHZW5lcmF0b3IoaWQpOwotCQl0aGlzLmluaXRpYWxpemVHZW5lcmF0ZWRWYWx1ZShpZCk7Ci0JCXRoaXMudXBkYXRlUGVyc2lzdGVuY2VVbml0R2VuZXJhdG9ycygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHNwZWNpZmllZFRlbXBvcmFsKFhtbElkIGlkKSB7Ci0JCXJldHVybiBUZW1wb3JhbFR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoaWQuZ2V0VGVtcG9yYWwoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvcihYbWxJZCBpZCkgewotCQlpZiAoaWQuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yID0gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihpZC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvciB4bWxTZXF1ZW5jZUdlbmVyYXRvcikgewotCQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVNlcXVlbmNlR2VuZXJhdG9yKHRoaXMpOwotCQlzZXF1ZW5jZUdlbmVyYXRvci5pbml0aWFsaXplKHhtbFNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUYWJsZUdlbmVyYXRvcihYbWxJZCBpZCkgewotCQlpZiAoaWQuZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnRhYmxlR2VuZXJhdG9yID0gYnVpbGRUYWJsZUdlbmVyYXRvcihpZC5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtVGFibGVHZW5lcmF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlKSB7Ci0JCU9ybVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtVGFibGVHZW5lcmF0b3IodGhpcyk7Ci0JCXRhYmxlR2VuZXJhdG9yLmluaXRpYWxpemUodGFibGVHZW5lcmF0b3JSZXNvdXJjZSk7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhdGVkVmFsdWUoWG1sSWQgaWQpIHsKLQkJaWYgKGlkLmdldEdlbmVyYXRlZFZhbHVlKCkgIT0gbnVsbCkgewotCQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IGJ1aWxkR2VuZXJhdGVkVmFsdWUoaWQuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybUdlbmVyYXRlZFZhbHVlIGJ1aWxkR2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUgeG1sR2VuZXJhdGVkVmFsdWUpIHsKLQkJT3JtR2VuZXJhdGVkVmFsdWUgb3JtR2VuZXJhdGVkVmFsdWUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1HZW5lcmF0ZWRWYWx1ZSh0aGlzKTsKLQkJb3JtR2VuZXJhdGVkVmFsdWUuaW5pdGlhbGl6ZSh4bWxHZW5lcmF0ZWRWYWx1ZSk7Ci0JCXJldHVybiBvcm1HZW5lcmF0ZWRWYWx1ZTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbElkIGlkKSB7Ci0JCXN1cGVyLnVwZGF0ZShpZCk7Ci0JCXRoaXMuc2V0VGVtcG9yYWxfKHRoaXMuc3BlY2lmaWVkVGVtcG9yYWwoaWQpKTsKLQkJdGhpcy5jb2x1bW4udXBkYXRlKGlkLmdldENvbHVtbigpKTsKLQkJdGhpcy51cGRhdGVTZXF1ZW5jZUdlbmVyYXRvcihpZCk7Ci0JCXRoaXMudXBkYXRlVGFibGVHZW5lcmF0b3IoaWQpOwotCQl0aGlzLnVwZGF0ZUdlbmVyYXRlZFZhbHVlKGlkKTsKLQkJdGhpcy51cGRhdGVQZXJzaXN0ZW5jZVVuaXRHZW5lcmF0b3JzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlcXVlbmNlR2VuZXJhdG9yKFhtbElkIGlkKSB7Ci0JCWlmIChpZC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCWlmIChnZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChnZXRTZXF1ZW5jZUdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcihidWlsZFNlcXVlbmNlR2VuZXJhdG9yKGlkLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWdldFNlcXVlbmNlR2VuZXJhdG9yKCkudXBkYXRlKGlkLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRhYmxlR2VuZXJhdG9yKFhtbElkIGlkKSB7Ci0JCWlmIChpZC5nZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcihudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcihidWlsZFRhYmxlR2VuZXJhdG9yKGlkLmdldFRhYmxlR2VuZXJhdG9yKCkpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWdldFRhYmxlR2VuZXJhdG9yKCkudXBkYXRlKGlkLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUdlbmVyYXRlZFZhbHVlKFhtbElkIGlkKSB7Ci0JCWlmIChpZC5nZXRHZW5lcmF0ZWRWYWx1ZSgpID09IG51bGwpIHsKLQkJCWlmIChnZXRHZW5lcmF0ZWRWYWx1ZSgpICE9IG51bGwpIHsKLQkJCQlzZXRHZW5lcmF0ZWRWYWx1ZShudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChnZXRHZW5lcmF0ZWRWYWx1ZSgpID09IG51bGwpIHsKLQkJCQlzZXRHZW5lcmF0ZWRWYWx1ZShidWlsZEdlbmVyYXRlZFZhbHVlKGlkLmdldEdlbmVyYXRlZFZhbHVlKCkpKTsKLQkJCQlnZXRHZW5lcmF0ZWRWYWx1ZSgpLmluaXRpYWxpemUoaWQuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlnZXRHZW5lcmF0ZWRWYWx1ZSgpLnVwZGF0ZShpZC5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQZXJzaXN0ZW5jZVVuaXRHZW5lcmF0b3JzKCkgewotCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hZGRHZW5lcmF0b3IoZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCX0KLQkJCi0JCWlmIChnZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZEdlbmVyYXRvcihnZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJfQotCX0KLQotCS8vKioqKioqKioqKioqKioqKiogSVhtbENvbHVtbi5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldENvbHVtbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbkltcGwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtblJlc291cmNlKCkgewotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRDb2x1bW4obnVsbCk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCQotCQlpZiAoZW50aXR5T3duZWQoKSkgewotCQkJYWRkQ29sdW1uTWVzc2FnZXMobWVzc2FnZXMpOwotCQl9Ci0JCWFkZEdlbmVyYXRlZFZhbHVlTWVzc2FnZXMobWVzc2FnZXMpOwotCQlhZGRHZW5lcmF0b3JNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENvbHVtbk1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCU9ybUNvbHVtbiBjb2x1bW4gPSBnZXRDb2x1bW4oKTsKLQkJU3RyaW5nIHRhYmxlID0gY29sdW1uLmdldFRhYmxlKCk7Ci0JCWJvb2xlYW4gZG9Db250aW51ZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGUpKSB7Ci0JCQlpZiAoZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0JCQkJCQluZXcgU3RyaW5nW10ge2dldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCksIHRhYmxlLCBjb2x1bW4uZ2V0TmFtZSgpfSwKLQkJCQkJCWNvbHVtbiwgCi0JCQkJCQljb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RhYmxlLCBjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQljb2x1bW4sIAotCQkJCQkJY29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgISBjb2x1bW4uaXNSZXNvbHZlZCgpKSB7Ci0JCQlpZiAoZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKSwgY29sdW1uLmdldE5hbWUoKX0sIAotCQkJCQkJY29sdW1uLCAKLQkJCQkJCWNvbHVtbi5nZXROYW1lVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQluZXcgU3RyaW5nW10ge2NvbHVtbi5nZXROYW1lKCl9LCAKLQkJCQkJCWNvbHVtbiwgCi0JCQkJCQljb2x1bW4uZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkR2VuZXJhdGVkVmFsdWVNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlPcm1HZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSA9IGdldEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlmIChnZW5lcmF0ZWRWYWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGdlbmVyYXRvck5hbWUgPSBnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKTsKLQkJaWYgKGdlbmVyYXRvck5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlmb3IgKEdlbmVyYXRvciBuZXh0TWFzdGVyR2VuZXJhdG9yIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpIHsKLQkJCWlmIChnZW5lcmF0b3JOYW1lLmVxdWFscyhuZXh0TWFzdGVyR2VuZXJhdG9yLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCW1lc3NhZ2VzLmFkZCgKLQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLklEX01BUFBJTkdfVU5SRVNPTFZFRF9HRU5FUkFUT1JfTkFNRSwKLQkJCQluZXcgU3RyaW5nW10ge2dlbmVyYXRvck5hbWV9LAotCQkJCXRoaXMsCi0JCQkJZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKCkpCi0JCQkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmF0b3JNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlMaXN0PEdlbmVyYXRvcj4gbWFzdGVyTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KGdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPE9ybUdlbmVyYXRvcj4gc3RyZWFtID0gdGhpcy5nZW5lcmF0b3JzKCk7IHN0cmVhbS5oYXNOZXh0KCkgOyApIHsKLQkJCU9ybUdlbmVyYXRvciBjdXJyZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChjdXJyZW50LmlzVmlydHVhbCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJbWFzdGVyTGlzdC5yZW1vdmUoY3VycmVudCk7Ci0JCQkKLQkJCWZvciAoR2VuZXJhdG9yIGVhY2ggOiBtYXN0ZXJMaXN0KSB7Ci0JCQkJaWYgKCEgZWFjaC5vdmVycmlkZXMoY3VycmVudCkgJiYgZWFjaC5nZXROYW1lKCkgIT0gbnVsbCAmJiBlYWNoLmdldE5hbWUoKS5lcXVhbHMoY3VycmVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkdFTkVSQVRPUl9EVVBMSUNBVEVfTkFNRSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge2N1cnJlbnQuZ2V0TmFtZSgpfSwKLQkJCQkJCQljdXJyZW50LAotCQkJCQkJCWN1cnJlbnQuZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJCQkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJbWFzdGVyTGlzdC5hZGQoY3VycmVudCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Kb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4YzIxOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtSm9pbkNvbHVtbiBleHRlbmRzIEFic3RyYWN0T3JtQmFzZUNvbHVtbjxYbWxKb2luQ29sdW1uPiBpbXBsZW1lbnRzIE9ybUpvaW5Db2x1bW4KLXsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQotCXByb3RlY3RlZCBYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW47Ci0KLQlwdWJsaWMgR2VuZXJpY09ybUpvaW5Db2x1bW4oT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPcm1Kb2luQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKEpvaW5Db2x1bW4gb2xkQ29sdW1uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZENvbHVtbik7Ci0JCXNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKG9sZENvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQlnZXRDb2x1bW5SZXNvdXJjZSgpLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUsIG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5ld0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdEZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuaXNWaXJ0dWFsKHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtSm9pbkNvbHVtbi5Pd25lciBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChPcm1Kb2luQ29sdW1uLk93bmVyKSB0aGlzLm93bmVyOwotCX0KLQotCXB1YmxpYyBUYWJsZSBkYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0RGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ29sdW1uIGdldERiUmVmZXJlbmNlZENvbHVtbigpIHsKLQkJVGFibGUgdGFibGUgPSBkYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpOwotCQlyZXR1cm4gKHRhYmxlID09IG51bGwpID8gbnVsbCA6IHRhYmxlLmNvbHVtbk5hbWVkKGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlZENvbHVtblJlc29sdmVkKCkgewotCQlyZXR1cm4gZ2V0RGJSZWZlcmVuY2VkQ29sdW1uKCkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCkgewotCQlpZiAoZ2V0Q29sdW1uUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gZ2V0Q29sdW1uUmVzb3VyY2UoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpOwotCQkJaWYgKHRleHRSYW5nZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRleHRSYW5nZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sSm9pbkNvbHVtbiBnZXRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJLy9qb2luQ29sdW1ucyBhcmUgcGFydCBvZiBhIGNvbGxlY3Rpb24sIHRoZSBqb2luLWNvbHVtbiBlbGVtZW50IHdpbGwgYmUgcmVtb3ZlZC9hZGRlZAotCQkvL3doZW4gdGhlIFhtbEpvaW5Db2x1bW4gaXMgcmVtb3ZlZC9hZGRlZCB0byB0aGUgWG1sRW50aXR5IGNvbGxlY3Rpb24KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29sdW1uUmVzb3VyY2UoKSB7Ci0JCS8vam9pbkNvbHVtbnMgYXJlIHBhcnQgb2YgYSBjb2xsZWN0aW9uLCB0aGUgcGstam9pbi1jb2x1bW4gZWxlbWVudCB3aWxsIGJlIHJlbW92ZWQvYWRkZWQKLQkJLy93aGVuIHRoZSBYbWxKb2luQ29sdW1uIGlzIHJlbW92ZWQvYWRkZWQgdG8gdGhlIFhtbEVudGl0eSBjb2xsZWN0aW9uCi0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sSm9pbkNvbHVtbiBjb2x1bW4pIHsKLQkJdGhpcy5qb2luQ29sdW1uID0gY29sdW1uOwotCQlzdXBlci5pbml0aWFsaXplKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSBzcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShjb2x1bW4pOwotCQl0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sSm9pbkNvbHVtbiBjb2x1bW4pIHsKLQkJdGhpcy5qb2luQ29sdW1uID0gY29sdW1uOwotCQlzdXBlci51cGRhdGUoY29sdW1uKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8oc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoY29sdW1uKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKFhtbEpvaW5Db2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiBjb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lKCkgewotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcgPSBnZXRPd25lcigpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJaWYgKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCFnZXRPd25lcigpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5pc1JlbGF0aW9uc2hpcE93bmVyKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luQ29sdW1uRGVmYXVsdE5hbWUodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcgPSBnZXRPd25lcigpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJaWYgKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCFyZWxhdGlvbnNoaXBNYXBwaW5nLmlzUmVsYXRpb25zaGlwT3duZXIoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIE1hcHBpbmdUb29scy5idWlsZEpvaW5Db2x1bW5EZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUodGhpcyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhYmxlKCkgewotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcgPSBnZXRPd25lcigpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJaWYgKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCFyZWxhdGlvbnNoaXBNYXBwaW5nLmlzUmVsYXRpb25zaGlwT3duZXIoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmRlZmF1bHRUYWJsZSgpOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKiB1c2VkIGludGVybmFsbHkgYXMgYSBtZWNoYW5pc20gdG8gc2hvcnQgY2lyY3VpdCBjb250aW51ZWQgbWVzc2FnZSBhZGRpbmcgKi8KLQlwcml2YXRlIGJvb2xlYW4gZG9Db250aW51ZTsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQl0aGlzLmRvQ29udGludWUgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKLQkKLQkJT3JtUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nID0gKE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcpIGdldE93bmVyKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOwotCQkvL1RPRE8gd2h5IGlzIHRoaXMgY29tbWVudGVkIG91dD8gIGkgY29waWVkIGl0IGxpa2UgdGhpcyBmcm9tIHRoZSBtYWludGVuYW5jZSBzdHJlYW0KLS8vCQlpZiAoZG9Db250aW51ZSAmJiB0eXBlTWFwcGluZy50YWJsZU5hbWVJc0ludmFsaWQodGFibGUpKSB7Ci0vLwkJCWlmIChtYXBwaW5nLmlzVmlydHVhbCgpKSB7Ci0vLwkJCQltZXNzYWdlcy5hZGQoCi0vLwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLS8vCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLS8vCQkJCQkJSUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKLS8vCQkJCQkJbmV3IFN0cmluZ1tdIHttYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCksIHRhYmxlLCBjb2x1bW4uZ2V0TmFtZSgpfSwKLS8vCQkJCQkJY29sdW1uLCBjb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoKSkKLS8vCQkJCSk7Ci0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQltZXNzYWdlcy5hZGQoCi0vLwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLS8vCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLS8vCQkJCQkJSUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKLS8vCQkJCQkJbmV3IFN0cmluZ1tdIHt0YWJsZSwgY29sdW1uLmdldE5hbWUoKX0sIAotLy8JCQkJCQljb2x1bW4sIGNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZSgpKQotLy8JCQkJKTsKLS8vCQkJfQotLy8JCQlkb0NvbnRpbnVlID0gZmFsc2U7Ci0vLwkJfQotLy8JCQotCQlpZiAodGhpcy5kb0NvbnRpbnVlICYmICEgaXNSZXNvbHZlZCgpKSB7Ci0JCQlpZiAobWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJbmV3IFN0cmluZ1tdIHttYXBwaW5nLmdldE5hbWUoKSwgZ2V0TmFtZSgpfSwgCi0JCQkJCQl0aGlzLCAKLQkJCQkJCWdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpfSwgCi0JCQkJCQl0aGlzLCAKLQkJCQkJCWdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmI1NGMyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW4uT3duZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kgCisJZXh0ZW5kcyBBYnN0cmFjdE9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kKKwlpbXBsZW1lbnRzIE9ybUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kKK3sKKwkKKwlwdWJsaWMgR2VuZXJpY09ybUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3koT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBwYXJlbnQsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeGFvKSB7CisJCXN1cGVyKHBhcmVudCwgeGFvKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE93bmVyIGJ1aWxkSm9pbkNvbHVtbk93bmVyKCkgeworCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5Pd25lcigpOworCX0KKwkKKwlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCXJldHVybiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0T3duZXIoKS5nZXRUeXBlTWFwcGluZygpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXNzb2NpYXRpb24oKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIChPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlKSBzdXBlci5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhhbykgeworCQkvL1RPRE8gY2FuIHdlIG1ha2UgcmVzb3VyY2UgZmluYWwgYW5kIHRoZW4ganVzdCBoYXZlIGFuIHVwZGF0ZSgpIG1ldGhvZD8KKwkJLy93b3VsZCBuZWVkIHRvIHVwZGF0ZSB0aGUgYXNzb2NpYXRpb24gb3ZlcnJpZGVzIHdpdGggdGhlIHNhbWUgcmVzb3VyY2UgYXNzb2NpYXRpb24gb3ZlcnJpZGUKKwkJdGhpcy5yZXNvdXJjZSA9IHhhbzsKKwkJc3VwZXIudXBkYXRlKCk7CisJfQorCQorCQorCisJLy8gKioqKioqKioqKiBqb2luIGNvbHVtbiBvd25lciBhZGFwdGVyICoqKioqKioqKioKKworCXByb3RlY3RlZCBjbGFzcyBKb2luQ29sdW1uT3duZXIKKwkJaW1wbGVtZW50cyBPcm1Kb2luQ29sdW1uLk93bmVyCisJeworCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbk93bmVyKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCisJCXByb3RlY3RlZCBBc3NvY2lhdGlvbk92ZXJyaWRlIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB7CisJCQlyZXR1cm4gR2VuZXJpY09ybUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kudGhpcy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBieSBkZWZhdWx0LCB0aGUgam9pbiBjb2x1bW4gaXMgaW4gdGhlIHR5cGUgbWFwcGluZydzIHByaW1hcnkgdGFibGUKKwkJICovCisJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKKwkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlUYWJsZU5hbWUoKTsKKwkJfQorCQkKKwkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKKwkJCS8vYnVpbHQgaW4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pbkNvbHVtbkRlZmF1bHROYW1lKCkKKwkJCXJldHVybiBudWxsOworCQl9CisJCQorCQlwdWJsaWMgRW50aXR5IGdldFRhcmdldEVudGl0eSgpIHsKKwkJCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKwkJCXJldHVybiByZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwgPyBudWxsIDogcmVsYXRpb25zaGlwTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgeworCQkJcmV0dXJuIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXROYW1lKCk7CisJCX0KKworCQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQkJcmV0dXJuIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXRPd25lcigpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoR2VuZXJpY09ybUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kudGhpcy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0TmFtZSgpKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7CisJCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKKwkJfQorCisJCS8qKgorCQkgKiB0aGUgam9pbiBjb2x1bW4gY2FuIGJlIG9uIGEgc2Vjb25kYXJ5IHRhYmxlCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiB0YWJsZUlzQWxsb3dlZCgpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgeworCQkJcmV0dXJuIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCk7CisJCX0KKworCQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7CisJCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXREYlRhYmxlKHRhYmxlTmFtZSk7CisJCX0KKworCQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7CisJCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0VGFyZ2V0RW50aXR5KCk7CisJCQlyZXR1cm4gKHRhcmdldEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiB0YXJnZXRFbnRpdHkuZ2V0UHJpbWFyeURiVGFibGUoKTsKKwkJfQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgeworCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5LnRoaXMuam9pbkNvbHVtbnNTaXplKCk7CisJCX0KKwkJCisJCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJCXJldHVybiBHZW5lcmljT3JtSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwkJfQorCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTZiNmZlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbi5Pd25lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbnNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IAorCWV4dGVuZHMgQWJzdHJhY3RPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5Cit7CisJCisJcHVibGljIEdlbmVyaWNPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KAorCQkJT3JtSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcGFyZW50LAorCQkJWG1sSm9pbkNvbHVtbnNNYXBwaW5nIHJlc291cmNlKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2UpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKSB7CisJCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7CisJfQorCQorCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKKwkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZygpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXNzb2NpYXRpb24oKSB7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gKE9ybUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlKSBzdXBlci5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwl9CisJCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCX0KKworCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gb3duZXIgYWRhcHRlciAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgY2xhc3MgSm9pbkNvbHVtbk93bmVyCisJCWltcGxlbWVudHMgT3JtSm9pbkNvbHVtbi5Pd25lciAKKwl7CisJCXByb3RlY3RlZCBKb2luQ29sdW1uT3duZXIoKSB7CisJCQlzdXBlcigpOworCQl9CisJCQorCQkvKioKKwkJICogYnkgZGVmYXVsdCwgdGhlIGpvaW4gY29sdW1uIGlzIGluIHRoZSB0eXBlIG1hcHBpbmcncyBwcmltYXJ5IHRhYmxlCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7CisJCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7CisJCX0KKwkJCisJCXB1YmxpYyBFbnRpdHkgZ2V0VGFyZ2V0RW50aXR5KCkgeworCQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOworCQl9CisJCQorCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7CisJCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldE5hbWUoKTsKKwkJfQorCQkKKwkJcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKKwkJCXJldHVybiBHZW5lcmljT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKwkJfQorCQkKKwkJcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKKwkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOworCQl9CisJCQorCQkvKioKKwkJICogdGhlIGpvaW4gY29sdW1uIGNhbiBiZSBvbiBhIHNlY29uZGFyeSB0YWJsZQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gdGFibGVJc0FsbG93ZWQoKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKKwkJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmcoKTsKKwkJfQorCQkKKwkJcHVibGljIFRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgeworCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOworCQl9CisJCQorCQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7CisJCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0VGFyZ2V0RW50aXR5KCk7CisJCQlyZXR1cm4gKHRhcmdldEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiB0YXJnZXRFbnRpdHkuZ2V0UHJpbWFyeURiVGFibGUoKTsKKwkJfQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJCXJldHVybiBHZW5lcmljT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS50aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IGpvaW5Db2x1bW47CisJCX0KKwkJCisJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7CisJCQkvL2J1aWx0IGluIE1hcHBpbmdUb29scy5idWlsZEpvaW5Db2x1bW5EZWZhdWx0TmFtZSgpCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgeworCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnRoaXMuam9pbkNvbHVtbnNTaXplKCk7CisJCX0KKwkJCisJCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJCXJldHVybiBHZW5lcmljT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Kb2luVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlMGEwYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5vbk93bmluZ01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUpvaW5UYWJsZSBleHRlbmRzIEFic3RyYWN0T3JtVGFibGUgaW1wbGVtZW50cyBPcm1Kb2luVGFibGUKLXsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zOwotCi0JcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW47Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1Kb2luQ29sdW1uPiBzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnM7Ci0KLQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBkZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW47Ci0JCi0JcHJvdGVjdGVkIFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZ1Jlc291cmNlOwotCQotCXB1YmxpYyBHZW5lcmljT3JtSm9pblRhYmxlKE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE9ybUpvaW5Db2x1bW4+KCk7Ci0JCXRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxPcm1Kb2luQ29sdW1uPigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtUmVsYXRpb25zaGlwTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtUmVsYXRpb25zaGlwTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShKb2luVGFibGUgb2xkSm9pblRhYmxlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZEpvaW5UYWJsZSk7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWZvciAoSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9sZEpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpKSkgewotCQkJT3JtSm9pbkNvbHVtbiBuZXdKb2luQ29sdW1uID0gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbmRleCsrKTsKLQkJCW5ld0pvaW5Db2x1bW4uaW5pdGlhbGl6ZUZyb20oam9pbkNvbHVtbik7Ci0JCX0KLQkJaW5kZXggPSAwOwotCQlmb3IgKEpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvbGRKb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlPcm1Kb2luQ29sdW1uIG5ld0pvaW5Db2x1bW4gPSBhZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbmRleCsrKTsKLQkJCW5ld0pvaW5Db2x1bW4uaW5pdGlhbGl6ZUZyb20oam9pbkNvbHVtbik7Ci0JCX0KLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKioqKioqIEFic3RyYWN0T3JtVGFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nKCkgewotCQlpZiAoIWdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5pc1JlbGF0aW9uc2hpcE93bmVyKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdUb29scy5idWlsZEpvaW5UYWJsZURlZmF1bHROYW1lKGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYSgpIHsKLQkJaWYgKCFnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuaXNSZWxhdGlvbnNoaXBPd25lcigpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVUYWJsZVJlc291cmNlKCkgewotCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmdSZXNvdXJjZS5zZXRKb2luVGFibGUobnVsbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFRhYmxlUmVzb3VyY2UoKSB7Ci0JCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZ1Jlc291cmNlLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGVJbXBsKCkpOwotCQkKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sSm9pblRhYmxlIGdldFRhYmxlUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmdSZXNvdXJjZS5nZXRKb2luVGFibGUoKTsKLQl9Ci0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKiogSm9pblRhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqCi0KLQkvLyoqKioqKioqKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKioqKioqKioqKioqKgotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA/IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA6IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuc2l6ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGRlZmF1bHRKb2luQ29sdW1ucygpIHsKLQkJaWYgKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4pOwotCQl9Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IGRlZmF1bHRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQkKLQlwdWJsaWMgT3JtSm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRKb2luQ29sdW1uKE9ybUpvaW5Db2x1bW4gbmV3Sm9pbkNvbHVtbikgewotCQlPcm1Kb2luQ29sdW1uIG9sZEpvaW5Db2x1bW4gPSB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOwotCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gbmV3Sm9pbkNvbHVtbjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChKb2luVGFibGUuREVGQVVMVF9KT0lOX0NPTFVNTiwgb2xkSm9pbkNvbHVtbiwgbmV3Sm9pbkNvbHVtbik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICF0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlpZiAoZ2V0VGFibGVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCWFkZFRhYmxlUmVzb3VyY2UoKTsKLQkJfQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1Kb2luQ29sdW1uKHRoaXMsIG5ldyBKb2luQ29sdW1uT3duZXIoKSk7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuYWRkKGluZGV4LCBqb2luQ29sdW1uKTsKLQkJWG1sSm9pbkNvbHVtbiB4bWxKb2luQ29sdW1uID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbkltcGwoKTsKLQkJam9pbkNvbHVtbi5pbml0aWFsaXplKHhtbEpvaW5Db2x1bW4pOwotCQl0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5nZXRKb2luQ29sdW1ucygpLmFkZChpbmRleCwgeG1sSm9pbkNvbHVtbik7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChKb2luVGFibGUuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgam9pbkNvbHVtbik7Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4LCBPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgSm9pblRhYmxlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuaW5kZXhPZihqb2luQ29sdW1uKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU9ybUpvaW5Db2x1bW4gcmVtb3ZlZEpvaW5Db2x1bW4gPSB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7Ci0JCWlmICghY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpKSB7Ci0JCQkvL2NyZWF0ZSB0aGUgZGVmYXVsdEpvaW5Db2x1bW4gbm93IG9yIHRoaXMgd2lsbCBoYXBwZW4gZHVyaW5nIHByb2plY3QgdXBkYXRlIAotCQkJLy9hZnRlciByZW1vdmluZyB0aGUgam9pbiBjb2x1bW4gZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuIFRoYXQgY2F1c2VzIHByb2JsZW1zIAotCQkJLy9pbiB0aGUgVUkgYmVjYXVzZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgZW5kIHVwIGluIHRoZSB3cm9uZyBvcmRlci4KLQkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBidWlsZEpvaW5Db2x1bW4obnVsbCk7Ci0JCX0KLQkJdGhpcy5nZXRUYWJsZVJlc291cmNlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoSm9pblRhYmxlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHJlbW92ZWRKb2luQ29sdW1uKTsKLQkJaWYgKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJLy9maXJlIGNoYW5nZSBub3RpZmljYXRpb24gaWYgYSBkZWZhdWx0Sm9pbkNvbHVtbiB3YXMgY3JlYXRlZCBhYm92ZQotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpvaW5UYWJsZS5ERUZBVUxUX0pPSU5fQ09MVU1OLCBudWxsLCB0aGlzLmRlZmF1bHRKb2luQ29sdW1uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW5fKE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3Qoam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgSm9pblRhYmxlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpLmdldEpvaW5Db2x1bW5zKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKEpvaW5UYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKiogaW52ZXJzZSBqb2luIGNvbHVtbnMgKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBpbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRhaW5zU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpIDogdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGFpbnNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSA/IHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+KHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gZGVmYXVsdEludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJaWYgKHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPih0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbik7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZGVmYXVsdEludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0KLQlwdWJsaWMgT3JtSm9pbkNvbHVtbiBnZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKE9ybUpvaW5Db2x1bW4gbmV3Sm9pbkNvbHVtbikgewotCQlPcm1Kb2luQ29sdW1uIG9sZEpvaW5Db2x1bW4gPSB0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKLQkJdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPSBuZXdKb2luQ29sdW1uOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEpvaW5UYWJsZS5ERUZBVUxUX0lOVkVSU0VfSk9JTl9DT0xVTU4sIG9sZEpvaW5Db2x1bW4sIG5ld0pvaW5Db2x1bW4pOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICF0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCWlmIChnZXRUYWJsZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJYWRkVGFibGVSZXNvdXJjZSgpOwotCQl9Ci0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybUpvaW5Db2x1bW4odGhpcywgbmV3IEludmVyc2VKb2luQ29sdW1uT3duZXIoKSk7Ci0JCXRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLmFkZChpbmRleCwgam9pbkNvbHVtbik7Ci0JCVhtbEpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW5JbXBsKCk7Ci0JCWpvaW5Db2x1bW4uaW5pdGlhbGl6ZSh4bWxKb2luQ29sdW1uKTsKLQkJdGhpcy5nZXRUYWJsZVJlc291cmNlKCkuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuYWRkKGluZGV4LCB4bWxKb2luQ29sdW1uKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKEpvaW5UYWJsZS5TUEVDSUZJRURfSU5WRVJTRV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIGpvaW5Db2x1bW4pOwotCQlyZXR1cm4gam9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4LCBPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMsIEpvaW5UYWJsZS5TUEVDSUZJRURfSU5WRVJTRV9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMuaW5kZXhPZihqb2luQ29sdW1uKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlPcm1Kb2luQ29sdW1uIHJlbW92ZWRKb2luQ29sdW1uID0gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKLQkJaWYgKCFjb250YWluc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpKSB7Ci0JCQkvL2NyZWF0ZSB0aGUgZGVmYXVsdEludmVyc2VKb2luQ29sdW1uIG5vdyBvciB0aGlzIHdpbGwgaGFwcGVuIGR1cmluZyBwcm9qZWN0IHVwZGF0ZSAKLQkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLiBUaGF0IGNhdXNlcyBwcm9ibGVtcyAKLQkJCS8vaW4gdGhlIFVJIGJlY2F1c2UgdGhlIGNoYW5nZSBub3RpZmljYXRpb25zIGVuZCB1cCBpbiB0aGUgd3Jvbmcgb3JkZXIuCi0JCQl0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiA9IGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW4obnVsbCk7Ci0JCX0KLQkJdGhpcy5nZXRUYWJsZVJlc291cmNlKCkuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKEpvaW5UYWJsZS5TUEVDSUZJRURfSU5WRVJTRV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHJlbW92ZWRKb2luQ29sdW1uKTsKLQkJaWYgKHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCS8vZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIGEgZGVmYXVsdEpvaW5Db2x1bW4gd2FzIGNyZWF0ZWQgYWJvdmUKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChKb2luVGFibGUuREVGQVVMVF9JTlZFUlNFX0pPSU5fQ09MVU1OLCBudWxsLCB0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbl8oT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChqb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucywgSm9pblRhYmxlLlNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldFRhYmxlUmVzb3VyY2UoKS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoSm9pblRhYmxlLlNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCi0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKioqKiBPcm1Kb2luVGFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioKLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGVSZXNvdXJjZSgpICE9IG51bGwgJiYgZ2V0VGFibGVSZXNvdXJjZSgpLmlzU3BlY2lmaWVkKCk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZykgewotCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmdSZXNvdXJjZSA9IHJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0JCXRoaXMuaW5pdGlhbGl6ZSh0aGlzLmdldFRhYmxlUmVzb3VyY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nUmVzb3VyY2UgPSByZWxhdGlvbnNoaXBNYXBwaW5nOwotCQl0aGlzLnVwZGF0ZSh0aGlzLmdldFRhYmxlUmVzb3VyY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxKb2luVGFibGUgam9pblRhYmxlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoam9pblRhYmxlKTsKLQkJdGhpcy5pbml0aWFsaXplU3BlY2lmaWVkSm9pbkNvbHVtbnMoam9pblRhYmxlKTsKLQkJdGhpcy5pbml0aWFsaXplRGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkJdGhpcy5pbml0aWFsaXplU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKGpvaW5UYWJsZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkSm9pbkNvbHVtbnMoWG1sSm9pblRhYmxlIGpvaW5UYWJsZSkgewotCQlpZiAoam9pblRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKFhtbEpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IGpvaW5UYWJsZS5nZXRKb2luQ29sdW1ucygpKSB7Ci0JCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmFkZChidWlsZEpvaW5Db2x1bW4oam9pbkNvbHVtbikpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJaWYgKCFzaG91bGRCdWlsZERlZmF1bHRKb2luQ29sdW1uKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gYnVpbGRKb2luQ29sdW1uKG51bGwpOwotCX0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKFhtbEpvaW5UYWJsZSBqb2luVGFibGUpIHsKLQkJaWYgKGpvaW5UYWJsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkpIHsKLQkJCXRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLmFkZChidWlsZEludmVyc2VKb2luQ29sdW1uKGpvaW5Db2x1bW4pKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiA9IGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW4obnVsbCk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoWG1sSm9pblRhYmxlIGpvaW5UYWJsZSkgewotCQlzdXBlci51cGRhdGUoam9pblRhYmxlKTsKLQkJdGhpcy51cGRhdGVTcGVjaWZpZWRKb2luQ29sdW1ucyhqb2luVGFibGUpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCXRoaXMudXBkYXRlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKGpvaW5UYWJsZSk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRKb2luQ29sdW1ucyhYbWxKb2luVGFibGUgam9pblRhYmxlKSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxKb2luQ29sdW1uPiByZXNvdXJjZUpvaW5Db2x1bW5zID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJaWYgKGpvaW5UYWJsZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZUpvaW5Db2x1bW5zID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbEpvaW5Db2x1bW4+KGpvaW5UYWJsZS5nZXRKb2luQ29sdW1ucygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJfQotCQkKLQkJd2hpbGUgKGpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJam9pbkNvbHVtbi51cGRhdGUocmVzb3VyY2VKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbl8oam9pbkNvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSwgYnVpbGRKb2luQ29sdW1uKHJlc291cmNlSm9pbkNvbHVtbnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQnVpbGREZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuICFjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCWlmICghc2hvdWxkQnVpbGREZWZhdWx0Sm9pbkNvbHVtbigpKSB7Ci0JCQlzZXREZWZhdWx0Sm9pbkNvbHVtbihudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldERlZmF1bHRKb2luQ29sdW1uKGJ1aWxkSm9pbkNvbHVtbihudWxsKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uLnVwZGF0ZShudWxsKTsKLQkJfQotCX0JCi0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoWG1sSm9pblRhYmxlIGpvaW5UYWJsZSkgewotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gaW52ZXJzZUpvaW5Db2x1bW5zID0gc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxKb2luQ29sdW1uPiByZXNvdXJjZUludmVyc2VKb2luQ29sdW1ucyA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCWlmIChqb2luVGFibGUgIT0gbnVsbCkgewotCQkJcmVzb3VyY2VJbnZlcnNlSm9pbkNvbHVtbnMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sSm9pbkNvbHVtbj4oam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJfQotCQkKLQkJd2hpbGUgKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VJbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJam9pbkNvbHVtbi51cGRhdGUocmVzb3VyY2VJbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uXyhqb2luQ29sdW1uKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHJlc291cmNlSW52ZXJzZUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpLCBidWlsZEludmVyc2VKb2luQ29sdW1uKHJlc291cmNlSW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEJ1aWxkRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gIWNvbnRhaW5zU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkpIHsKLQkJCXNldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbihudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkgPT0gbnVsbCkgewotCQkJdGhpcy5zZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihudWxsKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbi51cGRhdGUobnVsbCk7Ci0JCX0KLQl9CQotCQotCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uIGJ1aWxkSm9pbkNvbHVtbihYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtSm9pbkNvbHVtbih0aGlzLCBuZXcgSm9pbkNvbHVtbk93bmVyKCkpOwotCQlvcm1Kb2luQ29sdW1uLmluaXRpYWxpemUoam9pbkNvbHVtbik7Ci0JCXJldHVybiBvcm1Kb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBidWlsZEludmVyc2VKb2luQ29sdW1uKFhtbEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1Kb2luQ29sdW1uKHRoaXMsIG5ldyBJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCkpOwotCQlvcm1Kb2luQ29sdW1uLmluaXRpYWxpemUoam9pbkNvbHVtbik7Ci0JCXJldHVybiBvcm1Kb2luQ29sdW1uOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqIHVzZWQgaW50ZXJuYWxseSBhcyBhIG1lY2hhbmlzbSB0byBzaG9ydCBjaXJjdWl0IGNvbnRpbnVlZCBtZXNzYWdlIGFkZGluZyAqLwotCXByaXZhdGUgYm9vbGVhbiBkb0NvbnRpbnVlOwotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJdGhpcy5hZGRUYWJsZU1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJCi0JCWlmICh0aGlzLmRvQ29udGludWUpIHsKLQkJCWZvciAoT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGpvaW5Db2x1bW5zKCkpKSB7Ci0JCQkJam9pbkNvbHVtbi5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJCX0KLQkJCQotCQkJZm9yIChPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoaW52ZXJzZUpvaW5Db2x1bW5zKCkpKSB7Ci0JCQkJam9pbkNvbHVtbi5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWJsZU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXRoaXMuZG9Db250aW51ZSA9IGNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKLQkJU3RyaW5nIHNjaGVtYSA9IGdldFNjaGVtYSgpOwotCQlPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmcgPSBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCi0JCWlmICh0aGlzLmRvQ29udGludWUgJiYgISBoYXNSZXNvbHZlZFNjaGVtYSgpKSB7Ci0JCQlpZiAobWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BLAotCQkJCQkJbmV3IFN0cmluZ1tdIHttYXBwaW5nLmdldE5hbWUoKSwgc2NoZW1hLCBnZXROYW1lKCl9LCAKLQkJCQkJCXRoaXMsIAotCQkJCQkJZ2V0U2NoZW1hVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCQkKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsCi0JCQkJCQluZXcgU3RyaW5nW10ge3NjaGVtYSwgZ2V0TmFtZSgpfSwgCi0JCQkJCQl0aGlzLCAKLQkJCQkJCWdldFNjaGVtYVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCQl0aGlzLmRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKHRoaXMuZG9Db250aW51ZSAmJiAhIGlzUmVzb2x2ZWQoKSkgewotCQkJaWYgKG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUUsCi0JCQkJCQluZXcgU3RyaW5nW10ge21hcHBpbmcuZ2V0TmFtZSgpLCBnZXROYW1lKCl9LCAKLQkJCQkJCXRoaXMsIAotCQkJCQkJZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpfSwgCi0JCQkJCQl0aGlzLCAKLQkJCQkJCWdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIGp1c3QgYSBsaXR0bGUgY29tbW9uIGJlaGF2aW9yCi0JICovCi0JYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKb2luQ29sdW1uT3duZXIgaW1wbGVtZW50cyBPcm1Kb2luQ29sdW1uLk93bmVyCi0JewotCQlBYnN0cmFjdEpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFR5cGVNYXBwaW5nKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJfQotCi0JCS8qKgotCQkgKiB0aGUgZGVmYXVsdCB0YWJsZSBuYW1lIGlzIGFsd2F5cyB2YWxpZCBhbmQgYSBzcGVjaWZpZWQgdGFibGUgbmFtZQotCQkgKiBpcyBwcm9oaWJpdGVkICh3aGljaCB3aWxsIGJlIGhhbmRsZWQgZWxzZXdoZXJlKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qKgotCQkgKiB0aGUgam9pbiBjb2x1bW4gY2FuIG9ubHkgYmUgb24gdGhlIGpvaW4gdGFibGUgaXRzZWxmCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZUlzQWxsb3dlZCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlpZiAoR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gKEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5nZXROYW1lKCkuZXF1YWxzKHRhYmxlTmFtZSkpID8gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmdldERiVGFibGUoKSA6IG51bGw7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBieSBkZWZhdWx0LCB0aGUgam9pbiBjb2x1bW4gaXMsIG9idmlvdXNseSwgaW4gdGhlIGpvaW4gdGFibGU7Ci0JCSAqIG5vdCBzdXJlIHdoZXRoZXIgaXQgY2FuIGJlIGFueXdoZXJlIGVsc2UuLi4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIG93bmVyIGZvciAiZm9yd2FyZC1wb2ludGVyIiBKb2luQ29sdW1uczsKLQkgKiB0aGVzZSBwb2ludCBhdCB0aGUgdGFyZ2V0L2ludmVyc2UgZW50aXR5Ci0JICovCi0JY2xhc3MgSW52ZXJzZUpvaW5Db2x1bW5Pd25lciBleHRlbmRzIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyCi0JewotCQlwdWJsaWMgSW52ZXJzZUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW50aXR5IGdldFRhcmdldEVudGl0eSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCW9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBkYlRhYmxlID0gc3VwZXIuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOwotCQkJaWYgKGRiVGFibGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBkYlRhYmxlOwotCQkJfQotCQkJRW50aXR5IHRhcmdldEVudGl0eSA9IGdldFRhcmdldEVudGl0eSgpOwotCQkJcmV0dXJuICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogdGFyZ2V0RW50aXR5LmdldERiVGFibGUodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKSB7Ci0JCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0VGFyZ2V0RW50aXR5KCk7Ci0JCQlyZXR1cm4gKHRhcmdldEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiB0YXJnZXRFbnRpdHkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID09IGpvaW5Db2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmludmVyc2VKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCQkKLQl9Ci0KLQotCS8qKgotCSAqIG93bmVyIGZvciAiYmFjay1wb2ludGVyIiBKb2luQ29sdW1uczsKLQkgKiB0aGVzZSBwb2ludCBhdCB0aGUgc291cmNlL293bmluZyBlbnRpdHkKLQkgKi8KLQljbGFzcyBKb2luQ29sdW1uT3duZXIgZXh0ZW5kcyBBYnN0cmFjdEpvaW5Db2x1bW5Pd25lcgotCXsKLQkJcHVibGljIEpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW50aXR5IGdldFRhcmdldEVudGl0eSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldEVudGl0eSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQkJRW50aXR5IHRhcmdldEVudGl0eSA9IEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJCWlmICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldE5hbWUoKTsKLQkJCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gdGFyZ2V0RW50aXR5LmdldFBlcnNpc3RlbnRUeXBlKCkuYWxsQXR0cmlidXRlcygpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCQlBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkJCWlmIChtYXBwaW5nIGluc3RhbmNlb2YgTm9uT3duaW5nTWFwcGluZykgewotCQkJCQlTdHJpbmcgbWFwcGVkQnkgPSAoKE5vbk93bmluZ01hcHBpbmcpIG1hcHBpbmcpLmdldE1hcHBlZEJ5KCk7Ci0JCQkJCWlmICgobWFwcGVkQnkgIT0gbnVsbCkgJiYgbWFwcGVkQnkuZXF1YWxzKGF0dHJpYnV0ZU5hbWUpKSB7Ci0JCQkJCQlyZXR1cm4gYXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZGJUYWJsZSA9IHN1cGVyLmdldERiVGFibGUodGFibGVOYW1lKTsKLQkJCWlmIChkYlRhYmxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZGJUYWJsZTsKLQkJCX0KLQkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldERiVGFibGUodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKSB7Ci0JCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBqb2luQ29sdW1uOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5qb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNDg4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSAKKwlleHRlbmRzIEFic3RyYWN0T3JtSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5Cit7CisJcHJvdGVjdGVkIFhtbEpvaW5UYWJsZU1hcHBpbmcgcmVzb3VyY2U7CisJCisJCisJcHVibGljIEdlbmVyaWNPcm1Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3koCisJCQlPcm1Kb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlIHBhcmVudCwKKwkJCVhtbEpvaW5UYWJsZU1hcHBpbmcgcmVzb3VyY2UpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCQl0aGlzLmluaXRpYWxpemUoKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKE9ybUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiB0aGlzLmdldFBhcmVudCgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0UmVzb3VyY2VKb2luVGFibGUoWG1sSm9pblRhYmxlIHJlc291cmNlSm9pblRhYmxlKSB7CisJCXRoaXMucmVzb3VyY2Uuc2V0Sm9pblRhYmxlKHJlc291cmNlSm9pblRhYmxlKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uKCkgeworCQlyZXR1cm4gZ2V0SnBhUGxhdGZvcm1WYXJpYXRpb24oKS5pc0pvaW5UYWJsZU92ZXJyaWRhYmxlKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogam9pbiB0YWJsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pblRhYmxlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtSm9pblRhYmxlIGFkZEpvaW5UYWJsZSgpIHsKKwkJYWRkU3RyYXRlZ3koKTsKKwkJcmV0dXJuIHRoaXMuam9pblRhYmxlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRKb2luVGFibGVfKE9ybUpvaW5UYWJsZSBuZXdKb2luVGFibGUpIHsKKwkJT3JtSm9pblRhYmxlIG9sZEpvaW5UYWJsZSA9IHRoaXMuam9pblRhYmxlOworCQl0aGlzLmpvaW5UYWJsZSA9IG5ld0pvaW5UYWJsZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpPSU5fVEFCTEVfUFJPUEVSVFksIG9sZEpvaW5UYWJsZSwgbmV3Sm9pblRhYmxlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEpvaW5UYWJsZSBhZGRSZXNvdXJjZUpvaW5UYWJsZSgpIHsKKwkJWG1sSm9pblRhYmxlIHJlc291cmNlSm9pblRhYmxlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCk7CisJCXRoaXMucmVzb3VyY2Uuc2V0Sm9pblRhYmxlKHJlc291cmNlSm9pblRhYmxlKTsKKwkJcmV0dXJuIHJlc291cmNlSm9pblRhYmxlOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZUpvaW5UYWJsZSgpIHsKKwkJdGhpcy5yZXNvdXJjZS5zZXRKb2luVGFibGUobnVsbCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIG1heUhhdmVKb2luVGFibGUoKSB7CisJCXJldHVybiBnZXRSZXNvdXJjZUpvaW5UYWJsZSgpICE9IG51bGwgCisJCQl8fCBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5tYXlIYXZlRGVmYXVsdEpvaW5UYWJsZSgpOworCX0KKwkKKwlwdWJsaWMgWG1sSm9pblRhYmxlIGdldFJlc291cmNlSm9pblRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXRKb2luVGFibGUoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZSAtPiBjb250ZXh0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJaWYgKG1heUhhdmVKb2luVGFibGUoKSkgeworCQkJaWYgKHRoaXMuam9pblRhYmxlID09IG51bGwpIHsKKwkJCQlzZXRKb2luVGFibGVfKGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtSm9pblRhYmxlKHRoaXMsIGdldFJlc291cmNlSm9pblRhYmxlKCkpKTsKKwkJCX0KKwkJCXRoaXMuam9pblRhYmxlLnVwZGF0ZSgpOworCQl9CisJCWVsc2UgeworCQkJaWYgKHRoaXMuam9pblRhYmxlICE9IG51bGwpIHsKKwkJCQkvLyBubyByZXNvdXJjZSwgc28gbm8gY2xlYW4gdXAKKwkJCQlzZXRKb2luVGFibGVfKG51bGwpOworCQkJfQorCQl9CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCWlmICh0aGlzLmpvaW5UYWJsZSAhPSBudWxsICYmIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5zaG91bGRWYWxpZGF0ZUFnYWluc3REYXRhYmFzZSgpKSB7CisJCQl0aGlzLmpvaW5UYWJsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl9CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MzQxYTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5vbk93bmluZ01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc8WG1sTWFueVRvTWFueT4KLQlpbXBsZW1lbnRzIE9ybU1hbnlUb01hbnlNYXBwaW5nCi17Ci0KLQlwdWJsaWMgR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybU1hbnlUb01hbnlNYXBwaW5nKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tWG1sTm9uT3duaW5nTWFwcGluZyhOb25Pd25pbmdNYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21YbWxOb25Pd25pbmdNYXBwaW5nKG9sZE1hcHBpbmcpOwotCQlzZXRNYXBwZWRCeShvbGRNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiA3OwotCX0KLQotCS8vICoqKioqKioqKiogTm9uT3duaW5nTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JcHVibGljIGJvb2xlYW4gbWFwcGVkQnlJc1ZhbGlkKEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGVkQnlNYXBwaW5nKSB7Ci0JCVN0cmluZyBtYXBwZWRCeUtleSA9IG1hcHBlZEJ5TWFwcGluZy5nZXRLZXkoKTsKLQkJcmV0dXJuIChtYXBwZWRCeUtleSA9PSBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQl9Ci0JCi0JcHVibGljIFhtbE1hbnlUb01hbnkgYWRkVG9SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFueVRvTWFueUltcGwoKTsKLQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmluaXRpYWxpemUobWFueVRvTWFueSk7Ci0JCXR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmFkZChtYW55VG9NYW55KTsKLQkJcmV0dXJuIG1hbnlUb01hbnk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJdHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkucmVtb3ZlKHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpKTsKLQkJaWYgKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJdHlwZU1hcHBpbmcuc2V0QXR0cmlidXRlcyhudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUwYTc4NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMTg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1NYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWltcGxlbWVudHMgT3JtTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZQoreworCXByb3RlY3RlZCBPcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneSBtYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKKwkKKwlwcm90ZWN0ZWQgT3JtSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5IGpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKKwkKKwkKKwlwdWJsaWMgR2VuZXJpY09ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCisJCQlPcm1NYW55VG9NYW55TWFwcGluZyBwYXJlbnQsIFhtbE1hbnlUb01hbnkgcmVzb3VyY2UpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZSk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luaW5nU3RyYXRlZ2llcygpIHsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneSA9IGJ1aWxkTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKTsKKwkJCisJCS8vIGluaXRpYWxpemUgam9pbiB0YWJsZSBsYXN0LCBhcyB0aGUgZXhpc3RlbmNlIG9mIGEgZGVmYXVsdCBqb2luIAorCQkvLyB0YWJsZSBpcyBkZXBlbmRlbnQgb24gdGhlIG90aGVyIG1lY2hhbmlzbXMgKG1hcHBlZEJ5KQorCQkvLyBub3QgYmVpbmcgc3BlY2lmaWVkCisJCXRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5ID0gYnVpbGRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IGJ1aWxkTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KHRoaXMsIGdldFJlc291cmNlTWFwcGluZygpKTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSBidWlsZEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIAluZXcgR2VuZXJpY09ybUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSh0aGlzLCBnZXRSZXNvdXJjZU1hcHBpbmcoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UgbmV3UmVsYXRpb25zaGlwUmVmZXJlbmNlKSB7CisJCW5ld1JlbGF0aW9uc2hpcFJlZmVyZW5jZS5pbml0aWFsaXplRnJvbU93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UodGhpcyk7CisJCW5ld1JlbGF0aW9uc2hpcFJlZmVyZW5jZS5pbml0aWFsaXplRnJvbUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UodGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSgKKwkJCU9ybU93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2Ugb2xkUmVsYXRpb25zaGlwUmVmZXJlbmNlKSB7CisJCXN1cGVyLmluaXRpYWxpemVGcm9tT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShvbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UpOworCQl0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LnNldE1hcHBlZEJ5QXR0cmlidXRlKAorCQkJb2xkUmVsYXRpb25zaGlwUmVmZXJlbmNlLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgKKwkJCU9ybUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2Ugb2xkUmVsYXRpb25zaGlwUmVmZXJlbmNlKSB7CisJCXN1cGVyLmluaXRpYWxpemVGcm9tSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZShvbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UpOworCQlPcm1Kb2luVGFibGUgb2xkVGFibGUgPSAKKwkJCW9sZFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKKwkJaWYgKG9sZFRhYmxlICE9IG51bGwpIHsKKwkJCXRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5LmFkZEpvaW5UYWJsZSgpLmluaXRpYWxpemVGcm9tKG9sZFRhYmxlKTsKKwkJfQorCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtTWFueVRvTWFueU1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKKwkJcmV0dXJuIChPcm1NYW55VG9NYW55TWFwcGluZykgc3VwZXIuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOworCX0KKwkKKwlwdWJsaWMgWG1sTWFueVRvTWFueSBnZXRSZXNvdXJjZU1hcHBpbmcoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKSB7CisJCXJldHVybiB0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkgPT0gbnVsbDsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNPd25lZEJ5KFJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZykgeworCQlyZXR1cm4gdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5yZWxhdGlvbnNoaXBJc093bmVkQnkobWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKb2luaW5nU3RyYXRlZ3kgY2FsY3VsYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB7CisJCWlmICh0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CisJCX0KKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBtYXBwZWQgYnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBPcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneSBnZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIGdldFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgPT0gdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuYWRkU3RyYXRlZ3koKTsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIHZvaWQgdW5zZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBtYXlCZU1hcHBlZEJ5KEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGVkQnlNYXBwaW5nKSB7CisJCXJldHVybiBtYXBwZWRCeU1hcHBpbmcuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBqb2luIHRhYmxlIGpvaW5pbmcgc3RyYXRlZ3kgICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBPcm1Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBnZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpID09IHRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSB7CisJCS8vIGpvaW4gdGFibGUgaXMgdGhlIGRlZmF1bHQgc3RyYXRlZ3ksIHNvIG5vIG5lZWQgdG8gYWRkIHRvIHJlc291cmNlCisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIHZvaWQgdW5zZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pblRhYmxlKCkgeworCQlyZXR1cm4gZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpID09IG51bGw7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgPT4gY29udGV4dCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKb2luaW5nU3RyYXRlZ2llcygpIHsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS51cGRhdGUoKTsKKwkJCisJCS8vIHVwZGF0ZSBqb2luIHRhYmxlIGxhc3QsIGFzIHRoZSBleGlzdGVuY2Ugb2YgYSBkZWZhdWx0IGpvaW4gCisJCS8vIHRhYmxlIGlzIGRlcGVuZGVudCBvbiB0aGUgb3RoZXIgbWVjaGFuaXNtcyAobWFwcGVkQnkpCisJCS8vIG5vdCBiZWluZyBzcGVjaWZpZWQKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kudXBkYXRlKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY5ODc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nPFhtbE1hbnlUb09uZT4KLQlpbXBsZW1lbnRzIE9ybU1hbnlUb09uZU1hcHBpbmcKLXsKLQotCXB1YmxpYyBHZW5lcmljT3JtTWFueVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiA0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCS8vTWFueVRvT25lIG1hcHBpbmcgaXMgYWx3YXlzIHRoZSBvd25pbmcgc2lkZQotCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1NYW55VG9PbmVNYXBwaW5nKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkJCi0JcHVibGljIFhtbE1hbnlUb09uZSBhZGRUb1Jlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFueVRvT25lSW1wbCgpOwotCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaW5pdGlhbGl6ZShtYW55VG9PbmUpOwotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmFkZChtYW55VG9PbmUpOwotCQlyZXR1cm4gbWFueVRvT25lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkucmVtb3ZlKHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpKTsKLQkJaWYgKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJdHlwZU1hcHBpbmcuc2V0QXR0cmlidXRlcyhudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MTA0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWV4dGVuZHMgQWJzdHJhY3RPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UKKwlpbXBsZW1lbnRzIE9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZQoreworCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJCisJCisJcHVibGljIEdlbmVyaWNPcm1NYW55VG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCisJCQlPcm1NYW55VG9PbmVNYXBwaW5nIHBhcmVudCwgWG1sTWFueVRvT25lIHJlc291cmNlKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2UpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWdpZXMoKSB7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSA9IGJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kodGhpcywgZ2V0UmVzb3VyY2VNYXBwaW5nKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtUmVsYXRpb25zaGlwUmVmZXJlbmNlIG5ld1JlbGF0aW9uc2hpcFJlZmVyZW5jZSkgeworCQluZXdSZWxhdGlvbnNoaXBSZWZlcmVuY2UuaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSh0aGlzKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgKKwkJCU9ybUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlIG9sZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgeworCQlpbnQgaW5kZXggPSAwOworCQlmb3IgKEpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IAorCQkJCUNvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSgKKwkJCQkJb2xkUmVsYXRpb25zaGlwUmVmZXJlbmNlLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5zcGVjaWZpZWRKb2luQ29sdW1ucygpKSkgeworCQkJT3JtSm9pbkNvbHVtbiBuZXdKb2luQ29sdW1uID0gZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW5kZXgrKyk7CisJCQluZXdKb2luQ29sdW1uLmluaXRpYWxpemVGcm9tKGpvaW5Db2x1bW4pOworCQl9CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1NYW55VG9PbmVNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7CisJCXJldHVybiAoT3JtTWFueVRvT25lTWFwcGluZykgZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBYbWxNYW55VG9PbmUgZ2V0UmVzb3VyY2VNYXBwaW5nKCkgeworCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc291cmNlQXR0cmlidXRlTWFwcGluZygpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aW9uc2hpcE93bmVyKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNPd25lZEJ5KFJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZykgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKb2luaW5nU3RyYXRlZ3kgY2FsY3VsYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB7CisJCS8vIHRoZSBvbmx5IGpvaW5pbmcgc3RyYXRlZ3kKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gZ2V0UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSA9PSB0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCS8vIGpvaW4gY29sdW1ucyBhcmUgZGVmYXVsdCAob25seSBzdHJhdGVneSBpbiBmYWN0KSBzbyBubyBuZWVkIHRvIGFkZCB0byByZXNvdXJjZQorCX0KKwkKKwlwdWJsaWMgdm9pZCB1bnNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBtYXlIYXZlRGVmYXVsdEpvaW5Db2x1bW4oKSB7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlID0+IGNvbnRleHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlSm9pbmluZ1N0cmF0ZWdpZXMoKSB7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS51cGRhdGUoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxN2NlOTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkQnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kgCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBPcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneQoreworCXByb3RlY3RlZCBYbWxNYXBwZWRCeU1hcHBpbmcgcmVzb3VyY2U7CisJCisJcHJvdGVjdGVkIFN0cmluZyBtYXBwZWRCeUF0dHJpYnV0ZTsKKwkKKwkKKwlwdWJsaWMgR2VuZXJpY09ybU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KAorCQkJT3JtT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBwYXJlbnQsCisJCQlYbWxNYXBwZWRCeU1hcHBpbmcgcmVzb3VyY2UpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCQl0aGlzLm1hcHBlZEJ5QXR0cmlidXRlID0gdGhpcy5yZXNvdXJjZS5nZXRNYXBwZWRCeSgpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoT3JtT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBPcm1Pd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbigpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgT3JtUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiByZWxhdGlvbnNoaXBJc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBvdGhlck1hcHBpbmcpIHsKKwkJU3RyaW5nIHRoaXNFbnRpdHkgPSAKKwkJCShnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRFbnRpdHkoKSkgPT0gbnVsbCA/CisJCQkJbnVsbCA6IGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEVudGl0eSgpLmdldE5hbWUoKTsKKwkJU3RyaW5nIHRhcmdldEVudGl0eSA9IAorCQkJKGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpID09IG51bGwpID8KKwkJCQludWxsIDogZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkuZ2V0TmFtZSgpOworCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKAorCQkJCXRoaXNFbnRpdHksCisJCQkJdGFyZ2V0RW50aXR5KQorCQkJJiYgU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKAorCQkJCWdldE1hcHBlZEJ5QXR0cmlidXRlKCksIAorCQkJCW90aGVyTWFwcGluZy5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5QXR0cmlidXRlKCkgeworCQlyZXR1cm4gdGhpcy5tYXBwZWRCeUF0dHJpYnV0ZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0TWFwcGVkQnlBdHRyaWJ1dGUoU3RyaW5nIG5ld01hcHBlZEJ5QXR0cmlidXRlKSB7CisJCVN0cmluZyBvbGRNYXBwZWRCeUF0dHJpYnV0ZSA9IHRoaXMubWFwcGVkQnlBdHRyaWJ1dGU7CisJCXRoaXMubWFwcGVkQnlBdHRyaWJ1dGUgPSBuZXdNYXBwZWRCeUF0dHJpYnV0ZTsKKwkJdGhpcy5yZXNvdXJjZS5zZXRNYXBwZWRCeShuZXdNYXBwZWRCeUF0dHJpYnV0ZSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX0FUVFJJQlVURV9QUk9QRVJUWSwgb2xkTWFwcGVkQnlBdHRyaWJ1dGUsIG5ld01hcHBlZEJ5QXR0cmlidXRlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFwcGVkQnlBdHRyaWJ1dGVfKFN0cmluZyBuZXdNYXBwZWRCeUF0dHJpYnV0ZSkgeworCQlTdHJpbmcgb2xkTWFwcGVkQnlBdHRyaWJ1dGUgPSB0aGlzLm1hcHBlZEJ5QXR0cmlidXRlOworCQl0aGlzLm1hcHBlZEJ5QXR0cmlidXRlID0gbmV3TWFwcGVkQnlBdHRyaWJ1dGU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX0FUVFJJQlVURV9QUk9QRVJUWSwgb2xkTWFwcGVkQnlBdHRyaWJ1dGUsIG5ld01hcHBlZEJ5QXR0cmlidXRlKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkU3RyYXRlZ3koKSB7CisJCWlmICh0aGlzLm1hcHBlZEJ5QXR0cmlidXRlID09IG51bGwpIHsKKwkJCXNldE1hcHBlZEJ5QXR0cmlidXRlKCIiKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVTdHJhdGVneSgpIHsKKwkJaWYgKHRoaXMubWFwcGVkQnlBdHRyaWJ1dGUgIT0gbnVsbCkgeworCQkJc2V0TWFwcGVkQnlBdHRyaWJ1dGUobnVsbCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzZXRNYXBwZWRCeUF0dHJpYnV0ZV8odGhpcy5yZXNvdXJjZS5nZXRNYXBwZWRCeSgpKTsKKwl9CisJCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHsKKwkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5hbGxUYXJnZXRFbnRpdHlBdHRyaWJ1dGVOYW1lcygpOwkKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJCisJCWlmIChnZXRNYXBwZWRCeUF0dHJpYnV0ZSgpID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJRW50aXR5IHRhcmdldEVudGl0eSA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7CisJCWlmICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgeworCQkJcmV0dXJuOyAgLy8gbnVsbCB0YXJnZXQgZW50aXR5IGlzIHZhbGlkYXRlZCBlbHNld2hlcmUKKwkJfQorCQkKKwkJQXR0cmlidXRlTWFwcGluZyBtYXBwZWRCeU1hcHBpbmcgPSB0YXJnZXRFbnRpdHkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcodGhpcy5tYXBwZWRCeUF0dHJpYnV0ZSk7CisJCQorCQlpZiAobWFwcGVkQnlNYXBwaW5nID09IG51bGwpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfVU5SRVNPTFZFRF9NQVBQRURfQlksCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5tYXBwZWRCeUF0dHJpYnV0ZX0sCisJCQkJCXRoaXMsCisJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCisJCQkJKQorCQkJKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKCAhIHRoaXMuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkubWF5QmVNYXBwZWRCeShtYXBwZWRCeU1hcHBpbmcpKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX0lOVkFMSURfTUFQUEVEX0JZLAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMubWFwcGVkQnlBdHRyaWJ1dGV9LCAKKwkJCQkJdGhpcywKKwkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKKwkJCQkpCisJCQkpOworCQkJcmV0dXJuOworCQl9CisJCQorCQkvLyBpZiBtYXBwZWRCeU1hcHBpbmcgaXMgbm90IGEgcmVsYXRpb25zaGlwIG93bmVyLCB0aGVuIGl0IHNob3VsZCBoYXZlIAorCQkvLyBiZWVuIGZsYWdnZWQgaW4gYWJvdmUgcnVsZSAobWFwcGVkQnlJc1ZhbGlkKQorCQlpZiAoISAoKFJlbGF0aW9uc2hpcE1hcHBpbmcpIG1hcHBlZEJ5TWFwcGluZykuaXNSZWxhdGlvbnNoaXBPd25lcigpKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX01BUFBFRF9CWV9PTl9CT1RIX1NJREVTLAorCQkJCQl0aGlzLAorCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQorCQkJCSkKKwkJCSk7CisJCX0KKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlUZXh0UmFuZ2UgbWFwcGVkQnlUZXh0UmFuZ2UgPSB0aGlzLnJlc291cmNlLmdldE1hcHBlZEJ5VGV4dFJhbmdlKCk7CisJCXJldHVybiBtYXBwZWRCeVRleHRSYW5nZSAhPSBudWxsID8gbWFwcGVkQnlUZXh0UmFuZ2UgOiBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hcHBlZFN1cGVyY2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkODFmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtTWFwcGVkU3VwZXJjbGFzcyBleHRlbmRzIEFic3RyYWN0T3JtVHlwZU1hcHBpbmc8WG1sTWFwcGVkU3VwZXJjbGFzcz4KLQlpbXBsZW1lbnRzIE9ybU1hcHBlZFN1cGVyY2xhc3MKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIGlkQ2xhc3M7Ci0JCi0JcHVibGljIEdlbmVyaWNPcm1NYXBwZWRTdXBlcmNsYXNzKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuaWRDbGFzczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SWRDbGFzcyhTdHJpbmcgbmV3SWRDbGFzcykgewotCQlTdHJpbmcgb2xkSWRDbGFzcyA9IHRoaXMuaWRDbGFzczsKLQkJdGhpcy5pZENsYXNzID0gbmV3SWRDbGFzczsKLQkJaWYgKG9sZElkQ2xhc3MgIT0gbmV3SWRDbGFzcykgewotCQkJaWYgKHRoaXMuaWRDbGFzc1Jlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuaWRDbGFzc1Jlc291cmNlKCkuc2V0Q2xhc3NOYW1lKG5ld0lkQ2xhc3MpOwkJCQkJCQotCQkJCWlmICh0aGlzLmlkQ2xhc3NSZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZUlkQ2xhc3NSZXNvdXJjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld0lkQ2xhc3MgIT0gbnVsbCkgewotCQkJCWFkZElkQ2xhc3NSZXNvdXJjZSgpOwotCQkJCWlkQ2xhc3NSZXNvdXJjZSgpLnNldENsYXNzTmFtZShuZXdJZENsYXNzKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElkQ2xhc3MuSURfQ0xBU1NfUFJPUEVSVFksIG9sZElkQ2xhc3MsIG5ld0lkQ2xhc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRJZENsYXNzXyhTdHJpbmcgbmV3SWRDbGFzcykgewotCQlTdHJpbmcgb2xkSWRDbGFzcyA9IHRoaXMuaWRDbGFzczsKLQkJdGhpcy5pZENsYXNzID0gbmV3SWRDbGFzczsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChJZENsYXNzLklEX0NMQVNTX1BST1BFUlRZLCBvbGRJZENsYXNzLCBuZXdJZENsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sSWRDbGFzcyBpZENsYXNzUmVzb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0SWRDbGFzcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZENsYXNzUmVzb3VyY2UoKSB7Ci0JCWdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKS5zZXRJZENsYXNzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbElkQ2xhc3MoKSk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSWRDbGFzc1Jlc291cmNlKCkgewotCQlnZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0SWRDbGFzcyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFzc29jaWF0ZWRUYWJsZU5hbWVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxUYWJsZT4gYXNzb2NpYXRlZFRhYmxlcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNPZih0aGlzLm92ZXJyaWRhYmxlQXR0cmlidXRlcygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgbykgewotCQkJCXJldHVybiBvLmlzT3ZlcnJpZGFibGVBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzT2YodGhpcy5vdmVycmlkYWJsZUFzc29jaWF0aW9ucygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvKSB7Ci0JCQkJcmV0dXJuIG8uaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzT2YoSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgU3RyaW5nPihhdHRyaWJ1dGVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZShYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MpIHsKLQkJcmV0dXJuIG1hcHBlZFN1cGVyY2xhc3MuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQllbnRpdHlNYXBwaW5ncy5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5yZW1vdmUodGhpcy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkpOwotCX0KLQkKLQlwdWJsaWMgWG1sTWFwcGVkU3VwZXJjbGFzcyBhZGRUb1Jlc291cmNlTW9kZWwoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGVkU3VwZXJjbGFzcygpOwotCQlnZXRQZXJzaXN0ZW50VHlwZSgpLmluaXRpYWxpemUobWFwcGVkU3VwZXJjbGFzcyk7Ci0JCWVudGl0eU1hcHBpbmdzLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmFkZChtYXBwZWRTdXBlcmNsYXNzKTsKLQkJcmV0dXJuIG1hcHBlZFN1cGVyY2xhc3M7Ci0JfQotCi0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShtYXBwZWRTdXBlcmNsYXNzKTsKLQkJdGhpcy5pbml0aWFsaXplSWRDbGFzcyh0aGlzLmlkQ2xhc3NSZXNvdXJjZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUlkQ2xhc3MoWG1sSWRDbGFzcyBpZENsYXNzUmVzb3VyY2UpIHsKLQkJdGhpcy5pZENsYXNzID0gdGhpcy5pZENsYXNzKGlkQ2xhc3NSZXNvdXJjZSk7CQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzKSB7Ci0JCXN1cGVyLnVwZGF0ZShtYXBwZWRTdXBlcmNsYXNzKTsKLQkJdGhpcy51cGRhdGVJZENsYXNzKHRoaXMuaWRDbGFzc1Jlc291cmNlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJZENsYXNzKFhtbElkQ2xhc3MgaWRDbGFzc1Jlc291cmNlKSB7Ci0JCXRoaXMuc2V0SWRDbGFzc18odGhpcy5pZENsYXNzKGlkQ2xhc3NSZXNvdXJjZSkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgaWRDbGFzcyhYbWxJZENsYXNzIGlkQ2xhc3NSZXNvdXJjZSkgewotCQlyZXR1cm4gaWRDbGFzc1Jlc291cmNlID09IG51bGwgPyBudWxsIDogaWRDbGFzc1Jlc291cmNlLmdldENsYXNzTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU5hbWVkTmF0aXZlUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExNTFiNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU5hbWVkTmF0aXZlUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU5hbWVkTmF0aXZlUXVlcnkgZXh0ZW5kcyBBYnN0cmFjdE9ybVF1ZXJ5PFhtbE5hbWVkTmF0aXZlUXVlcnk+Ci0JaW1wbGVtZW50cyBPcm1OYW1lZE5hdGl2ZVF1ZXJ5Ci17Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdENsYXNzOwotCi0JcHJvdGVjdGVkIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nOwotCi0KLQlwdWJsaWMgR2VuZXJpY09ybU5hbWVkTmF0aXZlUXVlcnkoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLnJlc3VsdENsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc3VsdENsYXNzKFN0cmluZyBuZXdSZXN1bHRDbGFzcykgewotCQlTdHJpbmcgb2xkUmVzdWx0Q2xhc3MgPSB0aGlzLnJlc3VsdENsYXNzOwotCQl0aGlzLnJlc3VsdENsYXNzID0gbmV3UmVzdWx0Q2xhc3M7Ci0JCWdldFF1ZXJ5UmVzb3VyY2UoKS5zZXRSZXN1bHRDbGFzcyhuZXdSZXN1bHRDbGFzcyk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTmFtZWROYXRpdmVRdWVyeS5SRVNVTFRfQ0xBU1NfUFJPUEVSVFksIG9sZFJlc3VsdENsYXNzLCBuZXdSZXN1bHRDbGFzcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXN1bHRTZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5yZXN1bHRTZXRNYXBwaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc3VsdFNldE1hcHBpbmcoU3RyaW5nIG5ld1Jlc3VsdFNldE1hcHBpbmcpIHsKLQkJU3RyaW5nIG9sZFJlc3VsdFNldE1hcHBpbmcgPSB0aGlzLnJlc3VsdFNldE1hcHBpbmc7Ci0JCXRoaXMucmVzdWx0U2V0TWFwcGluZyA9IG5ld1Jlc3VsdFNldE1hcHBpbmc7Ci0JCWdldFF1ZXJ5UmVzb3VyY2UoKS5zZXRSZXN1bHRTZXRNYXBwaW5nKG5ld1Jlc3VsdFNldE1hcHBpbmcpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5hbWVkTmF0aXZlUXVlcnkuUkVTVUxUX1NFVF9NQVBQSU5HX1BST1BFUlRZLCBvbGRSZXN1bHRTZXRNYXBwaW5nLCBuZXdSZXN1bHRTZXRNYXBwaW5nKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sTmFtZWROYXRpdmVRdWVyeSBxdWVyeVJlc291cmNlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUocXVlcnlSZXNvdXJjZSk7Ci0JCXRoaXMucmVzdWx0Q2xhc3MgPSBxdWVyeVJlc291cmNlLmdldFJlc3VsdENsYXNzKCk7Ci0JCXRoaXMucmVzdWx0U2V0TWFwcGluZyA9IHF1ZXJ5UmVzb3VyY2UuZ2V0UmVzdWx0U2V0TWFwcGluZygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sTmFtZWROYXRpdmVRdWVyeSBxdWVyeVJlc291cmNlKSB7Ci0JCXN1cGVyLnVwZGF0ZShxdWVyeVJlc291cmNlKTsKLQkJdGhpcy5zZXRSZXN1bHRDbGFzcyhxdWVyeVJlc291cmNlLmdldFJlc3VsdENsYXNzKCkpOwotCQl0aGlzLnNldFJlc3VsdFNldE1hcHBpbmcocXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OYW1lZFF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU5hbWVkUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkMDA0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU5hbWVkUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5OwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtTmFtZWRRdWVyeSBleHRlbmRzIEFic3RyYWN0T3JtUXVlcnk8WG1sTmFtZWRRdWVyeT4gaW1wbGVtZW50cyBPcm1OYW1lZFF1ZXJ5Ci17Ci0KLQlwdWJsaWMgR2VuZXJpY09ybU5hbWVkUXVlcnkoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjc5NjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxYbWxOdWxsQXR0cmlidXRlTWFwcGluZz4KLXsKLQotCXB1YmxpYyBHZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGFkZFRvUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvTWFueU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwZGQ3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Ob25Pd25pbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc8WG1sT25lVG9NYW55PgotCWltcGxlbWVudHMgT3JtT25lVG9NYW55TWFwcGluZwotewotCi0JcHVibGljIEdlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtT25lVG9NYW55TWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVhtbE5vbk93bmluZ01hcHBpbmcoTm9uT3duaW5nTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tWG1sTm9uT3duaW5nTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJc2V0TWFwcGVkQnkob2xkTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gNTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIE5vbk93bmluZ01hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5SXNWYWxpZChBdHRyaWJ1dGVNYXBwaW5nIG1hcHBlZEJ5TWFwcGluZykgewotCQlTdHJpbmcgbWFwcGVkQnlLZXkgPSBtYXBwZWRCeU1hcHBpbmcuZ2V0S2V5KCk7Ci0JCXJldHVybiAobWFwcGVkQnlLZXkgPT0gTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQl9Ci0JCi0JcHVibGljIFhtbE9uZVRvTWFueSBhZGRUb1Jlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT25lVG9NYW55SW1wbCgpOwotCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaW5pdGlhbGl6ZShvbmVUb01hbnkpOwotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmFkZChvbmVUb01hbnkpOwotCQlyZXR1cm4gb25lVG9NYW55OwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkucmVtb3ZlKHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpKTsKLQkJaWYgKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJdHlwZU1hcHBpbmcuc2V0QXR0cmlidXRlcyhudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWNmNDdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Ob25Pd25pbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzxYbWxPbmVUb09uZT4KLQlpbXBsZW1lbnRzIE9ybU9uZVRvT25lTWFwcGluZwotewotCQotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkQnk7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1uczsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybU9uZVRvT25lTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVhtbE5vbk93bmluZ01hcHBpbmcoTm9uT3duaW5nTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tWG1sTm9uT3duaW5nTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJc2V0TWFwcGVkQnkob2xkTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNSZWxhdGlvbnNoaXBPd25lcigpIHsKLQkJcmV0dXJuIGdldE1hcHBlZEJ5KCkgPT0gbnVsbDsKLQl9Ci0KLQkKLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+KHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zKTsKLQl9Ci0JCi0JcHVibGljIGludCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIG5ldyBKb2luQ29sdW1uT3duZXIoKSk7Ci0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHhtbFBrSm9pbkNvbHVtbiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoaW5kZXgsIHBrSm9pbkNvbHVtbik7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChpbmRleCwgeG1sUGtKb2luQ29sdW1uKTsKLQkJcGtKb2luQ29sdW1uLmluaXRpYWxpemUoeG1sUGtKb2luQ29sdW1uKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKE9uZVRvT25lTWFwcGluZy5QUklNQVlfS0VZX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcGtKb2luQ29sdW1uKTsKLQkJcmV0dXJuIHBrSm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgsIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgam9pbkNvbHVtbiwgdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIE9uZVRvT25lTWFwcGluZy5QUklNQVlfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4pIHsKLQkJdGhpcy5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucy5pbmRleE9mKHBrSm9pbkNvbHVtbikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcmVtb3ZlZFBrSm9pbkNvbHVtbiA9IHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChPbmVUb09uZU1hcHBpbmcuUFJJTUFZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHJlbW92ZWRQa0pvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uXyhPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChqb2luQ29sdW1uLCB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucywgT25lVG9PbmVNYXBwaW5nLlBSSU1BWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChPbmVUb09uZU1hcHBpbmcuUFJJTUFZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1ByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICF0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGVkQnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG5ld01hcHBlZEJ5KSB7Ci0JCVN0cmluZyBvbGRNYXBwZWRCeSA9IHRoaXMubWFwcGVkQnk7Ci0JCXRoaXMubWFwcGVkQnkgPSBuZXdNYXBwZWRCeTsKLQkJZ2V0QXR0cmlidXRlTWFwcGluZygpLnNldE1hcHBlZEJ5KG5ld01hcHBlZEJ5KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQRURfQllfUFJPUEVSVFksIG9sZE1hcHBlZEJ5LCBuZXdNYXBwZWRCeSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE1hcHBlZEJ5XyhTdHJpbmcgbmV3TWFwcGVkQnkpIHsKLQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gdGhpcy5tYXBwZWRCeTsKLQkJdGhpcy5tYXBwZWRCeSA9IG5ld01hcHBlZEJ5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkTWFwcGVkQnksIG5ld01hcHBlZEJ5KTsKLQl9CQotCQotCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5SXNWYWxpZChBdHRyaWJ1dGVNYXBwaW5nIG1hcHBlZEJ5TWFwcGluZykgewotCQlTdHJpbmcgbWFwcGVkQnlLZXkgPSBtYXBwZWRCeU1hcHBpbmcuZ2V0S2V5KCk7Ci0JCXJldHVybiAobWFwcGVkQnlLZXkgPT0gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSBtYXBwZWRCeVRleHRSYW5nZSA9IGdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRNYXBwZWRCeVRleHRSYW5nZSgpOwotCQlyZXR1cm4gbWFwcGVkQnlUZXh0UmFuZ2UgIT0gbnVsbCA/IG1hcHBlZEJ5VGV4dFJhbmdlIDogZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDY7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIFhtbE9uZVRvT25lIGFkZFRvUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT25lVG9PbmVJbXBsKCk7Ci0JCWdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pbml0aWFsaXplKG9uZVRvT25lKTsKLQkJdHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmFkZChvbmVUb09uZSk7Ci0JCXJldHVybiBvbmVUb09uZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkucmVtb3ZlKHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpKTsKLQkJaWYgKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJdHlwZU1hcHBpbmcuc2V0QXR0cmlidXRlcyhudWxsKTsKLQkJfQotCX0JCi0KLQkKLQkvLyoqKioqKioqKioqKioqKioqIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQkKLQkJaWYgKHRoaXMuZ2V0TWFwcGVkQnkoKSAhPSBudWxsKSB7Ci0JCQlhZGRNYXBwZWRCeU1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRKb2luQ29sdW1uTWVzc2FnZXMoKSB7Ci0JCWlmIChjb250YWluc1ByaW1hcnlLZXlKb2luQ29sdW1ucygpICYmICFjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuYWRkSm9pbkNvbHVtbk1lc3NhZ2VzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE1hcHBlZEJ5TWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJU3RyaW5nIG1hcHBlZEJ5ID0gdGhpcy5nZXRNYXBwZWRCeSgpOwotCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQkKLQkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7Ci0JCQkvLyBhbHJlYWR5IGhhdmUgdmFsaWRhdGlvbiBtZXNzYWdlcyBmb3IgdGhhdAotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHRhcmdldEVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLnJlc29sdmVBdHRyaWJ1dGUobWFwcGVkQnkpOwotCQkKLQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX1VOUkVTT0xWRURfTUFQUEVEX0JZLAotCQkJCQkJbmV3IFN0cmluZ1tdIHttYXBwZWRCeX0sIAotCQkJCQkJdGhpcywgdGhpcy5nZXRNYXBwZWRCeVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICghIHRoaXMubWFwcGVkQnlJc1ZhbGlkKGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX0lOVkFMSURfTUFQUEVEX0JZLAotCQkJCQkJbmV3IFN0cmluZ1tdIHttYXBwZWRCeX0sIAotCQkJCQkJdGhpcywgdGhpcy5nZXRNYXBwZWRCeVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCU5vbk93bmluZ01hcHBpbmcgbWFwcGVkQnlNYXBwaW5nOwotCQl0cnkgewotCQkJbWFwcGVkQnlNYXBwaW5nID0gKE5vbk93bmluZ01hcHBpbmcpIGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKLQkJCS8vIHRoZXJlIGlzIG5vIGVycm9yIHRoZW4KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKG1hcHBlZEJ5TWFwcGluZy5nZXRNYXBwZWRCeSgpICE9IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfTUFQUEVEX0JZX09OX0JPVEhfU0lERVMsCi0JCQkJCQl0aGlzLCB0aGlzLmdldE1hcHBlZEJ5VGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sT25lVG9PbmUgb25lVG9PbmUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShvbmVUb09uZSk7Ci0JCXRoaXMubWFwcGVkQnkgPSBvbmVUb09uZS5nZXRNYXBwZWRCeSgpOwotCQl0aGlzLmluaXRpYWxpemVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMob25lVG9PbmUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJpbWFyeUtleUpvaW5Db2x1bW5zKFhtbE9uZVRvT25lIG9uZVRvT25lKSB7Ci0JCWlmIChvbmVUb09uZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gOiBvbmVUb09uZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMuYWRkKGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4ocGtKb2luQ29sdW1uKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4geG1sUGtKb2luQ29sdW1uKSB7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIG9ybVBrSm9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIG5ldyBKb2luQ29sdW1uT3duZXIoKSk7Ci0JCW9ybVBrSm9pbkNvbHVtbi5pbml0aWFsaXplKHhtbFBrSm9pbkNvbHVtbik7Ci0JCXJldHVybiBvcm1Qa0pvaW5Db2x1bW47Ci0JfQkKLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxPbmVUb09uZSBvbmVUb09uZSkgewotCQlzdXBlci51cGRhdGUob25lVG9PbmUpOwotCQl0aGlzLnNldE1hcHBlZEJ5XyhvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkJdGhpcy51cGRhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMob25lVG9PbmUpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoWG1sT25lVG9PbmUgb25lVG9PbmUpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwa0pvaW5Db2x1bW5zID0gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcmVzb3VyY2VQa0pvaW5Db2x1bW5zID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJaWYgKG9uZVRvT25lICE9IG51bGwpIHsKLQkJCXJlc291cmNlUGtKb2luQ29sdW1ucyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4ob25lVG9PbmUuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQl9Ci0JCQotCQl3aGlsZSAocGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IHBrSm9pbkNvbHVtbnMubmV4dCgpOwotCQkJaWYgKHJlc291cmNlUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQlwa0pvaW5Db2x1bW4udXBkYXRlKHJlc291cmNlUGtKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW5fKHBrSm9pbkNvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZVBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihwcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCksIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVzb3VyY2VQa0pvaW5Db2x1bW5zLm5leHQoKSkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiNzY2YwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDIzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybU9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWltcGxlbWVudHMgT3JtT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwlwcm90ZWN0ZWQgT3JtTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kgbWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CisJCisJcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKKwkKKwlwcm90ZWN0ZWQgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgcHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJCisJCisJcHVibGljIEdlbmVyaWNPcm1PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSgKKwkJCU9ybU9uZVRvT25lTWFwcGluZyBwYXJlbnQsIFhtbE9uZVRvT25lIHJlc291cmNlKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2UpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWdpZXMoKSB7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kgPSBidWlsZE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCk7CisJCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgPSBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCQorCQkvLyBpbml0aWFsaXplIGpvaW4gY29sdW1ucyBsYXN0LCBhcyB0aGUgZXhpc3RlbmNlIG9mIGEgZGVmYXVsdCBqb2luIAorCQkvLyBjb2x1bW4gaXMgZGVwZW5kZW50IG9uIHRoZSBvdGhlciBtZWNoYW5pc21zIChtYXBwZWRCeSwgam9pbiB0YWJsZSkKKwkJLy8gbm90IGJlaW5nIHNwZWNpZmllZAorCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgPSBidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IGJ1aWxkTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KHRoaXMsIGdldFJlc291cmNlTWFwcGluZygpKTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KHRoaXMsIGdldFJlc291cmNlTWFwcGluZygpKTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KHRoaXMsIGdldFJlc291cmNlTWFwcGluZygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBuZXdSZWxhdGlvbnNoaXBSZWZlcmVuY2UpIHsKKwkJbmV3UmVsYXRpb25zaGlwUmVmZXJlbmNlLmluaXRpYWxpemVGcm9tT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSh0aGlzKTsKKwkJbmV3UmVsYXRpb25zaGlwUmVmZXJlbmNlLmluaXRpYWxpemVGcm9tSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UodGhpcyk7CisJCS8vIG5vIG90aGVyIHByaW1hcnkga2V5IHJlZmVyZW5jZSBhcyBvZiB5ZXQsIHNvIG5vIGluaXRpYWxpemF0aW9uIGJhc2VkIG9uIHBrIGpvaW4gY29sdW1ucworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCisJCQlPcm1Pd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlIG9sZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgeworCQl0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LnNldE1hcHBlZEJ5QXR0cmlidXRlKAorCQkJb2xkUmVsYXRpb25zaGlwUmVmZXJlbmNlLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCisJCQlPcm1Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSBvbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UpIHsKKwkJaW50IGluZGV4ID0gMDsKKwkJZm9yIChKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiAKKwkJCQlDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoCisJCQkJCW9sZFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkpIHsKKwkJCU9ybUpvaW5Db2x1bW4gbmV3Sm9pbkNvbHVtbiA9IGdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKGluZGV4KyspOworCQkJbmV3Sm9pbkNvbHVtbi5pbml0aWFsaXplRnJvbShqb2luQ29sdW1uKTsKKwkJfQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbUpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCisJCQlPcm1Kb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlIG9sZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSkgeworCQkvLyBUT0RPIG5vIGpvaW4gdGFibGUgY29udGV4dCBtb2RlbCBzdXBwb3J0IGFzIG9mIHlldAorCQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybU9uZVRvT25lTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gKE9ybU9uZVRvT25lTWFwcGluZykgZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBYbWxPbmVUb09uZSBnZXRSZXNvdXJjZU1hcHBpbmcoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKSB7CisJCXJldHVybiB0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkgPT0gbnVsbDsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNPd25lZEJ5KFJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZykgeworCQlyZXR1cm4gdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5yZWxhdGlvbnNoaXBJc093bmVkQnkobWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKb2luaW5nU3RyYXRlZ3kgY2FsY3VsYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB7CisJCWlmICh0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgPiAwKSB7CisJCQlyZXR1cm4gdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJCX0KKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBtYXBwZWQgYnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBPcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneSBnZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIGdldFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgPT0gdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuYWRkU3RyYXRlZ3koKTsKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7CisJCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIHZvaWQgdW5zZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBtYXlCZU1hcHBlZEJ5KEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGVkQnlNYXBwaW5nKSB7CisJCXJldHVybiBtYXBwZWRCeU1hcHBpbmcuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogam9pbiBjb2x1bW5zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBnZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiB1c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIGdldFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgPT0gdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQl0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7CisJCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwkJLy8gam9pbiBjb2x1bW5zIGFyZSBkZWZhdWx0LCBzbyBubyBuZWVkIHRvIGFkZCBhbm5vdGF0aW9ucworCX0KKwkKKwlwdWJsaWMgdm9pZCB1bnNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBtYXlIYXZlRGVmYXVsdEpvaW5Db2x1bW4oKSB7CisJCXJldHVybiB0aGlzLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSA9PSBudWxsIAorCQkJJiYgdGhpcy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLnByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSA9PSAwOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGdldFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gdXNlc1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gZ2V0UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSA9PSB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpIHsKKwkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5hZGRTdHJhdGVneSgpOworCQl0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1bnNldFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZSA9PiBjb250ZXh0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUpvaW5pbmdTdHJhdGVnaWVzKCkgeworCQl0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LnVwZGF0ZSgpOworCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnVwZGF0ZSgpOworCQkKKwkJLy8gdXBkYXRlIGpvaW4gY29sdW1ucyBsYXN0LCBhcyB0aGUgZXhpc3RlbmNlIG9mIGEgZGVmYXVsdCBqb2luIAorCQkvLyBjb2x1bW4gaXMgZGVwZW5kZW50IG9uIHRoZSBvdGhlciBtZWNoYW5pc21zIChtYXBwZWRCeSwgam9pbiB0YWJsZSkKKwkJLy8gbm90IGJlaW5nIHNwZWNpZmllZAorCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kudXBkYXRlKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQxYTVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBleHRlbmRzIEFic3RyYWN0T3JtSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUKLXsKLQotCXByb3RlY3RlZCBMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gYXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyczsKLQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmc7Ci0JCi0JcHVibGljIEdlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5hdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzID0gYnVpbGRBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKCk7Ci0JCXRoaXMuYXR0cmlidXRlTWFwcGluZyA9IGJ1aWxkQXR0cmlidXRlTWFwcGluZyhtYXBwaW5nS2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+IGJ1aWxkQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycygpIHsKLQkJTGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4oKTsKLQkJbGlzdC5hZGQoT3JtRW1iZWRkZWRNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7IC8vYnVnIDE5MDM0NCBuZWVkIHRvIHRlc3QgZGVmYXVsdCBlbWJlZGRlZCBiZWZvcmUgYmFzaWMKLQkJbGlzdC5hZGQoT3JtQmFzaWNNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCWxpc3QuYWRkKE9ybVRyYW5zaWVudE1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJbGlzdC5hZGQoT3JtSWRNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCWxpc3QuYWRkKE9ybU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCWxpc3QuYWRkKE9ybU9uZVRvTWFueU1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJbGlzdC5hZGQoT3JtTWFueVRvT25lTWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlsaXN0LmFkZChPcm1PbmVUb09uZU1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJbGlzdC5hZGQoT3JtVmVyc2lvbk1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJbGlzdC5hZGQoT3JtRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgYXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKFN0cmluZyBrZXkpIHsKLQkJZm9yIChPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgcHJvdmlkZXIgOiB0aGlzLmF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMpIHsKLQkJCWlmIChwcm92aWRlci5nZXRLZXkoKS5lcXVhbHMoa2V5KSkgewotCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkQXR0cmlidXRlTWFwcGluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcihrZXkpLmJ1aWxkQXR0cmlidXRlTWFwcGluZyhnZXRKcGFGYWN0b3J5KCksIHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gT3JtU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0TWFwcGluZygpLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuYW1lQ2hhbmdlZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBnZXRTcGVjaWZpZWRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nOwotCX0KLQkKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmdldEtleSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE1hcHBpbmdLZXkoU3RyaW5nIG5ld01hcHBpbmdLZXkpIHsKLQkJaWYgKHRoaXMuZ2V0TWFwcGluZ0tleSgpID09IG5ld01hcHBpbmdLZXkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlPcm1BdHRyaWJ1dGVNYXBwaW5nIG9sZE1hcHBpbmcgPSBnZXRNYXBwaW5nKCk7Ci0JCXRoaXMuYXR0cmlidXRlTWFwcGluZyA9IGJ1aWxkQXR0cmlidXRlTWFwcGluZyhuZXdNYXBwaW5nS2V5KTsKLQkJZ2V0UGVyc2lzdGVudFR5cGUoKS5jaGFuZ2VNYXBwaW5nKHRoaXMsIG9sZE1hcHBpbmcsIHRoaXMuYXR0cmlidXRlTWFwcGluZyk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01BUFBJTkdfUFJPUEVSVFksIG9sZE1hcHBpbmcsIHRoaXMuYXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE1hcHBpbmdLZXlfKFN0cmluZyBuZXdNYXBwaW5nS2V5KSB7Ci0JCWlmICh0aGlzLmdldE1hcHBpbmdLZXkoKSA9PSBuZXdNYXBwaW5nS2V5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJT3JtQXR0cmlidXRlTWFwcGluZyBvbGRNYXBwaW5nID0gZ2V0TWFwcGluZygpOwotCQl0aGlzLmF0dHJpYnV0ZU1hcHBpbmcgPSBidWlsZEF0dHJpYnV0ZU1hcHBpbmcobmV3TWFwcGluZ0tleSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01BUFBJTkdfUFJPUEVSVFksIG9sZE1hcHBpbmcsIHRoaXMuYXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb248T3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBhdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzOwotCX0KLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIChPcm1QZXJzaXN0ZW50VHlwZSkgZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE9ybVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudFR5cGUoKS5jb250YWluc1ZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1ha2VWaXJ0dWFsKCkgewotCQlpZiAoaXNWaXJ0dWFsKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dHJpYnV0ZSBpcyBhbHJlYWR5IHZpcnR1YWwiKTsKLQkJfQotCQlnZXRPcm1QZXJzaXN0ZW50VHlwZSgpLm1ha2VQZXJzaXN0ZW50QXR0cmlidXRlVmlydHVhbCh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbWFrZVNwZWNpZmllZCgpIHsKLQkJaWYgKCFpc1ZpcnR1YWwoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXR0cmlidXRlIGlzIGFscmVhZHkgc3BlY2lmaWVkIik7Ci0JCX0KLQkJaWYgKGdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVXNlIG1ha2VTcGVjaWZpZWQoU3RyaW5nKSBpbnN0ZWFkIGFuZCBzcGVjaWZ5IGEgbWFwcGluZyB0eXBlIik7Ci0JCX0KLQkJZ2V0T3JtUGVyc2lzdGVudFR5cGUoKS5tYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVNwZWNpZmllZCh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbWFrZVNwZWNpZmllZChTdHJpbmcgbWFwcGluZ0tleSkgewotCQlpZiAoIWlzVmlydHVhbCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBdHRyaWJ1dGUgaXMgYWxyZWFkeSBzcGVjaWZpZWQiKTsKLQkJfQotCQlnZXRPcm1QZXJzaXN0ZW50VHlwZSgpLm1ha2VQZXJzaXN0ZW50QXR0cmlidXRlU3BlY2lmaWVkKHRoaXMsIG1hcHBpbmdLZXkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gZ2V0TWFwcGluZygpLmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmlzT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5pc0lkTWFwcGluZygpOwotCX0KLQkKLQkvL1RPRE8gaXMgdGhlcmUgYSB3YXkgdG8gYXZvaWQgYSBtZXRob2QgZm9yIGV2ZXJ5IG1hcHBpbmcgdHlwZT8KLQkvL0kgYW0gdHJ5aW5nIHRvIHRha2UgYWRhdmFudGFnZSBvZiBnZW5lcmljcyBoZXJlLCBidXQgaXQgc3VyZSBpcwotCS8vbGVhZGluZyB0byBhIGxvdCBvZiBkdXBsaWNhdGVkIGNvZGUuIC0gS0ZNCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxCYXNpYyBiYXNpYykgewotCQkoKE9ybUJhc2ljTWFwcGluZykgZ2V0TWFwcGluZygpKS5pbml0aWFsaXplKGJhc2ljKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxFbWJlZGRlZCBlbWJlZGRlZCkgewotCQkoKE9ybUVtYmVkZGVkTWFwcGluZykgZ2V0TWFwcGluZygpKS5pbml0aWFsaXplKGVtYmVkZGVkKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxWZXJzaW9uIHZlcnNpb24pIHsKLQkJKChPcm1WZXJzaW9uTWFwcGluZykgZ2V0TWFwcGluZygpKS5pbml0aWFsaXplKHZlcnNpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbE1hbnlUb09uZSBtYW55VG9PbmUpIHsKLQkJKChPcm1NYW55VG9PbmVNYXBwaW5nKSBnZXRNYXBwaW5nKCkpLmluaXRpYWxpemUobWFueVRvT25lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxPbmVUb01hbnkgb25lVG9NYW55KSB7Ci0JCSgoT3JtT25lVG9NYW55TWFwcGluZykgZ2V0TWFwcGluZygpKS5pbml0aWFsaXplKG9uZVRvTWFueSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sT25lVG9PbmUgb25lVG9PbmUpIHsKLQkJKChPcm1PbmVUb09uZU1hcHBpbmcpIGdldE1hcHBpbmcoKSkuaW5pdGlhbGl6ZShvbmVUb09uZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sTWFueVRvTWFueSBtYW55VG9NYW55KSB7Ci0JCSgoT3JtTWFueVRvTWFueU1hcHBpbmcpIGdldE1hcHBpbmcoKSkuaW5pdGlhbGl6ZShtYW55VG9NYW55KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxJZCBpZCkgewotCQkoKE9ybUlkTWFwcGluZykgZ2V0TWFwcGluZygpKS5pbml0aWFsaXplKGlkKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWQpIHsKLQkJKChPcm1FbWJlZGRlZElkTWFwcGluZykgZ2V0TWFwcGluZygpKS5pbml0aWFsaXplKGVtYmVkZGVkSWQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbFRyYW5zaWVudCB0cmFuc2llbnRSZXNvdXJjZSkgewotCQkoKE9ybVRyYW5zaWVudE1hcHBpbmcpIGdldE1hcHBpbmcoKSkuaW5pdGlhbGl6ZSh0cmFuc2llbnRSZXNvdXJjZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcpIHsKLQkJKChHZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcpIGdldE1hcHBpbmcoKSkuaW5pdGlhbGl6ZSh4bWxOdWxsQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxJZCBpZCkgewotCQlpZiAoZ2V0TWFwcGluZ0tleSgpICE9IE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJc2V0U3BlY2lmaWVkTWFwcGluZ0tleV8oTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJfQotCQkoKE9ybUlkTWFwcGluZykgZ2V0TWFwcGluZygpKS51cGRhdGUoaWQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkKSB7Ci0JCWlmIChnZXRNYXBwaW5nS2V5KCkgIT0gTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlzZXRTcGVjaWZpZWRNYXBwaW5nS2V5XyhNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQl9Ci0JCSgoT3JtRW1iZWRkZWRJZE1hcHBpbmcpIGdldE1hcHBpbmcoKSkudXBkYXRlKGVtYmVkZGVkSWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxCYXNpYyBiYXNpYykgewotCQlpZiAoZ2V0TWFwcGluZ0tleSgpICE9IE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJc2V0U3BlY2lmaWVkTWFwcGluZ0tleV8oTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJfQotCQkoKE9ybUJhc2ljTWFwcGluZykgZ2V0TWFwcGluZygpKS51cGRhdGUoYmFzaWMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCWlmIChnZXRNYXBwaW5nS2V5KCkgIT0gTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXNldFNwZWNpZmllZE1hcHBpbmdLZXlfKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJfQotCQkoKE9ybVZlcnNpb25NYXBwaW5nKSBnZXRNYXBwaW5nKCkpLnVwZGF0ZSh2ZXJzaW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbE1hbnlUb09uZSBtYW55VG9PbmUpIHsKLQkJaWYgKGdldE1hcHBpbmdLZXkoKSAhPSBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXNldFNwZWNpZmllZE1hcHBpbmdLZXlfKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCX0KLQkJKChPcm1NYW55VG9PbmVNYXBwaW5nKSBnZXRNYXBwaW5nKCkpLnVwZGF0ZShtYW55VG9PbmUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sT25lVG9NYW55IG9uZVRvTWFueSkgewotCQlpZiAoZ2V0TWFwcGluZ0tleSgpICE9IE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJc2V0U3BlY2lmaWVkTWFwcGluZ0tleV8oTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJfQotCQkoKE9ybU9uZVRvTWFueU1hcHBpbmcpIGdldE1hcHBpbmcoKSkudXBkYXRlKG9uZVRvTWFueSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxPbmVUb09uZSBvbmVUb09uZSkgewotCQlpZiAoZ2V0TWFwcGluZ0tleSgpICE9IE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlzZXRTcGVjaWZpZWRNYXBwaW5nS2V5XyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCX0KLQkJKChPcm1PbmVUb09uZU1hcHBpbmcpIGdldE1hcHBpbmcoKSkudXBkYXRlKG9uZVRvT25lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbE1hbnlUb01hbnkgbWFueVRvTWFueSkgewotCQlpZiAoZ2V0TWFwcGluZ0tleSgpICE9IE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXNldFNwZWNpZmllZE1hcHBpbmdLZXlfKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQl9Ci0JCSgoT3JtTWFueVRvTWFueU1hcHBpbmcpIGdldE1hcHBpbmcoKSkudXBkYXRlKG1hbnlUb01hbnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxFbWJlZGRlZCBlbWJlZGRlZCkgewotCQlpZiAoZ2V0TWFwcGluZ0tleSgpICE9IE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJc2V0U3BlY2lmaWVkTWFwcGluZ0tleV8oTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJfQotCQkoKE9ybUVtYmVkZGVkTWFwcGluZykgZ2V0TWFwcGluZygpKS51cGRhdGUoZW1iZWRkZWQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sVHJhbnNpZW50IHRyYW5zaWVudFJlc291cmNlKSB7Ci0JCWlmIChnZXRNYXBwaW5nS2V5KCkgIT0gTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJc2V0U3BlY2lmaWVkTWFwcGluZ0tleV8oTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCX0KLQkJKChPcm1UcmFuc2llbnRNYXBwaW5nKSBnZXRNYXBwaW5nKCkpLnVwZGF0ZSh0cmFuc2llbnRSZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIHhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKSB7Ci0JCWlmIChnZXRNYXBwaW5nS2V5KCkgIT0gTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXNldFNwZWNpZmllZE1hcHBpbmdLZXlfKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJfQotCQkoKEdlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZykgZ2V0TWFwcGluZygpKS51cGRhdGUoeG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHRleHRPZmZzZXQpIHsKLQkJaWYgKGlzVmlydHVhbCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwcGluZy5jb250YWlucyh0ZXh0T2Zmc2V0KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7Ci0JCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwcGluZy5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJZ2V0TWFwcGluZygpLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIGdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpLmdldEF0dHJpYnV0ZXNUZXh0UmFuZ2UoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKGdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vbm90aGluZyB0byBkaXNwb3NlCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzcwNTRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TdHJ1Y3R1cmVOb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2hhaW5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtUGVyc2lzdGVudFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgT3JtUGVyc2lzdGVudFR5cGUKLXsKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlczsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlczsKLQotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uPE9ybVR5cGVNYXBwaW5nUHJvdmlkZXI+IHR5cGVNYXBwaW5nUHJvdmlkZXJzOwotCi0JcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOwotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSBwYXJlbnRQZXJzaXN0ZW50VHlwZTsKLQkKLQlwdWJsaWMgR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlKEVudGl0eU1hcHBpbmdzIHBhcmVudCwgU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy50eXBlTWFwcGluZ1Byb3ZpZGVycyA9IGJ1aWxkVHlwZU1hcHBpbmdQcm92aWRlcnMoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IGJ1aWxkT3JtVHlwZU1hcHBpbmcobWFwcGluZ0tleSk7Ci0JCXRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCXRoaXMudmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gT3JtU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9UWVBFX0lEOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9yKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChjbGFzc05hbWUuZXF1YWxzKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpICsgIi4iICsgIGNsYXNzTmFtZSkuZXF1YWxzKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBidWlsZE9ybVR5cGVNYXBwaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nUHJvdmlkZXIoa2V5KS5idWlsZFR5cGVNYXBwaW5nKGdldEpwYUZhY3RvcnkoKSwgdGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248T3JtVHlwZU1hcHBpbmdQcm92aWRlcj4gYnVpbGRUeXBlTWFwcGluZ1Byb3ZpZGVycygpIHsKLQkJQ29sbGVjdGlvbjxPcm1UeXBlTWFwcGluZ1Byb3ZpZGVyPiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxPcm1UeXBlTWFwcGluZ1Byb3ZpZGVyPigpOwotCQljb2xsZWN0aW9uLmFkZChuZXcgT3JtRW50aXR5UHJvdmlkZXIoKSk7Ci0JCWNvbGxlY3Rpb24uYWRkKG5ldyBPcm1NYXBwZWRTdXBlcmNsYXNzUHJvdmlkZXIoKSk7Ci0JCWNvbGxlY3Rpb24uYWRkKG5ldyBPcm1FbWJlZGRhYmxlUHJvdmlkZXIoKSk7Ci0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZ1Byb3ZpZGVyIGdldFR5cGVNYXBwaW5nUHJvdmlkZXIoU3RyaW5nIGtleSkgewotCQlmb3IgKE9ybVR5cGVNYXBwaW5nUHJvdmlkZXIgcHJvdmlkZXIgOiB0aGlzLnR5cGVNYXBwaW5nUHJvdmlkZXJzKSB7Ci0JCQlpZiAocHJvdmlkZXIuZ2V0S2V5KCkuZXF1YWxzKGtleSkpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBPcm1UeXBlTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXBwaW5nS2V5KFN0cmluZyBuZXdNYXBwaW5nS2V5KSB7Ci0JCWlmICh0aGlzLmdldE1hcHBpbmdLZXkoKSA9PSBuZXdNYXBwaW5nS2V5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJT3JtVHlwZU1hcHBpbmcgb2xkTWFwcGluZyA9IGdldE1hcHBpbmcoKTsKLQkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IGJ1aWxkT3JtVHlwZU1hcHBpbmcobmV3TWFwcGluZ0tleSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuY2hhbmdlTWFwcGluZyh0aGlzLCBvbGRNYXBwaW5nLCB0aGlzLm9ybVR5cGVNYXBwaW5nKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQSU5HX1BST1BFUlRZLCBvbGRNYXBwaW5nLCB0aGlzLm9ybVR5cGVNYXBwaW5nKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFwcGluZ0tleV8oU3RyaW5nIG5ld01hcHBpbmdLZXkpIHsKLQkJaWYgKHRoaXMuZ2V0TWFwcGluZ0tleSgpID09IG5ld01hcHBpbmdLZXkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlPcm1UeXBlTWFwcGluZyBvbGRNYXBwaW5nID0gZ2V0TWFwcGluZygpOwotCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gYnVpbGRPcm1UeXBlTWFwcGluZyhuZXdNYXBwaW5nS2V5KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQSU5HX1BST1BFUlRZLCBvbGRNYXBwaW5nLCB0aGlzLm9ybVR5cGVNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IGluaGVyaXRhbmNlSGllcmFyY2h5KCkgewotCQkvLyB1c2luZyBhIGNoYWluIGl0ZXJhdG9yIHRvIHRyYXZlcnNlIHVwIHRoZSBpbmhlcml0YW5jZSB0cmVlCi0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4odGhpcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgbmV4dExpbmsoUGVyc2lzdGVudFR5cGUgcHQpIHsKLQkJCQlyZXR1cm4gcHQuZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVudFR5cGUgZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRQZXJzaXN0ZW50VHlwZShQZXJzaXN0ZW50VHlwZSBuZXdQYXJlbnRQZXJzaXN0ZW50VHlwZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMucGFyZW50UGVyc2lzdGVudFR5cGUsIG5ld1BhcmVudFBlcnNpc3RlbnRUeXBlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVBlcnNpc3RlbnRUeXBlIG9sZFBhcmVudFBlcnNpc3RlbnRUeXBlID0gdGhpcy5wYXJlbnRQZXJzaXN0ZW50VHlwZTsKLQkJdGhpcy5wYXJlbnRQZXJzaXN0ZW50VHlwZSA9IG5ld1BhcmVudFBlcnNpc3RlbnRUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBlcnNpc3RlbnRUeXBlLlBBUkVOVF9QRVJTSVNURU5UX1RZUEVfUFJPUEVSVFksIG9sZFBhcmVudFBlcnNpc3RlbnRUeXBlLCBuZXdQYXJlbnRQZXJzaXN0ZW50VHlwZSk7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgewotCQlyZXR1cm4gZ2V0TWFwcGluZygpLmdldEFjY2VzcygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjaGFuZ2VNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgT3JtQXR0cmlidXRlTWFwcGluZyBvbGRNYXBwaW5nLCBPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJaW50IHNvdXJjZUluZGV4ID0gdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5pbmRleE9mKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlpZiAoc291cmNlSW5kZXggIT0gLTEpIHsKLQkJCXRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMucmVtb3ZlKHNvdXJjZUluZGV4KTsKLQkJCW9sZE1hcHBpbmcucmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoZ2V0TWFwcGluZygpLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKSk7Ci0JCX0KLQkJaWYgKGdldE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0QXR0cmlidXRlcygpID09IG51bGwpIHsKLQkJCWdldE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0QXR0cmlidXRlcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdHRyaWJ1dGVzKCkpOwotCQl9Ci0JCWludCB0YXJnZXRJbmRleCA9IGluc2VydGlvbkluZGV4KG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZCh0YXJnZXRJbmRleCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCW5ld01hcHBpbmcuYWRkVG9SZXNvdXJjZU1vZGVsKGdldE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkpOwotCQlvbGRNYXBwaW5nLmluaXRpYWxpemVPbihuZXdNYXBwaW5nKTsKLQkJaWYgKHNvdXJjZUluZGV4ICE9IC0xKSB7Ci0JCQkvL1RPRE8gYXJlIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBjb3JyZWN0IGluIHRoaXMgY2FzZSwgb3IgaXMgdGFyZ2V0IG9mZiBieSBvbmU/Pz8KLQkJCWZpcmVJdGVtTW92ZWQoU1BFQ0lGSUVEX0FUVFJJQlVURVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1ha2VQZXJzaXN0ZW50QXR0cmlidXRlVmlydHVhbChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJaWYgKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dHJpYnV0ZSBpcyBhbHJlYWR5IHZpcnR1YWwiKTsKLQkJfQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBudWxsOwotCQlpZiAoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBjcmVhdGVWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQl0aGlzLnZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQodmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl9Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJaWYgKHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCWZpcmVJdGVtQWRkZWQoVklSVFVBTF9BVFRSSUJVVEVTX0xJU1QsIHZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpIC0gMSwgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1ha2VQZXJzaXN0ZW50QXR0cmlidXRlU3BlY2lmaWVkKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQltYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVNwZWNpZmllZChvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVNwZWNpZmllZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCWlmICghb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXR0cmlidXRlIGlzIGFscmVhZHkgc3BlY2lmaWVkIik7Ci0JCX0KLQkJaWYgKG1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVzZSBtYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVNwZWNpZmllZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBTdHJpbmcpIGluc3RlYWQgYW5kIHNwZWNpZnkgYSBtYXBwaW5nIHR5cGUiKTsKLQkJfQotCQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3UGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgbWFwcGluZ0tleSk7Ci0JCWlmIChnZXRNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLmdldEF0dHJpYnV0ZXMoKSA9PSBudWxsKSB7Ci0JCQlnZXRNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmdSZXNvdXJjZSgpLnNldEF0dHJpYnV0ZXMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0cmlidXRlcygpKTsKLQkJfQotCQlpbnQgaW5zZXJ0aW9uSW5kZXggPSBpbnNlcnRpb25JbmRleChuZXdQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoaW5zZXJ0aW9uSW5kZXgsIG5ld1BlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQluZXdQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5hZGRUb1Jlc291cmNlTW9kZWwoZ2V0TWFwcGluZygpLmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKSk7Ci0JCQotCQlpbnQgcmVtb3ZhbEluZGV4ID0gdGhpcy52aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXMuaW5kZXhPZihvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJdGhpcy52aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXMucmVtb3ZlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQluZXdQZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKS5zZXROYW1lKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWZpcmVJdGVtQWRkZWQoUGVyc2lzdGVudFR5cGUuU1BFQ0lGSUVEX0FUVFJJQlVURVNfTElTVCwgaW5zZXJ0aW9uSW5kZXgsIG5ld1BlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlmaXJlSXRlbVJlbW92ZWQoVklSVFVBTF9BVFRSSUJVVEVTX0xJU1QsIHJlbW92YWxJbmRleCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gYWxsQXR0cmlidXRlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZU5hbWVzKHRoaXMuYWxsQXR0cmlidXRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxQZXJzaXN0ZW50VHlwZSwgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4+KHRoaXMuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gdHJhbnNmb3JtKFBlcnNpc3RlbnRUeXBlIHB0KSB7Ci0JCQkJcmV0dXJuIHB0LmF0dHJpYnV0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXNOYW1lZChmaW5hbCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KGF0dHJpYnV0ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvKSB7Ci0JCQkJaWYgKGF0dHJpYnV0ZU5hbWUgPT0gbnVsbCAmJiBvLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlpZiAoYXR0cmlidXRlTmFtZSAhPSBudWxsICYmIGF0dHJpYnV0ZU5hbWUuZXF1YWxzKG8uZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGdldEF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IGF0dHJpYnV0ZXNOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQkJcmV0dXJuIChzdHJlYW0uaGFzTmV4dCgpKSA/IHN0cmVhbS5uZXh0KCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVOYW1lcyh0aGlzLmF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzKEl0ZXJhdG9yPD8gZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRycykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZSwgU3RyaW5nPihhdHRycykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZEF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IHNwZWNpZmllZEF0dHJpYnV0ZXNOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQkJcmV0dXJuIChzdHJlYW0uaGFzTmV4dCgpKSA/IHN0cmVhbS5uZXh0KCkgOiBudWxsOwotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXNOYW1lZChmaW5hbCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHNwZWNpZmllZEF0dHJpYnV0ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZU5hbWUuZXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHNwZWNpZmllZEF0dHJpYnV0ZXMoKSwgdmlydHVhbEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHVibGljIGludCBhdHRyaWJ1dGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkgKyB2aXJ0dWFsQXR0cmlidXRlc1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gdmlydHVhbEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy52aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXMpOwkJCi0JfQotCQotCXB1YmxpYyBpbnQgdmlydHVhbEF0dHJpYnV0ZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXMuc2l6ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJYWRkSXRlbVRvTGlzdChvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCB0aGlzLnZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlcywgT3JtUGVyc2lzdGVudFR5cGUuVklSVFVBTF9BVFRSSUJVVEVTX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3Qob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgdGhpcy52aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXMsIE9ybVBlcnNpc3RlbnRUeXBlLlZJUlRVQUxfQVRUUklCVVRFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmNvbnRhaW5zKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQkKLQlwdWJsaWMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKFN0cmluZyBtYXBwaW5nS2V5LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIG1hcHBpbmdLZXkpOwotCQlpbnQgaW5kZXggPSBpbnNlcnRpb25JbmRleChwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJaWYgKGdldE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuZ2V0QXR0cmlidXRlcygpID09IG51bGwpIHsKLQkJCWdldE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkuc2V0QXR0cmlidXRlcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdHRyaWJ1dGVzKCkpOwotCQl9Ci0JCXRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKGluZGV4LCBwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuYWRkVG9SZXNvdXJjZU1vZGVsKGdldE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkuc2V0TmFtZShhdHRyaWJ1dGVOYW1lKTsKLQkJZmlyZUl0ZW1BZGRlZChQZXJzaXN0ZW50VHlwZS5TUEVDSUZJRURfQVRUUklCVVRFU19MSVNULCBpbmRleCwgcGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlOwotCX0KLQotCXByb3RlY3RlZCBpbnQgaW5zZXJ0aW9uSW5kZXgoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZih0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLCBwZXJzaXN0ZW50QXR0cmlidXRlLCBidWlsZE1hcHBpbmdDb21wYXJhdG9yKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb21wYXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGJ1aWxkTWFwcGluZ0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG8xLCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG8yKSB7Ci0JCQkJaW50IG8xU2VxdWVuY2UgPSBvMS5nZXRNYXBwaW5nKCkuZ2V0WG1sU2VxdWVuY2UoKTsKLQkJCQlpbnQgbzJTZXF1ZW5jZSA9IG8yLmdldE1hcHBpbmcoKS5nZXRYbWxTZXF1ZW5jZSgpOwotCQkJCWlmIChvMVNlcXVlbmNlIDwgbzJTZXF1ZW5jZSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCWlmIChvMVNlcXVlbmNlID09IG8yU2VxdWVuY2UpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCXJldHVybiAxOwotCQkJfQotCQl9OwotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVfKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlhZGRJdGVtVG9MaXN0KG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIHRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMsIFBlcnNpc3RlbnRUeXBlLlNQRUNJRklFRF9BVFRSSUJVVEVTX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVfKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3Qob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcywgUGVyc2lzdGVudFR5cGUuU1BFQ0lGSUVEX0FUVFJJQlVURVNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5pbmRleE9mKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLnJlbW92ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkucmVtb3ZlRnJvbVJlc291cmNlTW9kZWwodGhpcy5vcm1UeXBlTWFwcGluZy5nZXRUeXBlTWFwcGluZ1Jlc291cmNlKCkpOwotCQlmaXJlSXRlbVJlbW92ZWQoUGVyc2lzdGVudFR5cGUuU1BFQ0lGSUVEX0FUVFJJQlVURVNfTElTVCwgaW5kZXgsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwkJCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0TWFwcGluZygpLmdldENsYXNzXygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsYXNzQ2hhbmdlZChTdHJpbmcgb2xkQ2xhc3MsIFN0cmluZyBuZXdDbGFzcykgewotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZENsYXNzLCBuZXdDbGFzcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYXBwZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIGdldE1hcHBpbmcoKS5nZXRLZXkoKTsKLQl9Ci0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiBnZXRNYXBwaW5nKCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCQotCQotCS8vVE9ETyBpcyB0aGVyZSBhIHdheSB0byBhdm9pZCBhIG1ldGhvZCBmb3IgZXZlcnkgbWFwcGluZyB0eXBlPwotCS8vSSBhbSB0cnlpbmcgdG8gdGFrZSBhZGF2YW50YWdlIG9mIGdlbmVyaWNzIGhlcmUsIGJ1dCBpdCBzdXJlIGlzCi0JLy9sZWFkaW5nIHRvIGEgbG90IG9mIGR1cGxpY2F0ZWQgY29kZS4gLSBLRk0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbEVudGl0eSBlbnRpdHkpIHsKLQkJKChPcm1FbnRpdHkpIGdldE1hcHBpbmcoKSkuaW5pdGlhbGl6ZShlbnRpdHkpOwotCQl0aGlzLmluaXRpYWxpemVQYXJlbnRQZXJzaXN0ZW50VHlwZSgpOwkKLQkJdGhpcy5pbml0aWFsaXplUGVyc2lzdGVudEF0dHJpYnV0ZXMoZW50aXR5KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MpIHsKLQkJKChPcm1NYXBwZWRTdXBlcmNsYXNzKSBnZXRNYXBwaW5nKCkpLmluaXRpYWxpemUobWFwcGVkU3VwZXJjbGFzcyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVBhcmVudFBlcnNpc3RlbnRUeXBlKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVBlcnNpc3RlbnRBdHRyaWJ1dGVzKG1hcHBlZFN1cGVyY2xhc3MpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGUpIHsKLQkJKChPcm1FbWJlZGRhYmxlKSBnZXRNYXBwaW5nKCkpLmluaXRpYWxpemUoZW1iZWRkYWJsZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVBhcmVudFBlcnNpc3RlbnRUeXBlKCk7CQkKLQkJdGhpcy5pbml0aWFsaXplUGVyc2lzdGVudEF0dHJpYnV0ZXMoZW1iZWRkYWJsZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQZXJzaXN0ZW50QXR0cmlidXRlcyhBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJdGhpcy5pbml0aWFsaXplU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCX0KLQkJdGhpcy5pbml0aWFsaXplVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJZm9yIChYbWxJZCBpZCA6IGF0dHJpYnV0ZXMuZ2V0SWRzKCkpIHsKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShpZCk7Ci0JCQl0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJfQotCQlmb3IgKFhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZCA6IGF0dHJpYnV0ZXMuZ2V0RW1iZWRkZWRJZHMoKSkgewotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKGVtYmVkZGVkSWQpOwotCQkJdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCX0KLQkJZm9yIChYbWxCYXNpYyBiYXNpYyA6IGF0dHJpYnV0ZXMuZ2V0QmFzaWNzKCkpIHsKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShiYXNpYyk7Ci0JCQl0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJfQotCQlmb3IgKFhtbFZlcnNpb24gdmVyc2lvbiA6IGF0dHJpYnV0ZXMuZ2V0VmVyc2lvbnMoKSkgewotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUodmVyc2lvbik7Ci0JCQl0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJfQotCQlmb3IgKFhtbE1hbnlUb09uZSBtYW55VG9PbmUgOiBhdHRyaWJ1dGVzLmdldE1hbnlUb09uZXMoKSkgewotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKG1hbnlUb09uZSk7Ci0JCQl0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJfQotCQlmb3IgKFhtbE9uZVRvTWFueSBvbmVUb01hbnkgOiBhdHRyaWJ1dGVzLmdldE9uZVRvTWFueXMoKSkgewotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKG9uZVRvTWFueSk7Ci0JCQl0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJfQotCQlmb3IgKFhtbE9uZVRvT25lIG9uZVRvT25lIDogYXR0cmlidXRlcy5nZXRPbmVUb09uZXMoKSkgewotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUob25lVG9PbmUpOwotCQkJdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCX0KLQkJZm9yIChYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgOiBhdHRyaWJ1dGVzLmdldE1hbnlUb01hbnlzKCkpIHsKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUobWFueVRvTWFueSk7Ci0JCQl0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJfQotCQlmb3IgKFhtbEVtYmVkZGVkIGVtYmVkZGVkIDogYXR0cmlidXRlcy5nZXRFbWJlZGRlZHMoKSkgewotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKGVtYmVkZGVkKTsKLQkJCXRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQl9Ci0JCWZvciAoWG1sVHJhbnNpZW50IHRyYW5zaWVudFJlc291cmNlIDogYXR0cmlidXRlcy5nZXRUcmFuc2llbnRzKCkpIHsKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUodHJhbnNpZW50UmVzb3VyY2UpOwotCQkJdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlcygpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBqYXZhQXR0cmlidXRlcyA9IGphdmFQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCQkKLQkJd2hpbGUgKGphdmFBdHRyaWJ1dGVzLmhhc05leHQoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhQXR0cmlidXRlcy5uZXh0KCk7Ci0JCQlpZiAoc3BlY2lmaWVkQXR0cmlidXRlTmFtZWQoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKSA9PSBudWxsKSB7Ci0JCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gY3JlYXRlVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkJCXRoaXMudmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZXMoKSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJaWYgKGphdmFQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gamF2YVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUGFyZW50UGVyc2lzdGVudFR5cGUoKSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJaWYgKGphdmFQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sRW50aXR5IGVudGl0eSkgewotCQlpZiAoZ2V0TWFwcGluZ0tleSgpICE9IE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKSB7Ci0JCQlzZXRNYXBwaW5nS2V5XyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCX0KLQkJKChPcm1FbnRpdHkpIGdldE1hcHBpbmcoKSkudXBkYXRlKGVudGl0eSk7Ci0JCXRoaXMudXBkYXRlUGFyZW50UGVyc2lzdGVudFR5cGUoKTsKLQkJdGhpcy51cGRhdGVQZXJzaXN0ZW50QXR0cmlidXRlcyhlbnRpdHkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzKSB7Ci0JCWlmIChnZXRNYXBwaW5nS2V5KCkgIT0gTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSkgewotCQkJc2V0TWFwcGluZ0tleV8oTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCX0KLQkJKChPcm1NYXBwZWRTdXBlcmNsYXNzKSBnZXRNYXBwaW5nKCkpLnVwZGF0ZShtYXBwZWRTdXBlcmNsYXNzKTsKLQkJdGhpcy51cGRhdGVQYXJlbnRQZXJzaXN0ZW50VHlwZSgpOwotCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbnRBdHRyaWJ1dGVzKG1hcHBlZFN1cGVyY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlKSB7Ci0JCWlmIChnZXRNYXBwaW5nS2V5KCkgIT0gTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKSB7Ci0JCQlzZXRNYXBwaW5nS2V5XyhNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQl9Ci0JCSgoT3JtRW1iZWRkYWJsZSkgZ2V0TWFwcGluZygpKS51cGRhdGUoZW1iZWRkYWJsZSk7Ci0JCXRoaXMudXBkYXRlUGFyZW50UGVyc2lzdGVudFR5cGUoKTsKLQkJdGhpcy51cGRhdGVQZXJzaXN0ZW50QXR0cmlidXRlcyhlbWJlZGRhYmxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGFyZW50UGVyc2lzdGVudFR5cGUoKSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJc2V0UGFyZW50UGVyc2lzdGVudFR5cGUoamF2YVBlcnNpc3RlbnRUeXBlID09IG51bGwgPyBudWxsIDogamF2YVBlcnNpc3RlbnRUeXBlLmdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBlcnNpc3RlbnRBdHRyaWJ1dGVzKEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVzKCk7Ci0JCWlmICh0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkgIT0gbnVsbCkgewotCQkJdGhpcy51cGRhdGVJZHModHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlcyk7Ci0JCQl0aGlzLnVwZGF0ZUVtYmVkZGVkSWRzKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpOwotCQkJdGhpcy51cGRhdGVCYXNpY3ModHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlcyk7Ci0JCQl0aGlzLnVwZGF0ZVZlcnNpb25zKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpOwotCQkJdGhpcy51cGRhdGVNYW55VG9PbmVzKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpOwotCQkJdGhpcy51cGRhdGVPbmVUb01hbnlzKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpOwotCQkJdGhpcy51cGRhdGVPbmVUb09uZXModHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlcyk7Ci0JCQl0aGlzLnVwZGF0ZU1hbnlUb01hbnlzKHR5cGVNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpOwotCQkJdGhpcy51cGRhdGVFbWJlZGRlZHModHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlcyk7CQkKLQkJCXRoaXMudXBkYXRlVHJhbnNpZW50cyh0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzKTsJCQotCQl9Ci0JCXdoaWxlIChvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZV8ob3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJfQkKLQkJdGhpcy51cGRhdGVWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlydHVhbEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFBdHRyaWJ1dGUpIHsKLQkJU3RyaW5nIGphdmFNYXBwaW5nS2V5ID0gamF2YUF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCk7Ci0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWlmIChnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCWphdmFNYXBwaW5nS2V5ID0gamF2YUF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpOwotCQkJamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhQXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nKCk7Ci0JCX0KLQkJCi0JCWlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUudXBkYXRlKG5ldyBWaXJ0dWFsWG1sQmFzaWMoZ2V0TWFwcGluZygpLCAoSmF2YUJhc2ljTWFwcGluZykgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkpOwotCQl9Ci0JCWVsc2UgaWYgKGphdmFNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS51cGRhdGUobmV3IFZpcnR1YWxYbWxFbWJlZGRlZChnZXRNYXBwaW5nKCksIChKYXZhRW1iZWRkZWRNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnVwZGF0ZShuZXcgVmlydHVhbFhtbEVtYmVkZGVkSWQoZ2V0TWFwcGluZygpLCAoSmF2YUVtYmVkZGVkSWRNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnVwZGF0ZShuZXcgVmlydHVhbFhtbElkKGdldE1hcHBpbmcoKSwgKEphdmFJZE1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQllbHNlIGlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnVwZGF0ZShuZXcgVmlydHVhbFhtbE1hbnlUb01hbnkob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkpOwotCQl9Ci0JCWVsc2UgaWYgKGphdmFNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS51cGRhdGUobmV3IFZpcnR1YWxYbWxNYW55VG9PbmUoKEphdmFNYW55VG9PbmVNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnVwZGF0ZShuZXcgVmlydHVhbFhtbE9uZVRvTWFueShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQllbHNlIGlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS51cGRhdGUobmV3IFZpcnR1YWxYbWxPbmVUb09uZSgoSmF2YU9uZVRvT25lTWFwcGluZykgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkpOwotCQl9Ci0JCWVsc2UgaWYgKGphdmFNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUudXBkYXRlKG5ldyBWaXJ0dWFsWG1sVHJhbnNpZW50KChKYXZhVHJhbnNpZW50TWFwcGluZykgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkpOwotCQl9Ci0JCWVsc2UgaWYgKGphdmFNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnVwZGF0ZShuZXcgVmlydHVhbFhtbFZlcnNpb24oZ2V0TWFwcGluZygpLCAoSmF2YVZlcnNpb25NYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUudXBkYXRlKG5ldyBWaXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcoZ2V0TWFwcGluZygpLCBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkgewotCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGphdmFBdHRyaWJ1dGVzID0gdGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHhtbFZpcnR1YWxBdHRyaWJ1dGVzID0gdGhpcy52aXJ0dWFsQXR0cmlidXRlcygpOwotCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFBdHRyaWJ1dGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoamF2YUF0dHJpYnV0ZXMpKSB7Ci0JCQlpZiAoc3BlY2lmaWVkQXR0cmlidXRlTmFtZWQoamF2YUF0dHJpYnV0ZS5nZXROYW1lKCkpID09IG51bGwpIHsKLQkJCQlpZiAoeG1sVmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0JCQkJCXVwZGF0ZVZpcnR1YWxBdHRyaWJ1dGUoeG1sVmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpLCBqYXZhQXR0cmlidXRlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGNyZWF0ZVZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKGphdmFBdHRyaWJ1dGUpOwotCQkJCQlhZGRWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlICh4bWxWaXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMucmVtb3ZlVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUoeG1sVmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJfQkKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFBdHRyaWJ1dGUpIHsKLQkJYWRkVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUoY3JlYXRlVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUoamF2YUF0dHJpYnV0ZSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjcmVhdGVWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhQXR0cmlidXRlKSB7Ci0JCVN0cmluZyBqYXZhTWFwcGluZ0tleSA9IGphdmFBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpOwotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlpZiAoZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlqYXZhTWFwcGluZ0tleSA9IGphdmFBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKTsKLQkJCWphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZygpOwotCQl9Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgamF2YU1hcHBpbmdLZXkpOwotCQkKLQkJaWYgKGphdmFNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKG5ldyBWaXJ0dWFsWG1sQmFzaWMoZ2V0TWFwcGluZygpLCAoSmF2YUJhc2ljTWFwcGluZykgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkpOwotCQl9Ci0JCWVsc2UgaWYgKGphdmFNYXBwaW5nS2V5ID09IE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKG5ldyBWaXJ0dWFsWG1sRW1iZWRkZWRJZChnZXRNYXBwaW5nKCksIChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQllbHNlIGlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShuZXcgVmlydHVhbFhtbEVtYmVkZGVkKGdldE1hcHBpbmcoKSwgKEphdmFFbWJlZGRlZE1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQllbHNlIGlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShuZXcgVmlydHVhbFhtbElkKGdldE1hcHBpbmcoKSwgKEphdmFJZE1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQllbHNlIGlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUobmV3IFZpcnR1YWxYbWxNYW55VG9NYW55KG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQllbHNlIGlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShuZXcgVmlydHVhbFhtbE1hbnlUb09uZSgoSmF2YU1hbnlUb09uZU1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQllbHNlIGlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShuZXcgVmlydHVhbFhtbE9uZVRvTWFueShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQllbHNlIGlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKG5ldyBWaXJ0dWFsWG1sT25lVG9PbmUoKEphdmFPbmVUb09uZU1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCBnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpKTsKLQkJfQotCQllbHNlIGlmIChqYXZhTWFwcGluZ0tleSA9PSBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUobmV3IFZpcnR1YWxYbWxUcmFuc2llbnQoKEphdmFUcmFuc2llbnRNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShuZXcgVmlydHVhbFhtbFZlcnNpb24oZ2V0TWFwcGluZygpLCAoSmF2YVZlcnNpb25NYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZywgZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YU1hcHBpbmdLZXkgPT0gTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShuZXcgVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKGdldE1hcHBpbmcoKSwgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkpOwotCQl9Ci0JCXJldHVybiBvcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUlkcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBvcm1QZXJzaXN0ZW50QXR0cmlidXRlcykgewotCQlMaXN0SXRlcmF0b3I8WG1sSWQ+IGlkcyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxJZD4oYXR0cmlidXRlcy5nZXRJZHMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCWZvciAoWG1sSWQgaWQgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoaWRzKSkgewotCQkJaWYgKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzLmhhc05leHQoKSkgewotCQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzLm5leHQoKS51cGRhdGUoaWQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShpZCk7Ci0JCQkJYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZV8ob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRW1iZWRkZWRJZHMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpIHsKLQkJTGlzdEl0ZXJhdG9yPFhtbEVtYmVkZGVkSWQ+IGVtYmVkZGVkSWRzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbEVtYmVkZGVkSWQ+KGF0dHJpYnV0ZXMuZ2V0RW1iZWRkZWRJZHMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCWZvciAoWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGVtYmVkZGVkSWRzKSkgewotCQkJaWYgKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzLmhhc05leHQoKSkgewotCQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzLm5leHQoKS51cGRhdGUoZW1iZWRkZWRJZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKGVtYmVkZGVkSWQpOwotCQkJCWFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVfKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJhc2ljcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBvcm1QZXJzaXN0ZW50QXR0cmlidXRlcykgewotCQlMaXN0SXRlcmF0b3I8WG1sQmFzaWM+IGJhc2ljcyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxCYXNpYz4oYXR0cmlidXRlcy5nZXRCYXNpY3MoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCWZvciAoWG1sQmFzaWMgYmFzaWMgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoYmFzaWNzKSkgewotCQkJaWYgKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzLmhhc05leHQoKSkgewotCQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzLm5leHQoKS51cGRhdGUoYmFzaWMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaW5pdGlhbGl6ZShiYXNpYyk7Ci0JCQkJYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZV8ob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmVyc2lvbnMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpIHsKLQkJTGlzdEl0ZXJhdG9yPFhtbFZlcnNpb24+IHZlcnNpb25zID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbFZlcnNpb24+KGF0dHJpYnV0ZXMuZ2V0VmVyc2lvbnMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCWZvciAoWG1sVmVyc2lvbiB2ZXJzaW9uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHZlcnNpb25zKSkgewotCQkJaWYgKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzLmhhc05leHQoKSkgewotCQkJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzLm5leHQoKS51cGRhdGUodmVyc2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUodmVyc2lvbik7Ci0JCQkJYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZV8ob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTWFueVRvT25lcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBvcm1QZXJzaXN0ZW50QXR0cmlidXRlcykgewotCQlMaXN0SXRlcmF0b3I8WG1sTWFueVRvT25lPiBtYW55VG9PbmVzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbE1hbnlUb09uZT4oYXR0cmlidXRlcy5nZXRNYW55VG9PbmVzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQlmb3IgKFhtbE1hbnlUb09uZSBtYW55VG9PbmUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUobWFueVRvT25lcykpIHsKLQkJCWlmIChvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkudXBkYXRlKG1hbnlUb09uZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKG1hbnlUb09uZSk7Ci0JCQkJYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZV8ob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT25lVG9NYW55cyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBvcm1QZXJzaXN0ZW50QXR0cmlidXRlcykgewotCQlMaXN0SXRlcmF0b3I8WG1sT25lVG9NYW55PiBvbmVUb01hbnlzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbE9uZVRvTWFueT4oYXR0cmlidXRlcy5nZXRPbmVUb01hbnlzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQlmb3IgKFhtbE9uZVRvTWFueSBvbmVUb01hbnkgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob25lVG9NYW55cykpIHsKLQkJCWlmIChvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkudXBkYXRlKG9uZVRvTWFueSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKG9uZVRvTWFueSk7Ci0JCQkJYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZV8ob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT25lVG9PbmVzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzKSB7Ci0JCUxpc3RJdGVyYXRvcjxYbWxPbmVUb09uZT4gb25lVG9PbmVzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFhtbE9uZVRvT25lPihhdHRyaWJ1dGVzLmdldE9uZVRvT25lcygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJZm9yIChYbWxPbmVUb09uZSBvbmVUb09uZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvbmVUb09uZXMpKSB7Ci0JCQlpZiAob3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0JCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMubmV4dCgpLnVwZGF0ZShvbmVUb09uZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUob25lVG9PbmUpOwotCQkJCWFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVfKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1hbnlUb01hbnlzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVzKSB7Ci0JCUxpc3RJdGVyYXRvcjxYbWxNYW55VG9NYW55PiBtYW55VG9NYW55cyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxNYW55VG9NYW55PihhdHRyaWJ1dGVzLmdldE1hbnlUb01hbnlzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQlmb3IgKFhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShtYW55VG9NYW55cykpIHsKLQkJCWlmIChvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkudXBkYXRlKG1hbnlUb01hbnkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUobWFueVRvTWFueSk7Ci0JCQkJYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZV8ob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbWJlZGRlZHMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpIHsKLQkJTGlzdEl0ZXJhdG9yPFhtbEVtYmVkZGVkPiBlbWJlZGRlZHMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sRW1iZWRkZWQ+KGF0dHJpYnV0ZXMuZ2V0RW1iZWRkZWRzKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQlmb3IgKFhtbEVtYmVkZGVkIGVtYmVkZGVkIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGVtYmVkZGVkcykpIHsKLQkJCWlmIChvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkudXBkYXRlKGVtYmVkZGVkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmluaXRpYWxpemUoZW1iZWRkZWQpOwotCQkJCWFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVfKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRyYW5zaWVudHMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZXMpIHsKLQkJTGlzdEl0ZXJhdG9yPFhtbFRyYW5zaWVudD4gdHJhbnNpZW50cyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxUcmFuc2llbnQ+KGF0dHJpYnV0ZXMuZ2V0VHJhbnNpZW50cygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJZm9yIChYbWxUcmFuc2llbnQgdHJhbnNpZW50UmVzb3VyY2UgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodHJhbnNpZW50cykpIHsKLQkJCWlmIChvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLQkJCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkudXBkYXRlKHRyYW5zaWVudFJlc291cmNlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pbml0aWFsaXplKHRyYW5zaWVudFJlc291cmNlKTsKLQkJCQlhZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlXyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlQXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCWlmIChhdHRyaWJ1dGVzLmhhc05leHQoKSkgewotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJCXJldHVybiBhdHRyaWJ1dGVzLmhhc05leHQoKSA/IG51bGwgLyogbW9yZSB0aGFuIG9uZSAqLzogYXR0cmlidXRlOwotCQl9Ci0JCWVsc2UgaWYgKGdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCkucmVzb2x2ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRPcm1QZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKLQkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzcGVjaWZpZWRBdHRyaWJ1dGVzKCkpKSB7Ci0JCQlpZiAoYXR0cmlidXRlLmNvbnRhaW5zKHRleHRPZmZzZXQpKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHRleHRPZmZzZXQpIHsKLQkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCi0JCXRyeSB7Ci0JCQlnZXRNYXBwaW5nKCkuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCX0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKLQkJCUpwdENvcmVQbHVnaW4ubG9nKHQpOwotCQl9Ci0JCQotCQlmb3IgKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmF0dHJpYnV0ZXMoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJCX0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKLQkJCQlKcHRDb3JlUGx1Z2luLmxvZyh0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpICE9IG51bGwpIHsKLQkJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxMGU0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RPcm1OYW1lZENvbHVtbjxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4KLQlpbXBsZW1lbnRzIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCi0JcHJvdGVjdGVkIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uOwotCQotCXB1YmxpYyBHZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4oT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPcm1CYXNlSm9pbkNvbHVtbi5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShQcmltYXJ5S2V5Sm9pbkNvbHVtbiBvbGRQa0pvaW5Db2x1bW4pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkUGtKb2luQ29sdW1uKTsKLQkJc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUob2xkUGtKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0Q29sdW1uUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJLy9wcmltYXJ5S2V5Sm9pbkNvbHVtbnMgYXJlIHBhcnQgb2YgYSBjb2xsZWN0aW9uLCB0aGUgcGstam9pbi1jb2x1bW4gZWxlbWVudCB3aWxsIGJlIHJlbW92ZWQvYWRkZWQKLQkJLy93aGVuIHRoZSBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBpcyByZW1vdmVkL2FkZGVkIHRvIHRoZSBYbWxFbnRpdHkgY29sbGVjdGlvbgotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb2x1bW5SZXNvdXJjZSgpIHsKLQkJLy9wcmltYXJ5S2V5Sm9pbkNvbHVtbnMgYXJlIHBhcnQgb2YgYSBjb2xsZWN0aW9uLCB0aGUgcGstam9pbi1jb2x1bW4gZWxlbWVudCB3aWxsIGJlIHJlbW92ZWQvYWRkZWQKLQkJLy93aGVuIHRoZSBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBpcyByZW1vdmVkL2FkZGVkIHRvIHRoZSBYbWxFbnRpdHkgY29sbGVjdGlvbgotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSA/IGdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCWdldENvbHVtblJlc291cmNlKCkuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUobmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSwgbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8oU3RyaW5nIG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUsIG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmV3RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuZXdEZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUsIG5ld0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUJhc2VKb2luQ29sdW1uLk93bmVyIGdldE93bmVyKCkgewotCQlyZXR1cm4gKE9ybUJhc2VKb2luQ29sdW1uLk93bmVyKSB0aGlzLm93bmVyOwotCX0KLQotCXB1YmxpYyBDb2x1bW4gZ2V0RGJSZWZlcmVuY2VkQ29sdW1uKCkgewotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKTsKLQkJcmV0dXJuICh0YWJsZSA9PSBudWxsKSA/IG51bGwgOiB0YWJsZS5jb2x1bW5OYW1lZCh0aGlzLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyBUYWJsZSBkYlJlZmVyZW5jZWRDb2x1bW5UYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0RGJSZWZlcmVuY2VkQ29sdW1uVGFibGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXIoKS5nZXRUeXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlZENvbHVtblJlc29sdmVkKCkgewotCQlyZXR1cm4gZ2V0RGJSZWZlcmVuY2VkQ29sdW1uKCkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCkgewotCQlpZiAoZ2V0Q29sdW1uUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gZ2V0Q29sdW1uUmVzb3VyY2UoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpOwotCQkJaWYgKHRleHRSYW5nZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRleHRSYW5nZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JCQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuaXNWaXJ0dWFsKHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGNvbHVtbikgewotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uID0gY29sdW1uOwotCQlzdXBlci5pbml0aWFsaXplKGNvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSBzcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShjb2x1bW4pOwotCQl0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gY29sdW1uKSB7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW4gPSBjb2x1bW47Ci0JCXN1cGVyLnVwZGF0ZShjb2x1bW4pOwotCQl0aGlzLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lXyhzcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShjb2x1bW4pKTsKLQkJdGhpcy5zZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gY29sdW1uID09IG51bGwgPyBudWxsIDogY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JfQotCQotCS8vVE9ETyBub3QgY29ycmVjdCB3aGVuIHdlIHN0YXJ0IHN1cHBvcnRpbmcgcHJpbWFyeUtleUpvaW5Db2x1bW5zIGluIDEtMSBtYXBwaW5ncwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gZGVmYXVsdE5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzOWU0OAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDI1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5CisJZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneQoreworCXByb3RlY3RlZCBYbWxPbmVUb09uZSByZXNvdXJjZTsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBuZXcgVmVjdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPigpOworCQorCXByb3RlY3RlZCBmaW5hbCBPcm1Kb2luQ29sdW1uLk93bmVyIGpvaW5Db2x1bW5Pd25lcjsKKwkKKwkKKwlwdWJsaWMgR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KAorCQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlIHBhcmVudCwKKwkJCVhtbE9uZVRvT25lIHJlc291cmNlKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKwkJdGhpcy5qb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbk93bmVyKCk7CisJCXRoaXMuaW5pdGlhbGl6ZVByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCX0KKwkKKwlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbi5Pd25lciBidWlsZEpvaW5Db2x1bW5Pd25lcigpIHsKKwkJcmV0dXJuIG5ldyBKb2luQ29sdW1uT3duZXIoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQlpZiAodGhpcy5yZXNvdXJjZSAhPSBudWxsKSB7CisJCQlmb3IgKFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHJlc291cmNlSm9pbkNvbHVtbiA6IHRoaXMucmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpIHsKKwkJCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihyZXNvdXJjZUpvaW5Db2x1bW4pKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigKKwkJCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHJlc291cmNlSm9pbkNvbHVtbikgeworCQlyZXR1cm4gdGhpcy5nZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIHRoaXMuam9pbkNvbHVtbk93bmVyLCByZXNvdXJjZUpvaW5Db2x1bW4pOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKE9ybUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisJCisJcHVibGljIE9ybUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7CisJCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkU3RyYXRlZ3koKSB7CisJCWlmIChwcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgPT0gMCkgeworCQkJYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlU3RyYXRlZ3koKSB7CisJCWZvciAoUHJpbWFyeUtleUpvaW5Db2x1bW4gZWFjaCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkpIHsKKwkJCXJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGVhY2gpOworCQl9CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbigpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucyk7CisJfQorCQorCXB1YmxpYyBpbnQgcHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaGFzUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gISB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7CisJfQorCQorCXB1YmxpYyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKKwkJWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcmVzb3VyY2VQa0pvaW5Db2x1bW4gPSAKKwkJCU9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CisJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGNvbnRleHRQa0pvaW5Db2x1bW4gPSAKKwkJCXRoaXMuYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihyZXNvdXJjZVBrSm9pbkNvbHVtbik7CisJCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLmFkZChpbmRleCwgY29udGV4dFBrSm9pbkNvbHVtbik7CisJCXRoaXMucmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKGluZGV4LCByZXNvdXJjZVBrSm9pbkNvbHVtbik7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChQUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIGNvbnRleHRQa0pvaW5Db2x1bW4pOworCQlyZXR1cm4gY29udGV4dFBrSm9pbkNvbHVtbjsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4LCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgam9pbkNvbHVtbiwgdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQl0aGlzLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKSwgam9pbkNvbHVtbik7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbikgeworCQl0aGlzLnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLmluZGV4T2YocGtKb2luQ29sdW1uKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgeworCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiByZW1vdmVkUGtKb2luQ29sdW1uID0gdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKKwkJdGhpcy5yZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoaW5kZXgpOworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChQUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHJlbW92ZWRQa0pvaW5Db2x1bW4pOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbl8oT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQlyZW1vdmVJdGVtRnJvbUxpc3Qoam9pbkNvbHVtbiwgdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKKwl9CisJCisJcHVibGljIHZvaWQgbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl0aGlzLnJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJZmlyZUl0ZW1Nb3ZlZChQUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQorCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIC0+IGNvbnRleHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl1cGRhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgWE1MIFBLIGpvaW4gY29sdW1ucyAodG8gcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKQorCQlJdGVyYXRvcjxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4geG1sUGtKb2luQ29sdW1ucyA9IAorCQkJbmV3IENsb25lSXRlcmF0b3I8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+KHRoaXMucmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOworCQkKKwkJZm9yIChJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gY29udGV4dFBrSm9pbkNvbHVtbnMgPSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsgCisJCQkJY29udGV4dFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpOyApIHsKKwkJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGNvbnRleHRQa0pvaW5Db2x1bW4gPSBjb250ZXh0UGtKb2luQ29sdW1ucy5uZXh0KCk7CisJCQlpZiAoeG1sUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKKwkJCQljb250ZXh0UGtKb2luQ29sdW1uLnVwZGF0ZSh4bWxQa0pvaW5Db2x1bW5zLm5leHQoKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbl8oY29udGV4dFBrSm9pbkNvbHVtbik7CisJCQl9CisJCX0KKwkJCisJCXdoaWxlICh4bWxQa0pvaW5Db2x1bW5zLmhhc05leHQoKSkgeworCQkJYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbih4bWxQa0pvaW5Db2x1bW5zLm5leHQoKSkpOworCQl9CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCX0KKwkKKworCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gb3duZXIgYWRhcHRlciAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgY2xhc3MgSm9pbkNvbHVtbk93bmVyCisJCWltcGxlbWVudHMgT3JtSm9pbkNvbHVtbi5Pd25lciAKKwl7CisJCXByb3RlY3RlZCBKb2luQ29sdW1uT3duZXIoKSB7CisJCQlzdXBlcigpOworCQl9CisJCQorCQkvKioKKwkJICogYnkgZGVmYXVsdCwgdGhlIGpvaW4gY29sdW1uIGlzIGluIHRoZSB0eXBlIG1hcHBpbmcncyBwcmltYXJ5IHRhYmxlCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7CisJCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7CisJCX0KKwkJCisJCXB1YmxpYyBFbnRpdHkgZ2V0VGFyZ2V0RW50aXR5KCkgeworCQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOworCQl9CisJCQorCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7CisJCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCk7CisJCX0KKwkJCisJCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7CisJCQlyZXR1cm4gR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOworCQl9CisJCQorCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgeworCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7CisJCX0KKwkJCisJCS8qKgorCQkgKiB0aGUgam9pbiBjb2x1bW4gY2FuIGJlIG9uIGEgc2Vjb25kYXJ5IHRhYmxlCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiB0YWJsZUlzQWxsb3dlZCgpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgeworCQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZygpOworCQl9CisJCQorCQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7CisJCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXREYlRhYmxlKHRhYmxlTmFtZSk7CisJCX0KKwkJCisJCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpIHsKKwkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBnZXRUYXJnZXRFbnRpdHkoKTsKKwkJCXJldHVybiAodGFyZ2V0RW50aXR5ID09IG51bGwpID8gbnVsbCA6IHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOworCQl9CisJCQorCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJCXJldHVybiBHZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kudGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7CisJCX0KKwkJCisJCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJCXJldHVybiBHZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1RdWVyeUhpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUXVlcnlIaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMTBiZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1RdWVyeUhpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVF1ZXJ5SGludCBleHRlbmRzIEFic3RyYWN0T3JtSnBhQ29udGV4dE5vZGUgaW1wbGVtZW50cyBPcm1RdWVyeUhpbnQKLXsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0KLQlwcm90ZWN0ZWQgWG1sUXVlcnlIaW50IHF1ZXJ5SGludDsKLQkKLQlwdWJsaWMgR2VuZXJpY09ybVF1ZXJ5SGludChPcm1RdWVyeSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJdGhpcy5xdWVyeUhpbnQuc2V0TmFtZShuZXdOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChRdWVyeUhpbnQuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5xdWVyeUhpbnQuc2V0VmFsdWUobmV3VmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFF1ZXJ5SGludC5WQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbFF1ZXJ5SGludCBxdWVyeUhpbnQpIHsKLQkJdGhpcy5xdWVyeUhpbnQgPSBxdWVyeUhpbnQ7Ci0JCXRoaXMubmFtZSA9IHF1ZXJ5SGludC5nZXROYW1lKCk7Ci0JCXRoaXMudmFsdWUgPSBxdWVyeUhpbnQuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbFF1ZXJ5SGludCBxdWVyeUhpbnQpIHsKLQkJdGhpcy5xdWVyeUhpbnQgPSBxdWVyeUhpbnQ7Ci0JCXRoaXMuc2V0TmFtZShxdWVyeUhpbnQuZ2V0TmFtZSgpKTsKLQkJdGhpcy5zZXRWYWx1ZShxdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlIaW50LmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjY2Q5ZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZSBleHRlbmRzIEFic3RyYWN0T3JtVGFibGUKLQlpbXBsZW1lbnRzIE9ybVNlY29uZGFyeVRhYmxlCi17Ci0JcHJvdGVjdGVkIFhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlOwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci0JCi0JcHJvdGVjdGVkIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQotCXB1YmxpYyBHZW5lcmljT3JtU2Vjb25kYXJ5VGFibGUoT3JtRW50aXR5IHBhcmVudCwgWG1sU2Vjb25kYXJ5VGFibGUgeG1sU2Vjb25kYXJ5VGFibGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPigpOwotCQlpbml0aWFsaXplKHhtbFNlY29uZGFyeVRhYmxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oU2Vjb25kYXJ5VGFibGUgb2xkU2Vjb25kYXJ5VGFibGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkU2Vjb25kYXJ5VGFibGUpOwotCQlmb3IgKFByaW1hcnlLZXlKb2luQ29sdW1uIG9sZFBrSm9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvbGRTZWNvbmRhcnlUYWJsZS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkpIHsKLQkJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIG5ld1BrSm9pbkNvbHVtbiA9IGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQluZXdQa0pvaW5Db2x1bW4uaW5pdGlhbGl6ZUZyb20ob2xkUGtKb2luQ29sdW1uKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtRW50aXR5IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1FbnRpdHkpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlwdWJsaWMgT3JtRW50aXR5IGdldE9ybUVudGl0eSgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpOwotCX0KLQkKLQlwdWJsaWMgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBuZXdQa0pvaW5Db2x1bW4pIHsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gb2xkUGtKb2luQ29sdW1uID0gdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID0gbmV3UGtKb2luQ29sdW1uOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNlY29uZGFyeVRhYmxlLkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIG9sZFBrSm9pbkNvbHVtbiwgbmV3UGtKb2luQ29sdW1uKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA6IHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCX0KLQkKLQlwdWJsaWMgaW50IHByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+KHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCWlmICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICF0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JfQkKLQotCXB1YmxpYyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gb2xkRGVmYXVsdFBrSm9pbkNvbHVtbiA9IHRoaXMuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWlmIChvbGREZWZhdWx0UGtKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCS8vbnVsbCB0aGUgZGVmYXVsdCBqb2luIGNvbHVtbiBub3cgaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCQkJLy9pZiBvbmUgZG9lcyBub3QgZXhpc3QsIHRoZXJlIGlzIGFscmVhZHkgYSBzcGVjaWZpZWQgam9pbiBjb2x1bW4uCi0JCQkvL1JlbW92ZSBpdCBub3cgc28gdGhhdCBpdCBkb2Vzbid0IGdldCByZW1vdmVkIGR1cmluZyBhbiB1cGRhdGUgYW5kCi0JCQkvL2NhdXNlIGNoYW5nZSBub3RpZmljYXRpb25zIHRvIGJlIHNlbnQgdG8gdGhlIFVJIGluIHRoZSB3cm9uZyBvcmRlcgotCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBudWxsOwotCQl9Ci0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHhtbFByaW1hcnlLZXlKb2luQ29sdW1uID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsKCk7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uID0gY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4oeG1sUHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoaW5kZXgsIHByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoaW5kZXgsIHhtbFByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJCi0JCXRoaXMuZmlyZUl0ZW1BZGRlZChTZWNvbmRhcnlUYWJsZS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCWlmIChvbGREZWZhdWx0UGtKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTZWNvbmRhcnlUYWJsZS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBvbGREZWZhdWx0UGtKb2luQ29sdW1uLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCBPcm1CYXNlSm9pbkNvbHVtbi5Pd25lciBjcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgsIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHByaW1hcnlLZXlKb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucywgU2Vjb25kYXJ5VGFibGUuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaW5kZXhPZihwa0pvaW5Db2x1bW4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHJlbW92ZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7Ci0JCWlmICghY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJLy9jcmVhdGUgdGhlIGRlZmF1bHRKb2luQ29sdW1uIG5vdyBvciB0aGlzIHdpbGwgaGFwcGVuIGR1cmluZyBwcm9qZWN0IHVwZGF0ZSAKLQkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLiBUaGF0IGNhdXNlcyBwcm9ibGVtcyAKLQkJCS8vaW4gdGhlIFVJIGJlY2F1c2UgdGhlIGNoYW5nZSBub3RpZmljYXRpb25zIGVuZCB1cCBpbiB0aGUgd3Jvbmcgb3JkZXIuCi0JCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uKG51bGwpOwotCQl9Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGUuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFNlY29uZGFyeVRhYmxlLlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHJlbW92ZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCWlmICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkvL2ZpcmUgY2hhbmdlIG5vdGlmaWNhdGlvbiBpZiBhIGRlZmF1bHRKb2luQ29sdW1uIHdhcyBjcmVhdGVkIGFib3ZlCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRW50aXR5LkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIG51bGwsIHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uXyhPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QocHJpbWFyeUtleUpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLCBTZWNvbmRhcnlUYWJsZS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGUuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlmaXJlSXRlbU1vdmVkKFNlY29uZGFyeVRhYmxlLlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQotCQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIGdldE9ybUVudGl0eSgpLmNvbnRhaW5zVmlydHVhbFNlY29uZGFyeVRhYmxlKHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWJsZVJlc291cmNlKCkgewotCQkvL3NlY29uZGFyeVRhYmxlcyBhcmUgcGFydCBvZiBhIGNvbGxlY3Rpb24sIHRoZSBzZWNvbmRhcnktdGFibGUgZWxlbWVudCB3aWxsIGJlIHJlbW92ZWQvYWRkZWQKLQkJLy93aGVuIHRoZSBYbWxTZWNvbmRhcnlUYWJsZSBpcyByZW1vdmVkL2FkZGVkIHRvIHRoZSBYbWxFbnRpdHkgY29sbGVjdGlvbgotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVUYWJsZVJlc291cmNlKCkgewotCQkvL3NlY29uZGFyeVRhYmxlcyBhcmUgcGFydCBvZiBhIGNvbGxlY3Rpb24sIHRoZSBzZWNvbmRhcnktdGFibGUgZWxlbWVudCB3aWxsIGJlIHJlbW92ZWQvYWRkZWQKLQkJLy93aGVuIHRoZSBYbWxTZWNvbmRhcnlUYWJsZSBpcyByZW1vdmVkL2FkZGVkIHRvIHRoZSBYbWxFbnRpdHkgY29sbGVjdGlvbgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxTZWNvbmRhcnlUYWJsZSBnZXRUYWJsZVJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZTsKLQkJc3VwZXIuaW5pdGlhbGl6ZShzZWNvbmRhcnlUYWJsZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyhzZWNvbmRhcnlUYWJsZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKFhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCWZvciAoWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gOiBzZWNvbmRhcnlUYWJsZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuYWRkKGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uKHByaW1hcnlLZXlKb2luQ29sdW1uKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQnVpbGREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uKG51bGwpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlOwotCQlzdXBlci51cGRhdGUoc2Vjb25kYXJ5VGFibGUpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyhzZWNvbmRhcnlUYWJsZSk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiByZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oc2Vjb25kYXJ5VGFibGUuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOy8vcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2lhdGlvbkV4Y2VwdGlvbgotCQkKLQkJd2hpbGUgKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uID0gcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbi51cGRhdGUocmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uXyhwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSwgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpIHsKLQkJCXNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgPT0gbnVsbCkgewotCQkJdGhpcy5zZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4obnVsbCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4udXBkYXRlKG51bGwpOwotCQl9Ci0JfQkKLQotCXByb3RlY3RlZCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBjcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbihYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbikgewotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKSk7Ci0JCW9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmluaXRpYWxpemUoeG1sUHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQlyZXR1cm4gb3JtUHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JfQotCi0JQE92ZXJyaWRlCi0JLy9ubyBkZWZhdWx0IG5hbWUgZm9yIHNlY29uZGFyeVRhYmxlcwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQlhZGRUYWJsZU1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJCi0JCWZvciAoT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlwa0pvaW5Db2x1bW4uYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFibGVNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlib29sZWFuIGRvQ29udGludWUgPSBjb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JCVN0cmluZyBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmICEgaGFzUmVzb2x2ZWRTY2hlbWEoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5TRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsCi0JCQkJCQluZXcgU3RyaW5nW10ge3NjaGVtYSwgZ2V0TmFtZSgpfSwgCi0JCQkJCQl0aGlzLAotCQkJCQkJZ2V0U2NoZW1hVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgISBpc1Jlc29sdmVkKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Z2V0TmFtZSgpfSwgCi0JCQkJCQl0aGlzLCAKLQkJCQkJCWdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQl9Ci0JfQotCQotCWNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIgaW1wbGVtZW50cyBPcm1CYXNlSm9pbkNvbHVtbi5Pd25lcgotCXsKLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlLnRoaXMuZ2V0T3JtRW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlLnRoaXMuZ2V0RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIGdldERiUmVmZXJlbmNlZENvbHVtblRhYmxlKCkgewotCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZS50aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCXJldHVybiBHZW5lcmljT3JtU2Vjb25kYXJ5VGFibGUudGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPT0gam9pbkNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKLQkJCWlmIChqb2luQ29sdW1uc1NpemUoKSAhPSAxKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0T3JtRW50aXR5KCkuZ2V0UGFyZW50RW50aXR5KCkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKLQkJfQotCQkKLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MmNhYzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RPcm1HZW5lcmF0b3I8WG1sU2VxdWVuY2VHZW5lcmF0b3I+Ci0JaW1wbGVtZW50cyBPcm1TZXF1ZW5jZUdlbmVyYXRvcgotewotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTZXF1ZW5jZU5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTZXF1ZW5jZU5hbWU7Ci0KLQlwdWJsaWMgR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VxdWVuY2VOYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0U2VxdWVuY2VOYW1lKCkgOiB0aGlzLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKFN0cmluZyBuZXdTcGVjaWZpZWRTZXF1ZW5jZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lOwotCQl0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IG5ld1NwZWNpZmllZFNlcXVlbmNlTmFtZTsKLQkJZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5zZXRTZXF1ZW5jZU5hbWUobmV3U3BlY2lmaWVkU2VxdWVuY2VOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2VxdWVuY2VOYW1lLCBuZXdTcGVjaWZpZWRTZXF1ZW5jZU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRTZXF1ZW5jZU5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lOwotCQl0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IG5ld1NwZWNpZmllZFNlcXVlbmNlTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2VxdWVuY2VOYW1lLCBuZXdTcGVjaWZpZWRTZXF1ZW5jZU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlcXVlbmNlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNlcXVlbmNlTmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNlcXVlbmNlTmFtZShTdHJpbmcgbmV3RGVmYXVsdFNlcXVlbmNlTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkU2VxdWVuY2VOYW1lID0gdGhpcy5kZWZhdWx0U2VxdWVuY2VOYW1lOwotCQl0aGlzLmRlZmF1bHRTZXF1ZW5jZU5hbWUgPSBuZXdEZWZhdWx0U2VxdWVuY2VOYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2VxdWVuY2VOYW1lLCBuZXdEZWZhdWx0U2VxdWVuY2VOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoc2VxdWVuY2VHZW5lcmF0b3IpOwotCQl0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lKHNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJLy9UT0RPIGRlZmF1bHQgc2VxdWVuY2UgbmFtZQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJc3VwZXIudXBkYXRlKHNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWVfKHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lKHNlcXVlbmNlR2VuZXJhdG9yKSk7Ci0JCS8vVE9ETyBkZWZhdWx0IHNlcXVlbmNlIG5hbWUKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTZXF1ZW5jZU5hbWUoWG1sU2VxdWVuY2VHZW5lcmF0b3IgZ2VuZXJhdG9yUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGdlbmVyYXRvclJlc291cmNlLmdldFNlcXVlbmNlTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGMzNzMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtVGFibGUgZXh0ZW5kcyBBYnN0cmFjdE9ybVRhYmxlIGltcGxlbWVudHMgT3JtVGFibGUKLXsKLQotCXByb3RlY3RlZCBYbWxFbnRpdHkgZW50aXR5OwotCQotCXB1YmxpYyBHZW5lcmljT3JtVGFibGUoT3JtRW50aXR5IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBPcm1FbnRpdHkgZ2V0T3JtRW50aXR5KCkgewotCQlyZXR1cm4gKE9ybUVudGl0eSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxUYWJsZSBnZXRUYWJsZVJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHkuZ2V0VGFibGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVGFibGVSZXNvdXJjZSgpIHsKLQkJdGhpcy5lbnRpdHkuc2V0VGFibGUobnVsbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFRhYmxlUmVzb3VyY2UoKSB7Ci0JCXRoaXMuZW50aXR5LnNldFRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlKCkpOwotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFUYWJsZSBnZXRKYXZhVGFibGUoKSB7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IGdldE9ybUVudGl0eSgpLmdldEphdmFFbnRpdHkoKTsKLQkJaWYgKGphdmFFbnRpdHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGphdmFFbnRpdHkuZ2V0VGFibGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxFbnRpdHkgZW50aXR5KSB7Ci0JCXRoaXMuZW50aXR5ID0gZW50aXR5OwotCQl0aGlzLmluaXRpYWxpemUodGhpcy5nZXRUYWJsZVJlc291cmNlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sRW50aXR5IGVudGl0eSkgewotCQl0aGlzLmVudGl0eSA9IGVudGl0eTsKLQkJdGhpcy51cGRhdGUodGhpcy5nZXRUYWJsZVJlc291cmNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWUoKSB7Ci0JCUphdmFUYWJsZSBqYXZhVGFibGUgPSBnZXRKYXZhVGFibGUoKTsKLQkJaWYgKGphdmFUYWJsZSAhPSBudWxsKSB7Ci0JCQlpZiAoIWdldE9ybUVudGl0eSgpLmlzTWV0YWRhdGFDb21wbGV0ZSgpICYmIGdldFRhYmxlUmVzb3VyY2UoKSA9PSBudWxsICYmIGphdmFUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBqYXZhVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQkJfQotCQl9Ci0JCUVudGl0eSByb290RW50aXR5ID0gZ2V0T3JtRW50aXR5KCkuZ2V0Um9vdEVudGl0eSgpOwotCQlpZiAocm9vdEVudGl0eSAhPSBnZXRPcm1FbnRpdHkoKSkgewotCQkJaWYgKHJvb3RFbnRpdHkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUpIHsKLQkJCQlyZXR1cm4gcm9vdEVudGl0eS5nZXRUYWJsZSgpLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0T3JtRW50aXR5KCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWEoKSB7Ci0JCUphdmFUYWJsZSBqYXZhVGFibGUgPSBnZXRKYXZhVGFibGUoKTsKLQkJaWYgKGphdmFUYWJsZSAhPSBudWxsICkgewotCQkJaWYgKGdldE9ybUVudGl0eSgpLmlzTWV0YWRhdGFDb21wbGV0ZSgpIHx8IChnZXRUYWJsZVJlc291cmNlKCkgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gamF2YVRhYmxlLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJCX0KLQkJCXJldHVybiBqYXZhVGFibGUuZ2V0U2NoZW1hKCk7Ci0JCX0KLQkJRW50aXR5IHJvb3RFbnRpdHkgPSBnZXRPcm1FbnRpdHkoKS5nZXRSb290RW50aXR5KCk7Ci0JCWlmIChyb290RW50aXR5ICE9IGdldE9ybUVudGl0eSgpKSB7Ci0JCQlpZiAocm9vdEVudGl0eS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgPT0gSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSkgewotCQkJCXJldHVybiByb290RW50aXR5LmdldFRhYmxlKCkuZ2V0U2NoZW1hKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2coKSB7Ci0JCUphdmFUYWJsZSBqYXZhVGFibGUgPSBnZXRKYXZhVGFibGUoKTsKLQkJaWYgKGphdmFUYWJsZSAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0T3JtRW50aXR5KCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkgfHwgKGdldFRhYmxlUmVzb3VyY2UoKSAhPSBudWxsKSkgewotCQkJCXJldHVybiBqYXZhVGFibGUuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJCX0KLQkJCXJldHVybiBqYXZhVGFibGUuZ2V0Q2F0YWxvZygpOwotCQl9Ci0JCUVudGl0eSByb290RW50aXR5ID0gZ2V0T3JtRW50aXR5KCkuZ2V0Um9vdEVudGl0eSgpOwotCQlpZiAocm9vdEVudGl0eSAhPSBnZXRPcm1FbnRpdHkoKSkgewotCQkJaWYgKHJvb3RFbnRpdHkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUpIHsKLQkJCQlyZXR1cm4gcm9vdEVudGl0eS5nZXRUYWJsZSgpLmdldENhdGFsb2coKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCk7Ci0JfQotCQotCS8vKioqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJYm9vbGVhbiBkb0NvbnRpbnVlID0gY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCQlTdHJpbmcgc2NoZW1hID0gdGhpcy5nZXRTY2hlbWEoKTsKLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmICEgdGhpcy5oYXNSZXNvbHZlZFNjaGVtYSgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7c2NoZW1hLCB0aGlzLmdldE5hbWUoKX0sIAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMuZ2V0U2NoZW1hVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJCWRvQ29udGludWUgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGRvQ29udGludWUgJiYgISB0aGlzLmlzUmVzb2x2ZWQoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sIAotCQkJCQkJdGhpcywgCi0JCQkJCQl0aGlzLmdldE5hbWVUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UYWJsZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UYWJsZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2U4ZGY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtVGFibGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1UYWJsZUdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0T3JtR2VuZXJhdG9yPFhtbFRhYmxlR2VuZXJhdG9yPiBpbXBsZW1lbnRzIE9ybVRhYmxlR2VuZXJhdG9yLCBVbmlxdWVDb25zdHJhaW50Lk93bmVyCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYWJsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYWJsZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ2F0YWxvZzsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTY2hlbWE7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRQa0NvbHVtbk5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UGtDb2x1bW5OYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWVDb2x1bW5OYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRQa0NvbHVtblZhbHVlOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFBrQ29sdW1uVmFsdWU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50czsKLQotCQotCXB1YmxpYyBHZW5lcmljT3JtVGFibGVHZW5lcmF0b3IoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludHMgPSBuZXcgQXJyYXlMaXN0PE9ybVVuaXF1ZUNvbnN0cmFpbnQ+KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFRhYmxlKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0VGFibGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUYWJsZShTdHJpbmcgbmV3U3BlY2lmaWVkVGFibGUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFRhYmxlID0gdGhpcy5zcGVjaWZpZWRUYWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IG5ld1NwZWNpZmllZFRhYmxlOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldFRhYmxlKG5ld1NwZWNpZmllZFRhYmxlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFRhYmxlLCBuZXdTcGVjaWZpZWRUYWJsZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFRhYmxlXyhTdHJpbmcgbmV3U3BlY2lmaWVkVGFibGUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFRhYmxlID0gdGhpcy5zcGVjaWZpZWRUYWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IG5ld1NwZWNpZmllZFRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVGFibGUsIG5ld1NwZWNpZmllZFRhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VGFibGUoU3RyaW5nIG5ld0RlZmF1bHRUYWJsZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFRhYmxlID0gdGhpcy5kZWZhdWx0VGFibGU7Ci0JCXRoaXMuZGVmYXVsdFRhYmxlID0gbmV3RGVmYXVsdFRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVEFCTEVfUFJPUEVSVFksIG9sZERlZmF1bHRUYWJsZSwgbmV3RGVmYXVsdFRhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRDYXRhbG9nKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0Q2F0YWxvZygpIDogdGhpcy5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENhdGFsb2coU3RyaW5nIG5ld1NwZWNpZmllZENhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZENhdGFsb2cgPSB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IG5ld1NwZWNpZmllZENhdGFsb2c7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuc2V0Q2F0YWxvZyhuZXdTcGVjaWZpZWRDYXRhbG9nKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ2F0YWxvZywgbmV3U3BlY2lmaWVkQ2F0YWxvZyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENhdGFsb2dfKFN0cmluZyBuZXdTcGVjaWZpZWRDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGRTcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBuZXdTcGVjaWZpZWRDYXRhbG9nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRDYXRhbG9nLCBuZXdTcGVjaWZpZWRDYXRhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdENhdGFsb2coU3RyaW5nIG5ld0RlZmF1bHRDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0Q2F0YWxvZyA9IHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JCXRoaXMuZGVmYXVsdENhdGFsb2cgPSBuZXdEZWZhdWx0Q2F0YWxvZzsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZERlZmF1bHRDYXRhbG9nLCBuZXdEZWZhdWx0Q2F0YWxvZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRTY2hlbWEoKSA9PSBudWxsKSA/IGdldERlZmF1bHRTY2hlbWEoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIG5ld1NwZWNpZmllZFNjaGVtYSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkU2NoZW1hID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gbmV3U3BlY2lmaWVkU2NoZW1hOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldFNjaGVtYShuZXdTcGVjaWZpZWRTY2hlbWEpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFksIG9sZFNwZWNpZmllZFNjaGVtYSwgbmV3U3BlY2lmaWVkU2NoZW1hKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWFfKFN0cmluZyBuZXdTcGVjaWZpZWRTY2hlbWEpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFNjaGVtYSA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IG5ld1NwZWNpZmllZFNjaGVtYTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTY2hlbWEsIG5ld1NwZWNpZmllZFNjaGVtYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NoZW1hOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NoZW1hKFN0cmluZyBuZXdEZWZhdWx0U2NoZW1hKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0U2NoZW1hID0gdGhpcy5kZWZhdWx0U2NoZW1hOwotCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBuZXdEZWZhdWx0U2NoZW1hOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZLCBvbGREZWZhdWx0U2NoZW1hLCBuZXdEZWZhdWx0U2NoZW1hKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBrQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZFBrQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUGtDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUGtDb2x1bW5OYW1lOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldFBrQ29sdW1uTmFtZShuZXdTcGVjaWZpZWRQa0NvbHVtbk5hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QS19DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUGtDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRQa0NvbHVtbk5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRQa0NvbHVtbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFBrQ29sdW1uTmFtZSA9IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZSA9IG5ld1NwZWNpZmllZFBrQ29sdW1uTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUEtfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFBrQ29sdW1uTmFtZSwgbmV3U3BlY2lmaWVkUGtDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQa0NvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRQa0NvbHVtbk5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRQa0NvbHVtbk5hbWUoU3RyaW5nIG5ld0RlZmF1bHRQa0NvbHVtbk5hbWUpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRQa0NvbHVtbk5hbWUgPSB0aGlzLmRlZmF1bHRQa0NvbHVtbk5hbWU7Ci0JCXRoaXMuZGVmYXVsdFBrQ29sdW1uTmFtZSA9IG5ld0RlZmF1bHRQa0NvbHVtbk5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9QS19DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkRGVmYXVsdFBrQ29sdW1uTmFtZSwgbmV3RGVmYXVsdFBrQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSA9PSBudWxsKSA/IGdldERlZmF1bHRWYWx1ZUNvbHVtbk5hbWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lOwotCQlnZXRHZW5lcmF0b3JSZXNvdXJjZSgpLnNldFZhbHVlQ29sdW1uTmFtZShuZXdTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9WQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZV8oU3RyaW5nIG5ld1NwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9WQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlQ29sdW1uTmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZShTdHJpbmcgbmV3RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFZhbHVlQ29sdW1uTmFtZSA9IHRoaXMuZGVmYXVsdFZhbHVlQ29sdW1uTmFtZTsKLQkJdGhpcy5kZWZhdWx0VmFsdWVDb2x1bW5OYW1lID0gbmV3RGVmYXVsdFZhbHVlQ29sdW1uTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1ZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGREZWZhdWx0VmFsdWVDb2x1bW5OYW1lLCBuZXdEZWZhdWx0VmFsdWVDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBrQ29sdW1uVmFsdWUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0UGtDb2x1bW5WYWx1ZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoU3RyaW5nIG5ld1NwZWNpZmllZFBrQ29sdW1uVmFsdWUpIHsKLQkJU3RyaW5nIG9sZFNwZWNpZmllZFBrQ29sdW1uVmFsdWUgPSB0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWU7Ci0JCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSA9IG5ld1NwZWNpZmllZFBrQ29sdW1uVmFsdWU7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuc2V0UGtDb2x1bW5WYWx1ZShuZXdTcGVjaWZpZWRQa0NvbHVtblZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRQa0NvbHVtblZhbHVlLCBuZXdTcGVjaWZpZWRQa0NvbHVtblZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlXyhTdHJpbmcgbmV3U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSkgewotCQlTdHJpbmcgb2xkU3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSA9IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZTsKLQkJdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlID0gbmV3U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRQa0NvbHVtblZhbHVlLCBuZXdTcGVjaWZpZWRQa0NvbHVtblZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQa0NvbHVtblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UGtDb2x1bW5WYWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoU3RyaW5nIG5ld0RlZmF1bHRQa0NvbHVtblZhbHVlKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0UGtDb2x1bW5WYWx1ZSA9IHRoaXMuZGVmYXVsdFBrQ29sdW1uVmFsdWU7Ci0JCXRoaXMuZGVmYXVsdFBrQ29sdW1uVmFsdWUgPSBuZXdEZWZhdWx0UGtDb2x1bW5WYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSwgb2xkRGVmYXVsdFBrQ29sdW1uVmFsdWUsIG5ld0RlZmF1bHRQa0NvbHVtblZhbHVlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB1bmlxdWUgY29uc3RyYWludHMgKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4odGhpcy51bmlxdWVDb25zdHJhaW50cyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgdW5pcXVlQ29uc3RyYWludHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50cy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBPcm1VbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJT3JtVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50ID0gIGJ1aWxkVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmFkZChpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7Ci0JCWdldEdlbmVyYXRvclJlc291cmNlKCkuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCWZpcmVJdGVtQWRkZWQoVGFibGVHZW5lcmF0b3IuVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QsIGluZGV4LCB1bmlxdWVDb25zdHJhaW50KTsKLQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4LCBPcm1VbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgdW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVGFibGVHZW5lcmF0b3IuVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgewotCQl0aGlzLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQodGhpcy51bmlxdWVDb25zdHJhaW50cy5pbmRleE9mKHVuaXF1ZUNvbnN0cmFpbnQpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJT3JtVW5pcXVlQ29uc3RyYWludCByZW1vdmVkVW5pcXVlQ29uc3RyYWludCA9IHRoaXMudW5pcXVlQ29uc3RyYWludHMucmVtb3ZlKGluZGV4KTsKLQkJZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChUYWJsZUdlbmVyYXRvci5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIHJlbW92ZWRVbmlxdWVDb25zdHJhaW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludF8oT3JtVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdCh1bmlxdWVDb25zdHJhaW50LCB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCBUYWJsZUdlbmVyYXRvci5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMudW5pcXVlQ29uc3RyYWludHMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0R2VuZXJhdG9yUmVzb3VyY2UoKS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJZmlyZUl0ZW1Nb3ZlZChUYWJsZUdlbmVyYXRvci5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKioqKiogVW5pcXVlQ29uc3RyYWludC5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZVVuaXF1ZUNvbnN0cmFpbnRDb2x1bW5OYW1lcygpIHsKLQkJb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGRiVGFibGUgPSBnZXREYlRhYmxlKCk7Ci0JCWlmIChkYlRhYmxlICE9IG51bGwpIHsKLQkJCXJldHVybiBkYlRhYmxlLmNvbHVtbk5hbWVzKCk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGJTY2hlbWEoKTsKLQkJcmV0dXJuIChzY2hlbWEgPT0gbnVsbCkgPyBudWxsIDogc2NoZW1hLnRhYmxlTmFtZWQodGhpcy5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIGdldERiU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXREYXRhYmFzZSgpLnNjaGVtYU5hbWVkKHRoaXMuZ2V0U2NoZW1hKCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIG9ybSByZXNvdXJjZSBtb2RlbCAtPiBjb250ZXh0IG1vZGVsICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSh0YWJsZUdlbmVyYXRvcik7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSB0aGlzLnNwZWNpZmllZFRhYmxlKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IHRoaXMuZGVmYXVsdENhdGFsb2coKTsKLQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSB0aGlzLnNwZWNpZmllZFNjaGVtYSh0YWJsZUdlbmVyYXRvcik7Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYSA9IHRoaXMuZGVmYXVsdFNjaGVtYSgpOwotCQl0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZSA9IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSh0YWJsZUdlbmVyYXRvcik7Ci0JCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSA9IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSh0YWJsZUdlbmVyYXRvcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZVVuaXF1ZUNvbnRyYWludHModGFibGVHZW5lcmF0b3IpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVW5pcXVlQ29udHJhaW50cyhYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcikgewotCQlpZiAodGFibGVHZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50IDogdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKSkgewotCQkJdGhpcy51bmlxdWVDb25zdHJhaW50cy5hZGQoYnVpbGRVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQpKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IpIHsKLQkJc3VwZXIudXBkYXRlKHRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUYWJsZV8odGhpcy5zcGVjaWZpZWRUYWJsZSh0YWJsZUdlbmVyYXRvcikpOwotCQl0aGlzLnNldFNwZWNpZmllZENhdGFsb2dfKHRoaXMuc3BlY2lmaWVkQ2F0YWxvZyh0YWJsZUdlbmVyYXRvcikpOwotCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMuZGVmYXVsdENhdGFsb2coKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hXyh0aGlzLnNwZWNpZmllZFNjaGVtYSh0YWJsZUdlbmVyYXRvcikpOwotCQl0aGlzLnNldERlZmF1bHRTY2hlbWEodGhpcy5kZWZhdWx0U2NoZW1hKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFBrQ29sdW1uTmFtZV8odGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWUodGFibGVHZW5lcmF0b3IpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWVfKHRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKHRhYmxlR2VuZXJhdG9yKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZV8odGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlKHRhYmxlR2VuZXJhdG9yKSk7Ci0JCS8vVE9ETyBkZWZhdWx0cwotCQl0aGlzLnVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKHRhYmxlR2VuZXJhdG9yKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYWJsZShYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcikgewotCQlyZXR1cm4gdGFibGVHZW5lcmF0b3IuZ2V0VGFibGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDYXRhbG9nKFhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvci5nZXRDYXRhbG9nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2NoZW1hKFhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yKSB7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvci5nZXRTY2hlbWEoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRQa0NvbHVtbk5hbWUoWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IpIHsKLQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yLmdldFBrQ29sdW1uTmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZShYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcikgewotCQlyZXR1cm4gdGFibGVHZW5lcmF0b3IuZ2V0VmFsdWVDb2x1bW5OYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZShYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcikgewotCQlyZXR1cm4gdGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5WYWx1ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVW5pcXVlQ29uc3RyYWludHMoWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IpIHsKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdW5pcXVlQ29uc3RyYWludHMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHJlc291cmNlVW5pcXVlQ29uc3RyYWludHM7Ci0JCWlmICh0YWJsZUdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc291cmNlVW5pcXVlQ29uc3RyYWludHMgPSBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4odGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKSk7Ly9wcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljaWF0aW9uRXhjZXB0aW9uCi0JCX0KLQkJCi0JCXdoaWxlICh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKLQkJCU9ybVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSkgewotCQkJCXVuaXF1ZUNvbnN0cmFpbnQudXBkYXRlKHJlc291cmNlVW5pcXVlQ29uc3RyYWludHMubmV4dCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVVuaXF1ZUNvbnN0cmFpbnRfKHVuaXF1ZUNvbnN0cmFpbnQpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAocmVzb3VyY2VVbmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKLQkJCWFkZFVuaXF1ZUNvbnN0cmFpbnQodW5pcXVlQ29uc3RyYWludHNTaXplKCksIGJ1aWxkVW5pcXVlQ29uc3RyYWludChyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVVuaXF1ZUNvbnN0cmFpbnQgYnVpbGRVbmlxdWVDb25zdHJhaW50KFhtbFVuaXF1ZUNvbnN0cmFpbnQgeG1sVW5pcXVlQ29uc3RyYWludCkgewotCQlyZXR1cm4gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkT3JtVW5pcXVlQ29uc3RyYWludCh0aGlzLCB0aGlzLCB4bWxVbmlxdWVDb25zdHJhaW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtVHJhbnNpZW50TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UcmFuc2llbnRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YWEwMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UcmFuc2llbnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVRyYW5zaWVudE1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WG1sVHJhbnNpZW50PiBpbXBsZW1lbnRzIE9ybVRyYW5zaWVudE1hcHBpbmcKLXsKLQkKLQlwdWJsaWMgR2VuZXJpY09ybVRyYW5zaWVudE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1UcmFuc2llbnRNYXBwaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiA5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgWG1sVHJhbnNpZW50IGFkZFRvUmVzb3VyY2VNb2RlbChBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCVhtbFRyYW5zaWVudCB0cmFuc2llbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRyYW5zaWVudEltcGwoKTsKLQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmluaXRpYWxpemUodHJhbnNpZW50UmVzb3VyY2UpOwotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLmFkZCh0cmFuc2llbnRSZXNvdXJjZSk7Ci0JCXJldHVybiB0cmFuc2llbnRSZXNvdXJjZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLnJlbW92ZSh0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCWlmICh0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCXR5cGVNYXBwaW5nLnNldEF0dHJpYnV0ZXMobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxUcmFuc2llbnQgdHJhbnNpZW50UmVzb3VyY2UpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSh0cmFuc2llbnRSZXNvdXJjZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxUcmFuc2llbnQgdHJhbnNpZW50UmVzb3VyY2UpIHsKLQkJc3VwZXIudXBkYXRlKHRyYW5zaWVudFJlc291cmNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtVW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1VbmlxdWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZWRhODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1VbmlxdWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVVuaXF1ZUNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1VbmlxdWVDb25zdHJhaW50Ci17Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lczsKLQkKLQlwcm90ZWN0ZWQgWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50OwotCQotCXByb3RlY3RlZCBVbmlxdWVDb25zdHJhaW50Lk93bmVyIG93bmVyOwotCQotCXB1YmxpYyBHZW5lcmljT3JtVW5pcXVlQ29uc3RyYWludChPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQsIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIgb3duZXIsIFhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMuY29sdW1uTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5pbml0aWFsaXplKHVuaXF1ZUNvbnN0cmFpbnQpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmNvbHVtbk5hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbHVtbk5hbWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uTmFtZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbHVtbk5hbWUoaW50IGluZGV4LCBTdHJpbmcgY29sdW1uTmFtZSkgewotCQl0aGlzLmNvbHVtbk5hbWVzLmFkZChpbmRleCwgY29sdW1uTmFtZSk7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludC5nZXRDb2x1bW5OYW1lcygpLmFkZChpbmRleCwgY29sdW1uTmFtZSk7Ci0JCWZpcmVJdGVtQWRkZWQoVW5pcXVlQ29uc3RyYWludC5DT0xVTU5fTkFNRVNfTElTVCwgaW5kZXgsIGNvbHVtbk5hbWUpOwkJCi0JfQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5OYW1lXyhpbnQgaW5kZXgsIFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0JCXRoaXMuY29sdW1uTmFtZXMuYWRkKGluZGV4LCBjb2x1bW5OYW1lKTsKLQkJZmlyZUl0ZW1BZGRlZChVbmlxdWVDb25zdHJhaW50LkNPTFVNTl9OQU1FU19MSVNULCBpbmRleCwgY29sdW1uTmFtZSk7CQkKLQl9CQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSkgewotCQl0aGlzLnJlbW92ZUNvbHVtbk5hbWUodGhpcy5jb2x1bW5OYW1lcy5pbmRleE9mKGNvbHVtbk5hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5OYW1lKGludCBpbmRleCkgewotCQlTdHJpbmcgcmVtb3ZlZENvbHVtbk5hbWUgPSB0aGlzLmNvbHVtbk5hbWVzLnJlbW92ZShpbmRleCk7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludC5nZXRDb2x1bW5OYW1lcygpLnJlbW92ZShpbmRleCk7Ci0JCWZpcmVJdGVtUmVtb3ZlZChVbmlxdWVDb25zdHJhaW50LkNPTFVNTl9OQU1FU19MSVNULCBpbmRleCwgcmVtb3ZlZENvbHVtbk5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb2x1bW5OYW1lXyhpbnQgaW5kZXgpIHsKLQkJU3RyaW5nIHJlbW92ZWRDb2x1bW5OYW1lID0gdGhpcy5jb2x1bW5OYW1lcy5yZW1vdmUoaW5kZXgpOwotCQlmaXJlSXRlbVJlbW92ZWQoVW5pcXVlQ29uc3RyYWludC5DT0xVTU5fTkFNRVNfTElTVCwgaW5kZXgsIHJlbW92ZWRDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQ29sdW1uTmFtZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmNvbHVtbk5hbWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnQuZ2V0Q29sdW1uTmFtZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWZpcmVJdGVtTW92ZWQoVW5pcXVlQ29uc3RyYWludC5DT0xVTU5fTkFNRVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludC5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludCA9IHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNvbHVtbk5hbWVzKHVuaXF1ZUNvbnN0cmFpbnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29sdW1uTmFtZXMoWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHhtbENvbHVtbk5hbWVzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odW5pcXVlQ29uc3RyYWludC5nZXRDb2x1bW5OYW1lcygpKTsKLQkJCi0JCWZvciAoU3RyaW5nIGFubm90YXRpb25Db2x1bW5OYW1lIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHhtbENvbHVtbk5hbWVzKSkgewotCQkJdGhpcy5jb2x1bW5OYW1lcy5hZGQoYW5ub3RhdGlvbkNvbHVtbk5hbWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50ID0gdW5pcXVlQ29uc3RyYWludDsKLQkJdGhpcy51cGRhdGVDb2x1bW5OYW1lcyh1bmlxdWVDb25zdHJhaW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29sdW1uTmFtZXMoWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHhtbENvbHVtbk5hbWVzID0gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odW5pcXVlQ29uc3RyYWludC5nZXRDb2x1bW5OYW1lcygpKTsKLQkJCi0JCWludCBpbmRleCA9IDA7Ci0JCWZvciAoU3RyaW5nIHhtbENvbHVtbk5hbWUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoeG1sQ29sdW1uTmFtZXMpKSB7Ci0JCQlpZiAoY29sdW1uTmFtZXNTaXplKCkgPiBpbmRleCkgewotCQkJCWlmICh0aGlzLmNvbHVtbk5hbWVzLmdldChpbmRleCkgIT0geG1sQ29sdW1uTmFtZSkgewotCQkJCQlhZGRDb2x1bW5OYW1lXyhpbmRleCwgeG1sQ29sdW1uTmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWRkQ29sdW1uTmFtZV8oaW5kZXgsIHhtbENvbHVtbk5hbWUpOwkJCQotCQkJfQotCQkJaW5kZXgrKzsKLQkJfQotCQkKLQkJZm9yICggOyBpbmRleCA8IGNvbHVtbk5hbWVzU2l6ZSgpOyApIHsKLQkJCXJlbW92ZUNvbHVtbk5hbWVfKGluZGV4KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtVmVyc2lvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtVmVyc2lvbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4MzQyYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVZlcnNpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1WZXJzaW9uTWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxYbWxWZXJzaW9uPgotCWltcGxlbWVudHMgT3JtVmVyc2lvbk1hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtQ29sdW1uIGNvbHVtbjsKLQotCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgdGVtcG9yYWw7Ci0JCi0JcHVibGljIEdlbmVyaWNPcm1WZXJzaW9uTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZE9ybUNvbHVtbih0aGlzLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gMzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1WZXJzaW9uTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVhtbENvbHVtbk1hcHBpbmcoT3JtQ29sdW1uTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tWG1sQ29sdW1uTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJc2V0VGVtcG9yYWwob2xkTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQkJZ2V0Q29sdW1uKCkuaW5pdGlhbGl6ZUZyb20ob2xkTWFwcGluZy5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIE9ybUNvbHVtbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkgewotCQlyZXR1cm4gdGhpcy50ZW1wb3JhbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpIHsKLQkJVGVtcG9yYWxUeXBlIG9sZFRlbXBvcmFsID0gdGhpcy50ZW1wb3JhbDsKLQkJdGhpcy50ZW1wb3JhbCA9IG5ld1RlbXBvcmFsOwotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld1RlbXBvcmFsKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ29sdW1uTWFwcGluZy5URU1QT1JBTF9QUk9QRVJUWSwgb2xkVGVtcG9yYWwsIG5ld1RlbXBvcmFsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGVtcG9yYWxfKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkgewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0aGlzLnRlbXBvcmFsOwotCQl0aGlzLnRlbXBvcmFsID0gbmV3VGVtcG9yYWw7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ29sdW1uTWFwcGluZy5URU1QT1JBTF9QUk9QRVJUWSwgb2xkVGVtcG9yYWwsIG5ld1RlbXBvcmFsKTsKLQl9Ci0KLQlwdWJsaWMgWG1sVmVyc2lvbiBhZGRUb1Jlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlYbWxWZXJzaW9uIHZlcnNpb24gPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxWZXJzaW9uSW1wbCgpOwotCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaW5pdGlhbGl6ZSh2ZXJzaW9uKTsKLQkJdHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuYWRkKHZlcnNpb24pOwotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoQWJzdHJhY3RYbWxUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5yZW1vdmUodGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQlpZiAodHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlcygpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQl0eXBlTWFwcGluZy5zZXRBdHRyaWJ1dGVzKG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsJCQotCQlyZXR1cm4gZ2V0QXR0cmlidXRlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIFRhYmxlIGdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXREYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUodmVyc2lvbik7Ci0JCXRoaXMudGVtcG9yYWwgPSB0aGlzLnNwZWNpZmllZFRlbXBvcmFsKHZlcnNpb24pOwotCQl0aGlzLmNvbHVtbi5pbml0aWFsaXplKHZlcnNpb24uZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCXN1cGVyLnVwZGF0ZSh2ZXJzaW9uKTsKLQkJdGhpcy5zZXRUZW1wb3JhbF8odGhpcy5zcGVjaWZpZWRUZW1wb3JhbCh2ZXJzaW9uKSk7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZSh2ZXJzaW9uLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSBzcGVjaWZpZWRUZW1wb3JhbChYbWxWZXJzaW9uIHZlcnNpb24pIHsKLQkJcmV0dXJuIFRlbXBvcmFsVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh2ZXJzaW9uLmdldFRlbXBvcmFsKCkpOwotCX0KLQotCS8vKioqKioqKioqKioqKioqKiogSVhtbENvbHVtbi5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldENvbHVtbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW5SZXNvdXJjZSgpIHsKLQkJdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbkltcGwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtblJlc291cmNlKCkgewotCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRDb2x1bW4obnVsbCk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQkKLQkJaWYgKGVudGl0eU93bmVkKCkpIHsKLQkJCWFkZENvbHVtbk1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlPcm1Db2x1bW4gY29sdW1uID0gZ2V0Q29sdW1uKCk7Ci0JCVN0cmluZyB0YWJsZSA9IGNvbHVtbi5nZXRUYWJsZSgpOwotCQlib29sZWFuIGRvQ29udGludWUgPSBlbnRpdHlPd25lZCgpICYmICB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKLQkJCi0JCWlmIChkb0NvbnRpbnVlICYmIGdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlKSkgewotCQkJaWYgKGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpLCB0YWJsZSwgY29sdW1uLmdldE5hbWUoKX0sCi0JCQkJCQljb2x1bW4sCi0JCQkJCQljb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RhYmxlLCBjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQljb2x1bW4sCi0JCQkJCQljb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJfQotCQkJZG9Db250aW51ZSA9IGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoZG9Db250aW51ZSAmJiAhIGNvbHVtbi5pc1Jlc29sdmVkKCkpIHsKLQkJCWlmIChnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpLCBjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQljb2x1bW4sCi0JCQkJCQljb2x1bW4uZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtjb2x1bW4uZ2V0TmFtZSgpfSwgCi0JCQkJCQljb2x1bW4sCi0JCQkJCQljb2x1bW4uZ2V0TmFtZVRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmI4M2VhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkKK3sKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDdlMDgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLlBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZXh0ZW5kcyBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cwotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2NoZW1hOwotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ2F0YWxvZzsKLQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2c7Ci0KLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBhY2Nlc3M7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlUGVyc2lzdDsKLQotCXByb3RlY3RlZCBYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5nczsKLQkKLQlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBhcmVudCwgWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5pbml0aWFsaXplKHhtbEVudGl0eU1hcHBpbmdzKTsKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLmFjY2VzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdBY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGRBY2Nlc3MgPSB0aGlzLmFjY2VzczsKLQkJdGhpcy5hY2Nlc3MgPSBuZXdBY2Nlc3M7Ci0JCWlmIChvbGRBY2Nlc3MgIT0gbmV3QWNjZXNzKSB7Ci0JCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpICE9IG51bGwpIHsKLQkJCQl0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUudG9YbWxSZXNvdXJjZU1vZGVsKG5ld0FjY2VzcykpOwotCQkJCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKG51bGwpOwotCQkJCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCQl0aGlzLmVudGl0eU1hcHBpbmdzLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkgPT0gbnVsbCkgewotCQkJCQl0aGlzLmVudGl0eU1hcHBpbmdzLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkJCX0KLQkJCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQkJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUudG9YbWxSZXNvdXJjZU1vZGVsKG5ld0FjY2VzcykpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuQUNDRVNTX1BST1BFUlRZLCBvbGRBY2Nlc3MsIG5ld0FjY2Vzcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEFjY2Vzc18oQWNjZXNzVHlwZSBuZXdBY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGRBY2Nlc3MgPSB0aGlzLmFjY2VzczsKLQkJdGhpcy5hY2Nlc3MgPSBuZXdBY2Nlc3M7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuQUNDRVNTX1BST1BFUlRZLCBvbGRBY2Nlc3MsIG5ld0FjY2Vzcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZENhdGFsb2coKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKSA6IHRoaXMuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDYXRhbG9nKFN0cmluZyBuZXdEZWZhdWx0Q2F0YWxvZykgewotCQlTdHJpbmcgb2xkRGVmYXVsdENhdGFsb2cgPSB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gbmV3RGVmYXVsdENhdGFsb2c7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZLCBvbGREZWZhdWx0Q2F0YWxvZywgbmV3RGVmYXVsdENhdGFsb2cpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nKFN0cmluZyBuZXdDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGRDYXRhbG9nID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBuZXdDYXRhbG9nOwotCQlpZiAob2xkQ2F0YWxvZyAhPSBuZXdDYXRhbG9nKSB7Ci0JCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpICE9IG51bGwpIHsKLQkJCQl0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZyhuZXdDYXRhbG9nKTsKLQkJCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhudWxsKTsKLQkJCQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpID09IG51bGwpIHsKLQkJCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCQl9Ci0JCQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhdGFsb2cobmV3Q2F0YWxvZyk7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkQ2F0YWxvZywgbmV3Q2F0YWxvZyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENhdGFsb2dfKFN0cmluZyBuZXdDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGRDYXRhbG9nID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBuZXdDYXRhbG9nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGRDYXRhbG9nLCBuZXdDYXRhbG9nKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkU2NoZW1hKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRTY2hlbWEoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NoZW1hOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTY2hlbWEoU3RyaW5nIG5ld0RlZmF1bHRTY2hlbWEpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRTY2hlbWEgPSB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYSA9IG5ld0RlZmF1bHRTY2hlbWE7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFksIG9sZERlZmF1bHRTY2hlbWEsIG5ld0RlZmF1bHRTY2hlbWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hKFN0cmluZyBuZXdTY2hlbWEpIHsKLQkJU3RyaW5nIG9sZFNjaGVtYSA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IG5ld1NjaGVtYTsKLQkJaWYgKG9sZFNjaGVtYSAhPSBuZXdTY2hlbWEpIHsKLQkJCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgIT0gbnVsbCkgewotCQkJCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTY2hlbWEobmV3U2NoZW1hKTsKLQkJCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhudWxsKTsKLQkJCQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpID09IG51bGwpIHsKLQkJCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCQl9Ci0JCQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYShuZXdTY2hlbWEpOwotCQkJfQotCQl9Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkU2NoZW1hLCBuZXdTY2hlbWEpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWFfKFN0cmluZyBuZXdTY2hlbWEpIHsKLQkJU3RyaW5nIG9sZFNjaGVtYSA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IG5ld1NjaGVtYTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGRTY2hlbWEsIG5ld1NjaGVtYSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZVBlcnNpc3QoKSB7Ci0JCXJldHVybiB0aGlzLmNhc2NhZGVQZXJzaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVQZXJzaXN0KGJvb2xlYW4gbmV3Q2FzY2FkZVBlcnNpc3QpIHsKLQkJYm9vbGVhbiBvbGRDYXNjYWRlUGVyc2lzdCA9IHRoaXMuY2FzY2FkZVBlcnNpc3Q7Ci0JCXRoaXMuY2FzY2FkZVBlcnNpc3QgPSBuZXdDYXNjYWRlUGVyc2lzdDsKLQkJaWYgKG9sZENhc2NhZGVQZXJzaXN0ICE9IG5ld0Nhc2NhZGVQZXJzaXN0KSB7Ci0JCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpICE9IG51bGwpIHsKLQkJCQl0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2FzY2FkZVBlcnNpc3QobmV3Q2FzY2FkZVBlcnNpc3QpOwotCQkJCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKG51bGwpOwotCQkJCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCQl0aGlzLmVudGl0eU1hcHBpbmdzLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3Q2FzY2FkZVBlcnNpc3QpIHsKLQkJCQlpZiAocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZW50aXR5TWFwcGluZ3Muc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQkJfQotCQkJCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXNjYWRlUGVyc2lzdChuZXdDYXNjYWRlUGVyc2lzdCk7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5DQVNDQURFX1BFUlNJU1RfUFJPUEVSVFksIG9sZENhc2NhZGVQZXJzaXN0LCBuZXdDYXNjYWRlUGVyc2lzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2FzY2FkZVBlcnNpc3RfKGJvb2xlYW4gbmV3Q2FzY2FkZVBlcnNpc3QpIHsKLQkJYm9vbGVhbiBvbGRDYXNjYWRlUGVyc2lzdCA9IHRoaXMuY2FzY2FkZVBlcnNpc3Q7Ci0JCXRoaXMuY2FzY2FkZVBlcnNpc3QgPSBuZXdDYXNjYWRlUGVyc2lzdDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5DQVNDQURFX1BFUlNJU1RfUFJPUEVSVFksIG9sZENhc2NhZGVQZXJzaXN0LCBuZXdDYXNjYWRlUGVyc2lzdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJdGhpcy5lbnRpdHlNYXBwaW5ncyA9IGVudGl0eU1hcHBpbmdzOwotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpICE9IG51bGwpIHsKLQkJCXRoaXMuYWNjZXNzID0gQWNjZXNzVHlwZS5mcm9tWG1sUmVzb3VyY2VNb2RlbCh0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCQkJdGhpcy5jYXNjYWRlUGVyc2lzdCA9IHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCk7Ci0JCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpOwotCQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCXRoaXMuZW50aXR5TWFwcGluZ3MgPSBlbnRpdHlNYXBwaW5nczsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldEFjY2Vzc18oQWNjZXNzVHlwZS5mcm9tWG1sUmVzb3VyY2VNb2RlbCh0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpKTsKLQkJCXRoaXMuc2V0Q2FzY2FkZVBlcnNpc3RfKHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRDYXRhbG9nXyh0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hXyh0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zZXRBY2Nlc3NfKG51bGwpOwotCQkJdGhpcy5zZXRDYXNjYWRlUGVyc2lzdF8oZmFsc2UpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRDYXRhbG9nXyhudWxsKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hXyhudWxsKTsKLQkJfQotCQl0aGlzLnNldERlZmF1bHRTY2hlbWEodGhpcy5wcm9qZWN0RGVmYXVsdFNjaGVtYU5hbWUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdENhdGFsb2codGhpcy5wcm9qZWN0RGVmYXVsdENhdGFsb2dOYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3REZWZhdWx0U2NoZW1hTmFtZSgpIHsKLQkJU2NoZW1hIHByb2plY3REZWZhdWx0U2NoZW1hID0gZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJcmV0dXJuIHByb2plY3REZWZhdWx0U2NoZW1hID09IG51bGwgPyBudWxsIDogcHJvamVjdERlZmF1bHRTY2hlbWEuZ2V0TmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdERlZmF1bHRDYXRhbG9nTmFtZSgpIHsKLQkJQ2F0YWxvZyBjYXRhbG9nID0gZ2V0SnBhUHJvamVjdCgpLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJcmV0dXJuIChjYXRhbG9nID09IG51bGwpID8gbnVsbCA6IGNhdGFsb2cuZ2V0TmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJaWYgKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eU1hcHBpbmdzLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlpZiAocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZW50aXR5TWFwcGluZ3MuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3MGVmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBleHRlbmRzIEFic3RyYWN0T3JtSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCi17Ci0JcHJvdGVjdGVkIGJvb2xlYW4geG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci0KLQlwcm90ZWN0ZWQgWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3M7Ci0KLQlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVudGl0eU1hcHBpbmdzIHBhcmVudCwgWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldEpwYUZhY3RvcnkoKS5idWlsZFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKHRoaXMsIHhtbEVudGl0eU1hcHBpbmdzKTsKLQkJdGhpcy5pbml0aWFsaXplKHhtbEVudGl0eU1hcHBpbmdzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gdGhpcy54bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShib29sZWFuIG5ld1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCWJvb2xlYW4gb2xkWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgPSB0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlOwotCQl0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlID0gbmV3WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGU7Ci0JCWlmIChvbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSAhPSBuZXdYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSkgewotCQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKG5ld1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKTsJCQkJCQkKLQkJCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXRoaXMuZW50aXR5TWFwcGluZ3Muc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEobnVsbCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpIHsKLQkJCQl0aGlzLmVudGl0eU1hcHBpbmdzLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkJCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShuZXdYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSk7CQkKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLlhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZLCBvbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSwgbmV3WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZV8oYm9vbGVhbiBuZXdYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSkgewotCQlib29sZWFuIG9sZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlID0gdGhpcy54bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZTsKLQkJdGhpcy54bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSA9IG5ld1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLlhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZLCBvbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSwgbmV3WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpOwotCX0KLQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJdGhpcy5lbnRpdHlNYXBwaW5ncyA9IGVudGl0eU1hcHBpbmdzOwotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpICE9IG51bGwpIHsKLQkJCXRoaXMueG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQl0aGlzLmVudGl0eU1hcHBpbmdzID0gZW50aXR5TWFwcGluZ3M7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkgIT0gbnVsbCkgewotCQkJc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVfKHRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVfKGZhbHNlKTsKLQkJfQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnVwZGF0ZShlbnRpdHlNYXBwaW5ncyk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5TWFwcGluZ3MuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlpZiAocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZW50aXR5TWFwcGluZ3MuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9OdWxsT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL051bGxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3YjRmNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9OdWxsT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOworCitwdWJsaWMgY2xhc3MgTnVsbE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyCit7CisKKwlwcm90ZWN0ZWQgZmluYWwgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciBvd25lcjsKKwkKKwlwdWJsaWMgTnVsbE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyIG93bmVyKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMub3duZXIgPSBvd25lcjsKKwl9CisKKwlwdWJsaWMgT3duZXIgZ2V0T3duZXIoKSB7CisJCXJldHVybiB0aGlzLm93bmVyOworCX0KKwkKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgeworCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwl9CisJCisJcHVibGljIGludCBhc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB7CisJCXJldHVybiAwOworCX0KKworCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgeworCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwl9CisJCisJcHVibGljIGludCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgeworCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwl9CisKKwlwdWJsaWMgaW50IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHsKKwkJcmV0dXJuIDA7CisJfQorCQorCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCS8vbm8tb3AKKwl9CisKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUJhc2ljTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwYzZlMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7CisKK3B1YmxpYyBjbGFzcyBPcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uCisJaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCQluZXcgT3JtQmFzaWNNYXBwaW5nRGVmaW5pdGlvbigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCisJICovCisJcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgT3JtQmFzaWNNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKKwkJCQlmYWN0b3J5LCAKKwkJCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXNpYygpLCAKKwkJCQlYbWxCYXNpYy5jbGFzcyk7CisJfQorCQorCXB1YmxpYyBPcm1CYXNpY01hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKKwkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKKwkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtQmFzaWNNYXBwaW5nKHBhcmVudCwgKFhtbEJhc2ljKSByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFZpcnR1YWxSZXNvdXJjZU1hcHBpbmcoCisJCQlPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgCisJCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZywgCisJCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5idWlsZFZpcnR1YWxYbWxCYXNpYyhvcm1UeXBlTWFwcGluZywgKEphdmFCYXNpY01hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQmFzaWNNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1CYXNpY01hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWRkMTg3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1CYXNpY01hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtQmFzaWNNYXBwaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1CYXNpY01hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBPcm1CYXNpY01hcHBpbmdQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE9ybUJhc2ljTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBPcm1CYXNpY01hcHBpbmcgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nKEpwYUZhY3RvcnkgZmFjdG9yeSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1CYXNpY01hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQ2FzY2FkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUNhc2NhZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhM2YxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQ2FzY2FkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotcHVibGljIGNsYXNzIE9ybUNhc2NhZGUgZXh0ZW5kcyBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgQ2FzY2FkZSwgT3JtSnBhQ29udGV4dE5vZGUKLXsKLQotCXByb3RlY3RlZCBib29sZWFuIGFsbDsKLQotCXByb3RlY3RlZCBib29sZWFuIHBlcnNpc3Q7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXJnZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlZnJlc2g7Ci0KLQkKLQlwcm90ZWN0ZWQgWG1sUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nOwotCQotCXByb3RlY3RlZCBPcm1DYXNjYWRlKE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKENhc2NhZGUgb2xkQ2FzY2FkZSkgewotCQlzZXRBbGwob2xkQ2FzY2FkZS5pc0FsbCgpKTsKLQkJc2V0UGVyc2lzdChvbGRDYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJc2V0TWVyZ2Uob2xkQ2FzY2FkZS5pc01lcmdlKCkpOwotCQlzZXRSZW1vdmUob2xkQ2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJc2V0UmVmcmVzaChvbGRDYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbCgpIHsKLQkJcmV0dXJuIHRoaXMuYWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsbChib29sZWFuIG5ld0FsbCkgewotCQlib29sZWFuIG9sZEFsbCA9IHRoaXMuYWxsOwotCQl0aGlzLmFsbCA9IG5ld0FsbDsKLQkJaWYgKG9sZEFsbCAhPSBuZXdBbGwpIHsKLQkJCWlmICh0aGlzLmdldENhc2NhZGVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldENhc2NhZGVSZXNvdXJjZSgpLnNldENhc2NhZGVBbGwobmV3QWxsKTsJCQkJCQkKLQkJCQlpZiAodGhpcy5nZXRDYXNjYWRlUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVDYXNjYWRlUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdBbGwgIT0gZmFsc2UpIHsKLQkJCQlhZGRDYXNjYWRlUmVzb3VyY2UoKTsKLQkJCQlnZXRDYXNjYWRlUmVzb3VyY2UoKS5zZXRDYXNjYWRlQWxsKG5ld0FsbCk7Ci0JCQl9Ci0JCX0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChBTExfUFJPUEVSVFksIG9sZEFsbCwgbmV3QWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWxsXyhib29sZWFuIG5ld0FsbCkgewotCQlib29sZWFuIG9sZEFsbCA9IHRoaXMuYWxsOwotCQl0aGlzLmFsbCA9IG5ld0FsbDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChBTExfUFJPUEVSVFksIG9sZEFsbCwgbmV3QWxsKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0KCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBlcnNpc3QoYm9vbGVhbiBuZXdQZXJzaXN0KSB7Ci0JCWJvb2xlYW4gb2xkUGVyc2lzdCA9IHRoaXMucGVyc2lzdDsKLQkJdGhpcy5wZXJzaXN0ID0gbmV3UGVyc2lzdDsKLQkJaWYgKG9sZFBlcnNpc3QgIT0gbmV3UGVyc2lzdCkgewotCQkJaWYgKHRoaXMuZ2V0Q2FzY2FkZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0Q2FzY2FkZVJlc291cmNlKCkuc2V0Q2FzY2FkZVBlcnNpc3QobmV3UGVyc2lzdCk7CQkJCQkJCi0JCQkJaWYgKHRoaXMuZ2V0Q2FzY2FkZVJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlQ2FzY2FkZVJlc291cmNlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3UGVyc2lzdCAhPSBmYWxzZSkgewotCQkJCWFkZENhc2NhZGVSZXNvdXJjZSgpOwotCQkJCWdldENhc2NhZGVSZXNvdXJjZSgpLnNldENhc2NhZGVQZXJzaXN0KG5ld1BlcnNpc3QpOwotCQkJfQotCQl9CQkKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQRVJTSVNUX1BST1BFUlRZLCBvbGRQZXJzaXN0LCBuZXdQZXJzaXN0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGVyc2lzdF8oYm9vbGVhbiBuZXdQZXJzaXN0KSB7Ci0JCWJvb2xlYW4gb2xkUGVyc2lzdCA9IHRoaXMucGVyc2lzdDsKLQkJdGhpcy5wZXJzaXN0ID0gbmV3UGVyc2lzdDsJCQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBFUlNJU1RfUFJPUEVSVFksIG9sZFBlcnNpc3QsIG5ld1BlcnNpc3QpOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaXNNZXJnZSgpIHsKLQkJcmV0dXJuIHRoaXMubWVyZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWVyZ2UoYm9vbGVhbiBuZXdNZXJnZSkgewotCQlib29sZWFuIG9sZE1lcmdlID0gdGhpcy5tZXJnZTsKLQkJdGhpcy5tZXJnZSA9IG5ld01lcmdlOwotCQlpZiAob2xkTWVyZ2UgIT0gbmV3TWVyZ2UpIHsKLQkJCWlmICh0aGlzLmdldENhc2NhZGVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldENhc2NhZGVSZXNvdXJjZSgpLnNldENhc2NhZGVNZXJnZShuZXdNZXJnZSk7CQkJCQkJCi0JCQkJaWYgKHRoaXMuZ2V0Q2FzY2FkZVJlc291cmNlKCkuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpIHsKLQkJCQkJcmVtb3ZlQ2FzY2FkZVJlc291cmNlKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV3TWVyZ2UgIT0gZmFsc2UpIHsKLQkJCQlhZGRDYXNjYWRlUmVzb3VyY2UoKTsKLQkJCQlnZXRDYXNjYWRlUmVzb3VyY2UoKS5zZXRDYXNjYWRlTWVyZ2UobmV3TWVyZ2UpOwotCQkJfQotCQl9CQkKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNRVJHRV9QUk9QRVJUWSwgb2xkTWVyZ2UsIG5ld01lcmdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWVyZ2VfKGJvb2xlYW4gbmV3TWVyZ2UpIHsKLQkJYm9vbGVhbiBvbGRNZXJnZSA9IHRoaXMubWVyZ2U7Ci0JCXRoaXMubWVyZ2UgPSBuZXdNZXJnZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNRVJHRV9QUk9QRVJUWSwgb2xkTWVyZ2UsIG5ld01lcmdlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlbW92ZShib29sZWFuIG5ld1JlbW92ZSkgewotCQlib29sZWFuIG9sZFJlbW92ZSA9IHRoaXMucmVtb3ZlOwotCQl0aGlzLnJlbW92ZSA9IG5ld1JlbW92ZTsKLQkJaWYgKG9sZFJlbW92ZSAhPSBuZXdSZW1vdmUpIHsKLQkJCWlmICh0aGlzLmdldENhc2NhZGVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldENhc2NhZGVSZXNvdXJjZSgpLnNldENhc2NhZGVSZW1vdmUobmV3UmVtb3ZlKTsJCQkJCQkKLQkJCQlpZiAodGhpcy5nZXRDYXNjYWRlUmVzb3VyY2UoKS5pc0FsbEZlYXR1cmVzVW5zZXQoKSkgewotCQkJCQlyZW1vdmVDYXNjYWRlUmVzb3VyY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdSZW1vdmUgIT0gZmFsc2UpIHsKLQkJCQlhZGRDYXNjYWRlUmVzb3VyY2UoKTsKLQkJCQlnZXRDYXNjYWRlUmVzb3VyY2UoKS5zZXRDYXNjYWRlUmVtb3ZlKG5ld1JlbW92ZSk7Ci0JCQl9Ci0JCX0JCQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFJFTU9WRV9QUk9QRVJUWSwgb2xkUmVtb3ZlLCBuZXdSZW1vdmUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZW1vdmVfKGJvb2xlYW4gbmV3UmVtb3ZlKSB7Ci0JCWJvb2xlYW4gb2xkUmVtb3ZlID0gdGhpcy5yZW1vdmU7Ci0JCXRoaXMucmVtb3ZlID0gbmV3UmVtb3ZlOwkJCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVNT1ZFX1BST1BFUlRZLCBvbGRSZW1vdmUsIG5ld1JlbW92ZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZyZXNoKCkgewotCQlyZXR1cm4gdGhpcy5yZWZyZXNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2goYm9vbGVhbiBuZXdSZWZyZXNoKSB7Ci0JCWJvb2xlYW4gb2xkUmVmcmVzaCA9IHRoaXMucmVmcmVzaDsKLQkJdGhpcy5yZWZyZXNoID0gbmV3UmVmcmVzaDsJCi0JCWlmIChvbGRSZWZyZXNoICE9IG5ld1JlZnJlc2gpIHsKLQkJCWlmICh0aGlzLmdldENhc2NhZGVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldENhc2NhZGVSZXNvdXJjZSgpLnNldENhc2NhZGVSZWZyZXNoKG5ld1JlZnJlc2gpOwkJCQkJCQotCQkJCWlmICh0aGlzLmdldENhc2NhZGVSZXNvdXJjZSgpLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7Ci0JCQkJCXJlbW92ZUNhc2NhZGVSZXNvdXJjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5ld1JlZnJlc2ggIT0gZmFsc2UpIHsKLQkJCQlhZGRDYXNjYWRlUmVzb3VyY2UoKTsKLQkJCQlnZXRDYXNjYWRlUmVzb3VyY2UoKS5zZXRDYXNjYWRlUmVmcmVzaChuZXdSZWZyZXNoKTsKLQkJCX0KLQkJfQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFJFRlJFU0hfUFJPUEVSVFksIG9sZFJlZnJlc2gsIG5ld1JlZnJlc2gpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZWZyZXNoXyhib29sZWFuIG5ld1JlZnJlc2gpIHsKLQkJYm9vbGVhbiBvbGRSZWZyZXNoID0gdGhpcy5yZWZyZXNoOwotCQl0aGlzLnJlZnJlc2ggPSBuZXdSZWZyZXNoOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFJFRlJFU0hfUFJPUEVSVFksIG9sZFJlZnJlc2gsIG5ld1JlZnJlc2gpOwotCX0KLQkKLQotCXByb3RlY3RlZCBDYXNjYWRlVHlwZSBnZXRDYXNjYWRlUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDYXNjYWRlUmVzb3VyY2UoKSB7Ci0JCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5zZXRDYXNjYWRlKG51bGwpOwkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENhc2NhZGVSZXNvdXJjZSgpIHsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLnNldENhc2NhZGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2FzY2FkZVR5cGVJbXBsKCkpOwkJCQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZyA9IHJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0JCUNhc2NhZGVUeXBlIGNhc2NhZGUgPSBnZXRDYXNjYWRlUmVzb3VyY2UoKTsKLQkJdGhpcy5hbGwgPSB0aGlzLmFsbChjYXNjYWRlKTsKLQkJdGhpcy5wZXJzaXN0ID0gdGhpcy5wZXJzaXN0KGNhc2NhZGUpOwotCQl0aGlzLm1lcmdlID0gdGhpcy5tZXJnZShjYXNjYWRlKTsKLQkJdGhpcy5yZW1vdmUgPSB0aGlzLnJlbW92ZShjYXNjYWRlKTsKLQkJdGhpcy5yZWZyZXNoID0gdGhpcy5yZWZyZXNoKGNhc2NhZGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZyA9IHJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0JCUNhc2NhZGVUeXBlIGNhc2NhZGUgPSBnZXRDYXNjYWRlUmVzb3VyY2UoKTsKLQkJdGhpcy5zZXRBbGxfKHRoaXMuYWxsKGNhc2NhZGUpKTsKLQkJdGhpcy5zZXRQZXJzaXN0Xyh0aGlzLnBlcnNpc3QoY2FzY2FkZSkpOwotCQl0aGlzLnNldE1lcmdlXyh0aGlzLm1lcmdlKGNhc2NhZGUpKTsKLQkJdGhpcy5zZXRSZW1vdmVfKHRoaXMucmVtb3ZlKGNhc2NhZGUpKTsKLQkJdGhpcy5zZXRSZWZyZXNoXyh0aGlzLnJlZnJlc2goY2FzY2FkZSkpOwkJCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWxsKENhc2NhZGVUeXBlIGNhc2NhZGUpIHsKLQkJcmV0dXJuIGNhc2NhZGUgPT0gbnVsbCA/IGZhbHNlIDogY2FzY2FkZS5pc0Nhc2NhZGVBbGwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwZXJzaXN0KENhc2NhZGVUeXBlIGNhc2NhZGUpIHsKLQkJcmV0dXJuIGNhc2NhZGUgPT0gbnVsbCA/IGZhbHNlIDogY2FzY2FkZS5pc0Nhc2NhZGVQZXJzaXN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWVyZ2UoQ2FzY2FkZVR5cGUgY2FzY2FkZSkgewotCQlyZXR1cm4gY2FzY2FkZSA9PSBudWxsID8gZmFsc2UgOiBjYXNjYWRlLmlzQ2FzY2FkZU1lcmdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlKENhc2NhZGVUeXBlIGNhc2NhZGUpIHsKLQkJcmV0dXJuIGNhc2NhZGUgPT0gbnVsbCA/IGZhbHNlIDogY2FzY2FkZS5pc0Nhc2NhZGVSZW1vdmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWZyZXNoKENhc2NhZGVUeXBlIGNhc2NhZGUpIHsKLQkJcmV0dXJuIGNhc2NhZGUgPT0gbnVsbCA/IGZhbHNlIDogY2FzY2FkZS5pc0Nhc2NhZGVSZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDYXNjYWRlUmVzb3VyY2UoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGVEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkYWJsZURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTA4MDI0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGVEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5FbWZUb29sczsKKworLyoqCisgKiBkZWZhdWx0IE9STSBFbWJlZGRhYmxlIHByb3ZpZGVyCisgKi8KK3B1YmxpYyBjbGFzcyBPcm1FbWJlZGRhYmxlRGVmaW5pdGlvbgorCWltcGxlbWVudHMgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRW1iZWRkYWJsZURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJCW5ldyBPcm1FbWJlZGRhYmxlRGVmaW5pdGlvbigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCisJICovCisJcHVibGljIHN0YXRpYyBPcm1UeXBlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIE9ybUVtYmVkZGFibGVEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFhtbFR5cGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKKwkJCQlmYWN0b3J5LCAKKwkJCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlKCksIAorCQkJCVhtbEVtYmVkZGFibGUuY2xhc3MpOworCX0KKwkKKwlwdWJsaWMgT3JtRW1iZWRkYWJsZSBidWlsZENvbnRleHRNYXBwaW5nKAorCQkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCAKKwkJCVhtbFR5cGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCisJCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybUVtYmVkZGFibGUocGFyZW50LCAoWG1sRW1iZWRkYWJsZSkgcmVzb3VyY2VNYXBwaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkYWJsZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkYWJsZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzNjYWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZ1Byb3ZpZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBPcm1FbWJlZGRhYmxlUHJvdmlkZXIgaW1wbGVtZW50cyBPcm1UeXBlTWFwcGluZ1Byb3ZpZGVyCi17Ci0KLQlwdWJsaWMgT3JtRW1iZWRkYWJsZSBidWlsZFR5cGVNYXBwaW5nKEpwYUZhY3RvcnkgZmFjdG9yeSwgT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtRW1iZWRkYWJsZShwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzNiZDRmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7CisKK3B1YmxpYyBjbGFzcyBPcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24KKwlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJCW5ldyBPcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIE9ybUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKKwkJCQlmYWN0b3J5LCAKKwkJCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZElkKCksIAorCQkJCVhtbEVtYmVkZGVkSWQuY2xhc3MpOworCX0KKwkKKwlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKAorCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIAorCQkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAorCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1FbWJlZGRlZElkTWFwcGluZyhwYXJlbnQsIChYbWxFbWJlZGRlZElkKSByZXNvdXJjZU1hcHBpbmcpOworCX0KKworCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFJlc291cmNlTWFwcGluZygKKwkJCU9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCAKKwkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkVmlydHVhbFhtbEVtYmVkZGVkSWQob3JtVHlwZU1hcHBpbmcsIChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEzMTYyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FbWJlZGRlZElkTWFwcGluZ1Byb3ZpZGVyIGltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBPcm1FbWJlZGRlZElkTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgT3JtRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtRW1iZWRkZWRJZE1hcHBpbmcgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nKEpwYUZhY3RvcnkgZmFjdG9yeSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1FbWJlZGRlZElkTWFwcGluZyhwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Y2QxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5FbWZUb29sczsKKworcHVibGljIGNsYXNzIE9ybUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24KKwlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJCW5ldyBPcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBPcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAorCQkJCWZhY3RvcnksIAorCQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVtYmVkZGVkKCksIAorCQkJCVhtbEVtYmVkZGVkLmNsYXNzKTsKKwl9CisJCisJcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKKwkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKKwkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtRW1iZWRkZWRNYXBwaW5nKHBhcmVudCwgKFhtbEVtYmVkZGVkKSByZXNvdXJjZU1hcHBpbmcpOworCX0KKworCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFJlc291cmNlTWFwcGluZygKKwkJCU9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCAKKwkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkVmlydHVhbFhtbEVtYmVkZGVkKG9ybVR5cGVNYXBwaW5nLCAoSmF2YUVtYmVkZGVkTWFwcGluZykgamF2YUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkTWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZjA2OTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FbWJlZGRlZE1hcHBpbmdQcm92aWRlciBpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVtYmVkZGVkTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IE9ybUVtYmVkZGVkTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgT3JtRW1iZWRkZWRNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE9ybUVtYmVkZGVkTWFwcGluZyBidWlsZEF0dHJpYnV0ZU1hcHBpbmcoSnBhRmFjdG9yeSBmYWN0b3J5LCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybUVtYmVkZGVkTWFwcGluZyhwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbnRpdHlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW50aXR5RGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNzM0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW50aXR5RGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOworCisvKioKKyAqIGRlZmF1bHQgT1JNIEVudGl0eSBwcm92aWRlcgorICovCitwdWJsaWMgY2xhc3MgT3JtRW50aXR5RGVmaW5pdGlvbgorCWltcGxlbWVudHMgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uCit7CQorCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVudGl0eURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJCW5ldyBPcm1FbnRpdHlEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgT3JtRW50aXR5RGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFhtbFR5cGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKKwkJCQlmYWN0b3J5LCAKKwkJCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHkoKSwgCisJCQkJWG1sRW50aXR5LmNsYXNzKTsKKwl9CisJCisJcHVibGljIE9ybUVudGl0eSBidWlsZENvbnRleHRNYXBwaW5nKAorCQkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCAKKwkJCVhtbFR5cGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCisJCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybUVudGl0eShwYXJlbnQsIChYbWxFbnRpdHkpIHJlc291cmNlTWFwcGluZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVudGl0eVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW50aXR5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjNjljNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW50aXR5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZ1Byb3ZpZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBPcm1FbnRpdHlQcm92aWRlciBpbXBsZW1lbnRzIE9ybVR5cGVNYXBwaW5nUHJvdmlkZXIKLXsJCi0JcHVibGljIE9ybUVudGl0eSBidWlsZFR5cGVNYXBwaW5nKEpwYUZhY3RvcnkgZmFjdG9yeSwgT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtRW50aXR5KHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUlkTWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmVkYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUlkTWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7CisKK3B1YmxpYyBjbGFzcyBPcm1JZE1hcHBpbmdEZWZpbml0aW9uCisJaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCQluZXcgT3JtSWRNYXBwaW5nRGVmaW5pdGlvbigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCisJICovCisJcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgT3JtSWRNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKKwkJCQlmYWN0b3J5LCAKKwkJCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxJZCgpLCAKKwkJCQlYbWxJZC5jbGFzcyk7CisJfQorCQorCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkQ29udGV4dE1hcHBpbmcoCisJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgCisJCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCisJCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybUlkTWFwcGluZyhwYXJlbnQsIChYbWxJZCkgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRWaXJ0dWFsUmVzb3VyY2VNYXBwaW5nKAorCQkJT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIAorCQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIAorCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuYnVpbGRWaXJ0dWFsWG1sSWQob3JtVHlwZU1hcHBpbmcsIChKYXZhSWRNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUlkTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSWRNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyYzgwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSWRNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQotcHVibGljIGNsYXNzIE9ybUlkTWFwcGluZ1Byb3ZpZGVyIGltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtSWRNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtSWRNYXBwaW5nUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBPcm1JZE1hcHBpbmdQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBPcm1JZE1hcHBpbmcgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nKEpwYUZhY3RvcnkgZmFjdG9yeSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1JZE1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxOTQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOworCitwdWJsaWMgY2xhc3MgT3JtTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uCisJaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCQluZXcgT3JtTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBPcm1NYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAorCQkJCWZhY3RvcnksIAorCQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hbnlUb01hbnkoKSwgCisJCQkJWG1sTWFueVRvTWFueS5jbGFzcyk7CisJfQorCQorCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkQ29udGV4dE1hcHBpbmcoCisJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgCisJCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCisJCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybU1hbnlUb01hbnlNYXBwaW5nKHBhcmVudCwgKFhtbE1hbnlUb01hbnkpIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFJlc291cmNlTWFwcGluZygKKwkJCU9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCAKKwkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkVmlydHVhbFhtbE1hbnlUb01hbnkob3JtVHlwZU1hcHBpbmcsIChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiZmQwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1NYW55VG9NYW55TWFwcGluZ1Byb3ZpZGVyIGltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtTWFueVRvTWFueU1hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBPcm1NYW55VG9NYW55TWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgT3JtTWFueVRvTWFueU1hcHBpbmdQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBPcm1NYW55VG9NYW55TWFwcGluZyBidWlsZEF0dHJpYnV0ZU1hcHBpbmcoSnBhRmFjdG9yeSBmYWN0b3J5LCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybU1hbnlUb01hbnlNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDk4YzY3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7CisKK3B1YmxpYyBjbGFzcyBPcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbgorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IE9ybU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBPcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKKwkJCQlmYWN0b3J5LCAKKwkJCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYW55VG9PbmUoKSwgCisJCQkJWG1sTWFueVRvT25lLmNsYXNzKTsKKwl9CisJCisJcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKKwkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKKwkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtTWFueVRvT25lTWFwcGluZyhwYXJlbnQsIChYbWxNYW55VG9PbmUpIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFJlc291cmNlTWFwcGluZygKKwkJCU9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCAKKwkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkVmlydHVhbFhtbE1hbnlUb09uZShvcm1UeXBlTWFwcGluZywgKEphdmFNYW55VG9PbmVNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjVhY2I1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1NYW55VG9PbmVNYXBwaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1NYW55VG9PbmVNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtTWFueVRvT25lTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgT3JtTWFueVRvT25lTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgT3JtTWFueVRvT25lTWFwcGluZyBidWlsZEF0dHJpYnV0ZU1hcHBpbmcoSnBhRmFjdG9yeSBmYWN0b3J5LCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybU1hbnlUb09uZU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZTJmNjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOworCisvKioKKyAqIGRlZmF1bHQgT1JNIE1hcHBlZFN1cGVyY2xhc3MgZGVmaW5pdGlvbgorICovCitwdWJsaWMgY2xhc3MgT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24KKwlpbXBsZW1lbnRzIE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbgorewkKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1NYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IE9ybU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFhtbFR5cGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKKwkJCQlmYWN0b3J5LCAKKwkJCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCksIAorCQkJCVhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MpOworCX0KKwkKKwlwdWJsaWMgT3JtTWFwcGVkU3VwZXJjbGFzcyBidWlsZENvbnRleHRNYXBwaW5nKAorCQkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCAKKwkJCVhtbFR5cGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCisJCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybU1hcHBlZFN1cGVyY2xhc3MocGFyZW50LCAoWG1sTWFwcGVkU3VwZXJjbGFzcykgcmVzb3VyY2VNYXBwaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZTk3MGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZ1Byb3ZpZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBPcm1NYXBwZWRTdXBlcmNsYXNzUHJvdmlkZXIgaW1wbGVtZW50cyBPcm1UeXBlTWFwcGluZ1Byb3ZpZGVyCi17CQotCXB1YmxpYyBPcm1NYXBwZWRTdXBlcmNsYXNzIGJ1aWxkVHlwZU1hcHBpbmcoSnBhRmFjdG9yeSBmYWN0b3J5LCBPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1NYXBwZWRTdXBlcmNsYXNzKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1OdWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWE2MTVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1OdWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE9ybU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZEF0dHJpYnV0ZU1hcHBpbmcoSnBhRmFjdG9yeSBmYWN0b3J5LCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybU51bGxBdHRyaWJ1dGVNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2VhN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7CisKK3B1YmxpYyBjbGFzcyBPcm1PbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbgorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IE9ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBPcm1PbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKKwkJCQlmYWN0b3J5LCAKKwkJCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnkoKSwgCisJCQkJWG1sT25lVG9NYW55LmNsYXNzKTsKKwl9CisJCisJcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKKwkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKKwkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtT25lVG9NYW55TWFwcGluZyhwYXJlbnQsIChYbWxPbmVUb01hbnkpIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFJlc291cmNlTWFwcGluZygKKwkJCU9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCAKKwkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkVmlydHVhbFhtbE9uZVRvTWFueShvcm1UeXBlTWFwcGluZywgKEphdmFPbmVUb01hbnlNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWM3ODA1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1PbmVUb01hbnlNYXBwaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1PbmVUb01hbnlNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtT25lVG9NYW55TWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgT3JtT25lVG9NYW55TWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgT3JtT25lVG9NYW55TWFwcGluZyBidWlsZEF0dHJpYnV0ZU1hcHBpbmcoSnBhRmFjdG9yeSBmYWN0b3J5LCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybU9uZVRvTWFueU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODdiMDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7CisKK3B1YmxpYyBjbGFzcyBPcm1PbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uCisJaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCQluZXcgT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCisJICovCisJcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAorCQkJCWZhY3RvcnksIAorCQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9uZVRvT25lKCksIAorCQkJCVhtbE9uZVRvT25lLmNsYXNzKTsKKwl9CisJCisJcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKKwkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKKwkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtT25lVG9PbmVNYXBwaW5nKHBhcmVudCwgKFhtbE9uZVRvT25lKSByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFZpcnR1YWxSZXNvdXJjZU1hcHBpbmcoCisJCQlPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgCisJCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZywgCisJCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5idWlsZFZpcnR1YWxYbWxPbmVUb09uZShvcm1UeXBlTWFwcGluZywgKEphdmFPbmVUb09uZU1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9PbmVNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb09uZU1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjYwMGZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb09uZU1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtT25lVG9PbmVNYXBwaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1PbmVUb09uZU1hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBPcm1PbmVUb09uZU1hcHBpbmdQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE9ybU9uZVRvT25lTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBPcm1PbmVUb09uZU1hcHBpbmcgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nKEpwYUZhY3RvcnkgZmFjdG9yeSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1PbmVUb09uZU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNzc2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5FbWZUb29sczsKKworcHVibGljIGNsYXNzIE9ybVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uCisJaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCQluZXcgT3JtVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIE9ybVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKKwkJCQlmYWN0b3J5LCAKKwkJCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUcmFuc2llbnQoKSwgCisJCQkJWG1sVHJhbnNpZW50LmNsYXNzKTsKKwl9CisJCisJcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKKwkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKKwkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtVHJhbnNpZW50TWFwcGluZyhwYXJlbnQsIChYbWxUcmFuc2llbnQpIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFJlc291cmNlTWFwcGluZygKKwkJCU9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCAKKwkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkVmlydHVhbFhtbFRyYW5zaWVudChvcm1UeXBlTWFwcGluZywgKEphdmFUcmFuc2llbnRNYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzE5N2IzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UcmFuc2llbnRNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmc7Ci0KLXB1YmxpYyBjbGFzcyBPcm1UcmFuc2llbnRNYXBwaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1UcmFuc2llbnRNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtVHJhbnNpZW50TWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgT3JtVHJhbnNpZW50TWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBPcm1UcmFuc2llbnRNYXBwaW5nIGJ1aWxkQXR0cmlidXRlTWFwcGluZyhKcGFGYWN0b3J5IGZhY3RvcnksIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtVHJhbnNpZW50TWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmM4NDFkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7CisKK3B1YmxpYyBjbGFzcyBPcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb24KKwlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJCW5ldyBPcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIE9ybVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAorCQkJCWZhY3RvcnksIAorCQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFZlcnNpb24oKSwgCisJCQkJWG1sVmVyc2lvbi5jbGFzcyk7CisJfQorCQorCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkQ29udGV4dE1hcHBpbmcoCisJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgCisJCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCisJCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybVZlcnNpb25NYXBwaW5nKHBhcmVudCwgKFhtbFZlcnNpb24pIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFJlc291cmNlTWFwcGluZygKKwkJCU9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCAKKwkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmJ1aWxkVmlydHVhbFhtbFZlcnNpb24ob3JtVHlwZU1hcHBpbmcsIChKYXZhVmVyc2lvbk1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVmVyc2lvbk1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVZlcnNpb25NYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhYzZlYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVmVyc2lvbk1hcHBpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci0KLXB1YmxpYyBjbGFzcyBPcm1WZXJzaW9uTWFwcGluZ1Byb3ZpZGVyIGltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtVmVyc2lvbk1hcHBpbmdQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBPcm1WZXJzaW9uTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgT3JtVmVyc2lvbk1hcHBpbmdQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgT3JtVmVyc2lvbk1hcHBpbmcgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nKEpwYUZhY3RvcnkgZmFjdG9yeSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1WZXJzaW9uTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1YbWxJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtWG1sSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTUzZjBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1YbWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIE9ybVhtbEltcGwgZXh0ZW5kcyBBYnN0cmFjdE9ybUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1YbWwKLXsKLQlwcm90ZWN0ZWQgT3JtUmVzb3VyY2Ugb3JtUmVzb3VyY2U7Ci0JCi0JcHJvdGVjdGVkIEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzOwotCQotCQotCXB1YmxpYyBPcm1YbWxJbXBsKE1hcHBpbmdGaWxlUmVmIHBhcmVudCwgT3JtUmVzb3VyY2Ugb3JtUmVzb3VyY2UpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5pbml0aWFsaXplKG9ybVJlc291cmNlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE1hcHBpbmdGaWxlUmVmIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChNYXBwaW5nRmlsZVJlZikgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIGlzbid0IGFjdHVhbGx5IGRpc3BsYXllZCwgc28gbmVlZHMgbm8gZGV0YWlscyBwYWdlCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJaWYgKGdldEVudGl0eU1hcHBpbmdzKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBvcm1SZXNvdXJjZS5nZXRGaWxlKCk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKiogcGVyc2lzdGVuY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eU1hcHBpbmdzOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbnRpdHlNYXBwaW5ncyhFbnRpdHlNYXBwaW5ncyBuZXdFbnRpdHlNYXBwaW5ncykgewotCQlFbnRpdHlNYXBwaW5ncyBvbGRFbnRpdHlNYXBwaW5ncyA9IHRoaXMuZW50aXR5TWFwcGluZ3M7Ci0JCXRoaXMuZW50aXR5TWFwcGluZ3MgPSBuZXdFbnRpdHlNYXBwaW5nczsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFTlRJVFlfTUFQUElOR1NfUFJPUEVSVFksIG9sZEVudGl0eU1hcHBpbmdzLCBuZXdFbnRpdHlNYXBwaW5ncyk7Ci0JfQotCi0JcHVibGljIEVudGl0eU1hcHBpbmdzIGFkZEVudGl0eU1hcHBpbmdzKCkgewotCQlpZiAodGhpcy5lbnRpdHlNYXBwaW5ncyAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJCi0JCVhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJdGhpcy5lbnRpdHlNYXBwaW5ncyA9IGJ1aWxkRW50aXR5TWFwcGluZ3MoeG1sRW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLm9ybVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHhtbEVudGl0eU1hcHBpbmdzKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFTlRJVFlfTUFQUElOR1NfUFJPUEVSVFksIG51bGwsIHRoaXMuZW50aXR5TWFwcGluZ3MpOwotCQlyZXR1cm4gdGhpcy5lbnRpdHlNYXBwaW5nczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRW50aXR5TWFwcGluZ3MoKSB7Ci0JCWlmICh0aGlzLmVudGl0eU1hcHBpbmdzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmVudGl0eU1hcHBpbmdzLmRpc3Bvc2UoKTsKLQkJRW50aXR5TWFwcGluZ3Mgb2xkRW50aXR5TWFwcGluZ3MgPSB0aGlzLmVudGl0eU1hcHBpbmdzOwotCQkKLQkJdGhpcy5lbnRpdHlNYXBwaW5ncyA9IG51bGw7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzID0gdGhpcy5vcm1SZXNvdXJjZS5nZXRFbnRpdHlNYXBwaW5ncygpOyAvL1RPRE8gaGVscGVyIHJlbW92ZUVudGl0eU1hcHBpbmdzIG1ldGhvZCBvbiBvcm1SZXNvdXJjZT8/Ci0JCXRoaXMub3JtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoeG1sRW50aXR5TWFwcGluZ3MpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVOVElUWV9NQVBQSU5HU19QUk9QRVJUWSwgb2xkRW50aXR5TWFwcGluZ3MsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB7Ci0JCWlmIChnZXRFbnRpdHlNYXBwaW5ncygpICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8vICoqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE9ybVJlc291cmNlIG9ybVJlc291cmNlKSB7Ci0JCXRoaXMub3JtUmVzb3VyY2UgPSBvcm1SZXNvdXJjZTsKLQkJaWYgKG9ybVJlc291cmNlLmdldEVudGl0eU1hcHBpbmdzKCkgIT0gbnVsbCkgewotCQkJdGhpcy5lbnRpdHlNYXBwaW5ncyA9IGJ1aWxkRW50aXR5TWFwcGluZ3Mob3JtUmVzb3VyY2UuZ2V0RW50aXR5TWFwcGluZ3MoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoT3JtUmVzb3VyY2Ugb3JtUmVzb3VyY2UpIHsKLQkJdGhpcy5vcm1SZXNvdXJjZSA9IG9ybVJlc291cmNlOwotCQlpZiAob3JtUmVzb3VyY2UuZ2V0RW50aXR5TWFwcGluZ3MoKSAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5lbnRpdHlNYXBwaW5ncyAhPSBudWxsKSB7Ci0JCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy51cGRhdGUob3JtUmVzb3VyY2UuZ2V0RW50aXR5TWFwcGluZ3MoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRFbnRpdHlNYXBwaW5ncyhidWlsZEVudGl0eU1hcHBpbmdzKG9ybVJlc291cmNlLmdldEVudGl0eU1hcHBpbmdzKCkpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChnZXRFbnRpdHlNYXBwaW5ncygpICE9IG51bGwpIHsKLQkJCQlnZXRFbnRpdHlNYXBwaW5ncygpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXNldEVudGl0eU1hcHBpbmdzKG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBFbnRpdHlNYXBwaW5ncyBidWlsZEVudGl0eU1hcHBpbmdzKFhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRFbnRpdHlNYXBwaW5ncyh0aGlzLCB4bWxFbnRpdHlNYXBwaW5ncyk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCWlmIChlbnRpdHlNYXBwaW5ncy5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KSkgewotCQkJcmV0dXJuIGVudGl0eU1hcHBpbmdzLmdldFN0cnVjdHVyZU5vZGUodGV4dE9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCS8vIG5ldmVyIGFjdHVhbGx5IHNlbGVjdGVkCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBUZXh0UmFuZ2UuRW1wdHkuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gVGV4dFJhbmdlLkVtcHR5Lmluc3RhbmNlKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCWlmIChnZXRFbnRpdHlNYXBwaW5ncygpICE9IG51bGwpIHsKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGdldEVudGl0eU1hcHBpbmdzKCkgIT0gbnVsbCkgewotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbENhc2NhZGVUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbENhc2NhZGVUeXBlLmphdmEKaW5kZXggYjVmNWMxMS4uOWMyOGE0YSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxDYXNjYWRlVHlwZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsQ2FzY2FkZVR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCwxMCArMTAsOSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKIAotcHVibGljIGNsYXNzIFZpcnR1YWxDYXNjYWRlVHlwZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIENhc2NhZGVUeXBlCitwdWJsaWMgY2xhc3MgVmlydHVhbENhc2NhZGVUeXBlIGV4dGVuZHMgQ2FzY2FkZVR5cGUKIHsKIAlDYXNjYWRlIGphdmFDYXNjYWRlOwogCkBAIC0yNSwxMCArMjQsNyBAQAogCQl0aGlzLm1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwogCX0KIAotCXB1YmxpYyB2b2lkIHVwZGF0ZShDYXNjYWRlIGphdmFDYXNjYWRlKSB7Ci0JCXRoaXMuamF2YUNhc2NhZGUgPSBqYXZhQ2FzY2FkZTsKLQl9Ci0KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVBbGwoKSB7CiAJCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKIAkJCXJldHVybiBmYWxzZTsKQEAgLTM2LDEwICszMiwxMiBAQAogCQlyZXR1cm4gdGhpcy5qYXZhQ2FzY2FkZS5pc0FsbCgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldENhc2NhZGVBbGwoYm9vbGVhbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZU1lcmdlKCkgewogCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7CiAJCQlyZXR1cm4gZmFsc2U7CkBAIC00NywxMCArNDUsMTIgQEAKIAkJcmV0dXJuIHRoaXMuamF2YUNhc2NhZGUuaXNNZXJnZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldENhc2NhZGVNZXJnZShib29sZWFuIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpIHsKIAkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewogCQkJcmV0dXJuIGZhbHNlOwpAQCAtNTgsMTAgKzU4LDEyIEBACiAJCXJldHVybiB0aGlzLmphdmFDYXNjYWRlLmlzUGVyc2lzdCgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldENhc2NhZGVQZXJzaXN0KGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVSZWZyZXNoKCkgewogCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7CiAJCQlyZXR1cm4gZmFsc2U7CkBAIC02OSwxMCArNzEsMTIgQEAKIAkJcmV0dXJuIHRoaXMuamF2YUNhc2NhZGUuaXNSZWZyZXNoKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0Q2FzY2FkZVJlZnJlc2goYm9vbGVhbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZVJlbW92ZSgpIHsKIAkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewogCQkJcmV0dXJuIGZhbHNlOwpAQCAtODAsNyArODQsOCBAQAogCQlyZXR1cm4gdGhpcy5qYXZhQ2FzY2FkZS5pc1JlbW92ZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldENhc2NhZGVSZW1vdmUoYm9vbGVhbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsTWFwS2V5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbE1hcEtleS5qYXZhCmluZGV4IGYzNTRhZjkuLjBhZTM4ZWQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsTWFwS2V5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxNYXBLZXkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCwxMCArMTAsOSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleTsKIAotcHVibGljIGNsYXNzIFZpcnR1YWxNYXBLZXkgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBNYXBLZXkKK3B1YmxpYyBjbGFzcyBWaXJ0dWFsTWFwS2V5IGV4dGVuZHMgTWFwS2V5CiB7CiAJSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBqYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwogCkBAIC0yNSwxOCArMjQsMTYgQEAKIAkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAJCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiB0aGlzLmphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0TWFwS2V5KCk7CisJCXJldHVybiB0aGlzLmphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgamF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZykgewotCQl0aGlzLmphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgPSBqYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGFmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKTIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CisKK3B1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sQXNzb2NpYXRpb25PdmVycmlkZSBleHRlbmRzIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3k7CisJCisKKwlwdWJsaWMgVmlydHVhbFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoU3RyaW5nIG5hbWUsIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5KSB7CisJCXN1cGVyKCk7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qb2luaW5nU3RyYXRlZ3kgPSBqb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7CisJCUVMaXN0PFhtbEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX0NPTFVNTlMpOworCQlpZiAodGhpcy5qb2luaW5nU3RyYXRlZ3kgaW5zdGFuY2VvZiBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KSB7CisJCQlmb3IgKEpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IAorCQkJCQlDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoKChKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KSB0aGlzLmpvaW5pbmdTdHJhdGVneSkuam9pbkNvbHVtbnMoKSkpIHsKKwkJCQlYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4gPSBuZXcgVmlydHVhbFhtbEpvaW5Db2x1bW4oam9pbkNvbHVtbiwgdGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSk7CisJCQkJam9pbkNvbHVtbnMuYWRkKHhtbEpvaW5Db2x1bW4pOworCQkJfQorCQl9CisJCXJldHVybiBqb2luQ29sdW1uczsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzFlMWMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKK3B1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCQorCQorCXB1YmxpYyBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyhPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisJfQorCQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXREZWZhdWx0TWFwcGluZ0tleSgpOworCQl9CisJCXJldHVybiB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldEtleSgpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwoCisJCQkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKaW5kZXggNzYxOGQ3MS4uODZlMzQ5MCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDM3ICs5LDM2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47CiAKLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGUgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxBdHRyaWJ1dGVPdmVycmlkZQorcHVibGljIGNsYXNzIFZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZSBleHRlbmRzIFhtbEF0dHJpYnV0ZU92ZXJyaWRlCiB7CiAKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFhtbENvbHVtbiBjb2x1bW47Ci0KLQlwcm90ZWN0ZWQgVmlydHVhbFhtbEF0dHJpYnV0ZU92ZXJyaWRlKFN0cmluZyBuYW1lLCBYbWxDb2x1bW4geG1sQ29sdW1uKSB7CisJcHVibGljIFZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZShTdHJpbmcgbmFtZSwgWG1sQ29sdW1uIHhtbENvbHVtbikgewogCQlzdXBlcigpOwogCQl0aGlzLm5hbWUgPSBuYW1lOwogCQl0aGlzLmNvbHVtbiA9IHhtbENvbHVtbjsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogCQlyZXR1cm4gdGhpcy5uYW1lOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpIHsKIAkJcmV0dXJuIHRoaXMuY29sdW1uOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzODNmMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uamF2YQpAQCAtMCwwICsxLDc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4KKwlleHRlbmRzIFZpcnR1YWxYbWxDb2x1bW4KK3sKKworCXB1YmxpYyBWaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4oQ29sdW1uIGNvbHVtbikgeworCQlzdXBlcihudWxsLCBjb2x1bW4pOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKSB7CisJCXJldHVybiB0aGlzLmNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBnZXRVcGRhdGFibGUoKSB7CisJCXJldHVybiB0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEJvb2xlYW4gZ2V0VW5pcXVlKCkgeworCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgeworCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEludGVnZXIgZ2V0U2NhbGUoKSB7CisJCXJldHVybiB0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJbnRlZ2VyIGdldFByZWNpc2lvbigpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxCYXNpYy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxCYXNpYy5qYXZhCmluZGV4IDlhYzBhZTMuLmQzZjA3NTkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sQmFzaWMuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEJhc2ljLmphdmEKQEAgLTksOSArOSwxMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGU7CkBAIC0yMyw5OSArMjUsMTQ5IEBACiAgKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAogICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgogICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbEJhc2ljIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sQmFzaWMKK3B1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sQmFzaWMgZXh0ZW5kcyBYbWxCYXNpYwogewotCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZzsKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFCYXNpY01hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcgdmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmc7CiAKIAlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbENvbHVtbiBjb2x1bW47Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlOwotCQkKLQlwdWJsaWMgVmlydHVhbFhtbEJhc2ljKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgeworCQorCXB1YmxpYyBWaXJ0dWFsWG1sQmFzaWMoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZykgewogCQlzdXBlcigpOwotCQl0aGlzLmphdmFCYXNpY01hcHBpbmcgPSBqYXZhQmFzaWNNYXBwaW5nOwotCQl0aGlzLm1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwotCQl0aGlzLmNvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sQ29sdW1uKG9ybVR5cGVNYXBwaW5nLCBqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLCBtZXRhZGF0YUNvbXBsZXRlKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUJhc2ljTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyA9IG5ldyBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyhvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljTWFwcGluZyk7CisJCXRoaXMuY29sdW1uID0gbmV3IFZpcnR1YWxYbWxDb2x1bW4ob3JtVHlwZU1hcHBpbmcsIGphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkpOwogCX0KLQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFCYXNpY01hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKTsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZVRleHRSYW5nZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBYbWxDb2x1bW4gZ2V0Q29sdW1uKCkgewogCQlyZXR1cm4gdGhpcy5jb2x1bW47CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUJhc2ljTWFwcGluZy5nZXREZWZhdWx0RmV0Y2goKSk7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwogCQl9Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQmFzaWNNYXBwaW5nLmdldEZldGNoKCkpOworCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0RmV0Y2goKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFCYXNpY01hcHBpbmcuZ2V0RGVmYXVsdE9wdGlvbmFsKCk7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0T3B0aW9uYWwoKSk7CiAJCX0KLQkJcmV0dXJuIHRoaXMuamF2YUJhc2ljTWFwcGluZy5nZXRPcHRpb25hbCgpOworCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuaXNPcHRpb25hbCgpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNMb2IoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQlyZXR1cm4gdGhpcy5qYXZhQmFzaWNNYXBwaW5nLmlzTG9iKCk7CisJCXJldHVybiB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBDb252ZXJ0ZXIuTE9CX0NPTlZFUlRFUjsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiBuZXdMb2IpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUJhc2ljTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIEVudW1UeXBlIGdldEVudW1lcmF0ZWQoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudW1UeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFCYXNpY01hcHBpbmcuZ2V0RGVmYXVsdEVudW1lcmF0ZWQoKSk7CisJCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKSB7CisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZSBqYXZhVGVtcG9yYWxUeXBlID0gKChUZW1wb3JhbENvbnZlcnRlcikgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCk7CisJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKGphdmFUZW1wb3JhbFR5cGUpOwogCQl9Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudW1UeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFCYXNpY01hcHBpbmcuZ2V0RW51bWVyYXRlZCgpKTsKKwkJcmV0dXJuIG51bGw7CiAJfQogCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVudW1UeXBlIGdldEVudW1lcmF0ZWQoKSB7CisJCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSAhPSBDb252ZXJ0ZXIuRU5VTUVSQVRFRF9DT05WRVJURVIpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW51bVR5cGUgamF2YUVudW1lcmF0ZWRUeXBlOworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJaWYgKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0RGVmYXVsdENvbnZlcnRlcigpLmdldFR5cGUoKSAhPSBDb252ZXJ0ZXIuRU5VTUVSQVRFRF9DT05WRVJURVIpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWphdmFFbnVtZXJhdGVkVHlwZSA9ICgoRW51bWVyYXRlZENvbnZlcnRlcikgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXREZWZhdWx0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCk7CisJCX0KKwkJZWxzZSB7CisJCQlqYXZhRW51bWVyYXRlZFR5cGUgPSAoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldEVudW1UeXBlKCk7CisJCX0KKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW51bVR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKGphdmFFbnVtZXJhdGVkVHlwZSk7CisJfQorCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0RW51bWVyYXRlZChFbnVtVHlwZSBuZXdFbnVtZXJhdGVkKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcpIHsKLQkJdGhpcy5qYXZhQmFzaWNNYXBwaW5nID0gamF2YUJhc2ljTWFwcGluZzsKLQkJdGhpcy5jb2x1bW4udXBkYXRlKGphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9iVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRUZW1wb3JhbFRleHRSYW5nZSgpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sQ29sdW1uLmphdmEKaW5kZXggN2M4ZGJjZS4uODY2NTk0NSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxDb2x1bW4uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbENvbHVtbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTExLDcgKzExLDYgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIApAQCAtMjUsMTQzICsyNCwxNjIgQEAKICAqIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIGl0IHdpbGwgZ2V0IHNwZWNpZmllZCBvciBkZWZhdWx0IGluZm9ybWF0aW9uIGZyb20gdGhlIGphdmEgY29sdW1uCiAgKgogICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbENvbHVtbiBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbENvbHVtbgorcHVibGljIGNsYXNzIFZpcnR1YWxYbWxDb2x1bW4gZXh0ZW5kcyBYbWxDb2x1bW4KIHsKIAkKIAlwcm90ZWN0ZWQgQ29sdW1uIGNvbHVtbjsKIAotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGU7Ci0KIAlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CiAJCiAJCi0JcHJvdGVjdGVkIFZpcnR1YWxYbWxDb2x1bW4oT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIENvbHVtbiBjb2x1bW4sIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgeworCXB1YmxpYyBWaXJ0dWFsWG1sQ29sdW1uKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBDb2x1bW4gY29sdW1uKSB7CiAJCXN1cGVyKCk7CiAJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKIAkJdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7CiAJfQogCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCk7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuY29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7CiAJCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldEluc2VydGFibGUoKTsKKwkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLmNvbHVtbi5pc0luc2VydGFibGUoKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0SW5zZXJ0YWJsZShCb29sZWFuIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpOworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLmNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwogCQl9Ci0JCXJldHVybiB0aGlzLmNvbHVtbi5nZXRMZW5ndGgoKTsKKwkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLmNvbHVtbi5nZXRMZW5ndGgoKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0TGVuZ3RoKEludGVnZXIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKIAkJCXJldHVybiB0aGlzLmNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwogCQl9CiAJCXJldHVybiB0aGlzLmNvbHVtbi5nZXROYW1lKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldERlZmF1bHROdWxsYWJsZSgpOworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLmNvbHVtbi5pc0RlZmF1bHROdWxsYWJsZSgpKTsKIAkJfQotCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0TnVsbGFibGUoKTsKKwkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLmNvbHVtbi5pc051bGxhYmxlKCkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE51bGxhYmxlKEJvb2xlYW4gdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSW50ZWdlciBnZXRQcmVjaXNpb24oKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiB0aGlzLmNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCk7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHRoaXMuY29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7CiAJCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFByZWNpc2lvbigpOworCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHRoaXMuY29sdW1uLmdldFByZWNpc2lvbigpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRQcmVjaXNpb24oSW50ZWdlciB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJbnRlZ2VyIGdldFNjYWxlKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCk7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHRoaXMuY29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKIAkJfQotCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0U2NhbGUoKTsKKwkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLmNvbHVtbi5nZXRTY2FsZSgpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRTY2FsZShJbnRlZ2VyIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJaWYgKCF0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKKwkJaWYgKCF0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CiAJCQlpZiAodGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSAhPSBudWxsKSB7CiAJCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCk7CiAJCQl9CQogCQl9Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmdldFRhYmxlTmFtZSgpOworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5nZXRQcmltYXJ5VGFibGVOYW1lKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0VGFibGUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEJvb2xlYW4gZ2V0VW5pcXVlKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0RGVmYXVsdFVuaXF1ZSgpOworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLmNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7CiAJCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFVuaXF1ZSgpOworCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuY29sdW1uLmlzVW5pcXVlKCkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldFVuaXF1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEJvb2xlYW4gZ2V0VXBkYXRhYmxlKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpOworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLmNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7CiAJCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFVwZGF0YWJsZSgpOworCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuY29sdW1uLmlzVXBkYXRhYmxlKCkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldFVwZGF0YWJsZShCb29sZWFuIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShDb2x1bW4gY29sdW1uKSB7Ci0JCXRoaXMuY29sdW1uID0gY29sdW1uOwotCX0KLQkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CiAJCXJldHVybiBudWxsOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEVtYmVkZGVkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEVtYmVkZGVkLmphdmEKaW5kZXggMmUxNDRiYS4uMjRkZmFlZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxFbWJlZGRlZC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sRW1iZWRkZWQuamF2YQpAQCAtMTUsNyArMTUsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKQEAgLTI3LDUxICsyNiw2MCBAQAogICogVmlydHVhbEVtYmVkZGVkIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEVtYmVkZGVkIHVzZWQgd2hlbiB0aGVyZSBpcyAKICAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhRW1iZWRkZWRNYXBwaW5nIGV4aXN0cy4KICAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxYbWxFbWJlZGRlZCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEVtYmVkZGVkCitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbEVtYmVkZGVkIGV4dGVuZHMgWG1sRW1iZWRkZWQKIHsKLQlKYXZhRW1iZWRkZWRNYXBwaW5nIGphdmFFbWJlZGRlZE1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlOwotCQogCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKIAkKLQlwdWJsaWMgVmlydHVhbFhtbEVtYmVkZGVkKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRW1iZWRkZWRNYXBwaW5nIGphdmFFbWJlZGRlZE1hcHBpbmcsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgeworCXByb3RlY3RlZCBmaW5hbCBKYXZhRW1iZWRkZWRNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyB2aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZzsKKworCXB1YmxpYyBWaXJ0dWFsWG1sRW1iZWRkZWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbWJlZGRlZE1hcHBpbmcgamF2YUVtYmVkZGVkTWFwcGluZykgewogCQlzdXBlcigpOwogCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7Ci0JCXRoaXMuamF2YUVtYmVkZGVkTWFwcGluZyA9IGphdmFFbWJlZGRlZE1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhRW1iZWRkZWRNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nID0gbmV3IFZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nKG9ybVR5cGVNYXBwaW5nLCBqYXZhRW1iZWRkZWRNYXBwaW5nKTsKIAl9Ci0JCQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFFbWJlZGRlZE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKTsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLnNldE5hbWUobmV3TmFtZSk7CiAJfQotCisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQogCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkgewogCQlFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPihYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVMpOwogCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzOwotCQlpZiAoIXRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHRoaXMuamF2YUVtYmVkZGVkTWFwcGluZy5hdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJaWYgKCF0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQl9CiAJCWVsc2UgewotCQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHRoaXMuamF2YUVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJfQogCQlmb3IgKEphdmFBdHRyaWJ1dGVPdmVycmlkZSBqYXZhQXR0cmlidXRlT3ZlcnJpZGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoamF2YUF0dHJpYnV0ZU92ZXJyaWRlcykpIHsKLQkJCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBuZXcgVmlydHVhbFhtbENvbHVtbih0aGlzLm9ybVR5cGVNYXBwaW5nLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCksIHRoaXMubWV0YWRhdGFDb21wbGV0ZSk7CisJCQlYbWxDb2x1bW4geG1sQ29sdW1uID0gbmV3IFZpcnR1YWxYbWxDb2x1bW4odGhpcy5vcm1UeXBlTWFwcGluZywgamF2YUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpKTsKIAkJCVhtbEF0dHJpYnV0ZU92ZXJyaWRlIHhtbEF0dHJpYnV0ZU92ZXJyaWRlID0gbmV3IFZpcnR1YWxYbWxBdHRyaWJ1dGVPdmVycmlkZShqYXZhQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpLCB4bWxDb2x1bW4pOwogCQkJYXR0cmlidXRlT3ZlcnJpZGVzLmFkZCh4bWxBdHRyaWJ1dGVPdmVycmlkZSk7CiAJCX0KIAkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlczsKIAl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YUVtYmVkZGVkTWFwcGluZyBqYXZhRW1iZWRkZWRNYXBwaW5nKSB7Ci0JCXRoaXMuamF2YUVtYmVkZGVkTWFwcGluZyA9IGphdmFFbWJlZGRlZE1hcHBpbmc7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEVtYmVkZGVkSWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sRW1iZWRkZWRJZC5qYXZhCmluZGV4IDhiMWE2ZjYuLjA1ODcyM2YgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sRW1iZWRkZWRJZC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sRW1iZWRkZWRJZC5qYXZhCkBAIC0xNSw3ICsxNSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47CkBAIC0yNyw1MSArMjYsNjAgQEAKICAqIFZpcnR1YWxFbWJlZGRlZElkIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEVtYmVkZGVkSWQgdXNlZCB3aGVuIHRoZXJlIGlzIAogICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFFbWJlZGRlZElkTWFwcGluZyBleGlzdHMuCiAgKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sRW1iZWRkZWRJZCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEVtYmVkZGVkSWQKK3B1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sRW1iZWRkZWRJZCBleHRlbmRzIFhtbEVtYmVkZGVkSWQKIHsKLQlKYXZhRW1iZWRkZWRJZE1hcHBpbmcgamF2YUVtYmVkZGVkSWRNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKLQkKIAlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CiAJCi0JcHVibGljIFZpcnR1YWxYbWxFbWJlZGRlZElkKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRW1iZWRkZWRJZE1hcHBpbmcgamF2YUVtYmVkZGVkSWRNYXBwaW5nLCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGUpIHsKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCQkKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcgdmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwdWJsaWMgVmlydHVhbFhtbEVtYmVkZGVkSWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbWJlZGRlZElkTWFwcGluZyBqYXZhRW1iZWRkZWRJZE1hcHBpbmcpIHsKIAkJc3VwZXIoKTsKIAkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOwotCQl0aGlzLmphdmFFbWJlZGRlZElkTWFwcGluZyA9IGphdmFFbWJlZGRlZElkTWFwcGluZzsKLQkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFFbWJlZGRlZElkTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyA9IG5ldyBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyhvcm1UeXBlTWFwcGluZywgamF2YUVtYmVkZGVkSWRNYXBwaW5nKTsKIAl9CiAJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUVtYmVkZGVkSWRNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCk7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5zZXROYW1lKG5ld05hbWUpOwogCX0KLQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKIAkJRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4oWG1sQXR0cmlidXRlT3ZlcnJpZGUuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gamF2YUF0dHJpYnV0ZU92ZXJyaWRlczsKLQkJaWYgKCF0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCWphdmFBdHRyaWJ1dGVPdmVycmlkZXMgPSB0aGlzLmphdmFFbWJlZGRlZElkTWFwcGluZy5hdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJaWYgKCF0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQl9CiAJCWVsc2UgewotCQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHRoaXMuamF2YUVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJCWphdmFBdHRyaWJ1dGVPdmVycmlkZXMgPSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQl9CiAJCWZvciAoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGphdmFBdHRyaWJ1dGVPdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShqYXZhQXR0cmlidXRlT3ZlcnJpZGVzKSkgewotCQkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sQ29sdW1uKHRoaXMub3JtVHlwZU1hcHBpbmcsIGphdmFBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKSwgdGhpcy5tZXRhZGF0YUNvbXBsZXRlKTsKKwkJCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBuZXcgVmlydHVhbFhtbENvbHVtbih0aGlzLm9ybVR5cGVNYXBwaW5nLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkpOwogCQkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgeG1sQXR0cmlidXRlT3ZlcnJpZGUgPSBuZXcgVmlydHVhbFhtbEF0dHJpYnV0ZU92ZXJyaWRlKGphdmFBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCksIHhtbENvbHVtbik7CiAJCQlhdHRyaWJ1dGVPdmVycmlkZXMuYWRkKHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKIAkJfQogCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGVzOwogCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhRW1iZWRkZWRJZE1hcHBpbmcgamF2YUVtYmVkZGVkSWRNYXBwaW5nKSB7Ci0JCXRoaXMuamF2YUVtYmVkZGVkSWRNYXBwaW5nID0gamF2YUVtYmVkZGVkSWRNYXBwaW5nOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxHZW5lcmF0ZWRWYWx1ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxHZW5lcmF0ZWRWYWx1ZS5qYXZhCmluZGV4IGJhODE0ZDQuLjgyODk5OWMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sR2VuZXJhdGVkVmFsdWUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEdlbmVyYXRlZFZhbHVlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNTIgKzEwLDUxIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sR2VuZXJhdGVkVmFsdWUgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxHZW5lcmF0ZWRWYWx1ZQorcHVibGljIGNsYXNzIFZpcnR1YWxYbWxHZW5lcmF0ZWRWYWx1ZSBleHRlbmRzIFhtbEdlbmVyYXRlZFZhbHVlCiB7Ci0JSmF2YUdlbmVyYXRlZFZhbHVlIGphdmFHZW5lcmF0ZWRWYWx1ZTsKKwlKYXZhSWRNYXBwaW5nIGphdmFJZE1hcHBpbmc7CiAKIAlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlOwogCQogCQkKLQlwdWJsaWMgVmlydHVhbFhtbEdlbmVyYXRlZFZhbHVlKEphdmFHZW5lcmF0ZWRWYWx1ZSBqYXZhR2VuZXJhdGVkVmFsdWUsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgeworCXB1YmxpYyBWaXJ0dWFsWG1sR2VuZXJhdGVkVmFsdWUoSmF2YUlkTWFwcGluZyBqYXZhSWRNYXBwaW5nLCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGUpIHsKIAkJc3VwZXIoKTsKLQkJdGhpcy5qYXZhR2VuZXJhdGVkVmFsdWUgPSBqYXZhR2VuZXJhdGVkVmFsdWU7CisJCXRoaXMuamF2YUlkTWFwcGluZyA9IGphdmFJZE1hcHBpbmc7CiAJCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7CiAJfQogCisJcHJvdGVjdGVkIEphdmFHZW5lcmF0ZWRWYWx1ZSBnZXRKYXZhR2VuZXJhdGVkVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmphdmFJZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKTsKKwl9CiAKKworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0R2VuZXJhdG9yKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5qYXZhR2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCk7CisJCXJldHVybiB0aGlzLm1ldGFkYXRhQ29tcGxldGUgPyBudWxsIDogdGhpcy5nZXRKYXZhR2VuZXJhdGVkVmFsdWUoKS5nZXRHZW5lcmF0b3IoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0U3RyYXRlZ3koKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRpb25UeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFHZW5lcmF0ZWRWYWx1ZS5nZXRTdHJhdGVneSgpKTsKKwkJcmV0dXJuIHRoaXMubWV0YWRhdGFDb21wbGV0ZSA/IG51bGwgOiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRpb25UeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmdldEphdmFHZW5lcmF0ZWRWYWx1ZSgpLmdldFN0cmF0ZWd5KCkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRvcihTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YUdlbmVyYXRlZFZhbHVlIGphdmFHZW5lcmF0ZWRWYWx1ZSkgewotCQl0aGlzLmphdmFHZW5lcmF0ZWRWYWx1ZSA9IGphdmFHZW5lcmF0ZWRWYWx1ZTsKLQl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbElkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbElkLmphdmEKaW5kZXggMzA4Y2U4Yi4uOWU1MGUwYyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxJZC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sSWQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDkgKzksMTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlOwpAQCAtMjQsMTEgKzI2LDEzIEBACiAgKiBWaXJ0dWFsSWQgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgSWQgdXNlZCB3aGVuIHRoZXJlIGlzIAogICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFJZE1hcHBpbmcgZXhpc3RzLgogICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbElkIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sSWQKK3B1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sSWQgZXh0ZW5kcyBYbWxJZAogewotCUphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZzsKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFJZE1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CiAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlOworCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyB2aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZzsKIAogCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQ29sdW1uIGNvbHVtbjsKIApAQCAtMzgsOTggKzQyLDE1MiBAQAogCQogCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IgdmlydHVhbFNlcXVlbmNlR2VuZXJhdG9yOwogCQotCiAJCQotCXB1YmxpYyBWaXJ0dWFsWG1sSWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZywgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7CisJcHVibGljIFZpcnR1YWxYbWxJZChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUlkTWFwcGluZyBqYXZhSWRNYXBwaW5nKSB7CiAJCXN1cGVyKCk7Ci0JCXRoaXMuamF2YUlkTWFwcGluZyA9IGphdmFJZE1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JCXRoaXMuY29sdW1uID0gbmV3IFZpcnR1YWxYbWxDb2x1bW4ob3JtVHlwZU1hcHBpbmcsIGphdmFJZE1hcHBpbmcuZ2V0Q29sdW1uKCksIG1ldGFkYXRhQ29tcGxldGUpOwotCQl0aGlzLnZpcnR1YWxHZW5lcmF0ZWRWYWx1ZSA9IG5ldyBWaXJ0dWFsWG1sR2VuZXJhdGVkVmFsdWUoamF2YUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLCBtZXRhZGF0YUNvbXBsZXRlKTsKLQkJdGhpcy52aXJ0dWFsVGFibGVHZW5lcmF0b3IgPSBuZXcgVmlydHVhbFhtbFRhYmxlR2VuZXJhdG9yKGphdmFJZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSwgbWV0YWRhdGFDb21wbGV0ZSk7Ci0JCXRoaXMudmlydHVhbFNlcXVlbmNlR2VuZXJhdG9yID0gbmV3IFZpcnR1YWxYbWxTZXF1ZW5jZUdlbmVyYXRvcihqYXZhSWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCksIG1ldGFkYXRhQ29tcGxldGUpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhSWRNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nID0gbmV3IFZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nKG9ybVR5cGVNYXBwaW5nLCBqYXZhSWRNYXBwaW5nKTsKKwkJdGhpcy5jb2x1bW4gPSBuZXcgVmlydHVhbFhtbENvbHVtbihvcm1UeXBlTWFwcGluZywgamF2YUlkTWFwcGluZy5nZXRDb2x1bW4oKSk7CisJCXRoaXMudmlydHVhbEdlbmVyYXRlZFZhbHVlID0gbmV3IFZpcnR1YWxYbWxHZW5lcmF0ZWRWYWx1ZShqYXZhSWRNYXBwaW5nLCB0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKTsKKwkJdGhpcy52aXJ0dWFsVGFibGVHZW5lcmF0b3IgPSBuZXcgVmlydHVhbFhtbFRhYmxlR2VuZXJhdG9yKGphdmFJZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCksIHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpOworCQl0aGlzLnZpcnR1YWxTZXF1ZW5jZUdlbmVyYXRvciA9IG5ldyBWaXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IoamF2YUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKSwgdGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSk7CiAJfQotCisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUlkTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpOworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXROYW1lKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXROYW1lVGV4dFJhbmdlKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKSB7CiAJCXJldHVybiB0aGlzLmNvbHVtbjsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oWG1sQ29sdW1uIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgeworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFJZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKSB7CisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZSBqYXZhVGVtcG9yYWxUeXBlID0gKChUZW1wb3JhbENvbnZlcnRlcikgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCk7CisJCQlyZXR1cm4gIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChqYXZhVGVtcG9yYWxUeXBlKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAogCisJQE92ZXJyaWRlCiAJcHVibGljIFhtbEdlbmVyYXRlZFZhbHVlIGdldEdlbmVyYXRlZFZhbHVlKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlpZiAodGhpcy5qYXZhSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkgIT0gbnVsbCkgeworCQlpZiAodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpICE9IG51bGwpIHsKIAkJCXJldHVybiB0aGlzLnZpcnR1YWxHZW5lcmF0ZWRWYWx1ZTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0R2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwkJCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBYbWxTZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgeworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJaWYgKHRoaXMuamF2YUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKKwkJaWYgKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7CiAJCQlyZXR1cm4gdGhpcy52aXJ0dWFsU2VxdWVuY2VHZW5lcmF0b3I7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwkJCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBYbWxUYWJsZUdlbmVyYXRvciBnZXRUYWJsZUdlbmVyYXRvcigpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgeworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJaWYgKHRoaXMuamF2YUlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKKwkJaWYgKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7CiAJCQlyZXR1cm4gdGhpcy52aXJ0dWFsVGFibGVHZW5lcmF0b3I7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0VGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwkJCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcpIHsKLQkJdGhpcy5qYXZhSWRNYXBwaW5nID0gamF2YUlkTWFwcGluZzsKLQkJdGhpcy5jb2x1bW4udXBkYXRlKGphdmFJZE1hcHBpbmcuZ2V0Q29sdW1uKCkpOwotCQl0aGlzLnZpcnR1YWxHZW5lcmF0ZWRWYWx1ZS51cGRhdGUoamF2YUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJdGhpcy52aXJ0dWFsVGFibGVHZW5lcmF0b3IudXBkYXRlKGphdmFJZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCXRoaXMudmlydHVhbFNlcXVlbmNlR2VuZXJhdG9yLnVwZGF0ZShqYXZhSWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOworCS8vc2VlIGVjbGlwc2VsaW5rIGJ1ZyAyNDcwNzggZm9yIGluZm8gb25lIHdoeSBJIG1hZGUgdGhlIGludGVyZmFjZSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJlbnVtZXJhdGVkIG5vdCBzdXBwb3J0ZWQgb24gaWQgbWFwcGluZ3MiKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0RW51bWVyYXRlZChFbnVtVHlwZSB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJLy9zZWUgZWNsaXBzZWxpbmsgYnVnIDI0NzA3OCBmb3IgaW5mbyBvbmUgd2h5IEkgbWFkZSB0aGUgaW50ZXJmYWNlIFhtbENvbnZlcnRpYmxlTWFwcGluZworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzTG9iKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImxvYiBub3Qgc3VwcG9ydGVkIG9uIGlkIG1hcHBpbmdzIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TG9iKGJvb2xlYW4gdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9iVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRUZW1wb3JhbFRleHRSYW5nZSgpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sSm9pbkNvbHVtbi5qYXZhCmluZGV4IDYwNTA1YjAuLjBlODYyYzcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sSm9pbkNvbHVtbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sSm9pbkNvbHVtbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMjMgKzksMjMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbEpvaW5Db2x1bW4gZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxKb2luQ29sdW1uCitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbEpvaW5Db2x1bW4gZXh0ZW5kcyBYbWxKb2luQ29sdW1uCiB7CQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbjsKKwlwcm90ZWN0ZWQgSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbjsKIAogCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGU7CiAKLQlwcm90ZWN0ZWQgVmlydHVhbFhtbEpvaW5Db2x1bW4oSmF2YUpvaW5Db2x1bW4gamF2YUpvaW5Db2x1bW4sIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgeworCXB1YmxpYyBWaXJ0dWFsWG1sSm9pbkNvbHVtbihKb2luQ29sdW1uIGphdmFKb2luQ29sdW1uLCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGUpIHsKIAkJc3VwZXIoKTsKIAkJdGhpcy5qYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luQ29sdW1uOwogCQl0aGlzLm1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKSB7CiAJCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKIAkJCXJldHVybiBudWxsOwpAQCAtMzMsMjEgKzMzLDI1IEBACiAJCXJldHVybiB0aGlzLmphdmFKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBCb29sZWFuIGdldEluc2VydGFibGUoKSB7CiAJCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFKb2luQ29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCk7CisJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuamF2YUpvaW5Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKIAkJfQotCQlyZXR1cm4gdGhpcy5qYXZhSm9pbkNvbHVtbi5nZXRJbnNlcnRhYmxlKCk7CisJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5qYXZhSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0SW5zZXJ0YWJsZShCb29sZWFuIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7CiAJCQlyZXR1cm4gdGhpcy5qYXZhSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwpAQCAtNTUsMTAgKzU5LDEyIEBACiAJCXJldHVybiB0aGlzLmphdmFKb2luQ29sdW1uLmdldE5hbWUoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7CiAJCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKIAkJCXJldHVybiB0aGlzLmphdmFKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwpAQCAtNjYsMjEgKzcyLDI1IEBACiAJCXJldHVybiB0aGlzLmphdmFKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBCb29sZWFuIGdldE51bGxhYmxlKCkgewogCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhSm9pbkNvbHVtbi5nZXREZWZhdWx0TnVsbGFibGUoKTsKKwkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5qYXZhSm9pbkNvbHVtbi5pc0RlZmF1bHROdWxsYWJsZSgpKTsKIAkJfQotCQlyZXR1cm4gdGhpcy5qYXZhSm9pbkNvbHVtbi5nZXROdWxsYWJsZSgpOworCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuamF2YUpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXROdWxsYWJsZShCb29sZWFuIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKIAkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewogCQkJcmV0dXJuIHRoaXMuamF2YUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCk7CkBAIC04OCw0NCArOTgsNDggQEAKIAkJcmV0dXJuIHRoaXMuamF2YUpvaW5Db2x1bW4uZ2V0VGFibGUoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRUYWJsZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKSB7CiAJCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFKb2luQ29sdW1uLmdldERlZmF1bHRVbmlxdWUoKTsKKwkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5qYXZhSm9pbkNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7CiAJCX0KLQkJcmV0dXJuIHRoaXMuamF2YUpvaW5Db2x1bW4uZ2V0VW5pcXVlKCk7CisJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5qYXZhSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBCb29sZWFuIGdldFVwZGF0YWJsZSgpIHsKIAkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuamF2YUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpOworCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLmphdmFKb2luQ29sdW1uLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKIAkJfQotCQlyZXR1cm4gdGhpcy5qYXZhSm9pbkNvbHVtbi5nZXRVcGRhdGFibGUoKTsKKwkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLmphdmFKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldFVwZGF0YWJsZShCb29sZWFuIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFKb2luQ29sdW1uIGphdmFKb2luQ29sdW1uKSB7Ci0JCXRoaXMuamF2YUpvaW5Db2x1bW4gPSBqYXZhSm9pbkNvbHVtbjsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZSgpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKSB7CiAJCXJldHVybiBudWxsOwogCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sSm9pblRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbEpvaW5UYWJsZS5qYXZhCmluZGV4IDkyNzVkMGEuLjQwYjExNmEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sSm9pblRhYmxlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxKb2luVGFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMSwxMyArMTEsMTAgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKQEAgLTI1LDExMSArMjIsMTE2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwogCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbEpvaW5UYWJsZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEpvaW5UYWJsZQorcHVibGljIGNsYXNzIFZpcnR1YWxYbWxKb2luVGFibGUgCisJZXh0ZW5kcyBYbWxKb2luVGFibGUKIHsKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CiAJCi0JcHJvdGVjdGVkIEphdmFKb2luVGFibGUgamF2YUpvaW5UYWJsZTsKLQotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGU7Ci0KLQlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlOworCXByb3RlY3RlZCBKb2luVGFibGUgam9pblRhYmxlOwkKIAkKLQotCXByb3RlY3RlZCBWaXJ0dWFsWG1sSm9pblRhYmxlKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YUpvaW5UYWJsZSBqYXZhSm9pblRhYmxlLCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGUpIHsKKwkKKwlwdWJsaWMgVmlydHVhbFhtbEpvaW5UYWJsZShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSm9pblRhYmxlIGpvaW5UYWJsZSkgewogCQlzdXBlcigpOwotCQl0aGlzLm9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotCQl0aGlzLmphdmFKb2luVGFibGUgPSBqYXZhSm9pblRhYmxlOwotCQl0aGlzLm1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwotCX0KLQotCXByb3RlY3RlZCBPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIG9ybVJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCXJldHVybiAoT3JtUmVsYXRpb25zaGlwTWFwcGluZykgdGhpcy5vcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmpvaW5UYWJsZSA9IGpvaW5UYWJsZTsKIAl9CiAJCisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoIXRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJaWYgKHRoaXMuamF2YUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGlzLmphdmFKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQkJfQkKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiB0aGlzLmpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpOwogCQl9Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luVGFibGVEZWZhdWx0TmFtZShvcm1SZWxhdGlvbnNoaXBNYXBwaW5nKCkpOworCQlyZXR1cm4gdGhpcy5qb2luVGFibGUuZ2V0TmFtZSgpOwkJCiAJfQotCisJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9Ci0KKwkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFKb2luVGFibGUuZ2V0RGVmYXVsdENhdGFsb2coKTsKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiB0aGlzLmpvaW5UYWJsZS5nZXREZWZhdWx0Q2F0YWxvZygpOwogCQl9Ci0JCXJldHVybiB0aGlzLmphdmFKb2luVGFibGUuZ2V0Q2F0YWxvZygpOworCQlyZXR1cm4gdGhpcy5qb2luVGFibGUuZ2V0Q2F0YWxvZygpOwogCX0KLQorCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQotCisJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFKb2luVGFibGUuZ2V0RGVmYXVsdFNjaGVtYSgpOworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIHRoaXMuam9pblRhYmxlLmdldERlZmF1bHRTY2hlbWEoKTsKIAkJfQotCQlyZXR1cm4gdGhpcy5qYXZhSm9pblRhYmxlLmdldFNjaGVtYSgpOworCQlyZXR1cm4gdGhpcy5qb2luVGFibGUuZ2V0U2NoZW1hKCk7CiAJfQotCisJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0U2NoZW1hKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKIAkvL1ZpcnR1YWxYbWxKb2luVGFibGUgaXMgcmVidWlsdCBldmVyeSB0aW1lLCBzbyBqdXN0IHJlYnVpbGRpbmcgdGhlIGpvaW5Db2x1bW5zIGxpc3QgYXMgd2VsbAorCUBPdmVycmlkZQogCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKIAkJRUxpc3Q8WG1sSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSm9pbkNvbHVtbj4oWG1sSm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TKTsKLQkJZm9yIChKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuamF2YUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpKSkgewotCQkJWG1sSm9pbkNvbHVtbiB4bWxKb2luQ29sdW1uID0gbmV3IFZpcnR1YWxYbWxKb2luQ29sdW1uKGpvaW5Db2x1bW4sIHRoaXMubWV0YWRhdGFDb21wbGV0ZSk7CisJCWlmICh0aGlzLmpvaW5UYWJsZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gam9pbkNvbHVtbnM7CisJCX0KKwkJZm9yIChKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5qb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkpIHsKKwkJCVhtbEpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sSm9pbkNvbHVtbihqb2luQ29sdW1uLCBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCQlqb2luQ29sdW1ucy5hZGQoeG1sSm9pbkNvbHVtbik7CiAJCX0KIAkJcmV0dXJuIGpvaW5Db2x1bW5zOwogCX0KIAkKIAkvL1ZpcnR1YWxYbWxKb2luVGFibGUgaXMgcmVidWlsdCBldmVyeSB0aW1lLCBzbyBqdXN0IHJlYnVpbGRpbmcgdGhlIGpvaW5Db2x1bW5zIGxpc3QgYXMgd2VsbAorCUBPdmVycmlkZQogCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7CiAJCUVMaXN0PFhtbEpvaW5Db2x1bW4+IGludmVyc2VKb2luQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxKb2luQ29sdW1uPihYbWxKb2luQ29sdW1uLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19JTlZFUlNFX0pPSU5fQ09MVU1OUyk7Ci0JCWZvciAoSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmphdmFKb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkpKSB7Ci0JCQlYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4gPSBuZXcgVmlydHVhbFhtbEpvaW5Db2x1bW4oam9pbkNvbHVtbiwgdGhpcy5tZXRhZGF0YUNvbXBsZXRlKTsKKwkJaWYgKHRoaXMuam9pblRhYmxlID09IG51bGwpIHsKKwkJCXJldHVybiBpbnZlcnNlSm9pbkNvbHVtbnM7CisJCX0KKwkJZm9yIChKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5qb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkpKSB7CisJCQlYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4gPSBuZXcgVmlydHVhbFhtbEpvaW5Db2x1bW4oam9pbkNvbHVtbiwgaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpOwogCQkJaW52ZXJzZUpvaW5Db2x1bW5zLmFkZCh4bWxKb2luQ29sdW1uKTsKIAkJfQogCiAJCXJldHVybiBpbnZlcnNlSm9pbkNvbHVtbnM7CiAJfQotCisJCisJQE92ZXJyaWRlCiAJcHVibGljIEVMaXN0PFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCkgewogCQlFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PiB4bWxVbmlxdWVDb25zdHJhaW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PihYbWxVbmlxdWVDb25zdHJhaW50LmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMpOwotCi0JCWZvciAoSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmphdmFKb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKSkpIHsKLQkJCVhtbFVuaXF1ZUNvbnN0cmFpbnQgeG1sVW5pcXVlQ29uc3RyYWludCA9IG5ldyBWaXJ0dWFsWG1sVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50LCB0aGlzLm1ldGFkYXRhQ29tcGxldGUpOworCQlmb3IgKFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmpvaW5UYWJsZS51bmlxdWVDb25zdHJhaW50cygpKSkgeworCQkJWG1sVW5pcXVlQ29uc3RyYWludCB4bWxVbmlxdWVDb25zdHJhaW50ID0gbmV3IFZpcnR1YWxYbWxVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQsIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJCXhtbFVuaXF1ZUNvbnN0cmFpbnRzLmFkZCh4bWxVbmlxdWVDb25zdHJhaW50KTsKIAkJfQotCisJCQogCQlyZXR1cm4geG1sVW5pcXVlQ29uc3RyYWludHM7CiAJfQogCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhSm9pblRhYmxlIGphdmFKb2luVGFibGUpIHsKLQkJdGhpcy5qYXZhSm9pblRhYmxlID0gamF2YUpvaW5UYWJsZTsKLQl9Ci0JCisJQE92ZXJyaWRlCiAJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoKSB7CiAJCXJldHVybiBudWxsOwogCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhSm9pblRhYmxlLmlzU3BlY2lmaWVkKCk7Ci0JfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxNYW55VG9NYW55LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE1hbnlUb01hbnkuamF2YQppbmRleCAzOTgzZTI5Li4yYjc3OTFmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE1hbnlUb01hbnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE1hbnlUb01hbnkuamF2YQpAQCAtMTEsOCArMTEsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXk7CkBAIC0yNSwxNjUgKzI0LDE1NSBAQAogICogVmlydHVhbE1hbnlUb01hbnkgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgTWFueVRvTWFueSB1c2VkIHdoZW4gdGhlcmUgaXMgCiAgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nIGV4aXN0cy4KICAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxYbWxNYW55VG9NYW55IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sTWFueVRvTWFueQorcHVibGljIGNsYXNzIFZpcnR1YWxYbWxNYW55VG9NYW55IAorCWV4dGVuZHMgWG1sTWFueVRvTWFueQogewotCUphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmc7CisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CiAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlOwotCQotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sSm9pblRhYmxlIHZpcnR1YWxKb2luVGFibGU7Ci0JCisJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nIHZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nOworCiAJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxDYXNjYWRlVHlwZSB2aXJ0dWFsQ2FzY2FkZVR5cGU7CiAJCiAJcHJvdGVjdGVkIGZpbmFsIE1hcEtleSBtYXBLZXk7CiAJCi0JLy9UT0RPIGpvaW5Db2x1bW5zIG5vdCB5ZXQgc3VwcG9ydGVkIGluIHRoZSBjb250ZXh0IG1vZGVsCi0vLwlwcm90ZWN0ZWQgRUxpc3Q8Sm9pbkNvbHVtbj4gdmlydHVhbEpvaW5Db2x1bW5zOwotCi0JcHVibGljIFZpcnR1YWxYbWxNYW55VG9NYW55KE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZywgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7CisJCisJcHVibGljIFZpcnR1YWxYbWxNYW55VG9NYW55KAorCQkJT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmcpIHsKIAkJc3VwZXIoKTsKLQkJdGhpcy5qYXZhTWFueVRvTWFueU1hcHBpbmcgPSBqYXZhTWFueVRvTWFueU1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0vLwkJdGhpcy5pbml0aWFsaXplSm9pbkNvbHVtbnMoamF2YU9uZVRvTWFueU1hcHBpbmcpOwotCQl0aGlzLnZpcnR1YWxDYXNjYWRlVHlwZSA9IG5ldyBWaXJ0dWFsQ2FzY2FkZVR5cGUoamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKSwgdGhpcy5tZXRhZGF0YUNvbXBsZXRlKTsKLQkJdGhpcy52aXJ0dWFsSm9pblRhYmxlID0gbmV3IFZpcnR1YWxYbWxKb2luVGFibGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLCBtZXRhZGF0YUNvbXBsZXRlKTsKLQkJdGhpcy5tYXBLZXkgPSBuZXcgVmlydHVhbE1hcEtleShqYXZhTWFueVRvTWFueU1hcHBpbmcsIG1ldGFkYXRhQ29tcGxldGUpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhTWFueVRvTWFueU1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcgPSBuZXcgVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcob3JtVHlwZU1hcHBpbmcsIGphdmFNYW55VG9NYW55TWFwcGluZyk7CisJCXRoaXMudmlydHVhbENhc2NhZGVUeXBlID0gCisJCQluZXcgVmlydHVhbENhc2NhZGVUeXBlKGphdmFNYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCksIHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpOworCQl0aGlzLm1hcEtleSA9IG5ldyBWaXJ0dWFsTWFwS2V5KGphdmFNYW55VG9NYW55TWFwcGluZywgdGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSk7CiAJfQogCQotLy8JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUpvaW5Db2x1bW5zKElKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZykgewotLy8JCXRoaXMudmlydHVhbEpvaW5Db2x1bW5zID0gbmV3IEJhc2ljRUxpc3Q8Sm9pbkNvbHVtbj4oKTsKLS8vCQlMaXN0SXRlcmF0b3I8SUphdmFKb2luQ29sdW1uPiBqYXZhSm9pbkNvbHVtbnM7Ci0vLwkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotLy8JCQlqYXZhSm9pbkNvbHVtbnMgPSB0aGlzLmphdmFPbmVUb01hbnlNYXBwaW5nLmRlZmF1bHRKb2luQ29sdW1ucygpOwotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJamF2YUpvaW5Db2x1bW5zID0gdGhpcy5qYXZhT25lVG9NYW55TWFwcGluZy5qb2luQ29sdW1ucygpOwkJCQotLy8JCX0KLS8vCQkKLS8vCQl3aGlsZSAoamF2YUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotLy8JCQl0aGlzLnZpcnR1YWxKb2luQ29sdW1ucy5hZGQobmV3IFZpcnR1YWxKb2luQ29sdW1uKGphdmFKb2luQ29sdW1ucy5uZXh0KCksIHRoaXMubWV0YWRhdGFDb21wbGV0ZSkpOwotLy8JCX0KLS8vCX0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KIAkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKTsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLnNldE5hbWUobmV3TmFtZSk7CiAJfQogCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXREZWZhdWx0RmV0Y2goKSk7CiAJCX0KLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFNYW55VG9NYW55TWFwcGluZy5nZXRGZXRjaCgpKTsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldEZldGNoKCkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAogCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7CiAJCXJldHVybiB0aGlzLnZpcnR1YWxDYXNjYWRlVHlwZTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbEpvaW5UYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFNYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCk7CisJCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpICE9IG51bGwpIHsKKwkJCXJldHVybiAJbmV3IFZpcnR1YWxYbWxKb2luVGFibGUoCisJCQkJdGhpcy5vcm1UeXBlTWFwcGluZywgCisJCQkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS4KKwkJCQkJZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkpOwogCQl9Ci0JCXJldHVybiB0aGlzLmphdmFNYW55VG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKTsKKwkJcmV0dXJuIG51bGw7CiAJfQogCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKSB7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCk7CisJCX0KKwkJcmV0dXJuIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgeworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJcmV0dXJuIHRoaXMuamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCk7CisJCXJldHVybiB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCiAJCisJQE92ZXJyaWRlCiAJcHVibGljIE1hcEtleSBnZXRNYXBLZXkoKSB7CiAJCXJldHVybiB0aGlzLm1hcEtleTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0TWFwS2V5KE1hcEtleSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldE9yZGVyQnkoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiB0aGlzLmphdmFNYW55VG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCk7CisJCXJldHVybiB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZE9yZGVyQnkoKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0T3JkZXJCeShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmcpIHsKLQkJdGhpcy5qYXZhTWFueVRvTWFueU1hcHBpbmcgPSBqYXZhTWFueVRvTWFueU1hcHBpbmc7Ci0JCXRoaXMudmlydHVhbENhc2NhZGVUeXBlLnVwZGF0ZShqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpKTsKLQkJdGhpcy52aXJ0dWFsSm9pblRhYmxlLnVwZGF0ZShqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotLy8JCXRoaXMudXBkYXRlSm9pbkNvbHVtbnMoamF2YU9uZVRvTWFueU1hcHBpbmcpOwotCX0KLQkKLS8vCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUpvaW5Db2x1bW5zKElKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZykgewotLy8JCUxpc3RJdGVyYXRvcjxJSmF2YUpvaW5Db2x1bW4+IGphdmFKb2luQ29sdW1uczsKLS8vCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gdmlydHVhbEpvaW5Db2x1bW5zID0gdGhpcy52aXJ0dWFsSm9pbkNvbHVtbnMubGlzdEl0ZXJhdG9yKCk7Ci0vLwkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotLy8JCQlqYXZhSm9pbkNvbHVtbnMgPSB0aGlzLmphdmFPbmVUb01hbnlNYXBwaW5nLmRlZmF1bHRKb2luQ29sdW1ucygpOwotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJamF2YUpvaW5Db2x1bW5zID0gdGhpcy5qYXZhT25lVG9NYW55TWFwcGluZy5qb2luQ29sdW1ucygpOwkJCQotLy8JCX0KLS8vCQkKLS8vCQl3aGlsZSAoamF2YUpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotLy8JCQlJSmF2YUpvaW5Db2x1bW4gamF2YUpvaW5Db2x1bW4gPSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpOwotLy8JCQlpZiAodmlydHVhbEpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotLy8JCQkJVmlydHVhbEpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSAoVmlydHVhbEpvaW5Db2x1bW4pIHZpcnR1YWxKb2luQ29sdW1ucy5uZXh0KCk7Ci0vLwkJCQl2aXJ0dWFsSm9pbkNvbHVtbi51cGRhdGUoamF2YUpvaW5Db2x1bW4pOwotLy8JCQl9Ci0vLwkJCWVsc2UgewotLy8JCQkJdGhpcy52aXJ0dWFsSm9pbkNvbHVtbnMuYWRkKG5ldyBWaXJ0dWFsSm9pbkNvbHVtbihqYXZhSm9pbkNvbHVtbiwgdGhpcy5tZXRhZGF0YUNvbXBsZXRlKSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJCi0vLwkJd2hpbGUodmlydHVhbEpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotLy8JCQl0aGlzLnZpcnR1YWxKb2luQ29sdW1ucy5yZW1vdmUodmlydHVhbEpvaW5Db2x1bW5zLm5leHQoKSk7Ci0vLwkJfQotLy8JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgeworCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE1hbnlUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxNYW55VG9PbmUuamF2YQppbmRleCAzNDllYzc2Li4zYjcwZDU5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE1hbnlUb09uZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sTWFueVRvT25lLmphdmEKQEAgLTEzLDcgKzEzLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CkBAIC0yNyw5NyArMjcsMTI4IEBACiAgKiBWaXJ0dWFsTWFueVRvT25lIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIE1hbnlUb09uZSB1c2VkIHdoZW4gdGhlcmUgaXMgCiAgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YU1hbnlUb09uZU1hcHBpbmcgZXhpc3RzLgogICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbE1hbnlUb09uZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbE1hbnlUb09uZQorcHVibGljIGNsYXNzIFZpcnR1YWxYbWxNYW55VG9PbmUgCisJZXh0ZW5kcyBYbWxNYW55VG9PbmUKIHsKLQlKYXZhTWFueVRvT25lTWFwcGluZyBqYXZhTWFueVRvT25lTWFwcGluZzsKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFNYW55VG9PbmVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOwogCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKLQkKLS8vCXByb3RlY3RlZCBWaXJ0dWFsSm9pblRhYmxlIHZpcnR1YWxKb2luVGFibGU7Ci0JCisJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nIHZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nOworCiAJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxDYXNjYWRlVHlwZSB2aXJ0dWFsQ2FzY2FkZVR5cGU7Ci0KLQlwdWJsaWMgVmlydHVhbFhtbE1hbnlUb09uZShKYXZhTWFueVRvT25lTWFwcGluZyBqYXZhTWFueVRvT25lTWFwcGluZywgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7CisJCisJCisJcHVibGljIFZpcnR1YWxYbWxNYW55VG9PbmUoCisJCU9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhTWFueVRvT25lTWFwcGluZyBqYXZhTWFueVRvT25lTWFwcGluZykgewogCQlzdXBlcigpOwotCQl0aGlzLmphdmFNYW55VG9PbmVNYXBwaW5nID0gamF2YU1hbnlUb09uZU1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JCXRoaXMudmlydHVhbENhc2NhZGVUeXBlID0gbmV3IFZpcnR1YWxDYXNjYWRlVHlwZShqYXZhTWFueVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCksIHRoaXMubWV0YWRhdGFDb21wbGV0ZSk7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFNYW55VG9PbmVNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nID0gbmV3IFZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nKG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFueVRvT25lTWFwcGluZyk7CisJCXRoaXMudmlydHVhbENhc2NhZGVUeXBlID0gCisJCQluZXcgVmlydHVhbENhc2NhZGVUeXBlKGphdmFNYW55VG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKSwgdGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSk7CiAJfQogCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFNYW55VG9PbmVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCk7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5zZXROYW1lKG5ld05hbWUpOwogCX0KIAkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKIAkJfQotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRGZXRjaCgpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdE9wdGlvbmFsKCk7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0T3B0aW9uYWwoKSk7CiAJCX0KLQkJcmV0dXJuIHRoaXMuamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0T3B0aW9uYWwoKTsKKwkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmlzT3B0aW9uYWwoKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KLQorCQorCUBPdmVycmlkZQogCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKIAkJRUxpc3Q8WG1sSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSm9pbkNvbHVtbj4oWG1sSm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TKTsKIAkJLy9UT0RPIGhlcmUgaSdtIHVzaW5nIGpvaW5Db2x1bW5zKCkgd2hpbGUgVmlydHVhbFhtbEpvaW5UYWJsZSB1c2VzIHNwZWNpZmllZEpvaW5Db2x1bW5zKCk/Pz8KLQkJZm9yIChKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuamF2YU1hbnlUb09uZU1hcHBpbmcuam9pbkNvbHVtbnMoKSkpIHsKLQkJCVhtbEpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sSm9pbkNvbHVtbihqb2luQ29sdW1uLCB0aGlzLm1ldGFkYXRhQ29tcGxldGUpOworCQlmb3IgKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiAKKwkJCQlDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoCisJCQkJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuCisJCQkJCQlnZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkuam9pbkNvbHVtbnMoKSkpIHsKKwkJCVhtbEpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sSm9pbkNvbHVtbihqb2luQ29sdW1uLCB0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJCWpvaW5Db2x1bW5zLmFkZCh4bWxKb2luQ29sdW1uKTsKIAkJfQogCQlyZXR1cm4gam9pbkNvbHVtbnM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7CiAJCXJldHVybiB0aGlzLnZpcnR1YWxDYXNjYWRlVHlwZTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKIAkJLy9UT0RPIHdlIGRvbid0IHlldCBzdXBwb3J0IEpvaW5UYWJsZSBpbiB0aGUgY29udGV4dCBtb2RlbCBmb3IgbWFueS10by1vbmUgbWFwcGluZ3MKIAkJcmV0dXJuIG51bGw7Ly90aGlzLnZpcnR1YWxKb2luVGFibGU7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIHRoaXMuamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpOworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpOwogCQl9Ci0JCXJldHVybiB0aGlzLmphdmFNYW55VG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpOworCQlyZXR1cm4gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YU1hbnlUb09uZU1hcHBpbmcgamF2YU1hbnlUb09uZU1hcHBpbmcpIHsKLQkJdGhpcy5qYXZhTWFueVRvT25lTWFwcGluZyA9IGphdmFNYW55VG9PbmVNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxDYXNjYWRlVHlwZS51cGRhdGUoamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCmluZGV4IDdmNjM4MzUuLmU4YTUwM2QgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKQEAgLTExLDcgKzExLDYgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIApAQCAtMTksMzIgKzE4LDQ0IEBACiAgKiBWaXJ0dWFsVmVyc2lvbiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBWZXJzaW9uIHVzZWQgd2hlbiB0aGVyZSBpcyAKICAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhVmVyc2lvbk1hcHBpbmcgZXhpc3RzLgogICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcKK3B1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgZXh0ZW5kcyBYbWxOdWxsQXR0cmlidXRlTWFwcGluZwogewotCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CiAJCi0JcHVibGljIFZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZyhPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JfQorCXByb3RlY3RlZCBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcgdmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmc7CiAKKwlwdWJsaWMgVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhQXR0cmlidXRlTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyA9IG5ldyBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyhvcm1UeXBlTWFwcGluZywgamF2YUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogCQlyZXR1cm4gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZykgewotCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CiAJCXJldHVybiBudWxsOwogCX0KLQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxPbmVUb01hbnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sT25lVG9NYW55LmphdmEKaW5kZXggNTM0NjliNC4uZjliZDdhMyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxPbmVUb01hbnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE9uZVRvTWFueS5qYXZhCkBAIC0xMSw4ICsxMSw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5OwpAQCAtMjUsMTY1ICsyNCwxNjggQEAKICAqIFZpcnR1YWxPbmVUb01hbnkgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgT25lVG9NYW55IHVzZWQgd2hlbiB0aGVyZSBpcyAKICAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhT25lVG9NYW55TWFwcGluZyBleGlzdHMuCiAgKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sT25lVG9NYW55IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sT25lVG9NYW55CitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbE9uZVRvTWFueQorCWV4dGVuZHMgWG1sT25lVG9NYW55CiB7Ci0JSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmc7CisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKIAotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGU7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxKb2luVGFibGUgdmlydHVhbEpvaW5UYWJsZTsKLQkKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcgdmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmc7CisKIAlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbENhc2NhZGVUeXBlIHZpcnR1YWxDYXNjYWRlVHlwZTsKIAkKIAlwcm90ZWN0ZWQgZmluYWwgTWFwS2V5IG1hcEtleTsKIAkKLQkvL1RPRE8gam9pbkNvbHVtbnMgbm90IHlldCBzdXBwb3J0ZWQgaW4gdGhlIGNvbnRleHQgbW9kZWwKLS8vCXByb3RlY3RlZCBFTGlzdDxKb2luQ29sdW1uPiB2aXJ0dWFsSm9pbkNvbHVtbnM7Ci0KLQlwdWJsaWMgVmlydHVhbFhtbE9uZVRvTWFueShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nLCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGUpIHsKKwkKKwlwdWJsaWMgVmlydHVhbFhtbE9uZVRvTWFueSgKKwkJCU9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZykgewogCQlzdXBlcigpOwotCQl0aGlzLmphdmFPbmVUb01hbnlNYXBwaW5nID0gamF2YU9uZVRvTWFueU1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0vLwkJdGhpcy5pbml0aWFsaXplSm9pbkNvbHVtbnMoamF2YU9uZVRvTWFueU1hcHBpbmcpOwotCQl0aGlzLnZpcnR1YWxDYXNjYWRlVHlwZSA9IG5ldyBWaXJ0dWFsQ2FzY2FkZVR5cGUoamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLCB0aGlzLm1ldGFkYXRhQ29tcGxldGUpOwotCQl0aGlzLnZpcnR1YWxKb2luVGFibGUgPSBuZXcgVmlydHVhbFhtbEpvaW5UYWJsZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBqYXZhT25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKSwgbWV0YWRhdGFDb21wbGV0ZSk7Ci0JCXRoaXMubWFwS2V5ID0gbmV3IFZpcnR1YWxNYXBLZXkoamF2YU9uZVRvTWFueU1hcHBpbmcsIG1ldGFkYXRhQ29tcGxldGUpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhT25lVG9NYW55TWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyA9IG5ldyBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyhvcm1UeXBlTWFwcGluZywgamF2YU9uZVRvTWFueU1hcHBpbmcpOworCQl0aGlzLnZpcnR1YWxDYXNjYWRlVHlwZSA9IAorCQkJbmV3IFZpcnR1YWxDYXNjYWRlVHlwZShqYXZhT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCksIHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpOworCQl0aGlzLm1hcEtleSA9IG5ldyBWaXJ0dWFsTWFwS2V5KGphdmFPbmVUb01hbnlNYXBwaW5nLCB0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAl9CiAJCi0vLwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbkNvbHVtbnMoSUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nKSB7Ci0vLwkJdGhpcy52aXJ0dWFsSm9pbkNvbHVtbnMgPSBuZXcgQmFzaWNFTGlzdDxKb2luQ29sdW1uPigpOwotLy8JCUxpc3RJdGVyYXRvcjxJSmF2YUpvaW5Db2x1bW4+IGphdmFKb2luQ29sdW1uczsKLS8vCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0vLwkJCWphdmFKb2luQ29sdW1ucyA9IHRoaXMuamF2YU9uZVRvTWFueU1hcHBpbmcuZGVmYXVsdEpvaW5Db2x1bW5zKCk7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlqYXZhSm9pbkNvbHVtbnMgPSB0aGlzLmphdmFPbmVUb01hbnlNYXBwaW5nLmpvaW5Db2x1bW5zKCk7CQkJCi0vLwkJfQotLy8JCQotLy8JCXdoaWxlIChqYXZhSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0vLwkJCXRoaXMudmlydHVhbEpvaW5Db2x1bW5zLmFkZChuZXcgVmlydHVhbEpvaW5Db2x1bW4oamF2YUpvaW5Db2x1bW5zLm5leHQoKSwgdGhpcy5tZXRhZGF0YUNvbXBsZXRlKSk7Ci0vLwkJfQotLy8JfQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE1hcHBpbmdLZXkoKTsKKwl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhT25lVG9NYW55TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpOworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXROYW1lKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0TmFtZShuZXdOYW1lKTsKIAl9CiAJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQogCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhT25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0RmV0Y2goKSk7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwogCQl9Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhT25lVG9NYW55TWFwcGluZy5nZXRGZXRjaCgpKTsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldEZldGNoKCkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7CiAJCXJldHVybiB0aGlzLnZpcnR1YWxDYXNjYWRlVHlwZTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKKworCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGdldE9ycGhhblJlbW92YWwoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigib3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgaW4gSlBBIDEuMCIpOyAvLyROT04tTkxTLTEkCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuIG5ld09ycGhhblJlbW92YWwpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJvcGVyYXRpb24gbm90IHN1cHBvcnRlZCBpbiBKUEEgMS4wIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJQE92ZXJyaWRlCiAJcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxKb2luVGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhT25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCk7CisJCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpICE9IG51bGwpIHsKKwkJCXJldHVybiAJbmV3IFZpcnR1YWxYbWxKb2luVGFibGUoCisJCQkJdGhpcy5vcm1UeXBlTWFwcGluZywgCisJCQkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS4KKwkJCQkJZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkpOwogCQl9Ci0JCXJldHVybiB0aGlzLmphdmFPbmVUb01hbnlNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpOworCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gdGhpcy5qYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpOworCQlyZXR1cm4gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS4KKwkJCWdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCiAJCisJQE92ZXJyaWRlCiAJcHVibGljIE1hcEtleSBnZXRNYXBLZXkoKSB7CiAJCXJldHVybiB0aGlzLm1hcEtleTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0TWFwS2V5KE1hcEtleSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldE9yZGVyQnkoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiB0aGlzLmphdmFPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKTsKKwkJcmV0dXJuIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5KFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcpIHsKLQkJdGhpcy5qYXZhT25lVG9NYW55TWFwcGluZyA9IGphdmFPbmVUb01hbnlNYXBwaW5nOwotCQl0aGlzLnZpcnR1YWxDYXNjYWRlVHlwZS51cGRhdGUoamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpKTsKLQkJdGhpcy52aXJ0dWFsSm9pblRhYmxlLnVwZGF0ZShqYXZhT25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0vLwkJdGhpcy51cGRhdGVKb2luQ29sdW1ucyhqYXZhT25lVG9NYW55TWFwcGluZyk7Ci0JfQotCQotLy8JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSm9pbkNvbHVtbnMoSUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nKSB7Ci0vLwkJTGlzdEl0ZXJhdG9yPElKYXZhSm9pbkNvbHVtbj4gamF2YUpvaW5Db2x1bW5zOwotLy8JCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiB2aXJ0dWFsSm9pbkNvbHVtbnMgPSB0aGlzLnZpcnR1YWxKb2luQ29sdW1ucy5saXN0SXRlcmF0b3IoKTsKLS8vCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0vLwkJCWphdmFKb2luQ29sdW1ucyA9IHRoaXMuamF2YU9uZVRvTWFueU1hcHBpbmcuZGVmYXVsdEpvaW5Db2x1bW5zKCk7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlqYXZhSm9pbkNvbHVtbnMgPSB0aGlzLmphdmFPbmVUb01hbnlNYXBwaW5nLmpvaW5Db2x1bW5zKCk7CQkJCi0vLwkJfQotLy8JCQotLy8JCXdoaWxlIChqYXZhSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0vLwkJCUlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luQ29sdW1ucy5uZXh0KCk7Ci0vLwkJCWlmICh2aXJ0dWFsSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0vLwkJCQlWaXJ0dWFsSm9pbkNvbHVtbiB2aXJ0dWFsSm9pbkNvbHVtbiA9IChWaXJ0dWFsSm9pbkNvbHVtbikgdmlydHVhbEpvaW5Db2x1bW5zLm5leHQoKTsKLS8vCQkJCXZpcnR1YWxKb2luQ29sdW1uLnVwZGF0ZShqYXZhSm9pbkNvbHVtbik7Ci0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQl0aGlzLnZpcnR1YWxKb2luQ29sdW1ucy5hZGQobmV3IFZpcnR1YWxKb2luQ29sdW1uKGphdmFKb2luQ29sdW1uLCB0aGlzLm1ldGFkYXRhQ29tcGxldGUpKTsKLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQl3aGlsZSh2aXJ0dWFsSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0vLwkJCXRoaXMudmlydHVhbEpvaW5Db2x1bW5zLnJlbW92ZSh2aXJ0dWFsSm9pbkNvbHVtbnMubmV4dCgpKTsKLS8vCQl9Ci0vLwl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSB7CiAJCXJldHVybiBudWxsOwogCX0KIAkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgeworCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE9uZVRvT25lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbE9uZVRvT25lLmphdmEKaW5kZXggYjc3MWIyYi4uZDFkZjVhYSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxPbmVUb09uZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sT25lVG9PbmUuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CkBAIC0yOSwxMDcgKzI5LDE1OCBAQAogICogVmlydHVhbE9uZVRvT25lIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIE9uZVRvT25lIHVzZWQgd2hlbiB0aGVyZSBpcyAKICAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhT25lVG9PbmVNYXBwaW5nIGV4aXN0cy4KICAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxYbWxPbmVUb09uZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbE9uZVRvT25lCitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbE9uZVRvT25lIGV4dGVuZHMgWG1sT25lVG9PbmUKIHsKLQlKYXZhT25lVG9PbmVNYXBwaW5nIGphdmFPbmVUb09uZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlOworCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKIAkKLS8vCXByb3RlY3RlZCBWaXJ0dWFsSm9pblRhYmxlIHZpcnR1YWxKb2luVGFibGU7Ci0JCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhT25lVG9PbmVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyB2aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZzsKKwogCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsQ2FzY2FkZVR5cGUgdmlydHVhbENhc2NhZGVUeXBlOwotCi0JcHVibGljIFZpcnR1YWxYbWxPbmVUb09uZShKYXZhT25lVG9PbmVNYXBwaW5nIGphdmFPbmVUb09uZU1hcHBpbmcsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgeworCQorCQorCXB1YmxpYyBWaXJ0dWFsWG1sT25lVG9PbmUoCisJCQlPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YU9uZVRvT25lTWFwcGluZyBqYXZhT25lVG9PbmVNYXBwaW5nKSB7CiAJCXN1cGVyKCk7Ci0JCXRoaXMuamF2YU9uZVRvT25lTWFwcGluZyA9IGphdmFPbmVUb09uZU1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JCXRoaXMudmlydHVhbENhc2NhZGVUeXBlID0gbmV3IFZpcnR1YWxDYXNjYWRlVHlwZShqYXZhT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKSwgdGhpcy5tZXRhZGF0YUNvbXBsZXRlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFPbmVUb09uZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YU9uZVRvT25lTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyA9IG5ldyBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyhvcm1UeXBlTWFwcGluZywgamF2YU9uZVRvT25lTWFwcGluZyk7CisJCXRoaXMudmlydHVhbENhc2NhZGVUeXBlID0gCisJCQluZXcgVmlydHVhbENhc2NhZGVUeXBlKGphdmFPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLCB0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAl9CiAJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCiAJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFPbmVUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKIAkJfQotCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YU9uZVRvT25lTWFwcGluZy5nZXRGZXRjaCgpKTsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldEZldGNoKCkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhT25lVG9PbmVNYXBwaW5nLmdldERlZmF1bHRPcHRpb25hbCgpOworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdE9wdGlvbmFsKCkpOwogCQl9Ci0JCXJldHVybiB0aGlzLmphdmFPbmVUb09uZU1hcHBpbmcuZ2V0T3B0aW9uYWwoKTsKKwkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmlzT3B0aW9uYWwoKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKIAkJLy9UT0RPIG5lZWQgdG8gY2hlY2sgbWV0YWRhdGFDb21wbGV0ZSBoZXJlCiAJCUVMaXN0PFhtbEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0pPSU5fQ09MVU1OUyk7CiAJCS8vVE9ETyBoZXJlIGknbSB1c2luZyBqb2luQ29sdW1ucygpIHdoaWxlIFZpcnR1YWxYbWxKb2luVGFibGUgdXNlcyBzcGVjaWZpZWRKb2luQ29sdW1ucygpPz8/Ci0JCWZvciAoSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmphdmFPbmVUb09uZU1hcHBpbmcuam9pbkNvbHVtbnMoKSkpIHsKLQkJCVhtbEpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sSm9pbkNvbHVtbihqb2luQ29sdW1uLCB0aGlzLm1ldGFkYXRhQ29tcGxldGUpOworCQlmb3IgKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiAKKwkJCQlDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoCisJCQkJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuCisJCQkJCQlnZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkuam9pbkNvbHVtbnMoKSkpIHsKKwkJCVhtbEpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sSm9pbkNvbHVtbihqb2luQ29sdW1uLCB0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJCWpvaW5Db2x1bW5zLmFkZCh4bWxKb2luQ29sdW1uKTsKIAkJfQogCQlyZXR1cm4gam9pbkNvbHVtbnM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7CiAJCXJldHVybiB0aGlzLnZpcnR1YWxDYXNjYWRlVHlwZTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGdldE9ycGhhblJlbW92YWwoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigib3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgaW4gSlBBIDEuMCIpOyAvLyROT04tTkxTLTEkCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuIG5ld09ycGhhblJlbW92YWwpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJvcGVyYXRpb24gbm90IHN1cHBvcnRlZCBpbiBKUEEgMS4wIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7CiAJCS8vVE9ETyB3ZSBkb24ndCB5ZXQgc3VwcG9ydCBKb2luVGFibGUgaW4gdGhlIGNvbnRleHQgbW9kZWwgZm9yIG1hbnktdG8tb25lIG1hcHBpbmdzCiAJCXJldHVybiBudWxsOy8vdGhpcy52aXJ0dWFsSm9pblRhYmxlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFPbmVUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpOworCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpOwogCQl9Ci0JCXJldHVybiB0aGlzLmphdmFPbmVUb09uZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCk7CisJCXJldHVybiB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gdGhpcy5qYXZhT25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCk7CisJCXJldHVybiB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLgorCQkJZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewogCQlFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+KFhtbFByaW1hcnlLZXlKb2luQ29sdW1uLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQlpZiAoIXRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewotCQkJZm9yIChKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmphdmFPbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpKSB7CisJCWlmICghdGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJZm9yIChKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IAorCQkJCQlDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoCisJCQkJCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLgorCQkJCQkJCWdldFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkucHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpKSB7CiAJCQkJWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oam9pbkNvbHVtbi8qLCB0aGlzLm1ldGFkYXRhQ29tcGxldGUqLyk7CiAJCQkJam9pbkNvbHVtbnMuYWRkKHhtbEpvaW5Db2x1bW4pOwogCQkJfQpAQCAtMTM3LDE2ICsxODgsMTMgQEAKIAkJcmV0dXJuIGpvaW5Db2x1bW5zOwogCX0KIAkKLQlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YU9uZVRvT25lTWFwcGluZyBqYXZhT25lVG9PbmVNYXBwaW5nKSB7Ci0JCXRoaXMuamF2YU9uZVRvT25lTWFwcGluZyA9IGphdmFPbmVUb09uZU1hcHBpbmc7Ci0JCXRoaXMudmlydHVhbENhc2NhZGVUeXBlLnVwZGF0ZShqYXZhT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAJCi0JcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZSgpIHsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCmluZGV4IDk0NjViMmUuLjM0MTI3ZTEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKQEAgLTIyLDcgKzIxLDcgQEAKICAqIAogICogQSB2aXJ0dWFsIHBrIGpvaW4gY29sdW1uIGRlbGVnYXRlcyB0byB0aGUgdW5kZXJseWluZyBqYXZhIHBrIGpvaW4gY29sdW1uIGZvciBpdHMgc3RhdGUuCiAgKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbgorcHVibGljIGNsYXNzIFZpcnR1YWxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBleHRlbmRzIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uCiB7CiAJCiAJcHJvdGVjdGVkIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47CkBAIC0zMywzOSArMzIsNDMgQEAKIAkJdGhpcy5qYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gPSBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogCQlyZXR1cm4gdGhpcy5qYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0TmFtZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uKCkgewogCQlyZXR1cm4gdGhpcy5qYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewogCQlyZXR1cm4gdGhpcy5qYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKSB7CiAJCXJldHVybiBudWxsOwogCX0KLQkJCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4pIHsKLQkJdGhpcy5qYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gPSBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxTZWNvbmRhcnlUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxTZWNvbmRhcnlUYWJsZS5qYXZhCmluZGV4IDVkNWEwMDkuLmIyNWRkY2IgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sU2Vjb25kYXJ5VGFibGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFNlY29uZGFyeVRhYmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTQsMTEgKzE0LDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlY29uZGFyeVRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwogCkBAIC0zMCw3ICsyOSw3IEBACiAgKiAKICAqIEEgdmlydHVhbCBzZWNvbmRhcnkgdGFibGUgZGVsZWdhdGVzIHRvIHRoZSB1bmRlcmx5aW5nIGphdmEgc2Vjb25kYXJ5IHRhYmxlIGZvciBpdHMgc3RhdGUuIAogICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbFNlY29uZGFyeVRhYmxlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sU2Vjb25kYXJ5VGFibGUKK3B1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sU2Vjb25kYXJ5VGFibGUgZXh0ZW5kcyBYbWxTZWNvbmRhcnlUYWJsZQogewogCQogCXByb3RlY3RlZCBKYXZhU2Vjb25kYXJ5VGFibGUgamF2YVNlY29uZGFyeVRhYmxlOwpAQCAtNDAsMzMgKzM5LDQwIEBACiAJCXRoaXMuamF2YVNlY29uZGFyeVRhYmxlID0gamF2YVNlY29uZGFyeVRhYmxlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKIAkJcmV0dXJuIHRoaXMuamF2YVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKIAkJcmV0dXJuIHRoaXMuamF2YVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7CiAJCXJldHVybiB0aGlzLmphdmFTZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0U2NoZW1hKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKIAkvL1ZpcnR1YWxYbWxTZWNvbmRhcnlUYWJsZSBpcyByZWJ1aWx0IGV2ZXJ5dGltZSwgc28gcmVidWlsZGluZyB0aGUgam9pbkNvbHVtbnMgbGlzdCBhcyB3ZWxsCisJQE92ZXJyaWRlCiAJcHVibGljIEVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCUVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+KFhtbFByaW1hcnlLZXlKb2luQ29sdW1uLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKKwkJRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKIAkJCiAJCWZvciAoSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmphdmFTZWNvbmRhcnlUYWJsZS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkpIHsKIAkJCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHhtbFBrSm9pbkNvbHVtbiA9IG5ldyBWaXJ0dWFsWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4ocGtKb2luQ29sdW1uKTsKQEAgLTc2LDYgKzgyLDcgQEAKIAkJcmV0dXJuIHByaW1hcnlLZXlKb2luQ29sdW1uczsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIEVMaXN0PFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCkgewogCQlFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PiB4bWxVbmlxdWVDb25zdHJhaW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PihYbWxVbmlxdWVDb25zdHJhaW50LmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUyk7CiAKQEAgLTg3LDIwICs5NCwxOCBAQAogCQlyZXR1cm4geG1sVW5pcXVlQ29uc3RyYWludHM7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZSgpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhU2Vjb25kYXJ5VGFibGUgamF2YVNlY29uZGFyeVRhYmxlKSB7Ci0JCXRoaXMuamF2YVNlY29uZGFyeVRhYmxlID0gamF2YVNlY29uZGFyeVRhYmxlOwotCX0KLQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxTZXF1ZW5jZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxTZXF1ZW5jZUdlbmVyYXRvci5qYXZhCmluZGV4IGM2YWIyM2QuLjA2YThmZmIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFNlcXVlbmNlR2VuZXJhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw3NiArOSw4NiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRvckNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbFNlcXVlbmNlR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sU2VxdWVuY2VHZW5lcmF0b3IKK3B1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IgZXh0ZW5kcyBYbWxTZXF1ZW5jZUdlbmVyYXRvcgogewotCUphdmFTZXF1ZW5jZUdlbmVyYXRvciBqYXZhU2VxdWVuY2VHZW5lcmF0b3I7CisJSmF2YUdlbmVyYXRvckNvbnRhaW5lciBqYXZhR2VuZXJhdG9ySG9sZGVyOwogCiAJcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKIAkKIAkJCi0JcHVibGljIFZpcnR1YWxYbWxTZXF1ZW5jZUdlbmVyYXRvcihKYXZhU2VxdWVuY2VHZW5lcmF0b3IgamF2YVNlcXVlbmNlR2VuZXJhdG9yLCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGUpIHsKKwlwdWJsaWMgVmlydHVhbFhtbFNlcXVlbmNlR2VuZXJhdG9yKEphdmFHZW5lcmF0b3JDb250YWluZXIgamF2YUdlbmVyYXRvckhvbGRlciwgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7CiAJCXN1cGVyKCk7Ci0JCXRoaXMuamF2YVNlcXVlbmNlR2VuZXJhdG9yID0gamF2YVNlcXVlbmNlR2VuZXJhdG9yOworCQl0aGlzLmphdmFHZW5lcmF0b3JIb2xkZXIgPSBqYXZhR2VuZXJhdG9ySG9sZGVyOwogCQl0aGlzLm1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwogCX0KIAorCXByb3RlY3RlZCBKYXZhU2VxdWVuY2VHZW5lcmF0b3IgZ2V0SmF2YVNlcXVlbmNlR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gdGhpcy5qYXZhR2VuZXJhdG9ySG9sZGVyLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJfQorCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRTZXF1ZW5jZU5hbWUoKSB7CiAJCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiB0aGlzLmphdmFTZXF1ZW5jZUdlbmVyYXRvci5nZXRTZXF1ZW5jZU5hbWUoKTsKKwkJcmV0dXJuIHRoaXMuZ2V0SmF2YVNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U2VxdWVuY2VOYW1lKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0U2VxdWVuY2VOYW1lKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpIHsKIAkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJcmV0dXJuIHRoaXMuamF2YVNlcXVlbmNlR2VuZXJhdG9yLmdldEFsbG9jYXRpb25TaXplKCk7CisJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YodGhpcy5nZXRKYXZhU2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEludGVnZXIgZ2V0SW5pdGlhbFZhbHVlKCkgewogCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gdGhpcy5qYXZhU2VxdWVuY2VHZW5lcmF0b3IuZ2V0SW5pdGlhbFZhbHVlKCk7CisJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YodGhpcy5nZXRKYXZhU2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRJbml0aWFsVmFsdWUoKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0SW5pdGlhbFZhbHVlKEludGVnZXIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAJCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiB0aGlzLmphdmFTZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCk7CisJCXJldHVybiB0aGlzLmdldEphdmFTZXF1ZW5jZUdlbmVyYXRvcigpLmdldE5hbWUoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFTZXF1ZW5jZUdlbmVyYXRvciBqYXZhU2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJdGhpcy5qYXZhU2VxdWVuY2VHZW5lcmF0b3IgPSBqYXZhU2VxdWVuY2VHZW5lcmF0b3I7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CiAJCXJldHVybiBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxUYWJsZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxUYWJsZUdlbmVyYXRvci5qYXZhCmluZGV4IDMzMmY2Y2EuLjI2MTIxZTIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sVGFibGVHZW5lcmF0b3IuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFRhYmxlR2VuZXJhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTEsMTQ4ICsxMSwxNjcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRvckNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlR2VuZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CiAKLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sVGFibGVHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxUYWJsZUdlbmVyYXRvcgorcHVibGljIGNsYXNzIFZpcnR1YWxYbWxUYWJsZUdlbmVyYXRvciBleHRlbmRzIFhtbFRhYmxlR2VuZXJhdG9yCiB7Ci0JSmF2YVRhYmxlR2VuZXJhdG9yIGphdmFUYWJsZUdlbmVyYXRvcjsKKwlKYXZhR2VuZXJhdG9yQ29udGFpbmVyIGphdmFHZW5lcmF0b3JIb2xkZXI7CiAKIAlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlOwogCQogCQkKLQlwdWJsaWMgVmlydHVhbFhtbFRhYmxlR2VuZXJhdG9yKEphdmFUYWJsZUdlbmVyYXRvciBqYXZhVGFibGVHZW5lcmF0b3IsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgeworCXB1YmxpYyBWaXJ0dWFsWG1sVGFibGVHZW5lcmF0b3IoSmF2YUdlbmVyYXRvckNvbnRhaW5lciBqYXZhR2VuZXJhdG9ySG9sZGVyLCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGUpIHsKIAkJc3VwZXIoKTsKLQkJdGhpcy5qYXZhVGFibGVHZW5lcmF0b3IgPSBqYXZhVGFibGVHZW5lcmF0b3I7CisJCXRoaXMuamF2YUdlbmVyYXRvckhvbGRlciA9IGphdmFHZW5lcmF0b3JIb2xkZXI7CiAJCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7CiAJfQogCisJcHJvdGVjdGVkIEphdmFUYWJsZUdlbmVyYXRvciBnZXRKYXZhVGFibGVHZW5lcmF0b3IoKSB7CisJCXJldHVybiB0aGlzLmphdmFHZW5lcmF0b3JIb2xkZXIuZ2V0VGFibGVHZW5lcmF0b3IoKTsKKwl9CisJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewogCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gdGhpcy5qYXZhVGFibGVHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpOworCQlyZXR1cm4gdGhpcy5nZXRKYXZhVGFibGVHZW5lcmF0b3IoKS5nZXRDYXRhbG9nKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFBrQ29sdW1uTmFtZSgpIHsKIAkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJcmV0dXJuIHRoaXMuamF2YVRhYmxlR2VuZXJhdG9yLmdldFBrQ29sdW1uTmFtZSgpOworCQlyZXR1cm4gdGhpcy5nZXRKYXZhVGFibGVHZW5lcmF0b3IoKS5nZXRQa0NvbHVtbk5hbWUoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRQa0NvbHVtbk5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRQa0NvbHVtblZhbHVlKCkgewogCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gdGhpcy5qYXZhVGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5WYWx1ZSgpOworCQlyZXR1cm4gdGhpcy5nZXRKYXZhVGFibGVHZW5lcmF0b3IoKS5nZXRQa0NvbHVtblZhbHVlKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0UGtDb2x1bW5WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKIAkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJcmV0dXJuIHRoaXMuamF2YVRhYmxlR2VuZXJhdG9yLmdldFNjaGVtYSgpOworCQlyZXR1cm4gdGhpcy5nZXRKYXZhVGFibGVHZW5lcmF0b3IoKS5nZXRTY2hlbWEoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKIAkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJcmV0dXJuIHRoaXMuamF2YVRhYmxlR2VuZXJhdG9yLmdldFRhYmxlKCk7CisJCXJldHVybiB0aGlzLmdldEphdmFUYWJsZUdlbmVyYXRvcigpLmdldFRhYmxlKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0VGFibGUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRWYWx1ZUNvbHVtbk5hbWUoKSB7CiAJCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiB0aGlzLmphdmFUYWJsZUdlbmVyYXRvci5nZXRWYWx1ZUNvbHVtbk5hbWUoKTsKKwkJcmV0dXJuIHRoaXMuZ2V0SmF2YVRhYmxlR2VuZXJhdG9yKCkuZ2V0VmFsdWVDb2x1bW5OYW1lKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0VmFsdWVDb2x1bW5OYW1lKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJbnRlZ2VyIGdldEFsbG9jYXRpb25TaXplKCkgewogCQlpZiAodGhpcy5tZXRhZGF0YUNvbXBsZXRlKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gdGhpcy5qYXZhVGFibGVHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKTsKKwkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLmdldEphdmFUYWJsZUdlbmVyYXRvcigpLmdldEFsbG9jYXRpb25TaXplKCkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldEFsbG9jYXRpb25TaXplKEludGVnZXIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSW50ZWdlciBnZXRJbml0aWFsVmFsdWUoKSB7CiAJCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiB0aGlzLmphdmFUYWJsZUdlbmVyYXRvci5nZXRJbml0aWFsVmFsdWUoKTsKKwkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLmdldEphdmFUYWJsZUdlbmVyYXRvcigpLmdldEluaXRpYWxWYWx1ZSgpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRJbml0aWFsVmFsdWUoSW50ZWdlciB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKIAkJaWYgKHRoaXMubWV0YWRhdGFDb21wbGV0ZSkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJcmV0dXJuIHRoaXMuamF2YVRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKTsKKwkJcmV0dXJuIHRoaXMuZ2V0SmF2YVRhYmxlR2VuZXJhdG9yKCkuZ2V0TmFtZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCiAJfQotCi0KLQorCQorCUBPdmVycmlkZQogCXB1YmxpYyBFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PiBnZXRVbmlxdWVDb25zdHJhaW50cygpIHsKIAkJRUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4geG1sVW5pcXVlQ29uc3RyYWludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4oWG1sVW5pcXVlQ29uc3RyYWludC5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFMpOwogCi0JCWZvciAoSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmphdmFUYWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50cygpKSkgeworCQlmb3IgKEphdmFVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5nZXRKYXZhVGFibGVHZW5lcmF0b3IoKS51bmlxdWVDb25zdHJhaW50cygpKSkgewogCQkJWG1sVW5pcXVlQ29uc3RyYWludCB4bWxVbmlxdWVDb25zdHJhaW50ID0gbmV3IFZpcnR1YWxYbWxVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQsIHRoaXMubWV0YWRhdGFDb21wbGV0ZSk7CiAJCQl4bWxVbmlxdWVDb25zdHJhaW50cy5hZGQoeG1sVW5pcXVlQ29uc3RyYWludCk7CiAJCX0KIAogCQlyZXR1cm4geG1sVW5pcXVlQ29uc3RyYWludHM7CiAJfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFUYWJsZUdlbmVyYXRvciBqYXZhVGFibGVHZW5lcmF0b3IpIHsKLQkJdGhpcy5qYXZhVGFibGVHZW5lcmF0b3IgPSBqYXZhVGFibGVHZW5lcmF0b3I7Ci0JfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKIAkJcmV0dXJuIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFRyYW5zaWVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxUcmFuc2llbnQuamF2YQppbmRleCA4ZTgwY2NjLi42M2YyYjRhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFRyYW5zaWVudC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsWG1sVHJhbnNpZW50LmphdmEKQEAgLTEwLDcgKzEwLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogCkBAIC0xOCwzMyArMTgsNDIgQEAKICAqIFZpcnR1YWxUcmFuc2llbnQgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgVHJhbnNpZW50IHVzZWQgd2hlbiB0aGVyZSBpcyAKICAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhVHJhbnNpZW50TWFwcGluZyBleGlzdHMuCiAgKi8KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sVHJhbnNpZW50IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sVHJhbnNpZW50CitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbFRyYW5zaWVudCBleHRlbmRzIFhtbFRyYW5zaWVudAogewotCUphdmFUcmFuc2llbnRNYXBwaW5nIGphdmFUcmFuc2llbnRNYXBwaW5nOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CiAJCi0JcHVibGljIFZpcnR1YWxYbWxUcmFuc2llbnQoSmF2YVRyYW5zaWVudE1hcHBpbmcgamF2YVRyYW5zaWVudE1hcHBpbmcsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgeworCXByb3RlY3RlZCBmaW5hbCBKYXZhVHJhbnNpZW50TWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKKworCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyB2aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZzsKKworCXB1YmxpYyBWaXJ0dWFsWG1sVHJhbnNpZW50KE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhVHJhbnNpZW50TWFwcGluZyBqYXZhVHJhbnNpZW50TWFwcGluZykgewogCQlzdXBlcigpOwotCQl0aGlzLmphdmFUcmFuc2llbnRNYXBwaW5nID0gamF2YVRyYW5zaWVudE1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFUcmFuc2llbnRNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nID0gbmV3IFZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nKG9ybVR5cGVNYXBwaW5nLCBqYXZhVHJhbnNpZW50TWFwcGluZyk7CiAJfQotCisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVRyYW5zaWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKTsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhVHJhbnNpZW50TWFwcGluZyBqYXZhVHJhbnNpZW50TWFwcGluZykgewotCQl0aGlzLmphdmFUcmFuc2llbnRNYXBwaW5nID0gamF2YVRyYW5zaWVudE1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0TmFtZShuZXdOYW1lKTsKIAl9CiAJCi0JCisJQE92ZXJyaWRlCiAJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZVRleHRSYW5nZSgpOwogCX0KLQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxVbmlxdWVDb25zdHJhaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFVuaXF1ZUNvbnN0cmFpbnQuamF2YQppbmRleCA0ZjEwNmVhLi5jNTA3MGE4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFVuaXF1ZUNvbnN0cmFpbnQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFVuaXF1ZUNvbnN0cmFpbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMSwyOCArMTEsMjggQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwogCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbFVuaXF1ZUNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxVbmlxdWVDb25zdHJhaW50CitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbFVuaXF1ZUNvbnN0cmFpbnQgZXh0ZW5kcyBYbWxVbmlxdWVDb25zdHJhaW50CiB7CQotCXByb3RlY3RlZCBKYXZhVW5pcXVlQ29uc3RyYWludCBqYXZhVW5pcXVlQ29uc3RyYWludDsKKwlwcm90ZWN0ZWQgVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50OwogCiAJcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKIAotCXByb3RlY3RlZCBWaXJ0dWFsWG1sVW5pcXVlQ29uc3RyYWludChKYXZhVW5pcXVlQ29uc3RyYWludCBqYXZhVW5pcXVlQ29uc3RyYWludCwgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7CisJcHJvdGVjdGVkIFZpcnR1YWxYbWxVbmlxdWVDb25zdHJhaW50KFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCwgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7CiAJCXN1cGVyKCk7Ci0JCXRoaXMuamF2YVVuaXF1ZUNvbnN0cmFpbnQgPSBqYXZhVW5pcXVlQ29uc3RyYWludDsKKwkJdGhpcy51bmlxdWVDb25zdHJhaW50ID0gdW5pcXVlQ29uc3RyYWludDsKIAkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRDb2x1bW5OYW1lcygpIHsKLQkJRUxpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lcyA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfSU1QTF9fQ09MVU1OX05BTUVTKTsKKwkJRUxpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lcyA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfX0NPTFVNTl9OQU1FUyk7CiAKLQkJZm9yIChTdHJpbmcgY29sdW1uTmFtZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmphdmFVbmlxdWVDb25zdHJhaW50LmNvbHVtbk5hbWVzKCkpKSB7CisJCWZvciAoU3RyaW5nIGNvbHVtbk5hbWUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy51bmlxdWVDb25zdHJhaW50LmNvbHVtbk5hbWVzKCkpKSB7CiAJCQljb2x1bW5OYW1lcy5hZGQoY29sdW1uTmFtZSk7CiAJCX0KIAkJcmV0dXJuIGNvbHVtbk5hbWVzOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxWZXJzaW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFZlcnNpb24uamF2YQppbmRleCBjNDAyZTM4Li5iMjNmOTRhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFZlcnNpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbFhtbFZlcnNpb24uamF2YQpAQCAtOSw5ICs5LDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247CkBAIC0yMSw1NSArMjMsMTA5IEBACiAgKiBWaXJ0dWFsVmVyc2lvbiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBWZXJzaW9uIHVzZWQgd2hlbiB0aGVyZSBpcyAKICAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhVmVyc2lvbk1hcHBpbmcgZXhpc3RzLgogICovCi1wdWJsaWMgY2xhc3MgVmlydHVhbFhtbFZlcnNpb24gZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxWZXJzaW9uCitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbFZlcnNpb24gZXh0ZW5kcyBYbWxWZXJzaW9uCiB7Ci0JSmF2YVZlcnNpb25NYXBwaW5nIGphdmFWZXJzaW9uTWFwcGluZzsKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFWZXJzaW9uTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKKworCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyB2aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZzsKIAogCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQ29sdW1uIGNvbHVtbjsKLQotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGU7CiAJCi0JcHVibGljIFZpcnR1YWxYbWxWZXJzaW9uKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhVmVyc2lvbk1hcHBpbmcgamF2YVZlcnNpb25NYXBwaW5nLCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGUpIHsKKwlwdWJsaWMgVmlydHVhbFhtbFZlcnNpb24oT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFWZXJzaW9uTWFwcGluZyBqYXZhVmVyc2lvbk1hcHBpbmcpIHsKIAkJc3VwZXIoKTsKLQkJdGhpcy5qYXZhVmVyc2lvbk1hcHBpbmcgPSBqYXZhVmVyc2lvbk1hcHBpbmc7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JCXRoaXMuY29sdW1uID0gbmV3IFZpcnR1YWxYbWxDb2x1bW4ob3JtVHlwZU1hcHBpbmcsIGphdmFWZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKSwgbWV0YWRhdGFDb21wbGV0ZSk7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFWZXJzaW9uTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyA9IG5ldyBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyhvcm1UeXBlTWFwcGluZywgamF2YVZlcnNpb25NYXBwaW5nKTsKKwkJdGhpcy5jb2x1bW4gPSBuZXcgVmlydHVhbFhtbENvbHVtbihvcm1UeXBlTWFwcGluZywgamF2YVZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpKTsKIAl9Ci0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhVmVyc2lvbk1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKTsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOworCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZVRleHRSYW5nZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBYbWxDb2x1bW4gZ2V0Q29sdW1uKCkgewogCQlyZXR1cm4gdGhpcy5jb2x1bW47CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKSB7Ci0JCWlmICh0aGlzLm1ldGFkYXRhQ29tcGxldGUpIHsKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhVmVyc2lvbk1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKSB7CisJCQlvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZSBqYXZhVGVtcG9yYWxUeXBlID0gKChUZW1wb3JhbENvbnZlcnRlcikgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCk7CisJCQlyZXR1cm4gIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChqYXZhVGVtcG9yYWxUeXBlKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKEphdmFWZXJzaW9uTWFwcGluZyBqYXZhVmVyc2lvbk1hcHBpbmcpIHsKLQkJdGhpcy5qYXZhVmVyc2lvbk1hcHBpbmcgPSBqYXZhVmVyc2lvbk1hcHBpbmc7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZShqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJCisJLy9zZWUgZWNsaXBzZWxpbmsgYnVnIDI0NzA3OCBmb3IgaW5mbyBvbmUgd2h5IEkgbWFkZSB0aGUgaW50ZXJmYWNlIFhtbENvbnZlcnRpYmxlTWFwcGluZworCUBPdmVycmlkZQorCXB1YmxpYyBFbnVtVHlwZSBnZXRFbnVtZXJhdGVkKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImVudW1lcmF0ZWQgbm90IHN1cHBvcnRlZCBvbiB2ZXJzaW9uIG1hcHBpbmdzIik7IC8vJE5PTi1OTFMtMSQKKwl9CiAJCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCS8vc2VlIGVjbGlwc2VsaW5rIGJ1ZyAyNDcwNzggZm9yIGluZm8gb25lIHdoeSBJIG1hZGUgdGhlIGludGVyZmFjZSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0xvYigpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJsb2Igbm90IHN1cHBvcnRlZCBvbiB2ZXJzaW9uIG1hcHBpbmdzIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TG9iKGJvb2xlYW4gdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldExvYlRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7CiAJCXJldHVybiBudWxsOwogCX0KIApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RKYXJGaWxlUmVmLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdEphckZpbGVSZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGNmMTA1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RKYXJGaWxlUmVmLmphdmEKQEAgLTAsMCArMSwzMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphckZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkphckZpbGVSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXJGaWxlUmVmCisJZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIEphckZpbGVSZWYKK3sKKwlwcm90ZWN0ZWQgWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmOworCQorCXByb3RlY3RlZCBTdHJpbmcgZmlsZU5hbWU7CisJCisJcHJvdGVjdGVkIEphckZpbGUgamFyRmlsZTsKKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEFic3RyYWN0SmFyRmlsZVJlZihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBYbWxKYXJGaWxlUmVmIHhtbEphckZpbGVSZWYpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy54bWxKYXJGaWxlUmVmID0geG1sSmFyRmlsZVJlZjsKKwkJdGhpcy5maWxlTmFtZSA9IHhtbEphckZpbGVSZWYuZ2V0RmlsZU5hbWUoKTsKKwkJdGhpcy5qYXJGaWxlID0gdGhpcy5idWlsZEphckZpbGUoKTsKKwl9CisJCisJcHJvdGVjdGVkIEphckZpbGUgYnVpbGRKYXJGaWxlKCkgeworCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmZpbGVOYW1lKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBqcnBmciA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QodGhpcy5nZXRGaWxlTmFtZSgpKTsKKwkJcmV0dXJuIChqcnBmciA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkSmFyRmlsZShqcnBmcik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogZmlsZSBuYW1lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5maWxlTmFtZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIG5ld0ZpbGVOYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmZpbGVOYW1lOworCQl0aGlzLmZpbGVOYW1lID0gbmV3RmlsZU5hbWU7CisJCXRoaXMueG1sSmFyRmlsZVJlZi5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGSUxFX05BTUVfUFJPUEVSVFksIG9sZCwgbmV3RmlsZU5hbWUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaWxlTmFtZV8oU3RyaW5nIG5ld0ZpbGVOYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmZpbGVOYW1lOworCQl0aGlzLmZpbGVOYW1lID0gbmV3RmlsZU5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGSUxFX05BTUVfUFJPUEVSVFksIG9sZCwgbmV3RmlsZU5hbWUpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIEpBUiBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEphckZpbGUgZ2V0SmFyRmlsZSgpIHsKKwkJcmV0dXJuIHRoaXMuamFyRmlsZTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0SmFyRmlsZShKYXJGaWxlIGphckZpbGUpIHsKKwkJSmFyRmlsZSBvbGQgPSB0aGlzLmphckZpbGU7CisJCXRoaXMuamFyRmlsZSA9IGphckZpbGU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChKQVJfRklMRV9QUk9QRVJUWSwgb2xkLCBqYXJGaWxlKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBKYXJGaWxlUmVmIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKwkKKwlwdWJsaWMgUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7CisJCXJldHVybiAodGhpcy5qYXJGaWxlID09IG51bGwpID8gbnVsbCA6IHRoaXMuamFyRmlsZS5nZXRQZXJzaXN0ZW50VHlwZSh0eXBlTmFtZSk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KSB7CisJCXJldHVybiAodGhpcy54bWxKYXJGaWxlUmVmICE9IG51bGwpICYmIHRoaXMueG1sSmFyRmlsZVJlZi5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBQZXJzaXN0ZW50VHlwZUNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJCisJcHVibGljIEl0ZXJhYmxlPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZT4gZ2V0UGVyc2lzdGVudFR5cGVzKCkgeworCQlyZXR1cm4gKHRoaXMuamFyRmlsZSAhPSBudWxsKSA/IHRoaXMuamFyRmlsZS5nZXRQZXJzaXN0ZW50VHlwZXMoKSA6IEVtcHR5SXRlcmFibGUuPEphdmFQZXJzaXN0ZW50VHlwZT5pbnN0YW5jZSgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIEpwYVN0cnVjdHVyZU5vZGUgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuSkFSX0ZJTEVfUkVGX0lEOworCX0KKwkKKwlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7CisJCXJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gKHRoaXMueG1sSmFyRmlsZVJlZiA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnhtbEphckZpbGVSZWYuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7CisJfQorCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKHRoaXMuamFyRmlsZSAhPSBudWxsKSB7CisJCQl0aGlzLmphckZpbGUuZGlzcG9zZSgpOworCQl9CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogWG1sQ29udGV4dE5vZGUgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiAodGhpcy54bWxKYXJGaWxlUmVmID09IG51bGwpID8gbnVsbCA6IHRoaXMueG1sSmFyRmlsZVJlZi5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxKYXJGaWxlUmVmIHhqZnIpIHsKKwkJdGhpcy54bWxKYXJGaWxlUmVmID0geGpmcjsKKwkJdGhpcy5zZXRGaWxlTmFtZV8oeGpmci5nZXRGaWxlTmFtZSgpKTsKKwkJdGhpcy51cGRhdGVKYXJGaWxlKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlSmFyRmlsZSgpIHsKKwkJSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBqcnBmciA9IG51bGw7CisJCQorCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZmlsZU5hbWUpKSB7CisJCQkKKwkJCS8vIGZpcnN0LCBhdHRlbXB0IHRvIHJlc29sdmUgbG9jYXRpb24gc3BlY2lmaWNhbGx5CisJCQlqcnBmciA9IGphdmFQYWNrYWdlUm9vdF9zcGVjaWZpY2FsbHkoKTsKKwkJCQorCQkJLy8gdGhlbiAuLi4gZ3Vlc3MsIGJhc2ljYWxseQorCQkJaWYgKGpycGZyID09IG51bGwpIHsKKwkJCQlqcnBmciA9IGphdmFQYWNrYWdlUm9vdF9ndWVzcygpOworCQkJfQorCQl9CisJCQorCQlpZiAoanJwZnIgPT0gbnVsbCkgeworCQkJaWYgKHRoaXMuamFyRmlsZSAhPSBudWxsKSB7CisJCQkJdGhpcy5qYXJGaWxlLmRpc3Bvc2UoKTsKKwkJCQl0aGlzLnNldEphckZpbGUobnVsbCk7CisJCQl9CisJCX0gZWxzZSB7IAorCQkJaWYgKHRoaXMuamFyRmlsZSA9PSBudWxsKSB7CisJCQkJdGhpcy5zZXRKYXJGaWxlKHRoaXMuYnVpbGRKYXJGaWxlKGpycGZyKSk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuamFyRmlsZS51cGRhdGUoanJwZnIpOworCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBqYXZhUGFja2FnZVJvb3Rfc3BlY2lmaWNhbGx5KCkgeworCQlmb3IgKElQYXRoIGRlcGxveW1lbnRQYXRoIDogcmVzb2x2ZURlcGxveW1lbnRKYXJGaWxlUGF0aChuZXcgUGF0aCh0aGlzLmZpbGVOYW1lKSkpIHsKKwkJCUlWaXJ0dWFsRmlsZSB2aXJ0dWFsSmFyID0gQ29tcG9uZW50Q29yZS5jcmVhdGVGaWxlKHRoaXMuZ2V0UHJvamVjdCgpLCBkZXBsb3ltZW50UGF0aCk7CisJCQlJRmlsZSByZWFsSmFyID0gdmlydHVhbEphci5nZXRVbmRlcmx5aW5nRmlsZSgpOworCQkJaWYgKHJlYWxKYXIuZXhpc3RzKCkgJiYgcmVhbEphci5nZXRQcm9qZWN0KCkuZXF1YWxzKHRoaXMuZ2V0UHJvamVjdCgpKSkgeworCQkJCXJldHVybiBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdChyZWFsSmFyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByaXZhdGUgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBqYXZhUGFja2FnZVJvb3RfZ3Vlc3MoKSB7CisJCVN0cmluZyBqYXJGaWxlTmFtZSA9IG5ldyBQYXRoKHRoaXMuZmlsZU5hbWUpLmxhc3RTZWdtZW50KCk7CisJCWZvciAoSnBhRmlsZSBqcGFGaWxlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGdldEpwYVByb2plY3QoKS5qcGFGaWxlcygpKSkgeworCQkJaWYgKGpwYUZpbGUuZ2V0RmlsZSgpLmdldE5hbWUoKS5lcXVhbHMoamFyRmlsZU5hbWUpCisJCQkJCSYmIEpwdENvcmVQbHVnaW4uSkFSX0NPTlRFTlRfVFlQRS5lcXVhbHMoanBhRmlsZS5nZXRDb250ZW50VHlwZSgpKSkgeworCQkJCXJldHVybiAoSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCkganBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCk7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybiBhbiBhcnJheSBvZiBkZXBsb3ltZW50IHBhdGhzIHRoYXQgbWF5IGNvcnJlc3BvbmQKKwkgKiB0byB0aGUgZ2l2ZW4gcGVyc2lzdGVuY2UueG1sIGphciBmaWxlIGVudHJ5CisJICovCisJcHJvdGVjdGVkIElQYXRoW10gcmVzb2x2ZURlcGxveW1lbnRKYXJGaWxlUGF0aChJUGF0aCBqYXJGaWxlUGF0aCkgeworCQlJUGF0aCByb290ID0gdGhpcy5nZXRKYXJEZXBsb3ltZW50Um9vdFBhdGgoKTsKKwkJcmV0dXJuIHRoaXMucHJvamVjdEhhc1dlYkZhY2V0KCkgPworCQkJCXRoaXMucmVzb2x2ZURlcGxveW1lbnRKYXJGaWxlUGF0aFdlYihyb290LCBqYXJGaWxlUGF0aCkgOgorCQkJCXRoaXMucmVzb2x2ZURlcGxveW1lbnRKYXJGaWxlUGF0aE5vbldlYihyb290LCBqYXJGaWxlUGF0aCk7CisJfQorCisJcHJvdGVjdGVkIElQYXRoIGdldEphckRlcGxveW1lbnRSb290UGF0aCgpIHsKKwkJcmV0dXJuIEpwdENvcmVQbHVnaW4uZ2V0SmFyRGVwbG95bWVudFJvb3RQYXRoKHRoaXMuZ2V0UHJvamVjdCgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9qZWN0SGFzV2ViRmFjZXQoKSB7CisJCXJldHVybiBKcHRDb3JlUGx1Z2luLnByb2plY3RIYXNXZWJGYWNldCh0aGlzLmdldFByb2plY3QoKSk7CisJfQorCisJcHJvdGVjdGVkIElQYXRoW10gcmVzb2x2ZURlcGxveW1lbnRKYXJGaWxlUGF0aFdlYihJUGF0aCByb290LCBJUGF0aCBqYXJGaWxlUGF0aCkgeworCQlyZXR1cm4gbmV3IElQYXRoW10geworCQkJCS8vIGZpcnN0IHBhdGggZW50cnkgYXNzdW1lcyBmb3JtICIuLi9saWIvb3RoZXIuamFyIgorCQkJCXJvb3QuYXBwZW5kKGphckZpbGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpLAorCQkJCS8vIHNlY29uZCBwYXRoIGVudHJ5IGFzc3VtZXMgZm9ybSBvZiBmaXJzdCwgd2l0aG91dCAiLi4iICgibGliL290aGVyLmphciIpCisJCQkJcm9vdC5hcHBlbmQoamFyRmlsZVBhdGgpCisJCQl9OworCX0KKworCXByb3RlY3RlZCBJUGF0aFtdIHJlc29sdmVEZXBsb3ltZW50SmFyRmlsZVBhdGhOb25XZWIoSVBhdGggcm9vdCwgSVBhdGggamFyRmlsZVBhdGgpIHsKKwkJcmV0dXJuIG5ldyBJUGF0aFtdIHsKKwkJCQkvLyBhc3N1bWVzIGZvcm0gIi4uL2xpYi9vdGhlci5qYXIiCisJCQkJcm9vdC5hcHBlbmQoamFyRmlsZVBhdGgpCisJCQl9OworCX0KKworCisJcHJvdGVjdGVkIEphckZpbGUgYnVpbGRKYXJGaWxlKEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QganJwZnIpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRKYXJGaWxlKHRoaXMsIGpycGZyKTsKKwl9CisKKwlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCisJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMueG1sSmFyRmlsZVJlZi5nZXRGaWxlTmFtZSgpKSkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9KQVJfRklMRSwKKwkJCQkJdGhpcywKKwkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKKwkJCQkpCisJCQkpOworCQkJcmV0dXJuOworCQl9CisJCQorCQltZXNzYWdlcy5hZGQoCisJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCisJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfSkFSX0ZJTEVfREVQTE9ZTUVOVF9QQVRIX1dBUk5JTkcsCisJCQkJdGhpcywKKwkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQorCQkJKQorCQkpOworCisJCWlmICh0aGlzLmphckZpbGUgPT0gbnVsbCkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9KQVJfRklMRSwKKwkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLnhtbEphckZpbGVSZWYuZ2V0RmlsZU5hbWUoKX0sCisJCQkJCXRoaXMsCisJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCisJCQkJKQorCQkJKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXRoaXMuamFyRmlsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIG1pc2MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzdXBlci50b1N0cmluZyhzYik7CisJCXNiLmFwcGVuZCh0aGlzLmdldEZpbGVOYW1lKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0Fic3RyYWN0TWFwcGluZ0ZpbGVSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0Fic3RyYWN0TWFwcGluZ0ZpbGVSZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzY3MjFkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RNYXBwaW5nRmlsZVJlZi5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGVSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5NYXBwaW5nRmlsZURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNYXBwaW5nRmlsZVJlZgorCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBNYXBwaW5nRmlsZVJlZgoreworCXByb3RlY3RlZCBTdHJpbmcgZmlsZU5hbWU7CisKKwlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGUgbWFwcGluZ0ZpbGU7CisKKworCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKKworCXByb3RlY3RlZCBBYnN0cmFjdE1hcHBpbmdGaWxlUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFN0cmluZyByZXNvdXJjZUZpbGVOYW1lKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuZmlsZU5hbWUgPSByZXNvdXJjZUZpbGVOYW1lOworCQl0aGlzLm1hcHBpbmdGaWxlID0gdGhpcy5idWlsZE1hcHBpbmdGaWxlKCk7CisJfQorCisJcHJvdGVjdGVkIE1hcHBpbmdGaWxlIGJ1aWxkTWFwcGluZ0ZpbGUoKSB7CisJCUpwYVhtbFJlc291cmNlIHhtbFJlc291cmNlID0gdGhpcy5nZXRYbWxSZXNvdXJjZSgpOworCQlyZXR1cm4gKHhtbFJlc291cmNlID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRNYXBwaW5nRmlsZSh4bWxSZXNvdXJjZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCisJCisJLy8gKioqKioqKioqKiBKcGFTdHJ1Y3R1cmVOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBQZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzLk1BUFBJTkdfRklMRV9SRUZfSUQ7CisJfQorCisJcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCkgeworCQlyZXR1cm4gdGhpczsKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlpZiAodGhpcy5tYXBwaW5nRmlsZSAhPSBudWxsKSB7CisJCQl0aGlzLm1hcHBpbmdGaWxlLmRpc3Bvc2UoKTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKKworCXB1YmxpYyBNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgeworCQlNYXBwaW5nRmlsZVJvb3Qgcm9vdCA9IHRoaXMuZ2V0TWFwcGluZ0ZpbGVSb290XygpOworCQlyZXR1cm4gKHJvb3QgPT0gbnVsbCkgPyBudWxsIDogcm9vdC5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCX0KKworCS8qKgorCSAqICNnZXRNYXBwaW5nRmlsZVJvb3QoKSBpcyBhbHJlYWR5IGRlZmluZWQgYnkgSnBhQ29udGV4dE5vZGUgZm9yIHRoZQorCSAqIGRlc2NlbmRhbnRzIG9mIGEgIm1hcHBpbmcgZmlsZSByb290IiAtIHdlIHdhbnQgc29tZXRoaW5nIHNsaWdodGx5CisJICogZGlmZmVyZW50IGhlcmUuLi4KKwkgKi8KKwlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSb290IGdldE1hcHBpbmdGaWxlUm9vdF8oKSB7CisJCXJldHVybiAodGhpcy5tYXBwaW5nRmlsZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLm1hcHBpbmdGaWxlLmdldFJvb3QoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0V4aXN0cygpIHsKKwkJTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBkZWZhdWx0cyA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJcmV0dXJuIChkZWZhdWx0cyAhPSBudWxsKSAmJiBkZWZhdWx0cy5yZXNvdXJjZUV4aXN0cygpOworCX0KKworCXB1YmxpYyBQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKKwkJcmV0dXJuICh0aGlzLm1hcHBpbmdGaWxlID09IG51bGwpID8gbnVsbCA6IHRoaXMubWFwcGluZ0ZpbGUuZ2V0UGVyc2lzdGVudFR5cGUodHlwZU5hbWUpOworCX0KKworCisJLy8gKioqKioqKioqKiBmaWxlIG5hbWUgKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuZmlsZU5hbWU7CisJfQorCisKKwkvLyAqKioqKioqKioqIG1hcHBpbmcgZmlsZSAqKioqKioqKioqCisKKwlwdWJsaWMgTWFwcGluZ0ZpbGUgZ2V0TWFwcGluZ0ZpbGUoKSB7CisJCXJldHVybiB0aGlzLm1hcHBpbmdGaWxlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldE1hcHBpbmdGaWxlKE1hcHBpbmdGaWxlIG1hcHBpbmdGaWxlKSB7CisJCU1hcHBpbmdGaWxlIG9sZCA9IHRoaXMubWFwcGluZ0ZpbGU7CisJCXRoaXMubWFwcGluZ0ZpbGUgPSBtYXBwaW5nRmlsZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1BUFBJTkdfRklMRV9QUk9QRVJUWSwgb2xkLCBtYXBwaW5nRmlsZSk7CisJfQorCisJCisJLy8gKioqKioqKioqKiBQZXJzaXN0ZW50VHlwZUNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgSXRlcmFibGU8PyBleHRlbmRzIFBlcnNpc3RlbnRUeXBlPiBnZXRQZXJzaXN0ZW50VHlwZXMoKSB7CisJCXJldHVybiAodGhpcy5tYXBwaW5nRmlsZSAhPSBudWxsKSA/IHRoaXMubWFwcGluZ0ZpbGUuZ2V0UGVyc2lzdGVudFR5cGVzKCkgOiBFbXB0eUl0ZXJhYmxlLjxKYXZhUGVyc2lzdGVudFR5cGU+aW5zdGFuY2UoKTsKKwl9CisKKwkvLyAqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioKKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKKwkJdGhpcy51cGRhdGVNYXBwaW5nRmlsZSgpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1hcHBpbmdGaWxlKCkgeworCQlKcGFYbWxSZXNvdXJjZSB4bWxSZXNvdXJjZSA9IHRoaXMuZ2V0WG1sUmVzb3VyY2UoKTsKKwkJaWYgKHhtbFJlc291cmNlICE9IG51bGwpIHsKKwkJCWlmICh0aGlzLm1hcHBpbmdGaWxlID09IG51bGwpIHsKKwkJCQl0aGlzLnNldE1hcHBpbmdGaWxlKHRoaXMuYnVpbGRNYXBwaW5nRmlsZSh4bWxSZXNvdXJjZSkpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBpZiB0aGUgcmVzb3VyY2UgdHlwZSBoYXMgY2hhbmdlZCwgcmVidWlsZCB0aGUgbWFwcGluZyBmaWxlCisJCQkJaWYgKHRoaXMubWFwcGluZ0ZpbGUuZ2V0WG1sUmVzb3VyY2UoKSAhPSB4bWxSZXNvdXJjZSkgeworCQkJCQl0aGlzLm1hcHBpbmdGaWxlLmRpc3Bvc2UoKTsKKwkJCQkJdGhpcy5zZXRNYXBwaW5nRmlsZSh0aGlzLmJ1aWxkTWFwcGluZ0ZpbGUoeG1sUmVzb3VyY2UpKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLm1hcHBpbmdGaWxlLnVwZGF0ZSh4bWxSZXNvdXJjZSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHRoaXMubWFwcGluZ0ZpbGUgIT0gbnVsbCkgeworCQkJCXRoaXMubWFwcGluZ0ZpbGUuZGlzcG9zZSgpOworCQkJCXRoaXMuc2V0TWFwcGluZ0ZpbGUobnVsbCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGUgWG1sTWFwcGluZ0ZpbGVSZWYgcmVzb3VyY2UgaXMgdGhlIFBlcnNpc3RlbmNlIHhtbCByZXNvdXJjZS4KKwkgKiBUaGlzIHJldHVybnMgdGhlIHJlc291cmNlIG9mIHRoZSBtYXBwaW5nIGZpbGUgaXRzZWxmLgorCSAqLworCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBnZXRYbWxSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIHRoaXMuZmlsZU5hbWUgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKHRoaXMuZmlsZU5hbWUpOworCX0KKwkKKwlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGUgYnVpbGRNYXBwaW5nRmlsZShKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSkgeworCQlNYXBwaW5nRmlsZURlZmluaXRpb24gbWFwcGluZ0ZpbGVEZWY7CisJCXRyeSB7CisJCQltYXBwaW5nRmlsZURlZiA9IChNYXBwaW5nRmlsZURlZmluaXRpb24pIGdldEpwYVBsYXRmb3JtKCkuZ2V0UmVzb3VyY2VEZWZpbml0aW9uKHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKKwkJfQorCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2coaWFlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiAobWFwcGluZ0ZpbGVEZWYgPT0gbnVsbCkgPyBudWxsIDogbWFwcGluZ0ZpbGVEZWYuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRNYXBwaW5nRmlsZSh0aGlzLCByZXNvdXJjZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHBvc3RVcGRhdGUoKSB7CisJCXN1cGVyLnBvc3RVcGRhdGUoKTsKKwkJaWYgKHRoaXMubWFwcGluZ0ZpbGUgIT0gbnVsbCkgeworCQkJdGhpcy5tYXBwaW5nRmlsZS5wb3N0VXBkYXRlKCk7CisJCX0KKwl9CisJCisJCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKworCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmZpbGVOYW1lKSkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9NQVBQSU5HX0ZJTEUsCisJCQkJCXRoaXMsCisJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCisJCQkJKQorCQkJKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICh0aGlzLm1hcHBpbmdGaWxlID09IG51bGwpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJdGhpcy5idWlsZE1pc3NpbmdNYXBwaW5nRmlsZU1lc3NhZ2VJRCgpLAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZmlsZU5hbWV9LAorCQkJCQl0aGlzLAorCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQorCQkJCSkKKwkJCSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAodGhpcy5tYXBwaW5nRmlsZS5nZXRSb290KCkgPT0gbnVsbCkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX01BUFBJTkdfRklMRSwKKwkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmZpbGVOYW1lfSwKKwkJCQkJdGhpcywKKwkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKKwkJCQkpCisJCQkpOworCQl9CisKKwkJdGhpcy5tYXBwaW5nRmlsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRNaXNzaW5nTWFwcGluZ0ZpbGVNZXNzYWdlSUQoKSB7CisJCXJldHVybiB0aGlzLmdldFBsYXRmb3JtRmlsZSgpLmV4aXN0cygpID8KKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfVU5TVVBQT1JURURfTUFQUElOR19GSUxFX0NPTlRFTlQKKwkJCQk6CisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX01BUFBJTkdfRklMRTsKKwl9CisKKwlwcm90ZWN0ZWQgSUZpbGUgZ2V0UGxhdGZvcm1GaWxlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KCkuY29udmVydFRvUGxhdGZvcm1GaWxlKHRoaXMuZmlsZU5hbWUpOworCX0KKworCisJLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc3VwZXIudG9TdHJpbmcoc2IpOworCQlzYi5hcHBlbmQodGhpcy5maWxlTmFtZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0Fic3RyYWN0UGVyc2lzdGVuY2VKcGFDb250ZXh0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODk2NDE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0Fic3RyYWN0UGVyc2lzdGVuY2VKcGFDb250ZXh0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5BYnN0cmFjdEpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUgZXh0ZW5kcyBBYnN0cmFjdEpwYUNvbnRleHROb2RlIGltcGxlbWVudHMgUGVyc2lzdGVuY2VKcGFDb250ZXh0Tm9kZQotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0UGVyc2lzdGVuY2VKcGFDb250ZXh0Tm9kZShKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBBbGwgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25zIHtAbGluayAjYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPil9IAotCSAqIHNob3VsZCBiZSBwcmVjZWRlZCBieSBhICJzdXBlciIgY2FsbCB0byB0aGlzIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzhjYTI1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQuamF2YQpAQCAtMCwwICsxLDE1MzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuSmFyRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVudFR5cGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXJGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Ob3ROdWxsRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworLyoqCisgKiBwZXJzaXN0ZW5jZS11bml0CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdAorCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVVuaXQKK3sKKwlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdDsKKworCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKKworCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgc3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlOworCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZGVmYXVsdFRyYW5zYWN0aW9uVHlwZTsKKworCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHByb3ZpZGVyOworCisJcHJvdGVjdGVkIFN0cmluZyBqdGFEYXRhU291cmNlOworCXByb3RlY3RlZCBTdHJpbmcgbm9uSnRhRGF0YVNvdXJjZTsKKworCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8TWFwcGluZ0ZpbGVSZWY+IHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcyA9IG5ldyBWZWN0b3I8TWFwcGluZ0ZpbGVSZWY+KCk7CisJcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmIGltcGxpZWRNYXBwaW5nRmlsZVJlZjsKKworCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8SmFyRmlsZVJlZj4gamFyRmlsZVJlZnMgPSBuZXcgVmVjdG9yPEphckZpbGVSZWY+KCk7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBuZXcgVmVjdG9yPENsYXNzUmVmPigpOworCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8Q2xhc3NSZWY+IGltcGxpZWRDbGFzc1JlZnMgPSBuZXcgVmVjdG9yPENsYXNzUmVmPigpOworCisJcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlczsKKworCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8UHJvcGVydHk+IHByb3BlcnRpZXMgPSBuZXcgVmVjdG9yPFByb3BlcnR5PigpOworCisJLyogZ2xvYmFsIGdlbmVyYXRvciBkZWZpbml0aW9ucywgZGVmaW5lZCBlbHNld2hlcmUgaW4gbW9kZWwgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPEdlbmVyYXRvcj4gZ2VuZXJhdG9ycyA9IG5ldyBWZWN0b3I8R2VuZXJhdG9yPigpOworCisJLyogZ2xvYmFsIHF1ZXJ5IGRlZmluaXRpb25zLCBkZWZpbmVkIGVsc2V3aGVyZSBpbiBtb2RlbCAqLworCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8UXVlcnk+IHF1ZXJpZXMgPSBuZXcgVmVjdG9yPFF1ZXJ5PigpOworCQorCXByb3RlY3RlZCBmaW5hbCBTZXQ8U3RyaW5nPiByb290RW50aXRpZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCisJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZGVmYXVsdEFjY2VzczsKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nOworCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0Q2FzY2FkZVBlcnNpc3Q7CisKKworCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKKworCS8qKgorCSAqIE5COiBCZSBjYXJlZnVsIGNoYW5naW5nIHRoZSBvcmRlciBvZiB0aGUgc3RhdGVtZW50cyBpbiB0aGlzIG1ldGhvZAorCSAqIChidWcgMjU4NzAxIGlzIG9uZSByZWFzb24pLgorCSAqLworCXByb3RlY3RlZCBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdChQZXJzaXN0ZW5jZSBwYXJlbnQsIFhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQ7CisJCXRoaXMubmFtZSA9IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCk7CisJCXRoaXMuc3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyA9IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCk7CisJCXRoaXMuc3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlID0gdGhpcy5idWlsZFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSgpOworCQl0aGlzLmRlZmF1bHRUcmFuc2FjdGlvblR5cGUgPSB0aGlzLmJ1aWxkRGVmYXVsdFRyYW5zYWN0aW9uVHlwZSgpOworCQl0aGlzLmRlc2NyaXB0aW9uID0geG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCk7CisJCXRoaXMucHJvdmlkZXIgPSB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKTsKKwkJdGhpcy5qdGFEYXRhU291cmNlID0geG1sUGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKTsKKwkJdGhpcy5ub25KdGFEYXRhU291cmNlID0geG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKTsKKwkJdGhpcy5zcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzID0geG1sUGVyc2lzdGVuY2VVbml0LmdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKTsKKworCQkvLyBpbml0aWFsaXplIHRoZSBwcm9wZXJ0aWVzIGJlZm9yZSBidWlsZGluZyB0aGUgZW50aXRpZXMgYmVjYXVzZSB0aGUKKwkJLy8gZW50aXRpZXMgd2lsbCBuZWVkIHRoZSBwcm9wZXJ0aWVzCisJCXRoaXMuaW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKKworCQl0aGlzLmluaXRpYWxpemVKYXJGaWxlUmVmcygpOworCisJCS8vaW5pdGlhbGl6ZSBzcGVjaWZpZWQgY2xhc3NSZWZzIGJlZm9yZSBtYXBwaW5nRmlsZVJlZnMgYmVjYXVzZSBvZiAKKwkJLy9KcGFGaWxlIHJvb3RTdHJ1Y3R1cmVOb2RlLCB3ZSB3YW50IHRoZSBtYXBwaW5nIGZpbGUgdG8gIndpbiIsCisJCS8vYXMgaXQgd291bGQgaW4gYSBKcGEgcnVudGltZSBpbXBsZW1lbnRhdGlvbgorCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJdGhpcy5pbml0aWFsaXplTWFwcGluZ0ZpbGVSZWZzKCk7CisJCS8vaW5pdGlhbGl6ZSBpbXBsaWVkIGNsYXNzUmVmcyBsYXN0IHNpbmNlIHRoZXkgZGVwZW5kIG9uIGJvdGgKKwkJLy9zcGVjaWZpZWQgY2xhc3NSZWZzIGFuZCBtYXBwaW5nRmlsZVJlZnMKKwkJdGhpcy5pbml0aWFsaXplSW1wbGllZENsYXNzUmVmcygpOworCQl0aGlzLmluaXRpYWxpemVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCX0KKworCS8qKgorCSAqIFRoZXNlIGxpc3RzIGFyZSBqdXN0IGNvcGllcyBvZiB3aGF0IGlzIGRpc3RyaWJ1dGVkIGFjcm9zcyB0aGUgY29udGV4dAorCSAqIG1vZGVsOyBzbywgaWYgdGhleSBoYXZlICh2aXJ0dWFsbHkpIGNoYW5nZWQsIHRoZSByZXN1bHRpbmcgdXBkYXRlIGhhcworCSAqIGFscmVhZHkgYmVlbiB0cmlnZ2VyZWQuIFdlIGRvbid0IG5lZWQgdG8gdHJpZ2dlciBhbm90aGVyIG9uZSBoZXJlLgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZE5vblVwZGF0ZUFzcGVjdE5hbWVzVG8oU2V0PFN0cmluZz4gbm9uVXBkYXRlQXNwZWN0TmFtZXMpIHsKKwkJc3VwZXIuYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhub25VcGRhdGVBc3BlY3ROYW1lcyk7CisJCW5vblVwZGF0ZUFzcGVjdE5hbWVzLmFkZChHRU5FUkFUT1JTX0xJU1QpOworCQlub25VcGRhdGVBc3BlY3ROYW1lcy5hZGQoUVVFUklFU19MSVNUKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSmFyRmlsZVJlZnMoKSB7CisJCWZvciAoWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmIDogdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SmFyRmlsZXMoKSkgeworCQkJdGhpcy5qYXJGaWxlUmVmcy5hZGQodGhpcy5idWlsZEphckZpbGVSZWYoeG1sSmFyRmlsZVJlZikpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7CisJCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKTsKKwkJaWYgKHhtbFByb3BlcnRpZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCWZvciAoWG1sUHJvcGVydHkgeG1sUHJvcGVydHkgOiB4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKSkgeworCQkJdGhpcy5wcm9wZXJ0aWVzLmFkZCh0aGlzLmJ1aWxkUHJvcGVydHkoeG1sUHJvcGVydHkpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRDbGFzc1JlZnMoKSB7CisJCWZvciAoWG1sSmF2YUNsYXNzUmVmIHhtbEphdmFDbGFzc1JlZiA6IHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKSkgeworCQkJdGhpcy5zcGVjaWZpZWRDbGFzc1JlZnMuYWRkKHRoaXMuYnVpbGRDbGFzc1JlZih4bWxKYXZhQ2xhc3NSZWYpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYXBwaW5nRmlsZVJlZnMoKSB7CisJCWZvciAoWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgOiB0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKSkgeworCQkJdGhpcy5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMuYWRkKHRoaXMuYnVpbGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZih4bWxNYXBwaW5nRmlsZVJlZikpOworCQl9CisJCWlmICggISB0aGlzLmltcGxpZWRNYXBwaW5nRmlsZUlzU3BlY2lmaWVkKCkgJiYgdGhpcy5pbXBsaWVkTWFwcGluZ0ZpbGVFeGlzdHMoKSkgeworCQkJdGhpcy5pbXBsaWVkTWFwcGluZ0ZpbGVSZWYgPSB0aGlzLmJ1aWxkSW1wbGllZE1hcHBpbmdGaWxlUmVmKCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSW1wbGllZENsYXNzUmVmcygpIHsKKwkJaWYgKCAhIHRoaXMuZXhjbHVkZXNVbmxpc3RlZENsYXNzZXMoKSkgeworCQkJdGhpcy5pbml0aWFsaXplSW1wbGllZENsYXNzUmVmc18oKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJbXBsaWVkQ2xhc3NSZWZzXygpIHsKKwkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLm1hcHBlZEphdmFTb3VyY2VDbGFzc05hbWVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJU3RyaW5nIHR5cGVOYW1lID0gc3RyZWFtLm5leHQoKTsKKwkJCWlmICggISB0aGlzLnNwZWNpZmllc1BlcnNpc3RlbnRUeXBlKHR5cGVOYW1lKSkgeworCQkJCXRoaXMuaW1wbGllZENsYXNzUmVmcy5hZGQodGhpcy5idWlsZENsYXNzUmVmKHR5cGVOYW1lKSk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB7CisJCU1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZGVmYXVsdHMgPSB0aGlzLmdldERlZmF1bHRzKCk7CisJCXRoaXMuZGVmYXVsdEFjY2VzcyA9IHRoaXMuYnVpbGREZWZhdWx0QWNjZXNzKGRlZmF1bHRzKTsKKwkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZyhkZWZhdWx0cyk7CisJCXRoaXMuZGVmYXVsdFNjaGVtYSA9IHRoaXMuYnVpbGREZWZhdWx0U2NoZW1hKGRlZmF1bHRzKTsKKwkJdGhpcy5kZWZhdWx0Q2FzY2FkZVBlcnNpc3QgPSB0aGlzLmJ1aWxkRGVmYXVsdENhc2NhZGVQZXJzaXN0KGRlZmF1bHRzKTsKKwl9CisKKwlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpIHsKKwkJcmV0dXJuIHRoaXMueG1sUGVyc2lzdGVuY2VVbml0OworCX0KKworCisJLy8gKioqKioqKioqKiBKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUGVyc2lzdGVuY2UgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKFBlcnNpc3RlbmNlKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisKKwkvLyAqKioqKioqKioqIEpwYVN0cnVjdHVyZU5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOQ0VfVU5JVF9JRDsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldFNlbGVjdGlvblRleHRSYW5nZSgpOworCX0KKworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWZvciAoSXRlcmF0b3I8Q2xhc3NSZWY+IHN0cmVhbSA9IHRoaXMuY2xhc3NSZWZzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJc3RyZWFtLm5leHQoKS5kaXNwb3NlKCk7CisJCX0KKwkJZm9yIChJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gc3RyZWFtID0gdGhpcy5tYXBwaW5nRmlsZVJlZnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlzdHJlYW0ubmV4dCgpLmRpc3Bvc2UoKTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldE5hbWUobmFtZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOworCX0KKworCisJLy8gKioqKioqKioqKiB0cmFuc2FjdGlvbiB0eXBlICoqKioqKioqKioKKworCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUgOiB0aGlzLmRlZmF1bHRUcmFuc2FjdGlvblR5cGU7CisJfQorCisJcHVibGljIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSkgeworCQlQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRUcmFuc2FjdGlvblR5cGU7CisJCXRoaXMuc3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlID0gc3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlOworCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXRUcmFuc2FjdGlvblR5cGUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLnRvWG1sUmVzb3VyY2VNb2RlbChzcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUpKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSk7CisJfQorCisJcHVibGljIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXREZWZhdWx0VHJhbnNhY3Rpb25UeXBlKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0VHJhbnNhY3Rpb25UeXBlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUcmFuc2FjdGlvblR5cGUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGRlZmF1bHRUcmFuc2FjdGlvblR5cGUpIHsKKwkJUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIG9sZCA9IHRoaXMuZGVmYXVsdFRyYW5zYWN0aW9uVHlwZTsKKwkJdGhpcy5kZWZhdWx0VHJhbnNhY3Rpb25UeXBlID0gZGVmYXVsdFRyYW5zYWN0aW9uVHlwZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwgb2xkLCBkZWZhdWx0VHJhbnNhY3Rpb25UeXBlKTsKKwl9CisKKworCS8vICoqKioqKioqKiogZGVzY3JpcHRpb24gKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmRlc2NyaXB0aW9uOworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFU0NSSVBUSU9OX1BST1BFUlRZLCBvbGQsIGRlc2NyaXB0aW9uKTsKKwl9CisKKworCS8vICoqKioqKioqKiogcHJvdmlkZXIgKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRQcm92aWRlcigpIHsKKwkJcmV0dXJuIHRoaXMucHJvdmlkZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvdmlkZXIoU3RyaW5nIHByb3ZpZGVyKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnByb3ZpZGVyOworCQl0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7CisJCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3ZpZGVyKHByb3ZpZGVyKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1ZJREVSX1BST1BFUlRZLCBvbGQsIHByb3ZpZGVyKTsKKwl9CisKKworCS8vICoqKioqKioqKiogSlRBL25vbi1KVEEgZGF0YSBzb3VyY2UgKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRKdGFEYXRhU291cmNlKCkgeworCQlyZXR1cm4gdGhpcy5qdGFEYXRhU291cmNlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEp0YURhdGFTb3VyY2UoU3RyaW5nIGp0YURhdGFTb3VyY2UpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuanRhRGF0YVNvdXJjZTsKKwkJdGhpcy5qdGFEYXRhU291cmNlID0ganRhRGF0YVNvdXJjZTsKKwkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuc2V0SnRhRGF0YVNvdXJjZShqdGFEYXRhU291cmNlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSwgb2xkLCBqdGFEYXRhU291cmNlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5vbkp0YURhdGFTb3VyY2UoKSB7CisJCXJldHVybiB0aGlzLm5vbkp0YURhdGFTb3VyY2U7CisJfQorCisJcHVibGljIHZvaWQgc2V0Tm9uSnRhRGF0YVNvdXJjZShTdHJpbmcgbm9uSnRhRGF0YVNvdXJjZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5ub25KdGFEYXRhU291cmNlOworCQl0aGlzLm5vbkp0YURhdGFTb3VyY2UgPSBub25KdGFEYXRhU291cmNlOworCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXROb25KdGFEYXRhU291cmNlKG5vbkp0YURhdGFTb3VyY2UpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9OX0pUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSwgb2xkLCBub25KdGFEYXRhU291cmNlKTsKKwl9CisKKworCS8vICoqKioqKioqKiogbWFwcGluZyBmaWxlIHJlZnMgKioqKioqKioqKgorCisJcHVibGljIExpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gbWFwcGluZ0ZpbGVSZWZzKCkgeworCQlyZXR1cm4gKHRoaXMuaW1wbGllZE1hcHBpbmdGaWxlUmVmID09IG51bGwpID8gdGhpcy5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSA6IHRoaXMuY29tYmluZWRNYXBwaW5nRmlsZVJlZnMoKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmFibGU8TWFwcGluZ0ZpbGVSZWY+IGdldE1hcHBpbmdGaWxlUmVmcygpIHsKKwkJcmV0dXJuICh0aGlzLmltcGxpZWRNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSA/IHRoaXMuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCkgOiB0aGlzLmdldENvbWJpbmVkTWFwcGluZ0ZpbGVSZWZzKCk7CisJfQorCisJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gY29tYmluZWRNYXBwaW5nRmlsZVJlZnMoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPih0aGlzLnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpLCB0aGlzLmltcGxpZWRNYXBwaW5nRmlsZVJlZik7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhYmxlPE1hcHBpbmdGaWxlUmVmPiBnZXRDb21iaW5lZE1hcHBpbmdGaWxlUmVmcygpIHsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxNYXBwaW5nRmlsZVJlZj4odGhpcy5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSwgdGhpcy5pbXBsaWVkTWFwcGluZ0ZpbGVSZWYpOworCX0KKworCXB1YmxpYyBpbnQgbWFwcGluZ0ZpbGVSZWZzU2l6ZSgpIHsKKwkJcmV0dXJuICh0aGlzLmltcGxpZWRNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpIDogdGhpcy5jb21iaW5lZE1hcHBpbmdGaWxlUmVmc1NpemUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgaW50IGNvbWJpbmVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpICsgMTsKKwl9CisKKwlwdWJsaWMgSXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IG1hcHBpbmdGaWxlUmVmc0NvbnRhaW5pbmcoZmluYWwgU3RyaW5nIHR5cGVOYW1lKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWYsIE1hcHBpbmdGaWxlUmVmPiAodGhpcy5tYXBwaW5nRmlsZVJlZnMoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKKwkJCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWYuZ2V0UGVyc2lzdGVudFR5cGUodHlwZU5hbWUpICE9IG51bGw7CisJCQl9CisJCX07CisJfQorCisKKwkvLyAqKioqKioqKioqIHNwZWNpZmllZCBtYXBwaW5nIGZpbGUgcmVmcyAqKioqKioqKioqCisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPiBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+KHRoaXMuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmFibGU8TWFwcGluZ0ZpbGVSZWY+IGdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpIHsKKwkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxNYXBwaW5nRmlsZVJlZj4odGhpcy5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMpOworCX0KKworCXB1YmxpYyBpbnQgc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgTWFwcGluZ0ZpbGVSZWYgYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoKSB7CisJCXJldHVybiB0aGlzLmFkZFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKHRoaXMuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzLnNpemUoKSk7CisJfQorCisJcHVibGljIE1hcHBpbmdGaWxlUmVmIGFkZFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKGludCBpbmRleCkgeworCQlYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZiA9IHRoaXMuYnVpbGRYbWxNYXBwaW5nRmlsZVJlZigpOworCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IHRoaXMuYnVpbGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZih4bWxNYXBwaW5nRmlsZVJlZik7CisJCXRoaXMuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzLmFkZChpbmRleCwgbWFwcGluZ0ZpbGVSZWYpOworCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoaW5kZXgsIHhtbE1hcHBpbmdGaWxlUmVmKTsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKFNQRUNJRklFRF9NQVBQSU5HX0ZJTEVfUkVGU19MSVNULCBpbmRleCwgbWFwcGluZ0ZpbGVSZWYpOworCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWY7CisJfQorCisJcHJvdGVjdGVkIFhtbE1hcHBpbmdGaWxlUmVmIGJ1aWxkWG1sTWFwcGluZ0ZpbGVSZWYoKSB7CisJCXJldHVybiBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKKwkJdGhpcy5yZW1vdmVTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZih0aGlzLnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcy5pbmRleE9mKG1hcHBpbmdGaWxlUmVmKSk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoaW50IGluZGV4KSB7CisJCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gdGhpcy5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMucmVtb3ZlKGluZGV4KTsKKwkJbWFwcGluZ0ZpbGVSZWYuZGlzcG9zZSgpOworCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5yZW1vdmUoaW5kZXgpOworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChTUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRlNfTElTVCwgaW5kZXgsIG1hcHBpbmdGaWxlUmVmKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZl8oTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKKwkJdGhpcy5hZGRJdGVtVG9MaXN0KG1hcHBpbmdGaWxlUmVmLCB0aGlzLnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcywgU1BFQ0lGSUVEX01BUFBJTkdfRklMRV9SRUZTX0xJU1QpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmXyhNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZikgeworCQltYXBwaW5nRmlsZVJlZi5kaXNwb3NlKCk7CisJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KG1hcHBpbmdGaWxlUmVmLCB0aGlzLnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcywgU1BFQ0lGSUVEX01BUFBJTkdfRklMRV9SRUZTX0xJU1QpOworCX0KKworCisJLy8gKioqKioqKioqKiBpbXBsaWVkIG1hcHBpbmcgZmlsZSByZWYgKioqKioqKioqKgorCisJcHVibGljIE1hcHBpbmdGaWxlUmVmIGdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpIHsKKwkJcmV0dXJuIHRoaXMuaW1wbGllZE1hcHBpbmdGaWxlUmVmOworCX0KKworCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBzZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSB7CisJCWlmICh0aGlzLmltcGxpZWRNYXBwaW5nRmlsZVJlZiAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgaW1wbGllZCBtYXBwaW5nIGZpbGUgcmVmIGlzIGFscmVhZHkgc2V0LiIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJdGhpcy5pbXBsaWVkTWFwcGluZ0ZpbGVSZWYgPSB0aGlzLmJ1aWxkSW1wbGllZE1hcHBpbmdGaWxlUmVmKCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJTVBMSUVEX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksIG51bGwsIHRoaXMuaW1wbGllZE1hcHBpbmdGaWxlUmVmKTsKKwkJcmV0dXJuIHRoaXMuaW1wbGllZE1hcHBpbmdGaWxlUmVmOworCX0KKworCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBidWlsZEltcGxpZWRNYXBwaW5nRmlsZVJlZigpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYodGhpcyk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdW5zZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSB7CisJCWlmICh0aGlzLmltcGxpZWRNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgaW1wbGllZCBtYXBwaW5nIGZpbGUgcmVmIGlzIGFscmVhZHkgdW5zZXQuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlNYXBwaW5nRmlsZVJlZiBvbGQgPSB0aGlzLmltcGxpZWRNYXBwaW5nRmlsZVJlZjsKKwkJdGhpcy5pbXBsaWVkTWFwcGluZ0ZpbGVSZWYuZGlzcG9zZSgpOworCQl0aGlzLmltcGxpZWRNYXBwaW5nRmlsZVJlZiA9IG51bGw7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJTVBMSUVEX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksIG9sZCwgbnVsbCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEpBUiBmaWxlIHJlZnMgKioqKioqKioqKgorCisJcHVibGljIExpc3RJdGVyYXRvcjxKYXJGaWxlUmVmPiBqYXJGaWxlUmVmcygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXJGaWxlUmVmPih0aGlzLmphckZpbGVSZWZzKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmFibGU8SmFyRmlsZVJlZj4gZ2V0SmFyRmlsZVJlZnMoKSB7CisJCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SmFyRmlsZVJlZj4odGhpcy5qYXJGaWxlUmVmcyk7CisJfQorCisJcHVibGljIGludCBqYXJGaWxlUmVmc1NpemUoKSB7CisJCXJldHVybiB0aGlzLmphckZpbGVSZWZzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgSmFyRmlsZVJlZiBhZGRKYXJGaWxlUmVmKCkgeworCQlyZXR1cm4gdGhpcy5hZGRKYXJGaWxlUmVmKHRoaXMuamFyRmlsZVJlZnMuc2l6ZSgpKTsKKwl9CisKKwlwdWJsaWMgSmFyRmlsZVJlZiBhZGRKYXJGaWxlUmVmKGludCBpbmRleCkgeworCQlYbWxKYXJGaWxlUmVmIHhtbEphckZpbGVSZWYgPSB0aGlzLmJ1aWxkWG1sSmFyRmlsZVJlZigpOworCQlKYXJGaWxlUmVmIGphckZpbGVSZWYgPSB0aGlzLmJ1aWxkSmFyRmlsZVJlZih4bWxKYXJGaWxlUmVmKTsKKwkJdGhpcy5qYXJGaWxlUmVmcy5hZGQoaW5kZXgsIGphckZpbGVSZWYpOworCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRKYXJGaWxlcygpLmFkZChpbmRleCwgeG1sSmFyRmlsZVJlZik7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChKQVJfRklMRV9SRUZTX0xJU1QsIGluZGV4LCBqYXJGaWxlUmVmKTsKKwkJcmV0dXJuIGphckZpbGVSZWY7CisJfQorCisJcHJvdGVjdGVkIFhtbEphckZpbGVSZWYgYnVpbGRYbWxKYXJGaWxlUmVmKCkgeworCQlyZXR1cm4gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXJGaWxlUmVmKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlSmFyRmlsZVJlZihKYXJGaWxlUmVmIGphckZpbGVSZWYpIHsKKwkJdGhpcy5yZW1vdmVKYXJGaWxlUmVmKHRoaXMuamFyRmlsZVJlZnMuaW5kZXhPZihqYXJGaWxlUmVmKSk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlSmFyRmlsZVJlZihpbnQgaW5kZXgpIHsKKwkJSmFyRmlsZVJlZiBqYXJGaWxlUmVmID0gdGhpcy5qYXJGaWxlUmVmcy5yZW1vdmUoaW5kZXgpOworCQlqYXJGaWxlUmVmLmRpc3Bvc2UoKTsKKwkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SmFyRmlsZXMoKS5yZW1vdmUoaW5kZXgpOworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChKQVJfRklMRV9SRUZTX0xJU1QsIGluZGV4LCBqYXJGaWxlUmVmKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRKYXJGaWxlUmVmXyhKYXJGaWxlUmVmIGphckZpbGVSZWYpIHsKKwkJdGhpcy5hZGRJdGVtVG9MaXN0KGphckZpbGVSZWYsIHRoaXMuamFyRmlsZVJlZnMsIEpBUl9GSUxFX1JFRlNfTElTVCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSmFyRmlsZVJlZl8oSmFyRmlsZVJlZiBqYXJGaWxlUmVmKSB7CisJCWphckZpbGVSZWYuZGlzcG9zZSgpOworCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChqYXJGaWxlUmVmLCB0aGlzLmphckZpbGVSZWZzLCBKQVJfRklMRV9SRUZTX0xJU1QpOworCX0KKworCisJLy8gKioqKioqKioqKiBjbGFzcyByZWZzICoqKioqKioqKioKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzKCkgeworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPENsYXNzUmVmPigKKwkJCQkJCXRoaXMuc3BlY2lmaWVkQ2xhc3NSZWZzKCksCisJCQkJCQl0aGlzLmltcGxpZWRDbGFzc1JlZnMoKQorCQkJCQkpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByb3RlY3RlZCBJdGVyYWJsZTxDbGFzc1JlZj4gZ2V0Q2xhc3NSZWZzKCkgeworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPENsYXNzUmVmPigKKwkJCQkJCXRoaXMuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCksCisJCQkJCQl0aGlzLmdldEltcGxpZWRDbGFzc1JlZnMoKQorCQkJCQkpOworCX0KKworCXB1YmxpYyBpbnQgY2xhc3NSZWZzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ2xhc3NSZWZzLnNpemUoKSArIHRoaXMuaW1wbGllZENsYXNzUmVmcy5zaXplKCk7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlPiBnZXROb25OdWxsQ2xhc3NSZWZQZXJzaXN0ZW50VHlwZXMoKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8UGVyc2lzdGVudFR5cGUsIFBlcnNpc3RlbnRUeXBlPih0aGlzLmdldENsYXNzUmVmUGVyc2lzdGVudFR5cGVzKCksIE5vdE51bGxGaWx0ZXIuPFBlcnNpc3RlbnRUeXBlPmluc3RhbmNlKCkpOworCX0KKworCXByb3RlY3RlZCBJdGVyYWJsZTxQZXJzaXN0ZW50VHlwZT4gZ2V0Q2xhc3NSZWZQZXJzaXN0ZW50VHlwZXMoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxDbGFzc1JlZiwgUGVyc2lzdGVudFR5cGU+KHRoaXMuZ2V0Q2xhc3NSZWZzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFBlcnNpc3RlbnRUeXBlIHRyYW5zZm9ybShDbGFzc1JlZiBjbGFzc1JlZikgeworCQkJCXJldHVybiBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3BlY2lmaWVkIGNsYXNzIHJlZnMgKioqKioqKioqKgorCisJcHVibGljIExpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPENsYXNzUmVmPih0aGlzLnNwZWNpZmllZENsYXNzUmVmcyk7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhYmxlPENsYXNzUmVmPiBnZXRTcGVjaWZpZWRDbGFzc1JlZnMoKSB7CisJCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8Q2xhc3NSZWY+KHRoaXMuc3BlY2lmaWVkQ2xhc3NSZWZzKTsKKwl9CisKKwlwdWJsaWMgaW50IHNwZWNpZmllZENsYXNzUmVmc1NpemUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZENsYXNzUmVmcy5zaXplKCk7CisJfQorCisJcHVibGljIENsYXNzUmVmIGFkZFNwZWNpZmllZENsYXNzUmVmKCkgeworCQlyZXR1cm4gdGhpcy5hZGRTcGVjaWZpZWRDbGFzc1JlZih0aGlzLnNwZWNpZmllZENsYXNzUmVmcy5zaXplKCkpOworCX0KKworCXB1YmxpYyBDbGFzc1JlZiBhZGRTcGVjaWZpZWRDbGFzc1JlZihpbnQgaW5kZXgpIHsKKwkJWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmID0gdGhpcy5idWlsZFhtbEphdmFDbGFzc1JlZigpOworCQlDbGFzc1JlZiBjbGFzc1JlZiA9IHRoaXMuYnVpbGRDbGFzc1JlZih4bWxDbGFzc1JlZik7CisJCXRoaXMuc3BlY2lmaWVkQ2xhc3NSZWZzLmFkZChpbmRleCwgY2xhc3NSZWYpOworCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuYWRkKGluZGV4LCB4bWxDbGFzc1JlZik7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChTUEVDSUZJRURfQ0xBU1NfUkVGU19MSVNULCBpbmRleCwgY2xhc3NSZWYpOworCQlyZXR1cm4gY2xhc3NSZWY7CisJfQorCisJcHJvdGVjdGVkIFhtbEphdmFDbGFzc1JlZiBidWlsZFhtbEphdmFDbGFzc1JlZigpIHsKKwkJcmV0dXJuIFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWYoQ2xhc3NSZWYgY2xhc3NSZWYpIHsKKwkJdGhpcy5yZW1vdmVTcGVjaWZpZWRDbGFzc1JlZih0aGlzLnNwZWNpZmllZENsYXNzUmVmcy5pbmRleE9mKGNsYXNzUmVmKSk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWYoaW50IGluZGV4KSB7CisJCUNsYXNzUmVmIGNsYXNzUmVmID0gdGhpcy5zcGVjaWZpZWRDbGFzc1JlZnMucmVtb3ZlKGluZGV4KTsKKwkJY2xhc3NSZWYuZGlzcG9zZSgpOworCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkucmVtb3ZlKGluZGV4KTsKKwkJdGhpcy5maXJlSXRlbVJlbW92ZWQoU1BFQ0lGSUVEX0NMQVNTX1JFRlNfTElTVCwgaW5kZXgsIGNsYXNzUmVmKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRDbGFzc1JlZl8oQ2xhc3NSZWYgY2xhc3NSZWYpIHsKKwkJdGhpcy5hZGRJdGVtVG9MaXN0KGNsYXNzUmVmLCB0aGlzLnNwZWNpZmllZENsYXNzUmVmcywgU1BFQ0lGSUVEX0NMQVNTX1JFRlNfTElTVCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWZfKENsYXNzUmVmIGNsYXNzUmVmKSB7CisJCWNsYXNzUmVmLmRpc3Bvc2UoKTsKKwkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoY2xhc3NSZWYsIHRoaXMuc3BlY2lmaWVkQ2xhc3NSZWZzLCBTUEVDSUZJRURfQ0xBU1NfUkVGU19MSVNUKTsKKwl9CisKKworCS8vICoqKioqKioqKiogaW1wbGllZCBjbGFzcyByZWZzICoqKioqKioqKioKKworCXB1YmxpYyBJdGVyYXRvcjxDbGFzc1JlZj4gaW1wbGllZENsYXNzUmVmcygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPENsYXNzUmVmPih0aGlzLmltcGxpZWRDbGFzc1JlZnMpOworCX0KKworCXByb3RlY3RlZCBJdGVyYWJsZTxDbGFzc1JlZj4gZ2V0SW1wbGllZENsYXNzUmVmcygpIHsKKwkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxDbGFzc1JlZj4odGhpcy5pbXBsaWVkQ2xhc3NSZWZzKTsKKwl9CisKKwlwdWJsaWMgaW50IGltcGxpZWRDbGFzc1JlZnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5pbXBsaWVkQ2xhc3NSZWZzLnNpemUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgQ2xhc3NSZWYgYWRkSW1wbGllZENsYXNzUmVmKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJQ2xhc3NSZWYgY2xhc3NSZWYgPSB0aGlzLmJ1aWxkQ2xhc3NSZWYoY2xhc3NOYW1lKTsKKwkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKGNsYXNzUmVmLCB0aGlzLmltcGxpZWRDbGFzc1JlZnMsIElNUExJRURfQ0xBU1NfUkVGU19DT0xMRUNUSU9OKTsKKwkJcmV0dXJuIGNsYXNzUmVmOworCX0KKworCXByb3RlY3RlZCBDbGFzc1JlZiBidWlsZENsYXNzUmVmKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRDbGFzc1JlZih0aGlzLCBjbGFzc05hbWUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZUltcGxpZWRDbGFzc1JlZihDbGFzc1JlZiBjbGFzc1JlZikgeworCQljbGFzc1JlZi5kaXNwb3NlKCk7CisJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKGNsYXNzUmVmLCB0aGlzLmltcGxpZWRDbGFzc1JlZnMsIElNUExJRURfQ0xBU1NfUkVGU19DT0xMRUNUSU9OKTsKKwl9CisKKworCS8vICoqKioqKioqKiogZXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzICoqKioqKioqKioKKworCXB1YmxpYyBib29sZWFuIGV4Y2x1ZGVzVW5saXN0ZWRDbGFzc2VzKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3Nlcy5ib29sZWFuVmFsdWUoKSA6IHRoaXMuZ2V0RGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoQm9vbGVhbiBzcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzOworCQl0aGlzLnNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMgPSBzcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzOworCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKHRoaXMuc3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3Nlcyk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMpOworCX0KKworCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkgeworCQlyZXR1cm4gZmFsc2U7ICAvLyA/Pz8KKwl9CisKKworCS8vICoqKioqKioqKiogcHJvcGVydGllcyAqKioqKioqKioqCisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFByb3BlcnR5PiBwcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFByb3BlcnR5Pih0aGlzLnByb3BlcnRpZXMpOworCX0KKworCXByb3RlY3RlZCBJdGVyYWJsZTxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxQcm9wZXJ0eT4odGhpcy5wcm9wZXJ0aWVzKTsKKwl9CisKKwlwdWJsaWMgaW50IHByb3BlcnRpZXNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlpZiAocHJvcGVydHlOYW1lID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCWZvciAoUHJvcGVydHkgcHJvcGVydHkgOiB0aGlzLmdldFByb3BlcnRpZXMoKSkgeworCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMocHJvcGVydHkuZ2V0TmFtZSgpKSkgeworCQkJCXJldHVybiBwcm9wZXJ0eTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgSXRlcmF0b3I8UHJvcGVydHk+IHByb3BlcnRpZXNXaXRoTmFtZVByZWZpeChmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lUHJlZml4KSB7CisJCWlmIChwcm9wZXJ0eU5hbWVQcmVmaXggPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxQcm9wZXJ0eSwgUHJvcGVydHk+KHRoaXMucHJvcGVydGllcygpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChQcm9wZXJ0eSBwcm9wZXJ0eSkgeworCQkJCVN0cmluZyBwTmFtZSA9IHByb3BlcnR5LmdldE5hbWUoKTsKKwkJCQlyZXR1cm4gKHBOYW1lICE9IG51bGwpICYmIHBOYW1lLnN0YXJ0c1dpdGgocHJvcGVydHlOYW1lUHJlZml4KTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwdWJsaWMgUHJvcGVydHkgYWRkUHJvcGVydHkoKSB7CisJCXJldHVybiB0aGlzLmFkZFByb3BlcnR5KHRoaXMucHJvcGVydGllcy5zaXplKCkpOworCX0KKworCXB1YmxpYyBQcm9wZXJ0eSBhZGRQcm9wZXJ0eShpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIHRoaXMuYWRkUHJvcGVydHkodGhpcy5idWlsZFhtbFByb3BlcnR5KCksIGluZGV4KTsKKwl9CisKKwlwcm90ZWN0ZWQgWG1sUHJvcGVydHkgYnVpbGRYbWxQcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydHkoKTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHkgYWRkUHJvcGVydHkoWG1sUHJvcGVydHkgeG1sUHJvcGVydHksIGludCBpbmRleCkgeworCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuYnVpbGRQcm9wZXJ0eSh4bWxQcm9wZXJ0eSk7CisKKwkJWG1sUHJvcGVydGllcyB4bWxQcm9wZXJ0aWVzID0gdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpOworCQlpZiAoeG1sUHJvcGVydGllcyA9PSBudWxsKSB7CisJCQl4bWxQcm9wZXJ0aWVzID0gdGhpcy5idWlsZFhtbFByb3BlcnRpZXMoKTsKKwkJCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnRpZXMoeG1sUHJvcGVydGllcyk7CisJCX0KKworCQl0aGlzLnByb3BlcnRpZXMuYWRkKGluZGV4LCBwcm9wZXJ0eSk7CisJCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZChpbmRleCwgeG1sUHJvcGVydHkpOworCQl0aGlzLmZpcmVJdGVtQWRkZWQoUFJPUEVSVElFU19MSVNULCBpbmRleCwgcHJvcGVydHkpOworCQlpZiAocHJvcGVydHkuZ2V0TmFtZSgpICE9IG51bGwpIHsKKwkJCXRoaXMucHJvcGVydHlBZGRlZChwcm9wZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5LmdldFZhbHVlKCkpOworCQl9CisJCXJldHVybiBwcm9wZXJ0eTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHkgYnVpbGRQcm9wZXJ0eShYbWxQcm9wZXJ0eSB4bWxQcm9wZXJ0eSkgeworCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZFByb3BlcnR5KHRoaXMsIHhtbFByb3BlcnR5KTsKKwl9CisKKwlwcm90ZWN0ZWQgWG1sUHJvcGVydGllcyBidWlsZFhtbFByb3BlcnRpZXMoKSB7CisJCXJldHVybiBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnRpZXMoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlLCBmYWxzZSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGR1cGxpY2F0ZVByb3BlcnR5TmFtZXNBbGxvd2VkKSB7CisJCVByb3BlcnR5IHByZXYgPSB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisJCWlmIChwcmV2ID09IG51bGwpIHsKKwkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJdGhpcy5hZGRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTsgIC8vIGFkZCBbZmlyc3RdIHByb3BlcnR5CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoZHVwbGljYXRlUHJvcGVydHlOYW1lc0FsbG93ZWQpIHsKKwkJCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJCQkvLyBkbyBub3RoaW5nPworCQkJCX0gZWxzZSB7CisJCQkJCXRoaXMuYWRkUHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSk7ICAvLyBhZGQgW2R1cGxpY2F0ZV0gcHJvcGVydHkKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQkJCXRoaXMucmVtb3ZlUHJvcGVydHkocHJldik7ICAvLyByZW1vdmUgZXhpc3RpbmcgcHJvcGVydHkKKwkJCQl9IGVsc2UgeworCQkJCQlwcmV2LnNldFZhbHVlKHZhbHVlKTsgIC8vIGNoYW5nZSBleGlzdGluZyBwcm9wZXJ0eQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB2YWx1ZSkgeworCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuYWRkUHJvcGVydHkoKTsKKwkJcHJvcGVydHkuc2V0TmFtZShwcm9wZXJ0eU5hbWUpOworCQlwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHkoUHJvcGVydHkgcHJvcGVydHkpIHsKKwkJdGhpcy5yZW1vdmVQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eSkpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKwkJfQorCQlmb3IgKExpc3RJdGVyYXRvcjxQcm9wZXJ0eT4gc3RyZWFtID0gdGhpcy5wcm9wZXJ0aWVzLmxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCVByb3BlcnR5IHByb3BlcnR5ID0gc3RyZWFtLm5leHQoKTsKKwkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKHByb3BlcnR5LmdldE5hbWUoKSkpIHsKKwkJCQl0aGlzLnJlbW92ZVByb3BlcnR5KHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHByb3BlcnR5IG5hbWU6ICIgKyBwcm9wZXJ0eU5hbWUpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlKSB7CisJCWlmICgocHJvcGVydHlOYW1lID09IG51bGwpIHx8ICh2YWx1ZSA9PSBudWxsKSkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJZm9yIChMaXN0SXRlcmF0b3I8UHJvcGVydHk+IHN0cmVhbSA9IHRoaXMucHJvcGVydGllcy5saXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IHN0cmVhbS5uZXh0KCk7CisJCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhwcm9wZXJ0eS5nZXROYW1lKCkpICYmIHZhbHVlLmVxdWFscyhwcm9wZXJ0eS5nZXRWYWx1ZSgpKSkgeworCQkJCXRoaXMucmVtb3ZlUHJvcGVydHkoc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgcHJvcGVydHkgbmFtZS92YWx1ZSBwYWlyOiAiICsgcHJvcGVydHlOYW1lICsgIiA9ICIgKyB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZVByb3BlcnR5KGludCBpbmRleCkgeworCQlQcm9wZXJ0eSByZW1vdmVkUHJvcGVydHkgPSB0aGlzLnByb3BlcnRpZXMucmVtb3ZlKGluZGV4KTsKKwkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoaW5kZXgpOworCisJCWlmICh0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmlzRW1wdHkoKSkgeworCQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydGllcyhudWxsKTsKKwkJfQorCisJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFBST1BFUlRJRVNfTElTVCwgaW5kZXgsIHJlbW92ZWRQcm9wZXJ0eSk7CisJCWlmIChyZW1vdmVkUHJvcGVydHkuZ2V0TmFtZSgpICE9IG51bGwpIHsKKwkJCXRoaXMucHJvcGVydHlSZW1vdmVkKHJlbW92ZWRQcm9wZXJ0eS5nZXROYW1lKCkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlfKGludCBpbmRleCwgUHJvcGVydHkgcHJvcGVydHkpIHsKKwkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBwcm9wZXJ0eSwgdGhpcy5wcm9wZXJ0aWVzLCBQUk9QRVJUSUVTX0xJU1QpOworCQlpZiAocHJvcGVydHkuZ2V0TmFtZSgpICE9IG51bGwpIHsKKwkJCXRoaXMucHJvcGVydHlBZGRlZChwcm9wZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5LmdldFZhbHVlKCkpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVByb3BlcnR5XyhpbnQgaW5kZXgpIHsKKwkJcmVtb3ZlUHJvcGVydHlfKHRoaXMucHJvcGVydGllcy5nZXQoaW5kZXgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQcm9wZXJ0eV8oUHJvcGVydHkgcHJvcGVydHkpIHsKKwkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QocHJvcGVydHksIHRoaXMucHJvcGVydGllcywgUFJPUEVSVElFU19MSVNUKTsKKwkJaWYgKHByb3BlcnR5LmdldE5hbWUoKSAhPSBudWxsKSB7CisJCQl0aGlzLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eS5nZXROYW1lKCkpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIG1vdmVQcm9wZXJ0eV8oaW50IGluZGV4LCBQcm9wZXJ0eSBwcm9wZXJ0eSkgeworCQl0aGlzLm1vdmVJdGVtSW5MaXN0KGluZGV4LCB0aGlzLnByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eSksIHRoaXMucHJvcGVydGllcywgUFJPUEVSVElFU19MSVNUKTsKKwl9CisJCisJcHVibGljIHZvaWQgcHJvcGVydHlOYW1lQ2hhbmdlZChTdHJpbmcgb2xkUHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3UHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKG9sZFByb3BlcnR5TmFtZSA9PSBudWxsICYmIHZhbHVlID09IG51bGwpIHsKKwkJCS8vdGhpcyBpcyBhIHByb3BlcnR5IHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGFkZGVkLCB3ZSBkb24ndCBuZWVkIHRvIGRlYWwgd2l0aCBpdCB1bnRpbCB0aGUgdmFsdWUgaXMgc2V0CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKG9sZFByb3BlcnR5TmFtZSAhPSBudWxsKSB7CisJCQl0aGlzLnByb3BlcnR5UmVtb3ZlZChvbGRQcm9wZXJ0eU5hbWUpOworCQl9CisJCWlmIChuZXdQcm9wZXJ0eU5hbWUgIT0gbnVsbCkgeworCQkJdGhpcy5wcm9wZXJ0eUFkZGVkKG5ld1Byb3BlcnR5TmFtZSwgdmFsdWUpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgeworCQkvLyBkbyBub3RoaW5nLCBvdmVycmlkZSBpbiBzdWJjbGFzc2VzIGFzIG5lY2Vzc2FyeQorCX0KKworCXB1YmxpYyB2b2lkIHByb3BlcnR5QWRkZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCB2YWx1ZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQkvLyBkbyBub3RoaW5nLCBvdmVycmlkZSBpbiBzdWJjbGFzc2VzIGFzIG5lY2Vzc2FyeQkJCisJfQorCQorCS8vICoqKioqKioqKiogT1JNIHBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMgKioqKioqKioqKgorCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdEFjY2VzczsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0QWNjZXNzKEFjY2Vzc1R5cGUgZGVmYXVsdEFjY2VzcykgeworCQlBY2Nlc3NUeXBlIG9sZCA9IHRoaXMuZGVmYXVsdEFjY2VzczsKKwkJdGhpcy5kZWZhdWx0QWNjZXNzID0gZGVmYXVsdEFjY2VzczsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUNDRVNTX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRBY2Nlc3MpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDYXRhbG9nKFN0cmluZyBkZWZhdWx0Q2F0YWxvZykgeworCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKKwkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IGRlZmF1bHRDYXRhbG9nOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRDYXRhbG9nKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRTY2hlbWE7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNjaGVtYShTdHJpbmcgZGVmYXVsdFNjaGVtYSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0U2NoZW1hOworCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBkZWZhdWx0U2NoZW1hOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgZGVmYXVsdFNjaGVtYSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdENhc2NhZGVQZXJzaXN0KCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2FzY2FkZVBlcnNpc3Q7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdENhc2NhZGVQZXJzaXN0KGJvb2xlYW4gZGVmYXVsdENhc2NhZGVQZXJzaXN0KSB7CisJCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0Q2FzY2FkZVBlcnNpc3Q7CisJCXRoaXMuZGVmYXVsdENhc2NhZGVQZXJzaXN0ID0gZGVmYXVsdENhc2NhZGVQZXJzaXN0OworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9DQVNDQURFX1BFUlNJU1RfUFJPUEVSVFksIG9sZCwgZGVmYXVsdENhc2NhZGVQZXJzaXN0KTsKKwl9CisKKworCS8vICoqKioqKioqKiogZ2VuZXJhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEdlbmVyYXRvcj4gZ2VuZXJhdG9ycygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxHZW5lcmF0b3I+KHRoaXMuZ2VuZXJhdG9ycyk7CisJfQorCisJcHVibGljIGludCBnZW5lcmF0b3JzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9ycy5zaXplKCk7CisJfQorCisJcHVibGljIHZvaWQgYWRkR2VuZXJhdG9yKEdlbmVyYXRvciBnZW5lcmF0b3IpIHsKKwkJdGhpcy5nZW5lcmF0b3JzLmFkZChnZW5lcmF0b3IpOworCX0KKworCXB1YmxpYyBTdHJpbmdbXSB1bmlxdWVHZW5lcmF0b3JOYW1lcygpIHsKKwkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPih0aGlzLmdlbmVyYXRvcnMuc2l6ZSgpKTsKKwkJdGhpcy5hZGROb25OdWxsR2VuZXJhdG9yTmFtZXNUbyhuYW1lcyk7CisJCXJldHVybiBuYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbbmFtZXMuc2l6ZSgpXSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkTm9uTnVsbEdlbmVyYXRvck5hbWVzVG8oU2V0PFN0cmluZz4gbmFtZXMpIHsKKwkJZm9yIChJdGVyYXRvcjxHZW5lcmF0b3I+IHN0cmVhbSA9IHRoaXMuZ2VuZXJhdG9ycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCVN0cmluZyBnZW5lcmF0b3JOYW1lID0gc3RyZWFtLm5leHQoKS5nZXROYW1lKCk7CisJCQlpZiAoZ2VuZXJhdG9yTmFtZSAhPSBudWxsKSB7CisJCQkJbmFtZXMuYWRkKGdlbmVyYXRvck5hbWUpOworCQkJfQorCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgorCisJcHVibGljIExpc3RJdGVyYXRvcjxRdWVyeT4gcXVlcmllcygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxRdWVyeT4odGhpcy5xdWVyaWVzKTsKKwl9CisKKwlwdWJsaWMgaW50IHF1ZXJpZXNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5xdWVyaWVzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRRdWVyeShRdWVyeSBxdWVyeSkgeworCQl0aGlzLnF1ZXJpZXMuYWRkKHF1ZXJ5KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRSb290V2l0aFN1YkVudGl0aWVzKFN0cmluZyBlbnRpdHlOYW1lKSB7CisJCXRoaXMucm9vdEVudGl0aWVzLmFkZChlbnRpdHlOYW1lKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNSb290V2l0aFN1YkVudGl0aWVzKFN0cmluZyBlbnRpdHlOYW1lKSB7CisJCXJldHVybiB0aGlzLnJvb3RFbnRpdGllcy5jb250YWlucyhlbnRpdHlOYW1lKTsKKwl9CisJCisJLy8gKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqCisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sUGVyc2lzdGVuY2VVbml0IHhwdSkgeworCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdCA9IHhwdTsKKworCQkvLyB0aGUgJ2dlbmVyYXRvcnMnIGFuZCAncXVlcmllcycgbGlzdHMgYXJlIHNpbXBseSBjbGVhcmVkIG91dCB3aXRoIGVhY2gKKwkJLy8gInVwZGF0ZSIgYW5kIGNvbXBsZXRlbHkgcmVidWlsdCBhcyB0aGUgInVwZGF0ZSIgY2FzY2FkZXMgdGhyb3VnaAorCQkvLyB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gV2hlbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzICJ1cGRhdGUiIGlzCisJCS8vIGNvbXBsZXRlLCB0aGUgbGlzdHMgaGF2ZSBiZWVuIHBvcHVsYXRlZCBhbmQgd2UgZmlyZSB0aGUgY2hhbmdlIGV2ZW50LgorCQkvLyBAc2VlICNhZGRHZW5lcmF0b3IoR2VuZXJhdG9yKSAoYW5kIHJlZmVyZW5jZXMpCisJCS8vIEBzZWUgI2FkZFF1ZXJ5KFF1ZXJ5KSAoYW5kIHJlZmVyZW5jZXMpCisJCXRoaXMuZ2VuZXJhdG9ycy5jbGVhcigpOworCQl0aGlzLnF1ZXJpZXMuY2xlYXIoKTsKKworCQl0aGlzLnJvb3RFbnRpdGllcy5jbGVhcigpOworCQkKKwkJdGhpcy5zZXROYW1lKHhwdS5nZXROYW1lKCkpOworCQl0aGlzLnNldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSh0aGlzLmJ1aWxkU3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCkpOworCQl0aGlzLnNldERlZmF1bHRUcmFuc2FjdGlvblR5cGUodGhpcy5idWlsZERlZmF1bHRUcmFuc2FjdGlvblR5cGUoKSk7CisJCXRoaXMuc2V0RGVzY3JpcHRpb24oeHB1LmdldERlc2NyaXB0aW9uKCkpOworCQl0aGlzLnNldFByb3ZpZGVyKHhwdS5nZXRQcm92aWRlcigpKTsKKwkJdGhpcy5zZXRKdGFEYXRhU291cmNlKHhwdS5nZXRKdGFEYXRhU291cmNlKCkpOworCQl0aGlzLnNldE5vbkp0YURhdGFTb3VyY2UoeHB1LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7CisJCXRoaXMudXBkYXRlSmFyRmlsZVJlZnMoKTsKKworCQkvLyB1cGRhdGUgJ3NwZWNpZmllZENsYXNzUmVmcycgYmVmb3JlICdtYXBwaW5nRmlsZVJlZnMnIGJlY2F1c2Ugb2YgCisJCS8vIEpwYUZpbGUgcm9vdFN0cnVjdHVyZU5vZGUsIHdlIHdhbnQgdGhlIG1hcHBpbmcgZmlsZSB0byAid2luIiwKKwkJLy8gYXMgaXQgd291bGQgaW4gYSBKUEEgcnVudGltZSBpbXBsZW1lbnRhdGlvbgorCQl0aGlzLnVwZGF0ZVNwZWNpZmllZENsYXNzUmVmcygpOworCQl0aGlzLnVwZGF0ZU1hcHBpbmdGaWxlUmVmcygpOworCisJCS8vIHVwZGF0ZSAnaW1wbGllZENsYXNzUmVmcycgbGFzdCBzaW5jZSBpdCBkZXBlbmRzIG9uIHRoZSBjb250ZW50cyBvZgorCQkvLyBib3RoICdzcGVjaWZpZWRDbGFzc1JlZnMnIGFuZCAnbWFwcGluZ0ZpbGVSZWZzJworCQl0aGlzLnVwZGF0ZUltcGxpZWRDbGFzc1JlZnMoKTsKKworCQl0aGlzLnNldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoeHB1LmdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7CisJCXRoaXMudXBkYXRlUHJvcGVydGllcygpOworCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisKKwkJLy8gc2VlIGNvbW1lbnQgYXQgdG9wIG9mIG1ldGhvZAorCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChHRU5FUkFUT1JTX0xJU1QsIHRoaXMuZ2VuZXJhdG9ycyk7CisJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFFVRVJJRVNfTElTVCwgdGhpcy5xdWVyaWVzKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcG9zdFVwZGF0ZSgpIHsKKwkJc3VwZXIucG9zdFVwZGF0ZSgpOworCQlmb3IgKENsYXNzUmVmIGNsYXNzUmVmIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuc3BlY2lmaWVkQ2xhc3NSZWZzKCkpKSB7CisJCQljbGFzc1JlZi5wb3N0VXBkYXRlKCk7CisJCX0KKwkJZm9yIChDbGFzc1JlZiBjbGFzc1JlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmltcGxpZWRDbGFzc1JlZnMoKSkpIHsKKwkJCWNsYXNzUmVmLnBvc3RVcGRhdGUoKTsKKwkJfQorCQlmb3IgKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCkpKSB7CisJCQltYXBwaW5nRmlsZVJlZi5wb3N0VXBkYXRlKCk7CisJCX0KKwkJaWYgKHRoaXMuaW1wbGllZE1hcHBpbmdGaWxlUmVmICE9IG51bGwpIHsKKwkJCXRoaXMuaW1wbGllZE1hcHBpbmdGaWxlUmVmLnBvc3RVcGRhdGUoKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGJ1aWxkU3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCkgeworCQlyZXR1cm4gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLmZyb21YbWxSZXNvdXJjZU1vZGVsKHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldFRyYW5zYWN0aW9uVHlwZSgpKTsKKwl9CisKKwkvKioKKwkgKiBUT0RPIC0gY2FsY3VsYXRlIGRlZmF1bHQKKwkgKiBGcm9tIHRoZSBKUEEgc3BlYzogIkluIGEgSmF2YSBFRSBlbnZpcm9ubWVudCwgaWYgdGhpcyBlbGVtZW50IGlzIG5vdAorCSAqIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXMgSlRBLiBJbiBhIEphdmEgU0UgZW52aXJvbm1lbnQsIGlmIHRoaXMgZWxlbWVudAorCSAqIGlzIG5vdCBzcGVjaWZpZWQsIGEgZGVmYXVsdCBvZiBSRVNPVVJDRV9MT0NBTCBtYXkgYmUgYXNzdW1lZC4iCisJICovCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBidWlsZERlZmF1bHRUcmFuc2FjdGlvblR5cGUoKSB7CisJCXJldHVybiBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBOyAvL3JldHVybiBKVEEgZm9yIG5vdywgZml4aW5nIHJlZ3Jlc3Npb24gaW4gYnVnIDI3NzUyNAorCX0KKworCS8qKgorCSAqIFNpbmNlIHRoaXMgaXMgYSAqbGlzdCosIHdlIHNpbXBseSBsb29wIHRocm91Z2ggdGhlIGVsZW1lbnRzIGFuZCBtYXRjaAorCSAqIHRoZSBjb250ZXh0IHRvIHRoZSByZXNvdXJjZSBlbGVtZW50IGJ5IGluZGV4LCBub3QgYnkgbmFtZSBsaWtlIHdlIGRvCisJICogd2l0aCAnaW1wbGllZENsYXNzUmVmcycuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlSmFyRmlsZVJlZnMoKSB7CisJCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBYTUwgZmlsZSByZWZzICh0byBwcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24pCisJCUl0ZXJhdG9yPFhtbEphckZpbGVSZWY+IHhtbEZpbGVSZWZzID0gbmV3IENsb25lSXRlcmF0b3I8WG1sSmFyRmlsZVJlZj4odGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SmFyRmlsZXMoKSk7CisKKwkJZm9yIChJdGVyYXRvcjxKYXJGaWxlUmVmPiBjb250ZXh0RmlsZVJlZnMgPSB0aGlzLmphckZpbGVSZWZzKCk7IGNvbnRleHRGaWxlUmVmcy5oYXNOZXh0KCk7ICkgeworCQkJSmFyRmlsZVJlZiBjb250ZXh0RmlsZVJlZiA9IGNvbnRleHRGaWxlUmVmcy5uZXh0KCk7CisJCQlpZiAoeG1sRmlsZVJlZnMuaGFzTmV4dCgpKSB7CisJCQkJY29udGV4dEZpbGVSZWYudXBkYXRlKHhtbEZpbGVSZWZzLm5leHQoKSk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMucmVtb3ZlSmFyRmlsZVJlZl8oY29udGV4dEZpbGVSZWYpOworCQkJfQorCQl9CisKKwkJd2hpbGUgKHhtbEZpbGVSZWZzLmhhc05leHQoKSkgeworCQkJdGhpcy5hZGRKYXJGaWxlUmVmXyh0aGlzLmJ1aWxkSmFyRmlsZVJlZih4bWxGaWxlUmVmcy5uZXh0KCkpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBKYXJGaWxlUmVmIGJ1aWxkSmFyRmlsZVJlZihYbWxKYXJGaWxlUmVmIHhtbEphckZpbGVSZWYpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRKYXJGaWxlUmVmKHRoaXMsIHhtbEphckZpbGVSZWYpOworCX0KKworCS8qKgorCSAqIFNpbmNlIHRoaXMgaXMgYSAqbGlzdCosIHdlIHNpbXBseSBsb29wIHRocm91Z2ggdGhlIGVsZW1lbnRzIGFuZCBtYXRjaAorCSAqIHRoZSBjb250ZXh0IHRvIHRoZSByZXNvdXJjZSBlbGVtZW50IGJ5IGluZGV4LCBub3QgYnkgbmFtZSBsaWtlIHdlIGRvCisJICogd2l0aCAnaW1wbGllZENsYXNzUmVmcycuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkQ2xhc3NSZWZzKCkgeworCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgWE1MIGNsYXNzIHJlZnMgKHRvIHByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbikKKwkJSXRlcmF0b3I8WG1sSmF2YUNsYXNzUmVmPiB4bWxDbGFzc1JlZnMgPSBuZXcgQ2xvbmVJdGVyYXRvcjxYbWxKYXZhQ2xhc3NSZWY+KHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKSk7CisKKwkJZm9yIChJdGVyYXRvcjxDbGFzc1JlZj4gY29udGV4dENsYXNzUmVmcyA9IHRoaXMuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7IGNvbnRleHRDbGFzc1JlZnMuaGFzTmV4dCgpOyApIHsKKwkJCUNsYXNzUmVmIGNvbnRleHRDbGFzc1JlZiA9IGNvbnRleHRDbGFzc1JlZnMubmV4dCgpOworCQkJaWYgKHhtbENsYXNzUmVmcy5oYXNOZXh0KCkpIHsKKwkJCQljb250ZXh0Q2xhc3NSZWYudXBkYXRlKHhtbENsYXNzUmVmcy5uZXh0KCkpOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLnJlbW92ZVNwZWNpZmllZENsYXNzUmVmXyhjb250ZXh0Q2xhc3NSZWYpOworCQkJfQorCQl9CisKKwkJd2hpbGUgKHhtbENsYXNzUmVmcy5oYXNOZXh0KCkpIHsKKwkJCXRoaXMuYWRkU3BlY2lmaWVkQ2xhc3NSZWZfKHRoaXMuYnVpbGRDbGFzc1JlZih4bWxDbGFzc1JlZnMubmV4dCgpKSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgQ2xhc3NSZWYgYnVpbGRDbGFzc1JlZihYbWxKYXZhQ2xhc3NSZWYgeG1sQ2xhc3NSZWYpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRDbGFzc1JlZih0aGlzLCB4bWxDbGFzc1JlZik7CisJfQorCisJLyoqCisJICogU2luY2UgdGhpcyBpcyBhICpsaXN0Kiwgd2Ugc2ltcGx5IGxvb3AgdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIG1hdGNoCisJICogdGhlIGNvbnRleHQgdG8gdGhlIHJlc291cmNlIGVsZW1lbnQgYnkgaW5kZXgsIG5vdCBieSBuYW1lIGxpa2Ugd2UgZG8KKwkgKiB3aXRoICdpbXBsaWVkQ2xhc3NSZWZzJy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNYXBwaW5nRmlsZVJlZnMoKSB7CisJCS8vIGZpcnN0IHVwZGF0ZSB0aGUgc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWZzLi4uCisJCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBYTUwgZmlsZSByZWZzICh0byBwcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24pCisJCUl0ZXJhdG9yPFhtbE1hcHBpbmdGaWxlUmVmPiB4bWxGaWxlUmVmcyA9IG5ldyBDbG9uZUl0ZXJhdG9yPFhtbE1hcHBpbmdGaWxlUmVmPih0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKSk7CisKKwkJZm9yIChJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gY29udGV4dEZpbGVSZWZzID0gdGhpcy5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKTsgY29udGV4dEZpbGVSZWZzLmhhc05leHQoKTsgKSB7CisJCQlNYXBwaW5nRmlsZVJlZiBjb250ZXh0RmlsZVJlZiA9IGNvbnRleHRGaWxlUmVmcy5uZXh0KCk7CisJCQlpZiAoeG1sRmlsZVJlZnMuaGFzTmV4dCgpKSB7CisJCQkJY29udGV4dEZpbGVSZWYudXBkYXRlKHhtbEZpbGVSZWZzLm5leHQoKSk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMucmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZfKGNvbnRleHRGaWxlUmVmKTsKKwkJCX0KKwkJfQorCisJCXdoaWxlICh4bWxGaWxlUmVmcy5oYXNOZXh0KCkpIHsKKwkJCXRoaXMuYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZfKHRoaXMuYnVpbGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZih4bWxGaWxlUmVmcy5uZXh0KCkpKTsKKwkJfQorCisJCS8vIC4uLnRoZW4gdXBkYXRlIHRoZSBpbXBsaWVkIG1hcHBpbmcgZmlsZSByZWYKKwkJaWYgKHRoaXMuaW1wbGllZE1hcHBpbmdGaWxlSXNTcGVjaWZpZWQoKSkgeworCQkJaWYgKHRoaXMuaW1wbGllZE1hcHBpbmdGaWxlUmVmICE9IG51bGwpIHsKKwkJCQl0aGlzLnVuc2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5pbXBsaWVkTWFwcGluZ0ZpbGVFeGlzdHMoKSkgeworCQkJCWlmICh0aGlzLmltcGxpZWRNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSB7CisJCQkJCXRoaXMuc2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCk7CisJCQkJfQorCQkJCXRoaXMuaW1wbGllZE1hcHBpbmdGaWxlUmVmLnVwZGF0ZShudWxsKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRoaXMuaW1wbGllZE1hcHBpbmdGaWxlUmVmICE9IG51bGwpIHsKKwkJCQkJdGhpcy51bnNldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBidWlsZFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKFhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmKSB7CisJCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkTWFwcGluZ0ZpbGVSZWYodGhpcywgeG1sTWFwcGluZ0ZpbGVSZWYpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGltcGxpZWRNYXBwaW5nRmlsZUlzU3BlY2lmaWVkKCkgeworCQlTdHJpbmcgaW1wbGllZE1hcHBpbmdGaWxlTmFtZSA9IEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSDsKKwkJZm9yIChJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gc3RyZWFtID0gdGhpcy5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlpZiAoaW1wbGllZE1hcHBpbmdGaWxlTmFtZS5lcXVhbHMoc3RyZWFtLm5leHQoKS5nZXRGaWxlTmFtZSgpKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBsaWVkTWFwcGluZ0ZpbGVFeGlzdHMoKSB7CisJCXJldHVybiBnZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkgIT0gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJbXBsaWVkQ2xhc3NSZWZzKCkgeworCQlpZiAodGhpcy5leGNsdWRlc1VubGlzdGVkQ2xhc3NlcygpKSB7CisJCQl0aGlzLmNsZWFySW1wbGllZENsYXNzUmVmc18oKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMudXBkYXRlSW1wbGllZENsYXNzUmVmc18oKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUltcGxpZWRDbGFzc1JlZnNfKCkgeworCQlIYXNoQmFnPENsYXNzUmVmPiBpbXBsaWVkUmVmc1RvUmVtb3ZlID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmltcGxpZWRDbGFzc1JlZnMoKSwgdGhpcy5pbXBsaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKKwkJQXJyYXlMaXN0PENsYXNzUmVmPiBpbXBsaWVkUmVmc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdDxDbGFzc1JlZj4odGhpcy5pbXBsaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKKworCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gbWFwcGVkQ2xhc3NOYW1lcyA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLm1hcHBlZEphdmFTb3VyY2VDbGFzc05hbWVzKCk7IG1hcHBlZENsYXNzTmFtZXMuaGFzTmV4dCgpOyApIHsKKwkJCVN0cmluZyBtYXBwZWRDbGFzc05hbWUgPSBtYXBwZWRDbGFzc05hbWVzLm5leHQoKTsKKwkJCWlmICggISB0aGlzLnNwZWNpZmllc1BlcnNpc3RlbnRUeXBlKG1hcHBlZENsYXNzTmFtZSkpIHsKKwkJCQlib29sZWFuIG1hdGNoID0gZmFsc2U7CisJCQkJZm9yIChJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gaW1wbGllZFJlZnNUb1JlbW92ZS5pdGVyYXRvcigpOyBjbGFzc1JlZnMuaGFzTmV4dCgpOyApIHsKKwkJCQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOworCQkJCQlpZiAobWFwcGVkQ2xhc3NOYW1lLmVxdWFscyhjbGFzc1JlZi5nZXRDbGFzc05hbWUoKSkpIHsKKwkJCQkJCWNsYXNzUmVmcy5yZW1vdmUoKTsKKwkJCQkJCWltcGxpZWRSZWZzVG9VcGRhdGUuYWRkKGNsYXNzUmVmKTsKKwkJCQkJCW1hdGNoID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWlmICggISBtYXRjaCkgeworCQkJCQl0aGlzLmFkZEltcGxpZWRDbGFzc1JlZihtYXBwZWRDbGFzc05hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlmb3IgKENsYXNzUmVmIGNsYXNzUmVmIDogaW1wbGllZFJlZnNUb1JlbW92ZSkgeworCQkJdGhpcy5yZW1vdmVJbXBsaWVkQ2xhc3NSZWYoY2xhc3NSZWYpOworCQl9CisJCS8vIGhhbmRsZSBhZGRpbmcgYW5kIHJlbW92aW5nIGltcGxpZWQgY2xhc3MgcmVmcyBmaXJzdCwgdXBkYXRlIHRoZQorCQkvLyByZW1haW5pbmcgaW1wbGllZCBjbGFzcyByZWZzIGxhc3Q7IHRoaXMgcmVkdWNlcyB0aGUgY2h1cm4gZHVyaW5nICJ1cGRhdGUiCisJCWZvciAoQ2xhc3NSZWYgY2xhc3NSZWYgOiBpbXBsaWVkUmVmc1RvVXBkYXRlKSB7CisJCQljbGFzc1JlZi51cGRhdGUoY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY2xlYXJJbXBsaWVkQ2xhc3NSZWZzXygpIHsKKwkJZm9yIChJdGVyYXRvcjxDbGFzc1JlZj4gc3RyZWFtID0gdGhpcy5pbXBsaWVkQ2xhc3NSZWZzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJdGhpcy5yZW1vdmVJbXBsaWVkQ2xhc3NSZWYoc3RyZWFtLm5leHQoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBNYXRjaCB0aGUgZWxlbWVudHMgYmFzZWQgb24gdGhlIFhtbFByb3BlcnR5IHJlc291cmNlIG9iamVjdCBhbmQgYWxzbyBrZWVwIHRoZSBvcmRlcgorCSAqIHRoZSBzYW1lIGFzIHRoZSBzb3VyY2UuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvcGVydGllcygpIHsJCQorCQlIYXNoQmFnPFByb3BlcnR5PiBjb250ZXh0UHJvcGVydGllc1RvUmVtb3ZlID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLnByb3BlcnRpZXMoKSwgdGhpcy5wcm9wZXJ0aWVzU2l6ZSgpKTsKKwkJaW50IHJlc291cmNlSW5kZXggPSAwOworCQkKKwkJZm9yIChJdGVyYXRvcjxYbWxQcm9wZXJ0eT4geG1sUHJvcGVydGllcyA9IHRoaXMueG1sUHJvcGVydGllcygpOyB4bWxQcm9wZXJ0aWVzLmhhc05leHQoKTsgKSB7CisJCQlYbWxQcm9wZXJ0eSB4bWxQcm9wZXJ0eSA9IHhtbFByb3BlcnRpZXMubmV4dCgpOworCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOworCQkJZm9yIChJdGVyYXRvcjxQcm9wZXJ0eT4gY29udGV4dFByb3BlcnRpZXMgPSBjb250ZXh0UHJvcGVydGllc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGNvbnRleHRQcm9wZXJ0aWVzLmhhc05leHQoKTspIHsKKwkJCQlQcm9wZXJ0eSBjb250ZXh0UHJvcGVydHkgPSBjb250ZXh0UHJvcGVydGllcy5uZXh0KCk7CisJCQkJaWYgKGNvbnRleHRQcm9wZXJ0eS5nZXRYbWxQcm9wZXJ0eSgpID09IHhtbFByb3BlcnR5KSB7CisJCQkJCWNvbnRleHRQcm9wZXJ0aWVzLnJlbW92ZSgpOworCQkJCQl0aGlzLm1vdmVQcm9wZXJ0eV8ocmVzb3VyY2VJbmRleCwgY29udGV4dFByb3BlcnR5KTsKKwkJCQkJY29udGV4dFByb3BlcnR5LnVwZGF0ZSgpOworCQkJCQltYXRjaCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmICggISBtYXRjaCkgeworCQkJCXRoaXMuYWRkUHJvcGVydHlfKHJlc291cmNlSW5kZXgsIHRoaXMuYnVpbGRQcm9wZXJ0eSh4bWxQcm9wZXJ0eSkpOworCQkJfQorCQkJcmVzb3VyY2VJbmRleCsrOworCQl9CisJCWZvciAoUHJvcGVydHkgY29udGV4dFByb3BlcnR5IDogY29udGV4dFByb3BlcnRpZXNUb1JlbW92ZSkgeworCQkJdGhpcy5yZW1vdmVQcm9wZXJ0eV8oY29udGV4dFByb3BlcnR5KTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxYbWxQcm9wZXJ0eT4geG1sUHJvcGVydGllcygpIHsKKwkJWG1sUHJvcGVydGllcyB4bWxQcm9wZXJ0aWVzID0gdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpOworCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgWE1MIHByb3BlcnRpZXMgKHRvIHByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbikKKwkJcmV0dXJuICh4bWxQcm9wZXJ0aWVzICE9IG51bGwpID8gbmV3IENsb25lSXRlcmF0b3I8WG1sUHJvcGVydHk+KHhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpKSA6IEVtcHR5SXRlcmF0b3IuPFhtbFByb3BlcnR5Pmluc3RhbmNlKCk7CisJfQorCQorCXByb3RlY3RlZCBpbnQgeG1sUHJvcGVydGllc1NpemUoKSB7CisJCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKTsKKwkJcmV0dXJuIHhtbFByb3BlcnRpZXMgPT0gbnVsbCA/IDAgOiB4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5zaXplKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB7CisJCU1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZGVmYXVsdHMgPSB0aGlzLmdldERlZmF1bHRzKCk7CisJCXRoaXMuc2V0RGVmYXVsdEFjY2Vzcyh0aGlzLmJ1aWxkRGVmYXVsdEFjY2VzcyhkZWZhdWx0cykpOworCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZyhkZWZhdWx0cykpOworCQl0aGlzLnNldERlZmF1bHRTY2hlbWEodGhpcy5idWlsZERlZmF1bHRTY2hlbWEoZGVmYXVsdHMpKTsKKwkJdGhpcy5zZXREZWZhdWx0Q2FzY2FkZVBlcnNpc3QodGhpcy5idWlsZERlZmF1bHRDYXNjYWRlUGVyc2lzdChkZWZhdWx0cykpOworCX0KKworCS8qKgorCSAqIHJldHVybiB0aGUgZmlyc3QgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cyB3ZSBlbmNvdW50ZXIgaW4gYSBtYXBwaW5nIGZpbGUKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXREZWZhdWx0cygpIHsKKwkJZm9yIChJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gc3RyZWFtID0gdGhpcy5tYXBwaW5nRmlsZVJlZnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IHN0cmVhbS5uZXh0KCk7CisJCQlpZiAobWFwcGluZ0ZpbGVSZWYucGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFeGlzdHMoKSkgeworCQkJCXJldHVybiBtYXBwaW5nRmlsZVJlZi5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGJ1aWxkRGVmYXVsdEFjY2VzcyhNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGRlZmF1bHRzKSB7CisJCXJldHVybiAoZGVmYXVsdHMgPT0gbnVsbCkgPyBudWxsIDogZGVmYXVsdHMuZ2V0QWNjZXNzKCk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDYXRhbG9nKE1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZGVmYXVsdHMpIHsKKwkJU3RyaW5nIGNhdGFsb2cgPSAoZGVmYXVsdHMgPT0gbnVsbCkgPyBudWxsIDogZGVmYXVsdHMuZ2V0Q2F0YWxvZygpOworCQlyZXR1cm4gKGNhdGFsb2cgIT0gbnVsbCkgPyBjYXRhbG9nIDogdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFNjaGVtYShNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGRlZmF1bHRzKSB7CisJCVN0cmluZyBzY2hlbWEgPSAoZGVmYXVsdHMgPT0gbnVsbCkgPyBudWxsIDogZGVmYXVsdHMuZ2V0U2NoZW1hKCk7CisJCXJldHVybiAoc2NoZW1hICE9IG51bGwpID8gc2NoZW1hIDogdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdENhc2NhZGVQZXJzaXN0KE1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZGVmYXVsdHMpIHsKKwkJcmV0dXJuIChkZWZhdWx0cyA9PSBudWxsKSA/IGZhbHNlIDogZGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpOworCX0KKworCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdmFsaWRhdGVNYXBwaW5nRmlsZXMobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdmFsaWRhdGVDbGFzc1JlZnMobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdmFsaWRhdGVKYXJGaWxlUmVmcyhtZXNzYWdlcywgcmVwb3J0ZXIpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFwcGluZ0ZpbGVzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJdGhpcy5jaGVja0Zvck11bHRpcGxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMobWVzc2FnZXMpOworCQl0aGlzLmNoZWNrRm9yRHVwbGljYXRlTWFwcGluZ0ZpbGVzKG1lc3NhZ2VzKTsKKwkJZm9yIChJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gc3RyZWFtID0gdGhpcy5tYXBwaW5nRmlsZVJlZnMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKKwkJCXN0cmVhbS5uZXh0KCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGNoZWNrRm9yTXVsdGlwbGVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gc3RyZWFtID0gbWFwcGluZ0ZpbGVSZWZzKCk7CisJCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7CisJCQlpZiAoc3RyZWFtLm5leHQoKS5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0V4aXN0cygpKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKKwkJCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gc3RyZWFtLm5leHQoKTsKKwkJCWlmIChtYXBwaW5nRmlsZVJlZi5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0V4aXN0cygpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX0ZJTEVfRVhUUkFORU9VU19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTLAorCQkJCQkJbmV3IFN0cmluZ1tdIHttYXBwaW5nRmlsZVJlZi5nZXRGaWxlTmFtZSgpfSwKKwkJCQkJCW1hcHBpbmdGaWxlUmVmCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JEdXBsaWNhdGVNYXBwaW5nRmlsZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKKwkJSGFzaEJhZzxTdHJpbmc+IGZpbGVOYW1lcyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKKwkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChmaWxlTmFtZXMsIHRoaXMubWFwcGluZ0ZpbGVSZWZOYW1lcygpKTsKKwkJZm9yIChJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gc3RyZWFtID0gdGhpcy5tYXBwaW5nRmlsZVJlZnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IHN0cmVhbS5uZXh0KCk7CisJCQlTdHJpbmcgZmlsZU5hbWUgPSBtYXBwaW5nRmlsZVJlZi5nZXRGaWxlTmFtZSgpOworCQkJaWYgKGZpbGVOYW1lcy5jb3VudChmaWxlTmFtZSkgPiAxKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfTUFQUElOR19GSUxFLAorCQkJCQkJbmV3IFN0cmluZ1tdIHtmaWxlTmFtZX0sIAorCQkJCQkJbWFwcGluZ0ZpbGVSZWYsIAorCQkJCQkJbWFwcGluZ0ZpbGVSZWYuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gbWFwcGluZ0ZpbGVSZWZOYW1lcygpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmLCBTdHJpbmc+KHRoaXMubWFwcGluZ0ZpbGVSZWZzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKKwkJCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWYuZ2V0RmlsZU5hbWUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNsYXNzUmVmcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXRoaXMuY2hlY2tGb3JEdXBsaWNhdGVDbGFzc2VzKG1lc3NhZ2VzKTsKKwkJZm9yIChJdGVyYXRvcjxDbGFzc1JlZj4gc3RyZWFtID0gdGhpcy5jbGFzc1JlZnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlzdHJlYW0ubmV4dCgpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja0ZvckR1cGxpY2F0ZUNsYXNzZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKKwkJSGFzaEJhZzxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7CisJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoY2xhc3NOYW1lcywgdGhpcy5jbGFzc1JlZk5hbWVzKCkpOworCQlmb3IgKEl0ZXJhdG9yPENsYXNzUmVmPiBzdHJlYW0gPSB0aGlzLmNsYXNzUmVmcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCUNsYXNzUmVmIGNsYXNzUmVmID0gc3RyZWFtLm5leHQoKTsKKwkJCVN0cmluZyBjbGFzc05hbWUgPSBjbGFzc1JlZi5nZXRDbGFzc05hbWUoKTsKKwkJCWlmICgoY2xhc3NOYW1lICE9IG51bGwpICYmIChjbGFzc05hbWVzLmNvdW50KGNsYXNzTmFtZSkgPiAxKSkgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0NMQVNTLAorCQkJCQkJbmV3IFN0cmluZ1tdIHtjbGFzc05hbWV9LCAKKwkJCQkJCWNsYXNzUmVmLCAKKwkJCQkJCWNsYXNzUmVmLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQorCQkJCQkpCisJCQkJKTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzUmVmTmFtZXMoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxDbGFzc1JlZiwgU3RyaW5nPih0aGlzLmNsYXNzUmVmcygpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKENsYXNzUmVmIGNsYXNzUmVmKSB7CisJCQkJcmV0dXJuIGNsYXNzUmVmLmdldENsYXNzTmFtZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUphckZpbGVSZWZzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJY2hlY2tGb3JEdXBsaWNhdGVKYXJGaWxlUmVmcyhtZXNzYWdlcyk7CisJCWZvciAoSmFyRmlsZVJlZiBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGphckZpbGVSZWZzKCkpKSB7CisJCQllYWNoLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JEdXBsaWNhdGVKYXJGaWxlUmVmcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlIYXNoQmFnPFN0cmluZz4gamFyRmlsZU5hbWVzID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGphckZpbGVOYW1lcywgamFyRmlsZU5hbWVzKCkpOworCQlmb3IgKEphckZpbGVSZWYgamFyRmlsZVJlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShqYXJGaWxlUmVmcygpKSkgeworCQkJU3RyaW5nIGphckZpbGVOYW1lID0gamFyRmlsZVJlZi5nZXRGaWxlTmFtZSgpOworCQkJaWYgKChqYXJGaWxlTmFtZSAhPSBudWxsKSAmJiAoamFyRmlsZU5hbWVzLmNvdW50KGphckZpbGVOYW1lKSA+IDEpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfSkFSX0ZJTEUsCisJCQkJCQluZXcgU3RyaW5nW10ge2phckZpbGVOYW1lfSwgCisJCQkJCQlqYXJGaWxlUmVmLCAKKwkJCQkJCWphckZpbGVSZWYuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQl9CisJfQorCQorCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGphckZpbGVOYW1lcygpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEphckZpbGVSZWYsIFN0cmluZz4oamFyRmlsZVJlZnMoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShKYXJGaWxlUmVmIGphckZpbGVSZWYpIHsKKwkJCQlyZXR1cm4gamFyRmlsZVJlZi5nZXRGaWxlTmFtZSgpOworCQkJfQorCQl9OworCX0KKworCisJLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKKworCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKKwkJZm9yIChJdGVyYXRvcjxKYXJGaWxlUmVmPiBzdHJlYW0gPSB0aGlzLmphckZpbGVSZWZzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJSmFyRmlsZVJlZiBqYXJGaWxlUmVmID0gc3RyZWFtLm5leHQoKTsKKwkJCWlmIChqYXJGaWxlUmVmLmNvbnRhaW5zT2Zmc2V0KHRleHRPZmZzZXQpKSB7CisJCQkJcmV0dXJuIGphckZpbGVSZWY7CisJCQl9CisJCX0KKwkJZm9yIChJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gc3RyZWFtID0gdGhpcy5tYXBwaW5nRmlsZVJlZnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IHN0cmVhbS5uZXh0KCk7CisJCQlpZiAobWFwcGluZ0ZpbGVSZWYuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCkpIHsKKwkJCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWY7CisJCQl9CisJCX0KKwkJZm9yIChJdGVyYXRvcjxDbGFzc1JlZj4gc3RyZWFtID0gdGhpcy5jbGFzc1JlZnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlDbGFzc1JlZiBjbGFzc1JlZiA9IHN0cmVhbS5uZXh0KCk7CisJCQlpZiAoY2xhc3NSZWYuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCkpIHsKKwkJCQlyZXR1cm4gY2xhc3NSZWY7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlQWdhaW5zdERhdGFiYXNlKCkgeworCQlyZXR1cm4gY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9CisKKwlwdWJsaWMgUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7CisJCWZvciAoSXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IHN0cmVhbSA9IHRoaXMubWFwcGluZ0ZpbGVSZWZzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBzdHJlYW0ubmV4dCgpLmdldFBlcnNpc3RlbnRUeXBlKHR5cGVOYW1lKTsKKwkJCWlmIChwZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHBlcnNpc3RlbnRUeXBlOworCQkJfQorCQl9CisJCWZvciAoSXRlcmF0b3I8Q2xhc3NSZWY+IHN0cmVhbSA9IHRoaXMuY2xhc3NSZWZzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBzdHJlYW0ubmV4dCgpOworCQkJaWYgKGNsYXNzUmVmLmlzRm9yKHR5cGVOYW1lKSkgeworCQkJCXJldHVybiBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJCX0KKwkJfQorCQlmb3IgKEl0ZXJhdG9yPEphckZpbGVSZWY+IHN0cmVhbSA9IHRoaXMuamFyRmlsZVJlZnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IHN0cmVhbS5uZXh0KCkuZ2V0UGVyc2lzdGVudFR5cGUodHlwZU5hbWUpOworCQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcGVyc2lzdGVudFR5cGU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIGJvb2xlYW4gc3BlY2lmaWVzUGVyc2lzdGVudFR5cGUoU3RyaW5nIGNsYXNzTmFtZSkgeworCQlmb3IgKEl0ZXJhdG9yPENsYXNzUmVmPiBzdHJlYW0gPSB0aGlzLnNwZWNpZmllZENsYXNzUmVmcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCWlmIChjbGFzc05hbWUuZXF1YWxzKHN0cmVhbS5uZXh0KCkuZ2V0Q2xhc3NOYW1lKCkpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJZm9yIChJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gc3RyZWFtID0gdGhpcy5tYXBwaW5nRmlsZVJlZnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlpZiAoc3RyZWFtLm5leHQoKS5nZXRQZXJzaXN0ZW50VHlwZShjbGFzc05hbWUpICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIEVudGl0eSBnZXRFbnRpdHkoU3RyaW5nIHR5cGVOYW1lKSB7CisJCVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSh0eXBlTmFtZSk7CisJCWlmIChwZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJcmV0dXJuICh0eXBlTWFwcGluZyBpbnN0YW5jZW9mIEVudGl0eSkgPyAoRW50aXR5KSB0eXBlTWFwcGluZyA6IG51bGw7CisJfQorCisJcHVibGljIEVtYmVkZGFibGUgZ2V0RW1iZWRkYWJsZShTdHJpbmcgdHlwZU5hbWUpIHsKKwkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKHR5cGVOYW1lKTsKKwkJaWYgKHBlcnNpc3RlbnRUeXBlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlyZXR1cm4gKHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW1iZWRkYWJsZSkgPyAoRW1iZWRkYWJsZSkgdHlwZU1hcHBpbmcgOiBudWxsOworCX0KKworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KSB7CisJCXJldHVybiAodGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQgIT0gbnVsbCkgJiYgdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzdXBlci50b1N0cmluZyhzYik7CisJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOworCX0KKworCisJLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKgorCisJLyoqCisJICogSWYgd2UgaGF2ZSB0aGUgc2FtZSBwZXJzaXN0ZW50IHR5cGUgaW4gbXVsdGlwbGUgbG9jYXRpb25zLCB0aGUgbGFzdCBvbmUKKwkgKiB3ZSBlbmNvdW50ZXIgd2lucyAoaS5lLiB0aGUgY2xhc3NlcyBpbiB0aGUgb3JtLnhtbCB0YWtlIHByZWNlZGVuY2UpLgorCSAqLworCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplTWV0YW1vZGVsKCkgeworCQlIYXNoTWFwPFN0cmluZywgUGVyc2lzdGVudFR5cGU+IHBlcnNpc3RlbnRUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGVyc2lzdGVudFR5cGU+KCk7CisJCXRoaXMuYWRkQ29udGFpbmVyUGVyc2lzdGVudFR5cGVzVG8odGhpcy5nZXRKYXJGaWxlUmVmcygpLCBwZXJzaXN0ZW50VHlwZXMpOworCQl0aGlzLmFkZFBlcnNpc3RlbnRUeXBlc1RvKHRoaXMuZ2V0Tm9uTnVsbENsYXNzUmVmUGVyc2lzdGVudFR5cGVzKCksIHBlcnNpc3RlbnRUeXBlcyk7CisJCXRoaXMuYWRkQ29udGFpbmVyUGVyc2lzdGVudFR5cGVzVG8odGhpcy5nZXRNYXBwaW5nRmlsZVJlZnMoKSwgcGVyc2lzdGVudFR5cGVzKTsKKwkJZm9yIChQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA6IHBlcnNpc3RlbnRUeXBlcy52YWx1ZXMoKSkgeworCQkJcGVyc2lzdGVudFR5cGUuc3luY2hyb25pemVNZXRhbW9kZWwoKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZENvbnRhaW5lclBlcnNpc3RlbnRUeXBlc1RvKEl0ZXJhYmxlPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZUNvbnRhaW5lcj4gcHRDb250YWluZXJzLCBIYXNoTWFwPFN0cmluZywgUGVyc2lzdGVudFR5cGU+IHBlcnNpc3RlbnRUeXBlTWFwKSB7CisJCWZvciAoUGVyc2lzdGVudFR5cGVDb250YWluZXIgcHRDb250YWluZXIgOiBwdENvbnRhaW5lcnMpIHsKKwkJCXRoaXMuYWRkUGVyc2lzdGVudFR5cGVzVG8ocHRDb250YWluZXIuZ2V0UGVyc2lzdGVudFR5cGVzKCksIHBlcnNpc3RlbnRUeXBlTWFwKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZFBlcnNpc3RlbnRUeXBlc1RvKEl0ZXJhYmxlPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzLCBIYXNoTWFwPFN0cmluZywgUGVyc2lzdGVudFR5cGU+IHBlcnNpc3RlbnRUeXBlTWFwKSB7CisJCWZvciAoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgOiBwZXJzaXN0ZW50VHlwZXMpIHsKKwkJCXBlcnNpc3RlbnRUeXBlTWFwLnB1dChwZXJzaXN0ZW50VHlwZS5nZXROYW1lKCksIHBlcnNpc3RlbnRUeXBlKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjhiMjEwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwzOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOworCisvKioKKyAqICBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBleHRlbmRzIEFic3RyYWN0TW9kZWwKKwkJCQlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKK3sKKwlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQ7CisKKwkvLyBrZXkgPSBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkga2V5OyB2YWx1ZSA9IHByb3BlcnR5IGlkCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXM7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwkKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAvIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKKwlwcm90ZWN0ZWQgQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5pbml0aWFsaXplKHBhcmVudCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0ID0gcGFyZW50OworCQkKKwkJdGhpcy5pbml0aWFsaXplUHJvcGVydHlOYW1lcygpOworCQl0aGlzLmluaXRpYWxpemVQcm9wZXJ0aWVzKCk7CisJCXRoaXMucG9zdEluaXRpYWxpemVQcm9wZXJ0aWVzKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnR5TmFtZXMoKSB7CisJCXRoaXMucHJvcGVydHlOYW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQl0aGlzLmFkZFByb3BlcnR5TmFtZXModGhpcy5wcm9wZXJ0eU5hbWVzKTsKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKKworCS8qKgorICAgICAqIERvZXMgYWxsIHBvc3QgdHJlYXRtZW50IGluIHRoaXMgbWV0aG9kIGFmdGVyIHRoZSBwcm9wZXJ0aWVzIGFyZSBpbml0aWFsaXplZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHBvc3RJbml0aWFsaXplUHJvcGVydGllcygpIHsKKwkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0CisJfQorCisJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCisJcHVibGljIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7CisJCXJldHVybiB0aGlzLnBlcnNpc3RlbmNlVW5pdDsKKwl9CisJCisJcHVibGljIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKKwkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0LmdldEpwYVByb2plY3QoKTsKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcygpIHsKKwkJcmV0dXJuIHRoaXMucHJvcGVydHlOYW1lczsKKwl9CisJLyoqCisJICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHVzZWQgYnkgdGhlIG1ldGhvZHM6IGl0ZW1Jc1Byb3BlcnR5CisJICogYW5kIHByb3BlcnR5SWRGb3IuCisJICogCisJICoga2V5ID0gcHJvcGVydHkga2V5OyB2YWx1ZSA9IHByb3BlcnR5IGlkCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHBOYW1lcyk7CisKKwkvKioKKwkgKiBNZXRob2QgdXNlZCBmb3IgaWRlbnRpZnlpbmcgdGhlIGdpdmVuIHByb3BlcnR5LgorCSAqLworCXB1YmxpYyBib29sZWFuIGl0ZW1Jc1Byb3BlcnR5KFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBpdGVtKSB7CisJCWlmIChpdGVtID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCXJldHVybiB0aGlzLnByb3BlcnR5TmFtZXMoKS5rZXlTZXQoKS5jb250YWlucyhpdGVtLmdldE5hbWUoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZSB1c2VkIGZvciBjaGFuZ2Ugbm90aWZpY2F0aW9uIG9mIHRoZSBnaXZlbgorCSAqIHByb3BlcnR5LgorCSAqLworCXB1YmxpYyBTdHJpbmcgcHJvcGVydHlJZE9mKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSkgeworCQlTdHJpbmcgcHJvcGVydHlJZCA9IHRoaXMucHJvcGVydHlOYW1lcygpLmdldChwcm9wZXJ0eS5nZXROYW1lKCkpOworCQlpZiAocHJvcGVydHlJZCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHByb3BlcnR5OiAiICsgcHJvcGVydHkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIHByb3BlcnR5SWQ7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSBrZXkgb2YgdGhlIGdpdmVuIHByb3BlcnR5IAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgcGVyc2lzdGVuY2VVbml0S2V5T2YoU3RyaW5nIHByb3BlcnR5SWQpIHsKKwkJZm9yIChTdHJpbmcgcGVyc2lzdGVuY2VVbml0S2V5IDogdGhpcy5wcm9wZXJ0eU5hbWVzKCkua2V5U2V0KCkpIHsKKwkJCWlmICh0aGlzLnByb3BlcnR5TmFtZXMoKS5nZXQocGVyc2lzdGVuY2VVbml0S2V5KS5lcXVhbHMocHJvcGVydHlJZCkpIHsKKwkJCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0S2V5OworCQkJfQorCQl9CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgcHJvcGVydHkgSUQ6ICIgKyBwcm9wZXJ0eUlkKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwkvLyAqKioqKioqKiBDb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqCisJLyoqCisJICogUHV0IGludG8gcGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMuCisJICogCisJICogQHBhcmFtIGtleSAtCisJICogICAgICAgICAgICBwcm9wZXJ0eSBuYW1lCisJICogQHBhcmFtIHZhbHVlIC0KKwkgKiAgICAgICAgICAgIHByb3BlcnR5IHZhbHVlCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHV0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7CisJCXRoaXMucHV0UHJvcGVydHkoa2V5LCB2YWx1ZSwgZmFsc2UpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByb3RlY3RlZCB2b2lkIHB1dFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZXMpIHsKKwkJU3RyaW5nIHBlcnNpc3RlbmNlVW5pdEtleSA9IHRoaXMucGVyc2lzdGVuY2VVbml0S2V5T2Yoa2V5KTsKKwkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJiB2YWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKSB7CisJCQl0aGlzLnB1dEVudW1WYWx1ZShwZXJzaXN0ZW5jZVVuaXRLZXksIChFbnVtKSB2YWx1ZSwgYWxsb3dEdXBsaWNhdGVzKTsKKwkJfSAKKwkJZWxzZSB7CisJCQl0aGlzLnB1dFBlcnNpc3RlbmNlVW5pdFByb3BlcnR5KHBlcnNpc3RlbmNlVW5pdEtleSwgbnVsbCwgdmFsdWUsIGFsbG93RHVwbGljYXRlcyk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcHV0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIGtleVN1ZmZpeCwgT2JqZWN0IHZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlcykgeworCQlTdHJpbmcgcGVyc2lzdGVuY2VVbml0S2V5ID0gKGtleVN1ZmZpeCA9PSBudWxsKSA/IGtleSA6IGtleSArIGtleVN1ZmZpeDsKKwkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKHZhbHVlID09IG51bGwpID8gbnVsbCA6IHZhbHVlLnRvU3RyaW5nKCk7CisJCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0UHJvcGVydHkocGVyc2lzdGVuY2VVbml0S2V5LCBzdHJpbmdWYWx1ZSwgYWxsb3dEdXBsaWNhdGVzKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIGEgcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5LgorCSAqIAorCSAqIEBwYXJhbSBrZXkgLQorCSAqICAgICAgICAgICAgcHJvcGVydHkgbmFtZQorCSAqIEBwYXJhbSB2YWx1ZSAtCisJICogICAgICAgICAgICBwcm9wZXJ0eSB2YWx1ZQorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworCQlTdHJpbmcgcGVyc2lzdGVuY2VVbml0S2V5ID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXRLZXlPZihrZXkpOworCQkKKwkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShwZXJzaXN0ZW5jZVVuaXRLZXksIHZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZ2l2ZW4ga2V5IGV4aXRzIGluIHRoZSBQZXJzaXN0ZW5jZVhtbC4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBwZXJzaXN0ZW5jZVVuaXRLZXlFeGlzdHMoU3RyaW5nIHBlcnNpc3RlbmNlVW5pdEtleSkgeworCQlyZXR1cm4gKHRoaXMuZ2V0U3RyaW5nVmFsdWUocGVyc2lzdGVuY2VVbml0S2V5KSAhPSBudWxsKTsKKwl9CisJCisJLy8gKioqKioqIGdldC9zZXQgU3RyaW5nIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgorCS8qKgorCSAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4gUHJvcGVydHkgZnJvbSB0aGUgUGVyc2lzdGVuY2VYbWwuCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdWYWx1ZShTdHJpbmcgcGVyc2lzdGVuY2VVbml0S2V5KSB7CisJCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwZXJzaXN0ZW5jZVVuaXRLZXkpOworCQlyZXR1cm4gKHAgPT0gbnVsbCkgPyBudWxsIDogcC5nZXRWYWx1ZSgpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIGtleVN1ZmZpeCkgeworCQlyZXR1cm4gdGhpcy5nZXRTdHJpbmdWYWx1ZSgoa2V5U3VmZml4ID09IG51bGwpID8ga2V5IDoga2V5ICsga2V5U3VmZml4KTsKKwl9CisKKwkvKioKKwkgKiBQdXQgdGhlIGdpdmVuIFN0cmluZyB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KKwkgKiBAcGFyYW0ga2V5IC0KKwkgKiAgICAgICAgICAgIHByb3BlcnR5IGtleQorCSAqIEBwYXJhbSBuZXdWYWx1ZQorCSAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwdXRTdHJpbmdWYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcgbmV3VmFsdWUpIHsKKwkJdGhpcy5wdXRTdHJpbmdWYWx1ZShrZXksIG51bGwsIG5ld1ZhbHVlLCBmYWxzZSk7CisJfQorCisJLyoqCisJICogUHV0IHRoZSBnaXZlbiBTdHJpbmcgdmFsdWUgaW50byB0aGUgUGVyc2lzdGVuY2VYbWwuCisJICogQHBhcmFtIGtleQorCSAqICAgICAgICAgICAgcHJvcGVydHkga2V5CisJICogQHBhcmFtIG5ld1ZhbHVlCisJICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQorCSAqIEBwYXJhbSBhbGxvd0R1cGxpY2F0ZQorCSAqLworCXByb3RlY3RlZCB2b2lkIHB1dFN0cmluZ1ZhbHVlKFN0cmluZyBrZXksIFN0cmluZyBuZXdWYWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZSkgeworCQl0aGlzLnB1dFN0cmluZ1ZhbHVlKGtleSwgbnVsbCwgbmV3VmFsdWUsIGFsbG93RHVwbGljYXRlKTsKKwl9CisKKwkvKioKKwkgKiBQdXQgdGhlIGdpdmVuIFN0cmluZyB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KKwkgKiBAcGFyYW0ga2V5CisJICogICAgICAgICAgICBwcm9wZXJ0eSBrZXkKKwkgKiBAcGFyYW0ga2V5U3VmZml4CisJICogICAgICAgICAgICBlLmcuIGVudGl0eSBuYW1lCisJICogQHBhcmFtIG5ld1ZhbHVlCisJICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQorCSAqIEBwYXJhbSBhbGxvd0R1cGxpY2F0ZQorCSAqLworCXByb3RlY3RlZCB2b2lkIHB1dFN0cmluZ1ZhbHVlKFN0cmluZyBrZXksIFN0cmluZyBrZXlTdWZmaXgsIFN0cmluZyBuZXdWYWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZSkgeworCQl0aGlzLnB1dFBlcnNpc3RlbmNlVW5pdFByb3BlcnR5KGtleSwga2V5U3VmZml4LCBuZXdWYWx1ZSwgYWxsb3dEdXBsaWNhdGUpOworCX0KKworCS8vICoqKioqKiBJbnRlZ2VyIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgorCS8qKgorCSAqIFJldHVybnMgdGhlIEludGVnZXIgdmFsdWUgb2YgdGhlIGdpdmVuIFByb3BlcnR5IGZyb20gdGhlIFBlcnNpc3RlbmNlWG1sLgorCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyIGdldEludGVnZXJWYWx1ZShTdHJpbmcgcGVyc2lzdGVuY2VVbml0S2V5KSB7CisJCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwZXJzaXN0ZW5jZVVuaXRLZXkpOworCQlyZXR1cm4gKHAgPT0gbnVsbCkgPyBudWxsIDogZ2V0SW50ZWdlclZhbHVlT2YocC5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgSW50ZWdlciBnZXRJbnRlZ2VyVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIGtleVN1ZmZpeCkgeworCQlyZXR1cm4gdGhpcy5nZXRJbnRlZ2VyVmFsdWUoKGtleVN1ZmZpeCA9PSBudWxsKSA/IGtleSA6IGtleSArIGtleVN1ZmZpeCk7CisJfQorCisJLyoqCisJICogUHV0IHRoZSBnaXZlbiBJbnRlZ2VyIHZhbHVlIGludG8gdGhlIFBlcnNpc3RlbmNlWG1sLgorCSAqIEBwYXJhbSBrZXkgLQorCSAqICAgICAgICAgICAgcHJvcGVydHkga2V5CisJICogQHBhcmFtIG5ld1ZhbHVlCisJICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQorCSAqLworCXByb3RlY3RlZCB2b2lkIHB1dEludGVnZXJWYWx1ZShTdHJpbmcga2V5LCBJbnRlZ2VyIG5ld1ZhbHVlKSB7CisJCXRoaXMucHV0SW50ZWdlclZhbHVlKGtleSwgbnVsbCwgbmV3VmFsdWUsIGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBQdXQgdGhlIGdpdmVuIEludGVnZXIgdmFsdWUgaW50byB0aGUgUGVyc2lzdGVuY2VYbWwuCisJICogQHBhcmFtIGtleQorCSAqICAgICAgICAgICAgcHJvcGVydHkga2V5CisJICogQHBhcmFtIG5ld1ZhbHVlCisJICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQorCSAqIEBwYXJhbSBhbGxvd0R1cGxpY2F0ZQorCSAqLworCXByb3RlY3RlZCB2b2lkIHB1dEludGVnZXJWYWx1ZShTdHJpbmcga2V5LCBJbnRlZ2VyIG5ld1ZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlKSB7CisJCXRoaXMucHV0SW50ZWdlclZhbHVlKGtleSwgbnVsbCwgbmV3VmFsdWUsIGFsbG93RHVwbGljYXRlKTsKKwl9CisKKwkvKioKKwkgKiBQdXQgdGhlIGdpdmVuIEludGVnZXIgdmFsdWUgaW50byB0aGUgUGVyc2lzdGVuY2VYbWwuCisJICogQHBhcmFtIGtleQorCSAqICAgICAgICAgICAgcHJvcGVydHkga2V5CisJICogQHBhcmFtIGtleVN1ZmZpeAorCSAqICAgICAgICAgICAgZS5nLiBlbnRpdHkgbmFtZQorCSAqIEBwYXJhbSBuZXdWYWx1ZQorCSAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKKwkgKiBAcGFyYW0gYWxsb3dEdXBsaWNhdGUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwdXRJbnRlZ2VyVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIGtleVN1ZmZpeCwgSW50ZWdlciBuZXdWYWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZSkgeworCQl0aGlzLnB1dFBlcnNpc3RlbmNlVW5pdFByb3BlcnR5KGtleSwga2V5U3VmZml4LCBuZXdWYWx1ZSwgYWxsb3dEdXBsaWNhdGUpOworCX0KKworCS8vICoqKioqKiBCb29sZWFuIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKiAKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBCb29sZWFuIHZhbHVlIG9mIHRoZSBnaXZlbiBQcm9wZXJ0eSBmcm9tIHRoZSBQZXJzaXN0ZW5jZVhtbC4KKwkgKi8KKwlwcm90ZWN0ZWQgQm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoU3RyaW5nIHBlcnNpc3RlbmNlVW5pdEtleSkgeworCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcCA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocGVyc2lzdGVuY2VVbml0S2V5KTsKKwkJcmV0dXJuIChwID09IG51bGwpID8gbnVsbCA6IGdldEJvb2xlYW5WYWx1ZU9mKHAuZ2V0VmFsdWUoKSk7CisJfQorCisJcHJvdGVjdGVkIEJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKFN0cmluZyBrZXksIFN0cmluZyBrZXlTdWZmaXgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhblZhbHVlKChrZXlTdWZmaXggPT0gbnVsbCkgPyBrZXkgOiBrZXkgKyBrZXlTdWZmaXgpOworCX0KKworCS8qKgorCSAqIFB1dCB0aGUgZ2l2ZW4gQm9vbGVhbiB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KKwkgKiBAcGFyYW0ga2V5CisJICogICAgICAgICAgICBwcm9wZXJ0eSBrZXkKKwkgKiBAcGFyYW0gbmV3VmFsdWUKKwkgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5CisJICovCisJcHJvdGVjdGVkIHZvaWQgcHV0Qm9vbGVhblZhbHVlKFN0cmluZyBrZXksIEJvb2xlYW4gbmV3VmFsdWUpIHsKKwkJdGhpcy5wdXRCb29sZWFuVmFsdWUoa2V5LCBudWxsLCBuZXdWYWx1ZSwgZmFsc2UpOworCX0KKworCS8qKgorCSAqIFB1dCB0aGUgZ2l2ZW4gQm9vbGVhbiB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KKwkgKiBAcGFyYW0ga2V5CisJICogICAgICAgICAgICBwcm9wZXJ0eSBrZXkKKwkgKiBAcGFyYW0gbmV3VmFsdWUKKwkgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5CisJICogQHBhcmFtIGFsbG93RHVwbGljYXRlCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHV0Qm9vbGVhblZhbHVlKFN0cmluZyBrZXksIEJvb2xlYW4gbmV3VmFsdWUsIGJvb2xlYW4gYWxsb3dEdXBsaWNhdGUpIHsKKwkJdGhpcy5wdXRCb29sZWFuVmFsdWUoa2V5LCBudWxsLCBuZXdWYWx1ZSwgYWxsb3dEdXBsaWNhdGUpOworCX0KKworCS8qKgorCSAqIFB1dCB0aGUgZ2l2ZW4gQm9vbGVhbiB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KKwkgKiBAcGFyYW0ga2V5CisJICogICAgICAgICAgICBwcm9wZXJ0eSBrZXkKKwkgKiBAcGFyYW0ga2V5U3VmZml4CisJICogICAgICAgICAgICBlLmcuIGVudGl0eSBuYW1lCisJICogQHBhcmFtIG5ld1ZhbHVlCisJICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQorCSAqIEBwYXJhbSBhbGxvd0R1cGxpY2F0ZQorCSAqLworCXByb3RlY3RlZCB2b2lkIHB1dEJvb2xlYW5WYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcga2V5U3VmZml4LCBCb29sZWFuIG5ld1ZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlKSB7CisJCXRoaXMucHV0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkoa2V5LCBrZXlTdWZmaXgsIG5ld1ZhbHVlLCBhbGxvd0R1cGxpY2F0ZSk7CisJfQorCisJLy8gKioqKioqIEVudW0gY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqIAorCS8qKgorCSAqIFJldHVybnMgdGhlIEVudW0gdmFsdWUgb2YgdGhlIGdpdmVuIFByb3BlcnR5IGZyb20gdGhlIFBlcnNpc3RlbmNlWG1sLgorCSAqLworCXByb3RlY3RlZCA8VCBleHRlbmRzIEVudW08VD4+IFQgZ2V0RW51bVZhbHVlKFN0cmluZyBwZXJzaXN0ZW5jZVVuaXRLZXksIFRbXSBlbnVtVmFsdWVzKSB7CisJCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwZXJzaXN0ZW5jZVVuaXRLZXkpOworCQlyZXR1cm4gKHAgPT0gbnVsbCkgPyBudWxsIDogZ2V0RW51bVZhbHVlT2YocC5nZXRWYWx1ZSgpLCBlbnVtVmFsdWVzKTsKKwl9CisKKwlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBFbnVtPFQ+PiBUIGdldEVudW1WYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcga2V5U3VmZml4LCBUW10gZW51bVZhbHVlcykgeworCQlyZXR1cm4gdGhpcy5nZXRFbnVtVmFsdWUoKGtleVN1ZmZpeCA9PSBudWxsKSA/IGtleSA6IGtleSArIGtleVN1ZmZpeCwgZW51bVZhbHVlcyk7CisJfQorCisJLyoqCisJICogUHV0IHRoZSBnaXZlbiBFbnVtIHZhbHVlIGludG8gdGhlIFBlcnNpc3RlbmNlWG1sLgorCSAqIAorCSAqIEBwYXJhbSBrZXkgLQorCSAqICAgICAgICAgICAgcHJvcGVydHkga2V5CisJICovCisJcHJvdGVjdGVkIDxUIGV4dGVuZHMgRW51bTxUPj4gdm9pZCBwdXRFbnVtVmFsdWUoU3RyaW5nIGtleSwgVCBuZXdWYWx1ZSkgeworCQl0aGlzLnB1dEVudW1WYWx1ZShrZXksIG51bGwsIG5ld1ZhbHVlLCBmYWxzZSk7CisJfQorCisJcHJvdGVjdGVkIDxUIGV4dGVuZHMgRW51bTxUPj4gdm9pZCBwdXRFbnVtVmFsdWUoU3RyaW5nIGtleSwgVCBuZXdWYWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZSkgeworCQl0aGlzLnB1dEVudW1WYWx1ZShrZXksIG51bGwsIG5ld1ZhbHVlLCBhbGxvd0R1cGxpY2F0ZSk7CisJfQorCisJcHJvdGVjdGVkIDxUIGV4dGVuZHMgRW51bTxUPj4gdm9pZCBwdXRFbnVtVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIGtleVN1ZmZpeCwgVCBuZXdWYWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZSkgeworCQl0aGlzLnB1dFBlcnNpc3RlbmNlVW5pdFByb3BlcnR5KGtleSwga2V5U3VmZml4LCBnZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YobmV3VmFsdWUpLCBhbGxvd0R1cGxpY2F0ZSk7CisJfQorCisJLy8gKioqKioqIFN0YXRpYyBtZXRob2RzICoqKioqKiogCisJCisJcHVibGljIHN0YXRpYyBCb29sZWFuIGdldEJvb2xlYW5WYWx1ZU9mKFN0cmluZyBwdVN0cmluZ1ZhbHVlKSB7CisJCWlmIChwdVN0cmluZ1ZhbHVlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBCb29sZWFuLnZhbHVlT2YocHVTdHJpbmdWYWx1ZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBJbnRlZ2VyIGdldEludGVnZXJWYWx1ZU9mKFN0cmluZyBwdVN0cmluZ1ZhbHVlKSB7CisJCWlmIChwdVN0cmluZ1ZhbHVlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YocHVTdHJpbmdWYWx1ZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGUgc3BlY2lmaWVkIGVudW0gdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQKKwkgKiBQcm9wZXJ0eSBzdHJpbmcgdmFsdWUuCisJICovCisJcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIEVudW08VD4+IFQgZ2V0RW51bVZhbHVlT2YoU3RyaW5nIHB1U3RyaW5nVmFsdWUsIFRbXSBlbnVtVmFsdWVzKSB7CisJCWZvciAoVCBlbnVtVmFsdWUgOiBlbnVtVmFsdWVzKSB7CisJCQlpZiAoZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKGVudW1WYWx1ZSkuZXF1YWxzKHB1U3RyaW5nVmFsdWUpKSB7CisJCQkJcmV0dXJuIGVudW1WYWx1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBQcm9wZXJ0eSBzdHJpbmcgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5IHZhbHVlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihPYmplY3QgdmFsdWUpIHsKKwkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmICh2YWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKSB7CisJCQlyZXR1cm4gKFN0cmluZykgQ2xhc3NUb29scy5zdGF0aWNGaWVsZFZhbHVlKHZhbHVlLmdldENsYXNzKCksIHZhbHVlLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpKTsKKwkJfQorCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0Fic3RyYWN0UGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3MmVkZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0Fic3RyYWN0UGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LkFic3RyYWN0WG1sQ29udGV4dE5vZGU7CisKKy8qKgorICogVXNlIHRoaXMgYWJzdHJhY3QgY2xhc3MgZm9yIGNvbnRleHQgbm9kZXMgdGhhdCBhcmUgcGFydCBvZiBhbiBPcm1YbWwgZmlsZS4KKyAqIFRoaXMgd2lsbCBub3Qgd29yayBmb3IgcHVyZWx5IE1hcHBpbmdGaWxlIGltcGxlbWVudGF0aW9ucworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlCisJZXh0ZW5kcyBBYnN0cmFjdFhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBYbWxDb250ZXh0Tm9kZQoreworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlKEpwYUNvbnRleHROb2RlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uIGdldFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIChQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24pIGdldEpwYVBsYXRmb3JtKCkuZ2V0UmVzb3VyY2VEZWZpbml0aW9uKGdldFJlc291cmNlVHlwZSgpKTsKKwl9CisJCisJcHVibGljIEVGYWN0b3J5IGdldFJlc291cmNlTm9kZUZhY3RvcnkoKSB7CisJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24oKS5nZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCk7CisJfQorCQorCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBnZXRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7CisJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24oKS5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2MDBhMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0Fic3RyYWN0UGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXJGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5KYXJGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phckZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNDbGFzc1JlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpY0phckZpbGVSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNNYXBwaW5nRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpY1BlcnNpc3RlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUGVyc2lzdGVuY2VVbml0UHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQZXJzaXN0ZW5jZVhtbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2UuSW1wbGllZE1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXJGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5Cit7CisJCisJcHVibGljIFBlcnNpc3RlbmNlWG1sIGJ1aWxkUGVyc2lzdGVuY2VYbWwoSnBhUm9vdENvbnRleHROb2RlIHBhcmVudCwgSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljUGVyc2lzdGVuY2VYbWwocGFyZW50LCByZXNvdXJjZSk7CisJfQorCQorCXB1YmxpYyBQZXJzaXN0ZW5jZSBidWlsZFBlcnNpc3RlbmNlKFBlcnNpc3RlbmNlWG1sIHBhcmVudCwgWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljUGVyc2lzdGVuY2UocGFyZW50LCB4bWxQZXJzaXN0ZW5jZSk7CisJfQorCQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdChwYXJlbnQsIHhtbFBlcnNpc3RlbmNlVW5pdCk7CisJfQorCQorCXB1YmxpYyBNYXBwaW5nRmlsZVJlZiBidWlsZE1hcHBpbmdGaWxlUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY01hcHBpbmdGaWxlUmVmKHBhcmVudCwgeG1sTWFwcGluZ0ZpbGVSZWYpOworCX0KKwkKKwlwdWJsaWMgTWFwcGluZ0ZpbGVSZWYgYnVpbGRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEltcGxpZWRNYXBwaW5nRmlsZVJlZihwYXJlbnQsIEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCApOworCX0KKwkKKwlwdWJsaWMgQ2xhc3NSZWYgYnVpbGRDbGFzc1JlZihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBYbWxKYXZhQ2xhc3NSZWYgY2xhc3NSZWYpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljQ2xhc3NSZWYocGFyZW50LCBjbGFzc1JlZik7CisJfQorCQorCXB1YmxpYyBDbGFzc1JlZiBidWlsZENsYXNzUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFN0cmluZyBjbGFzc05hbWUpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljQ2xhc3NSZWYocGFyZW50LCBjbGFzc05hbWUpOworCX0KKwkKKwlwdWJsaWMgSmFyRmlsZVJlZiBidWlsZEphckZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phckZpbGVSZWYocGFyZW50LCB4bWxKYXJGaWxlUmVmKTsKKwl9CisKKwlwdWJsaWMgSmFyRmlsZSBidWlsZEphckZpbGUoSmFyRmlsZVJlZiBwYXJlbnQsIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QgamFyUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phckZpbGUocGFyZW50LCBqYXJSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QpOworCX0KKwkKKwlwdWJsaWMgUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGJ1aWxkUHJvcGVydHkoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sUHJvcGVydHkgeG1sUHJvcGVydHkpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljUGVyc2lzdGVuY2VVbml0UHJvcGVydHkocGFyZW50LCB4bWxQcm9wZXJ0eSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmMwN2U4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOworCisvKioKKyAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIGRlZmluaXRpb24gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZSBpdCBpcyBpbml0aWFsaXplZCkuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbgorCWltcGxlbWVudHMgUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uCit7CisJCisJcHJpdmF0ZSBmaW5hbCBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5OworCQorCQorCS8qKgorCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZmFjdG9yeSA9IGJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCk7CisJfQorCQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBidWlsZENvbnRleHROb2RlRmFjdG9yeSgpOworCQorCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBnZXRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7CisJCXJldHVybiB0aGlzLmZhY3Rvcnk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY0NsYXNzUmVmLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljQ2xhc3NSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmNjUxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljQ2xhc3NSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBjb250ZXh0IG1vZGVsIG9iamVjdCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgCi0gKiBwZXJzaXN0ZW5jZSByZXNvdXJjZSBtb2RlbCBvYmplY3QgWG1sSmF2YUNsYXNzUmVmLgotICogWG1sSmF2YUNsYXNzUmVmIGNvcnJlc3BvbmRzIHRvIHRoZSBjbGFzcyB0YWcgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0NsYXNzUmVmIGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlIAotCWltcGxlbWVudHMgQ2xhc3NSZWYKLXsKLQkvL3RoaXMgaXMgbnVsbCBmb3IgdGhlIGltcGxpZWQgY2xhc3NSZWYgY2FzZQotCXByb3RlY3RlZCBYbWxKYXZhQ2xhc3NSZWYgeG1sSmF2YUNsYXNzUmVmOwotCQotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lOwotCQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlOwotCQotCQotCXB1YmxpYyBHZW5lcmljQ2xhc3NSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmF2YUNsYXNzUmVmIGNsYXNzUmVmKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCWluaXRpYWxpemUoY2xhc3NSZWYpOwotCX0KLQkKLQlwdWJsaWMgR2VuZXJpY0NsYXNzUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW5pdGlhbGl6ZShjbGFzc05hbWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gUGVyc2lzdGVuY2VTdHJ1Y3R1cmVOb2Rlcy5DTEFTU19SRUZfSUQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRm9yKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCWlmIChnZXRDbGFzc05hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGdldENsYXNzTmFtZSgpLmVxdWFscyhmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gdGhpcy54bWxKYXZhQ2xhc3NSZWYgPT0gbnVsbDsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBjbGFzcyBuYW1lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc05hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgbmV3Q2xhc3NOYW1lKSB7Ci0JCVN0cmluZyBvbGRDbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZTsKLQkJdGhpcy5jbGFzc05hbWUgPSBuZXdDbGFzc05hbWU7Ci0JCXRoaXMueG1sSmF2YUNsYXNzUmVmLnNldEphdmFDbGFzcyhuZXdDbGFzc05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENMQVNTX05BTUVfUFJPUEVSVFksIG9sZENsYXNzTmFtZSwgbmV3Q2xhc3NOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lXyhTdHJpbmcgbmV3Q2xhc3NOYW1lKSB7Ci0JCVN0cmluZyBvbGRDbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZTsKLQkJdGhpcy5jbGFzc05hbWUgPSBuZXdDbGFzc05hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkQ2xhc3NOYW1lLCBuZXdDbGFzc05hbWUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgcGVyc2lzdGVudCB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFQZXJzaXN0ZW50VHlwZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SmF2YVBlcnNpc3RlbnRUeXBlKEphdmFQZXJzaXN0ZW50VHlwZSBuZXdKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIG9sZEphdmFQZXJzaXN0ZW50VHlwZSA9IHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlOwotCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSA9IG5ld0phdmFQZXJzaXN0ZW50VHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDbGFzc1JlZi5KQVZBX1BFUlNJU1RFTlRfVFlQRV9QUk9QRVJUWSwgb2xkSmF2YVBlcnNpc3RlbnRUeXBlLCBuZXdKYXZhUGVyc2lzdGVudFR5cGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxKYXZhQ2xhc3NSZWYgY2xhc3NSZWYpIHsKLQkJdGhpcy54bWxKYXZhQ2xhc3NSZWYgPSBjbGFzc1JlZjsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc1JlZi5nZXRKYXZhQ2xhc3MoKTsKLQkJaW5pdGlhbGl6ZUphdmFQZXJzaXN0ZW50VHlwZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCWluaXRpYWxpemVKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUphdmFQZXJzaXN0ZW50VHlwZSgpIHsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShnZXRDbGFzc05hbWUoKSk7Ci0JCWlmIChwZXJzaXN0ZW50VHlwZVJlc291cmNlICE9IG51bGwpIHsKLQkJCXRoaXMuamF2YVBlcnNpc3RlbnRUeXBlID0gYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUocGVyc2lzdGVudFR5cGVSZXNvdXJjZSk7Ci0JCX0JCQkJCi0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbEphdmFDbGFzc1JlZiBjbGFzc1JlZikgewotCQl0aGlzLnhtbEphdmFDbGFzc1JlZiA9IGNsYXNzUmVmOwotCQlzZXRDbGFzc05hbWVfKGNsYXNzUmVmLmdldEphdmFDbGFzcygpKTsKLQkJdXBkYXRlSmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRoaXMueG1sSmF2YUNsYXNzUmVmID0gbnVsbDsKLQkJc2V0Q2xhc3NOYW1lXyhjbGFzc05hbWUpOwotCQl1cGRhdGVKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSmF2YVBlcnNpc3RlbnRUeXBlKCkgewotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKGdldENsYXNzTmFtZSgpKTsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJaWYgKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpICE9IG51bGwpIHsKLQkJCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlzZXRKYXZhUGVyc2lzdGVudFR5cGUobnVsbCk7Ci0JCX0KLQkJZWxzZSB7IAotCQkJaWYgKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpICE9IG51bGwpIHsKLQkJCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS51cGRhdGUocGVyc2lzdGVudFR5cGVSZXNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRKYXZhUGVyc2lzdGVudFR5cGUoYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUocGVyc2lzdGVudFR5cGVSZXNvdXJjZSkpOwotCQkJfQotCQl9CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFQZXJzaXN0ZW50VHlwZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUodGhpcywgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCWFkZFVuc3BlY2lmaWVkQ2xhc3NNZXNzYWdlKG1lc3NhZ2VzKTsKLQkJYWRkVW5yZXNvbHZlZENsYXNzTWVzc2FnZShtZXNzYWdlcyk7Ci0JCWFkZEphdmFQZXJzaXN0ZW50VHlwZU1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVW5zcGVjaWZpZWRDbGFzc01lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0Q2xhc3NOYW1lKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0NMQVNTLAotCQkJCQl0aGlzLCBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkpCi0JCQkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFVucmVzb2x2ZWRDbGFzc01lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRDbGFzc05hbWUoKSkgJiYgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9DTEFTUywKLQkJCQkJbmV3IFN0cmluZ1tdIHtnZXRDbGFzc05hbWUoKX0sIAotCQkJCQl0aGlzLCAKLQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkpCi0JCQkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFQZXJzaXN0ZW50VHlwZU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmIChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSAhPSBudWxsKSB7IC8vY2xhc3MgbWlnaHQgbm90IHJlc29sdmUgdG8gYSBqYXZhIHR5cGUKLQkJCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gZ2V0TWFwcGluZ0ZpbGVDb250YWluaW5nKGdldENsYXNzTmFtZSgpKTsKLQkJCWlmIChtYXBwaW5nRmlsZVJlZiAhPSBudWxsKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5MT1dfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1JFRFVOREFOVF9DTEFTUywKLQkJCQkJbmV3IFN0cmluZ1tdIHsgdGhpcy5nZXRDbGFzc05hbWUoKSwgbWFwcGluZ0ZpbGVSZWYuZ2V0RmlsZU5hbWUoKX0sCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0cnkgewotCQkJCQkvL2J1ZyAxOTAwNjIgLSBvbmx5IGFkZCBqYXZhIHZhbGlkYXRpb24gbWVzc2FnZXMgaWYgdGhpcyBjbGFzcyBpcyBub3QgbGlzdGVkIGluIGEgbWFwcGluZyBmaWxlCi0JCQkJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJCUpwdENvcmVQbHVnaW4ubG9nKHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvL3Bvc3NpYmx5IG1vdmUgdGhpcyBhbmQgbWFrZSBpdCBBUEkgb24gUGVyc2lzdGVuY2VVbml0Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXBwaW5nIGZpbGUgdGhhdCBjb250YWlucyBhIHBlcnNpc3RlbnQgdHlwZSBmb3IgdGhlIGdpdmVuIAotCSAqIHR5cGUgbmFtZS4gIFJldHVybiBudWxsIGlmIG5vIG1hcHBpbmcgZmlsZSBjb250YWlucyB0aGUgcGVyc2lzdGVudCB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBnZXRNYXBwaW5nRmlsZUNvbnRhaW5pbmcoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJZm9yIChNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShnZXRQZXJzaXN0ZW5jZVVuaXQoKS5tYXBwaW5nRmlsZVJlZnMoKSkpIHsKLQkJCWlmIChtYXBwaW5nRmlsZVJlZi5nZXRQZXJzaXN0ZW50VHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG1hcHBpbmdGaWxlUmVmOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KSB7Ci0JCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLnhtbEphdmFDbGFzc1JlZi5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7Ci0JCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMueG1sSmF2YUNsYXNzUmVmLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMueG1sSmF2YUNsYXNzUmVmLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkgIT0gbnVsbCkgewotCQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZGlzcG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY01hcHBpbmdGaWxlUmVmLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljTWFwcGluZ0ZpbGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzZGUzNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljTWFwcGluZ0ZpbGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLlBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY01hcHBpbmdGaWxlUmVmIGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlIAotCWltcGxlbWVudHMgTWFwcGluZ0ZpbGVSZWYKLXsKLQkvL3RoaXMgaXMgbnVsbCBmb3IgdGhlIGltcGxpZWQgbWFwcGluZ0ZpbGVSZWYgY2FzZQotCXByb3RlY3RlZCBYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZjsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbGVOYW1lOwotCQotCXByb3RlY3RlZCBPcm1YbWwgb3JtWG1sOwotCQotCXB1YmxpYyBHZW5lcmljTWFwcGluZ0ZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5pbml0aWFsaXplKG1hcHBpbmdGaWxlUmVmKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuTUFQUElOR19GSUxFX1JFRl9JRDsKLQl9Ci0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiB4bWxNYXBwaW5nRmlsZVJlZiA9PSBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGZpbGUgbmFtZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBuZXdGaWxlTmFtZSkgewotCQl0aGlzLnhtbE1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKG5ld0ZpbGVOYW1lKTsKLQkJc2V0RmlsZU5hbWVfKG5ld0ZpbGVOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmlsZU5hbWVfKFN0cmluZyBuZXdGaWxlTmFtZSkgewotCQlTdHJpbmcgb2xkRmlsZU5hbWUgPSB0aGlzLmZpbGVOYW1lOwotCQl0aGlzLmZpbGVOYW1lID0gbmV3RmlsZU5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRklMRV9OQU1FX1BST1BFUlRZLCBvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgT3JtWG1sIGdldE9ybVhtbCgpIHsKLQkJcmV0dXJuIHRoaXMub3JtWG1sOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRPcm1YbWwoT3JtWG1sIG5ld09ybVhtbCkgewotCQlPcm1YbWwgb2xkT3JtWG1sID0gdGhpcy5vcm1YbWw7Ci0JCXRoaXMub3JtWG1sID0gbmV3T3JtWG1sOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9STV9YTUxfUFJPUEVSVFksIG9sZE9ybVhtbCwgbmV3T3JtWG1sKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJdGhpcy54bWxNYXBwaW5nRmlsZVJlZiA9IG1hcHBpbmdGaWxlUmVmOwotCQlpbml0aWFsaXplRmlsZU5hbWUoKTsKLQkJaW5pdGlhbGl6ZU9ybVhtbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmlsZU5hbWUoKSB7Ci0JCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJZmlsZU5hbWUgPSBKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmaWxlTmFtZSA9IHhtbE1hcHBpbmdGaWxlUmVmLmdldEZpbGVOYW1lKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9ybVhtbCgpIHsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCU9ybUFydGlmYWN0RWRpdCBvYWUgPSBPcm1BcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJCU9ybVJlc291cmNlIG9ybVJlc291cmNlID0gb2FlLmdldFJlc291cmNlKGZpbGVOYW1lKTsKLQkJCQotCQkJaWYgKG9ybVJlc291cmNlICE9IG51bGwgJiYgb3JtUmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCQlvcm1YbWwgPSBidWlsZE9ybVhtbChvcm1SZXNvdXJjZSk7Ci0JCQl9Ci0JCQlvYWUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKFhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmKSB7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmID0gbWFwcGluZ0ZpbGVSZWY7Ci0JCXVwZGF0ZUZpbGVOYW1lKCk7Ci0JCXVwZGF0ZU9ybVhtbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVGaWxlTmFtZSgpIHsKLQkJaWYgKGlzVmlydHVhbCgpKSB7Ci0JCQlzZXRGaWxlTmFtZV8oSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEZpbGVOYW1lXyh4bWxNYXBwaW5nRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPcm1YbWwoKSB7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJCU9ybUFydGlmYWN0RWRpdCBvYWUgPSBPcm1BcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCU9ybVJlc291cmNlIG9ybVJlc291cmNlID0gb2FlLmdldFJlc291cmNlKEpwdENvcmVQbHVnaW4uZ2V0T3JtWG1sRGVwbG95bWVudFVSSShwcm9qZWN0LCBmaWxlTmFtZSkpOwotCQkJaWYgKG9ybVJlc291cmNlICE9IG51bGwgJiYgb3JtUmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCQlpZiAob3JtWG1sICE9IG51bGwpIHsKLQkJCQkJb3JtWG1sLnVwZGF0ZShvcm1SZXNvdXJjZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZXRPcm1YbWwoYnVpbGRPcm1YbWwob3JtUmVzb3VyY2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZ2V0T3JtWG1sKCkgIT0gbnVsbCkgewotCQkJCQlnZXRPcm1YbWwoKS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCXNldE9ybVhtbChudWxsKTsKLQkJCX0KLQkJCW9hZS5kaXNwb3NlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0T3JtWG1sKCkgIT0gbnVsbCkgewotCQkJCWdldE9ybVhtbCgpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXNldE9ybVhtbChudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgT3JtWG1sIGJ1aWxkT3JtWG1sKE9ybVJlc291cmNlIG9ybVJlc291cmNlKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRPcm1YbWwodGhpcywgb3JtUmVzb3VyY2UpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgewotCQlpZiAoZ2V0T3JtWG1sKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE9ybVhtbCgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlpZiAoZ2V0T3JtWG1sKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldE9ybVhtbCgpLmdldFBlcnNpc3RlbnRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCkgewotCQlpZiAodGhpcy54bWxNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMueG1sTWFwcGluZ0ZpbGVSZWYuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlpZiAoaXNWaXJ0dWFsKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLnhtbE1hcHBpbmdGaWxlUmVmLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCWlmIChpc1ZpcnR1YWwoKSkgewotCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy54bWxNYXBwaW5nRmlsZVJlZi5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQl0aGlzLmFkZFVuc3BlY2lmaWVkTWFwcGluZ0ZpbGVNZXNzYWdlKG1lc3NhZ2VzKTsKLQkJdGhpcy5hZGRVbnJlc29sdmVkTWFwcGluZ0ZpbGVNZXNzYWdlKG1lc3NhZ2VzKTsKLQkJdGhpcy5hZGRJbnZhbGlkTWFwcGluZ0ZpbGVDb250ZW50TWVzc2FnZShtZXNzYWdlcyk7Ci0JCWlmIChnZXRPcm1YbWwoKSAhPSBudWxsKSB7Ci0JCQlnZXRPcm1YbWwoKS5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRVbnNwZWNpZmllZE1hcHBpbmdGaWxlTWVzc2FnZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRGaWxlTmFtZSgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9NQVBQSU5HX0ZJTEUsCi0JCQkJCXRoaXMsIAotCQkJCQlnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkpCi0JCQkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFVucmVzb2x2ZWRNYXBwaW5nRmlsZU1lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKCFTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldEZpbGVOYW1lKCkpICYmIGdldE9ybVhtbCgpID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfTUFQUElOR19GSUxFLAotCQkJCQluZXcgU3RyaW5nW10ge2dldEZpbGVOYW1lKCl9LCAKLQkJCQkJdGhpcywgCi0JCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSkgCi0JCQkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEludmFsaWRNYXBwaW5nRmlsZUNvbnRlbnRNZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmIChnZXRPcm1YbWwoKSAhPSBudWxsIAotCQkJCSYmIGdldE9ybVhtbCgpLmdldEVudGl0eU1hcHBpbmdzKCkgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX01BUFBJTkdfRklMRSwKLQkJCQkJbmV3IFN0cmluZ1tdIHtnZXRGaWxlTmFtZSgpfSwgCi0JCQkJCXRoaXMsCi0JCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKGdldEZpbGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZ2V0T3JtWG1sKCkgIT0gbnVsbCkgewotCQkJZ2V0T3JtWG1sKCkuZGlzcG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY1BlcnNpc3RlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhMWE4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2UgZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlCi17CQotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZTsKLQkKLQkvLyB0aGUgaW1wbGVtZW50YXRpb24gaGVyZSBpcyBhIHNpbmdsZSBwZXJzaXN0ZW5jZSB1bml0LCBhbHRob3VnaCB0aGUgQVBJCi0JLy8gaXMgZm9yIGEgbGlzdC4gIHdlIHdpbGwgd2FudCB0byBzdXBwb3J0IG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzIHNvb24uCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQ7Ci0KLQlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlKFBlcnNpc3RlbmNlWG1sIHBhcmVudCwgWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5pbml0aWFsaXplKHhtbFBlcnNpc3RlbmNlKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOQ0VfSUQ7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBwZXJzaXN0ZW5jZSB1bml0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBwZXJzaXN0ZW5jZVVuaXRzKCkgewotCQlpZiAocGVyc2lzdGVuY2VVbml0ID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4ocGVyc2lzdGVuY2VVbml0KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgaW50IHBlcnNpc3RlbmNlVW5pdHNTaXplKCkgewotCQlyZXR1cm4gKHBlcnNpc3RlbmNlVW5pdCA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGFkZFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIGFkZFBlcnNpc3RlbmNlVW5pdChwZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBhZGRQZXJzaXN0ZW5jZVVuaXQoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA+IDAgfHwgcGVyc2lzdGVuY2VVbml0ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBwZXJzaXN0ZW5jZSB1bml0cy4iKTsKLQkJfQotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0ID0gY3JlYXRlUGVyc2lzdGVuY2VVbml0KHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCXhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5hZGQoeG1sUGVyc2lzdGVuY2VVbml0KTsKLQkJZmlyZUl0ZW1BZGRlZChQRVJTSVNURU5DRV9VTklUU19MSVNULCBpbmRleCwgcGVyc2lzdGVuY2VVbml0KTsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUGVyc2lzdGVuY2VVbml0KFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcmVtb3ZlUGVyc2lzdGVuY2VVbml0KDApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVQZXJzaXN0ZW5jZVVuaXQoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA+IDAgKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5ldyBJbnRlZ2VyKGluZGV4KS50b1N0cmluZygpKTsKLQkJfQotCQlQZXJzaXN0ZW5jZVVuaXQgb2xkUGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0OwotCQlwZXJzaXN0ZW5jZVVuaXQuZGlzcG9zZSgpOwotCQlwZXJzaXN0ZW5jZVVuaXQgPSBudWxsOwotCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFBFUlNJU1RFTkNFX1VOSVRTX0xJU1QsIGluZGV4LCBvbGRQZXJzaXN0ZW5jZVVuaXQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQZXJzaXN0ZW5jZVVuaXRfKFBlcnNpc3RlbmNlVW5pdCBuZXdQZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcGVyc2lzdGVuY2VVbml0ID0gbmV3UGVyc2lzdGVuY2VVbml0OwotCQlmaXJlSXRlbUFkZGVkKFBFUlNJU1RFTkNFX1VOSVRTX0xJU1QsIDAsIHBlcnNpc3RlbmNlVW5pdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVBlcnNpc3RlbmNlVW5pdF8oUGVyc2lzdGVuY2VVbml0IG9sZFBlcnNpc3RlbmNlVW5pdCkgewotCQlwZXJzaXN0ZW5jZVVuaXQuZGlzcG9zZSgpOwotCQlwZXJzaXN0ZW5jZVVuaXQgPSBudWxsOwotCQlmaXJlSXRlbVJlbW92ZWQoUEVSU0lTVEVOQ0VfVU5JVFNfTElTVCwgMCwgb2xkUGVyc2lzdGVuY2VVbml0KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UpIHsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZSA9IHhtbFBlcnNpc3RlbmNlOwotCQlpbml0aWFsaXplUGVyc2lzdGVuY2VVbml0cyh4bWxQZXJzaXN0ZW5jZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQZXJzaXN0ZW5jZVVuaXRzKFhtbFBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlKSB7Ci0JCS8vIG9ubHkgYWRkaW5nIG9uZSBoZXJlLCB1bnRpbCB3ZSBzdXBwb3J0IG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzCi0JCWlmICh4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuc2l6ZSgpID4gMCkgewotCQkJcGVyc2lzdGVuY2VVbml0ID0gY3JlYXRlUGVyc2lzdGVuY2VVbml0KHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5nZXQoMCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSkgewotCQl0aGlzLnhtbFBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2U7Ci0JCWdldEpwYUZpbGUodGhpcy54bWxQZXJzaXN0ZW5jZS5nZXRSZXNvdXJjZSgpLmdldFJlc291cmNlTW9kZWwoKSkuYWRkUm9vdFN0cnVjdHVyZU5vZGUodGhpcywgdGhpcyk7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBudWxsOwotCQlpZiAocGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnNpemUoKSA+IDApIHsKLQkJCXhtbFBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5nZXQoMCk7Ci0JCX0KLQkJCQkKLQkJaWYgKHBlcnNpc3RlbmNlVW5pdCAhPSBudWxsKSB7Ci0JCQlpZiAoeG1sUGVyc2lzdGVuY2VVbml0ICE9IG51bGwpIHsKLQkJCQlwZXJzaXN0ZW5jZVVuaXQudXBkYXRlKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVQZXJzaXN0ZW5jZVVuaXRfKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoeG1sUGVyc2lzdGVuY2VVbml0ICE9IG51bGwpIHsKLQkJCQlhZGRQZXJzaXN0ZW5jZVVuaXRfKGNyZWF0ZVBlcnNpc3RlbmNlVW5pdCh4bWxQZXJzaXN0ZW5jZVVuaXQpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdChYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRQZXJzaXN0ZW5jZVVuaXQodGhpcywgeG1sUGVyc2lzdGVuY2VVbml0KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vIFBlcnNpc3RlbmNlVW5pdCBpbiB0aGlzIGNvbnRleHQiKTsKLQl9Ci0JCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCkgewotCQlmb3IgKFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUocGVyc2lzdGVuY2VVbml0cygpKSkgewotCQkJaWYgKHBlcnNpc3RlbmNlVW5pdC5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KSkgewotCQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3RydWN0dXJlTm9kZSh0ZXh0T2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IHRleHRPZmZzZXQpIHsKLQkJaWYgKHhtbFBlcnNpc3RlbmNlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2UuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2UuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRvTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJc3VwZXIuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCS8vcGVyc2lzdGVuY2Ugcm9vdCB2YWxpZGF0aW9uCi0JCWFkZE5vUGVyc2lzdGVuY2VVbml0TWVzc2FnZShtZXNzYWdlcyk7Ci0JCQotCQkvLyBub3RlIHRvIG5laWwgKG9yIHdob21ldmVyKTogZXh0cmFuZW91cyBwZXJzaXN0ZW5jZSB1bml0cyBjYW4gYmUKLQkJLy8gYWNjZXNzZWQgdGhyb3VnaCB0aGUgWG1sUGVyc2lzdGVuY2UgcmVzb3VyY2Ugb2JqZWN0Ci0JCWFkZE11bHRpcGxlUGVyc2lzdGVuY2VVbml0TWVzc2FnZShtZXNzYWdlcyk7Ci0JCQotCQkKLQkJLy9wZXJzaXN0ZW5jZSB1bml0IHZhbGlkYXRpb24KLQkJaWYgKHBlcnNpc3RlbmNlVW5pdCAhPSBudWxsKSB7Ci0JCQlwZXJzaXN0ZW5jZVVuaXQuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9QZXJzaXN0ZW5jZVVuaXRNZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXQgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfTk9fUEVSU0lTVEVOQ0VfVU5JVCwKLQkJCQkJCXRoaXMsIAotCQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkpCi0JCQkJKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNdWx0aXBsZVBlcnNpc3RlbmNlVW5pdE1lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKHhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5zaXplKCkgPiAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfTVVMVElQTEVfUEVSU0lTVEVOQ0VfVU5JVFMsCi0JCQkJCQl0aGlzLCAKLQkJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZ2V0SnBhRmlsZSh0aGlzLnhtbFBlcnNpc3RlbmNlLmdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VNb2RlbCgpKS5yZW1vdmVSb290U3RydWN0dXJlTm9kZSh0aGlzKTsKLQkJZm9yIChQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0IDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHBlcnNpc3RlbmNlVW5pdHMoKSkpIHsKLQkJCXBlcnNpc3RlbmNlVW5pdC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VVbml0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VVbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzI0MDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2VVbml0IGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVVuaXQKLXsKLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdDsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBzcGVjaWZpZWRUcmFuc2FjdGlvblR5cGU7Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBkZWZhdWx0VHJhbnNhY3Rpb25UeXBlOwotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBwcm92aWRlcjsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGp0YURhdGFTb3VyY2U7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBub25KdGFEYXRhU291cmNlOwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE1hcHBpbmdGaWxlUmVmPiBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnM7Ci0JCi0JcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmIGltcGxpZWRNYXBwaW5nRmlsZVJlZjsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzOwotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PENsYXNzUmVmPiBpbXBsaWVkQ2xhc3NSZWZzOwotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXM7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQkKLQkvKiBnbG9iYWwgZ2VuZXJhdG9yIGRlZmluaXRpb25zLCBkZWZpbmVkIGVsc2V3aGVyZSBpbiBtb2RlbCAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0PEdlbmVyYXRvcj4gZ2VuZXJhdG9yczsKLQkKLQkvKiBnbG9iYWwgcXVlcnkgZGVmaW5pdGlvbnMsIGRlZmluZWQgZWxzZXdoZXJlIGluIG1vZGVsICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8UXVlcnk+IHF1ZXJpZXM7Ci0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2c7Ci0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZGVmYXVsdEFjY2VzczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0Q2FzY2FkZVBlcnNpc3Q7Ci0JCi0JcHVibGljIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzID0gbmV3IEFycmF5TGlzdDxNYXBwaW5nRmlsZVJlZj4oKTsKLQkJdGhpcy5zcGVjaWZpZWRDbGFzc1JlZnMgPSBuZXcgQXJyYXlMaXN0PENsYXNzUmVmPigpOwotCQl0aGlzLmltcGxpZWRDbGFzc1JlZnMgPSBuZXcgQXJyYXlMaXN0PENsYXNzUmVmPigpOwotCQl0aGlzLnByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5PigpOwotCQl0aGlzLmdlbmVyYXRvcnMgPSBuZXcgQXJyYXlMaXN0PEdlbmVyYXRvcj4oKTsKLQkJdGhpcy5xdWVyaWVzID0gbmV3IEFycmF5TGlzdDxRdWVyeT4oKTsKLQkJdGhpcy5pbml0aWFsaXplKHBlcnNpc3RlbmNlVW5pdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE5vblVwZGF0ZUFzcGVjdE5hbWVzVG8oU2V0PFN0cmluZz4gbm9uVXBkYXRlQXNwZWN0TmFtZXMpIHsKLQkJc3VwZXIuYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhub25VcGRhdGVBc3BlY3ROYW1lcyk7Ci0JCW5vblVwZGF0ZUFzcGVjdE5hbWVzLmFkZChHRU5FUkFUT1JTX0xJU1QpOwotCQlub25VcGRhdGVBc3BlY3ROYW1lcy5hZGQoUVVFUklFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOQ0VfVU5JVF9JRDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogcGFyZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVuY2UgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBuYW1lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZShuZXdOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB0cmFuc2FjdGlvbiB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gKGlzVHJhbnNhY3Rpb25UeXBlRGVmYXVsdCgpKSA/Ci0JCQlnZXREZWZhdWx0VHJhbnNhY3Rpb25UeXBlKCkgOiBnZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBuZXdUcmFuc2FjdGlvblR5cGUpIHsKLQkJUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRoaXMuc3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlOwotCQl0aGlzLnNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSA9IG5ld1RyYW5zYWN0aW9uVHlwZTsJCQotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXRUcmFuc2FjdGlvblR5cGUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLnRvWG1sUmVzb3VyY2VNb2RlbChuZXdUcmFuc2FjdGlvblR5cGUpKTsJCQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZLCBvbGRUcmFuc2FjdGlvblR5cGUsIG5ld1RyYW5zYWN0aW9uVHlwZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVHJhbnNhY3Rpb25UeXBlRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlID09IG51bGw7Ci0JfQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0RGVmYXVsdFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRyYW5zYWN0aW9uVHlwZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFRyYW5zYWN0aW9uVHlwZShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgbmV3VHJhbnNhY3Rpb25UeXBlKSB7Ci0JCVBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBvbGRUcmFuc2FjdGlvblR5cGUgPSB0aGlzLmRlZmF1bHRUcmFuc2FjdGlvblR5cGU7Ci0JCXRoaXMuZGVmYXVsdFRyYW5zYWN0aW9uVHlwZSA9IG5ld1RyYW5zYWN0aW9uVHlwZTsJCQotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwgb2xkVHJhbnNhY3Rpb25UeXBlLCBuZXdUcmFuc2FjdGlvblR5cGUpOwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIGRlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERVNDUklQVElPTl9QUk9QRVJUWSwgb2xkRGVzY3JpcHRpb24sIG5ld0Rlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBwcm92aWRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnByb3ZpZGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm92aWRlcihTdHJpbmcgbmV3UHJvdmlkZXIpIHsKLQkJU3RyaW5nIG9sZFByb3ZpZGVyID0gdGhpcy5wcm92aWRlcjsKLQkJdGhpcy5wcm92aWRlciA9IG5ld1Byb3ZpZGVyOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXRQcm92aWRlcihuZXdQcm92aWRlcik7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPVklERVJfUFJPUEVSVFksIG9sZFByb3ZpZGVyLCBuZXdQcm92aWRlcik7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKioganRhIGRhdGEgc291cmNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEp0YURhdGFTb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmp0YURhdGFTb3VyY2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEp0YURhdGFTb3VyY2UoU3RyaW5nIG5ld0p0YURhdGFTb3VyY2UpIHsKLQkJU3RyaW5nIG9sZEp0YURhdGFTb3VyY2UgPSB0aGlzLmp0YURhdGFTb3VyY2U7Ci0JCXRoaXMuanRhRGF0YVNvdXJjZSA9IG5ld0p0YURhdGFTb3VyY2U7Ci0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldEp0YURhdGFTb3VyY2UobmV3SnRhRGF0YVNvdXJjZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZLCBvbGRKdGFEYXRhU291cmNlLCBuZXdKdGFEYXRhU291cmNlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBub24tanRhIGRhdGEgc291cmNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMubm9uSnRhRGF0YVNvdXJjZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Tm9uSnRhRGF0YVNvdXJjZShTdHJpbmcgbmV3Tm9uSnRhRGF0YVNvdXJjZSkgewotCQlTdHJpbmcgb2xkTm9uSnRhRGF0YVNvdXJjZSA9IHRoaXMubm9uSnRhRGF0YVNvdXJjZTsKLQkJdGhpcy5ub25KdGFEYXRhU291cmNlID0gbmV3Tm9uSnRhRGF0YVNvdXJjZTsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuc2V0Tm9uSnRhRGF0YVNvdXJjZShuZXdOb25KdGFEYXRhU291cmNlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOT05fSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZLCBvbGROb25KdGFEYXRhU291cmNlLCBuZXdOb25KdGFEYXRhU291cmNlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBtYXBwaW5nIGZpbGUgcmVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IG1hcHBpbmdGaWxlUmVmcygpIHsKLQkJaWYgKGltcGxpZWRNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPigKLQkJCQlzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSwgaW1wbGllZE1hcHBpbmdGaWxlUmVmKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgaW50IG1hcHBpbmdGaWxlUmVmc1NpemUoKSB7Ci0JCWlmIChpbXBsaWVkTWFwcGluZ0ZpbGVSZWYgPT0gbnVsbCkgewotCQkJcmV0dXJuIHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKTsKLQkJfQotCQlyZXR1cm4gMSArIHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqKioqKioqIHNwZWNpZmllZCBtYXBwaW5nIGZpbGUgcmVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPihzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKSB7Ci0JCXJldHVybiBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgTWFwcGluZ0ZpbGVSZWYgYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoKSB7Ci0JCXJldHVybiBhZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZihzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIE1hcHBpbmdGaWxlUmVmIGFkZFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKGludCBpbmRleCkgewotCQlYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBidWlsZE1hcHBpbmdGaWxlUmVmKHhtbE1hcHBpbmdGaWxlUmVmKTsKLQkJc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzLmFkZChpbmRleCwgbWFwcGluZ0ZpbGVSZWYpOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoaW5kZXgsIHhtbE1hcHBpbmdGaWxlUmVmKTsKLQkJZmlyZUl0ZW1BZGRlZChTUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRl9MSVNULCBpbmRleCwgbWFwcGluZ0ZpbGVSZWYpOwotCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWY7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmKSB7Ci0JCXJlbW92ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcy5pbmRleE9mKG1hcHBpbmdGaWxlUmVmKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKGludCBpbmRleCkgewotCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZlJlbW92ZWQgPSBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMucmVtb3ZlKGluZGV4KTsKLQkJbWFwcGluZ0ZpbGVSZWZSZW1vdmVkLmRpc3Bvc2UoKTsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFNQRUNJRklFRF9NQVBQSU5HX0ZJTEVfUkVGX0xJU1QsIGluZGV4LCBtYXBwaW5nRmlsZVJlZlJlbW92ZWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZl8oTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZfKHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcy5zaXplKCksIG1hcHBpbmdGaWxlUmVmKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZfKGludCBpbmRleCwgTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgbWFwcGluZ0ZpbGVSZWYsIHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcywgU1BFQ0lGSUVEX01BUFBJTkdfRklMRV9SRUZfTElTVCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmXyhNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZikgewotCQlyZW1vdmVTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZl8oc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzLmluZGV4T2YobWFwcGluZ0ZpbGVSZWYpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZfKGludCBpbmRleCkgewotCQlzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMuZ2V0KGluZGV4KS5kaXNwb3NlKCk7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzLCBTUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRl9MSVNUKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBpbXBsaWVkIG1hcHBpbmcgZmlsZSByZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBNYXBwaW5nRmlsZVJlZiBnZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSB7Ci0JCXJldHVybiBpbXBsaWVkTWFwcGluZ0ZpbGVSZWY7Ci0JfQotCQotCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBzZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSB7Ci0JCWlmIChpbXBsaWVkTWFwcGluZ0ZpbGVSZWYgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGltcGxpZWQgbWFwcGluZyBmaWxlIHJlZiBpcyBhbHJlYWR5IHNldC4iKTsKLQkJfQotCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IGJ1aWxkTWFwcGluZ0ZpbGVSZWYobnVsbCk7Ci0JCWltcGxpZWRNYXBwaW5nRmlsZVJlZiA9IG1hcHBpbmdGaWxlUmVmOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElNUExJRURfTUFQUElOR19GSUxFX1JFRl9QUk9QRVJUWSwgbnVsbCwgbWFwcGluZ0ZpbGVSZWYpOwotCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWY7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVuc2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkgewotCQlpZiAoaW1wbGllZE1hcHBpbmdGaWxlUmVmID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBpbXBsaWVkIG1hcHBpbmcgZmlsZSByZWYgaXMgYWxyZWFkeSB1bnNldC4iKTsKLQkJfQotCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IGltcGxpZWRNYXBwaW5nRmlsZVJlZjsKLQkJaW1wbGllZE1hcHBpbmdGaWxlUmVmLmRpc3Bvc2UoKTsKLQkJaW1wbGllZE1hcHBpbmdGaWxlUmVmID0gbnVsbDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChJTVBMSUVEX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksIG1hcHBpbmdGaWxlUmVmLCBudWxsKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBjbGFzcyByZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcygpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4oCi0JCQlzcGVjaWZpZWRDbGFzc1JlZnMoKSwgaW1wbGllZENsYXNzUmVmcygpKTsKLQl9Ci0JCi0JcHVibGljIGludCBjbGFzc1JlZnNTaXplKCkgewotCQlyZXR1cm4gc3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpICsgaW1wbGllZENsYXNzUmVmc1NpemUoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBzcGVjaWZpZWQgY2xhc3MgcmVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4odGhpcy5zcGVjaWZpZWRDbGFzc1JlZnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHNwZWNpZmllZENsYXNzUmVmc1NpemUoKSB7Ci0JCXJldHVybiBzcGVjaWZpZWRDbGFzc1JlZnMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgQ2xhc3NSZWYgYWRkU3BlY2lmaWVkQ2xhc3NSZWYoKSB7Ci0JCXJldHVybiBhZGRTcGVjaWZpZWRDbGFzc1JlZih0aGlzLnNwZWNpZmllZENsYXNzUmVmc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyBDbGFzc1JlZiBhZGRTcGVjaWZpZWRDbGFzc1JlZihpbnQgaW5kZXgpIHsKLQkJWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBidWlsZENsYXNzUmVmKHhtbENsYXNzUmVmKTsKLQkJdGhpcy5zcGVjaWZpZWRDbGFzc1JlZnMuYWRkKGluZGV4LCBjbGFzc1JlZik7Ci0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoaW5kZXgsIHhtbENsYXNzUmVmKTsKLQkJZmlyZUl0ZW1BZGRlZChTUEVDSUZJRURfQ0xBU1NfUkVGX0xJU1QsIGluZGV4LCBjbGFzc1JlZik7Ci0JCXJldHVybiBjbGFzc1JlZjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRDbGFzc1JlZihDbGFzc1JlZiBjbGFzc1JlZikgewotCQlyZW1vdmVTcGVjaWZpZWRDbGFzc1JlZih0aGlzLnNwZWNpZmllZENsYXNzUmVmcy5pbmRleE9mKGNsYXNzUmVmKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZENsYXNzUmVmKGludCBpbmRleCkgewotCQlDbGFzc1JlZiBjbGFzc1JlZlJlbW92ZWQgPSB0aGlzLnNwZWNpZmllZENsYXNzUmVmcy5yZW1vdmUoaW5kZXgpOwotCQljbGFzc1JlZlJlbW92ZWQuZGlzcG9zZSgpOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkucmVtb3ZlKGluZGV4KTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFNQRUNJRklFRF9DTEFTU19SRUZfTElTVCwgaW5kZXgsIGNsYXNzUmVmUmVtb3ZlZCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZENsYXNzUmVmXyhDbGFzc1JlZiBjbGFzc1JlZikgewotCQlhZGRTcGVjaWZpZWRDbGFzc1JlZl8odGhpcy5zcGVjaWZpZWRDbGFzc1JlZnMuc2l6ZSgpLCBjbGFzc1JlZik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZENsYXNzUmVmXyhpbnQgaW5kZXgsIENsYXNzUmVmIGNsYXNzUmVmKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGNsYXNzUmVmLCB0aGlzLnNwZWNpZmllZENsYXNzUmVmcywgU1BFQ0lGSUVEX0NMQVNTX1JFRl9MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWZfKENsYXNzUmVmIGNsYXNzUmVmKSB7Ci0JCWNsYXNzUmVmLmRpc3Bvc2UoKTsKLQkJcmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWZfKHRoaXMuc3BlY2lmaWVkQ2xhc3NSZWZzLmluZGV4T2YoY2xhc3NSZWYpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWZfKGludCBpbmRleCkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMuc3BlY2lmaWVkQ2xhc3NSZWZzLCBTUEVDSUZJRURfQ0xBU1NfUkVGX0xJU1QpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGltcGxpZWQgY2xhc3MgcmVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxDbGFzc1JlZj4gaW1wbGllZENsYXNzUmVmcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4oaW1wbGllZENsYXNzUmVmcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW1wbGllZENsYXNzUmVmc1NpemUoKSB7Ci0JCXJldHVybiBpbXBsaWVkQ2xhc3NSZWZzLnNpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENsYXNzUmVmIGFkZEltcGxpZWRDbGFzc1JlZihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBhZGRJbXBsaWVkQ2xhc3NSZWYoaW1wbGllZENsYXNzUmVmcy5zaXplKCksIGNsYXNzTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBDbGFzc1JlZiBhZGRJbXBsaWVkQ2xhc3NSZWYoaW50IGluZGV4LCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gYnVpbGRDbGFzc1JlZihjbGFzc05hbWUpOwotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBjbGFzc1JlZiwgaW1wbGllZENsYXNzUmVmcywgSU1QTElFRF9DTEFTU19SRUZfTElTVCk7Ci0JCXJldHVybiBjbGFzc1JlZjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSW1wbGllZENsYXNzUmVmKENsYXNzUmVmIGNsYXNzUmVmKSB7Ci0JCWNsYXNzUmVmLmRpc3Bvc2UoKTsKLQkJcmVtb3ZlSW1wbGllZENsYXNzUmVmKGltcGxpZWRDbGFzc1JlZnMuaW5kZXhPZihjbGFzc1JlZikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJbXBsaWVkQ2xhc3NSZWYoaW50IGluZGV4KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgaW1wbGllZENsYXNzUmVmcywgSU1QTElFRF9DTEFTU19SRUZfTElTVCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogZXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSB7Ci0JCXJldHVybiBnZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkgPT0gbnVsbCA/IGdldERlZmF1bHRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkgOiBnZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoQm9vbGVhbiBuZXdFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKSB7Ci0JCUJvb2xlYW4gb2xkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyA9IHRoaXMuc3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlczsKLQkJdGhpcy5zcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzID0gbmV3RXhjbHVkZVVubGlzdGVkQ2xhc3NlczsKLQkJCi0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXModGhpcy5zcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKTsKLQkJCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0VYQ0xVREVfVU5MSVNURURfQ0xBU1NFRF9QUk9QRVJUWSwgb2xkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcywgbmV3RXhjbHVkZVVubGlzdGVkQ2xhc3Nlcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSB7Ci0JCS8vIFRPRE8gLSBjYWxjdWxhdGUgZGVmYXVsdAotCQkvLyAgVGhpcyBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIHByb2plY3QKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIHByb3BlcnRpZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxQcm9wZXJ0eT4gcHJvcGVydGllcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxQcm9wZXJ0eT4odGhpcy5wcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByb3BlcnRpZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBnZXRQcm9wZXJ0eToga2V5IGlzIG51bGwuIik7Ci0JCX0KLQkJZm9yKFByb3BlcnR5IHByb3BlcnR5IDogdGhpcy5wcm9wZXJ0aWVzKSB7Ci0JCQlpZihrZXkuZXF1YWxzKHByb3BlcnR5LmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gcHJvcGVydHk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxQcm9wZXJ0eT4gcHJvcGVydGllc1dpdGhQcmVmaXgoU3RyaW5nIGtleVByZWZpeCkgewotCQlpZiAoa2V5UHJlZml4ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHByb3BlcnRpZXNXaXRoUHJlZml4OiBrZXlQcmVmaXggaXMgbnVsbC4iKTsKLQkJfQotCQlMaXN0PFByb3BlcnR5PiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eT4oKTsKLQkJCi0JCWZvcihQcm9wZXJ0eSBwcm9wZXJ0eSA6IHRoaXMucHJvcGVydGllcykgewotCQkJaWYocHJvcGVydHkuZ2V0TmFtZSgpICE9IG51bGwgJiYgcHJvcGVydHkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoa2V5UHJlZml4KSkgewotCQkJCXByb3BlcnRpZXMuYWRkKCBwcm9wZXJ0eSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCQotCXB1YmxpYyBQcm9wZXJ0eSBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGtleSA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBnZXRQcm9wZXJ0eToga2V5IG9yIHZhbHVlIGlzIG51bGwuIik7Ci0JCX0KLQkJZm9yKFByb3BlcnR5IHByb3BlcnR5IDogdGhpcy5wcm9wZXJ0aWVzKSB7Ci0JCQlpZihrZXkuZXF1YWxzKHByb3BlcnR5LmdldE5hbWUoKSkpIHsKLQkJCQlpZih2YWx1ZS5lcXVhbHMocHJvcGVydHkuZ2V0VmFsdWUoKSkpIHsKLQkJCQkJCXJldHVybiBwcm9wZXJ0eTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eSBnZXRQcm9wZXJ0eShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXQoaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxQcm9wZXJ0eSBnZXRYbWxQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkgewotCQkJWG1sUHJvcGVydGllcyB4bWxQcm9wZXJ0aWVzID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0aWVzKCk7Ci0JCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0aWVzKHhtbFByb3BlcnRpZXMpOwotCQl9Ci0JCWZvcihYbWxQcm9wZXJ0eSB4bWxQcm9wZXJ0eSA6IHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkpIHsKLQkJCWlmKG5hbWUuZXF1YWxzKHhtbFByb3BlcnR5LmdldE5hbWUoKSkgJiYgdmFsdWUuZXF1YWxzKHhtbFByb3BlcnR5LmdldFZhbHVlKCkpKSB7Ci0JCQkJcmV0dXJuIHhtbFByb3BlcnR5OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEFkZHMgb3IgQ2hhbmdlcyBQcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHB1dFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZXMpIHsKLQkJaWYoICEgYWxsb3dEdXBsaWNhdGVzICYmIHRoaXMuY29udGFpbnNQcm9wZXJ0eShrZXkpKSB7Ci0JCQl0aGlzLnB1dFhtbFByb3BlcnR5KGtleSwgdmFsdWUsIHRoaXMuZ2V0UHJvcGVydHkoa2V5KS5nZXRWYWx1ZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiggdmFsdWUgIT0gbnVsbCkgewotCQkJWG1sUHJvcGVydHkgeG1sUHJvcGVydHkgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnR5KCk7Ci0JCQl4bWxQcm9wZXJ0eS5zZXROYW1lKGtleSk7Ci0JCQl4bWxQcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQkKLQkJCXRoaXMuYWRkWG1sUHJvcGVydHkoeG1sUHJvcGVydHksIHByb3BlcnRpZXNTaXplKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlcGxhY2VQcm9wZXJ0eVZhbHVlKFN0cmluZyBrZXksIFN0cmluZyBvbGRWYWx1ZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCQotCQl0aGlzLnB1dFhtbFByb3BlcnR5KGtleSwgbmV3VmFsdWUsIG9sZFZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHV0WG1sUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgb2xkVmFsdWUpIHsKLQkJaWYoIHZhbHVlID09IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlUHJvcGVydHkoa2V5KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVhtbFByb3BlcnR5IHhtbFByb3BlcnR5ID0gdGhpcy5nZXRYbWxQcm9wZXJ0eShrZXksIG9sZFZhbHVlKTsKLQkJaWYoeG1sUHJvcGVydHkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIk1pc3NpbmcgUHJvcGVydHkgbmFtZTogIiArIGtleSArICIsIHZhbHVlOiAiICsgb2xkVmFsdWUpOwotCQl9Ci0JCXhtbFByb3BlcnR5LnNldFZhbHVlKHZhbHVlKTsKLQl9CQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUHJvcGVydHkoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gKHRoaXMuZ2V0UHJvcGVydHkoa2V5KSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHkgYWRkUHJvcGVydHkoKSB7Ci0JCXJldHVybiBhZGRQcm9wZXJ0eShwcm9wZXJ0aWVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIFByb3BlcnR5IGFkZFByb3BlcnR5KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5hZGRYbWxQcm9wZXJ0eShQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnR5KCksIGluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5IGFkZFhtbFByb3BlcnR5KFhtbFByb3BlcnR5IHhtbFByb3BlcnR5LCBpbnQgaW5kZXgpIHsKLQotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IGJ1aWxkUHJvcGVydHkoeG1sUHJvcGVydHkpOwotCQkKLQkJaWYgKHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKSA9PSBudWxsKSB7Ci0JCQlYbWxQcm9wZXJ0aWVzIHhtbFByb3BlcnRpZXMgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnRpZXMoKTsKLQkJCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnRpZXMoeG1sUHJvcGVydGllcyk7Ci0JCX0KLQkJCi0JCXRoaXMucHJvcGVydGllcy5hZGQoaW5kZXgsIHByb3BlcnR5KTsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5hZGQoaW5kZXgsIHhtbFByb3BlcnR5KTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKFBST1BFUlRJRVNfTElTVCwgaW5kZXgsIHByb3BlcnR5KTsKLQkJcmV0dXJuIHByb3BlcnR5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCXRoaXMucmVtb3ZlUHJvcGVydHkodGhpcy5nZXRQcm9wZXJ0eShrZXkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMucmVtb3ZlUHJvcGVydHkodGhpcy5nZXRQcm9wZXJ0eShrZXksIHZhbHVlKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZVByb3BlcnR5KHRoaXMucHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5KSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHJvcGVydHkoaW50IGluZGV4KSB7Ci0JCVByb3BlcnR5IHByb3BlcnR5UmVtb3ZlZCA9IHRoaXMucHJvcGVydGllcy5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLnJlbW92ZShpbmRleCk7Ci0JCQotCQlpZiAodGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCkpIHsKLQkJCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnRpZXMobnVsbCk7Ci0JCX0KLQkJCi0JCWZpcmVJdGVtUmVtb3ZlZChQUk9QRVJUSUVTX0xJU1QsIGluZGV4LCBwcm9wZXJ0eVJlbW92ZWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eV8oUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJYWRkUHJvcGVydHlfKHRoaXMucHJvcGVydGllcy5zaXplKCksIHByb3BlcnR5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlfKGludCBpbmRleCwgUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgcHJvcGVydHksIHRoaXMucHJvcGVydGllcywgUFJPUEVSVElFU19MSVNUKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHJvcGVydHlfKFByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCXJlbW92ZVByb3BlcnR5Xyh0aGlzLnByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQcm9wZXJ0eV8oaW50IGluZGV4KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5wcm9wZXJ0aWVzLCBQUk9QRVJUSUVTX0xJU1QpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLy9UT0RPIHZhbGlkYXRpb24gZm9yIG11bHRpcGxlIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLgotCQotCS8vVGFrZSB0aGUgZmlyc3QgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZm91bmQgaW4gYW4gb3JtLnhtbCBmaWxlIGFuZCB1c2UKLQkvL3RoaXMgZm9yIHRoZSBkZWZhdWx0cyBvZiB0aGUgUGVyc2lzdGVuY2VVbml0LgotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJZm9yIChNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShtYXBwaW5nRmlsZVJlZnMoKSkpIHsKLQkJCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gbWFwcGluZ0ZpbGVSZWYuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJCWlmIChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNjaGVtYShTdHJpbmcgbmV3RGVmYXVsdFNjaGVtYSkgewotCQlTdHJpbmcgb2xkRGVmYXVsdFNjaGVtYSA9IHRoaXMuZGVmYXVsdFNjaGVtYTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gbmV3RGVmYXVsdFNjaGVtYTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSwgb2xkRGVmYXVsdFNjaGVtYSwgbmV3RGVmYXVsdFNjaGVtYSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2F0YWxvZyhTdHJpbmcgbmV3RGVmYXVsdENhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRDYXRhbG9nID0gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IG5ld0RlZmF1bHRDYXRhbG9nOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSwgb2xkRGVmYXVsdENhdGFsb2csIG5ld0RlZmF1bHRDYXRhbG9nKTsKLQl9Ci0JCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEFjY2VzczsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEFjY2VzcyhBY2Nlc3NUeXBlIG5ld0RlZmF1bHRBY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGREZWZhdWx0QWNjZXNzID0gdGhpcy5kZWZhdWx0QWNjZXNzOwotCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSBuZXdEZWZhdWx0QWNjZXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUNDRVNTX1BST1BFUlRZLCBvbGREZWZhdWx0QWNjZXNzLCBuZXdEZWZhdWx0QWNjZXNzKTsKLQl9CQotCQotCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRDYXNjYWRlUGVyc2lzdCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENhc2NhZGVQZXJzaXN0OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2FzY2FkZVBlcnNpc3QoYm9vbGVhbiBuZXdEZWZhdWx0Q2FzY2FkZVBlcnNpc3QpIHsKLQkJYm9vbGVhbiBvbGREZWZhdWx0Q2FzY2FkZVBlcnNpc3QgPSB0aGlzLmRlZmF1bHRDYXNjYWRlUGVyc2lzdDsKLQkJdGhpcy5kZWZhdWx0Q2FzY2FkZVBlcnNpc3QgPSBuZXdEZWZhdWx0Q2FzY2FkZVBlcnNpc3Q7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9DQVNDQURFX1BFUlNJU1RfUFJPUEVSVFksIG9sZERlZmF1bHRDYXNjYWRlUGVyc2lzdCwgbmV3RGVmYXVsdENhc2NhZGVQZXJzaXN0KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBnbG9iYWwgZ2VuZXJhdG9yIGFuZCBxdWVyeSBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIGFkZEdlbmVyYXRvcihHZW5lcmF0b3IgZ2VuZXJhdG9yKSB7Ci0JCXRoaXMuZ2VuZXJhdG9ycy5hZGQoZ2VuZXJhdG9yKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxHZW5lcmF0b3I+IGFsbEdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8R2VuZXJhdG9yPih0aGlzLmdlbmVyYXRvcnMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRRdWVyeShRdWVyeSBxdWVyeSkgewotCQl0aGlzLnF1ZXJpZXMuYWRkKHF1ZXJ5KTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxRdWVyeT4gYWxsUXVlcmllcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxRdWVyeT4odGhpcy5xdWVyaWVzKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0OwotCQl0aGlzLm5hbWUgPSB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpOwotCQkKLQkJLy9pbml0aWFsaXplIHNwZWNpZmllZCBjbGFzc1JlZnMgYmVmb3JlIG1hcHBpbmdGaWxlUmVmcyBiZWNhdXNlIG9mIAotCQkvL0pwYUZpbGUgcm9vdFN0cnVjdHVyZU5vZGUsIHdlIHdhbnQgdGhlIG1hcHBpbmcgZmlsZSB0byAid2luIiwKLQkJLy9hcyBpdCB3b3VsZCBpbiBhIEpwYSBydW50aW1lIGltcGxlbWVudGF0aW9uCi0JCWluaXRpYWxpemVTcGVjaWZpZWRDbGFzc1JlZnMoeG1sUGVyc2lzdGVuY2VVbml0KTsKLQkJaW5pdGlhbGl6ZU1hcHBpbmdGaWxlUmVmcyh4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCQkvL2luaXRpYWxpemUgaW1wbGllZCBjbGFzc1JlZnMgbGFzdCBzaW5jZSB0aGV5IGRlcGVuZCBvbiBib3RoCi0JCS8vc3BlY2lmaWVkIGNsYXNzUmVmcyBhbmQgbWFwcGluZ0ZpbGVSZWZzCi0JCWluaXRpYWxpemVJbXBsaWVkQ2xhc3NSZWZzKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCWluaXRpYWxpemVQcm9wZXJ0aWVzKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCWluaXRpYWxpemVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQl0aGlzLnNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMgPSB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpOwotCQl0aGlzLnNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSA9IHNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSh4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCQl0aGlzLmRlZmF1bHRUcmFuc2FjdGlvblR5cGUgPSBkZWZhdWx0VHJhbnNhY2F0aW9uVHlwZSgpOwotCQl0aGlzLmRlc2NyaXB0aW9uID0geG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCk7Ci0JCXRoaXMucHJvdmlkZXIgPSB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKTsKLQkJdGhpcy5qdGFEYXRhU291cmNlID0geG1sUGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKTsKLQkJdGhpcy5ub25KdGFEYXRhU291cmNlID0geG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKTsKLQkJdGhpcy5zcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzID0geG1sUGVyc2lzdGVuY2VVbml0LmdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hcHBpbmdGaWxlUmVmcyhYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCWZvciAoWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgOiB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkpIHsKLQkJCXNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcy5hZGQoYnVpbGRNYXBwaW5nRmlsZVJlZih4bWxNYXBwaW5nRmlsZVJlZikpOwotCQl9Ci0JCWlmICghIGltcGxpZWRNYXBwaW5nRmlsZUlzU3BlY2lmaWVkKCkgJiYgaW1wbGllZE1hcHBpbmdGaWxlRXhpc3RzKCkpIHsKLQkJCWltcGxpZWRNYXBwaW5nRmlsZVJlZiA9IGJ1aWxkTWFwcGluZ0ZpbGVSZWYobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZENsYXNzUmVmcyhYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCWZvciAoWG1sSmF2YUNsYXNzUmVmIHhtbEphdmFDbGFzc1JlZiA6IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkpIHsKLQkJCXNwZWNpZmllZENsYXNzUmVmcy5hZGQoYnVpbGRDbGFzc1JlZih4bWxKYXZhQ2xhc3NSZWYpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSW1wbGllZENsYXNzUmVmcyhYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCWlmIChnZXRKcGFQcm9qZWN0KCkuZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcygpICYmICEgaXNFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpIHsKLQkJCWZvciAoU3RyaW5nIHR5cGVOYW1lIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuZ2V0SnBhUHJvamVjdCgpLmFubm90YXRlZENsYXNzTmFtZXMoKSkpIHsKLQkJCQlpZiAoICEgY2xhc3NJc1NwZWNpZmllZCh0eXBlTmFtZSkpIHsKLQkJCQkJaW1wbGllZENsYXNzUmVmcy5hZGQoYnVpbGRDbGFzc1JlZih0eXBlTmFtZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcyhYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWlmICh4bWxQcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKFhtbFByb3BlcnR5IHhtbFByb3BlcnR5IDogeG1sUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkpIHsKLQkJCXRoaXMucHJvcGVydGllcy5hZGQoYnVpbGRQcm9wZXJ0eSh4bWxQcm9wZXJ0eSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlpZiAocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgIT0gbnVsbCkgewotCQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gdGhpcy5zY2hlbWEocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpOwotCQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IHRoaXMuY2F0YWxvZyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyk7Ci0JCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSB0aGlzLmFjY2VzcyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyk7Ci0JCQl0aGlzLmRlZmF1bHRDYXNjYWRlUGVyc2lzdCA9IHRoaXMuY2FzY2FkZVBlcnNpc3QocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gbnVsbDsKLQkJCXRoaXMuZGVmYXVsdENhdGFsb2cgPSBudWxsOwotCQkJdGhpcy5kZWZhdWx0QWNjZXNzID0gbnVsbDsKLQkJCXRoaXMuZGVmYXVsdENhc2NhZGVQZXJzaXN0ID0gZmFsc2U7CQkKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0OwotCQl0aGlzLmdlbmVyYXRvcnMuY2xlYXIoKTsKLQkJdGhpcy5xdWVyaWVzLmNsZWFyKCk7Ci0JCXVwZGF0ZU5hbWUocGVyc2lzdGVuY2VVbml0KTsKLQkJdXBkYXRlU3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCXVwZGF0ZURlZmF1bHRUcmFuc2FjdGlvblR5cGUoKTsKLQkJdXBkYXRlRGVzY3JpcHRpb24ocGVyc2lzdGVuY2VVbml0KTsKLQkJdXBkYXRlUHJvdmlkZXIocGVyc2lzdGVuY2VVbml0KTsKLQkJdXBkYXRlSnRhRGF0YVNvdXJjZShwZXJzaXN0ZW5jZVVuaXQpOwotCQl1cGRhdGVOb25KdGFEYXRhU291cmNlKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCS8vdXBkYXRlIHNwZWNpZmllZCBjbGFzc1JlZnMgYmVmb3JlIG1hcHBpbmdGaWxlUmVmcyBiZWNhdXNlIG9mIAotCQkvL0pwYUZpbGUgcm9vdFN0cnVjdHVyZU5vZGUsIHdlIHdhbnQgdGhlIG1hcHBpbmcgZmlsZSB0byAid2luIiwKLQkJLy9hcyBpdCB3b3VsZCBpbiBhIEpwYSBydW50aW1lIGltcGxlbWVudGF0aW9uCi0JCXVwZGF0ZVNwZWNpZmllZENsYXNzUmVmcyhwZXJzaXN0ZW5jZVVuaXQpOwotCQl1cGRhdGVNYXBwaW5nRmlsZVJlZnMocGVyc2lzdGVuY2VVbml0KTsKLQkJLy91cGRhdGUgaW1wbGllZCBjbGFzc1JlZnMgbGFzdCBzaW5jZSB0aGV5IGRlcGVuZCBvbiBib3RoCi0JCS8vc3BlY2lmaWVkIGNsYXNzUmVmcyBhbmQgbWFwcGluZ0ZpbGVSZWZzCi0JCXVwZGF0ZUltcGxpZWRDbGFzc1JlZnMoKTsKLQkJdXBkYXRlRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhwZXJzaXN0ZW5jZVVuaXQpOwotCQl1cGRhdGVQcm9wZXJ0aWVzKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCXVwZGF0ZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWdlbmVyYXRvclJlcG9zaXRvcnlVcGRhdGVkKCk7Ci0JCXF1ZXJ5UmVwb3NpdG9yeVVwZGF0ZWQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTmFtZShYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXNldE5hbWUocGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZShYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXNldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZShzcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUocGVyc2lzdGVuY2VVbml0KSk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgc3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKFhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5mcm9tWG1sUmVzb3VyY2VNb2RlbChwZXJzaXN0ZW5jZVVuaXQuZ2V0VHJhbnNhY3Rpb25UeXBlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlzZXREZWZhdWx0VHJhbnNhY3Rpb25UeXBlKGRlZmF1bHRUcmFuc2FjYXRpb25UeXBlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGRlZmF1bHRUcmFuc2FjYXRpb25UeXBlKCkgewotCQkvLyBUT0RPIC0gY2FsY3VsYXRlIGRlZmF1bHQKLQkJLy8gIEZyb20gdGhlIEpQQSBzcGVjOiAiSW4gYSBKYXZhIEVFIGVudmlyb25tZW50LCBpZiB0aGlzIGVsZW1lbnQgaXMgbm90IAotCQkvLyAgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyBKVEEuIEluIGEgSmF2YSBTRSBlbnZpcm9ubWVudCwgaWYgdGhpcyBlbGVtZW50IAotCQkvLyBpcyBub3Qgc3BlY2lmaWVkLCBhIGRlZmF1bHQgb2YgUkVTT1VSQ0VfTE9DQUwgbWF5IGJlIGFzc3VtZWQuIgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVzY3JpcHRpb24oWG1sUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCkgewotCQlzZXREZXNjcmlwdGlvbihwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb3ZpZGVyKFhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJc2V0UHJvdmlkZXIocGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKdGFEYXRhU291cmNlKFhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJc2V0SnRhRGF0YVNvdXJjZShwZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTm9uSnRhRGF0YVNvdXJjZShYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXNldE5vbkp0YURhdGFTb3VyY2UocGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1hcHBpbmdGaWxlUmVmcyhYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCUl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPiBzdHJlYW0gPSBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKTsKLQkJSXRlcmF0b3I8WG1sTWFwcGluZ0ZpbGVSZWY+IHN0cmVhbTIgPSBuZXcgQ2xvbmVJdGVyYXRvcjxYbWxNYXBwaW5nRmlsZVJlZj4ocGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoc3RyZWFtMi5oYXNOZXh0KCkpIHsKLQkJCQltYXBwaW5nRmlsZVJlZi51cGRhdGUoc3RyZWFtMi5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZfKG1hcHBpbmdGaWxlUmVmKTsKLQkJCX0KLQkJfQotCQkKLQkJd2hpbGUgKHN0cmVhbTIuaGFzTmV4dCgpKSB7Ci0JCQlhZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZl8oYnVpbGRNYXBwaW5nRmlsZVJlZihzdHJlYW0yLm5leHQoKSkpOwotCQl9Ci0JCQotCQlpZiAoaW1wbGllZE1hcHBpbmdGaWxlSXNTcGVjaWZpZWQoKSkgewotCQkJaWYgKGltcGxpZWRNYXBwaW5nRmlsZVJlZiAhPSBudWxsKSB7Ci0JCQkJdW5zZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChpbXBsaWVkTWFwcGluZ0ZpbGVFeGlzdHMoKSkgewotCQkJCWlmIChpbXBsaWVkTWFwcGluZ0ZpbGVSZWYgPT0gbnVsbCkgewotCQkJCQlzZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkJCQl9Ci0JCQkJZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkudXBkYXRlKG51bGwpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGltcGxpZWRNYXBwaW5nRmlsZVJlZiAhPSBudWxsKSB7Ci0JCQkJCXVuc2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGltcGxpZWRNYXBwaW5nRmlsZUlzU3BlY2lmaWVkKCkgewotCQlTdHJpbmcgaW1wbGllZE1hcHBpbmdGaWxlID0gSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIOwotCQlmb3IgKE1hcHBpbmdGaWxlUmVmIGVhY2ggOiBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMpIHsKLQkJCWlmIChpbXBsaWVkTWFwcGluZ0ZpbGUuZXF1YWxzKGVhY2guZ2V0RmlsZU5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGltcGxpZWRNYXBwaW5nRmlsZUV4aXN0cygpIHsKLQkJT3JtQXJ0aWZhY3RFZGl0IG9hZSA9IE9ybUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKGdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQlPcm1SZXNvdXJjZSBvciA9IG9hZS5nZXRSZXNvdXJjZShKcHRDb3JlUGx1Z2luLmdldERlZmF1bHRPcm1YbWxEZXBsb3ltZW50VVJJKGdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpKTsKLQkJYm9vbGVhbiBleGlzdHMgPSAgb3IgIT0gbnVsbCAmJiBvci5leGlzdHMoKTsKLQkJb2FlLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIGV4aXN0czsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmIGJ1aWxkTWFwcGluZ0ZpbGVSZWYoWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYpIHsKLQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZE1hcHBpbmdGaWxlUmVmKHRoaXMsIHhtbE1hcHBpbmdGaWxlUmVmKTsKLQl9Ci0JCi0JLy90aGlzIGlzIG5vdCBiZWluZyBjaGFuZ2VkIHRvIG1hdGNoIHVwZGF0ZUltcGxpZWRDbGFzc1JlZnMuICBJbiB0aGUgeG1sLAotCS8vY2hhbmdpbmcgdGhlIGNsYXNzIG5hbWUgZG9lcyBub3QgaW1wbHkgdGhhdCBhIG5ldyBvYmplY3QgbmVlZHMgdG8gYmUgY3JlYXRlZC4KLQkvL0lmIGFueXRoaW5nIHdlIHNob3VsZCBiZSBtYXRjaGluZyBDbGFzc1JlZnMgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBYbWxKYXZhQ2xhc3NSZWYKLQkvL2FuZCBpZiB0aGVyZSBpcyBub3Qgb25lIHRoZSBDbGFzc1JlZiB3b3VsZCBiZSByZW1vdmVkLiAgV2Ugd291bGQgbm90IHdhbnQgdG8gCi0JLy9kbyBhIG5hbWUgbWF0Y2ggYXMgaXMgZG9uZSBmb3IgdGhlIGltcGxpZWQgY2xhc3MgcmVmcy4KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRDbGFzc1JlZnMoWG1sUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCkgewotCQlJdGVyYXRvcjxDbGFzc1JlZj4gY29udGV4dENsYXNzUmVmcyA9IHNwZWNpZmllZENsYXNzUmVmcygpOwotCQlJdGVyYXRvcjxYbWxKYXZhQ2xhc3NSZWY+IHJlc291cmNlQ2xhc3NSZWZzID0gbmV3IENsb25lSXRlcmF0b3I8WG1sSmF2YUNsYXNzUmVmPihwZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpKTsvL3ByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNpYXRpb25FeGNlcHRpb24KLQkJCi0JCXdoaWxlIChjb250ZXh0Q2xhc3NSZWZzLmhhc05leHQoKSkgewotCQkJQ2xhc3NSZWYgY29udGV4dENsYXNzUmVmID0gY29udGV4dENsYXNzUmVmcy5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2VDbGFzc1JlZnMuaGFzTmV4dCgpKSB7Ci0JCQkJY29udGV4dENsYXNzUmVmLnVwZGF0ZShyZXNvdXJjZUNsYXNzUmVmcy5uZXh0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWZfKGNvbnRleHRDbGFzc1JlZik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXdoaWxlIChyZXNvdXJjZUNsYXNzUmVmcy5oYXNOZXh0KCkpIHsKLQkJCWFkZFNwZWNpZmllZENsYXNzUmVmXyhidWlsZENsYXNzUmVmKHJlc291cmNlQ2xhc3NSZWZzLm5leHQoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUltcGxpZWRDbGFzc1JlZnMoKSB7Ci0JCWlmIChpc0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSkgewotCQkJZm9yIChDbGFzc1JlZiBjbGFzc1JlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShpbXBsaWVkQ2xhc3NSZWZzKCkpKSB7Ci0JCQkJcmVtb3ZlSW1wbGllZENsYXNzUmVmKGNsYXNzUmVmKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBhbm5vdGF0ZWRDbGFzc05hbWVzID0gZ2V0SnBhUHJvamVjdCgpLmFubm90YXRlZENsYXNzTmFtZXMoKTsKLQkJQ29sbGVjdGlvbjxDbGFzc1JlZj4gaW1wbGllZFJlZnNUb1JlbW92ZSA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGltcGxpZWRDbGFzc1JlZnMoKSk7Ci0JCUNvbGxlY3Rpb248Q2xhc3NSZWY+IGltcGxpZWRSZWZzVG9VcGRhdGUgPSBuZXcgQXJyYXlMaXN0PENsYXNzUmVmPigpOwotCQkKLQkJd2hpbGUgKGFubm90YXRlZENsYXNzTmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgYW5ub3RhdGVkQ2xhc3NOYW1lID0gYW5ub3RhdGVkQ2xhc3NOYW1lcy5uZXh0KCk7Ci0JCQlib29sZWFuIGltcGxpZWRSZWZGb3VuZCA9IGZhbHNlOwotCQkJaWYgKCFjbGFzc0lzU3BlY2lmaWVkKGFubm90YXRlZENsYXNzTmFtZSkpIHsKLQkJCQlmb3IgKENsYXNzUmVmIGNsYXNzUmVmIDogaW1wbGllZFJlZnNUb1JlbW92ZSkgewotCQkJCQlpZiAoYW5ub3RhdGVkQ2xhc3NOYW1lLmVxdWFscyhjbGFzc1JlZi5nZXRDbGFzc05hbWUoKSkpIHsKLQkJCQkJCWltcGxpZWRSZWZzVG9SZW1vdmUucmVtb3ZlKGNsYXNzUmVmKTsKLQkJCQkJCWltcGxpZWRSZWZzVG9VcGRhdGUuYWRkKGNsYXNzUmVmKTsKLQkJCQkJCWltcGxpZWRSZWZGb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWltcGxpZWRSZWZGb3VuZCkgewotCQkJCQlhZGRJbXBsaWVkQ2xhc3NSZWYoYW5ub3RhdGVkQ2xhc3NOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChDbGFzc1JlZiBjbGFzc1JlZiA6IGltcGxpZWRSZWZzVG9SZW1vdmUpIHsKLQkJCXJlbW92ZUltcGxpZWRDbGFzc1JlZihjbGFzc1JlZik7Ci0JCX0KLQkJLy9maXJzdCBoYW5kbGUgYWRkaW5nL3JlbW92aW5nIG9mIHRoZSBpbXBsaWVkIGNsYXNzIHJlZnMsIHRoZW4gdXBkYXRlIHRoZSBvdGhlcnMgbGFzdCwgCi0JCS8vdGhpcyBjYXVzZXMgbGVzcyBjaHVybiBpbiB0aGUgdXBkYXRlIHByb2Nlc3MKLQkJZm9yIChDbGFzc1JlZiBjbGFzc1JlZiA6IGltcGxpZWRSZWZzVG9VcGRhdGUpIHsKLQkJCWNsYXNzUmVmLnVwZGF0ZShjbGFzc1JlZi5nZXRDbGFzc05hbWUoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIENsYXNzUmVmIGJ1aWxkQ2xhc3NSZWYoWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRDbGFzc1JlZih0aGlzLCB4bWxDbGFzc1JlZik7Ci0JfQotCQotCXByb3RlY3RlZCBDbGFzc1JlZiBidWlsZENsYXNzUmVmKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZENsYXNzUmVmKHRoaXMsIGNsYXNzTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjbGFzcyBpcyBzcGVjaWZpZWQgZWl0aGVyIGFzIGEgY2xhc3MKLQkgKiBvciBsaXN0ZWQgaW4gYSBtYXBwaW5nIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGFzc0lzU3BlY2lmaWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJZm9yIChDbGFzc1JlZiBzcGVjaWZpZWRDbGFzc1JlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzcGVjaWZpZWRDbGFzc1JlZnMoKSkpIHsKLQkJCWlmIChjbGFzc05hbWUuZXF1YWxzKHNwZWNpZmllZENsYXNzUmVmLmdldENsYXNzTmFtZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWZvciAoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUobWFwcGluZ0ZpbGVSZWZzKCkpKSB7Ci0JCQlpZiAobWFwcGluZ0ZpbGVSZWYuZ2V0UGVyc2lzdGVudFR5cGUoY2xhc3NOYW1lKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKFhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhwZXJzaXN0ZW5jZVVuaXQuZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvcGVydGllcyhYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQotCQlJdGVyYXRvcjxQcm9wZXJ0eT4gc3RyZWFtID0gcHJvcGVydGllcygpOwotCQlJdGVyYXRvcjxYbWxQcm9wZXJ0eT4gc3RyZWFtMjsKLQkJCi0JCWlmICh4bWxQcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCXN0cmVhbTIgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdHJlYW0yID0gbmV3IENsb25lSXRlcmF0b3I8WG1sUHJvcGVydHk+KHhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpKTsvL2F2b2lkIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkJfQotCQkKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCVByb3BlcnR5IHByb3BlcnR5ID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJlYW0yLmhhc05leHQoKSkgewotCQkJCXByb3BlcnR5LnVwZGF0ZShzdHJlYW0yLm5leHQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZW1vdmVQcm9wZXJ0eV8ocHJvcGVydHkpOwotCQkJfQotCQl9Ci0JCQotCQl3aGlsZSAoc3RyZWFtMi5oYXNOZXh0KCkpIHsKLQkJCWFkZFByb3BlcnR5XyhidWlsZFByb3BlcnR5KHN0cmVhbTIubmV4dCgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5IGJ1aWxkUHJvcGVydHkoWG1sUHJvcGVydHkgeG1sUHJvcGVydHkpIHsKLQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZFByb3BlcnR5KHRoaXMsIHhtbFByb3BlcnR5KTsKLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgewotCQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNjaGVtYSh0aGlzLnNjaGVtYShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykpOwotCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMuY2F0YWxvZyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykpOwotCQl0aGlzLnNldERlZmF1bHRBY2Nlc3ModGhpcy5hY2Nlc3MocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpKTsKLQkJdGhpcy5zZXREZWZhdWx0Q2FzY2FkZVBlcnNpc3QodGhpcy5jYXNjYWRlUGVyc2lzdChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSB7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyAhPSBudWxsKSB7Ci0JCQlpZiAocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKTsKLQkJCX0KLQkJfQotCQlTY2hlbWEgcHJvamVjdERlZmF1bHRTY2hlbWEgPSBwcm9qZWN0RGVmYXVsdFNjaGVtYSgpOwotCQlyZXR1cm4gcHJvamVjdERlZmF1bHRTY2hlbWEgPT0gbnVsbCA/IG51bGwgOiBwcm9qZWN0RGVmYXVsdFNjaGVtYS5nZXROYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTY2hlbWEgcHJvamVjdERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiBnZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY2F0YWxvZyhQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgewotCQlpZiAocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgIT0gbnVsbCkgewotCQkJaWYgKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvamVjdERlZmF1bHRDYXRhbG9nTmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdERlZmF1bHRDYXRhbG9nTmFtZSgpIHsKLQkJQ2F0YWxvZyBjYXRhbG9nID0gZ2V0SnBhUHJvamVjdCgpLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJcmV0dXJuIChjYXRhbG9nID09IG51bGwpID8gbnVsbCA6IGNhdGFsb2cuZ2V0TmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBhY2Nlc3MoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID09IG51bGwgPyBudWxsIDogcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGNhc2NhZGVQZXJzaXN0KFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9PSBudWxsID8gZmFsc2UgOiBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCk7Ci0JfQotCQotCS8vIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGhhcyBiZWVuIHVwZGF0ZWQgdG8gZW5zdXJlCi0JLy8gd2UgY2F0Y2ggYWxsIGFkZGVkIGdlbmVyYXRvcnMKLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0b3JSZXBvc2l0b3J5VXBkYXRlZCgpIHsKLQkJZmlyZUxpc3RDaGFuZ2VkKEdFTkVSQVRPUlNfTElTVCk7Ci0JfQotCQotCS8vIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGhhcyBiZWVuIHVwZGF0ZWQgdG8gZW5zdXJlCi0JLy8gd2UgY2F0Y2ggYWxsIGFkZGVkIHF1ZXJpZXMKLQlwcm90ZWN0ZWQgdm9pZCBxdWVyeVJlcG9zaXRvcnlVcGRhdGVkKCkgewotCQlmaXJlTGlzdENoYW5nZWQoUVVFUklFU19MSVNUKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlzdXBlci5hZGRUb01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJYWRkTWFwcGluZ0ZpbGVNZXNzYWdlcyhtZXNzYWdlcyk7CQotCQlhZGRDbGFzc01lc3NhZ2VzKG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGluZ0ZpbGVNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlhZGRNdWx0aXBsZU1ldGFkYXRhTWVzc2FnZXMobWVzc2FnZXMpOwotCQlhZGREdXBsaWNhdGVNYXBwaW5nRmlsZU1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IHN0cmVhbSA9ICBtYXBwaW5nRmlsZVJlZnMoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCkuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTXVsdGlwbGVNZXRhZGF0YU1lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCUNvbGxlY3Rpb248UGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+IHB1RGVmYXVsdHNDb2xsZWN0aW9uID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNGb3JWYWxpZGF0aW9uKCk7Ci0JCWlmIChwdURlZmF1bHRzQ29sbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQlmb3IgKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHB1RGVmYXVsdHMgOiBwdURlZmF1bHRzQ29sbGVjdGlvbikgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9NQVBQSU5HU19NVUxUSVBMRV9NRVRBREFUQSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQkJcHVEZWZhdWx0cykKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZER1cGxpY2F0ZU1hcHBpbmdGaWxlTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJSGFzaEJhZzxTdHJpbmc+IGZpbGVCYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KAotCQkJCUNvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKAotCQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWYsIFN0cmluZz4odGhpcy5tYXBwaW5nRmlsZVJlZnMoKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmKSB7Ci0JCQkJCQkJCXJldHVybiBtYXBwaW5nRmlsZVJlZi5nZXRGaWxlTmFtZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkpCi0JCSk7Ci0JCWZvciAoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5tYXBwaW5nRmlsZVJlZnMoKSkpIHsKLQkJCWlmIChmaWxlQmFnLmNvdW50KG1hcHBpbmdGaWxlUmVmLmdldEZpbGVOYW1lKCkpID4gMSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX01BUFBJTkdfRklMRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7bWFwcGluZ0ZpbGVSZWYuZ2V0RmlsZU5hbWUoKX0sIAotCQkJCQkJbWFwcGluZ0ZpbGVSZWYsIAotCQkJCQkJbWFwcGluZ0ZpbGVSZWYuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpKQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIGFkZENsYXNzTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJYWRkRHVwbGljYXRlQ2xhc3NNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCQotCQlmb3IgKENsYXNzUmVmIGNsYXNzUmVmIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGNsYXNzUmVmcygpKSkgewotCQkJY2xhc3NSZWYuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkRHVwbGljYXRlQ2xhc3NNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlIYXNoQmFnPFN0cmluZz4gY2xhc3NOYW1lQmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigKLQkJCQlDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbigKLQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPENsYXNzUmVmLCBTdHJpbmc+KHRoaXMuY2xhc3NSZWZzKCkpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShDbGFzc1JlZiBjbGFzc1JlZikgewotCQkJCQkJCQlyZXR1cm4gY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCSkKLQkJKTsKLQkJZm9yIChDbGFzc1JlZiBqYXZhQ2xhc3NSZWYgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5jbGFzc1JlZnMoKSkpIHsKLQkJCWlmIChqYXZhQ2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCkgIT0gbnVsbAotCQkJCQkmJiBjbGFzc05hbWVCYWcuY291bnQoamF2YUNsYXNzUmVmLmdldENsYXNzTmFtZSgpKSA+IDEpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9DTEFTUywKLQkJCQkJCW5ldyBTdHJpbmdbXSB7amF2YUNsYXNzUmVmLmdldENsYXNzTmFtZSgpfSwgCi0JCQkJCQlqYXZhQ2xhc3NSZWYsIAotCQkJCQkJamF2YUNsYXNzUmVmLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cz4gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNGb3JWYWxpZGF0aW9uKCkgewotCQlBcnJheUxpc3Q8UGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+IHB1RGVmYXVsdHMgPSBuZXcgQXJyYXlMaXN0PFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPigpOwotCQlmb3IgKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG1hcHBpbmdGaWxlUmVmcygpKSkgewotCQkJUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBtYXBwaW5nRmlsZVJlZi5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQkJaWYgKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzICE9IG51bGwpIHsKLQkJCQlwdURlZmF1bHRzLmFkZChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHB1RGVmYXVsdHM7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlmb3IgKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG1hcHBpbmdGaWxlUmVmcygpKSkgewotCQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBtYXBwaW5nRmlsZVJlZi5nZXRQZXJzaXN0ZW50VHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQkJCWlmIChvcm1QZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG9ybVBlcnNpc3RlbnRUeXBlOwotCQkJfQotCQl9Ci0JCWZvciAoQ2xhc3NSZWYgY2xhc3NSZWYgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoY2xhc3NSZWZzKCkpKSB7Ci0JCQlpZiAoY2xhc3NSZWYuaXNGb3IoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkpIHsKLQkJCQlyZXR1cm4gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKLQkJZm9yIChNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShtYXBwaW5nRmlsZVJlZnMoKSkpIHsKLQkJCWlmIChtYXBwaW5nRmlsZVJlZi5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KSkgewotCQkJCXJldHVybiBtYXBwaW5nRmlsZVJlZjsKLQkJCX0KLQkJfQotCQlmb3IgKENsYXNzUmVmIGNsYXNzUmVmIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGNsYXNzUmVmcygpKSkgewotCQkJaWYgKGNsYXNzUmVmLmNvbnRhaW5zT2Zmc2V0KHRleHRPZmZzZXQpKSB7Ci0JCQkJcmV0dXJuIGNsYXNzUmVmOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCkgewotCQlpZiAoeG1sUGVyc2lzdGVuY2VVbml0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0LmNvbnRhaW5zT2Zmc2V0KHRleHRPZmZzZXQpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0LmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZChnZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKENsYXNzUmVmIGNsYXNzUmVmIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGNsYXNzUmVmcygpKSkgewotCQkJY2xhc3NSZWYuZGlzcG9zZSgpOwotCQl9Ci0JCWZvciAoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUobWFwcGluZ0ZpbGVSZWZzKCkpKSB7Ci0JCQltYXBwaW5nRmlsZVJlZi5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VYbWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVhtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQ3NjQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVhtbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVhtbCBleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgUGVyc2lzdGVuY2VYbWwKLXsKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VSZXNvdXJjZSBwZXJzaXN0ZW5jZVJlc291cmNlOwotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZTsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlWG1sKEpwYVJvb3RDb250ZXh0Tm9kZSBwYXJlbnQsIFBlcnNpc3RlbmNlUmVzb3VyY2UgcGVyc2lzdGVuY2VSZXNvdXJjZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmluaXRpYWxpemUocGVyc2lzdGVuY2VSZXNvdXJjZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIGlzbid0IGFjdHVhbGx5IGRpc3BsYXllZCwgc28gbmVlZHMgbm8gZGV0YWlscyBwYWdlCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhUm9vdENvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKcGFSb290Q29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VSZXNvdXJjZS5nZXRGaWxlKCk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKiogcGVyc2lzdGVuY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2UgZ2V0UGVyc2lzdGVuY2UoKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlIGFkZFBlcnNpc3RlbmNlKCkgewotCQlpZiAocGVyc2lzdGVuY2UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2UoKTsKLQkJcGVyc2lzdGVuY2UgPSBidWlsZFBlcnNpc3RlbmNlKHhtbFBlcnNpc3RlbmNlKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZCh4bWxQZXJzaXN0ZW5jZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUEVSU0lTVEVOQ0VfUFJPUEVSVFksIG51bGwsIHBlcnNpc3RlbmNlKTsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVQZXJzaXN0ZW5jZSgpIHsKLQkJaWYgKHBlcnNpc3RlbmNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnBlcnNpc3RlbmNlLmRpc3Bvc2UoKTsKLQkJUGVyc2lzdGVuY2Ugb2xkUGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZTsKLQkJcGVyc2lzdGVuY2UgPSBudWxsOwotCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlUmVzb3VyY2UuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZSh4bWxQZXJzaXN0ZW5jZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUEVSU0lTVEVOQ0VfUFJPUEVSVFksIG9sZFBlcnNpc3RlbmNlLCBudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGVyc2lzdGVuY2VfKFBlcnNpc3RlbmNlIG5ld1BlcnNpc3RlbmNlKSB7Ci0JCVBlcnNpc3RlbmNlIG9sZFBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2U7Ci0JCXBlcnNpc3RlbmNlID0gbmV3UGVyc2lzdGVuY2U7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUEVSU0lTVEVOQ0VfUFJPUEVSVFksIG9sZFBlcnNpc3RlbmNlLCBuZXdQZXJzaXN0ZW5jZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFBlcnNpc3RlbmNlUmVzb3VyY2UgcGVyc2lzdGVuY2VSZXNvdXJjZSkgewotCQl0aGlzLnBlcnNpc3RlbmNlUmVzb3VyY2UgPSBwZXJzaXN0ZW5jZVJlc291cmNlOwotCQlpZiAocGVyc2lzdGVuY2VSZXNvdXJjZS5nZXRQZXJzaXN0ZW5jZSgpICE9IG51bGwpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2UgPSBidWlsZFBlcnNpc3RlbmNlKHBlcnNpc3RlbmNlUmVzb3VyY2UuZ2V0UGVyc2lzdGVuY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoUGVyc2lzdGVuY2VSZXNvdXJjZSBwZXJzaXN0ZW5jZVJlc291cmNlKSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VSZXNvdXJjZSA9IHBlcnNpc3RlbmNlUmVzb3VyY2U7Ci0JCWlmIChwZXJzaXN0ZW5jZVJlc291cmNlLmdldFBlcnNpc3RlbmNlKCkgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMucGVyc2lzdGVuY2UgIT0gbnVsbCkgewotCQkJCXRoaXMucGVyc2lzdGVuY2UudXBkYXRlKHBlcnNpc3RlbmNlUmVzb3VyY2UuZ2V0UGVyc2lzdGVuY2UoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRQZXJzaXN0ZW5jZV8oYnVpbGRQZXJzaXN0ZW5jZShwZXJzaXN0ZW5jZVJlc291cmNlLmdldFBlcnNpc3RlbmNlKCkpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChnZXRQZXJzaXN0ZW5jZSgpICE9IG51bGwpIHsKLQkJCQlnZXRQZXJzaXN0ZW5jZSgpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCXNldFBlcnNpc3RlbmNlXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgYnVpbGRQZXJzaXN0ZW5jZShYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSkgewotCQlyZXR1cm4gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkUGVyc2lzdGVuY2UodGhpcywgeG1sUGVyc2lzdGVuY2UpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm8gUGVyc2lzdGVuY2VVbml0IGluIHRoaXMgY29udGV4dCIpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCWlmIChwZXJzaXN0ZW5jZS5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KSkgewotCQkJcmV0dXJuIHBlcnNpc3RlbmNlLmdldFN0cnVjdHVyZU5vZGUodGV4dE9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCS8vIG5ldmVyIGFjdHVhbGx5IHNlbGVjdGVkCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBUZXh0UmFuZ2UuRW1wdHkuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gVGV4dFJhbmdlLkVtcHR5Lmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcml2YXRlIGJvb2xlYW4gb2tUb0NvbnRpbnVlVmFsaWRhdGlvbiA9IHRydWU7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRUb01lc3NhZ2VzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXN1cGVyLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQlhZGRJbnZhbGlkUGVyc2lzdGVuY2VYbWxDb250ZW50TWVzc2FnZShtZXNzYWdlcyk7Ci0JCQotCQlpZiAob2tUb0NvbnRpbnVlVmFsaWRhdGlvbil7Ci0JCQlnZXRQZXJzaXN0ZW5jZSgpLmFkZFRvTWVzc2FnZXMobWVzc2FnZXMpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEludmFsaWRQZXJzaXN0ZW5jZVhtbENvbnRlbnRNZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1hNTF9JTlZBTElEX0NPTlRFTlQsCi0JCQkJCQl0aGlzKQotCQkJCSk7Ci0JCQlva1RvQ29udGludWVWYWxpZGF0aW9uID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLnBlcnNpc3RlbmNlLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YjY3YjYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uTnVsbENvbm5lY3Rpb24yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuTnVsbE9wdGlvbnMyXzA7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkKK3sKKworCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGJ1aWxkQ29ubmVjdGlvbihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7CisJCXJldHVybiBuZXcgTnVsbENvbm5lY3Rpb24yXzAocGFyZW50KTsKKwl9CisJCisJcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRPcHRpb25zKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBOdWxsT3B0aW9uczJfMChwYXJlbnQpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY1Byb3BlcnR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNkMTdkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUHJvcGVydHkgZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIFByb3BlcnR5Ci17Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCQotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0JCi0JcHJvdGVjdGVkIFhtbFByb3BlcnR5IHByb3BlcnR5OwotCQotCXB1YmxpYyBHZW5lcmljUHJvcGVydHkoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5pbml0aWFsaXplKHByb3BlcnR5KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBuYW1lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJdGhpcy5wcm9wZXJ0eS5zZXROYW1lKG5ld05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbHVlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7Ci0JCXRoaXMucHJvcGVydHkuc2V0VmFsdWUobmV3VmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxQcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQl0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0JCXRoaXMubmFtZSA9IHByb3BlcnR5LmdldE5hbWUoKTsKLQkJdGhpcy52YWx1ZSA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxQcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQl0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7Ci0JCXNldE5hbWUocHJvcGVydHkuZ2V0TmFtZSgpKTsKLQkJc2V0VmFsdWUocHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvcGVydHkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIHRvU3RyaW5nCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikKLQl7Ci0JCXNiLmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJc2IuYXBwZW5kKG5hbWUpOwotCQlzYi5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlzYi5hcHBlbmQodmFsdWUpOwotCQlzYi5hcHBlbmQoJyknKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldEFjdGlvbkRlbGVnYXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRBY3Rpb25EZWxlZ2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OWQzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRBY3Rpb25EZWxlZ2F0ZS5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlJbnN0YWxsRGVsZWdhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKKworLyoqCisgKiBQZXJmb3JtcyB0aGluZ3MgY29tbW9uIHRvIGluc3RhbGwsIHZlcnNpb24gY2hhbmdlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKcGFGYWNldEFjdGlvbkRlbGVnYXRlCisJaW1wbGVtZW50cyBJRGVsZWdhdGUsIEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcworeworCXB1YmxpYyBmaW5hbCB2b2lkIGV4ZWN1dGUoCisJCQlJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCisJCQlPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCisJCW1vbml0b3IgPSB0aGlzLm5vbk51bGxNb25pdG9yKG1vbml0b3IpOworCQl0cnkgeworCQkJdGhpcy5leGVjdXRlXyhwcm9qZWN0LCBmdiwgY29uZmlnLCBtb25pdG9yKTsKKwkJfSBmaW5hbGx5IHsKKwkJCW1vbml0b3IuZG9uZSgpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVfKAorCQkJSVByb2plY3QgcHJvamVjdCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKKwkJCU9iamVjdCBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkKKwkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCisJCQorCQkvLyBOQjogV1RQIE5hdHVyZXMgKGluY2x1ZGluZyB0aGUgSmF2YUVNRk5hdHVyZSkKKwkJLy8gc2hvdWxkIGFscmVhZHkgYmUgYWRkZWQsIGFzIHRoaXMgZmFjZXQgc2hvdWxkIAorCQkvLyBhbHdheXMgY29leGlzdCB3aXRoIGEgbW9kdWxlIGZhY2V0LgorCQkKKwkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSAoSURhdGFNb2RlbCkgY29uZmlnOworCQkKKwkJLy8gcHJvamVjdCBzZXR0aW5ncworCQlKcHRDb3JlUGx1Z2luLnNldEpwYVBsYXRmb3JtSWQocHJvamVjdCwgZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBMQVRGT1JNX0lEKSk7CisJCQorCQkvLyBkbyBOT1QgdXNlIElEYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nKSAtIG9yIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgbmFtZSBjYW4KKwkJLy8gYmUgc2V0IHRvIGFuIGVtcHR5IHN0cmluZyAtIHdlIHdhbnQgaXQgdG8gYmUgbnVsbAorCQlKcHRDb3JlUGx1Z2luLnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShwcm9qZWN0LCAoU3RyaW5nKSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkoQ09OTkVDVElPTikpOworCQkKKwkJaWYgKGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpKSB7CisJCQlKcHRDb3JlUGx1Z2luLnNldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKHByb2plY3QsIGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRykpOworCQl9CisJCWlmIChkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKSB7CisJCQlKcHRDb3JlUGx1Z2luLnNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEocHJvamVjdCwgZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKTsKKwkJfQorCQkKKwkJSnB0Q29yZVBsdWdpbi5zZXREaXNjb3ZlckFubm90YXRlZENsYXNzZXMocHJvamVjdCwgZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUykpOworCQkKKwkJLy8gZGVmYXVsdHMgc2V0dGluZ3MKKwkJSnB0Q29yZVBsdWdpbi5zZXREZWZhdWx0SnBhUGxhdGZvcm1JZChkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUExBVEZPUk1fSUQpKTsKKwkJCisJCS8vRGVsZWdhdGUgdG8gTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSB0byBjb25maWd1cmUgdGhlIHByb2plY3QgY2xhc3NwYXRoCisJCSgoTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSkgZGF0YU1vZGVsLmdldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuTElCUkFSWV9QUk9WSURFUl9ERUxFR0FURSkpLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCQorCQltb25pdG9yLndvcmtlZCgxKTsKKwl9CisJCisJcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG5vbk51bGxNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlyZXR1cm4gKG1vbml0b3IgIT0gbnVsbCkgPyBtb25pdG9yIDogbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKaW5kZXggYzFkMjhhMC4uNGIzZWIzOCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpAQCAtMSw4MSArMSw3NiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXM7CiAKLXB1YmxpYyBpbnRlcmZhY2UgSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSURhdGFNb2RlbFByb3BlcnRpZXMKK3B1YmxpYyBpbnRlcmZhY2UgSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzCisJZXh0ZW5kcyBJRGF0YU1vZGVsUHJvcGVydGllcwogewotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZywgaWRlbnRpZmllcyBKcGEgUGxhdGZvcm0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9JRCA9ICJKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk1fSUQiOwotCQotCS8qKgotCSAqIE5vdCByZXF1aXJlZCwgdHlwZSBTdHJpbmcsIGlkZW50aWZpZXMgZGF0YWJhc2UgY29ubmVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT04gPSAiSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTk5FQ1RJT04iOwotCQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIEJvb2xlYW4sIGlkZW50aWZpZXMgd2hldGhlciBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGFjdGl2ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fQUNUSVZFID0gIkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5DT05ORUNUSU9OX0FDVElWRSI7Ci0JCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUgQm9vbGVhbiwgaWRlbnRpZmllcyBpZiB0aGUgdXNlciB3aXNoZXMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBzY2hlbWEgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEgPSAKLQkJIkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5VU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BIjsKLQkKLQkvKioKLQkgKiBOb3QgcmVxdWlyZWQsIHR5cGUgU3RyaW5nLCBpZGVudGlmaWVzIHRoZSB1c2VyIG92ZXJyaWRkZW4gZGVmYXVsdCBzY2hlbWEgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEgPSAKLQkJCSJKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSI7CisJU3RyaW5nIFBSRUZJWCA9ICJKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMiOworCVN0cmluZyBQUkVGSVhfID0gUFJFRklYICsgJy4nOwogCQogCS8qKgogCSAqIEludGVybmFsLCB0eXBlIElSdW50aW1lLCBpZGVudGlmaWVzIHJ1bnRpbWUgYXNzb2NpYXRlZCB3aXRoIHByb2plY3QKIAkgKiBVc2VkIG9ubHkgaW4gY29uanVuY3Rpb24gd2l0aCB2YWxpZGF0aW9uIG9mIG90aGVyIHByb3BlcnRpZXMsIGJlY2F1c2UgdGhpcyBpbmZvcm1hdGlvbgogCSAqIGlzIG90aGVyd2lzZSBpbmFjY2Vzc2libGUgdG8gdGhpcyBkYXRhIG1vZGVsCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRSA9ICJKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUlVOVElNRSI7CisJU3RyaW5nIFJVTlRJTUUgPSBQUkVGSVhfICsgIlJVTlRJTUUiOwogCQogCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIGJvb2xlYW4sIG9wcG9zaXRlIG9mIFVTRV9VU0VSX0pQQV9MSUJSQVJZLCBpZGVudGlmaWVzIHdoZXRoZXIgCi0JICogc2VydmVyIHJ1bnRpbWUgcHJvdmlkZXMgSlBBIGltcGxlbWVudGF0aW9uCi0JICogSWYgdGhpcyBpcyB0cnVlLCB0aGVuIHRoZSBwcm9wZXJ0eSBKUEFfTElCUkFSWSBpcyBub3QgdXNlZAorCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZywgaWRlbnRpZmllcyBKcGEgUGxhdGZvcm0KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfU0VSVkVSX0pQQV9JTVBMRU1FTlRBVElPTiA9ICJKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuVVNFX1NFUlZFUl9KUEFfSU1QTEVNRU5UQVRJT04iOworCVN0cmluZyBQTEFURk9STV9JRCA9IFBSRUZJWF8gKyAiUExBVEZPUk1fSUQiOwogCQogCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIGJvb2xlYW4sIG9wcG9zaXRlIG9mIFVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OLCBpZGVudGlmaWVzCi0JICogd2hldGhlciB0aGUgdXNlciBpcyBwcm92aWRpbmcgaGlzIG93biBKUEEgbGlicmFyeSAKLQkgKiAoVGhpcyBhZGRpdGlvbmFsIHNldHRpbmcgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHVzZSBzeW5jaEhlbHBlciB3aXRoaW4KLQkgKiB0aGUgd2l6YXJkIC0gdGhlcmUgbXVzdCBiZSBhIHVuaXF1ZSBwcm9wZXJ0eSBmb3IgZWFjaCByYWRpbyBidXR0b24uIFN0dXBpZAotCSAqIGJ1dCB0cnVlKQotCSAqIElmIHRoaXMgaXMgdHJ1ZSwgdGhlbiB0aGUgcHJvcGVydHkgSlBBX0xJQlJBUlkgaXMgdXNlZAorCSAqIFJlcXVpcmVkLCB0eXBlIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUsIHRoZSBsaWJyYXJ5IGluc3RhbGwgZGVsZWdhdGUgdXNlZCB0byBjb25maWd1cmUgSlBBIHByb3ZpZGVyIGxpYnJhcnkKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfVVNFUl9KUEFfTElCUkFSWSA9ICJKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuVVNFX1VTRVJfSlBBX0xJQlJBUlkiOworICAgIFN0cmluZyBMSUJSQVJZX1BST1ZJREVSX0RFTEVHQVRFID0gUFJFRklYXyArICJMSUJSQVJZX1BST1ZJREVSX0RFTEVHQVRFIjsKKwkKKyAgICAvKioKKwkgKiBOb3QgcmVxdWlyZWQsIHR5cGUgU3RyaW5nLCBpZGVudGlmaWVzIGRhdGFiYXNlIGNvbm5lY3Rpb24KKwkgKi8KKwlTdHJpbmcgQ09OTkVDVElPTiA9IFBSRUZJWF8gKyAiQ09OTkVDVElPTiI7CiAJCiAJLyoqCi0JICogTm90IHJlcXVpcmVkLCB0eXBlIFN0cmluZywgaWRlbnRpZmllcyBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeS4KLQkgKiBPbmx5IHVzZWQgaWYgdGhlIHByb3BlcnR5IFVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OIGlzIGZhbHNlLgorCSAqIFJlcXVpcmVkLCB0eXBlIEJvb2xlYW4sIGlkZW50aWZpZXMgd2hldGhlciBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGFjdGl2ZQogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9MSUJSQVJZID0gIkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5KUEFfTElCUkFSWSI7CisJU3RyaW5nIENPTk5FQ1RJT05fQUNUSVZFID0gUFJFRklYXyArICJDT05ORUNUSU9OX0FDVElWRSI7CisJCisJLyoqCisJICogUmVxdWlyZWQsIHR5cGUgQm9vbGVhbiwgaWRlbnRpZmllcyBpZiB0aGUgdXNlciB3aXNoZXMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBDYXRhbG9nIG5hbWUKKwkgKi8KKwlTdHJpbmcgVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cgPSBQUkVGSVhfICsgIlVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HIjsKKwkKKwkvKioKKwkgKiBOb3QgcmVxdWlyZWQsIHR5cGUgU3RyaW5nLCBpZGVudGlmaWVzIHRoZSB1c2VyIG92ZXJyaWRkZW4gZGVmYXVsdCBDYXRhbG9nIG5hbWUKKwkgKi8KKwlTdHJpbmcgVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cgPSBQUkVGSVhfICsgIlVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HIjsKKworCS8qKgorCSAqIFJlcXVpcmVkLCB0eXBlIEJvb2xlYW4sIGlkZW50aWZpZXMgaWYgdGhlIHVzZXIgd2lzaGVzIHRvIG92ZXJyaWRlIGRlZmF1bHQgc2NoZW1hIG5hbWUKKwkgKi8KKwlTdHJpbmcgVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSA9IFBSRUZJWF8gKyAiVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSI7CisJCisJLyoqCisJICogTm90IHJlcXVpcmVkLCB0eXBlIFN0cmluZywgaWRlbnRpZmllcyB0aGUgdXNlciBvdmVycmlkZGVuIGRlZmF1bHQgc2NoZW1hIG5hbWUKKwkgKi8KKwlTdHJpbmcgVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSA9IFBSRUZJWF8gKyAiVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSI7CiAJCiAJLyoqCiAJICogUmVxdWlyZWQsIHR5cGUgYm9vbGVhbiwgb3Bwb3NpdGUgb2YgTElTVF9BTk5PVEFURURfQ0xBU1NFUywgaWRlbnRpZmllcyAKIAkgKiB3aGV0aGVyIGFsbCBhbm5vdGF0ZWQgY2xhc3NlcyBhcmUgdG8gYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCBhcyBwYXJ0IG9mIAogCSAqIGFsbCBwZXJzaXN0ZW5jZSB1bml0cwogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTID0gIkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5ESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUyI7CisJU3RyaW5nIERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTID0gUFJFRklYXyArICJESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUyI7CiAJCiAJLyoqCiAJICogUmVxdWlyZWQsIHR5cGUgYm9vbGVhbiwgb3Bwb3NpdGUgb2YgRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIGlkZW50aWZpZXMKQEAgLTg1LDEwICs4MCw1IEBACiAJICogdGhlIHdpemFyZCAtIHRoZXJlIG11c3QgYmUgYSB1bmlxdWUgcHJvcGVydHkgZm9yIGVhY2ggcmFkaW8gYnV0dG9uLiBTdHVwaWQKIAkgKiBidXQgdHJ1ZSkKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX0FOTk9UQVRFRF9DTEFTU0VTID0gIkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5MSVNUX0FOTk9UQVRFRF9DTEFTU0VTIjsKLQkKLQkvKioKLQkgKiBSZXF1aXJlZCwgdHlwZSBib29sZWFuLCBkZXRhaWxzIHdoZXRoZXIgb3JtLnhtbCBzaG91bGQgYmUgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9PUk1fWE1MID0gIkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCI7CisJU3RyaW5nIExJU1RfQU5OT1RBVEVEX0NMQVNTRVMgPSBQUkVGSVhfICsgIkxJU1RfQU5OT1RBVEVEX0NMQVNTRVMiOwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldERhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggNTc5ZTQwYi4uY2Y2YmQxZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXREYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0xLDQxNiArMSw2ODQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldDsKIAoraW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwYVBsYXRmb3JtUmVnaXN0cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnB0Q29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNhdGFsb2c7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZUZpbmRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuSnB0RGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeUluc3RhbGxEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwogCi1wdWJsaWMgY2xhc3MgSnBhRmFjZXREYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnBhRmFjZXREYXRhTW9kZWxQcm92aWRlcgorCWV4dGVuZHMgRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIKIAlpbXBsZW1lbnRzIEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcwogewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfRkFDRVRfSUQgPSBJTW9kdWxlQ29uc3RhbnRzLkpTVF9FSkJfTU9EVUxFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTlRJTUVfTk9ORSA9IAotCQkJV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLlJVTlRJTUVfTk9ORSwgbnVsbCk7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0ZBQ0VUX0lEID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRTsKIAkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3RhdHVzIFBMQVRGT1JNX05PVF9TUEVDSUZJRURfU1RBVFVTID0gCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJU3RhdHVzIFBMQVRGT1JNX05PVF9TUEVDSUZJRURfU1RBVFVTID0gCiAJCQlidWlsZEVycm9yU3RhdHVzKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9QTEFURk9STV9OT1RfU1BFQ0lGSUVEKTsKIAkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3RhdHVzIENPTk5FQ1RJT05fTk9UX0NPTk5FQ1RFRF9TVEFUVVMgPSAKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElTdGF0dXMgQ09OTkVDVElPTl9OT1RfQ09OTkVDVEVEX1NUQVRVUyA9IAogCQkJYnVpbGRJbmZvU3RhdHVzKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9DT05ORUNUSU9OX05PVF9DT05ORUNURUQpOwogCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElTdGF0dXMgVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQV9OT1RfU1BFQ0lGSUVEX1NUQVRVUyA9IAorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVN0YXR1cyBVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPR19OT1RfU1BFQ0lGSUVEX1NUQVRVUyA9IAorCQkJYnVpbGRFcnJvclN0YXR1cyhKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfREVGQVVMVF9DQVRBTE9HX05PVF9TUEVDSUZJRUQpOworCQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVN0YXR1cyBVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BX05PVF9TUEVDSUZJRURfU1RBVFVTID0gCiAJCQlidWlsZEVycm9yU3RhdHVzKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9ERUZBVUxUX1NDSEVNQV9OT1RfU1BFQ0lGSUVEKTsKIAkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3RhdHVzIFJVTlRJTUVfTk9UX1NQRUNJRklFRF9TVEFUVVMgPSAKLQkJCWJ1aWxkV2FybmluZ1N0YXR1cyhKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfUlVOVElNRV9OT1RfU1BFQ0lGSUVEKTsKIAkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3RhdHVzIFJVTlRJTUVfRE9FU19OT1RfU1VQUE9SVF9FSkJfMzBfU1RBVFVTID0gCi0JCQlidWlsZFdhcm5pbmdTdGF0dXMoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX1JVTlRJTUVfRE9FU19OT1RfU1VQUE9SVF9FSkJfMzApOworCXByaXZhdGUgTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBkZWZhdWx0TGlicmFyeVByb3ZpZGVyOwogCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElTdGF0dXMgTElCUkFSWV9OT1RfU1BFQ0lGSUVEX1NUQVRVUyA9IAotCQkJYnVpbGRXYXJuaW5nU3RhdHVzKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9MSUJSQVJZX05PVF9TUEVDSUZJRUQpOwotCisJLyoqIGNhY2hlIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgLSBjaGFuZ2UgaXQgd2hlbmV2ZXIgdGhlIHVzZXIgc2VsZWN0cyBhIGRpZmZlcmVudCBuYW1lICovCisJcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZTsKKwkKKwkKIAkvKioKIAkgKiByZXF1aXJlZCBkZWZhdWx0IGNvbnN0cnVjdG9yCiAJICovCi0JcHVibGljIEpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIoKSB7CisJcHJvdGVjdGVkIEpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIoKSB7CiAJCXN1cGVyKCk7CiAJfQotCi0KKwkKKwkKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0PFN0cmluZz4gcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKKwkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFNldDxTdHJpbmc+IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7CisJCXByb3BlcnR5TmFtZXMuYWRkKFJVTlRJTUUpOwogCQlwcm9wZXJ0eU5hbWVzLmFkZChQTEFURk9STV9JRCk7CisJCXByb3BlcnR5TmFtZXMuYWRkKExJQlJBUllfUFJPVklERVJfREVMRUdBVEUpOwogCQlwcm9wZXJ0eU5hbWVzLmFkZChDT05ORUNUSU9OKTsKIAkJcHJvcGVydHlOYW1lcy5hZGQoQ09OTkVDVElPTl9BQ1RJVkUpOworCQlwcm9wZXJ0eU5hbWVzLmFkZChVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRyk7CisJCXByb3BlcnR5TmFtZXMuYWRkKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HKTsKIAkJcHJvcGVydHlOYW1lcy5hZGQoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSk7CiAJCXByb3BlcnR5TmFtZXMuYWRkKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChSVU5USU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVNFX1NFUlZFUl9KUEFfSU1QTEVNRU5UQVRJT04pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChVU0VfVVNFUl9KUEFfTElCUkFSWSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEpQQV9MSUJSQVJZKTsKIAkJcHJvcGVydHlOYW1lcy5hZGQoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMpOwogCQlwcm9wZXJ0eU5hbWVzLmFkZChMSVNUX0FOTk9UQVRFRF9DTEFTU0VTKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQ1JFQVRFX09STV9YTUwpOwogCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKIAl9CiAJCisJCisJLy8gKioqKioqKioqKiBwcm9wZXJ0aWVzICoqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpIHsKKwkJcmV0dXJuIChJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSkgdGhpcy5nZXRQcm9wZXJ0eShGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZKTsKKwl9CisJCisJcHJvdGVjdGVkIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldFByb2plY3RGYWNldFZlcnNpb24oKSB7CisJCXJldHVybiAoSVByb2plY3RGYWNldFZlcnNpb24pIHRoaXMuZ2V0UHJvcGVydHkoRkFDRVRfVkVSU0lPTik7CisJfQorCQorCXByb3RlY3RlZCBJUnVudGltZSBnZXRSdW50aW1lKCkgeworCQlyZXR1cm4gKElSdW50aW1lKSB0aGlzLmdldFByb3BlcnR5KFJVTlRJTUUpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtSWQoKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldFByb3BlcnR5KFBMQVRGT1JNX0lEKTsKKwl9CisJCisJcHJvdGVjdGVkIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpIHsKKwkJcmV0dXJuIChMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKSB0aGlzLmdldFByb3BlcnR5KExJQlJBUllfUFJPVklERVJfREVMRUdBVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbm5lY3Rpb25OYW1lKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRQcm9wZXJ0eShDT05ORUNUSU9OKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gdXNlcldhbnRzVG9PdmVycmlkZURlZmF1bHRDYXRhbG9nKCkgeworCQlyZXR1cm4gdGhpcy5nZXRCb29sZWFuUHJvcGVydHkoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRyk7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIHVzZXJXYW50c1RvT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy5nZXRCb29sZWFuUHJvcGVydHkoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0UHJvcGVydHkoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSk7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhblByb3BlcnR5KERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBlbmFibGVkICoqKioqKioqKioKKwkKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HKSkgeworCQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvbklzQWN0aXZlKCkgJiYgdGhpcy5kYXRhYmFzZVN1cHBvcnRzQ2F0YWxvZ3MoKTsKKwkJfQorCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRykpIHsKKwkJCXJldHVybiB0aGlzLnVzZXJXYW50c1RvT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpOworCQl9CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKSB7CisJCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uSXNBY3RpdmUoKTsKKwkJfQogCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSkgewotCQkJcmV0dXJuIGdldEJvb2xlYW5Qcm9wZXJ0eShVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKTsKKwkJCXJldHVybiB0aGlzLnVzZXJXYW50c1RvT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCk7CiAJCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSlBBX0xJQlJBUlkpKSB7Ci0JCQlyZXR1cm4gZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9VU0VSX0pQQV9MSUJSQVJZKTsKLQkJfQorCQkKIAkJcmV0dXJuIHN1cGVyLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSk7CiAJfQogCQorCQorCS8vICoqKioqKioqKiogZGVmYXVsdHMgKioqKioqKioqKgorCQogCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRfSUQpKSB7CiAJCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5GQUNFVF9JRDsKIAkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQTEFURk9STV9JRCkpIHsKLQkJCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldERlZmF1bHRKcGFQbGF0Zm9ybUlkKCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OTkVDVElPTikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTk5FQ1RJT05fQUNUSVZFKSkgewotCQkJcmV0dXJuIGNvbm5lY3Rpb25Jc0FjdGl2ZSgpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSkgewotCQkJcmV0dXJuIGdldERlZmF1bHRTY2hlbWFOYW1lKCk7Ci0JCX0KIAkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUlVOVElNRSkpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OKSkgewotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnJ1bnRpbWVTdXBwb3J0c0VqYjMwKHRoaXMucnVudGltZSgpKSk7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBMQVRGT1JNX0lEKSkgeworCQkJcmV0dXJuIGdldERlZmF1bHRQbGF0Zm9ybUlkKCk7CiAJCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFX1VTRVJfSlBBX0xJQlJBUlkpKSB7Ci0JCQlyZXR1cm4gISBnZXRCb29sZWFuUHJvcGVydHkoVVNFX1NFUlZFUl9KUEFfSU1QTEVNRU5UQVRJT04pOworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMSUJSQVJZX1BST1ZJREVSX0RFTEVHQVRFKSkgeworCQkJcmV0dXJuIGdldERlZmF1bHRMaWJyYXJ5UHJvdmlkZXIoKTsKIAkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKUEFfTElCUkFSWSkpIHsKLQkJCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldERlZmF1bHRKcGFMaWJyYXJ5KCk7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTk5FQ1RJT04pKSB7CisJCQlyZXR1cm4gZ2V0RGVmYXVsdENvbm5lY3Rpb24oKTsKKwkJfQorCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05ORUNUSU9OX0FDVElWRSkpIHsKKwkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5jb25uZWN0aW9uSXNBY3RpdmUoKSk7CisJCX0KKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpKSB7CisJCQlyZXR1cm4gZ2V0RGVmYXVsdFVzZXJXYW50c1RvT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpOworCQl9CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HKSkgeworCQkJcmV0dXJuIGdldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcigpOworCQl9CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKSB7CisJCQlyZXR1cm4gZ2V0RGVmYXVsdFVzZXJXYW50c1RvT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCk7CisJCX0KKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSkpIHsKKwkJCXJldHVybiBnZXREZWZhdWx0U2NoZW1hSWRlbnRpZmllcigpOwogCQl9CiAJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTKSkgewotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnJ1bnRpbWVTdXBwb3J0c0VqYjMwKHRoaXMucnVudGltZSgpKSk7CisJCQlyZXR1cm4gZ2V0RGVmYXVsdERpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcygpOwogCQl9CiAJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExJU1RfQU5OT1RBVEVEX0NMQVNTRVMpKSB7Ci0JCQlyZXR1cm4gISBnZXRCb29sZWFuUHJvcGVydHkoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMpOworCQkJcmV0dXJuIGdldERlZmF1bHRMaXN0QW5ub3RhdGVkQ2xhc3NlcygpOwogCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENSRUFURV9PUk1fWE1MKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfQorCQkKIAkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwogCX0KIAkKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRQbGF0Zm9ybUlkKCk7CisJCisJcHJvdGVjdGVkIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgZ2V0RGVmYXVsdExpYnJhcnlQcm92aWRlcigpIHsKKwkJLy8gZGVsZWdhdGUgaXRzZWxmIGNoYW5nZXMsIG5vdCB0aGUgaW5zdGFuY2Ugb2YgZGVsZWdhdGUKKwkJaWYgKHRoaXMuZGVmYXVsdExpYnJhcnlQcm92aWRlciA9PSBudWxsKSB7CisJCQl0aGlzLmRlZmF1bHRMaWJyYXJ5UHJvdmlkZXIgPSB0aGlzLmJ1aWxkRGVmYXVsdExpYnJhcnlQcm92aWRlcigpOworCQl9CisJCXJldHVybiBkZWZhdWx0TGlicmFyeVByb3ZpZGVyOworCX0KKwkKKwlwcm90ZWN0ZWQgIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgYnVpbGREZWZhdWx0TGlicmFyeVByb3ZpZGVyKCkgeworCQlJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyA9IHRoaXMuZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpOworCQlpZiAoZnBqd2MgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJSVByb2plY3RGYWNldFZlcnNpb24gcGZ2ID0gdGhpcy5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7CisJCWlmIChwZnYgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBscCA9IG5ldyBMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKGZwandjLCBwZnYsIHRoaXMuYnVpbGRFbmFibGVtZW50VmFyaWFibGVzKCkpOworCQlscC5hZGRMaXN0ZW5lcih0aGlzLmJ1aWxkTGlicmFyeVByb3ZpZGVyTGlzdGVuZXIoKSk7CisJCXJldHVybiBscDsKKwl9CisJCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gYnVpbGRFbmFibGVtZW50VmFyaWFibGVzKCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGVuYWJsZW1lbnRWYXJpYWJsZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJZW5hYmxlbWVudFZhcmlhYmxlcy5wdXQoSnBhTGlicmFyeVByb3ZpZGVyQ29uc3RhbnRzLkVYUFJfVkFSX0pQQV9QTEFURk9STSwgdGhpcy5nZXRQbGF0Zm9ybUlkKCkpOworCQlyZXR1cm4gZW5hYmxlbWVudFZhcmlhYmxlczsKKwl9CisJCisJcHJvdGVjdGVkIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTGlicmFyeVByb3ZpZGVyTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUgKSB7CisJCQkJCUpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIudGhpcy5nZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZSgKKwkJCQkJCQlMSUJSQVJZX1BST1ZJREVSX0RFTEVHQVRFLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7CisJCQkJfQorCQkJfTsKKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0Q29ubmVjdGlvbigpOworCQorCXByb3RlY3RlZCBhYnN0cmFjdCBCb29sZWFuIGdldERlZmF1bHRVc2VyV2FudHNUb092ZXJyaWRlRGVmYXVsdENhdGFsb2coKTsKKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcigpOworCQorCXByb3RlY3RlZCBhYnN0cmFjdCBCb29sZWFuIGdldERlZmF1bHRVc2VyV2FudHNUb092ZXJyaWRlRGVmYXVsdFNjaGVtYSgpOworCQorCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKTsKKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgQm9vbGVhbiBnZXREZWZhdWx0RGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKCk7CisJCisJcHJvdGVjdGVkIEJvb2xlYW4gZ2V0RGVmYXVsdExpc3RBbm5vdGF0ZWRDbGFzc2VzKCkgeworCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCAhIHRoaXMuZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBydW50aW1lU3VwcG9ydHNFamIzMCgpIHsKKwkJSVJ1bnRpbWUgcnVudGltZSA9IHRoaXMuZ2V0UnVudGltZSgpOworCQlyZXR1cm4gKHJ1bnRpbWUgIT0gbnVsbCkgJiYgcnVudGltZS5zdXBwb3J0cyh0aGlzLmdldEVKQjMwKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0RUpCMzAoKSB7CisJCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRUpCX0ZBQ0VUX0lEKS5nZXRWZXJzaW9uKCIzLjAiKTsgLy8kTk9OLU5MUy0xJAorCX0KIAkKIAkKKwkvLyAqKioqKioqKioqIHN5bmNocm9uaXplIGRhdGEgbW9kZWwgKioqKioqKioqKgorCQorCS8qKgorCSAqIFRoZSBzcGVjaWZpZWQgcHJvcGVydHkncyB2YWx1ZSBoYXMgY2hhbmdlZCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorCSAqIFJldHVybiB3aGV0aGVyIHRvIGZpcmUgYSBWQUxVRV9DSEcgRGF0YU1vZGVsRXZlbnQuCisJICovCiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKIAkJYm9vbGVhbiBvayA9IHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFJVTlRJTUUpKSB7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFX1VTRVJfSlBBX0xJQlJBUlksIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJLy8gbmVlZCB0byBmaXJlIHRoYXQgdGhlIGRlZmF1bHQgY2hhbmdlIGZvciB1c2luZyB1c2VyIGxpYnJhcnkgbWF5IGhhdmUKLQkJCS8vIGFjdHVhbGx5IGNoYW5nZWQgZW5hYmxlbWVudCBmb3IgbGlicmFyeQotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShKUEFfTElCUkFSWSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKKwkJCisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkpKSB7CisJCQkvL25vLW9wCisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhGQUNFVF9WRVJTSU9OKSkgeworCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShMSUJSQVJZX1BST1ZJREVSX0RFTEVHQVRFLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFJVTlRJTUUpKSB7CisJCQlMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGxpZCA9IHRoaXMuZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpOworCQkJaWYgKGxpZCAhPSBudWxsKSB7CisJCQkJLy8gbWF5IGJlIG51bGwgd2hpbGUgbW9kZWwgaXMgYmVpbmcgYnVpbHQgdXAKKwkJCQkvLyAuLi4gb3IgaW4gdGVzdHMKKwkJCQlsaWQucmVmcmVzaCgpOworCQkJfQogCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUywgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7CiAJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKExJU1RfQU5OT1RBVEVEX0NMQVNTRVMsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwogCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTk5FQ1RJT04pKSB7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKENPTk5FQ1RJT04sIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCQl0aGlzLm1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShDT05ORUNUSU9OX0FDVElWRSwgY29ubmVjdGlvbklzQWN0aXZlKCkpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05ORUNUSU9OX0FDVElWRSkpIHsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSkpIHsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCWlmICghIChCb29sZWFuKSBwcm9wZXJ0eVZhbHVlKSB7Ci0JCQkJdGhpcy5tb2RlbC5zZXRQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBudWxsKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQTEFURk9STV9JRCkpIHsKKwkJCUxpYnJhcnlJbnN0YWxsRGVsZWdhdGUgbGlkID0gdGhpcy5nZXRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKCk7CisJCQlpZiAobGlkICE9IG51bGwpIHsKKwkJCQkvLyBtYXkgYmUgbnVsbCB3aGlsZSBtb2RlbCBpcyBiZWluZyBidWlsdCB1cAorCQkJCS8vIC4uLiBvciBpbiB0ZXN0cworCQkJCWxpZC5zZXRFbmFibGVtZW50Q29udGV4dFZhcmlhYmxlKEpwYUxpYnJhcnlQcm92aWRlckNvbnN0YW50cy5FWFBSX1ZBUl9KUEFfUExBVEZPUk0sIHByb3BlcnR5VmFsdWUpOwogCQkJfQogCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OKSkgewotCQkJdGhpcy5tb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoVVNFX1VTRVJfSlBBX0xJQlJBUlksICEgKEJvb2xlYW4pIHByb3BlcnR5VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTk5FQ1RJT04pKSB7CisJCQl0aGlzLnNldEJvb2xlYW5Qcm9wZXJ0eShDT05ORUNUSU9OX0FDVElWRSwgdGhpcy5jb25uZWN0aW9uSXNBY3RpdmUoKSk7CisJCQkKKwkJCS8vIEpwYUZhY2V0V2l6YXJkUGFnZSBzZXRzIHRoZSBjb25uZWN0aW9uIHdoZW4gdGhlIHVzZXIgYWRkcyBhIG5ldyBjb25uZWN0aW9uCisJCQkvLyBpbXBseWluZyB0aGF0IHRoZXJlIGlzIGEgbmV3IHNldCBvZiB2YWxpZCBjb25uZWN0aW9ucyB0byBjaG9vc2UgZnJvbQorCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShDT05ORUNUSU9OLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOworCQkJCisJCQkvLyBjYXRhbG9nCisJCQlpZiAoKHByb3BlcnR5VmFsdWUgIT0gbnVsbCkgJiYgdGhpcy5kYXRhYmFzZVN1cHBvcnRzQ2F0YWxvZ3MoKSkgeyAgLy8gY29ubmVjdGlvbiBzZXQgdG8gc29tZXRoaW5nIHRoYXQgc3VwcG9ydHMgY2F0YWxvZ3MKKwkJCQl0aGlzLnNldFByb3BlcnR5KFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HLCB0aGlzLmdldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcigpKTsKKwkJCX0gZWxzZSB7ICAvLyBjb25uZWN0aW9uIGVpdGhlciAnPE5vbmU+JyBvciBub24tY2F0YWxvZyBkYXRhYmFzZQorCQkJCXRoaXMuc2V0Qm9vbGVhblByb3BlcnR5KFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HLCBmYWxzZSk7CisJCQl9CisJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOworCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRywgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7CisJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOworCQkJCisJCQkvLyBzY2hlbWEKKwkJCWlmIChwcm9wZXJ0eVZhbHVlID09IG51bGwpIHsgIC8vIGNvbm5lY3Rpb24gc2V0IHRvICc8Tm9uZT4nCisJCQkJdGhpcy5zZXRCb29sZWFuUHJvcGVydHkoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLnNldFByb3BlcnR5KFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIHRoaXMuZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKSk7CisJCQl9CisJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7CisJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOworCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwogCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRV9VU0VSX0pQQV9MSUJSQVJZKSkgewotCQkJdGhpcy5tb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoVVNFX1NFUlZFUl9KUEFfSU1QTEVNRU5UQVRJT04sICEgKEJvb2xlYW4pIHByb3BlcnR5VmFsdWUpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShKUEFfTElCUkFSWSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05ORUNUSU9OX0FDVElWRSkpIHsKKwkJCS8vIGNhdGFsb2cKKwkJCWlmICh0aGlzLnByb3BlcnR5VmFsdWVJc0ZhbHNlKHByb3BlcnR5VmFsdWUpKSB7ICAvLyBjb25uZWN0aW9uIGlzIGluYWN0aXZlCisJCQkJdGhpcy5zZXRCb29sZWFuUHJvcGVydHkoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX0NBVEFMT0csIGZhbHNlKTsKKwkJCX0KKwkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX0NBVEFMT0csIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7CisJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKKwkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0csIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7CisJCQkKKwkJCS8vIHNjaGVtYQorCQkJaWYgKHRoaXMucHJvcGVydHlWYWx1ZUlzRmFsc2UocHJvcGVydHlWYWx1ZSkpIHsgIC8vIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUKKwkJCQl0aGlzLnNldEJvb2xlYW5Qcm9wZXJ0eShVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBmYWxzZSk7CisJCQl9CisJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7CisJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOworCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwogCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTKSkgewotCQkJdGhpcy5tb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoTElTVF9BTk5PVEFURURfQ0xBU1NFUywgISAoQm9vbGVhbikgcHJvcGVydHlWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpKSB7CisJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOworCQkJaWYgKHRoaXMucHJvcGVydHlWYWx1ZUlzRmFsc2UocHJvcGVydHlWYWx1ZSkpIHsKKwkJCQl0aGlzLnNldFByb3BlcnR5KFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HLCBudWxsKTsKKwkJCX0KIAkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMSVNUX0FOTk9UQVRFRF9DTEFTU0VTKSkgewotCQkJdGhpcy5tb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsICEgKEJvb2xlYW4pIHByb3BlcnR5VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HKSkgeworCQkJdGhpcy5zZXRQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCB0aGlzLmdldERlZmF1bHRTY2hlbWFJZGVudGlmaWVyKCkpOworCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKKwkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKSB7CisJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7CisJCQlpZiAodGhpcy5wcm9wZXJ0eVZhbHVlSXNGYWxzZShwcm9wZXJ0eVZhbHVlKSkgeworCQkJCXRoaXMuc2V0UHJvcGVydHkoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgbnVsbCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUykpIHsKKwkJCXRoaXMuc2V0Qm9vbGVhblByb3BlcnR5KExJU1RfQU5OT1RBVEVEX0NMQVNTRVMsIHRoaXMucHJvcGVydHlWYWx1ZUlzRmFsc2UocHJvcGVydHlWYWx1ZSkpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTElTVF9BTk5PVEFURURfQ0xBU1NFUykpIHsKKwkJCXRoaXMuc2V0Qm9vbGVhblByb3BlcnR5KERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLCB0aGlzLnByb3BlcnR5VmFsdWVJc0ZhbHNlKHByb3BlcnR5VmFsdWUpKTsKIAkJfQogCQlyZXR1cm4gb2s7CiAJfQotCisJCisJcHJvdGVjdGVkIGJvb2xlYW4gcHJvcGVydHlWYWx1ZUlzRmFsc2UoT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKKwkJcmV0dXJuICEgdGhpcy5wcm9wZXJ0eVZhbHVlSXNUcnVlKHByb3BlcnR5VmFsdWUpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9wZXJ0eVZhbHVlSXNUcnVlKE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7CisJCXJldHVybiAoKEJvb2xlYW4pIHByb3BlcnR5VmFsdWUpLmJvb2xlYW5WYWx1ZSgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHByb3BlcnR5IGRlc2NyaXB0b3JzICoqKioqKioqKioKKwkKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUExBVEZPUk1fSUQpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmFycmF5KAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yPigKLQkJCQkJCUpwYVBsYXRmb3JtUmVnaXN0cnkuaW5zdGFuY2UoKS5qcGFQbGF0Zm9ybUlkcygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHRyYW5zZm9ybShTdHJpbmcgcGxhdGZvcm1JZCkgewotCQkJCQkJcmV0dXJuIHBsYXRmb3JtSWRQcm9wZXJ0eURlc2NyaXB0b3IocGxhdGZvcm1JZCk7Ci0JCQkJCX0KLQkJCQl9LAotCQkJCW5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMF0pOworCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWxpZFBsYXRmb3JtRGVzY3JpcHRvcnMoKTsKIAkJfQogCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05ORUNUSU9OKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5hcnJheSgKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4oCi0JCQkJCQluZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPihudWxsLCBjb25uZWN0aW9uTmFtZXMoKSkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJCQlyZXR1cm4gY29ubmVjdGlvblByb3BlcnR5RGVzY3JpcHRvcihuZXh0KTsKLQkJCQkJfQotCQkJCX0sCi0JCQkJbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclswXSk7CisJCQlyZXR1cm4gdGhpcy5idWlsZFZhbGlkQ29ubmVjdGlvbkRlc2NyaXB0b3JzKCk7CisJCX0KKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpKSB7CisJCQlyZXR1cm4gdGhpcy5idWlsZFZhbGlkQ2F0YWxvZ0Rlc2NyaXB0b3JzKCk7CiAJCX0KIAkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuYXJyYXkoCi0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I+KHNjaGVtYXMoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQkJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKG5leHQpOwotCQkJCQl9Ci0JCQkJfSwKLQkJCQluZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzBdKTsKKwkJCXJldHVybiB0aGlzLmJ1aWxkVmFsaWRTY2hlbWFEZXNjcmlwdG9ycygpOwogCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpQQV9MSUJSQVJZKSkgewotCQkJU3RyaW5nW10gbGlicmFyaWVzID0gQ29sbGVjdGlvblRvb2xzLnNvcnQoSmF2YUNvcmUuZ2V0VXNlckxpYnJhcnlOYW1lcygpKTsKLQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltsaWJyYXJpZXMubGVuZ3RoICsgMV07Ci0JCQlkZXNjcmlwdG9yc1swXSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IoIiIsIFJVTlRJTUVfTk9ORSk7Ci0KLQkJCWludCBpID0gMTsKLQkJCWZvciAoU3RyaW5nIGxpYnJhcnkgOiBsaWJyYXJpZXMpIHsKLQkJCQlkZXNjcmlwdG9yc1tpKytdID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihsaWJyYXJ5LCBsaWJyYXJ5KTsKLQkJCX0KLQkJCXJldHVybiBkZXNjcmlwdG9yczsKLQkJfQotCisJCQogCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7CiAJfQogCQorCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBidWlsZFZhbGlkUGxhdGZvcm1EZXNjcmlwdG9ycygpIHsKKwkJSXRlcmFibGU8U3RyaW5nPiB2YWxpZFBsYXRmb3JtSWRzID0gYnVpbGRWYWxpZFBsYXRmb3JtSWRzKCk7CisJCUl0ZXJhYmxlPERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4gdmFsaWRQbGF0Zm9ybURlc2NyaXB0b3JzID0KKwkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4odmFsaWRQbGF0Zm9ybUlkcykgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciB0cmFuc2Zvcm0oU3RyaW5nIHBsYXRmb3JtSWQpIHsKKwkJCQkJCXJldHVybiBKcGFGYWNldERhdGFNb2RlbFByb3ZpZGVyLnRoaXMuYnVpbGRQbGF0Zm9ybUlkRGVzY3JpcHRvcihwbGF0Zm9ybUlkKTsKKwkJCQkJfQorCQkJCX07CisJCXJldHVybiBBcnJheVRvb2xzLnNvcnQoQXJyYXlUb29scy5hcnJheSh2YWxpZFBsYXRmb3JtRGVzY3JpcHRvcnMsIEVNUFRZX0RNUERfQVJSQVkpLCBERVNDUklQVE9SX0NPTVBBUkFUT1IpOworCX0KKwkKKwlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBidWlsZFZhbGlkUGxhdGZvcm1JZHMoKSB7CisJCVN0cmluZyBqcGFGYWNldFZlcnNpb24gPSB0aGlzLmdldFByb2plY3RGYWNldFZlcnNpb24oKS5nZXRWZXJzaW9uU3RyaW5nKCk7CisJCXJldHVybiBKcGFQbGF0Zm9ybVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1JZHNGb3JKcGFGYWNldFZlcnNpb24oanBhRmFjZXRWZXJzaW9uKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4gREVTQ1JJUFRPUl9DT01QQVJBVE9SID0KKwkJCW5ldyBDb21wYXJhdG9yPERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4oKSB7CisJCQkJcHVibGljIGludCBjb21wYXJlKERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkbXBkMSwgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGRtcGQyKSB7CisJCQkJCXJldHVybiBkbXBkMS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkuY29tcGFyZVRvKGRtcGQyLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSk7CisJCQkJfQorCQkJfTsKKwkKKwlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gYnVpbGRWYWxpZENvbm5lY3Rpb25EZXNjcmlwdG9ycygpIHsKKwkJTGlzdDxTdHJpbmc+IGNvbm5lY3Rpb25OYW1lcyA9IHRoaXMuYnVpbGRWYWxpZENvbm5lY3Rpb25OYW1lcygpOworCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbY29ubmVjdGlvbk5hbWVzLnNpemUoKV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKKwkJCWRlc2NyaXB0b3JzW2ldID0gdGhpcy5idWlsZENvbm5lY3Rpb25EZXNjcmlwdG9yKGNvbm5lY3Rpb25OYW1lcy5nZXQoaSkpOworCQl9CisJCXJldHVybiBkZXNjcmlwdG9yczsKKwl9CisJCisJLyoqCisJICogcHV0IGEgbnVsbCBlbnRyeSBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0IChmb3IgPG5vbmU+KQorCSAqLworCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGRWYWxpZENvbm5lY3Rpb25OYW1lcygpIHsKKwkJTGlzdDxTdHJpbmc+IGNvbm5lY3Rpb25OYW1lcyA9IENvbGxlY3Rpb25Ub29scy5zb3J0KENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lcygpKSk7CisJCWNvbm5lY3Rpb25OYW1lcy5hZGQoMCwgbnVsbCk7CisJCXJldHVybiBjb25uZWN0aW9uTmFtZXM7CisJfQorCQorCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBidWlsZFZhbGlkQ2F0YWxvZ0Rlc2NyaXB0b3JzKCkgeworCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwkJcmV0dXJuIChkYiA9PSBudWxsKSA/IEVNUFRZX0RNUERfQVJSQVkgOiB0aGlzLmJ1aWxkRGVzY3JpcHRvcnModGhpcy5idWlsZFZhbGlkQ2F0YWxvZ0lkZW50aWZpZXJzKGRiKSk7CisJfQorCQorCS8qKgorCSAqIHByZS1jb25kaXRpb246ICdkYicgaXMgbm90IG51bGwKKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGJ1aWxkVmFsaWRDYXRhbG9nSWRlbnRpZmllcnMoRGF0YWJhc2UgZGIpIHsKKwkJLy8gdXNlIGNhdGFsb2cgKmlkZW50aWZpZXJzKiBzaW5jZSB0aGUgc3RyaW5nIGVuZHMgdXAgYmVpbmcgdGhlICJkZWZhdWx0IiBmb3IgdmFyaW91cyB0ZXh0IGVudHJpZXMKKwkJcmV0dXJuIHRoaXMuYnVpbGRWYWxpZFN0cmluZ3MoZGIuc29ydGVkQ2F0YWxvZ0lkZW50aWZpZXJzKCksIHRoaXMuZ2V0RGVmYXVsdENhdGFsb2dJZGVudGlmaWVyKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gYnVpbGRWYWxpZFNjaGVtYURlc2NyaXB0b3JzKCkgeworCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwkJcmV0dXJuIChkYiA9PSBudWxsKSA/IEVNUFRZX0RNUERfQVJSQVkgOiB0aGlzLmJ1aWxkRGVzY3JpcHRvcnModGhpcy5idWlsZFZhbGlkU2NoZW1hSWRlbnRpZmllcnMoKSk7CisJfQorCQorCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGRWYWxpZFNjaGVtYUlkZW50aWZpZXJzKCkgeworCQlyZXR1cm4gdGhpcy5idWlsZFZhbGlkU3RyaW5ncyh0aGlzLnNjaGVtYUlkZW50aWZpZXJzKCksIHRoaXMuZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKSk7CisJfQorCQorCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHNjaGVtYUlkZW50aWZpZXJzKCkgeworCQlTY2hlbWFDb250YWluZXIgc2MgPSB0aGlzLmdldFNjaGVtYUNvbnRhaW5lcigpOworCQkvLyB1c2Ugc2NoZW1hICppZGVudGlmaWVycyogc2luY2UgdGhlIHN0cmluZyBlbmRzIHVwIGJlaW5nIHRoZSAiZGVmYXVsdCIgZm9yIHZhcmlvdXMgdGV4dCBlbnRyaWVzCisJCXJldHVybiAoc2MgIT0gbnVsbCkgPyBzYy5zb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpIDogRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCk7CisJfQorCQorCS8qKgorCSAqIHB1dCBhbiBlbnRyeSBmb3IgdGhlIGRlZmF1bHQgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdAorCSAqLworCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGRWYWxpZFN0cmluZ3MoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0sIFN0cmluZyBkZWZhdWx0U3RyaW5nKSB7CisJCUxpc3Q8U3RyaW5nPiBzdHJpbmdzID0gQ29sbGVjdGlvblRvb2xzLmxpc3Qoc3RyZWFtKTsKKwkJaWYgKChkZWZhdWx0U3RyaW5nICE9IG51bGwpICYmICEgc3RyaW5ncy5jb250YWlucyhkZWZhdWx0U3RyaW5nKSkgeworCQkJc3RyaW5ncy5hZGQoMCwgZGVmYXVsdFN0cmluZyk7CisJCX0KKwkJcmV0dXJuIHN0cmluZ3M7CisJfQorCQorCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBidWlsZERlc2NyaXB0b3JzKExpc3Q8U3RyaW5nPiBzdHJpbmdzKSB7CisJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltzdHJpbmdzLnNpemUoKV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKKwkJCWRlc2NyaXB0b3JzW2ldID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihzdHJpbmdzLmdldChpKSk7CisJCX0KKwkJcmV0dXJuIGRlc2NyaXB0b3JzOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIEVNUFRZX0RNUERfQVJSQVkgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzBdOworCQorCS8qKgorCSAqIHBsYXRmb3JtIGFuZCBjb25uZWN0aW9uIGhhdmUgJ2Rlc2NyaXB0aW9uJ3MgKGluIGFkZGl0aW9uIHRvICd2YWx1ZSdzKQorCSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUExBVEZPUk1fSUQpKSB7Ci0JCQlyZXR1cm4gcGxhdGZvcm1JZFByb3BlcnR5RGVzY3JpcHRvcihnZXRTdHJpbmdQcm9wZXJ0eShQTEFURk9STV9JRCkpOworCQkJcmV0dXJuIGJ1aWxkUGxhdGZvcm1JZERlc2NyaXB0b3IodGhpcy5nZXRQbGF0Zm9ybUlkKCkpOwogCQl9CiAJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTk5FQ1RJT04pKSB7Ci0JCQlyZXR1cm4gY29ubmVjdGlvblByb3BlcnR5RGVzY3JpcHRvcihnZXRTdHJpbmdQcm9wZXJ0eShDT05ORUNUSU9OKSk7CisJCQlyZXR1cm4gYnVpbGRDb25uZWN0aW9uRGVzY3JpcHRvcih0aGlzLmdldENvbm5lY3Rpb25OYW1lKCkpOwogCQl9CiAJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHlOYW1lKTsKIAl9CiAJCi0JcHJpdmF0ZSBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgcGxhdGZvcm1JZFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcGxhdGZvcm1JZCkgewotCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcigKLQkJCXBsYXRmb3JtSWQsIEpwYVBsYXRmb3JtUmVnaXN0cnkuaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybUxhYmVsKHBsYXRmb3JtSWQpKTsKKwlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGJ1aWxkUGxhdGZvcm1JZERlc2NyaXB0b3IoU3RyaW5nIHBsYXRmb3JtSWQpIHsKKwkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IocGxhdGZvcm1JZCwgdGhpcy5nZXRQbGF0Zm9ybUxhYmVsKHBsYXRmb3JtSWQpKTsKIAl9CiAJCi0JcHJpdmF0ZSBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgY29ubmVjdGlvblByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgY29ubmVjdGlvbikgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShjb25uZWN0aW9uKSkgewotCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IobnVsbCwgSnB0Q29yZU1lc3NhZ2VzLk5PTkUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IoY29ubmVjdGlvbik7Ci0JCX0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtTGFiZWwoU3RyaW5nIHBsYXRmb3JtSWQpIHsKKwkJcmV0dXJuIEpwYVBsYXRmb3JtUmVnaXN0cnkuaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybUxhYmVsKHBsYXRmb3JtSWQpOwogCX0KLQorCQorCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgYnVpbGRDb25uZWN0aW9uRGVzY3JpcHRvcihTdHJpbmcgY29ubmVjdGlvbk5hbWUpIHsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gKGNvbm5lY3Rpb25OYW1lID09IG51bGwpID8gSnB0Q29yZU1lc3NhZ2VzLk5PTkUgOiBudWxsOworCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihjb25uZWN0aW9uTmFtZSwgZGVzY3JpcHRpb24pOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIGRhdGFiYXNlICoqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgU2NoZW1hQ29udGFpbmVyIGdldFNjaGVtYUNvbnRhaW5lcigpIHsKKwkJcmV0dXJuIHRoaXMuZGF0YWJhc2VTdXBwb3J0c0NhdGFsb2dzKCkgPyB0aGlzLmdldENhdGFsb2coKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwl9CisJCisJcHJvdGVjdGVkIENhdGFsb2cgZ2V0Q2F0YWxvZygpIHsKKwkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCk7CisJCXJldHVybiAobmFtZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldENhdGFsb2cobmFtZSk7CisJfQorCQorCS8qKgorCSAqIHByZS1jb25kaXRpb246ICduYW1lJyBpcyBub3QgbnVsbAorCSAqLworCXByb3RlY3RlZCBDYXRhbG9nIGdldENhdGFsb2coU3RyaW5nIG5hbWUpIHsKKwkJRGF0YWJhc2UgZGIgPSB0aGlzLmdldERhdGFiYXNlKCk7CisJCXJldHVybiAoZGIgPT0gbnVsbCkgPyBudWxsIDogZGIuZ2V0Q2F0YWxvZ0ZvcklkZW50aWZpZXIobmFtZSk7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGRhdGFiYXNlU3VwcG9ydHNDYXRhbG9ncygpIHsKKwkJRGF0YWJhc2UgZGIgPSB0aGlzLmdldERhdGFiYXNlKCk7CisJCXJldHVybiAoZGIgIT0gbnVsbCkgJiYgZGIuc3VwcG9ydHNDYXRhbG9ncygpOworCX0KKwkKKwlwcm90ZWN0ZWQgRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKSB7CisJCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOworCQlyZXR1cm4gKGNwID09IG51bGwpID8gbnVsbCA6IGNwLmdldERhdGFiYXNlKCk7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25Jc0FjdGl2ZSgpIHsKKwkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7CisJCXJldHVybiAoY3AgIT0gbnVsbCkgJiYgY3AuaXNBY3RpdmUoKTsKKwl9CisJCisJcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgeworCQlTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0Q29ubmVjdGlvbk5hbWUoKTsKKwkJcmV0dXJuIChuYW1lID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUobmFtZSk7CisJfQorCQorCS8qKgorCSAqIHByZS1jb25kaXRpb246ICduYW1lJyBpcyBub3QgbnVsbAorCSAqLworCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSkgeworCQlpZiAodGhpcy5jYWNoZWRDb25uZWN0aW9uUHJvZmlsZUlzU3RhbGUobmFtZSkpIHsKKwkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUobmFtZSk7CisJCX0KKwkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGU7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGNhY2hlZENvbm5lY3Rpb25Qcm9maWxlSXNTdGFsZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gKHRoaXMuY29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgfHwgISB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldE5hbWUoKS5lcXVhbHMobmFtZSk7CisJfQorCQorCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZSBidWlsZENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUobmFtZSwgRGF0YWJhc2VGaW5kZXIuRGVmYXVsdC5pbnN0YW5jZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gY29ubmVjdGlvblByb2ZpbGVOYW1lcygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuY29ubmVjdGlvblByb2ZpbGVOYW1lcygpOworCX0KKwkKKwlwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpIHsKKwkJLy8gd2UgZG9uJ3QgaGF2ZSBhIEpQQSBwcm9qZWN0IHlldCwgc28gZ28gdG8gdGhlIGRiIHBsdWctaW4gZGlyZWN0bHkgdG8gZ2V0IHRoZSBmYWN0b3J5CisJCXJldHVybiBKcHREYlBsdWdpbi5pbnN0YW5jZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCQogCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lLmVxdWFscyhQTEFURk9STV9JRCkpIHsKLQkJCXJldHVybiB0aGlzLnZhbGlkYXRlUGxhdGZvcm1JZCh0aGlzLmdldFN0cmluZ1Byb3BlcnR5KG5hbWUpKTsKKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBMQVRGT1JNX0lEKSkgeworCQkJcmV0dXJuIHRoaXMudmFsaWRhdGVQbGF0Zm9ybUlkKCk7CiAJCX0KLQkJaWYgKG5hbWUuZXF1YWxzKENPTk5FQ1RJT04pKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWxpZGF0ZUNvbm5lY3Rpb25OYW1lKHRoaXMuZ2V0U3RyaW5nUHJvcGVydHkobmFtZSkpOworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMSUJSQVJZX1BST1ZJREVSX0RFTEVHQVRFKSkgeworCQkgICAgcmV0dXJuIHRoaXMuZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpLnZhbGlkYXRlKCk7CiAJCX0KLQkJaWYgKG5hbWUuZXF1YWxzKFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpCi0JCQkJfHwgbmFtZS5lcXVhbHMoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSkpIHsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OTkVDVElPTikpIHsKKwkJCXJldHVybiB0aGlzLnZhbGlkYXRlQ29ubmVjdGlvbigpOworCQl9CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HKQorCQkJCXx8IHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpKSB7CisJCQlyZXR1cm4gdGhpcy52YWxpZGF0ZVVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCk7CisJCX0KKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSkKKwkJCQl8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKSB7CiAJCQlyZXR1cm4gdGhpcy52YWxpZGF0ZVVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKTsKIAkJfQotCQlpZiAobmFtZS5lcXVhbHMoVVNFX1NFUlZFUl9KUEFfSU1QTEVNRU5UQVRJT04pKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWxpZGF0ZUpwYUxpYnJhcnkodGhpcy5nZXRCb29sZWFuUHJvcGVydHkobmFtZSkpOworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUykpIHsKKwkJCXJldHVybiB0aGlzLnZhbGlkYXRlUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudCgpOwogCQl9Ci0JCWlmIChuYW1lLmVxdWFscyhESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUykpIHsKLQkJCXJldHVybiB0aGlzLnZhbGlkYXRlUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudCh0aGlzLmdldEJvb2xlYW5Qcm9wZXJ0eShuYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSVJ1bnRpbWUgcnVudGltZSgpIHsKLQkJcmV0dXJuIChJUnVudGltZSkgdGhpcy5nZXRQcm9wZXJ0eShSVU5USU1FKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcnVudGltZVN1cHBvcnRzRWpiMzAoSVJ1bnRpbWUgcnVudGltZSkgewotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBlamIzMCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChFSkJfRkFDRVRfSUQpLmdldFZlcnNpb24oIjMuMCIpOwotCQlyZXR1cm4gKHJ1bnRpbWUgPT0gbnVsbCkgPyBmYWxzZSA6IHJ1bnRpbWUuc3VwcG9ydHMoZWpiMzApOwotCX0KLQkKLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb24oKSB7Ci0JCVN0cmluZyBjb25uZWN0aW9uTmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KENPTk5FQ1RJT04pOwotCQlyZXR1cm4gSnB0RGJQbHVnaW4uaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkoKS5jb25uZWN0aW9uUHJvZmlsZU5hbWVkKGNvbm5lY3Rpb25OYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNvbm5lY3Rpb25Jc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIGdldENvbm5lY3Rpb24oKS5pc0FjdGl2ZSgpOwotCX0KLQkKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY29ubmVjdGlvbk5hbWVzKCkgewotCQlTdHJpbmcgc2V0VmFsdWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShDT05ORUNUSU9OKTsKIAkJCi0JCUxpc3Q8U3RyaW5nPiBjb25uZWN0aW9uTmFtZXMgPSBDb2xsZWN0aW9uVG9vbHMuc29ydChDb2xsZWN0aW9uVG9vbHMubGlzdCgKLQkJCUpwdERiUGx1Z2luLmluc3RhbmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5KCkuY29ubmVjdGlvblByb2ZpbGVOYW1lcygpKSk7Ci0JCQotCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHNldFZhbHVlKSAmJiAhIGNvbm5lY3Rpb25OYW1lcy5jb250YWlucyhzZXRWYWx1ZSkpIHsKLQkJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPihzZXRWYWx1ZSwgY29ubmVjdGlvbk5hbWVzLml0ZXJhdG9yKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGNvbm5lY3Rpb25OYW1lcy5pdGVyYXRvcigpOwotCQl9CisJCXJldHVybiBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwogCX0KIAkKLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hTmFtZSgpIHsKLQkJU2NoZW1hIGRlZmF1bHRTY2hlbWEgPSBnZXRDb25uZWN0aW9uKCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlyZXR1cm4gKGRlZmF1bHRTY2hlbWEgPT0gbnVsbCkgPyBudWxsIDogZGVmYXVsdFNjaGVtYS5nZXROYW1lKCk7CisJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVQbGF0Zm9ybUlkKCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0UGxhdGZvcm1JZCgpID09IG51bGwpID8gUExBVEZPUk1fTk9UX1NQRUNJRklFRF9TVEFUVVMgOiBPS19TVEFUVVM7CiAJfQogCQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBzY2hlbWFzKCkgewotCQlTdHJpbmcgc2V0VmFsdWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKTsKLQkJCi0JCUxpc3Q8U3RyaW5nPiBzY2hlbWFzID0gQ29sbGVjdGlvblRvb2xzLnNvcnQoQ29sbGVjdGlvblRvb2xzLmxpc3QoCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTY2hlbWEsIFN0cmluZz4oZ2V0Q29ubmVjdGlvbigpLmdldERhdGFiYXNlKCkuc2NoZW1hdGEoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFNjaGVtYSBuZXh0KSB7Ci0JCQkJCXJldHVybiBuZXh0LmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9KSk7Ci0JCQotCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHNldFZhbHVlKSAmJiAhIHNjaGVtYXMuY29udGFpbnMoc2V0VmFsdWUpKSB7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4oc2V0VmFsdWUsIHNjaGVtYXMuaXRlcmF0b3IoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gc2NoZW1hcy5pdGVyYXRvcigpOwotCQl9CisJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVDb25uZWN0aW9uKCkgeworCQlTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSB0aGlzLmdldENvbm5lY3Rpb25OYW1lKCk7CisJCXJldHVybiAoY29ubmVjdGlvbk5hbWUgPT0gbnVsbCkgPyBPS19TVEFUVVMgOiB0aGlzLnZhbGlkYXRlTm9uTnVsbENvbm5lY3Rpb24oY29ubmVjdGlvbk5hbWUpOwogCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVBsYXRmb3JtSWQoU3RyaW5nIHBsYXRmb3JtSWQpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocGxhdGZvcm1JZCkgPwotCQkJCVBMQVRGT1JNX05PVF9TUEVDSUZJRURfU1RBVFVTCi0JCQk6Ci0JCQkJT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZUNvbm5lY3Rpb25OYW1lKFN0cmluZyBjb25uZWN0aW9uTmFtZSkgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShjb25uZWN0aW9uTmFtZSkpIHsKLQkJCXJldHVybiBPS19TVEFUVVM7Ci0JCX0KLQkJQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGUgPSBKcHREYlBsdWdpbi5pbnN0YW5jZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSgpLmNvbm5lY3Rpb25Qcm9maWxlTmFtZWQoY29ubmVjdGlvbk5hbWUpOwotCQlpZiAoY29ubmVjdGlvblByb2ZpbGUuaXNOdWxsKCkpIHsKLQkJCXJldHVybiBidWlsZEVycm9yU3RhdHVzKEpwdENvcmVNZXNzYWdlcy5iaW5kKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9DT05ORUNUSU9OX0lOVkFMSUQsIGNvbm5lY3Rpb25OYW1lKSk7CiAJCisJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVOb25OdWxsQ29ubmVjdGlvbihTdHJpbmcgY29ubmVjdGlvbk5hbWUpIHsKKwkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKGNvbm5lY3Rpb25OYW1lKTsKKwkJaWYgKGNwID09IG51bGwpIHsKKwkJCXJldHVybiBidWlsZEVycm9yU3RhdHVzKE5MUy5iaW5kKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9DT05ORUNUSU9OX0lOVkFMSUQsIGNvbm5lY3Rpb25OYW1lKSk7CiAJCX0KLQkJaWYgKCEgY29ubmVjdGlvblByb2ZpbGUuaXNBY3RpdmUoKSkgeworCQlpZiAoICEgY3AuaXNBY3RpdmUoKSkgewogCQkJcmV0dXJuIENPTk5FQ1RJT05fTk9UX0NPTk5FQ1RFRF9TVEFUVVM7CiAJCX0KIAkJcmV0dXJuIE9LX1NUQVRVUzsKIAl9CiAJCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlVXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSgpIHsKLQkJaWYgKGdldEJvb2xlYW5Qcm9wZXJ0eShVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSkgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0U3RyaW5nUHJvcGVydHkoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSkpKSB7CisJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpIHsKKwkJaWYgKHRoaXMudXNlcldhbnRzVG9PdmVycmlkZURlZmF1bHRDYXRhbG9nKCkpIHsKKwkJCWlmICh0aGlzLmdldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCkgPT0gbnVsbCkgeworCQkJCXJldHVybiBVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPR19OT1RfU1BFQ0lGSUVEX1NUQVRVUzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gT0tfU1RBVFVTOworCX0KKwkKKwlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKSB7CisJCWlmICh0aGlzLnVzZXJXYW50c1RvT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCkpIHsKKwkJCWlmICh0aGlzLmdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKSA9PSBudWxsKSB7CiAJCQkJcmV0dXJuIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUFfTk9UX1NQRUNJRklFRF9TVEFUVVM7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIE9LX1NUQVRVUzsKIAl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVKcGFMaWJyYXJ5KGJvb2xlYW4gdXNlU2VydmVySnBhSW1wbGVtZW50YXRpb24pIHsKLQkJaWYgKHVzZVNlcnZlckpwYUltcGxlbWVudGF0aW9uKSB7Ci0JCQlJUnVudGltZSBydW50aW1lID0gdGhpcy5ydW50aW1lKCk7Ci0JCQlpZiAocnVudGltZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIFJVTlRJTUVfTk9UX1NQRUNJRklFRF9TVEFUVVM7Ci0JCQl9Ci0JCQlpZiAoICEgdGhpcy5ydW50aW1lU3VwcG9ydHNFamIzMChydW50aW1lKSkgewotCQkJCXJldHVybiBSVU5USU1FX0RPRVNfTk9UX1NVUFBPUlRfRUpCXzMwX1NUQVRVUzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2V0U3RyaW5nUHJvcGVydHkoSlBBX0xJQlJBUlkpKSkgewotCQkJCXJldHVybiBMSUJSQVJZX05PVF9TUEVDSUZJRURfU1RBVFVTOwotCQkJfQotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudChib29sZWFuIGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcykgeworCQorCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudCgpIHsKIAkJLy8gVE9ETyB3YXJuaW5nIGlmICJkaXNjb3ZlcnkiIGlzIHVzZWQsIGJ1dCBubyBydW50aW1lIHNwZWNpZmllZCA/PworCQkvLyBib29sZWFuIGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyA9IHRoaXMuZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKCk7CiAJCXJldHVybiBPS19TVEFUVVM7CiAJfQotCi0KKwkKKwkKIAkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgYnVpbGRJbmZvU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7CisJCisJcHJvdGVjdGVkIHN0YXRpYyBJU3RhdHVzIGJ1aWxkSW5mb1N0YXR1cyhTdHJpbmcgbWVzc2FnZSkgewogCQlyZXR1cm4gYnVpbGRTdGF0dXMoSVN0YXR1cy5JTkZPLCBtZXNzYWdlKTsKIAl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGJ1aWxkV2FybmluZ1N0YXR1cyhTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gYnVpbGRTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBtZXNzYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGJ1aWxkRXJyb3JTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKKwkKKy8vCXByaXZhdGUgc3RhdGljIElTdGF0dXMgYnVpbGRXYXJuaW5nU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7CisvLwkJcmV0dXJuIGJ1aWxkU3RhdHVzKElTdGF0dXMuV0FSTklORywgbWVzc2FnZSk7CisvLwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBJU3RhdHVzIGJ1aWxkRXJyb3JTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKIAkJcmV0dXJuIGJ1aWxkU3RhdHVzKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpOwogCX0KLQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgYnVpbGRTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgeworCQorCXByb3RlY3RlZCBzdGF0aWMgSVN0YXR1cyBidWlsZFN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7CiAJCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwYmZiMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldDsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgaW50ZXJmYWNlIEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMKKwlleHRlbmRzIEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcworeworCVN0cmluZyBQUkVGSVggPSAiSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyI7CisJU3RyaW5nIFBSRUZJWF8gPSBQUkVGSVggKyAnLic7CisJCisJLyoqCisJICogUmVxdWlyZWQsIHR5cGUgQm9vbGVhbiwgaWRlbnRpZmllcyBpZiB0aGUgdXNlciB3aXNoZXMgdG8gYWRkIHRoZSBkYXRhYmFzZSBkcml2ZXIgamFycyB0byB0aGUgY2xhc3NwYXRoCisJICovCisJU3RyaW5nIFVTRVJfV0FOVFNfVE9fQUREX0RCX0RSSVZFUl9KQVJTX1RPX0NMQVNTUEFUSCA9IFBSRUZJWF8gKyAiVVNFUl9XQU5UU19UT19BRERfREJfRFJJVkVSX0pBUlNfVE9fQ0xBU1NQQVRIIjsKKworCS8qKgorCSAqIE5vdCByZXF1aXJlZCwgdHlwZSBTdHJpbmcsIGlkZW50aWZpZXMgdGhlIGRhdGFiYXNlIGRyaXZlciBsaWJyYXJ5IGFkZGVkIHRvIHRoZSBjbGFzc3BhdGgKKwkgKi8KKwlTdHJpbmcgREJfRFJJVkVSX05BTUUgPSBQUkVGSVhfICsgIkRCX0RSSVZFUl9OQU1FIjsKKworCS8qKgorCSAqIFJlcXVpcmVkLCB0eXBlIGJvb2xlYW4sIGRldGFpbHMgd2hldGhlciBvcm0ueG1sIHNob3VsZCBiZSBjcmVhdGVkCisJICovCisJU3RyaW5nIENSRUFURV9PUk1fWE1MID0gUFJFRklYXyArICJDUkVBVEVfT1JNX1hNTCI7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiY2YzMDYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0OworCitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CisKK3B1YmxpYyBjbGFzcyBKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcgorCWV4dGVuZHMgSnBhRmFjZXREYXRhTW9kZWxQcm92aWRlcgorCWltcGxlbWVudHMgSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcworeworCS8qKgorCSAqIHJlcXVpcmVkIGRlZmF1bHQgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRQcm9wZXJ0eU5hbWVzKCkgeworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgU2V0PFN0cmluZz4gcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKKwkJcHJvcGVydHlOYW1lcy5hZGQoVVNFUl9XQU5UU19UT19BRERfREJfRFJJVkVSX0pBUlNfVE9fQ0xBU1NQQVRIKTsKKwkJcHJvcGVydHlOYW1lcy5hZGQoREJfRFJJVkVSX05BTUUpOworCQlwcm9wZXJ0eU5hbWVzLmFkZChDUkVBVEVfT1JNX1hNTCk7CisJCXJldHVybiBwcm9wZXJ0eU5hbWVzOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHByb3BlcnRpZXMgKioqKioqKioqKgorCQorCXByb3RlY3RlZCBib29sZWFuIHVzZXJXYW50c1RvQWRkRGJEcml2ZXJKYXJzVG9DbGFzc3BhdGgoKSB7CisJCXJldHVybiB0aGlzLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VSX1dBTlRTX1RPX0FERF9EQl9EUklWRVJfSkFSU19UT19DTEFTU1BBVEgpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldFByb3BlcnR5KERCX0RSSVZFUl9OQU1FKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBlbmFibGVkICoqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfV0FOVFNfVE9fQUREX0RCX0RSSVZFUl9KQVJTX1RPX0NMQVNTUEFUSCkpIHsKKwkJCXJldHVybiAodGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpICE9IG51bGwpOworCQl9CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKERCX0RSSVZFUl9OQU1FKSkgeworCQkJcmV0dXJuIHRoaXMudXNlcldhbnRzVG9BZGREYkRyaXZlckphcnNUb0NsYXNzcGF0aCgpOworCQl9CisJCQorCQlyZXR1cm4gc3VwZXIuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBkZWZhdWx0cyAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX1dBTlRTX1RPX0FERF9EQl9EUklWRVJfSkFSU19UT19DTEFTU1BBVEgpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJfQorCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhEQl9EUklWRVJfTkFNRSkpIHsKKwkJCXJldHVybiB0aGlzLmdldERlZmF1bHREcml2ZXJOYW1lKCk7CisJCX0KKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ1JFQVRFX09STV9YTUwpKSB7CisJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCQl9CisJCQorCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFBsYXRmb3JtSWQoKSB7CisJCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldERlZmF1bHRKcGFQbGF0Zm9ybUlkKGdldFByb2plY3RGYWNldFZlcnNpb24oKS5nZXRWZXJzaW9uU3RyaW5nKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRDb25uZWN0aW9uKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEJvb2xlYW4gZ2V0RGVmYXVsdFVzZXJXYW50c1RvT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpIHsKKwkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2dJZGVudGlmaWVyKCkgeworCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwkJcmV0dXJuIChkYiA9PSBudWxsKSA/IG51bGwgOiBkYi5nZXREZWZhdWx0Q2F0YWxvZ0lkZW50aWZpZXIoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEJvb2xlYW4gZ2V0RGVmYXVsdFVzZXJXYW50c1RvT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCkgeworCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hSWRlbnRpZmllcigpICB7CisJCVNjaGVtYUNvbnRhaW5lciBzYyA9IHRoaXMuZ2V0U2NoZW1hQ29udGFpbmVyKCk7CisJCXJldHVybiAoc2MgPT0gbnVsbCkgPyBudWxsIDogc2MuZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RHJpdmVyTmFtZSgpIHsKKwkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7CisJCXJldHVybiAoY3AgPT0gbnVsbCkgPyBudWxsIDogY3AuZ2V0RHJpdmVyTmFtZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQm9vbGVhbiBnZXREZWZhdWx0RGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKCkgeworCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMucnVudGltZVN1cHBvcnRzRWpiMzAoKSk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogc3luY2hyb25pemUgZGF0YSBtb2RlbCAqKioqKioqKioqCisJCisJLyoqCisJICogVGhlIHNwZWNpZmllZCBwcm9wZXJ0eSdzIHZhbHVlIGhhcyBjaGFuZ2VkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisJICogUmV0dXJuIHdoZXRoZXIgdG8gZmlyZSBhIFZBTFVFX0NIRyBEYXRhTW9kZWxFdmVudC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgeworCQlib29sZWFuIG9rID0gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKKwkJCisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTk5FQ1RJT04pKSB7CisJCQkvLyBkYiBkcml2ZXIKKwkJCWlmIChwcm9wZXJ0eVZhbHVlID09IG51bGwpIHsgIC8vIGNvbm5lY3Rpb24gc2V0IHRvICc8Tm9uZT4nCisJCQkJdGhpcy5zZXRCb29sZWFuUHJvcGVydHkoVVNFUl9XQU5UU19UT19BRERfREJfRFJJVkVSX0pBUlNfVE9fQ0xBU1NQQVRILCBmYWxzZSk7CisJCQl9CisJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfV0FOVFNfVE9fQUREX0RCX0RSSVZFUl9KQVJTX1RPX0NMQVNTUEFUSCwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKKwkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoREJfRFJJVkVSX05BTUUsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOworCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShEQl9EUklWRVJfTkFNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfV0FOVFNfVE9fQUREX0RCX0RSSVZFUl9KQVJTX1RPX0NMQVNTUEFUSCkpIHsKKwkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoREJfRFJJVkVSX05BTUUsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7CisJCQlpZiAodGhpcy5wcm9wZXJ0eVZhbHVlSXNGYWxzZShwcm9wZXJ0eVZhbHVlKSkgeworCQkJCXRoaXMuc2V0UHJvcGVydHkoREJfRFJJVkVSX05BTUUsIG51bGwpOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gb2s7CisJfQorCQorCQorCS8vICoqKioqKioqKiogcHJvcGVydHkgZGVzY3JpcHRvcnMgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBMQVRGT1JNX0lEKSkgeworCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWxpZFBsYXRmb3JtRGVzY3JpcHRvcnMoKTsKKwkJfQorCisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTk5FQ1RJT04pKSB7CisJCQlyZXR1cm4gdGhpcy5idWlsZFZhbGlkQ29ubmVjdGlvbkRlc2NyaXB0b3JzKCk7CisJCX0KKworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhEQl9EUklWRVJfTkFNRSkpIHsKKwkJCXJldHVybiB0aGlzLmJ1aWxkVmFsaWREcml2ZXJEZXNjcmlwdG9ycygpOworCQl9CisKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpKSB7CisJCQlyZXR1cm4gdGhpcy5idWlsZFZhbGlkQ2F0YWxvZ0Rlc2NyaXB0b3JzKCk7CisJCX0KKworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSkgeworCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWxpZFNjaGVtYURlc2NyaXB0b3JzKCk7CisJCX0KKworCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7CisJfQorCQorCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBidWlsZFZhbGlkRHJpdmVyRGVzY3JpcHRvcnMoKSB7CisJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10geyBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMuZ2V0RHJpdmVyTmFtZSgpKSB9OworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9XQU5UU19UT19BRERfREJfRFJJVkVSX0pBUlNfVE9fQ0xBU1NQQVRIKQorCQkJCXx8IHByb3BlcnR5TmFtZS5lcXVhbHMoREJfRFJJVkVSX05BTUUpKSB7CisJCQlyZXR1cm4gdGhpcy52YWxpZGF0ZURiRHJpdmVyTmFtZSgpOworCQl9CisJCQorCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKKwl9CisJCisJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVEYkRyaXZlck5hbWUoKSB7CisJCXJldHVybiBPS19TVEFUVVM7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQppbmRleCBmOWMyOTVlLi40MWU0ZDFjIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMiwyMCArMTIsMTMgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLklDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRWFyVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5KcHREYlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247CiAKIC8qKgpAQCAtMzQsMTAwICsyNyw2MCBAQAogICogdXNlZCBpbiB0aGUgUE9TVF9JTlNUQUxMIGV2ZW50IGxpc3RlbmVyIHRvIGJ1aWxkIHRoZSBKUEEgcHJvamVjdC4KICAqLwogcHVibGljIGNsYXNzIEpwYUZhY2V0SW5zdGFsbERlbGVnYXRlIAotCWltcGxlbWVudHMgSURlbGVnYXRlLCBKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMKKwlleHRlbmRzIEpwYUZhY2V0QWN0aW9uRGVsZWdhdGUKKwlpbXBsZW1lbnRzIEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMKIHsKLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIAotCQkJCU9iamVjdCBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQltb25pdG9yID0gdGhpcy5ub25OdWxsTW9uaXRvcihtb25pdG9yKTsKLQkJdHJ5IHsKLQkJCXRoaXMuZXhlY3V0ZV8ocHJvamVjdCwgZnYsIGNvbmZpZywgbW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjdXRlXyhJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0JCQkJT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZV8oCisJCQlJUHJvamVjdCBwcm9qZWN0LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIAorCQkJT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCQotCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQogCQkvLyBOQjogV1RQIE5hdHVyZXMgKGluY2x1ZGluZyB0aGUgSmF2YUVNRk5hdHVyZSkKIAkJLy8gc2hvdWxkIGFscmVhZHkgYmUgYWRkZWQsIGFzIHRoaXMgZmFjZXQgc2hvdWxkIAogCQkvLyBhbHdheXMgY29leGlzdCB3aXRoIGEgbW9kdWxlIGZhY2V0LgotCisJCQorCQlzdXBlci5leGVjdXRlXyhwcm9qZWN0LCBmdiwgY29uZmlnLCBtb25pdG9yKTsKKwkJCiAJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKIAkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSAoSURhdGFNb2RlbCkgY29uZmlnOwotCQl0aGlzLmNvbmZpZ3VyZUNsYXNzcGF0aChqYXZhUHJvamVjdCwgZGF0YU1vZGVsLCBtb25pdG9yKTsKKwkJCisJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAogCQkKIAkJLy8gcHJvamVjdCBzZXR0aW5ncwotCQlKcHRDb3JlUGx1Z2luLnNldEpwYVBsYXRmb3JtSWQocHJvamVjdCwgZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBMQVRGT1JNX0lEKSk7Ci0JCUpwdENvcmVQbHVnaW4uc2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKHByb2plY3QsIGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDT05ORUNUSU9OKSk7Ci0JCWlmIChkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKSB7Ci0JCQlKcHRDb3JlUGx1Z2luLnNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKHByb2plY3QsIGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSk7Ci0JCX0KLQkJSnB0Q29yZVBsdWdpbi5zZXREaXNjb3ZlckFubm90YXRlZENsYXNzZXMocHJvamVjdCwgZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUykpOwotCQkKLQkJLy8gZGVmYXVsdHMgc2V0dGluZ3MKLQkJSnB0Q29yZVBsdWdpbi5zZXREZWZhdWx0SnBhUGxhdGZvcm1JZChkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUExBVEZPUk1fSUQpKTsKKwkJdGhpcy5hZGREYkRyaXZlckxpYnJhcnlUb0NsYXNzcGF0aChqYXZhUHJvamVjdCwgZGF0YU1vZGVsLCBtb25pdG9yKTsKIAkJCiAJCW1vbml0b3Iud29ya2VkKDEpOwogCX0KLQotCXByaXZhdGUgdm9pZCBjb25maWd1cmVDbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJRGF0YU1vZGVsIGRhdGFNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gdXNlU2VydmVyTGlicmFyeSA9IGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoVVNFX1NFUlZFUl9KUEFfSU1QTEVNRU5UQVRJT04pOwotCQlpZiAodXNlU2VydmVyTGlicmFyeSkgeworCQorCXByb3RlY3RlZCB2b2lkIGFkZERiRHJpdmVyTGlicmFyeVRvQ2xhc3NwYXRoKAorCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJRGF0YU1vZGVsIGRhdGFNb2RlbCwgCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCisJCWlmKCAhIGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoVVNFUl9XQU5UU19UT19BRERfREJfRFJJVkVSX0pBUlNfVE9fQ0xBU1NQQVRIKSkgewogCQkJcmV0dXJuOwogCQl9Ci0KLQkJU3RyaW5nIGpwYUxpYnJhcnkgPSBkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSlBBX0xJQlJBUlkpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShqcGFMaWJyYXJ5KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gYnVpbGQgdGhlIEpQQSBsaWJyYXJ5IHRvIGJlIGFkZGVkIHRvIHRoZSBjbGFzc3BhdGgKLQkJSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMgPSB0aGlzLmJ1aWxkQ2xhc3NwYXRoQXR0cmlidXRlcyhqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlJQ2xhc3NwYXRoRW50cnkganBhTGlicmFyeUVudHJ5ID0gCi0JCQlKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeSgKLQkJCQluZXcgUGF0aChKYXZhQ29yZS5VU0VSX0xJQlJBUllfQ09OVEFJTkVSX0lEICsgIi8iICsganBhTGlicmFyeSksCi0JCQkJbnVsbCwgYXR0cmlidXRlcywgdHJ1ZQotCQkJKTsKLQotCQkvLyBpZiB0aGUgSlBBIGxpYnJhcnkgaXMgYWxyZWFkeSB0aGVyZSwgZG8gbm90aGluZworCQlTdHJpbmcgZHJpdmVyTmFtZSA9IGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShEQl9EUklWRVJfTkFNRSk7CisJCQorCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEpwdERiUGx1Z2luLmluc3RhbmNlKCkuYnVpbGREcml2ZXJDbGFzc3BhdGhDb250YWluZXJGb3IoZHJpdmVyTmFtZSk7CisJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KGNvbnRhaW5lci5nZXRQYXRoKCkpOworCQl0aGlzLmFkZENsYXNzcGF0aEVudHJ5VG9Qcm9qZWN0KGVudHJ5LCBqYXZhUHJvamVjdCwgbW9uaXRvcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBhZGRDbGFzc3BhdGhFbnRyeVRvUHJvamVjdCgKKwkJCUlDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIAorCQkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkKKwkJLy8gaWYgdGhlIGNsYXNzcGF0aEVudHJ5IGlzIGFscmVhZHkgdGhlcmUsIGRvIG5vdGhpbmcKIAkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCWlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoY2xhc3NwYXRoLCBqcGFMaWJyYXJ5RW50cnkpKSB7CisJCWlmIChBcnJheVRvb2xzLmNvbnRhaW5zKGNsYXNzcGF0aCwgY2xhc3NwYXRoRW50cnkpKSB7CiAJCQlyZXR1cm47CiAJCX0KLQotCQkvLyBhZGQgdGhlIEpQQSBsaWJyYXJ5IHRvIHRoZSBjbGFzc3BhdGgKKwkJCisJCS8vIGFkZCB0aGUgZ2l2ZW4gY2xhc3NwYXRoRW50cnkgdG8gdGhlIHByb2plY3QgY2xhc3NwYXRoCiAJCWludCBsZW4gPSBjbGFzc3BhdGgubGVuZ3RoOwogCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2xlbiArIDFdOwogCQlTeXN0ZW0uYXJyYXljb3B5KGNsYXNzcGF0aCwgMCwgbmV3Q2xhc3NwYXRoLCAwLCBsZW4pOwotCQluZXdDbGFzc3BhdGhbbGVuXSA9IGpwYUxpYnJhcnlFbnRyeTsKKwkJbmV3Q2xhc3NwYXRoW2xlbl0gPSBjbGFzc3BhdGhFbnRyeTsKIAkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgbW9uaXRvcik7CiAJfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIEVNUFRZX0NMQVNTUEFUSF9BVFRSSUJVVEVTID0gbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbMF07Ci0KLQlwcml2YXRlIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBidWlsZENsYXNzcGF0aEF0dHJpYnV0ZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlib29sZWFuIHdlYkFwcCA9IEpwdENvcmVQbHVnaW4ucHJvamVjdEhhc1dlYkZhY2V0KHByb2plY3QpOwotCQlpZiAoICEgd2ViQXBwICYmIHRoaXMucHJvamVjdElzU3RhbmRhbG9uZShwcm9qZWN0KSkgewotCQkJcmV0dXJuIEVNUFRZX0NMQVNTUEFUSF9BVFRSSUJVVEVTOwotCQl9Ci0JCXJldHVybiBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIHsKLQkJCQlKYXZhQ29yZS5uZXdDbGFzc3BhdGhBdHRyaWJ1dGUoCi0JCQkJCUlDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLkNMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSwKLQkJCQkJQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0RGVmYXVsdFJ1bnRpbWVQYXRoKHdlYkFwcCkudG9TdHJpbmcoKQotCQkJCSkKLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJvamVjdElzU3RhbmRhbG9uZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBFYXJVdGlsaXRpZXMuaXNTdGFuZGFsb25lUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3Igbm9uTnVsbE1vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiAobW9uaXRvciAhPSBudWxsKSA/IG1vbml0b3IgOiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCX0KLQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0VmVyc2lvbkNoYW5nZURhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRWZXJzaW9uQ2hhbmdlRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2EzOTRiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0VmVyc2lvbkNoYW5nZURhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcGFQbGF0Zm9ybVJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwdENvcmVNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOworCitwdWJsaWMgY2xhc3MgSnBhRmFjZXRWZXJzaW9uQ2hhbmdlRGF0YU1vZGVsUHJvdmlkZXIKKwlleHRlbmRzIEpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIKKwlpbXBsZW1lbnRzIEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcworeworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVN0YXR1cyBQTEFURk9STV9ET0VTX05PVF9TVVBQT1JUX0ZBQ0VUX1ZFUlNJT05fU1RBVFVTID0gCisJCQlidWlsZEVycm9yU3RhdHVzKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9QTEFURk9STV9ET0VTX05PVF9TVVBQT1JUX0ZBQ0VUX1ZFUlNJT04pOworCQorCQorCS8qKgorCSAqIHJlcXVpcmVkIGRlZmF1bHQgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgSnBhRmFjZXRWZXJzaW9uQ2hhbmdlRGF0YU1vZGVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7CisJCXJldHVybiBnZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUpOworCX0KKwkKKwlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgeworCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGdldFByb2plY3ROYW1lKCkpOworCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGRlZmF1bHRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRQbGF0Zm9ybUlkKCkgeworCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0Q29ubmVjdGlvbigpIHsKKwkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXREYXRhU291cmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBCb29sZWFuIGdldERlZmF1bHRVc2VyV2FudHNUb092ZXJyaWRlRGVmYXVsdENhdGFsb2coKSB7CisJCXJldHVybiBnZXRKcGFQcm9qZWN0KCkuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coKSAhPSBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcigpIHsKKwkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQm9vbGVhbiBnZXREZWZhdWx0VXNlcldhbnRzVG9PdmVycmlkZURlZmF1bHRTY2hlbWEoKSB7CisJCXJldHVybiBnZXRKcGFQcm9qZWN0KCkuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSgpICE9IG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKSB7CisJCXJldHVybiBnZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQm9vbGVhbiBnZXREZWZhdWx0RGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKCkgeworCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRWYWxpZFBsYXRmb3JtSWRzKCkgeworCQkvLyBhZGQgZXhpc3RpbmcgcGxhdGZvcm0gaWQgdG8gbGlzdCBvZiBjaG9pY2VzCisJCUl0ZXJhYmxlPFN0cmluZz4gdmFsaWRQbGF0Zm9ybUlkcyA9IHN1cGVyLmJ1aWxkVmFsaWRQbGF0Zm9ybUlkcygpOworCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModmFsaWRQbGF0Zm9ybUlkcywgZ2V0RGVmYXVsdFBsYXRmb3JtSWQoKSkpIHsKKwkJCXZhbGlkUGxhdGZvcm1JZHMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGUoZ2V0RGVmYXVsdFBsYXRmb3JtSWQoKSwgdmFsaWRQbGF0Zm9ybUlkcyk7CisJCX0KKwkJcmV0dXJuIHZhbGlkUGxhdGZvcm1JZHM7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlUGxhdGZvcm1JZCgpIHsKKwkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZVBsYXRmb3JtSWQoKTsKKwkJCisJCWlmIChzdGF0dXMuaXNPSygpKSB7CisJCQlpZiAoISBKcGFQbGF0Zm9ybVJlZ2lzdHJ5Lmluc3RhbmNlKCkucGxhdGZvcm1TdXBwb3J0c0pwYUZhY2V0VmVyc2lvbigKKwkJCQkJZ2V0UGxhdGZvcm1JZCgpLCBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkuZ2V0VmVyc2lvblN0cmluZygpKSkgeworCQkJCXN0YXR1cyA9IFBMQVRGT1JNX0RPRVNfTk9UX1NVUFBPUlRfRkFDRVRfVkVSU0lPTl9TVEFUVVM7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBzdGF0dXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0VmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTdiZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0VmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOworCitwdWJsaWMgY2xhc3MgSnBhRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUKKwlleHRlbmRzIEpwYUZhY2V0QWN0aW9uRGVsZWdhdGUKK3sKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlXygKKwkJCUlQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKKwkJCU9iamVjdCBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkKKwkJc3VwZXIuZXhlY3V0ZV8ocHJvamVjdCwgZnYsIGNvbmZpZywgbW9uaXRvcik7CisJCQorCQkvLyBuZWVkIHRvIGRvIGEgcmVidWlsZCBoZXJlCisJCQorCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKKwkJCisJCUpwdENvcmVQbHVnaW4ucmVidWlsZEpwYVByb2plY3QocHJvamVjdCk7CisJCQorCQltb25pdG9yLndvcmtlZCgxKTsKKwkJCisJCS8vIG5vdGhpbmcgZnVydGhlciB0byBkbyBoZXJlICpqdXN0KiB5ZXQKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhTGlicmFyeVByb3ZpZGVyQ29uc3RhbnRzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhTGlicmFyeVByb3ZpZGVyQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2YWU5MQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFMaWJyYXJ5UHJvdmlkZXJDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldDsKKworcHVibGljIGludGVyZmFjZSBKcGFMaWJyYXJ5UHJvdmlkZXJDb25zdGFudHMKK3sKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSX1ZBUl9KUEFfUExBVEZPUk0KKwkJPSAianBhUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvTGVnYWN5SnBhTGlicmFyeVByb3ZpZGVyRGV0ZWN0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9MZWdhY3lKcGFMaWJyYXJ5UHJvdmlkZXJEZXRlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjM2JlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvTGVnYWN5SnBhTGlicmFyeVByb3ZpZGVyRGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JTGlicmFyeVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGVnYWN5TGlicmFyeVByb3ZpZGVyRGV0ZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5MaWJyYXJ5UHJvdmlkZXJGcmFtZXdvcms7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKKworcHVibGljIGNsYXNzIExlZ2FjeUpwYUxpYnJhcnlQcm92aWRlckRldGVjdG9yCisJZXh0ZW5kcyBMZWdhY3lMaWJyYXJ5UHJvdmlkZXJEZXRlY3RvcgoreworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9KUEFfTElCUkFSWV9QUk9WSURFUl9JRAorCQk9ICJqcGEtbGVnYWN5LWxpYnJhcnktcHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCisJCisJCisJQE92ZXJyaWRlCisJcHVibGljIElMaWJyYXJ5UHJvdmlkZXIgZGV0ZWN0KAorCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVByb2plY3RGYWNldCBmYWNldCkgeworCQlpZiAoZmFjZXQuZ2V0SWQoKS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5GQUNFVF9JRCkpIHsKKwkJCXJldHVybiBMaWJyYXJ5UHJvdmlkZXJGcmFtZXdvcmsuZ2V0UHJvdmlkZXIoTEVHQUNZX0pQQV9MSUJSQVJZX1BST1ZJREVSX0lEKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvTGVnYWN5SnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0xlZ2FjeUpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjI4NmU2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0xlZ2FjeUpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uQ29uZmlnOworCitwdWJsaWMgY2xhc3MgTGVnYWN5SnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbgorCWV4dGVuZHMgTGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uCit7CisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZXhlY3V0ZSgKKwkJCUxpYnJhcnlQcm92aWRlck9wZXJhdGlvbkNvbmZpZyBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgCisJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCS8vIG5vIG9wIC0gbm90aGluZyB0byB1bmluc3RhbGwKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9HZW5lcmljSnBhRGF0YVNvdXJjZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvR2VuZXJpY0pwYURhdGFTb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWE0ZDFmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvR2VuZXJpY0pwYURhdGFTb3VyY2UuamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRGF0YVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKcGFOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VPYmplY3Q7CisKKy8qKgorICogR2VuZXJpY0pwYURhdGFTb3VyY2UKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNKcGFEYXRhU291cmNlCisJZXh0ZW5kcyBBYnN0cmFjdEpwYU5vZGUKKwlpbXBsZW1lbnRzIEpwYURhdGFTb3VyY2UKK3sKKwkvKioKKwkgKiBjYWNoZSB0aGUgY29ubmVjdGlvbiBwcm9maWxlIG5hbWUgc28gd2UgY2FuIGRldGVjdCB3aGVuCisJICogaXQgY2hhbmdlcyBhbmQgbm90aWZ5IGxpc3RlbmVycworCSAqLworCXByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lOworCisJcHJvdGVjdGVkIHRyYW5zaWVudCBDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZTsKKworCS8qKgorCSAqIGxpc3RlbiBmb3IgdGhlIGNvbm5lY3Rpb24gdG8gYmUgYWRkZWQgb3IgcmVtb3ZlZCBvciBpdHMgbmFtZSBjaGFuZ2VkCisJICovCisJcHJvdGVjdGVkIGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgY29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcjsKKworCS8qKgorCSAqIGxpc3RlbiBmb3IgdGhlIGNvbm5lY3Rpb24gdG8gYmUgb3BlbmVkIG9yIGNsb3NlZAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJcHVibGljIEdlbmVyaWNKcGFEYXRhU291cmNlKEpwYVByb2plY3QganBhUHJvamVjdCwgU3RyaW5nIGNvbm5lY3Rpb25Qcm9maWxlTmFtZSkgeworCQlzdXBlcihqcGFQcm9qZWN0KTsKKwkJLy9tb3ZpbmcgdGhlIGJ1aWxkaW5nIG9mIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgYmVmb3JlIHRoZSBjb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyCisJCS8vaXMgYWRkZWQuICBOZWVkIHRvIG1ha2Ugc3VyZSB0aGUgbG9hZGluZyBvZiBkYiBwcm9maWxlcyBpcyBjb21wbGV0ZWQgYmVmb3JlCisJCS8vbGlzdGVuaW5nLCBvdGhlcndpc2Ugd2UgZ2V0IG5vdGlmaWNhdGlvbnMgYmVmb3JlIG91ciBtb2RlbCBpcyBmaW5pc2hlZCBiZWluZyBidWlsdC4KKwkJLy90aGlzIG1lYW5zIG91ciB1cGRhdGVyIGlzIGNhbGxlZCBiZWZvcmUgaXQgaXMgc2V0IHdoaWNoIHJlc3VsdHMgaW4gYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLgorCQkvL0hvcGVmdWxseSB0aGlzIGNoYW5nZSBpcyB0ZW1wb3JhcnkgYW5kIERUUCB3aWxsIGZpeCBidWcgMjQ2MjcwIHdoZXJlIEkgc3VnZ2VzdCB0aGV5CisJCS8vbm90IGZpcmUgZXZlbnRzIHdoZW4gYnVpbGRpbmcgcHJvZmlsZXMuCisJCXRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lID0gY29ubmVjdGlvblByb2ZpbGVOYW1lOworCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0gdGhpcy5idWlsZENvbm5lY3Rpb25Qcm9maWxlKGNvbm5lY3Rpb25Qcm9maWxlTmFtZSk7CisKKwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyID0gdGhpcy5idWlsZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoKTsKKwkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5hZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKHRoaXMuY29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcik7CisKKwkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7CisJCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpIHsKKwkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgeworCQlyZXR1cm4gdGhpcy5nZXRKcGFQbGF0Zm9ybSgpLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpOworCX0KKworCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBMb2NhbENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoKTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEpwYURhdGFTb3VyY2UgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKSB7CisJCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoU3RyaW5nIGNvbm5lY3Rpb25Qcm9maWxlTmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZU5hbWU7CisJCXRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lID0gY29ubmVjdGlvblByb2ZpbGVOYW1lOworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQob2xkLCBjb25uZWN0aW9uUHJvZmlsZU5hbWUpKSB7CisJCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OTkVDVElPTl9QUk9GSUxFX05BTUVfUFJPUEVSVFksIG9sZCwgY29ubmVjdGlvblByb2ZpbGVOYW1lKTsKKwkJCSAvLyBzeW5jaCB0aGUgY29ubmVjdGlvbiBwcm9maWxlIHdoZW4gdGhlIG5hbWUgY2hhbmdlcworCQkJdGhpcy5zZXRDb25uZWN0aW9uUHJvZmlsZSh0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoY29ubmVjdGlvblByb2ZpbGVOYW1lKSk7CisJCQlKcHRDb3JlUGx1Z2luLnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZSh0aGlzLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCksIGNvbm5lY3Rpb25Qcm9maWxlTmFtZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7CisJCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKSB7CisJCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZTsKKwkJcmV0dXJuIChjcCAhPSBudWxsKSAmJiBjcC5pc0FjdGl2ZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKKwkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOworCQlyZXR1cm4gKGNwID09IG51bGwpID8gbnVsbCA6IGNwLmdldERhdGFiYXNlKCk7CisJfQorCisJcHVibGljIDxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKFRbXSBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBpZGVudGlmaWVyKSB7CisJCURhdGFiYXNlIGRiID0gdGhpcy5nZXREYXRhYmFzZSgpOworCQlyZXR1cm4gKGRiID09IG51bGwpID8gbnVsbCA6IGRiLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcihkYXRhYmFzZU9iamVjdHMsIGlkZW50aWZpZXIpOworCX0KKworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpIHsKKwkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKKwkJfQorCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLnJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKTsKKwl9CisKKworCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKG5hbWUsIHRoaXMuZ2V0SnBhUGxhdGZvcm0oKS5nZXREYXRhYmFzZUZpbmRlcigpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRDb25uZWN0aW9uUHJvZmlsZShDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSkgeworCQlDb25uZWN0aW9uUHJvZmlsZSBvbGQgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOworCQlpZiAob2xkICE9IG51bGwpIHsKKwkJCW9sZC5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOworCQl9CisJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSBjb25uZWN0aW9uUHJvZmlsZTsKKwkJaWYgKGNvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpIHsKKwkJCWNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7CisJCX0KKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTk5FQ1RJT05fUFJPRklMRV9QUk9QRVJUWSwgb2xkLCBjb25uZWN0aW9uUHJvZmlsZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTmFtZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKKworCS8qKgorCSAqIExpc3RlbiBmb3IgYSBjb25uZWN0aW9uIHByb2ZpbGUgd2l0aCBvdXIgbmFtZSBiZWluZyByZW1vdmVkLgorCSAqIEFsc28gbGlzdGVuIGZvciBvdXIgY29ubmVjdGlvbidzIG5hbWUgYmVpbmcgY2hhbmdlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgTG9jYWxDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGltcGxlbWVudHMgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciB7CisKKwkJcHJvdGVjdGVkIExvY2FsQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpIHsKKwkJCXN1cGVyKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZUFkZGVkKFN0cmluZyBuYW1lKSB7CisJCQkvLyBjaGVjayB0byBzZWUgaWYgYSBjb25uZWN0aW9uIHByb2ZpbGUgd2l0aCBvdXIgbmFtZSB3YXMgYWRkZWQKKwkJCS8vIChhc3N1bWUgb3VyIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyBudWxsKQorCQkJaWYgKEdlbmVyaWNKcGFEYXRhU291cmNlLnRoaXMuY29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgeworCQkJCWlmIChuYW1lLmVxdWFscyhHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpKSkgeworCQkJCQlHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShuYW1lKTsgIC8vIHRoaXMgd2lsbCB0cmlnZ2VyIGNyZWF0aW9uIG9mIENQCisJCQkJfQorCQkJfQorCQl9CisKKwkJcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW1vdmVkKFN0cmluZyBuYW1lKSB7CisJCQlpZiAoR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKG5hbWUuZXF1YWxzKEdlbmVyaWNKcGFEYXRhU291cmNlLnRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0TmFtZSgpKSkgeworCQkJCUdlbmVyaWNKcGFEYXRhU291cmNlLnRoaXMuc2V0Q29ubmVjdGlvblByb2ZpbGUobnVsbCk7CisJCQl9CisJCX0KKworCQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZVJlbmFtZWQoU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKSB7CisJCQlpZiAoR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9PSBudWxsKSB7CisJCQkJaWYgKG5ld05hbWUuZXF1YWxzKEdlbmVyaWNKcGFEYXRhU291cmNlLnRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lKSkgeworCQkJCQlHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShuZXdOYW1lKTsKKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfQorCQkJLy8gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSB3aWxsIGFscmVhZHkgaGF2ZSB0aGUgbmV3IG5hbWUsCisJCQkvLyB3ZSBqdXN0IG5lZWQgdG8gc3luY2ggdGhlIG5hbWUgaGVsZCBieSB0aGUgZGF0YSBzb3VyY2UKKwkJCWlmIChuZXdOYW1lLmVxdWFscyhHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldE5hbWUoKSkpIHsKKwkJCQlHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShuZXdOYW1lKTsKKwkJCX0KKwkJfQorCX0KKworCisJLyoqCisJICogV2hlbmV2ZXIgdGhlIGNvbm5lY3Rpb24gaXMgb3BlbmVkIG9yIGNsb3NlZCB0cmlnZ2VyIGEgcHJvamVjdCB1cGRhdGUuCisJICovCisJcHJvdGVjdGVkIGNsYXNzIExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyIGV4dGVuZHMgQ29ubmVjdGlvbkFkYXB0ZXIgeworCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgeworCQkJR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5nZXRKcGFQcm9qZWN0KCkudXBkYXRlKCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKKwkJCUdlbmVyaWNKcGFEYXRhU291cmNlLnRoaXMuZ2V0SnBhUHJvamVjdCgpLnVwZGF0ZSgpOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL0dlbmVyaWNKcGFGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9HZW5lcmljSnBhRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YzBmNTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9HZW5lcmljSnBhRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhRmFjdG9yeTsKKworLyoqCisgKiBHZW5lcmljIEpQQQorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY0pwYUZhY3RvcnkKKwlleHRlbmRzIEFic3RyYWN0SnBhRmFjdG9yeQoreworCXB1YmxpYyBHZW5lcmljSnBhRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9HZW5lcmljSnBhRmlsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvR2VuZXJpY0pwYUZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTY1MWJjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvR2VuZXJpY0pwYUZpbGUuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExOworCitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7CisKKy8qKgorICogVGhlIHRyYW5zaXRpb24gYmV0d2VlbiBhIEpQQSBwcm9qZWN0IGFuZCB0aGUgcmVzb3VyY2UgbW9kZWwgYXNzb2NpYXRlZAorICogd2l0aCBhIGZpbGUuCisgKiBIb2xkIHRoZSBhc3NvY2lhdGVkIHJvb3Qgc3RydWN0dXJlIG5vZGVzLCB3aGljaCBhcmUgaG9va3MgdG8gdGhlCisgKiBjb250ZXh0IG1vZGVsLgorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY0pwYUZpbGUKKwlleHRlbmRzIEFic3RyYWN0SnBhTm9kZQorCWltcGxlbWVudHMgSnBhRmlsZQoreworCS8qKgorCSAqIHR5cGljYWxseSBhIC5qYXZhIG9yIC54bWwgZmlsZS4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgSUZpbGUgZmlsZTsKKworCS8qKgorCSAqIGNhY2hlIHRoZSBjb250ZW50IHR5cGUKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlOworCisJLyoqCisJICogdGhlIHJlc291cmNlIG1vZGVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpbGUKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgSnBhUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsOworCisJLyoqCisJICogdGhlIHJvb3Qgc3RydWN0dXJlIChjb250ZXh0IG1vZGVsKSBub2RlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXNvdXJjZQorCSAqIG1vZGVsCisJICovCisJcHJvdGVjdGVkIGZpbmFsIEhhc2h0YWJsZTxPYmplY3QsIEpwYVN0cnVjdHVyZU5vZGU+IHJvb3RTdHJ1Y3R1cmVOb2RlczsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgorCisJcHVibGljIEdlbmVyaWNKcGFGaWxlKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlLCBKcGFSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwpIHsKKwkJc3VwZXIoanBhUHJvamVjdCk7CisJCXRoaXMuZmlsZSA9IGZpbGU7CisJCXRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKwkJdGhpcy5yZXNvdXJjZU1vZGVsID0gcmVzb3VyY2VNb2RlbDsKKwkJdGhpcy5yb290U3RydWN0dXJlTm9kZXMgPSBuZXcgSGFzaHRhYmxlPE9iamVjdCwgSnBhU3RydWN0dXJlTm9kZT4oKTsKKwl9CisKKwkvKioKKwkgKiBDaGFuZ2VzIHRvIFJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04gZG8gbm90IG5lZWQgdG8gdHJpZ2dlciBhCisJICogcHJvamVjdCB1cGRhdGUuIE9ubHkgdGhlIFVJIGNhcmVzIGFib3V0IHRoZSByb290IHN0cnVjdHVyZSBub2Rlcy4KKwkgKiBJZiBhIHByb2plY3QgdXBkYXRlIGlzIGFsbG93ZWQgdG8gaGFwcGVuLCBhbiBpbmZpbml0ZSBsb29wIHdpbGwgcmVzdWx0CisJICogaWYgYW55IGphdmEgY2xhc3MgaXMgc3BlY2lmaWVkIGluIG1vcmUgdGhhbiBvbmUgbG9jYXRpb24gaW4gdGhlCisJICogcGVyc2lzdGVuY2UgdW5pdC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKFNldDxTdHJpbmc+IG5vblVwZGF0ZUFzcGVjdE5hbWVzKSB7CisJCXN1cGVyLmFkZE5vblVwZGF0ZUFzcGVjdE5hbWVzVG8obm9uVXBkYXRlQXNwZWN0TmFtZXMpOworCQlub25VcGRhdGVBc3BlY3ROYW1lcy5hZGQoUk9PVF9TVFJVQ1RVUkVfTk9ERVNfQ09MTEVDVElPTik7CisJfQorCisKKwkvLyAqKioqKioqKioqIGZpbGUgKioqKioqKioqKgorCisJcHVibGljIElGaWxlIGdldEZpbGUoKSB7CisJCXJldHVybiB0aGlzLmZpbGU7CisJfQorCisJcHVibGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29udGVudFR5cGU7CisJfQorCisJcHVibGljIEpwYVJlc291cmNlTW9kZWwgZ2V0UmVzb3VyY2VNb2RlbCgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VNb2RlbDsKKwl9CisKKwlwdWJsaWMgSnBhUmVzb3VyY2VNb2RlbCBnZXRSZXNvdXJjZU1vZGVsKElDb250ZW50VHlwZSBjdCkgeworCQlyZXR1cm4gdGhpcy5jb250ZW50VHlwZS5pc0tpbmRPZihjdCkgPyB0aGlzLnJlc291cmNlTW9kZWwgOiBudWxsOworCX0KKworCisJLy8gKioqKioqKioqKiByb290IHN0cnVjdHVyZSBub2RlcyAqKioqKioqKioqCisKKwlwdWJsaWMgSXRlcmF0b3I8SnBhU3RydWN0dXJlTm9kZT4gcm9vdFN0cnVjdHVyZU5vZGVzKCkgeworCQlyZXR1cm4gdGhpcy5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpOworCX0KKworCXByb3RlY3RlZCBJdGVyYWJsZTxKcGFTdHJ1Y3R1cmVOb2RlPiBnZXRSb290U3RydWN0dXJlTm9kZXMoKSB7CisJCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SnBhU3RydWN0dXJlTm9kZT4odGhpcy5yb290U3RydWN0dXJlTm9kZXMudmFsdWVzKCkpOworCX0KKworCXB1YmxpYyBpbnQgcm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMucm9vdFN0cnVjdHVyZU5vZGVzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRSb290U3RydWN0dXJlTm9kZShPYmplY3Qga2V5LCBKcGFTdHJ1Y3R1cmVOb2RlIHJvb3RTdHJ1Y3R1cmVOb2RlKSB7CisJCUpwYVN0cnVjdHVyZU5vZGUgb2xkID0gdGhpcy5yb290U3RydWN0dXJlTm9kZXMucHV0KGtleSwgcm9vdFN0cnVjdHVyZU5vZGUpOworCQlpZiAocm9vdFN0cnVjdHVyZU5vZGUgIT0gb2xkKSB7CisJCQlpZiAob2xkICE9IG51bGwpIHsKKwkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChST09UX1NUUlVDVFVSRV9OT0RFU19DT0xMRUNUSU9OLCBvbGQpOworCQkJfQorCQkJdGhpcy5maXJlSXRlbUFkZGVkKFJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04sIHJvb3RTdHJ1Y3R1cmVOb2RlKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVJvb3RTdHJ1Y3R1cmVOb2RlKE9iamVjdCBrZXkpIHsKKwkJdGhpcy5maXJlSXRlbVJlbW92ZWQoUk9PVF9TVFJVQ1RVUkVfTk9ERVNfQ09MTEVDVElPTiwgdGhpcy5yb290U3RydWN0dXJlTm9kZXMucmVtb3ZlKGtleSkpOworCX0KKworCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKKwkJZm9yIChKcGFTdHJ1Y3R1cmVOb2RlIHJvb3ROb2RlIDogdGhpcy5nZXRSb290U3RydWN0dXJlTm9kZXMoKSkgeworCQkJSnBhU3RydWN0dXJlTm9kZSBub2RlID0gcm9vdE5vZGUuZ2V0U3RydWN0dXJlTm9kZSh0ZXh0T2Zmc2V0KTsKKwkJCWlmIChub2RlICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gbm9kZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKworCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLmZpbGUpOworCQlzYi5hcHBlbmQoJ1snKTsKKwkJc2IuYXBwZW5kKHRoaXMuY29udGVudFR5cGUuZ2V0TmFtZSgpKTsKKwkJc2IuYXBwZW5kKCddJyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9HZW5lcmljSnBhUHJvamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvR2VuZXJpY0pwYVByb2plY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmRkNzNmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvR2VuZXJpY0pwYVByb2plY3QuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5KcGFQcm9qZWN0Ml8wOworCisvKioKKyAqIE5vdCBtdWNoIGRpZmZlcmVudCBmcm9tIHRoZSBhYnN0cmFjdCBKUEEgcHJvamVjdC4KKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNKcGFQcm9qZWN0CisJZXh0ZW5kcyBBYnN0cmFjdEpwYVByb2plY3QKK3sKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJcHVibGljIEdlbmVyaWNKcGFQcm9qZWN0KEpwYVByb2plY3QyXzAuQ29uZmlnIGNvbmZpZykgeworCQlzdXBlcihjb25maWcpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9HZW5lcmljUm9vdENvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0dlbmVyaWNSb290Q29udGV4dE5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTliMmIzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9HZW5lcmljUm9vdENvbnRleHROb2RlLmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBpbmdGaWxlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbERlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5BYnN0cmFjdEpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIEdlbmVyaWNSb290Q29udGV4dE5vZGUKKwlleHRlbmRzIEFic3RyYWN0SnBhQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIEpwYVJvb3RDb250ZXh0Tm9kZQoreworCS8qIFRoaXMgb2JqZWN0IGhhcyBubyBwYXJlbnQsIHNvIGl0IG11c3QgcG9pbnQgdG8gdGhlIEpQQSBwcm9qZWN0IGV4cGxpY2l0bHkuICovCisJcHJvdGVjdGVkIGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdDsKKwkKKwkvKiBNYWluIGNvbnRleHQgb2JqZWN0LiAqLworCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbDsKKwkKKwkKKwlwdWJsaWMgR2VuZXJpY1Jvb3RDb250ZXh0Tm9kZShKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKKwkJc3VwZXIobnVsbCk7CisJCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7CisJCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpOworCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworCQkJdGhpcy5wZXJzaXN0ZW5jZVhtbCA9IGJ1aWxkUGVyc2lzdGVuY2VYbWwocmVzb3VyY2UpOworCQl9CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzUGFyZW50KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogSnBhTm9kZSBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgeworCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRQcm9qZWN0KCk7CisJfQorCQorCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgeworCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldFByb2plY3QoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBKcGFDb250ZXh0Tm9kZSBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgeworCQkvLyBObyBQZXJzaXN0ZW5jZVVuaXQgaW4gdGhpcyBjb250ZXh0CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwcGluZ0ZpbGVSb290IGdldE1hcHBpbmdGaWxlUm9vdCgpIHsKKwkJLy8gTm8gTWFwcGluZ0ZpbGVSb290IGluIHRoaXMgY29udGV4dAorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBwZXJzaXN0ZW5jZSB4bWwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbCBnZXRQZXJzaXN0ZW5jZVhtbCgpIHsKKwkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VYbWw7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFBlcnNpc3RlbmNlWG1sKFBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sKSB7CisJCVBlcnNpc3RlbmNlWG1sIG9sZCA9IHRoaXMucGVyc2lzdGVuY2VYbWw7CisJCXRoaXMucGVyc2lzdGVuY2VYbWwgPSBwZXJzaXN0ZW5jZVhtbDsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBFUlNJU1RFTkNFX1hNTF9QUk9QRVJUWSwgb2xkLCBwZXJzaXN0ZW5jZVhtbCk7CisJfQorCQorCS8vICoqKioqKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKioqKioqKgorCisJcHVibGljIHZvaWQgc3luY2hyb25pemVNZXRhbW9kZWwoKSB7CisJCWlmICh0aGlzLnBlcnNpc3RlbmNlWG1sICE9IG51bGwpIHsKKwkJCXRoaXMucGVyc2lzdGVuY2VYbWwuc3luY2hyb25pemVNZXRhbW9kZWwoKTsKKwkJfQorCX0KKwkKKwkvLyAqKioqKioqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgdXBkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKKwkJCisJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisJCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVhtbCA9PSBudWxsKSB7CisJCQkJdGhpcy5zZXRQZXJzaXN0ZW5jZVhtbCh0aGlzLmJ1aWxkUGVyc2lzdGVuY2VYbWwocmVzb3VyY2UpKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5wZXJzaXN0ZW5jZVhtbC51cGRhdGUocmVzb3VyY2UpOworCQkJfQorCQl9IGVsc2UgeworCQkJdGhpcy5zZXRQZXJzaXN0ZW5jZVhtbChudWxsKTsKKwkJfQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwb3N0VXBkYXRlKCkgeworCQlzdXBlci5wb3N0VXBkYXRlKCk7CisJCWlmICh0aGlzLnBlcnNpc3RlbmNlWG1sICE9IG51bGwpIHsKKwkJCXRoaXMucGVyc2lzdGVuY2VYbWwucG9zdFVwZGF0ZSgpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkgeworCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKKwl9CisJCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sIGJ1aWxkUGVyc2lzdGVuY2VYbWwoSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uIHBlcnNpc3RlbmNlWG1sRGVmOworCQl0cnkgeworCQkJcGVyc2lzdGVuY2VYbWxEZWYgPSAoUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uKSBnZXRKcGFQbGF0Zm9ybSgpLmdldFJlc291cmNlRGVmaW5pdGlvbihyZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKSk7CisJCX0KKwkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKwkJCUpwdENvcmVQbHVnaW4ubG9nKGlhZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gKHBlcnNpc3RlbmNlWG1sRGVmID09IG51bGwpID8gbnVsbCA6IHBlcnNpc3RlbmNlWG1sRGVmLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkUGVyc2lzdGVuY2VYbWwodGhpcywgcmVzb3VyY2UpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlpZiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgeworCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKTsKKwkJfQorCisJCWlmICh0aGlzLnBlcnNpc3RlbmNlWG1sID09IG51bGwpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgCisJCQkJCXRoaXMuYnVpbGRNaXNzaW5nRmlsZU1lc3NhZ2VJRCgpLAorCQkJCQl0aGlzCisJCQkJKQorCQkJKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoICEgdGhpcy5qcGFQcm9qZWN0LmRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoKSkgeworCQkJdGhpcy52YWxpZGF0ZU9ycGhhbkNsYXNzZXMobWVzc2FnZXMpOworCQl9CisJCXRoaXMucGVyc2lzdGVuY2VYbWwudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTWlzc2luZ0ZpbGVNZXNzYWdlSUQoKSB7CisJCXJldHVybiB0aGlzLmdldFBsYXRmb3JtRmlsZSgpLmV4aXN0cygpID8KKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1hNTF9JTlZBTElEX0NPTlRFTlQKKwkJCQk6CisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX05PX1BFUlNJU1RFTkNFX1hNTDsKKwl9CisKKwlwcm90ZWN0ZWQgSUZpbGUgZ2V0UGxhdGZvcm1GaWxlKCkgeworCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmNvbnZlcnRUb1BsYXRmb3JtRmlsZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfUEVSU0lTVEVOQ0VfWE1MX0ZJTEVfUEFUSCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlT3JwaGFuQ2xhc3NlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IHRoaXMucGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKTsKKwkJaWYgKHBlcnNpc3RlbmNlID09IG51bGwpIHsKKwkJCXJldHVybjsgIC8vIGhhbmRsZWQgd2l0aCBvdGhlciB2YWxpZGF0aW9uCisJCX0KKwkJaWYgKHBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlVW5pdHNTaXplKCkgIT0gMSkgeworCQkJcmV0dXJuOyAgLy8gdGhlIGNvbnRleHQgbW9kZWwgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgMSBwZXJzaXN0ZW5jZSB1bml0CisJCX0KKworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2UucGVyc2lzdGVuY2VVbml0cygpLm5leHQoKTsKKwkJSGFzaEJhZzxTdHJpbmc+IGFubm90YXRlZENsYXNzTmFtZXMgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuanBhUHJvamVjdC5hbm5vdGF0ZWRKYXZhU291cmNlQ2xhc3NOYW1lcygpKTsKKwkJSGFzaEJhZzxTdHJpbmc+IG9ycGhhbnMgPSBhbm5vdGF0ZWRDbGFzc05hbWVzLmNsb25lKCk7CisJCWZvciAoU3RyaW5nIGFubm90YXRlZENsYXNzTmFtZSA6IGFubm90YXRlZENsYXNzTmFtZXMpIHsKKwkJCWlmIChwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVzUGVyc2lzdGVudFR5cGUoYW5ub3RhdGVkQ2xhc3NOYW1lKSkgeworCQkJCW9ycGhhbnMucmVtb3ZlKGFubm90YXRlZENsYXNzTmFtZSk7CisJCQl9CisJCX0KKwkJCisJCS8vIFRPRE8gcmVtb3ZlICdqcmN1JworCQkvLyByZXBsYWNlIGpyY3UuZ2V0RmlsZSgpIHdpdGgganJwdC5nZXRGaWxlKCkKKwkJLy8gcmVwbGFjZSBqcnB0LmdldE1hcHBpbmdBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGpyY3UuYnVpbGRBU1RSb290KCkpCisJCS8vICAgIHdpdGgganJwdC5nZXRNYXBwaW5nQW5ub3RhdGlvbigpLmdldFRleHRSYW5nZSgpCisJCS8vICAgIChuZXcgbWV0aG9kICNnZXRUZXh0UmFuZ2UoKSA/KQorCQlmb3IgKFN0cmluZyBvcnBoYW4gOiBvcnBoYW5zKSB7CisJCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0gdGhpcy5qcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKG9ycGhhbik7CisJCQlKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQganJjdSA9IGpycHQuZ2V0SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KCk7CisJCQlpZiAoanJwdC5pc01hcHBlZCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9UWVBFX01BUFBFRF9CVVRfTk9UX0lOQ0xVREVEX0lOX1BFUlNJU1RFTkNFX1VOSVQsCisJCQkJCQluZXcgU3RyaW5nW10ge2pycHQuZ2V0TmFtZSgpfSwKKwkJCQkJCWpyY3UuZ2V0RmlsZSgpLAorCQkJCQkJanJwdC5nZXROYW1lVGV4dFJhbmdlKGpyY3UuYnVpbGRBU1RSb290KCkpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQkJZWxzZSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfQU5OT1RBVEVEX0JVVF9OT1RfSU5DTFVERURfSU5fUEVSU0lTVEVOQ0VfVU5JVCwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7anJwdC5nZXROYW1lKCl9LAorCQkJCQkJanJjdS5nZXRGaWxlKCksCisJCQkJCQlqcnB0LmdldE5hbWVUZXh0UmFuZ2UoanJjdS5idWlsZEFTVFJvb3QoKSkKKwkJCQkJKQorCQkJCSk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phckZpbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmFyRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNTYwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phckZpbGUuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmFyRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuSmFyRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LkFic3RyYWN0SnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCisvKioKKyAqIENvbnRleHQgSkFSIGZpbGUKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNKYXJGaWxlCisJZXh0ZW5kcyBBYnN0cmFjdEpwYUNvbnRleHROb2RlCisJaW1wbGVtZW50cyBKYXJGaWxlLCBQZXJzaXN0ZW50VHlwZS5Pd25lcgoreworCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IGphclJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdDsKKwlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPEphdmFQZXJzaXN0ZW50VHlwZT4gamF2YVBlcnNpc3RlbnRUeXBlcyA9IG5ldyBWZWN0b3I8SmF2YVBlcnNpc3RlbnRUeXBlPigpOworCisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBHZW5lcmljSmFyRmlsZShKYXJGaWxlUmVmIHBhcmVudCwgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBqYXJSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5qYXJSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QgPSBqYXJSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3Q7CisJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5qYXZhUGVyc2lzdGVudFR5cGVzLCB0aGlzLmJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlcygpKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRUeXBlPiBidWlsZEphdmFQZXJzaXN0ZW50VHlwZXMoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSwgSmF2YVBlcnNpc3RlbnRUeXBlPih0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlcygpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgdHJhbnNmb3JtKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJCQlyZXR1cm4gR2VuZXJpY0phckZpbGUudGhpcy5idWlsZEphdmFQZXJzaXN0ZW50VHlwZShqcnB0KTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiB0aGUgcmVzb3VyY2UgSkFSIGhvbGRzIG9ubHkgYW5ub3RhdGVkIHR5cGVzLCBzbyB3ZSBjYW4gdXNlIHRoZW0gYWxsIGZvcgorCSAqIGJ1aWxkaW5nIHRoZSBjb250ZXh0IHR5cGVzCisJICovCisJcHJvdGVjdGVkIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZXMoKSB7CisJCXJldHVybiB0aGlzLmphclJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdC5wZXJzaXN0ZW50VHlwZXMoKTsKKwl9CisKKwlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKHRoaXMsIGpycHQpOworCX0KKworCisJLy8gKioqKioqKioqKiBKcGFTdHJ1Y3R1cmVOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhUmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKKwkJcmV0dXJuIEpwdENvcmVQbHVnaW4uSkFSX1JFU09VUkNFX1RZUEU7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCS8vIG5vdGhpbmcgeWV0CisJfQorCisKKwkvLyAqKioqKioqKioqIEphckZpbGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKKwkJZm9yIChKYXZhUGVyc2lzdGVudFR5cGUgcHQgOiB0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZXMoKSkgeworCQkJaWYgKHB0LmdldE5hbWUoKS5lcXVhbHModHlwZU5hbWUpKSB7CisJCQkJcmV0dXJuIHB0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBJdGVyYXRvcjxKYXZhUGVyc2lzdGVudFR5cGU+IGphdmFQZXJzaXN0ZW50VHlwZXMoKSB7CisJCXJldHVybiB0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpOworCX0KKworCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUGVyc2lzdGVudFR5cGU+IGdldEphdmFQZXJzaXN0ZW50VHlwZXMoKSB7CisJCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SmF2YVBlcnNpc3RlbnRUeXBlPih0aGlzLmphdmFQZXJzaXN0ZW50VHlwZXMpOworCX0KKworCXB1YmxpYyBpbnQgamF2YVBlcnNpc3RlbnRUeXBlc1NpemUoKSB7CisJCXJldHVybiB0aGlzLmphdmFQZXJzaXN0ZW50VHlwZXMuc2l6ZSgpOworCX0KKworCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgYWRkSmF2YVBlcnNpc3RlbnRUeXBlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IHRoaXMuYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoanJwdCk7CisJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihqYXZhUGVyc2lzdGVudFR5cGUsIHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlcywgSkFWQV9QRVJTSVNURU5UX1RZUEVTX0NPTExFQ1RJT04pOworCQlyZXR1cm4gamF2YVBlcnNpc3RlbnRUeXBlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZUphdmFQZXJzaXN0ZW50VHlwZShKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlICkgeworCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihqYXZhUGVyc2lzdGVudFR5cGUsIHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlcywgSkFWQV9QRVJTSVNURU5UX1RZUEVTX0NPTExFQ1RJT04pOworCX0KKworCisJLy8gKioqKioqKioqKiBQZXJzaXN0ZW50VHlwZUNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgSXRlcmFibGU8PyBleHRlbmRzIFBlcnNpc3RlbnRUeXBlPiBnZXRQZXJzaXN0ZW50VHlwZXMoKSB7CisJCXJldHVybiB0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZXMoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogUGVyc2lzdGVudFR5cGUuT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdFBlcnNpc3RlbnRUeXBlQWNjZXNzKCkgeworCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0QWNjZXNzKCk7CisJfQorCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0T3ZlcnJpZGVQZXJzaXN0ZW50VHlwZUFjY2VzcygpIHsKKwkJLy8gbm8gYWNjZXNzIHR5cGUgYXQgdGhpcyBsZXZlbCBvdmVycmlkZXMgYW55IGxvY2FsIGFjY2VzcyB0eXBlIHNwZWNpZmljYXRpb24KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCQorCS8vICoqKioqKioqKiogSnBhTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIHRoaXMuamFyUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290LmdldEZpbGUoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKgorCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QganJwZnIpIHsKKwkJdGhpcy5qYXJSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QgPSBqcnBmcjsKKwkJdGhpcy51cGRhdGVKYXZhUGVyc2lzdGVudFR5cGVzKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlSmF2YVBlcnNpc3RlbnRUeXBlcygpIHsKKwkJSGFzaEJhZzxKYXZhUGVyc2lzdGVudFR5cGU+IGNvbnRleHRUeXBlc1RvUmVtb3ZlID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmphdmFQZXJzaXN0ZW50VHlwZXMoKSwgdGhpcy5qYXZhUGVyc2lzdGVudFR5cGVzLnNpemUoKSk7CisJCUFycmF5TGlzdDxKYXZhUGVyc2lzdGVudFR5cGU+IGNvbnRleHRUeXBlc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdDxKYXZhUGVyc2lzdGVudFR5cGU+KHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlcy5zaXplKCkpOworCisJCWZvciAoSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IHJlc291cmNlVHlwZXMgPSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlcygpOyByZXNvdXJjZVR5cGVzLmhhc05leHQoKTsgKSB7CisJCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGVzLm5leHQoKTsKKwkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKKwkJCWZvciAoSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRUeXBlPiBjb250ZXh0VHlwZXMgPSBjb250ZXh0VHlwZXNUb1JlbW92ZS5pdGVyYXRvcigpOyBjb250ZXh0VHlwZXMuaGFzTmV4dCgpOyApIHsKKwkJCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBjb250ZXh0VHlwZXMubmV4dCgpOworCQkJCWlmIChjb250ZXh0VHlwZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkgPT0gcmVzb3VyY2VUeXBlKSB7CisJCQkJCWNvbnRleHRUeXBlcy5yZW1vdmUoKTsKKwkJCQkJY29udGV4dFR5cGVzVG9VcGRhdGUuYWRkKGNvbnRleHRUeXBlKTsKKwkJCQkJbWF0Y2ggPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoICEgbWF0Y2gpIHsKKwkJCQl0aGlzLmFkZEphdmFQZXJzaXN0ZW50VHlwZShyZXNvdXJjZVR5cGUpOworCQkJfQorCQl9CisJCWZvciAoSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlIDogY29udGV4dFR5cGVzVG9SZW1vdmUpIHsKKwkJCXRoaXMucmVtb3ZlSmF2YVBlcnNpc3RlbnRUeXBlKGNvbnRleHRUeXBlKTsKKwkJfQorCQkvLyBoYW5kbGUgYWRkaW5nIGFuZCByZW1vdmluZyBqYXZhIHBlcnNpc3RlbnQgdHlwZXMgZmlyc3QsIHVwZGF0ZSB0aGUKKwkJLy8gcmVtYWluaW5nIGphdmEgcGVyc2lzdGVudCB0eXBlcyBsYXN0OyB0aGlzIHJlZHVjZXMgdGhlIGNodXJuIGR1cmluZyAidXBkYXRlIgorCQlmb3IgKEphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA6IGNvbnRleHRUeXBlc1RvVXBkYXRlKSB7CisJCQljb250ZXh0VHlwZS51cGRhdGUoKTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJaWYgKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKKwkJCXRocm93IG5ldyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gVE9ETyB2YWxpZGF0ZSAnamF2YVBlcnNpc3RlbnRUeXBlcycKKwl9CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2YzE0OQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQpAQCAtMCwwICsxLDE4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhT3ZlcnJpZGUKKwlpbXBsZW1lbnRzIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlCit7CisKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcmVsYXRpb25zaGlwUmVmZXJlbmNlOworCisJcHVibGljIEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZShKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIEFzc29jaWF0aW9uT3ZlcnJpZGUuT3duZXIgb3duZXIpIHsKKwkJc3VwZXIocGFyZW50LCBvd25lcik7CisJCXRoaXMucmVsYXRpb25zaGlwUmVmZXJlbmNlID0gYnVpbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oQXNzb2NpYXRpb25PdmVycmlkZSBvbGRBc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCXRoaXMuc2V0TmFtZShvbGRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXRoaXMucmVsYXRpb25zaGlwUmVmZXJlbmNlLmluaXRpYWxpemVGcm9tKG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgYnVpbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSh0aGlzKTsKKwl9CisJCisJcHVibGljIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwUmVmZXJlbmNlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgc2V0VmlydHVhbChib29sZWFuIHZpcnR1YWwpIHsKKwkJcmV0dXJuIChKYXZhQXNzb2NpYXRpb25PdmVycmlkZSkgc3VwZXIuc2V0VmlydHVhbCh2aXJ0dWFsKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBzdXBlci5nZXRPdmVycmlkZUFubm90YXRpb24oKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGUuT3duZXIgZ2V0T3duZXIoKSB7CisJCXJldHVybiAoQXNzb2NpYXRpb25PdmVycmlkZS5Pd25lcikgc3VwZXIuZ2V0T3duZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVOYW1lcygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0T3duZXIoKS5nZXRUeXBlTWFwcGluZygpLmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlyZXN1bHQgPSB0aGlzLnJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZShhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJdGhpcy5yZWxhdGlvbnNoaXBSZWZlcmVuY2UuaW5pdGlhbGl6ZShhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwl9CQkKKworCXB1YmxpYyB2b2lkIHVwZGF0ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCXN1cGVyLnVwZGF0ZShhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJdGhpcy5yZWxhdGlvbnNoaXBSZWZlcmVuY2UudXBkYXRlKGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpKSB7CisJCQl0aGlzLnZhbGlkYXRlSm9pbkNvbHVtbnMobWVzc2FnZXMsIGFzdFJvb3QpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSm9pbkNvbHVtbnMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCWZvciAoSXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IHN0cmVhbSA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmpvaW5Db2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJdGhpcy52YWxpZGF0ZUpvaW5Db2x1bW4oc3RyZWFtLm5leHQoKSwgbWVzc2FnZXMsIGFzdFJvb3QpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVKb2luQ29sdW1uKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4sIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlTdHJpbmcgdGFibGVOYW1lID0gam9pbkNvbHVtbi5nZXRUYWJsZSgpOworCQlpZiAodGhpcy5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSkpIHsKKwkJCWlmICh0aGlzLmlzVmlydHVhbCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFLAorCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKSwgdGFibGVOYW1lLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sCisJCQkJCQlqb2luQ29sdW1uLCAKKwkJCQkJCWpvaW5Db2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJKQorCQkJCSk7CisJCQl9IGVsc2UgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RhYmxlTmFtZSwgam9pbkNvbHVtbi5nZXROYW1lKCl9LCAKKwkJCQkJCWpvaW5Db2x1bW4sCisJCQkJCQlqb2luQ29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKGFzdFJvb3QpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoICEgam9pbkNvbHVtbi5pc1Jlc29sdmVkKCkpIHsKKwkJCWlmICh0aGlzLmlzVmlydHVhbCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpLCBqb2luQ29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQkJam9pbkNvbHVtbiwKKwkJCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KQorCQkJCQkpCisJCQkJKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAorCQkJCQkJbmV3IFN0cmluZ1tdIHtqb2luQ29sdW1uLmdldE5hbWUoKX0sIAorCQkJCQkJam9pbkNvbHVtbiwgCisJCQkJCQlqb2luQ29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJKQorCQkJCSk7CisJCQl9CisJCX0KKwkJCisJCWlmICggISBqb2luQ29sdW1uLmlzUmVmZXJlbmNlZENvbHVtblJlc29sdmVkKCkpIHsKKwkJCWlmICh0aGlzLmlzVmlydHVhbCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpLCBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCksIGpvaW5Db2x1bW4uZ2V0TmFtZSgpfSwgCisJCQkJCQlqb2luQ29sdW1uLAorCQkJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShhc3RSb290KQorCQkJCQkpCisJCQkJKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAorCQkJCQkJbmV3IFN0cmluZ1tdIHtqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCksIGpvaW5Db2x1bW4uZ2V0TmFtZSgpfSwgCisJCQkJCQlqb2luQ29sdW1uLAorCQkJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShhc3RSb290KQorCQkJCQkpCisJCQkJKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTVjMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsMzk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIKK3sKKwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworCisJcHJvdGVjdGVkIGZpbmFsIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuT3duZXIgb3duZXI7CisJCisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzOworCisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlczsKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuT3duZXIgb3duZXIpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5vd25lciA9IG93bmVyOworCQl0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gbmV3IEFycmF5TGlzdDxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4oKTsKKwkJdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgQXJyYXlMaXN0PEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPigpOworCX0KKworCXB1YmxpYyBPd25lciBnZXRPd25lcigpIHsKKwkJcmV0dXJuIHRoaXMub3duZXI7CisJfQorCisJcHVibGljIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlKSBnZXRPdmVycmlkZU5hbWVkKG5hbWUsIGFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOworCX0KKworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCBhc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gY29udGFpbnNEZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSk7CisJfQorCisJcHJvdGVjdGVkIEJhc2VPdmVycmlkZSBnZXRPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lLCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEJhc2VPdmVycmlkZT4gb3ZlcnJpZGVzKSB7CisJCWZvciAoQmFzZU92ZXJyaWRlIG92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG92ZXJyaWRlcykpIHsKKwkJCVN0cmluZyBvdmVycmlkZU5hbWUgPSBvdmVycmlkZS5nZXROYW1lKCk7CisJCQlpZiAob3ZlcnJpZGVOYW1lID09IG51bGwgJiYgbmFtZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG92ZXJyaWRlOworCQkJfQorCQkJaWYgKG92ZXJyaWRlTmFtZSAhPSBudWxsICYmIG92ZXJyaWRlTmFtZS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gb3ZlcnJpZGU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNPdmVycmlkZShTdHJpbmcgbmFtZSwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBCYXNlT3ZlcnJpZGU+IG92ZXJyaWRlcykgeworCQlyZXR1cm4gZ2V0T3ZlcnJpZGVOYW1lZChuYW1lLCBvdmVycmlkZXMpICE9IG51bGw7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgeworCQlUeXBlTWFwcGluZyBvdmVycmlkYWJsZVR5cGVNYXBwaW5nID0gZ2V0T3duZXIoKS5nZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCk7CisJCWlmIChvdmVycmlkYWJsZVR5cGVNYXBwaW5nICE9IG51bGwpIHsKKwkJCXJldHVybiBvdmVycmlkYWJsZVR5cGVNYXBwaW5nLmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOworCQl9CisJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7CisJfQorCisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcygpIHsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+KHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCksIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKKwl9CisJCisJcHVibGljIGludCBhc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpICsgdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCk7CisJfQorCisJcHVibGljICBMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4odGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMpOworCX0KKwkKKwlwdWJsaWMgaW50IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5zaXplKCk7CisJfQorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPih0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKTsKKwl9CisJCisJcHVibGljIGludCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShpbnQgaW5kZXgpIHsKKwkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlKHRoaXMsIGNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGVPd25lcigpKTsKKwkJdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5hZGQoaW5kZXgsIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAKKwkJCQkoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5hZGRBbm5vdGF0aW9uKAorCQkJCQlpbmRleCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCAKKwkJCQkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuaW5pdGlhbGl6ZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UpOworCQl0aGlzLmZpcmVJdGVtQWRkZWQoU1BFQ0lGSUVEX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNULCBpbmRleCwgYXNzb2NpYXRpb25PdmVycmlkZSk7CisJCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlOworCX0KKwkKKwlwcm90ZWN0ZWQgQXNzb2NpYXRpb25PdmVycmlkZS5Pd25lciBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlT3duZXIoKSB7CisJCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZU93bmVyKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoaW50IGluZGV4LCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGFzc29jaWF0aW9uT3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMsIFNQRUNJRklFRF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgeworCQl0aGlzLmFkZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUodGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5zaXplKCksIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlXyhKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCXJlbW92ZUl0ZW1Gcm9tTGlzdChhc3NvY2lhdGlvbk92ZXJyaWRlLCB0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLCBTUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIubW92ZUFubm90YXRpb24oCisJCQkJdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJZmlyZUl0ZW1Nb3ZlZChTUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKKwl9CisKKwlwcm90ZWN0ZWQgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgc2V0QXNzb2NpYXRpb25PdmVycmlkZVZpcnR1YWwoYm9vbGVhbiB2aXJ0dWFsLCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCS8vIEFkZCBhIG5ldyBhdHRyaWJ1dGUgb3ZlcnJpZGUKKwkJaWYgKHZpcnR1YWwpIHsKKwkJCXJldHVybiBzZXRBc3NvY2lhdGlvbk92ZXJyaWRlVmlydHVhbChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJfQorCQlyZXR1cm4gc2V0QXNzb2NpYXRpb25PdmVycmlkZVNwZWNpZmllZChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIHNldEFzc29jaWF0aW9uT3ZlcnJpZGVWaXJ0dWFsKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJaW50IGluZGV4ID0gdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5pbmRleE9mKGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQl0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLnJlbW92ZShpbmRleCk7CisJCVN0cmluZyBhc3NvY2lhdGlvbk92ZXJyaWRlTmFtZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpOworCQkvL2FkZCB0aGUgdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGUgc28gdGhhdCBJIGNhbiBjb250cm9sIHRoZSBvcmRlciB0aGF0IGNoYW5nZSBub3RpZmljYXRpb24gaXMgc2VudC4KKwkJLy9vdGhlcndpc2Ugd2hlbiB3ZSByZW1vdmUgdGhlIGFubm90YXRpb24gZnJvbSBqYXZhIHdlIHdpbGwgZ2V0IGFuIHVwZGF0ZSBhbmQgYWRkIHRoZSBhdHRyaWJ1dGUgb3ZlcnJpZGUKKwkJLy9kdXJpbmcgdGhlIHVwZGF0ZS4gIFRoaXMgY2F1c2VzIHRoZSBVSSB0byBiZSBmbGFreSwgc2luY2UgY2hhbmdlIG5vdGlmaWNhdGlvbiBtaWdodCBub3Qgb2NjdXIgaW4gdGhlIGNvcnJlY3Qgb3JkZXIKKwkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBudWxsOworCQlpZiAoYXNzb2NpYXRpb25PdmVycmlkZU5hbWUgIT0gbnVsbCkgeworCQkJZm9yIChTdHJpbmcgbmFtZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSkpIHsKKwkJCQlpZiAobmFtZS5lcXVhbHMoYXNzb2NpYXRpb25PdmVycmlkZU5hbWUpKSB7CisJCQkJCS8vc3RvcmUgdGhlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBzbyB3ZSBjYW4gZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGxhdGVyCisJCQkJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gYnVpbGRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZShuYW1lKTsKKwkJCQkJdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuYWRkKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLnJlbW92ZUFubm90YXRpb24oCisJCQkJaW5kZXgsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgCisJCQkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWZpcmVJdGVtUmVtb3ZlZChTUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJCisJCWlmICh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSAhPSBudWxsKSB7CisJCQlmaXJlSXRlbUFkZGVkKFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSAtIDEsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJfQorCQlyZXR1cm4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7CisJfQorCQorCXByb3RlY3RlZCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBzZXRBc3NvY2lhdGlvbk92ZXJyaWRlU3BlY2lmaWVkKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJaW50IGluZGV4ID0gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCk7CisJCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIG5ld0Fzc29jaWF0aW9uT3ZlcnJpZGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZSh0aGlzLCBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlT3duZXIoKSk7CisJCXRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuYWRkKGluZGV4LCBuZXdBc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UgPSAKKwkJCQkoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5hZGRBbm5vdGF0aW9uKAorCQkJCQlpbmRleCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCAKKwkJCQkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCW5ld0Fzc29jaWF0aW9uT3ZlcnJpZGUuaW5pdGlhbGl6ZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKTsKKwkJCisJCWludCB2aXJ0dWFsSW5kZXggPSB0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5pbmRleE9mKG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQl0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5yZW1vdmUodmlydHVhbEluZGV4KTsKKworCQluZXdBc3NvY2lhdGlvbk92ZXJyaWRlLmluaXRpYWxpemVGcm9tKG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQkKKwkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCwgdmlydHVhbEluZGV4LCBvbGRBc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKFNQRUNJRklFRF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCwgaW5kZXgsIG5ld0Fzc29jaWF0aW9uT3ZlcnJpZGUpOwkJCisKKwkJcmV0dXJuIG5ld0Fzc29jaWF0aW9uT3ZlcnJpZGU7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJYWRkSXRlbVRvTGlzdChhc3NvY2lhdGlvbk92ZXJyaWRlLCB0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcywgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KGFzc29jaWF0aW9uT3ZlcnJpZGUsIHRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLCBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNUKTsKKwl9CisJCisKKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSB7CisJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciA9IHJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKKwkJdGhpcy5pbml0aWFsaXplU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJdGhpcy5pbml0aWFsaXplVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJfQkKKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB7CisJCWZvciAoSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBzdHJlYW0gPSAKKwkJCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuYW5ub3RhdGlvbnMoCisJCQkJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgCisJCQkJCUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOyAKKwkJCQlzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCXRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuYWRkKAorCQkJCWJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHN0cmVhbS5uZXh0KCkpKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgeworCQlmb3IgKFN0cmluZyBuYW1lIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpKSkgeworCQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IGdldEFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lZChuYW1lKTsKKwkJCWlmIChhc3NvY2lhdGlvbk92ZXJyaWRlID09IG51bGwpIHsKKwkJCQl0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5hZGQoYnVpbGRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZShuYW1lKSk7CisJCQl9CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSB7CisJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciA9IHJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKKwkJdGhpcy51cGRhdGVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwb3N0VXBkYXRlKCkgeworCQlzdXBlci5wb3N0VXBkYXRlKCk7CisJCQorCQkvL0luIHBvc3RVcGRhdGUgYmVjYXVzZSB0aGUgam9pbmluZ1N0cmF0ZWd5IGlzIG5vdCBpbml0aWFsaXplZCBvbiByZWxhdGlvbnNoaXAgbWFwcGluZ3MuCisJCS8vaWYgd2UgZml4IHRoZSBpc3N1ZSB0aGF0IHdlIGRvIG5vdCBpbml0aWFsaXplIGphdmEgbWFwcGluZ3MsIGJ1dCB0aGV5IGluc3RlYWQgZ2V0IGluaXRpYWxpemVkCisJCS8vZHVyaW5nIHRoZSBmaXJzdCB1cGRhdGUsIHRoZW4gd2UgY2FuIHByb2JhYmx5IG1vdmUgdGhpcy4KKwkJdXBkYXRlVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7IAorCX0KKwkKKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgeworCQlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiByZXNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gCisJCQkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLmFubm90YXRpb25zKAorCQkJCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIAorCQkJCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCXdoaWxlIChhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKKwkJCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCQlpZiAocmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKKwkJCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnVwZGF0ZSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVfKGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQkJfQorCQl9CisJCQorCQl3aGlsZSAocmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKKwkJCWFkZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpKTsKKwkJfQkKKwl9CisJCisJcHJvdGVjdGVkIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UpIHsKKwkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlKHRoaXMsIGNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGVPd25lcigpKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5pbml0aWFsaXplKGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSk7CisJCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlOworCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlKGJ1aWxkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKG5hbWUpKTsKKwl9CisJCisJcHJvdGVjdGVkIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGJ1aWxkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKFN0cmluZyBuYW1lKSB7CisJCVJlbGF0aW9uc2hpcFJlZmVyZW5jZSByZWxhdGlvbnNoaXBSZWZlcmVuY2UgPSB0aGlzLnJlc29sdmVBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlKG5hbWUpOworCQlyZXR1cm4gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbih0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIsIG5hbWUsIHJlbGF0aW9uc2hpcFJlZmVyZW5jZS5nZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpKTsKKwl9CisJCisJcHJpdmF0ZSBSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcmVzb2x2ZUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoU3RyaW5nIGFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lKSB7CisJCXJldHVybiBnZXRPd25lcigpLnJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoYXNzb2NpYXRpb25PdmVycmlkZU5hbWUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSkpIHsKKwkJCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlTmFtZWQobmFtZSk7CisJCQlpZiAoYXNzb2NpYXRpb25PdmVycmlkZSA9PSBudWxsKSB7CisJCQkJYWRkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUoYnVpbGRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZShuYW1lKSk7CisJCQl9CisJCQllbHNlIGlmIChhc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKSB7CisJCQkJYXNzb2NpYXRpb25PdmVycmlkZS51cGRhdGUoYnVpbGRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24obmFtZSkpOworCQkJfQorCQl9CisJCQorCQlDb2xsZWN0aW9uPFN0cmluZz4gYXNzb2NpYXRpb25OYW1lcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpKTsKKwkKKwkJLy9yZW1vdmUgYW55IGRlZmF1bHQgbWFwcGluZ3MgdGhhdCBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBhc3NvY2lhdGlvbk5hbWVzIGNvbGxlY3Rpb24KKwkJZm9yIChKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpKSkgeworCQkJaWYgKCFhc3NvY2lhdGlvbk5hbWVzLmNvbnRhaW5zKGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKQorCQkJCXx8IGNvbnRhaW5zU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSkpIHsKKwkJCQlyZW1vdmVWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZShhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJCX0KKwkJfQorCX0KKwkKKwkKKwkvLyoqKioqKioqKioqKioqKioqKioqIENvZGUgQ29tcGxldGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJZm9yIChKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKSB7CisJCQlyZXN1bHQgPSBvdmVycmlkZS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvLyoqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCQorCQlmb3IgKEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBzdHJlYW0gPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7CisJCQlzdHJlYW0ubmV4dCgpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCX0KKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorCisJCisJLy8gKioqKioqKioqKiBhc3NvY2lhdGlvbiBvdmVycmlkZSBvd25lciAqKioqKioqKioqCisKKwljbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlT3duZXIgaW1wbGVtZW50cyBBc3NvY2lhdGlvbk92ZXJyaWRlLk93bmVyIHsKKworCQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoYXR0cmlidXRlTmFtZSwgZ2V0T3duZXIoKS5nZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCkpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VPdmVycmlkZSBvdmVycmlkZSkgeworCQkJcmV0dXJuIEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci50aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5jb250YWlucyhvdmVycmlkZSk7CisJCX0KKwkJCisJCXB1YmxpYyBCYXNlT3ZlcnJpZGUgc2V0VmlydHVhbChib29sZWFuIHZpcnR1YWwsIEJhc2VPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgeworCQkJcmV0dXJuIEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci50aGlzLnNldEFzc29jaWF0aW9uT3ZlcnJpZGVWaXJ0dWFsKHZpcnR1YWwsIChKYXZhQXNzb2NpYXRpb25PdmVycmlkZSkgYXR0cmlidXRlT3ZlcnJpZGUpOworCQl9CisKKwkJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgeworCQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMThjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZXh0ZW5kcyBBYnN0cmFjdEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisKKwlwdWJsaWMgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlIG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJaWYgKG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkpIHsKKwkJCWdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5pbml0aWFsaXplRnJvbShvbGRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pbmluZ1N0cmF0ZWd5IGNhbGN1bGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzZGU4YgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZSBleHRlbmRzIEFic3RyYWN0SmF2YU92ZXJyaWRlCisJaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlT3ZlcnJpZGUKK3sKKworCXByb3RlY3RlZCBmaW5hbCBKYXZhQ29sdW1uIGNvbHVtbjsKKwkKKworCXB1YmxpYyBHZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIEF0dHJpYnV0ZU92ZXJyaWRlLk93bmVyIG93bmVyKSB7CisJCXN1cGVyKHBhcmVudCwgb3duZXIpOworCQl0aGlzLmNvbHVtbiA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFDb2x1bW4odGhpcywgdGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgc2V0VmlydHVhbChib29sZWFuIHZpcnR1YWwpIHsKKwkJcmV0dXJuIChKYXZhQXR0cmlidXRlT3ZlcnJpZGUpIHN1cGVyLnNldFZpcnR1YWwodmlydHVhbCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgc3VwZXIuZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZS5Pd25lciBnZXRPd25lcigpIHsKKwkJcmV0dXJuIChBdHRyaWJ1dGVPdmVycmlkZS5Pd25lcikgc3VwZXIuZ2V0T3duZXIoKTsKKwl9CisJCisJcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0UmVzb3VyY2VDb2x1bW4oKSB7CisJCXJldHVybiB0aGlzLmdldE92ZXJyaWRlQW5ub3RhdGlvbigpLmdldE5vbk51bGxDb2x1bW4oKTsKKwl9CisJCisJcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0UmVzb3VyY2VDb2x1bW5Pck51bGwoKSB7CisJCXJldHVybiB0aGlzLmdldE92ZXJyaWRlQW5ub3RhdGlvbigpLmdldENvbHVtbigpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgeworCQlDb2x1bW4gY29sdW1uID0gcmVzb2x2ZU92ZXJyaWRlbkNvbHVtbigpOworCQlpZiAoY29sdW1uID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBjb2x1bW4uZ2V0TmFtZSgpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7CisJCUNvbHVtbiBjb2x1bW4gPSByZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKCk7CisJCWlmIChjb2x1bW4gPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJU3RyaW5nIHRhYmxlTmFtZSA9IGNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpOworCQlpZiAodGFibGVOYW1lICE9IG51bGwpIHsKKwkJCXJldHVybiB0YWJsZU5hbWU7CisJCX0KKwkJcmV0dXJuIGdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7CisJfQorCQorCXByb3RlY3RlZCBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRlbkNvbHVtbigpIHsKKwkJcmV0dXJuIGdldE93bmVyKCkucmVzb2x2ZU92ZXJyaWRlbkNvbHVtbihnZXROYW1lKCkpOworCX0KKworCS8vKioqKioqKioqKioqKiBJQ29sdW1uLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCisJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgeworCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCk7CisJfQorCQorCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXREYlRhYmxlKHRhYmxlTmFtZSk7CisJfQorCQorCS8vKioqKioqKioqKioqKiBJQXR0cmlidXRlT3ZlcnJpZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgSmF2YUNvbHVtbiBnZXRDb2x1bW4oKSB7CisJCXJldHVybiB0aGlzLmNvbHVtbjsKKwl9CisKKwkvLyoqKioqKioqKioqKiogSmF2YU92ZXJyaWRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlTmFtZXMoKSB7CisJCXJldHVybiB0aGlzLmdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJfQorCQorCS8vKioqKioqKioqKioqKiBqYXZhIHJlc291cmNlIG1vZGVsIC0+IGphdmEgY29udGV4dCBtb2RlbCAqKioqKioqKioqKioqKgkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKSB7CisJCXN1cGVyLmluaXRpYWxpemUoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSk7CisJCXRoaXMuY29sdW1uLmluaXRpYWxpemUodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UpIHsKKwkJc3VwZXIudXBkYXRlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UpOworCQl0aGlzLmNvbHVtbi51cGRhdGUodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpKTsJCQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlyZXN1bHQgPSB0aGlzLmdldENvbHVtbigpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKSkgeworCQkJdGhpcy52YWxpZGF0ZUNvbHVtbihtZXNzYWdlcywgYXN0Um9vdCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbHVtbihMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJU3RyaW5nIHRhYmxlTmFtZSA9IHRoaXMuY29sdW1uLmdldFRhYmxlKCk7CisJCWlmICh0aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSkpIHsKKwkJCWlmICh0aGlzLmlzVmlydHVhbCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpLCB0YWJsZU5hbWUsIHRoaXMuY29sdW1uLmdldE5hbWUoKX0sCisJCQkJCQl0aGlzLmNvbHVtbiwKKwkJCQkJCXRoaXMuY29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKGFzdFJvb3QpCisJCQkJCSkKKwkJCQkpOworCQkJfSBlbHNlIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7dGFibGVOYW1lLCB0aGlzLmNvbHVtbi5nZXROYW1lKCl9LCAKKwkJCQkJCXRoaXMuY29sdW1uLAorCQkJCQkJdGhpcy5jb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJKQorCQkJCSk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmICggISB0aGlzLmNvbHVtbi5pc1Jlc29sdmVkKCkgJiYgdGhpcy5jb2x1bW4uZ2V0RGJUYWJsZSgpICE9IG51bGwpIHsKKwkJCWlmICh0aGlzLmlzVmlydHVhbCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCksIHRoaXMuY29sdW1uLmdldE5hbWUoKX0sCisJCQkJCQl0aGlzLmNvbHVtbiwKKwkJCQkJCXRoaXMuY29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJKQorCQkJCSk7CisJCQl9IGVsc2UgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX05BTUUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuY29sdW1uLmdldE5hbWUoKX0sCisJCQkJCQl0aGlzLmNvbHVtbiwKKwkJCQkJCXRoaXMuY29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJKQorCQkJCSk7CisJCQl9CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZGUzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsMzg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLlZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcgoreworCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CisKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlczsKKworCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlczsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgT3duZXIgb3duZXI7CisJCisJcHVibGljIEdlbmVyaWNKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3duZXIgb3duZXIpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5vd25lciA9IG93bmVyOworCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPigpOworCQl0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVPdmVycmlkZT4oKTsKKwl9CisKKwlwdWJsaWMgT3duZXIgZ2V0T3duZXIoKSB7CisJCXJldHVybiB0aGlzLm93bmVyOworCX0KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzKCkgeworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkpOworCX0KKwkKKwlwdWJsaWMgaW50IGF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSArIHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKTsKKwl9CisJCisJcHVibGljIExpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMpOworCX0KKwkKKwlwdWJsaWMgaW50IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLnNpemUoKTsKKwl9CisJCisJcHVibGljIExpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKTsKKwl9CisJCisJcHVibGljIGludCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuc2l6ZSgpOworCX0KKworCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoaW50IGluZGV4KSB7CisJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFBdHRyaWJ1dGVPdmVycmlkZSh0aGlzLCBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZU93bmVyKCkpOworCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoaW5kZXgsIGF0dHJpYnV0ZU92ZXJyaWRlKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UgPSAKKwkJCQkoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuYWRkQW5ub3RhdGlvbigKKwkJCQkJaW5kZXgsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIAorCQkJCQlBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLmluaXRpYWxpemUoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSk7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChTUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGUpOworCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGU7CisJfQorCQorCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgc2V0QXR0cmlidXRlT3ZlcnJpZGVWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7CisJCS8vIEFkZCBhIG5ldyBhdHRyaWJ1dGUgb3ZlcnJpZGUKKwkJaWYgKHZpcnR1YWwpIHsKKwkJCXJldHVybiBzZXRBdHRyaWJ1dGVPdmVycmlkZVZpcnR1YWwoYXR0cmlidXRlT3ZlcnJpZGUpOworCQl9CisJCXJldHVybiBzZXRBdHRyaWJ1dGVPdmVycmlkZVNwZWNpZmllZChhdHRyaWJ1dGVPdmVycmlkZSk7CisJfQorCQorCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgc2V0QXR0cmlidXRlT3ZlcnJpZGVWaXJ0dWFsKEphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgeworCQlpbnQgaW5kZXggPSB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5pbmRleE9mKGF0dHJpYnV0ZU92ZXJyaWRlKTsKKwkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMucmVtb3ZlKGluZGV4KTsKKwkJU3RyaW5nIGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKTsKKwkJLy9hZGQgdGhlIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlIHNvIHRoYXQgSSBjYW4gY29udHJvbCB0aGUgb3JkZXIgdGhhdCBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlzIHNlbnQuCisJCS8vb3RoZXJ3aXNlIHdoZW4gd2UgcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGZyb20gamF2YSB3ZSB3aWxsIGdldCBhbiB1cGRhdGUgYW5kIGFkZCB0aGUgYXR0cmlidXRlIG92ZXJyaWRlCisJCS8vZHVyaW5nIHRoZSB1cGRhdGUuICBUaGlzIGNhdXNlcyB0aGUgVUkgdG8gYmUgZmxha3ksIHNpbmNlIGNoYW5nZSBub3RpZmljYXRpb24gbWlnaHQgbm90IG9jY3VyIGluIHRoZSBjb3JyZWN0IG9yZGVyCisJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBudWxsOworCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGVOYW1lICE9IG51bGwpIHsKKwkJCWZvciAoU3RyaW5nIG5hbWUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpKSkgeworCQkJCWlmIChuYW1lLmVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZU5hbWUpKSB7CisJCQkJCS8vc3RvcmUgdGhlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBzbyB3ZSBjYW4gZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGxhdGVyCisJCQkJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUpOworCQkJCQl0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5yZW1vdmVBbm5vdGF0aW9uKAorCQkJCWluZGV4LCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCAKKwkJCQlBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWZpcmVJdGVtUmVtb3ZlZChTUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGUpOworCQkKKwkJaWYgKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSAhPSBudWxsKSB7CisJCQlmaXJlSXRlbUFkZGVkKFZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIC0gMSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKTsKKwkJfQorCQlyZXR1cm4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOworCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIHNldEF0dHJpYnV0ZU92ZXJyaWRlU3BlY2lmaWVkKEphdmFBdHRyaWJ1dGVPdmVycmlkZSBvbGRBdHRyaWJ1dGVPdmVycmlkZSkgeworCQlpbnQgaW5kZXggPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7CisJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBuZXdBdHRyaWJ1dGVPdmVycmlkZSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFBdHRyaWJ1dGVPdmVycmlkZSh0aGlzLCBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZU93bmVyKCkpOworCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoaW5kZXgsIG5ld0F0dHJpYnV0ZU92ZXJyaWRlKTsKKwkJCisJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gCisJCQkJKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLmFkZEFubm90YXRpb24oCisJCQkJCWluZGV4LCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCAKKwkJCQkJQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQluZXdBdHRyaWJ1dGVPdmVycmlkZS5pbml0aWFsaXplKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UpOworCQkKKwkJaW50IGRlZmF1bHRJbmRleCA9IHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5pbmRleE9mKG9sZEF0dHJpYnV0ZU92ZXJyaWRlKTsKKwkJdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLnJlbW92ZShkZWZhdWx0SW5kZXgpOworCisJCW5ld0F0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUob2xkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJbmV3QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShvbGRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQkKKwkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIGRlZmF1bHRJbmRleCwgb2xkQXR0cmlidXRlT3ZlcnJpZGUpOworCQl0aGlzLmZpcmVJdGVtQWRkZWQoU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCwgaW5kZXgsIG5ld0F0dHJpYnV0ZU92ZXJyaWRlKTsJCQorCisJCXJldHVybiBuZXdBdHRyaWJ1dGVPdmVycmlkZTsKKwl9CisJCisJcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlLk93bmVyIGNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlT3duZXIoKSB7CisJCXJldHVybiBuZXcgQXR0cmlidXRlT3ZlcnJpZGVPd25lcigpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZShpbnQgaW5kZXgsIEphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgeworCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMsIFNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZShKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKKwkJdGhpcy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSh0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5zaXplKCksIGF0dHJpYnV0ZU92ZXJyaWRlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVfKEphdmFBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgeworCQlyZW1vdmVJdGVtRnJvbUxpc3QoYXR0cmlidXRlT3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLCBTUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5tb3ZlQW5ub3RhdGlvbigKKwkJCQl0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJZmlyZUl0ZW1Nb3ZlZChTUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKKwkJYWRkSXRlbVRvTGlzdChhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLCBWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KGF0dHJpYnV0ZU92ZXJyaWRlLCB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMsIFZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKKwl9CisKKwlwdWJsaWMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIChKYXZhQXR0cmlidXRlT3ZlcnJpZGUpIGdldE92ZXJyaWRlTmFtZWQobmFtZSwgYXR0cmlidXRlT3ZlcnJpZGVzKCkpOworCX0KKworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXR0cmlidXRlT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgYXR0cmlidXRlT3ZlcnJpZGVzKCkpOworCX0KKworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSk7CisJfQorCisJcHJvdGVjdGVkIEJhc2VPdmVycmlkZSBnZXRPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lLCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEJhc2VPdmVycmlkZT4gb3ZlcnJpZGVzKSB7CisJCWZvciAoQmFzZU92ZXJyaWRlIG92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG92ZXJyaWRlcykpIHsKKwkJCVN0cmluZyBvdmVycmlkZU5hbWUgPSBvdmVycmlkZS5nZXROYW1lKCk7CisJCQlpZiAob3ZlcnJpZGVOYW1lID09IG51bGwgJiYgbmFtZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG92ZXJyaWRlOworCQkJfQorCQkJaWYgKG92ZXJyaWRlTmFtZSAhPSBudWxsICYmIG92ZXJyaWRlTmFtZS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gb3ZlcnJpZGU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNPdmVycmlkZShTdHJpbmcgbmFtZSwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBCYXNlT3ZlcnJpZGU+IG92ZXJyaWRlcykgeworCQlyZXR1cm4gZ2V0T3ZlcnJpZGVOYW1lZChuYW1lLCBvdmVycmlkZXMpICE9IG51bGw7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKKwkJVHlwZU1hcHBpbmcgb3ZlcnJpZGFibGVUeXBlTWFwcGluZyA9IGdldE93bmVyKCkuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpOworCQlpZiAob3ZlcnJpZGFibGVUeXBlTWFwcGluZyAhPSBudWxsKSB7CisJCQlyZXR1cm4gb3ZlcnJpZGFibGVUeXBlTWFwcGluZy5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCX0KKwkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwl9CisKKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSB7CisJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciA9IHJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKKwkJdGhpcy5pbml0aWFsaXplU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCXRoaXMuaW5pdGlhbGl6ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKKwkJZm9yIChJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IHN0cmVhbSA9IAorCQkJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5hbm5vdGF0aW9ucygKKwkJCQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgCisJCQkJCUF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsgCisJCQkJc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoCisJCQkJYnVpbGRBdHRyaWJ1dGVPdmVycmlkZSgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBzdHJlYW0ubmV4dCgpKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB7CisJCWZvciAoU3RyaW5nIG5hbWUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpKSkgeworCQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChuYW1lKTsKKwkJCWlmIChhdHRyaWJ1dGVPdmVycmlkZSA9PSBudWxsKSB7CisJCQkJdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmFkZChidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShuYW1lKSk7CisJCQl9CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSB7CisJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciA9IHJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKKwkJdGhpcy51cGRhdGVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJdGhpcy51cGRhdGVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKKwkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gcmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMgPSAKKwkJCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuYW5ub3RhdGlvbnMoCisJCQkJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIAorCQkJCQlBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQl3aGlsZSAoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSkgeworCQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJCWlmIChyZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKKwkJCQlhdHRyaWJ1dGVPdmVycmlkZS51cGRhdGUoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlXyhhdHRyaWJ1dGVPdmVycmlkZSk7CisJCQl9CisJCX0KKwkJCisJCXdoaWxlIChyZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKKwkJCWFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKSk7CisJCX0JCisJfQorCQorCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSkgeworCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXR0cmlidXRlT3ZlcnJpZGUodGhpcywgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVPd25lcigpKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuaW5pdGlhbGl6ZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlKTsKKwkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlOworCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKFN0cmluZyBhdHRyaWJ1dGVPdmVycmlkZU5hbWUpIHsKKwkJcmV0dXJuIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSkpOworCX0KKwkKKwlwcm90ZWN0ZWQgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBidWlsZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oU3RyaW5nIGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSkgeworCQlDb2x1bW4gY29sdW1uID0gcmVzb2x2ZU92ZXJyaWRlbkNvbHVtbihhdHRyaWJ1dGVPdmVycmlkZU5hbWUpOworCQlyZXR1cm4gbmV3IFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24odGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLCBhdHRyaWJ1dGVPdmVycmlkZU5hbWUsIGNvbHVtbik7CisJfQorCisJcHJpdmF0ZSBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlT3ZlcnJpZGVOYW1lKSB7CisJCXJldHVybiBnZXRPd25lcigpLnJlc29sdmVPdmVycmlkZW5Db2x1bW4oYXR0cmlidXRlT3ZlcnJpZGVOYW1lKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkpKSB7CisJCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBnZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKG5hbWUpOworCQkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlID09IG51bGwpIHsKKwkJCQlhZGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUobmFtZSkpOworCQkJfQorCQkJZWxzZSBpZiAoYXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpIHsKKwkJCQlhdHRyaWJ1dGVPdmVycmlkZS51cGRhdGUoYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKG5hbWUpKTsKKwkJCX0KKwkJfQorCQkKKwkJQ29sbGVjdGlvbjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpKTsKKwkKKwkJLy9yZW1vdmUgYW55IGRlZmF1bHQgbWFwcGluZ3MgdGhhdCBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBhdHRyaWJ1dGVOYW1lcyBjb2xsZWN0aW9uCisJCWZvciAoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSkpIHsKKwkJCWlmICghYXR0cmlidXRlTmFtZXMuY29udGFpbnMoYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKQorCQkJCXx8IGNvbnRhaW5zU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKSkgeworCQkJCXJlbW92ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShhdHRyaWJ1dGVPdmVycmlkZSk7CisJCQl9CisJCX0KKwl9CisJCisJCisJLy8qKioqKioqKioqKioqKioqKioqKiBDb2RlIENvbXBsZXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWZvciAoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIG92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVzKCkpKSB7CisJCQlyZXN1bHQgPSBvdmVycmlkZS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvLyoqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCWZvciAoSXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzdHJlYW0gPSB0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlcygpOyBzdHJlYW0uaGFzTmV4dCgpOykgeworCQkJc3RyZWFtLm5leHQoKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl9CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKworCQorCQorCS8vICoqKioqKioqKiogYXR0cmlidXRlIG92ZXJyaWRlIG93bmVyICoqKioqKioqKioKKworCWNsYXNzIEF0dHJpYnV0ZU92ZXJyaWRlT3duZXIgaW1wbGVtZW50cyBBdHRyaWJ1dGVPdmVycmlkZS5Pd25lciB7CisKKwkJcHVibGljIENvbHVtbiByZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCQlpZiAoYXR0cmlidXRlTmFtZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlyZXR1cm4gR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci50aGlzLnJlc29sdmVPdmVycmlkZW5Db2x1bW4oYXR0cmlidXRlTmFtZSk7CQkJCisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZU92ZXJyaWRlIG92ZXJyaWRlKSB7CisJCQlyZXR1cm4gR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci50aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuY29udGFpbnMob3ZlcnJpZGUpOworCQl9CisKKwkJcHVibGljIEJhc2VPdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgQmFzZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7CisJCQlyZXR1cm4gR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci50aGlzLnNldEF0dHJpYnV0ZU92ZXJyaWRlVmlydHVhbCh2aXJ0dWFsLCAoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKSBhdHRyaWJ1dGVPdmVycmlkZSk7CisJCX0KKworCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRUeXBlTWFwcGluZygpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFCYXNpY01hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUJhc2ljTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNmZhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFCYXNpY01hcHBpbmcuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFCYXNpY01hcHBpbmc7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQmFzaWNNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nCit7CisJcHVibGljIEdlbmVyaWNKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ2FzY2FkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ2FzY2FkZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYjVlNzMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFDYXNjYWRlLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUNhc2NhZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFDYXNjYWRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUgaW1wbGVtZW50cyBKYXZhQ2FzY2FkZQoreworCXByb3RlY3RlZCBib29sZWFuIGFsbDsKKworCXByb3RlY3RlZCBib29sZWFuIHBlcnNpc3Q7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBtZXJnZTsKKworCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZTsKKworCXByb3RlY3RlZCBib29sZWFuIHJlZnJlc2g7CisKKwlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gcmVsYXRpb25zaGlwTWFwcGluZzsKKworCXB1YmxpYyBHZW5lcmljSmF2YUNhc2NhZGUoSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNBbGwoKSB7CisJCXJldHVybiB0aGlzLmFsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBbGwoYm9vbGVhbiBuZXdBbGwpIHsKKwkJYm9vbGVhbiBvbGRBbGwgPSB0aGlzLmFsbDsKKwkJdGhpcy5hbGwgPSBuZXdBbGw7CisJCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5zZXRDYXNjYWRlQWxsKG5ld0FsbCk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ2FzY2FkZS5BTExfUFJPUEVSVFksIG9sZEFsbCwgbmV3QWxsKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0QWxsXyhib29sZWFuIG5ld0FsbCkgeworCQlib29sZWFuIG9sZEFsbCA9IHRoaXMuYWxsOworCQl0aGlzLmFsbCA9IG5ld0FsbDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChDYXNjYWRlLkFMTF9QUk9QRVJUWSwgb2xkQWxsLCBuZXdBbGwpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdCgpIHsKKwkJcmV0dXJuIHRoaXMucGVyc2lzdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0KGJvb2xlYW4gbmV3UGVyc2lzdCkgeworCQlib29sZWFuIG9sZFBlcnNpc3QgPSB0aGlzLnBlcnNpc3Q7CisJCXRoaXMucGVyc2lzdCA9IG5ld1BlcnNpc3Q7CisJCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5zZXRDYXNjYWRlUGVyc2lzdChuZXdQZXJzaXN0KTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChDYXNjYWRlLlBFUlNJU1RfUFJPUEVSVFksIG9sZFBlcnNpc3QsIG5ld1BlcnNpc3QpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFBlcnNpc3RfKGJvb2xlYW4gbmV3UGVyc2lzdCkgeworCQlib29sZWFuIG9sZFBlcnNpc3QgPSB0aGlzLnBlcnNpc3Q7CisJCXRoaXMucGVyc2lzdCA9IG5ld1BlcnNpc3Q7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ2FzY2FkZS5QRVJTSVNUX1BST1BFUlRZLCBvbGRQZXJzaXN0LCBuZXdQZXJzaXN0KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc01lcmdlKCkgeworCQlyZXR1cm4gdGhpcy5tZXJnZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNZXJnZShib29sZWFuIG5ld01lcmdlKSB7CisJCWJvb2xlYW4gb2xkTWVyZ2UgPSB0aGlzLm1lcmdlOworCQl0aGlzLm1lcmdlID0gbmV3TWVyZ2U7CisJCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5zZXRDYXNjYWRlTWVyZ2UobmV3TWVyZ2UpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENhc2NhZGUuTUVSR0VfUFJPUEVSVFksIG9sZE1lcmdlLCBuZXdNZXJnZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0TWVyZ2VfKGJvb2xlYW4gbmV3TWVyZ2UpIHsKKwkJYm9vbGVhbiBvbGRNZXJnZSA9IHRoaXMubWVyZ2U7CisJCXRoaXMubWVyZ2UgPSBuZXdNZXJnZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChDYXNjYWRlLk1FUkdFX1BST1BFUlRZLCBvbGRNZXJnZSwgbmV3TWVyZ2UpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVtb3ZlKCkgeworCQlyZXR1cm4gdGhpcy5yZW1vdmU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVtb3ZlKGJvb2xlYW4gbmV3UmVtb3ZlKSB7CisJCWJvb2xlYW4gb2xkUmVtb3ZlID0gdGhpcy5yZW1vdmU7CisJCXRoaXMucmVtb3ZlID0gbmV3UmVtb3ZlOworCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcuc2V0Q2FzY2FkZVJlbW92ZShuZXdSZW1vdmUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENhc2NhZGUuUkVNT1ZFX1BST1BFUlRZLCBvbGRSZW1vdmUsIG5ld1JlbW92ZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0UmVtb3ZlXyhib29sZWFuIG5ld1JlbW92ZSkgeworCQlib29sZWFuIG9sZFJlbW92ZSA9IHRoaXMucmVtb3ZlOworCQl0aGlzLnJlbW92ZSA9IG5ld1JlbW92ZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChDYXNjYWRlLlJFTU9WRV9QUk9QRVJUWSwgb2xkUmVtb3ZlLCBuZXdSZW1vdmUpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVmcmVzaCgpIHsKKwkJcmV0dXJuIHRoaXMucmVmcmVzaDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoKGJvb2xlYW4gbmV3UmVmcmVzaCkgeworCQlib29sZWFuIG9sZFJlZnJlc2ggPSB0aGlzLnJlZnJlc2g7CisJCXRoaXMucmVmcmVzaCA9IG5ld1JlZnJlc2g7CisJCXRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5zZXRDYXNjYWRlUmVmcmVzaChuZXdSZWZyZXNoKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChDYXNjYWRlLlJFRlJFU0hfUFJPUEVSVFksIG9sZFJlZnJlc2gsIG5ld1JlZnJlc2gpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFJlZnJlc2hfKGJvb2xlYW4gbmV3UmVmcmVzaCkgeworCQlib29sZWFuIG9sZFJlZnJlc2ggPSB0aGlzLnJlZnJlc2g7CisJCXRoaXMucmVmcmVzaCA9IG5ld1JlZnJlc2g7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ2FzY2FkZS5SRUZSRVNIX1BST1BFUlRZLCBvbGRSZWZyZXNoLCBuZXdSZWZyZXNoKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5nZXRDYXNjYWRlVGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIHJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKKwkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nID0gcmVsYXRpb25zaGlwTWFwcGluZzsKKwkJdGhpcy5hbGwgPSByZWxhdGlvbnNoaXBNYXBwaW5nLmlzQ2FzY2FkZUFsbCgpOworCQl0aGlzLnBlcnNpc3QgPSByZWxhdGlvbnNoaXBNYXBwaW5nLmlzQ2FzY2FkZVBlcnNpc3QoKTsKKwkJdGhpcy5tZXJnZSA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlTWVyZ2UoKTsKKwkJdGhpcy5yZW1vdmUgPSByZWxhdGlvbnNoaXBNYXBwaW5nLmlzQ2FzY2FkZVJlbW92ZSgpOworCQl0aGlzLnJlZnJlc2ggPSByZWxhdGlvbnNoaXBNYXBwaW5nLmlzQ2FzY2FkZVJlZnJlc2goKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIHJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKKwkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nID0gcmVsYXRpb25zaGlwTWFwcGluZzsKKwkJdGhpcy5zZXRBbGxfKHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlQWxsKCkpOworCQl0aGlzLnNldFBlcnNpc3RfKHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlUGVyc2lzdCgpKTsKKwkJdGhpcy5zZXRNZXJnZV8ocmVsYXRpb25zaGlwTWFwcGluZy5pc0Nhc2NhZGVNZXJnZSgpKTsKKwkJdGhpcy5zZXRSZW1vdmVfKHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlUmVtb3ZlKCkpOworCQl0aGlzLnNldFJlZnJlc2hfKHJlbGF0aW9uc2hpcE1hcHBpbmcuaXNDYXNjYWRlUmVmcmVzaCgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNvbHVtbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOWY0NDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFDb2x1bW4uamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQmFzZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUNvbHVtbiBleHRlbmRzIEFic3RyYWN0SmF2YUJhc2VDb2x1bW48Q29sdW1uQW5ub3RhdGlvbj4gaW1wbGVtZW50cyBKYXZhQ29sdW1uCit7CisKKwlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRMZW5ndGg7CisKKwlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRQcmVjaXNpb247CisKKwlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRTY2FsZTsKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFDb2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUNvbHVtbi5Pd25lciBvd25lcikgeworCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbikgeworCQlzdXBlci5pbml0aWFsaXplKGNvbHVtbik7CisJCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5nZXRSZXNvdXJjZUxlbmd0aChjb2x1bW4pOworCQl0aGlzLnNwZWNpZmllZFByZWNpc2lvbiA9IHRoaXMuZ2V0UmVzb3VyY2VQcmVjaXNpb24oY29sdW1uKTsKKwkJdGhpcy5zcGVjaWZpZWRTY2FsZSA9IHRoaXMuZ2V0UmVzb3VyY2VTY2FsZShjb2x1bW4pOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUNvbHVtbi5Pd25lciBnZXRPd25lcigpIHsKKwkJcmV0dXJuIChKYXZhQ29sdW1uLk93bmVyKSBzdXBlci5nZXRPd25lcigpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb2x1bW5Bbm5vdGF0aW9uIGdldFJlc291cmNlQ29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldFJlc291cmNlQ29sdW1uKCk7CisJfQorCQorCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0TGVuZ3RoKCkgOiB0aGlzLmdldFNwZWNpZmllZExlbmd0aCgpLmludFZhbHVlKCk7CisJfQorCisJcHVibGljIGludCBnZXREZWZhdWx0TGVuZ3RoKCkgeworCQlyZXR1cm4gQ29sdW1uLkRFRkFVTFRfTEVOR1RIOworCX0KKwkKKwlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRMZW5ndGgoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZExlbmd0aDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlciBuZXdTcGVjaWZpZWRMZW5ndGgpIHsKKwkJSW50ZWdlciBvbGRTcGVjaWZpZWRMZW5ndGggPSB0aGlzLnNwZWNpZmllZExlbmd0aDsKKwkJdGhpcy5zcGVjaWZpZWRMZW5ndGggPSBuZXdTcGVjaWZpZWRMZW5ndGg7CisJCWdldFJlc291cmNlQ29sdW1uKCkuc2V0TGVuZ3RoKG5ld1NwZWNpZmllZExlbmd0aCk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTGVuZ3RoLCBuZXdTcGVjaWZpZWRMZW5ndGgpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRMZW5ndGhfKEludGVnZXIgbmV3U3BlY2lmaWVkTGVuZ3RoKSB7CisJCUludGVnZXIgb2xkU3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5zcGVjaWZpZWRMZW5ndGg7CisJCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gbmV3U3BlY2lmaWVkTGVuZ3RoOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFksIG9sZFNwZWNpZmllZExlbmd0aCwgbmV3U3BlY2lmaWVkTGVuZ3RoKTsKKwl9CisKKwlwdWJsaWMgaW50IGdldFByZWNpc2lvbigpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFByZWNpc2lvbigpID09IG51bGwpID8gZ2V0RGVmYXVsdFByZWNpc2lvbigpIDogdGhpcy5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKS5pbnRWYWx1ZSgpOworCX0KKworCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFByZWNpc2lvbigpIHsKKwkJcmV0dXJuIENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTjsKKwl9CisJCisJcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQcmVjaXNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIgbmV3U3BlY2lmaWVkUHJlY2lzaW9uKSB7CisJCUludGVnZXIgb2xkU3BlY2lmaWVkUHJlY2lzaW9uID0gdGhpcy5zcGVjaWZpZWRQcmVjaXNpb247CisJCXRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uID0gbmV3U3BlY2lmaWVkUHJlY2lzaW9uOworCQlnZXRSZXNvdXJjZUNvbHVtbigpLnNldFByZWNpc2lvbihuZXdTcGVjaWZpZWRQcmVjaXNpb24pOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QUkVDSVNJT05fUFJPUEVSVFksIG9sZFNwZWNpZmllZFByZWNpc2lvbiwgbmV3U3BlY2lmaWVkUHJlY2lzaW9uKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUHJlY2lzaW9uXyhJbnRlZ2VyIG5ld1NwZWNpZmllZFByZWNpc2lvbikgeworCQlJbnRlZ2VyIG9sZFNwZWNpZmllZFByZWNpc2lvbiA9IHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uOworCQl0aGlzLnNwZWNpZmllZFByZWNpc2lvbiA9IG5ld1NwZWNpZmllZFByZWNpc2lvbjsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUFJFQ0lTSU9OX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRQcmVjaXNpb24sIG5ld1NwZWNpZmllZFByZWNpc2lvbik7CisJfQorCisJcHVibGljIGludCBnZXRTY2FsZSgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFNjYWxlKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0U2NhbGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU2NhbGUoKS5pbnRWYWx1ZSgpOworCX0KKworCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFNjYWxlKCkgeworCQlyZXR1cm4gQ29sdW1uLkRFRkFVTFRfU0NBTEU7CisJfQorCQorCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZFNjYWxlKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTY2FsZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyIG5ld1NwZWNpZmllZFNjYWxlKSB7CisJCUludGVnZXIgb2xkU3BlY2lmaWVkU2NhbGUgPSB0aGlzLnNwZWNpZmllZFNjYWxlOworCQl0aGlzLnNwZWNpZmllZFNjYWxlID0gbmV3U3BlY2lmaWVkU2NhbGU7CisJCWdldFJlc291cmNlQ29sdW1uKCkuc2V0U2NhbGUobmV3U3BlY2lmaWVkU2NhbGUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0FMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2NhbGUsIG5ld1NwZWNpZmllZFNjYWxlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2NhbGVfKEludGVnZXIgbmV3U3BlY2lmaWVkU2NhbGUpIHsKKwkJSW50ZWdlciBvbGRTcGVjaWZpZWRTY2FsZSA9IHRoaXMuc3BlY2lmaWVkU2NhbGU7CisJCXRoaXMuc3BlY2lmaWVkU2NhbGUgPSBuZXdTcGVjaWZpZWRTY2FsZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NBTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFNjYWxlLCBuZXdTcGVjaWZpZWRTY2FsZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gdGFibGVJc0FsbG93ZWQoKSB7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldFJlc291cmNlQ29sdW1uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOworCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0T3duZXIoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwkKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKENvbHVtbkFubm90YXRpb24gY29sdW1uKSB7CisJCXN1cGVyLnVwZGF0ZShjb2x1bW4pOworCQl0aGlzLnNldFNwZWNpZmllZExlbmd0aF8odGhpcy5nZXRSZXNvdXJjZUxlbmd0aChjb2x1bW4pKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRQcmVjaXNpb25fKHRoaXMuZ2V0UmVzb3VyY2VQcmVjaXNpb24oY29sdW1uKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkU2NhbGVfKHRoaXMuZ2V0UmVzb3VyY2VTY2FsZShjb2x1bW4pKTsKKwl9CisJCisJcHJvdGVjdGVkIEludGVnZXIgZ2V0UmVzb3VyY2VMZW5ndGgoQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4pIHsKKwkJcmV0dXJuIGNvbHVtbi5nZXRMZW5ndGgoKTsKKwl9CisJCisJcHJvdGVjdGVkIEludGVnZXIgZ2V0UmVzb3VyY2VQcmVjaXNpb24oQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4pIHsKKwkJcmV0dXJuIGNvbHVtbi5nZXRQcmVjaXNpb24oKTsKKwl9CisJCisJcHJvdGVjdGVkIEludGVnZXIgZ2V0UmVzb3VyY2VTY2FsZShDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbikgeworCQlyZXR1cm4gY29sdW1uLmdldFNjYWxlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYzkzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFEaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKQEAgLTAsMCArMSwyMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRGlzY3JpbWluYXRvckNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4gZXh0ZW5kcyBBYnN0cmFjdEphdmFOYW1lZENvbHVtbjxEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbj4KKwlpbXBsZW1lbnRzIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uCit7CisKKwlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGU7CisKKwlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgZGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlOworCQorCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZExlbmd0aDsKKwkKKwlwcm90ZWN0ZWQgaW50IGRlZmF1bHRMZW5ndGg7CisJCisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGVyc2lzdGVuY2VSZXNvdXJjZTsKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFEaXNjcmltaW5hdG9yQ29sdW1uKEphdmFFbnRpdHkgcGFyZW50LCBKYXZhRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lciBvd25lcikgeworCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGVyc2lzdGVudFJlc291cmNlKSB7CisJCXRoaXMucGVyc2lzdGVuY2VSZXNvdXJjZSA9IHBlcnNpc3RlbnRSZXNvdXJjZTsKKwkJdGhpcy5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uKSB7CisJCXN1cGVyLmluaXRpYWxpemUoY29sdW1uKTsKKwkJdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclR5cGUgPSB0aGlzLmJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCk7CisJCXRoaXMuZGVmYXVsdExlbmd0aCA9IHRoaXMuYnVpbGREZWZhdWx0TGVuZ3RoKCk7CisJCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUgPSB0aGlzLmdldFJlc291cmNlRGlzY3JpbWluYXRvclR5cGUoY29sdW1uKTsKKwkJdGhpcy5zcGVjaWZpZWRMZW5ndGggPSB0aGlzLmdldFJlc291cmNlTGVuZ3RoKGNvbHVtbik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lciBnZXRPd25lcigpIHsKKwkJcmV0dXJuIChKYXZhRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lcikgc3VwZXIuZ2V0T3duZXIoKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFFbnRpdHkgZ2V0SmF2YUVudGl0eSgpIHsKKwkJcmV0dXJuIChKYXZhRW50aXR5KSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gZ2V0UmVzb3VyY2VDb2x1bW4oKSB7CisJCXJldHVybiAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHRoaXMucGVyc2lzdGVuY2VSZXNvdXJjZS4KKwkJCQlnZXROb25OdWxsQW5ub3RhdGlvbihEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1Jlc291cmNlU3BlY2lmaWVkKCkgeworCQlyZXR1cm4gZ2V0UmVzb3VyY2VDb2x1bW4oKS5pc1NwZWNpZmllZCgpOworCX0KKwkKKwlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKSB7CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKTsKKwl9CisKKwlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclR5cGU7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSkgeworCQlEaXNjcmltaW5hdG9yVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVHlwZTsKKwkJdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclR5cGUgPSBkaXNjcmltaW5hdG9yVHlwZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkLCBkaXNjcmltaW5hdG9yVHlwZSk7CisJfQorCQkKKwlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZSBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSkgeworCQlEaXNjcmltaW5hdG9yVHlwZSBvbGREaXNjcmltaW5hdG9yVHlwZSA9IHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGU7CisJCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUgPSBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKKwkJZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRGlzY3JpbWluYXRvckNvbHVtbi5TUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZLCBvbGREaXNjcmltaW5hdG9yVHlwZSwgbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUpOworCX0KKwkKKwkvKioKKwkgKiBpbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4KKwkgKiBUaGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggSW52YWxpZFRocmVhZEFjY2VzcyBleGNlcHRpb25zIGluIHRoZSBVSQorCSAqIHdoZW4geW91IHNldCBhIHZhbHVlIGZyb20gdGhlIFVJIGFuZCB0aGUgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHlldC4KKwkgKiBBZGRpbmcgdGhlIGFubm90YXRpb24gY2F1c2VzIGFuIHVwZGF0ZSB0byBvY2N1ciBhbmQgdGhlbiB0aGUgZXhjZXB0aW9uLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlXyhEaXNjcmltaW5hdG9yVHlwZSBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSkgeworCQlEaXNjcmltaW5hdG9yVHlwZSBvbGREaXNjcmltaW5hdG9yVHlwZSA9IHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGU7CisJCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUgPSBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChEaXNjcmltaW5hdG9yQ29sdW1uLlNQRUNJRklFRF9ESVNDUklNSU5BVE9SX1RZUEVfUFJPUEVSVFksIG9sZERpc2NyaW1pbmF0b3JUeXBlLCBuZXdTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSk7CisJfQorCQkKKwlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZExlbmd0aCgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0TGVuZ3RoKCkgOiB0aGlzLmdldFNwZWNpZmllZExlbmd0aCgpLmludFZhbHVlKCk7CisJfQorCisJcHVibGljIGludCBnZXREZWZhdWx0TGVuZ3RoKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0TGVuZ3RoOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TGVuZ3RoKGludCBkZWZhdWx0TGVuZ3RoKSB7CisJCWludCBvbGQgPSB0aGlzLmRlZmF1bHRMZW5ndGg7CisJCXRoaXMuZGVmYXVsdExlbmd0aCA9IGRlZmF1bHRMZW5ndGg7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9MRU5HVEhfUFJPUEVSVFksIG9sZCwgZGVmYXVsdExlbmd0aCk7CisJfQorCQorCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZExlbmd0aCgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTGVuZ3RoOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyIG5ld1NwZWNpZmllZExlbmd0aCkgeworCQlJbnRlZ2VyIG9sZFNwZWNpZmllZExlbmd0aCA9IHRoaXMuc3BlY2lmaWVkTGVuZ3RoOworCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IG5ld1NwZWNpZmllZExlbmd0aDsKKwkJZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXRMZW5ndGgobmV3U3BlY2lmaWVkTGVuZ3RoKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChEaXNjcmltaW5hdG9yQ29sdW1uLlNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFksIG9sZFNwZWNpZmllZExlbmd0aCwgbmV3U3BlY2lmaWVkTGVuZ3RoKTsKKwl9CisKKwkvKioKKwkgKiBpbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4KKwkgKiBUaGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggSW52YWxpZFRocmVhZEFjY2VzcyBleGNlcHRpb25zIGluIHRoZSBVSQorCSAqIHdoZW4geW91IHNldCBhIHZhbHVlIGZyb20gdGhlIFVJIGFuZCB0aGUgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHlldC4KKwkgKiBBZGRpbmcgdGhlIGFubm90YXRpb24gY2F1c2VzIGFuIHVwZGF0ZSB0byBvY2N1ciBhbmQgdGhlbiB0aGUgZXhjZXB0aW9uLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZExlbmd0aF8oSW50ZWdlciBuZXdTcGVjaWZpZWRMZW5ndGgpIHsKKwkJSW50ZWdlciBvbGRTcGVjaWZpZWRMZW5ndGggPSB0aGlzLnNwZWNpZmllZExlbmd0aDsKKwkJdGhpcy5zcGVjaWZpZWRMZW5ndGggPSBuZXdTcGVjaWZpZWRMZW5ndGg7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRGlzY3JpbWluYXRvckNvbHVtbi5TUEVDSUZJRURfTEVOR1RIX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRMZW5ndGgsIG5ld1NwZWNpZmllZExlbmd0aCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7CisJCXJldHVybiBnZXRKYXZhRW50aXR5KCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldFJlc291cmNlQ29sdW1uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOworCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0T3duZXIoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwkKKwl9CisKKwkKKwkvLyAqKioqKioqKioqIGphdmEgYW5ub3RhdGlvbnMgLT4gcGVyc2lzdGVuY2UgbW9kZWwgKioqKioqKioqKgorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBlcnNpc3RlbnRSZXNvdXJjZSkgeworCQl0aGlzLnBlcnNpc3RlbmNlUmVzb3VyY2UgPSBwZXJzaXN0ZW50UmVzb3VyY2U7CisJCXRoaXMudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZShEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uKSB7CisJCS8vZG9uJ3QgY2FsbCBzdXBlciBiZWNhdXNlIHBvc3RVcGRhdGUoKSBoYW5kbGVzIHVwZGF0aW5nIHRoZSBkZWZhdWx0IGNvbHVtbiBuYW1lCisJCXRoaXMuc2V0U3BlY2lmaWVkTmFtZV8oZGlzY3JpbWluYXRvckNvbHVtbi5nZXROYW1lKCkpOworCQl0aGlzLnNldENvbHVtbkRlZmluaXRpb25fKGRpc2NyaW1pbmF0b3JDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZV8odGhpcy5nZXRSZXNvdXJjZURpc2NyaW1pbmF0b3JUeXBlKGRpc2NyaW1pbmF0b3JDb2x1bW4pKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGhfKHRoaXMuZ2V0UmVzb3VyY2VMZW5ndGgoZGlzY3JpbWluYXRvckNvbHVtbikpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwkvKioKKwkgKiBVc2luZyBwb3N0VXBkYXRlIHNpbmNlIHRoZXNlIGRlZmF1bHRzIGFyZSBkZXBlbmRlbnQgb24gdGhlIGVudGl0eSBoaWVyYXJjaHkKKwkgKi8KKwlwdWJsaWMgdm9pZCBwb3N0VXBkYXRlKCkgeworCQlzdXBlci5wb3N0VXBkYXRlKCk7CisJCXRoaXMuc2V0RGVmYXVsdE5hbWUodGhpcy5idWlsZERlZmF1bHROYW1lKCkpOworCQl0aGlzLnNldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSh0aGlzLmJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOworCQl0aGlzLnNldERlZmF1bHRMZW5ndGgodGhpcy5idWlsZERlZmF1bHRMZW5ndGgoKSk7CisJfQorCQorCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBnZXRSZXNvdXJjZURpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JDb2x1bW4pIHsKKwkJcmV0dXJuIERpc2NyaW1pbmF0b3JUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChkaXNjcmltaW5hdG9yQ29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgSW50ZWdlciBnZXRSZXNvdXJjZUxlbmd0aChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uKSB7CisJCXJldHVybiBkaXNjcmltaW5hdG9yQ29sdW1uLmdldExlbmd0aCgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUVudGl0eSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoSmF2YUVudGl0eSkgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCQorCXByb3RlY3RlZCBpbnQgYnVpbGREZWZhdWx0TGVuZ3RoKCkgeworCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldERlZmF1bHRMZW5ndGgoKTsKKwl9CisJCisJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQlpZiAodGhpcy5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkpIHsKKwkJCWlmICggISB0aGlzLmlzUmVzb2x2ZWQoKSkgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkRJU0NSSU1JTkFUT1JfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LCAKKwkJCQkJCXRoaXMsCisJCQkJCQl0aGlzLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJKQorCQkJCSk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhMmM5OAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGFibGUuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworCisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVtYmVkZGFibGUKKwlleHRlbmRzIEFic3RyYWN0SmF2YUVtYmVkZGFibGUKK3sKKwlwdWJsaWMgR2VuZXJpY0phdmFFbWJlZGRhYmxlKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoU3RyaW5nIGF0dHJpYnV0ZU1hcHBpbmdLZXkpIHsKKwkJLy9nZW5lcmljIG9ubHkgYWxsb3dzIGJhc2ljIGFuZCB0cmFuc2llbnQgd2l0aGluIGFuIEVtYmVkZGFibGUKKwkJcmV0dXJuIEFycmF5VG9vbHMuY29udGFpbnMoQUxMT1dFRF9BVFRSSUJVVEVfTUFQUElOR19LRVlTLCBhdHRyaWJ1dGVNYXBwaW5nS2V5KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFMTE9XRURfQVRUUklCVVRFX01BUFBJTkdfS0VZUyA9CisJCW5ldyBTdHJpbmdbXSB7CisJCQlNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksCisJCQlNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZCisJCX07Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRlZElkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWNkNTgzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKKworCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbWJlZGRlZElkTWFwcGluZworCWV4dGVuZHMgQWJzdHJhY3RKYXZhQmFzZUVtYmVkZGVkTWFwcGluZzxFbWJlZGRlZElkQW5ub3RhdGlvbj4KKwlpbXBsZW1lbnRzIEphdmFFbWJlZGRlZElkTWFwcGluZworeworCisJcHVibGljIEdlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJLy8qKioqKioqKioqKioqKioqKiogSmF2YUF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNJZE1hcHBpbmcoKSB7CisJCXJldHVybiB0cnVlOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOTdmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuSnBhRmFjdG9yeTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nPEVtYmVkZGVkQW5ub3RhdGlvbj4KKwlpbXBsZW1lbnRzIEphdmFFbWJlZGRlZE1hcHBpbmcyXzAKK3sKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKKworCXB1YmxpYyBHZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyID0gKChKcGFGYWN0b3J5Ml8wKSB0aGlzLmdldEpwYUZhY3RvcnkoKSkuYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcih0aGlzLCBuZXcgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lck93bmVyKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisJCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHBvc3RVcGRhdGUoKSB7CisJCXN1cGVyLnBvc3RVcGRhdGUoKTsKKwkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLnBvc3RVcGRhdGUoKTsKKwl9CisJCisJLy8qKioqKioqKioqKioqKioqKiogSmF2YUF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwkvL29ubHkgcHV0dGluZyB0aGlzIGluIEVtYmVkZGVkTWFwcGluZyBzaW5jZSByZWxhdGlvbnNoaXAgbWFwcGluZ3MKKwkvL2RlZmluZWQgd2l0aGluIGFuIGVtYmVkZGVkIGlkIGNsYXNzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSAyLjAgc3BlYy4KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhbGxNYXBwaW5nTmFtZXMoKSB7CisJCWlmIChnZXRKcGFQbGF0Zm9ybVZlcnNpb24oKS5pc0NvbXBhdGlibGVXaXRoSnBhVmVyc2lvbihKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzJfMCkpIHsKKwkJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPigKKwkJCQlnZXROYW1lKCksCisJCQkJZW1iZWRkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpCisJCQkpOworCQl9CisJCXJldHVybiBzdXBlci5hbGxNYXBwaW5nTmFtZXMoKTsKKwl9CisJCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gZW1iZWRkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPigKKwkJCW5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KAorCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhdG9yPFN0cmluZz4+KHRoaXMuZW1iZWRkYWJsZUF0dHJpYnV0ZU1hcHBpbmdzKCkpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHRyYW5zZm9ybShBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcpIHsKKwkJCQkJCXJldHVybiBtYXBwaW5nLmFsbE1hcHBpbmdOYW1lcygpOworCQkJCQl9CisJCQkJfQorCQkJKQorCQkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpICsgJy4nICsgbmV4dDsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQXR0cmlidXRlTWFwcGluZyByZXNvbHZlQXR0cmlidXRlTWFwcGluZyhTdHJpbmcgbmFtZSkgeworCQlBdHRyaWJ1dGVNYXBwaW5nIHJlc29sdmVkTWFwcGluZyA9IHN1cGVyLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKG5hbWUpOworCQlpZiAocmVzb2x2ZWRNYXBwaW5nICE9IG51bGwpIHsKKwkJCXJldHVybiByZXNvbHZlZE1hcHBpbmc7CisJCX0KKwkJaWYgKGdldEpwYVBsYXRmb3JtVmVyc2lvbigpLmlzQ29tcGF0aWJsZVdpdGhKcGFWZXJzaW9uKEpwdENvcmVQbHVnaW4uSlBBX0ZBQ0VUX1ZFUlNJT05fMl8wKSkgeworCQkJaW50IGRvdEluZGV4ID0gbmFtZS5pbmRleE9mKCcuJyk7CisJCQlpZiAoZG90SW5kZXggIT0gLTEpIHsKKwkJCQlpZiAoZ2V0TmFtZSgpLmVxdWFscyhuYW1lLnN1YnN0cmluZygwLCBkb3RJbmRleCkpKSB7CisJCQkJCWZvciAoQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5ncygpKSkgeworCQkJCQkJcmVzb2x2ZWRNYXBwaW5nID0gYXR0cmlidXRlTWFwcGluZy5yZXNvbHZlQXR0cmlidXRlTWFwcGluZyhuYW1lLnN1YnN0cmluZyhkb3RJbmRleCArIDEpKTsKKwkJCQkJCWlmIChyZXNvbHZlZE1hcHBpbmcgIT0gbnVsbCkgeworCQkJCQkJCXJldHVybiByZXNvbHZlZE1hcHBpbmc7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcmVzb2x2ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworCQlpZiAoZ2V0SnBhUGxhdGZvcm1WZXJzaW9uKCkuaXNDb21wYXRpYmxlV2l0aEpwYVZlcnNpb24oSnB0Q29yZVBsdWdpbi5KUEFfRkFDRVRfVkVSU0lPTl8yXzApKSB7CisJCQlpbnQgZG90SW5kZXggPSBhdHRyaWJ1dGVOYW1lLmluZGV4T2YoJy4nKTsKKwkJCWlmIChkb3RJbmRleCAhPSAtMSkgeworCQkJCWlmIChnZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZU5hbWUuc3Vic3RyaW5nKDAsIGRvdEluZGV4KSkpIHsKKwkJCQkJYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWUuc3Vic3RyaW5nKGRvdEluZGV4ICsgMSk7CisJCQkJCUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUgPSBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZU5hbWVkKGF0dHJpYnV0ZU5hbWUpOworCQkJCQlpZiAob3ZlcnJpZGUgIT0gbnVsbCAmJiAhb3ZlcnJpZGUuaXNWaXJ0dWFsKCkpIHsKKwkJCQkJCXJldHVybiBvdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwkJCQkJfQorCQkJCQlpZiAodGhpcy5nZXRFbWJlZGRhYmxlKCkgPT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQkJcmV0dXJuIHRoaXMuZ2V0RW1iZWRkYWJsZSgpLnJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoYXR0cmlidXRlTmFtZSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvLyoqKioqKioqKioqKioqKioqKiBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nW10gYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgeworCQlpZiAoZ2V0SnBhUGxhdGZvcm1WZXJzaW9uKCkuaXNDb21wYXRpYmxlV2l0aEpwYVZlcnNpb24oSnB0Q29yZVBsdWdpbi5KUEFfRkFDRVRfVkVSU0lPTl8yXzApKSB7CisJCQlyZXR1cm4gQXJyYXlUb29scy5hZGRBbGwoCisJCQkJc3VwZXIuYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCisJCQkJSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLAorCQkJCUpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQkJfQorCQlyZXR1cm4gc3VwZXIuYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCk7CisJfQorCQorCQorCS8vKioqKioqKioqKioqKioqKioqIGFzc29jaWF0aW9uIG92ZXJyaWRlcyAtIDIuMCBzdXBwb3J0cyB0aGlzICoqKioqKioqKioqKioqKioqKioKKworCXB1YmxpYyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkgeworCQlyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworCX0KKworCQorCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQkKKwkJcmVzdWx0ID0gZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvLyAqKioqKioqKioqIGFzc29jaWF0aW9uIG92ZXJyaWRlIGNvbnRhaW5lciBvd25lciAqKioqKioqKioqCisKKwljbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyT3duZXIgaW1wbGVtZW50cyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyIHsKKwkJCisJCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCkgeworCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nLnRoaXMuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpOworCQl9CisJCQorCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcudGhpcy5nZXRUeXBlTWFwcGluZygpOworCQl9CisKKwkJcHVibGljIFJlbGF0aW9uc2hpcFJlZmVyZW5jZSByZXNvbHZlUmVsYXRpb25zaGlwUmVmZXJlbmNlKFN0cmluZyBhc3NvY2lhdGlvbk92ZXJyaWRlTmFtZSkgeworCQkJVHlwZU1hcHBpbmcgb3ZlcnJpZGFibGVUeXBlTWFwcGluZyA9IGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKKwkJCVJlbGF0aW9uc2hpcFJlZmVyZW5jZSByZWxhdGlvbnNoaXBSZWZlcmVuY2UgPSBudWxsOworCQkJaWYgKG92ZXJyaWRhYmxlVHlwZU1hcHBpbmcgIT0gbnVsbCkgeworCQkJCWZvciAoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3ZlcnJpZGFibGVUeXBlTWFwcGluZy5pbmhlcml0YW5jZUhpZXJhcmNoeSgpKSkgeworCQkJCQlyZWxhdGlvbnNoaXBSZWZlcmVuY2UgPSB0eXBlTWFwcGluZy5yZXNvbHZlUmVsYXRpb25zaGlwUmVmZXJlbmNlKGFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lKTsKKwkJCQkJaWYgKHJlbGF0aW9uc2hpcFJlZmVyZW5jZSAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gcmVsYXRpb25zaGlwUmVmZXJlbmNlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjdkMWMxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW50aXR5LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLkpwYUZhY3RvcnkyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVudGl0eQorCWV4dGVuZHMgQWJzdHJhY3RKYXZhRW50aXR5Cit7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFDYWNoZWFibGUyXzAgY2FjaGVhYmxlOworCisJcHVibGljIEdlbmVyaWNKYXZhRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5jYWNoZWFibGUgPSAoKEpwYUZhY3RvcnkyXzApIHRoaXMuZ2V0SnBhRmFjdG9yeSgpKS5idWlsZEphdmFDYWNoZWFibGUodGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgeworCQlzdXBlci5pbml0aWFsaXplKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOworCQl0aGlzLmNhY2hlYWJsZS5pbml0aWFsaXplKHJlc291cmNlUGVyc2lzdGVudFR5cGUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgeworCQlzdXBlci51cGRhdGUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7CisJCXRoaXMuY2FjaGVhYmxlLnVwZGF0ZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKKwl9CisJCisJLy8qKioqKioqKioqKioqKioqKiogRW50aXR5Ml8wIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioKKworCXB1YmxpYyBKYXZhQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuY2FjaGVhYmxlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgewkJCisJCUNhY2hlYWJsZUhvbGRlcjJfMCBwYXJlbnRFbnRpdHkgPSAoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRQYXJlbnRFbnRpdHkoKTsKKwkJaWYgKHBhcmVudEVudGl0eSAhPSBudWxsKSB7CisJCQlyZXR1cm4gcGFyZW50RW50aXR5LmdldENhY2hlYWJsZSgpLmlzQ2FjaGVhYmxlKCk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOy8vKChQZXJzaXN0ZW5jZVVuaXQyXzApIGdldFBlcnNpc3RlbmNlVW5pdCgpKS5jYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnVtZXJhdGVkQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnVtZXJhdGVkQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljMDNjMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnVtVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW51bWVyYXRlZENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIKK3sKKwlwcml2YXRlIEVudW1UeXBlIHNwZWNpZmllZEVudW1UeXBlOworCQorCXByaXZhdGUgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbmNlQXR0cmlidXRlOworCQorCXB1YmxpYyBHZW5lcmljSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5pbml0aWFsaXplKGpycGEpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoSmF2YUF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIENvbnZlcnRlci5FTlVNRVJBVEVEX0NPTlZFUlRFUjsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkVG9SZXNvdXJjZU1vZGVsKCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVuY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW5jZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bVR5cGUoKSB7CisJCXJldHVybiBnZXRTcGVjaWZpZWRFbnVtVHlwZSgpID09IG51bGwgPyBnZXREZWZhdWx0RW51bVR5cGUoKSA6IGdldFNwZWNpZmllZEVudW1UeXBlKCk7CisJfQorCQorCXB1YmxpYyBFbnVtVHlwZSBnZXREZWZhdWx0RW51bVR5cGUoKSB7CisJCXJldHVybiBFbnVtZXJhdGVkQ29udmVydGVyLkRFRkFVTFRfRU5VTV9UWVBFOworCX0KKwkKKwlwdWJsaWMgRW51bVR5cGUgZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEVudW1UeXBlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZSBuZXdTcGVjaWZpZWRFbnVtVHlwZSkgeworCQlFbnVtVHlwZSBvbGRTcGVjaWZpZWRFbnVtVHlwZSA9IHRoaXMuc3BlY2lmaWVkRW51bVR5cGU7CisJCXRoaXMuc3BlY2lmaWVkRW51bVR5cGUgPSBuZXdTcGVjaWZpZWRFbnVtVHlwZTsKKwkJdGhpcy5nZXRSZXNvdXJjZUVudW1lcmF0ZWQoKS5zZXRWYWx1ZShFbnVtVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZEVudW1UeXBlKSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRW51bWVyYXRlZENvbnZlcnRlci5TUEVDSUZJRURfRU5VTV9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRFbnVtVHlwZSwgbmV3U3BlY2lmaWVkRW51bVR5cGUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEVudW1UeXBlXyhFbnVtVHlwZSBuZXdTcGVjaWZpZWRFbnVtVHlwZSkgeworCQlFbnVtVHlwZSBvbGRTcGVjaWZpZWRFbnVtVHlwZSA9IHRoaXMuc3BlY2lmaWVkRW51bVR5cGU7CisJCXRoaXMuc3BlY2lmaWVkRW51bVR5cGUgPSBuZXdTcGVjaWZpZWRFbnVtVHlwZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChFbnVtZXJhdGVkQ29udmVydGVyLlNQRUNJRklFRF9FTlVNX1RZUEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZEVudW1UeXBlLCBuZXdTcGVjaWZpZWRFbnVtVHlwZSk7CisJfQorCisJcHJvdGVjdGVkIEVudW1lcmF0ZWRBbm5vdGF0aW9uIGdldFJlc291cmNlRW51bWVyYXRlZCgpIHsKKwkJcmV0dXJuIChFbnVtZXJhdGVkQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbmNlQXR0cmlidXRlLgorCQkJCWdldEFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW5jZUF0dHJpYnV0ZSA9IGpycGE7CisJCXRoaXMuc3BlY2lmaWVkRW51bVR5cGUgPSB0aGlzLnNwZWNpZmllZEVudW1UeXBlKGdldFJlc291cmNlRW51bWVyYXRlZCgpKTsKKwl9CQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbmNlQXR0cmlidXRlID0ganJwYTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRFbnVtVHlwZV8odGhpcy5zcGVjaWZpZWRFbnVtVHlwZShnZXRSZXNvdXJjZUVudW1lcmF0ZWQoKSkpOworCX0JCisJCisJcHJvdGVjdGVkIEVudW1UeXBlIHNwZWNpZmllZEVudW1UeXBlKEVudW1lcmF0ZWRBbm5vdGF0aW9uIHJlc291cmNlRW51bWVyYXRlZCkgeworCQlyZXR1cm4gcmVzb3VyY2VFbnVtZXJhdGVkID09IG51bGwgPyBudWxsIDogRW51bVR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKHJlc291cmNlRW51bWVyYXRlZC5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VFbnVtZXJhdGVkKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUdlbmVyYXRlZFZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFHZW5lcmF0ZWRWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMjRlYTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFHZW5lcmF0ZWRWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0ZWRWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhR2VuZXJhdGVkVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUdlbmVyYXRlZFZhbHVlCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgSmF2YUdlbmVyYXRlZFZhbHVlCit7CisJcHJpdmF0ZSBHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gcmVzb3VyY2VHZW5lcmF0ZWRWYWx1ZTsKKworCXByaXZhdGUgR2VuZXJhdGlvblR5cGUgc3BlY2lmaWVkU3RyYXRlZ3k7CisKKwlwcml2YXRlIFN0cmluZyBzcGVjaWZpZWRHZW5lcmF0b3I7CisKKwkvLyBhbHdheXMgbnVsbD8KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0R2VuZXJhdG9yID0gbnVsbDsKKwkKKworCXB1YmxpYyBHZW5lcmljSmF2YUdlbmVyYXRlZFZhbHVlKEphdmFJZE1hcHBpbmcgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSB7CisJCXRoaXMucmVzb3VyY2VHZW5lcmF0ZWRWYWx1ZSA9IGdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKKwkJdGhpcy5zcGVjaWZpZWRTdHJhdGVneSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRTdHJhdGVneSgpOworCQl0aGlzLnNwZWNpZmllZEdlbmVyYXRvciA9IGdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5nZXRHZW5lcmF0b3IoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RyYXRlZ3kgKioqKioqKioqKgorCisJcHVibGljIEdlbmVyYXRpb25UeXBlIGdldFN0cmF0ZWd5KCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkU3RyYXRlZ3kgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFN0cmF0ZWd5IDogdGhpcy5nZXREZWZhdWx0U3RyYXRlZ3koKTsKKwl9CisKKwlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0RGVmYXVsdFN0cmF0ZWd5KCkgeworCQlyZXR1cm4gR2VuZXJhdGVkVmFsdWUuREVGQVVMVF9TVFJBVEVHWTsKKwl9CisJCisJcHVibGljIEdlbmVyYXRpb25UeXBlIGdldFNwZWNpZmllZFN0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTdHJhdGVneTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSkgeworCQlHZW5lcmF0aW9uVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZFN0cmF0ZWd5OworCQl0aGlzLnNwZWNpZmllZFN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisJCXRoaXMucmVzb3VyY2VHZW5lcmF0ZWRWYWx1ZS5zZXRTdHJhdGVneShHZW5lcmF0aW9uVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKHN0cmF0ZWd5KSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU1RSQVRFR1lfUFJPUEVSVFksIG9sZCwgc3RyYXRlZ3kpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFN0cmF0ZWd5XyhHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSkgeworCQlHZW5lcmF0aW9uVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZFN0cmF0ZWd5OworCQl0aGlzLnNwZWNpZmllZFN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU1RSQVRFR1lfUFJPUEVSVFksIG9sZCwgc3RyYXRlZ3kpOworCX0KKworCisJLy8gKioqKioqKioqKiBnZW5lcmF0b3IgKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRHZW5lcmF0b3IoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRHZW5lcmF0b3IgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZEdlbmVyYXRvciA6IHRoaXMuZGVmYXVsdEdlbmVyYXRvcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRHZW5lcmF0b3IoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRHZW5lcmF0b3I7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRHZW5lcmF0b3I7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkR2VuZXJhdG9yKFN0cmluZyBnZW5lcmF0b3IpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkR2VuZXJhdG9yOworCQl0aGlzLnNwZWNpZmllZEdlbmVyYXRvciA9IGdlbmVyYXRvcjsKKwkJdGhpcy5yZXNvdXJjZUdlbmVyYXRlZFZhbHVlLnNldEdlbmVyYXRvcihnZW5lcmF0b3IpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkLCBnZW5lcmF0b3IpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEdlbmVyYXRvcl8oU3RyaW5nIGdlbmVyYXRvcikgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRHZW5lcmF0b3I7CisJCXRoaXMuc3BlY2lmaWVkR2VuZXJhdG9yID0gZ2VuZXJhdG9yOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkLCBnZW5lcmF0b3IpOworCX0KKwkKKworCS8vICoqKioqKioqKiogdGV4dCByYW5nZXMgKioqKioqKioqKgorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlR2VuZXJhdGVkVmFsdWUuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlR2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKworCisJLy8gKioqKioqKioqKiBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJaWYgKHRoaXMuZ2VuZXJhdG9yVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7CisJCQlyZXR1cm4gdGhpcy5qYXZhQ2FuZGlkYXRlR2VuZXJhdG9yTmFtZXMoZmlsdGVyKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0b3JUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlR2VuZXJhdGVkVmFsdWUuZ2VuZXJhdG9yVG91Y2hlcyhwb3MsIGFzdFJvb3QpOworCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGphdmFDYW5kaWRhdGVHZW5lcmF0b3JOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKKwkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmNhbmRpZGF0ZUdlbmVyYXRvck5hbWVzKGZpbHRlcikpOworCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZUdlbmVyYXRvck5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgeworCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPih0aGlzLmNhbmRpZGF0ZUdlbmVyYXRvck5hbWVzKCksIGZpbHRlcik7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlR2VuZXJhdG9yTmFtZXMoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxHZW5lcmF0b3IsIFN0cmluZz4odGhpcy5jYW5kaWRhdGVHZW5lcmF0b3JzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oR2VuZXJhdG9yIGdlbmVyYXRvcikgeworCQkJCXJldHVybiBnZW5lcmF0b3IuZ2V0TmFtZSgpOworCQkJfQorCQl9OworCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxHZW5lcmF0b3I+IGNhbmRpZGF0ZUdlbmVyYXRvcnMoKSB7CisJCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdlbmVyYXRvcnMoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCisJCVN0cmluZyBnZW5lcmF0b3IgPSB0aGlzLmdldEdlbmVyYXRvcigpOworCQlpZiAoZ2VuZXJhdG9yID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCWZvciAoSXRlcmF0b3I8R2VuZXJhdG9yPiBzdHJlYW0gPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdlbmVyYXRvcnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlpZiAoZ2VuZXJhdG9yLmVxdWFscyhzdHJlYW0ubmV4dCgpLmdldE5hbWUoKSkpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQltZXNzYWdlcy5hZGQoCisJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5JRF9NQVBQSU5HX1VOUkVTT0xWRURfR0VORVJBVE9SX05BTUUsCisJCQkJbmV3IFN0cmluZ1tdIHtnZW5lcmF0b3J9LAorCQkJCXRoaXMuZ2V0UGFyZW50KCksCisJCQkJdGhpcy5nZXRHZW5lcmF0b3JUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCSkKKwkJKTsKKwl9CisKKworCS8vICoqKioqKioqKiogdXBkYXRlIGZyb20gcmVzb3VyY2UgbW9kZWwgKioqKioqKioqKgorCisJcHVibGljIHZvaWQgdXBkYXRlKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24pIHsKKwkJdGhpcy5yZXNvdXJjZUdlbmVyYXRlZFZhbHVlID0gZ2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uOworCQl0aGlzLnNldFNwZWNpZmllZFN0cmF0ZWd5Xyh0aGlzLmJ1aWxkU3BlY2lmaWVkU3RyYXRlZ3koKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkR2VuZXJhdG9yXyhnZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uZ2V0R2VuZXJhdG9yKCkpOworCX0KKworCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBidWlsZFNwZWNpZmllZFN0cmF0ZWd5KCkgeworCQlyZXR1cm4gR2VuZXJhdGlvblR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKHRoaXMucmVzb3VyY2VHZW5lcmF0ZWRWYWx1ZS5nZXRTdHJhdGVneSgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUdlbmVyYXRvckNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhR2VuZXJhdG9yQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0NTg2YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUdlbmVyYXRvckNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsMjcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRvckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhR2VuZXJhdG9yQ29udGFpbmVyIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIEphdmFHZW5lcmF0b3JDb250YWluZXIKK3sKKwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworCisJcHJvdGVjdGVkIEphdmFTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjsKKworCXByb3RlY3RlZCBKYXZhVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3I7CisJCisJcHVibGljIEdlbmVyaWNKYXZhR2VuZXJhdG9yQ29udGFpbmVyKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUpwYUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChKYXZhSnBhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgSmF2YVRhYmxlR2VuZXJhdG9yIGFkZFRhYmxlR2VuZXJhdG9yKCkgeworCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0YWJsZUdlbmVyYXRvciBhbHJlYWR5IGV4aXN0cyIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJdGhpcy50YWJsZUdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFUYWJsZUdlbmVyYXRvcih0aGlzKTsKKwkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSAKKwkJCQkoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuCisJCQkJCWFkZEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCXRoaXMudGFibGVHZW5lcmF0b3IuaW5pdGlhbGl6ZSh0YWJsZUdlbmVyYXRvclJlc291cmNlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChUQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFksIG51bGwsIHRoaXMudGFibGVHZW5lcmF0b3IpOworCQlyZXR1cm4gdGhpcy50YWJsZUdlbmVyYXRvcjsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlVGFibGVHZW5lcmF0b3IoKSB7CisJCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRhYmxlR2VuZXJhdG9yIGRvZXMgbm90IGV4aXN0LCBjYW5ub3QgYmUgcmVtb3ZlZCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJSmF2YVRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGhpcy50YWJsZUdlbmVyYXRvcjsKKwkJdGhpcy50YWJsZUdlbmVyYXRvciA9IG51bGw7CisJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5yZW1vdmVBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkVGFibGVHZW5lcmF0b3IsIG51bGwpOworCX0KKwkKKwlwdWJsaWMgSmF2YVRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gdGhpcy50YWJsZUdlbmVyYXRvcjsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0VGFibGVHZW5lcmF0b3IoSmF2YVRhYmxlR2VuZXJhdG9yIG5ld1RhYmxlR2VuZXJhdG9yKSB7CisJCUphdmFUYWJsZUdlbmVyYXRvciBvbGRUYWJsZUdlbmVyYXRvciA9IHRoaXMudGFibGVHZW5lcmF0b3I7CisJCXRoaXMudGFibGVHZW5lcmF0b3IgPSBuZXdUYWJsZUdlbmVyYXRvcjsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChUQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZFRhYmxlR2VuZXJhdG9yLCBuZXdUYWJsZUdlbmVyYXRvcik7CisJfQorCisJcHVibGljIEphdmFTZXF1ZW5jZUdlbmVyYXRvciBhZGRTZXF1ZW5jZUdlbmVyYXRvcigpIHsKKwkJaWYgKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2VxdWVuY2VHZW5lcmF0b3IgYWxyZWFkeSBleGlzdHMiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhU2VxdWVuY2VHZW5lcmF0b3IodGhpcyk7CisJCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gCisJCQkJKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLgorCQkJCQlhZGRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yLmluaXRpYWxpemUoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VRVUVOQ0VfR0VORVJBVE9SX1BST1BFUlRZLCBudWxsLCB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yKTsKKwkJcmV0dXJuIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3I7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCkgeworCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZXF1ZW5jZUdlbmVyYXRvciBkb2VzIG5vdCBleGlzdCwgY2Fubm90IGJlIHJlbW92ZWQiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCUphdmFTZXF1ZW5jZUdlbmVyYXRvciBvbGRTZXF1ZW5jZUdlbmVyYXRvciA9IHRoaXMuc2VxdWVuY2VHZW5lcmF0b3I7CisJCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBudWxsOworCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIucmVtb3ZlQW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZFNlcXVlbmNlR2VuZXJhdG9yLG51bGwpOworCX0KKwkKKwlwdWJsaWMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTZXF1ZW5jZUdlbmVyYXRvcihKYXZhU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IpIHsKKwkJSmF2YVNlcXVlbmNlR2VuZXJhdG9yIG9sZFNlcXVlbmNlR2VuZXJhdG9yID0gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKKwkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IG5ld1NlcXVlbmNlR2VuZXJhdG9yOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkU2VxdWVuY2VHZW5lcmF0b3IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yKTsKKwl9CisJCisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKKwkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyID0ganJwbTsKKwkJdGhpcy5pbml0aWFsaXplVGFibGVHZW5lcmF0b3IoKTsKKwkJdGhpcy5pbml0aWFsaXplU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlR2VuZXJhdG9yKCkgeworCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFJlc291cmNlVGFibGVHZW5lcmF0b3IoKTsKKwkJaWYgKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgIT0gbnVsbCkgeworCQkJdGhpcy50YWJsZUdlbmVyYXRvciA9IGJ1aWxkVGFibGVHZW5lcmF0b3IodGFibGVHZW5lcmF0b3JSZXNvdXJjZSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9yKCkgeworCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJaWYgKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgIT0gbnVsbCkgeworCQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3Ioc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqcnBtKSB7CisJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciA9IGpycG07CisJCXRoaXMudXBkYXRlVGFibGVHZW5lcmF0b3IoKTsKKwkJdGhpcy51cGRhdGVTZXF1ZW5jZUdlbmVyYXRvcigpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYWJsZUdlbmVyYXRvcigpIHsKKwkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRSZXNvdXJjZVRhYmxlR2VuZXJhdG9yKCk7CisJCWlmICh0YWJsZUdlbmVyYXRvclJlc291cmNlID09IG51bGwpIHsKKwkJCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKKwkJCQlzZXRUYWJsZUdlbmVyYXRvcihudWxsKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpIHsKKwkJCQlzZXRUYWJsZUdlbmVyYXRvcihidWlsZFRhYmxlR2VuZXJhdG9yKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWdldFRhYmxlR2VuZXJhdG9yKCkudXBkYXRlKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpOworCQkJfQorCQl9CisJfQorCQorCXByb3RlY3RlZCBKYXZhVGFibGVHZW5lcmF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvcihUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JSZXNvdXJjZSkgeworCQlKYXZhVGFibGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVRhYmxlR2VuZXJhdG9yKHRoaXMpOworCQlnZW5lcmF0b3IuaW5pdGlhbGl6ZSh0YWJsZUdlbmVyYXRvclJlc291cmNlKTsKKwkJcmV0dXJuIGdlbmVyYXRvcjsKKwl9CisJCisJcHJvdGVjdGVkIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZXRSZXNvdXJjZVRhYmxlR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLgorCQkJCWdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VxdWVuY2VHZW5lcmF0b3IoKSB7CisJCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gZ2V0UmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcigpOworCQlpZiAoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9PSBudWxsKSB7CisJCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSB7CisJCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IobnVsbCk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSB7CisJCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlnZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnVwZGF0ZShzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3IoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UpIHsKKwkJSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFTZXF1ZW5jZUdlbmVyYXRvcih0aGlzKTsKKwkJZ2VuZXJhdG9yLmluaXRpYWxpemUoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSk7CisJCXJldHVybiBnZW5lcmF0b3I7CisJfQorCQorCXByb3RlY3RlZCBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gZ2V0UmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci4KKwkJCQlnZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCX0KKwkKKwkKKwkvLyoqKioqKioqKioqKioqKioqKioqIENvZGUgQ29tcGxldGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJaWYgKHRoaXMuZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7CisJCQlyZXN1bHQgPSB0aGlzLmdldFRhYmxlR2VuZXJhdG9yKCkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlpZiAodGhpcy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKKwkJCXJlc3VsdCA9IHRoaXMuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvLyoqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXRoaXMudmFsaWRhdGVHZW5lcmF0b3JzKG1lc3NhZ2VzLCBhc3RSb290KTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVHZW5lcmF0b3JzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlmb3IgKEl0ZXJhdG9yPEphdmFHZW5lcmF0b3I+IGxvY2FsR2VuZXJhdG9ycyA9IHRoaXMuZ2VuZXJhdG9ycygpOyBsb2NhbEdlbmVyYXRvcnMuaGFzTmV4dCgpOyApIHsKKwkJCUphdmFHZW5lcmF0b3IgbG9jYWxHZW5lcmF0b3IgPSBsb2NhbEdlbmVyYXRvcnMubmV4dCgpOworCQkJZm9yIChJdGVyYXRvcjxHZW5lcmF0b3I+IGdsb2JhbEdlbmVyYXRvcnMgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdlbmVyYXRvcnMoKTsgZ2xvYmFsR2VuZXJhdG9ycy5oYXNOZXh0KCk7ICkgeworCQkJCWlmIChsb2NhbEdlbmVyYXRvci5kdXBsaWNhdGVzKGdsb2JhbEdlbmVyYXRvcnMubmV4dCgpKSkgeworCQkJCQltZXNzYWdlcy5hZGQoCisJCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5HRU5FUkFUT1JfRFVQTElDQVRFX05BTUUsCisJCQkJCQkJbmV3IFN0cmluZ1tdIHtsb2NhbEdlbmVyYXRvci5nZXROYW1lKCl9LAorCQkJCQkJCWxvY2FsR2VuZXJhdG9yLAorCQkJCQkJCWxvY2FsR2VuZXJhdG9yLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkJCSkKKwkJCQkJKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgZmluYWwgSXRlcmF0b3I8SmF2YUdlbmVyYXRvcj4gZ2VuZXJhdG9ycygpIHsKKwkJQXJyYXlMaXN0PEphdmFHZW5lcmF0b3I+IGdlbmVyYXRvcnMgPSBuZXcgQXJyYXlMaXN0PEphdmFHZW5lcmF0b3I+KCk7CisJCXRoaXMuYWRkR2VuZXJhdG9yc1RvKGdlbmVyYXRvcnMpOworCQlyZXR1cm4gZ2VuZXJhdG9ycy5pdGVyYXRvcigpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZEdlbmVyYXRvcnNUbyhBcnJheUxpc3Q8SmF2YUdlbmVyYXRvcj4gZ2VuZXJhdG9ycykgeworCQlpZiAodGhpcy5zZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKSB7CisJCQlnZW5lcmF0b3JzLmFkZCh0aGlzLnNlcXVlbmNlR2VuZXJhdG9yKTsKKwkJfQorCQlpZiAodGhpcy50YWJsZUdlbmVyYXRvciAhPSBudWxsKSB7CisJCQlnZW5lcmF0b3JzLmFkZCh0aGlzLnRhYmxlR2VuZXJhdG9yKTsKKwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLmdldFRleHRSYW5nZShhc3RSb290KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUlkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSWRNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2MjBjNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUlkTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUlkTWFwcGluZzsKKworCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFJZE1hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0SmF2YUlkTWFwcGluZworewkKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFJZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luQ29sdW1uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwMGY5NQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUpvaW5Db2x1bW4uamF2YQpAQCAtMCwwICsxLDI0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUJhc2VDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUpvaW5Db2x1bW4gZXh0ZW5kcyBBYnN0cmFjdEphdmFCYXNlQ29sdW1uPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbXBsZW1lbnRzIEphdmFKb2luQ29sdW1uCit7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCisJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7CisKKwlwcm90ZWN0ZWQgSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbjsKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFKb2luQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFKb2luQ29sdW1uLk93bmVyIG93bmVyKSB7CisJCXN1cGVyKHBhcmVudCwgb3duZXIpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBKb2luQ29sdW1uQW5ub3RhdGlvbiBnZXRSZXNvdXJjZUNvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbjsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID09IG51bGwpID8gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgOiB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgeworCQlTdHJpbmcgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7CisJCXRoaXMuam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUpvaW5Db2x1bW4uU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgeworCQlTdHJpbmcgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZUpvaW5Db2x1bW4uU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5ld0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgeworCQlTdHJpbmcgb2xkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7CisJCXRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJhc2VKb2luQ29sdW1uLkRFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdEZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUpOworCX0KKworCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFKb2luQ29sdW1uLk93bmVyIGdldE93bmVyKCkgeworCQlyZXR1cm4gKEphdmFKb2luQ29sdW1uLk93bmVyKSBzdXBlci5nZXRPd25lcigpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKKwkJcmV0dXJuIGdldE93bmVyKCkuaXNWaXJ0dWFsKHRoaXMpOworCX0KKworCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpIHsKKwkJcmV0dXJuIGdldE93bmVyKCkuZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKTsKKwl9CisKKwlwdWJsaWMgQ29sdW1uIGdldFJlZmVyZW5jZWREYkNvbHVtbigpIHsKKwkJVGFibGUgdGFibGUgPSB0aGlzLmdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCk7CisJCXJldHVybiAodGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcih0aGlzLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHRhYmxlSXNBbGxvd2VkKCkgeworCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLnRhYmxlSXNBbGxvd2VkKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBnZXRSZXNvdXJjZUNvbHVtbigpLnJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5jb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlpZiAodGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMocG9zLCBhc3RSb290KSkgeworCQkJcmV0dXJuIHRoaXMuamF2YUNhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcyhmaWx0ZXIpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgeworCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKHRoaXMuY2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKGZpbHRlcikpOworCX0KKworCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKCksIGZpbHRlcik7CisJfQorCisJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcygpIHsKKwkJVGFibGUgdGFibGUgPSB0aGlzLmdldE93bmVyKCkuZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKTsKKwkJcmV0dXJuICh0YWJsZSAhPSBudWxsKSA/IHRhYmxlLnNvcnRlZENvbHVtbklkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+IGluc3RhbmNlKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSB7CisJCXJldHVybiBnZXRSZWZlcmVuY2VkRGJDb2x1bW4oKSAhPSBudWxsOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IGdldFJlc291cmNlQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7CisJCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogZ2V0T3duZXIoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFubm90YXRpb24pIHsKKwkJdGhpcy5qb2luQ29sdW1uID0gYW5ub3RhdGlvbjsKKwkJc3VwZXIuaW5pdGlhbGl6ZShhbm5vdGF0aW9uKTsKKwkJdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGFubm90YXRpb24uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKKwkJdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLmJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZShKb2luQ29sdW1uQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7CisJCXRoaXMuam9pbkNvbHVtbiA9IGFubm90YXRpb247CisJCXN1cGVyLnVwZGF0ZShhbm5vdGF0aW9uKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8oYW5ub3RhdGlvbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwkJdGhpcy5zZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUodGhpcy5idWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHROYW1lKCkgeworCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pbkNvbHVtbkRlZmF1bHROYW1lKHRoaXMpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pbkNvbHVtbkRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSh0aGlzLmdldE93bmVyKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXZhbGlkYXRlTmFtZShtZXNzYWdlcywgYXN0Um9vdCk7CisJCXZhbGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWUobWVzc2FnZXMsIGFzdFJvb3QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU5hbWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCWlmICggISB0aGlzLmlzUmVzb2x2ZWQoKSAmJiBnZXREYlRhYmxlKCkgIT0gbnVsbCkgeworCQkJaWYgKGdldE5hbWUoKSAhPSBudWxsKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAorCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sIAorCQkJCQkJdGhpcywKKwkJCQkJCXRoaXMuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KQorCQkJCQkpCisJCQkJKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGdldE93bmVyKCkuam9pbkNvbHVtbnNTaXplKCkgPiAxKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUywKKwkJCQkJCQl0aGlzLAorCQkJCQkJCXRoaXMuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KQorCQkJCQkJKQorCQkJCQkpOworCQkJfQorCQkJLy9JZiB0aGUgbmFtZSBpcyBudWxsIGFuZCB0aGVyZSBpcyBvbmx5IG9uZSBqb2luLWNvbHVtbiwgb25lIG9mIHRoZXNlIHZhbGlkYXRpb24gbWVzc2FnZXMgd2lsbCBhcHBseQorCQkJLy8gMS4gdGFyZ2V0IGVudGl0eSBkb2VzIG5vdCBoYXZlIGEgcHJpbWFyeSBrZXkKKwkJCS8vIDIuIHRhcmdldCBlbnRpdHkgaXMgbm90IHNwZWNpZmllZAorCQkJLy8gMy4gdGFyZ2V0IGVudGl0eSBpcyBub3QgYW4gZW50aXR5CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJaWYgKCAhIHRoaXMuaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSAmJiBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpICE9IG51bGwpIHsKKwkJCWlmIChnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpICE9IG51bGwpIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSwgdGhpcy5nZXROYW1lKCl9LCAKKwkJCQkJCXRoaXMsCisJCQkJCQl0aGlzLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKGFzdFJvb3QpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQkJZWxzZSBpZiAoZ2V0T3duZXIoKS5qb2luQ29sdW1uc1NpemUoKSA+IDEpIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUVfTVVMVElQTEVfSk9JTl9DT0xVTU5TLAorCQkJCQkJCXRoaXMsCisJCQkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpCisJCQkJCQkpCisJCQkJCSk7CisJCQl9CisJCQkvL0lmIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGlzIG51bGwgYW5kIHRoZXJlIGlzIG9ubHkgb25lIGpvaW4tY29sdW1uLCBvbmUgb2YgdGhlc2UgdmFsaWRhdGlvbiBtZXNzYWdlcyB3aWxsIGFwcGx5CisJCQkvLyAxLiB0YXJnZXQgZW50aXR5IGRvZXMgbm90IGhhdmUgYSBwcmltYXJ5IGtleQorCQkJLy8gMi4gdGFyZ2V0IGVudGl0eSBpcyBub3Qgc3BlY2lmaWVkCisJCQkvLyAzLiB0YXJnZXQgZW50aXR5IGlzIG5vdCBhbiBlbnRpdHkKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSm9pblRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjNmODQxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSm9pblRhYmxlLmphdmEKQEAgLTAsMCArMSw3MjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxKb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKKy8qKgorICogSmF2YSBqb2luIHRhYmxlCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUpvaW5UYWJsZQorCWV4dGVuZHMgQWJzdHJhY3RKYXZhVGFibGUKKwlpbXBsZW1lbnRzIEphdmFKb2luVGFibGUKK3sKKworCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbjsKKworCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8SmF2YUpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zID0gbmV3IFZlY3RvcjxKYXZhSm9pbkNvbHVtbj4oKTsKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUpvaW5Db2x1bW4uT3duZXIgam9pbkNvbHVtbk93bmVyOworCisJcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uIGRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKKworCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8SmF2YUpvaW5Db2x1bW4+IHNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyA9IG5ldyBWZWN0b3I8SmF2YUpvaW5Db2x1bW4+KCk7CisJcHJvdGVjdGVkIGZpbmFsIEphdmFKb2luQ29sdW1uLk93bmVyIGludmVyc2VKb2luQ29sdW1uT3duZXI7CisKKworCXB1YmxpYyBHZW5lcmljSmF2YUpvaW5UYWJsZShKYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5IHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmpvaW5Db2x1bW5Pd25lciA9IHRoaXMuYnVpbGRKb2luQ29sdW1uT3duZXIoKTsKKwkJdGhpcy5pbnZlcnNlSm9pbkNvbHVtbk93bmVyID0gdGhpcy5idWlsZEludmVyc2VKb2luQ29sdW1uT3duZXIoKTsKKwl9CisKKwlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4uT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKSB7CisJCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7CisJfQorCisJcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uLk93bmVyIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5Pd25lcigpIHsKKwkJcmV0dXJuIG5ldyBJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCk7CisJfQorCisJcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGUpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZShqb2luVGFibGUpOworCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRKb2luQ29sdW1ucyhqb2luVGFibGUpOworCQl0aGlzLmluaXRpYWxpemVEZWZhdWx0Sm9pbkNvbHVtbihqb2luVGFibGUpOworCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoam9pblRhYmxlKTsKKwkJdGhpcy5pbml0aWFsaXplRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKGpvaW5UYWJsZSk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKEpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlKSB7CisJCXN1cGVyLnVwZGF0ZShqb2luVGFibGUpOworCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKGpvaW5UYWJsZSk7CisJCXRoaXMudXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4oam9pblRhYmxlKTsKKwkJdGhpcy51cGRhdGVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoam9pblRhYmxlKTsKKwkJdGhpcy51cGRhdGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oam9pblRhYmxlKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQWJzdHJhY3RKYXZhVGFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEphdmFKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdE5hbWUoKSB7CisJCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdldEpvaW5UYWJsZURlZmF1bHROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0U2NoZW1hKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDYXRhbG9nKCkgeworCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdENhdGFsb2coKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pblRhYmxlQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRBbm5vdGF0aW9uKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIFRhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBib29sZWFuIGlzUmVzb3VyY2VTcGVjaWZpZWQoKSB7CisJCXJldHVybiB0aGlzLmdldEFubm90YXRpb24oKS5pc1NwZWNpZmllZCgpOworCX0KKworCisJLy8gKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKgorCisJcHVibGljIExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMoKSB7CisJCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkgOiB0aGlzLmRlZmF1bHRKb2luQ29sdW1ucygpOworCX0KKworCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpOworCX0KKworCXB1YmxpYyB2b2lkIGNvbnZlcnREZWZhdWx0VG9TcGVjaWZpZWRKb2luQ29sdW1uKCkgeworCQlNYXBwaW5nVG9vbHMuY29udmVydEpvaW5UYWJsZURlZmF1bHRUb1NwZWNpZmllZEpvaW5Db2x1bW4odGhpcyk7CisJfQorCisJcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uIGJ1aWxkSm9pbkNvbHVtbihKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQW5ub3RhdGlvbikgeworCQlyZXR1cm4gdGhpcy5idWlsZEpvaW5Db2x1bW4oam9pbkNvbHVtbkFubm90YXRpb24sIHRoaXMuam9pbkNvbHVtbk93bmVyKTsKKwl9CisKKworCS8vICoqKioqKioqKiogZGVmYXVsdCBqb2luIGNvbHVtbiAqKioqKioqKioqCisKKwlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRKb2luQ29sdW1uKEphdmFKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uKSB7CisJCUphdmFKb2luQ29sdW1uIG9sZCA9IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47CisJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBkZWZhdWx0Sm9pbkNvbHVtbjsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSk9JTl9DT0xVTU4sIG9sZCwgZGVmYXVsdEpvaW5Db2x1bW4pOworCX0KKworCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGRlZmF1bHRKb2luQ29sdW1ucygpIHsKKwkJaWYgKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPih0aGlzLmRlZmF1bHRKb2luQ29sdW1uKTsKKwkJfQorCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwl9CisKKwlwcm90ZWN0ZWQgaW50IGRlZmF1bHRKb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0Sm9pbkNvbHVtbihKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24pIHsKKwkJaWYgKHRoaXMuc2hvdWxkQnVpbGREZWZhdWx0Sm9pbkNvbHVtbigpKSB7CisJCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gdGhpcy5idWlsZEpvaW5Db2x1bW4obmV3IE51bGxKb2luQ29sdW1uQW5ub3RhdGlvbihqb2luVGFibGVBbm5vdGF0aW9uKSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0Sm9pbkNvbHVtbihKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24pIHsKKwkJaWYgKHRoaXMuc2hvdWxkQnVpbGREZWZhdWx0Sm9pbkNvbHVtbigpKSB7CisJCQlpZiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSB7CisJCQkJdGhpcy5zZXREZWZhdWx0Sm9pbkNvbHVtbih0aGlzLmJ1aWxkSm9pbkNvbHVtbihuZXcgTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uKGpvaW5UYWJsZUFubm90YXRpb24pKSk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4udXBkYXRlKG5ldyBOdWxsSm9pbkNvbHVtbkFubm90YXRpb24oam9pblRhYmxlQW5ub3RhdGlvbikpOworCQkJfQorCQl9IGVsc2UgeworCQkJdGhpcy5zZXREZWZhdWx0Sm9pbkNvbHVtbihudWxsKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEJ1aWxkRGVmYXVsdEpvaW5Db2x1bW4oKSB7CisJCXJldHVybiAhIHRoaXMuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3BlY2lmaWVkIGpvaW4gY29sdW1ucyAqKioqKioqKioqCisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4odGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucyk7CisJfQorCisJcHVibGljIGludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuc2l6ZSgpICE9IDA7CisJfQorCisJcHVibGljIEphdmFKb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCS8vIENsZWFyIG91dCB0aGUgZGVmYXVsdCBub3cgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZCBkdXJpbmcgYW4gdXBkYXRlIGFuZAorCQkvLyBjYXVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBiZSBzZW50IHRvIHRoZSBVSSBpbiB0aGUgd3Jvbmcgb3JkZXIuCisJCS8vIElmIHRoZSBkZWZhdWx0IGlzIGFscmVhZHkgbnVsbCwgbm90aGluZyB3aWxsIGhhcHBlbi4KKwkJSm9pbkNvbHVtbiBvbGREZWZhdWx0ID0gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbjsKKwkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9IG51bGw7CisKKwkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUpvaW5Db2x1bW4odGhpcywgdGhpcy5qb2luQ29sdW1uT3duZXIpOworCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmFkZChpbmRleCwgam9pbkNvbHVtbik7CisJCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IHRoaXMuZ2V0QW5ub3RhdGlvbigpOworCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQW5ub3RhdGlvbiA9IGpvaW5UYWJsZUFubm90YXRpb24uYWRkSm9pbkNvbHVtbihpbmRleCk7CisJCWpvaW5Db2x1bW4uaW5pdGlhbGl6ZShqb2luQ29sdW1uQW5ub3RhdGlvbik7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBqb2luQ29sdW1uKTsKKworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9KT0lOX0NPTFVNTiwgb2xkRGVmYXVsdCwgbnVsbCk7CisJCXJldHVybiBqb2luQ29sdW1uOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4LCBKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJdGhpcy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuc2l6ZSgpLCBqb2luQ29sdW1uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQl0aGlzLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucy5pbmRleE9mKGpvaW5Db2x1bW4pKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgeworCQlKYXZhSm9pbkNvbHVtbiByZW1vdmVkSm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKKwkJaWYgKCAhIHRoaXMuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkgeworCQkJLy9jcmVhdGUgdGhlIGRlZmF1bHRKb2luQ29sdW1uIG5vdyBvciB0aGlzIHdpbGwgaGFwcGVuIGR1cmluZyBwcm9qZWN0IHVwZGF0ZSAKKwkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLiBUaGF0IGNhdXNlcyBwcm9ibGVtcyAKKwkJCS8vaW4gdGhlIFVJIGJlY2F1c2UgdGhlIGNoYW5nZSBub3RpZmljYXRpb25zIGVuZCB1cCBpbiB0aGUgd3Jvbmcgb3JkZXIuCisJCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gdGhpcy5idWlsZEpvaW5Db2x1bW4obmV3IE51bGxKb2luQ29sdW1uQW5ub3RhdGlvbih0aGlzLmdldEFubm90YXRpb24oKSkpOworCQl9CisJCXRoaXMuZ2V0QW5ub3RhdGlvbigpLnJlbW92ZUpvaW5Db2x1bW4oaW5kZXgpOworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCByZW1vdmVkSm9pbkNvbHVtbik7CisJCWlmICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKKwkJCS8vZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIGEgZGVmYXVsdEpvaW5Db2x1bW4gd2FzIGNyZWF0ZWQgYWJvdmUKKwkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0pPSU5fQ09MVU1OLCBudWxsLCB0aGlzLmRlZmF1bHRKb2luQ29sdW1uKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW5fKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3Qoam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucywgU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl0aGlzLmdldEFubm90YXRpb24oKS5tb3ZlSm9pbkNvbHVtbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl0aGlzLmZpcmVJdGVtTW92ZWQoU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCX0KKworCXB1YmxpYyB2b2lkIGNsZWFyU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7CisJCS8vIGZvciBub3csIHdlIGhhdmUgdG8gcmVtb3ZlIGFubm90YXRpb25zIG9uZSBhdCBhIHRpbWUuLi4KKwkJZm9yIChpbnQgaSA9IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuc2l6ZSgpOyBpLS0gPiAwOyApIHsKKwkJCXRoaXMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRKb2luQ29sdW1ucyhKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24pIHsKKwkJZm9yIChMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IHN0cmVhbSA9IGpvaW5UYWJsZUFubm90YXRpb24uam9pbkNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLmFkZCh0aGlzLmJ1aWxkSm9pbkNvbHVtbihzdHJlYW0ubmV4dCgpKSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRKb2luQ29sdW1ucyhKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24pIHsKKwkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1uQW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmpvaW5Db2x1bW5zKCk7CisKKwkJd2hpbGUgKGpvaW5Db2x1bW5zLmhhc05leHQoKSkgeworCQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLm5leHQoKTsKKwkJCWlmIChqb2luQ29sdW1uQW5ub3RhdGlvbnMuaGFzTmV4dCgpKSB7CisJCQkJam9pbkNvbHVtbi51cGRhdGUoam9pbkNvbHVtbkFubm90YXRpb25zLm5leHQoKSk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbl8oam9pbkNvbHVtbik7CisJCQl9CisJCX0KKworCQl3aGlsZSAoam9pbkNvbHVtbkFubm90YXRpb25zLmhhc05leHQoKSkgeworCQkJdGhpcy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKHRoaXMuYnVpbGRKb2luQ29sdW1uKGpvaW5Db2x1bW5Bbm5vdGF0aW9ucy5uZXh0KCkpKTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBpbnZlcnNlIGpvaW4gY29sdW1ucyAqKioqKioqKioqCisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBpbnZlcnNlSm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSA6IHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1ucygpOworCX0KKworCXB1YmxpYyBpbnQgaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uc1NpemUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjb252ZXJ0RGVmYXVsdFRvU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oKSB7CisJCU1hcHBpbmdUb29scy5jb252ZXJ0Sm9pblRhYmxlRGVmYXVsdFRvU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4odGhpcyk7CisJfQorCisJcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbkFubm90YXRpb24pIHsKKwkJcmV0dXJuIHRoaXMuYnVpbGRKb2luQ29sdW1uKGpvaW5Db2x1bW5Bbm5vdGF0aW9uLCB0aGlzLmludmVyc2VKb2luQ29sdW1uT3duZXIpOworCX0KKworCisJLy8gKioqKioqKioqKiBkZWZhdWx0IGludmVyc2Ugam9pbiBjb2x1bW4gKioqKioqKioqKgorCisJcHVibGljIEphdmFKb2luQ29sdW1uIGdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbihKYXZhSm9pbkNvbHVtbiBkZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4pIHsKKwkJSmF2YUpvaW5Db2x1bW4gb2xkID0gdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW47CisJCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gZGVmYXVsdEludmVyc2VKb2luQ29sdW1uOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9JTlZFUlNFX0pPSU5fQ09MVU1OLCBvbGQsIGRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbik7CisJfQorCisJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gZGVmYXVsdEludmVyc2VKb2luQ29sdW1ucygpIHsKKwkJaWYgKHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uICE9IG51bGwpIHsKKwkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4pOworCQl9CisJCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOworCX0KKworCXByb3RlY3RlZCBpbnQgZGVmYXVsdEludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPT0gbnVsbCkgPyAwIDogMTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKEpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbikgeworCQlpZiAodGhpcy5zaG91bGRCdWlsZERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpKSB7CisJCQl0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiA9IHRoaXMuYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihuZXcgTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uKGpvaW5UYWJsZUFubm90YXRpb24pKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEJ1aWxkRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkgeworCQlyZXR1cm4gISB0aGlzLmhhc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbihKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24pIHsKKwkJaWYgKHRoaXMuc2hvdWxkQnVpbGREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSkgeworCQkJaWYgKHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID09IG51bGwpIHsKKwkJCQl0aGlzLnNldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbih0aGlzLmJ1aWxkSW52ZXJzZUpvaW5Db2x1bW4obmV3IE51bGxKb2luQ29sdW1uQW5ub3RhdGlvbihqb2luVGFibGVBbm5vdGF0aW9uKSkpOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbi51cGRhdGUobmV3IE51bGxKb2luQ29sdW1uQW5ub3RhdGlvbihqb2luVGFibGVBbm5vdGF0aW9uKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aGlzLnNldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbihudWxsKTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBzcGVjaWZpZWQgaW52ZXJzZSBqb2luIGNvbHVtbnMgKioqKioqKioqKgorCisJcHVibGljIExpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyk7CisJfQorCisJcHVibGljIGludCBzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMuc2l6ZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLnNpemUoKSAhPSAwOworCX0KKworCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKKwkJLy8gQ2xlYXIgb3V0IHRoZSBkZWZhdWx0IG5vdyBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkIGR1cmluZyBhbiB1cGRhdGUgYW5kCisJCS8vIGNhdXNlIGNoYW5nZSBub3RpZmljYXRpb25zIHRvIGJlIHNlbnQgdG8gdGhlIFVJIGluIHRoZSB3cm9uZyBvcmRlci4KKwkJLy8gSWYgdGhlIGRlZmF1bHQgaXMgYWxyZWFkeSBudWxsLCBub3RoaW5nIHdpbGwgaGFwcGVuLgorCQlKb2luQ29sdW1uIG9sZERlZmF1bHQgPSB0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKKwkJdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPSBudWxsOworCisJCUphdmFKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhSm9pbkNvbHVtbih0aGlzLCB0aGlzLmludmVyc2VKb2luQ29sdW1uT3duZXIpOworCQl0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucy5hZGQoaW5kZXgsIGludmVyc2VKb2luQ29sdW1uKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gdGhpcy5nZXRBbm5vdGF0aW9uKCk7CisJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5Bbm5vdGF0aW9uID0gam9pblRhYmxlQW5ub3RhdGlvbi5hZGRJbnZlcnNlSm9pbkNvbHVtbihpbmRleCk7CisJCWludmVyc2VKb2luQ29sdW1uLmluaXRpYWxpemUoam9pbkNvbHVtbkFubm90YXRpb24pOworCQl0aGlzLmZpcmVJdGVtQWRkZWQoU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBpbnZlcnNlSm9pbkNvbHVtbik7CisKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSU5WRVJTRV9KT0lOX0NPTFVNTiwgb2xkRGVmYXVsdCwgbnVsbCk7CisJCXJldHVybiBpbnZlcnNlSm9pbkNvbHVtbjsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgsIEphdmFKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uKSB7CisJCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgaW52ZXJzZUpvaW5Db2x1bW4sIHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLCBTUEVDSUZJRURfSU5WRVJTRV9KT0lOX0NPTFVNTlNfTElTVCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oSmF2YUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4pIHsKKwkJdGhpcy5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucy5zaXplKCksIGludmVyc2VKb2luQ29sdW1uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uKSB7CisJCXRoaXMucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMuaW5kZXhPZihpbnZlcnNlSm9pbkNvbHVtbikpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCkgeworCQlKYXZhSm9pbkNvbHVtbiByZW1vdmVkSm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7CisJCWlmICggISB0aGlzLmhhc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpKSB7CisJCQkvL2NyZWF0ZSB0aGUgZGVmYXVsdEpvaW5Db2x1bW4gbm93IG9yIHRoaXMgd2lsbCBoYXBwZW4gZHVyaW5nIHByb2plY3QgdXBkYXRlIAorCQkJLy9hZnRlciByZW1vdmluZyB0aGUgam9pbiBjb2x1bW4gZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuIFRoYXQgY2F1c2VzIHByb2JsZW1zIAorCQkJLy9pbiB0aGUgVUkgYmVjYXVzZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgZW5kIHVwIGluIHRoZSB3cm9uZyBvcmRlci4KKwkJCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gdGhpcy5idWlsZEludmVyc2VKb2luQ29sdW1uKG5ldyBOdWxsSm9pbkNvbHVtbkFubm90YXRpb24odGhpcy5nZXRBbm5vdGF0aW9uKCkpKTsKKwkJfQorCQl0aGlzLmdldEFubm90YXRpb24oKS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbihpbmRleCk7CisJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcmVtb3ZlZEpvaW5Db2x1bW4pOworCQlpZiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gIT0gbnVsbCkgeworCQkJLy9maXJlIGNoYW5nZSBub3RpZmljYXRpb24gaWYgYSBkZWZhdWx0Sm9pbkNvbHVtbiB3YXMgY3JlYXRlZCBhYm92ZQorCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSU5WRVJTRV9KT0lOX0NPTFVNTiwgbnVsbCwgdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4pOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5fKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3Qoam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMsIFNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCXRoaXMuZ2V0QW5ub3RhdGlvbigpLm1vdmVJbnZlcnNlSm9pbkNvbHVtbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl0aGlzLmZpcmVJdGVtTW92ZWQoU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJfQorCisJcHVibGljIHZvaWQgY2xlYXJTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7CisJCS8vIGZvciBub3csIHdlIGhhdmUgdG8gcmVtb3ZlIGFubm90YXRpb25zIG9uZSBhdCBhIHRpbWUuLi4KKwkJZm9yIChpbnQgaSA9IHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLnNpemUoKTsgaS0tID4gMDsgKSB7CisJCQl0aGlzLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyhKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24pIHsKKwkJZm9yIChMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IHN0cmVhbSA9IGpvaW5UYWJsZUFubm90YXRpb24uaW52ZXJzZUpvaW5Db2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMuYWRkKHRoaXMuYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihzdHJlYW0ubmV4dCgpKSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uKSB7CisJCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOworCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5Bbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24uaW52ZXJzZUpvaW5Db2x1bW5zKCk7CisKKwkJd2hpbGUgKGpvaW5Db2x1bW5zLmhhc05leHQoKSkgeworCQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLm5leHQoKTsKKwkJCWlmIChqb2luQ29sdW1uQW5ub3RhdGlvbnMuaGFzTmV4dCgpKSB7CisJCQkJam9pbkNvbHVtbi51cGRhdGUoam9pbkNvbHVtbkFubm90YXRpb25zLm5leHQoKSk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5fKGpvaW5Db2x1bW4pOworCQkJfQorCQl9CisKKwkJd2hpbGUgKGpvaW5Db2x1bW5Bbm5vdGF0aW9ucy5oYXNOZXh0KCkpIHsKKwkJCXRoaXMuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4odGhpcy5idWlsZEludmVyc2VKb2luQ29sdW1uKGpvaW5Db2x1bW5Bbm5vdGF0aW9ucy5uZXh0KCkpKTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlmb3IgKEphdmFKb2luQ29sdW1uIGNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmpvaW5Db2x1bW5zKCkpKSB7CisJCQlyZXN1bHQgPSBjb2x1bW4uamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlmb3IgKEphdmFKb2luQ29sdW1uIGNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmludmVyc2VKb2luQ29sdW1ucygpKSkgeworCQkJcmVzdWx0ID0gY29sdW1uLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisKKwkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgorCisJcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uIGJ1aWxkSm9pbkNvbHVtbihKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQW5ub3RhdGlvbiwgSmF2YUpvaW5Db2x1bW4uT3duZXIgb3duZXIpIHsKKwkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUpvaW5Db2x1bW4odGhpcywgb3duZXIpOworCQlqb2luQ29sdW1uLmluaXRpYWxpemUoam9pbkNvbHVtbkFubm90YXRpb24pOworCQlyZXR1cm4gam9pbkNvbHVtbjsKKwl9CisKKworCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQlpZiAodGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuc2hvdWxkVmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoKSkgeworCQkJdGhpcy52YWxpZGF0ZUFnYWluc3REYXRhYmFzZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJaWYgKCAhIHRoaXMuaGFzUmVzb2x2ZWRDYXRhbG9nKCkpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HLAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0Q2F0YWxvZygpLCB0aGlzLmdldE5hbWUoKX0sIAorCQkJCQl0aGlzLCAKKwkJCQkJdGhpcy5nZXRDYXRhbG9nVGV4dFJhbmdlKGFzdFJvb3QpCisJCQkJKQorCQkJKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICggISB0aGlzLmhhc1Jlc29sdmVkU2NoZW1hKCkpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRTY2hlbWEoKSwgdGhpcy5nZXROYW1lKCl9LCAKKwkJCQkJdGhpcywgCisJCQkJCXRoaXMuZ2V0U2NoZW1hVGV4dFJhbmdlKGFzdFJvb3QpCisJCQkJKQorCQkJKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICggISB0aGlzLmlzUmVzb2x2ZWQoKSkgeworCQkJaWYgKGdldE5hbWUoKSAhPSBudWxsKSB7IC8vaWYgbmFtZSBpcyBudWxsLCB0aGUgdmFsaWRhdGlvbiB3aWxsIGJlIGhhbmRsZWQgZWxzZXdoZXJlLCBzdWNoIGFzIHRoZSB0YXJnZXQgZW50aXR5IGlzIG5vdCBkZWZpbmVkCisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwgCisJCQkJCQkJdGhpcywgCisJCQkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpKQorCQkJCQkpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisKKwkJdGhpcy52YWxpZGF0ZUpvaW5Db2x1bW5zKHRoaXMuam9pbkNvbHVtbnMoKSwgbWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy52YWxpZGF0ZUpvaW5Db2x1bW5zKHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zKCksIG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVKb2luQ29sdW1ucyhJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXdoaWxlIChqb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKKwkJCWpvaW5Db2x1bW5zLm5leHQoKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIGpvaW4gY29sdW1uIG93bmVyIGFkYXB0ZXJzICoqKioqKioqKioKKworCS8qKgorCSAqIGp1c3QgYSBsaXR0bGUgY29tbW9uIGJlaGF2aW9yCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyCisJCWltcGxlbWVudHMgSmF2YUpvaW5Db2x1bW4uT3duZXIKKwl7CisJCXByb3RlY3RlZCBBYnN0cmFjdEpvaW5Db2x1bW5Pd25lcigpIHsKKwkJCXN1cGVyKCk7CisJCX0KKworCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXRQYXJlbnQoKS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRUeXBlTWFwcGluZygpOworCQl9CisKKwkJcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKKwkJCXJldHVybiBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKwkJfQorCisJCS8qKgorCQkgKiB0aGUgZGVmYXVsdCB0YWJsZSBuYW1lIGlzIGFsd2F5cyB2YWxpZCBhbmQgYSBzcGVjaWZpZWQgdGFibGUgbmFtZQorCQkgKiBpcyBwcm9oaWJpdGVkICh3aGljaCB3aWxsIGJlIGhhbmRsZWQgZWxzZXdoZXJlKQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8qKgorCQkgKiB0aGUgam9pbiBjb2x1bW4gY2FuIG9ubHkgYmUgb24gdGhlIGpvaW4gdGFibGUgaXRzZWxmCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiB0YWJsZUlzQWxsb3dlZCgpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7CisJCQlpZiAoR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXROYW1lKCkgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJcmV0dXJuIChHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldE5hbWUoKS5lcXVhbHModGFibGVOYW1lKSkgPyBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldERiVGFibGUoKSA6IG51bGw7CisJCX0KKworCQkvKioKKwkJICogYnkgZGVmYXVsdCwgdGhlIGpvaW4gY29sdW1uIGlzLCBvYnZpb3VzbHksIGluIHRoZSBqb2luIHRhYmxlOworCQkgKiBub3Qgc3VyZSB3aGV0aGVyIGl0IGNhbiBiZSBhbnl3aGVyZSBlbHNlLi4uCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7CisJCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXROYW1lKCk7CisJCX0KKworCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJCXJldHVybiBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIG93bmVyIGZvciAiYmFjay1wb2ludGVyIiBKb2luQ29sdW1uczsKKwkgKiB0aGVzZSBwb2ludCBhdCB0aGUgc291cmNlL293bmluZyBlbnRpdHkKKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgSm9pbkNvbHVtbk93bmVyCisJCWV4dGVuZHMgQWJzdHJhY3RKb2luQ29sdW1uT3duZXIKKwl7CisJCXByb3RlY3RlZCBKb2luQ29sdW1uT3duZXIoKSB7CisJCQlzdXBlcigpOworCQl9CisKKwkJcHVibGljIEVudGl0eSBnZXRUYXJnZXRFbnRpdHkoKSB7CisJCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXRQYXJlbnQoKS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRFbnRpdHkoKTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKKwkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOworCQkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlmb3IgKFBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IAorCQkJCQlDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoCisJCQkJCQl0YXJnZXRFbnRpdHkuZ2V0UGVyc2lzdGVudFR5cGUoKS5hbGxBdHRyaWJ1dGVzKCkpKSB7CisJCQkJaWYgKGVhY2guZ2V0TWFwcGluZygpLmlzT3duZWRCeSh0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSkpIHsKKwkJCQkJcmV0dXJuIGVhY2guZ2V0TmFtZSgpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7CisJCQlvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZGJUYWJsZSA9IHN1cGVyLmdldERiVGFibGUodGFibGVOYW1lKTsKKwkJCXJldHVybiAoZGJUYWJsZSAhPSBudWxsKSA/IGRiVGFibGUgOiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOworCQl9CisKKwkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpIHsKKwkJCXJldHVybiBnZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlEYlRhYmxlKCk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPT0gam9pbkNvbHVtbjsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7CisJCQkvL2J1aWx0IGluIE1hcHBpbmdUb29scy5idWlsZEpvaW5Db2x1bW5EZWZhdWx0TmFtZSgpCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgeworCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuam9pbkNvbHVtbnNTaXplKCk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIG93bmVyIGZvciAiZm9yd2FyZC1wb2ludGVyIiBKb2luQ29sdW1uczsKKwkgKiB0aGVzZSBwb2ludCBhdCB0aGUgdGFyZ2V0L2ludmVyc2UgZW50aXR5CisJICovCisJcHJvdGVjdGVkIGNsYXNzIEludmVyc2VKb2luQ29sdW1uT3duZXIKKwkJZXh0ZW5kcyBBYnN0cmFjdEpvaW5Db2x1bW5Pd25lcgorCXsKKwkJcHJvdGVjdGVkIEludmVyc2VKb2luQ29sdW1uT3duZXIoKSB7CisJCQlzdXBlcigpOworCQl9CisKKwkJcHVibGljIEVudGl0eSBnZXRUYXJnZXRFbnRpdHkoKSB7CisJCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKKwkJCXJldHVybiBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXROYW1lKCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKKwkJCW9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBkYlRhYmxlID0gc3VwZXIuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOworCQkJaWYgKGRiVGFibGUgIT0gbnVsbCkgeworCQkJCXJldHVybiBkYlRhYmxlOworCQkJfQorCQkJRW50aXR5IHRhcmdldEVudGl0eSA9IGdldFRhcmdldEVudGl0eSgpOworCQkJcmV0dXJuICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogdGFyZ2V0RW50aXR5LmdldERiVGFibGUodGFibGVOYW1lKTsKKwkJfQorCisJCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7CisJCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gZ2V0VGFyZ2V0RW50aXR5KCk7CisJCQlyZXR1cm4gKHRhcmdldEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiB0YXJnZXRFbnRpdHkuZ2V0UHJpbWFyeURiVGFibGUoKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPT0gam9pbkNvbHVtbjsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoKSB7CisJCQkvL2J1aWx0IGluIE1hcHBpbmdUb29scy5idWlsZEpvaW5Db2x1bW5EZWZhdWx0TmFtZSgpCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgeworCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFMb2JDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUxvYkNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYjFmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFMb2JDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFMb2JDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUxvYkNvbnZlcnRlciBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCisJaW1wbGVtZW50cyBKYXZhTG9iQ29udmVydGVyCit7CisJcHJpdmF0ZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKKwkKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFMb2JDb252ZXJ0ZXIoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5pbml0aWFsaXplKGpycGEpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoSmF2YUF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiBDb252ZXJ0ZXIuTE9CX0NPTlZFUlRFUjsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFRvUmVzb3VyY2VNb2RlbCgpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCQorCXByb3RlY3RlZCBUZW1wb3JhbEFubm90YXRpb24gZ2V0UmVzb3VyY2VMb2IoKSB7CisJCXJldHVybiAoVGVtcG9yYWxBbm5vdGF0aW9uKSB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS4KKwkJCQlnZXRBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0ganJwYTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgewkJCisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0ganJwYTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBnZXRSZXNvdXJjZUxvYigpLmdldFRleHRSYW5nZShhc3RSb290KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDA3ODBjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFNYW55VG9NYW55TWFwcGluZzsKKworCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZworCWV4dGVuZHMgQWJzdHJhY3RKYXZhTWFueVRvTWFueU1hcHBpbmcKK3sKKwlwdWJsaWMgR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1ODYxOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb09uZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFNYW55VG9PbmVNYXBwaW5nOworCisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU1hbnlUb09uZU1hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0SmF2YU1hbnlUb09uZU1hcHBpbmcKK3sKKwlwdWJsaWMgR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hcHBlZFN1cGVyY2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjE5ZTNhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFwcGVkU3VwZXJjbGFzcy5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFNYXBwZWRTdXBlcmNsYXNzOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFNYXBwZWRTdXBlcmNsYXNzIGV4dGVuZHMgQWJzdHJhY3RKYXZhTWFwcGVkU3VwZXJjbGFzcworeworCisJcHVibGljIEdlbmVyaWNKYXZhTWFwcGVkU3VwZXJjbGFzcyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOYW1lZE5hdGl2ZVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1ZDFhNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU5hbWVkTmF0aXZlUXVlcnkuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZE5hdGl2ZVF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uOworCisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU5hbWVkTmF0aXZlUXVlcnkgZXh0ZW5kcyBBYnN0cmFjdEphdmFRdWVyeQorCWltcGxlbWVudHMgSmF2YU5hbWVkTmF0aXZlUXVlcnkKK3sKKworCXByb3RlY3RlZCBTdHJpbmcgcmVzdWx0Q2xhc3M7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmc7CisKKwlwdWJsaWMgR2VuZXJpY0phdmFOYW1lZE5hdGl2ZVF1ZXJ5KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gZ2V0UmVzb3VyY2VRdWVyeSgpIHsKKwkJcmV0dXJuIChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgc3VwZXIuZ2V0UmVzb3VyY2VRdWVyeSgpOworCX0KKwkKKwlwdWJsaWMgY2hhciBnZXRSZXN1bHRDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7CisJCXJldHVybiAnLic7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0Q2xhc3MoKSB7CisJCXJldHVybiB0aGlzLnJlc3VsdENsYXNzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc3VsdENsYXNzKFN0cmluZyBuZXdSZXN1bHRDbGFzcykgeworCQlTdHJpbmcgb2xkUmVzdWx0Q2xhc3MgPSB0aGlzLnJlc3VsdENsYXNzOworCQl0aGlzLnJlc3VsdENsYXNzID0gbmV3UmVzdWx0Q2xhc3M7CisJCWdldFJlc291cmNlUXVlcnkoKS5zZXRSZXN1bHRDbGFzcyhuZXdSZXN1bHRDbGFzcyk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTmFtZWROYXRpdmVRdWVyeS5SRVNVTFRfQ0xBU1NfUFJPUEVSVFksIG9sZFJlc3VsdENsYXNzLCBuZXdSZXN1bHRDbGFzcyk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFJlc3VsdENsYXNzXyhTdHJpbmcgbmV3UmVzdWx0Q2xhc3MpIHsKKwkJU3RyaW5nIG9sZFJlc3VsdENsYXNzID0gdGhpcy5yZXN1bHRDbGFzczsKKwkJdGhpcy5yZXN1bHRDbGFzcyA9IG5ld1Jlc3VsdENsYXNzOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5hbWVkTmF0aXZlUXVlcnkuUkVTVUxUX0NMQVNTX1BST1BFUlRZLCBvbGRSZXN1bHRDbGFzcywgbmV3UmVzdWx0Q2xhc3MpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0U2V0TWFwcGluZygpIHsKKwkJcmV0dXJuIHRoaXMucmVzdWx0U2V0TWFwcGluZzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXN1bHRTZXRNYXBwaW5nKFN0cmluZyBuZXdSZXN1bHRTZXRNYXBwaW5nKSB7CisJCVN0cmluZyBvbGRSZXN1bHRTZXRNYXBwaW5nID0gdGhpcy5yZXN1bHRTZXRNYXBwaW5nOworCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSBuZXdSZXN1bHRTZXRNYXBwaW5nOworCQlnZXRSZXNvdXJjZVF1ZXJ5KCkuc2V0UmVzdWx0U2V0TWFwcGluZyhuZXdSZXN1bHRTZXRNYXBwaW5nKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChOYW1lZE5hdGl2ZVF1ZXJ5LlJFU1VMVF9TRVRfTUFQUElOR19QUk9QRVJUWSwgb2xkUmVzdWx0U2V0TWFwcGluZywgbmV3UmVzdWx0U2V0TWFwcGluZyk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZ18oU3RyaW5nIG5ld1Jlc3VsdFNldE1hcHBpbmcpIHsKKwkJU3RyaW5nIG9sZFJlc3VsdFNldE1hcHBpbmcgPSB0aGlzLnJlc3VsdFNldE1hcHBpbmc7CisJCXRoaXMucmVzdWx0U2V0TWFwcGluZyA9IG5ld1Jlc3VsdFNldE1hcHBpbmc7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTmFtZWROYXRpdmVRdWVyeS5SRVNVTFRfU0VUX01BUFBJTkdfUFJPUEVSVFksIG9sZFJlc3VsdFNldE1hcHBpbmcsIG5ld1Jlc3VsdFNldE1hcHBpbmcpOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gcmVzb3VyY2VRdWVyeSkgeworCQlzdXBlci5pbml0aWFsaXplKHJlc291cmNlUXVlcnkpOworCQl0aGlzLnJlc3VsdENsYXNzID0gcmVzb3VyY2VRdWVyeS5nZXRSZXN1bHRDbGFzcygpOworCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSByZXNvdXJjZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIHJlc291cmNlUXVlcnkpIHsKKwkJc3VwZXIudXBkYXRlKHJlc291cmNlUXVlcnkpOworCQl0aGlzLnNldFJlc3VsdENsYXNzXyhyZXNvdXJjZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOworCQl0aGlzLnNldFJlc3VsdFNldE1hcHBpbmdfKHJlc291cmNlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU5hbWVkUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU5hbWVkUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjI3YzUwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTmFtZWRRdWVyeS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWRRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKKworCisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU5hbWVkUXVlcnkgZXh0ZW5kcyBBYnN0cmFjdEphdmFRdWVyeSBpbXBsZW1lbnRzIEphdmFOYW1lZFF1ZXJ5Cit7CisJCisJcHVibGljIEdlbmVyaWNKYXZhTmFtZWRRdWVyeShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBnZXRSZXNvdXJjZVF1ZXJ5KCkgeworCQlyZXR1cm4gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBzdXBlci5nZXRSZXNvdXJjZVF1ZXJ5KCk7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShOYW1lZFF1ZXJ5QW5ub3RhdGlvbiByZXNvdXJjZVF1ZXJ5KSB7CisJCXN1cGVyLmluaXRpYWxpemUocmVzb3VyY2VRdWVyeSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZShOYW1lZFF1ZXJ5QW5ub3RhdGlvbiByZXNvdXJjZVF1ZXJ5KSB7CisJCXN1cGVyLnVwZGF0ZShyZXNvdXJjZVF1ZXJ5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTBiOTMyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk1ldGFtb2RlbEZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEFubm90YXRpb24+Cit7CisJcHVibGljIEdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCX0KKworCisJLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKiAgCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWV0YW1vZGVsRmllbGQgZ2V0TWV0YW1vZGVsRmllbGQoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTnVsbENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTnVsbENvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjNmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOdWxsQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU51bGxDb252ZXJ0ZXIgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgSmF2YUNvbnZlcnRlcgoreworCQorCXB1YmxpYyBHZW5lcmljSmF2YU51bGxDb252ZXJ0ZXIoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChKYXZhQXR0cmlidXRlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIENvbnZlcnRlci5OT19DT05WRVJURVI7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFRvUmVzb3VyY2VNb2RlbCgpIHsKKwkJLy9kbyBub3RoaW5nCisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKCkgeworCQkvL2RvIG5vdGhpbgkJCisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgeworCQkvL2RvIG5vdGhpbmcJCQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWZmMGJhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOworCisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmc8VCBleHRlbmRzIE9uZVRvTWFueUFubm90YXRpb24+CisJZXh0ZW5kcyBBYnN0cmFjdEphdmFPbmVUb01hbnlNYXBwaW5nPE9uZVRvTWFueUFubm90YXRpb24+Cit7CisJCisJcHVibGljIEdlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKYXZhUmVsYXRpb25zaGlwUmVmZXJlbmNlIGJ1aWxkUmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlKHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODVjYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sJCisJCisJcHVibGljIEdlbmVyaWNKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlKEphdmFPbmVUb01hbnlNYXBwaW5nIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0JCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpvaW5pbmdTdHJhdGVneSBjYWxjdWxhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHsKKwkJaWYgKHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKKwkJfQorCQlyZXR1cm4gdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvT25lTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NWU0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFPbmVUb09uZU1hcHBpbmc7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFPbmVUb09uZU1hcHBpbmcKK3sKKwlwdWJsaWMgR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwNTJjMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworCisvKioKKyAqIEdlbmVyaWMgSmF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZQorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFQZXJzaXN0ZW50QXR0cmlidXRlCit7CisKKwlwdWJsaWMgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlKFBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7CisJCXN1cGVyKHBhcmVudCwganJwYSk7CisJfQorCisJCisJLy8gKioqKioqKioqKiBBY2Nlc3NIb2xkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCQorCS8qKgorCSAqIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBkb2VzIG5vdCBzdXBwb3J0IHNwZWNpZmllZCBhY2Nlc3MgKG5vIGFjY2VzcyBlbGVtZW50IGluIDEuMCksIHNvIHdlIHJldHVybiBudWxsCisJICovCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUgc3BlY2lmaWVkQWNjZXNzKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzODg3YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZQorCWV4dGVuZHMgQWJzdHJhY3RKYXZhUGVyc2lzdGVudFR5cGUKK3sKKworCXB1YmxpYyBHZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlKFBlcnNpc3RlbnRUeXBlLk93bmVyIHBhcmVudCwgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgeworCQlzdXBlcihwYXJlbnQsIGpycHQpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGFjY2VzcyB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwkvKioKKwkgKiBHZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlIGRvZXMgbm90IHN1cHBvcnQgc3BlY2lmaWVkIGFjY2VzcyAobm8gQWNjZXNzIGFubm90YXRpb24gaW4gMS4wKSwgCisJICogc28gd2UgcmV0dXJuIG51bGwKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBidWlsZFNwZWNpZmllZEFjY2VzcygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUgZG9lcyBub3Qgc3VwcG9ydCBzcGVjaWZpZWQgYWNjZXNzIChubyBBY2Nlc3MgYW5ub3RhdGlvbiBpbiAxLjApCisJICovCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUgc3BlY2lmaWVkQWNjZXNzKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZmE4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNlSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU5hbWVkQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gZXh0ZW5kcyBBYnN0cmFjdEphdmFOYW1lZENvbHVtbjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+CisJaW1wbGVtZW50cyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4KK3sKKwlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCisJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7CisKKwlwcm90ZWN0ZWQgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW47CisJCisJcHVibGljIEdlbmVyaWNKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUJhc2VKb2luQ29sdW1uLk93bmVyIG93bmVyKSB7CisJCXN1cGVyKHBhcmVudCwgb3duZXIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbikgeworCQl0aGlzLnJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW4gPSBjb2x1bW47CisJCXN1cGVyLmluaXRpYWxpemUoY29sdW1uKTsKKwkJdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuZ2V0UmVzb3VyY2VSZWZlcmVuY2VkQ29sdW1uTmFtZShjb2x1bW4pOworCQl0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKKwl9CisKKwkvLyoqKioqKioqKioqKioqIEphdmFOYW1lZENvbHVtbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUJhc2VKb2luQ29sdW1uLk93bmVyIGdldE93bmVyKCkgeworCQlyZXR1cm4gKEphdmFCYXNlSm9pbkNvbHVtbi5Pd25lcikgc3VwZXIuZ2V0T3duZXIoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBnZXRSZXNvdXJjZUNvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKKwl9CisJCisJLy8qKioqKioqKioqKioqKiBJQWJzdHJhY3RKb2luQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9PSBudWxsKSA/IHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lIDogdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKKwkJU3RyaW5nIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwkJdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCQlnZXRSZXNvdXJjZUNvbHVtbigpLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUsIG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8oU3RyaW5nIG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7CisJCVN0cmluZyBvbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7CisJCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUsIG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmV3RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7CisJCVN0cmluZyBvbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwkJdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuZXdEZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUsIG5ld0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKKwkJcmV0dXJuIGdldE93bmVyKCkuaXNWaXJ0dWFsKHRoaXMpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOworCX0KKworCXB1YmxpYyBDb2x1bW4gZ2V0UmVmZXJlbmNlZERiQ29sdW1uKCkgeworCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKTsKKwkJcmV0dXJuICh0YWJsZSA9PSBudWxsKSA/IG51bGwgOiB0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKHRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJfQorCisJcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgeworCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpLnJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5jb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlpZiAodGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMocG9zLCBhc3RSb290KSkgeworCQkJcmV0dXJuIHRoaXMuamF2YUNhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcyhmaWx0ZXIpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgeworCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKHRoaXMuY2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKGZpbHRlcikpOworCX0KKworCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKCksIGZpbHRlcik7CisJfQorCisJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcygpIHsKKwkJVGFibGUgdGFibGUgPSB0aGlzLmdldE93bmVyKCkuZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKTsKKwkJcmV0dXJuICh0YWJsZSAhPSBudWxsKSA/IHRhYmxlLnNvcnRlZENvbHVtbklkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+IGluc3RhbmNlKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSB7CisJCXJldHVybiBnZXRSZWZlcmVuY2VkRGJDb2x1bW4oKSAhPSBudWxsOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShhc3RSb290KTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRSZXNvdXJjZUNvbHVtbigpLmdldFRleHRSYW5nZShhc3RSb290KTsKKwkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldE93bmVyKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsJCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiByZXNvdXJjZUNvbHVtbikgeworCQl0aGlzLnJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW4gPSByZXNvdXJjZUNvbHVtbjsKKwkJc3VwZXIudXBkYXRlKHJlc291cmNlQ29sdW1uKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8odGhpcy5nZXRSZXNvdXJjZVJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlc291cmNlQ29sdW1uKSk7CisJCXRoaXMuc2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKHRoaXMuYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VSZWZlcmVuY2VkQ29sdW1uTmFtZShQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcmVzb3VyY2VDb2x1bW4pIHsKKwkJcmV0dXJuIHJlc291cmNlQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7CisJfQorCQorCS8vVE9ETyBub3QgY29ycmVjdCB3aGVuIHdlIHN0YXJ0IHN1cHBvcnRpbmcgcHJpbWFyeUtleUpvaW5Db2x1bW5zIGluIDEtMSBtYXBwaW5ncworCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7CisJCXJldHVybiBidWlsZERlZmF1bHROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzdXBlci50b1N0cmluZyhzYik7CisJCXNiLmFwcGVuZCgiPT4iKTsgLy8kTk9OLU5MUy0xJAorCQlzYi5hcHBlbmQodGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVF1ZXJ5Q29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFRdWVyeUNvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWFlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFRdWVyeUNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsMjkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWROYXRpdmVRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWROYXRpdmVRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVF1ZXJ5Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyaWVzQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVF1ZXJ5Q29udGFpbmVyIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIEphdmFRdWVyeUNvbnRhaW5lcgoreworCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CisKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzOworCisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8SmF2YU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllczsKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFRdWVyeUNvbnRhaW5lcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMubmFtZWRRdWVyaWVzID0gbmV3IEFycmF5TGlzdDxKYXZhTmFtZWRRdWVyeT4oKTsKKwkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMgPSBuZXcgQXJyYXlMaXN0PEphdmFOYW1lZE5hdGl2ZVF1ZXJ5PigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhSnBhQ29udGV4dE5vZGUgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEphdmFKcGFDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCQorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhTmFtZWRRdWVyeT4odGhpcy5uYW1lZFF1ZXJpZXMpOworCX0KKwkKKwlwdWJsaWMgaW50IG5hbWVkUXVlcmllc1NpemUoKSB7CisJCXJldHVybiB0aGlzLm5hbWVkUXVlcmllcy5zaXplKCk7CisJfQorCQorCXB1YmxpYyBKYXZhTmFtZWRRdWVyeSBhZGROYW1lZFF1ZXJ5KGludCBpbmRleCkgeworCQlKYXZhTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YU5hbWVkUXVlcnkodGhpcyk7CisJCXRoaXMubmFtZWRRdWVyaWVzLmFkZChpbmRleCwgbmFtZWRRdWVyeSk7CisJCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnlBbm5vdGF0aW9uID0gCisJCQkJKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuCisJCQkJCWFkZEFubm90YXRpb24oCisJCQkJCQlpbmRleCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCAKKwkJCQkJCU5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJbmFtZWRRdWVyeS5pbml0aWFsaXplKG5hbWVkUXVlcnlBbm5vdGF0aW9uKTsKKwkJZmlyZUl0ZW1BZGRlZChOQU1FRF9RVUVSSUVTX0xJU1QsIGluZGV4LCBuYW1lZFF1ZXJ5KTsKKwkJcmV0dXJuIG5hbWVkUXVlcnk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVkUXVlcnkoaW50IGluZGV4LCBKYXZhTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5KSB7CisJCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIG5hbWVkUXVlcnksIHRoaXMubmFtZWRRdWVyaWVzLCBOQU1FRF9RVUVSSUVTX0xJU1QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lZFF1ZXJ5KEphdmFOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkpIHsKKwkJdGhpcy5hZGROYW1lZFF1ZXJ5KHRoaXMubmFtZWRRdWVyaWVzLnNpemUoKSwgbmFtZWRRdWVyeSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkUXVlcnkoTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5KSB7CisJCXJlbW92ZU5hbWVkUXVlcnkodGhpcy5uYW1lZFF1ZXJpZXMuaW5kZXhPZihuYW1lZFF1ZXJ5KSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkUXVlcnkoaW50IGluZGV4KSB7CisJCUphdmFOYW1lZFF1ZXJ5IHJlbW92ZWROYW1lZFF1ZXJ5ID0gdGhpcy5uYW1lZFF1ZXJpZXMucmVtb3ZlKGluZGV4KTsKKwkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLnJlbW92ZUFubm90YXRpb24oCisJCQkJaW5kZXgsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlmaXJlSXRlbVJlbW92ZWQoTkFNRURfUVVFUklFU19MSVNULCBpbmRleCwgcmVtb3ZlZE5hbWVkUXVlcnkpOworCX0JCisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTmFtZWRRdWVyeV8oSmF2YU5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgeworCQlyZW1vdmVJdGVtRnJvbUxpc3QobmFtZWRRdWVyeSwgdGhpcy5uYW1lZFF1ZXJpZXMsIE5BTUVEX1FVRVJJRVNfTElTVCk7CisJfQorCQorCXB1YmxpYyB2b2lkIG1vdmVOYW1lZFF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMubmFtZWRRdWVyaWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIubW92ZUFubm90YXRpb24oCisJCQkJdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWZpcmVJdGVtTW92ZWQoTkFNRURfUVVFUklFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCisJfQorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKYXZhTmFtZWROYXRpdmVRdWVyeT4odGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMpOworCX0KKwkKKwlwdWJsaWMgaW50IG5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSB7CisJCXJldHVybiB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5zaXplKCk7CisJfQorCQorCXB1YmxpYyBKYXZhTmFtZWROYXRpdmVRdWVyeSBhZGROYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCkgeworCQlKYXZhTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YU5hbWVkTmF0aXZlUXVlcnkodGhpcyk7CisJCXRoaXMubmFtZWROYXRpdmVRdWVyaWVzLmFkZChpbmRleCwgbmFtZWROYXRpdmVRdWVyeSk7CisJCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uID0gCisJCQkJKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuCisJCQkJCWFkZEFubm90YXRpb24oCisJCQkJCQlpbmRleCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCAKKwkJCQkJCU5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJbmFtZWROYXRpdmVRdWVyeS5pbml0aWFsaXplKG5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKTsJCQorCQlmaXJlSXRlbUFkZGVkKE5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QsIGluZGV4LCBuYW1lZE5hdGl2ZVF1ZXJ5KTsKKwkJcmV0dXJuIG5hbWVkTmF0aXZlUXVlcnk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4LCBKYXZhTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5KSB7CisJCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIG5hbWVkTmF0aXZlUXVlcnksIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLCBOQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkTmFtZWROYXRpdmVRdWVyeShKYXZhTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5KSB7CisJCXRoaXMuYWRkTmFtZWROYXRpdmVRdWVyeSh0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5zaXplKCksIG5hbWVkTmF0aXZlUXVlcnkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSkgeworCQl0aGlzLnJlbW92ZU5hbWVkTmF0aXZlUXVlcnkodGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuaW5kZXhPZihuYW1lZE5hdGl2ZVF1ZXJ5KSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4KSB7CisJCUphdmFOYW1lZE5hdGl2ZVF1ZXJ5IHJlbW92ZWROYW1lZE5hdGl2ZVF1ZXJ5ID0gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMucmVtb3ZlKGluZGV4KTsKKwkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLnJlbW92ZUFubm90YXRpb24oCisJCQkJaW5kZXgsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgCisJCQkJTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlmaXJlSXRlbVJlbW92ZWQoTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCwgaW5kZXgsIHJlbW92ZWROYW1lZE5hdGl2ZVF1ZXJ5KTsKKwl9CQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5hbWVkTmF0aXZlUXVlcnlfKEphdmFOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkpIHsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KG5hbWVkTmF0aXZlUXVlcnksIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLCBOQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUKTsKKwl9CisJCisJcHVibGljIHZvaWQgbW92ZU5hbWVkTmF0aXZlUXVlcnkoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5tb3ZlQW5ub3RhdGlvbigKKwkJCQl0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJZmlyZUl0ZW1Nb3ZlZChOQU1FRF9OQVRJVkVfUVVFUklFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCisJfQorCisJCisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKKwkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyID0ganJwbTsKKwkJdGhpcy5pbml0aWFsaXplTmFtZWRRdWVyaWVzKCk7CisJCXRoaXMuaW5pdGlhbGl6ZU5hbWVkTmF0aXZlUXVlcmllcygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVOYW1lZFF1ZXJpZXMoKSB7CisJCWZvciAoSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBzdHJlYW0gPSB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuCisJCQkJCWFubm90YXRpb25zKAorCQkJCQkJTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCAKKwkJCQkJCU5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsgCisJCQkJCXN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJdGhpcy5uYW1lZFF1ZXJpZXMuYWRkKGJ1aWxkTmFtZWRRdWVyeSgoTmFtZWRRdWVyeUFubm90YXRpb24pIHN0cmVhbS5uZXh0KCkpKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTmFtZWROYXRpdmVRdWVyaWVzKCkgeworCQlmb3IgKEl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gc3RyZWFtID0gdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLgorCQkJCQlhbm5vdGF0aW9ucygKKwkJCQkJCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgCisJCQkJCQlOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7IAorCQkJCQlzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCXRoaXMubmFtZWROYXRpdmVRdWVyaWVzLmFkZChidWlsZE5hbWVkTmF0aXZlUXVlcnkoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBzdHJlYW0ubmV4dCgpKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIEphdmFOYW1lZFF1ZXJ5IGJ1aWxkTmFtZWRRdWVyeShOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5UmVzb3VyY2UpIHsKKwkJSmF2YU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFOYW1lZFF1ZXJ5KHRoaXMpOworCQluYW1lZFF1ZXJ5LmluaXRpYWxpemUobmFtZWRRdWVyeVJlc291cmNlKTsKKwkJcmV0dXJuIG5hbWVkUXVlcnk7CisJfQorCQorCXByb3RlY3RlZCBKYXZhTmFtZWROYXRpdmVRdWVyeSBidWlsZE5hbWVkTmF0aXZlUXVlcnkoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWROYXRpdmVRdWVyeVJlc291cmNlKSB7CisJCUphdmFOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhTmFtZWROYXRpdmVRdWVyeSh0aGlzKTsKKwkJbmFtZWROYXRpdmVRdWVyeS5pbml0aWFsaXplKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSk7CisJCXJldHVybiBuYW1lZE5hdGl2ZVF1ZXJ5OworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKKwkJdGhpcy5qYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyID0ganJwbTsKKwkJdGhpcy51cGRhdGVOYW1lZFF1ZXJpZXMoKTsKKwkJdGhpcy51cGRhdGVOYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlTmFtZWRRdWVyaWVzKCkgeworCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkUXVlcnk+IHF1ZXJpZXMgPSBuYW1lZFF1ZXJpZXMoKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiByZXNvdXJjZU5hbWVkUXVlcmllcyA9IAorCQkJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5hbm5vdGF0aW9ucygKKwkJCQkJTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCAKKwkJCQkJTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJd2hpbGUgKHF1ZXJpZXMuaGFzTmV4dCgpKSB7CisJCQlKYXZhTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gcXVlcmllcy5uZXh0KCk7CisJCQlpZiAocmVzb3VyY2VOYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKSB7CisJCQkJbmFtZWRRdWVyeS51cGRhdGUoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZU5hbWVkUXVlcmllcy5uZXh0KCkpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlTmFtZWRRdWVyeV8obmFtZWRRdWVyeSk7CisJCQl9CisJCX0KKwkJCisJCXdoaWxlIChyZXNvdXJjZU5hbWVkUXVlcmllcy5oYXNOZXh0KCkpIHsKKwkJCWFkZE5hbWVkUXVlcnkoYnVpbGROYW1lZFF1ZXJ5KChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VOYW1lZFF1ZXJpZXMubmV4dCgpKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlTmFtZWROYXRpdmVRdWVyaWVzKCkgeworCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkTmF0aXZlUXVlcnk+IHF1ZXJpZXMgPSBuYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiByZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcyA9IAorCQkJCXRoaXMuamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5hbm5vdGF0aW9ucygKKwkJCQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCAKKwkJCQkJTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJd2hpbGUgKHF1ZXJpZXMuaGFzTmV4dCgpKSB7CisJCQlKYXZhTmFtZWROYXRpdmVRdWVyeSBuYW1lZFF1ZXJ5ID0gcXVlcmllcy5uZXh0KCk7CisJCQlpZiAocmVzb3VyY2VOYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKSB7CisJCQkJbmFtZWRRdWVyeS51cGRhdGUoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlTmFtZWROYXRpdmVRdWVyeV8obmFtZWRRdWVyeSk7CisJCQl9CisJCX0KKwkJCisJCXdoaWxlIChyZXNvdXJjZU5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpIHsKKwkJCWFkZE5hbWVkTmF0aXZlUXVlcnkoYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5KChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VOYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpKSk7CisJCX0JCisJfQorCQorCQorCS8vKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy52YWxpZGF0ZVF1ZXJpZXMobWVzc2FnZXMsIGFzdFJvb3QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVF1ZXJpZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCWZvciAoSXRlcmF0b3I8SmF2YVF1ZXJ5PiBsb2NhbFF1ZXJpZXMgPSB0aGlzLnF1ZXJpZXMoKTsgbG9jYWxRdWVyaWVzLmhhc05leHQoKTsgKSB7CisJCQlKYXZhUXVlcnkgbG9jYWxRdWVyeSA9IGxvY2FsUXVlcmllcy5uZXh0KCk7CisJCQlmb3IgKEl0ZXJhdG9yPFF1ZXJ5PiBnbG9iYWxRdWVyaWVzID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5xdWVyaWVzKCk7IGdsb2JhbFF1ZXJpZXMuaGFzTmV4dCgpOyApIHsKKwkJCQlpZiAobG9jYWxRdWVyeS5kdXBsaWNhdGVzKGdsb2JhbFF1ZXJpZXMubmV4dCgpKSkgeworCQkJCQltZXNzYWdlcy5hZGQoCisJCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5RVUVSWV9EVVBMSUNBVEVfTkFNRSwKKwkJCQkJCQluZXcgU3RyaW5nW10ge2xvY2FsUXVlcnkuZ2V0TmFtZSgpfSwKKwkJCQkJCQlsb2NhbFF1ZXJ5LAorCQkJCQkJCWxvY2FsUXVlcnkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KQorCQkJCQkJKQorCQkJCQkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgSXRlcmF0b3I8SmF2YVF1ZXJ5PiBxdWVyaWVzKCkgeworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEphdmFRdWVyeT4odGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMoKSwgdGhpcy5uYW1lZFF1ZXJpZXMoKSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUXVlcnlIaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFRdWVyeUhpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWUzYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUXVlcnlIaW50LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeUhpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVF1ZXJ5SGludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFRdWVyeUhpbnQgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIEphdmFRdWVyeUhpbnQKK3sKKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOworCisJcHJvdGVjdGVkIFF1ZXJ5SGludEFubm90YXRpb24gcmVzb3VyY2VRdWVyeUhpbnQ7CisJCisJcHVibGljIEdlbmVyaWNKYXZhUXVlcnlIaW50KEphdmFRdWVyeSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLm5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKKwkJdGhpcy5uYW1lID0gbmV3TmFtZTsKKwkJdGhpcy5yZXNvdXJjZVF1ZXJ5SGludC5zZXROYW1lKG5ld05hbWUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFF1ZXJ5SGludC5OQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKKwkJU3RyaW5nIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKKwkJdGhpcy52YWx1ZSA9IG5ld1ZhbHVlOworCQl0aGlzLnJlc291cmNlUXVlcnlIaW50LnNldFZhbHVlKG5ld1ZhbHVlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChRdWVyeUhpbnQuVkFMVUVfUFJPUEVSVFksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7CisJfQorCisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFF1ZXJ5SGludEFubm90YXRpb24gcmVzb3VyY2VRdWVyeUhpbnQpIHsKKwkJdGhpcy5yZXNvdXJjZVF1ZXJ5SGludCA9IHJlc291cmNlUXVlcnlIaW50OworCQl0aGlzLm5hbWUgPSByZXNvdXJjZVF1ZXJ5SGludC5nZXROYW1lKCk7CisJCXRoaXMudmFsdWUgPSByZXNvdXJjZVF1ZXJ5SGludC5nZXRWYWx1ZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoUXVlcnlIaW50QW5ub3RhdGlvbiByZXNvdXJjZVF1ZXJ5SGludCkgeworCQl0aGlzLnJlc291cmNlUXVlcnlIaW50ID0gcmVzb3VyY2VRdWVyeUhpbnQ7CisJCXRoaXMuc2V0TmFtZShyZXNvdXJjZVF1ZXJ5SGludC5nZXROYW1lKCkpOworCQl0aGlzLnNldFZhbHVlKHJlc291cmNlUXVlcnlIaW50LmdldFZhbHVlKCkpOworCX0KKworCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVF1ZXJ5SGludC5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzkxMDNiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUuamF2YQpAQCAtMCwwICsxLDM5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzZUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlY29uZGFyeVRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUKKwlleHRlbmRzIEFic3RyYWN0SmF2YVRhYmxlCisJaW1wbGVtZW50cyBKYXZhU2Vjb25kYXJ5VGFibGUKK3sKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uczsKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUJhc2VKb2luQ29sdW1uLk93bmVyIHByaW1hcnlLZXlKb2luQ29sdW1uT3duZXI7CisKKwlwcm90ZWN0ZWQgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKKworCXByb3RlY3RlZCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gcmVzb3VyY2VTZWNvbmRhcnlUYWJsZTsKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZShKYXZhRW50aXR5IHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPigpOworCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpOworCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YUJhc2VKb2luQ29sdW1uLk93bmVyIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpIHsKKwkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhRW50aXR5IGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChKYXZhRW50aXR5KSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisKKworCS8vKioqKioqKioqKioqKioqKiogQWJzdHJhY3RKYXZhVGFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVNlY29uZGFyeVRhYmxlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1Jlc291cmNlU3BlY2lmaWVkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJLy8gYSBzZWNvbmRhcnkgdGFibGUgZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBuYW1lCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHROYW1lKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFNjaGVtYSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRTY2hlbWEoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDYXRhbG9nKCkgeworCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdENhdGFsb2coKTsKKwl9CisJCisKKwkvLyoqKioqKioqKioqKioqKioqIElTZWNvbmRhcnlUYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKgorCisJcHVibGljIExpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIHRoaXMuY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA/IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgOiB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwl9CisJCisJcHVibGljIGludCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7CisJfQorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyk7CisJfQorCQorCXB1YmxpYyBpbnQgc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiAhdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpOworCX0JCisJCisJcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBuZXdQa0pvaW5Db2x1bW4pIHsKKwkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIG9sZFBrSm9pbkNvbHVtbiA9IHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOworCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG5ld1BrSm9pbkNvbHVtbjsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBvbGRQa0pvaW5Db2x1bW4sIG5ld1BrSm9pbkNvbHVtbik7CisJfQorCisJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7CisJCWlmICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiAhPSBudWxsKSB7CisJCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbik7CisJCX0KKwkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7CisJfQorCQorCXByb3RlY3RlZCBpbnQgZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiAodGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPT0gbnVsbCkgPyAwIDogMTsKKwl9CisKKwlwdWJsaWMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgeworCQkvLyBDbGVhciBvdXQgdGhlIGRlZmF1bHQgbm93IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQgZHVyaW5nIGFuIHVwZGF0ZSBhbmQKKwkJLy8gY2F1c2UgY2hhbmdlIG5vdGlmaWNhdGlvbnMgdG8gYmUgc2VudCB0byB0aGUgVUkgaW4gdGhlIHdyb25nIG9yZGVyLgorCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gb2xkRGVmYXVsdCA9IHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOworCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG51bGw7CisKKwkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcik7CisJCXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLmFkZChpbmRleCwgcGtKb2luQ29sdW1uKTsKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtbkFubm90YXRpb24gPSB0aGlzLnJlc291cmNlU2Vjb25kYXJ5VGFibGUuYWRkUGtKb2luQ29sdW1uKGluZGV4KTsKKwkJcGtKb2luQ29sdW1uLmluaXRpYWxpemUocGtKb2luQ29sdW1uQW5ub3RhdGlvbik7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChTUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBwa0pvaW5Db2x1bW4pOworCisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBvbGREZWZhdWx0LCBudWxsKTsKKwkJcmV0dXJuIHBrSm9pbkNvbHVtbjsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgsIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgeworCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBwcmltYXJ5S2V5Sm9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIFNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbikgeworCQl0aGlzLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKSwgcHJpbWFyeUtleUpvaW5Db2x1bW4pOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCXRoaXMucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaW5kZXhPZihqb2luQ29sdW1uKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgeworCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcmVtb3ZlZFByaW1hcnlLZXlKb2luQ29sdW1uID0gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKKwkJaWYgKCFjb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSB7CisJCQkvL2NyZWF0ZSB0aGUgZGVmYXVsdEpvaW5Db2x1bW4gbm93IG9yIHRoaXMgd2lsbCBoYXBwZW4gZHVyaW5nIHByb2plY3QgdXBkYXRlIAorCQkJLy9hZnRlciByZW1vdmluZyB0aGUgam9pbiBjb2x1bW4gZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuIFRoYXQgY2F1c2VzIHByb2JsZW1zIAorCQkJLy9pbiB0aGUgVUkgYmVjYXVzZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgZW5kIHVwIGluIHRoZSB3cm9uZyBvcmRlci4KKwkJCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID0gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihuZXcgTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbih0aGlzLnJlc291cmNlU2Vjb25kYXJ5VGFibGUpKTsKKwkJfQorCQl0aGlzLnJlc291cmNlU2Vjb25kYXJ5VGFibGUucmVtb3ZlUGtKb2luQ29sdW1uKGluZGV4KTsKKwkJZmlyZUl0ZW1SZW1vdmVkKFNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIHJlbW92ZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbik7CisJCWlmICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiAhPSBudWxsKSB7CisJCQkvL2ZpcmUgY2hhbmdlIG5vdGlmaWNhdGlvbiBpZiBhIGRlZmF1bHRKb2luQ29sdW1uIHdhcyBjcmVhdGVkIGFib3ZlCisJCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRW50aXR5LkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIG51bGwsIHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKTsKKwkJfQorCX0JCisKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbl8oSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uKSB7CisJCXJlbW92ZUl0ZW1Gcm9tTGlzdChwcmltYXJ5S2V5Sm9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIFNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCk7CisJfQorCQorCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJdGhpcy5yZXNvdXJjZVNlY29uZGFyeVRhYmxlLm1vdmVQa0pvaW5Db2x1bW4odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJZmlyZUl0ZW1Nb3ZlZChTUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKKwl9CisJCisJcHVibGljIEphdmFFbnRpdHkgZ2V0SmF2YUVudGl0eSgpIHsKKwkJcmV0dXJuIGdldFBhcmVudCgpOworCX0KKwkKKwkKKwkvLyoqKioqKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSkgeworCQlzdXBlci5pbml0aWFsaXplKHNlY29uZGFyeVRhYmxlKTsKKwkJdGhpcy5yZXNvdXJjZVNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGU7CisJCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyhzZWNvbmRhcnlUYWJsZSk7CisJCXRoaXMuaW5pdGlhbGl6ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihzZWNvbmRhcnlUYWJsZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlKSB7CisJCUxpc3RJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IGFubm90YXRpb25zID0gc2Vjb25kYXJ5VGFibGUucGtKb2luQ29sdW1ucygpOworCQkKKwkJd2hpbGUoYW5ub3RhdGlvbnMuaGFzTmV4dCgpKSB7CisJCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihhbm5vdGF0aW9ucy5uZXh0KCkpKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRCdWlsZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKKwkJcmV0dXJuICFjb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSkgeworCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4obmV3IE51bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oc2Vjb25kYXJ5VGFibGUpKTsKKwl9CQorCisJCisJcHVibGljIHZvaWQgdXBkYXRlKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzdGEpIHsKKwkJdGhpcy5yZXNvdXJjZVNlY29uZGFyeVRhYmxlID0gc3RhOworCQlzdXBlci51cGRhdGUoc3RhKTsKKwkJdGhpcy51cGRhdGVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoc3RhKTsKKwkJdGhpcy51cGRhdGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oc3RhKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzdGEpIHsKKwkJTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCUxpc3RJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gc3RhLnBrSm9pbkNvbHVtbnMoKTsKKwkJCisJCXdoaWxlIChwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7CisJCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpOworCQkJaWYgKHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSkgeworCQkJCXByaW1hcnlLZXlKb2luQ29sdW1uLnVwZGF0ZShyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5fKHByaW1hcnlLZXlKb2luQ29sdW1uKTsKKwkJCX0KKwkJfQorCQkKKwkJd2hpbGUgKHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSkgeworCQkJYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHN0YSkgeworCQlpZiAoIXNob3VsZEJ1aWxkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpIHsKKwkJCXNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihudWxsKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgPT0gbnVsbCkgeworCQkJdGhpcy5zZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihuZXcgTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbihzdGEpKSk7CisJCX0KKwkJZWxzZSB7CisJCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbi51cGRhdGUobmV3IE51bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oc3RhKSk7CisJCX0KKwl9CQorCQorCXByb3RlY3RlZCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbikgeworCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcywgdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKTsKKwkJcHJpbWFyeUtleUpvaW5Db2x1bW4uaW5pdGlhbGl6ZShyZXNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1uKTsKKwkJcmV0dXJuIHByaW1hcnlLZXlKb2luQ29sdW1uOworCX0KKwkKKworCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQlpZiAodGhpcy5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkpIHsKKwkJCXRoaXMudmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UobWVzc2FnZXMsIGFzdFJvb3QpOworCQl9CisJCWZvciAoSXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBzdHJlYW0gPSB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCXN0cmVhbS5uZXh0KCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQWdhaW5zdERhdGFiYXNlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlpZiAoICEgdGhpcy5oYXNSZXNvbHZlZENhdGFsb2coKSkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRywKKwkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldENhdGFsb2coKSwgdGhpcy5nZXROYW1lKCl9LCAKKwkJCQkJdGhpcywgCisJCQkJCXRoaXMuZ2V0Q2F0YWxvZ1RleHRSYW5nZShhc3RSb290KQorCQkJCSkKKwkJCSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmICggISB0aGlzLmhhc1Jlc29sdmVkU2NoZW1hKCkpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSwKKwkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldFNjaGVtYSgpLCB0aGlzLmdldE5hbWUoKX0sIAorCQkJCQl0aGlzLCAKKwkJCQkJdGhpcy5nZXRTY2hlbWFUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkpCisJCQkpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoICEgdGhpcy5pc1Jlc29sdmVkKCkpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX05BTUUsCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LCAKKwkJCQkJdGhpcywgCisJCQkJCXRoaXMuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KQorCQkJCSkKKwkJCSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKworCS8vICoqKioqKioqKiogY29kZSBjb21wbGV0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlmb3IgKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBjb2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkpIHsKKwkJCXJlc3VsdCA9IGNvbHVtbi5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCQorCS8vICoqKioqKioqKiogUEsgam9pbiBjb2x1bW4gb3duZXIgYWRhcHRlciAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcgorCQlpbXBsZW1lbnRzIEphdmFCYXNlSm9pbkNvbHVtbi5Pd25lcgorCXsKKwkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCQlyZXR1cm4gR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CisJCX0KKworCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS50aGlzLmdldEphdmFFbnRpdHkoKTsKKwkJfQorCisJCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKKwkJCXJldHVybiBHZW5lcmljSmF2YVNlY29uZGFyeVRhYmxlLnRoaXMuZ2V0RGJUYWJsZSgpOworCQl9CisKKwkJcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgeworCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeURiVGFibGUoKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCQlyZXR1cm4gR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS50aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9PSBqb2luQ29sdW1uOworCQl9CisJCQorCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgeworCQkJaWYgKGpvaW5Db2x1bW5zU2l6ZSgpICE9IDEpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXJldHVybiBnZXRKYXZhRW50aXR5KCkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKKworCQl9CisKKwkJcHJpdmF0ZSBpbnQgam9pbkNvbHVtbnNTaXplKCkgeworCQkJcmV0dXJuIEdlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUudGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7CisJCX0KKwkJCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmZmODY0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhU2VxdWVuY2VHZW5lcmF0b3I7CisKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RKYXZhU2VxdWVuY2VHZW5lcmF0b3IKK3sKKworCXB1YmxpYyBHZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwkvLyAqKioqKioqKioqIGRhdGFiYXNlIHN0dWZmICoqKioqKioqKioKKworCS8qKgorCSAqIFRoZSBKUEEgc3BlYyBkb2VzIG5vdCBhbGxvdyBhIHNlcXVlbmNlIHRvIGhhdmUgYSBzY2hlbWEuCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0U2NoZW1hKCk7CisJfQorCisJLyoqCisJICogVGhlIEpQQSBzcGVjIGRvZXMgbm90IGFsbG93IGEgc2VxdWVuY2UgdG8gaGF2ZSBhIGNhdGFsb2cuCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRDYXRhbG9nKCkgeworCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdENhdGFsb2coKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODFkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUYWJsZS5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVRhYmxlCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFUYWJsZQorCWltcGxlbWVudHMgSmF2YVRhYmxlCit7CisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworCisJcHVibGljIEdlbmVyaWNKYXZhVGFibGUoSmF2YUVudGl0eSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHByKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyID0gcHI7CisJCWluaXRpYWxpemUoZ2V0QW5ub3RhdGlvbigpKTsKKwl9CisKKwkvL3F1ZXJ5IGZvciB0aGUgdGFibGUgcmVzb3VyY2UgZXZlcnkgdGltZSBvbiBzZXR0ZXJzLgorCS8vY2FsbCBvbmUgc2V0dGVyIGFuZCB0aGUgdGFibGVSZXNvdXJjZSBjb3VsZCBjaGFuZ2UuIAorCS8vWW91IGNvdWxkIGNhbGwgbW9yZSB0aGFuIG9uZSBzZXR0ZXIgYmVmb3JlIHRoaXMgb2JqZWN0IGhhcyByZWNlaXZlZCBhbnkgbm90aWZpY2F0aW9uCisJLy9mcm9tIHRoZSBqYXZhIHJlc291cmNlIG1vZGVsCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFRhYmxlQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgeworCQkvL1RPRE8gZ2V0IHRoZSBOdWxsVGFibGUgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwgb3IgYnVpbGQgaXQgaGVyZSBpbiB0aGUgY29udGV4dCBtb2RlbD8/CisJCXJldHVybiAoVGFibGVBbm5vdGF0aW9uKSB0aGlzLnJlc291cmNlUGVyc2lzdGVudE1lbWJlci4KKwkJCQlnZXROb25OdWxsQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1Jlc291cmNlU3BlY2lmaWVkKCkgeworCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpLmlzU3BlY2lmaWVkKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUVudGl0eSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoSmF2YUVudGl0eSkgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCQorCXByb3RlY3RlZCBKYXZhRW50aXR5IGdldEphdmFFbnRpdHkoKSB7CisJCXJldHVybiBnZXRQYXJlbnQoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5nZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOworCX0KKworCS8qKgorCSAqIEp1c3QgdG8gcmVtZW1iZXI6CisJICogICBFbnRpdHkuZ2V0RGVmYXVsdFNjaGVtYSgpCisJICogICAgIGNoZWNrIGluaGVyaXRhbmNlIC0gZ2V0IGRlZmF1bHQgc2NoZW1hIGZyb20gcm9vdAorCSAqICAgRW50aXR5TWFwcGluZ3MuZ2V0U2NoZW1hKCkKKwkgKiAgICAgY2hlY2sgZm9yIHNwZWNpZmllZCBzY2hlbWEKKwkgKiAgIFBlcnNpc3RlbmNlVW5pdC5nZXREZWZhdWx0U2NoZW1hKCkKKwkgKiAgICAgT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkKKwkgKiAgIEpwYVByb2plY3QuZ2V0RGVmYXVsdFNjaGVtYSgpCisJICogICAgIGNoZWNrIGZvciB1c2VyIG92ZXJyaWRlIHByb2plY3Qgc2V0dGluZworCSAqICAgQ2F0YWxvZy5nZXREZWZhdWx0U2NoZW1hKCkKKwkgKiAgICAgb3IKKwkgKiAgIERhdGFiYXNlLmdldERlZmF1bHRTY2hlbWEoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy5nZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLmdldEphdmFFbnRpdHkoKS5nZXREZWZhdWx0Q2F0YWxvZygpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgPSBqcnBtOworCQl0aGlzLnVwZGF0ZShnZXRBbm5vdGF0aW9uKCkpOworCX0KKworCisJLy8qKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKSkgeworCQkJdGhpcy52YWxpZGF0ZUFnYWluc3REYXRhYmFzZShtZXNzYWdlcywgYXN0Um9vdCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFnYWluc3REYXRhYmFzZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJaWYgKCAhIHRoaXMuaGFzUmVzb2x2ZWRDYXRhbG9nKCkpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRywKKwkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldENhdGFsb2coKSwgdGhpcy5nZXROYW1lKCl9LCAKKwkJCQkJdGhpcywgCisJCQkJCXRoaXMuZ2V0Q2F0YWxvZ1RleHRSYW5nZShhc3RSb290KQorCQkJCSkKKwkJCSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmICggISB0aGlzLmhhc1Jlc29sdmVkU2NoZW1hKCkpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBQkxFX1VOUkVTT0xWRURfU0NIRU1BLAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0U2NoZW1hKCksIHRoaXMuZ2V0TmFtZSgpfSwgCisJCQkJCXRoaXMsIAorCQkJCQl0aGlzLmdldFNjaGVtYVRleHRSYW5nZShhc3RSb290KQorCQkJCSkKKwkJCSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmICggISB0aGlzLmlzUmVzb2x2ZWQoKSkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9OQU1FLAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwgCisJCQkJCXRoaXMsIAorCQkJCQl0aGlzLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkpCisJCQkpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVGFibGVHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjU5OGRmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVGFibGVHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDUzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOworCisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvcgorCWV4dGVuZHMgQWJzdHJhY3RKYXZhR2VuZXJhdG9yCisJaW1wbGVtZW50cyBKYXZhVGFibGVHZW5lcmF0b3IsIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIKK3sKKwlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFRhYmxlOworCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhYmxlOworCQorCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2NoZW1hOworCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYTsKKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENhdGFsb2c7CisJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFBrQ29sdW1uTmFtZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRQa0NvbHVtbk5hbWU7CisJCisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7CisJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWVDb2x1bW5OYW1lOworCQorCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRQa0NvbHVtblZhbHVlOworCQorCXByb3RlY3RlZCBmaW5hbCBMaXN0PEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50czsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCisKKwlwdWJsaWMgR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMudW5pcXVlQ29uc3RyYWludHMgPSBuZXcgQXJyYXlMaXN0PEphdmFVbmlxdWVDb25zdHJhaW50PigpOworCX0KKworCisJLy8gKioqKioqKioqKiB0YWJsZSAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVGFibGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFRhYmxlIDogdGhpcy5kZWZhdWx0VGFibGU7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVGFibGUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFRhYmxlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFRhYmxlKFN0cmluZyB0YWJsZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRUYWJsZTsKKwkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IHRhYmxlOworCQl0aGlzLmdldFJlc291cmNlR2VuZXJhdG9yKCkuc2V0VGFibGUodGFibGUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZLCBvbGQsIHRhYmxlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUYWJsZV8oU3RyaW5nIHRhYmxlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFRhYmxlOworCQl0aGlzLnNwZWNpZmllZFRhYmxlID0gdGFibGU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEFCTEVfUFJPUEVSVFksIG9sZCwgdGFibGUpOworCX0KKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHRhYmxlIGlzIGRldGVybWluZWQgYnkgdGhlIEpQQSBpbXBsZW1lbnRhdGlvbi4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhYmxlOworCX0KKworCisJLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRTY2hlbWEgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFNjaGVtYSA6IHRoaXMuZGVmYXVsdFNjaGVtYTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NoZW1hOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFNjaGVtYTsKKwkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBzY2hlbWE7CisJCXRoaXMuZ2V0UmVzb3VyY2VHZW5lcmF0b3IoKS5zZXRTY2hlbWEoc2NoZW1hKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWFfKFN0cmluZyBzY2hlbWEpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOworCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IHNjaGVtYTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRTY2hlbWE7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRTY2hlbWE7CisJCXRoaXMuZGVmYXVsdFNjaGVtYSA9IHNjaGVtYTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIGNhdGFsb2cgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQ2F0YWxvZyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA6IHRoaXMuZGVmYXVsdENhdGFsb2c7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDYXRhbG9nKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKKwkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gY2F0YWxvZzsKKwkJdGhpcy5nZXRSZXNvdXJjZUdlbmVyYXRvcigpLnNldENhdGFsb2coY2F0YWxvZyk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZ18oU3RyaW5nIGNhdGFsb2cpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKKwkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gY2F0YWxvZzsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRDYXRhbG9nOworCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gY2F0YWxvZzsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGNvbHVtbiBuYW1lICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0UGtDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWUgOiB0aGlzLmRlZmF1bHRQa0NvbHVtbk5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lOworCQl0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZSA9IG5hbWU7CisJCXRoaXMuZ2V0UmVzb3VyY2VHZW5lcmF0b3IoKS5zZXRQa0NvbHVtbk5hbWUobmFtZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUEtfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lXyhTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWU7CisJCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lID0gbmFtZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QS19DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBwcmltYXJ5IGtleSBjb2x1bW4gbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBKUEEKKwkgKiBpbXBsZW1lbnRhdGlvbi4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQa0NvbHVtbk5hbWUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRQa0NvbHVtbk5hbWU7CisJfQorCisKKwkvLyAqKioqKioqKioqIHZhbHVlIGNvbHVtbiBuYW1lICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUgOiB0aGlzLmRlZmF1bHRWYWx1ZUNvbHVtbk5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lOworCQl0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSA9IG5hbWU7CisJCXRoaXMuZ2V0UmVzb3VyY2VHZW5lcmF0b3IoKS5zZXRWYWx1ZUNvbHVtbk5hbWUobmFtZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lXyhTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7CisJCXRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lID0gbmFtZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9WQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZUNvbHVtbk5hbWUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZUNvbHVtbk5hbWU7CisJfQorCisKKwkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGNvbHVtbiB2YWx1ZSAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldFBrQ29sdW1uVmFsdWUoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlIDogdGhpcy5kZWZhdWx0UGtDb2x1bW5WYWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZTsKKwkJdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlID0gdmFsdWU7CisJCXRoaXMuZ2V0UmVzb3VyY2VHZW5lcmF0b3IoKS5zZXRQa0NvbHVtblZhbHVlKHZhbHVlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QS19DT0xVTU5fVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlOworCQl0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QS19DT0xVTU5fVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRQa0NvbHVtblZhbHVlOworCX0KKworCisJLy8gKioqKioqKioqKiB1bmlxdWUgY29uc3RyYWludHMgKioqKioqKioqKgorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50Pih0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKTsKKwl9CisJCisJcHVibGljIGludCB1bmlxdWVDb25zdHJhaW50c1NpemUoKSB7CisJCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnNpemUoKTsKKwl9CisJCisJcHVibGljIEphdmFVbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7CisJCUphdmFVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhVW5pcXVlQ29uc3RyYWludCh0aGlzLCB0aGlzKTsKKwkJdGhpcy51bmlxdWVDb25zdHJhaW50cy5hZGQoaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnQpOworCQlVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiA9IHRoaXMuZ2V0UmVzb3VyY2VHZW5lcmF0b3IoKS5hZGRVbmlxdWVDb25zdHJhaW50KGluZGV4KTsKKwkJdW5pcXVlQ29uc3RyYWludC5pbml0aWFsaXplKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKTsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKFVOSVFVRV9DT05TVFJBSU5UU19MSVNULCBpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7CisJCXJldHVybiB1bmlxdWVDb25zdHJhaW50OworCX0KKwkJCisJcHVibGljIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKKwkJdGhpcy5yZW1vdmVVbmlxdWVDb25zdHJhaW50KHRoaXMudW5pcXVlQ29uc3RyYWludHMuaW5kZXhPZih1bmlxdWVDb25zdHJhaW50KSk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKKwkJSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IHRoaXMudW5pcXVlQ29uc3RyYWludHMucmVtb3ZlKGluZGV4KTsKKwkJdGhpcy5nZXRSZXNvdXJjZUdlbmVyYXRvcigpLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW5kZXgpOworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChVTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnQpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl0aGlzLmdldFJlc291cmNlR2VuZXJhdG9yKCkubW92ZVVuaXF1ZUNvbnN0cmFpbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJdGhpcy5maXJlSXRlbU1vdmVkKFVOSVFVRV9DT05TVFJBSU5UU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4LCBKYXZhVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7CisJCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgdW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRVbmlxdWVDb25zdHJhaW50KEphdmFVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKKwkJdGhpcy5hZGRVbmlxdWVDb25zdHJhaW50KHRoaXMudW5pcXVlQ29uc3RyYWludHMuc2l6ZSgpLCB1bmlxdWVDb25zdHJhaW50KTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludF8oSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgeworCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdCh1bmlxdWVDb25zdHJhaW50LCB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCBVTklRVUVfQ09OU1RSQUlOVFNfTElTVCk7CisJfQorCisKKwkvLyoqKioqKioqKioqKioqKioqKiogVW5pcXVlQ29uc3RyYWludC5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioKKworCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZVVuaXF1ZUNvbnN0cmFpbnRDb2x1bW5OYW1lcygpIHsKKwkJb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGRiVGFibGUgPSB0aGlzLmdldERiVGFibGUoKTsKKwkJcmV0dXJuIChkYlRhYmxlICE9IG51bGwpID8gZGJUYWJsZS5zb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpIDogRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHJlc291cmNlID0+IGNvbnRleHQgKioqKioqKioqKgorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSB7CisJCXN1cGVyLmluaXRpYWxpemUodGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKTsKKwkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRUYWJsZSgpOworCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSB0aGlzLmJ1aWxkRGVmYXVsdFNjaGVtYSgpOworCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRTY2hlbWEoKTsKKwkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZygpOworCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSB0YWJsZUdlbmVyYXRvckFubm90YXRpb24uZ2V0Q2F0YWxvZygpOworCQl0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZSA9IHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRQa0NvbHVtbk5hbWUoKTsKKwkJdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUgPSB0YWJsZUdlbmVyYXRvckFubm90YXRpb24uZ2V0VmFsdWVDb2x1bW5OYW1lKCk7CisJCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSA9IHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRQa0NvbHVtblZhbHVlKCk7CisJCXRoaXMuaW5pdGlhbGl6ZVVuaXF1ZUNvbnN0cmFpbnRzKHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVVuaXF1ZUNvbnN0cmFpbnRzKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24pIHsKKwkJZm9yIChJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gc3RyZWFtID0gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJdGhpcy51bmlxdWVDb25zdHJhaW50cy5hZGQodGhpcy5idWlsZFVuaXF1ZUNvbnN0cmFpbnQoc3RyZWFtLm5leHQoKSkpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24pIHsKKwkJc3VwZXIudXBkYXRlKHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbik7CisJCXRoaXMuc2V0U3BlY2lmaWVkVGFibGVfKHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRUYWJsZSgpKTsKKwkJdGhpcy5zZXREZWZhdWx0U2NoZW1hKHRoaXMuYnVpbGREZWZhdWx0U2NoZW1hKCkpOworCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8odGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmdldFNjaGVtYSgpKTsKKwkJdGhpcy5zZXREZWZhdWx0Q2F0YWxvZyh0aGlzLmJ1aWxkRGVmYXVsdENhdGFsb2coKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18odGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmdldENhdGFsb2coKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lXyh0YWJsZUdlbmVyYXRvckFubm90YXRpb24uZ2V0UGtDb2x1bW5OYW1lKCkpOworCQl0aGlzLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZV8odGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmdldFZhbHVlQ29sdW1uTmFtZSgpKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlXyh0YWJsZUdlbmVyYXRvckFubm90YXRpb24uZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKKwkJdGhpcy51cGRhdGVVbmlxdWVDb25zdHJhaW50cyh0YWJsZUdlbmVyYXRvckFubm90YXRpb24pOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFNjaGVtYSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRTY2hlbWEoKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0Q2F0YWxvZygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24pIHsKKwkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiBjb250ZXh0Q29uc3RyYWludHMgPSB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKCk7CisJCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gcmVzb3VyY2VDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOworCQkKKwkJd2hpbGUgKGNvbnRleHRDb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKKwkJCUphdmFVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgPSBjb250ZXh0Q29uc3RyYWludHMubmV4dCgpOworCQkJaWYgKHJlc291cmNlQ29uc3RyYWludHMuaGFzTmV4dCgpKSB7CisJCQkJdW5pcXVlQ29uc3RyYWludC51cGRhdGUocmVzb3VyY2VDb25zdHJhaW50cy5uZXh0KCkpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlVW5pcXVlQ29uc3RyYWludF8odW5pcXVlQ29uc3RyYWludCk7CisJCQl9CisJCX0KKwkJCisJCXdoaWxlIChyZXNvdXJjZUNvbnN0cmFpbnRzLmhhc05leHQoKSkgeworCQkJYWRkVW5pcXVlQ29uc3RyYWludChidWlsZFVuaXF1ZUNvbnN0cmFpbnQocmVzb3VyY2VDb25zdHJhaW50cy5uZXh0KCkpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBKYXZhVW5pcXVlQ29uc3RyYWludCBidWlsZFVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pIHsKKwkJSmF2YVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IGdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFVbmlxdWVDb25zdHJhaW50KHRoaXMsIHRoaXMpOworCQl1bmlxdWVDb25zdHJhaW50LmluaXRpYWxpemUodW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pOworCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludDsKKwl9CisKKworCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgorCisJcHVibGljIFRhYmxlIGdldERiVGFibGUoKSB7CisJCVNjaGVtYSBkYlNjaGVtYSA9IHRoaXMuZ2V0RGJTY2hlbWEoKTsKKwkJcmV0dXJuIChkYlNjaGVtYSA9PSBudWxsKSA/IG51bGwgOiBkYlNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIodGhpcy5nZXRUYWJsZSgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogSmF2YSBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJZm9yIChKYXZhVW5pcXVlQ29uc3RyYWludCBjb25zdHJhaW50IDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMudW5pcXVlQ29uc3RyYWludHMoKSkpIHsKKwkJCXJlc3VsdCA9IGNvbnN0cmFpbnQuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBjYWxsZWQgaWYgdGhlIGRhdGFiYXNlIGlzIGNvbm5lY3RlZDoKKwkgKiB0YWJsZSwgc2NoZW1hLCBjYXRhbG9nLCBwa0NvbHVtbk5hbWUsIHZhbHVlQ29sdW1uTmFtZQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5jb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlpZiAodGhpcy50YWJsZVRvdWNoZXMocG9zLCBhc3RSb290KSkgeworCQkJcmV0dXJuIHRoaXMuamF2YUNhbmRpZGF0ZVRhYmxlcyhmaWx0ZXIpOworCQl9CisJCWlmICh0aGlzLnNjaGVtYVRvdWNoZXMocG9zLCBhc3RSb290KSkgeworCQkJcmV0dXJuIHRoaXMuamF2YUNhbmRpZGF0ZVNjaGVtYXRhKGZpbHRlcik7CisJCX0KKwkJaWYgKHRoaXMuY2F0YWxvZ1RvdWNoZXMocG9zLCBhc3RSb290KSkgeworCQkJcmV0dXJuIHRoaXMuamF2YUNhbmRpZGF0ZUNhdGFsb2dzKGZpbHRlcik7CisJCX0KKwkJaWYgKHRoaXMucGtDb2x1bW5OYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7CisJCQlyZXR1cm4gdGhpcy5qYXZhQ2FuZGlkYXRlQ29sdW1uTmFtZXMoZmlsdGVyKTsKKwkJfQorCQlpZiAodGhpcy52YWx1ZUNvbHVtbk5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKKwkJCXJldHVybiB0aGlzLmphdmFDYW5kaWRhdGVDb2x1bW5OYW1lcyhmaWx0ZXIpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8vICoqKioqKioqKiogY29kZSBhc3Npc3Q6IHRhYmxlCisJCisJcHJvdGVjdGVkIGJvb2xlYW4gdGFibGVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldFJlc291cmNlR2VuZXJhdG9yKCkudGFibGVUb3VjaGVzKHBvcywgYXN0Um9vdCk7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNhbmRpZGF0ZVRhYmxlcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKKwkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmNhbmRpZGF0ZVRhYmxlcyhmaWx0ZXIpKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVUYWJsZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMuY2FuZGlkYXRlVGFibGVzKCksIGZpbHRlcik7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlVGFibGVzKCkgeworCQlTY2hlbWEgZGJTY2hlbWEgPSB0aGlzLmdldERiU2NoZW1hKCk7CisJCXJldHVybiAoZGJTY2hlbWEgIT0gbnVsbCkgPyBkYlNjaGVtYS5zb3J0ZWRUYWJsZUlkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+IGluc3RhbmNlKCk7CisJfQorCisJLy8gKioqKioqKioqKiBjb2RlIGFzc2lzdDogc2NoZW1hCisJCisJcHJvdGVjdGVkIGJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUdlbmVyYXRvcigpLnNjaGVtYVRvdWNoZXMocG9zLCBhc3RSb290KTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ2FuZGlkYXRlU2NoZW1hdGEoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5jYW5kaWRhdGVTY2hlbWF0YShmaWx0ZXIpKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVTY2hlbWF0YShGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKKwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odGhpcy5jYW5kaWRhdGVTY2hlbWF0YSgpLCBmaWx0ZXIpOworCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZVNjaGVtYXRhKCkgeworCQlTY2hlbWFDb250YWluZXIgc2NoZW1hQ29udGFpbmVyID0gdGhpcy5nZXREYlNjaGVtYUNvbnRhaW5lcigpOworCQlyZXR1cm4gKHNjaGVtYUNvbnRhaW5lciAhPSBudWxsKSA/IHNjaGVtYUNvbnRhaW5lci5zb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpIDogRW1wdHlJdGVyYXRvci48U3RyaW5nPiBpbnN0YW5jZSgpOworCX0KKworCS8vICoqKioqKioqKiogY29kZSBhc3Npc3Q6IGNhdGFsb2cKKworCXByb3RlY3RlZCBib29sZWFuIGNhdGFsb2dUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldFJlc291cmNlR2VuZXJhdG9yKCkuY2F0YWxvZ1RvdWNoZXMocG9zLCBhc3RSb290KTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ2FuZGlkYXRlQ2F0YWxvZ3MoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5jYW5kaWRhdGVDYXRhbG9ncyhmaWx0ZXIpKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVDYXRhbG9ncyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKKwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odGhpcy5jYW5kaWRhdGVDYXRhbG9ncygpLCBmaWx0ZXIpOworCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZUNhdGFsb2dzKCkgeworCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwkJcmV0dXJuIChkYiAhPSBudWxsKSA/IGRiLnNvcnRlZENhdGFsb2dJZGVudGlmaWVycygpIDogRW1wdHlJdGVyYXRvci48U3RyaW5nPiBpbnN0YW5jZSgpOworCX0KKworCS8vICoqKioqKioqKiogY29kZSBhc3Npc3Q6IHBrQ29sdW1uTmFtZQorCisJcHJvdGVjdGVkIGJvb2xlYW4gcGtDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUdlbmVyYXRvcigpLnBrQ29sdW1uTmFtZVRvdWNoZXMocG9zLCBhc3RSb290KTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ2FuZGlkYXRlQ29sdW1uTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5jYW5kaWRhdGVDb2x1bW5OYW1lcyhmaWx0ZXIpKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVDb2x1bW5OYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKKwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odGhpcy5jYW5kaWRhdGVDb2x1bW5OYW1lcygpLCBmaWx0ZXIpOworCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZUNvbHVtbk5hbWVzKCkgeworCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGJUYWJsZSgpOworCQlyZXR1cm4gKHRhYmxlICE9IG51bGwpID8gdGFibGUuc29ydGVkQ29sdW1uSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmF0b3IuPFN0cmluZz4gaW5zdGFuY2UoKTsKKwl9CisKKwkvLyAqKioqKioqKioqIGNvZGUgYXNzaXN0OiB2YWx1ZUNvbHVtbk5hbWUKKworCXByb3RlY3RlZCBib29sZWFuIHZhbHVlQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VHZW5lcmF0b3IoKS52YWx1ZUNvbHVtbk5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZXRSZXNvdXJjZUdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHN1cGVyLmdldFJlc291cmNlR2VuZXJhdG9yKCk7CisJfQorCisJcHVibGljIGludCBnZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkgeworCQlyZXR1cm4gREVGQVVMVF9JTklUSUFMX1ZBTFVFOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVGVtcG9yYWxDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVRlbXBvcmFsQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyOTgzZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVRlbXBvcmFsQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGVtcG9yYWxDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVGVtcG9yYWxDb252ZXJ0ZXIgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgSmF2YVRlbXBvcmFsQ29udmVydGVyCit7CisJcHJpdmF0ZSBUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlOworCQorCXByaXZhdGUgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CisJCisJcHVibGljIEdlbmVyaWNKYXZhVGVtcG9yYWxDb252ZXJ0ZXIoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5pbml0aWFsaXplKGpycGEpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoSmF2YUF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiBDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkVG9SZXNvdXJjZU1vZGVsKCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbCgpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbFR5cGUoKSB7CisJCXJldHVybiB0aGlzLnRlbXBvcmFsVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsVHlwZSkgeworCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWxUeXBlID0gdGhpcy50ZW1wb3JhbFR5cGU7CisJCXRoaXMudGVtcG9yYWxUeXBlID0gbmV3VGVtcG9yYWxUeXBlOworCQl0aGlzLmdldFJlc291cmNlVGVtcG9yYWwoKS5zZXRWYWx1ZShUZW1wb3JhbFR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChuZXdUZW1wb3JhbFR5cGUpKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChURU1QT1JBTF9UWVBFX1BST1BFUlRZLCBvbGRUZW1wb3JhbFR5cGUsIG5ld1RlbXBvcmFsVHlwZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFRlbXBvcmFsVHlwZV8oVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsVHlwZSkgeworCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWxUeXBlID0gdGhpcy50ZW1wb3JhbFR5cGU7CisJCXRoaXMudGVtcG9yYWxUeXBlID0gbmV3VGVtcG9yYWxUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRFTVBPUkFMX1RZUEVfUFJPUEVSVFksIG9sZFRlbXBvcmFsVHlwZSwgbmV3VGVtcG9yYWxUeXBlKTsKKwl9CisKKworCXByb3RlY3RlZCBUZW1wb3JhbEFubm90YXRpb24gZ2V0UmVzb3VyY2VUZW1wb3JhbCgpIHsKKwkJcmV0dXJuIChUZW1wb3JhbEFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLgorCQkJCWdldEFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqcnBhOworCQl0aGlzLnRlbXBvcmFsVHlwZSA9IHRoaXMudGVtcG9yYWxUeXBlKGdldFJlc291cmNlVGVtcG9yYWwoKSk7CisJfQkKKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0ganJwYTsKKwkJdGhpcy5zZXRUZW1wb3JhbFR5cGVfKHRoaXMudGVtcG9yYWxUeXBlKGdldFJlc291cmNlVGVtcG9yYWwoKSkpOworCX0JCisJCisJcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSB0ZW1wb3JhbFR5cGUoVGVtcG9yYWxBbm5vdGF0aW9uIHJlc291cmNlVGVtcG9yYWwpIHsKKwkJcmV0dXJuIHJlc291cmNlVGVtcG9yYWwgPT0gbnVsbCA/IG51bGwgOiBUZW1wb3JhbFR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKHJlc291cmNlVGVtcG9yYWwuZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldFJlc291cmNlVGVtcG9yYWwoKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVHJhbnNpZW50TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVHJhbnNpZW50TWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZjdhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUcmFuc2llbnRNYXBwaW5nLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVHJhbnNpZW50TWFwcGluZworCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxUcmFuc2llbnRBbm5vdGF0aW9uPgorCWltcGxlbWVudHMgSmF2YVRyYW5zaWVudE1hcHBpbmcKK3sKKwlwdWJsaWMgR2VuZXJpY0phdmFUcmFuc2llbnRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqICAKKworCUBPdmVycmlkZQorCXB1YmxpYyBNZXRhbW9kZWxGaWVsZCBnZXRNZXRhbW9kZWxGaWVsZCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFVbmlxdWVDb25zdHJhaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFVbmlxdWVDb25zdHJhaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQyNDZjNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVVuaXF1ZUNvbnN0cmFpbnQuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFVbmlxdWVDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIEphdmFVbmlxdWVDb25zdHJhaW50Cit7CisKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxTdHJpbmc+IGNvbHVtbk5hbWVzOworCisJcHJvdGVjdGVkIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHJlc291cmNlVW5pcXVlQ29uc3RyYWludDsKKwkKKwlwcm90ZWN0ZWQgT3duZXIgb3duZXI7CisJcHVibGljIEdlbmVyaWNKYXZhVW5pcXVlQ29uc3RyYWludChKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPd25lciBvd25lcikgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLm93bmVyID0gb3duZXI7CisJCXRoaXMuY29sdW1uTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwl9CisKKwlwdWJsaWMgT3duZXIgZ2V0T3duZXIoKSB7CisJCXJldHVybiB0aGlzLm93bmVyOworCX0KKwkKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmNvbHVtbk5hbWVzKTsKKwl9CisKKwlwdWJsaWMgaW50IGNvbHVtbk5hbWVzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uTmFtZXMuc2l6ZSgpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZENvbHVtbk5hbWUoaW50IGluZGV4LCBTdHJpbmcgY29sdW1uTmFtZSkgeworCQl0aGlzLmNvbHVtbk5hbWVzLmFkZChpbmRleCwgY29sdW1uTmFtZSk7CisJCXRoaXMucmVzb3VyY2VVbmlxdWVDb25zdHJhaW50LmFkZENvbHVtbk5hbWUoaW5kZXgsIGNvbHVtbk5hbWUpOworCQlmaXJlSXRlbUFkZGVkKFVuaXF1ZUNvbnN0cmFpbnQuQ09MVU1OX05BTUVTX0xJU1QsIGluZGV4LCBjb2x1bW5OYW1lKTsJCQorCX0JCisJCisJcHJvdGVjdGVkIHZvaWQgYWRkQ29sdW1uTmFtZV8oaW50IGluZGV4LCBTdHJpbmcgY29sdW1uTmFtZSkgeworCQl0aGlzLmNvbHVtbk5hbWVzLmFkZChpbmRleCwgY29sdW1uTmFtZSk7CisJCWZpcmVJdGVtQWRkZWQoVW5pcXVlQ29uc3RyYWludC5DT0xVTU5fTkFNRVNfTElTVCwgaW5kZXgsIGNvbHVtbk5hbWUpOwkJCisJfQkKKworCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbk5hbWUoU3RyaW5nIGNvbHVtbk5hbWUpIHsKKwkJdGhpcy5yZW1vdmVDb2x1bW5OYW1lKHRoaXMuY29sdW1uTmFtZXMuaW5kZXhPZihjb2x1bW5OYW1lKSk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uTmFtZShpbnQgaW5kZXgpIHsKKwkJU3RyaW5nIHJlbW92ZWRDb2x1bW5OYW1lID0gdGhpcy5jb2x1bW5OYW1lcy5yZW1vdmUoaW5kZXgpOworCQl0aGlzLnJlc291cmNlVW5pcXVlQ29uc3RyYWludC5yZW1vdmVDb2x1bW5OYW1lKGluZGV4KTsKKwkJZmlyZUl0ZW1SZW1vdmVkKFVuaXF1ZUNvbnN0cmFpbnQuQ09MVU1OX05BTUVTX0xJU1QsIGluZGV4LCByZW1vdmVkQ29sdW1uTmFtZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbHVtbk5hbWVfKGludCBpbmRleCkgeworCQlTdHJpbmcgcmVtb3ZlZENvbHVtbk5hbWUgPSB0aGlzLmNvbHVtbk5hbWVzLnJlbW92ZShpbmRleCk7CisJCWZpcmVJdGVtUmVtb3ZlZChVbmlxdWVDb25zdHJhaW50LkNPTFVNTl9OQU1FU19MSVNULCBpbmRleCwgcmVtb3ZlZENvbHVtbk5hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVDb2x1bW5OYW1lKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuY29sdW1uTmFtZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCXRoaXMucmVzb3VyY2VVbmlxdWVDb25zdHJhaW50Lm1vdmVDb2x1bW5OYW1lKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCWZpcmVJdGVtTW92ZWQoVW5pcXVlQ29uc3RyYWludC5DT0xVTU5fTkFNRVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQorCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdWNhKSB7CisJCXRoaXMucmVzb3VyY2VVbmlxdWVDb25zdHJhaW50ID0gdWNhOworCQl0aGlzLmluaXRpYWxpemVDb2x1bW5OYW1lcyh1Y2EpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29sdW1uTmFtZXMoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdWNhKSB7CisJCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGFubm90YXRpb25Db2x1bW5OYW1lcyA9IHVjYS5jb2x1bW5OYW1lcygpOworCQkKKwkJZm9yIChTdHJpbmcgcmVzb3VyY2VDb2x1bW5OYW1lIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFubm90YXRpb25Db2x1bW5OYW1lcykpIHsKKwkJCXRoaXMuY29sdW1uTmFtZXMuYWRkKHJlc291cmNlQ29sdW1uTmFtZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdWNhKSB7CisJCXRoaXMucmVzb3VyY2VVbmlxdWVDb25zdHJhaW50ID0gdWNhOworCQl0aGlzLnVwZGF0ZUNvbHVtbk5hbWVzKHVjYSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29sdW1uTmFtZXMoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdWNhKSB7CisJCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGFubm90YXRpb25Db2x1bW5OYW1lcyA9IHVjYS5jb2x1bW5OYW1lcygpOworCQkKKwkJaW50IGluZGV4ID0gMDsKKwkJZm9yIChTdHJpbmcgcmVzb3VyY2VDb2x1bW5OYW1lIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFubm90YXRpb25Db2x1bW5OYW1lcykpIHsKKwkJCWlmIChjb2x1bW5OYW1lc1NpemUoKSA+IGluZGV4KSB7CisJCQkJaWYgKHRoaXMuY29sdW1uTmFtZXMuZ2V0KGluZGV4KSAhPSByZXNvdXJjZUNvbHVtbk5hbWUpIHsKKwkJCQkJYWRkQ29sdW1uTmFtZV8oaW5kZXgsIHJlc291cmNlQ29sdW1uTmFtZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJYWRkQ29sdW1uTmFtZV8oaW5kZXgsIHJlc291cmNlQ29sdW1uTmFtZSk7CQkJCisJCQl9CisJCQlpbmRleCsrOworCQl9CisJCQorCQlmb3IgKCA7IGluZGV4IDwgY29sdW1uTmFtZXNTaXplKCk7ICkgeworCQkJcmVtb3ZlQ29sdW1uTmFtZV8oaW5kZXgpOworCQl9CisJfQorCisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VVbmlxdWVDb25zdHJhaW50LmdldFRleHRSYW5nZShhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLmNvbHVtbk5hbWVzKTsKKwl9CisKKworCS8vICoqKioqKioqKiogY29kZS1hc3Npc3QgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY29ubmVjdGVkSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmNvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWlmICh0aGlzLmNvbHVtbk5hbWVzVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7CisJCQlyZXR1cm4gdGhpcy5qYXZhQ2FuZGlkYXRlQ29sdW1uTmFtZXMoZmlsdGVyKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY29sdW1uTmFtZXNUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlVW5pcXVlQ29uc3RyYWludC5jb2x1bW5OYW1lc1RvdWNoZXMocG9zLCBhc3RSb290KTsKKwl9CisKKwlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNhbmRpZGF0ZUNvbHVtbk5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgeworCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKHRoaXMuY2FuZGlkYXRlQ29sdW1uTmFtZXMoZmlsdGVyKSk7CisJfQorCisJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZUNvbHVtbk5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgeworCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPih0aGlzLmNhbmRpZGF0ZUNvbHVtbk5hbWVzKCksIGZpbHRlcik7CisJfQorCisJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZUNvbHVtbk5hbWVzKCkgeworCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmNhbmRpZGF0ZVVuaXF1ZUNvbnN0cmFpbnRDb2x1bW5OYW1lcygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVZlcnNpb25NYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5ODlhYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVZlcnNpb25NYXBwaW5nLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhVmVyc2lvbk1hcHBpbmc7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0SmF2YVZlcnNpb25NYXBwaW5nCit7CisKKwlwdWJsaWMgR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9OdWxsSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9OdWxsSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTA1YzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL051bGxKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKKworcHVibGljIGNsYXNzIE51bGxKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCisJaW1wbGVtZW50cyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcgoreworCXByb3RlY3RlZCBmaW5hbCBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyIG93bmVyOworCQorCXB1YmxpYyBOdWxsSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciBvd25lcikgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLm93bmVyID0gb3duZXI7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKKwkJLy8gbm8tb3AKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIganJwbSkgeworCQkvLyBuby1vcAorCX0KKwkKKwlwdWJsaWMgT3duZXIgZ2V0T3duZXIoKSB7CisJCXJldHVybiB0aGlzLm93bmVyOworCX0KKworCXB1YmxpYyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIExpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMoKSB7CisJCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOworCX0KKwkKKwlwdWJsaWMgaW50IGFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcHVibGljICBMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHsKKwkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7CisJfQorCQorCXB1YmxpYyBpbnQgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHsKKwkJcmV0dXJuIDA7CisJfQorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgeworCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwl9CisJCisJcHVibGljIGludCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB7CisJCXJldHVybiAwOworCX0KKwkKKwlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkKKwkvLyoqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzM4ZDVjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL1ZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlMV8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24KKwlleHRlbmRzIFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbgoreworCQorCXB1YmxpYyBWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIFN0cmluZyBuYW1lLCBKb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5KSB7CisJCXN1cGVyKHBhcmVudCwgbmFtZSwgam9pbmluZ1N0cmF0ZWd5KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNFbnRpdHlNYXBwaW5ncy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY0VudGl0eU1hcHBpbmdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5ZDBiNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNFbnRpdHlNYXBwaW5ncy5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0RW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY0VudGl0eU1hcHBpbmdzCisJZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzCit7CisJcHVibGljIEdlbmVyaWNFbnRpdHlNYXBwaW5ncyhPcm1YbWwgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZSkgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBsYXRlc3REb2N1bWVudFZlcnNpb24oKSB7CisJCXJldHVybiBnZXRKcGFQbGF0Zm9ybSgpLmdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoCisJCQkJSnB0Q29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSkuZ2V0VmVyc2lvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NzQzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgT3JtQXNzb2NpYXRpb25PdmVycmlkZQoreworCXByb3RlY3RlZCBmaW5hbCBBc3NvY2lhdGlvbk92ZXJyaWRlLk93bmVyIG93bmVyOworCisJcHJvdGVjdGVkIHRyYW5zaWVudCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZTsKKworCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKKworCXByb3RlY3RlZCBmaW5hbCBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlIHJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKKworCisJcHVibGljIEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlKE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgcGFyZW50LCBBc3NvY2lhdGlvbk92ZXJyaWRlLk93bmVyIG93bmVyLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5vd25lciA9IG93bmVyOworCQl0aGlzLnJlbGF0aW9uc2hpcFJlZmVyZW5jZSA9IGJ1aWxkUmVsYXRpb25zaGlwUmVmZXJlbmNlKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQl0aGlzLnJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZSA9IHhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CisJCXRoaXMubmFtZSA9IHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBidWlsZFJlbGF0aW9uc2hpcFJlZmVyZW5jZShYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJcmV0dXJuIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSh0aGlzLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oQXNzb2NpYXRpb25PdmVycmlkZSBvbGRBc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCXRoaXMuc2V0TmFtZShvbGRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXRoaXMucmVsYXRpb25zaGlwUmVmZXJlbmNlLmluaXRpYWxpemVGcm9tKG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKKwkJcmV0dXJuIGdldE93bmVyKCkuaXNWaXJ0dWFsKHRoaXMpOworCX0KKwkKKwlwdWJsaWMgT3JtQXNzb2NpYXRpb25PdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCkgeworCQlyZXR1cm4gKE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUpIGdldE93bmVyKCkuc2V0VmlydHVhbCh2aXJ0dWFsLCB0aGlzKTsKKwl9CisJCisJcHVibGljIE93bmVyIGdldE93bmVyKCkgeworCQlyZXR1cm4gdGhpcy5vd25lcjsKKwl9CisKKwlwdWJsaWMgT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiB0aGlzLnJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKKwl9CisJCisJLy8gKioqKioqKioqKiBBc3NvY2lhdGlvbk92ZXJyaWRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKKwkJdGhpcy5uYW1lID0gbmV3TmFtZTsKKwkJdGhpcy5yZXNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShuZXdOYW1lKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlT3ZlcnJpZGUuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5ld05hbWUpIHsKKwkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7CisJCXRoaXMubmFtZSA9IG5ld05hbWU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZU92ZXJyaWRlLk5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhhbykgeworCQl0aGlzLnJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZSA9IHhhbzsKKwkJdGhpcy5zZXROYW1lXyh4YW8uZ2V0TmFtZSgpKTsKKwkJdGhpcy5yZWxhdGlvbnNoaXBSZWZlcmVuY2UudXBkYXRlKHhhbyk7CisJfQkKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwZmZlMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSwzNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIKK3sKKwlwcm90ZWN0ZWQgZmluYWwgWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciByZXNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CisJCisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXM7CisKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXM7CisKKwlwcm90ZWN0ZWQgZmluYWwgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciBvd25lcjsKKwkKKwlwdWJsaWMgR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyIG93bmVyLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIHJlc291cmNlKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMub3duZXIgPSBvd25lcjsKKwkJdGhpcy5yZXNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgPSByZXNvdXJjZTsKKwkJdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4oKTsKKwkJdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgQXJyYXlMaXN0PE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+KCk7CisJCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCXRoaXMuaW5pdGlhbGl6ZVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCX0KKworCXB1YmxpYyBPd25lciBnZXRPd25lcigpIHsKKwkJcmV0dXJuIHRoaXMub3duZXI7CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+KHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCksIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKKwl9CisKKwlwdWJsaWMgaW50IGFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgKyB0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKTsKKwl9CisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPih0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyk7CisJfQorCQorCXB1YmxpYyBpbnQgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLnNpemUoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUoT3JtQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCWFkZEl0ZW1Ub0xpc3QoYXNzb2NpYXRpb25PdmVycmlkZSwgdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMsIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZShPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KGFzc29jaWF0aW9uT3ZlcnJpZGUsIHRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLCBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNUKTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgc2V0QXNzb2NpYXRpb25PdmVycmlkZVZpcnR1YWwoYm9vbGVhbiB2aXJ0dWFsLCBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJaWYgKHZpcnR1YWwpIHsKKwkJCXJldHVybiBzZXRBc3NvY2lhdGlvbk92ZXJyaWRlVmlydHVhbChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJfQorCQlyZXR1cm4gc2V0QXNzb2NpYXRpb25PdmVycmlkZVNwZWNpZmllZChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgc2V0QXNzb2NpYXRpb25PdmVycmlkZVZpcnR1YWwoT3JtQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCWludCBpbmRleCA9IHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaW5kZXhPZihhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5yZW1vdmUoaW5kZXgpOworCQlTdHJpbmcgYXNzb2NpYXRpb25PdmVycmlkZU5hbWUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKTsKKwkJLy9hZGQgdGhlIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlIHNvIHRoYXQgSSBjYW4gY29udHJvbCB0aGUgb3JkZXIgdGhhdCBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlzIHNlbnQuCisJCS8vb3RoZXJ3aXNlIHdoZW4gd2UgcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGZyb20gamF2YSB3ZSB3aWxsIGdldCBhbiB1cGRhdGUgYW5kIGFkZCB0aGUgYXR0cmlidXRlIG92ZXJyaWRlCisJCS8vZHVyaW5nIHRoZSB1ZHBhdGUuICBUaGlzIGNhdXNlcyB0aGUgVUkgdG8gYmUgZmxha3ksIHNpbmNlIGNoYW5nZSBub3RpZmljYXRpb24gbWlnaHQgbm90IG9jY3VyIGluIHRoZSBjb3JyZWN0IG9yZGVyCisJCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBudWxsOworCQlpZiAoYXNzb2NpYXRpb25PdmVycmlkZU5hbWUgIT0gbnVsbCkgeworCQkJZm9yIChTdHJpbmcgbmFtZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSkpIHsKKwkJCQlpZiAobmFtZS5lcXVhbHMoYXNzb2NpYXRpb25PdmVycmlkZU5hbWUpKSB7CisJCQkJCS8vc3RvcmUgdGhlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHNvIHdlIGNhbiBmaXJlIGNoYW5nZSBub3RpZmljYXRpb24gbGF0ZXIKKwkJCQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBidWlsZFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUpOworCQkJCQl0aGlzLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5hZGQodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXRoaXMucmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKGluZGV4KTsKKwkJZmlyZUl0ZW1SZW1vdmVkKFNQRUNJRklFRF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCwgaW5kZXgsIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQkKKwkJaWYgKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlICE9IG51bGwpIHsKKwkJCWZpcmVJdGVtQWRkZWQoVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIC0gMSwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQl9CisJCXJldHVybiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgc2V0QXNzb2NpYXRpb25PdmVycmlkZVNwZWNpZmllZChPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJaW50IGluZGV4ID0gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCk7CisJCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGJ1aWxkUmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlKCk7CisJCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgbmV3QXNzb2NpYXRpb25PdmVycmlkZSA9IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZSh4bWxBc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5hZGQoaW5kZXgsIG5ld0Fzc29jaWF0aW9uT3ZlcnJpZGUpOworCQkKKwkJdGhpcy5yZXNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoeG1sQXNzb2NpYXRpb25PdmVycmlkZSk7CisJCQorCQlpbnQgZGVmYXVsdEluZGV4ID0gdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaW5kZXhPZihvbGRBc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJdGhpcy52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMucmVtb3ZlKGRlZmF1bHRJbmRleCk7CisKKwkJbmV3QXNzb2NpYXRpb25PdmVycmlkZS5pbml0aWFsaXplRnJvbShvbGRBc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJCisJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QsIGRlZmF1bHRJbmRleCwgb2xkQXNzb2NpYXRpb25PdmVycmlkZSk7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChTUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBuZXdBc3NvY2lhdGlvbk92ZXJyaWRlKTsJCQorCisJCXJldHVybiBuZXdBc3NvY2lhdGlvbk92ZXJyaWRlOworCX0KKwkKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+KHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMpOworCX0KKworCXB1YmxpYyBpbnQgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5zaXplKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShpbnQgaW5kZXgsIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgeworCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBhc3NvY2lhdGlvbk92ZXJyaWRlLCB0aGlzLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLCBTUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgeworCQl0aGlzLmFkZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUodGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5zaXplKCksIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlXyhPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KGFzc29jaWF0aW9uT3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMsIFNQRUNJRklFRF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCk7CisJfQorCQorCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCXRoaXMucmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQlmaXJlSXRlbU1vdmVkKFNQRUNJRklFRF9BU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQorCX0KKworCXB1YmxpYyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gKE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUpIGdldE92ZXJyaWRlTmFtZWQobmFtZSwgYXNzb2NpYXRpb25PdmVycmlkZXMoKSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gY29udGFpbnNBc3NvY2lhdGlvbk92ZXJyaWRlKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIGFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOworCX0KKworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc0RlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKKwl9CisKKwlwcml2YXRlIEJhc2VPdmVycmlkZSBnZXRPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lLCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEJhc2VPdmVycmlkZT4gb3ZlcnJpZGVzKSB7CisJCWZvciAoQmFzZU92ZXJyaWRlIG92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG92ZXJyaWRlcykpIHsKKwkJCVN0cmluZyBvdmVycmlkZU5hbWUgPSBvdmVycmlkZS5nZXROYW1lKCk7CisJCQlpZiAob3ZlcnJpZGVOYW1lID09IG51bGwgJiYgbmFtZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG92ZXJyaWRlOworCQkJfQorCQkJaWYgKG92ZXJyaWRlTmFtZSAhPSBudWxsICYmIG92ZXJyaWRlTmFtZS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gb3ZlcnJpZGU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zT3ZlcnJpZGUoU3RyaW5nIG5hbWUsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgQmFzZU92ZXJyaWRlPiBvdmVycmlkZXMpIHsKKwkJcmV0dXJuIGdldE92ZXJyaWRlTmFtZWQobmFtZSwgb3ZlcnJpZGVzKSAhPSBudWxsOworCX0KKwkKKworCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHsKKwkJVHlwZU1hcHBpbmcgb3ZlcnJpZGFibGVUeXBlTWFwcGluZyA9IGdldE93bmVyKCkuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpOworCQlpZiAob3ZlcnJpZGFibGVUeXBlTWFwcGluZyAhPSBudWxsKSB7CisJCQlyZXR1cm4gb3ZlcnJpZGFibGVUeXBlTWFwcGluZy5hbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKKwkJfQorCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgeworCQlmb3IgKFN0cmluZyBuYW1lIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpKSkgeworCQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlID0gZ2V0QXNzb2NpYXRpb25PdmVycmlkZU5hbWVkKG5hbWUpOworCQkJaWYgKG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPT0gbnVsbCkgeworCQkJCXRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmFkZChidWlsZFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUpKTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGJ1aWxkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZShidWlsZFZpcnR1YWxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUpKTsKKwl9CisJCisJcHJvdGVjdGVkIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsWG1sQXNzb2NpYXRpb25PdmVycmlkZShTdHJpbmcgbmFtZSkgeworCQlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcmVsYXRpb25zaGlwUmVmZXJlbmNlID0gdGhpcy5yZXNvbHZlQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShuYW1lKTsKKwkJcmV0dXJuIGJ1aWxkVmlydHVhbFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSwgcmVsYXRpb25zaGlwUmVmZXJlbmNlLmdldFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgWG1sQXNzb2NpYXRpb25PdmVycmlkZSBidWlsZFZpcnR1YWxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKFN0cmluZyBuYW1lLCBKb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5KSB7CisJCXJldHVybiBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZFZpcnR1YWxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUsIGdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKSwgam9pbmluZ1N0cmF0ZWd5KTsKKwl9CisJCisJcHJpdmF0ZSBSZWxhdGlvbnNoaXBSZWZlcmVuY2UgcmVzb2x2ZUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoU3RyaW5nIGFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lKSB7CisJCXJldHVybiBnZXRPd25lcigpLnJlc29sdmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoYXNzb2NpYXRpb25PdmVycmlkZU5hbWUpOworCX0KKworCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgeworCQlmb3IgKFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA6IHRoaXMucmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpIHsKKwkJCXRoaXMuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuYWRkKGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZShhc3NvY2lhdGlvbk92ZXJyaWRlKSk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCXRoaXMudXBkYXRlVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB7CisJCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBYTUwgb3ZlcnJpZGVzICh0byBwcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24pCisJCUl0ZXJhdG9yPFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHhtbE92ZXJyaWRlcyA9IG5ldyBDbG9uZUl0ZXJhdG9yPFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+KHRoaXMucmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOworCQkKKwkJZm9yIChJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBjb250ZXh0T3ZlcnJpZGVzID0gdGhpcy5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOyBjb250ZXh0T3ZlcnJpZGVzLmhhc05leHQoKTsgKSB7CisJCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGNvbnRleHRPdmVycmlkZSA9IGNvbnRleHRPdmVycmlkZXMubmV4dCgpOworCQkJaWYgKHhtbE92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKKwkJCQljb250ZXh0T3ZlcnJpZGUudXBkYXRlKHhtbE92ZXJyaWRlcy5uZXh0KCkpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZV8oY29udGV4dE92ZXJyaWRlKTsKKwkJCX0KKwkJfQorCQkKKwkJd2hpbGUgKHhtbE92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKKwkJCWFkZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlKHhtbE92ZXJyaWRlcy5uZXh0KCkpKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSB7CisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBhbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc0NvcHkgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJCisJCWZvciAoU3RyaW5nIG5hbWUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMpKSB7CisJCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlTmFtZWQobmFtZSk7CisJCQlpZiAob3JtQXNzb2NpYXRpb25PdmVycmlkZSAhPSBudWxsICYmICFvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAob3JtQXNzb2NpYXRpb25PdmVycmlkZSAhPSBudWxsKSB7CisJCQkJaWYgKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc0NvcHkuaGFzTmV4dCgpKSB7CisJCQkJCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNDb3B5Lm5leHQoKTsKKwkJCQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUudXBkYXRlKGJ1aWxkVmlydHVhbFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSkpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJYWRkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUoYnVpbGRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZShuYW1lKSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJYWRkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUoYnVpbGRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZShuYW1lKSk7CisJCQl9CisJCX0KKwkJZm9yIChPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc0NvcHkpKSB7CisJCQlyZW1vdmVWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlKFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgeworCQlyZXR1cm4gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlKHRoaXMsIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZU93bmVyKCksIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCX0KKworCXByb3RlY3RlZCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGJ1aWxkUmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlKCkgeworCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgQXNzb2NpYXRpb25PdmVycmlkZS5Pd25lciBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVPd25lcigpIHsKKwkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlT3duZXIoKTsKKwl9CisJCisJLy8qKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisKKwkJZm9yIChJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBzdHJlYW0gPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJc3RyZWFtLm5leHQoKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl9CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCX0KKwkKKwkKKwkKKwljbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlT3duZXIgaW1wbGVtZW50cyBBc3NvY2lhdGlvbk92ZXJyaWRlLk93bmVyIHsKKworCQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoYXR0cmlidXRlTmFtZSwgZ2V0T3duZXIoKS5nZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCkpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VPdmVycmlkZSBvdmVycmlkZSkgeworCQkJcmV0dXJuIEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLnRoaXMudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmNvbnRhaW5zKG92ZXJyaWRlKTsKKwkJfQorCisJCXB1YmxpYyBCYXNlT3ZlcnJpZGUgc2V0VmlydHVhbChib29sZWFuIHZpcnR1YWwsIEJhc2VPdmVycmlkZSBvdmVycmlkZSkgeworCQkJcmV0dXJuIEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLnRoaXMuc2V0QXNzb2NpYXRpb25PdmVycmlkZVZpcnR1YWwodmlydHVhbCwgKE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUpIG92ZXJyaWRlKTsKKwkJfQorCisJCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKKwkJCXJldHVybiBnZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmU3ODU5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlIGV4dGVuZHMgQWJzdHJhY3RPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisKKwlwdWJsaWMgR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoT3JtQXNzb2NpYXRpb25PdmVycmlkZSBwYXJlbnQsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeGFvKSB7CisJCXN1cGVyKHBhcmVudCwgeGFvKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pbmluZ1N0cmF0ZWd5IGNhbGN1bGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmNzIyNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZS5qYXZhCkBAIC0wLDAgKzEsMjIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZSBleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU92ZXJyaWRlLCBPcm1Db2x1bW4uT3duZXIKK3sKKworCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKKworCXByaXZhdGUgZmluYWwgT3duZXIgb3duZXI7CisKKwlwcm90ZWN0ZWQgWG1sQXR0cmlidXRlT3ZlcnJpZGUgcmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZTsKKwkKKworCXByb3RlY3RlZCBmaW5hbCBPcm1Db2x1bW4gY29sdW1uOworCisJcHVibGljIEdlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZShPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIEF0dHJpYnV0ZU92ZXJyaWRlLk93bmVyIG93bmVyLCBYbWxBdHRyaWJ1dGVPdmVycmlkZSByZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMub3duZXIgPSBvd25lcjsKKwkJdGhpcy5jb2x1bW4gPSBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUNvbHVtbih0aGlzLCB0aGlzKTsKKwkJdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlID0gcmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZTsKKwkJdGhpcy5uYW1lID0gcmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCk7CisJCXRoaXMuY29sdW1uLmluaXRpYWxpemUocmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoWG1sQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKworCXB1YmxpYyBPcm1BdHRyaWJ1dGVPdmVycmlkZSBzZXRWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCkgeworCQlyZXR1cm4gKE9ybUF0dHJpYnV0ZU92ZXJyaWRlKSBnZXRPd25lcigpLnNldFZpcnR1YWwodmlydHVhbCwgdGhpcyk7CisJfQorCisJcHVibGljIE93bmVyIGdldE93bmVyKCkgeworCQlyZXR1cm4gdGhpcy5vd25lcjsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuZXdOYW1lOworCQl0aGlzLnJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZShuZXdOYW1lKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChCYXNlT3ZlcnJpZGUuTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5ld05hbWUpIHsKKwkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7CisJCXRoaXMubmFtZSA9IG5ld05hbWU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQmFzZU92ZXJyaWRlLk5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOworCX0KKworCXB1YmxpYyBPcm1Db2x1bW4gZ2V0Q29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy5jb2x1bW47CisJfQorCisJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgeworCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRUeXBlTWFwcGluZygpOworCX0KKworCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZW5hbWUpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXREYlRhYmxlKGdldENvbHVtbigpLmdldFRhYmxlKCkpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgeworCQlDb2x1bW4gY29sdW1uID0gcmVzb2x2ZU92ZXJyaWRlbkNvbHVtbigpOworCQlpZiAoY29sdW1uID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBjb2x1bW4uZ2V0TmFtZSgpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7CisJCUNvbHVtbiBjb2x1bW4gPSByZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKCk7CisJCWlmIChjb2x1bW4gPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJU3RyaW5nIHRhYmxlTmFtZSA9IGNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpOworCQlpZiAodGFibGVOYW1lICE9IG51bGwpIHsKKwkJCXJldHVybiB0YWJsZU5hbWU7CisJCX0KKwkJcmV0dXJuIGdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7CisJfQorCQorCXByb3RlY3RlZCBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRlbkNvbHVtbigpIHsKKwkJcmV0dXJuIGdldE93bmVyKCkucmVzb2x2ZU92ZXJyaWRlbkNvbHVtbihnZXROYW1lKCkpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKKwkJcmV0dXJuIGdldE93bmVyKCkuaXNWaXJ0dWFsKHRoaXMpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJCXJldHVybiB0ZXh0UmFuZ2UgPT0gbnVsbCA/IGdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSA6IHRleHRSYW5nZTsKKwl9CisKKworCS8vKioqKioqKioqKioqKioqKiogSVhtbENvbHVtbi5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFhtbENvbHVtbiBnZXRSZXNvdXJjZUNvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkUmVzb3VyY2VDb2x1bW4oKSB7CisJCXRoaXMucmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZS5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZUNvbHVtbigpIHsKKwkJdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlLnNldENvbHVtbihudWxsKTsKKwl9CisJCisJCisJLy8qKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgdXBkYXRlKFhtbEF0dHJpYnV0ZU92ZXJyaWRlIHhtbEF0dHJpYnV0ZU92ZXJyaWRlKSB7CisJCXRoaXMucmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZSA9IHhtbEF0dHJpYnV0ZU92ZXJyaWRlOworCQl0aGlzLnNldE5hbWVfKHhtbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXRoaXMuY29sdW1uLnVwZGF0ZSh4bWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKSk7CisJfQorCQorCS8vKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKSkgeworCQkJdGhpcy52YWxpZGF0ZUNvbHVtbihtZXNzYWdlcyk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDb2x1bW4oTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKKwkJU3RyaW5nIHRhYmxlTmFtZSA9IHRoaXMuY29sdW1uLmdldFRhYmxlKCk7CisJCWlmICh0aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSkpIHsKKwkJCWlmICh0aGlzLmlzVmlydHVhbCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpLCB0YWJsZU5hbWUsIHRoaXMuY29sdW1uLmdldE5hbWUoKX0sCisJCQkJCQl0aGlzLmNvbHVtbiwgCisJCQkJCQl0aGlzLmNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZSgpCisJCQkJCSkKKwkJCQkpOworCQkJfSBlbHNlIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7dGFibGVOYW1lLCB0aGlzLmNvbHVtbi5nZXROYW1lKCl9LCAKKwkJCQkJCXRoaXMuY29sdW1uLAorCQkJCQkJdGhpcy5jb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoKQorCQkJCQkpCisJCQkJKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKCAhIHRoaXMuY29sdW1uLmlzUmVzb2x2ZWQoKSAmJiB0aGlzLmNvbHVtbi5nZXREYlRhYmxlKCkgIT0gbnVsbCkgeworCQkJaWYgKHRoaXMuaXNWaXJ0dWFsKCkpIHsKKwkJCQltZXNzYWdlcy5hZGQoCisJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAorCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKSwgdGhpcy5jb2x1bW4uZ2V0TmFtZSgpfSwgCisJCQkJCQl0aGlzLmNvbHVtbiwKKwkJCQkJCXRoaXMuY29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoKQorCQkJCQkpCisJCQkJKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5jb2x1bW4uZ2V0TmFtZSgpfSwgCisJCQkJCQl0aGlzLmNvbHVtbiwKKwkJCQkJCXRoaXMuY29sdW1uLmdldE5hbWVUZXh0UmFuZ2UoKQorCQkJCQkpCisJCQkJKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjUwZmQwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSwzNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIKK3sKKwlwcml2YXRlIGZpbmFsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7CisJCisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlczsKKworCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzOworCisJcHJvdGVjdGVkIGZpbmFsIE93bmVyIG93bmVyOworCisJcHVibGljIEdlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE93bmVyIG93bmVyLCAgWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgcmVzb3VyY2UpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5vd25lciA9IG93bmVyOworCQl0aGlzLnJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSByZXNvdXJjZTsKKwkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgQXJyYXlMaXN0PE9ybUF0dHJpYnV0ZU92ZXJyaWRlPigpOworCQl0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgQXJyYXlMaXN0PE9ybUF0dHJpYnV0ZU92ZXJyaWRlPigpOworCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJdGhpcy5pbml0aWFsaXplVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb2xkQ29udGFpbmVyKSB7CisJCWludCBpbmRleCA9IDA7CisJCWZvciAoT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob2xkQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpKSkgeworCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBuZXdBdHRyaWJ1dGVPdmVycmlkZSA9IGFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGluZGV4KyspOworCQkJbmV3QXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZShhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQkJbmV3QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaW5pdGlhbGl6ZUZyb20oYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkpOworCQl9CisJfQorCisJcHVibGljIE93bmVyIGdldE93bmVyKCkgeworCQlyZXR1cm4gdGhpcy5vd25lcjsKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzKCkgeworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4oc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCksIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSk7CisJfQorCisJcHVibGljIGludCBhdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgKyB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7CisJfQorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+KHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyk7CisJfQorCQorCXB1YmxpYyBpbnQgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuc2l6ZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKKwkJYWRkSXRlbVRvTGlzdChhdHRyaWJ1dGVPdmVycmlkZSwgdGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLCBWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgeworCQlyZW1vdmVJdGVtRnJvbUxpc3QoYXR0cmlidXRlT3ZlcnJpZGUsIHRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcywgVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpOworCX0KKwkKKwlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlT3ZlcnJpZGUgc2V0QXR0cmlidXRlT3ZlcnJpZGVWaXJ0dWFsKGJvb2xlYW4gdmlydHVhbCwgT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKKwkJaWYgKHZpcnR1YWwpIHsKKwkJCXJldHVybiBzZXRBdHRyaWJ1dGVPdmVycmlkZVZpcnR1YWwoYXR0cmlidXRlT3ZlcnJpZGUpOworCQl9CisJCXJldHVybiBzZXRBdHRyaWJ1dGVPdmVycmlkZVNwZWNpZmllZChhdHRyaWJ1dGVPdmVycmlkZSk7CisJfQorCQorCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVPdmVycmlkZSBzZXRBdHRyaWJ1dGVPdmVycmlkZVZpcnR1YWwoT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKKwkJaW50IGluZGV4ID0gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaW5kZXhPZihhdHRyaWJ1dGVPdmVycmlkZSk7CisJCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLnJlbW92ZShpbmRleCk7CisJCVN0cmluZyBhdHRyaWJ1dGVPdmVycmlkZU5hbWUgPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCk7CisJCS8vYWRkIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZSBzbyB0aGF0IEkgY2FuIGNvbnRyb2wgdGhlIG9yZGVyIHRoYXQgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcyBzZW50LgorCQkvL290aGVyd2lzZSB3aGVuIHdlIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIGphdmEgd2Ugd2lsbCBnZXQgYW4gdXBkYXRlIGFuZCBhZGQgdGhlIGF0dHJpYnV0ZSBvdmVycmlkZQorCQkvL2R1cmluZyB0aGUgdXBkYXRlLiAgVGhpcyBjYXVzZXMgdGhlIFVJIHRvIGJlIGZsYWt5LCBzaW5jZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1pZ2h0IG5vdCBvY2N1ciBpbiB0aGUgY29ycmVjdCBvcmRlcgorCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBudWxsOworCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGVOYW1lICE9IG51bGwpIHsKKwkJCWZvciAoU3RyaW5nIG5hbWUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpKSkgeworCQkJCWlmIChuYW1lLmVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZU5hbWUpKSB7CisJCQkJCS8vc3RvcmUgdGhlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBzbyB3ZSBjYW4gZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGxhdGVyCisJCQkJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUpOworCQkJCQl0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZShpbmRleCk7CisJCWZpcmVJdGVtUmVtb3ZlZChTUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGUpOworCQkKKwkJaWYgKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSAhPSBudWxsKSB7CisJCQlmaXJlSXRlbUFkZGVkKFZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIC0gMSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKTsKKwkJfQorCQlyZXR1cm4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOworCX0KKwkKKwlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlT3ZlcnJpZGUgc2V0QXR0cmlidXRlT3ZlcnJpZGVTcGVjaWZpZWQoT3JtQXR0cmlidXRlT3ZlcnJpZGUgb2xkQXR0cmlidXRlT3ZlcnJpZGUpIHsKKwkJaW50IGluZGV4ID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOworCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSB4bWxBdHRyaWJ1dGVPdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCk7CisJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIG5ld0F0dHJpYnV0ZU92ZXJyaWRlID0gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1BdHRyaWJ1dGVPdmVycmlkZSh0aGlzLCBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZU93bmVyKCksIHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKKwkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKGluZGV4LCBuZXdBdHRyaWJ1dGVPdmVycmlkZSk7CisJCQorCQl0aGlzLnJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKKwkJCisJCWludCBkZWZhdWx0SW5kZXggPSB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaW5kZXhPZihvbGRBdHRyaWJ1dGVPdmVycmlkZSk7CisJCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5yZW1vdmUoZGVmYXVsdEluZGV4KTsKKworCQluZXdBdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKG9sZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCW5ld0F0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUob2xkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJCisJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNULCBkZWZhdWx0SW5kZXgsIG9sZEF0dHJpYnV0ZU92ZXJyaWRlKTsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKFNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBuZXdBdHRyaWJ1dGVPdmVycmlkZSk7CQkKKworCQlyZXR1cm4gbmV3QXR0cmlidXRlT3ZlcnJpZGU7CisJfQorCisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyk7CisJfQorCisJcHVibGljIGludCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuc2l6ZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlT3ZlcnJpZGUgYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoaW50IGluZGV4KSB7CisJCVhtbEF0dHJpYnV0ZU92ZXJyaWRlIHhtbEF0dHJpYnV0ZU92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKTsKKwkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlKHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKKwkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuYWRkKGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZSk7CisJCXRoaXMucmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoaW5kZXgsIHhtbEF0dHJpYnV0ZU92ZXJyaWRlKTsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKFNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZSk7CisJCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZShpbnQgaW5kZXgsIE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7CisJCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGF0dHJpYnV0ZU92ZXJyaWRlLCB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcywgU1BFQ0lGSUVEX0FUVFJJQlVURV9PVkVSUklERVNfTElTVCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7CisJCXRoaXMuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUodGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuc2l6ZSgpLCBhdHRyaWJ1dGVPdmVycmlkZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlXyhPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSkgeworCQlyZW1vdmVJdGVtRnJvbUxpc3QoYXR0cmlidXRlT3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLCBTUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKTsKKwl9CisJCisJcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl0aGlzLnJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQlmaXJlSXRlbU1vdmVkKFNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKKwl9CisKKwlwdWJsaWMgT3JtQXR0cmlidXRlT3ZlcnJpZGUgZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gKE9ybUF0dHJpYnV0ZU92ZXJyaWRlKSBnZXRPdmVycmlkZU5hbWVkKG5hbWUsIGF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc0F0dHJpYnV0ZU92ZXJyaWRlKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBjb250YWluc092ZXJyaWRlKG5hbWUsIGF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc0RlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gY29udGFpbnNPdmVycmlkZShuYW1lLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkpOworCX0KKworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGNvbnRhaW5zT3ZlcnJpZGUobmFtZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkpOworCX0KKworCXByaXZhdGUgQmFzZU92ZXJyaWRlIGdldE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgQmFzZU92ZXJyaWRlPiBvdmVycmlkZXMpIHsKKwkJZm9yIChCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3ZlcnJpZGVzKSkgeworCQkJU3RyaW5nIG92ZXJyaWRlTmFtZSA9IG92ZXJyaWRlLmdldE5hbWUoKTsKKwkJCWlmIChvdmVycmlkZU5hbWUgPT0gbnVsbCAmJiBuYW1lID09IG51bGwpIHsKKwkJCQlyZXR1cm4gb3ZlcnJpZGU7CisJCQl9CisJCQlpZiAob3ZlcnJpZGVOYW1lICE9IG51bGwgJiYgb3ZlcnJpZGVOYW1lLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiBvdmVycmlkZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY29udGFpbnNPdmVycmlkZShTdHJpbmcgbmFtZSwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBCYXNlT3ZlcnJpZGU+IG92ZXJyaWRlcykgeworCQlyZXR1cm4gZ2V0T3ZlcnJpZGVOYW1lZChuYW1lLCBvdmVycmlkZXMpICE9IG51bGw7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKKwkJVHlwZU1hcHBpbmcgb3ZlcnJpZGFibGVUeXBlTWFwcGluZyA9IGdldE93bmVyKCkuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpOworCQlpZiAob3ZlcnJpZGFibGVUeXBlTWFwcGluZyAhPSBudWxsKSB7CisJCQlyZXR1cm4gb3ZlcnJpZGFibGVUeXBlTWFwcGluZy5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCX0KKwkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkpKSB7CisJCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IGdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQobmFtZSk7CisJCQlpZiAob3JtQXR0cmlidXRlT3ZlcnJpZGUgPT0gbnVsbCkgeworCQkJCXRoaXMudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUobmFtZSkpOworCQkJfQorCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB7CisJCWZvciAoWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgOiB0aGlzLnJlc291cmNlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkpIHsKKwkJCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmFkZChidWlsZEF0dHJpYnV0ZU92ZXJyaWRlKGF0dHJpYnV0ZU92ZXJyaWRlKSk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQl0aGlzLnVwZGF0ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwl9CisKKwlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoYnVpbGRWaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGUobmFtZSkpOworCX0KKwkKKwlwcm90ZWN0ZWQgWG1sQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKKwkJQ29sdW1uIGNvbHVtbiA9IHJlc29sdmVBdHRyaWJ1dGVPdmVycmlkZU1hcHBpbmdDb2x1bW4obmFtZSk7CisJCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBnZXRPd25lcigpLmJ1aWxkVmlydHVhbFhtbENvbHVtbihjb2x1bW4sIG5hbWUsIGdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSk7CisJCXJldHVybiBuZXcgVmlydHVhbFhtbEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUsIHhtbENvbHVtbik7CisJfQorCQorCXByaXZhdGUgQ29sdW1uIHJlc29sdmVBdHRyaWJ1dGVPdmVycmlkZU1hcHBpbmdDb2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSkgeworCQlyZXR1cm4gZ2V0T3duZXIoKS5yZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKGF0dHJpYnV0ZU92ZXJyaWRlTmFtZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgeworCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgWE1MIG92ZXJyaWRlcyAodG8gcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKQorCQlJdGVyYXRvcjxYbWxBdHRyaWJ1dGVPdmVycmlkZT4geG1sT3ZlcnJpZGVzID0gbmV3IENsb25lSXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+KHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSk7CisJCQorCQlmb3IgKEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBjb250ZXh0T3ZlcnJpZGVzID0gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsgY29udGV4dE92ZXJyaWRlcy5oYXNOZXh0KCk7ICkgeworCQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgY29udGV4dE92ZXJyaWRlID0gY29udGV4dE92ZXJyaWRlcy5uZXh0KCk7CisJCQlpZiAoeG1sT3ZlcnJpZGVzLmhhc05leHQoKSkgeworCQkJCWNvbnRleHRPdmVycmlkZS51cGRhdGUoeG1sT3ZlcnJpZGVzLm5leHQoKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZV8oY29udGV4dE92ZXJyaWRlKTsKKwkJCX0KKwkJfQorCQkKKwkJd2hpbGUgKHhtbE92ZXJyaWRlcy5oYXNOZXh0KCkpIHsKKwkJCWFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoeG1sT3ZlcnJpZGVzLm5leHQoKSkpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB7CisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNDb3B5ID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQkKKwkJZm9yIChTdHJpbmcgbmFtZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMpKSB7CisJCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IGdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQobmFtZSk7CisJCQlpZiAob3JtQXR0cmlidXRlT3ZlcnJpZGUgIT0gbnVsbCAmJiAhb3JtQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChvcm1BdHRyaWJ1dGVPdmVycmlkZSAhPSBudWxsKSB7CisJCQkJaWYgKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNDb3B5Lmhhc05leHQoKSkgeworCQkJCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzQ29weS5uZXh0KCk7CisJCQkJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS51cGRhdGUoYnVpbGRWaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGUobmFtZSkpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJYWRkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKGJ1aWxkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlhZGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoYnVpbGRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUobmFtZSkpOworCQkJfQorCQl9CisJCWZvciAoT3JtQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNDb3B5KSkgeworCQkJcmVtb3ZlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKKwkJcmV0dXJuIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtQXR0cmlidXRlT3ZlcnJpZGUodGhpcywgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVPd25lcigpLCBhdHRyaWJ1dGVPdmVycmlkZSk7CisJfQorCisJcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlLk93bmVyIGNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlT3duZXIoKSB7CisJCXJldHVybiBuZXcgQXR0cmlidXRlT3ZlcnJpZGVPd25lcigpOworCX0KKwkKKwkKKwkvLyoqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKworCQlmb3IgKEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzdHJlYW0gPSB0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCXN0cmVhbS5uZXh0KCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorCQorCQorCQorCQorCWNsYXNzIEF0dHJpYnV0ZU92ZXJyaWRlT3duZXIgaW1wbGVtZW50cyBBdHRyaWJ1dGVPdmVycmlkZS5Pd25lciB7CisKKwkJcHVibGljIENvbHVtbiByZXNvbHZlT3ZlcnJpZGVuQ29sdW1uKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCQlpZiAoYXR0cmlidXRlTmFtZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlyZXR1cm4gR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnRoaXMucmVzb2x2ZUF0dHJpYnV0ZU92ZXJyaWRlTWFwcGluZ0NvbHVtbihhdHRyaWJ1dGVOYW1lKTsJCQkKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUpIHsKKwkJCXJldHVybiBHZW5lcmljT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudGhpcy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmNvbnRhaW5zKG92ZXJyaWRlKTsKKwkJfQorCisJCXB1YmxpYyBCYXNlT3ZlcnJpZGUgc2V0VmlydHVhbChib29sZWFuIHZpcnR1YWwsIEJhc2VPdmVycmlkZSBvdmVycmlkZSkgeworCQkJcmV0dXJuIEdlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci50aGlzLnNldEF0dHJpYnV0ZU92ZXJyaWRlVmlydHVhbCh2aXJ0dWFsLCAoT3JtQXR0cmlidXRlT3ZlcnJpZGUpIG92ZXJyaWRlKTsKKwkJfQorCisJCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKKwkJCXJldHVybiBnZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCk7CisJCX0KKwkJCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtQmFzaWNNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtQmFzaWNNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2MTA1ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1CYXNpY01hcHBpbmcuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKKworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybUJhc2ljTWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtQmFzaWNNYXBwaW5nPFhtbEJhc2ljPgoreworCQorCXB1YmxpYyBHZW5lcmljT3JtQmFzaWNNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxCYXNpYyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUNhc2NhZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1DYXNjYWRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkNjFjZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1DYXNjYWRlLmphdmEKQEAgLTAsMCArMSwyNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1DYXNjYWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybUNhc2NhZGUgZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlIGltcGxlbWVudHMgT3JtQ2FzY2FkZQoreworCXByb3RlY3RlZCBib29sZWFuIGFsbDsKKworCXByb3RlY3RlZCBib29sZWFuIHBlcnNpc3Q7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBtZXJnZTsKKworCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZTsKKworCXByb3RlY3RlZCBib29sZWFuIHJlZnJlc2g7CisKKwkKKwlwcm90ZWN0ZWQgZmluYWwgQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmc7CisJCisJcHVibGljIEdlbmVyaWNPcm1DYXNjYWRlKE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcgcGFyZW50LCBBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcgPSByZWxhdGlvbnNoaXBNYXBwaW5nOworCQlDYXNjYWRlVHlwZSBjYXNjYWRlID0gZ2V0UmVzb3VyY2VDYXNjYWRlKCk7CisJCXRoaXMuYWxsID0gdGhpcy5nZXRSZXNvdXJjZUFsbChjYXNjYWRlKTsKKwkJdGhpcy5wZXJzaXN0ID0gdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3QoY2FzY2FkZSk7CisJCXRoaXMubWVyZ2UgPSB0aGlzLmdldFJlc291cmNlTWVyZ2UoY2FzY2FkZSk7CisJCXRoaXMucmVtb3ZlID0gdGhpcy5nZXRSZXNvdXJjZVJlbW92ZShjYXNjYWRlKTsKKwkJdGhpcy5yZWZyZXNoID0gdGhpcy5nZXRSZXNvdXJjZVJlZnJlc2goY2FzY2FkZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKENhc2NhZGUgb2xkQ2FzY2FkZSkgeworCQlzZXRBbGwob2xkQ2FzY2FkZS5pc0FsbCgpKTsKKwkJc2V0UGVyc2lzdChvbGRDYXNjYWRlLmlzUGVyc2lzdCgpKTsKKwkJc2V0TWVyZ2Uob2xkQ2FzY2FkZS5pc01lcmdlKCkpOworCQlzZXRSZW1vdmUob2xkQ2FzY2FkZS5pc1JlbW92ZSgpKTsKKwkJc2V0UmVmcmVzaChvbGRDYXNjYWRlLmlzUmVmcmVzaCgpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0FsbCgpIHsKKwkJcmV0dXJuIHRoaXMuYWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFsbChib29sZWFuIG5ld0FsbCkgeworCQlib29sZWFuIG9sZEFsbCA9IHRoaXMuYWxsOworCQl0aGlzLmFsbCA9IG5ld0FsbDsKKwkJaWYgKG9sZEFsbCAhPSBuZXdBbGwpIHsKKwkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FzY2FkZSgpICE9IG51bGwpIHsKKwkJCQl0aGlzLmdldFJlc291cmNlQ2FzY2FkZSgpLnNldENhc2NhZGVBbGwobmV3QWxsKTsJCQkJCQkKKwkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhc2NhZGUoKS5pc1Vuc2V0KCkpIHsKKwkJCQkJcmVtb3ZlUmVzb3VyY2VDYXNjYWRlKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAobmV3QWxsICE9IGZhbHNlKSB7CisJCQkJYWRkUmVzb3VyY2VDYXNjYWRlKCk7CisJCQkJZ2V0UmVzb3VyY2VDYXNjYWRlKCkuc2V0Q2FzY2FkZUFsbChuZXdBbGwpOworCQkJfQorCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQUxMX1BST1BFUlRZLCBvbGRBbGwsIG5ld0FsbCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldEFsbF8oYm9vbGVhbiBuZXdBbGwpIHsKKwkJYm9vbGVhbiBvbGRBbGwgPSB0aGlzLmFsbDsKKwkJdGhpcy5hbGwgPSBuZXdBbGw7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQUxMX1BST1BFUlRZLCBvbGRBbGwsIG5ld0FsbCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdCgpIHsKKwkJcmV0dXJuIHRoaXMucGVyc2lzdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0KGJvb2xlYW4gbmV3UGVyc2lzdCkgeworCQlib29sZWFuIG9sZFBlcnNpc3QgPSB0aGlzLnBlcnNpc3Q7CisJCXRoaXMucGVyc2lzdCA9IG5ld1BlcnNpc3Q7CisJCWlmIChvbGRQZXJzaXN0ICE9IG5ld1BlcnNpc3QpIHsKKwkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FzY2FkZSgpICE9IG51bGwpIHsKKwkJCQl0aGlzLmdldFJlc291cmNlQ2FzY2FkZSgpLnNldENhc2NhZGVQZXJzaXN0KG5ld1BlcnNpc3QpOwkJCQkJCQorCQkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FzY2FkZSgpLmlzVW5zZXQoKSkgeworCQkJCQlyZW1vdmVSZXNvdXJjZUNhc2NhZGUoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChuZXdQZXJzaXN0ICE9IGZhbHNlKSB7CisJCQkJYWRkUmVzb3VyY2VDYXNjYWRlKCk7CisJCQkJZ2V0UmVzb3VyY2VDYXNjYWRlKCkuc2V0Q2FzY2FkZVBlcnNpc3QobmV3UGVyc2lzdCk7CisJCQl9CisJCX0JCQorCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBFUlNJU1RfUFJPUEVSVFksIG9sZFBlcnNpc3QsIG5ld1BlcnNpc3QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQZXJzaXN0Xyhib29sZWFuIG5ld1BlcnNpc3QpIHsKKwkJYm9vbGVhbiBvbGRQZXJzaXN0ID0gdGhpcy5wZXJzaXN0OworCQl0aGlzLnBlcnNpc3QgPSBuZXdQZXJzaXN0OwkJCisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUEVSU0lTVF9QUk9QRVJUWSwgb2xkUGVyc2lzdCwgbmV3UGVyc2lzdCk7CisJfQorCisKKwlwdWJsaWMgYm9vbGVhbiBpc01lcmdlKCkgeworCQlyZXR1cm4gdGhpcy5tZXJnZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNZXJnZShib29sZWFuIG5ld01lcmdlKSB7CisJCWJvb2xlYW4gb2xkTWVyZ2UgPSB0aGlzLm1lcmdlOworCQl0aGlzLm1lcmdlID0gbmV3TWVyZ2U7CisJCWlmIChvbGRNZXJnZSAhPSBuZXdNZXJnZSkgeworCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDYXNjYWRlKCkgIT0gbnVsbCkgeworCQkJCXRoaXMuZ2V0UmVzb3VyY2VDYXNjYWRlKCkuc2V0Q2FzY2FkZU1lcmdlKG5ld01lcmdlKTsJCQkJCQkKKwkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhc2NhZGUoKS5pc1Vuc2V0KCkpIHsKKwkJCQkJcmVtb3ZlUmVzb3VyY2VDYXNjYWRlKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAobmV3TWVyZ2UgIT0gZmFsc2UpIHsKKwkJCQlhZGRSZXNvdXJjZUNhc2NhZGUoKTsKKwkJCQlnZXRSZXNvdXJjZUNhc2NhZGUoKS5zZXRDYXNjYWRlTWVyZ2UobmV3TWVyZ2UpOworCQkJfQorCQl9CQkKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChNRVJHRV9QUk9QRVJUWSwgb2xkTWVyZ2UsIG5ld01lcmdlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0TWVyZ2VfKGJvb2xlYW4gbmV3TWVyZ2UpIHsKKwkJYm9vbGVhbiBvbGRNZXJnZSA9IHRoaXMubWVyZ2U7CisJCXRoaXMubWVyZ2UgPSBuZXdNZXJnZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChNRVJHRV9QUk9QRVJUWSwgb2xkTWVyZ2UsIG5ld01lcmdlKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVtb3ZlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlbW92ZShib29sZWFuIG5ld1JlbW92ZSkgeworCQlib29sZWFuIG9sZFJlbW92ZSA9IHRoaXMucmVtb3ZlOworCQl0aGlzLnJlbW92ZSA9IG5ld1JlbW92ZTsKKwkJaWYgKG9sZFJlbW92ZSAhPSBuZXdSZW1vdmUpIHsKKwkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FzY2FkZSgpICE9IG51bGwpIHsKKwkJCQl0aGlzLmdldFJlc291cmNlQ2FzY2FkZSgpLnNldENhc2NhZGVSZW1vdmUobmV3UmVtb3ZlKTsJCQkJCQkKKwkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhc2NhZGUoKS5pc1Vuc2V0KCkpIHsKKwkJCQkJcmVtb3ZlUmVzb3VyY2VDYXNjYWRlKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAobmV3UmVtb3ZlICE9IGZhbHNlKSB7CisJCQkJYWRkUmVzb3VyY2VDYXNjYWRlKCk7CisJCQkJZ2V0UmVzb3VyY2VDYXNjYWRlKCkuc2V0Q2FzY2FkZVJlbW92ZShuZXdSZW1vdmUpOworCQkJfQorCQl9CQkKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChSRU1PVkVfUFJPUEVSVFksIG9sZFJlbW92ZSwgbmV3UmVtb3ZlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0UmVtb3ZlXyhib29sZWFuIG5ld1JlbW92ZSkgeworCQlib29sZWFuIG9sZFJlbW92ZSA9IHRoaXMucmVtb3ZlOworCQl0aGlzLnJlbW92ZSA9IG5ld1JlbW92ZTsJCQorCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFJFTU9WRV9QUk9QRVJUWSwgb2xkUmVtb3ZlLCBuZXdSZW1vdmUpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVmcmVzaCgpIHsKKwkJcmV0dXJuIHRoaXMucmVmcmVzaDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoKGJvb2xlYW4gbmV3UmVmcmVzaCkgeworCQlib29sZWFuIG9sZFJlZnJlc2ggPSB0aGlzLnJlZnJlc2g7CisJCXRoaXMucmVmcmVzaCA9IG5ld1JlZnJlc2g7CQorCQlpZiAob2xkUmVmcmVzaCAhPSBuZXdSZWZyZXNoKSB7CisJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhc2NhZGUoKSAhPSBudWxsKSB7CisJCQkJdGhpcy5nZXRSZXNvdXJjZUNhc2NhZGUoKS5zZXRDYXNjYWRlUmVmcmVzaChuZXdSZWZyZXNoKTsJCQkJCQkKKwkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhc2NhZGUoKS5pc1Vuc2V0KCkpIHsKKwkJCQkJcmVtb3ZlUmVzb3VyY2VDYXNjYWRlKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAobmV3UmVmcmVzaCAhPSBmYWxzZSkgeworCQkJCWFkZFJlc291cmNlQ2FzY2FkZSgpOworCQkJCWdldFJlc291cmNlQ2FzY2FkZSgpLnNldENhc2NhZGVSZWZyZXNoKG5ld1JlZnJlc2gpOworCQkJfQorCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVGUkVTSF9QUk9QRVJUWSwgb2xkUmVmcmVzaCwgbmV3UmVmcmVzaCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFJlZnJlc2hfKGJvb2xlYW4gbmV3UmVmcmVzaCkgeworCQlib29sZWFuIG9sZFJlZnJlc2ggPSB0aGlzLnJlZnJlc2g7CisJCXRoaXMucmVmcmVzaCA9IG5ld1JlZnJlc2g7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVGUkVTSF9QUk9QRVJUWSwgb2xkUmVmcmVzaCwgbmV3UmVmcmVzaCk7CisJfQorCQorCisJcHJvdGVjdGVkIENhc2NhZGVUeXBlIGdldFJlc291cmNlQ2FzY2FkZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5nZXRDYXNjYWRlKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlQ2FzY2FkZSgpIHsKKwkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLnNldENhc2NhZGUobnVsbCk7CQkKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VDYXNjYWRlKCkgeworCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcuc2V0Q2FzY2FkZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZSgpKTsJCQkKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlDYXNjYWRlVHlwZSBjYXNjYWRlID0gZ2V0UmVzb3VyY2VDYXNjYWRlKCk7CisJCXRoaXMuc2V0QWxsXyh0aGlzLmdldFJlc291cmNlQWxsKGNhc2NhZGUpKTsKKwkJdGhpcy5zZXRQZXJzaXN0Xyh0aGlzLmdldFJlc291cmNlUGVyc2lzdChjYXNjYWRlKSk7CisJCXRoaXMuc2V0TWVyZ2VfKHRoaXMuZ2V0UmVzb3VyY2VNZXJnZShjYXNjYWRlKSk7CisJCXRoaXMuc2V0UmVtb3ZlXyh0aGlzLmdldFJlc291cmNlUmVtb3ZlKGNhc2NhZGUpKTsKKwkJdGhpcy5zZXRSZWZyZXNoXyh0aGlzLmdldFJlc291cmNlUmVmcmVzaChjYXNjYWRlKSk7CQkKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRSZXNvdXJjZUFsbChDYXNjYWRlVHlwZSBjYXNjYWRlKSB7CisJCXJldHVybiBjYXNjYWRlID09IG51bGwgPyBmYWxzZSA6IGNhc2NhZGUuaXNDYXNjYWRlQWxsKCk7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gZ2V0UmVzb3VyY2VQZXJzaXN0KENhc2NhZGVUeXBlIGNhc2NhZGUpIHsKKwkJcmV0dXJuIGNhc2NhZGUgPT0gbnVsbCA/IGZhbHNlIDogY2FzY2FkZS5pc0Nhc2NhZGVQZXJzaXN0KCk7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gZ2V0UmVzb3VyY2VNZXJnZShDYXNjYWRlVHlwZSBjYXNjYWRlKSB7CisJCXJldHVybiBjYXNjYWRlID09IG51bGwgPyBmYWxzZSA6IGNhc2NhZGUuaXNDYXNjYWRlTWVyZ2UoKTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRSZXNvdXJjZVJlbW92ZShDYXNjYWRlVHlwZSBjYXNjYWRlKSB7CisJCXJldHVybiBjYXNjYWRlID09IG51bGwgPyBmYWxzZSA6IGNhc2NhZGUuaXNDYXNjYWRlUmVtb3ZlKCk7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gZ2V0UmVzb3VyY2VSZWZyZXNoKENhc2NhZGVUeXBlIGNhc2NhZGUpIHsKKwkJcmV0dXJuIGNhc2NhZGUgPT0gbnVsbCA/IGZhbHNlIDogY2FzY2FkZS5pc0Nhc2NhZGVSZWZyZXNoKCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUNhc2NhZGUoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUNvbHVtbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZmJhZTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtQ29sdW1uLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtQmFzZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybUNvbHVtbiBleHRlbmRzIEFic3RyYWN0T3JtQmFzZUNvbHVtbjxYbWxDb2x1bW4+IGltcGxlbWVudHMgT3JtQ29sdW1uCit7CisJcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkTGVuZ3RoOworCisJcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkUHJlY2lzaW9uOworCisJcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkU2NhbGU7CisKKwlwdWJsaWMgR2VuZXJpY09ybUNvbHVtbihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybUNvbHVtbi5Pd25lciBvd25lcikgeworCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybUNvbHVtbi5Pd25lciBnZXRPd25lcigpIHsKKwkJcmV0dXJuIChPcm1Db2x1bW4uT3duZXIpIHN1cGVyLmdldE93bmVyKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKENvbHVtbiBvbGRDb2x1bW4pIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQ29sdW1uKTsKKwkJc2V0U3BlY2lmaWVkTGVuZ3RoKG9sZENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7CisJCXNldFNwZWNpZmllZFByZWNpc2lvbihvbGRDb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOworCQlzZXRTcGVjaWZpZWRTY2FsZShvbGRDb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7CisJfQorCisJcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRMZW5ndGgoKSA9PSBudWxsKSA/IGdldERlZmF1bHRMZW5ndGgoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkuaW50VmFsdWUoKTsKKwl9CisKKwlwdWJsaWMgaW50IGdldERlZmF1bHRMZW5ndGgoKSB7CisJCXJldHVybiBDb2x1bW4uREVGQVVMVF9MRU5HVEg7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRMZW5ndGg7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIgbmV3U3BlY2lmaWVkTGVuZ3RoKSB7CisJCUludGVnZXIgb2xkU3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5zcGVjaWZpZWRMZW5ndGg7CisJCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gbmV3U3BlY2lmaWVkTGVuZ3RoOworCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQob2xkU3BlY2lmaWVkTGVuZ3RoLCBuZXdTcGVjaWZpZWRMZW5ndGgpKSB7CisJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpICE9IG51bGwpIHsKKwkJCQl0aGlzLmdldFJlc291cmNlQ29sdW1uKCkuc2V0TGVuZ3RoKG5ld1NwZWNpZmllZExlbmd0aCk7CisJCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKS5pc1Vuc2V0KCkpIHsKKwkJCQkJcmVtb3ZlUmVzb3VyY2VDb2x1bW4oKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChuZXdTcGVjaWZpZWRMZW5ndGggIT0gbnVsbCkgeworCQkJCWFkZFJlc291cmNlQ29sdW1uKCk7CisJCQkJZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXRMZW5ndGgobmV3U3BlY2lmaWVkTGVuZ3RoKTsKKwkJCX0KKwkJfQorCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFksIG9sZFNwZWNpZmllZExlbmd0aCwgbmV3U3BlY2lmaWVkTGVuZ3RoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoXyhJbnRlZ2VyIG5ld1NwZWNpZmllZExlbmd0aCkgeworCQlJbnRlZ2VyIG9sZFNwZWNpZmllZExlbmd0aCA9IHRoaXMuc3BlY2lmaWVkTGVuZ3RoOworCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IG5ld1NwZWNpZmllZExlbmd0aDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTEVOR1RIX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRMZW5ndGgsIG5ld1NwZWNpZmllZExlbmd0aCk7CisJfQorCisJcHVibGljIGludCBnZXRQcmVjaXNpb24oKSB7CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSA9PSBudWxsKSA/IGdldERlZmF1bHRQcmVjaXNpb24oKSA6IHRoaXMuZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkuaW50VmFsdWUoKTsKKwl9CisKKwlwdWJsaWMgaW50IGdldERlZmF1bHRQcmVjaXNpb24oKSB7CisJCXJldHVybiBDb2x1bW4uREVGQVVMVF9QUkVDSVNJT047CisJfQorCQorCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZFByZWNpc2lvbigpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyIG5ld1NwZWNpZmllZFByZWNpc2lvbikgeworCQlJbnRlZ2VyIG9sZFNwZWNpZmllZFByZWNpc2lvbiA9IHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uOworCQl0aGlzLnNwZWNpZmllZFByZWNpc2lvbiA9IG5ld1NwZWNpZmllZFByZWNpc2lvbjsKKwkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG9sZFNwZWNpZmllZFByZWNpc2lvbiwgbmV3U3BlY2lmaWVkUHJlY2lzaW9uKSkgeworCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKSAhPSBudWxsKSB7CisJCQkJdGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpLnNldFByZWNpc2lvbihuZXdTcGVjaWZpZWRQcmVjaXNpb24pOworCQkJCWlmICh0aGlzLmdldFJlc291cmNlQ29sdW1uKCkuaXNVbnNldCgpKSB7CisJCQkJCXJlbW92ZVJlc291cmNlQ29sdW1uKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAobmV3U3BlY2lmaWVkUHJlY2lzaW9uICE9IG51bGwpIHsKKwkJCQlhZGRSZXNvdXJjZUNvbHVtbigpOworCQkJCWdldFJlc291cmNlQ29sdW1uKCkuc2V0UHJlY2lzaW9uKG5ld1NwZWNpZmllZFByZWNpc2lvbik7CisJCQl9CisJCX0KKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUFJFQ0lTSU9OX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRQcmVjaXNpb24sIG5ld1NwZWNpZmllZFByZWNpc2lvbik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFByZWNpc2lvbl8oSW50ZWdlciBuZXdTcGVjaWZpZWRQcmVjaXNpb24pIHsKKwkJSW50ZWdlciBvbGRTcGVjaWZpZWRQcmVjaXNpb24gPSB0aGlzLnNwZWNpZmllZFByZWNpc2lvbjsKKwkJdGhpcy5zcGVjaWZpZWRQcmVjaXNpb24gPSBuZXdTcGVjaWZpZWRQcmVjaXNpb247CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1BSRUNJU0lPTl9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUHJlY2lzaW9uLCBuZXdTcGVjaWZpZWRQcmVjaXNpb24pOworCX0KKworCXB1YmxpYyBpbnQgZ2V0U2NhbGUoKSB7CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRTY2FsZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFNjYWxlKCkgOiB0aGlzLmdldFNwZWNpZmllZFNjYWxlKCkuaW50VmFsdWUoKTsKKwl9CisKKwlwdWJsaWMgaW50IGdldERlZmF1bHRTY2FsZSgpIHsKKwkJcmV0dXJuIENvbHVtbi5ERUZBVUxUX1NDQUxFOworCX0KKwkKKwlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRTY2FsZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NhbGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlciBuZXdTcGVjaWZpZWRTY2FsZSkgeworCQlJbnRlZ2VyIG9sZFNwZWNpZmllZFNjYWxlID0gdGhpcy5zcGVjaWZpZWRTY2FsZTsKKwkJdGhpcy5zcGVjaWZpZWRTY2FsZSA9IG5ld1NwZWNpZmllZFNjYWxlOworCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQob2xkU3BlY2lmaWVkU2NhbGUsIG5ld1NwZWNpZmllZFNjYWxlKSkgeworCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKSAhPSBudWxsKSB7CisJCQkJdGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpLnNldFNjYWxlKG5ld1NwZWNpZmllZFNjYWxlKTsKKwkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpLmlzVW5zZXQoKSkgeworCQkJCQlyZW1vdmVSZXNvdXJjZUNvbHVtbigpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZFNjYWxlICE9IG51bGwpIHsKKwkJCQlhZGRSZXNvdXJjZUNvbHVtbigpOworCQkJCWdldFJlc291cmNlQ29sdW1uKCkuc2V0U2NhbGUobmV3U3BlY2lmaWVkU2NhbGUpOworCQkJfQorCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDQUxFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTY2FsZSwgbmV3U3BlY2lmaWVkU2NhbGUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNjYWxlXyhJbnRlZ2VyIG5ld1NwZWNpZmllZFNjYWxlKSB7CisJCUludGVnZXIgb2xkU3BlY2lmaWVkU2NhbGUgPSB0aGlzLnNwZWNpZmllZFNjYWxlOworCQl0aGlzLnNwZWNpZmllZFNjYWxlID0gbmV3U3BlY2lmaWVkU2NhbGU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDQUxFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTY2FsZSwgbmV3U3BlY2lmaWVkU2NhbGUpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBYbWxDb2x1bW4gZ2V0UmVzb3VyY2VDb2x1bW4oKSB7CisJCXJldHVybiBnZXRPd25lcigpLmdldFJlc291cmNlQ29sdW1uKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlQ29sdW1uKCkgeworCQlnZXRPd25lcigpLmFkZFJlc291cmNlQ29sdW1uKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlQ29sdW1uKCkgeworCQlnZXRPd25lcigpLnJlbW92ZVJlc291cmNlQ29sdW1uKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoWG1sQ29sdW1uIGNvbHVtbikgeworCQlzdXBlci5pbml0aWFsaXplKGNvbHVtbik7CisJCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5nZXRSZXNvdXJjZUxlbmd0aChjb2x1bW4pOworCQl0aGlzLnNwZWNpZmllZFByZWNpc2lvbiA9IHRoaXMuZ2V0UmVzb3VyY2VQcmVjaXNpb24oY29sdW1uKTsKKwkJdGhpcy5zcGVjaWZpZWRTY2FsZSA9IHRoaXMuZ2V0UmVzb3VyY2VTY2FsZShjb2x1bW4pOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sQ29sdW1uIGNvbHVtbikgeworCQlzdXBlci51cGRhdGUoY29sdW1uKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGhfKHRoaXMuZ2V0UmVzb3VyY2VMZW5ndGgoY29sdW1uKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkUHJlY2lzaW9uXyh0aGlzLmdldFJlc291cmNlUHJlY2lzaW9uKGNvbHVtbikpOworCQl0aGlzLnNldFNwZWNpZmllZFNjYWxlXyh0aGlzLmdldFJlc291cmNlU2NhbGUoY29sdW1uKSk7CisJfQorCisJcHJvdGVjdGVkIEludGVnZXIgZ2V0UmVzb3VyY2VMZW5ndGgoWG1sQ29sdW1uIGNvbHVtbikgeworCQlyZXR1cm4gY29sdW1uID09IG51bGwgPyBudWxsIDogY29sdW1uLmdldExlbmd0aCgpOworCX0KKworCXByb3RlY3RlZCBJbnRlZ2VyIGdldFJlc291cmNlUHJlY2lzaW9uKFhtbENvbHVtbiBjb2x1bW4pIHsKKwkJcmV0dXJuIGNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGNvbHVtbi5nZXRQcmVjaXNpb24oKTsKKwl9CisJCisJcHJvdGVjdGVkIEludGVnZXIgZ2V0UmVzb3VyY2VTY2FsZShYbWxDb2x1bW4gY29sdW1uKSB7CisJCXJldHVybiBjb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBjb2x1bW4uZ2V0U2NhbGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjQ2ZGIyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQpAQCAtMCwwICsxLDIzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybURpc2NyaW1pbmF0b3JDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1OYW1lZENvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbERpc2NyaW1pbmF0b3JDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybURpc2NyaW1pbmF0b3JDb2x1bW4gZXh0ZW5kcyBBYnN0cmFjdE9ybU5hbWVkQ29sdW1uPFhtbERpc2NyaW1pbmF0b3JDb2x1bW4+CisJaW1wbGVtZW50cyBPcm1EaXNjcmltaW5hdG9yQ29sdW1uCit7CisKKwlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGU7CisJCisJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGRlZmF1bHREaXNjcmltaW5hdG9yVHlwZTsKKworCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZExlbmd0aDsKKwkKKwlwcm90ZWN0ZWQgaW50IGRlZmF1bHRMZW5ndGg7CisKKwlwcm90ZWN0ZWQgWG1sRW50aXR5IGVudGl0eTsKKwkKKwlwdWJsaWMgR2VuZXJpY09ybURpc2NyaW1pbmF0b3JDb2x1bW4oWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPcm1EaXNjcmltaW5hdG9yQ29sdW1uLk93bmVyIG93bmVyKSB7CisJCXN1cGVyKHBhcmVudCwgb3duZXIpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lciBnZXRPd25lcigpIHsKKwkJcmV0dXJuIChPcm1EaXNjcmltaW5hdG9yQ29sdW1uLk93bmVyKSBzdXBlci5nZXRPd25lcigpOworCX0KKworCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXREaXNjcmltaW5hdG9yVHlwZSgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpIDogdGhpcy5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpOworCX0KKworCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVHlwZTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKSB7CisJCURpc2NyaW1pbmF0b3JUeXBlIG9sZCA9IHRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlOworCQl0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVHlwZSA9IGRpc2NyaW1pbmF0b3JUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZLCBvbGQsIGRpc2NyaW1pbmF0b3JUeXBlKTsKKwl9CisJCQorCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKSB7CisJCURpc2NyaW1pbmF0b3JUeXBlIG9sZERpc2NyaW1pbmF0b3JUeXBlID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKKwkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSA9IG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOworCQlpZiAob2xkRGlzY3JpbWluYXRvclR5cGUgIT0gbmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUpIHsKKwkJCWlmICh0aGlzLmdldFJlc291cmNlQ29sdW1uKCkgIT0gbnVsbCkgeworCQkJCXRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUpKTsKKwkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpLmlzVW5zZXQoKSkgeworCQkJCQlyZW1vdmVSZXNvdXJjZUNvbHVtbigpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlICE9IG51bGwpIHsKKwkJCQlhZGRSZXNvdXJjZUNvbHVtbigpOworCQkJCXRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUpKTsKKwkJCX0KKwkJfQorCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERpc2NyaW1pbmF0b3JDb2x1bW4uU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkRGlzY3JpbWluYXRvclR5cGUsIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGVfKERpc2NyaW1pbmF0b3JUeXBlIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKSB7CisJCURpc2NyaW1pbmF0b3JUeXBlIG9sZERpc2NyaW1pbmF0b3JUeXBlID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKKwkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSA9IG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERpc2NyaW1pbmF0b3JDb2x1bW4uU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkRGlzY3JpbWluYXRvclR5cGUsIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKTsKKwl9CisJCQorCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRMZW5ndGgoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkuaW50VmFsdWUoKTsKKwl9CisKKwlwdWJsaWMgaW50IGdldERlZmF1bHRMZW5ndGgoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRMZW5ndGg7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRMZW5ndGgoaW50IGRlZmF1bHRMZW5ndGgpIHsKKwkJaW50IG9sZCA9IHRoaXMuZGVmYXVsdExlbmd0aDsKKwkJdGhpcy5kZWZhdWx0TGVuZ3RoID0gZGVmYXVsdExlbmd0aDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0xFTkdUSF9QUk9QRVJUWSwgb2xkLCBkZWZhdWx0TGVuZ3RoKTsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRMZW5ndGgoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZExlbmd0aDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlciBuZXdTcGVjaWZpZWRMZW5ndGgpIHsKKwkJSW50ZWdlciBvbGRTcGVjaWZpZWRMZW5ndGggPSB0aGlzLnNwZWNpZmllZExlbmd0aDsKKwkJdGhpcy5zcGVjaWZpZWRMZW5ndGggPSBuZXdTcGVjaWZpZWRMZW5ndGg7CisJCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChvbGRTcGVjaWZpZWRMZW5ndGgsIG5ld1NwZWNpZmllZExlbmd0aCkpIHsKKwkJCWlmICh0aGlzLmdldFJlc291cmNlQ29sdW1uKCkgIT0gbnVsbCkgeworCQkJCXRoaXMuZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXRMZW5ndGgobmV3U3BlY2lmaWVkTGVuZ3RoKTsKKwkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpLmlzVW5zZXQoKSkgeworCQkJCQlyZW1vdmVSZXNvdXJjZUNvbHVtbigpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZExlbmd0aCAhPSBudWxsKSB7CisJCQkJYWRkUmVzb3VyY2VDb2x1bW4oKTsKKwkJCQlnZXRSZXNvdXJjZUNvbHVtbigpLnNldExlbmd0aChuZXdTcGVjaWZpZWRMZW5ndGgpOworCQkJfQorCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTGVuZ3RoLCBuZXdTcGVjaWZpZWRMZW5ndGgpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZExlbmd0aF8oSW50ZWdlciBuZXdTcGVjaWZpZWRMZW5ndGgpIHsKKwkJSW50ZWdlciBvbGRTcGVjaWZpZWRMZW5ndGggPSB0aGlzLnNwZWNpZmllZExlbmd0aDsKKwkJdGhpcy5zcGVjaWZpZWRMZW5ndGggPSBuZXdTcGVjaWZpZWRMZW5ndGg7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTGVuZ3RoLCBuZXdTcGVjaWZpZWRMZW5ndGgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3duaW5nVGFibGVOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOworCX0KKworCQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxEaXNjcmltaW5hdG9yQ29sdW1uIGdldFJlc291cmNlQ29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy5lbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZUNvbHVtbigpIHsKKwkJdGhpcy5lbnRpdHkuc2V0RGlzY3JpbWluYXRvckNvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxEaXNjcmltaW5hdG9yQ29sdW1uKCkpOwkJCisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlQ29sdW1uKCkgeworCQl0aGlzLmVudGl0eS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKG51bGwpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1Jlc291cmNlU3BlY2lmaWVkKCkgeworCQlyZXR1cm4gZ2V0UmVzb3VyY2VDb2x1bW4oKSAhPSBudWxsOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbEVudGl0eSB4bWxFbnRpdHkpIHsKKwkJdGhpcy5lbnRpdHkgPSB4bWxFbnRpdHk7CisJCXRoaXMuaW5pdGlhbGl6ZSh0aGlzLmdldFJlc291cmNlQ29sdW1uKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sRW50aXR5IHhtbEVudGl0eSkgeworCQl0aGlzLmVudGl0eSA9IHhtbEVudGl0eTsKKwkJdGhpcy51cGRhdGUodGhpcy5nZXRSZXNvdXJjZUNvbHVtbigpKTsKKwl9CisKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbERpc2NyaW1pbmF0b3JDb2x1bW4gY29sdW1uKSB7CisJCXN1cGVyLmluaXRpYWxpemUoY29sdW1uKTsKKwkJdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclR5cGUgPSB0aGlzLmJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCk7CisJCXRoaXMuZGVmYXVsdExlbmd0aCA9IHRoaXMuYnVpbGREZWZhdWx0TGVuZ3RoKCk7CisJCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gdGhpcy5nZXRSZXNvdXJjZUxlbmd0aChjb2x1bW4pOworCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlID0gdGhpcy5nZXRSZXNvdXJjZURpc2NyaW1pbmF0b3JUeXBlKGNvbHVtbik7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShYbWxEaXNjcmltaW5hdG9yQ29sdW1uIGNvbHVtbikgeworCQkvL2Rvbid0IGNhbGwgc3VwZXIgYmVjYXVzZSBwb3N0VXBkYXRlKCkgaGFuZGxlcyB1cGRhdGluZyB0aGUgZGVmYXVsdCBjb2x1bW4gbmFtZQorCQl0aGlzLnNldFNwZWNpZmllZE5hbWVfKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW5OYW1lKGNvbHVtbikpOworCQl0aGlzLnNldENvbHVtbkRlZmluaXRpb25fKHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW5EZWZpbml0aW9uKGNvbHVtbikpOwkKKwkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGhfKHRoaXMuZ2V0UmVzb3VyY2VMZW5ndGgoY29sdW1uKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGVfKHRoaXMuZ2V0UmVzb3VyY2VEaXNjcmltaW5hdG9yVHlwZShjb2x1bW4pKTsKKwl9CisJCisJQE92ZXJyaWRlCisJLyoqCisJICogVXNpbmcgcG9zdFVwZGF0ZSBzaW5jZSB0aGVzZSBkZWZhdWx0cyBhcmUgZGVwZW5kZW50IG9uIHRoZSBlbnRpdHkgaGllcmFyY2h5CisJICovCisJcHVibGljIHZvaWQgcG9zdFVwZGF0ZSgpIHsKKwkJc3VwZXIucG9zdFVwZGF0ZSgpOworCQl0aGlzLnNldERlZmF1bHROYW1lKHRoaXMuYnVpbGREZWZhdWx0TmFtZSgpKTsKKwkJdGhpcy5zZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUodGhpcy5idWlsZERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKKwkJdGhpcy5zZXREZWZhdWx0TGVuZ3RoKHRoaXMuYnVpbGREZWZhdWx0TGVuZ3RoKCkpOwkJCisJfQorCQorCXByb3RlY3RlZCBJbnRlZ2VyIGdldFJlc291cmNlTGVuZ3RoKFhtbERpc2NyaW1pbmF0b3JDb2x1bW4gY29sdW1uKSB7CisJCXJldHVybiBjb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBjb2x1bW4uZ2V0TGVuZ3RoKCk7CisJfQorCQorCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBnZXRSZXNvdXJjZURpc2NyaW1pbmF0b3JUeXBlKFhtbERpc2NyaW1pbmF0b3JDb2x1bW4gY29sdW1uKSB7CisJCXJldHVybiBjb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBEaXNjcmltaW5hdG9yVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbChjb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7CisJfQorCQorCXByb3RlY3RlZCBpbnQgYnVpbGREZWZhdWx0TGVuZ3RoKCkgeworCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldERlZmF1bHRMZW5ndGgoKTsKKwl9CisJCisJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRPd25lcigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKSkgeworCQkJaWYgKCAhIHRoaXMuaXNSZXNvbHZlZCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRElTQ1JJTUlOQVRPUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAorCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sIAorCQkJCQkJdGhpcywKKwkJCQkJCXRoaXMuZ2V0TmFtZVRleHRSYW5nZSgpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUVtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjMGM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRhYmxlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1FbWJlZGRhYmxlCisJZXh0ZW5kcyBBYnN0cmFjdE9ybUVtYmVkZGFibGUKK3sKKwlwdWJsaWMgR2VuZXJpY09ybUVtYmVkZGFibGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxFbWJlZGRhYmxlIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoU3RyaW5nIGF0dHJpYnV0ZU1hcHBpbmdLZXkpIHsKKwkJcmV0dXJuIEFycmF5VG9vbHMuY29udGFpbnMoR2VuZXJpY0phdmFFbWJlZGRhYmxlLkFMTE9XRURfQVRUUklCVVRFX01BUFBJTkdfS0VZUywgYXR0cmlidXRlTWFwcGluZ0tleSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkZWRJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRlZElkTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNGMzMjIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkZWRJZE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOworCisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtRW1iZWRkZWRJZE1hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZzxYbWxFbWJlZGRlZElkPiAKKwlpbXBsZW1lbnRzIE9ybUVtYmVkZGVkSWRNYXBwaW5nCit7CisKKwlwdWJsaWMgR2VuZXJpY09ybUVtYmVkZGVkSWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxFbWJlZGRlZElkIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgeworCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtRW1iZWRkZWRJZE1hcHBpbmcodGhpcyk7CisJfQorCQorCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7CisJCXJldHVybiAxMDsKKwl9CisJCisJLy8qKioqKioqKioqKioqKiogQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNJZE1hcHBpbmcoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyB2b2lkIGFkZFRvUmVzb3VyY2VNb2RlbChBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0RW1iZWRkZWRJZHMoKS5hZGQodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0RW1iZWRkZWRJZHMoKS5yZW1vdmUodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRlZE1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjM3YjE1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1FbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOworCisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nCisJZXh0ZW5kcyBBYnN0cmFjdE9ybUVtYmVkZGVkTWFwcGluZzxYbWxFbWJlZGRlZD4KK3sKKwkKKwlwdWJsaWMgR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sRW1iZWRkZWQgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzY0NDk4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUVudGl0eS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1FbnRpdHkKKwlleHRlbmRzIEFic3RyYWN0T3JtRW50aXR5CisKK3sKKworCXByb3RlY3RlZCBmaW5hbCBPcm1DYWNoZWFibGUyXzAgY2FjaGVhYmxlOworCQorCXB1YmxpYyBHZW5lcmljT3JtRW50aXR5KE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sRW50aXR5IHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJCXRoaXMuY2FjaGVhYmxlID0gKChPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkpIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpKS5idWlsZE9ybUNhY2hlYWJsZSh0aGlzLCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuY2FjaGVhYmxlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgeworCQlpZiAoIWlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlDYWNoZWFibGVIb2xkZXIyXzAgamF2YUVudGl0eSA9IChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKTsKKwkJCWlmIChqYXZhRW50aXR5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gamF2YUVudGl0eS5nZXRDYWNoZWFibGUoKS5pc0NhY2hlYWJsZSgpOworCQkJfQorCQl9CisJCQorCQlDYWNoZWFibGVIb2xkZXIyXzAgcGFyZW50RW50aXR5ID0gKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0UGFyZW50RW50aXR5KCk7CisJCWlmIChwYXJlbnRFbnRpdHkgIT0gbnVsbCkgeworCQkJcmV0dXJuIHBhcmVudEVudGl0eS5nZXRDYWNoZWFibGUoKS5pc0NhY2hlYWJsZSgpOworCQl9CisJCXJldHVybiBmYWxzZTsvLygoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQlnZXRDYWNoZWFibGUoKS51cGRhdGUoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUVudW1lcmF0ZWRDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbnVtZXJhdGVkQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhODIwOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbnVtZXJhdGVkQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnVtVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybUVudW1lcmF0ZWRDb252ZXJ0ZXIgZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBFbnVtZXJhdGVkQ29udmVydGVyLCBPcm1Db252ZXJ0ZXIKK3sKKwlwcml2YXRlIEVudW1UeXBlIHNwZWNpZmllZEVudW1UeXBlOworCQorCXByaXZhdGUgWG1sQ29udmVydGlibGVNYXBwaW5nIHJlc291cmNlQ29udmVydGlibGVNYXBwaW5nOworCQorCXB1YmxpYyBHZW5lcmljT3JtRW51bWVyYXRlZENvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgWG1sQ29udmVydGlibGVNYXBwaW5nIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmluaXRpYWxpemUocmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKE9ybUF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIENvbnZlcnRlci5FTlVNRVJBVEVEX0NPTlZFUlRFUjsKKwl9CisJCisJcHVibGljIEVudW1UeXBlIGdldEVudW1UeXBlKCkgeworCQlyZXR1cm4gZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSA9PSBudWxsID8gZ2V0RGVmYXVsdEVudW1UeXBlKCkgOiBnZXRTcGVjaWZpZWRFbnVtVHlwZSgpOworCX0KKwkKKwlwdWJsaWMgRW51bVR5cGUgZ2V0RGVmYXVsdEVudW1UeXBlKCkgeworCQkvL3RoZXJlIGlzIG5vIGRlZmF1bHQgZW51bVR5cGUgaW4geG1sLCBpZiB5b3Ugc3BlY2lmeSB0aGUgZW51bWVyYXRlZCBlbGVtZW50LCB5b3UgbXVzdAorCQkvL3NwZWNpZnkgZWl0aGVyIE9SRElOQUwgb3IgU1RSSU5HCisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgRW51bVR5cGUgZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEVudW1UeXBlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZSBuZXdTcGVjaWZpZWRFbnVtVHlwZSkgeworCQlFbnVtVHlwZSBvbGRTcGVjaWZpZWRFbnVtVHlwZSA9IHRoaXMuc3BlY2lmaWVkRW51bVR5cGU7CisJCXRoaXMuc3BlY2lmaWVkRW51bVR5cGUgPSBuZXdTcGVjaWZpZWRFbnVtVHlwZTsKKwkJdGhpcy5yZXNvdXJjZUNvbnZlcnRpYmxlTWFwcGluZy5zZXRFbnVtZXJhdGVkKEVudW1UeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRFbnVtVHlwZSkpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVudW1lcmF0ZWRDb252ZXJ0ZXIuU1BFQ0lGSUVEX0VOVU1fVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkRW51bVR5cGUsIG5ld1NwZWNpZmllZEVudW1UeXBlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRFbnVtVHlwZV8oRW51bVR5cGUgbmV3U3BlY2lmaWVkRW51bVR5cGUpIHsKKwkJRW51bVR5cGUgb2xkU3BlY2lmaWVkRW51bVR5cGUgPSB0aGlzLnNwZWNpZmllZEVudW1UeXBlOworCQl0aGlzLnNwZWNpZmllZEVudW1UeXBlID0gbmV3U3BlY2lmaWVkRW51bVR5cGU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRW51bWVyYXRlZENvbnZlcnRlci5TUEVDSUZJRURfRU5VTV9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRFbnVtVHlwZSwgbmV3U3BlY2lmaWVkRW51bVR5cGUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbENvbnZlcnRpYmxlTWFwcGluZyByZXNvdXJjZUNvbnZlcnRpYmxlTWFwcGluZykgeworCQl0aGlzLnJlc291cmNlQ29udmVydGlibGVNYXBwaW5nID0gcmVzb3VyY2VDb252ZXJ0aWJsZU1hcHBpbmc7CisJCXRoaXMuc3BlY2lmaWVkRW51bVR5cGUgPSB0aGlzLnNwZWNpZmllZEVudW1UeXBlKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJdGhpcy5zZXRTcGVjaWZpZWRFbnVtVHlwZV8odGhpcy5zcGVjaWZpZWRFbnVtVHlwZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIEVudW1UeXBlIHNwZWNpZmllZEVudW1UeXBlKCkgeworCQlyZXR1cm4gRW51bVR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwodGhpcy5yZXNvdXJjZUNvbnZlcnRpYmxlTWFwcGluZy5nZXRFbnVtZXJhdGVkKCkpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVydGlibGVNYXBwaW5nLmdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwoKSB7CisJCXRoaXMucmVzb3VyY2VDb252ZXJ0aWJsZU1hcHBpbmcuc2V0RW51bWVyYXRlZChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKCkgeworCQl0aGlzLnJlc291cmNlQ29udmVydGlibGVNYXBwaW5nLnNldEVudW1lcmF0ZWQobnVsbCk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUdlbmVyYXRlZFZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtR2VuZXJhdGVkVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjBkNWE4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUdlbmVyYXRlZFZhbHVlLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdGVkVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUdlbmVyYXRlZFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybUdlbmVyYXRlZFZhbHVlCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBPcm1HZW5lcmF0ZWRWYWx1ZQoreworCXByb3RlY3RlZCBYbWxHZW5lcmF0ZWRWYWx1ZSByZXNvdXJjZUdlbmVyYXRlZFZhbHVlOworCQorCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBzcGVjaWZpZWRTdHJhdGVneTsKKworCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkR2VuZXJhdG9yOworCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdEdlbmVyYXRvcjsKKworCisJcHVibGljIEdlbmVyaWNPcm1HZW5lcmF0ZWRWYWx1ZShYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbEdlbmVyYXRlZFZhbHVlIHJlc291cmNlR2VuZXJhdGVkVmFsdWUpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5pbml0aWFsaXplKHJlc291cmNlR2VuZXJhdGVkVmFsdWUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbEdlbmVyYXRlZFZhbHVlIHhtbEdlbmVyYXRlZFZhbHVlKSB7CisJCXRoaXMucmVzb3VyY2VHZW5lcmF0ZWRWYWx1ZSA9IHhtbEdlbmVyYXRlZFZhbHVlOworCQl0aGlzLnNwZWNpZmllZFN0cmF0ZWd5ID0gdGhpcy5idWlsZFN0cmF0ZWd5KCk7CisJCXRoaXMuc3BlY2lmaWVkR2VuZXJhdG9yID0geG1sR2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCk7CisJCS8vVE9ETworCQl0aGlzLmRlZmF1bHRHZW5lcmF0b3IgPSBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBYbWxDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoWG1sQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKworCisJLy8gKioqKioqKioqKiBzdHJhdGVneSAqKioqKioqKioqCisKKwlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0U3RyYXRlZ3koKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRTdHJhdGVneSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkU3RyYXRlZ3kgOiB0aGlzLmdldERlZmF1bHRTdHJhdGVneSgpOworCX0KKworCXB1YmxpYyBHZW5lcmF0aW9uVHlwZSBnZXREZWZhdWx0U3RyYXRlZ3koKSB7CisJCXJldHVybiBHZW5lcmF0ZWRWYWx1ZS5ERUZBVUxUX1NUUkFURUdZOworCX0KKwkKKwlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFN0cmF0ZWd5OworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KSB7CisJCUdlbmVyYXRpb25UeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkU3RyYXRlZ3k7CisJCXRoaXMuc3BlY2lmaWVkU3RyYXRlZ3kgPSBzdHJhdGVneTsKKwkJdGhpcy5yZXNvdXJjZUdlbmVyYXRlZFZhbHVlLnNldFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChzdHJhdGVneSkpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NUUkFURUdZX1BST1BFUlRZLCBvbGQsIHN0cmF0ZWd5KTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU3RyYXRlZ3lfKEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KSB7CisJCUdlbmVyYXRpb25UeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkU3RyYXRlZ3k7CisJCXRoaXMuc3BlY2lmaWVkU3RyYXRlZ3kgPSBzdHJhdGVneTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TVFJBVEVHWV9QUk9QRVJUWSwgb2xkLCBzdHJhdGVneSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIGdlbmVyYXRvciAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldEdlbmVyYXRvcigpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEdlbmVyYXRvciAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkR2VuZXJhdG9yIDogdGhpcy5kZWZhdWx0R2VuZXJhdG9yOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdEdlbmVyYXRvcjsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEdlbmVyYXRvcihTdHJpbmcgZ2VuZXJhdG9yKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRHZW5lcmF0b3I7CisJCXRoaXMuZGVmYXVsdEdlbmVyYXRvciA9IGdlbmVyYXRvcjsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfR0VORVJBVE9SX1BST1BFUlRZLCBvbGQsIGdlbmVyYXRvcik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEdlbmVyYXRvcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRHZW5lcmF0b3IoU3RyaW5nIGdlbmVyYXRvcikgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRHZW5lcmF0b3I7CisJCXRoaXMuc3BlY2lmaWVkR2VuZXJhdG9yID0gZ2VuZXJhdG9yOworCQl0aGlzLnJlc291cmNlR2VuZXJhdGVkVmFsdWUuc2V0R2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfR0VORVJBVE9SX1BST1BFUlRZLCBvbGQsIGdlbmVyYXRvcik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkR2VuZXJhdG9yXyhTdHJpbmcgZ2VuZXJhdG9yKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZEdlbmVyYXRvcjsKKwkJdGhpcy5zcGVjaWZpZWRHZW5lcmF0b3IgPSBnZW5lcmF0b3I7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfR0VORVJBVE9SX1BST1BFUlRZLCBvbGQsIGdlbmVyYXRvcik7CisJfQorCisKKwkvLyAqKioqKioqKioqIHRleHQgcmFuZ2VzICoqKioqKioqKioKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJVGV4dFJhbmdlIHZhbGlkYXRpb25UZXh0UmFuZ2UgPSB0aGlzLnJlc291cmNlR2VuZXJhdGVkVmFsdWUuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCQlyZXR1cm4gdmFsaWRhdGlvblRleHRSYW5nZSAhPSBudWxsID8gdmFsaWRhdGlvblRleHRSYW5nZSA6IGdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEdlbmVyYXRvclRleHRSYW5nZSgpIHsKKwkJVGV4dFJhbmdlIHRleHRSYW5nZSA9ICB0aGlzLnJlc291cmNlR2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKCk7CisJCXJldHVybiB0ZXh0UmFuZ2UgIT0gbnVsbCA/IHRleHRSYW5nZSA6IGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisKKwkJU3RyaW5nIGdlbmVyYXRvciA9IHRoaXMuZ2V0R2VuZXJhdG9yKCk7CisJCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJZm9yIChJdGVyYXRvcjxHZW5lcmF0b3I+IHN0cmVhbSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9ycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCWlmIChnZW5lcmF0b3IuZXF1YWxzKHN0cmVhbS5uZXh0KCkuZ2V0TmFtZSgpKSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCW1lc3NhZ2VzLmFkZCgKKwkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLklEX01BUFBJTkdfVU5SRVNPTFZFRF9HRU5FUkFUT1JfTkFNRSwKKwkJCQluZXcgU3RyaW5nW10ge2dlbmVyYXRvcn0sCisJCQkJdGhpcy5nZXRQYXJlbnQoKSwKKwkJCQl0aGlzLmdldEdlbmVyYXRvclRleHRSYW5nZSgpCisJCQkpCisJCSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHVwZGF0ZSBmcm9tIHJlc291cmNlIG1vZGVsICoqKioqKioqKioKKworCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxHZW5lcmF0ZWRWYWx1ZSB4bWxHZW5lcmF0ZWRWYWx1ZSkgeworCQl0aGlzLnJlc291cmNlR2VuZXJhdGVkVmFsdWUgPSB4bWxHZW5lcmF0ZWRWYWx1ZTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRTdHJhdGVneV8odGhpcy5idWlsZFN0cmF0ZWd5KCkpOworCQl0aGlzLnNldFNwZWNpZmllZEdlbmVyYXRvcl8oeG1sR2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCkpOworCQkvL1RPRE8KKwkJdGhpcy5zZXREZWZhdWx0R2VuZXJhdG9yKG51bGwpOworCX0KKworCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBidWlsZFN0cmF0ZWd5KCkgeworCQlyZXR1cm4gR2VuZXJhdGlvblR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwodGhpcy5yZXNvdXJjZUdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1HZW5lcmF0b3JDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1HZW5lcmF0b3JDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWMwM2VjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUdlbmVyYXRvckNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0b3JDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVGFibGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtR2VuZXJhdG9yQ29udGFpbmVyIGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgT3JtR2VuZXJhdG9yQ29udGFpbmVyCit7CisJcHJvdGVjdGVkIE9ybVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yOworCisJcHJvdGVjdGVkIE9ybVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yOworCQorCXByb3RlY3RlZCBmaW5hbCBYbWxHZW5lcmF0b3JDb250YWluZXIgcmVzb3VyY2VHZW5lcmF0b3JDb250YWluZXI7CisJCisJcHVibGljIEdlbmVyaWNPcm1HZW5lcmF0b3JDb250YWluZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxHZW5lcmF0b3JDb250YWluZXIgcmVzb3VyY2VHZW5lcmF0b3JDb250YWluZXIpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5yZXNvdXJjZUdlbmVyYXRvckNvbnRhaW5lciA9IHJlc291cmNlR2VuZXJhdG9yQ29udGFpbmVyOworCQl0aGlzLmluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvcigpOworCQl0aGlzLmluaXRpYWxpemVUYWJsZUdlbmVyYXRvcigpOworCX0KKwkKKwlwdWJsaWMgT3JtU2VxdWVuY2VHZW5lcmF0b3IgYWRkU2VxdWVuY2VHZW5lcmF0b3IoKSB7CisJCWlmIChnZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNlcXVlbmNlR2VuZXJhdG9yIGFscmVhZHkgZXhpc3RzIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yID0gYnVpbGRSZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBidWlsZFNlcXVlbmNlR2VuZXJhdG9yKHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IpOworCQl0aGlzLnJlc291cmNlR2VuZXJhdG9yQ29udGFpbmVyLnNldFNlcXVlbmNlR2VuZXJhdG9yKHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSwgbnVsbCwgdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcik7CisJCXJldHVybiB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpIHsKKwkJaWYgKGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2VxdWVuY2VHZW5lcmF0b3IgZG9lcyBub3QgZXhpc3QsIGNhbm5vdCBiZSByZW1vdmVkIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBvbGRTZXF1ZW5jZUdlbmVyYXRvciA9IHRoaXMuc2VxdWVuY2VHZW5lcmF0b3I7CisJCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBudWxsOworCQl0aGlzLnJlc291cmNlR2VuZXJhdG9yQ29udGFpbmVyLnNldFNlcXVlbmNlR2VuZXJhdG9yKG51bGwpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkU2VxdWVuY2VHZW5lcmF0b3IsIG51bGwpOworCX0KKwkKKwlwdWJsaWMgT3JtU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSB7CisJCXJldHVybiB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNlcXVlbmNlR2VuZXJhdG9yKE9ybVNlcXVlbmNlR2VuZXJhdG9yIG5ld1NlcXVlbmNlR2VuZXJhdG9yKSB7CisJCU9ybVNlcXVlbmNlR2VuZXJhdG9yIG9sZFNlcXVlbmNlR2VuZXJhdG9yID0gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvcjsKKwkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9IG5ld1NlcXVlbmNlR2VuZXJhdG9yOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkU2VxdWVuY2VHZW5lcmF0b3IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yKTsKKwl9CisKKwlwdWJsaWMgT3JtVGFibGVHZW5lcmF0b3IgYWRkVGFibGVHZW5lcmF0b3IoKSB7CisJCWlmIChnZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRhYmxlR2VuZXJhdG9yIGFscmVhZHkgZXhpc3RzIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlYbWxUYWJsZUdlbmVyYXRvciByZXNvdXJjZVRhYmxlR2VuZXJhdG9yID0gYnVpbGRSZXNvdXJjZVRhYmxlR2VuZXJhdG9yKCk7CisJCXRoaXMudGFibGVHZW5lcmF0b3IgPSBidWlsZFRhYmxlR2VuZXJhdG9yKHJlc291cmNlVGFibGVHZW5lcmF0b3IpOworCQl0aGlzLnJlc291cmNlR2VuZXJhdG9yQ29udGFpbmVyLnNldFRhYmxlR2VuZXJhdG9yKHJlc291cmNlVGFibGVHZW5lcmF0b3IpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSwgbnVsbCwgdGhpcy50YWJsZUdlbmVyYXRvcik7CisJCXJldHVybiB0aGlzLnRhYmxlR2VuZXJhdG9yOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVUYWJsZUdlbmVyYXRvcigpIHsKKwkJaWYgKGdldFRhYmxlR2VuZXJhdG9yKCkgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGFibGVHZW5lcmF0b3IgZG9lcyBub3QgZXhpc3QsIGNhbm5vdCBiZSByZW1vdmVkIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlPcm1UYWJsZUdlbmVyYXRvciBvbGRUYWJsZUdlbmVyYXRvciA9IHRoaXMudGFibGVHZW5lcmF0b3I7CisJCXRoaXMudGFibGVHZW5lcmF0b3IgPSBudWxsOworCQl0aGlzLnJlc291cmNlR2VuZXJhdG9yQ29udGFpbmVyLnNldFRhYmxlR2VuZXJhdG9yKG51bGwpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkVGFibGVHZW5lcmF0b3IsIG51bGwpOworCX0KKwkKKwlwdWJsaWMgT3JtVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKSB7CisJCXJldHVybiB0aGlzLnRhYmxlR2VuZXJhdG9yOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKE9ybVRhYmxlR2VuZXJhdG9yIG5ld1RhYmxlR2VuZXJhdG9yKSB7CisJCU9ybVRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGhpcy50YWJsZUdlbmVyYXRvcjsKKwkJdGhpcy50YWJsZUdlbmVyYXRvciA9IG5ld1RhYmxlR2VuZXJhdG9yOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkVGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9yKCkgeworCQlpZiAodGhpcy5yZXNvdXJjZUdlbmVyYXRvckNvbnRhaW5lci5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKKwkJCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBidWlsZFNlcXVlbmNlR2VuZXJhdG9yKHRoaXMucmVzb3VyY2VHZW5lcmF0b3JDb250YWluZXIuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIFhtbFNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkUmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJfQorCQorCXByb3RlY3RlZCBPcm1TZXF1ZW5jZUdlbmVyYXRvciBidWlsZFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IpIHsKKwkJcmV0dXJuIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtU2VxdWVuY2VHZW5lcmF0b3IodGhpcywgcmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlR2VuZXJhdG9yKCkgeworCQlpZiAodGhpcy5yZXNvdXJjZUdlbmVyYXRvckNvbnRhaW5lci5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpIHsKKwkJCXRoaXMudGFibGVHZW5lcmF0b3IgPSBidWlsZFRhYmxlR2VuZXJhdG9yKHRoaXMucmVzb3VyY2VHZW5lcmF0b3JDb250YWluZXIuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIFhtbFRhYmxlR2VuZXJhdG9yIGJ1aWxkUmVzb3VyY2VUYWJsZUdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlR2VuZXJhdG9yKCk7CisJfQorCQorCXByb3RlY3RlZCBPcm1UYWJsZUdlbmVyYXRvciBidWlsZFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIHJlc291cmNlVGFibGVHZW5lcmF0b3IpIHsKKwkJcmV0dXJuIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtVGFibGVHZW5lcmF0b3IodGhpcywgcmVzb3VyY2VUYWJsZUdlbmVyYXRvcik7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJdGhpcy51cGRhdGVTZXF1ZW5jZUdlbmVyYXRvcigpOworCQl0aGlzLnVwZGF0ZVRhYmxlR2VuZXJhdG9yKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlcXVlbmNlR2VuZXJhdG9yKCkgeworCQlpZiAodGhpcy5yZXNvdXJjZUdlbmVyYXRvckNvbnRhaW5lci5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpID09IG51bGwpIHsKKwkJCWlmIChnZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKKwkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWlmIChnZXRTZXF1ZW5jZUdlbmVyYXRvcigpID09IG51bGwpIHsKKwkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcihidWlsZFNlcXVlbmNlR2VuZXJhdG9yKHRoaXMucmVzb3VyY2VHZW5lcmF0b3JDb250YWluZXIuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSkpOworCQkJfQorCQkJZWxzZSB7CisJCQkJZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS51cGRhdGUodGhpcy5yZXNvdXJjZUdlbmVyYXRvckNvbnRhaW5lci5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYWJsZUdlbmVyYXRvcigpIHsKKwkJaWYgKHRoaXMucmVzb3VyY2VHZW5lcmF0b3JDb250YWluZXIuZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSB7CisJCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSB7CisJCQkJc2V0VGFibGVHZW5lcmF0b3IobnVsbCk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSB7CisJCQkJc2V0VGFibGVHZW5lcmF0b3IoYnVpbGRUYWJsZUdlbmVyYXRvcih0aGlzLnJlc291cmNlR2VuZXJhdG9yQ29udGFpbmVyLmdldFRhYmxlR2VuZXJhdG9yKCkpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWdldFRhYmxlR2VuZXJhdG9yKCkudXBkYXRlKHRoaXMucmVzb3VyY2VHZW5lcmF0b3JDb250YWluZXIuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CisJCQl9CisJCX0KKwl9CisKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl0aGlzLnZhbGlkYXRlR2VuZXJhdG9ycyhtZXNzYWdlcyk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlR2VuZXJhdG9ycyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlmb3IgKEl0ZXJhdG9yPE9ybUdlbmVyYXRvcj4gbG9jYWxHZW5lcmF0b3JzID0gdGhpcy5nZW5lcmF0b3JzKCk7IGxvY2FsR2VuZXJhdG9ycy5oYXNOZXh0KCk7ICkgeworCQkJT3JtR2VuZXJhdG9yIGxvY2FsR2VuZXJhdG9yID0gbG9jYWxHZW5lcmF0b3JzLm5leHQoKTsKKwkJCWZvciAoSXRlcmF0b3I8R2VuZXJhdG9yPiBnbG9iYWxHZW5lcmF0b3JzID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzKCk7IGdsb2JhbEdlbmVyYXRvcnMuaGFzTmV4dCgpOyApIHsKKwkJCQlpZiAobG9jYWxHZW5lcmF0b3IuZHVwbGljYXRlcyhnbG9iYWxHZW5lcmF0b3JzLm5leHQoKSkpIHsKKwkJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FLAorCQkJCQkJCW5ldyBTdHJpbmdbXSB7bG9jYWxHZW5lcmF0b3IuZ2V0TmFtZSgpfSwKKwkJCQkJCQlsb2NhbEdlbmVyYXRvciwKKwkJCQkJCQlsb2NhbEdlbmVyYXRvci5nZXROYW1lVGV4dFJhbmdlKCkKKwkJCQkJCSkKKwkJCQkJKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIEl0ZXJhdG9yPE9ybUdlbmVyYXRvcj4gZ2VuZXJhdG9ycygpIHsKKwkJQXJyYXlMaXN0PE9ybUdlbmVyYXRvcj4gZ2VuZXJhdG9ycyA9IG5ldyBBcnJheUxpc3Q8T3JtR2VuZXJhdG9yPigpOworCQl0aGlzLmFkZEdlbmVyYXRvcnNUbyhnZW5lcmF0b3JzKTsKKwkJcmV0dXJuIGdlbmVyYXRvcnMuaXRlcmF0b3IoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmF0b3JzVG8oQXJyYXlMaXN0PE9ybUdlbmVyYXRvcj4gZ2VuZXJhdG9ycykgeworCQlpZiAodGhpcy5zZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKSB7CisJCQlnZW5lcmF0b3JzLmFkZCh0aGlzLnNlcXVlbmNlR2VuZXJhdG9yKTsKKwkJfQorCQlpZiAodGhpcy50YWJsZUdlbmVyYXRvciAhPSBudWxsKSB7CisJCQlnZW5lcmF0b3JzLmFkZCh0aGlzLnRhYmxlR2VuZXJhdG9yKTsKKwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VHZW5lcmF0b3JDb250YWluZXIuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1JZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1JZE1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njc1YjEyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUlkTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybUlkTWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtSWRNYXBwaW5nPFhtbElkPgoreworCQorCXB1YmxpYyBHZW5lcmljT3JtSWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxJZCByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Kb2luQ29sdW1uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM4MTU2NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Kb2luQ29sdW1uLmphdmEKQEAgLTAsMCArMSwyMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtQmFzZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1Kb2luQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RPcm1CYXNlQ29sdW1uPFhtbEpvaW5Db2x1bW4+IGltcGxlbWVudHMgT3JtSm9pbkNvbHVtbgoreworCisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKKworCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCisJcHJvdGVjdGVkIFhtbEpvaW5Db2x1bW4gcmVzb3VyY2VKb2luQ29sdW1uOworCisJcHVibGljIEdlbmVyaWNPcm1Kb2luQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtSm9pbkNvbHVtbi5Pd25lciBvd25lciwgWG1sSm9pbkNvbHVtbiByZXNvdXJjZUpvaW5Db2x1bW4pIHsKKwkJc3VwZXIocGFyZW50LCBvd25lcik7CisJCXRoaXMuaW5pdGlhbGl6ZShyZXNvdXJjZUpvaW5Db2x1bW4pOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKEpvaW5Db2x1bW4gb2xkQ29sdW1uKSB7CisJCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZENvbHVtbik7CisJCXNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKG9sZENvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgPyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKKwkJU3RyaW5nIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwkJdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCQlnZXRSZXNvdXJjZUNvbHVtbigpLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUsIG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgeworCQlTdHJpbmcgb2xkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5ld0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSkgeworCQlTdHJpbmcgb2xkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7CisJCXRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdEZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKKwkJcmV0dXJuIGdldE93bmVyKCkuaXNWaXJ0dWFsKHRoaXMpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtSm9pbkNvbHVtbi5Pd25lciBnZXRPd25lcigpIHsKKwkJcmV0dXJuIChPcm1Kb2luQ29sdW1uLk93bmVyKSB0aGlzLm93bmVyOworCX0KKworCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpIHsKKwkJcmV0dXJuIGdldE93bmVyKCkuZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKTsKKwl9CisKKwlwdWJsaWMgQ29sdW1uIGdldFJlZmVyZW5jZWREYkNvbHVtbigpIHsKKwkJVGFibGUgdGFibGUgPSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpOworCQlyZXR1cm4gKHRhYmxlID09IG51bGwpID8gbnVsbCA6IHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSB7CisJCXJldHVybiBnZXRSZWZlcmVuY2VkRGJDb2x1bW4oKSAhPSBudWxsOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKSB7CisJCWlmIChnZXRSZXNvdXJjZUNvbHVtbigpICE9IG51bGwpIHsKKwkJCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRSZXNvdXJjZUNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCk7CisJCQlpZiAodGV4dFJhbmdlICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGV4dFJhbmdlOworCQkJfQorCQl9CisJCXJldHVybiBnZXRPd25lcigpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9CisKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBYbWxKb2luQ29sdW1uIGdldFJlc291cmNlQ29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUpvaW5Db2x1bW47CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VDb2x1bW4oKSB7CisJCS8vam9pbkNvbHVtbnMgYXJlIHBhcnQgb2YgYSBjb2xsZWN0aW9uLCB0aGUgam9pbi1jb2x1bW4gZWxlbWVudCB3aWxsIGJlIHJlbW92ZWQvYWRkZWQKKwkJLy93aGVuIHRoZSBYbWxKb2luQ29sdW1uIGlzIHJlbW92ZWQvYWRkZWQgdG8gdGhlIFhtbEVudGl0eSBjb2xsZWN0aW9uCisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlQ29sdW1uKCkgeworCQkvL2pvaW5Db2x1bW5zIGFyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgdGhlIHBrLWpvaW4tY29sdW1uIGVsZW1lbnQgd2lsbCBiZSByZW1vdmVkL2FkZGVkCisJCS8vd2hlbiB0aGUgWG1sSm9pbkNvbHVtbiBpcyByZW1vdmVkL2FkZGVkIHRvIHRoZSBYbWxFbnRpdHkgY29sbGVjdGlvbgorCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbEpvaW5Db2x1bW4geGpjKSB7CisJCXRoaXMucmVzb3VyY2VKb2luQ29sdW1uID0geGpjOworCQlzdXBlci5pbml0aWFsaXplKHhqYyk7CisJCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSBidWlsZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHhqYyk7CisJCXRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKFhtbEpvaW5Db2x1bW4geGpjKSB7CisJCXRoaXMucmVzb3VyY2VKb2luQ29sdW1uID0geGpjOworCQlzdXBlci51cGRhdGUoeGpjKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8oYnVpbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSh4amMpKTsKKwkJdGhpcy5zZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKFhtbEpvaW5Db2x1bW4geGpjKSB7CisJCXJldHVybiAoeGpjID09IG51bGwpID8gbnVsbCA6IHhqYy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0TmFtZSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdUb29scy5idWlsZEpvaW5Db2x1bW5EZWZhdWx0TmFtZSh0aGlzKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdUb29scy5idWlsZEpvaW5Db2x1bW5EZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUodGhpcy5nZXRPd25lcigpKTsKKwl9CisJCisJCisJLy8qKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdmFsaWRhdGVOYW1lKG1lc3NhZ2VzKTsKKwkJdmFsaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZShtZXNzYWdlcyk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTmFtZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlpZiAoICEgdGhpcy5pc1Jlc29sdmVkKCkgJiYgZ2V0RGJUYWJsZSgpICE9IG51bGwpIHsKKwkJCWlmIChnZXROYW1lKCkgIT0gbnVsbCkgeworCQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkVW5yZXNvbHZlZE1lc3NhZ2UoKSk7CisJCQl9CisJCQllbHNlIGlmIChnZXRPd25lcigpLmpvaW5Db2x1bW5zU2l6ZSgpID4gMSkgeworCQkJCisJCQl9CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlpZiAoICEgdGhpcy5pc1JlZmVyZW5jZWRDb2x1bW5SZXNvbHZlZCgpICYmIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgIT0gbnVsbCkgeworCQkJaWYgKGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgIT0gbnVsbCkgeworCQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkVW5yZXNvbHZlZE1lc3NhZ2UoKSk7CisJCQl9CisJCQllbHNlIGlmIChnZXRPd25lcigpLmpvaW5Db2x1bW5zU2l6ZSgpID4gMSkgeworCQkJCQorCQkJfQorCQl9CisJfQorCQorCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFVucmVzb2x2ZWRNZXNzYWdlKCkgeworCQlPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmcgPSAoT3JtUmVsYXRpb25zaGlwTWFwcGluZykgdGhpcy5nZXRPd25lcigpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKwkJcmV0dXJuIG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpID8gdGhpcy5idWlsZFZpcnR1YWxVbnJlc29sdmVkTmFtZU1lc3NhZ2UobWFwcGluZykgOiB0aGlzLmJ1aWxkTm9uVmlydHVhbFVucmVzb2x2ZWROYW1lTWVzc2FnZSgpOworCX0KKworCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxVbnJlc29sdmVkTmFtZU1lc3NhZ2UoT3JtUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7CisJCXJldHVybiB0aGlzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAorCQkJCQkJbmV3IFN0cmluZ1tdIHttYXBwaW5nLmdldE5hbWUoKSwgdGhpcy5nZXROYW1lKCl9LAorCQkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKCkKKwkJCQkJKTsKKwl9CisKKwlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGROb25WaXJ0dWFsVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgeworCQlyZXR1cm4gdGhpcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAorCQkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKCkKKwkJCQkJKTsKKwl9CisKKwlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRVbnJlc29sdmVkUmVmZXJlbmNlQ29sdW1uTmFtZU1lc3NhZ2UoKSB7CisJCU9ybVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZyA9IChPcm1SZWxhdGlvbnNoaXBNYXBwaW5nKSB0aGlzLmdldE93bmVyKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOworCQlyZXR1cm4gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkgPyB0aGlzLmJ1aWxkVmlydHVhbFVucmVzb2x2ZWRSZWZlcmVuY2VDb2x1bW5OYW1lTWVzc2FnZShtYXBwaW5nKSA6IHRoaXMuYnVpbGROb25WaXJ0dWFsVW5yZXNvbHZlZFJlZmVyZW5jZUNvbHVtbk5hbWVNZXNzYWdlKCk7CisJfQorCisJcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVmlydHVhbFVucmVzb2x2ZWRSZWZlcmVuY2VDb2x1bW5OYW1lTWVzc2FnZShPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmcpIHsKKwkJcmV0dXJuIHRoaXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7bWFwcGluZy5nZXROYW1lKCksIHRoaXMuZ2V0TmFtZSgpfSwKKwkJCQkJCXRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKQorCQkJCQkpOworCX0KKworCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZE5vblZpcnR1YWxVbnJlc29sdmVkUmVmZXJlbmNlQ29sdW1uTmFtZU1lc3NhZ2UoKSB7CisJCXJldHVybiB0aGlzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKKwkJCQkJCXRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKQorCQkJCQkpOworCX0KKworCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoU3RyaW5nIG1zZ0lELCBTdHJpbmdbXSBwYXJtcywgVGV4dFJhbmdlIHRleHRSYW5nZSkgeworCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbXNnSUQsIHBhcm1zLCB0aGlzLCB0ZXh0UmFuZ2UpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5UYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjU4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtSm9pblRhYmxlLmphdmEKQEAgLTAsMCArMSw3NjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworLyoqCisgKiBvcm0ueG1sIGpvaW4gdGFibGUKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1Kb2luVGFibGUKKwlleHRlbmRzIEFic3RyYWN0T3JtVGFibGUKKwlpbXBsZW1lbnRzIE9ybUpvaW5UYWJsZQoreworCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uOworCisJcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxPcm1Kb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG5ldyBWZWN0b3I8T3JtSm9pbkNvbHVtbj4oKTsKKwlwcm90ZWN0ZWQgZmluYWwgT3JtSm9pbkNvbHVtbi5Pd25lciBqb2luQ29sdW1uT3duZXI7CisKKwlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBkZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW47CisKKwlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPE9ybUpvaW5Db2x1bW4+IHNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyA9IG5ldyBWZWN0b3I8T3JtSm9pbkNvbHVtbj4oKTsKKwlwcm90ZWN0ZWQgZmluYWwgT3JtSm9pbkNvbHVtbi5Pd25lciBpbnZlcnNlSm9pbkNvbHVtbk93bmVyOworCisKKwlwdWJsaWMgR2VuZXJpY09ybUpvaW5UYWJsZShPcm1Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgcGFyZW50LCBYbWxKb2luVGFibGUgcmVzb3VyY2VKb2luVGFibGUpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5qb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbk93bmVyKCk7CisJCXRoaXMuaW52ZXJzZUpvaW5Db2x1bW5Pd25lciA9IHRoaXMuYnVpbGRJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCk7CisJCXRoaXMuaW5pdGlhbGl6ZShyZXNvdXJjZUpvaW5UYWJsZSk7CisJfQorCisJcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW4uT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKSB7CisJCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7CisJfQorCisJcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW4uT3duZXIgYnVpbGRJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCkgeworCQlyZXR1cm4gbmV3IEludmVyc2VKb2luQ29sdW1uT3duZXIoKTsKKwl9CisKKwlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKEpvaW5UYWJsZSBvbGRKb2luVGFibGUpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkSm9pblRhYmxlKTsKKwkJZm9yIChJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBzdHJlYW0gPSBvbGRKb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQl0aGlzLmFkZFNwZWNpZmllZEpvaW5Db2x1bW5Gcm9tKHN0cmVhbS5uZXh0KCkpOworCQl9CisJCWZvciAoSXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gc3RyZWFtID0gb2xkSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCXRoaXMuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Gcm9tKHN0cmVhbS5uZXh0KCkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxKb2luVGFibGUgam9pblRhYmxlKSB7CisJCXN1cGVyLmluaXRpYWxpemUoam9pblRhYmxlKTsKKwkJdGhpcy5pbml0aWFsaXplU3BlY2lmaWVkSm9pbkNvbHVtbnMoam9pblRhYmxlKTsKKwkJdGhpcy5pbml0aWFsaXplRGVmYXVsdEpvaW5Db2x1bW4oKTsKKwkJdGhpcy5pbml0aWFsaXplU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKGpvaW5UYWJsZSk7CisJCXRoaXMuaW5pdGlhbGl6ZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJdGhpcy51cGRhdGUodGhpcy5nZXRSZXNvdXJjZVRhYmxlKCkpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShYbWxKb2luVGFibGUgam9pblRhYmxlKSB7CisJCXN1cGVyLnVwZGF0ZShqb2luVGFibGUpOworCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKGpvaW5UYWJsZSk7CisJCXRoaXMudXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4oKTsKKwkJdGhpcy51cGRhdGVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoam9pblRhYmxlKTsKKwkJdGhpcy51cGRhdGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQWJzdHJhY3RPcm1UYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5IGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChPcm1Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3kpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0Sm9pblRhYmxlRGVmYXVsdE5hbWUoKTsKKwl9CisKKwkvKioKKwkgKiBpZiB0aGUgam9pbiB0YWJsZSBpcyBvbiB0aGUgIm1hcHBlZEJ5IiBzaWRlLCBpdCdzIGJvZ3VzOworCSAqIHNvIGRvbid0IGdpdmUgaXQgYSBkZWZhdWx0IHNjaGVtYQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdFNjaGVtYSgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0Q2F0YWxvZygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRDYXRhbG9nKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFhtbEpvaW5UYWJsZSBnZXRSZXNvdXJjZVRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRSZXNvdXJjZUpvaW5UYWJsZSgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBYbWxKb2luVGFibGUgYWRkUmVzb3VyY2VUYWJsZSgpIHsKKwkJcmV0dXJuIGdldFBhcmVudCgpLmFkZFJlc291cmNlSm9pblRhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVzb3VyY2VUYWJsZSgpIHsKKwkJZ2V0UGFyZW50KCkucmVtb3ZlUmVzb3VyY2VKb2luVGFibGUoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogam9pbiBjb2x1bW5zICoqKioqKioqKioKKworCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMoKSB7CisJCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkgOiB0aGlzLmRlZmF1bHRKb2luQ29sdW1ucygpOworCX0KKworCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpOworCX0KKworCXB1YmxpYyB2b2lkIGNvbnZlcnREZWZhdWx0VG9TcGVjaWZpZWRKb2luQ29sdW1uKCkgeworCQlNYXBwaW5nVG9vbHMuY29udmVydEpvaW5UYWJsZURlZmF1bHRUb1NwZWNpZmllZEpvaW5Db2x1bW4odGhpcyk7CisJfQorCisKKwkvLyAqKioqKioqKioqIGRlZmF1bHQgam9pbiBjb2x1bW4gKioqKioqKioqKgorCisJcHVibGljIE9ybUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRKb2luQ29sdW1uKE9ybUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4pIHsKKwkJT3JtSm9pbkNvbHVtbiBvbGQgPSB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOworCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gZGVmYXVsdEpvaW5Db2x1bW47CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0pPSU5fQ09MVU1OLCBvbGQsIGRlZmF1bHRKb2luQ29sdW1uKTsKKwl9CisKKwlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGRlZmF1bHRKb2luQ29sdW1ucygpIHsKKwkJaWYgKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4pOworCQl9CisJCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOworCX0KKworCXByb3RlY3RlZCBpbnQgZGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IG51bGwpID8gMCA6IDE7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRKb2luQ29sdW1uKCkgeworCQlpZiAodGhpcy5zaG91bGRCdWlsZERlZmF1bHRKb2luQ29sdW1uKCkpIHsKKwkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbihudWxsKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRKb2luQ29sdW1uKCkgeworCQlpZiAodGhpcy5zaG91bGRCdWlsZERlZmF1bHRKb2luQ29sdW1uKCkpIHsKKwkJCWlmICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IG51bGwpIHsKKwkJCQl0aGlzLnNldERlZmF1bHRKb2luQ29sdW1uKHRoaXMuYnVpbGRKb2luQ29sdW1uKG51bGwpKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbi51cGRhdGUobnVsbCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aGlzLnNldERlZmF1bHRKb2luQ29sdW1uKG51bGwpOworCQl9CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQnVpbGREZWZhdWx0Sm9pbkNvbHVtbigpIHsKKwkJcmV0dXJuICEgdGhpcy5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpOworCX0KKworCisJLy8gKioqKioqKioqKiBzcGVjaWZpZWQgam9pbiBjb2x1bW5zICoqKioqKioqKioKKworCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4odGhpcy5zcGVjaWZpZWRKb2luQ29sdW1ucyk7CisJfQorCisJcHVibGljIGludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuc2l6ZSgpICE9IDA7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSm9pbkNvbHVtbkZyb20oT3JtSm9pbkNvbHVtbiBvbGRKb2luQ29sdW1uKSB7CisJCU9ybUpvaW5Db2x1bW4gbmV3Sm9pbkNvbHVtbiA9IHRoaXMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLnNpemUoKSk7CisJCW5ld0pvaW5Db2x1bW4uaW5pdGlhbGl6ZUZyb20ob2xkSm9pbkNvbHVtbik7CisJfQorCisJcHVibGljIE9ybUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKKwkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VUYWJsZSgpID09IG51bGwpIHsKKwkJCXRoaXMuYWRkUmVzb3VyY2VUYWJsZSgpOworCQl9CisJCVhtbEpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKTsKKwkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5idWlsZEpvaW5Db2x1bW4oeG1sSm9pbkNvbHVtbik7CisJCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuYWRkKGluZGV4LCBqb2luQ29sdW1uKTsKKwkJdGhpcy5nZXRSZXNvdXJjZVRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoaW5kZXgsIHhtbEpvaW5Db2x1bW4pOworCQl0aGlzLmZpcmVJdGVtQWRkZWQoU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgam9pbkNvbHVtbik7CisJCXJldHVybiBqb2luQ29sdW1uOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4LCBPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBqb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCBTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCXRoaXMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLnNpemUoKSwgam9pbkNvbHVtbik7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJdGhpcy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuaW5kZXhPZihqb2luQ29sdW1uKSk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKKwkJT3JtSm9pbkNvbHVtbiByZW1vdmVkSm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKKwkJaWYgKCAhIHRoaXMuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkgeworCQkJLy9jcmVhdGUgdGhlIGRlZmF1bHRKb2luQ29sdW1uIG5vdyBvciB0aGlzIHdpbGwgaGFwcGVuIGR1cmluZyBwcm9qZWN0IHVwZGF0ZSAKKwkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLiBUaGF0IGNhdXNlcyBwcm9ibGVtcyAKKwkJCS8vaW4gdGhlIFVJIGJlY2F1c2UgdGhlIGNoYW5nZSBub3RpZmljYXRpb25zIGVuZCB1cCBpbiB0aGUgd3Jvbmcgb3JkZXIuCisJCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gdGhpcy5idWlsZEpvaW5Db2x1bW4obnVsbCk7CisJCX0KKwkJdGhpcy5nZXRSZXNvdXJjZVRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoaW5kZXgpOworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCByZW1vdmVkSm9pbkNvbHVtbik7CisJCWlmICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKKwkJCS8vZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIGEgZGVmYXVsdEpvaW5Db2x1bW4gd2FzIGNyZWF0ZWQgYWJvdmUKKwkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0pPSU5fQ09MVU1OLCBudWxsLCB0aGlzLmRlZmF1bHRKb2luQ29sdW1uKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW5fKE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChqb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zLCBTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCXRoaXMuZ2V0UmVzb3VyY2VUYWJsZSgpLmdldEpvaW5Db2x1bW5zKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl0aGlzLmZpcmVJdGVtTW92ZWQoU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCX0KKworCXB1YmxpYyB2b2lkIGNsZWFyU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7CisJCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuY2xlYXIoKTsKKwkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9IHRoaXMuYnVpbGRKb2luQ29sdW1uKG51bGwpOworCQl0aGlzLmdldFJlc291cmNlVGFibGUoKS5nZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7CisJCXRoaXMuZmlyZUxpc3RDbGVhcmVkKFNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0pPSU5fQ09MVU1OLCBudWxsLCB0aGlzLmRlZmF1bHRKb2luQ29sdW1uKTsKKwl9CisKKwlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBidWlsZEpvaW5Db2x1bW4oWG1sSm9pbkNvbHVtbiByZXNvdXJjZUpvaW5Db2x1bW4pIHsKKwkJcmV0dXJuIHRoaXMuYnVpbGRKb2luQ29sdW1uKHJlc291cmNlSm9pbkNvbHVtbiwgdGhpcy5qb2luQ29sdW1uT3duZXIpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRKb2luQ29sdW1ucyhYbWxKb2luVGFibGUgeG1sSm9pblRhYmxlKSB7CisJCWlmICh4bWxKb2luVGFibGUgIT0gbnVsbCkgeworCQkJZm9yIChYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4gOiB4bWxKb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKSkgeworCQkJCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbnMuYWRkKHRoaXMuYnVpbGRKb2luQ29sdW1uKHhtbEpvaW5Db2x1bW4pKTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKFhtbEpvaW5UYWJsZSB4bWxKb2luVGFibGUpIHsKKwkJSXRlcmF0b3I8WG1sSm9pbkNvbHVtbj4geG1sSm9pbkNvbHVtbnMgPSB0aGlzLnhtbEpvaW5Db2x1bW5zKHhtbEpvaW5UYWJsZSk7CisKKwkJZm9yIChJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBjb250ZXh0Sm9pbkNvbHVtbnMgPSB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7IGNvbnRleHRKb2luQ29sdW1ucy5oYXNOZXh0KCk7ICkgeworCQkJT3JtSm9pbkNvbHVtbiBjb250ZXh0Sm9pbkNvbHVtbiA9IGNvbnRleHRKb2luQ29sdW1ucy5uZXh0KCk7CisJCQlpZiAoeG1sSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7CisJCQkJY29udGV4dEpvaW5Db2x1bW4udXBkYXRlKHhtbEpvaW5Db2x1bW5zLm5leHQoKSk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbl8oY29udGV4dEpvaW5Db2x1bW4pOworCQkJfQorCQl9CisKKwkJd2hpbGUgKHhtbEpvaW5Db2x1bW5zLmhhc05leHQoKSkgeworCQkJdGhpcy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKHRoaXMuYnVpbGRKb2luQ29sdW1uKHhtbEpvaW5Db2x1bW5zLm5leHQoKSkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFhtbEpvaW5Db2x1bW4+IHhtbEpvaW5Db2x1bW5zKFhtbEpvaW5UYWJsZSB4bWxKb2luVGFibGUpIHsKKwkJLy8gbWFrZSBhIGNvcHkgb2YgdGhlIFhNTCBqb2luIGNvbHVtbnMgKHRvIHByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbikKKwkJcmV0dXJuICh4bWxKb2luVGFibGUgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhdG9yLjxYbWxKb2luQ29sdW1uPmluc3RhbmNlKCkKKwkJCTogbmV3IENsb25lSXRlcmF0b3I8WG1sSm9pbkNvbHVtbj4oeG1sSm9pblRhYmxlLmdldEpvaW5Db2x1bW5zKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBpbnZlcnNlIGpvaW4gY29sdW1ucyAqKioqKioqKioqCisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGludmVyc2VKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgPyB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpIDogdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zKCk7CisJfQorCisJcHVibGljIGludCBpbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSA/IHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOworCX0KKworCXB1YmxpYyB2b2lkIGNvbnZlcnREZWZhdWx0VG9TcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigpIHsKKwkJTWFwcGluZ1Rvb2xzLmNvbnZlcnRKb2luVGFibGVEZWZhdWx0VG9TcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbih0aGlzKTsKKwl9CisKKworCS8vICoqKioqKioqKiogZGVmYXVsdCBpbnZlcnNlIGpvaW4gY29sdW1uICoqKioqKioqKioKKworCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbihPcm1Kb2luQ29sdW1uIGRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbikgeworCQlPcm1Kb2luQ29sdW1uIG9sZCA9IHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uOworCQl0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiA9IGRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSU5WRVJTRV9KT0lOX0NPTFVNTiwgb2xkLCBkZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4pOworCX0KKworCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gZGVmYXVsdEludmVyc2VKb2luQ29sdW1ucygpIHsKKwkJaWYgKHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uICE9IG51bGwpIHsKKwkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPih0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbik7CisJCX0KKwkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7CisJfQorCisJcHJvdGVjdGVkIGludCBkZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuICh0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7CisJCWlmICh0aGlzLnNob3VsZEJ1aWxkRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkpIHsKKwkJCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gdGhpcy5idWlsZEludmVyc2VKb2luQ29sdW1uKG51bGwpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkgeworCQlpZiAodGhpcy5zaG91bGRCdWlsZERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpKSB7CisJCQlpZiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPT0gbnVsbCkgeworCQkJCXRoaXMuc2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKHRoaXMuYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihudWxsKSk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uLnVwZGF0ZShudWxsKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoaXMuc2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKG51bGwpOworCQl9CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQnVpbGREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7CisJCXJldHVybiAhIHRoaXMuaGFzU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHNwZWNpZmllZCBpbnZlcnNlIGpvaW4gY29sdW1ucyAqKioqKioqKioqCisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IHNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyk7CisJfQorCisJcHVibGljIGludCBzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMuc2l6ZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuICF0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucy5pc0VtcHR5KCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Gcm9tKE9ybUpvaW5Db2x1bW4gb2xkSm9pbkNvbHVtbikgeworCQlPcm1Kb2luQ29sdW1uIG5ld0pvaW5Db2x1bW4gPSB0aGlzLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLnNpemUoKSk7CisJCW5ld0pvaW5Db2x1bW4uaW5pdGlhbGl6ZUZyb20ob2xkSm9pbkNvbHVtbik7CisJfQorCisJcHVibGljIE9ybUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCWlmICh0aGlzLmdldFJlc291cmNlVGFibGUoKSA9PSBudWxsKSB7CisJCQl0aGlzLmFkZFJlc291cmNlVGFibGUoKTsKKwkJfQorCQlYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4gPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCk7CisJCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHRoaXMuYnVpbGRJbnZlcnNlSm9pbkNvbHVtbih4bWxKb2luQ29sdW1uKTsKKwkJdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMuYWRkKGluZGV4LCBqb2luQ29sdW1uKTsKKwkJdGhpcy5nZXRSZXNvdXJjZVRhYmxlKCkuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuYWRkKGluZGV4LCB4bWxKb2luQ29sdW1uKTsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKFNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgam9pbkNvbHVtbik7CisJCXJldHVybiBqb2luQ29sdW1uOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCwgT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgam9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMsIFNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJdGhpcy5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucy5zaXplKCksIGpvaW5Db2x1bW4pOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQl0aGlzLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLmluZGV4T2Yoam9pbkNvbHVtbikpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCkgeworCQlPcm1Kb2luQ29sdW1uIHJlbW92ZWRKb2luQ29sdW1uID0gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKKwkJaWYgKCAhIHRoaXMuaGFzU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkpIHsKKwkJCS8vY3JlYXRlIHRoZSBkZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gbm93IG9yIHRoaXMgd2lsbCBoYXBwZW4gZHVyaW5nIHByb2plY3QgdXBkYXRlIAorCQkJLy9hZnRlciByZW1vdmluZyB0aGUgam9pbiBjb2x1bW4gZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwuIFRoYXQgY2F1c2VzIHByb2JsZW1zIAorCQkJLy9pbiB0aGUgVUkgYmVjYXVzZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgZW5kIHVwIGluIHRoZSB3cm9uZyBvcmRlci4KKwkJCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gdGhpcy5idWlsZEludmVyc2VKb2luQ29sdW1uKG51bGwpOworCQl9CisJCXRoaXMuZ2V0UmVzb3VyY2VUYWJsZSgpLmdldEludmVyc2VKb2luQ29sdW1ucygpLnJlbW92ZShpbmRleCk7CisJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcmVtb3ZlZEpvaW5Db2x1bW4pOworCQlpZiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gIT0gbnVsbCkgeworCQkJLy9maXJlIGNoYW5nZSBub3RpZmljYXRpb24gaWYgYSBkZWZhdWx0Sm9pbkNvbHVtbiB3YXMgY3JlYXRlZCBhYm92ZQorCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSU5WRVJTRV9KT0lOX0NPTFVNTiwgbnVsbCwgdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4pOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5fKE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChqb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucywgU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJdGhpcy5nZXRSZXNvdXJjZVRhYmxlKCkuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl0aGlzLmZpcmVJdGVtTW92ZWQoU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJfQorCisJcHVibGljIHZvaWQgY2xlYXJTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7CisJCXRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zLmNsZWFyKCk7CisJCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gdGhpcy5idWlsZEludmVyc2VKb2luQ29sdW1uKG51bGwpOworCQl0aGlzLmdldFJlc291cmNlVGFibGUoKS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5jbGVhcigpOworCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChTUEVDSUZJRURfSU5WRVJTRV9KT0lOX0NPTFVNTlNfTElTVCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0lOVkVSU0VfSk9JTl9DT0xVTU4sIG51bGwsIHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uKTsKKwl9CisKKwlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBidWlsZEludmVyc2VKb2luQ29sdW1uKFhtbEpvaW5Db2x1bW4gcmVzb3VyY2VKb2luQ29sdW1uKSB7CisJCXJldHVybiB0aGlzLmJ1aWxkSm9pbkNvbHVtbihyZXNvdXJjZUpvaW5Db2x1bW4sIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5Pd25lcik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyhYbWxKb2luVGFibGUgeG1sSm9pblRhYmxlKSB7CisJCWlmICh4bWxKb2luVGFibGUgIT0gbnVsbCkgeworCQkJZm9yIChYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4gOiB4bWxKb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkpIHsKKwkJCQl0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucy5hZGQodGhpcy5idWlsZEludmVyc2VKb2luQ29sdW1uKHhtbEpvaW5Db2x1bW4pKTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyhYbWxKb2luVGFibGUgeG1sSm9pblRhYmxlKSB7CisJCUl0ZXJhdG9yPFhtbEpvaW5Db2x1bW4+IHhtbEpvaW5Db2x1bW5zID0gdGhpcy54bWxJbnZlcnNlSm9pbkNvbHVtbnMoeG1sSm9pblRhYmxlKTsKKworCQlmb3IgKExpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBjb250ZXh0Sm9pbkNvbHVtbnMgPSB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOyBjb250ZXh0Sm9pbkNvbHVtbnMuaGFzTmV4dCgpOyApIHsKKwkJCU9ybUpvaW5Db2x1bW4gY29udGV4dENvbHVtbiA9IGNvbnRleHRKb2luQ29sdW1ucy5uZXh0KCk7CisJCQlpZiAoeG1sSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7CisJCQkJY29udGV4dENvbHVtbi51cGRhdGUoeG1sSm9pbkNvbHVtbnMubmV4dCgpKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbl8oY29udGV4dENvbHVtbik7CisJCQl9CisJCX0KKworCQl3aGlsZSAoeG1sSm9pbkNvbHVtbnMuaGFzTmV4dCgpKSB7CisJCQl0aGlzLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKHRoaXMuYnVpbGRJbnZlcnNlSm9pbkNvbHVtbih4bWxKb2luQ29sdW1ucy5uZXh0KCkpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxYbWxKb2luQ29sdW1uPiB4bWxJbnZlcnNlSm9pbkNvbHVtbnMoWG1sSm9pblRhYmxlIHhtbEpvaW5UYWJsZSkgeworCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgWE1MIGpvaW4gY29sdW1ucyAodG8gcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKQorCQlyZXR1cm4gKHhtbEpvaW5UYWJsZSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPFhtbEpvaW5Db2x1bW4+aW5zdGFuY2UoKQorCQkJOiBuZXcgQ2xvbmVJdGVyYXRvcjxYbWxKb2luQ29sdW1uPih4bWxKb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKKworCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uIGJ1aWxkSm9pbkNvbHVtbihYbWxKb2luQ29sdW1uIHJlc291cmNlSm9pbkNvbHVtbiwgT3JtSm9pbkNvbHVtbi5Pd25lciBvd25lcikgeworCQlyZXR1cm4gdGhpcy5nZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUpvaW5Db2x1bW4odGhpcywgb3duZXIsIHJlc291cmNlSm9pbkNvbHVtbik7CisJfQorCisKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQlpZiAodGhpcy5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkpIHsKKwkJCXRoaXMudmFsaWRhdGVBZ2FpbnN0RGF0YWJhc2UobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQWdhaW5zdERhdGFiYXNlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7CisKKwkJaWYgKCAhIHRoaXMuaGFzUmVzb2x2ZWRDYXRhbG9nKCkpIHsKKwkJCWlmIChtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgeworCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HLAorCQkJCQkJbmV3IFN0cmluZ1tdIHttYXBwaW5nLmdldE5hbWUoKSwgdGhpcy5nZXRDYXRhbG9nKCksIHRoaXMuZ2V0TmFtZSgpfSwgCisJCQkJCQl0aGlzLAorCQkJCQkJdGhpcy5nZXRDYXRhbG9nVGV4dFJhbmdlKCkKKwkJCQkJKQorCQkJCSk7CisKKwkJCX0gZWxzZSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0csCisJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0Q2F0YWxvZygpLCB0aGlzLmdldE5hbWUoKX0sIAorCQkJCQkJdGhpcywKKwkJCQkJCXRoaXMuZ2V0Q2F0YWxvZ1RleHRSYW5nZSgpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKCAhIHRoaXMuaGFzUmVzb2x2ZWRTY2hlbWEoKSkgeworCQkJaWYgKG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7bWFwcGluZy5nZXROYW1lKCksIHRoaXMuZ2V0U2NoZW1hKCksIHRoaXMuZ2V0TmFtZSgpfSwgCisJCQkJCQl0aGlzLAorCQkJCQkJdGhpcy5nZXRTY2hlbWFUZXh0UmFuZ2UoKQorCQkJCQkpCisJCQkJKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSwKKwkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRTY2hlbWEoKSwgdGhpcy5nZXROYW1lKCl9LCAKKwkJCQkJCXRoaXMsCisJCQkJCQl0aGlzLmdldFNjaGVtYVRleHRSYW5nZSgpCisJCQkJCSkKKwkJCQkpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCWlmICggISB0aGlzLmlzUmVzb2x2ZWQoKSkgeworCQkJaWYgKGdldE5hbWUoKSAhPSBudWxsKSB7IC8vaWYgbmFtZSBpcyBudWxsLCB0aGUgdmFsaWRhdGlvbiB3aWxsIGJlIGhhbmRsZWQgZWxzZXdoZXJlLCBzdWNoIGFzIHRoZSB0YXJnZXQgZW50aXR5IGlzIG5vdCBkZWZpbmVkCisJCQkJaWYgKG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7CisJCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FLAorCQkJCQkJCW5ldyBTdHJpbmdbXSB7bWFwcGluZy5nZXROYW1lKCksIHRoaXMuZ2V0TmFtZSgpfSwgCisJCQkJCQkJdGhpcywKKwkJCQkJCQl0aGlzLmdldE5hbWVUZXh0UmFuZ2UoKQorCQkJCQkJKQorCQkJCQkpOworCQkJCX0gCisJCQkJZWxzZSB7CisJCQkJCW1lc3NhZ2VzLmFkZCgKKwkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUUsCisJCQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LCAKKwkJCQkJCQkJdGhpcywgCisJCQkJCQkJCXRoaXMuZ2V0TmFtZVRleHRSYW5nZSgpKQorCQkJCQkJKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm47CisJCX0KKworCQl0aGlzLnZhbGlkYXRlSm9pbkNvbHVtbnModGhpcy5qb2luQ29sdW1ucygpLCBtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl0aGlzLnZhbGlkYXRlSm9pbkNvbHVtbnModGhpcy5pbnZlcnNlSm9pbkNvbHVtbnMoKSwgbWVzc2FnZXMsIHJlcG9ydGVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUpvaW5Db2x1bW5zKEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXdoaWxlIChqb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKKwkJCWpvaW5Db2x1bW5zLm5leHQoKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIGpvaW4gY29sdW1uIG93bmVyIGFkYXB0ZXJzICoqKioqKioqKioKKworCS8qKgorCSAqIGp1c3QgYSBsaXR0bGUgY29tbW9uIGJlaGF2aW9yCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyCisJCWltcGxlbWVudHMgT3JtSm9pbkNvbHVtbi5Pd25lcgorCXsKKwkJcHJvdGVjdGVkIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCisJCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKKwkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0UGFyZW50KCkuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0VHlwZU1hcHBpbmcoKTsKKwkJfQorCisJCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7CisJCQlyZXR1cm4gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKwkJfQorCisJCS8qKgorCQkgKiB0aGUgZGVmYXVsdCB0YWJsZSBuYW1lIGlzIGFsd2F5cyB2YWxpZCBhbmQgYSBzcGVjaWZpZWQgdGFibGUgbmFtZQorCQkgKiBpcyBwcm9oaWJpdGVkICh3aGljaCB3aWxsIGJlIGhhbmRsZWQgZWxzZXdoZXJlKQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8qKgorCQkgKiB0aGUgam9pbiBjb2x1bW4gY2FuIG9ubHkgYmUgb24gdGhlIGpvaW4gdGFibGUgaXRzZWxmCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiB0YWJsZUlzQWxsb3dlZCgpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7CisJCQlTdHJpbmcgam9pblRhYmxlTmFtZSA9IEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5nZXROYW1lKCk7CisJCQlyZXR1cm4gKGpvaW5UYWJsZU5hbWUgPT0gbnVsbCkgPyBudWxsIDogKGpvaW5UYWJsZU5hbWUuZXF1YWxzKHRhYmxlTmFtZSkpID8gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmdldERiVGFibGUoKSA6IG51bGw7CisJCX0KKworCQkvKioKKwkJICogYnkgZGVmYXVsdCwgdGhlIGpvaW4gY29sdW1uIGlzLCBvYnZpb3VzbHksIGluIHRoZSBqb2luIHRhYmxlOworCQkgKiBub3Qgc3VyZSB3aGV0aGVyIGl0IGNhbiBiZSBhbnl3aGVyZSBlbHNlLi4uCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7CisJCQlyZXR1cm4gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmdldE5hbWUoKTsKKwkJfQorCisJCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCQl9CisJfQorCisKKwkvKioKKwkgKiBvd25lciBmb3IgImJhY2stcG9pbnRlciIgSm9pbkNvbHVtbnM7CisJICogdGhlc2UgcG9pbnQgYXQgdGhlIHNvdXJjZS9vd25pbmcgZW50aXR5CisJICovCisJcHJvdGVjdGVkIGNsYXNzIEpvaW5Db2x1bW5Pd25lcgorCQlleHRlbmRzIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyCisJeworCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbk93bmVyKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCisJCXB1YmxpYyBFbnRpdHkgZ2V0VGFyZ2V0RW50aXR5KCkgeworCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5nZXRQYXJlbnQoKS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRFbnRpdHkoKTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKKwkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7CisJCQlpZiAodGFyZ2V0RW50aXR5ID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWZvciAoUGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRhcmdldEVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZXMoKSkpIHsKKwkJCQlpZiAoZWFjaC5nZXRNYXBwaW5nKCkuaXNPd25lZEJ5KHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpKSkgeworCQkJCQlyZXR1cm4gZWFjaC5nZXROYW1lKCk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKKwkJCW9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZSBkYlRhYmxlID0gc3VwZXIuZ2V0RGJUYWJsZSh0YWJsZU5hbWUpOworCQkJcmV0dXJuIChkYlRhYmxlICE9IG51bGwpID8gZGJUYWJsZSA6IHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXREYlRhYmxlKHRhYmxlTmFtZSk7CisJCX0KKworCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgeworCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeURiVGFibGUoKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbChCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCQlyZXR1cm4gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IGpvaW5Db2x1bW47CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgeworCQkJLy9idWlsdCBpbiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luQ29sdW1uRGVmYXVsdE5hbWUoKQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuam9pbkNvbHVtbnNTaXplKCk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIG93bmVyIGZvciAiZm9yd2FyZC1wb2ludGVyIiBKb2luQ29sdW1uczsKKwkgKiB0aGVzZSBwb2ludCBhdCB0aGUgdGFyZ2V0L2ludmVyc2UgZW50aXR5CisJICovCisJcHJvdGVjdGVkIGNsYXNzIEludmVyc2VKb2luQ29sdW1uT3duZXIKKwkJZXh0ZW5kcyBBYnN0cmFjdEpvaW5Db2x1bW5Pd25lcgorCXsKKwkJcHJvdGVjdGVkIEludmVyc2VKb2luQ29sdW1uT3duZXIoKSB7CisJCQlzdXBlcigpOworCQl9CisKKwkJcHVibGljIEVudGl0eSBnZXRUYXJnZXRFbnRpdHkoKSB7CisJCQlyZXR1cm4gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgeworCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0TmFtZSgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7CisJCQlvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZGJUYWJsZSA9IHN1cGVyLmdldERiVGFibGUodGFibGVOYW1lKTsKKwkJCWlmIChkYlRhYmxlICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gZGJUYWJsZTsKKwkJCX0KKwkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSB0aGlzLmdldFRhcmdldEVudGl0eSgpOworCQkJcmV0dXJuICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogdGFyZ2V0RW50aXR5LmdldERiVGFibGUodGFibGVOYW1lKTsKKwkJfQorCisJCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7CisJCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gdGhpcy5nZXRUYXJnZXRFbnRpdHkoKTsKKwkJCXJldHVybiAodGFyZ2V0RW50aXR5ID09IG51bGwpID8gbnVsbCA6IHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID09IGpvaW5Db2x1bW47CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKCkgeworCQkJLy9idWlsdCBpbiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luQ29sdW1uRGVmYXVsdE5hbWUoKQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtTG9iQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtTG9iQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmZDY4NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Mb2JDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkxvYkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtTG9iQ29udmVydGVyIGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgTG9iQ29udmVydGVyLCBPcm1Db252ZXJ0ZXIKK3sKKwlwcml2YXRlIFhtbENvbnZlcnRpYmxlTWFwcGluZyByZXNvdXJjZUNvbnZlcnRpYmxlTWFwcGluZzsKKwkKKwlwdWJsaWMgR2VuZXJpY09ybUxvYkNvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgWG1sQ29udmVydGlibGVNYXBwaW5nIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmluaXRpYWxpemUocmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKE9ybUF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiBDb252ZXJ0ZXIuTE9CX0NPTlZFUlRFUjsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxDb252ZXJ0aWJsZU1hcHBpbmcgcmVzb3VyY2VDb252ZXJ0aWJsZU1hcHBpbmcpIHsKKwkJdGhpcy5yZXNvdXJjZUNvbnZlcnRpYmxlTWFwcGluZyA9IHJlc291cmNlQ29udmVydGlibGVNYXBwaW5nOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCS8vZG8gbm90aGluZworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVydGlibGVNYXBwaW5nLmdldExvYlRleHRSYW5nZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwoKSB7CisJCXRoaXMucmVzb3VyY2VDb252ZXJ0aWJsZU1hcHBpbmcuc2V0TG9iKHRydWUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbCgpIHsKKwkJdGhpcy5yZXNvdXJjZUNvbnZlcnRpYmxlTWFwcGluZy5zZXRMb2IoZmFsc2UpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE3YTkyYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1NYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZworCWV4dGVuZHMgQWJzdHJhY3RPcm1NYW55VG9NYW55TWFwcGluZzxYbWxNYW55VG9NYW55PgoreworCXB1YmxpYyBHZW5lcmljT3JtTWFueVRvTWFueU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE1hbnlUb01hbnkgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb09uZU1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjJkY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb09uZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybU1hbnlUb09uZU1hcHBpbmcgCisJZXh0ZW5kcyBBYnN0cmFjdE9ybU1hbnlUb09uZU1hcHBpbmc8WG1sTWFueVRvT25lPgoreworCXB1YmxpYyBHZW5lcmljT3JtTWFueVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBwZWRTdXBlcmNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiOWVhMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBwZWRTdXBlcmNsYXNzLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1NYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOworCisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtTWFwcGVkU3VwZXJjbGFzcyBleHRlbmRzIEFic3RyYWN0T3JtTWFwcGVkU3VwZXJjbGFzcworeworCQorCXB1YmxpYyBHZW5lcmljT3JtTWFwcGVkU3VwZXJjbGFzcyhPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtTmFtZWROYXRpdmVRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZmE4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtTmFtZWROYXRpdmVRdWVyeS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWROYXRpdmVRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkTmF0aXZlUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1RdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeTsKKworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybU5hbWVkTmF0aXZlUXVlcnkgZXh0ZW5kcyBBYnN0cmFjdE9ybVF1ZXJ5PFhtbE5hbWVkTmF0aXZlUXVlcnk+CisJaW1wbGVtZW50cyBPcm1OYW1lZE5hdGl2ZVF1ZXJ5Cit7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdENsYXNzOworCisJcHJvdGVjdGVkIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nOworCisKKwlwdWJsaWMgR2VuZXJpY09ybU5hbWVkTmF0aXZlUXVlcnkoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxOYW1lZE5hdGl2ZVF1ZXJ5IHJlc291cmNlUXVlcnkpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZVF1ZXJ5KTsKKwl9CisJCisJcHVibGljIGNoYXIgZ2V0UmVzdWx0Q2xhc3NFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgeworCQlyZXR1cm4gJyQnOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdENsYXNzKCkgeworCQlyZXR1cm4gdGhpcy5yZXN1bHRDbGFzczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXN1bHRDbGFzcyhTdHJpbmcgbmV3UmVzdWx0Q2xhc3MpIHsKKwkJU3RyaW5nIG9sZFJlc3VsdENsYXNzID0gdGhpcy5yZXN1bHRDbGFzczsKKwkJdGhpcy5yZXN1bHRDbGFzcyA9IG5ld1Jlc3VsdENsYXNzOworCQlnZXRSZXNvdXJjZVF1ZXJ5KCkuc2V0UmVzdWx0Q2xhc3MobmV3UmVzdWx0Q2xhc3MpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5hbWVkTmF0aXZlUXVlcnkuUkVTVUxUX0NMQVNTX1BST1BFUlRZLCBvbGRSZXN1bHRDbGFzcywgbmV3UmVzdWx0Q2xhc3MpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0U2V0TWFwcGluZygpIHsKKwkJcmV0dXJuIHRoaXMucmVzdWx0U2V0TWFwcGluZzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXN1bHRTZXRNYXBwaW5nKFN0cmluZyBuZXdSZXN1bHRTZXRNYXBwaW5nKSB7CisJCVN0cmluZyBvbGRSZXN1bHRTZXRNYXBwaW5nID0gdGhpcy5yZXN1bHRTZXRNYXBwaW5nOworCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSBuZXdSZXN1bHRTZXRNYXBwaW5nOworCQlnZXRSZXNvdXJjZVF1ZXJ5KCkuc2V0UmVzdWx0U2V0TWFwcGluZyhuZXdSZXN1bHRTZXRNYXBwaW5nKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChOYW1lZE5hdGl2ZVF1ZXJ5LlJFU1VMVF9TRVRfTUFQUElOR19QUk9QRVJUWSwgb2xkUmVzdWx0U2V0TWFwcGluZywgbmV3UmVzdWx0U2V0TWFwcGluZyk7CisJfQorCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbE5hbWVkTmF0aXZlUXVlcnkgcmVzb3VyY2VRdWVyeSkgeworCQlzdXBlci5pbml0aWFsaXplKHJlc291cmNlUXVlcnkpOworCQl0aGlzLnJlc3VsdENsYXNzID0gcmVzb3VyY2VRdWVyeS5nZXRSZXN1bHRDbGFzcygpOworCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSByZXNvdXJjZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKFhtbE5hbWVkTmF0aXZlUXVlcnkgcmVzb3VyY2VRdWVyeSkgeworCQlzdXBlci51cGRhdGUocmVzb3VyY2VRdWVyeSk7CisJCXRoaXMuc2V0UmVzdWx0Q2xhc3MocmVzb3VyY2VRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKKwkJdGhpcy5zZXRSZXN1bHRTZXRNYXBwaW5nKHJlc291cmNlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OYW1lZFF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtTmFtZWRRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYTc4NDIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtTmFtZWRRdWVyeS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5OworCisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtTmFtZWRRdWVyeSBleHRlbmRzIEFic3RyYWN0T3JtUXVlcnk8WG1sTmFtZWRRdWVyeT4gaW1wbGVtZW50cyBPcm1OYW1lZFF1ZXJ5Cit7CisKKwlwdWJsaWMgR2VuZXJpY09ybU5hbWVkUXVlcnkoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxOYW1lZFF1ZXJ5IHJlc291cmNlTmFtZWRRdWVyeSkgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTmFtZWRRdWVyeSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZmFiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZyAKKwlleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxYbWxOdWxsQXR0cmlidXRlTWFwcGluZz4KK3sKKworCXB1YmxpYyBHZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorCisJcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKKwkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybUF0dHJpYnV0ZU1hcHBpbmcodGhpcyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwoQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKiAgCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWV0YW1vZGVsRmllbGQgZ2V0TWV0YW1vZGVsRmllbGQoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU51bGxDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OdWxsQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkODI3NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OdWxsQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1OdWxsQ29udmVydGVyIGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgT3JtQ29udmVydGVyCit7CisJCisJcHVibGljIEdlbmVyaWNPcm1OdWxsQ29udmVydGVyKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChPcm1BdHRyaWJ1dGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gQ29udmVydGVyLk5PX0NPTlZFUlRFUjsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQkvLyBkbyBub3RoaW5nLCBudWxsIGltcGxlbWVudGF0aW9uCQkKKwl9CisJCisJcHVibGljIHZvaWQgYWRkVG9SZXNvdXJjZU1vZGVsKCkgeworCQkvLyBkbyBub3RoaW5nLCBudWxsIGltcGxlbWVudGF0aW9uCisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKCkgeworCQkvLyBkbyBub3RoaW5nLCBudWxsIGltcGxlbWVudGF0aW9uCQkKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvTWFueU1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWNiMTgwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvTWFueU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKKworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybU9uZVRvTWFueU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdE9ybU9uZVRvTWFueU1hcHBpbmc8WG1sT25lVG9NYW55PgoreworCQorCXB1YmxpYyBHZW5lcmljT3JtT25lVG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sT25lVG9NYW55IHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBPcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2UgYnVpbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlNmRmYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWV4dGVuZHMgQWJzdHJhY3RPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sJCisJCisJcHVibGljIEdlbmVyaWNPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCisJCQlPcm1PbmVUb01hbnlNYXBwaW5nIHBhcmVudCwgWG1sT25lVG9NYW55IHJlc291cmNlKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2UpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pbmluZ1N0cmF0ZWd5IGNhbGN1bGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgeworCQlpZiAodGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpICE9IG51bGwpIHsKKwkJCXJldHVybiB0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5OworCQl9CisJCXJldHVybiB0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9PbmVNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3YTlhMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKKworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZyAKKwlleHRlbmRzIEFic3RyYWN0T3JtT25lVG9PbmVNYXBwaW5nPFhtbE9uZVRvT25lPgoreworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCisJcHVibGljIEdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE9uZVRvT25lIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyODQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGV4dGVuZHMgQWJzdHJhY3RPcm1QZXJzaXN0ZW50QXR0cmlidXRlCit7CisJCisJcHVibGljIEdlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgT3duZXIgb3duZXIsIFhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXN1cGVyKHBhcmVudCwgb3duZXIsIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCS8vKioqKioqKioqKioqKioqKioqIEFjY2Vzc0hvbGRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqCisJCisJLyoqCisJICogR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgZG9lcyBub3Qgc3VwcG9ydCBzcGVjaWZpZWQgYWNjZXNzIChubyBhY2Nlc3MgZWxlbWVudCBpbiAxLjApLCBzbyB3ZSByZXR1cm4gbnVsbAorCSAqLworCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2VzcygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlIG5ld1NwZWNpZmllZEFjY2VzcykgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInNwZWNpZmllZEFjY2VzcyBpcyBub3Qgc3VwcG9ydGVkIGZvciBHZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXR0cmlidXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7CisJCXN1cGVyLnZhbGlkYXRlQXR0cmlidXRlKG1lc3NhZ2VzKTsKKwkJaWYgKHRoaXMuamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgIT0gbnVsbCkgeworCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCQlpZiAoamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwgJiYgamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKHRoaXMuamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKSA9PSBudWxsKSB7CisJCQkJbWVzc2FnZXMuYWRkKAorCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAorCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JTkhFUklURURfQVRUUklCVVRFU19OT1RfU1VQUE9SVEVELAorCQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCksIHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCl9LAorCQkJCQkJCXRoaXMuYXR0cmlidXRlTWFwcGluZywgCisJCQkJCQkJdGhpcy5hdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWVUZXh0UmFuZ2UoKQorCQkJCQkJKQorCQkJCQkpOwkJCQkKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyMThjNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZS5qYXZhCkBAIC0wLDAgKzEsOTkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TdHJ1Y3R1cmVOb2RlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5KcGFQcm9qZWN0Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNoYWluSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZQorCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgT3JtUGVyc2lzdGVudFR5cGUKK3sKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlczsKKworCXByb3RlY3RlZCBmaW5hbCBMaXN0PE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlczsKKwkKKwlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBkZWZhdWx0QWNjZXNzOworCQorCXByb3RlY3RlZCBBY2Nlc3NUeXBlIHNwZWNpZmllZEFjY2VzczsKKworCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyB0eXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZTsKKwkKKwlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZTsKKworCQorCXB1YmxpYyBHZW5lcmljT3JtUGVyc2lzdGVudFR5cGUoRW50aXR5TWFwcGluZ3MgcGFyZW50LCBYbWxUeXBlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKKwkJdGhpcy52aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7CisJCXRoaXMudHlwZU1hcHBpbmcgPSBidWlsZFR5cGVNYXBwaW5nKHJlc291cmNlTWFwcGluZyk7CisJCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gdGhpcy5nZXRSZXNvdXJjZUFjY2VzcygpOworCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSB0aGlzLmJ1aWxkRGVmYXVsdEFjY2VzcygpOworCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSA9IHRoaXMuYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJdGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlID0gdGhpcy5idWlsZFN1cGVyUGVyc2lzdGVudFR5cGUoKTsJCisJCXRoaXMuaW5pdGlhbGl6ZVBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIE9ybVBlcnNpc3RlbnRUeXBlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50aXR5TWFwcGluZ3MgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEVudGl0eU1hcHBpbmdzKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisJCisJcHJvdGVjdGVkIEVudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCkgeworCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFja2FnZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0UGVyc2lzdGVudFR5cGVQYWNrYWdlKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5pc0RlZmF1bHRQZXJzaXN0ZW50VHlwZU1ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIE9ybVN0cnVjdHVyZU5vZGVzLlBFUlNJU1RFTlRfVFlQRV9JRDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0ZvcihTdHJpbmcgdHlwZU5hbWUpIHsKKwkJU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXMuZ2V0TmFtZSgpOworCQlpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoY2xhc3NOYW1lLmVxdWFscyh0eXBlTmFtZSkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCVN0cmluZyBkZWZhdWx0UGFja2FnZSA9IHRoaXMuZ2V0RGVmYXVsdFBhY2thZ2UoKTsKKwkJaWYgKGRlZmF1bHRQYWNrYWdlID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gKGRlZmF1bHRQYWNrYWdlICsgJy4nICsgIGNsYXNzTmFtZSkuZXF1YWxzKHR5cGVOYW1lKTsKKwl9CisKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgYnVpbGRUeXBlTWFwcGluZyhYbWxUeXBlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uIG1hcHBpbmdEZWZpbnRpb24gPSAKKwkJCQlnZXRNYXBwaW5nRmlsZURlZmluaXRpb24oKS5nZXRPcm1UeXBlTWFwcGluZ0RlZmluaXRpb24ocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBpbmdLZXkoKSk7CisJCXJldHVybiBtYXBwaW5nRGVmaW50aW9uLmJ1aWxkQ29udGV4dE1hcHBpbmcodGhpcywgcmVzb3VyY2VNYXBwaW5nLCBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKSk7CisJfQorCisJcHVibGljIE9ybVR5cGVNYXBwaW5nIGdldE1hcHBpbmcoKSB7CisJCXJldHVybiB0aGlzLnR5cGVNYXBwaW5nOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIFBlcnNpc3RlbnRUeXBlLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0T3ZlcnJpZGVQZXJzaXN0ZW50VHlwZUFjY2VzcygpIHsKKwkJaWYgKHRoaXMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMuZ2V0U3BlY2lmaWVkQWNjZXNzKCk7CisJCX0KKworCQlpZiAodGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlIGluc3RhbmNlb2YgT3JtUGVyc2lzdGVudFR5cGUpIHsKKwkJCUFjY2Vzc1R5cGUgYWNjZXNzVHlwZSA9ICgoT3JtUGVyc2lzdGVudFR5cGUpIHRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZSkuZ2V0U3BlY2lmaWVkQWNjZXNzKCk7CisJCQlpZiAoYWNjZXNzVHlwZSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGFjY2Vzc1R5cGU7CisJCQl9CisJCX0KKworCQlpZiAodGhpcy5nZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCUFjY2Vzc1R5cGUgYWNjZXNzVHlwZSA9IHRoaXMuZ2V0T3duZXJEZWZhdWx0QWNjZXNzKCk7CisJCQlpZiAoYWNjZXNzVHlwZSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGFjY2Vzc1R5cGU7CisJCQl9CisJCX0KKworCQkvLyBubyBvdmVycmlkZSBhY2Nlc3MgdHlwZQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdFBlcnNpc3RlbnRUeXBlQWNjZXNzKCkgeworCQlpZiAodGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlIGluc3RhbmNlb2YgT3JtUGVyc2lzdGVudFR5cGUpIHsKKwkJCUFjY2Vzc1R5cGUgYWNjZXNzVHlwZSA9ICgoT3JtUGVyc2lzdGVudFR5cGUpIHRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZSkuZ2V0RGVmYXVsdEFjY2VzcygpOworCQkJaWYgKGFjY2Vzc1R5cGUgIT0gbnVsbCkgeworCQkJCXJldHVybiBhY2Nlc3NUeXBlOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHRoaXMuZ2V0T3duZXJEZWZhdWx0QWNjZXNzKCk7CisJfQorCisJLy8gKioqKioqKioqKiBQZXJzaXN0ZW50VHlwZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgc2V0TWFwcGluZ0tleShTdHJpbmcgbmV3TWFwcGluZ0tleSkgeworCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbCh0aGlzLmdldE1hcHBpbmdLZXkoKSwgbmV3TWFwcGluZ0tleSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlPcm1UeXBlTWFwcGluZyBvbGRNYXBwaW5nID0gZ2V0TWFwcGluZygpOworCQlPcm1UeXBlTWFwcGluZ0RlZmluaXRpb24gbWFwcGluZ0RlZmluaXRpb24gPSAKKwkJCQlnZXRNYXBwaW5nRmlsZURlZmluaXRpb24oKS5nZXRPcm1UeXBlTWFwcGluZ0RlZmluaXRpb24obmV3TWFwcGluZ0tleSk7CisJCVhtbFR5cGVNYXBwaW5nIHJlc291cmNlVHlwZU1hcHBpbmcgPSAKKwkJCW1hcHBpbmdEZWZpbml0aW9uLmJ1aWxkUmVzb3VyY2VNYXBwaW5nKGdldFJlc291cmNlTm9kZUZhY3RvcnkoKSk7CisJCXRoaXMudHlwZU1hcHBpbmcgPSBidWlsZFR5cGVNYXBwaW5nKHJlc291cmNlVHlwZU1hcHBpbmcpOworCQl0aGlzLmdldEVudGl0eU1hcHBpbmdzKCkuY2hhbmdlTWFwcGluZyh0aGlzLCBvbGRNYXBwaW5nLCB0aGlzLnR5cGVNYXBwaW5nKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQSU5HX1BST1BFUlRZLCBvbGRNYXBwaW5nLCB0aGlzLnR5cGVNYXBwaW5nKTsKKwl9CisKKwlwdWJsaWMgSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IGluaGVyaXRhbmNlSGllcmFyY2h5KCkgeworCQlyZXR1cm4gdGhpcy5pbmhlcml0YW5jZUhpZXJhcmNoeU9mKHRoaXMpOworCX0KKworCXB1YmxpYyBJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4gYW5jZXN0b3JzKCkgeworCQlyZXR1cm4gdGhpcy5pbmhlcml0YW5jZUhpZXJhcmNoeU9mKHRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZSk7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlPiBpbmhlcml0YW5jZUhpZXJhcmNoeU9mKFBlcnNpc3RlbnRUeXBlIHN0YXJ0KSB7CisJCS8vIHVzaW5nIGEgY2hhaW4gaXRlcmF0b3IgdG8gdHJhdmVyc2UgdXAgdGhlIGluaGVyaXRhbmNlIHRyZWUKKwkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlPihzdGFydCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgbmV4dExpbmsoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKKwkJCQlyZXR1cm4gcGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpOworCQkJfQorCQl9OworCX0KKworCXB1YmxpYyBQZXJzaXN0ZW50VHlwZSBnZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTdXBlclBlcnNpc3RlbnRUeXBlKFBlcnNpc3RlbnRUeXBlIHN1cGVyUGVyc2lzdGVudFR5cGUpIHsKKwkJUGVyc2lzdGVudFR5cGUgb2xkID0gdGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlOworCQl0aGlzLnN1cGVyUGVyc2lzdGVudFR5cGUgPSBzdXBlclBlcnNpc3RlbnRUeXBlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1VQRVJfUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZLCBvbGQsIHN1cGVyUGVyc2lzdGVudFR5cGUpOworCX0KKwkKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXREZWZhdWx0QWNjZXNzKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWNjZXNzOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdEZWZhdWx0QWNjZXNzKSB7CisJCUFjY2Vzc1R5cGUgb2xkRGVmYXVsdEFjY2VzcyA9IHRoaXMuZGVmYXVsdEFjY2VzczsKKwkJdGhpcy5kZWZhdWx0QWNjZXNzID0gbmV3RGVmYXVsdEFjY2VzczsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0FDQ0VTU19QUk9QRVJUWSwgb2xkRGVmYXVsdEFjY2VzcywgbmV3RGVmYXVsdEFjY2Vzcyk7CisJfQorCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBY2Nlc3M7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUgbmV3U3BlY2lmaWVkQWNjZXNzKSB7CisJCUFjY2Vzc1R5cGUgb2xkU3BlY2lmaWVkQWNjZXNzID0gdGhpcy5zcGVjaWZpZWRBY2Nlc3M7CisJCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gbmV3U3BlY2lmaWVkQWNjZXNzOworCQl0aGlzLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkQWNjZXNzKSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0FDQ0VTU19QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQWNjZXNzLCBuZXdTcGVjaWZpZWRBY2Nlc3MpOworCX0KKworCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEFjY2VzcygpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0QWNjZXNzKCkgOiB0aGlzLmdldFNwZWNpZmllZEFjY2VzcygpOworCX0KKwkJCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0T3duZXJPdmVycmlkZUFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRPdmVycmlkZVBlcnNpc3RlbnRUeXBlQWNjZXNzKCk7CisJfQorCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0T3duZXJEZWZhdWx0QWNjZXNzKCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRQZXJzaXN0ZW50VHlwZUFjY2VzcygpOworCX0KKworCXB1YmxpYyB2b2lkIGNoYW5nZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBPcm1BdHRyaWJ1dGVNYXBwaW5nIG9sZE1hcHBpbmcsIE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgeworCQlpbnQgc291cmNlSW5kZXggPSB0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmluZGV4T2Yob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCXRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMucmVtb3ZlKHNvdXJjZUluZGV4KTsKKwkJb2xkTWFwcGluZy5yZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChnZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKSk7CisJCWludCB0YXJnZXRJbmRleCA9IGluc2VydGlvbkluZGV4KG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQl0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZCh0YXJnZXRJbmRleCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCW5ld01hcHBpbmcuYWRkVG9SZXNvdXJjZU1vZGVsKGdldFJlc291cmNlQXR0cmlidXRlcygpKTsKKwkJb2xkTWFwcGluZy5pbml0aWFsaXplT24obmV3TWFwcGluZyk7CisJCWZpcmVJdGVtTW92ZWQoQVRUUklCVVRFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCX0KKworCXB1YmxpYyB2b2lkIG1ha2VQZXJzaXN0ZW50QXR0cmlidXRlVmlydHVhbChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKKwkJaWYgKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dHJpYnV0ZSBpcyBhbHJlYWR5IHZpcnR1YWwiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gbnVsbDsKKwkJaWYgKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlICE9IG51bGwpIHsKKwkJCXZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gYWRkVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQl9CisJCXRoaXMucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKKwkJaWYgKHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlICE9IG51bGwpIHsKKwkJCWZpcmVJdGVtQWRkZWQoVklSVFVBTF9BVFRSSUJVVEVTX0xJU1QsIHZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpIC0gMSwgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIG1ha2VQZXJzaXN0ZW50QXR0cmlidXRlU3BlY2lmaWVkKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgeworCQltYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVNwZWNpZmllZChvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CQkKKwl9CisKKwlwdWJsaWMgdm9pZCBtYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVNwZWNpZmllZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZyBtYXBwaW5nS2V5KSB7CisJCWlmICghb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXR0cmlidXRlIGlzIGFscmVhZHkgc3BlY2lmaWVkIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChtYXBwaW5nS2V5LCBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVzZSBtYWtlUGVyc2lzdGVudEF0dHJpYnV0ZVNwZWNpZmllZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBTdHJpbmcpIGluc3RlYWQgYW5kIHNwZWNpZnkgYSBtYXBwaW5nIHR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCQorCQlBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcyA9IGdldFJlc291cmNlQXR0cmlidXRlcygpOworCQlpZiAocmVzb3VyY2VBdHRyaWJ1dGVzID09IG51bGwpIHsKKwkJCXJlc291cmNlQXR0cmlidXRlcyA9IGNyZWF0ZVJlc291cmNlQXR0cmlidXRlcygpOworCQkJZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKS5zZXRBdHRyaWJ1dGVzKHJlc291cmNlQXR0cmlidXRlcyk7CisJCX0KKwkJCisJCU9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIG1hcHBpbmdEZWZpbnRpb24gPSAKKwkJCQlnZXRNYXBwaW5nRmlsZURlZmluaXRpb24oKS5nZXRPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbihtYXBwaW5nS2V5KTsKKwkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcgPSAKKwkJCW1hcHBpbmdEZWZpbnRpb24uYnVpbGRSZXNvdXJjZU1hcHBpbmcoZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3UGVyc2lzdGVudEF0dHJpYnV0ZSA9IGJ1aWxkU3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShyZXNvdXJjZU1hcHBpbmcpOworCQlpbnQgaW5zZXJ0aW9uSW5kZXggPSBpbnNlcnRpb25JbmRleChuZXdQZXJzaXN0ZW50QXR0cmlidXRlKTsKKwkJdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoaW5zZXJ0aW9uSW5kZXgsIG5ld1BlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQluZXdQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5hZGRUb1Jlc291cmNlTW9kZWwocmVzb3VyY2VBdHRyaWJ1dGVzKTsKKwkJCisJCWludCByZW1vdmFsSW5kZXggPSB0aGlzLnZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlcy5pbmRleE9mKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQl0aGlzLnZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlcy5yZW1vdmUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCW5ld1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpLnNldE5hbWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlpZiAob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFNwZWNpZmllZEFjY2VzcygpICE9IG51bGwpIHsKKwkJCW5ld1BlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkQWNjZXNzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCX0KKwkJCisJCWZpcmVJdGVtQWRkZWQoQVRUUklCVVRFU19MSVNULCBpbnNlcnRpb25JbmRleCwgbmV3UGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCWZpcmVJdGVtUmVtb3ZlZChWSVJUVUFMX0FUVFJJQlVURVNfTElTVCwgcmVtb3ZhbEluZGV4LCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKKwl9CisKKwlwcm90ZWN0ZWQgWG1sVHlwZU1hcHBpbmcgZ2V0UmVzb3VyY2VUeXBlTWFwcGluZygpIHsKKwkJcmV0dXJuIHRoaXMudHlwZU1hcHBpbmcuZ2V0UmVzb3VyY2VUeXBlTWFwcGluZygpOworCX0KKwkKKwlwcm90ZWN0ZWQgQXR0cmlidXRlcyBnZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKSB7CisJCXJldHVybiB0aGlzLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKS5nZXRBdHRyaWJ1dGVzKCk7CisJfQorCQorCXByb3RlY3RlZCBBdHRyaWJ1dGVzIGNyZWF0ZVJlc291cmNlQXR0cmlidXRlcygpIHsKKwkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKKwkJCWdldFJlc291cmNlTm9kZUZhY3RvcnkoKSwgCisJCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzKCksIAorCQkJQXR0cmlidXRlcy5jbGFzcyk7CisJfQorCQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGFsbEF0dHJpYnV0ZU5hbWVzKCkgeworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVOYW1lcyh0aGlzLmFsbEF0dHJpYnV0ZXMoKSk7CisJfQorCisJcHVibGljIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGFsbEF0dHJpYnV0ZXMoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4obmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGVyc2lzdGVudFR5cGUsIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+Pih0aGlzLmluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IHRyYW5zZm9ybShQZXJzaXN0ZW50VHlwZSBwdCkgeworCQkJCXJldHVybiBwdC5hdHRyaWJ1dGVzKCk7CisJCQl9CisJCX0pOworCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzTmFtZWQoZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlPihhdHRyaWJ1dGVzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgbykgeworCQkJCWlmIChhdHRyaWJ1dGVOYW1lID09IG51bGwgJiYgby5nZXROYW1lKCkgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJaWYgKGF0dHJpYnV0ZU5hbWUgIT0gbnVsbCAmJiBhdHRyaWJ1dGVOYW1lLmVxdWFscyhvLmdldE5hbWUoKSkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwdWJsaWMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVOYW1lZChTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworCQlJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBhdHRyaWJ1dGVzTmFtZWQoYXR0cmlidXRlTmFtZSk7CisJCXJldHVybiAoc3RyZWFtLmhhc05leHQoKSkgPyBzdHJlYW0ubmV4dCgpIDogbnVsbDsKKwl9CisKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcygpIHsKKwkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTmFtZXModGhpcy5hdHRyaWJ1dGVzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyhJdGVyYXRvcjw/IGV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cnMpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZz4oYXR0cnMpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJCQlyZXR1cm4gYXR0cmlidXRlLmdldE5hbWUoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0U3BlY2lmaWVkQXR0cmlidXRlRm9yKGZpbmFsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgeworCQlmb3IgKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzcGVjaWZpZWRBdHRyaWJ1dGVzKCkpKSB7CisJCQlpZiAocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpID09IG51bGwpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICgganJwYS5lcXVhbHMocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKSkgeworCQkJCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcygpIHsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oc3BlY2lmaWVkQXR0cmlidXRlcygpLCB2aXJ0dWFsQXR0cmlidXRlcygpKTsKKwl9CisKKwlwdWJsaWMgaW50IGF0dHJpYnV0ZXNTaXplKCkgeworCQlyZXR1cm4gc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSArIHZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpOworCX0KKwkKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcyk7CisJfQorCQorCXB1YmxpYyBpbnQgc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLnNpemUoKTsKKwl9CisJCisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLnZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlcyk7CQkKKwl9CisJCisJcHVibGljIGludCB2aXJ0dWFsQXR0cmlidXRlc1NpemUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlcy5zaXplKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgeworCQlhZGRJdGVtVG9MaXN0KG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIHRoaXMudmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzLCBWSVJUVUFMX0FUVFJJQlVURVNfTElTVCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlKSB7CisJCXJlbW92ZUl0ZW1Gcm9tTGlzdChvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCB0aGlzLnZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlcywgVklSVFVBTF9BVFRSSUJVVEVTX0xJU1QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBtb3ZlVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVfKGludCBpbmRleCwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJbW92ZUl0ZW1Jbkxpc3QoaW5kZXgsIHRoaXMudmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmluZGV4T2YoYXR0cmlidXRlKSwgdGhpcy52aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXMsIFZJUlRVQUxfQVRUUklCVVRFU19MSVNUKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXMuY29udGFpbnMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJfQorCQorCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoU3RyaW5nIG1hcHBpbmdLZXksIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCUF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzID0gZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCk7CisJCWlmIChyZXNvdXJjZUF0dHJpYnV0ZXMgPT0gbnVsbCkgeworCQkJcmVzb3VyY2VBdHRyaWJ1dGVzID0gY3JlYXRlUmVzb3VyY2VBdHRyaWJ1dGVzKCk7CisJCQlnZXRNYXBwaW5nKCkuZ2V0UmVzb3VyY2VUeXBlTWFwcGluZygpLnNldEF0dHJpYnV0ZXMocmVzb3VyY2VBdHRyaWJ1dGVzKTsKKwkJfQorCQkKKwkJT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gbWFwcGluZ0RlZmludGlvbiA9IAorCQkJCWdldE1hcHBpbmdGaWxlRGVmaW5pdGlvbigpLmdldE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKG1hcHBpbmdLZXkpOworCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZyA9IAorCQkJbWFwcGluZ0RlZmludGlvbi5idWlsZFJlc291cmNlTWFwcGluZyhnZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCkpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAKKwkJCQlidWlsZFNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUocmVzb3VyY2VNYXBwaW5nKTsKKwkJaW50IGluZGV4ID0gaW5zZXJ0aW9uSW5kZXgocGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCXRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKGluZGV4LCBwZXJzaXN0ZW50QXR0cmlidXRlKTsKKwkJcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuYWRkVG9SZXNvdXJjZU1vZGVsKHJlc291cmNlQXR0cmlidXRlcyk7CisJCQorCQlwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKS5zZXROYW1lKGF0dHJpYnV0ZU5hbWUpOworCQlmaXJlSXRlbUFkZGVkKEFUVFJJQlVURVNfTElTVCwgaW5kZXgsIHBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQlyZXR1cm4gcGVyc2lzdGVudEF0dHJpYnV0ZTsKKwl9CisKKwlwcm90ZWN0ZWQgaW50IGluc2VydGlvbkluZGV4KE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgeworCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YodGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcywgcGVyc2lzdGVudEF0dHJpYnV0ZSwgYnVpbGRNYXBwaW5nQ29tcGFyYXRvcigpKTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBidWlsZE1hcHBpbmdDb21wYXJhdG9yKCkgeworCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oKSB7CisJCQlwdWJsaWMgaW50IGNvbXBhcmUoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvMSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvMikgeworCQkJCWludCBvMVNlcXVlbmNlID0gbzEuZ2V0TWFwcGluZygpLmdldFhtbFNlcXVlbmNlKCk7CisJCQkJaW50IG8yU2VxdWVuY2UgPSBvMi5nZXRNYXBwaW5nKCkuZ2V0WG1sU2VxdWVuY2UoKTsKKwkJCQlpZiAobzFTZXF1ZW5jZSA8IG8yU2VxdWVuY2UpIHsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpZiAobzFTZXF1ZW5jZSA9PSBvMlNlcXVlbmNlKSB7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlXyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIHRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMsIEFUVFJJQlVURVNfTElTVCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIG1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlXyhpbnQgaW5kZXgsIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCW1vdmVJdGVtSW5MaXN0KGluZGV4LCB0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmluZGV4T2YoYXR0cmlidXRlKSwgdGhpcy5zcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcywgQVRUUklCVVRFU19MSVNUKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgeworCQlpbnQgaW5kZXggPSB0aGlzLnNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmluZGV4T2Yob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCXRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMucmVtb3ZlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5yZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChnZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKSk7CisJCWlmIChnZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5pc1Vuc2V0KCkpIHsKKwkJCXRoaXMudHlwZU1hcHBpbmcuZ2V0UmVzb3VyY2VUeXBlTWFwcGluZygpLnNldEF0dHJpYnV0ZXMobnVsbCk7CisJCX0KKwkJZmlyZUl0ZW1SZW1vdmVkKEFUVFJJQlVURVNfTElTVCwgaW5kZXgsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwkJCisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCl7CisJCVN0cmluZyBjbGFzc05hbWUgPSB0aGlzLmdldE5hbWUoKTsKKwkJcmV0dXJuIChjbGFzc05hbWUgPT0gbnVsbCkgPyBudWxsIDogQ2xhc3NUb29scy5zaG9ydE5hbWVGb3JDbGFzc05hbWVkKGNsYXNzTmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgY2xhc3NDaGFuZ2VkKFN0cmluZyBvbGRDbGFzcywgU3RyaW5nIG5ld0NsYXNzKSB7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkQ2xhc3MsIG5ld0NsYXNzKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gZ2V0TWFwcGluZygpLmdldEtleSgpOworCX0KKwkKKwlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRKYXZhUGVyc2lzdGVudFR5cGUoSmF2YVBlcnNpc3RlbnRUeXBlIG5ld0phdmFQZXJzaXN0ZW50VHlwZSkgeworCQlKYXZhUGVyc2lzdGVudFR5cGUgb2xkSmF2YVBlcnNpc3RlbnRUeXBlID0gdGhpcy5qYXZhUGVyc2lzdGVudFR5cGU7CisJCXRoaXMuamF2YVBlcnNpc3RlbnRUeXBlID0gbmV3SmF2YVBlcnNpc3RlbnRUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEpBVkFfUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZLCBvbGRKYXZhUGVyc2lzdGVudFR5cGUsIG5ld0phdmFQZXJzaXN0ZW50VHlwZSk7CisJfQorCisJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZ2V0UmVzb3VyY2VBY2Nlc3MoKSB7CisJCXJldHVybiBBY2Nlc3NUeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuZ2V0UmVzb3VyY2VUeXBlTWFwcGluZygpLmdldEFjY2VzcygpKTsKKwl9CisKKwlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBidWlsZERlZmF1bHRBY2Nlc3MoKSB7CisJCWlmICghIGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJaWYgKHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKKwkJCQlpZiAoamF2YVBlcnNpc3RlbnRUeXBlSGFzU3BlY2lmaWVkQWNjZXNzKCkpIHsKKwkJCQkJcmV0dXJuIHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpOworCQkJCX0KKwkJCQlpZiAodGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJQWNjZXNzVHlwZSBhY2Nlc3MgPSBnZXRNYXBwaW5nRmlsZVJvb3QoKS5nZXRBY2Nlc3MoKTsKKwkJcmV0dXJuIGFjY2VzcyAhPSBudWxsID8gYWNjZXNzIDogQWNjZXNzVHlwZS5GSUVMRDsgLy9kZWZhdWx0IHRvIEZJRUxEIGlmIG5vIHNwZWNpZmllZCBhY2Nlc3MgZm91bmQKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gamF2YVBlcnNpc3RlbnRUeXBlSGFzU3BlY2lmaWVkQWNjZXNzKCkgeworCQlyZXR1cm4gdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkgIT0gbnVsbCB8fCAKKwkJCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZS5oYXNBbnlBbm5vdGF0ZWRBdHRyaWJ1dGVzKCk7CisJfQorCisJcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFQZXJzaXN0ZW50VHlwZSgpIHsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCA9IHRoaXMuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKKwkJcmV0dXJuIChqcnB0ID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoanJwdCk7CisJfQorCisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkgeworCQlTdHJpbmcgY2xhc3NOYW1lID0gdGhpcy5nZXROYW1lKCk7CisJCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoJyQnLCAnLicpOworCisJCS8vIGZpcnN0IHRyeSB0byByZXNvbHZlIHVzaW5nIG9ubHkgdGhlIGxvY2FsbHkgc3BlY2lmaWVkIG5hbWUuLi4KKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCA9IHRoaXMuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoY2xhc3NOYW1lKTsKKwkJaWYgKGpycHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIGpycHQ7CisJCX0KKworCQkvLyAuLi50aGVuIHRyeSB0byByZXNvbHZlIGJ5IHByZXBlbmRpbmcgdGhlIGdsb2JhbCBwYWNrYWdlIG5hbWUKKwkJU3RyaW5nIGRlZmF1bHRQYWNrYWdlID0gdGhpcy5nZXREZWZhdWx0UGFja2FnZSgpOworCQlpZiAoZGVmYXVsdFBhY2thZ2UgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIHRoaXMuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoZGVmYXVsdFBhY2thZ2UgKyAnLicgKyAgY2xhc3NOYW1lKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKGNsYXNzTmFtZSk7CisJfQorCQorCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgeworCQlyZXR1cm4gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKHRoaXMsIGpycHQpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQZXJzaXN0ZW50QXR0cmlidXRlcygpIHsKKwkJdGhpcy5pbml0aWFsaXplU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKKwkJdGhpcy5pbml0aWFsaXplVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7CisJfQorCQorCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkU3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZykgeworCQlyZXR1cm4gYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKGJ1aWxkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZU93bmVyKCksIHJlc291cmNlTWFwcGluZyk7CisJfQorCQkKKwlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5Pd25lciBidWlsZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVPd25lcigpIHsKKwkJcmV0dXJuIG5ldyBTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlT3duZXIoKTsKKwl9CisKKwkvKioKKwkgKiBBbGwgb3JtLnhtbCBwZXJzaXN0ZW50IHR5cGVzIG11c3QgYmUgYWJsZSB0byBnZW5lcmF0ZSBhIHN0YXRpYyBtZXRhbW9kZWwKKwkgKiBiZWNhdXNlIDEuMCBvcm0ueG1sIGZpbGVzIGNhbiBiZSByZWZlcmVuY2VkIGZyb20gMi4wIHBlcnNpc3RlbmNlLnhtbCBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZU1ldGFtb2RlbCgpIHsKKwkJLy8gaWYgd2UgZ2V0IGhlcmUsIGl0J3Mgc2FmZSB0byBhc3N1bWUgdGhlIEpQQSBwcm9qZWN0IGlzIDIuMAorCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgeworCQkJKChKcGFQcm9qZWN0Ml8wKSB0aGlzLmdldEpwYVByb2plY3QoKSkuc3luY2hyb25pemVNZXRhbW9kZWwodGhpcyk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZU93bmVyIGltcGxlbWVudHMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5Pd25lciB7CisJCQorCQlwcml2YXRlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNhY2hlZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworCQkKKwkJcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGZpbmRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKKwkJCWlmIChHZW5lcmljT3JtUGVyc2lzdGVudFR5cGUudGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJU3RyaW5nIG9ybU5hbWUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKTsKKwkJCWlmIChvcm1OYW1lID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCUFjY2Vzc1R5cGUgb3JtQWNjZXNzID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKTsKKworCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB0aGlzLmZpbmRFeGlzdGluZ0phdmFQZXJzaXN0ZW50QXR0cmlidXRlKG9ybU5hbWUpOworCQkJaWYgKChqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSAhPSBudWxsKSAmJiAoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkgPT0gb3JtQWNjZXNzKSkgeworCQkJCXRoaXMuY2FjaGVkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBudWxsOyAgLy8gd2Ugb25seSB3YW50IHRvIGNhY2hlIHRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBpZiB3ZSBidWlsZCBpdAorCQkJCXJldHVybiBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKKwkJCX0KKworCQkJLy8gaWYgJ2phdmFQZXJzaXN0ZW50QXR0cmlidXRlJyBpcyBudWxsLCBpdCBtaWdodCBleGlzdCBpbiBhIHN1cGVyY2xhc3MgdGhhdCBpcyBub3QgcGVyc2lzdGVudCwgd2UgbmVlZCB0byBidWlsZCBpdCBvdXJzZWx2ZXMuCisJCQkvLyBpZiBhY2Nlc3MgaXMgZGlmZmVyZW50LCB3ZSB3b24ndCBiZSBhYmxlIHRvIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgamF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSwgaXQgd29uJ3QgZXhpc3Qgc28gd2UgYnVpbGQgaXQgb3Vyc2VsdmVzCisJCQlyZXR1cm4gdGhpcy5idWlsZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKG9ybU5hbWUsIG9ybUFjY2Vzcyk7CisJCX0KKwkJCisJCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBmaW5kRXhpc3RpbmdKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworCQkJcmV0dXJuIEdlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZS50aGlzLmphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKKwkJfQorCisJCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKFN0cmluZyBvcm1OYW1lLCBBY2Nlc3NUeXBlIG9ybUFjY2VzcykgeworCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhID0gdGhpcy5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKSwgb3JtTmFtZSwgb3JtQWNjZXNzKTsKKwkJCWlmICh0aGlzLmNhY2hlZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlICE9IG51bGwgJiYKKwkJCQkJdGhpcy5jYWNoZWRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSA9PSBqcnBhKSB7CisJCQkJcmV0dXJuIHRoaXMuY2FjaGVkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CisJCQl9CisJCQlyZXR1cm4gdGhpcy5jYWNoZWRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IChqcnBhID09IG51bGwpID8gbnVsbCA6IEdlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZS50aGlzLmJ1aWxkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoanJwYSk7CisJCX0KKworCQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKSB7CisJCQlyZXR1cm4gR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlLnRoaXMuamF2YVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKKwkJfQorCisJCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUsIFN0cmluZyBvcm1OYW1lLCBBY2Nlc3NUeXBlIG9ybUFjY2VzcykgeworCQkJZm9yIChJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSB0aGlzLmF0dHJpYnV0ZXMoamF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUsIG9ybUFjY2Vzcyk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSA9IHN0cmVhbS5uZXh0KCk7CisJCQkJaWYgKGpycGEuZ2V0TmFtZSgpLmVxdWFscyhvcm1OYW1lKSkgeworCQkJCQlyZXR1cm4ganJwYTsKKwkJCQl9CisJCQl9CisJCQkvLyBjbGltYiB1cCBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKwkJCVN0cmluZyBzdXBlcmNsYXNzTmFtZSA9IGphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKCk7CisJCQlpZiAoc3VwZXJjbGFzc05hbWUgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgc3VwZXJjbGFzcyA9IEdlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZS50aGlzLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKHN1cGVyY2xhc3NOYW1lKTsKKwkJCWlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCS8vIHJlY3Vyc2UKKwkJCXJldHVybiB0aGlzLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoc3VwZXJjbGFzcywgb3JtTmFtZSwgb3JtQWNjZXNzKTsKKwkJfQorCisJCXByb3RlY3RlZCBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLCBBY2Nlc3NUeXBlIG9ybUFjY2VzcykgeworCQkJcmV0dXJuIChvcm1BY2Nlc3MgPT0gQWNjZXNzVHlwZS5QUk9QRVJUWSkgPyBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5wZXJzaXN0YWJsZVByb3BlcnRpZXMoKSA6IGphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnBlcnNpc3RhYmxlRmllbGRzKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCB1cGRhdGVKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKKwkJCWlmICh0aGlzLmNhY2hlZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlICE9IG51bGwpIHsKKwkJCQl0aGlzLmNhY2hlZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLnVwZGF0ZSgpOworCQkJfQorCQkJLy9lbHNlIHsKKwkJCQkvL2Rvbid0IHVwZGF0ZSwgd2UgZG9uJ3Qgb3duIHRoZSBqYXZhIHBlcnNpc3RlbnQgYXR0cmlidXRlLCAKKwkJCQkvL2l0IHdpbGwgYmUgdXBkYXRlZCB0aHJvdWdoIHRoZSBqYXZhIGNvbnRleHQgbW9kZWwKKwkJCS8vfQorCQl9CisJfQorCQorCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgeworCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBqcnBhKTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRWaXJ0dWFsT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZywgWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIGJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShidWlsZFZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlT3duZXIoamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpKSwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisKKwlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5Pd25lciBvd25lciwgWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBvd25lciwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuT3duZXIgYnVpbGRWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZU93bmVyKGZpbmFsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSB7CisJCXJldHVybiBuZXcgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5Pd25lcigpIHsKKwkJCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBmaW5kSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlKSB7CisJCQkJcmV0dXJuIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworCQkJfQorCQkJCisJCQlwdWJsaWMgdm9pZCB1cGRhdGVKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKKwkJCQkvL3VwZGF0ZSB0aGUgYXR0cmlidXRlLCBzaW5jZSB3ZSBvd24gaXQgYW5kIGl0IHdpbGwgbm90IGdldCB1cGRhdGVkIG90aGVyd2lzZQorCQkJCWphdmFQZXJzaXN0ZW50QXR0cmlidXRlLnVwZGF0ZSgpOworCQkJfQkJCQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMoKSB7CisJCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCk7CisJCWlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlmb3IgKFhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nIDogYXR0cmlidXRlcy5nZXRBdHRyaWJ1dGVNYXBwaW5ncygpKSB7CisJCQlhZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKHJlc291cmNlTWFwcGluZyk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkgeworCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBqYXZhUmVzb3VyY2VBdHRyaWJ1dGVzID0gamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7CisJCQorCQl3aGlsZSAoamF2YVJlc291cmNlQXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKKwkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVJlc291cmNlQXR0cmlidXRlID0gamF2YVJlc291cmNlQXR0cmlidXRlcy5uZXh0KCk7CisJCQlpZiAoZ2V0U3BlY2lmaWVkQXR0cmlidXRlRm9yKGphdmFSZXNvdXJjZUF0dHJpYnV0ZSkgPT0gbnVsbCkgeworCQkJCWFkZFZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKGphdmFSZXNvdXJjZUF0dHJpYnV0ZSk7CisJCQl9CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGphdmFQZXJzaXN0ZW50QXR0cmlidXRlcygpIHsKKwkJcmV0dXJuICh0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSA/IEVtcHR5TGlzdEl0ZXJhdG9yLjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPmluc3RhbmNlKCkgOgorCQkJdGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZXModGhpcy5qYXZhUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKKwkJQWNjZXNzVHlwZSBhY2Nlc3MgPSBnZXRTcGVjaWZpZWRBY2Nlc3MoKTsKKwkJaWYgKGFjY2VzcyA9PSBudWxsICYmICFnZXRNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCWFjY2VzcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFNwZWNpZmllZEFjY2VzcygpOworCQl9CisJCWlmIChhY2Nlc3MgPT0gbnVsbCkgeworCQkJYWNjZXNzID0gdGhpcy5nZXREZWZhdWx0QWNjZXNzKCk7CisJCX0KKwkJcmV0dXJuIHJlc291cmNlUGVyc2lzdGVudFR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKEFjY2Vzc1R5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChhY2Nlc3MpKTsKKwl9CisKKwlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgYnVpbGRTdXBlclBlcnNpc3RlbnRUeXBlKCkgeworCQlyZXR1cm4gKHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlID09IG51bGwpID8gbnVsbCA6IHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXRoaXMuc2V0U3BlY2lmaWVkQWNjZXNzKHRoaXMuZ2V0UmVzb3VyY2VBY2Nlc3MoKSk7CisJCXRoaXMuc2V0RGVmYXVsdEFjY2Vzcyh0aGlzLmJ1aWxkRGVmYXVsdEFjY2VzcygpKTsKKwkJdGhpcy5nZXRNYXBwaW5nKCkudXBkYXRlKCk7CisJCXRoaXMudXBkYXRlSmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCXRoaXMudXBkYXRlU3VwZXJQZXJzaXN0ZW50VHlwZSgpOworCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUphdmFQZXJzaXN0ZW50VHlwZSgpIHsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCA9IHRoaXMuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKKwkJaWYgKGpycHQgPT0gbnVsbCkgeworCQkJdGhpcy5zZXRKYXZhUGVyc2lzdGVudFR5cGUobnVsbCk7CisJCX0gZWxzZSB7IAorCQkJaWYgKHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlID09IG51bGwpIHsKKwkJCQl0aGlzLnNldEphdmFQZXJzaXN0ZW50VHlwZSh0aGlzLmJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKGpycHQpKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUudXBkYXRlKGpycHQpOworCQkJfQorCQl9CQkKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3VwZXJQZXJzaXN0ZW50VHlwZSgpIHsKKwkJUGVyc2lzdGVudFR5cGUgc3B0ID0gdGhpcy5idWlsZFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKKwkJLy8gY2hlY2sgZm9yIGNpcmN1bGFyIGluaGVyaXRhbmNlCisJCWlmICgoc3B0ID09IG51bGwpIHx8IENvbGxlY3Rpb25Ub29scy5jb250YWlucyhzcHQuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSwgdGhpcykpIHsKKwkJCXRoaXMuc2V0U3VwZXJQZXJzaXN0ZW50VHlwZShudWxsKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuc2V0U3VwZXJQZXJzaXN0ZW50VHlwZShzcHQpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkgeworCQl0aGlzLnVwZGF0ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7CisJCXRoaXMudXBkYXRlVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMoKSB7CisJCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCk7CisJCUNvbGxlY3Rpb248T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gY29udGV4dEF0dHJpYnV0ZXNUb1JlbW92ZSA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHNwZWNpZmllZEF0dHJpYnV0ZXMoKSk7CisJCUNvbGxlY3Rpb248T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gY29udGV4dEF0dHJpYnV0ZXNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3Q8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKKwkJaW50IHJlc291cmNlSW5kZXggPSAwOworCQkKKwkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgeworCQkJZm9yIChYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZyA6IGF0dHJpYnV0ZXMuZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSkgeworCQkJCWJvb2xlYW4gY29udGV4dEF0dHJpYnV0ZUZvdW5kID0gZmFsc2U7CisJCQkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgOiBjb250ZXh0QXR0cmlidXRlc1RvUmVtb3ZlKSB7CisJCQkJCWlmIChjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcoKSA9PSByZXNvdXJjZU1hcHBpbmcpIHsKKwkJCQkJCW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlXyhyZXNvdXJjZUluZGV4LCBjb250ZXh0QXR0cmlidXRlKTsKKwkJCQkJCWNvbnRleHRBdHRyaWJ1dGVzVG9SZW1vdmUucmVtb3ZlKGNvbnRleHRBdHRyaWJ1dGUpOworCQkJCQkJY29udGV4dEF0dHJpYnV0ZXNUb1VwZGF0ZS5hZGQoY29udGV4dEF0dHJpYnV0ZSk7CisJCQkJCQljb250ZXh0QXR0cmlidXRlRm91bmQgPSB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCFjb250ZXh0QXR0cmlidXRlRm91bmQpIHsKKwkJCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShyZXNvdXJjZU1hcHBpbmcpOworCQkJCQlmaXJlSXRlbUFkZGVkKEFUVFJJQlVURVNfTElTVCwgc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCQkJfQorCQkJCXJlc291cmNlSW5kZXgrKzsKKwkJCX0KKwkJfQorCQlmb3IgKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA6IGNvbnRleHRBdHRyaWJ1dGVzVG9SZW1vdmUpIHsKKwkJCXJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVfKGNvbnRleHRBdHRyaWJ1dGUpOworCQl9CisJCS8vZmlyc3QgaGFuZGxlIGFkZGluZy9yZW1vdmluZyBvZiB0aGUgcGVyc2lzdGVudCBhdHRyaWJ1dGVzLCB0aGVuIHVwZGF0ZSB0aGUgb3RoZXJzIGxhc3QsIAorCQkvL3RoaXMgY2F1c2VzIGxlc3MgY2h1cm4gaW4gdGhlIHVwZGF0ZSBwcm9jZXNzCisJCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlIDogY29udGV4dEF0dHJpYnV0ZXNUb1VwZGF0ZSkgeworCQkJY29udGV4dEF0dHJpYnV0ZS51cGRhdGUoKTsKKwkJfQkKKwl9CisJCisJLy9ub3QgZmlyaW5nIGNoYW5nZSBub3RpZmljYXRpb24gc28gdGhpcyBjYW4gYmUgcmV1c2VkIGluIGluaXRpYWxpemUgYW5kIHVwZGF0ZQorCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYnVpbGRTcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKHJlc291cmNlTWFwcGluZyk7CisJCXRoaXMuc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQlyZXR1cm4gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkgeworCQlDb2xsZWN0aW9uPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzVG9SZW1vdmUgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih2aXJ0dWFsQXR0cmlidXRlcygpKTsKKwkJQ29sbGVjdGlvbjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBjb250ZXh0QXR0cmlidXRlc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPigpOworCQlpbnQgcmVzb3VyY2VJbmRleCA9IDA7CisJCQorCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBqYXZhUmVzb3VyY2VBdHRyaWJ1dGVzID0gdGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKKwkJZm9yIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFSZXNvdXJjZUF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShqYXZhUmVzb3VyY2VBdHRyaWJ1dGVzKSkgeworCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRBdHRyaWJ1dGUgPSBnZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3IoamF2YVJlc291cmNlQXR0cmlidXRlKTsKKwkJCWlmIChzcGVjaWZpZWRBdHRyaWJ1dGUgPT0gbnVsbCkgeworCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFBdHRyaWJ1dGUgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUpOworCQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQkJaWYgKGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJCQlqYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmcoKTsKKwkJCQl9CisJCQkJYm9vbGVhbiBjb250ZXh0QXR0cmlidXRlRm91bmQgPSBmYWxzZTsKKwkJCQlmb3IgKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA6IGNvbnRleHRBdHRyaWJ1dGVzVG9SZW1vdmUpIHsKKwkJCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBjb250ZXh0QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCQkJCWlmIChqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSA9PSBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUpIHsKKwkJCQkJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpLCBqYXZhQXR0cmlidXRlTWFwcGluZy5nZXRLZXkoKSkpIHsgCisJCQkJCQkJLy90aGUgbWFwcGluZyBrZXkgd291bGQgY2hhbmdlIGlmIG1ldGFEYXRhQ29tcGxldGUgZmxhZyBjaGFuZ2VzLCByZWJ1aWxkIHRoZSBvcm0gYXR0cmlidXRlCisJCQkJCQkJbW92ZVZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlXyhyZXNvdXJjZUluZGV4LCBjb250ZXh0QXR0cmlidXRlKTsKKwkJCQkJCQljb250ZXh0QXR0cmlidXRlc1RvUmVtb3ZlLnJlbW92ZShjb250ZXh0QXR0cmlidXRlKTsKKwkJCQkJCQljb250ZXh0QXR0cmlidXRlc1RvVXBkYXRlLmFkZChjb250ZXh0QXR0cmlidXRlKTsKKwkJCQkJCQljb250ZXh0QXR0cmlidXRlRm91bmQgPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmICghY29udGV4dEF0dHJpYnV0ZUZvdW5kKSB7CisJCQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhZGRWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZShqYXZhQXR0cmlidXRlTWFwcGluZyk7CisJCQkJCWZpcmVJdGVtQWRkZWQoVklSVFVBTF9BVFRSSUJVVEVTX0xJU1QsIHZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpIC0gMSwgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQkJCX0KKwkJCQlyZXNvdXJjZUluZGV4Kys7CisJCQl9CisJCX0KKwkJCisJCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlIDogY29udGV4dEF0dHJpYnV0ZXNUb1JlbW92ZSkgeworCQkJcmVtb3ZlVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUoY29udGV4dEF0dHJpYnV0ZSk7CisJCX0KKwkJLy9maXJzdCBoYW5kbGUgYWRkaW5nL3JlbW92aW5nIG9mIHRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZXMsIHRoZW4gdXBkYXRlIHRoZSBvdGhlcnMgbGFzdCwgCisJCS8vdGhpcyBjYXVzZXMgbGVzcyBjaHVybiBpbiB0aGUgdXBkYXRlIHByb2Nlc3MKKwkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgOiBjb250ZXh0QXR0cmlidXRlc1RvVXBkYXRlKSB7CisJCQljb250ZXh0QXR0cmlidXRlLnVwZGF0ZSgpOworCQl9CisJfQorCisJcHJvdGVjdGVkIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSkgeworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhQXR0cmlidXRlID0gZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgcmVzb3VyY2VBdHRyaWJ1dGUpOworCQkKKwkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJaWYgKGdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhQXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nKCk7CisJCX0KKwkJcmV0dXJuIGFkZFZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlKGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisKKwkvL25vdCBmaXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbiBzbyB0aGlzIGNhbiBiZSByZXVzZWQgaW4gaW5pdGlhbGl6ZSBhbmQgdXBkYXRlCisJcHJvdGVjdGVkIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcpIHsKKwkJT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gbWFwcGluZ0RlZmludGlvbiA9IAorCQkJCWdldE1hcHBpbmdGaWxlRGVmaW5pdGlvbigpLmdldE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKGphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldEtleSgpKTsKKwkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcgPSAKKwkJCW1hcHBpbmdEZWZpbnRpb24uYnVpbGRWaXJ0dWFsUmVzb3VyY2VNYXBwaW5nKGdldE1hcHBpbmcoKSwgamF2YUF0dHJpYnV0ZU1hcHBpbmcsIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGJ1aWxkVmlydHVhbE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUoamF2YUF0dHJpYnV0ZU1hcHBpbmcsIHJlc291cmNlTWFwcGluZyk7CisJCXRoaXMudmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZCh2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCXJldHVybiB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZTsKKwl9CisJCisJcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb2x2ZUF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworCQlJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gYXR0cmlidXRlc05hbWVkKGF0dHJpYnV0ZU5hbWUpOworCQlpZiAoYXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKKwkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCQlyZXR1cm4gYXR0cmlidXRlcy5oYXNOZXh0KCkgPyBudWxsIC8qIG1vcmUgdGhhbiBvbmUgKi86IGF0dHJpYnV0ZTsKKwkJfQorCQlyZXR1cm4gKHRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnN1cGVyUGVyc2lzdGVudFR5cGUucmVzb2x2ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwb3N0VXBkYXRlKCkgeworCQlzdXBlci5wb3N0VXBkYXRlKCk7CisJCWlmICh0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7CisJCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZS5wb3N0VXBkYXRlKCk7CisJCX0KKwkJZ2V0TWFwcGluZygpLnBvc3RVcGRhdGUoKTsKKwkJZm9yIChQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhdHRyaWJ1dGVzKCkpKSB7CisJCQlhdHRyaWJ1dGUucG9zdFVwZGF0ZSgpOworCQl9CisJfQorCisJcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCkgeworCQlmb3IgKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHNwZWNpZmllZEF0dHJpYnV0ZXMoKSkpIHsKKwkJCWlmIChhdHRyaWJ1dGUuY29udGFpbnModGV4dE9mZnNldCkpIHsKKwkJCQlyZXR1cm4gYXR0cmlidXRlOworCQkJfQorCQl9CisJCXJldHVybiB0aGlzOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgdGV4dE9mZnNldCkgeworCQlyZXR1cm4gdGhpcy50eXBlTWFwcGluZy5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnR5cGVNYXBwaW5nLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOworCX0KKwkKKwkvLyoqKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy52YWxpZGF0ZUNsYXNzKG1lc3NhZ2VzKTsKKwkJdGhpcy52YWxpZGF0ZU1hcHBpbmcobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy52YWxpZGF0ZUF0dHJpYnV0ZXMobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDbGFzcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9UWVBFX1VOUkVTT0xWRURfQ0xBU1MsCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAorCQkJCQl0aGlzLCAKKwkJCQkJdGhpcy5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NUZXh0UmFuZ2UoKQorCQkJCSkKKwkJCSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1hcHBpbmcoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQl0cnkgeworCQkJdGhpcy50eXBlTWFwcGluZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl9IGNhdGNoKFRocm93YWJsZSB0KSB7CisJCQlKcHRDb3JlUGx1Z2luLmxvZyh0KTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlmb3IgKEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IHRoaXMuYXR0cmlidXRlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCXRoaXMudmFsaWRhdGVBdHRyaWJ1dGUoc3RyZWFtLm5leHQoKSwgbWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQl0cnkgeworCQkJYXR0cmlidXRlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCX0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKKwkJCUpwdENvcmVQbHVnaW4ubG9nKHQpOworCQl9CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudHlwZU1hcHBpbmcuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgeworCQkJdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUuZGlzcG9zZSgpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5nZXROYW1lKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDY5NTgwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNlSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU5hbWVkQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBleHRlbmRzIEFic3RyYWN0T3JtTmFtZWRDb2x1bW48WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+CisJaW1wbGVtZW50cyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbgoreworCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKKworCXByb3RlY3RlZCBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiByZXNvdXJjZVBrSm9pbkNvbHVtbjsKKwkKKwlwdWJsaWMgR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtQmFzZUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHJlc291cmNlUGtKb2luQ29sdW1uKSB7CisJCXN1cGVyKHBhcmVudCwgb3duZXIpOworCQl0aGlzLmluaXRpYWxpemUocmVzb3VyY2VQa0pvaW5Db2x1bW4pOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKFByaW1hcnlLZXlKb2luQ29sdW1uIG9sZFBrSm9pbkNvbHVtbikgeworCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRQa0pvaW5Db2x1bW4pOworCQlzZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShvbGRQa0pvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRSZXNvdXJjZUNvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VQa0pvaW5Db2x1bW47CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlQ29sdW1uKCkgeworCQkvL3ByaW1hcnlLZXlKb2luQ29sdW1ucyBhcmUgcGFydCBvZiBhIGNvbGxlY3Rpb24sIHRoZSBway1qb2luLWNvbHVtbiBlbGVtZW50IHdpbGwgYmUgcmVtb3ZlZC9hZGRlZAorCQkvL3doZW4gdGhlIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGlzIHJlbW92ZWQvYWRkZWQgdG8gdGhlIFhtbEVudGl0eSBjb2xsZWN0aW9uCisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlQ29sdW1uKCkgeworCQkvL3ByaW1hcnlLZXlKb2luQ29sdW1ucyBhcmUgcGFydCBvZiBhIGNvbGxlY3Rpb24sIHRoZSBway1qb2luLWNvbHVtbiBlbGVtZW50IHdpbGwgYmUgcmVtb3ZlZC9hZGRlZAorCQkvL3doZW4gdGhlIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGlzIHJlbW92ZWQvYWRkZWQgdG8gdGhlIFhtbEVudGl0eSBjb2xsZWN0aW9uCisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgOiB0aGlzLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7CisJCVN0cmluZyBvbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7CisJCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwkJZ2V0UmVzb3VyY2VDb2x1bW4oKS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lXyhTdHJpbmcgbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKKwkJU3RyaW5nIG9sZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwkJdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5ld1NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSwgbmV3U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBuZXdEZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKKwkJU3RyaW5nIG9sZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOworCQl0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5ld0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSwgbmV3RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtQmFzZUpvaW5Db2x1bW4uT3duZXIgZ2V0T3duZXIoKSB7CisJCXJldHVybiAoT3JtQmFzZUpvaW5Db2x1bW4uT3duZXIpIHRoaXMub3duZXI7CisJfQorCisJcHVibGljIENvbHVtbiBnZXRSZWZlcmVuY2VkRGJDb2x1bW4oKSB7CisJCVRhYmxlIHRhYmxlID0gdGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpOworCQlyZXR1cm4gKHRhYmxlID09IG51bGwpID8gbnVsbCA6IHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIodGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7CisJCXJldHVybiBnZXRPd25lcigpLmdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRPd25pbmdUYWJsZU5hbWUoKSB7CisJCXJldHVybiB0aGlzLmdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSB7CisJCXJldHVybiBnZXRSZWZlcmVuY2VkRGJDb2x1bW4oKSAhPSBudWxsOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKSB7CisJCWlmIChnZXRSZXNvdXJjZUNvbHVtbigpICE9IG51bGwpIHsKKwkJCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRSZXNvdXJjZUNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCk7CisJCQlpZiAodGV4dFJhbmdlICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGV4dFJhbmdlOworCQkJfQorCQl9CisJCXJldHVybiBnZXRPd25lcigpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9CisKKwkJCisJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgeworCQlyZXR1cm4gZ2V0T3duZXIoKS5pc1ZpcnR1YWwodGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcmVzb3VyY2VQa0pvaW5Db2x1bW4pIHsKKwkJdGhpcy5yZXNvdXJjZVBrSm9pbkNvbHVtbiA9IHJlc291cmNlUGtKb2luQ29sdW1uOworCQlzdXBlci5pbml0aWFsaXplKHJlc291cmNlUGtKb2luQ29sdW1uKTsKKwkJdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGdldFJlc291cmNlUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKKwkJdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgPSBidWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcmVzb3VyY2VQa0pvaW5Db2x1bW4pIHsKKwkJdGhpcy5yZXNvdXJjZVBrSm9pbkNvbHVtbiA9IHJlc291cmNlUGtKb2luQ29sdW1uOworCQlzdXBlci51cGRhdGUocmVzb3VyY2VQa0pvaW5Db2x1bW4pOworCQl0aGlzLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lXyhnZXRSZXNvdXJjZVJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworCQl0aGlzLnNldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZShidWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZVJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVBrSm9pbkNvbHVtbiA9PSBudWxsID8gbnVsbCA6IHRoaXMucmVzb3VyY2VQa0pvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKKwl9CisJCisJLy9UT0RPIG5vdCBjb3JyZWN0IHdoZW4gd2Ugc3RhcnQgc3VwcG9ydGluZyBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgaW4gMS0xIG1hcHBpbmdzCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuIGJ1aWxkRGVmYXVsdE5hbWUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtUXVlcnlDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1RdWVyeUNvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NjZiYjAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtUXVlcnlDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDI1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkTmF0aXZlUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZFF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZE5hdGl2ZVF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUXVlcnlDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtUXVlcnlDb250YWluZXIgZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBPcm1RdWVyeUNvbnRhaW5lcgoreworCXByaXZhdGUgZmluYWwgWG1sUXVlcnlDb250YWluZXIgcmVzb3VyY2VRdWVyeUNvbnRhaW5lcjsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXM7CisKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXM7CisKKworCXB1YmxpYyBHZW5lcmljT3JtUXVlcnlDb250YWluZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxRdWVyeUNvbnRhaW5lciByZXNvdXJjZVF1ZXJ5Q29udGFpbmVyKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMucmVzb3VyY2VRdWVyeUNvbnRhaW5lciA9IHJlc291cmNlUXVlcnlDb250YWluZXI7CisJCXRoaXMubmFtZWRRdWVyaWVzID0gbmV3IEFycmF5TGlzdDxPcm1OYW1lZFF1ZXJ5PigpOworCQl0aGlzLm5hbWVkTmF0aXZlUXVlcmllcyA9IG5ldyBBcnJheUxpc3Q8T3JtTmFtZWROYXRpdmVRdWVyeT4oKTsKKwkJdGhpcy5pbml0aWFsaXplTmFtZWRRdWVyaWVzKCk7CisJCXRoaXMuaW5pdGlhbGl6ZU5hbWVkTmF0aXZlUXVlcmllcygpOworCX0KKworCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+KHRoaXMubmFtZWRRdWVyaWVzKTsKKwl9CisJCisJcHVibGljIGludCBuYW1lZFF1ZXJpZXNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lZFF1ZXJpZXMuc2l6ZSgpOworCX0KKwkKKwlwdWJsaWMgT3JtTmFtZWRRdWVyeSBhZGROYW1lZFF1ZXJ5KGludCBpbmRleCkgeworCQlYbWxOYW1lZFF1ZXJ5IHJlc291cmNlTmFtZWRRdWVyeSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkUXVlcnkoKTsKKwkJT3JtTmFtZWRRdWVyeSBjb250ZXh0TmFtZWRRdWVyeSA9IGJ1aWxkTmFtZWRRdWVyeShyZXNvdXJjZU5hbWVkUXVlcnkpOworCQl0aGlzLm5hbWVkUXVlcmllcy5hZGQoaW5kZXgsIGNvbnRleHROYW1lZFF1ZXJ5KTsKKwkJdGhpcy5yZXNvdXJjZVF1ZXJ5Q29udGFpbmVyLmdldE5hbWVkUXVlcmllcygpLmFkZChpbmRleCwgcmVzb3VyY2VOYW1lZFF1ZXJ5KTsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKE5BTUVEX1FVRVJJRVNfTElTVCwgaW5kZXgsIGNvbnRleHROYW1lZFF1ZXJ5KTsKKwkJcmV0dXJuIGNvbnRleHROYW1lZFF1ZXJ5OworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lZFF1ZXJ5KGludCBpbmRleCwgT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5KSB7CisJCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIG5hbWVkUXVlcnksIHRoaXMubmFtZWRRdWVyaWVzLCBOQU1FRF9RVUVSSUVTX0xJU1QpOworCX0KKwkJCisJcHJvdGVjdGVkIHZvaWQgYWRkTmFtZWRRdWVyeShPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkpIHsKKwkJdGhpcy5hZGROYW1lZFF1ZXJ5KHRoaXMubmFtZWRRdWVyaWVzLnNpemUoKSwgbmFtZWRRdWVyeSk7CisJfQorCQkKKwlwdWJsaWMgdm9pZCByZW1vdmVOYW1lZFF1ZXJ5KE5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgeworCQlyZW1vdmVOYW1lZFF1ZXJ5KHRoaXMubmFtZWRRdWVyaWVzLmluZGV4T2YobmFtZWRRdWVyeSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVOYW1lZFF1ZXJ5KGludCBpbmRleCkgeworCQlPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSB0aGlzLm5hbWVkUXVlcmllcy5yZW1vdmUoaW5kZXgpOworCQl0aGlzLnJlc291cmNlUXVlcnlDb250YWluZXIuZ2V0TmFtZWRRdWVyaWVzKCkucmVtb3ZlKGluZGV4KTsKKwkJZmlyZUl0ZW1SZW1vdmVkKE5BTUVEX1FVRVJJRVNfTElTVCwgaW5kZXgsIG5hbWVkUXVlcnkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOYW1lZFF1ZXJ5XyhPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkpIHsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KG5hbWVkUXVlcnksIHRoaXMubmFtZWRRdWVyaWVzLCBOQU1FRF9RVUVSSUVTX0xJU1QpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBtb3ZlTmFtZWRRdWVyeShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLm5hbWVkUXVlcmllcywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJdGhpcy5yZXNvdXJjZVF1ZXJ5Q29udGFpbmVyLmdldE5hbWVkUXVlcmllcygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJZmlyZUl0ZW1Nb3ZlZChOQU1FRF9RVUVSSUVTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKKwl9CisJCisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4odGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMpOworCX0KKwkKKwlwdWJsaWMgaW50IG5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSB7CisJCXJldHVybiB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5zaXplKCk7CisJfQorCQorCXB1YmxpYyBPcm1OYW1lZE5hdGl2ZVF1ZXJ5IGFkZE5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4KSB7CisJCVhtbE5hbWVkTmF0aXZlUXVlcnkgcmVzb3VyY2VOYW1lZE5hdGl2ZVF1ZXJ5ID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWROYXRpdmVRdWVyeSgpOworCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IGNvbnRleHROYW1lZE5hdGl2ZVF1ZXJ5ID0gYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5KHJlc291cmNlTmFtZWROYXRpdmVRdWVyeSk7CisJCXRoaXMubmFtZWROYXRpdmVRdWVyaWVzLmFkZChpbmRleCwgY29udGV4dE5hbWVkTmF0aXZlUXVlcnkpOworCQl0aGlzLnJlc291cmNlUXVlcnlDb250YWluZXIuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKGluZGV4LCByZXNvdXJjZU5hbWVkTmF0aXZlUXVlcnkpOworCQl0aGlzLmZpcmVJdGVtQWRkZWQoTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCwgaW5kZXgsIGNvbnRleHROYW1lZE5hdGl2ZVF1ZXJ5KTsKKwkJcmV0dXJuIGNvbnRleHROYW1lZE5hdGl2ZVF1ZXJ5OworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCwgT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5KSB7CisJCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIG5hbWVkTmF0aXZlUXVlcnksIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLCBOQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkTmFtZWROYXRpdmVRdWVyeShPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkpIHsKKwkJdGhpcy5hZGROYW1lZE5hdGl2ZVF1ZXJ5KHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLnNpemUoKSwgbmFtZWROYXRpdmVRdWVyeSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5KSB7CisJCXRoaXMucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSh0aGlzLm5hbWVkTmF0aXZlUXVlcmllcy5pbmRleE9mKG5hbWVkTmF0aXZlUXVlcnkpKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpIHsKKwkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMucmVtb3ZlKGluZGV4KTsKKwkJdGhpcy5yZXNvdXJjZVF1ZXJ5Q29udGFpbmVyLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnJlbW92ZShpbmRleCk7CisJCWZpcmVJdGVtUmVtb3ZlZChOQU1FRF9OQVRJVkVfUVVFUklFU19MSVNULCBpbmRleCwgbmFtZWROYXRpdmVRdWVyeSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTmFtZWROYXRpdmVRdWVyeV8oT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5KSB7CisJCXJlbW92ZUl0ZW1Gcm9tTGlzdChuYW1lZE5hdGl2ZVF1ZXJ5LCB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCk7CisJfQorCQkKKwlwdWJsaWMgdm9pZCBtb3ZlTmFtZWROYXRpdmVRdWVyeShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJdGhpcy5yZXNvdXJjZVF1ZXJ5Q29udGFpbmVyLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJZmlyZUl0ZW1Nb3ZlZChOQU1FRF9OQVRJVkVfUVVFUklFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCisJfQorCQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVOYW1lZFF1ZXJpZXMoKSB7CisJCWZvciAoWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5IDogdGhpcy5yZXNvdXJjZVF1ZXJ5Q29udGFpbmVyLmdldE5hbWVkUXVlcmllcygpKSB7CisJCQl0aGlzLm5hbWVkUXVlcmllcy5hZGQoYnVpbGROYW1lZFF1ZXJ5KG5hbWVkUXVlcnkpKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTmFtZWROYXRpdmVRdWVyaWVzKCkgeworCQlmb3IgKFhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA6IHRoaXMucmVzb3VyY2VRdWVyeUNvbnRhaW5lci5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSkgeworCQkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuYWRkKGJ1aWxkTmFtZWROYXRpdmVRdWVyeShuYW1lZE5hdGl2ZVF1ZXJ5KSk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl0aGlzLnVwZGF0ZU5hbWVkUXVlcmllcygpOworCQl0aGlzLnVwZGF0ZU5hbWVkTmF0aXZlUXVlcmllcygpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVOYW1lZFF1ZXJpZXMoKSB7CisJCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBYTUwgcXVlcmllcyAodG8gcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKQorCQlJdGVyYXRvcjxYbWxOYW1lZFF1ZXJ5PiB4bWxRdWVyaWVzID0gbmV3IENsb25lSXRlcmF0b3I8WG1sTmFtZWRRdWVyeT4odGhpcy5yZXNvdXJjZVF1ZXJ5Q29udGFpbmVyLmdldE5hbWVkUXVlcmllcygpKTsKKwkJCisJCWZvciAoSXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gY29udGV4dFF1ZXJpZXMgPSB0aGlzLm5hbWVkUXVlcmllcygpOyBjb250ZXh0UXVlcmllcy5oYXNOZXh0KCk7ICkgeworCQkJT3JtTmFtZWRRdWVyeSBjb250ZXh0UXVlcnkgPSBjb250ZXh0UXVlcmllcy5uZXh0KCk7CisJCQlpZiAoeG1sUXVlcmllcy5oYXNOZXh0KCkpIHsKKwkJCQljb250ZXh0UXVlcnkudXBkYXRlKHhtbFF1ZXJpZXMubmV4dCgpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlbW92ZU5hbWVkUXVlcnlfKGNvbnRleHRRdWVyeSk7CisJCQl9CisJCX0KKwkJCisJCXdoaWxlICh4bWxRdWVyaWVzLmhhc05leHQoKSkgeworCQkJYWRkTmFtZWRRdWVyeShidWlsZE5hbWVkUXVlcnkoeG1sUXVlcmllcy5uZXh0KCkpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBPcm1OYW1lZFF1ZXJ5IGJ1aWxkTmFtZWRRdWVyeShYbWxOYW1lZFF1ZXJ5IHJlc291cmNlTmFtZWRRdWVyeSkgeworCQlyZXR1cm4gZ2V0WG1sQ29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1OYW1lZFF1ZXJ5KHRoaXMsIHJlc291cmNlTmFtZWRRdWVyeSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlTmFtZWROYXRpdmVRdWVyaWVzKCkgeworCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgWE1MIHF1ZXJpZXMgKHRvIHByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbikKKwkJSXRlcmF0b3I8WG1sTmFtZWROYXRpdmVRdWVyeT4geG1sUXVlcmllcyA9IG5ldyBDbG9uZUl0ZXJhdG9yPFhtbE5hbWVkTmF0aXZlUXVlcnk+KHRoaXMucmVzb3VyY2VRdWVyeUNvbnRhaW5lci5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSk7CisJCQorCQlmb3IgKEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IGNvbnRleHRRdWVyaWVzID0gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsgY29udGV4dFF1ZXJpZXMuaGFzTmV4dCgpOyApIHsKKwkJCU9ybU5hbWVkTmF0aXZlUXVlcnkgY29udGV4dFF1ZXJ5ID0gY29udGV4dFF1ZXJpZXMubmV4dCgpOworCQkJaWYgKHhtbFF1ZXJpZXMuaGFzTmV4dCgpKSB7CisJCQkJY29udGV4dFF1ZXJ5LnVwZGF0ZSh4bWxRdWVyaWVzLm5leHQoKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5Xyhjb250ZXh0UXVlcnkpOworCQkJfQorCQl9CisJCQorCQl3aGlsZSAoeG1sUXVlcmllcy5oYXNOZXh0KCkpIHsKKwkJCWFkZE5hbWVkTmF0aXZlUXVlcnkoYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5KHhtbFF1ZXJpZXMubmV4dCgpKSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgT3JtTmFtZWROYXRpdmVRdWVyeSBidWlsZE5hbWVkTmF0aXZlUXVlcnkoWG1sTmFtZWROYXRpdmVRdWVyeSByZXNvdXJjZU5hbWVkTmF0aXZlUXVlcnkpIHsKKwkJcmV0dXJuIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtTmFtZWROYXRpdmVRdWVyeSh0aGlzLCByZXNvdXJjZU5hbWVkTmF0aXZlUXVlcnkpOworCX0KKwkKKwkKKwkvLyoqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy52YWxpZGF0ZVF1ZXJpZXMobWVzc2FnZXMpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVF1ZXJpZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKKwkJZm9yIChJdGVyYXRvcjxPcm1RdWVyeT4gbG9jYWxRdWVyaWVzID0gdGhpcy5xdWVyaWVzKCk7IGxvY2FsUXVlcmllcy5oYXNOZXh0KCk7ICkgeworCQkJT3JtUXVlcnkgbG9jYWxRdWVyeSA9IGxvY2FsUXVlcmllcy5uZXh0KCk7CisJCQlmb3IgKEl0ZXJhdG9yPFF1ZXJ5PiBnbG9iYWxRdWVyaWVzID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5xdWVyaWVzKCk7IGdsb2JhbFF1ZXJpZXMuaGFzTmV4dCgpOyApIHsKKwkJCQlpZiAobG9jYWxRdWVyeS5kdXBsaWNhdGVzKGdsb2JhbFF1ZXJpZXMubmV4dCgpKSkgeworCQkJCQltZXNzYWdlcy5hZGQoCisJCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5RVUVSWV9EVVBMSUNBVEVfTkFNRSwKKwkJCQkJCQluZXcgU3RyaW5nW10ge2xvY2FsUXVlcnkuZ2V0TmFtZSgpfSwKKwkJCQkJCQlsb2NhbFF1ZXJ5LAorCQkJCQkJCWxvY2FsUXVlcnkuZ2V0TmFtZVRleHRSYW5nZSgpKQorCQkJCQkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gYWxsIHRoZSBxdWVyaWVzLCBuYW1lZCBhbmQgbmFtZWQgbmF0aXZlLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByb3RlY3RlZCBJdGVyYXRvcjxPcm1RdWVyeT4gcXVlcmllcygpIHsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxPcm1RdWVyeT4oCisJCQkJCQluYW1lZFF1ZXJpZXMoKSwKKwkJCQkJCW5hbWVkTmF0aXZlUXVlcmllcygpCisJCQkJKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlUXVlcnlDb250YWluZXIuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1RdWVyeUhpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1RdWVyeUhpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDM2YTkyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVF1ZXJ5SGludC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlIaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5SGludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1RdWVyeUhpbnQgZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlIGltcGxlbWVudHMgT3JtUXVlcnlIaW50Cit7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOworCisJcHJvdGVjdGVkIFhtbFF1ZXJ5SGludCByZXNvdXJjZVF1ZXJ5SGludDsKKwkKKwlwdWJsaWMgR2VuZXJpY09ybVF1ZXJ5SGludChPcm1RdWVyeSBwYXJlbnQsIFhtbFF1ZXJ5SGludCByZXNvdXJjZVF1ZXJ5SGludCkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmluaXRpYWxpemUocmVzb3VyY2VRdWVyeUhpbnQpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuZXdOYW1lOworCQl0aGlzLnJlc291cmNlUXVlcnlIaW50LnNldE5hbWUobmV3TmFtZSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUXVlcnlIaW50Lk5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgeworCQlTdHJpbmcgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7CisJCXRoaXMucmVzb3VyY2VRdWVyeUhpbnQuc2V0VmFsdWUobmV3VmFsdWUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFF1ZXJ5SGludC5WQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbFF1ZXJ5SGludCByZXNvdXJjZVF1ZXJ5SGludCkgeworCQl0aGlzLnJlc291cmNlUXVlcnlIaW50ID0gcmVzb3VyY2VRdWVyeUhpbnQ7CisJCXRoaXMubmFtZSA9IHJlc291cmNlUXVlcnlIaW50LmdldE5hbWUoKTsKKwkJdGhpcy52YWx1ZSA9IHJlc291cmNlUXVlcnlIaW50LmdldFZhbHVlKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxRdWVyeUhpbnQgcmVzb3VyY2VRdWVyeUhpbnQpIHsKKwkJdGhpcy5yZXNvdXJjZVF1ZXJ5SGludCA9IHJlc291cmNlUXVlcnlIaW50OworCQl0aGlzLnNldE5hbWUocmVzb3VyY2VRdWVyeUhpbnQuZ2V0TmFtZSgpKTsKKwkJdGhpcy5zZXRWYWx1ZShyZXNvdXJjZVF1ZXJ5SGludC5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVF1ZXJ5SGludC5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlYzdjMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZS5qYXZhCkBAIC0wLDAgKzEsMzg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNlSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtU2Vjb25kYXJ5VGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworLyoqCisgKiBvcm0ueG1sIHNlY29uZGFyeSB0YWJsZQorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVRhYmxlCisJaW1wbGVtZW50cyBPcm1TZWNvbmRhcnlUYWJsZQoreworCXByb3RlY3RlZCBYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZTsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBuZXcgVmVjdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPigpOworCQorCXByb3RlY3RlZCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW47CisKKwlwcm90ZWN0ZWQgZmluYWwgT3JtQmFzZUpvaW5Db2x1bW4uT3duZXIgam9pbkNvbHVtbk93bmVyOworCisKKwlwdWJsaWMgR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlKE9ybUVudGl0eSBwYXJlbnQsIFhtbFNlY29uZGFyeVRhYmxlIHhtbFNlY29uZGFyeVRhYmxlKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuam9pbkNvbHVtbk93bmVyID0gdGhpcy5idWlsZEpvaW5Db2x1bW5Pd25lcigpOworCQl0aGlzLmluaXRpYWxpemUoeG1sU2Vjb25kYXJ5VGFibGUpOworCX0KKwkKKwlwcm90ZWN0ZWQgT3JtQmFzZUpvaW5Db2x1bW4uT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKSB7CisJCXJldHVybiBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKFNlY29uZGFyeVRhYmxlIG9sZFNlY29uZGFyeVRhYmxlKSB7CisJCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZFNlY29uZGFyeVRhYmxlKTsKKwkJZm9yIChQcmltYXJ5S2V5Sm9pbkNvbHVtbiBvbGRQa0pvaW5Db2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob2xkU2Vjb25kYXJ5VGFibGUuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpKSB7CisJCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBuZXdQa0pvaW5Db2x1bW4gPSBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOworCQkJbmV3UGtKb2luQ29sdW1uLmluaXRpYWxpemVGcm9tKG9sZFBrSm9pbkNvbHVtbik7CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybUVudGl0eSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoT3JtRW50aXR5KSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisJCisJcHVibGljIE9ybUVudGl0eSBnZXRPcm1FbnRpdHkoKSB7CisJCXJldHVybiBnZXRQYXJlbnQoKTsKKwl9CisJCisJcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gbmV3UGtKb2luQ29sdW1uKSB7CisJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIG9sZFBrSm9pbkNvbHVtbiA9IHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOworCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG5ld1BrSm9pbkNvbHVtbjsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTZWNvbmRhcnlUYWJsZS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBvbGRQa0pvaW5Db2x1bW4sIG5ld1BrSm9pbkNvbHVtbik7CisJfQorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIHRoaXMuY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA/IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgOiB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwl9CisJCisJcHVibGljIGludCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5jb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpID8gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7CisJfQorCisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyk7CisJfQorCisJcHVibGljIGludCBzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuc2l6ZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQlpZiAodGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gIT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbik7CisJCX0KKwkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7CisJfQorCQorCXByb3RlY3RlZCBpbnQgZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiAodGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPT0gbnVsbCkgPyAwIDogMTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiAhdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpOworCX0JCisKKwlwdWJsaWMgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIG9sZERlZmF1bHRQa0pvaW5Db2x1bW4gPSB0aGlzLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOworCQlpZiAob2xkRGVmYXVsdFBrSm9pbkNvbHVtbiAhPSBudWxsKSB7CisJCQkvL251bGwgdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4gbm93IGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkJCS8vaWYgb25lIGRvZXMgbm90IGV4aXN0LCB0aGVyZSBpcyBhbHJlYWR5IGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uLgorCQkJLy9SZW1vdmUgaXQgbm93IHNvIHRoYXQgaXQgZG9lc24ndCBnZXQgcmVtb3ZlZCBkdXJpbmcgYW4gdXBkYXRlIGFuZAorCQkJLy9jYXVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBiZSBzZW50IHRvIHRoZSBVSSBpbiB0aGUgd3Jvbmcgb3JkZXIKKwkJCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID0gbnVsbDsKKwkJfQorCQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiByZXNvdXJjZVBrSm9pbkNvbHVtbiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CisJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGNvbnRleHRQa0pvaW5Db2x1bW4gPSBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKHJlc291cmNlUGtKb2luQ29sdW1uKTsKKwkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuYWRkKGluZGV4LCBjb250ZXh0UGtKb2luQ29sdW1uKTsKKwkJdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoaW5kZXgsIHJlc291cmNlUGtKb2luQ29sdW1uKTsKKwkJCisJCXRoaXMuZmlyZUl0ZW1BZGRlZChTZWNvbmRhcnlUYWJsZS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBjb250ZXh0UGtKb2luQ29sdW1uKTsKKwkJaWYgKG9sZERlZmF1bHRQa0pvaW5Db2x1bW4gIT0gbnVsbCkgeworCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNlY29uZGFyeVRhYmxlLkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIG9sZERlZmF1bHRQa0pvaW5Db2x1bW4sIG51bGwpOworCQl9CisJCXJldHVybiBjb250ZXh0UGtKb2luQ29sdW1uOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgsIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uKSB7CisJCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHByaW1hcnlLZXlKb2luQ29sdW1uLCB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucywgU2Vjb25kYXJ5VGFibGUuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4pIHsKKwkJdGhpcy5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5zaXplKCksIHByaW1hcnlLZXlKb2luQ29sdW1uKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7CisJCXRoaXMucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaW5kZXhPZihwa0pvaW5Db2x1bW4pKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHJlbW92ZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7CisJCWlmICghY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgeworCQkJLy9jcmVhdGUgdGhlIGRlZmF1bHRKb2luQ29sdW1uIG5vdyBvciB0aGlzIHdpbGwgaGFwcGVuIGR1cmluZyBwcm9qZWN0IHVwZGF0ZSAKKwkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLiBUaGF0IGNhdXNlcyBwcm9ibGVtcyAKKwkJCS8vaW4gdGhlIFVJIGJlY2F1c2UgdGhlIGNoYW5nZSBub3RpZmljYXRpb25zIGVuZCB1cCBpbiB0aGUgd3Jvbmcgb3JkZXIuCisJCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4obnVsbCk7CisJCX0KKwkJdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoaW5kZXgpOworCQlmaXJlSXRlbVJlbW92ZWQoU2Vjb25kYXJ5VGFibGUuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgcmVtb3ZlZFByaW1hcnlLZXlKb2luQ29sdW1uKTsKKwkJaWYgKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uICE9IG51bGwpIHsKKwkJCS8vZmlyZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIGEgZGVmYXVsdEpvaW5Db2x1bW4gd2FzIGNyZWF0ZWQgYWJvdmUKKwkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFbnRpdHkuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgbnVsbCwgdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4pOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5fKE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uKSB7CisJCXJlbW92ZUl0ZW1Gcm9tTGlzdChwcmltYXJ5S2V5Sm9pbkNvbHVtbiwgdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIFNlY29uZGFyeVRhYmxlLlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCk7CisJfQorCQorCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCWZpcmVJdGVtTW92ZWQoU2Vjb25kYXJ5VGFibGUuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCisJfQorCisJCisJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgeworCQlyZXR1cm4gZ2V0T3JtRW50aXR5KCkuY29udGFpbnNWaXJ0dWFsU2Vjb25kYXJ5VGFibGUodGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBYbWxTZWNvbmRhcnlUYWJsZSBnZXRSZXNvdXJjZVRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgWG1sU2Vjb25kYXJ5VGFibGUgYWRkUmVzb3VyY2VUYWJsZSgpIHsKKwkJLy9zZWNvbmRhcnlUYWJsZXMgYXJlIHBhcnQgb2YgYSBjb2xsZWN0aW9uLCB0aGUgc2Vjb25kYXJ5LXRhYmxlIGVsZW1lbnQgd2lsbCBiZSByZW1vdmVkL2FkZGVkCisJCS8vd2hlbiB0aGUgWG1sU2Vjb25kYXJ5VGFibGUgaXMgcmVtb3ZlZC9hZGRlZCB0byB0aGUgWG1sRW50aXR5IGNvbGxlY3Rpb24KKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicmVzb3VyY2UgdGFibGUgaXMgbWlzc2luZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlVGFibGUoKSB7CisJCS8vc2Vjb25kYXJ5VGFibGVzIGFyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgdGhlIHNlY29uZGFyeS10YWJsZSBlbGVtZW50IHdpbGwgYmUgcmVtb3ZlZC9hZGRlZAorCQkvL3doZW4gdGhlIFhtbFNlY29uZGFyeVRhYmxlIGlzIHJlbW92ZWQvYWRkZWQgdG8gdGhlIFhtbEVudGl0eSBjb2xsZWN0aW9uCisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxTZWNvbmRhcnlUYWJsZSB4c3QpIHsKKwkJdGhpcy5zZWNvbmRhcnlUYWJsZSA9IHhzdDsKKwkJc3VwZXIuaW5pdGlhbGl6ZSh4c3QpOworCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkJdGhpcy5pbml0aWFsaXplRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7CisJCWZvciAoWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcmVzb3VyY2VQa0pvaW5Db2x1bW4gOiB0aGlzLnNlY29uZGFyeVRhYmxlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSB7CisJCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucy5hZGQoYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihyZXNvdXJjZVBrSm9pbkNvbHVtbikpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEJ1aWxkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgeworCQlyZXR1cm4gIWNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKKwkJaWYgKCFzaG91bGRCdWlsZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG51bGwpOworCX0JCisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sU2Vjb25kYXJ5VGFibGUgeHN0KSB7CisJCXRoaXMuc2Vjb25kYXJ5VGFibGUgPSB4c3Q7CisJCXN1cGVyLnVwZGF0ZSh4c3QpOworCQl0aGlzLnVwZGF0ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCQl0aGlzLnVwZGF0ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOworCX0KKwkJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgWE1MIFBLIGpvaW4gY29sdW1ucyAodG8gcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKQorCQlJdGVyYXRvcjxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4geG1sUGtKb2luQ29sdW1ucyA9IG5ldyBDbG9uZUl0ZXJhdG9yPFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLnNlY29uZGFyeVRhYmxlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKTsKKwkJCisJCWZvciAoSXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGNvbnRleHRQa0pvaW5Db2x1bW5zID0gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsgY29udGV4dFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpOyApIHsKKwkJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGNvbnRleHRQa0pvaW5Db2x1bW4gPSBjb250ZXh0UGtKb2luQ29sdW1ucy5uZXh0KCk7CisJCQlpZiAoeG1sUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKKwkJCQljb250ZXh0UGtKb2luQ29sdW1uLnVwZGF0ZSh4bWxQa0pvaW5Db2x1bW5zLm5leHQoKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbl8oY29udGV4dFBrSm9pbkNvbHVtbik7CisJCQl9CisJCX0KKwkJCisJCXdoaWxlICh4bWxQa0pvaW5Db2x1bW5zLmhhc05leHQoKSkgeworCQkJYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbih4bWxQa0pvaW5Db2x1bW5zLm5leHQoKSkpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKKwkJaWYgKCFzaG91bGRCdWlsZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKSB7CisJCQlzZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4obnVsbCk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpID09IG51bGwpIHsKKwkJCXRoaXMuc2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4obnVsbCkpOworCQl9CisJCWVsc2UgeworCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4udXBkYXRlKG51bGwpOworCQl9CisJfQkKKworCXByb3RlY3RlZCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHJlc291cmNlUGtKb2luQ29sdW1uKSB7CisJCXJldHVybiBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIHRoaXMuam9pbkNvbHVtbk93bmVyLCByZXNvdXJjZVBrSm9pbkNvbHVtbik7CisJfQorCisJLyoqCisJICogYSBzZWNvbmRhcnkgdGFibGUgZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBuYW1lCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHROYW1lKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFNjaGVtYSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRTY2hlbWEoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDYXRhbG9nKCkgeworCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdENhdGFsb2coKTsKKwl9CisKKworCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKSkgeworCQkJdGhpcy52YWxpZGF0ZUFnYWluc3REYXRhYmFzZShtZXNzYWdlcyk7CisJCX0KKwkJZm9yIChJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3RyZWFtID0gdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlzdHJlYW0ubmV4dCgpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFnYWluc3REYXRhYmFzZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgeworCQlpZiAoICEgdGhpcy5oYXNSZXNvbHZlZENhdGFsb2coKSkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRywKKwkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldENhdGFsb2coKSwgdGhpcy5nZXROYW1lKCl9LCAKKwkJCQkJdGhpcywKKwkJCQkJdGhpcy5nZXRDYXRhbG9nVGV4dFJhbmdlKCkKKwkJCQkpCisJCQkpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAoICEgdGhpcy5oYXNSZXNvbHZlZFNjaGVtYSgpKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5TRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRTY2hlbWEoKSwgdGhpcy5nZXROYW1lKCl9LCAKKwkJCQkJdGhpcywKKwkJCQkJdGhpcy5nZXRTY2hlbWFUZXh0UmFuZ2UoKQorCQkJCSkKKwkJCSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmICggISB0aGlzLmlzUmVzb2x2ZWQoKSkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwKKwkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sIAorCQkJCQl0aGlzLCAKKwkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKCkKKwkJCQkpCisJCQkpOworCQkJcmV0dXJuOworCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIHBrIGpvaW4gY29sdW1uIG93bmVyIGFkYXB0ZXIgKioqKioqKioqKgorCisJY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcgorCQlpbXBsZW1lbnRzIE9ybUJhc2VKb2luQ29sdW1uLk93bmVyCisJeworCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCQlyZXR1cm4gR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlLnRoaXMuZ2V0T3JtRW50aXR5KCk7CisJCX0KKworCQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7CisJCQlyZXR1cm4gR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlLnRoaXMuZ2V0RGJUYWJsZSgpOworCQl9CisKKwkJcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgeworCQkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeURiVGFibGUoKTsKKwkJfQorCisJCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgeworCQkJcmV0dXJuIEdlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZS50aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKKwkJfQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJCXJldHVybiBHZW5lcmljT3JtU2Vjb25kYXJ5VGFibGUudGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPT0gam9pbkNvbHVtbjsKKwkJfQorCQkKKwkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZSgpIHsKKwkJCWlmIChqb2luQ29sdW1uc1NpemUoKSAhPSAxKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlFbnRpdHkgcGFyZW50RW50aXR5ID0gZ2V0T3JtRW50aXR5KCkuZ2V0UGFyZW50RW50aXR5KCk7CisJCQlyZXR1cm4gKHBhcmVudEVudGl0eSA9PSBudWxsKSA/IGdldE9ybUVudGl0eSgpLmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkgOiBwYXJlbnRFbnRpdHkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKKwl9CisJCQorCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ODA1YzEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOworCisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVNlcXVlbmNlR2VuZXJhdG9yCit7CisKKwlwdWJsaWMgR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sU2VxdWVuY2VHZW5lcmF0b3IgcmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcikgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IpOworCX0KKworCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgorCisJLyoqCisJICogVGhlIEpQQSBzcGVjIGRvZXMgbm90IGFsbG93IGEgc2VxdWVuY2UgdG8gaGF2ZSBhIHNjaGVtYS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNjaGVtYSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRTY2hlbWEoKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgSlBBIHNwZWMgZG9lcyBub3QgYWxsb3cgYSBzZXF1ZW5jZSB0byBoYXZlIGEgY2F0YWxvZy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0Q2F0YWxvZygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2ZjZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVRhYmxlLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybVRhYmxlCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVRhYmxlCisJaW1wbGVtZW50cyBPcm1UYWJsZQoreworCXByb3RlY3RlZCBYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHk7CisJCisJcHVibGljIEdlbmVyaWNPcm1UYWJsZShPcm1FbnRpdHkgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJcHVibGljIE9ybUVudGl0eSBnZXRPcm1FbnRpdHkoKSB7CisJCXJldHVybiAoT3JtRW50aXR5KSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFhtbFRhYmxlIGdldFJlc291cmNlVGFibGUoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlRW50aXR5LmdldFRhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFhtbFRhYmxlIGFkZFJlc291cmNlVGFibGUoKSB7CisJCVhtbFRhYmxlIHJlc291cmNlVGFibGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZSgpOworCQl0aGlzLnJlc291cmNlRW50aXR5LnNldFRhYmxlKHJlc291cmNlVGFibGUpOworCQlyZXR1cm4gcmVzb3VyY2VUYWJsZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVzb3VyY2VUYWJsZSgpIHsKKwkJdGhpcy5yZXNvdXJjZUVudGl0eS5zZXRUYWJsZShudWxsKTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxFbnRpdHkgeG1sRW50aXR5KSB7CisJCXRoaXMucmVzb3VyY2VFbnRpdHkgPSB4bWxFbnRpdHk7CisJCXRoaXMuaW5pdGlhbGl6ZSh0aGlzLmdldFJlc291cmNlVGFibGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxFbnRpdHkgeG1sRW50aXR5KSB7CisJCXRoaXMucmVzb3VyY2VFbnRpdHkgPSB4bWxFbnRpdHk7CisJCXRoaXMudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VUYWJsZSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdE5hbWUoKSB7CisJCXJldHVybiB0aGlzLmdldE9ybUVudGl0eSgpLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLmdldE9ybUVudGl0eSgpLmdldERlZmF1bHRTY2hlbWEoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDYXRhbG9nKCkgeworCQlyZXR1cm4gdGhpcy5nZXRPcm1FbnRpdHkoKS5nZXREZWZhdWx0Q2F0YWxvZygpOworCX0KKwkKKwkvLyoqKioqKioqKioqIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpKSB7CisJCQl0aGlzLnZhbGlkYXRlQWdhaW5zdERhdGFiYXNlKG1lc3NhZ2VzKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQWdhaW5zdERhdGFiYXNlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7CisJCWlmICggISB0aGlzLmhhc1Jlc29sdmVkQ2F0YWxvZygpKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0csCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRDYXRhbG9nKCksIHRoaXMuZ2V0TmFtZSgpfSwgCisJCQkJCXRoaXMsCisJCQkJCXRoaXMuZ2V0Q2F0YWxvZ1RleHRSYW5nZSgpCisJCQkJKQorCQkJKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKCAhIHRoaXMuaGFzUmVzb2x2ZWRTY2hlbWEoKSkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRTY2hlbWEoKSwgdGhpcy5nZXROYW1lKCl9LCAKKwkJCQkJdGhpcywKKwkJCQkJdGhpcy5nZXRTY2hlbWFUZXh0UmFuZ2UoKQorCQkJCSkKKwkJCSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmICggISB0aGlzLmlzUmVzb2x2ZWQoKSkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9OQU1FLAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwgCisJCQkJCXRoaXMsIAorCQkJCQl0aGlzLmdldE5hbWVUZXh0UmFuZ2UoKQorCQkJCSkKKwkJCSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UYWJsZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVRhYmxlR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1ZjkzMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UYWJsZUdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1VbmlxdWVDb25zdHJhaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOworCisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybVRhYmxlR2VuZXJhdG9yCisJZXh0ZW5kcyBBYnN0cmFjdE9ybUdlbmVyYXRvcjxYbWxUYWJsZUdlbmVyYXRvcj4KKwlpbXBsZW1lbnRzIE9ybVRhYmxlR2VuZXJhdG9yLCBVbmlxdWVDb25zdHJhaW50Lk93bmVyCit7CisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYWJsZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYWJsZTsKKworCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ2F0YWxvZzsKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nOworCisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTY2hlbWE7CisJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hOworCisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRQa0NvbHVtbk5hbWU7CisJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UGtDb2x1bW5OYW1lOworCisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7CisJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWVDb2x1bW5OYW1lOworCisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRQa0NvbHVtblZhbHVlOworCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFBrQ29sdW1uVmFsdWU7CisKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50czsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCisKKwlwdWJsaWMgR2VuZXJpY09ybVRhYmxlR2VuZXJhdG9yKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sVGFibGVHZW5lcmF0b3IgcmVzb3VyY2VUYWJsZUdlbmVyYXRvcikgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzID0gbmV3IEFycmF5TGlzdDxPcm1VbmlxdWVDb25zdHJhaW50PigpOworCQl0aGlzLmluaXRpYWxpemUocmVzb3VyY2VUYWJsZUdlbmVyYXRvcik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBnZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkgeworCQlyZXR1cm4gVGFibGVHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRhYmxlICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRUYWJsZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkVGFibGUgOiB0aGlzLmRlZmF1bHRUYWJsZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUYWJsZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUYWJsZShTdHJpbmcgdGFibGUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkVGFibGU7CisJCXRoaXMuc3BlY2lmaWVkVGFibGUgPSB0YWJsZTsKKwkJdGhpcy5nZXRSZXNvdXJjZUdlbmVyYXRvcigpLnNldFRhYmxlKHRhYmxlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSwgb2xkLCB0YWJsZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFRhYmxlXyhTdHJpbmcgdGFibGUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkVGFibGU7CisJCXRoaXMuc3BlY2lmaWVkVGFibGUgPSB0YWJsZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSwgb2xkLCB0YWJsZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRUYWJsZTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFRhYmxlKFN0cmluZyB0YWJsZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0VGFibGU7CisJCXRoaXMuZGVmYXVsdFRhYmxlID0gdGFibGU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1RBQkxFX1BST1BFUlRZLCBvbGQsIHRhYmxlKTsKKwl9CisKKworCS8vICoqKioqKioqKiogc2NoZW1hICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkU2NoZW1hICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRTY2hlbWEgOiB0aGlzLmRlZmF1bHRTY2hlbWE7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFNjaGVtYTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7CisJCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gc2NoZW1hOworCQl0aGlzLmdldFJlc291cmNlR2VuZXJhdG9yKCkuc2V0U2NoZW1hKHNjaGVtYSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hXyhTdHJpbmcgc2NoZW1hKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFNjaGVtYTsKKwkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBzY2hlbWE7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NoZW1hOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFNjaGVtYTsKKwkJdGhpcy5kZWZhdWx0U2NoZW1hID0gc2NoZW1hOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKKwl9CisKKworCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRDYXRhbG9nICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDYXRhbG9nIDogdGhpcy5kZWZhdWx0Q2F0YWxvZzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZENhdGFsb2c7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOworCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBjYXRhbG9nOworCQl0aGlzLmdldFJlc291cmNlR2VuZXJhdG9yKCkuc2V0Q2F0YWxvZyhjYXRhbG9nKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nXyhTdHJpbmcgY2F0YWxvZykgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOworCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBjYXRhbG9nOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZygpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdENhdGFsb2c7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRDYXRhbG9nOworCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gY2F0YWxvZzsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGNvbHVtbiBuYW1lICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0UGtDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWUgOiB0aGlzLmRlZmF1bHRQa0NvbHVtbk5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZTsKKwkJdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWUgPSBuYW1lOworCQl0aGlzLmdldFJlc291cmNlR2VuZXJhdG9yKCkuc2V0UGtDb2x1bW5OYW1lKG5hbWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFBrQ29sdW1uTmFtZV8oU3RyaW5nIG5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lOworCQl0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZSA9IG5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUEtfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGtDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0UGtDb2x1bW5OYW1lOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UGtDb2x1bW5OYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRQa0NvbHVtbk5hbWU7CisJCXRoaXMuZGVmYXVsdFBrQ29sdW1uTmFtZSA9IG5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOworCX0KKworCisJLy8gKioqKioqKioqKiB2YWx1ZSBjb2x1bW4gbmFtZSAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlQ29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lIDogdGhpcy5kZWZhdWx0VmFsdWVDb2x1bW5OYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZTsKKwkJdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUgPSBuYW1lOworCQl0aGlzLmdldFJlc291cmNlR2VuZXJhdG9yKCkuc2V0VmFsdWVDb2x1bW5OYW1lKG5hbWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1ZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZV8oU3RyaW5nIG5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lOworCQl0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSA9IG5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWVDb2x1bW5OYW1lOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRWYWx1ZUNvbHVtbk5hbWU7CisJCXRoaXMuZGVmYXVsdFZhbHVlQ29sdW1uTmFtZSA9IG5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1ZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOworCX0KKworCisJLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBjb2x1bW4gdmFsdWUgKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRQa0NvbHVtblZhbHVlKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSA6IHRoaXMuZGVmYXVsdFBrQ29sdW1uVmFsdWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWU7CisJCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSA9IHZhbHVlOworCQl0aGlzLmdldFJlc291cmNlR2VuZXJhdG9yKCkuc2V0UGtDb2x1bW5WYWx1ZSh2YWx1ZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZTsKKwkJdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlID0gdmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQa0NvbHVtblZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0UGtDb2x1bW5WYWx1ZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRQa0NvbHVtblZhbHVlOworCQl0aGlzLmRlZmF1bHRQa0NvbHVtblZhbHVlID0gdmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHVuaXF1ZSBjb25zdHJhaW50cyAqKioqKioqKioqCisJCisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50Pih0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKTsKKwl9CisJCisJcHVibGljIGludCB1bmlxdWVDb25zdHJhaW50c1NpemUoKSB7CisJCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnNpemUoKTsKKwl9CisJCisJcHVibGljIE9ybVVuaXF1ZUNvbnN0cmFpbnQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKKwkJWG1sVW5pcXVlQ29uc3RyYWludCByZXNvdXJjZVVDID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOworCQlPcm1VbmlxdWVDb25zdHJhaW50IGNvbnRleHRVQyA9IHRoaXMuYnVpbGRVbmlxdWVDb25zdHJhaW50KHJlc291cmNlVUMpOworCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmFkZChpbmRleCwgY29udGV4dFVDKTsKKwkJdGhpcy5nZXRSZXNvdXJjZUdlbmVyYXRvcigpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKGluZGV4LCByZXNvdXJjZVVDKTsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKFVOSVFVRV9DT05TVFJBSU5UU19MSVNULCBpbmRleCwgY29udGV4dFVDKTsKKwkJcmV0dXJuIGNvbnRleHRVQzsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgsIE9ybVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgeworCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnQsIHRoaXMudW5pcXVlQ29uc3RyYWludHMsIFVOSVFVRV9DT05TVFJBSU5UU19MSVNUKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkVW5pcXVlQ29uc3RyYWludChPcm1VbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKKwkJdGhpcy5hZGRVbmlxdWVDb25zdHJhaW50KHRoaXMudW5pcXVlQ29uc3RyYWludHMuc2l6ZSgpLCB1bmlxdWVDb25zdHJhaW50KTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKKwkJdGhpcy5yZW1vdmVVbmlxdWVDb25zdHJhaW50KHRoaXMudW5pcXVlQ29uc3RyYWludHMuaW5kZXhPZih1bmlxdWVDb25zdHJhaW50KSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7CisJCU9ybVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IHRoaXMudW5pcXVlQ29uc3RyYWludHMucmVtb3ZlKGluZGV4KTsKKwkJdGhpcy5nZXRSZXNvdXJjZUdlbmVyYXRvcigpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKGluZGV4KTsKKwkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QsIGluZGV4LCB1bmlxdWVDb25zdHJhaW50KTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludF8oT3JtVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7CisJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KHVuaXF1ZUNvbnN0cmFpbnQsIHRoaXMudW5pcXVlQ29uc3RyYWludHMsIFVOSVFVRV9DT05TVFJBSU5UU19MSVNUKTsKKwl9CisJCisJcHVibGljIHZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy51bmlxdWVDb25zdHJhaW50cywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJdGhpcy5nZXRSZXNvdXJjZUdlbmVyYXRvcigpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl0aGlzLmZpcmVJdGVtTW92ZWQoVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKKwl9CisKKworCS8vKioqKioqKioqKioqKioqKioqKiBVbmlxdWVDb25zdHJhaW50Lk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKgorCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlVW5pcXVlQ29uc3RyYWludENvbHVtbk5hbWVzKCkgeworCQlvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZGJUYWJsZSA9IHRoaXMuZ2V0RGJUYWJsZSgpOworCQlyZXR1cm4gKGRiVGFibGUgIT0gbnVsbCkgPyBkYlRhYmxlLnNvcnRlZENvbHVtbklkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogcmVzb3VyY2UgPT4gY29udGV4dCAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbFRhYmxlR2VuZXJhdG9yIHhtbFRhYmxlR2VuZXJhdG9yKSB7CisJCXN1cGVyLmluaXRpYWxpemUoeG1sVGFibGVHZW5lcmF0b3IpOworCQl0aGlzLnNwZWNpZmllZFRhYmxlID0geG1sVGFibGVHZW5lcmF0b3IuZ2V0VGFibGUoKTsKKwkJdGhpcy5kZWZhdWx0U2NoZW1hID0gdGhpcy5idWlsZERlZmF1bHRTY2hlbWEoKTsKKwkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSB4bWxUYWJsZUdlbmVyYXRvci5nZXRTY2hlbWEoKTsKKwkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZygpOworCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSB4bWxUYWJsZUdlbmVyYXRvci5nZXRDYXRhbG9nKCk7CisJCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lID0geG1sVGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5OYW1lKCk7CisJCXRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lID0geG1sVGFibGVHZW5lcmF0b3IuZ2V0VmFsdWVDb2x1bW5OYW1lKCk7CisJCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSA9IHhtbFRhYmxlR2VuZXJhdG9yLmdldFBrQ29sdW1uVmFsdWUoKTsKKwkJdGhpcy5pbml0aWFsaXplVW5pcXVlQ29udHJhaW50cygpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVW5pcXVlQ29udHJhaW50cygpIHsKKwkJaWYgKHRoaXMucmVzb3VyY2VHZW5lcmF0b3IgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCWZvciAoWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50IDogdGhpcy5yZXNvdXJjZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpKSB7CisJCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmFkZCh0aGlzLmJ1aWxkVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KSk7CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKFhtbFRhYmxlR2VuZXJhdG9yIHhtbFRhYmxlR2VuZXJhdG9yKSB7CisJCXN1cGVyLnVwZGF0ZSh4bWxUYWJsZUdlbmVyYXRvcik7CisJCXRoaXMuc2V0U3BlY2lmaWVkVGFibGVfKHhtbFRhYmxlR2VuZXJhdG9yLmdldFRhYmxlKCkpOworCQl0aGlzLnNldERlZmF1bHRTY2hlbWEodGhpcy5idWlsZERlZmF1bHRTY2hlbWEoKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hXyh4bWxUYWJsZUdlbmVyYXRvci5nZXRTY2hlbWEoKSk7CisJCXRoaXMuc2V0RGVmYXVsdENhdGFsb2codGhpcy5idWlsZERlZmF1bHRDYXRhbG9nKCkpOworCQl0aGlzLnNldFNwZWNpZmllZENhdGFsb2dfKHhtbFRhYmxlR2VuZXJhdG9yLmdldENhdGFsb2coKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lXyh4bWxUYWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtbk5hbWUoKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lXyh4bWxUYWJsZUdlbmVyYXRvci5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZV8oeG1sVGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKKwkJLy8gVE9ETyBkZWZhdWx0cworCQl0aGlzLnVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdFNjaGVtYSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0Q2F0YWxvZygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCkgeworCQlJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB4bWxDb25zdHJhaW50cyA9IHRoaXMueG1sVW5pcXVlQ29uc3RyYWludHMoKTsKKwkJCisJCWZvciAoSXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gY29udGV4dENvbnN0cmFpbnRzID0gdGhpcy51bmlxdWVDb25zdHJhaW50cygpOyBjb250ZXh0Q29uc3RyYWludHMuaGFzTmV4dCgpOyApIHsKKwkJCU9ybVVuaXF1ZUNvbnN0cmFpbnQgY29udGV4dENvbnN0cmFpbnQgPSBjb250ZXh0Q29uc3RyYWludHMubmV4dCgpOworCQkJaWYgKHhtbENvbnN0cmFpbnRzLmhhc05leHQoKSkgeworCQkJCWNvbnRleHRDb25zdHJhaW50LnVwZGF0ZSh4bWxDb25zdHJhaW50cy5uZXh0KCkpOworCQkJfQorCQkJZWxzZSB7CisJCQkJdGhpcy5yZW1vdmVVbmlxdWVDb25zdHJhaW50Xyhjb250ZXh0Q29uc3RyYWludCk7CisJCQl9CisJCX0KKwkJCisJCXdoaWxlICh4bWxDb25zdHJhaW50cy5oYXNOZXh0KCkpIHsKKwkJCXRoaXMuYWRkVW5pcXVlQ29uc3RyYWludCh0aGlzLmJ1aWxkVW5pcXVlQ29uc3RyYWludCh4bWxDb25zdHJhaW50cy5uZXh0KCkpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB4bWxVbmlxdWVDb25zdHJhaW50cygpIHsKKwkJLy8gbWFrZSBhIGNvcHkgb2YgdGhlIFhNTCBjb25zdHJhaW50cyAodG8gcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKQorCQlyZXR1cm4gKHRoaXMucmVzb3VyY2VHZW5lcmF0b3IgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhdG9yLjxYbWxVbmlxdWVDb25zdHJhaW50Pmluc3RhbmNlKCkKKwkJCQkJOiBuZXcgQ2xvbmVJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50Pih0aGlzLnJlc291cmNlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkpOworCX0KKworCXByb3RlY3RlZCBPcm1VbmlxdWVDb25zdHJhaW50IGJ1aWxkVW5pcXVlQ29uc3RyYWludChYbWxVbmlxdWVDb25zdHJhaW50IHJlc291cmNlVW5pcXVlQ29uc3RyYWludCkgeworCQlyZXR1cm4gdGhpcy5nZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVVuaXF1ZUNvbnN0cmFpbnQodGhpcywgdGhpcywgcmVzb3VyY2VVbmlxdWVDb25zdHJhaW50KTsKKwl9CisKKworCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgorCisJcHVibGljIFRhYmxlIGdldERiVGFibGUoKSB7CisJCVNjaGVtYSBkYlNjaGVtYSA9IHRoaXMuZ2V0RGJTY2hlbWEoKTsKKwkJcmV0dXJuIChkYlNjaGVtYSA9PSBudWxsKSA/IG51bGwgOiBkYlNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIodGhpcy5nZXRUYWJsZSgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UZW1wb3JhbENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVRlbXBvcmFsQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0MjI4NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UZW1wb3JhbENvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybVRlbXBvcmFsQ29udmVydGVyIGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgVGVtcG9yYWxDb252ZXJ0ZXIsIE9ybUNvbnZlcnRlcgoreworCXByaXZhdGUgVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZTsKKwkKKwlwcml2YXRlIFhtbENvbnZlcnRpYmxlTWFwcGluZyByZXNvdXJjZUNvbnZlcnRpYmxlTWFwcGluZzsKKwkKKwlwdWJsaWMgR2VuZXJpY09ybVRlbXBvcmFsQ29udmVydGVyKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBYbWxDb252ZXJ0aWJsZU1hcHBpbmcgcmVzb3VyY2VDb252ZXJ0YWJsZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5pbml0aWFsaXplKHJlc291cmNlQ29udmVydGFibGVNYXBwaW5nKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoT3JtQXR0cmlidXRlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUjsKKwl9CisJCisJcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbFR5cGUoKSB7CisJCXJldHVybiB0aGlzLnRlbXBvcmFsVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsVHlwZSkgeworCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWxUeXBlID0gdGhpcy50ZW1wb3JhbFR5cGU7CisJCXRoaXMudGVtcG9yYWxUeXBlID0gbmV3VGVtcG9yYWxUeXBlOworCQl0aGlzLnJlc291cmNlQ29udmVydGlibGVNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3VGVtcG9yYWxUeXBlKSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEVNUE9SQUxfVFlQRV9QUk9QRVJUWSwgb2xkVGVtcG9yYWxUeXBlLCBuZXdUZW1wb3JhbFR5cGUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRUZW1wb3JhbFR5cGVfKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbFR5cGUpIHsKKwkJVGVtcG9yYWxUeXBlIG9sZFRlbXBvcmFsVHlwZSA9IHRoaXMudGVtcG9yYWxUeXBlOworCQl0aGlzLnRlbXBvcmFsVHlwZSA9IG5ld1RlbXBvcmFsVHlwZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChURU1QT1JBTF9UWVBFX1BST1BFUlRZLCBvbGRUZW1wb3JhbFR5cGUsIG5ld1RlbXBvcmFsVHlwZSk7CisJfQorCisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxDb252ZXJ0aWJsZU1hcHBpbmcgcmVzb3VyY2VDb252ZXJ0aWJsZU1hcHBpbmcpIHsKKwkJdGhpcy5yZXNvdXJjZUNvbnZlcnRpYmxlTWFwcGluZyA9IHJlc291cmNlQ29udmVydGlibGVNYXBwaW5nOworCQl0aGlzLnRlbXBvcmFsVHlwZSA9IHRoaXMudGVtcG9yYWxUeXBlKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsJCQorCQl0aGlzLnNldFRlbXBvcmFsVHlwZV8odGhpcy50ZW1wb3JhbFR5cGUoKSk7CisJfQorCQorCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlKCkgeworCQlyZXR1cm4gVGVtcG9yYWxUeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKHRoaXMucmVzb3VyY2VDb252ZXJ0aWJsZU1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJfQorCisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUNvbnZlcnRpYmxlTWFwcGluZy5nZXRUZW1wb3JhbFRleHRSYW5nZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwoKSB7CisJCXRoaXMucmVzb3VyY2VDb252ZXJ0aWJsZU1hcHBpbmcuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoKSB7CisJCXRoaXMucmVzb3VyY2VDb252ZXJ0aWJsZU1hcHBpbmcuc2V0VGVtcG9yYWwobnVsbCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVHJhbnNpZW50TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVRyYW5zaWVudE1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTAyYzFmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVRyYW5zaWVudE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHJhbnNpZW50TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk1ldGFtb2RlbEZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQ7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1UcmFuc2llbnRNYXBwaW5nCisJZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WG1sVHJhbnNpZW50PiAKKwlpbXBsZW1lbnRzIE9ybVRyYW5zaWVudE1hcHBpbmcKK3sKKwkKKwlwdWJsaWMgR2VuZXJpY09ybVRyYW5zaWVudE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbFRyYW5zaWVudCByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKKwkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybVRyYW5zaWVudE1hcHBpbmcodGhpcyk7CisJfQorCisJcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIDkwOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwoQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKKwkJcmVzb3VyY2VBdHRyaWJ1dGVzLmdldFRyYW5zaWVudHMoKS5hZGQodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0VHJhbnNpZW50cygpLnJlbW92ZSh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCisJLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKiAgCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWV0YW1vZGVsRmllbGQgZ2V0TWV0YW1vZGVsRmllbGQoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVVuaXF1ZUNvbnN0cmFpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1VbmlxdWVDb25zdHJhaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZmNjYxNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1VbmlxdWVDb25zdHJhaW50LmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtVW5pcXVlQ29uc3RyYWludAorCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgT3JtVW5pcXVlQ29uc3RyYWludAoreworCQorCXByb3RlY3RlZCBmaW5hbCBMaXN0PFN0cmluZz4gY29sdW1uTmFtZXM7CisJCisJcHJvdGVjdGVkIFhtbFVuaXF1ZUNvbnN0cmFpbnQgcmVzb3VyY2VVbmlxdWVDb25zdHJhaW50OworCQorCXByb3RlY3RlZCBPd25lciBvd25lcjsKKwkKKwlwdWJsaWMgR2VuZXJpY09ybVVuaXF1ZUNvbnN0cmFpbnQoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPd25lciBvd25lciwgWG1sVW5pcXVlQ29uc3RyYWludCByZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5vd25lciA9IG93bmVyOworCQl0aGlzLmNvbHVtbk5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXRoaXMuaW5pdGlhbGl6ZShyZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnQpOworCX0KKwkKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmNvbHVtbk5hbWVzKTsKKwl9CisKKwlwdWJsaWMgaW50IGNvbHVtbk5hbWVzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uTmFtZXMuc2l6ZSgpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZENvbHVtbk5hbWUoaW50IGluZGV4LCBTdHJpbmcgY29sdW1uTmFtZSkgeworCQl0aGlzLmNvbHVtbk5hbWVzLmFkZChpbmRleCwgY29sdW1uTmFtZSk7CisJCXRoaXMucmVzb3VyY2VVbmlxdWVDb25zdHJhaW50LmdldENvbHVtbk5hbWVzKCkuYWRkKGluZGV4LCBjb2x1bW5OYW1lKTsKKwkJZmlyZUl0ZW1BZGRlZChDT0xVTU5fTkFNRVNfTElTVCwgaW5kZXgsIGNvbHVtbk5hbWUpOwkJCisJfQkKKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5OYW1lXyhpbnQgaW5kZXgsIFN0cmluZyBjb2x1bW5OYW1lKSB7CisJCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgY29sdW1uTmFtZSwgdGhpcy5jb2x1bW5OYW1lcywgQ09MVU1OX05BTUVTX0xJU1QpOworCX0JCisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5OYW1lXyhTdHJpbmcgY29sdW1uTmFtZSkgeworCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoY29sdW1uTmFtZSwgdGhpcy5jb2x1bW5OYW1lcywgQ09MVU1OX05BTUVTX0xJU1QpOworCX0JCisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRDb2x1bW5OYW1lXyhpbnQgaW5kZXgsIFN0cmluZyBjb2x1bW5OYW1lKSB7CisJCXRoaXMuc2V0SXRlbUluTGlzdChpbmRleCwgY29sdW1uTmFtZSwgdGhpcy5jb2x1bW5OYW1lcywgQ09MVU1OX05BTUVTX0xJU1QpOworCX0JCisKKwlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5OYW1lKFN0cmluZyBjb2x1bW5OYW1lKSB7CisJCXRoaXMucmVtb3ZlQ29sdW1uTmFtZSh0aGlzLmNvbHVtbk5hbWVzLmluZGV4T2YoY29sdW1uTmFtZSkpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbk5hbWUoaW50IGluZGV4KSB7CisJCVN0cmluZyByZW1vdmVkQ29sdW1uTmFtZSA9IHRoaXMuY29sdW1uTmFtZXMucmVtb3ZlKGluZGV4KTsKKwkJdGhpcy5yZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnQuZ2V0Q29sdW1uTmFtZXMoKS5yZW1vdmUoaW5kZXgpOworCQlmaXJlSXRlbVJlbW92ZWQoQ09MVU1OX05BTUVTX0xJU1QsIGluZGV4LCByZW1vdmVkQ29sdW1uTmFtZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbHVtbk5hbWVfKGludCBpbmRleCkgeworCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5jb2x1bW5OYW1lcywgQ09MVU1OX05BTUVTX0xJU1QpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVDb2x1bW5OYW1lKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuY29sdW1uTmFtZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCXRoaXMucmVzb3VyY2VVbmlxdWVDb25zdHJhaW50LmdldENvbHVtbk5hbWVzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQlmaXJlSXRlbU1vdmVkKENPTFVNTl9OQU1FU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnQuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhtbFVuaXF1ZUNvbnN0cmFpbnQgeG1sVW5pcXVlQ29uc3RyYWludCkgeworCQl0aGlzLnJlc291cmNlVW5pcXVlQ29uc3RyYWludCA9IHhtbFVuaXF1ZUNvbnN0cmFpbnQ7CisJCXRoaXMuaW5pdGlhbGl6ZUNvbHVtbk5hbWVzKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb2x1bW5OYW1lcygpIHsKKwkJZm9yIChTdHJpbmcgYW5ub3RhdGlvbkNvbHVtbk5hbWUgOiB0aGlzLnJlc291cmNlVW5pcXVlQ29uc3RyYWludC5nZXRDb2x1bW5OYW1lcygpKSB7CisJCQl0aGlzLmNvbHVtbk5hbWVzLmFkZChhbm5vdGF0aW9uQ29sdW1uTmFtZSk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKFhtbFVuaXF1ZUNvbnN0cmFpbnQgeG1sVW5pcXVlQ29uc3RyYWludCkgeworCQl0aGlzLnJlc291cmNlVW5pcXVlQ29uc3RyYWludCA9IHhtbFVuaXF1ZUNvbnN0cmFpbnQ7CisJCXRoaXMudXBkYXRlQ29sdW1uTmFtZXMoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29sdW1uTmFtZXMoKSB7CisJCWludCBpbmRleCA9IDA7CisJCWZvciAoU3RyaW5nIHhtbENvbHVtbk5hbWUgOiB0aGlzLnJlc291cmNlVW5pcXVlQ29uc3RyYWludC5nZXRDb2x1bW5OYW1lcygpKSB7CisJCQlpZiAodGhpcy5jb2x1bW5OYW1lcy5zaXplKCkgPiBpbmRleCkgeworCQkJCWlmICggISB0aGlzLmNvbHVtbk5hbWVzLmdldChpbmRleCkuZXF1YWxzKHhtbENvbHVtbk5hbWUpKSB7CisJCQkJCXRoaXMuc2V0Q29sdW1uTmFtZV8oaW5kZXgsIHhtbENvbHVtbk5hbWUpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXRoaXMuYWRkQ29sdW1uTmFtZV8oeG1sQ29sdW1uTmFtZSk7CQkJCisJCQl9CisJCQlpbmRleCsrOworCQl9CisJCQorCQl3aGlsZSAoaW5kZXggPCB0aGlzLmNvbHVtbk5hbWVzLnNpemUoKSkgeworCQkJdGhpcy5yZW1vdmVDb2x1bW5OYW1lXyhpbmRleCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVmVyc2lvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WZXJzaW9uTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNzRkZTcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVmVyc2lvbk1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1WZXJzaW9uTWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtVmVyc2lvbk1hcHBpbmc8WG1sVmVyc2lvbj4KK3sKKwkKKwlwdWJsaWMgR2VuZXJpY09ybVZlcnNpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxWZXJzaW9uIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtWG1sLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtWG1sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczNDEyNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1YbWwuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZVJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybVhtbAorCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgT3JtWG1sCit7CisJcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIHhtbFJlc291cmNlOworCQorCXByb3RlY3RlZCBFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5nczsKKwkKKwkKKwlwdWJsaWMgR2VuZXJpY09ybVhtbChNYXBwaW5nRmlsZVJlZiBwYXJlbnQsIEpwYVhtbFJlc291cmNlIHJlc291cmNlKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCWlmICghcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKS5pc0tpbmRPZihKcHRDb3JlUGx1Z2luLk1BUFBJTkdfRklMRV9DT05URU5UX1RZUEUpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHJlc291cmNlICsgIiBkb2VzIG5vdCBoYXZlIG1hcHBpbmcgZmlsZSBjb250ZW50IHR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXRoaXMueG1sUmVzb3VyY2UgPSByZXNvdXJjZTsKKwkJWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MgPSAoWG1sRW50aXR5TWFwcGluZ3MpIHRoaXMueG1sUmVzb3VyY2UuZ2V0Um9vdE9iamVjdCgpOworCQlpZiAoeG1sRW50aXR5TWFwcGluZ3MgIT0gbnVsbCkgeworCQkJdGhpcy5lbnRpdHlNYXBwaW5ncyA9IHRoaXMuYnVpbGRFbnRpdHlNYXBwaW5ncyh4bWxFbnRpdHlNYXBwaW5ncyk7CisJCX0KKwl9CisKKwkKKwkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIE1hcHBpbmdGaWxlUmVmIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChNYXBwaW5nRmlsZVJlZikgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7CisJCXJldHVybiB0aGlzLnhtbFJlc291cmNlLmdldEZpbGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE1hcHBpbmdGaWxlUm9vdCBnZXRNYXBwaW5nRmlsZVJvb3QoKSB7CisJCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIEpwYVN0cnVjdHVyZU5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCQorCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCS8vIGlzbid0IGFjdHVhbGx5IGRpc3BsYXllZCwgc28gbmVlZHMgbm8gZGV0YWlscyBwYWdlCisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgeworCQlyZXR1cm4gdGhpcy54bWxSZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBNYXBwaW5nRmlsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJCisJcHVibGljIEpwYVhtbFJlc291cmNlIGdldFhtbFJlc291cmNlKCkgeworCQlyZXR1cm4gdGhpcy54bWxSZXNvdXJjZTsKKwl9CisJCisJcHVibGljIE1hcHBpbmdGaWxlUm9vdCBnZXRSb290KCkgeworCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKTsKKwl9CisJCisJcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7CisJCXJldHVybiAodGhpcy5lbnRpdHlNYXBwaW5ncyA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmVudGl0eU1hcHBpbmdzLmdldFBlcnNpc3RlbnRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOworCX0KKworCQorCS8vICoqKioqKioqKiogUGVyc2lzdGVudFR5cGVDb250YWluZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCQorCS8qKgorCSAqIEFsbCBvcm0ueG1sIG1hcHBpbmcgZmlsZXMgbXVzdCBiZSBhYmxlIHRvIGdlbmVyYXRlIGEgc3RhdGljIG1ldGFtb2RlbAorCSAqIGJlY2F1c2UgMS4wIG9ybS54bWwgZmlsZXMgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSAyLjAgcGVyc2lzdGVuY2UueG1sIGZpbGVzLgorCSAqLworCXB1YmxpYyBJdGVyYWJsZTw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGU+IGdldFBlcnNpc3RlbnRUeXBlcygpIHsKKwkJcmV0dXJuICh0aGlzLmVudGl0eU1hcHBpbmdzICE9IG51bGwpID8gdGhpcy5lbnRpdHlNYXBwaW5ncy5nZXRQZXJzaXN0ZW50VHlwZXMoKSA6IEVtcHR5SXRlcmFibGUuPEphdmFQZXJzaXN0ZW50VHlwZT5pbnN0YW5jZSgpOworCX0KKworCQorCS8vICoqKioqKioqKiogZW50aXR5IG1hcHBpbmdzICoqKioqKioqKioKKwkKKwlwdWJsaWMgRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7CisJCXJldHVybiB0aGlzLmVudGl0eU1hcHBpbmdzOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRFbnRpdHlNYXBwaW5ncyhFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgeworCQlFbnRpdHlNYXBwaW5ncyBvbGQgPSB0aGlzLmVudGl0eU1hcHBpbmdzOworCQl0aGlzLmVudGl0eU1hcHBpbmdzID0gZW50aXR5TWFwcGluZ3M7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFTlRJVFlfTUFQUElOR1NfUFJPUEVSVFksIG9sZCwgZW50aXR5TWFwcGluZ3MpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioKKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UpIHsJCQorCQlpZiAoIXJlc291cmNlLmdldENvbnRlbnRUeXBlKCkuaXNLaW5kT2YoSnB0Q29yZVBsdWdpbi5NQVBQSU5HX0ZJTEVfQ09OVEVOVF9UWVBFKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihyZXNvdXJjZSArICIgZG9lcyBub3QgaGF2ZSBtYXBwaW5nIGZpbGUgY29udGVudCB0eXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQl0aGlzLnhtbFJlc291cmNlID0gcmVzb3VyY2U7CisJCXRoaXMudXBkYXRlKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsJCQorCQlYbWxFbnRpdHlNYXBwaW5ncyBvbGRYbWxFbnRpdHlNYXBwaW5ncyA9IAorCQkJKHRoaXMuZW50aXR5TWFwcGluZ3MgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5lbnRpdHlNYXBwaW5ncy5nZXRYbWxFbnRpdHlNYXBwaW5ncygpOworCQlYbWxFbnRpdHlNYXBwaW5ncyBuZXdYbWxFbnRpdHlNYXBwaW5ncyA9IChYbWxFbnRpdHlNYXBwaW5ncykgdGhpcy54bWxSZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7CisKKwkJLy8gaWYgdGhlIG9sZCBhbmQgbmV3IHhtbCBlbnRpdHkgbWFwcGluZ3MgYXJlIGRpZmZlcmVudCBpbnN0YW5jZXMsCisJCS8vIHdlIHNjcmFwIHRoZSBvbGQgYW5kIHJlYnVpbGQuICB0aGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgcmVzb3VyY2UKKwkJLy8gbW9kZWwgZHJhc3RpY2FsbHkgY2hhbmdlcywgc3VjaCBhcyBhIGN2cyBjaGVja291dCBvciBhbiBlZGl0IHJldmVyc2lvbgorCQlpZiAob2xkWG1sRW50aXR5TWFwcGluZ3MgIT0gbmV3WG1sRW50aXR5TWFwcGluZ3MpIHsKKwkJCWlmICh0aGlzLmVudGl0eU1hcHBpbmdzICE9IG51bGwpIHsKKwkJCQl0aGlzLmdldEpwYUZpbGUodGhpcy54bWxSZXNvdXJjZS5nZXRGaWxlKCkpLnJlbW92ZVJvb3RTdHJ1Y3R1cmVOb2RlKHRoaXMueG1sUmVzb3VyY2UpOworCQkJCXRoaXMuZW50aXR5TWFwcGluZ3MuZGlzcG9zZSgpOworCQkJCXRoaXMuc2V0RW50aXR5TWFwcGluZ3MobnVsbCk7CisJCQl9CisJCX0KKwkJCisJCWlmIChuZXdYbWxFbnRpdHlNYXBwaW5ncyAhPSBudWxsKSB7CisJCQlpZiAodGhpcy5lbnRpdHlNYXBwaW5ncyAhPSBudWxsKSB7CisJCQkJdGhpcy5nZXRKcGFGaWxlKHRoaXMueG1sUmVzb3VyY2UuZ2V0RmlsZSgpKS5hZGRSb290U3RydWN0dXJlTm9kZSh0aGlzLnhtbFJlc291cmNlLCB0aGlzLmVudGl0eU1hcHBpbmdzKTsKKwkJCQl0aGlzLmVudGl0eU1hcHBpbmdzLnVwZGF0ZSgpOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLnNldEVudGl0eU1hcHBpbmdzKHRoaXMuYnVpbGRFbnRpdHlNYXBwaW5ncyhuZXdYbWxFbnRpdHlNYXBwaW5ncykpOworCQkJfQorCQl9CisJfQorCQorCXByb3RlY3RlZCBFbnRpdHlNYXBwaW5ncyBidWlsZEVudGl0eU1hcHBpbmdzKFhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzKSB7CisJCXJldHVybiBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZEVudGl0eU1hcHBpbmdzKHRoaXMsIHhtbEVudGl0eU1hcHBpbmdzKTsKKwl9CQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHBvc3RVcGRhdGUoKSB7CisJCXN1cGVyLnBvc3RVcGRhdGUoKTsKKwkJaWYgKHRoaXMuZW50aXR5TWFwcGluZ3MgIT0gbnVsbCkgeworCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy5wb3N0VXBkYXRlKCk7CisJCX0KKwl9CisJCisJCisJLy8gKioqKioqKioqKiB0ZXh0ICoqKioqKioqKioKKwkKKwlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7CisJCWlmICh0aGlzLmVudGl0eU1hcHBpbmdzLmNvbnRhaW5zT2Zmc2V0KHRleHRPZmZzZXQpKSB7CisJCQlyZXR1cm4gdGhpcy5lbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3R1cmVOb2RlKHRleHRPZmZzZXQpOworCQl9CisJCXJldHVybiB0aGlzOworCX0KKwkKKwkvLyBuZXZlciBhY3R1YWxseSBzZWxlY3RlZAorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gVGV4dFJhbmdlLkVtcHR5Lmluc3RhbmNlKCk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIFRleHRSYW5nZS5FbXB0eS5pbnN0YW5jZSgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJaWYgKHRoaXMuZW50aXR5TWFwcGluZ3MgIT0gbnVsbCkgeworCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl9CisJfQorCQorCQorCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKHRoaXMuZW50aXR5TWFwcGluZ3MgIT0gbnVsbCkgeworCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy5kaXNwb3NlKCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1YbWxEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtWG1sRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YjUyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtWG1sRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbERlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVudGl0eURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtWG1sRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtWG1sRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IEdlbmVyaWNPcm1YbWxEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybVhtbERlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEdlbmVyaWNPcm1YbWxEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpIHsKKwkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkoKTsKKwl9CisJCisJcHVibGljIEpwYVJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7CisJCXJldHVybiBKcHRDb3JlUGx1Z2luLk9STV9YTUxfMV8wX1JFU09VUkNFX1RZUEU7CisJfQorCQorCQorCS8vICoqKioqKioqKiogT1JNIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZ0RlZmluaXRpb25bXSBidWlsZE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCS8vIG9yZGVyIHNob3VsZCBub3QgbWF0dGVyIGhlcmUsIGJ1dCB3ZSdsbCB1c2UgdGhlIHNhbWUgb3JkZXIgYXMgZm9yIGphdmEgCisJCS8vIChAc2VlIHtAbGluayBHZW5lcmljSnBhUGxhdGZvcm1Qcm92aWRlcn0pCisJCXJldHVybiBuZXcgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uW10geworCQkJT3JtRW50aXR5RGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmluc3RhbmNlKCl9OworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIE9STSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgeworCQkvLyBvcmRlciBzaG91bGQgbm90IG1hdHRlciBoZXJlLCBidXQgd2UnbGwgdXNlIHRoZSBzYW1lIG9yZGVyIGFzIGZvciBqYXZhCisJCS8vIChAc2VlIHtAbGluayBHZW5lcmljSnBhUGxhdGZvcm1Qcm92aWRlcn0pCisJCXJldHVybiBuZXcgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7CisJCQlPcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1PbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlOdWxsT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDUyNTRkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEKQEAgLTAsMCArMSwyOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5DYXRhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKKworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cworCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKK3sKKwlwcm90ZWN0ZWQgZmluYWwgWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3M7CisJCisJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYWNjZXNzOworCisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDYXRhbG9nOworCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2c7CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNjaGVtYTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWE7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjYXNjYWRlUGVyc2lzdDsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBhcmVudCwgWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncyA9IHhtbEVudGl0eU1hcHBpbmdzOworCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyByZXNvdXJjZURlZmF1bHRzID0gdGhpcy5nZXRSZXNvdXJjZURlZmF1bHRzKCk7CisJCWlmIChyZXNvdXJjZURlZmF1bHRzICE9IG51bGwpIHsKKwkJCXRoaXMuYWNjZXNzID0gQWNjZXNzVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbChyZXNvdXJjZURlZmF1bHRzLmdldEFjY2VzcygpKTsKKwkJCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IHJlc291cmNlRGVmYXVsdHMuZ2V0Q2F0YWxvZygpOworCQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSByZXNvdXJjZURlZmF1bHRzLmdldFNjaGVtYSgpOworCQkJdGhpcy5jYXNjYWRlUGVyc2lzdCA9IHJlc291cmNlRGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpOworCQl9CisJCXRoaXMuZGVmYXVsdENhdGFsb2cgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0Q2F0YWxvZygpOworCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0U2NoZW1hKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHJlc291cmNlRXhpc3RzKCkgeworCQlyZXR1cm4gZ2V0UmVzb3VyY2VEZWZhdWx0cygpICE9IG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKKwlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgZ2V0UmVzb3VyY2VQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIHsKKwkJcmV0dXJuIGdldFBhcmVudCgpLmdldFJlc291cmNlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKKwl9CisJCisJcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGNyZWF0ZVJlc291cmNlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSB7CisJCXJldHVybiBnZXRQYXJlbnQoKS5jcmVhdGVSZXNvdXJjZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7CisJfQorCQorCS8vICoqKioqKioqKiogYWNjZXNzICoqKioqKioqKioKKworCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMuYWNjZXNzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIGFjY2VzcykgeworCQlBY2Nlc3NUeXBlIG9sZCA9IHRoaXMuYWNjZXNzOworCQl0aGlzLmFjY2VzcyA9IGFjY2VzczsKKwkJaWYgKGFjY2VzcyAhPSBvbGQpIHsKKwkJCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHJlc291cmNlRGVmYXVsdHMgPSB0aGlzLmdldFJlc291cmNlRGVmYXVsdHMoKTsKKwkJCWlmIChyZXNvdXJjZURlZmF1bHRzID09IG51bGwpIHsKKwkJCQlyZXNvdXJjZURlZmF1bHRzID0gdGhpcy5idWlsZFJlc291cmNlRGVmYXVsdHMoKTsKKwkJCX0KKwkJCXJlc291cmNlRGVmYXVsdHMuc2V0QWNjZXNzKEFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKGFjY2VzcykpOworCQkJdGhpcy5jaGVja1Jlc291cmNlRGVmYXVsdHMocmVzb3VyY2VEZWZhdWx0cyk7CisJCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUNDRVNTX1BST1BFUlRZLCBvbGQsIGFjY2Vzcyk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRBY2Nlc3NfKEFjY2Vzc1R5cGUgYWNjZXNzKSB7CisJCUFjY2Vzc1R5cGUgb2xkID0gdGhpcy5hY2Nlc3M7CisJCXRoaXMuYWNjZXNzID0gYWNjZXNzOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUNDRVNTX1BST1BFUlRZLCBvbGQsIGFjY2Vzcyk7CisJfQorCQorCisJLy8gKioqKioqKioqKiBzY2hlbWEgY29udGFpbmVyICoqKioqKioqKioKKworCS8qKgorCSAqIElmIHdlIGRvbid0IGhhdmUgYSBjYXRhbG9nIChpLmUuIHdlIGRvbid0IGV2ZW4gaGF2ZSBhIDxlbT5kZWZhdWx0PC9lbT4gY2F0YWxvZyksCisJICogdGhlbiB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9nczsgYW5kIHdlIG5lZWQgdG8KKwkgKiBnZXQgdGhlIHNjaGVtYSBkaXJlY3RseSBmcm9tIHRoZSBkYXRhYmFzZS4KKwkgKi8KKwlwdWJsaWMgU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyKCkgeworCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygpOworCQlyZXR1cm4gKGNhdGFsb2cgIT0gbnVsbCkgPyB0aGlzLmdldERiQ2F0YWxvZyhjYXRhbG9nKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRDYXRhbG9nICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDYXRhbG9nIDogdGhpcy5kZWZhdWx0Q2F0YWxvZzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZENhdGFsb2c7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOworCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBjYXRhbG9nOworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQob2xkLCBjYXRhbG9nKSkgeworCQkJWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcmVzb3VyY2VEZWZhdWx0cyA9IHRoaXMuZ2V0UmVzb3VyY2VEZWZhdWx0cygpOworCQkJaWYgKHJlc291cmNlRGVmYXVsdHMgPT0gbnVsbCkgeworCQkJCXJlc291cmNlRGVmYXVsdHMgPSB0aGlzLmJ1aWxkUmVzb3VyY2VEZWZhdWx0cygpOworCQkJfQorCQkJcmVzb3VyY2VEZWZhdWx0cy5zZXRDYXRhbG9nKGNhdGFsb2cpOworCQkJdGhpcy5jaGVja1Jlc291cmNlRGVmYXVsdHMocmVzb3VyY2VEZWZhdWx0cyk7CisJCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZ18oU3RyaW5nIGNhdGFsb2cpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKKwkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gY2F0YWxvZzsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgeworCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKKwkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IGNhdGFsb2c7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7CisJfQorCisJLyoqCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPgorCSAqIGNhdGFsb2cpLCB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgorCSAqLworCXB1YmxpYyBDYXRhbG9nIGdldERiQ2F0YWxvZygpIHsKKwkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2coKTsKKwkJcmV0dXJuIChjYXRhbG9nID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0RGJDYXRhbG9nKGNhdGFsb2cpOworCX0KKworCisJLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRTY2hlbWEgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFNjaGVtYSA6IHRoaXMuZGVmYXVsdFNjaGVtYTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NoZW1hOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFNjaGVtYTsKKwkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBzY2hlbWE7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChvbGQsIHNjaGVtYSkpIHsKKwkJCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHJlc291cmNlRGVmYXVsdHMgPSB0aGlzLmdldFJlc291cmNlRGVmYXVsdHMoKTsKKwkJCWlmIChyZXNvdXJjZURlZmF1bHRzID09IG51bGwpIHsKKwkJCQlyZXNvdXJjZURlZmF1bHRzID0gdGhpcy5idWlsZFJlc291cmNlRGVmYXVsdHMoKTsKKwkJCX0KKwkJCXJlc291cmNlRGVmYXVsdHMuc2V0U2NoZW1hKHNjaGVtYSk7CisJCQl0aGlzLmNoZWNrUmVzb3VyY2VEZWZhdWx0cyhyZXNvdXJjZURlZmF1bHRzKTsKKwkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hXyhTdHJpbmcgc2NoZW1hKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFNjaGVtYTsKKwkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBzY2hlbWE7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFNjaGVtYTsKKwkJdGhpcy5kZWZhdWx0U2NoZW1hID0gc2NoZW1hOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKKwl9CisKKwlwdWJsaWMgU2NoZW1hIGdldERiU2NoZW1hKCkgeworCQlTY2hlbWFDb250YWluZXIgZGJTY2hlbWFDb250YWluZXIgPSB0aGlzLmdldERiU2NoZW1hQ29udGFpbmVyKCk7CisJCXJldHVybiAoZGJTY2hlbWFDb250YWluZXIgPT0gbnVsbCkgPyBudWxsIDogZGJTY2hlbWFDb250YWluZXIuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcih0aGlzLmdldFNjaGVtYSgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogY2FzY2FkZVBlcnNpc3QgKioqKioqKioqKgorCisJcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpIHsKKwkJcmV0dXJuIHRoaXMuY2FzY2FkZVBlcnNpc3Q7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FzY2FkZVBlcnNpc3QoYm9vbGVhbiBjYXNjYWRlUGVyc2lzdCkgeworCQlib29sZWFuIG9sZCA9IHRoaXMuY2FzY2FkZVBlcnNpc3Q7CisJCXRoaXMuY2FzY2FkZVBlcnNpc3QgPSBjYXNjYWRlUGVyc2lzdDsKKwkJaWYgKGNhc2NhZGVQZXJzaXN0ICE9IG9sZCkgeworCQkJWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcmVzb3VyY2VEZWZhdWx0cyA9IHRoaXMuZ2V0UmVzb3VyY2VEZWZhdWx0cygpOworCQkJaWYgKHJlc291cmNlRGVmYXVsdHMgPT0gbnVsbCkgeworCQkJCXJlc291cmNlRGVmYXVsdHMgPSB0aGlzLmJ1aWxkUmVzb3VyY2VEZWZhdWx0cygpOworCQkJfQorCQkJcmVzb3VyY2VEZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdChjYXNjYWRlUGVyc2lzdCk7CisJCQl0aGlzLmNoZWNrUmVzb3VyY2VEZWZhdWx0cyhyZXNvdXJjZURlZmF1bHRzKTsKKwkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQVNDQURFX1BFUlNJU1RfUFJPUEVSVFksIG9sZCwgY2FzY2FkZVBlcnNpc3QpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0Q2FzY2FkZVBlcnNpc3RfKGJvb2xlYW4gY3ApIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLmNhc2NhZGVQZXJzaXN0OworCQl0aGlzLmNhc2NhZGVQZXJzaXN0ID0gY3A7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQVNDQURFX1BFUlNJU1RfUFJPUEVSVFksIG9sZCwgY3ApOworCX0KKwkKKworCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgorCisJLyoqCisJICogYnVpbGQgdGhlIHJlc291cmNlIGRlZmF1bHRzIGFuZCB0aGUgcmVzb3VyY2UgbWV0YWRhdGEgaWYgbmVjZXNzYXJ5CisJICovCisJcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGJ1aWxkUmVzb3VyY2VEZWZhdWx0cygpIHsKKwkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcmVzb3VyY2VNZXRhZGF0YSA9IGdldFJlc291cmNlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKKwkJaWYgKHJlc291cmNlTWV0YWRhdGEgPT0gbnVsbCkgeworCQkJcmVzb3VyY2VNZXRhZGF0YSA9IGNyZWF0ZVJlc291cmNlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKKwkJCXRoaXMueG1sRW50aXR5TWFwcGluZ3Muc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocmVzb3VyY2VNZXRhZGF0YSk7CisJCX0KKwkJWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcmVzb3VyY2VEZWZhdWx0cyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisJCXJlc291cmNlTWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocmVzb3VyY2VEZWZhdWx0cyk7CisJCXJldHVybiByZXNvdXJjZURlZmF1bHRzOworCX0KKworCS8qKgorCSAqIGNsZWFyIHRoZSByZXNvdXJjZSBkZWZhdWx0cyBhbmQgdGhlIHJlc291cmNlIG1ldGFkYXRhIGlmIGFwcHJvcHJpYXRlCisJICovCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tSZXNvdXJjZURlZmF1bHRzKFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHJlc291cmNlRGVmYXVsdHMpIHsKKwkJaWYgKHJlc291cmNlRGVmYXVsdHMuaXNVbnNldCgpKSB7CisJCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBtZXRhZGF0YSA9IHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKKwkJCW1ldGFkYXRhLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKG51bGwpOworCQkJaWYgKG1ldGFkYXRhLmlzVW5zZXQoKSkgeworCQkJCXRoaXMueG1sRW50aXR5TWFwcGluZ3Muc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEobnVsbCk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHJlc291cmNlRGVmYXVsdHMgPSB0aGlzLmdldFJlc291cmNlRGVmYXVsdHMoKTsKKwkJaWYgKHJlc291cmNlRGVmYXVsdHMgPT0gbnVsbCkgeworCQkJdGhpcy5zZXRBY2Nlc3NfKG51bGwpOworCQkJdGhpcy5zZXRTcGVjaWZpZWRDYXRhbG9nXyhudWxsKTsKKwkJCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hXyhudWxsKTsKKwkJCXRoaXMuc2V0Q2FzY2FkZVBlcnNpc3RfKGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuc2V0QWNjZXNzXyhBY2Nlc3NUeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKHJlc291cmNlRGVmYXVsdHMuZ2V0QWNjZXNzKCkpKTsKKwkJCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18ocmVzb3VyY2VEZWZhdWx0cy5nZXRDYXRhbG9nKCkpOworCQkJdGhpcy5zZXRTcGVjaWZpZWRTY2hlbWFfKHJlc291cmNlRGVmYXVsdHMuZ2V0U2NoZW1hKCkpOworCQkJdGhpcy5zZXRDYXNjYWRlUGVyc2lzdF8ocmVzb3VyY2VEZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOworCQl9CisJCXRoaXMuc2V0RGVmYXVsdENhdGFsb2codGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CisJCXRoaXMuc2V0RGVmYXVsdFNjaGVtYSh0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0U2NoZW1hKCkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcmVzb3VyY2VEZWZhdWx0cyA9IHRoaXMuZ2V0UmVzb3VyY2VEZWZhdWx0cygpOworCQlyZXR1cm4gKHJlc291cmNlRGVmYXVsdHMgIT0gbnVsbCkgPyByZXNvdXJjZURlZmF1bHRzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSA6IHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCX0KKworCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRSZXNvdXJjZURlZmF1bHRzKCkgeworCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBtZXRhZGF0YSA9IGdldFJlc291cmNlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKKwkJcmV0dXJuIChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2YyZTFiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5FbWZUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCit7CisJcHJvdGVjdGVkIGJvb2xlYW4geG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGU7CisKKwlwcm90ZWN0ZWQgZmluYWwgT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7CisKKwlwcm90ZWN0ZWQgZmluYWwgWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3M7CisKKwlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVudGl0eU1hcHBpbmdzIHBhcmVudCwgWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2UpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncyA9IHJlc291cmNlOworCQl0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlID0gdGhpcy5nZXRSZXNvdXJjZVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKHRoaXMsIHRoaXMueG1sRW50aXR5TWFwcGluZ3MpOworCX0KKworCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBjcmVhdGVSZXNvdXJjZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkgeworCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAorCQkJZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpLCAKKwkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCksIAorCQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuY2xhc3MpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy54bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShib29sZWFuIG5ld1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKSB7CisJCWJvb2xlYW4gb2xkWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgPSB0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlOworCQl0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlID0gbmV3WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGU7CisJCWlmIChvbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSAhPSBuZXdYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSkgeworCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpICE9IG51bGwpIHsKKwkJCQl0aGlzLmdldFJlc291cmNlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShuZXdYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSk7CQkJCQkJCisJCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzVW5zZXQoKSkgeworCQkJCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKG51bGwpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKG5ld1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKSB7CisJCQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShjcmVhdGVSZXNvdXJjZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQkJCXRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKG5ld1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKTsJCQorCQkJfQorCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFksIG9sZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlLCBuZXdYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlXyhib29sZWFuIG5ld1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKSB7CisJCWJvb2xlYW4gb2xkWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgPSB0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlOworCQl0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlID0gbmV3WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFksIG9sZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlLCBuZXdYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSk7CisJfQorCisJcHVibGljIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgeworCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl0aGlzLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlXyh0aGlzLmdldFJlc291cmNlWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMudXBkYXRlKCk7CisJfQorCQorCQorCXByb3RlY3RlZCBib29sZWFuIGdldFJlc291cmNlWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSB7CisJCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHJlc291cmNlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBnZXRSZXNvdXJjZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7CisJCXJldHVybiByZXNvdXJjZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhICE9IG51bGwgPyByZXNvdXJjZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSA6IGZhbHNlOworCX0KKwkKKwlwdWJsaWMgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgZ2V0UmVzb3VyY2VQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIHsKKwkJcmV0dXJuIHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKKwl9CisJCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJaWYgKGdldFJlc291cmNlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gZ2V0UmVzb3VyY2VQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwkJfQorCQlyZXR1cm4gdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vVW5zdXBwb3J0ZWRPcm1BdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9VbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGM4ODI5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vVW5zdXBwb3J0ZWRPcm1BdHRyaWJ1dGVNYXBwaW5nLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nOworCisvKioKKyAqIFRoaXMgd2lsbCBiZSB1c2VkIGluIGNhc2VzIHdoZXJlIHRoZSBqYXZhIHN1cHBvcnQgYXR0cmlidXRlIG1hcHBpbmcgdHlwZXMKKyAqIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiB0aGUgb3JtLnhtbCBmaWxlLiAgRm9yIGV4YW1wbGUsCisgKiBFY2xpcHNlTGluayBzdXBwb3J0cyB2YXJpYWJsZSAxLTEgbWFwcGluZ3MsIGJ1dCB0aGUgZ2VuZXJpYyBvcm0ueG1sIGZpbGUgZG9lcyBub3QuCisgKi8KK3B1YmxpYyBjbGFzcyBVbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmcgCisJZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc+Cit7CisKKwlwdWJsaWMgVW5zdXBwb3J0ZWRPcm1BdHRyaWJ1dGVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxOdWxsQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKworCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7CisJCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKHRoaXMpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQkvL3RoaXMgZW5kcyB1cCByZXR1cm5pbmcgdGhlIGphdmEgYXR0cmlidXRlIG1hcHBpbmcga2V5CisJCXJldHVybiB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFRvUmVzb3VyY2VNb2RlbChBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqICAKKworCUBPdmVycmlkZQorCXB1YmxpYyBNZXRhbW9kZWxGaWVsZCBnZXRNZXRhbW9kZWxGaWVsZCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNDbGFzc1JlZi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljQ2xhc3NSZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGEzNzRjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljQ2xhc3NSZWYuamF2YQpAQCAtMCwwICsxLDI5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VTdHJ1Y3R1cmVOb2RlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworLyoqCisgKiBDb250ZXh0IHBlcnNpc3RlbmNlLnhtbCBjbGFzcyByZWZlcmVuY2UKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNDbGFzc1JlZgorCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBDbGFzc1JlZgoreworCS8vIHRoaXMgaXMgbnVsbCBmb3IgYW4gImltcGxpZWQiIGNsYXNzIHJlZgorCXByb3RlY3RlZCBYbWxKYXZhQ2xhc3NSZWYgeG1sSmF2YUNsYXNzUmVmOworCisJcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWU7CisKKwlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZTsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJLyoqCisJICogQ29uc3RydWN0IGFuICJzcGVjaWZpZWQiIGNsYXNzIHJlZjsgaS5lLiBhIGNsYXNzIHJlZiB3aXRoCisJICogYW4gZXhwbGljaXQgZW50cnkgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbC4KKwkgKi8KKwlwdWJsaWMgR2VuZXJpY0NsYXNzUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbEphdmFDbGFzc1JlZiBjbGFzc1JlZikgeworCQl0aGlzKHBhcmVudCwgY2xhc3NSZWYsIGNsYXNzUmVmLmdldEphdmFDbGFzcygpKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYW4gImltcGxpZWQiIGNsYXNzIHJlZjsgaS5lLiBhIGNsYXNzIHJlZiB3aXRob3V0CisJICogYW4gZXhwbGljaXQgZW50cnkgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbC4KKwkgKi8KKwlwdWJsaWMgR2VuZXJpY0NsYXNzUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFN0cmluZyBjbGFzc05hbWUpIHsKKwkJdGhpcyhwYXJlbnQsIG51bGwsIGNsYXNzTmFtZSk7CisJfQorCisJcHJvdGVjdGVkIEdlbmVyaWNDbGFzc1JlZihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBYbWxKYXZhQ2xhc3NSZWYgY2xhc3NSZWYsIFN0cmluZyBjbGFzc05hbWUpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5pbml0aWFsaXplKGNsYXNzUmVmLCBjbGFzc05hbWUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sSmF2YUNsYXNzUmVmIGNsYXNzUmVmLCBTdHJpbmcgdHlwZU5hbWUpIHsKKwkJdGhpcy54bWxKYXZhQ2xhc3NSZWYgPSBjbGFzc1JlZjsKKwkJdGhpcy5jbGFzc05hbWUgPSB0eXBlTmFtZTsKKwkJdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgPSB0aGlzLmJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFBlcnNpc3RlbmNlVW5pdCBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0KSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogSnBhU3RydWN0dXJlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gUGVyc2lzdGVuY2VTdHJ1Y3R1cmVOb2Rlcy5DTEFTU19SRUZfSUQ7CisJfQorCQorCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLmlzVmlydHVhbCgpID8gbnVsbCA6IHRoaXMueG1sSmF2YUNsYXNzUmVmLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOworCX0KKworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmICh0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7CisJCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZS5kaXNwb3NlKCk7CisJCX0KKwl9CisKKworCS8vICoqKioqKioqKiogUGVyc2lzdGVudFR5cGUuT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0T3ZlcnJpZGVQZXJzaXN0ZW50VHlwZUFjY2VzcygpIHsKKwkJLy8gbm8gYWNjZXNzIHR5cGUgYXQgdGhpcyBsZXZlbCBvdmVycmlkZXMgYW55IGxvY2FsIGFjY2VzcyB0eXBlIHNwZWNpZmljYXRpb24KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdFBlcnNpc3RlbnRUeXBlQWNjZXNzKCkgeworCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0QWNjZXNzKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgorCisJcHVibGljIGJvb2xlYW4gaXNGb3IoU3RyaW5nIHR5cGVOYW1lKSB7CisJCXJldHVybiAodGhpcy5jbGFzc05hbWUgIT0gbnVsbCkgJiYgdGhpcy5jbGFzc05hbWUuZXF1YWxzKHR5cGVOYW1lKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7CisJCXJldHVybiB0aGlzLnhtbEphdmFDbGFzc1JlZiA9PSBudWxsOworCX0KKworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KSB7CisJCXJldHVybiB0aGlzLmlzTm90VmlydHVhbCgpICYmIHRoaXMueG1sSmF2YUNsYXNzUmVmLmNvbnRhaW5zT2Zmc2V0KHRleHRPZmZzZXQpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzTm90VmlydHVhbCgpIHsKKwkJcmV0dXJuICEgdGhpcy5pc1ZpcnR1YWwoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogY2xhc3MgbmFtZSAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmNsYXNzTmFtZTsKKwkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisJCXRoaXMueG1sSmF2YUNsYXNzUmVmLnNldEphdmFDbGFzcyhjbGFzc05hbWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkLCBjbGFzc05hbWUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZV8oU3RyaW5nIG5ld0NsYXNzTmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5jbGFzc05hbWU7CisJCXRoaXMuY2xhc3NOYW1lID0gbmV3Q2xhc3NOYW1lOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkLCBuZXdDbGFzc05hbWUpOworCX0KKworCisJLy8gKioqKioqKioqKiBqYXZhIHBlcnNpc3RlbnQgdHlwZSAqKioqKioqKioqCisKKwlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldEphdmFQZXJzaXN0ZW50VHlwZShKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlKSB7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBvbGQgPSB0aGlzLmphdmFQZXJzaXN0ZW50VHlwZTsKKwkJdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgPSBqYXZhUGVyc2lzdGVudFR5cGU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChKQVZBX1BFUlNJU1RFTlRfVFlQRV9QUk9QRVJUWSwgb2xkLCBqYXZhUGVyc2lzdGVudFR5cGUpOworCX0KKworCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoKSB7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQgPSB0aGlzLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7CisJCXJldHVybiAoanJwdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKGpycHQpOworCX0KKworCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgeworCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUodGhpcywganJwdCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlSmF2YVBlcnNpc3RlbnRUeXBlKCkgeworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0gdGhpcy5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpOworCQlpZiAoanJwdCA9PSBudWxsKSB7CisJCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgeworCQkJCXRoaXMuamF2YVBlcnNpc3RlbnRUeXBlLmRpc3Bvc2UoKTsKKwkJCQl0aGlzLnNldEphdmFQZXJzaXN0ZW50VHlwZShudWxsKTsKKwkJCX0KKwkJfSBlbHNlIHsgCisJCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgeworCQkJCXRoaXMuc2V0SmF2YVBlcnNpc3RlbnRUeXBlKHRoaXMuYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoanJwdCkpOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZS51cGRhdGUoanJwdCk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKSB7CisJCXJldHVybiAodGhpcy5jbGFzc05hbWUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUodGhpcy5jbGFzc05hbWUucmVwbGFjZSgnJCcsICcuJykpOworCX0KKworCisJLy8gKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqCisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sSmF2YUNsYXNzUmVmIGNsYXNzUmVmKSB7CisJCXRoaXMudXBkYXRlKGNsYXNzUmVmLCBjbGFzc1JlZi5nZXRKYXZhQ2xhc3MoKSk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKFN0cmluZyB0eXBlTmFtZSkgeworCQl0aGlzLnVwZGF0ZShudWxsLCB0eXBlTmFtZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlKFhtbEphdmFDbGFzc1JlZiBjbGFzc1JlZiwgU3RyaW5nIHR5cGVOYW1lKSB7CisJCXRoaXMueG1sSmF2YUNsYXNzUmVmID0gY2xhc3NSZWY7CisJCXRoaXMuc2V0Q2xhc3NOYW1lXyh0eXBlTmFtZSk7CisJCXRoaXMudXBkYXRlSmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcG9zdFVwZGF0ZSgpIHsKKwkJc3VwZXIucG9zdFVwZGF0ZSgpOworCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgeworCQkJdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUucG9zdFVwZGF0ZSgpOworCQl9CisJfQorCQorCS8vICoqKioqKioqKiogWG1sQ29udGV4dE5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5pc1ZpcnR1YWwoKSA/IG51bGwgOiB0aGlzLnhtbEphdmFDbGFzc1JlZi5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCisJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuY2xhc3NOYW1lKSkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9DTEFTUywKKwkJCQkJdGhpcywKKwkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKKwkJCQkpCisJCQkpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlID09IG51bGwpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfQ0xBU1MsCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5jbGFzc05hbWV9LCAKKwkJCQkJdGhpcywgCisJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCisJCQkJKQorCQkJKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIDE5MDA2MiB2YWxpZGF0ZSBKYXZhIGNsYXNzIG9ubHkgaWYgdGhpcyBpcyB0aGUgb25seSByZWZlcmVuY2UgdG8gaXQKKwkJYm9vbGVhbiB2YWxpZGF0ZUphdmFQZXJzaXN0ZW50VHlwZSA9IHRydWU7CisJCWZvciAoSXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IHN0cmVhbSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkubWFwcGluZ0ZpbGVSZWZzQ29udGFpbmluZyh0aGlzLmNsYXNzTmFtZSk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJdmFsaWRhdGVKYXZhUGVyc2lzdGVudFR5cGUgPSBmYWxzZTsKKwkJCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gc3RyZWFtLm5leHQoKTsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9SRURVTkRBTlRfQ0xBU1MsCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5jbGFzc05hbWUsIG1hcHBpbmdGaWxlUmVmLmdldEZpbGVOYW1lKCl9LAorCQkJCQl0aGlzLAorCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQorCQkJCSkKKwkJCSk7CisJCX0KKworCQlpZiAodmFsaWRhdGVKYXZhUGVyc2lzdGVudFR5cGUpIHsKKwkJCXRoaXMudmFsaWRhdGVKYXZhUGVyc2lzdGVudFR5cGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSmF2YVBlcnNpc3RlbnRUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJdHJ5IHsKKwkJCXRoaXMuamF2YVBlcnNpc3RlbnRUeXBlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCQlKcHRDb3JlUGx1Z2luLmxvZyh0KTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMuY2xhc3NOYW1lKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY0phckZpbGVSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY0phckZpbGVSZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGIzM2U3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljSmFyRmlsZVJlZi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdEphckZpbGVSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZjsKKworLyoqCisgKiBDb250ZXh0IEpBUiBmaWxlIHJlZmVyZW5jZSAoZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdCkKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNKYXJGaWxlUmVmIAorCWV4dGVuZHMgQWJzdHJhY3RKYXJGaWxlUmVmCit7CisJcHVibGljIEdlbmVyaWNKYXJGaWxlUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbEphckZpbGVSZWYgeG1sSmFyRmlsZVJlZikgeworCQlzdXBlcihwYXJlbnQsIHhtbEphckZpbGVSZWYpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljTWFwcGluZ0ZpbGVSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY01hcHBpbmdGaWxlUmVmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3YWU5MQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY01hcHBpbmdGaWxlUmVmLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdE1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY01hcHBpbmdGaWxlUmVmCisJZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdGaWxlUmVmCit7CisJcHJvdGVjdGVkIFhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmOworCisKKwkvLyAqKioqKioqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlwdWJsaWMgR2VuZXJpY01hcHBpbmdGaWxlUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmKSB7CisJCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZ0ZpbGVSZWYuZ2V0RmlsZU5hbWUoKSk7CisJCXRoaXMueG1sTWFwcGluZ0ZpbGVSZWYgPSB4bWxNYXBwaW5nRmlsZVJlZjsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBmaWxlIG5hbWUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBuZXdGaWxlTmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5maWxlTmFtZTsKKwkJdGhpcy5maWxlTmFtZSA9IG5ld0ZpbGVOYW1lOworCQl0aGlzLnhtbE1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKG5ld0ZpbGVOYW1lKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZJTEVfTkFNRV9QUk9QRVJUWSwgb2xkLCBuZXdGaWxlTmFtZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0RmlsZU5hbWVfKFN0cmluZyBuZXdGaWxlTmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5maWxlTmFtZTsKKwkJdGhpcy5maWxlTmFtZSA9IG5ld0ZpbGVOYW1lOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRklMRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld0ZpbGVOYW1lKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBNYXBwaW5nRmlsZVJlZiBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZikgeworCQl0aGlzLnhtbE1hcHBpbmdGaWxlUmVmID0gbWFwcGluZ0ZpbGVSZWY7CisJCXRoaXMuc2V0RmlsZU5hbWVfKHRoaXMuZ2V0UmVzb3VyY2VGaWxlTmFtZSgpKTsKKwkJc3VwZXIudXBkYXRlKCk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VGaWxlTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMueG1sTWFwcGluZ0ZpbGVSZWYuZ2V0RmlsZU5hbWUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNJbXBsaWVkKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KSB7CisJCXJldHVybiB0aGlzLnhtbE1hcHBpbmdGaWxlUmVmLmNvbnRhaW5zT2Zmc2V0KHRleHRPZmZzZXQpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIEpwYVN0cnVjdHVyZU5vZGUgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnhtbE1hcHBpbmdGaWxlUmVmLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnhtbE1hcHBpbmdGaWxlUmVmLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTU2OTM3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2UuamF2YQpAQCAtMCwwICsxLDI2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2UKKwlleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgUGVyc2lzdGVuY2UKK3sJCisJcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlOworCQorCS8vIHRoZSBpbXBsZW1lbnRhdGlvbiBoZXJlIGlzIGEgc2luZ2xlIHBlcnNpc3RlbmNlIHVuaXQsIGFsdGhvdWdoIHRoZSBBUEkKKwkvLyBpcyBmb3IgYSBsaXN0LiAgd2Ugd2lsbCB3YW50IHRvIHN1cHBvcnQgbXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdHMgc29vbi4KKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdDsKKworCXB1YmxpYyBHZW5lcmljUGVyc2lzdGVuY2UoUGVyc2lzdGVuY2VYbWwgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLnhtbFBlcnNpc3RlbmNlID0geG1sUGVyc2lzdGVuY2U7CisJCXRoaXMuaW5pdGlhbGl6ZVBlcnNpc3RlbmNlVW5pdHMoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOQ0VfSUQ7CisJfQorCQorCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZSBnZXRYbWxQZXJzaXN0ZW5jZSgpIHsKKwkJcmV0dXJuIHRoaXMueG1sUGVyc2lzdGVuY2U7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbCBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoUGVyc2lzdGVuY2VYbWwpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKKwkvLyAqKioqKioqKioqKioqKioqIHBlcnNpc3RlbmNlIHVuaXRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIExpc3RJdGVyYXRvcjxQZXJzaXN0ZW5jZVVuaXQ+IHBlcnNpc3RlbmNlVW5pdHMoKSB7CisJCXJldHVybiAodGhpcy5wZXJzaXN0ZW5jZVVuaXQgPT0gbnVsbCkgPyBFbXB0eUxpc3RJdGVyYXRvci48UGVyc2lzdGVuY2VVbml0Pmluc3RhbmNlKCkgOiB0aGlzLnBlcnNpc3RlbmNlVW5pdHNfKCk7CisJfQorCQorCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBwZXJzaXN0ZW5jZVVuaXRzXygpIHsKKwkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4odGhpcy5wZXJzaXN0ZW5jZVVuaXQpOworCX0KKwkKKwlwdWJsaWMgaW50IHBlcnNpc3RlbmNlVW5pdHNTaXplKCkgeworCQlyZXR1cm4gKHRoaXMucGVyc2lzdGVuY2VVbml0ID09IG51bGwpID8gMCA6IDE7CisJfQorCQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgYWRkUGVyc2lzdGVuY2VVbml0KCkgeworCQlyZXR1cm4gYWRkUGVyc2lzdGVuY2VVbml0KHBlcnNpc3RlbmNlVW5pdHNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGFkZFBlcnNpc3RlbmNlVW5pdChpbnQgaW5kZXgpIHsKKwkJaWYgKGluZGV4ID4gMCB8fCB0aGlzLnBlcnNpc3RlbmNlVW5pdCAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdHMuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQgPSBidWlsZFBlcnNpc3RlbmNlVW5pdCh4bWxQZXJzaXN0ZW5jZVVuaXQpOworCQl0aGlzLnhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5hZGQoeG1sUGVyc2lzdGVuY2VVbml0KTsKKwkJZmlyZUl0ZW1BZGRlZChQRVJTSVNURU5DRV9VTklUU19MSVNULCBpbmRleCwgdGhpcy5wZXJzaXN0ZW5jZVVuaXQpOworCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXQ7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZVBlcnNpc3RlbmNlVW5pdChQZXJzaXN0ZW5jZVVuaXQgcHUpIHsKKwkJaWYgKHB1ICE9IHRoaXMucGVyc2lzdGVuY2VVbml0KSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHBlcnNpc3RlbmNlIHVuaXQ6ICIgKyBwdSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZW1vdmVQZXJzaXN0ZW5jZVVuaXQoMCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZVBlcnNpc3RlbmNlVW5pdChpbnQgaW5kZXgpIHsKKwkJaWYgKGluZGV4ID4gMCB8fCB0aGlzLnBlcnNpc3RlbmNlVW5pdCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiaW5kZXg6ICIgKyBpbmRleCk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlQZXJzaXN0ZW5jZVVuaXQgb2xkUGVyc2lzdGVuY2VVbml0ID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXQ7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0LmRpc3Bvc2UoKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQgPSBudWxsOworCQl0aGlzLnhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5yZW1vdmUoaW5kZXgpOworCQlmaXJlSXRlbVJlbW92ZWQoUEVSU0lTVEVOQ0VfVU5JVFNfTElTVCwgaW5kZXgsIG9sZFBlcnNpc3RlbmNlVW5pdCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFBlcnNpc3RlbmNlVW5pdF8oUGVyc2lzdGVuY2VVbml0IG5ld1BlcnNpc3RlbmNlVW5pdCkgeworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCA9IG5ld1BlcnNpc3RlbmNlVW5pdDsKKwkJZmlyZUl0ZW1BZGRlZChQRVJTSVNURU5DRV9VTklUU19MSVNULCAwLCB0aGlzLnBlcnNpc3RlbmNlVW5pdCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVBlcnNpc3RlbmNlVW5pdF8oUGVyc2lzdGVuY2VVbml0IG9sZFBlcnNpc3RlbmNlVW5pdCkgeworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdC5kaXNwb3NlKCk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0ID0gbnVsbDsKKwkJZmlyZUl0ZW1SZW1vdmVkKFBFUlNJU1RFTkNFX1VOSVRTX0xJU1QsIDAsIG9sZFBlcnNpc3RlbmNlVW5pdCk7CisJfQorCQorCS8vICoqKioqKioqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplTWV0YW1vZGVsKCkgeworCQlmb3IgKEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4gc3RyZWFtID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXRzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJc3RyZWFtLm5leHQoKS5zeW5jaHJvbml6ZU1ldGFtb2RlbCgpOworCQl9CisJfQorCisJLy8gKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQZXJzaXN0ZW5jZVVuaXRzKCkgeworCQkvLyBvbmx5IGFkZGluZyBvbmUgaGVyZSwgdW50aWwgd2Ugc3VwcG9ydCBtdWx0aXBsZSBwZXJzaXN0ZW5jZSB1bml0cworCQlpZiAodGhpcy54bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuc2l6ZSgpID4gMCkgeworCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQgPSBidWlsZFBlcnNpc3RlbmNlVW5pdCh0aGlzLnhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5nZXQoMCkpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZShYbWxQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSkgeworCQl0aGlzLnhtbFBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2U7CisJCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBudWxsOworCQlpZiAocGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnNpemUoKSA+IDApIHsKKwkJCXhtbFBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5nZXQoMCk7CisJCX0KKwkJCQkKKwkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0ICE9IG51bGwpIHsKKwkJCWlmICh4bWxQZXJzaXN0ZW5jZVVuaXQgIT0gbnVsbCkgeworCQkJCXRoaXMucGVyc2lzdGVuY2VVbml0LnVwZGF0ZSh4bWxQZXJzaXN0ZW5jZVVuaXQpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlUGVyc2lzdGVuY2VVbml0Xyh0aGlzLnBlcnNpc3RlbmNlVW5pdCk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoeG1sUGVyc2lzdGVuY2VVbml0ICE9IG51bGwpIHsKKwkJCQlhZGRQZXJzaXN0ZW5jZVVuaXRfKGJ1aWxkUGVyc2lzdGVuY2VVbml0KHhtbFBlcnNpc3RlbmNlVW5pdCkpOworCQkJfQorCQl9CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHBvc3RVcGRhdGUoKSB7CisJCXN1cGVyLnBvc3RVcGRhdGUoKTsKKwkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0ICE9IG51bGwpIHsKKwkJCXRoaXMucGVyc2lzdGVuY2VVbml0LnBvc3RVcGRhdGUoKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGJ1aWxkUGVyc2lzdGVuY2VVbml0KFhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRQZXJzaXN0ZW5jZVVuaXQodGhpcywgeG1sUGVyc2lzdGVuY2VVbml0KTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vIFBlcnNpc3RlbmNlVW5pdCBpbiB0aGlzIGNvbnRleHQiKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7CisJCWZvciAoUGVyc2lzdGVuY2VVbml0IHB1IDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHBlcnNpc3RlbmNlVW5pdHMoKSkpIHsKKwkJCWlmIChwdS5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KSkgeworCQkJCXJldHVybiBwdS5nZXRTdHJ1Y3R1cmVOb2RlKHRleHRPZmZzZXQpOworCQkJfQorCQl9CisJCXJldHVybiB0aGlzOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCkgeworCQlyZXR1cm4gKHRoaXMueG1sUGVyc2lzdGVuY2UgPT0gbnVsbCkgPyBmYWxzZSA6IHRoaXMueG1sUGVyc2lzdGVuY2UuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy54bWxQZXJzaXN0ZW5jZS5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy54bWxQZXJzaXN0ZW5jZS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJZm9yIChQZXJzaXN0ZW5jZVVuaXQgcHUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUocGVyc2lzdGVuY2VVbml0cygpKSkgeworCQkJcHUuZGlzcG9zZSgpOworCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl2YWxpZGF0ZVZlcnNpb24obWVzc2FnZXMpOworCQl0aGlzLmNoZWNrRm9yTXVsdGlwbGVQZXJzaXN0ZW5jZVVuaXRzKG1lc3NhZ2VzKTsKKwkJdGhpcy52YWxpZGF0ZVBlcnNpc3RlbmNlVW5pdChtZXNzYWdlcywgcmVwb3J0ZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVZlcnNpb24oTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKKwkJaWYgKCEgbGF0ZXN0RG9jdW1lbnRWZXJzaW9uKCkuZXF1YWxzKHRoaXMueG1sUGVyc2lzdGVuY2UuZ2V0VmVyc2lvbigpKSkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJCUlNZXNzYWdlLkxPV19TRVZFUklUWSwKKwkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5YTUxfVkVSU0lPTl9OT1RfTEFURVNULAorCQkJCQkJdGhpcywKKwkJCQkJCXRoaXMueG1sUGVyc2lzdGVuY2UuZ2V0VmVyc2lvblRleHRSYW5nZSgpKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBsYXRlc3REb2N1bWVudFZlcnNpb24oKSB7CisJCXJldHVybiBnZXRKcGFQbGF0Zm9ybSgpLmdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoCisJCQkJSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKS5nZXRWZXJzaW9uKCk7CisJfQorCQorCS8qKgorCSAqIGV4dHJhbmVvdXMgcGVyc2lzdGVuY2UgdW5pdHMgY2FuIGJlCisJICogYWNjZXNzZWQgdGhyb3VnaCB0aGUgWG1sUGVyc2lzdGVuY2UgcmVzb3VyY2Ugb2JqZWN0CisJICovCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JNdWx0aXBsZVBlcnNpc3RlbmNlVW5pdHMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKKwkJaWYgKHRoaXMueG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnNpemUoKSA+IDEpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfTVVMVElQTEVfUEVSU0lTVEVOQ0VfVU5JVFMsCisJCQkJCXRoaXMsIAorCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQorCQkJCSkKKwkJCSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQZXJzaXN0ZW5jZVVuaXQoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXQgPT0gbnVsbCkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfTk9fUEVSU0lTVEVOQ0VfVU5JVCwKKwkJCQkJdGhpcywgCisJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCisJCQkJKQorCQkJKTsKKwkJCXJldHVybjsKKwkJfQorCQl0aGlzLnBlcnNpc3RlbmNlVW5pdC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VVbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0ZDQ2YwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdC5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7CisKKy8qKgorICogZ2VuZXJpYyBwZXJzaXN0ZW5jZS11bml0CisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2VVbml0CisJZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdAoreworCXB1YmxpYyBHZW5lcmljUGVyc2lzdGVuY2VVbml0KFBlcnNpc3RlbmNlIHBhcmVudCwgWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCkgeworCQlzdXBlcihwYXJlbnQsIHhtbFBlcnNpc3RlbmNlVW5pdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VVbml0UHJvcGVydHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdFByb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmNGFhOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdFByb3BlcnR5LmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBwcm9wZXJ0eS4KKyAqIE5vdGlmaWVzIHRoZSBwZXJzaXN0ZW5jZSB1bml0IG9mIGFueSBjaGFuZ2VzIHRvIHRoZSBwcm9wZXJ0eS4KKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eQorCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkKK3sKKwlwcm90ZWN0ZWQgZmluYWwgWG1sUHJvcGVydHkgeG1sUHJvcGVydHk7CisJcHJvdGVjdGVkIFN0cmluZyBuYW1lOworCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7CisKKworCXB1YmxpYyBHZW5lcmljUGVyc2lzdGVuY2VVbml0UHJvcGVydHkoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sUHJvcGVydHkgeG1sUHJvcGVydHkpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy54bWxQcm9wZXJ0eSA9IHhtbFByb3BlcnR5OworCQl0aGlzLm5hbWUgPSB4bWxQcm9wZXJ0eS5nZXROYW1lKCk7CisJCXRoaXMudmFsdWUgPSB4bWxQcm9wZXJ0eS5nZXRWYWx1ZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCisJcHVibGljIFhtbFByb3BlcnR5IGdldFhtbFByb3BlcnR5KCkgeworCQlyZXR1cm4gdGhpcy54bWxQcm9wZXJ0eTsKKwl9CisJCisJLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQob2xkLCBuYW1lKSkgeworCQkJdGhpcy54bWxQcm9wZXJ0eS5zZXROYW1lKG5hbWUpOworCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CisJCQlnZXRQYXJlbnQoKS5wcm9wZXJ0eU5hbWVDaGFuZ2VkKG9sZCwgdGhpcy5uYW1lLCB0aGlzLnZhbHVlKTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiB2YWx1ZSAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChvbGQsIHZhbHVlKSkgeworCQkJdGhpcy54bWxQcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7CisJCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOworCQkJZ2V0UGFyZW50KCkucHJvcGVydHlWYWx1ZUNoYW5nZWQodGhpcy5uYW1lLCB2YWx1ZSk7CisJCX0KKwl9CisKKworCS8vICoqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKgorCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl0aGlzLnNldE5hbWUodGhpcy54bWxQcm9wZXJ0eS5nZXROYW1lKCkpOworCQl0aGlzLnNldFZhbHVlKHRoaXMueG1sUHJvcGVydHkuZ2V0VmFsdWUoKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy54bWxQcm9wZXJ0eS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKKwkJc2IuYXBwZW5kKCIgPSAiKTsgLy8kTk9OLU5MUy0xJAorCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVhtbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VYbWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGZhZGJmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VYbWwuamF2YQpAQCAtMCwwICsxLDE5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlWG1sCisJZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sCit7CisJcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIHBlcnNpc3RlbmNlWG1sUmVzb3VyY2U7CisJCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlOworCQorCXByb3RlY3RlZCBKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlOworCQorCXB1YmxpYyBHZW5lcmljUGVyc2lzdGVuY2VYbWwoSnBhUm9vdENvbnRleHROb2RlIHBhcmVudCwgSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJaWYgKCEgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKS5pc0tpbmRPZihKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZXNvdXJjZSAiICsgcmVzb3VyY2UgKyAiIG11c3QgaGF2ZSBwZXJzaXN0ZW5jZSB4bWwgY29udGVudCB0eXBlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJCXRoaXMucGVyc2lzdGVuY2VYbWxSZXNvdXJjZSA9IHJlc291cmNlOworCQlpZiAocmVzb3VyY2UuZ2V0Um9vdE9iamVjdCgpICE9IG51bGwpIHsKKwkJCXRoaXMucGVyc2lzdGVuY2UgPSBidWlsZFBlcnNpc3RlbmNlKChYbWxQZXJzaXN0ZW5jZSkgcmVzb3VyY2UuZ2V0Um9vdE9iamVjdCgpKTsKKwkJCXRoaXMucmVzb3VyY2VUeXBlID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCk7CisJCX0KKwl9CisJCisJcHVibGljIEpwYVhtbFJlc291cmNlIGdldFhtbFJlc291cmNlKCkgeworCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVhtbFJlc291cmNlOworCX0KKwkKKwkvLyAqKioqKioqKioqKioqKioqIEpwYU5vZGUgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VYbWxSZXNvdXJjZS5nZXRGaWxlKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogSnBhU3RydWN0dXJlTm9kZSBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQkvLyBpc24ndCBhY3R1YWxseSBkaXNwbGF5ZWQsIHNvIG5lZWRzIG5vIGRldGFpbHMgcGFnZQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYVJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7CisJCXJldHVybiB0aGlzLnBlcnNpc3RlbmNlWG1sUmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogcGVyc2lzdGVuY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgUGVyc2lzdGVuY2UgZ2V0UGVyc2lzdGVuY2UoKSB7CisJCXJldHVybiB0aGlzLnBlcnNpc3RlbmNlOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQZXJzaXN0ZW5jZShQZXJzaXN0ZW5jZSBuZXdQZXJzaXN0ZW5jZSkgeworCQlQZXJzaXN0ZW5jZSBvbGRQZXJzaXN0ZW5jZSA9IHRoaXMucGVyc2lzdGVuY2U7CisJCXRoaXMucGVyc2lzdGVuY2UgPSBuZXdQZXJzaXN0ZW5jZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChQRVJTSVNURU5DRV9QUk9QRVJUWSwgb2xkUGVyc2lzdGVuY2UsIG5ld1BlcnNpc3RlbmNlKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZU1ldGFtb2RlbCgpIHsKKwkJaWYgKHRoaXMucGVyc2lzdGVuY2UgIT0gbnVsbCkgeworCQkJdGhpcy5wZXJzaXN0ZW5jZS5zeW5jaHJvbml6ZU1ldGFtb2RlbCgpOworCQl9CisJfQorCQorCS8vICoqKioqKioqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCS8vVE9ETyBJIGhhdmVuJ3QgeWV0IGZpZ3VyZWQgb3V0IGlmIHdlIGRvIG5vdCBuZWVkIHRoZSByZXNvdXJjZSBvYmplY3QgcGFzc2VkIGluIG5vdy4KKwkvL0kgZG9uJ3QgdGhpbmsgd2Ugd2lsbCBldmVuIGJ1aWxkIEFic3RyYWN0UGVyc2lzdGVuY2VYbWwgaWYgdGhlIHJlc291cmNlIG9iamVjdCBpcyBudWxsCisJLy9JJ20gcHJldHR5IHN1cmUgdGhpcyB3b24ndCBjaGFuZ2Ugbm93LCBidXQgbmVlZCB0byBpbnZlc3RpZ2F0ZSAtIEtGQgorCXB1YmxpYyB2b2lkIHVwZGF0ZShKcGFYbWxSZXNvdXJjZSBwZXJzaXN0ZW5jZVJlc291cmNlKSB7CisJCVhtbFBlcnNpc3RlbmNlIG9sZFhtbFBlcnNpc3RlbmNlID0gCisJCQkodGhpcy5wZXJzaXN0ZW5jZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnBlcnNpc3RlbmNlLmdldFhtbFBlcnNpc3RlbmNlKCk7CisJCVhtbFBlcnNpc3RlbmNlIG5ld1htbFBlcnNpc3RlbmNlID0gKFhtbFBlcnNpc3RlbmNlKSBwZXJzaXN0ZW5jZVJlc291cmNlLmdldFJvb3RPYmplY3QoKTsKKwkJSnBhUmVzb3VyY2VUeXBlIG5ld1Jlc291cmNlVHlwZSA9IHBlcnNpc3RlbmNlUmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCk7CisJCQorCQl0aGlzLnBlcnNpc3RlbmNlWG1sUmVzb3VyY2UgPSBwZXJzaXN0ZW5jZVJlc291cmNlOworCQkKKwkJLy8gaWYgdGhlIG9sZCBhbmQgbmV3IHhtbCBwZXJzaXN0ZW5jZXMgYXJlIGRpZmZlcmVudCBpbnN0YW5jZXMsCisJCS8vIHdlIHNjcmFwIHRoZSBvbGQgYW5kIHJlYnVpbGQuICB0aGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgcmVzb3VyY2UKKwkJLy8gbW9kZWwgZHJhc3RpY2FsbHkgY2hhbmdlcywgc3VjaCBhcyBhIGN2cyBjaGVja291dCBvciBhbiBlZGl0IHJldmVyc2lvbgorCQlpZiAob2xkWG1sUGVyc2lzdGVuY2UgIT0gbmV3WG1sUGVyc2lzdGVuY2UgfHwgbmV3WG1sUGVyc2lzdGVuY2UgPT0gbnVsbCB8fCB2YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5yZXNvdXJjZVR5cGUsIG5ld1Jlc291cmNlVHlwZSkpIHsKKwkJCWlmICh0aGlzLnBlcnNpc3RlbmNlICE9IG51bGwpIHsKKwkJCQl0aGlzLmdldEpwYUZpbGUodGhpcy5wZXJzaXN0ZW5jZVhtbFJlc291cmNlLmdldEZpbGUoKSkucmVtb3ZlUm9vdFN0cnVjdHVyZU5vZGUodGhpcy5wZXJzaXN0ZW5jZVhtbFJlc291cmNlKTsKKwkJCQl0aGlzLnBlcnNpc3RlbmNlLmRpc3Bvc2UoKTsKKwkJCQl0aGlzLnNldFBlcnNpc3RlbmNlKG51bGwpOworCQkJfQorCQl9CisJCQorCQlpZiAobmV3WG1sUGVyc2lzdGVuY2UgIT0gbnVsbCkgeworCQkJaWYgKHRoaXMucGVyc2lzdGVuY2UgIT0gbnVsbCkgeworCQkJCXRoaXMucGVyc2lzdGVuY2UudXBkYXRlKG5ld1htbFBlcnNpc3RlbmNlKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXNldFBlcnNpc3RlbmNlKGJ1aWxkUGVyc2lzdGVuY2UobmV3WG1sUGVyc2lzdGVuY2UpKTsKKwkJCX0KKwkJCXRoaXMuZ2V0SnBhRmlsZSh0aGlzLnBlcnNpc3RlbmNlWG1sUmVzb3VyY2UuZ2V0RmlsZSgpKS5hZGRSb290U3RydWN0dXJlTm9kZSh0aGlzLnBlcnNpc3RlbmNlWG1sUmVzb3VyY2UsIHRoaXMucGVyc2lzdGVuY2UpOworCQl9CisJCXRoaXMucmVzb3VyY2VUeXBlID0gbmV3UmVzb3VyY2VUeXBlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwb3N0VXBkYXRlKCkgeworCQlzdXBlci5wb3N0VXBkYXRlKCk7CisJCWlmICh0aGlzLnBlcnNpc3RlbmNlICE9IG51bGwpIHsKKwkJCXRoaXMucGVyc2lzdGVuY2UucG9zdFVwZGF0ZSgpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZSBidWlsZFBlcnNpc3RlbmNlKFhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlKSB7CisJCXJldHVybiBnZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZFBlcnNpc3RlbmNlKHRoaXMsIHhtbFBlcnNpc3RlbmNlKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vIFBlcnNpc3RlbmNlIFVuaXQgaW4gdGhpcyBjb250ZXh0Iik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJCisJcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCkgeworCQlpZiAodGhpcy5wZXJzaXN0ZW5jZS5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KSkgeworCQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UuZ2V0U3RydWN0dXJlTm9kZSh0ZXh0T2Zmc2V0KTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9CisJCisJLy8gbmV2ZXIgYWN0dWFsbHkgc2VsZWN0ZWQKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIFRleHRSYW5nZS5FbXB0eS5pbnN0YW5jZSgpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiBUZXh0UmFuZ2UuRW1wdHkuaW5zdGFuY2UoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKworCQlpZiAodGhpcy5wZXJzaXN0ZW5jZSA9PSBudWxsKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9YTUxfSU5WQUxJRF9DT05URU5ULAorCQkJCQl0aGlzCisJCQkJKQorCQkJKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXRoaXMucGVyc2lzdGVuY2UudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQl0aGlzLnBlcnNpc3RlbmNlLmRpc3Bvc2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNzliMmMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJCW5ldyBHZW5lcmljUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgR2VuZXJpY1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIEVGYWN0b3J5IGdldFJlc291cmNlTm9kZUZhY3RvcnkoKSB7CisJCXJldHVybiBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5KCk7CisJfQorCQorCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgeworCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMV8wX1JFU09VUkNFX1RZUEU7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9JbXBsaWVkTWFwcGluZ0ZpbGVSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvSW1wbGllZE1hcHBpbmdGaWxlUmVmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2MTJmMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvSW1wbGllZE1hcHBpbmdGaWxlUmVmLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdE1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCitwdWJsaWMgY2xhc3MgSW1wbGllZE1hcHBpbmdGaWxlUmVmCisJZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdGaWxlUmVmCit7CisJCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJcHVibGljIEltcGxpZWRNYXBwaW5nRmlsZVJlZihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBTdHJpbmcgcmVzb3VyY2VGaWxlTmFtZSkgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlRmlsZU5hbWUpOworCX0KKwkJCisJcHVibGljIGJvb2xlYW4gaXNJbXBsaWVkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IGFuIGltcGxpZWQgbWFwcGluZyBmaWxlIHJlZidzICdmaWxlTmFtZSciKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKFhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmKSB7CisJCWlmIChtYXBwaW5nRmlsZVJlZiAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtYXBwaW5nRmlsZVJlZiBzaG91bGQgYmUgbnVsbCBmb3IgYW4gaW1wbGllZCBtYXBwaW5nIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXN1cGVyLnVwZGF0ZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzNzE3NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkFzc29jaWF0aW9uT3ZlcnJpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbgoreworCisJcHVibGljIEJpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZXMxXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlczFfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjQ4ZWRiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZXMxXzBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuQXNzb2NpYXRpb25PdmVycmlkZXMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGVzMV8wQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uCit7CisKKwlwdWJsaWMgQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZXMxXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlKE9iamVjdCBqZHRBc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCXJldHVybiBuZXcgQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24odGhpcywgKElBbm5vdGF0aW9uKSBqZHRBc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9uZVRvTWFueTFfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9uZVRvTWFueTFfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWM0MDgxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T25lVG9NYW55MV8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5T25lVG9NYW55QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CisKKy8qKgorICogIEJpbmFyeU9uZVRvTWFueTFfMEFubm90YXRpb24KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeU9uZVRvTWFueTFfMEFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeU9uZVRvTWFueUFubm90YXRpb24KK3sKKworCXB1YmxpYyBCaW5hcnlPbmVUb01hbnkxXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T25lVG9PbmUxXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlPbmVUb09uZTFfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTRjODc5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T25lVG9PbmUxXzBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlPbmVUb09uZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworCisvKioKKyAqICBCaW5hcnlPbmVUb09uZTFfMEFubm90YXRpb24KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeU9uZVRvT25lMV8wQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5T25lVG9PbmVBbm5vdGF0aW9uCit7CisKKwlwdWJsaWMgQmluYXJ5T25lVG9PbmUxXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3IxXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlTZXF1ZW5jZUdlbmVyYXRvcjFfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzNkZmVlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3IxXzBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5TZXF1ZW5jZUdlbmVyYXRvcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3IxXzBBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24KK3sKKworCXB1YmxpYyBCaW5hcnlTZXF1ZW5jZUdlbmVyYXRvcjFfMEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMV8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTc3NDc1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMV8wQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24KK3sKKworCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMV8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKKwl9CisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24ocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKSk7CisJfQorCisJc3RhdGljIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uIGJ1aWxkTmVzdGVkQXNzb2NpYXRpb25PdmVycmlkZShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGF0dHJpYnV0ZU92ZXJyaWRlc0FkYXB0ZXIpIHsKKwkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IGJ1aWxkTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlcik7CisJCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBpZGFhKTsKKwkJcmV0dXJuIG5ldyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMV8wQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlciwgaWRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKSB7CisJCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlciwgaW5kZXgsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlczFfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVzMV8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTk0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlczFfMEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuQXNzb2NpYXRpb25PdmVycmlkZXMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVzMV8wQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uCit7CisKKwlwdWJsaWMgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZXMxXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGUoaW50IGluZGV4KSB7CisJCXJldHVybiBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMV8wQW5ub3RhdGlvbi5idWlsZE5lc3RlZEFzc29jaWF0aW9uT3ZlcnJpZGUodGhpcywgdGhpcy5tZW1iZXIsIGluZGV4LCB0aGlzLmRhYSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPbmVUb01hbnkxXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPbmVUb01hbnkxXzBBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwYTAzNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU9uZVRvTWFueTFfMEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU9uZVRvTWFueUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKKworLyoqCisgKiAgU291cmNlT25lVG9NYW55MV8wQW5ub3RhdGlvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlT25lVG9NYW55MV8wQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlT25lVG9NYW55QW5ub3RhdGlvbgoreworCisJcHVibGljIFNvdXJjZU9uZVRvTWFueTFfMEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU9uZVRvT25lMV8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlT25lVG9PbmUxXzBBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZlNjUzNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU9uZVRvT25lMV8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlT25lVG9PbmVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CisKKy8qKgorICogIFNvdXJjZU9uZVRvT25lMV8wQW5ub3RhdGlvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlT25lVG9PbmUxXzBBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VPbmVUb09uZUFubm90YXRpb24KK3sKKworCXB1YmxpYyBTb3VyY2VPbmVUb09uZTFfMEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVNlcXVlbmNlR2VuZXJhdG9yMV8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlU2VxdWVuY2VHZW5lcmF0b3IxXzBBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhYzdmNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVNlcXVlbmNlR2VuZXJhdG9yMV8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlNlcXVlbmNlR2VuZXJhdG9yCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcjFfMEFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbgoreworCisJcHVibGljIFNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yMV8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlzdXBlcihwYXJlbnQsIG1lbWJlcik7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjVkNTUxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmludGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlczJfMEFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5DYWNoZWFibGUyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuTWFwc0lkMl8wQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueTJfMEFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb09uZTJfMEFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLklkQ2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Mb2JBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlc0Fubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKKworLyoqCisgKiBTdXBwb3J0IGZvciBleGlzdGluZyBKUEEgMS4wIGFubm90YXRpb25zLCBuZXcgSlBBIDIuMCBhbm5vdGF0aW9ucywgYW5kIAorICogYXVnbWVudGVkIHN1cHBvcnQgZm9yIGFubm90YXRpb25zIGNoYW5nZWQgZnJvbSAxLjAgdG8gMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcgorCWV4dGVuZHMgQWJzdHJhY3RKcGFBbm5vdGF0aW9uRGVmaW50aW9uUHJvdmlkZXIKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIElOU1RBTkNFID0gCisJCQluZXcgR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgeworCQlkZWZpbml0aW9ucy5hZGQoQWNjZXNzMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChBc3NvY2lhdGlvbk92ZXJyaWRlczJfMEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVtYmVkZGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVudGl0eUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSWRDbGFzc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSW5oZXJpdGFuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE5hbWVkUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChTZWNvbmRhcnlUYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkVHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgeworCQlkZWZpbml0aW9ucy5hZGQoRW1iZWRkYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRW50aXR5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uc1RvKExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7CisJCWRlZmluaXRpb25zLmFkZChBY2Nlc3MyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEFzc29jaWF0aW9uT3ZlcnJpZGVzMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChCYXNpY0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRW1iZWRkZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVtYmVkZGVkSWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVudW1lcmF0ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChJZEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEpvaW5UYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoTG9iQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChNYW55VG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChNYW55VG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE1hcHNJZDJfMEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoTWFwS2V5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPbmVUb01hbnkyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9uZVRvT25lMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcmRlckJ5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKFRlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChUcmFuc2llbnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKFZlcnNpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljMl8wSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljMl8wSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzNDg4NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL0dlbmVyaWMyXzBKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm1WYXJpYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFQbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5LlNpbXBsZVZlcnNpb247CisKKy8qKgorICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKKyAqIGl0IGlzIGluaXRpYWxpemVkKS4KKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWMyXzBKcGFQbGF0Zm9ybUZhY3RvcnkKKwlpbXBsZW1lbnRzIEpwYVBsYXRmb3JtRmFjdG9yeQoreworCS8qKgorCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgR2VuZXJpYzJfMEpwYVBsYXRmb3JtRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIEpwYVBsYXRmb3JtIGJ1aWxkSnBhUGxhdGZvcm0oU3RyaW5nIGlkKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0pwYVBsYXRmb3JtKAorCQkJaWQsCisJCQl0aGlzLmJ1aWxkSnBhVmVyc2lvbigpLAorCQkJbmV3IEdlbmVyaWNKcGFGYWN0b3J5Ml8wKCksCisJCQluZXcgR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcihHZW5lcmljMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpKSwKKwkJCUdlbmVyaWMyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyLmluc3RhbmNlKCksCisJCQl0aGlzLmJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSk7CisJfQorCQorCXByaXZhdGUgSnBhUGxhdGZvcm0uVmVyc2lvbiBidWlsZEpwYVZlcnNpb24oKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVmVyc2lvbihKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzJfMCk7CisJfQorCQorCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBidWlsZEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgeworCQlyZXR1cm4gbmV3IEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgeworCQkJLy90YWJsZV9wZXJfY2xhc3MgaW5oZXJpdGFuY2Ugc3VwcG9ydCBpcyBvcHRpb25hbCBpbiB0aGUgMi4wIHNwZWMKKwkJCXB1YmxpYyBTdXBwb3J0ZWQgZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpIHsKKwkJCQlyZXR1cm4gU3VwcG9ydGVkLk1BWUJFOworCQkJfQorCQkJcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVPdmVycmlkYWJsZSgpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljMl8wSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvR2VuZXJpYzJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQ3ZTAyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvR2VuZXJpYzJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSmF2YVJlc291cmNlTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5Pcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW50aXR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1YbWxEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbDJfMERlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWMyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247CisKKy8qKgorICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKKyAqIGl0IGlzIGluaXRpYWxpemVkKS4KKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWMyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyIAorCWV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVByb3ZpZGVyCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiZ2VuZXJpYzJfMCI7IC8vJE5PTi1OTFMtMSQKKwkKKwkKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybVByb3ZpZGVyIElOU1RBTkNFID0gCisJCQluZXcgR2VuZXJpYzJfMEpwYVBsYXRmb3JtUHJvdmlkZXIoKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgR2VuZXJpYzJfMEpwYVBsYXRmb3JtUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKioKKwkKKwlwdWJsaWMgSnBhUmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7CisJCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7CisJCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOworCQl9CisJCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7CisJCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKKwkJfQorCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKSkgeworCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzJfMF9SRVNPVVJDRV9UWVBFOworCQl9CisJCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKSkgeworCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uT1JNX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRTsKKwkJfQorCQllbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29udGVudFR5cGUudG9TdHJpbmcoKSk7CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIGJ1aWxkUmVzb3VyY2VNb2RlbFByb3ZpZGVycygpIHsKKwkJLy8gb3JkZXIgc2hvdWxkIG5vdCBiZSBpbXBvcnRhbnQgaGVyZQorCQlyZXR1cm4gbmV3IEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIHsKKwkJCUphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKKwkJCUphclJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAorCQkJUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKKwkJCU9ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpfTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGROb25OdWxsSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCS8vIG9yZGVyIGRldGVybWluZWQgYnkgYW5hbHl6aW5nIG9yZGVyIHRoYXQgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIChlY2xpcHNlbGluaykgdXNlcworCQlyZXR1cm4gbmV3IEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7CisJCQlKYXZhRW50aXR5RGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uaW5zdGFuY2UoKX07CisJfQorCQorCQorCS8vICoqKioqKioqKiogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBidWlsZE5vbk51bGxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKKwkJLy8gb3JkZXIgZGV0ZXJtaW5lZCBieSBhbmFseXppbmcgb3JkZXIgdGhhdCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gKGVjbGlwc2VsaW5rKSB1c2VzCisJCXJldHVybiBuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10geworCQkJSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCl9OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGROb25OdWxsU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKKwkJLy8gb3JkZXIgZGV0ZXJtaW5lZCBieSBhbmFseXppbmcgb3JkZXIgdGhhdCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gKGVjbGlwc2VsaW5rKSB1c2VzCisJCXJldHVybiBuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10geworCQkJSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAorCQkJSmF2YUlkTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKKwkJCUphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCl9OworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIE1hcHBpbmcgRmlsZXMgKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBSZXNvdXJjZURlZmluaXRpb25bXSBidWlsZFJlc291cmNlRGVmaW5pdGlvbnMoKSB7CisJCXJldHVybiBuZXcgUmVzb3VyY2VEZWZpbml0aW9uW10geworCQkJR2VuZXJpY1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJR2VuZXJpYzJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJR2VuZXJpY09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUdlbmVyaWNPcm1YbWwyXzBEZWZpbml0aW9uLmluc3RhbmNlKCl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL0dlbmVyaWNKcGFGYWN0b3J5Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljSnBhRmFjdG9yeTJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMWYzNjgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljSnBhRmFjdG9yeTJfMC5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUNhY2hlYWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YURlcml2ZWRJZDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUVtYmVkZGFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFNYXBzSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhT3JwaGFuUmVtb3ZhbDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLlZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLkpwYVByb2plY3QyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5NZXRhbW9kZWxTeW5jaHJvbml6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5QZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDYWNoZWFibGVIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YURlcml2ZWRJZDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hcHNJZDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworCisKKy8qKgorICogQ2VudHJhbCBjbGFzcyB0aGF0IGFsbG93cyBleHRlbmRlcnMgdG8gZWFzaWx5IHJlcGxhY2UgaW1wbGVtZW50YXRpb25zIG9mCisgKiB2YXJpb3VzIERhbGkgaW50ZXJmYWNlcy4KKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNKcGFGYWN0b3J5Ml8wCisJZXh0ZW5kcyBBYnN0cmFjdEpwYUZhY3RvcnkKK3sKKwkKKwlwdWJsaWMgR2VuZXJpY0pwYUZhY3RvcnkyXzAoKSB7CisJCXN1cGVyKCk7CisJfQorCQkKKwkvLyAqKioqKioqKioqIENvcmUgTW9kZWwgKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBNZXRhbW9kZWxTeW5jaHJvbml6ZXIgYnVpbGRNZXRhbW9kZWxTeW5jaHJvbml6ZXIoSnBhUHJvamVjdDJfMCBqcGFQcm9qZWN0KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY01ldGFtb2RlbFN5bmNocm9uaXplcihqcGFQcm9qZWN0KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFBlcnNpc3RlbnRUeXBlTWV0YW1vZGVsU3luY2hyb25pemVyIGJ1aWxkUGVyc2lzdGVudFR5cGVNZXRhbW9kZWxTeW5jaHJvbml6ZXIoUGVyc2lzdGVudFR5cGVNZXRhbW9kZWxTeW5jaHJvbml6ZXIuT3duZXIgb3duZXIsIFBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY1BlcnNpc3RlbnRUeXBlTWV0YW1vZGVsU3luY2hyb25pemVyKG93bmVyLCBwZXJzaXN0ZW50VHlwZSk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogSmF2YSBDb250ZXh0IE1vZGVsICoqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKFBlcnNpc3RlbnRUeXBlLk93bmVyIG93bmVyLCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTJfMChvd25lciwganJwdCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKFBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wKHBhcmVudCwganJwYSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhRW1iZWRkYWJsZSBidWlsZEphdmFFbWJlZGRhYmxlKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUVtYmVkZGFibGUyXzAocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFTZXF1ZW5jZUdlbmVyYXRvciBidWlsZEphdmFTZXF1ZW5jZUdlbmVyYXRvcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMChwYXJlbnQpOworCX0KKwkKKwkvL1RoZSAyLjAgSlBBIHNwZWMgc3VwcG9ydHMgYXNzb2NpYXRpb24gb3ZlcnJpZGVzIG9uIGFuIGVtYmVkZGVkIG1hcHBpbmcgd2hpbGUgdGhlIDEuMCBzcGVjIGRpZCBub3QKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcihKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIHBhcmVudCwgT3duZXIgb3duZXIpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIocGFyZW50LCBvd25lcik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBidWlsZEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMChwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYnVpbGRKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIganJwbSwgU3RyaW5nIG5hbWUsIEpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24oanJwbSwgbmFtZSwgam9pbmluZ1N0cmF0ZWd5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFEZXJpdmVkSWQyXzAgYnVpbGRKYXZhRGVyaXZlZElkKEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhRGVyaXZlZElkMl8wKHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGJ1aWxkSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMChwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YU1hcHNJZDJfMCBidWlsZEphdmFNYXBzSWQoSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFNYXBzSWQyXzAocGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YU9uZVRvTWFueU1hcHBpbmcgYnVpbGRKYXZhT25lVG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAocGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YU9uZVRvT25lTWFwcGluZyBidWlsZEphdmFPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcyXzAocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFDYWNoZWFibGUyXzAgYnVpbGRKYXZhQ2FjaGVhYmxlKEphdmFDYWNoZWFibGVIb2xkZXIyXzAgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFDYWNoZWFibGUyXzAocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgYnVpbGRKYXZhT3JwaGFuUmVtb3ZhbChKYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU9ycGhhblJlbW92YWwyXzAocGFyZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljTWV0YW1vZGVsU3luY2hyb25pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljTWV0YW1vZGVsU3luY2hyb25pemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljMTg2ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL0dlbmVyaWNNZXRhbW9kZWxTeW5jaHJvbml6ZXIuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuSnBhRmFjdG9yeTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLkpwYVByb2plY3QyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5QZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLk1ldGFtb2RlbFN5bmNocm9uaXplcjsKKworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNNZXRhbW9kZWxTeW5jaHJvbml6ZXIKKwlpbXBsZW1lbnRzIE1ldGFtb2RlbFN5bmNocm9uaXplciwgUGVyc2lzdGVudFR5cGVNZXRhbW9kZWxTeW5jaHJvbml6ZXIuT3duZXIKK3sKKwlwcm90ZWN0ZWQgZmluYWwgSnBhUHJvamVjdDJfMCBqcGFQcm9qZWN0OworCisJcHVibGljIEdlbmVyaWNNZXRhbW9kZWxTeW5jaHJvbml6ZXIoSnBhUHJvamVjdDJfMCBqcGFQcm9qZWN0KSB7CisJCXN1cGVyKCk7CisJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7CisJfQorCisJcHJvdGVjdGVkIEpwYUZhY3RvcnkyXzAgZ2V0SnBhRmFjdG9yeSgpIHsKKwkJcmV0dXJuIChKcGFGYWN0b3J5Ml8wKSB0aGlzLmpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKS5nZXRKcGFGYWN0b3J5KCk7CisJfQorCisJcHVibGljIHZvaWQgc3luY2hyb25pemUoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKKwkJdGhpcy5idWlsZFBlcnNpc3RlbnRUeXBlTWV0YW1vZGVsU3luY2hyb25pemVyKHBlcnNpc3RlbnRUeXBlKS5zeW5jaHJvbml6ZSgpOworCX0KKworCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplciBidWlsZFBlcnNpc3RlbnRUeXBlTWV0YW1vZGVsU3luY2hyb25pemVyKFBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKSB7CisJCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZFBlcnNpc3RlbnRUeXBlTWV0YW1vZGVsU3luY2hyb25pemVyKHRoaXMsIHBlcnNpc3RlbnRUeXBlKTsKKwl9CisKKwlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0U291cmNlRm9sZGVyKCkgeworCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldE1ldGFtb2RlbFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljUGVyc2lzdGVudFR5cGVNZXRhbW9kZWxTeW5jaHJvbml6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL0dlbmVyaWNQZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMTVhNTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljUGVyc2lzdGVudFR5cGVNZXRhbW9kZWxTeW5jaHJvbml6ZXIuamF2YQpAQCAtMCwwICsxLDU0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5QZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSW5kZW50aW5nUHJpbnRXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOworCitpbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKK2ltcG9ydCBjb20uaWJtLmljdS50ZXh0LkRhdGVGb3JtYXQ7CisKKy8qKgorICogCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplcgorCWltcGxlbWVudHMgUGVyc2lzdGVudFR5cGVNZXRhbW9kZWxTeW5jaHJvbml6ZXIKK3sKKwlwcm90ZWN0ZWQgZmluYWwgT3duZXIgb3duZXI7CisJcHJvdGVjdGVkIGZpbmFsIFBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgbWV0YW1vZGVsQ2xhc3NOYW1lOworCisKKwlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbnRUeXBlTWV0YW1vZGVsU3luY2hyb25pemVyKE93bmVyIG93bmVyLCBQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgeworCQlzdXBlcigpOworCQl0aGlzLm93bmVyID0gb3duZXI7CisJCXRoaXMucGVyc2lzdGVudFR5cGUgPSBwZXJzaXN0ZW50VHlwZTsKKwkJdGhpcy5tZXRhbW9kZWxDbGFzc05hbWUgPSB0aGlzLmJ1aWxkTWV0YW1vZGVsQ2xhc3NOYW1lKCk7CisJfQorCisJLy8gVE9ETworCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRNZXRhbW9kZWxDbGFzc05hbWUoKSB7CisJCXJldHVybiB0aGlzLmJ1aWxkTWV0YW1vZGVsQ2xhc3NOYW1lKHRoaXMucGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTWV0YW1vZGVsQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJcmV0dXJuIGNsYXNzTmFtZSArICdfJzsKKwl9CisKKwkvLyBUT0RPCisJcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKwkJcmV0dXJuIENsYXNzVG9vbHMucGFja2FnZU5hbWVGb3JDbGFzc05hbWVkKHRoaXMubWV0YW1vZGVsQ2xhc3NOYW1lKTsKKwl9CisKKwlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBidWlsZFBhY2thZ2VGcmFnbWVudCgpIHsKKwkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlRm9sZGVyID0gdGhpcy5vd25lci5nZXRTb3VyY2VGb2xkZXIoKTsKKwkJU3RyaW5nIHBrZ05hbWUgPSB0aGlzLmdldFBhY2thZ2VOYW1lKCk7CisJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gc291cmNlRm9sZGVyLmdldFBhY2thZ2VGcmFnbWVudChwa2dOYW1lKTsKKwkJaWYgKHBhY2thZ2VGcmFnbWVudC5leGlzdHMoKSkgeworCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudDsKKwkJfQorCQl0cnkgeworCQkJcmV0dXJuIHNvdXJjZUZvbGRlci5jcmVhdGVQYWNrYWdlRnJhZ21lbnQocGtnTmFtZSwgdHJ1ZSwgbnVsbCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7CisJCXRyeSB7CisJCQl0aGlzLnN5bmNocm9uaXplXygpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplXygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IHRoaXMuYnVpbGRQYWNrYWdlRnJhZ21lbnQoKTsKKwkJU3RyaW5nIGZpbGVOYW1lID0gQ2xhc3NUb29scy5zaG9ydE5hbWVGb3JDbGFzc05hbWVkKHRoaXMubWV0YW1vZGVsQ2xhc3NOYW1lKSArICIuamF2YSI7CisKKwkJSVNvdXJjZVJlZmVyZW5jZSBvbGRTb3VyY2VSZWYgPSBwa2cuZ2V0Q29tcGlsYXRpb25Vbml0KGZpbGVOYW1lKTsKKwkJU3RyaW5nIG9sZFNvdXJjZSA9IG9sZFNvdXJjZVJlZi5leGlzdHMoKSA/IG9sZFNvdXJjZVJlZi5nZXRTb3VyY2UoKSA6IG51bGw7CisKKwkJaWYgKG9sZFNvdXJjZSA9PSBudWxsKSB7ICAvLyB3cml0ZSBhIG5ldyBmaWxlCisJCQlwa2cuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGZpbGVOYW1lLCB0aGlzLmJ1aWxkU291cmNlKCksIGZhbHNlLCBudWxsKTsgIC8vIGZhbHNlPW5vIGZvcmNlCisJCQlyZXR1cm47CisJCX0KKworCQlpbnQgb2xkQmVnaW4gPSBvbGRTb3VyY2UuaW5kZXhPZihEQUxJX1RBRyk7CisJCWlmIChvbGRCZWdpbiA9PSAtMSkgeworCQkJcmV0dXJuOworCQl9CisJCW9sZEJlZ2luICs9IERBTElfVEFHX0xFTkdUSDsKKworCQlpbnQgb2xkRW5kID0gb2xkU291cmNlLmluZGV4T2YoJyInLCBvbGRCZWdpbik7CisJCWlmIChvbGRFbmQgPT0gLTEpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkU291cmNlMiA9IG9sZFNvdXJjZS5yZXBsYWNlKG9sZFNvdXJjZS5zdWJzdHJpbmcob2xkQmVnaW4sIG9sZEVuZCksICIiKTsKKworCQlTdHJpbmcgbmV3U291cmNlID0gdGhpcy5idWlsZFNvdXJjZSgpOworCQlpbnQgbmV3QmVnaW4gPSBuZXdTb3VyY2UuaW5kZXhPZihEQUxJX1RBRykgKyBEQUxJX1RBR19MRU5HVEg7CisJCWludCBuZXdFbmQgPSBuZXdTb3VyY2UuaW5kZXhPZignIicsIG5ld0JlZ2luKTsKKwkJU3RyaW5nIG5ld1NvdXJjZTIgPSBuZXdTb3VyY2UucmVwbGFjZShuZXdTb3VyY2Uuc3Vic3RyaW5nKG5ld0JlZ2luLCBuZXdFbmQpLCAiIik7CisKKwkJaWYgKCAhIG5ld1NvdXJjZTIuZXF1YWxzKG9sZFNvdXJjZTIpKSB7ICAvLyByZXBsYWNlIHRoZSBvbGQgZmlsZQorCQkJcGtnLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmaWxlTmFtZSwgbmV3U291cmNlLCB0cnVlLCBudWxsKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERBTElfVEFHID0gIkBHZW5lcmF0ZWQoXCJEYWxpIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBEQUxJX1RBR19MRU5HVEggPSBEQUxJX1RBRy5sZW5ndGgoKTsKKworCS8qKgorCSAqIGJ1aWxkIHRoZSAiYm9keSIgc291cmNlIGZpcnN0OyB0aGVuIGJ1aWxkIHRoZSAicGFja2FnZSIgYW5kICJpbXBvcnRzIiBzb3VyY2UKKwkgKiBhbmQgY29uY2F0ZW5hdGUgdGhlICJib2R5IiBzb3VyY2UgdG8gaXQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU291cmNlKCkgeworCQkvLyBidWlsZCB0aGUgYm9keSBzb3VyY2UgZmlyc3Qgc28gd2UgY2FuIGdhdGhlciB1cCB0aGUgaW1wb3J0IHN0YXRlbWVudHMKKwkJQm9keVNvdXJjZVdyaXRlciBib2R5U291cmNlV3JpdGVyID0gdGhpcy5idWlsZEJvZHlTb3VyY2VXcml0ZXIoKTsKKworCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKGJvZHlTb3VyY2VXcml0ZXIuZ2V0TGVuZ3RoKCkgKyAyMDAwKTsKKwkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOworCQl0aGlzLnByaW50UGFja2FnZUFuZEltcG9ydHNPbihwdywgYm9keVNvdXJjZVdyaXRlcik7CisJCXB3LnByaW50KGJvZHlTb3VyY2VXcml0ZXIuZ2V0U291cmNlKCkpOworCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKKwl9CisKKwlwcm90ZWN0ZWQgQm9keVNvdXJjZVdyaXRlciBidWlsZEJvZHlTb3VyY2VXcml0ZXIoKSB7CisJCUJvZHlTb3VyY2VXcml0ZXIgcHcgPSBuZXcgQm9keVNvdXJjZVdyaXRlcih0aGlzLmdldFBhY2thZ2VOYW1lKCksIHRoaXMubWV0YW1vZGVsQ2xhc3NOYW1lKTsKKwkJdGhpcy5wcmludEJvZHlTb3VyY2VPbihwdyk7CisJCXJldHVybiBwdzsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBwcmludEJvZHlTb3VyY2VPbihCb2R5U291cmNlV3JpdGVyIHB3KSB7CisJCXRoaXMucHJpbnRDbGFzc0RlY2xhcmF0aW9uT24ocHcpOworCQlwdy5wcmludCgiIHsiKTsKKwkJcHcucHJpbnRsbigpOworCisJCXB3LmluZGVudCgpOworCQkJdGhpcy5wcmludEF0dHJpYnV0ZXNPbihwdyk7CisJCXB3LnVuZGVudCgpOworCisJCXB3LnByaW50KCd9Jyk7CisJCXB3LnByaW50bG4oKTsgIC8vIEVPRgorCX0KKworCisJLy8gKioqKioqKioqKiBjbGFzcyBkZWNsYXJhdGlvbiAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgdm9pZCBwcmludENsYXNzRGVjbGFyYXRpb25PbihCb2R5U291cmNlV3JpdGVyIHB3KSB7CisJCXRoaXMucHJpbnRHZW5lcmF0ZWRBbm5vdGF0aW9uT24ocHcpOworCQl0aGlzLnByaW50U3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbk9uKHB3KTsKKworCQlwdy5wcmludCgicHVibGljIGNsYXNzICIpOworCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLm1ldGFtb2RlbENsYXNzTmFtZSk7CisJCVBlcnNpc3RlbnRUeXBlIHN1cGVyUGVyc2lzdGVudFR5cGUgPSB0aGlzLnBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKKwkJaWYgKHN1cGVyUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgeworCQkJcHcucHJpbnQoIiBleHRlbmRzICIpOworCQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24odGhpcy5idWlsZE1ldGFtb2RlbENsYXNzTmFtZShzdXBlclBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcHJpbnRTdGF0aWNNZXRhbW9kZWxBbm5vdGF0aW9uT24oQm9keVNvdXJjZVdyaXRlciBwdykgeworCQlwdy5wcmludEFubm90YXRpb24oSlBBMl8wLlNUQVRJQ19NRVRBTU9ERUwpOworCQlwdy5wcmludCgnKCcpOworCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLnBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7CisJCXB3LnByaW50KCIuY2xhc3MiKTsKKwkJcHcucHJpbnQoJyknKTsKKwkJcHcucHJpbnRsbigpOworCX0KKworCS8vIFRPRE8gLSBjb21tZW50PworCXByb3RlY3RlZCB2b2lkIHByaW50R2VuZXJhdGVkQW5ub3RhdGlvbk9uKEJvZHlTb3VyY2VXcml0ZXIgcHcpIHsKKwkJcHcucHJpbnRBbm5vdGF0aW9uKCJqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZCIpOworCQlwdy5wcmludCgnKCcpOworCQlwdy5wcmludFN0cmluZ0xpdGVyYWwoIkRhbGkiICsgJyAnICsgRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKCkuZm9ybWF0KG5ldyBEYXRlKCkpKTsKKwkJcHcucHJpbnQoJyknKTsKKwkJcHcucHJpbnRsbigpOworCX0KKworCisJLy8gKioqKioqKioqKiBhdHRyaWJ1dGVzICoqKioqKioqKioKKworCXByb3RlY3RlZCB2b2lkIHByaW50QXR0cmlidXRlc09uKEJvZHlTb3VyY2VXcml0ZXIgcHcpIHsKKwkJZm9yIChJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSB0aGlzLnBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQl0aGlzLnByaW50QXR0cmlidXRlT24oc3RyZWFtLm5leHQoKSwgcHcpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcHJpbnRBdHRyaWJ1dGVPbihQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIEJvZHlTb3VyY2VXcml0ZXIgcHcpIHsKKwkJQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWlmIChhdHRyaWJ1dGVNYXBwaW5nICE9IG51bGwpIHsgIC8vIHByb2JhYmx5IHNob3VsZG4ndCBiZSBudWxsPworCQkJdGhpcy5wcmludEF0dHJpYnV0ZU1hcHBpbmdPbihhdHRyaWJ1dGVNYXBwaW5nLCBwdyk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBwcmludEF0dHJpYnV0ZU1hcHBpbmdPbihBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcsIEJvZHlTb3VyY2VXcml0ZXIgcHcpIHsKKwkJTWV0YW1vZGVsRmllbGQgZmllbGQgPSAoKEF0dHJpYnV0ZU1hcHBpbmcyXzApIGF0dHJpYnV0ZU1hcHBpbmcpLmdldE1ldGFtb2RlbEZpZWxkKCk7CisJCWlmIChmaWVsZCAhPSBudWxsKSB7CisJCQl0aGlzLnByaW50RmllbGRPbihmaWVsZCwgcHcpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcHJpbnRGaWVsZE9uKE1ldGFtb2RlbEZpZWxkIGZpZWxkLCBCb2R5U291cmNlV3JpdGVyIHB3KSB7CisJCWZvciAoU3RyaW5nIG1vZGlmaWVyIDogZmllbGQuZ2V0TW9kaWZpZXJzKCkpIHsKKwkJCXB3LnByaW50KG1vZGlmaWVyKTsKKwkJCXB3LnByaW50KCcgJyk7CisJCX0KKwkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oZmllbGQuZ2V0VHlwZU5hbWUoKSk7CisJCXB3LnByaW50KCc8Jyk7CisJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBmaWVsZC5nZXRUeXBlQXJndW1lbnROYW1lcygpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oc3RyZWFtLm5leHQoKSk7CisJCQlpZiAoc3RyZWFtLmhhc05leHQoKSkgeworCQkJCXB3LnByaW50KCIsICIpOworCQkJfQorCQl9CisJCXB3LnByaW50KCc+Jyk7CisJCXB3LnByaW50KCcgJyk7CisJCXB3LnByaW50KGZpZWxkLmdldE5hbWUoKSk7CisJCXB3LnByaW50KCc7Jyk7CisJCXB3LnByaW50bG4oKTsKKwl9CisKKworCS8vICoqKioqKioqKiogcGFja2FnZSBhbmQgaW1wb3J0cyAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgdm9pZCBwcmludFBhY2thZ2VBbmRJbXBvcnRzT24oUHJpbnRXcml0ZXIgcHcsIEJvZHlTb3VyY2VXcml0ZXIgYm9keVNvdXJjZVdyaXRlcikgeworCQlpZiAodGhpcy5nZXRQYWNrYWdlTmFtZSgpLmxlbmd0aCgpICE9IDApIHsKKwkJCXB3LnByaW50KCJwYWNrYWdlICIpOworCQkJcHcucHJpbnQodGhpcy5nZXRQYWNrYWdlTmFtZSgpKTsKKwkJCXB3LnByaW50KCc7Jyk7CisJCQlwdy5wcmludGxuKCk7CisJCQlwdy5wcmludGxuKCk7CisJCX0KKworCQlmb3IgKFN0cmluZyBpbXBvcnRfIDogYm9keVNvdXJjZVdyaXRlci5nZXRJbXBvcnRzKCkpIHsKKwkJCXB3LnByaW50KCJpbXBvcnQgIik7CisJCQlwdy5wcmludChpbXBvcnRfKTsKKwkJCXB3LnByaW50KCc7Jyk7CisJCQlwdy5wcmludGxuKCk7CisJCX0KKwkJcHcucHJpbnRsbigpOworCX0KKworCisJLy8gKioqKioqKioqKiBzb3VyY2Ugd3JpdGVyICoqKioqKioqKioKKworCS8qKgorCSAqIEV4dGVuZCBJbmRlbnRpbmdQcmludFdyaXRlciB3aXRoIHNvbWUgbWV0aG9kcyB0aGF0IGZhY2lsaXRhdGUgYnVpbGRpbmcKKwkgKiBjbGFzcyBzb3VyY2UgY29kZS4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEJvZHlTb3VyY2VXcml0ZXIKKwkJZXh0ZW5kcyBJbmRlbnRpbmdQcmludFdyaXRlcgorCXsKKwkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZTsKKwkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBjbGFzc05hbWU7CisJCS8vIGtleSA9IHNob3J0IGNsYXNzIG5hbWU7IHZhbHVlID0gaW1wb3J0IHBhY2thZ2UKKwkJcHJvdGVjdGVkIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiBpbXBvcnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPigpOworCisJCXByb3RlY3RlZCBCb2R5U291cmNlV3JpdGVyKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgeworCQkJc3VwZXIobmV3IFN0cmluZ1dyaXRlcigyMDAwKSk7CisJCQl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisJCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKwkJfQorCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0U291cmNlKCkgeworCQkJcmV0dXJuIHRoaXMub3V0LnRvU3RyaW5nKCk7CisJCX0KKworCQlwcm90ZWN0ZWQgaW50IGdldExlbmd0aCgpIHsKKwkJCXJldHVybiAoKFN0cmluZ1dyaXRlcikgdGhpcy5vdXQpLmdldEJ1ZmZlcigpLmxlbmd0aCgpOworCQl9CisKKwkJcHJvdGVjdGVkIHZvaWQgcHJpbnRWaXNpYmlsaXR5KFN0cmluZyB2aXNpYmlsaXR5TW9kaWZpZXIpIHsKKwkJCWlmICh2aXNpYmlsaXR5TW9kaWZpZXIubGVuZ3RoKCkgIT0gMCkgeworCQkJCXRoaXMucHJpbnQodmlzaWJpbGl0eU1vZGlmaWVyKTsKKwkJCQl0aGlzLnByaW50KCcgJyk7CisJCQl9CisJCX0KKworCQlwcm90ZWN0ZWQgdm9pZCBwcmludEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7CisJCQl0aGlzLnByaW50KCdAJyk7CisJCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKGFubm90YXRpb25OYW1lKTsKKwkJfQorCisJCXByb3RlY3RlZCB2b2lkIHByaW50VHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKKwkJCXRoaXMucHJpbnQodGhpcy5idWlsZEltcG9ydGVkVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbikpOworCQl9CisKKwkJcHJvdGVjdGVkIHZvaWQgcHJpbnRGaWVsZChTdHJpbmcgZmllbGROYW1lLCBTdHJpbmcgdHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgdmlzaWJpbGl0eSkgeworCQkJdGhpcy5wcmludFZpc2liaWxpdHkodmlzaWJpbGl0eSk7CisJCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7CisJCQl0aGlzLnByaW50KCcgJyk7CisJCQl0aGlzLnByaW50KGZpZWxkTmFtZSk7CisJCQl0aGlzLnByaW50KCc7Jyk7CisJCQl0aGlzLnByaW50bG4oKTsKKwkJCXRoaXMucHJpbnRsbigpOworCQl9CisKKwkJcHJvdGVjdGVkIHZvaWQgcHJpbnRQYXJhbWV0ZXJpemVkRmllbGQoU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHBhcmFtZXRlclR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHZpc2liaWxpdHkpIHsKKwkJCXRoaXMucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOworCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOworCQkJdGhpcy5wcmludCgnPCcpOworCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbihwYXJhbWV0ZXJUeXBlRGVjbGFyYXRpb24pOworCQkJdGhpcy5wcmludCgnPicpOworCQkJdGhpcy5wcmludCgnICcpOworCQkJdGhpcy5wcmludChmaWVsZE5hbWUpOworCQkJdGhpcy5wcmludCgnOycpOworCQkJdGhpcy5wcmludGxuKCk7CisJCQl0aGlzLnByaW50bG4oKTsKKwkJfQorCisJCS8qKgorCQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgU3RyaW5nIExpdGVyYWwgYW5kIHByaW50IGl0LAorCQkgKiBhZGRpbmcgdGhlIHN1cnJvdW5kaW5nIGRvdWJsZS1xdW90ZXMgYW5kIGVzY2FwaW5nIGNoYXJhY3RlcnMKKwkJICogYXMgbmVjZXNzYXJ5LgorCQkgKi8KKwkJdm9pZCBwcmludFN0cmluZ0xpdGVyYWwoU3RyaW5nIHN0cmluZykgeworCQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzdHJpbmcsIHRoaXMpOworCQl9CisKKworCQkvLyAqKioqKioqKioqIGltcG9ydHMgKioqKioqKioqKgorCisJCS8vICoqKioqIHdyaXRpbmcKKwkJLyoqCisJCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNsYXNzJ3MgImltcG9ydGVkIiBuYW1lLgorCQkgKiBUaGUgY2xhc3MgZGVjbGFyYXRpb24gbXVzdCBiZSBvZiB0aGUgZm9ybToKKwkJICogICAgICJpbnQiCisJCSAqICAgICAiaW50W10iIChub3QgIltJIikKKwkJICogICAgICJqYXZhLmxhbmcuT2JqZWN0IgorCQkgKiAgICAgImphdmEubGFuZy5PYmplY3RbXSIgKG5vdCAiW0xqYXZhLmxhbmcuT2JqZWN0OyIpCisJCSAqICAgICAiamF2YS51dGlsLk1hcC5FbnRyeSIgKG5vdCAiamF2YS51dGlsLk1hcCRFbnRyeSIpCisJCSAqICAgICAiamF2YS51dGlsLk1hcC5FbnRyeVtdW10iIChub3QgIltbTGphdmEudXRpbC5NYXAkRW50cnk7IikKKwkJICogICAgIAorCQkgKiBUbyByZWFsbHkgZG8gdGhpcyByaWdodCwgd2Ugd291bGQgbmVlZCB0byBnYXRoZXIgYWxsIHRoZSB0eXBlcyBmcm9tCisJCSAqIHRoZSAidW5hbWVkIiAoZGVmYXVsdCkgcGFja2FnZSB0aGF0IHdlcmUgcmVmZXJlbmNlZCBpbiB0aGUKKwkJICogY29tcGlsYXRpb24gdW5pdCBiZWZvcmVoYW5kLiAqQW55KiBjb2xsaXNpb25zIHdpdGggb25lIG9mIHRoZXNlCisJCSAqIHR5cGVzIHdvdWxkIGhhdmUgdG8gYmUgZnVsbHkgcXVhbGlmaWVkICh3aGV0aGVyIGl0IHdhcyBmcm9tCisJCSAqICdqYXZhLmxhbmcnIG9yIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdCkuCisJCSAqIEluIG90aGVyIHdvcmRzLCBpZiB3ZSBoYXZlIGFueSB0eXBlcyBmcm9tIHRoZSAidW5uYW1lZCIgcGFja2FnZSwKKwkJICogcmVzdWx0cyBhcmUgdW5wcmVkaWN0YWJsZS4uLi4KKwkJICovCisJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRJbXBvcnRlZFR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7CisJCQlpZiAodGhpcy50eXBlRGVjbGFyYXRpb25Jc01lbWJlckNsYXNzKHR5cGVEZWNsYXJhdGlvbikpIHsKKwkJCQkvLyBubyBuZWVkIGZvciBhbiBpbXBvcnQsIGp1c3QgcmV0dXJuIHRoZSBwYXJ0aWFsbHktcXVhbGlmaWVkIG5hbWUKKwkJCQlyZXR1cm4gdGhpcy5idWlsZE1lbWJlckNsYXNzVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7CisJCQl9CisJCQlpbnQgbGFzdCA9IHR5cGVEZWNsYXJhdGlvbi5sYXN0SW5kZXhPZignLicpOworCQkJU3RyaW5nIGN1cnJlbnRQYWNrYWdlTmFtZSA9IChsYXN0ID09IC0xKSA/ICIiIDogdHlwZURlY2xhcmF0aW9uLnN1YnN0cmluZygwLCBsYXN0KTsKKwkJCVN0cmluZyBzaG9ydFR5cGVEZWNsYXJhdGlvbiA9IHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcobGFzdCArIDEpOworCQkJU3RyaW5nIHNob3J0RWxlbWVudFR5cGVOYW1lID0gc2hvcnRUeXBlRGVjbGFyYXRpb247CisJCQl3aGlsZSAoc2hvcnRFbGVtZW50VHlwZU5hbWUuZW5kc1dpdGgoIltdIikpIHsKKwkJCQlzaG9ydEVsZW1lbnRUeXBlTmFtZSA9IHNob3J0RWxlbWVudFR5cGVOYW1lLnN1YnN0cmluZygwLCBzaG9ydEVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSAtIDIpOworCQkJfQorCQkJSW1wb3J0UGFja2FnZSBwcmV2ID0gdGhpcy5pbXBvcnRzLmdldChzaG9ydEVsZW1lbnRUeXBlTmFtZSk7CisJCQlpZiAocHJldiA9PSBudWxsKSB7CisJCQkJLy8gdGhpcyBpcyB0aGUgZmlyc3QgY2xhc3Mgd2l0aCB0aGlzIHNob3J0IGVsZW1lbnQgdHlwZSBuYW1lCisJCQkJdGhpcy5pbXBvcnRzLnB1dChzaG9ydEVsZW1lbnRUeXBlTmFtZSwgbmV3IEltcG9ydFBhY2thZ2UoY3VycmVudFBhY2thZ2VOYW1lKSk7CisJCQkJcmV0dXJuIHNob3J0VHlwZURlY2xhcmF0aW9uOworCQkJfQorCQkJaWYgKHByZXYucGFja2FnZU5hbWUuZXF1YWxzKGN1cnJlbnRQYWNrYWdlTmFtZSkpIHsKKwkJCQkvLyB0aGlzIGVsZW1lbnQgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIGltcG9ydGVkCisJCQkJcmV0dXJuIHNob3J0VHlwZURlY2xhcmF0aW9uOworCQkJfQorCQkJaWYgKGN1cnJlbnRQYWNrYWdlTmFtZS5lcXVhbHModGhpcy5wYWNrYWdlTmFtZSkgJiYKKwkJCQkJcHJldi5wYWNrYWdlTmFtZS5lcXVhbHMoImphdmEubGFuZyIpKSB7CisJCQkJLy8gd2UgZm9yY2UgdGhlICdqYXZhLmxhbmcnIGNsYXNzIHRvIGJlIGV4cGxpY2l0bHkgaW1wb3J0ZWQKKwkJCQlwcmV2LmNvbGxpc2lvbiA9IHRydWU7CisJCQl9CisJCQkvLyBhbm90aGVyIGNsYXNzIHdpdGggdGhlIHNhbWUgc2hvcnQgZWxlbWVudCB0eXBlIG5hbWUgaGFzIGJlZW4KKwkJCS8vIHByZXZpb3VzbHkgaW1wb3J0ZWQsIHNvIHRoaXMgb25lIG11c3QgYmUgdXNlZCBmdWxseS1xdWFsaWZpZWQKKwkJCXJldHVybiB0eXBlRGVjbGFyYXRpb247CisJCX0KKworCQkvKioKKwkJICogZS5nLiAiZm9vLmJhci5FbXBsb3llZS5QSyIgd2lsbCByZXR1cm4gdHJ1ZQorCQkgKi8KKwkJcHJvdGVjdGVkIGJvb2xlYW4gdHlwZURlY2xhcmF0aW9uSXNNZW1iZXJDbGFzcyhTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7CisJCQlyZXR1cm4gKHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSA+IHRoaXMuY2xhc3NOYW1lLmxlbmd0aCgpKQorCQkJCQkmJiB0eXBlRGVjbGFyYXRpb24uc3RhcnRzV2l0aCh0aGlzLmNsYXNzTmFtZSkKKwkJCQkJJiYgKHR5cGVEZWNsYXJhdGlvbi5jaGFyQXQodGhpcy5jbGFzc05hbWUubGVuZ3RoKCkpID09ICcuJyk7CisJCX0KKworCQkvKioKKwkJICogZS5nLiAiZm9vLmJhci5FbXBsb3llZS5QSyIgd2lsbCByZXR1cm4gIkVtcGxveWVlLlBLIgorCQkgKiB0aGlzIHByZXZlbnRzIGNvbGxpc2lvbnMgd2l0aCBvdGhlciBpbXBvcnRlZCBjbGFzc2VzIChlLmcuICJqb28uamFyLlBLIikKKwkJICovCisJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRNZW1iZXJDbGFzc1R5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7CisJCQlpbnQgaW5kZXggPSB0aGlzLnBhY2thZ2VOYW1lLmxlbmd0aCgpOworCQkJaWYgKGluZGV4ICE9IDApIHsKKwkJCQlpbmRleCsrOyAgLy8gYnVtcCBwYXN0IHRoZSAnLicKKwkJCX0KKwkJCXJldHVybiB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKGluZGV4KTsKKwkJfQorCisJCS8vICoqKioqIHJlYWRpbmcKKwkJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SW1wb3J0cygpIHsKKwkJCXJldHVybiB0aGlzLmdldFNvcnRlZFJlcXVpcmVkSW1wb3J0cygpOworCQl9CisKKwkJLyoqCisJCSAqIHRyYW5zZm9ybSBvdXIgbWFwIGVudHJpZXMgdG8gY2xhc3MgbmFtZXMKKwkJICovCisJCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFJlcXVpcmVkSW1wb3J0cygpIHsKKwkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiwgU3RyaW5nPih0aGlzLmdldFNvcnRlZFJlcXVpcmVkSW1wb3J0RW50cmllcygpLCB0aGlzLmJ1aWxkSW1wb3J0RW50cmllc1RyYW5zZm9ybWVyKCkpOworCQl9CisKKwkJcHJvdGVjdGVkIFRyYW5zZm9ybWVyPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+LCBTdHJpbmc+IGJ1aWxkSW1wb3J0RW50cmllc1RyYW5zZm9ybWVyKCkgeworCQkJcmV0dXJuIElNUE9SVF9FTlRSSUVTX1RSQU5TRk9STUVSOworCQl9CisKKwkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lcjxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiwgU3RyaW5nPiBJTVBPUlRfRU5UUklFU19UUkFOU0ZPUk1FUiA9IG5ldyBJbXBvcnRFbnRyaWVzVHJhbnNmb3JtZXIoKTsKKworCQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEltcG9ydEVudHJpZXNUcmFuc2Zvcm1lcgorCQkJaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiwgU3RyaW5nPgorCQl7CisJCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShFbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+IGltcG9ydEVudHJ5KSB7CisJCQkJU3RyaW5nIHBrZyA9IGltcG9ydEVudHJ5LmdldFZhbHVlKCkucGFja2FnZU5hbWU7CisJCQkJU3RyaW5nIHR5cGUgPSBpbXBvcnRFbnRyeS5nZXRLZXkoKTsKKwkJCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIocGtnLmxlbmd0aCgpICsgMSArIHR5cGUubGVuZ3RoKCkpOworCQkJCXNiLmFwcGVuZChwa2cpOworCQkJCXNiLmFwcGVuZCgnLicpOworCQkJCXNiLmFwcGVuZCh0eXBlKTsKKwkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiBzb3J0IGJ5IHBhY2thZ2UgZmlyc3QsIHRoZW4gY2xhc3MgKCpub3QqIGJ5IGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lKQorCQkgKi8KKwkJcHJvdGVjdGVkIEl0ZXJhYmxlPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PiBnZXRTb3J0ZWRSZXF1aXJlZEltcG9ydEVudHJpZXMoKSB7CisJCQlUcmVlU2V0PE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PiBzb3J0ZWRFbnRyaWVzID0gbmV3IFRyZWVTZXQ8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4+KHRoaXMuYnVpbGRJbXBvcnRFbnRyaWVzQ29tcGFyYXRvcigpKTsKKwkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoc29ydGVkRW50cmllcywgdGhpcy5nZXRSZXF1aXJlZEltcG9ydEVudHJpZXMoKSk7CisJCQlyZXR1cm4gc29ydGVkRW50cmllczsKKwkJfQorCisJCXByb3RlY3RlZCBDb21wYXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PiBidWlsZEltcG9ydEVudHJpZXNDb21wYXJhdG9yKCkgeworCQkJcmV0dXJuIElNUE9SVF9FTlRSSUVTX0NPTVBBUkFUT1I7CisJCX0KKworCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4+IElNUE9SVF9FTlRSSUVTX0NPTVBBUkFUT1IgPSBuZXcgSW1wb3J0RW50cmllc0NvbXBhcmF0b3IoKTsKKworCQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEltcG9ydEVudHJpZXNDb21wYXJhdG9yCisJCQlpbXBsZW1lbnRzIENvbXBhcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4+CisJCXsKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiBlMSwgTWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4gZTIpIHsKKwkJCQlDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7CisJCQkJaW50IHBrZyA9IGNvbGxhdG9yLmNvbXBhcmUoZTEuZ2V0VmFsdWUoKS5wYWNrYWdlTmFtZSwgZTIuZ2V0VmFsdWUoKS5wYWNrYWdlTmFtZSk7CisJCQkJcmV0dXJuIChwa2cgPT0gMCkgPyBjb2xsYXRvci5jb21wYXJlKGUxLmdldEtleSgpLCBlMi5nZXRLZXkoKSkgOiBwa2c7CisJCQl9CisJCX0KKworCQkvKioKKwkJICogc3RyaXAgb2ZmIGFueSBub24tcmVxdWlyZWQgaW1wb3J0cyAoZS5nLiAiamF2YS5sYW5nLk9iamVjdCcpCisJCSAqLworCQlwcm90ZWN0ZWQgSXRlcmFibGU8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4+IGdldFJlcXVpcmVkSW1wb3J0RW50cmllcygpIHsKKwkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4sIE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+Pih0aGlzLmltcG9ydHMuZW50cnlTZXQoKSwgdGhpcy5idWlsZFJlcXVpcmVkSW1wb3J0RW50cmllc0ZpbHRlcigpKTsKKwkJfQorCisJCXByb3RlY3RlZCBGaWx0ZXI8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4+IGJ1aWxkUmVxdWlyZWRJbXBvcnRFbnRyaWVzRmlsdGVyKCkgeworCQkJcmV0dXJuIG5ldyBSZXF1aXJlZEltcG9ydEVudHJpZXNGaWx0ZXIoKTsKKwkJfQorCisJCXByb3RlY3RlZCBjbGFzcyBSZXF1aXJlZEltcG9ydEVudHJpZXNGaWx0ZXIKKwkJCWltcGxlbWVudHMgRmlsdGVyPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PgorCQl7CisJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoTWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4gaW1wb3J0RW50cnkpIHsKKwkJCQlyZXR1cm4gdGhpcy5wYWNrYWdlTXVzdEJlSW1wb3J0ZWQoaW1wb3J0RW50cnkuZ2V0VmFsdWUoKSk7CisJCQl9CisKKwkJCXByb3RlY3RlZCBib29sZWFuIHBhY2thZ2VNdXN0QmVJbXBvcnRlZChJbXBvcnRQYWNrYWdlIGltcG9ydFBhY2thZ2UpIHsKKwkJCQlTdHJpbmcgcGtnID0gaW1wb3J0UGFja2FnZS5wYWNrYWdlTmFtZTsKKwkJCQlpZiAocGtnLmVxdWFscygiIikpIHsKKwkJCQkJLy8gY2Fubm90IGltcG9ydCBhIHR5cGUgZnJvbSB0aGUgInVubmFtZWQiIHBhY2thZ2UKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlpZiAocGtnLmVxdWFscygiamF2YS5sYW5nIikpIHsKKwkJCQkJLy8gd2UgbXVzdCBpbXBvcnQgZnJvbSAnamF2YS5sYW5nJyBpZiB3ZSBhbHNvIGhhdmUgYSBjbGFzcyBpbiB0aGUgc2FtZSBwYWNrYWdlCisJCQkJCXJldHVybiBpbXBvcnRQYWNrYWdlLmNvbGxpc2lvbjsKKwkJCQl9CisJCQkJaWYgKHBrZy5lcXVhbHMoQm9keVNvdXJjZVdyaXRlci50aGlzLnBhY2thZ2VOYW1lKSkgeworCQkJCQkvLyB3ZSBuZXZlciBuZWVkIHRvIGltcG9ydCBhIGNsYXNzIGZyb20gdGhlIHNhbWUgcGFja2FnZQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIFdlIG5lZWQgYSAnY29sbGlzaW9uJyBmbGFnIGZvciB3aGVuIHdlIGVuY291bnRlciBhIGNsYXNzIGZyb20KKwkJICogJ2phdmEubGFuZycgZm9sbG93ZWQgYnkgYSBjbGFzcyBmcm9tIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQncworCQkgKiBwYWNrYWdlLiBXZSB3aWxsIG5lZWQgdG8gaW5jbHVkZSB0aGUgZXhwbGljaXQgaW1wb3J0IG9mIHRoZQorCQkgKiAnamF2YS5sYW5nJyBjbGFzcyBhbmQgYWxsIHRoZSByZWZlcmVuY2VzIHRvIHRoZSBvdGhlciBjbGFzcyB3aWxsCisJCSAqIGhhdmUgdG8gYmUgZnVsbHktcXVhbGlmaWVkLgorCQkgKiAKKwkJICogSWYgdGhlIGNsYXNzZXMgYXJlIGVuY291bnRlcmVkIGluIHRoZSBvcHBvc2l0ZSBvcmRlciAoaS5lLiB0aGUgY2xhc3MKKwkJICogZnJvbSB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0J3MgcGFja2FnZSBmb2xsb3dlZCBieSB0aGUgY2xhc3MKKwkJICogZnJvbSAnamF2YS5sYW5nJyksIHdlIGRvICpub3QqIG5lZWQgdG8gaW1wb3J0IHRoZSBmaXJzdCBjbGFzcyB3aGlsZQorCQkgKiBhbGwgdGhlIHJlZmVyZW5jZXMgdG8gdGhlICdqYXZhLmxhbmcnIGNsYXNzIHdpbGwgYmUgZnVsbHktcXVhbGlmaWVkLgorCQkgKiAKKwkJICogVW5mb3J0dW5hdGVseSwgd2Ugc3RpbGwgaGF2ZSBhIHByb2JsZW06IGlmIHdlIHJlZmVyZW5jZSBhIGNsYXNzIGZyb20KKwkJICogJ2phdmEubGFuZycgYW5kIHRoZXJlIGlzIGEgY29uZmxpY3RpbmcgY2xhc3MgZnJvbSB0aGUgY3VycmVudAorCQkgKiBjb21waWxhdGlvbiB1bml0J3MgcGFja2FnZSAoYnV0IHRoYXQgY2xhc3MgaXMgKm5vdCogcmV2ZWFsZWQgdG8gdXMKKwkJICogaGVyZSksIHRoZSBzaW1wbGUgbmFtZSB3aWxsIGJlIHJlc29sdmVkIHRvIHRoZSBub24tJ2phdmEubGFuZycgY2xhc3MuCisJCSAqIFVubGVzcyB3ZSBzaW1wbHkgZm9yY2UgYW4gaW1wb3J0IG9mICphbGwqICdqYXZhLmxhbmcnIGNsYXNzZXMuLi4uIDotKAorCQkgKiAKKwkJICogVGhpcyBzaG91bGRuJ3QgaGFwcGVuIHZlcnkgb2Z0ZW4uIDotKQorCQkgKi8KKwkJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBJbXBvcnRQYWNrYWdlIHsKKwkJCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWU7CisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBjb2xsaXNpb24gPSBmYWxzZTsKKworCQkJcHJvdGVjdGVkIEltcG9ydFBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisJCQkJc3VwZXIoKTsKKwkJCQl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisJCQl9CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvTnVsbE1ldGFtb2RlbFN5bmNocm9uaXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvTnVsbE1ldGFtb2RlbFN5bmNocm9uaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTg0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9OdWxsTWV0YW1vZGVsU3luY2hyb25pemVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLk1ldGFtb2RlbFN5bmNocm9uaXplcjsKKworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIE51bGxNZXRhbW9kZWxTeW5jaHJvbml6ZXIKKwlpbXBsZW1lbnRzIE1ldGFtb2RlbFN5bmNocm9uaXplcgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxNZXRhbW9kZWxTeW5jaHJvbml6ZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbE1ldGFtb2RlbFN5bmNocm9uaXplcigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBNZXRhbW9kZWxTeW5jaHJvbml6ZXIgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgTnVsbE1ldGFtb2RlbFN5bmNocm9uaXplcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZShQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgeworCQkvLyBOT1AKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL051bGxQZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvTnVsbFBlcnNpc3RlbnRUeXBlTWV0YW1vZGVsU3luY2hyb25pemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyOWUyOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL051bGxQZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplci5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuUGVyc2lzdGVudFR5cGVNZXRhbW9kZWxTeW5jaHJvbml6ZXI7CisKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsUGVyc2lzdGVudFR5cGVNZXRhbW9kZWxTeW5jaHJvbml6ZXIKKwlpbXBsZW1lbnRzIFBlcnNpc3RlbnRUeXBlTWV0YW1vZGVsU3luY2hyb25pemVyCit7CisKKworCXB1YmxpYyBOdWxsUGVyc2lzdGVudFR5cGVNZXRhbW9kZWxTeW5jaHJvbml6ZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7CisJCS8vbm8tb3AKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L1NpbXBsZU1ldGFtb2RlbEZpZWxkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L1NpbXBsZU1ldGFtb2RlbEZpZWxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYxNWMzOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvU2ltcGxlTWV0YW1vZGVsRmllbGQuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworCisvKioKKyAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFNpbXBsZU1ldGFtb2RlbEZpZWxkCisJaW1wbGVtZW50cyBNZXRhbW9kZWxGaWVsZAoreworCXByb3RlY3RlZCBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IG1vZGlmaWVyczsKKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHR5cGVOYW1lOworCXByb3RlY3RlZCBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IHR5cGVBcmd1bWVudE5hbWVzOworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgbmFtZTsKKworCXB1YmxpYyBTaW1wbGVNZXRhbW9kZWxGaWVsZCgKKwkJCUl0ZXJhYmxlPFN0cmluZz4gbW9kaWZpZXJzLAorCQkJU3RyaW5nIHR5cGVOYW1lLAorCQkJSXRlcmFibGU8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcywKKwkJCVN0cmluZyBuYW1lCisJKSB7CisJCXN1cGVyKCk7CisJCWlmIChtb2RpZmllcnMgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJaWYgKHR5cGVOYW1lID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCWlmICh0eXBlQXJndW1lbnROYW1lcyA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKwkJfQorCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKwkJfQorCQl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKwkJdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOworCQl0aGlzLnR5cGVBcmd1bWVudE5hbWVzID0gdHlwZUFyZ3VtZW50TmFtZXM7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TW9kaWZpZXJzKCkgeworCQlyZXR1cm4gdGhpcy5tb2RpZmllcnM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudHlwZU5hbWU7CisJfQorCisJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0VHlwZUFyZ3VtZW50TmFtZXMoKSB7CisJCXJldHVybiB0aGlzLnR5cGVBcmd1bWVudE5hbWVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmhhc2hDb2RlKHRoaXMubW9kaWZpZXJzKSBeCisJCQkJCXRoaXMudHlwZU5hbWUuaGFzaENvZGUoKSBeCisJCQkJCUNvbGxlY3Rpb25Ub29scy5oYXNoQ29kZSh0aGlzLnR5cGVBcmd1bWVudE5hbWVzKSBeCisJCQkJCXRoaXMubmFtZS5oYXNoQ29kZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBNZXRhbW9kZWxGaWVsZCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlNZXRhbW9kZWxGaWVsZCBvdGhlciA9IChNZXRhbW9kZWxGaWVsZCkgbzsKKwkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHRoaXMuZ2V0TW9kaWZpZXJzKCksIG90aGVyLmdldE1vZGlmaWVycygpKSAmJgorCQkJCQl0aGlzLmdldFR5cGVOYW1lKCkuZXF1YWxzKG90aGVyLmdldFR5cGVOYW1lKCkpICYmCisJCQkJCUNvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHRoaXMuZ2V0VHlwZUFyZ3VtZW50TmFtZXMoKSwgb3RoZXIuZ2V0VHlwZUFyZ3VtZW50TmFtZXMoKSkgJiYKKwkJCQkJdGhpcy5nZXROYW1lKCkuZXF1YWxzKG90aGVyLmdldE5hbWUoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZvciAoU3RyaW5nIG1vZGlmaWVyIDogdGhpcy5tb2RpZmllcnMpIHsKKwkJCXNiLmFwcGVuZChtb2RpZmllcik7CisJCQlzYi5hcHBlbmQoJyAnKTsKKwkJfQorCQlzYi5hcHBlbmQodGhpcy50eXBlTmFtZSk7CisJCXNiLmFwcGVuZCgnPCcpOworCQlmb3IgKFN0cmluZyB0eXBlQXJndW1lbnROYW1lIDogdGhpcy50eXBlQXJndW1lbnROYW1lcykgeworCQkJc2IuYXBwZW5kKHR5cGVBcmd1bWVudE5hbWUpOworCQkJc2IuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJc2Iuc2V0TGVuZ3RoKHNiLmxlbmd0aCgpIC0gMik7CisJCXNiLmFwcGVuZCgnPicpOworCQlzYi5hcHBlbmQoJyAnKTsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NzI4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGVJbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAgZXh0ZW5kcyBBYnN0cmFjdEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlCisJaW1wbGVtZW50cyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMAoreworCisJcHJvdGVjdGVkIGZpbmFsIEphdmFKb2luVGFibGVJbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kyXzAgam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworCisJcHVibGljIEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMChKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgPSBidWlsZEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlIG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJaWYgKG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkpIHsKKwkJCWdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5pbml0aWFsaXplRnJvbShvbGRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSk7CisJCX0KKwkJZWxzZSB7CisJCQlnZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5pbml0aWFsaXplRnJvbSgoKEFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzApIG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgSmF2YUpvaW5UYWJsZUluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneTJfMCBidWlsZEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUpvaW5UYWJsZUluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneTJfMCh0aGlzKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUl0ZXJhdG9yPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJcmVzdWx0ID0gdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVnaWVzKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVnaWVzKGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQl0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5pbml0aWFsaXplKChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUpvaW5pbmdTdHJhdGVnaWVzKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJc3VwZXIudXBkYXRlSm9pbmluZ1N0cmF0ZWdpZXMoYXNzb2NpYXRpb25PdmVycmlkZSk7CisJCXRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5LnVwZGF0ZSgoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCX0KKwkJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpvaW5pbmdTdHJhdGVneSBjYWxjdWxhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHsKKwkJaWYgKHRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpKSB7CisJCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCQl9CisJCXJldHVybiB0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisvLwkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpKSB7CisvLwkJCXRoaXMudmFsaWRhdGVKb2luVGFibGUobWVzc2FnZXMsIGFzdFJvb3QpOworLy8JCX0KKwl9CisKKworCisJLy8gKioqKioqKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCisJcHVibGljIEphdmFKb2luVGFibGVJbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kyXzAgZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBnZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpID09IHRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSB7CisJCXRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1bnNldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luVGFibGUoKSB7CisJCXJldHVybiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuaXNWaXJ0dWFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpIHsKKwkJc3VwZXIuc2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQl0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNhY2hlYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ2FjaGVhYmxlMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxZmI4YgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNhY2hlYWJsZTJfMC5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5DYWNoZWFibGUyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUNhY2hlYWJsZTJfMAorCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUgCisJaW1wbGVtZW50cyBKYXZhQ2FjaGVhYmxlMl8wCit7CisJcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdENhY2hlYWJsZTsKKwlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRDYWNoZWFibGU7CisJCisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGU7CisJCisJcHVibGljIEdlbmVyaWNKYXZhQ2FjaGVhYmxlMl8wKEphdmFDYWNoZWFibGVIb2xkZXIyXzAgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFDYWNoZWFibGVIb2xkZXIyXzAgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEphdmFDYWNoZWFibGVIb2xkZXIyXzApIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldENhY2hlYWJsZUFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXByb3RlY3RlZCBDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGdldFJlc291cmNlQ2FjaGVhYmxlKCkgeworCQlyZXR1cm4gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRBbm5vdGF0aW9uKGdldENhY2hlYWJsZUFubm90YXRpb25OYW1lKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZUNhY2hlYWJsZSgpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oZ2V0Q2FjaGVhYmxlQW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlQ2FjaGVhYmxlKCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUucmVtb3ZlQW5ub3RhdGlvbihnZXRDYWNoZWFibGVBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgewkJCisJCXJldHVybiBnZXRQYXJlbnQoKS5jYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNDYWNoZWFibGUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZENhY2hlYWJsZSAhPSBudWxsID8gdGhpcy5zcGVjaWZpZWRDYWNoZWFibGUuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmRlZmF1bHRDYWNoZWFibGU7IAorCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRDYWNoZWFibGUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRDYWNoZWFibGU7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDYWNoZWFibGUoYm9vbGVhbiBuZXdEZWZhdWx0Q2FjaGVhYmxlKSB7CisJCWJvb2xlYW4gb2xkRGVmYXVsdENhY2hlYWJsZSA9IHRoaXMuZGVmYXVsdENhY2hlYWJsZTsKKwkJdGhpcy5kZWZhdWx0Q2FjaGVhYmxlID0gbmV3RGVmYXVsdENhY2hlYWJsZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBQ0hFQUJMRV9QUk9QRVJUWSwgb2xkRGVmYXVsdENhY2hlYWJsZSwgbmV3RGVmYXVsdENhY2hlYWJsZSk7CisJfQorCQorCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZENhY2hlYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ2FjaGVhYmxlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRDYWNoZWFibGUpIHsKKwkJaWYgKHRoaXMuc3BlY2lmaWVkQ2FjaGVhYmxlID09IG5ld1NwZWNpZmllZENhY2hlYWJsZSkgeworCQkJcmV0dXJuOworCQl9CisJCUJvb2xlYW4gb2xkU3BlY2lmaWVkQ2FjaGVhYmxlID0gdGhpcy5zcGVjaWZpZWRDYWNoZWFibGU7CisJCXRoaXMuc3BlY2lmaWVkQ2FjaGVhYmxlID0gbmV3U3BlY2lmaWVkQ2FjaGVhYmxlOworCisJCWlmIChuZXdTcGVjaWZpZWRDYWNoZWFibGUgIT0gbnVsbCkgeworCQkJaWYgKGdldFJlc291cmNlQ2FjaGVhYmxlKCkgPT0gbnVsbCkgeworCQkJCWFkZFJlc291cmNlQ2FjaGVhYmxlKCk7CisJCQl9CisJCQlpZiAobmV3U3BlY2lmaWVkQ2FjaGVhYmxlLmJvb2xlYW5WYWx1ZSgpKSB7CisJCQkJaWYgKGdldFJlc291cmNlQ2FjaGVhYmxlKCkuZ2V0VmFsdWUoKSA9PSBCb29sZWFuLkZBTFNFKSB7CisJCQkJCWdldFJlc291cmNlQ2FjaGVhYmxlKCkuc2V0VmFsdWUobnVsbCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJZ2V0UmVzb3VyY2VDYWNoZWFibGUoKS5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCXJlbW92ZVJlc291cmNlQ2FjaGVhYmxlKCk7CisJCX0KKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ0FDSEVBQkxFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRDYWNoZWFibGUsIG5ld1NwZWNpZmllZENhY2hlYWJsZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENhY2hlYWJsZV8oQm9vbGVhbiBuZXdTcGVjaWZpZWRDYWNoZWFibGUpIHsKKwkJQm9vbGVhbiBvbGRTcGVjaWZpZWRDYWNoZWFibGUgPSB0aGlzLnNwZWNpZmllZENhY2hlYWJsZTsKKwkJdGhpcy5zcGVjaWZpZWRDYWNoZWFibGUgPSBuZXdTcGVjaWZpZWRDYWNoZWFibGU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NBQ0hFQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ2FjaGVhYmxlLCBuZXdTcGVjaWZpZWRDYWNoZWFibGUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0ganJwdDsKKwkJQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZUNhY2hlYWJsZSA9IHRoaXMuZ2V0UmVzb3VyY2VDYWNoZWFibGUoKTsKKwkJdGhpcy5zcGVjaWZpZWRDYWNoZWFibGUgPSB0aGlzLnNwZWNpZmllZENhY2hlYWJsZShyZXNvdXJjZUNhY2hlYWJsZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpycHQ7CisJCUNhY2hlYWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2VDYWNoZWFibGUgPSB0aGlzLmdldFJlc291cmNlQ2FjaGVhYmxlKCk7CisJCXRoaXMuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlXyh0aGlzLnNwZWNpZmllZENhY2hlYWJsZShyZXNvdXJjZUNhY2hlYWJsZSkpOworCQl0aGlzLnNldERlZmF1bHRDYWNoZWFibGUodGhpcy5jYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkpOworCX0KKwkKKwlwcml2YXRlIEJvb2xlYW4gc3BlY2lmaWVkQ2FjaGVhYmxlKENhY2hlYWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2VDYWNoZWFibGUpIHsKKwkJaWYgKHJlc291cmNlQ2FjaGVhYmxlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmIChyZXNvdXJjZUNhY2hlYWJsZS5nZXRWYWx1ZSgpID09IG51bGwpIHsgLy9AQ2FjaGVhYmxlIGlzIGVxdWl2YWxlbnQgdG8gQENhY2hlYWJsZSh0cnVlKQorCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwkJfQorCQlyZXR1cm4gcmVzb3VyY2VDYWNoZWFibGUuZ2V0VmFsdWUoKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUNhY2hlYWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2VDYWNoZWFibGUgPSB0aGlzLmdldFJlc291cmNlQ2FjaGVhYmxlKCk7CisJCXJldHVybiByZXNvdXJjZUNhY2hlYWJsZSA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlQ2FjaGVhYmxlLmdldFRleHRSYW5nZShhc3RSb290KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFEZXJpdmVkSWQyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YURlcml2ZWRJZDJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZDI0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFEZXJpdmVkSWQyXzAuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRGVyaXZlZElkMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFEZXJpdmVkSWQyXzAKKwlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCisJaW1wbGVtZW50cyBKYXZhRGVyaXZlZElkMl8wCit7CisJcHJvdGVjdGVkIGJvb2xlYW4gdmFsdWU7CisJCisJCisJcHVibGljIEdlbmVyaWNKYXZhRGVyaXZlZElkMl8wKEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSB7CisJCXJldHVybiBnZXRQYXJlbnQoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0VmFsdWUoYm9vbGVhbiBuZXdWYWx1ZSkgeworCQlpZiAodGhpcy52YWx1ZSA9PSBuZXdWYWx1ZSkgeworCQkJcmV0dXJuOworCQl9CisJCWJvb2xlYW4gb2xkVmFsdWUgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7CisJCQorCQlpZiAobmV3VmFsdWUpIHsKKwkJCWFkZElkQW5ub3RhdGlvbigpOworCQl9CisJCWVsc2UgeworCQkJcmVtb3ZlSWRBbm5vdGF0aW9uKCk7CisJCX0KKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKGJvb2xlYW4gbmV3VmFsdWUpIHsKKwkJYm9vbGVhbiBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gZ2V0UmVzb3VyY2VEZXJpdmVkSWQoKSB7CisJCXJldHVybiBnZXRJZEFubm90YXRpb24oKSAhPSBudWxsOworCX0KKwkKKwlwcm90ZWN0ZWQgSWRBbm5vdGF0aW9uIGdldElkQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIChJZEFubm90YXRpb24pIGdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKUEEuSUQpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRJZEFubm90YXRpb24oKSB7CisJCWdldFJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihKUEEuSUQpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJZEFubm90YXRpb24oKSB7CisJCWdldFJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKUEEuSUQpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgeworCQl0aGlzLnZhbHVlID0gZ2V0UmVzb3VyY2VEZXJpdmVkSWQoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl0aGlzLnNldFZhbHVlXyhnZXRSZXNvdXJjZURlcml2ZWRJZCgpKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUlkQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRJZEFubm90YXRpb24oKTsKKwkJcmV0dXJuIGFubm90YXRpb24gPT0gbnVsbCA/IG51bGwgOiBhbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJLy8gbm8gdmFsaWRhdGlvbiBydWxlcworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1M2FmYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbj4KKwlpbXBsZW1lbnRzIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAKK3sKKwkJcHJvdGVjdGVkIEZldGNoVHlwZSBzcGVjaWZpZWRGZXRjaDsKKworCXB1YmxpYyBHZW5lcmljSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZSgpOworCQl0aGlzLnNwZWNpZmllZEZldGNoID0gdGhpcy5nZXRSZXNvdXJjZUZldGNoKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0U3BlY2lmaWVkRmV0Y2hfKHRoaXMuZ2V0UmVzb3VyY2VGZXRjaCgpKTsKKwl9CisKKwkvLyoqKioqKioqKioqKioqIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ1tdIGJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKKwkJcmV0dXJuIEFycmF5VG9vbHMuYWRkQWxsKAorCQkJc3VwZXIuYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCisJCQlKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsCisJCQlKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTLAorCQkJSlBBLkFUVFJJQlVURV9PVkVSUklERSwKKwkJCUpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTLAorCQkJLy9KUEEyXzAuQ09MTEVDVElPTl9UQUJMRSwKKwkJCUpQQS5DT0xVTU4sCisJCQlKUEEuRU5VTUVSQVRFRCwKKwkJCUpQQS5MT0IsCisJCQlKUEEuTUFQX0tFWSwKKwkJCS8vSlBBMl8wLk1BUF9LRVlfQ0xBU1MsCisJCQkvL0pQQTJfMC5NQVBfS0VZX0NPTFVNTiwKKwkJCS8vSlBBMl8wLk1BUF9LRVlfRU5VTUVSQVRFRCwKKwkJCS8vSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4sCisJCQkvL0pQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OUywKKwkJCS8vSlBBMl8wLk1BUF9LRVlfVEVNUE9SQUwsCisJCQlKUEEuT1JERVJfQlksCisJCQkvL0pQQTJfMC5PUkRFUl9DT0xVTU4sCisJCQlKUEEuVEVNUE9SQUwKKwkJCSk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiBGZXRjaCAqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkRmV0Y2goKSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdEZldGNoKCkgOiB0aGlzLmdldFNwZWNpZmllZEZldGNoKCk7CisJfQorCisJcHVibGljIEZldGNoVHlwZSBnZXREZWZhdWx0RmV0Y2goKSB7CisJCXJldHVybiBERUZBVUxUX0ZFVENIX1RZUEU7CisJfQorCQkKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldFNwZWNpZmllZEZldGNoKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRGZXRjaDsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlIG5ld1NwZWNpZmllZEZldGNoKSB7CisJCUZldGNoVHlwZSBvbGRGZXRjaCA9IHRoaXMuc3BlY2lmaWVkRmV0Y2g7CisJCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSBuZXdTcGVjaWZpZWRGZXRjaDsKKwkJdGhpcy5tYXBwaW5nQW5ub3RhdGlvbi5zZXRGZXRjaChGZXRjaFR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRGZXRjaCkpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEZldGNoYWJsZS5TUEVDSUZJRURfRkVUQ0hfUFJPUEVSVFksIG9sZEZldGNoLCBuZXdTcGVjaWZpZWRGZXRjaCk7CisJfQorCQorCS8qKgorCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgorCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCisJICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgorCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRmV0Y2hfKEZldGNoVHlwZSBuZXdTcGVjaWZpZWRGZXRjaCkgeworCQlGZXRjaFR5cGUgb2xkRmV0Y2ggPSB0aGlzLnNwZWNpZmllZEZldGNoOworCQl0aGlzLnNwZWNpZmllZEZldGNoID0gbmV3U3BlY2lmaWVkRmV0Y2g7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRmV0Y2hhYmxlLlNQRUNJRklFRF9GRVRDSF9QUk9QRVJUWSwgb2xkRmV0Y2gsIG5ld1NwZWNpZmllZEZldGNoKTsKKwl9CisJCisJcHJvdGVjdGVkIEZldGNoVHlwZSBnZXRSZXNvdXJjZUZldGNoKCkgeworCQlyZXR1cm4gRmV0Y2hUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbCh0aGlzLm1hcHBpbmdBbm5vdGF0aW9uLmdldEZldGNoKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkYWJsZTJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOWJkODMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRhYmxlMl8wLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworCisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVtYmVkZGFibGUyXzAKKwlleHRlbmRzIEFic3RyYWN0SmF2YUVtYmVkZGFibGUKK3sKKwlwdWJsaWMgR2VuZXJpY0phdmFFbWJlZGRhYmxlMl8wKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoU3RyaW5nIGF0dHJpYnV0ZU1hcHBpbmdLZXkpIHsKKwkJcmV0dXJuIEFycmF5VG9vbHMuY29udGFpbnMoQUxMT1dFRF9BVFRSSUJVVEVfTUFQUElOR19LRVlTLCBhdHRyaWJ1dGVNYXBwaW5nS2V5KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFMTE9XRURfQVRUUklCVVRFX01BUFBJTkdfS0VZUyA9CisJCW5ldyBTdHJpbmdbXSB7CisJCQlNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksCisJCQlNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksCisJCQlNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksCisJCQlNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwKKwkJCU1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksCisJCQlNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLAorCQkJTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLAorCQkJTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWQorCQl9OworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luVGFibGVJbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUpvaW5UYWJsZUluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneTJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MDllZmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luVGFibGVJbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kyXzAuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGVJbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhSm9pblRhYmxlSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5Ml8wIAorCWV4dGVuZHMgQWJzdHJhY3RKYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5CisJaW1wbGVtZW50cyBKYXZhSm9pblRhYmxlSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5Ml8wCit7CisJcHJvdGVjdGVkIHRyYW5zaWVudCBBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFKb2luVGFibGVJbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kyXzAoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbigpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wKSBzdXBlci5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKiBqb2luIHRhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBKb2luVGFibGVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7CisJCXJldHVybiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLmdldE5vbk51bGxKb2luVGFibGUoKTsKKwl9CisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpvaW5UYWJsZUFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uYWRkSm9pblRhYmxlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7CisJCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24ucmVtb3ZlSm9pblRhYmxlKCk7CisJfQorCisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gPSBhc3NvY2lhdGlvbk92ZXJyaWRlOworCQlzdXBlci5pbml0aWFsaXplKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZShBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gPSBhc3NvY2lhdGlvbk92ZXJyaWRlOworCQlzdXBlci51cGRhdGUoKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYXBzSWQyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hcHNJZDJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjY2QyY2EKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYXBzSWQyXzAuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYXBzSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwc0lkMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTWFwc0lkMl8wCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgSmF2YU1hcHNJZDJfMAoreworCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7CisJCisJCisJcHVibGljIEdlbmVyaWNKYXZhTWFwc0lkMl8wKEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSB7CisJCXJldHVybiBnZXRQYXJlbnQoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKKwkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh0aGlzLnZhbHVlLCBuZXdWYWx1ZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7CisJCQorCQlpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworCQkJZ2V0TWFwc0lkQW5ub3RhdGlvbigpLnNldFZhbHVlKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIHsKKwkJCXJlbW92ZU1hcHNJZEFubm90YXRpb24oKTsKKwkJfQorCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIG5ld1ZhbHVlKSB7CisJCVN0cmluZyBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZU1hcHNJZCgpIHsKKwkJcmV0dXJuIGdldE1hcHNJZEFubm90YXRpb24oKS5nZXRWYWx1ZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgTWFwc0lkMl8wQW5ub3RhdGlvbiBnZXRNYXBzSWRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKE1hcHNJZDJfMEFubm90YXRpb24pIGdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0Tm9uTnVsbEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNYXBzSWRBbm5vdGF0aW9uKCkgeworCQlnZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgeworCQl0aGlzLnZhbHVlID0gZ2V0UmVzb3VyY2VNYXBzSWQoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl0aGlzLnNldFZhbHVlXyhnZXRSZXNvdXJjZU1hcHNJZCgpKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldE1hcHNJZEFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCS8vIG5vIHZhbGlkYXRpb24gcnVsZXMKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5ZGI3NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKKworLyoqCisgKiAgR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nMl8wCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAKKwlleHRlbmRzIEdlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZzxPbmVUb01hbnkyXzBBbm5vdGF0aW9uPgoreworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCisJcHVibGljIEdlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZzJfMChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nW10gYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgeworCQlyZXR1cm4gQXJyYXlUb29scy5hZGRBbGwoCisJCQlzdXBlci5idWlsZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKKwkJCUpQQTJfMC5PTkVfVE9fTUFOWV9fT1JQSEFOX1JFTU9WQUwpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvT25lTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExMmZiYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvT25lTWFwcGluZzJfMC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CisKKy8qKgorICogIEdlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nMl8wCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU9uZVRvT25lTWFwcGluZzJfMAorCWV4dGVuZHMgR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcKK3sKKwkKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKKwlwdWJsaWMgR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcyXzAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmdbXSBidWlsZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7CisJCXJldHVybiBBcnJheVRvb2xzLmFkZEFsbCgKKwkJCXN1cGVyLmJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAorCQkJSlBBMl8wLk9ORV9UT19PTkVfX09SUEhBTl9SRU1PVkFMKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPcnBoYW5SZW1vdmFsMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPcnBoYW5SZW1vdmFsMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4N2YwNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9ycGhhblJlbW92YWwyXzAuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9ycGhhblJlbW92YWJsZTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqICBHZW5lcmljSmF2YU9ycGhhblJlbW92YWwyXzAKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhT3JwaGFuUmVtb3ZhbDJfMAorCQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlIAorCQlpbXBsZW1lbnRzIEphdmFPcnBoYW5SZW1vdmFibGUyXzAKK3sKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0T3JwaGFuUmVtb3ZhbDsKKwlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRPcnBoYW5SZW1vdmFsOworCQorCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFPcnBoYW5SZW1vdmFsMl8wKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzAgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuICgoSmF2YUF0dHJpYnV0ZU1hcHBpbmcpZ2V0UGFyZW50KCkpLmdldEFubm90YXRpb25OYW1lKCk7CisJfQorCQorCXByb3RlY3RlZCBPcnBoYW5SZW1vdmFibGUyXzBBbm5vdGF0aW9uIGdldFJlc291cmNlT3JwaGFuUmVtb3ZhYmxlKCkgeworCQlyZXR1cm4gKE9ycGhhblJlbW92YWJsZTJfMEFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFubm90YXRpb24odGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJLy8gKioqKioqKioqKiBPcnBoYW5SZW1vdmFibGUyXzAgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIGJvb2xlYW4gaXNPcnBoYW5SZW1vdmFsKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRPcnBoYW5SZW1vdmFsICE9IG51bGwgPyB0aGlzLnNwZWNpZmllZE9ycGhhblJlbW92YWwuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmRlZmF1bHRPcnBoYW5SZW1vdmFsOyAKKwl9CisJCisJcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdE9ycGhhblJlbW92YWw7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRPcnBoYW5SZW1vdmFsKGJvb2xlYW4gbmV3RGVmYXVsdE9ycGhhblJlbW92YWwpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRPcnBoYW5SZW1vdmFsOworCQl0aGlzLmRlZmF1bHRPcnBoYW5SZW1vdmFsID0gbmV3RGVmYXVsdE9ycGhhblJlbW92YWw7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09SUEhBTl9SRU1PVkFMX1BST1BFUlRZLCBvbGQsIG5ld0RlZmF1bHRPcnBoYW5SZW1vdmFsKTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuIG5ld09ycGhhblJlbW92YWwpIHsKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZE9ycGhhblJlbW92YWw7CisJCXRoaXMuc3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCA9IG5ld09ycGhhblJlbW92YWw7CisJCXRoaXMuZ2V0UmVzb3VyY2VPcnBoYW5SZW1vdmFibGUoKS5zZXRPcnBoYW5SZW1vdmFsKG5ld09ycGhhblJlbW92YWwpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX09SUEhBTl9SRU1PVkFMX1BST1BFUlRZLCBvbGQsIG5ld09ycGhhblJlbW92YWwpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsXyhCb29sZWFuIG5ld1NwZWNpZmllZE9ycGhhblJlbW92YWwpIHsKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZE9ycGhhblJlbW92YWw7CisJCXRoaXMuc3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCA9IG5ld1NwZWNpZmllZE9ycGhhblJlbW92YWw7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfT1JQSEFOX1JFTU9WQUxfUFJPUEVSVFksIG9sZCwgbmV3U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCk7CisJfQorCisJLy8gKioqKioqKioqKiBpbml0aWFsaXplL3VwZGF0ZSAqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqcnBhOworCQlPcnBoYW5SZW1vdmFibGUyXzBBbm5vdGF0aW9uIHJlc291cmNlID0gdGhpcy5nZXRSZXNvdXJjZU9ycGhhblJlbW92YWJsZSgpOworCQl0aGlzLnNwZWNpZmllZE9ycGhhblJlbW92YWwgPSB0aGlzLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWxGcm9tKHJlc291cmNlKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGpycGE7CisJCU9ycGhhblJlbW92YWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2UgPSB0aGlzLmdldFJlc291cmNlT3JwaGFuUmVtb3ZhYmxlKCk7CisJCXRoaXMuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbF8odGhpcy5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsRnJvbShyZXNvdXJjZSkpOworCX0KKwkKKwlwcml2YXRlIEJvb2xlYW4gZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbEZyb20oT3JwaGFuUmVtb3ZhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZSkgeworCQlyZXR1cm4gKHJlc291cmNlID09IG51bGwpID8gbnVsbCA6IHJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKTsKKwl9CisKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCS8vIFRPRE8KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOTBhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk11bHRpUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKKworLyoqCisgKiBKUEEgMi4wIEphdmEgcGVyc2lzdGVudCBhdHRyaWJ1dGUKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMAorCWV4dGVuZHMgQWJzdHJhY3RKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZQorCWltcGxlbWVudHMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAKK3sKKwlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3M7CisKKworCXB1YmxpYyBHZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAoUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gdGhpcy5idWlsZFNwZWNpZmllZEFjY2VzcygpOworCX0KKworCisJLy8gKioqKioqKioqKiBBY2Nlc3NIb2xkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBY2Nlc3M7CisJfQorCisJLyoqCisJICogRG9uJ3Qgc3VwcG9ydCBjaGFuZ2luZyB0byBzcGVjaWZpZWQgYWNjZXNzIG9uIGEgamF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSwgdGhpcworCSAqIGludm9sdmVzIGEgbGFyZ2VyIHByb2Nlc3Mgb2YgbW92aW5nIHRoZSBhbm5vdGF0aW9ucyB0byB0aGUgY29ycmVzcG9uZGluZyBmaWVsZC9wcm9wZXJ0eQorCSAqIHdoaWNoIG1heSBvciBtYXkgbm90IGV4aXN0IG9yIG1pZ2h0IG5lZWQgdG8gYmUgY3JlYXRlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3MpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzXyhBY2Nlc3NUeXBlIHNwZWNpZmllZEFjY2VzcykgeworCQlBY2Nlc3NUeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzOworCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IHNwZWNpZmllZEFjY2VzczsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BQ0NFU1NfUFJPUEVSVFksIG9sZCwgc3BlY2lmaWVkQWNjZXNzKTsKKwl9CisKKwlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBidWlsZFNwZWNpZmllZEFjY2VzcygpIHsKKwkJQWNjZXNzMl8wQW5ub3RhdGlvbiBhY2Nlc3NBbm5vdGF0aW9uID0gCisJCQkJKEFjY2VzczJfMEFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLgorCQkJCQlnZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJcmV0dXJuIGFjY2Vzc0Fubm90YXRpb24gPT0gbnVsbCA/IG51bGwgOiBBY2Nlc3NUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChhY2Nlc3NBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0U3BlY2lmaWVkQWNjZXNzXyh0aGlzLmJ1aWxkU3BlY2lmaWVkQWNjZXNzKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5nZXRKcGFDb250YWluZXIodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0VHlwZU5hbWUoKSkuZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRNYXBLZXlUeXBlTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0SnBhQ29udGFpbmVyKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldFR5cGVOYW1lKCkpLmdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkTWFwS2V5VHlwZU5hbWUoKE11bHRpUmVsYXRpb25zaGlwTWFwcGluZykgdGhpcy5nZXRNYXBwaW5nKCkpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKSB7CisJCVN0cmluZyB0eXBlTmFtZSA9IHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldFR5cGVOYW1lKCk7CisJCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7CisJCX0KKwkJaWYgKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzUHJpbWl0aXZlKHR5cGVOYW1lKSkgeworCQkJcmV0dXJuIENsYXNzVG9vbHMud3JhcHBlckNsYXNzTmFtZSh0eXBlTmFtZSk7ICAvLyA/Pz8KKwkJfQorCQlyZXR1cm4gdHlwZU5hbWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmI4NWQzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzAuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuSnBhUHJvamVjdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzAKKwlleHRlbmRzIEFic3RyYWN0SmF2YVBlcnNpc3RlbnRUeXBlCit7CisJcHVibGljIEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzAoUGVyc2lzdGVudFR5cGUuT3duZXIgcGFyZW50LCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7CisJCXN1cGVyKHBhcmVudCwganJwdCk7CisJfQorCQorCS8qKgorCSAqIGNvdmFyaWFudCBvdmVycmlkZQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBKcGFQcm9qZWN0Ml8wIGdldEpwYVByb2plY3QoKSB7CisJCXJldHVybiAoSnBhUHJvamVjdDJfMCkgc3VwZXIuZ2V0SnBhUHJvamVjdCgpOworCX0KKwkKKwlwcm90ZWN0ZWQgQWNjZXNzMl8wQW5ub3RhdGlvbiBnZXRBY2Nlc3NBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKEFjY2VzczJfMEFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS4KKwkJCQlnZXROb25OdWxsQW5ub3RhdGlvbihnZXRBY2Nlc3NBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRBY2Nlc3NBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBidWlsZFNwZWNpZmllZEFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUgc3BlY2lmaWVkQWNjZXNzKSB7CisJCUFjY2Vzc1R5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRBY2Nlc3M7CisJCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gc3BlY2lmaWVkQWNjZXNzOworCQl0aGlzLmdldEFjY2Vzc0Fubm90YXRpb24oKS5zZXRWYWx1ZShBY2Nlc3NUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwoc3BlY2lmaWVkQWNjZXNzKSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZEFjY2Vzcyk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEFjY2Vzc18oQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3MpIHsKKwkJQWNjZXNzVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZEFjY2VzczsKKwkJdGhpcy5zcGVjaWZpZWRBY2Nlc3MgPSBzcGVjaWZpZWRBY2Nlc3M7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZEFjY2Vzcyk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiByZXNvdXJjZUF0dHJpYnV0ZXMoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRBY2Nlc3MgPT0gbnVsbCkKKwkJCT8gc3VwZXIucmVzb3VyY2VBdHRyaWJ1dGVzKCkKKwkJCTogdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnBlcnNpc3RhYmxlQXR0cmlidXRlcyhBY2Nlc3NUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwodGhpcy5zcGVjaWZpZWRBY2Nlc3MpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlQWNjZXNzKCkgeworCQlzdXBlci51cGRhdGVBY2Nlc3MoKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRBY2Nlc3NfKHRoaXMuZ2V0UmVzb3VyY2VBY2Nlc3MoKSk7CisJfQorCisJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZ2V0UmVzb3VyY2VBY2Nlc3MoKSB7CisJCXJldHVybiBBY2Nlc3NUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbCh0aGlzLmdldEFjY2Vzc0Fubm90YXRpb24oKS5nZXRWYWx1ZSgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MmFiMTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMC5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3IyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKKworLyoqCisgKiAgR2VuZXJpYzJfMEphdmFTZXF1ZW5jZUdlbmVyYXRvcgorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMCBleHRlbmRzIEFic3RyYWN0SmF2YVNlcXVlbmNlR2VuZXJhdG9yCisJaW1wbGVtZW50cyBTZXF1ZW5jZUdlbmVyYXRvcjJfMAoreworCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ2F0YWxvZzsKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nOworCisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTY2hlbWE7CisJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hOworCisJcHVibGljIEdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzAoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKworCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRDYXRhbG9nICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDYXRhbG9nIDogdGhpcy5kZWZhdWx0Q2F0YWxvZzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZENhdGFsb2c7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOworCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBjYXRhbG9nOworCQl0aGlzLmdldFJlc291cmNlR2VuZXJhdG9yKCkuc2V0Q2F0YWxvZyhjYXRhbG9nKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nXyhTdHJpbmcgY2F0YWxvZykgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOworCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBjYXRhbG9nOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZygpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdENhdGFsb2c7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdENhdGFsb2c7CisJCXRoaXMuZGVmYXVsdENhdGFsb2cgPSBjYXRhbG9nOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0Q2F0YWxvZygpOworCX0KKworCS8vICoqKioqKioqKiogc2NoZW1hICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkU2NoZW1hICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRTY2hlbWEgOiB0aGlzLmRlZmF1bHRTY2hlbWE7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFNjaGVtYTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7CisJCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gc2NoZW1hOworCQl0aGlzLmdldFJlc291cmNlR2VuZXJhdG9yKCkuc2V0U2NoZW1hKHNjaGVtYSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hXyhTdHJpbmcgc2NoZW1hKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFNjaGVtYTsKKwkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBzY2hlbWE7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NoZW1hOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0U2NoZW1hOworCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBzY2hlbWE7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdFNjaGVtYSgpOworCX0KKworCS8vICoqKioqKioqKiogcmVzb3VyY2UgPT4gY29udGV4dCAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKSB7CisJCXN1cGVyLmluaXRpYWxpemUocmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcik7CisJCVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbiByZXNvdXJjZSA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24pIHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3I7CisKKwkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZygpOworCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSByZXNvdXJjZS5nZXRDYXRhbG9nKCk7CisJCXRoaXMuZGVmYXVsdFNjaGVtYSA9IHRoaXMuYnVpbGREZWZhdWx0U2NoZW1hKCk7CisJCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gcmVzb3VyY2UuZ2V0U2NoZW1hKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKSB7CisJCXN1cGVyLnVwZGF0ZShyZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKTsKKwkJU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uIHJlc291cmNlID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcjsKKworCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZygpKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRDYXRhbG9nXyhyZXNvdXJjZS5nZXRDYXRhbG9nKCkpOworCQl0aGlzLnNldERlZmF1bHRTY2hlbWEodGhpcy5idWlsZERlZmF1bHRTY2hlbWEoKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hXyhyZXNvdXJjZS5nZXRTY2hlbWEoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24gZ2V0UmVzb3VyY2VHZW5lcmF0b3IoKSB7CisJCXJldHVybiAoU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uKSBzdXBlci5nZXRSZXNvdXJjZUdlbmVyYXRvcigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTI3NjM3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5KcGFGYWN0b3J5Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wIElOU1RBTkNFID0gCisJCW5ldyBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMCgpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gKChKcGFGYWN0b3J5Ml8wKSBmYWN0b3J5KS5idWlsZEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAocGFyZW50KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhYTY2NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUlkTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8wCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFJZE1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUlkTWFwcGluZ0RlZmluaXRpb24yXzAgSU5TVEFOQ0UgPSAKKwkJbmV3IEphdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8wKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEphdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8wKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiB0ZXN0U3BlY2lmaWVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKKwkJcmV0dXJuIHN1cGVyLnRlc3RTcGVjaWZpZWQocGVyc2lzdGVudEF0dHJpYnV0ZSkgJiYgISB0ZXN0RGVyaXZlZElkKHBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgSWQgYW5ub3RhdGlvbiwgaWYgcHJlc2VudCwgaXMgdXNlZCBhcyBhIHN1cHBvcnRpbmcgYW5ub3RhdGlvbiBmb3IKKwkgKiAxLTEgb3IgTS0xIG1hcHBpbmcsIHJhdGhlciB0aGFuIGFzIGEgcHJpbWFyeSBtYXBwaW5nIGFubm90YXRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB0ZXN0RGVyaXZlZElkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IAorCQkJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCXJldHVybiByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpICE9IG51bGwKKwkJCQl8fCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSAhPSBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9OdWxsSmF2YUNhY2hlYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL051bGxKYXZhQ2FjaGVhYmxlMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExMDUzMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9OdWxsSmF2YUNhY2hlYWJsZTJfMC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDYWNoZWFibGVIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworcHVibGljIGNsYXNzIE51bGxKYXZhQ2FjaGVhYmxlMl8wCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgSmF2YUNhY2hlYWJsZTJfMAoreworCXB1YmxpYyBOdWxsSmF2YUNhY2hlYWJsZTJfMChKYXZhQ2FjaGVhYmxlSG9sZGVyMl8wIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRDYWNoZWFibGUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzQ2FjaGVhYmxlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdENhY2hlYWJsZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJLy9uby1vcAorCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgeworCQkvL25vLW9wCisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvTnVsbEphdmFEZXJpdmVkSWQyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9OdWxsSmF2YURlcml2ZWRJZDJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWUwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvTnVsbEphdmFEZXJpdmVkSWQyXzAuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFEZXJpdmVkSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKK3B1YmxpYyBjbGFzcyBOdWxsSmF2YURlcml2ZWRJZDJfMAorCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIEphdmFEZXJpdmVkSWQyXzAKK3sKKwkKKwlwdWJsaWMgTnVsbEphdmFEZXJpdmVkSWQyXzAoSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQkKKwlwdWJsaWMgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShib29sZWFuIG5ld1ZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CisJCS8vbm8tb3AKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQkvL25vLW9wCisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvTnVsbEphdmFNYXBzSWQyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9OdWxsSmF2YU1hcHNJZDJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNDZlZTgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvTnVsbEphdmFNYXBzSWQyXzAuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hcHNJZDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworcHVibGljIGNsYXNzIE51bGxKYXZhTWFwc0lkMl8wCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgSmF2YU1hcHNJZDJfMAoreworCXB1YmxpYyBOdWxsSmF2YU1hcHNJZDJfMChKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJLy9uby1vcAorCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCS8vbm8tb3AKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9OdWxsSmF2YU9ycGhhblJlbW92YWwyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9OdWxsSmF2YU9ycGhhblJlbW92YWwyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzYzM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL051bGxKYXZhT3JwaGFuUmVtb3ZhbDJfMC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqICBOdWxsSmF2YU9ycGhhblJlbW92YWwyXzAKKyAqLworcHVibGljIGNsYXNzIE51bGxKYXZhT3JwaGFuUmVtb3ZhbDJfMAorCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQorCQkJaW1wbGVtZW50cyBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wCit7CisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCisJcHVibGljIE51bGxKYXZhT3JwaGFuUmVtb3ZhbDJfMChKYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwkvLyAqKioqKioqKioqIE9ycGhhblJlbW92YWJsZTJfMCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJCisJcHVibGljIGJvb2xlYW4gaXNPcnBoYW5SZW1vdmFsKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbiBuZXdTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqKioqKiogSmF2YU9ycGhhblJlbW92YWJsZTJfMCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmNmJjYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLlZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxKb2luVGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLkFubm90YXRpb25Jbml0aWFsaXplcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24KKwlleHRlbmRzIFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbgorCWltcGxlbWVudHMgQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24KK3sKKworCXByaXZhdGUgZmluYWwgSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGU7CisJCisJcHVibGljIFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgU3RyaW5nIG5hbWUsIEpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kpIHsKKwkJc3VwZXIocGFyZW50LCBuYW1lLCBqb2luaW5nU3RyYXRlZ3kpOworCQl0aGlzLmpvaW5UYWJsZSA9IHRoaXMuYnVpbGRKb2luVGFibGUoKTsKKwl9CisJCisJcHJvdGVjdGVkIEpvaW5UYWJsZUFubm90YXRpb24gYnVpbGRKb2luVGFibGUoKSB7CisJCWlmICh0aGlzLmpvaW5pbmdTdHJhdGVneSBpbnN0YW5jZW9mIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSkgeworCQkJcmV0dXJuIG5ldyBWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZUFubm90YXRpb24odGhpcywgKChKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kpdGhpcy5qb2luaW5nU3RyYXRlZ3kpLmdldEpvaW5UYWJsZSgpKTsKKwkJfQorCQlyZXR1cm4gbmV3IE51bGxKb2luVGFibGVBbm5vdGF0aW9uKHRoaXMpOworCX0KKworCS8vICoqKioqIGpvaW4gdGFibGUKKwkKKwlwdWJsaWMgSm9pblRhYmxlQW5ub3RhdGlvbiBnZXRKb2luVGFibGUoKSB7CisJCXJldHVybiB0aGlzLmpvaW5UYWJsZTsKKwl9CisKKwlwdWJsaWMgSm9pblRhYmxlQW5ub3RhdGlvbiBnZXROb25OdWxsSm9pblRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5qb2luVGFibGU7CisJfQorCisJcHVibGljIEpvaW5UYWJsZUFubm90YXRpb24gYWRkSm9pblRhYmxlKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlSm9pblRhYmxlKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSm9pblRhYmxlKEFubm90YXRpb25Jbml0aWFsaXplciBpbml0aWFsaXplcikgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiMDQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLlZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsSm9pblRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworCitwdWJsaWMgZmluYWwgY2xhc3MgVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVBbm5vdGF0aW9uIGV4dGVuZHMgTnVsbEpvaW5UYWJsZUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEpvaW5UYWJsZUFubm90YXRpb24KK3sKKwlwcml2YXRlIEpvaW5UYWJsZSBqb2luVGFibGU7IC8vVE9ETyB1bmlxdWVDb25zdHJhaW50cworCisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zOworCQorCXByaXZhdGUgZmluYWwgVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnM7CisKKwlwdWJsaWMgVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIHBhcmVudCwgSm9pblRhYmxlIGpvaW5UYWJsZSkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmpvaW5UYWJsZSA9IGpvaW5UYWJsZTsKKwkJdGhpcy5qb2luQ29sdW1ucyA9IHRoaXMuYnVpbGRKb2luQ29sdW1ucygpOworCQl0aGlzLmludmVyc2VKb2luQ29sdW1ucyA9IHRoaXMuYnVpbGRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pblRhYmxlQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJcHJpdmF0ZSBWZWN0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGJ1aWxkSm9pbkNvbHVtbnMoKSB7CisJCVZlY3RvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gcmVzdWx0ID0gbmV3IFZlY3RvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5qb2luVGFibGUuam9pbkNvbHVtbnNTaXplKCkpOworCQlmb3IgKEpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmpvaW5UYWJsZS5qb2luQ29sdW1ucygpKSkgeworCQkJcmVzdWx0LmFkZChuZXcgVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luQ29sdW1uQW5ub3RhdGlvbih0aGlzLCBqb2luQ29sdW1uKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJcHJpdmF0ZSBWZWN0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5zKCkgeworCQlWZWN0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IHJlc3VsdCA9IG5ldyBWZWN0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+KHRoaXMuam9pblRhYmxlLmludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7CisJCWZvciAoSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMuam9pblRhYmxlLmludmVyc2VKb2luQ29sdW1ucygpKSkgeworCQkJcmVzdWx0LmFkZChuZXcgVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luQ29sdW1uQW5ub3RhdGlvbih0aGlzLCBqb2luQ29sdW1uKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLmpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLmpvaW5UYWJsZS5nZXRDYXRhbG9nKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy5qb2luVGFibGUuZ2V0U2NoZW1hKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwkKKwkvLyAqKioqKiBqb2luIGNvbHVtbnMKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbnMubGlzdEl0ZXJhdG9yKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLmVsZW1lbnRBdChpbmRleCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaW5kZXhPZkpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgeworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5pbmRleE9mKGpvaW5Db2x1bW4pOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbnMuc2l6ZSgpOworCX0KKwkKKwkvLyAqKioqKiBpbnZlcnNlIGpvaW4gY29sdW1ucworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLmxpc3RJdGVyYXRvcigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gaW52ZXJzZUpvaW5Db2x1bW5BdChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLmVsZW1lbnRBdChpbmRleCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaW5kZXhPZkludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pIHsKKwkJcmV0dXJuIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLmluZGV4T2Yoam9pbkNvbHVtbik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0Y2QxYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGVJbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wIGV4dGVuZHMgQWJzdHJhY3RPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlCisJaW1wbGVtZW50cyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wCit7CisKKwlwcm90ZWN0ZWQgT3JtSm9pblRhYmxlSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5Ml8wIGpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKKworCS8vIGNhY2hlIHRoZSBzdHJhdGVneSBmb3IgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbgorCXByb3RlY3RlZCBKb2luaW5nU3RyYXRlZ3kgY2FjaGVkUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3k7CisKKwlwdWJsaWMgR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAoT3JtQXNzb2NpYXRpb25PdmVycmlkZSBwYXJlbnQsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeGFvKSB7CisJCXN1cGVyKHBhcmVudCwgeGFvKTsKKwl9CisJCisJcHJvdGVjdGVkIE9ybUpvaW5UYWJsZUluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneTJfMCBidWlsZEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneShYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhhbykgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Kb2luVGFibGVJbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kyXzAodGhpcywgeGFvKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBvbGRBc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCWlmIChvbGRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpKSB7CisJCQlnZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkuaW5pdGlhbGl6ZUZyb20ob2xkQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOworCQl9CisJCWVsc2UgeworCQkJZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuaW5pdGlhbGl6ZUZyb20oKChBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wKSBvbGRBc3NvY2lhdGlvbk92ZXJyaWRlKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWdpZXMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeGFvKSB7CisJCXN1cGVyLmluaXRpYWxpemVKb2luaW5nU3RyYXRlZ2llcyh4YW8pOworCQl0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSA9IGJ1aWxkSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KChYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKSB4YW8pOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKb2luaW5nU3RyYXRlZ2llcyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4YW8pIHsKKwkJc3VwZXIudXBkYXRlSm9pbmluZ1N0cmF0ZWdpZXMoeGFvKTsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kudXBkYXRlKChYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKSB4YW8pOworCX0KKwkJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpvaW5pbmdTdHJhdGVneSBjYWxjdWxhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHsKKwkJaWYgKHRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpKSB7CisJCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCQl9CisJCXJldHVybiB0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKy8vCQlpZiAodGhpcy5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkpIHsKKy8vCQkJdGhpcy52YWxpZGF0ZUpvaW5UYWJsZShtZXNzYWdlcywgYXN0Um9vdCk7CisvLwkJfQorCX0KKworCisKKwkvLyAqKioqKioqKioqKioqKioqIGpvaW4gdGFibGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCisJcHVibGljIE9ybUpvaW5UYWJsZUluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneTJfMCBnZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiB0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gdXNlc0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIGdldFByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgPT0gdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kuYWRkU3RyYXRlZ3koKTsKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVuc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkgeworCQl0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBtYXlIYXZlRGVmYXVsdEpvaW5UYWJsZSgpIHsKKwkJcmV0dXJuIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5pc1ZpcnR1YWwoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQlzdXBlci5zZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCXRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUNhY2hlYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUNhY2hlYWJsZTJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOTA3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQ2FjaGVhYmxlMl8wLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1DYWNoZWFibGUyXzAgZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlIAorCWltcGxlbWVudHMgT3JtQ2FjaGVhYmxlMl8wCit7CisJcHJvdGVjdGVkIGZpbmFsIFhtbENhY2hlYWJsZTJfMCByZXNvdXJjZTsKKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0Q2FjaGVhYmxlOworCQorCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZENhY2hlYWJsZTsKKwkKKwkKKwlwdWJsaWMgR2VuZXJpY09ybUNhY2hlYWJsZTJfMChPcm1DYWNoZWFibGVIb2xkZXIyXzAgcGFyZW50LCBYbWxDYWNoZWFibGUyXzAgcmVzb3VyY2UpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCQl0aGlzLnNwZWNpZmllZENhY2hlYWJsZSA9IHRoaXMuZ2V0UmVzb3VyY2VDYWNoZWFibGUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtQ2FjaGVhYmxlSG9sZGVyMl8wIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChPcm1DYWNoZWFibGVIb2xkZXIyXzApIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0NhY2hlYWJsZSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZENhY2hlYWJsZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQ2FjaGVhYmxlLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0Q2FjaGVhYmxlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRDYWNoZWFibGUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRDYWNoZWFibGU7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDYWNoZWFibGUoYm9vbGVhbiBuZXdEZWZhdWx0Q2FjaGVhYmxlKSB7CisJCWJvb2xlYW4gb2xkRGVmYXVsdENhY2hlYWJsZSA9IHRoaXMuZGVmYXVsdENhY2hlYWJsZTsKKwkJdGhpcy5kZWZhdWx0Q2FjaGVhYmxlID0gbmV3RGVmYXVsdENhY2hlYWJsZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBQ0hFQUJMRV9QUk9QRVJUWSwgb2xkRGVmYXVsdENhY2hlYWJsZSwgbmV3RGVmYXVsdENhY2hlYWJsZSk7CisJfQorCQorCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZENhY2hlYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ2FjaGVhYmxlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRDYWNoZWFibGUpIHsKKwkJQm9vbGVhbiBvbGRTcGVjaWZpZWRDYWNoZWFibGUgPSB0aGlzLnNwZWNpZmllZENhY2hlYWJsZTsKKwkJdGhpcy5zcGVjaWZpZWRDYWNoZWFibGUgPSBuZXdTcGVjaWZpZWRDYWNoZWFibGU7CisJCXRoaXMucmVzb3VyY2Uuc2V0Q2FjaGVhYmxlKG5ld1NwZWNpZmllZENhY2hlYWJsZSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NBQ0hFQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ2FjaGVhYmxlLCBuZXdTcGVjaWZpZWRDYWNoZWFibGUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDYWNoZWFibGVfKEJvb2xlYW4gbmV3U3BlY2lmaWVkQ2FjaGVhYmxlKSB7CisJCUJvb2xlYW4gb2xkU3BlY2lmaWVkQ2FjaGVhYmxlID0gdGhpcy5zcGVjaWZpZWRDYWNoZWFibGU7CisJCXRoaXMuc3BlY2lmaWVkQ2FjaGVhYmxlID0gbmV3U3BlY2lmaWVkQ2FjaGVhYmxlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DQUNIRUFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZENhY2hlYWJsZSwgbmV3U3BlY2lmaWVkQ2FjaGVhYmxlKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBpbml0aWFsaXplL3VwZGF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXNldFNwZWNpZmllZENhY2hlYWJsZV8odGhpcy5nZXRSZXNvdXJjZUNhY2hlYWJsZSgpKTsKKwkJc2V0RGVmYXVsdENhY2hlYWJsZSh0aGlzLmNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSk7CisJfQorCQorCXByb3RlY3RlZCBCb29sZWFuIGdldFJlc291cmNlQ2FjaGVhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXRDYWNoZWFibGUoKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpIHsKKwkJcmV0dXJuIGdldFBhcmVudCgpLmNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXRDYWNoZWFibGVUZXh0UmFuZ2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRGVyaXZlZElkMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRGVyaXZlZElkMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2ZjFmOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1EZXJpdmVkSWQyXzAuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybURlcml2ZWRJZDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRGVyaXZlZElkXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybURlcml2ZWRJZDJfMCAKKwlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIE9ybURlcml2ZWRJZDJfMAoreworCXByb3RlY3RlZCBYbWxEZXJpdmVkSWRfMl8wIHJlc291cmNlOworCQorCXByb3RlY3RlZCBib29sZWFuIHZhbHVlOworCQorCQorCXB1YmxpYyBHZW5lcmljT3JtRGVyaXZlZElkMl8wKE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50LCBYbWxEZXJpdmVkSWRfMl8wIHJlc291cmNlKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKwkJdGhpcy52YWx1ZSA9IGdldFJlc291cmNlVG9Db250ZXh0VmFsdWUoKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzApIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFZhbHVlKGJvb2xlYW4gbmV3VmFsdWUpIHsKKwkJYm9vbGVhbiBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKKwkJdGhpcy5yZXNvdXJjZS5zZXRJZChnZXRDb250ZXh0VG9SZXNvdXJjZVZhbHVlKCkpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oYm9vbGVhbiBuZXdWYWx1ZSkgeworCQlib29sZWFuIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKKwkJdGhpcy52YWx1ZSA9IG5ld1ZhbHVlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXNldFZhbHVlXyhnZXRSZXNvdXJjZVRvQ29udGV4dFZhbHVlKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRSZXNvdXJjZVRvQ29udGV4dFZhbHVlKCkgeworCQlyZXR1cm4gKHJlc291cmNlLmdldElkKCkgPT0gbnVsbCkgPyBmYWxzZSA6IHJlc291cmNlLmdldElkKCkuYm9vbGVhblZhbHVlKCk7CisJfQorCQorCXByb3RlY3RlZCBCb29sZWFuIGdldENvbnRleHRUb1Jlc291cmNlVmFsdWUoKSB7CisJCXJldHVybiAodGhpcy52YWx1ZSkgPyBCb29sZWFuLlRSVUUgOiBudWxsOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlLmdldERlcml2ZWRJZFRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCS8vIG5vIHZhbGlkYXRpb24gcnVsZXMKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiYzAyNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uOworCisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wCisJZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WG1sRWxlbWVudENvbGxlY3Rpb24+IAorCWltcGxlbWVudHMgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wCit7CisJCisJcHJvdGVjdGVkIEZldGNoVHlwZSBzcGVjaWZpZWRGZXRjaDsKKworCXB1YmxpYyBHZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxFbGVtZW50Q29sbGVjdGlvbiByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCQl0aGlzLnNwZWNpZmllZEZldGNoID0gdGhpcy5nZXRSZXNvdXJjZUZldGNoKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0U3BlY2lmaWVkRmV0Y2hfKHRoaXMuZ2V0UmVzb3VyY2VGZXRjaCgpKTsKKwl9CisJCisJLy8qKioqKioqKioqKioqIEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCisJLy8qKioqKioqKioqKioqIE9ybUF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgeworIAkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybUF0dHJpYnV0ZU1hcHBpbmcodGhpcyk7CisJfQorCisJcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIDc1OworCX0KKworCXB1YmxpYyB2b2lkIGFkZFRvUmVzb3VyY2VNb2RlbChBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuYWRkKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwoQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKKwkJcmVzb3VyY2VBdHRyaWJ1dGVzLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLnJlbW92ZSh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCisJCisJLy8qKioqKioqKioqKioqIEZldGNoYWJsZSAqKioqKioqKioqKioqCisJCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZEZldGNoKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRGZXRjaCgpIDogdGhpcy5nZXRTcGVjaWZpZWRGZXRjaCgpOworCX0KKworCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RGVmYXVsdEZldGNoKCkgeworCQlyZXR1cm4gREVGQVVMVF9GRVRDSF9UWVBFOworCX0KKworCXB1YmxpYyBGZXRjaFR5cGUgZ2V0U3BlY2lmaWVkRmV0Y2goKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEZldGNoOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUgbmV3U3BlY2lmaWVkRmV0Y2gpIHsKKwkJRmV0Y2hUeXBlIG9sZEZldGNoID0gdGhpcy5zcGVjaWZpZWRGZXRjaDsKKwkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IG5ld1NwZWNpZmllZEZldGNoOworCQl0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5zZXRGZXRjaChGZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZEZldGNoKSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRmV0Y2hhYmxlLlNQRUNJRklFRF9GRVRDSF9QUk9QRVJUWSwgb2xkRmV0Y2gsIG5ld1NwZWNpZmllZEZldGNoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaF8oRmV0Y2hUeXBlIG5ld1NwZWNpZmllZEZldGNoKSB7CisJCUZldGNoVHlwZSBvbGRGZXRjaCA9IHRoaXMuc3BlY2lmaWVkRmV0Y2g7CisJCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSBuZXdTcGVjaWZpZWRGZXRjaDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChGZXRjaGFibGUuU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGRGZXRjaCwgbmV3U3BlY2lmaWVkRmV0Y2gpOworCX0KKwkKKwlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGdldFJlc291cmNlRmV0Y2goKSB7CisJCXJldHVybiBGZXRjaFR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuZ2V0RmV0Y2goKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUVtYmVkZGFibGUyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzczYjEwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUVtYmVkZGFibGUyXzAuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbWJlZGRhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1FbWJlZGRhYmxlMl8wCisJZXh0ZW5kcyBBYnN0cmFjdE9ybUVtYmVkZGFibGUKK3sKKwlwdWJsaWMgR2VuZXJpY09ybUVtYmVkZGFibGUyXzAoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxFbWJlZGRhYmxlIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKFN0cmluZyBhdHRyaWJ1dGVNYXBwaW5nS2V5KSB7CisJCXJldHVybiBBcnJheVRvb2xzLmNvbnRhaW5zKEdlbmVyaWNKYXZhRW1iZWRkYWJsZTJfMC5BTExPV0VEX0FUVFJJQlVURV9NQVBQSU5HX0tFWVMsIGF0dHJpYnV0ZU1hcHBpbmdLZXkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5UYWJsZUluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5UYWJsZUluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneTJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOGE0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtSm9pblRhYmxlSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5Ml8wLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtSm9pblRhYmxlSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5Ml8wIAorCWV4dGVuZHMgQWJzdHJhY3RPcm1Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3kKKwlpbXBsZW1lbnRzIE9ybUpvaW5UYWJsZUluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneTJfMAoreworCXByb3RlY3RlZCB0cmFuc2llbnQgWG1sQXNzb2NpYXRpb25PdmVycmlkZSByZXNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGU7CisJCisJcHVibGljIEdlbmVyaWNPcm1Kb2luVGFibGVJbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kyXzAoT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCBwYXJlbnQsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeGFvKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMucmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlID0geGFvOworCQl0aGlzLmluaXRpYWxpemUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIChPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wKSBzdXBlci5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKiBqb2luIHRhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0UmVzb3VyY2VKb2luVGFibGUoWG1sSm9pblRhYmxlIHJlc291cmNlSm9pblRhYmxlKSB7CisJCXRoaXMucmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlLnNldEpvaW5UYWJsZShyZXNvdXJjZUpvaW5UYWJsZSk7CisJfQorCisJcHVibGljIFhtbEpvaW5UYWJsZSBnZXRSZXNvdXJjZUpvaW5UYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlSm9pblRhYmxlKCkgeworCQl0aGlzLnJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZS5zZXRKb2luVGFibGUobnVsbCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgcmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlKSB7CisJCXRoaXMucmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlID0gcmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlOworCQlzdXBlci51cGRhdGUoKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFwc0lkMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFwc0lkMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2NDk3ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBzSWQyXzAuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFwc0lkMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtTWFwc0lkMl8wCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBPcm1NYXBzSWQyXzAKK3sKKwlwcm90ZWN0ZWQgWG1sTWFwc0lkXzJfMCByZXNvdXJjZTsKKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOworCQorCQorCXB1YmxpYyBHZW5lcmljT3JtTWFwc0lkMl8wKE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50LCBYbWxNYXBzSWRfMl8wIHJlc291cmNlKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKwkJdGhpcy52YWx1ZSA9IHRoaXMucmVzb3VyY2UuZ2V0TWFwc0lkKCk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgeworCQlTdHJpbmcgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7CisJCXRoaXMucmVzb3VyY2Uuc2V0TWFwc0lkKHRoaXMudmFsdWUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIG5ld1ZhbHVlKSB7CisJCVN0cmluZyBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzZXRWYWx1ZV8odGhpcy5yZXNvdXJjZS5nZXRNYXBzSWQoKSk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2UuZ2V0TWFwc0lkVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJLy8gbm8gdmFsaWRhdGlvbiBydWxlcworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PcnBoYW5SZW1vdmFsMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtT3JwaGFuUmVtb3ZhbDJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYzJmODIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtT3JwaGFuUmVtb3ZhbDJfMC5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JwaGFuUmVtb3ZhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqICBHZW5lcmljT3JtT3JwaGFuUmVtb3ZhbDJfMAorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybU9ycGhhblJlbW92YWwyXzAgZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlIAorCWltcGxlbWVudHMgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wCit7CisJcHJvdGVjdGVkIGZpbmFsIFhtbE9ycGhhblJlbW92YWJsZTJfMCByZXNvdXJjZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0T3JwaGFuUmVtb3ZhbDsKKwlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRPcnBoYW5SZW1vdmFsOworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCisJcHVibGljIEdlbmVyaWNPcm1PcnBoYW5SZW1vdmFsMl8wKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzAgcGFyZW50LCBYbWxPcnBoYW5SZW1vdmFibGUyXzAgcmVzb3VyY2UpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCQl0aGlzLnNwZWNpZmllZE9ycGhhblJlbW92YWwgPSB0aGlzLmdldFJlc291cmNlT3JwaGFuUmVtb3ZhbCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisKKwkvLyAqKioqKioqKioqIE9ycGhhblJlbW92YWJsZTJfMCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgYm9vbGVhbiBpc09ycGhhblJlbW92YWwoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRPcnBoYW5SZW1vdmFsICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRPcnBoYW5SZW1vdmFsLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0T3JwaGFuUmVtb3ZhbDsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRPcnBoYW5SZW1vdmFsOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRPcnBoYW5SZW1vdmFsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbiBuZXdTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRPcnBoYW5SZW1vdmFsOworCQl0aGlzLnNwZWNpZmllZE9ycGhhblJlbW92YWwgPSBuZXdTcGVjaWZpZWRPcnBoYW5SZW1vdmFsOworCQl0aGlzLnJlc291cmNlLnNldE9ycGhhblJlbW92YWwobmV3U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfT1JQSEFOX1JFTU9WQUxfUFJPUEVSVFksIG9sZCwgbmV3U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE9ycGhhblJlbW92YWxfKEJvb2xlYW4gbmV3U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCkgeworCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDsKKwkJdGhpcy5zcGVjaWZpZWRPcnBoYW5SZW1vdmFsID0gbmV3U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9PUlBIQU5fUkVNT1ZBTF9QUk9QRVJUWSwgb2xkLCBuZXdTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKTsKKwl9CisKKwkvLyAqKioqKioqKioqIGluaXRpYWxpemUvdXBkYXRlICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXRoaXMuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbF8odGhpcy5nZXRSZXNvdXJjZU9ycGhhblJlbW92YWwoKSk7CisJfQorCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCS8vIFRPRE8KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByb3RlY3RlZCBCb29sZWFuIGdldFJlc291cmNlT3JwaGFuUmVtb3ZhbCgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpOworCX0KKwkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGJmYzY5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7CisKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlMl8wIAorCWV4dGVuZHMgQWJzdHJhY3RPcm1QZXJzaXN0ZW50QXR0cmlidXRlIAoreworCQorCXByb3RlY3RlZCBBY2Nlc3NUeXBlIHNwZWNpZmllZEFjY2VzczsKKwkKKwlwdWJsaWMgR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBPd25lciBvd25lciwgWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCBvd25lciwgcmVzb3VyY2VNYXBwaW5nKTsKKwkJdGhpcy5zcGVjaWZpZWRBY2Nlc3MgPSBnZXRSZXNvdXJjZUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRTcGVjaWZpZWRBY2Nlc3MoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEFjY2VzczsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUgbmV3U3BlY2lmaWVkQWNjZXNzKSB7CisJCUFjY2Vzc1R5cGUgb2xkQWNjZXNzID0gdGhpcy5zcGVjaWZpZWRBY2Nlc3M7CisJCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gbmV3U3BlY2lmaWVkQWNjZXNzOworCQkoKFhtbEFjY2Vzc0hvbGRlcikgdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcoKSkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKG5ld1NwZWNpZmllZEFjY2VzcykpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BQ0NFU1NfUFJPUEVSVFksIG9sZEFjY2VzcywgbmV3U3BlY2lmaWVkQWNjZXNzKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzXyhBY2Nlc3NUeXBlIG5ld1NwZWNpZmllZEFjY2VzcykgeworCQlBY2Nlc3NUeXBlIG9sZEFjY2VzcyA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzOworCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IG5ld1NwZWNpZmllZEFjY2VzczsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZLCBvbGRBY2Nlc3MsIG5ld1NwZWNpZmllZEFjY2Vzcyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXNldFNwZWNpZmllZEFjY2Vzc18oZ2V0UmVzb3VyY2VBY2Nlc3MoKSk7CisJfQorCQorCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGdldFJlc291cmNlQWNjZXNzKCkgeworCQlyZXR1cm4gQWNjZXNzVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCgoKFhtbEFjY2Vzc0hvbGRlcikgZ2V0UmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKCkpLmdldEFjY2VzcygpKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YTA1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzAuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3I7CisKKy8qKgorICogIEdlbmVyaWMyXzBPcm1TZXF1ZW5jZUdlbmVyYXRvcgorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yMl8wIGV4dGVuZHMgQWJzdHJhY3RPcm1TZXF1ZW5jZUdlbmVyYXRvcgorCWltcGxlbWVudHMgT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzAKK3sKKwlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENhdGFsb2c7CisJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKKworCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2NoZW1hOworCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYTsKKworCXB1YmxpYyBHZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzAoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxTZXF1ZW5jZUdlbmVyYXRvciByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcik7CisJfQorCisJLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZENhdGFsb2cgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZENhdGFsb2cgOiB0aGlzLmRlZmF1bHRDYXRhbG9nOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZENhdGFsb2c7CisJCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IGNhdGFsb2c7CisJCXRoaXMuZ2V0UmVzb3VyY2VHZW5lcmF0b3IoKS5zZXRDYXRhbG9nKGNhdGFsb2cpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZ18oU3RyaW5nIGNhdGFsb2cpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKKwkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gY2F0YWxvZzsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRDYXRhbG9nOworCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gY2F0YWxvZzsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDYXRhbG9nKCkgeworCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdENhdGFsb2coKTsKKwl9CisKKwkvLyAqKioqKioqKioqIHNjaGVtYSAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNjaGVtYSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkU2NoZW1hIDogdGhpcy5kZWZhdWx0U2NoZW1hOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTY2hlbWE7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOworCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IHNjaGVtYTsKKwkJdGhpcy5nZXRSZXNvdXJjZUdlbmVyYXRvcigpLnNldFNjaGVtYShzY2hlbWEpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNjaGVtYV8oU3RyaW5nIHNjaGVtYSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7CisJCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gc2NoZW1hOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFNjaGVtYTsKKwkJdGhpcy5kZWZhdWx0U2NoZW1hID0gc2NoZW1hOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFNjaGVtYSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRTY2hlbWEoKTsKKwl9CisKKwkvLyAqKioqKioqKioqIHJlc291cmNlID0+IGNvbnRleHQgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3IgeG1sUmVzb3VyY2UpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZSh4bWxSZXNvdXJjZSk7CisJCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHhtbFJlc291cmNlMl8wID0gKFhtbFNlcXVlbmNlR2VuZXJhdG9yKSB4bWxSZXNvdXJjZTsKKworCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gdGhpcy5idWlsZERlZmF1bHRDYXRhbG9nKCk7CisJCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IHhtbFJlc291cmNlMl8wLmdldENhdGFsb2coKTsKKwkJdGhpcy5kZWZhdWx0U2NoZW1hID0gdGhpcy5idWlsZERlZmF1bHRTY2hlbWEoKTsKKwkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSB4bWxSZXNvdXJjZTJfMC5nZXRTY2hlbWEoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yIHhtbFJlc291cmNlKSB7CisJCXN1cGVyLnVwZGF0ZSh4bWxSZXNvdXJjZSk7CisJCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHhtbFJlc291cmNlMl8wID0gKFhtbFNlcXVlbmNlR2VuZXJhdG9yKSB4bWxSZXNvdXJjZTsKKworCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZygpKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRDYXRhbG9nXyh4bWxSZXNvdXJjZTJfMC5nZXRDYXRhbG9nKCkpOworCQl0aGlzLnNldERlZmF1bHRTY2hlbWEodGhpcy5idWlsZERlZmF1bHRTY2hlbWEoKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hXyh4bWxSZXNvdXJjZTJfMC5nZXRTY2hlbWEoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFhtbFNlcXVlbmNlR2VuZXJhdG9yIGdldFJlc291cmNlR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gKFhtbFNlcXVlbmNlR2VuZXJhdG9yKSBzdXBlci5nZXRSZXNvdXJjZUdlbmVyYXRvcigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNThmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVZlcnNpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRGVyaXZlZElkMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFwc0lkMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcnBoYW5SZW1vdmFibGUyXzA7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkKK3sJCisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybUVtYmVkZGFibGUgYnVpbGRPcm1FbWJlZGRhYmxlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybUVtYmVkZGFibGUyXzAocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlLk93bmVyIG93bmVyLCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMChwYXJlbnQsIG93bmVyLCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBidWlsZE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UoT3JtQXNzb2NpYXRpb25PdmVycmlkZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMChwYXJlbnQsIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRPcm1TZXF1ZW5jZUdlbmVyYXRvcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvciByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yMl8wKHBhcmVudCwgcmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigKKwkJCU9ybUVtYmVkZGVkTWFwcGluZzJfMCBwYXJlbnQsIAorCQkJT3duZXIgb3duZXIsIAorCQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciByZXNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIpIHsKKwkJCisJCXJldHVybiBuZXcgR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIocGFyZW50LCBvd25lciwgcmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybURlcml2ZWRJZDJfMCBidWlsZE9ybURlcml2ZWRJZCgKKwkJCU9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50LCBYbWxEZXJpdmVkSWRfMl8wIHJlc291cmNlKSB7CisJCQorCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1EZXJpdmVkSWQyXzAocGFyZW50LCByZXNvdXJjZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYnVpbGRPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoCisJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sRWxlbWVudENvbGxlY3Rpb24gcmVzb3VyY2VNYXBwaW5nKSB7CisJCQorCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtTWFwc0lkMl8wIGJ1aWxkT3JtTWFwc0lkKAorCQkJT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBwYXJlbnQsIFhtbE1hcHNJZF8yXzAgcmVzb3VyY2UpIHsKKwkJCisJCXJldHVybiBuZXcgR2VuZXJpY09ybU1hcHNJZDJfMChwYXJlbnQsIHJlc291cmNlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybUNhY2hlYWJsZTJfMCBidWlsZE9ybUNhY2hlYWJsZShPcm1DYWNoZWFibGVIb2xkZXIyXzAgcGFyZW50LCBYbWxDYWNoZWFibGUyXzAgcmVzb3VyY2UpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtQ2FjaGVhYmxlMl8wKHBhcmVudCwgcmVzb3VyY2UpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkT3JtT3JwaGFuUmVtb3ZhbChPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wIHBhcmVudCwgWG1sT3JwaGFuUmVtb3ZhYmxlMl8wIHJlc291cmNlKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybU9ycGhhblJlbW92YWwyXzAocGFyZW50LCByZXNvdXJjZSk7CisJfQorCisJCisJLy8gKioqKioqKioqKiBPUk0gVmlydHVhbCBSZXNvdXJjZSBNb2RlbCAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQXNzb2NpYXRpb25PdmVycmlkZSBidWlsZFZpcnR1YWxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKFN0cmluZyBuYW1lLCBPcm1UeXBlTWFwcGluZyBwYXJlbnQsIEpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsWG1sQXNzb2NpYXRpb25PdmVycmlkZTJfMChuYW1lLCBwYXJlbnQsIGpvaW5pbmdTdHJhdGVneSk7CQkKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQmFzaWMgYnVpbGRWaXJ0dWFsWG1sQmFzaWMoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxCYXNpYzJfMChvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxJZCBidWlsZFZpcnR1YWxYbWxJZChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUlkTWFwcGluZyBqYXZhSWRNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbFhtbElkMl8wKG9ybVR5cGVNYXBwaW5nLCBqYXZhSWRNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEVtYmVkZGVkSWQgYnVpbGRWaXJ0dWFsWG1sRW1iZWRkZWRJZChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFFbWJlZGRlZElkTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxFbWJlZGRlZElkMl8wKG9ybVR5cGVNYXBwaW5nLCBqYXZhRW1iZWRkZWRJZE1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sRW1iZWRkZWQgYnVpbGRWaXJ0dWFsWG1sRW1iZWRkZWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbWJlZGRlZE1hcHBpbmcgamF2YUVtYmVkZGVkTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxFbWJlZGRlZDJfMChvcm1UeXBlTWFwcGluZywgamF2YUVtYmVkZGVkTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxNYW55VG9NYW55IGJ1aWxkVmlydHVhbFhtbE1hbnlUb01hbnkoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsWG1sTWFueVRvTWFueTJfMChvcm1UeXBlTWFwcGluZywgamF2YU1hbnlUb01hbnlNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbE1hbnlUb09uZSBidWlsZFZpcnR1YWxYbWxNYW55VG9PbmUoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFNYW55VG9PbmVNYXBwaW5nIGphdmFNYW55VG9PbmVNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbFhtbE1hbnlUb09uZTJfMChvcm1UeXBlTWFwcGluZywgKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBqYXZhTWFueVRvT25lTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxPbmVUb01hbnkgYnVpbGRWaXJ0dWFsWG1sT25lVG9NYW55KE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxPbmVUb01hbnkyXzAob3JtVHlwZU1hcHBpbmcsIChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sT25lVG9PbmUgYnVpbGRWaXJ0dWFsWG1sT25lVG9PbmUoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFPbmVUb09uZU1hcHBpbmcgamF2YU9uZVRvT25lTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxPbmVUb09uZTJfMChvcm1UeXBlTWFwcGluZywgKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGphdmFPbmVUb09uZU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sVHJhbnNpZW50IGJ1aWxkVmlydHVhbFhtbFRyYW5zaWVudChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YVRyYW5zaWVudE1hcHBpbmcgamF2YVRyYW5zaWVudE1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsWG1sVHJhbnNpZW50Ml8wKG9ybVR5cGVNYXBwaW5nLCBqYXZhVHJhbnNpZW50TWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxWZXJzaW9uIGJ1aWxkVmlydHVhbFhtbFZlcnNpb24oT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFWZXJzaW9uTWFwcGluZyBqYXZhVmVyc2lvbk1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsWG1sVmVyc2lvbjJfMChvcm1UeXBlTWFwcGluZywgamF2YVZlcnNpb25NYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZzJfMChvcm1UeXBlTWFwcGluZywgamF2YUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sRWxlbWVudENvbGxlY3Rpb24gYnVpbGRWaXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24yXzAoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24yXzAob3JtVHlwZU1hcHBpbmcsIGphdmFNYXBwaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtWG1sMl8wRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVhtbDJfMERlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODFiZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVhtbDJfMERlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk51bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbERlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRW50aXR5RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNPcm1YbWwyXzBEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbERlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1YbWxEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCQluZXcgR2VuZXJpY09ybVhtbDJfMERlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtWG1sRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgR2VuZXJpY09ybVhtbDJfMERlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBFRmFjdG9yeSBnZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCkgeworCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0U7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeSgpOworCX0KKwkKKwlwdWJsaWMgSnBhUmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKKwkJcmV0dXJuIEpwdENvcmVQbHVnaW4uT1JNX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBPUk0gdHlwZSBtYXBwaW5ncyAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKKwkJLy8gb3JkZXIgc2hvdWxkIG5vdCBtYXR0ZXIgaGVyZSwgYnV0IHdlJ2xsIHVzZSB0aGUgc2FtZSBvcmRlciBhcyBmb3IgamF2YSAKKwkJLy8gKEBzZWUge0BsaW5rIEdlbmVyaWMyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyfSkKKwkJcmV0dXJuIG5ldyBPcm1UeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7CisJCQlPcm1FbnRpdHlEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1FbWJlZGRhYmxlRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uaW5zdGFuY2UoKX07CisJfQorCQorCQorCS8vICoqKioqKioqKiogT1JNIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGRPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCS8vIG9yZGVyIHNob3VsZCBub3QgbWF0dGVyIGhlcmUsIGJ1dCB3ZSdsbCB1c2UgdGhlIHNhbWUgb3JkZXIgYXMgZm9yIGphdmEKKwkJLy8gKEBzZWUge0BsaW5rIEdlbmVyaWMyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyfSkKKwkJcmV0dXJuIG5ldyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKKwkJCU9ybVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1JZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU51bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9OdWxsTWFwc0lkMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9OdWxsTWFwc0lkMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5OWVjZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL051bGxNYXBzSWQyXzAuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFwc0lkMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworcHVibGljIGNsYXNzIE51bGxNYXBzSWQyXzAKKwlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIE9ybU1hcHNJZDJfMAoreworCXB1YmxpYyBOdWxsTWFwc0lkMl8wKE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKKwkJLy9uby1vcCAtIHNldFZhbHVlIGlzIGNhbGxlZCB3aGVuIG1vcnBoaW5nIGEgbWFwcGluZywgd2UgY2FuJ3QgdGhyb3cgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQkvL25vLW9wCisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vTnVsbE9ybUNhY2hlYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vTnVsbE9ybUNhY2hlYWJsZTJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliY2Y4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9OdWxsT3JtQ2FjaGVhYmxlMl8wLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGVIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKK3B1YmxpYyBjbGFzcyBOdWxsT3JtQ2FjaGVhYmxlMl8wCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBPcm1DYWNoZWFibGUyXzAKK3sKKwlwdWJsaWMgTnVsbE9ybUNhY2hlYWJsZTJfMChPcm1DYWNoZWFibGVIb2xkZXIyXzAgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzQ2FjaGVhYmxlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdENhY2hlYWJsZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRDYWNoZWFibGUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJLy9uby1vcAorCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL051bGxPcm1EZXJpdmVkSWQyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL051bGxPcm1EZXJpdmVkSWQyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGUwNWJlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vTnVsbE9ybURlcml2ZWRJZDJfMC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRGVyaXZlZElkMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworcHVibGljIGNsYXNzIE51bGxPcm1EZXJpdmVkSWQyXzAgCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBPcm1EZXJpdmVkSWQyXzAKK3sKKwkKKwlwdWJsaWMgTnVsbE9ybURlcml2ZWRJZDJfMChPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShib29sZWFuIG5ld1ZhbHVlKSB7CisJCS8vbm8tb3AgLSBzZXRWYWx1ZSBpcyBjYWxsZWQgd2hlbiBtb3JwaGluZyBhIG1hcHBpbmcsIHdlIGNhbid0IHRocm93IGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQkvL25vLW9wCisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9OdWxsT3JtTWFwc0lkMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9OdWxsT3JtTWFwc0lkMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2Y2QxYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL051bGxPcm1NYXBzSWQyXzAuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hcHNJZDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKK3B1YmxpYyBjbGFzcyBOdWxsT3JtTWFwc0lkMl8wCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBPcm1NYXBzSWQyXzAKK3sKKwlwdWJsaWMgTnVsbE9ybU1hcHNJZDJfMChPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7CisJCS8vbm8tb3AgLSBzZXRWYWx1ZSBpcyBjYWxsZWQgd2hlbiBtb3JwaGluZyBhIG1hcHBpbmcsIHdlIGNhbid0IHRocm93IGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJLy9uby1vcAorCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL051bGxPcm1PcnBoYW5SZW1vdmFsMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9OdWxsT3JtT3JwaGFuUmVtb3ZhbDJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTBmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9OdWxsT3JtT3JwaGFuUmVtb3ZhbDJfMC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogIE51bGxPcm1PcnBoYW5SZW1vdmFibGUyXzAKKyAqLworcHVibGljIGNsYXNzIE51bGxPcm1PcnBoYW5SZW1vdmFsMl8wCisJCQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKKwkJCWltcGxlbWVudHMgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wCit7CisJcHVibGljIE51bGxPcm1PcnBoYW5SZW1vdmFsMl8wKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzAgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzT3JwaGFuUmVtb3ZhbCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbiBuZXdTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YzlhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOworCitwdWJsaWMgY2xhc3MgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wRGVmaW5pdGlvbgorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMERlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMERlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAorCQkJCWZhY3RvcnksIAorCQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCksIAorCQkJCVhtbEVsZW1lbnRDb2xsZWN0aW9uLmNsYXNzKTsKKwl9CisJCisJcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKKwkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKKwkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiAoKE9ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAocGFyZW50LCAoWG1sRWxlbWVudENvbGxlY3Rpb24pIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFJlc291cmNlTWFwcGluZygKKwkJCU9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCAKKwkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiAoKE9ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRWaXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24yXzAob3JtVHlwZU1hcHBpbmcsIChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBqYXZhQXR0cmlidXRlTWFwcGluZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlNjZmZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlMl8wLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbEpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlOworCitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAgZXh0ZW5kcyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlCit7CisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5OworCQorCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKKworCXB1YmxpYyBWaXJ0dWFsWG1sQXNzb2NpYXRpb25PdmVycmlkZTJfMChTdHJpbmcgbmFtZSwgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmpvaW5pbmdTdHJhdGVneSA9IGpvaW5pbmdTdHJhdGVneTsKKwkJdGhpcy52aXJ0dWFsWG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IG5ldyBWaXJ0dWFsWG1sQXNzb2NpYXRpb25PdmVycmlkZShuYW1lLCBvcm1UeXBlTWFwcGluZywgam9pbmluZ1N0cmF0ZWd5KTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgeworCQlpZiAodGhpcy5qb2luaW5nU3RyYXRlZ3kgaW5zdGFuY2VvZiBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kpIHsKKwkJCUpvaW5UYWJsZSBqb2luVGFibGUgPSAoKEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSkgdGhpcy5qb2luaW5nU3RyYXRlZ3kpLmdldEpvaW5UYWJsZSgpOworCQkJaWYgKGpvaW5UYWJsZSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBWaXJ0dWFsWG1sSm9pblRhYmxlKAorCQkJCQl0aGlzLm9ybVR5cGVNYXBwaW5nLCAKKwkJCQkJam9pblRhYmxlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSBuZXdKb2luVGFibGUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbEJhc2ljMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9WaXJ0dWFsWG1sQmFzaWMyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDdhYzA1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbEJhc2ljMl8wLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxCYXNpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworLyoqCisgKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAorICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbEJhc2ljMl8wIGV4dGVuZHMgWG1sQmFzaWMKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFCYXNpY01hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxCYXNpYyB2aXJ0dWFsWG1sQmFzaWM7CisJCQorCXB1YmxpYyBWaXJ0dWFsWG1sQmFzaWMyXzAoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhQmFzaWNNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxCYXNpYyA9IG5ldyBWaXJ0dWFsWG1sQmFzaWMob3JtVHlwZU1hcHBpbmcsIGphdmFCYXNpY01hcHBpbmcpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbEJhc2ljLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldENvbHVtbigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0Q29sdW1uKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldEZldGNoKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7CisJCXRoaXMudmlydHVhbFhtbEJhc2ljLnNldEZldGNoKG5ld0ZldGNoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldE9wdGlvbmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkgeworCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRPcHRpb25hbChuZXdPcHRpb25hbCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNMb2IoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5pc0xvYigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldExvYihib29sZWFuIG5ld0xvYikgeworCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRMb2IobmV3TG9iKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRMb2JUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRMb2JUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0VGVtcG9yYWwoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgc2V0VGVtcG9yYWwpeworCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRUZW1wb3JhbChzZXRUZW1wb3JhbCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRUZW1wb3JhbFRleHRSYW5nZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFbnVtVHlwZSBnZXRFbnVtZXJhdGVkKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0RW51bWVyYXRlZCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgc2V0RW51bWVyYXRlZCkgeworCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRFbnVtZXJhdGVkKHNldEVudW1lcmF0ZWQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9WaXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24yXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjk1ZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uMl8wLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogVmlydHVhbE9uZVRvT25lIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIE9uZVRvT25lIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhT25lVG9PbmVNYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbjJfMCBleHRlbmRzIFhtbEVsZW1lbnRDb2xsZWN0aW9uCit7CisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyB2aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZzsKKwkKKwkKKwlwdWJsaWMgVmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uMl8wKAorCQkJT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YU1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YU1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcgPSBuZXcgVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcob3JtVHlwZU1hcHBpbmcsIGphdmFNYXBwaW5nKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXREZWZhdWx0RmV0Y2goKSk7CisJCX0KKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldEZldGNoKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorLy8KKy8vCUBPdmVycmlkZQorLy8JcHVibGljIFN0cmluZyBnZXRUYXJnZXRDbGFzcygpIHsKKy8vCQlpZiAodGhpcy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworLy8JCQlyZXR1cm4gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKTsKKy8vCQl9CisvLwkJcmV0dXJuIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0VGFyZ2V0Q2xhc3MoKTsKKy8vCX0KKy8vCisvLwlAT3ZlcnJpZGUKKy8vCXB1YmxpYyB2b2lkIHNldFRhcmdldENsYXNzKFN0cmluZyB2YWx1ZSkgeworLy8JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorLy8JfQorCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRDbGFzc1RleHRSYW5nZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbEVtYmVkZGVkMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9WaXJ0dWFsWG1sRW1iZWRkZWQyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWVhMzQwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbEVtYmVkZGVkMl8wLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxFbWJlZGRlZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sRW1iZWRkZWQyXzAgZXh0ZW5kcyBYbWxFbWJlZGRlZAoreworCQkKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFFbWJlZGRlZE1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbEVtYmVkZGVkIHZpcnR1YWxYbWxFbWJlZGRlZDsKKwkJCisJcHVibGljIFZpcnR1YWxYbWxFbWJlZGRlZDJfMChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkTWFwcGluZyBqYXZhRW1iZWRkZWRNYXBwaW5nKSB7CisJCXN1cGVyKCk7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFFbWJlZGRlZE1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbEVtYmVkZGVkID0gbmV3IFZpcnR1YWxYbWxFbWJlZGRlZChvcm1UeXBlTWFwcGluZywgamF2YUVtYmVkZGVkTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJfQorCQkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbEVtYmVkZGVkSWQyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxFbWJlZGRlZElkMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlZDk2NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxFbWJlZGRlZElkMl8wLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbEVtYmVkZGVkSWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sRW1iZWRkZWRJZDJfMCBleHRlbmRzIFhtbEVtYmVkZGVkSWQKK3sKKwkJCisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhRW1iZWRkZWRJZE1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbEVtYmVkZGVkSWQgdmlydHVhbFhtbEVtYmVkZGVkSWQ7CisJCQorCXB1YmxpYyBWaXJ0dWFsWG1sRW1iZWRkZWRJZDJfMChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFFbWJlZGRlZElkTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhRW1iZWRkZWRJZE1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQgPSBuZXcgVmlydHVhbFhtbEVtYmVkZGVkSWQob3JtVHlwZU1hcHBpbmcsIGphdmFFbWJlZGRlZElkTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZElkLmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQuc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWRJZC5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZElkLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbElkMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9WaXJ0dWFsWG1sSWQyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTA2NjRjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbElkMl8wLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAorICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbElkMl8wIGV4dGVuZHMgWG1sSWQKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFJZE1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbElkIHZpcnR1YWxYbWxJZDsKKworCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IyXzAgdmlydHVhbFNlcXVlbmNlR2VuZXJhdG9yOworCQkKKwlwdWJsaWMgVmlydHVhbFhtbElkMl8wKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUlkTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sSWQgPSBuZXcgVmlydHVhbFhtbElkKG9ybVR5cGVNYXBwaW5nLCBqYXZhSWRNYXBwaW5nKTsKKwkJdGhpcy52aXJ0dWFsU2VxdWVuY2VHZW5lcmF0b3IgPSBuZXcgVmlydHVhbFhtbFNlcXVlbmNlR2VuZXJhdG9yMl8wKGphdmFJZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCksIHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbElkLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldENvbHVtbigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0Q29sdW1uKHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0VGVtcG9yYWwoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpeworCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRUZW1wb3JhbChuZXdUZW1wb3JhbCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRUZW1wb3JhbFRleHRSYW5nZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBYbWxHZW5lcmF0ZWRWYWx1ZSBnZXRHZW5lcmF0ZWRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldEdlbmVyYXRlZFZhbHVlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbElkLnNldEdlbmVyYXRlZFZhbHVlKHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSB7CisJCWlmICh0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpIHsKKwkJCXJldHVybiB0aGlzLnZpcnR1YWxTZXF1ZW5jZUdlbmVyYXRvcjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvciB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRUYWJsZUdlbmVyYXRvcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbElkLnNldFRhYmxlR2VuZXJhdG9yKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVudW1UeXBlIGdldEVudW1lcmF0ZWQoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRFbnVtZXJhdGVkKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0RW51bWVyYXRlZCh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNMb2IoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5pc0xvYigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRMb2IodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldExvYlRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldExvYlRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbE1hbnlUb01hbnkyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxNYW55VG9NYW55Ml8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4MTY0OAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxNYW55VG9NYW55Ml8wLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxNYW55VG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAorICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbE1hbnlUb01hbnkyXzAgZXh0ZW5kcyBYbWxNYW55VG9NYW55Cit7CisJCQorCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCisJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxNYW55VG9NYW55IHZpcnR1YWxYbWxNYW55VG9NYW55OworCQkKKwlwdWJsaWMgVmlydHVhbFhtbE1hbnlUb01hbnkyXzAoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YU1hbnlUb01hbnlNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55ID0gbmV3IFZpcnR1YWxYbWxNYW55VG9NYW55KG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFueVRvTWFueU1hcHBpbmcpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRGZXRjaCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldEZldGNoKG5ld0ZldGNoKTsKKwl9CisKKwlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldEpvaW5Db2x1bW5zKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldENhc2NhZGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldENhc2NhZGUodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldEpvaW5UYWJsZSh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0VGFyZ2V0RW50aXR5KHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0TWFwcGVkQnkodmFsdWUpOworCX0KKworCQorCUBPdmVycmlkZQorCXB1YmxpYyBNYXBLZXkgZ2V0TWFwS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRNYXBLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TWFwS2V5KE1hcEtleSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldE1hcEtleSh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0T3JkZXJCeSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5KFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldE9yZGVyQnkodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRNYXBwZWRCeVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9WaXJ0dWFsWG1sTWFueVRvT25lMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9WaXJ0dWFsWG1sTWFueVRvT25lMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1ZDhiOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxNYW55VG9PbmUyXzAuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxNYW55VG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbE1hbnlUb09uZTJfMCBleHRlbmRzIFhtbE1hbnlUb09uZQorewkJCisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhTWFueVRvT25lTWFwcGluZzJfMCBqYXZhQXR0cmlidXRlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbE1hbnlUb09uZSB2aXJ0dWFsWG1sTWFueVRvT25lOworCQorCQorCXB1YmxpYyBWaXJ0dWFsWG1sTWFueVRvT25lMl8wKAorCQkJT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIAorCQkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgamF2YU1hbnlUb09uZU1hcHBpbmcpIHsKKwkJCisJCXN1cGVyKCk7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFNYW55VG9PbmVNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUgPSBuZXcgVmlydHVhbFhtbE1hbnlUb09uZShvcm1UeXBlTWFwcGluZywgamF2YU1hbnlUb09uZU1hcHBpbmcpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRGZXRjaCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuc2V0RmV0Y2gobmV3RmV0Y2gpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldE9wdGlvbmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuc2V0T3B0aW9uYWwobmV3T3B0aW9uYWwpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0Sm9pbkNvbHVtbnMoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2FzY2FkZVR5cGUgZ2V0Q2FzY2FkZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRDYXNjYWRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENhc2NhZGUoQ2FzY2FkZVR5cGUgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLnNldENhc2NhZGUodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRKb2luVGFibGUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXRKb2luVGFibGUodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBnZXRJZCgpIHsKKwkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlib29sZWFuIGphdmFJZFZhbHVlID0gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpOworCQlyZXR1cm4gKGphdmFJZFZhbHVlKSA/IEJvb2xlYW4uVFJVRSA6IG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldElkKEJvb2xlYW4gbmV3SWQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9WaXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTVkODJmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nMl8wLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogVmlydHVhbFZlcnNpb24gaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgVmVyc2lvbiB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YVZlcnNpb25NYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZzJfMCBleHRlbmRzIFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZworeworCQorCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZyB2aXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7CisJCisJcHVibGljIFZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZzJfMChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nID0gbmV3IFZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZyhvcm1UeXBlTWFwcGluZywgamF2YUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CQorCQorCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbE9uZVRvTWFueTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbE9uZVRvTWFueTJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYzUwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9WaXJ0dWFsWG1sT25lVG9NYW55Ml8wLmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sT25lVG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxYbWxPbmVUb01hbnkyXzAgZXh0ZW5kcyBYbWxPbmVUb01hbnkKK3sKKwkJCisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhQXR0cmlidXRlTWFwcGluZzsKKworCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sT25lVG9NYW55IHZpcnR1YWxYbWxPbmVUb01hbnk7CisJCQorCXB1YmxpYyBWaXJ0dWFsWG1sT25lVG9NYW55Ml8wKAorCQkJT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFPbmVUb01hbnlNYXBwaW5nMl8wIGphdmFPbmVUb01hbnlNYXBwaW5nKSB7CisJCXN1cGVyKCk7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFPbmVUb01hbnlNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkgPSBuZXcgVmlydHVhbFhtbE9uZVRvTWFueShvcm1UeXBlTWFwcGluZywgamF2YU9uZVRvTWFueU1hcHBpbmcpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldEZldGNoKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRGZXRjaChuZXdGZXRjaCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0Q2FzY2FkZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRDYXNjYWRlKHZhbHVlKTsKKwl9CisJCisJcHJpdmF0ZSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcpIHsKKwkJcmV0dXJuICgoSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvTWFueU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEJvb2xlYW4gZ2V0T3JwaGFuUmVtb3ZhbCgpIHsKKwkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZih0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpOworCQl9CisJCXJldHVybiBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuIG5ld09ycGhhblJlbW92YWwpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldEpvaW5UYWJsZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldEpvaW5UYWJsZSh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldFRhcmdldEVudGl0eSh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TWFwcGVkQnkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRNYXBwZWRCeSh2YWx1ZSk7CisJfQorCisJCisJQE92ZXJyaWRlCisJcHVibGljIE1hcEtleSBnZXRNYXBLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TWFwS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE1hcEtleShNYXBLZXkgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldE1hcEtleSh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRPcmRlckJ5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE9yZGVyQnkoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRPcmRlckJ5KHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRNYXBwZWRCeVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKTsKKwl9CQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRKb2luQ29sdW1ucygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbE9uZVRvT25lMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9WaXJ0dWFsWG1sT25lVG9PbmUyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzVkN2MyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbE9uZVRvT25lMl8wLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sT25lVG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbE9uZVRvT25lMl8wIGV4dGVuZHMgWG1sT25lVG9PbmUKK3sJCQorCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YU9uZVRvT25lTWFwcGluZzJfMCBqYXZhQXR0cmlidXRlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbE9uZVRvT25lIHZpcnR1YWxYbWxPbmVUb09uZTsKKwkKKwkKKwlwdWJsaWMgVmlydHVhbFhtbE9uZVRvT25lMl8wKAorCQkJT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIAorCQkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBqYXZhT25lVG9PbmVNYXBwaW5nKSB7CisJCQorCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhT25lVG9PbmVNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZSA9IG5ldyBWaXJ0dWFsWG1sT25lVG9PbmUob3JtVHlwZU1hcHBpbmcsIGphdmFPbmVUb09uZU1hcHBpbmcpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldEZldGNoKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldEZldGNoKG5ld0ZldGNoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE9wdGlvbmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRPcHRpb25hbChuZXdPcHRpb25hbCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0Sm9pbkNvbHVtbnMoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2FzY2FkZVR5cGUgZ2V0Q2FzY2FkZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldENhc2NhZGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRDYXNjYWRlKHZhbHVlKTsKKwl9CisJCisJcHJpdmF0ZSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nKSB7CisJCXJldHVybiAoKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvbmVUb09uZU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEJvb2xlYW4gZ2V0T3JwaGFuUmVtb3ZhbCgpIHsKKwkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZih0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpOworCQl9CisJCXJldHVybiBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuIG5ld09ycGhhblJlbW92YWwpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0Sm9pblRhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRKb2luVGFibGUodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0VGFyZ2V0RW50aXR5KHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0TWFwcGVkQnkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0TWFwcGVkQnkodmFsdWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRNYXBwZWRCeVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGdldElkKCkgeworCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWJvb2xlYW4gamF2YUlkVmFsdWUgPSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCk7CisJCXJldHVybiAoamF2YUlkVmFsdWUpID8gQm9vbGVhbi5UUlVFIDogbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0SWQoQm9vbGVhbiBuZXdJZCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9WaXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxTZXF1ZW5jZUdlbmVyYXRvcjJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZmY1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9WaXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IyXzAuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRvckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlcXVlbmNlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxTZXF1ZW5jZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiAgR2VuZXJpYzJfMFZpcnR1YWxYbWxTZXF1ZW5jZUdlbmVyYXRvcgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbFNlcXVlbmNlR2VuZXJhdG9yMl8wIGV4dGVuZHMgWG1sU2VxdWVuY2VHZW5lcmF0b3IKK3sKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUdlbmVyYXRvckNvbnRhaW5lciBqYXZhR2VuZXJhdG9ySG9sZGVyOworCisJcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZTsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbFNlcXVlbmNlR2VuZXJhdG9yIHZpcnR1YWxYbWxTZXF1ZW5jZUdlbmVyYXRvcjsKKworCXB1YmxpYyBWaXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IyXzAoSmF2YUdlbmVyYXRvckNvbnRhaW5lciBqYXZhR2VuZXJhdG9ySG9sZGVyLCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGUpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5qYXZhR2VuZXJhdG9ySG9sZGVyID0gamF2YUdlbmVyYXRvckhvbGRlcjsKKwkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKKwkJdGhpcy52aXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IgPSBuZXcgVmlydHVhbFhtbFNlcXVlbmNlR2VuZXJhdG9yKGphdmFHZW5lcmF0b3JIb2xkZXIsIG1ldGFkYXRhQ29tcGxldGUpOworCX0KKworCXByb3RlY3RlZCBKYXZhU2VxdWVuY2VHZW5lcmF0b3IgZ2V0SmF2YVNlcXVlbmNlR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gdGhpcy5qYXZhR2VuZXJhdG9ySG9sZGVyLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKKwkJcmV0dXJuICgoR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMCl0aGlzLmdldEphdmFTZXF1ZW5jZUdlbmVyYXRvcigpKS5nZXRDYXRhbG9nKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIG5ld0NhdGFsb2cpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgeworCQlyZXR1cm4gKChHZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wKXRoaXMuZ2V0SmF2YVNlcXVlbmNlR2VuZXJhdG9yKCkpLmdldFNjaGVtYSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIG5ld1NjaGVtYSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEludGVnZXIgZ2V0QWxsb2NhdGlvblNpemUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxTZXF1ZW5jZUdlbmVyYXRvci5nZXRBbGxvY2F0aW9uU2l6ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyIG5ld0FsbG9jYXRpb25TaXplKSB7CisJCXRoaXMudmlydHVhbFhtbFNlcXVlbmNlR2VuZXJhdG9yLnNldEFsbG9jYXRpb25TaXplKG5ld0FsbG9jYXRpb25TaXplKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEludGVnZXIgZ2V0SW5pdGlhbFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IuZ2V0SW5pdGlhbFZhbHVlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEluaXRpYWxWYWx1ZShJbnRlZ2VyIG5ld0luaXRpYWxWYWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxTZXF1ZW5jZUdlbmVyYXRvci5zZXRJbml0aWFsVmFsdWUobmV3SW5pdGlhbFZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbFNlcXVlbmNlR2VuZXJhdG9yLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFNlcXVlbmNlR2VuZXJhdG9yLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRTZXF1ZW5jZU5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxTZXF1ZW5jZUdlbmVyYXRvci5nZXRTZXF1ZW5jZU5hbWUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0U2VxdWVuY2VOYW1lKFN0cmluZyBuZXdTZXF1ZW5jZU5hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sU2VxdWVuY2VHZW5lcmF0b3Iuc2V0U2VxdWVuY2VOYW1lKG5ld1NlcXVlbmNlTmFtZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9WaXJ0dWFsWG1sVHJhbnNpZW50Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9WaXJ0dWFsWG1sVHJhbnNpZW50Ml8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlMDY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxUcmFuc2llbnQyXzAuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbFRyYW5zaWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsWG1sVHJhbnNpZW50Ml8wIGV4dGVuZHMgWG1sVHJhbnNpZW50Cit7CisJCQorCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YVRyYW5zaWVudE1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbFRyYW5zaWVudCB2aXJ0dWFsWG1sVHJhbnNpZW50OworCQorCXB1YmxpYyBWaXJ0dWFsWG1sVHJhbnNpZW50Ml8wKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhVHJhbnNpZW50TWFwcGluZyBqYXZhVHJhbnNpZW50TWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhVHJhbnNpZW50TWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sVHJhbnNpZW50ID0gbmV3IFZpcnR1YWxYbWxUcmFuc2llbnQob3JtVHlwZU1hcHBpbmcsIGphdmFUcmFuc2llbnRNYXBwaW5nKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVHJhbnNpZW50LmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVHJhbnNpZW50LmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbFRyYW5zaWVudC5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxUcmFuc2llbnQuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vVmlydHVhbFhtbFZlcnNpb24yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxWZXJzaW9uMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjMzUzNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL1ZpcnR1YWxYbWxWZXJzaW9uMl8wLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbFZlcnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAorICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbFhtbFZlcnNpb24yXzAgZXh0ZW5kcyBYbWxWZXJzaW9uCit7CisJCQorCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YVZlcnNpb25NYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCisJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxWZXJzaW9uIHZpcnR1YWxYbWxWZXJzaW9uOworCQorCXB1YmxpYyBWaXJ0dWFsWG1sVmVyc2lvbjJfMChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YVZlcnNpb25NYXBwaW5nIGphdmFWZXJzaW9uTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhVmVyc2lvbk1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbFZlcnNpb24gPSBuZXcgVmlydHVhbFhtbFZlcnNpb24ob3JtVHlwZU1hcHBpbmcsIGphdmFWZXJzaW9uTWFwcGluZyk7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbFZlcnNpb24uc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldENvbHVtbigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5zZXRDb2x1bW4odmFsdWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldFRlbXBvcmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFbnVtVHlwZSBnZXRFbnVtZXJhdGVkKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXRFbnVtZXJhdGVkKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzTG9iKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5pc0xvYigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldExvYlRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0TG9iVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldFRlbXBvcmFsVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2YzZmEzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkdlbmVyaWNDb25uZWN0aW9uMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkdlbmVyaWNPcHRpb25zMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5KcGFPcHRpb25zMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKKworCitwdWJsaWMgY2xhc3MgR2VuZXJpYzJfMFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeQoreworCUBPdmVycmlkZQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQyXzAgYnVpbGRQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMChwYXJlbnQsIHhtbFBlcnNpc3RlbmNlVW5pdCk7CisJfQorCQkKKwlwdWJsaWMgSnBhQ29ubmVjdGlvbjJfMCBidWlsZENvbm5lY3Rpb24oUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNDb25uZWN0aW9uMl8wKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBKcGFPcHRpb25zMl8wIGJ1aWxkT3B0aW9ucyhQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09wdGlvbnMyXzAocGFyZW50KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2NThlZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbERlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMEZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IEdlbmVyaWMyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBHZW5lcmljMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpIHsKKwkJcmV0dXJuIFBlcnNpc3RlbmNlVjJfMEZhY3RvcnkuZUlOU1RBTkNFOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpYzJfMFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5KCk7CisJfQorCQorCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgeworCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMl8wX1JFU09VUkNFX1RZUEU7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzA2N2MyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wLmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcGFDb25uZWN0aW9uMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkpwYU9wdGlvbnMyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuU2hhcmVkQ2FjaGVNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlZhbGlkYXRpb25Nb2RlOworCisvKioKKyAqIEpQQSAyLjAgcGVyc2lzdGVuY2UtdW5pdAorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMAorCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQKKwlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlVW5pdDJfMAoreworCXByb3RlY3RlZCBTaGFyZWRDYWNoZU1vZGUgc3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlOworCXByb3RlY3RlZCBTaGFyZWRDYWNoZU1vZGUgZGVmYXVsdFNoYXJlZENhY2hlTW9kZTsKKwkKKwlwcm90ZWN0ZWQgVmFsaWRhdGlvbk1vZGUgc3BlY2lmaWVkVmFsaWRhdGlvbk1vZGU7CisJcHJvdGVjdGVkIFZhbGlkYXRpb25Nb2RlIGRlZmF1bHRWYWxpZGF0aW9uTW9kZTsKKwkKKwlwcml2YXRlIEpwYUNvbm5lY3Rpb24yXzAgY29ubmVjdGlvbjsKKwlwcml2YXRlIEpwYU9wdGlvbnMyXzAgb3B0aW9uczsKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKKwlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMChQZXJzaXN0ZW5jZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQpIHsKKwkJc3VwZXIocGFyZW50LCB4bWxQZXJzaXN0ZW5jZVVuaXQpOworCisJCXRoaXMuc3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlID0gdGhpcy5idWlsZFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSgpOworCQl0aGlzLmRlZmF1bHRTaGFyZWRDYWNoZU1vZGUgPSB0aGlzLmJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlTW9kZSgpOworCisJCXRoaXMuc3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUoKTsKKwkJdGhpcy5kZWZhdWx0VmFsaWRhdGlvbk1vZGUgPSB0aGlzLmJ1aWxkRGVmYXVsdFZhbGlkYXRpb25Nb2RlKCk7CisJfQorCisJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgU2hhcmVkQ2FjaGVNb2RlIGJ1aWxkU3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKCkgeworCQlyZXR1cm4gU2hhcmVkQ2FjaGVNb2RlLmZyb21YbWxSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0U2hhcmVkQ2FjaGVNb2RlKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgU2hhcmVkQ2FjaGVNb2RlIGJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlTW9kZSgpIHsKKwkJcmV0dXJuIFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRDsKKwl9CisKKwlwcm90ZWN0ZWQgVmFsaWRhdGlvbk1vZGUgYnVpbGRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSgpIHsKKwkJcmV0dXJuIFZhbGlkYXRpb25Nb2RlLmZyb21YbWxSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0VmFsaWRhdGlvbk1vZGUoKSk7CisJfQorCQorCXByb3RlY3RlZCBWYWxpZGF0aW9uTW9kZSBidWlsZERlZmF1bHRWYWxpZGF0aW9uTW9kZSgpIHsKKwkJcmV0dXJuIERFRkFVTFRfVkFMSURBVElPTl9NT0RFOyAKKwl9CisJCisJLy8gKioqKioqKioqKiBwcm9wZXJ0aWVzICoqKioqKioqKioKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKKwkJCisJCXRoaXMuY29ubmVjdGlvbiA9IChKcGFDb25uZWN0aW9uMl8wKSBnZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb24odGhpcyk7CisJCXRoaXMub3B0aW9ucyA9IChKcGFPcHRpb25zMl8wKSBnZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9wdGlvbnModGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgeworCQlzdXBlci5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKKwkJdGhpcy5jb25uZWN0aW9uLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOworCQl0aGlzLm9wdGlvbnMucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCXN1cGVyLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eU5hbWUpOworCQl0aGlzLmNvbm5lY3Rpb24ucHJvcGVydHlSZW1vdmVkKHByb3BlcnR5TmFtZSk7CisJCXRoaXMub3B0aW9ucy5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKKwl9CisKKwlwdWJsaWMgSnBhQ29ubmVjdGlvbjJfMCBnZXRDb25uZWN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uOworCX0KKworCXB1YmxpYyBKcGFPcHRpb25zMl8wIGdldE9wdGlvbnMoKSB7CisJCXJldHVybiB0aGlzLm9wdGlvbnM7CisJfQorCisJLy8gKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0IHhwdSkgeworCQlzdXBlci51cGRhdGUoeHB1KTsKKwkJCisJCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0ID0geHB1OworCQl0aGlzLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSh0aGlzLmJ1aWxkU3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKCkpOworCQl0aGlzLnNldERlZmF1bHRTaGFyZWRDYWNoZU1vZGUodGhpcy5idWlsZERlZmF1bHRTaGFyZWRDYWNoZU1vZGUoKSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUodGhpcy5idWlsZFNwZWNpZmllZFZhbGlkYXRpb25Nb2RlKCkpOworCQl0aGlzLnNldERlZmF1bHRWYWxpZGF0aW9uTW9kZSh0aGlzLmJ1aWxkRGVmYXVsdFZhbGlkYXRpb25Nb2RlKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBzaGFyZWQgY2FjaGUgbW9kZSAqKioqKioqKioqCisKKwlwdWJsaWMgU2hhcmVkQ2FjaGVNb2RlIGdldFNoYXJlZENhY2hlTW9kZSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlIDogdGhpcy5kZWZhdWx0U2hhcmVkQ2FjaGVNb2RlOworCX0KKworCXB1YmxpYyBTaGFyZWRDYWNoZU1vZGUgZ2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZSBzcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUpIHsKKwkJU2hhcmVkQ2FjaGVNb2RlIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlOworCQl0aGlzLnNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSA9IHNwZWNpZmllZFNoYXJlZENhY2hlTW9kZTsKKwkJdGhpcy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5zZXRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLnRvWG1sUmVzb3VyY2VNb2RlbChzcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUpKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TSEFSRURfQ0FDSEVfTU9ERV9QUk9QRVJUWSwgb2xkLCBzcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUpOworCX0KKworCXB1YmxpYyBTaGFyZWRDYWNoZU1vZGUgZ2V0RGVmYXVsdFNoYXJlZENhY2hlTW9kZSgpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdFNoYXJlZENhY2hlTW9kZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZSBkZWZhdWx0U2hhcmVkQ2FjaGVNb2RlKSB7CisJCVNoYXJlZENhY2hlTW9kZSBvbGQgPSB0aGlzLmRlZmF1bHRTaGFyZWRDYWNoZU1vZGU7CisJCXRoaXMuZGVmYXVsdFNoYXJlZENhY2hlTW9kZSA9IGRlZmF1bHRTaGFyZWRDYWNoZU1vZGU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NIQVJFRF9DQUNIRV9NT0RFX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRTaGFyZWRDYWNoZU1vZGUpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgeworCQlzd2l0Y2ggKGdldFNoYXJlZENhY2hlTW9kZSgpKSB7CisJCQljYXNlIE5PTkU6CisJCQljYXNlIEVOQUJMRV9TRUxFQ1RJVkU6CisJCQljYXNlIFVOU1BFQ0lGSUVEOgorCQkJCXJldHVybiBmYWxzZTsKKwkJCWNhc2UgQUxMOgorCQkJY2FzZSBESVNBQkxFX1NFTEVDVElWRToKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7Ly9udWxsCisJfQorCQorCQorCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiBtb2RlICoqKioqKioqKioKKworCXB1YmxpYyBWYWxpZGF0aW9uTW9kZSBnZXRWYWxpZGF0aW9uTW9kZSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFZhbGlkYXRpb25Nb2RlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSA6IHRoaXMuZGVmYXVsdFZhbGlkYXRpb25Nb2RlOworCX0KKworCXB1YmxpYyBWYWxpZGF0aW9uTW9kZSBnZXRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVmFsaWRhdGlvbk1vZGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUoVmFsaWRhdGlvbk1vZGUgc3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUpIHsKKwkJVmFsaWRhdGlvbk1vZGUgb2xkID0gdGhpcy5zcGVjaWZpZWRWYWxpZGF0aW9uTW9kZTsKKwkJdGhpcy5zcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSA9IHNwZWNpZmllZFZhbGlkYXRpb25Nb2RlOworCQl0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLnNldFZhbGlkYXRpb25Nb2RlKFZhbGlkYXRpb25Nb2RlLnRvWG1sUmVzb3VyY2VNb2RlbChzcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSkpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1ZBTElEQVRJT05fTU9ERV9QUk9QRVJUWSwgb2xkLCBzcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSk7CisJfQorCisJcHVibGljIFZhbGlkYXRpb25Nb2RlIGdldERlZmF1bHRWYWxpZGF0aW9uTW9kZSgpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbGlkYXRpb25Nb2RlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRWYWxpZGF0aW9uTW9kZShWYWxpZGF0aW9uTW9kZSBkZWZhdWx0VmFsaWRhdGlvbk1vZGUpIHsKKwkJVmFsaWRhdGlvbk1vZGUgb2xkID0gdGhpcy5kZWZhdWx0VmFsaWRhdGlvbk1vZGU7CisJCXRoaXMuZGVmYXVsdFZhbGlkYXRpb25Nb2RlID0gZGVmYXVsdFZhbGlkYXRpb25Nb2RlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9WQUxJREFUSU9OX01PREVfUFJPUEVSVFksIG9sZCwgZGVmYXVsdFZhbGlkYXRpb25Nb2RlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vR2VuZXJpY0Nvbm5lY3Rpb24yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9HZW5lcmljQ29ubmVjdGlvbjJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Zjk3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vR2VuZXJpY0Nvbm5lY3Rpb24yXzAuamF2YQpAQCAtMCwwICsxLDE5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7CisKKy8qKgorICogIEdlbmVyaWNDb25uZWN0aW9uMl8wCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljQ29ubmVjdGlvbjJfMCBleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllcworCWltcGxlbWVudHMgSnBhQ29ubmVjdGlvbjJfMAoreworCS8vICoqKioqKioqKiogR2VuZXJpY0Nvbm5lY3Rpb24gcHJvcGVydGllcyAqKioqKioqKioqCisJcHJpdmF0ZSBTdHJpbmcgZHJpdmVyOworCXByaXZhdGUgU3RyaW5nIHVybDsKKwlwcml2YXRlIFN0cmluZyB1c2VyOworCXByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOworCQorCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgorCXB1YmxpYyBHZW5lcmljQ29ubmVjdGlvbjJfMChQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCisJLyoqCisJICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgeworCQl0aGlzLmRyaXZlciA9IAorCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShQRVJTSVNURU5DRV9KREJDX0RSSVZFUik7CisJCXRoaXMudXJsID0gCisJCQl0aGlzLmdldFN0cmluZ1ZhbHVlKFBFUlNJU1RFTkNFX0pEQkNfVVJMKTsKKwkJdGhpcy51c2VyID0gCisJCQl0aGlzLmdldFN0cmluZ1ZhbHVlKFBFUlNJU1RFTkNFX0pEQkNfVVNFUik7CisJCXRoaXMucGFzc3dvcmQgPSAKKwkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCk7CisJfQorCisJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSKSkgeworCQkJdGhpcy5kcml2ZXJDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX0pEQkNfVVJMKSkgeworCQkJdGhpcy51cmxDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX0pEQkNfVVNFUikpIHsKKwkJCXRoaXMudXNlckNoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCkpIHsKKwkJCXRoaXMucGFzc3dvcmRDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSKSkgeworCQkJdGhpcy5kcml2ZXJDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfSkRCQ19VUkwpKSB7CisJCQl0aGlzLnVybENoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9KREJDX1VTRVIpKSB7CisJCQl0aGlzLnVzZXJDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCkpIHsKKwkJCXRoaXMucGFzc3dvcmRDaGFuZ2VkKG51bGwpOworCQl9CisJfQorCisJLyoqCisJICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKKwkgKiAJCWtleSA9IFBVIHByb3BlcnR5IGtleQorCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJUEVSU0lTVEVOQ0VfSkRCQ19EUklWRVIsCisJCQlEUklWRVJfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCVBFUlNJU1RFTkNFX0pEQkNfVVJMLAorCQkJVVJMX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlQRVJTSVNURU5DRV9KREJDX1VTRVIsCisJCQlVU0VSX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlQRVJTSVNURU5DRV9KREJDX1BBU1NXT1JELAorCQkJUEFTU1dPUkRfUFJPUEVSVFkpOworCX0KKworCS8vICoqKioqKioqKiogRHJpdmVyICoqKioqKioqKioKKwlwdWJsaWMgU3RyaW5nIGdldERyaXZlcigpIHsKKwkJcmV0dXJuIHRoaXMuZHJpdmVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldERyaXZlcihTdHJpbmcgbmV3RHJpdmVyKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmRyaXZlcjsKKwkJdGhpcy5kcml2ZXIgPSBuZXdEcml2ZXI7CisJCXRoaXMucHV0UHJvcGVydHkoRFJJVkVSX1BST1BFUlRZLCBuZXdEcml2ZXIpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRFJJVkVSX1BST1BFUlRZLCBvbGQsIG5ld0RyaXZlcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRyaXZlckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmRyaXZlcjsKKwkJdGhpcy5kcml2ZXIgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERSSVZFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0RHJpdmVyKCkgeworCQlyZXR1cm4gREVGQVVMVF9KREJDX0RSSVZFUjsKKwl9CisKKwkvLyAqKioqKioqKioqIFVSTCAqKioqKioqKioqCisJcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisJCXJldHVybiB0aGlzLnVybDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIG5ld1VybCkgeworCQlTdHJpbmcgb2xkID0gdGhpcy51cmw7CisJCXRoaXMudXJsID0gbmV3VXJsOworCQl0aGlzLnB1dFByb3BlcnR5KFVSTF9QUk9QRVJUWSwgbmV3VXJsKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFVSTF9QUk9QRVJUWSwgb2xkLCBuZXdVcmwpOworCX0KKworCXByaXZhdGUgdm9pZCB1cmxDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy51cmw7CisJCXRoaXMudXJsID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVUkxfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFVybCgpIHsKKwkJcmV0dXJuIERFRkFVTFRfSkRCQ19VUkw7CisJfQorCisJLy8gKioqKioqKioqKiBVc2VyICoqKioqKioqKioKKwlwdWJsaWMgU3RyaW5nIGdldFVzZXIoKSB7CisJCXJldHVybiB0aGlzLnVzZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXNlcihTdHJpbmcgbmV3VXNlcikgeworCQlTdHJpbmcgb2xkID0gdGhpcy51c2VyOworCQl0aGlzLnVzZXIgPSBuZXdVc2VyOworCQl0aGlzLnB1dFByb3BlcnR5KFVTRVJfUFJPUEVSVFksIG5ld1VzZXIpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVVNFUl9QUk9QRVJUWSwgb2xkLCBuZXdVc2VyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXNlckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnVzZXI7CisJCXRoaXMudXNlciA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVVNFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VXNlcigpIHsKKwkJcmV0dXJuIERFRkFVTFRfSkRCQ19VU0VSOworCX0KKworCS8vICoqKioqKioqKiogUGFzc3dvcmQgKioqKioqKioqKgorCXB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisJCXJldHVybiB0aGlzLnBhc3N3b3JkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBuZXdQYXNzd29yZCkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5wYXNzd29yZDsKKwkJdGhpcy5wYXNzd29yZCA9IG5ld1Bhc3N3b3JkOworCQl0aGlzLnB1dFByb3BlcnR5KFBBU1NXT1JEX1BST1BFUlRZLCBuZXdQYXNzd29yZCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQQVNTV09SRF9QUk9QRVJUWSwgb2xkLCBuZXdQYXNzd29yZCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBhc3N3b3JkQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMucGFzc3dvcmQ7CisJCXRoaXMucGFzc3dvcmQgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBBU1NXT1JEX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYXNzd29yZCgpIHsKKwkJcmV0dXJuIERFRkFVTFRfSkRCQ19QQVNTV09SRDsKKwl9CisKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9OdWxsQ29ubmVjdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL051bGxDb25uZWN0aW9uMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3MTMwZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9OdWxsQ29ubmVjdGlvbjJfMC5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7CisKKy8qKgorICogIEdlbmVyaWNDb25uZWN0aW9uMl8wCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsQ29ubmVjdGlvbjJfMCBleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllcworCWltcGxlbWVudHMgSnBhQ29ubmVjdGlvbjJfMAoreworCQorCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgorCXB1YmxpYyBOdWxsQ29ubmVjdGlvbjJfMChQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCisJLyoqCisJICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgeworCQkvL2RvIG5vdGhpbmcKKwl9CisKKwkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKKwkKKwlwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3VmFsdWUpIHsKKwkJLy9kbyBub3RoaW5nCisJfQorCisJcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJLy9kbyBub3RoaW5nCisJfQorCisJLyoqCisJICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKKwkgKiAJCWtleSA9IFBVIHByb3BlcnR5IGtleQorCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCS8vZG8gbm90aGluZworCX0KKworCS8vICoqKioqKioqKiogRHJpdmVyICoqKioqKioqKioKKwlwdWJsaWMgU3RyaW5nIGdldERyaXZlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgc2V0RHJpdmVyKFN0cmluZyBuZXdEcml2ZXIpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0RHJpdmVyKCkgeworCQlyZXR1cm4gREVGQVVMVF9KREJDX0RSSVZFUjsKKwl9CisKKwkvLyAqKioqKioqKioqIFVSTCAqKioqKioqKioqCisJcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgbmV3VXJsKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFVybCgpIHsKKwkJcmV0dXJuIERFRkFVTFRfSkRCQ19VUkw7CisJfQorCisJLy8gKioqKioqKioqKiBVc2VyICoqKioqKioqKioKKwlwdWJsaWMgU3RyaW5nIGdldFVzZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVzZXIoU3RyaW5nIG5ld1VzZXIpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VXNlcigpIHsKKwkJcmV0dXJuIERFRkFVTFRfSkRCQ19VU0VSOworCX0KKworCS8vICoqKioqKioqKiogUGFzc3dvcmQgKioqKioqKioqKgorCXB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBuZXdQYXNzd29yZCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYXNzd29yZCgpIHsKKwkJcmV0dXJuIERFRkFVTFRfSkRCQ19QQVNTV09SRDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvR2VuZXJpY09wdGlvbnMyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9HZW5lcmljT3B0aW9uczJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZjcwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvR2VuZXJpY09wdGlvbnMyXzAuamF2YQpAQCAtMCwwICsxLDIzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuSnBhT3B0aW9uczJfMDsKKworLyoqCisgKiBKUEEgMi4wIG9wdGlvbnMKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNPcHRpb25zMl8wIGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCisJaW1wbGVtZW50cyBKcGFPcHRpb25zMl8wCit7CisJLy8gKioqKioqKioqKiBHZW5lcmljQ29ubmVjdGlvbiBwcm9wZXJ0aWVzICoqKioqKioqKioKKwlwcml2YXRlIEludGVnZXIgbG9ja1RpbWVvdXQ7CisJcHJpdmF0ZSBJbnRlZ2VyIHF1ZXJ5VGltZW91dDsKKwlwcml2YXRlIFN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0OworCXByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZTsKKwlwcml2YXRlIFN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmU7CisJCisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCisJcHVibGljIEdlbmVyaWNPcHRpb25zMl8wKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKKwkvKioKKwkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7CisJCXRoaXMubG9ja1RpbWVvdXQgPSAKKwkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKFBFUlNJU1RFTkNFX0xPQ0tfVElNRU9VVCk7CisJCXRoaXMucXVlcnlUaW1lb3V0ID0gCisJCQl0aGlzLmdldEludGVnZXJWYWx1ZShQRVJTSVNURU5DRV9RVUVSWV9USU1FT1VUKTsKKworCQkvLyBWYWxpZGF0aW9uTW9kZSBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGVsZW1lbnQKKwkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0ID0gCisJCQl0aGlzLmdldFN0cmluZ1ZhbHVlKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1QpOworCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSA9IAorCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEUpOworCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSA9IAorCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUpOworCX0KKworCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgorCQorCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgeworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQpKSB7CisJCQl0aGlzLmxvY2tUaW1lb3V0Q2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9RVUVSWV9USU1FT1VUKSkgeworCQkJdGhpcy5xdWVyeVRpbWVvdXRDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1QpKSB7CisJCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURSkpIHsKKwkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUpKSB7CisJCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUNoYW5nZWQobmV3VmFsdWUpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfTE9DS19USU1FT1VUKSkgeworCQkJdGhpcy5sb2NrVGltZW91dENoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9RVUVSWV9USU1FT1VUKSkgeworCQkJdGhpcy5xdWVyeVRpbWVvdXRDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVCkpIHsKKwkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdENoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEUpKSB7CisJCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUNoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUpKSB7CisJCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUNoYW5nZWQobnVsbCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAorCSAqIAkJa2V5ID0gUFUgcHJvcGVydHkga2V5CisJICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlQRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQsCisJCQlMT0NLX1RJTUVPVVRfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCVBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQsCisJCQlRVUVSWV9USU1FT1VUX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNULAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUsCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQyXzAgZ2V0UGVyc2lzdGVuY2VVbml0KCkgeworCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdDJfMCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJfQorCisJLy8gKioqKioqKioqKiBMb2NrVGltZW91dCAqKioqKioqKioqCisJcHVibGljIEludGVnZXIgZ2V0TG9ja1RpbWVvdXQoKSB7CisJCXJldHVybiB0aGlzLmxvY2tUaW1lb3V0OworCX0KKworCXB1YmxpYyB2b2lkIHNldExvY2tUaW1lb3V0KEludGVnZXIgbmV3TG9ja1RpbWVvdXQpIHsKKwkJSW50ZWdlciBvbGQgPSB0aGlzLmxvY2tUaW1lb3V0OworCQl0aGlzLmxvY2tUaW1lb3V0ID0gbmV3TG9ja1RpbWVvdXQ7CisJCXRoaXMucHV0UHJvcGVydHkoTE9DS19USU1FT1VUX1BST1BFUlRZLCBuZXdMb2NrVGltZW91dCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0NLX1RJTUVPVVRfUFJPUEVSVFksIG9sZCwgbmV3TG9ja1RpbWVvdXQpOworCX0KKworCXByaXZhdGUgdm9pZCBsb2NrVGltZW91dENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCUludGVnZXIgbmV3VmFsdWUgPSBnZXRJbnRlZ2VyVmFsdWVPZihzdHJpbmdWYWx1ZSk7CisJCQorCQlJbnRlZ2VyIG9sZCA9IHRoaXMubG9ja1RpbWVvdXQ7CisJCXRoaXMubG9ja1RpbWVvdXQgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExPQ0tfVElNRU9VVF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdExvY2tUaW1lb3V0KCkgeworCQlyZXR1cm4gREVGQVVMVF9MT0NLX1RJTUVPVVQ7CisJfQorCisJLy8gKioqKioqKioqKiBRdWVyeVRpbWVvdXQgKioqKioqKioqKgorCXB1YmxpYyBJbnRlZ2VyIGdldFF1ZXJ5VGltZW91dCgpIHsKKwkJcmV0dXJuIHRoaXMucXVlcnlUaW1lb3V0OworCX0KKworCXB1YmxpYyB2b2lkIHNldFF1ZXJ5VGltZW91dChJbnRlZ2VyIG5ld1F1ZXJ5VGltZW91dCkgeworCQlJbnRlZ2VyIG9sZCA9IHRoaXMucXVlcnlUaW1lb3V0OworCQl0aGlzLnF1ZXJ5VGltZW91dCA9IG5ld1F1ZXJ5VGltZW91dDsKKwkJdGhpcy5wdXRQcm9wZXJ0eShRVUVSWV9USU1FT1VUX1BST1BFUlRZLCBuZXdRdWVyeVRpbWVvdXQpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVFUllfVElNRU9VVF9QUk9QRVJUWSwgb2xkLCBuZXdRdWVyeVRpbWVvdXQpOworCX0KKworCXByaXZhdGUgdm9pZCBxdWVyeVRpbWVvdXRDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOworCQkKKwkJSW50ZWdlciBvbGQgPSB0aGlzLnF1ZXJ5VGltZW91dDsKKwkJdGhpcy5xdWVyeVRpbWVvdXQgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFFVRVJZX1RJTUVPVVRfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRRdWVyeVRpbWVvdXQoKSB7CisJCXJldHVybiBERUZBVUxUX1FVRVJZX1RJTUVPVVQ7CisJfQorCisKKwkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QgKioqKioqKioqKgorCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCgpIHsKKwkJcmV0dXJuIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KFN0cmluZyBuZXdWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3Q7CisJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCA9IG5ld1ZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3Q7CisJCXRoaXMucHV0UHJvcGVydHkoVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwgbmV3VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLCBvbGQsIG5ld1ZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QpOworCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0Q2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdDsKKwkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0ID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KCkgeworCQlyZXR1cm4gREVGQVVMVF9WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUOworCX0KKworCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlICoqKioqKioqKioKKwlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZShTdHJpbmcgbmV3VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZTsKKwkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUgPSBuZXdWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGU7CisJCXRoaXMucHV0UHJvcGVydHkoVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLCBuZXdWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLCBvbGQsIG5ld1ZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZTsKKwkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKCkgeworCQlyZXR1cm4gREVGQVVMVF9WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEU7CisJfQorCisJLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUgKioqKioqKioqKgorCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKCkgeworCQlyZXR1cm4gdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKFN0cmluZyBuZXdWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlOworCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSA9IG5ld1ZhbGlkYXRpb25Hcm91cFByZVJlbW92ZTsKKwkJdGhpcy5wdXRQcm9wZXJ0eShWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksIG5ld1ZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksIG9sZCwgbmV3VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlOworCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoKSB7CisJCXJldHVybiBERUZBVUxUX1ZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvTnVsbE9wdGlvbnMyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9OdWxsT3B0aW9uczJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOTc2ODMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvTnVsbE9wdGlvbnMyXzAuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5KcGFPcHRpb25zMl8wOworCisvKioKKyAqIEpQQSAyLjAgb3B0aW9ucworICovCitwdWJsaWMgY2xhc3MgTnVsbE9wdGlvbnMyXzAgZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKKwlpbXBsZW1lbnRzIEpwYU9wdGlvbnMyXzAKK3sKKwkKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKKwlwdWJsaWMgTnVsbE9wdGlvbnMyXzAoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKworCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCS8qKgorCSAqIEluaXRpYWxpemVzIHByb3BlcnRpZXMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpIHsKKwkJLy9kbyBub3RoaW5nCisJfQorCisJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7CisJCS8vZG8gbm90aGluZworCX0KKworCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCS8vZG8gbm90aGluZworCX0KKworCS8qKgorCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCisJICogCQlrZXkgPSBQVSBwcm9wZXJ0eSBrZXkKKwkgKiAJCXZhbHVlID0gcHJvcGVydHkgaWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQkvL2RvIG5vdGhpbmcKKwl9CisKKwkvLyAqKioqKioqKioqIExvY2tUaW1lb3V0ICoqKioqKioqKioKKwlwdWJsaWMgSW50ZWdlciBnZXRMb2NrVGltZW91dCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgc2V0TG9ja1RpbWVvdXQoSW50ZWdlciBuZXdMb2NrVGltZW91dCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0TG9ja1RpbWVvdXQoKSB7CisJCXJldHVybiBERUZBVUxUX0xPQ0tfVElNRU9VVDsKKwl9CisKKwkvLyAqKioqKioqKioqIFF1ZXJ5VGltZW91dCAqKioqKioqKioqCisJcHVibGljIEludGVnZXIgZ2V0UXVlcnlUaW1lb3V0KCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRRdWVyeVRpbWVvdXQoSW50ZWdlciBuZXdRdWVyeVRpbWVvdXQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFF1ZXJ5VGltZW91dCgpIHsKKwkJcmV0dXJuIERFRkFVTFRfUVVFUllfVElNRU9VVDsKKwl9CisKKworCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCAqKioqKioqKioqCisJcHVibGljIFN0cmluZyBnZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KFN0cmluZyBuZXdWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoKSB7CisJCXJldHVybiBERUZBVUxUX1ZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1Q7CisJfQorCisJLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUgKioqKioqKioqKgorCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoU3RyaW5nIG5ld1ZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoKSB7CisJCXJldHVybiBERUZBVUxUX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURTsKKwl9CisKKwkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSAqKioqKioqKioqCisJcHVibGljIFN0cmluZyBnZXRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZShTdHJpbmcgbmV3VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgpIHsKKwkJcmV0dXJuIERFRkFVTFRfVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQWNjZXNzMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQWNjZXNzMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzJjZDcxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9BY2Nlc3MyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBY2Nlc3MyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQWNjZXNzMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkFjY2VzcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgQWNjZXNzMl8wQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQWNjZXNzMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgQWNjZXNzMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlQWNjZXNzMl8wQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IE51bGxBY2Nlc3MyXzBBbm5vdGF0aW9uKHBhcmVudCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5QWNjZXNzMl8wQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ODVkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uLmJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZShwYXJlbnQsIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXMyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOWI2MjMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZXMyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQXNzb2NpYXRpb25PdmVycmlkZXMyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuQXNzb2NpYXRpb25PdmVycmlkZXMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGVzMl8wQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQXNzb2NpYXRpb25PdmVycmlkZXMyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBBc3NvY2lhdGlvbk92ZXJyaWRlczJfMEFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZXMyXzBBbm5vdGF0aW9uKHBhcmVudCwgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZXMyXzBBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0NhY2hlYWJsZTJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0NhY2hlYWJsZTJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwOTBjOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5Q2FjaGVhYmxlMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUNhY2hlYWJsZTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNhY2hlYWJsZTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuQXNzb2NpYXRpb25PdmVycmlkZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgKFR5cGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlDYWNoZWFibGUyXzBBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0VsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMjcwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0VsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwc0lkMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwc0lkMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzFmNWJiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBzSWQyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TWFwc0lkMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU1hcHNJZDJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcHNJZDJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTWFwc0lkCisgKi8KK3B1YmxpYyBjbGFzcyBNYXBzSWQyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTWFwc0lkMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIE1hcHNJZDJfMEFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VNYXBzSWQyXzBBbm5vdGF0aW9uKHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKKwl9CisJCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IE51bGxNYXBzSWQyXzBBbm5vdGF0aW9uKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeU1hcHNJZDJfMEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIE1hcHNJZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbEFjY2VzczJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbEFjY2VzczJfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzk5MGE1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OdWxsQWNjZXNzMl8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuQWNjZXNzCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsQWNjZXNzMl8wQW5ub3RhdGlvbgorCWV4dGVuZHMgTnVsbEFubm90YXRpb24KKwlpbXBsZW1lbnRzIEFjY2VzczJfMEFubm90YXRpb24KK3sKKworCXByb3RlY3RlZCBOdWxsQWNjZXNzMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBBY2Nlc3MyXzBBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7CisJCXJldHVybiAoQWNjZXNzMl8wQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOworCX0KKwkKKwkvLyAqKioqKiB2YWx1ZQorCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFZhbHVlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0VmFsdWUoQWNjZXNzVHlwZSB2YWx1ZSkgeworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOworCQl9CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL051bGxBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OdWxsQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjQwYzFkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OdWxsQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEpvaW5UYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5Bbm5vdGF0aW9uSW5pdGlhbGl6ZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuSm9pblRhYmxlIGZvdW5kIGluIGEgamF2YXgucGVyc2lzdGVuY2UuQXNzb2NpYXRpb25PdmVycmlkZSBhbm5vdGF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZUFubm90YXRpb24KKwlleHRlbmRzIE51bGxKb2luVGFibGVBbm5vdGF0aW9uCit7CisJcHVibGljIE51bGxBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlQW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlwcml2YXRlIEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0aGlzLnBhcmVudDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pblRhYmxlQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbigpLmFkZEpvaW5UYWJsZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24oKS5hZGRKb2luVGFibGUoaW5pdGlhbGl6ZXIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OdWxsTWFwc0lkMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OdWxsTWFwc0lkMl8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTU1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL051bGxNYXBzSWQyXzBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBzSWQyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBzSWQKKyAqLworcHVibGljIGNsYXNzIE51bGxNYXBzSWQyXzBBbm5vdGF0aW9uCisJZXh0ZW5kcyBOdWxsQW5ub3RhdGlvbgorCWltcGxlbWVudHMgTWFwc0lkMl8wQW5ub3RhdGlvbgoreworCXByb3RlY3RlZCBOdWxsTWFwc0lkMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTWFwc0lkMl8wQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKE1hcHNJZDJfMEFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgeworCQlpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUobmV3VmFsdWUpOworCQl9CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OdWxsT25lVG9NYW55Ml8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OdWxsT25lVG9NYW55Ml8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjdjMDcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL051bGxPbmVUb01hbnkyXzBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsT25lVG9NYW55QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuT25lVG9NYW55Ml8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogIE51bGxPbmVUb01hbnkyXzBBbm5vdGF0aW9uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBOdWxsT25lVG9NYW55Ml8wQW5ub3RhdGlvbgorCWV4dGVuZHMgTnVsbE9uZVRvTWFueUFubm90YXRpb24KKwlpbXBsZW1lbnRzIE9uZVRvTWFueTJfMEFubm90YXRpb24KK3sKKwlwdWJsaWMgTnVsbE9uZVRvTWFueTJfMEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwkvLyAqKioqKioqKioqIEpQQSAyLjAgLSBPcnBoYW5SZW1vdmFibGUyXzAgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCXB1YmxpYyBCb29sZWFuIGdldE9ycGhhblJlbW92YWwoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9ycGhhblJlbW92YWwoQm9vbGVhbiBvcnBoYW5SZW1vdmFsKSB7CisJCWlmIChvcnBoYW5SZW1vdmFsICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldE9ycGhhblJlbW92YWwob3JwaGFuUmVtb3ZhbCk7CisJCX0KKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE9ycGhhblJlbW92YWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9uZVRvTWFueTJfMEFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSBzdXBlci5hZGRBbm5vdGF0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL051bGxPbmVUb09uZTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbE9uZVRvT25lMl8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NjExNmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL051bGxPbmVUb09uZTJfMEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxPbmVUb09uZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9uZVRvT25lMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogIE51bGxPbmVUb09uZTJfMEFubm90YXRpb24KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE51bGxPbmVUb09uZTJfMEFubm90YXRpb24KKwlleHRlbmRzIE51bGxPbmVUb09uZUFubm90YXRpb24KKwlpbXBsZW1lbnRzIE9uZVRvT25lMl8wQW5ub3RhdGlvbgoreworCXB1YmxpYyBOdWxsT25lVG9PbmUyXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJLy8gKioqKioqKioqKiBKUEEgMi4wIC0gT3JwaGFuUmVtb3ZhYmxlMl8wIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKwlwdWJsaWMgQm9vbGVhbiBnZXRPcnBoYW5SZW1vdmFsKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4gb3JwaGFuUmVtb3ZhbCkgeworCQlpZiAob3JwaGFuUmVtb3ZhbCAhPSBudWxsKSB7CisJCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRPcnBoYW5SZW1vdmFsKG9ycGhhblJlbW92YWwpOworCQl9CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRPcnBoYW5SZW1vdmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPbmVUb09uZTJfMEFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIChPbmVUb09uZTJfMEFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvT25lVG9NYW55Ml8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvT25lVG9NYW55Ml8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2ZjMDE5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9PbmVUb01hbnkyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeU9uZVRvTWFueTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VPbmVUb01hbnkyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogIE9uZVRvTWFueTJfMEFubm90YXRpb25EZWZpbml0aW9uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPbmVUb01hbnkyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBPbmVUb01hbnkyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBPbmVUb01hbnkyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VPbmVUb01hbnkyXzBBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IE51bGxPbmVUb01hbnkyXzBBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeU9uZVRvTWFueTJfMEFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KKworCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL09uZVRvT25lMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvT25lVG9PbmUyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZmRiZWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL09uZVRvT25lMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlPbmVUb09uZTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VPbmVUb09uZTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqICBPbmVUb09uZTJfMEFubm90YXRpb25EZWZpbml0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBPbmVUb09uZTJfMEFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE9uZVRvT25lMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgT25lVG9PbmUyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VPbmVUb09uZTJfMEFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXJldHVybiBuZXcgTnVsbE9uZVRvT25lMl8wQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlPbmVUb09uZTJfMEFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZmQ4MzUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiAgU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uKHBhcmVudCwgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QWNjZXNzMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QWNjZXNzMl8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZmMxOWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBY2Nlc3MyXzBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5BY2Nlc3MKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUFjY2VzczJfMEFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEFjY2VzczJfMEFubm90YXRpb24KK3sKKwlwcml2YXRlIEFjY2Vzc1R5cGUgdmFsdWU7CisKKworCXB1YmxpYyBCaW5hcnlBY2Nlc3MyXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQWNjZXNzQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiB2YWx1ZQorCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShBY2Nlc3NUeXBlIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oQWNjZXNzVHlwZSB2YWx1ZSkgeworCQlBY2Nlc3NUeXBlIG9sZCA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKKwl9CisKKwlwcml2YXRlIEFjY2Vzc1R5cGUgYnVpbGRWYWx1ZSgpIHsKKwkJcmV0dXJuIEFjY2Vzc1R5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEyXzAuQUNDRVNTKSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZTJmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEpvaW5UYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5Sm9pblRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLkFubm90YXRpb25Jbml0aWFsaXplcjsKKworLyoqCisgKiAgQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZTsKKworCXB1YmxpYyBCaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLmpvaW5UYWJsZSA9IHRoaXMuYnVpbGRKb2luVGFibGUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnVwZGF0ZUpvaW5UYWJsZSgpOworCX0KKworCisJLy8gKioqKioqKioqKiBBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBqb2luVGFibGUKKwlwdWJsaWMgSm9pblRhYmxlQW5ub3RhdGlvbiBnZXRKb2luVGFibGUoKSB7CisJCXJldHVybiB0aGlzLmpvaW5UYWJsZTsKKwl9CisKKwlwdWJsaWMgSm9pblRhYmxlQW5ub3RhdGlvbiBnZXROb25OdWxsSm9pblRhYmxlKCkgeworCQlyZXR1cm4gKHRoaXMuam9pblRhYmxlICE9IG51bGwpID8gdGhpcy5qb2luVGFibGUgOiBuZXcgTnVsbEpvaW5UYWJsZUFubm90YXRpb24odGhpcyk7CisJfQorCisJcHVibGljIEpvaW5UYWJsZUFubm90YXRpb24gYWRkSm9pblRhYmxlKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEpvaW5UYWJsZShBbm5vdGF0aW9uSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlSm9pblRhYmxlKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIEpvaW5UYWJsZUFubm90YXRpb24gYnVpbGRKb2luVGFibGUoKSB7CisJCUlBbm5vdGF0aW9uIGpkdEpvaW5UYWJsZSA9IHRoaXMuZ2V0SmR0Sm9pblRhYmxlKCk7CisJCXJldHVybiAoamR0Sm9pblRhYmxlID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRKb2luVGFibGUoamR0Sm9pblRhYmxlKTsKKwl9CisKKwlwcml2YXRlIEpvaW5UYWJsZUFubm90YXRpb24gYnVpbGRKb2luVGFibGUoSUFubm90YXRpb24gamR0Sm9pblRhYmxlKSB7CisJCXJldHVybiBuZXcgQmluYXJ5Sm9pblRhYmxlQW5ub3RhdGlvbih0aGlzLCBqZHRKb2luVGFibGUpOworCX0KKworCXByaXZhdGUgSUFubm90YXRpb24gZ2V0SmR0Sm9pblRhYmxlKCkgeworCQlyZXR1cm4gKElBbm5vdGF0aW9uKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQTJfMC5BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9UQUJMRSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEpvaW5UYWJsZShKb2luVGFibGVBbm5vdGF0aW9uIGNvbHVtbikgeworCQlKb2luVGFibGVBbm5vdGF0aW9uIG9sZCA9IHRoaXMuam9pblRhYmxlOworCQl0aGlzLmpvaW5UYWJsZSA9IGNvbHVtbjsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpPSU5fVEFCTEVfUFJPUEVSVFksIG9sZCwgY29sdW1uKTsKKwl9CisKKwkvLyBUT0RPCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUpvaW5UYWJsZSgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisvLwkJSUFubm90YXRpb24gamR0Sm9pblRhYmxlID0gdGhpcy5nZXRKZHRKb2luVGFibGUoKTsKKy8vCQlpZiAoamR0Sm9pblRhYmxlID09IG51bGwpIHsKKy8vCQkJdGhpcy5zZXRKb2luVGFibGUobnVsbCk7CisvLwkJfSBlbHNlIHsKKy8vCQkJaWYgKHRoaXMuY29sdW1uID09IG51bGwpIHsKKy8vCQkJCXRoaXMuc2V0Sm9pblRhYmxlKHRoaXMuYnVpbGRKb2luVGFibGUoamR0Sm9pblRhYmxlKSk7CisvLwkJCX0gZWxzZSB7CisvLwkJCQl0aGlzLmNvbHVtbi51cGRhdGUoamR0Sm9pblRhYmxlKTsKKy8vCQkJfQorLy8JCX0KKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlczJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGVzMl8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0N2YxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlczJfMEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlcworICovCitwdWJsaWMgY2xhc3MgQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZXMyXzBBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24KK3sKKworCXB1YmxpYyBCaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlczJfMEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGUoT2JqZWN0IGpkdEFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbih0aGlzLCAoSUFubm90YXRpb24pIGpkdEFzc29jaWF0aW9uT3ZlcnJpZGUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Q2FjaGVhYmxlMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Q2FjaGVhYmxlMl8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNzM3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlDYWNoZWFibGUyXzBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5DYWNoZWFibGUyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5DYWNoZWFibGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUNhY2hlYWJsZTJfMEFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIENhY2hlYWJsZTJfMEFubm90YXRpb24KK3sKKwlwcml2YXRlIEJvb2xlYW4gdmFsdWU7CisKKworCXB1YmxpYyBCaW5hcnlDYWNoZWFibGUyXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIENhY2hlYWJsZTJfMEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogdmFsdWUKKwlwdWJsaWMgQm9vbGVhbiBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7CisJfQorCisJcHJpdmF0ZSBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7CisJCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEyXzAuQ0FDSEVBQkxFX19WQUxVRSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDI2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHJhbnNmb3JtYXRpb24KKyAqLworcHVibGljIGNsYXNzIEJpbmFyeUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0Q2xhc3M7CisJcHJpdmF0ZSBGZXRjaFR5cGUgZmV0Y2g7CisKKworCXB1YmxpYyBCaW5hcnlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy50YXJnZXRDbGFzcyA9IHRoaXMuYnVpbGRUYXJnZXRDbGFzcygpOworCQl0aGlzLmZldGNoID0gdGhpcy5idWlsZEZldGNoKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFRhcmdldENsYXNzXyh0aGlzLmJ1aWxkVGFyZ2V0Q2xhc3MoKSk7CisJCXRoaXMuc2V0RmV0Y2hfKHRoaXMuYnVpbGRGZXRjaCgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHRhcmdldCBlbnRpdHkKKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldENsYXNzKCkgeworCQlyZXR1cm4gdGhpcy50YXJnZXRDbGFzczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXRDbGFzcyhTdHJpbmcgdGFyZ2V0Q2xhc3MpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFRhcmdldENsYXNzXyhTdHJpbmcgdGFyZ2V0Q2xhc3MpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudGFyZ2V0Q2xhc3M7CisJCXRoaXMudGFyZ2V0Q2xhc3MgPSB0YXJnZXRDbGFzczsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBUkdFVF9DTEFTU19QUk9QRVJUWSwgb2xkLCB0YXJnZXRDbGFzcyk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfVEFSR0VUX0NMQVNTX05BTUVfUFJPUEVSVFksIG9sZCwgdGFyZ2V0Q2xhc3MpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkVGFyZ2V0Q2xhc3MoKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT05fX1RBUkdFVF9DTEFTUyk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgdGFyZ2V0IGVudGl0eSBjbGFzcyBuYW1lCisJcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudGFyZ2V0Q2xhc3M7CisJfQorCisJLy8gKioqKiogZmV0Y2gKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgeworCQlyZXR1cm4gdGhpcy5mZXRjaDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEZldGNoXyhGZXRjaFR5cGUgZmV0Y2gpIHsKKwkJRmV0Y2hUeXBlIG9sZCA9IHRoaXMuZmV0Y2g7CisJCXRoaXMuZmV0Y2ggPSBmZXRjaDsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKKwl9CisKKwlwcml2YXRlIEZldGNoVHlwZSBidWlsZEZldGNoKCkgeworCQlyZXR1cm4gRmV0Y2hUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9fRkVUQ0gpKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hcHNJZDJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hcHNJZDJfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2E3NTkxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFwc0lkMl8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwc0lkMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTWFwc0lkCisgKi8KK3B1YmxpYyBjbGFzcyBCaW5hcnlNYXBzSWQyXzBBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBNYXBzSWQyXzBBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisJCisJCisJcHVibGljIEJpbmFyeU1hcHNJZDJfMEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIE1hcHNJZDJfMEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCQorCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIG5ld1ZhbHVlKSB7CisJCVN0cmluZyBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworCX0KKwkKKwlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEyXzAuTUFQU19JRF9fVkFMVUUpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9uZVRvTWFueTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9uZVRvTWFueTJfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzYwNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T25lVG9NYW55Ml8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlPbmVUb01hbnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqICBCaW5hcnlPbmVUb01hbnkyXzBBbm5vdGF0aW9uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlPbmVUb01hbnkyXzBBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlPbmVUb01hbnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBPbmVUb01hbnkyXzBBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBCb29sZWFuIG9ycGhhblJlbW92YWw7CisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKKwlwdWJsaWMgQmluYXJ5T25lVG9NYW55Ml8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLm9ycGhhblJlbW92YWwgPSB0aGlzLmJ1aWxkT3JwaGFuUmVtb3ZhbCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0T3JwaGFuUmVtb3ZhbF8odGhpcy5idWlsZE9ycGhhblJlbW92YWwoKSk7CisJfQorCisJLy8gKioqKioqKioqKiBPbmVUb01hbnkyXzBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBCb29sZWFuIGdldE9ycGhhblJlbW92YWwoKSB7CisJCXJldHVybiB0aGlzLm9ycGhhblJlbW92YWw7CisJfQorCisJcHVibGljIHZvaWQgc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuIG9ycGhhblJlbW92YWwpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRPcnBoYW5SZW1vdmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgQm9vbGVhbiBidWlsZE9ycGhhblJlbW92YWwoKSB7CisJCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEyXzAuT05FX1RPX01BTllfX09SUEhBTl9SRU1PVkFMKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0T3JwaGFuUmVtb3ZhbF8oQm9vbGVhbiBvcnBoYW5SZW1vdmFsKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy5vcnBoYW5SZW1vdmFsOworCQl0aGlzLm9ycGhhblJlbW92YWwgPSBvcnBoYW5SZW1vdmFsOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1JQSEFOX1JFTU9WQUxfUFJPUEVSVFksIG9sZCwgb3JwaGFuUmVtb3ZhbCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9uZVRvT25lMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T25lVG9PbmUyXzBBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcxNTBhMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9uZVRvT25lMl8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlPbmVUb09uZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuT25lVG9PbmUyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiAgQmluYXJ5T25lVG9PbmUyXzBBbm5vdGF0aW9uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlPbmVUb09uZTJfMEFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeU9uZVRvT25lQW5ub3RhdGlvbgorCWltcGxlbWVudHMgT25lVG9PbmUyXzBBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBCb29sZWFuIG9ycGhhblJlbW92YWw7CisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKKwlwdWJsaWMgQmluYXJ5T25lVG9PbmUyXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMub3JwaGFuUmVtb3ZhbCA9IHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRPcnBoYW5SZW1vdmFsXyh0aGlzLmJ1aWxkT3JwaGFuUmVtb3ZhbCgpKTsKKwl9CisKKwkvLyAqKioqKioqKioqIE9uZVRvT25lMl8wQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgQm9vbGVhbiBnZXRPcnBoYW5SZW1vdmFsKCkgeworCQlyZXR1cm4gdGhpcy5vcnBoYW5SZW1vdmFsOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9ycGhhblJlbW92YWwoQm9vbGVhbiBvcnBoYW5SZW1vdmFsKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T3JwaGFuUmVtb3ZhbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIEJvb2xlYW4gYnVpbGRPcnBoYW5SZW1vdmFsKCkgeworCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBMl8wLk9ORV9UT19PTkVfX09SUEhBTl9SRU1PVkFMKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0T3JwaGFuUmVtb3ZhbF8oQm9vbGVhbiBvcnBoYW5SZW1vdmFsKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy5vcnBoYW5SZW1vdmFsOworCQl0aGlzLm9ycGhhblJlbW92YWwgPSBvcnBoYW5SZW1vdmFsOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1JQSEFOX1JFTU9WQUxfUFJPUEVSVFksIG9sZCwgb3JwaGFuUmVtb3ZhbCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxOTEyOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogIEJpbmFyeVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24KKwlpbXBsZW1lbnRzIFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbgoreworCXByaXZhdGUgU3RyaW5nIGNhdGFsb2c7CisJcHJpdmF0ZSBTdHJpbmcgc2NoZW1hOworCisKKwlwdWJsaWMgQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMuY2F0YWxvZyA9IHRoaXMuYnVpbGRDYXRhbG9nKCk7CisJCXRoaXMuc2NoZW1hID0gdGhpcy5idWlsZFNjaGVtYSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0Q2F0YWxvZ18odGhpcy5idWlsZENhdGFsb2coKSk7CisJCXRoaXMuc2V0U2NoZW1hXyh0aGlzLmJ1aWxkU2NoZW1hKCkpOworCX0KKworCS8vICoqKioqKioqKiogU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLmNhdGFsb2c7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0Q2F0YWxvZ18oU3RyaW5nIGNhdGFsb2cpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuY2F0YWxvZzsKKwkJdGhpcy5jYXRhbG9nID0gY2F0YWxvZzsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRDYXRhbG9nKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEyXzAuU0VRVUVOQ0VfR0VORVJBVE9SX19DQVRBTE9HKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gY2F0YWxvZ1RvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLnNjaGVtYTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0U2NoZW1hXyhTdHJpbmcgc2NoZW1hKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNjaGVtYTsKKwkJdGhpcy5zY2hlbWEgPSBzY2hlbWE7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFNjaGVtYSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBMl8wLlNFUVVFTkNFX0dFTkVSQVRPUl9fU0NIRU1BKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBzY2hlbWFUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFjY2VzczJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFjY2VzczJfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMThkODgwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQWNjZXNzMl8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5BY2Nlc3MKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUFjY2VzczJfMEFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248TWVtYmVyPgorCWltcGxlbWVudHMgQWNjZXNzMl8wQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7CisJcHJpdmF0ZSBBY2Nlc3NUeXBlIHZhbHVlOworCisKKwlwdWJsaWMgU291cmNlQWNjZXNzMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4obWVtYmVyLCBWQUxVRV9BREFQVEVSKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy5zZXRWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOworCX0KKworCisJLy8gKioqKioqKioqKiBBY2Nlc3NBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHZhbHVlCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgeworCQkJcmV0dXJuOworCQl9CisJCUFjY2Vzc1R5cGUgb2xkID0gdGhpcy52YWx1ZTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZShBY2Nlc3NUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZSh2YWx1ZSkpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOworCX0KKworCXByaXZhdGUgQWNjZXNzVHlwZSBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBBY2Nlc3NUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQTJfMC5BQ0NFU1NfX1ZBTFVFKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyY2Y4NjIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLk51bGxBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlSm9pblRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuQW5ub3RhdGlvbkluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiAgU291cmNlU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBmaW5hbCBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlciBqb2luVGFibGVBZGFwdGVyOworCXByaXZhdGUgTmVzdGFibGVKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZTsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCisJcHVibGljIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKKwkJc3VwZXIocGFyZW50LCBtZW1iZXIsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOworCQl0aGlzLmpvaW5UYWJsZUFkYXB0ZXIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5tZW1iZXIsIGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5kYWEpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7CisJCWlmICh0aGlzLmpvaW5UYWJsZUFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihhc3RSb290KSAhPSBudWxsKSB7CisJCQl0aGlzLmpvaW5UYWJsZSA9IGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbih0aGlzLCB0aGlzLm1lbWJlciwgdGhpcy5kYWEpOworCQkJdGhpcy5qb2luVGFibGUuaW5pdGlhbGl6ZShhc3RSb290KTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci51cGRhdGUoYXN0Um9vdCk7CisJCXRoaXMudXBkYXRlSm9pblRhYmxlKGFzdFJvb3QpOworCX0KKworCS8vKioqKioqKioqKioqIEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKKworCS8vICoqKioqIGpvaW5UYWJsZQorCXB1YmxpYyBKb2luVGFibGVBbm5vdGF0aW9uIGdldEpvaW5UYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pblRhYmxlOworCX0KKworCXB1YmxpYyBOZXN0YWJsZUpvaW5UYWJsZUFubm90YXRpb24gYWRkSm9pblRhYmxlKCkgeworCQlOZXN0YWJsZUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBidWlsZEpvaW5UYWJsZUFubm90YXRpb24odGhpcywgdGhpcy5tZW1iZXIsIHRoaXMuZGFhKTsKKwkJdGFibGUubmV3QW5ub3RhdGlvbigpOworCQl0aGlzLnNldEpvaW5UYWJsZSh0YWJsZSk7CisJCXJldHVybiB0YWJsZTsKKwl9CisKKwlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSm9pblRhYmxlKEFubm90YXRpb25Jbml0aWFsaXplciBpbml0aWFsaXplcikgeworCQlOZXN0YWJsZUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBidWlsZEpvaW5UYWJsZUFubm90YXRpb24odGhpcywgdGhpcy5tZW1iZXIsIHRoaXMuZGFhKTsKKwkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgaW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZUFubm90YXRpb24odGFibGUpOworCQl0YWJsZS5uZXdBbm5vdGF0aW9uKCk7CisJCXRoaXMuc2V0Sm9pblRhYmxlKHRhYmxlKTsKKwkJcmV0dXJuIGpvaW5Db2x1bW47CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUpvaW5UYWJsZSgpIHsKKwkJdGhpcy5qb2luVGFibGUucmVtb3ZlQW5ub3RhdGlvbigpOworCQlzZXRKb2luVGFibGUobnVsbCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEpvaW5UYWJsZShOZXN0YWJsZUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlKSB7CisJCUpvaW5UYWJsZUFubm90YXRpb24gb2xkID0gdGhpcy5qb2luVGFibGU7CisJCXRoaXMuam9pblRhYmxlID0gam9pblRhYmxlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSk9JTl9UQUJMRV9QUk9QRVJUWSwgb2xkLCBqb2luVGFibGUpOworCX0KKworCXB1YmxpYyBKb2luVGFibGVBbm5vdGF0aW9uIGdldE5vbk51bGxKb2luVGFibGUoKSB7CisJCXJldHVybiAodGhpcy5qb2luVGFibGUgIT0gbnVsbCkgPyB0aGlzLmpvaW5UYWJsZSA6IG5ldyBOdWxsQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZUFubm90YXRpb24odGhpcyk7CisJfQorCQorCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luVGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJaWYgKHRoaXMuam9pblRhYmxlQWRhcHRlci5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpID09IG51bGwpIHsKKwkJCXRoaXMuc2V0Sm9pblRhYmxlKG51bGwpOworCQl9IGVsc2UgeworCQkJaWYgKHRoaXMuam9pblRhYmxlID09IG51bGwpIHsKKwkJCQlOZXN0YWJsZUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBidWlsZEpvaW5UYWJsZUFubm90YXRpb24odGhpcywgdGhpcy5tZW1iZXIsIHRoaXMuZGFhKTsKKwkJCQl0YWJsZS5pbml0aWFsaXplKGFzdFJvb3QpOworCQkJCXRoaXMuc2V0Sm9pblRhYmxlKHRhYmxlKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5qb2luVGFibGUudXBkYXRlKGFzdFJvb3QpOworCQkJfQorCQl9CisJfQorCQorCQorCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGUoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKKwl9CisKKwlzdGF0aWMgTmVzdGFibGVKb2luVGFibGVBbm5vdGF0aW9uIGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uKHBhcmVudCwgbWVtYmVyLCBidWlsZEpvaW5UYWJsZUFubm90YXRpb25BZGFwdGVyKGFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlcikpOworCX0KKworCXN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIpIHsKKwkJcmV0dXJuIG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlciwgSlBBMl8wLkFTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX1RBQkxFLCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQS5KT0lOX1RBQkxFKTsKKwl9CisKKwkKKwlzdGF0aWMgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYnVpbGROZXN0ZWRBc3NvY2lhdGlvbk92ZXJyaWRlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlcikgeworCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKTsKKwkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGlkYWEpOworCQlyZXR1cm4gbmV3IFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKHBhcmVudCwgbWVtYmVyLCBpZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGF0dHJpYnV0ZU92ZXJyaWRlc0FkYXB0ZXIpIHsKKwkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyLCBpbmRleCwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVzMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQXNzb2NpYXRpb25PdmVycmlkZXMyXzBBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkZWFkMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVzMl8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZXMyXzBBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24KK3sKKworCXB1YmxpYyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlczJfMEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJc3VwZXIocGFyZW50LCBtZW1iZXIpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZShpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uLmJ1aWxkTmVzdGVkQXNzb2NpYXRpb25PdmVycmlkZSh0aGlzLCB0aGlzLm1lbWJlciwgaW5kZXgsIHRoaXMuZGFhKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUNhY2hlYWJsZTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUNhY2hlYWJsZTJfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTIxNjNhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNhY2hlYWJsZTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkNhY2hlYWJsZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxNZW1iZXI+CisJaW1wbGVtZW50cyBDYWNoZWFibGUyXzBBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gdmFsdWVBZGFwdGVyOworCXByaXZhdGUgQm9vbGVhbiB2YWx1ZTsKKworCisJcHVibGljIFNvdXJjZUNhY2hlYWJsZTJfMEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKKwkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odHlwZSwgVkFMVUVfQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0VmFsdWUodGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiB2YWx1ZQorCXB1YmxpYyBCb29sZWFuIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlCb29sZWFuIG9sZCA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUodmFsdWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOworCX0KKworCXByaXZhdGUgQm9vbGVhbiBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQTJfMC5DQUNIRUFCTEVfX1ZBTFVFLCBmYWxzZSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRlZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHJhbnNmb3JtYXRpb24KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+CisJaW1wbGVtZW50cyBFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFRBUkdFVF9DTEFTU19BREFQVEVSID0gYnVpbGRUYXJnZXRDbGFzc0FkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRhcmdldENsYXNzQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyB0YXJnZXRDbGFzczsKKworCVN0cmluZyBmdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gRkVUQ0hfQURBUFRFUiA9IGJ1aWxkRmV0Y2hBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmZXRjaEFkYXB0ZXI7CisJcHJpdmF0ZSBGZXRjaFR5cGUgZmV0Y2g7CisKKworCXB1YmxpYyBTb3VyY2VFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJCXRoaXMudGFyZ2V0Q2xhc3NBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGF0dHJpYnV0ZSwgVEFSR0VUX0NMQVNTX0FEQVBURVIpOworCQl0aGlzLmZldGNoQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhdHRyaWJ1dGUsIEZFVENIX0FEQVBURVIpOworCX0KKworCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMudGFyZ2V0Q2xhc3MgPSB0aGlzLmJ1aWxkVGFyZ2V0Q2xhc3MoYXN0Um9vdCk7CisJCXRoaXMuZnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzc05hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzc05hbWUoYXN0Um9vdCk7CisJCXRoaXMuZmV0Y2ggPSB0aGlzLmJ1aWxkRmV0Y2goYXN0Um9vdCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0VGFyZ2V0Q2xhc3ModGhpcy5idWlsZFRhcmdldENsYXNzKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZSh0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzc05hbWUoYXN0Um9vdCkpOworCQl0aGlzLnNldEZldGNoKHRoaXMuYnVpbGRGZXRjaChhc3RSb290KSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy50YXJnZXRDbGFzcyk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJCisJLy8gKioqKiogdGFyZ2V0IGNsYXNzCisJcHVibGljIFN0cmluZyBnZXRUYXJnZXRDbGFzcygpIHsKKwkJcmV0dXJuIHRoaXMudGFyZ2V0Q2xhc3M7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGFyZ2V0Q2xhc3MoU3RyaW5nIHRhcmdldENsYXNzKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnRhcmdldENsYXNzLCB0YXJnZXRDbGFzcykpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkID0gdGhpcy50YXJnZXRDbGFzczsKKwkJdGhpcy50YXJnZXRDbGFzcyA9IHRhcmdldENsYXNzOworCQl0aGlzLnRhcmdldENsYXNzQWRhcHRlci5zZXRWYWx1ZSh0YXJnZXRDbGFzcyk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUQVJHRVRfQ0xBU1NfUFJPUEVSVFksIG9sZCwgdGFyZ2V0Q2xhc3MpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkVGFyZ2V0Q2xhc3MoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMudGFyZ2V0Q2xhc3NBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0Q2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShUQVJHRVRfQ0xBU1NfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisJLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIHRhcmdldCBlbnRpdHkgY2xhc3MgbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzc05hbWUoKSB7CisJCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkVGFyZ2V0Q2xhc3NOYW1lOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZShTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZTsKKwkJdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZSA9IG5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfVEFSR0VUX0NMQVNTX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gKHRoaXMudGFyZ2V0Q2xhc3MgPT0gbnVsbCkgPyBudWxsIDogSkRUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLnRhcmdldENsYXNzQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpKTsKKwl9CisKKwkvLyAqKioqKiBmZXRjaAorCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7CisJCXJldHVybiB0aGlzLmZldGNoOworCX0KKworCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5mZXRjaCwgZmV0Y2gpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJRmV0Y2hUeXBlIG9sZCA9IHRoaXMuZmV0Y2g7CisJCXRoaXMuZmV0Y2ggPSBmZXRjaDsKKwkJdGhpcy5mZXRjaEFkYXB0ZXIuc2V0VmFsdWUoRmV0Y2hUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZShmZXRjaCkpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkVUQ0hfUFJPUEVSVFksIG9sZCwgZmV0Y2gpOworCX0KKworCXByaXZhdGUgRmV0Y2hUeXBlIGJ1aWxkRmV0Y2goQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIEZldGNoVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmZldGNoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRGZXRjaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEZFVENIX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX19GRVRDSCwgZmFsc2UpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0Q2xhc3NBZGFwdGVyKCkgeworCQlyZXR1cm4gYnVpbGRUYXJnZXRDbGFzc0FkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX19UQVJHRVRfQ0xBU1MpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0Q2xhc3NBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgeworCQkvLyBUT0RPIHdoYXQgYWJvdXQgUXVhbGlmaWVkVHlwZT8KKwkJcmV0dXJuIGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBjb252ZXJ0ZXIpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGZhbHNlLCBjb252ZXJ0ZXIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWFwc0lkMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWFwc0lkMl8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3M2NlYjgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBzSWQyXzBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcHNJZDJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBzSWQKKyAqLworcHVibGljIGNsYXNzIFNvdXJjZU1hcHNJZDJfMEFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPgorCWltcGxlbWVudHMgTWFwc0lkMl8wQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSIAorCQkJPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiAKKwkJCT0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKKwkKKwkKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKKwkKKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKwkKKwkKKwlwdWJsaWMgU291cmNlTWFwc0lkMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYXR0cmlidXRlLCBWQUxVRV9BREFQVEVSKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy5zZXRWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBNYXBzSWQyXzBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKwkKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnZhbHVlLCBuZXdWYWx1ZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7CisJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKG5ld1ZhbHVlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworCX0KKwkKKwlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKwkKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoCisJCQkJREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEyXzAuTUFQU19JRF9fVkFMVUUsIGZhbHNlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPbmVUb01hbnkyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPbmVUb01hbnkyXzBBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjNDkwMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU9uZVRvTWFueTJfMEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlT25lVG9NYW55QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuT25lVG9NYW55Ml8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworCisvKioKKyAqICBTb3VyY2VPbmVUb01hbnkyXzBBbm5vdGF0aW9uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VPbmVUb01hbnkyXzBBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VPbmVUb01hbnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBPbmVUb01hbnkyXzBBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gT1JQSEFOX1JFTU9WQUxfQURBUFRFUiA9IGJ1aWxkT3JwaGFuUmVtb3ZhbEFkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBvcnBoYW5SZW1vdmFsQWRhcHRlcjsKKwlwcml2YXRlIEJvb2xlYW4gb3JwaGFuUmVtb3ZhbDsKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgorCXB1YmxpYyBTb3VyY2VPbmVUb01hbnkyXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlKTsKKwkJdGhpcy5vcnBoYW5SZW1vdmFsQWRhcHRlciA9IHRoaXMuYnVpbGRCb29sZWFuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKE9SUEhBTl9SRU1PVkFMX0FEQVBURVIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKKwkJdGhpcy5vcnBoYW5SZW1vdmFsID0gdGhpcy5idWlsZE9ycGhhblJlbW92YWwoYXN0Um9vdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnVwZGF0ZShhc3RSb290KTsKKwkJdGhpcy5zZXRPcnBoYW5SZW1vdmFsKHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFsKGFzdFJvb3QpKTsKKwl9CisKKwkvLyAqKioqKioqKioqIE9uZVRvTWFueTJfMEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIEJvb2xlYW4gZ2V0T3JwaGFuUmVtb3ZhbCgpIHsKKwkJcmV0dXJuIHRoaXMub3JwaGFuUmVtb3ZhbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4gb3JwaGFuUmVtb3ZhbCkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5vcnBoYW5SZW1vdmFsLCBvcnBoYW5SZW1vdmFsKSkgeworCQkJcmV0dXJuOworCQl9CisJCUJvb2xlYW4gb2xkID0gdGhpcy5vcnBoYW5SZW1vdmFsOworCQl0aGlzLm9ycGhhblJlbW92YWwgPSBvcnBoYW5SZW1vdmFsOworCQl0aGlzLm9ycGhhblJlbW92YWxBZGFwdGVyLnNldFZhbHVlKG9ycGhhblJlbW92YWwpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1JQSEFOX1JFTU9WQUxfUFJPUEVSVFksIG9sZCwgb3JwaGFuUmVtb3ZhbCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRPcnBoYW5SZW1vdmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoT1JQSEFOX1JFTU9WQUxfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisJcHJpdmF0ZSBCb29sZWFuIGJ1aWxkT3JwaGFuUmVtb3ZhbChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5vcnBoYW5SZW1vdmFsQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRPcnBoYW5SZW1vdmFsQWRhcHRlcigpIHsKKwkJcmV0dXJuIGJ1aWxkT3JwaGFuUmVtb3ZhbEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEyXzAuT05FX1RPX01BTllfX09SUEhBTl9SRU1PVkFMKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9ycGhhblJlbW92YWxBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGZhbHNlLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlT25lVG9PbmUyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPbmVUb09uZTJfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWNlNWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlT25lVG9PbmUyXzBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU9uZVRvT25lQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuT25lVG9PbmUyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CisKKy8qKgorICogIFNvdXJjZU9uZVRvT25lMl8wQW5ub3RhdGlvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlT25lVG9PbmUyXzBBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VPbmVUb09uZUFubm90YXRpb24KKwlpbXBsZW1lbnRzIE9uZVRvT25lMl8wQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IE9SUEhBTl9SRU1PVkFMX0FEQVBURVIgPSBidWlsZE9ycGhhblJlbW92YWxBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gb3JwaGFuUmVtb3ZhbEFkYXB0ZXI7CisJcHJpdmF0ZSBCb29sZWFuIG9ycGhhblJlbW92YWw7CisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKKwlwdWJsaWMgU291cmNlT25lVG9PbmUyXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlKTsKKwkJdGhpcy5vcnBoYW5SZW1vdmFsQWRhcHRlciA9IHRoaXMuYnVpbGRCb29sZWFuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKE9SUEhBTl9SRU1PVkFMX0FEQVBURVIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKKwkJdGhpcy5vcnBoYW5SZW1vdmFsID0gdGhpcy5idWlsZE9ycGhhblJlbW92YWwoYXN0Um9vdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnVwZGF0ZShhc3RSb290KTsKKwkJdGhpcy5zZXRPcnBoYW5SZW1vdmFsKHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFsKGFzdFJvb3QpKTsKKwl9CisKKwkvLyAqKioqKioqKioqIE9uZVRvT25lMl8wQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgQm9vbGVhbiBnZXRPcnBoYW5SZW1vdmFsKCkgeworCQlyZXR1cm4gdGhpcy5vcnBoYW5SZW1vdmFsOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9ycGhhblJlbW92YWwoQm9vbGVhbiBvcnBoYW5SZW1vdmFsKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm9ycGhhblJlbW92YWwsIG9ycGhhblJlbW92YWwpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJQm9vbGVhbiBvbGQgPSB0aGlzLm9ycGhhblJlbW92YWw7CisJCXRoaXMub3JwaGFuUmVtb3ZhbCA9IG9ycGhhblJlbW92YWw7CisJCXRoaXMub3JwaGFuUmVtb3ZhbEFkYXB0ZXIuc2V0VmFsdWUob3JwaGFuUmVtb3ZhbCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPUlBIQU5fUkVNT1ZBTF9QUk9QRVJUWSwgb2xkLCBvcnBoYW5SZW1vdmFsKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE9ycGhhblJlbW92YWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShPUlBIQU5fUkVNT1ZBTF9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKwlwcml2YXRlIEJvb2xlYW4gYnVpbGRPcnBoYW5SZW1vdmFsKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLm9ycGhhblJlbW92YWxBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9ycGhhblJlbW92YWxBZGFwdGVyKCkgeworCQlyZXR1cm4gYnVpbGRPcnBoYW5SZW1vdmFsQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQTJfMC5PTkVfVE9fT05FX19PUlBIQU5fUkVNT1ZBTCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRPcnBoYW5SZW1vdmFsQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBmYWxzZSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYzA5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogIFNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24KKwlpbXBsZW1lbnRzIFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gQ0FUQUxPR19BREFQVEVSID0gYnVpbGRBZGFwdGVyKEpQQTJfMC5TRVFVRU5DRV9HRU5FUkFUT1JfX0NBVEFMT0cpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gY2F0YWxvZ0FkYXB0ZXI7CisJcHJpdmF0ZSBTdHJpbmcgY2F0YWxvZzsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFNDSEVNQV9BREFQVEVSID0gYnVpbGRBZGFwdGVyKEpQQTJfMC5TRVFVRU5DRV9HRU5FUkFUT1JfX1NDSEVNQSk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBzY2hlbWFBZGFwdGVyOworCXByaXZhdGUgU3RyaW5nIHNjaGVtYTsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCisJcHVibGljIFNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlzdXBlcihwYXJlbnQsIG1lbWJlcik7CisKKwkJdGhpcy5jYXRhbG9nQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKENBVEFMT0dfQURBUFRFUik7CisJCXRoaXMuc2NoZW1hQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKFNDSEVNQV9BREFQVEVSKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7CisKKwkJdGhpcy5jYXRhbG9nID0gdGhpcy5idWlsZENhdGFsb2coYXN0Um9vdCk7CisJCXRoaXMuc2NoZW1hID0gdGhpcy5idWlsZFNjaGVtYShhc3RSb290KTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci51cGRhdGUoYXN0Um9vdCk7CisKKwkJdGhpcy5zZXRDYXRhbG9nKHRoaXMuYnVpbGRDYXRhbG9nKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRTY2hlbWEodGhpcy5idWlsZFNjaGVtYShhc3RSb290KSk7CisJfQorCisJLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKKwlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLmNhdGFsb2c7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5jYXRhbG9nLCBjYXRhbG9nKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLmNhdGFsb2c7CisJCXRoaXMuY2F0YWxvZyA9IGNhdGFsb2c7CisJCXRoaXMuY2F0YWxvZ0FkYXB0ZXIuc2V0VmFsdWUoY2F0YWxvZyk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ2F0YWxvZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5jYXRhbG9nQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShDQVRBTE9HX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBib29sZWFuIGNhdGFsb2dUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKENBVEFMT0dfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKKwl9CisKKwkvLyAqKioqKioqKioqIHNjaGVtYSAqKioqKioqKioqCisJcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLnNjaGVtYTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5zY2hlbWEsIHNjaGVtYSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkID0gdGhpcy5zY2hlbWE7CisJCXRoaXMuc2NoZW1hID0gc2NoZW1hOworCQl0aGlzLnNjaGVtYUFkYXB0ZXIuc2V0VmFsdWUoc2NoZW1hKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkU2NoZW1hKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnNjaGVtYUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShTQ0hFTUFfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhTQ0hFTUFfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9BYnN0cmFjdEpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9BYnN0cmFjdEpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1MmQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0Fic3RyYWN0SnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcHRDb3JlTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyCisJZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyCisJaW1wbGVtZW50cyBKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCit7CisJcHJvdGVjdGVkIEFic3RyYWN0SnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRQcm9wZXJ0eU5hbWVzKCkgeworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJU2V0PFN0cmluZz4gcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKKwkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVF9OQU1FKTsKKwkJcHJvcGVydHlOYW1lcy5hZGQoU09VUkNFX0ZPTERFUik7CisJCXByb3BlcnR5TmFtZXMuYWRkKEZJTEVfUEFUSCk7CisJCXByb3BlcnR5TmFtZXMuYWRkKFZFUlNJT04pOworCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTT1VSQ0VfRk9MREVSKSkgeworCQkJSUZvbGRlciBzb3VyY2VGb2xkZXIgPSBnZXREZWZhdWx0U291cmNlRm9sZGVyKCk7CisJCQlpZiAoc291cmNlRm9sZGVyICE9IG51bGwgJiYgc291cmNlRm9sZGVyLmV4aXN0cygpKSB7CisJCQkJcmV0dXJuIHNvdXJjZUZvbGRlci5nZXRGdWxsUGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZJTEVfUEFUSCkpIHsKKwkJCXJldHVybiBnZXREZWZhdWx0RmlsZVBhdGgoKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFZFUlNJT04pKSB7CisJCQlyZXR1cm4gZ2V0RGVmYXVsdFZlcnNpb24oKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisJfQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdEZpbGVQYXRoKCk7CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0VmVyc2lvbigpOworCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7CisJCWJvb2xlYW4gb2sgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX05BTUUpKSB7CisJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFNPVVJDRV9GT0xERVIsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOworCQl9CisJCXJldHVybiBvazsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTkFNRSkpIHsKKwkJCXJldHVybiBBcnJheVRvb2xzLmFycmF5KAorCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPElQcm9qZWN0LCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I+KGpwYUlQcm9qZWN0cygpKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHRyYW5zZm9ybShJUHJvamVjdCBuZXh0KSB7CisJCQkJCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihuZXh0LmdldE5hbWUoKSk7CisJCQkJCX0KKwkJCQl9LAorCQkJCW5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMF0pOworCQl9CisJCXJldHVybiBzdXBlci5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX05BTUUpKSB7CisJCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihnZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5TmFtZSk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9OQU1FKQorCQkJCXx8IHByb3BlcnR5TmFtZS5lcXVhbHMoU09VUkNFX0ZPTERFUikKKwkJCQl8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEZJTEVfUEFUSCkpIHsKKwkJCXN0YXR1cyA9IHZhbGlkYXRlUHJvamVjdFNvdXJjZUZvbGRlckFuZEZpbGVQYXRoKCk7CisJCX0KKwkJaWYgKCEgc3RhdHVzLmlzT0soKSkgeworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQkKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9OQU1FKQorCQkJCXx8IHByb3BlcnR5TmFtZS5lcXVhbHMoVkVSU0lPTikpIHsKKwkJCXN0YXR1cyA9IHZhbGlkYXRlVmVyc2lvbigpOworCQl9CisJCWlmICghIHN0YXR1cy5pc09LKCkpIHsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJCisJCXJldHVybiBzdGF0dXM7CisJfQorCQorCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlUHJvamVjdFNvdXJjZUZvbGRlckFuZEZpbGVQYXRoKCkgeworCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBnZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUpOworCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShwcm9qZWN0TmFtZSkpIHsKKwkJCXJldHVybiBuZXcgU3RhdHVzKAorCQkJCUlTdGF0dXMuRVJST1IsIEpwdENvcmVQbHVnaW4uUExVR0lOX0lELCAKKwkJCQlKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfUFJPSkVDVF9OT1RfU1BFQ0lGSUVEKTsKKwkJfQorCQlTdHJpbmcgc291cmNlRm9sZGVyUGF0aCA9IGdldFN0cmluZ1Byb3BlcnR5KFNPVVJDRV9GT0xERVIpOworCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShzb3VyY2VGb2xkZXJQYXRoKSkgeworCQkJcmV0dXJuIG5ldyBTdGF0dXMoCisJCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQsCisJCQkJSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX1NPVVJDRV9GT0xERVJfTk9UX1NQRUNJRklFRCk7CisJCX0KKwkJaWYgKHNvdXJjZUZvbGRlcklzSWxsZWdhbChzb3VyY2VGb2xkZXJQYXRoKSkgeworCQkJcmV0dXJuIG5ldyBTdGF0dXMoCisJCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQsCisJCQkJSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX1NPVVJDRV9GT0xERVJfSUxMRUdBTCk7CisJCX0KKwkJaWYgKHNvdXJjZUZvbGRlck5vdEluUHJvamVjdChzb3VyY2VGb2xkZXJQYXRoKSkgeworCQkJcmV0dXJuIG5ldyBTdGF0dXMoCisJCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQsCisJCQkJTkxTLmJpbmQoCisJCQkJCUpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9TT1VSQ0VfRk9MREVSX05PVF9JTl9QUk9KRUNULCAKKwkJCQkJc291cmNlRm9sZGVyUGF0aCwgcHJvamVjdE5hbWUpKTsKKwkJfQorCQlpZiAoZ2V0VmVyaWZpZWRTb3VyY2VGb2xkZXIoKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbmV3IFN0YXR1cygKKwkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwKKwkJCQlOTFMuYmluZChKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfU09VUkNFX0ZPTERFUl9ET0VTX05PVF9FWElTVCwgc291cmNlRm9sZGVyUGF0aCkpOworCQl9CisJCWlmIChnZXRWZXJpZmllZEphdmFTb3VyY2VGb2xkZXIoKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbmV3IFN0YXR1cygKKwkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwKKwkJCQlOTFMuYmluZChKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfU09VUkNFX0ZPTERFUl9OT1RfU09VUkNFX0ZPTERFUiwgc291cmNlRm9sZGVyUGF0aCkpOworCQl9CisJCVN0cmluZyBmaWxlUGF0aCA9IGdldFN0cmluZ1Byb3BlcnR5KEZJTEVfUEFUSCk7CisJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGZpbGVQYXRoKSkgeworCQkJcmV0dXJuIG5ldyBTdGF0dXMoCisJCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQsCisJCQkJSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX0ZJTEVfUEFUSF9OT1RfU1BFQ0lGSUVEKTsKKwkJfQorCQlpZiAoZ2V0RXhpc3RpbmdGaWxlKCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBTdGF0dXMoCisJCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQsCisJCQkJSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX0ZJTEVfQUxSRUFEWV9FWElTVFMpOworCQl9CisJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCX0KKwkKKwlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVZlcnNpb24oKSB7CisJCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgeworCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCX0KKwkJU3RyaW5nIGZpbGVWZXJzaW9uID0gZ2V0U3RyaW5nUHJvcGVydHkoVkVSU0lPTik7CisJCWlmICghIGZpbGVWZXJzaW9uU3VwcG9ydGVkKGZpbGVWZXJzaW9uKSkgeworCQkJcmV0dXJuIG5ldyBTdGF0dXMoCisJCQkJCUlTdGF0dXMuRVJST1IsIEpwdENvcmVQbHVnaW4uUExVR0lOX0lELAorCQkJCQlKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfRklMRV9WRVJTSU9OX05PVF9TVVBQT1JURUQpOworCQl9CisJCXRyeSB7CisJCQlTdHJpbmcganBhRmFjZXRWZXJzaW9uID0gZ2V0SnBhRmFjZXRWZXJzaW9uKGdldFByb2plY3QoKSk7CisJCQlpZiAoISBmaWxlVmVyc2lvblN1cHBvcnRlZEZvckZhY2V0VmVyc2lvbihmaWxlVmVyc2lvbiwganBhRmFjZXRWZXJzaW9uKSkgeworCQkJCXJldHVybiBuZXcgU3RhdHVzKAorCQkJCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQsCisJCQkJCQlKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfRklMRV9WRVJTSU9OX05PVF9TVVBQT1JURURfRk9SX0ZBQ0VUX1ZFUlNJT04pOworCQkJfQorCQl9CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkvLyBwcm9qZWN0IHNob3VsZCBoYXZlIGJlZW4gdmFsaWRhdGVkIGFscmVhZHksIHNvIGFzc3VtZSB0aGF0IHRoaXMgd2lsbCBuZXZlciBnZXQgaGl0CisJCQkvLyBmYWxsIHRocm91Z2ggdG8gZmluYWwgcmV0dXJuCisJCX0KKwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJfQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGZpbGVWZXJzaW9uU3VwcG9ydGVkKFN0cmluZyBmaWxlVmVyc2lvbik7CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZmlsZVZlcnNpb25TdXBwb3J0ZWRGb3JGYWNldFZlcnNpb24oU3RyaW5nIGZpbGVWZXJzaW9uLCBTdHJpbmcganBhRmFjZXRWZXJzaW9uKTsKKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGhlbHBlciBtZXRob2RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJLy8gQ29waWVkIGZyb20gQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKKwlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKKwkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgbW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKKwkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocHJvamVjdE5hbWUpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKKwl9CisJCisJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKKwkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKKwkJcmV0dXJuIChwcm9qZWN0ID09IG51bGwpID8gbnVsbCA6IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIGEgYmVzdCBndWVzcyBqYXZhIHNvdXJjZSBmb2xkZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdAorCSAqLworCS8vIENvcGllZCBmcm9tIE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyCisJcHJvdGVjdGVkIElGb2xkZXIgZ2V0RGVmYXVsdFNvdXJjZUZvbGRlcigpIHsKKwkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKKwkJaWYgKHByb2plY3QgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBzb3VyY2VzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0U291cmNlQ29udGFpbmVycyhwcm9qZWN0KTsKKwkJLy8gVHJ5IGFuZCByZXR1cm4gdGhlIGZpcnN0IHNvdXJjZSBmb2xkZXIKKwkJaWYgKHNvdXJjZXMubGVuZ3RoID4gMCkgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gKElGb2xkZXIpIHNvdXJjZXNbMF0uZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGF0aCBwcm92aWRlZCBjYW4gbm90IGJlIGEgdmFsaWQgSUZvbGRlciBwYXRoCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc291cmNlRm9sZGVySXNJbGxlZ2FsKFN0cmluZyBmb2xkZXJQYXRoKSB7CisJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7CisJCWlmIChwcm9qZWN0ID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQl0cnkgeworCQkJcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0Rm9sZGVyKG5ldyBQYXRoKGZvbGRlclBhdGgpKTsKKwkJfQorCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHBhdGggcHJvdmlkZWQgaXMgaW4gdGhlIGN1cnJlbnQgcHJvamVjdAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHNvdXJjZUZvbGRlck5vdEluUHJvamVjdChTdHJpbmcgZm9sZGVyUGF0aCkgeworCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOworCQlpZiAocHJvamVjdCA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJSUZvbGRlciBmb2xkZXI7CisJCXRyeSB7CisJCQlmb2xkZXIgPSBwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIobmV3IFBhdGgoZm9sZGVyUGF0aCkpOworCQl9CisJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiAhIHByb2plY3QuZXF1YWxzKGZvbGRlci5nZXRQcm9qZWN0KCkpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gYW4gSUZvbGRlciByZXByZXNlbnRlZCBieSB0aGUgU09VUkNFX0ZPTERFUiBwcm9wZXJ0eSwgdmVyaWZpZWQKKwkgKiB0byBleGlzdAorCSAqLworCXByb3RlY3RlZCBJRm9sZGVyIGdldFZlcmlmaWVkU291cmNlRm9sZGVyKCkgeworCQlTdHJpbmcgZm9sZGVyUGF0aCA9IGdldFN0cmluZ1Byb3BlcnR5KFNPVVJDRV9GT0xERVIpOworCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOworCQlpZiAocHJvamVjdCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlJRm9sZGVyIGZvbGRlcjsKKwkJdHJ5IHsKKwkJCWZvbGRlciA9IHByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJQYXRoKSk7CisJCX0KKwkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoZm9sZGVyID09IG51bGwgfHwgISBmb2xkZXIuZXhpc3RzKCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBmb2xkZXI7CisJfQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc291cmNlIGZvbGRlciwgcHJvdmlkZWQgaXQgaXMgdmVyaWZpZWQgdG8gYmUgYW4gYWN0dWFsIGphdmEKKwkgKiBzb3VyY2UgZm9sZGVyCisJICovCisJcHJvdGVjdGVkIElGb2xkZXIgZ2V0VmVyaWZpZWRKYXZhU291cmNlRm9sZGVyKCkgeworCQlJRm9sZGVyIGZvbGRlciA9IGdldFZlcmlmaWVkU291cmNlRm9sZGVyKCk7CisJCWlmIChmb2xkZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJSUphdmFQcm9qZWN0IGpQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGdldFByb2plY3QoKSk7CisJCWlmIChqUHJvamVjdCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0galByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChmb2xkZXIpOworCQlpZiAocGFja2FnZUZyYWdtZW50Um9vdCA9PSBudWxsIHx8ICEgcGFja2FnZUZyYWdtZW50Um9vdC5leGlzdHMoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGZvbGRlcjsKKwl9CisJCisJcHJvdGVjdGVkIElGaWxlIGdldEV4aXN0aW5nRmlsZSgpIHsKKwkJSUZvbGRlciBmb2xkZXIgPSBnZXRWZXJpZmllZFNvdXJjZUZvbGRlcigpOworCQlpZiAoZm9sZGVyID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCVN0cmluZyBmaWxlUGF0aCA9IGdldFN0cmluZ1Byb3BlcnR5KEZJTEVfUEFUSCk7CisJCUlGaWxlIGV4aXN0aW5nRmlsZSA9IGZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKGZpbGVQYXRoKSk7CisJCWlmICghIGV4aXN0aW5nRmlsZS5leGlzdHMoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGV4aXN0aW5nRmlsZTsKKwl9CisJCisJcHJvdGVjdGVkIEl0ZXJhdG9yPElQcm9qZWN0PiBqcGFJUHJvamVjdHMoKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8SVByb2plY3QsIElQcm9qZWN0Pih0aGlzLmFsbElQcm9qZWN0cygpLCB0aGlzLmJ1aWxkSnBhSVByb2plY3RzRmlsdGVyKCkpOworCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxJUHJvamVjdD4gYWxsSVByb2plY3RzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKFByb2plY3RVdGlsaXRpZXMuZ2V0QWxsUHJvamVjdHMoKSk7CisJfQorCisJcHJvdGVjdGVkIEZpbHRlcjxJUHJvamVjdD4gYnVpbGRKcGFJUHJvamVjdHNGaWx0ZXIoKSB7CisJCXJldHVybiBuZXcgSnBhSVByb2plY3RzRmlsdGVyKCk7CisJfQorCisJcHJvdGVjdGVkIGNsYXNzIEpwYUlQcm9qZWN0c0ZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcjxJUHJvamVjdD4geworCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSVByb2plY3QgcHJvamVjdCkgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gdGhpcy5hY2NlcHRfKHByb2plY3QpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRfKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCXJldHVybiBoYXNKcGFGYWNldChwcm9qZWN0KSAmJiBoYXNTdXBwb3J0ZWRQbGF0Zm9ybUlkKHByb2plY3QpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGhhc0pwYUZhY2V0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldChwcm9qZWN0LCBKcHRDb3JlUGx1Z2luLkZBQ0VUX0lEKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRKcGFGYWNldFZlcnNpb24oSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJRmFjZXRlZFByb2plY3QgZnByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7CisJCXJldHVybiBmcHJvai5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKAorCQkJCVByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChKcHRDb3JlUGx1Z2luLkZBQ0VUX0lEKSkuZ2V0VmVyc2lvblN0cmluZygpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNTdXBwb3J0ZWRQbGF0Zm9ybUlkKElQcm9qZWN0IHByb2plY3QpIHsKKwkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpOworCQlyZXR1cm4gKGpwYVByb2plY3QgIT0gbnVsbCkgJiYgaXNTdXBwb3J0ZWRQbGF0Zm9ybUlkKGpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNTdXBwb3J0ZWRQbGF0Zm9ybUlkKFN0cmluZyBpZCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9BYnN0cmFjdEpwYUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvQWJzdHJhY3RKcGFGaWxlQ3JlYXRpb25PcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDZiYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvQWJzdHJhY3RKcGFGaWxlQ3JlYXRpb25PcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFGaWxlQ3JlYXRpb25PcGVyYXRpb24KKwlleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCisJaW1wbGVtZW50cyBKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCit7CisJLyoqCisJICogV2lsbCBiZSBudWxsIHVudGlsIGZvbGRlciBpcyBjcmVhdGVkCisJICovCisJcHJvdGVjdGVkIElGb2xkZXIgY3JlYXRlZFNvdXJjZUZvbGRlcjsKKwkKKwkvKioKKwkgKiBXaWxsIGJlIG51bGwgdW50aWwgZmlsZSBpcyBjcmVhdGVkCisJICovCisJcHJvdGVjdGVkIElGaWxlIGNyZWF0ZWRGaWxlOworCQorCQorCXByb3RlY3RlZCBBYnN0cmFjdEpwYUZpbGVDcmVhdGlvbk9wZXJhdGlvbihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgeworCQlzdXBlcihkYXRhTW9kZWwpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJLy8gQ3JlYXRlIHNvdXJjZSBmb2xkZXIgaWYgaXQgZG9lcyBub3QgZXhpc3QKKwkJY3JlYXRlU291cmNlRm9sZGVyKCk7CisJCS8vIENyZWF0ZSBmaWxlCisJCWNyZWF0ZUZpbGUoKTsKKwkJcmV0dXJuIE9LX1NUQVRVUzsKKwl9CisJCisJcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKKwkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7CisJCWlmIChwcm9qZWN0ID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIk5vIHByb2plY3QgbmFtZSBzcGVjaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBwcm9qZWN0OworCX0KKwkKKwlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7CisJCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKKwkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiUHJvamVjdCBkb2VzIG5vdCBoYXZlIEpQQSBjb250ZW50Iik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4ganBhUHJvamVjdDsKKwl9CisJCisJLyoqCisJICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHNvdXJjZSBmb2xkZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkYXRhIG1vZGVsLiAKKwkgKiBJdCB3aWxsIGNyZWF0ZSB0aGUgc291cmNlIGZvbGRlciBpZiBpdCBkb2VzIG5vdCBleGlzdC4gSXQgd2lsbCBub3QgYWRkCisJICogaXQgYXMgYSBzb3VyY2UgZm9sZGVyIHRvIHRoZSBwcm9qZWN0IGJ1aWxkIHBhdGggaWYgaXQgaXMgbm90IGFscmVhZHkuCisJICogVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLgorCSAqLworCS8vIGNvcGllZCBmcm9tIE5ld0phdmFDbGFzc09wZXJhdGlvbgorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNvdXJjZUZvbGRlcigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCQkvLyBHZXQgdGhlIHNvdXJjZSBmb2xkZXIgbmFtZSBmcm9tIHRoZSBkYXRhIG1vZGVsCisJCVN0cmluZyBmb2xkZXJQYXRoID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoU09VUkNFX0ZPTERFUik7CisJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7CisJCUlGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0Rm9sZGVyKG5ldyBQYXRoKGZvbGRlclBhdGgpKTsKKwkJLy8gSWYgZm9sZGVyIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgdGhlIGZvbGRlciB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aAorCQlpZiAoISBmb2xkZXIuZXhpc3RzKCkpIHsKKwkJCXRyeSB7CisJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgZm9sZGVyIiwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQkvLyBSZXR1cm4gdGhlIHNvdXJjZSBmb2xkZXIKKwkJdGhpcy5jcmVhdGVkU291cmNlRm9sZGVyID0gZm9sZGVyOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWxlKCkgeworCQlTdHJpbmcgZmlsZVBhdGggPSBnZXREYXRhTW9kZWwoKS5nZXRTdHJpbmdQcm9wZXJ0eShGSUxFX1BBVEgpOworCQlJRmlsZSBuZXdGaWxlID0gdGhpcy5jcmVhdGVkU291cmNlRm9sZGVyLmdldEZpbGUobmV3IFBhdGgoZmlsZVBhdGgpKTsKKwkJQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyIHJlc291cmNlUHJvdmlkZXIgPSBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyKG5ld0ZpbGUpOworCQl0cnkgeworCQkJcmVzb3VyY2VQcm92aWRlci5jcmVhdGVGaWxlQW5kUmVzb3VyY2UoZ2V0RGF0YU1vZGVsKCkpOworCQl9CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCUpwdENvcmVQbHVnaW4ubG9nKGUpOworCQkJbmV3RmlsZSA9IG51bGw7CisJCX0KKwkJdGhpcy5jcmVhdGVkRmlsZSA9IG5ld0ZpbGU7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5nZXRQcm9qZWN0KCk7CisJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXIgZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihJRmlsZSBmaWxlKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0pwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0pwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmIxZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnM7CisKK3B1YmxpYyBpbnRlcmZhY2UgSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcworeworCS8qKgorCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZywgaWRlbnRpZmllcyB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBpbiB3aGljaCB0byBjcmVhdGUgdGhlIGZpbGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUiOworCQorCS8qKgorCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZywgaWRlbnRpZmllcyB0aGUgZnVsbHkgcGF0aGVkIHNvdXJjZSBmb2xkZXIgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBmaWxlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0ZPTERFUiA9ICJKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVIiOworCQorCS8qKgorCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZywgaWRlbnRpZmllcyB0aGUgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZm9sZGVyCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QQVRIID0gIkpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9QQVRIIjsKKwkKKwkvKioKKwkgKiBSZXF1aXJlZCwgdHlwZSBTdHJpbmcsIGlkZW50aWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgdG8gY3JlYXRlCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICJKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlZFUlNJT04iOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmluZGV4IDkwOGEzYmIuLmY4ZTlhYjggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKQEAgLTExLDIzICsxMSw5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnM7CiAKIHB1YmxpYyBpbnRlcmZhY2UgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcworCWV4dGVuZHMgSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcwogewogCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZywgaWRlbnRpZmllcyB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBpbiB3aGljaCB0byBjcmVhdGUgdGhlIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUiOwotCQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZywgaWRlbnRpZmllcyB0aGUgZnVsbHkgcGF0aGVkIHNvdXJjZSBmb2xkZXIgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0ZPTERFUiA9ICJPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVIiOwotCQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZywgaWRlbnRpZmllcyB0aGUgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZm9sZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QQVRIID0gIk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9QQVRIIjsKLQkKLQkvKioKIAkgKiBPcHRpb25hbCwgdHlwZSBBY2Nlc3NUeXBlLCBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgYWNjZXNzIHR5cGUgKG9yIG51bGwpCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9BQ0NFU1MgPSAiT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5ERUZBVUxUX0FDQ0VTUyI7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCA1N2YyODU0Li5hODMyMmEyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTEyLDE3ICsxMiw5IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKQEAgLTMwLDIwICsyMiwyMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnB0Q29yZU1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwogCi1wdWJsaWMgY2xhc3MgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKKwlleHRlbmRzIEFic3RyYWN0SnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKIAlpbXBsZW1lbnRzIE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKIHsKIAkvKioKQEAgLTYzLDkgKzU1LDYgQEAKIAlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKIAkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJCVNldDxTdHJpbmc+IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfTkFNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFNPVVJDRV9GT0xERVIpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChGSUxFX1BBVEgpOwogCQlwcm9wZXJ0eU5hbWVzLmFkZChERUZBVUxUX0FDQ0VTUyk7CiAJCXByb3BlcnR5TmFtZXMuYWRkKEFERF9UT19QRVJTSVNURU5DRV9VTklUKTsKIAkJcHJvcGVydHlOYW1lcy5hZGQoUEVSU0lTVEVOQ0VfVU5JVCk7CkBAIC04MiwxNiArNzEsNyBAQAogCQogCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU09VUkNFX0ZPTERFUikpIHsKLQkJCUlGb2xkZXIgc291cmNlRm9sZGVyID0gZ2V0RGVmYXVsdFNvdXJjZUZvbGRlcigpOwotCQkJaWYgKHNvdXJjZUZvbGRlciAhPSBudWxsICYmIHNvdXJjZUZvbGRlci5leGlzdHMoKSkgewotCQkJCXJldHVybiBzb3VyY2VGb2xkZXIuZ2V0RnVsbFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhGSUxFX1BBVEgpKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhERUZBVUxUX0FDQ0VTUykpIHsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoREVGQVVMVF9BQ0NFU1MpKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEFERF9UT19QRVJTSVNURU5DRV9VTklUKSkgewpAQCAtMTA3LDMwMSArODcsMjUgQEAKIAl9CiAJCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTkFNRSkpIHsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoU09VUkNFX0ZPTERFUiwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFBFUlNJU1RFTkNFX1VOSVQsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQRVJTSVNURU5DRV9VTklULCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQpKSB7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFBFUlNJU1RFTkNFX1VOSVQsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCX0KLQkJcmV0dXJuIG9rOworCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZpbGVQYXRoKCkgeworCQlyZXR1cm4gbmV3IFBhdGgoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKS50b1BvcnRhYmxlU3RyaW5nKCk7CiAJfQogCQogCUBPdmVycmlkZQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX05BTUUpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmFycmF5KAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPElQcm9qZWN0LCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I+KGpwYUlQcm9qZWN0cygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHRyYW5zZm9ybShJUHJvamVjdCBuZXh0KSB7Ci0JCQkJCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihuZXh0LmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9LAotCQkJCW5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMF0pOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoREVGQVVMVF9BQ0NFU1MpKSB7Ci0JCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBhY2Nlc3NUeXBlcyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbM107Ci0JCQlhY2Nlc3NUeXBlc1swXSA9IGFjY2Vzc1Byb3BlcnR5RGVzY3JpcHRvcihudWxsKTsKLQkJCWFjY2Vzc1R5cGVzWzFdID0gYWNjZXNzUHJvcGVydHlEZXNjcmlwdG9yKEFjY2Vzc1R5cGUuRklFTEQpOwotCQkJYWNjZXNzVHlwZXNbMl0gPSBhY2Nlc3NQcm9wZXJ0eURlc2NyaXB0b3IoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCQlyZXR1cm4gYWNjZXNzVHlwZXM7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9VTklUKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5hcnJheSgKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4obmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4obnVsbCwgcGVyc2lzdGVuY2VVbml0TmFtZXMoKSkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0UHJvcGVydHlEZXNjcmlwdG9yKG5leHQpOwotCQkJCQl9Ci0JCQkJfSwKLQkJCQluZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzBdKTsKLQkJCQkKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkgewotCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IoZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhERUZBVUxUX0FDQ0VTUykpIHsKLQkJCXJldHVybiBhY2Nlc3NQcm9wZXJ0eURlc2NyaXB0b3IoKEFjY2Vzc1R5cGUpIGdldFByb3BlcnR5KERFRkFVTFRfQUNDRVNTKSk7IAotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVU5JVCkpIHsKLQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eURlc2NyaXB0b3IoZ2V0U3RyaW5nUHJvcGVydHkoUEVSU0lTVEVOQ0VfVU5JVCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgYWNjZXNzUHJvcGVydHlEZXNjcmlwdG9yKEFjY2Vzc1R5cGUgYWNjZXNzVHlwZSkgewotCQlpZiAoYWNjZXNzVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihudWxsLCBKcHRDb3JlTWVzc2FnZXMuTk9ORSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihhY2Nlc3NUeXBlLCBhY2Nlc3NUeXBlLmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgcGVyc2lzdGVuY2VVbml0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwZXJzaXN0ZW5jZVVuaXROYW1lKSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHBlcnNpc3RlbmNlVW5pdE5hbWUpKSB7Ci0JCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihudWxsLCBKcHRDb3JlTWVzc2FnZXMuTk9ORSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihwZXJzaXN0ZW5jZVVuaXROYW1lKTsKLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX05BTUUpCi0JCQkJfHwgcHJvcGVydHlOYW1lLmVxdWFscyhTT1VSQ0VfRk9MREVSKQotCQkJCXx8IHByb3BlcnR5TmFtZS5lcXVhbHMoRklMRV9QQVRIKSkgewotCQkJcmV0dXJuIHZhbGlkYXRlUHJvamVjdFNvdXJjZUZvbGRlckFuZEZpbGVQYXRoKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhBRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCkKLQkJCQl8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1VOSVQpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlUHJvamVjdFNvdXJjZUZvbGRlckFuZEZpbGVQYXRoKCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBnZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShwcm9qZWN0TmFtZSkpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCUlTdGF0dXMuRVJST1IsIEpwdENvcmVQbHVnaW4uUExVR0lOX0lELCAKLQkJCQlKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfUFJPSkVDVF9OT1RfU1BFQ0lGSUVEKTsKLQkJfQotCQlTdHJpbmcgc291cmNlRm9sZGVyUGF0aCA9IGdldFN0cmluZ1Byb3BlcnR5KFNPVVJDRV9GT0xERVIpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShzb3VyY2VGb2xkZXJQYXRoKSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX1NPVVJDRV9GT0xERVJfTk9UX1NQRUNJRklFRCk7Ci0JCX0KLQkJaWYgKHNvdXJjZUZvbGRlcklzSWxsZWdhbChzb3VyY2VGb2xkZXJQYXRoKSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX1NPVVJDRV9GT0xERVJfSUxMRUdBTCk7Ci0JCX0KLQkJaWYgKHNvdXJjZUZvbGRlck5vdEluUHJvamVjdChzb3VyY2VGb2xkZXJQYXRoKSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJSnB0Q29yZU1lc3NhZ2VzLmJpbmQoCi0JCQkJCUpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9TT1VSQ0VfRk9MREVSX05PVF9JTl9QUk9KRUNULCAKLQkJCQkJc291cmNlRm9sZGVyUGF0aCwgcHJvamVjdE5hbWUpKTsKLQkJfQotCQlpZiAoZ2V0VmVyaWZpZWRTb3VyY2VGb2xkZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQlKcHRDb3JlTWVzc2FnZXMuYmluZChKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfU09VUkNFX0ZPTERFUl9ET0VTX05PVF9FWElTVCwgc291cmNlRm9sZGVyUGF0aCkpOwotCQl9Ci0JCWlmIChnZXRWZXJpZmllZEphdmFTb3VyY2VGb2xkZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQlKcHRDb3JlTWVzc2FnZXMuYmluZChKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfU09VUkNFX0ZPTERFUl9OT1RfU09VUkNFX0ZPTERFUiwgc291cmNlRm9sZGVyUGF0aCkpOwotCQl9Ci0JCWlmIChnZXRFeGlzdGluZ09ybUZpbGUoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQlKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfT1JNX0ZJTEVfQUxSRUFEWV9FWElTVFMpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCWJvb2xlYW4gYWRkVG9QVW5pdCA9IGdldEJvb2xlYW5Qcm9wZXJ0eShBRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCk7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCVN0cmluZyBwVW5pdE5hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShQRVJTSVNURU5DRV9VTklUKTsKLQkJaWYgKGFkZFRvUFVuaXQpIHsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHBVbml0TmFtZSkpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCUpwdENvcmVNZXNzYWdlcy5iaW5kKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9QRVJTSVNURU5DRV9VTklUX0RPRVNfTk9UX1NQRUNJRklFRCwgcFVuaXROYW1lKSk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGVyc2lzdGVuY2VVbml0KCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJSnB0Q29yZU1lc3NhZ2VzLmJpbmQoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX1BFUlNJU1RFTkNFX1VOSVRfTk9UX0lOX1BST0pFQ1QsIHBVbml0TmFtZSwgcHJvamVjdE5hbWUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8vIENvcGllZCBmcm9tIEFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3ZpZGVyCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBtb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShwcm9qZWN0TmFtZSkpIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWZXJzaW9uKCkgeworCQlpZiAoZ2V0UHJvamVjdCgpID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOworCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZSgKKwkJCQlKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKS5nZXRWZXJzaW9uKCk7CiAJfQogCQotCXByaXZhdGUgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBiZXN0IGd1ZXNzIGphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0Ci0JICovCi0JLy8gQ29waWVkIGZyb20gTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIKLQlwcml2YXRlIElGb2xkZXIgZ2V0RGVmYXVsdFNvdXJjZUZvbGRlcigpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBzb3VyY2VzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0U291cmNlQ29udGFpbmVycyhwcm9qZWN0KTsKLQkJLy8gVHJ5IGFuZCByZXR1cm4gdGhlIGZpcnN0IHNvdXJjZSBmb2xkZXIKLQkJaWYgKHNvdXJjZXMubGVuZ3RoID4gMCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKElGb2xkZXIpIHNvdXJjZXNbMF0uZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGF0aCBwcm92aWRlZCBjYW4gbm90IGJlIGEgdmFsaWQgSUZvbGRlciBwYXRoCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNvdXJjZUZvbGRlcklzSWxsZWdhbChTdHJpbmcgZm9sZGVyUGF0aCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJQYXRoKSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwYXRoIHByb3ZpZGVkIGlzIGluIHRoZSBjdXJyZW50IHByb2plY3QKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc291cmNlRm9sZGVyTm90SW5Qcm9qZWN0KFN0cmluZyBmb2xkZXJQYXRoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlJRm9sZGVyIGZvbGRlcjsKLQkJdHJ5IHsKLQkJCWZvbGRlciA9IHByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJQYXRoKSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICEgcHJvamVjdC5lcXVhbHMoZm9sZGVyLmdldFByb2plY3QoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBJRm9sZGVyIHJlcHJlc2VudGVkIGJ5IHRoZSBTT1VSQ0VfRk9MREVSIHByb3BlcnR5LCB2ZXJpZmllZAotCSAqIHRvIGV4aXN0Ci0JICovCi0JcHJpdmF0ZSBJRm9sZGVyIGdldFZlcmlmaWVkU291cmNlRm9sZGVyKCkgewotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IGdldFN0cmluZ1Byb3BlcnR5KFNPVVJDRV9GT0xERVIpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJRm9sZGVyIGZvbGRlcjsKLQkJdHJ5IHsKLQkJCWZvbGRlciA9IHByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJQYXRoKSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoZm9sZGVyID09IG51bGwgfHwgISBmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBmb2xkZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc291cmNlIGZvbGRlciwgcHJvdmlkZWQgaXQgaXMgdmVyaWZpZWQgdG8gYmUgYW4gYWN0dWFsIGphdmEKLQkgKiBzb3VyY2UgZm9sZGVyCi0JICovCi0JcHJpdmF0ZSBJRm9sZGVyIGdldFZlcmlmaWVkSmF2YVNvdXJjZUZvbGRlcigpIHsKLQkJSUZvbGRlciBmb2xkZXIgPSBnZXRWZXJpZmllZFNvdXJjZUZvbGRlcigpOwotCQlpZiAoZm9sZGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlKYXZhUHJvamVjdCBqUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShnZXRQcm9qZWN0KCkpOwotCQlpZiAoalByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IGpQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZm9sZGVyKTsKLQkJaWYgKHBhY2thZ2VGcmFnbWVudFJvb3QgPT0gbnVsbCB8fCAhIHBhY2thZ2VGcmFnbWVudFJvb3QuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBmb2xkZXI7Ci0JfQotCQotCXByaXZhdGUgSUZpbGUgZ2V0RXhpc3RpbmdPcm1GaWxlKCkgewotCQlJRm9sZGVyIGZvbGRlciA9IGdldFZlcmlmaWVkU291cmNlRm9sZGVyKCk7Ci0JCWlmIChmb2xkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGZpbGVQYXRoID0gZ2V0U3RyaW5nUHJvcGVydHkoRklMRV9QQVRIKTsKLQkJSUZpbGUgZXhpc3RpbmdGaWxlID0gZm9sZGVyLmdldEZpbGUobmV3IFBhdGgoZmlsZVBhdGgpKTsKLQkJaWYgKCEgZXhpc3RpbmdGaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZXhpc3RpbmdGaWxlOwotCX0KLQkKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBnZXREZWZhdWx0UGVyc2lzdGVuY2VVbml0KCkgeworCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgZ2V0RGVmYXVsdFBlcnNpc3RlbmNlVW5pdCgpIHsKIAkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gZ2V0SnBhUHJvamVjdCgpOwogCQlpZiAoanBhUHJvamVjdCA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCA9IGpwYVByb2plY3QuZ2V0Um9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOworCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCA9IGpwYVByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKIAkJaWYgKHBlcnNpc3RlbmNlWG1sID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9CkBAIC00MTUsMTIgKzExOSwxMjcgQEAKIAkJcmV0dXJuIHBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlVW5pdHMoKS5uZXh0KCk7CiAJfQogCQotCXByaXZhdGUgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgeworCQlib29sZWFuIG9rID0gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkgeworCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQRVJTSVNURU5DRV9VTklULCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKKwkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUEVSU0lTVEVOQ0VfVU5JVCwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEFERF9UT19QRVJTSVNURU5DRV9VTklUKSkgeworCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQRVJTSVNURU5DRV9VTklULCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOworCQl9CisJCXJldHVybiBvazsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKERFRkFVTFRfQUNDRVNTKSkgeworCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gYWNjZXNzVHlwZXMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzNdOworCQkJYWNjZXNzVHlwZXNbMF0gPSBhY2Nlc3NQcm9wZXJ0eURlc2NyaXB0b3IobnVsbCk7CisJCQlhY2Nlc3NUeXBlc1sxXSA9IGFjY2Vzc1Byb3BlcnR5RGVzY3JpcHRvcihBY2Nlc3NUeXBlLkZJRUxEKTsKKwkJCWFjY2Vzc1R5cGVzWzJdID0gYWNjZXNzUHJvcGVydHlEZXNjcmlwdG9yKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQkJcmV0dXJuIGFjY2Vzc1R5cGVzOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVU5JVCkpIHsKKwkJCXJldHVybiBBcnJheVRvb2xzLmFycmF5KAorCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yPihuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPihudWxsLCBwZXJzaXN0ZW5jZVVuaXROYW1lcygpKSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKKwkJCQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eURlc2NyaXB0b3IobmV4dCk7CisJCQkJCX0KKwkJCQl9LAorCQkJCW5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMF0pOworCQl9CisJCXJldHVybiBzdXBlci5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9VTklUKSkgeworCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdFByb3BlcnR5RGVzY3JpcHRvcihnZXRTdHJpbmdQcm9wZXJ0eShQRVJTSVNURU5DRV9VTklUKSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eU5hbWUpOworCX0KKwkKKwlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGFjY2Vzc1Byb3BlcnR5RGVzY3JpcHRvcihBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUpIHsKKwkJaWYgKGFjY2Vzc1R5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IobnVsbCwgSnB0Q29yZU1lc3NhZ2VzLk5PTkUpOworCQl9CisJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKGFjY2Vzc1R5cGUsIGFjY2Vzc1R5cGUuZ2V0TmFtZSgpKTsKKwl9CisJCisJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHBlcnNpc3RlbmNlVW5pdFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcGVyc2lzdGVuY2VVbml0TmFtZSkgeworCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShwZXJzaXN0ZW5jZVVuaXROYW1lKSkgeworCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IobnVsbCwgSnB0Q29yZU1lc3NhZ2VzLk5PTkUpOworCQl9CisJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHBlcnNpc3RlbmNlVW5pdE5hbWUpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlKHByb3BlcnR5TmFtZSk7CisJCWlmICghIHN0YXR1cy5pc09LKCkpIHsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJCisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEFERF9UT19QRVJTSVNURU5DRV9VTklUKQorCQkJCXx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVU5JVCkpIHsKKwkJCXN0YXR1cyA9IHZhbGlkYXRlUGVyc2lzdGVuY2VVbml0KCk7CisJCX0KKwkJaWYgKCEgc3RhdHVzLmlzT0soKSkgeworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQkKKwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGZpbGVWZXJzaW9uU3VwcG9ydGVkKFN0cmluZyBmaWxlVmVyc2lvbikgeworCQlyZXR1cm4gKGZpbGVWZXJzaW9uLmVxdWFscyhKUEEuU0NIRU1BX1ZFUlNJT04pCisJCQkJfHwgZmlsZVZlcnNpb24uZXF1YWxzKEpQQTJfMC5TQ0hFTUFfVkVSU0lPTikpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBmaWxlVmVyc2lvblN1cHBvcnRlZEZvckZhY2V0VmVyc2lvbihTdHJpbmcgZmlsZVZlcnNpb24sIFN0cmluZyBqcGFGYWNldFZlcnNpb24pIHsKKwkJaWYgKGpwYUZhY2V0VmVyc2lvbi5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KUEFfRkFDRVRfVkVSU0lPTl8xXzApCisJCQkJJiYgZmlsZVZlcnNpb24uZXF1YWxzKEpQQTJfMC5TQ0hFTUFfVkVSU0lPTikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVQZXJzaXN0ZW5jZVVuaXQoKSB7CisJCWJvb2xlYW4gYWRkVG9QVW5pdCA9IGdldEJvb2xlYW5Qcm9wZXJ0eShBRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCk7CisJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSk7CisJCVN0cmluZyBwVW5pdE5hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShQRVJTSVNURU5DRV9VTklUKTsKKwkJaWYgKGFkZFRvUFVuaXQpIHsKKwkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHBVbml0TmFtZSkpIHsKKwkJCQlyZXR1cm4gbmV3IFN0YXR1cygKKwkJCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQsCisJCQkJCU5MUy5iaW5kKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9QRVJTSVNURU5DRV9VTklUX0RPRVNfTk9UX1NQRUNJRklFRCwgcFVuaXROYW1lKSk7CisJCQl9CisJCQlpZiAoZ2V0UGVyc2lzdGVuY2VVbml0KCkgPT0gbnVsbCkgeworCQkJCXJldHVybiBuZXcgU3RhdHVzKAorCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwKKwkJCQkJTkxTLmJpbmQoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX1BFUlNJU1RFTkNFX1VOSVRfTk9UX0lOX1BST0pFQ1QsIHBVbml0TmFtZSwgcHJvamVjdE5hbWUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewogCQlTdHJpbmcgcFVuaXROYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoUEVSU0lTVEVOQ0VfVU5JVCk7CiAJCUpwYVByb2plY3QganBhUHJvamVjdCA9IAogCQkJKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocFVuaXROYW1lKSkgPyBudWxsIDogZ2V0SnBhUHJvamVjdCgpOwogCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCA9IAotCQkJKGpwYVByb2plY3QgPT0gbnVsbCkgPyBudWxsIDoganBhUHJvamVjdC5nZXRSb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCk7CisJCQkoanBhUHJvamVjdCA9PSBudWxsKSA/IG51bGwgOiBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCk7CiAJCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gCiAJCQkocGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgPyBudWxsIDogcGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKTsKIAkJaWYgKHBlcnNpc3RlbmNlICE9IG51bGwpIHsKQEAgLTQzNCw0MSArMjUzLDE2IEBACiAJCXJldHVybiBudWxsOwogCX0KIAkKLQlwcml2YXRlIEl0ZXJhdG9yPElQcm9qZWN0PiBqcGFJUHJvamVjdHMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8SVByb2plY3QsIElQcm9qZWN0PihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoUHJvamVjdFV0aWxpdGllcy5nZXRBbGxQcm9qZWN0cygpKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSVByb2plY3QgcHJvamVjdCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQocHJvamVjdCwgSnB0Q29yZVBsdWdpbi5GQUNFVF9JRCk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX07CisJcHJvdGVjdGVkIEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4gcGVyc2lzdGVuY2VVbml0cygpIHsKKwkJLy9vbmx5IGdldCB0aGUgcGVyc2lzdGVuY2UgdW5pdHMgZm9yIHRoZSBzZWxlY3RlZCBKcGFQcm9qZWN0LCAKKwkJLy9pZiBubyBqcGEgcHJvamVjdCBpcyBzZWxlY3RlZCwgdGhlbiBubyBwZXJzaXN0ZW5jZSB1bml0cyB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgY29tYm8KKwkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gZ2V0SnBhUHJvamVjdCgpOworCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCA9IChqcGFQcm9qZWN0ID09IG51bGwpID8gbnVsbCA6IGpwYVByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKKwkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSAocGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgPyBudWxsIDogcGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKTsKKwkJcmV0dXJuIChwZXJzaXN0ZW5jZSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPFBlcnNpc3RlbmNlVW5pdD5pbnN0YW5jZSgpIDogcGVyc2lzdGVuY2UucGVyc2lzdGVuY2VVbml0cygpOwogCX0KIAkKLQlwcml2YXRlIEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4gcGVyc2lzdGVuY2VVbml0cygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxQZXJzaXN0ZW5jZVVuaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8SVByb2plY3QsIEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4+KGpwYUlQcm9qZWN0cygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4gdHJhbnNmb3JtKElQcm9qZWN0IGpwYUlQcm9qZWN0KSB7Ci0JCQkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChqcGFJUHJvamVjdCk7Ci0JCQkJCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0gCi0JCQkJCQkoanBhUHJvamVjdCA9PSBudWxsKSA/IG51bGwgOiBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0KCkuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKLQkJCQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSAKLQkJCQkJCShwZXJzaXN0ZW5jZVhtbCA9PSBudWxsKSA/IG51bGwgOiBwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpOwotCQkJCQlpZiAocGVyc2lzdGVuY2UgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJldHVybiBwZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZVVuaXRzKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IHBlcnNpc3RlbmNlVW5pdE5hbWVzKCkgeworCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHBlcnNpc3RlbmNlVW5pdE5hbWVzKCkgewogCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KHBlcnNpc3RlbmNlVW5pdHMoKSkgewogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXQgbmV4dCkgewpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Pcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24uamF2YQppbmRleCBiYmFjYWFiLi4xN2E2M2VjIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Pcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Pcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24uamF2YQpAQCAtMSw0NCArMSwzNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLk9ybVhtbFJlc291cmNlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CiAKLXB1YmxpYyBjbGFzcyBPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgorcHVibGljIGNsYXNzIE9ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RKcGFGaWxlQ3JlYXRpb25PcGVyYXRpb24KIAlpbXBsZW1lbnRzIE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKIHsKIAlwdWJsaWMgT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7CkBAIC00OCw0MyArMzgsMjUgQEAKIAkKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gQ3JlYXRlIHNvdXJjZSBmb2xkZXIgaWYgaXQgZG9lcyBub3QgZXhpc3QKLQkJSUZvbGRlciBmb2xkZXIgPSBjcmVhdGVTb3VyY2VGb2xkZXIoKTsKLQkJLy8gQ3JlYXRlIG9ybSBmaWxlCi0JCWNyZWF0ZU9ybVhtbChmb2xkZXIpOwotCQkvLyBBZGQgb3JtIGZpbGUgdG8gcGVyc2lzdGVuY2UgdW5pdCBpZiBzcGVjaWZpZWQKLQkJYWRkT3JtWG1sVG9QZXJzaXN0ZW5jZVhtbCgpOworCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7CisJCQorCQlpZiAoc3RhdHVzLmlzT0soKSkgeworCQkJYWRkTWFwcGluZ0ZpbGVUb1BlcnNpc3RlbmNlWG1sKCk7CisJCX0KKwkJCiAJCXJldHVybiBPS19TVEFUVVM7CiAJfQogCQotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiTm8gcHJvamVjdCBuYW1lIHNwZWNpZmllZCIpOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQlwcml2YXRlIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIlByb2plY3QgZG9lcyBub3QgaGF2ZSBKUEEgY29udGVudCIpOwotCQl9Ci0JCXJldHVybiBqcGFQcm9qZWN0OwotCX0KLQkKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogCQlTdHJpbmcgcFVuaXROYW1lID0gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoUEVSU0lTVEVOQ0VfVU5JVCk7CiAJCUpwYVByb2plY3QganBhUHJvamVjdCA9IGdldEpwYVByb2plY3QoKTsKLQkJUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwgPSBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0KCkuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKKwkJUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwgPSBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCk7CiAJCWlmIChwZXJzaXN0ZW5jZVhtbCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJQcm9qZWN0IGRvZXMgbm90IGhhdmUgYSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIpOworCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiUHJvamVjdCBkb2VzIG5vdCBoYXZlIGEgcGVyc2lzdGVuY2UueG1sIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKTsKIAkJaWYgKHBlcnNpc3RlbmNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oInBlcnNpc3RlbmNlLnhtbCBkb2VzIG5vdCBoYXZlIGEgcGVyc2lzdGVuY2Ugbm9kZS4iKTsKKwkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oInBlcnNpc3RlbmNlLnhtbCBkb2VzIG5vdCBoYXZlIGEgcGVyc2lzdGVuY2Ugbm9kZS4iKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBzdHJlYW0gPSBwZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZVVuaXRzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewogCQkJUGVyc2lzdGVuY2VVbml0IHBVbml0ID0gc3RyZWFtLm5leHQoKTsKQEAgLTkyLDc1ICs2NCwzNCBAQAogCQkJCXJldHVybiBwVW5pdDsKIAkJCX0KIAkJfQotCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJwZXJzaXN0ZW5jZS54bWwgZG9lcyBub3QgaGF2ZSBwZXJzaXN0ZW5jZSB1bml0IG5hbWVkIFwnIiArIHBVbml0TmFtZSArICJcJyIpOworCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJwZXJzaXN0ZW5jZS54bWwgZG9lcyBub3QgaGF2ZSBwZXJzaXN0ZW5jZSB1bml0IG5hbWVkIFwnIiArIHBVbml0TmFtZSArICJcJyIpOyAvLyROT04tTkxTLTEkCiAJfQogCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzb3VyY2UgZm9sZGVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGF0YSBtb2RlbC4gCi0JICogSXQgd2lsbCBjcmVhdGUgdGhlIHNvdXJjZSBmb2xkZXIgaWYgaXQgZG9lcyBub3QgZXhpc3QuIEl0IHdpbGwgbm90IGFkZAotCSAqIGl0IGFzIGEgc291cmNlIGZvbGRlciB0byB0aGUgcHJvamVjdCBidWlsZCBwYXRoIGlmIGl0IGlzIG5vdCBhbHJlYWR5LgotCSAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4KLQkgKi8KLQkvLyBjb3BpZWQgZnJvbSBOZXdKYXZhQ2xhc3NPcGVyYXRpb24KLQlwcml2YXRlIElGb2xkZXIgY3JlYXRlU291cmNlRm9sZGVyKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIEdldCB0aGUgc291cmNlIGZvbGRlciBuYW1lIGZyb20gdGhlIGRhdGEgbW9kZWwKLQkJU3RyaW5nIGZvbGRlclBhdGggPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShTT1VSQ0VfRk9MREVSKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIobmV3IFBhdGgoZm9sZGVyUGF0aCkpOwotCQkvLyBJZiBmb2xkZXIgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSB0aGUgZm9sZGVyIHdpdGggdGhlIHNwZWNpZmllZCBwYXRoCi0JCWlmICghIGZvbGRlci5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBmb2xkZXIiLCBlKTsKLQkJCX0KLQkJfQotCQkvLyBSZXR1cm4gdGhlIHNvdXJjZSBmb2xkZXIKLQkJcmV0dXJuIGZvbGRlcjsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU9ybVhtbChJRm9sZGVyIGZvbGRlcikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlUGF0aCA9IGdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KEZJTEVfUEFUSCk7Ci0JCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChmaWxlUGF0aCkpOwotCQlPcm1BcnRpZmFjdEVkaXQgb2FlID0gT3JtQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCU9ybVJlc291cmNlIG9ybVJlc291cmNlID0gb2FlLmdldFJlc291cmNlKGZpbGUpOwotCQlYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCWVudGl0eU1hcHBpbmdzLnNldFZlcnNpb24oIjEuMCIpOwotCQlvcm1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChlbnRpdHlNYXBwaW5ncyk7Ci0JCQotCQlBY2Nlc3NUeXBlIGRlZmF1bHRBY2Nlc3MgPSAoQWNjZXNzVHlwZSkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoREVGQVVMVF9BQ0NFU1MpOyAKLQkJaWYgKGRlZmF1bHRBY2Nlc3MgIT0gbnVsbCkgewotCQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcHVNZXRhZGF0YSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCQllbnRpdHlNYXBwaW5ncy5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShwdU1ldGFkYXRhKTsKLQkJCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHB1RGVmYXVsdHMgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQkJcHVNZXRhZGF0YS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwdURlZmF1bHRzKTsKLQkJCXB1RGVmYXVsdHMuc2V0QWNjZXNzKGRlZmF1bHRBY2Nlc3MpOwotCQl9Ci0JCQotCQlvYWUuc2F2ZShudWxsKTsKLQkJb2FlLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE9ybVhtbFRvUGVyc2lzdGVuY2VYbWwoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBhZGRNYXBwaW5nRmlsZVRvUGVyc2lzdGVuY2VYbWwoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAkJaWYgKCEgZ2V0RGF0YU1vZGVsKCkuZ2V0Qm9vbGVhblByb3BlcnR5KEFERF9UT19QRVJTSVNURU5DRV9VTklUKSkgewogCQkJcmV0dXJuOwogCQl9CisJCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLmNyZWF0ZWRGaWxlLmdldFByb2plY3QoKSk7CisJCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0ganBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7CisJCisJCWZpbmFsIFBlcnNpc3RlbmNlVW5pdCBwVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwogCQkKLQkJU3RyaW5nIGZpbGVQYXRoID0gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoRklMRV9QQVRIKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCWZvciAoSXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IHN0cmVhbSA9IHBVbml0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChmaWxlUGF0aC5lcXVhbHMoc3RyZWFtLm5leHQoKS5nZXRGaWxlTmFtZSgpKSkgewotCQkJCXJldHVybjsKKwkJcmVzb3VyY2UubW9kaWZ5KG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlTdHJpbmcgZmlsZVBhdGggPSBnZXREYXRhTW9kZWwoKS5nZXRTdHJpbmdQcm9wZXJ0eShGSUxFX1BBVEgpOworCQkJCWZvciAoSXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IHN0cmVhbSA9IHBVbml0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCQkJaWYgKGZpbGVQYXRoLmVxdWFscyhzdHJlYW0ubmV4dCgpLmdldEZpbGVOYW1lKCkpKSB7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQl9CisJCQkJTWFwcGluZ0ZpbGVSZWYgbWZSZWYgPSBwVW5pdC5hZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZigpOworCQkJCW1mUmVmLnNldEZpbGVOYW1lKG5ldyBQYXRoKGZpbGVQYXRoKS50b1BvcnRhYmxlU3RyaW5nKCkpOwogCQkJfQotCQl9Ci0JCU1hcHBpbmdGaWxlUmVmIG1mUmVmID0gcFVuaXQuYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWZSZWYuc2V0RmlsZU5hbWUobmV3IFBhdGgoZmlsZVBhdGgpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQotCQlQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCBwYWUgPSBQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQlwYWUuZ2V0UmVzb3VyY2UoKElGaWxlKSBwVW5pdC5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCXBhZS5zYXZlKG51bGwpOwotCQlwYWUuZGlzcG9zZSgpOworCQl9KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEFic3RyYWN0WG1sUmVzb3VyY2VQcm92aWRlciBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyKElGaWxlIGZpbGUpIHsKKwkJcmV0dXJuIE9ybVhtbFJlc291cmNlUHJvdmlkZXIuZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihmaWxlKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL1BlcnNpc3RlbmNlRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOWMyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zOworCitwdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbmNlRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcworCWV4dGVuZHMgSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcworeworCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDc0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKKworcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKKwlleHRlbmRzIEFic3RyYWN0SnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKKwlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcworeworCS8qKgorCSAqIHJlcXVpcmVkIGRlZmF1bHQgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbk9wZXJhdGlvbihnZXREYXRhTW9kZWwoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZpbGVQYXRoKCkgeworCQlyZXR1cm4gbmV3IFBhdGgoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX1BFUlNJU1RFTkNFX1hNTF9GSUxFX1BBVEgpLnRvUG9ydGFibGVTdHJpbmcoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmVyc2lvbigpIHsKKwkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZSgKKwkJCQlKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUpLmdldFZlcnNpb24oKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGZpbGVWZXJzaW9uU3VwcG9ydGVkKFN0cmluZyBmaWxlVmVyc2lvbikgeworCQlyZXR1cm4gKGZpbGVWZXJzaW9uLmVxdWFscyhKUEEuU0NIRU1BX1ZFUlNJT04pCisJCQkJfHwgZmlsZVZlcnNpb24uZXF1YWxzKEpQQTJfMC5TQ0hFTUFfVkVSU0lPTikpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBmaWxlVmVyc2lvblN1cHBvcnRlZEZvckZhY2V0VmVyc2lvbihTdHJpbmcgZmlsZVZlcnNpb24sIFN0cmluZyBqcGFGYWNldFZlcnNpb24pIHsKKwkJaWYgKGpwYUZhY2V0VmVyc2lvbi5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KUEFfRkFDRVRfVkVSU0lPTl8xXzApCisJCQkJJiYgZmlsZVZlcnNpb24uZXF1YWxzKEpQQTJfMC5TQ0hFTUFfVkVSU0lPTikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL1BlcnNpc3RlbmNlRmlsZUNyZWF0aW9uT3BlcmF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OGUzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKKworcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlRmlsZUNyZWF0aW9uT3BlcmF0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdEpwYUZpbGVDcmVhdGlvbk9wZXJhdGlvbgorCWltcGxlbWVudHMgUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCit7CisJcHVibGljIFBlcnNpc3RlbmNlRmlsZUNyZWF0aW9uT3BlcmF0aW9uKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7CisJCXN1cGVyKGRhdGFNb2RlbCk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBBYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXIgZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihJRmlsZSBmaWxlKSB7CisJCXJldHVybiBQZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXIuZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihmaWxlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0dlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5NDg2MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVzSW1wbC5Bc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVJbXBsLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZXNJbXBsLkF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQmFzaWNJbXBsLkJhc2ljQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Db2x1bW5JbXBsLkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvckNvbHVtbkltcGwuRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclZhbHVlSW1wbC5EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVJbXBsLkVtYmVkZGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRJbXBsLkVtYmVkZGVkSWRBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSW1wbC5FbWJlZGRlZEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRW50aXR5SW1wbC5FbnRpdHlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRJbXBsLkVudW1lcmF0ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlSW1wbC5HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuSWRDbGFzc0ltcGwuSWRDbGFzc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuSWRJbXBsLklkQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZUltcGwuSW5oZXJpdGFuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5JbXBsLkpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5zSW1wbC5Kb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuSm9pblRhYmxlSW1wbC5Kb2luVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkxvYkltcGwuTG9iQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5NYW55VG9NYW55SW1wbC5NYW55VG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5NYW55VG9PbmVJbXBsLk1hbnlUb09uZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTWFwS2V5SW1wbC5NYXBLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NJbXBsLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcmllc0ltcGwuTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5SW1wbC5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJpZXNJbXBsLk5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUltcGwuTmFtZWRRdWVyeUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuT25lVG9NYW55SW1wbC5PbmVUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk9uZVRvT25lSW1wbC5PbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuT3JkZXJCeUltcGwuT3JkZXJCeUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJbXBsLlByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVJbXBsLlNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZXNJbXBsLlNlY29uZGFyeVRhYmxlc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JJbXBsLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckltcGwuVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlRhYmxlSW1wbC5UYWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuVGVtcG9yYWxJbXBsLlRlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5UcmFuc2llbnRJbXBsLlRyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuVmVyc2lvbkltcGwuVmVyc2lvbkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSnBhQW5ub3RhdGlvblByb3ZpZGVyCi17Ci0JLyoqCi0JICogT3JkZXJlZCBsaXN0IG9mIHBvc3NpYmxlIHR5cGUgbWFwcGluZyBhbm5vdGF0aW9ucy4gIE9yZGVyZWQgYmVjYXVzZSB0aGlzCi0JICogaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG1hcHBpbmcgaW4gdGhlIGNhc2Ugd2hlcmUgMiBtYXBwaW5nIGFubm90YXRpb25zIGV4aXN0Ci0JICovCi0JcHJpdmF0ZSBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiB0eXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9uczsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248QW5ub3RhdGlvbkRlZmluaXRpb24+IHR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnM7Ci0JCi0JLyoqCi0JICogT3JkZXJlZCBsaXN0IG9mIHBvc3NpYmxlIGF0dHJpYnV0ZSBtYXBwaW5nIGFubm90YXRpb25zLiAgT3JkZXJlZCBiZWNhdXNlIHRoaXMKLQkgKiBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgbWFwcGluZyBpbiB0aGUgY2FzZSB3aGVyZSAyIG1hcHBpbmcgYW5ub3RhdGlvbnMgZXhpc3QKLQkgKi8KLQlwcml2YXRlIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnM7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEFubm90YXRpb25EZWZpbml0aW9uPiBhdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbnM7Ci0JCi0JCi0JcHJvdGVjdGVkIEdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24+IHR5cGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlpZiAodGhpcy50eXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucyA9PSBudWxsKSB7Ci0JCQl0aGlzLnR5cGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLQkJCXRoaXMuYWRkVHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyh0aGlzLnR5cGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zKTsKLQkJfQotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPih0aGlzLnR5cGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zKTsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyB0byBzcGVjaWZ5IG1vcmUgb3IgZGlmZmVyZW50IHR5cGUgbWFwcGluZyBkZWZpbml0aW9ucy4KLQkgKiBUaGUgZGVmYXVsdCBpbmNsdWRlcyB0aGUgSlBBIHNwZWMtZGVmaW5lZCB0eXBlIG1hcHBpbmdzIG9mIAotCSAqIEVtYmVkZGFibGUsIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zVG8oTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEVtYmVkZGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVudGl0eUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24+IHR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCWlmICh0aGlzLnR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotCQkJdGhpcy50eXBlQW5ub3RhdGlvbkRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLQkJCXRoaXMuYWRkVHlwZUFubm90YXRpb25EZWZpbml0aW9uc1RvKHRoaXMudHlwZUFubm90YXRpb25EZWZpbml0aW9ucyk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPih0aGlzLnR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMpOwotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgbW9yZSBvciBkaWZmZXJlbnQgdHlwZSBhbm5vdGF0aW9uIGRlZmluaXRpb25zLgotCSAqIFRoZSBkZWZhdWx0IGluY2x1ZGVzIHRoZSBKUEEgc3BlYy1kZWZpbmVkIGFubm90YXRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhDb2xsZWN0aW9uPEFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKElkQ2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEluaGVyaXRhbmNlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChOYW1lZFF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKFRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChUYWJsZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiBhdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zID09IG51bGwpIHsKLQkJCXRoaXMuYXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+KCk7Ci0JCQl0aGlzLmFkZEF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyh0aGlzLmF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMpOwotCQl9Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24+KHRoaXMuYXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucyk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc3BlY2lmeSBtb3JlIG9yIGRpZmZlcmVudCBhdHRyaWJ1dGUgbWFwcGluZyBkZWZpbml0aW9ucy4KLQkgKiBUaGUgZGVmYXVsdCBpbmNsdWRlcyB0aGUgSlBBIHNwZWMtZGVmaW5lZCBhdHRyaWJ1dGUgbWFwcGluZ3Mgb2YgCi0JICogQmFzaWMsIElkLCBUcmFuc2llbnQgT25lVG9PbmUsIE9uZVRvTWFueSwgTWFueVRvT25lLCBNYW55VG9NYW55LCBFbWJlZGRlZCwgRW1iZWRkZWRJZCwgVmVyc2lvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zVG8oTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEJhc2ljQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFbWJlZGRlZEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE1hbnlUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE1hbnlUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT25lVG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChWZXJzaW9uQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotCQkJdGhpcy5hdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPigpOwotCQkJdGhpcy5hZGRBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyh0aGlzLmF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9ucyk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPih0aGlzLmF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9ucyk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc3BlY2lmeSBtb3JlIG9yIGRpZmZlcmVudCBhdHRyaWJ1dGUgYW5ub3RhdGlvbiBkZWZpbml0aW9ucy4KLQkgKiBUaGUgZGVmYXVsdCBpbmNsdWRlcyB0aGUgSlBBIHNwZWMtZGVmaW5lZCBhbm5vdGF0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhDb2xsZWN0aW9uPEFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKENvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRW51bWVyYXRlZEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKb2luVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKExvYkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoTWFwS2V5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcmRlckJ5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKFRlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKioqKioqIElKcGFQbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZFR5cGVNYXBwaW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSwgU3RyaW5nIG1hcHBpbmdBbm5vdGF0aW9uTmFtZSkgewotCQlBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA9IHR5cGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb24obWFwcGluZ0Fubm90YXRpb25OYW1lKTsKLQkJcmV0dXJuIGFubm90YXRpb25EZWZpbml0aW9uLmJ1aWxkQW5ub3RhdGlvbihwYXJlbnQsIHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxUeXBlTWFwcGluZ0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBUeXBlIHR5cGUsIFN0cmluZyBtYXBwaW5nQW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSB0eXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9uKG1hcHBpbmdBbm5vdGF0aW9uTmFtZSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5idWlsZE51bGxBbm5vdGF0aW9uKHBhcmVudCwgdHlwZSk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRUeXBlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uID0gdHlwZUFubm90YXRpb25EZWZpbml0aW9uKGFubm90YXRpb25OYW1lKTsKLQkJcmV0dXJuIGFubm90YXRpb25EZWZpbml0aW9uLmJ1aWxkQW5ub3RhdGlvbihwYXJlbnQsIHR5cGUpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbFR5cGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSB0eXBlQW5ub3RhdGlvbkRlZmluaXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCQlyZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb24uYnVpbGROdWxsQW5ub3RhdGlvbihwYXJlbnQsIHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdHlwZU1hcHBpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24sIFN0cmluZz4odHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShBbm5vdGF0aW9uRGVmaW5pdGlvbiBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gdHlwZUFubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uLCBTdHJpbmc+KHR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShBbm5vdGF0aW9uRGVmaW5pdGlvbiBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSwgU3RyaW5nIG1hcHBpbmdBbm5vdGF0aW9uTmFtZSkgewotCQlBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA9IGF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbihtYXBwaW5nQW5ub3RhdGlvbk5hbWUpOwotCQlyZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb24uYnVpbGRBbm5vdGF0aW9uKHBhcmVudCwgYXR0cmlidXRlKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA9IGF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5idWlsZE51bGxBbm5vdGF0aW9uKHBhcmVudCwgYXR0cmlidXRlKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBdHRyaWJ1dGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSBhdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5idWlsZEFubm90YXRpb24ocGFyZW50LCBhdHRyaWJ1dGUpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBdHRyaWJ1dGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSBhdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5idWlsZE51bGxBbm5vdGF0aW9uKHBhcmVudCwgYXR0cmlidXRlKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24sIFN0cmluZz4oYXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEFubm90YXRpb25EZWZpbml0aW9uIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5nZXRBbm5vdGF0aW9uTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbiwgU3RyaW5nPihhdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShBbm5vdGF0aW9uRGVmaW5pdGlvbiBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRGVmaW5pdGlvbiB0eXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nQW5ub3RhdGlvbk5hbWUpIHsKLQkJZm9yIChMaXN0SXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24+IGkgPSB0eXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucygpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlBbm5vdGF0aW9uRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gaS5uZXh0KCk7Ci0JCQlpZiAoZGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscyhtYXBwaW5nQW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtYXBwaW5nQW5ub3RhdGlvbk5hbWUgKyAiIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgbWFwcGluZyBhbm5vdGF0aW9uIik7Ci0JfQotCQotCXByaXZhdGUgQW5ub3RhdGlvbkRlZmluaXRpb24gdHlwZUFubm90YXRpb25EZWZpbml0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiBpID0gdHlwZUFubm90YXRpb25EZWZpbml0aW9ucygpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlBbm5vdGF0aW9uRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gaS5uZXh0KCk7Ci0JCQlpZiAoZGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGFubm90YXRpb25OYW1lICsgIiBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlIGFubm90YXRpb24iKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25EZWZpbml0aW9uIGF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiBpID0gYXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucygpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlBbm5vdGF0aW9uRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gaS5uZXh0KCk7Ci0JCQlpZiAoZGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscyhtYXBwaW5nQW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtYXBwaW5nQW5ub3RhdGlvbk5hbWUgKyAiIGlzIGFuIHVuc3VwcG9ydGVkIGF0dHJpYnV0ZSBtYXBwaW5nIGFubm90YXRpb24iKTsJCi0JfQotCQotCXByaXZhdGUgQW5ub3RhdGlvbkRlZmluaXRpb24gYXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8QW5ub3RhdGlvbkRlZmluaXRpb24+IGkgPSBhdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJQW5ub3RhdGlvbkRlZmluaXRpb24gZGVmaW5pdGlvbiA9IGkubmV4dCgpOwotCQkJaWYgKGRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihhbm5vdGF0aW9uTmFtZSArICIgaXMgYW4gdW5zdXBwb3J0ZWQgYXR0cmlidXRlIGFubm90YXRpb24iKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vR2VuZXJpY0pwYUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9HZW5lcmljSnBhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDU3ZjA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9HZW5lcmljSnBhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFEYXRhU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YURpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLlBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LkdlbmVyaWNSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YURpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU51bGxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1HZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtWG1sSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNDbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1SZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHk7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSnBhRmFjdG9yeSBpbXBsZW1lbnRzIEpwYUZhY3RvcnkKLXsKLQlwcm90ZWN0ZWQgR2VuZXJpY0pwYUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogQ29yZSBvYmplY3RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChKcGFQcm9qZWN0LkNvbmZpZyBjb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUHJvamVjdChjb25maWcpOwotCX0KLQkKLQlwdWJsaWMgSnBhRGF0YVNvdXJjZSBidWlsZEpwYURhdGFTb3VyY2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYURhdGFTb3VyY2UoanBhUHJvamVjdCwgY29ubmVjdGlvblByb2ZpbGVOYW1lKTsKLQl9Ci0JCi0JcHVibGljIEpwYUZpbGUgYnVpbGRKcGFGaWxlKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSwgUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYUZpbGUoanBhUHJvamVjdCwgZmlsZSwgcmVzb3VyY2VNb2RlbCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogUmVzb3VyY2Ugb2JqZWN0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGhhc1JlbGV2YW50Q29udGVudChJRmlsZSBmaWxlKSB7Ci0JCWlmICghIEphdmFDb3JlLmNyZWF0ZShmaWxlLmdldFByb2plY3QoKSkuaXNPbkNsYXNzcGF0aChmaWxlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IHRoaXMuY29udGVudFR5cGUoZmlsZSk7Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBjb250ZW50VHlwZS5nZXRJZCgpOwotCQlyZXR1cm4gc3VwcG9ydHNDb250ZW50VHlwZShjb250ZW50VHlwZUlkKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlyZXR1cm4gY29udGVudFR5cGVJZC5lcXVhbHMoSmF2YUNvcmUuSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKQotCQkJCXx8IGNvbnRlbnRUeXBlSWQuZXF1YWxzKEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRSkKLQkJCQl8fCBjb250ZW50VHlwZUlkLmVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIFJlc291cmNlTW9kZWwgYnVpbGRSZXNvdXJjZU1vZGVsKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSkgewotCQlpZiAoISBKYXZhQ29yZS5jcmVhdGUoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpLmlzT25DbGFzc3BhdGgoZmlsZSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBmaWxlIiArIGZpbGUgKyAiIGlzIG5vdCBvbiB0aGUgcHJvamVjdCBjbGFzc3BhdGgiKTsKLQkJfQotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSB0aGlzLmNvbnRlbnRUeXBlKGZpbGUpOwotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGZpbGUiICsgZmlsZSArICIgZG9lcyBub3QgaGF2ZSBhIHN1cHBvcnRlZCBjb250ZW50IHR5cGUiKTsKLQkJfQotCQlTdHJpbmcgY29udGVudFR5cGVJZCA9IGNvbnRlbnRUeXBlLmdldElkKCk7Ci0JCXJldHVybiBidWlsZFJlc291cmNlTW9kZWwoanBhUHJvamVjdCwgZmlsZSwgY29udGVudFR5cGVJZCk7Ci0JfQotCQotCXByb3RlY3RlZCBSZXNvdXJjZU1vZGVsIGJ1aWxkUmVzb3VyY2VNb2RlbChKcGFQcm9qZWN0IGpwYVByb2plY3QsIElGaWxlIGZpbGUsIFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCWlmIChKYXZhQ29yZS5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUuZXF1YWxzKGNvbnRlbnRUeXBlSWQpKSB7Ci0JCQlyZXR1cm4gYnVpbGRKYXZhUmVzb3VyY2VNb2RlbChqcGFQcm9qZWN0LCBmaWxlKTsKLQkJfQotCQllbHNlIGlmIChKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUuZXF1YWxzKGNvbnRlbnRUeXBlSWQpKSB7Ci0JCQlyZXR1cm4gYnVpbGRQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWwoZmlsZSk7Ci0JCX0KLQkJZWxzZSBpZiAoSnB0Q29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRS5lcXVhbHMoY29udGVudFR5cGVJZCkpIHsKLQkJCXJldHVybiBidWlsZE9ybVJlc291cmNlTW9kZWwoZmlsZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgUmVzb3VyY2VNb2RlbCBidWlsZEphdmFSZXNvdXJjZU1vZGVsKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gbmV3IEphdmFSZXNvdXJjZU1vZGVsSW1wbCgKLQkJCQlmaWxlLCBqcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCksIAotCQkJCWpwYVByb2plY3QuZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcigpLAotCQkJCURlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlc291cmNlTW9kZWwgYnVpbGRQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWwoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbChmaWxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlc291cmNlTW9kZWwgYnVpbGRPcm1SZXNvdXJjZU1vZGVsKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIG5ldyBPcm1SZXNvdXJjZU1vZGVsKGZpbGUpOwotCX0KLQkKLQkvLyBhdHRlbXB0aW5nIHRvIGdldCB0aGUgY29udGVudFR5cGUgYmFzZWQgb24gdGhlIGZpbGUgY29udGVudHMuCi0JLy8gaGF2ZSB0byBjaGVjayB0aGUgZmlsZSBjb250ZW50cyBpbnN0ZWFkIG9mIGp1c3QgdGhlIGZpbGUgbmFtZQotCS8vIGJlY2F1c2UgZm9yIHhtbCB3ZSBiYXNlIGl0IG9uIHRoZSByb290RWxlbWVudCBuYW1lCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgY29udGVudFR5cGUoSUZpbGUgZmlsZSkgewotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnB1dFN0cmVhbSA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoaW5wdXRTdHJlYW0sIGZpbGUuZ2V0TmFtZSgpKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIENvbnRleHQgb2JqZWN0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhUm9vdENvbnRleHROb2RlIGJ1aWxkUm9vdENvbnRleHQoSnBhUHJvamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljUm9vdENvbnRleHROb2RlKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbCBidWlsZFBlcnNpc3RlbmNlWG1sKEpwYVJvb3RDb250ZXh0Tm9kZSBwYXJlbnQsIFBlcnNpc3RlbmNlUmVzb3VyY2UgcGVyc2lzdGVuY2VSZXNvdXJjZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNQZXJzaXN0ZW5jZVhtbChwYXJlbnQsIHBlcnNpc3RlbmNlUmVzb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgT3JtWG1sIGJ1aWxkT3JtWG1sKE1hcHBpbmdGaWxlUmVmIHBhcmVudCwgT3JtUmVzb3VyY2Ugb3JtUmVzb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBPcm1YbWxJbXBsKHBhcmVudCwgb3JtUmVzb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgRW50aXR5TWFwcGluZ3MgYnVpbGRFbnRpdHlNYXBwaW5ncyhPcm1YbWwgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyB4bWxFbnRpdHlNYXBwaW5ncykgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNFbnRpdHlNYXBwaW5ncyhwYXJlbnQsIHhtbEVudGl0eU1hcHBpbmdzKTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGJ1aWxkUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRW50aXR5TWFwcGluZ3MgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyB4bWxFbnRpdHlNYXBwaW5ncykgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShwYXJlbnQsIHhtbEVudGl0eU1hcHBpbmdzKTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGJ1aWxkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyB4bWxFbnRpdHlNYXBwaW5ncykgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwYXJlbnQsIHhtbEVudGl0eU1hcHBpbmdzKTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlIGJ1aWxkUGVyc2lzdGVuY2UoUGVyc2lzdGVuY2VYbWwgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNQZXJzaXN0ZW5jZShwYXJlbnQsIHhtbFBlcnNpc3RlbmNlKTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBidWlsZFBlcnNpc3RlbmNlVW5pdChQZXJzaXN0ZW5jZSBwYXJlbnQsIFhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljUGVyc2lzdGVuY2VVbml0KHBhcmVudCwgcGVyc2lzdGVuY2VVbml0KTsKLQl9Ci0JCi0JcHVibGljIE1hcHBpbmdGaWxlUmVmIGJ1aWxkTWFwcGluZ0ZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljTWFwcGluZ0ZpbGVSZWYocGFyZW50LCB4bWxNYXBwaW5nRmlsZVJlZik7Ci0JfQotCQotCXB1YmxpYyBDbGFzc1JlZiBidWlsZENsYXNzUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbEphdmFDbGFzc1JlZiBjbGFzc1JlZikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNDbGFzc1JlZihwYXJlbnQsIGNsYXNzUmVmKTsKLQl9Ci0JCi0JcHVibGljIENsYXNzUmVmIGJ1aWxkQ2xhc3NSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNDbGFzc1JlZihwYXJlbnQsIGNsYXNzTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBQcm9wZXJ0eSBidWlsZFByb3BlcnR5KFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbFByb3BlcnR5IHhtbFByb3BlcnR5KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY1Byb3BlcnR5KHBhcmVudCwgeG1sUHJvcGVydHkpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKEpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUocGFyZW50LCByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKLQl9Ci0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVR5cGVNYXBwaW5nIGJ1aWxkSmF2YU51bGxUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YU51bGxUeXBlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUVudGl0eSBidWlsZEphdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhRW50aXR5KHBhcmVudCk7Ci0JfQotCi0JcHVibGljIEphdmFNYXBwZWRTdXBlcmNsYXNzIGJ1aWxkSmF2YU1hcHBlZFN1cGVyY2xhc3MoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFwcGVkU3VwZXJjbGFzcyhwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBKYXZhRW1iZWRkYWJsZSBidWlsZEphdmFFbWJlZGRhYmxlKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUVtYmVkZGFibGUocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFUYWJsZSBidWlsZEphdmFUYWJsZShKYXZhRW50aXR5IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhVGFibGUocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFDb2x1bW4gYnVpbGRKYXZhQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFDb2x1bW4uT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUNvbHVtbihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uIGJ1aWxkSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4oSmF2YUVudGl0eSBwYXJlbnQsIEphdmFOYW1lZENvbHVtbi5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhRGlzY3JpbWluYXRvckNvbHVtbihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIEphdmFKb2luQ29sdW1uIGJ1aWxkSmF2YUpvaW5Db2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUpvaW5Db2x1bW4uT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUpvaW5Db2x1bW4ocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBKYXZhSm9pblRhYmxlIGJ1aWxkSmF2YUpvaW5UYWJsZShKYXZhUmVsYXRpb25zaGlwTWFwcGluZyBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUpvaW5UYWJsZShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVNlY29uZGFyeVRhYmxlIGJ1aWxkSmF2YVNlY29uZGFyeVRhYmxlKEphdmFFbnRpdHkgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUJhc2ljTWFwcGluZyBidWlsZEphdmFCYXNpY01hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFCYXNpY01hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFFbWJlZGRlZElkTWFwcGluZyBidWlsZEphdmFFbWJlZGRlZElkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhRW1iZWRkZWRNYXBwaW5nIGJ1aWxkSmF2YUVtYmVkZGVkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUlkTWFwcGluZyBidWlsZEphdmFJZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFJZE1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFNYW55VG9NYW55TWFwcGluZyBidWlsZEphdmFNYW55VG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU1hbnlUb01hbnlNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhTWFueVRvT25lTWFwcGluZyBidWlsZEphdmFNYW55VG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YU9uZVRvTWFueU1hcHBpbmcgYnVpbGRKYXZhT25lVG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFPbmVUb09uZU1hcHBpbmcgYnVpbGRKYXZhT25lVG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVHJhbnNpZW50TWFwcGluZyBidWlsZEphdmFUcmFuc2llbnRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhVHJhbnNpZW50TWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVZlcnNpb25NYXBwaW5nIGJ1aWxkSmF2YVZlcnNpb25NYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFTZXF1ZW5jZUdlbmVyYXRvciBidWlsZEphdmFTZXF1ZW5jZUdlbmVyYXRvcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVRhYmxlR2VuZXJhdG9yIGJ1aWxkSmF2YVRhYmxlR2VuZXJhdG9yKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVRhYmxlR2VuZXJhdG9yKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhR2VuZXJhdGVkVmFsdWUgYnVpbGRKYXZhR2VuZXJhdGVkVmFsdWUoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFHZW5lcmF0ZWRWYWx1ZShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFCYXNlSm9pbkNvbHVtbi5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4ocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRKYXZhQXR0cmlidXRlT3ZlcnJpZGUoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgQXR0cmlidXRlT3ZlcnJpZGUuT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBBc3NvY2lhdGlvbk92ZXJyaWRlLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgSmF2YU5hbWVkUXVlcnkgYnVpbGRKYXZhTmFtZWRRdWVyeShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFOYW1lZFF1ZXJ5KHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhTmFtZWROYXRpdmVRdWVyeSBidWlsZEphdmFOYW1lZE5hdGl2ZVF1ZXJ5KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU5hbWVkTmF0aXZlUXVlcnkocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFRdWVyeUhpbnQgYnVpbGRKYXZhUXVlcnlIaW50KEphdmFRdWVyeSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVF1ZXJ5SGludChwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVVuaXF1ZUNvbnN0cmFpbnQgYnVpbGRKYXZhVW5pcXVlQ29uc3RyYWludChKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBVbmlxdWVDb25zdHJhaW50Lk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFVbmlxdWVDb25zdHJhaW50KHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGUgYnVpbGRPcm1QZXJzaXN0ZW50VHlwZShFbnRpdHlNYXBwaW5ncyBwYXJlbnQsIFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlKHBhcmVudCwgbWFwcGluZ0tleSk7Ci0JfQotCQotCXB1YmxpYyBPcm1FbnRpdHkgYnVpbGRPcm1FbnRpdHkoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUVudGl0eShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgT3JtTWFwcGVkU3VwZXJjbGFzcyBidWlsZE9ybU1hcHBlZFN1cGVyY2xhc3MoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU1hcHBlZFN1cGVyY2xhc3MocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybUVtYmVkZGFibGUgYnVpbGRPcm1FbWJlZGRhYmxlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1FbWJlZGRhYmxlKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUocGFyZW50LCBtYXBwaW5nS2V5KTsKLQl9Ci0JCi0JcHVibGljIE9ybVRhYmxlIGJ1aWxkT3JtVGFibGUoT3JtRW50aXR5IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1UYWJsZShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgT3JtU2Vjb25kYXJ5VGFibGUgYnVpbGRPcm1TZWNvbmRhcnlUYWJsZShPcm1FbnRpdHkgcGFyZW50LCBYbWxTZWNvbmRhcnlUYWJsZSB4bWxTZWNvbmRhcnlUYWJsZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZShwYXJlbnQsIHhtbFNlY29uZGFyeVRhYmxlKTsKLQl9Ci0JCi0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4oT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPcm1CYXNlSm9pbkNvbHVtbi5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIE9ybUpvaW5UYWJsZSBidWlsZE9ybUpvaW5UYWJsZShPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Kb2luVGFibGUocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gYnVpbGRPcm1Kb2luQ29sdW1uKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3JtSm9pbkNvbHVtbi5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Kb2luQ29sdW1uKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRPcm1BdHRyaWJ1dGVPdmVycmlkZShPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEF0dHJpYnV0ZU92ZXJyaWRlLk93bmVyIG93bmVyLCBYbWxBdHRyaWJ1dGVPdmVycmlkZSB4bWxBdHRyaWJ1dGVPdmVycmlkZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZShwYXJlbnQsIG93bmVyLCB4bWxBdHRyaWJ1dGVPdmVycmlkZSk7Ci0JfQotCQotCXB1YmxpYyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGJ1aWxkT3JtQXNzb2NpYXRpb25PdmVycmlkZShPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEFzc29jaWF0aW9uT3ZlcnJpZGUuT3duZXIgb3duZXIsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlKHBhcmVudCwgb3duZXIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCX0KLQkKLQlwdWJsaWMgT3JtRGlzY3JpbWluYXRvckNvbHVtbiBidWlsZE9ybURpc2NyaW1pbmF0b3JDb2x1bW4oT3JtRW50aXR5IHBhcmVudCwgT3JtTmFtZWRDb2x1bW4uT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtRGlzY3JpbWluYXRvckNvbHVtbihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIE9ybUNvbHVtbiBidWlsZE9ybUNvbHVtbihPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybUNvbHVtbi5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Db2x1bW4ocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBPcm1HZW5lcmF0ZWRWYWx1ZSBidWlsZE9ybUdlbmVyYXRlZFZhbHVlKE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1HZW5lcmF0ZWRWYWx1ZShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgT3JtU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRPcm1TZXF1ZW5jZUdlbmVyYXRvcihPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybVRhYmxlR2VuZXJhdG9yIGJ1aWxkT3JtVGFibGVHZW5lcmF0b3IoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVRhYmxlR2VuZXJhdG9yKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1OYW1lZE5hdGl2ZVF1ZXJ5IGJ1aWxkT3JtTmFtZWROYXRpdmVRdWVyeShPcm1KcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtTmFtZWROYXRpdmVRdWVyeShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgT3JtTmFtZWRRdWVyeSBidWlsZE9ybU5hbWVkUXVlcnkoT3JtSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU5hbWVkUXVlcnkocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybVF1ZXJ5SGludCBidWlsZE9ybVF1ZXJ5SGludChPcm1RdWVyeSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtUXVlcnlIaW50KHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1CYXNpY01hcHBpbmcgYnVpbGRPcm1CYXNpY01hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtQmFzaWNNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1FbWJlZGRlZE1hcHBpbmcgYnVpbGRPcm1FbWJlZGRlZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1FbWJlZGRlZElkTWFwcGluZyBidWlsZE9ybUVtYmVkZGVkSWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUVtYmVkZGVkSWRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1JZE1hcHBpbmcgYnVpbGRPcm1JZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtSWRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1NYW55VG9NYW55TWFwcGluZyBidWlsZE9ybU1hbnlUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1NYW55VG9PbmVNYXBwaW5nIGJ1aWxkT3JtTWFueVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1PbmVUb01hbnlNYXBwaW5nIGJ1aWxkT3JtT25lVG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1PbmVUb09uZU1hcHBpbmcgYnVpbGRPcm1PbmVUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtT25lVG9PbmVNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1UcmFuc2llbnRNYXBwaW5nIGJ1aWxkT3JtVHJhbnNpZW50TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1UcmFuc2llbnRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1WZXJzaW9uTWFwcGluZyBidWlsZE9ybVZlcnNpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVZlcnNpb25NYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybVVuaXF1ZUNvbnN0cmFpbnQgYnVpbGRPcm1VbmlxdWVDb25zdHJhaW50KE9ybUpwYUNvbnRleHROb2RlIHBhcmVudCwgVW5pcXVlQ29uc3RyYWludC5Pd25lciBvd25lciwgWG1sVW5pcXVlQ29uc3RyYWludCB4bWxVbmlxdWVDb25zdHJhaW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVVuaXF1ZUNvbnN0cmFpbnQocGFyZW50LCBvd25lciwgeG1sVW5pcXVlQ29uc3RyYWludCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0dlbmVyaWNKcGFQbGF0Zm9ybS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0dlbmVyaWNKcGFQbGF0Zm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjBmNjQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9HZW5lcmljSnBhUGxhdGZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbnRpdHlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFOdWxsVHlwZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKcGFQbGF0Zm9ybSBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtCi17Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiZ2VuZXJpYyI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JCi0JcHJvdGVjdGVkIEpwYUZhY3RvcnkganBhRmFjdG9yeTsKLQkKLQlwcm90ZWN0ZWQgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlcjsKLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxKYXZhVHlwZU1hcHBpbmdQcm92aWRlcj4gamF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzOwotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+IGphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzOwotCQotCXByb3RlY3RlZCBMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBkZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnM7Ci0JCi0JcHVibGljIEdlbmVyaWNKcGFQbGF0Zm9ybSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHRoaXMuaWQ7Ci0JfQotCQotCS8qKgotCSAqICoqKioqKioqKioqKioKLQkgKiAqIElNUE9SVEFOVCAqICAgRm9yIElOVEVSTkFMIHVzZSBvbmx5ICEhCi0JICogKioqKioqKioqKioqKgotCSAqIAotCSAqIEBzZWUgSnBhUGxhdGZvcm0jc2V0SWQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyB0aGVJZCkgewotCQl0aGlzLmlkID0gdGhlSWQ7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogTW9kZWwgY29uc3RydWN0aW9uIC8gdXBkYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhRmFjdG9yeSBnZXRKcGFGYWN0b3J5KCkgewotCQlpZiAodGhpcy5qcGFGYWN0b3J5ID09IG51bGwpIHsKLQkJCXRoaXMuanBhRmFjdG9yeSA9IGJ1aWxkSnBhRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmpwYUZhY3Rvcnk7Ci0JfQotCQotCXByb3RlY3RlZCBKcGFGYWN0b3J5IGJ1aWxkSnBhRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgSnBhRmlsZSBidWlsZEpwYUZpbGUoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChnZXRKcGFGYWN0b3J5KCkuaGFzUmVsZXZhbnRDb250ZW50KGZpbGUpKSB7Ci0JCQlSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwgPSBnZXRKcGFGYWN0b3J5KCkuYnVpbGRSZXNvdXJjZU1vZGVsKGpwYVByb2plY3QsIGZpbGUpOwotCQkJcmV0dXJuIGdldEpwYUZhY3RvcnkoKS5idWlsZEpwYUZpbGUoanBhUHJvamVjdCwgZmlsZSwgcmVzb3VyY2VNb2RlbCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgYW5ub3RhdGlvbiBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEpwYUFubm90YXRpb25Qcm92aWRlciBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCWlmICh0aGlzLmFubm90YXRpb25Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0aGlzLmFubm90YXRpb25Qcm92aWRlciA9IGJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvblByb3ZpZGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB0eXBlIG1hcHBpbmcgc3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBKYXZhVHlwZU1hcHBpbmcgYnVpbGRKYXZhVHlwZU1hcHBpbmdGcm9tTWFwcGluZ0tleShTdHJpbmcgdHlwZU1hcHBpbmdLZXksIEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyRnJvbU1hcHBpbmdLZXkodHlwZU1hcHBpbmdLZXkpLmJ1aWxkTWFwcGluZyhwYXJlbnQsIGdldEpwYUZhY3RvcnkoKSk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVHlwZU1hcHBpbmcgYnVpbGRKYXZhVHlwZU1hcHBpbmdGcm9tQW5ub3RhdGlvbihTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lLCBKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBqYXZhVHlwZU1hcHBpbmdQcm92aWRlckZyb21Bbm5vdGF0aW9uKG1hcHBpbmdBbm5vdGF0aW9uTmFtZSkuYnVpbGRNYXBwaW5nKHBhcmVudCwgZ2V0SnBhRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YUF0dHJpYnV0ZU1hcHBpbmdGcm9tTWFwcGluZ0tleShTdHJpbmcgYXR0cmlidXRlTWFwcGluZ0tleSwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBqYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyRnJvbU1hcHBpbmdLZXkoYXR0cmlidXRlTWFwcGluZ0tleSkuYnVpbGRNYXBwaW5nKHBhcmVudCwgZ2V0SnBhRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YUF0dHJpYnV0ZU1hcHBpbmdGcm9tQW5ub3RhdGlvbihTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lLCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJGcm9tQW5ub3RhdGlvbihtYXBwaW5nQW5ub3RhdGlvbk5hbWUpLmJ1aWxkTWFwcGluZyhwYXJlbnQsIGdldEpwYUZhY3RvcnkoKSk7Ci0JfQotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIocGFyZW50KS5idWlsZE1hcHBpbmcocGFyZW50LCBnZXRKcGFGYWN0b3J5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8SmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI+IGphdmFUeXBlTWFwcGluZ1Byb3ZpZGVycygpIHsKLQkJaWYgKHRoaXMuamF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCXRoaXMuamF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxKYXZhVHlwZU1hcHBpbmdQcm92aWRlcj4oKTsKLQkJCXRoaXMuYWRkSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzVG8odGhpcy5qYXZhVHlwZU1hcHBpbmdQcm92aWRlcnMpOwotCQl9Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxKYXZhVHlwZU1hcHBpbmdQcm92aWRlcj4odGhpcy5qYXZhVHlwZU1hcHBpbmdQcm92aWRlcnMpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc3BlY2lmeSBtb3JlIG9yIGRpZmZlcmVudCB0eXBlIG1hcHBpbmcgcHJvdmlkZXJzLgotCSAqIFRoZSBkZWZhdWx0IGluY2x1ZGVzIHRoZSBKUEEgc3BlYy1kZWZpbmVkIHR5cGUgbWFwcGluZ3Mgb2YgCi0JICogRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzLCBhbmQgRW1iZWRkYWJsZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyc1RvKENvbGxlY3Rpb248SmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKEphdmFFbnRpdHlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhTWFwcGVkU3VwZXJjbGFzc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFFbWJlZGRhYmxlUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YU51bGxUeXBlTWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdQcm92aWRlciBqYXZhVHlwZU1hcHBpbmdQcm92aWRlckZyb21NYXBwaW5nS2V5KFN0cmluZyB0eXBlTWFwcGluZ0tleSkgewotCQlmb3IgKEl0ZXJhdG9yPEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyPiBpID0gdGhpcy5qYXZhVHlwZU1hcHBpbmdQcm92aWRlcnMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIgcHJvdmlkZXIgPSBpLm5leHQoKTsKLQkJCWlmIChwcm92aWRlci5nZXRLZXkoKSA9PSB0eXBlTWFwcGluZ0tleSkgewotCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHR5cGUgbWFwcGluZyBrZXk6ICIgKyB0eXBlTWFwcGluZ0tleSk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdQcm92aWRlciBqYXZhVHlwZU1hcHBpbmdQcm92aWRlckZyb21Bbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yPEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyPiBpID0gdGhpcy5qYXZhVHlwZU1hcHBpbmdQcm92aWRlcnMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIgcHJvdmlkZXIgPSBpLm5leHQoKTsKLQkJCWlmIChwcm92aWRlci5nZXRBbm5vdGF0aW9uTmFtZSgpID09IGFubm90YXRpb25OYW1lKSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgYW5ub3RhdGlvbiBuYW1lOiAiICsgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gamF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMoKSB7Ci0JCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+KCk7Ci0JCQl0aGlzLmFkZEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzVG8odGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycyk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+KHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc3BlY2lmeSBtb3JlIG9yIGRpZmZlcmVudCBhdHRyaWJ1dGUgbWFwcGluZyBwcm92aWRlcnMuCi0JICogVGhlIGRlZmF1bHQgaW5jbHVkZXMgdGhlIEpQQSBzcGVjLWRlZmluZWQgYXR0cmlidXRlIG1hcHBpbmdzIG9mIAotCSAqIEJhc2ljLCBJZCwgVHJhbnNpZW50IE9uZVRvT25lLCBPbmVUb01hbnksIE1hbnlUb09uZSwgTWFueVRvTWFueSwgRW1iZWRkYWJsZSwgRW1iZWRkZWRJZCwgVmVyc2lvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyc1RvKENvbGxlY3Rpb248SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YUJhc2ljTWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFFbWJlZGRlZE1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhRW1iZWRkZWRJZE1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhSWRNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YU1hbnlUb01hbnlNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YU1hbnlUb09uZU1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhT25lVG9NYW55TWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFPbmVUb09uZU1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhVHJhbnNpZW50TWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFWZXJzaW9uTWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJGcm9tTWFwcGluZ0tleShTdHJpbmcgYXR0cmlidXRlTWFwcGluZ0tleSkgewotCQlmb3IgKEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+IGkgPSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgcHJvdmlkZXIgPSBpLm5leHQoKTsKLQkJCWlmIChwcm92aWRlci5nZXRLZXkoKSA9PSBhdHRyaWJ1dGVNYXBwaW5nS2V5KSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgYXR0cmlidXRlIG1hcHBpbmcga2V5OiAiICsgYXR0cmlidXRlTWFwcGluZ0tleSk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJGcm9tQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJZm9yIChJdGVyYXRvcjxKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBpID0gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycygpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIHByb3ZpZGVyID0gaS5uZXh0KCk7Ci0JCQlpZiAocHJvdmlkZXIuZ2V0QW5ub3RhdGlvbk5hbWUoKSA9PSBhbm5vdGF0aW9uTmFtZSkgewotCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGFubm90YXRpb24gbmFtZTogIiArIGFubm90YXRpb25OYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKCkgewotCQlpZiAodGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJdGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPigpOwotCQkJdGhpcy5hZGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnNUbyh0aGlzLmRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycyk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4odGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgbW9yZSBvciBkaWZmZXJlbnQgZGVmYXVsdCBhdHRyaWJ1dGUgbWFwcGluZyBwcm92aWRlcnMuCi0JICogVGhlIGRlZmF1bHQgaW5jbHVkZXMgdGhlIEpQQSBzcGVjLWRlZmluZWQgYXR0cmlidXRlIG1hcHBpbmdzIG9mIAotCSAqIEVtYmVkZGVkIGFuZCBCYXNpYy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnNUbyhMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJcHJvdmlkZXJzLmFkZChKYXZhRW1iZWRkZWRNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7IC8vYnVnIDE5MDM0NCBuZWVkIHRvIHRlc3QgZGVmYXVsdCBlbWJlZGRlZCBiZWZvcmUgYmFzaWMKLQkJcHJvdmlkZXJzLmFkZChKYXZhQmFzaWNNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlmb3IgKEl0ZXJhdG9yPERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBpID0gdGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgcHJvdmlkZXIgPSBpLm5leHQoKTsKLQkJCWlmIChwcm92aWRlci5kZWZhdWx0QXBwbGllcyhwZXJzaXN0ZW50QXR0cmlidXRlKSkgewotCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0tleShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBkZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcihwZXJzaXN0ZW50QXR0cmlidXRlKS5nZXRLZXkoKTsKLQl9Ci0JCi0JLyoqCi0JICogdGhlICJudWxsIiBhdHRyaWJ1dGUgbWFwcGluZyBpcyB1c2VkIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBuZWl0aGVyCi0JICogbW9kaWZpZWQgd2l0aCBhIG1hcHBpbmcgYW5ub3RhdGlvbiBub3IgbWFwcGVkIGJ5IGEgImRlZmF1bHQiIG1hcHBpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBudWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlyZXR1cm4gSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqKioqKioqIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgYWRkVG9NZXNzYWdlcyhKcGFQcm9qZWN0IHByb2plY3QsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCXByb2plY3QuYWRkVG9NZXNzYWdlcyhtZXNzYWdlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtUmVnaXN0cnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MjEzZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqIFNpbmdsZXRvbiByZWdpc3RyeSBmb3Igc3RvcmluZyBhbGwgdGhlIHJlZ2lzdGVyZWQgSlBBIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24KLSAqIGVsZW1lbnRzIGFuZCBpbnN0YW50aWF0aW5nIEpQQSBwbGF0Zm9ybXMgZnJvbSB0aGVtLgotICovCi1wdWJsaWMgY2xhc3MgSnBhUGxhdGZvcm1SZWdpc3RyeSB7Ci0KLQlwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGpwYVBsYXRmb3JtQ29uZmlndXJhdGlvbkVsZW1lbnRzOwotCi0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybVJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IEpwYVBsYXRmb3JtUmVnaXN0cnkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1SZWdpc3RyeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fSUQgPSAianBhUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1BMQVRGT1JNID0gImpwYVBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVF9MQUJFTCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVF9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCSAqLwotCXByaXZhdGUgSnBhUGxhdGZvcm1SZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qcGFQbGF0Zm9ybUNvbmZpZ3VyYXRpb25FbGVtZW50cyA9IHRoaXMuYnVpbGRKcGFQbGF0Zm9ybUNvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCX0KLQkKLQkKLQlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGJ1aWxkSnBhUGxhdGZvcm1Db25maWd1cmF0aW9uRWxlbWVudHMoKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGNvbmZpZ0VsZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7Ci0JCWZvciAoSXRlcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBzdHJlYW0gPSB0aGlzLmNvbmZpZ0VsZW1lbnRzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5hZGRDb25maWdFbGVtZW50VG8oc3RyZWFtLm5leHQoKSwgY29uZmlnRWxlbWVudHMpOwotCQl9Ci0JCXJldHVybiBjb25maWdFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgZnJvbSB0aGUgRWNsaXBzZSBwbGF0Zm9ybSBleHRlbnNpb24KLQkgKiByZWdpc3RyeS4KLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yPElDb25maWd1cmF0aW9uRWxlbWVudD4gY29uZmlnRWxlbWVudHMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxJRXh0ZW5zaW9uLCBJdGVyYXRvcjxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+Pih0aGlzLmV4dGVuc2lvbnMoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPElDb25maWd1cmF0aW9uRWxlbWVudD4gdHJhbnNmb3JtKElFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCQkJCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJRXh0ZW5zaW9uPiBleHRlbnNpb25zKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKHRoaXMuZXh0ZW5zaW9uUG9pbnQoKS5nZXRFeHRlbnNpb25zKCkpOwotCX0KLQotCXByaXZhdGUgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50KCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX0lEKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ29uZmlnRWxlbWVudFRvKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50LCBIYXNoTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb25FbGVtZW50PiBjb25maWdFbGVtZW50cykgewotCQlpZiAoICEgY29uZmlnRWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMX1BMQVRGT1JNKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICggISB0aGlzLmNvbmZpZ0VsZW1lbnRJc1ZhbGlkKGNvbmZpZ0VsZW1lbnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVF9JRCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBwcmV2ID0gY29uZmlnRWxlbWVudHMuZ2V0KGlkKTsKLQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJY29uZmlnRWxlbWVudHMucHV0KGlkLCBjb25maWdFbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubG9nRHVwbGljYXRlUGxhdGZvcm0ocHJldiwgY29uZmlnRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGVjayAqYWxsKiBhdHRyaWJ1dGVzIGJlZm9yZSByZXR1cm5pbmcKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29uZmlnRWxlbWVudElzVmFsaWQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0JCWlmIChjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVF9JRCkgPT0gbnVsbCkgewotCQkJdGhpcy5sb2dNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUX0lEKTsKLQkJCXZhbGlkID0gZmFsc2U7Ci0JCX0KLQkJaWYgKGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0xBQkVMKSA9PSBudWxsKSB7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUX0xBQkVMKTsKLQkJCXZhbGlkID0gZmFsc2U7Ci0JCX0KLQkJaWYgKGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0NMQVNTKSA9PSBudWxsKSB7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUX0NMQVNTKTsKLQkJCXZhbGlkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElEcyBmb3IgdGhlIHJlZ2lzdGVyZWQgSlBBIHBsYXRmb3Jtcy4KLQkgKiBUaGlzIGRvZXMgbm90IGFjdGl2YXRlIGFueSBvZiB0aGUgSlBBIHBsYXRmb3JtcycgcGx1Zy1pbnMuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4ganBhUGxhdGZvcm1JZHMoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxTdHJpbmc+KHRoaXMuanBhUGxhdGZvcm1Db25maWd1cmF0aW9uRWxlbWVudHMua2V5U2V0KCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGxhdGZvcm0gaWQgaXMgcmVnaXN0ZXJlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUGxhdGZvcm0oU3RyaW5nIHBsYXRmb3JtSWQpIHsKLQkJcmV0dXJuIHRoaXMuanBhUGxhdGZvcm1Db25maWd1cmF0aW9uRWxlbWVudHMuY29udGFpbnNLZXkocGxhdGZvcm1JZCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbGFiZWwgZm9yIHRoZSBKUEEgcGxhdGZvcm0gd2l0aCB0aGUgc3BlY2lmaWVkIElELgotCSAqIFRoaXMgZG9lcyBub3QgYWN0aXZhdGUgdGhlIEpQQSBwbGF0Zm9ybSdzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKcGFQbGF0Zm9ybUxhYmVsKFN0cmluZyBpZCkgewotCQlyZXR1cm4gdGhpcy5qcGFQbGF0Zm9ybUNvbmZpZ3VyYXRpb25FbGVtZW50cy5nZXQoaWQpLmdldEF0dHJpYnV0ZShBVF9MQUJFTCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSUQgZm9yIGEgSlBBIHBsYXRmb3JtIHJlZ2lzdGVyZWQgYXMgYSBkZWZhdWx0IHBsYXRmb3JtLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBhcmUgbm8gc3VjaCByZWdpc3RlcmVkIHBsYXRmb3Jtcy4KLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBwbGF0Zm9ybSBJRCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3VjaCByZWdpc3RlcmVkIHBsYXRmb3Jtcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRKcGFQbGF0Zm9ybUlkKCkgewotCQlmb3IgKFN0cmluZyBwbGF0Zm9ybUlkIDoganBhUGxhdGZvcm1Db25maWd1cmF0aW9uRWxlbWVudHMua2V5U2V0KCkpIHsKLQkJCWlmICgidHJ1ZSIuZXF1YWxzKGpwYVBsYXRmb3JtQ29uZmlndXJhdGlvbkVsZW1lbnRzLmdldChwbGF0Zm9ybUlkKS5nZXRBdHRyaWJ1dGUoQVRfREVGQVVMVCkpKSB7Ci0JCQkJcmV0dXJuIHBsYXRmb3JtSWQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBKUEEgcGxhdGZvcm0gZm9yIHRoZSBzcGVjaWZpZWQgSUQuCi0JICogTkI6IFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gaW5zdGFudGlhdGluZyBhIEpQQSBwbGF0Zm9ybQotCSAqIHdoZW4gYnVpbGRpbmcgYSBuZXcgSlBBIHByb2plY3QuCi0JICogVW5saWtlIG90aGVyIHJlZ2lzdHJ5IG1ldGhvZHMsIGludm9raW5nIHRoaXMgbWV0aG9kIG1heSBhY3RpdmF0ZSAKLQkgKiB0aGUgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgSnBhUGxhdGZvcm0gZ2V0SnBhUGxhdGZvcm0oU3RyaW5nIGlkKSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gdGhpcy5qcGFQbGF0Zm9ybUNvbmZpZ3VyYXRpb25FbGVtZW50cy5nZXQoaWQpOwotCQlpZiAoY29uZmlnRWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGlkKTsKLQkJfQotCQlKcGFQbGF0Zm9ybSBwbGF0Zm9ybTsKLQkJdHJ5IHsKLQkJCXBsYXRmb3JtID0gKEpwYVBsYXRmb3JtKSBjb25maWdFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRfQ0xBU1MpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aGlzLmxvZ0ZhaWxlZEluc3RhbnRpYXRpb24oY29uZmlnRWxlbWVudCwgZXgpOwotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihpZCk7Ci0JCX0KLQkJcGxhdGZvcm0uc2V0SWQoaWQpOwotCQlyZXR1cm4gcGxhdGZvcm07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVycm9ycyAqKioqKioqKioqCi0KLQkvLyBUT0RPIGV4dGVybmFsaXplIHN0cmluZ3MKLQlwcml2YXRlIHZvaWQgbG9nTWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSAKLQkJCSJBbiBleHRlbnNpb24gZWxlbWVudCBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXROYW1lKCkKLQkJCSsgIlwiIGluIHBsdWdpbiBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKQotCQkJKyAiXCIgaXMgbWlzc2luZyBhIHJlcXVpcmVkIGF0dHJpYnV0ZSBcIiIKLQkJCSsgYXR0cmlidXRlTmFtZQotCQkJKyAiXCIuIjsKLQkJSnB0Q29yZVBsdWdpbi5sb2cobWVzc2FnZSk7Ci0JfQotCi0JLy8gVE9ETyBleHRlcm5hbGl6ZSBzdHJpbmdzCi0JcHJpdmF0ZSB2b2lkIGxvZ0R1cGxpY2F0ZVBsYXRmb3JtKElDb25maWd1cmF0aW9uRWxlbWVudCBwcmV2Q29uZmlnRWxlbWVudCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IG5ld0NvbmZpZ0VsZW1lbnQpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPQotCQkJIlRoZSBwbHVnaW5zIFwiIgotCQkJKyBwcmV2Q29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKQotCQkJKyAiXCIgYW5kIFwiIgotCQkJKyBuZXdDb25maWdFbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpCi0JCQkrICJcIiBoYXZlIHJlZ2lzdGVyZWQgYSBkdXBsaWNhdGUgYXR0cmlidXRlIFwiaWRcIiAiCi0JCQkrICJmb3IgdGhlIGV4dGVuc2lvbiBlbGVtZW50IFwianBhUGxhdGZvcm1cIi4iOwotCQlKcHRDb3JlUGx1Z2luLmxvZyhtZXNzYWdlKTsKLQl9Ci0KLQkvLyBUT0RPIGV4dGVybmFsaXplIHN0cmluZ3MKLQlwcml2YXRlIHZvaWQgbG9nRmFpbGVkSW5zdGFudGlhdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgQ29yZUV4Y2VwdGlvbiBleCkgewotCQlTdHJpbmcgbWVzc2FnZSA9Ci0JCQkiQ291bGQgbm90IGluc3RhbnRpYXRlIHRoZSBjbGFzcyBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfQ0xBU1MpCi0JCQkrICJcIiBmb3IgdGhlIGV4dGVuc2lvbiBlbGVtZW50IFwiIgotCQkJKyBjb25maWdFbGVtZW50LmdldE5hbWUoKQotCQkJKyAiXCIgaW4gdGhlIHBsdWdpbiBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKQotCQkJKyAiXCIuIjsKLQkJSnB0Q29yZVBsdWdpbi5sb2cobWVzc2FnZSk7Ci0JCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wcmVmcy9KcGFQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcHJlZnMvSnBhUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTBmZGY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wcmVmcy9KcGFQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnByZWZzOwotCi0vKioKLSAqIENvbnN0YW50IGRlZmluaXRpb25zIGZvciBwbHVnLWluIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFQcmVmZXJlbmNlQ29uc3RhbnRzIAotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfREVGQVVMVF9KUEFfTElCID0gImRlZmF1bHRKcGFMaWIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfREVGQVVMVF9KUEFfUExBVEZPUk0gPSAiZGVmYXVsdEpwYVBsYXRmb3JtIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wcmVmcy9KcGFQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wcmVmcy9KcGFQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQppbmRleCBkZGU0Yjg5Li5mZGEwMWIzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcHJlZnMvSnBhUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3ByZWZzL0pwYVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDI3ICsxMCwxNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wcmVmczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CiAKIC8qKgogICogQ2xhc3MgdXNlZCB0byBpbml0aWFsaXplIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCisgKiBTZWUgPGNvZGU+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCiAgKi8KLXB1YmxpYyBjbGFzcyBKcGFQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciAKK3B1YmxpYyBjbGFzcyBKcGFQcmVmZXJlbmNlSW5pdGlhbGl6ZXIKKwlleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIAogewogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKEpwdENvcmVQbHVnaW4uaW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQotCQkvLyBkZWZhdWx0IEpQQSBwbGF0Zm9ybQotCQlTdHJpbmcgZGVmYXVsdFBsYXRmb3JtSWQgPSBKcGFQbGF0Zm9ybVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0RGVmYXVsdEpwYVBsYXRmb3JtSWQoKTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZGVmYXVsdFBsYXRmb3JtSWQpKSB7Ci0JCQlkZWZhdWx0UGxhdGZvcm1JZCA9IEdlbmVyaWNKcGFQbGF0Zm9ybS5JRDsKLQkJfQotCQlub2RlLnB1dChKcGFQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9KUEFfUExBVEZPUk0sIGRlZmF1bHRQbGF0Zm9ybUlkKTsKKwkJSnB0Q29yZVBsdWdpbi5pbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL0luZGV0ZXJtaW5hdGVDb250ZW50RGVzY3JpYmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvSW5kZXRlcm1pbmF0ZUNvbnRlbnREZXNjcmliZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTg0ODUyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL0luZGV0ZXJtaW5hdGVDb250ZW50RGVzY3JpYmVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOworCisvKioKKyAqIFRoaXMgY2xhc3Mgc2ltcGx5IHJldHVybnMgSU5ERVRFUk1JTkFURSBmb3IgYW55IGNvbnRlbnRzIGl0IHJlY2VpdmVzLgorICogCisgKiBJdCBpcyB1c2VkIGN1cnJlbnRseSBmb3Igb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGVudC5iYXNlSnBhQ29udGVudCBpbiBvcmRlcgorICogdG8gbWFrZSB0aGF0IGNvbnRlbnQgdHlwZSBhY3QgYXMgYW4gImFic3RyYWN0IiBjb250ZW50IHR5cGUuCisgKi8KK3B1YmxpYyBjbGFzcyBJbmRldGVybWluYXRlQ29udGVudERlc2NyaWJlciBpbXBsZW1lbnRzIElUZXh0Q29udGVudERlc2NyaWJlcgoreworCXB1YmxpYyBpbnQgZGVzY3JpYmUoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKKwkJcmV0dXJuIElOREVURVJNSU5BVEU7CisJfQorCQorCXB1YmxpYyBpbnQgZGVzY3JpYmUoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisJCXJldHVybiBJTkRFVEVSTUlOQVRFOworCX0KKwkKKwlwdWJsaWMgUXVhbGlmaWVkTmFtZVtdIGdldFN1cHBvcnRlZE9wdGlvbnMoKSB7CisJCXJldHVybiBuZXcgUXVhbGlmaWVkTmFtZVswXTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvY29tbW9uL3RyYW5zbGF0b3JzL0Jvb2xlYW5UcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvY29tbW9uL3RyYW5zbGF0b3JzL0Jvb2xlYW5UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkY2MxNmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2NvbW1vbi90cmFuc2xhdG9ycy9Cb29sZWFuVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5jb21tb24udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBCb29sZWFuVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLXsKLQlwdWJsaWMgQm9vbGVhblRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBCT09MRUFOX0ZFQVRVUkUgfCBCT09MRUFOX0xPV0VSQ0FTRSk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgQk9PTEVBTl9GRUFUVVJFIHwgQk9PTEVBTl9MT1dFUkNBU0UgfCBzdHlsZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2Yoc3RyVmFsdWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlyZXR1cm4gKChCb29sZWFuKSB2YWx1ZSkudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0SmF2YVJlc291cmNlTm9kZS5qYXZhCmluZGV4IGYwZmI5ZTQuLmYwNDdmNGQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0SmF2YVJlc291cmNlTm9kZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0SmF2YVJlc291cmNlTm9kZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMjcgKzksMjQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KcGFDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DYWxsYmFja0NoYW5nZVN1cHBvcnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKIAogLyoqCi0gKiByZXNvdXJjZSBjb250YWlubWVudCBoaWVyYXJjaHkKKyAqIEphdmEgcmVzb3VyY2UgY29udGFpbm1lbnQgaGllcmFyY2h5CiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUKIAlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZU5vZGUsIENhbGxiYWNrQ2hhbmdlU3VwcG9ydC5Tb3VyY2UKKwlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZU5vZGUKIHsKLQlwcml2YXRlIGZpbmFsIEphdmFSZXNvdXJjZU5vZGUgcGFyZW50OworCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVzb3VyY2VOb2RlIHBhcmVudDsKIAogCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgorCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgogCQogCXByb3RlY3RlZCBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKIAkJc3VwZXIoKTsKQEAgLTM3LDE0ICszNCwxNyBAQAogCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKIAl9CiAKKworCS8vICoqKioqKioqKiogcGFyZW50ICoqKioqKioqKioKKwogCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyZW50KEphdmFSZXNvdXJjZU5vZGUgcCkgewogCQlpZiAocCA9PSBudWxsKSB7CiAJCQlpZiAodGhpcy5yZXF1aXJlc1BhcmVudCgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJ3BhcmVudCcgY2Fubm90IGJlIG51bGwiKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIncGFyZW50JyBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAodGhpcy5mb3JiaWRzUGFyZW50KCkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIncGFyZW50JyBtdXN0IGJlIG51bGwiKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIncGFyZW50JyBtdXN0IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9CiAJfQpAQCAtNTcsNDYgKzU3LDUwIEBACiAJCXJldHVybiAhIHRoaXMucmVxdWlyZXNQYXJlbnQoKTsgIC8vIGFzc3VtZSAncGFyZW50JyBpcyBub3Qgb3B0aW9uYWwKIAl9CiAKKworCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgY2FsbGJhY2sgaG9vayAqKioqKioqKioqCisKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0KHRoaXMpOworCXByb3RlY3RlZCBmaW5hbCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKKwkJcmV0dXJuIG5ldyBDYWxsYmFja0NoYW5nZVN1cHBvcnQodGhpcywgdGhpcy5idWlsZENoYW5nZVN1cHBvcnRMaXN0ZW5lcigpKTsKKwl9CisKKwlwcml2YXRlIENhbGxiYWNrQ2hhbmdlU3VwcG9ydC5MaXN0ZW5lciBidWlsZENoYW5nZVN1cHBvcnRMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBDYWxsYmFja0NoYW5nZVN1cHBvcnQuTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhc3BlY3RDaGFuZ2VkKFN0cmluZyBhc3BlY3ROYW1lKSB7CisJCQkJQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlLnRoaXMuYXNwZWN0Q2hhbmdlZChhc3BlY3ROYW1lKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBpZ25vcmUgdGhlIGFzcGVjdCBuYW1lLCB3ZSBub3RpZnkgbGlzdGVuZXJzIG9mICpldmVyeSogY2hhbmdlCisJICovCisJcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nIGFzcGVjdE5hbWUpIHsKKwkJdGhpcy5nZXRSb290KCkucmVzb3VyY2VNb2RlbENoYW5nZWQoKTsKIAl9CiAKIAogCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIEpwYUNvbXBpbGF0aW9uVW5pdCBnZXRKcGFDb21waWxhdGlvblVuaXQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudC5nZXRKcGFDb21waWxhdGlvblVuaXQoKTsKLQl9Ci0JCi0JcHVibGljIEphdmFSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUNvbXBpbGF0aW9uVW5pdCgpLmdldFJlc291cmNlTW9kZWwoKTsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQ29tcGlsYXRpb25Vbml0I2dldFJvb3QoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5UGFja2FnZUZyYWdtZW50Um9vdCNnZXRSb290KCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVBlcnNpc3RlbnRUeXBlQ2FjaGUjZ2V0Um9vdCgpCisJICovCisJcHVibGljIFJvb3QgZ2V0Um9vdCgpIHsKKwkJcmV0dXJuIHRoaXMucGFyZW50LmdldFJvb3QoKTsKIAl9CiAKLQotCS8vICoqKioqKioqKiogQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0LlNvdXJjZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQl0aGlzLmdldEpwYUNvbXBpbGF0aW9uVW5pdCgpLnJlc291cmNlQ2hhbmdlZCgpOworCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRSb290KCkuZ2V0RmlsZSgpOwogCX0KIAogCiAJLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9CiAKLQlwdWJsaWMgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGdldEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhQ29tcGlsYXRpb25Vbml0KCkuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCk7Ci0JfQotCQotCXB1YmxpYyBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBnZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFDb21waWxhdGlvblVuaXQoKS5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBnZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpICB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUNvbXBpbGF0aW9uVW5pdCgpLmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCk7CisJcHJvdGVjdGVkIEpwYUFubm90YXRpb25Qcm92aWRlciBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7CisJCXJldHVybiB0aGlzLmdldFJvb3QoKS5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKTsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0SmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3RKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZmU1MGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3RKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUTm9kZVRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db250YWluZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjxFIGV4dGVuZHMgTWVtYmVyPgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlCi0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyCi17CQotCXByaXZhdGUgZmluYWwgRSBtZW1iZXI7Ci0KLQkvKioKLQkgKiBzdG9yZXMgYWxsIGFubm90YXRpb25zKG5vbi1tYXBwaW5nKSBleGNlcHQgZHVwbGljYXRlcywgamF2YSBjb21waWxlciBoYXMgYW4gZXJyb3IgZm9yIGR1cGxpY2F0ZXMKLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnM7Ci0JCi0JLyoqCi0JICogc3RvcmVzIGFsbCBtYXBwaW5nIGFubm90YXRpb25zIGV4Y2VwdCBkdXBsaWNhdGVzLCBqYXZhIGNvbXBpbGVyIGhhcyBhbiBlcnJvciBmb3IgZHVwbGljYXRlcwotCSAqLwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxBbm5vdGF0aW9uPiBtYXBwaW5nQW5ub3RhdGlvbnM7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHBlcnNpc3RhYmxlOwotCi0JQWJzdHJhY3RKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBFIG1lbWJlcil7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubWVtYmVyID0gbWVtYmVyOwotCQl0aGlzLmFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uPigpOwotCQl0aGlzLm1hcHBpbmdBbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbj4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWdldE1lbWJlcigpLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5hY2NlcHQodGhpcy5idWlsZEluaXRpYWxBbm5vdGF0aW9uVmlzaXRvcihhc3RSb290KSk7Ci0JCXRoaXMucGVyc2lzdGFibGUgPSBidWlsZFBlcnNpc3RhYmxlKGFzdFJvb3QpOwkJCi0JfQotCi0JcHJvdGVjdGVkIEFTVFZpc2l0b3IgYnVpbGRJbml0aWFsQW5ub3RhdGlvblZpc2l0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbEFTVFZpc2l0b3IoYXN0Um9vdCwgdGhpcy5nZXRNZW1iZXIoKS5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgdmlzaXRDaGlsZEFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gbm9kZSkgewotCQkJCUFic3RyYWN0SmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci50aGlzLmFkZEluaXRpYWxBbm5vdGF0aW9uKG5vZGUsIHRoaXMuYXN0Um9vdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEluaXRpYWxBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIG5vZGUsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZyBxdWFsaWZpZWRBbm5vdGF0aW9uTmFtZSA9IEpEVFRvb2xzLnJlc29sdmVBbm5vdGF0aW9uKG5vZGUpOwotCQlpZiAocXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChpc1Bvc3NpYmxlQW5ub3RhdGlvbihxdWFsaWZpZWRBbm5vdGF0aW9uTmFtZSkpIHsKLQkJCWlmIChnZXRBbm5vdGF0aW9uKHF1YWxpZmllZEFubm90YXRpb25OYW1lKSA9PSBudWxsKSB7IC8vZG9uJ3Qgd2FudCBkdXBsaWNhdGVzCi0JCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYnVpbGRBbm5vdGF0aW9uKHF1YWxpZmllZEFubm90YXRpb25OYW1lKTsKLQkJCQlhbm5vdGF0aW9uLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCQkJdGhpcy5hbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoaXNQb3NzaWJsZU1hcHBpbmdBbm5vdGF0aW9uKHF1YWxpZmllZEFubm90YXRpb25OYW1lKSkgewotCQkJaWYgKGdldE1hcHBpbmdBbm5vdGF0aW9uKHF1YWxpZmllZEFubm90YXRpb25OYW1lKSA9PSBudWxsKSB7IC8vZG9uJ3Qgd2FudCBkdXBsaWNhdGVzCi0JCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYnVpbGRNYXBwaW5nQW5ub3RhdGlvbihxdWFsaWZpZWRBbm5vdGF0aW9uTmFtZSk7Ci0JCQkJYW5ub3RhdGlvbi5pbml0aWFsaXplKGFzdFJvb3QpOwotCQkJCXRoaXMubWFwcGluZ0Fubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBFIGdldE1lbWJlcigpIHsKLQkJcmV0dXJuIHRoaXMubWVtYmVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQW5ub3RhdGlvbiBidWlsZE1hcHBpbmdBbm5vdGF0aW9uKFN0cmluZyBtYXBwaW5nQW5ub3RhdGlvbk5hbWUpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBBbm5vdGF0aW9uIGJ1aWxkTnVsbE1hcHBpbmdBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdEl0ZXJhdG9yPFN0cmluZz4gcG9zc2libGVNYXBwaW5nQW5ub3RhdGlvbk5hbWVzKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc1Bvc3NpYmxlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzUG9zc2libGVNYXBwaW5nQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkUGVyc2lzdGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWVtYmVyKCkuaXNQZXJzaXN0YWJsZShhc3RSb290KTsKLQl9Ci0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8QW5ub3RhdGlvbj4gaSA9IGFubm90YXRpb25zKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGkubmV4dCgpOwotCQkJaWYgKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJcmV0dXJuIGFubm90YXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VOb2RlIGdldE5vbk51bGxBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKTsKLQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGJ1aWxkTnVsbEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOwkKLQkJfQotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8QW5ub3RhdGlvbj4gaSA9IG1hcHBpbmdBbm5vdGF0aW9ucygpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlBbm5vdGF0aW9uIG1hcHBpbmdBbm5vdGF0aW9uID0gaS5uZXh0KCk7Ci0JCQlpZiAobWFwcGluZ0Fubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJcmV0dXJuIG1hcHBpbmdBbm5vdGF0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VOb2RlIGdldE51bGxNYXBwaW5nQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkTnVsbE1hcHBpbmdBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKTsJCi0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPEFubm90YXRpb24+KHRoaXMuYW5ub3RhdGlvbnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGFubm90YXRpb25zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBidWlsZEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCQl0aGlzLmFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbi5uZXdBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChBTk5PVEFUSU9OU19DT0xMRUNUSU9OLCBhbm5vdGF0aW9uKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPiBhZGRDb250YWluZXJBbm5vdGF0aW9uKFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gKENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPikgYWRkQW5ub3RhdGlvbihjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4gYWRkQ29udGFpbmVyQW5ub3RhdGlvblR3b05lc3RhYmxlQW5ub3RhdGlvbnMoU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPiBjb250YWluZXJBbm5vdGF0aW9uID0gYnVpbGRDb250YWluZXJBbm5vdGF0aW9uKGNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKLQkJdGhpcy5hbm5vdGF0aW9ucy5hZGQoY29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCWNvbnRhaW5lckFubm90YXRpb24ubmV3QW5ub3RhdGlvbigpOwotCQljb250YWluZXJBbm5vdGF0aW9uLmFkZEludGVybmFsKDApLm5ld0Fubm90YXRpb24oKTsKLQkJY29udGFpbmVyQW5ub3RhdGlvbi5hZGRJbnRlcm5hbCgxKS5uZXdBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiBjb250YWluZXJBbm5vdGF0aW9uOwotCX0KLQkJCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPiAgYnVpbGRDb250YWluZXJBbm5vdGF0aW9uKFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gKENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPikgYnVpbGRBbm5vdGF0aW9uKGNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPiBnZXRDb250YWluZXJBbm5vdGF0aW9uKFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gKENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPikgZ2V0QW5ub3RhdGlvbihjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBOZXN0YWJsZUFubm90YXRpb24gZ2V0TmVzdGFibGVBbm5vdGF0aW9uKFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiAoTmVzdGFibGVBbm5vdGF0aW9uKSBnZXRBbm5vdGF0aW9uKG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTmVzdGFibGVBbm5vdGF0aW9uIGFkZE5lc3RhYmxlQW5ub3RhdGlvbihTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gKE5lc3RhYmxlQW5ub3RhdGlvbikgYWRkQW5ub3RhdGlvbihuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQl9Ci0JCi0JLy9UT0RPIGl0IHNlZW1zIHdlIHNob3VsZCBiZSBmaXJpbmcgb25lIGNoYW5nZSBub3RpZmljYXRpb24gaGVyZSwgdGhhdCBhIG5ldyBuZXN0YWJsZSBhbm5vdGF0aW9uIHdhcyBhZGRlZC4KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKSB7Ci0JCU5lc3RhYmxlQW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uID0gKE5lc3RhYmxlQW5ub3RhdGlvbikgZ2V0QW5ub3RhdGlvbihuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJCi0JCUNvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPiBjb250YWluZXJBbm5vdGF0aW9uID0gZ2V0Q29udGFpbmVyQW5ub3RhdGlvbihjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0JCQotCQlpZiAoY29udGFpbmVyQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkvL2lnbm9yZSBhbnkgbmVzdGFibGVBbm5vdGF0aW9uIGFuZCBqdXN0IGFkZCB0byB0aGUgcGx1cmFsIG9uZQotCQkJTmVzdGFibGVBbm5vdGF0aW9uIG5ld05lc3RlZEFubm90YXRpb24gPSBDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuYWRkTmVzdGVkQW5ub3RhdGlvbihpbmRleCwgY29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCQkvL1RPRE8gYW55IGV2ZW50IG5vdGlmaWNhdGlvbiBiZWluZyBmaXJlZCBmb3IgdGhlIGFkZD8/PwotCQkJcmV0dXJuIG5ld05lc3RlZEFubm90YXRpb247Ci0JCX0KLQkJaWYgKG5lc3RlZEFubm90YXRpb24gPT0gbnVsbCkgewotCQkJLy9hZGQgdGhlIG5lc3RhYmxlIHNpbmNlIG5laXRoZXIgbmVzdGFibGUgb3IgY29udGFpbmVyIGV4aXN0cwotCQkJcmV0dXJuIGFkZE5lc3RhYmxlQW5ub3RhdGlvbihuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJfQotCQkvL21vdmUgdGhlIG5lc3RhYmxlIHRvIGEgbmV3IGNvbnRhaW5lciBhbm5vdGF0aW9uIGFuZCBhZGQgdG8gaXQKLQkJQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZUFubm90YXRpb24+IG5ld0NvbnRhaW5lckFubm90YXRpb24gPSBhZGRDb250YWluZXJBbm5vdGF0aW9uVHdvTmVzdGFibGVBbm5vdGF0aW9ucyhjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQluZXdDb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25BdCgxKS5pbml0aWFsaXplRnJvbShuZXN0ZWRBbm5vdGF0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCW5ld0NvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbkF0KDApLmluaXRpYWxpemVGcm9tKG5lc3RlZEFubm90YXRpb24pOwkJCi0JCX0KLQkJcmVtb3ZlQW5ub3RhdGlvbihuZXN0ZWRBbm5vdGF0aW9uKTsKLQkJcmV0dXJuIG5ld0NvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbkF0KGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKSB7Ci0JCW1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBnZXRDb250YWluZXJBbm5vdGF0aW9uKGNvbnRhaW5lckFubm90YXRpb25OYW1lKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPiBjb250YWluZXJBbm5vdGF0aW9uKSB7Ci0JCWNvbnRhaW5lckFubm90YXRpb24ubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuc3luY2hBbm5vdGF0aW9uc0FmdGVyTW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGNvbnRhaW5lckFubm90YXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlhZGRJdGVtVG9Db2xsZWN0aW9uKGFubm90YXRpb24sIHRoaXMuYW5ub3RhdGlvbnMsIEFOTk9UQVRJT05TX0NPTExFQ1RJT04pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZW1vdmVBbm5vdGF0aW9uXyhhbm5vdGF0aW9uKTsKLQkJLy9UT0RPIGxvb2tzIG9kZCB0aGF0IHdlIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiBoZXJlLCBidXQgaW4gYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uKSB3ZSBkb24ndCBkbyB0aGUgc2FtZQotCQlhbm5vdGF0aW9uLnJlbW92ZUFubm90YXRpb24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbl8oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihhbm5vdGF0aW9uLCB0aGlzLmFubm90YXRpb25zLCBBTk5PVEFUSU9OU19DT0xMRUNUSU9OKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGluZ0Fubm90YXRpb24oU3RyaW5nIG1hcHBpbmdBbm5vdGF0aW9uTmFtZSkgewotCQlpZiAoZ2V0TWFwcGluZ0Fubm90YXRpb24obWFwcGluZ0Fubm90YXRpb25OYW1lKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQW5ub3RhdGlvbiBtYXBwaW5nQW5ub3RhdGlvbiA9IGJ1aWxkTWFwcGluZ0Fubm90YXRpb24obWFwcGluZ0Fubm90YXRpb25OYW1lKTsKLQkJYWRkTWFwcGluZ0Fubm90YXRpb24obWFwcGluZ0Fubm90YXRpb24pOwotCQkvL1RPRE8gc2hvdWxkIHRoaXMgYmUgZG9uZSBoZXJlIG9yIHNob3VsZCBjcmVhdGluZyB0aGUgQW5ub3RhdGlvbiBkbyB0aGlzPz8KLQkJbWFwcGluZ0Fubm90YXRpb24ubmV3QW5ub3RhdGlvbigpOwotCX0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYXBwaW5nQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJYWRkSXRlbVRvQ29sbGVjdGlvbihhbm5vdGF0aW9uLCB0aGlzLm1hcHBpbmdBbm5vdGF0aW9ucywgTUFQUElOR19BTk5PVEFUSU9OU19DT0xMRUNUSU9OKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTWFwcGluZ0Fubm90YXRpb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJlbW92ZU1hcHBpbmdBbm5vdGF0aW9uXyhhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1hcHBpbmdBbm5vdGF0aW9uXyhBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJcmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKGFubm90YXRpb24sIHRoaXMubWFwcGluZ0Fubm90YXRpb25zLCBNQVBQSU5HX0FOTk9UQVRJT05TX0NPTExFQ1RJT04pOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8QW5ub3RhdGlvbj4gbWFwcGluZ0Fubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8QW5ub3RhdGlvbj4odGhpcy5tYXBwaW5nQW5ub3RhdGlvbnMpOwotCX0KLQotCXB1YmxpYyBpbnQgbWFwcGluZ0Fubm90YXRpb25zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZ0Fubm90YXRpb25zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCXJlbW92ZUFubm90YXRpb24oYW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihpbnQgaW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lLCBTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpIHsKLQkJQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZUFubm90YXRpb24+IGNvbnRhaW5lckFubm90YXRpb24gPSBnZXRDb250YWluZXJBbm5vdGF0aW9uKGNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKLQkJaWYgKGNvbnRhaW5lckFubm90YXRpb24gPT0gbnVsbCkgewotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJCXJlbW92ZUFubm90YXRpb24oYW5ub3RhdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBjb250YWluZXJBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbm5vdGF0aW9uKGludCBpbmRleCwgQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZUFubm90YXRpb24+IGNvbnRhaW5lckFubm90YXRpb24pIHsKLQkJTmVzdGFibGVBbm5vdGF0aW9uIG5lc3RhYmxlQW5ub3RhdGlvbiA9IGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbkF0KGluZGV4KTsKLQkJY29udGFpbmVyQW5ub3RhdGlvbi5yZW1vdmUoaW5kZXgpOwotCQkvL1RPRE8gbW92ZSB0aGVzZSAyIGxpbmVzIHRvIHRoZSBDb250YWluZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uLCBpIHRoaW5rCi0JCW5lc3RhYmxlQW5ub3RhdGlvbi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW5kZXgsIGNvbnRhaW5lckFubm90YXRpb24pOwotCQkKLQkJaWYgKGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgPT0gMCkgewotCQkJcmVtb3ZlQW5ub3RhdGlvbihjb250YWluZXJBbm5vdGF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChjb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25zU2l6ZSgpID09IDEpIHsKLQkJCU5lc3RhYmxlQW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uID0gY29udGFpbmVyQW5ub3RhdGlvbi5uZXN0ZWRBbm5vdGF0aW9uQXQoMCk7Ci0JCQkKLQkJCXRoaXMuYW5ub3RhdGlvbnMucmVtb3ZlKGNvbnRhaW5lckFubm90YXRpb24pOwotCQkJY29udGFpbmVyQW5ub3RhdGlvbi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0KLQotCQkJTmVzdGFibGVBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSAoTmVzdGFibGVBbm5vdGF0aW9uKSBidWlsZEFubm90YXRpb24oY29udGFpbmVyQW5ub3RhdGlvbi5nZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkpOwotCQkJdGhpcy5hbm5vdGF0aW9ucy5hZGQobmV3QW5ub3RhdGlvbik7Ci0JCQluZXdBbm5vdGF0aW9uLm5ld0Fubm90YXRpb24oKTsKLQotCQkJbmV3QW5ub3RhdGlvbi5pbml0aWFsaXplRnJvbShuZXN0ZWRBbm5vdGF0aW9uKTsKLQkJCQotCQkJdGhpcy5maXJlSXRlbUFkZGVkKEFOTk9UQVRJT05TX0NPTExFQ1RJT04sIG5ld0Fubm90YXRpb24pOwotCQkJZmlyZUl0ZW1SZW1vdmVkKEFOTk9UQVRJT05TX0NPTExFQ1RJT04sIGNvbnRhaW5lckFubm90YXRpb24pOwotCQl9Ci0JfQotCS8vIHJlbW92ZXMgYWxsIG90aGVyICptYXBwaW5nKiBhbm5vdGF0aW9ucyB0aGF0IGV4aXN0LCBub3QganVzdCB0aGUgb25lIHJldHVybmVkIGJ5IG1hcHBpbmdBbm5vdGF0aW9uKCkKLQkvLyBtYXBwaW5nQW5ub3RhdGlvbigpIHJldHVybnMgdGhlIGZpcnN0IG1hcHBpbmcgYW5ub3RhdGlvbiBmb3VuZCBpbiB0aGUgc291cmNlLiAgaWYgdGhlcmUgYXJlIG11bHRpcGxlCi0JLy8gbWFwcGluZyBhbm5vdGF0aW9ucyAod2hpY2ggaXMgYSB2YWxpZGF0aW9uIGVycm9yIGNvbmRpdGlvbikgdGhlbiBjYWxsaW5nIHRoaXMgYXBpIHdvdWxkIG5vdCB3b3JrCi0JLy8gYmVjYXVzZSB0aGUgbmV3IG1hcHBpbmcgYW5ub3RhdGlvIHdvdWxkIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgYW5ub3RhdGlvbnMuCi0JcHVibGljIHZvaWQgc2V0TWFwcGluZ0Fubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWlmIChnZXRNYXBwaW5nQW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSkgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIG1hcHBpbmcgYW5ub3RhdGlvbiBuYW1lZCAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIGFscmVhZHkgZXhpc3RzLiIpOwotCQl9Ci0JCUFubm90YXRpb24gb2xkTWFwcGluZyA9IGdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCUFubm90YXRpb24gbmV3TWFwcGluZyA9IG51bGw7Ci0JCWlmIChvbGRNYXBwaW5nICE9IG51bGwpIHsKLQkJCXJlbW92ZVVubmVjZXNzYXJ5QW5ub3RhdGlvbnMoYW5ub3RhdGlvbk5hbWUpOwotCQl9Ci0JCWlmIChhbm5vdGF0aW9uTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0TWFwcGluZ0Fubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpICE9IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQluZXdNYXBwaW5nID0gYnVpbGRNYXBwaW5nQW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JCQl0aGlzLm1hcHBpbmdBbm5vdGF0aW9ucy5hZGQobmV3TWFwcGluZyk7Ci0JCQluZXdNYXBwaW5nLm5ld0Fubm90YXRpb24oKTsKLQkJfQotCQkvL2hhdmUgdG8gaG9sZCBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHVudGlsIHRoZSBlbmQgc28gYSBwcm9qZWN0IHVwZGF0ZSBkb2VzIG5vdCBvY2N1cgotCQkvL2JlZm9yZSB3ZSBhcmUgZmluaXNoZWQgcmVtb3ZpbmcgdGhlIG9sZCBtYXBwaW5nIGFuZCBhZGRpbmcgdGhlIG5ldyBtYXBwaW5nCi0JCS8vanVzdCBmaXJpbmcgY29sbGVjdGlvIGNoYW5nZWQgc2luY2Ugb25lIG9yIG1vcmUgcmVtb3ZlcyBhbmQgb25lIGFkZCB3YXMgY29tcGxldGVkLgotCQkvL2lmIHdlIGV2ZXIgbGlzdGVuIGZvciBzcGVjaWZpYyBldmVudHMgaW5zdGVhZCBvZiBqdXN0IGRvaW5nIGEgbWFzcyB1cGRhdGUsIHdlIG1pZ2h0IG5lZWQgdG8gbWFrZSB0aGlzIG1vcmUgc3BlY2lmaWMKLQkJZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKE1BUFBJTkdfQU5OT1RBVElPTlNfQ09MTEVDVElPTik7Ci0JfQotCS8qKgotCSAqIFJlbW92ZSBhbGwgbWFwcGluZyBhbm5vdGF0aW9ucyB0aGF0IGFscmVhZHkgZXhpc3QuCi0JICogTm8gY2hhbmdlIG5vdGlmaWNhdGlvbiBmaXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVVbm5lY2Vzc2FyeUFubm90YXRpb25zKFN0cmluZyBuZXdNYXBwaW5nQW5ub3RhdGlvbk5hbWUpIHsJCi0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaSA9IHBvc3NpYmxlTWFwcGluZ0Fubm90YXRpb25OYW1lcygpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lID0gaS5uZXh0KCk7Ci0JCQlpZiAobWFwcGluZ0Fubm90YXRpb25OYW1lICE9IG5ld01hcHBpbmdBbm5vdGF0aW9uTmFtZSkgewotCQkJCUFubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24gPSBnZXRNYXBwaW5nQW5ub3RhdGlvbihtYXBwaW5nQW5ub3RhdGlvbk5hbWUpOwotCQkJCWlmIChtYXBwaW5nQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXRoaXMubWFwcGluZ0Fubm90YXRpb25zLnJlbW92ZShtYXBwaW5nQW5ub3RhdGlvbik7Ci0JCQkJCW1hcHBpbmdBbm5vdGF0aW9uLnJlbW92ZUFubm90YXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLy9UT0RPIG5lZWQgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbiBvbiB0aGlzIG1hcHBpbmdBbm5vdGF0aW9uIGNoYW5naW5nCi0JLy9mcm9tIHRoZSBjb250ZXh0IG1vZGVsIHdlIGRvbid0IHJlYWxseSBjYXJlIGlmIHRoZWlyIGFyZSBtdWx0aXBsZSBtYXBwaW5nIGFubm90YXRpb25zLAotCS8vanVzdCB3aGljaCBvbmUgd2UgbmVlZCB0byB1c2UKLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRNYXBwaW5nQW5ub3RhdGlvbigpIHsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBpID0gcG9zc2libGVNYXBwaW5nQW5ub3RhdGlvbk5hbWVzKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBtYXBwaW5nQW5ub3RhdGlvbk5hbWUgPSBpLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3I8QW5ub3RhdGlvbj4gaiA9IG1hcHBpbmdBbm5vdGF0aW9ucygpOyBqLmhhc05leHQoKTsgKSB7Ci0JCQkJQW5ub3RhdGlvbiBtYXBwaW5nQW5ub3RhdGlvbiA9IGoubmV4dCgpOwotCQkJCWlmIChtYXBwaW5nQW5ub3RhdGlvbk5hbWUgPT0gbWFwcGluZ0Fubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkgewotCQkJCQlyZXR1cm4gbWFwcGluZ0Fubm90YXRpb247Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4gY29udGFpbmVyQW5ub3RhdGlvbiA9IGdldENvbnRhaW5lckFubm90YXRpb24oY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOwotCQlpZiAoY29udGFpbmVyQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGFpbmVyQW5ub3RhdGlvbi5uZXN0ZWRBbm5vdGF0aW9ucygpOwotCQl9Ci0JCU5lc3RhYmxlQW5ub3RhdGlvbiBuZXN0YWJsZUFubm90YXRpb24gPSBnZXROZXN0YWJsZUFubm90YXRpb24obmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCWlmIChuZXN0YWJsZUFubm90YXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4obmVzdGFibGVBbm5vdGF0aW9uKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy51cGRhdGVBbm5vdGF0aW9ucyhhc3RSb290KTsKLQkJdGhpcy5zZXRQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkUGVyc2lzdGFibGUoYXN0Um9vdCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlc29sdmVUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldFBlcnNpc3RhYmxlKHRoaXMuYnVpbGRQZXJzaXN0YWJsZShhc3RSb290KSk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQW5ub3RhdGlvbnMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJZ2V0TWVtYmVyKCkuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpLmFjY2VwdCh0aGlzLmJ1aWxkVXBkYXRlQW5ub3RhdGlvblZpc2l0b3IoYXN0Um9vdCkpOwotCQlyZW1vdmVNYXBwaW5nQW5ub3RhdGlvbnNOb3RJblNvdXJjZShhc3RSb290KTsKLQkJcmVtb3ZlQW5ub3RhdGlvbnNOb3RJblNvdXJjZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbnNOb3RJblNvdXJjZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbm5vdGF0aW9ucygpKSkgewotCQkJaWYgKGFubm90YXRpb24uZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KSA9PSBudWxsKSB7Ci0JCQkJcmVtb3ZlQW5ub3RhdGlvbl8oYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNYXBwaW5nQW5ub3RhdGlvbnNOb3RJblNvdXJjZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlmb3IgKEFubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUobWFwcGluZ0Fubm90YXRpb25zKCkpKSB7Ci0JCQlpZiAobWFwcGluZ0Fubm90YXRpb24uZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KSA9PSBudWxsKSB7Ci0JCQkJcmVtb3ZlTWFwcGluZ0Fubm90YXRpb25fKG1hcHBpbmdBbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQkKLQl9Ci0JCi0JcHJvdGVjdGVkIEFTVFZpc2l0b3IgYnVpbGRVcGRhdGVBbm5vdGF0aW9uVmlzaXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IExvY2FsQVNUVmlzaXRvcihhc3RSb290LCB0aGlzLmdldE1lbWJlcigpLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCB2aXNpdENoaWxkQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBub2RlKSB7Ci0JCQkJQWJzdHJhY3RKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLnRoaXMuYWRkT3JVcGRhdGVBbm5vdGF0aW9uKG5vZGUsIHRoaXMuYXN0Um9vdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE9yVXBkYXRlQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBub2RlLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmcgcXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUgPSBKRFRUb29scy5yZXNvbHZlQW5ub3RhdGlvbihub2RlKTsKLQkJaWYgKHF1YWxpZmllZEFubm90YXRpb25OYW1lID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoaXNQb3NzaWJsZUFubm90YXRpb24ocXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKHF1YWxpZmllZEFubm90YXRpb25OYW1lKTsKLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlhbm5vdGF0aW9uLnVwZGF0ZUZyb21KYXZhKGFzdFJvb3QpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYW5ub3RhdGlvbiA9IGJ1aWxkQW5ub3RhdGlvbihxdWFsaWZpZWRBbm5vdGF0aW9uTmFtZSk7Ci0JCQkJYW5ub3RhdGlvbi5pbml0aWFsaXplKGFzdFJvb3QpOwotCQkJCWFkZEFubm90YXRpb24oYW5ub3RhdGlvbik7CQkJCQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGlzUG9zc2libGVNYXBwaW5nQW5ub3RhdGlvbihxdWFsaWZpZWRBbm5vdGF0aW9uTmFtZSkpIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldE1hcHBpbmdBbm5vdGF0aW9uKHF1YWxpZmllZEFubm90YXRpb25OYW1lKTsKLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlhbm5vdGF0aW9uLnVwZGF0ZUZyb21KYXZhKGFzdFJvb3QpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYW5ub3RhdGlvbiA9IGJ1aWxkTWFwcGluZ0Fubm90YXRpb24ocXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUpOwotCQkJCWFubm90YXRpb24uaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJCQlhZGRNYXBwaW5nQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsJCQkJCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJcmV0dXJuIHRoaXMubWVtYmVyLm1hdGNoZXMobWVtYmVyTmFtZSwgb2NjdXJyZW5jZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnBlcnNpc3RhYmxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQZXJzaXN0YWJsZShib29sZWFuIG5ld1BlcnNpc3RhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkUGVyc2lzdGFibGUgPSB0aGlzLnBlcnNpc3RhYmxlOwotCQl0aGlzLnBlcnNpc3RhYmxlID0gbmV3UGVyc2lzdGFibGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUEVSU0lTVEFCTEVfUFJPUEVSVFksIG9sZFBlcnNpc3RhYmxlLCBuZXdQZXJzaXN0YWJsZSk7Ci0JCS8vVE9ETyBjaGFuZ2Ugbm90aWZpY2F0aW9uIHRvIHBhcmVudCBzbyB0aGF0IHRoZSBjb250ZXh0IG1vZGVsIGdldHMgbm90aWZpY2F0aW9uIAotCQkvL3RoYXQgdGhlIGxpc3Qgb2YgcGVyc2lzdGFibGUgZmllbGRzIGhhcyBiZWVuIHVwZGF0ZWQKLQkJLy8KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0ZWQoKSB7Ci0JCXJldHVybiBnZXRNYXBwaW5nQW5ub3RhdGlvbigpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBmdWxsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFRleHRSYW5nZSh0aGlzLmdldE1lbWJlcigpLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWVtYmVyKCkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQVNUTm9kZSBhc3ROb2RlKSB7Ci0JCXJldHVybiAoYXN0Tm9kZSA9PSBudWxsKSA/IG51bGwgOiBuZXcgQVNUTm9kZVRleHRSYW5nZShhc3ROb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIDxUIGV4dGVuZHMgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcj4gSXRlcmF0b3I8VD4gcGVyc2lzdGFibGVNZW1iZXJzKEl0ZXJhdG9yPFQ+IGF0dHJpYnV0ZXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxULCBUPihhdHRyaWJ1dGVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChUIGF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBU1QgdmlzaXRvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgTG9jYWxBU1RWaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7Ci0JCXByb3RlY3RlZCBmaW5hbCBDb21waWxhdGlvblVuaXQgYXN0Um9vdDsKLQkJcHJvdGVjdGVkIGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb247Ci0KLQkJcHJvdGVjdGVkIExvY2FsQVNUVmlzaXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCwgQm9keURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYXN0Um9vdCA9IGFzdFJvb3Q7Ci0JCQl0aGlzLmJvZHlEZWNsYXJhdGlvbiA9IGJvZHlEZWNsYXJhdGlvbjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5vZGUpIHsKLQkJCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KE5vcm1hbEFubm90YXRpb24gbm9kZSkgewotCQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoTWFya2VyQW5ub3RhdGlvbiBub2RlKSB7Ci0JCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiB2aXNpdF8ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gbm9kZSkgewotCQkJLy8gaWdub3JlIGFubm90YXRpb25zIGZvciBjaGlsZCBtZW1iZXJzLCBvbmx5IHRoaXMgbWVtYmVyCi0JCQlpZiAobm9kZS5nZXRQYXJlbnQoKSA9PSB0aGlzLmJvZHlEZWNsYXJhdGlvbikgewotCQkJCXRoaXMudmlzaXRDaGlsZEFubm90YXRpb24obm9kZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2aXNpdENoaWxkQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBub2RlKTsKLQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0TmFtZWRDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0TmFtZWRDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmMTMxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdE5hbWVkQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5hbWVkQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248TWVtYmVyPiBpbXBsZW1lbnRzIE5hbWVkQ29sdW1uQW5ub3RhdGlvbgotewotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAnbmFtZScgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdjb2x1bW5EZWZpbml0aW9uJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGNvbHVtbkRlZmluaXRpb25EZWNsYXJhdGlvbkFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjb2x1bW5EZWZpbml0aW9uQWRhcHRlcjsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbjsKLQkKLQlwdWJsaWMgQWJzdHJhY3ROYW1lZENvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKHRoaXMubmFtZUVsZW1lbnROYW1lKCkpOwotCQl0aGlzLm5hbWVBZGFwdGVyID0gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMuY29sdW1uRGVmaW5pdGlvbkRlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcih0aGlzLmNvbHVtbkRlZmluaXRpb25FbGVtZW50TmFtZSgpKTsJCQotCQl0aGlzLmNvbHVtbkRlZmluaXRpb25BZGFwdGVyID0gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEVsZW1lbnRBZGFwdGVyKHRoaXMuY29sdW1uRGVmaW5pdGlvbkRlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGdldERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSwgZWxlbWVudE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZEJvb2xlYW5FbGVtZW50QWRhcHRlcihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpLCBlbGVtZW50TmFtZSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkSW50ZWdlckVsZW1lbnRBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihnZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCksIGVsZW1lbnROYW1lLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRTaG9ydENpcmN1aXRFbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihnZXRNZW1iZXIoKSwgZGFlYSk7Ci0JfQotCQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSkgewotCQlyZXR1cm4gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihnZXRNZW1iZXIoKSwgZGFlYSk7Ci0JfQotCQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRTaG9ydENpcmN1aXRJbnRlZ2VyRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZGFlYSkgewotCQlyZXR1cm4gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihnZXRNZW1iZXIoKSwgZGFlYSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkU2hvcnRDaXJjdWl0U3RyaW5nRWxlbWVudEFkYXB0ZXIoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0RWxlbWVudEFkYXB0ZXIodGhpcy5idWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKGVsZW1lbnROYW1lKSk7Ci0JfQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgbmFtZUVsZW1lbnROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGNvbHVtbkRlZmluaXRpb25FbGVtZW50TmFtZSgpOwotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IHRoaXMuY29sdW1uRGVmaW5pdGlvbihhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKLQkJTmFtZWRDb2x1bW5Bbm5vdGF0aW9uIG9sZENvbHVtbiA9IChOYW1lZENvbHVtbkFubm90YXRpb24pIG9sZEFubm90YXRpb247Ci0JCXNldE5hbWUob2xkQ29sdW1uLmdldE5hbWUoKSk7Ci0JCXNldENvbHVtbkRlZmluaXRpb24ob2xkQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqIE5hbWVkQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm5hbWUsIG5ld05hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmV3TmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uRGVmaW5pdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcgbmV3Q29sdW1uRGVmaW5pdGlvbikgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuY29sdW1uRGVmaW5pdGlvbiwgbmV3Q29sdW1uRGVmaW5pdGlvbikpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkQ29sdW1uRGVmaW5pdGlvbiA9IHRoaXMuY29sdW1uRGVmaW5pdGlvbjsKLQkJdGhpcy5jb2x1bW5EZWZpbml0aW9uID0gbmV3Q29sdW1uRGVmaW5pdGlvbjsKLQkJdGhpcy5jb2x1bW5EZWZpbml0aW9uQWRhcHRlci5zZXRWYWx1ZShuZXdDb2x1bW5EZWZpbml0aW9uKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSwgb2xkQ29sdW1uRGVmaW5pdGlvbiwgbmV3Q29sdW1uRGVmaW5pdGlvbik7Ci0JfQkKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb2x1bW5EZWZpbml0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5jb2x1bW5EZWZpbml0aW9uRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXModGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc2V0TmFtZSh0aGlzLm5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnNldENvbHVtbkRlZmluaXRpb24odGhpcy5jb2x1bW5EZWZpbml0aW9uKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uRGVmaW5pdGlvbkFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdE5hbWVkUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0TmFtZWRRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDZlNGRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0TmFtZWRRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db250YWluZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUXVlcnlIaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROYW1lZFF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248VHlwZT4gCi0JaW1wbGVtZW50cyBRdWVyeUFubm90YXRpb24KLXsKLQkvLyBob2xkIHRoaXMgc28gd2UgY2FuIGdldCB0aGUgJ25hbWUnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZURlY2xhcmF0aW9uQWRhcHRlcjsKLQotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAncXVlcnknIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcXVlcnlEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBxdWVyeUFkYXB0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCXByaXZhdGUgU3RyaW5nIHF1ZXJ5OwotCQotCXByaXZhdGUgZmluYWwgTGlzdDxOZXN0YWJsZVF1ZXJ5SGludD4gaGludHM7Ci0JcHJpdmF0ZSBmaW5hbCBIaW50c0NvbnRhaW5lckFubm90YXRpb24gaGludHNDb250YWluZXJBbm5vdGF0aW9uOwotCQotCXByb3RlY3RlZCBBYnN0cmFjdE5hbWVkUXVlcnkoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIFR5cGUgdHlwZSxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gbmFtZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5xdWVyeURlY2xhcmF0aW9uQWRhcHRlciA9IHF1ZXJ5QWRhcHRlcihkYWEpOwotCQl0aGlzLm5hbWVBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5xdWVyeUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcih0aGlzLnF1ZXJ5RGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5oaW50cyA9IG5ldyBBcnJheUxpc3Q8TmVzdGFibGVRdWVyeUhpbnQ+KCk7Ci0JCXRoaXMuaGludHNDb250YWluZXJBbm5vdGF0aW9uID0gbmV3IEhpbnRzQ29udGFpbmVyQW5ub3RhdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMubmFtZSA9IHRoaXMubmFtZShhc3RSb290KTsKLQkJdGhpcy5xdWVyeSA9IHRoaXMucXVlcnkoYXN0Um9vdCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5pbml0aWFsaXplTmVzdGVkQW5ub3RhdGlvbnMoYXN0Um9vdCwgdGhpcy5oaW50c0NvbnRhaW5lckFubm90YXRpb24pOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQlyZXR1cm4gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGdldE1lbWJlcigpLCBkYWVhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCBuYW1lRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcXVlcnlBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIHF1ZXJ5RWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBuYW1lRWxlbWVudE5hbWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgcXVlcnlFbGVtZW50TmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5uYW1lLCBuZXdOYW1lKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5ld05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnkoKSB7Ci0JCXJldHVybiB0aGlzLnF1ZXJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5KFN0cmluZyBuZXdRdWVyeSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMucXVlcnksIG5ld1F1ZXJ5KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGRRdWVyeSA9IHRoaXMucXVlcnk7Ci0JCXRoaXMucXVlcnkgPSBuZXdRdWVyeTsKLQkJdGhpcy5xdWVyeUFkYXB0ZXIuc2V0VmFsdWUobmV3UXVlcnkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFFVRVJZX1BST1BFUlRZLCBvbGRRdWVyeSwgbmV3UXVlcnkpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8UXVlcnlIaW50QW5ub3RhdGlvbj4gaGludHMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8UXVlcnlIaW50QW5ub3RhdGlvbj4odGhpcy5oaW50cyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaGludHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5oaW50cy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZVF1ZXJ5SGludCBoaW50QXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmhpbnRzLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZkhpbnQoUXVlcnlIaW50QW5ub3RhdGlvbiBxdWVyeUhpbnQpIHsKLQkJcmV0dXJuIHRoaXMuaGludHMuaW5kZXhPZihxdWVyeUhpbnQpOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVRdWVyeUhpbnQgYWRkSGludChpbnQgaW5kZXgpIHsKLQkJTmVzdGFibGVRdWVyeUhpbnQgcXVlcnlIaW50ID0gKE5lc3RhYmxlUXVlcnlIaW50KSBDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuYWRkTmVzdGVkQW5ub3RhdGlvbihpbmRleCwgdGhpcy5oaW50c0NvbnRhaW5lckFubm90YXRpb24pOwotCQlmaXJlSXRlbUFkZGVkKFF1ZXJ5QW5ub3RhdGlvbi5ISU5UU19MSVNULCBpbmRleCwgcXVlcnlIaW50KTsKLQkJcmV0dXJuIHF1ZXJ5SGludDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEhpbnQoaW50IGluZGV4LCBOZXN0YWJsZVF1ZXJ5SGludCBxdWVyeUhpbnQpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgcXVlcnlIaW50LCB0aGlzLmhpbnRzLCBISU5UU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlSGludChpbnQgaW5kZXgpIHsKLQkJTmVzdGFibGVRdWVyeUhpbnQgcXVlcnlIaW50ID0gaGludEF0KGluZGV4KTsKLQkJcmVtb3ZlSGludChxdWVyeUhpbnQpOwotCQlxdWVyeUhpbnQucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuc3luY2hBbm5vdGF0aW9uc0FmdGVyUmVtb3ZlKGluZGV4LCB0aGlzLmhpbnRzQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVIaW50KE5lc3RhYmxlUXVlcnlIaW50IHF1ZXJ5SGludCkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QocXVlcnlIaW50LCB0aGlzLmhpbnRzLCBISU5UU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlSGludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQltb3ZlSGludEludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJNb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5oaW50c0NvbnRhaW5lckFubm90YXRpb24pOwotCQlmaXJlSXRlbU1vdmVkKFF1ZXJ5QW5ub3RhdGlvbi5ISU5UU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlSGludEludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuaGludHMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRRdWVyeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMucXVlcnlEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldE5hbWUodGhpcy5uYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRRdWVyeSh0aGlzLnF1ZXJ5KGFzdFJvb3QpKTsKLQkJdGhpcy51cGRhdGVRdWVyeUhpbnRzRnJvbUphdmEoYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnF1ZXJ5QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVF1ZXJ5SGludHNGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMudXBkYXRlTmVzdGVkQW5ub3RhdGlvbnNGcm9tSmF2YShhc3RSb290LCB0aGlzLmhpbnRzQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBOZXN0YWJsZVF1ZXJ5SGludCBjcmVhdGVRdWVyeUhpbnQoaW50IGluZGV4KTsKLQkKLQkvLyAqKioqKioqKioqIHBlcnNpc3RlbmNlIG1vZGVsIC0+IGphdmEgYW5ub3RhdGlvbnMgKioqKioqKioqKgotCXB1YmxpYyBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gKEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcikgc3VwZXIuZ2V0QW5ub3RhdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkubW92ZUFubm90YXRpb24obmV3SW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7Ci0JCUFic3RyYWN0TmFtZWRRdWVyeSBvbGROYW1lZFF1ZXJ5ID0gKEFic3RyYWN0TmFtZWRRdWVyeSkgb2xkQW5ub3RhdGlvbjsKLQkJc2V0TmFtZShvbGROYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCXNldFF1ZXJ5KG9sZE5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWZvciAoUXVlcnlIaW50QW5ub3RhdGlvbiBxdWVyeUhpbnQgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob2xkTmFtZWRRdWVyeS5oaW50cygpKSkgewotCQkJTmVzdGFibGVRdWVyeUhpbnQgbmV3UXVlcnlIaW50ID0gYWRkSGludChvbGROYW1lZFF1ZXJ5LmluZGV4T2ZIaW50KHF1ZXJ5SGludCkpOwotCQkJbmV3UXVlcnlIaW50LmluaXRpYWxpemVGcm9tKChOZXN0YWJsZVF1ZXJ5SGludCkgcXVlcnlIaW50KTsKLQkJfQotCX0KLQotCQotCXByaXZhdGUgY2xhc3MgSGludHNDb250YWluZXJBbm5vdGF0aW9uIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudHMgQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZVF1ZXJ5SGludD4gewotCi0JCXB1YmxpYyBIaW50c0NvbnRhaW5lckFubm90YXRpb24oKSB7Ci0JCQlzdXBlcihBYnN0cmFjdE5hbWVkUXVlcnkudGhpcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCS8vIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCQl9Ci0JCQotCQlwdWJsaWMgTmVzdGFibGVRdWVyeUhpbnQgYWRkKGludCBpbmRleCkgewotCQkJTmVzdGFibGVRdWVyeUhpbnQgcXVlcnlIaW50ID0gQWJzdHJhY3ROYW1lZFF1ZXJ5LnRoaXMuY3JlYXRlUXVlcnlIaW50KGluZGV4KTsKLQkJCUFic3RyYWN0TmFtZWRRdWVyeS50aGlzLmFkZEhpbnQoaW5kZXgsIHF1ZXJ5SGludCk7Ci0JCQlyZXR1cm4gcXVlcnlIaW50OwotCQl9Ci0JCQotCQlwdWJsaWMgTmVzdGFibGVRdWVyeUhpbnQgYWRkSW50ZXJuYWwoaW50IGluZGV4KSB7Ci0JCQlOZXN0YWJsZVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBBYnN0cmFjdE5hbWVkUXVlcnkudGhpcy5jcmVhdGVRdWVyeUhpbnQoaW5kZXgpOwotCQkJQWJzdHJhY3ROYW1lZFF1ZXJ5LnRoaXMuaGludHMuYWRkKGluZGV4LCBxdWVyeUhpbnQpOwotCQkJcmV0dXJuIHF1ZXJ5SGludDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE5hbWVkUXVlcnkudGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEpQQS5RVUVSWV9ISU5UOwotCQl9Ci0KLQkJcHVibGljIGludCBpbmRleE9mKE5lc3RhYmxlUXVlcnlIaW50IGhpbnQpIHsKLQkJCXJldHVybiBBYnN0cmFjdE5hbWVkUXVlcnkudGhpcy5pbmRleE9mSGludChoaW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCUFic3RyYWN0TmFtZWRRdWVyeS50aGlzLm1vdmVIaW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIG1vdmVJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJQWJzdHJhY3ROYW1lZFF1ZXJ5LnRoaXMubW92ZUhpbnRJbnRlcm5hbCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIE5lc3RhYmxlUXVlcnlIaW50IG5lc3RlZEFubm90YXRpb25BdChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE5hbWVkUXVlcnkudGhpcy5oaW50QXQoaW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIE5lc3RhYmxlUXVlcnlIaW50IG5lc3RlZEFubm90YXRpb25Gb3IoQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCQlmb3IgKE5lc3RhYmxlUXVlcnlIaW50IHVuaXF1ZUNvbnN0cmFpbnQgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUobmVzdGVkQW5ub3RhdGlvbnMoKSkpIHsKLQkJCQlpZiAoamR0QW5ub3RhdGlvbiA9PSB1bmlxdWVDb25zdHJhaW50LmdldEpkdEFubm90YXRpb24oKENvbXBpbGF0aW9uVW5pdCkgamR0QW5ub3RhdGlvbi5nZXRSb290KCkpKSB7Ci0JCQkJCXJldHVybiB1bmlxdWVDb25zdHJhaW50OwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZVF1ZXJ5SGludD4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlUXVlcnlIaW50PihBYnN0cmFjdE5hbWVkUXVlcnkudGhpcy5oaW50cyk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE5hbWVkUXVlcnkudGhpcy5oaW50c1NpemUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShOZXN0YWJsZVF1ZXJ5SGludCBxdWVyeUhpbnQpIHsKLQkJCUFic3RyYWN0TmFtZWRRdWVyeS50aGlzLnJlbW92ZUhpbnQocXVlcnlIaW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCUFic3RyYWN0TmFtZWRRdWVyeS50aGlzLnJlbW92ZUhpbnQobmVzdGVkQW5ub3RhdGlvbkF0KGluZGV4KSk7CQotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEFic3RyYWN0TmFtZWRRdWVyeS50aGlzLmdldEpkdEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgewotCQkJQWJzdHJhY3ROYW1lZFF1ZXJ5LnRoaXMubmV3QW5ub3RhdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJCUFic3RyYWN0TmFtZWRRdWVyeS50aGlzLnJlbW92ZUFubm90YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlBYnN0cmFjdE5hbWVkUXVlcnkudGhpcy51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKLQkJfQotCQkKLQkJcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBBYnN0cmFjdE5hbWVkUXVlcnkudGhpcy5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gImhpbnRzIjsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3RSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3RSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjhjMDFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ2FzY2FkZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPiBpbXBsZW1lbnRzIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCi17Ci0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICd0YXJnZXRFbnRpdHknIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdGFyZ2V0RW50aXR5RGVjbGFyYXRpb25BZGFwdGVyOwotCQotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAnZmV0Y2gnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZmV0Y2hEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdjYXNjYWRlJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gY2FzY2FkZURlY2xhcmF0aW9uQWRhcHRlcjsKLQkKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRhcmdldEVudGl0eUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZldGNoQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBjYXNjYWRlQWRhcHRlcjsKLQotCXByaXZhdGUgU3RyaW5nIHRhcmdldEVudGl0eTsKLQotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5OwotCi0JcHJpdmF0ZSBGZXRjaFR5cGUgZmV0Y2g7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZUFsbDsKLQotCXByb3RlY3RlZCBib29sZWFuIGNhc2NhZGVQZXJzaXN0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZU1lcmdlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZVJlbW92ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGNhc2NhZGVSZWZyZXNoOwotCi0JCi0JcHVibGljIEFic3RyYWN0UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBkYWEpOwotCQl0aGlzLnRhcmdldEVudGl0eURlY2xhcmF0aW9uQWRhcHRlciA9IHRhcmdldEVudGl0eUFkYXB0ZXIoKTsKLQkJdGhpcy50YXJnZXRFbnRpdHlBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy50YXJnZXRFbnRpdHlEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmZldGNoRGVjbGFyYXRpb25BZGFwdGVyID0gZmV0Y2hBZGFwdGVyKCk7Ci0JCXRoaXMuZmV0Y2hBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5mZXRjaERlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMuY2FzY2FkZURlY2xhcmF0aW9uQWRhcHRlciA9IGNhc2NhZGVBZGFwdGVyKCk7Ci0JCXRoaXMuY2FzY2FkZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhdHRyaWJ1dGUsIHRoaXMuY2FzY2FkZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmdldE1lbWJlcigpLCBkYWVhKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZEJvb2xlYW5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSkgewotCQlyZXR1cm4gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmdldE1lbWJlcigpLCBkYWVhKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIEphdmEgYWRhcHRlcidzICd0YXJnZXRFbnRpdHknIGVsZW1lbnQgYWRhcHRlciBjb25maWcKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0YXJnZXRFbnRpdHlBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIEphdmEgYWRhcHRlcidzICdjYXNjYWRlJyBlbGVtZW50IGFkYXB0ZXIgY29uZmlnCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBjYXNjYWRlQWRhcHRlcigpOwotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBKYXZhIGFkYXB0ZXIncyAnZmV0Y2gnIGVsZW1lbnQgYWRhcHRlciBjb25maWcKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmZXRjaEFkYXB0ZXIoKTsKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy50YXJnZXRFbnRpdHkgPSB0aGlzLnRhcmdldEVudGl0eShhc3RSb290KTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSA9IHRoaXMuZnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoYXN0Um9vdCk7Ci0JCXRoaXMuZmV0Y2ggPSB0aGlzLmZldGNoKGFzdFJvb3QpOwotCQl0aGlzLmluaXRpYWxpemVDYXNjYWRlVHlwZXMoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYXNjYWRlVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nW10gamF2YVZhbHVlID0gdGhpcy5jYXNjYWRlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQkJQ2FzY2FkZVR5cGVbXSBjYXNjYWRlVHlwZXMgPSBDYXNjYWRlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZShqYXZhVmFsdWUpOwotCQkKLQkJdGhpcy5jYXNjYWRlQWxsID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuQUxMKTsKLQkJdGhpcy5jYXNjYWRlTWVyZ2UgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoY2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5NRVJHRSk7Ci0JCXRoaXMuY2FzY2FkZVBlcnNpc3QgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoY2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5QRVJTSVNUKTsKLQkJdGhpcy5jYXNjYWRlUmVmcmVzaCA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlJFRlJFU0gpOwotCQl0aGlzLmNhc2NhZGVSZW1vdmUgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoY2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5SRU1PVkUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0RW50aXR5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIG5ld1RhcmdldEVudGl0eSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMudGFyZ2V0RW50aXR5LCBuZXdUYXJnZXRFbnRpdHkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZFRhcmdldEVudGl0eSA9IHRoaXMudGFyZ2V0RW50aXR5OwotCQl0aGlzLnRhcmdldEVudGl0eSA9IG5ld1RhcmdldEVudGl0eTsKLQkJdGhpcy50YXJnZXRFbnRpdHlBZGFwdGVyLnNldFZhbHVlKG5ld1RhcmdldEVudGl0eSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkVGFyZ2V0RW50aXR5LCBuZXdUYXJnZXRFbnRpdHkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoU3RyaW5nIG5ld1RhcmdldEVudGl0eSkgewotCQlTdHJpbmcgb2xkVGFyZ2V0RW50aXR5ID0gdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSA9IG5ld1RhcmdldEVudGl0eTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMRklFSURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkVGFyZ2V0RW50aXR5LCBuZXdUYXJnZXRFbnRpdHkpOwotCX0KLQkKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5mZXRjaDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5mZXRjaCwgbmV3RmV0Y2gpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRmV0Y2hUeXBlIG9sZEZldGNoID0gdGhpcy5mZXRjaDsKLQkJdGhpcy5mZXRjaCA9IG5ld0ZldGNoOwotCQl0aGlzLmZldGNoQWRhcHRlci5zZXRWYWx1ZShGZXRjaFR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKG5ld0ZldGNoKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRkVUQ0hfUFJPUEVSVFksIG9sZEZldGNoLCBuZXdGZXRjaCk7Ci0JfQotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVBbGwoKSB7Ci0JCXJldHVybiB0aGlzLmNhc2NhZGVBbGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVBbGwoYm9vbGVhbiBuZXdDYXNjYWRlQWxsKSB7Ci0JCWlmICh0aGlzLmNhc2NhZGVBbGwgPT0gbmV3Q2FzY2FkZUFsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZUFsbCA9IHRoaXMuY2FzY2FkZUFsbDsKLQkJdGhpcy5jYXNjYWRlQWxsID0gbmV3Q2FzY2FkZUFsbDsKLQkJc2V0Q2FzY2FkZShuZXdDYXNjYWRlQWxsLCBDYXNjYWRlVHlwZS5BTEwpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfQUxMX1BST1BFUlRZLCBvbGRDYXNjYWRlQWxsLCBuZXdDYXNjYWRlQWxsKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FzY2FkZVBlcnNpc3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVQZXJzaXN0KGJvb2xlYW4gbmV3Q2FzY2FkZVBlcnNpc3QpIHsKLQkJaWYgKHRoaXMuY2FzY2FkZVBlcnNpc3QgPT0gbmV3Q2FzY2FkZVBlcnNpc3QpIHsKLQkJCXJldHVybjsKLQkJfQotCQlib29sZWFuIG9sZENhc2NhZGVQZXJzaXN0ID0gdGhpcy5jYXNjYWRlUGVyc2lzdDsKLQkJdGhpcy5jYXNjYWRlUGVyc2lzdCA9IG5ld0Nhc2NhZGVQZXJzaXN0OwotCQlzZXRDYXNjYWRlKG5ld0Nhc2NhZGVQZXJzaXN0LCBDYXNjYWRlVHlwZS5QRVJTSVNUKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDQVNDQURFX1BFUlNJU1RfUFJPUEVSVFksIG9sZENhc2NhZGVQZXJzaXN0LCBuZXdDYXNjYWRlUGVyc2lzdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZU1lcmdlKCkgewotCQlyZXR1cm4gdGhpcy5jYXNjYWRlTWVyZ2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVNZXJnZShib29sZWFuIG5ld0Nhc2NhZGVNZXJnZSkgewotCQlpZiAodGhpcy5jYXNjYWRlTWVyZ2UgPT0gbmV3Q2FzY2FkZU1lcmdlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBvbGRDYXNjYWRlTWVyZ2UgPSB0aGlzLmNhc2NhZGVNZXJnZTsKLQkJdGhpcy5jYXNjYWRlTWVyZ2UgPSBuZXdDYXNjYWRlTWVyZ2U7Ci0JCXNldENhc2NhZGUobmV3Q2FzY2FkZU1lcmdlLCBDYXNjYWRlVHlwZS5NRVJHRSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FTQ0FERV9NRVJHRV9QUk9QRVJUWSwgb2xkQ2FzY2FkZU1lcmdlLCBuZXdDYXNjYWRlTWVyZ2UpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVSZW1vdmUoKSB7Ci0JCXJldHVybiB0aGlzLmNhc2NhZGVSZW1vdmU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVSZW1vdmUoYm9vbGVhbiBuZXdDYXNjYWRlUmVtb3ZlKSB7Ci0JCWlmICh0aGlzLmNhc2NhZGVSZW1vdmUgPT0gbmV3Q2FzY2FkZVJlbW92ZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZVJlbW92ZSA9IHRoaXMuY2FzY2FkZVJlbW92ZTsKLQkJdGhpcy5jYXNjYWRlUmVtb3ZlID0gbmV3Q2FzY2FkZVJlbW92ZTsKLQkJc2V0Q2FzY2FkZShuZXdDYXNjYWRlUmVtb3ZlLCBDYXNjYWRlVHlwZS5SRU1PVkUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfUkVNT1ZFX1BST1BFUlRZLCBvbGRDYXNjYWRlUmVtb3ZlLCBuZXdDYXNjYWRlUmVtb3ZlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUmVmcmVzaCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FzY2FkZVJlZnJlc2g7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVSZWZyZXNoKGJvb2xlYW4gbmV3Q2FzY2FkZVJlZnJlc2gpIHsKLQkJaWYgKHRoaXMuY2FzY2FkZVJlZnJlc2ggPT0gbmV3Q2FzY2FkZVJlZnJlc2gpIHsKLQkJCXJldHVybjsKLQkJfQotCQlib29sZWFuIG9sZENhc2NhZGVSZWZyZXNoID0gdGhpcy5jYXNjYWRlUmVmcmVzaDsKLQkJdGhpcy5jYXNjYWRlUmVmcmVzaCA9IG5ld0Nhc2NhZGVSZWZyZXNoOwotCQlzZXRDYXNjYWRlKG5ld0Nhc2NhZGVSZWZyZXNoLCBDYXNjYWRlVHlwZS5SRUZSRVNIKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDQVNDQURFX1JFRlJFU0hfUFJPUEVSVFksIG9sZENhc2NhZGVSZWZyZXNoLCBuZXdDYXNjYWRlUmVmcmVzaCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRDYXNjYWRlVHlwZXMoQ2FzY2FkZVR5cGVbXSBjYXNjYWRlVHlwZXMpIHsKLQkJU3RyaW5nW10gbmV3SmF2YVZhbHVlID0gQ2FzY2FkZVR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKGNhc2NhZGVUeXBlcyk7Ci0JCXRoaXMuY2FzY2FkZUFkYXB0ZXIuc2V0VmFsdWUobmV3SmF2YVZhbHVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldENhc2NhZGUoYm9vbGVhbiBpc1NldCwgQ2FzY2FkZVR5cGUgY2FzY2FkZVR5cGUpIHsKLQkJU3RyaW5nW10gamF2YVZhbHVlID0gdGhpcy5jYXNjYWRlQWRhcHRlci5nZXRWYWx1ZSgpOwotCQlDYXNjYWRlVHlwZVtdIGNhc2NhZGVUeXBlcyA9IENhc2NhZGVUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKGphdmFWYWx1ZSk7CQotCQlMaXN0PENhc2NhZGVUeXBlPiBjYXNjYWRlQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5saXN0KGNhc2NhZGVUeXBlcyk7Ci0KLQkJaWYgKGNhc2NhZGVDb2xsZWN0aW9uLmNvbnRhaW5zKGNhc2NhZGVUeXBlKSkgewotCQkJaWYgKCFpc1NldCkgewotCQkJCWNhc2NhZGVDb2xsZWN0aW9uLnJlbW92ZShjYXNjYWRlVHlwZSk7Ci0JCQkJc2V0Q2FzY2FkZVR5cGVzKGNhc2NhZGVDb2xsZWN0aW9uLnRvQXJyYXkobmV3IENhc2NhZGVUeXBlW2Nhc2NhZGVDb2xsZWN0aW9uLnNpemUoKV0pKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChpc1NldCkgewotCQkJCWNhc2NhZGVDb2xsZWN0aW9uLmFkZChjYXNjYWRlVHlwZSk7Ci0JCQkJc2V0Q2FzY2FkZVR5cGVzKGNhc2NhZGVDb2xsZWN0aW9uLnRvQXJyYXkobmV3IENhc2NhZGVUeXBlW2Nhc2NhZGVDb2xsZWN0aW9uLnNpemUoKV0pKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRhcmdldEVudGl0eVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnRhcmdldEVudGl0eURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5mZXRjaERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2FzY2FkZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmNhc2NhZGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldEZldGNoKHRoaXMuZmV0Y2goYXN0Um9vdCkpOwotCQl0aGlzLnNldFRhcmdldEVudGl0eSh0aGlzLnRhcmdldEVudGl0eShhc3RSb290KSk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkodGhpcy5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eShhc3RSb290KSk7Ci0JCXRoaXMudXBkYXRlQ2FzY2FkZUZyb21KYXZhKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGZldGNoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBGZXRjaFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5mZXRjaEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldEVudGl0eShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXRFbnRpdHlBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2FzY2FkZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZ1tdIGphdmFWYWx1ZSA9IHRoaXMuY2FzY2FkZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JCUNhc2NhZGVUeXBlW10gY2FzY2FkZVR5cGVzID0gQ2FzY2FkZVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoamF2YVZhbHVlKTsKLQkJc2V0Q2FzY2FkZUFsbChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoY2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5BTEwpKTsKLQkJc2V0Q2FzY2FkZU1lcmdlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLk1FUkdFKSk7Ci0JCXNldENhc2NhZGVQZXJzaXN0KENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlBFUlNJU1QpKTsKLQkJc2V0Q2FzY2FkZVJlZnJlc2goQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuUkVGUkVTSCkpOwotCQlzZXRDYXNjYWRlUmVtb3ZlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlJFTU9WRSkpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFRhcmdldEVudGl0eShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAoZ2V0VGFyZ2V0RW50aXR5KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIEpEVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy50YXJnZXRFbnRpdHlBZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCkpOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCS8vIFRPRE8gd2hhdCBhYm91dCBRdWFsaWZpZWRUeXBlPwotCQlyZXR1cm4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGNvbnZlcnRlcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgZmFsc2UsIGNvbnZlcnRlcik7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkRW51bUFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzYyMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVE5vZGVUZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPEUgZXh0ZW5kcyBNZW1iZXI+Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUKLQlpbXBsZW1lbnRzIEFubm90YXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIEUgbWVtYmVyOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXI7Ci0JCQotCXByb3RlY3RlZCBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgRSBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm1lbWJlciA9IG1lbWJlcjsKLQkJdGhpcy5kYWEgPSBkYWE7Ci0JCXRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIgPSBhbm5vdGF0aW9uQWRhcHRlcjsKLQl9Ci0JCi0JcHVibGljIEUgZ2V0TWVtYmVyKCkgewotCQlyZXR1cm4gdGhpcy5tZW1iZXI7Ci0JfQotCQotCXByb3RlY3RlZCBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgRSBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXRoaXMocGFyZW50LCBtZW1iZXIsIGRhYSwgbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgZGFhKSk7Ci0JfQotCi0JCi0JcHVibGljIEFubm90YXRpb25BZGFwdGVyIGdldEFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uQWRhcHRlcjsKLQl9Ci0JCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb25BZGFwdGVyKCkuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuZGFhOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCWdldEFubm90YXRpb25BZGFwdGVyKCkucmVtb3ZlQW5ub3RhdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgewotCQlnZXRBbm5vdGF0aW9uQWRhcHRlcigpLm5ld01hcmtlckFubm90YXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKEFTVE5vZGUgYXN0Tm9kZSkgewotCQlyZXR1cm4gKGFzdE5vZGUgPT0gbnVsbCkgPyBudWxsIDogbmV3IEFTVE5vZGVUZXh0UmFuZ2UoYXN0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uLgotCSAqIElmIHRoZSBhbm5vdGF0aW9uIGlzIG1pc3NpbmcsIHJldHVybiBudWxsLgotCSAqLwotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QW5ub3RhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRUZXh0UmFuZ2UoZ2V0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmRhYS5nZXRBbm5vdGF0aW9uKGdldE1lbWJlcigpLmdldE1vZGlmaWVkRGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRBbm5vdGF0aW9uRWxlbWVudEV4cHJlc3Npb24oRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Pz4gYWRhcHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihnZXRNZW1iZXIoKS5nZXRNb2RpZmllZERlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEFubm90YXRpb25FbGVtZW50VGV4dFJhbmdlKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPD8+IGFkYXB0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFRleHRSYW5nZShnZXRBbm5vdGF0aW9uRWxlbWVudEV4cHJlc3Npb24oYWRhcHRlciwgYXN0Um9vdCkpOwotCi0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLiBJZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaXMgbWlzc2luZwotCSAqIHJldHVybiB0aGUgbWVtYmVyJ3MgdGV4dCByYW5nZSBpbnN0ZWFkLgotCSAqLwotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0RWxlbWVudFRleHRSYW5nZShEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjw/PiBlbGVtZW50QWRhcHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShnZXRBbm5vdGF0aW9uRWxlbWVudFRleHRSYW5nZShlbGVtZW50QWRhcHRlciwgYXN0Um9vdCksIGFzdFJvb3QpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuIElmIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0ZXh0IHJhbmdlIGlzIG51bGwKLQkgKiByZXR1cm4gdGhlIG1lbWJlcidzIHRleHQgcmFuZ2UgaW5zdGVhZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEVsZW1lbnRUZXh0UmFuZ2UoVGV4dFJhbmdlIGVsZW1lbnRUZXh0UmFuZ2UsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAoZWxlbWVudFRleHRSYW5nZSAhPSBudWxsKSA/IGVsZW1lbnRUZXh0UmFuZ2UgOiB0aGlzLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlIGVsZW1lbnQuCi0JICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVsZW1lbnRUb3VjaGVzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPD8+IGVsZW1lbnRBZGFwdGVyLCBpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhnZXRBbm5vdGF0aW9uRWxlbWVudFRleHRSYW5nZShlbGVtZW50QWRhcHRlciwgYXN0Um9vdCksIHBvcyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4gUmV0dXJuIHdoZXRoZXIgZWxlbWVudCdzIHRleHQgcmFuZ2UgaXMgbm90Ci0JICogbnVsbCAobWVhbmluZyB0aGUgZWxlbWVudCBleGlzdHMpIGFuZCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgaXQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWxlbWVudFRvdWNoZXMoVGV4dFJhbmdlIGVsZW1lbnRUZXh0UmFuZ2UsIGludCBwb3MpIHsKLQkJcmV0dXJuIChlbGVtZW50VGV4dFJhbmdlICE9IG51bGwpICYmIGVsZW1lbnRUZXh0UmFuZ2UudG91Y2hlcyhwb3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3RSZXNvdXJjZVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdFJlc291cmNlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0YjA1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdFJlc291cmNlVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db250YWluZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXNvdXJjZVRhYmxlIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248TWVtYmVyPiBpbXBsZW1lbnRzIFRhYmxlQW5ub3RhdGlvbgotewotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAnbmFtZScgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdzY2hlbWEnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2NoZW1hRGVjbGFyYXRpb25BZGFwdGVyOwotCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdjYXRhbG9nJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGNhdGFsb2dEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBzY2hlbWFBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjYXRhbG9nQWRhcHRlcjsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY2F0YWxvZzsKLQkKLQlwcml2YXRlIFN0cmluZyBzY2hlbWE7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBMaXN0PE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHM7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBVbmlxdWVDb25zdHJhaW50c0NvbnRhaW5lckFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uOwotCQotCXByb3RlY3RlZCBBYnN0cmFjdFJlc291cmNlVGFibGUoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMubmFtZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5zY2hlbWFEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLnNjaGVtYUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5jYXRhbG9nRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5jYXRhbG9nQWRhcHRlcihkYWEpOwotCQl0aGlzLm5hbWVBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5zY2hlbWFBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5zY2hlbWFEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmNhdGFsb2dBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5jYXRhbG9nRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50cyA9IG5ldyBBcnJheUxpc3Q8TmVzdGFibGVVbmlxdWVDb25zdHJhaW50PigpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyQW5ub3RhdGlvbiA9IG5ldyBVbmlxdWVDb25zdHJhaW50c0NvbnRhaW5lckFubm90YXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMuY2F0YWxvZyA9IHRoaXMuY2F0YWxvZyhhc3RSb290KTsKLQkJdGhpcy5zY2hlbWEgPSB0aGlzLnNjaGVtYShhc3RSb290KTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmluaXRpYWxpemVOZXN0ZWRBbm5vdGF0aW9ucyhhc3RSb290LCB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmdldE1lbWJlcigpLCBkYWVhKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgZGVjbGFyYXRpb24gZWxlbWVudCBhZGFwdGVyIGZvciB0aGUgdGFibGUncyAnbmFtZScgZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcik7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgZGVjbGFyYXRpb24gZWxlbWVudCBhZGFwdGVyIGZvciB0aGUgdGFibGUncyAnc2NoZW1hJyBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2NoZW1hQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIGRlY2xhcmF0aW9uIGVsZW1lbnQgYWRhcHRlciBmb3IgdGhlIHRhYmxlJ3MgJ2NhdGFsb2cnIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjYXRhbG9nQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpOwotCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm5hbWUsIG5ld05hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmV3TmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIG5ld0NhdGFsb2cpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmNhdGFsb2csIG5ld0NhdGFsb2cpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZENhdGFsb2cgPSB0aGlzLmNhdGFsb2c7Ci0JCXRoaXMuY2F0YWxvZyA9IG5ld0NhdGFsb2c7Ci0JCXRoaXMuY2F0YWxvZ0FkYXB0ZXIuc2V0VmFsdWUobmV3Q2F0YWxvZyk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FUQUxPR19QUk9QRVJUWSwgb2xkQ2F0YWxvZywgbmV3Q2F0YWxvZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIG5ld1NjaGVtYSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuc2NoZW1hLCBuZXdTY2hlbWEpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZFNjaGVtYSA9IHRoaXMuc2NoZW1hOwotCQl0aGlzLnNjaGVtYSA9IG5ld1NjaGVtYTsKLQkJdGhpcy5zY2hlbWFBZGFwdGVyLnNldFZhbHVlKG5ld1NjaGVtYSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0NIRU1BX1BST1BFUlRZLCBvbGRTY2hlbWEsIG5ld1NjaGVtYSk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPih0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKTsKLQl9Ci0JCi0JcHVibGljIGludCB1bmlxdWVDb25zdHJhaW50c1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50QXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZlVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50cy5pbmRleE9mKHVuaXF1ZUNvbnN0cmFpbnQpOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50ID0gKE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCkgQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1BZGRlZChUYWJsZUFubm90YXRpb24uVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QsIGluZGV4LCB1bmlxdWVDb25zdHJhaW50KTsKLQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCwgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgdW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQlOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IHRoaXMudW5pcXVlQ29uc3RyYWludEF0KGluZGV4KTsKLQkJcmVtb3ZlVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KTsKLQkJdW5pcXVlQ29uc3RyYWludC5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW5kZXgsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QodW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQltb3ZlVW5pcXVlQ29uc3RyYWludEludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJNb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lckFubm90YXRpb24pOwotCQlmaXJlSXRlbU1vdmVkKFRhYmxlQW5ub3RhdGlvbi5VTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnRJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnNjaGVtYURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmNhdGFsb2dEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2F0YWxvZ1RvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXModGhpcy5jYXRhbG9nRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzY2hlbWFUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMuc2NoZW1hRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldE5hbWUodGhpcy5uYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRTY2hlbWEodGhpcy5zY2hlbWEoYXN0Um9vdCkpOwotCQl0aGlzLnNldENhdGFsb2codGhpcy5jYXRhbG9nKGFzdFJvb3QpKTsKLQkJdGhpcy51cGRhdGVVbmlxdWVDb25zdHJhaW50c0Zyb21KYXZhKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgY2F0YWxvZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JLyoqCi0JICogaGVyZSB3ZSBqdXN0IHdvcnJ5IGFib3V0IGdldHRpbmcgdGhlIHVuaXF1ZSBjb25zdHJhaW50cyBsaXN0cyB0aGUgc2FtZSBzaXplOwotCSAqIHRoZW4gd2UgZGVsZWdhdGUgdG8gdGhlIHVuaXF1ZSBjb25zdHJhaW50cyB0byBzeW5jaCB0aGVtc2VsdmVzIHVwCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLnVwZGF0ZU5lc3RlZEFubm90YXRpb25zRnJvbUphdmEoYXN0Um9vdCwgdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lckFubm90YXRpb24pOwotCX0KLQotCQotCXByaXZhdGUgY2xhc3MgVW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIAotCQlpbXBsZW1lbnRzIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVVbmlxdWVDb25zdHJhaW50PiAKLQl7Ci0JCXB1YmxpYyBVbmlxdWVDb25zdHJhaW50c0NvbnRhaW5lckFubm90YXRpb24oKSB7Ci0JCQlzdXBlcihBYnN0cmFjdFJlc291cmNlVGFibGUudGhpcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCS8vbm90aGluZyB0byBpbml0aWFsaXplCi0JCX0KLQotCQlwdWJsaWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IGFkZEludGVybmFsKGludCBpbmRleCkgewotCQkJTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgPSBBYnN0cmFjdFJlc291cmNlVGFibGUudGhpcy5jcmVhdGVVbmlxdWVDb25zdHJhaW50KGluZGV4KTsKLQkJCUFic3RyYWN0UmVzb3VyY2VUYWJsZS50aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmFkZChpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7CQkJCi0JCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludDsKLQkJfQotCQkKLQkJcHVibGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCBhZGQoaW50IGluZGV4KSB7Ci0JCQlOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IEFic3RyYWN0UmVzb3VyY2VUYWJsZS50aGlzLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnQoaW5kZXgpOwotCQkJQWJzdHJhY3RSZXNvdXJjZVRhYmxlLnRoaXMuYWRkVW5pcXVlQ29uc3RyYWludChpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7Ci0JCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdFJlc291cmNlVGFibGUudGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEpQQS5VTklRVUVfQ09OU1RSQUlOVDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgaW5kZXhPZihOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgewotCQkJcmV0dXJuIEFic3RyYWN0UmVzb3VyY2VUYWJsZS50aGlzLmluZGV4T2ZVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJQWJzdHJhY3RSZXNvdXJjZVRhYmxlLnRoaXMubW92ZVVuaXF1ZUNvbnN0cmFpbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgbW92ZUludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCQlBYnN0cmFjdFJlc291cmNlVGFibGUudGhpcy5tb3ZlVW5pcXVlQ29uc3RyYWludEludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IG5lc3RlZEFubm90YXRpb25BdChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBBYnN0cmFjdFJlc291cmNlVGFibGUudGhpcy51bmlxdWVDb25zdHJhaW50QXQoaW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCBuZXN0ZWRBbm5vdGF0aW9uRm9yKEFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQkJZm9yIChOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShuZXN0ZWRBbm5vdGF0aW9ucygpKSkgewotCQkJCWlmIChqZHRBbm5vdGF0aW9uID09IHVuaXF1ZUNvbnN0cmFpbnQuZ2V0SmR0QW5ub3RhdGlvbigoQ29tcGlsYXRpb25Vbml0KSBqZHRBbm5vdGF0aW9uLmdldFJvb3QoKSkpIHsKLQkJCQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludD4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludD4oQWJzdHJhY3RSZXNvdXJjZVRhYmxlLnRoaXMudW5pcXVlQ29uc3RyYWludHMpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RSZXNvdXJjZVRhYmxlLnRoaXMudW5pcXVlQ29uc3RyYWludHNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJCUFic3RyYWN0UmVzb3VyY2VUYWJsZS50aGlzLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQodW5pcXVlQ29uc3RyYWludCk7CQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQkJdGhpcy5yZW1vdmUobmVzdGVkQW5ub3RhdGlvbkF0KGluZGV4KSk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RSZXNvdXJjZVRhYmxlLnRoaXMuZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCQlBYnN0cmFjdFJlc291cmNlVGFibGUudGhpcy5uZXdBbm5vdGF0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQkJQWJzdHJhY3RSZXNvdXJjZVRhYmxlLnRoaXMucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCUFic3RyYWN0UmVzb3VyY2VUYWJsZS50aGlzLnVwZGF0ZUZyb21KYXZhKGFzdFJvb3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEFic3RyYWN0UmVzb3VyY2VUYWJsZS50aGlzLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiAidW5pcXVlQ29uc3RyYWludHMiOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYzI2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkFzc29jaWF0aW9uT3ZlcnJpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24uYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlKHBhcmVudCwgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTc2NjNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbnRhaW5lckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZUltcGwgCi0JZXh0ZW5kcyBPdmVycmlkZUltcGwgIAotCWltcGxlbWVudHMgTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlCi17CQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JcHJpdmF0ZSBmaW5hbCBMaXN0PE5lc3RhYmxlSm9pbkNvbHVtbj4gam9pbkNvbHVtbnM7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBKb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24gam9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uOwotCQotCXByb3RlY3RlZCBBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5qb2luQ29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8TmVzdGFibGVKb2luQ29sdW1uPigpOwotCQl0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbiA9IG5ldyBKb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CQkKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmluaXRpYWxpemVOZXN0ZWRBbm5vdGF0aW9ucyhhc3RSb290LCB0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZEFubm90YXRpb24pOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBvbGRBc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBvbGRBbm5vdGF0aW9uOwotCQlmb3IgKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob2xkQXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpKSkgewotCQkJTmVzdGFibGVKb2luQ29sdW1uIG5ld0pvaW5Db2x1bW4gPSBhZGRKb2luQ29sdW1uKG9sZEFzc29jaWF0aW9uT3ZlcnJpZGUuaW5kZXhPZkpvaW5Db2x1bW4oam9pbkNvbHVtbikpOwotCQkJbmV3Sm9pbkNvbHVtbi5pbml0aWFsaXplRnJvbSgoTmVzdGFibGVBbm5vdGF0aW9uKSBqb2luQ29sdW1uKTsKLQkJfQotCX0KLQkKLQotCS8vICoqKioqKioqKioqKiogQXNzb2NpYXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPih0aGlzLmpvaW5Db2x1bW5zKTsKLQl9Ci0JCi0JcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZkpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5pbmRleE9mKGpvaW5Db2x1bW4pOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uIGFkZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKE5lc3RhYmxlSm9pbkNvbHVtbikgQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgsIHRoaXMuam9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1BZGRlZChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIGpvaW5Db2x1bW4pOwotCQlyZXR1cm4gam9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEpvaW5Db2x1bW4oaW50IGluZGV4LCBOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBqb2luQ29sdW1uLCB0aGlzLmpvaW5Db2x1bW5zLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5qb2luQ29sdW1ucy5nZXQoaW5kZXgpOwotCQlyZW1vdmVKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQlqb2luQ29sdW1uLnJlbW92ZUFubm90YXRpb24oKTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLnN5bmNoQW5ub3RhdGlvbnNBZnRlclJlbW92ZShpbmRleCwgdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVKb2luQ29sdW1uKE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChqb2luQ29sdW1uLCB0aGlzLmpvaW5Db2x1bW5zLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJbW92ZUpvaW5Db2x1bW5JbnRlcm5hbCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuc3luY2hBbm5vdGF0aW9uc0FmdGVyTW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMuam9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1Nb3ZlZChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5KT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbW92ZUpvaW5Db2x1bW5JbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBOZXN0YWJsZUpvaW5Db2x1bW4gY3JlYXRlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIEpvaW5Db2x1bW5JbXBsLmNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGVKb2luQ29sdW1uKGdldERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSwgdGhpcywgZ2V0TWVtYmVyKCksIGluZGV4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKLQkJdGhpcy51cGRhdGVKb2luQ29sdW1uc0Zyb21KYXZhKGFzdFJvb3QpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlSm9pbkNvbHVtbnNGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMudXBkYXRlTmVzdGVkQW5ub3RhdGlvbnNGcm9tSmF2YShhc3RSb290LCB0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlzdGF0aWMgQXNzb2NpYXRpb25PdmVycmlkZUltcGwgY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUikpOwotCX0KLQotCXN0YXRpYyBBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCBjcmVhdGVOZXN0ZWRBc3NvY2lhdGlvbk92ZXJyaWRlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlcikgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGlkYWEpOwotCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKHBhcmVudCwgbWVtYmVyLCBpZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlciwgaW5kZXgsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIAotCQlpbXBsZW1lbnRzIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVKb2luQ29sdW1uPiAKLQl7Ci0JCXB1YmxpYyBKb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24oKSB7Ci0JCQlzdXBlcihBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCS8vbm90aGluZyB0byBpbml0aWFsaXplCi0JCX0KLQkJCi0JCXB1YmxpYyBOZXN0YWJsZUpvaW5Db2x1bW4gYWRkSW50ZXJuYWwoaW50IGluZGV4KSB7Ci0JCQlOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLnRoaXMuY3JlYXRlSm9pbkNvbHVtbihpbmRleCk7Ci0JCQlBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzLmpvaW5Db2x1bW5zLmFkZChpbmRleCwgam9pbkNvbHVtbik7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBhZGQoaW50IGluZGV4KSB7Ci0JCQlOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLnRoaXMuY3JlYXRlSm9pbkNvbHVtbihpbmRleCk7Ci0JCQlBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzLmFkZEpvaW5Db2x1bW4oaW5kZXgsIGpvaW5Db2x1bW4pOwotCQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaW5kZXhPZihOZXN0YWJsZUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gQXNzb2NpYXRpb25PdmVycmlkZUltcGwudGhpcy5pbmRleE9mSm9pbkNvbHVtbihwa0pvaW5Db2x1bW4pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJQXNzb2NpYXRpb25PdmVycmlkZUltcGwudGhpcy5tb3ZlSm9pbkNvbHVtbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW92ZUludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCQlBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzLm1vdmVKb2luQ29sdW1uSW50ZXJuYWwodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQkKLQkJfQotCQkKLQkJcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBuZXN0ZWRBbm5vdGF0aW9uQXQoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gQXNzb2NpYXRpb25PdmVycmlkZUltcGwudGhpcy5qb2luQ29sdW1uQXQoaW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZUpvaW5Db2x1bW4+IG5lc3RlZEFubm90YXRpb25zKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZUpvaW5Db2x1bW4+KEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLnRoaXMuam9pbkNvbHVtbnMpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQl0aGlzLnJlbW92ZShuZXN0ZWRBbm5vdGF0aW9uQXQoaW5kZXgpKTsKLQkJfQkJCi0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzLnJlbW92ZUpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLnRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBKUEEuSk9JTl9DT0xVTU47Ci0JCX0KLQotCQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uIG5lc3RlZEFubm90YXRpb25Gb3Iob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQkJZm9yIChOZXN0YWJsZUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG5lc3RlZEFubm90YXRpb25zKCkpKSB7Ci0JCQkJaWYgKGpkdEFubm90YXRpb24gPT0gcGtKb2luQ29sdW1uLmdldEpkdEFubm90YXRpb24oKENvbXBpbGF0aW9uVW5pdCkgamR0QW5ub3RhdGlvbi5nZXRSb290KCkpKSB7Ci0JCQkJCXJldHVybiBwa0pvaW5Db2x1bW47Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLnRoaXMuZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCQlBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzLm5ld0Fubm90YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCQlBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzLnJlbW92ZUFubm90YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC50aGlzLnVwZGF0ZUZyb21KYXZhKGFzdFJvb3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLnRoaXMuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQkJcmV0dXJuICJqb2luQ29sdW1ucyI7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLmNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGUocGFyZW50LCBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZDE4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlczFfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlczFfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlczFfMEFubm90YXRpb24ocGFyZW50LCBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlczFfMEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YmU3MmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZXNJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248TWVtYmVyPiBpbXBsZW1lbnRzIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbgotewkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByb3RlY3RlZCBmaW5hbCBMaXN0PE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXM7Ci0JCi0JcHJvdGVjdGVkIEFzc29jaWF0aW9uT3ZlcnJpZGVzSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8TmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlPigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmluaXRpYWxpemVOZXN0ZWRBbm5vdGF0aW9ucyhhc3RSb290LCB0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZT4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlPih0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzLnNpemUoKTsKLQl9CQotCi0JcHVibGljIE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZSBhZGRJbnRlcm5hbChpbnQgaW5kZXgpIHsKLQkJTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlKGluZGV4KTsKLQkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlcy5hZGQoaW5kZXgsIGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlyZXR1cm4gYXNzb2NpYXRpb25PdmVycmlkZTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZSBhZGQoaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZShpbmRleCk7Ci0JCWFkZChpbmRleCwgYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkKGludCBpbmRleCwgTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgYXNzb2NpYXRpb25PdmVycmlkZSwgdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlcywgQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoYXNzb2NpYXRpb25PdmVycmlkZSwgdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlcywgQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlcywgQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgaW50IGluZGV4T2YoTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJcmV0dXJuIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMuaW5kZXhPZihhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZSBuZXN0ZWRBbm5vdGF0aW9uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGUgbmVzdGVkQW5ub3RhdGlvbkZvcihBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJZm9yIChOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA6IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMpIHsKLQkJCWlmIChqZHRBbm5vdGF0aW9uID09IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0SmR0QW5ub3RhdGlvbigoQ29tcGlsYXRpb25Vbml0KSBqZHRBbm5vdGF0aW9uLmdldFJvb3QoKSkpIHsKLQkJCQlyZXR1cm4gYXNzb2NpYXRpb25PdmVycmlkZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQltb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMsIEFTU09DSUFUSU9OX09WRVJSSURFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZUludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gInZhbHVlIjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMudXBkYXRlTmVzdGVkQW5ub3RhdGlvbnNGcm9tSmF2YShhc3RSb290LCB0aGlzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlKGludCBpbmRleCkgewotCQlyZXR1cm4gQXNzb2NpYXRpb25PdmVycmlkZUltcGwuY3JlYXRlTmVzdGVkQXNzb2NpYXRpb25PdmVycmlkZSh0aGlzLCBnZXRNZW1iZXIoKSwgaW5kZXgsIGdldERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVzSW1wbChwYXJlbnQsIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2I4M2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5BdHRyaWJ1dGVPdmVycmlkZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBTb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uYnVpbGRBdHRyaWJ1dGVPdmVycmlkZShwYXJlbnQsIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZjljMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVJbXBsIAotCWV4dGVuZHMgT3ZlcnJpZGVJbXBsCi0JaW1wbGVtZW50cyBOZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlCi17CQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgZmluYWwgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIgY29sdW1uQWRhcHRlcjsKLQkJCi0JcHJpdmF0ZSBDb2x1bW5JbXBsIGNvbHVtbjsKLQkKLQkKLQlwcm90ZWN0ZWQgQXR0cmlidXRlT3ZlcnJpZGVJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBtZW1iZXIsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmNvbHVtbkFkYXB0ZXIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIoZ2V0TWVtYmVyKCksIENvbHVtbkltcGwuYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BZGFwdGVyKGdldERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJaWYgKHRoaXMuY29sdW1uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpICE9IG51bGwpIHsKLQkJCXRoaXMuY29sdW1uID0gQ29sdW1uSW1wbC5jcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbih0aGlzLCBnZXRNZW1iZXIoKSwgZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpKTsKLQkJCXRoaXMuY29sdW1uLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZEFubm90YXRpb24pOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gb2xkQXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBvbGRBbm5vdGF0aW9uOwotCQlpZiAob2xkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkgIT0gbnVsbCkgewotCQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSBhZGRDb2x1bW4oKTsKLQkJCSgoTmVzdGFibGVBbm5vdGF0aW9uKSBjb2x1bW4pLmluaXRpYWxpemVGcm9tKChOZXN0YWJsZUFubm90YXRpb24pIG9sZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpKTsKLQkJfQotCX0KLQkKLQkvLyoqKioqKioqKioqKiBBdHRyaWJ1dGVPdmVycmlkZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Tm9uTnVsbENvbHVtbigpIHsKLQkJcmV0dXJuIChnZXRDb2x1bW4oKSAhPSBudWxsKSA/IGdldENvbHVtbigpIDogbmV3IE51bGxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbih0aGlzKTsKLQl9Ci0JCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGFkZENvbHVtbigpIHsKLQkJQ29sdW1uSW1wbCBjb2x1bW4gPSBDb2x1bW5JbXBsLmNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uKHRoaXMsIGdldE1lbWJlcigpLCBnZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCkpOwotCQljb2x1bW4ubmV3QW5ub3RhdGlvbigpOwotCQlzZXRDb2x1bW4oY29sdW1uKTsKLQkJcmV0dXJuIGNvbHVtbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uKCkgewotCQl0aGlzLmNvbHVtbi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXNldENvbHVtbihudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29sdW1uKENvbHVtbkltcGwgbmV3Q29sdW1uKSB7Ci0JCUNvbHVtbkltcGwgb2xkQ29sdW1uID0gdGhpcy5jb2x1bW47Ci0JCXRoaXMuY29sdW1uID0gbmV3Q29sdW1uOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5DT0xVTU5fUFJPUEVSVFksIG9sZENvbHVtbiwgbmV3Q29sdW1uKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlRnJvbUphdmEoYXN0Um9vdCk7Ci0JCWlmICh0aGlzLmNvbHVtbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihhc3RSb290KSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldENvbHVtbihudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChnZXRDb2x1bW4oKSAhPSBudWxsKSB7Ci0JCQkJZ2V0Q29sdW1uKCkudXBkYXRlRnJvbUphdmEoYXN0Um9vdCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlDb2x1bW5JbXBsIGNvbHVtbiA9IENvbHVtbkltcGwuY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4odGhpcywgZ2V0TWVtYmVyKCksIGdldERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSk7Ci0JCQkJY29sdW1uLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCQkJdGhpcy5zZXRDb2x1bW4oY29sdW1uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXN0YXRpYyBBdHRyaWJ1dGVPdmVycmlkZUltcGwgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGUoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVPdmVycmlkZUltcGwocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKSk7Ci0JfQotCi0Jc3RhdGljIEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCBjcmVhdGVOZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGF0dHJpYnV0ZU92ZXJyaWRlc0FkYXB0ZXIpIHsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IGJ1aWxkTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlcik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBpZGFhKTsKLQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVPdmVycmlkZUltcGwocGFyZW50LCBtZW1iZXIsIGlkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGF0dHJpYnV0ZU92ZXJyaWRlc0FkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyLCBpbmRleCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBBdHRyaWJ1dGVPdmVycmlkZUltcGwuY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGUocGFyZW50LCBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Yzg5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5BdHRyaWJ1dGVPdmVycmlkZXMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24ocGFyZW50LCBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5QXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlc0ltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhjYmZmNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVzSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPE1lbWJlcj4gaW1wbGVtZW50cyBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uCi17CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBmaW5hbCBMaXN0PE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZXNPdmVycmlkZXM7Ci0JCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlc0ltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJc3VwZXIocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMuYXR0cmlidXRlc092ZXJyaWRlcyA9IG5ldyBBcnJheUxpc3Q8TmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZT4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5pbml0aWFsaXplTmVzdGVkQW5ub3RhdGlvbnMoYXN0Um9vdCwgdGhpcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZT4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZT4odGhpcy5hdHRyaWJ1dGVzT3ZlcnJpZGVzKTsKLQl9Ci0JCi0JcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZXNPdmVycmlkZXMuc2l6ZSgpOwotCX0JCi0KLQlwdWJsaWMgTmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZSBhZGRJbnRlcm5hbChpbnQgaW5kZXgpIHsKLQkJTmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlKGluZGV4KTsKLQkJdGhpcy5hdHRyaWJ1dGVzT3ZlcnJpZGVzLmFkZChpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGUpOwkKLQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZSBhZGQoaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZShpbmRleCk7Ci0JCWFkZChpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGUpOwotCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGQoaW50IGluZGV4LCBOZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGF0dHJpYnV0ZU92ZXJyaWRlLCB0aGlzLmF0dHJpYnV0ZXNPdmVycmlkZXMsIEFUVFJJQlVURV9PVkVSUklERVNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGF0dHJpYnV0ZU92ZXJyaWRlLCB0aGlzLmF0dHJpYnV0ZXNPdmVycmlkZXMsIEFUVFJJQlVURV9PVkVSUklERVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLmF0dHJpYnV0ZXNPdmVycmlkZXMsIEFUVFJJQlVURV9PVkVSUklERVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZihOZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZXNPdmVycmlkZXMuaW5kZXhPZihhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlIG5lc3RlZEFubm90YXRpb25BdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlc092ZXJyaWRlcy5nZXQoaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZSBuZXN0ZWRBbm5vdGF0aW9uRm9yKEFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlmb3IgKE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgOiB0aGlzLmF0dHJpYnV0ZXNPdmVycmlkZXMpIHsKLQkJCWlmIChqZHRBbm5vdGF0aW9uID09IGF0dHJpYnV0ZU92ZXJyaWRlLmdldEpkdEFubm90YXRpb24oKENvbXBpbGF0aW9uVW5pdCkgamR0QW5ub3RhdGlvbi5nZXRSb290KCkpKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5hdHRyaWJ1dGVzT3ZlcnJpZGVzLCBBVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5hdHRyaWJ1dGVzT3ZlcnJpZGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiAidmFsdWUiOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy51cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKGFzdFJvb3QsIHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIEF0dHJpYnV0ZU92ZXJyaWRlSW1wbC5jcmVhdGVOZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZSh0aGlzLCBnZXRNZW1iZXIoKSwgaW5kZXgsIGdldERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSk7Ci0JfQotCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgQXR0cmlidXRlT3ZlcnJpZGVzSW1wbChwYXJlbnQsIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9CYXNlQ29sdW1uSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQmFzZUNvbHVtbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4MDQ2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9CYXNlQ29sdW1uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5CYXNlQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUNvbHVtbkltcGwgZXh0ZW5kcyBBYnN0cmFjdE5hbWVkQ29sdW1uIGltcGxlbWVudHMgQmFzZUNvbHVtbkFubm90YXRpb24KLXsKLQkvLyBob2xkIHRoaXMgc28gd2UgY2FuIGdldCB0aGUgJ3RhYmxlJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRhYmxlRGVjbGFyYXRpb25BZGFwdGVyOwotCQotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAndW5pcXVlJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiB1bmlxdWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdudWxsYWJsZScgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gbnVsbGFibGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdpbnNlcnRhYmxlJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBpbnNlcnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyOwotCQotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAndXBkYXRhYmxlJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiB1cGRhdGFibGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRhYmxlQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHVuaXF1ZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBudWxsYWJsZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBpbnNlcnRhYmxlQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHVwZGF0YWJsZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWJsZTsKLQlwcml2YXRlIEJvb2xlYW4gdW5pcXVlOwotCXByaXZhdGUgQm9vbGVhbiBudWxsYWJsZTsKLQlwcml2YXRlIEJvb2xlYW4gaW5zZXJ0YWJsZTsKLQlwcml2YXRlIEJvb2xlYW4gdXBkYXRhYmxlOwotCQotCi0JcHVibGljIEJhc2VDb2x1bW5JbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQl0aGlzKHBhcmVudCwgbWVtYmVyLCBkYWEsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGRhYSkpOwotCX0KLQkKLQlwdWJsaWMgQmFzZUNvbHVtbkltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMudGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIodGhpcy50YWJsZUVsZW1lbnROYW1lKCkpOwotCQl0aGlzLnRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRFbGVtZW50QWRhcHRlcih0aGlzLnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy51bmlxdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMudW5pcXVlRWxlbWVudE5hbWUoKSk7Ci0JCXRoaXMudW5pcXVlQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy51bmlxdWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm51bGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLm51bGxhYmxlRWxlbWVudE5hbWUoKSk7Ci0JCXRoaXMubnVsbGFibGVBZGFwdGVyID0gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLm51bGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5pbnNlcnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLmluc2VydGFibGVFbGVtZW50TmFtZSgpKTsKLQkJdGhpcy5pbnNlcnRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy5pbnNlcnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy51cGRhdGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMudXBkYXRhYmxlRWxlbWVudE5hbWUoKSk7Ci0JCXRoaXMudXBkYXRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy51cGRhdGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMudGFibGUgPSB0aGlzLnRhYmxlKGFzdFJvb3QpOwotCQl0aGlzLnVuaXF1ZSA9IHRoaXMudW5pcXVlKGFzdFJvb3QpOwotCQl0aGlzLm51bGxhYmxlID0gdGhpcy5udWxsYWJsZShhc3RSb290KTsKLQkJdGhpcy5pbnNlcnRhYmxlID0gdGhpcy5pbnNlcnRhYmxlKGFzdFJvb3QpOwotCQl0aGlzLnVwZGF0YWJsZSA9IHRoaXMudXBkYXRhYmxlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIHRhYmxlRWxlbWVudE5hbWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgdW5pcXVlRWxlbWVudE5hbWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgbnVsbGFibGVFbGVtZW50TmFtZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBpbnNlcnRhYmxlRWxlbWVudE5hbWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgdXBkYXRhYmxlRWxlbWVudE5hbWUoKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZEFubm90YXRpb24pOwotCQlCYXNlQ29sdW1uQW5ub3RhdGlvbiBvbGRDb2x1bW4gPSAoQmFzZUNvbHVtbkFubm90YXRpb24pIG9sZEFubm90YXRpb247Ci0JCXNldFRhYmxlKG9sZENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJc2V0VW5pcXVlKG9sZENvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JCXNldE51bGxhYmxlKG9sZENvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQkJc2V0SW5zZXJ0YWJsZShvbGRDb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJc2V0VXBkYXRhYmxlKG9sZENvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JfQotCi0JLy8qKioqKioqKioqKioqIEFic3RyYWN0Q29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZShTdHJpbmcgbmV3VGFibGUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnRhYmxlLCBuZXdUYWJsZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkVGFibGUgPSB0aGlzLnRhYmxlOwotCQl0aGlzLnRhYmxlID0gbmV3VGFibGU7Ci0JCXRoaXMudGFibGVBZGFwdGVyLnNldFZhbHVlKG5ld1RhYmxlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUQUJMRV9QUk9QRVJUWSwgb2xkVGFibGUsIG5ld1RhYmxlKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0VW5pcXVlKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5pcXVlKEJvb2xlYW4gbmV3VW5pcXVlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy51bmlxdWUsIG5ld1VuaXF1ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlCb29sZWFuIG9sZFVuaXF1ZSA9IHRoaXMudW5pcXVlOwotCQl0aGlzLnVuaXF1ZSA9IG5ld1VuaXF1ZTsKLQkJdGhpcy51bmlxdWVBZGFwdGVyLnNldFZhbHVlKG5ld1VuaXF1ZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVU5JUVVFX1BST1BFUlRZLCBvbGRVbmlxdWUsIG5ld1VuaXF1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0TnVsbGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm51bGxhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE51bGxhYmxlKEJvb2xlYW4gbmV3TnVsbGFibGUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm51bGxhYmxlLCBuZXdOdWxsYWJsZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlCb29sZWFuIG9sZE51bGxhYmxlID0gdGhpcy5udWxsYWJsZTsKLQkJdGhpcy5udWxsYWJsZSA9IG5ld051bGxhYmxlOwotCQl0aGlzLm51bGxhYmxlQWRhcHRlci5zZXRWYWx1ZShuZXdOdWxsYWJsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTlVMTEFCTEVfUFJPUEVSVFksIG9sZE51bGxhYmxlLCBuZXdOdWxsYWJsZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuaW5zZXJ0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRhYmxlKEJvb2xlYW4gbmV3SW5zZXJ0YWJsZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuaW5zZXJ0YWJsZSwgbmV3SW5zZXJ0YWJsZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlCb29sZWFuIG9sZEluc2VydGFibGUgPSB0aGlzLmluc2VydGFibGU7Ci0JCXRoaXMuaW5zZXJ0YWJsZSA9IG5ld0luc2VydGFibGU7Ci0JCXRoaXMuaW5zZXJ0YWJsZUFkYXB0ZXIuc2V0VmFsdWUobmV3SW5zZXJ0YWJsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSU5TRVJUQUJMRV9QUk9QRVJUWSwgb2xkSW5zZXJ0YWJsZSwgbmV3SW5zZXJ0YWJsZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0VXBkYXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy51cGRhdGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gbmV3VXBkYXRhYmxlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy51cGRhdGFibGUsIG5ld1VwZGF0YWJsZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlCb29sZWFuIG9sZFVwZGF0YWJsZSA9IHRoaXMudXBkYXRhYmxlOwotCQl0aGlzLnVwZGF0YWJsZSA9IG5ld1VwZGF0YWJsZTsKLQkJdGhpcy51cGRhdGFibGVBZGFwdGVyLnNldFZhbHVlKG5ld1VwZGF0YWJsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVVBEQVRBQkxFX1BST1BFUlRZLCBvbGRVcGRhdGFibGUsIG5ld1VwZGF0YWJsZSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROdWxsYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubnVsbGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEluc2VydGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmluc2VydGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFVuaXF1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudW5pcXVlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRVcGRhdGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnVwZGF0YWJsZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdGFibGVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMudGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKLQkJdGhpcy5zZXRUYWJsZSh0aGlzLnRhYmxlKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRVbmlxdWUodGhpcy51bmlxdWUoYXN0Um9vdCkpOwotCQl0aGlzLnNldE51bGxhYmxlKHRoaXMubnVsbGFibGUoYXN0Um9vdCkpOwotCQl0aGlzLnNldEluc2VydGFibGUodGhpcy5pbnNlcnRhYmxlKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRVcGRhdGFibGUodGhpcy51cGRhdGFibGUoYXN0Um9vdCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHRhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gdW5pcXVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIG51bGxhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm51bGxhYmxlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gaW5zZXJ0YWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5pbnNlcnRhYmxlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gdXBkYXRhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnVwZGF0YWJsZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9CYXNpY0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9CYXNpY0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg5YWE3MQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Jhc2ljQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlCYXNpY0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQmFzaWNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYworICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmFzaWNBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBCYXNpY0Fubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEJhc2ljQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlQmFzaWNBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IE51bGxCYXNpY0Fubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5QmFzaWNBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQmFzaWNJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9CYXNpY0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxOWNhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9CYXNpY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi0KLXB1YmxpYyBjbGFzcyBCYXNpY0ltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+IGltcGxlbWVudHMgQmFzaWNBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gb3B0aW9uYWxBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmZXRjaEFkYXB0ZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBPUFRJT05BTF9BREFQVEVSID0gYnVpbGRPcHRpb25hbEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gRkVUQ0hfQURBUFRFUiA9IGJ1aWxkRmV0Y2hBZGFwdGVyKCk7Ci0JCi0JcHJpdmF0ZSBCb29sZWFuIG9wdGlvbmFsOwotCQotCXByaXZhdGUgRmV0Y2hUeXBlIGZldGNoOwotCQotCXByb3RlY3RlZCBCYXNpY0ltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMub3B0aW9uYWxBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhdHRyaWJ1dGUsIE9QVElPTkFMX0FEQVBURVIpOwotCQl0aGlzLmZldGNoQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhdHRyaWJ1dGUsIEZFVENIX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMub3B0aW9uYWwgPSB0aGlzLm9wdGlvbmFsKGFzdFJvb3QpOwotCQl0aGlzLmZldGNoID0gdGhpcy5mZXRjaChhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKiogQmFzaWMgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25hbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMub3B0aW9uYWwsIG5ld09wdGlvbmFsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUJvb2xlYW4gb2xkT3B0aW9uYWwgPSB0aGlzLm9wdGlvbmFsOwotCQl0aGlzLm9wdGlvbmFsID0gbmV3T3B0aW9uYWw7Ci0JCXRoaXMub3B0aW9uYWxBZGFwdGVyLnNldFZhbHVlKG5ld09wdGlvbmFsKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChPUFRJT05BTF9QUk9QRVJUWSwgb2xkT3B0aW9uYWwsIG5ld09wdGlvbmFsKTsKLQl9Ci0KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5mZXRjaDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5mZXRjaCwgbmV3RmV0Y2gpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRmV0Y2hUeXBlIG9sZEZldGNoID0gdGhpcy5mZXRjaDsKLQkJdGhpcy5mZXRjaCA9IG5ld0ZldGNoOwotCQl0aGlzLmZldGNoQWRhcHRlci5zZXRWYWx1ZShGZXRjaFR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKG5ld0ZldGNoKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRkVUQ0hfUFJPUEVSVFksIG9sZEZldGNoLCBuZXdGZXRjaCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShGRVRDSF9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKE9QVElPTkFMX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc2V0T3B0aW9uYWwodGhpcy5vcHRpb25hbChhc3RSb290KSk7Ci0JCXRoaXMuc2V0RmV0Y2godGhpcy5mZXRjaChhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCBGZXRjaFR5cGUgZmV0Y2goQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIEZldGNoVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmZldGNoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIG9wdGlvbmFsKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbmFsQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRPcHRpb25hbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkJBU0lDX19PUFRJT05BTCwgZmFsc2UsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRGZXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkJBU0lDX19GRVRDSCwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEJhc2ljQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEJhc2ljQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQmFzaWNBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQmFzaWNBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgQmFzaWNBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgQmFzaWNJbXBsKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTnVsbEJhc2ljKHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5Yzk4NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5Q29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VDb2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlciwgU291cmNlQ29sdW1uQW5ub3RhdGlvbi5NQVBQSU5HX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IE51bGxDb2x1bW5Bbm5vdGF0aW9uKHBhcmVudCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5Q29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbHVtbkltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbHVtbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZWQ2Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db2x1bW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi1wdWJsaWMgY2xhc3MgQ29sdW1uSW1wbCBleHRlbmRzIEJhc2VDb2x1bW5JbXBsIGltcGxlbWVudHMgQ29sdW1uQW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gdGhpcyBhZGFwdGVyIGlzIG9ubHkgdXNlZCBieSBhIENvbHVtbiBhbm5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIG1hcHBpbmcgYW5ub3RhdGlvbiAoZS5nLiBCYXNpYykKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgTUFQUElOR19ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdsZW5ndGgnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGxlbmd0aERlY2xhcmF0aW9uQWRhcHRlcjsKLQkKLQkvLyBob2xkIHRoaXMgc28gd2UgY2FuIGdldCB0aGUgJ3ByZWNpc2lvbicgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gcHJlY2lzaW9uRGVjbGFyYXRpb25BZGFwdGVyOwotCQotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAnc2NhbGUnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IHNjYWxlRGVjbGFyYXRpb25BZGFwdGVyOwotCQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGxlbmd0aEFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBwcmVjaXNpb25BZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gc2NhbGVBZGFwdGVyOwotCi0JcHJpdmF0ZSBJbnRlZ2VyIGxlbmd0aDsKLQkKLQlwcml2YXRlIEludGVnZXIgcHJlY2lzaW9uOwotCQotCXByaXZhdGUgSW50ZWdlciBzY2FsZTsKLQkKLQlwcm90ZWN0ZWQgQ29sdW1uSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBtZW1iZXIsIGRhYSk7Ci0JCXRoaXMubGVuZ3RoRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZEludGVnZXJFbGVtZW50QWRhcHRlcihKUEEuQ09MVU1OX19MRU5HVEgpOwotCQl0aGlzLmxlbmd0aEFkYXB0ZXIgPSB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0SW50ZWdlckVsZW1lbnRBZGFwdGVyKHRoaXMubGVuZ3RoRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5wcmVjaXNpb25EZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkSW50ZWdlckVsZW1lbnRBZGFwdGVyKEpQQS5DT0xVTU5fX1BSRUNJU0lPTik7Ci0JCXRoaXMucHJlY2lzaW9uQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRJbnRlZ2VyRWxlbWVudEFkYXB0ZXIodGhpcy5wcmVjaXNpb25EZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLnNjYWxlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZEludGVnZXJFbGVtZW50QWRhcHRlcihKUEEuQ09MVU1OX19TQ0FMRSk7Ci0JCXRoaXMuc2NhbGVBZGFwdGVyID0gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEludGVnZXJFbGVtZW50QWRhcHRlcih0aGlzLnNjYWxlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLmxlbmd0aCA9IHRoaXMubGVuZ3RoKGFzdFJvb3QpOwotCQl0aGlzLnByZWNpc2lvbiA9IHRoaXMucHJlY2lzaW9uKGFzdFJvb3QpOwotCQl0aGlzLnNjYWxlID0gdGhpcy5zY2FsZShhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQ09MVU1OX19OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbHVtbkRlZmluaXRpb25FbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHRhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQ09MVU1OX19UQUJMRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHVuaXF1ZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fVU5JUVVFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgbnVsbGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5DT0xVTU5fX05VTExBQkxFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgaW5zZXJ0YWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fSU5TRVJUQUJMRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHVwZGF0YWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fVVBEQVRBQkxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCkgewotCQkvL1RPRE8gbW92ZSBtYWtlcyBubyBzZW5zZSBmb3IgQ29sdW1uLiAgbWF5YmUgTmVzdGFibGVBbm5vdGF0aW9uCi0JCS8vbmVlZHMgdG8gYmUgc3BsaXQgdXAgYW5kIHdlIGNvdWxkIGhhdmUgSW5kZXhhYmxlQW5ub3RhdGlvbgotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShOZXN0YWJsZUFubm90YXRpb24gb2xkQW5ub3RhdGlvbikgewotCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRBbm5vdGF0aW9uKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBvbGRDb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKLQkJc2V0TGVuZ3RoKG9sZENvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCXNldFByZWNpc2lvbihvbGRDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlzZXRTY2FsZShvbGRDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKiogQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKEludGVnZXIgbmV3TGVuZ3RoKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5sZW5ndGgsIG5ld0xlbmd0aCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJbnRlZ2VyIG9sZExlbmd0aCA9IHRoaXMubGVuZ3RoOwotCQl0aGlzLmxlbmd0aCA9IG5ld0xlbmd0aDsKLQkJdGhpcy5sZW5ndGhBZGFwdGVyLnNldFZhbHVlKG5ld0xlbmd0aCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTEVOR1RIX1BST1BFUlRZLCBvbGRMZW5ndGgsIG5ld0xlbmd0aCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0UHJlY2lzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5wcmVjaXNpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJlY2lzaW9uKEludGVnZXIgbmV3UHJlY2lzaW9uKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5wcmVjaXNpb24sIG5ld1ByZWNpc2lvbikpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJbnRlZ2VyIG9sZFByZWNpc2lvbiA9IHRoaXMucHJlY2lzaW9uOwotCQl0aGlzLnByZWNpc2lvbiA9IG5ld1ByZWNpc2lvbjsKLQkJdGhpcy5wcmVjaXNpb25BZGFwdGVyLnNldFZhbHVlKG5ld1ByZWNpc2lvbik7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJFQ0lTSU9OX1BST1BFUlRZLCBvbGRQcmVjaXNpb24sIG5ld1ByZWNpc2lvbik7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U2NhbGUoKSB7Ci0JCXJldHVybiB0aGlzLnNjYWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjYWxlKEludGVnZXIgbmV3U2NhbGUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnNjYWxlLCBuZXdTY2FsZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJbnRlZ2VyIG9sZFNjYWxlID0gdGhpcy5zY2FsZTsKLQkJdGhpcy5zY2FsZSA9IG5ld1NjYWxlOwotCQl0aGlzLnNjYWxlQWRhcHRlci5zZXRWYWx1ZShuZXdTY2FsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0NBTEVfUFJPUEVSVFksIG9sZFNjYWxlLCBuZXdTY2FsZSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TGVuZ3RoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5sZW5ndGhEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFByZWNpc2lvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMucHJlY2lzaW9uRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY2FsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuc2NhbGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnVwZGF0ZUZyb21KYXZhKGFzdFJvb3QpOwotCQl0aGlzLnNldExlbmd0aCh0aGlzLmxlbmd0aChhc3RSb290KSk7Ci0JCXRoaXMuc2V0UHJlY2lzaW9uKHRoaXMucHJlY2lzaW9uKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRTY2FsZSh0aGlzLnNjYWxlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBsZW5ndGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9CQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIHByZWNpc2lvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5wcmVjaXNpb25BZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0JCi0JCi0JcHJvdGVjdGVkIEludGVnZXIgc2NhbGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuc2NhbGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXN0YXRpYyBDb2x1bW5JbXBsIGNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb2x1bW5JbXBsKHBhcmVudCwgbWVtYmVyLCBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIoYXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlcikpOwotCX0KLQotCXN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVfX0NPTFVNTiwgSlBBLkNPTFVNTik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbHVtbkFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IENvbHVtbkFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBDb2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgQ29sdW1uSW1wbChwYXJlbnQsIG1lbWJlciwgQ29sdW1uSW1wbC5NQVBQSU5HX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTnVsbENvbHVtbihwYXJlbnQpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnRhaW5lckFubm90YXRpb25Ub29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMTZlNzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbnRhaW5lckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzCi17Ci0JCi0JcHVibGljIHN0YXRpYyBOZXN0YWJsZUFubm90YXRpb24gYWRkTmVzdGVkQW5ub3RhdGlvbihpbnQgaW5kZXgsIENvbnRhaW5lckFubm90YXRpb248PyBleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbj4gY29udGFpbmVyQW5ub3RhdGlvbikgewotCQlpbnQgc2l6ZSA9IGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbnNTaXplKCk7Ci0JCU5lc3RhYmxlQW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uID0gY29udGFpbmVyQW5ub3RhdGlvbi5hZGRJbnRlcm5hbChzaXplKTsKLQkJbmVzdGVkQW5ub3RhdGlvbi5uZXdBbm5vdGF0aW9uKCk7Ci0JCWNvbnRhaW5lckFubm90YXRpb24ubW92ZUludGVybmFsKGluZGV4LCBzaXplKTsKLQkJc3luY2hBbm5vdGF0aW9uc0FmdGVyTW92ZShpbmRleCwgc2l6ZSwgY29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCXJldHVybiBuZXN0ZWRBbm5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIHN5bmNocm9uaXplIHRoZSBzb3VyY2UgYW5ub3RhdGlvbnMgd2l0aCB0aGUgbW9kZWwgbmVzdGFibGVBbm5vdGF0aW9ucywKLQkgKiBzdGFydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IHRvIHByZXZlbnQgb3ZlcmxhcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzeW5jaEFubm90YXRpb25zQWZ0ZXJBZGQoaW50IGluZGV4LCBDb250YWluZXJBbm5vdGF0aW9uPD8gZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+IGNvbnRhaW5lckFubm90YXRpb24pIHsKLQkJTGlzdDxOZXN0YWJsZUFubm90YXRpb24+IG5lc3RhYmxlQW5ub3RhdGlvbnMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChjb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25zKCkpOwotCQlmb3IgKGludCBpID0gbmVzdGFibGVBbm5vdGF0aW9ucy5zaXplKCk7IGktLSA+IGluZGV4OykgewotCQkJc3luY2gobmVzdGFibGVBbm5vdGF0aW9ucy5nZXQoaSksIGkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIHN5bmNocm9uaXplIHRoZSBzb3VyY2UgYW5ub3RhdGlvbnMgd2l0aCB0aGUgbW9kZWwgbmVzdGFibGVBbm5vdGF0aW9ucywKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIHByZXZlbnQgb3ZlcmxhcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzeW5jaEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW50IGluZGV4LCBDb250YWluZXJBbm5vdGF0aW9uPD8gZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+IHBsdXJhbEFubm90YXRpb24pIHsKLQkJTGlzdDxOZXN0YWJsZUFubm90YXRpb24+IG5lc3RhYmxlQW5ub3RhdGlvbnMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChwbHVyYWxBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25zKCkpOwotCQlmb3IgKGludCBpID0gaW5kZXg7IGkgPCBuZXN0YWJsZUFubm90YXRpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlzeW5jaChuZXN0YWJsZUFubm90YXRpb25zLmdldChpKSwgaSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzeW5jaChOZXN0YWJsZUFubm90YXRpb24gbmVzdGFibGVBbm5vdGF0aW9uLCBpbnQgaW5kZXgpIHsKLQkJbmVzdGFibGVBbm5vdGF0aW9uLm1vdmVBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0JCi0JLyoqCi0JICogc3luY2hyb25pemUgdGhlIGFubm90YXRpb25zIHdpdGggdGhlIG1vZGVsIG5lc3RhYmxlQW5ub3RhdGlvbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3luY2hBbm5vdGF0aW9uc0FmdGVyTW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgQ29udGFpbmVyQW5ub3RhdGlvbjw/IGV4dGVuZHMgTmVzdGFibGVBbm5vdGF0aW9uPiBjb250YWluZXJBbm5vdGF0aW9uKSB7Ci0JCU5lc3RhYmxlQW5ub3RhdGlvbiBuZXN0YWJsZUFubm90YXRpb24gPSBjb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25BdCh0YXJnZXRJbmRleCk7Ci0JCQotCQlzeW5jaChuZXN0YWJsZUFubm90YXRpb24sIGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbnNTaXplKCkpOwotCQkKLQkJTGlzdDxOZXN0YWJsZUFubm90YXRpb24+IG5lc3RhYmxlQW5ub3RhdGlvbnMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChjb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25zKCkpOwotCQlpZiAoc291cmNlSW5kZXggPCB0YXJnZXRJbmRleCkgewotCQkJZm9yIChpbnQgaSA9IHNvdXJjZUluZGV4OyBpIDwgdGFyZ2V0SW5kZXg7IGkrKykgewotCQkJCXN5bmNoKG5lc3RhYmxlQW5ub3RhdGlvbnMuZ2V0KGkpLCBpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaSA+IHRhcmdldEluZGV4OyBpLS0gKSB7Ci0JCQkJc3luY2gobmVzdGFibGVBbm5vdGF0aW9ucy5nZXQoaSksIGkpOwkJCQotCQkJfQotCQl9Ci0JCXN5bmNoKG5lc3RhYmxlQW5ub3RhdGlvbiwgdGFyZ2V0SW5kZXgpOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZU5lc3RlZEFubm90YXRpb25zKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBDb250YWluZXJBbm5vdGF0aW9uPD8+IGNvbnRhaW5lckFubm90YXRpb24pIHsKLQkJYWRkQW5ub3RhdGlvbnNGcm9tU291cmNlKGFzdFJvb3QsIGNvbnRhaW5lckFubm90YXRpb24pOwotCX0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRBbm5vdGF0aW9uc0Zyb21Tb3VyY2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QsIENvbnRhaW5lckFubm90YXRpb248PyBleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbj4gY29udGFpbmVyQW5ub3RhdGlvbikgewotCQljb250YWluZXJBbm5vdGF0aW9uLmdldEpkdEFubm90YXRpb24oYXN0Um9vdCkuYWNjZXB0KGluaXRpYWxKYXZhTWVtYmVyQW5ub3RhdGlvbkFzdFZpc2l0b3IoYXN0Um9vdCwgY29udGFpbmVyQW5ub3RhdGlvbikpOwotCX0KLQkKLQkvKioKLQkgKiBPbmx5IHZpc2l0IHRoZSBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBlbGVtZW50IG5hbWUuICAKLQkgKiBJZiB0aGVyZSBpcyBubyBlbGVtZW50IG5hbWUgKGxpa2UgaW4gdGhlIGNhc2Ugb2YgdmFsdWUgZWxlbWVudHMpCi0JICogdGhlbiB3ZSB3aWxsIHZpc2l0IGFsbCBhbm5vdGF0aW9ucyB3aXRoIHRoZSBhbm5vdGF0aW9uIG5hbWUgaW5zaWRlCi0JICogdGhlIGdpdmVuIGNvbnRhaW5lciBhbm5vdGF0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQVNUVmlzaXRvciBpbml0aWFsSmF2YU1lbWJlckFubm90YXRpb25Bc3RWaXNpdG9yKGZpbmFsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBmaW5hbCBDb250YWluZXJBbm5vdGF0aW9uPD8gZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+IGNvbnRhaW5lckFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBBU1RWaXNpdG9yKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZW1iZXJWYWx1ZVBhaXIgbm9kZSkgewotCQkJCXJldHVybiBub2RlLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoY29udGFpbmVyQW5ub3RhdGlvbi5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBub2RlKSB7Ci0JCQkJcmV0dXJuIHZpc2l0KChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbikgbm9kZSk7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChOb3JtYWxBbm5vdGF0aW9uIG5vZGUpIHsKLQkJCQlyZXR1cm4gdmlzaXQoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uKSBub2RlKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KE1hcmtlckFubm90YXRpb24gbm9kZSkgewotCQkJCXJldHVybiB2aXNpdCgob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24pIG5vZGUpOwotCQkJfQotCQkJCi0JCQlwcml2YXRlIGJvb2xlYW4gdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gbm9kZSkgewotCQkJCWlmIChjb250YWluZXJBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKEpEVFRvb2xzLnJlc29sdmVBbm5vdGF0aW9uKG5vZGUpKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRhaW5lckFubm90YXRpb24uZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpLmVxdWFscyhKRFRUb29scy5yZXNvbHZlQW5ub3RhdGlvbihub2RlKSkpIHsKLQkJCQkJQW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uID0gY29udGFpbmVyQW5ub3RhdGlvbi5hZGRJbnRlcm5hbChjb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25zU2l6ZSgpKTsKLQkJCQkJbmVzdGVkQW5ub3RhdGlvbi5pbml0aWFsaXplKGFzdFJvb3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBDb250YWluZXJBbm5vdGF0aW9uPD8+IGNvbnRhaW5lckFubm90YXRpb24pIHsKLQkJYWRkT3JVcGRhdGVBbm5vdGF0aW9uSW5Tb3VyY2UoYXN0Um9vdCwgY29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCS8vVE9ETyBub3Qgc3VyZSBob3cgdG8gaGFuZGxlIGdlbmVyaWNzIGhlcmUgYW5kIGdldCByaWQgb2YgdGhpcyB3YXJuaW5nCi0JCXJlbW92ZUFubm90YXRpb25zTm90SW5Tb3VyY2UoYXN0Um9vdCwgKENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPikgY29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRPclVwZGF0ZUFubm90YXRpb25JblNvdXJjZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCwgQ29udGFpbmVyQW5ub3RhdGlvbjw/IGV4dGVuZHMgTmVzdGFibGVBbm5vdGF0aW9uPiBjb250YWluZXJBbm5vdGF0aW9uKSB7Ci0JCWNvbnRhaW5lckFubm90YXRpb24uZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KS5hY2NlcHQoamF2YU1lbWJlckFubm90YXRpb25Bc3RWaXNpdG9yKGFzdFJvb3QsIGNvbnRhaW5lckFubm90YXRpb24pKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uc05vdEluU291cmNlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4gY29udGFpbmVyQW5ub3RhdGlvbikgewotCQlmb3IgKE5lc3RhYmxlQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbnMoKSkpIHsKLQkJCWlmIChhbm5vdGF0aW9uLmdldEpkdEFubm90YXRpb24oYXN0Um9vdCkgPT0gbnVsbCkgewotCQkJCWNvbnRhaW5lckFubm90YXRpb24ucmVtb3ZlKGFubm90YXRpb24pOwotCQkJfQotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogT25seSB2aXNpdCB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudCBuYW1lLiAgCi0JICogSWYgdGhlcmUgaXMgbm8gZWxlbWVudCBuYW1lIChsaWtlIGluIHRoZSBjYXNlIG9mIHZhbHVlIGVsZW1lbnRzKQotCSAqIHRoZW4gd2Ugd2lsbCB2aXNpdCBhbGwgYW5ub3RhdGlvbnMgd2l0aCB0aGUgYW5ub3RhdGlvbiBuYW1lIGluc2lkZQotCSAqIHRoZSBnaXZlbiBjb250YWluZXIgYW5ub3RhdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIEFTVFZpc2l0b3IgamF2YU1lbWJlckFubm90YXRpb25Bc3RWaXNpdG9yKGZpbmFsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBmaW5hbCBDb250YWluZXJBbm5vdGF0aW9uPD8gZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+IGNvbnRhaW5lckFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBBU1RWaXNpdG9yKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZW1iZXJWYWx1ZVBhaXIgbm9kZSkgewotCQkJCXJldHVybiBub2RlLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoY29udGFpbmVyQW5ub3RhdGlvbi5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5vZGUpIHsKLQkJCQlyZXR1cm4gdmlzaXQoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uKSBub2RlKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KE5vcm1hbEFubm90YXRpb24gbm9kZSkgewotCQkJCXJldHVybiB2aXNpdCgob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24pIG5vZGUpOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoTWFya2VyQW5ub3RhdGlvbiBub2RlKSB7Ci0JCQkJcmV0dXJuIHZpc2l0KChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbikgbm9kZSk7Ci0JCQl9Ci0JCQkKLQkJCXByaXZhdGUgYm9vbGVhbiB2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBub2RlKSB7Ci0JCQkJaWYgKGNvbnRhaW5lckFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoSkRUVG9vbHMucmVzb2x2ZUFubm90YXRpb24obm9kZSkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlpZiAoY29udGFpbmVyQW5ub3RhdGlvbi5nZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkuZXF1YWxzKEpEVFRvb2xzLnJlc29sdmVBbm5vdGF0aW9uKG5vZGUpKSkgewotCQkJCQlOZXN0YWJsZUFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbiA9IGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbkZvcihub2RlKTsKLQkJCQkJaWYgKG5lc3RlZEFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQkJbmVzdGVkQW5ub3RhdGlvbi51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW5lc3RlZEFubm90YXRpb24gPSBjb250YWluZXJBbm5vdGF0aW9uLmFkZChjb250YWluZXJBbm5vdGF0aW9uLm5lc3RlZEFubm90YXRpb25zU2l6ZSgpKTsKLQkJCQkJCW5lc3RlZEFubm90YXRpb24uaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjRlYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuRGlzY3JpbWluYXRvckNvbHVtbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgbWVtYmVyLCBTb3VyY2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBOdWxsRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvckNvbHVtbkltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JDb2x1bW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNmFjZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvckNvbHVtbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBjbGFzcyBEaXNjcmltaW5hdG9yQ29sdW1uSW1wbCBleHRlbmRzIEFic3RyYWN0TmFtZWRDb2x1bW4gaW1wbGVtZW50cyBEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gRElTQ1JJTUlOQVRPUl9UWVBFX0FEQVBURVIgPSBidWlsZERpc2NyaW1pbmF0b3JUeXBlQWRhcHRlcigpOwotCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdsZW5ndGgnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGxlbmd0aERlY2xhcmF0aW9uQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGlzY3JpbWluYXRvclR5cGVBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gbGVuZ3RoQWRhcHRlcjsKLQotCXByaXZhdGUgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGU7Ci0KLQlwcml2YXRlIEludGVnZXIgbGVuZ3RoOwkKLQkKLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvckNvbHVtbkltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsICBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBkYWEpKTsKLQkJdGhpcy5kaXNjcmltaW5hdG9yVHlwZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4obWVtYmVyLCBESVNDUklNSU5BVE9SX1RZUEVfQURBUFRFUik7Ci0JCXRoaXMubGVuZ3RoRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZEludGVnZXJFbGVtZW50QWRhcHRlcihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0xFTkdUSCk7Ci0JCXRoaXMubGVuZ3RoQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRJbnRlZ2VyRWxlbWVudEFkYXB0ZXIodGhpcy5sZW5ndGhEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMuZGlzY3JpbWluYXRvclR5cGUgPSB0aGlzLmRpc2NyaW1pbmF0b3JUeXBlKGFzdFJvb3QpOwotCQl0aGlzLmxlbmd0aCA9IHRoaXMubGVuZ3RoKGFzdFJvb3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTl9fTkFNRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCkgewotCQkvL1RPRE8gbW92ZSBtYWtlcyBubyBzZW5zZSBmb3IgRGlzY3JpbWluYXRvckNvbHVtbi4gIG1heWJlIE5lc3RhYmxlQW5ub3RhdGlvbgotCQkvL25lZWRzIHRvIGJlIHNwbGl0IHVwIGFuZCB3ZSBjb3VsZCBoYXZlIEluZGV4YWJsZUFubm90YXRpb24KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQW5ub3RhdGlvbik7Ci0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIG9sZENvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKLQkJc2V0TGVuZ3RoKG9sZENvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCXNldERpc2NyaW1pbmF0b3JUeXBlKG9sZENvbHVtbi5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIERpc2NyaW1pbmF0b3JUeXBlIGdldERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kaXNjcmltaW5hdG9yVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUgbmV3RGlzY3JpbWluYXRvclR5cGUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmRpc2NyaW1pbmF0b3JUeXBlLCBuZXdEaXNjcmltaW5hdG9yVHlwZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlEaXNjcmltaW5hdG9yVHlwZSBvbGREaXNjcmltaW5hdG9yVHlwZSA9IHRoaXMuZGlzY3JpbWluYXRvclR5cGU7Ci0JCXRoaXMuZGlzY3JpbWluYXRvclR5cGUgPSBuZXdEaXNjcmltaW5hdG9yVHlwZTsKLQkJdGhpcy5kaXNjcmltaW5hdG9yVHlwZUFkYXB0ZXIuc2V0VmFsdWUoRGlzY3JpbWluYXRvclR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKG5ld0Rpc2NyaW1pbmF0b3JUeXBlKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZLCBvbGREaXNjcmltaW5hdG9yVHlwZSwgbmV3RGlzY3JpbWluYXRvclR5cGUpOwotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoSW50ZWdlciBuZXdMZW5ndGgpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmxlbmd0aCwgbmV3TGVuZ3RoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUludGVnZXIgb2xkTGVuZ3RoID0gdGhpcy5sZW5ndGg7Ci0JCXRoaXMubGVuZ3RoID0gbmV3TGVuZ3RoOwotCQl0aGlzLmxlbmd0aEFkYXB0ZXIuc2V0VmFsdWUobmV3TGVuZ3RoKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChMRU5HVEhfUFJPUEVSVFksIG9sZExlbmd0aCwgbmV3TGVuZ3RoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlRnJvbUphdmEoYXN0Um9vdCk7Ci0JCXRoaXMuc2V0TGVuZ3RoKHRoaXMubGVuZ3RoKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXREaXNjcmltaW5hdG9yVHlwZSh0aGlzLmRpc2NyaW1pbmF0b3JUeXBlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBsZW5ndGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmRpc2NyaW1pbmF0b3JUeXBlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGREaXNjcmltaW5hdG9yVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBEaXNjcmltaW5hdG9yQ29sdW1uSW1wbChwYXJlbnQsIG1lbWJlciwgRGlzY3JpbWluYXRvckNvbHVtbkltcGwuREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBOdWxsRGlzY3JpbWluYXRvckNvbHVtbihwYXJlbnQpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTEyMzQyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZURpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JWYWx1ZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbihwYXJlbnQsIChUeXBlKSBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBOdWxsRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5RGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JWYWx1ZUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JWYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZiYTEzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBEaXNjcmltaW5hdG9yVmFsdWVJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248VHlwZT4gaW1wbGVtZW50cyBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0KLQkKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCQotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVmFsdWVJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0eXBlLCBWQUxVRV9BREFQVEVSKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy52YWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMudmFsdWUsIG5ld1ZhbHVlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUobmV3VmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc2V0VmFsdWUodGhpcy52YWx1ZShhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRV9fVkFMVUUpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgRGlzY3JpbWluYXRvclZhbHVlSW1wbChwYXJlbnQsIChUeXBlKSBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE51bGxEaXNjcmltaW5hdG9yVmFsdWUocGFyZW50KTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDdkYmZhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RW1iZWRkYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRW1iZWRkYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5FbWJlZGRhYmxlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFbWJlZGRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRW1iZWRkYWJsZUFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEVtYmVkZGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VFbWJlZGRhYmxlQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgKFR5cGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlFbWJlZGRhYmxlQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGFibGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRhYmxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODNkY2YzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGFibGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBFbWJlZGRhYmxlSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPFR5cGU+IGltcGxlbWVudHMgRW1iZWRkYWJsZUFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByb3RlY3RlZCBFbWJlZGRhYmxlSW1wbChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ub3RoaW5nIHRvIGluaXRpYWxpemUJCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ubyBhbm5vdGF0aW9uIG1lbWJlcnMKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVtYmVkZGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1iZWRkYWJsZUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVtYmVkZGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgRW1iZWRkYWJsZUFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBFbWJlZGRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEVtYmVkZGFibGVJbXBsKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCAoVHlwZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMzg4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RW1iZWRkZWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVtYmVkZGVkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkZWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVtYmVkZGVkQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRW1iZWRkZWRBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBFbWJlZGRlZEFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZUVtYmVkZGVkQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBOdWxsRW1iZWRkZWRBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeUVtYmVkZGVkQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkSWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxMzc1MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkSWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVtYmVkZGVkSWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVtYmVkZGVkSWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGVkSWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVtYmVkZGVkSWRBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFbWJlZGRlZElkQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZUVtYmVkZGVkSWRBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlFbWJlZGRlZElkQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJZEltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkSWRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MDBlMzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRJZEltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+IGltcGxlbWVudHMgRW1iZWRkZWRJZEFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcm90ZWN0ZWQgRW1iZWRkZWRJZEltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vIGFubm90YXRpb24gbWVtYmVycwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbWJlZGRlZElkQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBFbWJlZGRlZElkQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIEVtYmVkZGVkSWRBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgRW1iZWRkZWRJZEltcGwoKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5NzVmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPiBpbXBsZW1lbnRzIEVtYmVkZGVkQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByb3RlY3RlZCBFbWJlZGRlZEltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm8gYW5ub3RhdGlvbiBtZW1iZXJzCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRW1iZWRkZWRBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1iZWRkZWRBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFbWJlZGRlZEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBFbWJlZGRlZEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBFbWJlZGRlZEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBFbWJlZGRlZEltcGwoKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBOdWxsRW1iZWRkZWQocGFyZW50KTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW50aXR5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudGl0eUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0ZjQzMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudGl0eUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RW50aXR5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFbnRpdHlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVudGl0eUFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVudGl0eUFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEVudGl0eUFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZUVudGl0eUFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIChUeXBlKSBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5RW50aXR5QW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW50aXR5SW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmY3ZTNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci0KLQotcHVibGljIGNsYXNzIEVudGl0eUltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxUeXBlPiBpbXBsZW1lbnRzIEVudGl0eUFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBOQU1FX0FEQVBURVIgPSBidWlsZE5hbWVBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJvdGVjdGVkIEVudGl0eUltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLm5hbWVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGdldE1lbWJlcigpLCBOQU1FX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMubmFtZSA9IHRoaXMubmFtZShhc3RSb290KTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKiBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCS8vKioqKioqKioqKiogRW50aXR5IGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMubmFtZSwgbmV3TmFtZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZShuZXdOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFbnRpdHlBbm5vdGF0aW9uLk5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKE5BTUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCS8vKioqKioqKioqKiogSmF2YVJlc291cmNlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldE5hbWUodGhpcy5uYW1lKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JLy8qKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqKioqKioqCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuRU5USVRZX19OQU1FLCBmYWxzZSk7IC8vIGZhbHNlID0gZG8gbm90IHJlbW92ZSBhbm5vdGF0aW9uIHdoZW4gZW1wdHkKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVudGl0eUFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbnRpdHlBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFbnRpdHlBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgRW50aXR5QW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIEVudGl0eUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBFbnRpdHlJbXBsKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCAoVHlwZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnVtZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDZhNmQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnVtZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFbnVtZXJhdGVkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFbnVtZXJhdGVkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5FbnVtZXJhdGVkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFbnVtZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRW51bWVyYXRlZEFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEVudW1lcmF0ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VFbnVtZXJhdGVkQW5ub3RhdGlvbihwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCQorCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBOdWxsRW51bWVyYXRlZEFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5RW51bWVyYXRlZEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnVtZXJhdGVkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzAzMjkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGNsYXNzIEVudW1lcmF0ZWRJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPiBpbXBsZW1lbnRzIEVudW1lcmF0ZWRBbm5vdGF0aW9uCi17Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCi0JcHJpdmF0ZSBFbnVtVHlwZSB2YWx1ZTsKLQkKLQlwcm90ZWN0ZWQgRW51bWVyYXRlZEltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGF0dHJpYnV0ZSwgVkFMVUVfQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHVibGljIEVudW1UeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoRW51bVR5cGUgbmV3VmFsdWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnZhbHVlLCBuZXdWYWx1ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbnVtVHlwZSBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoRW51bVR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKG5ld1ZhbHVlKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zZXRWYWx1ZSh0aGlzLnZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVudW1UeXBlIHZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBFbnVtVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkVOVU1FUkFURURfX1ZBTFVFKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFbnVtZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEVudW1lcmF0ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFbnVtZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBFbnVtZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEVudW1lcmF0ZWRJbXBsKHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBOdWxsRW51bWVyYXRlZChwYXJlbnQpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMjY0NzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5R2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24ocGFyZW50LCBtZW1iZXIpOworCX0KKwkKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0dlbmVyYXRlZFZhbHVlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNGQwZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZWRWYWx1ZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxNZW1iZXI+IGltcGxlbWVudHMgR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBzdHJhdGVneUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdlbmVyYXRvckFkYXB0ZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFNUUkFURUdZX0FEQVBURVIgPSBidWlsZFN0cmF0ZWd5QWRhcHRlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBHRU5FUkFUT1JfQURBUFRFUiA9IGJ1aWxkR2VuZXJhdG9yQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneTsKLQotCXByaXZhdGUgU3RyaW5nIGdlbmVyYXRvcjsKLQkKLQkJCi0JcHJvdGVjdGVkIEdlbmVyYXRlZFZhbHVlSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5zdHJhdGVneUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4obWVtYmVyLCBTVFJBVEVHWV9BREFQVEVSKTsKLQkJdGhpcy5nZW5lcmF0b3JBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KG1lbWJlciwgR0VORVJBVE9SX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWd5KGFzdFJvb3QpOwotCQl0aGlzLmdlbmVyYXRvciA9IHRoaXMuZ2VuZXJhdG9yKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBHZW5lcmF0aW9uVHlwZSBnZXRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3k7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlIG5ld1N0cmF0ZWd5KSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5zdHJhdGVneSwgbmV3U3RyYXRlZ3kpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJR2VuZXJhdGlvblR5cGUgb2xkU3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWd5OwotCQl0aGlzLnN0cmF0ZWd5ID0gbmV3U3RyYXRlZ3k7Ci0JCXRoaXMuc3RyYXRlZ3lBZGFwdGVyLnNldFZhbHVlKEdlbmVyYXRpb25UeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZShuZXdTdHJhdGVneSkpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNUUkFURUdZX1BST1BFUlRZLCBvbGRTdHJhdGVneSwgbmV3U3RyYXRlZ3kpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0b3IoU3RyaW5nIG5ld0dlbmVyYXRvcikgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuZ2VuZXJhdG9yLCBuZXdHZW5lcmF0b3IpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZEdlbmVyYXRvciA9IHRoaXMuZ2VuZXJhdG9yOwotCQl0aGlzLmdlbmVyYXRvciA9IG5ld0dlbmVyYXRvcjsKLQkJdGhpcy5nZW5lcmF0b3JBZGFwdGVyLnNldFZhbHVlKG5ld0dlbmVyYXRvcik7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR0VORVJBVE9SX1BST1BFUlRZLCBvbGRHZW5lcmF0b3IsIG5ld0dlbmVyYXRvcik7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTdHJhdGVneVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFNUUkFURUdZX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEdlbmVyYXRvclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEdFTkVSQVRPUl9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGphdmEgYW5ub3RhdGlvbnMgLT4gcGVyc2lzdGVuY2UgbW9kZWwgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc2V0U3RyYXRlZ3kodGhpcy5zdHJhdGVneShhc3RSb290KSk7Ci0JCXRoaXMuc2V0R2VuZXJhdG9yKHRoaXMuZ2VuZXJhdG9yKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIEdlbmVyYXRpb25UeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuc3RyYXRlZ3lBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFN0cmF0ZWd5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuR0VORVJBVEVEX1ZBTFVFX19TVFJBVEVHWSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRHZW5lcmF0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuR0VORVJBVEVEX1ZBTFVFX19HRU5FUkFUT1IsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBHZW5lcmF0ZWRWYWx1ZUltcGwocGFyZW50LCBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9HZW5lcmF0b3JJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9HZW5lcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMDE3YzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvR2VuZXJhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyYXRvckltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxNZW1iZXI+IGltcGxlbWVudHMgR2VuZXJhdG9yQW5ub3RhdGlvbgotewotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAnbmFtZScgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdpbml0aWFsVmFsdWUnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGluaXRpYWxWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcjsKLQotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAnYWxsb2NhdGlvblNpemUnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGFsbG9jYXRpb25TaXplRGVjbGFyYXRpb25BZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGluaXRpYWxWYWx1ZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBhbGxvY2F0aW9uU2l6ZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCXByaXZhdGUgSW50ZWdlciBpbml0aWFsVmFsdWU7Ci0JCi0JcHJpdmF0ZSBJbnRlZ2VyIGFsbG9jYXRpb25TaXplOwotCQkKLQlwdWJsaWMgR2VuZXJhdG9ySW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBtZW1iZXIsIGRhYSk7Ci0JCXRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMubmFtZUFkYXB0ZXIoKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMuaW5pdGlhbFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5pbml0aWFsVmFsdWVBZGFwdGVyKCk7Ci0JCXRoaXMuaW5pdGlhbFZhbHVlQWRhcHRlciA9IHRoaXMuYnVpbGRJbnRlZ2VyQWRhcHRlcih0aGlzLmluaXRpYWxWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMuYWxsb2NhdGlvblNpemVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmFsbG9jYXRpb25TaXplQWRhcHRlcigpOwotCQl0aGlzLmFsbG9jYXRpb25TaXplQWRhcHRlciA9IHRoaXMuYnVpbGRJbnRlZ2VyQWRhcHRlcih0aGlzLmFsbG9jYXRpb25TaXplRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMuaW5pdGlhbFZhbHVlID0gdGhpcy5pbml0aWFsVmFsdWUoYXN0Um9vdCk7Ci0JCXRoaXMuYWxsb2NhdGlvblNpemUgPSB0aGlzLmFsbG9jYXRpb25TaXplKGFzdFJvb3QpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQlyZXR1cm4gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGdldE1lbWJlcigpLCBkYWVhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkSW50ZWdlckFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZGFlYSkgewotCQlyZXR1cm4gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihnZXRNZW1iZXIoKSwgZGFlYSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gaW5pdGlhbFZhbHVlQWRhcHRlcigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGFsbG9jYXRpb25TaXplQWRhcHRlcigpOwotCi0JCi0KLQlwdWJsaWMgSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYWxsb2NhdGlvblNpemU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFsbG9jYXRpb25TaXplKEludGVnZXIgbmV3QWxsb2NhdGlvblNpemUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmFsbG9jYXRpb25TaXplLCBuZXdBbGxvY2F0aW9uU2l6ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJbnRlZ2VyIG9sZEFsbG9jYXRpb25TaXplID0gdGhpcy5hbGxvY2F0aW9uU2l6ZTsKLQkJdGhpcy5hbGxvY2F0aW9uU2l6ZSA9IG5ld0FsbG9jYXRpb25TaXplOwotCQl0aGlzLmFsbG9jYXRpb25TaXplQWRhcHRlci5zZXRWYWx1ZShuZXdBbGxvY2F0aW9uU2l6ZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQUxMT0NBVElPTl9TSVpFX1BST1BFUlRZLCBvbGRBbGxvY2F0aW9uU2l6ZSwgbmV3QWxsb2NhdGlvblNpemUpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldEluaXRpYWxWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaW5pdGlhbFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxWYWx1ZShJbnRlZ2VyIG5ld0luaXRpYWxWYWx1ZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuaW5pdGlhbFZhbHVlLCBuZXdJbml0aWFsVmFsdWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSW50ZWdlciBvbGRJbml0aWFsVmFsdWUgPSB0aGlzLmluaXRpYWxWYWx1ZTsKLQkJdGhpcy5pbml0aWFsVmFsdWUgPSBuZXdJbml0aWFsVmFsdWU7Ci0JCXRoaXMuaW5pdGlhbFZhbHVlQWRhcHRlci5zZXRWYWx1ZShuZXdJbml0aWFsVmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElOSVRJQUxfVkFMVUVfUFJPUEVSVFksIG9sZEluaXRpYWxWYWx1ZSwgbmV3SW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMubmFtZSwgbmV3TmFtZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZShuZXdOYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRJbml0aWFsVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmluaXRpYWxWYWx1ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QWxsb2NhdGlvblNpemVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmFsbG9jYXRpb25TaXplRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGphdmEgYW5ub3RhdGlvbnMgLT4gcGVyc2lzdGVuY2UgbW9kZWwgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc2V0TmFtZSh0aGlzLm5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnNldEFsbG9jYXRpb25TaXplKHRoaXMuYWxsb2NhdGlvblNpemUoYXN0Um9vdCkpOwotCQl0aGlzLnNldEluaXRpYWxWYWx1ZSh0aGlzLmluaXRpYWxWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW50ZWdlciBhbGxvY2F0aW9uU2l6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5hbGxvY2F0aW9uU2l6ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBJbnRlZ2VyIGluaXRpYWxWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5pbml0aWFsVmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlwcm90ZWN0ZWQgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkSW50ZWdlckFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZWJmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5SWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUlkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuSWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIElkQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSWRBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBJZEFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZUlkQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5SWRBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRDbGFzc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZENsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTk5ZTRjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRDbGFzc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5SWRDbGFzc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlSWRDbGFzc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZENsYXNzQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuSWRDbGFzcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgSWRDbGFzc0Fubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IElkQ2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBJZENsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlSWRDbGFzc0Fubm90YXRpb24ocGFyZW50LCAoVHlwZSkgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeUlkQ2xhc3NBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkQ2xhc3NJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZENsYXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjQ2NTcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkQ2xhc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZENsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotCi1wdWJsaWMgY2xhc3MgSWRDbGFzc0ltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxUeXBlPiBpbXBsZW1lbnRzIElkQ2xhc3NBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFZhbHVlOwotCi0JcHVibGljIElkQ2xhc3NJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0eXBlLCBWQUxVRV9BREFQVEVSKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy52YWx1ZShhc3RSb290KTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFZhbHVlID0gZnVsbHlRdWFsaWZpZWRDbGFzcyhhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMudmFsdWUsIG5ld1ZhbHVlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUobmV3VmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElkQ2xhc3NBbm5vdGF0aW9uLlZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRWYWx1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkQ2xhc3MoU3RyaW5nIG5ld1F1YWxpZmllZENsYXNzKSB7Ci0JCVN0cmluZyBvbGRRdWFsaWZpZWRDbGFzcyA9IHRoaXMuZnVsbHlRdWFsaWZpZWRWYWx1ZTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFZhbHVlID0gbmV3UXVhbGlmaWVkQ2xhc3M7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSWRDbGFzc0Fubm90YXRpb24uRlVMTFlfUVVBTElGSUVEX0NMQVNTX1BST1BFUlRZLCBvbGRRdWFsaWZpZWRDbGFzcywgbmV3UXVhbGlmaWVkQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldFZhbHVlKHRoaXMudmFsdWUoYXN0Um9vdCkpOwotCQl0aGlzLnNldEZ1bGx5UXVhbGlmaWVkQ2xhc3ModGhpcy5mdWxseVF1YWxpZmllZENsYXNzKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAoZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gSkRUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLnZhbHVlQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JcHJvdGVjdGVkIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLklEX0NMQVNTX19WQUxVRSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJZENsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIElkQ2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBJZENsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBJZENsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IElkQ2xhc3NJbXBsKHBhcmVudCwgKFR5cGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmYWRjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotCi1wdWJsaWMgY2xhc3MgSWRJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPiBpbXBsZW1lbnRzIElkQW5ub3RhdGlvbgotewkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcm90ZWN0ZWQgSWRJbXBsKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ubyBhbm5vdGF0aW9uIG1lbWJlcnMKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJZEFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJZEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IElkQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIElkQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIElkQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IElkSW1wbCgoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5N2FlMTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5SW5oZXJpdGFuY2VBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUluaGVyaXRhbmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Jbmhlcml0YW5jZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSW5oZXJpdGFuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBJbmhlcml0YW5jZUFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEluaGVyaXRhbmNlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlSW5oZXJpdGFuY2VBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCAoVHlwZSkgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXJldHVybiBuZXcgTnVsbEluaGVyaXRhbmNlQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5SW5oZXJpdGFuY2VBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gSW5oZXJpdGFuY2VBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0luaGVyaXRhbmNlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhN2YzMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLQotcHVibGljIGNsYXNzIEluaGVyaXRhbmNlSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPFR5cGU+IGltcGxlbWVudHMgSW5oZXJpdGFuY2VBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gU1RSQVRFR1lfQURBUFRFUiA9IGJ1aWxkU3RyYXRlZ3lBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHN0cmF0ZWd5QWRhcHRlcjsKLQotCXByaXZhdGUgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5OwotCQotCXByb3RlY3RlZCBJbmhlcml0YW5jZUltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIFR5cGUgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMuc3RyYXRlZ3lBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHR5cGUsIFNUUkFURUdZX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWd5KGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgbmV3U3RyYXRlZ3kpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnN0cmF0ZWd5LCBuZXdTdHJhdGVneSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJbmhlcml0YW5jZVR5cGUgb2xkU3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWd5OwotCQl0aGlzLnN0cmF0ZWd5ID0gbmV3U3RyYXRlZ3k7Ci0JCXRoaXMuc3RyYXRlZ3lBZGFwdGVyLnNldFZhbHVlKEluaGVyaXRhbmNlVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUobmV3U3RyYXRlZ3kpKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTVFJBVEVHWV9QUk9QRVJUWSwgb2xkU3RyYXRlZ3ksIG5ld1N0cmF0ZWd5KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFN0cmF0ZWd5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoU1RSQVRFR1lfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc2V0U3RyYXRlZ3kodGhpcy5zdHJhdGVneShhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3koQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIEluaGVyaXRhbmNlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLnN0cmF0ZWd5QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRTdHJhdGVneUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLklOSEVSSVRBTkNFX19TVFJBVEVHWSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5oZXJpdGFuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5oZXJpdGFuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBJbmhlcml0YW5jZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgSW5oZXJpdGFuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgSW5oZXJpdGFuY2VJbXBsKHBhcmVudCwgKFR5cGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTnVsbEluaGVyaXRhbmNlKHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTW9kZWxJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJhNTM1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KcGFDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQml0VG9vbHM7Ci0KLS8vIFRPRE8gd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIEpQQSBwbGF0Zm9ybQotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZU1vZGVsSW1wbAotCWV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZU1vZGVsCi0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VNb2RlbAotewotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxSZXNvdXJjZU1vZGVsTGlzdGVuZXI+IHJlc291cmNlTW9kZWxMaXN0ZW5lcnM7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBKcGFDb21waWxhdGlvblVuaXQganBhQ29tcGlsYXRpb25Vbml0OwotCQotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VNb2RlbEltcGwoCi0JCQlJRmlsZSBmaWxlLCBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyLCAKLQkJCUNvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlzdXBlcihmaWxlKTsKLQkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZU1vZGVsTGlzdGVuZXI+KCk7Ci0JCS8vIFRPRE8gdXNlIEpQQSBmYWN0b3J5LCB2aWEgdGhlIHBsYXRmb3JtCi0JCXRoaXMuanBhQ29tcGlsYXRpb25Vbml0ID0gCi0JCQluZXcgSnBhQ29tcGlsYXRpb25Vbml0SW1wbChmaWxlLCBhbm5vdGF0aW9uUHJvdmlkZXIsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyLCB0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBKQVZBX1JFU09VUkNFX1RZUEU7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21waWxhdGlvblVuaXQgZ2V0SnBhQ29tcGlsYXRpb25Vbml0KCkgewotCQlyZXR1cm4gdGhpcy5qcGFDb21waWxhdGlvblVuaXQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlTW9kZWxDaGFuZ2VMaXN0ZW5lcihSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCX0KLQkJaWYgKHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgYWxyZWFkeSBhZGRlZCIpOwkJCi0JCX0KLQkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlTW9kZWxDaGFuZ2VMaXN0ZW5lcihSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKCF0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHdhcyBuZXZlciBhZGRlZCIpOwkJCi0JCX0KLQkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKCkgewotCQlpZiAodGhpcy5qcGFDb21waWxhdGlvblVuaXQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2hhbmdlIGV2ZW50cyBzaG91bGQgbm90IGJlIGZpcmVkIGR1cmluZyBjb25zdHJ1Y3Rpb24iKTsKLQkJfQotCQlmb3IgKFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVycykgewotCQkJbGlzdGVuZXIucmVzb3VyY2VNb2RlbENoYW5nZWQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQlzeW5jaFdpdGhKYXZhRGVsdGEoZXZlbnQuZ2V0RGVsdGEoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jaFdpdGhKYXZhRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJc3dpdGNoIChkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKLQkJCQlpZiAodGhpcy51cGRhdGVPbkNsYXNzcGF0aENoYW5nZXMoZGVsdGEpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUwgOgotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgotCQkJCXRoaXMuc3luY2hDaGlsZHJlbldpdGhKYXZhRGVsdGEoZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCA6Ci0JCQkJdGhpcy5zeW5jaENvbXBpbGF0aW9uVW5pdFdpdGhKYXZhRGVsdGEoZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7IC8vIHRoZSBldmVudCBpcyBzb21laG93IGxvd2VyIHRoYW4gYSBjb21waWxhdGlvbiB1bml0Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY2hDaGlsZHJlbldpdGhKYXZhRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZCA6IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkgewotCQkJdGhpcy5zeW5jaFdpdGhKYXZhRGVsdGEoY2hpbGQpOyAvLyByZWN1cnNlCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY2hDb21waWxhdGlvblVuaXRXaXRoSmF2YURlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCS8vIGlnbm9yZSBjaGFuZ2VzIHRvL2Zyb20gcHJpbWFyeSB3b3JraW5nIGNvcHkgLSBubyBjb250ZW50IGhhcyBjaGFuZ2VkOwotCQkvLyBhbmQgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBvdGhlciBmbGFncyBzZXQgdGhhdCBpbmRpY2F0ZSBib3RoIGEgY2hhbmdlIHRvL2Zyb20KLQkJLy8gcHJpbWFyeSB3b3JraW5nIGNvcHkgQU5EIGNvbnRlbnQgaGFzIGNoYW5nZWQKLQkJaWYgKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoZGVsdGEuZ2V0RmxhZ3MoKSwgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1dPUktJTkdfQ09QWSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQpIHsKLQkJCS8vd2UgZ2V0IHRoZSBqYXZhIG5vdGlmaWNhdGlvbiBmb3IgcmVtb3ZhbCBiZWZvcmUgd2UgZ2V0IHRoZSByZXNvdXJjZSBub3RpZmljYXRpb24uCi0JCQkvL3dlIGRvIG5vdCBuZWVkIHRvIGhhbmRsZSB0aGlzIGV2ZW50IGFuZCB3aWxsIGdldCBleGNlcHRpb25zIGJ1aWxkaW5nIGFuIGFzdFJvb3QgaWYgd2UgdHJ5LgotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChkZWx0YS5nZXRFbGVtZW50KCkuZXF1YWxzKHRoaXMuanBhQ29tcGlsYXRpb25Vbml0LmdldENvbXBpbGF0aW9uVW5pdCgpKSkgewotCQkJLy9UT0RPIHBvc3NpYmx5IGhvcCBvbiB0aGUgVUkgdGhyZWFkIGhlcmUgc28gdGhhdCB3ZSBrbm93IG9ubHkgMSB0aHJlYWQgaXMgY2hhbmdpbmcgb3VyIG1vZGVsCi0JCQl0aGlzLmpwYUNvbXBpbGF0aW9uVW5pdC51cGRhdGVGcm9tSmF2YSgpOwotCQl9Ci0JfQotCi0JLy9idWcgMjM1Mzg0IC0gd2UgbmVlZCB0byB1cGRhdGUgYWxsIGNvbXBpbGF0aW9uIHVuaXRzIHdoZW4gYSBjbGFzc3BhdGggY2hhbmdlIG9jY3Vycy4KLQkvL1RoZSBwZXJzaXN0ZW5jZS5qYXIgY291bGQgaGF2ZSBiZWVuIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgY2xhc3NwYXRoIHdoaWNoIGFmZmVjdHMKLQkvL3doZXRoZXIgd2Uga25vdyBhYm91dCB0aGUganBhIGFubm90YXRpb25zIG9yIG5vdC4KLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlT25DbGFzc3BhdGhDaGFuZ2VzKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChCaXRUb29scy5mbGFnSXNTZXQoZGVsdGEuZ2V0RmxhZ3MoKSwgSUphdmFFbGVtZW50RGVsdGEuRl9SRVNPTFZFRF9DTEFTU1BBVEhfQ0hBTkdFRCkgfHwKLQkJCUJpdFRvb2xzLmZsYWdJc1NldChkZWx0YS5nZXRGbGFncygpLCBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9DSEFOR0VEKSkgewotCQkJCXRoaXMuanBhQ29tcGlsYXRpb25Vbml0LnVwZGF0ZUZyb21KYXZhKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21SZXNvdXJjZSgpIHsKLQkJdGhpcy5qcGFDb21waWxhdGlvblVuaXQudXBkYXRlRnJvbUphdmEoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXMoKSB7Ci0JCXRoaXMuanBhQ29tcGlsYXRpb25Vbml0LnJlc29sdmVUeXBlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzhkNmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRURmllbGRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUTWV0aG9kQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpwYUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWV0aG9kQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuTWV0aG9kU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLQotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGVJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI8QXR0cmlidXRlPgotCWltcGxlbWVudHMgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZQotewotCi0JcHJpdmF0ZSBib29sZWFuIHR5cGVJc0Jhc2ljOwotCQotCXByaXZhdGUgU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lOwotCQotCXByaXZhdGUgYm9vbGVhbiB0eXBlSXNDb250YWluZXI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lOwotCQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaWNfOyAgLy8gJ3B1YmxpYycgaXMgYSByZXNlcnZlZCB3b3JkCi0JCi0JcHJpdmF0ZSBib29sZWFuIGZpbmFsXzsgIC8vICdmaW5hbCcgaXMgYSByZXNlcnZlZCB3b3JkCi0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgZmllbGQgYXR0cmlidXRlCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0luc3RhbmNlKAotCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJU3RyaW5nIG5hbWUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUpwYUNvbXBpbGF0aW9uVW5pdCBqcGFDb21waWxhdGlvblVuaXQsCi0JCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gbmV3IEpEVEZpZWxkQXR0cmlidXRlKAotCQkJCWRlY2xhcmluZ1R5cGUsCi0JCQkJbmFtZSwKLQkJCQlvY2N1cnJlbmNlLAotCQkJCWpwYUNvbXBpbGF0aW9uVW5pdC5nZXRDb21waWxhdGlvblVuaXQoKSwKLQkJCQlqcGFDb21waWxhdGlvblVuaXQuZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcigpLAotCQkJCWpwYUNvbXBpbGF0aW9uVW5pdC5nZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBmaWVsZCA9IG5ldyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlSW1wbChwYXJlbnQsIGF0dHJpYnV0ZSk7Ci0JCWZpZWxkLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0JCi0JLyoqCi0JICogY29uc3RydWN0IHByb3BlcnR5IGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdJbnN0YW5jZSgKLQkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCU1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUpwYUNvbXBpbGF0aW9uVW5pdCBqcGFDb21waWxhdGlvblVuaXQsCi0JCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gSkRUTWV0aG9kQXR0cmlidXRlLm5ld0luc3RhbmNlKAotCQkJCWRlY2xhcmluZ1R5cGUsCi0JCQkJc2lnbmF0dXJlLAotCQkJCW9jY3VycmVuY2UsCi0JCQkJanBhQ29tcGlsYXRpb25Vbml0LmdldENvbXBpbGF0aW9uVW5pdCgpLAotCQkJCWpwYUNvbXBpbGF0aW9uVW5pdC5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCksCi0JCQkJanBhQ29tcGlsYXRpb25Vbml0LmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGZpZWxkID0gbmV3IEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGVJbXBsKHBhcmVudCwgYXR0cmlidXRlKTsKLQkJZmllbGQuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJcmV0dXJuIGZpZWxkOwotCX0KLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZUltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKXsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRNZW1iZXIoKS5nZXRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0JLy8gKioqKioqKiogQWJzdHJhY3RKYXZhUGVyc2lzdGVudFJlc291cmNlIGltcGxlbWVudGF0aW9uICoqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb24gYnVpbGRNYXBwaW5nQW5ub3RhdGlvbihTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5idWlsZEF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uKHRoaXMsIGdldE1lbWJlcigpLCBtYXBwaW5nQW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkQXR0cmlidXRlQW5ub3RhdGlvbih0aGlzLCBnZXRNZW1iZXIoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkTnVsbEF0dHJpYnV0ZUFubm90YXRpb24odGhpcywgZ2V0TWVtYmVyKCksIGFubm90YXRpb25OYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb24gYnVpbGROdWxsTWFwcGluZ0Fubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5idWlsZE51bGxBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbih0aGlzLCBnZXRNZW1iZXIoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gcG9zc2libGVNYXBwaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuYXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb25OYW1lcygpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQb3NzaWJsZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuYXR0cmlidXRlQW5ub3RhdGlvbk5hbWVzKCksIGFubm90YXRpb25OYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQb3NzaWJsZU1hcHBpbmdBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGdldEFubm90YXRpb25Qcm92aWRlcigpLmF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uTmFtZXMoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCS8vb3ZlcnJpZGluZyBwdXJlbHkgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcgeW91IGdldCBhdCB0aGUgY2xhc3MgbGV2ZWwKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gc3VwZXIuYW5ub3RhdGlvbnMobmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkvL292ZXJyaWRpbmcgcHVyZWx5IHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nIHlvdSBnZXQgYXQgdGhlIGNsYXNzIGxldmVsCi0JcHVibGljIEl0ZXJhdG9yPEFubm90YXRpb24+IG1hcHBpbmdBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIHN1cGVyLm1hcHBpbmdBbm5vdGF0aW9ucygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkvL292ZXJyaWRpbmcgcHVyZWx5IHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nIHlvdSBnZXQgYXQgdGhlIGNsYXNzIGxldmVsCi0JcHVibGljIEl0ZXJhdG9yPEFubm90YXRpb24+IGFubm90YXRpb25zKCkgewotCQlyZXR1cm4gc3VwZXIuYW5ub3RhdGlvbnMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJcmV0dXJuICgoTWV0aG9kQXR0cmlidXRlKSB0aGlzLmdldE1lbWJlcigpKS5tYXRjaGVzKHNpZ25hdHVyZSwgb2NjdXJyZW5jZSk7Ci0JfQotCi0JLy8gKioqKioqKiogSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZvckZpZWxkKCkgewotCQlyZXR1cm4gZ2V0TWVtYmVyKCkuaXNGaWVsZCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZvclByb3BlcnR5KCkgewotCQlyZXR1cm4gIWlzRm9yRmllbGQoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzQW55QW5ub3RhdGlvbigpIHsKLQkJaWYgKG1hcHBpbmdBbm5vdGF0aW9uc1NpemUoKSA+IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhbm5vdGF0aW9uc1NpemUoKSA+IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljXzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHVibGljKGJvb2xlYW4gbmV3UHVibGljKSB7Ci0JCWJvb2xlYW4gb2xkUHVibGljID0gdGhpcy5wdWJsaWNfOwotCQl0aGlzLnB1YmxpY18gPSBuZXdQdWJsaWM7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUFVCTElDX1BST1BFUlRZLCBvbGRQdWJsaWMsIG5ld1B1YmxpYyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRmluYWwoKSB7Ci0JCXJldHVybiB0aGlzLmZpbmFsXzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmluYWwoYm9vbGVhbiBuZXdGaW5hbCkgewotCQlib29sZWFuIG9sZEZpbmFsID0gdGhpcy5maW5hbF87Ci0JCXRoaXMuZmluYWxfID0gbmV3RmluYWw7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRklOQUxfUFJPUEVSVFksIG9sZEZpbmFsLCBuZXdGaW5hbCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHR5cGVJc0Jhc2ljKCkgewotCQlyZXR1cm4gdGhpcy50eXBlSXNCYXNpYzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHlwZUlzQmFzaWMoYm9vbGVhbiBuZXdUeXBlSXNCYXNpYykgewotCQlib29sZWFuIG9sZFR5cGVJc0Jhc2ljID0gdGhpcy50eXBlSXNCYXNpYzsKLQkJdGhpcy50eXBlSXNCYXNpYyA9IG5ld1R5cGVJc0Jhc2ljOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfSVNfQkFTSUNfUFJPUEVSVFksIG9sZFR5cGVJc0Jhc2ljLCBuZXdUeXBlSXNCYXNpYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucXVhbGlmaWVkVHlwZU5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFF1YWxpZmllZFR5cGVOYW1lKFN0cmluZyBuZXdRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlTdHJpbmcgb2xkUXVhbGlmaWVkVHlwZU5hbWUgPSB0aGlzLnF1YWxpZmllZFR5cGVOYW1lOwotCQl0aGlzLnF1YWxpZmllZFR5cGVOYW1lID0gbmV3UXVhbGlmaWVkVHlwZU5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVBTElGSUVEX1RZUEVfTkFNRV9QUk9QRVJUWSwgb2xkUXVhbGlmaWVkVHlwZU5hbWUsIG5ld1F1YWxpZmllZFR5cGVOYW1lKTsJCQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoU3RyaW5nIG5ld1F1YWxpZmllZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKSB7Ci0JCVN0cmluZyBvbGRRdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSA9IHRoaXMucXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWU7Ci0JCXRoaXMucXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUgPSBuZXdRdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChRVUFMSUZJRURfUkVGRVJFTkNFX0VOVElUWV9UWVBFX05BTUVfUFJPUEVSVFksIG9sZFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lLCBuZXdRdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlFbGVtZW50VHlwZU5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZShTdHJpbmcgbmV3UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lKSB7Ci0JCVN0cmluZyBvbGRRdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlFbGVtZW50VHlwZU5hbWUgPSB0aGlzLnF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZTsKLQkJdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlFbGVtZW50VHlwZU5hbWUgPSBuZXdRdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlFbGVtZW50VHlwZU5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVBTElGSUVEX1JFRkVSRU5DRV9FTlRJVFlfRUxFTUVOVF9UWVBFX05BTUVfUFJPUEVSVFksIG9sZFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZSwgbmV3UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy50eXBlSXNDb250YWluZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFR5cGVJc0NvbnRhaW5lcihib29sZWFuIG5ld1R5cGVJc0NvbnRhaW5lcikgewotCQlib29sZWFuIG9sZFR5cGVJc0NvbnRhaW5lciA9IHRoaXMudHlwZUlzQ29udGFpbmVyOwotCQl0aGlzLnR5cGVJc0NvbnRhaW5lciA9IG5ld1R5cGVJc0NvbnRhaW5lcjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX0lTX0NPTlRBSU5FUl9QUk9QRVJUWSwgb2xkVHlwZUlzQ29udGFpbmVyLCBuZXdUeXBlSXNDb250YWluZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMudHlwZUlzQmFzaWMgPSB0aGlzLnR5cGVJc0Jhc2ljKGFzdFJvb3QpOwotCQl0aGlzLnF1YWxpZmllZFR5cGVOYW1lID0gdGhpcy5xdWFsaWZpZWRUeXBlTmFtZShhc3RSb290KTsKLQkJdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSA9IHRoaXMucXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMucXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5RWxlbWVudFR5cGVOYW1lID0gdGhpcy5xdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlFbGVtZW50VHlwZU5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMudHlwZUlzQ29udGFpbmVyID0gdGhpcy50eXBlSXNDb250YWluZXIoYXN0Um9vdCk7Ci0JCXRoaXMuZmluYWxfID0gdGhpcy5pc0ZpbmFsKGFzdFJvb3QpOwotCQl0aGlzLnB1YmxpY18gPSB0aGlzLmlzUHVibGljKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnVwZGF0ZUZyb21KYXZhKGFzdFJvb3QpOwotCQl0aGlzLnNldFR5cGVJc0Jhc2ljKHRoaXMudHlwZUlzQmFzaWMoYXN0Um9vdCkpOwotCQl0aGlzLnNldFF1YWxpZmllZFR5cGVOYW1lKHRoaXMucXVhbGlmaWVkVHlwZU5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnNldFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKHRoaXMucXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnNldFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZSh0aGlzLnF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0VHlwZUlzQ29udGFpbmVyKHRoaXMudHlwZUlzQ29udGFpbmVyKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRGaW5hbCh0aGlzLmlzRmluYWwoYXN0Um9vdCkpOwotCQl0aGlzLnNldFB1YmxpYyh0aGlzLmlzUHVibGljKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIucmVzb2x2ZVR5cGVzKGFzdFJvb3QpOwotCQl0aGlzLnNldFR5cGVJc0Jhc2ljKHRoaXMudHlwZUlzQmFzaWMoYXN0Um9vdCkpOwotCQl0aGlzLnNldFF1YWxpZmllZFR5cGVOYW1lKHRoaXMucXVhbGlmaWVkVHlwZU5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnNldFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKHRoaXMucXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnNldFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZSh0aGlzLnF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0VHlwZUlzQ29udGFpbmVyKHRoaXMudHlwZUlzQ29udGFpbmVyKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0eXBlSXNCYXNpYyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdHlwZUlzQmFzaWModGhpcy5nZXRNZW1iZXIoKS5nZXRUeXBlQmluZGluZyhhc3RSb290KSwgYXN0Um9vdC5nZXRBU1QoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRmluYWwoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSUJpbmRpbmcgYmluZGluZyA9IGdldE1lbWJlcigpLmdldEJpbmRpbmcoYXN0Um9vdCk7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogTW9kaWZpZXIuaXNGaW5hbChiaW5kaW5nLmdldE1vZGlmaWVycygpKTsKLQl9Ci0JCQotCXByb3RlY3RlZCBib29sZWFuIGlzUHVibGljKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBnZXRNZW1iZXIoKS5nZXRCaW5kaW5nKGFzdFJvb3QpOwkKLQkJcmV0dXJuIChiaW5kaW5nID09IG51bGwpID8gZmFsc2UgOiBNb2RpZmllci5pc1B1YmxpYyhiaW5kaW5nLmdldE1vZGlmaWVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBxdWFsaWZpZWRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmdldE1lbWJlcigpLmdldFR5cGVCaW5kaW5nKGFzdFJvb3QpOwotCQlyZXR1cm4gKHR5cGVCaW5kaW5nID09IG51bGwpID8gbnVsbCA6IGJ1aWxkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUodHlwZUJpbmRpbmcpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0JCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAodHlwZUJpbmRpbmcuaXNBcnJheSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsgIC8vIGFycmF5cyBjYW5ub3QgYmUgZW50aXRpZXMKLQkJfQotCQlyZXR1cm4gdHlwZUJpbmRpbmcuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmdldE1lbWJlcigpLmdldFR5cGVCaW5kaW5nKGFzdFJvb3QpOwotCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVHlwZUJpbmRpbmdbXSB0eXBlQXJndW1lbnRzID0gdHlwZUJpbmRpbmcuZ2V0VHlwZUFyZ3VtZW50cygpOwotCQlpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVR5cGVCaW5kaW5nIGVsZW1lbnRUeXBlQmluZGluZyA9IHR5cGVBcmd1bWVudHNbMF07Ci0JCVN0cmluZyBlbGVtZW50VHlwZU5hbWUgPSBidWlsZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKGVsZW1lbnRUeXBlQmluZGluZyk7Ci0JCXJldHVybiB0eXBlTmFtZWRJc0NvbnRhaW5lcihlbGVtZW50VHlwZU5hbWUpID8gbnVsbCA6IGVsZW1lbnRUeXBlTmFtZTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB0eXBlSXNDb250YWluZXIoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gYnVpbGRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSh0aGlzLmdldE1lbWJlcigpLmdldFR5cGVCaW5kaW5nKGFzdFJvb3QpKTsKLQkJcmV0dXJuICh0eXBlTmFtZSA9PSBudWxsKSA/IGZhbHNlIDogdHlwZU5hbWVkSXNDb250YWluZXIodHlwZU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG5vbi1hcnJheSB0eXBlIGlzIG9uZSBvZiB0aGUgY29udGFpbmVyCi0JICogdHlwZXMgYWxsb3dlZCBieSB0aGUgSlBBIHNwZWMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZU5hbWVkSXNDb250YWluZXIoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoQ09OVEFJTkVSX1RZUEVfTkFNRVMsIHR5cGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT05UQUlORVJfVFlQRV9OQU1FUyA9IHsKLQkJamF2YS51dGlsLkNvbGxlY3Rpb24uY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLnV0aWwuU2V0LmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS51dGlsLkxpc3QuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKQotCX07Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmdldE1lbWJlcigpLmdldFR5cGVCaW5kaW5nKGFzdFJvb3QpOwotCQlyZXR1cm4gKHR5cGVCaW5kaW5nID09IG51bGwpID8gbnVsbCA6IHR5cGVCaW5kaW5nLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBGcm9tIHRoZSBKUEEgc3BlYywgd2hlbiB0aGUgYmFzaWMgbWFwcGluZyBhcHBsaWVzOgotCSAqIElmIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZwotCSAqIGl0IG11c3QgYmUgbWFwcGVkIGFzIEBCYXNpYzoKLQkgKiAgICAgcHJpbWl0aXZlIHR5cGVzCi0JICogICAgIGJ5dGVbXQotCSAqICAgICBCeXRlW10KLQkgKiAgICAgY2hhcltdCi0JICogICAgIENoYXJhY3RlcltdCi0JICogICAgIHByaW1pdGl2ZSB3cmFwcGVycwotCSAqICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogICAgIGphdmEubWF0aC5CaWdEZWNpbWFsCi0JICogICAgIGphdmEudXRpbC5EYXRlCi0JICogICAgIGphdmEudXRpbC5DYWxlbmRhcgotCSAqICAgICBqYXZhLnNxbC5EYXRlCi0JICogICAgIGphdmEuc3FsLlRpbWUKLQkgKiAgICAgamF2YS5zcWwuVGltZXN0YW1wCi0JICogICAgIGVudW1zCi0JICogICAgIGFueSBvdGhlciB0eXBlIHRoYXQgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0eXBlSXNCYXNpYyhJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIEFTVCBhc3QpIHsKLQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsgLy8gdHlwZSBub3QgZm91bmQKLQkJfQotCQlpZiAodHlwZUJpbmRpbmcuaXNQcmltaXRpdmUoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHR5cGVCaW5kaW5nLmlzQXJyYXkoKSkgewotCQkJaWYgKHR5cGVCaW5kaW5nLmdldERpbWVuc2lvbnMoKSA+IDEpIHsKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZAotCQkJfQotCQkJSVR5cGVCaW5kaW5nIGVsZW1lbnRUeXBlQmluZGluZyA9IHR5cGVCaW5kaW5nLmdldEVsZW1lbnRUeXBlKCk7Ci0JCQlpZiAoZWxlbWVudFR5cGVCaW5kaW5nID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ly8gdW5hYmxlIHRvIHJlc29sdmUgdGhlIHR5cGUKLQkJCX0KLQkJCXJldHVybiBlbGVtZW50VHlwZUlzVmFsaWQoZWxlbWVudFR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJU3RyaW5nIHR5cGVOYW1lID0gdHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQlpZiAodHlwZUlzUHJpbWl0aXZlV3JhcHBlcih0eXBlTmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlSXNPdGhlclN1cHBvcnRlZFR5cGUodHlwZU5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAodHlwZUJpbmRpbmcuaXNFbnVtKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlSW1wbGVtZW50c1NlcmlhbGl6YWJsZSh0eXBlQmluZGluZywgYXN0KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyBhIHZhbGlkIGVsZW1lbnQgdHlwZSBmb3IKLQkgKiBhIG9uZS1kaW1lbnNpb25hbCBhcnJheToKLQkgKiAgICAgYnl0ZQotCSAqICAgICBjaGFyCi0JICogICAgIGphdmEubGFuZy5CeXRlCi0JICogICAgIGphdmEubGFuZy5DaGFyYWN0ZXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVsZW1lbnRUeXBlSXNWYWxpZChTdHJpbmcgZWxlbWVudFR5cGVOYW1lKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoVkFMSURfRUxFTUVOVF9UWVBFX05BTUVTLCBlbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZBTElEX0VMRU1FTlRfVFlQRV9OQU1FUyA9IHsKLQkJYnl0ZS5jbGFzcy5nZXROYW1lKCksCi0JCWNoYXIuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLmxhbmcuQnl0ZS5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEubGFuZy5DaGFyYWN0ZXIuY2xhc3MuZ2V0TmFtZSgpCi0JfTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyBhIHByaW1pdGl2ZSB3cmFwcGVyLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZUlzUHJpbWl0aXZlV3JhcHBlcihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhQUklNSVRJVkVfV1JBUFBFUl9UWVBFX05BTUVTLCB0eXBlTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBSSU1JVElWRV9XUkFQUEVSX1RZUEVfTkFNRVMgPSB7Ci0JCWphdmEubGFuZy5CeXRlLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEubGFuZy5Eb3VibGUuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLmxhbmcuRmxvYXQuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLmxhbmcuSW50ZWdlci5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEubGFuZy5Mb25nLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5sYW5nLlNob3J0LmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpLAotCX07Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgYW1vbmcgdGhlIHZhcmlvdXMgb3RoZXIgdHlwZXMKLQkgKiB0aGF0IGRlZmF1bHQgdG8gYSBCYXNpYyBtYXBwaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZUlzT3RoZXJTdXBwb3J0ZWRUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKE9USEVSX1NVUFBPUlRFRF9UWVBFX05BTUVTLCB0eXBlTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9USEVSX1NVUFBPUlRFRF9UWVBFX05BTUVTID0gewotCQlqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEudXRpbC5EYXRlLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS51dGlsLkNhbGVuZGFyLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5zcWwuRGF0ZS5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEuc3FsLlRpbWUuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLnNxbC5UaW1lc3RhbXAuY2xhc3MuZ2V0TmFtZSgpLAotCX07Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0eXBlIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0eXBlSW1wbGVtZW50c1NlcmlhbGl6YWJsZShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIEFTVCBhc3QpIHsKLQkJSVR5cGVCaW5kaW5nIHNlcmlhbGl6YWJsZVR5cGVCaW5kaW5nID0gYXN0LnJlc29sdmVXZWxsS25vd25UeXBlKFNFUklBTElaQUJMRV9UWVBFX05BTUUpOwotCQlyZXR1cm4gdHlwZUJpbmRpbmcuaXNBc3NpZ25tZW50Q29tcGF0aWJsZShzZXJpYWxpemFibGVUeXBlQmluZGluZyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUklBTElaQUJMRV9UWVBFX05BTUUgPSBqYXZhLmlvLlNlcmlhbGl6YWJsZS5jbGFzcy5nZXROYW1lKCk7Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTY1NDY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSnBhQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuTWV0aG9kU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db3VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUltcGwKLQlleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjxUeXBlPgotCWltcGxlbWVudHMgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUKLXsKLQlwcml2YXRlIFN0cmluZyBxdWFsaWZpZWROYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIHN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lOwotCi0JcHJpdmF0ZSBib29sZWFuIGFic3RyYWN0XzsgIC8vICdhYnN0cmFjdCcgaXMgYSByZXNlcnZlZCB3b3JkCi0KLQkvKioKLQkgKiBzdG9yZSBhbGwgbWVtYmVyIHR5cGVzIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZW4ndCBwZXJzaXN0YWJsZSBzbyB3ZSBjYW4KLQkgKiBnZW5lcmF0ZSB2YWxpZGF0aW9uIGVycm9ycwotCSAqLwotCXByaXZhdGUgZmluYWwgVmVjdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiBuZXN0ZWRUeXBlczsKLQotCXByaXZhdGUgZmluYWwgVmVjdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGZpZWxkczsKLQotCXByaXZhdGUgZmluYWwgVmVjdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG1ldGhvZHM7Ci0KLQlwcml2YXRlIEFjY2Vzc1R5cGUgYWNjZXNzVHlwZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogYnVpbGQgdG9wLWxldmVsIHBlcnNpc3RlbnQgdHlwZQotCSAqLwotCS8vIFRPRE8gdXNlIEpQQSBmYWN0b3J5Ci0JcHVibGljIHN0YXRpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBuZXdJbnN0YW5jZSgKLQkJCUpwYUNvbXBpbGF0aW9uVW5pdCBqcGFDb21waWxhdGlvblVuaXQsCi0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLAotCQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVHlwZSB0eXBlID0gbmV3IEpEVFR5cGUoCi0JCQkJdHlwZURlY2xhcmF0aW9uLAotCQkJCWpwYUNvbXBpbGF0aW9uVW5pdC5nZXRDb21waWxhdGlvblVuaXQoKSwKLQkJCQlqcGFDb21waWxhdGlvblVuaXQuZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcigpLAotCQkJCWpwYUNvbXBpbGF0aW9uVW5pdC5nZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCA9IG5ldyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUltcGwoanBhQ29tcGlsYXRpb25Vbml0LCB0eXBlKTsKLQkJanJwdC5pbml0aWFsaXplKGFzdFJvb3QpOwotCQlyZXR1cm4ganJwdDsJCi0JfQotCi0JLyoqCi0JICogYnVpbGQgbmVzdGVkIHBlcnNpc3RlbnQgdHlwZQotCSAqLwotCS8vIFRPRE8gdXNlIEpQQSBmYWN0b3J5Ci0JcHJvdGVjdGVkIHN0YXRpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBuZXdJbnN0YW5jZSgKLQkJCUpwYUNvbXBpbGF0aW9uVW5pdCBqcGFDb21waWxhdGlvblVuaXQsCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLAotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUeXBlIHR5cGUgPSBuZXcgSkRUVHlwZSgKLQkJCQlkZWNsYXJpbmdUeXBlLAotCQkJCXR5cGVEZWNsYXJhdGlvbiwKLQkJCQlvY2N1cnJlbmNlLAotCQkJCWpwYUNvbXBpbGF0aW9uVW5pdC5nZXRDb21waWxhdGlvblVuaXQoKSwKLQkJCQlqcGFDb21waWxhdGlvblVuaXQuZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcigpLAotCQkJCWpwYUNvbXBpbGF0aW9uVW5pdC5nZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCA9IG5ldyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUltcGwoanBhQ29tcGlsYXRpb25Vbml0LCB0eXBlKTsKLQkJanJwdC5pbml0aWFsaXplKGFzdFJvb3QpOwotCQlyZXR1cm4ganJwdDsJCi0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlSW1wbChKcGFDb21waWxhdGlvblVuaXQganBhQ29tcGlsYXRpb25Vbml0LCBUeXBlIHR5cGUpIHsKLQkJc3VwZXIoanBhQ29tcGlsYXRpb25Vbml0LCB0eXBlKTsKLQkJdGhpcy5uZXN0ZWRUeXBlcyA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+KCk7IAotCQl0aGlzLmZpZWxkcyA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJdGhpcy5tZXRob2RzID0gbmV3IFZlY3RvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5xdWFsaWZpZWROYW1lID0gdGhpcy5idWlsZFF1YWxpZmllZE5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpOwotCQl0aGlzLnN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lID0gdGhpcy5idWlsZFN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lKGFzdFJvb3QpOwotCQl0aGlzLmFic3RyYWN0XyA9IHRoaXMuYnVpbGRBYnN0cmFjdChhc3RSb290KTsKLQkJdGhpcy5pbml0aWFsaXplTmVzdGVkVHlwZXMoYXN0Um9vdCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUZpZWxkcyhhc3RSb290KTsKLQkJdGhpcy5pbml0aWFsaXplTWV0aG9kcyhhc3RSb290KTsKLQkJdGhpcy5hY2Nlc3NUeXBlID0gdGhpcy5idWlsZEFjY2Vzc1R5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTmVzdGVkVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKCk7Ci0JCWZvciAoVHlwZURlY2xhcmF0aW9uIHRkIDogdGhpcy5nZXRNZW1iZXIoKS5nZXRUeXBlcyhhc3RSb290KSkgewotCQkJU3RyaW5nIHRkTmFtZSA9IHRkLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCWludCBvY2N1cnJlbmNlID0gY291bnRlcnMuaW5jcmVtZW50KHRkTmFtZSk7Ci0JCQl0aGlzLm5lc3RlZFR5cGVzLmFkZCh0aGlzLmJ1aWxkTmVzdGVkVHlwZSh0ZCwgb2NjdXJyZW5jZSwgYXN0Um9vdCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAoKTsKLQkJZm9yIChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gOiB0aGlzLmdldE1lbWJlcigpLmdldEZpZWxkcyhhc3RSb290KSkgewotCQkJZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgOiBmcmFnbWVudHMoZmllbGREZWNsYXJhdGlvbikpIHsKLQkJCQlTdHJpbmcgZmllbGROYW1lID0gZnJhZ21lbnQuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCWludCBvY2N1cnJlbmNlID0gY291bnRlcnMuaW5jcmVtZW50KGZpZWxkTmFtZSk7Ci0JCQkJdGhpcy5maWVsZHMuYWRkKHRoaXMuYnVpbGRGaWVsZChmaWVsZE5hbWUsIG9jY3VycmVuY2UsIGFzdFJvb3QpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNZXRob2RzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvdW50ZXJNYXAgY291bnRlcnMgPSBuZXcgQ291bnRlck1hcCgpOwotCQlmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogdGhpcy5nZXRNZW1iZXIoKS5nZXRNZXRob2RzKGFzdFJvb3QpKSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlID0gSkRUVG9vbHMuYnVpbGRNZXRob2RTaWduYXR1cmUobWV0aG9kRGVjbGFyYXRpb24pOwotCQkJaW50IG9jY3VycmVuY2UgPSBjb3VudGVycy5pbmNyZW1lbnQoc2lnbmF0dXJlKTsKLQkJCXRoaXMubWV0aG9kcy5hZGQodGhpcy5idWlsZE1ldGhvZChzaWduYXR1cmUsIG9jY3VycmVuY2UsIGFzdFJvb3QpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb24gYnVpbGRNYXBwaW5nQW5ub3RhdGlvbihTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5idWlsZFR5cGVNYXBwaW5nQW5ub3RhdGlvbih0aGlzLCBnZXRNZW1iZXIoKSwgbWFwcGluZ0Fubm90YXRpb25OYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb24gYnVpbGROdWxsTWFwcGluZ0Fubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5idWlsZE51bGxUeXBlTWFwcGluZ0Fubm90YXRpb24odGhpcywgZ2V0TWVtYmVyKCksIGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5idWlsZFR5cGVBbm5vdGF0aW9uKHRoaXMsIGdldE1lbWJlcigpLCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5idWlsZE51bGxUeXBlQW5ub3RhdGlvbih0aGlzLCBnZXRNZW1iZXIoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gcG9zc2libGVNYXBwaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkudHlwZU1hcHBpbmdBbm5vdGF0aW9uTmFtZXMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQb3NzaWJsZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkudHlwZUFubm90YXRpb25OYW1lcygpLCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzUG9zc2libGVNYXBwaW5nQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS50eXBlTWFwcGluZ0Fubm90YXRpb25OYW1lcygpLCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCS8vb3ZlcnJpZGluZyBwdXJlbHkgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcgeW91IGdldCBhdCB0aGUgY2xhc3MgbGV2ZWwKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gc3VwZXIuYW5ub3RhdGlvbnMobmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkvL292ZXJyaWRpbmcgcHVyZWx5IHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nIHlvdSBnZXQgYXQgdGhlIGNsYXNzIGxldmVsCi0JcHVibGljIEl0ZXJhdG9yPEFubm90YXRpb24+IG1hcHBpbmdBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIHN1cGVyLm1hcHBpbmdBbm5vdGF0aW9ucygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkvL292ZXJyaWRpbmcgcHVyZWx5IHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nIHlvdSBnZXQgYXQgdGhlIGNsYXNzIGxldmVsCi0JcHVibGljIEl0ZXJhdG9yPEFubm90YXRpb24+IGFubm90YXRpb25zKCkgewotCQlyZXR1cm4gc3VwZXIuYW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIucmVzb2x2ZVR5cGVzKGFzdFJvb3QpOwotCi0JCXRoaXMuc2V0U3VwZXJDbGFzc1F1YWxpZmllZE5hbWUodGhpcy5idWlsZFN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lKGFzdFJvb3QpKTsKLQotCQlmb3IgKEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IHRoaXMuZmllbGRzXygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXN0cmVhbS5uZXh0KCkucmVzb2x2ZVR5cGVzKGFzdFJvb3QpOwotCQl9Ci0KLQkJLy8gYSBuZXcgdHlwZSBjYW4gdHJpZ2dlciBhIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZSB0byBiZSBhIHJlc29sdmVkLAotCQkvLyBmdWxseS1xdWFsaWZpZWQgbmFtZSwgc28gd2UgbmVlZCB0byByZWJ1aWxkIG91ciBsaXN0IG9mIG1ldGhvZHM6Ci0JCS8vICAgICAic2V0Rm9vKEZvbykiIGlzIG5vdCB0aGUgc2FtZSBhcyAic2V0Rm9vKGNvbS5iYXIuRm9vKSIKLQkJLy8gYW5kLCB2aWNlLXZlcnNhLCBhIHJlbW92ZWQgdHlwZSBjYW4gInVucmVzb2x2ZSIgYSBwYXJhbWV0ZXIgdHlwZQotCQl0aGlzLnVwZGF0ZU1ldGhvZHMoYXN0Um9vdCk7Ci0KLQkJZm9yIChJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSB0aGlzLm1ldGhvZHNfKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc3RyZWFtLm5leHQoKS5yZXNvbHZlVHlwZXMoYXN0Um9vdCk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gc3RyZWFtID0gdGhpcy5uZXN0ZWRUeXBlc18oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpLnJlc29sdmVUeXBlcyhhc3RSb290KTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKiBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCi0JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCS8vIFRPRE8gbm90IHN1cmUgd2h5IGEgbnVsbCBuYW1lIGlzIGNvbWluZyB0aHJvdWdoIGhlcmUuLi4gIH5ianYKLS8vCQlpZiAoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZS5lcXVhbHModGhpcy5nZXRRdWFsaWZpZWROYW1lKCkpKSB7Ci0JCWlmICh0aGlzLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IHN0cmVhbSA9IHRoaXMubmVzdGVkVHlwZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0gc3RyZWFtLm5leHQoKTsKLQkJCS8vIHJlY3Vyc2UKLQkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIG5lc3RlZEpSUFQgPSBqcnB0LmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwotCQkJaWYgKG5lc3RlZEpSUFQgIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXN0ZWRKUlBUOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIG9ubHkgcGVyc2lzdGFibGUgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUF0dHJpYnV0ZUFubm90YXRpb25zKCkgewotCQlmb3IgKEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IHRoaXMuYXR0cmlidXRlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmhhc0FueUFubm90YXRpb24oKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIG5lc3RlZCB0eXBlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiByZXR1cm4gb25seSBwZXJzaXN0YWJsZSBuZXN0ZWQgdHlwZXMKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IG5lc3RlZFR5cGVzKCkgewotCQkvL1RPRE8gc2luY2Ugd2UgYXJlIGZpbHRlcmluZyBob3cgZG8gd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEgdHlwZSBiZWNvbWVzIHBlcnNpc3RhYmxlPwotCQkvL3doYXQga2luZCBvZiBjaGFuZ2Ugbm90aWZpY2lhdGlvbiBmb3IgdGhhdCBjYXNlPwotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4odGhpcy5uZXN0ZWRUeXBlc18oKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgewotCQkJCXJldHVybiBqcnB0LmlzUGVyc2lzdGFibGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiAqYWxsKiBuZXN0ZWQgdHlwZXMKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IG5lc3RlZFR5cGVzXygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPih0aGlzLm5lc3RlZFR5cGVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROZXN0ZWRUeXBlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIG5lc3RlZFR5cGUpIHsKLQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKG5lc3RlZFR5cGUsIHRoaXMubmVzdGVkVHlwZXMsIE5FU1RFRF9UWVBFU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOZXN0ZWRUeXBlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIG5lc3RlZFR5cGUpIHsKLQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24obmVzdGVkVHlwZSwgdGhpcy5uZXN0ZWRUeXBlcywgTkVTVEVEX1RZUEVTX0NPTExFQ1RJT04pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5lc3RlZFR5cGVzKENvbGxlY3Rpb248SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IHJlbW92ZSkgewotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocmVtb3ZlLCB0aGlzLm5lc3RlZFR5cGVzLCBORVNURURfVFlQRVNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldE5lc3RlZFR5cGUoU3RyaW5nIHR5cGVOYW1lLCBpbnQgb2NjdXJyZW5jZSkgewotCQlmb3IgKEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiBzdHJlYW0gPSB0aGlzLm5lc3RlZFR5cGVzXygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIG5lc3RlZFR5cGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5lc3RlZFR5cGUuaXNGb3IodHlwZU5hbWUsIG9jY3VycmVuY2UpKSB7Ci0JCQkJcmV0dXJuIG5lc3RlZFR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGF0dHJpYnV0ZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogcmV0dXJuIG9ubHkgcGVyc2lzdGFibGUgYXR0cmlidXRlcwotCSAqLwotCS8vIFRPRE8gc2luY2Ugd2UgYXJlIGZpbHRlcmluZywgaG93IGRvIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhbiBhdHRyaWJ1dGUgYmVjb21lcyBwZXJzaXN0YWJsZT8KLQkvLyB3aGF0IGtpbmQgb2YgY2hhbmdlIG5vdGlmaWNhdGlvbiBmb3IgdGhhdCBjYXNlPwotCXB1YmxpYyBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gcGVyc2lzdGFibGVNZW1iZXJzKHRoaXMuYXR0cmlidXRlc18oKSk7Ci0JfQotCi0JLyoqCi0JICogKmFsbCogZmllbGRzIGFuZCBtZXRob2RzCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXNfKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMuZmllbGRzXygpLCB0aGlzLm1ldGhvZHNfKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmaWVsZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogcmV0dXJuIG9ubHkgcGVyc2lzdGFibGUgZmllbGRzCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGZpZWxkcygpIHsKLQkJcmV0dXJuIHBlcnNpc3RhYmxlTWVtYmVycyh0aGlzLmZpZWxkc18oKSk7Ci0JfQotCQotCS8qKgotCSAqICphbGwqIGZpZWxkcwotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBmaWVsZHNfKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5maWVsZHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEZpZWxkKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihhdHRyaWJ1dGUsIHRoaXMuZmllbGRzLCBBVFRSSUJVVEVTX0NPTExFQ1RJT04pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZpZWxkKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKGF0dHJpYnV0ZSwgdGhpcy5maWVsZHMsIEFUVFJJQlVURVNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRmllbGRzKENvbGxlY3Rpb248SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcmVtb3ZlKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmUsIHRoaXMuZmllbGRzLCBBVFRSSUJVVEVTX0NPTExFQ1RJT04pOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGdldEZpZWxkKFN0cmluZyBmaWVsZE5hbWUsIGludCBvY2N1cnJlbmNlKSB7Ci0JCWZvciAoSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gdGhpcy5maWVsZHNfKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBmaWVsZCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoZmllbGQuaXNGb3IoZmllbGROYW1lLCBvY2N1cnJlbmNlKSkgewotCQkJCXJldHVybiBmaWVsZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiByZXR1cm4gb25seSBwZXJzaXN0YWJsZSBwcm9wZXJ0aWVzCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBwZXJzaXN0YWJsZU1lbWJlcnModGhpcy5tZXRob2RzXygpKTsKLQl9Ci0KLQkvKioKLQkgKiAqYWxsKiBtZXRob2RzCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG1ldGhvZHNfKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5tZXRob2RzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRob2QoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKGF0dHJpYnV0ZSwgdGhpcy5tZXRob2RzLCBBVFRSSUJVVEVTX0NPTExFQ1RJT04pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1ldGhvZChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihhdHRyaWJ1dGUsIHRoaXMubWV0aG9kcywgQVRUUklCVVRFU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNZXRob2RzKENvbGxlY3Rpb248SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcmVtb3ZlKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmUsIHRoaXMubWV0aG9kcywgQVRUUklCVVRFU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRNZXRob2QoTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJZm9yIChJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSB0aGlzLm1ldGhvZHNfKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBtZXRob2QgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG1ldGhvZC5pc0ZvcihzaWduYXR1cmUsIG9jY3VycmVuY2UpKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2ltcGxlIGluc3RhbmNlIHZhcmlhYmxlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnF1YWxpZmllZE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UXVhbGlmaWVkTmFtZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5xdWFsaWZpZWROYW1lOwotCQl0aGlzLnF1YWxpZmllZE5hbWUgPSBxdWFsaWZpZWROYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVBTElGSUVEX05BTUVfUFJPUEVSVFksIG9sZCwgcXVhbGlmaWVkTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdXBlckNsYXNzUXVhbGlmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3VwZXJDbGFzc1F1YWxpZmllZE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3VwZXJDbGFzc1F1YWxpZmllZE5hbWUoU3RyaW5nIHN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lOwotCQl0aGlzLnN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lID0gc3VwZXJDbGFzc1F1YWxpZmllZE5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTVVBFUl9DTEFTU19RVUFMSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkLCBzdXBlckNsYXNzUXVhbGlmaWVkTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpIHsKLQkJcmV0dXJuIHRoaXMuYWJzdHJhY3RfOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFic3RyYWN0KGJvb2xlYW4gYWJzdHJhY3RfKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5hYnN0cmFjdF87Ci0JCXRoaXMuYWJzdHJhY3RfID0gYWJzdHJhY3RfOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUJTVFJBQ1RfUFJPUEVSVFksIG9sZCwgYWJzdHJhY3RfKTsKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLmFjY2Vzc1R5cGU7Ci0JfQotCi0JLy8gVE9ETwotCS8vc2VlbXMgd2UgY291bGQgaGF2ZSBhIHB1YmxpYyBjaGFuZ2VBY2Nlc3MoKSBhcGkgd2hpY2ggd291bGQKLQkvL21vdmUgYWxsIGFubm90YXRpb25zIGZyb20gZmllbGRzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBvciB2aWNlIHZlcnNhCi0JLy90aG91Z2ggb2YgY291cnNlIGl0J3MgbW9yZSBjb21wbGljYXRlZCB0aGFuIHRoYXQgc2luY2Ugd2hhdCBpZiB0aGUKLQkvL2NvcnJlc3BvbmRpbmcgZmllbGQvbWV0aG9kIGRvZXMgbm90IGV4aXN0PwotCS8vbWFraW5nIHRoaXMgaW50ZXJuYWwgc2luY2UgaXQgc2hvdWxkIG9ubHkgYmUgc2V0IGJhc2VkIG9uIGNoYW5nZXMgaW4gdGhlIHNvdXJjZSwgdGhlCi0JLy9jb250ZXh0IG1vZGVsIHNob3VsZCBub3QgbmVlZCB0byBzZXQgdGhpcwotCXByb3RlY3RlZCB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUpIHsKLQkJQWNjZXNzVHlwZSBvbGQgPSB0aGlzLmFjY2Vzc1R5cGU7Ci0JCXRoaXMuYWNjZXNzVHlwZSA9IGFjY2Vzc1R5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBQ0NFU1NfUFJPUEVSVFksIG9sZCwgYWNjZXNzVHlwZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVwZGF0ZSBmcm9tIEphdmEgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlRnJvbUphdmEoYXN0Um9vdCk7Ci0JCXRoaXMuc2V0UXVhbGlmaWVkTmFtZSh0aGlzLmJ1aWxkUXVhbGlmaWVkTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0TmFtZSh0aGlzLmJ1aWxkTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0U3VwZXJDbGFzc1F1YWxpZmllZE5hbWUodGhpcy5idWlsZFN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRBYnN0cmFjdCh0aGlzLmJ1aWxkQWJzdHJhY3QoYXN0Um9vdCkpOwotCQl0aGlzLnVwZGF0ZU5lc3RlZFR5cGVzKGFzdFJvb3QpOwotCQl0aGlzLnVwZGF0ZUZpZWxkcyhhc3RSb290KTsKLQkJdGhpcy51cGRhdGVNZXRob2RzKGFzdFJvb3QpOwotCQl0aGlzLnNldEFjY2Vzcyh0aGlzLmJ1aWxkQWNjZXNzVHlwZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVOZXN0ZWRUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCVZlY3RvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gbmVzdGVkVHlwZXNUb1JlbW92ZSA9IChWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+KSB0aGlzLm5lc3RlZFR5cGVzLmNsb25lKCk7Ci0JCWZvciAoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA6IHRoaXMuZ2V0TWVtYmVyKCkuZ2V0VHlwZXMoYXN0Um9vdCkpIHsKLQkJCVN0cmluZyB0ZE5hbWUgPSB0eXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJaW50IG9jY3VycmVuY2UgPSBjb3VudGVycy5pbmNyZW1lbnQodGROYW1lKTsKLQotCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgbmVzdGVkVHlwZSA9IHRoaXMuZ2V0TmVzdGVkVHlwZSh0ZE5hbWUsIG9jY3VycmVuY2UpOwotCQkJaWYgKG5lc3RlZFR5cGUgPT0gbnVsbCkgewotCQkJCXRoaXMuYWRkTmVzdGVkVHlwZSh0aGlzLmJ1aWxkTmVzdGVkVHlwZSh0eXBlRGVjbGFyYXRpb24sIG9jY3VycmVuY2UsIGFzdFJvb3QpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmVzdGVkVHlwZXNUb1JlbW92ZS5yZW1vdmUobmVzdGVkVHlwZSk7Ci0JCQkJbmVzdGVkVHlwZS51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKLQkJCX0KLQkJfQotCQl0aGlzLnJlbW92ZU5lc3RlZFR5cGVzKG5lc3RlZFR5cGVzVG9SZW1vdmUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUZpZWxkcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCVZlY3RvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBmaWVsZHNUb1JlbW92ZSA9IChWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4pIHRoaXMuZmllbGRzLmNsb25lKCk7Ci0JCWZvciAoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uIDogdGhpcy5nZXRNZW1iZXIoKS5nZXRGaWVsZHMoYXN0Um9vdCkpIHsKLQkJCWZvciAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50IDogZnJhZ21lbnRzKGZpZWxkRGVjbGFyYXRpb24pKSB7Ci0JCQkJU3RyaW5nIGZpZWxkTmFtZSA9IGZyYWdtZW50LmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudChmaWVsZE5hbWUpOwotCi0JCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBmaWVsZCA9IHRoaXMuZ2V0RmllbGQoZmllbGROYW1lLCBvY2N1cnJlbmNlKTsKLQkJCQlpZiAoZmllbGQgPT0gbnVsbCkgewotCQkJCQl0aGlzLmFkZEZpZWxkKHRoaXMuYnVpbGRGaWVsZChmaWVsZE5hbWUsIG9jY3VycmVuY2UsIGFzdFJvb3QpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmaWVsZHNUb1JlbW92ZS5yZW1vdmUoZmllbGQpOwotCQkJCQlmaWVsZC51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhpcy5yZW1vdmVGaWVsZHMoZmllbGRzVG9SZW1vdmUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1ldGhvZHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gbWV0aG9kc1RvUmVtb3ZlID0gKFZlY3RvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPikgdGhpcy5tZXRob2RzLmNsb25lKCk7Ci0JCWZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiB0aGlzLmdldE1lbWJlcigpLmdldE1ldGhvZHMoYXN0Um9vdCkpIHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUgPSBKRFRUb29scy5idWlsZE1ldGhvZFNpZ25hdHVyZShtZXRob2REZWNsYXJhdGlvbik7Ci0JCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudChzaWduYXR1cmUpOwotCi0JCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIG1ldGhvZCA9IHRoaXMuZ2V0TWV0aG9kKHNpZ25hdHVyZSwgb2NjdXJyZW5jZSk7Ci0JCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCQl0aGlzLmFkZE1ldGhvZCh0aGlzLmJ1aWxkTWV0aG9kKHNpZ25hdHVyZSwgb2NjdXJyZW5jZSwgYXN0Um9vdCkpOwotCQkJfSBlbHNlIHsKLQkJCQltZXRob2RzVG9SZW1vdmUucmVtb3ZlKG1ldGhvZCk7Ci0JCQkJbWV0aG9kLnVwZGF0ZUZyb21KYXZhKGFzdFJvb3QpOwotCQkJfQotCQl9Ci0JCXRoaXMucmVtb3ZlTWV0aG9kcyhtZXRob2RzVG9SZW1vdmUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBidWlsZGluZyBzdGF0ZSBmcm9tIEFTVCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkUXVhbGlmaWVkTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRNZW1iZXIoKS5nZXRCaW5kaW5nKGFzdFJvb3QpLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRNZW1iZXIoKS5nZXRCaW5kaW5nKGFzdFJvb3QpLmdldE5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3VwZXJDbGFzc1F1YWxpZmllZE5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5nZXRNZW1iZXIoKS5nZXRCaW5kaW5nKGFzdFJvb3QpOwotCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVR5cGVCaW5kaW5nIHN1cGVyQ2xhc3NUeXBlQmluZGluZyA9IHR5cGVCaW5kaW5nLmdldFN1cGVyY2xhc3MoKTsKLQkJaWYgKHN1cGVyQ2xhc3NUeXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXJDbGFzc1R5cGVCaW5kaW5nLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZEFic3RyYWN0KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBNb2RpZmllci5pc0Fic3RyYWN0KHRoaXMuZ2V0TWVtYmVyKCkuZ2V0QmluZGluZyhhc3RSb290KS5nZXRNb2RpZmllcnMoKSk7CQotCX0KLQotCS8vIFRPRE8gdXNlIEpQQSBmYWN0b3J5Ci0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGJ1aWxkTmVzdGVkVHlwZShUeXBlRGVjbGFyYXRpb24gbmVzdGVkVHlwZURlY2xhcmF0aW9uLCBpbnQgb2NjdXJyZW5jZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKHRoaXMuZ2V0SnBhQ29tcGlsYXRpb25Vbml0KCksIHRoaXMuZ2V0TWVtYmVyKCksIG5lc3RlZFR5cGVEZWNsYXJhdGlvbiwgb2NjdXJyZW5jZSwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gVE9ETyB1c2UgSlBBIGZhY3RvcnkKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZEZpZWxkKFN0cmluZyBmaWVsZE5hbWUsIGludCBvY2N1cnJlbmNlLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZUltcGwubmV3SW5zdGFuY2UodGhpcywgdGhpcy5nZXRNZW1iZXIoKSwgZmllbGROYW1lLCBvY2N1cnJlbmNlLCB0aGlzLmdldEpwYUNvbXBpbGF0aW9uVW5pdCgpLCBhc3RSb290KTsKLQl9Ci0KLQkvLyBUT0RPIHVzZSBKUEEgZmFjdG9yeQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkTWV0aG9kKE1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUsIGludCBvY2N1cnJlbmNlLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZUltcGwubmV3SW5zdGFuY2UodGhpcywgdGhpcy5nZXRNZW1iZXIoKSwgc2lnbmF0dXJlLCBvY2N1cnJlbmNlLCB0aGlzLmdldEpwYUNvbXBpbGF0aW9uVW5pdCgpLCBhc3RSb290KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEFjY2Vzc1R5cGUgY3VycmVudGx5IGltcGxpZWQgYnkgdGhlIEphdmEgc291cmNlIGNvZGU6Ci0JICogICAgIC0gaWYgb25seSBGaWVsZHMgYXJlIGFubm90YXRlZCA9PiBGSUVMRAotCSAqICAgICAtIGlmIG9ubHkgUHJvcGVydGllcyBhcmUgYW5ub3RhdGVkID0+IFBST1BFUlRZCi0JICogICAgIC0gaWYgYm90aCBGaWVsZHMgYW5kIFByb3BlcnRpZXMgYXJlIGFubm90YXRlZCA9PiBGSUVMRAotCSAqICAgICAtIGlmIG5vdGhpbmcgaXMgYW5ub3RhdGVkCi0JICogICAgIAkJLSBhbmQgZmllbGRzIGV4aXN0ID0+IEZJRUxECi0JICogICAgIAkJLSBhbmQgcHJvcGVydGllcyBleGlzdCwgYnV0IG5vIGZpZWxkcyBleGlzdCA9PiBQUk9QRVJUWQotCSAqICAgICAJCS0gYW5kIG5laXRoZXIgZmllbGRzIG5vciBwcm9wZXJ0aWVzIGV4aXN0ID0+IG51bGwgYXQgdGhpcyBsZXZlbCAoRklFTEQgaW4gdGhlIGNvbnRleHQgbW9kZWwpCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYnVpbGRBY2Nlc3NUeXBlKCkgewotCQlib29sZWFuIGhhc1BlcnNpc3RhYmxlRmllbGRzID0gZmFsc2U7Ci0JCWJvb2xlYW4gaGFzUGVyc2lzdGFibGVQcm9wZXJ0aWVzID0gZmFsc2U7Ci0JCWZvciAoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBmaWVsZCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShmaWVsZHMoKSkpIHsKLQkJCWhhc1BlcnNpc3RhYmxlRmllbGRzID0gdHJ1ZTsKLQkJCWlmIChmaWVsZC5oYXNBbnlBbm5vdGF0aW9uKCkpIHsKLQkJCQkvLyBhbnkgZmllbGQgaXMgYW5ub3RhdGVkID0+IEZJRUxECi0JCQkJcmV0dXJuIEFjY2Vzc1R5cGUuRklFTEQ7Ci0JCQl9Ci0JCX0KLQkJZm9yIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHByb3BlcnR5IDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHByb3BlcnRpZXMoKSkpIHsKLQkJCWhhc1BlcnNpc3RhYmxlUHJvcGVydGllcyA9IHRydWU7Ci0JCQlpZiAocHJvcGVydHkuaGFzQW55QW5ub3RhdGlvbigpKSB7Ci0JCQkJLy8gbm9uZSBvZiB0aGUgZmllbGRzIGFyZSBhbm5vdGF0ZWQgYW5kIGEgZ2V0dGVyIGlzIGFubm90YXRlZCA9PiBQUk9QRVJUWQotCQkJCXJldHVybiBBY2Nlc3NUeXBlLlBST1BFUlRZOwotCQkJfQotCQl9Ci0KLQkJaWYgKGhhc1BlcnNpc3RhYmxlUHJvcGVydGllcyAmJiAhaGFzUGVyc2lzdGFibGVGaWVsZHMpIHsKLQkJCXJldHVybiBBY2Nlc3NUeXBlLlBST1BFUlRZOwotCQl9Ci0JCS8vbm8gYW5ub3RhdGlvbnMgZXhpc3QsIGFjY2VzcyBpcyBudWxsIGF0IHRoZSByZXNvdXJjZSBtb2RlbCBsZXZlbAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ+IGZyYWdtZW50cyhGaWVsZERlY2xhcmF0aW9uIGZkKSB7Ci0JCXJldHVybiBmZC5mcmFnbWVudHMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3RyaW5nQ291bnRlciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENvdW50ZXJNYXAgewotCQlIYXNoTWFwPE9iamVjdCwgQ291bnRlcj4gY291bnRlcnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIENvdW50ZXI+KCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW5jcmVtZW50ZWQgY291bnQgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCQkgKi8KLQkJaW50IGluY3JlbWVudChPYmplY3QgbykgewotCQkJQ291bnRlciBjb3VudGVyID0gdGhpcy5jb3VudGVycy5nZXQobyk7Ci0JCQlpZiAoY291bnRlciA9PSBudWxsKSB7Ci0JCQkJY291bnRlciA9IG5ldyBDb3VudGVyKCk7Ci0JCQkJdGhpcy5jb3VudGVycy5wdXQobywgY291bnRlcik7Ci0JCQl9Ci0JCQljb3VudGVyLmluY3JlbWVudCgpOwotCQkJcmV0dXJuIGNvdW50ZXIuY291bnQoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmMyNDhhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5Sm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlSm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgSm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gU291cmNlSm9pbkNvbHVtbkFubm90YXRpb24uY3JlYXRlSm9pbkNvbHVtbihwYXJlbnQsIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlKb2luQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJhOGIxMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uSW1wbCBleHRlbmRzIEJhc2VDb2x1bW5JbXBsIGltcGxlbWVudHMgTmVzdGFibGVKb2luQ29sdW1uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdyZWZlcmVuY2VkIGNvbHVtbiBuYW1lJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHJlZmVyZW5jZWRDb2x1bW5OYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiByZWZlcmVuY2VkQ29sdW1uTmFtZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkKLQlwdWJsaWMgSm9pbkNvbHVtbkltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIoSlBBLkpPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0RWxlbWVudEFkYXB0ZXIodGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCQotCXB1YmxpYyBKb2luQ29sdW1uSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJdGhpcyhwYXJlbnQsIG1lbWJlciwgZGFhLCBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBkYWEpKTsKLQl9Ci0JCi0JcHVibGljIEpvaW5Db2x1bW5JbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCXRoaXMocGFyZW50LCBtZW1iZXIsIGlkYWEsIG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBpZGFhKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OX19OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbHVtbkRlZmluaXRpb25FbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgdGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fVEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyB1bmlxdWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fVU5JUVVFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgbnVsbGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fTlVMTEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBpbnNlcnRhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuSk9JTl9DT0xVTU5fX0lOU0VSVEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyB1cGRhdGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fVVBEQVRBQkxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCXByaXZhdGUgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIChJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIpIHN1cGVyLmdldEFubm90YXRpb25BZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7Ci0JCWdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpLm1vdmVBbm5vdGF0aW9uKG5ld0luZGV4KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQW5ub3RhdGlvbik7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIG9sZENvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKLQkJc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUob2xkQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQkvLyoqKioqKioqKioqKiBKb2luQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmV3UmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuZXdSZWZlcmVuY2VkQ29sdW1uTmFtZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVBZGFwdGVyLnNldFZhbHVlKG5ld1JlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSwgbmV3UmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnVwZGF0ZUZyb21KYXZhKGFzdFJvb3QpOwotCQl0aGlzLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUoYXN0Um9vdCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlzdGF0aWMgSm9pbkNvbHVtbkltcGwgY3JlYXRlSm9pbkNvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5JbXBsKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQkKLQlzdGF0aWMgSm9pbkNvbHVtbkltcGwgY3JlYXRlTmVzdGVkSm9pbkNvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGpvaW5Db2x1bW5zQWRhcHRlcikgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4LCBqb2luQ29sdW1uc0FkYXB0ZXIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgaWRhYSk7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbkltcGwocGFyZW50LCBtZW1iZXIsIGlkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGpvaW5Db2x1bW5zQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGpvaW5Db2x1bW5zQWRhcHRlciwgaW5kZXgsIEpQQS5KT0lOX0NPTFVNTik7Ci0JfQotCXN0YXRpYyBOZXN0YWJsZUpvaW5Db2x1bW4gY3JlYXRlSm9pblRhYmxlSm9pbkNvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbkltcGwocGFyZW50LCBtZW1iZXIsIGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZEpvaW5UYWJsZUFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpvaW5UYWJsZUltcGwuREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TLCBpbmRleCwgSlBBLkpPSU5fQ09MVU1OKTsKLQl9Ci0KLQlzdGF0aWMgTmVzdGFibGVKb2luQ29sdW1uIGNyZWF0ZUpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uSW1wbChwYXJlbnQsIG1lbWJlciwgYnVpbGRKb2luVGFibGVJbnZlcnNlQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZEpvaW5UYWJsZUludmVyc2VBbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKb2luVGFibGVJbXBsLkRFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkpPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TLCBpbmRleCwgSlBBLkpPSU5fQ09MVU1OKTsKLQl9Ci0JCi0JCi0Jc3RhdGljIE5lc3RhYmxlSm9pbkNvbHVtbiBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtbihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFzc29jaWF0aW9uT3ZlcnJpZGVBZGFwdGVyLCBKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbkltcGwocGFyZW50LCBtZW1iZXIsIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BZGFwdGVyKGFzc29jaWF0aW9uT3ZlcnJpZGVBZGFwdGVyLCBpbmRleCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYXNzb2NpYXRpb25PdmVycmlkZUFkYXB0ZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGFzc29jaWF0aW9uT3ZlcnJpZGVBZGFwdGVyLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fQ09MVU1OUywgaW5kZXgsIEpQQS5KT0lOX0NPTFVNTik7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgSm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIEpvaW5Db2x1bW5JbXBsLmNyZWF0ZUpvaW5Db2x1bW4ocGFyZW50LCBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMDBmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUpvaW5Db2x1bW5zQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW5zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgSm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgSm9pbkNvbHVtbnNBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZUpvaW5Db2x1bW5zQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlcik7CisJfQorCisJcHVibGljIEpvaW5Db2x1bW5zQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeUpvaW5Db2x1bW5zQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtbnNJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyYzdjOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbnNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uc0ltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxNZW1iZXI+IGltcGxlbWVudHMgSm9pbkNvbHVtbnNBbm5vdGF0aW9uCi17Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIExpc3Q8TmVzdGFibGVKb2luQ29sdW1uPiBqb2luQ29sdW1uczsKLQkKLQlwcm90ZWN0ZWQgSm9pbkNvbHVtbnNJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLmpvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxOZXN0YWJsZUpvaW5Db2x1bW4+KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuaW5pdGlhbGl6ZU5lc3RlZEFubm90YXRpb25zKGFzdFJvb3QsIHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVKb2luQ29sdW1uPiBuZXN0ZWRBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZUpvaW5Db2x1bW4+KHRoaXMuam9pbkNvbHVtbnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbnMuc2l6ZSgpOwotCX0JCi0KLQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uIGFkZEludGVybmFsKGludCBpbmRleCkgewotCQlKb2luQ29sdW1uSW1wbCBqb2luQ29sdW1uID0gY3JlYXRlSm9pbkNvbHVtbihpbmRleCk7Ci0JCXRoaXMuam9pbkNvbHVtbnMuYWRkKGluZGV4LCBqb2luQ29sdW1uKTsKLQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZUpvaW5Db2x1bW4gYWRkKGludCBpbmRleCkgewotCQlKb2luQ29sdW1uSW1wbCBqb2luQ29sdW1uID0gY3JlYXRlSm9pbkNvbHVtbihpbmRleCk7Ci0JCWFkZChpbmRleCwgam9pbkNvbHVtbik7Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGQoaW50IGluZGV4LCBOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBqb2luQ29sdW1uLCB0aGlzLmpvaW5Db2x1bW5zLCBKT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChqb2luQ29sdW1uLCB0aGlzLmpvaW5Db2x1bW5zLCBKT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLmpvaW5Db2x1bW5zLCBKT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZihOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5pbmRleE9mKGpvaW5Db2x1bW4pOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uIG5lc3RlZEFubm90YXRpb25BdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbnMuZ2V0KGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBuZXN0ZWRBbm5vdGF0aW9uRm9yKEFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlmb3IgKE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogdGhpcy5qb2luQ29sdW1ucykgewotCQkJaWYgKGpkdEFubm90YXRpb24gPT0gam9pbkNvbHVtbi5nZXRKZHRBbm5vdGF0aW9uKChDb21waWxhdGlvblVuaXQpIGpkdEFubm90YXRpb24uZ2V0Um9vdCgpKSkgewotCQkJCXJldHVybiBqb2luQ29sdW1uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5qb2luQ29sdW1ucywgSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5qb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gInZhbHVlIjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLnVwZGF0ZU5lc3RlZEFubm90YXRpb25zRnJvbUphdmEoYXN0Um9vdCwgdGhpcyk7Ci0JfQotCQkKLQlwcml2YXRlIEpvaW5Db2x1bW5JbXBsIGNyZWF0ZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiBKb2luQ29sdW1uSW1wbC5jcmVhdGVOZXN0ZWRKb2luQ29sdW1uKHRoaXMsIGdldE1lbWJlcigpLCBpbmRleCwgZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgSm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgSm9pbkNvbHVtbnNBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uc0ltcGwocGFyZW50LCBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgSm9pbkNvbHVtbnNBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5UYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODQ0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUpvaW5UYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlSm9pblRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luVGFibGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEpvaW5UYWJsZUFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEpvaW5UYWJsZUFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEpvaW5UYWJsZUFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZUpvaW5UYWJsZUFubm90YXRpb24ocGFyZW50LCBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBOdWxsSm9pblRhYmxlQW5ub3RhdGlvbihwYXJlbnQpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeUpvaW5UYWJsZUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzNmYTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pblRhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29udGFpbmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKb2luVGFibGVJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZVRhYmxlIGltcGxlbWVudHMgSm9pblRhYmxlQW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBOQU1FX0FEQVBURVIgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5KT0lOX1RBQkxFX19OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gU0NIRU1BX0FEQVBURVIgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5KT0lOX1RBQkxFX19TQ0hFTUEpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBDQVRBTE9HX0FEQVBURVIgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5KT0lOX1RBQkxFX19DQVRBTE9HKTsKLQkKLQlwcml2YXRlIGZpbmFsIExpc3Q8TmVzdGFibGVKb2luQ29sdW1uPiBqb2luQ29sdW1uczsKLQkKLQlwcml2YXRlIGZpbmFsIExpc3Q8TmVzdGFibGVKb2luQ29sdW1uPiBpbnZlcnNlSm9pbkNvbHVtbnM7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBKb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24gam9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uOwotCQotCXByaXZhdGUgZmluYWwgSW52ZXJzZUpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbiBpbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uOwotCi0JcHJvdGVjdGVkIEpvaW5UYWJsZUltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJc3VwZXIocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKSk7Ci0JCXRoaXMuam9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE5lc3RhYmxlSm9pbkNvbHVtbj4oKTsKLQkJdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE5lc3RhYmxlSm9pbkNvbHVtbj4oKTsKLQkJdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24gPSBuZXcgSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbiA9IG5ldyBJbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmluaXRpYWxpemVOZXN0ZWRBbm5vdGF0aW9ucyhhc3RSb290LCB0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5pbml0aWFsaXplTmVzdGVkQW5ub3RhdGlvbnMoYXN0Um9vdCwgdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcikgewotCQkvLyBpZ25vcmUgdGhlIGRhYSBwYXNzZWQgaW4sIEBKb2luVGFibGUgaXMgbmV2ZXIgbmVzdGVkCi0JCXJldHVybiBOQU1FX0FEQVBURVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2NoZW1hQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJLy8gaWdub3JlIHRoZSBkYWEgcGFzc2VkIGluLCBASm9pblRhYmxlIGlzIG5ldmVyIG5lc3RlZAotCQlyZXR1cm4gU0NIRU1BX0FEQVBURVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gY2F0YWxvZ0FkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKSB7Ci0JCS8vIGlnbm9yZSB0aGUgZGFhIHBhc3NlZCBpbiwgQEpvaW5UYWJsZSBpcyBuZXZlciBuZXN0ZWQKLQkJcmV0dXJuIENBVEFMT0dfQURBUFRFUjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCBjcmVhdGVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQlyZXR1cm4gVW5pcXVlQ29uc3RyYWludEltcGwuY3JlYXRlSm9pblRhYmxlVW5pcXVlQ29uc3RyYWludCh0aGlzLCB0aGlzLmdldE1lbWJlcigpLCBpbmRleCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnVwZGF0ZUZyb21KYXZhKGFzdFJvb3QpOwotCQl0aGlzLnVwZGF0ZUpvaW5Db2x1bW5zRnJvbUphdmEoYXN0Um9vdCk7Ci0JCXRoaXMudXBkYXRlSW52ZXJzZUpvaW5Db2x1bW5zRnJvbUphdmEoYXN0Um9vdCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luQ29sdW1uc0Zyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy51cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKGFzdFJvb3QsIHRoaXMuam9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUludmVyc2VKb2luQ29sdW1uc0Zyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy51cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKGFzdFJvb3QsIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPih0aGlzLmpvaW5Db2x1bW5zKTsKLQl9Ci0JCi0JcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZkpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5pbmRleE9mKGpvaW5Db2x1bW4pOwotCX0KLQkKLQlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJTmVzdGFibGVKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoTmVzdGFibGVKb2luQ29sdW1uKSBDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuYWRkTmVzdGVkQW5ub3RhdGlvbihpbmRleCwgdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24pOwotCQlmaXJlSXRlbUFkZGVkKEpvaW5UYWJsZUFubm90YXRpb24uSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBqb2luQ29sdW1uKTsKLQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEpvaW5Db2x1bW4oaW50IGluZGV4LCBOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBqb2luQ29sdW1uLCB0aGlzLmpvaW5Db2x1bW5zLCBKT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5qb2luQ29sdW1ucy5nZXQoaW5kZXgpOwotCQlyZW1vdmVKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQlqb2luQ29sdW1uLnJlbW92ZUFubm90YXRpb24oKTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLnN5bmNoQW5ub3RhdGlvbnNBZnRlclJlbW92ZShpbmRleCwgdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVKb2luQ29sdW1uKE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChqb2luQ29sdW1uLCB0aGlzLmpvaW5Db2x1bW5zLCBKT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVKb2luQ29sdW1uSW50ZXJuYWwodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLnN5bmNoQW5ub3RhdGlvbnNBZnRlck1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCWZpcmVJdGVtTW92ZWQoSm9pblRhYmxlQW5ub3RhdGlvbi5KT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbW92ZUpvaW5Db2x1bW5JbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5pbnZlcnNlSm9pbkNvbHVtbnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmludmVyc2VKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW5BdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZkludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLmluZGV4T2Yoam9pbkNvbHVtbik7Ci0JfQotCQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJTmVzdGFibGVKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gKE5lc3RhYmxlSm9pbkNvbHVtbikgQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgsIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCWZpcmVJdGVtQWRkZWQoSm9pblRhYmxlQW5ub3RhdGlvbi5JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgaW52ZXJzZUpvaW5Db2x1bW4pOwotCQlyZXR1cm4gaW52ZXJzZUpvaW5Db2x1bW47Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgsIE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGpvaW5Db2x1bW4sIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLCBJTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnMuZ2V0KGluZGV4KTsKLQkJdGhpcy5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQkJam9pbkNvbHVtbi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW5kZXgsIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oTmVzdGFibGVKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGpvaW5Db2x1bW4sIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLCBJTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZUludmVyc2VKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVJbnZlcnNlSm9pbkNvbHVtbkludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJNb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1Nb3ZlZChKb2luVGFibGVBbm5vdGF0aW9uLklOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1vdmVJbnZlcnNlSm9pbkNvbHVtbkludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBOZXN0YWJsZUpvaW5Db2x1bW4gY3JlYXRlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIEpvaW5Db2x1bW5JbXBsLmNyZWF0ZUpvaW5UYWJsZUpvaW5Db2x1bW4odGhpcywgZ2V0TWVtYmVyKCksIGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTmVzdGFibGVKb2luQ29sdW1uIGNyZWF0ZUludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlyZXR1cm4gSm9pbkNvbHVtbkltcGwuY3JlYXRlSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW4odGhpcywgZ2V0TWVtYmVyKCksIGluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEpvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbiBleHRlbmRzIEFic3RyYWN0Q29udGFpbmVyQW5ub3RhdGlvbiB7Ci0KLQkJcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBhZGRJbnRlcm5hbChpbnQgaW5kZXgpIHsKLQkJCU5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gSm9pblRhYmxlSW1wbC50aGlzLmNyZWF0ZUpvaW5Db2x1bW4oaW5kZXgpOwotCQkJSm9pblRhYmxlSW1wbC50aGlzLmpvaW5Db2x1bW5zLmFkZChpbmRleCwgam9pbkNvbHVtbik7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbiBhZGQoaW50IGluZGV4KSB7Ci0JCQlOZXN0YWJsZUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IEpvaW5UYWJsZUltcGwudGhpcy5jcmVhdGVKb2luQ29sdW1uKGluZGV4KTsKLQkJCUpvaW5UYWJsZUltcGwudGhpcy5hZGRKb2luQ29sdW1uKGluZGV4LCBqb2luQ29sdW1uKTsKLQkJCXJldHVybiBqb2luQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIGludCBpbmRleE9mKE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gSm9pblRhYmxlSW1wbC50aGlzLmluZGV4T2ZKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJSm9pblRhYmxlSW1wbC50aGlzLm1vdmVKb2luQ29sdW1uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3ZlSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCUpvaW5UYWJsZUltcGwudGhpcy5tb3ZlSm9pbkNvbHVtbkludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkJCi0JCX0KLQotCQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uIG5lc3RlZEFubm90YXRpb25BdChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBKb2luVGFibGVJbXBsLnRoaXMuam9pbkNvbHVtbkF0KGluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVKb2luQ29sdW1uPiBuZXN0ZWRBbm5vdGF0aW9ucygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TmVzdGFibGVKb2luQ29sdW1uPihKb2luVGFibGVJbXBsLnRoaXMuam9pbkNvbHVtbnMpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoTmVzdGFibGVKb2luQ29sdW1uIG5lc3RlZEFubm90YXRpb24pIHsKLQkJCUpvaW5UYWJsZUltcGwudGhpcy5yZW1vdmVKb2luQ29sdW1uKG5lc3RlZEFubm90YXRpb24pOwkKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQkJcmV0dXJuICJqb2luQ29sdW1ucyI7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBJbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uIGV4dGVuZHMgQWJzdHJhY3RDb250YWluZXJBbm5vdGF0aW9uIHsKLQotCQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uIGFkZEludGVybmFsKGludCBpbmRleCkgewotCQkJTmVzdGFibGVKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBKb2luVGFibGVJbXBsLnRoaXMuY3JlYXRlSW52ZXJzZUpvaW5Db2x1bW4oaW5kZXgpOwotCQkJSm9pblRhYmxlSW1wbC50aGlzLmludmVyc2VKb2luQ29sdW1ucy5hZGQoaW5kZXgsIGpvaW5Db2x1bW4pOwotCQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBOZXN0YWJsZUpvaW5Db2x1bW4gYWRkKGludCBpbmRleCkgewotCQkJTmVzdGFibGVKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBKb2luVGFibGVJbXBsLnRoaXMuY3JlYXRlSW52ZXJzZUpvaW5Db2x1bW4oaW5kZXgpOwotCQkJSm9pblRhYmxlSW1wbC50aGlzLmFkZEludmVyc2VKb2luQ29sdW1uKGluZGV4LCBqb2luQ29sdW1uKTsKLQkJCXJldHVybiBqb2luQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIGludCBpbmRleE9mKE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gSm9pblRhYmxlSW1wbC50aGlzLmluZGV4T2ZJbnZlcnNlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCUpvaW5UYWJsZUltcGwudGhpcy5tb3ZlSW52ZXJzZUpvaW5Db2x1bW4odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdmVJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJSm9pblRhYmxlSW1wbC50aGlzLm1vdmVJbnZlcnNlSm9pbkNvbHVtbkludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CQkJCi0JCX0KLQotCQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uIG5lc3RlZEFubm90YXRpb25BdChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBKb2luVGFibGVJbXBsLnRoaXMuaW52ZXJzZUpvaW5Db2x1bW5BdChpbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlSm9pbkNvbHVtbj4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlSm9pbkNvbHVtbj4oSm9pblRhYmxlSW1wbC50aGlzLmludmVyc2VKb2luQ29sdW1ucyk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKLQkJCXJldHVybiBpbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoTmVzdGFibGVKb2luQ29sdW1uIG5lc3RlZEFubm90YXRpb24pIHsKLQkJCUpvaW5UYWJsZUltcGwudGhpcy5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbihuZXN0ZWRBbm5vdGF0aW9uKTsJCi0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gImludmVyc2VKb2luQ29sdW1ucyI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udGFpbmVyQW5ub3RhdGlvbiBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRzIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVKb2luQ29sdW1uPiB7Ci0KLQkJcHVibGljIEFic3RyYWN0Q29udGFpbmVyQW5ub3RhdGlvbigpIHsKLQkJCXN1cGVyKEpvaW5UYWJsZUltcGwudGhpcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCS8vbm90aGluZyB0byBpbml0aWFsaXplCi0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gSm9pblRhYmxlSW1wbC50aGlzLmdldEFubm90YXRpb25OYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQl0aGlzLnJlbW92ZShuZXN0ZWRBbm5vdGF0aW9uQXQoaW5kZXgpKTsJCi0JCX0JCQotCi0JCXB1YmxpYyBOZXN0YWJsZUpvaW5Db2x1bW4gbmVzdGVkQW5ub3RhdGlvbkZvcihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCQlmb3IgKE5lc3RhYmxlSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG5lc3RlZEFubm90YXRpb25zKCkpKSB7Ci0JCQkJaWYgKGpkdEFubm90YXRpb24gPT0gam9pbkNvbHVtbi5nZXRKZHRBbm5vdGF0aW9uKChDb21waWxhdGlvblVuaXQpIGpkdEFubm90YXRpb24uZ2V0Um9vdCgpKSkgewotCQkJCQlyZXR1cm4gam9pbkNvbHVtbjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gSm9pblRhYmxlSW1wbC50aGlzLmdldEpkdEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgewotCQkJSm9pblRhYmxlSW1wbC50aGlzLm5ld0Fubm90YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCQlKb2luVGFibGVJbXBsLnRoaXMucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCUpvaW5UYWJsZUltcGwudGhpcy51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKLQkJfQotCQkKLQkJcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBKb2luVGFibGVJbXBsLnRoaXMuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0JfQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSm9pblRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEpvaW5UYWJsZUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEpvaW5UYWJsZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgSm9pblRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEpvaW5UYWJsZUltcGwocGFyZW50LCBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE51bGxKb2luVGFibGUocGFyZW50KTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnBhQ29tcGlsYXRpb25Vbml0SW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnBhQ29tcGlsYXRpb25Vbml0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDljZjE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwYUNvbXBpbGF0aW9uVW5pdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpwYUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3JQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEpwYUNvbXBpbGF0aW9uVW5pdEltcGwKLQlleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZQotCWltcGxlbWVudHMgSnBhQ29tcGlsYXRpb25Vbml0Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIEpwYUFubm90YXRpb25Qcm92aWRlciBhbm5vdGF0aW9uUHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcjsKLQotCXByb3RlY3RlZCBmaW5hbCBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVzb3VyY2VNb2RlbCBqYXZhUmVzb3VyY2VNb2RlbDsKLQotCXByb3RlY3RlZCBmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdDsKLQotCS8qKgotCSAqIFRoZSBwcmltYXJ5IHR5cGUgb2YgdGhlIEFTVCBjb21waWxhdGlvbiB1bml0LiBXZSBhcmUgbm90IGdvaW5nIHRvIGhhbmRsZQotCSAqIG11bHRpcGxlIHR5cGVzIGRlZmluZWQgaW4gYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4gRW50aXRpZXMgbXVzdCBoYXZlCi0JICogYSBwdWJsaWMvcHJvdGVjdGVkIG5vLWFyZyBjb25zdHJ1Y3RvciwgYW5kIHRoZXJlIGlzIG5vIHdheSB0byBhY2Nlc3MKLQkgKiB0aGUgY29uc3RydWN0b3IgaW4gYSBwYWNrYWdlIGNsYXNzICh3aGljaCBpcyB3aGF0IGFsbCB0b3AtbGV2ZWwsCi0JICogbm9uLXByaW1hcnkgY2xhc3NlcyBtdXN0IGJlKS4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGU7CQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSnBhQ29tcGlsYXRpb25Vbml0SW1wbCgKLQkJCUlGaWxlIGZpbGUsIAotCQkJSnBhQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlciwgCi0JCQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIsCi0JCQlKYXZhUmVzb3VyY2VNb2RlbCBqYXZhUmVzb3VyY2VNb2RlbCkgewotCQlzdXBlcihudWxsKTsgIC8vIHRoZSBKUEEgY29tcGlsYXRpb24gdW5pdCBpcyB0aGUgcm9vdCBvZiBpdHMgc3ViLXRyZWUKLQkJdGhpcy5hbm5vdGF0aW9uUHJvdmlkZXIgPSBhbm5vdGF0aW9uUHJvdmlkZXI7Ci0JCXRoaXMubW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlciA9IG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXI7Ci0JCXRoaXMuYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgPSBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLQkJdGhpcy5qYXZhUmVzb3VyY2VNb2RlbCA9IGphdmFSZXNvdXJjZU1vZGVsOwotCQl0aGlzLmNvbXBpbGF0aW9uVW5pdCA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JCXRoaXMub3BlbkNvbXBpbGF0aW9uVW5pdCgpOwotCQl0aGlzLnBlcnNpc3RlbnRUeXBlID0gdGhpcy5idWlsZEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkNvbXBpbGF0aW9uVW5pdCgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuY29tcGlsYXRpb25Vbml0Lm9wZW4obnVsbCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJLy8gZG8gbm90aGluZyAtIHdlIGp1c3Qgd29uJ3QgaGF2ZSBhIHByaW1hcnkgdHlwZSBpbiB0aGlzIGNhc2UKLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKHRoaXMuYnVpbGRBU1RSb290KCkpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IHRoaXMuZ2V0UHJpbWFyeVR5cGUoYXN0Um9vdCk7Ci0JCXJldHVybiAodGQgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKGFzdFJvb3QsIHRkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIG5ldmVyIGNhbGxlZD8KLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzUGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBpbGF0aW9uVW5pdCBnZXRKcGFDb21waWxhdGlvblVuaXQoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uUHJvdmlkZXI7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBnZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCkgewotCQlyZXR1cm4gdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKSAgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFSZXNvdXJjZU1vZGVsOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogSnBhQ29tcGlsYXRpb25Vbml0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLQkJcmV0dXJuIHRoaXMuY29tcGlsYXRpb25Vbml0OwotCX0KLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJcmV0dXJuICh0aGlzLnBlcnNpc3RlbnRUeXBlID09IG51bGwpID8gbnVsbCA6IHRoaXMucGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBlcnNpc3RlbnRUeXBlIHJlc291cmNlIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCdzIHByaW1hcnkgdHlwZS4KLQkgKiBXaWxsIGJlIG51bGwgaWYgdGhlIHByaW1hcnkgdHlwZSBpcyBudWxsLgotCSAqLwotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsJCi0JCXJldHVybiB0aGlzLnBlcnNpc3RlbnRUeXBlOwotCQkvL1RPRE8gc2hvdWxkIGkgb25seSBiZSByZXR1cm5pbmcgdGhpcyBpZiBpdCByZXR1cm5zIHRydWUgdG8gaXNQZXJzaXN0YWJsZT8KLQkJLy90aGF0J3MgaG93IHdlIGhhbmRsZSBuZXN0ZWRUeXBlcyBvbiBKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZQotCQkvL3JldHVybiB0aGlzLnBlcnNpc3RlbnRUeXBlLmlzUGVyc2lzdGFibGUoKSA/IHRoaXMucGVyc2lzdGVudFR5cGUgOiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQZXJzaXN0ZW50VHlwZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgewotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBvbGQgPSB0aGlzLnBlcnNpc3RlbnRUeXBlOwotCQl0aGlzLnBlcnNpc3RlbnRUeXBlID0gcGVyc2lzdGVudFR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQRVJTSVNURU5UX1RZUEVfUFJPUEVSVFksIG9sZCwgcGVyc2lzdGVudFR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKCkgewotCQl0aGlzLnVwZGF0ZUZyb21KYXZhKHRoaXMuYnVpbGRBU1RSb290KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IHRoaXMuZ2V0UHJpbWFyeVR5cGUoYXN0Um9vdCk7Ci0JCWlmICh0ZCA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldFBlcnNpc3RlbnRUeXBlKG51bGwpOwotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMucGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgewotCQkJCXRoaXMuc2V0UGVyc2lzdGVudFR5cGUodGhpcy5idWlsZEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKGFzdFJvb3QsIHRkKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMucGVyc2lzdGVudFR5cGUudXBkYXRlRnJvbUphdmEoYXN0Um9vdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoKSB7Ci0JCXRoaXMuamF2YVJlc291cmNlTW9kZWwucmVzb3VyY2VDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKCkgewotCQlpZiAodGhpcy5wZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnBlcnNpc3RlbnRUeXBlLnJlc29sdmVUeXBlcyh0aGlzLmJ1aWxkQVNUUm9vdCgpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdCgpIHsKLQkJcmV0dXJuIEpEVFRvb2xzLmJ1aWxkQVNUUm9vdCh0aGlzLmNvbXBpbGF0aW9uVW5pdCk7Ci0JfQotCi0JLy8gVE9ETyB1c2UgSlBBIGZhY3RvcnkKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgYnVpbGRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCwgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotCQlyZXR1cm4gSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVJbXBsLm5ld0luc3RhbmNlKHRoaXMsIHR5cGVEZWNsYXJhdGlvbiwgYXN0Um9vdCk7Ci0JfQotCi0JLyoqCi0JICogaS5lLiB0aGUgdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQ7Ci0JICogcmV0dXJuIHRoZSBmaXJzdCBjbGFzcyBvciBpbnRlcmZhY2UgKGlnbm9yZSBhbm5vdGF0aW9ucyBhbmQgZW51bXMpIHdpdGgKLQkgKiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjb21waWxhdGlvbiB1bml0IChmaWxlKTsKLQkgKiBOQjogdGhpcyB0eXBlIGNvdWxkIGJlIGluIGVycm9yIGlmIHRoZXJlIGlzIGFuIGFubm90YXRpb24gb3IgZW51bQotCSAqIHdpdGggdGhlIHNhbWUgbmFtZSBwcmVjZWRpbmcgaXQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiAKLQkgKiBSZXR1cm4gbnVsbCBpZiByZXNvbHZlQmluZGluZygpIG9uIHRoZSBUeXBlRGVjbGFyYXRpb24gcmV0dXJucyBudWxsCi0JICogVGhpcyBjYW4gb2NjdXIgaWYgdGhlIHByb2plY3QgSlJFIGlzIHJlbW92ZWQgKGJ1ZyAyMjUzMzIpCi0JICovCi0JcHJvdGVjdGVkIFR5cGVEZWNsYXJhdGlvbiBnZXRQcmltYXJ5VHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmcgcHJpbWFyeVR5cGVOYW1lID0gdGhpcy5nZXRQcmltYXJ5VHlwZU5hbWUoKTsKLQkJZm9yIChBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBhdGQgOiB0eXBlcyhhc3RSb290KSkgewotCQkJaWYgKChhdGQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT04pCi0JCQkJCSYmIGF0ZC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHByaW1hcnlUeXBlTmFtZSkpIHsKLQkJCQlyZXR1cm4gYXRkLnJlc29sdmVCaW5kaW5nKCkgIT0gbnVsbCA/IChUeXBlRGVjbGFyYXRpb24pIGF0ZCA6IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gdHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGFzdFJvb3QudHlwZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBpLmUuIHRoZSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmltYXJ5VHlwZU5hbWUoKSB7Ci0JCXJldHVybiByZW1vdmVKYXZhRXh0ZW5zaW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmdldEVsZW1lbnROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlbW92ZUphdmFFeHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuamF2YSIpOwotCQlyZXR1cm4gKGluZGV4ID09IC0xKSA/IGZpbGVOYW1lIDogZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Mb2JBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTG9iQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTAyMmYyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTG9iQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlMb2JBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUxvYkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTG9iQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkxvYgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTG9iQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTG9iQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgTG9iQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlTG9iQW5ub3RhdGlvbihwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlMb2JBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTG9iSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTG9iSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmRiYzk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0xvYkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTG9iQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBjbGFzcyBMb2JJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPiBpbXBsZW1lbnRzIExvYkFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByb3RlY3RlZCBMb2JJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm90aGluZyB0byB1cGRhdGUKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIExvYkFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2JBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBMb2JBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIExvYkFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBMb2JJbXBsKHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZDkzZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeU1hbnlUb01hbnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU1hbnlUb01hbnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb01hbnkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1hbnlUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBNYW55VG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgTWFueVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZU1hbnlUb01hbnlBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlNYW55VG9NYW55QW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvTWFueUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMWI5ZTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvTWFueUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi0KLXB1YmxpYyBjbGFzcyBNYW55VG9NYW55SW1wbCBleHRlbmRzIEFic3RyYWN0UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50cyBNYW55VG9NYW55QW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVEFSR0VUX0VOVElUWV9BREFQVEVSID0gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKCk7CQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IENBU0NBREVfQURBUFRFUiA9IGJ1aWxkQ2FzY2FkZUFkYXB0ZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gRkVUQ0hfQURBUFRFUiA9IGJ1aWxkRmV0Y2hBZGFwdGVyKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBNQVBQRURfQllfQURBUFRFUiA9IGJ1aWxkTWFwcGVkQnlBZGFwdGVyKCk7CQotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBtYXBwZWRCeUFkYXB0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBtYXBwZWRCeTsKLQkKLQlwcm90ZWN0ZWQgTWFueVRvTWFueUltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMubWFwcGVkQnlBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoTUFQUEVEX0JZX0FEQVBURVIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5tYXBwZWRCeSA9IHRoaXMubWFwcGVkQnkoYXN0Um9vdCk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKiBBYnN0cmFjdFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0YXJnZXRFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gVEFSR0VUX0VOVElUWV9BREFQVEVSOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGNhc2NhZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gQ0FTQ0FERV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIEZFVENIX0FEQVBURVI7Ci0JfQotCQotCQotCS8vKioqKioqKioqKioqKioqKiBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG5ld01hcHBlZEJ5KSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5tYXBwZWRCeSwgbmV3TWFwcGVkQnkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gdGhpcy5tYXBwZWRCeTsKLQkJdGhpcy5tYXBwZWRCeSA9IG5ld01hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5QWRhcHRlci5zZXRWYWx1ZShuZXdNYXBwZWRCeSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX1BST1BFUlRZLCBvbGRNYXBwZWRCeSwgbmV3TWFwcGVkQnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKLQkJdGhpcy5zZXRNYXBwZWRCeSh0aGlzLm1hcHBlZEJ5KGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWRCeShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZShNQVBQRURfQllfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFwcGVkQnlUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKE1BUFBFRF9CWV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuTUFOWV9UT19NQU5ZX19UQVJHRVRfRU5USVRZKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRDYXNjYWRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRW51bUFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk1BTllfVE9fTUFOWV9fQ0FTQ0FERSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRGZXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZEZldGNoQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5NQU5ZX1RPX01BTllfX0ZFVENIKTsKLQl9Ci0KLQkKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTWFwcGVkQnlBZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuTUFOWV9UT19NQU5ZX19NQVBQRURfQlksIGZhbHNlKTsgLy8gZmFsc2UgPSBkbyBub3QgcmVtb3ZlIGFubm90YXRpb24gd2hlbiBlbXB0eQotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTWFueVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYW55VG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTWFueVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBNYW55VG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIE1hbnlUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTWFueVRvTWFueUltcGwoKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwZDc5NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TWFueVRvT25lQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VNYW55VG9PbmVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNYW55VG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBNYW55VG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBNYW55VG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VNYW55VG9PbmVBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlNYW55VG9PbmVBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb09uZUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb09uZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4OTFkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYW55VG9PbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi0KLXB1YmxpYyBjbGFzcyBNYW55VG9PbmVJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRzIE1hbnlUb09uZUFubm90YXRpb24KLXsJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVEFSR0VUX0VOVElUWV9BREFQVEVSID0gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKCk7CQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IENBU0NBREVfQURBUFRFUiA9IGJ1aWxkQ2FzY2FkZUFkYXB0ZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gRkVUQ0hfQURBUFRFUiA9IGJ1aWxkRmV0Y2hBZGFwdGVyKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gT1BUSU9OQUxfQURBUFRFUiA9IGJ1aWxkT3B0aW9uYWxBZGFwdGVyKCk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gb3B0aW9uYWxBZGFwdGVyOwotCi0JcHJpdmF0ZSBCb29sZWFuIG9wdGlvbmFsOwotCi0JcHJvdGVjdGVkIE1hbnlUb09uZUltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMub3B0aW9uYWxBZGFwdGVyID0gdGhpcy5idWlsZEJvb2xlYW5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoT1BUSU9OQUxfQURBUFRFUik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLm9wdGlvbmFsID0gdGhpcy5vcHRpb25hbChhc3RSb290KTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKioqIEFic3RyYWN0UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0YXJnZXRFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gVEFSR0VUX0VOVElUWV9BREFQVEVSOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGNhc2NhZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gQ0FTQ0FERV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIEZFVENIX0FEQVBURVI7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKiBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gbmV3T3B0aW9uYWwpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm9wdGlvbmFsLCBuZXdPcHRpb25hbCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlCb29sZWFuIG9sZE9wdGlvbmFsID0gdGhpcy5vcHRpb25hbDsKLQkJdGhpcy5vcHRpb25hbCA9IG5ld09wdGlvbmFsOwotCQl0aGlzLm9wdGlvbmFsQWRhcHRlci5zZXRWYWx1ZShuZXdPcHRpb25hbCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT1BUSU9OQUxfUFJPUEVSVFksIG9sZE9wdGlvbmFsLCBuZXdPcHRpb25hbCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZShPUFRJT05BTF9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKLQkJdGhpcy5zZXRPcHRpb25hbCh0aGlzLm9wdGlvbmFsKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gb3B0aW9uYWwoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWxBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk1BTllfVE9fT05FX19UQVJHRVRfRU5USVRZKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRDYXNjYWRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRW51bUFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk1BTllfVE9fT05FX19DQVNDQURFKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRmV0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRGZXRjaEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuTUFOWV9UT19PTkVfX0ZFVENIKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRPcHRpb25hbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZE9wdGlvbmFsQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5NQU5ZX1RPX09ORV9fT1BUSU9OQUwpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9wdGlvbmFsQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBmYWxzZSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBNYW55VG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFueVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTWFueVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIE1hbnlUb09uZUFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBNYW55VG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTWFueVRvT25lSW1wbCgoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwS2V5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2M2ZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwS2V5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlNYXBLZXlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU1hcEtleUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWFwS2V5QW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTWFwS2V5QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgTWFwS2V5QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlTWFwS2V5QW5ub3RhdGlvbihwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlNYXBLZXlBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwS2V5SW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwS2V5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Zjk5YzM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcEtleUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi1wdWJsaWMgY2xhc3MgTWFwS2V5SW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4gaW1wbGVtZW50cyBNYXBLZXlBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTkFNRV9BREFQVEVSID0gYnVpbGROYW1lQWRhcHRlcigpOwotCi0JCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCi0JcHJvdGVjdGVkIE1hcEtleUltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMubmFtZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYXR0cmlidXRlLCBOQU1FX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMubmFtZSA9IG5hbWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm5hbWUsIG5ld05hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmV3TmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKE5BTUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXMoTkFNRV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldE5hbWUodGhpcy5uYW1lKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5NQVBfS0VZX19OQU1FLCBmYWxzZSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE1hcEtleUFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXBLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBNYXBLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIE1hcEtleUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBNYXBLZXlJbXBsKHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjQ1MmM5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBwZWRTdXBlcmNsYXNzCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgKFR5cGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcHBlZFN1cGVyY2xhc3NJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBwZWRTdXBlcmNsYXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2M0NTg3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcHBlZFN1cGVyY2xhc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBNYXBwZWRTdXBlcmNsYXNzSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPFR5cGU+IGltcGxlbWVudHMgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcm90ZWN0ZWQgTWFwcGVkU3VwZXJjbGFzc0ltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ubyBhbm5vdGF0aW9uIG1lbWJlcnMKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBNYXBwZWRTdXBlcmNsYXNzSW1wbCgoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgKFR5cGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQ1NWNiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZE5hdGl2ZVF1ZXJpZXMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZU5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24ocGFyZW50LCAoVHlwZSkgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeU5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MGQxNzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyaWVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lZE5hdGl2ZVF1ZXJpZXNJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248VHlwZT4gaW1wbGVtZW50cyBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uCi17Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIExpc3Q8TmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXM7Ci0JCi0JcHJvdGVjdGVkIE5hbWVkTmF0aXZlUXVlcmllc0ltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIFR5cGUgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMubmFtZWROYXRpdmVRdWVyaWVzID0gbmV3IEFycmF5TGlzdDxOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnk+KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmluaXRpYWxpemVOZXN0ZWRBbm5vdGF0aW9ucyhhc3RSb290LCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiAidmFsdWUiOwotCX0KLQkJCi0JcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnk+IG5lc3RlZEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeT4odGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLnNpemUoKTsKLQl9CQotCi0JcHVibGljIE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeSBhZGRJbnRlcm5hbChpbnQgaW5kZXgpIHsKLQkJTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBjcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5KGluZGV4KTsKLQkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuYWRkKGluZGV4LCBuYW1lZE5hdGl2ZVF1ZXJ5KTsKLQkJcmV0dXJuIG5hbWVkTmF0aXZlUXVlcnk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnkgYWRkKGludCBpbmRleCkgewotCQlOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGNyZWF0ZU5hbWVkTmF0aXZlUXVlcnkoaW5kZXgpOwotCQlhZGQoaW5kZXgsIG5hbWVkTmF0aXZlUXVlcnkpOwotCQlyZXR1cm4gbmFtZWROYXRpdmVRdWVyeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkKGludCBpbmRleCwgTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5IHF1ZXJ5KSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHF1ZXJ5LCB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5IHF1ZXJ5KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChxdWVyeSwgdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIGludCBpbmRleE9mKE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeSBxdWVyeSkgewotCQlyZXR1cm4gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuaW5kZXhPZihxdWVyeSk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnkgbmVzdGVkQW5ub3RhdGlvbkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuZ2V0KGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeSBuZXN0ZWRBbm5vdGF0aW9uRm9yKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJZm9yIChOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnkgbmFtZWRRdWVyeSA6IHRoaXMubmFtZWROYXRpdmVRdWVyaWVzKSB7Ci0JCQlpZiAoamR0QW5ub3RhdGlvbiA9PSBuYW1lZFF1ZXJ5LmdldEpkdEFubm90YXRpb24oKENvbXBpbGF0aW9uVW5pdCkgamR0QW5ub3RhdGlvbi5nZXRSb290KCkpKSB7Ci0JCQkJcmV0dXJuIG5hbWVkUXVlcnk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJbW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLm5hbWVkTmF0aXZlUXVlcmllcywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLnVwZGF0ZU5lc3RlZEFubm90YXRpb25zRnJvbUphdmEoYXN0Um9vdCwgdGhpcyk7Ci0JfQotCQotCXByaXZhdGUgTmFtZWROYXRpdmVRdWVyeUltcGwgY3JlYXRlTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIE5hbWVkTmF0aXZlUXVlcnlJbXBsLmNyZWF0ZU5lc3RlZE5hbWVkTmF0aXZlUXVlcnkodGhpcywgZ2V0TWVtYmVyKCksIGluZGV4LCBnZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCkpOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE5hbWVkTmF0aXZlUXVlcmllc0ltcGwocGFyZW50LCAoVHlwZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjZkNjQwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TmFtZWROYXRpdmVRdWVyeUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTmFtZWROYXRpdmVRdWVyeQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBTb3VyY2VOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5jcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5KHBhcmVudCwgKFR5cGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJ5SW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY4Zjg3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLQotcHVibGljIGNsYXNzIE5hbWVkTmF0aXZlUXVlcnlJbXBsIGV4dGVuZHMgQWJzdHJhY3ROYW1lZFF1ZXJ5Ci0JaW1wbGVtZW50cyBOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnkKLXsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICdyZXN1bHRDbGFzcycgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiByZXN1bHRDbGFzc0RlY2xhcmF0aW9uQWRhcHRlcjsKLQotCS8vIGhvbGQgdGhpcyBzbyB3ZSBjYW4gZ2V0IHRoZSAncmVzdWx0U2V0TWFwcGluZycgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiByZXN1bHRTZXRNYXBwaW5nRGVjbGFyYXRpb25BZGFwdGVyOwotCi0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHJlc3VsdENsYXNzQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcmVzdWx0U2V0TWFwcGluZ0FkYXB0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyByZXN1bHRDbGFzczsKLQkKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFJlc3VsdENsYXNzOwotCQotCXByaXZhdGUgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmc7Ci0JCi0JcHJvdGVjdGVkIE5hbWVkTmF0aXZlUXVlcnlJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLnJlc3VsdENsYXNzRGVjbGFyYXRpb25BZGFwdGVyID0gcmVzdWx0Q2xhc3NBZGFwdGVyKGRhYSk7Ci0JCXRoaXMucmVzdWx0Q2xhc3NBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIodGhpcy5yZXN1bHRDbGFzc0RlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMucmVzdWx0U2V0TWFwcGluZ0RlY2xhcmF0aW9uQWRhcHRlciA9IHJlc3VsdFNldE1hcHBpbmdBZGFwdGVyKGRhYSk7Ci0JCXRoaXMucmVzdWx0U2V0TWFwcGluZ0FkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcih0aGlzLnJlc3VsdFNldE1hcHBpbmdEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5yZXN1bHRDbGFzcyA9IHRoaXMucmVzdWx0Q2xhc3MoYXN0Um9vdCk7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzcyA9IHRoaXMuZnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzcyhhc3RSb290KTsKLQkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nID0gdGhpcy5yZXN1bHRTZXRNYXBwaW5nKGFzdFJvb3QpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHJlc3VsdENsYXNzQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgSlBBLk5BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiByZXN1bHRTZXRNYXBwaW5nQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkcpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQkvLyoqKioqKioqKioqKiogQWJzdHJhY3ROYW1lZFF1ZXJ5IGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLk5BTUVEX05BVElWRV9RVUVSWV9fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuTkFNRURfTkFUSVZFX1FVRVJZX19RVUVSWTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQW5ub3RhdGlvbik7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG9sZE5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIG9sZEFubm90YXRpb247Ci0JCXNldFJlc3VsdENsYXNzKG9sZE5hbWVkUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCXNldFJlc3VsdFNldE1hcHBpbmcob2xkTmFtZWRRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdENsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5yZXN1bHRDbGFzczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0Q2xhc3MoU3RyaW5nIG5ld1Jlc3VsdENsYXNzKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5yZXN1bHRDbGFzcywgbmV3UmVzdWx0Q2xhc3MpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZFJlc3VsdENsYXNzID0gdGhpcy5yZXN1bHRDbGFzczsKLQkJdGhpcy5yZXN1bHRDbGFzcyA9IG5ld1Jlc3VsdENsYXNzOwotCQl0aGlzLnJlc3VsdENsYXNzQWRhcHRlci5zZXRWYWx1ZShuZXdSZXN1bHRDbGFzcyk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVTVUxUX0NMQVNTX1BST1BFUlRZLCBvbGRSZXN1bHRDbGFzcywgbmV3UmVzdWx0Q2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3MoKSAgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZFJlc3VsdENsYXNzOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzKFN0cmluZyBuZXdRdWFsaWZpZWRSZXN1bHRDbGFzcykgewotCQlTdHJpbmcgb2xkRnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzcyA9IHRoaXMuZnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzczsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFJlc3VsdENsYXNzID0gbmV3UXVhbGlmaWVkUmVzdWx0Q2xhc3M7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX1JFU1VMVF9DTEFTU19QUk9QRVJUWSwgb2xkRnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzcywgbmV3UXVhbGlmaWVkUmVzdWx0Q2xhc3MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0U2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMucmVzdWx0U2V0TWFwcGluZzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcgbmV3UmVzdWx0U2V0TWFwcGluZykgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMucmVzdWx0U2V0TWFwcGluZywgbmV3UmVzdWx0U2V0TWFwcGluZykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkUmVzdWx0U2V0TWFwcGluZyA9IHRoaXMucmVzdWx0U2V0TWFwcGluZzsKLQkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nID0gbmV3UmVzdWx0U2V0TWFwcGluZzsKLQkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nQWRhcHRlci5zZXRWYWx1ZShuZXdSZXN1bHRTZXRNYXBwaW5nKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChSRVNVTFRfU0VUX01BUFBJTkdfUFJPUEVSVFksIG9sZFJlc3VsdFNldE1hcHBpbmcsIG5ld1Jlc3VsdFNldE1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVzdWx0Q2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnJlc3VsdENsYXNzRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZXN1bHRTZXRNYXBwaW5nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5yZXN1bHRTZXRNYXBwaW5nRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlRnJvbUphdmEoYXN0Um9vdCk7Ci0JCXRoaXMuc2V0UmVzdWx0Q2xhc3ModGhpcy5yZXN1bHRDbGFzcyhhc3RSb290KSk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzcyh0aGlzLmZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3MoYXN0Um9vdCkpOwotCQl0aGlzLnNldFJlc3VsdFNldE1hcHBpbmcodGhpcy5yZXN1bHRTZXRNYXBwaW5nKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdENsYXNzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnJlc3VsdENsYXNzQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnJlc3VsdFNldE1hcHBpbmdBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3MoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKGdldFJlc3VsdENsYXNzKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIEpEVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy5yZXN1bHRDbGFzc0FkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5lc3RhYmxlUXVlcnlIaW50IGNyZWF0ZVF1ZXJ5SGludChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFF1ZXJ5SGludEltcGwuY3JlYXRlTmFtZWROYXRpdmVRdWVyeVF1ZXJ5SGludCh0aGlzLCB0aGlzLmdldE1lbWJlcigpLCB0aGlzLmdldERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSwgaW5kZXgpOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXN0YXRpYyBOYW1lZE5hdGl2ZVF1ZXJ5SW1wbCBjcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5KEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBOYW1lZE5hdGl2ZVF1ZXJ5SW1wbChwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUikpOwotCX0KLQotCXN0YXRpYyBOYW1lZE5hdGl2ZVF1ZXJ5SW1wbCBjcmVhdGVOZXN0ZWROYW1lZE5hdGl2ZVF1ZXJ5KEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUsIGludCBpbmRleCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgsIGF0dHJpYnV0ZU92ZXJyaWRlc0FkYXB0ZXIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHR5cGUsIGlkYWEpOwotCQlyZXR1cm4gbmV3IE5hbWVkTmF0aXZlUXVlcnlJbXBsKHBhcmVudCwgdHlwZSwgaWRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgbmFtZWRRdWVyaWVzQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKG5hbWVkUXVlcmllc0FkYXB0ZXIsIGluZGV4LCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gTmFtZWROYXRpdmVRdWVyeUltcGwuY3JlYXRlTmFtZWROYXRpdmVRdWVyeShwYXJlbnQsIChUeXBlKSBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjIwY2ExCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU5hbWVkUXVlcmllc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyaWVzQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJpZXMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIE5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZU5hbWVkUXVlcmllc0Fubm90YXRpb24ocGFyZW50LCAoVHlwZSkgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeU5hbWVkUXVlcmllc0Fubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJpZXNJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJpZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwM2NkNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyaWVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcmllc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lZFF1ZXJpZXNJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248VHlwZT4gaW1wbGVtZW50cyBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uCi17Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgTGlzdDxOZXN0YWJsZU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllczsKLQkKLQlwcm90ZWN0ZWQgTmFtZWRRdWVyaWVzSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5uYW1lZFF1ZXJpZXMgPSBuZXcgQXJyYXlMaXN0PE5lc3RhYmxlTmFtZWRRdWVyeT4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5pbml0aWFsaXplTmVzdGVkQW5ub3RhdGlvbnMoYXN0Um9vdCwgdGhpcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuICJ2YWx1ZSI7Ci0JfQotCQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlTmFtZWRRdWVyeT4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TmVzdGFibGVOYW1lZFF1ZXJ5Pih0aGlzLm5hbWVkUXVlcmllcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lZFF1ZXJpZXMuc2l6ZSgpOwotCX0JCi0KLQlwdWJsaWMgTmVzdGFibGVOYW1lZFF1ZXJ5IGFkZEludGVybmFsKGludCBpbmRleCkgewotCQlOZXN0YWJsZU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGNyZWF0ZU5hbWVkUXVlcnkoaW5kZXgpOwotCQl0aGlzLm5hbWVkUXVlcmllcy5hZGQoaW5kZXgsIG5hbWVkUXVlcnkpOwotCQlyZXR1cm4gbmFtZWRRdWVyeTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlTmFtZWRRdWVyeSBhZGQoaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gY3JlYXRlTmFtZWRRdWVyeShpbmRleCk7Ci0JCWFkZChpbmRleCwgbmFtZWRRdWVyeSk7Ci0JCXJldHVybiBuYW1lZFF1ZXJ5OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGQoaW50IGluZGV4LCBOZXN0YWJsZU5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBuYW1lZFF1ZXJ5LCB0aGlzLm5hbWVkUXVlcmllcywgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5OQU1FRF9RVUVSSUVTX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShOZXN0YWJsZU5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QobmFtZWRRdWVyeSwgdGhpcy5uYW1lZFF1ZXJpZXMsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uTkFNRURfUVVFUklFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMubmFtZWRRdWVyaWVzLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLk5BTUVEX1FVRVJJRVNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZihOZXN0YWJsZU5hbWVkUXVlcnkgYXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJcmV0dXJuIHRoaXMubmFtZWRRdWVyaWVzLmluZGV4T2YoYXR0cmlidXRlT3ZlcnJpZGUpOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVOYW1lZFF1ZXJ5IG5lc3RlZEFubm90YXRpb25BdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZWRRdWVyaWVzLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZU5hbWVkUXVlcnkgbmVzdGVkQW5ub3RhdGlvbkZvcihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCWZvciAoTmVzdGFibGVOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgOiB0aGlzLm5hbWVkUXVlcmllcykgewotCQkJaWYgKGpkdEFubm90YXRpb24gPT0gbmFtZWRRdWVyeS5nZXRKZHRBbm5vdGF0aW9uKChDb21waWxhdGlvblVuaXQpIGpkdEFubm90YXRpb24uZ2V0Um9vdCgpKSkgewotCQkJCXJldHVybiBuYW1lZFF1ZXJ5OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5uYW1lZFF1ZXJpZXMsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uTkFNRURfUVVFUklFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZUludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMubmFtZWRRdWVyaWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy51cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKGFzdFJvb3QsIHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIE5hbWVkUXVlcnlJbXBsIGNyZWF0ZU5hbWVkUXVlcnkoaW50IGluZGV4KSB7Ci0JCXJldHVybiBOYW1lZFF1ZXJ5SW1wbC5jcmVhdGVOZXN0ZWROYW1lZFF1ZXJ5KHRoaXMsIGdldE1lbWJlcigpLCBpbmRleCwgZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIE5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBOYW1lZFF1ZXJpZXNJbXBsKHBhcmVudCwgKFR5cGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0MDc4MwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeU5hbWVkUXVlcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU5hbWVkUXVlcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcnkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE5hbWVkUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBOYW1lZFF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgTmFtZWRRdWVyeUFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gU291cmNlTmFtZWRRdWVyeUFubm90YXRpb24uY3JlYXRlTmFtZWRRdWVyeShwYXJlbnQsIChUeXBlKSBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5TmFtZWRRdWVyeUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMWM0ZjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lZFF1ZXJ5SW1wbCBleHRlbmRzIEFic3RyYWN0TmFtZWRRdWVyeQotCWltcGxlbWVudHMgTmVzdGFibGVOYW1lZFF1ZXJ5Ci17Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByb3RlY3RlZCBOYW1lZFF1ZXJ5SW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQkvLyoqKioqKioqKioqKiogQWJzdHJhY3ROYW1lZFF1ZXJ5IGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5OQU1FRF9RVUVSWV9fTkFNRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBxdWVyeUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLk5BTUVEX1FVRVJZX19RVUVSWTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5lc3RhYmxlUXVlcnlIaW50IGNyZWF0ZVF1ZXJ5SGludChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFF1ZXJ5SGludEltcGwuY3JlYXRlTmFtZWRRdWVyeVF1ZXJ5SGludCh0aGlzLCBnZXRNZW1iZXIoKSwgdGhpcy5nZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCksIGluZGV4KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlzdGF0aWMgTmFtZWRRdWVyeUltcGwgY3JlYXRlTmFtZWRRdWVyeShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXJldHVybiBuZXcgTmFtZWRRdWVyeUltcGwocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKLQl9Ci0KLQlzdGF0aWMgTmFtZWRRdWVyeUltcGwgY3JlYXRlTmVzdGVkTmFtZWRRdWVyeShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlLCBpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlcikgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0eXBlLCBpZGFhKTsKLQkJcmV0dXJuIG5ldyBOYW1lZFF1ZXJ5SW1wbChwYXJlbnQsIHR5cGUsIGlkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIG5hbWVkUXVlcmllc0FkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihuYW1lZFF1ZXJpZXNBZGFwdGVyLCBpbmRleCwgSlBBLk5BTUVEX1FVRVJZKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWVkUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmFtZWRRdWVyeUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE5hbWVkUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIE5hbWVkUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBOYW1lZFF1ZXJ5SW1wbC5jcmVhdGVOYW1lZFF1ZXJ5KHBhcmVudCwgKFR5cGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYzk4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogU2ltcGxpZnkgbnVsbCBhbm5vdGF0aW9uIGNsYXNzZXMKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE51bGxBbm5vdGF0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUKKwlpbXBsZW1lbnRzIEFubm90YXRpb24KK3sKKworCXByb3RlY3RlZCBOdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCS8vIGRvIG5vdGhpbmcKKwl9CisKKwlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgbmV3QW5ub3RhdGlvbigpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8qKgorCSAqIENvbnZlbmllbmNlIG1ldGhvZDogQ2FzdCB0aGUgYW5ub3RhdGlvbidzIHBhcmVudCB0byBhCisJICogcGVyc2lzdGVudCBtZW1iZXIuCisJICovCisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgZ2V0TWVtYmVyKCkgeworCQlyZXR1cm4gKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpIHRoaXMucGFyZW50OworCX0KKwkKKwkvKioKKwkgKiBDb252ZW5pZW5jZSBtZXRob2Q6IEFkZCB0aGUgdHlwZSBvciBhdHRyaWJ1dGUncyBhbm5vdGF0aW9uCisJICogYW5kIHJldHVybiBpdC4KKwkgKiBQcmUtY29uZGl0aW9uOiBUaGUgYW5ub3RhdGlvbidzIHBhcmVudCBtdXN0IGJlIGEgcGVyc2lzdGVudCBtZW1iZXIKKwkgKiAodHlwZSBvciBhdHRyaWJ1dGUpLgorCSAqLworCXByb3RlY3RlZCBBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7CisJCXJldHVybiB0aGlzLmdldE1lbWJlcigpLmFkZEFubm90YXRpb24odGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kOiBBZGQgdGhlIHR5cGUgb3IgYXR0cmlidXRlJ3MgYW5ub3RhdGlvbiAKKwkgKiBhbmQgcmV0dXJuIGl0LgorCSAqIFByZS1jb25kaXRpb246IFRoZSBhbm5vdGF0aW9uJ3MgcGFyZW50IG11c3QgYmUgYSBwZXJzaXN0ZW50IG1lbWJlcgorCSAqICh0eXBlIG9yIGF0dHJpYnV0ZSkuCisJICovCisJcHJvdGVjdGVkIEFubm90YXRpb24gYWRkQW5ub3RhdGlvbigKKwkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuQW5ub3RhdGlvbkluaXRpYWxpemVyIGluaXRpYWxpemVyKSB7CisJCXJldHVybiB0aGlzLmdldE1lbWJlcigpLmFkZEFubm90YXRpb24odGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpLCBpbml0aWFsaXplcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MjhiOGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgTnVsbEFzc29jaWF0aW9uT3ZlcnJpZGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUgaW1wbGVtZW50cyBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiwgQW5ub3RhdGlvbgotewkKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHVibGljIE51bGxBc3NvY2lhdGlvbk92ZXJyaWRlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9udWxsLCBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbmV3QW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCWNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSgpLnNldE5hbWUobmFtZSk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5BdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZkpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlKCkgewotCQlyZXR1cm4gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBnZXRQYXJlbnQoKS5hZGRBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczMjYyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgY2xhc3MgTnVsbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uIGV4dGVuZHMgTnVsbEJhc2VDb2x1bW4gaW1wbGVtZW50cyBDb2x1bW5Bbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXB1YmxpYyBOdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sdW1uQW5ub3RhdGlvbiBjcmVhdGVDb2x1bW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmFkZENvbHVtbigpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIGxlbmd0aCkgewotCQlpZiAobGVuZ3RoICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEludGVnZXIgZ2V0U2NhbGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTY2FsZShJbnRlZ2VyIHNjYWxlKSB7Ci0JCWlmIChzY2FsZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVDb2x1bW5SZXNvdXJjZSgpLnNldFNjYWxlKHNjYWxlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRQcmVjaXNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcmVjaXNpb24oSW50ZWdlciBwcmVjaXNpb24pIHsKLQkJaWYgKHByZWNpc2lvbiAhPSBudWxsKSB7Ci0JCQljcmVhdGVDb2x1bW5SZXNvdXJjZSgpLnNldFByZWNpc2lvbihwcmVjaXNpb24pOwotCQl9Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NhbGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TGVuZ3RoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFByZWNpc2lvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmMGM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5Bbm5vdGF0aW9uCisJZXh0ZW5kcyBOdWxsQ29sdW1uQW5ub3RhdGlvbgoreworCXB1YmxpYyBOdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5Bbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlwcml2YXRlIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBnZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oKSB7CisJCXJldHVybiAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0aGlzLnBhcmVudDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29sdW1uQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oKS5hZGRDb2x1bW4oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzZUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEJhc2VDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYzOWI2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5CYXNlQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOdWxsQmFzZUNvbHVtbiBleHRlbmRzIE51bGxOYW1lZENvbHVtbiBpbXBsZW1lbnRzIEJhc2VDb2x1bW5Bbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXByb3RlY3RlZCBOdWxsQmFzZUNvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBhYnN0cmFjdCBCYXNlQ29sdW1uQW5ub3RhdGlvbiBjcmVhdGVDb2x1bW5SZXNvdXJjZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyB0YWJsZSkgewotCQlpZiAodGFibGUgIT0gbnVsbCkgewotCQkJY3JlYXRlQ29sdW1uUmVzb3VyY2UoKS5zZXRUYWJsZSh0YWJsZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0VW5pcXVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VW5pcXVlKEJvb2xlYW4gdW5pcXVlKSB7Ci0JCWlmICh1bmlxdWUgIT0gbnVsbCkgewotCQkJY3JlYXRlQ29sdW1uUmVzb3VyY2UoKS5zZXRVbmlxdWUodW5pcXVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGFibGUoQm9vbGVhbiB1cGRhdGFibGUpIHsKLQkJaWYgKHVwZGF0YWJsZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVDb2x1bW5SZXNvdXJjZSgpLnNldFVwZGF0YWJsZSh1cGRhdGFibGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldEluc2VydGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRhYmxlKEJvb2xlYW4gaW5zZXJ0YWJsZSkgewotCQlpZiAoaW5zZXJ0YWJsZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVDb2x1bW5SZXNvdXJjZSgpLnNldEluc2VydGFibGUoaW5zZXJ0YWJsZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0TnVsbGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROdWxsYWJsZShCb29sZWFuIG51bGxhYmxlKSB7Ci0JCWlmIChudWxsYWJsZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVDb2x1bW5SZXNvdXJjZSgpLnNldE51bGxhYmxlKG51bGxhYmxlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFVuaXF1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRVcGRhdGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SW5zZXJ0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROdWxsYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdGFibGVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzZUNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxCYXNlQ29sdW1uQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3N2I3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzZUNvbHVtbkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VDb2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE51bGxCYXNlQ29sdW1uQW5ub3RhdGlvbgorCWV4dGVuZHMgTnVsbE5hbWVkQ29sdW1uQW5ub3RhdGlvbgorCWltcGxlbWVudHMgQmFzZUNvbHVtbkFubm90YXRpb24KK3sKKwlwcm90ZWN0ZWQgTnVsbEJhc2VDb2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEJhc2VDb2x1bW5Bbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7CisJCXJldHVybiAoQmFzZUNvbHVtbkFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKKwl9CisKKwkvLyAqKioqKiB0YWJsZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyB0YWJsZSkgeworCQlpZiAodGFibGUgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VGFibGUodGFibGUpOworCQl9CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB0YWJsZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8vICoqKioqIHVuaXF1ZQorCXB1YmxpYyBCb29sZWFuIGdldFVuaXF1ZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlKEJvb2xlYW4gdW5pcXVlKSB7CisJCWlmICh1bmlxdWUgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VW5pcXVlKHVuaXF1ZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFVuaXF1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvLyAqKioqKiB1cGRhdGFibGUKKwlwdWJsaWMgQm9vbGVhbiBnZXRVcGRhdGFibGUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVwZGF0YWJsZShCb29sZWFuIHVwZGF0YWJsZSkgeworCQlpZiAodXBkYXRhYmxlICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFVwZGF0YWJsZSh1cGRhdGFibGUpOworCQl9CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRVcGRhdGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLy8gKioqKiogaW5zZXJ0YWJsZQorCXB1YmxpYyBCb29sZWFuIGdldEluc2VydGFibGUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldEluc2VydGFibGUoQm9vbGVhbiBpbnNlcnRhYmxlKSB7CisJCWlmIChpbnNlcnRhYmxlICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldEluc2VydGFibGUoaW5zZXJ0YWJsZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEluc2VydGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLy8gKioqKiogbnVsbGFibGUKKwlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiBudWxsYWJsZSkgeworCQlpZiAobnVsbGFibGUgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0TnVsbGFibGUobnVsbGFibGUpOworCQl9CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXROdWxsYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxCYXNlVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxCYXNlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYzZWYwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOdWxsQmFzZVRhYmxlIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudHMgQW5ub3RhdGlvbgotewotCXByb3RlY3RlZCBOdWxsQmFzZVRhYmxlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL251bGwsIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCX0KLQkKLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbmV3QW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGFibGVBbm5vdGF0aW9uIGNyZWF0ZVRhYmxlUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoVGFibGVBbm5vdGF0aW9uKSBnZXRQYXJlbnQoKS5hZGRBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCWNyZWF0ZVRhYmxlUmVzb3VyY2UoKS5zZXROYW1lKG5hbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgewotCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQljcmVhdGVUYWJsZVJlc291cmNlKCkuc2V0Q2F0YWxvZyhjYXRhbG9nKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQljcmVhdGVUYWJsZVJlc291cmNlKCkuc2V0U2NoZW1hKHNjaGVtYSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGNyZWF0ZVRhYmxlUmVzb3VyY2UoKS5hZGRVbmlxdWVDb25zdHJhaW50KGluZGV4KTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZlVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JcHVibGljIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnRBdChpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgdW5pcXVlQ29uc3RyYWludHNTaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYXRhbG9nVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzZVRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEJhc2VUYWJsZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzE2MGIwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEJhc2VUYWJsZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzZVRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuVGFibGUKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5UYWJsZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTnVsbEJhc2VUYWJsZUFubm90YXRpb24KKwlleHRlbmRzIE51bGxBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBCYXNlVGFibGVBbm5vdGF0aW9uCit7CisJcHJvdGVjdGVkIE51bGxCYXNlVGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBCYXNlVGFibGVBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7CisJCXJldHVybiAoQmFzZVRhYmxlQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvLyAqKioqKiBuYW1lCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCWlmIChuYW1lICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldE5hbWUobmFtZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8vICoqKioqIHNjaGVtYQorCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgeworCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFNjaGVtYShzY2hlbWEpOworCQl9CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIGJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLy8gKioqKiogY2F0YWxvZworCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgeworCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7CisJCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRDYXRhbG9nKGNhdGFsb2cpOworCQl9CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBib29sZWFuIGNhdGFsb2dUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvLyAqKioqKiB1bmlxdWUgY29uc3RyYWludHMKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cygpIHsKKwkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7CisJfQorCisJcHVibGljIGludCB1bmlxdWVDb25zdHJhaW50c1NpemUoKSB7CisJCXJldHVybiAwOworCX0KKworCXB1YmxpYyBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QXQoaW50IGluZGV4KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBpbnQgaW5kZXhPZlVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIHRoaXMuYWRkQW5ub3RhdGlvbigpLmFkZFVuaXF1ZUNvbnN0cmFpbnQoaW5kZXgpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEJhc2ljLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzaWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmNzExNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzaWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgY2xhc3MgTnVsbEJhc2ljIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudHMgQmFzaWNBbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXByb3RlY3RlZCBOdWxsQmFzaWMoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbnVsbCwgbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQmFzaWNBbm5vdGF0aW9uIGNyZWF0ZUJhc2ljUmVzb3VyY2UoKSB7Ci0JCWdldFBhcmVudCgpLnNldE1hcHBpbmdBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOwotCQlyZXR1cm4gKEJhc2ljQW5ub3RhdGlvbikgZ2V0UGFyZW50KCkuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIGZldGNoKSB7Ci0JCWlmIChmZXRjaCAhPSBudWxsKSB7Ci0JCQljcmVhdGVCYXNpY1Jlc291cmNlKCkuc2V0RmV0Y2goZmV0Y2gpOwotCQl9CQkJCQotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCkgewotCQlpZiAob3B0aW9uYWwgIT0gbnVsbCkgewotCQkJY3JlYXRlQmFzaWNSZXNvdXJjZSgpLnNldE9wdGlvbmFsKG9wdGlvbmFsKTsKLQkJfQkJCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxCYXNpY0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxCYXNpY0Fubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTE2ZGUxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEJhc2ljQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIG51bGwgamF2YXgucGVyc2lzdGVuY2UuQmFzaWMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE51bGxCYXNpY0Fubm90YXRpb24KKwlleHRlbmRzIE51bGxBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBCYXNpY0Fubm90YXRpb24KK3sKKwlwcm90ZWN0ZWQgTnVsbEJhc2ljQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQmFzaWNBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7CisJCXJldHVybiAoQmFzaWNBbm5vdGF0aW9uKSBzdXBlci5hZGRBbm5vdGF0aW9uKCk7CisJfQorCQorCQorCS8vICoqKioqIGZldGNoCisJCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCkgeworCQlpZiAoZmV0Y2ggIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0RmV0Y2goZmV0Y2gpOworCQl9CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCQorCS8vICoqKioqIG9wdGlvbmFsCisJCisJcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKSB7CisJCWlmIChvcHRpb25hbCAhPSBudWxsKSB7CisJCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRPcHRpb25hbChvcHRpb25hbCk7CisJCX0KKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OTExNDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbENvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgY2xhc3MgTnVsbENvbHVtbiBleHRlbmRzIE51bGxCYXNlQ29sdW1uIGltcGxlbWVudHMgQ29sdW1uQW5ub3RhdGlvbiwgQW5ub3RhdGlvbgotewkKLQlwdWJsaWMgTnVsbENvbHVtbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2x1bW5Bbm5vdGF0aW9uIGNyZWF0ZUNvbHVtblJlc291cmNlKCkgewotCQlyZXR1cm4gKENvbHVtbkFubm90YXRpb24pIGdldFBhcmVudCgpLmFkZEFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKEludGVnZXIgbGVuZ3RoKSB7Ci0JCWlmIChsZW5ndGggIT0gbnVsbCkgewotCQkJY3JlYXRlQ29sdW1uUmVzb3VyY2UoKS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSW50ZWdlciBnZXRTY2FsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNjYWxlKEludGVnZXIgc2NhbGUpIHsKLQkJaWYgKHNjYWxlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0U2NhbGUoc2NhbGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJbnRlZ2VyIGdldFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByZWNpc2lvbihJbnRlZ2VyIHByZWNpc2lvbikgewotCQlpZiAocHJlY2lzaW9uICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0UHJlY2lzaW9uKHByZWNpc2lvbik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY2FsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRMZW5ndGhUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJlY2lzaW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQ29sdW1uQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjU0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQ29sdW1uQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4KKyAqLworcHVibGljIGNsYXNzIE51bGxDb2x1bW5Bbm5vdGF0aW9uCisJZXh0ZW5kcyBOdWxsQmFzZUNvbHVtbkFubm90YXRpb24KKwlpbXBsZW1lbnRzIENvbHVtbkFubm90YXRpb24KK3sKKwlwdWJsaWMgTnVsbENvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb2x1bW5Bbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7CisJCXJldHVybiAoQ29sdW1uQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOworCX0KKworCS8vICoqKioqIGxlbmd0aAorCXB1YmxpYyBJbnRlZ2VyIGdldExlbmd0aCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGVuZ3RoKEludGVnZXIgbGVuZ3RoKSB7CisJCWlmIChsZW5ndGggIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0TGVuZ3RoKGxlbmd0aCk7CisJCX0KKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldExlbmd0aFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvLyAqKioqKiBzY2FsZQorCXB1YmxpYyBJbnRlZ2VyIGdldFNjYWxlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTY2FsZShJbnRlZ2VyIHNjYWxlKSB7CisJCWlmIChzY2FsZSAhPSBudWxsKSB7CisJCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRTY2FsZShzY2FsZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFNjYWxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8vICoqKioqIHByZWNpc2lvbgorCXB1YmxpYyBJbnRlZ2VyIGdldFByZWNpc2lvbigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJlY2lzaW9uKEludGVnZXIgcHJlY2lzaW9uKSB7CisJCWlmIChwcmVjaXNpb24gIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0UHJlY2lzaW9uKHByZWNpc2lvbik7CisJCX0KKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFByZWNpc2lvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxEaXNjcmltaW5hdG9yQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjAwYTkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxEaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBOdWxsRGlzY3JpbWluYXRvckNvbHVtbiBleHRlbmRzIE51bGxOYW1lZENvbHVtbiBpbXBsZW1lbnRzIERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXB1YmxpYyBOdWxsRGlzY3JpbWluYXRvckNvbHVtbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcikgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY3JlYXRlQ29sdW1uUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIGdldFBhcmVudCgpLmFkZEFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIERpc2NyaW1pbmF0b3JUeXBlIGdldERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSkgewotCQlpZiAoZGlzY3JpbWluYXRvclR5cGUgIT0gbnVsbCkgewotCQkJY3JlYXRlQ29sdW1uUmVzb3VyY2UoKS5zZXREaXNjcmltaW5hdG9yVHlwZShkaXNjcmltaW5hdG9yVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIGxlbmd0aCkgewotCQlpZiAobGVuZ3RoICE9IG51bGwpIHsKLQkJCWNyZWF0ZUNvbHVtblJlc291cmNlKCkuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNmFkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yQ29sdW1uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBOdWxsRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24KKwlleHRlbmRzIE51bGxOYW1lZENvbHVtbkFubm90YXRpb24KKwlpbXBsZW1lbnRzIERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uCit7CQorCXB1YmxpYyBOdWxsRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7CisJCXJldHVybiAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKKwl9CisKKwkvLyAqKioqKiBkaXNjcmltaW5hdG9yIHR5cGUKKwlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKSB7CisJCWlmIChkaXNjcmltaW5hdG9yVHlwZSAhPSBudWxsKSB7CisJCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXREaXNjcmltaW5hdG9yVHlwZShkaXNjcmltaW5hdG9yVHlwZSk7CisJCX0KKwl9CisKKwkvLyAqKioqKiBsZW5ndGgKKwlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIGxlbmd0aCkgeworCQlpZiAobGVuZ3RoICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldExlbmd0aChsZW5ndGgpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRGlzY3JpbWluYXRvclZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRGlzY3JpbWluYXRvclZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NWM5OGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbERpc2NyaW1pbmF0b3JWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgY2xhc3MgTnVsbERpc2NyaW1pbmF0b3JWYWx1ZSBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRzIERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24sIEFubm90YXRpb24KLXsJCi0JcHJvdGVjdGVkIE51bGxEaXNjcmltaW5hdG9yVmFsdWUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9udWxsLCBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbmV3QW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVEaXNjcmltaW5hdG9yVmFsdWVSZXNvdXJjZSgpLnNldFZhbHVlKHZhbHVlKTsKLQkJfQkJCi0JfQotCQotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGNyZWF0ZURpc2NyaW1pbmF0b3JWYWx1ZVJlc291cmNlKCkgewotCQlyZXR1cm4gKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24pIGdldFBhcmVudCgpLmFkZEFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCi0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNjhkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuRGlzY3JpbWluYXRvclZhbHVlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBOdWxsRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbgorCWV4dGVuZHMgTnVsbEFubm90YXRpb24KKwlpbXBsZW1lbnRzIERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24KK3sKKworCXByb3RlY3RlZCBOdWxsRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7CisJCXJldHVybiAoRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOworCX0KKwkKKwkvLyAqKioqKiB2YWx1ZQorCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOworCQl9CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFbWJlZGRlZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVtYmVkZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMGY4NjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVtYmVkZGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotcHVibGljIGNsYXNzIE51bGxFbWJlZGRlZCBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRzIEVtYmVkZGVkQW5ub3RhdGlvbiwgQW5ub3RhdGlvbgotewkKLQlwcm90ZWN0ZWQgTnVsbEVtYmVkZGVkKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL251bGwsIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRW1iZWRkZWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRW1iZWRkZWRBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5ZDJhNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFbWJlZGRlZEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkZWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE51bGxFbWJlZGRlZEFubm90YXRpb24KKwlleHRlbmRzIE51bGxBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBFbWJlZGRlZEFubm90YXRpb24KK3sJCisJcHJvdGVjdGVkIE51bGxFbWJlZGRlZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVudW1lcmF0ZWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFbnVtZXJhdGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNzc2NTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVudW1lcmF0ZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotcHVibGljIGNsYXNzIE51bGxFbnVtZXJhdGVkIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudHMgRW51bWVyYXRlZEFubm90YXRpb24sIEFubm90YXRpb24KLXsJCi0JcHJvdGVjdGVkIE51bGxFbnVtZXJhdGVkKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9udWxsLCBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbmV3QW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgRW51bWVyYXRlZEFubm90YXRpb24gY3JlYXRlRW51bWVyYXRlZFJlc291cmNlKCkgewotCQlyZXR1cm4gKEVudW1lcmF0ZWRBbm5vdGF0aW9uKSBnZXRQYXJlbnQoKS5hZGRBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCi0JcHVibGljIEVudW1UeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoRW51bVR5cGUgdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVudW1lcmF0ZWRSZXNvdXJjZSgpLnNldFZhbHVlKHZhbHVlKTsKLQkJfQkJCi0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRW51bWVyYXRlZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFbnVtZXJhdGVkQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDVkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRW51bWVyYXRlZEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuRW51bWVyYXRlZAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTnVsbEVudW1lcmF0ZWRBbm5vdGF0aW9uCisJZXh0ZW5kcyBOdWxsQW5ub3RhdGlvbgorCWltcGxlbWVudHMgRW51bWVyYXRlZEFubm90YXRpb24KK3sKKwlwcm90ZWN0ZWQgTnVsbEVudW1lcmF0ZWRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRW51bWVyYXRlZEFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIChFbnVtZXJhdGVkQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOworCX0KKworCS8vICoqKioqIHZhbHVlCisJcHVibGljIEVudW1UeXBlIGdldFZhbHVlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFbnVtVHlwZSB2YWx1ZSkgeworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOworCQl9CQkKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEluaGVyaXRhbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSW5oZXJpdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlZDdmYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSW5oZXJpdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgY2xhc3MgTnVsbEluaGVyaXRhbmNlIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudHMgSW5oZXJpdGFuY2VBbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXByb3RlY3RlZCBOdWxsSW5oZXJpdGFuY2UoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9udWxsLCBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbmV3QW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBJbmhlcml0YW5jZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSkgewotCQlpZiAoc3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJY3JlYXRlSW5oZXJpdGFuY2VSZXNvdXJjZSgpLnNldFN0cmF0ZWd5KHN0cmF0ZWd5KTsKLQkJfQotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIEluaGVyaXRhbmNlQW5ub3RhdGlvbiBjcmVhdGVJbmhlcml0YW5jZVJlc291cmNlKCkgewotCQlyZXR1cm4gKEluaGVyaXRhbmNlQW5ub3RhdGlvbikgZ2V0UGFyZW50KCkuYWRkQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFN0cmF0ZWd5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEluaGVyaXRhbmNlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEluaGVyaXRhbmNlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTMwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSW5oZXJpdGFuY2VBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkluaGVyaXRhbmNlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBOdWxsSW5oZXJpdGFuY2VBbm5vdGF0aW9uCisJZXh0ZW5kcyBOdWxsQW5ub3RhdGlvbgorCWltcGxlbWVudHMgSW5oZXJpdGFuY2VBbm5vdGF0aW9uCit7CisJcHJvdGVjdGVkIE51bGxJbmhlcml0YW5jZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7CisJCXJldHVybiAoSW5oZXJpdGFuY2VBbm5vdGF0aW9uKSBzdXBlci5hZGRBbm5vdGF0aW9uKCk7CisJfQorCisJLy8gKioqKiogc3RyYXRlZ3kKKwlwdWJsaWMgSW5oZXJpdGFuY2VUeXBlIGdldFN0cmF0ZWd5KCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3kpIHsKKwkJaWYgKHN0cmF0ZWd5ICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFN0cmF0ZWd5KHN0cmF0ZWd5KTsKKwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U3RyYXRlZ3lUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjNzk4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTnVsbEpvaW5Db2x1bW4gZXh0ZW5kcyBOdWxsQmFzZUNvbHVtbiBpbXBsZW1lbnRzIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXB1YmxpYyBOdWxsSm9pbkNvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNyZWF0ZUNvbHVtblJlc291cmNlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSm9pbkNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYzc0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE51bGxKb2luQ29sdW1uQW5ub3RhdGlvbgorCWV4dGVuZHMgTnVsbEJhc2VDb2x1bW5Bbm5vdGF0aW9uCisJaW1wbGVtZW50cyBKb2luQ29sdW1uQW5ub3RhdGlvbgorewkKKwlwdWJsaWMgTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogcmVmZXJlbmNlZCBjb2x1bW4gbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEpvaW5UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEpvaW5UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDYwOThhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxKb2luVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgTnVsbEpvaW5UYWJsZSBleHRlbmRzIE51bGxCYXNlVGFibGUgaW1wbGVtZW50cyBKb2luVGFibGVBbm5vdGF0aW9uCi17CQotCXByb3RlY3RlZCBOdWxsSm9pblRhYmxlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2ZJbnZlcnNlSm9pbkNvbHVtbihKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZkpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gaW52ZXJzZUpvaW5Db2x1bW5BdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gaW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUludmVyc2VKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSm9pblRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEpvaW5UYWJsZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTRjN2FhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEpvaW5UYWJsZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLkFubm90YXRpb25Jbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuSm9pblRhYmxlCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsSm9pblRhYmxlQW5ub3RhdGlvbgorCWV4dGVuZHMgTnVsbEJhc2VUYWJsZUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEpvaW5UYWJsZUFubm90YXRpb24KK3sJCisJcHVibGljIE51bGxKb2luVGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pblRhYmxlQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKEpvaW5UYWJsZUFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpIHsKKwkJcmV0dXJuIChKb2luQ29sdW1uQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbihpbml0aWFsaXplcik7CisJfQorCisJLy8gKioqKiogam9pbiBjb2x1bW5zCisJcHVibGljIExpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMoKSB7CisJCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOworCX0KKworCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbkF0KGludCBpbmRleCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgaW50IGluZGV4T2ZKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCS8vIHRoZSBKb2luVGFibGUgYW5ub3RhdGlvbiBpcyBtaXNzaW5nLCBhZGQgYm90aCBpdCBhbmQgYSBqb2luIGNvbHVtbiBhdCB0aGUgc2FtZSB0aW1lCisJCXJldHVybiBhZGRBbm5vdGF0aW9uKGJ1aWxkSm9pbkNvbHVtbkluaXRpYWxpemVyKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgQW5ub3RhdGlvbkluaXRpYWxpemVyIGJ1aWxkSm9pbkNvbHVtbkluaXRpYWxpemVyKCkgeworCQlyZXR1cm4gSk9JTl9DT0xVTU5fSU5JVElBTElaRVI7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uSW5pdGlhbGl6ZXIgSk9JTl9DT0xVTU5fSU5JVElBTElaRVIgPQorCQkJbmV3IEFubm90YXRpb25Jbml0aWFsaXplcigpIHsKKwkJCQlwdWJsaWMgQW5ub3RhdGlvbiBpbml0aWFsaXplQW5ub3RhdGlvbihBbm5vdGF0aW9uIHN1cHBvcnRpbmdBbm5vdGF0aW9uKSB7CisJCQkJCXJldHVybiAoKEpvaW5UYWJsZUFubm90YXRpb24pIHN1cHBvcnRpbmdBbm5vdGF0aW9uKS5pbml0aWFsaXplSm9pbkNvbHVtbnMoKTsKKwkJCQl9CisJCQl9OworCisJcHVibGljIHZvaWQgbW92ZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGluaXRpYWxpemVKb2luQ29sdW1ucygpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogaW52ZXJzZSBqb2luIGNvbHVtbnMKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOworCX0KKworCXB1YmxpYyBpbnQgaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGludmVyc2VKb2luQ29sdW1uQXQoaW50IGluZGV4KSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBpbnQgaW5kZXhPZkludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCkgeworCQkvLyB0aGUgSm9pblRhYmxlIGFubm90YXRpb24gaXMgbWlzc2luZywgYWRkIGJvdGggaXQgYW5kIGEgam9pbiBjb2x1bW4gYXQgdGhlIHNhbWUgdGltZQorCQlyZXR1cm4gYWRkQW5ub3RhdGlvbihidWlsZEludmVyc2VKb2luQ29sdW1uSW5pdGlhbGl6ZXIoKSk7CisJfQorCQorCXByb3RlY3RlZCBBbm5vdGF0aW9uSW5pdGlhbGl6ZXIgYnVpbGRJbnZlcnNlSm9pbkNvbHVtbkluaXRpYWxpemVyKCkgeworCQlyZXR1cm4gSU5WRVJTRV9KT0lOX0NPTFVNTl9JTklUSUFMSVpFUjsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFubm90YXRpb25Jbml0aWFsaXplciBJTlZFUlNFX0pPSU5fQ09MVU1OX0lOSVRJQUxJWkVSID0KKwkJCW5ldyBBbm5vdGF0aW9uSW5pdGlhbGl6ZXIoKSB7CisJCQkJcHVibGljIEFubm90YXRpb24gaW5pdGlhbGl6ZUFubm90YXRpb24oQW5ub3RhdGlvbiBzdXBwb3J0aW5nQW5ub3RhdGlvbikgeworCQkJCQlyZXR1cm4gKChKb2luVGFibGVBbm5vdGF0aW9uKSBzdXBwb3J0aW5nQW5ub3RhdGlvbikuaW5pdGlhbGl6ZUludmVyc2VKb2luQ29sdW1ucygpOworCQkJCX0KKwkJCX07CisKKworCXB1YmxpYyB2b2lkIG1vdmVJbnZlcnNlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGluaXRpYWxpemVJbnZlcnNlSm9pbkNvbHVtbnMoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbE5hbWVkQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsTmFtZWRDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYzNDYxNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsTmFtZWRDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTnVsbE5hbWVkQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudHMgTmFtZWRDb2x1bW5Bbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXByb3RlY3RlZCBOdWxsTmFtZWRDb2x1bW4oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbnVsbCwgbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IE5hbWVkQ29sdW1uQW5ub3RhdGlvbiBjcmVhdGVDb2x1bW5SZXNvdXJjZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQljcmVhdGVDb2x1bW5SZXNvdXJjZSgpLnNldE5hbWUobmFtZSk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIGNvbHVtbkRlZmluaXRpb24pIHsKLQkJaWYgKGNvbHVtbkRlZmluaXRpb24gIT0gbnVsbCkgewotCQkJY3JlYXRlQ29sdW1uUmVzb3VyY2UoKS5zZXRDb2x1bW5EZWZpbml0aW9uKGNvbHVtbkRlZmluaXRpb24pOwotCQl9CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbHVtbkRlZmluaXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsTmFtZWRDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsTmFtZWRDb2x1bW5Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlMmI4YwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxOYW1lZENvbHVtbkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW4KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JDb2x1bW4KKyAqIGphdmF4LnBlcnNpc3RlbmNlLlByaW1hcnlLZXlKb2luQ29sdW1uLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTnVsbE5hbWVkQ29sdW1uQW5ub3RhdGlvbgorCWV4dGVuZHMgTnVsbEFubm90YXRpb24KKwlpbXBsZW1lbnRzIE5hbWVkQ29sdW1uQW5ub3RhdGlvbgoreworCXByb3RlY3RlZCBOdWxsTmFtZWRDb2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE5hbWVkQ29sdW1uQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKE5hbWVkQ29sdW1uQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOworCX0KKwkKKwkvLyAqKioqKiBuYW1lCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCWlmIChuYW1lICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldE5hbWUobmFtZSk7CisJCX0JCisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvLyAqKioqKiBjb2x1bW4gZGVmaW5pdGlvbgorCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcgY29sdW1uRGVmaW5pdGlvbikgeworCQlpZiAoY29sdW1uRGVmaW5pdGlvbiAhPSBudWxsKSB7CisJCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRDb2x1bW5EZWZpbml0aW9uKGNvbHVtbkRlZmluaXRpb24pOworCQl9CQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29sdW1uRGVmaW5pdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxPbmVUb01hbnlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsT25lVG9NYW55QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNWQ1NDAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsT25lVG9NYW55QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuT25lVG9NYW55CisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsT25lVG9NYW55QW5ub3RhdGlvbgorCWV4dGVuZHMgTnVsbE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgorCWltcGxlbWVudHMgT25lVG9NYW55QW5ub3RhdGlvbgoreworCXB1YmxpYyBOdWxsT25lVG9NYW55QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsT25lVG9PbmVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3ZDk1ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxPbmVUb09uZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZQorICovCitwdWJsaWMgY2xhc3MgTnVsbE9uZVRvT25lQW5ub3RhdGlvbgorCWV4dGVuZHMgTnVsbE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgorCWltcGxlbWVudHMgT25lVG9PbmVBbm5vdGF0aW9uCit7CisJcHVibGljIE51bGxPbmVUb09uZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPbmVUb09uZUFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIChPbmVUb09uZUFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKKwl9CisKKwkvLyAqKioqKiBvcHRpb25hbAorCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKSB7CisJCWlmIChvcHRpb25hbCAhPSBudWxsKSB7CisJCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRPcHRpb25hbChvcHRpb25hbCk7CisJCX0KKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMjlhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvTWFueQorICogamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE51bGxPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KKwlleHRlbmRzIE51bGxBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KK3sKKwlwcm90ZWN0ZWQgTnVsbE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7CisJCXJldHVybiAoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKSBzdXBlci5hZGRBbm5vdGF0aW9uKCk7CisJfQorCQorCQorCS8vICoqKioqIHRhcmdldCBlbnRpdHkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdGFyZ2V0RW50aXR5KSB7CisJCWlmICh0YXJnZXRFbnRpdHkgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VGFyZ2V0RW50aXR5KHRhcmdldEVudGl0eSk7CisJCX0KKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCQorCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCB0YXJnZXQgZW50aXR5IGNsYXNzIG5hbWUKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJCisJLy8gKioqKiogbWFwcGVkIGJ5CisJCisJcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSkgeworCQlpZiAobWFwcGVkQnkgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0TWFwcGVkQnkobWFwcGVkQnkpOworCQl9CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCQorCS8vICoqKioqIGZldGNoCisJCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCkgeworCQlpZiAoZmV0Y2ggIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0RmV0Y2goZmV0Y2gpOworCQl9CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCQorCS8vICoqKioqIGNhc2NhZGUgYWxsCisJCisJcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlQWxsKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldENhc2NhZGVBbGwoYm9vbGVhbiBhbGwpIHsKKwkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0Q2FzY2FkZUFsbChhbGwpOworCX0KKwkKKwkKKwkvLyAqKioqKiBjYXNjYWRlIG1lcmdlCisJCisJcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlTWVyZ2UoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0Q2FzY2FkZU1lcmdlKGJvb2xlYW4gbWVyZ2UpIHsKKwkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0Q2FzY2FkZU1lcmdlKG1lcmdlKTsKKwl9CisJCisJCisJLy8gKioqKiogY2FzY2FkZSBwZXJzaXN0CisJCisJcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlUGVyc2lzdChib29sZWFuIHBlcnNpc3QpIHsKKwkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0Q2FzY2FkZVBlcnNpc3QocGVyc2lzdCk7CisJfQorCQorCQorCS8vICoqKioqIGNhc2NhZGUgcmVmcmVzaAorCQorCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZVJlZnJlc2goKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0Q2FzY2FkZVJlZnJlc2goYm9vbGVhbiByZWZyZXNoKSB7CisJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldENhc2NhZGVSZWZyZXNoKHJlZnJlc2gpOworCX0KKwkKKwkKKwkvLyAqKioqKiBjYXNjYWRlIHJlbW92ZQorCQorCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZVJlbW92ZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlUmVtb3ZlKGJvb2xlYW4gcmVtb3ZlKSB7CisJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldENhc2NhZGVSZW1vdmUocmVtb3ZlKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRDYXNjYWRlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDkxZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uIGV4dGVuZHMgTnVsbE5hbWVkQ29sdW1uIGltcGxlbWVudHMgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLCBBbm5vdGF0aW9uCi17CQotCXB1YmxpYyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW4oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNyZWF0ZUNvbHVtblJlc291cmNlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJmZjU5NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTnVsbFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbgorCWV4dGVuZHMgTnVsbE5hbWVkQ29sdW1uQW5ub3RhdGlvbgorCWltcGxlbWVudHMgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uCit7CQorCXB1YmxpYyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTmFtZWRDb2x1bW5Bbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUKKwlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNWY5ZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIE51bGxUYWJsZSBleHRlbmRzIE51bGxCYXNlVGFibGUgaW1wbGVtZW50cyBUYWJsZUFubm90YXRpb24KLXsJCi0JcHJvdGVjdGVkIE51bGxUYWJsZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFRhYmxlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjODMxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsVGFibGVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuQW5ub3RhdGlvbkluaXRpYWxpemVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlRhYmxlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBOdWxsVGFibGVBbm5vdGF0aW9uCisJZXh0ZW5kcyBOdWxsQmFzZVRhYmxlQW5ub3RhdGlvbgorCWltcGxlbWVudHMgVGFibGVBbm5vdGF0aW9uCit7CisJcHJvdGVjdGVkIE51bGxUYWJsZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFRhYmxlQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKFRhYmxlQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgVGFibGVBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oQW5ub3RhdGlvbkluaXRpYWxpemVyIGluaXRpYWxpemVyKSB7CisJCXJldHVybiAoVGFibGVBbm5vdGF0aW9uKSBzdXBlci5hZGRBbm5vdGF0aW9uKGluaXRpYWxpemVyKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxUZW1wb3JhbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFRlbXBvcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YWQ3ZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFRlbXBvcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotcHVibGljIGNsYXNzIE51bGxUZW1wb3JhbCBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRzIFRlbXBvcmFsQW5ub3RhdGlvbiwgQW5ub3RhdGlvbgotewkKLQlwcm90ZWN0ZWQgTnVsbFRlbXBvcmFsKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL251bGwsIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRlbXBvcmFsQW5ub3RhdGlvbiBjcmVhdGVUZW1wb3JhbFJlc291cmNlKCkgewotCQlyZXR1cm4gKFRlbXBvcmFsQW5ub3RhdGlvbikgZ2V0UGFyZW50KCkuYWRkQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUZW1wb3JhbFR5cGUgdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWNyZWF0ZVRlbXBvcmFsUmVzb3VyY2UoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFRlbXBvcmFsQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFRlbXBvcmFsQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzhiMDAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsVGVtcG9yYWxBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWwKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE51bGxUZW1wb3JhbEFubm90YXRpb24KKwlleHRlbmRzIE51bGxBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBUZW1wb3JhbEFubm90YXRpb24KK3sKKwlwcm90ZWN0ZWQgTnVsbFRlbXBvcmFsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFRlbXBvcmFsQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKFRlbXBvcmFsQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOworCX0KKworCisJLy8gKioqKioqKioqKiBUZW1wb3JhbEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogdmFsdWUKKwlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFZhbHVlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUZW1wb3JhbFR5cGUgdmFsdWUpIHsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFZhbHVlKHZhbHVlKTsKKwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2UyZTMyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeU9uZVRvTWFueTFfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VPbmVUb01hbnkxXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuT25lVG9NYW55CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPbmVUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBPbmVUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBPbmVUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VPbmVUb01hbnkxXzBBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IE51bGxPbmVUb01hbnlBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeU9uZVRvTWFueTFfMEFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9NYW55SW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9NYW55SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWViM2Y2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09uZVRvTWFueUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBjbGFzcyBPbmVUb01hbnlJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRzIE9uZVRvTWFueUFubm90YXRpb24KLXsJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBUQVJHRVRfRU5USVRZX0FEQVBURVIgPSBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoKTsJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gQ0FTQ0FERV9BREFQVEVSID0gYnVpbGRDYXNjYWRlQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBGRVRDSF9BREFQVEVSID0gYnVpbGRGZXRjaEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTUFQUEVEX0JZX0FEQVBURVIgPSBidWlsZE1hcHBlZEJ5QWRhcHRlcigpOwkKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbWFwcGVkQnlBZGFwdGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgbWFwcGVkQnk7Ci0KLQlwcm90ZWN0ZWQgT25lVG9NYW55SW1wbChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5tYXBwZWRCeUFkYXB0ZXIgPSBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihNQVBQRURfQllfQURBUFRFUik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5tYXBwZWRCeSA9IHRoaXMubWFwcGVkQnkoYXN0Um9vdCk7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKiBBYnN0cmFjdFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0YXJnZXRFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gVEFSR0VUX0VOVElUWV9BREFQVEVSOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGNhc2NhZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gQ0FTQ0FERV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIEZFVENIX0FEQVBURVI7Ci0JfQotCQotCS8vKioqKioqKioqKioqKioqKiBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbmV3TWFwcGVkQnkpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm1hcHBlZEJ5LCBuZXdNYXBwZWRCeSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkTWFwcGVkQnkgPSB0aGlzLm1hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5ID0gbmV3TWFwcGVkQnk7Ci0JCXRoaXMubWFwcGVkQnlBZGFwdGVyLnNldFZhbHVlKG5ld01hcHBlZEJ5KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQRURfQllfUFJPUEVSVFksIG9sZE1hcHBlZEJ5LCBuZXdNYXBwZWRCeSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoTUFQUEVEX0JZX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhNQVBQRURfQllfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKLQkJdGhpcy5zZXRNYXBwZWRCeSh0aGlzLm1hcHBlZEJ5KGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZEJ5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0RW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkVGFyZ2V0RW50aXR5QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5PTkVfVE9fTUFOWV9fVEFSR0VUX0VOVElUWSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkQ2FzY2FkZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZEVudW1BcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5PTkVfVE9fTUFOWV9fQ0FTQ0FERSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRmV0Y2hBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19NQU5ZX19GRVRDSCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRNYXBwZWRCeUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5PTkVfVE9fTUFOWV9fTUFQUEVEX0JZLCBmYWxzZSk7IC8vIGZhbHNlID0gZG8gbm90IHJlbW92ZSBhbm5vdGF0aW9uIHdoZW4gZW1wdHkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE9uZVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPbmVUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBPbmVUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgT25lVG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIE9uZVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBPbmVUb01hbnlJbXBsKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzM3MjZhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5T25lVG9PbmUxXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlT25lVG9PbmUxXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIE9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlT25lVG9PbmUxXzBBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IE51bGxPbmVUb09uZUFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5T25lVG9PbmUxXzBBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9PbmVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb09uZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhNDFhYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb09uZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGNsYXNzIE9uZVRvT25lSW1wbCBleHRlbmRzIEFic3RyYWN0UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50cyBPbmVUb09uZUFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFRBUkdFVF9FTlRJVFlfQURBUFRFUiA9IGJ1aWxkVGFyZ2V0RW50aXR5QWRhcHRlcigpOwkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBDQVNDQURFX0FEQVBURVIgPSBidWlsZENhc2NhZGVBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IEZFVENIX0FEQVBURVIgPSBidWlsZEZldGNoQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gT1BUSU9OQUxfQURBUFRFUiA9IGJ1aWxkT3B0aW9uYWxBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IE1BUFBFRF9CWV9BREFQVEVSID0gYnVpbGRNYXBwZWRCeUFkYXB0ZXIoKTsJCi0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBvcHRpb25hbEFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG1hcHBlZEJ5QWRhcHRlcjsKLQotCi0JcHJpdmF0ZSBCb29sZWFuIG9wdGlvbmFsOwotCQotCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OwotCi0JcHVibGljIE9uZVRvT25lSW1wbChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5tYXBwZWRCeUFkYXB0ZXIgPSBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihNQVBQRURfQllfQURBUFRFUik7Ci0JCXRoaXMub3B0aW9uYWxBZGFwdGVyID0gdGhpcy5idWlsZEJvb2xlYW5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoT1BUSU9OQUxfQURBUFRFUik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5tYXBwZWRCeSA9IHRoaXMubWFwcGVkQnkoYXN0Um9vdCk7Ci0JCXRoaXMub3B0aW9uYWwgPSB0aGlzLm9wdGlvbmFsKGFzdFJvb3QpOwotCX0KLQkKLQkvLyoqKioqKioqKioqKioqKiogQWJzdHJhY3RSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdGFyZ2V0RW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIFRBUkdFVF9FTlRJVFlfQURBUFRFUjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBjYXNjYWRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIENBU0NBREVfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmZXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBGRVRDSF9BREFQVEVSOwotCX0JCi0KLQkvLyoqKioqKioqKioqKioqKiogQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbmFsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5vcHRpb25hbCwgbmV3T3B0aW9uYWwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQm9vbGVhbiBvbGRPcHRpb25hbCA9IHRoaXMub3B0aW9uYWw7Ci0JCXRoaXMub3B0aW9uYWwgPSBuZXdPcHRpb25hbDsKLQkJdGhpcy5vcHRpb25hbEFkYXB0ZXIuc2V0VmFsdWUobmV3T3B0aW9uYWwpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9QVElPTkFMX1BST1BFUlRZLCBvbGRPcHRpb25hbCwgbmV3T3B0aW9uYWwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbmV3TWFwcGVkQnkpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm1hcHBlZEJ5LCBuZXdNYXBwZWRCeSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkTWFwcGVkQnkgPSB0aGlzLm1hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5ID0gbmV3TWFwcGVkQnk7Ci0JCXRoaXMubWFwcGVkQnlBZGFwdGVyLnNldFZhbHVlKG5ld01hcHBlZEJ5KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQRURfQllfUFJPUEVSVFksIG9sZE1hcHBlZEJ5LCBuZXdNYXBwZWRCeSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoTUFQUEVEX0JZX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKE9QVElPTkFMX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBtYXBwZWRCeVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXMoTUFQUEVEX0JZX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlRnJvbUphdmEoYXN0Um9vdCk7Ci0JCXRoaXMuc2V0T3B0aW9uYWwodGhpcy5vcHRpb25hbChhc3RSb290KSk7Ci0JCXRoaXMuc2V0TWFwcGVkQnkodGhpcy5tYXBwZWRCeUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkQnkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGVkQnlBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBvcHRpb25hbChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25hbEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19PTkVfX1RBUkdFVF9FTlRJVFkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZENhc2NhZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRFbnVtQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuT05FX1RPX09ORV9fQ0FTQ0FERSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRmV0Y2hBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19PTkVfX0ZFVENIKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRPcHRpb25hbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZE9wdGlvbmFsQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5PTkVfVE9fT05FX19PUFRJT05BTCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkT3B0aW9uYWxBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGZhbHNlLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE1hcHBlZEJ5QWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19PTkVfX01BUFBFRF9CWSwgZmFsc2UpOyAvLyBmYWxzZSA9IGRvIG5vdCByZW1vdmUgYW5ub3RhdGlvbiB3aGVuIGVtcHR5Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCi0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIE9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIE9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE9uZVRvT25lSW1wbCgoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09yZGVyQnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT3JkZXJCeUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxYWE4YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09yZGVyQnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeU9yZGVyQnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU9yZGVyQnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9yZGVyQnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuT3JkZXJCeQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgT3JkZXJCeUFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE9yZGVyQnlBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBPcmRlckJ5QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlT3JkZXJCeUFubm90YXRpb24ocGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5T3JkZXJCeUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT3JkZXJCeUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09yZGVyQnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZTQ1MDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT3JkZXJCeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGNsYXNzIE9yZGVyQnlJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPiBpbXBsZW1lbnRzIE9yZGVyQnlBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0KLQkKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCQotCXByb3RlY3RlZCBPcmRlckJ5SW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYXR0cmlidXRlLCBWQUxVRV9BREFQVEVSKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy52YWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMudmFsdWUsIG5ld1ZhbHVlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUobmV3VmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zZXRWYWx1ZSh0aGlzLnZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5PUkRFUl9CWV9fVkFMVUUsIGZhbHNlKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgT3JkZXJCeUFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcmRlckJ5QW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgT3JkZXJCeUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgT3JkZXJCeUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBPcmRlckJ5SW1wbChwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL092ZXJyaWRlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT3ZlcnJpZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNzZiYTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT3ZlcnJpZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPdmVycmlkZUltcGwgCi0JZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxNZW1iZXI+ICAKLQlpbXBsZW1lbnRzIE92ZXJyaWRlQW5ub3RhdGlvbgotewkJCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICduYW1lJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQotCQotCXByb3RlY3RlZCBPdmVycmlkZUltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgSlBBLkFUVFJJQlVURV9PVkVSUklERV9fTkFNRSwgZmFsc2UpOyAvLyBmYWxzZSA9IGRvIG5vdCByZW1vdmUgYW5ub3RhdGlvbiB3aGVuIGVtcHR5Ci0JCXRoaXMubmFtZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZ2V0TWVtYmVyKCksdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMubmFtZSA9IHRoaXMubmFtZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBnZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoSW5kZXhlZEFubm90YXRpb25BZGFwdGVyKSBzdXBlci5nZXRBbm5vdGF0aW9uQWRhcHRlcigpOwotCX0KLQkJCQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCkgewotCQlnZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKS5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7Ci0JCU92ZXJyaWRlQW5ub3RhdGlvbiBvbGRPdmVycmlkZSA9IChPdmVycmlkZUFubm90YXRpb24pIG9sZEFubm90YXRpb247Ci0JCXNldE5hbWUob2xkT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKiogQXR0cml1YnRlT3ZlcnJpZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5uYW1lLCBuZXdOYW1lKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5ld05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE92ZXJyaWRlQW5ub3RhdGlvbi5OQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldE5hbWUodGhpcy5uYW1lKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzQ5OTM4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4ocGFyZW50LCBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTUxYjM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCBleHRlbmRzIEFic3RyYWN0TmFtZWRDb2x1bW4gaW1wbGVtZW50cyBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uCi17Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQkvLyBob2xkIHRoaXMgc28gd2UgY2FuIGdldCB0aGUgJ3JlZmVyZW5jZWQgY29sdW1uIG5hbWUnIHRleHQgcmFuZ2UKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHJlZmVyZW5jZWRDb2x1bW5OYW1lQWRhcHRlcjsKLQotCXByaXZhdGUgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQotCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0RWxlbWVudEFkYXB0ZXIodGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCQotCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXRoaXMocGFyZW50LCBtZW1iZXIsIGRhYSwgbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgZGFhKSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJdGhpcyhwYXJlbnQsIG1lbWJlciwgaWRhYSwgbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGlkYWEpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZShhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwcml2YXRlIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBnZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoSW5kZXhlZEFubm90YXRpb25BZGFwdGVyKSBzdXBlci5nZXRBbm5vdGF0aW9uQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCkgewotCQlnZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKS5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZEFubm90YXRpb24pOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gb2xkQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKLQkJc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUob2xkQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5ld1JlZmVyZW5jZWRDb2x1bW5OYW1lKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSwgbmV3UmVmZXJlbmNlZENvbHVtbk5hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5ld1JlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lQWRhcHRlci5zZXRWYWx1ZShuZXdSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkUmVmZXJlbmNlZENvbHVtbk5hbWUsIG5ld1JlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudXBkYXRlRnJvbUphdmEoYXN0Um9vdCk7Ci0JCXRoaXMuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUodGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZShhc3RSb290KSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXModGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0Jc3RhdGljIFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCBjcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbChwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0JCi0Jc3RhdGljIFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCBjcmVhdGVOZXN0ZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHBrSm9pbkNvbHVtbnNBZGFwdGVyKSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgsIHBrSm9pbkNvbHVtbnNBZGFwdGVyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGlkYWEpOwotCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbChwYXJlbnQsIG1lbWJlciwgaWRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgcGtKb2luQ29sdW1uc0FkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihwa0pvaW5Db2x1bW5zQWRhcHRlciwgaW5kZXgsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JfQotCi0KLQlzdGF0aWMgTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbiBjcmVhdGVTZWNvbmRhcnlUYWJsZVByaW1hcnlLZXlKb2luQ29sdW1uKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgc2Vjb25kYXJ5VGFibGVBZGFwdGVyLCBKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsKHBhcmVudCwgbWVtYmVyLCBidWlsZFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbkFkYXB0ZXIoc2Vjb25kYXJ5VGFibGVBZGFwdGVyLCBpbmRleCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHNlY29uZGFyeVRhYmxlQWRhcHRlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoc2Vjb25kYXJ5VGFibGVBZGFwdGVyLCBKUEEuU0VDT05EQVJZX1RBQkxFX19QS19KT0lOX0NPTFVNTlMsIGluZGV4LCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbC5jcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbihwYXJlbnQsIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzY3YWJhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuUHJpbWFyeUtleUpvaW5Db2x1bW5zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uKHBhcmVudCwgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeVByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNTE3YzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5zSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPE1lbWJlcj4gaW1wbGVtZW50cyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMKLXsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgTGlzdDxOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uPiBwa0pvaW5Db2x1bW5zOwotCQotCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4+KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuaW5pdGlhbGl6ZU5lc3RlZEFubm90YXRpb25zKGFzdFJvb3QsIHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuICJ2YWx1ZSI7Ci0JfQotCQkKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4+IG5lc3RlZEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4+KHRoaXMucGtKb2luQ29sdW1ucyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5wa0pvaW5Db2x1bW5zLnNpemUoKTsKLQl9CQotCi0JcHVibGljIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkSW50ZXJuYWwoaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnMuYWRkKGluZGV4LCBwa0pvaW5Db2x1bW4pOwotCQlyZXR1cm4gcGtKb2luQ29sdW1uOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGQoaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgpOwotCQlhZGQoaW5kZXgsIHBrSm9pbkNvbHVtbik7Ci0JCXJldHVybiBwa0pvaW5Db2x1bW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZChpbnQgaW5kZXgsIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIHBrSm9pbkNvbHVtbiwgdGhpcy5wa0pvaW5Db2x1bW5zLCBQS19KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChwa0pvaW5Db2x1bW4sIHRoaXMucGtKb2luQ29sdW1ucywgUEtfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5wa0pvaW5Db2x1bW5zLCBQS19KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZihOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5wa0pvaW5Db2x1bW5zLmluZGV4T2YocGtKb2luQ29sdW1uKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gbmVzdGVkQW5ub3RhdGlvbkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5wa0pvaW5Db2x1bW5zLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uIG5lc3RlZEFubm90YXRpb25Gb3IoQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCWZvciAoTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gOiB0aGlzLnBrSm9pbkNvbHVtbnMpIHsKLQkJCWlmIChqZHRBbm5vdGF0aW9uID09IHBrSm9pbkNvbHVtbi5nZXRKZHRBbm5vdGF0aW9uKChDb21waWxhdGlvblVuaXQpIGpkdEFubm90YXRpb24uZ2V0Um9vdCgpKSkgewotCQkJCXJldHVybiBwa0pvaW5Db2x1bW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJbW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLnBrSm9pbkNvbHVtbnMsIFBLX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZUludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMucGtKb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMudXBkYXRlTmVzdGVkQW5ub3RhdGlvbnNGcm9tSmF2YShhc3RSb290LCB0aGlzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiBQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwuY3JlYXRlTmVzdGVkUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcywgZ2V0TWVtYmVyKCksIGluZGV4LCBnZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCkpOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5zIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJbXBsKHBhcmVudCwgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1ucyBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9RdWVyeUhpbnRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9RdWVyeUhpbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMDNiMWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvUXVlcnlIaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotCi1wdWJsaWMgY2xhc3MgUXVlcnlIaW50SW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPFR5cGU+Ci0JaW1wbGVtZW50cyBOZXN0YWJsZVF1ZXJ5SGludAotewotCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICduYW1lJyB0ZXh0IHJhbmdlCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JCi0JLy8gaG9sZCB0aGlzIHNvIHdlIGNhbiBnZXQgdGhlICd2YWx1ZScgdGV4dCByYW5nZQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZURlY2xhcmF0aW9uQWRhcHRlcjsKLQkKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCQotCXB1YmxpYyBRdWVyeUhpbnRJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlLCBpZGFhLCBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHR5cGUsIGlkYWEpKTsKLQkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5uYW1lQWRhcHRlcihpZGFhKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLnZhbHVlQWRhcHRlcihpZGFhKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcih0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLnZhbHVlKGFzdFJvb3QpOwkJCi0JfQotCQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZ2V0TWVtYmVyKCksIGRhZWEpOwotCX0KLQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIEpQQS5RVUVSWV9ISU5UX19OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgSlBBLlFVRVJZX0hJTlRfX1ZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGdldEFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gKEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcikgc3VwZXIuZ2V0QW5ub3RhdGlvbkFkYXB0ZXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5uYW1lLCBuZXdOYW1lKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5ld05hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMudmFsdWUsIG5ld1ZhbHVlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUobmV3VmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldE5hbWUodGhpcy5uYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRWYWx1ZSh0aGlzLnZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHBlcnNpc3RlbmNlIG1vZGVsIC0+IGphdmEgYW5ub3RhdGlvbnMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCkgewotCQlnZXRBbm5vdGF0aW9uQWRhcHRlcigpLm1vdmVBbm5vdGF0aW9uKG5ld0luZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShOZXN0YWJsZUFubm90YXRpb24gb2xkQW5ub3RhdGlvbikgewotCQlRdWVyeUhpbnRBbm5vdGF0aW9uIG9sZFF1ZXJ5SGludCA9IChRdWVyeUhpbnRBbm5vdGF0aW9uKSBvbGRBbm5vdGF0aW9uOwotCQlzZXROYW1lKG9sZFF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQlzZXRWYWx1ZShvbGRRdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXN0YXRpYyBRdWVyeUhpbnRJbXBsIGNyZWF0ZU5hbWVkUXVlcnlRdWVyeUhpbnQoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIFR5cGUgdHlwZSwgIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgbmFtZWRRdWVyeUFkYXB0ZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IFF1ZXJ5SGludEltcGwocGFyZW50LCB0eXBlLCBidWlsZE5hbWVkUXVlcnlRdWVyeUhpbnRBbm5vdGF0aW9uQWRhcHRlcihuYW1lZFF1ZXJ5QWRhcHRlciwgaW5kZXgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZE5hbWVkUXVlcnlRdWVyeUhpbnRBbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIG5hbWVkUXVlcnlBZGFwdGVyLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihuYW1lZFF1ZXJ5QWRhcHRlciwgSlBBLk5BTUVEX1FVRVJZX19ISU5UUywgaW5kZXgsIEpQQS5RVUVSWV9ISU5UKTsKLQl9Ci0KLQlzdGF0aWMgUXVlcnlIaW50SW1wbCBjcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5UXVlcnlIaW50KEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgbmFtZWROYXRpdmVRdWVyeUFkYXB0ZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IFF1ZXJ5SGludEltcGwocGFyZW50LCB0eXBlLCBidWlsZE5hbWVkTmF0aXZlUXVlcnlRdWVyeUhpbnRBbm5vdGF0aW9uQWRhcHRlcihuYW1lZE5hdGl2ZVF1ZXJ5QWRhcHRlciwgaW5kZXgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZE5hbWVkTmF0aXZlUXVlcnlRdWVyeUhpbnRBbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIG5hbWVkTmF0aXZlUXVlcnlBZGFwdGVyLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihuYW1lZE5hdGl2ZVF1ZXJ5QWRhcHRlciwgSlBBLk5BTUVEX05BVElWRV9RVUVSWV9fSElOVFMsIGluZGV4LCBKUEEuUVVFUllfSElOVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTk4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5U2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlNlY29uZGFyeVRhYmxlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTZWNvbmRhcnlUYWJsZUFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIFNvdXJjZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5jcmVhdGVTZWNvbmRhcnlUYWJsZShwYXJlbnQsIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZjA1NzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29udGFpbmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNlY29uZGFyeVRhYmxlSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VUYWJsZSBpbXBsZW1lbnRzIE5lc3RhYmxlU2Vjb25kYXJ5VGFibGUKLXsJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkKLQlwcml2YXRlIGZpbmFsIExpc3Q8TmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcGtKb2luQ29sdW1uczsKLQkKLQlwcml2YXRlIGZpbmFsIFBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uIHBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uOwotCQotCi0JcHJvdGVjdGVkIFNlY29uZGFyeVRhYmxlSW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zID0gbmV3IEFycmF5TGlzdDxOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uPigpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uID0gbmV3IFBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmluaXRpYWxpemVOZXN0ZWRBbm5vdGF0aW9ucyhhc3RSb290LCB0aGlzLnBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjYXRhbG9nQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIsIEpQQS5TRUNPTkRBUllfVEFCTEVfX0NBVEFMT0cpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcikgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciwgSlBBLlNFQ09OREFSWV9UQUJMRV9fTkFNRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2NoZW1hQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIsIEpQQS5TRUNPTkRBUllfVEFCTEVfX1NDSEVNQSk7Ci0JfQotCi0JcHVibGljIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBnZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoSW5kZXhlZEFubm90YXRpb25BZGFwdGVyKSBzdXBlci5nZXRBbm5vdGF0aW9uQWRhcHRlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7Ci0JCWdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpLm1vdmVBbm5vdGF0aW9uKG5ld0luZGV4KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIG9sZFNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKLQkJc2V0TmFtZShvbGRTZWNvbmRhcnlUYWJsZS5nZXROYW1lKCkpOwotCQlzZXRDYXRhbG9nKG9sZFNlY29uZGFyeVRhYmxlLmdldENhdGFsb2coKSk7Ci0JCXNldFNjaGVtYShvbGRTZWNvbmRhcnlUYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCWZvciAoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvbGRTZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50cygpKSkgewotCQkJTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IG5ld1VuaXF1ZUNvbnN0cmFpbnQgPSBhZGRVbmlxdWVDb25zdHJhaW50KG9sZFNlY29uZGFyeVRhYmxlLmluZGV4T2ZVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQpKTsKLQkJCW5ld1VuaXF1ZUNvbnN0cmFpbnQuaW5pdGlhbGl6ZUZyb20oKE5lc3RhYmxlQW5ub3RhdGlvbikgdW5pcXVlQ29uc3RyYWludCk7Ci0JCX0KLQkJZm9yIChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9sZFNlY29uZGFyeVRhYmxlLnBrSm9pbkNvbHVtbnMoKSkpIHsKLQkJCU5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gbmV3UGtKb2luQ29sdW1uID0gYWRkUGtKb2luQ29sdW1uKG9sZFNlY29uZGFyeVRhYmxlLmluZGV4T2ZQa0pvaW5Db2x1bW4ocGtKb2luQ29sdW1uKSk7Ci0JCQluZXdQa0pvaW5Db2x1bW4uaW5pdGlhbGl6ZUZyb20oKE5lc3RhYmxlQW5ub3RhdGlvbikgcGtKb2luQ29sdW1uKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBVbmlxdWVDb25zdHJhaW50SW1wbC5jcmVhdGVTZWNvbmRhcnlUYWJsZVVuaXF1ZUNvbnN0cmFpbnQodGhpcywgdGhpcy5nZXRNZW1iZXIoKSwgdGhpcy5nZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCksIGluZGV4KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKiBTZWNvbmRhcnlUYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqCi0JCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IHBrSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPih0aGlzLnBrSm9pbkNvbHVtbnMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHBrSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5wa0pvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnBrSm9pbkNvbHVtbnMuZ2V0KGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIGludCBpbmRleE9mUGtKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLnBrSm9pbkNvbHVtbnMuaW5kZXhPZihqb2luQ29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRQa0pvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gKE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4pIENvbnRhaW5lckFubm90YXRpb25Ub29scy5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4LCB0aGlzLnBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1BZGRlZChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uUEtfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBwa0pvaW5Db2x1bW4pOwotCQlyZXR1cm4gcGtKb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQa0pvaW5Db2x1bW4oaW50IGluZGV4LCBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbikgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBwa0pvaW5Db2x1bW4sIHRoaXMucGtKb2luQ29sdW1ucywgUEtfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVQa0pvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gdGhpcy5wa0pvaW5Db2x1bW5zLmdldChpbmRleCk7Ci0JCXJlbW92ZVBrSm9pbkNvbHVtbihwa0pvaW5Db2x1bW4pOwotCQlwa0pvaW5Db2x1bW4ucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuc3luY2hBbm5vdGF0aW9uc0FmdGVyUmVtb3ZlKGluZGV4LCB0aGlzLnBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUGtKb2luQ29sdW1uKE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChwa0pvaW5Db2x1bW4sIHRoaXMucGtKb2luQ29sdW1ucywgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLlBLX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlUGtKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVQa0pvaW5Db2x1bW5JbnRlcm5hbCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuc3luY2hBbm5vdGF0aW9uc0FmdGVyTW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMucGtKb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24pOwotCQlmaXJlSXRlbU1vdmVkKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5QS19KT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVBrSm9pbkNvbHVtbkludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMucGtKb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlyZXR1cm4gUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsLmNyZWF0ZVNlY29uZGFyeVRhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4oZ2V0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpLCB0aGlzLCBnZXRNZW1iZXIoKSwgaW5kZXgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnVwZGF0ZUZyb21KYXZhKGFzdFJvb3QpOwotCQl0aGlzLnVwZGF0ZVBrSm9pbkNvbHVtbnNGcm9tSmF2YShhc3RSb290KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVBrSm9pbkNvbHVtbnNGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMudXBkYXRlTmVzdGVkQW5ub3RhdGlvbnNGcm9tSmF2YShhc3RSb290LCB0aGlzLnBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlzdGF0aWMgU2Vjb25kYXJ5VGFibGVJbXBsIGNyZWF0ZVNlY29uZGFyeVRhYmxlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCXJldHVybiBuZXcgU2Vjb25kYXJ5VGFibGVJbXBsKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUikpOwotCX0KLQotCXN0YXRpYyBTZWNvbmRhcnlUYWJsZUltcGwgY3JlYXRlTmVzdGVkU2Vjb25kYXJ5VGFibGUoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIGludCBpbmRleCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBzZWNvbmRhcnlUYWJsZXNBZGFwdGVyKSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgsIHNlY29uZGFyeVRhYmxlc0FkYXB0ZXIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgaWRhYSk7Ci0JCXJldHVybiBuZXcgU2Vjb25kYXJ5VGFibGVJbXBsKHBhcmVudCwgbWVtYmVyLCBpZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBzZWNvbmRhcnlUYWJsZXNBZGFwdGVyKSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoc2Vjb25kYXJ5VGFibGVzQWRhcHRlciwgaW5kZXgsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCX0KLQkKLQkKLQlwcml2YXRlIGNsYXNzIFBrSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIAotCQlpbXBsZW1lbnRzIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gCi0JewotCQlwdWJsaWMgUGtKb2luQ29sdW1uc0NvbnRhaW5lckFubm90YXRpb24oKSB7Ci0JCQlzdXBlcihTZWNvbmRhcnlUYWJsZUltcGwudGhpcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCS8vbm90aGluZyB0byBpbml0aWFsaXplCi0JCX0KLQkJCi0JCXB1YmxpYyBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZEludGVybmFsKGludCBpbmRleCkgewotCQkJTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwS0pvaW5Db2x1bW4gPSBTZWNvbmRhcnlUYWJsZUltcGwudGhpcy5jcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbmRleCk7Ci0JCQlTZWNvbmRhcnlUYWJsZUltcGwudGhpcy5wa0pvaW5Db2x1bW5zLmFkZChpbmRleCwgcEtKb2luQ29sdW1uKTsKLQkJCXJldHVybiBwS0pvaW5Db2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZChpbnQgaW5kZXgpIHsKLQkJCU5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcEtKb2luQ29sdW1uID0gU2Vjb25kYXJ5VGFibGVJbXBsLnRoaXMuY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgpOwotCQkJU2Vjb25kYXJ5VGFibGVJbXBsLnRoaXMuYWRkUGtKb2luQ29sdW1uKGluZGV4LCBwS0pvaW5Db2x1bW4pOwotCQkJcmV0dXJuIHBLSm9pbkNvbHVtbjsKLQkJfQotCi0JCXB1YmxpYyBpbnQgaW5kZXhPZihOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbikgewotCQkJcmV0dXJuIFNlY29uZGFyeVRhYmxlSW1wbC50aGlzLmluZGV4T2ZQa0pvaW5Db2x1bW4ocGtKb2luQ29sdW1uKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCVNlY29uZGFyeVRhYmxlSW1wbC50aGlzLm1vdmVQa0pvaW5Db2x1bW4odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgbW92ZUludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCQlTZWNvbmRhcnlUYWJsZUltcGwudGhpcy5tb3ZlUGtKb2luQ29sdW1uSW50ZXJuYWwodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uIG5lc3RlZEFubm90YXRpb25BdChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBTZWNvbmRhcnlUYWJsZUltcGwudGhpcy5wa0pvaW5Db2x1bW5BdChpbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4+IG5lc3RlZEFubm90YXRpb25zKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uPihTZWNvbmRhcnlUYWJsZUltcGwudGhpcy5wa0pvaW5Db2x1bW5zKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgewotCQkJcmV0dXJuIHBrSm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIFNlY29uZGFyeVRhYmxlSW1wbC50aGlzLmdldEFubm90YXRpb25OYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OOwotCQl9Ci0KLQkJcHVibGljIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gbmVzdGVkQW5ub3RhdGlvbkZvcihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCQlmb3IgKE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG5lc3RlZEFubm90YXRpb25zKCkpKSB7Ci0JCQkJaWYgKGpkdEFubm90YXRpb24gPT0gcGtKb2luQ29sdW1uLmdldEpkdEFubm90YXRpb24oKENvbXBpbGF0aW9uVW5pdCkgamR0QW5ub3RhdGlvbi5nZXRSb290KCkpKSB7Ci0JCQkJCXJldHVybiBwa0pvaW5Db2x1bW47Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQl0aGlzLnJlbW92ZShuZXN0ZWRBbm5vdGF0aW9uQXQoaW5kZXgpKTsJCi0JCX0JCQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbikgewotCQkJU2Vjb25kYXJ5VGFibGVJbXBsLnRoaXMucmVtb3ZlUGtKb2luQ29sdW1uKHBrSm9pbkNvbHVtbik7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0SmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIFNlY29uZGFyeVRhYmxlSW1wbC50aGlzLmdldEpkdEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgewotCQkJU2Vjb25kYXJ5VGFibGVJbXBsLnRoaXMubmV3QW5ub3RhdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJCVNlY29uZGFyeVRhYmxlSW1wbC50aGlzLnJlbW92ZUFubm90YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlTZWNvbmRhcnlUYWJsZUltcGwudGhpcy51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKLQkJfQotCQkKLQkJcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBTZWNvbmRhcnlUYWJsZUltcGwudGhpcy5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gInBrSm9pbkNvbHVtbnMiOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWNvbmRhcnlUYWJsZUFubm90YXRpb25EZWZpbml0aW9uIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLQl7Ci0JCS8vIHNpbmdsZXRvbgotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBTZWNvbmRhcnlUYWJsZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIFNlY29uZGFyeVRhYmxlSW1wbC5jcmVhdGVTZWNvbmRhcnlUYWJsZShwYXJlbnQsIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzN2M5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlNlY29uZGFyeVRhYmxlcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlc0ltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlMjk2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTZWNvbmRhcnlUYWJsZXNJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248TWVtYmVyPiBpbXBsZW1lbnRzIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgZmluYWwgTGlzdDxOZXN0YWJsZVNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXM7Ci0JCi0JcHJvdGVjdGVkIFNlY29uZGFyeVRhYmxlc0ltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnNlY29uZGFyeVRhYmxlcyA9IG5ldyBBcnJheUxpc3Q8TmVzdGFibGVTZWNvbmRhcnlUYWJsZT4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5pbml0aWFsaXplTmVzdGVkQW5ub3RhdGlvbnMoYXN0Um9vdCwgdGhpcyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gInZhbHVlIjsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZVNlY29uZGFyeVRhYmxlPiBuZXN0ZWRBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZVNlY29uZGFyeVRhYmxlPih0aGlzLnNlY29uZGFyeVRhYmxlcyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZXMuc2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVTZWNvbmRhcnlUYWJsZSBhZGRJbnRlcm5hbChpbnQgaW5kZXgpIHsKLQkJTmVzdGFibGVTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGNyZWF0ZVNlY29uZGFyeVRhYmxlKGluZGV4KTsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZXMuYWRkKGluZGV4LCBzZWNvbmRhcnlUYWJsZSk7Ci0JCXJldHVybiBzZWNvbmRhcnlUYWJsZTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVTZWNvbmRhcnlUYWJsZSBhZGQoaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBjcmVhdGVTZWNvbmRhcnlUYWJsZShpbmRleCk7Ci0JCXRoaXMuYWRkKGluZGV4LCBzZWNvbmRhcnlUYWJsZSk7Ci0JCXJldHVybiBzZWNvbmRhcnlUYWJsZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkKGludCBpbmRleCwgTmVzdGFibGVTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgewotCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBzZWNvbmRhcnlUYWJsZSwgdGhpcy5zZWNvbmRhcnlUYWJsZXMsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uU0VDT05EQVJZX1RBQkxFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKE5lc3RhYmxlU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJcmVtb3ZlSXRlbUZyb21MaXN0KHNlY29uZGFyeVRhYmxlLCB0aGlzLnNlY29uZGFyeVRhYmxlcywgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5TRUNPTkRBUllfVEFCTEVTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5zZWNvbmRhcnlUYWJsZXMsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uU0VDT05EQVJZX1RBQkxFU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIGludCBpbmRleE9mKE5lc3RhYmxlU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJcmV0dXJuIHRoaXMuc2Vjb25kYXJ5VGFibGVzLmluZGV4T2Yoc2Vjb25kYXJ5VGFibGUpOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVTZWNvbmRhcnlUYWJsZSBuZXN0ZWRBbm5vdGF0aW9uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZGFyeVRhYmxlcy5nZXQoaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVTZWNvbmRhcnlUYWJsZSBuZXN0ZWRBbm5vdGF0aW9uRm9yKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJZm9yIChOZXN0YWJsZVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlIDogdGhpcy5zZWNvbmRhcnlUYWJsZXMpIHsKLQkJCWlmIChqZHRBbm5vdGF0aW9uID09IHNlY29uZGFyeVRhYmxlLmdldEpkdEFubm90YXRpb24oKENvbXBpbGF0aW9uVW5pdCkgamR0QW5ub3RhdGlvbi5nZXRSb290KCkpKSB7Ci0JCQkJcmV0dXJuIHNlY29uZGFyeVRhYmxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJbW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCAgdGhpcy5zZWNvbmRhcnlUYWJsZXMsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uU0VDT05EQVJZX1RBQkxFU19MSVNUKTsKLQl9Ci0JLy9UT0RPIHRoaXMgbW92ZSBpcyBkaWZmZXJlbnQgdGhhbiBob3cgd2UgaGFuZGxlIFNlY29uZGFyVGFibGUucGtKb2luQ29sdW1ucwotLy8JcHVibGljIHZvaWQgbW92ZVBrSm9pbkNvbHVtbihpbnQgb2xkSW5kZXgsIGludCBuZXdJbmRleCkgewotLy8JCW1vdmVQa0pvaW5Db2x1bW5JbnRlcm5hbChvbGRJbmRleCwgbmV3SW5kZXgpOwotLy8JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJNb3ZlKG5ld0luZGV4LCBvbGRJbmRleCwgdGhpcy5wa0pvaW5Db2x1bW5zQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0vLwkJZmlyZUl0ZW1Nb3ZlZChTZWNvbmRhcnlUYWJsZS5QS19KT0lOX0NPTFVNTlNfTElTVCwgbmV3SW5kZXgsIG9sZEluZGV4KTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5zZWNvbmRhcnlUYWJsZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy51cGRhdGVOZXN0ZWRBbm5vdGF0aW9uc0Zyb21KYXZhKGFzdFJvb3QsIHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIFNlY29uZGFyeVRhYmxlSW1wbCBjcmVhdGVTZWNvbmRhcnlUYWJsZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFNlY29uZGFyeVRhYmxlSW1wbC5jcmVhdGVOZXN0ZWRTZWNvbmRhcnlUYWJsZSh0aGlzLCBnZXRNZW1iZXIoKSwgaW5kZXgsIGdldERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IFNlY29uZGFyeVRhYmxlc0ltcGwoKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NGIzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlTZXF1ZW5jZUdlbmVyYXRvcjFfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcjFfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5TZXF1ZW5jZUdlbmVyYXRvcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcm90ZWN0ZWQgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcjFfMEFubm90YXRpb24ocGFyZW50LCBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3IxXzBBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvckltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDhkM2ZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGNsYXNzIFNlcXVlbmNlR2VuZXJhdG9ySW1wbCBleHRlbmRzIEdlbmVyYXRvckltcGwgaW1wbGVtZW50cyBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHNlcXVlbmNlTmFtZUFkYXB0ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTkFNRV9BREFQVEVSID0gYnVpbGRBZGFwdGVyKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1JfX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gSU5JVElBTF9WQUxVRV9BREFQVEVSID0gYnVpbGRJbnRlZ2VyQWRhcHRlcihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IEFMTE9DQVRJT05fU0laRV9BREFQVEVSID0gYnVpbGRJbnRlZ2VyQWRhcHRlcihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBTRVFVRU5DRV9OQU1FX0FEQVBURVIgPSBidWlsZEFkYXB0ZXIoSlBBLlNFUVVFTkNFX0dFTkVSQVRPUl9fU0VRVUVOQ0VfTkFNRSk7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgc2VxdWVuY2VOYW1lOwotCi0JcHJvdGVjdGVkIFNlcXVlbmNlR2VuZXJhdG9ySW1wbChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5zZXF1ZW5jZU5hbWVBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIoU0VRVUVOQ0VfTkFNRV9BREFQVEVSKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMuc2VxdWVuY2VOYW1lID0gdGhpcy5zZXF1ZW5jZU5hbWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JLy8qKioqKioqKioqKiogR2VuZXJhdG9ySW1wbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGFsbG9jYXRpb25TaXplQWRhcHRlcigpIHsKLQkJcmV0dXJuIEFMTE9DQVRJT05fU0laRV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBpbml0aWFsVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gSU5JVElBTF9WQUxVRV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gTkFNRV9BREFQVEVSOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRTZXF1ZW5jZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNlcXVlbmNlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZU5hbWUoU3RyaW5nIG5ld1NlcXVlbmNlTmFtZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuc2VxdWVuY2VOYW1lLCBuZXdTZXF1ZW5jZU5hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZFNlcXVlbmNlTmFtZSA9IHRoaXMuc2VxdWVuY2VOYW1lOwotCQl0aGlzLnNlcXVlbmNlTmFtZSA9IG5ld1NlcXVlbmNlTmFtZTsKLQkJdGhpcy5zZXF1ZW5jZU5hbWVBZGFwdGVyLnNldFZhbHVlKG5ld1NlcXVlbmNlTmFtZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkU2VxdWVuY2VOYW1lLCBuZXdTZXF1ZW5jZU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlcXVlbmNlTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFNFUVVFTkNFX05BTUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBqYXZhIGFubm90YXRpb25zIC0+IHBlcnNpc3RlbmNlIG1vZGVsICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKLQkJdGhpcy5zZXRTZXF1ZW5jZU5hbWUodGhpcy5zZXF1ZW5jZU5hbWUoYXN0Um9vdCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcXVlbmNlTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZU5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gYnVpbGRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgZWxlbWVudE5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkSW50ZWdlckFkYXB0ZXIoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBidWlsZEludGVnZXJBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgZWxlbWVudE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgU2VxdWVuY2VHZW5lcmF0b3JJbXBsKHBhcmVudCwgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZTIxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5VGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuVGFibGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBUYWJsZUFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZVRhYmxlQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IE51bGxUYWJsZUFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeVRhYmxlQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOGU4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5VGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlRhYmxlR2VuZXJhdG9yCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUYWJsZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VUYWJsZUdlbmVyYXRvckFubm90YXRpb24ocGFyZW50LCBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5VGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZUdlbmVyYXRvckltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2ExNzNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db250YWluZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFRhYmxlR2VuZXJhdG9ySW1wbCBleHRlbmRzIEdlbmVyYXRvckltcGwgaW1wbGVtZW50cyBUYWJsZUdlbmVyYXRvckFubm90YXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRhYmxlQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gY2F0YWxvZ0FkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHNjaGVtYUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHBrQ29sdW1uTmFtZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQ29sdW1uTmFtZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHBrQ29sdW1uVmFsdWVBZGFwdGVyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IE5BTUVfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IElOSVRJQUxfVkFMVUVfQURBUFRFUiA9IGJ1aWxkSW50ZWdlckFkYXB0ZXIoSlBBLlRBQkxFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBBTExPQ0FUSU9OX1NJWkVfQURBUFRFUiA9IGJ1aWxkSW50ZWdlckFkYXB0ZXIoSlBBLlRBQkxFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVEFCTEVfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19UQUJMRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IENBVEFMT0dfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19DQVRBTE9HKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gU0NIRU1BX0FEQVBURVIgPSBidWlsZEFkYXB0ZXIoSlBBLlRBQkxFX0dFTkVSQVRPUl9fU0NIRU1BKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gUEtfQ09MVU1OX05BTUVfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0NPTFVNTl9OQU1FX0FEQVBURVIgPSBidWlsZEFkYXB0ZXIoSlBBLlRBQkxFX0dFTkVSQVRPUl9fVkFMVUVfQ09MVU1OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBQS19DT0xVTU5fVkFMVUVfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUUpOwotCQotCXByaXZhdGUgU3RyaW5nIHRhYmxlOwotCQotCXByaXZhdGUgU3RyaW5nIGNhdGFsb2c7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgc2NoZW1hOwotCQotCXByaXZhdGUgU3RyaW5nIHBrQ29sdW1uTmFtZTsKLQkKLQlwcml2YXRlIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcGtDb2x1bW5WYWx1ZTsKLQkKLQlwcml2YXRlIGZpbmFsIExpc3Q8TmVzdGFibGVVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50czsKLQkKLQlwcml2YXRlIGZpbmFsIFVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyQW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lckFubm90YXRpb247Ci0JCi0KLQlwcm90ZWN0ZWQgVGFibGVHZW5lcmF0b3JJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKFRBQkxFX0FEQVBURVIpOwotCQl0aGlzLmNhdGFsb2dBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIoQ0FUQUxPR19BREFQVEVSKTsKLQkJdGhpcy5zY2hlbWFBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIoU0NIRU1BX0FEQVBURVIpOwotCQl0aGlzLnBrQ29sdW1uTmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcihQS19DT0xVTU5fTkFNRV9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUNvbHVtbk5hbWVBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIoVkFMVUVfQ09MVU1OX05BTUVfQURBUFRFUik7Ci0JCXRoaXMucGtDb2x1bW5WYWx1ZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcihQS19DT0xVTU5fVkFMVUVfQURBUFRFUik7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludHMgPSBuZXcgQXJyYXlMaXN0PE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludD4oKTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lckFubm90YXRpb24gPSBuZXcgVW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy50YWJsZSA9IHRoaXMudGFibGUoYXN0Um9vdCk7Ci0JCXRoaXMuY2F0YWxvZyA9IHRoaXMuY2F0YWxvZyhhc3RSb290KTsKLQkJdGhpcy5zY2hlbWEgPSB0aGlzLnNjaGVtYShhc3RSb290KTsKLQkJdGhpcy5wa0NvbHVtbk5hbWUgPSB0aGlzLnBrQ29sdW1uTmFtZShhc3RSb290KTsKLQkJdGhpcy52YWx1ZUNvbHVtbk5hbWUgPSB0aGlzLnZhbHVlQ29sdW1uTmFtZShhc3RSb290KTsKLQkJdGhpcy5wa0NvbHVtblZhbHVlID0gdGhpcy5wa0NvbHVtblZhbHVlKGFzdFJvb3QpOwotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuaW5pdGlhbGl6ZU5lc3RlZEFubm90YXRpb25zKGFzdFJvb3QsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCQotCS8vKioqKioqKioqKioqIEdlbmVyYXRvckltcGwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBhbGxvY2F0aW9uU2l6ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBBTExPQ0FUSU9OX1NJWkVfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gaW5pdGlhbFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIElOSVRJQUxfVkFMVUVfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIE5BTUVfQURBUFRFUjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGFibGUoU3RyaW5nIG5ld1RhYmxlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy50YWJsZSwgbmV3VGFibGUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZFRhYmxlID0gdGhpcy50YWJsZTsKLQkJdGhpcy50YWJsZSA9IG5ld1RhYmxlOwotCQl0aGlzLnRhYmxlQWRhcHRlci5zZXRWYWx1ZShuZXdUYWJsZSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfUFJPUEVSVFksIG9sZFRhYmxlLCBuZXdUYWJsZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nKFN0cmluZyBuZXdDYXRhbG9nKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5jYXRhbG9nLCBuZXdDYXRhbG9nKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGRDYXRhbG9nID0gdGhpcy5jYXRhbG9nOwotCQl0aGlzLmNhdGFsb2cgPSBuZXdDYXRhbG9nOwotCQl0aGlzLmNhdGFsb2dBZGFwdGVyLnNldFZhbHVlKG5ld0NhdGFsb2cpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENBVEFMT0dfUFJPUEVSVFksIG9sZENhdGFsb2csIG5ld0NhdGFsb2cpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIG5ld1NjaGVtYSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuc2NoZW1hLCBuZXdTY2hlbWEpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG9sZFNjaGVtYSA9IHRoaXMuc2NoZW1hOwotCQl0aGlzLnNjaGVtYSA9IG5ld1NjaGVtYTsKLQkJdGhpcy5zY2hlbWFBZGFwdGVyLnNldFZhbHVlKG5ld1NjaGVtYSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0NIRU1BX1BST1BFUlRZLCBvbGRTY2hlbWEsIG5ld1NjaGVtYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQa0NvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnBrQ29sdW1uTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGtDb2x1bW5OYW1lKFN0cmluZyBuZXdQa0NvbHVtbk5hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnBrQ29sdW1uTmFtZSwgbmV3UGtDb2x1bW5OYW1lKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvbGRQa0NvbHVtbk5hbWUgPSB0aGlzLnBrQ29sdW1uTmFtZTsKLQkJdGhpcy5wa0NvbHVtbk5hbWUgPSBuZXdQa0NvbHVtbk5hbWU7Ci0JCXRoaXMucGtDb2x1bW5OYW1lQWRhcHRlci5zZXRWYWx1ZShuZXdQa0NvbHVtbk5hbWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBLX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGRQa0NvbHVtbk5hbWUsIG5ld1BrQ29sdW1uTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUNvbHVtbk5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlQ29sdW1uTmFtZShTdHJpbmcgbmV3VmFsdWVDb2x1bW5OYW1lKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy52YWx1ZUNvbHVtbk5hbWUsIG5ld1ZhbHVlQ29sdW1uTmFtZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkVmFsdWVDb2x1bW5OYW1lID0gdGhpcy52YWx1ZUNvbHVtbk5hbWU7Ci0JCXRoaXMudmFsdWVDb2x1bW5OYW1lID0gbmV3VmFsdWVDb2x1bW5OYW1lOwotCQl0aGlzLnZhbHVlQ29sdW1uTmFtZUFkYXB0ZXIuc2V0VmFsdWUobmV3VmFsdWVDb2x1bW5OYW1lKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkVmFsdWVDb2x1bW5OYW1lLCBuZXdWYWx1ZUNvbHVtbk5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGtDb2x1bW5WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMucGtDb2x1bW5WYWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGtDb2x1bW5WYWx1ZShTdHJpbmcgbmV3UGtDb2x1bW5WYWx1ZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMucGtDb2x1bW5WYWx1ZSwgbmV3UGtDb2x1bW5WYWx1ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb2xkUGtDb2x1bW5WYWx1ZSA9IHRoaXMucGtDb2x1bW5WYWx1ZTsKLQkJdGhpcy5wa0NvbHVtblZhbHVlID0gbmV3UGtDb2x1bW5WYWx1ZTsKLQkJdGhpcy5wa0NvbHVtblZhbHVlQWRhcHRlci5zZXRWYWx1ZShuZXdQa0NvbHVtblZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQS19DT0xVTU5fVkFMVUVfUFJPUEVSVFksIG9sZFBrQ29sdW1uVmFsdWUsIG5ld1BrQ29sdW1uVmFsdWUpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPih0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKTsKLQl9Ci0JCi0JcHVibGljIGludCB1bmlxdWVDb25zdHJhaW50c1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50QXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmdldChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5kZXhPZlVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50cy5pbmRleE9mKHVuaXF1ZUNvbnN0cmFpbnQpOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCU5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50ID0gKE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCkgQ29udGFpbmVyQW5ub3RhdGlvblRvb2xzLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1BZGRlZChUYWJsZUdlbmVyYXRvckFubm90YXRpb24uVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QsIGluZGV4LCB1bmlxdWVDb25zdHJhaW50KTsKLQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCwgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJYWRkSXRlbVRvTGlzdChpbmRleCwgdW5pcXVlQ29uc3RyYWludCwgdGhpcy51bmlxdWVDb25zdHJhaW50cywgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQlOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCA9IHRoaXMudW5pcXVlQ29uc3RyYWludHMuZ2V0KGluZGV4KTsKLQkJcmVtb3ZlVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KTsKLQkJdW5pcXVlQ29uc3RyYWludC5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXN5bmNoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW5kZXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCXJlbW92ZUl0ZW1Gcm9tTGlzdCh1bmlxdWVDb25zdHJhaW50LCB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLCBVTklRVUVfQ09OU1RSQUlOVFNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJbW92ZVVuaXF1ZUNvbnN0cmFpbnRJbnRlcm5hbCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMuc3luY2hBbm5vdGF0aW9uc0FmdGVyTW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJZmlyZUl0ZW1Nb3ZlZChUYWJsZUFubm90YXRpb24uVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50SW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy51bmlxdWVDb25zdHJhaW50cywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBzeW5jaHJvbml6ZSB0aGUgYW5ub3RhdGlvbnMgd2l0aCB0aGUgbW9kZWwgam9pbiBjb2x1bW5zLAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggdG8gcHJldmVudCBvdmVybGFwCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW50IGluZGV4KSB7Ci0JCUNvbnRhaW5lckFubm90YXRpb25Ub29scy5zeW5jaEFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW5kZXgsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXJBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCBjcmVhdGVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQlyZXR1cm4gVW5pcXVlQ29uc3RyYWludEltcGwuY3JlYXRlVGFibGVHZW5lcmF0b3JVbmlxdWVDb25zdHJhaW50KHRoaXMsIHRoaXMuZ2V0TWVtYmVyKCksIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVEFCTEVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKENBVEFMT0dfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoU0NIRU1BX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFBrQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFBLX0NPTFVNTl9OQU1FX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFBrQ29sdW1uVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShQS19DT0xVTU5fVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQ09MVU1OX05BTUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBqYXZhIGFubm90YXRpb25zIC0+IHBlcnNpc3RlbmNlIG1vZGVsICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKLQkJdGhpcy5zZXRUYWJsZSh0aGlzLnRhYmxlKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRDYXRhbG9nKHRoaXMuY2F0YWxvZyhhc3RSb290KSk7Ci0JCXRoaXMuc2V0U2NoZW1hKHRoaXMuc2NoZW1hKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRQa0NvbHVtbk5hbWUodGhpcy5wa0NvbHVtbk5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnNldFZhbHVlQ29sdW1uTmFtZSh0aGlzLnZhbHVlQ29sdW1uTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc2V0UGtDb2x1bW5WYWx1ZSh0aGlzLnBrQ29sdW1uVmFsdWUoYXN0Um9vdCkpOwotCQl0aGlzLnVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzRnJvbUphdmEoYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0YWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy50YWJsZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgY2F0YWxvZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBzY2hlbWEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBwa0NvbHVtbk5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucGtDb2x1bW5OYW1lQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVDb2x1bW5OYW1lQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBwa0NvbHVtblZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnBrQ29sdW1uVmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQkvKioKLQkgKiBoZXJlIHdlIGp1c3Qgd29ycnkgYWJvdXQgZ2V0dGluZyB0aGUgdW5pcXVlIGNvbnN0cmFpbnRzIGxpc3RzIHRoZSBzYW1lIHNpemU7Ci0JICogdGhlbiB3ZSBkZWxlZ2F0ZSB0byB0aGUgdW5pcXVlIGNvbnN0cmFpbnRzIHRvIHN5bmNoIHRoZW1zZWx2ZXMgdXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlVW5pcXVlQ29uc3RyYWludHNGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlDb250YWluZXJBbm5vdGF0aW9uVG9vbHMudXBkYXRlTmVzdGVkQW5ub3RhdGlvbnNGcm9tSmF2YShhc3RSb290LCB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyQW5ub3RhdGlvbik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFkYXB0ZXIoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBidWlsZEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBlbGVtZW50TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRJbnRlZ2VyQWRhcHRlcihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkSW50ZWdlckFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBlbGVtZW50TmFtZSk7Ci0JfQotCi0JCi0JcHJpdmF0ZSBjbGFzcyBVbmlxdWVDb25zdHJhaW50c0NvbnRhaW5lckFubm90YXRpb24gZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUgCi0JCWltcGxlbWVudHMgQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQ+IAotCXsKLQkJcHVibGljIFVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyQW5ub3RhdGlvbigpIHsKLQkJCXN1cGVyKFRhYmxlR2VuZXJhdG9ySW1wbC50aGlzKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJLy9ub3RoaW5nIHRvIGluaXRpYWxpemUKLQkJfQotCQkKLQkJcHVibGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCBhZGRJbnRlcm5hbChpbnQgaW5kZXgpIHsKLQkJCU5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50ID0gVGFibGVHZW5lcmF0b3JJbXBsLnRoaXMuY3JlYXRlVW5pcXVlQ29uc3RyYWludChpbmRleCk7Ci0JCQlUYWJsZUdlbmVyYXRvckltcGwudGhpcy51bmlxdWVDb25zdHJhaW50cy5hZGQoaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnQpOwotCQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgYWRkKGludCBpbmRleCkgewotCQkJTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgPSBUYWJsZUdlbmVyYXRvckltcGwudGhpcy5jcmVhdGVVbmlxdWVDb25zdHJhaW50KGluZGV4KTsKLQkJCVRhYmxlR2VuZXJhdG9ySW1wbC50aGlzLmFkZFVuaXF1ZUNvbnN0cmFpbnQoaW5kZXgsIHVuaXF1ZUNvbnN0cmFpbnQpOwotCQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9ySW1wbC50aGlzLmdldEFubm90YXRpb25OYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gSlBBLlVOSVFVRV9DT05TVFJBSU5UOwotCQl9Ci0KLQkJcHVibGljIGludCBpbmRleE9mKE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JJbXBsLnRoaXMuaW5kZXhPZlVuaXF1ZUNvbnN0cmFpbnQodW5pcXVlQ29uc3RyYWludCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCQlUYWJsZUdlbmVyYXRvckltcGwudGhpcy5tb3ZlVW5pcXVlQ29uc3RyYWludCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW92ZUludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCQlUYWJsZUdlbmVyYXRvckltcGwudGhpcy5tb3ZlVW5pcXVlQ29uc3RyYWludEludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IG5lc3RlZEFubm90YXRpb25BdChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckltcGwudGhpcy51bmlxdWVDb25zdHJhaW50QXQoaW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCBuZXN0ZWRBbm5vdGF0aW9uRm9yKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJCWZvciAoTmVzdGFibGVVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUobmVzdGVkQW5ub3RhdGlvbnMoKSkpIHsKLQkJCQlpZiAoamR0QW5ub3RhdGlvbiA9PSB1bmlxdWVDb25zdHJhaW50LmdldEpkdEFubm90YXRpb24oKENvbXBpbGF0aW9uVW5pdCkgamR0QW5ub3RhdGlvbi5nZXRSb290KCkpKSB7Ci0JCQkJCXJldHVybiB1bmlxdWVDb25zdHJhaW50OwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQ+IG5lc3RlZEFubm90YXRpb25zKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQ+KFRhYmxlR2VuZXJhdG9ySW1wbC50aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgewotCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9ySW1wbC50aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnNpemUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgewotCQkJVGFibGVHZW5lcmF0b3JJbXBsLnRoaXMucmVtb3ZlVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KTsJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQl0aGlzLnJlbW92ZShuZXN0ZWRBbm5vdGF0aW9uQXQoaW5kZXgpKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JJbXBsLnRoaXMuZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCQlUYWJsZUdlbmVyYXRvckltcGwudGhpcy5uZXdBbm5vdGF0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQkJVGFibGVHZW5lcmF0b3JJbXBsLnRoaXMucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCVRhYmxlR2VuZXJhdG9ySW1wbC50aGlzLnVwZGF0ZUZyb21KYXZhKGFzdFJvb3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9ySW1wbC50aGlzLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiAidW5pcXVlQ29uc3RyYWludHMiOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBUYWJsZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG5ldyBUYWJsZUdlbmVyYXRvckltcGwocGFyZW50LCBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2E3ZDU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGNsYXNzIFRhYmxlSW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VUYWJsZQotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBOQU1FX0FEQVBURVIgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5UQUJMRV9fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFNDSEVNQV9BREFQVEVSID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuVEFCTEVfX1NDSEVNQSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IENBVEFMT0dfQURBUFRFUiA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLlRBQkxFX19DQVRBTE9HKTsKLQkKLQlwcm90ZWN0ZWQgVGFibGVJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUikpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJLy8gaWdub3JlIHRoZSBkYWEgcGFzc2VkIGluLCBAVGFibGUgaXMgbmV2ZXIgbmVzdGVkCi0JCXJldHVybiBOQU1FX0FEQVBURVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2NoZW1hQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJLy8gaWdub3JlIHRoZSBkYWEgcGFzc2VkIGluLCBAVGFibGUgaXMgbmV2ZXIgbmVzdGVkCi0JCXJldHVybiBTQ0hFTUFfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjYXRhbG9nQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJLy8gaWdub3JlIHRoZSBkYWEgcGFzc2VkIGluLCBAVGFibGUgaXMgbmV2ZXIgbmVzdGVkCi0JCXJldHVybiBDQVRBTE9HX0FEQVBURVI7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgY3JlYXRlVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFVuaXF1ZUNvbnN0cmFpbnRJbXBsLmNyZWF0ZVRhYmxlVW5pcXVlQ29uc3RyYWludCh0aGlzLCB0aGlzLmdldE1lbWJlcigpLCBpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBUYWJsZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCS8qKgotCQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkJICovCi0JCXByaXZhdGUgVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgVGFibGVJbXBsKHBhcmVudCwgbWVtYmVyKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTnVsbFRhYmxlKHBhcmVudCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UZW1wb3JhbEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UZW1wb3JhbEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0MzNlMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlUZW1wb3JhbEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlVGVtcG9yYWxBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVGVtcG9yYWxBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBUZW1wb3JhbEFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIFRlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlVGVtcG9yYWxBbm5vdGF0aW9uKHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXJldHVybiBuZXcgTnVsbFRlbXBvcmFsQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlUZW1wb3JhbEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RlbXBvcmFsSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGVtcG9yYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTYxNjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGVtcG9yYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi1wdWJsaWMgY2xhc3MgVGVtcG9yYWxJbXBsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPiBpbXBsZW1lbnRzIFRlbXBvcmFsQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0KLQlwcml2YXRlIFRlbXBvcmFsVHlwZSB2YWx1ZTsKLQkKLQlwcm90ZWN0ZWQgVGVtcG9yYWxJbXBsKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhdHRyaWJ1dGUsIFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUoYXN0Um9vdCk7CQkKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVGVtcG9yYWxUeXBlIG5ld1ZhbHVlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy52YWx1ZSwgbmV3VmFsdWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVGVtcG9yYWxUeXBlIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IG5ld1ZhbHVlOwotCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZShUZW1wb3JhbFR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKG5ld1ZhbHVlKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnNldFZhbHVlKHRoaXMudmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBUZW1wb3JhbFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5URU1QT1JBTF9fVkFMVUUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb24gaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCXsKLQkJLy8gc2luZ2xldG9uCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFRlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgVGVtcG9yYWxBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQkvKioKLQkJICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JCSAqLwotCQlwcml2YXRlIFRlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbmV3IFRlbXBvcmFsSW1wbChwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgTnVsbFRlbXBvcmFsKHBhcmVudCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UcmFuc2llbnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDg0NzA0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlUcmFuc2llbnRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVRyYW5zaWVudEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5UcmFuc2llbnQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFRyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIFRyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZVRyYW5zaWVudEFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKKwl9CisJCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlUcmFuc2llbnRBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UcmFuc2llbnRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UcmFuc2llbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTA2ODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNpZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLQotcHVibGljIGNsYXNzIFRyYW5zaWVudEltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+IGltcGxlbWVudHMgVHJhbnNpZW50QW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQkKLQlwcm90ZWN0ZWQgVHJhbnNpZW50SW1wbChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ubyBhbm5vdGF0aW9uIG1lbWJlcnMKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUcmFuc2llbnRBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIFRyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBUcmFuc2llbnRBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNpZW50SW1wbCgoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1VuaXF1ZUNvbnN0cmFpbnRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9VbmlxdWVDb25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWZhNDZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1VuaXF1ZUNvbnN0cmFpbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBVbmlxdWVDb25zdHJhaW50SW1wbCBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VBbm5vdGF0aW9uPE1lbWJlcj4gaW1wbGVtZW50cyBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQKLXsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGNvbHVtbk5hbWVzRGVjbGFyYXRpb25BZGFwdGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGNvbHVtbk5hbWVzQWRhcHRlcjsKLQotCXByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IGNvbHVtbk5hbWVzOwotCi0KLQlwdWJsaWMgVW5pcXVlQ29uc3RyYWludEltcGwoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBtZW1iZXIsIGlkYWEsIG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBpZGFhKSk7Ci0JCXRoaXMuY29sdW1uTmFtZXNEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGlkYWEsIEpQQS5VTklRVUVfQ09OU1RSQUlOVF9fQ09MVU1OX05BTUVTKTsKLQkJdGhpcy5jb2x1bW5OYW1lc0FkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMuY29sdW1uTmFtZXNEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmNvbHVtbk5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmdbXSBqYXZhQ29sdW1uTmFtZXMgPSB0aGlzLmNvbHVtbk5hbWVzQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXZhQ29sdW1uTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRoaXMuY29sdW1uTmFtZXMuYWRkKGphdmFDb2x1bW5OYW1lc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBTaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGdldE1lbWJlcigpLCBkYWVhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmdbXT4gY29udmVydGVyKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGZhbHNlLCBjb252ZXJ0ZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0QW5ub3RhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoSW5kZXhlZEFubm90YXRpb25BZGFwdGVyKSBzdXBlci5nZXRBbm5vdGF0aW9uQWRhcHRlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShOZXN0YWJsZUFubm90YXRpb24gb2xkQW5ub3RhdGlvbikgewotCQlVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBvbGRVbmlxdWVDb25zdHJhaW50ID0gKFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKSBvbGRBbm5vdGF0aW9uOwotCQlmb3IgKFN0cmluZyBjb2x1bW5OYW1lIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9sZFVuaXF1ZUNvbnN0cmFpbnQuY29sdW1uTmFtZXMoKSkpIHsKLQkJCWFkZENvbHVtbk5hbWUoY29sdW1uTmFtZXNTaXplKCksIGNvbHVtbk5hbWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBjb2x1bW5OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuY29sdW1uTmFtZXMpOwotCX0KLQotCXB1YmxpYyBpbnQgY29sdW1uTmFtZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5OYW1lcy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZENvbHVtbk5hbWUoU3RyaW5nIGNvbHVtbk5hbWUpIHsKLQkJYWRkQ29sdW1uTmFtZShjb2x1bW5OYW1lc1NpemUoKSwgY29sdW1uTmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZENvbHVtbk5hbWUoaW50IGluZGV4LCBTdHJpbmcgY29sdW1uTmFtZSkgewotCQlhZGRDb2x1bW5OYW1lXyhpbmRleCwgY29sdW1uTmFtZSk7Ci0JCXRoaXMuY29sdW1uTmFtZXNBZGFwdGVyLnNldFZhbHVlKHRoaXMuY29sdW1uTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW3RoaXMuY29sdW1uTmFtZXMuc2l6ZSgpXSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5OYW1lXyhpbnQgaW5kZXgsIFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0JCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGNvbHVtbk5hbWUsIHRoaXMuY29sdW1uTmFtZXMsIENPTFVNTl9OQU1FU19MSVNUKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoY29sdW1uTmFtZSwgdGhpcy5jb2x1bW5OYW1lcywgQ09MVU1OX05BTUVTX0xJU1QpOwotCQl0aGlzLmNvbHVtbk5hbWVzQWRhcHRlci5zZXRWYWx1ZSh0aGlzLmNvbHVtbk5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1t0aGlzLmNvbHVtbk5hbWVzLnNpemUoKV0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5OYW1lKGludCBpbmRleCkgewotCQlyZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMuY29sdW1uTmFtZXMsIENPTFVNTl9OQU1FU19MSVNUKTsKLQkJdGhpcy5jb2x1bW5OYW1lc0FkYXB0ZXIuc2V0VmFsdWUodGhpcy5jb2x1bW5OYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy5jb2x1bW5OYW1lcy5zaXplKCldKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVDb2x1bW5OYW1lKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5jb2x1bW5OYW1lcywgQ09MVU1OX05BTUVTX0xJU1QpOwotCQl0aGlzLmNvbHVtbk5hbWVzQWRhcHRlci5zZXRWYWx1ZSh0aGlzLmNvbHVtbk5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1t0aGlzLmNvbHVtbk5hbWVzLnNpemUoKV0pKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29sdW1uTmFtZXNUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMuY29sdW1uTmFtZXNEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy51cGRhdGVDb2x1bW5OYW1lc0Zyb21KYXZhKGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbHVtbk5hbWVzRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nW10gamF2YUNvbHVtbk5hbWVzID0gdGhpcy5jb2x1bW5OYW1lc0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JCS8vVE9ETyBobW0sIHNlZW1zIHdlIG5lZWQgY2hhbmdlIG5vdGlmaWNhdGlvbiBmb3IgdGhpcwotCQlDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKHRoaXMuY29sdW1uTmFtZXMsIGphdmFDb2x1bW5OYW1lcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YUNvbHVtbk5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgY29sdW1uTmFtZSA9IGphdmFDb2x1bW5OYW1lc1tpXTsKLQkJCWlmICghdGhpcy5jb2x1bW5OYW1lcy5jb250YWlucyhjb2x1bW5OYW1lKSkgewotCQkJCWFkZENvbHVtbk5hbWVfKGNvbHVtbk5hbWVzU2l6ZSgpLCBjb2x1bW5OYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogcGVyc2lzdGVuY2UgbW9kZWwgLT4gamF2YSBhbm5vdGF0aW9ucyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7Ci0JCWdldEFubm90YXRpb25BZGFwdGVyKCkubW92ZUFubm90YXRpb24obmV3SW5kZXgpOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXN0YXRpYyBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnQgY3JlYXRlU2Vjb25kYXJ5VGFibGVVbmlxdWVDb25zdHJhaW50KEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRJbXBsKHBhcmVudCwgbWVtYmVyLCBidWlsZFNlY29uZGFyeVRhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb25BZGFwdGVyKGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIsIGluZGV4KSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRTZWNvbmRhcnlUYWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIsIEpQQS5TRUNPTkRBUllfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUywgaW5kZXgsIEpQQS5VTklRVUVfQ09OU1RSQUlOVCk7Ci0JfQotCi0Jc3RhdGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCBjcmVhdGVKb2luVGFibGVVbmlxdWVDb25zdHJhaW50KEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50SW1wbChwYXJlbnQsIG1lbWJlciwgYnVpbGRKb2luVGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZEpvaW5UYWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKb2luVGFibGVJbXBsLkRFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkpPSU5fVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUywgaW5kZXgsIEpQQS5VTklRVUVfQ09OU1RSQUlOVCk7Ci0JfQotCi0Jc3RhdGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCBjcmVhdGVUYWJsZVVuaXF1ZUNvbnN0cmFpbnQoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRJbXBsKHBhcmVudCwgbWVtYmVyLCBidWlsZFRhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb25BZGFwdGVyKGluZGV4KSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRUYWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihUYWJsZUltcGwuREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUywgaW5kZXgsIEpQQS5VTklRVUVfQ09OU1RSQUlOVCk7Ci0JfQotCi0Jc3RhdGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludCBjcmVhdGVUYWJsZUdlbmVyYXRvclVuaXF1ZUNvbnN0cmFpbnQoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRJbXBsKHBhcmVudCwgbWVtYmVyLCBidWlsZFRhYmxlR2VuZXJhdG9yVW5pcXVlQ29uc3RyYWludEFubm90YXRpb25BZGFwdGVyKGluZGV4KSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRUYWJsZUdlbmVyYXRvclVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihUYWJsZUdlbmVyYXRvckltcGwuREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFMsIGluZGV4LCBKUEEuVU5JUVVFX0NPTlNUUkFJTlQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ZlcnNpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVmVyc2lvbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxMWNjZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ZlcnNpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVZlcnNpb25Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVZlcnNpb25Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlZlcnNpb24KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZlcnNpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBWZXJzaW9uQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgVmVyc2lvbkFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZVZlcnNpb25Bbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlWZXJzaW9uQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVmVyc2lvbkltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ZlcnNpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3Y2UwMjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVmVyc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotCi1wdWJsaWMgY2xhc3MgVmVyc2lvbkltcGwgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+IGltcGxlbWVudHMgVmVyc2lvbkFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwdWJsaWMgVmVyc2lvbkltcGwoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vIGFubm90YXRpb24gbWVtYmVycwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFZlcnNpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi0JewotCQkvLyBzaW5nbGV0b24KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVyc2lvbkFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFZlcnNpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgVmVyc2lvbkFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCQkgKi8KLQkJcHJpdmF0ZSBWZXJzaW9uQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCQotCQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiBuZXcgVmVyc2lvbkltcGwoKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1YjZiZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXJWYWx1ZVBhaXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworCisvKioKKyAqIEpBUiBhbm5vdGF0aW9uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCaW5hcnlBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlOb2RlCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uCit7CisJZmluYWwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbjsKKworCXByb3RlY3RlZCBCaW5hcnlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuamR0QW5ub3RhdGlvbiA9IGpkdEFubm90YXRpb247CisJfQorCisKKwkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIHRoZSB2YWx1ZXMgb2YgdGhlIEpEVCBhbm5vdGF0aW9uJ3MgbWVtYmVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqLworCXByb3RlY3RlZCBPYmplY3RbXSBnZXRKZHRNZW1iZXJWYWx1ZXMoU3RyaW5nIG1lbWJlck5hbWUpIHsKKwkJT2JqZWN0W10gdmFsdWVzID0gKE9iamVjdFtdKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKG1lbWJlck5hbWUpOworCQlyZXR1cm4gKHZhbHVlcyAhPSBudWxsKSA/IHZhbHVlcyA6IEVNUFRZX09CSkVDVF9BUlJBWTsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfT0JKRUNUX0FSUkFZID0gbmV3IE9iamVjdFswXTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIEpEVCBhbm5vdGF0aW9uJ3MgbWVtYmVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqLworCXByb3RlY3RlZCBPYmplY3QgZ2V0SmR0TWVtYmVyVmFsdWUoU3RyaW5nIG1lbWJlck5hbWUpIHsKKwkJSU1lbWJlclZhbHVlUGFpciBwYWlyID0gdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZVBhaXIobWVtYmVyTmFtZSk7CisJCXJldHVybiAocGFpciA9PSBudWxsKSA/IG51bGwgOiBwYWlyLmdldFZhbHVlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBKRFQgYW5ub3RhdGlvbidzIG1lbWJlci12YWx1ZSBwYWlyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqLworCXByaXZhdGUgSU1lbWJlclZhbHVlUGFpciBnZXRKZHRNZW1iZXJWYWx1ZVBhaXIoU3RyaW5nIG1lbWJlck5hbWUpIHsKKwkJZm9yIChJTWVtYmVyVmFsdWVQYWlyIHBhaXIgOiB0aGlzLmdldEpkdE1lbWJlclZhbHVlUGFpcnMoKSkgeworCQkJaWYgKHBhaXIuZ2V0TWVtYmVyTmFtZSgpLmVxdWFscyhtZW1iZXJOYW1lKSkgeworCQkJCXJldHVybiBwYWlyOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgSU1lbWJlclZhbHVlUGFpcltdIGdldEpkdE1lbWJlclZhbHVlUGFpcnMoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5qZHRBbm5vdGF0aW9uLmdldE1lbWJlclZhbHVlUGFpcnMoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQlKcHRDb3JlUGx1Z2luLmxvZyhleCk7CisJCQlyZXR1cm4gRU1QVFlfTUVNQkVSX1ZBTFVFX1BBSVJfQVJSQVk7CisJCX0KKwl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU1lbWJlclZhbHVlUGFpcltdIEVNUFRZX01FTUJFUl9WQUxVRV9QQUlSX0FSUkFZID0gbmV3IElNZW1iZXJWYWx1ZVBhaXJbMF07CisKKworCS8vICoqKioqKioqKiogQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKioqKioqIE5lc3RhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzliMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkFzc29jaWF0aW9uT3ZlcnJpZGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlPdmVycmlkZUFubm90YXRpb24KKwlpbXBsZW1lbnRzIE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24KK3sKKwlwcml2YXRlIGZpbmFsIFZlY3RvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnM7CisKKworCXByb3RlY3RlZCBCaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLmpvaW5Db2x1bW5zID0gdGhpcy5idWlsZEpvaW5Db2x1bW5zKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnVwZGF0ZUpvaW5Db2x1bW5zKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEJpbmFyeU92ZXJyaWRlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERV9fTkFNRTsKKwl9CisKKwkKKwkvLyAqKioqKioqKioqIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIGpvaW4gY29sdW1ucworCXB1YmxpYyBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPih0aGlzLmpvaW5Db2x1bW5zKTsKKwl9CisKKwlwdWJsaWMgaW50IGpvaW5Db2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbnMuc2l6ZSgpOworCX0KKworCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLmdldChpbmRleCk7CisJfQorCisJcHVibGljIGludCBpbmRleE9mSm9pbkNvbHVtbihKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uKSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLmluZGV4T2Yoam9pbkNvbHVtbik7CisJfQorCisJcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBidWlsZEpvaW5Db2x1bW5zKCkgeworCQlPYmplY3RbXSBqZHRKb2luQ29sdW1ucyA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9DT0xVTU5TKTsKKwkJVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPihqZHRKb2luQ29sdW1ucy5sZW5ndGgpOworCQlmb3IgKE9iamVjdCBqZHRKb2luQ29sdW1uIDogamR0Sm9pbkNvbHVtbnMpIHsKKwkJCXJlc3VsdC5hZGQobmV3IEJpbmFyeUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMsIChJQW5ub3RhdGlvbikgamR0Sm9pbkNvbHVtbikpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLy8gVE9ETworCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luQ29sdW1ucygpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhNzgyYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuQXNzb2NpYXRpb25PdmVycmlkZXMKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5Q29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uPgorCWltcGxlbWVudHMgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8TmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZXM7CisKKworCXByb3RlY3RlZCBCaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHRoaXMuYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uPiBuZXN0ZWRBbm5vdGF0aW9ucygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uPih0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzKTsKKwl9CisKKwlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMuc2l6ZSgpOworCX0KKworCXByaXZhdGUgVmVjdG9yPE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24+IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB7CisJCU9iamVjdFtdIGpkdEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZXMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFU19fVkFMVUUpOworCQlWZWN0b3I8TmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbj4gcmVzdWx0ID0gbmV3IFZlY3RvcjxOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uPihqZHRBc3NvY2lhdGlvbk92ZXJyaWRlcy5sZW5ndGgpOworCQlmb3IgKE9iamVjdCBqZHRBc3NvY2lhdGlvbk92ZXJyaWRlIDogamR0QXNzb2NpYXRpb25PdmVycmlkZXMpIHsKKwkJCXJlc3VsdC5hZGQoYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlKGpkdEFzc29jaWF0aW9uT3ZlcnJpZGUpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByb3RlY3RlZCBhYnN0cmFjdCBOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZShPYmplY3QgamR0QXNzb2NpYXRpb25PdmVycmlkZSk7CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy51cGRhdGVBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCX0KKworCS8vIFRPRE8KKwlwcml2YXRlIHZvaWQgdXBkYXRlQXNzb2NpYXRpb25PdmVycmlkZXMoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YWRkOGIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkF0dHJpYnV0ZU92ZXJyaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeU92ZXJyaWRlQW5ub3RhdGlvbgorCWltcGxlbWVudHMgTmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24KK3sKKwlwcml2YXRlIENvbHVtbkFubm90YXRpb24gY29sdW1uOworCisKKwlwdWJsaWMgQmluYXJ5QXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMuY29sdW1uID0gdGhpcy5idWlsZENvbHVtbigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy51cGRhdGVDb2x1bW4oKTsKKwl9CisKKworCS8vKioqKioqKioqKioqIEJpbmFyeU92ZXJyaWRlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVfX05BTUU7CisJfQorCQorCisJLy8qKioqKioqKioqKiogQXR0cmlidXRlT3ZlcnJpZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgorCisJLy8gKioqKiogY29sdW1uCisJcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy5jb2x1bW47CisJfQorCisJcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Tm9uTnVsbENvbHVtbigpIHsKKwkJcmV0dXJuICh0aGlzLmNvbHVtbiAhPSBudWxsKSA/IHRoaXMuY29sdW1uIDogbmV3IE51bGxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbkFubm90YXRpb24odGhpcyk7CisJfQorCisJcHVibGljIENvbHVtbkFubm90YXRpb24gYWRkQ29sdW1uKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW4oKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgQ29sdW1uQW5ub3RhdGlvbiBidWlsZENvbHVtbigpIHsKKwkJSUFubm90YXRpb24gamR0Q29sdW1uID0gdGhpcy5nZXRKZHRDb2x1bW4oKTsKKwkJcmV0dXJuIChqZHRDb2x1bW4gPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZENvbHVtbihqZHRDb2x1bW4pOworCX0KKworCXByaXZhdGUgQ29sdW1uQW5ub3RhdGlvbiBidWlsZENvbHVtbihJQW5ub3RhdGlvbiBqZHRDb2x1bW4pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlDb2x1bW5Bbm5vdGF0aW9uKHRoaXMsIGpkdENvbHVtbik7CisJfQorCisJcHJpdmF0ZSBJQW5ub3RhdGlvbiBnZXRKZHRDb2x1bW4oKSB7CisJCXJldHVybiAoSUFubm90YXRpb24pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLkFUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0Q29sdW1uKENvbHVtbkFubm90YXRpb24gY29sdW1uKSB7CisJCUNvbHVtbkFubm90YXRpb24gb2xkID0gdGhpcy5jb2x1bW47CisJCXRoaXMuY29sdW1uID0gY29sdW1uOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MVU1OX1BST1BFUlRZLCBvbGQsIGNvbHVtbik7CisJfQorCisJLy8gVE9ETworCXByaXZhdGUgdm9pZCB1cGRhdGVDb2x1bW4oKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworLy8JCUlBbm5vdGF0aW9uIGpkdENvbHVtbiA9IHRoaXMuZ2V0SmR0Q29sdW1uKCk7CisvLwkJaWYgKGpkdENvbHVtbiA9PSBudWxsKSB7CisvLwkJCXRoaXMuc2V0Q29sdW1uKG51bGwpOworLy8JCX0gZWxzZSB7CisvLwkJCWlmICh0aGlzLmNvbHVtbiA9PSBudWxsKSB7CisvLwkJCQl0aGlzLnNldENvbHVtbih0aGlzLmJ1aWxkQ29sdW1uKGpkdENvbHVtbikpOworLy8JCQl9IGVsc2UgeworLy8JCQkJdGhpcy5jb2x1bW4udXBkYXRlKGpkdENvbHVtbik7CisvLwkJCX0KKy8vCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWYwZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5BdHRyaWJ1dGVPdmVycmlkZXMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUNvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24+CisJaW1wbGVtZW50cyBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8TmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlczsKKworCisJcHVibGljIEJpbmFyeUF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXMgPSB0aGlzLmJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uPiBuZXN0ZWRBbm5vdGF0aW9ucygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbj4odGhpcy5hdHRyaWJ1dGVPdmVycmlkZXMpOworCX0KKworCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXMuc2l6ZSgpOworCX0KKworCXByaXZhdGUgVmVjdG9yPE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uPiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKKwkJT2JqZWN0W10gamR0QXR0cmlidXRlT3ZlcnJpZGVzID0gdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZXMoSlBBLkFUVFJJQlVURV9PVkVSUklERVNfX1ZBTFVFKTsKKwkJVmVjdG9yPE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uPihqZHRBdHRyaWJ1dGVPdmVycmlkZXMubGVuZ3RoKTsKKwkJZm9yIChPYmplY3QgamR0QXR0cmlidXRlT3ZlcnJpZGUgOiBqZHRBdHRyaWJ1dGVPdmVycmlkZXMpIHsKKwkJCXJlc3VsdC5hZGQobmV3IEJpbmFyeUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbih0aGlzLCAoSUFubm90YXRpb24pIGpkdEF0dHJpYnV0ZU92ZXJyaWRlKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnVwZGF0ZUF0dHJpYnV0ZU92ZXJyaWRlcygpOworCX0KKworCS8vIFRPRE8KKwlwcml2YXRlIHZvaWQgdXBkYXRlQXR0cmlidXRlT3ZlcnJpZGVzKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUJhc2VDb2x1bW5Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3ZDRmMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlQ29sdW1uQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VDb2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW4KKyAqLworYWJzdHJhY3QgY2xhc3MgQmluYXJ5QmFzZUNvbHVtbkFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeU5hbWVkQ29sdW1uQW5ub3RhdGlvbgorCWltcGxlbWVudHMgQmFzZUNvbHVtbkFubm90YXRpb24KK3sKKwlwcml2YXRlIFN0cmluZyB0YWJsZTsKKwlwcml2YXRlIEJvb2xlYW4gdW5pcXVlOworCXByaXZhdGUgQm9vbGVhbiBudWxsYWJsZTsKKwlwcml2YXRlIEJvb2xlYW4gaW5zZXJ0YWJsZTsKKwlwcml2YXRlIEJvb2xlYW4gdXBkYXRhYmxlOworCQorCisJQmluYXJ5QmFzZUNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy50YWJsZSA9IHRoaXMuYnVpbGRUYWJsZSgpOworCQl0aGlzLnVuaXF1ZSA9IHRoaXMuYnVpbGRVbmlxdWUoKTsKKwkJdGhpcy5udWxsYWJsZSA9IHRoaXMuYnVpbGROdWxsYWJsZSgpOworCQl0aGlzLmluc2VydGFibGUgPSB0aGlzLmJ1aWxkSW5zZXJ0YWJsZSgpOworCQl0aGlzLnVwZGF0YWJsZSA9IHRoaXMuYnVpbGRVcGRhdGFibGUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFRhYmxlXyh0aGlzLmJ1aWxkVGFibGUoKSk7CisJCXRoaXMuc2V0VW5pcXVlXyh0aGlzLmJ1aWxkVW5pcXVlKCkpOworCQl0aGlzLnNldE51bGxhYmxlXyh0aGlzLmJ1aWxkTnVsbGFibGUoKSk7CisJCXRoaXMuc2V0SW5zZXJ0YWJsZV8odGhpcy5idWlsZEluc2VydGFibGUoKSk7CisJCXRoaXMuc2V0VXBkYXRhYmxlXyh0aGlzLmJ1aWxkVXBkYXRhYmxlKCkpOworCX0KKworCisJLy8qKioqKioqKioqKioqIEJhc2VDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioKKworCS8vICoqKioqIHRhYmxlCisJcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMudGFibGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGFibGUoU3RyaW5nIHRhYmxlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgc2V0VGFibGVfKFN0cmluZyB0YWJsZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy50YWJsZTsKKwkJdGhpcy50YWJsZSA9IHRhYmxlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfUFJPUEVSVFksIG9sZCwgdGFibGUpOworCX0KKwkKKwlwcml2YXRlIFN0cmluZyBidWlsZFRhYmxlKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldFRhYmxlRWxlbWVudE5hbWUoKSk7CisJfQorCQorCWFic3RyYWN0IFN0cmluZyBnZXRUYWJsZUVsZW1lbnROYW1lKCk7CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiB0YWJsZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogdW5pcXVlCisJcHVibGljIEJvb2xlYW4gZ2V0VW5pcXVlKCkgeworCQlyZXR1cm4gdGhpcy51bmlxdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VW5pcXVlKEJvb2xlYW4gdW5pcXVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRVbmlxdWVfKEJvb2xlYW4gdW5pcXVlKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy51bmlxdWU7CisJCXRoaXMudW5pcXVlID0gdW5pcXVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVU5JUVVFX1BST1BFUlRZLCBvbGQsIHVuaXF1ZSk7CisJfQorCisJcHJpdmF0ZSBCb29sZWFuIGJ1aWxkVW5pcXVlKCkgeworCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRVbmlxdWVFbGVtZW50TmFtZSgpKTsKKwl9CisJCisJYWJzdHJhY3QgU3RyaW5nIGdldFVuaXF1ZUVsZW1lbnROYW1lKCk7CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFVuaXF1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJLy8gKioqKiogbnVsbGFibGUKKwlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMubnVsbGFibGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiBudWxsYWJsZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0TnVsbGFibGVfKEJvb2xlYW4gbnVsbGFibGUpIHsKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLm51bGxhYmxlOworCQl0aGlzLm51bGxhYmxlID0gbnVsbGFibGU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOVUxMQUJMRV9QUk9QRVJUWSwgb2xkLCBudWxsYWJsZSk7CisJfQorCisJcHJpdmF0ZSBCb29sZWFuIGJ1aWxkTnVsbGFibGUoKSB7CisJCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldE51bGxhYmxlRWxlbWVudE5hbWUoKSk7CisJfQorCQorCWFic3RyYWN0IFN0cmluZyBnZXROdWxsYWJsZUVsZW1lbnROYW1lKCk7CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE51bGxhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwkKKwkvLyAqKioqKiBpbnNlcnRhYmxlCisJcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuaW5zZXJ0YWJsZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRJbnNlcnRhYmxlKEJvb2xlYW4gaW5zZXJ0YWJsZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0SW5zZXJ0YWJsZV8oQm9vbGVhbiBpbnNlcnRhYmxlKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy5pbnNlcnRhYmxlOworCQl0aGlzLmluc2VydGFibGUgPSBpbnNlcnRhYmxlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSU5TRVJUQUJMRV9QUk9QRVJUWSwgb2xkLCBpbnNlcnRhYmxlKTsKKwl9CisKKwlwcml2YXRlIEJvb2xlYW4gYnVpbGRJbnNlcnRhYmxlKCkgeworCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRJbnNlcnRhYmxlRWxlbWVudE5hbWUoKSk7CisJfQorCQorCWFic3RyYWN0IFN0cmluZyBnZXRJbnNlcnRhYmxlRWxlbWVudE5hbWUoKTsKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SW5zZXJ0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJLy8gKioqKiogdXBkYXRhYmxlCisJcHVibGljIEJvb2xlYW4gZ2V0VXBkYXRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy51cGRhdGFibGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gdXBkYXRhYmxlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRVcGRhdGFibGVfKEJvb2xlYW4gdXBkYXRhYmxlKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy51cGRhdGFibGU7CisJCXRoaXMudXBkYXRhYmxlID0gdXBkYXRhYmxlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVVBEQVRBQkxFX1BST1BFUlRZLCBvbGQsIHVwZGF0YWJsZSk7CisJfQorCisJcHJpdmF0ZSBCb29sZWFuIGJ1aWxkVXBkYXRhYmxlKCkgeworCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRVcGRhdGFibGVFbGVtZW50TmFtZSgpKTsKKwl9CisKKwlhYnN0cmFjdCBTdHJpbmcgZ2V0VXBkYXRhYmxlRWxlbWVudE5hbWUoKTsKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VXBkYXRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlTmFtZWRRdWVyeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlTmFtZWRRdWVyeUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjc3NDVlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJ5CisgKiBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZE5hdGl2ZVF1ZXJ5CisgKi8KK2Fic3RyYWN0IGNsYXNzIEJpbmFyeUJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uCit7CisJU3RyaW5nIG5hbWU7CisJU3RyaW5nIHF1ZXJ5OworCWZpbmFsIFZlY3RvcjxRdWVyeUhpbnRBbm5vdGF0aW9uPiBoaW50czsKKworCisJQmluYXJ5QmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKCk7CisJCXRoaXMucXVlcnkgPSB0aGlzLmJ1aWxkUXVlcnkoKTsKKwkJdGhpcy5oaW50cyA9IHRoaXMuYnVpbGRIaW50cygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0TmFtZV8odGhpcy5idWlsZE5hbWUoKSk7CisJCXRoaXMuc2V0UXVlcnlfKHRoaXMuYnVpbGRRdWVyeSgpKTsKKwkJdGhpcy51cGRhdGVIaW50cygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBuYW1lCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldE5hbWVfKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXROYW1lRWxlbWVudE5hbWUoKSk7CisJfQorCisJYWJzdHJhY3QgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpOworCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIHF1ZXJ5CisJcHVibGljIFN0cmluZyBnZXRRdWVyeSgpIHsKKwkJcmV0dXJuIHRoaXMucXVlcnk7CisJfQorCisJcHVibGljIHZvaWQgc2V0UXVlcnkoU3RyaW5nIHF1ZXJ5KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRRdWVyeV8oU3RyaW5nIHF1ZXJ5KSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnF1ZXJ5OworCQl0aGlzLnF1ZXJ5ID0gcXVlcnk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChRVUVSWV9QUk9QRVJUWSwgb2xkLCBxdWVyeSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRRdWVyeSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRRdWVyeUVsZW1lbnROYW1lKCkpOworCX0KKworCWFic3RyYWN0IFN0cmluZyBnZXRRdWVyeUVsZW1lbnROYW1lKCk7CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFF1ZXJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIGhpbnRzCisJcHVibGljIExpc3RJdGVyYXRvcjxRdWVyeUhpbnRBbm5vdGF0aW9uPiBoaW50cygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxRdWVyeUhpbnRBbm5vdGF0aW9uPih0aGlzLmhpbnRzKTsKKwl9CisKKwlwdWJsaWMgaW50IGhpbnRzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuaGludHMuc2l6ZSgpOworCX0KKworCXB1YmxpYyBRdWVyeUhpbnRBbm5vdGF0aW9uIGhpbnRBdChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIHRoaXMuaGludHMuZ2V0KGluZGV4KTsKKwl9CisKKwlwdWJsaWMgaW50IGluZGV4T2ZIaW50KFF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50KSB7CisJCXJldHVybiB0aGlzLmhpbnRzLmluZGV4T2YocXVlcnlIaW50KTsKKwl9CisKKwlwdWJsaWMgUXVlcnlIaW50QW5ub3RhdGlvbiBhZGRIaW50KGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlSGludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVIaW50KGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIFZlY3RvcjxRdWVyeUhpbnRBbm5vdGF0aW9uPiBidWlsZEhpbnRzKCkgeworCQlPYmplY3RbXSBqZHRIaW50cyA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKHRoaXMuZ2V0SGludHNFbGVtZW50TmFtZSgpKTsKKwkJVmVjdG9yPFF1ZXJ5SGludEFubm90YXRpb24+IHJlc3VsdCA9IG5ldyBWZWN0b3I8UXVlcnlIaW50QW5ub3RhdGlvbj4oamR0SGludHMubGVuZ3RoKTsKKwkJZm9yIChPYmplY3QgamR0SGludCA6IGpkdEhpbnRzKSB7CisJCQlyZXN1bHQuYWRkKG5ldyBCaW5hcnlRdWVyeUhpbnRBbm5vdGF0aW9uKHRoaXMsIChJQW5ub3RhdGlvbikgamR0SGludCkpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJYWJzdHJhY3QgU3RyaW5nIGdldEhpbnRzRWxlbWVudE5hbWUoKTsKKworCS8vIFRPRE8KKwlwcml2YXRlIHZvaWQgdXBkYXRlSGludHMoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUJhc2VUYWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlVGFibGVBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4YzNkNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlVGFibGVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzZVRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuVGFibGUKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5UYWJsZQorICogamF2YXgucGVyc2lzdGVuY2UuU2Vjb25kYXJ5VGFibGUKKyAqLworYWJzdHJhY3QgY2xhc3MgQmluYXJ5QmFzZVRhYmxlQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgQmFzZVRhYmxlQW5ub3RhdGlvbgoreworCVN0cmluZyBuYW1lOworCVN0cmluZyBzY2hlbWE7CisJU3RyaW5nIGNhdGFsb2c7CisJZmluYWwgVmVjdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50czsKKworCisJQmluYXJ5QmFzZVRhYmxlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZSgpOworCQl0aGlzLnNjaGVtYSA9IHRoaXMuYnVpbGRTY2hlbWEoKTsKKwkJdGhpcy5jYXRhbG9nID0gdGhpcy5idWlsZENhdGFsb2coKTsKKwkJdGhpcy51bmlxdWVDb25zdHJhaW50cyA9IHRoaXMuYnVpbGRVbmlxdWVDb25zdHJhaW50cygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0TmFtZV8odGhpcy5idWlsZE5hbWUoKSk7CisJCXRoaXMuc2V0U2NoZW1hXyh0aGlzLmJ1aWxkU2NoZW1hKCkpOworCQl0aGlzLnNldENhdGFsb2dfKHRoaXMuYnVpbGRDYXRhbG9nKCkpOworCQl0aGlzLnVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQmFzZVRhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8vICoqKioqIG5hbWUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLm5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldE5hbWVFbGVtZW50TmFtZSgpKTsKKwl9CisKKwlhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCk7CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogc2NoZW1hCisJcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLnNjaGVtYTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0U2NoZW1hXyhTdHJpbmcgc2NoZW1hKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNjaGVtYTsKKwkJdGhpcy5zY2hlbWEgPSBzY2hlbWE7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFNjaGVtYSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRTY2hlbWFFbGVtZW50TmFtZSgpKTsKKwl9CisKKwlhYnN0cmFjdCBTdHJpbmcgZ2V0U2NoZW1hRWxlbWVudE5hbWUoKTsKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBib29sZWFuIHNjaGVtYVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogY2F0YWxvZworCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKKwkJcmV0dXJuIHRoaXMuY2F0YWxvZzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRDYXRhbG9nXyhTdHJpbmcgY2F0YWxvZykgeworCQlTdHJpbmcgb2xkID0gdGhpcy5jYXRhbG9nOworCQl0aGlzLmNhdGFsb2cgPSBjYXRhbG9nOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZENhdGFsb2coKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0Q2F0YWxvZ0VsZW1lbnROYW1lKCkpOworCX0KKworCWFic3RyYWN0IFN0cmluZyBnZXRDYXRhbG9nRWxlbWVudE5hbWUoKTsKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjYXRhbG9nVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKiB1bmlxdWUgY29uc3RyYWludHMKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4odGhpcy51bmlxdWVDb25zdHJhaW50cyk7CisJfQorCisJcHVibGljIGludCB1bmlxdWVDb25zdHJhaW50c1NpemUoKSB7CisJCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEF0KGludCBpbmRleCkgeworCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50cy5nZXQoaW5kZXgpOworCX0KKworCXB1YmxpYyBpbnQgaW5kZXhPZlVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCkgeworCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50cy5pbmRleE9mKHVuaXF1ZUNvbnN0cmFpbnQpOworCX0KKworCXB1YmxpYyBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIFZlY3RvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gYnVpbGRVbmlxdWVDb25zdHJhaW50cygpIHsKKwkJT2JqZWN0W10gamR0VW5pcXVlQ29uc3RyYWludHMgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyh0aGlzLmdldFVuaXF1ZUNvbnN0cmFpbnRFbGVtZW50TmFtZSgpKTsKKwkJVmVjdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPihqZHRVbmlxdWVDb25zdHJhaW50cy5sZW5ndGgpOworCQlmb3IgKE9iamVjdCBqZHRVbmlxdWVDb25zdHJhaW50IDogamR0VW5pcXVlQ29uc3RyYWludHMpIHsKKwkJCXJlc3VsdC5hZGQobmV3IEJpbmFyeVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKHRoaXMsIChJQW5ub3RhdGlvbikgamR0VW5pcXVlQ29uc3RyYWludCkpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJYWJzdHJhY3QgU3RyaW5nIGdldFVuaXF1ZUNvbnN0cmFpbnRFbGVtZW50TmFtZSgpOworCisJLy8gVE9ETworCXByaXZhdGUgdm9pZCB1cGRhdGVVbmlxdWVDb25zdHJhaW50cygpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QmFzaWNBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QmFzaWNBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiMjUzMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNpY0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuQmFzaWMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUJhc2ljQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgQmFzaWNBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBCb29sZWFuIG9wdGlvbmFsOworCXByaXZhdGUgRmV0Y2hUeXBlIGZldGNoOworCisKKwlwdWJsaWMgQmluYXJ5QmFzaWNBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMub3B0aW9uYWwgPSB0aGlzLmJ1aWxkT3B0aW9uYWwoKTsKKwkJdGhpcy5mZXRjaCA9IHRoaXMuYnVpbGRGZXRjaCgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRPcHRpb25hbF8odGhpcy5idWlsZE9wdGlvbmFsKCkpOworCQl0aGlzLnNldEZldGNoXyh0aGlzLmJ1aWxkRmV0Y2goKSk7CisJfQorCisKKwkvLyoqKioqKioqKioqKioqKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCisKKwkvLyAqKioqKiBvcHRpb25hbAorCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgeworCQlyZXR1cm4gdGhpcy5vcHRpb25hbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRPcHRpb25hbF8oQm9vbGVhbiBvcHRpb25hbCkgeworCQlCb29sZWFuIG9sZCA9IHRoaXMub3B0aW9uYWw7CisJCXRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9QVElPTkFMX1BST1BFUlRZLCBvbGQsIG9wdGlvbmFsKTsKKwl9CisKKwlwcml2YXRlIEJvb2xlYW4gYnVpbGRPcHRpb25hbCgpIHsKKwkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5CQVNJQ19fT1BUSU9OQUwpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T3B0aW9uYWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogZmV0Y2gKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgeworCQlyZXR1cm4gdGhpcy5mZXRjaDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEZldGNoXyhGZXRjaFR5cGUgZmV0Y2gpIHsKKwkJRmV0Y2hUeXBlIG9sZCA9IHRoaXMuZmV0Y2g7CisJCXRoaXMuZmV0Y2ggPSBmZXRjaDsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKKwl9CisKKwlwcml2YXRlIEZldGNoVHlwZSBidWlsZEZldGNoKCkgeworCQlyZXR1cm4gRmV0Y2hUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLkJBU0lDX19GRVRDSCkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Q2xhc3NGaWxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Q2xhc3NGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3ZWRhMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlDbGFzc0ZpbGUuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNsYXNzRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworCisvKioKKyAqIGJpbmFyeSBjbGFzcyBmaWxlCisgKi8KK2ZpbmFsIGNsYXNzIEJpbmFyeUNsYXNzRmlsZQorCWV4dGVuZHMgQmluYXJ5Tm9kZQorCWltcGxlbWVudHMgSmF2YVJlc291cmNlQ2xhc3NGaWxlCit7CisJLyoqIEpEVCBjbGFzcyBmaWxlICovCisJcHJpdmF0ZSBmaW5hbCBJQ2xhc3NGaWxlIGNsYXNzRmlsZTsKKworCS8qKiBjbGFzcyBmaWxlJ3MgcGVyc2lzdGVudCB0eXBlICovCisJcHJpdmF0ZSBmaW5hbCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJLyoqCisJICogVGhlIEpEVCB0eXBlIGdldHMgcGFzc2VkIGluIGJlY2F1c2UgdGhlIHBhY2thZ2UgZnJhZ21lbnQgaW5zcGVjdHMgaXQKKwkgKiBiZWZvcmVoYW5kIHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGlzICJwZXJzaXN0YWJsZSIuIChXZSBvbmx5IGJ1aWxkCisJICogY2xhc3MgZmlsZXMgZm9yICJwZXJzaXN0YWJsZSIgdHlwZXMuKQorCSAqLworCUJpbmFyeUNsYXNzRmlsZShKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQgcGFyZW50LCBJQ2xhc3NGaWxlIGNsYXNzRmlsZSwgSVR5cGUgamR0VHlwZSkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmNsYXNzRmlsZSA9IGNsYXNzRmlsZTsKKwkJdGhpcy5wZXJzaXN0ZW50VHlwZSA9IHRoaXMuYnVpbGRQZXJzaXN0ZW50VHlwZShqZHRUeXBlKTsKKwl9CisKKwlwcml2YXRlIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGJ1aWxkUGVyc2lzdGVudFR5cGUoSVR5cGUgamR0VHlwZSkgeworCQlyZXR1cm4gbmV3IEJpbmFyeVBlcnNpc3RlbnRUeXBlKHRoaXMsIGpkdFR5cGUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMuY2xhc3NGaWxlLmdldEVsZW1lbnROYW1lKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VDbGFzc0ZpbGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW50VHlwZTsKKwl9CisKKwkvLyBUT0RPCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKy8vCQl0aGlzLnBlcnNpc3RlbnRUeXBlLnVwZGF0ZSh0aGlzLmNsYXNzRmlsZS5nZXRUeXBlKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlDb2x1bW5Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5MDgxNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlDb2x1bW5Bbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlDb2x1bW5Bbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlCYXNlQ29sdW1uQW5ub3RhdGlvbgorCWltcGxlbWVudHMgQ29sdW1uQW5ub3RhdGlvbgoreworCXByaXZhdGUgSW50ZWdlciBsZW5ndGg7CisJcHJpdmF0ZSBJbnRlZ2VyIHByZWNpc2lvbjsKKwlwcml2YXRlIEludGVnZXIgc2NhbGU7CisKKworCXB1YmxpYyBCaW5hcnlDb2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMubGVuZ3RoID0gdGhpcy5idWlsZExlbmd0aCgpOworCQl0aGlzLnByZWNpc2lvbiA9IHRoaXMuYnVpbGRQcmVjaXNpb24oKTsKKwkJdGhpcy5zY2FsZSA9IHRoaXMuYnVpbGRTY2FsZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRMZW5ndGhfKHRoaXMuYnVpbGRMZW5ndGgoKSk7CisJCXRoaXMuc2V0UHJlY2lzaW9uXyh0aGlzLmJ1aWxkUHJlY2lzaW9uKCkpOworCQl0aGlzLnNldFNjYWxlXyh0aGlzLmJ1aWxkU2NhbGUoKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEphdmFTb3VyY2VOYW1lZENvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5DT0xVTU5fX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb25FbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOworCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhU291cmNlQmFzZUNvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldFRhYmxlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuQ09MVU1OX19UQUJMRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0VW5pcXVlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuQ09MVU1OX19VTklRVUU7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldE51bGxhYmxlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuQ09MVU1OX19OVUxMQUJMRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0SW5zZXJ0YWJsZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLkNPTFVNTl9fSU5TRVJUQUJMRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0VXBkYXRhYmxlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuQ09MVU1OX19VUERBVEFCTEU7CisJfQorCisKKwkgLy8gKioqKioqKioqKiBDb2x1bW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogbGVuZ3RoCisJcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgeworCQlyZXR1cm4gdGhpcy5sZW5ndGg7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGVuZ3RoKEludGVnZXIgbGVuZ3RoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRMZW5ndGhfKEludGVnZXIgbGVuZ3RoKSB7CisJCUludGVnZXIgb2xkID0gdGhpcy5sZW5ndGg7CisJCXRoaXMubGVuZ3RoID0gbGVuZ3RoOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTEVOR1RIX1BST1BFUlRZLCBvbGQsIGxlbmd0aCk7CisJfQorCisJcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkTGVuZ3RoKCkgeworCQlyZXR1cm4gKEludGVnZXIpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLkNPTFVNTl9fTEVOR1RIKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldExlbmd0aFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKiBwcmVjaXNpb24KKwlwdWJsaWMgSW50ZWdlciBnZXRQcmVjaXNpb24oKSB7CisJCXJldHVybiB0aGlzLnByZWNpc2lvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcmVjaXNpb24oSW50ZWdlciBwcmVjaXNpb24pIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFByZWNpc2lvbl8oSW50ZWdlciBwcmVjaXNpb24pIHsKKwkJSW50ZWdlciBvbGQgPSB0aGlzLnByZWNpc2lvbjsKKwkJdGhpcy5wcmVjaXNpb24gPSBwcmVjaXNpb247CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUkVDSVNJT05fUFJPUEVSVFksIG9sZCwgcHJlY2lzaW9uKTsKKwl9CisKKwlwcml2YXRlIEludGVnZXIgYnVpbGRQcmVjaXNpb24oKSB7CisJCXJldHVybiAoSW50ZWdlcikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuQ09MVU1OX19QUkVDSVNJT04pOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJlY2lzaW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIHNjYWxlCisJcHVibGljIEludGVnZXIgZ2V0U2NhbGUoKSB7CisJCXJldHVybiB0aGlzLnNjYWxlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNjYWxlKEludGVnZXIgc2NhbGUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFNjYWxlXyhJbnRlZ2VyIHNjYWxlKSB7CisJCUludGVnZXIgb2xkID0gdGhpcy5zY2FsZTsKKwkJdGhpcy5zY2FsZSA9IHNjYWxlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0NBTEVfUFJPUEVSVFksIG9sZCwgc2NhbGUpOworCX0KKworCXByaXZhdGUgSW50ZWdlciBidWlsZFNjYWxlKCkgeworCQlyZXR1cm4gKEludGVnZXIpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLkNPTFVNTl9fU0NBTEUpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NhbGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Q29udGFpbmVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUNvbnRhaW5lckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzFiOWI1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUNvbnRhaW5lckFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbnRhaW5lckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworCisvKioKKyAqIEpBUiBhbm5vdGF0aW9ucyBkbyBub3Qgc3VwcG9ydCBtb3N0IG9mIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbiBwcm90b2NvbC4KKyAqLworYWJzdHJhY3QgY2xhc3MgQmluYXJ5Q29udGFpbmVyQW5ub3RhdGlvbjxUIGV4dGVuZHMgTmVzdGFibGVBbm5vdGF0aW9uPgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgQ29udGFpbmVyQW5ub3RhdGlvbjxUPgoreworCisJcHVibGljIEJpbmFyeUNvbnRhaW5lckFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBnZXRDb250YWluZXJKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIFQgYWRkTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uQWRkZWQoaW50IGluZGV4LCBUIG5lc3RlZEFubm90YXRpb24pIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIFQgbW92ZU5lc3RlZEFubm90YXRpb25JbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uTW92ZWQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIFQgcmVtb3ZlTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uUmVtb3ZlZChpbnQgaW5kZXgsIFQgbmVzdGVkQW5ub3RhdGlvbikgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5NTc4ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuRGlzY3JpbWluYXRvckNvbHVtbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeU5hbWVkQ29sdW1uQW5ub3RhdGlvbgorCWltcGxlbWVudHMgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24KK3sKKwlwcml2YXRlIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlOworCXByaXZhdGUgSW50ZWdlciBsZW5ndGg7CisKKworCXB1YmxpYyBCaW5hcnlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5kaXNjcmltaW5hdG9yVHlwZSA9IHRoaXMuYnVpbGREaXNjcmltaW5hdG9yVHlwZSgpOworCQl0aGlzLmxlbmd0aCA9IHRoaXMuYnVpbGRMZW5ndGgoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0RGlzY3JpbWluYXRvclR5cGVfKHRoaXMuYnVpbGREaXNjcmltaW5hdG9yVHlwZSgpKTsKKwkJdGhpcy5zZXRMZW5ndGhfKHRoaXMuYnVpbGRMZW5ndGgoKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEFic3RyYWN0TmFtZWRDb2x1bW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTl9fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKKwl9CisKKworCS8vICoqKioqKioqKiogRGlzY3JpbWluYXRvckNvbHVtbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBkaXNjcmltaW5hdG9yIHR5cGUKKwlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXREaXNjcmltaW5hdG9yVHlwZV8oRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUpIHsKKwkJRGlzY3JpbWluYXRvclR5cGUgb2xkID0gdGhpcy5kaXNjcmltaW5hdG9yVHlwZTsKKwkJdGhpcy5kaXNjcmltaW5hdG9yVHlwZSA9IGRpc2NyaW1pbmF0b3JUeXBlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZLCBvbGQsIGRpc2NyaW1pbmF0b3JUeXBlKTsKKwl9CisKKwlwcml2YXRlIERpc2NyaW1pbmF0b3JUeXBlIGJ1aWxkRGlzY3JpbWluYXRvclR5cGUoKSB7CisJCXJldHVybiBEaXNjcmltaW5hdG9yVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFKSk7CisJfQorCisJLy8gKioqKiogbGVuZ3RoCisJcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoSW50ZWdlciBsZW5ndGgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldExlbmd0aF8oSW50ZWdlciBsZW5ndGgpIHsKKwkJSW50ZWdlciBvbGQgPSB0aGlzLmxlbmd0aDsKKwkJdGhpcy5sZW5ndGggPSBsZW5ndGg7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMRU5HVEhfUFJPUEVSVFksIG9sZCwgbGVuZ3RoKTsKKwl9CisKKwlwcml2YXRlIEludGVnZXIgYnVpbGRMZW5ndGgoKSB7CisJCXJldHVybiAoSW50ZWdlcikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0xFTkdUSCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeURpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODNmOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeURpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JWYWx1ZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbgoreworCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisKKwlwdWJsaWMgQmluYXJ5RGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogdmFsdWUKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRV9fVkFMVUUpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW1iZWRkYWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbWJlZGRhYmxlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZGIwOWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW1iZWRkYWJsZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGFibGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVtYmVkZGFibGVBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBFbWJlZGRhYmxlQW5ub3RhdGlvbgoreworCisJcHVibGljIEJpbmFyeUVtYmVkZGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW1iZWRkZWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW1iZWRkZWRBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkMTQzNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbWJlZGRlZEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGVkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFbWJlZGRlZEFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVtYmVkZGVkQW5ub3RhdGlvbgoreworCisJcHVibGljIEJpbmFyeUVtYmVkZGVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW1iZWRkZWRJZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbWJlZGRlZElkQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNGY1YmUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW1iZWRkZWRJZEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkZWRJZAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RW1iZWRkZWRJZEFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVtYmVkZGVkSWRBbm5vdGF0aW9uCit7CisKKwlwdWJsaWMgQmluYXJ5RW1iZWRkZWRJZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVudGl0eUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbnRpdHlBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0YWNiNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbnRpdHlBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuRW50aXR5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFbnRpdHlBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBFbnRpdHlBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworCisJcHVibGljIEJpbmFyeUVudGl0eUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldE5hbWVfKHRoaXMuYnVpbGROYW1lKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEVudGl0eUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5FTlRJVFlfX05BTUUpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbnVtZXJhdGVkQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVudW1lcmF0ZWRBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2M2ZiNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbnVtZXJhdGVkQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuRW51bWVyYXRlZAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RW51bWVyYXRlZEFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVudW1lcmF0ZWRBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBFbnVtVHlwZSB2YWx1ZTsKKwkKKworCXB1YmxpYyBCaW5hcnlFbnVtZXJhdGVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEVudW1lcmF0ZWRBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHZhbHVlCisJcHVibGljIEVudW1UeXBlIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0VmFsdWUoRW51bVR5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oRW51bVR5cGUgdmFsdWUpIHsKKwkJRW51bVR5cGUgb2xkID0gdGhpcy52YWx1ZTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOworCX0KKwkKKwlwcml2YXRlIEVudW1UeXBlIGJ1aWxkVmFsdWUoKSB7CisJCXJldHVybiBFbnVtVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5FTlVNRVJBVEVEX19WQUxVRSkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YjI2MzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5R2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbgoreworCXByaXZhdGUgR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3k7CisJcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdG9yOworCisKKwlwdWJsaWMgQmluYXJ5R2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMuc3RyYXRlZ3kgPSB0aGlzLmJ1aWxkU3RyYXRlZ3koKTsKKwkJdGhpcy5nZW5lcmF0b3IgPSB0aGlzLmJ1aWxkR2VuZXJhdG9yKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFN0cmF0ZWd5Xyh0aGlzLmJ1aWxkU3RyYXRlZ3koKSk7CisJCXRoaXMuc2V0R2VuZXJhdG9yXyh0aGlzLmJ1aWxkR2VuZXJhdG9yKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogc3RyYXRlZ3kKKwlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0U3RyYXRlZ3koKSB7CisJCXJldHVybiB0aGlzLnN0cmF0ZWd5OworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHNldFN0cmF0ZWd5XyhHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSkgeworCQlHZW5lcmF0aW9uVHlwZSBvbGQgPSB0aGlzLnN0cmF0ZWd5OworCQl0aGlzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTVFJBVEVHWV9QUk9QRVJUWSwgb2xkLCBzdHJhdGVneSk7CisJfQorCQorCXByaXZhdGUgR2VuZXJhdGlvblR5cGUgYnVpbGRTdHJhdGVneSgpIHsKKwkJcmV0dXJuIEdlbmVyYXRpb25UeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLkdFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1kpKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRTdHJhdGVneVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJLy8gKioqKiogZ2VuZXJhdG9yCisJcHVibGljIFN0cmluZyBnZXRHZW5lcmF0b3IoKSB7CisJCXJldHVybiB0aGlzLmdlbmVyYXRvcjsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0R2VuZXJhdG9yKFN0cmluZyBnZW5lcmF0b3IpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEdlbmVyYXRvcl8oU3RyaW5nIGdlbmVyYXRvcikgeworCQlTdHJpbmcgb2xkID0gdGhpcy5nZW5lcmF0b3I7CisJCXRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoR0VORVJBVE9SX1BST1BFUlRZLCBvbGQsIGdlbmVyYXRvcik7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRHZW5lcmF0b3IoKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5HRU5FUkFURURfVkFMVUVfX0dFTkVSQVRPUik7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBib29sZWFuIGdlbmVyYXRvclRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5R2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUdlbmVyYXRvckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODljZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUdlbmVyYXRvckFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0b3JBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5TZXF1ZW5jZUdlbmVyYXRvcgorICogamF2YXgucGVyc2lzdGVuY2UuVGFibGVHZW5lcmF0b3IKKyAqLworYWJzdHJhY3QgY2xhc3MgQmluYXJ5R2VuZXJhdG9yQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgR2VuZXJhdG9yQW5ub3RhdGlvbgoreworCVN0cmluZyBuYW1lOworCUludGVnZXIgaW5pdGlhbFZhbHVlOworCUludGVnZXIgYWxsb2NhdGlvblNpemU7CisKKworCUJpbmFyeUdlbmVyYXRvckFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKKwkJdGhpcy5pbml0aWFsVmFsdWUgPSB0aGlzLmJ1aWxkSW5pdGlhbFZhbHVlKCk7CisJCXRoaXMuYWxsb2NhdGlvblNpemUgPSB0aGlzLmJ1aWxkQWxsb2NhdGlvblNpemUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldE5hbWVfKHRoaXMuYnVpbGROYW1lKCkpOworCQl0aGlzLnNldEluaXRpYWxWYWx1ZV8odGhpcy5idWlsZEluaXRpYWxWYWx1ZSgpKTsKKwkJdGhpcy5zZXRBbGxvY2F0aW9uU2l6ZV8odGhpcy5idWlsZEFsbG9jYXRpb25TaXplKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEdlbmVyYXRvckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0TmFtZUVsZW1lbnROYW1lKCkpOworCX0KKworCWFic3RyYWN0IFN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKTsKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKiBpbml0aWFsIHZhbHVlCisJcHVibGljIEludGVnZXIgZ2V0SW5pdGlhbFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5pbml0aWFsVmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW5pdGlhbFZhbHVlKEludGVnZXIgaW5pdGlhbFZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRJbml0aWFsVmFsdWVfKEludGVnZXIgaW5pdGlhbFZhbHVlKSB7CisJCUludGVnZXIgb2xkID0gdGhpcy5pbml0aWFsVmFsdWU7CisJCXRoaXMuaW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSU5JVElBTF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBpbml0aWFsVmFsdWUpOworCX0KKworCXByaXZhdGUgSW50ZWdlciBidWlsZEluaXRpYWxWYWx1ZSgpIHsKKwkJcmV0dXJuIChJbnRlZ2VyKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0SW5pdGlhbFZhbHVlRWxlbWVudE5hbWUoKSk7CisJfQorCisJYWJzdHJhY3QgU3RyaW5nIGdldEluaXRpYWxWYWx1ZUVsZW1lbnROYW1lKCk7CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEluaXRpYWxWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKiBuYW1lCisJcHVibGljIEludGVnZXIgZ2V0QWxsb2NhdGlvblNpemUoKSB7CisJCXJldHVybiB0aGlzLmFsbG9jYXRpb25TaXplOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFsbG9jYXRpb25TaXplKEludGVnZXIgYWxsb2NhdGlvblNpemUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEFsbG9jYXRpb25TaXplXyhJbnRlZ2VyIGFsbG9jYXRpb25TaXplKSB7CisJCUludGVnZXIgb2xkID0gdGhpcy5hbGxvY2F0aW9uU2l6ZTsKKwkJdGhpcy5hbGxvY2F0aW9uU2l6ZSA9IGFsbG9jYXRpb25TaXplOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBhbGxvY2F0aW9uU2l6ZSk7CisJfQorCisJcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkQWxsb2NhdGlvblNpemUoKSB7CisJCXJldHVybiAoSW50ZWdlcikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldEFsbG9jYXRpb25TaXplRWxlbWVudE5hbWUoKSk7CisJfQorCisJYWJzdHJhY3QgU3RyaW5nIGdldEFsbG9jYXRpb25TaXplRWxlbWVudE5hbWUoKTsKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QWxsb2NhdGlvblNpemVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5SWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5SWRBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5NDZiNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlJZEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLklkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlJZEFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIElkQW5ub3RhdGlvbgoreworCisJcHVibGljIEJpbmFyeUlkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5SWRDbGFzc0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlJZENsYXNzQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZmYzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5SWRDbGFzc0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQ2xhc3NBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5JZENsYXNzCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlJZENsYXNzQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgSWRDbGFzc0Fubm90YXRpb24gCit7CisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKworCXB1YmxpYyBCaW5hcnlJZENsYXNzQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIElkQ2xhc3NBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHZhbHVlCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLklEX0NMQVNTX19WQUxVRSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZQorCS8qKgorCSAqIGJpbmFyeSBpcyBhbHJlYWR5IGZ1bGx5LXF1YWxpZmllZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUluaGVyaXRhbmNlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUluaGVyaXRhbmNlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzExNjQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5SW5oZXJpdGFuY2VBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Jbmhlcml0YW5jZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5SW5oZXJpdGFuY2VBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBJbmhlcml0YW5jZUFubm90YXRpb24KK3sKKwlwcml2YXRlIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneTsKKworCisJcHVibGljIEJpbmFyeUluaGVyaXRhbmNlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5zdHJhdGVneSA9IHRoaXMuYnVpbGRTdHJhdGVneSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRTdHJhdGVneV8odGhpcy5idWlsZFN0cmF0ZWd5KCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBJbmhlcml0YW5jZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogc3RyYXRlZ3kKKwlwdWJsaWMgSW5oZXJpdGFuY2VUeXBlIGdldFN0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5zdHJhdGVneTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3kpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFN0cmF0ZWd5XyhJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3kpIHsKKwkJSW5oZXJpdGFuY2VUeXBlIG9sZCA9IHRoaXMuc3RyYXRlZ3k7CisJCXRoaXMuc3RyYXRlZ3kgPSBzdHJhdGVneTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNUUkFURUdZX1BST1BFUlRZLCBvbGQsIHN0cmF0ZWd5KTsKKwl9CisKKwlwcml2YXRlIEluaGVyaXRhbmNlVHlwZSBidWlsZFN0cmF0ZWd5KCkgeworCQlyZXR1cm4gSW5oZXJpdGFuY2VUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLklOSEVSSVRBTkNFX19TVFJBVEVHWSkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U3RyYXRlZ3lUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMTVmY2UKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlKb2luQ29sdW1uQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QmFzZUNvbHVtbkFubm90YXRpb24KKwlpbXBsZW1lbnRzIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24KK3sKKwlwcml2YXRlIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZTsKKworCisJcHVibGljIEJpbmFyeUpvaW5Db2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLmJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWVfKHRoaXMuYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogSmF2YVNvdXJjZU5hbWVkQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OX19OQU1FOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuSk9JTl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOworCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhU291cmNlTmFtZWRDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRUYWJsZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OX19UQUJMRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0VW5pcXVlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuSk9JTl9DT0xVTU5fX1VOSVFVRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0TnVsbGFibGVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fTlVMTEFCTEU7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldEluc2VydGFibGVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fSU5TRVJUQUJMRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0VXBkYXRhYmxlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuSk9JTl9DT0xVTU5fX1VQREFUQUJMRTsKKwl9CisKKworCS8vKioqKioqKioqKioqIEpvaW5Db2x1bW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqCisKKwkvLyByZWZlcmVuY2VkIGNvbHVtbiBuYW1lCisJcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZV8oU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lOworCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lID0gcmVmZXJlbmNlZENvbHVtbk5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NmRkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5zQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW5zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlKb2luQ29sdW1uc0Fubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUNvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbj4KKwlpbXBsZW1lbnRzIEpvaW5Db2x1bW5zQW5ub3RhdGlvbgoreworCXByaXZhdGUgZmluYWwgVmVjdG9yPE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zOworCisKKwlwdWJsaWMgQmluYXJ5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMuam9pbkNvbHVtbnMgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbnMoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbj4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5qb2luQ29sdW1ucyk7CisJfQorCisJcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisKKwlwcml2YXRlIFZlY3RvcjxOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBidWlsZEpvaW5Db2x1bW5zKCkgeworCQlPYmplY3RbXSBqZHRKb2luQ29sdW1ucyA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKEpQQS5KT0lOX0NPTFVNTlNfX1ZBTFVFKTsKKwkJVmVjdG9yPE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24+IHJlc3VsdCA9IG5ldyBWZWN0b3I8TmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbj4oamR0Sm9pbkNvbHVtbnMubGVuZ3RoKTsKKwkJZm9yIChPYmplY3QgamR0Sm9pbkNvbHVtbiA6IGpkdEpvaW5Db2x1bW5zKSB7CisJCQlyZXN1bHQuYWRkKG5ldyBCaW5hcnlKb2luQ29sdW1uQW5ub3RhdGlvbih0aGlzLCAoSUFubm90YXRpb24pIGpkdEpvaW5Db2x1bW4pKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMudXBkYXRlSm9pbkNvbHVtbnMoKTsKKwl9CisKKwkvLyBUT0RPCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUpvaW5Db2x1bW5zKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlKb2luVGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Sm9pblRhYmxlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNWI4NGIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Sm9pblRhYmxlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luVGFibGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUpvaW5UYWJsZUFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUJhc2VUYWJsZUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEpvaW5UYWJsZUFubm90YXRpb24KK3sKKwlwcml2YXRlIGZpbmFsIFZlY3RvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnM7CisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1uczsKKworCisJcHVibGljIEJpbmFyeUpvaW5UYWJsZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5qb2luQ29sdW1ucyA9IHRoaXMuYnVpbGRKb2luQ29sdW1ucygpOworCQl0aGlzLmludmVyc2VKb2luQ29sdW1ucyA9IHRoaXMuYnVpbGRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMudXBkYXRlSm9pbkNvbHVtbnMoKTsKKwkJdGhpcy51cGRhdGVJbnZlcnNlSm9pbkNvbHVtbnMoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQWJzdHJhY3RCYXNlVGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuSk9JTl9UQUJMRV9fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0U2NoZW1hRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuSk9JTl9UQUJMRV9fU0NIRU1BOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRDYXRhbG9nRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuSk9JTl9UQUJMRV9fQ0FUQUxPRzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0VW5pcXVlQ29uc3RyYWludEVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLkpPSU5fVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKKwl9CisKKworCS8vICoqKioqKioqKiogSm9pblRhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBqb2luIGNvbHVtbnMKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5qb2luQ29sdW1ucyk7CisJfQorCisJcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbkF0KGludCBpbmRleCkgeworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5nZXQoaW5kZXgpOworCX0KKworCXB1YmxpYyBpbnQgaW5kZXhPZkpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgeworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5pbmRleE9mKGpvaW5Db2x1bW4pOworCX0KKworCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRKb2luQ29sdW1uKGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1uKGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIFZlY3RvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gYnVpbGRKb2luQ29sdW1ucygpIHsKKwkJT2JqZWN0W10gamR0Sm9pbkNvbHVtbnMgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyhKUEEuSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TKTsKKwkJVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPihqZHRKb2luQ29sdW1ucy5sZW5ndGgpOworCQlmb3IgKE9iamVjdCBqZHRKb2luQ29sdW1uIDogamR0Sm9pbkNvbHVtbnMpIHsKKwkJCXJlc3VsdC5hZGQobmV3IEJpbmFyeUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMsIChJQW5ub3RhdGlvbikgamR0Sm9pbkNvbHVtbikpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLy8gVE9ETworCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luQ29sdW1ucygpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGluaXRpYWxpemVKb2luQ29sdW1ucygpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogaW52ZXJzZSBqb2luIGNvbHVtbnMKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+KHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zKTsKKwl9CisKKwlwdWJsaWMgaW50IGludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiB0aGlzLmludmVyc2VKb2luQ29sdW1ucy5zaXplKCk7CisJfQorCisJcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGludmVyc2VKb2luQ29sdW1uQXQoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLmludmVyc2VKb2luQ29sdW1ucy5nZXQoaW5kZXgpOworCX0KKworCXB1YmxpYyBpbnQgaW5kZXhPZkludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pIHsKKwkJcmV0dXJuIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLmluZGV4T2Yoam9pbkNvbHVtbik7CisJfQorCisJcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBidWlsZEludmVyc2VKb2luQ29sdW1ucygpIHsKKwkJT2JqZWN0W10gamR0Sm9pbkNvbHVtbnMgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyhKUEEuSk9JTl9UQUJMRV9fSU5WRVJTRV9KT0lOX0NPTFVNTlMpOworCQlWZWN0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IHJlc3VsdCA9IG5ldyBWZWN0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+KGpkdEpvaW5Db2x1bW5zLmxlbmd0aCk7CisJCWZvciAoT2JqZWN0IGpkdEpvaW5Db2x1bW4gOiBqZHRKb2luQ29sdW1ucykgeworCQkJcmVzdWx0LmFkZChuZXcgQmluYXJ5Sm9pbkNvbHVtbkFubm90YXRpb24odGhpcywgKElBbm5vdGF0aW9uKSBqZHRKb2luQ29sdW1uKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvLyBUT0RPCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUludmVyc2VKb2luQ29sdW1ucygpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGluaXRpYWxpemVJbnZlcnNlSm9pbkNvbHVtbnMoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUxvYkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlMb2JBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ1ZGMyNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlMb2JBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTG9iCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlMb2JBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBMb2JBbm5vdGF0aW9uCit7CisJcHVibGljIEJpbmFyeUxvYkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hbnlUb01hbnlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFueVRvTWFueUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDI4ZmNlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hbnlUb01hbnlBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTWFueVRvTWFueQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5TWFueVRvTWFueUFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBNYW55VG9NYW55QW5ub3RhdGlvbgoreworCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OworCisKKwlwdWJsaWMgQmluYXJ5TWFueVRvTWFueUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5tYXBwZWRCeSA9IHRoaXMuYnVpbGRNYXBwZWRCeSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRNYXBwZWRCeV8odGhpcy5idWlsZE1hcHBlZEJ5KCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBCaW5hcnlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5RWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuTUFOWV9UT19NQU5ZX19UQVJHRVRfRU5USVRZOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRGZXRjaEVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLk1BTllfVE9fTUFOWV9fRkVUQ0g7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldENhc2NhZGVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5NQU5ZX1RPX01BTllfX0NBU0NBREU7CisJfQorCisKKwkvLyoqKioqKioqKioqKioqKiogT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCisKKwkvLyAqKioqKiBtYXBwZWQgYnkKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgeworCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbWFwcGVkQnkpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldE1hcHBlZEJ5XyhTdHJpbmcgbWFwcGVkQnkpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMubWFwcGVkQnk7CisJCXRoaXMubWFwcGVkQnkgPSBtYXBwZWRCeTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkLCBtYXBwZWRCeSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRNYXBwZWRCeSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLk1BTllfVE9fTUFOWV9fTUFQUEVEX0JZKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNYW55VG9PbmVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFueVRvT25lQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YWQ3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFueVRvT25lQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlNYW55VG9PbmVBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgorCWltcGxlbWVudHMgTWFueVRvT25lQW5ub3RhdGlvbgoreworCXByaXZhdGUgQm9vbGVhbiBvcHRpb25hbDsKKworCisJcHVibGljIEJpbmFyeU1hbnlUb09uZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5vcHRpb25hbCA9IHRoaXMuYnVpbGRPcHRpb25hbCgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRPcHRpb25hbF8odGhpcy5idWlsZE9wdGlvbmFsKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBCaW5hcnlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5RWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuTUFOWV9UT19PTkVfX1RBUkdFVF9FTlRJVFk7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldEZldGNoRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuTUFOWV9UT19PTkVfX0ZFVENIOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRDYXNjYWRlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuTUFOWV9UT19PTkVfX0NBU0NBREU7CisJfQorCisKKwkvLyAqKioqKioqKioqIE1hbnlUb09uZU1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIG9wdGlvbmFsCisJcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7CisJCXJldHVybiB0aGlzLm9wdGlvbmFsOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldE9wdGlvbmFsXyhCb29sZWFuIG9wdGlvbmFsKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy5vcHRpb25hbDsKKwkJdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1BUSU9OQUxfUFJPUEVSVFksIG9sZCwgb3B0aW9uYWwpOworCX0KKworCXByaXZhdGUgQm9vbGVhbiBidWlsZE9wdGlvbmFsKCkgeworCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLk1BTllfVE9fT05FX19PUFRJT05BTCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNYXBLZXlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFwS2V5QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYjA5ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFwS2V5QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTWFwS2V5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlNYXBLZXlBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBNYXBLZXlBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworCisJcHVibGljIEJpbmFyeU1hcEtleUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0TmFtZV8odGhpcy5idWlsZE5hbWUoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKKwl9CisKKworCS8vICoqKioqKioqKiogTWFwS2V5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBuYW1lCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldE5hbWVfKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLk1BUF9LRVlfX05BTUUpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5YmZhYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb247CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24KK3sKKwlwdWJsaWMgQmluYXJ5TWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZENvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZENvbHVtbkFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjkxNjhlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU5hbWVkQ29sdW1uQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZENvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yQ29sdW1uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbi4KKyAqLworYWJzdHJhY3QgY2xhc3MgQmluYXJ5TmFtZWRDb2x1bW5Bbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBOYW1lZENvbHVtbkFubm90YXRpb24KK3sKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCXByaXZhdGUgU3RyaW5nIGNvbHVtbkRlZmluaXRpb247CisKKworCUJpbmFyeU5hbWVkQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZSgpOworCQl0aGlzLmNvbHVtbkRlZmluaXRpb24gPSB0aGlzLmJ1aWxkQ29sdW1uRGVmaW5pdGlvbigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0TmFtZV8odGhpcy5idWlsZE5hbWUoKSk7CisJCXRoaXMuc2V0Q29sdW1uRGVmaW5pdGlvbl8odGhpcy5idWlsZENvbHVtbkRlZmluaXRpb24oKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKKwl9CisKKworCS8vICoqKioqKioqKiogTmFtZWRDb2x1bW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8vICoqKioqIG5hbWUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLm5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldE5hbWVFbGVtZW50TmFtZSgpKTsKKwl9CisKKwlhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCk7CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogY29sdW1uIGRlZmluaXRpb24KKwlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIGNvbHVtbkRlZmluaXRpb24pIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldENvbHVtbkRlZmluaXRpb25fKFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmNvbHVtbkRlZmluaXRpb247CisJCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IGNvbHVtbkRlZmluaXRpb247CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSwgb2xkLCBjb2x1bW5EZWZpbml0aW9uKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZENvbHVtbkRlZmluaXRpb24oKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0Q29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkpOworCX0KKworCWFic3RyYWN0IFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uRWxlbWVudE5hbWUoKTsKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29sdW1uRGVmaW5pdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGViYzUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTmFtZWROYXRpdmVRdWVyaWVzCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24+CisJaW1wbGVtZW50cyBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8TmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbj4gbmFtZWROYXRpdmVRdWVyaWVzOworCisKKwlwdWJsaWMgQmluYXJ5TmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLm5hbWVkTmF0aXZlUXVlcmllcyA9IHRoaXMuYnVpbGROYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbj4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbj4odGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMpOworCX0KKworCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMuc2l6ZSgpOworCX0KKworCXByaXZhdGUgVmVjdG9yPE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24+IGJ1aWxkTmFtZWROYXRpdmVRdWVyaWVzKCkgeworCQlPYmplY3RbXSBqZHRRdWVyaWVzID0gdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZXMoSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTX19WQUxVRSk7CisJCVZlY3RvcjxOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24+KGpkdFF1ZXJpZXMubGVuZ3RoKTsKKwkJZm9yIChPYmplY3QgamR0UXVlcnkgOiBqZHRRdWVyaWVzKSB7CisJCQlyZXN1bHQuYWRkKG5ldyBCaW5hcnlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbih0aGlzLCAoSUFubm90YXRpb24pIGpkdFF1ZXJ5KSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnVwZGF0ZU5hbWVkTmF0aXZlUXVlcmllcygpOworCX0KKworCS8vIFRPRE8KKwlwcml2YXRlIHZvaWQgdXBkYXRlTmFtZWROYXRpdmVRdWVyaWVzKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5NmNmYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkTmF0aXZlUXVlcnkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlCYXNlTmFtZWRRdWVyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24KK3sKKwlwcml2YXRlIFN0cmluZyByZXN1bHRDbGFzczsKKwlwcml2YXRlIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nOworCisKKwlwdWJsaWMgQmluYXJ5TmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5yZXN1bHRDbGFzcyA9IHRoaXMuYnVpbGRSZXN1bHRDbGFzcygpOworCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSB0aGlzLmJ1aWxkUmVzdWx0U2V0TWFwcGluZygpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRSZXN1bHRDbGFzc18odGhpcy5idWlsZFJlc3VsdENsYXNzKCkpOworCQl0aGlzLnNldFJlc3VsdFNldE1hcHBpbmdfKHRoaXMuYnVpbGRSZXN1bHRTZXRNYXBwaW5nKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBCaW5hcnlCYXNlTmFtZWRRdWVyeUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5OQU1FRF9OQVRJVkVfUVVFUllfX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldFF1ZXJ5RWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuTkFNRURfTkFUSVZFX1FVRVJZX19RVUVSWTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0SGludHNFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5OQU1FRF9OQVRJVkVfUVVFUllfX0hJTlRTOworCX0KKworCisJLy8gKioqKioqKioqKiBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiByZXN1bHQgY2xhc3MKKwlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdENsYXNzKCkgeworCQlyZXR1cm4gdGhpcy5yZXN1bHRDbGFzczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXN1bHRDbGFzcyhTdHJpbmcgcmVzdWx0Q2xhc3MpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFJlc3VsdENsYXNzXyhTdHJpbmcgcmVzdWx0Q2xhc3MpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMucmVzdWx0Q2xhc3M7CisJCXRoaXMucmVzdWx0Q2xhc3MgPSByZXN1bHRDbGFzczsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFU1VMVF9DTEFTU19QUk9QRVJUWSwgb2xkLCByZXN1bHRDbGFzcyk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRSZXN1bHRDbGFzcygpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLk5BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFJlc3VsdENsYXNzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCByZXN1bHQgY2xhc3MgbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzc05hbWUoKSAgeworCQlyZXR1cm4gdGhpcy5yZXN1bHRDbGFzczsKKwl9CisKKwkvLyAqKioqKiByZXN1bHQgc2V0IG1hcHBpbmcKKwlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdFNldE1hcHBpbmcoKSB7CisJCXJldHVybiB0aGlzLnJlc3VsdFNldE1hcHBpbmc7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcgcmVzdWx0U2V0TWFwcGluZykgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZ18oU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMucmVzdWx0U2V0TWFwcGluZzsKKwkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nID0gcmVzdWx0U2V0TWFwcGluZzsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFU1VMVF9TRVRfTUFQUElOR19QUk9QRVJUWSwgb2xkLCByZXN1bHRTZXRNYXBwaW5nKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFJlc3VsdFNldE1hcHBpbmcoKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5OQU1FRF9OQVRJVkVfUVVFUllfX1JFU1VMVF9DTEFTUyk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRSZXN1bHRTZXRNYXBwaW5nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU5hbWVkUXVlcmllc0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3MTU3MAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcmllc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZU5hbWVkUXVlcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJpZXMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeU5hbWVkUXVlcmllc0Fubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUNvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbj4KKwlpbXBsZW1lbnRzIE5hbWVkUXVlcmllc0Fubm90YXRpb24KK3sKKwlwcml2YXRlIGZpbmFsIFZlY3RvcjxOZXN0YWJsZU5hbWVkUXVlcnlBbm5vdGF0aW9uPiBuYW1lZFF1ZXJpZXM7CisKKworCXB1YmxpYyBCaW5hcnlOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMubmFtZWRRdWVyaWVzID0gdGhpcy5idWlsZE5hbWVkUXVlcmllcygpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZU5hbWVkUXVlcnlBbm5vdGF0aW9uPiBuZXN0ZWRBbm5vdGF0aW9ucygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZU5hbWVkUXVlcnlBbm5vdGF0aW9uPih0aGlzLm5hbWVkUXVlcmllcyk7CisJfQorCisJcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7CisJCXJldHVybiB0aGlzLm5hbWVkUXVlcmllcy5zaXplKCk7CisJfQorCisJcHJpdmF0ZSBWZWN0b3I8TmVzdGFibGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbj4gYnVpbGROYW1lZFF1ZXJpZXMoKSB7CisJCU9iamVjdFtdIGpkdFF1ZXJpZXMgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyhKUEEuTkFNRURfUVVFUklFU19fVkFMVUUpOworCQlWZWN0b3I8TmVzdGFibGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbj4gcmVzdWx0ID0gbmV3IFZlY3RvcjxOZXN0YWJsZU5hbWVkUXVlcnlBbm5vdGF0aW9uPihqZHRRdWVyaWVzLmxlbmd0aCk7CisJCWZvciAoT2JqZWN0IGpkdFF1ZXJ5IDogamR0UXVlcmllcykgeworCQkJcmVzdWx0LmFkZChuZXcgQmluYXJ5TmFtZWRRdWVyeUFubm90YXRpb24odGhpcywgKElBbm5vdGF0aW9uKSBqZHRRdWVyeSkpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy51cGRhdGVOYW1lZFF1ZXJpZXMoKTsKKwl9CisKKwkvLyBUT0RPCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZU5hbWVkUXVlcmllcygpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TmFtZWRRdWVyeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YjdiMGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TmFtZWRRdWVyeUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJ5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlOYW1lZFF1ZXJ5QW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBOZXN0YWJsZU5hbWVkUXVlcnlBbm5vdGF0aW9uCit7CisJcHVibGljIEJpbmFyeU5hbWVkUXVlcnlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKworCS8vICoqKioqKioqKiogQmluYXJ5QmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuTkFNRURfUVVFUllfX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldFF1ZXJ5RWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuTkFNRURfUVVFUllfX1FVRVJZOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRIaW50c0VsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLk5BTUVEX1FVRVJZX19ISU5UUzsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Tm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YTE1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Tm9kZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBCaW5hcnkgY29udmVuaWVuY2UgbWV0aG9kcworICovCisvLyBUT0RPIGhvcGVmdWxseSB0aGlzIGNsYXNzIGNhbiBnbyBhd2F5IHdpdGggc29tZSBzb3J0IG9mIHJlZmFjdG9yaW5nIG9mIHRoZQorLy8gc291cmNlIGFuZCBiaW5hcnkgaGllcmFyY2hpZXMuLi4KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCaW5hcnlOb2RlCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUKK3sKKworCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgQmluYXJ5Tm9kZShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgeworCQlyZXR1cm4gbnVsbDsgIC8vIG9ubHkgQmluYXJ5UGFja2FnZUZyYWdtZW50Um9vdCBoYXMgYSBmaWxlLi4uCisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQkvLyBub3RoaW5nIGJ5IGRlZmF1bHQKKwl9CisKKwlwdWJsaWMgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T25lVG9NYW55QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9uZVRvTWFueUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjBlMDFkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9uZVRvTWFueUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvTWFueQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5T25lVG9NYW55QW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KKwlpbXBsZW1lbnRzIE9uZVRvTWFueUFubm90YXRpb24KK3sKKwlwcml2YXRlIFN0cmluZyBtYXBwZWRCeTsKKworCisJcHVibGljIEJpbmFyeU9uZVRvTWFueUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5tYXBwZWRCeSA9IHRoaXMuYnVpbGRNYXBwZWRCeSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRNYXBwZWRCeV8odGhpcy5idWlsZE1hcHBlZEJ5KCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBCaW5hcnlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5RWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuT05FX1RPX01BTllfX1RBUkdFVF9FTlRJVFk7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldEZldGNoRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuT05FX1RPX01BTllfX0ZFVENIOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRDYXNjYWRlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuT05FX1RPX01BTllfX0NBU0NBREU7CisJfQorCisKKwkvLyoqKioqKioqKioqKioqKiogT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCisKKwkvLyAqKioqKiBtYXBwZWQgYnkKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgeworCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbWFwcGVkQnkpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldE1hcHBlZEJ5XyhTdHJpbmcgbWFwcGVkQnkpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMubWFwcGVkQnk7CisJCXRoaXMubWFwcGVkQnkgPSBtYXBwZWRCeTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkLCBtYXBwZWRCeSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRNYXBwZWRCeSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLk9ORV9UT19NQU5ZX19NQVBQRURfQlkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gbWFwcGVkQnlUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNTcxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T25lVG9PbmVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5T25lVG9PbmVBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgorCWltcGxlbWVudHMgT25lVG9PbmVBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBCb29sZWFuIG9wdGlvbmFsOworCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OworCisJcHVibGljIEJpbmFyeU9uZVRvT25lQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLm9wdGlvbmFsID0gdGhpcy5idWlsZE9wdGlvbmFsKCk7CisJCXRoaXMubWFwcGVkQnkgPSB0aGlzLmJ1aWxkTWFwcGVkQnkoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0T3B0aW9uYWxfKHRoaXMuYnVpbGRPcHRpb25hbCgpKTsKKwkJdGhpcy5zZXRNYXBwZWRCeV8odGhpcy5idWlsZE1hcHBlZEJ5KCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBCaW5hcnlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5RWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuT05FX1RPX09ORV9fVEFSR0VUX0VOVElUWTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0RmV0Y2hFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5PTkVfVE9fT05FX19GRVRDSDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0Q2FzY2FkZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLk9ORV9UT19PTkVfX0NBU0NBREU7CisJfQorCisKKwkvLyoqKioqKioqKioqKioqKiogT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCisKKwkvLyAqKioqKiBtYXBwZWQgYnkKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgeworCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbWFwcGVkQnkpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldE1hcHBlZEJ5XyhTdHJpbmcgbWFwcGVkQnkpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMubWFwcGVkQnk7CisJCXRoaXMubWFwcGVkQnkgPSBtYXBwZWRCeTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkLCBtYXBwZWRCeSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRNYXBwZWRCeSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLk9ORV9UT19PTkVfX01BUFBFRF9CWSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBtYXBwZWRCeVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisKKwkvLyoqKioqKioqKioqKioqKiogT25lVG9PbmVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCisKKwkvLyAqKioqKiBvcHRpb25hbAorCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgeworCQlyZXR1cm4gdGhpcy5vcHRpb25hbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRPcHRpb25hbF8oQm9vbGVhbiBvcHRpb25hbCkgeworCQlCb29sZWFuIG9sZCA9IHRoaXMub3B0aW9uYWw7CisJCXRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9QVElPTkFMX1BST1BFUlRZLCBvbGQsIG9wdGlvbmFsKTsKKwl9CisKKwlwcml2YXRlIEJvb2xlYW4gYnVpbGRPcHRpb25hbCgpIHsKKwkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5PTkVfVE9fT05FX19PUFRJT05BTCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlPcmRlckJ5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9yZGVyQnlBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwZmRjMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlPcmRlckJ5QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9yZGVyQnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk9yZGVyQnkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeU9yZGVyQnlBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBPcmRlckJ5QW5ub3RhdGlvbgoreworCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisKKwlwdWJsaWMgQmluYXJ5T3JkZXJCeUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBhbm5vdGF0aW9uKTsKKwkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisKKwkvLyAqKioqKioqKioqIE9yZGVyQnlBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHZhbHVlCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLk9SREVSX0JZX19WQUxVRSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlPdmVycmlkZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlPdmVycmlkZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTEyOWY2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBDb21tb24gYmVoYXZpb3IgZm9yCisgKiAgICAgamF2YXgucGVyc2lzdGVuY2UuQXR0cmlidXRlT3ZlcnJpZGUKKyAqICAgICBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCaW5hcnlPdmVycmlkZUFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIE92ZXJyaWRlQW5ub3RhdGlvbgoreworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKworCXB1YmxpYyBCaW5hcnlPdmVycmlkZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldE5hbWVfKHRoaXMuYnVpbGROYW1lKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCQorCisJLy8gKioqKioqKioqKiBPdmVycmlkZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT3ZlcnJpZGVBbm5vdGF0aW9uLk5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldE5hbWVFbGVtZW50TmFtZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpOworCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVBhY2thZ2VGcmFnbWVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVBhY2thZ2VGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNDQzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UGFja2FnZUZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNsYXNzRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7CisKKy8qKgorICogYmluYXJ5IHBhY2thZ2UgZnJhZ21lbnQKKyAqLworZmluYWwgY2xhc3MgQmluYXJ5UGFja2FnZUZyYWdtZW50CisJZXh0ZW5kcyBCaW5hcnlOb2RlCisJaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQKK3sKKwkvKiogSkRUIHBhY2thZ2UgZnJhZ21lbnQgKi8KKwlwcml2YXRlIGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50OworCisJLyoqCisJICogY2xhc3MgZmlsZXMgaW4gdGhlIHBhY2thZ2UgZnJhZ21lbnQ7CisJICogd2Ugb25seSBob2xkIGNsYXNzIGZpbGVzL3R5cGVzIHRoYXQgYXJlIGFjdHVhbGx5IGFubm90YXRlZDsKKwkgKiBpZiB0aGUgdW5hbm5vdGF0ZWQgdHlwZXMgYXJlIG5lZWRlZCAoZS5nLiBmb3Igb3JtLnhtbCBvciBhbgorCSAqIGluaGVyaXRhbmNlIHRyZWUpIHRoZXkgY2FuIGJlIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aCBhcyBuZWVkZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFZlY3RvcjxKYXZhUmVzb3VyY2VDbGFzc0ZpbGU+IGNsYXNzRmlsZXMgPSBuZXcgVmVjdG9yPEphdmFSZXNvdXJjZUNsYXNzRmlsZT4oKTsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJQmluYXJ5UGFja2FnZUZyYWdtZW50KEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QgcGFyZW50LCBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLnBhY2thZ2VGcmFnbWVudCA9IHBhY2thZ2VGcmFnbWVudDsKKwkJdGhpcy5jbGFzc0ZpbGVzLmFkZEFsbCh0aGlzLmJ1aWxkQ2xhc3NGaWxlcygpKTsKKwl9CisKKwlwcml2YXRlIENvbGxlY3Rpb248SmF2YVJlc291cmNlQ2xhc3NGaWxlPiBidWlsZENsYXNzRmlsZXMoKSB7CisJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gdGhpcy5nZXRKRFRDaGlsZHJlbigpOworCQlBcnJheUxpc3Q8SmF2YVJlc291cmNlQ2xhc3NGaWxlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEphdmFSZXNvdXJjZUNsYXNzRmlsZT4oY2hpbGRyZW4ubGVuZ3RoKTsKKwkJZm9yIChJSmF2YUVsZW1lbnQgY2hpbGQgOiBjaGlsZHJlbikgeworCQkJSUNsYXNzRmlsZSBqZHRDbGFzc0ZpbGUgPSAoSUNsYXNzRmlsZSkgY2hpbGQ7CisJCQlJVHlwZSBqZHRUeXBlID0gamR0Q2xhc3NGaWxlLmdldFR5cGUoKTsKKwkJCWlmIChCaW5hcnlQZXJzaXN0ZW50VHlwZS50eXBlSXNQZXJzaXN0YWJsZShqZHRUeXBlKSkgeworCQkJCUphdmFSZXNvdXJjZUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSBuZXcgQmluYXJ5Q2xhc3NGaWxlKHRoaXMsIGpkdENsYXNzRmlsZSwgamR0VHlwZSk7CisJCQkJaWYgKGNsYXNzRmlsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmlzQW5ub3RhdGVkKCkpIHsgIC8vIHdlIG9ubHkgaG9sZCBhbm5vdGF0ZWQgdHlwZXMKKwkJCQkJcmVzdWx0LmFkZChjbGFzc0ZpbGUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCisJLy8gKioqKioqKioqKiBKYXJSZXNvdXJjZU5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy51cGRhdGVDbGFzc0ZpbGVzKCk7CisJfQorCisJLy8gVE9ETworCXByaXZhdGUgdm9pZCB1cGRhdGVDbGFzc0ZpbGVzKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKworCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YVJlc291cmNlQ2xhc3NGaWxlPiBjbGFzc0ZpbGVzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFSZXNvdXJjZUNsYXNzRmlsZT4odGhpcy5jbGFzc0ZpbGVzKTsKKwl9CisKKwlwdWJsaWMgaW50IGNsYXNzRmlsZXNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5jbGFzc0ZpbGVzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IHBlcnNpc3RlZFR5cGVzKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8SmF2YVJlc291cmNlQ2xhc3NGaWxlLCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4odGhpcy5jbGFzc0ZpbGVzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHRyYW5zZm9ybShKYXZhUmVzb3VyY2VDbGFzc0ZpbGUgY2xhc3NGaWxlKSB7CisJCQkJcmV0dXJuIGNsYXNzRmlsZS5nZXRQZXJzaXN0ZW50VHlwZSgpOyAgLy8gd2Ugb25seSBob2xkIGFubm90YXRlZCB0eXBlcworCQkJfQorCQl9OworCX0KKworCisJLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKKworCXByaXZhdGUgSUphdmFFbGVtZW50W10gZ2V0SkRUQ2hpbGRyZW4oKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5wYWNrYWdlRnJhZ21lbnQuZ2V0Q2hpbGRyZW4oKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQlKcHRDb3JlUGx1Z2luLmxvZyhleCk7CisJCQlyZXR1cm4gRU1QVFlfSkFWQV9FTEVNRU5UX0FSUkFZOworCQl9CisJfQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSUphdmFFbGVtZW50W10gRU1QVFlfSkFWQV9FTEVNRU5UX0FSUkFZID0gbmV3IElKYXZhRWxlbWVudFswXTsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMucGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVBhY2thZ2VGcmFnbWVudFJvb3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlQYWNrYWdlRnJhZ21lbnRSb290LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyNzZjNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlQYWNrYWdlRnJhZ21lbnRSb290LmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKKworLyoqCisgKiBiaW5hcnkgcGFja2FnZSBmcmFnbWVudCByb290CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlQYWNrYWdlRnJhZ21lbnRSb290CisJZXh0ZW5kcyBSb290QmluYXJ5Tm9kZQorCWltcGxlbWVudHMgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdAoreworCS8qKiBKRFQgcGFja2FnZSBmcmFnbWVudCByb290ICovCisJcHJpdmF0ZSBmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290OworCisJLyoqIHBhY2thZ2UgZnJhZ21lbnRzIGluIHRoZSBKQVIgKi8KKwlwcml2YXRlIGZpbmFsIFZlY3RvcjxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQ+IHBhY2thZ2VGcmFnbWVudHMgPSBuZXcgVmVjdG9yPEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudD4oKTsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJcHVibGljIEJpbmFyeVBhY2thZ2VGcmFnbWVudFJvb3QoSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCwgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlcikgeworCQlzdXBlcihudWxsLCBhbm5vdGF0aW9uUHJvdmlkZXIpOyAgLy8gdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyB0aGUgcm9vdCBvZiBpdHMgc3ViLXRyZWUKKwkJdGhpcy5wYWNrYWdlRnJhZ21lbnRSb290ID0gcGFja2FnZUZyYWdtZW50Um9vdDsKKwkJdGhpcy5wYWNrYWdlRnJhZ21lbnRzLmFkZEFsbCh0aGlzLmJ1aWxkUGFja2FnZUZyYWdtZW50cygpKTsKKwl9CisKKwlwcml2YXRlIENvbGxlY3Rpb248SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50PiBidWlsZFBhY2thZ2VGcmFnbWVudHMoKSB7CisJCUlKYXZhRWxlbWVudFtdIGpkdENoaWxkcmVuID0gdGhpcy5nZXRKRFRDaGlsZHJlbigpOworCQlBcnJheUxpc3Q8SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudD4oamR0Q2hpbGRyZW4ubGVuZ3RoKTsKKwkJZm9yIChJSmF2YUVsZW1lbnQgY2hpbGQgOiBqZHRDaGlsZHJlbikgeworCQkJcmVzdWx0LmFkZChuZXcgQmluYXJ5UGFja2FnZUZyYWdtZW50KHRoaXMsIChJUGFja2FnZUZyYWdtZW50KSBjaGlsZCkpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisKKwkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKKwkJcmV0dXJuIChJRmlsZSkgdGhpcy5wYWNrYWdlRnJhZ21lbnRSb290LmdldFJlc291cmNlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy51cGRhdGVQYWNrYWdlRnJhZ21lbnRzKCk7CisJfQorCisJLy8gVE9ETworCXByaXZhdGUgdm9pZCB1cGRhdGVQYWNrYWdlRnJhZ21lbnRzKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKworCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlTm9kZS5Sb290IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8qKgorCSAqIE5COiB3ZSBob2xkIG9ubHkgYW5ub3RhdGVkIHR5cGVzCisJICovCisJcHVibGljIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiBwZXJzaXN0ZW50VHlwZXMoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+KHRoaXMucGVyc2lzdGVkVHlwZUl0ZXJhdG9ycygpKTsKKwl9CisKKwlwcml2YXRlIEl0ZXJhdG9yPEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPj4gcGVyc2lzdGVkVHlwZUl0ZXJhdG9ycygpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudCwgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+Pih0aGlzLnBhY2thZ2VGcmFnbWVudHMoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IHRyYW5zZm9ybShKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQgZnJhZ21lbnQpIHsKKwkJCQlyZXR1cm4gZnJhZ21lbnQucGVyc2lzdGVkVHlwZXMoKTsKKwkJCX0KKwkJfTsKKwl9CisKKworCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgSXRlcmF0b3I8SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50PiBwYWNrYWdlRnJhZ21lbnRzKCkgeworCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Pih0aGlzLnBhY2thZ2VGcmFnbWVudHMpOworCX0KKworCXB1YmxpYyBpbnQgcGFja2FnZUZyYWdtZW50c1NpemUoKSB7CisJCXJldHVybiB0aGlzLnBhY2thZ2VGcmFnbWVudHMuc2l6ZSgpOworCX0KKworCisJLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKKworCXByaXZhdGUgSUphdmFFbGVtZW50W10gZ2V0SkRUQ2hpbGRyZW4oKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5wYWNrYWdlRnJhZ21lbnRSb290LmdldENoaWxkcmVuKCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJLy8gaWdub3JlIEZORkUgLSB3aGljaCBjYW4gaGFwcGVuIHdoZW4gdGhlIHdvcmtzcGFjZSBpcyBvdXQgb2Ygc3luY2ggd2l0aCBPL1MgZmlsZSBzeXN0ZW0KKwkJCWlmICggISAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikpIHsKKwkJCQlKcHRDb3JlUGx1Z2luLmxvZyhleCk7CisJCQl9CisJCQlyZXR1cm4gRU1QVFlfSkFWQV9FTEVNRU5UX0FSUkFZOworCQl9CisJfQorCXByaXZhdGUgc3RhdGljIGZpbmFsIElKYXZhRWxlbWVudFtdIEVNUFRZX0pBVkFfRUxFTUVOVF9BUlJBWSA9IG5ldyBJSmF2YUVsZW1lbnRbMF07CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLmdldEZpbGUoKS5nZXROYW1lKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyMzk2OQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw2NDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSlBUVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5NZXRob2RTaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5OYW1lVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIGJpbmFyeSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSAoZmllbGQgb3IgcHJvcGVydHkpCisgKi8KK2ZpbmFsIGNsYXNzIEJpbmFyeVBlcnNpc3RlbnRBdHRyaWJ1dGUKKwlleHRlbmRzIEJpbmFyeVBlcnNpc3RlbnRNZW1iZXIKKwlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUKK3sKKwlwcml2YXRlIGludCBtb2RpZmllcnM7CisKKwlwcml2YXRlIFN0cmluZyB0eXBlTmFtZTsKKworCXByaXZhdGUgYm9vbGVhbiB0eXBlSXNJbnRlcmZhY2U7CisKKwlwcml2YXRlIGJvb2xlYW4gdHlwZUlzRW51bTsKKworCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gdHlwZVN1cGVyY2xhc3NOYW1lcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworCisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiB0eXBlSW50ZXJmYWNlTmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKworCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gdHlwZVR5cGVBcmd1bWVudE5hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisKKworCUJpbmFyeVBlcnNpc3RlbnRBdHRyaWJ1dGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBJRmllbGQgZmllbGQpIHsKKwkJdGhpcyhwYXJlbnQsIG5ldyBGaWVsZEFkYXB0ZXIoZmllbGQpKTsKKwl9CisKKwlCaW5hcnlQZXJzaXN0ZW50QXR0cmlidXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSU1ldGhvZCBtZXRob2QpIHsKKwkJdGhpcyhwYXJlbnQsIG5ldyBNZXRob2RBZGFwdGVyKG1ldGhvZCkpOworCX0KKworCXByaXZhdGUgQmluYXJ5UGVyc2lzdGVudEF0dHJpYnV0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEFkYXB0ZXIgYWRhcHRlcikgeworCQlzdXBlcihwYXJlbnQsIGFkYXB0ZXIpOworCQl0aGlzLm1vZGlmaWVycyA9IHRoaXMuYnVpbGRNb2RpZmllcnMoKTsKKwkJdGhpcy50eXBlTmFtZSA9IHRoaXMuYnVpbGRUeXBlTmFtZSgpOworCisJCUlUeXBlIHR5cGUgPSB0aGlzLmdldFR5cGUoKTsgIC8vIHNob3VsZG4ndCBiZSBhbiBhcnJheS4uLgorCQl0aGlzLnR5cGVJc0ludGVyZmFjZSA9IHRoaXMuYnVpbGRUeXBlSXNJbnRlcmZhY2UodHlwZSk7CisJCXRoaXMudHlwZUlzRW51bSA9IHRoaXMuYnVpbGRUeXBlSXNFbnVtKHR5cGUpOworCQl0aGlzLnR5cGVTdXBlcmNsYXNzTmFtZXMuYWRkQWxsKHRoaXMuYnVpbGRUeXBlU3VwZXJjbGFzc05hbWVzKHR5cGUpKTsKKwkJdGhpcy50eXBlSW50ZXJmYWNlTmFtZXMuYWRkQWxsKHRoaXMuYnVpbGRUeXBlSW50ZXJmYWNlTmFtZXModHlwZSkpOworCisJCXRoaXMudHlwZVR5cGVBcmd1bWVudE5hbWVzLmFkZEFsbCh0aGlzLmJ1aWxkVHlwZVR5cGVBcmd1bWVudE5hbWVzKCkpOworCX0KKworCisJLy8gKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldE1vZGlmaWVycyh0aGlzLmJ1aWxkTW9kaWZpZXJzKCkpOworCQl0aGlzLnNldFR5cGVOYW1lKHRoaXMuYnVpbGRUeXBlTmFtZSgpKTsKKworCQlJVHlwZSB0eXBlID0gdGhpcy5nZXRUeXBlKCk7ICAvLyBzaG91bGRuJ3QgYmUgYW4gYXJyYXkuLi4KKwkJdGhpcy5zZXRUeXBlSXNJbnRlcmZhY2UodGhpcy5idWlsZFR5cGVJc0ludGVyZmFjZSh0eXBlKSk7CisJCXRoaXMuc2V0VHlwZUlzRW51bSh0aGlzLmJ1aWxkVHlwZUlzRW51bSh0eXBlKSk7CisJCXRoaXMuc2V0VHlwZVN1cGVyY2xhc3NOYW1lcyh0aGlzLmJ1aWxkVHlwZVN1cGVyY2xhc3NOYW1lcyh0eXBlKSk7CisJCXRoaXMuc2V0VHlwZUludGVyZmFjZU5hbWVzKHRoaXMuYnVpbGRUeXBlSW50ZXJmYWNlTmFtZXModHlwZSkpOworCisJCXRoaXMuc2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzKHRoaXMuYnVpbGRUeXBlVHlwZUFyZ3VtZW50TmFtZXMoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5nZXROYW1lKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBCaW5hcnlQZXJzaXN0ZW50TWVtYmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKwkKKwlwcml2YXRlIEFkYXB0ZXIgZ2V0QWRhcHRlcigpIHsKKwkJcmV0dXJuIChBZGFwdGVyKSB0aGlzLmFkYXB0ZXI7CisJfQorCQorCUBPdmVycmlkZQorCUl0ZXJhdG9yPFN0cmluZz4gdmFsaWRBbm5vdGF0aW9uTmFtZXMoKSB7CisJCXJldHVybiB0aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLmF0dHJpYnV0ZUFubm90YXRpb25OYW1lcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiB0aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkQXR0cmlidXRlQW5ub3RhdGlvbih0aGlzLCBqZHRBbm5vdGF0aW9uKTsKKwl9CisJCisJQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uXyhTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuYnVpbGROdWxsQXR0cmlidXRlQW5ub3RhdGlvbih0aGlzLCBhbm5vdGF0aW9uTmFtZSk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5nZXRBZGFwdGVyKCkuZ2V0QXR0cmlidXRlTmFtZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgeworCQlyZXR1cm4gKGFubm90YXRpb25OYW1lID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGROdWxsQW5ub3RhdGlvbl8oYW5ub3RhdGlvbk5hbWUpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkKCkgeworCQlyZXR1cm4gdGhpcy5nZXRBZGFwdGVyKCkuaXNGaWVsZCgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHkoKSB7CisJCXJldHVybiAhIHRoaXMuaXNGaWVsZCgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRm9yKE1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUsIGludCBvY2N1cnJlbmNlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2VzcygpIHsKKwkJQWNjZXNzMl8wQW5ub3RhdGlvbiBhY2Nlc3NBbm5vdGF0aW9uID0gKEFjY2VzczJfMEFubm90YXRpb24pIHRoaXMuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCXJldHVybiBhY2Nlc3NBbm5vdGF0aW9uID09IG51bGwgPyBudWxsIDogYWNjZXNzQW5ub3RhdGlvbi5nZXRWYWx1ZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIHR5cGVJc1N1YlR5cGVPZihTdHJpbmcgdG4pIHsKKwkJcmV0dXJuICgodGhpcy50eXBlTmFtZSAhPSBudWxsKSAmJiB0aGlzLnR5cGVOYW1lLmVxdWFscyh0bikpCisJCQkJfHwgdGhpcy50eXBlSW50ZXJmYWNlTmFtZXMuY29udGFpbnModG4pCisJCQkJfHwgdGhpcy50eXBlU3VwZXJjbGFzc05hbWVzLmNvbnRhaW5zKHRuKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB0eXBlSXNWYXJpYWJsZVByaW1pdGl2ZSgpIHsKKwkJcmV0dXJuICh0aGlzLnR5cGVOYW1lICE9IG51bGwpICYmIENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmUodGhpcy50eXBlTmFtZSk7CisJfQorCisJLy8gKioqKiogbW9kaWZpZXJzCisJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisJCXJldHVybiB0aGlzLm1vZGlmaWVyczsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0TW9kaWZpZXJzKGludCBtb2RpZmllcnMpIHsKKwkJaW50IG9sZCA9IHRoaXMubW9kaWZpZXJzOworCQl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1PRElGSUVSU19QUk9QRVJUWSwgb2xkLCBtb2RpZmllcnMpOworCX0KKworCS8qKgorCSAqIHplcm8gc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUgZGVmYXVsdC4uLgorCSAqLworCXByaXZhdGUgaW50IGJ1aWxkTW9kaWZpZXJzKCkgeworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuZ2V0TWVtYmVyKCkuZ2V0RmxhZ3MoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQlKcHRDb3JlUGx1Z2luLmxvZyhleCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8vICoqKioqIHR5cGUgbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7CisJCXJldHVybiB0aGlzLnR5cGVOYW1lOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudHlwZU5hbWU7CisJCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfTkFNRV9QUk9QRVJUWSwgb2xkLCB0eXBlTmFtZSk7CisJfQorCisJLyoqCisJICogSkFScyBkb24ndCBoYXZlIGFycmF5IHR5cGVzOworCSAqIGFsc28sIG5vIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzCisJICovCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlTmFtZSgpIHsKKwkJcmV0dXJuIGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlTmFtZSh0aGlzLmdldFR5cGVTaWduYXR1cmUoKSk7CisJfQorCisJLy8gKioqKiogdHlwZSBpcyBpbnRlcmZhY2UKKwlwdWJsaWMgYm9vbGVhbiB0eXBlSXNJbnRlcmZhY2UoKSB7CisJCXJldHVybiB0aGlzLnR5cGVJc0ludGVyZmFjZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0VHlwZUlzSW50ZXJmYWNlKGJvb2xlYW4gdHlwZUlzSW50ZXJmYWNlKSB7CisJCWJvb2xlYW4gb2xkID0gdGhpcy50eXBlSXNJbnRlcmZhY2U7CisJCXRoaXMudHlwZUlzSW50ZXJmYWNlID0gdHlwZUlzSW50ZXJmYWNlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9JU19JTlRFUkZBQ0VfUFJPUEVSVFksIG9sZCwgdHlwZUlzSW50ZXJmYWNlKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gYnVpbGRUeXBlSXNJbnRlcmZhY2UoSVR5cGUgdHlwZSkgeworCQl0cnkgeworCQkJcmV0dXJuICh0eXBlICE9IG51bGwpICYmIHR5cGUuaXNJbnRlcmZhY2UoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQlKcHRDb3JlUGx1Z2luLmxvZyhleCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwkvLyAqKioqKiB0eXBlIGlzIGVudW0KKwlwdWJsaWMgYm9vbGVhbiB0eXBlSXNFbnVtKCkgeworCQlyZXR1cm4gdGhpcy50eXBlSXNFbnVtOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRUeXBlSXNFbnVtKGJvb2xlYW4gdHlwZUlzRW51bSkgeworCQlib29sZWFuIG9sZCA9IHRoaXMudHlwZUlzRW51bTsKKwkJdGhpcy50eXBlSXNFbnVtID0gdHlwZUlzRW51bTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfSVNfRU5VTV9QUk9QRVJUWSwgb2xkLCB0eXBlSXNFbnVtKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gYnVpbGRUeXBlSXNFbnVtKElUeXBlIHR5cGUpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiAodHlwZSAhPSBudWxsKSAmJiB0eXBlLmlzRW51bSgpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKKwkJCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCS8vICoqKioqIHR5cGUgc3VwZXJjbGFzcyBoaWVyYXJjaHkKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdHlwZVN1cGVyY2xhc3NOYW1lcygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMudHlwZVN1cGVyY2xhc3NOYW1lcyk7CisJfQorCisJcHVibGljIGJvb2xlYW4gdHlwZVN1cGVyY2xhc3NOYW1lc0NvbnRhaW5zKFN0cmluZyBzdXBlcmNsYXNzTmFtZSkgeworCQlyZXR1cm4gdGhpcy50eXBlU3VwZXJjbGFzc05hbWVzLmNvbnRhaW5zKHN1cGVyY2xhc3NOYW1lKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0VHlwZVN1cGVyY2xhc3NOYW1lcyhMaXN0PFN0cmluZz4gdHlwZVN1cGVyY2xhc3NOYW1lcykgeworCQl0aGlzLnN5bmNocm9uaXplTGlzdCh0eXBlU3VwZXJjbGFzc05hbWVzLCB0aGlzLnR5cGVTdXBlcmNsYXNzTmFtZXMsIFRZUEVfU1VQRVJDTEFTU19OQU1FU19MSVNUKTsKKwl9CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFR5cGVTdXBlcmNsYXNzTmFtZXMoSVR5cGUgdHlwZSkgeworCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJCX0KKworCQlBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0eXBlID0gdGhpcy5maW5kU3VwZXJjbGFzcyh0eXBlKTsKKwkJd2hpbGUgKHR5cGUgIT0gbnVsbCkgeworCQkJbmFtZXMuYWRkKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpOyAgLy8gbm8gcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQgaGVyZQorCQkJdHlwZSA9IHRoaXMuZmluZFN1cGVyY2xhc3ModHlwZSk7CisJCX0KKwkJcmV0dXJuIG5hbWVzOworCX0KKworCS8vICoqKioqIHR5cGUgaW50ZXJmYWNlIGhpZXJhcmNoeQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IHR5cGVJbnRlcmZhY2VOYW1lcygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPFN0cmluZz4odGhpcy50eXBlSW50ZXJmYWNlTmFtZXMpOworCX0KKworCXB1YmxpYyBib29sZWFuIHR5cGVJbnRlcmZhY2VOYW1lc0NvbnRhaW5zKFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7CisJCXJldHVybiB0aGlzLnR5cGVJbnRlcmZhY2VOYW1lcy5jb250YWlucyhpbnRlcmZhY2VOYW1lKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0VHlwZUludGVyZmFjZU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiB0eXBlSW50ZXJmYWNlTmFtZXMpIHsKKwkJdGhpcy5zeW5jaHJvbml6ZUNvbGxlY3Rpb24odHlwZUludGVyZmFjZU5hbWVzLCB0aGlzLnR5cGVJbnRlcmZhY2VOYW1lcywgVFlQRV9JTlRFUkZBQ0VfTkFNRVNfQ09MTEVDVElPTik7CisJfQorCisJcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRUeXBlSW50ZXJmYWNlTmFtZXMoSVR5cGUgdHlwZSkgeworCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKwkJfQorCisJCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJd2hpbGUgKHR5cGUgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRJbnRlcmZhY2VOYW1lc1RvKHR5cGUsIG5hbWVzKTsKKwkJCXR5cGUgPSB0aGlzLmZpbmRTdXBlcmNsYXNzKHR5cGUpOworCQl9CisJCXJldHVybiBuYW1lczsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkSW50ZXJmYWNlTmFtZXNUbyhJVHlwZSB0eXBlLCBIYXNoU2V0PFN0cmluZz4gbmFtZXMpIHsKKwkJZm9yIChTdHJpbmcgaW50ZXJmYWNlU2lnbmF0dXJlIDogdGhpcy5nZXRTdXBlckludGVyZmFjZVR5cGVTaWduYXR1cmVzKHR5cGUpKSB7CisJCQlTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlTmFtZShpbnRlcmZhY2VTaWduYXR1cmUpOworCQkJbmFtZXMuYWRkKGludGVyZmFjZU5hbWUpOworCQkJSVR5cGUgaW50ZXJmYWNlVHlwZSA9IHRoaXMuZmluZFR5cGUoaW50ZXJmYWNlTmFtZSk7CisJCQlpZiAoaW50ZXJmYWNlVHlwZSAhPSBudWxsKSB7CisJCQkJdGhpcy5hZGRJbnRlcmZhY2VOYW1lc1RvKGludGVyZmFjZVR5cGUsIG5hbWVzKTsgIC8vIHJlY3Vyc2UKKwkJCX0KKwkJfQorCX0KKworCS8vICoqKioqIHR5cGUgdHlwZSBhcmd1bWVudCBuYW1lcworCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0eXBlVHlwZUFyZ3VtZW50TmFtZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLnR5cGVUeXBlQXJndW1lbnROYW1lcyk7CisJfQorCisJcHVibGljIGludCB0eXBlVHlwZUFyZ3VtZW50TmFtZXNTaXplKCkgeworCQlyZXR1cm4gdGhpcy50eXBlVHlwZUFyZ3VtZW50TmFtZXMuc2l6ZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWUoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLnR5cGVUeXBlQXJndW1lbnROYW1lcy5nZXQoaW5kZXgpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXMoTGlzdDxTdHJpbmc+IHR5cGVUeXBlQXJndW1lbnROYW1lcykgeworCQl0aGlzLnN5bmNocm9uaXplTGlzdCh0eXBlVHlwZUFyZ3VtZW50TmFtZXMsIHRoaXMudHlwZVR5cGVBcmd1bWVudE5hbWVzLCBUWVBFX1RZUEVfQVJHVU1FTlRfTkFNRVNfTElTVCk7CisJfQorCisJLyoqCisJICogdGhlc2UgdHlwZXMgY2FuIGJlIGFycmF5cyAoZS5nLiAiamF2YS5sYW5nLlN0cmluZ1tdIik7CisJICogYnV0IHRoZXkgd29uJ3QgaGF2ZSBhbnkgZnVydGhlciBuZXN0ZWQgZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cworCSAqIChlLmcuICJqYXZhLnV0aWwuQ29sbGVjdGlvbjxqYXZhLmxhbmcuU3RyaW5nPiIpCisJICovCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRUeXBlVHlwZUFyZ3VtZW50TmFtZXMoKSB7CisJCVN0cmluZyB0eXBlU2lnbmF0dXJlID0gdGhpcy5nZXRUeXBlU2lnbmF0dXJlKCk7CisJCWlmICh0eXBlU2lnbmF0dXJlID09IG51bGwpIHsKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwkJfQorCisJCVN0cmluZ1tdIHR5cGVBcmd1bWVudFNpZ25hdHVyZXMgPSBTaWduYXR1cmUuZ2V0VHlwZUFyZ3VtZW50cyh0eXBlU2lnbmF0dXJlKTsKKwkJaWYgKHR5cGVBcmd1bWVudFNpZ25hdHVyZXMubGVuZ3RoID09IDApIHsKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwkJfQorCisJCUFycmF5TGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHR5cGVBcmd1bWVudFNpZ25hdHVyZXMubGVuZ3RoKTsKKwkJZm9yIChTdHJpbmcgdHlwZUFyZ3VtZW50U2lnbmF0dXJlIDogdHlwZUFyZ3VtZW50U2lnbmF0dXJlcykgeworCQkJbmFtZXMuYWRkKGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlTmFtZSh0eXBlQXJndW1lbnRTaWduYXR1cmUpKTsKKwkJfQorCQlyZXR1cm4gbmFtZXM7CisJfQorCisKKwkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZSgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmdldEFkYXB0ZXIoKS5nZXRUeXBlU2lnbmF0dXJlKCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwcml2YXRlIElUeXBlIGZpbmRTdXBlcmNsYXNzKElUeXBlIHR5cGUpIHsKKwkJcmV0dXJuIHRoaXMuZmluZFR5cGVCeVNpZ25hdHVyZSh0aGlzLmdldFN1cGVyY2xhc3NTaWduYXR1cmUodHlwZSkpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFN1cGVyY2xhc3NTaWduYXR1cmUoSVR5cGUgdHlwZSkgeworCQl0cnkgeworCQkJcmV0dXJuIHR5cGUuZ2V0U3VwZXJjbGFzc1R5cGVTaWduYXR1cmUoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQlKcHRDb3JlUGx1Z2luLmxvZyhleCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nW10gZ2V0U3VwZXJJbnRlcmZhY2VUeXBlU2lnbmF0dXJlcyhJVHlwZSB0eXBlKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gdHlwZS5nZXRTdXBlckludGVyZmFjZVR5cGVTaWduYXR1cmVzKCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJcmV0dXJuIEVNUFRZX1NUUklOR19BUlJBWTsKKwkJfQorCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOworCisJcHJpdmF0ZSBJVHlwZSBmaW5kVHlwZUJ5U2lnbmF0dXJlKFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7CisJCXJldHVybiAodHlwZVNpZ25hdHVyZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmZpbmRUeXBlKGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlTmFtZV8odHlwZVNpZ25hdHVyZSkpOworCX0KKworCXByaXZhdGUgSVR5cGUgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuICh0aGlzLnR5cGVOYW1lID09IG51bGwpID8gbnVsbCA6IHRoaXMuZmluZFR5cGUodGhpcy50eXBlTmFtZSk7CisJfQorCisJcHJpdmF0ZSBJVHlwZSBmaW5kVHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGZ1bGx5UXVhbGlmaWVkTmFtZSk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0TWVtYmVyKCkuZ2V0SmF2YVByb2plY3QoKTsKKwl9CisKKworCisJLy8gKioqKioqKioqKiBhZGFwdGVycyAqKioqKioqKioqCisKKwkvKioKKwkgKiBBZGFwdCBhbiBJRmllbGQgb3IgSU1ldGhvZC4KKwkgKi8KKwlpbnRlcmZhY2UgQWRhcHRlcgorCQlleHRlbmRzIEJpbmFyeVBlcnNpc3RlbnRNZW1iZXIuQWRhcHRlcgorCXsKKwkJLyoqCisJCSAqIFJldHVybiB0aGUgZmllbGQgb3IgZ2V0dGVyIG1ldGhvZCdzICJhdHRyaWJ1dGUiIG5hbWUKKwkJICogKGUuZy4gZmllbGQgImZvbyIgLT4gImZvbyI7IG1ldGhvZCAiZ2V0Rm9vIiAtPiAiZm9vIikuCisJCSAqLworCQlTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpOworCisJCS8qKgorCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIGEgSmF2YSBmaWVsZCAoYXMgb3Bwb3NlZCB0byBhIG1ldGhvZCkuCisJCSAqLworCQlib29sZWFuIGlzRmllbGQoKTsKKworCQkvKioKKwkJICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyB0eXBlIHNpZ25hdHVyZS4KKwkJICovCisJCVN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBJRmllbGQgYWRhcHRlcgorCSAqLworCXN0YXRpYyBjbGFzcyBGaWVsZEFkYXB0ZXIKKwkJaW1wbGVtZW50cyBBZGFwdGVyCisJeworCQlmaW5hbCBJRmllbGQgZmllbGQ7CisKKwkJRmllbGRBZGFwdGVyKElGaWVsZCBmaWVsZCkgeworCQkJc3VwZXIoKTsKKwkJCXRoaXMuZmllbGQgPSBmaWVsZDsKKwkJfQorCisJCXB1YmxpYyBJRmllbGQgZ2V0TWVtYmVyKCkgeworCQkJcmV0dXJuIHRoaXMuZmllbGQ7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RhYmxlKCkgeworCQkJcmV0dXJuIHRoaXMuZmllbGQuZXhpc3RzKCkgJiYgSlBUVG9vbHMuZmllbGRJc1BlcnNpc3RhYmxlKG5ldyBKUFRUb29sc0FkYXB0ZXIoKSk7CisJCX0KKworCQlwdWJsaWMgSUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkJcmV0dXJuIHRoaXMuZmllbGQuZ2V0QW5ub3RhdGlvbnMoKTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKKwkJCXJldHVybiB0aGlzLmZpZWxkLmdldEVsZW1lbnROYW1lKCk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkKCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCXJldHVybiB0aGlzLmZpZWxkLmdldFR5cGVTaWduYXR1cmUoKTsKKwkJfQorCisJCS8qKgorCQkgKiBKUFRUb29scyBuZWVkcyBhbiBhZGFwdGVyIHNvIGl0IGNhbiB3b3JrIHdpdGggZWl0aGVyIGFuIElGaWVsZAorCQkgKiBvciBhbiBJVmFyaWFibGVCaW5kaW5nIGV0Yy4KKwkJICovCisJCWNsYXNzIEpQVFRvb2xzQWRhcHRlciBpbXBsZW1lbnRzIEpQVFRvb2xzLkZpZWxkQWRhcHRlciB7CisJCQlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKwkJCQl0cnkgeworCQkJCQlyZXR1cm4gRmllbGRBZGFwdGVyLnRoaXMuZmllbGQuZ2V0RmxhZ3MoKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKKwkJCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisKKwkJfQorCisJfQorCisJLyoqCisJICogSU1ldGhvZCBhZGFwdGVyCisJICovCisJc3RhdGljIGNsYXNzIE1ldGhvZEFkYXB0ZXIKKwkJaW1wbGVtZW50cyBBZGFwdGVyCisJeworCQlmaW5hbCBJTWV0aG9kIG1ldGhvZDsKKwkJc3RhdGljIGZpbmFsIElNZXRob2RbXSBFTVBUWV9NRVRIT0RfQVJSQVkgPSBuZXcgSU1ldGhvZFswXTsKKworCQlNZXRob2RBZGFwdGVyKElNZXRob2QgbWV0aG9kKSB7CisJCQlzdXBlcigpOworCQkJdGhpcy5tZXRob2QgPSBtZXRob2Q7CisJCX0KKworCQlwdWJsaWMgSU1ldGhvZCBnZXRNZW1iZXIoKSB7CisJCQlyZXR1cm4gdGhpcy5tZXRob2Q7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RhYmxlKCkgeworCQkJcmV0dXJuIEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihuZXcgSlBUVG9vbHNBZGFwdGVyKCkpOworCQl9CisKKwkJcHVibGljIElBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCXJldHVybiB0aGlzLm1ldGhvZC5nZXRBbm5vdGF0aW9ucygpOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgeworCQkJcmV0dXJuIE5hbWVUb29scy5jb252ZXJ0R2V0dGVyTWV0aG9kTmFtZVRvUHJvcGVydHlOYW1lKHRoaXMubWV0aG9kLmdldEVsZW1lbnROYW1lKCkpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNGaWVsZCgpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQkJcmV0dXJuIHRoaXMubWV0aG9kLmdldFJldHVyblR5cGUoKTsKKwkJfQorCisJCS8qKgorCQkgKiBKUFRUb29scyBuZWVkcyBhbiBhZGFwdGVyIHNvIGl0IGNhbiB3b3JrIHdpdGggZWl0aGVyIGFuIElNZXRob2QKKwkJICogb3IgYW4gSU1ldGhvZEJpbmRpbmcgZXRjLgorCQkgKi8KKwkJYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEFic3RyYWN0SlBUVG9vbHNBZGFwdGVyCisJCQlpbXBsZW1lbnRzIEpQVFRvb2xzLlNpbXBsZU1ldGhvZEFkYXB0ZXIKKwkJeworCQkJQWJzdHJhY3RKUFRUb29sc0FkYXB0ZXIoKSB7CisJCQkJc3VwZXIoKTsKKwkJCX0KKworCQkJYWJzdHJhY3QgSU1ldGhvZCBnZXRNZXRob2QoKTsKKworCQkJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisJCQkJdHJ5IHsKKwkJCQkJcmV0dXJuIHRoaXMuZ2V0TWV0aG9kKCkuZ2V0RmxhZ3MoKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKKwkJCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0UmV0dXJuVHlwZUVyYXN1cmVOYW1lKCkgeworCQkJCXJldHVybiBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWUodGhpcy5nZXRSZXR1cm5UeXBlU2lnbmF0dXJlKCkpOworCQkJfQorCisJCQlwcml2YXRlIFN0cmluZyBnZXRSZXR1cm5UeXBlU2lnbmF0dXJlKCkgeworCQkJCXRyeSB7CisJCQkJCXJldHVybiB0aGlzLmdldE1ldGhvZCgpLmdldFJldHVyblR5cGUoKTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKKwkJCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9CisKKwkJCXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB7CisJCQkJdHJ5IHsKKwkJCQkJcmV0dXJuIHRoaXMuZ2V0TWV0aG9kKCkuaXNDb25zdHJ1Y3RvcigpOworCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJCQlKcHRDb3JlUGx1Z2luLmxvZyhleCk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisKKwkJfQorCisJCXN0YXRpYyBjbGFzcyBTaW1wbGVKUFRUb29sc0FkYXB0ZXIKKwkJCWV4dGVuZHMgQWJzdHJhY3RKUFRUb29sc0FkYXB0ZXIKKwkJeworCQkJcHJpdmF0ZSBmaW5hbCBJTWV0aG9kIG1ldGhvZDsKKworCQkJU2ltcGxlSlBUVG9vbHNBZGFwdGVyKElNZXRob2QgbWV0aG9kKSB7CisJCQkJc3VwZXIoKTsKKwkJCQl0aGlzLm1ldGhvZCA9IG1ldGhvZDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlJTWV0aG9kIGdldE1ldGhvZCgpIHsKKwkJCQlyZXR1cm4gdGhpcy5tZXRob2Q7CisJCQl9CisKKwkJfQorCisJCWNsYXNzIEpQVFRvb2xzQWRhcHRlcgorCQkJZXh0ZW5kcyBBYnN0cmFjdEpQVFRvb2xzQWRhcHRlcgorCQkJaW1wbGVtZW50cyBKUFRUb29scy5NZXRob2RBZGFwdGVyCisJCXsKKwkJCUpQVFRvb2xzQWRhcHRlcigpIHsKKwkJCQlzdXBlcigpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCUlNZXRob2QgZ2V0TWV0aG9kKCkgeworCQkJCXJldHVybiBNZXRob2RBZGFwdGVyLnRoaXMubWV0aG9kOworCQkJfQorCisJCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0TWV0aG9kKCkuZ2V0RWxlbWVudE5hbWUoKTsKKwkJCX0KKworCQkJcHVibGljIGludCBnZXRQYXJhbWV0ZXJzTGVuZ3RoKCkgeworCQkJCXJldHVybiB0aGlzLmdldE1ldGhvZCgpLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoOworCQkJfQorCisJCQlwdWJsaWMgSlBUVG9vbHMuU2ltcGxlTWV0aG9kQWRhcHRlciBnZXRTaWJsaW5nKFN0cmluZyBuYW1lKSB7CisJCQkJZm9yIChJTWV0aG9kIHNpYmxpbmcgOiB0aGlzLmdldFNpYmxpbmdzKCkpIHsKKwkJCQkJaWYgKChzaWJsaW5nLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApCisJCQkJCQkJJiYgc2libGluZy5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCQkJcmV0dXJuIG5ldyBTaW1wbGVKUFRUb29sc0FkYXB0ZXIoc2libGluZyk7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCXB1YmxpYyBKUFRUb29scy5TaW1wbGVNZXRob2RBZGFwdGVyIGdldFNpYmxpbmcoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXJhbWV0ZXJUeXBlRXJhc3VyZU5hbWUpIHsKKwkJCQlmb3IgKElNZXRob2Qgc2libGluZyA6IHRoaXMuZ2V0U2libGluZ3MoKSkgeworCQkJCQlTdHJpbmdbXSBwYXJtVHlwZXMgPSBzaWJsaW5nLmdldFBhcmFtZXRlclR5cGVzKCk7CisJCQkJCWlmICgocGFybVR5cGVzLmxlbmd0aCA9PSAxKQorCQkJCQkJCSYmIHNpYmxpbmcuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMobmFtZSkKKwkJCQkJCQkmJiBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWUocGFybVR5cGVzWzBdKS5lcXVhbHMocGFyYW1ldGVyVHlwZUVyYXN1cmVOYW1lKSkgeworCQkJCQkJcmV0dXJuIG5ldyBTaW1wbGVKUFRUb29sc0FkYXB0ZXIoc2libGluZyk7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCXByaXZhdGUgSU1ldGhvZFtdIGdldFNpYmxpbmdzKCkgeworCQkJCXRyeSB7CisJCQkJCXJldHVybiB0aGlzLmdldE1ldGhvZCgpLmdldERlY2xhcmluZ1R5cGUoKS5nZXRNZXRob2RzKCk7CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQkJCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsKKwkJCQkJcmV0dXJuIEVNUFRZX01FVEhPRF9BUlJBWTsKKwkJCQl9CisJCQl9CisKKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UGVyc2lzdGVudE1lbWJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVBlcnNpc3RlbnRNZW1iZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODY3NmY2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVBlcnNpc3RlbnRNZW1iZXIuamF2YQpAQCAtMCwwICsxLDI4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29udGFpbmVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOworCisvKioKKyAqIGJpbmFyeSBwZXJzaXN0ZW50IG1lbWJlcgorICovCithYnN0cmFjdCBjbGFzcyBCaW5hcnlQZXJzaXN0ZW50TWVtYmVyCisJZXh0ZW5kcyBCaW5hcnlOb2RlCisJaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyCit7CisJLyoqIEpEVCBtZW1iZXIgYWRhcHRlciAqLworCWZpbmFsIEFkYXB0ZXIgYWRhcHRlcjsKKwkKKwkvKiogYW5ub3RhdGlvbnMgKi8KKwlmaW5hbCBWZWN0b3I8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBuZXcgVmVjdG9yPEFubm90YXRpb24+KCk7CisJCisJYm9vbGVhbiBwZXJzaXN0YWJsZTsKKwkKKwkKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgQmluYXJ5UGVyc2lzdGVudE1lbWJlcihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQWRhcHRlciBhZGFwdGVyKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7CisJCXRoaXMuaW5pdGlhbGl6ZUFubm90YXRpb25zKCk7CisJCXRoaXMucGVyc2lzdGFibGUgPSB0aGlzLmJ1aWxkUGVyc2lzdGFibGUoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUFubm90YXRpb25zKCkgeworCQlmb3IgKElBbm5vdGF0aW9uIGFubm90YXRpb24gOiB0aGlzLmdldEpkdEFubm90YXRpb25zKCkpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBhZGRBbm5vdGF0aW9uKElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJaWYgKHRoaXMuYW5ub3RhdGlvbklzVmFsaWQoamR0QW5ub3RhdGlvbikpIHsKKwkJCXRoaXMuYW5ub3RhdGlvbnMuYWRkKHRoaXMuYnVpbGRBbm5vdGF0aW9uKGpkdEFubm90YXRpb24pKTsKKwkJfQorCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnVwZGF0ZUFubm90YXRpb25zKCk7CisJCXRoaXMuc2V0UGVyc2lzdGFibGUodGhpcy5idWlsZFBlcnNpc3RhYmxlKCkpOworCX0KKwkKKwkvLyBUT0RPCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUFubm90YXRpb25zKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBhbm5vdGF0aW9ucyAqKioqKioqKioqCisJCisJcHVibGljIEl0ZXJhdG9yPEFubm90YXRpb24+IGFubm90YXRpb25zKCkgeworCQlyZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9ucygpLml0ZXJhdG9yKCk7CisJfQorCQorCXByaXZhdGUgSXRlcmFibGU8QW5ub3RhdGlvbj4gZ2V0QW5ub3RhdGlvbnMoKSB7CisJCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8QW5ub3RhdGlvbj4odGhpcy5hbm5vdGF0aW9ucyk7CisJfQorCQorCXB1YmxpYyBpbnQgYW5ub3RhdGlvbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9ucy5zaXplKCk7CisJfQorCQorCXB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7CisJCXJldHVybiB0aGlzLnNlbGVjdEFubm90YXRpb25OYW1lZCh0aGlzLmdldEFubm90YXRpb25zKCksIGFubm90YXRpb25OYW1lKTsKKwl9CisJCisJcHVibGljIEFubm90YXRpb24gZ2V0Tm9uTnVsbEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7CisJCXJldHVybiAoYW5ub3RhdGlvbiAhPSBudWxsKSA/IGFubm90YXRpb24gOiB0aGlzLmJ1aWxkTnVsbEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOworCX0KKwkKKwlwdWJsaWMgSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucygKKwkJCVN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lLCBTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpIHsKKwkJQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZUFubm90YXRpb24+IGNvbnRhaW5lckFubm90YXRpb24gPSAKKwkJCQlnZXRDb250YWluZXJBbm5vdGF0aW9uKGNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKKwkJaWYgKGNvbnRhaW5lckFubm90YXRpb24gIT0gbnVsbCkgeworCQkJcmV0dXJuIGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbnMoKTsKKwkJfQorCQlOZXN0YWJsZUFubm90YXRpb24gbmVzdGFibGVBbm5vdGF0aW9uID0gCisJCQkJZ2V0TmVzdGFibGVBbm5vdGF0aW9uKG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOworCQlyZXR1cm4gKG5lc3RhYmxlQW5ub3RhdGlvbiA9PSBudWxsKSA/CisJCQkJRW1wdHlMaXN0SXRlcmF0b3IuPE5lc3RhYmxlQW5ub3RhdGlvbj5pbnN0YW5jZSgpIDoKKwkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4obmVzdGFibGVBbm5vdGF0aW9uKTsKKwl9CisJCisJcHJpdmF0ZSBOZXN0YWJsZUFubm90YXRpb24gZ2V0TmVzdGFibGVBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgeworCQlyZXR1cm4gKE5lc3RhYmxlQW5ub3RhdGlvbikgdGhpcy5nZXRBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKTsKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0Q29udGFpbmVyQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJcmV0dXJuIChDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4pIHRoaXMuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBhbm5vdGF0aW9uSXNWYWxpZChJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoCisJCQkJdGhpcy52YWxpZEFubm90YXRpb25OYW1lcygpLCBqZHRBbm5vdGF0aW9uLmdldEVsZW1lbnROYW1lKCkpOworCX0KKwkKKwlhYnN0cmFjdCBJdGVyYXRvcjxTdHJpbmc+IHZhbGlkQW5ub3RhdGlvbk5hbWVzKCk7CisJCisJYWJzdHJhY3QgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSUFubm90YXRpb24gamR0QW5ub3RhdGlvbik7CisJCisJYWJzdHJhY3QgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7CisJCisJCisJLy8gKioqKioqKioqKiBzaW1wbGUgc3RhdGUgKioqKioqKioqKgorCisJcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMucGVyc2lzdGFibGU7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFBlcnNpc3RhYmxlKGJvb2xlYW4gcGVyc2lzdGFibGUpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLnBlcnNpc3RhYmxlOworCQl0aGlzLnBlcnNpc3RhYmxlID0gcGVyc2lzdGFibGU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQRVJTSVNUQUJMRV9QUk9QRVJUWSwgb2xkLCBwZXJzaXN0YWJsZSk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGJ1aWxkUGVyc2lzdGFibGUoKSB7CisJCXJldHVybiB0aGlzLmFkYXB0ZXIuaXNQZXJzaXN0YWJsZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkKCkgeworCQlyZXR1cm4gISB0aGlzLmFubm90YXRpb25zLmlzRW1wdHkoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCisKKwlJTWVtYmVyIGdldE1lbWJlcigpIHsKKwkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRNZW1iZXIoKTsKKwl9CisKKwlwcml2YXRlIEFubm90YXRpb24gc2VsZWN0QW5ub3RhdGlvbk5hbWVkKEl0ZXJhYmxlPEFubm90YXRpb24+IGFubm90YXRpb25zLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgeworCQkJaWYgKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKSB7CisJCQkJcmV0dXJuIGFubm90YXRpb247CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogY29udmVuaWVuY2UgbWV0aG9kCisJICovCisJPFQgZXh0ZW5kcyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyPiBJdGVyYXRvcjxUPiBwZXJzaXN0YWJsZU1lbWJlcnMoSXRlcmF0b3I8VD4gbWVtYmVycykgeworCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFQsIFQ+KG1lbWJlcnMpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFQgbSkgeworCQkJCXJldHVybiBtLmlzUGVyc2lzdGFibGUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBTdHJpcCBvZmYgdGhlIHR5cGUgc2lnbmF0dXJlJ3MgcGFyYW1ldGVycyBpZiBwcmVzZW50LgorCSAqIENvbnZlcnQgdG8gYSByZWFkYWJsZSBzdHJpbmcuCisJICovCisJc3RhdGljIFN0cmluZyBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWUoU3RyaW5nIHR5cGVTaWduYXR1cmUpIHsKKwkJcmV0dXJuICh0eXBlU2lnbmF0dXJlID09IG51bGwpID8gbnVsbCA6IGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlTmFtZV8odHlwZVNpZ25hdHVyZSk7CisJfQorCisJLyoqCisJICogbm8gbnVsbCBjaGVjaworCSAqLworCXN0YXRpYyBTdHJpbmcgY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVOYW1lXyhTdHJpbmcgdHlwZVNpZ25hdHVyZSkgeworCQlyZXR1cm4gU2lnbmF0dXJlLnRvU3RyaW5nKFNpZ25hdHVyZS5nZXRUeXBlRXJhc3VyZSh0eXBlU2lnbmF0dXJlKSk7CisJfQorCisJcHJpdmF0ZSBJQW5ub3RhdGlvbltdIGdldEpkdEFubm90YXRpb25zKCkgeworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRBbm5vdGF0aW9ucygpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKKwkJCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsKKwkJCXJldHVybiBFTVBUWV9KRFRfQU5OT1RBVElPTl9BUlJBWTsKKwkJfQorCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJQW5ub3RhdGlvbltdIEVNUFRZX0pEVF9BTk5PVEFUSU9OX0FSUkFZID0gbmV3IElBbm5vdGF0aW9uWzBdOworCisKKwkvLyAqKioqKioqKioqIElNZW1iZXIgYWRhcHRlciAqKioqKioqKioqCisKKwlpbnRlcmZhY2UgQWRhcHRlciB7CisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIGFkYXB0ZXIncyBKRFQgbWVtYmVyIChJVHlwZSwgSUZpZWxkLCBJTWV0aG9kKS4KKwkJICovCisJCUlNZW1iZXIgZ2V0TWVtYmVyKCk7CisKKwkJLyoqCisJCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhZGFwdGVyJ3MgbWVtYmVyIGlzICJwZXJzaXN0YWJsZSIKKwkJICogKGkuZS4gYWNjb3JkaW5nIHRvIHRoZSBKUEEgc3BlYyB0aGUgbWVtYmVyIGNhbiBiZSBtYXBwZWQpCisJCSAqLworCQlib29sZWFuIGlzUGVyc2lzdGFibGUoKTsKKworCQkvKioKKwkJICogUmV0dXJuIHRoZSBhZGFwdGVyJ3MgbWVtYmVyJ3MgSkRUIGFubm90YXRpb25zLgorCQkgKi8KKwkJSUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJfQorCisKKwkvLyAqKioqKioqKioqIHVuc3VwcG9ydGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCQorCXB1YmxpYyBBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwkKKwlwdWJsaWMgQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgQW5ub3RhdGlvbkluaXRpYWxpemVyIGZvbykgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKAorCQkJaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbigKKwkJCWludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKAorCQkJaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwkKKwlwdWJsaWMgQW5ub3RhdGlvbiBzZXRQcmltYXJ5QW5ub3RhdGlvbigKKwkJCVN0cmluZyBwcmltYXJ5QW5ub3RhdGlvbk5hbWUsIFN0cmluZ1tdIHN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0ZvcihTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VycmVuY2UpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVBlcnNpc3RlbnRUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UGVyc2lzdGVudFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQ1YzE2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVBlcnNpc3RlbnRUeXBlLmphdmEKQEAgLTAsMCArMSw1NDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KUFRUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5NZXRob2RTaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOworCisvKioKKyAqIGJpbmFyeSBwZXJzaXN0ZW50IHR5cGUKKyAqLworZmluYWwgY2xhc3MgQmluYXJ5UGVyc2lzdGVudFR5cGUKKwlleHRlbmRzIEJpbmFyeVBlcnNpc3RlbnRNZW1iZXIKKwlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlCit7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworCXByaXZhdGUgU3RyaW5nIHF1YWxpZmllZE5hbWU7CisKKwlwcml2YXRlIFN0cmluZyBzdXBlcmNsYXNzUXVhbGlmaWVkTmFtZTsKKworCXByaXZhdGUgYm9vbGVhbiBhYnN0cmFjdF87ICAvLyAnYWJzdHJhY3QnIGlzIGEgcmVzZXJ2ZWQgd29yZAorCisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gZmllbGRzOworCisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gbWV0aG9kczsKKworCXByaXZhdGUgQWNjZXNzVHlwZSBhY2Nlc3M7CisKKworCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKKworCUJpbmFyeVBlcnNpc3RlbnRUeXBlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJVHlwZSB0eXBlKSB7CisJCXN1cGVyKHBhcmVudCwgbmV3IFR5cGVBZGFwdGVyKHR5cGUpKTsKKwkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKKwkJdGhpcy5xdWFsaWZpZWROYW1lID0gdGhpcy5idWlsZFF1YWxpZmllZE5hbWUoKTsKKwkJdGhpcy5zdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSA9IHRoaXMuYnVpbGRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSgpOworCQl0aGlzLmFic3RyYWN0XyA9IHRoaXMuYnVpbGRBYnN0cmFjdCgpOworCQl0aGlzLmZpZWxkcyA9IHRoaXMuYnVpbGRGaWVsZHMoKTsKKwkJdGhpcy5tZXRob2RzID0gdGhpcy5idWlsZE1ldGhvZHMoKTsKKwkJLy8gbmVlZCB0byB3YWl0IHVudGlsIGV2ZXJ5dGhpbmcgaXMgYnVpbHQgdG8gY2FsY3VsYXRlICdhY2Nlc3MnCisJCXRoaXMuYWNjZXNzID0gdGhpcy5idWlsZEFjY2VzcygpOworCX0KKworCisJLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXROYW1lKHRoaXMuYnVpbGROYW1lKCkpOworCQl0aGlzLnNldFF1YWxpZmllZE5hbWUodGhpcy5idWlsZFF1YWxpZmllZE5hbWUoKSk7CisJCXRoaXMuc2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUodGhpcy5idWlsZFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKCkpOworCQl0aGlzLnNldEFic3RyYWN0KHRoaXMuYnVpbGRBYnN0cmFjdCgpKTsKKwkJdGhpcy51cGRhdGVGaWVsZHMoKTsKKwkJdGhpcy51cGRhdGVNZXRob2RzKCk7CisJCS8vIG5lZWQgdG8gd2FpdCB1bnRpbCBldmVyeXRoaW5nIGlzIHVwZGF0ZWQgdG8gY2FsY3VsYXRlICdhY2Nlc3MnCisJCXRoaXMuc2V0QWNjZXNzKHRoaXMuYnVpbGRBY2Nlc3MoKSk7CisJfQorCisJLy8gVE9ETworCXByaXZhdGUgdm9pZCB1cGRhdGVGaWVsZHMoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vIFRPRE8KKwlwcml2YXRlIHZvaWQgdXBkYXRlTWV0aG9kcygpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQmluYXJ5UGVyc2lzdGVudE1lbWJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiB0aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkVHlwZUFubm90YXRpb24odGhpcywgamR0QW5ub3RhdGlvbik7CisJfQorCQorCUBPdmVycmlkZQorCUFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuYnVpbGROdWxsVHlwZUFubm90YXRpb24odGhpcywgYW5ub3RhdGlvbk5hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlJdGVyYXRvcjxTdHJpbmc+IHZhbGlkQW5ub3RhdGlvbk5hbWVzKCkgeworCQlyZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS50eXBlQW5ub3RhdGlvbk5hbWVzKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7CisJCXJldHVybiB0aGlzLmdldE1lbWJlcigpLmdldEVsZW1lbnROYW1lKCk7CisJfQorCisJLy8gKioqKiogcXVhbGlmaWVkIG5hbWUKKwlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnF1YWxpZmllZE5hbWU7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFF1YWxpZmllZE5hbWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMucXVhbGlmaWVkTmFtZTsKKwkJdGhpcy5xdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFFVQUxJRklFRF9OQU1FX1BST1BFUlRZLCBvbGQsIHF1YWxpZmllZE5hbWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkUXVhbGlmaWVkTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0TWVtYmVyKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJyk7ICAvLyBubyBwYXJhbWV0ZXJzIGFyZSBpbmNsdWRlZCBoZXJlCisJfQorCisJLy8gKioqKiogc3VwZXJjbGFzcyBxdWFsaWZpZWQgbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnN1cGVyY2xhc3NRdWFsaWZpZWROYW1lOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZShTdHJpbmcgc3VwZXJjbGFzc1F1YWxpZmllZE5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuc3VwZXJjbGFzc1F1YWxpZmllZE5hbWU7CisJCXRoaXMuc3VwZXJjbGFzc1F1YWxpZmllZE5hbWUgPSBzdXBlcmNsYXNzUXVhbGlmaWVkTmFtZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNVUEVSQ0xBU1NfUVVBTElGSUVEX05BTUVfUFJPUEVSVFksIG9sZCwgc3VwZXJjbGFzc1F1YWxpZmllZE5hbWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkU3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKSB7CisJCXJldHVybiBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWUodGhpcy5nZXRTdXBlcmNsYXNzVHlwZVNpZ25hdHVyZSgpKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRTdXBlcmNsYXNzVHlwZVNpZ25hdHVyZSgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmdldE1lbWJlcigpLmdldFN1cGVyY2xhc3NUeXBlU2lnbmF0dXJlKCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvLyAqKioqKiBhYnN0cmFjdAorCXB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKSB7CisJCXJldHVybiB0aGlzLmFic3RyYWN0XzsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0QWJzdHJhY3QoYm9vbGVhbiBhYnN0cmFjdF8pIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLmFic3RyYWN0XzsKKwkJdGhpcy5hYnN0cmFjdF8gPSBhYnN0cmFjdF87CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBQlNUUkFDVF9QUk9QRVJUWSwgb2xkLCBhYnN0cmFjdF8pOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBidWlsZEFic3RyYWN0KCkgeworCQl0cnkgeworCQkJcmV0dXJuIEZsYWdzLmlzQWJzdHJhY3QodGhpcy5nZXRNZW1iZXIoKS5nZXRGbGFncygpKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQlKcHRDb3JlUGx1Z2luLmxvZyhleCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwkvLyAqKioqKiBhY2Nlc3MKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiB0aGlzLmFjY2VzczsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgYWNjZXNzKSB7CisJCUFjY2Vzc1R5cGUgb2xkID0gdGhpcy5hY2Nlc3M7CisJCXRoaXMuYWNjZXNzID0gYWNjZXNzOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUNDRVNTX1BST1BFUlRZLCBvbGQsIGFjY2Vzcyk7CisJfQorCisJcHJpdmF0ZSBBY2Nlc3NUeXBlIGJ1aWxkQWNjZXNzKCkgeworCQlyZXR1cm4gSlBUVG9vbHMuYnVpbGRBY2Nlc3ModGhpcyk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzTWFwcGVkKCkgeworCQlmb3IgKEFubm90YXRpb24gZWFjaCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbm5vdGF0aW9ucygpKSkgeworCQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucygKKwkJCQkJZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkudHlwZU1hcHBpbmdBbm5vdGF0aW9uTmFtZXMoKSwgCisJCQkJCWVhY2guZ2V0QW5ub3RhdGlvbk5hbWUoKSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIGNoZWNrIG9ubHkgcGVyc2lzdGFibGUgYXR0cmlidXRlcworCSAqLworCXB1YmxpYyBib29sZWFuIGhhc0FueUFubm90YXRlZEF0dHJpYnV0ZXMoKSB7CisJCWZvciAoSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gdGhpcy5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlpZiAoc3RyZWFtLm5leHQoKS5pc0Fubm90YXRlZCgpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJVHlwZSBnZXRNZW1iZXIoKSB7CisJCXJldHVybiAoSVR5cGUpIHN1cGVyLmdldE1lbWJlcigpOworCX0KKworCisJLy8gKioqKioqKioqKiBmaWVsZHMgKioqKioqKioqKgorCisJcHVibGljIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGZpZWxkcygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKTsKKwl9CisKKwlwcml2YXRlIEl0ZXJhYmxlPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEZpZWxkcygpIHsKKwkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLmZpZWxkcyk7CisJfQorCisJcHVibGljIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHBlcnNpc3RhYmxlRmllbGRzKCkgeworCQlyZXR1cm4gdGhpcy5wZXJzaXN0YWJsZU1lbWJlcnModGhpcy5maWVsZHMoKSk7CisJfQorCQorCXB1YmxpYyBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBwZXJzaXN0YWJsZUZpZWxkc1dpdGhTcGVjaWZpZWRGaWVsZEFjY2VzcygpIHsKKwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLnBlcnNpc3RhYmxlRmllbGRzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUpIHsKKwkJCQlyZXR1cm4gcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkgPT0gQWNjZXNzVHlwZS5GSUVMRDsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZEZpZWxkKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgZmllbGQpIHsKKwkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKGZpZWxkLCB0aGlzLmZpZWxkcywgRklFTERTX0NPTExFQ1RJT04pOworCX0KKworCXByaXZhdGUgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRGaWVsZChTdHJpbmcgZmllbGROYW1lLCBpbnQgb2NjdXJyZW5jZSkgeworCQlmb3IgKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgZmllbGQgOiB0aGlzLmdldEZpZWxkcygpKSB7CisJCQlpZiAoZmllbGQuaXNGb3IoZmllbGROYW1lLCBvY2N1cnJlbmNlKSkgeworCQkJCXJldHVybiBmaWVsZDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVtb3ZlRmllbGRzKENvbGxlY3Rpb248SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcmVtb3ZlKSB7CisJCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmUsIHRoaXMuZmllbGRzLCBGSUVMRFNfQ09MTEVDVElPTik7CisJfQorCisJcHJpdmF0ZSBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGRGaWVsZHMoKSB7CisJCUlGaWVsZFtdIGpkdEZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzKHRoaXMuZ2V0TWVtYmVyKCkpOworCQlWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcmVzdWx0ID0gbmV3IFZlY3RvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPihqZHRGaWVsZHMubGVuZ3RoKTsKKwkJZm9yIChJRmllbGQgamR0RmllbGQgOiBqZHRGaWVsZHMpIHsKKwkJCXJlc3VsdC5hZGQodGhpcy5idWlsZEZpZWxkKGpkdEZpZWxkKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIElGaWVsZFtdIGdldEZpZWxkcyhJVHlwZSB0eXBlKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gdHlwZS5nZXRGaWVsZHMoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQlKcHRDb3JlUGx1Z2luLmxvZyhleCk7CisJCQlyZXR1cm4gRU1QVFlfRklFTERfQVJSQVk7CisJCX0KKwl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpZWxkW10gRU1QVFlfRklFTERfQVJSQVkgPSBuZXcgSUZpZWxkWzBdOworCisJcHJpdmF0ZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkRmllbGQoSUZpZWxkIGpkdEZpZWxkKSB7CisJCXJldHVybiBuZXcgQmluYXJ5UGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLCBqZHRGaWVsZCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIG1ldGhvZHMgKioqKioqKioqKgorCisJcHVibGljIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG1ldGhvZHMoKSB7CisJCXJldHVybiB0aGlzLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpOworCX0KKworCXByaXZhdGUgSXRlcmFibGU8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0TWV0aG9kcygpIHsKKwkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLm1ldGhvZHMpOworCX0KKworCXB1YmxpYyBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBwZXJzaXN0YWJsZVByb3BlcnRpZXMoKSB7CisJCXJldHVybiBwZXJzaXN0YWJsZU1lbWJlcnModGhpcy5tZXRob2RzKCkpOworCX0KKwkKKwlwdWJsaWMgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcGVyc2lzdGFibGVQcm9wZXJ0aWVzV2l0aFNwZWNpZmllZFByb3BlcnR5QWNjZXNzKCkgeworCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMucGVyc2lzdGFibGVQcm9wZXJ0aWVzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUpIHsKKwkJCQlyZXR1cm4gcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkgPT0gQWNjZXNzVHlwZS5QUk9QRVJUWTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0TWV0aG9kKE1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUsIGludCBvY2N1cnJlbmNlKSB7CisJCWZvciAoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBtZXRob2QgOiB0aGlzLmdldE1ldGhvZHMoKSkgeworCQkJaWYgKG1ldGhvZC5pc0ZvcihzaWduYXR1cmUsIG9jY3VycmVuY2UpKSB7CisJCQkJcmV0dXJuIG1ldGhvZDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkTWV0aG9kKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgbWV0aG9kKSB7CisJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihtZXRob2QsIHRoaXMubWV0aG9kcywgTUVUSE9EU19DT0xMRUNUSU9OKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVtb3ZlTWV0aG9kcyhDb2xsZWN0aW9uPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHJlbW92ZSkgeworCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocmVtb3ZlLCB0aGlzLm1ldGhvZHMsIE1FVEhPRFNfQ09MTEVDVElPTik7CisJfQorCisJcHJpdmF0ZSBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGRNZXRob2RzKCkgeworCQlJTWV0aG9kW10gamR0TWV0aG9kcyA9IHRoaXMuZ2V0TWV0aG9kcyh0aGlzLmdldE1lbWJlcigpKTsKKwkJVmVjdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHJlc3VsdCA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4oamR0TWV0aG9kcy5sZW5ndGgpOworCQlmb3IgKElNZXRob2QgamR0TWV0aG9kIDogamR0TWV0aG9kcykgeworCQkJcmVzdWx0LmFkZCh0aGlzLmJ1aWxkTWV0aG9kKGpkdE1ldGhvZCkpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBJTWV0aG9kW10gZ2V0TWV0aG9kcyhJVHlwZSB0eXBlKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gdHlwZS5nZXRNZXRob2RzKCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJcmV0dXJuIEVNUFRZX01FVEhPRF9BUlJBWTsKKwkJfQorCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTWV0aG9kW10gRU1QVFlfTUVUSE9EX0FSUkFZID0gbmV3IElNZXRob2RbMF07CisKKwlwcml2YXRlIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRNZXRob2QoSU1ldGhvZCBqZHRNZXRob2QpIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlQZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMsIGpkdE1ldGhvZCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIGF0dHJpYnV0ZXMgKioqKioqKioqKgorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHBlcnNpc3RhYmxlQXR0cmlidXRlcygpIHsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPigKKwkJCQl0aGlzLnBlcnNpc3RhYmxlRmllbGRzKCksCisJCQkJdGhpcy5wZXJzaXN0YWJsZVByb3BlcnRpZXMoKQorCQkJKTsKKwl9CisJCisJcHVibGljIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHBlcnNpc3RhYmxlQXR0cmlidXRlcyhBY2Nlc3NUeXBlIHNwZWNpZmllZEFjY2VzcykgeworCQlpZiAoc3BlY2lmaWVkQWNjZXNzID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNwZWNpZmllZCBhY2Nlc3MgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIChzcGVjaWZpZWRBY2Nlc3MgPT0gQWNjZXNzVHlwZS5GSUVMRCkgPworCQkJCQl0aGlzLnBlcnNpc3RhYmxlQXR0cmlidXRlc0ZvckZpZWxkQWNjZXNzVHlwZSgpIDoKKwkJCQkJdGhpcy5wZXJzaXN0YWJsZUF0dHJpYnV0ZXNGb3JQcm9wZXJ0eUFjY2Vzc1R5cGUoKTsKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBwZXJzaXN0YWJsZUF0dHJpYnV0ZXNGb3JGaWVsZEFjY2Vzc1R5cGUoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4oCisJCQkJdGhpcy5wZXJzaXN0YWJsZUZpZWxkcygpLAorCQkJCXRoaXMucGVyc2lzdGFibGVQcm9wZXJ0aWVzV2l0aFNwZWNpZmllZFByb3BlcnR5QWNjZXNzKCkKKwkJCSk7CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByaXZhdGUgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcGVyc2lzdGFibGVBdHRyaWJ1dGVzRm9yUHJvcGVydHlBY2Nlc3NUeXBlKCkgeworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+KAorCQkJCXRoaXMucGVyc2lzdGFibGVQcm9wZXJ0aWVzKCksCisJCQkJdGhpcy5wZXJzaXN0YWJsZUZpZWxkc1dpdGhTcGVjaWZpZWRGaWVsZEFjY2VzcygpCisJCQkpOworCX0KKwkKKworCS8vICoqKioqKioqKiogSVR5cGUgYWRhcHRlciAqKioqKioqKioqCisKKwlzdGF0aWMgY2xhc3MgVHlwZUFkYXB0ZXIgaW1wbGVtZW50cyBBZGFwdGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBJVHlwZSB0eXBlOworCisJCVR5cGVBZGFwdGVyKElUeXBlIHR5cGUpIHsKKwkJCXN1cGVyKCk7CisJCQl0aGlzLnR5cGUgPSB0eXBlOworCQl9CisKKwkJcHVibGljIElUeXBlIGdldE1lbWJlcigpIHsKKwkJCXJldHVybiB0aGlzLnR5cGU7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RhYmxlKCkgeworCQkJcmV0dXJuIHRydWU7ICAvLyB3ZSBvbmx5IGJ1aWxkIGEgSkFSIHR5cGUgaWYgaXQgaXMgInBlcnNpc3RhYmxlIgorCQl9CisKKwkJcHVibGljIElBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJCXJldHVybiB0aGlzLnR5cGUuZ2V0QW5ub3RhdGlvbnMoKTsKKwkJfQorCisJfQorCisKKwkvLyAqKioqKioqKioqICJwZXJzaXN0YWJsZSIgY2hlY2sgKioqKioqKioqKgorCisJc3RhdGljIGJvb2xlYW4gdHlwZUlzUGVyc2lzdGFibGUoSVR5cGUgdHlwZSkgeworCQlyZXR1cm4gKHR5cGUgIT0gbnVsbCkKKwkJCQkmJiB0eXBlLmV4aXN0cygpCisJCQkJJiYgSlBUVG9vbHMudHlwZUlzUGVyc2lzdGFibGUobmV3IEpQVFRvb2xzQWRhcHRlcih0eXBlKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEpQVCB0b29scyBhZGFwdGVyICoqKioqKioqKioKKworCS8qKgorCSAqIEpQVFRvb2xzIG5lZWRzIGFuIGFkYXB0ZXIgc28gaXQgY2FuIHdvcmsgd2l0aCBlaXRoZXIgYW4gSVR5cGUKKwkgKiBvciBhbiBJVHlwZUJpbmRpbmcgZXRjLgorCSAqLworCXN0YXRpYyBjbGFzcyBKUFRUb29sc0FkYXB0ZXIgaW1wbGVtZW50cyBKUFRUb29scy5UeXBlQWRhcHRlciB7CisJCXByaXZhdGUgZmluYWwgSVR5cGUgdHlwZTsKKworCQlwcm90ZWN0ZWQgSlBUVG9vbHNBZGFwdGVyKElUeXBlIHR5cGUpIHsKKwkJCXN1cGVyKCk7CisJCQlpZiAodHlwZSA9PSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCQl9CisJCQl0aGlzLnR5cGUgPSB0eXBlOworCQl9CisKKwkJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisJCQl0cnkgeworCQkJCXJldHVybiB0aGlzLnR5cGUuZ2V0RmxhZ3MoKTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvbigpIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIHRoaXMudHlwZS5pc0Fubm90YXRpb24oKTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIHRoaXMudHlwZS5pc0Fub255bW91cygpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7CisJCQlyZXR1cm4gZmFsc2U7ICAvLyA/Pz8KKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzRW51bSgpIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIHRoaXMudHlwZS5pc0VudW0oKTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIHRoaXMudHlwZS5pc0ludGVyZmFjZSgpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzTG9jYWwoKSB7CisJCQl0cnkgeworCQkJCXJldHVybiB0aGlzLnR5cGUuaXNMb2NhbCgpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzTWVtYmVyKCkgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gdGhpcy50eXBlLmlzTWVtYmVyKCk7CisJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKKwkJCQlKcHRDb3JlUGx1Z2luLmxvZyhleCk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7CisJCQlyZXR1cm4gZmFsc2U7ICAvLyA/Pz8KKwkJfQorCQorCX0KKworCisJLy8gKioqKioqKioqKiB1bnN1cHBvcnRlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IHR5cGVzKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IGFsbFR5cGVzKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IHBlcnNpc3RhYmxlVHlwZXMoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVBlcnNpc3RlbnRUeXBlQ2FjaGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlQZXJzaXN0ZW50VHlwZUNhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxYjhhMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlQZXJzaXN0ZW50VHlwZUNhY2hlLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlQ2FjaGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworCisvKioKKyAqIGNhY2hlIHVzZWQgdG8gaG9sZCBiaW5hcnkgImV4dGVybmFsIiBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZXMKKyAqICh0eXBpY2FsbHkgZGVyaXZlZCBmcm9tIEpBUnMgb24gdGhlIHByb2plY3QncyBidWlsZCBwYXRoKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5UGVyc2lzdGVudFR5cGVDYWNoZQorCWV4dGVuZHMgUm9vdEJpbmFyeU5vZGUKKwlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlQ2FjaGUKK3sKKwkvKiogcG9wdWxhdGVkIG9uLWRlbWFuZCAqLworCXByaXZhdGUgZmluYWwgVmVjdG9yPEVudHJ5PiBlbnRyaWVzID0gbmV3IFZlY3RvcjxFbnRyeT4oKTsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgorCisJcHVibGljIEJpbmFyeVBlcnNpc3RlbnRUeXBlQ2FjaGUoSnBhQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlcikgeworCQlzdXBlcihudWxsLCBhbm5vdGF0aW9uUHJvdmlkZXIpOworCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlLlJvb3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiBwZXJzaXN0ZW50VHlwZXMoKSB7CisJCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCk7CisJfQorCisJcHJpdmF0ZSBJdGVyYWJsZTxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gZ2V0UGVyc2lzdGVudFR5cGVzKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8RW50cnksIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPih0aGlzLmdldEVudHJpZXMoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHJhbnNmb3JtKEVudHJ5IGVudHJ5KSB7CisJCQkJcmV0dXJuIGVudHJ5LnBlcnNpc3RlbnRUeXBlOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgSXRlcmFibGU8RW50cnk+IGdldEVudHJpZXMoKSB7CisJCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8RW50cnk+KHRoaXMuZW50cmllcyk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlQ2FjaGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIGludCBwZXJzaXN0ZW50VHlwZXNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5lbnRyaWVzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgYWRkUGVyc2lzdGVudFR5cGUoSVR5cGUgamR0VHlwZSkgeworCQlFbnRyeSBlbnRyeSA9IHRoaXMuYnVpbGRFbnRyeShqZHRUeXBlKTsKKwkJdGhpcy5lbnRyaWVzLmFkZChlbnRyeSk7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChQRVJTSVNURU5UX1RZUEVTX0NPTExFQ1RJT04sIGVudHJ5LnBlcnNpc3RlbnRUeXBlKTsKKwkJcmV0dXJuIGVudHJ5LnBlcnNpc3RlbnRUeXBlOworCX0KKworCXByaXZhdGUgRW50cnkgYnVpbGRFbnRyeShJVHlwZSBqZHRUeXBlKSB7CisJCXJldHVybiBuZXcgRW50cnkodGhpcy5idWlsZFBlcnNpc3RlbnRUeXBlKGpkdFR5cGUpLCBqZHRUeXBlLmdldFJlc291cmNlKCkpOworCX0KKworCXByaXZhdGUgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgYnVpbGRQZXJzaXN0ZW50VHlwZShJVHlwZSBqZHRUeXBlKSB7CisJCXJldHVybiBuZXcgQmluYXJ5UGVyc2lzdGVudFR5cGUodGhpcywgamR0VHlwZSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gcmVtb3ZlUGVyc2lzdGVudFR5cGVzKElGaWxlIGphckZpbGUpIHsKKwkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOworCQlmb3IgKEVudHJ5IGVudHJ5IDogdGhpcy5nZXRFbnRyaWVzKCkpIHsKKwkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGVudHJ5LnJlc291cmNlOworCQkJaWYgKChyZXNvdXJjZSAhPSBudWxsKSAmJiByZXNvdXJjZS5lcXVhbHMoamFyRmlsZSkpIHsKKwkJCQl0aGlzLnJlbW92ZUVudHJ5KGVudHJ5KTsKKwkJCQltb2RpZmllZCA9IHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG1vZGlmaWVkOworCX0KKworCXByaXZhdGUgdm9pZCByZW1vdmVFbnRyeShFbnRyeSBlbnRyeSkgeworCQl0aGlzLmVudHJpZXMucmVtb3ZlKGVudHJ5KTsKKwkJdGhpcy5maXJlSXRlbVJlbW92ZWQoUEVSU0lTVEVOVF9UWVBFU19DT0xMRUNUSU9OLCBlbnRyeS5wZXJzaXN0ZW50VHlwZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCisKKwkvKioKKwkgKiBJZ25vcmUgY2hhbmdlcyB0byB0aGlzIGNvbGxlY3Rpb24uIEFkZHMgY2FuIGJlIGlnbm9yZWQgc2luY2UgdGhleSBhcmUgdHJpZ2dlcmVkCisJICogYnkgcmVxdWVzdHMgdGhhdCB3aWxsLCB0aGVtc2VsdmVzLCB0cmlnZ2VyIHVwZGF0ZXMgKHR5cGljYWxseSBkdXJpbmcgdGhlCisJICogdXBkYXRlIG9mIGFuIG9iamVjdCB0aGF0IGNhbGxzIGEgc2V0dGVyIHdpdGggdGhlIG5ld2x5LWNyZWF0ZWQgcmVzb3VyY2UKKwkgKiB0eXBlKS4gRGVsZXRlcyB3aWxsIGJlIGFjY29tcGFuaWVkIGJ5IG1hbnVhbCB1cGRhdGVzLgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKKwkJaWYgKChhc3BlY3ROYW1lICE9IG51bGwpICYmICEgYXNwZWN0TmFtZS5lcXVhbHMoUEVSU0lTVEVOVF9UWVBFU19DT0xMRUNUSU9OKSkgeworCQkJc3VwZXIuYXNwZWN0Q2hhbmdlZChhc3BlY3ROYW1lKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMuZW50cmllcyk7CisJfQorCisKKwkvLyAqKioqKioqKioqIGNhY2hlIGVudHJ5ICoqKioqKioqKioKKworCS8qKgorCSAqIEFzc29jaWF0ZSBhIHBlcnNpc3RlbnQgdHlwZSB3aXRoIGl0cyByZXNvdXJjZS4KKwkgKiBUaGlzIHdpbGwgYmUgYSBKQVIgaW4gdGhlIGNhc2Ugb2YgYSB0eXBlIGxvYWRlZCBmcm9tIGEgSkFSIHRoYXQgaXMgaW4KKwkgKiB0aGUgRWNsaXBzZSB3b3Jrc3BhY2UuIFRoZSByZXNvdXJjZSB3aWxsIGJlIG51bGwgZm9yIGEgdHlwZSBsb2FkZWQKKwkgKiBmcm9tIGEgSkFSIG9yIGNsYXNzIGRpcmVjdG9yeSBvdXRzaWRlIG9mIHRoZSB3b3Jrc3BhY2UuCisJICovCisJc3RhdGljIGNsYXNzIEVudHJ5IHsKKwkJZmluYWwgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGU7CisJCWZpbmFsIElSZXNvdXJjZSByZXNvdXJjZTsKKworCQlFbnRyeShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSwgSVJlc291cmNlIHJlc291cmNlKSB7CisJCQlzdXBlcigpOworCQkJdGhpcy5wZXJzaXN0ZW50VHlwZSA9IHBlcnNpc3RlbnRUeXBlOworCQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnBlcnNpc3RlbnRUeXBlKTsKKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhNjQwMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlOYW1lZENvbHVtbkFubm90YXRpb24KKwlpbXBsZW1lbnRzIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWU7CisKKworCXB1YmxpYyBCaW5hcnlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZV8odGhpcy5idWlsZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBBYnN0cmFjdE5hbWVkQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb25FbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047CisJfQorCisKKwkvLyAqKioqKioqKioqIFByaW1hcnlLZXlKb2luQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUKKwlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lXyhTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWU7CisJCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUgPSByZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgcmVmZXJlbmNlZENvbHVtbk5hbWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTUxZGJjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbnMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUNvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+CisJaW1wbGVtZW50cyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8TmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IHBrSm9pbkNvbHVtbnM7CisKKworCXB1YmxpYyBCaW5hcnlQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMucGtKb2luQ29sdW1ucyA9IHRoaXMuYnVpbGRQa0pvaW5Db2x1bW5zKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBuZXN0ZWRBbm5vdGF0aW9ucygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5wa0pvaW5Db2x1bW5zKTsKKwl9CisKKwlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMucGtKb2luQ29sdW1ucy5zaXplKCk7CisJfQorCisJcHJpdmF0ZSBWZWN0b3I8TmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IGJ1aWxkUGtKb2luQ29sdW1ucygpIHsKKwkJT2JqZWN0W10gamR0Sm9pbkNvbHVtbnMgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyhKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX19WQUxVRSk7CisJCVZlY3RvcjxOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gcmVzdWx0ID0gbmV3IFZlY3RvcjxOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4oamR0Sm9pbkNvbHVtbnMubGVuZ3RoKTsKKwkJZm9yIChPYmplY3QgamR0Sm9pbkNvbHVtbiA6IGpkdEpvaW5Db2x1bW5zKSB7CisJCQlyZXN1bHQuYWRkKG5ldyBCaW5hcnlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24odGhpcywgKElBbm5vdGF0aW9uKSBqZHRKb2luQ29sdW1uKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnVwZGF0ZVBrSm9pbkNvbHVtbnMoKTsKKwl9CisKKwkvLyBUT0RPCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVBrSm9pbkNvbHVtbnMoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQorCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UXVlcnlIaW50QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVF1ZXJ5SGludEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Y3NjU4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVF1ZXJ5SGludEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUXVlcnlIaW50QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5RdWVyeUhpbnQKKyAqLworY2xhc3MgQmluYXJ5UXVlcnlIaW50QW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgUXVlcnlIaW50QW5ub3RhdGlvbgoreworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKworCUJpbmFyeVF1ZXJ5SGludEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKKwkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXROYW1lXyh0aGlzLmJ1aWxkTmFtZSgpKTsKKwkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIFF1ZXJ5SGludEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5RVUVSWV9ISU5UX19OQU1FKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogdmFsdWUKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuUVVFUllfSElOVF9fVkFMVUUpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYTZlMTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDIxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5DYXNjYWRlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5SZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb01hbnkKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZQorICogamF2YXgucGVyc2lzdGVuY2UuT25lVG9NYW55CisgKiBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZQorICovCithYnN0cmFjdCBjbGFzcyBCaW5hcnlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KK3sKKwlTdHJpbmcgdGFyZ2V0RW50aXR5OworCUZldGNoVHlwZSBmZXRjaDsKKwlib29sZWFuIGNhc2NhZGVBbGw7CisJYm9vbGVhbiBjYXNjYWRlTWVyZ2U7CisJYm9vbGVhbiBjYXNjYWRlUGVyc2lzdDsKKwlib29sZWFuIGNhc2NhZGVSZWZyZXNoOworCWJvb2xlYW4gY2FzY2FkZVJlbW92ZTsKKworCisJQmluYXJ5UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy50YXJnZXRFbnRpdHkgPSB0aGlzLmJ1aWxkVGFyZ2V0RW50aXR5KCk7CisJCXRoaXMuZmV0Y2ggPSB0aGlzLmJ1aWxkRmV0Y2goKTsKKworCQlDYXNjYWRlVHlwZVtdIGNhc2NhZGVUeXBlcyA9IHRoaXMuYnVpbGRDYXNjYWRlVHlwZXMoKTsKKwkJdGhpcy5jYXNjYWRlQWxsID0gQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLkFMTCk7CisJCXRoaXMuY2FzY2FkZU1lcmdlID0gQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLk1FUkdFKTsKKwkJdGhpcy5jYXNjYWRlUGVyc2lzdCA9IEFycmF5VG9vbHMuY29udGFpbnMoY2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5QRVJTSVNUKTsKKwkJdGhpcy5jYXNjYWRlUmVmcmVzaCA9IEFycmF5VG9vbHMuY29udGFpbnMoY2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5SRUZSRVNIKTsKKwkJdGhpcy5jYXNjYWRlUmVtb3ZlID0gQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlJFTU9WRSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRUYXJnZXRFbnRpdHlfKHRoaXMuYnVpbGRUYXJnZXRFbnRpdHkoKSk7CisJCXRoaXMuc2V0RmV0Y2hfKHRoaXMuYnVpbGRGZXRjaCgpKTsKKworCQlDYXNjYWRlVHlwZVtdIGNhc2NhZGVUeXBlcyA9IHRoaXMuYnVpbGRDYXNjYWRlVHlwZXMoKTsKKwkJdGhpcy5zZXRDYXNjYWRlQWxsXyhBcnJheVRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuQUxMKSk7CisJCXRoaXMuc2V0Q2FzY2FkZU1lcmdlXyhBcnJheVRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuTUVSR0UpKTsKKwkJdGhpcy5zZXRDYXNjYWRlUGVyc2lzdF8oQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlBFUlNJU1QpKTsKKwkJdGhpcy5zZXRDYXNjYWRlUmVmcmVzaF8oQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlJFRlJFU0gpKTsKKwkJdGhpcy5zZXRDYXNjYWRlUmVtb3ZlXyhBcnJheVRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuUkVNT1ZFKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHRhcmdldCBlbnRpdHkKKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIHRoaXMudGFyZ2V0RW50aXR5OworCX0KKworCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdGFyZ2V0RW50aXR5KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRUYXJnZXRFbnRpdHlfKFN0cmluZyB0YXJnZXRFbnRpdHkpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudGFyZ2V0RW50aXR5OworCQl0aGlzLnRhcmdldEVudGl0eSA9IHRhcmdldEVudGl0eTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBUkdFVF9FTlRJVFlfUFJPUEVSVFksIG9sZCwgdGFyZ2V0RW50aXR5KTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9UQVJHRVRfRU5USVRZX0NMQVNTX05BTUVfUFJPUEVSVFksIG9sZCwgdGFyZ2V0RW50aXR5KTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRUYXJnZXRFbnRpdHlFbGVtZW50TmFtZSgpKTsKKwl9CisKKwlhYnN0cmFjdCBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5RWxlbWVudE5hbWUoKTsKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCB0YXJnZXQgZW50aXR5IGNsYXNzIG5hbWUKKwlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkgeworCQlyZXR1cm4gdGhpcy50YXJnZXRFbnRpdHk7CisJfQorCisJLy8gKioqKiogZmV0Y2gKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgeworCQlyZXR1cm4gdGhpcy5mZXRjaDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEZldGNoXyhGZXRjaFR5cGUgZmV0Y2gpIHsKKwkJRmV0Y2hUeXBlIG9sZCA9IHRoaXMuZmV0Y2g7CisJCXRoaXMuZmV0Y2ggPSBmZXRjaDsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKKwl9CisKKwlwcml2YXRlIEZldGNoVHlwZSBidWlsZEZldGNoKCkgeworCQlyZXR1cm4gRmV0Y2hUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRGZXRjaEVsZW1lbnROYW1lKCkpKTsKKwl9CisKKwlhYnN0cmFjdCBTdHJpbmcgZ2V0RmV0Y2hFbGVtZW50TmFtZSgpOworCisJcHVibGljIFRleHRSYW5nZSBnZXRGZXRjaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKiBjYXNjYWRlCisJcHJpdmF0ZSBDYXNjYWRlVHlwZVtdIGJ1aWxkQ2FzY2FkZVR5cGVzKCkgeworCQlyZXR1cm4gQ2FzY2FkZVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVzKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKHRoaXMuZ2V0Q2FzY2FkZUVsZW1lbnROYW1lKCkpKTsKKwl9CisKKwlhYnN0cmFjdCBTdHJpbmcgZ2V0Q2FzY2FkZUVsZW1lbnROYW1lKCk7CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENhc2NhZGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogY2FzY2FkZSBhbGwKKwlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVBbGwoKSB7CisJCXJldHVybiB0aGlzLmNhc2NhZGVBbGw7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FzY2FkZUFsbChib29sZWFuIGNhc2NhZGVBbGwpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldENhc2NhZGVBbGxfKGJvb2xlYW4gY2FzY2FkZUFsbCkgeworCQlib29sZWFuIG9sZCA9IHRoaXMuY2FzY2FkZUFsbDsKKwkJdGhpcy5jYXNjYWRlQWxsID0gY2FzY2FkZUFsbDsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfQUxMX1BST1BFUlRZLCBvbGQsIGNhc2NhZGVBbGwpOworCX0KKworCS8vICoqKioqIGNhc2NhZGUgbWVyZ2UKKwlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVNZXJnZSgpIHsKKwkJcmV0dXJuIHRoaXMuY2FzY2FkZU1lcmdlOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhc2NhZGVNZXJnZShib29sZWFuIGNhc2NhZGVNZXJnZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0Q2FzY2FkZU1lcmdlXyhib29sZWFuIGNhc2NhZGVNZXJnZSkgeworCQlib29sZWFuIG9sZCA9IHRoaXMuY2FzY2FkZU1lcmdlOworCQl0aGlzLmNhc2NhZGVNZXJnZSA9IGNhc2NhZGVNZXJnZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfTUVSR0VfUFJPUEVSVFksIG9sZCwgY2FzY2FkZU1lcmdlKTsKKwl9CisKKwkvLyAqKioqKiBjYXNjYWRlIHBlcnNpc3QKKwlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVQZXJzaXN0KCkgeworCQlyZXR1cm4gdGhpcy5jYXNjYWRlUGVyc2lzdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlUGVyc2lzdChib29sZWFuIGNhc2NhZGVQZXJzaXN0KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRDYXNjYWRlUGVyc2lzdF8oYm9vbGVhbiBjYXNjYWRlUGVyc2lzdCkgeworCQlib29sZWFuIG9sZCA9IHRoaXMuY2FzY2FkZVBlcnNpc3Q7CisJCXRoaXMuY2FzY2FkZVBlcnNpc3QgPSBjYXNjYWRlUGVyc2lzdDsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfUEVSU0lTVF9QUk9QRVJUWSwgb2xkLCBjYXNjYWRlUGVyc2lzdCk7CisJfQorCisJLy8gKioqKiogY2FzY2FkZSByZWZyZXNoCisJcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUmVmcmVzaCgpIHsKKwkJcmV0dXJuIHRoaXMuY2FzY2FkZVJlZnJlc2g7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FzY2FkZVJlZnJlc2goYm9vbGVhbiBjYXNjYWRlUmVmcmVzaCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0Q2FzY2FkZVJlZnJlc2hfKGJvb2xlYW4gY2FzY2FkZVJlZnJlc2gpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLmNhc2NhZGVSZWZyZXNoOworCQl0aGlzLmNhc2NhZGVSZWZyZXNoID0gY2FzY2FkZVJlZnJlc2g7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQVNDQURFX1JFRlJFU0hfUFJPUEVSVFksIG9sZCwgY2FzY2FkZVJlZnJlc2gpOworCX0KKworCS8vICoqKioqIGNhc2NhZGUgcmVtb3ZlCisJcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUmVtb3ZlKCkgeworCQlyZXR1cm4gdGhpcy5jYXNjYWRlUmVtb3ZlOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhc2NhZGVSZW1vdmUoYm9vbGVhbiBjYXNjYWRlUmVtb3ZlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRDYXNjYWRlUmVtb3ZlXyhib29sZWFuIGNhc2NhZGVSZW1vdmUpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLmNhc2NhZGVSZW1vdmU7CisJCXRoaXMuY2FzY2FkZVJlbW92ZSA9IGNhc2NhZGVSZW1vdmU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQVNDQURFX1JFTU9WRV9QUk9QRVJUWSwgb2xkLCBjYXNjYWRlUmVtb3ZlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDhlYWExCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlNlY29uZGFyeVRhYmxlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUJhc2VUYWJsZUFubm90YXRpb24KKwlpbXBsZW1lbnRzIE5lc3RhYmxlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zOworCisJcHVibGljIEJpbmFyeVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLnBrSm9pbkNvbHVtbnMgPSB0aGlzLmJ1aWxkUGtKb2luQ29sdW1ucygpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy51cGRhdGVQa0pvaW5Db2x1bW5zKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEJpbmFyeUJhc2VUYWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5TRUNPTkRBUllfVEFCTEVfX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldFNjaGVtYUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLlNFQ09OREFSWV9UQUJMRV9fU0NIRU1BOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRDYXRhbG9nRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuU0VDT05EQVJZX1RBQkxFX19DQVRBTE9HOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRVbmlxdWVDb25zdHJhaW50RWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuU0VDT05EQVJZX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7CisJfQorCisKKwkvLyAqKioqKioqKioqKioqIFNlY29uZGFyeVRhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioKKworCS8vICoqKioqIHBrIGpvaW4gY29sdW1ucworCXB1YmxpYyBMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5wa0pvaW5Db2x1bW5zKTsKKwl9CisKKwlwdWJsaWMgaW50IHBrSm9pbkNvbHVtbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5wa0pvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtbkF0KGludCBpbmRleCkgeworCQlyZXR1cm4gdGhpcy5wa0pvaW5Db2x1bW5zLmdldChpbmRleCk7CisJfQorCisJcHVibGljIGludCBpbmRleE9mUGtKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW4pIHsKKwkJcmV0dXJuIHRoaXMucGtKb2luQ29sdW1ucy5pbmRleE9mKHBrSm9pbkNvbHVtbik7CisJfQorCisJcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRQa0pvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVQa0pvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlUGtKb2luQ29sdW1uKGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIFZlY3RvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IGJ1aWxkUGtKb2luQ29sdW1ucygpIHsKKwkJT2JqZWN0W10gamR0Sm9pbkNvbHVtbnMgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyhKUEEuU0VDT05EQVJZX1RBQkxFX19QS19KT0lOX0NPTFVNTlMpOworCQlWZWN0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4oamR0Sm9pbkNvbHVtbnMubGVuZ3RoKTsKKwkJZm9yIChPYmplY3QgamR0Sm9pbkNvbHVtbiA6IGpkdEpvaW5Db2x1bW5zKSB7CisJCQlyZXN1bHQuYWRkKG5ldyBCaW5hcnlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24odGhpcywgKElBbm5vdGF0aW9uKSBqZHRKb2luQ29sdW1uKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvLyBUT0RPCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVBrSm9pbkNvbHVtbnMoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlZGZlMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlNlY29uZGFyeVRhYmxlcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5U2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5Q29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbj4KKwlpbXBsZW1lbnRzIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24KK3sKKwlwcml2YXRlIGZpbmFsIFZlY3RvcjxOZXN0YWJsZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbj4gc2Vjb25kYXJ5VGFibGVzOworCisKKwlwdWJsaWMgQmluYXJ5U2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5zZWNvbmRhcnlUYWJsZXMgPSB0aGlzLmJ1aWxkU2Vjb25kYXJ5VGFibGVzKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uPiBuZXN0ZWRBbm5vdGF0aW9ucygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbj4odGhpcy5zZWNvbmRhcnlUYWJsZXMpOworCX0KKworCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZXMuc2l6ZSgpOworCX0KKworCXByaXZhdGUgVmVjdG9yPE5lc3RhYmxlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uPiBidWlsZFNlY29uZGFyeVRhYmxlcygpIHsKKwkJT2JqZWN0W10gamR0U2Vjb25kYXJ5VGFibGVzID0gdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZXMoSlBBLlNFQ09OREFSWV9UQUJMRVNfX1ZBTFVFKTsKKwkJVmVjdG9yPE5lc3RhYmxlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPE5lc3RhYmxlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uPihqZHRTZWNvbmRhcnlUYWJsZXMubGVuZ3RoKTsKKwkJZm9yIChPYmplY3QgamR0U2Vjb25kYXJ5VGFibGUgOiBqZHRTZWNvbmRhcnlUYWJsZXMpIHsKKwkJCXJlc3VsdC5hZGQobmV3IEJpbmFyeVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbih0aGlzLCAoSUFubm90YXRpb24pIGpkdFNlY29uZGFyeVRhYmxlKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnVwZGF0ZVNlY29uZGFyeVRhYmxlcygpOworCX0KKworCS8vIFRPRE8KKwlwcml2YXRlIHZvaWQgdXBkYXRlU2Vjb25kYXJ5VGFibGVzKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmUyYzgyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5TZXF1ZW5jZUdlbmVyYXRvcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlHZW5lcmF0b3JBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24KK3sKKwlwcml2YXRlIFN0cmluZyBzZXF1ZW5jZU5hbWU7CisKKworCXByb3RlY3RlZCBCaW5hcnlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5zZXF1ZW5jZU5hbWUgPSB0aGlzLmJ1aWxkU2VxdWVuY2VOYW1lKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFNlcXVlbmNlTmFtZV8odGhpcy5idWlsZFNlcXVlbmNlTmFtZSgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQmluYXJ5R2VuZXJhdG9yQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLlNFUVVFTkNFX0dFTkVSQVRPUl9fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0SW5pdGlhbFZhbHVlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuU0VRVUVOQ0VfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRBbGxvY2F0aW9uU2l6ZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLlNFUVVFTkNFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFOworCX0KKworCisJLy8gKioqKioqKioqKiBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogc2VxdWVuY2UgbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0U2VxdWVuY2VOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2VxdWVuY2VOYW1lKFN0cmluZyBzZXF1ZW5jZU5hbWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFNlcXVlbmNlTmFtZV8oU3RyaW5nIHNlcXVlbmNlTmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zZXF1ZW5jZU5hbWU7CisJCXRoaXMuc2VxdWVuY2VOYW1lID0gc2VxdWVuY2VOYW1lOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkLCBzZXF1ZW5jZU5hbWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkU2VxdWVuY2VOYW1lKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuU0VRVUVOQ0VfR0VORVJBVE9SX19TRVFVRU5DRV9OQU1FKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFNlcXVlbmNlTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBzZXF1ZW5jZU5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlUYWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlUYWJsZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQ1NmU2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVRhYmxlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuVGFibGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVRhYmxlQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QmFzZVRhYmxlQW5ub3RhdGlvbgorCWltcGxlbWVudHMgVGFibGVBbm5vdGF0aW9uCit7CisJcHVibGljIEJpbmFyeVRhYmxlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisKKwkvLyAqKioqKioqKioqIEJpbmFyeUJhc2VUYWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5UQUJMRV9fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0U2NoZW1hRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuVEFCTEVfX1NDSEVNQTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0Q2F0YWxvZ0VsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLlRBQkxFX19DQVRBTE9HOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRVbmlxdWVDb25zdHJhaW50RWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlUYWJsZUdlbmVyYXRvckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlUYWJsZUdlbmVyYXRvckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWNkZWJiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuVGFibGVHZW5lcmF0b3IKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5R2VuZXJhdG9yQW5ub3RhdGlvbgorCWltcGxlbWVudHMgVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBTdHJpbmcgdGFibGU7CisJcHJpdmF0ZSBTdHJpbmcgc2NoZW1hOworCXByaXZhdGUgU3RyaW5nIGNhdGFsb2c7CisJcHJpdmF0ZSBTdHJpbmcgcGtDb2x1bW5OYW1lOworCXByaXZhdGUgU3RyaW5nIHZhbHVlQ29sdW1uTmFtZTsKKwlwcml2YXRlIFN0cmluZyBwa0NvbHVtblZhbHVlOworCXByaXZhdGUgZmluYWwgVmVjdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50czsKKworCisJcHVibGljIEJpbmFyeVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKCk7CisJCXRoaXMuc2NoZW1hID0gdGhpcy5idWlsZFNjaGVtYSgpOworCQl0aGlzLmNhdGFsb2cgPSB0aGlzLmJ1aWxkQ2F0YWxvZygpOworCQl0aGlzLnBrQ29sdW1uTmFtZSA9IHRoaXMuYnVpbGRQa0NvbHVtbk5hbWUoKTsKKwkJdGhpcy52YWx1ZUNvbHVtbk5hbWUgPSB0aGlzLmJ1aWxkVmFsdWVDb2x1bW5OYW1lKCk7CisJCXRoaXMucGtDb2x1bW5WYWx1ZSA9IHRoaXMuYnVpbGRQa0NvbHVtblZhbHVlKCk7CisJCXRoaXMudW5pcXVlQ29uc3RyYWludHMgPSB0aGlzLmJ1aWxkVW5pcXVlQ29uc3RyYWludHMoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0VGFibGVfKHRoaXMuYnVpbGRUYWJsZSgpKTsKKwkJdGhpcy5zZXRTY2hlbWFfKHRoaXMuYnVpbGRTY2hlbWEoKSk7CisJCXRoaXMuc2V0Q2F0YWxvZ18odGhpcy5idWlsZENhdGFsb2coKSk7CisJCXRoaXMuc2V0UGtDb2x1bW5OYW1lXyh0aGlzLmJ1aWxkUGtDb2x1bW5OYW1lKCkpOworCQl0aGlzLnNldFZhbHVlQ29sdW1uTmFtZV8odGhpcy5idWlsZFZhbHVlQ29sdW1uTmFtZSgpKTsKKwkJdGhpcy5zZXRQa0NvbHVtblZhbHVlXyh0aGlzLmJ1aWxkUGtDb2x1bW5WYWx1ZSgpKTsKKwkJdGhpcy51cGRhdGVVbmlxdWVDb25zdHJhaW50cygpOworCX0KKworCisJLy8gKioqKioqKioqKiBBYnN0cmFjdEdlbmVyYXRvckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5UQUJMRV9HRU5FUkFUT1JfX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldEluaXRpYWxWYWx1ZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLlRBQkxFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0QWxsb2NhdGlvblNpemVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5UQUJMRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRTsKKwl9CisKKworCS8vICoqKioqKioqKiogVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHRhYmxlCisJcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMudGFibGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGFibGUoU3RyaW5nIHRhYmxlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRUYWJsZV8oU3RyaW5nIHRhYmxlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnRhYmxlOworCQl0aGlzLnRhYmxlID0gdGFibGU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUQUJMRV9QUk9QRVJUWSwgb2xkLCB0YWJsZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRUYWJsZSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLlRBQkxFX0dFTkVSQVRPUl9fVEFCTEUpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gdGFibGVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIHNjaGVtYQorCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy5zY2hlbWE7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFNjaGVtYV8oU3RyaW5nIHNjaGVtYSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5zY2hlbWE7CisJCXRoaXMuc2NoZW1hID0gc2NoZW1hOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRTY2hlbWEoKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5UQUJMRV9HRU5FUkFUT1JfX1NDSEVNQSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKiBjYXRhbG9nCisJcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgeworCQlyZXR1cm4gdGhpcy5jYXRhbG9nOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldENhdGFsb2dfKFN0cmluZyBjYXRhbG9nKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmNhdGFsb2c7CisJCXRoaXMuY2F0YWxvZyA9IGNhdGFsb2c7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ2F0YWxvZygpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLlRBQkxFX0dFTkVSQVRPUl9fQ0FUQUxPRyk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBib29sZWFuIGNhdGFsb2dUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIHBrIGNvbHVtbiBuYW1lCisJcHVibGljIFN0cmluZyBnZXRQa0NvbHVtbk5hbWUoKSB7CisJCXJldHVybiB0aGlzLnBrQ29sdW1uTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQa0NvbHVtbk5hbWUoU3RyaW5nIHBrQ29sdW1uTmFtZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0UGtDb2x1bW5OYW1lXyhTdHJpbmcgcGtDb2x1bW5OYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnBrQ29sdW1uTmFtZTsKKwkJdGhpcy5wa0NvbHVtbk5hbWUgPSBwa0NvbHVtbk5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQS19DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkLCBwa0NvbHVtbk5hbWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkUGtDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fTkFNRSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRQa0NvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gcGtDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKiB2YWx1ZSBjb2x1bW4gbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZUNvbHVtbk5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWVDb2x1bW5OYW1lKFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFZhbHVlQ29sdW1uTmFtZV8oU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZUNvbHVtbk5hbWU7CisJCXRoaXMudmFsdWVDb2x1bW5OYW1lID0gdmFsdWVDb2x1bW5OYW1lOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgdmFsdWVDb2x1bW5OYW1lKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlQ29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLlRBQkxFX0dFTkVSQVRPUl9fVkFMVUVfQ09MVU1OX05BTUUpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBib29sZWFuIHZhbHVlQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogcGsgY29sdW1uIHZhbHVlCisJcHVibGljIFN0cmluZyBnZXRQa0NvbHVtblZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5wa0NvbHVtblZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBrQ29sdW1uVmFsdWUoU3RyaW5nIHBrQ29sdW1uVmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFBrQ29sdW1uVmFsdWVfKFN0cmluZyBwa0NvbHVtblZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnBrQ29sdW1uVmFsdWU7CisJCXRoaXMucGtDb2x1bW5WYWx1ZSA9IHBrQ29sdW1uVmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQS19DT0xVTU5fVkFMVUVfUFJPUEVSVFksIG9sZCwgcGtDb2x1bW5WYWx1ZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRQa0NvbHVtblZhbHVlKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUUpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UGtDb2x1bW5WYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBwa0NvbHVtblZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKiB1bmlxdWUgY29uc3RyYWludHMKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4odGhpcy51bmlxdWVDb25zdHJhaW50cyk7CisJfQorCisJcHVibGljIGludCB1bmlxdWVDb25zdHJhaW50c1NpemUoKSB7CisJCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEF0KGludCBpbmRleCkgeworCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50cy5nZXQoaW5kZXgpOworCX0KKworCXB1YmxpYyBpbnQgaW5kZXhPZlVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCkgeworCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50cy5pbmRleE9mKHVuaXF1ZUNvbnN0cmFpbnQpOworCX0KKworCXB1YmxpYyBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIFZlY3RvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gYnVpbGRVbmlxdWVDb25zdHJhaW50cygpIHsKKwkJT2JqZWN0W10gamR0VW5pcXVlQ29uc3RyYWludHMgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyhKUEEuVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFMpOworCQlWZWN0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHJlc3VsdCA9IG5ldyBWZWN0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+KGpkdFVuaXF1ZUNvbnN0cmFpbnRzLmxlbmd0aCk7CisJCWZvciAoT2JqZWN0IGpkdFVuaXF1ZUNvbnN0cmFpbnQgOiBqZHRVbmlxdWVDb25zdHJhaW50cykgeworCQkJcmVzdWx0LmFkZChuZXcgQmluYXJ5VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24odGhpcywgKElBbm5vdGF0aW9uKSBqZHRVbmlxdWVDb25zdHJhaW50KSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvLyBUT0RPCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlUZW1wb3JhbEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlUZW1wb3JhbEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjk0NWFhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVRlbXBvcmFsQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5VGVtcG9yYWxBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBUZW1wb3JhbEFubm90YXRpb24KK3sKKwlwcml2YXRlIFRlbXBvcmFsVHlwZSB2YWx1ZTsKKworCisJcHVibGljIEJpbmFyeVRlbXBvcmFsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIFRlbXBvcmFsQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiB2YWx1ZQorCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFRlbXBvcmFsVHlwZSB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFRlbXBvcmFsVHlwZSB2YWx1ZSkgeworCQlUZW1wb3JhbFR5cGUgb2xkID0gdGhpcy52YWx1ZTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOworCX0KKworCXByaXZhdGUgVGVtcG9yYWxUeXBlIGJ1aWxkVmFsdWUoKSB7CisJCXJldHVybiBUZW1wb3JhbFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuVEVNUE9SQUxfX1ZBTFVFKSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlUcmFuc2llbnRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5VHJhbnNpZW50QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZTY0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5VHJhbnNpZW50QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlRyYW5zaWVudAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5VHJhbnNpZW50QW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgVHJhbnNpZW50QW5ub3RhdGlvbgoreworCisJcHVibGljIEJpbmFyeVRyYW5zaWVudEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDhhZjNhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlVuaXF1ZUNvbnN0cmFpbnQKKyAqLworZmluYWwgY2xhc3MgQmluYXJ5VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiBjb2x1bW5OYW1lczsKKworCisJQmluYXJ5VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5jb2x1bW5OYW1lcyA9IHRoaXMuYnVpbGRDb2x1bW5OYW1lcygpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy51cGRhdGVDb2x1bW5OYW1lcygpOworCX0KKworCS8vIFRPRE8KKwlwcml2YXRlIHZvaWQgdXBkYXRlQ29sdW1uTmFtZXMoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCisJLy8gKioqKioqKioqKiBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBjb2x1bW4gbmFtZXMKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmNvbHVtbk5hbWVzKTsKKwl9CisKKwlwdWJsaWMgaW50IGNvbHVtbk5hbWVzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uTmFtZXMuc2l6ZSgpOworCX0KKworCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRDb2x1bW5OYW1lcygpIHsKKwkJT2JqZWN0W10gamR0Q29sdW1uTmFtZXMgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyhKUEEuVU5JUVVFX0NPTlNUUkFJTlRfX0NPTFVNTl9OQU1FUyk7CisJCVZlY3RvcjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBWZWN0b3I8U3RyaW5nPihqZHRDb2x1bW5OYW1lcy5sZW5ndGgpOworCQlmb3IgKE9iamVjdCBqZHRDb2x1bW5OYW1lIDogamR0Q29sdW1uTmFtZXMpIHsKKwkJCXJlc3VsdC5hZGQoKFN0cmluZykgamR0Q29sdW1uTmFtZSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRDb2x1bW5OYW1lKFN0cmluZyBjb2x1bW5OYW1lKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZENvbHVtbk5hbWUoaW50IGluZGV4LCBTdHJpbmcgY29sdW1uTmFtZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlQ29sdW1uTmFtZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb2x1bW5OYW1lc1RvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5OYW1lKGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlWZXJzaW9uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVZlcnNpb25Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmMzI1NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlWZXJzaW9uQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5WZXJzaW9uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlWZXJzaW9uQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgVmVyc2lvbkFubm90YXRpb24KK3sKKworCXB1YmxpYyBCaW5hcnlWZXJzaW9uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvUm9vdEJpbmFyeU5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9Sb290QmluYXJ5Tm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYWE0OTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvUm9vdEJpbmFyeU5vZGUuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhQW5ub3RhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlTW9kZWxMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OworCisvKioKKyAqIEpBUiBhbmQgZXh0ZXJuYWwgdHlwZXMKKyAqLworYWJzdHJhY3QgY2xhc3MgUm9vdEJpbmFyeU5vZGUKKwlleHRlbmRzIEJpbmFyeU5vZGUKKwlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZU5vZGUuUm9vdAoreworCS8qKiBwbHVnZ2FibGUgYW5ub3RhdGlvbiBwcm92aWRlciAqLworCXByaXZhdGUgZmluYWwgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlcjsKKworCS8qKiBsaXN0ZW5lcnMgbm90aWZpZWQgd2hlbmV2ZXIgdGhlIHJlc291cmNlIG1vZGVsIGNoYW5nZXMgKi8KKwlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdDxKcGFSZXNvdXJjZU1vZGVsTGlzdGVuZXI+IHJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PEpwYVJlc291cmNlTW9kZWxMaXN0ZW5lcj4oSnBhUmVzb3VyY2VNb2RlbExpc3RlbmVyLmNsYXNzKTsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgorCQorCVJvb3RCaW5hcnlOb2RlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuYW5ub3RhdGlvblByb3ZpZGVyID0gYW5ub3RhdGlvblByb3ZpZGVyOworCX0KKworCisJLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZXNQYXJlbnQoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUm9vdCBnZXRSb290KCkgeworCQlyZXR1cm4gdGhpczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGdldEFubm90YXRpb25Qcm92aWRlcigpIHsKKwkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvblByb3ZpZGVyOworCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlLlJvb3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIHZvaWQgcmVzb3VyY2VNb2RlbENoYW5nZWQoKSB7CisJCWZvciAoSnBhUmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7CisJCQlsaXN0ZW5lci5yZXNvdXJjZU1vZGVsQ2hhbmdlZCgpOworCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIEpwYVJlc291cmNlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCQorCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgeworCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoSnBhUmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlTW9kZWxMaXN0ZW5lcihKcGFSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0NDZiOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Bbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMuamF2YQpAQCAtMCwwICsxLDI3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CisKKy8qKgorICogVXRpbGl0eSBtZXRob2RzIGZvciBtYW5pcHVsYXRpbmcgYW5ub3RhdGlvbiBjb250YWluZXJzLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzIHsKKworCS8qKgorCSAqIEFkZCBhIG5lc3RlZCBhbm5vdGF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBjb250YWluZXIKKwkgKiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorCSAqIFRoaXMgbWV0aG9kIG1vZGlmaWVzIGJvdGggdGhlIG1vZGVsIGFubm90YXRpb24gY29udGFpbmVyIGFuZCB0aGUKKwkgKiBBU1Q7IHdpdGggdGhlIGFwcHJvcHJpYXRlIGNoYW5nZSBub3RpZmljYXRpb24gb2NjdXJyaW5nIGFmdGVyd2FyZHMuCisJICovCisJcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbj4gTmVzdGFibGVBbm5vdGF0aW9uIGFkZE5lc3RlZEFubm90YXRpb24oaW50IGluZGV4LCBBbm5vdGF0aW9uQ29udGFpbmVyPFQ+IGFubm90YXRpb25Db250YWluZXIpIHsKKwkJLy8gYWRkIGEgbmV3IGFubm90YXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4uLgorCQlpbnQgc291cmNlSW5kZXggPSBhbm5vdGF0aW9uQ29udGFpbmVyLm5lc3RlZEFubm90YXRpb25zU2l6ZSgpOworCQlUIG5lc3RlZEFubm90YXRpb24gPSBhbm5vdGF0aW9uQ29udGFpbmVyLmFkZE5lc3RlZEFubm90YXRpb25JbnRlcm5hbCgpOworCQluZXN0ZWRBbm5vdGF0aW9uLm5ld0Fubm90YXRpb24oKTsKKwkJLy8gLi4udGhlbiBtb3ZlIGl0IHRvIHRoZSBzcGVjaWZpZWQgaW5kZXguLi4KKwkJYW5ub3RhdGlvbkNvbnRhaW5lci5tb3ZlTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKGluZGV4LCBzb3VyY2VJbmRleCk7CisJCXN5bmNoSmF2YUFubm90YXRpb25zQWZ0ZXJNb3ZlKGluZGV4LCBzb3VyY2VJbmRleCwgYW5ub3RhdGlvbkNvbnRhaW5lciwgbmVzdGVkQW5ub3RhdGlvbik7CisJCS8vIC4uLnRoZW4sIHdoZW4gYWxsIGlzIHNldHRsZWQsIHRlbGwgdGhlIGNvbnRhaW5lciB0byBmaXJlIGNoYW5nZSBub3RpZmljYXRpb24KKwkJYW5ub3RhdGlvbkNvbnRhaW5lci5uZXN0ZWRBbm5vdGF0aW9uQWRkZWQoaW5kZXgsIG5lc3RlZEFubm90YXRpb24pOworCQlyZXR1cm4gbmVzdGVkQW5ub3RhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBNb3ZlIHRoZSBuZXN0ZWQgYW5ub3RhdGlvbiBhdCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCBpbiB0aGUKKwkgKiBzcGVjaWZpZWQgYW5ub3RhdGlvbiBjb250YWluZXIgdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQgaW5kZXguCisJICogVGhpcyBtZXRob2QgbW9kaWZpZXMgYm90aCB0aGUgbW9kZWwgYW5ub3RhdGlvbiBjb250YWluZXIgYW5kIHRoZQorCSAqIEFTVDsgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBvY2N1cnJpbmcgYWZ0ZXJ3YXJkcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgTmVzdGFibGVBbm5vdGF0aW9uPiB2b2lkIG1vdmVOZXN0ZWRBbm5vdGF0aW9uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBBbm5vdGF0aW9uQ29udGFpbmVyPFQ+IGFubm90YXRpb25Db250YWluZXIpIHsKKwkJTmVzdGFibGVBbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb24gPSBhbm5vdGF0aW9uQ29udGFpbmVyLm1vdmVOZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJc3luY2hKYXZhQW5ub3RhdGlvbnNBZnRlck1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBhbm5vdGF0aW9uQ29udGFpbmVyLCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwkJYW5ub3RhdGlvbkNvbnRhaW5lci5uZXN0ZWRBbm5vdGF0aW9uTW92ZWQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwl9CisKKwkvKioKKwkgKiBBbiBhbm5vdGF0aW9uIHdhcyBtb3ZlZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGNvbnRhaW5lciBmcm9tCisJICogdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQgaW5kZXguCisJICogU3luY2hyb25pemUgdGhlIEFTVCBhbm5vdGF0aW9ucyB3aXRoIHRoZSBtb2RlbCBhbm5vdGF0aW9uIGNvbnRhaW5lciwKKwkgKiBzdGFydGluZyB3aXRoIHRoZSBsb3dlciBpbmRleCB0byBwcmV2ZW50IG92ZXJsYXAuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgPFQgZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+IHZvaWQgc3luY2hKYXZhQW5ub3RhdGlvbnNBZnRlck1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIEFubm90YXRpb25Db250YWluZXI8VD4gYW5ub3RhdGlvbkNvbnRhaW5lciwgTmVzdGFibGVBbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb25Bbm5vdGF0aW9uKSB7CisJCS8vIG1vdmUgdGhlIEphdmEgYW5ub3RhdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0Li4uCisJCW5lc3RlZEFubm90YXRpb25Bbm5vdGF0aW9uLm1vdmVBbm5vdGF0aW9uKGFubm90YXRpb25Db250YWluZXIubmVzdGVkQW5ub3RhdGlvbnNTaXplKCkpOworCQkvLyAuLi50aGVuIHNoaWZ0IHRoZSBvdGhlciBKYXZhIGFubm90YXRpb25zIG92ZXIgb25lIHNsb3QuLi4KKwkJTGlzdDxUPiBuZXN0YWJsZUFubm90YXRpb25zID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoYW5ub3RhdGlvbkNvbnRhaW5lci5uZXN0ZWRBbm5vdGF0aW9ucygpKTsKKwkJaWYgKHNvdXJjZUluZGV4IDwgdGFyZ2V0SW5kZXgpIHsKKwkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaSA8IHRhcmdldEluZGV4OyBpKyspIHsKKwkJCQluZXN0YWJsZUFubm90YXRpb25zLmdldChpKS5tb3ZlQW5ub3RhdGlvbihpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaSA+IHRhcmdldEluZGV4OyBpLS0gKSB7CisJCQkJbmVzdGFibGVBbm5vdGF0aW9ucy5nZXQoaSkubW92ZUFubm90YXRpb24oaSk7CisJCQl9CisJCX0KKwkJLy8gLi4udGhlbiBtb3ZlIHRoZSBKYXZhIGFubm90YXRpb24gdG8gdGhlIG5vdyBlbXB0eSBzbG90IGF0IHRoZSB0YXJnZXQgaW5kZXgKKwkJbmVzdGVkQW5ub3RhdGlvbkFubm90YXRpb24ubW92ZUFubm90YXRpb24odGFyZ2V0SW5kZXgpOworCX0KKworCS8qKgorCSAqIFJlbW92ZSB0aGUgbmVzdGVkIGFubm90YXRpb24gYXQgdGhlIHNwZWNpZmllZCBpbmRleCBpbiB0aGUKKwkgKiBzcGVjaWZpZWQgYW5ub3RhdGlvbiBjb250YWluZXIuCisJICogVGhpcyBtZXRob2QgbW9kaWZpZXMgYm90aCB0aGUgbW9kZWwgYW5ub3RhdGlvbiBjb250YWluZXIgYW5kIHRoZQorCSAqIEFTVDsgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBvY2N1cnJpbmcgYWZ0ZXJ3YXJkcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgTmVzdGFibGVBbm5vdGF0aW9uPiB2b2lkIHJlbW92ZU5lc3RlZEFubm90YXRpb24oaW50IGluZGV4LCBBbm5vdGF0aW9uQ29udGFpbmVyPFQ+IGFubm90YXRpb25Db250YWluZXIpIHsKKwkJVCBuZXN0ZWRBbm5vdGF0aW9uID0gYW5ub3RhdGlvbkNvbnRhaW5lci5yZW1vdmVOZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoaW5kZXgpOworCQluZXN0ZWRBbm5vdGF0aW9uLnJlbW92ZUFubm90YXRpb24oKTsKKwkJc3luY2hKYXZhQW5ub3RhdGlvbnNBZnRlclJlbW92ZShpbmRleCwgYW5ub3RhdGlvbkNvbnRhaW5lcik7CisJCWFubm90YXRpb25Db250YWluZXIubmVzdGVkQW5ub3RhdGlvblJlbW92ZWQoaW5kZXgsIG5lc3RlZEFubm90YXRpb24pOworCX0KKworCS8qKgorCSAqIEFuIGFubm90YXRpb24gd2FzIHJlbW92ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gY29udGFpbmVyIGF0IHRoZQorCSAqIHNwZWNpZmllZCBpbmRleC4KKwkgKiBTeW5jaHJvbml6ZSB0aGUgQVNUIGFubm90YXRpb25zIHdpdGggdGhlIG1vZGVsIGFubm90YXRpb24gY29udGFpbmVyLAorCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggdG8gcHJldmVudCBvdmVybGFwLgorCSAqLworCXByaXZhdGUgc3RhdGljIDxUIGV4dGVuZHMgTmVzdGFibGVBbm5vdGF0aW9uPiB2b2lkIHN5bmNoSmF2YUFubm90YXRpb25zQWZ0ZXJSZW1vdmUoaW50IGluZGV4LCBBbm5vdGF0aW9uQ29udGFpbmVyPFQ+IGFubm90YXRpb25Db250YWluZXIpIHsKKwkJTGlzdDxUPiBuZXN0YWJsZUFubm90YXRpb25zID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoYW5ub3RhdGlvbkNvbnRhaW5lci5uZXN0ZWRBbm5vdGF0aW9ucygpKTsKKwkJZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgbmVzdGFibGVBbm5vdGF0aW9ucy5zaXplKCk7IGkrKykgeworCQkJLy8gdGhlIGluZGljZXMgYXJlIHRoZSBzYW1lIGJlY2F1c2UgdGhlIG1vZGVsIGFubm90YXRpb25zIGFyZQorCQkJLy8gYWxyZWFkeSBpbiB0aGUgcHJvcGVyIGxvY2F0aW9ucyAtIGl0J3MgdGhlIEphdmEgYW5ub3RhdGlvbnMgdGhhdAorCQkJLy8gbmVlZCB0byBiZSBtb3ZlZCB0byB0aGUgc2FtZSBsb2NhdGlvbgorCQkJbmVzdGFibGVBbm5vdGF0aW9ucy5nZXQoaSkubW92ZUFubm90YXRpb24oaSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBjb250YWluZXIgdG8gYmUgaW4gc3luY2ggd2l0aCB0aGUKKwkgKiBzcGVjaWZpZWQgQVNULiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uIHdpbGwgb2NjdXIuCisJICovCisJcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbj4gdm9pZCBpbml0aWFsaXplKEFubm90YXRpb25Db250YWluZXI8VD4gYW5ub3RhdGlvbkNvbnRhaW5lciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJLy8gaWdub3JlIHRoZSBuZXN0ZWQgQVNUIGFubm90YXRpb25zIHRoZW1zZWx2ZXMKKwkJLy8gKG1heWJlIHNvbWVkYXkgd2UgY2FuIHVzZSB0aGVtIGR1cmluZyBpbml0aWFsaXphdGlvbi4uLikKKwkJaW50IHNpemUgPSBnZXROZXN0ZWRBc3RBbm5vdGF0aW9ucyhhc3RSb290LCBhbm5vdGF0aW9uQ29udGFpbmVyKS5zaXplKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlUIG5lc3RlZEFubm90YXRpb24gPSBhbm5vdGF0aW9uQ29udGFpbmVyLmFkZE5lc3RlZEFubm90YXRpb25JbnRlcm5hbCgpOworCQkJbmVzdGVkQW5ub3RhdGlvbi5pbml0aWFsaXplKGFzdFJvb3QpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgbGlzdCBvZiB0aGUgbmVzdGVkIEFTVCBhbm5vdGF0aW9ucy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyA8VCBleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbj4gQXJyYXlMaXN0PEFubm90YXRpb24+IGdldE5lc3RlZEFzdEFubm90YXRpb25zKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBBbm5vdGF0aW9uQ29udGFpbmVyPFQ+IGFubm90YXRpb25Db250YWluZXIpIHsKKwkJQXJyYXlMaXN0PEFubm90YXRpb24+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbj4oKTsKKwkJQW5ub3RhdGlvbiBjb250YWluZXJBc3RBbm5vdGF0aW9uID0gYW5ub3RhdGlvbkNvbnRhaW5lci5nZXRDb250YWluZXJKZHRBbm5vdGF0aW9uKGFzdFJvb3QpOworCQlpZiAoY29udGFpbmVyQXN0QW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSkgeworCQkJLy8gbm8gbmVzdGVkIGFubm90YXRpb25zCisJCX0KKwkJZWxzZSBpZiAoY29udGFpbmVyQXN0QW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgeworCQkJaWYgKGFubm90YXRpb25Db250YWluZXIuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoInZhbHVlIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCUV4cHJlc3Npb24gZXggPSAoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGNvbnRhaW5lckFzdEFubm90YXRpb24pLmdldFZhbHVlKCk7CisJCQkJYWRkQXN0QW5ub3RhdGlvbnNUbyhleCwgYW5ub3RhdGlvbkNvbnRhaW5lci5nZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCksIHJlc3VsdCk7CisJCQl9IGVsc2UgeworCQkJCS8vIG5vIG5lc3RlZCBhbm5vdGF0aW9ucworCQkJfQorCQl9CisJCWVsc2UgaWYgKGNvbnRhaW5lckFzdEFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKKwkJCU1lbWJlclZhbHVlUGFpciBwYWlyID0gZ2V0TWVtYmVyVmFsdWVQYWlyKChOb3JtYWxBbm5vdGF0aW9uKSBjb250YWluZXJBc3RBbm5vdGF0aW9uLCBhbm5vdGF0aW9uQ29udGFpbmVyLmdldEVsZW1lbnROYW1lKCkpOworCQkJaWYgKHBhaXIgPT0gbnVsbCkgeworCQkJCS8vIG5vIG5lc3RlZCBhbm5vdGF0aW9ucworCQkJfSBlbHNlIHsKKwkJCQlhZGRBc3RBbm5vdGF0aW9uc1RvKHBhaXIuZ2V0VmFsdWUoKSwgYW5ub3RhdGlvbkNvbnRhaW5lci5nZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCksIHJlc3VsdCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBBZGQgd2hhdGV2ZXIgYW5ub3RhdGlvbnMgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiB0bworCSAqIHRoZSBzcGVjaWZpZWQgYmFnLiBBZGQgbnVsbCB0byB0aGUgYmFnIGZvciBhbnkgbm9uLWFubm90YXRpb24gZXhwcmVzc2lvbi4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEFzdEFubm90YXRpb25zVG8oRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIEFycmF5TGlzdDxBbm5vdGF0aW9uPiBhc3RBbm5vdGF0aW9ucykgeworCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQlhc3RBbm5vdGF0aW9ucy5hZGQobnVsbCk7ICAvLyBub3Qgc3VyZSBob3cgd2Ugd291bGQgZ2V0IGhlcmUuLi4KKwkJfQorCQllbHNlIGlmIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgeworCQkJYWRkQXN0QW5ub3RhdGlvbnNUbygoQXJyYXlJbml0aWFsaXplcikgZXhwcmVzc2lvbiwgYW5ub3RhdGlvbk5hbWUsIGFzdEFubm90YXRpb25zKTsKKwkJfQorCQllbHNlIHsKKwkJCWFzdEFubm90YXRpb25zLmFkZChnZXRBc3RBbm5vdGF0aW9uXyhleHByZXNzaW9uLCBhbm5vdGF0aW9uTmFtZSkpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRBc3RBbm5vdGF0aW9uc1RvKEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciwgU3RyaW5nIGFubm90YXRpb25OYW1lLCBBcnJheUxpc3Q8QW5ub3RhdGlvbj4gYXN0QW5ub3RhdGlvbnMpIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJCUxpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCk7CisJCWZvciAoRXhwcmVzc2lvbiBleHByZXNzaW9uIDogZXhwcmVzc2lvbnMpIHsKKwkJCWFzdEFubm90YXRpb25zLmFkZChnZXRBc3RBbm5vdGF0aW9uKGV4cHJlc3Npb24sIGFubm90YXRpb25OYW1lKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBJZiB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gaXMgYW4gYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgcmV0dXJuIGl0OworCSAqIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFzdEFubm90YXRpb24oRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJLy8gbm90IHN1cmUgaG93IHRoZSBleHByZXNzaW9uIGNvdWxkIGJlIG51bGwuLi4KKwkJcmV0dXJuIChleHByZXNzaW9uID09IG51bGwpID8gbnVsbCA6IGdldEFzdEFubm90YXRpb25fKGV4cHJlc3Npb24sIGFubm90YXRpb25OYW1lKTsKKwl9CisKKwkvKioKKwkgKiBwcmUtY29uZGl0aW9uOiBleHByZXNzaW9uIGlzIG5vdCBudWxsCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbiBnZXRBc3RBbm5vdGF0aW9uXyhFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgeworCQlzd2l0Y2ggKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSkgeworCQkJY2FzZSBBU1ROb2RlLk5PUk1BTF9BTk5PVEFUSU9OOgorCQkJY2FzZSBBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTjoKKwkJCWNhc2UgQVNUTm9kZS5NQVJLRVJfQU5OT1RBVElPTjoKKwkJCQlBbm5vdGF0aW9uIGFzdEFubm90YXRpb24gPSAoQW5ub3RhdGlvbikgZXhwcmVzc2lvbjsKKwkJCQlpZiAoZ2V0UXVhbGlmaWVkTmFtZShhc3RBbm5vdGF0aW9uKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKSB7CisJCQkJCXJldHVybiBhc3RBbm5vdGF0aW9uOworCQkJCX0KKwkJCQlyZXR1cm4gbnVsbDsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZShBbm5vdGF0aW9uIGFzdEFubm90YXRpb24pIHsKKwkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gYXN0QW5ub3RhdGlvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKKwkJaWYgKHR5cGVCaW5kaW5nICE9IG51bGwpIHsKKwkJCVN0cmluZyByZXNvbHZlZE5hbWUgPSB0eXBlQmluZGluZy5nZXRRdWFsaWZpZWROYW1lKCk7CisJCQlpZiAocmVzb2x2ZWROYW1lICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzb2x2ZWROYW1lOworCQkJfQorCQl9CisJCXJldHVybiBhc3RBbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGdldE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSkgeworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHBhaXJzID0gYW5ub3RhdGlvbi52YWx1ZXMoKTsKKwkJZm9yIChNZW1iZXJWYWx1ZVBhaXIgcGFpciA6IHBhaXJzKSB7CisJCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGVsZW1lbnROYW1lKSkgeworCQkJCXJldHVybiBwYWlyOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFVwZGF0ZSB0aGUgYW5ub3RhdGlvbnMgaW4gdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGNvbnRhaW5lciB0byBiZSBpbgorCSAqIHN5bmNoIHdpdGggdGhvc2UgaW4gdGhlIHNwZWNpZmllZCBBU1QuIFRoZSBhcHByb3ByaWF0ZSBjaGFuZ2UKKwkgKiBub3RpZmljYXRpb24gd2lsbCBvY2N1ci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgTmVzdGFibGVBbm5vdGF0aW9uPiB2b2lkIHVwZGF0ZShBbm5vdGF0aW9uQ29udGFpbmVyPFQ+IGFubm90YXRpb25Db250YWluZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUxpc3RJdGVyYXRvcjxBbm5vdGF0aW9uPiBhc3RBbm5vdGF0aW9ucyA9IGdldE5lc3RlZEFzdEFubm90YXRpb25zKGFzdFJvb3QsIGFubm90YXRpb25Db250YWluZXIpLmxpc3RJdGVyYXRvcigpOworCisJCWZvciAoTGlzdEl0ZXJhdG9yPFQ+IG5lc3RlZEFubm90YXRpb25zID0gYW5ub3RhdGlvbkNvbnRhaW5lci5uZXN0ZWRBbm5vdGF0aW9ucygpOyBuZXN0ZWRBbm5vdGF0aW9ucy5oYXNOZXh0KCk7ICkgeworCQkJVCBuZXN0ZWRBbm5vdGF0aW9uID0gbmVzdGVkQW5ub3RhdGlvbnMubmV4dCgpOworCQkJaWYgKGFzdEFubm90YXRpb25zLmhhc05leHQoKSkgeworCQkJCS8vIG1hdGNoaW5nIEFTVCBhbm5vdGF0aW9uIGlzIHByZXNlbnQgLSB1cGRhdGUgdGhlIG5lc3RlZCBhbm5vdGF0aW9uCisJCQkJYXN0QW5ub3RhdGlvbnMubmV4dCgpOyAgLy8gbWF5YmUgc29tZWRheSB3ZSBjYW4gcGFzcyB0aGlzIHRvIHRoZSB1cGRhdGUKKwkJCQluZXN0ZWRBbm5vdGF0aW9uLnVwZGF0ZShhc3RSb290KTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gbm8gbW9yZSBBU1QgYW5ub3RhdGlvbnMgLSByZW1vdmUgdGhlIG5lc3RlZCBhbm5vdGF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGNvbnRhaW5lcidzIGxpc3QKKwkJCQlpbnQgbGFzdCA9IGFubm90YXRpb25Db250YWluZXIubmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgLSAxOworCQkJCVQgcmVtb3ZlID0gYW5ub3RhdGlvbkNvbnRhaW5lci5yZW1vdmVOZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwobGFzdCk7CisJCQkJYW5ub3RhdGlvbkNvbnRhaW5lci5uZXN0ZWRBbm5vdGF0aW9uUmVtb3ZlZChsYXN0LCByZW1vdmUpOworCQkJfQorCQl9CisKKwkJLy8gYWRkIG5lc3RlZCBhbm5vdGF0aW9ucyBmb3IgdGhlIHJlbWFpbmluZyBBU1QgYW5ub3RhdGlvbnMKKwkJaW50IGkgPSBhbm5vdGF0aW9uQ29udGFpbmVyLm5lc3RlZEFubm90YXRpb25zU2l6ZSgpOworCQl3aGlsZSAoYXN0QW5ub3RhdGlvbnMuaGFzTmV4dCgpKSB7CisJCQlhc3RBbm5vdGF0aW9ucy5uZXh0KCk7ICAvLyBtYXliZSBzb21lZGF5IHdlIGNhbiBwYXNzIHRoaXMgdG8gdGhlIGluaXRpYWxpemUKKwkJCVQgbmVzdGVkQW5ub3RhdGlvbiA9IGFubm90YXRpb25Db250YWluZXIuYWRkTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKCk7CisJCQluZXN0ZWRBbm5vdGF0aW9uLmluaXRpYWxpemUoYXN0Um9vdCk7CisJCQlhbm5vdGF0aW9uQ29udGFpbmVyLm5lc3RlZEFubm90YXRpb25BZGRlZChpKyssIG5lc3RlZEFubm90YXRpb24pOworCQl9CisJfQorCisJcHJpdmF0ZSBBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMoKSB7CisJCXN1cGVyKCk7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlNmU1YgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVE5vZGVUZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBzb21lIGNvbW1vbiBzdGF0ZSBhbmQgYmVoYXZpb3IgZm9yIEphdmEgc291cmNlIGFubm90YXRpb25zOworICogYW5kIGxvdHMgb2YgY29udmVuaWVuY2UgbWV0aG9kcworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU291cmNlQW5ub3RhdGlvbjxNIGV4dGVuZHMgTWVtYmVyPgorCWV4dGVuZHMgU291cmNlTm9kZQorCWltcGxlbWVudHMgQW5ub3RhdGlvbgoreworCXByb3RlY3RlZCBmaW5hbCBNIG1lbWJlcjsKKworCXByb3RlY3RlZCBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTsKKworCXByb3RlY3RlZCBmaW5hbCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcjsKKworCisJLyoqCisJICogY29uc3RydWN0b3IgZm9yIHN0cmFpZ2h0IG1lbWJlciBhbm5vdGF0aW9uCisJICovCisJcHJvdGVjdGVkIFNvdXJjZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE0gbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgeworCQl0aGlzKHBhcmVudCwgbWVtYmVyLCBkYWEsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGRhYSkpOworCX0KKworCS8qKgorCSAqIGNvbnN0cnVjdG9yIGZvciBuZXN0ZWQgYW5ub3RhdGlvbiAodHlwaWNhbGx5KQorCSAqLworCXByb3RlY3RlZCBTb3VyY2VBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMubWVtYmVyID0gbWVtYmVyOworCQl0aGlzLmRhYSA9IGRhYTsKKwkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlciA9IGFubm90YXRpb25BZGFwdGVyOworCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEFubm90YXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgeworCQl0aGlzLmFubm90YXRpb25BZGFwdGVyLm5ld01hcmtlckFubm90YXRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgeworCQl0aGlzLmFubm90YXRpb25BZGFwdGVyLnJlbW92ZUFubm90YXRpb24oKTsKKwl9CisKKworCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgYW5ub3RhdGlvbi4KKwkgKiBJZiB0aGUgYW5ub3RhdGlvbiBpcyBtaXNzaW5nLCByZXR1cm4gbnVsbC4KKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEFubm90YXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0VGV4dFJhbmdlKHRoaXMuZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KSk7CisJfQorCisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kLgorCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KKwkgKiBJZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaXMgbWlzc2luZywgcmV0dXJuIHRoZSBhbm5vdGF0aW9uJ3MgdGV4dCByYW5nZSBpbnN0ZWFkLgorCSAqLworCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0RWxlbWVudFRleHRSYW5nZShEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjw/PiBlbGVtZW50QWRhcHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmdldEFubm90YXRpb25FbGVtZW50VGV4dFJhbmdlKGVsZW1lbnRBZGFwdGVyLCBhc3RSb290KSwgYXN0Um9vdCk7CisJfQorCisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kLiBJZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdGV4dCByYW5nZSBpcyBudWxsCisJICogcmV0dXJuIHRoZSBtZW1iZXIncyB0ZXh0IHJhbmdlIGluc3RlYWQuCisJICovCisJcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRFbGVtZW50VGV4dFJhbmdlKFRleHRSYW5nZSBlbGVtZW50VGV4dFJhbmdlLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gKGVsZW1lbnRUZXh0UmFuZ2UgIT0gbnVsbCkgPyBlbGVtZW50VGV4dFJhbmdlIDogdGhpcy5nZXRBbm5vdGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKworCS8qKgorCSAqIENvbnZlbmllbmNlIG1ldGhvZC4gUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBleGlzdHMgYW5kCisJICogdG91Y2hlcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZWxlbWVudFRvdWNoZXMoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Pz4gZWxlbWVudEFkYXB0ZXIsIGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnRleHRSYW5nZVRvdWNoZXModGhpcy5nZXRBbm5vdGF0aW9uRWxlbWVudFRleHRSYW5nZShlbGVtZW50QWRhcHRlciwgYXN0Um9vdCksIHBvcyk7CisJfQorCisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kLiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHRleHQgcmFuZ2UgaXMgbm90CisJICogbnVsbCAobWVhbmluZyB0aGUgY29ycmVzcG9uZGluZyBBU1Qgbm9kZSBleGlzdHMpIGFuZCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgaXQuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdGV4dFJhbmdlVG91Y2hlcyhUZXh0UmFuZ2UgdGV4dFJhbmdlLCBpbnQgcG9zKSB7CisJCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpICYmIHRleHRSYW5nZS50b3VjaGVzKHBvcyk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LgorCSAqIElmIHRoZSBlbGVtZW50IGlzIG1pc3NpbmcsIHJldHVybiBudWxsLgorCSAqLworCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QW5ub3RhdGlvbkVsZW1lbnRUZXh0UmFuZ2UoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Pz4gYWRhcHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0VGV4dFJhbmdlKHRoaXMuZ2V0QW5ub3RhdGlvbkVsZW1lbnRFeHByZXNzaW9uKGFkYXB0ZXIsIGFzdFJvb3QpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBBU1QgRE9NIGVsZW1lbnQuCisJICovCisJcHJvdGVjdGVkIEV4cHJlc3Npb24gZ2V0QW5ub3RhdGlvbkVsZW1lbnRFeHByZXNzaW9uKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPD8+IGFkYXB0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBhZGFwdGVyLmdldEV4cHJlc3Npb24odGhpcy5tZW1iZXIuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihhc3RSb290KSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBBU1Qgbm9kZS4KKwkgKiBJZiB0aGUgQVNUIG5vZGUgaXMgbnVsbCwgcmV0dXJuIG51bGwuCisJICovCisJcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQVNUTm9kZSBhc3ROb2RlKSB7CisJCXJldHVybiAoYXN0Tm9kZSA9PSBudWxsKSA/IG51bGwgOiBuZXcgQVNUTm9kZVRleHRSYW5nZShhc3ROb2RlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyY2NjNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlT3ZlcnJpZGVBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIGZpbmFsIFZlY3RvcjxOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1ucyA9IG5ldyBWZWN0b3I8TmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbj4oKTsKKwlwcml2YXRlIGZpbmFsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbkNvbnRhaW5lciBqb2luQ29sdW1uc0NvbnRhaW5lciA9IG5ldyBKb2luQ29sdW1uc0Fubm90YXRpb25Db250YWluZXIoKTsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJcHJvdGVjdGVkIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKKwkJc3VwZXIocGFyZW50LCBtZW1iZXIsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMuaW5pdGlhbGl6ZSh0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyLCBhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMudXBkYXRlKHRoaXMuam9pbkNvbHVtbnNDb250YWluZXIsIGFzdFJvb3QpOworCX0KKworCQorCS8vICoqKioqKioqKiogU291cmNlT3ZlcnJpZGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLkFTU09DSUFUSU9OX09WRVJSSURFX19OQU1FOworCX0KKworCisJLy8gKioqKioqKioqKiBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBqb2luIGNvbHVtbnMKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5qb2luQ29sdW1ucyk7CisJfQorCisJTGlzdEl0ZXJhdG9yPE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24+IG5lc3RhYmxlSm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5qb2luQ29sdW1ucyk7CisJfQorCisJcHVibGljIGludCBqb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLmdldChpbmRleCk7CisJfQorCisJcHVibGljIGludCBpbmRleE9mSm9pbkNvbHVtbihKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uKSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLmluZGV4T2Yoam9pbkNvbHVtbik7CisJfQorCisJcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIChOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMuYWRkTmVzdGVkQW5ub3RhdGlvbihpbmRleCwgdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lcik7CisJfQorCisJTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRKb2luQ29sdW1uSW50ZXJuYWwoKSB7CisJCU5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRoaXMuYnVpbGRKb2luQ29sdW1uKHRoaXMuam9pbkNvbHVtbnMuc2l6ZSgpKTsKKwkJdGhpcy5qb2luQ29sdW1ucy5hZGQoam9pbkNvbHVtbik7CisJCXJldHVybiBqb2luQ29sdW1uOworCX0KKworCXByaXZhdGUgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBidWlsZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCXJldHVybiBTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbi5jcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtbih0aGlzLmRhYSwgdGhpcywgdGhpcy5tZW1iZXIsIGluZGV4KTsKKwl9CisKKwl2b2lkIGpvaW5Db2x1bW5BZGRlZChpbnQgaW5kZXgsIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgeworCQl0aGlzLmZpcmVJdGVtQWRkZWQoSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBqb2luQ29sdW1uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMubW92ZU5lc3RlZEFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyKTsKKwl9CisKKwlOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIG1vdmVKb2luQ29sdW1uSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuam9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCkuZ2V0KHRhcmdldEluZGV4KTsKKwl9CisKKwl2b2lkIGpvaW5Db2x1bW5Nb3ZlZChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQl0aGlzLmZpcmVJdGVtTW92ZWQoSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLnJlbW92ZU5lc3RlZEFubm90YXRpb24oaW5kZXgsIHRoaXMuam9pbkNvbHVtbnNDb250YWluZXIpOworCX0KKworCU5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gcmVtb3ZlSm9pbkNvbHVtbkludGVybmFsKGludCBpbmRleCkgeworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOworCX0KKworCXZvaWQgam9pbkNvbHVtblJlbW92ZWQoaW50IGluZGV4LCBOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pIHsKKwkJdGhpcy5maXJlSXRlbVJlbW92ZWQoSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBqb2luQ29sdW1uKTsKKwl9CisKKworCS8vICoqKioqKioqKiogTmVzdGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7CisJCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZEFubm90YXRpb24pOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBvbGRPdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKKwkJZm9yIChKb2luQ29sdW1uQW5ub3RhdGlvbiBvbGRKb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9sZE92ZXJyaWRlLmpvaW5Db2x1bW5zKCkpKSB7CisJCQlOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIG5ld0pvaW5Db2x1bW4gPSB0aGlzLmFkZEpvaW5Db2x1bW4ob2xkT3ZlcnJpZGUuaW5kZXhPZkpvaW5Db2x1bW4ob2xkSm9pbkNvbHVtbikpOworCQkJbmV3Sm9pbkNvbHVtbi5pbml0aWFsaXplRnJvbSgoTmVzdGFibGVBbm5vdGF0aW9uKSBvbGRKb2luQ29sdW1uKTsKKwkJfQorCX0KKworCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gY29udGFpbmVyICoqKioqKioqKioKKworCS8qKgorCSAqIGFkYXB0IHRoZSBBbm5vdGF0aW9uQ29udGFpbmVyIGludGVyZmFjZSB0byB0aGUgb3ZlcnJpZGUncyBqb2luIGNvbHVtbnMKKwkgKi8KKwljbGFzcyBKb2luQ29sdW1uc0Fubm90YXRpb25Db250YWluZXIKKwkJaW1wbGVtZW50cyBBbm5vdGF0aW9uQ29udGFpbmVyPE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24+IAorCXsKKwkJcHVibGljIFN0cmluZyBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZSgpIHsKKwkJCXJldHVybiBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi50aGlzLmdldEFubm90YXRpb25OYW1lKCk7CisJCX0KKworCQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0Q29udGFpbmVySmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkJcmV0dXJuIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLnRoaXMuZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7CisJCQlyZXR1cm4gSlBBLkFTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX0NPTFVNTlM7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7CisJCQlyZXR1cm4gSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCQl9CisKKwkJcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBuZXN0ZWRBbm5vdGF0aW9ucygpIHsKKwkJCXJldHVybiBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi50aGlzLm5lc3RhYmxlSm9pbkNvbHVtbnMoKTsKKwkJfQorCisJCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgeworCQkJcmV0dXJuIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLnRoaXMuam9pbkNvbHVtbnNTaXplKCk7CisJCX0KKworCQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGROZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoKSB7CisJCQlyZXR1cm4gU291cmNlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24udGhpcy5hZGRKb2luQ29sdW1uSW50ZXJuYWwoKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25BZGRlZChpbnQgaW5kZXgsIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbikgeworCQkJU291cmNlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24udGhpcy5qb2luQ29sdW1uQWRkZWQoaW5kZXgsIG5lc3RlZEFubm90YXRpb24pOworCQl9CisKKwkJcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gbW92ZU5lc3RlZEFubm90YXRpb25JbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQkJcmV0dXJuIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLnRoaXMubW92ZUpvaW5Db2x1bW5JbnRlcm5hbCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl9CisKKwkJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvbk1vdmVkKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCQlTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi50aGlzLmpvaW5Db2x1bW5Nb3ZlZCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl9CisKKwkJcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gcmVtb3ZlTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKGludCBpbmRleCkgeworCQkJcmV0dXJuIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLnRoaXMucmVtb3ZlSm9pbkNvbHVtbkludGVybmFsKGluZGV4KTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25SZW1vdmVkKGludCBpbmRleCwgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uKSB7CisJCQlTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi50aGlzLmpvaW5Db2x1bW5SZW1vdmVkKGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YWNmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuQXNzb2NpYXRpb25PdmVycmlkZXMKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxNZW1iZXI+CisJaW1wbGVtZW50cyBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24KK3sKKwlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgZmluYWwgVmVjdG9yPE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gbmV3IFZlY3RvcjxOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uPigpOworCisKKwlwcm90ZWN0ZWQgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMuaW5pdGlhbGl6ZSh0aGlzLCBhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLnVwZGF0ZSh0aGlzLCBhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQW5ub3RhdGlvbkNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpOworCX0KKworCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRDb250YWluZXJKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEpkdEFubm90YXRpb24oYXN0Um9vdCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVNfX1ZBTFVFOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24+IG5lc3RlZEFubm90YXRpb25zKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24+KHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMpOworCX0KKworCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlcy5zaXplKCk7CisJfQorCisJcHVibGljIE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYWRkTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKCkgeworCQlOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZSh0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzLnNpemUoKSk7CisJCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZXMuYWRkKGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQlyZXR1cm4gYXNzb2NpYXRpb25PdmVycmlkZTsKKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGUoaW50IGluZGV4KTsKKworCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25BZGRlZChpbnQgaW5kZXgsIE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbikgeworCQl0aGlzLmZpcmVJdGVtQWRkZWQoQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBtb3ZlTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpLmdldCh0YXJnZXRJbmRleCk7CisJfQorCisJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvbk1vdmVkKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXRoaXMuZmlyZUl0ZW1Nb3ZlZChBU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiByZW1vdmVOZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVzLnJlbW92ZShpbmRleCk7CisJfQorCisJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvblJlbW92ZWQoaW50IGluZGV4LCBOZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb24pIHsKKwkJdGhpcy5maXJlSXRlbVJlbW92ZWQoQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjdmZGIyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVDb2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5BdHRyaWJ1dGVPdmVycmlkZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VPdmVycmlkZUFubm90YXRpb24KKwlpbXBsZW1lbnRzIE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIGZpbmFsIE1lbWJlckFubm90YXRpb25BZGFwdGVyIGNvbHVtbkFkYXB0ZXI7CisJcHJpdmF0ZSBOZXN0YWJsZUNvbHVtbkFubm90YXRpb24gY29sdW1uOworCisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgU291cmNlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKKwkJc3VwZXIocGFyZW50LCBtZW1iZXIsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOworCQl0aGlzLmNvbHVtbkFkYXB0ZXIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5tZW1iZXIsIFNvdXJjZUNvbHVtbkFubm90YXRpb24uYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BZGFwdGVyKHRoaXMuZGFhKSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7CisJCWlmICh0aGlzLmNvbHVtbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihhc3RSb290KSAhPSBudWxsKSB7CisJCQl0aGlzLmNvbHVtbiA9IFNvdXJjZUNvbHVtbkFubm90YXRpb24uY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4odGhpcywgdGhpcy5tZW1iZXIsIHRoaXMuZGFhKTsKKwkJCXRoaXMuY29sdW1uLmluaXRpYWxpemUoYXN0Um9vdCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOworCQl0aGlzLnVwZGF0ZUNvbHVtbihhc3RSb290KTsKKwl9CisKKworCS8vICoqKioqKioqKiogU291cmNlT3ZlcnJpZGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLkFUVFJJQlVURV9PVkVSUklERV9fTkFNRTsKKwl9CisJCisKKwkvLyoqKioqKioqKioqKiBBdHRyaWJ1dGVPdmVycmlkZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCisKKwkvLyAqKioqKiBjb2x1bW4KKwlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW4oKSB7CisJCXJldHVybiB0aGlzLmNvbHVtbjsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVDb2x1bW5Bbm5vdGF0aW9uIGFkZENvbHVtbigpIHsKKwkJTmVzdGFibGVDb2x1bW5Bbm5vdGF0aW9uIGNvbCA9IFNvdXJjZUNvbHVtbkFubm90YXRpb24uY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4odGhpcywgdGhpcy5tZW1iZXIsIHRoaXMuZGFhKTsKKwkJY29sLm5ld0Fubm90YXRpb24oKTsKKwkJdGhpcy5zZXRDb2x1bW4oY29sKTsKKwkJcmV0dXJuIGNvbDsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW4oKSB7CisJCXRoaXMuY29sdW1uLnJlbW92ZUFubm90YXRpb24oKTsKKwkJc2V0Q29sdW1uKG51bGwpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRDb2x1bW4oTmVzdGFibGVDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbikgeworCQlDb2x1bW5Bbm5vdGF0aW9uIG9sZCA9IHRoaXMuY29sdW1uOworCQl0aGlzLmNvbHVtbiA9IGNvbHVtbjsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTFVNTl9QUk9QRVJUWSwgb2xkLCBjb2x1bW4pOworCX0KKworCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGdldE5vbk51bGxDb2x1bW4oKSB7CisJCXJldHVybiAodGhpcy5jb2x1bW4gIT0gbnVsbCkgPyB0aGlzLmNvbHVtbiA6IG5ldyBOdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5Bbm5vdGF0aW9uKHRoaXMpOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVDb2x1bW4oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJaWYgKHRoaXMuY29sdW1uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpID09IG51bGwpIHsKKwkJCXRoaXMuc2V0Q29sdW1uKG51bGwpOworCQl9IGVsc2UgeworCQkJaWYgKHRoaXMuY29sdW1uID09IG51bGwpIHsKKwkJCQlOZXN0YWJsZUNvbHVtbkFubm90YXRpb24gY29sID0gU291cmNlQ29sdW1uQW5ub3RhdGlvbi5jcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbih0aGlzLCB0aGlzLm1lbWJlciwgdGhpcy5kYWEpOworCQkJCWNvbC5pbml0aWFsaXplKGFzdFJvb3QpOworCQkJCXRoaXMuc2V0Q29sdW1uKGNvbCk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuY29sdW1uLnVwZGF0ZShhc3RSb290KTsKKwkJCX0KKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBOZXN0YWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQW5ub3RhdGlvbik7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBvbGRPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIG9sZEFubm90YXRpb247CisJCUNvbHVtbkFubm90YXRpb24gb2xkQ29sdW1uID0gb2xkT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7CisJCWlmIChvbGRDb2x1bW4gIT0gbnVsbCkgeworCQkJTmVzdGFibGVDb2x1bW5Bbm5vdGF0aW9uIG5ld0NvbHVtbiA9IHRoaXMuYWRkQ29sdW1uKCk7CisJCQluZXdDb2x1bW4uaW5pdGlhbGl6ZUZyb20oKE5lc3RhYmxlQW5ub3RhdGlvbikgb2xkQ29sdW1uKTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUikpOworCX0KKworCXN0YXRpYyBTb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYnVpbGROZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGF0dHJpYnV0ZU92ZXJyaWRlc0FkYXB0ZXIpIHsKKwkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IGJ1aWxkTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCwgYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlcik7CisJCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBpZGFhKTsKKwkJcmV0dXJuIG5ldyBTb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24ocGFyZW50LCBtZW1iZXIsIGlkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGF0dHJpYnV0ZU92ZXJyaWRlc0FkYXB0ZXIpIHsKKwkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyLCBpbmRleCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDQxNzY2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5BdHRyaWJ1dGVPdmVycmlkZXMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248TWVtYmVyPgorCWltcGxlbWVudHMgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbgoreworCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8TmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24+IGF0dHJpYnV0ZXNPdmVycmlkZXMgPSBuZXcgVmVjdG9yPE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uPigpOworCisKKwlwdWJsaWMgU291cmNlQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLmluaXRpYWxpemUodGhpcywgYXN0Um9vdCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy51cGRhdGUodGhpcywgYXN0Um9vdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5hdHRyaWJ1dGVzT3ZlcnJpZGVzKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQW5ub3RhdGlvbkNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpOworCX0KKworCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRDb250YWluZXJKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEpkdEFubm90YXRpb24oYXN0Um9vdCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTX19WQUxVRTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24+IG5lc3RlZEFubm90YXRpb25zKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uPih0aGlzLmF0dHJpYnV0ZXNPdmVycmlkZXMpOworCX0KKworCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzT3ZlcnJpZGVzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYWRkTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKCkgeworCQlOZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IHRoaXMuYnVpbGRBdHRyaWJ1dGVPdmVycmlkZSh0aGlzLmF0dHJpYnV0ZXNPdmVycmlkZXMuc2l6ZSgpKTsKKwkJdGhpcy5hdHRyaWJ1dGVzT3ZlcnJpZGVzLmFkZChhdHRyaWJ1dGVPdmVycmlkZSk7CisJCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZTsKKwl9CisKKwlwcml2YXRlIE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGUoaW50IGluZGV4KSB7CisJCXJldHVybiBTb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uYnVpbGROZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZSh0aGlzLCB0aGlzLm1lbWJlciwgaW5kZXgsIHRoaXMuZGFhKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uQWRkZWQoaW50IGluZGV4LCBOZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uKSB7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChBVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gbW92ZU5lc3RlZEFubm90YXRpb25JbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5hdHRyaWJ1dGVzT3ZlcnJpZGVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpLmdldCh0YXJnZXRJbmRleCk7CisJfQorCisJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvbk1vdmVkKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXRoaXMuZmlyZUl0ZW1Nb3ZlZChBVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJfQorCisJcHVibGljIE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIHJlbW92ZU5lc3RlZEFubm90YXRpb25JbnRlcm5hbChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIHRoaXMuYXR0cmlidXRlc092ZXJyaWRlcy5yZW1vdmUoaW5kZXgpOworCX0KKworCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25SZW1vdmVkKGludCBpbmRleCwgTmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbikgeworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChBVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QsIGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VCYXNlQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUJhc2VDb2x1bW5Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZhYzM2YgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VCYXNlQ29sdW1uQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VDb2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uCisgKi8KK2Fic3RyYWN0IGNsYXNzIFNvdXJjZUJhc2VDb2x1bW5Bbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VOYW1lZENvbHVtbkFubm90YXRpb24KKwlpbXBsZW1lbnRzIEJhc2VDb2x1bW5Bbm5vdGF0aW9uCit7CisJZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0YWJsZURlY2xhcmF0aW9uQWRhcHRlcjsKKwlmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0YWJsZUFkYXB0ZXI7CisJU3RyaW5nIHRhYmxlOworCisJZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gdW5pcXVlRGVjbGFyYXRpb25BZGFwdGVyOworCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiB1bmlxdWVBZGFwdGVyOworCUJvb2xlYW4gdW5pcXVlOworCisJZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gbnVsbGFibGVEZWNsYXJhdGlvbkFkYXB0ZXI7CisJZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG51bGxhYmxlQWRhcHRlcjsKKwlCb29sZWFuIG51bGxhYmxlOworCisJZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gaW5zZXJ0YWJsZURlY2xhcmF0aW9uQWRhcHRlcjsKKwlmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gaW5zZXJ0YWJsZUFkYXB0ZXI7CisJQm9vbGVhbiBpbnNlcnRhYmxlOworCisJZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gdXBkYXRhYmxlRGVjbGFyYXRpb25BZGFwdGVyOworCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiB1cGRhdGFibGVBZGFwdGVyOworCUJvb2xlYW4gdXBkYXRhYmxlOworCisKKwlTb3VyY2VCYXNlQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKKwkJdGhpcyhwYXJlbnQsIG1lbWJlciwgZGFhLCBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBkYWEpKTsKKwl9CisJCisJU291cmNlQmFzZUNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgeworCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7CisJCXRoaXMudGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIodGhpcy5nZXRUYWJsZUVsZW1lbnROYW1lKCkpOworCQl0aGlzLnRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRFbGVtZW50QWRhcHRlcih0aGlzLnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyKTsKKwkJdGhpcy51bmlxdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMuZ2V0VW5pcXVlRWxlbWVudE5hbWUoKSk7CisJCXRoaXMudW5pcXVlQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy51bmlxdWVEZWNsYXJhdGlvbkFkYXB0ZXIpOworCQl0aGlzLm51bGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLmdldE51bGxhYmxlRWxlbWVudE5hbWUoKSk7CisJCXRoaXMubnVsbGFibGVBZGFwdGVyID0gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLm51bGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyKTsKKwkJdGhpcy5pbnNlcnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLmdldEluc2VydGFibGVFbGVtZW50TmFtZSgpKTsKKwkJdGhpcy5pbnNlcnRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy5pbnNlcnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyKTsKKwkJdGhpcy51cGRhdGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMuZ2V0VXBkYXRhYmxlRWxlbWVudE5hbWUoKSk7CisJCXRoaXMudXBkYXRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy51cGRhdGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7CisJCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUoYXN0Um9vdCk7CisJCXRoaXMudW5pcXVlID0gdGhpcy5idWlsZFVuaXF1ZShhc3RSb290KTsKKwkJdGhpcy5udWxsYWJsZSA9IHRoaXMuYnVpbGROdWxsYWJsZShhc3RSb290KTsKKwkJdGhpcy5pbnNlcnRhYmxlID0gdGhpcy5idWlsZEluc2VydGFibGUoYXN0Um9vdCk7CisJCXRoaXMudXBkYXRhYmxlID0gdGhpcy5idWlsZFVwZGF0YWJsZShhc3RSb290KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnVwZGF0ZShhc3RSb290KTsKKwkJdGhpcy5zZXRUYWJsZSh0aGlzLmJ1aWxkVGFibGUoYXN0Um9vdCkpOworCQl0aGlzLnNldFVuaXF1ZSh0aGlzLmJ1aWxkVW5pcXVlKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXROdWxsYWJsZSh0aGlzLmJ1aWxkTnVsbGFibGUoYXN0Um9vdCkpOworCQl0aGlzLnNldEluc2VydGFibGUodGhpcy5idWlsZEluc2VydGFibGUoYXN0Um9vdCkpOworCQl0aGlzLnNldFVwZGF0YWJsZSh0aGlzLmJ1aWxkVXBkYXRhYmxlKGFzdFJvb3QpKTsKKwl9CisJCisKKwkvLyoqKioqKioqKioqKiogQmFzZUNvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKgorCisJLy8gKioqKiogdGFibGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy50YWJsZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUYWJsZShTdHJpbmcgdGFibGUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMudGFibGUsIHRhYmxlKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLnRhYmxlOworCQl0aGlzLnRhYmxlID0gdGFibGU7CisJCXRoaXMudGFibGVBZGFwdGVyLnNldFZhbHVlKHRhYmxlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX1BST1BFUlRZLCBvbGQsIHRhYmxlKTsKKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRUYWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy50YWJsZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gdGFibGVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMudGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7CisJfQorCisJYWJzdHJhY3QgU3RyaW5nIGdldFRhYmxlRWxlbWVudE5hbWUoKTsKKworCS8vICoqKioqIHVuaXF1ZQorCXB1YmxpYyBCb29sZWFuIGdldFVuaXF1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudW5pcXVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZShCb29sZWFuIHVuaXF1ZSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy51bmlxdWUsIHVuaXF1ZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlCb29sZWFuIG9sZCA9IHRoaXMudW5pcXVlOworCQl0aGlzLnVuaXF1ZSA9IHVuaXF1ZTsKKwkJdGhpcy51bmlxdWVBZGFwdGVyLnNldFZhbHVlKHVuaXF1ZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVTklRVUVfUFJPUEVSVFksIG9sZCwgdW5pcXVlKTsKKwl9CisKKwlwcml2YXRlIEJvb2xlYW4gYnVpbGRVbmlxdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMudW5pcXVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRVbmlxdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnVuaXF1ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7CisJfQorCQorCWFic3RyYWN0IFN0cmluZyBnZXRVbmlxdWVFbGVtZW50TmFtZSgpOworCisJLy8gKioqKiogbnVsbGFibGUKKwlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMubnVsbGFibGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiBudWxsYWJsZSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5udWxsYWJsZSwgbnVsbGFibGUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJQm9vbGVhbiBvbGQgPSB0aGlzLm51bGxhYmxlOworCQl0aGlzLm51bGxhYmxlID0gbnVsbGFibGU7CisJCXRoaXMubnVsbGFibGVBZGFwdGVyLnNldFZhbHVlKG51bGxhYmxlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5VTExBQkxFX1BST1BFUlRZLCBvbGQsIG51bGxhYmxlKTsKKwl9CisKKwlwcml2YXRlIEJvb2xlYW4gYnVpbGROdWxsYWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5udWxsYWJsZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TnVsbGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm51bGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisJCisJYWJzdHJhY3QgU3RyaW5nIGdldE51bGxhYmxlRWxlbWVudE5hbWUoKTsKKworCS8vICoqKioqIGluc2VydGFibGUKKwlwdWJsaWMgQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5pbnNlcnRhYmxlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEluc2VydGFibGUoQm9vbGVhbiBpbnNlcnRhYmxlKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmluc2VydGFibGUsIGluc2VydGFibGUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJQm9vbGVhbiBvbGQgPSB0aGlzLmluc2VydGFibGU7CisJCXRoaXMuaW5zZXJ0YWJsZSA9IGluc2VydGFibGU7CisJCXRoaXMuaW5zZXJ0YWJsZUFkYXB0ZXIuc2V0VmFsdWUoaW5zZXJ0YWJsZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJTlNFUlRBQkxFX1BST1BFUlRZLCBvbGQsIGluc2VydGFibGUpOworCX0KKworCXByaXZhdGUgQm9vbGVhbiBidWlsZEluc2VydGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuaW5zZXJ0YWJsZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SW5zZXJ0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuaW5zZXJ0YWJsZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7CisJfQorCQorCWFic3RyYWN0IFN0cmluZyBnZXRJbnNlcnRhYmxlRWxlbWVudE5hbWUoKTsKKworCS8vICoqKioqIHVwZGF0YWJsZQorCXB1YmxpYyBCb29sZWFuIGdldFVwZGF0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMudXBkYXRhYmxlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVwZGF0YWJsZShCb29sZWFuIHVwZGF0YWJsZSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy51cGRhdGFibGUsIHVwZGF0YWJsZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlCb29sZWFuIG9sZCA9IHRoaXMudXBkYXRhYmxlOworCQl0aGlzLnVwZGF0YWJsZSA9IHVwZGF0YWJsZTsKKwkJdGhpcy51cGRhdGFibGVBZGFwdGVyLnNldFZhbHVlKHVwZGF0YWJsZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVUERBVEFCTEVfUFJPUEVSVFksIG9sZCwgdXBkYXRhYmxlKTsKKwl9CisKKwlwcml2YXRlIEJvb2xlYW4gYnVpbGRVcGRhdGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMudXBkYXRhYmxlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFVwZGF0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudXBkYXRhYmxlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisJCisJYWJzdHJhY3QgU3RyaW5nIGdldFVwZGF0YWJsZUVsZW1lbnROYW1lKCk7CisKKworCS8vKioqKioqKioqKioqKiBOZXN0YWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQW5ub3RhdGlvbik7CisJCUJhc2VDb2x1bW5Bbm5vdGF0aW9uIG9sZENvbHVtbiA9IChCYXNlQ29sdW1uQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKKwkJdGhpcy5zZXRUYWJsZShvbGRDb2x1bW4uZ2V0VGFibGUoKSk7CisJCXRoaXMuc2V0VW5pcXVlKG9sZENvbHVtbi5nZXRVbmlxdWUoKSk7CisJCXRoaXMuc2V0TnVsbGFibGUob2xkQ29sdW1uLmdldE51bGxhYmxlKCkpOworCQl0aGlzLnNldEluc2VydGFibGUob2xkQ29sdW1uLmdldEluc2VydGFibGUoKSk7CisJCXRoaXMuc2V0VXBkYXRhYmxlKG9sZENvbHVtbi5nZXRVcGRhdGFibGUoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBlNjlhOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VCYXNlTmFtZWRRdWVyeUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25Db250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5CYXNlTmFtZWRRdWVyeUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVRdWVyeUhpbnRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUXVlcnlIaW50QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcnkKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkTmF0aXZlUXVlcnkKKyAqLworYWJzdHJhY3QgY2xhc3MgU291cmNlQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPFR5cGU+IAorCWltcGxlbWVudHMgQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uCit7CisJZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lRGVjbGFyYXRpb25BZGFwdGVyOworCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOworCVN0cmluZyBuYW1lOworCisJZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBxdWVyeURlY2xhcmF0aW9uQWRhcHRlcjsKKwlmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBxdWVyeUFkYXB0ZXI7CisJU3RyaW5nIHF1ZXJ5OworCisJZmluYWwgVmVjdG9yPE5lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbj4gaGludHMgPSBuZXcgVmVjdG9yPE5lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbj4oKTsKKwlmaW5hbCBIaW50c0Fubm90YXRpb25Db250YWluZXIgaGludHNDb250YWluZXIgPSBuZXcgSGludHNBbm5vdGF0aW9uQ29udGFpbmVyKCk7CisKKworCVNvdXJjZUJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlLERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgeworCQlzdXBlcihwYXJlbnQsIHR5cGUsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOworCQl0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIoZGFhKTsKKwkJdGhpcy5xdWVyeURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRRdWVyeUFkYXB0ZXIoZGFhKTsKKwkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7CisJCXRoaXMucXVlcnlBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIodGhpcy5xdWVyeURlY2xhcmF0aW9uQWRhcHRlcik7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZShhc3RSb290KTsKKwkJdGhpcy5xdWVyeSA9IHRoaXMuYnVpbGRRdWVyeShhc3RSb290KTsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLmluaXRpYWxpemUodGhpcy5oaW50c0NvbnRhaW5lciwgYXN0Um9vdCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0TmFtZSh0aGlzLmJ1aWxkTmFtZShhc3RSb290KSk7CisJCXRoaXMuc2V0UXVlcnkodGhpcy5idWlsZFF1ZXJ5KGFzdFJvb3QpKTsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLnVwZGF0ZSh0aGlzLmhpbnRzQ29udGFpbmVyLCBhc3RSb290KTsKKwl9CisKKwkvKioKKwkgKiBjb252ZW5pZW5jZSBtZXRob2QKKwkgKi8KKwlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7CisJCXJldHVybiBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5tZW1iZXIsIGRhZWEpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBuYW1lCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMubmFtZSwgbmFtZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5hbWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKwlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhQWRhcHRlcikgeworCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFBZGFwdGVyLCB0aGlzLmdldE5hbWVFbGVtZW50TmFtZSgpKTsKKwl9CisKKwlhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCk7CisKKwkvLyAqKioqKiBxdWVyeQorCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnkoKSB7CisJCXJldHVybiB0aGlzLnF1ZXJ5OworCX0KKworCXB1YmxpYyB2b2lkIHNldFF1ZXJ5KFN0cmluZyBxdWVyeSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5xdWVyeSwgcXVlcnkpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMucXVlcnk7CisJCXRoaXMucXVlcnkgPSBxdWVyeTsKKwkJdGhpcy5xdWVyeUFkYXB0ZXIuc2V0VmFsdWUocXVlcnkpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVFUllfUFJPUEVSVFksIG9sZCwgcXVlcnkpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkUXVlcnkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMucXVlcnlBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UXVlcnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnF1ZXJ5RGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKwlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRRdWVyeUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYUFkYXB0ZXIpIHsKKwkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhQWRhcHRlciwgdGhpcy5nZXRRdWVyeUVsZW1lbnROYW1lKCkpOworCX0KKworCWFic3RyYWN0IFN0cmluZyBnZXRRdWVyeUVsZW1lbnROYW1lKCk7CisKKwkvLyAqKioqKiBoaW50cworCXB1YmxpYyBMaXN0SXRlcmF0b3I8UXVlcnlIaW50QW5ub3RhdGlvbj4gaGludHMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8UXVlcnlIaW50QW5ub3RhdGlvbj4odGhpcy5oaW50cyk7CisJfQorCisJTGlzdEl0ZXJhdG9yPE5lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbj4gbmVzdGFibGVIaW50cygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZVF1ZXJ5SGludEFubm90YXRpb24+KHRoaXMuaGludHMpOworCX0KKworCXB1YmxpYyBpbnQgaGludHNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5oaW50cy5zaXplKCk7CisJfQorCisJcHVibGljIE5lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbiBoaW50QXQoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLmhpbnRzLmdldChpbmRleCk7CisJfQorCisJcHVibGljIGludCBpbmRleE9mSGludChRdWVyeUhpbnRBbm5vdGF0aW9uIHF1ZXJ5SGludCkgeworCQlyZXR1cm4gdGhpcy5oaW50cy5pbmRleE9mKHF1ZXJ5SGludCk7CisJfQorCisJcHVibGljIE5lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbiBhZGRIaW50KGludCBpbmRleCkgeworCQlyZXR1cm4gKE5lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbikgQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgsIHRoaXMuaGludHNDb250YWluZXIpOworCX0KKworCU5lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbiBhZGRIaW50SW50ZXJuYWwoKSB7CisJCU5lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbiBoaW50ID0gdGhpcy5idWlsZFF1ZXJ5SGludCh0aGlzLmhpbnRzLnNpemUoKSk7CisJCXRoaXMuaGludHMuYWRkKGhpbnQpOworCQlyZXR1cm4gaGludDsKKwl9CisKKwlhYnN0cmFjdCBOZXN0YWJsZVF1ZXJ5SGludEFubm90YXRpb24gYnVpbGRRdWVyeUhpbnQoaW50IGluZGV4KTsKKworCXZvaWQgaGludEFkZGVkKGludCBpbmRleCwgTmVzdGFibGVRdWVyeUhpbnRBbm5vdGF0aW9uIGhpbnQpIHsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKEhJTlRTX0xJU1QsIGluZGV4LCBoaW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlSGludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMubW92ZU5lc3RlZEFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmhpbnRzQ29udGFpbmVyKTsKKwl9CisKKwlOZXN0YWJsZVF1ZXJ5SGludEFubm90YXRpb24gbW92ZUhpbnRJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5oaW50cywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KS5nZXQodGFyZ2V0SW5kZXgpOworCX0KKworCXZvaWQgaGludE1vdmVkKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXRoaXMuZmlyZUl0ZW1Nb3ZlZChISU5UU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUhpbnQoaW50IGluZGV4KSB7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy5yZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKGluZGV4LCB0aGlzLmhpbnRzQ29udGFpbmVyKTsKKwl9CisKKwlOZXN0YWJsZVF1ZXJ5SGludEFubm90YXRpb24gcmVtb3ZlSGludEludGVybmFsKGludCBpbmRleCkgeworCQlyZXR1cm4gdGhpcy5oaW50cy5yZW1vdmUoaW5kZXgpOworCX0KKworCXZvaWQgaGludFJlbW92ZWQoaW50IGluZGV4LCBOZXN0YWJsZVF1ZXJ5SGludEFubm90YXRpb24gaGludCkgeworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChISU5UU19MSVNULCBpbmRleCwgaGludCk7CisJfQorCisJYWJzdHJhY3QgU3RyaW5nIGdldEhpbnRzRWxlbWVudE5hbWUoKTsKKworCisJLy8gKioqKioqKioqKiBOZXN0YWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLyoqCisJICogY29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGZyb20gTmVzdGFibGVBbm5vdGF0aW9uIGludGVyZmFjZQorCSAqIGZvciBzdWJjbGFzc2VzCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKKwkJQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uIG9sZFF1ZXJ5ID0gKEJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKKwkJdGhpcy5zZXROYW1lKG9sZFF1ZXJ5LmdldE5hbWUoKSk7CisJCXRoaXMuc2V0UXVlcnkob2xkUXVlcnkuZ2V0UXVlcnkoKSk7CisJCWZvciAoUXVlcnlIaW50QW5ub3RhdGlvbiBvbGRRdWVyeUhpbnQgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob2xkUXVlcnkuaGludHMoKSkpIHsKKwkJCU5lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbiBuZXdRdWVyeUhpbnQgPSB0aGlzLmFkZEhpbnQob2xkUXVlcnkuaW5kZXhPZkhpbnQob2xkUXVlcnlIaW50KSk7CisJCQluZXdRdWVyeUhpbnQuaW5pdGlhbGl6ZUZyb20oKE5lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbikgb2xkUXVlcnlIaW50KTsKKwkJfQorCX0KKworCS8qKgorCSAqIGNvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBmcm9tIE5lc3RhYmxlQW5ub3RhdGlvbiBpbnRlcmZhY2UKKwkgKiBmb3Igc3ViY2xhc3NlcworCSAqLworCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCkgeworCQl0aGlzLmdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpLm1vdmVBbm5vdGF0aW9uKG5ld0luZGV4KTsKKwl9CisKKwlwcml2YXRlIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBnZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKSB7CisJCXJldHVybiAoSW5kZXhlZEFubm90YXRpb25BZGFwdGVyKSB0aGlzLmFubm90YXRpb25BZGFwdGVyOworCX0KKworCisJLy8gKioqKioqKioqKiBoaW50IGNvbnRhaW5lciAqKioqKioqKioqCisKKwkvKioKKwkgKiBhZGFwdCB0aGUgQW5ub3RhdGlvbkNvbnRhaW5lciBpbnRlcmZhY2UgdG8gdGhlIG92ZXJyaWRlJ3Mgam9pbiBjb2x1bW5zCisJICovCisJY2xhc3MgSGludHNBbm5vdGF0aW9uQ29udGFpbmVyCisJCWltcGxlbWVudHMgQW5ub3RhdGlvbkNvbnRhaW5lcjxOZXN0YWJsZVF1ZXJ5SGludEFubm90YXRpb24+CisJeworCQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgeworCQkJcmV0dXJuIFNvdXJjZUJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbi50aGlzLmdldEFubm90YXRpb25OYW1lKCk7CisJCX0KKworCQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRDb250YWluZXJKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCQlyZXR1cm4gU291cmNlQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uLnRoaXMuZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7CisJCQlyZXR1cm4gU291cmNlQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uLnRoaXMuZ2V0SGludHNFbGVtZW50TmFtZSgpOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgeworCQkJcmV0dXJuIFF1ZXJ5SGludEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCQl9CisKKwkJcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZVF1ZXJ5SGludEFubm90YXRpb24+IG5lc3RlZEFubm90YXRpb25zKCkgeworCQkJcmV0dXJuIFNvdXJjZUJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbi50aGlzLm5lc3RhYmxlSGludHMoKTsKKwkJfQorCisJCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgeworCQkJcmV0dXJuIFNvdXJjZUJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbi50aGlzLmhpbnRzU2l6ZSgpOworCQl9CisKKwkJcHVibGljIE5lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbiBhZGROZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoKSB7CisJCQlyZXR1cm4gU291cmNlQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uLnRoaXMuYWRkSGludEludGVybmFsKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uQWRkZWQoaW50IGluZGV4LCBOZXN0YWJsZVF1ZXJ5SGludEFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbikgeworCQkJU291cmNlQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uLnRoaXMuaGludEFkZGVkKGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwkJfQorCisJCXB1YmxpYyBOZXN0YWJsZVF1ZXJ5SGludEFubm90YXRpb24gbW92ZU5lc3RlZEFubm90YXRpb25JbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQkJcmV0dXJuIFNvdXJjZUJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbi50aGlzLm1vdmVIaW50SW50ZXJuYWwodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25Nb3ZlZChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQkJU291cmNlQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uLnRoaXMuaGludE1vdmVkKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCX0KKworCQlwdWJsaWMgTmVzdGFibGVRdWVyeUhpbnRBbm5vdGF0aW9uIHJlbW92ZU5lc3RlZEFubm90YXRpb25JbnRlcm5hbChpbnQgaW5kZXgpIHsKKwkJCXJldHVybiBTb3VyY2VCYXNlTmFtZWRRdWVyeUFubm90YXRpb24udGhpcy5yZW1vdmVIaW50SW50ZXJuYWwoaW5kZXgpOworCQl9CisKKwkJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvblJlbW92ZWQoaW50IGluZGV4LCBOZXN0YWJsZVF1ZXJ5SGludEFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbikgeworCQkJU291cmNlQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uLnRoaXMuaGludFJlbW92ZWQoaW5kZXgsIG5lc3RlZEFubm90YXRpb24pOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzZVRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUJhc2VUYWJsZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDhmOWM1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUJhc2VUYWJsZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDM1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VUYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlRhYmxlCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luVGFibGUKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlNlY29uZGFyeVRhYmxlCisgKi8KK2Fic3RyYWN0IGNsYXNzIFNvdXJjZUJhc2VUYWJsZUFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248TWVtYmVyPgorCWltcGxlbWVudHMgQmFzZVRhYmxlQW5ub3RhdGlvbgoreworCWZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZURlY2xhcmF0aW9uQWRhcHRlcjsKKwlmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKKwlTdHJpbmcgbmFtZTsKKworCWZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2NoZW1hRGVjbGFyYXRpb25BZGFwdGVyOworCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHNjaGVtYUFkYXB0ZXI7CisJU3RyaW5nIHNjaGVtYTsKKworCWZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gY2F0YWxvZ0RlY2xhcmF0aW9uQWRhcHRlcjsKKwlmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjYXRhbG9nQWRhcHRlcjsKKwlTdHJpbmcgY2F0YWxvZzsKKworCWZpbmFsIFZlY3RvcjxOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IG5ldyBWZWN0b3I8TmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4oKTsKKwlmaW5hbCBVbmlxdWVDb25zdHJhaW50c0Fubm90YXRpb25Db250YWluZXIgdW5pcXVlQ29uc3RyYWludHNDb250YWluZXIgPSBuZXcgVW5pcXVlQ29uc3RyYWludHNBbm5vdGF0aW9uQ29udGFpbmVyKCk7CisKKworCVNvdXJjZUJhc2VUYWJsZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7CisJCXRoaXMocGFyZW50LCBtZW1iZXIsIGRhYSwgbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgZGFhKSk7CisJfQorCisJU291cmNlQmFzZVRhYmxlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKKwkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5nZXROYW1lQWRhcHRlcihkYWEpOworCQl0aGlzLnNjaGVtYURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuZ2V0U2NoZW1hQWRhcHRlcihkYWEpOworCQl0aGlzLmNhdGFsb2dEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmdldENhdGFsb2dBZGFwdGVyKGRhYSk7CisJCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7CisJCXRoaXMuc2NoZW1hQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5zY2hlbWFEZWNsYXJhdGlvbkFkYXB0ZXIpOworCQl0aGlzLmNhdGFsb2dBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLmNhdGFsb2dEZWNsYXJhdGlvbkFkYXB0ZXIpOworCX0KKworCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7CisJCXJldHVybiBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5tZW1iZXIsIGRhZWEpOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7CisJCXRoaXMuc2NoZW1hID0gdGhpcy5idWlsZFNjaGVtYShhc3RSb290KTsKKwkJdGhpcy5jYXRhbG9nID0gdGhpcy5idWlsZENhdGFsb2coYXN0Um9vdCk7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy5pbml0aWFsaXplKHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXIsIGFzdFJvb3QpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnNldE5hbWUodGhpcy5idWlsZE5hbWUoYXN0Um9vdCkpOworCQl0aGlzLnNldFNjaGVtYSh0aGlzLmJ1aWxkU2NoZW1hKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRDYXRhbG9nKHRoaXMuYnVpbGRDYXRhbG9nKGFzdFJvb3QpKTsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLnVwZGF0ZSh0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyLCBhc3RSb290KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHVuaXF1ZUNvbnN0cmFpbnRzIGVsZW1lbnQgbmFtZQorCSAqLworCWFic3RyYWN0IFN0cmluZyBnZXRVbmlxdWVDb25zdHJhaW50c0VsZW1lbnROYW1lKCk7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOworCX0KKworCisJLy8gKioqKioqKioqKiBCYXNlVGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJLy8gKioqKiogbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm5hbWUsIG5hbWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZShuYW1lKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXModGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOworCX0KKworCS8qKgorCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBkZWNsYXJhdGlvbiBlbGVtZW50IGFkYXB0ZXIgZm9yIHRoZSB0YWJsZSdzICduYW1lJyBlbGVtZW50CisJICovCisJYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXROYW1lQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpOworCisJLy8gKioqKiogc2NoZW1hCisJcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLnNjaGVtYTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5zY2hlbWEsIHNjaGVtYSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkID0gdGhpcy5zY2hlbWE7CisJCXRoaXMuc2NoZW1hID0gc2NoZW1hOworCQl0aGlzLnNjaGVtYUFkYXB0ZXIuc2V0VmFsdWUoc2NoZW1hKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkU2NoZW1hKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnNjaGVtYUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnNjaGVtYURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyh0aGlzLnNjaGVtYURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKKwl9CisKKwkvKioKKwkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgZGVjbGFyYXRpb24gZWxlbWVudCBhZGFwdGVyIGZvciB0aGUgdGFibGUncyAnc2NoZW1hJyBlbGVtZW50CisJICovCisJYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXRTY2hlbWFBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcik7CisKKwkvLyAqKioqKiBjYXRhbG9nCisJcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgeworCQlyZXR1cm4gdGhpcy5jYXRhbG9nOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuY2F0YWxvZywgY2F0YWxvZykpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkID0gdGhpcy5jYXRhbG9nOworCQl0aGlzLmNhdGFsb2cgPSBjYXRhbG9nOworCQl0aGlzLmNhdGFsb2dBZGFwdGVyLnNldFZhbHVlKGNhdGFsb2cpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZENhdGFsb2coQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuY2F0YWxvZ0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5jYXRhbG9nRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjYXRhbG9nVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyh0aGlzLmNhdGFsb2dEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7CisJfQorCisJLyoqCisJICogQnVpbGQgYW5kIHJldHVybiBhIGRlY2xhcmF0aW9uIGVsZW1lbnQgYWRhcHRlciBmb3IgdGhlIHRhYmxlJ3MgJ2NhdGFsb2cnIGVsZW1lbnQKKwkgKi8KKwlhYnN0cmFjdCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdldENhdGFsb2dBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcik7CisKKwkvLyAqKioqKiB1bmlxdWUgY29uc3RyYWludHMKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4odGhpcy51bmlxdWVDb25zdHJhaW50cyk7CisJfQorCisJTGlzdEl0ZXJhdG9yPE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IG5lc3RhYmxlVW5pcXVlQ29uc3RyYWludHMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4odGhpcy51bmlxdWVDb25zdHJhaW50cyk7CisJfQorCisJcHVibGljIGludCB1bmlxdWVDb25zdHJhaW50c1NpemUoKSB7CisJCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QXQoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmdldChpbmRleCk7CisJfQorCisJcHVibGljIGludCBpbmRleE9mVW5pcXVlQ29uc3RyYWludChVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50KSB7CisJCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmluZGV4T2YodW5pcXVlQ29uc3RyYWludCk7CisJfQorCisJcHVibGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIChOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKSBBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMuYWRkTmVzdGVkQW5ub3RhdGlvbihpbmRleCwgdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lcik7CisJfQorCisJTmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBhZGRVbmlxdWVDb25zdHJhaW50SW50ZXJuYWwoKSB7CisJCU5lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCA9IHRoaXMuYnVpbGRVbmlxdWVDb25zdHJhaW50KHRoaXMudW5pcXVlQ29uc3RyYWludHMuc2l6ZSgpKTsKKwkJdGhpcy51bmlxdWVDb25zdHJhaW50cy5hZGQodW5pcXVlQ29uc3RyYWludCk7CisJCXJldHVybiB1bmlxdWVDb25zdHJhaW50OworCX0KKworCU5lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gYnVpbGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgeworCQlyZXR1cm4gbmV3IFNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKHRoaXMsIHRoaXMubWVtYmVyLCBidWlsZFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uQWRhcHRlcihpbmRleCkpOworCX0KKworCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkVW5pcXVlQ29uc3RyYWludEFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCkgeworCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKHRoaXMuZGFhLCBnZXRVbmlxdWVDb25zdHJhaW50c0VsZW1lbnROYW1lKCksIGluZGV4LCBKUEEuVU5JUVVFX0NPTlNUUkFJTlQpOworCX0KKworCXZvaWQgdW5pcXVlQ29uc3RyYWludEFkZGVkKGludCBpbmRleCwgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBjb25zdHJhaW50KSB7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChVTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIGNvbnN0cmFpbnQpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy5tb3ZlTmVzdGVkQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXIpOworCX0KKworCU5lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gbW92ZVVuaXF1ZUNvbnN0cmFpbnRJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy51bmlxdWVDb25zdHJhaW50cywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KS5nZXQodGFyZ2V0SW5kZXgpOworCX0KKworCXZvaWQgdW5pcXVlQ29uc3RyYWludE1vdmVkKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXRoaXMuZmlyZUl0ZW1Nb3ZlZChVTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgeworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMucmVtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbmRleCwgdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lcik7CisJfQorCisJTmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiByZW1vdmVVbmlxdWVDb25zdHJhaW50SW50ZXJuYWwoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnJlbW92ZShpbmRleCk7CisJfQorCisJdm9pZCB1bmlxdWVDb25zdHJhaW50UmVtb3ZlZChpbnQgaW5kZXgsIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gY29uc3RyYWludCkgeworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChVTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIGNvbnN0cmFpbnQpOworCX0KKworCQorCS8vICoqKioqKioqKiogTmVzdGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7CisJCUJhc2VUYWJsZUFubm90YXRpb24gb2xkVGFibGUgPSAoQmFzZVRhYmxlQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKKwkJdGhpcy5zZXROYW1lKG9sZFRhYmxlLmdldE5hbWUoKSk7CisJCXRoaXMuc2V0U2NoZW1hKG9sZFRhYmxlLmdldFNjaGVtYSgpKTsKKwkJdGhpcy5zZXRDYXRhbG9nKG9sZFRhYmxlLmdldENhdGFsb2coKSk7CisJCWZvciAoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gb2xkVW5pcXVlQ29uc3RyYWludCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShvbGRUYWJsZS51bmlxdWVDb25zdHJhaW50cygpKSkgeworCQkJTmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBuZXdVbmlxdWVDb25zdHJhaW50ID0gdGhpcy5hZGRVbmlxdWVDb25zdHJhaW50KG9sZFRhYmxlLmluZGV4T2ZVbmlxdWVDb25zdHJhaW50KG9sZFVuaXF1ZUNvbnN0cmFpbnQpKTsKKwkJCW5ld1VuaXF1ZUNvbnN0cmFpbnQuaW5pdGlhbGl6ZUZyb20oKE5lc3RhYmxlQW5ub3RhdGlvbikgb2xkVW5pcXVlQ29uc3RyYWludCk7CisJCX0KKwl9CisJCisJLy8gKioqKioqKioqKiB1bmlxdWUgY29uc3RyYWludCBjb250YWluZXIgKioqKioqKioqKgorCisJLyoqCisJICogYWRhcHQgdGhlIEFubm90YXRpb25Db250YWluZXIgaW50ZXJmYWNlIHRvIHRoZSB0YWJsZSdzIHVuaXF1ZSBjb25zdHJhaW50cworCSAqLworCWNsYXNzIFVuaXF1ZUNvbnN0cmFpbnRzQW5ub3RhdGlvbkNvbnRhaW5lcgorCQlpbXBsZW1lbnRzIEFubm90YXRpb25Db250YWluZXI8TmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gCisJeworCQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgeworCQkJcmV0dXJuIFNvdXJjZUJhc2VUYWJsZUFubm90YXRpb24udGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpOworCQl9CisKKwkJcHVibGljIEFubm90YXRpb24gZ2V0Q29udGFpbmVySmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkJcmV0dXJuIFNvdXJjZUJhc2VUYWJsZUFubm90YXRpb24udGhpcy5nZXRKZHRBbm5vdGF0aW9uKGFzdFJvb3QpOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKKwkJCXJldHVybiBTb3VyY2VCYXNlVGFibGVBbm5vdGF0aW9uLnRoaXMuZ2V0VW5pcXVlQ29uc3RyYWludHNFbGVtZW50TmFtZSgpOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgeworCQkJcmV0dXJuIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwkJfQorCisJCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7CisJCQlyZXR1cm4gU291cmNlQmFzZVRhYmxlQW5ub3RhdGlvbi50aGlzLm5lc3RhYmxlVW5pcXVlQ29uc3RyYWludHMoKTsKKwkJfQorCisJCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgeworCQkJcmV0dXJuIFNvdXJjZUJhc2VUYWJsZUFubm90YXRpb24udGhpcy51bmlxdWVDb25zdHJhaW50c1NpemUoKTsKKwkJfQorCisJCXB1YmxpYyBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGFkZE5lc3RlZEFubm90YXRpb25JbnRlcm5hbCgpIHsKKwkJCXJldHVybiBTb3VyY2VCYXNlVGFibGVBbm5vdGF0aW9uLnRoaXMuYWRkVW5pcXVlQ29uc3RyYWludEludGVybmFsKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uQWRkZWQoaW50IGluZGV4LCBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb24pIHsKKwkJCVNvdXJjZUJhc2VUYWJsZUFubm90YXRpb24udGhpcy51bmlxdWVDb25zdHJhaW50QWRkZWQoaW5kZXgsIG5lc3RlZEFubm90YXRpb24pOworCQl9CisKKwkJcHVibGljIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gbW92ZU5lc3RlZEFubm90YXRpb25JbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQkJcmV0dXJuIFNvdXJjZUJhc2VUYWJsZUFubm90YXRpb24udGhpcy5tb3ZlVW5pcXVlQ29uc3RyYWludEludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uTW92ZWQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJCVNvdXJjZUJhc2VUYWJsZUFubm90YXRpb24udGhpcy51bmlxdWVDb25zdHJhaW50TW92ZWQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJfQorCisJCXB1YmxpYyBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHJlbW92ZU5lc3RlZEFubm90YXRpb25JbnRlcm5hbChpbnQgaW5kZXgpIHsKKwkJCXJldHVybiBTb3VyY2VCYXNlVGFibGVBbm5vdGF0aW9uLnRoaXMucmVtb3ZlVW5pcXVlQ29uc3RyYWludEludGVybmFsKGluZGV4KTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25SZW1vdmVkKGludCBpbmRleCwgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uKSB7CisJCQlTb3VyY2VCYXNlVGFibGVBbm5vdGF0aW9uLnRoaXMudW5pcXVlQ29uc3RyYWludFJlbW92ZWQoaW5kZXgsIG5lc3RlZEFubm90YXRpb24pOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzaWNBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzaWNBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlkNDQ2NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VCYXNpY0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkJhc2ljCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VCYXNpY0Fubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPgorCWltcGxlbWVudHMgQmFzaWNBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gT1BUSU9OQUxfQURBUFRFUiA9IGJ1aWxkT3B0aW9uYWxBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gb3B0aW9uYWxBZGFwdGVyOworCXByaXZhdGUgQm9vbGVhbiBvcHRpb25hbDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gRkVUQ0hfQURBUFRFUiA9IGJ1aWxkRmV0Y2hBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmZXRjaEFkYXB0ZXI7CisJcHJpdmF0ZSBGZXRjaFR5cGUgZmV0Y2g7CisKKworCXB1YmxpYyBTb3VyY2VCYXNpY0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJCXRoaXMub3B0aW9uYWxBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhdHRyaWJ1dGUsIE9QVElPTkFMX0FEQVBURVIpOworCQl0aGlzLmZldGNoQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhdHRyaWJ1dGUsIEZFVENIX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLm9wdGlvbmFsID0gdGhpcy5idWlsZE9wdGlvbmFsKGFzdFJvb3QpOworCQl0aGlzLmZldGNoID0gdGhpcy5idWlsZEZldGNoKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnNldE9wdGlvbmFsKHRoaXMuYnVpbGRPcHRpb25hbChhc3RSb290KSk7CisJCXRoaXMuc2V0RmV0Y2godGhpcy5idWlsZEZldGNoKGFzdFJvb3QpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLmZldGNoKTsKKwl9CisKKworCS8vKioqKioqKioqKioqKioqIEJhc2ljIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKKworCS8vICoqKioqIG9wdGlvbmFsCisJcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7CisJCXJldHVybiB0aGlzLm9wdGlvbmFsOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMub3B0aW9uYWwsIG9wdGlvbmFsKSkgeworCQkJcmV0dXJuOworCQl9CisJCUJvb2xlYW4gb2xkID0gdGhpcy5vcHRpb25hbDsKKwkJdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsOworCQl0aGlzLm9wdGlvbmFsQWRhcHRlci5zZXRWYWx1ZShvcHRpb25hbCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPUFRJT05BTF9QUk9QRVJUWSwgb2xkLCBvcHRpb25hbCk7CisJfQorCisJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRPcHRpb25hbChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5vcHRpb25hbEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKE9QVElPTkFMX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCS8vICoqKioqIGZldGNoCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKKwkJcmV0dXJuIHRoaXMuZmV0Y2g7CisJfQorCisJcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIGZldGNoKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmZldGNoLCBmZXRjaCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5mZXRjaDsKKwkJdGhpcy5mZXRjaCA9IGZldGNoOworCQl0aGlzLmZldGNoQWRhcHRlci5zZXRWYWx1ZShGZXRjaFR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKGZldGNoKSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGRVRDSF9QUk9QRVJUWSwgb2xkLCBmZXRjaCk7CisJfQorCisJcHJvdGVjdGVkIEZldGNoVHlwZSBidWlsZEZldGNoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBGZXRjaFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5mZXRjaEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShGRVRDSF9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRPcHRpb25hbEFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkJBU0lDX19PUFRJT05BTCwgZmFsc2UsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRGZXRjaEFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkJBU0lDX19GRVRDSCwgZmFsc2UpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VDb2x1bW5Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0ZmI4YgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VDb2x1bW5Bbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVDb2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUNvbHVtbkFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUJhc2VDb2x1bW5Bbm5vdGF0aW9uCisJaW1wbGVtZW50cyBOZXN0YWJsZUNvbHVtbkFubm90YXRpb24KK3sKKwkvLyB0aGlzIGFkYXB0ZXIgaXMgb25seSB1c2VkIGJ5IGEgQ29sdW1uIGFubm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgbWFwcGluZyBhbm5vdGF0aW9uIChlLmcuIEJhc2ljKQorCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBNQVBQSU5HX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGxlbmd0aERlY2xhcmF0aW9uQWRhcHRlcjsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBsZW5ndGhBZGFwdGVyOworCXByaXZhdGUgSW50ZWdlciBsZW5ndGg7CisKKwlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IHByZWNpc2lvbkRlY2xhcmF0aW9uQWRhcHRlcjsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBwcmVjaXNpb25BZGFwdGVyOworCXByaXZhdGUgSW50ZWdlciBwcmVjaXNpb247CisKKwlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IHNjYWxlRGVjbGFyYXRpb25BZGFwdGVyOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IHNjYWxlQWRhcHRlcjsKKwlwcml2YXRlIEludGVnZXIgc2NhbGU7CisKKworCXB1YmxpYyBTb3VyY2VDb2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgeworCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhKTsKKwkJdGhpcy5sZW5ndGhEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkSW50ZWdlckVsZW1lbnRBZGFwdGVyKEpQQS5DT0xVTU5fX0xFTkdUSCk7CisJCXRoaXMubGVuZ3RoQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRJbnRlZ2VyRWxlbWVudEFkYXB0ZXIodGhpcy5sZW5ndGhEZWNsYXJhdGlvbkFkYXB0ZXIpOworCQl0aGlzLnByZWNpc2lvbkRlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRJbnRlZ2VyRWxlbWVudEFkYXB0ZXIoSlBBLkNPTFVNTl9fUFJFQ0lTSU9OKTsKKwkJdGhpcy5wcmVjaXNpb25BZGFwdGVyID0gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEludGVnZXJFbGVtZW50QWRhcHRlcih0aGlzLnByZWNpc2lvbkRlY2xhcmF0aW9uQWRhcHRlcik7CisJCXRoaXMuc2NhbGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkSW50ZWdlckVsZW1lbnRBZGFwdGVyKEpQQS5DT0xVTU5fX1NDQUxFKTsKKwkJdGhpcy5zY2FsZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0SW50ZWdlckVsZW1lbnRBZGFwdGVyKHRoaXMuc2NhbGVEZWNsYXJhdGlvbkFkYXB0ZXIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOworCQl0aGlzLmxlbmd0aCA9IHRoaXMuYnVpbGRMZW5ndGgoYXN0Um9vdCk7CisJCXRoaXMucHJlY2lzaW9uID0gdGhpcy5idWlsZFByZWNpc2lvbihhc3RSb290KTsKKwkJdGhpcy5zY2FsZSA9IHRoaXMuYnVpbGRTY2FsZShhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOworCQl0aGlzLnNldExlbmd0aCh0aGlzLmJ1aWxkTGVuZ3RoKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRQcmVjaXNpb24odGhpcy5idWlsZFByZWNpc2lvbihhc3RSb290KSk7CisJCXRoaXMuc2V0U2NhbGUodGhpcy5idWlsZFNjYWxlKGFzdFJvb3QpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogSmF2YVNvdXJjZU5hbWVkQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLkNPTFVNTl9fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLkNPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047CisJfQorCisKKwkvLyAqKioqKioqKioqIEphdmFTb3VyY2VCYXNlQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0VGFibGVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5DT0xVTU5fX1RBQkxFOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRVbmlxdWVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5DT0xVTU5fX1VOSVFVRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0TnVsbGFibGVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5DT0xVTU5fX05VTExBQkxFOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRJbnNlcnRhYmxlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuQ09MVU1OX19JTlNFUlRBQkxFOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRVcGRhdGFibGVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5DT0xVTU5fX1VQREFUQUJMRTsKKwl9CisKKworCSAvLyAqKioqKioqKioqIENvbHVtbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBsZW5ndGgKKwlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKSB7CisJCXJldHVybiB0aGlzLmxlbmd0aDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoSW50ZWdlciBsZW5ndGgpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMubGVuZ3RoLCBsZW5ndGgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJSW50ZWdlciBvbGQgPSB0aGlzLmxlbmd0aDsKKwkJdGhpcy5sZW5ndGggPSBsZW5ndGg7CisJCXRoaXMubGVuZ3RoQWRhcHRlci5zZXRWYWx1ZShsZW5ndGgpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTEVOR1RIX1BST1BFUlRZLCBvbGQsIGxlbmd0aCk7CisJfQorCisJcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkTGVuZ3RoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmxlbmd0aEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRMZW5ndGhUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmxlbmd0aERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7CisJfQorCisJLy8gKioqKiogcHJlY2lzaW9uCisJcHVibGljIEludGVnZXIgZ2V0UHJlY2lzaW9uKCkgeworCQlyZXR1cm4gdGhpcy5wcmVjaXNpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0UHJlY2lzaW9uKEludGVnZXIgcHJlY2lzaW9uKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnByZWNpc2lvbiwgcHJlY2lzaW9uKSkgeworCQkJcmV0dXJuOworCQl9CisJCUludGVnZXIgb2xkID0gdGhpcy5wcmVjaXNpb247CisJCXRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uOworCQl0aGlzLnByZWNpc2lvbkFkYXB0ZXIuc2V0VmFsdWUocHJlY2lzaW9uKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBSRUNJU0lPTl9QUk9QRVJUWSwgb2xkLCBwcmVjaXNpb24pOworCX0KKworCXByaXZhdGUgSW50ZWdlciBidWlsZFByZWNpc2lvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5wcmVjaXNpb25BZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJlY2lzaW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5wcmVjaXNpb25EZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOworCX0KKworCS8vICoqKioqIHNjYWxlCisJcHVibGljIEludGVnZXIgZ2V0U2NhbGUoKSB7CisJCXJldHVybiB0aGlzLnNjYWxlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNjYWxlKEludGVnZXIgc2NhbGUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuc2NhbGUsIHNjYWxlKSkgeworCQkJcmV0dXJuOworCQl9CisJCUludGVnZXIgb2xkID0gdGhpcy5zY2FsZTsKKwkJdGhpcy5zY2FsZSA9IHNjYWxlOworCQl0aGlzLnNjYWxlQWRhcHRlci5zZXRWYWx1ZShzY2FsZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTQ0FMRV9QUk9QRVJUWSwgb2xkLCBzY2FsZSk7CisJfQorCisJcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkU2NhbGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuc2NhbGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NhbGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnNjYWxlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKworCSAvLyAqKioqKioqKioqIE5lc3RhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShOZXN0YWJsZUFubm90YXRpb24gb2xkQW5ub3RhdGlvbikgeworCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRBbm5vdGF0aW9uKTsKKwkJQ29sdW1uQW5ub3RhdGlvbiBvbGRDb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKKwkJdGhpcy5zZXRMZW5ndGgob2xkQ29sdW1uLmdldExlbmd0aCgpKTsKKwkJdGhpcy5zZXRQcmVjaXNpb24ob2xkQ29sdW1uLmdldFByZWNpc2lvbigpKTsKKwkJdGhpcy5zZXRTY2FsZShvbGRDb2x1bW4uZ2V0U2NhbGUoKSk7CisJfQorCisJcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7CisJCS8vIHRoZSBvbmx5IHBsYWNlIHdoZXJlIGEgY29sdW1uIGFubm90YXRpb24gaXMgbmVzdGVkIGlzIGluIGFuCisJCS8vIGF0dHJpYnV0ZSBvdmVycmlkZTsgYW5kIHRoYXQgb25seSBuZXN0cyBhIHNpbmdsZSBjb2x1bW4sIG5vdCBhbiBhcnJheQorCQkvLyBvZiBjb2x1bW5zOyBzbyAjbW92ZUFubm90YXRpb24oaW50KSBpcyBuZXZlciBjYWxsZWQKKwkJLy8gVE9ETyBtYXliZSBOZXN0YWJsZUFubm90YXRpb24gc2hvdWxkIGJlIHNwbGl0IHVwOworCQkvLyBtb3ZpbmcgdGhpcyBtZXRob2QgdG8gc29tZXRoaW5nIGxpa2UgSW5kZXhhYmxlQW5ub3RhdGlvbgorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJc3RhdGljIE5lc3RhYmxlQ29sdW1uQW5ub3RhdGlvbiBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BZGFwdGVyKSB7CisJCXJldHVybiBuZXcgU291cmNlQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlciwgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BZGFwdGVyKGF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIpKTsKKwl9CisKKwlzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BZGFwdGVyKSB7CisJCXJldHVybiBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihhdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BZGFwdGVyLCBKUEEuQVRUUklCVVRFX09WRVJSSURFX19DT0xVTU4sIEpQQS5DT0xVTU4pOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUNvbXBpbGF0aW9uVW5pdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUNvbXBpbGF0aW9uVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZWJjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTAsMCArMSwyNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VNb2RlbExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKKworLyoqCisgKiBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgKHNvdXJjZSBmaWxlKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlQ29tcGlsYXRpb25Vbml0CisJZXh0ZW5kcyBTb3VyY2VOb2RlCisJaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQKK3sKKwkvKiogSkRUIGNvbXBpbGF0aW9uIHVuaXQgKi8KKwlwcml2YXRlIGZpbmFsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0OworCisJLyoqIHBsdWdnYWJsZSBhbm5vdGF0aW9uIHByb3ZpZGVyICovCisJcHJpdmF0ZSBmaW5hbCBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyOworCisJLyoqIGltcHJvdmVkIGFubm90YXRpb24gZm9ybWF0dGluZyAqLworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7CisKKwkvKiogcGx1Z2dhYmxlIGV4ZWN1dG9yIHRoYXQgYWxsb3dzIHRoZSBkb2N1bWVudCB0byBiZSBtb2RpZmllZCBvbiBhbm90aGVyIHRocmVhZCAqLworCXByaXZhdGUgZmluYWwgQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yOworCisJLyoqIGxpc3RlbmVycyBub3RpZmllZCB3aGVuZXZlciB0aGUgcmVzb3VyY2UgbW9kZWwgY2hhbmdlcyAqLworCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0PEpwYVJlc291cmNlTW9kZWxMaXN0ZW5lcj4gcmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdDsKKworCS8qKgorCSAqIFRoZSBwcmltYXJ5IHR5cGUgb2YgdGhlIEFTVCBjb21waWxhdGlvbiB1bml0LiBXZSBhcmUgbm90IGdvaW5nIHRvIGhhbmRsZQorCSAqIG11bHRpcGxlIHR5cGVzIGRlZmluZWQgaW4gYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4gRW50aXRpZXMgbXVzdCBoYXZlCisJICogYSBwdWJsaWMvcHJvdGVjdGVkIG5vLWFyZyBjb25zdHJ1Y3RvciwgYW5kIHRoZXJlIGlzIG5vIHdheSB0byBhY2Nlc3MKKwkgKiB0aGUgY29uc3RydWN0b3IgaW4gYSBwYWNrYWdlIGNsYXNzICh3aGljaCBpcyB3aGF0IGFsbCB0b3AtbGV2ZWwsCisJICogbm9uLXByaW1hcnkgY2xhc3NlcyBtdXN0IGJlKS4KKwkgKi8KKwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGU7CQorCisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgU291cmNlQ29tcGlsYXRpb25Vbml0KAorCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCisJCQlKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyLCAKKwkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyLAorCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7CisJCXN1cGVyKG51bGwpOyAgLy8gdGhlIEpQQSBjb21waWxhdGlvbiB1bml0IGlzIHRoZSByb290IG9mIGl0cyBzdWItdHJlZQorCQl0aGlzLmNvbXBpbGF0aW9uVW5pdCA9IGNvbXBpbGF0aW9uVW5pdDsKKwkJdGhpcy5hbm5vdGF0aW9uUHJvdmlkZXIgPSBhbm5vdGF0aW9uUHJvdmlkZXI7CisJCXRoaXMuYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgPSBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKKwkJdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciA9IG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yOworCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PEpwYVJlc291cmNlTW9kZWxMaXN0ZW5lcj4oSnBhUmVzb3VyY2VNb2RlbExpc3RlbmVyLmNsYXNzKTsKKwkJdGhpcy5wZXJzaXN0ZW50VHlwZSA9IHRoaXMuYnVpbGRQZXJzaXN0ZW50VHlwZSgpOworCX0KKworCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBidWlsZFBlcnNpc3RlbnRUeXBlKCkgeworCQl0aGlzLm9wZW5Db21waWxhdGlvblVuaXQoKTsKKwkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdCgpOworCQl0aGlzLmNsb3NlQ29tcGlsYXRpb25Vbml0KCk7CisJCXJldHVybiB0aGlzLmJ1aWxkUGVyc2lzdGVudFR5cGUoYXN0Um9vdCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgb3BlbkNvbXBpbGF0aW9uVW5pdCgpIHsKKwkJdHJ5IHsKKwkJCXRoaXMuY29tcGlsYXRpb25Vbml0Lm9wZW4obnVsbCk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJLy8gZG8gbm90aGluZyAtIHdlIGp1c3Qgd29uJ3QgaGF2ZSBhIHByaW1hcnkgdHlwZSBpbiB0aGlzIGNhc2UKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGNsb3NlQ29tcGlsYXRpb25Vbml0KCkgeworCQl0cnkgeworCQkJdGhpcy5jb21waWxhdGlvblVuaXQuY2xvc2UoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQkvLyBobW1tCisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgYnVpbGRQZXJzaXN0ZW50VHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlUeXBlRGVjbGFyYXRpb24gdGQgPSB0aGlzLmdldFByaW1hcnlUeXBlKGFzdFJvb3QpOworCQlyZXR1cm4gKHRkID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRQZXJzaXN0ZW50VHlwZShhc3RSb290LCB0ZCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZXNQYXJlbnQoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCS8vIG5ldmVyIGNhbGxlZD8KKwl9CisKKworCS8vICoqKioqKioqKiogQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlIG92ZXJyaWRlcyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGdldFJvb3QoKSB7CisJCXJldHVybiB0aGlzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgeworCQlyZXR1cm4gKElGaWxlKSB0aGlzLmNvbXBpbGF0aW9uVW5pdC5nZXRSZXNvdXJjZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGdldEFubm90YXRpb25Qcm92aWRlcigpIHsKKwkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvblByb3ZpZGVyOworCX0KKwkKKworCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJVHlwZURlY2xhcmF0aW9uIHRkID0gdGhpcy5nZXRQcmltYXJ5VHlwZShhc3RSb290KTsKKwkJaWYgKHRkID09IG51bGwpIHsKKwkJCXRoaXMucGVyc2lzdGVudFR5cGUgPSBudWxsOworCQl9IGVsc2UgeworCQkJaWYgKHRoaXMucGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgeworCQkJCXRoaXMucGVyc2lzdGVudFR5cGUgPSB0aGlzLmJ1aWxkUGVyc2lzdGVudFR5cGUoYXN0Um9vdCwgdGQpOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLnBlcnNpc3RlbnRUeXBlLnVwZGF0ZShhc3RSb290KTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlLlJvb3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLyoqCisJICogTkI6IHJldHVybiAqYWxsKiB0aGUgcGVyc2lzdGVudCB0eXBlcyBzaW5jZSB3ZSBidWlsZCB0aGVtIGFsbAorCSAqLworCXB1YmxpYyBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzKCkgeworCQlyZXR1cm4gKHRoaXMucGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgPworCQkJCUVtcHR5SXRlcmF0b3IuPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPmluc3RhbmNlKCkgOgorCQkJCXRoaXMucGVyc2lzdGVudFR5cGUuYWxsVHlwZXMoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXNvdXJjZU1vZGVsQ2hhbmdlZCgpIHsKKwkJZm9yIChKcGFSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKKwkJCWxpc3RlbmVyLnJlc291cmNlTW9kZWxDaGFuZ2VkKCk7CisJCX0KKwl9CisKKworCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKKwkJcmV0dXJuIHRoaXMuY29tcGlsYXRpb25Vbml0OworCX0KKworCXB1YmxpYyB2b2lkIHJlc29sdmVUeXBlcygpIHsKKwkJaWYgKHRoaXMucGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgeworCQkJdGhpcy5wZXJzaXN0ZW50VHlwZS5yZXNvbHZlVHlwZXModGhpcy5idWlsZEFTVFJvb3QoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgQ29tbWFuZEV4ZWN1dG9yIGdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCkgeworCQlyZXR1cm4gdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcjsKKwl9CisJCisJcHVibGljIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkgIHsKKwkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7CisJfQorCQorCXB1YmxpYyBDb21waWxhdGlvblVuaXQgYnVpbGRBU1RSb290KCkgeworCQlyZXR1cm4gSkRUVG9vbHMuYnVpbGRBU1RSb290KHRoaXMuY29tcGlsYXRpb25Vbml0KTsKKwl9CisKKworCS8vICoqKioqKioqKiogSnBhUmVzb3VyY2VNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJCisJcHVibGljIEpwYVJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7CisJCXJldHVybiBKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEU7CisJfQorCisJcHVibGljIHZvaWQgYWRkUmVzb3VyY2VNb2RlbExpc3RlbmVyKEpwYVJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgeworCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZU1vZGVsTGlzdGVuZXIoSnBhUmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhIGNoYW5nZXMgKioqKioqKioqKgorCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl0aGlzLnVwZGF0ZSh0aGlzLmJ1aWxkQVNUUm9vdCgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgorCisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGJ1aWxkUGVyc2lzdGVudFR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QsIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKKwkJcmV0dXJuIFNvdXJjZVBlcnNpc3RlbnRUeXBlLm5ld0luc3RhbmNlKHRoaXMsIHR5cGVEZWNsYXJhdGlvbiwgYXN0Um9vdCk7CisJfQorCisJLyoqCisJICogaS5lLiB0aGUgdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQ7CisJICogcmV0dXJuIHRoZSBmaXJzdCBjbGFzcyBvciBpbnRlcmZhY2UgKGlnbm9yZSBhbm5vdGF0aW9ucyBhbmQgZW51bXMpIHdpdGgKKwkgKiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjb21waWxhdGlvbiB1bml0IChmaWxlKTsKKwkgKiBOQjogdGhpcyB0eXBlIGNvdWxkIGJlIGluIGVycm9yIGlmIHRoZXJlIGlzIGFuIGFubm90YXRpb24gb3IgZW51bQorCSAqIHdpdGggdGhlIHNhbWUgbmFtZSBwcmVjZWRpbmcgaXQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQKKwkgKiAKKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgcGFyc2VyIGRpZCBub3QgcmVzb2x2ZSB0aGUgdHlwZSBkZWNsYXJhdGlvbidzIGJpbmRpbmcuCisJICogVGhpcyBjYW4gb2NjdXIgaWYgdGhlIHByb2plY3QgSlJFIGlzIHJlbW92ZWQgKGJ1ZyAyMjUzMzIpLgorCSAqLworCXByb3RlY3RlZCBUeXBlRGVjbGFyYXRpb24gZ2V0UHJpbWFyeVR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJU3RyaW5nIHByaW1hcnlUeXBlTmFtZSA9IHRoaXMuZ2V0UHJpbWFyeVR5cGVOYW1lKCk7CisJCWZvciAoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYXRkIDogdHlwZXMoYXN0Um9vdCkpIHsKKwkJCWlmICgoYXRkLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OKQorCQkJCQkmJiBhdGQuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhwcmltYXJ5VHlwZU5hbWUpKSB7CisJCQkJcmV0dXJuIChhdGQucmVzb2x2ZUJpbmRpbmcoKSA9PSBudWxsKSA/IG51bGwgOiAoVHlwZURlY2xhcmF0aW9uKSBhdGQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gdHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIGFzdFJvb3QudHlwZXMoKTsKKwl9CisKKwkvKioKKwkgKiBpLmUuIHRoZSBuYW1lIG9mIHRoZSBjb21waWxhdGlvbiB1bml0CisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRQcmltYXJ5VHlwZU5hbWUoKSB7CisJCXJldHVybiByZW1vdmVKYXZhRXh0ZW5zaW9uKHRoaXMuY29tcGlsYXRpb25Vbml0LmdldEVsZW1lbnROYW1lKCkpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlbW92ZUphdmFFeHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7CisJCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuamF2YSIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiAoaW5kZXggPT0gLTEpID8gZmlsZU5hbWUgOiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMuZ2V0UHJpbWFyeVR5cGVOYW1lKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjM5ZDNmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuRGlzY3JpbWluYXRvckNvbHVtbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZU5hbWVkQ29sdW1uQW5ub3RhdGlvbgorCWltcGxlbWVudHMgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24KK3sKKwlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gRElTQ1JJTUlOQVRPUl9UWVBFX0FEQVBURVIgPSBidWlsZERpc2NyaW1pbmF0b3JUeXBlQWRhcHRlcigpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGlzY3JpbWluYXRvclR5cGVBZGFwdGVyOworCXByaXZhdGUgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGU7CisKKwlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGxlbmd0aERlY2xhcmF0aW9uQWRhcHRlcjsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBsZW5ndGhBZGFwdGVyOworCXByaXZhdGUgSW50ZWdlciBsZW5ndGg7CisKKworCXB1YmxpYyBTb3VyY2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEpOworCQl0aGlzLmRpc2NyaW1pbmF0b3JUeXBlQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihtZW1iZXIsIERJU0NSSU1JTkFUT1JfVFlQRV9BREFQVEVSKTsKKwkJdGhpcy5sZW5ndGhEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkSW50ZWdlckVsZW1lbnRBZGFwdGVyKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTl9fTEVOR1RIKTsKKwkJdGhpcy5sZW5ndGhBZGFwdGVyID0gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEludGVnZXJFbGVtZW50QWRhcHRlcih0aGlzLmxlbmd0aERlY2xhcmF0aW9uQWRhcHRlcik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7CisJCXRoaXMuZGlzY3JpbWluYXRvclR5cGUgPSB0aGlzLmJ1aWxkRGlzY3JpbWluYXRvclR5cGUoYXN0Um9vdCk7CisJCXRoaXMubGVuZ3RoID0gdGhpcy5idWlsZExlbmd0aChhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOworCQl0aGlzLnNldExlbmd0aCh0aGlzLmJ1aWxkTGVuZ3RoKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXREaXNjcmltaW5hdG9yVHlwZSh0aGlzLmJ1aWxkRGlzY3JpbWluYXRvclR5cGUoYXN0Um9vdCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhU291cmNlTmFtZWRDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU5fX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb25FbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047CisJfQorCisKKwkvLyAqKioqKioqKioqIERpc2NyaW1pbmF0b3JDb2x1bW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogZGlzY3JpbWluYXRvciB0eXBlCisJcHVibGljIERpc2NyaW1pbmF0b3JUeXBlIGdldERpc2NyaW1pbmF0b3JUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5kaXNjcmltaW5hdG9yVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5kaXNjcmltaW5hdG9yVHlwZSwgZGlzY3JpbWluYXRvclR5cGUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJRGlzY3JpbWluYXRvclR5cGUgb2xkID0gdGhpcy5kaXNjcmltaW5hdG9yVHlwZTsKKwkJdGhpcy5kaXNjcmltaW5hdG9yVHlwZSA9IGRpc2NyaW1pbmF0b3JUeXBlOworCQl0aGlzLmRpc2NyaW1pbmF0b3JUeXBlQWRhcHRlci5zZXRWYWx1ZShEaXNjcmltaW5hdG9yVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUoZGlzY3JpbWluYXRvclR5cGUpKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkLCBkaXNjcmltaW5hdG9yVHlwZSk7CisJfQorCisJcHJpdmF0ZSBEaXNjcmltaW5hdG9yVHlwZSBidWlsZERpc2NyaW1pbmF0b3JUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBEaXNjcmltaW5hdG9yVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmRpc2NyaW1pbmF0b3JUeXBlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7CisJfQorCisJLy8gKioqKiogbGVuZ3RoCisJcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgeworCQlyZXR1cm4gdGhpcy5sZW5ndGg7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGVuZ3RoKEludGVnZXIgbGVuZ3RoKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmxlbmd0aCwgbGVuZ3RoKSkgeworCQkJcmV0dXJuOworCQl9CisJCUludGVnZXIgb2xkID0gdGhpcy5sZW5ndGg7CisJCXRoaXMubGVuZ3RoID0gbGVuZ3RoOworCQl0aGlzLmxlbmd0aEFkYXB0ZXIuc2V0VmFsdWUobGVuZ3RoKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExFTkdUSF9QUk9QRVJUWSwgb2xkLCBsZW5ndGgpOworCX0KKworCXByaXZhdGUgSW50ZWdlciBidWlsZExlbmd0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5sZW5ndGhBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCisJLy8gKioqKioqKioqKiBOZXN0YWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJEaXNjcmltaW5hdG9yQ29sdW1uIGlzIG5vdCBhIG5lc3RhYmxlIGFubm90YXRpb24iKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRGlzY3JpbWluYXRvclR5cGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZGFjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuRGlzY3JpbWluYXRvclZhbHVlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPFR5cGU+CisJaW1wbGVtZW50cyBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCisJcHVibGljIFNvdXJjZURpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIFR5cGUgdHlwZSkgeworCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHR5cGUsIFZBTFVFX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnNldFZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogdmFsdWUKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5ESVNDUklNSU5BVE9SX1ZBTFVFX19WQUxVRSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW1iZWRkYWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFbWJlZGRhYmxlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4N2UxMzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW1iZWRkYWJsZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkYWJsZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRW1iZWRkYWJsZUFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248VHlwZT4KKwlpbXBsZW1lbnRzIEVtYmVkZGFibGVBbm5vdGF0aW9uCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKworCXB1YmxpYyBTb3VyY2VFbWJlZGRhYmxlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSkgeworCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCS8vIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQorCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkvLyBub3RoaW5nIHRvIHVwZGF0ZQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVtYmVkZGVkQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVtYmVkZGVkQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMzA4NmEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW1iZWRkZWRBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkZWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVtYmVkZGVkQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+CisJaW1wbGVtZW50cyBFbWJlZGRlZEFubm90YXRpb24KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKworCXB1YmxpYyBTb3VyY2VFbWJlZGRlZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCS8vIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQorCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkvLyBub3RoaW5nIHRvIHVwZGF0ZQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVtYmVkZGVkSWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW1iZWRkZWRJZEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzUzODJiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVtYmVkZGVkSWRBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5FbWJlZGRlZElkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFbWJlZGRlZElkQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+CisJaW1wbGVtZW50cyBFbWJlZGRlZElkQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCisJcHVibGljIFNvdXJjZUVtYmVkZGVkSWRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJLy8gbm90aGluZyB0byB1cGRhdGUKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFbnRpdHlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW50aXR5QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NjYyNDQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW50aXR5QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRW50aXR5QW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxUeXBlPgorCWltcGxlbWVudHMgRW50aXR5QW5ub3RhdGlvbgoreworCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBOQU1FX0FEQVBURVIgPSBidWlsZE5hbWVBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCisKKwlwdWJsaWMgU291cmNlRW50aXR5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSkgeworCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJCXRoaXMubmFtZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5tZW1iZXIsIE5BTUVfQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnNldE5hbWUodGhpcy5idWlsZE5hbWUoYXN0Um9vdCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEVudGl0eUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm5hbWUsIG5hbWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZShuYW1lKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKE5BTUVfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisKKwkvLyoqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioqKioqKioKKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcigpIHsKKwkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkVOVElUWV9fTkFNRSwgZmFsc2UpOyAvLyBmYWxzZSA9IGRvIG5vdCByZW1vdmUgYW5ub3RhdGlvbiB3aGVuIGVtcHR5CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW51bWVyYXRlZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFbnVtZXJhdGVkQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTNmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW51bWVyYXRlZEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuRW51bWVyYXRlZAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRW51bWVyYXRlZEFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPgorCWltcGxlbWVudHMgRW51bWVyYXRlZEFubm90YXRpb24KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOworCXByaXZhdGUgRW51bVR5cGUgdmFsdWU7CisJCisKKwlwdWJsaWMgU291cmNlRW51bWVyYXRlZEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGF0dHJpYnV0ZSwgVkFMVUVfQURBUFRFUik7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnNldFZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOworCX0KKworCisJLy8gKioqKioqKioqKiBFbnVtZXJhdGVkQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiB2YWx1ZQorCXB1YmxpYyBFbnVtVHlwZSBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFZhbHVlKEVudW1UeXBlIHZhbHVlKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlFbnVtVHlwZSBvbGQgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKEVudW1UeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZSh2YWx1ZSkpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOworCX0KKwkKKwlwcml2YXRlIEVudW1UeXBlIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIEVudW1UeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCQorCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5FTlVNRVJBVEVEX19WQUxVRSwgZmFsc2UpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjE4NDUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248TWVtYmVyPgorCWltcGxlbWVudHMgR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBTVFJBVEVHWV9BREFQVEVSID0gYnVpbGRTdHJhdGVneUFkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHN0cmF0ZWd5QWRhcHRlcjsKKwlwcml2YXRlIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBHRU5FUkFUT1JfQURBUFRFUiA9IGJ1aWxkR2VuZXJhdG9yQWRhcHRlcigpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZ2VuZXJhdG9yQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyBnZW5lcmF0b3I7CisJCisJCQorCXB1YmxpYyBTb3VyY2VHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJc3VwZXIocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJCXRoaXMuc3RyYXRlZ3lBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KG1lbWJlciwgU1RSQVRFR1lfQURBUFRFUik7CisJCXRoaXMuZ2VuZXJhdG9yQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihtZW1iZXIsIEdFTkVSQVRPUl9BREFQVEVSKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc3RyYXRlZ3kgPSB0aGlzLmJ1aWxkU3RyYXRlZ3koYXN0Um9vdCk7CisJCXRoaXMuZ2VuZXJhdG9yID0gdGhpcy5idWlsZEdlbmVyYXRvcihhc3RSb290KTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0U3RyYXRlZ3kodGhpcy5idWlsZFN0cmF0ZWd5KGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRHZW5lcmF0b3IodGhpcy5idWlsZEdlbmVyYXRvcihhc3RSb290KSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5zdHJhdGVneSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBzdHJhdGVneQorCXB1YmxpYyBHZW5lcmF0aW9uVHlwZSBnZXRTdHJhdGVneSgpIHsKKwkJcmV0dXJuIHRoaXMuc3RyYXRlZ3k7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnN0cmF0ZWd5LCBzdHJhdGVneSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlHZW5lcmF0aW9uVHlwZSBvbGQgPSB0aGlzLnN0cmF0ZWd5OworCQl0aGlzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisJCXRoaXMuc3RyYXRlZ3lBZGFwdGVyLnNldFZhbHVlKEdlbmVyYXRpb25UeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZShzdHJhdGVneSkpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1RSQVRFR1lfUFJPUEVSVFksIG9sZCwgc3RyYXRlZ3kpOworCX0KKwkKKwlwcml2YXRlIEdlbmVyYXRpb25UeXBlIGJ1aWxkU3RyYXRlZ3koQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIEdlbmVyYXRpb25UeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuc3RyYXRlZ3lBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRTdHJhdGVneVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFNUUkFURUdZX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKwkKKwkvLyAqKioqKiBnZW5lcmF0b3IKKwlwdWJsaWMgU3RyaW5nIGdldEdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0b3IoU3RyaW5nIGdlbmVyYXRvcikgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5nZW5lcmF0b3IsIGdlbmVyYXRvcikpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkID0gdGhpcy5nZW5lcmF0b3I7CisJCXRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOworCQl0aGlzLmdlbmVyYXRvckFkYXB0ZXIuc2V0VmFsdWUoZ2VuZXJhdG9yKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEdFTkVSQVRPUl9QUk9QRVJUWSwgb2xkLCBnZW5lcmF0b3IpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkR2VuZXJhdG9yKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdlbmVyYXRvckFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoR0VORVJBVE9SX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBib29sZWFuIGdlbmVyYXRvclRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXMoR0VORVJBVE9SX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRTdHJhdGVneUFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkdFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1ksIGZhbHNlKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkR2VuZXJhdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkdFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SLCBmYWxzZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUdlbmVyYXRvckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDZkNjhhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUdlbmVyYXRvckFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRvckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5TZXF1ZW5jZUdlbmVyYXRvcgorICogamF2YXgucGVyc2lzdGVuY2UuVGFibGVHZW5lcmF0b3IKKyAqLworYWJzdHJhY3QgY2xhc3MgU291cmNlR2VuZXJhdG9yQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxNZW1iZXI+CisJaW1wbGVtZW50cyBHZW5lcmF0b3JBbm5vdGF0aW9uCit7CisJZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lRGVjbGFyYXRpb25BZGFwdGVyOworCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOworCVN0cmluZyBuYW1lOworCisJZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gaW5pdGlhbFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyOworCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBpbml0aWFsVmFsdWVBZGFwdGVyOworCUludGVnZXIgaW5pdGlhbFZhbHVlOworCisJZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYWxsb2NhdGlvblNpemVEZWNsYXJhdGlvbkFkYXB0ZXI7CisJZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGFsbG9jYXRpb25TaXplQWRhcHRlcjsKKwlJbnRlZ2VyIGFsbG9jYXRpb25TaXplOworCisKKwlTb3VyY2VHZW5lcmF0b3JBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgeworCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhKTsKKwkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5nZXROYW1lQWRhcHRlcigpOworCQl0aGlzLm5hbWVBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKKwkJdGhpcy5pbml0aWFsVmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmdldEluaXRpYWxWYWx1ZUFkYXB0ZXIoKTsKKwkJdGhpcy5pbml0aWFsVmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZEludGVnZXJBZGFwdGVyKHRoaXMuaW5pdGlhbFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKKwkJdGhpcy5hbGxvY2F0aW9uU2l6ZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuZ2V0QWxsb2NhdGlvblNpemVBZGFwdGVyKCk7CisJCXRoaXMuYWxsb2NhdGlvblNpemVBZGFwdGVyID0gdGhpcy5idWlsZEludGVnZXJBZGFwdGVyKHRoaXMuYWxsb2NhdGlvblNpemVEZWNsYXJhdGlvbkFkYXB0ZXIpOworCX0KKworCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7CisJCXJldHVybiBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5tZW1iZXIsIGRhZWEpOworCX0KKworCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRJbnRlZ2VyQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBkYWVhKSB7CisJCXJldHVybiBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHRoaXMubWVtYmVyLCBkYWVhKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpOworCQl0aGlzLmluaXRpYWxWYWx1ZSA9IHRoaXMuYnVpbGRJbml0aWFsVmFsdWUoYXN0Um9vdCk7CisJCXRoaXMuYWxsb2NhdGlvblNpemUgPSB0aGlzLmJ1aWxkQWxsb2NhdGlvblNpemUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0TmFtZSh0aGlzLmJ1aWxkTmFtZShhc3RSb290KSk7CisJCXRoaXMuc2V0SW5pdGlhbFZhbHVlKHRoaXMuYnVpbGRJbml0aWFsVmFsdWUoYXN0Um9vdCkpOworCQl0aGlzLnNldEFsbG9jYXRpb25TaXplKHRoaXMuYnVpbGRBbGxvY2F0aW9uU2l6ZShhc3RSb290KSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKKwl9CisKKworCS8vICoqKioqKioqKiogR2VuZXJhdG9yQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBuYW1lCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMubmFtZSwgbmFtZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5hbWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKwlhYnN0cmFjdCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdldE5hbWVBZGFwdGVyKCk7CisKKwkvLyAqKioqKiBpbml0aWFsIHZhbHVlCisJcHVibGljIEludGVnZXIgZ2V0SW5pdGlhbFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5pbml0aWFsVmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW5pdGlhbFZhbHVlKEludGVnZXIgaW5pdGlhbFZhbHVlKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmluaXRpYWxWYWx1ZSwgaW5pdGlhbFZhbHVlKSkgeworCQkJcmV0dXJuOworCQl9CisJCUludGVnZXIgb2xkID0gdGhpcy5pbml0aWFsVmFsdWU7CisJCXRoaXMuaW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlOworCQl0aGlzLmluaXRpYWxWYWx1ZUFkYXB0ZXIuc2V0VmFsdWUoaW5pdGlhbFZhbHVlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElOSVRJQUxfVkFMVUVfUFJPUEVSVFksIG9sZCwgaW5pdGlhbFZhbHVlKTsKKwl9CisKKwlwcml2YXRlIEludGVnZXIgYnVpbGRJbml0aWFsVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuaW5pdGlhbFZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEluaXRpYWxWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuaW5pdGlhbFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKwlhYnN0cmFjdCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBnZXRJbml0aWFsVmFsdWVBZGFwdGVyKCk7CisKKwkvLyAqKioqKiBhbGxvY2F0aW9uIHNpemUKKwlwdWJsaWMgSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuYWxsb2NhdGlvblNpemU7CisJfQorCisJcHVibGljIHZvaWQgc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlciBhbGxvY2F0aW9uU2l6ZSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5hbGxvY2F0aW9uU2l6ZSwgYWxsb2NhdGlvblNpemUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJSW50ZWdlciBvbGQgPSB0aGlzLmFsbG9jYXRpb25TaXplOworCQl0aGlzLmFsbG9jYXRpb25TaXplID0gYWxsb2NhdGlvblNpemU7CisJCXRoaXMuYWxsb2NhdGlvblNpemVBZGFwdGVyLnNldFZhbHVlKGFsbG9jYXRpb25TaXplKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEFMTE9DQVRJT05fU0laRV9QUk9QRVJUWSwgb2xkLCBhbGxvY2F0aW9uU2l6ZSk7CisJfQorCisJcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkQWxsb2NhdGlvblNpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuYWxsb2NhdGlvblNpemVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QWxsb2NhdGlvblNpemVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmFsbG9jYXRpb25TaXplRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKwlhYnN0cmFjdCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBnZXRBbGxvY2F0aW9uU2l6ZUFkYXB0ZXIoKTsKKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7CisJCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUpOworCX0KKworCXN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZEludGVnZXJBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUlkQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUlkQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNDc4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlSWRBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuSWQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUlkQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+CisJaW1wbGVtZW50cyBJZEFubm90YXRpb24KK3sKKwlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCisJcHVibGljIFNvdXJjZUlkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJLy8gbm90aGluZyB0byBpbml0aWFsaXplCisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCS8vIG5vdGhpbmcgdG8gdXBkYXRlCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlSWRDbGFzc0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VJZENsYXNzQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NzEyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlSWRDbGFzc0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSWRDbGFzc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuSWRDbGFzcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlSWRDbGFzc0Fubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248VHlwZT4KKwlpbXBsZW1lbnRzIElkQ2xhc3NBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lOworCisKKwlwdWJsaWMgU291cmNlSWRDbGFzc0Fubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIFR5cGUgdHlwZSkgeworCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHR5cGUsIFZBTFVFX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOworCQl0aGlzLmZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lID0gdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnNldFZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7CisJCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUodGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKGFzdFJvb3QpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKKwl9CisKKworCS8vICoqKioqKioqKiogSWRDbGFzc0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogdmFsdWUKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisJLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUKKwlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZENsYXNzTmFtZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lOworCQl0aGlzLmZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lID0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkLCBmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZENsYXNzTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyBudWxsIDogSkRUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLnZhbHVlQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJvdGVjdGVkIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLklEX0NMQVNTX19WQUxVRSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlSW5oZXJpdGFuY2VBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlSW5oZXJpdGFuY2VBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5NTdjZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VJbmhlcml0YW5jZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkluaGVyaXRhbmNlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VJbmhlcml0YW5jZUFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248VHlwZT4KKwlpbXBsZW1lbnRzIEluaGVyaXRhbmNlQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gU1RSQVRFR1lfQURBUFRFUiA9IGJ1aWxkU3RyYXRlZ3lBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBzdHJhdGVneUFkYXB0ZXI7CisJcHJpdmF0ZSBJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3k7CisKKworCXB1YmxpYyBTb3VyY2VJbmhlcml0YW5jZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKKwkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCQl0aGlzLnN0cmF0ZWd5QWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0eXBlLCBTVFJBVEVHWV9BREFQVEVSKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy5zdHJhdGVneSA9IHRoaXMuYnVpbGRTdHJhdGVneShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy5zZXRTdHJhdGVneSh0aGlzLmJ1aWxkU3RyYXRlZ3koYXN0Um9vdCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMuc3RyYXRlZ3kpOworCX0KKworCisJLy8gKioqKioqKioqKiBJbmhlcml0YW5jZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogc3RyYXRlZ3kKKwlwdWJsaWMgSW5oZXJpdGFuY2VUeXBlIGdldFN0cmF0ZWd5KCkgeworCQlyZXR1cm4gdGhpcy5zdHJhdGVneTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3kpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuc3RyYXRlZ3ksIHN0cmF0ZWd5KSkgeworCQkJcmV0dXJuOworCQl9CisJCUluaGVyaXRhbmNlVHlwZSBvbGQgPSB0aGlzLnN0cmF0ZWd5OworCQl0aGlzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisJCXRoaXMuc3RyYXRlZ3lBZGFwdGVyLnNldFZhbHVlKEluaGVyaXRhbmNlVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUoc3RyYXRlZ3kpKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNUUkFURUdZX1BST1BFUlRZLCBvbGQsIHN0cmF0ZWd5KTsKKwl9CisKKwlwcml2YXRlIEluaGVyaXRhbmNlVHlwZSBidWlsZFN0cmF0ZWd5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBJbmhlcml0YW5jZVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5zdHJhdGVneUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U3RyYXRlZ3lUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShTVFJBVEVHWV9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFN0cmF0ZWd5QWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuSU5IRVJJVEFOQ0VfX1NUUkFURUdZKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5ZjI0YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQmFzZUNvbHVtbkFubm90YXRpb24KKwlpbXBsZW1lbnRzIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiByZWZlcmVuY2VkQ29sdW1uTmFtZUFkYXB0ZXI7CisJcHJpdmF0ZSBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWU7CisKKworCXB1YmxpYyBTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKKwkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcihKUEEuSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOworCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRFbGVtZW50QWRhcHRlcih0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKKwl9CisKKwlwdWJsaWMgU291cmNlSm9pbkNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7CisJCXRoaXMocGFyZW50LCBtZW1iZXIsIGRhYSwgbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgZGFhKSk7CisJfQorCisJcHVibGljIFNvdXJjZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7CisJCXRoaXMocGFyZW50LCBtZW1iZXIsIGlkYWEsIG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBpZGFhKSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7CisJCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLmJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWUoYXN0Um9vdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnVwZGF0ZShhc3RSb290KTsKKwkJdGhpcy5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSh0aGlzLmJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWUoYXN0Um9vdCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBKYXZhU291cmNlTmFtZWRDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuSk9JTl9DT0xVTU5fX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb25FbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047CisJfQorCisKKwkvLyAqKioqKioqKioqIEphdmFTb3VyY2VOYW1lZENvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldFRhYmxlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuSk9JTl9DT0xVTU5fX1RBQkxFOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRVbmlxdWVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fVU5JUVVFOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXROdWxsYWJsZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OX19OVUxMQUJMRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0SW5zZXJ0YWJsZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OX19JTlNFUlRBQkxFOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRVcGRhdGFibGVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fVVBEQVRBQkxFOworCX0KKworCisJLy8qKioqKioqKioqKiogSm9pbkNvbHVtbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioKKworCS8vIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUKKwlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUsIHJlZmVyZW5jZWRDb2x1bW5OYW1lKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lOworCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lID0gcmVmZXJlbmNlZENvbHVtbk5hbWU7CisJCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVBZGFwdGVyLnNldFZhbHVlKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgcmVmZXJlbmNlZENvbHVtbk5hbWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXModGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKKwl9CisKKworCSAvLyAqKioqKioqKioqIE5lc3RhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShOZXN0YWJsZUFubm90YXRpb24gb2xkQW5ub3RhdGlvbikgeworCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRBbm5vdGF0aW9uKTsKKwkJSm9pbkNvbHVtbkFubm90YXRpb24gb2xkSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKKwkJdGhpcy5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShvbGRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCkgeworCQl0aGlzLmdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpLm1vdmVBbm5vdGF0aW9uKG5ld0luZGV4KTsKKwl9CisKKwlwcm90ZWN0ZWQgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpIHsKKwkJcmV0dXJuIChJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIpIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXI7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgU291cmNlSm9pbkNvbHVtbkFubm90YXRpb24gY3JlYXRlSm9pbkNvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCX0KKworCXN0YXRpYyBTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbiBjcmVhdGVOZXN0ZWRKb2luQ29sdW1uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgam9pbkNvbHVtbnNBZGFwdGVyKSB7CisJCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgsIGpvaW5Db2x1bW5zQWRhcHRlcik7CisJCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBpZGFhKTsKKwkJcmV0dXJuIG5ldyBTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlciwgaWRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOworCX0KKworCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgam9pbkNvbHVtbnNBZGFwdGVyKSB7CisJCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoam9pbkNvbHVtbnNBZGFwdGVyLCBpbmRleCwgSlBBLkpPSU5fQ09MVU1OKTsKKwl9CisKKwlzdGF0aWMgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtbihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFzc29jaWF0aW9uT3ZlcnJpZGVBZGFwdGVyLCBKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgaW50IGluZGV4KSB7CisJCXJldHVybiBuZXcgU291cmNlSm9pbkNvbHVtbkFubm90YXRpb24ocGFyZW50LCBtZW1iZXIsIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BZGFwdGVyKGFzc29jaWF0aW9uT3ZlcnJpZGVBZGFwdGVyLCBpbmRleCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYXNzb2NpYXRpb25PdmVycmlkZUFkYXB0ZXIsIGludCBpbmRleCkgeworCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGFzc29jaWF0aW9uT3ZlcnJpZGVBZGFwdGVyLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fQ09MVU1OUywgaW5kZXgsIEpQQS5KT0lOX0NPTFVNTik7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlSm9pbkNvbHVtbnNBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlSm9pbkNvbHVtbnNBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmNjMzZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VKb2luQ29sdW1uc0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5zQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1ucworICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlSm9pbkNvbHVtbnNBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPE1lbWJlcj4KKwlpbXBsZW1lbnRzIEpvaW5Db2x1bW5zQW5ub3RhdGlvbgoreworCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8TmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMgPSBuZXcgVmVjdG9yPE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24+KCk7CisKKworCXB1YmxpYyBTb3VyY2VKb2luQ29sdW1uc0Fubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJc3VwZXIocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy5pbml0aWFsaXplKHRoaXMsIGFzdFJvb3QpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMudXBkYXRlKHRoaXMsIGFzdFJvb3QpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMuam9pbkNvbHVtbnMpOworCX0KKworCisJLy8gKioqKioqKioqKiBBbm5vdGF0aW9uQ29udGFpbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiB0aGlzLmdldEFubm90YXRpb25OYW1lKCk7CisJfQorCisJcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldENvbnRhaW5lckpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OU19fVkFMVUU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbj4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5qb2luQ29sdW1ucyk7CisJfQorCisJcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGROZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoKSB7CisJCU5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRoaXMuYnVpbGRKb2luQ29sdW1uKHRoaXMuam9pbkNvbHVtbnMuc2l6ZSgpKTsKKwkJdGhpcy5qb2luQ29sdW1ucy5hZGQoam9pbkNvbHVtbik7CisJCXJldHVybiBqb2luQ29sdW1uOworCX0KKworCXByaXZhdGUgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBidWlsZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCXJldHVybiBTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbi5jcmVhdGVOZXN0ZWRKb2luQ29sdW1uKHRoaXMsIHRoaXMubWVtYmVyLCBpbmRleCwgdGhpcy5kYWEpOworCX0KKworCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25BZGRlZChpbnQgaW5kZXgsIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbikgeworCQl0aGlzLmZpcmVJdGVtQWRkZWQoSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBtb3ZlTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmpvaW5Db2x1bW5zLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpLmdldCh0YXJnZXRJbmRleCk7CisJfQorCisJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvbk1vdmVkKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXRoaXMuZmlyZUl0ZW1Nb3ZlZChKT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiByZW1vdmVOZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7CisJfQorCisJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvblJlbW92ZWQoaW50IGluZGV4LCBOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb24pIHsKKwkJdGhpcy5maXJlSXRlbVJlbW92ZWQoSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlSm9pblRhYmxlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ODIyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlSm9pblRhYmxlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25Db250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlSm9pblRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5UYWJsZQorICovCitwdWJsaWMgY2xhc3MgU291cmNlSm9pblRhYmxlQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQmFzZVRhYmxlQW5ub3RhdGlvbgorCWltcGxlbWVudHMgTmVzdGFibGVKb2luVGFibGVBbm5vdGF0aW9uCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKworCisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8TmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMgPSBuZXcgVmVjdG9yPE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24+KCk7CisJcHJpdmF0ZSBmaW5hbCBKb2luQ29sdW1uc0Fubm90YXRpb25Db250YWluZXIgam9pbkNvbHVtbnNDb250YWluZXIgPSBuZXcgSm9pbkNvbHVtbnNBbm5vdGF0aW9uQ29udGFpbmVyKCk7CisKKwlwcml2YXRlIGZpbmFsIFZlY3RvcjxOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSBuZXcgVmVjdG9yPE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24+KCk7CisJcHJpdmF0ZSBmaW5hbCBJbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uIGludmVyc2VKb2luQ29sdW1uc0NvbnRhaW5lciA9IG5ldyBJbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uKCk7CisKKworCXB1YmxpYyBTb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXRoaXMocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJfQorCisJcHVibGljIFNvdXJjZUpvaW5UYWJsZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMuaW5pdGlhbGl6ZSh0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyLCBhc3RSb290KTsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLmluaXRpYWxpemUodGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXIsIGFzdFJvb3QpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci51cGRhdGUoYXN0Um9vdCk7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy51cGRhdGUodGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lciwgYXN0Um9vdCk7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy51cGRhdGUodGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXIsIGFzdFJvb3QpOworCX0KKworCisJLy8gKioqKioqKioqKiBBYnN0cmFjdEJhc2VUYWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXROYW1lQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpIHsKKwkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIsIEpQQS5KT0lOX1RBQkxFX19OQU1FKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdldFNjaGVtYUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKSB7CisJCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLCBKUEEuSk9JTl9UQUJMRV9fU0NIRU1BKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdldENhdGFsb2dBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcikgeworCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciwgSlBBLkpPSU5fVEFCTEVfX0NBVEFMT0cpOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRVbmlxdWVDb25zdHJhaW50c0VsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLkpPSU5fVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKKwl9CisKKwkvLyAqKioqKioqKioqIEpvaW5UYWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogam9pbiBjb2x1bW5zCisJcHVibGljIExpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+KHRoaXMuam9pbkNvbHVtbnMpOworCX0KKworCUxpc3RJdGVyYXRvcjxOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBuZXN0YWJsZUpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24+KHRoaXMuam9pbkNvbHVtbnMpOworCX0KKworCXB1YmxpYyBpbnQgam9pbkNvbHVtbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5zaXplKCk7CisJfQorCisJcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbkF0KGludCBpbmRleCkgeworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5nZXQoaW5kZXgpOworCX0KKworCXB1YmxpYyBpbnQgaW5kZXhPZkpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgeworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5pbmRleE9mKGpvaW5Db2x1bW4pOworCX0KKworCXB1YmxpYyBOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCXJldHVybiAoTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbikgQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgsIHRoaXMuam9pbkNvbHVtbnNDb250YWluZXIpOworCX0KKworCU5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSm9pbkNvbHVtbkludGVybmFsKCkgeworCQlOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbih0aGlzLmpvaW5Db2x1bW5zLnNpemUoKSk7CisJCXRoaXMuam9pbkNvbHVtbnMuYWRkKGpvaW5Db2x1bW4pOworCQlyZXR1cm4gam9pbkNvbHVtbjsKKwl9CisKKwlwcml2YXRlIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gYnVpbGRKb2luQ29sdW1uKGludCBpbmRleCkgeworCQlyZXR1cm4gbmV3IFNvdXJjZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMsIHRoaXMubWVtYmVyLCBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCkpOworCX0KKworCXByaXZhdGUgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7CisJCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5kYWEsIEpQQS5KT0lOX1RBQkxFX19KT0lOX0NPTFVNTlMsIGluZGV4LCBKUEEuSk9JTl9DT0xVTU4pOworCX0KKworCXZvaWQgam9pbkNvbHVtbkFkZGVkKGludCBpbmRleCwgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uKSB7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChKT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIGpvaW5Db2x1bW4pOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy5tb3ZlTmVzdGVkQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMuam9pbkNvbHVtbnNDb250YWluZXIpOworCX0KKworCU5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gbW92ZUpvaW5Db2x1bW5JbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5qb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KS5nZXQodGFyZ2V0SW5kZXgpOworCX0KKworCXZvaWQgam9pbkNvbHVtbk1vdmVkKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXRoaXMuZmlyZUl0ZW1Nb3ZlZChKT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1uKGludCBpbmRleCkgeworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMucmVtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbmRleCwgdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lcik7CisJfQorCisJTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiByZW1vdmVKb2luQ29sdW1uSW50ZXJuYWwoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7CisJfQorCisJdm9pZCBqb2luQ29sdW1uUmVtb3ZlZChpbnQgaW5kZXgsIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgeworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChKT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIGpvaW5Db2x1bW4pOworCX0KKworCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBpbml0aWFsaXplSm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiB0aGlzLmFkZEpvaW5Db2x1bW5JbnRlcm5hbCgpOworCX0KKworCS8vICoqKioqIGludmVyc2Ugam9pbiBjb2x1bW5zCisJcHVibGljIExpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gaW52ZXJzZUpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPih0aGlzLmludmVyc2VKb2luQ29sdW1ucyk7CisJfQorCisJTGlzdEl0ZXJhdG9yPE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24+IG5lc3RhYmxlSW52ZXJzZUpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24+KHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zKTsKKwl9CisKKwlwdWJsaWMgaW50IGludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiB0aGlzLmludmVyc2VKb2luQ29sdW1ucy5zaXplKCk7CisJfQorCisJcHVibGljIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gaW52ZXJzZUpvaW5Db2x1bW5BdChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLmdldChpbmRleCk7CisJfQorCisJcHVibGljIGludCBpbmRleE9mSW52ZXJzZUpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgeworCQlyZXR1cm4gdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnMuaW5kZXhPZihqb2luQ29sdW1uKTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIChOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMuYWRkTmVzdGVkQW5ub3RhdGlvbihpbmRleCwgdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXIpOworCX0KKworCU5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSW52ZXJzZUpvaW5Db2x1bW5JbnRlcm5hbCgpIHsKKwkJTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGhpcy5idWlsZEludmVyc2VKb2luQ29sdW1uKHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLnNpemUoKSk7CisJCXRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zLmFkZChqb2luQ29sdW1uKTsKKwkJcmV0dXJuIGpvaW5Db2x1bW47CisJfQorCisJcHJpdmF0ZSBOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCXJldHVybiBuZXcgU291cmNlSm9pbkNvbHVtbkFubm90YXRpb24odGhpcywgdGhpcy5tZW1iZXIsIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCkpOworCX0KKworCXByaXZhdGUgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRJbnZlcnNlSm9pbkNvbHVtbkFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCkgeworCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKHRoaXMuZGFhLCBKUEEuSk9JTl9UQUJMRV9fSU5WRVJTRV9KT0lOX0NPTFVNTlMsIGluZGV4LCBKUEEuSk9JTl9DT0xVTU4pOworCX0KKworCXZvaWQgaW52ZXJzZUpvaW5Db2x1bW5BZGRlZChpbnQgaW5kZXgsIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgeworCQl0aGlzLmZpcmVJdGVtQWRkZWQoSU5WRVJTRV9KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIGpvaW5Db2x1bW4pOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVJbnZlcnNlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMubW92ZU5lc3RlZEFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbnRhaW5lcik7CisJfQorCisJTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBtb3ZlSW52ZXJzZUpvaW5Db2x1bW5JbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5pbnZlcnNlSm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCkuZ2V0KHRhcmdldEluZGV4KTsKKwl9CisKKwl2b2lkIGludmVyc2VKb2luQ29sdW1uTW92ZWQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJdGhpcy5maXJlSXRlbU1vdmVkKElOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy5yZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKGluZGV4LCB0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbnRhaW5lcik7CisJfQorCisJTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiByZW1vdmVJbnZlcnNlSm9pbkNvbHVtbkludGVybmFsKGludCBpbmRleCkgeworCQlyZXR1cm4gdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnMucmVtb3ZlKGluZGV4KTsKKwl9CisKKwl2b2lkIGludmVyc2VKb2luQ29sdW1uUmVtb3ZlZChpbnQgaW5kZXgsIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgeworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChJTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgam9pbkNvbHVtbik7CisJfQorCisJcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGluaXRpYWxpemVJbnZlcnNlSm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiB0aGlzLmFkZEludmVyc2VKb2luQ29sdW1uSW50ZXJuYWwoKTsKKwl9CisKKwkvLyAqKioqKioqKioqIE5lc3RhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShOZXN0YWJsZUFubm90YXRpb24gb2xkQW5ub3RhdGlvbikgeworCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRBbm5vdGF0aW9uKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiBvbGRKb2luVGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKKwkJZm9yIChKb2luQ29sdW1uQW5ub3RhdGlvbiBvbGRKb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9sZEpvaW5UYWJsZS5qb2luQ29sdW1ucygpKSkgeworCQkJTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBuZXdKb2luQ29sdW1uID0gdGhpcy5hZGRKb2luQ29sdW1uKG9sZEpvaW5UYWJsZS5pbmRleE9mSm9pbkNvbHVtbihvbGRKb2luQ29sdW1uKSk7CisJCQluZXdKb2luQ29sdW1uLmluaXRpYWxpemVGcm9tKChOZXN0YWJsZUFubm90YXRpb24pIG9sZEpvaW5Db2x1bW4pOworCQl9CisJCWZvciAoSm9pbkNvbHVtbkFubm90YXRpb24gb2xkSW52ZXJzZUpvaW5Db2x1bW4gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob2xkSm9pblRhYmxlLmludmVyc2VKb2luQ29sdW1ucygpKSkgeworCQkJTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBuZXdJbnZlcnNlSm9pbkNvbHVtbiA9IHRoaXMuYWRkSW52ZXJzZUpvaW5Db2x1bW4ob2xkSm9pblRhYmxlLmluZGV4T2ZJbnZlcnNlSm9pbkNvbHVtbihvbGRJbnZlcnNlSm9pbkNvbHVtbikpOworCQkJbmV3SW52ZXJzZUpvaW5Db2x1bW4uaW5pdGlhbGl6ZUZyb20oKE5lc3RhYmxlQW5ub3RhdGlvbikgb2xkSW52ZXJzZUpvaW5Db2x1bW4pOworCQl9CisJfQorCisJcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7CisJCS8vIHRoZSBvbmx5IHBsYWNlIHdoZXJlIGEgam9pbiB0YWJsZSBhbm5vdGF0aW9uIGlzIG5lc3RlZCBpcyBpbiBhbgorCQkvLyBhc3NvY2lhdGlvbiBvdmVycmlkZTsgYW5kIHRoYXQgb25seSBuZXN0cyBhIHNpbmdsZSBqb2luIHRhYmxlLCBub3QgYW4gYXJyYXkKKwkJLy8gb2Ygam9pbiB0YWJsZXM7IHNvICNtb3ZlQW5ub3RhdGlvbihpbnQpIGlzIG5ldmVyIGNhbGxlZAorCQkvLyBUT0RPIG1heWJlIE5lc3RhYmxlQW5ub3RhdGlvbiBzaG91bGQgYmUgc3BsaXQgdXA7CisJCS8vIG1vdmluZyB0aGlzIG1ldGhvZCB0byBzb21ldGhpbmcgbGlrZSBJbmRleGFibGVBbm5vdGF0aW9uCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqKioqKiogYW5ub3RhdGlvbiBjb250YWluZXJzICoqKioqKioqKioKKworCWFic3RyYWN0IGNsYXNzIEFic3RyYWN0Sm9pbkNvbHVtbkFubm90YXRpb25Db250YWluZXIKKwkJaW1wbGVtZW50cyBBbm5vdGF0aW9uQ29udGFpbmVyPE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24+CisJeworCQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgeworCQkJcmV0dXJuIFNvdXJjZUpvaW5UYWJsZUFubm90YXRpb24udGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpOworCQl9CisKKwkJcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldENvbnRhaW5lckpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJCXJldHVybiBTb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uLnRoaXMuZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKKwkJCXJldHVybiBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOworCQl9CisJfQorCisKKwkvKioKKwkgKiBhZGFwdCB0aGUgQW5ub3RhdGlvbkNvbnRhaW5lciBpbnRlcmZhY2UgdG8gdGhlIGpvaW4gdGFibGUncyBqb2luIGNvbHVtbnMKKwkgKi8KKwljbGFzcyBKb2luQ29sdW1uc0Fubm90YXRpb25Db250YWluZXIKKwkJZXh0ZW5kcyBBYnN0cmFjdEpvaW5Db2x1bW5Bbm5vdGF0aW9uQ29udGFpbmVyCisJeworCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgeworCQkJcmV0dXJuIEpQQS5KT0lOX1RBQkxFX19KT0lOX0NPTFVNTlM7CisJCX0KKworCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24+IG5lc3RlZEFubm90YXRpb25zKCkgeworCQkJcmV0dXJuIFNvdXJjZUpvaW5UYWJsZUFubm90YXRpb24udGhpcy5uZXN0YWJsZUpvaW5Db2x1bW5zKCk7CisJCX0KKworCQlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKKwkJCXJldHVybiBTb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uLnRoaXMuam9pbkNvbHVtbnNTaXplKCk7CisJCX0KKworCQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGROZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoKSB7CisJCQlyZXR1cm4gU291cmNlSm9pblRhYmxlQW5ub3RhdGlvbi50aGlzLmFkZEpvaW5Db2x1bW5JbnRlcm5hbCgpOworCQl9CisKKwkJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvbkFkZGVkKGludCBpbmRleCwgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uKSB7CisJCQlTb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uLnRoaXMuam9pbkNvbHVtbkFkZGVkKGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwkJfQorCisJCXB1YmxpYyBOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIG1vdmVOZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJCXJldHVybiBTb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uLnRoaXMubW92ZUpvaW5Db2x1bW5JbnRlcm5hbCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl9CisKKwkJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvbk1vdmVkKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCQlTb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uLnRoaXMuam9pbkNvbHVtbk1vdmVkKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCX0KKworCQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiByZW1vdmVOZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoaW50IGluZGV4KSB7CisJCQlyZXR1cm4gU291cmNlSm9pblRhYmxlQW5ub3RhdGlvbi50aGlzLnJlbW92ZUpvaW5Db2x1bW5JbnRlcm5hbChpbmRleCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uUmVtb3ZlZChpbnQgaW5kZXgsIE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbikgeworCQkJU291cmNlSm9pblRhYmxlQW5ub3RhdGlvbi50aGlzLmpvaW5Db2x1bW5SZW1vdmVkKGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwkJfQorCX0KKworCisJLyoqCisJICogYWRhcHQgdGhlIEFubm90YXRpb25Db250YWluZXIgaW50ZXJmYWNlIHRvIHRoZSBqb2luIHRhYmxlJ3MgaW52ZXJzZSBqb2luIGNvbHVtbnMKKwkgKi8KKwljbGFzcyBJbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXJBbm5vdGF0aW9uCisJCWV4dGVuZHMgQWJzdHJhY3RKb2luQ29sdW1uQW5ub3RhdGlvbkNvbnRhaW5lcgorCXsKKwkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKKwkJCXJldHVybiBKUEEuSk9JTl9UQUJMRV9fSU5WRVJTRV9KT0lOX0NPTFVNTlM7CisJCX0KKworCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb24+IG5lc3RlZEFubm90YXRpb25zKCkgeworCQkJcmV0dXJuIFNvdXJjZUpvaW5UYWJsZUFubm90YXRpb24udGhpcy5uZXN0YWJsZUludmVyc2VKb2luQ29sdW1ucygpOworCQl9CisKKwkJcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7CisJCQlyZXR1cm4gU291cmNlSm9pblRhYmxlQW5ub3RhdGlvbi50aGlzLmludmVyc2VKb2luQ29sdW1uc1NpemUoKTsKKwkJfQorCisJCXB1YmxpYyBOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZE5lc3RlZEFubm90YXRpb25JbnRlcm5hbCgpIHsKKwkJCXJldHVybiBTb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uLnRoaXMuYWRkSW52ZXJzZUpvaW5Db2x1bW5JbnRlcm5hbCgpOworCQl9CisKKwkJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvbkFkZGVkKGludCBpbmRleCwgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uKSB7CisJCQlTb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uLnRoaXMuaW52ZXJzZUpvaW5Db2x1bW5BZGRlZChpbmRleCwgbmVzdGVkQW5ub3RhdGlvbik7CisJCX0KKworCQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiBtb3ZlTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCQlyZXR1cm4gU291cmNlSm9pblRhYmxlQW5ub3RhdGlvbi50aGlzLm1vdmVJbnZlcnNlSm9pbkNvbHVtbkludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uTW92ZWQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJCVNvdXJjZUpvaW5UYWJsZUFubm90YXRpb24udGhpcy5pbnZlcnNlSm9pbkNvbHVtbk1vdmVkKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCX0KKworCQlwdWJsaWMgTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbiByZW1vdmVOZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoaW50IGluZGV4KSB7CisJCQlyZXR1cm4gU291cmNlSm9pblRhYmxlQW5ub3RhdGlvbi50aGlzLnJlbW92ZUludmVyc2VKb2luQ29sdW1uSW50ZXJuYWwoaW5kZXgpOworCQl9CisKKwkJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvblJlbW92ZWQoaW50IGluZGV4LCBOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb24pIHsKKwkJCVNvdXJjZUpvaW5UYWJsZUFubm90YXRpb24udGhpcy5pbnZlcnNlSm9pbkNvbHVtblJlbW92ZWQoaW5kZXgsIG5lc3RlZEFubm90YXRpb24pOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTG9iQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUxvYkFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTIyOGI4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUxvYkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTG9iCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VMb2JBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KKwlpbXBsZW1lbnRzIExvYkFubm90YXRpb24KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKworCXB1YmxpYyBTb3VyY2VMb2JBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJLy8gbm90aGluZyB0byB1cGRhdGUKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYW55VG9NYW55QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU1hbnlUb01hbnlBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkOGVmOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYW55VG9NYW55QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTWFueVRvTWFueQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlTWFueVRvTWFueUFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBNYW55VG9NYW55QW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVEFSR0VUX0VOVElUWV9BREFQVEVSID0gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKCk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IEZFVENIX0FEQVBURVIgPSBidWlsZEZldGNoQWRhcHRlcigpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IENBU0NBREVfQURBUFRFUiA9IGJ1aWxkQ2FzY2FkZUFkYXB0ZXIoKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTUFQUEVEX0JZX0FEQVBURVIgPSBidWlsZE1hcHBlZEJ5QWRhcHRlcigpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbWFwcGVkQnlBZGFwdGVyOworCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OworCisKKwlwdWJsaWMgU291cmNlTWFueVRvTWFueUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJCXRoaXMubWFwcGVkQnlBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihNQVBQRURfQllfQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7CisJCXRoaXMubWFwcGVkQnkgPSB0aGlzLmJ1aWxkTWFwcGVkQnkoYXN0Um9vdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnVwZGF0ZShhc3RSb290KTsKKwkJdGhpcy5zZXRNYXBwZWRCeSh0aGlzLmJ1aWxkTWFwcGVkQnkoYXN0Um9vdCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBTb3VyY2VSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdldFRhcmdldEVudGl0eUFkYXB0ZXIoKSB7CisJCXJldHVybiBUQVJHRVRfRU5USVRZX0FEQVBURVI7CisJfQorCisJQE92ZXJyaWRlCisJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXRGZXRjaEFkYXB0ZXIoKSB7CisJCXJldHVybiBGRVRDSF9BREFQVEVSOworCX0KKworCUBPdmVycmlkZQorCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBnZXRDYXNjYWRlQWRhcHRlcigpIHsKKwkJcmV0dXJuIENBU0NBREVfQURBUFRFUjsKKwl9CisKKworCS8vKioqKioqKioqKioqKioqKiBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioKKworCS8vICoqKioqIG1hcHBlZCBieQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7CisJCXJldHVybiB0aGlzLm1hcHBlZEJ5OworCX0KKworCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5tYXBwZWRCeSwgbWFwcGVkQnkpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMubWFwcGVkQnk7CisJCXRoaXMubWFwcGVkQnkgPSBtYXBwZWRCeTsKKwkJdGhpcy5tYXBwZWRCeUFkYXB0ZXIuc2V0VmFsdWUobWFwcGVkQnkpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX1BST1BFUlRZLCBvbGQsIG1hcHBlZEJ5KTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZE1hcHBlZEJ5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLm1hcHBlZEJ5QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoTUFQUEVEX0JZX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhNQVBQRURfQllfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoKSB7CisJCXJldHVybiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuTUFOWV9UT19NQU5ZX19UQVJHRVRfRU5USVRZKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTWFwcGVkQnlBZGFwdGVyKCkgeworCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuTUFOWV9UT19NQU5ZX19NQVBQRURfQlksIGZhbHNlKTsgLy8gZmFsc2UgPSBkbyBub3QgcmVtb3ZlIGFubm90YXRpb24gd2hlbiBlbXB0eQorCX0KKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRGZXRjaEFkYXB0ZXIoKSB7CisJCXJldHVybiBidWlsZEZldGNoQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5NQU5ZX1RPX01BTllfX0ZFVENIKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRDYXNjYWRlQWRhcHRlcigpIHsKKwkJcmV0dXJuIGJ1aWxkRW51bUFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk1BTllfVE9fTUFOWV9fQ0FTQ0FERSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWFueVRvT25lQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU1hbnlUb09uZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODgzZjNkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU1hbnlUb09uZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VNYW55VG9PbmVBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgorCWltcGxlbWVudHMgTWFueVRvT25lQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVEFSR0VUX0VOVElUWV9BREFQVEVSID0gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKCk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IEZFVENIX0FEQVBURVIgPSBidWlsZEZldGNoQWRhcHRlcigpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IENBU0NBREVfQURBUFRFUiA9IGJ1aWxkQ2FzY2FkZUFkYXB0ZXIoKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IE9QVElPTkFMX0FEQVBURVIgPSBidWlsZE9wdGlvbmFsQWRhcHRlcigpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG9wdGlvbmFsQWRhcHRlcjsKKwlwcml2YXRlIEJvb2xlYW4gb3B0aW9uYWw7CisKKworCXB1YmxpYyBTb3VyY2VNYW55VG9PbmVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCQl0aGlzLm9wdGlvbmFsQWRhcHRlciA9IHRoaXMuYnVpbGRCb29sZWFuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKE9QVElPTkFMX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOworCQl0aGlzLm9wdGlvbmFsID0gdGhpcy5idWlsZE9wdGlvbmFsKGFzdFJvb3QpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci51cGRhdGUoYXN0Um9vdCk7CisJCXRoaXMuc2V0T3B0aW9uYWwodGhpcy5idWlsZE9wdGlvbmFsKGFzdFJvb3QpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogU291cmNlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXRUYXJnZXRFbnRpdHlBZGFwdGVyKCkgeworCQlyZXR1cm4gVEFSR0VUX0VOVElUWV9BREFQVEVSOworCX0KKworCUBPdmVycmlkZQorCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZ2V0RmV0Y2hBZGFwdGVyKCkgeworCQlyZXR1cm4gRkVUQ0hfQURBUFRFUjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZ2V0Q2FzY2FkZUFkYXB0ZXIoKSB7CisJCXJldHVybiBDQVNDQURFX0FEQVBURVI7CisJfQorCisKKwkvLyAqKioqKioqKioqIE1hbnlUb09uZU1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIG9wdGlvbmFsCisJcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7CisJCXJldHVybiB0aGlzLm9wdGlvbmFsOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMub3B0aW9uYWwsIG9wdGlvbmFsKSkgeworCQkJcmV0dXJuOworCQl9CisJCUJvb2xlYW4gb2xkID0gdGhpcy5vcHRpb25hbDsKKwkJdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsOworCQl0aGlzLm9wdGlvbmFsQWRhcHRlci5zZXRWYWx1ZShvcHRpb25hbCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPUFRJT05BTF9QUk9QRVJUWSwgb2xkLCBvcHRpb25hbCk7CisJfQorCisJcHJpdmF0ZSBCb29sZWFuIGJ1aWxkT3B0aW9uYWwoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMub3B0aW9uYWxBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T3B0aW9uYWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShPUFRJT05BTF9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoKSB7CisJCXJldHVybiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuTUFOWV9UT19PTkVfX1RBUkdFVF9FTlRJVFkpOworCX0KKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRGZXRjaEFkYXB0ZXIoKSB7CisJCXJldHVybiBidWlsZEZldGNoQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5NQU5ZX1RPX09ORV9fRkVUQ0gpOworCX0KKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkT3B0aW9uYWxBZGFwdGVyKCkgeworCQlyZXR1cm4gYnVpbGRPcHRpb25hbEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuTUFOWV9UT19PTkVfX09QVElPTkFMKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRDYXNjYWRlQWRhcHRlcigpIHsKKwkJcmV0dXJuIGJ1aWxkRW51bUFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk1BTllfVE9fT05FX19DQVNDQURFKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9wdGlvbmFsQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBmYWxzZSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWFwS2V5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU1hcEtleUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGY0MDlmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU1hcEtleUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTWFwS2V5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VNYXBLZXlBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KKwlpbXBsZW1lbnRzIE1hcEtleUFubm90YXRpb24KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IE5BTUVfQURBUFRFUiA9IGJ1aWxkTmFtZUFkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKworCXB1YmxpYyBTb3VyY2VNYXBLZXlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCQl0aGlzLm5hbWVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGF0dHJpYnV0ZSwgTkFNRV9BREFQVEVSKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0TmFtZSh0aGlzLmJ1aWxkTmFtZShhc3RSb290KSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKKwl9CisKKworCS8vICoqKioqKioqKiogTWFwS2V5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBuYW1lCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMubmFtZSwgbmFtZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5hbWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoTkFNRV9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhOQU1FX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcigpIHsKKwkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk1BUF9LRVlfX05BTUUsIGZhbHNlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwM2UzYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBwZWRTdXBlcmNsYXNzCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxUeXBlPgorCWltcGxlbWVudHMgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKworCXB1YmxpYyBTb3VyY2VNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSkgeworCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCS8vIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQorCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkvLyBub3RoaW5nIHRvIHVwZGF0ZQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5hbWVkQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5hbWVkQ29sdW1uQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNjA0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTmFtZWRDb2x1bW5Bbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRDb2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW4KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JDb2x1bW4KKyAqIGphdmF4LnBlcnNpc3RlbmNlLlByaW1hcnlLZXlKb2luQ29sdW1uLgorICovCithYnN0cmFjdCBjbGFzcyBTb3VyY2VOYW1lZENvbHVtbkFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248TWVtYmVyPgorCWltcGxlbWVudHMgTmFtZWRDb2x1bW5Bbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCisJcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGNvbHVtbkRlZmluaXRpb25EZWNsYXJhdGlvbkFkYXB0ZXI7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjb2x1bW5EZWZpbml0aW9uQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uOworCisKKwlTb3VyY2VOYW1lZENvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7CisJCXRoaXMocGFyZW50LCBtZW1iZXIsIGRhYSwgbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgZGFhKSk7CisJfQorCQorCVNvdXJjZU5hbWVkQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKKwkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKHRoaXMuZ2V0TmFtZUVsZW1lbnROYW1lKCkpOworCQl0aGlzLm5hbWVBZGFwdGVyID0gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7CisJCXRoaXMuY29sdW1uRGVmaW5pdGlvbkRlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcih0aGlzLmdldENvbHVtbkRlZmluaXRpb25FbGVtZW50TmFtZSgpKTsKKwkJdGhpcy5jb2x1bW5EZWZpbml0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRFbGVtZW50QWRhcHRlcih0aGlzLmNvbHVtbkRlZmluaXRpb25EZWNsYXJhdGlvbkFkYXB0ZXIpOworCX0KKworCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcihTdHJpbmcgZWxlbWVudE5hbWUpIHsKKwkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKHRoaXMuZGFhLCBlbGVtZW50TmFtZSk7CisJfQorCisJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRCb29sZWFuRWxlbWVudEFkYXB0ZXIoU3RyaW5nIGVsZW1lbnROYW1lKSB7CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuZGFhLCBlbGVtZW50TmFtZSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRJbnRlZ2VyRWxlbWVudEFkYXB0ZXIoU3RyaW5nIGVsZW1lbnROYW1lKSB7CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHRoaXMuZGFhLCBlbGVtZW50TmFtZSwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRTaG9ydENpcmN1aXRFbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKKwkJcmV0dXJuIG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLm1lbWJlciwgZGFlYSk7CisJfQorCisJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEpIHsKKwkJcmV0dXJuIG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5tZW1iZXIsIGRhZWEpOworCX0KKworCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZFNob3J0Q2lyY3VpdEludGVnZXJFbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBkYWVhKSB7CisJCXJldHVybiBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHRoaXMubWVtYmVyLCBkYWVhKTsKKwl9CisKKwlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFNob3J0Q2lyY3VpdFN0cmluZ0VsZW1lbnRBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgeworCQlyZXR1cm4gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEVsZW1lbnRBZGFwdGVyKHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcihlbGVtZW50TmFtZSkpOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7CisJCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IHRoaXMuYnVpbGRDb2x1bW5EZWZpbml0aW9uKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnNldE5hbWUodGhpcy5idWlsZE5hbWUoYXN0Um9vdCkpOworCQl0aGlzLnNldENvbHVtbkRlZmluaXRpb24odGhpcy5idWlsZENvbHVtbkRlZmluaXRpb24oYXN0Um9vdCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIE5hbWVkQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvLyAqKioqKiBuYW1lCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMubmFtZSwgbmFtZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5hbWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7CisJfQorCisJYWJzdHJhY3QgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpOworCisJLy8gKioqKiogY29sdW1uIGRlZmluaXRpb24KKwlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKSB7CisJCXJldHVybiB0aGlzLmNvbHVtbkRlZmluaXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcgY29sdW1uRGVmaW5pdGlvbikgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5jb2x1bW5EZWZpbml0aW9uLCBjb2x1bW5EZWZpbml0aW9uKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLmNvbHVtbkRlZmluaXRpb247CisJCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IGNvbHVtbkRlZmluaXRpb247CisJCXRoaXMuY29sdW1uRGVmaW5pdGlvbkFkYXB0ZXIuc2V0VmFsdWUoY29sdW1uRGVmaW5pdGlvbik7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSwgb2xkLCBjb2x1bW5EZWZpbml0aW9uKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZENvbHVtbkRlZmluaXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uRGVmaW5pdGlvbkFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRDb2x1bW5EZWZpbml0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5jb2x1bW5EZWZpbml0aW9uRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKwlhYnN0cmFjdCBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCk7CisKKworCS8vICoqKioqKioqKiogTmVzdGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7CisJCU5hbWVkQ29sdW1uQW5ub3RhdGlvbiBvbGRDb2x1bW4gPSAoTmFtZWRDb2x1bW5Bbm5vdGF0aW9uKSBvbGRBbm5vdGF0aW9uOworCQl0aGlzLnNldE5hbWUob2xkQ29sdW1uLmdldE5hbWUoKSk7CisJCXRoaXMuc2V0Q29sdW1uRGVmaW5pdGlvbihvbGRDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NmUzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTmFtZWROYXRpdmVRdWVyaWVzCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPFR5cGU+CisJaW1wbGVtZW50cyBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIGZpbmFsIFZlY3RvcjxOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uPiBuYW1lZE5hdGl2ZVF1ZXJpZXMgPSBuZXcgVmVjdG9yPE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24+KCk7CisKKworCXB1YmxpYyBTb3VyY2VOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKKwkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMuaW5pdGlhbGl6ZSh0aGlzLCBhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLnVwZGF0ZSh0aGlzLCBhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLm5hbWVkTmF0aXZlUXVlcmllcyk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEFubm90YXRpb25Db250YWluZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKKwl9CisKKwlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0Q29udGFpbmVySmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRKZHRBbm5vdGF0aW9uKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVNfX1ZBTFVFOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24+IG5lc3RlZEFubm90YXRpb25zKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24+KHRoaXMubmFtZWROYXRpdmVRdWVyaWVzKTsKKwl9CisKKwlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBhZGROZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoKSB7CisJCU5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWROYXRpdmVRdWVyeSA9IHRoaXMuYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5KHRoaXMubmFtZWROYXRpdmVRdWVyaWVzLnNpemUoKSk7CisJCXRoaXMubmFtZWROYXRpdmVRdWVyaWVzLmFkZChuYW1lZE5hdGl2ZVF1ZXJ5KTsKKwkJcmV0dXJuIG5hbWVkTmF0aXZlUXVlcnk7CisJfQorCisJcHJpdmF0ZSBOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGJ1aWxkTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIFNvdXJjZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLmNyZWF0ZU5lc3RlZE5hbWVkTmF0aXZlUXVlcnkodGhpcywgdGhpcy5tZW1iZXIsIGluZGV4LCB0aGlzLmRhYSk7CisJfQorCisJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvbkFkZGVkKGludCBpbmRleCwgTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uKSB7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChOQU1FRF9OQVRJVkVfUVVFUklFU19MSVNULCBpbmRleCwgbmVzdGVkQW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbW92ZU5lc3RlZEFubm90YXRpb25JbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCkuZ2V0KHRhcmdldEluZGV4KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uTW92ZWQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJdGhpcy5maXJlSXRlbU1vdmVkKE5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJfQorCisJcHVibGljIE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gcmVtb3ZlTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKGludCBpbmRleCkgeworCQlyZXR1cm4gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJpZXMucmVtb3ZlKGluZGV4KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uUmVtb3ZlZChpbnQgaW5kZXgsIE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbikgeworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChOQU1FRF9OQVRJVkVfUVVFUklFU19MSVNULCBpbmRleCwgbmVzdGVkQW5ub3RhdGlvbik7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNWNhZGQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZE5hdGl2ZVF1ZXJ5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcmVzdWx0Q2xhc3NEZWNsYXJhdGlvbkFkYXB0ZXI7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiByZXN1bHRDbGFzc0FkYXB0ZXI7CisJcHJpdmF0ZSBTdHJpbmcgcmVzdWx0Q2xhc3M7CisKKwlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFJlc3VsdENsYXNzTmFtZTsKKworCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiByZXN1bHRTZXRNYXBwaW5nRGVjbGFyYXRpb25BZGFwdGVyOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcmVzdWx0U2V0TWFwcGluZ0FkYXB0ZXI7CisJcHJpdmF0ZSBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZzsKKworCisJcHVibGljIFNvdXJjZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgeworCQlzdXBlcihwYXJlbnQsIHR5cGUsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOworCQl0aGlzLnJlc3VsdENsYXNzRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZFJlc3VsdENsYXNzQWRhcHRlcihkYWEpOworCQl0aGlzLnJlc3VsdENsYXNzQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKHRoaXMucmVzdWx0Q2xhc3NEZWNsYXJhdGlvbkFkYXB0ZXIpOworCQl0aGlzLnJlc3VsdFNldE1hcHBpbmdEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkUmVzdWx0U2V0TWFwcGluZ0FkYXB0ZXIoZGFhKTsKKwkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKHRoaXMucmVzdWx0U2V0TWFwcGluZ0RlY2xhcmF0aW9uQWRhcHRlcik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7CisJCXRoaXMucmVzdWx0Q2xhc3MgPSB0aGlzLmJ1aWxkUmVzdWx0Q2xhc3MoYXN0Um9vdCk7CisJCXRoaXMuZnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzc05hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzc05hbWUoYXN0Um9vdCk7CisJCXRoaXMucmVzdWx0U2V0TWFwcGluZyA9IHRoaXMuYnVpbGRSZXN1bHRTZXRNYXBwaW5nKGFzdFJvb3QpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci51cGRhdGUoYXN0Um9vdCk7CisJCXRoaXMuc2V0UmVzdWx0Q2xhc3ModGhpcy5idWlsZFJlc3VsdENsYXNzKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzTmFtZSh0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzc05hbWUoYXN0Um9vdCkpOworCQl0aGlzLnNldFJlc3VsdFNldE1hcHBpbmcodGhpcy5idWlsZFJlc3VsdFNldE1hcHBpbmcoYXN0Um9vdCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBBYnN0cmFjdEJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLk5BTUVEX05BVElWRV9RVUVSWV9fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0UXVlcnlFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5OQU1FRF9OQVRJVkVfUVVFUllfX1FVRVJZOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRIaW50c0VsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLk5BTUVEX05BVElWRV9RVUVSWV9fSElOVFM7CisJfQorCisJQE92ZXJyaWRlCisJTmVzdGFibGVRdWVyeUhpbnRBbm5vdGF0aW9uIGJ1aWxkUXVlcnlIaW50KGludCBpbmRleCkgeworCQlyZXR1cm4gU291cmNlUXVlcnlIaW50QW5ub3RhdGlvbi5jcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5UXVlcnlIaW50KHRoaXMsIHRoaXMubWVtYmVyLCB0aGlzLmRhYSwgaW5kZXgpOworCX0KKworCisJLy8gKioqKioqKioqKiBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiByZXN1bHQgY2xhc3MKKwlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdENsYXNzKCkgeworCQlyZXR1cm4gdGhpcy5yZXN1bHRDbGFzczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXN1bHRDbGFzcyhTdHJpbmcgcmVzdWx0Q2xhc3MpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMucmVzdWx0Q2xhc3MsIHJlc3VsdENsYXNzKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLnJlc3VsdENsYXNzOworCQl0aGlzLnJlc3VsdENsYXNzID0gcmVzdWx0Q2xhc3M7CisJCXRoaXMucmVzdWx0Q2xhc3NBZGFwdGVyLnNldFZhbHVlKHJlc3VsdENsYXNzKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFU1VMVF9DTEFTU19QUk9QRVJUWSwgb2xkLCByZXN1bHRDbGFzcyk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRSZXN1bHRDbGFzcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5yZXN1bHRDbGFzc0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRSZXN1bHRDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMucmVzdWx0Q2xhc3NEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOworCX0KKworCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFJlc3VsdENsYXNzQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhQWRhcHRlcikgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhQWRhcHRlciwgSlBBLk5BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwl9CisKKwkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgcmVzdWx0IGNsYXNzIG5hbWUKKwlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NOYW1lKCkgIHsKKwkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzc05hbWU7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NOYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NOYW1lOworCQl0aGlzLmZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NOYW1lID0gbmFtZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9SRVNVTFRfQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NOYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiAodGhpcy5yZXN1bHRDbGFzcyA9PSBudWxsKSA/IG51bGwgOiBKRFRUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMucmVzdWx0Q2xhc3NBZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCkpOworCX0KKworCS8vICoqKioqIHJlc3VsdCBzZXQgbWFwcGluZworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0U2V0TWFwcGluZygpIHsKKwkJcmV0dXJuIHRoaXMucmVzdWx0U2V0TWFwcGluZzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZXN1bHRTZXRNYXBwaW5nKFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnJlc3VsdFNldE1hcHBpbmcsIHJlc3VsdFNldE1hcHBpbmcpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMucmVzdWx0U2V0TWFwcGluZzsKKwkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nID0gcmVzdWx0U2V0TWFwcGluZzsKKwkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nQWRhcHRlci5zZXRWYWx1ZShyZXN1bHRTZXRNYXBwaW5nKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFU1VMVF9TRVRfTUFQUElOR19QUk9QRVJUWSwgb2xkLCByZXN1bHRTZXRNYXBwaW5nKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFJlc3VsdFNldE1hcHBpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMucmVzdWx0U2V0TWFwcGluZ0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRSZXN1bHRTZXRNYXBwaW5nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5yZXN1bHRTZXRNYXBwaW5nRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKwlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRSZXN1bHRTZXRNYXBwaW5nQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhQWRhcHRlcikgeworCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFBZGFwdGVyLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkcpOworCX0KKworCisJLy8gKioqKioqKioqKiBOZXN0YWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQW5ub3RhdGlvbik7CisJCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG9sZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBvbGRBbm5vdGF0aW9uOworCQl0aGlzLnNldFJlc3VsdENsYXNzKG9sZFF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOworCQl0aGlzLnNldFJlc3VsdFNldE1hcHBpbmcob2xkUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBTb3VyY2VOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBjcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5KEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUikpOworCX0KKworCXN0YXRpYyBTb3VyY2VOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBjcmVhdGVOZXN0ZWROYW1lZE5hdGl2ZVF1ZXJ5KEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUsIGludCBpbmRleCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKSB7CisJCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgsIGF0dHJpYnV0ZU92ZXJyaWRlc0FkYXB0ZXIpOworCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHR5cGUsIGlkYWEpOworCQlyZXR1cm4gbmV3IFNvdXJjZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKHBhcmVudCwgdHlwZSwgaWRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOworCX0KKworCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgbmFtZWRRdWVyaWVzQWRhcHRlcikgeworCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKG5hbWVkUXVlcmllc0FkYXB0ZXIsIGluZGV4LCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NzM0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcmllc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlTmFtZWRRdWVyeUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTmFtZWRRdWVyaWVzCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPFR5cGU+CisJaW1wbGVtZW50cyBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIGZpbmFsIFZlY3RvcjxOZXN0YWJsZU5hbWVkUXVlcnlBbm5vdGF0aW9uPiBuYW1lZFF1ZXJpZXMgPSBuZXcgVmVjdG9yPE5lc3RhYmxlTmFtZWRRdWVyeUFubm90YXRpb24+KCk7CisKKworCXB1YmxpYyBTb3VyY2VOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKKwkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMuaW5pdGlhbGl6ZSh0aGlzLCBhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLnVwZGF0ZSh0aGlzLCBhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLm5hbWVkUXVlcmllcyk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEFubm90YXRpb25Db250YWluZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKKwl9CisKKwlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0Q29udGFpbmVySmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRKZHRBbm5vdGF0aW9uKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuTkFNRURfUVVFUklFU19fVkFMVUU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbj4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TmVzdGFibGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbj4odGhpcy5uYW1lZFF1ZXJpZXMpOworCX0KKworCXB1YmxpYyBpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lZFF1ZXJpZXMuc2l6ZSgpOworCX0KKworCXB1YmxpYyBOZXN0YWJsZU5hbWVkUXVlcnlBbm5vdGF0aW9uIGFkZE5lc3RlZEFubm90YXRpb25JbnRlcm5hbCgpIHsKKwkJTmVzdGFibGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gdGhpcy5idWlsZE5hbWVkUXVlcnkodGhpcy5uYW1lZFF1ZXJpZXMuc2l6ZSgpKTsKKwkJdGhpcy5uYW1lZFF1ZXJpZXMuYWRkKG5hbWVkUXVlcnkpOworCQlyZXR1cm4gbmFtZWRRdWVyeTsKKwl9CisKKwlwcml2YXRlIE5lc3RhYmxlTmFtZWRRdWVyeUFubm90YXRpb24gYnVpbGROYW1lZFF1ZXJ5KGludCBpbmRleCkgeworCQlyZXR1cm4gU291cmNlTmFtZWRRdWVyeUFubm90YXRpb24uY3JlYXRlTmVzdGVkTmFtZWRRdWVyeSh0aGlzLCBtZW1iZXIsIGluZGV4LCB0aGlzLmRhYSk7CisJfQorCisJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvbkFkZGVkKGludCBpbmRleCwgTmVzdGFibGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uKSB7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChOQU1FRF9RVUVSSUVTX0xJU1QsIGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBtb3ZlTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLm5hbWVkUXVlcmllcywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KS5nZXQodGFyZ2V0SW5kZXgpOworCX0KKworCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25Nb3ZlZChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQl0aGlzLmZpcmVJdGVtTW92ZWQoTkFNRURfUVVFUklFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCX0KKworCXB1YmxpYyBOZXN0YWJsZU5hbWVkUXVlcnlBbm5vdGF0aW9uIHJlbW92ZU5lc3RlZEFubm90YXRpb25JbnRlcm5hbChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZWRRdWVyaWVzLnJlbW92ZShpbmRleCk7CisJfQorCisJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvblJlbW92ZWQoaW50IGluZGV4LCBOZXN0YWJsZU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb24pIHsKKwkJdGhpcy5maXJlSXRlbVJlbW92ZWQoTkFNRURfUVVFUklFU19MSVNULCBpbmRleCwgbmVzdGVkQW5ub3RhdGlvbik7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTmFtZWRRdWVyeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDgwODIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTmFtZWRRdWVyeUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcnkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZU5hbWVkUXVlcnlBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VCYXNlTmFtZWRRdWVyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIE5lc3RhYmxlTmFtZWRRdWVyeUFubm90YXRpb24KK3sKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCisJcHVibGljIFNvdXJjZU5hbWVkUXVlcnlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgeworCQlzdXBlcihwYXJlbnQsIHR5cGUsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisKKwkvLyAqKioqKioqKioqIEFic3RyYWN0QmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuTkFNRURfUVVFUllfX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldFF1ZXJ5RWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuTkFNRURfUVVFUllfX1FVRVJZOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRIaW50c0VsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLk5BTUVEX1FVRVJZX19ISU5UUzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlOZXN0YWJsZVF1ZXJ5SGludEFubm90YXRpb24gYnVpbGRRdWVyeUhpbnQoaW50IGluZGV4KSB7CisJCXJldHVybiBTb3VyY2VRdWVyeUhpbnRBbm5vdGF0aW9uLmNyZWF0ZU5hbWVkUXVlcnlRdWVyeUhpbnQodGhpcywgdGhpcy5tZW1iZXIsIHRoaXMuZGFhLCBpbmRleCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgU291cmNlTmFtZWRRdWVyeUFubm90YXRpb24gY3JlYXRlTmFtZWRRdWVyeShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlKSB7CisJCXJldHVybiBuZXcgU291cmNlTmFtZWRRdWVyeUFubm90YXRpb24ocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKKwl9CisKKwlzdGF0aWMgU291cmNlTmFtZWRRdWVyeUFubm90YXRpb24gY3JlYXRlTmVzdGVkTmFtZWRRdWVyeShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlLCBpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYXR0cmlidXRlT3ZlcnJpZGVzQWRhcHRlcikgeworCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4LCBhdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKTsKKwkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0eXBlLCBpZGFhKTsKKwkJcmV0dXJuIG5ldyBTb3VyY2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbihwYXJlbnQsIHR5cGUsIGlkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIG5hbWVkUXVlcmllc0FkYXB0ZXIpIHsKKwkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihuYW1lZFF1ZXJpZXNBZGFwdGVyLCBpbmRleCwgSlBBLk5BTUVEX1FVRVJZKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VOb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NGJhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTm9kZS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkFic3RyYWN0SmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CisKKy8qKgorICogU291cmNlIGNvbnZlbmllbmNlIG1ldGhvZHMKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNvdXJjZU5vZGUKKwlleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlTm9kZQoreworCisJcHVibGljIFNvdXJjZU5vZGUoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlwdWJsaWMgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpIHsKKwkJcmV0dXJuIChKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQpIHRoaXMuZ2V0Um9vdCgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU9uZVRvTWFueUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPbmVUb01hbnlBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzNzlmOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPbmVUb01hbnlBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvTWFueQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU291cmNlT25lVG9NYW55QW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KKwlpbXBsZW1lbnRzIE9uZVRvTWFueUFubm90YXRpb24KK3sKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVEFSR0VUX0VOVElUWV9BREFQVEVSID0gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKCk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IEZFVENIX0FEQVBURVIgPSBidWlsZEZldGNoQWRhcHRlcigpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IENBU0NBREVfQURBUFRFUiA9IGJ1aWxkQ2FzY2FkZUFkYXB0ZXIoKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTUFQUEVEX0JZX0FEQVBURVIgPSBidWlsZE1hcHBlZEJ5QWRhcHRlcigpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbWFwcGVkQnlBZGFwdGVyOworCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OworCisKKwlwdWJsaWMgU291cmNlT25lVG9NYW55QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwkJdGhpcy5tYXBwZWRCeUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKE1BUFBFRF9CWV9BREFQVEVSKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKKwkJdGhpcy5tYXBwZWRCeSA9IHRoaXMuYnVpbGRNYXBwZWRCeShhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOworCQl0aGlzLnNldE1hcHBlZEJ5KHRoaXMuYnVpbGRNYXBwZWRCeShhc3RSb290KSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIFNvdXJjZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZ2V0VGFyZ2V0RW50aXR5QWRhcHRlcigpIHsKKwkJcmV0dXJuIFRBUkdFVF9FTlRJVFlfQURBUFRFUjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdldEZldGNoQWRhcHRlcigpIHsKKwkJcmV0dXJuIEZFVENIX0FEQVBURVI7CisJfQorCisJQE92ZXJyaWRlCisJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGdldENhc2NhZGVBZGFwdGVyKCkgeworCQlyZXR1cm4gQ0FTQ0FERV9BREFQVEVSOworCX0KKworCisJLy8gKioqKioqKioqKiBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKKwkJcmV0dXJuIHRoaXMubWFwcGVkQnk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG1hcHBlZEJ5KSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm1hcHBlZEJ5LCBtYXBwZWRCeSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkID0gdGhpcy5tYXBwZWRCeTsKKwkJdGhpcy5tYXBwZWRCeSA9IG1hcHBlZEJ5OworCQl0aGlzLm1hcHBlZEJ5QWRhcHRlci5zZXRWYWx1ZShtYXBwZWRCeSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQRURfQllfUFJPUEVSVFksIG9sZCwgbWFwcGVkQnkpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkTWFwcGVkQnkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMubWFwcGVkQnlBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoTUFQUEVEX0JZX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhNQVBQRURfQllfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoKSB7CisJCXJldHVybiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuT05FX1RPX01BTllfX1RBUkdFVF9FTlRJVFkpOworCX0KKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRNYXBwZWRCeUFkYXB0ZXIoKSB7CisJCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5PTkVfVE9fTUFOWV9fTUFQUEVEX0JZLCBmYWxzZSk7IC8vIGZhbHNlID0gZG8gbm90IHJlbW92ZSBhbm5vdGF0aW9uIHdoZW4gZW1wdHkKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRmV0Y2hBZGFwdGVyKCkgeworCQlyZXR1cm4gYnVpbGRGZXRjaEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuT05FX1RPX01BTllfX0ZFVENIKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRDYXNjYWRlQWRhcHRlcigpIHsKKwkJcmV0dXJuIGJ1aWxkRW51bUFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19NQU5ZX19DQVNDQURFKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPbmVUb09uZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPbmVUb09uZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjFkNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3VyY2VPbmVUb09uZUFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBPbmVUb09uZUFubm90YXRpb24KK3sKKwlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFRBUkdFVF9FTlRJVFlfQURBUFRFUiA9IGJ1aWxkVGFyZ2V0RW50aXR5QWRhcHRlcigpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBGRVRDSF9BREFQVEVSID0gYnVpbGRGZXRjaEFkYXB0ZXIoKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBDQVNDQURFX0FEQVBURVIgPSBidWlsZENhc2NhZGVBZGFwdGVyKCk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBPUFRJT05BTF9BREFQVEVSID0gYnVpbGRPcHRpb25hbEFkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBvcHRpb25hbEFkYXB0ZXI7CisJcHJpdmF0ZSBCb29sZWFuIG9wdGlvbmFsOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBNQVBQRURfQllfQURBUFRFUiA9IGJ1aWxkTWFwcGVkQnlBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBtYXBwZWRCeUFkYXB0ZXI7CisJcHJpdmF0ZSBTdHJpbmcgbWFwcGVkQnk7CisKKworCXB1YmxpYyBTb3VyY2VPbmVUb09uZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJCXRoaXMubWFwcGVkQnlBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihNQVBQRURfQllfQURBUFRFUik7CisJCXRoaXMub3B0aW9uYWxBZGFwdGVyID0gdGhpcy5idWlsZEJvb2xlYW5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoT1BUSU9OQUxfQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7CisJCXRoaXMubWFwcGVkQnkgPSB0aGlzLmJ1aWxkTWFwcGVkQnkoYXN0Um9vdCk7CisJCXRoaXMub3B0aW9uYWwgPSB0aGlzLmJ1aWxkT3B0aW9uYWwoYXN0Um9vdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnVwZGF0ZShhc3RSb290KTsKKwkJdGhpcy5zZXRNYXBwZWRCeSh0aGlzLmJ1aWxkTWFwcGVkQnkoYXN0Um9vdCkpOworCQl0aGlzLnNldE9wdGlvbmFsKHRoaXMuYnVpbGRPcHRpb25hbChhc3RSb290KSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIFNvdXJjZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZ2V0VGFyZ2V0RW50aXR5QWRhcHRlcigpIHsKKwkJcmV0dXJuIFRBUkdFVF9FTlRJVFlfQURBUFRFUjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdldEZldGNoQWRhcHRlcigpIHsKKwkJcmV0dXJuIEZFVENIX0FEQVBURVI7CisJfQorCisJQE92ZXJyaWRlCisJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGdldENhc2NhZGVBZGFwdGVyKCkgeworCQlyZXR1cm4gQ0FTQ0FERV9BREFQVEVSOworCX0KKworCisJLy8gKioqKioqKioqKiBPbmVUb09uZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogbWFwcGVkIGJ5CisJcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKKwkJcmV0dXJuIHRoaXMubWFwcGVkQnk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG1hcHBlZEJ5KSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm1hcHBlZEJ5LCBtYXBwZWRCeSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkID0gdGhpcy5tYXBwZWRCeTsKKwkJdGhpcy5tYXBwZWRCeSA9IG1hcHBlZEJ5OworCQl0aGlzLm1hcHBlZEJ5QWRhcHRlci5zZXRWYWx1ZShtYXBwZWRCeSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQRURfQllfUFJPUEVSVFksIG9sZCwgbWFwcGVkQnkpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkTWFwcGVkQnkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMubWFwcGVkQnlBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShNQVBQRURfQllfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gbWFwcGVkQnlUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKE1BUFBFRF9CWV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOworCX0KKworCS8vICoqKioqIG9wdGlvbmFsCisJcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7CisJCXJldHVybiB0aGlzLm9wdGlvbmFsOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMub3B0aW9uYWwsIG9wdGlvbmFsKSkgeworCQkJcmV0dXJuOworCQl9CisJCUJvb2xlYW4gb2xkID0gdGhpcy5vcHRpb25hbDsKKwkJdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsOworCQl0aGlzLm9wdGlvbmFsQWRhcHRlci5zZXRWYWx1ZShvcHRpb25hbCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPUFRJT05BTF9QUk9QRVJUWSwgb2xkLCBvcHRpb25hbCk7CisJfQorCisJcHJpdmF0ZSBCb29sZWFuIGJ1aWxkT3B0aW9uYWwoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMub3B0aW9uYWxBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T3B0aW9uYWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShPUFRJT05BTF9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoKSB7CisJCXJldHVybiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuT05FX1RPX09ORV9fVEFSR0VUX0VOVElUWSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE1hcHBlZEJ5QWRhcHRlcigpIHsKKwkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19PTkVfX01BUFBFRF9CWSwgZmFsc2UpOyAvLyBmYWxzZSA9IGRvIG5vdCByZW1vdmUgYW5ub3RhdGlvbiB3aGVuIGVtcHR5CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcigpIHsKKwkJcmV0dXJuIGJ1aWxkRmV0Y2hBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19PTkVfX0ZFVENIKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9wdGlvbmFsQWRhcHRlcigpIHsKKwkJcmV0dXJuIGJ1aWxkT3B0aW9uYWxBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19PTkVfX09QVElPTkFMKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9wdGlvbmFsQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBmYWxzZSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkQ2FzY2FkZUFkYXB0ZXIoKSB7CisJCXJldHVybiBidWlsZEVudW1BcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5PTkVfVE9fT05FX19DQVNDQURFKTsKKwl9CisKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU9yZGVyQnlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlT3JkZXJCeUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWViMjdjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU9yZGVyQnlBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9yZGVyQnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5PcmRlckJ5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VPcmRlckJ5QW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+CisJaW1wbGVtZW50cyBPcmRlckJ5QW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7CisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKworCXB1YmxpYyBTb3VyY2VPcmRlckJ5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYXR0cmlidXRlLCBWQUxVRV9BREFQVEVSKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy5zZXRWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOworCX0KKworCisJLy8gKioqKioqKioqKiBPcmRlckJ5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5PUkRFUl9CWV9fVkFMVUUsIGZhbHNlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPdmVycmlkZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPdmVycmlkZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDA3NThiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIENvbW1vbiBiZWhhdmlvciBmb3IKKyAqICAgICBqYXZheC5wZXJzaXN0ZW5jZS5BdHRyaWJ1dGVPdmVycmlkZQorICogICAgIGphdmF4LnBlcnNpc3RlbmNlLkFzc29jaWF0aW9uT3ZlcnJpZGUKKyAqLworYWJzdHJhY3QgY2xhc3MgU291cmNlT3ZlcnJpZGVBbm5vdGF0aW9uIAorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxNZW1iZXI+ICAKKwlpbXBsZW1lbnRzIE92ZXJyaWRlQW5ub3RhdGlvbgorewkJCisJZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lRGVjbGFyYXRpb25BZGFwdGVyOworCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOworCVN0cmluZyBuYW1lOworCQkKKworCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKKworCVNvdXJjZU92ZXJyaWRlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKKwkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCB0aGlzLmdldE5hbWVFbGVtZW50TmFtZSgpLCBmYWxzZSk7IC8vIGZhbHNlID0gZG8gbm90IHJlbW92ZSBhbm5vdGF0aW9uIHdoZW4gZW1wdHkKKwkJdGhpcy5uYW1lQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLm1lbWJlciwgdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy5zZXROYW1lKHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKKwl9CisJCisKKwkvLyAqKioqKioqKioqIE92ZXJyaWRlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBuYW1lCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMubmFtZSwgbmFtZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5hbWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT3ZlcnJpZGVBbm5vdGF0aW9uLk5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXModGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOworCX0KKworCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCk7CisKKworCS8vICoqKioqKioqKiogTmVzdGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXZvaWQgaW5pdGlhbGl6ZUZyb20oTmVzdGFibGVBbm5vdGF0aW9uIG9sZEFubm90YXRpb24pIHsKKwkJT3ZlcnJpZGVBbm5vdGF0aW9uIG9sZE92ZXJyaWRlID0gKE92ZXJyaWRlQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKKwkJdGhpcy5zZXROYW1lKG9sZE92ZXJyaWRlLmdldE5hbWUoKSk7CisJfQorCQorCS8qKgorCSAqIGNvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBmcm9tIE5lc3RhYmxlQW5ub3RhdGlvbiBpbnRlcmZhY2UKKwkgKiBmb3Igc3ViY2xhc3NlcworCSAqLworCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBpbmRleCkgeworCQl0aGlzLmdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpLm1vdmVBbm5vdGF0aW9uKGluZGV4KTsKKwl9CisJCisJcHJpdmF0ZSBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkgeworCQlyZXR1cm4gKEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcikgdGhpcy5hbm5vdGF0aW9uQWRhcHRlcjsKKwl9CisJCQkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNzViYzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsMzg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVEZpZWxkQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVE1ldGhvZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZXRob2RBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5NZXRob2RTaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CisKKy8qKgorICogSmF2YSBzb3VyY2UgcGVyc2lzdGVudCBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KQorICovCitmaW5hbCBjbGFzcyBTb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlCisJZXh0ZW5kcyBTb3VyY2VQZXJzaXN0ZW50TWVtYmVyPEF0dHJpYnV0ZT4KKwlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUKK3sKKwlwcml2YXRlIGludCBtb2RpZmllcnM7CisKKwlwcml2YXRlIFN0cmluZyB0eXBlTmFtZTsKKworCXByaXZhdGUgYm9vbGVhbiB0eXBlSXNJbnRlcmZhY2U7CisKKwlwcml2YXRlIGJvb2xlYW4gdHlwZUlzRW51bTsKKworCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gdHlwZVN1cGVyY2xhc3NOYW1lcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworCisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiB0eXBlSW50ZXJmYWNlTmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKworCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gdHlwZVR5cGVBcmd1bWVudE5hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisKKworCS8qKgorCSAqIGNvbnN0cnVjdCBmaWVsZCBhdHRyaWJ1dGUKKwkgKi8KKwlzdGF0aWMgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdJbnN0YW5jZSgKKwkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwKKwkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKKwkJCVN0cmluZyBuYW1lLAorCQkJaW50IG9jY3VycmVuY2UsCisJCQlKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LAorCQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJQXR0cmlidXRlIGF0dHJpYnV0ZSA9IG5ldyBKRFRGaWVsZEF0dHJpYnV0ZSgKKwkJCQlkZWNsYXJpbmdUeXBlLAorCQkJCW5hbWUsCisJCQkJb2NjdXJyZW5jZSwKKwkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0Q29tcGlsYXRpb25Vbml0KCksCisJCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCksCisJCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEgPSBuZXcgU291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZShwYXJlbnQsIGF0dHJpYnV0ZSk7CisJCWpycGEuaW5pdGlhbGl6ZShhc3RSb290KTsKKwkJcmV0dXJuIGpycGE7CisJfQorCisJLyoqCisJICogY29uc3RydWN0IHByb3BlcnR5IGF0dHJpYnV0ZQorCSAqLworCXN0YXRpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0luc3RhbmNlKAorCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LAorCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAorCQkJTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwKKwkJCWludCBvY2N1cnJlbmNlLAorCQkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwKKwkJCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBKRFRNZXRob2RBdHRyaWJ1dGUubmV3SW5zdGFuY2UoCisJCQkJZGVjbGFyaW5nVHlwZSwKKwkJCQlzaWduYXR1cmUsCisJCQkJb2NjdXJyZW5jZSwKKwkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0Q29tcGlsYXRpb25Vbml0KCksCisJCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCksCisJCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEgPSBuZXcgU291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZShwYXJlbnQsIGF0dHJpYnV0ZSk7CisJCWpycGEuaW5pdGlhbGl6ZShhc3RSb290KTsKKwkJcmV0dXJuIGpycGE7CisJfQorCisJcHJpdmF0ZSBTb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSl7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7CisJCXRoaXMubW9kaWZpZXJzID0gdGhpcy5idWlsZE1vZGlmaWVycyhhc3RSb290KTsKKwkJdGhpcy50eXBlTmFtZSA9IHRoaXMuYnVpbGRUeXBlTmFtZShhc3RSb290KTsKKwkJdGhpcy50eXBlSXNJbnRlcmZhY2UgPSB0aGlzLmJ1aWxkVHlwZUlzSW50ZXJmYWNlKGFzdFJvb3QpOworCQl0aGlzLnR5cGVJc0VudW0gPSB0aGlzLmJ1aWxkVHlwZUlzRW51bShhc3RSb290KTsKKwkJdGhpcy50eXBlU3VwZXJjbGFzc05hbWVzLmFkZEFsbCh0aGlzLmJ1aWxkVHlwZVN1cGVyY2xhc3NOYW1lcyhhc3RSb290KSk7CisJCXRoaXMudHlwZUludGVyZmFjZU5hbWVzLmFkZEFsbCh0aGlzLmJ1aWxkVHlwZUludGVyZmFjZU5hbWVzKGFzdFJvb3QpKTsKKwkJdGhpcy50eXBlVHlwZUFyZ3VtZW50TmFtZXMuYWRkQWxsKHRoaXMuYnVpbGRUeXBlVHlwZUFyZ3VtZW50TmFtZXMoYXN0Um9vdCkpOworCX0KKworCisJLy8gKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIucmVzb2x2ZVR5cGVzKGFzdFJvb3QpOworCQl0aGlzLnNldFR5cGVOYW1lKHRoaXMuYnVpbGRUeXBlTmFtZShhc3RSb290KSk7CisJCXRoaXMuc2V0VHlwZVN1cGVyY2xhc3NOYW1lcyh0aGlzLmJ1aWxkVHlwZVN1cGVyY2xhc3NOYW1lcyhhc3RSb290KSk7CisJCXRoaXMuc2V0VHlwZUludGVyZmFjZU5hbWVzKHRoaXMuYnVpbGRUeXBlSW50ZXJmYWNlTmFtZXMoYXN0Um9vdCkpOworCQl0aGlzLnNldFR5cGVUeXBlQXJndW1lbnROYW1lcyh0aGlzLmJ1aWxkVHlwZVR5cGVBcmd1bWVudE5hbWVzKGFzdFJvb3QpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOworCQl0aGlzLnNldE1vZGlmaWVycyh0aGlzLmJ1aWxkTW9kaWZpZXJzKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRUeXBlTmFtZSh0aGlzLmJ1aWxkVHlwZU5hbWUoYXN0Um9vdCkpOworCQl0aGlzLnNldFR5cGVJc0ludGVyZmFjZSh0aGlzLmJ1aWxkVHlwZUlzSW50ZXJmYWNlKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRUeXBlSXNFbnVtKHRoaXMuYnVpbGRUeXBlSXNFbnVtKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRUeXBlU3VwZXJjbGFzc05hbWVzKHRoaXMuYnVpbGRUeXBlU3VwZXJjbGFzc05hbWVzKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRUeXBlSW50ZXJmYWNlTmFtZXModGhpcy5idWlsZFR5cGVJbnRlcmZhY2VOYW1lcyhhc3RSb290KSk7CisJCXRoaXMuc2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzKHRoaXMuYnVpbGRUeXBlVHlwZUFyZ3VtZW50TmFtZXMoYXN0Um9vdCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMuZ2V0TmFtZSgpKTsKKwl9CisKKworCS8vICoqKioqKioqIEFic3RyYWN0SmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgorCQorCUBPdmVycmlkZQorCUl0ZXJhdG9yPFN0cmluZz4gdmFsaWRBbm5vdGF0aW9uTmFtZXMoKSB7CisJCXJldHVybiB0aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLmF0dHJpYnV0ZUFubm90YXRpb25OYW1lcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuCisJCQlidWlsZEF0dHJpYnV0ZUFubm90YXRpb24odGhpcywgdGhpcy5tZW1iZXIsIGFubm90YXRpb25OYW1lKTsKKwl9CisJCisJQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uXyhTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuCisJCQlidWlsZE51bGxBdHRyaWJ1dGVBbm5vdGF0aW9uKHRoaXMsIGFubm90YXRpb25OYW1lKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNGb3IoTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UpIHsKKwkJcmV0dXJuICgoTWV0aG9kQXR0cmlidXRlKSB0aGlzLm1lbWJlcikubWF0Y2hlcyhzaWduYXR1cmUsIG9jY3VycmVuY2UpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKiBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqCisJCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5tZW1iZXIuZ2V0QXR0cmlidXRlTmFtZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgeworCQlyZXR1cm4gKGFubm90YXRpb25OYW1lID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGROdWxsQW5ub3RhdGlvbl8oYW5ub3RhdGlvbk5hbWUpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkKCkgeworCQlyZXR1cm4gdGhpcy5tZW1iZXIuaXNGaWVsZCgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5KCkgeworCQlyZXR1cm4gISB0aGlzLmlzRmllbGQoKTsKKwl9CisJCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzKCkgeworCQlBY2Nlc3MyXzBBbm5vdGF0aW9uIGFjY2Vzc0Fubm90YXRpb24gPSAKKwkJCQkoQWNjZXNzMl8wQW5ub3RhdGlvbikgZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCXJldHVybiAoYWNjZXNzQW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhY2Nlc3NBbm5vdGF0aW9uLmdldFZhbHVlKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHR5cGVJc1N1YlR5cGVPZihTdHJpbmcgdG4pIHsKKwkJaWYgKHRoaXMudHlwZU5hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0aGlzLnR5cGVOYW1lLmVxdWFscyh0bikKKwkJCQl8fCB0aGlzLnR5cGVJbnRlcmZhY2VOYW1lcy5jb250YWlucyh0bikKKwkJCQl8fCB0aGlzLnR5cGVTdXBlcmNsYXNzTmFtZXMuY29udGFpbnModG4pOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiB0eXBlSXNWYXJpYWJsZVByaW1pdGl2ZSgpIHsKKwkJcmV0dXJuICh0aGlzLnR5cGVOYW1lICE9IG51bGwpICYmIENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmUodGhpcy50eXBlTmFtZSk7CisJfQorCQorCXByaXZhdGUgSVR5cGVCaW5kaW5nIGdldFR5cGVCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLm1lbWJlci5nZXRUeXBlQmluZGluZyhhc3RSb290KTsKKwl9CisJCisJCisJLy8gKioqKiogbW9kaWZpZXJzCisJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisJCXJldHVybiB0aGlzLm1vZGlmaWVyczsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0TW9kaWZpZXJzKGludCBtb2RpZmllcnMpIHsKKwkJaW50IG9sZCA9IHRoaXMubW9kaWZpZXJzOworCQl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1PRElGSUVSU19QUk9QRVJUWSwgb2xkLCBtb2RpZmllcnMpOworCX0KKworCS8qKgorCSAqIHplcm8gc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUgZGVmYXVsdC4uLgorCSAqLworCXByaXZhdGUgaW50IGJ1aWxkTW9kaWZpZXJzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUlCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLm1lbWJlci5nZXRCaW5kaW5nKGFzdFJvb3QpOworCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyAwIDogYmluZGluZy5nZXRNb2RpZmllcnMoKTsKKwl9CisKKwkvLyAqKioqKiB0eXBlIG5hbWUKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgeworCQlyZXR1cm4gdGhpcy50eXBlTmFtZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0VHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnR5cGVOYW1lOworCQl0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX05BTUVfUFJPUEVSVFksIG9sZCwgdHlwZU5hbWUpOworCX0KKworCS8qKgorCSAqIHRoaXMgY2FuIGJlIGFuIGFycmF5IChlLmcuICJqYXZhLmxhbmcuU3RyaW5nW10iKTsKKwkgKiBidXQgbm8gZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cworCSAqLworCXByaXZhdGUgU3RyaW5nIGJ1aWxkVHlwZU5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZyhhc3RSb290KTsKKwkJcmV0dXJuICh0eXBlQmluZGluZyA9PSBudWxsKSA/IG51bGwgOiB0eXBlQmluZGluZy5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCk7CisJfQorCisJLy8gKioqKiogdHlwZSBpcyBpbnRlcmZhY2UKKwlwdWJsaWMgYm9vbGVhbiB0eXBlSXNJbnRlcmZhY2UoKSB7CisJCXJldHVybiB0aGlzLnR5cGVJc0ludGVyZmFjZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0VHlwZUlzSW50ZXJmYWNlKGJvb2xlYW4gdHlwZUlzSW50ZXJmYWNlKSB7CisJCWJvb2xlYW4gb2xkID0gdGhpcy50eXBlSXNJbnRlcmZhY2U7CisJCXRoaXMudHlwZUlzSW50ZXJmYWNlID0gdHlwZUlzSW50ZXJmYWNlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9JU19JTlRFUkZBQ0VfUFJPUEVSVFksIG9sZCwgdHlwZUlzSW50ZXJmYWNlKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gYnVpbGRUeXBlSXNJbnRlcmZhY2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZyhhc3RSb290KTsKKwkJcmV0dXJuICh0eXBlQmluZGluZyAhPSBudWxsKSAmJiAoICEgdHlwZUJpbmRpbmcuaXNBcnJheSgpKSAmJiB0eXBlQmluZGluZy5pc0ludGVyZmFjZSgpOworCX0KKworCS8vICoqKioqIHR5cGUgaXMgZW51bQorCXB1YmxpYyBib29sZWFuIHR5cGVJc0VudW0oKSB7CisJCXJldHVybiB0aGlzLnR5cGVJc0VudW07CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFR5cGVJc0VudW0oYm9vbGVhbiB0eXBlSXNFbnVtKSB7CisJCWJvb2xlYW4gb2xkID0gdGhpcy50eXBlSXNFbnVtOworCQl0aGlzLnR5cGVJc0VudW0gPSB0eXBlSXNFbnVtOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9JU19FTlVNX1BST1BFUlRZLCBvbGQsIHR5cGVJc0VudW0pOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBidWlsZFR5cGVJc0VudW0oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZyhhc3RSb290KTsKKwkJcmV0dXJuICh0eXBlQmluZGluZyAhPSBudWxsKSAmJiAoICEgdHlwZUJpbmRpbmcuaXNBcnJheSgpKSAmJiB0eXBlQmluZGluZy5pc0VudW0oKTsKKwl9CisKKwkvLyAqKioqKiB0eXBlIHN1cGVyY2xhc3MgaGllcmFyY2h5CisJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHR5cGVTdXBlcmNsYXNzTmFtZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLnR5cGVTdXBlcmNsYXNzTmFtZXMpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRUeXBlU3VwZXJjbGFzc05hbWVzKExpc3Q8U3RyaW5nPiB0eXBlU3VwZXJjbGFzc05hbWVzKSB7CisJCXRoaXMuc3luY2hyb25pemVMaXN0KHR5cGVTdXBlcmNsYXNzTmFtZXMsIHRoaXMudHlwZVN1cGVyY2xhc3NOYW1lcywgVFlQRV9TVVBFUkNMQVNTX05BTUVTX0xJU1QpOworCX0KKworCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVHlwZVN1cGVyY2xhc3NOYW1lcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmdldFR5cGVCaW5kaW5nKGFzdFJvb3QpOworCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgeworCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCQl9CisJCUFycmF5TGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXR5cGVCaW5kaW5nID0gdHlwZUJpbmRpbmcuZ2V0U3VwZXJjbGFzcygpOworCQl3aGlsZSAodHlwZUJpbmRpbmcgIT0gbnVsbCkgeworCQkJbmFtZXMuYWRkKHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKSk7CisJCQl0eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nLmdldFN1cGVyY2xhc3MoKTsKKwkJfQorCQlyZXR1cm4gbmFtZXM7CisJfQorCisJLy8gKioqKiogdHlwZSBpbnRlcmZhY2UgaGllcmFyY2h5CisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gdHlwZUludGVyZmFjZU5hbWVzKCkgeworCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8U3RyaW5nPih0aGlzLnR5cGVJbnRlcmZhY2VOYW1lcyk7CisJfQorCisvLwlwcml2YXRlIGJvb2xlYW4gdHlwZUludGVyZmFjZU5hbWVzQ29udGFpbnMoU3RyaW5nIGludGVyZmFjZU5hbWUpIHsKKy8vCQlyZXR1cm4gdGhpcy50eXBlSW50ZXJmYWNlTmFtZXMuY29udGFpbnMoaW50ZXJmYWNlTmFtZSk7CisvLwl9CisvLworCXByaXZhdGUgdm9pZCBzZXRUeXBlSW50ZXJmYWNlTmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVJbnRlcmZhY2VOYW1lcykgeworCQl0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbih0eXBlSW50ZXJmYWNlTmFtZXMsIHRoaXMudHlwZUludGVyZmFjZU5hbWVzLCBUWVBFX0lOVEVSRkFDRV9OQU1FU19DT0xMRUNUSU9OKTsKKwl9CisKKwlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZFR5cGVJbnRlcmZhY2VOYW1lcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLmdldFR5cGVCaW5kaW5nKGFzdFJvb3QpOworCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgeworCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisJCX0KKwkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQl3aGlsZSAodHlwZUJpbmRpbmcgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRJbnRlcmZhY2VOYW1lc1RvKHR5cGVCaW5kaW5nLCBuYW1lcyk7CisJCQl0eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nLmdldFN1cGVyY2xhc3MoKTsKKwkJfQorCQlyZXR1cm4gbmFtZXM7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZEludGVyZmFjZU5hbWVzVG8oSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBIYXNoU2V0PFN0cmluZz4gbmFtZXMpIHsKKwkJZm9yIChJVHlwZUJpbmRpbmcgaW50ZXJmYWNlQmluZGluZyA6IHR5cGVCaW5kaW5nLmdldEludGVyZmFjZXMoKSkgeworCQkJbmFtZXMuYWRkKGludGVyZmFjZUJpbmRpbmcuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKwkJCXRoaXMuYWRkSW50ZXJmYWNlTmFtZXNUbyhpbnRlcmZhY2VCaW5kaW5nLCBuYW1lcyk7ICAvLyByZWN1cnNlCisJCX0KKwl9CisKKwkvLyAqKioqKiB0eXBlIHR5cGUgYXJndW1lbnQgbmFtZXMKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdHlwZVR5cGVBcmd1bWVudE5hbWVzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy50eXBlVHlwZUFyZ3VtZW50TmFtZXMpOworCX0KKworCXB1YmxpYyBpbnQgdHlwZVR5cGVBcmd1bWVudE5hbWVzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMudHlwZVR5cGVBcmd1bWVudE5hbWVzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGVUeXBlQXJndW1lbnROYW1lKGludCBpbmRleCkgeworCQlyZXR1cm4gdGhpcy50eXBlVHlwZUFyZ3VtZW50TmFtZXMuZ2V0KGluZGV4KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzKExpc3Q8U3RyaW5nPiB0eXBlVHlwZUFyZ3VtZW50TmFtZXMpIHsKKwkJdGhpcy5zeW5jaHJvbml6ZUxpc3QodHlwZVR5cGVBcmd1bWVudE5hbWVzLCB0aGlzLnR5cGVUeXBlQXJndW1lbnROYW1lcywgVFlQRV9UWVBFX0FSR1VNRU5UX05BTUVTX0xJU1QpOworCX0KKworCS8qKgorCSAqIHRoZXNlIHR5cGVzIGNhbiBiZSBhcnJheXMgKGUuZy4gImphdmEubGFuZy5TdHJpbmdbXSIpOworCSAqIGJ1dCB0aGV5IHdvbid0IGhhdmUgYW55IGZ1cnRoZXIgbmVzdGVkIGdlbmVyaWMgdHlwZSBhcmd1bWVudHMKKwkgKiAoZS5nLiAiamF2YS51dGlsLkNvbGxlY3Rpb248amF2YS5sYW5nLlN0cmluZz4iKQorCSAqLworCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVHlwZVR5cGVBcmd1bWVudE5hbWVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXN0Um9vdCk7CisJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7CisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJCX0KKworCQlJVHlwZUJpbmRpbmdbXSB0eXBlQXJndW1lbnRzID0gdHlwZUJpbmRpbmcuZ2V0VHlwZUFyZ3VtZW50cygpOworCQlpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCQl9CisKKwkJQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odHlwZUFyZ3VtZW50cy5sZW5ndGgpOworCQlmb3IgKElUeXBlQmluZGluZyB0eXBlQXJndW1lbnQgOiB0eXBlQXJndW1lbnRzKSB7CisJCQlpZiAodHlwZUFyZ3VtZW50ID09IG51bGwpIHsKKwkJCQluYW1lcy5hZGQobnVsbCk7CisJCQl9IGVsc2UgeworCQkJCW5hbWVzLmFkZCh0eXBlQXJndW1lbnQuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbmFtZXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlUGVyc2lzdGVudE1lbWJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVBlcnNpc3RlbnRNZW1iZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGVhOTU4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVBlcnNpc3RlbnRNZW1iZXIuamF2YQpAQCAtMCwwICsxLDU0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVE5vZGVUZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29udGFpbmVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7CisKKy8qKgorICogSmF2YSBzb3VyY2UgcGVyc2lzdGVudCBtZW1iZXIgKGFubm90YXRpb25zLCAicGVyc2lzdGFibGUiKQorICovCithYnN0cmFjdCBjbGFzcyBTb3VyY2VQZXJzaXN0ZW50TWVtYmVyPEUgZXh0ZW5kcyBNZW1iZXI+CisJZXh0ZW5kcyBTb3VyY2VOb2RlCisJaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyCit7CisJZmluYWwgRSBtZW1iZXI7CisJCisJLyoqCisJICogYW5ub3RhdGlvbnM7IG5vIGR1cGxpY2F0ZXMgKGphdmEgY29tcGlsZXIgaGFzIGFuIGVycm9yIGZvciBkdXBsaWNhdGVzKQorCSAqLworCWZpbmFsIFZlY3RvcjxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IG5ldyBWZWN0b3I8QW5ub3RhdGlvbj4oKTsKKwkKKwlib29sZWFuIHBlcnNpc3RhYmxlOworCQorCQorCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKKwkKKwlTb3VyY2VQZXJzaXN0ZW50TWVtYmVyKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBFIG1lbWJlcikgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLm1lbWJlciA9IG1lbWJlcjsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLm1lbWJlci5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkuYWNjZXB0KHRoaXMuYnVpbGRJbml0aWFsQW5ub3RhdGlvblZpc2l0b3IoYXN0Um9vdCkpOworCQl0aGlzLnBlcnNpc3RhYmxlID0gdGhpcy5idWlsZFBlcnNpc3RhYmxlKGFzdFJvb3QpOworCX0KKwkKKwlwcml2YXRlIEFTVFZpc2l0b3IgYnVpbGRJbml0aWFsQW5ub3RhdGlvblZpc2l0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG5ldyBJbml0aWFsQW5ub3RhdGlvblZpc2l0b3IoYXN0Um9vdCwgdGhpcy5tZW1iZXIuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpKTsKKwl9CisJCisJLyoqCisJICogY2FsbGVkIGZyb20gSW5pdGlhbEFubm90YXRpb25WaXNpdG9yIAorCSAqLworCXZvaWQgYWRkSW5pdGlhbEFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gbm9kZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJU3RyaW5nIGpkdEFubm90YXRpb25OYW1lID0gSkRUVG9vbHMucmVzb2x2ZUFubm90YXRpb24obm9kZSk7CisJCWlmIChqZHRBbm5vdGF0aW9uTmFtZSA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHRoaXMuYW5ub3RhdGlvbklzVmFsaWQoamR0QW5ub3RhdGlvbk5hbWUpKSB7CisJCQlpZiAodGhpcy5zZWxlY3RBbm5vdGF0aW9uTmFtZWQodGhpcy5hbm5vdGF0aW9ucywgamR0QW5ub3RhdGlvbk5hbWUpID09IG51bGwpIHsgLy8gaWdub3JlIGR1cGxpY2F0ZXMKKwkJCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbihqZHRBbm5vdGF0aW9uTmFtZSk7CisJCQkJYW5ub3RhdGlvbi5pbml0aWFsaXplKGFzdFJvb3QpOworCQkJCXRoaXMuYW5ub3RhdGlvbnMuYWRkKGFubm90YXRpb24pOworCQkJfQorCQl9CisJfQorCQorCQorCS8vICoqKioqKioqKiogYW5ub3RhdGlvbnMgKioqKioqKioqKgorCQorCXB1YmxpYyBJdGVyYXRvcjxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvbnMoKS5pdGVyYXRvcigpOworCX0KKwkKKwlwcml2YXRlIEl0ZXJhYmxlPEFubm90YXRpb24+IGdldEFubm90YXRpb25zKCkgeworCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEFubm90YXRpb24+KHRoaXMuYW5ub3RhdGlvbnMpOworCX0KKwkKKwlwdWJsaWMgaW50IGFubm90YXRpb25zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnMuc2l6ZSgpOworCX0KKwkKKwlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgeworCQlyZXR1cm4gdGhpcy5zZWxlY3RBbm5vdGF0aW9uTmFtZWQodGhpcy5nZXRBbm5vdGF0aW9ucygpLCBhbm5vdGF0aW9uTmFtZSk7CisJfQorCQorCXB1YmxpYyBBbm5vdGF0aW9uIGdldE5vbk51bGxBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgeworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOworCQlyZXR1cm4gKGFubm90YXRpb24gIT0gbnVsbCkgPyBhbm5vdGF0aW9uIDogdGhpcy5idWlsZE51bGxBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKTsKKwl9CisJCisJcHVibGljIEl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMoCisJCQlTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKSB7CisJCUNvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPiBjb250YWluZXJBbm5vdGF0aW9uID0gCisJCQkJdGhpcy5nZXRDb250YWluZXJBbm5vdGF0aW9uKGNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKKwkJaWYgKGNvbnRhaW5lckFubm90YXRpb24gIT0gbnVsbCkgeworCQkJcmV0dXJuIGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbnMoKTsKKwkJfQorCQlOZXN0YWJsZUFubm90YXRpb24gbmVzdGFibGVBbm5vdGF0aW9uID0gCisJCQkJZ2V0TmVzdGFibGVBbm5vdGF0aW9uKG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOworCQlpZiAobmVzdGFibGVBbm5vdGF0aW9uICE9IG51bGwpIHsKKwkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4obmVzdGFibGVBbm5vdGF0aW9uKTsKKwkJfQorCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOworCX0KKwkKKwkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0Q29udGFpbmVyQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJcmV0dXJuIChDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4pIGdldEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOworCX0KKwkKKwlwcml2YXRlIE5lc3RhYmxlQW5ub3RhdGlvbiBnZXROZXN0YWJsZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7CisJCXJldHVybiAoTmVzdGFibGVBbm5vdGF0aW9uKSB0aGlzLmdldEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOworCX0KKwkKKwlwdWJsaWMgQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgeworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7CisJCXRoaXMuYW5ub3RhdGlvbnMuYWRkKGFubm90YXRpb24pOworCQlhbm5vdGF0aW9uLm5ld0Fubm90YXRpb24oKTsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKEFOTk9UQVRJT05TX0NPTExFQ1RJT04sIGFubm90YXRpb24pOworCQlyZXR1cm4gYW5ub3RhdGlvbjsKKwl9CisJCisJcHVibGljIEFubm90YXRpb24gYWRkQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIEFubm90YXRpb25Jbml0aWFsaXplciBhbm5vdGF0aW9uSW5pdGlhbGl6ZXIpIHsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5idWlsZEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOworCQl0aGlzLmFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKKwkJYW5ub3RhdGlvbi5uZXdBbm5vdGF0aW9uKCk7CisJCUFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbiA9IGFubm90YXRpb25Jbml0aWFsaXplci5pbml0aWFsaXplQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKKwkJbmVzdGVkQW5ub3RhdGlvbi5uZXdBbm5vdGF0aW9uKCk7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChBTk5PVEFUSU9OU19DT0xMRUNUSU9OLCBhbm5vdGF0aW9uKTsKKwkJcmV0dXJuIG5lc3RlZEFubm90YXRpb247CisJfQorCQorCS8qKgorCSAqIDEuIGNoZWNrIGZvciBhIGNvbnRhaW5lciBhbm5vdGF0aW9uOworCSAqICAgICBpZiBpdCBpcyBwcmVzZW50LCBhZGQgYSBuZXN0ZWQgYW5ub3RhdGlvbiB0byBpdAorCSAqIDIuIGNoZWNrIGZvciBhIHN0YW5kLWFsb25lIG5lc3RlZCBhbm5vdGF0aW9uOworCSAqICAgICBpZiBpdCBpcyBtaXNzaW5nLCBhZGQgYSBzdGFuZC1hbG9uZSBuZXN0ZWQgYW5ub3RhdGlvbgorCSAqIDMuIGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHN0YW5kLWFsb25lIG5lc3RlZCBhbm5vdGF0aW9uLAorCSAqICAgICBhZGQgYSBjb250YWluZXIgYW5ub3RhdGlvbiBhbmQgbW92ZSB0aGUgc3RhbmQtYWxvbmUgbmVzdGVkIGFubm90YXRpb24gdG8gaXQKKwkgKiAgICAgYW5kIGFkZCBhIG5ldyBuZXN0ZWQgYW5ub3RhdGlvbiB0byBpdCBhbHNvCisJICovCisJcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKAorCQkJaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKSB7CisJCUNvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPiBjb250YWluZXJBbm5vdGF0aW9uID0gCisJCQkJZ2V0Q29udGFpbmVyQW5ub3RhdGlvbihjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7CisJCWlmIChjb250YWluZXJBbm5vdGF0aW9uICE9IG51bGwpIHsKKwkJCS8vIGlnbm9yZSBhbnkgc3RhbmQtYWxvbmUgbmVzdGFibGUgYW5ub3RhdGlvbnMgYW5kIGp1c3QgYWRkIHRvIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbgorCQkJcmV0dXJuIEFubm90YXRpb25Db250YWluZXJUb29scy5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4LCBjb250YWluZXJBbm5vdGF0aW9uKTsKKwkJfQorCQlOZXN0YWJsZUFubm90YXRpb24gc3RhbmRBbG9uZUFubm90YXRpb24gPSAKKwkJCQlnZXROZXN0YWJsZUFubm90YXRpb24obmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7CisJCWlmIChzdGFuZEFsb25lQW5ub3RhdGlvbiA9PSBudWxsKSB7CisJCQkvLyBhZGQgYSBzdGFuZC1hbG9uZSBuZXN0YWJsZSBhbm5vdGF0aW9uIHNpbmNlIG5laXRoZXIgdGhlIG5lc3RhYmxlIG5vciB0aGUgY29udGFpbmVyIGV4aXN0CisJCQlyZXR1cm4gKE5lc3RhYmxlQW5ub3RhdGlvbikgdGhpcy5hZGRBbm5vdGF0aW9uKG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOworCQl9CisJCS8vIG1vdmUgdGhlIHN0YW5kLWFsb25lIG5lc3RhYmxlIGFubm90YXRpb24gdG8gYSBjb250YWluZXIgYW5kIGFkZCBhbm90aGVyIG5lc3RhYmxlCisJCXJldHVybiB0aGlzLmFkZFNlY29uZE5lc3RlZEFubm90YXRpb24oaW5kZXgsIGNvbnRhaW5lckFubm90YXRpb25OYW1lLCBzdGFuZEFsb25lQW5ub3RhdGlvbik7CisJfQorCisJLyoqCisJICogIm1vdmUiIHRoZSBleGlzdGluZyBuZXN0YWJsZSBhbm5vdGF0aW9uIHRvIGEgbmV3IGNvbnRhaW5lciBhbm5vdGF0aW9uIGFuZAorCSAqIGFkZCBhIG5ldyBuZXN0YWJsZSBhbm5vdGF0aW9uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggKHdoaWNoIHNob3VsZCBiZSAwIG9yIDEpCisJICogCisJICogTkI6IHdlIG1ha2UgYWxsIHRoZSBuZWNlc3NhcnkgY2hhbmdlcyB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHRoZQorCSAqIEphdmEgc291cmNlIGNvZGUgKmJlZm9yZSogd2UgZmlyZSBhbnkgZXZlbnRzOyBzbyB0aGF0IGV2ZXJ5dGhpbmcgaXMgaW4KKwkgKiBwbGFjZSB3aGVuIHRoZSBjb250ZXh0IG1vZGVsIGdldHMgYW4gInVwZGF0ZSIgYW5kIGxvb2tzIGF0IHRoZSByZXNvdXJjZQorCSAqIG1vZGVsIHRvIGRldGVybWluZSB3aGF0IGhhcyBjaGFuZ2VkCisJICovCisJcHJpdmF0ZSBOZXN0YWJsZUFubm90YXRpb24gYWRkU2Vjb25kTmVzdGVkQW5ub3RhdGlvbigKKwkJCWludCBpbmRleCwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lLCBOZXN0YWJsZUFubm90YXRpb24gc3RhbmRBbG9uZUFubm90YXRpb24pIHsKKwkJQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZUFubm90YXRpb24+IGNvbnRhaW5lckFubm90YXRpb24gPSAKKwkJCQlidWlsZENvbnRhaW5lckFubm90YXRpb24oY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOworCQl0aGlzLmFubm90YXRpb25zLmFkZChjb250YWluZXJBbm5vdGF0aW9uKTsKKwkJY29udGFpbmVyQW5ub3RhdGlvbi5uZXdBbm5vdGF0aW9uKCk7CisJCQorCQlOZXN0YWJsZUFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbjAgPSBjb250YWluZXJBbm5vdGF0aW9uLmFkZE5lc3RlZEFubm90YXRpb25JbnRlcm5hbCgpOworCQluZXN0ZWRBbm5vdGF0aW9uMC5uZXdBbm5vdGF0aW9uKCk7CisJCU5lc3RhYmxlQW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uMSA9IGNvbnRhaW5lckFubm90YXRpb24uYWRkTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKCk7CisJCW5lc3RlZEFubm90YXRpb24xLm5ld0Fubm90YXRpb24oKTsKKwkJdGhpcy5yZW1vdmVBbm5vdGF0aW9uKHN0YW5kQWxvbmVBbm5vdGF0aW9uKTsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKEFOTk9UQVRJT05TX0NPTExFQ1RJT04sIGNvbnRhaW5lckFubm90YXRpb24pOworCQkKKwkJaWYgKGluZGV4ID09IDApIHsKKwkJCS8vIGFkZGluZyBuZXcgYW5ub3RhdGlvbiBhdCAwLCBzbyBzdGFuZC1hbG9uZSBpcyAiY29waWVkIiB0byBzbG90IDEKKwkJCW5lc3RlZEFubm90YXRpb24xLmluaXRpYWxpemVGcm9tKHN0YW5kQWxvbmVBbm5vdGF0aW9uKTsKKwkJfSBlbHNlIHsKKwkJCS8vIGFkZGluZyBuZXcgYW5ub3RhdGlvbiBhdCAxLCBzbyBzdGFuZC1hbG9uZSBpcyAiY29waWVkIiB0byBzbG90IDAKKwkJCW5lc3RlZEFubm90YXRpb24wLmluaXRpYWxpemVGcm9tKHN0YW5kQWxvbmVBbm5vdGF0aW9uKTsKKwkJfQorCQkKKwkJcmV0dXJuIChpbmRleCA9PSAwKSA/IG5lc3RlZEFubm90YXRpb24wIDogbmVzdGVkQW5ub3RhdGlvbjE7CisJfQorCQorCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKAorCQkJaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgeworCQltb3ZlQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGdldENvbnRhaW5lckFubm90YXRpb24oY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIG1vdmVBbm5vdGF0aW9uKAorCQkJaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIAorCQkJQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZUFubm90YXRpb24+IGNvbnRhaW5lckFubm90YXRpb24pIHsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLm1vdmVOZXN0ZWRBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgY29udGFpbmVyQW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7CisJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKKwkJCXRoaXMucmVtb3ZlQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKKwkJdGhpcy5hbm5vdGF0aW9ucy5yZW1vdmUoYW5ub3RhdGlvbik7CisJCWFubm90YXRpb24ucmVtb3ZlQW5ub3RhdGlvbigpOworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChBTk5PVEFUSU9OU19DT0xMRUNUSU9OLCBhbm5vdGF0aW9uKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigKKwkJCWludCBpbmRleCwgU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgeworCQlDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQW5ub3RhdGlvbj4gY29udGFpbmVyQW5ub3RhdGlvbiA9IAorCQkJCWdldENvbnRhaW5lckFubm90YXRpb24oY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOworCQlpZiAoY29udGFpbmVyQW5ub3RhdGlvbiA9PSBudWxsKSB7ICAvLyBhc3N1bWUgdGhlIGluZGV4IGlzIDAKKwkJCXJlbW92ZUFubm90YXRpb24oZ2V0QW5ub3RhdGlvbihuZXN0YWJsZUFubm90YXRpb25OYW1lKSk7CisJCX0gCisJCWVsc2UgeworCQkJcmVtb3ZlQW5ub3RhdGlvbihpbmRleCwgY29udGFpbmVyQW5ub3RhdGlvbik7CisJCX0KKwl9CisJCisJLyoqCisJICogYWZ0ZXIgd2UgcmVtb3ZlIHRoZSBuZXN0ZWQgYW5ub3RhdGlvbiwgY2hlY2sgdG8gc2VlIHdoZXRoZXIgd2UgbmVlZCB0bworCSAqIGVpdGhlciByZW1vdmUgdGhlIGNvbnRhaW5lciAoaWYgaXQgaXMgZW1wdHkpIG9yIGNvbnZlcnQgdGhlIGxhc3QgbmVzdGVkCisJICogYW5ub3RhdGlvbiB0byBhIHN0YW5kLWFsb25lIGFubm90YXRpb24KKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigKKwkJCWludCBpbmRleCwgQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZUFubm90YXRpb24+IGNvbnRhaW5lckFubm90YXRpb24pIHsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLnJlbW92ZU5lc3RlZEFubm90YXRpb24oaW5kZXgsIGNvbnRhaW5lckFubm90YXRpb24pOworCQlzd2l0Y2ggKGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbnNTaXplKCkpIHsKKwkJCWNhc2UgMDoKKwkJCQl0aGlzLnJlbW92ZUFubm90YXRpb24oY29udGFpbmVyQW5ub3RhdGlvbik7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJdGhpcy5jb252ZXJ0TGFzdE5lc3RlZEFubm90YXRpb24oY29udGFpbmVyQW5ub3RhdGlvbik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJfQorCisJLyoqCisJICogY29udmVydCB0aGUgbGFzdCBuZXN0ZWQgYW5ub3RhdGlvbiBpbiB0aGUgY29udGFpbmVyIHRvIGEgc3RhbmQtYWxvbmUKKwkgKiBhbm5vdGF0aW9uCisJICogCisJICogTkI6IHdlIG1ha2UgYWxsIHRoZSBuZWNlc3NhcnkgY2hhbmdlcyB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHRoZQorCSAqIEphdmEgc291cmNlIGNvZGUgKmJlZm9yZSogd2UgZmlyZSBhbnkgZXZlbnRzOyBzbyB0aGF0IGV2ZXJ5dGhpbmcgaXMgaW4KKwkgKiBwbGFjZSB3aGVuIHRoZSBjb250ZXh0IG1vZGVsIGdldHMgYW4gInVwZGF0ZSIgYW5kIGxvb2tzIGF0IHRoZSByZXNvdXJjZQorCSAqIG1vZGVsIHRvIGRldGVybWluZSB3aGF0IGhhcyBjaGFuZ2VkCisJICovCisJcHJpdmF0ZSB2b2lkIGNvbnZlcnRMYXN0TmVzdGVkQW5ub3RhdGlvbigKKwkJCUNvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPiBjb250YWluZXJBbm5vdGF0aW9uKSB7CisJCU5lc3RhYmxlQW5ub3RhdGlvbiBsYXN0TmVzdGVkQW5ub3RhdGlvbiA9IGNvbnRhaW5lckFubm90YXRpb24ubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisJCWFubm90YXRpb25zLnJlbW92ZShjb250YWluZXJBbm5vdGF0aW9uKTsKKwkJY29udGFpbmVyQW5ub3RhdGlvbi5yZW1vdmVBbm5vdGF0aW9uKCk7CisJCQorCQlOZXN0YWJsZUFubm90YXRpb24gc3RhbmRBbG9uZUFubm90YXRpb24gPSAKKwkJCQlidWlsZE5lc3RhYmxlQW5ub3RhdGlvbihsYXN0TmVzdGVkQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKKwkJdGhpcy5hbm5vdGF0aW9ucy5hZGQoc3RhbmRBbG9uZUFubm90YXRpb24pOworCQlzdGFuZEFsb25lQW5ub3RhdGlvbi5uZXdBbm5vdGF0aW9uKCk7CisJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKEFOTk9UQVRJT05TX0NPTExFQ1RJT04sIGNvbnRhaW5lckFubm90YXRpb24pOworCQl0aGlzLmZpcmVJdGVtQWRkZWQoQU5OT1RBVElPTlNfQ09MTEVDVElPTiwgc3RhbmRBbG9uZUFubm90YXRpb24pOworCQlzdGFuZEFsb25lQW5ub3RhdGlvbi5pbml0aWFsaXplRnJvbShsYXN0TmVzdGVkQW5ub3RhdGlvbik7CisJfQorCQorCXB1YmxpYyBBbm5vdGF0aW9uIHNldFByaW1hcnlBbm5vdGF0aW9uKAorCQkJU3RyaW5nIHByaW1hcnlBbm5vdGF0aW9uTmFtZSwgU3RyaW5nW10gc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcykgeworCQlBbm5vdGF0aW9uIG5ld1ByaW1hcnlBbm5vdGF0aW9uID0gbnVsbDsKKwkJU3RyaW5nW10gYW5ub3RhdGlvbk5hbWVzVG9LZWVwID0gc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lczsKKwkJaWYgKHByaW1hcnlBbm5vdGF0aW9uTmFtZSAhPSBudWxsKSB7CisJCQlhbm5vdGF0aW9uTmFtZXNUb0tlZXAgPSBBcnJheVRvb2xzLmFkZChzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzLCBwcmltYXJ5QW5ub3RhdGlvbk5hbWUpOworCQl9CisJCWZvciAoQW5ub3RhdGlvbiBleGlzdGluZ0Fubm90YXRpb24gOiBnZXRBbm5vdGF0aW9ucygpKSB7CisJCQlpZiAoISBBcnJheVRvb2xzLmNvbnRhaW5zKGFubm90YXRpb25OYW1lc1RvS2VlcCwgZXhpc3RpbmdBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKSB7CisJCQkJdGhpcy5hbm5vdGF0aW9ucy5yZW1vdmUoZXhpc3RpbmdBbm5vdGF0aW9uKTsKKwkJCQlleGlzdGluZ0Fubm90YXRpb24ucmVtb3ZlQW5ub3RhdGlvbigpOworCQkJfQorCQl9CisJCWlmIChwcmltYXJ5QW5ub3RhdGlvbk5hbWUgIT0gbnVsbCAmJiBnZXRBbm5vdGF0aW9uKHByaW1hcnlBbm5vdGF0aW9uTmFtZSkgPT0gbnVsbCkgeworCQkJbmV3UHJpbWFyeUFubm90YXRpb24gPSBidWlsZEFubm90YXRpb24ocHJpbWFyeUFubm90YXRpb25OYW1lKTsKKwkJCXRoaXMuYW5ub3RhdGlvbnMuYWRkKG5ld1ByaW1hcnlBbm5vdGF0aW9uKTsKKwkJCW5ld1ByaW1hcnlBbm5vdGF0aW9uLm5ld0Fubm90YXRpb24oKTsKKwkJfQorCQkvLyBmaXJlIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50IGFmdGVyIGFsbCBhbm5vdGF0aW9uIGNoYW5nZXMgYXJlIGRvbmUKKwkJZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKEFOTk9UQVRJT05TX0NPTExFQ1RJT04sIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24odGhpcy5hbm5vdGF0aW9ucykpOworCQlyZXR1cm4gbmV3UHJpbWFyeUFubm90YXRpb247CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBhbm5vdGF0aW9uSXNWYWxpZChTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnZhbGlkQW5ub3RhdGlvbk5hbWVzKCksIGFubm90YXRpb25OYW1lKTsKKwl9CisJCisJYWJzdHJhY3QgSXRlcmF0b3I8U3RyaW5nPiB2YWxpZEFubm90YXRpb25OYW1lcygpOworCQorCWFic3RyYWN0IEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKFN0cmluZyBtYXBwaW5nQW5ub3RhdGlvbk5hbWUpOworCQorCWFic3RyYWN0IEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOworCQorCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcml2YXRlIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBbm5vdGF0aW9uPiBidWlsZENvbnRhaW5lckFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7CisJCXJldHVybiAoQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZUFubm90YXRpb24+KSBidWlsZEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOworCX0KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcml2YXRlIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZE5lc3RhYmxlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJcmV0dXJuIChOZXN0YWJsZUFubm90YXRpb24pIGJ1aWxkQW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogc2ltcGxlIHN0YXRlICoqKioqKioqKioKKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5wZXJzaXN0YWJsZTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHNldFBlcnNpc3RhYmxlKGJvb2xlYW4gcGVyc2lzdGFibGUpIHsKKwkJYm9vbGVhbiBvbGQgPSB0aGlzLnBlcnNpc3RhYmxlOworCQl0aGlzLnBlcnNpc3RhYmxlID0gcGVyc2lzdGFibGU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQRVJTSVNUQUJMRV9QUk9QRVJUWSwgb2xkLCBwZXJzaXN0YWJsZSk7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBidWlsZFBlcnNpc3RhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLm1lbWJlci5pc1BlcnNpc3RhYmxlKGFzdFJvb3QpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRlZCgpIHsKKwkJcmV0dXJuICEgdGhpcy5hbm5vdGF0aW9ucy5pc0VtcHR5KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzRm9yKFN0cmluZyBtZW1iZXJOYW1lLCBpbnQgb2NjdXJyZW5jZSkgeworCQlyZXR1cm4gdGhpcy5tZW1iZXIubWF0Y2hlcyhtZW1iZXJOYW1lLCBvY2N1cnJlbmNlKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZnVsbFRleHRSYW5nZShhc3RSb290KTsKKwl9CisJCisJcHJpdmF0ZSBUZXh0UmFuZ2UgZnVsbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5idWlsZFRleHRSYW5nZSh0aGlzLm1lbWJlci5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMubWVtYmVyLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogdXBkYXRlICoqKioqKioqKioKKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy51cGRhdGVBbm5vdGF0aW9ucyhhc3RSb290KTsKKwkJdGhpcy5zZXRQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkUGVyc2lzdGFibGUoYXN0Um9vdCkpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdXBkYXRlQW5ub3RhdGlvbnMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSGFzaFNldDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uc1RvUmVtb3ZlID0gCisJCQkJbmV3IEhhc2hTZXQ8QW5ub3RhdGlvbj4odGhpcy5hbm5vdGF0aW9ucyk7CisJCQorCQl0aGlzLm1lbWJlci5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkuYWNjZXB0KAorCQkJCXRoaXMuYnVpbGRVcGRhdGVBbm5vdGF0aW9uVmlzaXRvcihhc3RSb290LCBhbm5vdGF0aW9uc1RvUmVtb3ZlKSk7CisJCQorCQlmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zVG9SZW1vdmUpIHsKKwkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKGFubm90YXRpb24sIHRoaXMuYW5ub3RhdGlvbnMsIEFOTk9UQVRJT05TX0NPTExFQ1RJT04pOworCQl9CisJfQorCQorCXByaXZhdGUgQVNUVmlzaXRvciBidWlsZFVwZGF0ZUFubm90YXRpb25WaXNpdG9yKAorCQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QsIFNldDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uc1RvUmVtb3ZlKSB7CisJCXJldHVybiBuZXcgVXBkYXRlQW5ub3RhdGlvblZpc2l0b3IoCisJCQkJYXN0Um9vdCwgdGhpcy5tZW1iZXIuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpLCBhbm5vdGF0aW9uc1RvUmVtb3ZlKTsKKwl9CisJCisJdm9pZCBhZGRPclVwZGF0ZUFubm90YXRpb24oCisJCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBub2RlLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCwgCisJCQlTZXQ8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnNUb1JlbW92ZSkgeworCQlTdHJpbmcgamR0QW5ub3RhdGlvbk5hbWUgPSBKRFRUb29scy5yZXNvbHZlQW5ub3RhdGlvbihub2RlKTsKKwkJaWYgKGpkdEFubm90YXRpb25OYW1lID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAodGhpcy5hbm5vdGF0aW9uSXNWYWxpZChqZHRBbm5vdGF0aW9uTmFtZSkpIHsKKwkJCXRoaXMuYWRkT3JVcGRhdGVBbm5vdGF0aW9uKGpkdEFubm90YXRpb25OYW1lLCBhc3RSb290LCBhbm5vdGF0aW9uc1RvUmVtb3ZlKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgYWRkT3JVcGRhdGVBbm5vdGF0aW9uKAorCQkJU3RyaW5nIGpkdEFubm90YXRpb25OYW1lLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCwgCisJCQlTZXQ8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnNUb1JlbW92ZSkgeworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLnNlbGVjdEFubm90YXRpb25OYW1lZChhbm5vdGF0aW9uc1RvUmVtb3ZlLCBqZHRBbm5vdGF0aW9uTmFtZSk7CisJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKKwkJCWFubm90YXRpb24udXBkYXRlKGFzdFJvb3QpOworCQkJYW5ub3RhdGlvbnNUb1JlbW92ZS5yZW1vdmUoYW5ub3RhdGlvbik7CisJCX0KKwkJZWxzZSB7CisJCQlhbm5vdGF0aW9uID0gdGhpcy5idWlsZEFubm90YXRpb24oamR0QW5ub3RhdGlvbk5hbWUpOworCQkJYW5ub3RhdGlvbi5pbml0aWFsaXplKGFzdFJvb3QpOworCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKGFubm90YXRpb24sIHRoaXMuYW5ub3RhdGlvbnMsIEFOTk9UQVRJT05TX0NPTExFQ1RJT04pOworCQl9CisJfQorCQorCQorCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0UGVyc2lzdGFibGUodGhpcy5idWlsZFBlcnNpc3RhYmxlKGFzdFJvb3QpKTsKKwl9CisJCisJcHJpdmF0ZSBBbm5vdGF0aW9uIHNlbGVjdEFubm90YXRpb25OYW1lZChJdGVyYWJsZTxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucywgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7CisJCWZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKKwkJCWlmIChhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKGFubm90YXRpb25OYW1lKSkgeworCQkJCXJldHVybiBhbm5vdGF0aW9uOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcml2YXRlIFRleHRSYW5nZSBidWlsZFRleHRSYW5nZShBU1ROb2RlIGFzdE5vZGUpIHsKKwkJcmV0dXJuIChhc3ROb2RlID09IG51bGwpID8gbnVsbCA6IG5ldyBBU1ROb2RlVGV4dFJhbmdlKGFzdE5vZGUpOworCX0KKwkKKwkvKioKKwkgKiBjb252ZW5pZW5jZSBtZXRob2QKKwkgKi8KKwk8VCBleHRlbmRzIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI+IEl0ZXJhdG9yPFQ+IHBlcnNpc3RhYmxlTWVtYmVycyhJdGVyYXRvcjxUPiBtZW1iZXJzKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8VCwgVD4obWVtYmVycykgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoVCBtKSB7CisJCQkJcmV0dXJuIG0uaXNQZXJzaXN0YWJsZSgpOworCQkJfQorCQl9OworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIEFTVCB2aXNpdG9ycyAqKioqKioqKioqCisJCisJLyoqCisJICogYW5ub3RhdGlvbiB2aXNpdG9yCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBbm5vdGF0aW9uVmlzaXRvciAKKwkJCWV4dGVuZHMgQVNUVmlzaXRvciAKKwl7CisJCXByb3RlY3RlZCBmaW5hbCBDb21waWxhdGlvblVuaXQgYXN0Um9vdDsKKwkJcHJvdGVjdGVkIGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb247CisJCQorCQlwcm90ZWN0ZWQgQW5ub3RhdGlvblZpc2l0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QsIEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24pIHsKKwkJCXN1cGVyKCk7CisJCQl0aGlzLmFzdFJvb3QgPSBhc3RSb290OworCQkJdGhpcy5ib2R5RGVjbGFyYXRpb24gPSBib2R5RGVjbGFyYXRpb247CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5vZGUpIHsKKwkJCXJldHVybiB2aXNpdF8obm9kZSk7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChOb3JtYWxBbm5vdGF0aW9uIG5vZGUpIHsKKwkJCXJldHVybiB2aXNpdF8obm9kZSk7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNYXJrZXJBbm5vdGF0aW9uIG5vZGUpIHsKKwkJCXJldHVybiB2aXNpdF8obm9kZSk7CisJCX0KKwkJCisJCXByb3RlY3RlZCBib29sZWFuIHZpc2l0XyhvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBub2RlKSB7CisJCQkvLyBpZ25vcmUgYW5ub3RhdGlvbnMgZm9yIGNoaWxkIG1lbWJlcnMsIG9ubHkgdGhpcyBtZW1iZXIKKwkJCWlmIChub2RlLmdldFBhcmVudCgpID09IHRoaXMuYm9keURlY2xhcmF0aW9uKSB7CisJCQkJdGhpcy52aXNpdENoaWxkQW5ub3RhdGlvbihub2RlKTsKKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmlzaXRDaGlsZEFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gbm9kZSk7CisJfQorCQorCQorCS8qKgorCSAqIGluaXRpYWwgYW5ub3RhdGlvbiB2aXNpdG9yCisJICovCisJcHJvdGVjdGVkIGNsYXNzIEluaXRpYWxBbm5vdGF0aW9uVmlzaXRvciAKKwkJCWV4dGVuZHMgQW5ub3RhdGlvblZpc2l0b3IgCisJeworCQlwcm90ZWN0ZWQgSW5pdGlhbEFubm90YXRpb25WaXNpdG9yKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBCb2R5RGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uKSB7CisJCQlzdXBlcihhc3RSb290LCBib2R5RGVjbGFyYXRpb24pOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgdmlzaXRDaGlsZEFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gbm9kZSkgeworCQkJU291cmNlUGVyc2lzdGVudE1lbWJlci50aGlzLmFkZEluaXRpYWxBbm5vdGF0aW9uKG5vZGUsIHRoaXMuYXN0Um9vdCk7CisJCX0KKwl9CisJCisJCisJLyoqCisJICogdXBkYXRlIGFubm90YXRpb24gdmlzaXRvcgorCSAqLworCXByb3RlY3RlZCBjbGFzcyBVcGRhdGVBbm5vdGF0aW9uVmlzaXRvciAKKwkJCWV4dGVuZHMgQW5ub3RhdGlvblZpc2l0b3IgCisJeworCQlwcm90ZWN0ZWQgZmluYWwgU2V0PEFubm90YXRpb24+IGFubm90YXRpb25zVG9SZW1vdmU7CisJCQorCQlwcm90ZWN0ZWQgVXBkYXRlQW5ub3RhdGlvblZpc2l0b3IoCisJCQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QsIEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24sIAorCQkJCVNldDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uc1RvUmVtb3ZlKSB7CisJCQlzdXBlcihhc3RSb290LCBib2R5RGVjbGFyYXRpb24pOworCQkJdGhpcy5hbm5vdGF0aW9uc1RvUmVtb3ZlID0gYW5ub3RhdGlvbnNUb1JlbW92ZTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIHZpc2l0Q2hpbGRBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIG5vZGUpIHsKKwkJCVNvdXJjZVBlcnNpc3RlbnRNZW1iZXIudGhpcy5hZGRPclVwZGF0ZUFubm90YXRpb24oCisJCQkJCW5vZGUsIHRoaXMuYXN0Um9vdCwgdGhpcy5hbm5vdGF0aW9uc1RvUmVtb3ZlKTsKKwkJfQkJCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVBlcnNpc3RlbnRUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlUGVyc2lzdGVudFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmIzOTlmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVBlcnNpc3RlbnRUeXBlLmphdmEKQEAgLTAsMCArMSw2MDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KUFRUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuTWV0aG9kU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5JbnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyZWVJdGVyYXRvcjsKKworLyoqCisgKiBKYXZhIHNvdXJjZSBwZXJzaXN0ZW50IHR5cGUKKyAqLworZmluYWwgY2xhc3MgU291cmNlUGVyc2lzdGVudFR5cGUKKwlleHRlbmRzIFNvdXJjZVBlcnNpc3RlbnRNZW1iZXI8VHlwZT4KKwlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlCit7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworCXByaXZhdGUgU3RyaW5nIHF1YWxpZmllZE5hbWU7CisKKwlwcml2YXRlIFN0cmluZyBzdXBlcmNsYXNzUXVhbGlmaWVkTmFtZTsKKworCXByaXZhdGUgYm9vbGVhbiBhYnN0cmFjdF87ICAvLyAnYWJzdHJhY3QnIGlzIGEgcmVzZXJ2ZWQgd29yZAorCisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IHR5cGVzOworCisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gZmllbGRzOworCisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gbWV0aG9kczsKKworCXByaXZhdGUgQWNjZXNzVHlwZSBhY2Nlc3M7CisKKworCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKKworCS8qKgorCSAqIGJ1aWxkIHRvcC1sZXZlbCBwZXJzaXN0ZW50IHR5cGUKKwkgKi8KKwlzdGF0aWMgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgbmV3SW5zdGFuY2UoCisJCQlKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LAorCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKKwkJCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCVR5cGUgdHlwZSA9IG5ldyBKRFRUeXBlKAorCQkJCXR5cGVEZWNsYXJhdGlvbiwKKwkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0Q29tcGlsYXRpb25Vbml0KCksCisJCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCksCisJCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0gbmV3IFNvdXJjZVBlcnNpc3RlbnRUeXBlKGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwgdHlwZSk7CisJCWpycHQuaW5pdGlhbGl6ZShhc3RSb290KTsKKwkJcmV0dXJuIGpycHQ7CQorCX0KKworCS8qKgorCSAqIGJ1aWxkIG5lc3RlZCBwZXJzaXN0ZW50IHR5cGUKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBuZXdJbnN0YW5jZSgKKwkJCUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQsCisJCQlUeXBlIGRlY2xhcmluZ1R5cGUsCisJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLAorCQkJaW50IG9jY3VycmVuY2UsCisJCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlUeXBlIHR5cGUgPSBuZXcgSkRUVHlwZSgKKwkJCQlkZWNsYXJpbmdUeXBlLAorCQkJCXR5cGVEZWNsYXJhdGlvbiwKKwkJCQlvY2N1cnJlbmNlLAorCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRDb21waWxhdGlvblVuaXQoKSwKKwkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKSwKKwkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQgPSBuZXcgU291cmNlUGVyc2lzdGVudFR5cGUoamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCB0eXBlKTsKKwkJanJwdC5pbml0aWFsaXplKGFzdFJvb3QpOworCQlyZXR1cm4ganJwdDsJCisJfQorCisJcHJpdmF0ZSBTb3VyY2VQZXJzaXN0ZW50VHlwZShKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCBUeXBlIHR5cGUpIHsKKwkJc3VwZXIoamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCB0eXBlKTsKKwkJdGhpcy50eXBlcyA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+KCk7IAorCQl0aGlzLmZpZWxkcyA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKKwkJdGhpcy5tZXRob2RzID0gbmV3IFZlY3RvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKKwkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7CisJCXRoaXMucXVhbGlmaWVkTmFtZSA9IHRoaXMuYnVpbGRRdWFsaWZpZWROYW1lKGFzdFJvb3QpOworCQl0aGlzLnN1cGVyY2xhc3NRdWFsaWZpZWROYW1lID0gdGhpcy5idWlsZFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKGFzdFJvb3QpOworCQl0aGlzLmFic3RyYWN0XyA9IHRoaXMuYnVpbGRBYnN0cmFjdChhc3RSb290KTsKKwkJdGhpcy5pbml0aWFsaXplVHlwZXMoYXN0Um9vdCk7CisJCXRoaXMuaW5pdGlhbGl6ZUZpZWxkcyhhc3RSb290KTsKKwkJdGhpcy5pbml0aWFsaXplTWV0aG9kcyhhc3RSb290KTsKKwkJLy8gbmVlZCB0byB3YWl0IHVudGlsIGV2ZXJ5dGhpbmcgaXMgYnVpbHQgdG8gY2FsY3VsYXRlICdhY2Nlc3MnCisJCXRoaXMuYWNjZXNzID0gdGhpcy5idWlsZEFjY2VzcygpOworCX0KKworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJVHlwZURlY2xhcmF0aW9uW10gdHlwZURlY2xhcmF0aW9ucyA9IHRoaXMubWVtYmVyLmdldFR5cGVzKGFzdFJvb3QpOworCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAodHlwZURlY2xhcmF0aW9ucy5sZW5ndGgpOworCQlmb3IgKFR5cGVEZWNsYXJhdGlvbiB0ZCA6IHR5cGVEZWNsYXJhdGlvbnMpIHsKKwkJCVN0cmluZyB0ZE5hbWUgPSB0ZC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7CisJCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudCh0ZE5hbWUpOworCQkJdGhpcy50eXBlcy5hZGQodGhpcy5idWlsZFR5cGUodGQsIG9jY3VycmVuY2UsIGFzdFJvb3QpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRmllbGRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZERlY2xhcmF0aW9ucyA9IHRoaXMubWVtYmVyLmdldEZpZWxkcyhhc3RSb290KTsKKwkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKGZpZWxkRGVjbGFyYXRpb25zLmxlbmd0aCk7CisJCWZvciAoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uIDogZmllbGREZWNsYXJhdGlvbnMpIHsKKwkJCWZvciAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50IDogZnJhZ21lbnRzKGZpZWxkRGVjbGFyYXRpb24pKSB7CisJCQkJU3RyaW5nIGZpZWxkTmFtZSA9IGZyYWdtZW50LmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKKwkJCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudChmaWVsZE5hbWUpOworCQkJCXRoaXMuZmllbGRzLmFkZCh0aGlzLmJ1aWxkRmllbGQoZmllbGROYW1lLCBvY2N1cnJlbmNlLCBhc3RSb290KSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZU1ldGhvZHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJTWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2REZWNsYXJhdGlvbnMgPSB0aGlzLm1lbWJlci5nZXRNZXRob2RzKGFzdFJvb3QpOworCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAobWV0aG9kRGVjbGFyYXRpb25zLmxlbmd0aCk7CisJCWZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2REZWNsYXJhdGlvbnMpIHsKKwkJCU1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUgPSBKRFRUb29scy5idWlsZE1ldGhvZFNpZ25hdHVyZShtZXRob2REZWNsYXJhdGlvbik7CisJCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudChzaWduYXR1cmUpOworCQkJdGhpcy5tZXRob2RzLmFkZCh0aGlzLmJ1aWxkTWV0aG9kKHNpZ25hdHVyZSwgb2NjdXJyZW5jZSwgYXN0Um9vdCkpOworCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIEFic3RyYWN0SmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJSXRlcmF0b3I8U3RyaW5nPiB2YWxpZEFubm90YXRpb25OYW1lcygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkudHlwZUFubm90YXRpb25OYW1lcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihTdHJpbmcgbWFwcGluZ0Fubm90YXRpb25OYW1lKSB7CisJCXJldHVybiB0aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLgorCQkJCWJ1aWxkVHlwZUFubm90YXRpb24odGhpcywgdGhpcy5tZW1iZXIsIG1hcHBpbmdBbm5vdGF0aW9uTmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCUFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuCisJCQkJYnVpbGROdWxsVHlwZUFubm90YXRpb24odGhpcywgYW5ub3RhdGlvbk5hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIucmVzb2x2ZVR5cGVzKGFzdFJvb3QpOworCQkKKwkJdGhpcy5zZXRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSh0aGlzLmJ1aWxkU3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoYXN0Um9vdCkpOworCQkKKwkJZm9yIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGZpZWxkIDogdGhpcy5nZXRGaWVsZHMoKSkgeworCQkJZmllbGQucmVzb2x2ZVR5cGVzKGFzdFJvb3QpOworCQl9CisJCQorCQkvLyBhIG5ldyB0eXBlIGNhbiB0cmlnZ2VyIGEgbWV0aG9kIHBhcmFtZXRlciB0eXBlIHRvIGJlIGEgcmVzb2x2ZWQsCisJCS8vIGZ1bGx5LXF1YWxpZmllZCBuYW1lLCBzbyB3ZSBuZWVkIHRvIHJlYnVpbGQgb3VyIGxpc3Qgb2YgbWV0aG9kczoKKwkJLy8gICAgICJzZXRGb28oRm9vKSIgaXMgbm90IHRoZSBzYW1lIGFzICJzZXRGb28oY29tLmJhci5Gb28pIgorCQkvLyBhbmQsIHZpY2UtdmVyc2EsIGEgcmVtb3ZlZCB0eXBlIGNhbiAidW5yZXNvbHZlIiBhIHBhcmFtZXRlciB0eXBlCisJCXRoaXMudXBkYXRlTWV0aG9kcyhhc3RSb290KTsKKwkJCisJCWZvciAoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBtZXRob2QgOiB0aGlzLmdldE1ldGhvZHMoKSkgeworCQkJbWV0aG9kLnJlc29sdmVUeXBlcyhhc3RSb290KTsKKwkJfQorCQlmb3IgKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGUgOiB0aGlzLmdldFR5cGVzKCkpIHsKKwkJCXR5cGUucmVzb2x2ZVR5cGVzKGFzdFJvb3QpOworCQl9CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCQorCQorCS8vICoqKioqKioqIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGltcGxlbWVudGF0aW9uICoqKioqKioqCisKKwkvLyAqKioqKiBuYW1lCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworCXByaXZhdGUgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IHRoaXMubWVtYmVyLmdldEJpbmRpbmcoYXN0Um9vdCk7CisJCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IG51bGwgOiBiaW5kaW5nLmdldE5hbWUoKTsKKwl9CisKKwkvLyAqKioqKiBxdWFsaWZpZWQgbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMucXVhbGlmaWVkTmFtZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0UXVhbGlmaWVkTmFtZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5xdWFsaWZpZWROYW1lOworCQl0aGlzLnF1YWxpZmllZE5hbWUgPSBxdWFsaWZpZWROYW1lOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVBTElGSUVEX05BTUVfUFJPUEVSVFksIG9sZCwgcXVhbGlmaWVkTmFtZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRRdWFsaWZpZWROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUlUeXBlQmluZGluZyBiaW5kaW5nID0gdGhpcy5tZW1iZXIuZ2V0QmluZGluZyhhc3RSb290KTsKKwkJcmV0dXJuIChiaW5kaW5nID09IG51bGwpID8gbnVsbCA6IGJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpOworCX0KKworCS8vICoqKioqIHN1cGVyY2xhc3MgcXVhbGlmaWVkIG5hbWUKKwlwdWJsaWMgU3RyaW5nIGdldFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5zdXBlcmNsYXNzUXVhbGlmaWVkTmFtZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoU3RyaW5nIHN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnN1cGVyY2xhc3NRdWFsaWZpZWROYW1lOworCQl0aGlzLnN1cGVyY2xhc3NRdWFsaWZpZWROYW1lID0gc3VwZXJjbGFzc1F1YWxpZmllZE5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTVVBFUkNMQVNTX1FVQUxJRklFRF9OQU1FX1BST1BFUlRZLCBvbGQsIHN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUlUeXBlQmluZGluZyBiaW5kaW5nID0gdGhpcy5tZW1iZXIuZ2V0QmluZGluZyhhc3RSb290KTsKKwkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJSVR5cGVCaW5kaW5nIHN1cGVyY2xhc3MgPSBiaW5kaW5nLmdldFN1cGVyY2xhc3MoKTsKKwkJcmV0dXJuIChzdXBlcmNsYXNzID09IG51bGwpID8gbnVsbCA6IHN1cGVyY2xhc3MuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOworCX0KKworCS8vICoqKioqIGFic3RyYWN0CisJcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpIHsKKwkJcmV0dXJuIHRoaXMuYWJzdHJhY3RfOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRBYnN0cmFjdChib29sZWFuIGFic3RyYWN0XykgeworCQlib29sZWFuIG9sZCA9IHRoaXMuYWJzdHJhY3RfOworCQl0aGlzLmFic3RyYWN0XyA9IGFic3RyYWN0XzsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEFCU1RSQUNUX1BST1BFUlRZLCBvbGQsIGFic3RyYWN0Xyk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGJ1aWxkQWJzdHJhY3QoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLm1lbWJlci5nZXRCaW5kaW5nKGFzdFJvb3QpOworCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IE1vZGlmaWVyLmlzQWJzdHJhY3QoYmluZGluZy5nZXRNb2RpZmllcnMoKSk7CQorCX0KKworCS8vICoqKioqIGFjY2VzcworCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMuYWNjZXNzOworCX0KKworCS8vIFRPRE8KKwkvL3NlZW1zIHdlIGNvdWxkIGhhdmUgYSBwdWJsaWMgY2hhbmdlQWNjZXNzKCkgYXBpIHdoaWNoIHdvdWxkCisJLy9tb3ZlIGFsbCBhbm5vdGF0aW9ucyBmcm9tIGZpZWxkcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIG1ldGhvZHMgb3IgdmljZSB2ZXJzYQorCS8vdGhvdWdoIG9mIGNvdXJzZSBpdCdzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiB0aGF0IHNpbmNlIHdoYXQgaWYgdGhlCisJLy9jb3JyZXNwb25kaW5nIGZpZWxkL21ldGhvZCBkb2VzIG5vdCBleGlzdD8KKwkvL21ha2luZyB0aGlzIGludGVybmFsIHNpbmNlIGl0IHNob3VsZCBvbmx5IGJlIHNldCBiYXNlZCBvbiBjaGFuZ2VzIGluIHRoZSBzb3VyY2UsIHRoZQorCS8vY29udGV4dCBtb2RlbCBzaG91bGQgbm90IG5lZWQgdG8gc2V0IHRoaXMKKwlwcml2YXRlIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgYWNjZXNzKSB7CisJCUFjY2Vzc1R5cGUgb2xkID0gdGhpcy5hY2Nlc3M7CisJCXRoaXMuYWNjZXNzID0gYWNjZXNzOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUNDRVNTX1BST1BFUlRZLCBvbGQsIGFjY2Vzcyk7CisJfQorCisJcHJpdmF0ZSBBY2Nlc3NUeXBlIGJ1aWxkQWNjZXNzKCkgeworCQlyZXR1cm4gSlBUVG9vbHMuYnVpbGRBY2Nlc3ModGhpcyk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzTWFwcGVkKCkgeworCQlmb3IgKEFubm90YXRpb24gZWFjaCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShhbm5vdGF0aW9ucygpKSkgeworCQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucygKKwkJCQkJZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkudHlwZU1hcHBpbmdBbm5vdGF0aW9uTmFtZXMoKSwgCisJCQkJCWVhY2guZ2V0QW5ub3RhdGlvbk5hbWUoKSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIGNoZWNrIG9ubHkgcGVyc2lzdGFibGUgYXR0cmlidXRlcworCSAqLworCXB1YmxpYyBib29sZWFuIGhhc0FueUFubm90YXRlZEF0dHJpYnV0ZXMoKSB7CisJCWZvciAoSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gCisJCQkJCXRoaXMucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJaWYgKHN0cmVhbS5uZXh0KCkuaXNBbm5vdGF0ZWQoKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKworCS8vICoqKioqKioqKiogdHlwZXMgKioqKioqKioqKgorCisJcHVibGljIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiB0eXBlcygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0VHlwZXMoKS5pdGVyYXRvcigpOworCX0KKworCXByaXZhdGUgSXRlcmFibGU8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IGdldFR5cGVzKCkgeworCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPih0aGlzLnR5cGVzKTsgIC8vIHJlYWQtb25seQorCX0KKworCXB1YmxpYyBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gYWxsVHlwZXMoKSB7CisJCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPih0aGlzKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IGNoaWxkcmVuKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGUpIHsKKwkJCQlyZXR1cm4gdHlwZS50eXBlcygpOworCQkJfQorCQl9OworCX0KKworCXB1YmxpYyBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGFibGVUeXBlcygpIHsKKwkJcmV0dXJuIHRoaXMucGVyc2lzdGFibGVNZW1iZXJzKHRoaXMudHlwZXMoKSk7CisJfQorCisJcHJpdmF0ZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRUeXBlKFN0cmluZyB0eXBlTmFtZSwgaW50IG9jY3VycmVuY2UpIHsKKwkJZm9yIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlIDogdGhpcy5nZXRUeXBlcygpKSB7CisJCQlpZiAodHlwZS5pc0Zvcih0eXBlTmFtZSwgb2NjdXJyZW5jZSkpIHsKKwkJCQlyZXR1cm4gdHlwZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkVHlwZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlKSB7CisJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbih0eXBlLCB0aGlzLnR5cGVzLCBUWVBFU19DT0xMRUNUSU9OKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVtb3ZlVHlwZXMoQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gcmVtb3ZlKSB7CisJCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmUsIHRoaXMudHlwZXMsIFRZUEVTX0NPTExFQ1RJT04pOworCX0KKworCisJLy8gKioqKioqKioqKiBmaWVsZHMgKioqKioqKioqKgorCisJcHVibGljIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGZpZWxkcygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKTsKKwl9CisKKwlwcml2YXRlIEl0ZXJhYmxlPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEZpZWxkcygpIHsKKwkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLmZpZWxkcyk7CisJfQorCisJcHVibGljIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHBlcnNpc3RhYmxlRmllbGRzKCkgeworCQlyZXR1cm4gdGhpcy5wZXJzaXN0YWJsZU1lbWJlcnModGhpcy5maWVsZHMoKSk7CisJfQorCQorCXB1YmxpYyBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBwZXJzaXN0YWJsZUZpZWxkc1dpdGhTcGVjaWZpZWRGaWVsZEFjY2VzcygpIHsKKwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLnBlcnNpc3RhYmxlRmllbGRzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUpIHsKKwkJCQlyZXR1cm4gcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkgPT0gQWNjZXNzVHlwZS5GSUVMRDsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZEZpZWxkKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgZmllbGQpIHsKKwkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKGZpZWxkLCB0aGlzLmZpZWxkcywgRklFTERTX0NPTExFQ1RJT04pOworCX0KKworCXByaXZhdGUgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRGaWVsZChTdHJpbmcgZmllbGROYW1lLCBpbnQgb2NjdXJyZW5jZSkgeworCQlmb3IgKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgZmllbGQgOiB0aGlzLmdldEZpZWxkcygpKSB7CisJCQlpZiAoZmllbGQuaXNGb3IoZmllbGROYW1lLCBvY2N1cnJlbmNlKSkgeworCQkJCXJldHVybiBmaWVsZDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVtb3ZlRmllbGRzKENvbGxlY3Rpb248SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcmVtb3ZlKSB7CisJCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmUsIHRoaXMuZmllbGRzLCBGSUVMRFNfQ09MTEVDVElPTik7CisJfQorCisKKwkvLyAqKioqKioqKioqIG1ldGhvZHMgKioqKioqKioqKgorCisJcHVibGljIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG1ldGhvZHMoKSB7CisJCXJldHVybiB0aGlzLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpOworCX0KKworCXByaXZhdGUgSXRlcmFibGU8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0TWV0aG9kcygpIHsKKwkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLm1ldGhvZHMpOworCX0KKworCXB1YmxpYyBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBwZXJzaXN0YWJsZVByb3BlcnRpZXMoKSB7CisJCXJldHVybiB0aGlzLnBlcnNpc3RhYmxlTWVtYmVycyh0aGlzLm1ldGhvZHMoKSk7CisJfQorCQorCXB1YmxpYyBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBwZXJzaXN0YWJsZVByb3BlcnRpZXNXaXRoU3BlY2lmaWVkUHJvcGVydHlBY2Nlc3MoKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5wZXJzaXN0YWJsZVByb3BlcnRpZXMoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSkgeworCQkJCXJldHVybiByZXNvdXJjZUF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSA9PSBBY2Nlc3NUeXBlLlBST1BFUlRZOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRNZXRob2QoTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UpIHsKKwkJZm9yIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIG1ldGhvZCA6IHRoaXMuZ2V0TWV0aG9kcygpKSB7CisJCQlpZiAobWV0aG9kLmlzRm9yKHNpZ25hdHVyZSwgb2NjdXJyZW5jZSkpIHsKKwkJCQlyZXR1cm4gbWV0aG9kOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRNZXRob2QoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBtZXRob2QpIHsKKwkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKG1ldGhvZCwgdGhpcy5tZXRob2RzLCBNRVRIT0RTX0NPTExFQ1RJT04pOworCX0KKworCXByaXZhdGUgdm9pZCByZW1vdmVNZXRob2RzKENvbGxlY3Rpb248SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcmVtb3ZlKSB7CisJCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmUsIHRoaXMubWV0aG9kcywgTUVUSE9EU19DT0xMRUNUSU9OKTsKKwl9CisKKworCS8vICoqKioqKioqKiogYXR0cmlidXRlcyAqKioqKioqKioqCisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+KAorCQkJCXRoaXMucGVyc2lzdGFibGVGaWVsZHMoKSwKKwkJCQl0aGlzLnBlcnNpc3RhYmxlUHJvcGVydGllcygpCisJCQkpOworCX0KKwkKKwlwdWJsaWMgSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcGVyc2lzdGFibGVBdHRyaWJ1dGVzKEFjY2Vzc1R5cGUgc3BlY2lmaWVkQWNjZXNzKSB7CisJCWlmIChzcGVjaWZpZWRBY2Nlc3MgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic3BlY2lmaWVkIGFjY2VzcyBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gKHNwZWNpZmllZEFjY2VzcyA9PSBBY2Nlc3NUeXBlLkZJRUxEKSA/CisJCQkJCXRoaXMucGVyc2lzdGFibGVBdHRyaWJ1dGVzRm9yRmllbGRBY2Nlc3NUeXBlKCkgOgorCQkJCQl0aGlzLnBlcnNpc3RhYmxlQXR0cmlidXRlc0ZvclByb3BlcnR5QWNjZXNzVHlwZSgpOworCX0KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcml2YXRlIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHBlcnNpc3RhYmxlQXR0cmlidXRlc0ZvckZpZWxkQWNjZXNzVHlwZSgpIHsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPigKKwkJCQl0aGlzLnBlcnNpc3RhYmxlRmllbGRzKCksCisJCQkJdGhpcy5wZXJzaXN0YWJsZVByb3BlcnRpZXNXaXRoU3BlY2lmaWVkUHJvcGVydHlBY2Nlc3MoKQorCQkJKTsKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSBJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBwZXJzaXN0YWJsZUF0dHJpYnV0ZXNGb3JQcm9wZXJ0eUFjY2Vzc1R5cGUoKSB7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4oCisJCQkJdGhpcy5wZXJzaXN0YWJsZVByb3BlcnRpZXMoKSwKKwkJCQl0aGlzLnBlcnNpc3RhYmxlRmllbGRzV2l0aFNwZWNpZmllZEZpZWxkQWNjZXNzKCkKKwkJCSk7CisJfQorCQorCisJLy8gKioqKioqKioqKiB1cGRhdGUgZnJvbSBKYXZhICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci51cGRhdGUoYXN0Um9vdCk7CisJCXRoaXMuc2V0TmFtZSh0aGlzLmJ1aWxkTmFtZShhc3RSb290KSk7CisJCXRoaXMuc2V0UXVhbGlmaWVkTmFtZSh0aGlzLmJ1aWxkUXVhbGlmaWVkTmFtZShhc3RSb290KSk7CisJCXRoaXMuc2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUodGhpcy5idWlsZFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRBYnN0cmFjdCh0aGlzLmJ1aWxkQWJzdHJhY3QoYXN0Um9vdCkpOworCQl0aGlzLnVwZGF0ZVR5cGVzKGFzdFJvb3QpOworCQl0aGlzLnVwZGF0ZUZpZWxkcyhhc3RSb290KTsKKwkJdGhpcy51cGRhdGVNZXRob2RzKGFzdFJvb3QpOworCQkvLyBuZWVkIHRvIHdhaXQgdW50aWwgZXZlcnl0aGluZyBpcyBidWlsdCB0byBjYWxjdWxhdGUgJ2FjY2VzcycKKwkJdGhpcy5zZXRBY2Nlc3ModGhpcy5idWlsZEFjY2VzcygpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJVHlwZURlY2xhcmF0aW9uW10gdHlwZURlY2xhcmF0aW9ucyA9IHRoaXMubWVtYmVyLmdldFR5cGVzKGFzdFJvb3QpOworCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAodHlwZURlY2xhcmF0aW9ucy5sZW5ndGgpOworCQlIYXNoU2V0PEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiB0eXBlc1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQ8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+KHRoaXMudHlwZXMpOworCQlmb3IgKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gOiB0eXBlRGVjbGFyYXRpb25zKSB7CisJCQlTdHJpbmcgdGROYW1lID0gdHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKKwkJCWludCBvY2N1cnJlbmNlID0gY291bnRlcnMuaW5jcmVtZW50KHRkTmFtZSk7CisKKwkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGUgPSB0aGlzLmdldFR5cGUodGROYW1lLCBvY2N1cnJlbmNlKTsKKwkJCWlmICh0eXBlID09IG51bGwpIHsKKwkJCQl0aGlzLmFkZFR5cGUodGhpcy5idWlsZFR5cGUodHlwZURlY2xhcmF0aW9uLCBvY2N1cnJlbmNlLCBhc3RSb290KSk7CisJCQl9IGVsc2UgeworCQkJCXR5cGVzVG9SZW1vdmUucmVtb3ZlKHR5cGUpOworCQkJCXR5cGUudXBkYXRlKGFzdFJvb3QpOworCQkJfQorCQl9CisJCXRoaXMucmVtb3ZlVHlwZXModHlwZXNUb1JlbW92ZSk7CisJfQorCisJcHJpdmF0ZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBidWlsZFR5cGUoVHlwZURlY2xhcmF0aW9uIG5lc3RlZFR5cGVEZWNsYXJhdGlvbiwgaW50IG9jY3VycmVuY2UsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBuZXdJbnN0YW5jZSh0aGlzLmdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpLCB0aGlzLm1lbWJlciwgbmVzdGVkVHlwZURlY2xhcmF0aW9uLCBvY2N1cnJlbmNlLCBhc3RSb290KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlRmllbGRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUZpZWxkRGVjbGFyYXRpb25bXSBmaWVsZERlY2xhcmF0aW9ucyA9IHRoaXMubWVtYmVyLmdldEZpZWxkcyhhc3RSb290KTsKKwkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKGZpZWxkRGVjbGFyYXRpb25zLmxlbmd0aCk7CisJCUhhc2hTZXQ8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gZmllbGRzVG9SZW1vdmUgPSBuZXcgSGFzaFNldDxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLmZpZWxkcyk7CisJCWZvciAoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uIDogZmllbGREZWNsYXJhdGlvbnMpIHsKKwkJCWZvciAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50IDogZnJhZ21lbnRzKGZpZWxkRGVjbGFyYXRpb24pKSB7CisJCQkJU3RyaW5nIGZpZWxkTmFtZSA9IGZyYWdtZW50LmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKKwkJCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudChmaWVsZE5hbWUpOworCisJCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBmaWVsZCA9IHRoaXMuZ2V0RmllbGQoZmllbGROYW1lLCBvY2N1cnJlbmNlKTsKKwkJCQlpZiAoZmllbGQgPT0gbnVsbCkgeworCQkJCQl0aGlzLmFkZEZpZWxkKHRoaXMuYnVpbGRGaWVsZChmaWVsZE5hbWUsIG9jY3VycmVuY2UsIGFzdFJvb3QpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmaWVsZHNUb1JlbW92ZS5yZW1vdmUoZmllbGQpOworCQkJCQlmaWVsZC51cGRhdGUoYXN0Um9vdCk7CisJCQkJfQorCQkJfQorCQl9CisJCXRoaXMucmVtb3ZlRmllbGRzKGZpZWxkc1RvUmVtb3ZlKTsKKwl9CisKKwlwcml2YXRlIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRGaWVsZChTdHJpbmcgZmllbGROYW1lLCBpbnQgb2NjdXJyZW5jZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIFNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUubmV3SW5zdGFuY2UodGhpcywgdGhpcy5tZW1iZXIsIGZpZWxkTmFtZSwgb2NjdXJyZW5jZSwgdGhpcy5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKSwgYXN0Um9vdCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZU1ldGhvZHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJTWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2REZWNsYXJhdGlvbnMgPSB0aGlzLm1lbWJlci5nZXRNZXRob2RzKGFzdFJvb3QpOworCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAobWV0aG9kRGVjbGFyYXRpb25zLmxlbmd0aCk7CisJCUhhc2hTZXQ8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gbWV0aG9kc1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQ8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5tZXRob2RzKTsKKwkJZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZERlY2xhcmF0aW9ucykgeworCQkJTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSA9IEpEVFRvb2xzLmJ1aWxkTWV0aG9kU2lnbmF0dXJlKG1ldGhvZERlY2xhcmF0aW9uKTsKKwkJCWludCBvY2N1cnJlbmNlID0gY291bnRlcnMuaW5jcmVtZW50KHNpZ25hdHVyZSk7CisKKwkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgbWV0aG9kID0gdGhpcy5nZXRNZXRob2Qoc2lnbmF0dXJlLCBvY2N1cnJlbmNlKTsKKwkJCWlmIChtZXRob2QgPT0gbnVsbCkgeworCQkJCXRoaXMuYWRkTWV0aG9kKHRoaXMuYnVpbGRNZXRob2Qoc2lnbmF0dXJlLCBvY2N1cnJlbmNlLCBhc3RSb290KSk7CisJCQl9IGVsc2UgeworCQkJCW1ldGhvZHNUb1JlbW92ZS5yZW1vdmUobWV0aG9kKTsKKwkJCQltZXRob2QudXBkYXRlKGFzdFJvb3QpOworCQkJfQorCQl9CisJCXRoaXMucmVtb3ZlTWV0aG9kcyhtZXRob2RzVG9SZW1vdmUpOworCX0KKworCXByaXZhdGUgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZE1ldGhvZChNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlLCBpbnQgb2NjdXJyZW5jZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIFNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUubmV3SW5zdGFuY2UodGhpcywgdGhpcy5tZW1iZXIsIHNpZ25hdHVyZSwgb2NjdXJyZW5jZSwgdGhpcy5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKSwgYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcml2YXRlIHN0YXRpYyBMaXN0PFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudD4gZnJhZ21lbnRzKEZpZWxkRGVjbGFyYXRpb24gZmQpIHsKKwkJcmV0dXJuIGZkLmZyYWdtZW50cygpOworCX0KKworCisJLy8gKioqKioqKioqKiBDb3VudGVyTWFwICoqKioqKioqKioKKworCXByaXZhdGUgc3RhdGljIGNsYXNzIENvdW50ZXJNYXAgeworCQlwcml2YXRlIGZpbmFsIEhhc2hNYXA8T2JqZWN0LCBJbnRSZWZlcmVuY2U+IGNvdW50ZXJzOworCisJCXByb3RlY3RlZCBDb3VudGVyTWFwKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKKwkJCXN1cGVyKCk7CisJCQl0aGlzLmNvdW50ZXJzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBJbnRSZWZlcmVuY2U+KGluaXRpYWxDYXBhY2l0eSk7CisJCX0KKworCQkvKioKKwkJICogUmV0dXJuIHRoZSBpbmNyZW1lbnRlZCBjb3VudCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCisJCSAqLworCQlpbnQgaW5jcmVtZW50KE9iamVjdCBvKSB7CisJCQlJbnRSZWZlcmVuY2UgY291bnRlciA9IHRoaXMuY291bnRlcnMuZ2V0KG8pOworCQkJaWYgKGNvdW50ZXIgPT0gbnVsbCkgeworCQkJCWNvdW50ZXIgPSBuZXcgSW50UmVmZXJlbmNlKCk7CisJCQkJdGhpcy5jb3VudGVycy5wdXQobywgY291bnRlcik7CisJCQl9CisJCQljb3VudGVyLmluY3JlbWVudCgpOworCQkJcmV0dXJuIGNvdW50ZXIuZ2V0VmFsdWUoKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlN2EzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuUHJpbWFyeUtleUpvaW5Db2x1bW4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlTmFtZWRDb2x1bW5Bbm5vdGF0aW9uCisJaW1wbGVtZW50cyBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiByZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlcjsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHJlZmVyZW5jZWRDb2x1bW5OYW1lQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZTsKKworCisJcHVibGljIFNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKKwkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOworCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRFbGVtZW50QWRhcHRlcih0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKKwl9CisKKwlwdWJsaWMgU291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgeworCQl0aGlzKHBhcmVudCwgbWVtYmVyLCBkYWEsIG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGRhYSkpOworCX0KKworCXB1YmxpYyBTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKKwkJdGhpcyhwYXJlbnQsIG1lbWJlciwgaWRhYSwgbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGlkYWEpKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKKwkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZShhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOworCQl0aGlzLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKHRoaXMuYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZShhc3RSb290KSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEphdmFTb3VyY2VOYW1lZENvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKKwl9CisKKworCS8vICoqKioqKioqKiogUHJpbWFyeUtleUpvaW5Db2x1bW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogcmVmZXJlbmNlZCBjb2x1bW4gbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7CisJCXJldHVybiB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWU7CisJCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUgPSByZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUFkYXB0ZXIuc2V0VmFsdWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkLCByZWZlcmVuY2VkQ29sdW1uTmFtZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyh0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOworCX0KKworCisJIC8vICoqKioqKioqKiogTmVzdGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7CisJCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZEFubm90YXRpb24pOworCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gb2xkSm9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIG9sZEFubm90YXRpb247CisJCXRoaXMuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUob2xkSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKKwkJdGhpcy5nZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKS5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCk7CisJfQorCisJcHJvdGVjdGVkIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBnZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKSB7CisJCXJldHVybiAoSW5kZXhlZEFubm90YXRpb25BZGFwdGVyKSB0aGlzLmFubm90YXRpb25BZGFwdGVyOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwl9CisKKwlzdGF0aWMgU291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNyZWF0ZU5lc3RlZFByaW1hcnlLZXlKb2luQ29sdW1uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgcGtKb2luQ29sdW1uc0FkYXB0ZXIpIHsKKwkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IGJ1aWxkTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCwgcGtKb2luQ29sdW1uc0FkYXB0ZXIpOworCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgaWRhYSk7CisJCXJldHVybiBuZXcgU291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHBhcmVudCwgbWVtYmVyLCBpZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBwa0pvaW5Db2x1bW5zQWRhcHRlcikgeworCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKHBrSm9pbkNvbHVtbnNBZGFwdGVyLCBpbmRleCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKKwl9CisKKwlzdGF0aWMgTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY3JlYXRlU2Vjb25kYXJ5VGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHNlY29uZGFyeVRhYmxlQWRhcHRlciwgSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIGludCBpbmRleCkgeworCQlyZXR1cm4gbmV3IFNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlciwgYnVpbGRTZWNvbmRhcnlUYWJsZUFubm90YXRpb25BZGFwdGVyKHNlY29uZGFyeVRhYmxlQWRhcHRlciwgaW5kZXgpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBzZWNvbmRhcnlUYWJsZUFkYXB0ZXIsIGludCBpbmRleCkgeworCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKHNlY29uZGFyeVRhYmxlQWRhcHRlciwgSlBBLlNFQ09OREFSWV9UQUJMRV9fUEtfSk9JTl9DT0xVTU5TLCBpbmRleCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2VhODIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlByaW1hcnlLZXlKb2luQ29sdW1ucworICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxNZW1iZXI+CisJaW1wbGVtZW50cyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIGZpbmFsIFZlY3RvcjxOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gcGtKb2luQ29sdW1ucyA9IG5ldyBWZWN0b3I8TmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+KCk7CisKKworCXB1YmxpYyBTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMuaW5pdGlhbGl6ZSh0aGlzLCBhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLnVwZGF0ZSh0aGlzLCBhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLnBrSm9pbkNvbHVtbnMpOworCX0KKworCisJLy8gKioqKioqKioqKiBBbm5vdGF0aW9uQ29udGFpbmVyIEltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiB0aGlzLmdldEFubm90YXRpb25OYW1lKCk7CisJfQorCisJcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldENvbnRhaW5lckpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19fVkFMVUU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBuZXN0ZWRBbm5vdGF0aW9ucygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5wa0pvaW5Db2x1bW5zKTsKKwl9CisKKwlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMucGtKb2luQ29sdW1ucy5zaXplKCk7CisJfQorCisJcHVibGljIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZE5lc3RlZEFubm90YXRpb25JbnRlcm5hbCgpIHsKKwkJTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uID0gdGhpcy5idWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMucGtKb2luQ29sdW1ucy5zaXplKCkpOworCQl0aGlzLnBrSm9pbkNvbHVtbnMuYWRkKHBrSm9pbkNvbHVtbik7CisJCXJldHVybiBwa0pvaW5Db2x1bW47CisJfQorCisJcHJpdmF0ZSBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgeworCQlyZXR1cm4gU291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmNyZWF0ZU5lc3RlZFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIHRoaXMubWVtYmVyLCBpbmRleCwgdGhpcy5kYWEpOworCX0KKworCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25BZGRlZChpbnQgaW5kZXgsIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb24pIHsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKFBLX0pPSU5fQ09MVU1OU19MSVNULCBpbmRleCwgbmVzdGVkQW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIG1vdmVOZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMucGtKb2luQ29sdW1ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KS5nZXQodGFyZ2V0SW5kZXgpOworCX0KKworCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25Nb3ZlZChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQl0aGlzLmZpcmVJdGVtTW92ZWQoUEtfSk9JTl9DT0xVTU5TX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJfQorCisJcHVibGljIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHJlbW92ZU5lc3RlZEFubm90YXRpb25JbnRlcm5hbChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIHRoaXMucGtKb2luQ29sdW1ucy5yZW1vdmUoaW5kZXgpOworCX0KKworCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25SZW1vdmVkKGludCBpbmRleCwgTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbikgeworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChQS19KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIG5lc3RlZEFubm90YXRpb24pOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVF1ZXJ5SGludEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VRdWVyeUhpbnRBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0ODRjMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VRdWVyeUhpbnRBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlF1ZXJ5SGludEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuUXVlcnlIaW50CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VRdWVyeUhpbnRBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPFR5cGU+CisJaW1wbGVtZW50cyBOZXN0YWJsZVF1ZXJ5SGludEFubm90YXRpb24KK3sKKwlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZURlY2xhcmF0aW9uQWRhcHRlcjsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXI7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7CisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKworCXB1YmxpYyBTb3VyY2VRdWVyeUhpbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKKwkJc3VwZXIocGFyZW50LCB0eXBlLCBpZGFhLCBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHR5cGUsIGlkYWEpKTsKKwkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZE5hbWVBZGFwdGVyKGlkYWEpOworCQl0aGlzLm5hbWVBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKKwkJdGhpcy52YWx1ZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRWYWx1ZUFkYXB0ZXIoaWRhYSk7CisJCXRoaXMudmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIodGhpcy52YWx1ZURlY2xhcmF0aW9uQWRhcHRlcik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKKwkJcmV0dXJuIG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLm1lbWJlciwgZGFlYSk7CisJfQorCisJcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhZGFwdGVyKSB7CisJCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhhZGFwdGVyLCBKUEEuUVVFUllfSElOVF9fTkFNRSk7CisJfQorCisJcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYWRhcHRlcikgeworCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoYWRhcHRlciwgSlBBLlFVRVJZX0hJTlRfX1ZBTFVFKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpOworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnNldE5hbWUodGhpcy5idWlsZE5hbWUoYXN0Um9vdCkpOworCQl0aGlzLnNldFZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7CisJfQorCisJcHVibGljIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBnZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKSB7CisJCXJldHVybiAoSW5kZXhlZEFubm90YXRpb25BZGFwdGVyKSB0aGlzLmFubm90YXRpb25BZGFwdGVyOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIFF1ZXJ5SGludEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm5hbWUsIG5hbWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZShuYW1lKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7CisJfQorCisJLy8gKioqKiogdmFsdWUKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy52YWx1ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIE5lc3RhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShOZXN0YWJsZUFubm90YXRpb24gb2xkQW5ub3RhdGlvbikgeworCQlRdWVyeUhpbnRBbm5vdGF0aW9uIG9sZEhpbnQgPSAoUXVlcnlIaW50QW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKKwkJdGhpcy5zZXROYW1lKG9sZEhpbnQuZ2V0TmFtZSgpKTsKKwkJdGhpcy5zZXRWYWx1ZShvbGRIaW50LmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCkgeworCQl0aGlzLmdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpLm1vdmVBbm5vdGF0aW9uKG5ld0luZGV4KTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJc3RhdGljIFNvdXJjZVF1ZXJ5SGludEFubm90YXRpb24gY3JlYXRlTmFtZWRRdWVyeVF1ZXJ5SGludChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlLCAgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBuYW1lZFF1ZXJ5QWRhcHRlciwgaW50IGluZGV4KSB7CisJCXJldHVybiBuZXcgU291cmNlUXVlcnlIaW50QW5ub3RhdGlvbihwYXJlbnQsIHR5cGUsIGJ1aWxkTmFtZWRRdWVyeVF1ZXJ5SGludEFubm90YXRpb25BZGFwdGVyKG5hbWVkUXVlcnlBZGFwdGVyLCBpbmRleCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkTmFtZWRRdWVyeVF1ZXJ5SGludEFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgbmFtZWRRdWVyeUFkYXB0ZXIsIGludCBpbmRleCkgeworCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKG5hbWVkUXVlcnlBZGFwdGVyLCBKUEEuTkFNRURfUVVFUllfX0hJTlRTLCBpbmRleCwgSlBBLlFVRVJZX0hJTlQpOworCX0KKworCXN0YXRpYyBTb3VyY2VRdWVyeUhpbnRBbm5vdGF0aW9uIGNyZWF0ZU5hbWVkTmF0aXZlUXVlcnlRdWVyeUhpbnQoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIFR5cGUgdHlwZSwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBuYW1lZE5hdGl2ZVF1ZXJ5QWRhcHRlciwgaW50IGluZGV4KSB7CisJCXJldHVybiBuZXcgU291cmNlUXVlcnlIaW50QW5ub3RhdGlvbihwYXJlbnQsIHR5cGUsIGJ1aWxkTmFtZWROYXRpdmVRdWVyeVF1ZXJ5SGludEFubm90YXRpb25BZGFwdGVyKG5hbWVkTmF0aXZlUXVlcnlBZGFwdGVyLCBpbmRleCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkTmFtZWROYXRpdmVRdWVyeVF1ZXJ5SGludEFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgbmFtZWROYXRpdmVRdWVyeUFkYXB0ZXIsIGludCBpbmRleCkgeworCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKG5hbWVkTmF0aXZlUXVlcnlBZGFwdGVyLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZX19ISU5UUywgaW5kZXgsIEpQQS5RVUVSWV9ISU5UKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI3ZjA3MAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVFRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNhc2NhZGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuTWFueVRvTWFueQorICogamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb01hbnkKKyAqIGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lCisgKi8KK2Fic3RyYWN0IGNsYXNzIFNvdXJjZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KKwlpbXBsZW1lbnRzIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCit7CisJZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0YXJnZXRFbnRpdHlEZWNsYXJhdGlvbkFkYXB0ZXI7CisJZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdGFyZ2V0RW50aXR5QWRhcHRlcjsKKwlTdHJpbmcgdGFyZ2V0RW50aXR5OworCisJU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lOworCisJZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmZXRjaERlY2xhcmF0aW9uQWRhcHRlcjsKKwlmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmZXRjaEFkYXB0ZXI7CisJRmV0Y2hUeXBlIGZldGNoOworCisJZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGNhc2NhZGVEZWNsYXJhdGlvbkFkYXB0ZXI7CisJZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBjYXNjYWRlQWRhcHRlcjsKKwlib29sZWFuIGNhc2NhZGVBbGw7CisJYm9vbGVhbiBjYXNjYWRlUGVyc2lzdDsKKwlib29sZWFuIGNhc2NhZGVNZXJnZTsKKwlib29sZWFuIGNhc2NhZGVSZW1vdmU7CisJYm9vbGVhbiBjYXNjYWRlUmVmcmVzaDsKKworCisJU291cmNlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBkYWEpOworCQl0aGlzLnRhcmdldEVudGl0eURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuZ2V0VGFyZ2V0RW50aXR5QWRhcHRlcigpOworCQl0aGlzLnRhcmdldEVudGl0eUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMudGFyZ2V0RW50aXR5RGVjbGFyYXRpb25BZGFwdGVyKTsKKwkJdGhpcy5mZXRjaERlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuZ2V0RmV0Y2hBZGFwdGVyKCk7CisJCXRoaXMuZmV0Y2hBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLmZldGNoRGVjbGFyYXRpb25BZGFwdGVyKTsKKwkJdGhpcy5jYXNjYWRlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5nZXRDYXNjYWRlQWRhcHRlcigpOworCQl0aGlzLmNhc2NhZGVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYXR0cmlidXRlLCB0aGlzLmNhc2NhZGVEZWNsYXJhdGlvbkFkYXB0ZXIpOworCX0KKworCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKKwkJcmV0dXJuIG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLm1lbWJlciwgZGFlYSk7CisJfQorCisJcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZEJvb2xlYW5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSkgeworCQlyZXR1cm4gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLm1lbWJlciwgZGFlYSk7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnRhcmdldEVudGl0eSA9IHRoaXMuYnVpbGRUYXJnZXRFbnRpdHkoYXN0Um9vdCk7CisJCXRoaXMuZnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoYXN0Um9vdCk7CisJCXRoaXMuZmV0Y2ggPSB0aGlzLmJ1aWxkRmV0Y2goYXN0Um9vdCk7CisJCXRoaXMuaW5pdGlhbGl6ZUNhc2NhZGVUeXBlcyhhc3RSb290KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNhc2NhZGVUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlDYXNjYWRlVHlwZVtdIGNhc2NhZGVUeXBlcyA9IENhc2NhZGVUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlcyh0aGlzLmNhc2NhZGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKKwkJdGhpcy5jYXNjYWRlQWxsID0gQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLkFMTCk7CisJCXRoaXMuY2FzY2FkZU1lcmdlID0gQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLk1FUkdFKTsKKwkJdGhpcy5jYXNjYWRlUGVyc2lzdCA9IEFycmF5VG9vbHMuY29udGFpbnMoY2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5QRVJTSVNUKTsKKwkJdGhpcy5jYXNjYWRlUmVmcmVzaCA9IEFycmF5VG9vbHMuY29udGFpbnMoY2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5SRUZSRVNIKTsKKwkJdGhpcy5jYXNjYWRlUmVtb3ZlID0gQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlJFTU9WRSk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0RmV0Y2godGhpcy5idWlsZEZldGNoKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRUYXJnZXRFbnRpdHkodGhpcy5idWlsZFRhcmdldEVudGl0eShhc3RSb290KSk7CisJCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUodGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKGFzdFJvb3QpKTsKKwkJdGhpcy51cGRhdGVDYXNjYWRlKGFzdFJvb3QpOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVDYXNjYWRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUNhc2NhZGVUeXBlW10gY2FzY2FkZVR5cGVzID0gQ2FzY2FkZVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVzKHRoaXMuY2FzY2FkZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOworCQl0aGlzLnNldENhc2NhZGVBbGwoQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLkFMTCkpOworCQl0aGlzLnNldENhc2NhZGVNZXJnZShBcnJheVRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuTUVSR0UpKTsKKwkJdGhpcy5zZXRDYXNjYWRlUGVyc2lzdChBcnJheVRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuUEVSU0lTVCkpOworCQl0aGlzLnNldENhc2NhZGVSZWZyZXNoKEFycmF5VG9vbHMuY29udGFpbnMoY2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5SRUZSRVNIKSk7CisJCXRoaXMuc2V0Q2FzY2FkZVJlbW92ZShBcnJheVRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuUkVNT1ZFKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy50YXJnZXRFbnRpdHkpOworCX0KKworCisJLy8gKioqKioqKioqKiBSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiB0YXJnZXQgZW50aXR5CisJcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKSB7CisJCXJldHVybiB0aGlzLnRhcmdldEVudGl0eTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHRhcmdldEVudGl0eSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy50YXJnZXRFbnRpdHksIHRhcmdldEVudGl0eSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkID0gdGhpcy50YXJnZXRFbnRpdHk7CisJCXRoaXMudGFyZ2V0RW50aXR5ID0gdGFyZ2V0RW50aXR5OworCQl0aGlzLnRhcmdldEVudGl0eUFkYXB0ZXIuc2V0VmFsdWUodGFyZ2V0RW50aXR5KTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBUkdFVF9FTlRJVFlfUFJPUEVSVFksIG9sZCwgdGFyZ2V0RW50aXR5KTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFRhcmdldEVudGl0eShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy50YXJnZXRFbnRpdHlBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy50YXJnZXRFbnRpdHlEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOworCX0KKworCS8qKgorCSAqIHJldHVybiB0aGUgSmF2YSBhZGFwdGVyJ3MgJ3RhcmdldEVudGl0eScgZWxlbWVudCBhZGFwdGVyIGNvbmZpZworCSAqLworCWFic3RyYWN0IERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZ2V0VGFyZ2V0RW50aXR5QWRhcHRlcigpOworCisJLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIHRhcmdldCBlbnRpdHkgY2xhc3MgbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoKSB7CisJCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZShTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZTsKKwkJdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSA9IG5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfVEFSR0VUX0VOVElUWV9DTEFTU19OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuICh0aGlzLnRhcmdldEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiBKRFRUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMudGFyZ2V0RW50aXR5QWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpKTsKKwl9CisKKwkvLyAqKioqKiBmZXRjaAorCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7CisJCXJldHVybiB0aGlzLmZldGNoOworCX0KKworCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5mZXRjaCwgZmV0Y2gpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJRmV0Y2hUeXBlIG9sZCA9IHRoaXMuZmV0Y2g7CisJCXRoaXMuZmV0Y2ggPSBmZXRjaDsKKwkJdGhpcy5mZXRjaEFkYXB0ZXIuc2V0VmFsdWUoRmV0Y2hUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZShmZXRjaCkpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkVUQ0hfUFJPUEVSVFksIG9sZCwgZmV0Y2gpOworCX0KKworCXByaXZhdGUgRmV0Y2hUeXBlIGJ1aWxkRmV0Y2goQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIEZldGNoVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmZldGNoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRGZXRjaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuZmV0Y2hEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOworCX0KKworCS8qKgorCSAqIHJldHVybiB0aGUgSmF2YSBhZGFwdGVyJ3MgJ2ZldGNoJyBlbGVtZW50IGFkYXB0ZXIgY29uZmlnCisJICovCisJYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXRGZXRjaEFkYXB0ZXIoKTsKKworCS8vICoqKioqIGNhc2NhZGUKKwlwcml2YXRlIHZvaWQgc2V0Q2FzY2FkZVR5cGVzKENhc2NhZGVUeXBlW10gY2FzY2FkZVR5cGVzKSB7CisJCXRoaXMuY2FzY2FkZUFkYXB0ZXIuc2V0VmFsdWUoQ2FzY2FkZVR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlcyhjYXNjYWRlVHlwZXMpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSBjYXNjYWRlVHlwZSwgYm9vbGVhbiBzZXQpIHsKKwkJU3RyaW5nW10gamF2YVZhbHVlcyA9IHRoaXMuY2FzY2FkZUFkYXB0ZXIuZ2V0VmFsdWUoKTsKKwkJQ2FzY2FkZVR5cGVbXSBjYXNjYWRlVHlwZXMgPSBDYXNjYWRlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZXMoamF2YVZhbHVlcyk7CisKKwkJYm9vbGVhbiBwcmVzZW50ID0gQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIGNhc2NhZGVUeXBlKTsKKwkJaWYgKHNldCkgeworCQkJaWYgKCAhIHByZXNlbnQpIHsKKwkJCQl0aGlzLnNldENhc2NhZGVUeXBlcyhBcnJheVRvb2xzLmFkZChjYXNjYWRlVHlwZXMsIGNhc2NhZGVUeXBlKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocHJlc2VudCkgeworCQkJCXRoaXMuc2V0Q2FzY2FkZVR5cGVzKEFycmF5VG9vbHMucmVtb3ZlKGNhc2NhZGVUeXBlcywgY2FzY2FkZVR5cGUpKTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2FzY2FkZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmNhc2NhZGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOworCX0KKworCS8qKgorCSAqIHJldHVybiB0aGUgSmF2YSBhZGFwdGVyJ3MgJ2Nhc2NhZGUnIGVsZW1lbnQgYWRhcHRlciBjb25maWcKKwkgKi8KKwlhYnN0cmFjdCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZ2V0Q2FzY2FkZUFkYXB0ZXIoKTsKKworCS8vICoqKioqIGNhc2NhZGUgYWxsCisJcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlQWxsKCkgeworCQlyZXR1cm4gdGhpcy5jYXNjYWRlQWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhc2NhZGVBbGwoYm9vbGVhbiBjYXNjYWRlQWxsKSB7CisJCWlmICh0aGlzLmNhc2NhZGVBbGwgPT0gY2FzY2FkZUFsbCkgeworCQkJcmV0dXJuOworCQl9CisJCWJvb2xlYW4gb2xkID0gdGhpcy5jYXNjYWRlQWxsOworCQl0aGlzLmNhc2NhZGVBbGwgPSBjYXNjYWRlQWxsOworCQl0aGlzLnNldENhc2NhZGUoQ2FzY2FkZVR5cGUuQUxMLCBjYXNjYWRlQWxsKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfQUxMX1BST1BFUlRZLCBvbGQsIGNhc2NhZGVBbGwpOworCX0KKworCS8vICoqKioqIGNhc2NhZGUgcGVyc2lzdAorCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZVBlcnNpc3QoKSB7CisJCXJldHVybiB0aGlzLmNhc2NhZGVQZXJzaXN0OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhc2NhZGVQZXJzaXN0KGJvb2xlYW4gY2FzY2FkZVBlcnNpc3QpIHsKKwkJaWYgKHRoaXMuY2FzY2FkZVBlcnNpc3QgPT0gY2FzY2FkZVBlcnNpc3QpIHsKKwkJCXJldHVybjsKKwkJfQorCQlib29sZWFuIG9sZCA9IHRoaXMuY2FzY2FkZVBlcnNpc3Q7CisJCXRoaXMuY2FzY2FkZVBlcnNpc3QgPSBjYXNjYWRlUGVyc2lzdDsKKwkJdGhpcy5zZXRDYXNjYWRlKENhc2NhZGVUeXBlLlBFUlNJU1QsIGNhc2NhZGVQZXJzaXN0KTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfUEVSU0lTVF9QUk9QRVJUWSwgb2xkLCBjYXNjYWRlUGVyc2lzdCk7CisJfQorCisJLy8gKioqKiogY2FzY2FkZSBtZXJnZQorCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZU1lcmdlKCkgeworCQlyZXR1cm4gdGhpcy5jYXNjYWRlTWVyZ2U7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FzY2FkZU1lcmdlKGJvb2xlYW4gY2FzY2FkZU1lcmdlKSB7CisJCWlmICh0aGlzLmNhc2NhZGVNZXJnZSA9PSBjYXNjYWRlTWVyZ2UpIHsKKwkJCXJldHVybjsKKwkJfQorCQlib29sZWFuIG9sZCA9IHRoaXMuY2FzY2FkZU1lcmdlOworCQl0aGlzLmNhc2NhZGVNZXJnZSA9IGNhc2NhZGVNZXJnZTsKKwkJdGhpcy5zZXRDYXNjYWRlKENhc2NhZGVUeXBlLk1FUkdFLCBjYXNjYWRlTWVyZ2UpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FTQ0FERV9NRVJHRV9QUk9QRVJUWSwgb2xkLCBjYXNjYWRlTWVyZ2UpOworCX0KKworCS8vICoqKioqIGNhc2NhZGUgcmVtb3ZlCisJcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUmVtb3ZlKCkgeworCQlyZXR1cm4gdGhpcy5jYXNjYWRlUmVtb3ZlOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhc2NhZGVSZW1vdmUoYm9vbGVhbiBjYXNjYWRlUmVtb3ZlKSB7CisJCWlmICh0aGlzLmNhc2NhZGVSZW1vdmUgPT0gY2FzY2FkZVJlbW92ZSkgeworCQkJcmV0dXJuOworCQl9CisJCWJvb2xlYW4gb2xkID0gdGhpcy5jYXNjYWRlUmVtb3ZlOworCQl0aGlzLmNhc2NhZGVSZW1vdmUgPSBjYXNjYWRlUmVtb3ZlOworCQl0aGlzLnNldENhc2NhZGUoQ2FzY2FkZVR5cGUuUkVNT1ZFLCBjYXNjYWRlUmVtb3ZlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfUkVNT1ZFX1BST1BFUlRZLCBvbGQsIGNhc2NhZGVSZW1vdmUpOworCX0KKworCS8vICoqKioqIGNhc2NhZGUgcmVmcmVzaAorCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZVJlZnJlc2goKSB7CisJCXJldHVybiB0aGlzLmNhc2NhZGVSZWZyZXNoOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhc2NhZGVSZWZyZXNoKGJvb2xlYW4gY2FzY2FkZVJlZnJlc2gpIHsKKwkJaWYgKHRoaXMuY2FzY2FkZVJlZnJlc2ggPT0gY2FzY2FkZVJlZnJlc2gpIHsKKwkJCXJldHVybjsKKwkJfQorCQlib29sZWFuIG9sZCA9IHRoaXMuY2FzY2FkZVJlZnJlc2g7CisJCXRoaXMuY2FzY2FkZVJlZnJlc2ggPSBjYXNjYWRlUmVmcmVzaDsKKwkJdGhpcy5zZXRDYXNjYWRlKENhc2NhZGVUeXBlLlJFRlJFU0gsIGNhc2NhZGVSZWZyZXNoKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfUkVGUkVTSF9QUk9QRVJUWSwgb2xkLCBjYXNjYWRlUmVmcmVzaCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0RW50aXR5QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKKwkJLy8gVE9ETyB3aGF0IGFib3V0IFF1YWxpZmllZFR5cGU/CisJCXJldHVybiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCX0KKworCXN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGNvbnZlcnRlcikgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgZmFsc2UsIGNvbnZlcnRlcik7CisJfQorCisJc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRGZXRjaEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7CisJCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgZmFsc2UpOworCX0KKworCXN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRFbnVtQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7CisJCXJldHVybiBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBmYWxzZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhMTEwNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDI2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlNlY29uZGFyeVRhYmxlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VTZWNvbmRhcnlUYWJsZUFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUJhc2VUYWJsZUFubm90YXRpb24KKwlpbXBsZW1lbnRzIE5lc3RhYmxlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgZmluYWwgVmVjdG9yPE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zID0gbmV3IFZlY3RvcjxOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4oKTsKKwlwcml2YXRlIGZpbmFsIFBrSm9pbkNvbHVtbnNBbm5vdGF0aW9uQ29udGFpbmVyIHBrSm9pbkNvbHVtbnNDb250YWluZXIgPSBuZXcgUGtKb2luQ29sdW1uc0Fubm90YXRpb25Db250YWluZXIoKTsKKworCisJcHVibGljIFNvdXJjZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLmluaXRpYWxpemUodGhpcy5wa0pvaW5Db2x1bW5zQ29udGFpbmVyLCBhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMudXBkYXRlKHRoaXMucGtKb2luQ29sdW1uc0NvbnRhaW5lciwgYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEFic3RyYWN0QmFzZVRhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdldE5hbWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcikgeworCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciwgSlBBLlNFQ09OREFSWV9UQUJMRV9fTkFNRSk7CisJfQorCisJQE92ZXJyaWRlCisJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXRTY2hlbWFBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcikgeworCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciwgSlBBLlNFQ09OREFSWV9UQUJMRV9fU0NIRU1BKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdldENhdGFsb2dBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcikgeworCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciwgSlBBLlNFQ09OREFSWV9UQUJMRV9fQ0FUQUxPRyk7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldFVuaXF1ZUNvbnN0cmFpbnRzRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBKUEEuU0VDT05EQVJZX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7CisJfQorCisKKwkvLyAqKioqKioqKioqKioqIFNlY29uZGFyeVRhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioKKworCS8vICoqKioqIHBrIGpvaW4gY29sdW1ucworCXB1YmxpYyBMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5wa0pvaW5Db2x1bW5zKTsKKwl9CisKKwlMaXN0SXRlcmF0b3I8TmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IG5lc3RhYmxlUGtKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5wa0pvaW5Db2x1bW5zKTsKKwl9CisKKwlwdWJsaWMgaW50IHBrSm9pbkNvbHVtbnNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5wa0pvaW5Db2x1bW5zLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uQXQoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLnBrSm9pbkNvbHVtbnMuZ2V0KGluZGV4KTsKKwl9CisKKwlwdWJsaWMgaW50IGluZGV4T2ZQa0pvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pIHsKKwkJcmV0dXJuIHRoaXMucGtKb2luQ29sdW1ucy5pbmRleE9mKGpvaW5Db2x1bW4pOworCX0KKworCXB1YmxpYyBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRQa0pvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCXJldHVybiAoTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIEFubm90YXRpb25Db250YWluZXJUb29scy5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4LCB0aGlzLnBrSm9pbkNvbHVtbnNDb250YWluZXIpOworCX0KKworCU5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZFBrSm9pbkNvbHVtbkludGVybmFsKCkgeworCQlOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW4gPSB0aGlzLmJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5wa0pvaW5Db2x1bW5zLnNpemUoKSk7CisJCXRoaXMucGtKb2luQ29sdW1ucy5hZGQocGtKb2luQ29sdW1uKTsKKwkJcmV0dXJuIHBrSm9pbkNvbHVtbjsKKwl9CisKKwlwcml2YXRlIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCXJldHVybiBTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uY3JlYXRlU2Vjb25kYXJ5VGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLmRhYSwgdGhpcywgdGhpcy5tZW1iZXIsIGluZGV4KTsKKwl9CisKKwl2b2lkIHBrSm9pbkNvbHVtbkFkZGVkKGludCBpbmRleCwgTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgeworCQl0aGlzLmZpcmVJdGVtQWRkZWQoUEtfSk9JTl9DT0xVTU5TX0xJU1QsIGluZGV4LCBqb2luQ29sdW1uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlUGtKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy5tb3ZlTmVzdGVkQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMucGtKb2luQ29sdW1uc0NvbnRhaW5lcik7CisJfQorCisJTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gbW92ZVBrSm9pbkNvbHVtbkludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnBrSm9pbkNvbHVtbnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCkuZ2V0KHRhcmdldEluZGV4KTsKKwl9CisKKwl2b2lkIHBrSm9pbkNvbHVtbk1vdmVkKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXRoaXMuZmlyZUl0ZW1Nb3ZlZChQS19KT0lOX0NPTFVNTlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVQa0pvaW5Db2x1bW4oaW50IGluZGV4KSB7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy5yZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKGluZGV4LCB0aGlzLnBrSm9pbkNvbHVtbnNDb250YWluZXIpOworCX0KKworCU5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHJlbW92ZVBrSm9pbkNvbHVtbkludGVybmFsKGludCBpbmRleCkgeworCQlyZXR1cm4gdGhpcy5wa0pvaW5Db2x1bW5zLnJlbW92ZShpbmRleCk7CisJfQorCisJdm9pZCBwa0pvaW5Db2x1bW5SZW1vdmVkKGludCBpbmRleCwgTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbikgeworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChQS19KT0lOX0NPTFVNTlNfTElTVCwgaW5kZXgsIGpvaW5Db2x1bW4pOworCX0KKworCisJLy8gKioqKioqKioqKiBOZXN0YWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7CisJCXRoaXMuZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkubW92ZUFubm90YXRpb24obmV3SW5kZXgpOworCX0KKworCXByb3RlY3RlZCBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkgeworCQlyZXR1cm4gKEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcikgdGhpcy5hbm5vdGF0aW9uQWRhcHRlcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShOZXN0YWJsZUFubm90YXRpb24gb2xkQW5ub3RhdGlvbikgeworCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRBbm5vdGF0aW9uKTsKKwkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIG9sZFRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKKwkJZm9yIChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gb2xkUGtKb2luQ29sdW1uIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9sZFRhYmxlLnBrSm9pbkNvbHVtbnMoKSkpIHsKKwkJCU5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIG5ld1BrSm9pbkNvbHVtbiA9IHRoaXMuYWRkUGtKb2luQ29sdW1uKG9sZFRhYmxlLmluZGV4T2ZQa0pvaW5Db2x1bW4ob2xkUGtKb2luQ29sdW1uKSk7CisJCQluZXdQa0pvaW5Db2x1bW4uaW5pdGlhbGl6ZUZyb20oKE5lc3RhYmxlQW5ub3RhdGlvbikgb2xkUGtKb2luQ29sdW1uKTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFNvdXJjZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBjcmVhdGVTZWNvbmRhcnlUYWJsZShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIobWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKKwl9CisKKwlzdGF0aWMgU291cmNlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIGNyZWF0ZU5lc3RlZFNlY29uZGFyeVRhYmxlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgc2Vjb25kYXJ5VGFibGVzQWRhcHRlcikgeworCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4LCBzZWNvbmRhcnlUYWJsZXNBZGFwdGVyKTsKKwkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGlkYWEpOworCQlyZXR1cm4gbmV3IFNvdXJjZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlciwgaWRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOworCX0KKworCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgc2Vjb25kYXJ5VGFibGVzQWRhcHRlcikgeworCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKHNlY29uZGFyeVRhYmxlc0FkYXB0ZXIsIGluZGV4LCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKKwl9CisKKworCS8vICoqKioqKioqKiogcGsgam9pbiBjb2x1bW4gY29udGFpbmVyICoqKioqKioqKioKKworCS8qKgorCSAqIGFkYXB0IHRoZSBBbm5vdGF0aW9uQ29udGFpbmVyIGludGVyZmFjZSB0byB0aGUgc2Vjb25kYXJ5IHRhYmxlJ3MKKwkgKiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMKKwkgKi8KKwljbGFzcyBQa0pvaW5Db2x1bW5zQW5ub3RhdGlvbkNvbnRhaW5lcgorCQlpbXBsZW1lbnRzIEFubm90YXRpb25Db250YWluZXI8TmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IAorCXsKKwkJcHVibGljIFN0cmluZyBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZSgpIHsKKwkJCXJldHVybiBTb3VyY2VTZWNvbmRhcnlUYWJsZUFubm90YXRpb24udGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpOworCQl9CisKKwkJcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldENvbnRhaW5lckpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJCXJldHVybiBTb3VyY2VTZWNvbmRhcnlUYWJsZUFubm90YXRpb24udGhpcy5nZXRKZHRBbm5vdGF0aW9uKGFzdFJvb3QpOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKKwkJCXJldHVybiBKUEEuU0VDT05EQVJZX1RBQkxFX19QS19KT0lOX0NPTFVNTlM7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7CisJCQlyZXR1cm4gUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwkJfQorCisJCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IG5lc3RlZEFubm90YXRpb25zKCkgeworCQkJcmV0dXJuIFNvdXJjZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi50aGlzLm5lc3RhYmxlUGtKb2luQ29sdW1ucygpOworCQl9CisKKwkJcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7CisJCQlyZXR1cm4gU291cmNlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnRoaXMucGtKb2luQ29sdW1uc1NpemUoKTsKKwkJfQorCisJCXB1YmxpYyBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGROZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoKSB7CisJCQlyZXR1cm4gU291cmNlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnRoaXMuYWRkUGtKb2luQ29sdW1uSW50ZXJuYWwoKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25BZGRlZChpbnQgaW5kZXgsIE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb24pIHsKKwkJCVNvdXJjZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi50aGlzLnBrSm9pbkNvbHVtbkFkZGVkKGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwkJfQorCisJCXB1YmxpYyBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBtb3ZlTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCQlyZXR1cm4gU291cmNlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnRoaXMubW92ZVBrSm9pbkNvbHVtbkludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uTW92ZWQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJCVNvdXJjZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi50aGlzLnBrSm9pbkNvbHVtbk1vdmVkKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCX0KKworCQlwdWJsaWMgTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcmVtb3ZlTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKGludCBpbmRleCkgeworCQkJcmV0dXJuIFNvdXJjZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi50aGlzLnJlbW92ZVBrSm9pbkNvbHVtbkludGVybmFsKGluZGV4KTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25SZW1vdmVkKGludCBpbmRleCwgTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbikgeworCQkJU291cmNlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnRoaXMucGtKb2luQ29sdW1uUmVtb3ZlZChpbmRleCwgbmVzdGVkQW5ub3RhdGlvbik7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMzcxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5TZWNvbmRhcnlUYWJsZXMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248TWVtYmVyPgorCWltcGxlbWVudHMgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbgoreworCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8TmVzdGFibGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24+IHNlY29uZGFyeVRhYmxlcyA9IG5ldyBWZWN0b3I8TmVzdGFibGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24+KCk7CisKKworCXB1YmxpYyBTb3VyY2VTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLmluaXRpYWxpemUodGhpcywgYXN0Um9vdCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy51cGRhdGUodGhpcywgYXN0Um9vdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy5zZWNvbmRhcnlUYWJsZXMpOworCX0KKworCisJLy8gKioqKioqKioqKiBBbm5vdGF0aW9uQ29udGFpbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiB0aGlzLmdldEFubm90YXRpb25OYW1lKCk7CisJfQorCisJcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldENvbnRhaW5lckpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLlNFQ09OREFSWV9UQUJMRVNfX1ZBTFVFOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIExpc3RJdGVyYXRvcjxOZXN0YWJsZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbj4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8TmVzdGFibGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24+KHRoaXMuc2Vjb25kYXJ5VGFibGVzKTsKKwl9CisKKwlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuc2Vjb25kYXJ5VGFibGVzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gYWRkTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKCkgeworCQlOZXN0YWJsZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHRoaXMuYnVpbGRTZWNvbmRhcnlUYWJsZSh0aGlzLnNlY29uZGFyeVRhYmxlcy5zaXplKCkpOworCQl0aGlzLnNlY29uZGFyeVRhYmxlcy5hZGQoc2Vjb25kYXJ5VGFibGUpOworCQlyZXR1cm4gc2Vjb25kYXJ5VGFibGU7CisJfQorCisJcHJpdmF0ZSBOZXN0YWJsZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBidWlsZFNlY29uZGFyeVRhYmxlKGludCBpbmRleCkgeworCQlyZXR1cm4gU291cmNlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmNyZWF0ZU5lc3RlZFNlY29uZGFyeVRhYmxlKHRoaXMsIHRoaXMubWVtYmVyLCBpbmRleCwgdGhpcy5kYWEpOworCX0KKworCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25BZGRlZChpbnQgaW5kZXgsIE5lc3RhYmxlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb24pIHsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKFNFQ09OREFSWV9UQUJMRVNfTElTVCwgaW5kZXgsIG5lc3RlZEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBOZXN0YWJsZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBtb3ZlTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnNlY29uZGFyeVRhYmxlcywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KS5nZXQodGFyZ2V0SW5kZXgpOworCX0KKworCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25Nb3ZlZChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQl0aGlzLmZpcmVJdGVtTW92ZWQoU0VDT05EQVJZX1RBQkxFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCX0KKworCXB1YmxpYyBOZXN0YWJsZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiByZW1vdmVOZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLnNlY29uZGFyeVRhYmxlcy5yZW1vdmUoaW5kZXgpOworCX0KKworCXB1YmxpYyB2b2lkIG5lc3RlZEFubm90YXRpb25SZW1vdmVkKGludCBpbmRleCwgTmVzdGFibGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gbmVzdGVkQW5ub3RhdGlvbikgeworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChTRUNPTkRBUllfVEFCTEVTX0xJU1QsIGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDM4N2U0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuU2VxdWVuY2VHZW5lcmF0b3IKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlR2VuZXJhdG9yQW5ub3RhdGlvbgorCWltcGxlbWVudHMgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IE5BTUVfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SX19OQU1FKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IElOSVRJQUxfVkFMVUVfQURBUFRFUiA9IGJ1aWxkSW50ZWdlckFkYXB0ZXIoSlBBLlNFUVVFTkNFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBBTExPQ0FUSU9OX1NJWkVfQURBUFRFUiA9IGJ1aWxkSW50ZWdlckFkYXB0ZXIoSlBBLlNFUVVFTkNFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gU0VRVUVOQ0VfTkFNRV9BREFQVEVSID0gYnVpbGRBZGFwdGVyKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1JfX1NFUVVFTkNFX05BTUUpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2VxdWVuY2VOYW1lQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyBzZXF1ZW5jZU5hbWU7CisKKworCXByb3RlY3RlZCBTb3VyY2VTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJc3VwZXIocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJCXRoaXMuc2VxdWVuY2VOYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKFNFUVVFTkNFX05BTUVfQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7CisJCXRoaXMuc2VxdWVuY2VOYW1lID0gdGhpcy5idWlsZFNlcXVlbmNlTmFtZShhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOworCQl0aGlzLnNldFNlcXVlbmNlTmFtZSh0aGlzLmJ1aWxkU2VxdWVuY2VOYW1lKGFzdFJvb3QpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQWJzdHJhY3RHZW5lcmF0b3JBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZ2V0TmFtZUFkYXB0ZXIoKSB7CisJCXJldHVybiBOQU1FX0FEQVBURVI7CisJfQorCisJQE92ZXJyaWRlCisJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZ2V0SW5pdGlhbFZhbHVlQWRhcHRlcigpIHsKKwkJcmV0dXJuIElOSVRJQUxfVkFMVUVfQURBUFRFUjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBnZXRBbGxvY2F0aW9uU2l6ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBBTExPQ0FUSU9OX1NJWkVfQURBUFRFUjsKKwl9CisKKworCS8vICoqKioqKioqKiogU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHNlcXVlbmNlIG5hbWUKKwlwdWJsaWMgU3RyaW5nIGdldFNlcXVlbmNlTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuc2VxdWVuY2VOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlcXVlbmNlTmFtZShTdHJpbmcgc2VxdWVuY2VOYW1lKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnNlcXVlbmNlTmFtZSwgc2VxdWVuY2VOYW1lKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLnNlcXVlbmNlTmFtZTsKKwkJdGhpcy5zZXF1ZW5jZU5hbWUgPSBzZXF1ZW5jZU5hbWU7CisJCXRoaXMuc2VxdWVuY2VOYW1lQWRhcHRlci5zZXRWYWx1ZShzZXF1ZW5jZU5hbWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkLCBzZXF1ZW5jZU5hbWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkU2VxdWVuY2VOYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnNlcXVlbmNlTmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRTZXF1ZW5jZU5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShTRVFVRU5DRV9OQU1FX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBib29sZWFuIHNlcXVlbmNlTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXMoU0VRVUVOQ0VfTkFNRV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgeworCQlyZXR1cm4gYnVpbGRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgZWxlbWVudE5hbWUpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRJbnRlZ2VyQWRhcHRlcihTdHJpbmcgZWxlbWVudE5hbWUpIHsKKwkJcmV0dXJuIGJ1aWxkSW50ZWdlckFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBlbGVtZW50TmFtZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVGFibGVBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2ZWJlMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VUYWJsZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlRhYmxlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VUYWJsZUFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUJhc2VUYWJsZUFubm90YXRpb24KKwlpbXBsZW1lbnRzIFRhYmxlQW5ub3RhdGlvbgoreworCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBOQU1FX0FEQVBURVIgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5UQUJMRV9fTkFNRSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFNDSEVNQV9BREFQVEVSID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuVEFCTEVfX1NDSEVNQSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IENBVEFMT0dfQURBUFRFUiA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLlRBQkxFX19DQVRBTE9HKTsKKworCisJcHVibGljIFNvdXJjZVRhYmxlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCisJLy8gKioqKioqKioqKiBBYnN0cmFjdEJhc2VUYWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXROYW1lQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpIHsKKwkJLy8gaWdub3JlIHRoZSBkYWEgcGFzc2VkIGluLCBAVGFibGUgaXMgbmV2ZXIgbmVzdGVkCisJCXJldHVybiBOQU1FX0FEQVBURVI7CisJfQorCisJQE92ZXJyaWRlCisJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXRTY2hlbWFBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcikgeworCQkvLyBpZ25vcmUgdGhlIGRhYSBwYXNzZWQgaW4sIEBUYWJsZSBpcyBuZXZlciBuZXN0ZWQKKwkJcmV0dXJuIFNDSEVNQV9BREFQVEVSOworCX0KKworCUBPdmVycmlkZQorCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZ2V0Q2F0YWxvZ0FkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKSB7CisJCS8vIGlnbm9yZSB0aGUgZGFhIHBhc3NlZCBpbiwgQFRhYmxlIGlzIG5ldmVyIG5lc3RlZAorCQlyZXR1cm4gQ0FUQUxPR19BREFQVEVSOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRVbmlxdWVDb25zdHJhaW50c0VsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gSlBBLlRBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI4Y2RmNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VUYWJsZUdlbmVyYXRvckFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDQ0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25Db250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlRhYmxlR2VuZXJhdG9yCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VUYWJsZUdlbmVyYXRvckFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUdlbmVyYXRvckFubm90YXRpb24KKwlpbXBsZW1lbnRzIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbgoreworCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBOQU1FX0FEQVBURVIgPSBidWlsZEFkYXB0ZXIoSlBBLlRBQkxFX0dFTkVSQVRPUl9fTkFNRSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBJTklUSUFMX1ZBTFVFX0FEQVBURVIgPSBidWlsZEludGVnZXJBZGFwdGVyKEpQQS5UQUJMRV9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUUpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gQUxMT0NBVElPTl9TSVpFX0FEQVBURVIgPSBidWlsZEludGVnZXJBZGFwdGVyKEpQQS5UQUJMRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFRBQkxFX0FEQVBURVIgPSBidWlsZEFkYXB0ZXIoSlBBLlRBQkxFX0dFTkVSQVRPUl9fVEFCTEUpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdGFibGVBZGFwdGVyOworCXByaXZhdGUgU3RyaW5nIHRhYmxlOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBTQ0hFTUFfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19TQ0hFTUEpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2NoZW1hQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyBzY2hlbWE7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IENBVEFMT0dfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19DQVRBTE9HKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGNhdGFsb2dBZGFwdGVyOworCXByaXZhdGUgU3RyaW5nIGNhdGFsb2c7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFBLX0NPTFVNTl9OQU1FX0FEQVBURVIgPSBidWlsZEFkYXB0ZXIoSlBBLlRBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX05BTUUpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcGtDb2x1bW5OYW1lQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyBwa0NvbHVtbk5hbWU7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0NPTFVNTl9OQU1FX0FEQVBURVIgPSBidWlsZEFkYXB0ZXIoSlBBLlRBQkxFX0dFTkVSQVRPUl9fVkFMVUVfQ09MVU1OX05BTUUpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVDb2x1bW5OYW1lQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWU7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFBLX0NPTFVNTl9WQUxVRV9BREFQVEVSID0gYnVpbGRBZGFwdGVyKEpQQS5UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9WQUxVRSk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBwa0NvbHVtblZhbHVlQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyBwa0NvbHVtblZhbHVlOworCisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8TmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSBuZXcgVmVjdG9yPE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+KCk7CisJcHJpdmF0ZSBmaW5hbCBVbmlxdWVDb25zdHJhaW50c0Fubm90YXRpb25Db250YWluZXIgdW5pcXVlQ29uc3RyYWludHNDb250YWluZXIgPSBuZXcgVW5pcXVlQ29uc3RyYWludHNBbm5vdGF0aW9uQ29udGFpbmVyKCk7CisKKworCXB1YmxpYyBTb3VyY2VUYWJsZUdlbmVyYXRvckFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJc3VwZXIocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJCXRoaXMudGFibGVBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIoVEFCTEVfQURBUFRFUik7CisJCXRoaXMuY2F0YWxvZ0FkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcihDQVRBTE9HX0FEQVBURVIpOworCQl0aGlzLnNjaGVtYUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcihTQ0hFTUFfQURBUFRFUik7CisJCXRoaXMucGtDb2x1bW5OYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKFBLX0NPTFVNTl9OQU1FX0FEQVBURVIpOworCQl0aGlzLnZhbHVlQ29sdW1uTmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcihWQUxVRV9DT0xVTU5fTkFNRV9BREFQVEVSKTsKKwkJdGhpcy5wa0NvbHVtblZhbHVlQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKFBLX0NPTFVNTl9WQUxVRV9BREFQVEVSKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKKwkJdGhpcy50YWJsZSA9IHRoaXMuYnVpbGRUYWJsZShhc3RSb290KTsKKwkJdGhpcy5zY2hlbWEgPSB0aGlzLmJ1aWxkU2NoZW1hKGFzdFJvb3QpOworCQl0aGlzLmNhdGFsb2cgPSB0aGlzLmJ1aWxkQ2F0YWxvZyhhc3RSb290KTsKKwkJdGhpcy5wa0NvbHVtbk5hbWUgPSB0aGlzLmJ1aWxkUGtDb2x1bW5OYW1lKGFzdFJvb3QpOworCQl0aGlzLnZhbHVlQ29sdW1uTmFtZSA9IHRoaXMuYnVpbGRWYWx1ZUNvbHVtbk5hbWUoYXN0Um9vdCk7CisJCXRoaXMucGtDb2x1bW5WYWx1ZSA9IHRoaXMuYnVpbGRQa0NvbHVtblZhbHVlKGFzdFJvb3QpOworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMuaW5pdGlhbGl6ZSh0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyLCBhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOworCQl0aGlzLnNldFRhYmxlKHRoaXMuYnVpbGRUYWJsZShhc3RSb290KSk7CisJCXRoaXMuc2V0U2NoZW1hKHRoaXMuYnVpbGRTY2hlbWEoYXN0Um9vdCkpOworCQl0aGlzLnNldENhdGFsb2codGhpcy5idWlsZENhdGFsb2coYXN0Um9vdCkpOworCQl0aGlzLnNldFBrQ29sdW1uTmFtZSh0aGlzLmJ1aWxkUGtDb2x1bW5OYW1lKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRWYWx1ZUNvbHVtbk5hbWUodGhpcy5idWlsZFZhbHVlQ29sdW1uTmFtZShhc3RSb290KSk7CisJCXRoaXMuc2V0UGtDb2x1bW5WYWx1ZSh0aGlzLmJ1aWxkUGtDb2x1bW5WYWx1ZShhc3RSb290KSk7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy51cGRhdGUodGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lciwgYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEFic3RyYWN0R2VuZXJhdG9yQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdldE5hbWVBZGFwdGVyKCkgeworCQlyZXR1cm4gTkFNRV9BREFQVEVSOworCX0KKworCUBPdmVycmlkZQorCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGdldEluaXRpYWxWYWx1ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBJTklUSUFMX1ZBTFVFX0FEQVBURVI7CisJfQorCisJQE92ZXJyaWRlCisJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZ2V0QWxsb2NhdGlvblNpemVBZGFwdGVyKCkgeworCQlyZXR1cm4gQUxMT0NBVElPTl9TSVpFX0FEQVBURVI7CisJfQorCisKKwkvLyAqKioqKioqKioqIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiB0YWJsZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7CisJCXJldHVybiB0aGlzLnRhYmxlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyB0YWJsZSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy50YWJsZSwgdGFibGUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMudGFibGU7CisJCXRoaXMudGFibGUgPSB0YWJsZTsKKwkJdGhpcy50YWJsZUFkYXB0ZXIuc2V0VmFsdWUodGFibGUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfUFJPUEVSVFksIG9sZCwgdGFibGUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkVGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMudGFibGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShUQUJMRV9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB0YWJsZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXMoVEFCTEVfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKKwl9CisKKwkvLyAqKioqKiBzY2hlbWEKKwlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKKwkJcmV0dXJuIHRoaXMuc2NoZW1hOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnNjaGVtYSwgc2NoZW1hKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLnNjaGVtYTsKKwkJdGhpcy5zY2hlbWEgPSBzY2hlbWE7CisJCXRoaXMuc2NoZW1hQWRhcHRlci5zZXRWYWx1ZShzY2hlbWEpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRTY2hlbWEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuc2NoZW1hQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFNDSEVNQV9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBzY2hlbWFUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKFNDSEVNQV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOworCX0KKworCS8vICoqKioqIGNhdGFsb2cKKwlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7CisJCXJldHVybiB0aGlzLmNhdGFsb2c7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5jYXRhbG9nLCBjYXRhbG9nKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLmNhdGFsb2c7CisJCXRoaXMuY2F0YWxvZyA9IGNhdGFsb2c7CisJCXRoaXMuY2F0YWxvZ0FkYXB0ZXIuc2V0VmFsdWUoY2F0YWxvZyk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ2F0YWxvZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5jYXRhbG9nQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShDQVRBTE9HX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBib29sZWFuIGNhdGFsb2dUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKENBVEFMT0dfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKKwl9CisKKwkvLyAqKioqKiBwayBjb2x1bW4gbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0UGtDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5wa0NvbHVtbk5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0UGtDb2x1bW5OYW1lKFN0cmluZyBwa0NvbHVtbk5hbWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMucGtDb2x1bW5OYW1lLCBwa0NvbHVtbk5hbWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMucGtDb2x1bW5OYW1lOworCQl0aGlzLnBrQ29sdW1uTmFtZSA9IHBrQ29sdW1uTmFtZTsKKwkJdGhpcy5wa0NvbHVtbk5hbWVBZGFwdGVyLnNldFZhbHVlKHBrQ29sdW1uTmFtZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQS19DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkLCBwa0NvbHVtbk5hbWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkUGtDb2x1bW5OYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnBrQ29sdW1uTmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRQa0NvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShQS19DT0xVTU5fTkFNRV9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBwa0NvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKFBLX0NPTFVNTl9OQU1FX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7CisJfQorCisJLy8gKioqKiogdmFsdWUgY29sdW1uIG5hbWUKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlQ29sdW1uTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWVDb2x1bW5OYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlQ29sdW1uTmFtZShTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnZhbHVlQ29sdW1uTmFtZSwgdmFsdWVDb2x1bW5OYW1lKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlQ29sdW1uTmFtZTsKKwkJdGhpcy52YWx1ZUNvbHVtbk5hbWUgPSB2YWx1ZUNvbHVtbk5hbWU7CisJCXRoaXMudmFsdWVDb2x1bW5OYW1lQWRhcHRlci5zZXRWYWx1ZSh2YWx1ZUNvbHVtbk5hbWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgdmFsdWVDb2x1bW5OYW1lKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlQ29sdW1uTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZUNvbHVtbk5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQ09MVU1OX05BTUVfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gdmFsdWVDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhWQUxVRV9DT0xVTU5fTkFNRV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOworCX0KKworCS8vICoqKioqIHBrIGNvbHVtbiB2YWx1ZQorCXB1YmxpYyBTdHJpbmcgZ2V0UGtDb2x1bW5WYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMucGtDb2x1bW5WYWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQa0NvbHVtblZhbHVlKFN0cmluZyBwa0NvbHVtblZhbHVlKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnBrQ29sdW1uVmFsdWUsIHBrQ29sdW1uVmFsdWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMucGtDb2x1bW5WYWx1ZTsKKwkJdGhpcy5wa0NvbHVtblZhbHVlID0gcGtDb2x1bW5WYWx1ZTsKKwkJdGhpcy5wa0NvbHVtblZhbHVlQWRhcHRlci5zZXRWYWx1ZShwa0NvbHVtblZhbHVlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSwgb2xkLCBwa0NvbHVtblZhbHVlKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFBrQ29sdW1uVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMucGtDb2x1bW5WYWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRQa0NvbHVtblZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoUEtfQ09MVU1OX1ZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBib29sZWFuIHBrQ29sdW1uVmFsdWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKFBLX0NPTFVNTl9WQUxVRV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOworCX0KKworCS8vICoqKioqIHVuaXF1ZSBjb25zdHJhaW50cworCXB1YmxpYyBMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPih0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKTsKKwl9CisKKwlMaXN0SXRlcmF0b3I8TmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gbmVzdGFibGVVbmlxdWVDb25zdHJhaW50cygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPih0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKTsKKwl9CisKKwlwdWJsaWMgaW50IHVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludHMuc2l6ZSgpOworCX0KKworCXB1YmxpYyBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnRBdChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludHMuZ2V0KGluZGV4KTsKKwl9CisKKwlwdWJsaWMgaW50IGluZGV4T2ZVbmlxdWVDb25zdHJhaW50KFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnQpIHsKKwkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludHMuaW5kZXhPZih1bmlxdWVDb25zdHJhaW50KTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgeworCQlyZXR1cm4gKE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pIEFubm90YXRpb25Db250YWluZXJUb29scy5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4LCB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyKTsKKwl9CisKKwlOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGFkZFVuaXF1ZUNvbnN0cmFpbnRJbnRlcm5hbCgpIHsKKwkJTmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50ID0gdGhpcy5idWlsZFVuaXF1ZUNvbnN0cmFpbnQodGhpcy51bmlxdWVDb25zdHJhaW50cy5zaXplKCkpOworCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmFkZCh1bmlxdWVDb25zdHJhaW50KTsKKwkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnQ7CisJfQorCQorCU5lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gYnVpbGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgeworCQlyZXR1cm4gbmV3IFNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKHRoaXMsIHRoaXMubWVtYmVyLCBidWlsZFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uQWRhcHRlcihpbmRleCkpOworCX0KKworCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkVW5pcXVlQ29uc3RyYWludEFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCkgeworCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKHRoaXMuZGFhLCBKUEEuVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFMsIGluZGV4LCBKUEEuVU5JUVVFX0NPTlNUUkFJTlQpOworCX0KKworCXZvaWQgdW5pcXVlQ29uc3RyYWludEFkZGVkKGludCBpbmRleCwgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBjb25zdHJhaW50KSB7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChVTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIGNvbnN0cmFpbnQpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy5tb3ZlTmVzdGVkQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXIpOworCX0KKworCU5lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gbW92ZVVuaXF1ZUNvbnN0cmFpbnRJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy51bmlxdWVDb25zdHJhaW50cywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KS5nZXQodGFyZ2V0SW5kZXgpOworCX0KKworCXZvaWQgdW5pcXVlQ29uc3RyYWludE1vdmVkKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXRoaXMuZmlyZUl0ZW1Nb3ZlZChVTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgeworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMucmVtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbmRleCwgdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lcik7CisJfQorCisJTmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiByZW1vdmVVbmlxdWVDb25zdHJhaW50SW50ZXJuYWwoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnJlbW92ZShpbmRleCk7CisJfQorCisJdm9pZCB1bmlxdWVDb25zdHJhaW50UmVtb3ZlZChpbnQgaW5kZXgsIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gY29uc3RyYWludCkgeworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChVTklRVUVfQ09OU1RSQUlOVFNfTElTVCwgaW5kZXgsIGNvbnN0cmFpbnQpOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQWRhcHRlcihTdHJpbmcgZWxlbWVudE5hbWUpIHsKKwkJcmV0dXJuIGJ1aWxkQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIGVsZW1lbnROYW1lKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZEludGVnZXJBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgeworCQlyZXR1cm4gYnVpbGRJbnRlZ2VyQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIGVsZW1lbnROYW1lKTsKKwl9CisKKworCS8vICoqKioqKioqKiogdW5pcXVlIGNvbnN0cmFpbnQgY29udGFpbmVyICoqKioqKioqKioKKworCS8qKgorCSAqIGFkYXB0IHRoZSBBbm5vdGF0aW9uQ29udGFpbmVyIGludGVyZmFjZSB0byB0aGUgdGFibGUgZ2VuZXJhdG9yJ3MgdW5pcXVlIGNvbnN0cmFpbnRzCisJICovCisJY2xhc3MgVW5pcXVlQ29uc3RyYWludHNBbm5vdGF0aW9uQ29udGFpbmVyCisJCWltcGxlbWVudHMgQW5ub3RhdGlvbkNvbnRhaW5lcjxOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiAKKwl7CisJCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKSB7CisJCQlyZXR1cm4gU291cmNlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLnRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKKwkJfQorCisJCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRDb250YWluZXJKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCQlyZXR1cm4gU291cmNlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLnRoaXMuZ2V0SmR0QW5ub3RhdGlvbihhc3RSb290KTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7CisJCQlyZXR1cm4gSlBBLlRBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgeworCQkJcmV0dXJuIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwkJfQorCisJCXB1YmxpYyBMaXN0SXRlcmF0b3I8TmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gbmVzdGVkQW5ub3RhdGlvbnMoKSB7CisJCQlyZXR1cm4gU291cmNlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLnRoaXMubmVzdGFibGVVbmlxdWVDb25zdHJhaW50cygpOworCQl9CisKKwkJcHVibGljIGludCBuZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSB7CisJCQlyZXR1cm4gU291cmNlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLnRoaXMudW5pcXVlQ29uc3RyYWludHNTaXplKCk7CisJCX0KKworCQlwdWJsaWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBhZGROZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoKSB7CisJCQlyZXR1cm4gU291cmNlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLnRoaXMuYWRkVW5pcXVlQ29uc3RyYWludEludGVybmFsKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uQWRkZWQoaW50IGluZGV4LCBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb24pIHsKKwkJCVNvdXJjZVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi50aGlzLnVuaXF1ZUNvbnN0cmFpbnRBZGRlZChpbmRleCwgbmVzdGVkQW5ub3RhdGlvbik7CisJCX0KKworCQlwdWJsaWMgTmVzdGFibGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBtb3ZlTmVzdGVkQW5ub3RhdGlvbkludGVybmFsKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCQlyZXR1cm4gU291cmNlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLnRoaXMubW92ZVVuaXF1ZUNvbnN0cmFpbnRJbnRlcm5hbCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl9CisKKwkJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvbk1vdmVkKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCQlTb3VyY2VUYWJsZUdlbmVyYXRvckFubm90YXRpb24udGhpcy51bmlxdWVDb25zdHJhaW50TW92ZWQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJfQorCisJCXB1YmxpYyBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHJlbW92ZU5lc3RlZEFubm90YXRpb25JbnRlcm5hbChpbnQgaW5kZXgpIHsKKwkJCXJldHVybiBTb3VyY2VUYWJsZUdlbmVyYXRvckFubm90YXRpb24udGhpcy5yZW1vdmVVbmlxdWVDb25zdHJhaW50SW50ZXJuYWwoaW5kZXgpOworCQl9CisKKwkJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvblJlbW92ZWQoaW50IGluZGV4LCBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb24pIHsKKwkJCVNvdXJjZVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi50aGlzLnVuaXF1ZUNvbnN0cmFpbnRSZW1vdmVkKGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVRlbXBvcmFsQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVRlbXBvcmFsQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyODExMjYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVGVtcG9yYWxBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWwKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVRlbXBvcmFsQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+CisJaW1wbGVtZW50cyBUZW1wb3JhbEFubm90YXRpb24KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOworCXByaXZhdGUgVGVtcG9yYWxUeXBlIHZhbHVlOworCisKKwlwdWJsaWMgU291cmNlVGVtcG9yYWxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhdHRyaWJ1dGUsIFZBTFVFX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnNldFZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIFRlbXBvcmFsQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiB2YWx1ZQorCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFRlbXBvcmFsVHlwZSB2YWx1ZSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy52YWx1ZSwgdmFsdWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJVGVtcG9yYWxUeXBlIG9sZCA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoVGVtcG9yYWxUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZSh2YWx1ZSkpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOworCX0KKworCXByaXZhdGUgVGVtcG9yYWxUeXBlIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIFRlbXBvcmFsVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5URU1QT1JBTF9fVkFMVUUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVRyYW5zaWVudEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VUcmFuc2llbnRBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxZmYxOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VUcmFuc2llbnRBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworCisvKioKKyAqIGphdmF4LnBlcnNpc3RlbmNlLlRyYW5zaWVudAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlVHJhbnNpZW50QW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+CisJaW1wbGVtZW50cyBUcmFuc2llbnRBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCQorCisJcHVibGljIFNvdXJjZVRyYW5zaWVudEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCS8vIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQorCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJLy8gbm90aGluZyB0byB1cGRhdGUKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0ZWIwYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5VbmlxdWVDb25zdHJhaW50CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxNZW1iZXI+CisJaW1wbGVtZW50cyBOZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpQQS5VTklRVUVfQ09OU1RSQUlOVCk7CisKKwlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBjb2x1bW5OYW1lc0RlY2xhcmF0aW9uQWRhcHRlcjsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gY29sdW1uTmFtZXNBZGFwdGVyOworCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gY29sdW1uTmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKworCisJcHVibGljIFNvdXJjZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBpZGFhLCBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgaWRhYSkpOworCQl0aGlzLmNvbHVtbk5hbWVzRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihpZGFhLCBKUEEuVU5JUVVFX0NPTlNUUkFJTlRfX0NPTFVNTl9OQU1FUyk7CisJCXRoaXMuY29sdW1uTmFtZXNBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLmNvbHVtbk5hbWVzRGVjbGFyYXRpb25BZGFwdGVyKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSkgeworCQlyZXR1cm4gbmV3IFNob3J0Q2lyY3VpdEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5tZW1iZXIsIGRhZWEpOworCX0KKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgeworCQlyZXR1cm4gYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nW10+IGNvbnZlcnRlcikgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBmYWxzZSwgY29udmVydGVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCVN0cmluZ1tdIGphdmFDb2x1bW5OYW1lcyA9IHRoaXMuY29sdW1uTmFtZXNBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGphdmFDb2x1bW5OYW1lcy5sZW5ndGg7IGkrKykgeworCQkJdGhpcy5jb2x1bW5OYW1lcy5hZGQoamF2YUNvbHVtbk5hbWVzW2ldKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnVwZGF0ZUNvbHVtbk5hbWVzKGFzdFJvb3QpOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVDb2x1bW5OYW1lcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlTdHJpbmdbXSBqYXZhQ29sdW1uTmFtZXMgPSB0aGlzLmNvbHVtbk5hbWVzQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwkJdGhpcy5zeW5jaHJvbml6ZUxpc3QoQXJyYXlzLmFzTGlzdChqYXZhQ29sdW1uTmFtZXMpLCB0aGlzLmNvbHVtbk5hbWVzLCBDT0xVTU5fTkFNRVNfTElTVCk7CisJfQorCisJcHVibGljIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBnZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKSB7CisJCXJldHVybiAoSW5kZXhlZEFubm90YXRpb25BZGFwdGVyKSB0aGlzLmFubm90YXRpb25BZGFwdGVyOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMuY29sdW1uTmFtZXMpOworCX0KKworCisJLy8gKioqKioqKioqKiBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBjb2x1bW4gbmFtZXMKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmNvbHVtbk5hbWVzKTsKKwl9CisKKwlwdWJsaWMgaW50IGNvbHVtbk5hbWVzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29sdW1uTmFtZXMuc2l6ZSgpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZENvbHVtbk5hbWUoU3RyaW5nIGNvbHVtbk5hbWUpIHsKKwkJdGhpcy5hZGRDb2x1bW5OYW1lKHRoaXMuY29sdW1uTmFtZXMuc2l6ZSgpLCBjb2x1bW5OYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRDb2x1bW5OYW1lKGludCBpbmRleCwgU3RyaW5nIGNvbHVtbk5hbWUpIHsKKwkJdGhpcy5hZGRDb2x1bW5OYW1lXyhpbmRleCwgY29sdW1uTmFtZSk7CisJCXRoaXMuY29sdW1uTmFtZXNBZGFwdGVyLnNldFZhbHVlKHRoaXMuY29sdW1uTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW3RoaXMuY29sdW1uTmFtZXMuc2l6ZSgpXSkpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRDb2x1bW5OYW1lXyhpbnQgaW5kZXgsIFN0cmluZyBjb2x1bW5OYW1lKSB7CisJCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgY29sdW1uTmFtZSwgdGhpcy5jb2x1bW5OYW1lcywgQ09MVU1OX05BTUVTX0xJU1QpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVDb2x1bW5OYW1lKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCXRoaXMubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmNvbHVtbk5hbWVzLCBDT0xVTU5fTkFNRVNfTElTVCk7CisJCXRoaXMuY29sdW1uTmFtZXNBZGFwdGVyLnNldFZhbHVlKHRoaXMuY29sdW1uTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW3RoaXMuY29sdW1uTmFtZXMuc2l6ZSgpXSkpOworCX0KKworCXB1YmxpYyBib29sZWFuIGNvbHVtbk5hbWVzVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyh0aGlzLmNvbHVtbk5hbWVzRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbk5hbWUoU3RyaW5nIGNvbHVtbk5hbWUpIHsKKwkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoY29sdW1uTmFtZSwgdGhpcy5jb2x1bW5OYW1lcywgQ09MVU1OX05BTUVTX0xJU1QpOworCQl0aGlzLmNvbHVtbk5hbWVzQWRhcHRlci5zZXRWYWx1ZSh0aGlzLmNvbHVtbk5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1t0aGlzLmNvbHVtbk5hbWVzLnNpemUoKV0pKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5OYW1lKGludCBpbmRleCkgeworCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5jb2x1bW5OYW1lcywgQ09MVU1OX05BTUVTX0xJU1QpOworCQl0aGlzLmNvbHVtbk5hbWVzQWRhcHRlci5zZXRWYWx1ZSh0aGlzLmNvbHVtbk5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1t0aGlzLmNvbHVtbk5hbWVzLnNpemUoKV0pKTsKKwl9CisKKworCS8vICoqKioqKioqKiogTmVzdGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKSB7CisJCVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIG9sZENvbnN0cmFpbnQgPSAoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24pIG9sZEFubm90YXRpb247CisJCWZvciAoU3RyaW5nIGNvbHVtbk5hbWUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob2xkQ29uc3RyYWludC5jb2x1bW5OYW1lcygpKSkgeworCQkJdGhpcy5hZGRDb2x1bW5OYW1lKGNvbHVtbk5hbWUpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7CisJCXRoaXMuZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkubW92ZUFubm90YXRpb24obmV3SW5kZXgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVZlcnNpb25Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVmVyc2lvbkFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjI3ZDJjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVZlcnNpb25Bbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKKworLyoqCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5WZXJzaW9uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VWZXJzaW9uQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+CisJaW1wbGVtZW50cyBWZXJzaW9uQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCisJcHVibGljIFNvdXJjZVZlcnNpb25Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJLy8gbm90aGluZyB0byB1cGRhdGUKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vT3JtWG1sUmVzb3VyY2VQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS9Pcm1YbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzYmFjZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vT3JtWG1sUmVzb3VyY2VQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5BYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOworCitwdWJsaWMgY2xhc3MgT3JtWG1sUmVzb3VyY2VQcm92aWRlcgorCWV4dGVuZHMgQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyCisJaW1wbGVtZW50cyBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCit7CisJLyoqCisJICogKENvbnZlbmllbmNlIG1ldGhvZCkgUmV0dXJucyBhbiBPUk0gcmVzb3VyY2UgbW9kZWwgcHJvdmlkZXIgZm9yIAorCSAqIHRoZSBnaXZlbiBmaWxlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtWG1sUmVzb3VyY2VQcm92aWRlciBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyKElGaWxlIGZpbGUpIHsKKwkJcmV0dXJuIGdldFhtbFJlc291cmNlUHJvdmlkZXJfKGZpbGUuZ2V0UHJvamVjdCgpLCBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7CisJfQorCQorCS8qKgorCSAqIChDb252ZW5pZW5jZSBtZXRob2QpIFJldHVybnMgYW4gT1JNIHJlc291cmNlIG1vZGVsIHByb3ZpZGVyIGZvcgorCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGluIHRoZSBzcGVjaWZpZWQgZGVwbG95IGxvY2F0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBPcm1YbWxSZXNvdXJjZVByb3ZpZGVyIGdldFhtbFJlc291cmNlUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGRlcGxveUxvY2F0aW9uKSB7CisJCXJldHVybiBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyXyhwcm9qZWN0LCBKcHRDb3JlUGx1Z2luLmdldERlcGxveW1lbnRVUkkocHJvamVjdCwgZGVwbG95TG9jYXRpb24pKTsKKwl9CisJCisJLyoqCisJICogKENvbnZlbmllbmNlIG1ldGhvZCkgUmV0dXJucyBhbiBPUk0gcmVzb3VyY2UgbW9kZWwgcHJvdmlkZXIgZm9yIAorCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGluIHRoZSBkZWZhdWx0IGRlcGxveSBsb2NhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtWG1sUmVzb3VyY2VQcm92aWRlciBnZXREZWZhdWx0WG1sUmVzb3VyY2VQcm92aWRlcihJUHJvamVjdCBwcm9qZWN0KSB7CisJCXJldHVybiBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyKHByb2plY3QsIEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIE9ybVhtbFJlc291cmNlUHJvdmlkZXIgZ2V0WG1sUmVzb3VyY2VQcm92aWRlcl8oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGxvY2F0aW9uKSB7CisJCXJldHVybiBuZXcgT3JtWG1sUmVzb3VyY2VQcm92aWRlcihwcm9qZWN0LCBuZXcgUGF0aChsb2NhdGlvbikpOworCX0KKwkKKwkKKwlwdWJsaWMgT3JtWG1sUmVzb3VyY2VQcm92aWRlcihJUHJvamVjdCBwcm9qZWN0KSB7CisJCXRoaXMocHJvamVjdCwgbmV3IFBhdGgoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKSk7CisJfQorCQorCXB1YmxpYyBPcm1YbWxSZXNvdXJjZVByb3ZpZGVyKElQcm9qZWN0IHByb2plY3QsIElQYXRoIGZpbGVQYXRoKSB7CisJCXN1cGVyKHByb2plY3QsIGZpbGVQYXRoLCBKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVSb290KE9iamVjdCBjb25maWcpIHsKKwkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSAoSURhdGFNb2RlbCkgY29uZmlnOworCQlYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVudGl0eU1hcHBpbmdzKCk7CisJCWVudGl0eU1hcHBpbmdzLnNldFZlcnNpb24oZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFZFUlNJT04pKTsKKwkJZ2V0UmVzb3VyY2VDb250ZW50cygpLmFkZChlbnRpdHlNYXBwaW5ncyk7CisJCQorCQlBY2Nlc3NUeXBlIGRlZmF1bHRBY2Nlc3MgPSAoQWNjZXNzVHlwZSkgZGF0YU1vZGVsLmdldFByb3BlcnR5KERFRkFVTFRfQUNDRVNTKTsgCisJCWlmIChkZWZhdWx0QWNjZXNzICE9IG51bGwpIHsKKwkJCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHB1TWV0YWRhdGEgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOworCQkJZW50aXR5TWFwcGluZ3Muc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocHVNZXRhZGF0YSk7CisJCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwdURlZmF1bHRzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJCXB1TWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocHVEZWZhdWx0cyk7CisJCQlwdURlZmF1bHRzLnNldEFjY2VzcyhkZWZhdWx0QWNjZXNzKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmZDA2MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0Fzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSm9pbkNvbHVtblRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUpvaW5Db2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5UcmFuc2xhdG9yKEpPSU5fQ09MVU1OLCBPUk1fUEtHLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfSm9pbkNvbHVtbnMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9BdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZGZjMzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9BdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIAotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDb2x1bW5UcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb2x1bW5UcmFuc2xhdG9yKENPTFVNTiwgT1JNX1BLRy5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9Db2x1bW4oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9BdHRyaWJ1dGVzVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9BdHRyaWJ1dGVzVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjc4ODMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvQXR0cmlidXRlc1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlc1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIAotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBBdHRyaWJ1dGVzVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVJZFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUVtYmVkZGVkSWRUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVCYXNpY1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVZlcnNpb25UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVNYW55VG9PbmVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVPbmVUb01hbnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVPbmVUb09uZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU1hbnlUb01hbnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVFbWJlZGRlZFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVRyYW5zaWVudFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlSWRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IElkVHJhbnNsYXRvcihJRCwgT1JNX1BLRy5nZXRBdHRyaWJ1dGVzX0lkcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUVtYmVkZGVkSWRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtYmVkZGVkSWRUcmFuc2xhdG9yKEVNQkVEREVEX0lELCBPUk1fUEtHLmdldEF0dHJpYnV0ZXNfRW1iZWRkZWRJZHMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVCYXNpY1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQmFzaWNUcmFuc2xhdG9yKEJBU0lDLCBPUk1fUEtHLmdldEF0dHJpYnV0ZXNfQmFzaWNzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlVmVyc2lvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVmVyc2lvblRyYW5zbGF0b3IoVkVSU0lPTiwgT1JNX1BLRy5nZXRBdHRyaWJ1dGVzX1ZlcnNpb25zKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTWFueVRvT25lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBNYW55VG9PbmVUcmFuc2xhdG9yKE1BTllfVE9fT05FLCBPUk1fUEtHLmdldEF0dHJpYnV0ZXNfTWFueVRvT25lcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU9uZVRvTWFueVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgT25lVG9NYW55VHJhbnNsYXRvcihPTkVfVE9fTUFOWSwgT1JNX1BLRy5nZXRBdHRyaWJ1dGVzX09uZVRvTWFueXMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVPbmVUb09uZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgT25lVG9PbmVUcmFuc2xhdG9yKE9ORV9UT19PTkUsIE9STV9QS0cuZ2V0QXR0cmlidXRlc19PbmVUb09uZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVNYW55VG9NYW55VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBNYW55VG9NYW55VHJhbnNsYXRvcihNQU5ZX1RPX01BTlksIE9STV9QS0cuZ2V0QXR0cmlidXRlc19NYW55VG9NYW55cygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUVtYmVkZGVkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbWJlZGRlZFRyYW5zbGF0b3IoRU1CRURERUQsIE9STV9QS0cuZ2V0QXR0cmlidXRlc19FbWJlZGRlZHMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUcmFuc2llbnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zaWVudFRyYW5zbGF0b3IoVFJBTlNJRU5ULCBPUk1fUEtHLmdldEF0dHJpYnV0ZXNfVHJhbnNpZW50cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0Jhc2ljVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9CYXNpY1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2YzVjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0Jhc2ljVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuY29tbW9uLnRyYW5zbGF0b3JzLkJvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIAotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBCYXNpY1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEJhc2ljSW1wbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU9wdGlvbmFsVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ29sdW1uVHJhbnNsYXRvcigpLCAKLQkJCWNyZWF0ZUxvYlRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVRlbXBvcmFsVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRW51bWVyYXRlZFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEZFVENILCBPUk1fUEtHLmdldFhtbEJhc2ljX0ZldGNoKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlT3B0aW9uYWxUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKE9QVElPTkFMLCBPUk1fUEtHLmdldFhtbEJhc2ljX09wdGlvbmFsKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb2x1bW5UcmFuc2xhdG9yKENPTFVNTiwgT1JNX1BLRy5nZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUxvYlRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihMT0IsIE9STV9QS0cuZ2V0WG1sQmFzaWNfTG9iKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlVGVtcG9yYWxUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVEVNUE9SQUwsIE9STV9QS0cuZ2V0WG1sQmFzaWNfVGVtcG9yYWwoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVFbnVtZXJhdGVkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVOVU1FUkFURUQsIE9STV9QS0cuZ2V0WG1sQmFzaWNfRW51bWVyYXRlZCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0Nhc2NhZGVUeXBlVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9DYXNjYWRlVHlwZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2ZjRhNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0Nhc2NhZGVUeXBlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIENhc2NhZGVUeXBlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIENhc2NhZGVUeXBlVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZUltcGwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlQ2FzY2FkZUFsbFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNhc2NhZGVQZXJzaXN0VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ2FzY2FkZU1lcmdlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ2FzY2FkZVJlbW92ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNhc2NhZGVSZWZyZXNoVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDYXNjYWRlQWxsVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKENBU0NBREVfQUxMLCBPUk1fUEtHLmdldENhc2NhZGVUeXBlX0Nhc2NhZGVBbGwoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDYXNjYWRlUGVyc2lzdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihDQVNDQURFX1BFUlNJU1QsIE9STV9QS0cuZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDYXNjYWRlTWVyZ2VUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoQ0FTQ0FERV9NRVJHRSwgT1JNX1BLRy5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlTWVyZ2UoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDYXNjYWRlUmVtb3ZlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKENBU0NBREVfUkVNT1ZFLCBPUk1fUEtHLmdldENhc2NhZGVUeXBlX0Nhc2NhZGVSZW1vdmUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNhc2NhZGVSZWZyZXNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKENBU0NBREVfUkVGUkVTSCwgT1JNX1BLRy5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlUmVmcmVzaCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0NvbHVtblJlc3VsdFRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvQ29sdW1uUmVzdWx0VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTljNDA1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvQ29sdW1uUmVzdWx0VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb2x1bW5SZXN1bHRUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgQ29sdW1uUmVzdWx0VHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIEVORF9UQUdfTk9fSU5ERU5UKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldENvbHVtblJlc3VsdF9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvQ29sdW1uVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9Db2x1bW5UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOTQxOTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9Db2x1bW5UcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuY29tbW9uLnRyYW5zbGF0b3JzLkJvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb2x1bW5UcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17CQkKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIENvbHVtblRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBFTkRfVEFHX05PX0lOREVOVCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW5JbXBsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVVuaXF1ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU51bGxhYmxlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSW5zZXJ0YWJsZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVVwZGF0YWJsZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVUYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUxlbmd0aFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVByZWNpc2lvblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVNjYWxlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbE5hbWVkQ29sdW1uX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVVbmlxdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKFVOSVFVRSwgT1JNX1BLRy5nZXRYbWxBYnN0cmFjdENvbHVtbl9VbmlxdWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOdWxsYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQm9vbGVhblRyYW5zbGF0b3IoTlVMTEFCTEUsIE9STV9QS0cuZ2V0WG1sQWJzdHJhY3RDb2x1bW5fTnVsbGFibGUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVJbnNlcnRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihJTlNFUlRBQkxFLCBPUk1fUEtHLmdldFhtbEFic3RyYWN0Q29sdW1uX0luc2VydGFibGUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVVcGRhdGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKFVQREFUQUJMRSwgT1JNX1BLRy5nZXRYbWxBYnN0cmFjdENvbHVtbl9VcGRhdGFibGUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDb2x1bW5EZWZpbml0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKENPTFVNTl9ERUZJTklUSU9OLCBPUk1fUEtHLmdldFhtbE5hbWVkQ29sdW1uX0NvbHVtbkRlZmluaXRpb24oKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihUQUJMRSwgT1JNX1BLRy5nZXRYbWxBYnN0cmFjdENvbHVtbl9UYWJsZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUxlbmd0aFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihMRU5HVEgsIE9STV9QS0cuZ2V0WG1sQ29sdW1uX0xlbmd0aCgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVByZWNpc2lvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihQUkVDSVNJT04sIE9STV9QS0cuZ2V0WG1sQ29sdW1uX1ByZWNpc2lvbigpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNjYWxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFNDQUxFLCBPUk1fUEtHLmdldFhtbENvbHVtbl9TY2FsZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0Rpc2NyaW1pbmF0b3JDb2x1bW5UcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0Rpc2NyaW1pbmF0b3JDb2x1bW5UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NjYyOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9EaXNjcmltaW5hdG9yQ29sdW1uVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIERpc2NyaW1pbmF0b3JDb2x1bW5UcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17CQotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgRGlzY3JpbWluYXRvckNvbHVtblRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBFTkRfVEFHX05PX0lOREVOVCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVEaXNjcm1pbmlhdG9yVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVMZW5ndGhUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxOYW1lZENvbHVtbl9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvciBjcmVhdGVEaXNjcm1pbmlhdG9yVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihESVNDUklNSU5BVE9SX1RZUEUsIE9STV9QS0cuZ2V0WG1sRGlzY3JpbWluYXRvckNvbHVtbl9EaXNjcmltaW5hdG9yVHlwZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQ09MVU1OX0RFRklOSVRJT04sIE9STV9QS0cuZ2V0WG1sTmFtZWRDb2x1bW5fQ29sdW1uRGVmaW5pdGlvbigpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgY3JlYXRlTGVuZ3RoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKExFTkdUSCwgT1JNX1BLRy5nZXRYbWxEaXNjcmltaW5hdG9yQ29sdW1uX0xlbmd0aCgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VtYmVkZGFibGVUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VtYmVkZGFibGVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MTM1OWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FbWJlZGRhYmxlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIEVtYmVkZGFibGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17CQotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgRW1iZWRkYWJsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZUNsYXNzVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTWV0YWRhdGFDb21wbGV0ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQXR0cmlidXRlc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ2xhc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQ0xBU1MsIE9STV9QS0cuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19DbGFzc05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVBY2Nlc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQUNDRVNTLCBPUk1fUEtHLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfQWNjZXNzKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTWV0YWRhdGFDb21wbGV0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihNRVRBREFUQV9DT01QTEVURSwgT1JNX1BLRy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX01ldGFkYXRhQ29tcGxldGUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVEZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihERVNDUklQVElPTiwgT1JNX1BLRy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0Rlc2NyaXB0aW9uKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQXR0cmlidXRlc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQXR0cmlidXRlc1RyYW5zbGF0b3IoQVRUUklCVVRFUywgT1JNX1BLRy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FbWJlZGRlZElkVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FbWJlZGRlZElkVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGMxZTJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW1iZWRkZWRJZFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRJZFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIEVtYmVkZGVkSWRUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbWJlZGRlZElkSW1wbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKEFUVFJJQlVURV9PVkVSUklERSwgT1JNX1BLRy5nZXRCYXNlWG1sRW1iZWRkZWRfQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VtYmVkZGVkVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FbWJlZGRlZFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0YjhiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VtYmVkZGVkVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIEVtYmVkZGVkVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW1iZWRkZWRJbXBsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5BTUUsIE9STV9QS0cuZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcihBVFRSSUJVVEVfT1ZFUlJJREUsIE9STV9QS0cuZ2V0QmFzZVhtbEVtYmVkZGVkX0F0dHJpYnV0ZU92ZXJyaWRlcygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmJkZWUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogVGhpcyB0cmFuc2xhdG9yIGlzIHRvIGJlIHVzZWQgZm9yIGVtcHR5IHhtbCB0YWdzIHRoYXQgY29ycmVzcG9uZAotICogdG8gYSBib29sZWFuIGF0dHJpYnV0ZSBpbiB0aGUgZW1mIG1vZGVsLiAgCi0gKiBjYXNjYWRlLXBlcnNpc3QgaXMgYW4gZXhhbXBsZSBmcm9tIHRoZSBvcm0ueHNkOgotICogCi0gKiAJPHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM+Ci0gKiAJCTxjYXNjYWRlLXBlcnNpc3QvPiAgICAgICAgCi0gKiAJPC9wZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzPiAgPT0+ICBjYXNjYWRlUGVyc2lzdCA9PSB0cnVlCi0gKiAKLSAqIHZzLgotICogCi0gKiAJPHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM+ICAKLSAqIAk8L3BlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM+ICA9PT4gIGNhc2NhZGVQZXJzaXN0ID09IGZhbHNlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi17Ci0JcHVibGljIEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgZmVhdHVyZSwgRU1QVFlfVEFHIHwgQk9PTEVBTl9GRUFUVVJFKTsKLQl9Ci0KLQlwdWJsaWMgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgc3R5bGUgfCBFTVBUWV9UQUcgfCBCT09MRUFOX0ZFQVRVUkUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCS8vIEkgYW0gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZC4gIFRoaXMgaXMgc28gdGhlIHRhZyB3aWxsIGJlIHJlbW92ZWQgd2hlbiAKLQkJLy8gdGhlIHZhbHVlIGlzIGZhbHNlLgotCQkvLyBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyBhIGJ1ZyBpbiB0aGUgZWNvcmUgb3IgbWF5YmUgaW4gdGhlIHRyYW5zbGF0b3JzLCAKLQkJLy8gYnV0IEkgcmVhbGx5IGRvbid0IHRoaW5rIHRoYXQgd2Ugc2hvdWxkIGhhdmUgdG8gZGVwZW5kIG9uIHRoZSBib29sZWFuCi0JCS8vIGJlaW5nICJ1bnNldCIgdG8gcmVtb3ZlIHRoZSB0YWcuCi0JCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgc3VwZXIuZ2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJcmV0dXJuICh2YWx1ZSA9PSBCb29sZWFuLlRSVUUpID8gdmFsdWUgOiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FbnRpdHlMaXN0ZW5lclRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW50aXR5TGlzdGVuZXJUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjgwMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FbnRpdHlMaXN0ZW5lclRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5TGlzdGVuZXJUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBFbnRpdHlMaXN0ZW5lclRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQcmVQZXJzaXN0VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUG9zdFBlcnNpc3RUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQcmVSZW1vdmVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQb3N0UmVtb3ZlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUHJlVXBkYXRlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUG9zdFVwZGF0ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVBvc3RMb2FkVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDbGFzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihDTEFTUywgT1JNX1BLRy5nZXRFbnRpdHlMaXN0ZW5lcl9DbGFzc05hbWUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQcmVQZXJzaXN0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUFJFX1BFUlNJU1QsIE9STV9QS0cuZ2V0RW50aXR5TGlzdGVuZXJfUHJlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVBvc3RQZXJzaXN0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUE9TVF9QRVJTSVNULCBPUk1fUEtHLmdldEVudGl0eUxpc3RlbmVyX1Bvc3RQZXJzaXN0KCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUHJlUmVtb3ZlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUFJFX1JFTU9WRSwgT1JNX1BLRy5nZXRFbnRpdHlMaXN0ZW5lcl9QcmVSZW1vdmUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQb3N0UmVtb3ZlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUE9TVF9SRU1PVkUsIE9STV9QS0cuZ2V0RW50aXR5TGlzdGVuZXJfUG9zdFJlbW92ZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVByZVVwZGF0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFBSRV9VUERBVEUsIE9STV9QS0cuZ2V0RW50aXR5TGlzdGVuZXJfUHJlVXBkYXRlKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUG9zdFVwZGF0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFBPU1RfVVBEQVRFLCBPUk1fUEtHLmdldEVudGl0eUxpc3RlbmVyX1Bvc3RVcGRhdGUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQb3N0TG9hZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFBPU1RfTE9BRCwgT1JNX1BLRy5nZXRFbnRpdHlMaXN0ZW5lcl9Qb3N0TG9hZCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW50aXR5TGlzdGVuZXJzVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTlhNjYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW50aXR5TGlzdGVuZXJzVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZUVudGl0eUxpc3RlbmVyVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVFbnRpdHlMaXN0ZW5lclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW50aXR5TGlzdGVuZXJUcmFuc2xhdG9yKEVOVElUWV9MSVNURU5FUiwgT1JNX1BLRy5nZXRFbnRpdHlMaXN0ZW5lcnNfRW50aXR5TGlzdGVuZXJzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW50aXR5TWFwcGluZ3NUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VudGl0eU1hcHBpbmdzVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTU5Nzc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW50aXR5TWFwcGluZ3NUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Sb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3NUcmFuc2xhdG9yIGV4dGVuZHMgUm9vdFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXB1YmxpYyBzdGF0aWMgRW50aXR5TWFwcGluZ3NUcmFuc2xhdG9yIElOU1RBTkNFID0gbmV3IEVudGl0eU1hcHBpbmdzVHJhbnNsYXRvcigpOwotCQotCQotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwotCQotCQotCXB1YmxpYyBFbnRpdHlNYXBwaW5nc1RyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKEVOVElUWV9NQVBQSU5HUywgT1JNX1BLRy5nZXRYbWxFbnRpdHlNYXBwaW5ncygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlMsIFBFUlNJU1RFTkNFX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OU19YU0ksIFhTSV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYU0lfU0NIRU1BX0xPQ0FUSU9OLCBQRVJTSVNURU5DRV9OU19VUkwgKyAnICcgKyBPUk1fU0NIRU1BX0xPQ18xXzApLAotCQkJY3JlYXRlVmVyc2lvblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQYWNrYWdlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVOYW1lZFF1ZXJ5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTmFtZWROYXRpdmVRdWVyeVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVNxbFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVNYXBwZWRTdXBlcmNsYXNzVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRW50aXR5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRW1iZWRkYWJsZVRyYW5zbGF0b3IoKQotCQl9OwotCX0JCi0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVZlcnNpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVkVSU0lPTiwgT1JNX1BLRy5nZXRYbWxFbnRpdHlNYXBwaW5nc19WZXJzaW9uKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIE9STV9QS0cuZ2V0WG1sRW50aXR5TWFwcGluZ3NfRGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUcmFuc2xhdG9yKFBFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEsIE9STV9QS0cuZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQYWNrYWdlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFBBQ0tBR0UsIE9STV9QS0cuZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGFja2FnZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNjaGVtYVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihTQ0hFTUEsIE9STV9QS0cuZ2V0WG1sRW50aXR5TWFwcGluZ3NfU2NoZW1hKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ2F0YWxvZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihDQVRBTE9HLCBPUk1fUEtHLmdldFhtbEVudGl0eU1hcHBpbmdzX0NhdGFsb2coKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVBY2Nlc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQUNDRVNTLCBPUk1fUEtHLmdldFhtbEVudGl0eU1hcHBpbmdzX0FjY2VzcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IoU0VRVUVOQ0VfR0VORVJBVE9SLCBPUk1fUEtHLmdldFhtbEVudGl0eU1hcHBpbmdzX1NlcXVlbmNlR2VuZXJhdG9ycygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoVEFCTEVfR0VORVJBVE9SLCBPUk1fUEtHLmdldFhtbEVudGl0eU1hcHBpbmdzX1RhYmxlR2VuZXJhdG9ycygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVkUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IE5hbWVkUXVlcnlUcmFuc2xhdG9yKE5BTUVEX1FVRVJZLCBPUk1fUEtHLmdldFhtbEVudGl0eU1hcHBpbmdzX05hbWVkUXVlcmllcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVkTmF0aXZlUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IE5hbWVkTmF0aXZlUXVlcnlUcmFuc2xhdG9yKE5BTUVEX05BVElWRV9RVUVSWSwgT1JNX1BLRy5nZXRYbWxFbnRpdHlNYXBwaW5nc19OYW1lZE5hdGl2ZVF1ZXJpZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVTcWxSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTcWxSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcihTUUxfUkVTVUxUX1NFVF9NQVBQSU5HLCBPUk1fUEtHLmdldFhtbEVudGl0eU1hcHBpbmdzX1NxbFJlc3VsdFNldE1hcHBpbmdzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTWFwcGVkU3VwZXJjbGFzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTWFwcGVkU3VwZXJjbGFzc1RyYW5zbGF0b3IoTUFQUEVEX1NVUEVSQ0xBU1MsIE9STV9QS0cuZ2V0WG1sRW50aXR5TWFwcGluZ3NfTWFwcGVkU3VwZXJjbGFzc2VzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlRW50aXR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbnRpdHlUcmFuc2xhdG9yKEVOVElUWSwgT1JNX1BLRy5nZXRYbWxFbnRpdHlNYXBwaW5nc19FbnRpdGllcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUVtYmVkZGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtYmVkZGFibGVUcmFuc2xhdG9yKEVNQkVEREFCTEUsIE9STV9QS0cuZ2V0WG1sRW50aXR5TWFwcGluZ3NfRW1iZWRkYWJsZXMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FbnRpdHlSZXN1bHRUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VudGl0eVJlc3VsdFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYxOGQ0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VudGl0eVJlc3VsdFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5UmVzdWx0VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIEVudGl0eVJlc3VsdFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlRW50aXR5Q2xhc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVEaXNjcmltaW5hdG9yQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRmllbGRSZXN1bHRUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUVudGl0eUNsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVOVElUWV9DTEFTUywgT1JNX1BLRy5nZXRFbnRpdHlSZXN1bHRfRW50aXR5Q2xhc3MoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVEaXNjcmltaW5hdG9yQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKERJU0NSSU1JTkFUT1JfQ09MVU1OLCBPUk1fUEtHLmdldEVudGl0eVJlc3VsdF9EaXNjcmltaW5hdG9yQ29sdW1uKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlRmllbGRSZXN1bHRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEZpZWxkUmVzdWx0VHJhbnNsYXRvcihGSUVMRF9SRVNVTFQsIE9STV9QS0cuZ2V0RW50aXR5UmVzdWx0X0ZpZWxkUmVzdWx0cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0VudGl0eVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW50aXR5VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDRlYWFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRW50aXR5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17CQotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgRW50aXR5VHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVUYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVNlY29uZGFyeVRhYmxlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVJZENsYXNzVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSW5oZXJpdGFuY2VUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVEaXNjcmltaW5hdG9yVmFsdWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVEaXNjcmltaW5hdG9yQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU5hbWVkUXVlcnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU3FsUmVzdWx0U2V0TWFwcGluZ1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQcmVQZXJzaXN0VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUG9zdFBlcnNpc3RUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQcmVSZW1vdmVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQb3N0UmVtb3ZlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUHJlVXBkYXRlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUG9zdFVwZGF0ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVBvc3RMb2FkVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQXR0cmlidXRlc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5BTUUsIE9STV9QS0cuZ2V0WG1sRW50aXR5X05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDbGFzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihDTEFTUywgT1JNX1BLRy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0NsYXNzTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUFjY2Vzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihBQ0NFU1MsIE9STV9QS0cuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19BY2Nlc3MoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE1FVEFEQVRBX0NPTVBMRVRFLCBPUk1fUEtHLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfTWV0YWRhdGFDb21wbGV0ZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBPUk1fUEtHLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfRGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVUcmFuc2xhdG9yKFRBQkxFLCBPUk1fUEtHLmdldFhtbEVudGl0eV9UYWJsZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNlY29uZGFyeVRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTZWNvbmRhcnlUYWJsZVRyYW5zbGF0b3IoU0VDT05EQVJZX1RBQkxFLCBPUk1fUEtHLmdldFhtbEVudGl0eV9TZWNvbmRhcnlUYWJsZXMoKSk7Ci0JfQkKLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uVHJhbnNsYXRvcihQUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgT1JNX1BLRy5nZXRYbWxFbnRpdHlfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlSWRDbGFzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSWRDbGFzc1RyYW5zbGF0b3IoSURfQ0xBU1MsIE9STV9QS0cuZ2V0WG1sRW50aXR5X0lkQ2xhc3MoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVJbmhlcml0YW5jZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSW5oZXJpdGFuY2VUcmFuc2xhdG9yKElOSEVSSVRBTkNFLCBPUk1fUEtHLmdldFhtbEVudGl0eV9Jbmhlcml0YW5jZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZURpc2NyaW1pbmF0b3JWYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihESVNDUklNSU5BVE9SX1ZBTFVFLCBPUk1fUEtHLmdldFhtbEVudGl0eV9EaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVEaXNjcmltaW5hdG9yQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNjcmltaW5hdG9yQ29sdW1uVHJhbnNsYXRvcihESVNDUklNSU5BVE9SX0NPTFVNTiwgT1JNX1BLRy5nZXRYbWxFbnRpdHlfRGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IoU0VRVUVOQ0VfR0VORVJBVE9SLCBPUk1fUEtHLmdldFhtbEVudGl0eV9TZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoVEFCTEVfR0VORVJBVE9SLCBPUk1fUEtHLmdldFhtbEVudGl0eV9UYWJsZUdlbmVyYXRvcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVkUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IE5hbWVkUXVlcnlUcmFuc2xhdG9yKE5BTUVEX1FVRVJZLCBPUk1fUEtHLmdldFhtbEVudGl0eV9OYW1lZFF1ZXJpZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOYW1lZE5hdGl2ZVF1ZXJ5VHJhbnNsYXRvcihOQU1FRF9OQVRJVkVfUVVFUlksIE9STV9QS0cuZ2V0WG1sRW50aXR5X05hbWVkTmF0aXZlUXVlcmllcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNxbFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNxbFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yKFNRTF9SRVNVTFRfU0VUX01BUFBJTkcsIE9STV9QS0cuZ2V0WG1sRW50aXR5X1NxbFJlc3VsdFNldE1hcHBpbmdzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUywgT1JNX1BLRy5nZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVyc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihFWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTLCBPUk1fUEtHLmdldFhtbEVudGl0eV9FeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUVudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW50aXR5TGlzdGVuZXJzVHJhbnNsYXRvcihFTlRJVFlfTElTVEVORVJTLCBPUk1fUEtHLmdldFhtbEVudGl0eV9FbnRpdHlMaXN0ZW5lcnMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQcmVQZXJzaXN0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUFJFX1BFUlNJU1QsIE9STV9QS0cuZ2V0WG1sRW50aXR5X1ByZVBlcnNpc3QoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQb3N0UGVyc2lzdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFBPU1RfUEVSU0lTVCwgT1JNX1BLRy5nZXRYbWxFbnRpdHlfUG9zdFBlcnNpc3QoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQcmVSZW1vdmVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEV2ZW50TWV0aG9kVHJhbnNsYXRvcihQUkVfUkVNT1ZFLCBPUk1fUEtHLmdldFhtbEVudGl0eV9QcmVSZW1vdmUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQb3N0UmVtb3ZlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUE9TVF9SRU1PVkUsIE9STV9QS0cuZ2V0WG1sRW50aXR5X1Bvc3RSZW1vdmUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQcmVVcGRhdGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEV2ZW50TWV0aG9kVHJhbnNsYXRvcihQUkVfVVBEQVRFLCBPUk1fUEtHLmdldFhtbEVudGl0eV9QcmVVcGRhdGUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQb3N0VXBkYXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUE9TVF9VUERBVEUsIE9STV9QS0cuZ2V0WG1sRW50aXR5X1Bvc3RVcGRhdGUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQb3N0TG9hZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFBPU1RfTE9BRCwgT1JNX1BLRy5nZXRYbWxFbnRpdHlfUG9zdExvYWQoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKEFUVFJJQlVURV9PVkVSUklERSwgT1JNX1BLRy5nZXRYbWxFbnRpdHlfQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoQVNTT0NJQVRJT05fT1ZFUlJJREUsIE9STV9QS0cuZ2V0WG1sRW50aXR5X0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQXR0cmlidXRlc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQXR0cmlidXRlc1RyYW5zbGF0b3IoQVRUUklCVVRFUywgT1JNX1BLRy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FdmVudE1ldGhvZFRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRXZlbnRNZXRob2RUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYjUyOGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9FdmVudE1ldGhvZFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRXZlbnRNZXRob2RUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgRU5EX1RBR19OT19JTkRFTlQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVNZXRob2ROYW1lVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVNZXRob2ROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE1FVEhPRF9OQU1FLCBPUk1fUEtHLmdldEV2ZW50TWV0aG9kX01ldGhvZE5hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9GaWVsZFJlc3VsdFRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvRmllbGRSZXN1bHRUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Njc1MjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9GaWVsZFJlc3VsdFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgRmllbGRSZXN1bHRUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgRmllbGRSZXN1bHRUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgRU5EX1RBR19OT19JTkRFTlQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ29sdW1uVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5BTUUsIE9STV9QS0cuZ2V0RmllbGRSZXN1bHRfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihDT0xVTU4sIE9STV9QS0cuZ2V0RmllbGRSZXN1bHRfQ29sdW1uKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0dlbmVyYXRlZFZhbHVlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGZkZTNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgRU5EX1RBR19OT19JTkRFTlQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sR2VuZXJhdGVkVmFsdWVJbXBsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZVN0cmF0ZWd5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlR2VuZXJhdG9yVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yIGNyZWF0ZVN0cmF0ZWd5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFNUUkFURUdZLCBPUk1fUEtHLmdldFhtbEdlbmVyYXRlZFZhbHVlX1N0cmF0ZWd5KCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvciBjcmVhdGVHZW5lcmF0b3JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoR0VORVJBVE9SLCBPUk1fUEtHLmdldFhtbEdlbmVyYXRlZFZhbHVlX0dlbmVyYXRvcigpLCBET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0lkQ2xhc3NUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0lkQ2xhc3NUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMGE2ZWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9JZENsYXNzVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIElkQ2xhc3NUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgSWRDbGFzc1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBFTkRfVEFHX05PX0lOREVOVCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZUNsYXNzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yIGNyZWF0ZUNsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKENMQVNTLCBPUk1fUEtHLmdldFhtbElkQ2xhc3NfQ2xhc3NOYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvSWRUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0lkVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjdlM2JiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvSWRUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgSWRUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgSWRUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxJZEltcGwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDb2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbHVtblRyYW5zbGF0b3IoQ09MVU1OLCBPUk1fUEtHLmdldENvbHVtbk1hcHBpbmdfQ29sdW1uKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyYXRlZFZhbHVlVHJhbnNsYXRvcihHRU5FUkFURURfVkFMVUUsIE9STV9QS0cuZ2V0WG1sSWRfR2VuZXJhdGVkVmFsdWUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUZW1wb3JhbFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihURU1QT1JBTCwgT1JNX1BLRy5nZXRYbWxJZF9UZW1wb3JhbCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoVEFCTEVfR0VORVJBVE9SLCBPUk1fUEtHLmdldFhtbElkX1RhYmxlR2VuZXJhdG9yKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcihTRVFVRU5DRV9HRU5FUkFUT1IsIE9STV9QS0cuZ2V0WG1sSWRfU2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9Jbmhlcml0YW5jZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvSW5oZXJpdGFuY2VUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzODdmYjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9Jbmhlcml0YW5jZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBJbmhlcml0YW5jZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIEluaGVyaXRhbmNlVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIEVORF9UQUdfTk9fSU5ERU5UKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlU3RyYXRlZ3lUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVTdHJhdGVneVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihTVFJBVEVHWSwgT1JNX1BLRy5nZXRJbmhlcml0YW5jZV9TdHJhdGVneSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0pvaW5Db2x1bW5UcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0pvaW5Db2x1bW5UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NDdjNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9Kb2luQ29sdW1uVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmNvbW1vbi50cmFuc2xhdG9ycy5Cb29sZWFuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtblRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsJCi0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBKb2luQ29sdW1uVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIEVORF9UQUdfTk9fSU5ERU5UKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW5JbXBsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVW5pcXVlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTnVsbGFibGVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVJbnNlcnRhYmxlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVXBkYXRhYmxlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ29sdW1uRGVmaW5pdGlvblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVRhYmxlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbE5hbWVkQ29sdW1uX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCBPUk1fUEtHLmdldFhtbEpvaW5Db2x1bW5fUmVmZXJlbmNlZENvbHVtbk5hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVVbmlxdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKFVOSVFVRSwgT1JNX1BLRy5nZXRYbWxBYnN0cmFjdENvbHVtbl9VbmlxdWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOdWxsYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQm9vbGVhblRyYW5zbGF0b3IoTlVMTEFCTEUsIE9STV9QS0cuZ2V0WG1sQWJzdHJhY3RDb2x1bW5fTnVsbGFibGUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVJbnNlcnRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihJTlNFUlRBQkxFLCBPUk1fUEtHLmdldFhtbEFic3RyYWN0Q29sdW1uX0luc2VydGFibGUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVVcGRhdGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKFVQREFUQUJMRSwgT1JNX1BLRy5nZXRYbWxBYnN0cmFjdENvbHVtbl9VcGRhdGFibGUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDb2x1bW5EZWZpbml0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKENPTFVNTl9ERUZJTklUSU9OLCBPUk1fUEtHLmdldFhtbE5hbWVkQ29sdW1uX0NvbHVtbkRlZmluaXRpb24oKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihUQUJMRSwgT1JNX1BLRy5nZXRYbWxBYnN0cmFjdENvbHVtbl9UYWJsZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL0pvaW5UYWJsZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvSm9pblRhYmxlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDBiYmNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvSm9pblRhYmxlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIEpvaW5UYWJsZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIEpvaW5UYWJsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZUltcGwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVNjaGVtYVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVJbnZlcnNlSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxCYXNlVGFibGVfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNhdGFsb2dUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQ0FUQUxPRywgT1JNX1BLRy5nZXRYbWxCYXNlVGFibGVfQ2F0YWxvZygpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNjaGVtYVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihTQ0hFTUEsIE9STV9QS0cuZ2V0WG1sQmFzZVRhYmxlX1NjaGVtYSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUpvaW5Db2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5UcmFuc2xhdG9yKEpPSU5fQ09MVU1OLCBPUk1fUEtHLmdldFhtbEpvaW5UYWJsZV9Kb2luQ29sdW1ucygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUludmVyc2VKb2luQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uVHJhbnNsYXRvcihJTlZFUlNFX0pPSU5fQ09MVU1OLCBPUk1fUEtHLmdldFhtbEpvaW5UYWJsZV9JbnZlcnNlSm9pbkNvbHVtbnMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvcihVTklRVUVfQ09OU1RSQUlOVCwgT1JNX1BLRy5nZXRYbWxCYXNlVGFibGVfVW5pcXVlQ29uc3RyYWludHMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9NYW55VG9NYW55VHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9NYW55VG9NYW55VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDU2ZTgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvTWFueVRvTWFueVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNYW55VG9NYW55VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgTWFueVRvTWFueVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hbnlUb01hbnlJbXBsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVRhcmdldEVudGl0eVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUZldGNoVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTWFwcGVkQnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVPcmRlckJ5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTWFwS2V5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSm9pblRhYmxlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ2FzY2FkZVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVRhcmdldEVudGl0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihUQVJHRVRfRU5USVRZLCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfVGFyZ2V0RW50aXR5KCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlRmV0Y2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRkVUQ0gsIE9STV9QS0cuZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19GZXRjaCgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU1hcHBlZEJ5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE1BUFBFRF9CWSwgT1JNX1BLRy5nZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfTWFwcGVkQnkoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVPcmRlckJ5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE9SREVSX0JZLCBPUk1fUEtHLmdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19PcmRlckJ5KCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTWFwS2V5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBLZXlUcmFuc2xhdG9yKE1BUF9LRVksIE9STV9QS0cuZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX01hcEtleSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUpvaW5UYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSm9pblRhYmxlVHJhbnNsYXRvcihKT0lOX1RBQkxFLCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pblRhYmxlKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ2FzY2FkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ2FzY2FkZVR5cGVUcmFuc2xhdG9yKENBU0NBREUsIE9STV9QS0cuZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19DYXNjYWRlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvTWFueVRvT25lVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9NYW55VG9PbmVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYmM4NmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9NYW55VG9PbmVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgTWFueVRvT25lVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgTWFueVRvT25lVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFueVRvT25lSW1wbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU9wdGlvbmFsVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUpvaW5UYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNhc2NhZGVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVEFSR0VUX0VOVElUWSwgT1JNX1BLRy5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX1RhcmdldEVudGl0eSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEZFVENILCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfRmV0Y2goKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVPcHRpb25hbFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihPUFRJT05BTCwgT1JNX1BLRy5nZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nX09wdGlvbmFsKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlSm9pbkNvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtblRyYW5zbGF0b3IoSk9JTl9DT0xVTU4sIE9STV9QS0cuZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19Kb2luQ29sdW1ucygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUpvaW5UYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSm9pblRhYmxlVHJhbnNsYXRvcihKT0lOX1RBQkxFLCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pblRhYmxlKCkpOwotCX0KLQkJCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNhc2NhZGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IENhc2NhZGVUeXBlVHJhbnNsYXRvcihDQVNDQURFLCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfQ2FzY2FkZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL01hcEtleVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvTWFwS2V5VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzA1MTcyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvTWFwS2V5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgTWFwS2V5VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIE1hcEtleVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBFTkRfVEFHX05PX0lOREVOVCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldE1hcEtleV9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvTWFwcGVkU3VwZXJjbGFzc1RyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvTWFwcGVkU3VwZXJjbGFzc1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNmYTRjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL01hcHBlZFN1cGVyY2xhc3NUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIE1hcHBlZFN1cGVyY2xhc3NUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17CQotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgTWFwcGVkU3VwZXJjbGFzc1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVJZENsYXNzVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVyc1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUVudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVByZVBlcnNpc3RUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQb3N0UGVyc2lzdFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVByZVJlbW92ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVBvc3RSZW1vdmVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQcmVVcGRhdGVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQb3N0VXBkYXRlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUG9zdExvYWRUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVBdHRyaWJ1dGVzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDbGFzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihDTEFTUywgT1JNX1BLRy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0NsYXNzTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUFjY2Vzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihBQ0NFU1MsIE9STV9QS0cuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19BY2Nlc3MoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE1FVEFEQVRBX0NPTVBMRVRFLCBPUk1fUEtHLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfTWV0YWRhdGFDb21wbGV0ZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZURlc2NyaXB0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBPUk1fUEtHLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfRGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVJZENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJZENsYXNzVHJhbnNsYXRvcihJRF9DTEFTUywgT1JNX1BLRy5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0lkQ2xhc3MoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVFeGNsdWRlRGVmYXVsdExpc3RlbmVyc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihFWENMVURFX0RFRkFVTFRfTElTVEVORVJTLCBPUk1fUEtHLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVyc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihFWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTLCBPUk1fUEtHLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IoRU5USVRZX0xJU1RFTkVSUywgT1JNX1BLRy5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0VudGl0eUxpc3RlbmVycygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVByZVBlcnNpc3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEV2ZW50TWV0aG9kVHJhbnNsYXRvcihQUkVfUEVSU0lTVCwgT1JNX1BLRy5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1ByZVBlcnNpc3QoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQb3N0UGVyc2lzdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFBPU1RfUEVSU0lTVCwgT1JNX1BLRy5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1Bvc3RQZXJzaXN0KCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUHJlUmVtb3ZlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUFJFX1JFTU9WRSwgT1JNX1BLRy5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1ByZVJlbW92ZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVBvc3RSZW1vdmVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEV2ZW50TWV0aG9kVHJhbnNsYXRvcihQT1NUX1JFTU9WRSwgT1JNX1BLRy5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1Bvc3RSZW1vdmUoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQcmVVcGRhdGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEV2ZW50TWV0aG9kVHJhbnNsYXRvcihQUkVfVVBEQVRFLCBPUk1fUEtHLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUHJlVXBkYXRlKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUG9zdFVwZGF0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXZlbnRNZXRob2RUcmFuc2xhdG9yKFBPU1RfVVBEQVRFLCBPUk1fUEtHLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFVwZGF0ZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVBvc3RMb2FkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFdmVudE1ldGhvZFRyYW5zbGF0b3IoUE9TVF9MT0FELCBPUk1fUEtHLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdExvYWQoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVBdHRyaWJ1dGVzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVzVHJhbnNsYXRvcihBVFRSSUJVVEVTLCBPUk1fUEtHLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfQXR0cmlidXRlcygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL05hbWVkTmF0aXZlUXVlcnlUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL05hbWVkTmF0aXZlUXVlcnlUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzU4YjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9OYW1lZE5hdGl2ZVF1ZXJ5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIE5hbWVkTmF0aXZlUXVlcnlUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgTmFtZWROYXRpdmVRdWVyeVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUmVzdWx0Q2xhc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUXVlcnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVIaW50VHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxRdWVyeV9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUmVzdWx0Q2xhc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoUkVTVUxUX0NMQVNTLCBPUk1fUEtHLmdldFhtbE5hbWVkTmF0aXZlUXVlcnlfUmVzdWx0Q2xhc3MoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFJFU1VMVF9TRVRfTUFQUElORywgT1JNX1BLRy5nZXRYbWxOYW1lZE5hdGl2ZVF1ZXJ5X1Jlc3VsdFNldE1hcHBpbmcoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVRdWVyeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihRVUVSWSwgT1JNX1BLRy5nZXRYbWxRdWVyeV9RdWVyeSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUhpbnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFF1ZXJ5SGludFRyYW5zbGF0b3IoSElOVCwgT1JNX1BLRy5nZXRYbWxRdWVyeV9IaW50cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL05hbWVkUXVlcnlUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL05hbWVkUXVlcnlUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNzY0NWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9OYW1lZFF1ZXJ5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIE5hbWVkUXVlcnlUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgTmFtZWRRdWVyeVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUXVlcnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVIaW50VHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxRdWVyeV9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoUVVFUlksIE9STV9QS0cuZ2V0WG1sUXVlcnlfUXVlcnkoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVIaW50VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBRdWVyeUhpbnRUcmFuc2xhdG9yKEhJTlQsIE9STV9QS0cuZ2V0WG1sUXVlcnlfSGludHMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9PbmVUb01hbnlUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL09uZVRvTWFueVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxODRkZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL09uZVRvTWFueVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBPbmVUb01hbnlUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBPbmVUb01hbnlUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPbmVUb01hbnlJbXBsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVRhcmdldEVudGl0eVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUZldGNoVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTWFwcGVkQnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVPcmRlckJ5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTWFwS2V5VHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSm9pblRhYmxlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNhc2NhZGVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVEFSR0VUX0VOVElUWSwgT1JNX1BLRy5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX1RhcmdldEVudGl0eSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEZFVENILCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfRmV0Y2goKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVNYXBwZWRCeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihNQVBQRURfQlksIE9STV9QS0cuZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX01hcHBlZEJ5KCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlT3JkZXJCeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihPUkRFUl9CWSwgT1JNX1BLRy5nZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfT3JkZXJCeSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU1hcEtleVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTWFwS2V5VHJhbnNsYXRvcihNQVBfS0VZLCBPUk1fUEtHLmdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBLZXkoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVKb2luVGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEpvaW5UYWJsZVRyYW5zbGF0b3IoSk9JTl9UQUJMRSwgT1JNX1BLRy5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0pvaW5UYWJsZSgpKTsKLQl9Ci0JCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVKb2luQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uVHJhbnNsYXRvcihKT0lOX0NPTFVNTiwgT1JNX1BLRy5nZXRYbWxPbmVUb01hbnlfSm9pbkNvbHVtbnMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDYXNjYWRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDYXNjYWRlVHlwZVRyYW5zbGF0b3IoQ0FTQ0FERSwgT1JNX1BLRy5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9PbmVUb09uZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvT25lVG9PbmVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMDZjM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9PbmVUb09uZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgT25lVG9PbmVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBPbmVUb09uZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9uZVRvT25lSW1wbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZU9wdGlvbmFsVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTWFwcGVkQnlUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVKb2luVGFibGVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDYXNjYWRlVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5BTUUsIE9STV9QS0cuZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlVGFyZ2V0RW50aXR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFRBUkdFVF9FTlRJVFksIE9STV9QS0cuZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19UYXJnZXRFbnRpdHkoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVGZXRjaFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihGRVRDSCwgT1JNX1BLRy5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0ZldGNoKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlT3B0aW9uYWxUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoT1BUSU9OQUwsIE9STV9QS0cuZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19PcHRpb25hbCgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU1hcHBlZEJ5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE1BUFBFRF9CWSwgT1JNX1BLRy5nZXRYbWxPbmVUb09uZV9NYXBwZWRCeSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIE9STV9QS0cuZ2V0WG1sT25lVG9PbmVfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlSm9pbkNvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtblRyYW5zbGF0b3IoSk9JTl9DT0xVTU4sIE9STV9QS0cuZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19Kb2luQ29sdW1ucygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUpvaW5UYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSm9pblRhYmxlVHJhbnNsYXRvcihKT0lOX1RBQkxFLCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pblRhYmxlKCkpOwotCX0KLQkJCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNhc2NhZGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IENhc2NhZGVUeXBlVHJhbnNsYXRvcihDQVNDQURFLCBPUk1fUEtHLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfQ2FzY2FkZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvT3JtWG1sTWFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL09ybVhtbE1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjdhNThjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvT3JtWG1sTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVhtbE1hcHBlcgotewotCU9ybVBhY2thZ2UgT1JNX1BLRyA9IE9ybVBhY2thZ2UuZUlOU1RBTkNFOwotCQotCVN0cmluZyBYTUxfTlMgPSAieG1sbnMiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfTlNfWFNJID0gInhtbG5zOnhzaSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhTSV9TQ0hFTUFfTE9DQVRJT04gPSAieHNpOnNjaGVtYUxvY2F0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWFNJX05TX1VSTCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBFUlNJU1RFTkNFX05TX1VSTCA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBPUk1fU0NIRU1BX0xPQ18xXzAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtXzFfMC54c2QiOyAgLy8kTk9OLU5MUy0xJAotCQotCQotCVN0cmluZyBBQ0NFU1MgPSAiYWNjZXNzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQUxMT0NBVElPTl9TSVpFID0gImFsbG9jYXRpb24tc2l6ZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFID0gImFzc29jaWF0aW9uLW92ZXJyaWRlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFID0gImF0dHJpYnV0ZS1vdmVycmlkZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJJQlVURVMgPSAiYXR0cmlidXRlcyI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEJBU0lDID0gImJhc2ljIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0FTQ0FERSA9ICJjYXNjYWRlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0FTQ0FERV9BTEwgPSAiY2FzY2FkZS1hbGwiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQVNDQURFX01FUkdFID0gImNhc2NhZGUtbWVyZ2UiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQVNDQURFX1BFUlNJU1QgPSAiY2FzY2FkZS1wZXJzaXN0IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0FTQ0FERV9SRUZSRVNIID0gImNhc2NhZGUtcmVmcmVzaCI7ICAvLyROT04tTkxTLTEkCQotCVN0cmluZyBDQVNDQURFX1JFTU9WRSA9ICJjYXNjYWRlLXJlbW92ZSI7ICAvLyROT04tTkxTLTEkCQotCVN0cmluZyBDQVRBTE9HID0gImNhdGFsb2ciOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDTEFTUyA9ICJjbGFzcyI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTFVNTiA9ICJjb2x1bW4iOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT0xVTU5fREVGSU5JVElPTj0gImNvbHVtbi1kZWZpbml0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09MVU1OX05BTUUgPSAiY29sdW1uLW5hbWUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT0xVTU5fUkVTVUxUID0gImNvbHVtbi1yZXN1bHQiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OID0gImRpc2NyaW1pbmF0b3ItY29sdW1uIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9UWVBFID0gImRpc2NyaW1pbmF0b3ItdHlwZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERJU0NSSU1JTkFUT1JfVkFMVUUgPSAiZGlzY3JpbWluYXRvci12YWx1ZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVNQkVEREFCTEUgPSAiZW1iZWRkYWJsZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVNQkVEREVEID0gImVtYmVkZGVkIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU1CRURERURfSUQgPSAiZW1iZWRkZWQtaWQiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFTlRJVFkgPSAiZW50aXR5IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU5USVRZX0NMQVNTID0gImVudGl0eS1jbGFzcyI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVOVElUWV9MSVNURU5FUiA9ICJlbnRpdHktbGlzdGVuZXIiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFTlRJVFlfTElTVEVORVJTID0gImVudGl0eS1saXN0ZW5lcnMiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFTlRJVFlfTUFQUElOR1MgPSAiZW50aXR5LW1hcHBpbmdzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU5USVRZX1JFU1VMVCA9ICJlbnRpdHktcmVzdWx0IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRU5VTUVSQVRFRCA9ICJlbnVtZXJhdGVkIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUyA9ICJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUyA9ICJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRkVUQ0ggPSAiZmV0Y2giOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGSUVMRF9SRVNVTFQgPSAiZmllbGQtcmVzdWx0IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgR0VORVJBVEVEX1ZBTFVFID0gImdlbmVyYXRlZC12YWx1ZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEdFTkVSQVRPUiA9ICJnZW5lcmF0b3IiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBISU5UID0gImhpbnQiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJRCA9ICJpZCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIElEX0NMQVNTID0gImlkLWNsYXNzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSU5IRVJJVEFOQ0UgPSAiaW5oZXJpdGFuY2UiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJTklUSUFMX1ZBTFVFID0gImluaXRpYWwtdmFsdWUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJTlNFUlRBQkxFID0gImluc2VydGFibGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJTlZFUlNFX0pPSU5fQ09MVU1OID0gImludmVyc2Utam9pbi1jb2x1bW4iOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKT0lOX0NPTFVNTiA9ICJqb2luLWNvbHVtbiI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpPSU5fVEFCTEUgPSAiam9pbi10YWJsZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIExFTkdUSCA9ICJsZW5ndGgiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBMT0IgPSAibG9iIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUFOWV9UT19NQU5ZID0gIm1hbnktdG8tbWFueSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1BTllfVE9fT05FID0gIm1hbnktdG8tb25lIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUFQX0tFWSA9ICJtYXAta2V5IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUFQUEVEX0JZID0gIm1hcHBlZC1ieSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1BUFBFRF9TVVBFUkNMQVNTID0gIm1hcHBlZC1zdXBlcmNsYXNzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUVUQURBVEFfQ09NUExFVEUgPSAibWV0YWRhdGEtY29tcGxldGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBNRVRIT0RfTkFNRSA9ICJtZXRob2QtbmFtZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5BTUUgPSAibmFtZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSWSA9ICJuYW1lZC1uYXRpdmUtcXVlcnkiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBOQU1FRF9RVUVSWSA9ICJuYW1lZC1xdWVyeSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5VTExBQkxFID0gIm51bGxhYmxlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgT05FX1RPX01BTlkgPSAib25lLXRvLW1hbnkiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBPTkVfVE9fT05FID0gIm9uZS10by1vbmUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBPUFRJT05BTCA9ICJvcHRpb25hbCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE9SREVSX0JZID0gIm9yZGVyLWJ5IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEFDS0FHRSA9ICJwYWNrYWdlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyA9ICJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9ICJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEtfQ09MVU1OX05BTUUgPSAicGstY29sdW1uLW5hbWUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQS19DT0xVTU5fVkFMVUUgPSAicGstY29sdW1uLXZhbHVlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUE9TVF9MT0FEID0gInBvc3QtbG9hZCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBPU1RfUEVSU0lTVCA9ICJwb3N0LXBlcnNpc3QiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQT1NUX1JFTU9WRSA9ICJwb3N0LXJlbW92ZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBPU1RfVVBEQVRFID0gInBvc3QtdXBkYXRlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJFX1BFUlNJU1QgPSAicHJlLXBlcnNpc3QiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUkVfUkVNT1ZFID0gInByZS1yZW1vdmUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUkVfVVBEQVRFID0gInByZS11cGRhdGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUkVDSVNJT049ICJwcmVjaXNpb24iOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTiA9ICJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFFVRVJZID0gInF1ZXJ5IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVTVUxUX0NMQVNTID0gInJlc3VsdC1jbGFzcyI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFU1VMVF9TRVRfTUFQUElORyA9ICJyZXN1bHQtc2V0LW1hcHBpbmciOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTQ0FMRT0gInNjYWxlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0NIRU1BID0gInNjaGVtYSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNFQ09OREFSWV9UQUJMRSA9ICJzZWNvbmRhcnktdGFibGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1IgPSAic2VxdWVuY2UtZ2VuZXJhdG9yIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0VRVUVOQ0VfTkFNRSA9ICJzZXF1ZW5jZS1uYW1lIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU1FMX1JFU1VMVF9TRVRfTUFQUElORyA9ICJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU1RSQVRFR1kgPSAic3RyYXRlZ3kiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQUJMRSA9ICJ0YWJsZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBQkxFX0dFTkVSQVRPUiA9ICJ0YWJsZS1nZW5lcmF0b3IiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQVJHRVRfRU5USVRZID0gInRhcmdldC1lbnRpdHkiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBURU1QT1JBTCA9ICJ0ZW1wb3JhbCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRSQU5TSUVOVCA9ICJ0cmFuc2llbnQiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVTklRVUUgPSAidW5pcXVlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVU5JUVVFX0NPTlNUUkFJTlQgPSAidW5pcXVlLWNvbnN0cmFpbnQiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVUERBVEFCTEUgPSAidXBkYXRhYmxlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQUxVRV9DT0xVTU5fTkFNRSA9ICJ2YWx1ZS1jb2x1bW4tbmFtZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZFUlNJT04gPSAidmVyc2lvbiI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFID0gInhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIjsgIC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmNjZjA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZVNjaGVtYVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNhdGFsb2dUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDYXNjYWRlUGVyc2lzdFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUVudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlU2NoZW1hVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFNDSEVNQSwgT1JNX1BLRy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19TY2hlbWEoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDYXRhbG9nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKENBVEFMT0csIE9STV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQ2F0YWxvZygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUFjY2Vzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihBQ0NFU1MsIE9STV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQWNjZXNzKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ2FzY2FkZVBlcnNpc3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoQ0FTQ0FERV9QRVJTSVNULCBPUk1fUEtHLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlRW50aXR5TGlzdGVuZXJzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKEVOVElUWV9MSVNURU5FUlMsIE9STV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfRW50aXR5TGlzdGVuZXJzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGM5NDcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKFhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFLCBPUk1fUEtHLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzVHJhbnNsYXRvcihQRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTLCBPUk1fUEtHLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1ByaW1hcnlLZXlKb2luQ29sdW1uVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzE0N2I1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewkKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIEVORF9UQUdfTk9fSU5ERU5UKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDb2x1bW5EZWZpbml0aW9uVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbE5hbWVkQ29sdW1uX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCBPUk1fUEtHLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uX1JlZmVyZW5jZWRDb2x1bW5OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ29sdW1uRGVmaW5pdGlvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihDT0xVTU5fREVGSU5JVElPTiwgT1JNX1BLRy5nZXRYbWxOYW1lZENvbHVtbl9Db2x1bW5EZWZpbml0aW9uKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvUXVlcnlIaW50VHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9RdWVyeUhpbnRUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDg0OTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9RdWVyeUhpbnRUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgUXVlcnlIaW50VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIFF1ZXJ5SGludFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBFTkRfVEFHX05PX0lOREVOVCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVZhbHVlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbFF1ZXJ5SGludF9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVkFMVUUsIE9STV9QS0cuZ2V0WG1sUXVlcnlIaW50X1ZhbHVlKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvU2Vjb25kYXJ5VGFibGVUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1NlY29uZGFyeVRhYmxlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU3MzNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvU2Vjb25kYXJ5VGFibGVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgU2Vjb25kYXJ5VGFibGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBTZWNvbmRhcnlUYWJsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlSW1wbCgpOwotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5BTUUsIE9STV9QS0cuZ2V0WG1sQmFzZVRhYmxlX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDYXRhbG9nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKENBVEFMT0csIE9STV9QS0cuZ2V0WG1sQmFzZVRhYmxlX0NhdGFsb2coKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVTY2hlbWFUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoU0NIRU1BLCBPUk1fUEtHLmdldFhtbEJhc2VUYWJsZV9TY2hlbWEoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBPUk1fUEtHLmdldFhtbFNlY29uZGFyeVRhYmxlX1ByaW1hcnlLZXlKb2luQ29sdW1ucygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKFVOSVFVRV9DT05TVFJBSU5ULCBPUk1fUEtHLmdldFhtbEJhc2VUYWJsZV9VbmlxdWVDb25zdHJhaW50cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1NlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9TZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwYzA0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1NlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIFNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgRU5EX1RBR19OT19JTkRFTlQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2VxdWVuY2VOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlSW5pdGlhbFZhbHVlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQWxsb2NhdGlvblNpemVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5BTUUsIE9STV9QS0cuZ2V0WG1sR2VuZXJhdG9yX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVTZXF1ZW5jZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoU0VRVUVOQ0VfTkFNRSwgT1JNX1BLRy5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl9TZXF1ZW5jZU5hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVJbml0aWFsVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSU5JVElBTF9WQUxVRSwgT1JNX1BLRy5nZXRYbWxHZW5lcmF0b3JfSW5pdGlhbFZhbHVlKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQWxsb2NhdGlvblNpemVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQUxMT0NBVElPTl9TSVpFLCBPUk1fUEtHLmdldFhtbEdlbmVyYXRvcl9BbGxvY2F0aW9uU2l6ZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1NxbFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1NxbFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNTNiMzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9TcWxSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTcWxSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgU3FsUmVzdWx0U2V0TWFwcGluZ1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUVudGl0eVJlc3VsdFRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNvbHVtblJlc3VsdFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFNxbFJlc3VsdFNldE1hcHBpbmdfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUVudGl0eVJlc3VsdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW50aXR5UmVzdWx0VHJhbnNsYXRvcihFTlRJVFlfUkVTVUxULCBPUk1fUEtHLmdldFNxbFJlc3VsdFNldE1hcHBpbmdfRW50aXR5UmVzdWx0cygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNvbHVtblJlc3VsdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29sdW1uUmVzdWx0VHJhbnNsYXRvcihDT0xVTU5fUkVTVUxULCBPUk1fUEtHLmdldFNxbFJlc3VsdFNldE1hcHBpbmdfQ29sdW1uUmVzdWx0cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1RhYmxlR2VuZXJhdG9yVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9UYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5N2IzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1RhYmxlR2VuZXJhdG9yVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIFRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvckltcGwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVGFibGVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUGtDb2x1bW5OYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVmFsdWVDb2x1bW5OYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUGtDb2x1bW5WYWx1ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUluaXRpYWxWYWx1ZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUFsbG9jYXRpb25TaXplVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludFRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxHZW5lcmF0b3JfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFRBQkxFLCBPUk1fUEtHLmdldFhtbFRhYmxlR2VuZXJhdG9yX1RhYmxlKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlQ2F0YWxvZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihDQVRBTE9HLCBPUk1fUEtHLmdldFhtbFRhYmxlR2VuZXJhdG9yX0NhdGFsb2coKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVTY2hlbWFUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoU0NIRU1BLCBPUk1fUEtHLmdldFhtbFRhYmxlR2VuZXJhdG9yX1NjaGVtYSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVBrQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihQS19DT0xVTU5fTkFNRSwgT1JNX1BLRy5nZXRYbWxUYWJsZUdlbmVyYXRvcl9Qa0NvbHVtbk5hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVWYWx1ZUNvbHVtbk5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVkFMVUVfQ09MVU1OX05BTUUsIE9STV9QS0cuZ2V0WG1sVGFibGVHZW5lcmF0b3JfVmFsdWVDb2x1bW5OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUGtDb2x1bW5WYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihQS19DT0xVTU5fVkFMVUUsIE9STV9QS0cuZ2V0WG1sVGFibGVHZW5lcmF0b3JfUGtDb2x1bW5WYWx1ZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUluaXRpYWxWYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihJTklUSUFMX1ZBTFVFLCBPUk1fUEtHLmdldFhtbEdlbmVyYXRvcl9Jbml0aWFsVmFsdWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVBbGxvY2F0aW9uU2l6ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihBTExPQ0FUSU9OX1NJWkUsIE9STV9QS0cuZ2V0WG1sR2VuZXJhdG9yX0FsbG9jYXRpb25TaXplKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlVW5pcXVlQ29uc3RyYWludFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludFRyYW5zbGF0b3IoVU5JUVVFX0NPTlNUUkFJTlQsIE9STV9QS0cuZ2V0WG1sVGFibGVHZW5lcmF0b3JfVW5pcXVlQ29uc3RyYWludHMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9UYWJsZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvVGFibGVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ODNmY2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9UYWJsZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUYWJsZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsJCi0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBUYWJsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNhdGFsb2dUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVTY2hlbWFUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxCYXNlVGFibGVfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNhdGFsb2dUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoQ0FUQUxPRywgT1JNX1BLRy5nZXRYbWxCYXNlVGFibGVfQ2F0YWxvZygpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVNjaGVtYVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihTQ0hFTUEsIE9STV9QS0cuZ2V0WG1sQmFzZVRhYmxlX1NjaGVtYSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKFVOSVFVRV9DT05TVFJBSU5ULCBPUk1fUEtHLmdldFhtbEJhc2VUYWJsZV9VbmlxdWVDb25zdHJhaW50cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1RyYW5zaWVudFRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvVHJhbnNpZW50VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODMwZDJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvVHJhbnNpZW50VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc2llbnRUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotCWltcGxlbWVudHMgT3JtWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47CQotCQotCQotCXB1YmxpYyBUcmFuc2llbnRUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgRU5EX1RBR19OT19JTkRFTlQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHJhbnNpZW50SW1wbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0JCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoTkFNRSwgT1JNX1BLRy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9VbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9VbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGQ4ZDM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vdHJhbnNsYXRvcnMvVW5pcXVlQ29uc3RyYWludFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgCi0JaW1wbGVtZW50cyBPcm1YbWxNYXBwZXIKLXsKLQlwcml2YXRlIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsJCi0JCi0JCi0JcHVibGljIFVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWNyZWF0ZUNvbHVtbk5hbWVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDb2x1bW5OYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKENPTFVNTl9OQU1FLCBPUk1fUEtHLmdldFhtbFVuaXF1ZUNvbnN0cmFpbnRfQ29sdW1uTmFtZXMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9WZXJzaW9uVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS90cmFuc2xhdG9ycy9WZXJzaW9uVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjU3ZmFjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL3RyYW5zbGF0b3JzL1ZlcnNpb25UcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIFZlcnNpb25UcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciAKLQlpbXBsZW1lbnRzIE9ybVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwkKLQkKLQkKLQlwdWJsaWMgVmVyc2lvblRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFZlcnNpb25JbXBsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQkJCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUNvbHVtblRyYW5zbGF0b3IoKSwgCi0JCQljcmVhdGVUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBPUk1fUEtHLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUNvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29sdW1uVHJhbnNsYXRvcihDT0xVTU4sIE9STV9QS0cuZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUZW1wb3JhbFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihURU1QT1JBTCwgT1JNX1BLRy5nZXRYbWxWZXJzaW9uX1RlbXBvcmFsKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGI5MDgyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sUmVzb3VyY2VQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOworCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVByb3ZpZGVyCisJZXh0ZW5kcyBBYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXIKKwlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcworeworCS8qKgorCSAqIChDb252ZW5pZW5jZSBtZXRob2QpIFJldHVybnMgYSBwZXJzaXN0ZW5jZSByZXNvdXJjZSBtb2RlbCBwcm92aWRlciBmb3IgCisJICogdGhlIGdpdmVuIGZpbGUuCisJICovCisJcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXIgZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihJRmlsZSBmaWxlKSB7CisJCXJldHVybiBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyXyhmaWxlLmdldFByb2plY3QoKSwgZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOworCX0KKwkKKwkvKioKKwkgKiAoQ29udmVuaWVuY2UgbWV0aG9kKSBSZXR1cm5zIGFuIHBlcnNpc3RlbmNlIHJlc291cmNlIG1vZGVsIHByb3ZpZGVyIGZvcgorCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGluIHRoZSBzcGVjaWZpZWQgZGVwbG95IGxvY2F0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXIgZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZGVwbG95TG9jYXRpb24pIHsKKwkJcmV0dXJuIGdldFhtbFJlc291cmNlUHJvdmlkZXJfKHByb2plY3QsIEpwdENvcmVQbHVnaW4uZ2V0RGVwbG95bWVudFVSSShwcm9qZWN0LCBkZXBsb3lMb2NhdGlvbikpOworCX0KKwkKKwkvKioKKwkgKiAoQ29udmVuaWVuY2UgbWV0aG9kKSBSZXR1cm5zIGEgcGVyc2lzdGVuY2UgcmVzb3VyY2UgbW9kZWwgcHJvdmlkZXIgZm9yIAorCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGluIHRoZSBkZWZhdWx0IGRlcGxveSBsb2NhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVByb3ZpZGVyIGdldERlZmF1bHRYbWxSZXNvdXJjZVByb3ZpZGVyKElQcm9qZWN0IHByb2plY3QpIHsKKwkJcmV0dXJuIGdldFhtbFJlc291cmNlUHJvdmlkZXIocHJvamVjdCwgSnB0Q29yZVBsdWdpbi5ERUZBVUxUX1BFUlNJU1RFTkNFX1hNTF9GSUxFX1BBVEgpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBQZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXIgZ2V0WG1sUmVzb3VyY2VQcm92aWRlcl8oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGxvY2F0aW9uKSB7CisJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVByb3ZpZGVyKHByb2plY3QsIG5ldyBQYXRoKGxvY2F0aW9uKSk7CisJfQorCQorCQorCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCkgeworCQl0aGlzKHByb2plY3QsIG5ldyBQYXRoKEpwdENvcmVQbHVnaW4uREVGQVVMVF9QRVJTSVNURU5DRV9YTUxfRklMRV9QQVRIKSk7CisJfQorCQkKKwlwdWJsaWMgUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVByb3ZpZGVyKElQcm9qZWN0IHByb2plY3QsIElQYXRoIGZpbGVQYXRoKSB7CisJCXN1cGVyKHByb2plY3QsIGZpbGVQYXRoLCBKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVJvb3QoT2JqZWN0IGNvbmZpZykgeworCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IChJRGF0YU1vZGVsKSBjb25maWc7CisJCVhtbFBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZSgpOworCQlwZXJzaXN0ZW5jZS5zZXRWZXJzaW9uKGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShWRVJTSU9OKSk7CisJCVhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdCgpOworCQlwZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZShnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKKwkJcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLmFkZChwZXJzaXN0ZW5jZVVuaXQpOworCQlnZXRSZXNvdXJjZUNvbnRlbnRzKCkuYWRkKHBlcnNpc3RlbmNlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvSmF2YUNsYXNzUmVmVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL0phdmFDbGFzc1JlZlRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2NjI2Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvSmF2YUNsYXNzUmVmVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQ2xhc3NSZWZUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotewotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsKLQkKLQkKLQlwdWJsaWMgSmF2YUNsYXNzUmVmVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGZlYXR1cmUsIHN0eWxlKTsKLQl9Ci0JCi0JcHVibGljIEphdmFDbGFzc1JlZlRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgZmVhdHVyZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihURVhUX0FUVFJJQlVURV9WQUxVRSwgUGVyc2lzdGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKYXZhQ2xhc3NSZWZfSmF2YUNsYXNzKCkpCi0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL01hcHBpbmdGaWxlVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL01hcHBpbmdGaWxlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmMwYzZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9NYXBwaW5nRmlsZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UudHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgTWFwcGluZ0ZpbGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwotCQotCQotCXB1YmxpYyBNYXBwaW5nRmlsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5UKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQluZXcgVHJhbnNsYXRvcihURVhUX0FUVFJJQlVURV9WQUxVRSwgUGVyc2lzdGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwaW5nRmlsZVJlZl9GaWxlTmFtZSgpKQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9QZXJzaXN0ZW5jZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9QZXJzaXN0ZW5jZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM1MGExZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Sb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VUcmFuc2xhdG9yIGV4dGVuZHMgUm9vdFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sTWFwcGVyCi17Ci0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVRyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgUGVyc2lzdGVuY2VUcmFuc2xhdG9yKCk7Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47Ci0JCi0JCi0JcHVibGljIFBlcnNpc3RlbmNlVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoUEVSU0lTVEVOQ0UsIFBFUlNJU1RFTkNFX1BLRy5nZXRYbWxQZXJzaXN0ZW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVWZXJzaW9uVHJhbnNsYXRvcigpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlMsIFBFUlNJU1RFTkNFX05TX1VSTCksCi0JCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OU19YU0ksIFhTSV9OU19VUkwpLAotCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYU0lfU0NIRU1BX0xPQ0FUSU9OLCBQRVJTSVNURU5DRV9OU19VUkwgKyAnICcgKyBQRVJTSVNURU5DRV9TQ0hFTUFfTE9DXzFfMCksCi0JCQljcmVhdGVQZXJzaXN0ZW5jZVVuaXRUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZVZlcnNpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVkVSU0lPTiwgUEVSU0lTVEVOQ0VfUEtHLmdldFhtbFBlcnNpc3RlbmNlX1ZlcnNpb24oKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlVW5pdFRyYW5zbGF0b3IoUEVSU0lTVEVOQ0VfVU5JVCwgUEVSU0lTVEVOQ0VfUEtHLmdldFhtbFBlcnNpc3RlbmNlX1BlcnNpc3RlbmNlVW5pdHMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL1BlcnNpc3RlbmNlVW5pdFRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9QZXJzaXN0ZW5jZVVuaXRUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzY3NmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL1BlcnNpc3RlbmNlVW5pdFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UudHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmNvbW1vbi50cmFuc2xhdG9ycy5Cb29sZWFuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47Ci0JCi0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVOYW1lVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlVHJhbnNhY3Rpb25UeXBlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQljcmVhdGVQcm92aWRlclRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZUp0YURhdGFTb3VyY2VUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVOb25KdGFEYXRhU291cmNlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlTWFwcGluZ0ZpbGVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVKYXJGaWxlVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVFeGNsdWRlVW5saXN0ZWRDbGFzc2VzVHJhbnNsYXRvcigpLAotCQkJY3JlYXRlUHJvcGVydGllc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihOQU1FLCBQRVJTSVNURU5DRV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X05hbWUoKSwgRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVUcmFuc2FjdGlvblR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVFJBTlNBQ1RJT05fVFlQRSwgUEVSU0lTVEVOQ0VfUEtHLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9UcmFuc2FjdGlvblR5cGUoKSwgRE9NX0FUVFJJQlVURSB8IFVOU0VUX0lGX05VTEwpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoREVTQ1JJUFRJT04sIFBFUlNJU1RFTkNFX1BLRy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfRGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQcm92aWRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihQUk9WSURFUiwgUEVSU0lTVEVOQ0VfUEtHLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9Qcm92aWRlcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUp0YURhdGFTb3VyY2VUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlRBX0RBVEFfU09VUkNFLCBQRVJTSVNURU5DRV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0p0YURhdGFTb3VyY2UoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOb25KdGFEYXRhU291cmNlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5PTl9KVEFfREFUQV9TT1VSQ0UsIFBFUlNJU1RFTkNFX1BLRy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfTm9uSnRhRGF0YVNvdXJjZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZU1hcHBpbmdGaWxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBwaW5nRmlsZVRyYW5zbGF0b3IoTUFQUElOR19GSUxFLCBQRVJTSVNURU5DRV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X01hcHBpbmdGaWxlcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZUphckZpbGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSkFSX0ZJTEUsIFBFUlNJU1RFTkNFX1BLRy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfSmFyRmlsZXMoKSwgVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVDbGFzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUNsYXNzUmVmVHJhbnNsYXRvcihDTEFTUywgUEVSU0lTVEVOQ0VfUEtHLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9DbGFzc2VzKCksIFRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlRXhjbHVkZVVubGlzdGVkQ2xhc3Nlc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQm9vbGVhblRyYW5zbGF0b3IoRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTLCBQRVJTSVNURU5DRV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVQcm9wZXJ0aWVzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0aWVzVHJhbnNsYXRvcihQUk9QRVJUSUVTLCBQRVJTSVNURU5DRV9QS0cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1Byb3BlcnRpZXMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL1BlcnNpc3RlbmNlWG1sTWFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VYbWxNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjNDE4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VYbWxNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbmNlWG1sTWFwcGVyCi17Ci0JUGVyc2lzdGVuY2VQYWNrYWdlIFBFUlNJU1RFTkNFX1BLRyA9IFBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCi0JU3RyaW5nIFhNTF9OUyA9ICJ4bWxucyI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9OU19YU0kgPSAieG1sbnM6eHNpIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWFNJX1NDSEVNQV9MT0NBVElPTiA9ICJ4c2k6c2NoZW1hTG9jYXRpb24iOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYU0lfTlNfVVJMID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfTlNfVVJMID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfU0NIRU1BX0xPQ18xXzAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfMV8wLnhzZCI7ICAvLyROT04tTkxTLTEkCi0JCi0JCi0JU3RyaW5nIENMQVNTID0gImNsYXNzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFWENMVURFX1VOTElTVEVEX0NMQVNTRVMgPSAiZXhjbHVkZS11bmxpc3RlZC1jbGFzc2VzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFSX0ZJTEUgPSAiamFyLWZpbGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKVEFfREFUQV9TT1VSQ0UgPSAianRhLWRhdGEtc291cmNlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUFQUElOR19GSUxFID0gIm1hcHBpbmctZmlsZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5BTUUgPSAibmFtZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5PTl9KVEFfREFUQV9TT1VSQ0UgPSAibm9uLWp0YS1kYXRhLXNvdXJjZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBFUlNJU1RFTkNFID0gInBlcnNpc3RlbmNlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVCA9ICJwZXJzaXN0ZW5jZS11bml0IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJPUEVSVElFUyA9ICJwcm9wZXJ0aWVzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJPUEVSVFkgPSAicHJvcGVydHkiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUk9WSURFUiA9ICJwcm92aWRlciI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRSQU5TQUNUSU9OX1RZUEUgPSAidHJhbnNhY3Rpb24tdHlwZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBTFVFID0gInZhbHVlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgIC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9Qcm9wZXJ0aWVzVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL1Byb3BlcnRpZXNUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODkzNTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL1Byb3BlcnRpZXNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydGllc1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCi0JaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVhtbE1hcHBlcgotewotCXByaXZhdGUgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwotCQotCQotCXB1YmxpYyBQcm9wZXJ0aWVzVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQkKLQlAT3ZlcnJpZGUJCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQljcmVhdGVQcm9wZXJ0eVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlUHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5VHJhbnNsYXRvcihQUk9QRVJUWSwgUEVSU0lTVEVOQ0VfUEtHLmdldFhtbFByb3BlcnRpZXNfUHJvcGVydGllcygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUHJvcGVydHlUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUHJvcGVydHlUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NzU1YjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL1Byb3BlcnR5VHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKLQlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sTWFwcGVyCi17Ci0JcHJpdmF0ZSBUcmFuc2xhdG9yW10gY2hpbGRyZW47Ci0JCi0JCi0JcHVibGljIFByb3BlcnR5VHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIEVORF9UQUdfTk9fSU5ERU5UKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJY3JlYXRlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWNyZWF0ZVZhbHVlVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByaXZhdGUgVHJhbnNsYXRvciBjcmVhdGVOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKE5BTUUsIFBFUlNJU1RFTkNFX1BLRy5nZXRYbWxQcm9wZXJ0eV9OYW1lKCksIERPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoVkFMVUUsIFBFUlNJU1RFTkNFX1BLRy5nZXRYbWxQcm9wZXJ0eV9WYWx1ZSgpLCBET01fQVRUUklCVVRFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UveG1sL0pwYVhtbFJlc291cmNlQWRhcHRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS94bWwvSnBhWG1sUmVzb3VyY2VBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwM2Y0YjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UveG1sL0pwYVhtbFJlc291cmNlQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS54bWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKKworcHVibGljIGNsYXNzIEpwYVhtbFJlc291cmNlQWRhcHRlckZhY3RvcnkKKwlpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gQURBUFRFUl9MSVNUID0gbmV3IENsYXNzW10geyBKcGFYbWxSZXNvdXJjZS5jbGFzcyB9OworCQorCXB1YmxpYyBDbGFzczw/PltdIGdldEFkYXB0ZXJMaXN0KCkgeworCQlyZXR1cm4gQURBUFRFUl9MSVNUOworCX0KKwkKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIENsYXNzIGFkYXB0ZXJUeXBlKSB7CisJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJcmV0dXJuIHRoaXMuZ2V0QWRhcHRlcigoSUZpbGUpIGFkYXB0YWJsZU9iamVjdCwgYWRhcHRlclR5cGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcml2YXRlIE9iamVjdCBnZXRBZGFwdGVyKGZpbmFsIElGaWxlIGZpbGUsIENsYXNzIDw/PmFkYXB0ZXJUeXBlKSB7CisJCWlmIChhZGFwdGVyVHlwZSA9PSBKcGFYbWxSZXNvdXJjZS5jbGFzcykgeworCQkJSnBhRmlsZSBqcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOworCQkJaWYgKGpwYUZpbGUgIT0gbnVsbCkgeworCQkJCUpwYVJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCA9IGpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpOworCQkJCWlmIChyZXNvdXJjZU1vZGVsIGluc3RhbmNlb2YgSnBhWG1sUmVzb3VyY2UpIHsKKwkJCQkJcmV0dXJuIHJlc291cmNlTW9kZWw7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS94bWwvSnBhWG1sUmVzb3VyY2VQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3htbC9KcGFYbWxSZXNvdXJjZVByb3BlcnR5VGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiMTlkNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS94bWwvSnBhWG1sUmVzb3VyY2VQcm9wZXJ0eVRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnhtbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKKworcHVibGljIGNsYXNzIEpwYVhtbFJlc291cmNlUHJvcGVydHlUZXN0ZXIKKwlleHRlbmRzIFByb3BlcnR5VGVzdGVyCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfTEFURVNUX1NVUFBPUlRFRF9WRVJTSU9OID0gImlzTGF0ZXN0U3VwcG9ydGVkVmVyc2lvbiI7CisJCisJCisJcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKKwkJSnBhWG1sUmVzb3VyY2UgeG1sUmVzb3VyY2UgPSBudWxsOworCQlpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBKcGFYbWxSZXNvdXJjZSkgeworCQkJeG1sUmVzb3VyY2UgPSAoSnBhWG1sUmVzb3VyY2UpIHJlY2VpdmVyOworCQl9CisJCWVsc2UgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgWG1sRmlsZSkgeworCQkJeG1sUmVzb3VyY2UgPSAoKFhtbEZpbGUpIHJlY2VpdmVyKS5nZXRYbWxSZXNvdXJjZSgpOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlpZiAoSVNfTEFURVNUX1NVUFBPUlRFRF9WRVJTSU9OLmVxdWFscyhwcm9wZXJ0eSkpIHsKKwkJCUJvb2xlYW4gZXhwZWN0ZWRJc0xhdGVzdFN1cHBvcnRlZFZlcnNpb24gPSAoQm9vbGVhbikgZXhwZWN0ZWRWYWx1ZTsKKwkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IHhtbFJlc291cmNlLmdldEpwYVByb2plY3QoKTsKKwkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IHhtbFJlc291cmNlLmdldENvbnRlbnRUeXBlKCk7CisJCQlCb29sZWFuIGFjdHVhbElzTGF0ZXN0U3VwcG9ydGVkVmVyc2lvbiA9IAorCQkJCQl4bWxSZXNvdXJjZS5nZXRWZXJzaW9uKCkgIT0gbnVsbAorCQkJCQkJJiYgeG1sUmVzb3VyY2UuZ2V0VmVyc2lvbigpLmVxdWFscygKKwkJCQkJCQlqcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkuZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZShjb250ZW50VHlwZSkuZ2V0VmVyc2lvbigpKTsKKwkJCQorCQkJcmV0dXJuIGFjdHVhbElzTGF0ZXN0U3VwcG9ydGVkVmVyc2lvbiA9PSBleHBlY3RlZElzTGF0ZXN0U3VwcG9ydGVkVmVyc2lvbjsKKwkJfQorCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9zeW5jaC9TeW5jaHJvbml6ZUNsYXNzZXNKb2IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9zeW5jaC9TeW5jaHJvbml6ZUNsYXNzZXNKb2IuamF2YQppbmRleCBmYmY4OGMxLi41MjIwMTcxIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvc3luY2gvU3luY2hyb25pemVDbGFzc2VzSm9iLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3N5bmNoL1N5bmNocm9uaXplQ2xhc3Nlc0pvYi5qYXZhCkBAIC0xLDIzICsxLDI2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnN5bmNoOwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VSdWxlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKQEAgLTI1LDEzICsyOCwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnB0Q29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKIAogLyoqCiAgKiBTeW5jaHJvbml6ZXMgdGhlIGxpc3RzIG9mIHBlcnNpc3RlbnQgY2xhc3NlcyBpbiBhIHBlcnNpc3RlbmNlIHVuaXQgYW5kIGEgCkBAIC00NCw3NCArNDcsODggQEAKIAkKIAlwdWJsaWMgU3luY2hyb25pemVDbGFzc2VzSm9iKElGaWxlIGZpbGUpIHsKIAkJc3VwZXIoSnB0Q29yZU1lc3NhZ2VzLlNZTkNIUk9OSVpFX0NMQVNTRVNfSk9CKTsKLQkJc2V0UnVsZShmaWxlLmdldFByb2plY3QoKSk7CisJCUlSZXNvdXJjZVJ1bGVGYWN0b3J5IHJ1bGVGYWN0b3J5ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCk7CisJCXNldFJ1bGUocnVsZUZhY3RvcnkubW9kaWZ5UnVsZShmaWxlLmdldFByb2plY3QoKSkpOwogCQl0aGlzLnBlcnNpc3RlbmNlWG1sRmlsZSA9IGZpbGU7CiAJfQogCQogCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogCQltb25pdG9yLmJlZ2luVGFzayhKcHRDb3JlTWVzc2FnZXMuU1lOQ0hST05JWklOR19DTEFTU0VTX1RBU0ssIDIwMCk7CiAJCQogCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKIAkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKIAkJfQogCQkKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMucGVyc2lzdGVuY2VYbWxGaWxlLmdldFByb2plY3QoKSk7Ci0KLQkJUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgcGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgPSBQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZSh0aGlzLnBlcnNpc3RlbmNlWG1sRmlsZS5nZXRQcm9qZWN0KCkpOwotCQlQZXJzaXN0ZW5jZVJlc291cmNlIHBlcnNpc3RlbmNlUmVzb3VyY2UgPSBwZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5nZXRSZXNvdXJjZSh0aGlzLnBlcnNpc3RlbmNlWG1sRmlsZSk7CisJCWZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLnBlcnNpc3RlbmNlWG1sRmlsZS5nZXRQcm9qZWN0KCkpOworCQlmaW5hbCBKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IGpwYVByb2plY3QuZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpOworCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworCQkJLy90aGUgcmVzb3VyY2Ugd291bGQgb25seSBiZSBudWxsIGlmIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSBoYWQgYW4gaW52YWxpZCBjb250ZW50IHR5cGUKKwkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQl9CiAJCQogCQltb25pdG9yLndvcmtlZCgyNSk7Ci0KLQkJWG1sUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZVJlc291cmNlLmdldFBlcnNpc3RlbmNlKCk7CiAJCQotCQlpZiAocGVyc2lzdGVuY2UgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVuY2UgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlKCk7Ci0JCQlwZXJzaXN0ZW5jZVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHBlcnNpc3RlbmNlKTsKLQkJfQorCQlyZXNvdXJjZS5tb2RpZnkobmV3IFJ1bm5hYmxlKCkgeworCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJWG1sUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSAoWG1sUGVyc2lzdGVuY2UpIHJlc291cmNlLmdldFJvb3RPYmplY3QoKTsJCQkJCQorCQkJCQlYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0OworCQkJCQkKKwkJCQkJaWYgKHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5zaXplKCkgPiAwKSB7CisJCQkJCQlwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuZ2V0KDApOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJcGVyc2lzdGVuY2VVbml0ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJCQkJCXBlcnNpc3RlbmNlVW5pdC5zZXROYW1lKGpwYVByb2plY3QuZ2V0TmFtZSgpKTsKKwkJCQkJCXBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5hZGQocGVyc2lzdGVuY2VVbml0KTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJcGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5jbGVhcigpOworCQkJCQkKKwkJCQkJbW9uaXRvci53b3JrZWQoMjUpOworCQkJCisJCQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBtYXBwZWRDbGFzc05hbWVzKGpwYVByb2plY3QsICckJyk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJCQkJU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUgPSBzdHJlYW0ubmV4dCgpOworCQkJCQkJaWYgKCAhIG1hcHBpbmdGaWxlQ29udGFpbnMoanBhUHJvamVjdCwgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkpIHsKKwkJCQkJCQlYbWxKYXZhQ2xhc3NSZWYgY2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOworCQkJCQkJCWNsYXNzUmVmLnNldEphdmFDbGFzcyhmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKKwkJCQkJCQlwZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZChjbGFzc1JlZik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJCisJCQkJCW1vbml0b3Iud29ya2VkKDEwMCk7CisJCQkJfQorCQkJfSk7CiAJCQotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0UmVzb3VyY2U7CisJCW1vbml0b3IuZG9uZSgpOwogCQkKLQkJaWYgKHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5zaXplKCkgPiAwKSB7Ci0JCQlwZXJzaXN0ZW5jZVVuaXRSZXNvdXJjZSA9IHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5nZXQoMCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwZXJzaXN0ZW5jZVVuaXRSZXNvdXJjZSA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCQlwZXJzaXN0ZW5jZVVuaXRSZXNvdXJjZS5zZXROYW1lKHRoaXMucGVyc2lzdGVuY2VYbWxGaWxlLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQkJcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLmFkZChwZXJzaXN0ZW5jZVVuaXRSZXNvdXJjZSk7Ci0JCX0KLQkJCi0JCXBlcnNpc3RlbmNlVW5pdFJlc291cmNlLmdldENsYXNzZXMoKS5jbGVhcigpOwotCQkKLQkJbW9uaXRvci53b3JrZWQoMjUpOwotCi0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBqcGFQcm9qZWN0LmFubm90YXRlZENsYXNzTmFtZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoICEgbWFwcGluZ0ZpbGVDb250YWlucyhqcGFQcm9qZWN0LCBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSkgewotCQkJCVhtbEphdmFDbGFzc1JlZiBjbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCQkJY2xhc3NSZWYuc2V0SmF2YUNsYXNzKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwotCQkJCXBlcnNpc3RlbmNlVW5pdFJlc291cmNlLmdldENsYXNzZXMoKS5hZGQoY2xhc3NSZWYpOwotCQkJfQotCQl9Ci0JCQotCQltb25pdG9yLndvcmtlZCgxMDApOwotCQkKLQkJdHJ5IHsKLQkJCXBlcnNpc3RlbmNlUmVzb3VyY2Uuc2F2ZShudWxsKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgSnB0Q29yZU1lc3NhZ2VzLkVSUk9SX1dSSVRJTkdfRklMRSwgaW9lKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsJCQkKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0KIAkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CiAJfQogCQotCXByaXZhdGUgYm9vbGVhbiBtYXBwaW5nRmlsZUNvbnRhaW5zKEpwYVByb2plY3QganBhUHJvamVjdCwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwgPSBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0KCkuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBtYXBwZWRDbGFzc05hbWVzKGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdCwgZmluYWwgY2hhciBlbmNsb3NpbmdUeXBlU2VwYXJhdG9yKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4oanBhUHJvamVjdC5tYXBwZWRKYXZhU291cmNlQ2xhc3NOYW1lcygpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUpIHsKKwkJCQlJVHlwZSBqZHRUeXBlID0gU3luY2hyb25pemVDbGFzc2VzSm9iLnRoaXMuZmluZFR5cGUoanBhUHJvamVjdCwgZnVsbHlRdWFsaWZpZWROYW1lKTsKKwkJCQlyZXR1cm4gamR0VHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoZW5jbG9zaW5nVHlwZVNlcGFyYXRvcik7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBJVHlwZSBmaW5kVHlwZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIFN0cmluZyB0eXBlTmFtZSkgeworCQl0cnkgeworCQkJcmV0dXJuIGdldEphdmFQcm9qZWN0KGpwYVByb2plY3QpLmZpbmRUeXBlKHR5cGVOYW1lKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQlyZXR1cm4gbnVsbDsgIC8vIGlnbm9yZSBleGNlcHRpb24/CisJCX0KKwl9CisKKwlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KEpwYVByb2plY3QganBhUHJvamVjdCkgeworCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpKTsKKwl9CisKKwlib29sZWFuIG1hcHBpbmdGaWxlQ29udGFpbnMoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgeworCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCA9IGpwYVByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKIAkJaWYgKHBlcnNpc3RlbmNlWG1sID09IG51bGwpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvQ2FsbGJhY2tKb2JTeW5jaHJvbml6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L0NhbGxiYWNrSm9iU3luY2hyb25pemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkYjU4NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L0NhbGxiYWNrSm9iU3luY2hyb25pemVyLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9uaXplcjsKKworLyoqCisgKiBFeHRlbmQgdGhlIGpvYiBzeW5jaHJvbml6ZXIgdG8gbm90aWZ5IGxpc3RlbmVycworICogd2hlbiBhIHN5bmNocm9uaXphdGlvbiAiY3ljbGUiIGlzIGNvbXBsZXRlOyBpLmUuIHRoZSBzeW5jaHJvbml6YXRpb24gaGFzLAorICogZm9yIHRoZSBtb21lbnQsIGhhbmRsZWQgZXZlcnkgInN5bmNocm9uaXplIiByZXF1ZXN0IGFuZCBxdWllc2NlZC4KKyAqIFRoaXMgbm90aWZpY2F0aW9uIGlzIDxlbT5ub3Q8L2VtPiBndWFyYW50ZWVkIHRvIG9jY3VyIHdpdGggPGVtPmV2ZXJ5PC9lbT4KKyAqIHN5bmNocm9uaXphdGlvbiAiY3ljbGUiOworICogc2luY2Ugb3RoZXIsIHVucmVsYXRlZCwgc3luY2hyb25pemF0aW9ucyBjYW4gYmUgdHJpZ2dlcmVkIGNvbmN1cnJlbnRseS4KKyAqLworcHVibGljIGNsYXNzIENhbGxiYWNrSm9iU3luY2hyb25pemVyCisJZXh0ZW5kcyBKb2JTeW5jaHJvbml6ZXIKKwlpbXBsZW1lbnRzIENhbGxiYWNrU3luY2hyb25pemVyCit7CisJcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgorCisJLyoqCisJICogQ29uc3RydWN0IGEgY2FsbGJhY2sgam9iIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBqb2IgY29tbWFuZCB0bworCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4gQXNzaWduIHRoZSBnZW5lcmF0ZWQgRWNsaXBzZSBqb2IgdGhlCisJICogc3BlY2lmaWVkIG5hbWUuCisJICovCisJcHVibGljIENhbGxiYWNrSm9iU3luY2hyb25pemVyKFN0cmluZyBqb2JOYW1lLCBKb2JDb21tYW5kIGNvbW1hbmQpIHsKKwkJc3VwZXIoam9iTmFtZSwgY29tbWFuZCk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0IGEgY2FsbGJhY2sgam9iIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBqb2IgY29tbWFuZCB0bworCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4gQXNzaWduIHRoZSBnZW5lcmF0ZWQgRWNsaXBzZSBqb2IgdGhlCisJICogc3BlY2lmaWVkIG5hbWUgYW5kIHNjaGVkdWxpbmcgcnVsZS4KKwkgKi8KKwlwdWJsaWMgQ2FsbGJhY2tKb2JTeW5jaHJvbml6ZXIoU3RyaW5nIGpvYk5hbWUsIEpvYkNvbW1hbmQgY29tbWFuZCwgSVNjaGVkdWxpbmdSdWxlIHNjaGVkdWxpbmdSdWxlKSB7CisJCXN1cGVyKGpvYk5hbWUsIGNvbW1hbmQsIHNjaGVkdWxpbmdSdWxlKTsKKwl9CisKKwkvKioKKwkgKiBCdWlsZCBhIGpvYiB0aGF0IHdpbGwgbGV0IHVzIGtub3cgd2hlbiB0aGUgc3luY2hyb25pemF0aW9uIGhhcworCSAqIHF1aWVzY2VkLgorCSAqLworCUBPdmVycmlkZQorCVN5bmNocm9uaXphdGlvbkpvYiBidWlsZEpvYihTdHJpbmcgam9iTmFtZSwgSm9iQ29tbWFuZCBjb21tYW5kLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHsKKwkJcmV0dXJuIG5ldyBDYWxsYmFja1N5bmNocm9uaXphdGlvbkpvYihqb2JOYW1lLCBjb21tYW5kLCBzY2hlZHVsaW5nUnVsZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIENhbGxiYWNrU3luY2hyb25pemVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXRoaXMubGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJdGhpcy5saXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBOb3RpZnkgb3VyIGxpc3RlbmVycy4KKwkgKi8KKwl2b2lkIHN5bmNocm9uaXphdGlvblF1aWVzY2VkKCkgeworCQlmb3IgKExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKKwkJCWxpc3RlbmVyLnN5bmNocm9uaXphdGlvblF1aWVzY2VkKHRoaXMpOworCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIHN5bmNocm9uaXphdGlvbiBqb2IgKioqKioqKioqKgorCisJLyoqCisJICogRXh0ZW5kIHtAbGluayBKb2JTeW5jaHJvbml6ZXIuU3luY2hyb25pemF0aW9uSm9ifQorCSAqIHRvIG5vdGlmeSB0aGUgc3luY2hyb25pemVyIHdoZW4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMgcXVpZXNjZWQKKwkgKiAoaS5lLiB0aGUgY29tbWFuZCBoYXMgZmluaXNoZWQgZXhlY3V0aW5nIGFuZCB0aGVyZSBhcmUgbm8gZnVydGhlcgorCSAqIHJlcXVlc3RzIGZvciBzeW5jaHJvbml6YXRpb24pLgorCSAqIEJlY2F1c2Ugc3luY2hyb25pemF0aW9uIG9jY3VycyBkdXJpbmcgdGhlIGpvYidzIGV4ZWN1dGlvbiwKKwkgKiBubyBvdGhlciB0aHJlYWQgd2lsbCBiZSBhYmxlIHRvCisJICogaW5pdGlhdGUgYW5vdGhlciBzeW5jaHJvbml6YXRpb24gdW50aWwgdGhlIHN5bmNocm9uaXplcidzIGxpc3RlbmVycyBoYXZlIGJlZW4KKwkgKiBub3RpZmllZC4gTm90ZSBhbHNvLCB0aGUgc3luY2hyb25pemVyJ3MgbGlzdGVuZXJzIGNhbiwgdGhlbXNlbHZlcywKKwkgKiB0cmlnZ2VyIGFub3RoZXIgc3luY2hyb25pemF0aW9uIChieSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGNhbGxpbmcKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXIjc3luY2hyb25pemUoKSk7CisJICogYnV0IHRoaXMgc3luY2hyb25pemF0aW9uIHdpbGwgbm90IG9jY3VyIHVudGlsIDxlbT5hZnRlcjwvZW0+IGFsbCB0aGUKKwkgKiBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgorCSAqLworCWNsYXNzIENhbGxiYWNrU3luY2hyb25pemF0aW9uSm9iCisJCWV4dGVuZHMgU3luY2hyb25pemF0aW9uSm9iCisJeworCQkvKioKKwkJICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0IHRvIHRydWUsIHRoZSBqb2IgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHJ1bi4KKwkJICogV2UgbmVlZCB0aGlzIGJlY2F1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiBKb2J9CisJCSAqIGhhcyBubyBwdWJsaWMgQVBJIGZvciBkaXNjb3ZlcmluZyB3aGV0aGVyIGEgam9iIGlzICJzY2hlZHVsZWQiLgorCQkgKi8KKwkJLy8gdXNlICd2b2xhdGlsZScgYmVjYXVzZSBzeW5jaHJvbml6YXRpb24gaXNuJ3QgcmVhbGx5IHJlcXVpcmVkCisJCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzY2hlZHVsZWQ7CisKKworCQlDYWxsYmFja1N5bmNocm9uaXphdGlvbkpvYihTdHJpbmcgam9iTmFtZSwgSm9iQ29tbWFuZCBjb21tYW5kLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHsKKwkJCXN1cGVyKGpvYk5hbWUsIGNvbW1hbmQsIHNjaGVkdWxpbmdSdWxlKTsKKwkJCXRoaXMuc2NoZWR1bGVkID0gZmFsc2U7CisJCX0KKworCQkvKioKKwkJICogSWYgd2UgYXJlIGFsbG93aW5nIHRoZSBqb2IgdG8gYmUgc2NoZWR1bGVkIChpLmUuIHtAbGluayAjc3RhcnQoKX0KKwkJICogd2FzIGNhbGxlZCksIHNldCB0aGUgInNjaGVkdWxlZCIgZmxhZy4KKwkJICovCisJCUBPdmVycmlkZQorCQl2b2lkIHN5bmNocm9uaXplKCkgeworCQkJaWYgKHRoaXMuc2hvdWxkU2NoZWR1bGUpIHsKKwkJCQl0aGlzLnNjaGVkdWxlZCA9IHRydWU7CisJCQl9CisJCQlzdXBlci5zeW5jaHJvbml6ZSgpOworCQl9CisKKwkJLyoqCisJCSAqIENsZWFyIHRoZSAic2NoZWR1bGVkIiBmbGFnOyBwZXJmb3JtIHRoZSBzeW5jaHJvbml6YXRpb247IGFuZCwKKwkJICogaWYgdGhlICJzY2hlZHVsZWQiIGZsYWcgaXMgc3RpbGwgY2xlYXIgKGkuZS4gdGhlcmUgaGF2ZSBiZWVuIG5vCisJCSAqIGZ1cnRoZXIgY2FsbHMgdG8ge0BsaW5rICNzeW5jaHJvbml6ZSgpfSksIG5vdGlmeSBvdXIgbGlzdGVuZXJzLgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCXRoaXMuc2NoZWR1bGVkID0gZmFsc2U7CisJCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnJ1bihtb25pdG9yKTsKKwkJCS8vIGhtbW0gLSB3ZSB3aWxsIG5vdGlmeSBsaXN0ZW5lcnMgZXZlbiB3aGVuIHdlIG91ciBqb2IgaXMgInN0b3BwZWQiOworCQkJLy8gdGhhdCBzZWVtcyBvay4uLiAgfmJqdgorCQkJaWYgKCAhIHRoaXMuc2NoZWR1bGVkKSB7CisJCQkJQ2FsbGJhY2tKb2JTeW5jaHJvbml6ZXIudGhpcy5zeW5jaHJvbml6YXRpb25RdWllc2NlZCgpOworCQkJfQorCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCUBPdmVycmlkZQorCQl2b2lkIHN0b3AoKSB7CisJCQl0aGlzLnNjaGVkdWxlZCA9IGZhbHNlOworCQkJc3VwZXIuc3RvcCgpOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L0pvYkNvbW1hbmQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L0pvYkNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGIxYTBkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvSm9iQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKKworLyoqCisgKiBTaW1wbGUgaW50ZXJmYWNlIGZvciBpbXBsZW1lbnRpbmcgdGhlIEdPRiBDb21tYW5kIGRlc2lnbiBwYXR0ZXJuIGluIGFuCisgKiBFY2xpcHNlIGpvYi4KKyAqIDxwPgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSm9iQ29tbWFuZCB7CisKKwkvKioKKwkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBjb21tYW5kCisJICogaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIuCisJICogVGhlIGNvbW1hbmQgc2hvdWxkIGNoZWNrLCBhcyBhcHByb3ByaWF0ZSwgd2hldGhlciB0aGUgc3BlY2lmaWVkIHByb2dyZXNzCisJICogbW9uaXRvciBpcyB7QGxpbmsgSVByb2dyZXNzTW9uaXRvciNpc0NhbmNlbGVkKCkgImNhbmNlbGVkIn07IGlmIGl0IGlzLAorCSAqIHRoZSBjb21tYW5kIHNob3VsZCB0aHJvdyBhbgorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb259LgorCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNpc0NhbmNlbGVkKCkKKwkgKi8KKwlJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKKworCS8qKgorCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgam9iIGNvbW1hbmQgaW50ZXJmYWNlIHRoYXQgd2lsbCBkbworCSAqIG5vdGhpbmcgd2hlbiBleGVjdXRlZC4KKwkgKi8KKwlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgSm9iQ29tbWFuZCwgU2VyaWFsaXphYmxlIHsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBKb2JDb21tYW5kIElOU1RBTkNFID0gbmV3IE51bGwoKTsKKwkJcHVibGljIHN0YXRpYyBKb2JDb21tYW5kIGluc3RhbmNlKCkgeworCQkJcmV0dXJuIElOU1RBTkNFOworCQl9CisJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKKwkJcHJpdmF0ZSBOdWxsKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgYXJnMCkgeworCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCX0KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gIkpvYkNvbW1hbmQuTnVsbCI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7CisJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgorCQkJcmV0dXJuIElOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBqb2IgY29tbWFuZCBpbnRlcmZhY2UgdGhhdCB3aWxsIHRocm93IGFuCisJICogZXhjZXB0aW9uIHdoZW4gZXhlY3V0ZWQuCisJICovCisJZmluYWwgY2xhc3MgRGlzYWJsZWQgaW1wbGVtZW50cyBKb2JDb21tYW5kLCBTZXJpYWxpemFibGUgeworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEpvYkNvbW1hbmQgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKKwkJcHVibGljIHN0YXRpYyBKb2JDb21tYW5kIGluc3RhbmNlKCkgeworCQkJcmV0dXJuIElOU1RBTkNFOworCQl9CisJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKKwkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKKwkJCXN1cGVyKCk7CisJCX0KKwkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCisJCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBhcmcwKSB7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiAiSm9iQ29tbWFuZC5EaXNhYmxlZCI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7CisJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgorCQkJcmV0dXJuIElOU1RBTkNFOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9Kb2JTeW5jaHJvbml6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L0pvYlN5bmNocm9uaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDVjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9Kb2JTeW5jaHJvbml6ZXIuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplcjsKKworLyoqCisgKiBUaGlzIHN5bmNocm9uaXplciB3aWxsIHBlcmZvcm0gc3luY2hyb25pemF0aW9ucyBpbiBhbiBFY2xpcHNlIGpvYiBvbiBhCisgKiBzZXBhcmF0ZSB0aHJlYWQsIGFsbG93aW5nIGNhbGxzIHRvIHtAbGluayBTeW5jaHJvbml6ZXIjc3luY2hyb25pemUoKX0KKyAqIHRvIHJldHVybiBpbW1lZGlhdGVseS4KKyAqIDxwPgorICogSWYgbmVjZXNzYXJ5LCB0aGUgY2xpZW50LXN1cHBsaWVkIGpvYiBjb21tYW5kIHNob3VsZCBoYW5kbGUgYW55CisgKiBleGNlcHRpb25zIGFwcHJvcHJpYXRlbHkuIEFsdGhvdWdoLCB0aGUgZGVmYXVsdCBleGNlcHRpb24taGFuZGxpbmcgcHJvdmlkZWQKKyAqIGJ5IHRoZSBFY2xpcHNlIEpvYiBGcmFtZXdvcmsgaXMgcHJvYmFibHkgYWRlcXVhdGUgaW4gbW9zdCBjYXNlczo8dWw+CisgKiA8bGk+QW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbn0KKyAqICAgICByZXN1bHRzIGluIGEge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMjQ0FOQ0VMX1NUQVRVUyBDQU5DRUxfU1RBVFVTfS4KKyAqIDxsaT5Bbnkgbm9uLXtAbGluayBUaHJlYWREZWF0aH0ge0BsaW5rIFRocm93YWJsZX0KKyAqICAgICByZXN1bHRzIGluIGEge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI0VSUk9SIEVSUk9SfQorICogICAgIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQorICogPC91bD4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5qb2JzLldvcmtlciNydW4oKQorICovCitwdWJsaWMgY2xhc3MgSm9iU3luY2hyb25pemVyCisJaW1wbGVtZW50cyBTeW5jaHJvbml6ZXIKK3sKKwkvKioKKwkgKiBUaGUgc3luY2hyb25pemF0aW9uIGlzIHBlcmZvcm1lZCBieSB0aGlzIGpvYi4gVGhlIHNhbWUgam9iIGlzIHVzZWQKKwkgKiBmb3IgZXZlcnkgc3RhcnQvc3RvcCBjeWNsZSAoc2luY2UgYSBqb2IgY2FuIGJlIHJlLXN0YXJ0ZWQpLgorCSAqLworCXByaXZhdGUgZmluYWwgU3luY2hyb25pemF0aW9uSm9iIGpvYjsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgorCisJLyoqCisJICogQ29uc3RydWN0IGEgam9iIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBqb2IgY29tbWFuZCB0bworCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4gQXNzaWduIHRoZSBnZW5lcmF0ZWQgRWNsaXBzZSBqb2IgdGhlCisJICogc3BlY2lmaWVkIG5hbWUuCisJICovCisJcHVibGljIEpvYlN5bmNocm9uaXplcihTdHJpbmcgam9iTmFtZSwgSm9iQ29tbWFuZCBjb21tYW5kKSB7CisJCXRoaXMoam9iTmFtZSwgY29tbWFuZCwgbnVsbCk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0IGEgam9iIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBqb2IgY29tbWFuZCB0bworCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4gQXNzaWduIHRoZSBnZW5lcmF0ZWQgRWNsaXBzZSBqb2IgdGhlCisJICogc3BlY2lmaWVkIG5hbWUgYW5kIHNjaGVkdWxpbmcgcnVsZS4KKwkgKi8KKwlwdWJsaWMgSm9iU3luY2hyb25pemVyKFN0cmluZyBqb2JOYW1lLCBKb2JDb21tYW5kIGNvbW1hbmQsIElTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSkgeworCQlzdXBlcigpOworCQl0aGlzLmpvYiA9IHRoaXMuYnVpbGRKb2Ioam9iTmFtZSwgY29tbWFuZCwgc2NoZWR1bGluZ1J1bGUpOworCX0KKworCVN5bmNocm9uaXphdGlvbkpvYiBidWlsZEpvYihTdHJpbmcgam9iTmFtZSwgSm9iQ29tbWFuZCBjb21tYW5kLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHsKKwkJcmV0dXJuIG5ldyBTeW5jaHJvbml6YXRpb25Kb2Ioam9iTmFtZSwgY29tbWFuZCwgc2NoZWR1bGluZ1J1bGUpOworCX0KKworCisJLy8gKioqKioqKioqKiBTeW5jaHJvbml6ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLyoqCisJICogQWxsb3cgdGhlIGpvYiB0byBiZSBzY2hlZHVsZWQsIGJ1dCBwb3N0cG9uZSB0aGUgZmlyc3Qgc3luY2hyb25pemF0aW9uCisJICogdW50aWwgcmVxdWVzdGVkLCB2aWEge0BsaW5rICNzeW5jaHJvbml6ZSgpfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydCgpIHsKKwkJdGhpcy5qb2Iuc3RhcnQoKTsKKwl9CisKKwkvKioKKwkgKiAiU2NoZWR1bGUiIHRoZSBqb2IuCisJICovCisJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7CisJCXRoaXMuam9iLnN5bmNocm9uaXplKCk7CisJfQorCisJLyoqCisJICogV2FpdCBmb3IgdGhlIGN1cnJlbnQgam9iIGV4ZWN1dGlvbiB0byBjb21wbGV0ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wKCkgeworCQl0aGlzLmpvYi5zdG9wKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5qb2IpOworCX0KKworCisJLy8gKioqKioqKioqKiBzeW5jaHJvbml6YXRpb24gam9iICoqKioqKioqKioKKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGpvYiB0aGF0IGdldHMgc2NoZWR1bGVkIGJ5IHRoZSBqb2Igc3luY2hyb25pemVyLgorCSAqIFdoZW4gdGhlIGpvYiBpcyBydW4gaXQgZXhlY3V0ZXMgdGhlIGNsaWVudC1zdXBwbGllZCBqb2IgY29tbWFuZC4KKwkgKi8KKwlzdGF0aWMgY2xhc3MgU3luY2hyb25pemF0aW9uSm9iIGV4dGVuZHMgSm9iIHsKKwkJLyoqCisJCSAqIFRoZSBjbGllbnQtc3VwcGxpZWQgam9iIGNvbW1hbmQgdGhhdCBleGVjdXRlcyBldmVyeSB0aW1lIHRoZSBqb2IKKwkJICogcnVucy4KKwkJICovCisJCXByaXZhdGUgZmluYWwgSm9iQ29tbWFuZCBjb21tYW5kOworCisJCS8qKgorCQkgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgdG8gZmFsc2UsIHRoZSBqb2IgZG9lcyBub3Qgc3RvcCBpbW1lZGlhdGVseTsKKwkJICogYnV0IGl0IHdpbGwgbm90IGJlIHNjaGVkdWxlZCB0byBydW4gYWdhaW4uCisJCSAqLworCQkvLyB1c2UgJ3ZvbGF0aWxlJyBiZWNhdXNlIHN5bmNocm9uaXphdGlvbiBpc24ndCByZWFsbHkgcmVxdWlyZWQKKwkJdm9sYXRpbGUgYm9vbGVhbiBzaG91bGRTY2hlZHVsZTsKKworCisJCVN5bmNocm9uaXphdGlvbkpvYihTdHJpbmcgam9iTmFtZSwgSm9iQ29tbWFuZCBjb21tYW5kLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHsKKwkJCXN1cGVyKGpvYk5hbWUpOworCQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQkJfQorCQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKKwkJCXRoaXMuc2hvdWxkU2NoZWR1bGUgPSBmYWxzZTsKKwkJCXRoaXMuc2V0UnVsZShzY2hlZHVsaW5nUnVsZSk7CisJCX0KKworCQkvKioKKwkJICogSnVzdCBzZXQgdGhlICJzaG91bGQgc2NoZWR1bGUiIGZsYWcgc28gdGhlIGpvYiA8ZW0+Y2FuPC9lbT4gYmUKKwkJICogc2NoZWR1bGVkOyBidXQgZG9uJ3QgYWN0dWFsbHkgc2NoZWR1bGUgaXQuCisJCSAqLworCQl2b2lkIHN0YXJ0KCkgeworCQkJaWYgKHRoaXMuc2hvdWxkU2NoZWR1bGUpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgU3luY2hyb25pemVyIHdhcyBub3Qgc3RvcHBlZC4iKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJdGhpcy5zaG91bGRTY2hlZHVsZSA9IHRydWU7CisJCX0KKworCQkvKioKKwkJICogU2ltcGx5IHJlLXNjaGVkdWxlIHRoZSBqb2IsIGFsbG93aW5nIHRoZSBjdXJyZW50IGV4ZWN1dGlvbgorCQkgKiB0byBydW4gdG8gY29tcGxldGlvbiAoaS5lLiBkbyBub3QgdHJ5IHRvIGNhbmNlbCBpdCBwcmVtYXR1cmVseSkuCisJCSAqIFRoaXMgc2hvdWxkIG1pbmltaXplIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGpvYiBpcyByZS1leGVjdXRlZAorCQkgKiAocmVjdXJzaXZlbHkgYW5kIG90aGVyd2lzZSkuCisJCSAqLworCQl2b2lkIHN5bmNocm9uaXplKCkgeworCQkJdGhpcy5zY2hlZHVsZSgpOworCQl9CisKKwkJLyoqCisJCSAqIEFueSB1bmNhdWdodCBleGNlcHRpb25zIHRocm93biBieSB0aGUgY29tbWFuZCB3aWxsIGJlIHJlYXNvbmFibHkKKwkJICogaGFuZGxlZCBieSB0aGUgSm9iIEZyYW1ld29yay4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmpvYnMuV29ya2VyI3J1bigpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJcmV0dXJuIHRoaXMuY29tbWFuZC5leGVjdXRlKG1vbml0b3IpOworCQl9CisKKwkJLyoqCisJCSAqIFByZXZlbnQgdGhlIGpvYiBmcm9tIHJ1bm5pbmcgYWdhaW4gYW5kIHdhaXQgZm9yIHRoZSBjdXJyZW50CisJCSAqIGV4ZWN1dGlvbiwgaWYgdGhlcmUgaXMgYW55LCB0byBlbmQgYmVmb3JlIHJldHVybmluZy4KKwkJICovCisJCXZvaWQgc3RvcCgpIHsKKwkJCWlmICggISB0aGlzLnNob3VsZFNjaGVkdWxlKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIFN5bmNocm9uaXplciB3YXMgbm90IHN0YXJ0ZWQuIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCS8vIHRoaXMgd2lsbCBwcmV2ZW50IHRoZSBqb2IgZnJvbSBiZWluZyBzY2hlZHVsZWQgdG8gcnVuIGFnYWluCisJCQl0aGlzLnNob3VsZFNjaGVkdWxlID0gZmFsc2U7CisJCQkvLyB0aGlzIHdpbGwgY2FuY2VsIHRoZSBqb2IgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBzY2hlZHVsZWQsIGJ1dCBpcyBjdXJyZW50bHkgV0FJVElORworCQkJdGhpcy5jYW5jZWwoKTsKKwkJCXRyeSB7CisJCQkJLy8gaWYgdGhlIGpvYiBpcyBjdXJyZW50bHkgUlVOTklORywgd2FpdCB1bnRpbCBpdCBpcyBkb25lIGJlZm9yZSByZXR1cm5pbmcKKwkJCQl0aGlzLmpvaW4oKTsKKwkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisJCQkJLy8gdGhlIHRocmVhZCB0aGF0IGNhbGxlZCAjc3RvcCgpIHdhcyBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIHRvCisJCQkJLy8gam9pbiB0aGUgc3luY2hyb25pemF0aW9uIGpvYiAtIGlnbm9yZTsKKwkJCQkvLyAnc2hvdWxkU2NoZWR1bGUnIGlzIHN0aWxsIHNldCB0byAnZmFsc2UnLCBzbyB0aGUgam9iIGxvb3Agd2lsbCBzdGlsbCBzdG9wIC0gd2UKKwkJCQkvLyBqdXN0IHdvbid0IHdhaXQgYXJvdW5kIGZvciBpdC4uLgorCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIFRoaXMgaXMgcGFydCBvZiB0aGUgbm9ybWFsIHtAbGluayBKb2J9IGJlaGF2aW9yLiBCeSBkZWZhdWx0LCBpdCBpcworCQkgKiBub3QgdXNlZCAoaS5lLiBpdCBhbHdheXMgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPikuCisJCSAqIFdlIGltcGxlbWVudCBpdCBoZXJlLgorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIHNob3VsZFNjaGVkdWxlKCkgeworCQkJcmV0dXJuIHRoaXMuc2hvdWxkU2NoZWR1bGU7CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvUGxhdGZvcm1Ub29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvUGxhdGZvcm1Ub29scy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YmRiODIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9QbGF0Zm9ybVRvb2xzLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworCisvKioKKyAqIEEgY29sbGVjdGlvbiBvZiB1dGlsaXRpZXMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgRWNsaXBzZSBwbGF0Zm9ybSBBUEkuCisgKi8KK3B1YmxpYyBjbGFzcyBQbGF0Zm9ybVRvb2xzIHsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGZpbGUncyBjb250ZW50IHR5cGUsCisJICogdXNpbmcgdGhlIEVjbGlwc2UgcGxhdGZvcm0ncyBjb250ZW50IHR5cGUgbWFuYWdlci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZShJRmlsZSBmaWxlKSB7CisJCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TmFtZSgpOworCQlJbnB1dFN0cmVhbSBmaWxlQ29udGVudHMgPSBudWxsOworCQl0cnkgeworCQkJZmlsZUNvbnRlbnRzID0gZmlsZS5nZXRDb250ZW50cygpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7CisJCQkvLyBzZWVtcyBsaWtlIHdlIGNhbiBpZ25vcmUgYW55IGV4Y2VwdGlvbiB0aGF0IG1pZ2h0IG9jY3VyIGhlcmU7CisJCQkvLyBlLmcuIHdlIGdldCBhIEZORkUgaWYgdGhlIHdvcmtzcGFjZSBpcyBvdXQgb2Ygc3luY2ggd2l0aCB0aGUgTy9TIGZpbGUgc3lzdGVtCisJCQkvLyBKcHRDb3JlUGx1Z2luLmxvZyhleCk7CisKKwkJCS8vIGxvb2sgZm9yIGNvbnRlbnQgdHlwZSBiYXNlZCBvbiB0aGUgZmlsZSBuYW1lIG9ubHkoPykKKwkJCXJldHVybiBmaW5kQ29udGVudFR5cGVGb3IoZmlsZU5hbWUpOworCQl9CisKKwkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNvbnRlbnRUeXBlID0gZmluZENvbnRlbnRUeXBlRm9yKGZpbGVDb250ZW50cywgZmlsZU5hbWUpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlmaWxlQ29udGVudHMuY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisJCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJfQorCQl9CisJCXJldHVybiBjb250ZW50VHlwZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBJQ29udGVudFR5cGUgZmluZENvbnRlbnRUeXBlRm9yKElucHV0U3RyZWFtIGZpbGVDb250ZW50cywgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKGZpbGVDb250ZW50cywgZmlsZU5hbWUpOworCX0KKworCXByaXZhdGUgc3RhdGljIElDb250ZW50VHlwZSBmaW5kQ29udGVudFR5cGVGb3IoU3RyaW5nIGZpbGVOYW1lKSB7CisJCXJldHVybiBnZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoZmlsZU5hbWUpOworCX0KKworCXByaXZhdGUgc3RhdGljIElDb250ZW50VHlwZU1hbmFnZXIgZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkgeworCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7CisJfQorCisJcHJpdmF0ZSBQbGF0Zm9ybVRvb2xzKCkgeworCQlzdXBlcigpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVNjaGVkdWxpbmdSdWxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9TaW1wbGVTY2hlZHVsaW5nUnVsZS5qYXZhCmluZGV4IGE3N2IwYzAuLmI1MWIzM2MgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVNjaGVkdWxpbmdSdWxlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvU2ltcGxlU2NoZWR1bGluZ1J1bGUuamF2YQpAQCAtMTAsNiArMTAsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwogCiAvKioKICAqIEEgam9iIHNjaGVkdWxpbmcgcnVsZSB0aGF0IGNvbmZsaWN0cyBvbmx5IHdpdGggaXRzZWxmLgpAQCAtMTcsMjEgKzE4LDcgQEAKIHB1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVTY2hlZHVsaW5nUnVsZQogCWltcGxlbWVudHMgSVNjaGVkdWxpbmdSdWxlCiB7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVTY2hlZHVsaW5nUnVsZSBJTlNUQU5DRSA9IG5ldyBTaW1wbGVTY2hlZHVsaW5nUnVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJU2NoZWR1bGluZ1J1bGUgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgU2ltcGxlU2NoZWR1bGluZ1J1bGUoKSB7CisJcHVibGljIFNpbXBsZVNjaGVkdWxpbmdSdWxlKCkgewogCQlzdXBlcigpOwogCX0KIApAQCAtNDMsNCArMzAsOSBAQAogCQlyZXR1cm4gcnVsZSA9PSB0aGlzOwogCX0KIAorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOworCX0KKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvZW1mL0NvbXBvbmVudFV0aWxpdGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvZW1mL0NvbXBvbmVudFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2QyNmQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2VtZi9Db21wb25lbnRVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50VXRpbGl0aWVzCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBkZXBsb3ltZW50IHBhdGggZm9yIHRoZSBnaXZlbiBzb3VyY2UgZmlsZS4gIElmIHRoZXJlIGlzIG5vCi0JICogY29ycmVzcG9uZGluZyBkZXBsb3ltZW50IGZpbGUsIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGNvbXB1dGVEZXBsb3lQYXRoKElGaWxlIHNvdXJjZUZpbGUpIHsKLQkJLy8gVW5mb3J0dW5hdGVseSwgdGhlIG9ubHkgY3VycmVudCB3YXkgdG8gZG8gdGhpcyBpcyB0byBleGhhdXN0aXZlbHkgCi0JCS8vIHNlYXJjaCBhbGwgZGVwbG95bWVudCBmaWxlcyBhbmQgYXR0ZW1wdCB0byBtYXRjaCB0byB0aGlzIGZpbGUuCi0JCS8vIEJ1ZyAyMDI5NDMgaGFzIGJlZW4gbG9nZ2VkIHRvIHRyYWNrIHRoaXMgaXNzdWUuCi0JCWZvciAoSVZpcnR1YWxGaWxlIHZpcnR1YWxGaWxlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGFsbFZpcnR1YWxGaWxlcyhzb3VyY2VGaWxlLmdldFByb2plY3QoKSkpKSB7Ci0JCQlmb3IgKElGaWxlIHVuZGVybHlpbmdGaWxlIDogdmlydHVhbEZpbGUuZ2V0VW5kZXJseWluZ0ZpbGVzKCkpIHsKLQkJCQlpZiAoc291cmNlRmlsZS5lcXVhbHModW5kZXJseWluZ0ZpbGUpKSB7Ci0JCQkJCXJldHVybiB2aXJ0dWFsRmlsZS5nZXRSdW50aW1lUGF0aCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8SVZpcnR1YWxGaWxlPiBhbGxWaXJ0dWFsRmlsZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPElWaXJ0dWFsUmVzb3VyY2UsIElWaXJ0dWFsRmlsZT4oYWxsVmlydHVhbFJlc291cmNlcyhwcm9qZWN0KSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSVZpcnR1YWxSZXNvdXJjZSBvKSB7Ci0JCQkJcmV0dXJuIG8uZ2V0VHlwZSgpID09IElWaXJ0dWFsUmVzb3VyY2UuRklMRTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8SVZpcnR1YWxSZXNvdXJjZT4gYWxsVmlydHVhbFJlc291cmNlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCi0JCWlmICh2aXJ0dWFsQ29tcG9uZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPElWaXJ0dWFsUmVzb3VyY2U+KHZpcnR1YWxDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgSVZpcnR1YWxSZXNvdXJjZT4gY2hpbGRyZW4oSVZpcnR1YWxSZXNvdXJjZSBuZXh0KSB7Ci0JCQkJaWYgKG5leHQuZ2V0VHlwZSgpID09IElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKCgoSVZpcnR1YWxGb2xkZXIpIG5leHQpLm1lbWJlcnMoKSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsgLyogZmFsbCB0aHJvdWdoLCByZXR1cm4gZGVmYXVsdCBjYXNlICovIH0KLQkJCQl9Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9lbWYvRE9NVXRpbGl0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9lbWYvRE9NVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyM2EwZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvZW1mL0RPTVV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmVtZjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBET01VdGlsaXRpZXMKLQlleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01VdGlsaXRpZXMKLXsKLQkvKioKLQkgKiBHZXQgdGhlIGF0dHJpYnV0ZSBOb2RlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIAotCSAqLwotCXN0YXRpYyBwdWJsaWMgTm9kZSBjaGlsZEF0dHJpYnV0ZU5vZGUoTm9kZSBub2RlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQppbmRleCBlNzQ4NjZhLi44NWM0OTgzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3REZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCkBAIC02MCwxMSArNjAsMjAgQEAKIAkgKiBuYW1lIGJlZm9yZSBhZGRpbmcgaXQgdG8gdGhlIGRlY2xhcmF0aW9uLgogCSAqLwogCXByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb25BbmRJbXBvcnQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWRlY2xhcmF0aW9uLmFkZEltcG9ydCh0aGlzLmFubm90YXRpb25OYW1lKTsKLQkJYW5ub3RhdGlvbi5zZXRUeXBlTmFtZShkZWNsYXJhdGlvbi5nZXRBc3QoKS5uZXdOYW1lKHRoaXMuc2hvcnRBbm5vdGF0aW9uTmFtZSgpKSk7CisJCWFubm90YXRpb24uc2V0VHlwZU5hbWUoZGVjbGFyYXRpb24uZ2V0QXN0KCkubmV3TmFtZSh0aGlzLmdldFNvdXJjZUNvZGVBbm5vdGF0aW9uTmFtZShkZWNsYXJhdGlvbikpKTsKIAkJdGhpcy5hZGRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKTsKIAl9CiAKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGFubm90YXRpb24ncyBuYW1lIGFzIGl0IGNhbiBiZSB1c2VkIGluIHNvdXJjZSBjb2RlOworCSAqIGkuZS4gaWYgd2UgY2FuIGFkZCBpdCB0byB0aGUgY29tcGlsYXRpb24gdW5pdCdzIGltcG9ydHMsIHJldHVybiB0aGUgc2hvcnQKKwkgKiBuYW1lOyBpZiB3ZSBjYW4ndCAoYmVjYXVzZSBvZiBhIGNvbGxpc2lvbiksIHJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUuCisJICogTkI6IGFuIGltcG9ydCBtYXkgYmUgYWRkZWQgYXMgYSBzaWRlLWVmZmVjdCA6LSgKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZUNvZGVBbm5vdGF0aW9uTmFtZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CisJCXJldHVybiBkZWNsYXJhdGlvbi5hZGRJbXBvcnQodGhpcy5hbm5vdGF0aW9uTmFtZSkgPyB0aGlzLmdldFNob3J0QW5ub3RhdGlvbk5hbWUoKSA6IHRoaXMuYW5ub3RhdGlvbk5hbWU7CisJfQorCiAJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5hbm5vdGF0aW9uTmFtZSk7CkBAIC03OSw2ICs4OCwxMCBAQAogCiAJLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCiAKKwkvKioKKwkgKiBUaGlzIGlzICdwdWJsaWMnIGJlY2F1c2Ugd2UgdXNlIGl0IGluIENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKKwkgKiB0byBnZXQgdGhlIGFubm90YXRpb24gbmFtZSBmcm9tIGEgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuCisJICovCiAJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKIAkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbk5hbWU7CiAJfQpAQCAtMTI0LDExICsxMzcsMTEgQEAKIAkJcmV0dXJuIGFubm90YXRpb247CiAJfQogCi0JcHJvdGVjdGVkIFN0cmluZyBzaG9ydEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zaG9ydE5hbWUodGhpcy5hbm5vdGF0aW9uTmFtZSk7CisJcHJvdGVjdGVkIFN0cmluZyBnZXRTaG9ydEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gY29udmVydFRvU2hvcnROYW1lKHRoaXMuYW5ub3RhdGlvbk5hbWUpOwogCX0KIAkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNob3J0TmFtZShTdHJpbmcgbmFtZSkgeworCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1Nob3J0TmFtZShTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7CiAJfQogCQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmluZGV4IGViNjllNjQuLmE0YmRlNjcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAkgKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gZm9yIGEgbnVsbCBvYmplY3QuIEJ5IGRlZmF1bHQsIGEgbnVsbCBvYmplY3Qgd2lsbAogCSAqIGJlIGNvbnZlcnRlZCBpbnRvIGEgbnVsbCBleHByZXNzaW9uLgogCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIGNvbnZlcnROdWxsKEFTVCBhc3QpIHsKKwlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBjb252ZXJ0TnVsbChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQVNUIGFzdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQppbmRleCBkZjg1NTZmLi45NjA2ZTY1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0TmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCkBAIC0zMSw2ICszMSw5IEBACiAJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWU7CiAJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlbW92ZU91dGVyQW5ub3RhdGlvbldoZW5FbXB0eTsKIAorCS8vIHJlZHVjZSBOTFMgY2hlY2tzCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCisKIAogCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKIApAQCAtMzksNyArNDIsNyBAQAogCSAqIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBvdXRlciBhbm5vdGF0aW9uIHdoZW4gaXQgaXMgZW1wdHkKIAkgKi8KIAlwcm90ZWN0ZWQgQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgb3V0ZXJBbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXRoaXMob3V0ZXJBbm5vdGF0aW9uQWRhcHRlciwgInZhbHVlIiwgYW5ub3RhdGlvbk5hbWUpOworCQl0aGlzKG91dGVyQW5ub3RhdGlvbkFkYXB0ZXIsIFZBTFVFLCBhbm5vdGF0aW9uTmFtZSk7CiAJfQogCiAJLyoqCkBAIC0xMTcsNyArMTIwLDcgQEAKIAkJfSBlbHNlIGlmIChvdXRlci5pc05vcm1hbEFubm90YXRpb24oKSkgewogCQkJdGhpcy5tb2RpZnlBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCAoTm9ybWFsQW5ub3RhdGlvbikgb3V0ZXIsIGlubmVyKTsKIAkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgb3V0ZXIpOworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBvdXRlcik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCX0KIApAQCAtMTkwLDcgKzE5Myw3IEBACiAJCX0gZWxzZSBpZiAob3V0ZXIuaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKIAkJCXRoaXMucmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShkZWNsYXJhdGlvbiwgKE1hcmtlckFubm90YXRpb24pIG91dGVyKTsKIAkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgb3V0ZXIpOworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBvdXRlcik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCX0KIApAQCAtMjQwLDcgKzI0Myw3IEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIDE6CiAJCQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSB2YWx1ZXMuZ2V0KDApOwotCQkJCWlmIChwYWlyLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoInZhbHVlIikpIHsKKwkJCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFZBTFVFKSkgewogCQkJCQkvLyBpZiB0aGUgbGFzdCByZW1haW5pbmcgZWxlbWVudCBpcyAndmFsdWUnLCBjb252ZXJ0IHRoZSBhbm5vdGF0aW9uIHRvIGEgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uCiAJCQkJCUV4cHJlc3Npb24gdnYgPSBwYWlyLmdldFZhbHVlKCk7CiAJCQkJCXZ2ID0gKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodnYuZ2V0QVNUKCksIHZ2KTsKQEAgLTI1Nyw4ICsyNjAsOCBAQAogCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gdG8gYSBtYXJrZXIgYW5ub3RhdGlvbgogCSAqIGlmIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lIGlzICJ2YWx1ZSIuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG91dGVyKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnROYW1lLmVxdWFscygidmFsdWUiKSkgeworCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnRBbmROb3JtYWxpemUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNpbmdsZU1lbWJlckFubm90YXRpb24gb3V0ZXIpIHsKKwkJaWYgKHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKFZBTFVFKSkgewogCQkJaWYgKHRoaXMucmVtb3ZlT3V0ZXJBbm5vdGF0aW9uV2hlbkVtcHR5KSB7CiAJCQkJdGhpcy5vdXRlckFubm90YXRpb25BZGFwdGVyLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwogCQkJfSBlbHNlIHsKQEAgLTI2OCw3ICsyNzEsNyBAQAogCQl9CiAJfQogCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBNYXJrZXJBbm5vdGF0aW9uIG91dGVyKSB7CisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTWFya2VyQW5ub3RhdGlvbiBvdXRlcikgewogCQlpZiAodGhpcy5yZW1vdmVPdXRlckFubm90YXRpb25XaGVuRW1wdHkpIHsKIAkJCXRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKIAkJfQpAQCAtMzAxLDcgKzMwNCw3IEBACiAJICogYW5ub3RhdGlvbiwgb3RoZXJ3aXNlIHJldHVybiBudWxsLgogCSAqLwogCXByb3RlY3RlZCBFeHByZXNzaW9uIGVsZW1lbnRWYWx1ZShTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKCJ2YWx1ZSIpID8gYW5ub3RhdGlvbi5nZXRWYWx1ZSgpIDogbnVsbDsKKwkJcmV0dXJuIHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKFZBTFVFKSA/IGFubm90YXRpb24uZ2V0VmFsdWUoKSA6IG51bGw7CiAJfQogCiAJLyoqCkBAIC0zMjksNyArMzMyLDcgQEAKIAkgKiA8L3ByZT4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBidWlsZE5ld091dGVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIGlubmVyKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnROYW1lLmVxdWFscygidmFsdWUiKSkgeworCQlpZiAodGhpcy5lbGVtZW50TmFtZS5lcXVhbHMoVkFMVUUpKSB7CiAJCQl0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbikuc2V0VmFsdWUodGhpcy5idWlsZE5ld0lubmVyRXhwcmVzc2lvbihpbm5lcikpOwogCQl9IGVsc2UgewogCQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyA9IHRoaXMudmFsdWVzKHRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSk7CkBAIC0zNjUsNyArMzY4LDcgQEAKIAkvKioKIAkgKiBBZGQgdGhlIHNwZWNpZmllZCBpbm5lciBhbm5vdGF0aW9uIHRvIHRoZSBtYXJrZXIgYW5ub3RhdGlvbi4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIE1hcmtlckFubm90YXRpb24gb3V0ZXIsIEFubm90YXRpb24gaW5uZXIpIHsKKwlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNYXJrZXJBbm5vdGF0aW9uIG91dGVyLCBBbm5vdGF0aW9uIGlubmVyKSB7CiAJCXRoaXMuYnVpbGROZXdPdXRlckFubm90YXRpb24oZGVjbGFyYXRpb24sIGlubmVyKTsKIAl9CiAKQEAgLTM3Myw3ICszNzYsNyBAQAogCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGlubmVyIGFubm90YXRpb24gdG8gdGhlIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbi4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFNpbmdsZU1lbWJlckFubm90YXRpb24gb3V0ZXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJaWYgKHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKCJ2YWx1ZSIpKSB7CisJCWlmICh0aGlzLmVsZW1lbnROYW1lLmVxdWFscyhWQUxVRSkpIHsKIAkJCXRoaXMubW9kaWZ5QW5ub3RhdGlvblZhbHVlKG91dGVyLCBpbm5lcik7CiAJCX0gZWxzZSB7CiAJCQl0aGlzLm1vZGlmeUFubm90YXRpb25Ob25WYWx1ZShkZWNsYXJhdGlvbiwgb3V0ZXIsIGlubmVyKTsKQEAgLTM5Miw3ICszOTUsNyBAQAogCQl2diA9IChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHZ2LmdldEFTVCgpLCB2dik7CiAJCU5vcm1hbEFubm90YXRpb24gbmV3T3V0ZXIgPSB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7CiAJCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMgPSB0aGlzLnZhbHVlcyhuZXdPdXRlcik7Ci0JCXZhbHVlcy5hZGQodGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoInZhbHVlIiwgdnYpKTsKKwkJdmFsdWVzLmFkZCh0aGlzLm5ld01lbWJlclZhbHVlUGFpcihWQUxVRSwgdnYpKTsKIAkJdmFsdWVzLmFkZCh0aGlzLm5ld01lbWJlclZhbHVlUGFpcih0aGlzLmJ1aWxkTmV3SW5uZXJFeHByZXNzaW9uKGlubmVyKSkpOwogCX0KIApAQCAtNDA2LDcgKzQwOSw3IEBACiAJICogICAgICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIoImxvcmVtIGlwc3VtIikpID0+ICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIpCiAJICogPC9wcmU+CiAJICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kaWZ5QW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBOb3JtYWxBbm5vdGF0aW9uIG91dGVyLCBBbm5vdGF0aW9uIGlubmVyKSB7CisJcHJvdGVjdGVkIHZvaWQgbW9kaWZ5QW5ub3RhdGlvbihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgTm9ybWFsQW5ub3RhdGlvbiBvdXRlciwgQW5ub3RhdGlvbiBpbm5lcikgewogCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHRoaXMubWVtYmVyVmFsdWVQYWlyKG91dGVyKTsKIAkJaWYgKHBhaXIgPT0gbnVsbCkgewogCQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyA9IHRoaXMudmFsdWVzKG91dGVyKTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCmluZGV4IDJmYmM4YTcuLmU0M2EzMGU5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKQEAgLTkzLDYgKzkzLDkgQEAKIAkgKi8KIAlwcml2YXRlIGZpbmFsIE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHplcm9OZXN0ZWRBbm5vdGF0aW9uQWRhcHRlcjsKIAorCS8vIHJlZHVjZSBOTFMgY2hlY2tzCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCisKIAogCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKIApAQCAtMTA0LDcgKzEwNyw3IEBACiAJICogPC9wcmU+CiAJICovCiAJcHVibGljIENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUsIGludCBpbmRleCkgewotCQl0aGlzKGFubm90YXRpb25OYW1lLCBjb250YWluZXJBbm5vdGF0aW9uTmFtZSwgInZhbHVlIiwgaW5kZXgpOworCQl0aGlzKGFubm90YXRpb25OYW1lLCBjb250YWluZXJBbm5vdGF0aW9uTmFtZSwgVkFMVUUsIGluZGV4KTsKIAl9CiAKIAlwdWJsaWMgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBpbnQgaW5kZXgpIHsKQEAgLTEyMCw3ICsxMjMsNyBAQAogCQkJaW50IGluZGV4LCAKIAkJCVN0cmluZyBuZXN0ZWRBbm5vdGF0aW9uTmFtZQogCSkgewotCQl0aGlzKHN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlciwgY29udGFpbmVyQW5ub3RhdGlvbkFkYXB0ZXIsICJ2YWx1ZSIsIGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uTmFtZSk7CisJCXRoaXMoc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyLCBjb250YWluZXJBbm5vdGF0aW9uQWRhcHRlciwgVkFMVUUsIGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uTmFtZSk7CiAJfQogCiAJcHVibGljIENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCkBAIC0yMzEsNyArMjM0LDcgQEAKIAkJCQkvLyB3ZSBhcmUgbW92aW5nIGEgJ251bGwnIGVudHJ5IG9uIHRvcCBvZiB0aGUgc3RhbmRhbG9uZSwgc28gcmVtb3ZlIGl0CiAJCQkJdGhpcy5yZW1vdmVTdGFuZEFsb25lQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7CiAJCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm9sZCBpbmRleCA9ICIgKyBvbGRJbmRleCArICI7IG5ldyBpbmRleCA9ICIgKyBuZXdJbmRleCk7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigib2xkIGluZGV4ID0gIiArIG9sZEluZGV4ICsgIjsgbmV3IGluZGV4ID0gIiArIG5ld0luZGV4KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQl9CiAJCX0KIAl9CkBAIC0yODYsNyArMjg5LDcgQEAKIAlwcml2YXRlIHZvaWQgbW92ZVN0YW5kQWxvbmVBbm5vdGF0aW9uVG9Db250YWluZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKIAkJQW5ub3RhdGlvbiBzdGFuZEFsb25lQW5ub3RhdGlvbiA9IHRoaXMuZ2V0U3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwogCQlpZiAoc3RhbmRBbG9uZUFubm90YXRpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGhlIHN0YW5kLWFsb25lIGFubm90YXRpb24gaXMgbWlzc2luZyIpOworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGhlIHN0YW5kLWFsb25lIGFubm90YXRpb24gaXMgbWlzc2luZyIpOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJdGhpcy5tb3ZlU3RhbmRBbG9uZUFubm90YXRpb25Ub0NvbnRhaW5lckFubm90YXRpb24oc3RhbmRBbG9uZUFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKIAl9CkBAIC0zMDksNyArMzEyLDcgQEAKIAkJCQl2YWx1ZXMuYWRkKChNZW1iZXJWYWx1ZVBhaXIpIEFTVE5vZGUuY29weVN1YnRyZWUocGFpci5nZXRBU1QoKSwgcGFpcikpOwogCQkJfQogCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBzdGFuZEFsb25lQW5ub3RhdGlvbik7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIHN0YW5kQWxvbmVBbm5vdGF0aW9uKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCXRoaXMucmVtb3ZlU3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwogCX0KQEAgLTMzNCw3ICszMzcsNyBAQAogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJCWlmIChjb250YWluZXJBbm5vdGF0aW9uLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQlpZiAodGhpcy5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygidmFsdWUiKSkgeworCQkJaWYgKHRoaXMuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoVkFMVUUpKSB7CiAJCQkJcmV0dXJuICgoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGNvbnRhaW5lckFubm90YXRpb24pLmdldFZhbHVlKCkuZ2V0Tm9kZVR5cGUoKSAhPSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKQogCQkJCQkJJiYgKHRoaXMuemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pICE9IG51bGwpOwogCQkJfQpAQCAtMzU1LDcgKzM1OCw3IEBACiAJCQl9CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBjb250YWluZXJBbm5vdGF0aW9uKTsKKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBjb250YWluZXJBbm5vdGF0aW9uKTsgLy8kTk9OLU5MUy0xJAogCX0KIAogCS8qKgpAQCAtMzY1LDcgKzM2OCw3IEBACiAJcHJpdmF0ZSB2b2lkIGNvbnZlcnRMYXN0RWxlbWVudEFubm90YXRpb25Ub1N0YW5kQWxvbmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKIAkJQW5ub3RhdGlvbiBsYXN0ID0gdGhpcy56ZXJvTmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7CiAJCWlmIChsYXN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRoZSBsYXN0IG5lc3RlZCBhbm5vdGF0aW9uIGlzIG1pc3NpbmciKTsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRoZSBsYXN0IG5lc3RlZCBhbm5vdGF0aW9uIGlzIG1pc3NpbmciKTsgLy8kTk9OLU5MUy0xJAogCQl9IGVsc2UgaWYgKGxhc3QuaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKIAkJCXRoaXMubmV3U3RhbmRBbG9uZU1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwogCQl9IGVsc2UgaWYgKGxhc3QuaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKQEAgLTM3OSw3ICszODIsNyBAQAogCQkJCXZhbHVlcy5hZGQoKE1lbWJlclZhbHVlUGFpcikgQVNUTm9kZS5jb3B5U3VidHJlZShwYWlyLmdldEFTVCgpLCBwYWlyKSk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIGxhc3QpOworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBsYXN0KTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCXRoaXMuemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwogCX0KQEAgLTQ2Niw3ICs0NjksNyBAQAogCQl9CiAJCUBPdmVycmlkZQogCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJNYXJrZXJBbm5vdGF0aW9uRmFjdG9yeSI7CisJCQlyZXR1cm4gIk1hcmtlckFubm90YXRpb25GYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfTsKIApAQCAtNDc2LDcgKzQ3OSw3IEBACiAJCX0KIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlNpbmdsZU1lbWJlckFubm90YXRpb25GYWN0b3J5IjsKKwkJCXJldHVybiAiU2luZ2xlTWVtYmVyQW5ub3RhdGlvbkZhY3RvcnkiOyAvLyROT04tTkxTLTEkCiAJCX0KIAl9OwogCkBAIC00ODYsNyArNDg5LDcgQEAKIAkJfQogCQlAT3ZlcnJpZGUKIAkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiTm9ybWFsQW5ub3RhdGlvbkZhY3RvcnkiOworCQkJcmV0dXJuICJOb3JtYWxBbm5vdGF0aW9uRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKIAkJfQogCX07CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKaW5kZXggY2IzOWRlYy4uMzFmZmU2NSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKQEAgLTQwLDcgKzQwLDcgQEAKIAkgKiByZW1vdmUgdGhlIGFubm90YXRpb24gd2hlbiB0aGUgbGFzdCBlbGVtZW50IGlzIHJlbW92ZWQuCiAJICovCiAJcHVibGljIEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJdGhpcyhhbm5vdGF0aW9uQWRhcHRlciwgInZhbHVlIik7CisJCXRoaXMoYW5ub3RhdGlvbkFkYXB0ZXIsIFZBTFVFKTsKIAl9CiAKIAkvKioKQEAgLTgwLDcgKzgwLDcgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmdbXSB2YWx1ZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUodGhpcy5jb252ZXJ0VG9TaG9ydE5hbWVzKHZhbHVlLCBkZWNsYXJhdGlvbiksIGRlY2xhcmF0aW9uKTsKKwkJdGhpcy5hZGFwdGVyLnNldFZhbHVlKHRoaXMuY29udmVydFRvU291cmNlQ29kZU5hbWVzKHZhbHVlLCBkZWNsYXJhdGlvbiksIGRlY2xhcmF0aW9uKTsKIAl9CiAKIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKQEAgLTExMiw3ICsxMTIsNyBAQAogCQl9CiAJfQogCi0JcHJvdGVjdGVkIFN0cmluZ1tdIHJlc29sdmVBcnJheShBcnJheUluaXRpYWxpemVyIGFpLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CisJcHJvdGVjdGVkIFN0cmluZ1tdIHJlc29sdmVBcnJheShBcnJheUluaXRpYWxpemVyIGFpLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewogCQlMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gdGhpcy5leHByZXNzaW9ucyhhaSk7CiAJCWludCBsZW4gPSBleHByZXNzaW9ucy5zaXplKCk7CiAJCVN0cmluZ1tdIGVudW1zID0gbmV3IFN0cmluZ1tsZW5dOwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJCXJldHVybiBlbnVtczsKIAl9CiAKLQlwcm90ZWN0ZWQgU3RyaW5nW10gcmVzb2x2ZVNpbmdsZUVsZW1lbnQoRXhwcmVzc2lvbiBlbnVtRXhwcmVzc2lvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgeworCXByb3RlY3RlZCBTdHJpbmdbXSByZXNvbHZlU2luZ2xlRWxlbWVudChFeHByZXNzaW9uIGVudW1FeHByZXNzaW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewogCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHt0aGlzLnJlc29sdmVFbnVtKGVudW1FeHByZXNzaW9uKX07CiAJfQogCkBAIC0xMzAsMzQgKzEzMCwzMCBAQAogCQlyZXR1cm4gSkRUVG9vbHMucmVzb2x2ZUVudW0oZXhwcmVzc2lvbik7CiAJfQogCisJLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NkIHdhcm5pbmdzCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJcHJpdmF0ZSBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zKEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplcikgewogCQlyZXR1cm4gYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpOwogCX0KIAogCS8qKgotCSAqIGNvbnZlcnQgdGhlIGZ1bGx5LXF1YWxpZmllZCBlbnVtcyB0byBzdGF0aWMgaW1wb3J0cyBhbmQgc2hvcnQgbmFtZXM7Ci0JICogTkI6IHRoZSBpbXBvcnRzIGFyZSBhZGRlZCBhcyBhIHNpZGUtZWZmZWN0IDotKAorCSAqIGNvbnZlcnQgdGhlIGZ1bGx5LXF1YWxpZmllZCBlbnVtcyB0byBuYW1lcyB0aGF0IGNhbiBiZSBpbnNlcnRlZCBpbiBzb3VyY2UgY29kZQorCSAqIE5COiBpbXBvcnRzIG1heSBiZSBhZGRlZCBhcyBhIHNpZGUtZWZmZWN0IDotKAogCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBjb252ZXJ0VG9TaG9ydE5hbWVzKFN0cmluZ1tdIGVudW1zLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CisJcHJvdGVjdGVkIFN0cmluZ1tdIGNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lcyhTdHJpbmdbXSBlbnVtcywgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewogCQlpZiAoZW51bXMgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAkJaW50IGxlbiA9IGVudW1zLmxlbmd0aDsKLQkJU3RyaW5nW10gc2hvcnROYW1lcyA9IG5ldyBTdHJpbmdbbGVuXTsKLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlkZWNsYXJhdGlvbi5hZGRTdGF0aWNJbXBvcnQoZW51bXNbaV0pOyAgLy8gZS5nLiAiamF2YXgucGVyc2lzdGVuY2UuQ2FzY2FkZVR5cGUuUkVGUkVTSCIKLQkJCXNob3J0TmFtZXNbaV0gPSB0aGlzLnNob3J0TmFtZShlbnVtc1tpXSk7ICAvLyBlLmcuICJFQUdFUiIKKwkJU3RyaW5nW10gc291cmNlQ29kZU5hbWVzID0gbmV3IFN0cmluZ1tsZW5dOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlzb3VyY2VDb2RlTmFtZXNbaV0gPSB0aGlzLmNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lKGVudW1zW2ldLCBkZWNsYXJhdGlvbik7CiAJCX0KLQkJcmV0dXJuIHNob3J0TmFtZXM7CisJCXJldHVybiBzb3VyY2VDb2RlTmFtZXM7CiAJfQogCi0JcHJvdGVjdGVkIFN0cmluZyBzaG9ydFR5cGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxhc3RJbmRleE9mKCcuJykpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgc2hvcnROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lKFN0cmluZyBlbnVtXywgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgeworCQlyZXR1cm4gRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lKGVudW1fLCBkZWNsYXJhdGlvbik7CiAJfQogCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKaW5kZXggYWVmYjk2ZS4uNGZlN2Y5YyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpAQCAtMzUsNyArMzUsNyBAQAogCSAqIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgaXMgcmVtb3ZlZC4KIAkgKi8KIAlwdWJsaWMgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJdGhpcyhhbm5vdGF0aW9uQWRhcHRlciwgInZhbHVlIik7CisJCXRoaXMoYW5ub3RhdGlvbkFkYXB0ZXIsIFZBTFVFKTsKIAl9CiAKIAkvKioKQEAgLTYzLDcgKzYzLDcgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5hZGFwdGVyLnNldFZhbHVlKHRoaXMuY29udmVydFRvU2hvcnROYW1lKHZhbHVlLCBkZWNsYXJhdGlvbiksIGRlY2xhcmF0aW9uKTsKKwkJdGhpcy5hZGFwdGVyLnNldFZhbHVlKGNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lKHZhbHVlLCBkZWNsYXJhdGlvbiksIGRlY2xhcmF0aW9uKTsKIAl9CiAKIAlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKQEAgLTg1LDIyICs4NSw0NCBAQAogCX0KIAogCS8qKgotCSAqIGNvbnZlcnQgdGhlIGZ1bGx5LXF1YWxpZmllZCBlbnVtIHRvIGEgc3RhdGljIGltcG9ydCBhbmQgaXRzIHNob3J0IG5hbWUKKwkgKiBjb252ZXJ0IHRoZSBmdWxseS1xdWFsaWZpZWQgZW51bSBjb25zdGFudCB0byBhIHN0YXRpYyBpbXBvcnQgYW5kIHRoZSBjb25zdGFudCdzIHNob3J0IG5hbWUsIGUuZy4KKwkgKiAgICAgc3RhdGljIGltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5GZXRjaFR5cGUuRUFHRVI7CisJICogICAgIHJldHVybiAiRUFHRVIiCisJICogaWYgdGhhdCBkb2Vzbid0IHdvcmssIGNvbnZlcnQgdG8gYSBub3JtYWwgaW1wb3J0IGFuZCB0aGUgY29uc3RhbnQncyBwYXJ0aWFsbHktcXVhbGlmaWVkIG5hbWUsIGUuZy4KKwkgKiAgICAgaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkZldGNoVHlwZTsKKwkgKiAgICAgcmV0dXJuICJGZXRjaFR5cGUuRUFHRVIiCisJICogaWYgdGhhdCBkb2Vzbid0IHdvcmssIHNpbXBseSByZXR1cm4gdGhlIGNvbnN0YW50J3MgZnVsbHktcXVhbGlmaWVkIG5hbWUsIGUuZy4KKwkgKiAgICAgcmV0dXJuICJqYXZheC5wZXJzaXN0ZW5jZS5GZXRjaFR5cGUuRUFHRVIiCisJICogTkI6IGFuIGltcG9ydCBtYXkgYmUgYWRkZWQgYXMgYSBzaWRlLWVmZmVjdCA6LSgKIAkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1Nob3J0TmFtZShTdHJpbmcgc3RyaW5nLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZGVjbGFyYXRpb24uYWRkU3RhdGljSW1wb3J0KHN0cmluZyk7ICAvLyBlLmcuICJqYXZheC5wZXJzaXN0ZW5jZS5GZXRjaFR5cGUuRUFHRVIiCi0JCXJldHVybiB0aGlzLnNob3J0TmFtZShzdHJpbmcpOyAgLy8gZS5nLiAiRUFHRVIiCisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU291cmNlQ29kZU5hbWUoU3RyaW5nIGVudW1Db25zdGFudE5hbWUsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKKwkJcmV0dXJuIChlbnVtQ29uc3RhbnROYW1lID09IG51bGwpID8gbnVsbCA6IGNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lXyhlbnVtQ29uc3RhbnROYW1lLCBkZWNsYXJhdGlvbik7CiAJfQogCi0JcHJvdGVjdGVkIFN0cmluZyBzaG9ydFR5cGVOYW1lKFN0cmluZyBuYW1lKSB7CisJLyoqCisJICogcHJlLWNvbmRpdGlvbjogZW51bSBjb25zdGFudCBuYW1lIGlzIG5vbi1udWxsOworCSAqIGNvbnZlcnQgaXQgdG8gaXRzIHNob3J0IHZlcnNpb24gaWYgd2UgY2FuIGFkZCBhIHN0YXRpYyBpbXBvcnQgZXRjLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lXyhTdHJpbmcgZW51bUNvbnN0YW50TmFtZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgeworCQlpZiAoZGVjbGFyYXRpb24uYWRkU3RhdGljSW1wb3J0KGVudW1Db25zdGFudE5hbWUpKSB7CisJCQlyZXR1cm4gY29udmVydFRvU2hvcnROYW1lKGVudW1Db25zdGFudE5hbWUpOworCQl9CisJCWlmIChkZWNsYXJhdGlvbi5hZGRJbXBvcnQoY29udmVydFRvVHlwZU5hbWUoZW51bUNvbnN0YW50TmFtZSkpKSB7CisJCQlyZXR1cm4gY29udmVydFRvUGFydGlhbGx5UXVhbGlmaWVkTmFtZShlbnVtQ29uc3RhbnROYW1lKTsKKwkJfQorCQlyZXR1cm4gZW51bUNvbnN0YW50TmFtZTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TaG9ydE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1R5cGVOYW1lKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxhc3RJbmRleE9mKCcuJykpOwogCX0KIAotCXByb3RlY3RlZCBTdHJpbmcgc2hvcnROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9QYXJ0aWFsbHlRdWFsaWZpZWROYW1lKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCcuJywgbmFtZS5sYXN0SW5kZXhPZignLicpIC0gMSkgKyAxKTsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQppbmRleCAxN2ZiZDMyLi5iOTZhN2RlIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRXhwcmVzc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0V4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCkBAIC01NiwxNCArNTYsMTQgQEAKIAkgKiByZW1vdmUgdGhlIGFubm90YXRpb24gd2hlbiB0aGUgbGFzdCBlbGVtZW50IGlzIHJlbW92ZWQuCiAJICovCiAJcHVibGljIEV4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXRoaXMoYW5ub3RhdGlvbkFkYXB0ZXIsICJ2YWx1ZSIpOworCQl0aGlzKGFubm90YXRpb25BZGFwdGVyLCBWQUxVRSk7CiAJfQogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzICJ2YWx1ZSIuCiAJICovCiAJcHVibGljIEV4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBib29sZWFuIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHkpIHsKLQkJdGhpcyhhbm5vdGF0aW9uQWRhcHRlciwgInZhbHVlIiwgcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSk7CisJCXRoaXMoYW5ub3RhdGlvbkFkYXB0ZXIsIFZBTFVFLCByZW1vdmVBbm5vdGF0aW9uV2hlbkVtcHR5KTsKIAl9CiAKIAkvKioKQEAgLTEzMCw3ICsxMzAsNyBAQAogCQlpZiAoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSkgewogCQkJcmV0dXJuIHRoaXMuZXhwcmVzc2lvbk5vcm1hbEFubm90YXRpb24oKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24pOwogCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgYW5ub3RhdGlvbik7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgYW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIAlwcm90ZWN0ZWQgRSBleHByZXNzaW9uTm9Bbm5vdGF0aW9uKCkgewpAQCAtMTQyLDcgKzE0Miw3IEBACiAJICogd2l0aCB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZS4KIAkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgogCSAqLwotCXByb3RlY3RlZCBFIGV4cHJlc3Npb25NYXJrZXJBbm5vdGF0aW9uKE1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbikgeworCXByb3RlY3RlZCBFIGV4cHJlc3Npb25NYXJrZXJBbm5vdGF0aW9uKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCkBAIC0xNTIsNyArMTUyLDcgQEAKIAkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgogCSAqLwogCXByb3RlY3RlZCBFIGV4cHJlc3Npb25TaW5nbGVNZW1iZXJBbm5vdGF0aW9uKFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5kb3duY2FzdCh0aGlzLmVsZW1lbnROYW1lLmVxdWFscygidmFsdWUiKSA/IGFubm90YXRpb24uZ2V0VmFsdWUoKSA6IG51bGwpOworCQlyZXR1cm4gdGhpcy5kb3duY2FzdCh0aGlzLmVsZW1lbnROYW1lLmVxdWFscyhWQUxVRSkgPyBhbm5vdGF0aW9uLmdldFZhbHVlKCkgOiBudWxsKTsKIAl9CiAKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKQEAgLTE5Myw3ICsxOTMsNyBAQAogCQkJdGhpcy5zZXRWYWx1ZU5vcm1hbEFubm90YXRpb24odmFsdWUsIChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBkZWNsYXJhdGlvbik7CiAJCX0KIAkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIGFubm90YXRpb24pOworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBhbm5vdGF0aW9uKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfQogCkBAIC0yMDEsNyArMjAxLDcgQEAKIAkgKiBhZGQgbm9uLW51bGwsIG5vbi1lbXB0eSB2YWx1ZQogCSAqLwogCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlTm9Bbm5vdGF0aW9uKEV4cHJlc3Npb24gdmFsdWUsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKCJ2YWx1ZSIpKSB7CisJCWlmICh0aGlzLmVsZW1lbnROYW1lLmVxdWFscyhWQUxVRSkpIHsKIAkJCS8vIEBGb28oInh4eCIpCiAJCQl0aGlzLmFubm90YXRpb25BZGFwdGVyLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pLnNldFZhbHVlKHZhbHVlKTsKIAkJfSBlbHNlIHsKQEAgLTIyMyw3ICsyMjMsNyBAQAogCQl2YWx1ZXMuYWRkKHBhaXIpOwogCX0KIAkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZU1hcmtlckFubm90YXRpb24oRXhwcmVzc2lvbiB2YWx1ZSwgTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CisJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVNYXJrZXJBbm5vdGF0aW9uKEV4cHJlc3Npb24gdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKIAkJLy8gQEZvbyA9PiBARm9vKCJ4eHgiKQogCQkvLyAgICAgb3IKIAkJLy8gQEZvbyA9PiBARm9vKGJhcj0ieHh4IikKQEAgLTIzMSw3ICsyMzEsNyBAQAogCX0KIAogCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihFeHByZXNzaW9uIHZhbHVlLCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKCJ2YWx1ZSIpKSB7CisJCWlmICh0aGlzLmVsZW1lbnROYW1lLmVxdWFscyhWQUxVRSkpIHsKIAkJCS8vIEBGb28oInl5eSIpID0+IEBGb28oInh4eCIpCiAJCQlhbm5vdGF0aW9uLnNldFZhbHVlKHZhbHVlKTsKIAkJfSBlbHNlIHsKQEAgLTIzOSwxMiArMjM5LDEyIEBACiAJCQlFeHByZXNzaW9uIHZ2ID0gYW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwogCQkJdnYgPSAoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh2di5nZXRBU1QoKSwgdnYpOwogCQkJTm9ybWFsQW5ub3RhdGlvbiBub3JtYWxBbm5vdGF0aW9uID0gdGhpcy5hbm5vdGF0aW9uQWRhcHRlci5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCXRoaXMuYWRkVmFsdWUodnYsIG5vcm1hbEFubm90YXRpb24sICJ2YWx1ZSIpOworCQkJdGhpcy5hZGRWYWx1ZSh2diwgbm9ybWFsQW5ub3RhdGlvbiwgVkFMVUUpOwogCQkJdGhpcy5hZGRWYWx1ZSh2YWx1ZSwgbm9ybWFsQW5ub3RhdGlvbik7CiAJCX0KIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZU5vcm1hbEFubm90YXRpb24oRXhwcmVzc2lvbiB2YWx1ZSwgTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CisJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVOb3JtYWxBbm5vdGF0aW9uKEV4cHJlc3Npb24gdmFsdWUsIE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKIAkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSB0aGlzLm1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uKTsKIAkJaWYgKHBhaXIgPT0gbnVsbCkgewogCQkJdGhpcy5hZGRWYWx1ZSh2YWx1ZSwgYW5ub3RhdGlvbik7CkBAIC0yNzAsMjAgKzI3MCwyMCBAQAogCQkJdGhpcy5yZW1vdmVFbGVtZW50Tm9ybWFsQW5ub3RhdGlvbigoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbiwgZGVjbGFyYXRpb24pOwogCQl9CiAJCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBhbm5vdGF0aW9uKTsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgYW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCX0KIAotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnROb0Fubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgeworCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnROb0Fubm90YXRpb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKIAkJLy8gdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBnb25lICg/KQogCX0KIAotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnRNYXJrZXJBbm5vdGF0aW9uKE1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgeworCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnRNYXJrZXJBbm5vdGF0aW9uKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CiAJCS8vIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgZ29uZSAoPykKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKCJ2YWx1ZSIpKSB7CisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudFNpbmdsZU1lbWJlckFubm90YXRpb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgeworCQlpZiAodGhpcy5lbGVtZW50TmFtZS5lcXVhbHMoVkFMVUUpKSB7CiAJCQlpZiAodGhpcy5yZW1vdmVBbm5vdGF0aW9uV2hlbkVtcHR5KSB7CiAJCQkJLy8gQEZvbygieHh4IikgPT4gCiAJCQkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlci5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKQEAgLTMxMCw3ICszMTAsNyBAQAogCQkJdGhpcy5yZW1vdmVFbGVtZW50KGFubm90YXRpb24pOwogCQkJaWYgKHZhbHVlcy5zaXplKCkgPT0gMSkgewogCQkJCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdmFsdWVzLmdldCgwKTsKLQkJCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKCJ2YWx1ZSIpKSB7CisJCQkJaWYgKHBhaXIuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhWQUxVRSkpIHsKIAkJCQkJLy8gQEZvbyhiYXI9Inh4eCIsIHZhbHVlPSJ5eXkiKSA9PiBARm9vKCJ5eXkiKQogCQkJCQlFeHByZXNzaW9uIHZ2ID0gcGFpci5nZXRWYWx1ZSgpOwogCQkJCQl2diA9IChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHZ2LmdldEFTVCgpLCB2dik7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvR2VuZXJpY1Zpc2l0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9HZW5lcmljVmlzaXRvci5qYXZhCmluZGV4IGUzNzUzZDEuLjI4NGQ2MTUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9HZW5lcmljVmlzaXRvci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9HZW5lcmljVmlzaXRvci5qYXZhCkBAIC05Niw2OTkgKzk2LDY5NSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5XaGlsZVN0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uV2lsZGNhcmRUeXBlOwogCi0vL2NvcGllZCBmcm9tICBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LmRvbS5HZW5lcmljVmlzaXRvcgotLy9kZWxldGVkIGNvZGUgdG8gbGltaXQgdGhlIG51bWJlciBvZiBjbGFzc2VzIEkgaGFkIHRvIGNvcHkKKy8qKgorICogY29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5kb20uR2VuZXJpY1Zpc2l0b3IKKyAqLwogcHVibGljIGNsYXNzIEdlbmVyaWNWaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7Ci0JCisKIAlwdWJsaWMgR2VuZXJpY1Zpc2l0b3IoKSB7CiAJCXN1cGVyKCk7CiAJfQogCi0JLyoqCi0JICogQHBhcmFtIHZpc2l0SmF2YWRvY1RhZ3MgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZG9jIGNvbW1lbnQgdGFncyBhcmUKLQkgKiB0byBiZSB2aXNpdGVkIGJ5IGRlZmF1bHQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNlZSBKYXZhZG9jI3RhZ3MoKQotCSAqIEBzZWUgI3Zpc2l0KEphdmFkb2MpCi0JICogQHNpbmNlIDMuMAotCSAqLwogCXB1YmxpYyBHZW5lcmljVmlzaXRvcihib29sZWFuIHZpc2l0SmF2YWRvY1RhZ3MpIHsKIAkJc3VwZXIodmlzaXRKYXZhZG9jVGFncyk7CiAJfQotCQotCS8vLS0tLSBIb29rcyBmb3Igc3ViY2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2aXNpdE5vZGUoQVNUTm9kZSBub2RlKSB7CisJLy8gKioqKioqKioqKiBob29rcyBmb3Igc3ViY2xhc3NlcyAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgYm9vbGVhbiB2aXNpdF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEFTVE5vZGUgbm9kZSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZW5kVmlzaXROb2RlKEFTVE5vZGUgbm9kZSkgeworCisJcHJvdGVjdGVkIHZvaWQgZW5kVmlzaXRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBBU1ROb2RlIG5vZGUpIHsKIAkJLy8gZG8gbm90aGluZwogCX0KIAorCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKKwogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUFjY2VzcyBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5Q3JlYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlUeXBlIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQXNzZXJ0U3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQXNzaWdubWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KEJsb2NrIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChCcmVha1N0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQ2F0Y2hDbGF1c2Ugbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQ29tcGlsYXRpb25Vbml0IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQ29udGludWVTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChEb1N0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KEVtcHR5U3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoRmllbGREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KEZvclN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KElmU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoSW1wb3J0RGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbmZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbnN0YW5jZW9mRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KEluaXRpYWxpemVyIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoSmF2YWRvYyBub2RlKSB7Ci0JCXJldHVybiAoc3VwZXIudmlzaXQobm9kZSkpID8gdmlzaXROb2RlKG5vZGUpIDogZmFsc2U7CisJCXJldHVybiAoc3VwZXIudmlzaXQobm9kZSkpID8gdmlzaXRfKG5vZGUpIDogZmFsc2U7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChOdWxsTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KE51bWJlckxpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChQYWNrYWdlRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KFBvc3RmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KFByaW1pdGl2ZVR5cGUgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChRdWFsaWZpZWROYW1lIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoU2ltcGxlTmFtZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbXBsZVR5cGUgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdHJpbmdMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlckZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoU3dpdGNoQ2FzZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KFN3aXRjaFN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KFN5bmNocm9uaXplZFN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KFRoaXNFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoVGhyb3dTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUcnlTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChXaGlsZVN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoQmxvY2tDb21tZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoRW5oYW5jZWRGb3JTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KEVudW1EZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KExpbmVDb21tZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoTWFya2VyQW5ub3RhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KE1lbWJlclJlZiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KE1lbWJlclZhbHVlUGFpciBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZFJlZiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZFJlZlBhcmFtZXRlciBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KE1vZGlmaWVyIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoTm9ybWFsQW5ub3RhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KFBhcmFtZXRlcml6ZWRUeXBlIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkVHlwZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdE5vZGUobm9kZSk7CisJCXJldHVybiB2aXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbmdsZU1lbWJlckFubm90YXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUYWdFbGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoVGV4dEVsZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXROb2RlKG5vZGUpOworCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlUGFyYW1ldGVyIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoV2lsZGNhcmRUeXBlIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKwkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKIAl9CiAKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5QWNjZXNzIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5Q3JlYXRpb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheVR5cGUgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQXNzZXJ0U3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFzc2lnbm1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQmxvY2sgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2F0Y2hDbGF1c2Ugbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChDbGFzc0luc3RhbmNlQ3JlYXRpb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQ29tcGlsYXRpb25Vbml0IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQ29udGludWVTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoRG9TdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChGaWVsZERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZvclN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChJZlN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbXBvcnREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbmZpeEV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoSW5zdGFuY2VvZkV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoSW5pdGlhbGl6ZXIgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoSmF2YWRvYyBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChMYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoTnVsbExpdGVyYWwgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoTnVtYmVyTGl0ZXJhbCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChQYWNrYWdlRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoUG9zdGZpeEV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChQcmltaXRpdmVUeXBlIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFF1YWxpZmllZE5hbWUgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFNpbXBsZU5hbWUgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoU2ltcGxlVHlwZSBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChTdHJpbmdMaXRlcmFsIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN1cGVyRmllbGRBY2Nlc3Mgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN3aXRjaENhc2Ugbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN5bmNocm9uaXplZFN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChUaGlzRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChUaHJvd1N0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChUcnlTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFdoaWxlU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChCbG9ja0NvbW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoRW5oYW5jZWRGb3JTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoRW51bURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KExpbmVDb21tZW50IG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1hcmtlckFubm90YXRpb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoTWVtYmVyUmVmIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1lbWJlclZhbHVlUGFpciBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXRob2RSZWYgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoTWV0aG9kUmVmUGFyYW1ldGVyIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1vZGlmaWVyIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE5vcm1hbEFubm90YXRpb24gbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoUGFyYW1ldGVyaXplZFR5cGUgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoUXVhbGlmaWVkVHlwZSBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXROb2RlKG5vZGUpOworCQllbmRWaXNpdF8obm9kZSk7CiAJfQogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFRhZ0VsZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoVGV4dEVsZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZVBhcmFtZXRlciBub2RlKSB7Ci0JCWVuZFZpc2l0Tm9kZShub2RlKTsKKwkJZW5kVmlzaXRfKG5vZGUpOwogCX0KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChXaWxkY2FyZFR5cGUgbm9kZSkgewotCQllbmRWaXNpdE5vZGUobm9kZSk7CisJCWVuZFZpc2l0Xyhub2RlKTsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRBdHRyaWJ1dGUuamF2YQppbmRleCAwZGU1OTA1Li44NjU1MTU4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUQXR0cmlidXRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVEF0dHJpYnV0ZS5qYXZhCkBAIC0xNSw3ICsxNSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwogCiAvKioKICAqIENvbWJpbmUgYmVoYXZpb3IgY29tbW9uIHRvIEpEVEZpZWxkQXR0cmlidXRlIGFuZCBKRFRNZXRob2RBdHRyaWJ1dGUuCkBAIC0zMyw4ICszMyw4IEBACiAJCQlTdHJpbmcgbmFtZSwKIAkJCWludCBvY2N1cnJlbmNlLAogCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKSB7Ci0JCXN1cGVyKGRlY2xhcmluZ1R5cGUsIG5hbWUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcik7CisJCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKKwkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcik7CiAJfQogCiAJcHJvdGVjdGVkIEpEVEF0dHJpYnV0ZSgKQEAgLTQyLDkgKzQyLDkgQEAKIAkJCVN0cmluZyBuYW1lLAogCQkJaW50IG9jY3VycmVuY2UsCiAJCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsCisJCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsCiAJCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlzdXBlcihkZWNsYXJpbmdUeXBlLCBuYW1lLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKKwkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwogCX0KIAogCkBAIC01NCwxMCArNTQsNiBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcHVibGljIGJvb2xlYW4gaXNNZXRob2QoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KIAogCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRURmllbGRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRGaWVsZEF0dHJpYnV0ZS5qYXZhCmluZGV4IGJkY2JlYzYuLjFjMThmMjkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRGaWVsZEF0dHJpYnV0ZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRGaWVsZEF0dHJpYnV0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTIyLDcgKzIyLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5GaWVsZEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvclByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKIAogLyoqCiAgKiBBZGFwdCBhbmQgZXh0ZW5kIGEgSkRUIGZpZWxkLgpAQCAtNDEsOCArNDEsOCBAQAogCQkJU3RyaW5nIG5hbWUsCiAJCQlpbnQgb2NjdXJyZW5jZSwKIAkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcikgewotCQl0aGlzKGRlY2xhcmluZ1R5cGUsIG5hbWUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOworCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7CisJCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwogCX0KIAkKIAlwdWJsaWMgSkRURmllbGRBdHRyaWJ1dGUoCkBAIC01MCwxNiArNTAsMTYgQEAKIAkJCVN0cmluZyBuYW1lLAogCQkJaW50IG9jY3VycmVuY2UsCiAJCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsCisJCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsCiAJCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlzdXBlcihkZWNsYXJpbmdUeXBlLCBuYW1lLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKKwkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwogCX0KIAogCS8qKgogCSAqIGNvbnN0cnVjdG9yIGZvciB0ZXN0aW5nCiAJICovCiAJcHVibGljIEpEVEZpZWxkQXR0cmlidXRlKFR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG5hbWUsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgewotCQl0aGlzKGRlY2xhcmluZ1R5cGUsIG5hbWUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIuRGVmYXVsdC5pbnN0YW5jZSgpLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7CisJCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7CiAJfQogCiAKQEAgLTkyLDcgKzkyLDcgQEAKIAogCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKIAkJSVZhcmlhYmxlQmluZGluZyBiaW5kaW5nID0gdGhpcy5nZXRCaW5kaW5nKGFzdFJvb3QpOwotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IEpQVFRvb2xzLmZpZWxkSXNQZXJzaXN0YWJsZShiaW5kaW5nKTsKKwkJcmV0dXJuIChiaW5kaW5nID09IG51bGwpID8gZmFsc2UgOiBKUFRUb29scy5maWVsZElzUGVyc2lzdGFibGUobmV3IEpQVFRvb2xzQWRhcHRlcihiaW5kaW5nKSk7CiAJfQogCiAKQEAgLTE1NiwxMSArMTU2LDExIEBACiAJCQkJcmV0dXJuIGZpZWxkRGVjbGFyYXRpb247CiAJCQl9CiAJCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJCXJldHVybiAiZmllbGQgZGVjbGFyYXRpb24iOworCQkJCXJldHVybiAiZmllbGQgZGVjbGFyYXRpb24iOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJGSUVMRF9ERUNMQVJBVElPTl9TRUxFQ1RPUiI7CisJCQkJcmV0dXJuICJGSUVMRF9ERUNMQVJBVElPTl9TRUxFQ1RPUiI7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfTsKIApAQCAtMTcwLDEyICsxNzAsMzYgQEAKIAkJCQlyZXR1cm4gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwogCQkJfQogCQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCQlyZXR1cm4gInZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50IjsKKwkJCQlyZXR1cm4gInZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVkFSSUFCTEVfREVDTEFSQVRJT05fRlJBR01FTlRfU0VMRUNUT1IiOworCQkJCXJldHVybiAiVkFSSUFCTEVfREVDTEFSQVRJT05fRlJBR01FTlRfU0VMRUNUT1IiOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX07CiAKKworCS8vICoqKioqKioqKiogSlBUVG9vbHMgYWRhcHRlciAqKioqKioqKioqCisKKwkvKioKKwkgKiBKUFRUb29scyBuZWVkcyBhbiBhZGFwdGVyIHNvIGl0IGNhbiB3b3JrIHdpdGggZWl0aGVyIGFuIElGaWVsZAorCSAqIG9yIGFuIElWYXJpYWJsZUJpbmRpbmcgZXRjLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSlBUVG9vbHNBZGFwdGVyIGltcGxlbWVudHMgSlBUVG9vbHMuRmllbGRBZGFwdGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBJVmFyaWFibGVCaW5kaW5nIGZpZWxkQmluZGluZzsKKworCQlwcm90ZWN0ZWQgSlBUVG9vbHNBZGFwdGVyKElWYXJpYWJsZUJpbmRpbmcgZmllbGRCaW5kaW5nKSB7CisJCQlzdXBlcigpOworCQkJaWYgKGZpZWxkQmluZGluZyA9PSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCQl9CisJCQl0aGlzLmZpZWxkQmluZGluZyA9IGZpZWxkQmluZGluZzsKKwkJfQorCisJCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworCQkJcmV0dXJuIHRoaXMuZmllbGRCaW5kaW5nLmdldE1vZGlmaWVycygpOworCQl9CisKKwl9CisKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRNZW1iZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRNZW1iZXIuamF2YQppbmRleCBmZWM4MmQ2Li5iMGVjZjYxIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTWVtYmVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1lbWJlci5qYXZhCkBAIC0yNCw3ICsyNCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3JQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKQEAgLTU4LDcgKzU3LDcgQEAKIAkgKiAoZmlsZSkgd2hlbiBpdCBpcyBvcGVuIGluIGFuIGVkaXRvciBhbmQgc2hvdWxkIGJlIG1vZGlmaWVkIG9uIHRoZSBVSQogCSAqIHRocmVhZAogCSAqLwotCXByaXZhdGUgZmluYWwgQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcjsKKwlwcml2YXRlIGZpbmFsIENvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcjsKIAogCS8qKiB0aGlzIHdpbGwgZm9ybWF0IHRoZSBtZW1iZXIncyBhbm5vdGF0aW9ucyBhIGJpdCAqLwogCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7CkBAIC03MSw4ICs3MCw4IEBACiAJCQlTdHJpbmcgbmFtZSwKIAkJCWludCBvY2N1cnJlbmNlLAogCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7CisJCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKKwkJdGhpcyhkZWNsYXJpbmdUeXBlLCBuYW1lLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7CiAJfQogCiAJcHJvdGVjdGVkIEpEVE1lbWJlcigKQEAgLTgwLDE0ICs3OSwxNCBAQAogCQkJU3RyaW5nIG5hbWUsCiAJCQlpbnQgb2NjdXJyZW5jZSwKIAkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlciwKKwkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKIAkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7CiAJCXN1cGVyKCk7CiAJCXRoaXMuZGVjbGFyaW5nVHlwZSA9IGRlY2xhcmluZ1R5cGU7CiAJCXRoaXMubmFtZSA9IG5hbWU7CiAJCXRoaXMub2NjdXJyZW5jZSA9IG9jY3VycmVuY2U7CiAJCXRoaXMuY29tcGlsYXRpb25Vbml0ID0gY29tcGlsYXRpb25Vbml0OwotCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgPSBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyOworCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yID0gbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3I7CiAJCXRoaXMuYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgPSBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKIAl9CiAKQEAgLTE1MSwxMyArMTUwLDE1IEBACiAJICogTkI6IEJlIGNhcmVmdWwgY2hhbmdpbmcgdGhpcyBtZXRob2QuCiAJICogVGhpbmdzIHRvIGxvb2sgb3V0IGZvcjoKIAkgKiAgICAgLSB3aGVuIGVkaXRpbmcgdmlhIHRoZSBKYXZhRWRpdG9yIHRoZXJlIGlzIG5vIG5lZWQgdG8gY3JlYXRlIGEgd29ya2luZyBjb3B5Ci0JICogICAgIC0gd2hlbiBlZGl0aW5nIGhlYWRsZXNzbHksIGEgIndvcmtpbmcgY29weSIgbXVzdCBiZSBjcmVhdGVkCisJICogICAgIC0gd2hlbiBlZGl0aW5nIHdpdGhvdXQgYW4gZWRpdG9yIG9yIHZpYSBhIHNpbXBsZSB0ZXh0IGVkaXRvciwgYSAid29ya2luZyBjb3B5IiBtdXN0IGJlIGNyZWF0ZWQuCiAJICogICAgICAgIChhdCBsZWFzdCBhcyBmYXIgYXMgSSBjYW4gdGVsbCAgfmtmbSkKLQkgKiAgICAgLSB3aGVuIGVkaXRpbmcgdmlhIGEgcGxhaW4gdGV4dCBlZGl0b3IsIG1ha2UgYSB3b3JraW5nIGNvcHkgb3IgZWxzZSB0aGluZ3MgYXJlIHNjcmV3ZWQKLQkgKiAgICAgICAgdXAgdGhlIHNlY29uZCB0aW1lIHlvdSBlZGl0IHRocm91Z2ggdGhlIFhtbFBlcnNpc3RlbmNlIFhtbFByb3BlcnRpZXMgVmlldworCSAqICAgICAtIHNoYXJlZERvY3VtZW50IGlzIG9ubHkgZXZlciBmYWxzZSBpbiB0ZXN0cyAoaGVhZGxlc3MgbW9kZSkuICBJbiB0aGUgVUksIGV2ZW4gaWYgdGhlIGZpbGUKKwkgKiAgICAgICAgaXMgbm90IG9wZW4gaW4gYW4gZWRpdG9yLCBzaGFyZWREb2N1bWVudCBpcyBzdGlsbCB0cnVlIChidWZmZXIgaXMgbm90IG51bGwpCisJICogICAgIC0gaWYgYSB3b3JraW5nIGNvcHkgaXMgY3JlYXRlZCwgdGhlbiB3ZSBtdXN0IGRpc2NhcmQgaXQKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBlZGl0XyhFZGl0b3IgZWRpdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICggISB0aGlzLmNvbXBpbGF0aW9uVW5pdC5pc1dvcmtpbmdDb3B5KCkpIHsKKwkJYm9vbGVhbiBjcmVhdGVXb3JraW5nQ29weSA9ICEgdGhpcy5jb21waWxhdGlvblVuaXQuaXNXb3JraW5nQ29weSgpOworCQlpZiAoY3JlYXRlV29ya2luZ0NvcHkpIHsKIAkJCXRoaXMuY29tcGlsYXRpb25Vbml0LmJlY29tZVdvcmtpbmdDb3B5KG51bGwpOwogCQl9CiAKQEAgLTE2OCwyMiArMTY5LDI2IEBACiAJCQk6CiAJCQkJbmV3IERvY3VtZW50KHRoaXMuY29tcGlsYXRpb25Vbml0LmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCkpOwogCi0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoKTsKLQkJYXN0Um9vdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7Ci0KLQkJZWRpdG9yLmVkaXQodGhpcy5nZXRNb2RpZmllZERlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQotCQlUZXh0RWRpdCBlZGl0cyA9IGFzdFJvb3QucmV3cml0ZShkb2MsIHRoaXMuY29tcGlsYXRpb25Vbml0LmdldEphdmFQcm9qZWN0KCkuZ2V0T3B0aW9ucyh0cnVlKSk7Ci0JCWlmIChzaGFyZWREb2N1bWVudCkgewotCQkJdGhpcy5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpLmV4ZWN1dGUobmV3IE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZChlZGl0cywgZG9jKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmFwcGx5RWRpdHMoZWRpdHMsIGRvYyk7CisJCXRyeSB7CisJCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KCk7CisJCQlhc3RSb290LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsKKwkKKwkJCWVkaXRvci5lZGl0KHRoaXMuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihhc3RSb290KSk7CisJCisJCQlUZXh0RWRpdCBlZGl0cyA9IGFzdFJvb3QucmV3cml0ZShkb2MsIHRoaXMuY29tcGlsYXRpb25Vbml0LmdldEphdmFQcm9qZWN0KCkuZ2V0T3B0aW9ucyh0cnVlKSk7CisJCQlpZiAoc2hhcmVkRG9jdW1lbnQpIHsKKwkJCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUobmV3IE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZChlZGl0cywgZG9jKSk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuYXBwbHlFZGl0cyhlZGl0cywgZG9jKTsKKwkJCX0KIAkJfQotCi0JCWlmICggISBzaGFyZWREb2N1bWVudCkgewotCQkJdGhpcy5jb21waWxhdGlvblVuaXQuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoZG9jLmdldCgpKTsKLQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LmNvbW1pdFdvcmtpbmdDb3B5KHRydWUsIG51bGwpOyAgLy8gdHJ1ZT0iZm9yY2UiCi0JCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5kaXNjYXJkV29ya2luZ0NvcHkoKTsKKwkJZmluYWxseSB7CisJCQlpZiAoY3JlYXRlV29ya2luZ0NvcHkpIHsKKwkJCQkvL2Rpc2NhcmRXb3JraW5nQ29weSBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGJlY29tZVdvcmtpbmdDb3B5IGlzIGNhbGxlZC4KKwkJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5nZXRCdWZmZXIoKS5zZXRDb250ZW50cyhkb2MuZ2V0KCkpOworCQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LmNvbW1pdFdvcmtpbmdDb3B5KHRydWUsIG51bGwpOyAgLy8gdHJ1ZT0iZm9yY2UiCisJCQkJdGhpcy5jb21waWxhdGlvblVuaXQuZGlzY2FyZFdvcmtpbmdDb3B5KCk7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTIwMCwxMCArMjA1LDYgQEAKIAkJcmV0dXJuIEpEVFRvb2xzLmJ1aWxkQVNUUm9vdCh0aGlzLmNvbXBpbGF0aW9uVW5pdCk7CiAJfQogCi0JcHJvdGVjdGVkIENvbW1hbmRFeGVjdXRvciBnZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlci5nZXRDb21tYW5kRXhlY3V0b3IoKTsKLQl9Ci0KIAogCS8vICoqKioqKioqKiogbW9kaWZ5IHNoYXJlZCBkb2N1bWVudCBjb21tYW5kIGNsYXNzICoqKioqKioqKioKIApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1ldGhvZEF0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1ldGhvZEF0dHJpYnV0ZS5qYXZhCmluZGV4IGQwODQ0ZDYuLmIyMzNhMmEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRNZXRob2RBdHRyaWJ1dGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTWV0aG9kQXR0cmlidXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw3ICs5LDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwogCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIApAQCAtMjMsOSArMjIsMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZXRob2RBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuSmF2YVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuTWV0aG9kU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLk5hbWVUb29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVNZXRob2RTaWduYXR1cmU7CiAKIC8qKgpAQCAtNTMsOCArNTMsOCBAQAogCQkJTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwKIAkJCWludCBvY2N1cnJlbmNlLAogCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShkZWNsYXJpbmdUeXBlLCBzaWduYXR1cmUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOworCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7CisJCXJldHVybiBuZXdJbnN0YW5jZShkZWNsYXJpbmdUeXBlLCBzaWduYXR1cmUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKIAl9CiAKIAlwdWJsaWMgc3RhdGljIEpEVE1ldGhvZEF0dHJpYnV0ZSBuZXdJbnN0YW5jZSgKQEAgLTYyLDkgKzYyLDkgQEAKIAkJCU1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUsCiAJCQlpbnQgb2NjdXJyZW5jZSwKIAkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlciwKKwkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKIAkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXJldHVybiBuZXcgSkRUTWV0aG9kQXR0cmlidXRlKGRlY2xhcmluZ1R5cGUsIHNpZ25hdHVyZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7CisJCXJldHVybiBuZXcgSkRUTWV0aG9kQXR0cmlidXRlKGRlY2xhcmluZ1R5cGUsIHNpZ25hdHVyZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwogCX0KIAogCXB1YmxpYyBKRFRNZXRob2RBdHRyaWJ1dGUoCkBAIC03Miw4ICs3Miw4IEBACiAJCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlLAogCQkJaW50IG9jY3VycmVuY2UsCiAJCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIpIHsKLQkJdGhpcyhkZWNsYXJpbmdUeXBlLCBtZXRob2RTaWduYXR1cmUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOworCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7CisJCXRoaXMoZGVjbGFyaW5nVHlwZSwgbWV0aG9kU2lnbmF0dXJlLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7CiAJfQogCiAJcHVibGljIEpEVE1ldGhvZEF0dHJpYnV0ZSgKQEAgLTgxLDkgKzgxLDkgQEAKIAkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUsCiAJCQlpbnQgb2NjdXJyZW5jZSwKIAkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlciwKKwkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKIAkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXN1cGVyKGRlY2xhcmluZ1R5cGUsIG1ldGhvZFNpZ25hdHVyZS5nZXROYW1lKCksIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOworCQlzdXBlcihkZWNsYXJpbmdUeXBlLCBtZXRob2RTaWduYXR1cmUuZ2V0TmFtZSgpLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7CiAJCXRoaXMucGFyYW1ldGVyVHlwZXMgPSBtZXRob2RTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKIAl9CiAKQEAgLTkxLDcgKzkxLDcgQEAKIAkgKiBjb25zdHJ1Y3RvciBmb3IgdGVzdGluZwogCSAqLwogCXB1YmxpYyBKRFRNZXRob2RBdHRyaWJ1dGUoVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZU5hbWVzLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKLQkJdGhpcyhkZWNsYXJpbmdUeXBlLCBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKG5hbWUsIHBhcmFtZXRlclR5cGVOYW1lcyksIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIuRGVmYXVsdC5pbnN0YW5jZSgpLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7CisJCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZShuYW1lLCBwYXJhbWV0ZXJUeXBlTmFtZXMpLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCksIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKIAl9CiAKIApAQCAtMTM5LDcgKzEzOSw3IEBACiAKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBtZW1iZXJOYW1lLCBpbnQgb2NjdXJyZW5jZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVzZSAjbWF0Y2hlcyhvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb24sIGludCkuIik7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVXNlICNtYXRjaGVzKE1ldGhvZFNpZ25hdHVyZSwgaW50KS4iKTsgLy8kTk9OLU5MUy0xJAogCX0KIAogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewpAQCAtMTUwLDMyICsxNTAsMTcgQEAKIAkgKiByZXR1cm4gImZvbyIgZm9yIGEgbWV0aG9kIG5hbWVkICJnZXRGb28iIG9yICJpc0ZvbyIKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXROYW1lXygpOwotCQlpbnQgYmVnaW5JbmRleCA9IDA7Ci0JCWlmIChuYW1lLnN0YXJ0c1dpdGgoImdldCIpKSB7Ci0JCQliZWdpbkluZGV4ID0gMzsKLQkJfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoImlzIikpIHsKLQkJCWJlZ2luSW5kZXggPSAyOwotCQl9Ci0JCXJldHVybiBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG5hbWUuc3Vic3RyaW5nKGJlZ2luSW5kZXgpKTsKKwkJcmV0dXJuIE5hbWVUb29scy5jb252ZXJ0R2V0dGVyTWV0aG9kTmFtZVRvUHJvcGVydHlOYW1lKHRoaXMuZ2V0TmFtZV8oKSk7CiAJfQogCiAJcHVibGljIElUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewogCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWlmIChtZXRob2RCaW5kaW5nICE9IG51bGwpIHsKLQkJCXJldHVybiBtZXRob2RCaW5kaW5nLmdldFJldHVyblR5cGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZCgpIHsKLQkJcmV0dXJuIHRydWU7CisJCXJldHVybiAobWV0aG9kQmluZGluZyA9PSBudWxsKSA/IG51bGwgOiBtZXRob2RCaW5kaW5nLmdldFJldHVyblR5cGUoKTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CiAJCUlNZXRob2RCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmdldEJpbmRpbmcoYXN0Um9vdCk7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKGJpbmRpbmcpOworCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihuZXcgSlBUVG9vbHNBZGFwdGVyKGJpbmRpbmcpKTsKIAl9CiAKIApAQCAtMTg1LDQgKzE3MCw4NyBAQAogCQlyZXR1cm4gdGhpcy5nZXREZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24oYXN0Um9vdCkuZ2V0TWV0aG9kcygpOwogCX0KIAorCisJLy8gKioqKioqKioqKiBKUFRUb29scyBhZGFwdGVyICoqKioqKioqKioKKworCS8qKgorCSAqIEpQVFRvb2xzIG5lZWRzIGFuIGFkYXB0ZXIgc28gaXQgY2FuIHdvcmsgd2l0aCBlaXRoZXIgYW4gSU1ldGhvZAorCSAqIG9yIGFuIElNZXRob2RCaW5kaW5nIGV0Yy4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFNpbXBsZUpQVFRvb2xzQWRhcHRlcgorCQlpbXBsZW1lbnRzIEpQVFRvb2xzLlNpbXBsZU1ldGhvZEFkYXB0ZXIKKwl7CisJCXByb3RlY3RlZCBmaW5hbCBJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nOworCisJCXByb3RlY3RlZCBTaW1wbGVKUFRUb29sc0FkYXB0ZXIoSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgeworCQkJc3VwZXIoKTsKKwkJCWlmIChtZXRob2RCaW5kaW5nID09IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKwkJCX0KKwkJCXRoaXMubWV0aG9kQmluZGluZyA9IG1ldGhvZEJpbmRpbmc7CisJCX0KKworCQlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKwkJCXJldHVybiB0aGlzLm1ldGhvZEJpbmRpbmcuZ2V0TW9kaWZpZXJzKCk7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldFJldHVyblR5cGVFcmFzdXJlTmFtZSgpIHsKKwkJCUlUeXBlQmluZGluZyByZXR1cm5UeXBlID0gdGhpcy5tZXRob2RCaW5kaW5nLmdldFJldHVyblR5cGUoKTsKKwkJCXJldHVybiAocmV0dXJuVHlwZSA9PSBudWxsKSA/IG51bGwgOiByZXR1cm5UeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldEVyYXN1cmUoKS5nZXRRdWFsaWZpZWROYW1lKCk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgeworCQkJcmV0dXJuIHRoaXMubWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCk7CisJCX0KKworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSlBUVG9vbHNBZGFwdGVyCisJCWV4dGVuZHMgU2ltcGxlSlBUVG9vbHNBZGFwdGVyCisJCWltcGxlbWVudHMgSlBUVG9vbHMuTWV0aG9kQWRhcHRlcgorCXsKKwkJcHJvdGVjdGVkIEpQVFRvb2xzQWRhcHRlcihJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7CisJCQlzdXBlcihtZXRob2RCaW5kaW5nKTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCXJldHVybiB0aGlzLm1ldGhvZEJpbmRpbmcuZ2V0TmFtZSgpOworCQl9CisKKwkJcHVibGljIGludCBnZXRQYXJhbWV0ZXJzTGVuZ3RoKCkgeworCQkJcmV0dXJuIHRoaXMubWV0aG9kQmluZGluZy5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aDsKKwkJfQorCisJCXB1YmxpYyBKUFRUb29scy5TaW1wbGVNZXRob2RBZGFwdGVyIGdldFNpYmxpbmcoU3RyaW5nIG5hbWUpIHsKKwkJCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMubWV0aG9kQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpOworCQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWZvciAoSU1ldGhvZEJpbmRpbmcgc2libGluZyA6IHR5cGVCaW5kaW5nLmdldERlY2xhcmVkTWV0aG9kcygpKSB7CisJCQkJaWYgKChzaWJsaW5nLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApCisJCQkJCQkmJiBzaWJsaW5nLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQkJcmV0dXJuIG5ldyBTaW1wbGVKUFRUb29sc0FkYXB0ZXIoc2libGluZyk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgSlBUVG9vbHMuU2ltcGxlTWV0aG9kQWRhcHRlciBnZXRTaWJsaW5nKFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyYW1ldGVyVHlwZUVyYXN1cmVOYW1lKSB7CisJCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLm1ldGhvZEJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKwkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlmb3IgKElNZXRob2RCaW5kaW5nIHNpYmxpbmcgOiB0eXBlQmluZGluZy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgeworCQkJCUlUeXBlQmluZGluZ1tdIHNpYmxpbmdQYXJtVHlwZXMgPSBzaWJsaW5nLmdldFBhcmFtZXRlclR5cGVzKCk7CisJCQkJaWYgKChzaWJsaW5nUGFybVR5cGVzLmxlbmd0aCA9PSAxKQorCQkJCQkJJiYgc2libGluZy5nZXROYW1lKCkuZXF1YWxzKG5hbWUpCisJCQkJCQkmJiBzaWJsaW5nUGFybVR5cGVzWzBdLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldEVyYXN1cmUoKS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHBhcmFtZXRlclR5cGVFcmFzdXJlTmFtZSkpIHsKKwkJCQkJcmV0dXJuIG5ldyBTaW1wbGVKUFRUb29sc0FkYXB0ZXIoc2libGluZyk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCX0KKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1vZGlmaWVkRGVjbGFyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRNb2RpZmllZERlY2xhcmF0aW9uLmphdmEKaW5kZXggMjY2ZmE3Yy4uMmY2ZjgyZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1vZGlmaWVkRGVjbGFyYXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTW9kaWZpZWREZWNsYXJhdGlvbi5qYXZhCkBAIC0xMiw3ICsxMiwxMCBAQAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247CkBAIC0yOSw3ICszMiw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwogCiAvKioKLSAqIAorICogV3JhcCBhbnkgb2YgdGhlIEFTVCBub2RlcyB0aGF0IGhhdmUgbW9kaWZpZXJzIChzcGVjaWZpY2FsbHksIGFubm90YXRpb25zKTsKKyAqIGkuZS4gQm9keURlY2xhcmF0aW9uLCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLCBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiwKKyAqIGFuZCBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LgogICovCiBwdWJsaWMgY2xhc3MgSkRUTW9kaWZpZWREZWNsYXJhdGlvbgogCWltcGxlbWVudHMgTW9kaWZpZWREZWNsYXJhdGlvbgpAQCAtNjEsNDMgKzY2LDcgQEAKIAl9CiAKIAotCS8vICoqKioqKioqKiogcHVibGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZGVjbGFyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uJ3MgbGlzdCBvZiBtb2RpZmllcnMuCi0JICogRWxlbWVudCB0eXBlOiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXIKLQkgKi8KLQlwdWJsaWMgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzKCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLm1vZGlmaWVycygpOwotCX0KLQotCXB1YmxpYyBBU1QgZ2V0QXN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXREZWNsYXJhdGlvbigpLmdldEFTVCgpOwotCX0KLQotCXB1YmxpYyBDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgewotCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgdGhpcy5nZXREZWNsYXJhdGlvbigpLmdldFJvb3QoKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRJQ29tcGlsYXRpb25Vbml0KCkgewotCQlyZXR1cm4gKElDb21waWxhdGlvblVuaXQpIHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0SmF2YUVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uJ3MgYW5ub3RhdGlvbnMuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPEFubm90YXRpb24+IGFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPElFeHRlbmRlZE1vZGlmaWVyLCBBbm5vdGF0aW9uPih0aGlzLm1vZGlmaWVycygpLml0ZXJhdG9yKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElFeHRlbmRlZE1vZGlmaWVyIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5pc0Fubm90YXRpb24oKTsKLQkJCX0KLQkJfTsKLQl9CisJLy8gKioqKioqKioqKiBhbm5vdGF0aW9ucyAqKioqKioqKioqCiAKIAlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7CiAJCWZvciAoSXRlcmF0b3I8QW5ub3RhdGlvbj4gc3RyZWFtID0gdGhpcy5hbm5vdGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKQEAgLTEwOSwzMiArNzgsOCBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZGVjbGFyYXRpb24gaGFzIGFuIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25OYW1lZChhbm5vdGF0aW9uTmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIHRvIHRoZSBkZWNsYXJhdGlvbi4KLQkgKiBCeSBjb252ZW50aW9uIGFubm90YXRpb25zIHByZWNlZGUgdGhlICJzdGFuZGFyZCIgKEpMUzIpIG1vZGlmaWVyczsKLQkgKiB0aG91Z2gsIHRlY2huaWNhbGx5LCB0aGV5IGNhbiBiZSBpbnRlcnNwZXJzZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzID0gdGhpcy5tb2RpZmllcnMoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+IHN0cmVhbSA9IG1vZGlmaWVycy5saXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5pc01vZGlmaWVyKCkpIHsKLQkJCQlzdHJlYW0ucHJldmlvdXMoKTsgIC8vIHB1dCB0aGUgYW5ub3RhdGlvbiAqYmVmb3JlKiB0aGUgZmlyc3QgInN0YW5kYXJkIiAoSkxTMikgbW9kaWZpZXIKLQkJCQlzdHJlYW0uYWRkKGFubm90YXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQltb2RpZmllcnMuYWRkKGFubm90YXRpb24pOyAgLy8ganVzdCB0YWNrIGl0IG9uIHRvIHRoZSBlbmQKLQl9Ci0KIAlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+IHN0cmVhbSA9IHRoaXMubW9kaWZpZXJzKCkuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCWZvciAoSXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+IHN0cmVhbSA9IHRoaXMuZ2V0TW9kaWZpZXJzKCkuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CiAJCQlJRXh0ZW5kZWRNb2RpZmllciBtb2RpZmllciA9IHN0cmVhbS5uZXh0KCk7CiAJCQlpZiAobW9kaWZpZXIuaXNBbm5vdGF0aW9uKCkpIHsKIAkJCQlpZiAodGhpcy5hbm5vdGF0aW9uSXNOYW1lZCgoQW5ub3RhdGlvbikgbW9kaWZpZXIsIGFubm90YXRpb25OYW1lKSkgewpAQCAtMTQ1LDMwICs5MCw4IEBACiAJCX0KIAl9CiAKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGZyb20gdGhlIGRlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWlmICggISB0aGlzLm1vZGlmaWVycygpLnJlbW92ZShhbm5vdGF0aW9uKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBhbm5vdGF0aW9uOiAiICsgYW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSBzcGVjaWZpZWQgb2xkIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5ldyBhbm5vdGF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VBbm5vdGF0aW9uKEFubm90YXRpb24gb2xkQW5ub3RhdGlvbiwgQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uKSB7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPElFeHRlbmRlZE1vZGlmaWVyPiBzdHJlYW0gPSB0aGlzLm1vZGlmaWVycygpLmxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscyhvbGRBbm5vdGF0aW9uKSkgewotCQkJCXN0cmVhbS5zZXQobmV3QW5ub3RhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgb2xkIGFubm90YXRpb246ICIgKyBvbGRBbm5vdGF0aW9uKTsKLQl9Ci0KIAlwdWJsaWMgdm9pZCByZXBsYWNlQW5ub3RhdGlvbk5hbWVkKFN0cmluZyBvbGRBbm5vdGF0aW9uTmFtZSwgQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uKSB7Ci0JCUxpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IG1vZGlmaWVycyA9IHRoaXMubW9kaWZpZXJzKCk7CisJCUxpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IG1vZGlmaWVycyA9IHRoaXMuZ2V0TW9kaWZpZXJzKCk7CiAJCWZvciAoTGlzdEl0ZXJhdG9yPElFeHRlbmRlZE1vZGlmaWVyPiBzdHJlYW0gPSBtb2RpZmllcnMubGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewogCQkJSUV4dGVuZGVkTW9kaWZpZXIgbW9kaWZpZXIgPSBzdHJlYW0ubmV4dCgpOwogCQkJaWYgKG1vZGlmaWVyLmlzQW5ub3RhdGlvbigpKSB7CkBAIC0xODEsNjUgKzEwNCwyMDcgQEAKIAkJdGhpcy5hZGRBbm5vdGF0aW9uKG5ld0Fubm90YXRpb24pOwogCX0KIAotCXB1YmxpYyB2b2lkIGFkZEltcG9ydChTdHJpbmcgaW1wb3J0TmFtZSkgewotCQl0aGlzLmFkZEltcG9ydChpbXBvcnROYW1lLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3RhdGljSW1wb3J0KFN0cmluZyBpbXBvcnROYW1lKSB7Ci0JCXRoaXMuYWRkSW1wb3J0KGltcG9ydE5hbWUsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEltcG9ydChTdHJpbmcgaW1wb3J0TmFtZSwgYm9vbGVhbiBzdGF0aWNfKSB7Ci0JCWlmIChpbXBvcnROYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgewotCQkJdGhpcy5hZGRJbXBvcnRUbyh0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgpLCBpbXBvcnROYW1lLCBzdGF0aWNfKTsKKwkvKioKKwkgKiBBZGQgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIHRvIHRoZSBkZWNsYXJhdGlvbi4KKwkgKiBCeSBjb252ZW50aW9uIGFubm90YXRpb25zIHByZWNlZGUgdGhlICJzdGFuZGFyZCIgKEpMUzIpIG1vZGlmaWVyczsKKwkgKiB0aG91Z2gsIHRlY2huaWNhbGx5LCB0aGV5IGNhbiBiZSBpbnRlcnNwZXJzZWQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKKwkJTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzID0gdGhpcy5nZXRNb2RpZmllcnMoKTsKKwkJZm9yIChMaXN0SXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+IHN0cmVhbSA9IG1vZGlmaWVycy5saXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlpZiAoc3RyZWFtLm5leHQoKS5pc01vZGlmaWVyKCkpIHsKKwkJCQlzdHJlYW0ucHJldmlvdXMoKTsgIC8vIHB1dCB0aGUgYW5ub3RhdGlvbiAqYmVmb3JlKiB0aGUgZmlyc3QgInN0YW5kYXJkIiAoSkxTMikgbW9kaWZpZXIKKwkJCQlzdHJlYW0uYWRkKGFubm90YXRpb24pOworCQkJCXJldHVybjsKKwkJCX0KIAkJfQorCQltb2RpZmllcnMuYWRkKGFubm90YXRpb24pOyAgLy8ganVzdCB0YWNrIGl0IG9uIHRvIHRoZSBlbmQKIAl9CiAKLQlwdWJsaWMgU3RyaW5nIGdldEltcG9ydEZvcihTdHJpbmcgc2hvcnROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEltcG9ydEZvcihzaG9ydE5hbWUsIGZhbHNlKTsKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uJ3MgYW5ub3RhdGlvbnMuCisJICovCisJcHJvdGVjdGVkIEl0ZXJhdG9yPEFubm90YXRpb24+IGFubm90YXRpb25zKCkgeworCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPElFeHRlbmRlZE1vZGlmaWVyLCBBbm5vdGF0aW9uPih0aGlzLmdldE1vZGlmaWVycygpLml0ZXJhdG9yKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElFeHRlbmRlZE1vZGlmaWVyIG5leHQpIHsKKwkJCQlyZXR1cm4gbmV4dC5pc0Fubm90YXRpb24oKTsKKwkJCX0KKwkJfTsKIAl9CiAKLQlwdWJsaWMgU3RyaW5nIGdldFN0YXRpY0ltcG9ydEZvcihTdHJpbmcgc2hvcnROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEltcG9ydEZvcihzaG9ydE5hbWUsIHRydWUpOwotCX0KIAotCS8vIFRPRE8gaGFuZGxlIHdpbGRjYXJkcwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0Rm9yKFN0cmluZyBzaG9ydE5hbWUsIGJvb2xlYW4gc3RhdGljXykgewotCQlpZiAoc2hvcnROYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgewotCQkJcmV0dXJuIHNob3J0TmFtZTsKKwkvLyAqKioqKioqKioqIGFkZCBpbXBvcnQgKioqKioqKioqKgorCisJcHVibGljIGJvb2xlYW4gYWRkSW1wb3J0KFN0cmluZyBjbGFzc05hbWUpIHsKKwkJaWYgKGNsYXNzTmFtZS5pbmRleE9mKCcuJykgPT0gLTEpIHsKKwkJCXJldHVybiB0cnVlOyAgLy8gdGhlIGNsYXNzIGlzIGluIHRoZSBkZWZhdWx0IHBhY2thZ2UgLSBubyBuZWVkIGZvciBpbXBvcnQKIAkJfQotCQlMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzID0gdGhpcy5pbXBvcnRzKHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCkpOwotCQlmb3IgKEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uIDogaW1wb3J0cykgewotCQkJaWYgKHRoaXMuaW1wb3J0SXNGb3IoaW1wb3J0RGVjbGFyYXRpb24sIHNob3J0TmFtZSwgc3RhdGljXykpIHsKLQkJCQlyZXR1cm4gaW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOworCQlyZXR1cm4gdGhpcy5hZGRJbXBvcnQoY2xhc3NOYW1lLCBmYWxzZSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gYWRkU3RhdGljSW1wb3J0KFN0cmluZyBlbnVtQ29uc3RhbnROYW1lKSB7CisJCWludCBpbmRleDEgPSBlbnVtQ29uc3RhbnROYW1lLmluZGV4T2YoJy4nKTsKKwkJaWYgKGluZGV4MSA9PSAtMSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlbnVtQ29uc3RhbnROYW1lKTsgIC8vIHNob3VsZG4ndCBoYXBwZW4/CisJCX0KKwkJaW50IGluZGV4MiA9IGVudW1Db25zdGFudE5hbWUuaW5kZXhPZignLicsIGluZGV4MSArIDEpOworCQlpZiAoaW5kZXgyID09IC0xKSB7CisJCQlyZXR1cm4gdHJ1ZTsgIC8vIHRoZSBlbnVtIGlzIGluIHRoZSBkZWZhdWx0IHBhY2thZ2UgLSBubyBuZWVkIGZvciBpbXBvcnQKKwkJfQorCQlyZXR1cm4gdGhpcy5hZGRJbXBvcnQoZW51bUNvbnN0YW50TmFtZSwgdHJ1ZSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gYWRkSW1wb3J0KFN0cmluZyBpbXBvcnROYW1lLCBib29sZWFuIHN0YXRpY0ltcG9ydCkgeworCQlCb29sZWFuIGluY2x1ZGUgPSB0aGlzLmltcG9ydHNJbmNsdWRlKGltcG9ydE5hbWUsIHN0YXRpY0ltcG9ydCk7CisJCWlmIChpbmNsdWRlICE9IG51bGwpIHsKKwkJCXJldHVybiBpbmNsdWRlLmJvb2xlYW5WYWx1ZSgpOworCQl9CisKKwkJSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gPSB0aGlzLmdldEFzdCgpLm5ld0ltcG9ydERlY2xhcmF0aW9uKCk7CisJCWltcG9ydERlY2xhcmF0aW9uLnNldE5hbWUodGhpcy5nZXRBc3QoKS5uZXdOYW1lKGltcG9ydE5hbWUpKTsKKwkJaW1wb3J0RGVjbGFyYXRpb24uc2V0U3RhdGljKHN0YXRpY0ltcG9ydCk7CisJCXRoaXMuZ2V0SW1wb3J0cygpLmFkZChpbXBvcnREZWNsYXJhdGlvbik7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIEp1c3QgYSBiaXQgaGFja3k6CisJICogICAgIFJldHVybiBCb29sZWFuLlRSVUUgaWYgdGhlIGltcG9ydCBpcyBhbHJlYWR5IHByZXNlbnQuCisJICogICAgIFJldHVybiBCb29sZWFuLkZBTFNFIGlmIGEgY29sbGlkaW5nIGltcG9ydCBpcyBhbHJlYWR5IHByZXNlbnQuCisJICogICAgIFJldHVybiBudWxsIGlmIGEgbmV3IGltcG9ydCBtYXkgYmUgYWRkZWQuCisJICogVGhpcyBoYWNrZXJ5IGFsbG93cyB1cyB0byBsb29wIHRocm91Z2ggdGhlIGltcG9ydHMgb25seSBvbmNlCisJICogKGFuZCBjb21wb3NlIG91ciBtZXRob2RzKS4KKwkgKiBQcmUtY29uZGl0aW9uOiAnaW1wb3J0TmFtZScgaXMgbm90IGluIHRoZSAiZGVmYXVsdCIgcGFja2FnZSAoaS5lLiBpdCAqaXMqIHF1YWxpZmllZCkKKwkgKi8KKwlwcm90ZWN0ZWQgQm9vbGVhbiBpbXBvcnRzSW5jbHVkZShTdHJpbmcgaW1wb3J0TmFtZSwgYm9vbGVhbiBzdGF0aWNJbXBvcnQpIHsKKwkJaW50IHBlcmlvZCA9IGltcG9ydE5hbWUubGFzdEluZGV4T2YoJy4nKTsgIC8vIHNob3VsZCBub3QgYmUgLTEKKwkJU3RyaW5nIGltcG9ydE5hbWVRdWFsaWZpZXIgPSBpbXBvcnROYW1lLnN1YnN0cmluZygwLCBwZXJpb2QpOworCQlTdHJpbmcgc2hvcnRJbXBvcnROYW1lID0gaW1wb3J0TmFtZS5zdWJzdHJpbmcocGVyaW9kICsgMSk7CisJCXJldHVybiB0aGlzLmltcG9ydHNJbmNsdWRlKGltcG9ydE5hbWUsIGltcG9ydE5hbWVRdWFsaWZpZXIsIHNob3J0SW1wb3J0TmFtZSwgc3RhdGljSW1wb3J0KTsKKwl9CisKKwkvKioKKwkgKiBwcmUtY2FsY3VsYXRlIHRoZSBxdWFsaWZpZXIgYW5kIHNob3J0IG5hbWUKKwkgKi8KKwlwcm90ZWN0ZWQgQm9vbGVhbiBpbXBvcnRzSW5jbHVkZShTdHJpbmcgaW1wb3J0TmFtZSwgU3RyaW5nIGltcG9ydE5hbWVRdWFsaWZpZXIsIFN0cmluZyBzaG9ydEltcG9ydE5hbWUsIGJvb2xlYW4gc3RhdGljSW1wb3J0KSB7CisJCWZvciAoSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gOiB0aGlzLmdldEltcG9ydHMoKSkgeworCQkJaWYgKGltcG9ydERlY2xhcmF0aW9uLmlzU3RhdGljKCkgPT0gc3RhdGljSW1wb3J0KSB7CisJCQkJQm9vbGVhbiBtYXRjaCA9IHRoaXMuaW1wb3J0TWF0Y2hlcyhpbXBvcnREZWNsYXJhdGlvbiwgaW1wb3J0TmFtZSwgaW1wb3J0TmFtZVF1YWxpZmllciwgc2hvcnRJbXBvcnROYW1lKTsKKwkJCQlpZiAobWF0Y2ggIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbWF0Y2g7CisJCQkJfQogCQkJfQogCQl9CiAJCXJldHVybiBudWxsOwogCX0KIAotCXByb3RlY3RlZCBib29sZWFuIGltcG9ydElzRm9yKEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uLCBTdHJpbmcgc2hvcnROYW1lLCBib29sZWFuIHN0YXRpY18pIHsKLQkJaWYgKGltcG9ydERlY2xhcmF0aW9uLmlzU3RhdGljKCkgIT0gc3RhdGljXykgeworCS8qKgorCSAqIHdlIHNob3VsZCBiZSBhYmxlIHRvIHJlbHkgb24gdGhlIEpEVCBtb2RlbCBoZXJlLCBzaW5jZSB3ZSBhcmUgbG9va2luZworCSAqIGF0IG9iamVjdHMgdGhhdCBzaG91bGQgbm90IGJlIGNoYW5naW5nIHVuZGVybmVhdGggdXMuLi4KKwkgKi8KKwlwcm90ZWN0ZWQgQm9vbGVhbiBpbXBvcnRNYXRjaGVzKEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uLCBTdHJpbmcgaW1wb3J0TmFtZSwgU3RyaW5nIGltcG9ydE5hbWVRdWFsaWZpZXIsIFN0cmluZyBzaG9ydEltcG9ydE5hbWUpIHsKKwkJLy8gZXhhbXBsZXM6CisJCS8vICdpbXBvcnROYW1lJyBpcyAiamF2YS51dGlsLkRhdGUiCisJCS8vICAgICBvcgorCQkvLyAnaW1wb3J0TmFtZScgaXMgImphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEUiCisJCVN0cmluZyBpZG4gPSBpbXBvcnREZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7CisJCWlmIChpbXBvcnROYW1lLmVxdWFscyhpZG4pKSB7CisJCQkvLyBpbXBvcnQgamF2YS51dGlsLkRhdGU7ID0+ICJEYXRlIiB3aWxsIHJlc29sdmUgdG8gImphdmEudXRpbC5EYXRlIgorCQkJLy8gaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOyA9PiAiVFlQRSIgd2lsbCByZXNvbHZlIHRvICJqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFIgorCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKKwkJfQorCisJCVN0cmluZyBzaG9ydElETiA9IGlkbi5zdWJzdHJpbmcoaWRuLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKKwkJaWYgKHNob3J0SW1wb3J0TmFtZS5lcXVhbHMoc2hvcnRJRE4pKSB7CisJCQkvLyBpbXBvcnQgamF2YS5zcWwuRGF0ZTsgPT4gYW1iaWd1b3VzIHJlc29sdXRpb24gb2YgIkRhdGUiCisJCQkvLyBpbXBvcnQgc3RhdGljIG9yZy5mb28uQmFyLlRZUEU7ID0+IGFtYmlndW91cyByZXNvbHV0aW9uIG9mICJUWVBFIgorCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCX0KKworCQlpZiAoaW1wb3J0RGVjbGFyYXRpb24uaXNPbkRlbWFuZCgpKSB7CisJCQlpZiAoaW1wb3J0TmFtZVF1YWxpZmllci5lcXVhbHMoaWRuKSkgeworCQkJCS8vIGltcG9ydCBqYXZhLnV0aWwuKjsgPT4gIkRhdGUiIHdpbGwgcmVzb2x2ZSB0byAiamF2YS51dGlsLkRhdGUiCisJCQkJLy8gaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS4qOyA9PiAiVFlQRSIgd2lsbCByZXNvbHZlIHRvICJqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFIgorCQkJCXJldHVybiBCb29sZWFuLlRSVUU7CisJCQl9CisJCQlpZiAoaW1wb3J0RGVjbGFyYXRpb24uaXNTdGF0aWMoKSkgeworCQkJCWlmICh0aGlzLmVudW1SZXNvbHZlcyhpZG4sIHNob3J0SW1wb3J0TmFtZSkpIHsKKwkJCQkJLy8gaW1wb3J0IHN0YXRpYyBvcmcuZm9vLkJhci4qOyA9PiBhbWJpZ3VvdXMgcmVzb2x1dGlvbiBvZiAiVFlQRSIKKwkJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAodGhpcy50eXBlUmVzb2x2ZXMoaWRuICsgJy4nICsgc2hvcnRJbXBvcnROYW1lKSkgeworCQkJCQkvLyBpbXBvcnQgamF2YS5zcWwuKjsgPT4gYW1iaWd1b3VzIHJlc29sdXRpb24gb2YgIkRhdGUiCisJCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBubyBtYXRjaGVzIC0gT0sgdG8gYWRkIGV4cGxpY2l0IGltcG9ydAorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBlbnVtUmVzb2x2ZXMoU3RyaW5nIGVudW1UeXBlTmFtZSwgU3RyaW5nIGVudW1Db25zdGFudE5hbWUpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiB0aGlzLmVudW1SZXNvbHZlc18oZW51bVR5cGVOYW1lLCBlbnVtQ29uc3RhbnROYW1lKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBlbnVtUmVzb2x2ZXNfKFN0cmluZyBlbnVtVHlwZU5hbWUsIFN0cmluZyBlbnVtQ29uc3RhbnROYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJSVR5cGUgamR0VHlwZSA9IHRoaXMuZmluZFR5cGVfKGVudW1UeXBlTmFtZSk7CisJCWlmIChqZHRUeXBlID09IG51bGwpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQlTdHJpbmcgaW1wb3J0RGVjbGFyYXRpb25OYW1lID0gaW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQlyZXR1cm4gaW1wb3J0RGVjbGFyYXRpb25OYW1lLmVuZHNXaXRoKHNob3J0TmFtZSk7CisJCWlmICggISBqZHRUeXBlLmlzRW51bSgpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZm9yIChJRmllbGQgamR0RmllbGQgOiBqZHRUeXBlLmdldEZpZWxkcygpKSB7CisJCQlpZiAoamR0RmllbGQuaXNFbnVtQ29uc3RhbnQoKSAmJiBqZHRGaWVsZC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhlbnVtQ29uc3RhbnROYW1lKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmFkYXB0ZXIudG9TdHJpbmcoKSk7CisJcHJvdGVjdGVkIGJvb2xlYW4gdHlwZVJlc29sdmVzKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiB0aGlzLmZpbmRUeXBlKG5hbWUpICE9IG51bGw7CisJfQorCisJcHJvdGVjdGVkIElUeXBlIGZpbmRUeXBlKFN0cmluZyBuYW1lKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy5maW5kVHlwZV8obmFtZSk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworCQl9CisJfQorCisJcHJvdGVjdGVkIElUeXBlIGZpbmRUeXBlXyhTdHJpbmcgbmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldEphdmFFbGVtZW50KCkuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShuYW1lKTsKKwl9CisKKwlwcm90ZWN0ZWQgTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gZ2V0SW1wb3J0cygpIHsKKwkJcmV0dXJuIHRoaXMuaW1wb3J0cyh0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgpKTsKKwl9CisKKwkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJvdGVjdGVkIExpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGltcG9ydHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIGFzdFJvb3QuaW1wb3J0cygpOwogCX0KIAogCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKKwkvLyAqKioqKioqKioqIGFubm90YXRpb24gbmFtZSByZXNvbHV0aW9uICoqKioqKioqKioKIAogCXB1YmxpYyBib29sZWFuIGFubm90YXRpb25Jc05hbWVkKEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIHF1YWxpZmllZE5hbWUgPSB0aGlzLnF1YWxpZmllZE5hbWUoYW5ub3RhdGlvbik7Ci0JCXJldHVybiAocXVhbGlmaWVkTmFtZSAhPSBudWxsKSAmJiBxdWFsaWZpZWROYW1lLmVxdWFscyhuYW1lKTsKKwkJcmV0dXJuIHRoaXMuZ2V0UXVhbGlmaWVkTmFtZShhbm5vdGF0aW9uKS5lcXVhbHMobmFtZSk7CiAJfQogCi0JLy8gVE9ETwotCXByaXZhdGUgU3RyaW5nIHF1YWxpZmllZE5hbWUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7CisJLyoqCisJICogU2ltcGx5IHJldHVybiB0aGUgYW5ub3RhdGlvbidzIHVucXVhbGlmaWVkIG5hbWUgaWYgd2UgY2FuJ3QgInJlc29sdmUiIGl0LgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKIAkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gYW5ub3RhdGlvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKIAkJaWYgKHR5cGVCaW5kaW5nICE9IG51bGwpIHsKIAkJCVN0cmluZyByZXNvbHZlZE5hbWUgPSB0eXBlQmluZGluZy5nZXRRdWFsaWZpZWROYW1lKCk7CkBAIC0yNTAsNzIgKzMxNSwxMjMgQEAKIAkJLy8gaGFjayg/KTogY2hlY2sgZm9yIGEgbWF0Y2hpbmcgaW1wb3J0IGJlY2F1c2Ugd2hlbiBtb3ZpbmcgYSBzdGFuZC1hbG9uZQogCQkvLyBhbm5vdGF0aW9uIHRvIGl0cyBjb250YWluZXIgaW4gQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgogCQkvLyB0aGUgY29udGFpbmVyJ3MgaW1wb3J0IGlzIGFkZGVkIGJ1dCB0aGVuIGl0IHdvbid0ICJyZXNvbHZlIiB1cG9uCi0JCS8vIHN1YnNlcXVlbnQgbG9va3Vwcy4uLiA6LSgKLQkJcmV0dXJuIHRoaXMuZ2V0SW1wb3J0Rm9yKGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7ICAvLyBsb29rIGZvciBhIG1hdGNoaW5nIGltcG9ydAotCi0JCS8vIE9MRCBNRVRIT0QgU09VUkNFOgotLy8JCVN0cmluZyBuYW1lID0gYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotLy8JCWlmIChuYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgewotLy8JCQlyZXR1cm4gbmFtZTsgIC8vIG5hbWUgaXMgYWxyZWFkeSBxdWFsaWZpZWQKLS8vCQl9Ci0vLwkJU3RyaW5nIHJlc29sdmVkTmFtZSA9IEpEVFRvb2xzLnJlc29sdmUobmFtZSwgdGhpcy50eXBlKCkpOwotLy8JCS8vIGhhY2soPyk6IGNoZWNrIGZvciBhIG1hdGNoaW5nIGltcG9ydCBiZWNhdXNlIHdoZW4gbW92aW5nIGEgc3RhbmQtYWxvbmUKLS8vCQkvLyBhbm5vdGF0aW9uIHRvIGl0cyBjb250YWluZXIgaW4gQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotLy8JCS8vIHRoZSBjb250YWluZXIncyBpbXBvcnQgaXMgYWRkZWQgYnV0IHRoZW4gaXQgd29uJ3QgInJlc29sdmUiIHVwb24KLS8vCQkvLyBzdWJzZXF1ZW50IGxvb2t1cHMuLi4gOi0oCi0vLwkJcmV0dXJuIHRoaXMuaW1wb3J0Rm9yKG5hbWUpOyAgLy8gbG9vayBmb3IgYSBtYXRjaGluZyBpbXBvcnQKKwkJLy8gc3Vic2VxdWVudCBsb29rdXBzIChiZWNhdXNlIHRoZSBwYXJzZXIgaGFzbid0IGhhZCB0aW1lIHRvIHJ1bj8pLi4uIDotKAorCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9GdWxsQ2xhc3NOYW1lKGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7CiAJfQogCiAJLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpbXBvcnQgd2FzIGFkZGVkIHdpdGhvdXQgYSBjb2xsaXNpb24uCisJICogSWYgbmVjZXNzYXJ5LCB1c2UgdGhlIGRlY2xhcmF0aW9uJ3MgaW1wb3J0cyB0byBjYWxjdWxhdGUgYSBndWVzcyBhcyB0bworCSAqIHRoZSBzcGVjaWZpZWQgbmFtZSdzIGZ1bGx5LXF1YWxpZmllZCBmb3JtLgorCSAqIFNpbXBseSByZXR1cm4gdGhlIHVucXVhbGlmaWVkIG5hbWUgaWYgd2UgY2FuJ3QgInJlc29sdmUiIGl0LgogCSAqLwotCS8vIFRPRE8gaGFuZGxlIGNvbGxpc2lvbnMgKGUuZy4gamF2YS51dGlsLkRhdGUgdnMuIGphdmEuc3FsLkRhdGUpCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wb3J0VG8oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QsIFN0cmluZyBpbXBvcnROYW1lLCBib29sZWFuIHN0YXRpY18pIHsKLQkJTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gaW1wb3J0cyA9IHRoaXMuaW1wb3J0cyhhc3RSb290KTsKLQkJaWYgKHRoaXMuaW1wb3J0c0luY2x1ZGUoaW1wb3J0cywgaW1wb3J0TmFtZSwgc3RhdGljXykpIHsKLQkJCXJldHVybjsKKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb0Z1bGxDbGFzc05hbWUoU3RyaW5nIG5hbWUpIHsKKwkJLy8gY2hlY2sgZm9yIGZ1bGx5LXF1YWxpZmllZCBuYW1lCisJCXJldHVybiAobmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSA/IG5hbWUgOiB0aGlzLnJlc29sdmVBZ2FpbnN0SW1wb3J0cyhuYW1lLCBmYWxzZSk7CisJfQorCisJLyoqCisJICogSWYgbmVjZXNzYXJ5LCB1c2UgdGhlIGRlY2xhcmF0aW9uJ3MgaW1wb3J0cyB0byBjYWxjdWxhdGUgYSBndWVzcyBhcyB0bworCSAqIHRoZSBzcGVjaWZpZWQgbmFtZSdzIGZ1bGx5LXF1YWxpZmllZCBmb3JtLgorCSAqIFNpbXBseSByZXR1cm4gdGhlIHVucXVhbGlmaWVkIG5hbWUgaWYgd2UgY2FuJ3QgInJlc29sdmUiIGl0LgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvRnVsbEVudW1Db25zdGFudE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJaW50IGluZGV4MSA9IG5hbWUuaW5kZXhPZignLicpOworCQlpZiAoaW5kZXgxID09IC0xKSB7CisJCQkvLyBzaG9ydCBuYW1lLCBlLmcuICJUWVBFIgorCQkJLy8gdHJ1ZSA9IGxvb2sgZm9yIHN0YXRpYyBpbXBvcnQgb2YgZW51bSBjb25zdGFudAorCQkJcmV0dXJuIHRoaXMucmVzb2x2ZUFnYWluc3RJbXBvcnRzKG5hbWUsIHRydWUpOwogCQl9Ci0JCUFTVCBhc3QgPSBhc3RSb290LmdldEFTVCgpOwotCQlJbXBvcnREZWNsYXJhdGlvbiBpbXBvcnRfID0gYXN0Lm5ld0ltcG9ydERlY2xhcmF0aW9uKCk7Ci0JCWltcG9ydF8uc2V0TmFtZShhc3QubmV3TmFtZShpbXBvcnROYW1lKSk7Ci0JCWltcG9ydF8uc2V0U3RhdGljKHN0YXRpY18pOwotCQlpbXBvcnRzLmFkZChpbXBvcnRfKTsKKworCQlpbnQgaW5kZXgyID0gbmFtZS5pbmRleE9mKCcuJywgaW5kZXgxICsgMSk7CisJCWlmIChpbmRleDIgPT0gLTEpIHsKKwkJCS8vIHBhcnRpYWxseS1xdWFsaWZpZWQgbmFtZSwgZS5nLiAiRWxlbWVudFR5cGUuVFlQRSIKKwkJCS8vIGZhbHNlID0gbG9vayByZWd1bGFyIGltcG9ydCBvZiBlbnVtIGNsYXNzLCBub3Qgc3RhdGljIGltcG9ydCBvZiBlbnVtIGNvbnN0YW50CisJCQlyZXR1cm4gdGhpcy5yZXNvbHZlQWdhaW5zdEltcG9ydHMobmFtZSwgZmFsc2UpOworCQl9CisKKwkJLy8gZnVsbHktcXVhbGlmaWVkIG5hbWUsIGUuZy4gImphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEUiCisJCXJldHVybiBuYW1lOwogCX0KIAotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBhc3RSb290LmltcG9ydHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBvcnRzSW5jbHVkZShMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzLCBTdHJpbmcgaW1wb3J0TmFtZSwgYm9vbGVhbiBzdGF0aWNfKSB7Ci0JCWZvciAoSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gOiBpbXBvcnRzKSB7Ci0JCQlpZiAodGhpcy5pbXBvcnRJbmNsdWRlcyhpbXBvcnREZWNsYXJhdGlvbiwgaW1wb3J0TmFtZSwgc3RhdGljXykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKKwkvKioKKwkgKiBBdHRlbXB0IHRvIHJlc29sdmUgdGhlIHNwZWNpZmllZCAic2hvcnQiIG5hbWUgYWdhaW5zdCB0aGUgZGVjbGFyYXRpb24ncworCSAqIGltcG9ydHMuIFJldHVybiB0aGUgbmFtZSB1bmNoYW5nZWQgaWYgd2UgY2FuJ3QgcmVzb2x2ZSBpdCAocGVyaGFwcyBpdCBpcworCSAqIGluIHRoZSAiZGVmYXVsdCIgcGFja2FnZSkuCisJICovCisJcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlQWdhaW5zdEltcG9ydHMoU3RyaW5nIHNob3J0TmFtZSwgYm9vbGVhbiBzdGF0aWNfKSB7CisJCWZvciAoSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gOiB0aGlzLmdldEltcG9ydHMoKSkgeworCQkJaWYgKGltcG9ydERlY2xhcmF0aW9uLmlzU3RhdGljKCkgPT0gc3RhdGljXykgeworCQkJCVN0cmluZyByZXNvbHZlZE5hbWUgPSB0aGlzLnJlc29sdmVBZ2FpbnN0SW1wb3J0KGltcG9ydERlY2xhcmF0aW9uLCBzaG9ydE5hbWUpOworCQkJCWlmIChyZXNvbHZlZE5hbWUgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gcmVzb2x2ZWROYW1lOworCQkJCX0KIAkJCX0KIAkJfQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBzaG9ydE5hbWU7ICAvLyAiZGVmYXVsdCIgcGFja2FnZSBvciB1bmtub3duCiAJfQogCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW1wb3J0SW5jbHVkZXMoSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24sIFN0cmluZyBpbXBvcnROYW1lLCBib29sZWFuIHN0YXRpY18pIHsKLQkJaWYgKGltcG9ydERlY2xhcmF0aW9uLmlzU3RhdGljKCkgIT0gc3RhdGljXykgewotCQkJcmV0dXJuIGZhbHNlOworCS8qKgorCSAqIEF0dGVtcHQgdG8gcmVzb2x2ZSB0aGUgc3BlY2lmaWVkICJzaG9ydCIgbmFtZSBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQKKwkgKiBpbXBvcnQuIFJldHVybiB0aGUgcmVzb2x2ZWQgbmFtZSBpZiB0aGUgaW1wb3J0IHJlc29sdmVzIGl0OyBvdGhlcndpc2UKKwkgKiByZXR1cm4gbnVsbC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVBZ2FpbnN0SW1wb3J0KEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uLCBTdHJpbmcgc2hvcnROYW1lKSB7CisJCVN0cmluZyBpZG4gPSBpbXBvcnREZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7CisJCWlmIChpbXBvcnREZWNsYXJhdGlvbi5pc09uRGVtYW5kKCkpIHsKKwkJCVN0cmluZyBjYW5kaWRhdGUgPSBpZG4gKyAnLicgKyBzaG9ydE5hbWU7CisJCQlpZiAoaW1wb3J0RGVjbGFyYXRpb24uaXNTdGF0aWMoKSkgeworCQkJCWlmICh0aGlzLmVudW1SZXNvbHZlcyhpZG4sIHNob3J0TmFtZSkpIHsKKwkJCQkJcmV0dXJuIGNhbmRpZGF0ZTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICh0aGlzLnR5cGVSZXNvbHZlcyhjYW5kaWRhdGUpKSB7CisJCQkJCXJldHVybiBjYW5kaWRhdGU7CisJCQkJfQorCQkJfQorCQkJLy8gbm8gbWF0Y2gKKwkJCXJldHVybiBudWxsOwogCQl9Ci0JCVN0cmluZyBpbXBvcnREZWNsYXJhdGlvbk5hbWUgPSBpbXBvcnREZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCWlmIChpbXBvcnROYW1lLmVxdWFscyhpbXBvcnREZWNsYXJhdGlvbk5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKKworCQkvLyBleHBsaWNpdCBpbXBvcnQgLSBzZWUgd2hldGhlciBpdHMgZW5kIG1hdGNoZXMgJ3Nob3J0TmFtZScKKwkJaW50IHBlcmlvZCA9IGlkbi5sZW5ndGgoKSAtIHNob3J0TmFtZS5sZW5ndGgoKSAtIDE7CisJCWlmIChwZXJpb2QgPCAxKSB7CisJCQkvLyBzb21ldGhpbmcgbXVzdCBwcmVjZWRlIHBlcmlvZAorCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJaWYgKGltcG9ydERlY2xhcmF0aW9uLmlzT25EZW1hbmQoKQotCQkJCSYmIHRoaXMub25EZW1hbmROYW1lRm9yKGltcG9ydE5hbWUpLmVxdWFscyhpbXBvcnREZWNsYXJhdGlvbk5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKChpZG4uY2hhckF0KHBlcmlvZCkgPT0gJy4nKSAmJiBpZG4uZW5kc1dpdGgoc2hvcnROYW1lKSkgeworCQkJcmV0dXJuIGlkbjsgIC8vIHByb2JhYmxlIGV4YWN0IG1hdGNoCiAJCX0KLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlwcm90ZWN0ZWQgU3RyaW5nIG9uRGVtYW5kTmFtZUZvcihTdHJpbmcgaW1wb3J0TmFtZSkgewotCQlpbnQgbGFzdFBlcmlvZCA9IGltcG9ydE5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJcmV0dXJuIChsYXN0UGVyaW9kID09IC0xKSA/ICIiIDogaW1wb3J0TmFtZS5zdWJzdHJpbmcoMCwgbGFzdFBlcmlvZCk7CisKKwkvLyAqKioqKioqKioqIG1pc2NlbGxhbmVvdXMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwdWJsaWMgQVNUTm9kZSBnZXREZWNsYXJhdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXREZWNsYXJhdGlvbigpOwogCX0KLQkKKworCS8qKgorCSAqIFJldHVybiB0aGUgZGVjbGFyYXRpb24ncyBsaXN0IG9mIG1vZGlmaWVycy4KKwkgKiBFbGVtZW50IHR5cGU6IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JRXh0ZW5kZWRNb2RpZmllcgorCSAqLworCXByb3RlY3RlZCBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7CisJCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0TW9kaWZpZXJzKCk7CisJfQorCisJcHVibGljIEFTVCBnZXRBc3QoKSB7CisJCXJldHVybiB0aGlzLmdldERlY2xhcmF0aW9uKCkuZ2V0QVNUKCk7CisJfQorCisJcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7CisJCXJldHVybiAoQ29tcGlsYXRpb25Vbml0KSB0aGlzLmdldERlY2xhcmF0aW9uKCkuZ2V0Um9vdCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYWRhcHRlci50b1N0cmluZygpKTsKKwl9CisKIAogCS8vICoqKioqKioqKiogZGVjbGFyYXRpb24gYWRhcHRlciBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9ucyAqKioqKioqKioqCiAKQEAgLTMyNywxMyArNDQzLDEzIEBACiAJCS8qKgogCQkgKiBSZXR1cm4gdGhlIGFkYXB0ZWQgImRlY2xhcmF0aW9uIi4KIAkJICovCi0JCUFTVE5vZGUgZGVjbGFyYXRpb24oKTsKKwkJQVNUTm9kZSBnZXREZWNsYXJhdGlvbigpOwogCiAJCS8qKgogCQkgKiBSZXR1cm4gdGhlICJkZWNsYXJhdGlvbiIncyBsaXN0IG9mIG1vZGlmaWVycy4KIAkJICogRWxlbWVudCB0eXBlOiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXIKIAkJICovCi0JCUxpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IG1vZGlmaWVycygpOworCQlMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKTsKIAogCX0KIApAQCAtMzQzLDExICs0NTksMTEgQEAKIAkJCXN1cGVyKCk7CiAJCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247CiAJCX0KLQkJcHVibGljIEFTVE5vZGUgZGVjbGFyYXRpb24oKSB7CisJCXB1YmxpYyBBU1ROb2RlIGdldERlY2xhcmF0aW9uKCkgewogCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247CiAJCX0KIAkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBtb2RpZmllcnMoKSB7CisJCXB1YmxpYyBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7CiAJCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbi5tb2RpZmllcnMoKTsKIAkJfQogCQlAT3ZlcnJpZGUKQEAgLTM2MiwxMSArNDc4LDExIEBACiAJCQlzdXBlcigpOwogCQkJdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwogCQl9Ci0JCXB1YmxpYyBBU1ROb2RlIGRlY2xhcmF0aW9uKCkgeworCQlwdWJsaWMgQVNUTm9kZSBnZXREZWNsYXJhdGlvbigpIHsKIAkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uOwogCQl9CiAJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzKCkgeworCQlwdWJsaWMgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gZ2V0TW9kaWZpZXJzKCkgewogCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb24ubW9kaWZpZXJzKCk7CiAJCX0KIAkJQE92ZXJyaWRlCkBAIC0zODEsMTEgKzQ5NywxMSBAQAogCQkJc3VwZXIoKTsKIAkJCXRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjsKIAkJfQotCQlwdWJsaWMgQVNUTm9kZSBkZWNsYXJhdGlvbigpIHsKKwkJcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7CiAJCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbjsKIAkJfQogCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IG1vZGlmaWVycygpIHsKKwkJcHVibGljIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IGdldE1vZGlmaWVycygpIHsKIAkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uLm1vZGlmaWVycygpOwogCQl9CiAJCUBPdmVycmlkZQpAQCAtNDAwLDExICs1MTYsMTEgQEAKIAkJCXN1cGVyKCk7CiAJCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247CiAJCX0KLQkJcHVibGljIEFTVE5vZGUgZGVjbGFyYXRpb24oKSB7CisJCXB1YmxpYyBBU1ROb2RlIGdldERlY2xhcmF0aW9uKCkgewogCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247CiAJCX0KIAkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBtb2RpZmllcnMoKSB7CisJCXB1YmxpYyBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7CiAJCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbi5tb2RpZmllcnMoKTsKIAkJfQogCQlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVFRvb2xzLmphdmEKaW5kZXggMjA1MDAxMS4uYTdmOTMzOSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVFRvb2xzLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVFRvb2xzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw2ICs5LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwogCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwpAQCAtMzEsNiArMzIsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZUphdmFUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZU1ldGhvZFNpZ25hdHVyZTsKIAorLyoqCisgKiBDb252ZW5pZW5jZSBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGggSkRUIG9iamVjdHMuCisgKi8KIHB1YmxpYyBjbGFzcyBKRFRUb29scyB7CiAKIAkvKioKQEAgLTQwLDExICs0NCwxNiBAQAogCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdChJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgewogCQlBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7CiAJCXBhcnNlci5zZXRTb3VyY2UoY29tcGlsYXRpb25Vbml0KTsKKy8vIFRPRE8KKy8vCQlwYXJzZXIuc2V0Rm9jYWxQb3NpdGlvbigwKTsKIAkJcGFyc2VyLnNldFJlc29sdmVCaW5kaW5ncyh0cnVlKTsKIAkJcGFyc2VyLnNldEJpbmRpbmdzUmVjb3ZlcnkodHJ1ZSk7ICAvLyBzZWUgYnVncyAxOTYyMDAsIDIyMjczNQogCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgcGFyc2VyLmNyZWF0ZUFTVChudWxsKTsKIAl9CiAKKworCS8vICoqKioqKioqKiogSkRUIERPTSAqKioqKioqKioqCisKIAlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlRW51bShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKIAkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CkBAIC02MSwzMyArNzAsNDQgQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlRW51bShOYW1lIGVudW1FeHByZXNzaW9uKSB7CiAJCUlCaW5kaW5nIGJpbmRpbmcgPSBlbnVtRXhwcmVzc2lvbi5yZXNvbHZlQmluZGluZygpOwogCQlpZiAoYmluZGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsgIC8vIFRPRE8gZmlndXJlIHdoeSB0aGlzIGlzIG51bGwgc29tZXRpbWVzCisJCQlyZXR1cm4gbnVsbDsgIC8vIFRPRE8gZmlndXJlIG91dCB3aHkgdGhpcyBpcyBudWxsIHNvbWV0aW1lcwogCQl9CiAJCWlmIChiaW5kaW5nLmdldEtpbmQoKSAhPSBJQmluZGluZy5WQVJJQUJMRSkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSAoSVZhcmlhYmxlQmluZGluZykgYmluZGluZzsKLQkJcmV0dXJuIHZhcmlhYmxlQmluZGluZy5nZXRUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIi4iICsgdmFyaWFibGVCaW5kaW5nLmdldE5hbWUoKTsKKwkJcmV0dXJuIHZhcmlhYmxlQmluZGluZy5nZXRUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpICsgJy4nICsgdmFyaWFibGVCaW5kaW5nLmdldE5hbWUoKTsKIAl9Ci0JCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgbm9kZSdzIGFubm90YXRpb24KKwkgKiBjbGFzcy4KKwkgKi8KIAlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlQW5ub3RhdGlvbihBbm5vdGF0aW9uIG5vZGUpIHsKIAkJSUFubm90YXRpb25CaW5kaW5nIGFubm90YXRpb25CaW5kaW5nID0gbm9kZS5yZXNvbHZlQW5ub3RhdGlvbkJpbmRpbmcoKTsKIAkJaWYgKGFubm90YXRpb25CaW5kaW5nID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9CiAJCUlUeXBlQmluZGluZyBhbm5vdGF0aW9uVHlwZUJpbmRpbmcgPSBhbm5vdGF0aW9uQmluZGluZy5nZXRBbm5vdGF0aW9uVHlwZSgpOwotCQlpZiAoYW5ub3RhdGlvblR5cGVCaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBhbm5vdGF0aW9uVHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpOworCQlyZXR1cm4gKGFubm90YXRpb25UeXBlQmluZGluZyA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uVHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpOwogCX0KIAkKKwkvKioKKwkgKiBJZiB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gaXMgYSB0eXBlIGxpdGVyYWwsIHJldHVybiB0aGUgdHlwZSdzIGZ1bGx5LQorCSAqIHF1YWxpZmllZCBuYW1lLiBSZXR1cm4gbnVsbCBvdGhlcndpc2UuCisJICovCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJSVR5cGVCaW5kaW5nIHJlc29sdmVkVHlwZUJpbmRpbmcgPSByZXNvbHZlVHlwZUJpbmRpbmcoZXhwcmVzc2lvbik7CisJCXJldHVybiAocmVzb2x2ZWRUeXBlQmluZGluZyA9PSBudWxsKSA/IG51bGwgOiByZXNvbHZlZFR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKTsKKwl9CisJCisJLyoqCisJICogSWYgdGhlIHNwZWNpZmllZCBleHByZXNzaW9uIGlzIGEgdHlwZSBsaXRlcmFsLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiB0eXBlIGJpbmRpbmcuCisJICovCisJcHVibGljIHN0YXRpYyBJVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGVCaW5kaW5nKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewogCQlpZiAoZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9MSVRFUkFMKSB7Ci0JCQlJVHlwZUJpbmRpbmcgcmVzb2x2ZWRUeXBlQmluZGluZyA9ICgoVHlwZUxpdGVyYWwpIGV4cHJlc3Npb24pLmdldFR5cGUoKS5yZXNvbHZlQmluZGluZygpOwotCQkJaWYgKHJlc29sdmVkVHlwZUJpbmRpbmcgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXNvbHZlZFR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCX0KKwkJCXJldHVybiAoKFR5cGVMaXRlcmFsKSBleHByZXNzaW9uKS5nZXRUeXBlKCkucmVzb2x2ZUJpbmRpbmcoKTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CkBAIC0xMTYsNCArMTM2LDcyIEBACiAJCXJldHVybiBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCk7CiAJfQogCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBleHByZXNzaW9uIGlzIGEgdHlwZSBsaXRlcmFsIGFuZCB0aGUgdHlwZSBiaW5kaW5nCisJICogY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZSBleGlzdHMgaW4gdGhlIHR5cGUKKwkgKiBsaXRlcmFsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5IChzdXBlcmNsYXNzZXMgYW5kIGludGVyZmFjZXMpLgorCSAqIFJldHVybiBudWxsIG90aGVyd2lzZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUlzU3ViVHlwZU9mKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIHNlYXJjaFR5cGVOYW1lKSB7CisJCXJldHVybiBmaW5kVHlwZUluSGllcmFyY2h5KGV4cHJlc3Npb24sIHNlYXJjaFR5cGVOYW1lKSAhPSBudWxsOworCX0KKworCS8qKgorCSAqIElmIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBhIHR5cGUgbGl0ZXJhbCwgcmV0dXJuIHRoZSB0eXBlIGJpbmRpbmcKKwkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSBuYW1lIGlmIGl0IGV4aXN0cyBpbiB0aGUgdHlwZQorCSAqIGxpdGVyYWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkgKHN1cGVyY2xhc3NlcyBhbmQgaW50ZXJmYWNlcykuCisJICogUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSVR5cGVCaW5kaW5nIGZpbmRUeXBlSW5IaWVyYXJjaHkoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgc2VhcmNoVHlwZU5hbWUpIHsKKwkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gcmVzb2x2ZVR5cGVCaW5kaW5nKGV4cHJlc3Npb24pOworCQlyZXR1cm4gKHR5cGVCaW5kaW5nID09IG51bGwpID8gbnVsbCA6IGZpbmRUeXBlSW5IaWVyYXJjaHkodHlwZUJpbmRpbmcsIHNlYXJjaFR5cGVOYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciBhIHR5cGUgYmluZGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZSBuYW1lIGV4aXN0cyBpbgorCSAqIHRoZSBzcGVjaWZpZWQgdHlwZSBiaW5kaW5nJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5IChzdXBlcmNsYXNzZXMKKwkgKiBhbmQgaW50ZXJmYWNlcykuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIHR5cGVJc1N1YlR5cGVPZihJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIFN0cmluZyBzZWFyY2hUeXBlTmFtZSkgeworCQlyZXR1cm4gZmluZFR5cGVJbkhpZXJhcmNoeSh0eXBlQmluZGluZywgc2VhcmNoVHlwZU5hbWUpICE9IG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSB0eXBlIGJpbmRpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZSBpZiBpdAorCSAqIGV4aXN0cyBpbiB0aGUgc3BlY2lmaWVkIHR5cGUgYmluZGluZydzIGluaGVyaXRhbmNlIGhpZXJhcmNoeSAoc3VwZXJjbGFzc2VzCisJICogYW5kIGludGVyZmFjZXMpLiBSZXR1cm4gbnVsbCBvdGhlcndpc2UuCisJICovCisJcHVibGljIHN0YXRpYyBJVHlwZUJpbmRpbmcgZmluZFR5cGVJbkhpZXJhcmNoeShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIFN0cmluZyBzZWFyY2hUeXBlTmFtZSkgeworCQlyZXR1cm4gZmluZFR5cGVJbkhpZXJhcmNoeSh0eXBlQmluZGluZywgc2VhcmNoVHlwZU5hbWUsIG5ldyBIYXNoU2V0PFN0cmluZz4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgSVR5cGVCaW5kaW5nIGZpbmRUeXBlSW5IaWVyYXJjaHkoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBTdHJpbmcgc2VhcmNoVHlwZU5hbWUsIEhhc2hTZXQ8U3RyaW5nPiB2aXNpdGVkKSB7CisJCVN0cmluZyB0eXBlTmFtZSA9IHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKTsKKwkJaWYgKHZpc2l0ZWQuY29udGFpbnModHlwZU5hbWUpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAodHlwZU5hbWUuZXF1YWxzKHNlYXJjaFR5cGVOYW1lKSkgeworCQkJcmV0dXJuIHR5cGVCaW5kaW5nOworCQl9CisJCXZpc2l0ZWQuYWRkKHR5cGVOYW1lKTsKKworCQlJVHlwZUJpbmRpbmdbXSBpbnRlcmZhY2VCaW5kaW5ncyA9IHR5cGVCaW5kaW5nLmdldEludGVyZmFjZXMoKTsKKwkJZm9yIChJVHlwZUJpbmRpbmcgaW50ZXJmYWNlQmluZGluZyA6IGludGVyZmFjZUJpbmRpbmdzKSB7ICAvLyByZWN1cnNlIHVwIGludGVyZmFjZXMKKwkJCUlUeXBlQmluZGluZyByZXN1bHQgPSBmaW5kVHlwZUluSGllcmFyY2h5KGludGVyZmFjZUJpbmRpbmcsIHNlYXJjaFR5cGVOYW1lLCB2aXNpdGVkKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CQkJCisJCX0KKworCQlJVHlwZUJpbmRpbmcgc3VwZXJCaW5kaW5nID0gdHlwZUJpbmRpbmcuZ2V0U3VwZXJjbGFzcygpOworCQlpZiAoc3VwZXJCaW5kaW5nICE9IG51bGwpIHsgIC8vIHJlY3Vyc2UgdXAgc3VwZXJjbGFzc2VzCisJCQlJVHlwZUJpbmRpbmcgcmVzdWx0ID0gZmluZFR5cGVJbkhpZXJhcmNoeShzdXBlckJpbmRpbmcsIHNlYXJjaFR5cGVOYW1lLCB2aXNpdGVkKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUVHlwZS5qYXZhCmluZGV4IDIyY2E2YzMuLjI2ZGUzMzMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRUeXBlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVFR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMiw2ICsxMiw4IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7CkBAIC0yMCw3ICsyMiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7CiAKIC8qKgogICogQWRhcHQgYW5kIGV4dGVuZCBhIEpEVCB0eXBlLgpAQCAtMzYsOCArMzgsOCBAQAogCXB1YmxpYyBKRFRUeXBlKAogCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgIC8vIGV4Y2x1ZGUgYW5ub3RhdGlvbnMgYW5kIGVudW1zCiAJCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIpIHsKLQkJdGhpcyh0eXBlRGVjbGFyYXRpb24sIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOworCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7CisJCXRoaXModHlwZURlY2xhcmF0aW9uLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7CiAJfQogCiAJLyoqCkBAIC00Niw5ICs0OCw5IEBACiAJcHVibGljIEpEVFR5cGUoCiAJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCAgLy8gZXhjbHVkZSBhbm5vdGF0aW9ucyBhbmQgZW51bXMKIAkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlciwKKwkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKIAkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXRoaXMobnVsbCwgdHlwZURlY2xhcmF0aW9uLCAxLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKKwkJdGhpcyhudWxsLCB0eXBlRGVjbGFyYXRpb24sIDEsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKIAl9CiAKIAkvKioKQEAgLTU5LDggKzYxLDggQEAKIAkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sICAvLyBleGNsdWRlIGFubm90YXRpb25zIGFuZCBlbnVtcwogCQkJaW50IG9jY3VycmVuY2UsCiAJCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIpIHsKLQkJdGhpcyhkZWNsYXJpbmdUeXBlLCB0eXBlRGVjbGFyYXRpb24sIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOworCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7CisJCXRoaXMoZGVjbGFyaW5nVHlwZSwgdHlwZURlY2xhcmF0aW9uLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7CiAJfQogCiAJLyoqCkBAIC03MSwyMyArNzMsMjQgQEAKIAkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sICAvLyBleGNsdWRlIGFubm90YXRpb25zIGFuZCBlbnVtcwogCQkJaW50IG9jY3VycmVuY2UsCiAJCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsCisJCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsCiAJCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlzdXBlcihkZWNsYXJpbmdUeXBlLCB0eXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKKwkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgdHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwogCX0KIAogCS8qKgogCSAqIGNvbnN0cnVjdG9yIGZvciB0ZXN0aW5nCiAJICovCiAJcHVibGljIEpEVFR5cGUoVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbmFtZSwgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCXN1cGVyKGRlY2xhcmluZ1R5cGUsIG5hbWUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIuRGVmYXVsdC5pbnN0YW5jZSgpLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7CisJCXN1cGVyKGRlY2xhcmluZ1R5cGUsIG5hbWUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKSwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwogCX0KIAogCiAJLy8gKioqKioqKioqKiBNZW1iZXIvVHlwZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCiAKIAlwdWJsaWMgSVR5cGVCaW5kaW5nIGdldEJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpLnJlc29sdmVCaW5kaW5nKCk7CisJCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpOworCQlyZXR1cm4gKHRkID09IG51bGwpID8gbnVsbCA6IHRkLnJlc29sdmVCaW5kaW5nKCk7CiAJfQogCiAJLyoqCkBAIC0xMDMsNyArMTA2LDcgQEAKIAogCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKIAkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmdldEJpbmRpbmcoYXN0Um9vdCk7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogSlBUVG9vbHMudHlwZUlzUGVyc2lzdGFibGUoYmluZGluZyk7CisJCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogSlBUVG9vbHMudHlwZUlzUGVyc2lzdGFibGUobmV3IEpQVFRvb2xzQWRhcHRlcihiaW5kaW5nKSk7CiAJfQogCiAJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CkBAIC0xMzIsOCArMTM1LDggQEAKIAkJcmV0dXJuIHRoaXMuZ2V0VHlwZURlY2xhcmF0aW9uKHR5cGVzKGFzdFJvb3QpKTsKIAl9CiAKLQlwcm90ZWN0ZWQgVHlwZURlY2xhcmF0aW9uIGdldFR5cGVEZWNsYXJhdGlvbihMaXN0PFR5cGVEZWNsYXJhdGlvbj4gdHlwZURlY2xhcmF0aW9ucykgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9ucy50b0FycmF5KG5ldyBUeXBlRGVjbGFyYXRpb25bdHlwZURlY2xhcmF0aW9ucy5zaXplKCldKSk7CisJcHJvdGVjdGVkIFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gdHlwZURlY2xhcmF0aW9ucykgeworCQlyZXR1cm4gdGhpcy5nZXRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9ucy50b0FycmF5KG5ldyBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvblt0eXBlRGVjbGFyYXRpb25zLnNpemUoKV0pKTsKIAl9CiAKIAkvKioKQEAgLTE0NywxNSArMTUwLDE1IEBACiAJICogcmV0dXJuIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgZnJvbSB0aGUgc3BlY2lmaWVkCiAJICogc2V0IG9mIHR5cGUgZGVjbGFyYXRpb25zIChtYXRjaCBuYW1lIGFuZCBvY2N1cnJlbmNlKQogCSAqLwotCXByb3RlY3RlZCBUeXBlRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uKFR5cGVEZWNsYXJhdGlvbltdIHR5cGVEZWNsYXJhdGlvbnMpIHsKKwlwcm90ZWN0ZWQgVHlwZURlY2xhcmF0aW9uIGdldFR5cGVEZWNsYXJhdGlvbihBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbltdIHR5cGVEZWNsYXJhdGlvbnMpIHsKIAkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWVfKCk7CiAJCWludCBvY2N1cnJlbmNlID0gdGhpcy5nZXRPY2N1cnJlbmNlKCk7CiAJCWludCBjb3VudCA9IDA7Ci0JCWZvciAoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA6IHR5cGVEZWNsYXJhdGlvbnMpIHsKKwkJZm9yIChBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gOiB0eXBlRGVjbGFyYXRpb25zKSB7CiAJCQlpZiAodHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKIAkJCQljb3VudCsrOwogCQkJCWlmIChjb3VudCA9PSBvY2N1cnJlbmNlKSB7Ci0JCQkJCXJldHVybiB0eXBlRGVjbGFyYXRpb247CisJCQkJCXJldHVybiAodHlwZURlY2xhcmF0aW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OKSA/IChUeXBlRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbiA6IG51bGw7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0xNjYsMTAgKzE2OSw2OCBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAKKwkvKioKKwkgKiB3ZSBvbmx5IGluc3RhbnRpYXRlIGEgc2luZ2xlIHRvcC1sZXZlbCwgbm9uLWVudW0sIG5vbi1hbm5vdGF0aW9uCisJICogdHlwZSBwZXIgY29tcGlsYXRpb24gdW5pdCAoaS5lLiBhIGNsYXNzIG9yIGludGVyZmFjZSk7IGFuZCwgc2luY2UKKwkgKiBlbnVtcyBhbmQgYW5ub3RhdGlvbnMgY2FuIG9ubHkgYmUgdG9wLWxldmVsIHR5cGVzIChpLmUuIHRoZXkgY2Fubm90CisJICogYmUgbmVzdGVkIHdpdGhpbiBhbm90aGVyIHR5cGUpIHdlIHdpbGwgYWx3YXlzIGhhdmUgVHlwZURlY2xhcmF0aW9ucworCSAqIGluIHRoZSBDb21waWxhdGlvblVuaXQKKwkgKi8KIAkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0PFR5cGVEZWNsYXJhdGlvbj4gdHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwlwcm90ZWN0ZWQgc3RhdGljIExpc3Q8QWJzdHJhY3RUeXBlRGVjbGFyYXRpb24+IHR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CiAJCXJldHVybiBhc3RSb290LnR5cGVzKCk7CiAJfQogCisKKwkvLyAqKioqKioqKioqIEpQVCB0b29scyBhZGFwdGVyICoqKioqKioqKioKKworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSlBUVG9vbHNBZGFwdGVyIGltcGxlbWVudHMgSlBUVG9vbHMuVHlwZUFkYXB0ZXIgeworCQlwcml2YXRlIGZpbmFsIElUeXBlQmluZGluZyB0eXBlQmluZGluZzsKKwkJcHJvdGVjdGVkIEpQVFRvb2xzQWRhcHRlcihJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKKwkJCXN1cGVyKCk7CisJCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQkJfQorCQkJdGhpcy50eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nOworCQl9CisKKwkJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisJCQlyZXR1cm4gdGhpcy50eXBlQmluZGluZy5nZXRNb2RpZmllcnMoKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvbigpIHsKKwkJCXJldHVybiB0aGlzLnR5cGVCaW5kaW5nLmlzQW5ub3RhdGlvbigpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNBbm9ueW1vdXMoKSB7CisJCQlyZXR1cm4gdGhpcy50eXBlQmluZGluZy5pc0Fub255bW91cygpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKKwkJCXJldHVybiB0aGlzLnR5cGVCaW5kaW5nLmlzQXJyYXkoKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzRW51bSgpIHsKKwkJCXJldHVybiB0aGlzLnR5cGVCaW5kaW5nLmlzRW51bSgpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7CisJCQlyZXR1cm4gdGhpcy50eXBlQmluZGluZy5pc0ludGVyZmFjZSgpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNMb2NhbCgpIHsKKwkJCXJldHVybiB0aGlzLnR5cGVCaW5kaW5nLmlzTG9jYWwoKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzTWVtYmVyKCkgeworCQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmcuaXNNZW1iZXIoKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgeworCQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmcuaXNQcmltaXRpdmUoKTsKKwkJfQorCQorCX0KKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pQVFRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSlBUVG9vbHMuamF2YQppbmRleCBkY2FlZDA0Li40YWIwZTg4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSlBUVG9vbHMuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSlBUVG9vbHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDIwICs5LDg1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JTWV0aG9kQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVmFyaWFibGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogCisvKioKKyAqIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIEpQQS1yZWxhdGVkIHF1ZXJpZXMgY29uY2VybmluZyBKRFQgb2JqZWN0cy4KKyAqLwogcHVibGljIGNsYXNzIEpQVFRvb2xzIHsKIAorCS8vICoqKioqKioqKiogdHlwZSAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgY2FuIGJlICJwZXJzaXN0ZWQiLCBpLmUuIG1hcmtlZCBhcworCSAqIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcywgRW1iZWRkYWJsZQorCSAqLworCS8vIFRPRE8gY2hlY2sgZm9yIG5vLWFyZyBjb25zdHJ1Y3RvciAob3Igc2hvdWxkIHRoYXQganVzdCBiZSB2YWxpZGF0aW9uPykKKwkvLyBUT0RPIG1vdmUgb3RoZXIgY2hlY2tzIHRvIHZhbGlkYXRpb24gKGUuZy4gJ2ZpbmFsJywgJ3N0YXRpYycpPworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0eXBlSXNQZXJzaXN0YWJsZShUeXBlQWRhcHRlciB0eXBlQWRhcHRlcikgeworCQlpZiAodHlwZUFkYXB0ZXIuaXNJbnRlcmZhY2UoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICh0eXBlQWRhcHRlci5pc0Fubm90YXRpb24oKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICh0eXBlQWRhcHRlci5pc0VudW0oKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICh0eXBlQWRhcHRlci5pc0xvY2FsKCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAodHlwZUFkYXB0ZXIuaXNBbm9ueW1vdXMoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICh0eXBlQWRhcHRlci5pc1ByaW1pdGl2ZSgpKSB7CisJCQlyZXR1cm4gZmFsc2U7ICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUoPykKKwkJfQorCQlpZiAodHlwZUFkYXB0ZXIuaXNBcnJheSgpKSB7CisJCQlyZXR1cm4gZmFsc2U7ICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUoPykKKwkJfQorCQlpbnQgbW9kaWZpZXJzID0gdHlwZUFkYXB0ZXIuZ2V0TW9kaWZpZXJzKCk7CisJCWlmIChNb2RpZmllci5pc0ZpbmFsKG1vZGlmaWVycykpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAodHlwZUFkYXB0ZXIuaXNNZW1iZXIoKSkgeworCQkJaWYgKCAhIE1vZGlmaWVyLmlzU3RhdGljKG1vZGlmaWVycykpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogUXVlcmllcyBuZWVkZWQgdG8gY2FsY3VsYXRlIHdoZXRoZXIgYSB0eXBlIGlzICJwZXJzaXN0YWJsZSIuCisJICogQWRhcHRlZCB0byBJVHlwZUJpbmRpbmcgYW5kIElUeXBlLgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgVHlwZUFkYXB0ZXIgeworCQlpbnQgZ2V0TW9kaWZpZXJzKCk7CisJCWJvb2xlYW4gaXNBbm5vdGF0aW9uKCk7CisJCWJvb2xlYW4gaXNBbm9ueW1vdXMoKTsKKwkJYm9vbGVhbiBpc0FycmF5KCk7CisJCWJvb2xlYW4gaXNFbnVtKCk7CisJCWJvb2xlYW4gaXNJbnRlcmZhY2UoKTsKKwkJYm9vbGVhbiBpc0xvY2FsKCk7CisJCWJvb2xlYW4gaXNNZW1iZXIoKTsKKwkJYm9vbGVhbiBpc1ByaW1pdGl2ZSgpOworCX0KKworCisJLy8gKioqKioqKioqKiBmaWVsZCAqKioqKioqKioqCisKIAkvKioKIAkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpZWxkIG1heSBiZSAicGVyc2lzdGVkIi4KIAkgKiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsICJBbGwgbm9uLXRyYW5zaWVudCBpbnN0YW5jZSB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IAogCSAqIGFubm90YXRlZCB3aXRoIHRoZSBUcmFuc2llbnQgYW5ub3RhdGlvbiBhcmUgcGVyc2lzdGVudC4iCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpZWxkSXNQZXJzaXN0YWJsZShJVmFyaWFibGVCaW5kaW5nIGZpZWxkKSB7Ci0JCWludCBtb2RpZmllcnMgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmllbGRJc1BlcnNpc3RhYmxlKEZpZWxkQWRhcHRlciBmaWVsZEFkYXB0ZXIpIHsKKwkJaW50IG1vZGlmaWVycyA9IGZpZWxkQWRhcHRlci5nZXRNb2RpZmllcnMoKTsKIAkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKG1vZGlmaWVycykpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpAQCAtMzMsMTA3ICs5OCw4MCBAQAogCX0KIAogCS8qKgorCSAqIFF1ZXJpZXMgbmVlZGVkIHRvIGNhbGN1bGF0ZSB3aGV0aGVyIGEgZmllbGQgaXMgInBlcnNpc3RhYmxlIi4KKwkgKiBBZGFwdGVkIHRvIElWYXJpYWJsZUJpbmRpbmcgYW5kIElGaWVsZC4KKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIEZpZWxkQWRhcHRlciB7CisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIGZpZWxkJ3MgbW9kaWZpZXJzLiBXZSB1c2UgdGhlc2UgdG8gY2hlY2sgd2hldGhlciB0aGUKKwkJICogZmllbGQgaXMgc3RhdGljIG9yIHRyYW5zaWVudC4KKwkJICovCisJCWludCBnZXRNb2RpZmllcnMoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogbWV0aG9kICoqKioqKioqKioKKworCS8qKgogCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGlzIGEgImdldHRlciIgbWV0aG9kIHRoYXQKIAkgKiByZXByZXNlbnRzIGEgcHJvcGVydHkgdGhhdCBtYXkgYmUgInBlcnNpc3RlZCIuCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7Ci0JCWlmIChtZXRob2RIYXNCYWRNb2RpZmllcnMobWV0aG9kQmluZGluZykpIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKE1ldGhvZEFkYXB0ZXIgbWV0aG9kQWRhcHRlcikgeworCQlpZiAobWV0aG9kSGFzSW52YWxpZE1vZGlmaWVycyhtZXRob2RBZGFwdGVyKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChtZXRob2RBZGFwdGVyLmlzQ29uc3RydWN0b3IoKSkgewogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKLQkJSVR5cGVCaW5kaW5nIHJldHVyblR5cGUgPSBtZXRob2RCaW5kaW5nLmdldFJldHVyblR5cGUoKTsKLQkJaWYgKHJldHVyblR5cGUgPT0gbnVsbCkgeworCQlTdHJpbmcgcmV0dXJuVHlwZU5hbWUgPSBtZXRob2RBZGFwdGVyLmdldFJldHVyblR5cGVFcmFzdXJlTmFtZSgpOworCQlpZiAocmV0dXJuVHlwZU5hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOyAgLy8gRE9NIG1ldGhvZCBiaW5kaW5ncyBjYW4gaGF2ZSBhIG51bGwgbmFtZQorCQl9CisJCWlmIChyZXR1cm5UeXBlTmFtZS5lcXVhbHMoInZvaWQiKSkgeyAvLyROT04tTkxTLTEkCiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQkJU3RyaW5nIHJldHVyblR5cGVOYW1lID0gcmV0dXJuVHlwZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCWlmIChyZXR1cm5UeXBlTmFtZS5lcXVhbHMoInZvaWQiKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChtZXRob2RCaW5kaW5nLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoICE9IDApIHsKKwkJaWYgKG1ldGhvZEhhc1BhcmFtZXRlcnMobWV0aG9kQWRhcHRlcikpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCi0JCVN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kQmluZGluZy5nZXROYW1lKCk7CisJCVN0cmluZyBuYW1lID0gbWV0aG9kQWRhcHRlci5nZXROYW1lKCk7CiAJCWludCBiZWdpbkluZGV4ID0gMDsKIAkJYm9vbGVhbiBib29sZWFuR2V0dGVyID0gZmFsc2U7Ci0JCWlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImlzIikpIHsKLQkJCWlmIChyZXR1cm5UeXBlTmFtZS5lcXVhbHMoImJvb2xlYW4iKSkgeworCQlpZiAobmFtZS5zdGFydHNXaXRoKCJpcyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChyZXR1cm5UeXBlTmFtZS5lcXVhbHMoImJvb2xlYW4iKSkgeyAvLyROT04tTkxTLTEkCiAJCQkJYmVnaW5JbmRleCA9IDI7CiAJCQl9IGVsc2UgewogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImdldCIpKSB7Ci0JCQkJYmVnaW5JbmRleCA9IDM7Ci0JCQkJaWYgKHJldHVyblR5cGVOYW1lLmVxdWFscygiYm9vbGVhbiIpKSB7Ci0JCQkJCWJvb2xlYW5HZXR0ZXIgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgiZ2V0IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJYmVnaW5JbmRleCA9IDM7CisJCQlpZiAocmV0dXJuVHlwZU5hbWUuZXF1YWxzKCJib29sZWFuIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWJvb2xlYW5HZXR0ZXIgPSB0cnVlOwogCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKLQkJU3RyaW5nIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKGJlZ2luSW5kZXgpOworCQlTdHJpbmcgY2FwaXRhbGl6ZWRBdHRyaWJ1dGVOYW1lID0gbmFtZS5zdWJzdHJpbmcoYmVnaW5JbmRleCk7CiAJCS8vIGlmIHRoZSB0eXBlIGhhcyBib3RoIG1ldGhvZHM6CiAJCS8vICAgICBib29sZWFuIGlzUHJvcGVydHkoKQogCQkvLyAgICAgYm9vbGVhbiBnZXRQcm9wZXJ0eSgpCi0JCS8vIHRoZW4gI2lzUHJvcGVydHkoKSB0YWtlcyBwcmVjZWRlbmNlIGFuZCB3ZSBpZ25vcmUgI2dldFByb3BlcnR5KCkKKwkJLy8gdGhlbiAjaXNQcm9wZXJ0eSgpIHRha2VzIHByZWNlZGVuY2UgYW5kIHdlIGlnbm9yZSAjZ2V0UHJvcGVydHkoKTsKKwkJLy8gYnV0IG9ubHkgaGF2aW5nICNnZXRQcm9wZXJ0eSgpIGlzIE9LIHRvbwogCQkvLyAoc2VlIHRoZSBKYXZhQmVhbnMgc3BlYyAxLjAxKQotCQlpZiAoYm9vbGVhbkdldHRlcikgewotCQkJSU1ldGhvZEJpbmRpbmcgaXNNZXRob2QgPSBtZXRob2RCaW5kaW5nTm9QYXJhbWV0ZXJzKG1ldGhvZEJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgImlzIiArIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAoaXNNZXRob2QgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChpc01ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpLmVxdWFscygiYm9vbGVhbiIpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQorCQlpZiAoYm9vbGVhbkdldHRlciAmJiBtZXRob2RIYXNWYWxpZFNpYmxpbmdJc01ldGhvZChtZXRob2RBZGFwdGVyLCBjYXBpdGFsaXplZEF0dHJpYnV0ZU5hbWUpKSB7CisJCQlyZXR1cm4gZmFsc2U7ICAvLyBzaW5jZSB0aGUgdHlwZSBhbHNvIGRlZmluZXMgI2lzUHJvcGVydHkoKSwgaWdub3JlICNnZXRQcm9wZXJ0eSgpCiAJCX0KLQkJSU1ldGhvZEJpbmRpbmcgc2V0TWV0aG9kID0gbWV0aG9kQmluZGluZ09uZVBhcmFtZXRlcihtZXRob2RCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCksICJzZXQiICsgY2FwaXRhbGl6ZWRBdHRyaWJ1dGVOYW1lLCByZXR1cm5UeXBlTmFtZSk7Ci0JCWlmIChzZXRNZXRob2QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChtZXRob2RIYXNCYWRNb2RpZmllcnMoc2V0TWV0aG9kKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICggISBzZXRNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nTm9QYXJhbWV0ZXJzKElUeXBlQmluZGluZyB0eXBlQmluZGluZywgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJZm9yIChJTWV0aG9kQmluZGluZyBtZXRob2QgOiB0eXBlQmluZGluZy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgewotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7Ci0JCQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCXJldHVybiBtZXRob2Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nT25lUGFyYW1ldGVyKElUeXBlQmluZGluZyB0eXBlQmluZGluZywgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBwYXJhbWV0ZXJUeXBlTmFtZSkgewotCQlmb3IgKElNZXRob2RCaW5kaW5nIG1ldGhvZCA6IHR5cGVCaW5kaW5nLmdldERlY2xhcmVkTWV0aG9kcygpKSB7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpIHsKLQkJCQlpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDEpIHsKLQkJCQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMocGFyYW1ldGVyVHlwZU5hbWUpKSB7Ci0JCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOworCQlyZXR1cm4gbWV0aG9kSGFzVmFsaWRTaWJsaW5nU2V0TWV0aG9kKG1ldGhvZEFkYXB0ZXIsIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSwgcmV0dXJuVHlwZU5hbWUpOwogCX0KIAogCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWV0aG9kJ3MgbW9kaWZpZXJzIHByZXZlbnQgaXQKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWV0aG9kJ3MgbW9kaWZpZXJzIHByZXZlbnQgaXQKIAkgKiBmcm9tIGJlaW5nIGEgZ2V0dGVyIG9yIHNldHRlciBmb3IgYSAicGVyc2lzdGVudCIgcHJvcGVydHkuCiAJICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtZXRob2RIYXNCYWRNb2RpZmllcnMoSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewotCQlpZiAobWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWludCBtb2RpZmllcnMgPSBtZXRob2RCaW5kaW5nLmdldE1vZGlmaWVycygpOworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kSGFzSW52YWxpZE1vZGlmaWVycyhTaW1wbGVNZXRob2RBZGFwdGVyIG1ldGhvZEFkYXB0ZXIpIHsKKwkJaW50IG1vZGlmaWVycyA9IG1ldGhvZEFkYXB0ZXIuZ2V0TW9kaWZpZXJzKCk7CiAJCWlmIChNb2RpZmllci5pc1N0YXRpYyhtb2RpZmllcnMpKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQpAQCAtMTQ1LDM4ICsxODMsMTYyIEBACiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KLQkKKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kSGFzUGFyYW1ldGVycyhNZXRob2RBZGFwdGVyIG1ldGhvZEFkYXB0ZXIpIHsKKwkJcmV0dXJuIG1ldGhvZEFkYXB0ZXIuZ2V0UGFyYW1ldGVyc0xlbmd0aCgpICE9IDA7CisJfQorCiAJLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgbWF5IGJlICJwZXJzaXN0ZWQiLCBpZSBtYXJrZWQgYXMgRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzLCBFbWJlZGRhYmxlCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIG1ldGhvZCBoYXMgYSBzaWJsaW5nICJpcyIgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkCisJICogcHJvcGVydHkgYW5kIHRoYXQgbWV0aG9kIGlzIHZhbGlkIGZvciBhICJwZXJzaXN0YWJsZSIgcHJvcGVydHkuCisJICogUHJlLWNvbmRpdGlvbjogdGhlIG1ldGhvZCBpcyBhICJib29sZWFuIGdldHRlciIgKGUuZy4gJ3B1YmxpYyBib29sZWFuIGdldFByb3BlcnR5KCknKTsKKwkgKiB0aGlzIHByZXZlbnRzIHVzIGZyb20gcmV0dXJuaW5nIHRydWUgd2hlbiB0aGUgbWV0aG9kIGl0c2VsZiBpcyBhbgorCSAqICJpcyIgbWV0aG9kLgogCSAqLwotCS8vVE9ETyBzaG91bGQgcGVyc2lzdGFiaWxpdHkgYmUgZGVwZW5kZW50IG9uIGhhdmluZyBhIG5vLWFyZyBjb25zdHJ1Y3RvciBvciBzaG91bGQgdGhhdCBqdXN0IGJlIHZhbGlkYXRpb24/Ci0JLy9zZWVtcyBsaWtlIGZpbmFsLCBvciBhIG1lbWJlciB0eXBlIGJlaW5nIHN0YXRpYyBjb3VsZCBiZSBkZWFsdCB3aXRoIHRocm91Z2ggdmFsaWRhdGlvbiBpbnN0ZWFkIG9mIGZpbHRlcmluZyB0aGVtIG91dC4KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUlzUGVyc2lzdGFibGUoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0JCWlmICh0eXBlQmluZGluZy5pc0ludGVyZmFjZSgpKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtZXRob2RIYXNWYWxpZFNpYmxpbmdJc01ldGhvZChNZXRob2RBZGFwdGVyIG1ldGhvZEFkYXB0ZXIsIFN0cmluZyBjYXBpdGFsaXplZEF0dHJpYnV0ZU5hbWUpIHsKKwkJU2ltcGxlTWV0aG9kQWRhcHRlciBpc01ldGhvZEFkYXB0ZXIgPSBtZXRob2RBZGFwdGVyLmdldFNpYmxpbmcoImlzIiArIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIG1ldGhvZElzVmFsaWRTaWJsaW5nKGlzTWV0aG9kQWRhcHRlciwgImJvb2xlYW4iKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZXRob2QgaGFzIGEgc2libGluZyAic2V0IiBtZXRob2QKKwkgKiBhbmQgdGhhdCBtZXRob2QgaXMgdmFsaWQgZm9yIGEgInBlcnNpc3RhYmxlIiBwcm9wZXJ0eS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1ldGhvZEhhc1ZhbGlkU2libGluZ1NldE1ldGhvZChNZXRob2RBZGFwdGVyIG1ldGhvZEFkYXB0ZXIsIFN0cmluZyBjYXBpdGFsaXplZEF0dHJpYnV0ZU5hbWUsIFN0cmluZyBwYXJhbWV0ZXJUeXBlRXJhc3VyZU5hbWUpIHsKKwkJU2ltcGxlTWV0aG9kQWRhcHRlciBzZXRNZXRob2RBZGFwdGVyID0gbWV0aG9kQWRhcHRlci5nZXRTaWJsaW5nKCJzZXQiICsgY2FwaXRhbGl6ZWRBdHRyaWJ1dGVOYW1lLCBwYXJhbWV0ZXJUeXBlRXJhc3VyZU5hbWUpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBtZXRob2RJc1ZhbGlkU2libGluZyhzZXRNZXRob2RBZGFwdGVyLCAidm9pZCIpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtZXRob2QgaXMgYSB2YWxpZCBzaWJsaW5nIHdpdGggdGhlCisJICogc3BlY2lmaWVkIHJldHVybiB0eXBlLgorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kSXNWYWxpZFNpYmxpbmcoU2ltcGxlTWV0aG9kQWRhcHRlciBtZXRob2RBZGFwdGVyLCBTdHJpbmcgcmV0dXJuVHlwZU5hbWUpIHsKKwkJaWYgKG1ldGhvZEFkYXB0ZXIgPT0gbnVsbCkgewogCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0JCWlmICh0eXBlQmluZGluZy5pc0Fubm90YXRpb24oKSkgeworCQlpZiAobWV0aG9kSGFzSW52YWxpZE1vZGlmaWVycyhtZXRob2RBZGFwdGVyKSkgewogCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0JCWlmICh0eXBlQmluZGluZy5pc0VudW0oKSkgeworCQlpZiAobWV0aG9kQWRhcHRlci5pc0NvbnN0cnVjdG9yKCkpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQlpZiAodHlwZUJpbmRpbmcuaXNMb2NhbCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CisJCVN0cmluZyBydE5hbWUgPSBtZXRob2RBZGFwdGVyLmdldFJldHVyblR5cGVFcmFzdXJlTmFtZSgpOworCQlpZiAocnROYW1lID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsgIC8vIERPTSBtZXRob2QgYmluZGluZ3MgY2FuIGhhdmUgYSBudWxsIG5hbWUKIAkJfQotCQlpZiAodHlwZUJpbmRpbmcuaXNBbm9ueW1vdXMoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBtb2RpZmllcnMgPSB0eXBlQmluZGluZy5nZXRNb2RpZmllcnMoKTsKLQkJaWYgKE1vZGlmaWVyLmlzRmluYWwobW9kaWZpZXJzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICh0eXBlQmluZGluZy5pc01lbWJlcigpKSB7Ci0JCQlpZiAoIU1vZGlmaWVyLmlzU3RhdGljKG1vZGlmaWVycykpIHsKLQkJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBydE5hbWUuZXF1YWxzKHJldHVyblR5cGVOYW1lKTsKKwl9CisKKwkvKioKKwkgKiBRdWVyaWVzIG5lZWRlZCB0byBjYWxjdWxhdGUgd2hldGhlciBhIG1ldGhvZCBpcyAicGVyc2lzdGFibGUiLgorCSAqIEFkYXB0ZWQgdG8gSU1ldGhvZEJpbmRpbmcgYW5kIElNZXRob2QuCisJICovCisJcHVibGljIGludGVyZmFjZSBTaW1wbGVNZXRob2RBZGFwdGVyIHsKKwkJLyoqCisJCSAqIFJldHVybiB0aGUgbWV0aG9kJ3MgbW9kaWZpZXJzLgorCQkgKiBXZSB1c2UgdGhlc2UgdG8gY2hlY2sgd2hldGhlciB0aGUgbWV0aG9kIGlzIHN0YXRpYywgZmluYWwsIGV0Yy4KKwkJICovCisJCWludCBnZXRNb2RpZmllcnMoKTsKKworCQkvKioKKwkJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QncyByZXR1cm4gdHlwZSBlcmFzdXJlLgorCQkgKiBXZSB1c2UgdGhpcyB0byBjaGVjayBmb3IKKwkJICogICAtIGJvb2xlYW4gZ2V0dGVycworCQkgKiAgIC0gdm9pZCByZXR1cm4gdHlwZXMKKwkJICogICAtIG1hdGNoaW5nIGdldHRlcnMgYW5kIHNldHRlcnMKKwkJICovCisJCVN0cmluZyBnZXRSZXR1cm5UeXBlRXJhc3VyZU5hbWUoKTsKKworCQkvKioKKwkJICogUmV0dXJuIHdoZXRoZXIgdGhlIG1ldGhvZCBpcyBhIGNvbnN0cnVjdG9yLgorCQkgKi8KKwkJYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCk7CisJfQorCisJLyoqCisJICogUXVlcmllcyBuZWVkZWQgdG8gY2FsY3VsYXRlIHdoZXRoZXIgYSBtZXRob2QgaXMgInBlcnNpc3RhYmxlIi4KKwkgKiBBZGFwdGVkIHRvIElNZXRob2RCaW5kaW5nIGFuZCBJTWV0aG9kLgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kQWRhcHRlciBleHRlbmRzIFNpbXBsZU1ldGhvZEFkYXB0ZXIgeworCQkvKioKKwkJICogUmV0dXJuIHRoZSBtZXRob2QncyBuYW1lLgorCQkgKiBXZSB1c2UgdGhpcyB0byBkZXRlcm1pbmUKKwkJICogICAtIHdoZXRoZXIgdGhlIG1ldGhvZCBpcyBhICJnZXR0ZXIiCisJCSAqICAgLSB0aGUgcHJvcGVydHkgbmFtZSBpbXBsaWVkIGJ5IHRoZSBnZXR0ZXIncyBuYW1lCisJCSAqLworCQlTdHJpbmcgZ2V0TmFtZSgpOworCisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYXJhbXRlcnMgZGVjbGFyZWQgYnkgdGhlIG1ldGhvZC4KKwkJICogV2UgdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG1ldGhvZCBpcyBhICJnZXR0ZXIiLgorCQkgKi8KKwkJaW50IGdldFBhcmFtZXRlcnNMZW5ndGgoKTsKKworCQkvKioKKwkJICogUmV0dXJuIHRoZSBtZXRob2QncyAic2libGluZyIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIG5vIHBhcmFtZXRlcnMuCisJCSAqIFdlIHVzZSB0aGlzIHRvIGZpbmQgYW4gImlzIiBib29sZWFuIGdldHRlciB0aGF0IHdvdWxkIHRha2UgcHJlY2VkZW5jZQorCQkgKiBvdmVyIGEgImdldCIgYm9vbGVhbiBnZXR0ZXIuCisJCSAqLworCQlTaW1wbGVNZXRob2RBZGFwdGVyIGdldFNpYmxpbmcoU3RyaW5nIG5hbWUpOworCisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIG1ldGhvZCdzICJzaWJsaW5nIiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgc2luZ2xlIHBhcmFtZXRlci4KKwkJICogV2UgdXNlIHRoaXMgdG8gZmluZCBhIG1hdGNoaW5nICJzZXR0ZXIiIGZvciBhIHBvc3NpYmxlICJnZXR0ZXIiLgorCQkgKi8KKwkJU2ltcGxlTWV0aG9kQWRhcHRlciBnZXRTaWJsaW5nKFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyYW1ldGVyVHlwZUVyYXN1cmVOYW1lKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQWNjZXNzIHR5cGUgKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIHRoZSBBY2Nlc3NUeXBlIGN1cnJlbnRseSBpbXBsaWVkIGJ5IHRoZSBKYXZhIHNvdXJjZSBjb2RlCisJICogb3IgY2xhc3MgZmlsZToKKwkgKiAgICAgLSBpZiBvbmx5IEZpZWxkcyBhcmUgYW5ub3RhdGVkID0+IEZJRUxECisJICogICAgIC0gaWYgb25seSBQcm9wZXJ0aWVzIGFyZSBhbm5vdGF0ZWQgPT4gUFJPUEVSVFkKKwkgKiAgICAgLSBpZiBib3RoIEZpZWxkcyBhbmQgUHJvcGVydGllcyBhcmUgYW5ub3RhdGVkID0+IEZJRUxECisJICogICAgIC0gaWYgbm90aGluZyBpcyBhbm5vdGF0ZWQKKwkgKiAgICAgCQktIGFuZCBmaWVsZHMgZXhpc3QgPT4gRklFTEQKKwkgKiAgICAgCQktIGFuZCBwcm9wZXJ0aWVzIGV4aXN0LCBidXQgbm8gZmllbGRzIGV4aXN0ID0+IFBST1BFUlRZCisJICogICAgIAkJLSBhbmQgbmVpdGhlciBmaWVsZHMgbm9yIHByb3BlcnRpZXMgZXhpc3QgPT4gbnVsbCBhdCB0aGlzIGxldmVsIChGSUVMRCBpbiB0aGUgY29udGV4dCBtb2RlbCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFjY2Vzc1R5cGUgYnVpbGRBY2Nlc3MoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwVHlwZSkgeworCQlib29sZWFuIGhhc1BlcnNpc3RhYmxlRmllbGRzID0gZmFsc2U7CisJCWZvciAoSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0ganJwVHlwZS5wZXJzaXN0YWJsZUZpZWxkcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCWhhc1BlcnNpc3RhYmxlRmllbGRzID0gdHJ1ZTsKKwkJCWlmIChzdHJlYW0ubmV4dCgpLmlzQW5ub3RhdGVkKCkpIHsKKwkJCQkvLyBhbnkgZmllbGQgaXMgYW5ub3RhdGVkID0+IEZJRUxECisJCQkJcmV0dXJuIEFjY2Vzc1R5cGUuRklFTEQ7CiAJCQl9CiAJCX0KLQkJcmV0dXJuIHRydWU7CisKKwkJYm9vbGVhbiBoYXNQZXJzaXN0YWJsZVByb3BlcnRpZXMgPSBmYWxzZTsKKwkJZm9yIChJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBqcnBUeXBlLnBlcnNpc3RhYmxlUHJvcGVydGllcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCWhhc1BlcnNpc3RhYmxlUHJvcGVydGllcyA9IHRydWU7CisJCQlpZiAoc3RyZWFtLm5leHQoKS5pc0Fubm90YXRlZCgpKSB7CisJCQkJLy8gbm9uZSBvZiB0aGUgZmllbGRzIGFyZSBhbm5vdGF0ZWQgYW5kIGEgZ2V0dGVyIGlzIGFubm90YXRlZCA9PiBQUk9QRVJUWQorCQkJCXJldHVybiBBY2Nlc3NUeXBlLlBST1BFUlRZOworCQkJfQorCQl9CisKKwkJaWYgKGhhc1BlcnNpc3RhYmxlUHJvcGVydGllcyAmJiAhIGhhc1BlcnNpc3RhYmxlRmllbGRzKSB7CisJCQlyZXR1cm4gQWNjZXNzVHlwZS5QUk9QRVJUWTsKKwkJfQorCisJCS8vIGlmIG5vIGFubm90YXRpb25zIGV4aXN0LCBhY2Nlc3MgaXMgbnVsbCBhdCB0aGUgcmVzb3VyY2UgbW9kZWwgbGV2ZWwKKwkJcmV0dXJuIG51bGw7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN1cHByZXNzZWQgY29uc3RydWN0b3IgKioqKioqKioqKgorCisJLyoqCisJICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KKwkgKi8KKwlwcml2YXRlIEpQVFRvb2xzKCkgeworCQlzdXBlcigpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKaW5kZXggN2UwMzU5MS4uOGYzOTQ4NSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKQEAgLTE4MSw3ICsxODEsNyBAQAogCSAqLwogCXByaXZhdGUgdm9pZCBhZGRJbm5lclRvRXhwcmVzc2lvbnMoQW5ub3RhdGlvbiBpbm5lciwgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucykgewogCQlpZiAoZXhwcmVzc2lvbnMuc2l6ZSgpID4gdGhpcy5pbmRleCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZXhwcmVzc2lvbnMgc2l6ZSBpcyBncmVhdGVyIHRoYW4gaW5kZXggLSBzaXplOiAiICsgZXhwcmVzc2lvbnMuc2l6ZSgpICsgIiAtIGluZGV4OiAiICsgdGhpcy5pbmRleCk7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJleHByZXNzaW9ucyBzaXplIGlzIGdyZWF0ZXIgdGhhbiBpbmRleCAtIHNpemU6ICIgKyBleHByZXNzaW9ucy5zaXplKCkgKyAiIC0gaW5kZXg6ICIgKyB0aGlzLmluZGV4KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KIAkJd2hpbGUgKGV4cHJlc3Npb25zLnNpemUoKSA8IHRoaXMuaW5kZXgpIHsKIAkJCWV4cHJlc3Npb25zLmFkZChpbm5lci5nZXRBU1QoKS5uZXdOdWxsTGl0ZXJhbCgpKTsKQEAgLTI1Myw3ICsyNTMsNyBAQAogCQl9IGVsc2UgaWYgKG91dGVyLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7CiAJCQkoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIG91dGVyKS5zZXRWYWx1ZShsYXN0VmFsdWUpOwogCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5leHBlY3RlZCBhbm5vdGF0aW9uIHR5cGU6ICIgKyBvdXRlcik7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGFubm90YXRpb24gdHlwZTogIiArIG91dGVyKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfQogCkBAIC0zMTQsNyArMzE0LDcgQEAKIAkJfQogCQlAT3ZlcnJpZGUKIAkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiTWVtYmVyVmFsdWVQYWlyRXhwcmVzc2lvblByb3ZpZGVyIjsKKwkJCXJldHVybiAiTWVtYmVyVmFsdWVQYWlyRXhwcmVzc2lvblByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfTsKIApAQCAtMzI3LDcgKzMyNyw3IEBACiAJCX0KIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlNpbmdsZU1lbWJlckFubm90YXRpb25FeHByZXNzaW9uUHJvdmlkZXIiOworCQkJcmV0dXJuICJTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcmVzc2lvblByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAogCQl9CiAJfTsKIApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQppbmRleCAxN2FkODRiLi5kODE0NDhjIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpAQCAtMzUsNyArMzUsNyBAQAogCX0KIAogCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCiAJICovCiAJcHJpdmF0ZSBOdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpIHsKIAkJc3VwZXIoKTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQppbmRleCA5Njg2NThlLi5jMGExZGNhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1Nob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCkBAIC04Myw3ICs4Myw3IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgeyAgLy8gb2JqZWN0ID0+IG51bGwKLQkJCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUobmV3VmFsdWUpOworCQkJCXRoaXMuYWRhcHRlci5zZXRWYWx1ZShudWxsKTsKIAkJCX0gZWxzZSB7ICAvLyBvYmplY3QgPT4gb2JqZWN0CiAJCQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwob2xkVmFsdWUsIG5ld1ZhbHVlKSkgewogCQkJCQkvLyBkbyBub3RoaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2hvcnRDaXJjdWl0QXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmluZGV4IDFmNmNjMzguLjAxOTUyZmUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCkBAIC0xMCw3ICsxMCw2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9UeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTYyNDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUHJpbWl0aXZlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKKworLyoqCisgKiBDb252ZXJ0IGEgdHlwZSBsaXRlcmFsIHRvL2Zyb20gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSAKKyAqIHNpbXBsZSB0eXBlIChlLmcuICJqYXZhLmxhbmcuT2JqZWN0Iikgb3IgcHJpbWl0aXZlIHR5cGUgKGUuZy4gImludCIpLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIKKwlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+Cit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IElOU1RBTkNFID0gbmV3IFR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgVHlwZUxpdGVyYWwgY29udmVydE9iamVjdChTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7CisJCWlmIChQcmltaXRpdmVUeXBlLnRvQ29kZShzdHJpbmcpICE9IG51bGwpIHsKKwkJCXJldHVybiAoVHlwZUxpdGVyYWwpIFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydChzdHJpbmcsIGFzdCk7CisJCX0KKwkJcmV0dXJuIChUeXBlTGl0ZXJhbCkgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0KHN0cmluZywgYXN0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlTdHJpbmcgbmFtZSA9IFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydChleHByZXNzaW9uKTsKKwkJcmV0dXJuIG5hbWUgIT0gbnVsbCA/IG5hbWUgOiBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnQoZXhwcmVzc2lvbik7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9Cb29sZWFuVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvQm9vbGVhblRyYW5zbGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmViYjJlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvQm9vbGVhblRyYW5zbGF0b3IuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCitwdWJsaWMgY2xhc3MgQm9vbGVhblRyYW5zbGF0b3IKKwlleHRlbmRzIFRyYW5zbGF0b3IKK3sKKwlwdWJsaWMgQm9vbGVhblRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgc3RydWN0dXJhbEZlYXR1cmUsIEJPT0xFQU5fRkVBVFVSRSB8IEJPT0xFQU5fTE9XRVJDQVNFKTsKKwl9CisJCisJcHVibGljIEJvb2xlYW5UcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSwgaW50IHN0eWxlKSB7CisJCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgc3RydWN0dXJhbEZlYXR1cmUsIEJPT0xFQU5fRkVBVFVSRSB8IEJPT0xFQU5fTE9XRVJDQVNFIHwgc3R5bGUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJpbmcsIEVPYmplY3Qgb3duZXIpIHsKKwkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihzdHJpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgeworCQlyZXR1cm4gKChCb29sZWFuKSB2YWx1ZSkudG9TdHJpbmcoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVlMjdmZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL0VtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIFRoaXMgdHJhbnNsYXRvciBpcyB0byBiZSB1c2VkIGZvciBlbXB0eSB4bWwgdGFncyB0aGF0IGNvcnJlc3BvbmQKKyAqIHRvIGEgYm9vbGVhbiBhdHRyaWJ1dGUgaW4gdGhlIGVtZiBtb2RlbC4gIAorICogY2FzY2FkZS1wZXJzaXN0IGlzIGFuIGV4YW1wbGUgZnJvbSB0aGUgb3JtLnhzZDoKKyAqIAorICogCTxwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzPgorICogCQk8Y2FzY2FkZS1wZXJzaXN0Lz4gICAgICAgIAorICogCTwvcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cz4gID09PiAgY2FzY2FkZVBlcnNpc3QgPT0gdHJ1ZQorICogCisgKiB2cy4KKyAqIAorICogCTxwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzPiAgCisgKiAJPC9wZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzPiAgPT0+ICBjYXNjYWRlUGVyc2lzdCA9PSBmYWxzZQorICogCisgKi8KK3B1YmxpYyBjbGFzcyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yCisJZXh0ZW5kcyBUcmFuc2xhdG9yCit7CisJcHVibGljIEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgc3RydWN0dXJhbEZlYXR1cmUsIEVNUFRZX1RBRyB8IEJPT0xFQU5fRkVBVFVSRSk7CisJfQorCisJcHVibGljIEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlLCBpbnQgc3R5bGUpIHsKKwkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgc3R5bGUgfCBFTVBUWV9UQUcgfCBCT09MRUFOX0ZFQVRVUkUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0KSB7CisJCS8vIEkgYW0gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZC4gIFRoaXMgaXMgc28gdGhlIHRhZyB3aWxsIGJlIHJlbW92ZWQgd2hlbiAKKwkJLy8gdGhlIHZhbHVlIGlzIGZhbHNlLgorCQkvLyBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyBhIGJ1ZyBpbiB0aGUgZWNvcmUgb3IgbWF5YmUgaW4gdGhlIHRyYW5zbGF0b3JzLCAKKwkJLy8gYnV0IEkgcmVhbGx5IGRvbid0IHRoaW5rIHRoYXQgd2Ugc2hvdWxkIGhhdmUgdG8gZGVwZW5kIG9uIHRoZSBib29sZWFuCisJCS8vIGJlaW5nICJ1bnNldCIgdG8gcmVtb3ZlIHRoZSB0YWcuCisJCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgc3VwZXIuZ2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKKwkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IHZhbHVlIDogbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL0VudW1lcmF0ZWRWYWx1ZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL0VudW1lcmF0ZWRWYWx1ZVRyYW5zbGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGYzNTUxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvRW51bWVyYXRlZFZhbHVlVHJhbnNsYXRvci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEVudW1lcmF0ZWRWYWx1ZVRyYW5zbGF0b3IKKwlleHRlbmRzIFRyYW5zbGF0b3IKK3sKKwlwdWJsaWMgRW51bWVyYXRlZFZhbHVlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBzdHJ1Y3R1cmFsRmVhdHVyZSk7CisJfQorCQorCXB1YmxpYyBFbnVtZXJhdGVkVmFsdWVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSwgaW50IHN0eWxlKSB7CisJCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgc3RydWN0dXJhbEZlYXR1cmUsIHN0eWxlKTsKKwl9CisJCisJCisJcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhdG9yIGVudW1lcmF0ZWRPYmplY3RWYWx1ZXMoKTsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJpbmcsIEVPYmplY3Qgb3duZXIpIHsKKwkJZm9yIChPYmplY3QgZWFjaCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbnVtZXJhdGVkT2JqZWN0VmFsdWVzKCkpKSB7CisJCQlpZiAoZWFjaC50b1N0cmluZygpLmVxdWFscyhzdHJpbmcpKSB7CisJCQkJcmV0dXJuIGVhY2g7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7CisJCXJldHVybiB2YWx1ZS50b1N0cmluZygpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL1NpbXBsZVJvb3RUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9TaW1wbGVSb290VHJhbnNsYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMDFhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9TaW1wbGVSb290VHJhbnNsYXRvci5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUm9vdFRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiBSb290IHRyYW5zbGF0b3IgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgY2hpbGQgdHJhbnNsYXRvcnMgYW5kIG5vIHNwZWNpYWwKKyAqIGJlaGF2aW9yLgorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlUm9vdFRyYW5zbGF0b3IKKwlleHRlbmRzIFJvb3RUcmFuc2xhdG9yCit7CisJcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsKKworCXB1YmxpYyBTaW1wbGVSb290VHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFQ2xhc3MgZUNsYXNzKSB7CisJCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZUNsYXNzKTsKKwl9CisKKwlwdWJsaWMgU2ltcGxlUm9vdFRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRUNsYXNzIGVDbGFzcywgVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7CisJCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZUNsYXNzKTsKKwkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOworCX0KKworCS8qKgorCSAqIFdpZGVuIG1ldGhvZCBhY2Nlc3MgdG8gJ3B1YmxpYycuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbigpIHsKKwkJcmV0dXJuIHRoaXMuY2hpbGRyZW47CisJfQorCisJcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbl8oKSB7CisJCXJldHVybiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSA/IEVNUFRZX1RSQU5TTEFUT1JfQVJSQVkgOiB0aGlzLmNoaWxkcmVuOworCX0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBFTVBUWV9UUkFOU0xBVE9SX0FSUkFZID0gbmV3IFRyYW5zbGF0b3JbMF07CisKKwkvKioKKwkgKiBTZXQgdGhlIHRyYW5zbGF0b3IncyBjaGlsZHJlbi4KKwkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0b3IuCisJICovCisJcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7CisJCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKwl9CisKKwkvKioKKwkgKiBBZGQgdGhlIHNwZWNpZmllZCB0cmFuc2xhdG9yIHRvIHRoZSB0cmFuc2xhdG9yJ3MgbGlzdCBvZiBjaGlsZHJlbi4KKwkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0b3IgZm9yIG1ldGhvZCBjaGFpbmluZy4KKwkgKi8KKwlwdWJsaWMgU2ltcGxlUm9vdFRyYW5zbGF0b3IgYWRkQ2hpbGQoVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7CisJCXRoaXMuY2hpbGRyZW4gPSBBcnJheVRvb2xzLmFkZCh0aGlzLmdldENoaWxkcmVuXygpLCB0cmFuc2xhdG9yKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvcnMgdG8gdGhlIHRyYW5zbGF0b3IncyBsaXN0IG9mIGNoaWxkcmVuLgorCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvciBmb3IgbWV0aG9kIGNoYWluaW5nLgorCSAqLworCXB1YmxpYyBTaW1wbGVSb290VHJhbnNsYXRvciBhZGRDaGlsZHJlbihUcmFuc2xhdG9yW10gdHJhbnNsYXRvcnMpIHsKKwkJdGhpcy5jaGlsZHJlbiA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuZ2V0Q2hpbGRyZW5fKCksIHRyYW5zbGF0b3JzKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvciBmcm9tIHRoZSB0cmFuc2xhdG9yJ3MgbGlzdCBvZiBjaGlsZHJlbi4KKwkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0b3IgZm9yIG1ldGhvZCBjaGFpbmluZy4KKwkgKi8KKwlwdWJsaWMgU2ltcGxlUm9vdFRyYW5zbGF0b3IgcmVtb3ZlQ2hpbGQoVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7CisJCXRoaXMuY2hpbGRyZW4gPSBBcnJheVRvb2xzLnJlbW92ZSh0aGlzLmNoaWxkcmVuLCB0cmFuc2xhdG9yKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvcnMgZnJvbSB0aGUgdHJhbnNsYXRvcidzIGxpc3Qgb2YgY2hpbGRyZW4uCisJICogUmV0dXJuIHRoZSB0cmFuc2xhdG9yIGZvciBtZXRob2QgY2hhaW5pbmcuCisJICovCisJcHVibGljIFNpbXBsZVJvb3RUcmFuc2xhdG9yIHJlbW92ZUNoaWxkcmVuKFRyYW5zbGF0b3JbXSB0cmFuc2xhdG9ycykgeworCQl0aGlzLmNoaWxkcmVuID0gQXJyYXlUb29scy5yZW1vdmVBbGwodGhpcy5jaGlsZHJlbiwgKE9iamVjdFtdKSB0cmFuc2xhdG9ycyk7CisJCXJldHVybiB0aGlzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvU2ltcGxlVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvU2ltcGxlVHJhbnNsYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNDY1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9TaW1wbGVUcmFuc2xhdG9yLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JQYXRoOworCisvKioKKyAqIFRyYW5zbGF0b3IgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgY2hpbGQgdHJhbnNsYXRvcnMgYW5kIG5vIHNwZWNpYWwKKyAqIGJlaGF2aW9yLgorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlVHJhbnNsYXRvcgorCWV4dGVuZHMgVHJhbnNsYXRvcgoreworCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY2hpbGRyZW47CisKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVDbGFzcyBlQ2xhc3MpIHsKKwkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlQ2xhc3MpOworCX0KKworCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlU3RydWN0dXJhbEZlYXR1cmUpOworCX0KKworCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUsIFRyYW5zbGF0b3JbXSBjaGlsZHJlbikgeworCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIGVTdHJ1Y3R1cmFsRmVhdHVyZSk7CisJCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKwl9CisKKwlwdWJsaWMgU2ltcGxlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlLCBFQ2xhc3MgZUNsYXNzKSB7CisJCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZVN0cnVjdHVyYWxGZWF0dXJlLCBlQ2xhc3MpOworCX0KKwkKKwlwdWJsaWMgU2ltcGxlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlLCBFQ2xhc3MgZUNsYXNzLCBUcmFuc2xhdG9yW10gY2hpbGRyZW4pIHsKKwkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlU3RydWN0dXJhbEZlYXR1cmUsIGVDbGFzcyk7CisJCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKwl9CisKKwlwdWJsaWMgU2ltcGxlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCB0cmFuc2xhdG9yUGF0aCkgeworCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIGVTdHJ1Y3R1cmFsRmVhdHVyZSwgdHJhbnNsYXRvclBhdGgpOworCX0KKworCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gdHJhbnNsYXRvclBhdGhzKSB7CisJCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZVN0cnVjdHVyYWxGZWF0dXJlLCB0cmFuc2xhdG9yUGF0aHMpOworCX0KKworCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUsIGludCBzdHlsZSkgeworCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIGVTdHJ1Y3R1cmFsRmVhdHVyZSwgc3R5bGUpOworCX0KKwkKKwlwdWJsaWMgU2ltcGxlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIGludCBzdHlsZSwgRUNsYXNzIGVDbGFzcywgVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7CisJCXRoaXMoZG9tUGF0aEFuZE5hbWVzLCBhRmVhdHVyZSwgc3R5bGUpOworCQlzZXRFTUZDbGFzcyhlQ2xhc3MpOworCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CisJfQorCisJcHVibGljIFNpbXBsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1Y3R1cmFsRmVhdHVyZSwgaW50IHN0eWxlLCBUcmFuc2xhdG9yW10gY2hpbGRyZW4pIHsKKwkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlU3RydWN0dXJhbEZlYXR1cmUsIHN0eWxlKTsKKwkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOworCX0KKworCisJLy8gKioqKioqKioqKiBjaGlsZHJlbiAqKioqKioqKioqCisKKwkvKioKKwkgKiBXaWRlbiBtZXRob2QgYWNjZXNzIHRvICdwdWJsaWMnLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oKSB7CisJCXJldHVybiB0aGlzLmNoaWxkcmVuOworCX0KKworCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW5fKCkgeworCQlyZXR1cm4gKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgPyBFTVBUWV9UUkFOU0xBVE9SX0FSUkFZIDogdGhpcy5jaGlsZHJlbjsKKwl9CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yW10gRU1QVFlfVFJBTlNMQVRPUl9BUlJBWSA9IG5ldyBUcmFuc2xhdG9yWzBdOworCisJLyoqCisJICogU2V0IHRoZSB0cmFuc2xhdG9yJ3MgY2hpbGRyZW4uCisJICogUmV0dXJuIHRoZSB0cmFuc2xhdG9yLgorCSAqLworCXB1YmxpYyB2b2lkIHNldENoaWxkcmVuKFRyYW5zbGF0b3JbXSBjaGlsZHJlbikgeworCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CisJfQorCisJLyoqCisJICogQWRkIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvciB0byB0aGUgdHJhbnNsYXRvcidzIGxpc3Qgb2YgY2hpbGRyZW4uCisJICogUmV0dXJuIHRoZSB0cmFuc2xhdG9yIGZvciBtZXRob2QgY2hhaW5pbmcuCisJICovCisJcHVibGljIFNpbXBsZVRyYW5zbGF0b3IgYWRkQ2hpbGQoVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7CisJCXRoaXMuY2hpbGRyZW4gPSBBcnJheVRvb2xzLmFkZCh0aGlzLmdldENoaWxkcmVuXygpLCB0cmFuc2xhdG9yKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvcnMgdG8gdGhlIHRyYW5zbGF0b3IncyBsaXN0IG9mIGNoaWxkcmVuLgorCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvciBmb3IgbWV0aG9kIGNoYWluaW5nLgorCSAqLworCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yIGFkZENoaWxkcmVuKFRyYW5zbGF0b3JbXSB0cmFuc2xhdG9ycykgeworCQl0aGlzLmNoaWxkcmVuID0gQXJyYXlUb29scy5hZGRBbGwodGhpcy5nZXRDaGlsZHJlbl8oKSwgdHJhbnNsYXRvcnMpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCB0cmFuc2xhdG9yIGZyb20gdGhlIHRyYW5zbGF0b3IncyBsaXN0IG9mIGNoaWxkcmVuLgorCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvciBmb3IgbWV0aG9kIGNoYWluaW5nLgorCSAqLworCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yIHJlbW92ZUNoaWxkKFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgeworCQl0aGlzLmNoaWxkcmVuID0gQXJyYXlUb29scy5yZW1vdmUodGhpcy5jaGlsZHJlbiwgdHJhbnNsYXRvcik7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHRyYW5zbGF0b3JzIGZyb20gdGhlIHRyYW5zbGF0b3IncyBsaXN0IG9mIGNoaWxkcmVuLgorCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvciBmb3IgbWV0aG9kIGNoYWluaW5nLgorCSAqLworCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yIHJlbW92ZUNoaWxkcmVuKFRyYW5zbGF0b3JbXSB0cmFuc2xhdG9ycykgeworCQl0aGlzLmNoaWxkcmVuID0gQXJyYXlUb29scy5yZW1vdmVBbGwodGhpcy5jaGlsZHJlbiwgKE9iamVjdFtdKSB0cmFuc2xhdG9ycyk7CisJCXJldHVybiB0aGlzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCmluZGV4IDdjNjE0YWYuLjIxMzZlNTIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTQsMzYgKzE0LDQxIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CiAKLXB1YmxpYyBjbGFzcyBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzCi0JaW1wbGVtZW50cyBKcGFWYWxpZGF0aW9uTWVzc2FnZXMKLXsJCitwdWJsaWMgY2xhc3MgRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcyB7CisKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBERUZBVUxUX1BBUk1TID0gbmV3IFN0cmluZ1swXTsKLQkKIAlwcml2YXRlIHN0YXRpYyBUZXh0UmFuZ2UgREVGQVVMVF9URVhUX1JBTkdFID0gVGV4dFJhbmdlLkVtcHR5Lmluc3RhbmNlKCk7CiAJCiAJcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoCi0JCQlpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShzZXZlcml0eSwgbWVzc2FnZUlkLCBERUZBVUxUX1BBUk1TLCB0YXJnZXRPYmplY3QpOworCQkJaW50IGRlZmF1bHRTZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgT2JqZWN0IHRhcmdldE9iamVjdCkgeworCQlyZXR1cm4gYnVpbGRNZXNzYWdlKGRlZmF1bHRTZXZlcml0eSwgbWVzc2FnZUlkLCBERUZBVUxUX1BBUk1TLCB0YXJnZXRPYmplY3QpOwogCX0KIAkKIAlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZSgKLQkJCWludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShzZXZlcml0eSwgbWVzc2FnZUlkLCBwYXJtcywgdGFyZ2V0T2JqZWN0LCBERUZBVUxUX1RFWFRfUkFOR0UpOworCQkJaW50IGRlZmF1bHRTZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKKwkJcmV0dXJuIGJ1aWxkTWVzc2FnZShkZWZhdWx0U2V2ZXJpdHksIG1lc3NhZ2VJZCwgcGFybXMsIHRhcmdldE9iamVjdCwgREVGQVVMVF9URVhUX1JBTkdFKTsKIAl9CiAJCiAJcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoCi0JCQlpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIE9iamVjdCB0YXJnZXRPYmplY3QsIFRleHRSYW5nZSB0ZXh0UmFuZ2UpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShzZXZlcml0eSwgbWVzc2FnZUlkLCBERUZBVUxUX1BBUk1TLCB0YXJnZXRPYmplY3QsIHRleHRSYW5nZSk7CisJCQlpbnQgZGVmYXVsdFNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBPYmplY3QgdGFyZ2V0T2JqZWN0LCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7CisJCXJldHVybiBidWlsZE1lc3NhZ2UoZGVmYXVsdFNldmVyaXR5LCBtZXNzYWdlSWQsIERFRkFVTFRfUEFSTVMsIHRhcmdldE9iamVjdCwgdGV4dFJhbmdlKTsKIAl9CiAJCiAJcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoCi0JCQlpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0T2JqZWN0LCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShCVU5ETEUsIHNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QpOworCQkJaW50IGRlZmF1bHRTZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXRPYmplY3QsIFRleHRSYW5nZSB0ZXh0UmFuZ2UpIHsKKwkJCisJCS8vZGV0ZXJtaW5lIHdoZXRoZXIgZGVmYXVsdCBzZXZlcml0eSBzaG91bGQgYmUgb3ZlcnJpZGRlbgorCQlpbnQgc2V2ZXJpdHkgPSBkZWZhdWx0U2V2ZXJpdHk7CisJCWludCBzZXZlcml0eVByZWZlcmVuY2UgPSBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuZ2V0UHJvYmxlbVNldmVyaXR5UHJlZmVyZW5jZSh0YXJnZXRPYmplY3QsIG1lc3NhZ2VJZCk7CisJCWlmIChzZXZlcml0eVByZWZlcmVuY2UhPUpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5OT19TRVZFUklUWV9QUkVGRVJFTkNFKXsKKwkJCXNldmVyaXR5ID0gc2V2ZXJpdHlQcmVmZXJlbmNlOworCQl9CisJCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQlVORExFX05BTUUsIHNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QpOwogCQlpZiAodGV4dFJhbmdlID09IG51bGwpIHsKIAkJCS8vbG9nIGFuIGV4Y2VwdGlvbiBhbmQgdGhlbiBjb250aW51ZSB3aXRob3V0IHNldHRpbmcgbG9jYXRpb24gaW5mb3JtYXRpb24KIAkJCS8vQXQgbGVhc3QgdGhlIHVzZXIgd2lsbCBzdGlsbCBnZXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSBhbmQgd2lsbAogCQkJLy9iZSBhYmxlIHRvIHNlZSBvdGhlciB2YWxpZGF0aW9uIG1lc3NhZ2VzIHdpdGggdmFsaWQgdGV4dFJhbmdlcwotCQkJSnB0Q29yZVBsdWdpbi5sb2cobmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHRleHRSYW5nZSBpcyBudWxsIGZvciBtZXNzYWdlSWQ6ICIgKyBtZXNzYWdlSWQpKTsKKwkJCUpwdENvcmVQbHVnaW4ubG9nKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgdGV4dCByYW5nZSBmb3IgbWVzc2FnZSBJRDogIiArIG1lc3NhZ2VJZCkpOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJZWxzZSB7CiAJCQltZXNzYWdlLnNldExpbmVObyh0ZXh0UmFuZ2UuZ2V0TGluZU51bWJlcigpKTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYVZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKaW5kZXggYmFmMjAzYi4uZTZlYjg0NyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKQEAgLTEsMTM3ICsxLDEwNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCAKLSAqICB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSAKLSAqICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyAKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247CiAKLXB1YmxpYyBpbnRlcmZhY2UgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFID0gImpwYV92YWxpZGF0aW9uIjsKLQkKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGludGVyZmFjZSBKcGFWYWxpZGF0aW9uTWVzc2FnZXMgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianBhX3ZhbGlkYXRpb24iOwogCQogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTk9fQ09OTkVDVElPTiA9ICJQUk9KRUNUX05PX0NPTk5FQ1RJT04iOwotCQogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfSU5WQUxJRF9DT05ORUNUSU9OID0gIlBST0pFQ1RfSU5WQUxJRF9DT05ORUNUSU9OIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0lOQUNUSVZFX0NPTk5FQ1RJT04gPSAiUFJPSkVDVF9JTkFDVElWRV9DT05ORUNUSU9OIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05PX1BFUlNJU1RFTkNFX1hNTCA9ICJQUk9KRUNUX05PX1BFUlNJU1RFTkNFX1hNTCI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9NVUxUSVBMRV9QRVJTSVNURU5DRV9YTUwgPSAiUFJPSkVDVF9NVUxUSVBMRV9QRVJTSVNURU5DRV9YTUwiOwotCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9WRVJTSU9OX05PVF9MQVRFU1QgPSAiWE1MX1ZFUlNJT05fTk9UX0xBVEVTVCI7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX0lOVkFMSURfQ09OVEVOVCA9ICJQRVJTSVNURU5DRV9YTUxfSU5WQUxJRF9DT05URU5UIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklUID0gIlBFUlNJU1RFTkNFX05PX1BFUlNJU1RFTkNFX1VOSVQiOwotCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfTVVMVElQTEVfUEVSU0lTVEVOQ0VfVU5JVFMgPSAiUEVSU0lTVEVOQ0VfTVVMVElQTEVfUEVSU0lTVEVOQ0VfVU5JVFMiOwotCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9NQVBQSU5HX0ZJTEUgPSAiUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9NQVBQSU5HX0ZJTEUiOwotCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfVU5TVVBQT1JURURfTUFQUElOR19GSUxFX0NPTlRFTlQgPSAiUEVSU0lTVEVOQ0VfVU5JVF9VTlNVUFBPUlRFRF9NQVBQSU5HX0ZJTEVfQ09OVEVOVCI7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9NQVBQSU5HX0ZJTEUgPSAiUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9NQVBQSU5HX0ZJTEUiOwotCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX01BUFBJTkdfRklMRSA9ICJQRVJTSVNURU5DRV9VTklUX0lOVkFMSURfTUFQUElOR19GSUxFIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9NQVBQSU5HX0ZJTEUgPSAiUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfTUFQUElOR19GSUxFIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0NMQVNTID0gIlBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfQ0xBU1MiOwotCQogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfQ0xBU1MgPSAiUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9DTEFTUyI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX0NMQVNTID0gIlBFUlNJU1RFTkNFX1VOSVRfSU5WQUxJRF9DTEFTUyI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfQ0xBU1MgPSAiUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfQ0xBU1MiOwotCQogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfUkVEVU5EQU5UX0NMQVNTID0gIlBFUlNJU1RFTkNFX1VOSVRfUkVEVU5EQU5UX0NMQVNTIjsKLQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9KQVJfRklMRSA9ICJQRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9KQVJfRklMRSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9KQVJfRklMRSA9ICJQRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0pBUl9GSUxFIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX0pBUl9GSUxFX0RFUExPWU1FTlRfUEFUSF9XQVJOSU5HID0gIlBFUlNJU1RFTkNFX1VOSVRfSkFSX0ZJTEVfREVQTE9ZTUVOVF9QQVRIX1dBUk5JTkciOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfSkFSX0ZJTEUgPSAiUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9KQVJfRklMRSI7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FID0gIkdFTkVSQVRPUl9EVVBMSUNBVEVfTkFNRSI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfRFVQTElDQVRFX05BTUUgPSAiUVVFUllfRFVQTElDQVRFX05BTUUiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9NQVBQSU5HU19NVUxUSVBMRV9NRVRBREFUQSA9ICJFTlRJVFlfTUFQUElOR1NfTVVMVElQTEVfTUVUQURBVEEiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DT05URVhUID0gIlBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DT05URVhUIjsKLQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0ZJTEVfRVhUUkFORU9VU19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTID0gIk1BUFBJTkdfRklMRV9FWFRSQU5FT1VTX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfVFlQRV9NQVBQRURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklUID0gIlBFUlNJU1RFTlRfVFlQRV9NQVBQRURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklUIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5UX1RZUEVfQU5OT1RBVEVEX0JVVF9OT1RfSU5DTFVERURfSU5fUEVSU0lTVEVOQ0VfVU5JVCA9ICJQRVJTSVNURU5UX1RZUEVfQU5OT1RBVEVEX0JVVF9OT1RfSU5DTFVERURfSU5fUEVSU0lTVEVOQ0VfVU5JVCI7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9UWVBFX1VOU1BFQ0lGSUVEX0NMQVNTID0gIlBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DTEFTUyI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9UWVBFX1VOUkVTT0xWRURfQ0xBU1MgPSAiUEVSU0lTVEVOVF9UWVBFX1VOUkVTT0xWRURfQ0xBU1MiOwotCQogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9OT19JRCA9ICJFTlRJVFlfTk9fSUQiOwotCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9TSU5HTEVfVEFCTEVfREVTQ0VOREFOVF9ERUZJTkVTX1RBQkxFID0gIkVOVElUWV9TSU5HTEVfVEFCTEVfREVTQ0VOREFOVF9ERUZJTkVTX1RBQkxFIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQUJTVFJBQ1RfVEFCTEVfUEVSX0NMQVNTX0RFRklORVNfVEFCTEUgPSAiRU5USVRZX0FCU1RSQUNUX1RBQkxFX1BFUl9DTEFTU19ERUZJTkVTX1RBQkxFIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQUJTVFJBQ1RfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVEID0gIkVOVElUWV9BQlNUUkFDVF9ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVEID0gIkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVEIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfTk9OX1JPT1RfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRCA9ICJFTlRJVFlfTk9OX1JPT1RfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVEID0gIkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRCI7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5TUEVDSUZJRURfTkFNRSA9ICJQRVJTSVNURU5UX0FUVFJJQlVURV9VTlNQRUNJRklFRF9OQU1FIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9VTlJFU09MVkVEX05BTUUgPSAiUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5SRVNPTFZFRF9OQU1FIjsKLQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9JTkhFUklURURfQVRUUklCVVRFU19OT1RfU1VQUE9SVEVEID0gIlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOSEVSSVRFRF9BVFRSSUJVVEVTX05PVF9TVVBQT1JURUQiOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0ZJTkFMX0ZJRUxEID0gIlBFUlNJU1RFTlRfQVRUUklCVVRFX0ZJTkFMX0ZJRUxEIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9QVUJMSUNfRklFTEQgPSAiUEVSU0lTVEVOVF9BVFRSSUJVVEVfUFVCTElDX0ZJRUxEIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX01BUFBJTkcgPSAiUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9NQVBQSU5HIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1VOUkVTT0xWRURfTUFQUEVEX0JZID0gIk1BUFBJTkdfVU5SRVNPTFZFRF9NQVBQRURfQlkiOwotCQogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfSU5WQUxJRF9NQVBQRURfQlkgPSAiTUFQUElOR19JTlZBTElEX01BUFBFRF9CWSI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19NQVBQRURfQllfV0lUSF9KT0lOX1RBQkxFID0gIk1BUFBJTkdfTUFQUEVEX0JZX1dJVEhfSk9JTl9UQUJMRSI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19NQVBQRURfQllfT05fQk9USF9TSURFUyA9ICJNQVBQSU5HX01BUFBFRF9CWV9PTl9CT1RIX1NJREVTIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9NQVBQSU5HX1VOUkVTT0xWRURfR0VORVJBVE9SX05BTUUgPSAiSURfTUFQUElOR19VTlJFU09MVkVEX0dFTkVSQVRPUl9OQU1FIjsKLQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9VTlJFU09MVkVEX0NBVEFMT0cgPSAiVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HIjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9VTlJFU09MVkVEX1NDSEVNQSA9ICJUQUJMRV9VTlJFU09MVkVEX1NDSEVNQSI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfVU5SRVNPTFZFRF9OQU1FID0gIlRBQkxFX1VOUkVTT0xWRURfTkFNRSI7Ci0JCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRyA9ICJTRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HIjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEgPSAiU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9OQU1FID0gIlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX05BTUUiOwotCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0cgPSAiSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0ciOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEgPSAiSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSI7Ci0JCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0cgPSAiVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0ciOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEgPSAiVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUUgPSAiSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUUiOwotCQogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FID0gIlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSA9ICJDT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUgPSAiVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUiOwotCQogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFID0gIlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIkNPTFVNTl9VTlJFU09MVkVEX05BTUUiOwotCQogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSA9ICJWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFID0gIkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUiOwotCQogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUgPSAiVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFID0gIlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUyA9ICJKT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUVfTVVMVElQTEVfSk9JTl9DT0xVTU5TIjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUVfTVVMVElQTEVfSk9JTl9DT0xVTU5TID0gIlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRV9NVUxUSVBMRV9KT0lOX0NPTFVNTlMiOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUVfTVVMVElQTEVfSk9JTl9DT0xVTU5TID0gIkpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRV9NVUxUSVBMRV9KT0lOX0NPTFVNTlMiOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSA9ICJWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUiOwotCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUyA9ICJWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUVfTVVMVElQTEVfSk9JTl9DT0xVTU5TIjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSA9ICJWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVEX1ZBTFVFX1VOUkVTT0xWRURfR0VORVJBVE9SID0gIkdFTkVSQVRFRF9WQUxVRV9VTlJFU09MVkVEX0dFTkVSQVRPUiI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gIlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSI7Ci0JCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fSlBBX1BST0pFQ1QgPSAiTk9fSlBBX1BST0pFQ1QiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9FTlRJVFlfTk9UX0RFRklORUQgPSAiVEFSR0VUX0VOVElUWV9OT1RfREVGSU5FRCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfVEFSR0VUX0VOVElUWV9OT1RfREVGSU5FRCA9ICJWSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX05PVF9ERUZJTkVEIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFkgPSAiVEFSR0VUX0VOVElUWV9JU19OT1RfQU5fRU5USVRZIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFkgPSAiVklSVFVBTF9BVFRSSUJVVEVfVEFSR0VUX0VOVElUWV9JU19OT1RfQU5fRU5USVRZIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDUklNSU5BVE9SX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiRElTQ1JJTUlOQVRPUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9TVVBQT1JURURfT05fUExBVEZPUk0gPSAiRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfU1VQUE9SVEVEX09OX1BMQVRGT1JNIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9QT1JUQUJMRV9PTl9QTEFURk9STSA9ICJFTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9QT1JUQUJMRV9PTl9QTEFURk9STSI7CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOTRhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLklSZXNvdXJjZVBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOworCisvL1RPRE86ICBQcm9iYWJseSB3YW50IHRvIG1lcmdlIHRoZSBiZWhhdmlvciBpbiB0aGlzIGNsYXNzIGludG8gSnB0Q29yZVBsdWdpbgorcHVibGljIGNsYXNzIEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcyB7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgSElHSF9TRVZFUklUWSA9ICJlcnJvciI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTk9STUFMX1NFVkVSSVRZID0gIndhcm5pbmciOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExPV19TRVZFUklUWSA9ICJpbmZvIjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJR05PUkUgPSAiaWdub3JlIjsKKwkKKwlzdGF0aWMgaW50IE5PX1NFVkVSSVRZX1BSRUZFUkVOQ0UgPSAtMTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIG9ubHkgdGhlIHNldmVyaXR5IGxldmVsIG9mIGEgZ2l2ZW4gcHJvYmxlbSBwcmVmZXJlbmNlLiAgVGhpcyBkb2VzIG5vdAorCSAqIGluY2x1ZGUgaW5mb3JtYXRpb24gb24gd2hldGhlciB0aGUgcHJvYmxlbSBpcyBpZ25vcmVkLiAgU2VlIGlzUHJvYmxlbUlnbm9yZWQuCisJICogQHJldHVybiBhbiBJTWVzc2FnZSBzZXZlcml0eSBsZXZlbAorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IGdldFByb2JsZW1TZXZlcml0eVByZWZlcmVuY2UoT2JqZWN0IHRhcmdldE9iamVjdCwgU3RyaW5nIG1lc3NhZ2VJZCkgeworCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCh0YXJnZXRPYmplY3QpOworCQlTdHJpbmcgcHJvYmxlbVByZWZlcmVuY2UgPSBnZXRQcmVmZXJlbmNlKHByb2plY3QsIG1lc3NhZ2VJZCk7CisJCQorCQlpZiAocHJvYmxlbVByZWZlcmVuY2U9PW51bGwpeworCQkJcmV0dXJuIE5PX1NFVkVSSVRZX1BSRUZFUkVOQ0U7CisJCX1lbHNlIGlmIChwcm9ibGVtUHJlZmVyZW5jZS5lcXVhbHMoSElHSF9TRVZFUklUWSkpeworCQkJcmV0dXJuIElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7CisJCX0gZWxzZSBpZiAocHJvYmxlbVByZWZlcmVuY2UuZXF1YWxzKE5PUk1BTF9TRVZFUklUWSkpeworCQkJcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKKwkJfSBlbHNlIGlmIChwcm9ibGVtUHJlZmVyZW5jZS5lcXVhbHMoTE9XX1NFVkVSSVRZKSl7CisJCQlyZXR1cm4gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOworCQl9CisJCXJldHVybiBOT19TRVZFUklUWV9QUkVGRVJFTkNFOworCX0KKworCXByaXZhdGUgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoT2JqZWN0IHRhcmdldE9iamVjdCkgeworCQlJQWRhcHRhYmxlIHRhcmdldCA9IChJQWRhcHRhYmxlKXRhcmdldE9iamVjdDsKKwkJSVJlc291cmNlIHJlc291cmNlID0gKChJUmVzb3VyY2VQYXJ0KSB0YXJnZXQuZ2V0QWRhcHRlcihJUmVzb3VyY2VQYXJ0LmNsYXNzKSkuZ2V0UmVzb3VyY2UoKTsKKwkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKKwkJcmV0dXJuIHByb2plY3Q7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIHByb2JsZW0gc2hvdWxkIGJlIGlnbm9yZWQgYmFzZWQgb24gcHJvamVjdCBvcgorCSAqIHdvcmtzcGFjZSBwcmVmZXJlbmNlcworCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb2JsZW1JZ25vcmVkKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBtZXNzYWdlSWQpeworCQlTdHJpbmcgcHJvYmxlbVByZWZlcmVuY2UgPSBnZXRQcmVmZXJlbmNlKHByb2plY3QsIG1lc3NhZ2VJZCk7CisJCWlmIChwcm9ibGVtUHJlZmVyZW5jZT09bnVsbCl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX1lbHNlIGlmKHByb2JsZW1QcmVmZXJlbmNlLmVxdWFscyhJR05PUkUpKXsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbWVzc2FnZUlkKSB7CisJCVN0cmluZyBwcm9ibGVtUHJlZmVyZW5jZSA9IG51bGw7CisJCXByb2JsZW1QcmVmZXJlbmNlID0gZ2V0UHJvamVjdExldmVsUHJvYmxlbVByZWZlcmVuY2UocHJvamVjdCwgbWVzc2FnZUlkKTsKKwkJLy9pZiBzZXZlcml0eSBpcyBzdGlsbCBudWxsLCBjaGVjayB0aGUgd29ya3NwYWNlIHByZWZlcmVuY2VzCisJCWlmKHByb2JsZW1QcmVmZXJlbmNlPT1udWxsKSB7CisJCQlwcm9ibGVtUHJlZmVyZW5jZSA9IGdldFdvcmtzcGFjZUxldmVsUHJvYmxlbVByZWZlcmVuY2UobWVzc2FnZUlkKTsKKwkJfQorCQlyZXR1cm4gcHJvYmxlbVByZWZlcmVuY2U7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgcHJvYmxlbSBwcmVmZXJlbmNlIGZyb20gdGhlIHByb2plY3QgcHJlZmVyZW5jZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9qZWN0TGV2ZWxQcm9ibGVtUHJlZmVyZW5jZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbWVzc2FnZUlkKXsKKwkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZmVyZW5jZXMgPSBKcHRDb3JlUGx1Z2luLmdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKKwkJcmV0dXJuIHByb2plY3RQcmVmZXJlbmNlcy5nZXQobWVzc2FnZUlkLCBudWxsKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFByb2plY3RMZXZlbFByb2JsZW1QcmVmZXJlbmNlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyBwcm9ibGVtUHJlZmVyZW5jZSkgeworCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByb2plY3RQcmVmZXJlbmNlcyA9IEpwdENvcmVQbHVnaW4uZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpOworCQlpZiAocHJvYmxlbVByZWZlcmVuY2U9PW51bGwpeworCQkJcHJvamVjdFByZWZlcmVuY2VzLnJlbW92ZShtZXNzYWdlSWQpOworCQl9CisJCWVsc2UgeworCQkJcHJvamVjdFByZWZlcmVuY2VzLnB1dChtZXNzYWdlSWQsIHByb2JsZW1QcmVmZXJlbmNlKTsKKwkJfQorCQlmbHVzaChwcm9qZWN0UHJlZmVyZW5jZXMpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBTdHJpbmcgdmFsdWUgb2YgdGhlIHByb2JsZW0gcHJlZmVyZW5jZSBmcm9tIHRoZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXb3Jrc3BhY2VMZXZlbFByb2JsZW1QcmVmZXJlbmNlKFN0cmluZyBtZXNzYWdlSWQpeworCQlJRWNsaXBzZVByZWZlcmVuY2VzIHdvcmtzcGFjZVByZWZlcmVuY2VzID0gSnB0Q29yZVBsdWdpbi5nZXRXb3Jrc3BhY2VQcmVmZXJlbmNlcygpOworCQlyZXR1cm4gd29ya3NwYWNlUHJlZmVyZW5jZXMuZ2V0KG1lc3NhZ2VJZCwgbnVsbCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3Jrc3BhY2VMZXZlbFByb2JsZW1QcmVmZXJlbmNlKFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyBwcm9ibGVtUHJlZmVyZW5jZSkgeworCQlJRWNsaXBzZVByZWZlcmVuY2VzIHdvcmtzcGFjZVByZWZlcmVuY2VzID0gSnB0Q29yZVBsdWdpbi5nZXRXb3Jrc3BhY2VQcmVmZXJlbmNlcygpOworCQlpZiAocHJvYmxlbVByZWZlcmVuY2U9PW51bGwpeworCQkJd29ya3NwYWNlUHJlZmVyZW5jZXMucmVtb3ZlKG1lc3NhZ2VJZCk7CisJCX0KKwkJZWxzZSB7CisJCQl3b3Jrc3BhY2VQcmVmZXJlbmNlcy5wdXQobWVzc2FnZUlkLCBwcm9ibGVtUHJlZmVyZW5jZSk7CisJCX0KKwkJZmx1c2god29ya3NwYWNlUHJlZmVyZW5jZXMpOworCX0JCisJCisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBmbHVzaChJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzKSB7CisJCXRyeSB7CisJCQlwcmVmcy5mbHVzaCgpOworCQl9IGNhdGNoKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBleCkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQl9CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnBhVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KcGFWYWxpZGF0b3IuamF2YQppbmRleCA1MDhjMWQyLi43MjI0ODQ5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KcGFWYWxpZGF0b3IuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KcGFWYWxpZGF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMywxNDIgKzEzLDExNCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSVJlc291cmNlUGFydDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvck1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7CiAKIC8qKgogICogVGhpcyBjbGFzcyBpcyByZWZlcmVuY2VkIGluIHRoZSBKUEEgZXh0ZW5zaW9uIGZvciB0aGUKICAqIFdUUCB2YWxpZGF0b3IgZXh0ZW5zaW9uIHBvaW50LgogICovCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvckpvYiB7CitwdWJsaWMgY2xhc3MgSnBhVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKIAorCXB1YmxpYyBKcGFWYWxpZGF0b3IoKSB7CisJCXN1cGVyKCk7CisJfQogCisJCiAJLy8gKioqKioqKioqKiBJVmFsaWRhdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKIAotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyk7Ci0KLQkJZm9yIChJdGVyYXRvcjxJTWVzc2FnZT4gc3RyZWFtID0gdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMoY29udGV4dCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJdmFsaWRhdGUocmVwb3J0ZXIsIHByb2plY3QoY29udGV4dCkpOwogCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SU1lc3NhZ2U+IHZhbGlkYXRpb25NZXNzYWdlcyhJVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gKChJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0KSBjb250ZXh0KS5nZXRQcm9qZWN0KCk7Ci0JCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCkudmFsaWRhdGlvbk1lc3NhZ2VzKCk7Ci0JfQotCisJCiAJcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKIAkJLy8gbm90aGluZyB0byBkbwogCX0KLQotCi0JLy8gKioqKioqKioqKiBJVmFsaWRhdG9ySm9iIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJLy8gZG9uJ3Qga25vdyB3aGF0IHRvIHJldHVybiBoZXJlLiAgbXkgZ3Vlc3MgaXMgdGhhdCB3ZSB3YW50IHRvIHJldHVybgotCQkvLyB0aGUgcmVzb3VyY2UgdGhhdCBpcyBwb3NzaWJseSBiZWluZyBjaGFuZ2VkIGR1cmluZyBvdXIgdmFsaWRhdGlvbiwKLQkJLy8gYW5kIHNpbmNlIG1hbnkgcmVzb3VyY2VzIGluIHRoZSBwcm9qZWN0IG1heSBiZSBjaGFuZ2VkIGR1cmluZyB0aGlzCi0JCS8vIHZhbGlkYXRpb24sIHJldHVybmluZyB0aGUgcHJvamVjdCBtYWtlcyB0aGUgbW9zdCBzZW5zZS4KLQkJcmV0dXJuICgoSVdvcmtiZW5jaENvbnRleHQpIGNvbnRleHQpLmdldFByb2plY3QoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIEFic3RyYWN0VmFsaWRhdG9yIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKKwkJCXJldHVybiBudWxsOworCQlWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7CisJCUlSZXBvcnRlciByZXBvcnRlciA9IHJlc3VsdC5nZXRSZXBvcnRlcihtb25pdG9yKTsKKwkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKKwkJdHJ5IHsKKwkJCWNsZWFyTWFya2Vycyhwcm9qZWN0KTsKIAkJfQotCQl0aGlzLnZhbGlkYXRlKGNvbnRleHQsIHJlcG9ydGVyKTsKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFya2VyIGNsZWFuLXVwICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBKUEFfTU9ERUxfTElTVEVORVIgPSBuZXcgTG9jYWxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQotCXN0YXRpYyB7Ci0JCUpwdENvcmVQbHVnaW4uZ2V0SnBhTW9kZWwoKS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhTW9kZWwuSlBBX1BST0pFQ1RTX0NPTExFQ1RJT04sIEpQQV9NT0RFTF9MSVNURU5FUik7Ci0JfQotCi0JLyoqCi0JICogV2hlbiBhIEpQQSBwcm9qZWN0IGlzIHJlbW92ZWQgdGhpcyBsaXN0ZW5lciB3aWxsIHNjaGVkdWxlIGEgam9iIHRvCi0JICogcmVtb3ZlIGFsbCB0aGUgbWFya2VycyBhc3NvY2lhdGVkIHdpdGggdGhlIEpQQSBwcm9qZWN0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExvY2FsQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHsKLQotCQlMb2NhbENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlKcHRDb3JlUGx1Z2luLmxvZyhjZSk7CiAJCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJLy8gaWdub3JlCisJCXJlc3VsdC5zZXRTdXNwZW5kVmFsaWRhdGlvbihwcm9qZWN0KTsKKwkJdmFsaWRhdGUocmVwb3J0ZXIsIHByb2plY3QpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGludGVybmFsIGNvbnYuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHJpdmF0ZSB2b2lkIGNsZWFyTWFya2VycyhJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlNYXJrZXJbXSBtYXJrZXJzID0gcHJvamVjdC5maW5kTWFya2VycyhWYWxDb25zdGFudHMuUHJvYmxlbU1hcmtlciwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKKwkJU3RyaW5nIHZhbElkID0gSnB0Q29yZVBsdWdpbi5WQUxJREFUT1JfSUQ7CisJCWZvciAoSU1hcmtlciBtYXJrZXIgOiBtYXJrZXJzKSB7CisJCQlTdHJpbmcgaWQgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKFZhbGlkYXRvck1lc3NhZ2UuVmFsaWRhdGlvbklkLCBudWxsKTsKKwkJCWlmICh2YWxJZC5lcXVhbHMoaWQpKSBtYXJrZXIuZGVsZXRlKCk7CiAJCX0KLQotCQkvKioKLQkJICogRm9yIG5vdywgd2UgZXhwZWN0IEpQQSBwcm9qZWN0cyB0byBiZSByZW1vdmVkIG9uZSBhdCBhIHRpbWUuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUl0ZXJhdG9yPEpwYVByb2plY3Q+IGl0ZW1zID0gKEl0ZXJhdG9yPEpwYVByb2plY3Q+KSBldmVudC5pdGVtcygpOwotCQkJSm9iIGogPSBuZXcgRGVsZXRlTWFya2Vyc0pvYihpdGVtcy5uZXh0KCkpOwotCQkJai5zY2hlZHVsZSgpOwotCQkJaWYgKGl0ZW1zLmhhc05leHQoKSkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5leHBlY3RlZCBldmVudCIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGUoSVJlcG9ydGVyIHJlcG9ydGVyLCBJUHJvamVjdCBwcm9qZWN0KSB7CisJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMpOworCQkKKwkJZm9yIChJdGVyYXRvcjxJTWVzc2FnZT4gc3RyZWFtID0gdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMocmVwb3J0ZXIsIHByb2plY3QpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBzdHJlYW0ubmV4dCgpOworCQkJLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBpZ25vcmVkIGJhc2VkIG9uIHByZWZlcmVuY2VzCisJCQlpZiAoIUpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5pc1Byb2JsZW1JZ25vcmVkKHByb2plY3QsIG1lc3NhZ2UuZ2V0SWQoKSkpeworCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgYWRqdXN0TWVzc2FnZShtZXNzYWdlKSk7CiAJCQl9CiAJCX0KLQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCiAJfQotCi0JLyoqCi0JICogRGVsZXRlIGFsbCB0aGUgbWFya2VycyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBKUEEgcHJvamVjdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWxldGVNYXJrZXJzSm9iIGV4dGVuZHMgSm9iIHsKLQkJcHJpdmF0ZSBmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQkJRGVsZXRlTWFya2Vyc0pvYihKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJCXN1cGVyKCJEZWxldGUgTWFya2VycyIpOwotCQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5qcGFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ly9ubyBuZWVkIHRvIHJlbW92ZSBtYXJrZXJzIGlmIHByb2plY3QgaGFzIGJlZW4gY2xvc2VkCi0JCQkJdHJ5IHsKLQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBwcm9qZWN0LmZpbmRNYXJrZXJzKEpwdENvcmVQbHVnaW4uVkFMSURBVElPTl9NQVJLRVJfSUQsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5kZWxldGVNYXJrZXJzKG1hcmtlcnMpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOyAgLy8gbm90IG11Y2ggZWxzZSB3ZSBjYW4gZG8KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCisJCisJcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0KElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisJCXJldHVybiAoKElQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQpIGNvbnRleHQpLmdldFByb2plY3QoKTsKIAl9Ci0KKwkKKwlwcml2YXRlIEl0ZXJhdG9yPElNZXNzYWdlPiB2YWxpZGF0aW9uTWVzc2FnZXMoSVJlcG9ydGVyIHJlcG9ydGVyLCBJUHJvamVjdCBwcm9qZWN0KSB7CisJCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKKwkJaWYgKGpwYVByb2plY3QgIT0gbnVsbCkgeworCQkJcmV0dXJuIGpwYVByb2plY3QudmFsaWRhdGlvbk1lc3NhZ2VzKHJlcG9ydGVyKTsKKwkJfQorCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxJTWVzc2FnZT4oCisJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTk9fSlBBX1BST0pFQ1QsCisJCQlwcm9qZWN0CisJCSkpOworCX0KKwkKKwlwcml2YXRlIElNZXNzYWdlIGFkanVzdE1lc3NhZ2UoSU1lc3NhZ2UgbWVzc2FnZSkgeworCQlJQWRhcHRhYmxlIHRhcmdldE9iamVjdCA9IChJQWRhcHRhYmxlKSBtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpOworCQlJUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2UgPSAoKElSZXNvdXJjZVBhcnQpIHRhcmdldE9iamVjdC5nZXRBZGFwdGVyKElSZXNvdXJjZVBhcnQuY2xhc3MpKS5nZXRSZXNvdXJjZSgpOworCQltZXNzYWdlLnNldFRhcmdldE9iamVjdCh0YXJnZXRSZXNvdXJjZSk7CisJCWlmIChtZXNzYWdlLmdldExpbmVOdW1iZXIoKSA9PSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQpIHsKKwkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKElNYXJrZXIuTE9DQVRJT04sICIgIik7CisJCX0KKwkJcmV0dXJuIG1lc3NhZ2U7CisJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvSnBhRmFjdG9yeTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvSnBhRmFjdG9yeTJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyODM1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9KcGFGYWN0b3J5Ml8wLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZUhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRGVyaXZlZElkMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFwc0lkMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7CisKKy8qKgorICogSlBBIDIuMCBmYWN0b3J5CisgKjxwPiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5HZW5lcmljSnBhRmFjdG9yeTJfMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEpwYUZhY3RvcnkyXzAKKwlleHRlbmRzIEpwYUZhY3RvcnkKK3sKKwkKKwkvLyAqKioqKioqKioqIENvcmUgTW9kZWwgKioqKioqKioqKgorCisJTWV0YW1vZGVsU3luY2hyb25pemVyIGJ1aWxkTWV0YW1vZGVsU3luY2hyb25pemVyKEpwYVByb2plY3QyXzAganBhUHJvamVjdCk7CisKKwlQZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplciBidWlsZFBlcnNpc3RlbnRUeXBlTWV0YW1vZGVsU3luY2hyb25pemVyKFBlcnNpc3RlbnRUeXBlTWV0YW1vZGVsU3luY2hyb25pemVyLk93bmVyIG93bmVyLCBQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSk7CisKKwkKKwkvLyAqKioqKioqKioqIEphdmEgQ29udGV4dCBNb2RlbCAqKioqKioqKioqCisJCisJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcihKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIHBhcmVudCwgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciBvd25lcik7CisJCisJSmF2YURlcml2ZWRJZDJfMCBidWlsZEphdmFEZXJpdmVkSWQoSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50KTsKKwkKKwlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGJ1aWxkSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOworCQorCUphdmFNYXBzSWQyXzAgYnVpbGRKYXZhTWFwc0lkKEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHBhcmVudCk7CisJCisJSmF2YUNhY2hlYWJsZTJfMCBidWlsZEphdmFDYWNoZWFibGUoSmF2YUNhY2hlYWJsZUhvbGRlcjJfMCBwYXJlbnQpOworCQorCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgYnVpbGRKYXZhT3JwaGFuUmVtb3ZhbChKYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCBwYXJlbnQpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvSnBhUHJvamVjdDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvSnBhUHJvamVjdDJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTNjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9KcGFQcm9qZWN0Ml8wLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworCisvKioKKyAqIEpQQSAyLjAgcHJvamVjdC4KKyAqIDxwPgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSnBhUHJvamVjdDJfMAorCWV4dGVuZHMgSnBhUHJvamVjdCwgTWV0YW1vZGVsR2VuZXJhdG9yCit7CisKKwkvLyAqKioqKioqKioqIENhbm9uaWNhbCBNZXRhbW9kZWwgKioqKioqKioqKgorCisJLyoqCisJICogSUQgc3RyaW5nIHVzZWQgd2hlbiBtZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lIHByb3BlcnR5IGlzIGNoYW5nZWQuCisJICogQHNlZSAjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCisJICovCisJU3RyaW5nIE1FVEFNT0RFTF9TT1VSQ0VfRk9MREVSX05BTUVfUFJPUEVSVFkgPSAibWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZm9sZGVyIHRoYXQgaG9sZHMgdGhlIGdlbmVyYXRlZCBDYW5vbmljYWwKKwkgKiBNZXRhbW9kZWwuCisJICovCisJU3RyaW5nIGdldE1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUoKTsKKworCS8qKgorCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgZm9sZGVyIHRoYXQgaG9sZHMgdGhlIGdlbmVyYXRlZCBDYW5vbmljYWwKKwkgKiBNZXRhbW9kZWwuCisJICovCisJdm9pZCBzZXRNZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKFN0cmluZyBtZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgcGFja2FnZSBmcmFnbWVudCByb290IHRoYXQgaG9sZHMgdGhlIGdlbmVyYXRlZCBDYW5vbmljYWwKKwkgKiBNZXRhbW9kZWwuCisJICovCisJSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0TWV0YW1vZGVsUGFja2FnZUZyYWdtZW50Um9vdCgpOworCisJLyoqCisJICogU3luY2hyb25pemUgdGhlIHNvdXJjZSBmb3IgdGhlIG1ldGFtb2RlbCBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZQorCSAqIHNwZWNpZmllZCBwZXJzaXN0ZW50IHR5cGUuCisJICovCisJdm9pZCBzeW5jaHJvbml6ZU1ldGFtb2RlbChQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgSmF2YSBzb3VyY2UgZm9sZGVycyAodGhhdAorCSAqIGNhbiBiZSB1c2VkIHRvIGhvbGQgdGhlIGdlbmVyYXRlZCBDYW5vbmljYWwgTWV0YW1vZGVsKS4KKwkgKi8KKwlJdGVyYWJsZTxTdHJpbmc+IGdldFNvdXJjZUZvbGRlck5hbWVzKCk7CisKKworCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uIGNvbmZpZyAqKioqKioqKioqCisKKwkvKioKKwkgKiBUaGUgc2V0dGluZ3MgdXNlZCB0byBjb25zdHJ1Y3QgYSBKUEEgMi4wIHByb2plY3QuCisJICovCisJaW50ZXJmYWNlIENvbmZpZyBleHRlbmRzIEpwYVByb2plY3QuQ29uZmlnIHsKKworCQkvKioKKwkJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgdGhhdCBob2xkcyB0aGUgZ2VuZXJhdGVkIENhbm9uaWNhbAorCQkgKiBNZXRhbW9kZWwuIFJldHVybiBudWxsIGlmIHRoZSBDYW5vbmljYWwgTWV0YW1vZGVsIGlzIG5vdCB0byBiZQorCQkgKiBnZW5lcmF0ZWQuCisJCSAqLworCQlTdHJpbmcgZ2V0TWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSgpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9NYXBwaW5nS2V5czJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvTWFwcGluZ0tleXMyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODc2NzA2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvTWFwcGluZ0tleXMyXzAuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTI7CisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBpbnRlcmZhY2UgTWFwcGluZ0tleXMyXzAgeworCisJU3RyaW5nIEVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAiZWxlbWVudENvbGxlY3Rpb24iOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvTWV0YW1vZGVsR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9NZXRhbW9kZWxHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA2MmE0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvTWV0YW1vZGVsR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyOworCisvKioKKyAqIEpQQSAyLjAgQ2Fub25pY2FsIE1ldGFtb2RlbCBHZW5lcmF0b3IuCisgKiA8cD4KKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE1ldGFtb2RlbEdlbmVyYXRvciB7CisKKwkvKioKKwkgKiBTeW5jaHJvbml6ZSB0aGUgSlBBICJDYW5vbmljYWwgTWV0YW1vZGVsIENsYXNzZXMiIHdpdGggdGhlIGNvbnRleHQgbW9kZWwuCisJICovCisJdm9pZCBzeW5jaHJvbml6ZU1ldGFtb2RlbCgpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9NZXRhbW9kZWxTeW5jaHJvbml6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL01ldGFtb2RlbFN5bmNocm9uaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkN2FjMWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9NZXRhbW9kZWxTeW5jaHJvbml6ZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworCisvKioKKyAqIEpQQSAyLjAgQ2Fub25pY2FsIE1ldGFtb2RlbC4KKyAqIDxwPgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWV0YW1vZGVsU3luY2hyb25pemVyIHsKKworCXZvaWQgc3luY2hyb25pemUoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9QZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvUGVyc2lzdGVudFR5cGVNZXRhbW9kZWxTeW5jaHJvbml6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGUyZDljCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvUGVyc2lzdGVudFR5cGVNZXRhbW9kZWxTeW5jaHJvbml6ZXIuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKKworLyoqCisgKiBKUEEgMi4wIENhbm9uaWNhbCBNZXRhbW9kZWwuCisgKiA8cD4KKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbnRUeXBlTWV0YW1vZGVsU3luY2hyb25pemVyIHsKKworCXZvaWQgc3luY2hyb25pemUoKTsKKworCWludGVyZmFjZSBPd25lciB7CisJCUlQYWNrYWdlRnJhZ21lbnRSb290IGdldFNvdXJjZUZvbGRlcigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L0Fzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmE2MjZhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwUmVmZXJlbmNlOworCisvKioKKyAqIEFuIDxjb2RlPkFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA8L2NvZGU+IGlzIGEgdHlwZSBvZiAKKyAqIHtAbGluayBSZWxhdGlvbnNoaXBSZWZlcmVuY2V9IHRoYXQgbWF5IHV0aWxpemUgYSAKKyAqIHtAbGluayBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5fSBvcgorICoge0BsaW5rIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneX0KKyAqIDxwPgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEBzZWUgQXNzb2NpYXRpb25PdmVycmlkZQorICovCitwdWJsaWMgaW50ZXJmYWNlIEFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAgCisJZXh0ZW5kcyAKKwkJQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwKKwkJSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZQoreworCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9BdHRyaWJ1dGVNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L0F0dHJpYnV0ZU1hcHBpbmcyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWMxODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9BdHRyaWJ1dGVNYXBwaW5nMl8wLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7CisKKy8qKgorICogSlBBIDIuMCBhdHRyaWJ1dGUgbWFwcGluZworICogPHA+CisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGVNYXBwaW5nMl8wCisJZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nCit7CisJLyoqCisJICogUmV0dXJuIHRoZSBDYW5vbmljYWwgTWV0YW1vZGVsIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1hcHBpbmcuCisJICogUmV0dXJuIG51bGwgaWYgdGhlIG1hcHBpbmcgaXMgbm90IHRvIGJlIHBhcnQgb2YgdGhlIENhbm9uaWNhbCBNZXRhbW9kZWwuCisJICovCisJTWV0YW1vZGVsRmllbGQgZ2V0TWV0YW1vZGVsRmllbGQoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWFwcGluZydzIHR5cGUgYXMgdXNlZCBpbiB0aGUgQ2Fub25pY2FsIE1ldGFtb2RlbC4KKwkgKi8KKwlTdHJpbmcgZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKTsKKworCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorCUl0ZXJhYmxlPFN0cmluZz4gU1RBTkRBUkRfTUVUQU1PREVMX0ZJRUxEX01PRElGSUVSUyA9CisJCW5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4obmV3IFN0cmluZ1tdIHsgInB1YmxpYyIsICJzdGF0aWMiLCAidm9sYXRpbGUiIH0pOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L0NhY2hlYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9DYWNoZWFibGUyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDdlYTEyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9DYWNoZWFibGUyXzAuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7CisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBDYWNoZWFibGUyXzAgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQoreworCWJvb2xlYW4gaXNDYWNoZWFibGUoKTsKKwkKKwlib29sZWFuIGlzRGVmYXVsdENhY2hlYWJsZSgpOworCQlTdHJpbmcgREVGQVVMVF9DQUNIRUFCTEVfUFJPUEVSVFkgPSAiZGVmYXVsdENhY2hlYWJsZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwlCb29sZWFuIGdldFNwZWNpZmllZENhY2hlYWJsZSgpOworCXZvaWQgc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4gbmV3U3BlY2lmaWVkQ2FjaGVhYmxlKTsKKwkJU3RyaW5nIFNQRUNJRklFRF9DQUNIRUFCTEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ2FjaGVhYmxlIjsgLy8kTk9OLU5MUy0xJAorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9DYWNoZWFibGVIb2xkZXIyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvQ2FjaGVhYmxlSG9sZGVyMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4ODdjZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvQ2FjaGVhYmxlSG9sZGVyMl8wLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2FjaGVhYmxlSG9sZGVyMl8wIGV4dGVuZHMgSnBhTm9kZQoreworCUNhY2hlYWJsZTJfMCBnZXRDYWNoZWFibGUoKTsKKwkKKwlib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvRGVyaXZlZElkMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L0Rlcml2ZWRJZDJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OWI3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L0Rlcml2ZWRJZDJfMC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIERlcml2ZWRJZDJfMAorCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKK3sKKwkvKioKKwkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHZhbHVlIHByb3BlcnR5IG9mIHRoaXMgb2JqZWN0CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhpcyBvYmplY3QgdXNlcyBhIGRlcml2ZWQgaWQKKwkgKi8KKwlib29sZWFuIGdldFZhbHVlKCk7CisJCisJLyoqCisJICogU2V0IHdoZXRoZXIgdGhpcyBvYmplY3QgdXNlcyBhIGRlcml2ZWQgaWQKKwkgKi8KKwl2b2lkIHNldFZhbHVlKGJvb2xlYW4gbmV3VmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljNDIwZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaGFibGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wCisJZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nMl8wLCBGZXRjaGFibGUKK3sKKwlGZXRjaFR5cGUgREVGQVVMVF9GRVRDSF9UWVBFID0gRmV0Y2hUeXBlLkxBWlk7CQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9FbWJlZGRlZE1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvRW1iZWRkZWRNYXBwaW5nMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlNjA1ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvRW1iZWRkZWRNYXBwaW5nMl8wLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworIHB1YmxpYyBpbnRlcmZhY2UgRW1iZWRkZWRNYXBwaW5nMl8wCisJZXh0ZW5kcyBFbWJlZGRlZE1hcHBpbmcKK3sKKwlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvTWFueVRvT25lTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9NYW55VG9PbmVNYXBwaW5nMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViYTNlZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvTWFueVRvT25lTWFwcGluZzJfMC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWFueVRvT25lTWFwcGluZzJfMAorCWV4dGVuZHMgTWFueVRvT25lTWFwcGluZywgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMAore30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvTWFwc0lkMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L01hcHNJZDJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzQwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L01hcHNJZDJfMC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWFwc0lkMl8wIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKK3sKKwkvKioKKwkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHZhbHVlIHByb3BlcnR5IG9mIHRoaXMgb2JqZWN0CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBpZCB0aGlzIG9iamVjdCBtYXBzCisJICovCisJU3RyaW5nIGdldFZhbHVlKCk7CisJCisJLyoqCisJICogU2V0IHRoZSBpZCB0aGlzIG9iamVjdCBtYXBzCisJICovCisJdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9NZXRhbW9kZWxGaWVsZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9NZXRhbW9kZWxGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwODNiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L01ldGFtb2RlbEZpZWxkLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQ7CisKKy8qKgorICogSlBBIDIuMCBDYW5vbmljYWwgTWV0YW1vZGVsIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gYSBwZXJzaXN0ZW50IGF0dHJpYnV0ZS4KKyAqIDxwPgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWV0YW1vZGVsRmllbGQgeworCisJSXRlcmFibGU8U3RyaW5nPiBnZXRNb2RpZmllcnMoKTsKKworCVN0cmluZyBnZXRUeXBlTmFtZSgpOworCisJSXRlcmFibGU8U3RyaW5nPiBnZXRUeXBlQXJndW1lbnROYW1lcygpOworCisJU3RyaW5nIGdldE5hbWUoKTsKKworCVN0cmluZyBERUZBVUxUX1RZUEVfTkFNRSA9IGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpOyAgLy8gPz8/CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvT25lVG9NYW55TWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9PbmVUb01hbnlNYXBwaW5nMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3OTQyNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvT25lVG9NYW55TWFwcGluZzJfMC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT25lVG9NYW55TWFwcGluZzJfMAorCWV4dGVuZHMgT25lVG9NYW55TWFwcGluZwore30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvT25lVG9PbmVNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L09uZVRvT25lTWFwcGluZzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZjE2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L09uZVRvT25lTWFwcGluZzJfMC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9uZVRvT25lTWFwcGluZzJfMAorCWV4dGVuZHMgT25lVG9PbmVNYXBwaW5nLCBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wCit7fQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9PcnBoYW5SZW1vdmFibGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvT3JwaGFuUmVtb3ZhYmxlMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0NWViOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvT3JwaGFuUmVtb3ZhYmxlMl8wLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ycGhhblJlbW92YWJsZTJfMAorCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKK3sKKwlib29sZWFuIGlzT3JwaGFuUmVtb3ZhbCgpOworCisJYm9vbGVhbiBpc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCk7CisJCVN0cmluZyBERUZBVUxUX09SUEhBTl9SRU1PVkFMX1BST1BFUlRZID0gImRlZmF1bHRPcnBoYW5SZW1vdmFsIjsgLy8kTk9OLU5MUy0xJAorCQlib29sZWFuIERFRkFVTFRfT1JQSEFOX1JFTU9WQUwgPSBmYWxzZTsKKworCUJvb2xlYW4gZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpOworCXZvaWQgc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuIG5ld1NwZWNpZmllZE9ycGhhblJlbW92YWwpOworCQlTdHJpbmcgU1BFQ0lGSUVEX09SUEhBTl9SRU1PVkFMX1BST1BFUlRZID0gInNwZWNpZmllZE9ycGhhblJlbW92YWwiOyAvLyROT04tTkxTLTEkCisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9PcnBoYW5SZW1vdmFsSG9sZGVyMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwOGJlOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBPcnBoYW5SZW1vdmFsSG9sZGVyMl8wIGV4dGVuZHMgSnBhTm9kZQoreworCU9ycGhhblJlbW92YWJsZTJfMCBnZXRPcnBoYW5SZW1vdmFsKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L1NlcXVlbmNlR2VuZXJhdG9yMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L1NlcXVlbmNlR2VuZXJhdG9yMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyMDdmMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvU2VxdWVuY2VHZW5lcmF0b3IyXzAuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKKworLyoqCisgKiAgU2VxdWVuY2VHZW5lcmF0b3IyXzAKKyAqLworcHVibGljIGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvcjJfMCBleHRlbmRzIFNlcXVlbmNlR2VuZXJhdG9yCit7CisJLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNhdGFsb2cgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdAorCSAqIGNhdGFsb2cuCisJICovCisJU3RyaW5nIGdldENhdGFsb2coKTsKKwlTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOworCXZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgdmFsdWUpOworCQlTdHJpbmcgU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKTsKKwkJU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSA9ICJkZWZhdWx0Q2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKKworCisJLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgorCS8qKgorCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHNjaGVtYSBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0CisJICogc2NoZW1hLgorCSAqLworCVN0cmluZyBnZXRTY2hlbWEoKTsKKwlTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCk7CisJdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIHZhbHVlKTsKKwkJU3RyaW5nIFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkgPSAic3BlY2lmaWVkU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCk7CisJCVN0cmluZyBERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSA9ICJkZWZhdWx0U2NoZW1hIjsgLy8kTk9OLU5MUy0xJAorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L1NpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MTFjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L1NpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAKKwlleHRlbmRzIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKK3sKKwlEZXJpdmVkSWQyXzAgZ2V0RGVyaXZlZElkKCk7CisJCisJTWFwc0lkMl8wIGdldE1hcHNJZCgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2RiYjY5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247CisKKy8qKgorICogQW4gPGNvZGU+QXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTwvY29kZT4gaXMgYSB0eXBlIG9mIAorICoge0BsaW5rIFJlbGF0aW9uc2hpcFJlZmVyZW5jZX0gdGhhdCBtYXkgdXRpbGl6ZSBhIAorICoge0BsaW5rIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3l9CisgKiA8cD4KKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcKKyAqLworcHVibGljIGludGVyZmFjZSBKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCAKKwlleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAsIEphdmFKcGFDb250ZXh0Tm9kZQoreworCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKKwkKKwlKYXZhSm9pblRhYmxlSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5Ml8wIGdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOworCisJdm9pZCBpbml0aWFsaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQorCXZvaWQgdXBkYXRlKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFDYWNoZWFibGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQ2FjaGVhYmxlMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFlMTgwZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQ2FjaGVhYmxlMl8wLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YUNhY2hlYWJsZTJfMAorCWV4dGVuZHMgSmF2YUpwYUNvbnRleHROb2RlLCBDYWNoZWFibGUyXzAKKworeworCS8qKgorCSAqIEluaXRpYWxpemUgbW9kZWwgd2l0aG91dCB0aHJvd2luZyBhbnkgZXZlbnRzCisJICovCisJdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpOworCQorCS8qKgorCSAqIFVwZGF0ZSBtb2RlbCwgdGhyb3dpbmcgZXZlbnRzIGFzIG5lY2Vzc2FyeQorCSAqLworCXZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFDYWNoZWFibGVIb2xkZXIyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQ2FjaGVhYmxlSG9sZGVyMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzNDBmNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQ2FjaGVhYmxlSG9sZGVyMl8wLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKKworLyoqCisgKiAKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFDYWNoZWFibGVIb2xkZXIyXzAgZXh0ZW5kcyBDYWNoZWFibGVIb2xkZXIyXzAsIEphdmFKcGFDb250ZXh0Tm9kZQoreworCUphdmFDYWNoZWFibGUyXzAgZ2V0Q2FjaGVhYmxlKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YURlcml2ZWRJZDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFEZXJpdmVkSWQyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWFiNmM1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFEZXJpdmVkSWQyXzAuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkRlcml2ZWRJZDJfMDsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YURlcml2ZWRJZDJfMAorCWV4dGVuZHMgSmF2YUpwYUNvbnRleHROb2RlLCBEZXJpdmVkSWQyXzAKK3sKKwkvKioKKwkgKiBJbml0aWFsaXplIG1vZGVsIHdpdGhvdXQgdGhyb3dpbmcgYW55IGV2ZW50cworCSAqLworCXZvaWQgaW5pdGlhbGl6ZSgpOworCQorCS8qKgorCSAqIFVwZGF0ZSBtb2RlbCwgdGhyb3dpbmcgZXZlbnRzIGFzIG5lY2Vzc2FyeQorCSAqLworCXZvaWQgdXBkYXRlKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjZiZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wCisJZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZywgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wCit7fQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZE1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxNDMyOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nMl8wLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzJfMDsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YUVtYmVkZGVkTWFwcGluZzJfMAorCWV4dGVuZHMgSmF2YUVtYmVkZGVkTWFwcGluZywgRW1iZWRkZWRNYXBwaW5nMl8wCit7CisJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFKb2luVGFibGVJbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhSm9pblRhYmxlSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5Ml8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1ZTkyNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhSm9pblRhYmxlSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5Ml8wLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uOworCitwdWJsaWMgaW50ZXJmYWNlIEphdmFKb2luVGFibGVJbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kyXzAgCisJZXh0ZW5kcyAKKwkJSmF2YUpwYUNvbnRleHROb2RlLAorCQlKYXZhSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5Cit7CisJCisJdm9pZCBpbml0aWFsaXplKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQorCXZvaWQgdXBkYXRlKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNmU3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzJfMDsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAKKwlleHRlbmRzIEphdmFNYW55VG9PbmVNYXBwaW5nLCBNYW55VG9PbmVNYXBwaW5nMl8wLCBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMAore30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFwc0lkMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hcHNJZDJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0Y2IxYjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hcHNJZDJfMC5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NYXBzSWQyXzA7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFNYXBzSWQyXzAKKwlleHRlbmRzIEphdmFKcGFDb250ZXh0Tm9kZSwgTWFwc0lkMl8wCit7CisJLyoqCisJICogSW5pdGlhbGl6ZSBtb2RlbCB3aXRob3V0IHRocm93aW5nIGFueSBldmVudHMKKwkgKi8KKwl2b2lkIGluaXRpYWxpemUoKTsKKwkKKwkvKioKKwkgKiBVcGRhdGUgbW9kZWwsIHRocm93aW5nIGV2ZW50cyBhcyBuZWNlc3NhcnkKKwkgKi8KKwl2b2lkIHVwZGF0ZSgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2VhMDJhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nMl8wLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nMl8wOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBKYXZhT25lVG9NYW55TWFwcGluZzJfMAorCWV4dGVuZHMgSmF2YU9uZVRvTWFueU1hcHBpbmcsIE9uZVRvTWFueU1hcHBpbmcyXzAKK3t9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk1NWQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nMl8wLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nMl8wOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBKYXZhT25lVG9PbmVNYXBwaW5nMl8wCisJZXh0ZW5kcyBKYXZhT25lVG9PbmVNYXBwaW5nLCBPbmVUb09uZU1hcHBpbmcyXzAsIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wCit7fQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFPcnBoYW5SZW1vdmFibGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT3JwaGFuUmVtb3ZhYmxlMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5ZTE5MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT3JwaGFuUmVtb3ZhYmxlMl8wLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YU9ycGhhblJlbW92YWJsZTJfMAorCWV4dGVuZHMgSmF2YUpwYUNvbnRleHROb2RlLCBPcnBoYW5SZW1vdmFibGUyXzAKK3sKKwkvKioKKwkgKiBJbml0aWFsaXplIG1vZGVsIHdpdGhvdXQgdGhyb3dpbmcgYW55IGV2ZW50cworCSAqLworCXZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpOworCQorCS8qKgorCSAqIFVwZGF0ZSBtb2RlbCwgdGhyb3dpbmcgZXZlbnRzIGFzIG5lY2Vzc2FyeQorCSAqLworCXZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NGI0MTkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzAuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBKYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCBleHRlbmRzIE9ycGhhblJlbW92YWxIb2xkZXIyXzAsIEphdmFKcGFDb250ZXh0Tm9kZQoreworCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbCgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTUwZjc2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKKworLyoqCisgKiBKUEEgMi4wIEphdmEgcGVyc2lzdGVudCBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KQorICogPHA+CisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMAorCWV4dGVuZHMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUKK3sKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0eXBlIHRvIGJlIHVzZWQgaW4gdGhlIG1ldGFtb2RlbCBmaWVsZAorCSAqIGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGF0dHJpYnV0ZSdzIG1hcHBpbmcuCisJICovCisJU3RyaW5nIGdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIG1hcCBrZXkgdHlwZSB0byBiZSB1c2VkIGluIHRoZQorCSAqIG1ldGFtb2RlbCBmaWVsZCBkZWNsYXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBhdHRyaWJ1dGUncyBtYXBwaW5nLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBhdHRyaWJ1dGUncyB0eXBlIGlzIG5vdCB7QGxpbmsgamF2YS51dGlsLk1hcH0uCisJICovCisJU3RyaW5nIGdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkTWFwS2V5VHlwZU5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgYXR0cmlidXRlJ3MgdHlwZSBuYW1lIGZvciB0aGUgbWV0YW1vZGVsLgorCSAqLworCVN0cmluZyBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWVjYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LlNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wCisJZXh0ZW5kcyBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZywgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMAoreworCXB1YmxpYyBKYXZhRGVyaXZlZElkMl8wIGdldERlcml2ZWRJZCgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMmRjM2YKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CisKKy8qKgorICogQW4gPGNvZGU+QXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTwvY29kZT4gaXMgYSB0eXBlIG9mIAorICoge0BsaW5rIFJlbGF0aW9uc2hpcFJlZmVyZW5jZX0gdGhhdCBtYXkgdXRpbGl6ZSBhIAorICoge0BsaW5rIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3l9CisgKiA8cD4KKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcKKyAqLworcHVibGljIGludGVyZmFjZSBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wIAorCWV4dGVuZHMgCisJCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UsCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAsIAorCQlYbWxDb250ZXh0Tm9kZQoreworCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpOworCQorCU9ybUpvaW5UYWJsZUluQXNzb2NpYXRpb25PdmVycmlkZUpvaW5pbmdTdHJhdGVneTJfMCBnZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKKworCXZvaWQgdXBkYXRlKFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeGFvKTsKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUNhY2hlYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtQ2FjaGVhYmxlMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4YzY5NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUNhY2hlYWJsZTJfMC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKKworLyoqCisgKiAKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ybUNhY2hlYWJsZTJfMAorCWV4dGVuZHMgWG1sQ29udGV4dE5vZGUsIENhY2hlYWJsZTJfMAorewkKKwkvKioKKwkgKiBVcGRhdGUgbW9kZWwsIHRocm93aW5nIGV2ZW50cyBhcyBuZWNlc3NhcnkKKwkgKi8KKwl2b2lkIHVwZGF0ZSgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtQ2FjaGVhYmxlSG9sZGVyMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1DYWNoZWFibGVIb2xkZXIyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA4Mjc0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtQ2FjaGVhYmxlSG9sZGVyMl8wLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3JtQ2FjaGVhYmxlSG9sZGVyMl8wIGV4dGVuZHMgQ2FjaGVhYmxlSG9sZGVyMl8wLCBYbWxDb250ZXh0Tm9kZQoreworCU9ybUNhY2hlYWJsZTJfMCBnZXRDYWNoZWFibGUoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybURlcml2ZWRJZDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtRGVyaXZlZElkMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxYTA3NQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybURlcml2ZWRJZDJfMC5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5EZXJpdmVkSWQyXzA7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ybURlcml2ZWRJZDJfMCAKKwlleHRlbmRzIFhtbENvbnRleHROb2RlLCBEZXJpdmVkSWQyXzAKK3sKKwl2b2lkIHVwZGF0ZSgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTg0NTMzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wCisJZXh0ZW5kcyBPcm1BdHRyaWJ1dGVNYXBwaW5nLCBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAKK3t9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkTWFwcGluZzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNDgyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmcyXzAuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzJfMDsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3JtRW1iZWRkZWRNYXBwaW5nMl8wCisJZXh0ZW5kcyBPcm1FbWJlZGRlZE1hcHBpbmcsIEVtYmVkZGVkTWFwcGluZzJfMAoreworCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtSm9pblRhYmxlSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1Kb2luVGFibGVJbkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luaW5nU3RyYXRlZ3kyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjZkMGJhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtSm9pblRhYmxlSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5Ml8wLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgT3JtSm9pblRhYmxlSW5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbmluZ1N0cmF0ZWd5Ml8wIAorCWV4dGVuZHMgCisJCVhtbENvbnRleHROb2RlLAorCQlPcm1Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3kKK3sKKwl2b2lkIHVwZGF0ZShYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZSk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkODU1MQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmcyXzAuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzJfMDsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3JtTWFueVRvT25lTWFwcGluZzJfMAorCWV4dGVuZHMgT3JtTWFueVRvT25lTWFwcGluZywgTWFueVRvT25lTWFwcGluZzJfMCwgT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMAore30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hcHNJZDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtTWFwc0lkMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzOWNjNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hcHNJZDJfMC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk1hcHNJZDJfMDsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3JtTWFwc0lkMl8wCisJZXh0ZW5kcyBYbWxDb250ZXh0Tm9kZSwgTWFwc0lkMl8wCit7CisJdm9pZCB1cGRhdGUoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmcyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzZmOGQxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtT25lVG9NYW55TWFwcGluZzJfMC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzJfMDsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3JtT25lVG9NYW55TWFwcGluZzJfMAorCWV4dGVuZHMgT3JtT25lVG9NYW55TWFwcGluZywgT25lVG9NYW55TWFwcGluZzJfMAore30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtT25lVG9PbmVNYXBwaW5nMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExZmRhOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZzJfMC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzJfMDsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3JtT25lVG9PbmVNYXBwaW5nMl8wCisJZXh0ZW5kcyBPcm1PbmVUb09uZU1hcHBpbmcsIE9uZVRvT25lTWFwcGluZzJfMCwgT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMAore30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9ycGhhblJlbW92YWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtT3JwaGFuUmVtb3ZhYmxlMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3MTIxNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9ycGhhblJlbW92YWJsZTJfMC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhYmxlMl8wOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBPcm1PcnBoYW5SZW1vdmFibGUyXzAKKwlleHRlbmRzIFhtbENvbnRleHROb2RlLCBPcnBoYW5SZW1vdmFibGUyXzAKK3sJCisJLyoqCisJICogVXBkYXRlIG1vZGVsLCB0aHJvd2luZyBldmVudHMgYXMgbmVjZXNzYXJ5CisJICovCisJdm9pZCB1cGRhdGUoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9ycGhhblJlbW92YWxIb2xkZXIyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9ycGhhblJlbW92YWxIb2xkZXIyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTZhNWIyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKKworLyoqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCBleHRlbmRzIE9ycGhhblJlbW92YWxIb2xkZXIyXzAsIFhtbENvbnRleHROb2RlCit7CisJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWwoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVNlcXVlbmNlR2VuZXJhdG9yMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzgzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yMl8wOworCisvKioKKyAqICBTZXF1ZW5jZUdlbmVyYXRvcjJfMAorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ybVNlcXVlbmNlR2VuZXJhdG9yMl8wIGV4dGVuZHMgU2VxdWVuY2VHZW5lcmF0b3IyXzAsIE9ybVNlcXVlbmNlR2VuZXJhdG9yCit7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjU2MzM2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMC5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wCisJZXh0ZW5kcyBPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLCBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wCit7CisJcHVibGljIE9ybURlcml2ZWRJZDJfMCBnZXREZXJpdmVkSWQoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU4ZDMxYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcnBoYW5SZW1vdmFibGUyXzA7CisKK3B1YmxpYyBpbnRlcmZhY2UgT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5IGV4dGVuZHMgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5Cit7CisJLy8gKioqKioqKioqKiBPUk0gQ29udGV4dCBNb2RlbCAqKioqKioqKioqCisJCisJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBidWlsZE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoCisJCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgcGFyZW50LCAKKwkJCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuT3duZXIgb3duZXIsIAorCQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciByZXNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIpOworCQorCU9ybURlcml2ZWRJZDJfMCBidWlsZE9ybURlcml2ZWRJZCgKKwkJCU9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50LCBYbWxEZXJpdmVkSWRfMl8wIHJlc291cmNlKTsKKwkKKwlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYnVpbGRPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoCisJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sRWxlbWVudENvbGxlY3Rpb24gcmVzb3VyY2VNYXBwaW5nKTsKKwkKKwlPcm1NYXBzSWQyXzAgYnVpbGRPcm1NYXBzSWQoCisJCQlPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHBhcmVudCwgWG1sTWFwc0lkXzJfMCByZXNvdXJjZSk7CisJCisJWG1sRWxlbWVudENvbGxlY3Rpb24gYnVpbGRWaXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24yXzAoCisJCQlPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhTWFwcGluZyk7CisJCisJT3JtQ2FjaGVhYmxlMl8wIGJ1aWxkT3JtQ2FjaGVhYmxlKE9ybUNhY2hlYWJsZUhvbGRlcjJfMCBwYXJlbnQsIFhtbENhY2hlYWJsZTJfMCByZXNvdXJjZSk7CisJCisJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkT3JtT3JwaGFuUmVtb3ZhbChPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wIHBhcmVudCwgWG1sT3JwaGFuUmVtb3ZhYmxlMl8wIHJlc291cmNlKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdDJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNzUyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdDJfMC5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuSnBhT3B0aW9uczJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuVmFsaWRhdGlvbk1vZGU7CisKKy8qKgorICogSlBBIDIuMCA8Y29kZT5wZXJzaXN0ZW5jZS11bml0PC9jb2RlPgorICogPHA+CisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZVVuaXQyXzAKKwlleHRlbmRzIFBlcnNpc3RlbmNlVW5pdAoreworCisJLy8gKioqKioqKioqKiBzaGFyZWQgY2FjaGUgbW9kZSAqKioqKioqKioqCisKKwkvKiogCisJICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3Mgc2hhcmVkIGNhY2hlIG1vZGUsCisJICogd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkLgorCSAqLworCVNoYXJlZENhY2hlTW9kZSBnZXRTaGFyZWRDYWNoZU1vZGUoKTsKKworCS8qKgorCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIAorCSAqIHNwZWNpZmllZCBzaGFyZWQgY2FjaGUgbW9kZQorCSAqLworCVN0cmluZyBTUEVDSUZJRURfU0hBUkVEX0NBQ0hFX01PREVfUFJPUEVSVFkgPSAic3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqIAorCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHNwZWNpZmllZCBzaGFyZWQgY2FjaGUgbW9kZS4KKwkgKi8KKwlTaGFyZWRDYWNoZU1vZGUgZ2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKCk7CisKKwkvKiogCisJICogU2V0IHRoZSBwZXJzaXN0ZW5jZSB1bml0J3Mgc3BlY2lmaWVkIHNoYXJlZCBjYWNoZSBtb2RlLgorCSAqLworCXZvaWQgc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZSBzaGFyZWRDYWNoZU1vZGUpOworCisJLyoqCisJICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgCisJICogZGVmYXVsdCBzaGFyZWQgY2FjaGUgbW9kZSAobm90IHR5cGljYWxseSBjaGFuZ2VkKS4KKwkgKi8KKwlTdHJpbmcgREVGQVVMVF9TSEFSRURfQ0FDSEVfTU9ERV9QUk9QRVJUWSA9ICJkZWZhdWx0U2hhcmVkQ2FjaGVNb2RlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqIAorCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGRlZmF1bHQgc2hhcmVkIGNhY2hlIG1vZGUuCisJICovCisJU2hhcmVkQ2FjaGVNb2RlIGdldERlZmF1bHRTaGFyZWRDYWNoZU1vZGUoKTsKKworCWJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOworCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uIG1vZGUgKioqKioqKioqKgorCisJLyoqIAorCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHZhbGlkYXRpb24gbW9kZSwKKwkgKiB3aGV0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQuCisJICovCisJVmFsaWRhdGlvbk1vZGUgZ2V0VmFsaWRhdGlvbk1vZGUoKTsKKworCS8qKgorCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIAorCSAqIHNwZWNpZmllZCB2YWxpZGF0aW9uIG1vZGUKKwkgKi8KKwlTdHJpbmcgU1BFQ0lGSUVEX1ZBTElEQVRJT05fTU9ERV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKiAKKwkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBzcGVjaWZpZWQgdmFsaWRhdGlvbiBtb2RlLgorCSAqLworCVZhbGlkYXRpb25Nb2RlIGdldFNwZWNpZmllZFZhbGlkYXRpb25Nb2RlKCk7CisKKwkvKiogCisJICogU2V0IHRoZSBwZXJzaXN0ZW5jZSB1bml0J3Mgc3BlY2lmaWVkIHZhbGlkYXRpb24gbW9kZS4KKwkgKi8KKwl2b2lkIHNldFNwZWNpZmllZFZhbGlkYXRpb25Nb2RlKFZhbGlkYXRpb25Nb2RlIHZhbGlkYXRpb25Nb2RlKTsKKworCS8qKgorCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIAorCSAqIGRlZmF1bHQgdmFsaWRhdGlvbiBtb2RlIChub3QgdHlwaWNhbGx5IGNoYW5nZWQpLgorCSAqLworCVN0cmluZyBERUZBVUxUX1ZBTElEQVRJT05fTU9ERV9QUk9QRVJUWSA9ICJkZWZhdWx0VmFsaWRhdGlvbk1vZGUiOyAvLyROT04tTkxTLTEkCisKKwkvKiogCisJICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgZGVmYXVsdCB2YWxpZGF0aW9uIG1vZGUuCisJICovCisJVmFsaWRhdGlvbk1vZGUgZ2V0RGVmYXVsdFZhbGlkYXRpb25Nb2RlKCk7CisJCisJVmFsaWRhdGlvbk1vZGUgREVGQVVMVF9WQUxJREFUSU9OX01PREUgPSBWYWxpZGF0aW9uTW9kZS5BVVRPOworCisKKwkvLyAqKioqKioqKioqIHByb3BlcnRpZXMgKioqKioqKioqKgorCisJSnBhQ29ubmVjdGlvbjJfMCBnZXRDb25uZWN0aW9uKCk7CisKKwlKcGFPcHRpb25zMl8wIGdldE9wdGlvbnMoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KcGFDb25uZWN0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSnBhQ29ubmVjdGlvbjJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZGUzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSnBhQ29ubmVjdGlvbjJfMC5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKKworLyoqCisgKiAgSnBhQ29ubmVjdGlvbjJfMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEpwYUNvbm5lY3Rpb24yXzAgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCit7CQkKKwlTdHJpbmcgZ2V0RGVmYXVsdERyaXZlcigpOworCVN0cmluZyBnZXREcml2ZXIoKTsKKwl2b2lkIHNldERyaXZlcihTdHJpbmcgbmV3RHJpdmVyKTsKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfUFJPUEVSVFkgPSAiZHJpdmVyIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBQcm9wZXJ0eSBrZXkKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9KREJDX0RSSVZFUiA9ICJqYXZheC5wZXJzaXN0ZW5jZS5qZGJjLmRyaXZlciI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0pEQkNfRFJJVkVSID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCisJU3RyaW5nIGdldERlZmF1bHRVcmwoKTsKKwlTdHJpbmcgZ2V0VXJsKCk7CisJdm9pZCBzZXRVcmwoU3RyaW5nIG5ld1VybCk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1BST1BFUlRZID0gInVybCI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gUHJvcGVydHkga2V5CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfSkRCQ19VUkwgPSAiamF2YXgucGVyc2lzdGVuY2UuamRiYy51cmwiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KREJDX1VSTCA9ICIiOyAvLyROT04tTkxTLTEkCisJCQorCVN0cmluZyBnZXREZWZhdWx0VXNlcigpOworCVN0cmluZyBnZXRVc2VyKCk7CisJdm9pZCBzZXRVc2VyKFN0cmluZyBuZXdVc2VyKTsKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1BST1BFUlRZID0gInVzZXIiOyAvLyROT04tTkxTLTEkCisJCS8vIFByb3BlcnR5IGtleQorCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX0pEQkNfVVNFUiA9ICJqYXZheC5wZXJzaXN0ZW5jZS5qZGJjLnVzZXIiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KREJDX1VTRVIgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkKKwlTdHJpbmcgZ2V0RGVmYXVsdFBhc3N3b3JkKCk7CisJU3RyaW5nIGdldFBhc3N3b3JkKCk7CisJdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgbmV3UGFzc3dvcmQpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX1BST1BFUlRZID0gInBhc3N3b3JkIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBQcm9wZXJ0eSBrZXkKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9KREJDX1BBU1NXT1JEID0gImphdmF4LnBlcnNpc3RlbmNlLmpkYmMucGFzc3dvcmQiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KREJDX1BBU1NXT1JEID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9KcGFPcHRpb25zMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvSnBhT3B0aW9uczJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMWRhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvSnBhT3B0aW9uczJfMC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKKworLyoqCisgKiAgSnBhT3B0aW9uczJfMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEpwYU9wdGlvbnMyXzAgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCit7CisJSW50ZWdlciBnZXREZWZhdWx0TG9ja1RpbWVvdXQoKTsKKwlJbnRlZ2VyIGdldExvY2tUaW1lb3V0KCk7CisJdm9pZCBzZXRMb2NrVGltZW91dChJbnRlZ2VyIG5ld0xvY2tUaW1lb3V0KTsKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBMT0NLX1RJTUVPVVRfUFJPUEVSVFkgPSAibG9ja1RpbWVvdXQiOyAvLyROT04tTkxTLTEkCisJCS8vIFByb3BlcnR5IGtleQorCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX0xPQ0tfVElNRU9VVCA9ICJqYXZheC5wZXJzaXN0ZW5jZS5sb2NrLnRpbWVvdXQiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfTE9DS19USU1FT1VUID0gSW50ZWdlci52YWx1ZU9mKDUpOworCisJSW50ZWdlciBnZXREZWZhdWx0UXVlcnlUaW1lb3V0KCk7CisJSW50ZWdlciBnZXRRdWVyeVRpbWVvdXQoKTsKKwl2b2lkIHNldFF1ZXJ5VGltZW91dChJbnRlZ2VyIG5ld1F1ZXJ5VGltZW91dCk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfVElNRU9VVF9QUk9QRVJUWSA9ICJxdWVyeVRpbWVvdXQiOyAvLyROT04tTkxTLTEkCisJCS8vIFByb3BlcnR5IGtleQorCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQgPSAiamF2YXgucGVyc2lzdGVuY2UucXVlcnkudGltZW91dCI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9RVUVSWV9USU1FT1VUID0gSW50ZWdlci52YWx1ZU9mKDUpOworCisJU3RyaW5nIGdldERlZmF1bHRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KCk7CisJU3RyaW5nIGdldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoKTsKKwl2b2lkIHNldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoU3RyaW5nIG5ld1ZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkgPSAidmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gUHJvcGVydHkga2V5CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVCA9ICJqYXZheC5wZXJzaXN0ZW5jZS52YWxpZGF0aW9uLmdyb3VwLnByZS1wZXJzaXN0IjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVCA9ICJEZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAorCisJU3RyaW5nIGdldERlZmF1bHRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoKTsKKwlTdHJpbmcgZ2V0VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKCk7CisJdm9pZCBzZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoU3RyaW5nIG5ld1ZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZID0gInZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gUHJvcGVydHkga2V5CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFID0gImphdmF4LnBlcnNpc3RlbmNlLnZhbGlkYXRpb24uZ3JvdXAucHJlLXVwZGF0ZSI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURSA9ICJEZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAorCisJU3RyaW5nIGdldERlZmF1bHRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoKTsKKwlTdHJpbmcgZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKCk7CisJdm9pZCBzZXRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoU3RyaW5nIG5ld1ZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZID0gInZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gUHJvcGVydHkga2V5CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFID0gImphdmF4LnBlcnNpc3RlbmNlLnZhbGlkYXRpb24uZ3JvdXAucHJlLXJlbW92ZSI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRSA9ICIiOyAvLyROT04tTkxTLTEkCisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9TaGFyZWRDYWNoZU1vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9TaGFyZWRDYWNoZU1vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjM1YTgzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL1NoYXJlZENhY2hlTW9kZS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wOworCisvKioKKyAqICBTaGFyZWRDYWNoZU1vZGUKKyAqLworcHVibGljIGVudW0gU2hhcmVkQ2FjaGVNb2RlIAoreworCUFMTCwKKwlOT05FLAorCUVOQUJMRV9TRUxFQ1RJVkUsCisJRElTQUJMRV9TRUxFQ1RJVkUsCisJVU5TUEVDSUZJRUQ7IAorCQorCisJcHVibGljIHN0YXRpYyBTaGFyZWRDYWNoZU1vZGUgZnJvbVhtbFJlc291cmNlTW9kZWwoWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIHNoYXJlZENhY2hlTW9kZSkgeworCQlpZiAoc2hhcmVkQ2FjaGVNb2RlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXN3aXRjaCAoc2hhcmVkQ2FjaGVNb2RlKSB7CisJCQljYXNlIEFMTDoKKwkJCQlyZXR1cm4gQUxMOworCQkJY2FzZSBOT05FOgorCQkJCXJldHVybiBOT05FOworCQkJY2FzZSBFTkFCTEVfU0VMRUNUSVZFOgorCQkJCXJldHVybiBFTkFCTEVfU0VMRUNUSVZFOworCQkJY2FzZSBESVNBQkxFX1NFTEVDVElWRToKKwkJCQlyZXR1cm4gRElTQUJMRV9TRUxFQ1RJVkU7CisJCQljYXNlIFVOU1BFQ0lGSUVEOgorCQkJCXJldHVybiBVTlNQRUNJRklFRDsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biB2YWxpZGF0aW9uIG1vZGU6ICIgKyBzaGFyZWRDYWNoZU1vZGUpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJCisJcHVibGljIHN0YXRpYyBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAgdG9YbWxSZXNvdXJjZU1vZGVsKFNoYXJlZENhY2hlTW9kZSBzaGFyZWRDYWNoZU1vZGUpIHsKKwkJaWYgKHNoYXJlZENhY2hlTW9kZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlzd2l0Y2ggKHNoYXJlZENhY2hlTW9kZSkgeworCQkJY2FzZSBBTEw6CisJCQkJcmV0dXJuIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5BTEw7CisJCQljYXNlIE5PTkU6CisJCQkJcmV0dXJuIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5OT05FOworCQkJY2FzZSBFTkFCTEVfU0VMRUNUSVZFOgorCQkJCXJldHVybiBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAuRU5BQkxFX1NFTEVDVElWRTsKKwkJCWNhc2UgRElTQUJMRV9TRUxFQ1RJVkU6CisJCQkJcmV0dXJuIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5ESVNBQkxFX1NFTEVDVElWRTsKKwkJCWNhc2UgVU5TUEVDSUZJRUQ6CisJCQkJcmV0dXJuIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5VTlNQRUNJRklFRDsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBzaGFyZWQgY2FjaGUgbW9kZTogIiArIHNoYXJlZENhY2hlTW9kZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbk1vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uTW9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzUwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbk1vZGUuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzA7CisKKy8qKgorICogIFZhbGlkYXRpb25Nb2RlCisgKi8KK3B1YmxpYyBlbnVtIFZhbGlkYXRpb25Nb2RlIAoreworCUFVVE8oWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMC5BVVRPKSwKKwlDQUxMQkFDSyhYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wLkNBTExCQUNLKSwKKwlOT05FKFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAuTk9ORSk7IAorCisJcHJpdmF0ZSBYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIHhtbEVudW1WYWx1ZTsKKworCVZhbGlkYXRpb25Nb2RlKFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgeG1sRW51bVZhbHVlKSB7CisJCWlmICh4bWxFbnVtVmFsdWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy54bWxFbnVtVmFsdWUgPSB4bWxFbnVtVmFsdWU7CisJfQorCisJcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgZ2V0WG1sRW51bVZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy54bWxFbnVtVmFsdWU7CisJfQorCQorCQorCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uTW9kZSBmcm9tWG1sUmVzb3VyY2VNb2RlbChYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIHhtbFZhbGlkYXRpb25Nb2RlKSB7CisJCXJldHVybiAoeG1sVmFsaWRhdGlvbk1vZGUgPT0gbnVsbCkgPyBudWxsIDogZnJvbVhtbFJlc291cmNlTW9kZWxfKHhtbFZhbGlkYXRpb25Nb2RlKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBWYWxpZGF0aW9uTW9kZSBmcm9tWG1sUmVzb3VyY2VNb2RlbF8oWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCB4bWxWYWxpZGF0aW9uTW9kZSkgeworCQlmb3IgKFZhbGlkYXRpb25Nb2RlIHZhbGlkYXRpb25Nb2RlIDogVmFsaWRhdGlvbk1vZGUudmFsdWVzKCkpIHsKKwkJCWlmICh2YWxpZGF0aW9uTW9kZS5nZXRYbWxFbnVtVmFsdWUoKS5lcXVhbHMoeG1sVmFsaWRhdGlvbk1vZGUpKSB7CisJCQkJcmV0dXJuIHZhbGlkYXRpb25Nb2RlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCB0b1htbFJlc291cmNlTW9kZWwoVmFsaWRhdGlvbk1vZGUgdmFsaWRhdGlvbk1vZGUpIHsKKwkJcmV0dXJuICh2YWxpZGF0aW9uTW9kZSA9PSBudWxsKSA/IG51bGwgOiB2YWxpZGF0aW9uTW9kZS5nZXRYbWxFbnVtVmFsdWUoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvQWNjZXNzMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9BY2Nlc3MyXzBBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyNDdkOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvQWNjZXNzMl8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgMi4wIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkFjY2VzcworICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQWNjZXNzMl8wQW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgoreworCQorCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEyXzAuQUNDRVNTOworCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIEFjY2VzcyBhbm5vdGF0aW9uLgorCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUFjY2Vzc1R5cGUgZ2V0VmFsdWUoKTsKKwkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIEFjY2VzcyBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldFZhbHVlKEFjY2Vzc1R5cGUgYWNjZXNzKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiAgSWYgdGhlIGVsZW1lbnQgCisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEFjY2VzcyBhbm5vdGF0aW9uLgorCSAqLworCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGRlMWMxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuQW5ub3RhdGlvbkluaXRpYWxpemVyOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgMi4wIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkFzc29jaWF0aW9uT3ZlcnJpZGUKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24KKwlleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uCit7CisJCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdqb2luVGFibGUnIGVsZW1lbnQgb2YgdGhlIEFzc29jaWF0aW9uT3ZlcnJpZGUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUpvaW5UYWJsZUFubm90YXRpb24gZ2V0Sm9pblRhYmxlKCk7CisJCVN0cmluZyBKT0lOX1RBQkxFX1BST1BFUlRZID0gImpvaW5UYWJsZSI7IC8vJE5PTi1OTFMtMSQKKworCUpvaW5UYWJsZUFubm90YXRpb24gZ2V0Tm9uTnVsbEpvaW5UYWJsZSgpOworCisJLyoqCisJICogQWRkIHRoZSAnam9pblRhYmxlJyBlbGVtZW50IHRvIHRoZSBBc3NvY2lhdGlvbk92ZXJyaWRlIGFubm90YXRpb24uCisJICovCisJSm9pblRhYmxlQW5ub3RhdGlvbiBhZGRKb2luVGFibGUoKTsKKwkKKwlKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRKb2luVGFibGUoQW5ub3RhdGlvbkluaXRpYWxpemVyIGluaXRpYWxpemVyKTsKKworCS8qKgorCSAqIFJlbW92ZSB0aGUgJ2pvaW5UYWJsZScgZWxlbWVudCBmcm9tIHRoZSBBc3NvY2lhdGlvbk92ZXJyaWRlIGFubm90YXRpb24uCisJICovCisJdm9pZCByZW1vdmVKb2luVGFibGUoKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9DYWNoZWFibGUyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL0NhY2hlYWJsZTJfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmM5NjkxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9DYWNoZWFibGUyXzBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZE9ubHkKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIENhY2hlYWJsZTJfMEFubm90YXRpb24KKwlleHRlbmRzIEFubm90YXRpb24KK3sJCisJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQTJfMC5DQUNIRUFCTEU7CisJCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgQ2FjaGVhYmxlIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlCb29sZWFuIGdldFZhbHVlKCk7CisJCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBDYWNoZWFibGUgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ2FjaGVhYmxlIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL0VsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZTg1MGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL0VsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gCisJZXh0ZW5kcyBBbm5vdGF0aW9uCit7CisJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT047CisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3RhcmdldENsYXNzJyBlbGVtZW50IG9mIHRoZSBlbGVtZW50IGNvbGxlY3Rpb24KKwkgKiBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBwcmVjZWRpbmcgIi5jbGFzcyIuCisJICogPHByZT4KKwkgKiAgICAgJiM2NDtFbGVtZW50Q29sbGVjdGlvbih0YXJnZXRDbGFzcz1FbXBsb3llZS5jbGFzcykKKwkgKiA8L3ByZT4KKwkgKiB3aWxsIHJldHVybiAiRW1wbG95ZWUiCisJICovCisJU3RyaW5nIGdldFRhcmdldENsYXNzKCk7CQorCQlTdHJpbmcgVEFSR0VUX0NMQVNTX1BST1BFUlRZID0gInRhcmdldENsYXNzIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndGFyZ2V0Q2xhc3MnIGVsZW1lbnQgb2YgdGhlIGVsZW1lbnQgY29sbGVjdGlvbgorCSAqIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0VGFyZ2V0Q2xhc3MoU3RyaW5nIHRhcmdldENsYXNzKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3RhcmdldENsYXNzJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgZWxlbWVudCBjb2xsZWN0aW9uIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldFRhcmdldENsYXNzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIHRhcmdldCBjbGFzcyBuYW1lIGFzIHJlc29sdmVkIGJ5IHRoZSBBU1QncyBiaW5kaW5ncy4KKwkgKiA8cHJlPgorCSAqICAgICAmIzY0O0VsZW1lbnRDb2xsZWN0aW9uKHRhcmdldENsYXNzPUVtcGxveWVlLmNsYXNzKQorCSAqIDwvcHJlPgorCSAqIHdpbGwgcmV0dXJuICJtb2RlbC5FbXBsb3llZSIgaWYgdGhlcmUgaXMgYW4gaW1wb3J0IGZvciBtb2RlbC5FbXBsb3llZS4KKwkgKiBAcmV0dXJuCisJICovCisJU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0Q2xhc3NOYW1lKCk7CisJCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfVEFSR0VUX0NMQVNTX05BTUVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCisKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZmV0Y2gnIGVsZW1lbnQgb2YgdGhlIGVsZW1lbnQgY29sbGVjdGlvbiBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJRmV0Y2hUeXBlIGdldEZldGNoKCk7CisJCVN0cmluZyBGRVRDSF9QUk9QRVJUWSA9ICJmZXRjaCI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ZldGNoJyBlbGVtZW50IG9mIHRoZSBlbGVtZW50IGNvbGxlY3Rpb24gYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnZmV0Y2gnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBlbGVtZW50IGNvbGxlY3Rpb24gYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvSlBBMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL0pQQTJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjgwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL0pQQTJfMC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhOworCisvKioKKyAqIEpQQSAyLjAgSmF2YS1yZWxhdGVkIHN0dWZmIChhbm5vdGF0aW9ucyBldGMuKQorICogPHA+CisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgaW50ZXJmYWNlIEpQQTJfMCAKK3sKKwkvLyBKUEEgcGFja2FnZQorCVN0cmluZyBQQUNLQUdFID0gImphdmF4LnBlcnNpc3RlbmNlIjsKKwlTdHJpbmcgUEFDS0FHRV8gPSBQQUNLQUdFICsgJy4nOworCisKKwkvLyAqKioqKioqKioqIEFQSSAqKioqKioqKioqCisKKwkvLyBKUEEgMi4wIGFubm90YXRpb25zCisJU3RyaW5nIEFDQ0VTUyA9IFBBQ0tBR0VfICsgIkFjY2VzcyI7CisJCVN0cmluZyBBQ0NFU1NfX1ZBTFVFID0gInZhbHVlIjsKKworCVN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9UQUJMRSA9ICJqb2luVGFibGUiOworCQorCVN0cmluZyBDQUNIRUFCTEUgPSBQQUNLQUdFXyArICJDYWNoZWFibGUiOworCQlTdHJpbmcgQ0FDSEVBQkxFX19WQUxVRSA9ICJ2YWx1ZSI7CisKKwlTdHJpbmcgTUFQU19JRCA9IFBBQ0tBR0VfICsgIk1hcHNJZCI7CisJCVN0cmluZyBNQVBTX0lEX19WQUxVRSA9ICJ2YWx1ZSI7CisKKwlTdHJpbmcgU0VRVUVOQ0VfR0VORVJBVE9SX19DQVRBTE9HID0gImNhdGFsb2ciOworCVN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1JfX1NDSEVNQSA9ICJzY2hlbWEiOworCisJU3RyaW5nIE9ORV9UT19NQU5ZX19PUlBIQU5fUkVNT1ZBTCA9ICJvcnBoYW5SZW1vdmFsIjsKKworCVN0cmluZyBPTkVfVE9fT05FX19PUlBIQU5fUkVNT1ZBTCA9ICJvcnBoYW5SZW1vdmFsIjsKKworCVN0cmluZyBFTEVNRU5UX0NPTExFQ1RJT04gPSBQQUNLQUdFXyArICJFbGVtZW50Q29sbGVjdGlvbiI7CisJCVN0cmluZyBFTEVNRU5UX0NPTExFQ1RJT05fX0ZFVENIID0gImZldGNoIjsKKwkJU3RyaW5nIEVMRU1FTlRfQ09MTEVDVElPTl9fVEFSR0VUX0NMQVNTID0gInRhcmdldENsYXNzIjsKKworCS8vIEpQQSAyLjAgZW51bXMKKwlTdHJpbmcgQUNDRVNTX1RZUEUgPSBQQUNLQUdFXyArICJBY2Nlc3NUeXBlIjsKKwkJU3RyaW5nIEFDQ0VTU19UWVBFXyA9IEFDQ0VTU19UWVBFICsgJy4nOworCQlTdHJpbmcgQUNDRVNTX1RZUEVfX0ZJRUxEID0gQUNDRVNTX1RZUEVfICsgIkZJRUxEIjsKKwkJU3RyaW5nIEFDQ0VTU19UWVBFX19QUk9QRVJUWSA9IEFDQ0VTU19UWVBFXyArICJQUk9QRVJUWSI7CisKKwkvLyBKUEEgMi4wIG1ldGFtb2RlbAorCVN0cmluZyBNRVRBTU9ERUxfUEFDS0FHRSA9IFBBQ0tBR0VfICsgIm1ldGFtb2RlbCI7CisJU3RyaW5nIE1FVEFNT0RFTF9QQUNLQUdFXyA9IE1FVEFNT0RFTF9QQUNLQUdFICsgJy4nOworCisJU3RyaW5nIFNUQVRJQ19NRVRBTU9ERUwgPSBNRVRBTU9ERUxfUEFDS0FHRV8gKyAiU3RhdGljTWV0YW1vZGVsIjsKKwkJU3RyaW5nIFNUQVRJQ19NRVRBTU9ERUxfX1ZBTFVFID0gInZhbHVlIjsKKworCVN0cmluZyBTSU5HVUxBUl9BVFRSSUJVVEUgPSBNRVRBTU9ERUxfUEFDS0FHRV8gKyAiU2luZ3VsYXJBdHRyaWJ1dGUiOworCisJU3RyaW5nIENPTExFQ1RJT05fQVRUUklCVVRFID0gTUVUQU1PREVMX1BBQ0tBR0VfICsgIkNvbGxlY3Rpb25BdHRyaWJ1dGUiOworCVN0cmluZyBMSVNUX0FUVFJJQlVURSA9IE1FVEFNT0RFTF9QQUNLQUdFXyArICJMaXN0QXR0cmlidXRlIjsKKwlTdHJpbmcgTUFQX0FUVFJJQlVURSA9IE1FVEFNT0RFTF9QQUNLQUdFXyArICJNYXBBdHRyaWJ1dGUiOworCVN0cmluZyBTRVRfQVRUUklCVVRFID0gTUVUQU1PREVMX1BBQ0tBR0VfICsgIlNldEF0dHJpYnV0ZSI7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL01hcHNJZDJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvTWFwc0lkMl8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YTViNzIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL01hcHNJZDJfMEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIDIuMCBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBzSWQKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIE1hcHNJZDJfMEFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uCit7CisJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQTJfMC5NQVBTX0lEOworCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIE1hcHNJZCBhbm5vdGF0aW9uLgorCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCVN0cmluZyBnZXRWYWx1ZSgpOworCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgTWFwc0lkIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiAgSWYgdGhlIGVsZW1lbnQgCisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE1hcHNJZCBhbm5vdGF0aW9uLgorCSAqLworCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL09uZVRvTWFueTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvT25lVG9NYW55Ml8wQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NWUyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL09uZVRvTWFueTJfMEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBPbmVUb01hbnkyXzBBbm5vdGF0aW9uCisJZXh0ZW5kcyBPbmVUb01hbnlBbm5vdGF0aW9uLCBPcnBoYW5SZW1vdmFibGUyXzBBbm5vdGF0aW9uCit7fQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9PbmVUb09uZTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvT25lVG9PbmUyXzBBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxNjk5NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvT25lVG9PbmUyXzBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBPbmVUb09uZTJfMEFubm90YXRpb24KKwlleHRlbmRzIE9uZVRvT25lQW5ub3RhdGlvbiwgT3JwaGFuUmVtb3ZhYmxlMl8wQW5ub3RhdGlvbgore30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvT3JwaGFuUmVtb3ZhYmxlMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9PcnBoYW5SZW1vdmFibGUyXzBBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3NGM5MwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvT3JwaGFuUmVtb3ZhYmxlMl8wQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBPcnBoYW5SZW1vdmFibGUyXzBBbm5vdGF0aW9uCit7CisJLy8gKioqKioqKioqKiBvcnBoYW4gcmVtb3ZhbCAqKioqKioqKioqCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlIG9ycGhhblJlbW92YWwgZWxlbWVudCBvZiB0aGUgT25lVG9NYW55IGFubm90YXRpb24uCisJICogUmV0dXJucyBudWxsIGlmIHRoZSBvcnBoYW5SZW1vdmFsIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KKwkgKi8KKwlCb29sZWFuIGdldE9ycGhhblJlbW92YWwoKTsKKwkJU3RyaW5nIE9SUEhBTl9SRU1PVkFMX1BST1BFUlRZID0gIm9ycGhhblJlbW92YWwiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlIG9ycGhhblJlbW92YWwgZWxlbWVudCBvZiB0aGUgT25lVG9NYW55IGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBvcnBoYW5SZW1vdmFsIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4gb3JwaGFuUmVtb3ZhbCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgb3JwaGFuUmVtb3ZhbCBlbGVtZW50LiAgSWYgdGhlIG9ycGhhblJlbW92YWwgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgT25lVG9NYW55IGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldE9ycGhhblJlbW92YWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjFkNjdhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiAgU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uCisJZXh0ZW5kcyBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24KK3sKKwkvLyAqKioqKioqKioqIGNhdGFsb2cgKioqKioqKioqKgorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY2F0YWxvZycgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCVN0cmluZyBnZXRDYXRhbG9nKCk7CisJCVN0cmluZyBDQVRBTE9HX1BST1BFUlRZID0gImNhdGFsb2ciOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NhdGFsb2cnIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LiBJZiBubyBvdGhlciBlbGVtZW50cyBleGlzdAorCSAqIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgorCSAqLworCXZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZyk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2NhdGFsb2cnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgorCSAqLworCVRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ2NhdGFsb2cnIGVsZW1lbnQuCisJICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgorCSAqLworCWJvb2xlYW4gY2F0YWxvZ1RvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCisKKwkvLyAqKioqKioqKioqIHNjaGVtYSAqKioqKioqKioqCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NjaGVtYScgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCVN0cmluZyBnZXRTY2hlbWEoKTsKKwkJU3RyaW5nIFNDSEVNQV9QUk9QRVJUWSA9ICJzY2hlbWEiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NjaGVtYScgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuIElmIG5vIG90aGVyIGVsZW1lbnRzIGV4aXN0CisJICogdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCisJICovCisJdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHNjaGVtYSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3NjaGVtYScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICdzY2hlbWEnIGVsZW1lbnQuCisJICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgorCSAqLworCWJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9BYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9BYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGJlNWJkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL0Fic3RyYWN0WG1sUmVzb3VyY2VQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkZsZXhpYmxlUHJvamVjdFJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5XVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyCisJaW1wbGVtZW50cyBKcGFYbWxSZXNvdXJjZVByb3ZpZGVyLCBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciwgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvcgoreworCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OworCQorCXByb3RlY3RlZCBVUkkgZmlsZVVyaTsKKwkKKwlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2U7CisJCisJcHJvdGVjdGVkIElDb250ZW50VHlwZSBjb250ZW50VHlwZTsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgUmVzb3VyY2VBZGFwdGVyIHJlc291cmNlQWRhcHRlciA9IG5ldyBSZXNvdXJjZUFkYXB0ZXIoKTsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdGVuZXJMaXN0PEpwYVhtbFJlc291cmNlUHJvdmlkZXJMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxKcGFYbWxSZXNvdXJjZVByb3ZpZGVyTGlzdGVuZXI+KEpwYVhtbFJlc291cmNlUHJvdmlkZXJMaXN0ZW5lci5jbGFzcyk7CisJCisJcHJvdGVjdGVkIFJlc291cmNlU3RhdGVWYWxpZGF0b3Igc3RhdGVWYWxpZGF0b3I7CisJCisJCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IEFic3RyYWN0UmVzb3VyY2VNb2RlbFByb3ZpZGVyIGZvciB0aGUgZ2l2ZW4gcHJvamVjdCBhbmQgCisJICogcmVzb3VyY2VQYXRoLiAgVGhlIHJlc291cmNlUGF0aCBtYXkgYmUgZWl0aGVyIGEpIGFuIGFic29sdXRlIHBsYXRmb3JtIAorCSAqIHJlc291cmNlIHBhdGggKGUuZy4gIk15UHJvamVjdC9zcmMvTUVUQS1JTkYvZm9vYmFyLnhtbCIpIG9yIGIpIGEgcmVsYXRpdmUgCisJICogZGVwbG95IHBhdGggKGUuZy4gIk1FVEEtSU5GL2Zvb2Jhci54bWwiLikgIEluIGVpdGhlciBjYXNlLCAKKwkgKiB7QGxpbmsgI2J1aWxkRmlsZVVyaShJUGF0aCl9IHdpbGwgYXR0ZW1wdCB0byBidWlsZCBhbiBhYnNvbHV0ZWx5IHBhdGhlZCAKKwkgKiBVUkkgZm9yIHRoZSBnaXZlbiBwYXRoLgorCSAqLworCXB1YmxpYyBBYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcmVzb3VyY2VQYXRoLCBJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKwkJdGhpcy5maWxlVXJpID0gYnVpbGRGaWxlVXJpKHJlc291cmNlUGF0aCk7CisJCXRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKwl9CisJCisJcHJvdGVjdGVkIFVSSSBidWlsZEZpbGVVcmkoSVBhdGggcmVzb3VyY2VQYXRoKSB7CisJCVVSSSByZXNvdXJjZVVyaSA9IG51bGw7CisJCQorCQlpZiAocmVzb3VyY2VQYXRoLmlzQWJzb2x1dGUoKSkgeworCQkJcmVzb3VyY2VVcmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShyZXNvdXJjZVBhdGgudG9TdHJpbmcoKSwgZmFsc2UpOworCQl9CisJCWVsc2UgeworCQkJcmVzb3VyY2VVcmkgPSBnZXRNb2R1bGVVUkkoVVJJLmNyZWF0ZVVSSShyZXNvdXJjZVBhdGgudG9TdHJpbmcoKSkpOworCQl9CisJCQorCQlVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKKwkJcmV0dXJuIHVyaUNvbnZlcnRlci5ub3JtYWxpemUocmVzb3VyY2VVcmkpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlLCBpZiBpdCBleGlzdHMuICBJZiBubyBmaWxlIGV4aXN0cyBmb3IgdGhpcyByZXNvdXJjZSwgCisJICogdGhpcyB3aWxsIHJldHVybiBhIHN0dWIgcmVzb3VyY2UuICBZb3UgbXVzdCBjYWxsICNjcmVhdGVSZXNvdXJjZSgpIHRvIAorCSAqIGNyZWF0ZSB0aGUgZmlsZSBvbiB0aGUgZmlsZSBzeXN0ZW0uCisJICovCisJcHVibGljIEpwYVhtbFJlc291cmNlIGdldFhtbFJlc291cmNlKCkgeworCQlpZiAodGhpcy5yZXNvdXJjZSA9PSBudWxsKSB7CisJCQlKcGFYbWxSZXNvdXJjZSBuZXdSZXNvdXJjZSA9IChKcGFYbWxSZXNvdXJjZSkgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0T3JDcmVhdGVSZXNvdXJjZSh0aGlzLmZpbGVVcmksIGdldFJlc291cmNlU2V0KCkpOworCQkJLy9FTUYgY2FjaGVzIHJlc291cmNlcyBiYXNlZCBvbiBVUkkuICBJZiB0aGUgcmVzb3VyY2UgaGFzIGNoYW5nZWQgY29udGVudCB0eXBlcyAoc2F5IHRoZSBzY2hlbWEgd2FzIGNoYW5nZWQKKwkJCS8vZnJvbSBvcm0gdG8gZWNsaXBzZWxpbmstb3JtKSwgdGhlbiB0aGUgcmVzb3VyY2Ugd2lsbCBiZSBvZiB0aGUgd3JvbmcgdHlwZSBhbmQgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgb25lLgorCQkJaWYgKG5ld1Jlc291cmNlLmdldENvbnRlbnRUeXBlKCkuZXF1YWxzKHRoaXMuY29udGVudFR5cGUpKSB7CisJCQkJdGhpcy5yZXNvdXJjZSA9IG5ld1Jlc291cmNlOworCQkJfQorCQkJZWxzZSB7CisJCQkJdGhpcy5jcmVhdGVSZXNvdXJjZUFuZExvYWQoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpcy5yZXNvdXJjZTsKKwl9CisJCisJcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIGNyZWF0ZVJlc291cmNlQW5kTG9hZCgpIHsKKwkJdGhpcy5yZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKCk7CisJCXRoaXMubG9hZFJlc291cmNlKCk7CisJCXJldHVybiB0aGlzLnJlc291cmNlOworCX0KKwkKKwlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoKSB7CisJCVJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5ID0gCisJCQlXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KHRoaXMuZmlsZVVyaSwgdGhpcy5jb250ZW50VHlwZS5nZXREZWZhdWx0RGVzY3JpcHRpb24oKSk7CisJCXJldHVybiAoSnBhWG1sUmVzb3VyY2UpICgoRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQpIGdldFJlc291cmNlU2V0KCkpLmNyZWF0ZVJlc291cmNlKHRoaXMuZmlsZVVyaSwgcmVzb3VyY2VGYWN0b3J5KTsJCQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBsb2FkUmVzb3VyY2UoKSB7CisJCXRyeSB7CisJCQl0aGlzLnJlc291cmNlLmxvYWQoKChGbGV4aWJsZVByb2plY3RSZXNvdXJjZVNldCkgZ2V0UmVzb3VyY2VTZXQoKSkuZ2V0TG9hZE9wdGlvbnMoKSk7CisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCUpwdENvcmVQbHVnaW4ubG9nKGUpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlc291cmNlQW5kVW5kZXJseWluZ0ZpbGUoT2JqZWN0IGNvbmZpZykgeworCQl0aGlzLnJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UoKTsKKwkJaWYgKHRoaXMucmVzb3VyY2UuZmlsZUV4aXN0cygpKSB7IC8vYWx3YXlzIHBvc3NpYmxlIHRoYXQgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgd2hlbiB0aGUganBhIGZhY2V0IGlzIGFkZGVkCisJCQlsb2FkUmVzb3VyY2UoKTsKKwkJfQorCQllbHNlIHsKKwkJCXBvcHVsYXRlUm9vdChjb25maWcpOworCQkJdHJ5IHsKKwkJCQl0aGlzLnJlc291cmNlLnNhdmVJZk5lY2Vzc2FyeSgpOyAvL3RoaXMgd3JpdGVzIG91dCB0aGUgZmlsZQorCQkJfQorCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJSnB0Q29yZVBsdWdpbi5sb2coZSk7CisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogVGhpcyB3aWxsIGFjdHVhbGx5IGNyZWF0ZSB0aGUgdW5kZXJseWluZyBmaWxlIGFuZCB0aGUgSnBhWG1sUmVzb3VyY2UgdGhhdCBjb3JyZXNwb25kcyB0byBpdC4KKwkgKiBJdCBhbHNvIHBvcHVsYXRlcyB0aGUgcm9vdCBvZiB0aGUgZmlsZS4KKwkgKiBAcGFyYW0gY29uZmlnIC0gQSBjb25maWd1cmF0aW9uIG9iamVjdCB1c2VkIHRvIHNwZWNpZnkgb3B0aW9ucyBmb3IgY3JlYXRpb24gb2YgdGhlIHJlc291cmNlCisJICovCisJcHVibGljIEpwYVhtbFJlc291cmNlIGNyZWF0ZUZpbGVBbmRSZXNvdXJjZShmaW5hbCBPYmplY3QgY29uZmlnKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOworCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJCWNyZWF0ZVJlc291cmNlQW5kVW5kZXJseWluZ0ZpbGUoY29uZmlnKTsKKwkJCX0KKwkJfTsKKwkJd29ya3NwYWNlLnJ1bihydW5uYWJsZSwgdGhpcy5wcm9qZWN0LCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbnVsbCk7CisJCXJldHVybiB0aGlzLnJlc291cmNlOwkKKwl9CisJCisJcHJvdGVjdGVkIFVSSSBnZXRNb2R1bGVVUkkoVVJJIHVyaSkgeworCQlVUkkgbW9kdWxldXJpID0gTW9kdWxlVVJJVXRpbC5mdWxseVF1YWxpZnlVUkkodGhpcy5wcm9qZWN0KTsKKwkJSVBhdGggcmVxdWVzdFBhdGggPSBuZXcgUGF0aChtb2R1bGV1cmkucGF0aCgpKS5hcHBlbmQobmV3IFBhdGgodXJpLnBhdGgoKSkpOworCQlVUkkgcmVzb3VyY2VVUkkgPSBVUkkuY3JlYXRlVVJJKFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5NT0RVTEVfUFJPVE9DT0wgKyByZXF1ZXN0UGF0aC50b1N0cmluZygpKTsKKwkJcmV0dXJuIHJlc291cmNlVVJJOworCX0KKwkKKwkvKioKKwkgKiBVc2VkIHRvIG9wdGlvbmFsbHkgZmlsbCBpbiB0aGUgcm9vdCBpbmZvcm1hdGlvbiBvZiBhIHJlc291cmNlIGlmIGl0IGRvZXMgbm90IAorCSAqIGV4aXN0IGFzIGEgZmlsZQorCSAqLworCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUm9vdChPYmplY3QgY29uZmlnKSB7CisJCS8vVE9ETyBwb3RlbnRpYWxseSBjYWxsIHJlc291cmNlLnBvcHVsYXRlUm9vdCgpIGluc3RlYWQgb2YgdGhlIHJlc291cmNlUHJvdmlkZXIgZG9pbmcgdGhpcworCX0KKwkKKworCS8qKgorCSAqIG1pbmltaXplIHRoZSBzY29wZSBvZiB0aGUgc3VwcHJlc3NlZCB3YXJuaW5ncworCSAqLworCXByb3RlY3RlZCBFTGlzdDxFT2JqZWN0PiBnZXRSZXNvdXJjZUNvbnRlbnRzKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXRDb250ZW50cygpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKEpwYVhtbFJlc291cmNlUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuaXNFbXB0eSgpKSB7CisJCQllbmdhZ2VSZXNvdXJjZSgpOworCQl9CisJCXRoaXMubGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKEpwYVhtbFJlc291cmNlUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOworCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuaXNFbXB0eSgpKSB7CisJCQlkaXNlbmdhZ2VSZXNvdXJjZSgpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBlbmdhZ2VSZXNvdXJjZSgpIHsKKwkJaWYgKHRoaXMucmVzb3VyY2UgIT0gbnVsbCkgeworCQkJdGhpcy5yZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQodGhpcy5yZXNvdXJjZUFkYXB0ZXIpOworCQl9CisgCX0KKwkKKwlwcml2YXRlIHZvaWQgZGlzZW5nYWdlUmVzb3VyY2UoKSB7CisJCWlmICh0aGlzLnJlc291cmNlICE9IG51bGwpIHsKKwkJCXRoaXMucmVzb3VyY2UuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMucmVzb3VyY2VBZGFwdGVyKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgUHJvamVjdFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgeworCQlyZXR1cm4gKFByb2plY3RSZXNvdXJjZVNldCkgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHByb2plY3QpOworCX0KKwkKKwlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKKwkJcmV0dXJuIHRoaXMucHJvamVjdDsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQoUmVzb3VyY2UgYVJlc291cmNlLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7CisJCWlmICggISB0aGlzLmxpc3RlbmVyTGlzdC5pc0VtcHR5KCkpIHsKKwkJCWludCBldmVudFR5cGU9IG5ld1ZhbHVlID8gSnBhWG1sUmVzb3VyY2VQcm92aWRlckV2ZW50LlJFU09VUkNFX0xPQURFRCA6IEpwYVhtbFJlc291cmNlUHJvdmlkZXJFdmVudC5SRVNPVVJDRV9VTkxPQURFRDsKKwkJCUpwYVhtbFJlc291cmNlUHJvdmlkZXJFdmVudCBldnQgPSBuZXcgSnBhWG1sUmVzb3VyY2VQcm92aWRlckV2ZW50KHRoaXMsIGV2ZW50VHlwZSk7CisJCQlub3RpZnlMaXN0ZW5lcnMoZXZ0KTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSnBhWG1sUmVzb3VyY2VQcm92aWRlckV2ZW50IGV2ZW50KSB7CisJCU5vdGlmeVJ1bm5lciBub3RpZmllciA9IG5ldyBOb3RpZnlSdW5uZXIoZXZlbnQpOyAKKwkJZm9yIChKcGFYbWxSZXNvdXJjZVByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgeworCQkJbm90aWZpZXIuc2V0TGlzdGVuZXIobGlzdGVuZXIpOworCQkJU2FmZVJ1bm5lci5ydW4obm90aWZpZXIpOworCQl9CisJfQorCQorCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChPYmplY3QgY29udGV4dCkgeworCQlJV29ya3NwYWNlIHdvcmsgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisJCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHRoaXMucmVzb3VyY2UpOworCQlpZiAoZmlsZSAhPSBudWxsKSB7CisJCQlJRmlsZVtdIGZpbGVzID0geyBmaWxlIH07CisJCQlpZiAoY29udGV4dCA9PSBudWxsKSB7CisJCQkJY29udGV4dCA9IElXb3Jrc3BhY2UuVkFMSURBVEVfUFJPTVBUOworCQkJfQorCQkJcmV0dXJuIHdvcmsudmFsaWRhdGVFZGl0KGZpbGVzLCBjb250ZXh0KTsKKwkJfSAKKwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJfQkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgZ2V0U3RhdGVWYWxpZGF0b3IoKSB7CisJCWlmICh0aGlzLnN0YXRlVmFsaWRhdG9yID09IG51bGwpIHsKKwkJCXRoaXMuc3RhdGVWYWxpZGF0b3IgPSBjcmVhdGVTdGF0ZVZhbGlkYXRvcigpOworCQl9CisJCXJldHVybiB0aGlzLnN0YXRlVmFsaWRhdG9yOworCX0KKwkKKwlwcml2YXRlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgY3JlYXRlU3RhdGVWYWxpZGF0b3IoKSB7CisJCXJldHVybiBuZXcgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvckltcGwodGhpcyk7CisJfQorCQorCXB1YmxpYyB2b2lkIGNoZWNrQWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlnZXRTdGF0ZVZhbGlkYXRvcigpLmNoZWNrQWN0aXZhdGlvbihwcmVzZW50ZXIpOwkKKwl9CisJCisJcHVibGljIHZvaWQgbG9zdEFjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJZ2V0U3RhdGVWYWxpZGF0b3IoKS5sb3N0QWN0aXZhdGlvbihwcmVzZW50ZXIpOwkKKwl9CisJCisJcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAocHJlc2VudGVyID09IG51bGwpIHsKKwkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQl9CisJCXJldHVybiBnZXRTdGF0ZVZhbGlkYXRvcigpLnZhbGlkYXRlU3RhdGUocHJlc2VudGVyKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY2hlY2tTYXZlKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXJldHVybiBnZXRTdGF0ZVZhbGlkYXRvcigpLmNoZWNrU2F2ZShwcmVzZW50ZXIpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjaGVja1JlYWRPbmx5KCkgeworCQlyZXR1cm4gZ2V0U3RhdGVWYWxpZGF0b3IoKS5jaGVja1JlYWRPbmx5KCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewkKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2UuaXNNb2RpZmllZCgpOworCX0KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgTGlzdCBnZXROb25SZXNvdXJjZUZpbGVzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBMaXN0IGdldE5vblJlc291cmNlSW5jb25zaXN0ZW50RmlsZXMoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIExpc3QgZ2V0UmVzb3VyY2VzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChnZXRYbWxSZXNvdXJjZSgpKTsKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIHZvaWQgY2FjaGVOb25SZXNvdXJjZVZhbGlkYXRlU3RhdGUoTGlzdCByb05vblJlc291cmNlRmlsZXMpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHJvdGVjdGVkIGNsYXNzIFJlc291cmNlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQkJaWYgKCBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCAmJiBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQpIHsKKwkJCQlyZXNvdXJjZUlzTG9hZGVkQ2hhbmdlZCgoUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBub3RpZmljYXRpb24uZ2V0T2xkQm9vbGVhblZhbHVlKCksIG5vdGlmaWNhdGlvbi5nZXROZXdCb29sZWFuVmFsdWUoKSk7CisJCQl9CisJCX0KKwl9CisJCisJCisJcHVibGljIHN0YXRpYyBjbGFzcyBOb3RpZnlSdW5uZXIgaW1wbGVtZW50cyBJU2FmZVJ1bm5hYmxlIAorCXsKKwkJcHJpdmF0ZSBmaW5hbCBKcGFYbWxSZXNvdXJjZVByb3ZpZGVyRXZlbnQgZXZlbnQ7CisJCQorCQlwcml2YXRlIEpwYVhtbFJlc291cmNlUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcjsKKwkJCisJCQorCQlwdWJsaWMgTm90aWZ5UnVubmVyKEpwYVhtbFJlc291cmNlUHJvdmlkZXJFdmVudCBldmVudCkgeworCQkJQXNzZXJ0LmlzTm90TnVsbChldmVudCk7CisJCQl0aGlzLmV2ZW50ID0gZXZlbnQ7CisJCX0KKwkJCisJCQorCQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihKcGFYbWxSZXNvdXJjZVByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgeworCQkJCWxpc3RlbmVyLm1vZGVsQ2hhbmdlZChldmVudCk7CisJCQl9CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7IAorCQkJSnB0Q29yZVBsdWdpbi5sb2coZXhjZXB0aW9uKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9KcGFYbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvSnBhWG1sUmVzb3VyY2VQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Njk2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvSnBhWG1sUmVzb3VyY2VQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEpwYVhtbFJlc291cmNlUHJvdmlkZXIKK3sKKwlKcGFYbWxSZXNvdXJjZSBnZXRYbWxSZXNvdXJjZSgpOworCQorCUlTdGF0dXMgdmFsaWRhdGVFZGl0KE9iamVjdCBjb250ZXh0KTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9KcGFYbWxSZXNvdXJjZVByb3ZpZGVyRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9KcGFYbWxSZXNvdXJjZVByb3ZpZGVyRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzJmYmEzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL0pwYVhtbFJlc291cmNlUHJvdmlkZXJFdmVudC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgY2xhc3MgSnBhWG1sUmVzb3VyY2VQcm92aWRlckV2ZW50Cit7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkVTT1VSQ0VfTE9BREVEID0gMHgxOworCQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFU09VUkNFX1VOTE9BREVEID0gMHgyOworCQorCQorCXByaXZhdGUgSnBhWG1sUmVzb3VyY2VQcm92aWRlciBtb2RlbFByb3ZpZGVyOworCQorCXByaXZhdGUgaW50IHR5cGU7CisJCisJCisJcHVibGljIEpwYVhtbFJlc291cmNlUHJvdmlkZXJFdmVudChKcGFYbWxSZXNvdXJjZVByb3ZpZGVyIG1vZGVsUHJvdmlkZXIsIGludCBldmVudFR5cGUpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5tb2RlbFByb3ZpZGVyID0gbW9kZWxQcm92aWRlcjsKKwkJdGhpcy50eXBlID0gZXZlbnRUeXBlOworCX0KKwkKKwkKKwlwdWJsaWMgSnBhWG1sUmVzb3VyY2VQcm92aWRlciBnZXRNb2RlbFByb3ZpZGVyKCkgeworCQlyZXR1cm4gbW9kZWxQcm92aWRlcjsKKwl9CisJCisJcHVibGljIGludCBnZXRUeXBlKCkgeworCQlyZXR1cm4gdHlwZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvSnBhWG1sUmVzb3VyY2VQcm92aWRlckxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvSnBhWG1sUmVzb3VyY2VQcm92aWRlckxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0MjM3YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9KcGFYbWxSZXNvdXJjZVByb3ZpZGVyTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEpwYVhtbFJlc291cmNlUHJvdmlkZXJMaXN0ZW5lcgorCWV4dGVuZHMgRXZlbnRMaXN0ZW5lcgoreworCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChKcGFYbWxSZXNvdXJjZVByb3ZpZGVyRXZlbnQgZXZlbnQpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2NvbW1vbi9BYnN0cmFjdEpwYUVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9jb21tb24vQWJzdHJhY3RKcGFFT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMzZhODguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2NvbW1vbi9BYnN0cmFjdEpwYUVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LkFic3RyYWN0VGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRU9iamVjdDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkNvbW1vblBhY2thZ2UjZ2V0WG1sRU9iamVjdCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFFT2JqZWN0IGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JcHJvdGVjdGVkIElET01Ob2RlIG5vZGU7Ci0JCi0JLyoqCi0JICogU2V0cyBvZiAiaW5zaWduaWZpY2FudCIgZmVhdHVyZSBpZHMsIGtleWVkIGJ5IGNsYXNzLgotCSAqIFRoaXMgaXMgYnVpbHQgdXAgbGF6aWx5LCBhcyB0aGUgb2JqZWN0cyBhcmUgbW9kaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3Q+LCBTZXQ8SW50ZWdlcj4+IGluc2lnbmlmaWNhbnRGZWF0dXJlSWRTZXRzID0gbmV3IEhhc2h0YWJsZTxDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0PiwgU2V0PEludGVnZXI+PigpOwotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEpwYUVPYmplY3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSUpwYUVPYmplY3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCi0JcHVibGljIElSZXNvdXJjZSBnZXRQbGF0Zm9ybVJlc291cmNlKCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JfQotCQotCXB1YmxpYyBKcGFYbWxSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIChKcGFYbWxSZXNvdXJjZSkgZVJlc291cmNlKCk7Ci0JfQotCQotCS8qCi0JICogTXVzdCBiZSBvdmVycmlkZGVuIGJ5IGFjdHVhbCByb290IG9iamVjdCB0byByZXR1cm4gaXRzZWxmCi0JICovCi0JcHVibGljIEpwYUVPYmplY3QgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuICgoSnBhRU9iamVjdCkgZUNvbnRhaW5lcigpKS5nZXRSb290KCk7Ci0JCQotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNoYW5nZSBub3RpZmljYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogb3ZlcnJpZGUgdG8gcHJldmVudCBub3RpZmljYXRpb24gd2hlbiB0aGUgb2JqZWN0J3Mgc3RhdGUgaXMgdW5jaGFuZ2VkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZU5vdGlmeShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmICghbm90aWZpY2F0aW9uLmlzVG91Y2goKSkgewotCQkJc3VwZXIuZU5vdGlmeShub3RpZmljYXRpb24pOwotCQkJdGhpcy5mZWF0dXJlQ2hhbmdlZChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKHRoaXMuZ2V0Q2xhc3MoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZlYXR1cmVDaGFuZ2VkKGludCBmZWF0dXJlSWQpIHsKLQkJaWYgKHRoaXMuZmVhdHVyZUlzU2lnbmlmaWNhbnQoZmVhdHVyZUlkKSkgeyAKLQkJCWdldFJlc291cmNlKCkucmVzb3VyY2VDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmVhdHVyZUlzU2lnbmlmaWNhbnQoaW50IGZlYXR1cmVJZCkgewotCQlyZXR1cm4gISB0aGlzLmZlYXR1cmVJc0luc2lnbmlmaWNhbnQoZmVhdHVyZUlkKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmVhdHVyZUlzSW5zaWduaWZpY2FudChpbnQgZmVhdHVyZUlkKSB7Ci0JCXJldHVybiB0aGlzLmluc2lnbmlmaWNhbnRGZWF0dXJlSWRzKCkuY29udGFpbnMobmV3IEludGVnZXIoZmVhdHVyZUlkKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHNldCBvZiB0aGUgb2JqZWN0J3MgImluc2lnbmlmaWNhbnQiIGZlYXR1cmUgaWRzLgotCSAqIFRoZXNlIGFyZSB0aGUgRU1GIGZlYXR1cmVzIHRoYXQgd2lsbCBub3QgYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgYWxsCi0JICogdGhlIGZlYXR1cmVzIGFyZSB1bnNldC4gIFdlIHVzZSB0aGlzIHRvIGRldGVybWluZSB3aGVuIHRvIHJlbW92ZSAKLQkgKiBhbiBlbGVtZW50IGZyb20gdGhlIHhtbC4KLQkgKiAKLQkgKiBJZiB5b3UgbmVlZCBpbnN0YW5jZS1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyIHhtbCAiaW5zaWduaWZpY2FudCIgYXNwZWN0cywKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4gSWYgY2xhc3MtYmFzZWQgY2FsY3VsYXRpb24gaXMgc3VmZmljaWVudCwKLQkgKiBvdmVycmlkZSAjYWRkSW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHNUbyhTZXQpLgotCSAqIAotCSAqIEBzZWUgaXNBbGxGZWF0dXJlc1Vuc2V0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU2V0PEludGVnZXI+IGluc2lnbmlmaWNhbnRGZWF0dXJlSWRzKCkgewotCQlzeW5jaHJvbml6ZWQgKGluc2lnbmlmaWNhbnRGZWF0dXJlSWRTZXRzKSB7Ci0JCQlTZXQ8SW50ZWdlcj4gaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHMgPSBpbnNpZ25pZmljYW50RmVhdHVyZUlkU2V0cy5nZXQodGhpcy5nZXRDbGFzcygpKTsKLQkJCWlmIChpbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkcyA9PSBudWxsKSB7Ci0JCQkJaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHMgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOwotCQkJCXRoaXMuYWRkSW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHNUbyhpbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkcyk7Ci0JCQkJaW5zaWduaWZpY2FudEZlYXR1cmVJZFNldHMucHV0KHRoaXMuZ2V0Q2xhc3MoKSwgaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHMpOwotCQkJfQotCQkJcmV0dXJuIGluc2lnbmlmaWNhbnRYbWxGZWF0dXJlSWRzOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFkZCB0aGUgb2JqZWN0J3MgImluc2lnbmlmaWNhbnQiIGZlYXR1cmUgaWRzIHRvIHRoZSBzcGVjaWZpZWQgc2V0LgotCSAqIFRoZXNlIGFyZSB0aGUgRU1GIGZlYXR1cmVzIHRoYXQsIHdoZW4gdGhleSBjaGFuZ2UsIHdpbGwgTk9UIGNhdXNlIHRoZQotCSAqIG9iamVjdCAob3IgaXRzIGNvbnRhaW5pbmcgdHJlZSkgdG8gYmUgcmVzeW5jaGVkLCBpLmUuIGRlZmF1bHRzIGNhbGN1bGF0ZWQuCi0JICogSWYgY2xhc3MtYmFzZWQgY2FsY3VsYXRpb24gb2YgeW91ciAiaW5zaWduaWZpY2FudCIgZmVhdHVyZXMgaXMgc3VmZmljaWVudCwKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4gSWYgeW91IG5lZWQgaW5zdGFuY2UtYmFzZWQgY2FsY3VsYXRpb24sCi0JICogb3ZlcnJpZGUgI2luc2lnbmlmaWNhbnRYbWxGZWF0dXJlSWRzKCkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHNUbyhTZXQ8SW50ZWdlcj4gaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHMpIHsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkSW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHNUbyhpbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkcyk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0FsbEZlYXR1cmVzVW5zZXQoKSB7Ci0JCWZvciAoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgOiBlQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkpIHsKLQkJCWlmIChlSXNTZXQoZmVhdHVyZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PEFkYXB0ZXI+IGVBZGFwdGVycygpIHsKLQkJaWYgKHRoaXMuZUFkYXB0ZXJzID09IG51bGwpIHsKLQkJCXRoaXMuZUFkYXB0ZXJzID0gbmV3IFhtbEVBZGFwdGVyTGlzdDxBZGFwdGVyPih0aGlzKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5lQWRhcHRlcnM7Ci0JfQotCi0JcHVibGljIElET01Ob2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLm5vZGU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgY2xhc3MgWG1sRUFkYXB0ZXJMaXN0PEUgZXh0ZW5kcyBPYmplY3QgJiBBZGFwdGVyPiBleHRlbmRzIEVBZGFwdGVyTGlzdDxFPgotCXsKLQkJcHVibGljIFhtbEVBZGFwdGVyTGlzdChOb3RpZmllciBub3RpZmllcikgewotCQkJc3VwZXIobm90aWZpZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpZEFkZChpbnQgaW5kZXgsIEUgbmV3T2JqZWN0KSB7Ci0JCQlzdXBlci5kaWRBZGQoaW5kZXgsIG5ld09iamVjdCk7Ci0JCQl0cnkgewotCQkJCW5vZGUgPSAoSURPTU5vZGUpIENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChuZXdPYmplY3QsICJnZXROb2RlIik7Ci0JCQl9Ci0JCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkaWRSZW1vdmUoaW50IGluZGV4LCBFIG9sZE9iamVjdCkgewotCQkJc3VwZXIuZGlkUmVtb3ZlKGluZGV4LCBvbGRPYmplY3QpOwotCQkJaWYgKChvbGRPYmplY3QgaW5zdGFuY2VvZiBFTUYyRE9NQWRhcHRlcikgJiYgKCgoRU1GMkRPTUFkYXB0ZXIpIG9sZE9iamVjdCkuZ2V0Tm9kZSgpID09IEFic3RyYWN0SnBhRU9iamVjdC50aGlzLm5vZGUpKSB7Ci0JCQkJQWJzdHJhY3RKcGFFT2JqZWN0LnRoaXMubm9kZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0RnVsbFRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEZ1bGxUZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRGdWxsVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gYnVpbGRUZXh0UmFuZ2UodGhpcy5ub2RlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBidWlsZFRleHRSYW5nZShJRE9NTm9kZSBkb21Ob2RlKSB7Ci0JCWlmIChkb21Ob2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBuZXcgRE9NTm9kZVRleHRSYW5nZShkb21Ob2RlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IHRleHRPZmZzZXQpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBub2RlLmNvbnRhaW5zKHRleHRPZmZzZXQpOwotCX0KLQkKLQkvKioKLQkgKiBBZGFwdCBhbiBJRE9NTm9kZSB0byB0aGUgVGV4dFJhbmdlIGludGVyZmFjZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBET01Ob2RlVGV4dFJhbmdlIGV4dGVuZHMgQWJzdHJhY3RUZXh0UmFuZ2UKLQl7Ci0JCXByaXZhdGUgZmluYWwgSURPTU5vZGUgbm9kZTsKLQotCQlET01Ob2RlVGV4dFJhbmdlKElET01Ob2RlIG5vZGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5vZGUgPSBub2RlOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCWlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCXJldHVybiAoKElET01FbGVtZW50KSB0aGlzLm5vZGUpLmdldFN0YXJ0RW5kT2Zmc2V0KCkgLSB0aGlzLm5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLm5vZGUuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVPZk9mZnNldChnZXRPZmZzZXQoKSkgKyAxOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvY29tbW9uL0pwYUFydGlmYWN0RWRpdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2NvbW1vbi9KcGFBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAyMWQ5OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvY29tbW9uL0pwYUFydGlmYWN0RWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpwYUFydGlmYWN0RWRpdCBleHRlbmRzIEFydGlmYWN0RWRpdAotewotCXB1YmxpYyBKcGFBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSAKLQkJCXRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlcihhUHJvamVjdCwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHJldHVybiBhIHJlc291cmNlIGZvciB0aGUgZ2l2ZW4gZmlsZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBKcGFYbWxSZXNvdXJjZSBnZXRSZXNvdXJjZShJRmlsZSBmaWxlKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZGVwbG95VVJJIC0gdGhpcyBtdXN0IGJlIGluIGEgZGVwbG95bWVudCByZWxldmFudCBmb3JtIAotCSAqIAkoZS5nICJNRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiIGluc3RlYWQgb2YgInNyYy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiKQotCSAqIEByZXR1cm4gYSByZXNvdXJjZSBmb3IgdGhlIGdpdmVuIGRlcGxveW1lbnQgZmlsZSBVUkkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSnBhWG1sUmVzb3VyY2UgZ2V0UmVzb3VyY2UoU3RyaW5nIGRlcGxveVVSSSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvY29tbW9uL0pwYUVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9jb21tb24vSnBhRU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjU1MjNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9jb21tb24vSnBhRU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYUVPYmplY3QgZXh0ZW5kcyBFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSB0aGF0IG1vc3QgZGlyZWN0bHkgY29udGFpbnMgdGhpcyBvYmplY3QKLQkgKi8KLQlJUmVzb3VyY2UgZ2V0UGxhdGZvcm1SZXNvdXJjZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSnBhWG1sUmVzb3VyY2UgY29udGFpbmluZyB0aGlzIG9iamVjdC4KLQkgKi8KLQlKcGFYbWxSZXNvdXJjZSBnZXRSZXNvdXJjZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcm9vdCBvYmplY3Qgb2YgdGhlIG1vZGVsCi0JICovCi0JSnBhRU9iamVjdCBnZXRSb290KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBvYmplY3QncyB0ZXh0IHJlcHJlc2VudGF0aW9uIGNvbnRhaW5zIHRoZSB0ZXh0IG9mZnNldAotCSAqLwotCWJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IHRleHRPZmZzZXQpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSB0byBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLiAgVGhpcyBpcyB0aGUgc291cmNlCi0JICogcmFuZ2UgdGhhdCB3aWxsIGJlIGhpZ2hsaWdodGVkIGZvciBhIHZhbGlkYXRpb24gZXJyb3IuCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2UgdG8gYmUgdXNlZCBmb3Igc2VsZWN0aW9uLiAgVGhpcyBpcyB0aGUgc291cmNlCi0JICogcmFuZ2UgdGhhdCB3aWxsIGJlIGhpZ2hsaWdodGVkIHdoZW4gc2VsZWN0aW5nIGluIHRoZSBzdHJ1Y3R1cmUgdmlldy4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JCi0JCi0JYm9vbGVhbiBpc0FsbEZlYXR1cmVzVW5zZXQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9jb21tb24vSnBhWG1sUmVzb3VyY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9jb21tb24vSnBhWG1sUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlZTk0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvY29tbW9uL0pwYVhtbFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnBhWG1sUmVzb3VyY2UgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsCi17Ci0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbjxSZXNvdXJjZU1vZGVsTGlzdGVuZXI+IHJlc291cmNlTW9kZWxMaXN0ZW5lcnM7Ci0JCi0JCi0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlKFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcihhUmVuZGVyZXIpOwotCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlTW9kZWxMaXN0ZW5lcj4oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VNb2RlbExpc3RlbmVyPigpOwotCX0KLQkKLQkvKioKLQkgKiBvdmVycmlkZSB0byBwcmV2ZW50IG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBvYmplY3QncyBzdGF0ZSBpcyB1bmNoYW5nZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKCFub3RpZmljYXRpb24uaXNUb3VjaCgpICYmIGlzTG9hZGVkKCkpIHsKLQkJCXN1cGVyLmVOb3RpZnkobm90aWZpY2F0aW9uKTsKLQkJCXJlc291cmNlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRQdWJsaWNJZCgpIAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFB1YmxpY0lkKCkgewotCQlyZXR1cm4gbnVsbDsKLQkJLy8gb25seSBhcHBsaWNhYmxlIGZvciBEVEQtYmFzZWQgZmlsZXMKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRTeXN0ZW1JZCgpIAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFN5c3RlbUlkKCkgewotCQlyZXR1cm4gbnVsbDsKLQkJLy8gb25seSBhcHBsaWNhYmxlIGZvciBEVEQtYmFzZWQgZmlsZXMKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRWZXJzaW9uSWQoKSAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRWZXJzaW9uSUQoKSB7Ci0JCXJldHVybiAxMDsKLQkJLy8gdGhpcyBzZWVtcyB0byBiZSB0aGUgZGVmYXVsdCB2ZXJzaW9uIG9mIHRoZSBzcGVjIGZvciB0aGlzIGRvYwotCQkvLyBhbmQgdGhlIGlkIDEwIG1hcHMgdG8gdGhlIHZlcnNpb24gMS4wCi0JfQotCQotCS8qKgotCSAqIEBzZWUgVHJhbnNsYXRvclJlc291cmNlI2dldERvY3R5cGUoKSAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERvY3R5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCQkvLyBvbmx5IGFwcGxpY2FibGUgZm9yIERURC1iYXNlZCBmaWxlcwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWZpbGUgPSBnZXRGaWxlKGdldFVSSSgpKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJaWYgKGdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCVVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBnZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpOwotCQkJCVVSSSBjb252ZXJ0ZWRVcmkgPSBjb252ZXJ0ZXIubm9ybWFsaXplKGdldFVSSSgpKTsKLQkJCQlpZiAoISBnZXRVUkkoKS5lcXVhbHMoY29udmVydGVkVXJpKSkgewotCQkJCQlmaWxlID0gZ2V0RmlsZShjb252ZXJ0ZWRVcmkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJRmlsZSBmb3IgdGhlIDxjb2RlPnVyaTwvY29kZT4gd2l0aGluIHRoZSBXb3Jrc3BhY2UuIFRoaXMgVVJJIGlzIGFzc3VtZWQgdG8gYmUKLQkgKiBhYnNvbHV0ZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogcGxhdGZvcm06L3Jlc291cmNlLy4uLi4KLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoVVJJIHVyaSkgewotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKSB7Ci0JCQlTdHJpbmcgZmlsZVN0cmluZyA9IFVSSS5kZWNvZGUodXJpLnBhdGgoKSk7Ci0JCQlmaWxlU3RyaW5nID0gZmlsZVN0cmluZy5zdWJzdHJpbmcoSkVNVXRpbFBsdWdpbi5QTEFURk9STV9SRVNPVVJDRS5sZW5ndGgoKSArIDEpOwotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGdldEZpbGUoKS5leGlzdHMoKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpOwotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZUZyb21SZXNvdXJjZSgpOwotCQotCXB1YmxpYyBKcGFYbWxSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlTW9kZWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTW9kZWwoSnBhWG1sUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbCA9IHJlc291cmNlTW9kZWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZCgpIHsKLQkJZm9yIChSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcnMpIHsKLQkJCWxpc3RlbmVyLnJlc291cmNlTW9kZWxDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VNb2RlbENoYW5nZUxpc3RlbmVyKFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGlzdGVuZXIgY2Fubm90IGJlIG51bGwiKTsKLQkJfQotCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VNb2RlbENoYW5nZUxpc3RlbmVyKFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoIXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgd2FzIG5ldmVyIGFkZGVkIik7CQkKLQkJfQotCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvY29tbW9uL0pwYVhtbFJlc291cmNlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9jb21tb24vSnBhWG1sUmVzb3VyY2VNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmZhYmJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9jb21tb24vSnBhWG1sUmVzb3VyY2VNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKcGFYbWxSZXNvdXJjZU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZU1vZGVsCi17Ci0JcHJvdGVjdGVkIEpwYUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQ7Ci0JCi0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIHJlc291cmNlOwotCQotCQotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZU1vZGVsKElGaWxlIGZpbGUpIHsKLQkJc3VwZXIoZmlsZSk7Ci0JCXRoaXMuYXJ0aWZhY3RFZGl0ID0gYnVpbGRBcnRpZmFjdEVkaXQoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQl0aGlzLnJlc291cmNlID0gdGhpcy5hcnRpZmFjdEVkaXQuZ2V0UmVzb3VyY2UoZmlsZSk7Ci0JCXRoaXMucmVzb3VyY2Uuc2V0UmVzb3VyY2VNb2RlbCh0aGlzKTsKLQkJdGhpcy5hcnRpZmFjdEVkaXQuYWRkTGlzdGVuZXIoYnVpbGRSZWxvYWRMaXN0ZW5lcih0aGlzLnJlc291cmNlKSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBKcGFBcnRpZmFjdEVkaXQgYnVpbGRBcnRpZmFjdEVkaXQoSVByb2plY3QgcHJvamVjdCk7Ci0JCi0JcHJpdmF0ZSBFZGl0TW9kZWxMaXN0ZW5lciBidWlsZFJlbG9hZExpc3RlbmVyKEpwYVhtbFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBuZXcgUmVsb2FkTGlzdGVuZXIocmVzb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgSnBhWG1sUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQl0aGlzLnJlc291cmNlLmphdmFFbGVtZW50Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRnJvbVJlc291cmNlKCkgewotCQl0aGlzLnJlc291cmNlLnVwZGF0ZUZyb21SZXNvdXJjZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZU1vZGVsQ2hhbmdlTGlzdGVuZXIoUmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVzb3VyY2UuYWRkUmVzb3VyY2VNb2RlbENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VNb2RlbENoYW5nZUxpc3RlbmVyKFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlc291cmNlLnJlbW92ZVJlc291cmNlTW9kZWxDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJdGhpcy5hcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXMoKSB7Ci0JCS8vbm90aGluZyB0byBkbyBoZXJlLCBKYXZhUmVzb3VyY2VNb2RlbCBuZWVkcyB0aGlzCi0JfQotCQotCXByaXZhdGUgY2xhc3MgUmVsb2FkTGlzdGVuZXIgaW1wbGVtZW50cyBFZGl0TW9kZWxMaXN0ZW5lcgotCXsKLQkJZmluYWwgSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCQotCQkKLQkJUmVsb2FkTGlzdGVuZXIoSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJCXN3aXRjaCAoYW5FdmVudC5nZXRFdmVudENvZGUoKSkgewotCQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuVU5MT0FERURfUkVTT1VSQ0UgOgotCQkJCQlpZiAoYW5FdmVudC5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkuY29udGFpbnMocmVzb3VyY2UpCi0JCQkJCQkJJiYgISByZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXJlc291cmNlLmxvYWQocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRMb2FkT3B0aW9ucygpKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJCQlKcHRDb3JlUGx1Z2luLmxvZyhpb2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuUkVNT1ZFRF9SRVNPVVJDRSA6Ci0JCQkJCWlmIChhbkV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKS5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCWFuRXZlbnQuZ2V0RWRpdE1vZGVsKCkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0vLwkJCQljYXNlIEVkaXRNb2RlbEV2ZW50LlNBVkUgOgotLy8JCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRSA6CQkJCQotCQkJfQotCQkJCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9BY2Nlc3NUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9BY2Nlc3NUeXBlLmphdmEKaW5kZXggYjM3MTQ2MC4uZGZkNTYwMSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQWNjZXNzVHlwZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0FjY2Vzc1R5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDE4ICs5LDU2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKKwogLyoqCi0gKiAKLSAqIAorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSAyLjAgZW51bQorICogamF2YXgucGVyc2lzdGVuY2UuQWNjZXNzVHlwZQorICogPHA+CiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLworLy8gVE9ETyBtb3ZlIHRvIGpwYTIgcGFja2FnZT8gY3VycmVudGx5IGludGVydHdpbmVkIHdpdGggMS4wIGNvZGUuLi4KIHB1YmxpYyBlbnVtIEFjY2Vzc1R5cGUgewogCi0JUFJPUEVSVFksCi0JRklFTEQ7CisJRklFTEQoSlBBMl8wLkFDQ0VTU19UWVBFX19GSUVMRCksCisJUFJPUEVSVFkoSlBBMl8wLkFDQ0VTU19UWVBFX19QUk9QRVJUWSk7CisKKworCXByaXZhdGUgU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWU7CisKKwlBY2Nlc3NUeXBlKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIEFjY2Vzc1R5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKKwkJcmV0dXJuIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhqYXZhQW5ub3RhdGlvblZhbHVlKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBBY2Nlc3NUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgeworCQlmb3IgKEFjY2Vzc1R5cGUgYWNjZXNzVHlwZSA6IEFjY2Vzc1R5cGUudmFsdWVzKCkpIHsKKwkJCWlmIChhY2Nlc3NUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKS5lcXVhbHMoamF2YUFubm90YXRpb25WYWx1ZSkpIHsKKwkJCQlyZXR1cm4gYWNjZXNzVHlwZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoQWNjZXNzVHlwZSBhY2Nlc3NUeXBlKSB7CisJCXJldHVybiAoYWNjZXNzVHlwZSA9PSBudWxsKSA/IG51bGwgOiBhY2Nlc3NUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKTsKKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Fubm90YXRpb24uamF2YQppbmRleCA3ZTExNWU2Li5mZjE3NzlhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Bbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEyLDcgKzEyLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwogCiAvKioKLSAqIAorICogQ29tbW9uIEphdmEgcmVzb3VyY2UgYW5ub3RhdGlvbiBiZWhhdmlvcgogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjAsMjQgKzIwLDMzIEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsJCitwdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb24KKwlleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3sKIAkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBhbm5vdGF0aW9uIG5hbWUuCisJICogUmV0dXJuIHRoZSBhbm5vdGF0aW9uJ3MgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGFzIG9wcG9zZWQgdG8gdGhlIHZhbHVlIG9mCisJICogdGhlIGFubm90YXRpb24ncyAnbmFtZScgZWxlbWVudC4gRm9yIGV4YW1wbGU6CisJICogICAgIEBjb20uZm9vLkJhcihuYW1lPSJUaG9tYXMiKQorCSAqICNnZXRBbm5vdGF0aW9uTmFtZSgpIHdpbGwgcmV0dXJuICJjb20uZm9vLkJhciIuCisJICogSW4gdHlwaWNhbCBzdWJjbGFzc2VzLCAjZ2V0TmFtZSgpIHdvdWxkIHJldHVybiAiVGhvbWFzIi4KIAkgKiBAc2VlIEpQQQogCSAqLwogCVN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCQotCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQorCiAJLyoqCi0JICogUmVtb3ZpbmcgdGhlIHVuZGVyeWxpbmcgSmF2YSBhbm5vdGF0aW9uCisJICogUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEpEVCBET00gYW5ub3RhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQKKwkgKiBBU1QgY29tcGlsYXRpb24gdW5pdC4KKwkgKi8KKwlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRKZHRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCS8qKgorCSAqIENyZWF0ZSBhbmQgYWRkIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgYW5ub3RhdGlvbiB0byB0aGUgSkRUIERPTS4KKwkgKi8KKwl2b2lkIG5ld0Fubm90YXRpb24oKTsKKworCS8qKgorCSAqIFJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBKYXZhIGFubm90YXRpb24gZnJvbSB0aGUgSkRUIERPTS4KIAkgKi8KIAl2b2lkIHJlbW92ZUFubm90YXRpb24oKTsKIAotCS8qKgotCSAqIENyZWF0ZSBhbmQgYWRkIEphdmEgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgbmV3QW5ub3RhdGlvbigpOwotCQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQW5ub3RhdGlvbkNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQW5ub3RhdGlvbkNvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYmIxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Bbm5vdGF0aW9uQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworCisvKioKKyAqIENvbW1vbiBiZWhhdmlvciBmb3IgYWxsIGFubm90YXRpb24gImNvbnRhaW5lcnMiLgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uQ29udGFpbmVyPFQgZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+Cit7CisJLyoqCisJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbi4KKwkgKiBVc2VkIHdoZW4gdHJhdmVyc2luZyB0aGUgQVNULgorCSAqLworCVN0cmluZyBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZSgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEpEVCBET00gYW5ub3RhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQKKwkgKiBBU1QgY29tcGlsYXRpb24gdW5pdC4gVXNlZCBhcyBhIHN0YXJ0aW5nIHBvaW50IHdoZW4gdHJhdmVyc2luZyB0aGUgQVNULgorCSAqLworCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldENvbnRhaW5lckpkdEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbidzIGVsZW1lbnQgdGhhdCBpcyB1c2VkCisJICogdG8gaW5kaWNhdGUgdGhlIG5lc3RlZCBhbm5vdGF0aW9ucyAodHlwaWNhbGx5ICJ2YWx1ZSIpLgorCSAqIFVzZWQgd2hlbiB0cmF2ZXJzaW5nIHRoZSBBU1QuCisJICovCisJU3RyaW5nIGdldEVsZW1lbnROYW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5lc3RlZCBhbm5vdGF0aW9ucyBoZWxkIGJ5IHRoZSBjb250YWluZXIuCisJICogVXNlZCB3aGVuIHRyYXZlcnNpbmcgdGhlIEFTVC4KKwkgKi8KKwlTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBuZXN0ZWQgYW5ub3RhdGlvbnMgaGVsZCBieSB0aGUgY29udGFpbmVyLgorCSAqLworCUxpc3RJdGVyYXRvcjxUPiBuZXN0ZWRBbm5vdGF0aW9ucygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbmVzdGVkIGFubm90YXRpb25zIGhlbGQgYnkgdGhlIGNvbnRhaW5lci4KKwkgKi8KKwlpbnQgbmVzdGVkQW5ub3RhdGlvbnNTaXplKCk7CisKKwkvKioKKwkgKiBBZGQgYSBuZXN0ZWQgYW5ub3RhdGlvbiB0byB0aGUgY29udGFpbmVyCisJICogd2l0aG91dCBmaXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbi4KKwkgKi8KKwlUIGFkZE5lc3RlZEFubm90YXRpb25JbnRlcm5hbCgpOworCisJLyoqCisJICogVGhlIHNwZWNpZmllZCBuZXN0ZWQgYW5ub3RhdGlvbiB3YXMgYWRkZWQgdG8gdGhlIGNvbnRhaW5lciBhdCB0aGUKKwkgKiBzcGVjaWZpZWQgaW5kZXg7IG5vdGlmeSBpbnRlcmVzdGVkIHBhcnRpZXMuCisJICovCisJdm9pZCBuZXN0ZWRBbm5vdGF0aW9uQWRkZWQoaW50IGluZGV4LCBUIG5lc3RlZEFubm90YXRpb24pOworCisJLyoqCisJICogTW92ZSB0aGUgbmVzdGVkIGFubm90YXRpb24gYXQgdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggaW4gdGhlCisJICogY29udGFpbmVyIHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4IHdpdGhvdXQgZmlyaW5nIGNoYW5nZSBub3RpZmljYXRpb24uCisJICogUmV0dXJuIHRoZSBtb3ZlZCBuZXN0ZWQgYW5ub3RhdGlvbi4KKwkgKi8KKwlUIG1vdmVOZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOworCisJLyoqCisJICogQSBuZXN0ZWQgYW5ub3RhdGlvbiB3YXMgbW92ZWQgd2l0aGluIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbiBmcm9tIHRoZQorCSAqIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQgaW5kZXg7IG5vdGlmeSBpbnRlcmVzdGVkCisJICogcGFydGllcy4KKwkgKi8KKwl2b2lkIG5lc3RlZEFubm90YXRpb25Nb3ZlZChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIG5lc3RlZCBhbm5vdGF0aW9uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUKKwkgKiBjb250YWluZXIgd2l0aG91dCBmaXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbi4KKwkgKi8KKwlUIHJlbW92ZU5lc3RlZEFubm90YXRpb25JbnRlcm5hbChpbnQgaW5kZXgpOworCisJLyoqCisJICogVGhlIHNwZWNpZmllZCBuZXN0ZWQgYW5ub3RhdGlvbiB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBjb250YWluZXIKKwkgKiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4OyBub3RpZnkgaW50ZXJlc3RlZCBwYXJ0aWVzLgorCSAqLworCXZvaWQgbmVzdGVkQW5ub3RhdGlvblJlbW92ZWQoaW50IGluZGV4LCBUIG5lc3RlZEFubm90YXRpb24pOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQppbmRleCAyN2FiMzgzLi5mOGI4M2FiIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwxNiArOSwxNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKIAogLyoqCi0gKiBVc2VkIGZvciBidWlsZGluZyBuZXcgQW5ub3RhdGlvbnMuIAotICogVGhlc2Ugc2hvdWxkIGJlIHVzZWQgdG8gZGVmaW5lIG5vbi1tYXBwaW5nIGFubm90YXRpb25zLiAgSWYgeW91Ci0gKiB3YW50IHRvIHByb3ZpZGUgbmV3IEFubm90YXRpb25EZWZpbml0aW9ucyB5b3Ugd2lsbCBuZWVkCi0gKiB0byBjcmVhdGUgYSBuZXcgSnBhUGxhdGZvcm0gYnkgZXh0ZW5kaW5nIEdlbmVyaWNKcGFQbGF0Zm9ybS4KKyAqIFVzZWQgdG8gYnVpbGQgQW5ub3RhdGlvbnMgZGlzY292ZXJlZCBpbiB0aGUgSmF2YSBzb3VyY2UgY29kZS4KKyAqIFRvIHByb3ZpZGUgbmV3IEFubm90YXRpb25EZWZpbml0aW9ucywgY3JlYXRlIGEgbmV3IEpwYVBsYXRmb3JtCisgKiBieSBpbXBsZW1lbnRpbmcgSnBhUGxhdGZvcm0gYW5kL29yIGV4dGVuZGluZyBHZW5lcmljSnBhUGxhdGZvcm0uCiAgKiAKLSAqIEBzZWUgTWFwcGluZ0Fubm90YXRpb24KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uR2VuZXJpY0pwYVBsYXRmb3JtCisgKiBAc2VlIEFubm90YXRpb24KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm0KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yOSwxNCArMzAsMzMgQEAKIHB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvbkRlZmluaXRpb24KIHsKIAkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBhbm5vdGF0aW9uIG5hbWUKKwkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24gdGhlIGRlZmluaXRpb24gd2lsbCBidWlsZCBpbiB0aGUKKwkgKiB2YXJpb3VzICNidWlsZC4uLiguLi4pIG1ldGhvZHMuCiAJICovCiAJU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCk7CiAJCiAJLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhbiBBbm5vdGF0aW9uIGdpdmVuIHRoZSBNZW1iZXIKKwkgKiBCdWlsZCBhbmQgcmV0dXJuIGFuIGFubm90YXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgbWVtYmVyLgogCSAqLwogCUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKTsKIAkKLQlBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpOworCS8qKgorCSAqIEJ1aWxkIGFuZCByZXR1cm4gYW4gYW5ub3RhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBKRFQgYW5ub3RhdGlvbgorCSAqIG9uIHRoZSBzcGVjaWZpZWQgbWVtYmVyLgorCSAqLworCUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKTsKKwkKKwkvKioKKwkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgIm51bGwiIGFubm90YXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgbWVtYmVyLgorCSAqIE9ubHkgY2VydGFpbiBhbm5vdGF0aW9ucyBhcmUgcmVxdWlyZWQgdG8gaGF2ZSAibnVsbCIgaW1wbGVtZW50YXRpb25zOworCSAqIHR5cGljYWxseSB0aGUgYW5ub3RhdGlvbnMgd2l0aCByZWFzb25hYmx5IGNvbXBsZXggZGVmYXVsdCBiZWhhdmlvci4KKwkgKiBUaGUgIm51bGwiIGFubm90YXRpb24gaXMgdXNlZCBieSB0aGUgY29ycmVzcG9uZGluZyBkZWZhdWx0IGNvbnRleHQgbW9kZWwuCisJICogVGhlICJudWxsIiBhbm5vdGF0aW9uIHNpbXBsaWZpZXMgdGhlIGNvbnRleHQgbW9kZWwgY29kZSwgYWxsb3dpbmcgdGhlCisJICogY29udGV4dCBtb2RlbCB0byBzaW1wbHkgc2V0IHZhcmlvdXMgYml0cyBvZiBzdGF0ZSAoZS5nLiAnbmFtZScpIGFuZCB0aGUKKwkgKiAibnVsbCIgYW5ub3RhdGlvbiB3aWxsIGNyZWF0ZSBhIG5ldyAicmVhbCIgYW5ub3RhdGlvbiBhbmQgZm9yd2FyZCB0aGUKKwkgKiBuZXcgc3RhdGUgdG8gaXQuIFRoaXMgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIG51bGwgY2hlY2tzIGluIHRoZSBjb250ZXh0CisJICogbW9kZWwgKGhvcGVmdWxseSkuCisJICovCisJQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KTsKKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEKaW5kZXggYWM5NzhjZC4uNzFlOTE0ZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEyLDcgKzEyLDggQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogCiAvKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlIGFubm90YXRpb24KKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuQXNzb2NpYXRpb25PdmVycmlkZQogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjAsMjggKzIxLDQ3IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gZXh0ZW5kcyBPdmVycmlkZUFubm90YXRpb24KK3B1YmxpYyBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24KKwlleHRlbmRzIE92ZXJyaWRlQW5ub3RhdGlvbgogewogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREU7CiAKLQkKKwogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqb2luQ29sdW1ucyBlbGVtZW50IG9mIHRoZSBBc3NvY2lhdGlvbk92ZXJyaWRlIGFubm90YXRpb24uCi0JICogUmV0dXJucyBhbiBlbXB0eSBpdGVyYXRvciBpZiB0aGUgam9pbkNvbHVtbnMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnam9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIEFzc29jaWF0aW9uT3ZlcnJpZGUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmF0b3IgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KIAkgKi8KIAlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zKCk7CisJCVN0cmluZyBKT0lOX0NPTFVNTlNfTElTVCA9ICJqb2luQ29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKIAkKLQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KTsKLQkKLQlpbnQgaW5kZXhPZkpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbik7Ci0JCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdqb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgQXNzb2NpYXRpb25PdmVycmlkZSBhbm5vdGF0aW9uLgorCSAqLwogCWludCBqb2luQ29sdW1uc1NpemUoKTsKIAorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnam9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIEFzc29jaWF0aW9uT3ZlcnJpZGUgYW5ub3RhdGlvbi4KKwkgKi8KKwlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KTsKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2pvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBBc3NvY2lhdGlvbk92ZXJyaWRlIGFubm90YXRpb24uCisJICovCisJaW50IGluZGV4T2ZKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pOworCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnam9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIEFzc29jaWF0aW9uT3ZlcnJpZGUgYW5ub3RhdGlvbi4KKwkgKi8KIAlKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRKb2luQ29sdW1uKGludCBpbmRleCk7CiAJCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdqb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgQXNzb2NpYXRpb25PdmVycmlkZSBhbm5vdGF0aW9uLgorCSAqLworCXZvaWQgbW92ZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdqb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgQXNzb2NpYXRpb25PdmVycmlkZSBhbm5vdGF0aW9uLgorCSAqLwogCXZvaWQgcmVtb3ZlSm9pbkNvbHVtbihpbnQgaW5kZXgpOwogCQotCXZvaWQgbW92ZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQotCQlTdHJpbmcgSk9JTl9DT0xVTU5TX0xJU1QgPSAiam9pbkNvbHVtbnNMaXN0IjsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLmphdmEKaW5kZXggNjU0OTg3Yy4uZWUyOTRhYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCiAvKioKLSAqIAorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlcwogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMTgsOSArMTksMTAgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gZXh0ZW5kcyBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZT4KK3B1YmxpYyBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uCisJZXh0ZW5kcyBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24+CiB7CiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVM7CiAKLQlTdHJpbmcgQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QgPSAiYXNzb2NpYXRpb25PdmVyaWRlc0xpc3QiOworCVN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERVNfTElTVCA9ICJhc3NvY2lhdGlvbk92ZXJpZGVzIjsgLy8kTk9OLU5MUy0xJAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uamF2YQppbmRleCBjOWVhYTViLi4yNTA2MjQyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3ICsxMCw4IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7CiAKIC8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLkF0dHJpYnV0ZU92ZXJyaWRlIGFubm90YXRpb24KKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuQXR0cmlidXRlT3ZlcnJpZGUKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTE4LDI4ICsxOSwyOSBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBleHRlbmRzIE92ZXJyaWRlQW5ub3RhdGlvbgorcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24KKwlleHRlbmRzIE92ZXJyaWRlQW5ub3RhdGlvbgogewogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuQVRUUklCVVRFX09WRVJSSURFOwotCQkKKworCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGNvbHVtbiBlbGVtZW50IG9mIHRoZSBBdHRyaWJ1dGVPdmVycmlkZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgY29sdW1uIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbHVtbicgZWxlbWVudCBvZiB0aGUgQXR0cmlidXRlT3ZlcnJpZGUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgogCSAqLwogCUNvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uKCk7Ci0JCisJCVN0cmluZyBDT0xVTU5fUFJPUEVSVFkgPSAiY29sdW1uIjsgLy8kTk9OLU5MUy0xJAorCisJQ29sdW1uQW5ub3RhdGlvbiBnZXROb25OdWxsQ29sdW1uKCk7CisKIAkvKioKLQkgKiBBZGQgdGhlIGNvbHVtbiBlbGVtZW50IHRvIHRoZSBBdHRyaWJ1dGVPdmVycmlkZSBhbm5vdGF0aW9uLgorCSAqIEFkZCB0aGUgJ2NvbHVtbicgZWxlbWVudCB0byB0aGUgQXR0cmlidXRlT3ZlcnJpZGUgYW5ub3RhdGlvbi4KIAkgKi8KIAlDb2x1bW5Bbm5vdGF0aW9uIGFkZENvbHVtbigpOwotCQorCiAJLyoqCi0JICogUmVtb3ZlIHRoZSBjb2x1bW4gZWxlbWVudCBmcm9tIHRoZSBBdHRyaWJ1dGVPdmVycmlkZSBhbm5vdGF0aW9uLgorCSAqIFJlbW92ZSB0aGUgJ2NvbHVtbicgZWxlbWVudCBmcm9tIHRoZSBBdHRyaWJ1dGVPdmVycmlkZSBhbm5vdGF0aW9uLgogCSAqLwogCXZvaWQgcmVtb3ZlQ29sdW1uKCk7Ci0JCi0JQ29sdW1uQW5ub3RhdGlvbiBnZXROb25OdWxsQ29sdW1uKCk7Ci0JCi0JU3RyaW5nIENPTFVNTl9QUk9QRVJUWSA9ICJjb2x1bW5Qcm9wZXJ0eSI7CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uamF2YQppbmRleCBhNTkwMzY1Li42Y2JjZDIzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDcgKzEwLDggQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKIAogLyoqCi0gKiAKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuQXR0cmlidXRlT3ZlcnJpZGVzCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0xOCw5ICsxOSwxMCBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24gZXh0ZW5kcyBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGU+CitwdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24KKwlleHRlbmRzIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24+CiB7CiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTOwogCi0JU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERVNfTElTVCA9ICJhdHRyaWJ1dGVPdmVycmlkZXNMaXN0IjsKKwlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFU19MSVNUID0gImF0dHJpYnV0ZU92ZXJyaWRlcyI7IC8vJE5PTi1OTFMtMSQKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2VDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9CYXNlQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmluZGV4IGZjNDQ2NmIuLjMxYjlhYmUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2VDb2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQmFzZUNvbHVtbkFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMyw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgotICogCisgKiBDb21tb24gcHJvdG9jb2wgYW1vbmcKKyAqICAgICBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4KKyAqICAgICBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMSwxMDggKzIzLDExMSBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VDb2x1bW5Bbm5vdGF0aW9uIGV4dGVuZHMgTmFtZWRDb2x1bW5Bbm5vdGF0aW9uCitwdWJsaWMgaW50ZXJmYWNlIEJhc2VDb2x1bW5Bbm5vdGF0aW9uCisJZXh0ZW5kcyBOYW1lZENvbHVtbkFubm90YXRpb24KIHsKLQogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB1bmlxdWUgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgdW5pcXVlIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndW5pcXVlJyBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KIAkgKi8KIAlCb29sZWFuIGdldFVuaXF1ZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB1bmlxdWUgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgdW5pcXVlIHZhbHVlUGFpciBmcm9tIHRoZSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiB1bmlxdWUpOwkKLQkJU3RyaW5nIFVOSVFVRV9QUk9QRVJUWSA9ICJ1bmlxdWVQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG51bGxhYmxlIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG51bGxhYmxlIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgotCSAqLwotCUJvb2xlYW4gZ2V0TnVsbGFibGUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbnVsbGFibGUgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgbnVsbGFibGUgdmFsdWVQYWlyIGZyb20gdGhlIGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldE51bGxhYmxlKEJvb2xlYW4gbnVsbGFibGUpOwotCQlTdHJpbmcgTlVMTEFCTEVfUFJPUEVSVFkgPSAibnVsbGFibGVQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGluc2VydGFibGUgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgaW5zZXJ0YWJsZSB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KLQkgKi8KLQlCb29sZWFuIGdldEluc2VydGFibGUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgaW5zZXJ0YWJsZSBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBpbnNlcnRhYmxlIHZhbHVlUGFpciBmcm9tIHRoZSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBzZXRJbnNlcnRhYmxlKEJvb2xlYW4gaW5zZXJ0YWJsZSk7Ci0JCVN0cmluZyBJTlNFUlRBQkxFX1BST1BFUlRZID0gImluc2VydGFibGVQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHVwZGF0YWJsZSBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSB1cGRhdGFibGUgdmFsdWVQYWlyIGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uCi0JICovCi0JQm9vbGVhbiBnZXRVcGRhdGFibGUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdXBkYXRhYmxlIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIHVwZGF0YWJsZSB2YWx1ZVBhaXIgZnJvbSB0aGUgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gdXBkYXRhYmxlKTsKLQkJU3RyaW5nIFVQREFUQUJMRV9QUk9QRVJUWSA9ICJ1cGRhdGFibGVQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHRhYmxlIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHRhYmxlIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgotCSAqLwotCVN0cmluZyBnZXRUYWJsZSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB0YWJsZSBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSB0YWJsZSB2YWx1ZVBhaXIgZnJvbSB0aGUgYW5ub3RhdGlvbgotCSAqLwotCXZvaWQgc2V0VGFibGUoU3RyaW5nIHRhYmxlKTsKLQkJU3RyaW5nIFRBQkxFX1BST1BFUlRZID0gInRhYmxlUHJvcGVydHkiOworCQlTdHJpbmcgVU5JUVVFX1BST1BFUlRZID0gInVuaXF1ZSI7IC8vJE5PTi1OTFMtMSQKIAotCQogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB1bmlxdWUgZWxlbWVudC4gSWYgdGhlIHVuaXF1ZSBlbGVtZW50CisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd1bmlxdWUnIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiB1bmlxdWUpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd1bmlxdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50CiAJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0VW5pcXVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIAorCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG51bGxhYmxlIGVsZW1lbnQuIElmIHRoZSBudWxsYWJsZSBlbGVtZW50CisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdudWxsYWJsZScgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJQm9vbGVhbiBnZXROdWxsYWJsZSgpOworCQlTdHJpbmcgTlVMTEFCTEVfUFJPUEVSVFkgPSAibnVsbGFibGUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ251bGxhYmxlJyBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiBudWxsYWJsZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ251bGxhYmxlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudAogCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldE51bGxhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIAorCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGluc2VydGFibGUgZWxlbWVudC4gSWYgdGhlIGluc2VydGFibGUgZWxlbWVudAorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaW5zZXJ0YWJsZScgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCk7CisJCVN0cmluZyBJTlNFUlRBQkxFX1BST1BFUlRZID0gImluc2VydGFibGUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2luc2VydGFibGUnIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRJbnNlcnRhYmxlKEJvb2xlYW4gaW5zZXJ0YWJsZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2luc2VydGFibGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50CiAJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0SW5zZXJ0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKKwogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB1cGRhdGFibGUgZWxlbWVudC4gSWYgdGhlIHVwZGF0YWJsZSBlbGVtZW50CisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd1cGRhdGFibGUnIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUJvb2xlYW4gZ2V0VXBkYXRhYmxlKCk7CisJCVN0cmluZyBVUERBVEFCTEVfUFJPUEVSVFkgPSAidXBkYXRhYmxlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd1cGRhdGFibGUnIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRVcGRhdGFibGUoQm9vbGVhbiB1cGRhdGFibGUpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd1cGRhdGFibGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50CiAJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0VXBkYXRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIAorCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHRhYmxlIGVsZW1lbnQuIElmIHRoZSB0YWJsZSBlbGVtZW50CisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd0YWJsZScgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJU3RyaW5nIGdldFRhYmxlKCk7CisJCVN0cmluZyBUQUJMRV9QUk9QRVJUWSA9ICJ0YWJsZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndGFibGUnIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRUYWJsZShTdHJpbmcgdGFibGUpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd0YWJsZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKIAkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgogCSAqLwogCVRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKIAkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc3RpdGlvbiB0b3VjaGVzIHRoZSB0YWJsZSBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgdGFibGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICd0YWJsZScgZWxlbWVudC4KKwkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCiAJICovCiAJYm9vbGVhbiB0YWJsZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9CYXNlTmFtZWRRdWVyeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NzJmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9CYXNlTmFtZWRRdWVyeUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogQ29tbW9uIHByb3RvY29sIGFtb25nOgorICogICAgIGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcnkKKyAqICAgICBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZE5hdGl2ZVF1ZXJ5CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgoreworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgKlF1ZXJ5IGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlTdHJpbmcgZ2V0TmFtZSgpOwkKKwkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgKlF1ZXJ5IGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICduYW1lJyBlbGVtZW50LiBJZiBlbGVtZW50CisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpRdWVyeSBhbm5vdGF0aW9uLgorCSAqLworCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdxdWVyeScgZWxlbWVudCBvZiB0aGUgKlF1ZXJ5IGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlTdHJpbmcgZ2V0UXVlcnkoKTsJCisJCVN0cmluZyBRVUVSWV9QUk9QRVJUWSA9ICJxdWVyeSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncXVlcnknIGVsZW1lbnQgb2YgdGhlICpRdWVyeSBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldFF1ZXJ5KFN0cmluZyBxdWVyeSk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdxdWVyeScgZWxlbWVudC4gSWYgZWxlbWVudAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqUXVlcnkgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0UXVlcnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2hpbnRzJyBlbGVtZW50IG9mIHRoZSAqUXVlcnkgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmF0b3IgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlMaXN0SXRlcmF0b3I8UXVlcnlIaW50QW5ub3RhdGlvbj4gaGludHMoKTsKKwkJU3RyaW5nIEhJTlRTX0xJU1QgPSAiaGludHMiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdoaW50cycgZWxlbWVudCBvZiB0aGUgKlF1ZXJ5IGFubm90YXRpb24uCisJICovCisJaW50IGhpbnRzU2l6ZSgpOworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdoaW50cycgZWxlbWVudCBvZiB0aGUgKlF1ZXJ5IGFubm90YXRpb24uCisJICovCisJUXVlcnlIaW50QW5ub3RhdGlvbiBoaW50QXQoaW50IGluZGV4KTsKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2hpbnRzJyBlbGVtZW50IG9mIHRoZSAqUXVlcnkgYW5ub3RhdGlvbi4KKwkgKi8KKwlpbnQgaW5kZXhPZkhpbnQoUXVlcnlIaW50QW5ub3RhdGlvbiBoaW50KTsKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2hpbnRzJyBlbGVtZW50IG9mIHRoZSAqUXVlcnkgYW5ub3RhdGlvbi4KKwkgKi8KKwlRdWVyeUhpbnRBbm5vdGF0aW9uIGFkZEhpbnQoaW50IGluZGV4KTsKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2hpbnRzJyBlbGVtZW50IG9mIHRoZSAqUXVlcnkgYW5ub3RhdGlvbi4KKwkgKi8KKwl2b2lkIG1vdmVIaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaGludHMnIGVsZW1lbnQgb2YgdGhlICpRdWVyeSBhbm5vdGF0aW9uLgorCSAqLworCXZvaWQgcmVtb3ZlSGludChpbnQgaW5kZXgpOworCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQmFzZVRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQmFzZVRhYmxlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZDdiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9CYXNlVGFibGVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIENvbW1vbiBwcm90b2NvbCBhbW9uZzoKKyAqICAgICBqYXZheC5wZXJzaXN0ZW5jZS5UYWJsZQorICogICAgIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5UYWJsZQorICogICAgIGphdmF4LnBlcnNpc3RlbmNlLlNlY29uZGFyeVRhYmxlCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEJhc2VUYWJsZUFubm90YXRpb24KKwlleHRlbmRzIEFubm90YXRpb24KK3sKKwkKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFibGUgYW5ub3RhdGlvbiBleGlzdHMgaW4gSmF2YSwgZmFsc2UgaWYgaXQgZG9lcyBub3QuCisJICovCisJYm9vbGVhbiBpc1NwZWNpZmllZCgpOworCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgKlRhYmxlIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlTdHJpbmcgZ2V0TmFtZSgpOworCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lJyBlbGVtZW50IG9mIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKKwkJCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICduYW1lJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKlRhYmxlIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnbmFtZScgZWxlbWVudC4KKwkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCisJICovCisJYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2NoZW1hJyBlbGVtZW50IG9mIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCVN0cmluZyBnZXRTY2hlbWEoKTsKKwkJU3RyaW5nIFNDSEVNQV9QUk9QRVJUWSA9ICJzY2hlbWEiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NjaGVtYScgZWxlbWVudCBvZiB0aGUgKlRhYmxlIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0U2NoZW1hKFN0cmluZyBzY2hlbWEpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnc2NoZW1hJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKlRhYmxlIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICdzY2hlbWEnIGVsZW1lbnQuCisJICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgorCSAqLworCWJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY2F0YWxvZycgZWxlbWVudCBvZiB0aGUgKlRhYmxlIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlTdHJpbmcgZ2V0Q2F0YWxvZygpOworCQlTdHJpbmcgQ0FUQUxPR19QUk9QRVJUWSA9ICJjYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdjYXRhbG9nJyBlbGVtZW50IG9mIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnY2F0YWxvZycgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpUYWJsZSBhbm5vdGF0aW9uLgorCSAqLworCVRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ2NhdGFsb2cnIGVsZW1lbnQuCisJICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgorCSAqLworCWJvb2xlYW4gY2F0YWxvZ1RvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3VuaXF1ZUNvbnN0cmFpbnRzJyBlbGVtZW50IG9mIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmF0b3IgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzKCk7CisJCVN0cmluZyBVTklRVUVfQ09OU1RSQUlOVFNfTElTVCA9ICJ1bmlxdWVDb25zdHJhaW50cyI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3VuaXF1ZUNvbnN0cmFpbnRzJyBlbGVtZW50IG9mIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KKwkgKi8KKwlpbnQgdW5pcXVlQ29uc3RyYWludHNTaXplKCk7CisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3VuaXF1ZUNvbnN0cmFpbnRzJyBlbGVtZW50IG9mIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KKwkgKi8KKwlVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QXQoaW50IGluZGV4KTsKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3VuaXF1ZUNvbnN0cmFpbnRzJyBlbGVtZW50IG9mIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KKwkgKi8KKwlpbnQgaW5kZXhPZlVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCk7CisJCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd1bmlxdWVDb25zdHJhaW50cycgZWxlbWVudCBvZiB0aGUgKlRhYmxlIGFubm90YXRpb24uCisJICovCisJVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOworCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndW5pcXVlQ29uc3RyYWludHMnIGVsZW1lbnQgb2YgdGhlICpUYWJsZSBhbm5vdGF0aW9uLgorCSAqLworCXZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd1bmlxdWVDb25zdHJhaW50cycgZWxlbWVudCBvZiB0aGUgKlRhYmxlIGFubm90YXRpb24uCisJICovCisJdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCk7CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9CYXNpY0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2ljQW5ub3RhdGlvbi5qYXZhCmluZGV4IGY4NTI5YjQuLjMzMTMzNGIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2ljQW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2ljQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEzLDcgKzEzLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIAogLyoqCi0gKiAKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuQmFzaWMKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIxLDQ1ICsyMiw0NiBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2ljQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgQmFzaWNBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCiB7Ci0JCiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5CQVNJQzsKLQkKKwogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBmZXRjaCBlbGVtZW50IG9mIHRoZSBCYXNpYyBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgZmV0Y2ggZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZmV0Y2gnIGVsZW1lbnQgb2YgdGhlIEJhc2ljIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KIAkgKi8KIAlGZXRjaFR5cGUgZ2V0RmV0Y2goKTsKLQkKKwkJU3RyaW5nIEZFVENIX1BST1BFUlRZID0gImZldGNoIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGZldGNoIGVsZW1lbnQgb2YgdGhlIEJhc2ljIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBmZXRjaCBlbGVtZW50LgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZmV0Y2gnIGVsZW1lbnQgb2YgdGhlIEJhc2ljIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgogCSAqLwogCXZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIGZldGNoKTsKLQkJU3RyaW5nIEZFVENIX1BST1BFUlRZID0gImZldGNoUHJvcGVydHkiOwotCQkKKwogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBvcHRpb25hbCBlbGVtZW50IG9mIHRoZSBCYXNpYyBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgb3B0aW9uYWwgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0T3B0aW9uYWwoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgb3B0aW9uYWwgZWxlbWVudCBvZiB0aGUgQmFzaWMgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIG9wdGlvbmFsIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKTsKLQkJU3RyaW5nIE9QVElPTkFMX1BST1BFUlRZID0gIm9wdGlvbmFsUHJvcGVydHkiOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBmZXRjaCBlbGVtZW50LiAgSWYgdGhlIGZldGNoIGVsZW1lbnQgCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdmZXRjaCcgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCiAJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEJhc2ljIGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKKworCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG9wdGlvbmFsIGVsZW1lbnQuICBJZiB0aGUgb3B0aW9uYWwgZWxlbWVudCAKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ29wdGlvbmFsJyBlbGVtZW50IG9mIHRoZSBCYXNpYyBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJQm9vbGVhbiBnZXRPcHRpb25hbCgpOworCQlTdHJpbmcgT1BUSU9OQUxfUFJPUEVSVFkgPSAib3B0aW9uYWwiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ29wdGlvbmFsJyBlbGVtZW50IG9mIHRoZSBCYXNpYyBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdvcHRpb25hbCcgZWxlbWVudC4gIElmIHRoZSBlbGVtZW50IAogCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBCYXNpYyBhbm5vdGF0aW9uLgogCSAqLwogCVRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9DYXNjYWRlVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQ2FzY2FkZVR5cGUuamF2YQppbmRleCBhNTRhYTIzLi41YWYxM2Q0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9DYXNjYWRlVHlwZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Nhc2NhZGVUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw4ICs5LDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKKwogLyoqCi0gKiAKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgZW51bQorICogamF2YXgucGVyc2lzdGVuY2UuQ2FzY2FkZVR5cGUKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTE5LDYzICsyMiw4MCBAQAogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCiBwdWJsaWMgZW51bSBDYXNjYWRlVHlwZSB7Ci0JCisKIAlBTEwoSlBBLkNBU0NBREVfVFlQRV9fQUxMKSwKIAlQRVJTSVNUKEpQQS5DQVNDQURFX1RZUEVfX1BFUlNJU1QpLAogCU1FUkdFKEpQQS5DQVNDQURFX1RZUEVfX01FUkdFKSwKIAlSRU1PVkUoSlBBLkNBU0NBREVfVFlQRV9fUkVNT1ZFKSwKIAlSRUZSRVNIKEpQQS5DQVNDQURFX1RZUEVfX1JFRlJFU0gpOwotCQorCisKIAlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCQorCiAJQ2FzY2FkZVR5cGUoU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKKwkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KIAkJdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZTsKIAl9Ci0JCisKIAlwdWJsaWMgU3RyaW5nIGdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSB7CiAJCXJldHVybiB0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWU7CiAJfQotCQotCXB1YmxpYyBzdGF0aWMgQ2FzY2FkZVR5cGVbXSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShTdHJpbmdbXSBqYXZhQW5ub3RhdGlvblZhbHVlcykgeworCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgQ2FzY2FkZVR5cGVbXSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZXMoT2JqZWN0W10gamF2YUFubm90YXRpb25WYWx1ZXMpIHsKIAkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWVzID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgQ2FzY2FkZVR5cGVbMF07CisJCQlyZXR1cm4gRU1QVFlfQ0FTQ0FERV9UWVBFX0FSUkFZOwogCQl9Ci0JCUNhc2NhZGVUeXBlW10gY2FzY2FkZVR5cGVzID0gbmV3IENhc2NhZGVUeXBlW2phdmFBbm5vdGF0aW9uVmFsdWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YUFubm90YXRpb25WYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZXNbaV07Ci0JCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSAhPSBudWxsKSB7Ci0JCQkJY2FzY2FkZVR5cGVzW2ldID0gY2FzY2FkZVR5cGUoamF2YUFubm90YXRpb25WYWx1ZSk7Ci0JCQl9CisJCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlcy5sZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIEVNUFRZX0NBU0NBREVfVFlQRV9BUlJBWTsKKwkJfQorCQkvL251bGxzIHdpbGwgZXhpc3QgaWYgdGhlcmUgaXMgYSB0eXBvIGluIG9uZSBvZiB0aGUgZW51bXMKKwkJamF2YUFubm90YXRpb25WYWx1ZXMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGphdmFBbm5vdGF0aW9uVmFsdWVzLCBudWxsKTsKKwkJaW50IGxlbiA9IGphdmFBbm5vdGF0aW9uVmFsdWVzLmxlbmd0aDsKKwkJQ2FzY2FkZVR5cGVbXSBjYXNjYWRlVHlwZXMgPSBuZXcgQ2FzY2FkZVR5cGVbbGVuXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkJY2FzY2FkZVR5cGVzW2ldID0gZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoamF2YUFubm90YXRpb25WYWx1ZXNbaV0pOwogCQl9CiAJCXJldHVybiBjYXNjYWRlVHlwZXM7CiAJfQorCXByaXZhdGUgc3RhdGljIGZpbmFsIENhc2NhZGVUeXBlW10gRU1QVFlfQ0FTQ0FERV9UWVBFX0FSUkFZID0gbmV3IENhc2NhZGVUeXBlWzBdOwogCi0JcHJpdmF0ZSBzdGF0aWMgQ2FzY2FkZVR5cGUgY2FzY2FkZVR5cGUoU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEFMTC5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkpKSB7Ci0JCQlyZXR1cm4gQUxMOwotCQl9Ci0JCWVsc2UgaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKFBFUlNJU1QuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpKSkgewotCQkJcmV0dXJuIFBFUlNJU1Q7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoTUVSR0UuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpKSkgewotCQkJcmV0dXJuIE1FUkdFOwotCQl9Ci0JCWVsc2UgaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKFJFTU9WRS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkpKSB7Ci0JCQlyZXR1cm4gUkVNT1ZFOwotCQl9Ci0JCWVsc2UgaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKFJFRlJFU0guZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpKSkgewotCQkJcmV0dXJuIFJFRlJFU0g7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjYXNjYWRlIHR5cGU6ICIgKyBqYXZhQW5ub3RhdGlvblZhbHVlKTsKKwlwdWJsaWMgc3RhdGljIENhc2NhZGVUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7CiAJfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdG9KYXZhQW5ub3RhdGlvblZhbHVlKENhc2NhZGVUeXBlW10gY2FzY2FkZVR5cGVzKSB7Ci0JCVN0cmluZ1tdIGphdmFBbm5vdGF0aW9uVmFsdWVzID0gbmV3IFN0cmluZ1tjYXNjYWRlVHlwZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNjYWRlVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCUNhc2NhZGVUeXBlIGNhc2NhZGVUeXBlID0gY2FzY2FkZVR5cGVzW2ldOwotCQkJamF2YUFubm90YXRpb25WYWx1ZXNbaV0gPSBjYXNjYWRlVHlwZS5qYXZhQW5ub3RhdGlvblZhbHVlOworCisJcHJpdmF0ZSBzdGF0aWMgQ2FzY2FkZVR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCWZvciAoQ2FzY2FkZVR5cGUgY2FzY2FkZVR5cGUgOiBDYXNjYWRlVHlwZS52YWx1ZXMoKSkgeworCQkJaWYgKGNhc2NhZGVUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKS5lcXVhbHMoamF2YUFubm90YXRpb25WYWx1ZSkpIHsKKwkJCQlyZXR1cm4gY2FzY2FkZVR5cGU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSB0b0phdmFBbm5vdGF0aW9uVmFsdWVzKENhc2NhZGVUeXBlW10gY2FzY2FkZVR5cGVzKSB7CisJCWlmIChjYXNjYWRlVHlwZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVNUFRZX1NUUklOR19BUlJBWTsKKwkJfQorCQlpbnQgbGVuID0gY2FzY2FkZVR5cGVzLmxlbmd0aDsKKwkJaWYgKGxlbiA9PSAwKSB7CisJCQlyZXR1cm4gRU1QVFlfU1RSSU5HX0FSUkFZOworCQl9CisKKwkJU3RyaW5nW10gamF2YUFubm90YXRpb25WYWx1ZXMgPSBuZXcgU3RyaW5nW2xlbl07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCWphdmFBbm5vdGF0aW9uVmFsdWVzW2ldID0gdG9KYXZhQW5ub3RhdGlvblZhbHVlKGNhc2NhZGVUeXBlc1tpXSk7CiAJCX0KIAkJcmV0dXJuIGphdmFBbm5vdGF0aW9uVmFsdWVzOwogCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKENhc2NhZGVUeXBlIGNhc2NhZGVUeXBlKSB7CisJCXJldHVybiAoY2FzY2FkZVR5cGUgPT0gbnVsbCkgPyBudWxsIDogY2FzY2FkZVR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOworCX0KIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmluZGV4IGRjMTdiZTQuLjlhMTBjZjggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0NvbHVtbkFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Db2x1bW5Bbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTMsNyArMTMsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogCiAvKioKLSAqIAorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4KICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIxLDYzICsyMiw2NiBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbHVtbkFubm90YXRpb24gZXh0ZW5kcyBCYXNlQ29sdW1uQW5ub3RhdGlvbgorcHVibGljIGludGVyZmFjZSBDb2x1bW5Bbm5vdGF0aW9uCisJZXh0ZW5kcyBCYXNlQ29sdW1uQW5ub3RhdGlvbgogewogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuQ09MVU1OOwogCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGxlbmd0aCBlbGVtZW50IG9mIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGxlbmd0aCB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2xlbmd0aCcgZWxlbWVudCBvZiB0aGUgQ29sdW1uIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KIAkgKi8KIAlJbnRlZ2VyIGdldExlbmd0aCgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBsZW5ndGggZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBsZW5ndGggdmFsdWVQYWlyIGZyb20gdGhlIGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldExlbmd0aChJbnRlZ2VyIGxlbmd0aCk7Ci0JCVN0cmluZyBMRU5HVEhfUFJPUEVSVFkgPSAibGVuZ3RoUHJvcGVydHkiOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBwcmVjaXNpb24gZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBwcmVjaXNpb24gdmFsdWVQYWlyIGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uCi0JICovCi0JSW50ZWdlciBnZXRQcmVjaXNpb24oKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgcHJlY2lzaW9uIGVsZW1lbnQgb2YgdGhlIGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgcHJlY2lzaW9uIHZhbHVlUGFpciBmcm9tIHRoZSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBzZXRQcmVjaXNpb24oSW50ZWdlciBwcmVjaXNpb24pOwotCQlTdHJpbmcgUFJFQ0lTSU9OX1BST1BFUlRZID0gInByZWNpc2lvblByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgc2NhbGUgZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBzY2FsZSB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KLQkgKi8KLQlJbnRlZ2VyIGdldFNjYWxlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHNjYWxlIGVsZW1lbnQgb2YgdGhlIGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgc2NhbGUgdmFsdWVQYWlyIGZyb20gdGhlIGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldFNjYWxlKEludGVnZXIgc2NhbGUpOwotCQlTdHJpbmcgU0NBTEVfUFJPUEVSVFkgPSAic2NhbGVQcm9wZXJ0eSI7CisJCVN0cmluZyBMRU5HVEhfUFJPUEVSVFkgPSAibGVuZ3RoIjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGxlbmd0aCBlbGVtZW50LiBJZiBsZW5ndGggZWxlbWVudAorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbGVuZ3RoJyBlbGVtZW50IG9mIHRoZSBDb2x1bW4gYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRMZW5ndGgoSW50ZWdlciBsZW5ndGgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdsZW5ndGgnIGVsZW1lbnQuIElmIGVsZW1lbnQKIAkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ29sdW1uIGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldExlbmd0aFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKKwogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBwcmVjaXNpb24gZWxlbWVudC4gSWYgcHJlY2lzaW9uIGVsZW1lbnQKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ByZWNpc2lvbicgZWxlbWVudCBvZiB0aGUgQ29sdW1uIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlJbnRlZ2VyIGdldFByZWNpc2lvbigpOworCQlTdHJpbmcgUFJFQ0lTSU9OX1BST1BFUlRZID0gInByZWNpc2lvbiI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncHJlY2lzaW9uJyBlbGVtZW50IG9mIHRoZSBDb2x1bW4gYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRQcmVjaXNpb24oSW50ZWdlciBwcmVjaXNpb24pOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdwcmVjaXNpb24nIGVsZW1lbnQuIElmIGVsZW1lbnQKIAkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ29sdW1uIGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldFByZWNpc2lvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCisKKwogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBzY2FsZSBlbGVtZW50LiBJZiBzY2FsZSBlbGVtZW50CisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdzY2FsZScgZWxlbWVudCBvZiB0aGUgQ29sdW1uIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlJbnRlZ2VyIGdldFNjYWxlKCk7CisJCVN0cmluZyBTQ0FMRV9QUk9QRVJUWSA9ICJzY2FsZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2NhbGUnIGVsZW1lbnQgb2YgdGhlIENvbHVtbiBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldFNjYWxlKEludGVnZXIgc2NhbGUpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdzY2FsZScgZWxlbWVudC4gSWYgZWxlbWVudAogCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDb2x1bW4gYW5ub3RhdGlvbi4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0U2NhbGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQ29udGFpbmVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvQ29udGFpbmVyQW5ub3RhdGlvbi5qYXZhCmluZGV4IDc3OTFlZmEuLjg3YTIwNzMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0NvbnRhaW5lckFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Db250YWluZXJBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwxMCArOSw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQogLyoqCi0gKiAKKyAqIENvbW1vbiBiZWhhdmlvciBmb3IgYWxsICJjb250YWluZXIiIGFubm90YXRpb25zLgogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjAsNDUgKzE4LDggQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBDb250YWluZXJBbm5vdGF0aW9uPFQgZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+IGV4dGVuZHMgQW5ub3RhdGlvbgorcHVibGljIGludGVyZmFjZSBDb250YWluZXJBbm5vdGF0aW9uPFQgZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+CisJZXh0ZW5kcyBBbm5vdGF0aW9uLCBBbm5vdGF0aW9uQ29udGFpbmVyPFQ+CiB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgbmVzdGFibGUgYW5ub3RhdGlvbiBuYW1lLiAgCi0JICovCi0JU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCBuYW1lIG9mIHRoZSBuZXN0YWJsZSBhbm5vdGF0aW9uIHdoZW4KLQkgKiBpdCBpcyBuZXN0ZWQgd2l0aGluZyB0aGUgY29udGFpbmVyIGFubm90YXRpbyBhcyBhIG1lbWJlciB2YWx1ZSBwYWkgIAotCSAqLwotCVN0cmluZyBnZXRFbGVtZW50TmFtZSgpOwotCi0JTGlzdEl0ZXJhdG9yPFQ+IG5lc3RlZEFubm90YXRpb25zKCk7Ci0JCi0JaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpOwotCi0JVCBuZXN0ZWRBbm5vdGF0aW9uQXQoaW50IGluZGV4KTsKLQkKLQlUIG5lc3RlZEFubm90YXRpb25Gb3Iob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gamR0QW5ub3RhdGlvbik7Ci0JCi0JaW50IGluZGV4T2YoVCBuZXN0ZWRBbm5vdGF0aW9uKTsKLQkJCi0JVCBhZGQoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBBZGQgZGlyZWN0bHkgdG8gdGhlIExpc3Qgd2l0aG91dCBmaXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkgKi8KLQlUIGFkZEludGVybmFsKGludCBpbmRleCk7Ci0JCi0Jdm9pZCByZW1vdmUoVCBuZXN0ZWRBbm5vdGF0aW9uKTsKLQkKLQl2b2lkIHJlbW92ZShpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIE1vdmUgaW4gdGhlIExpc3Qgd2l0aG91dCBmaXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkgKi8KLQl2b2lkIG1vdmVJbnRlcm5hbChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCi0Jdm9pZCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKKwkvLyBjb21iaW5lIHR3byBpbnRlcmZhY2VzCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uamF2YQppbmRleCBkODZhYmZiLi44N2U4YjA0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCiAvKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yQ29sdW1uIGFubm90YXRpb24KKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuRGlzY3JpbWluYXRvckNvbHVtbgogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMTgsMzQgKzE5LDM2IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gZXh0ZW5kcyBOYW1lZENvbHVtbkFubm90YXRpb24KK3B1YmxpYyBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24KKwlleHRlbmRzIE5hbWVkQ29sdW1uQW5ub3RhdGlvbgogewogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU47CiAKIAkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgZGlzY3JpbWluYXRvclR5cGUgZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuRGlzY3JpbWluYXRvckNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgZGlzY3JpbWluYXRvclR5cGUgdmFsdWVQYWlyIGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdkaXNjcmltaW5hdG9yVHlwZScgZWxlbWVudCBvZiB0aGUgRGlzY3JpbWluYXRvckNvbHVtbiBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCiAJICovCiAJRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKTsKLQkKKwkJU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSA9ICJkaXNjcmltaW5hdG9yVHlwZSI7IC8vJE5PTi1OTFMtMSQKKwogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBkaXNjcmltaW5hdG9yVHlwZSBlbGVtZW50IG9mIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5PcmRlckJ5IGFubm90YXRpb24uCi0JICogU2V0IHRoZSBkaXNjcmltaW5hdG9yVHlwZSB0byBudWxsIHRvIHJlbW92ZSB0aGUgZGlzY3JpbWluYXRvclR5cGUgdmFsdWVQYWlyCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdkaXNjcmltaW5hdG9yVHlwZScgZWxlbWVudCBvZiB0aGUgRGlzY3JpbWluYXRvckNvbHVtbiBhbm5vdGF0aW9uLgorCSAqIFNldCB0aGUgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCiAJICovCiAJdm9pZCBzZXREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSk7Ci0JCVN0cmluZyBESVNDUklNSU5BVE9SX1RZUEVfUFJPUEVSVFkgPSAiZGlzY3JpbWluYXRvclR5cGVQcm9wZXJ0eSI7Ci0JCisKKwogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBsZW5ndGggZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuRGlzY3JpbWluYXRvckNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbGVuZ3RoIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbGVuZ3RoJyBlbGVtZW50IG9mIHRoZSBEaXNjcmltaW5hdG9yQ29sdW1uIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KIAkgKi8KIAlJbnRlZ2VyIGdldExlbmd0aCgpOwotCQorCQlTdHJpbmcgTEVOR1RIX1BST1BFUlRZID0gImxlbmd0aCI7IC8vJE5PTi1OTFMtMSQKKwogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBsZW5ndGggZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuT3JkZXJCeSBhbm5vdGF0aW9uLgotCSAqIFNldCB0aGUgbGVuZ3RoIHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBsZW5ndGggdmFsdWVQYWlyCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdsZW5ndGgnIGVsZW1lbnQgb2YgdGhlIERpc2NyaW1pbmF0b3JDb2x1bW4gYW5ub3RhdGlvbi4KKwkgKiBTZXQgdGhlIHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgogCSAqLwogCXZvaWQgc2V0TGVuZ3RoKEludGVnZXIgbGVuZ3RoKTsKLQkJU3RyaW5nIExFTkdUSF9QUk9QRVJUWSA9ICJsZW5ndGhQcm9wZXJ0eSI7CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yVHlwZS5qYXZhCmluZGV4IGJlNTVlNWIuLjIwMTM2YjIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JUeXBlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclR5cGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3ICsxMCw4IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7CiAKIC8qKgotICogCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGVudW0KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JUeXBlCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0xOSw0MSArMjAsNDMgQEAKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwogcHVibGljIGVudW0gRGlzY3JpbWluYXRvclR5cGUgewotCQotCVNUUklORywKLQlDSEFSLAotCUlOVEVHRVI7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBEaXNjcmltaW5hdG9yVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgeworCisJU1RSSU5HKEpQQS5ESVNDUklNSU5BVE9SX1RZUEVfX1NUUklORyksCisJQ0hBUihKUEEuRElTQ1JJTUlOQVRPUl9UWVBFX19DSEFSKSwKKwlJTlRFR0VSKEpQQS5ESVNDUklNSU5BVE9SX1RZUEVfX0lOVEVHRVIpOworCisKKwlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOworCisJRGlzY3JpbWluYXRvclR5cGUoU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKIAkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKIAkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoSlBBLkRJU0NSSU1JTkFUT1JfVFlQRV9fU1RSSU5HKSkgewotCQkJcmV0dXJuIFNUUklORzsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoSlBBLkRJU0NSSU1JTkFUT1JfVFlQRV9fQ0hBUikpIHsKLQkJCXJldHVybiBDSEFSOwotCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhKUEEuRElTQ1JJTUlOQVRPUl9UWVBFX19JTlRFR0VSKSkgewotCQkJcmV0dXJuIElOVEVHRVI7CisJCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIERpc2NyaW1pbmF0b3JUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRGlzY3JpbWluYXRvclR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCWZvciAoRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUgOiBEaXNjcmltaW5hdG9yVHlwZS52YWx1ZXMoKSkgeworCQkJaWYgKGRpc2NyaW1pbmF0b3JUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKS5lcXVhbHMoamF2YUFubm90YXRpb25WYWx1ZSkpIHsKKwkJCQlyZXR1cm4gZGlzY3JpbWluYXRvclR5cGU7CisJCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCWlmIChkaXNjcmltaW5hdG9yVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGRpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCQljYXNlIFNUUklORyA6Ci0JCQkJcmV0dXJuIEpQQS5ESVNDUklNSU5BVE9SX1RZUEVfX1NUUklORzsKLQkJCWNhc2UgQ0hBUiA6Ci0JCQkJcmV0dXJuIEpQQS5ESVNDUklNSU5BVE9SX1RZUEVfX0NIQVI7Ci0JCQljYXNlIElOVEVHRVIgOgotCQkJCXJldHVybiBKUEEuRElTQ1JJTUlOQVRPUl9UWVBFX19JTlRFR0VSOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBkaXNjcmltaW5hdG9yIHR5cGU6ICIgKyBkaXNjcmltaW5hdG9yVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChkaXNjcmltaW5hdG9yVHlwZSA9PSBudWxsKSA/IG51bGwgOiBkaXNjcmltaW5hdG9yVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7CiAJfQorCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLmphdmEKaW5kZXggMjI1OGY2YS4uNmFjODIzZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMyw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLk9yZGVyQnkgYW5ub3RhdGlvbgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yVmFsdWUKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIxLDI2ICsyMiwyNiBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCitwdWJsaWMgaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24KKwlleHRlbmRzIEFubm90YXRpb24KIHsKIAlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLkRJU0NSSU1JTkFUT1JfVkFMVUU7CiAKIAkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuT3JkZXJCeSBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgdmFsdWUgdmFsdWVQYWlyIGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgRGlzY3JpbWluYXRvclZhbHVlIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24uCiAJICovCiAJU3RyaW5nIGdldFZhbHVlKCk7CisJCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKIAkKIAkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuT3JkZXJCeSBhbm5vdGF0aW9uLgotCSAqIFNldHRpbmcgdGhlIHZhbHVlIHRvIG51bGwgd2lsbCBub3QgcmVtb3ZlIHRoZSBPcmRlckJ5IGFubm90YXRpb24KKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBEaXNjcmltaW5hdG9yVmFsdWUgYW5ub3RhdGlvbi4KIAkgKi8KIAl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZVByb3BlcnR5IjsKIAogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB2YWx1ZSBlbGVtZW50LiBJZiB2YWx1ZSBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIERpc3JpbWluYXRvclZhbHVlIGFubm90YXRpb24uCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgRGlzY3JpbWluYXRvclZhbHVlIGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0VtYmVkZGFibGVBbm5vdGF0aW9uLmphdmEKaW5kZXggMTg4ZTNkMy4uMjIxMmY2YiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZUFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9FbWJlZGRhYmxlQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDcgKzEwLDggQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKIAogLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkYWJsZSBhbm5vdGF0aW9uCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGFibGUKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTE4LDggKzE5LDggQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBFbWJlZGRhYmxlQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgRW1iZWRkYWJsZUFubm90YXRpb24KKwlleHRlbmRzIEFubm90YXRpb24KIHsKIAlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLkVNQkVEREFCTEU7Ci0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW1iZWRkZWRBbm5vdGF0aW9uLmphdmEKaW5kZXggNzY2ODM0YS4uMTM4ZDJhYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW1iZWRkZWRBbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW1iZWRkZWRBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCiAvKioKLSAqIAorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5FbWJlZGRlZAogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMTgsOCArMTksOCBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEVtYmVkZGVkQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgRW1iZWRkZWRBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCiB7CiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5FTUJFRERFRDsKLQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkSWRBbm5vdGF0aW9uLmphdmEKaW5kZXggZDdlY2E4NC4uNDRhNjBkYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJZEFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9FbWJlZGRlZElkQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDcgKzEwLDggQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKIAogLyoqCi0gKiAKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkZWRJZAogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMTgsOCArMTksOCBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEVtYmVkZGVkSWRBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQorcHVibGljIGludGVyZmFjZSBFbWJlZGRlZElkQW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgogewogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuRU1CRURERURfSUQ7Ci0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0VudGl0eUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0VudGl0eUFubm90YXRpb24uamF2YQppbmRleCBmNGNlYmIzLi42MDc1NGJkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9FbnRpdHlBbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW50aXR5QW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEzLDcgKzEzLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIAogLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5IGFubm90YXRpb24KKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuRW50aXR5CiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMSwyNiArMjIsMjYgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBFbnRpdHlBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQorcHVibGljIGludGVyZmFjZSBFbnRpdHlBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCiB7CiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5FTlRJVFk7CiAKIAkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbmFtZSBlbGVtZW50IG9mIHRoZSBFbnRpdHkgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG5hbWUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgRW50aXR5IGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KIAkgKi8KIAlTdHJpbmcgZ2V0TmFtZSgpOwotCQorCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgZWxlbWVudCBvZiB0aGUgRW50aXR5IGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBuYW1lIGVsZW1lbnQuCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lJyBlbGVtZW50IG9mIHRoZSBFbnRpdHkgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCiAJICovCiAJdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQkKLQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOwotCQorCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG5hbWUgZWxlbWVudC4gIElmIHRoZSBuYW1lIGVsZW1lbnQgCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICduYW1lJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKIAkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgRW50aXR5IGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW51bVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0VudW1UeXBlLmphdmEKaW5kZXggZjMwOWU1Zi4uZTk5MDczYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW51bVR5cGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9FbnVtVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDcgKzEwLDggQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKIAogLyoqCi0gKiAKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgZW51bQorICogamF2YXgucGVyc2lzdGVuY2UuRW51bVR5cGUKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTE5LDM1ICsyMCw0MiBAQAogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCiBwdWJsaWMgZW51bSBFbnVtVHlwZSB7Ci0JCi0JT1JESU5BTCwKLQlTVFJJTkc7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBFbnVtVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgeworCisJT1JESU5BTChKUEEuRU5VTV9UWVBFX19PUkRJTkFMKSwKKwlTVFJJTkcoSlBBLkVOVU1fVFlQRV9fU1RSSU5HKTsKKworCisJcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKKworCUVudW1UeXBlKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CiAJCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CiAJCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEpQQS5FTlVNX1RZUEVfX09SRElOQUwpKSB7Ci0JCQlyZXR1cm4gT1JESU5BTDsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoSlBBLkVOVU1fVFlQRV9fU1RSSU5HKSkgewotCQkJcmV0dXJuIFNUUklORzsKKwkJdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWU7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgRW51bVR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKKwkJcmV0dXJuIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhqYXZhQW5ub3RhdGlvblZhbHVlKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBFbnVtVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKKwkJZm9yIChFbnVtVHlwZSBlbnVtVHlwZSA6IEVudW1UeXBlLnZhbHVlcygpKSB7CisJCQlpZiAoZW51bVR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpLmVxdWFscyhqYXZhQW5ub3RhdGlvblZhbHVlKSkgeworCQkJCXJldHVybiBlbnVtVHlwZTsKKwkJCX0KIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoRW51bVR5cGUgZW51bVR5cGUpIHsKLQkJaWYgKGVudW1UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoZW51bVR5cGUpIHsKLQkJCWNhc2UgT1JESU5BTCA6Ci0JCQkJcmV0dXJuIEpQQS5FTlVNX1RZUEVfX09SRElOQUw7Ci0JCQljYXNlIFNUUklORyA6Ci0JCQkJcmV0dXJuIEpQQS5FTlVNX1RZUEVfX1NUUklORzsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZW51bSB0eXBlOiAiICsgZW51bVR5cGUpOwotCQl9CisJCXJldHVybiAoZW51bVR5cGUgPT0gbnVsbCkgPyBudWxsIDogZW51bVR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOwogCX0KKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW51bWVyYXRlZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRBbm5vdGF0aW9uLmphdmEKaW5kZXggZDgzZGRmMi4uMGEwNDI5NSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvRW51bWVyYXRlZEFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9FbnVtZXJhdGVkQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEzLDcgKzEzLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIAogLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgucGVyc2lzdGVuY2UuRW51bWVyYXRlZCBhbm5vdGF0aW9uCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkVudW1lcmF0ZWQKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIxLDI1ICsyMiwyNiBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudW1lcmF0ZWRBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQorcHVibGljIGludGVyZmFjZSBFbnVtZXJhdGVkQW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgogewogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuRU5VTUVSQVRFRDsKIAogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBlbGVtZW50IG9mIHRoZSBFbnVtZXJhdGVkIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSB2YWx1ZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgRW51bWVyYXRlZCBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCiAJICovCiAJRW51bVR5cGUgZ2V0VmFsdWUoKTsKKwkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAogCQogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBlbGVtZW50IG9mIHRoZSBFbnVtZXJhdGVkIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSB2YWx1ZSBlbGVtZW50LgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIEVudW1lcmF0ZWQgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCiAJICovCiAJdm9pZCBzZXRWYWx1ZShFbnVtVHlwZSB2YWx1ZSk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZVByb3BlcnR5IjsKIAkJCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHZhbHVlIGVsZW1lbnQuICBJZiB0aGUgdmFsdWUgZWxlbWVudCAKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKIAkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgRW51bWVyYXRlZCBhbm5vdGF0aW9uLgogCSAqLwogCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9GZXRjaFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0ZldGNoVHlwZS5qYXZhCmluZGV4IGNhNGY3ZTEuLjk5MzI4YTYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0ZldGNoVHlwZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0ZldGNoVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDcgKzEwLDggQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKIAogLyoqCi0gKiAKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgZW51bQorICogamF2YXgucGVyc2lzdGVuY2UuRmV0Y2hUeXBlCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0xOSwzNSArMjAsNDIgQEAKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwogcHVibGljIGVudW0gRmV0Y2hUeXBlIHsKLQkKLQlFQUdFUiwKLQlMQVpZOwotCQotCQotCXB1YmxpYyBzdGF0aWMgRmV0Y2hUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisKKwlFQUdFUihKUEEuRkVUQ0hfVFlQRV9fRUFHRVIpLAorCUxBWlkoSlBBLkZFVENIX1RZUEVfX0xBWlkpOworCisKKwlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOworCisJRmV0Y2hUeXBlKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CiAJCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CiAJCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEpQQS5GRVRDSF9UWVBFX19FQUdFUikpIHsKLQkJCXJldHVybiBFQUdFUjsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoSlBBLkZFVENIX1RZUEVfX0xBWlkpKSB7Ci0JCQlyZXR1cm4gTEFaWTsKKwkJdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWU7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgRmV0Y2hUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRmV0Y2hUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgeworCQlmb3IgKEZldGNoVHlwZSBmZXRjaFR5cGUgOiBGZXRjaFR5cGUudmFsdWVzKCkpIHsKKwkJCWlmIChmZXRjaFR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpLmVxdWFscyhqYXZhQW5ub3RhdGlvblZhbHVlKSkgeworCQkJCXJldHVybiBmZXRjaFR5cGU7CisJCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKEZldGNoVHlwZSBmZXRjaFR5cGUpIHsKLQkJaWYgKGZldGNoVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGZldGNoVHlwZSkgewotCQkJY2FzZSBFQUdFUiA6Ci0JCQkJcmV0dXJuIEpQQS5GRVRDSF9UWVBFX19FQUdFUjsKLQkJCWNhc2UgTEFaWSA6Ci0JCQkJcmV0dXJuIEpQQS5GRVRDSF9UWVBFX19MQVpZOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBmZXRjaCB0eXBlOiAiICsgZmV0Y2hUeXBlKTsKLQkJfQorCQlyZXR1cm4gKGZldGNoVHlwZSA9PSBudWxsKSA/IG51bGwgOiBmZXRjaFR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOwogCX0KKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uamF2YQppbmRleCBhZDkzZmU2Li5lOTM0YjVmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMyw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlIGFubm90YXRpb24KKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGVkVmFsdWUKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIxLDQ3ICsyMiw1NCBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsJCitwdWJsaWMgaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgorewogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuR0VORVJBVEVEX1ZBTFVFOwogCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHN0cmF0ZWd5IGVsZW1lbnQgb2YgdGhlIEdlbmVyYXRlZFZhbHVlIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBzdHJhdGVneSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdzdHJhdGVneScgZWxlbWVudCBvZiB0aGUgR2VuZXJhdGVkVmFsdWUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgogCSAqLwogCUdlbmVyYXRpb25UeXBlIGdldFN0cmF0ZWd5KCk7Ci0JCisJCVN0cmluZyBTVFJBVEVHWV9QUk9QRVJUWSA9ICJzdHJhdGVneSI7IC8vJE5PTi1OTFMtMSQKKwogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBzdHJhdGVneSBlbGVtZW50IG9mIHRoZSBHZW5lcmF0ZWRWYWx1ZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgc3RyYXRlZ3kgZWxlbWVudC4KKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3N0cmF0ZWd5JyBlbGVtZW50IG9mIHRoZSBHZW5lcmF0ZWRWYWx1ZSBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KIAkgKi8KIAl2b2lkIHNldFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KTsKLQkJU3RyaW5nIFNUUkFURUdZX1BST1BFUlRZID0gInN0cmF0ZWd5UHJvcGVydHkiOwotCQkKKwogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBnZW5lcmF0b3IgZWxlbWVudCBvZiB0aGUgR2VuZXJhdGVkVmFsdWUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGdlbmVyYXRvciBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdzdHJhdGVneScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEdlbmVyYXRlZFZhbHVlIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldFN0cmF0ZWd5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdnZW5lcmF0b3InIGVsZW1lbnQgb2YgdGhlIEdlbmVyYXRlZFZhbHVlIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KIAkgKi8KIAlTdHJpbmcgZ2V0R2VuZXJhdG9yKCk7Ci0JCisJCVN0cmluZyBHRU5FUkFUT1JfUFJPUEVSVFkgPSAiZ2VuZXJhdG9yIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGdlbmVyYXRvciBlbGVtZW50IG9mIHRoZSBHZW5lcmF0ZWRWYWx1ZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZ2VuZXJhdG9yIGVsZW1lbnQuCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdnZW5lcmF0b3InIGVsZW1lbnQgb2YgdGhlIEdlbmVyYXRlZFZhbHVlIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgogCSAqLwogCXZvaWQgc2V0R2VuZXJhdG9yKFN0cmluZyBnZW5lcmF0b3IpOwotCQlTdHJpbmcgR0VORVJBVE9SX1BST1BFUlRZID0gImdlbmVyYXRvclByb3BlcnR5IjsKLQkKLQkKKwogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBnZW5lcmF0b3IgZWxlbWVudC4gIElmIHRoZSBnZW5lcmF0b3IgZWxlbWVudCAKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2dlbmVyYXRvcicgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCiAJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEdlbmVyYXRlZFZhbHVlIGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldEdlbmVyYXRvclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKIAkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgc3RyYXRlZ3kgZWxlbWVudC4gIElmIHRoZSBzdHJhdGVneSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBHZW5lcmF0ZWRWYWx1ZSBhbm5vdGF0aW9uLgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ2dlbmVyYXRvcicgZWxlbWVudC4KKwkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCiAJICovCi0JVGV4dFJhbmdlIGdldFN0cmF0ZWd5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKwlib29sZWFuIGdlbmVyYXRvclRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvR2VuZXJhdGlvblR5cGUuamF2YQppbmRleCA2NTU3NjE0Li5iZTVmZmU2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0aW9uVHlwZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0dlbmVyYXRpb25UeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCiAvKioKLSAqIAorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBlbnVtCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5HZW5lcmF0aW9uVHlwZQogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMTksNDcgKzIwLDQ0IEBACiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KIHB1YmxpYyBlbnVtIEdlbmVyYXRpb25UeXBlIHsKLQkKLQlUQUJMRSwKLQlTRVFVRU5DRSwKLQlJREVOVElUWSwKLQlBVVRPOwotCQotCQotCXB1YmxpYyBzdGF0aWMgR2VuZXJhdGlvblR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKKworCVRBQkxFKEpQQS5HRU5FUkFUSU9OX1RZUEVfX1RBQkxFKSwKKwlTRVFVRU5DRShKUEEuR0VORVJBVElPTl9UWVBFX19TRVFVRU5DRSksCisJSURFTlRJVFkoSlBBLkdFTkVSQVRJT05fVFlQRV9fSURFTlRJVFkpLAorCUFVVE8oSlBBLkdFTkVSQVRJT05fVFlQRV9fQVVUTyk7CisKKworCXByaXZhdGUgU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWU7CisKKwlHZW5lcmF0aW9uVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewogCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhKUEEuR0VORVJBVElPTl9UWVBFX19UQUJMRSkpIHsKLQkJCXJldHVybiBUQUJMRTsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoSlBBLkdFTkVSQVRJT05fVFlQRV9fU0VRVUVOQ0UpKSB7Ci0JCQlyZXR1cm4gU0VRVUVOQ0U7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEpQQS5HRU5FUkFUSU9OX1RZUEVfX0lERU5USVRZKSkgewotCQkJcmV0dXJuIElERU5USVRZOwotCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhKUEEuR0VORVJBVElPTl9UWVBFX19BVVRPKSkgewotCQkJcmV0dXJuIEFVVE87CisJCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIEdlbmVyYXRpb25UeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgR2VuZXJhdGlvblR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCWZvciAoR2VuZXJhdGlvblR5cGUgZ2VuZXJhdGlvblR5cGUgOiBHZW5lcmF0aW9uVHlwZS52YWx1ZXMoKSkgeworCQkJaWYgKGdlbmVyYXRpb25UeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKS5lcXVhbHMoamF2YUFubm90YXRpb25WYWx1ZSkpIHsKKwkJCQlyZXR1cm4gZ2VuZXJhdGlvblR5cGU7CisJCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKEdlbmVyYXRpb25UeXBlIGdlbmVyYXRpb25UeXBlKSB7Ci0JCWlmIChnZW5lcmF0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGdlbmVyYXRpb25UeXBlKSB7Ci0JCQljYXNlIFRBQkxFIDoKLQkJCQlyZXR1cm4gSlBBLkdFTkVSQVRJT05fVFlQRV9fVEFCTEU7Ci0JCQljYXNlIFNFUVVFTkNFIDoKLQkJCQlyZXR1cm4gSlBBLkdFTkVSQVRJT05fVFlQRV9fU0VRVUVOQ0U7Ci0JCQljYXNlIElERU5USVRZIDoKLQkJCQlyZXR1cm4gSlBBLkdFTkVSQVRJT05fVFlQRV9fSURFTlRJVFk7Ci0JCQljYXNlIEFVVE8gOgotCQkJCXJldHVybiBKUEEuR0VORVJBVElPTl9UWVBFX19BVVRPOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBnZW5lcmF0aW9uIHR5cGU6ICIgKyBnZW5lcmF0aW9uVHlwZSk7Ci0JCX0KKwkJcmV0dXJuIChnZW5lcmF0aW9uVHlwZSA9PSBudWxsKSA/IG51bGwgOiBnZW5lcmF0aW9uVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7CiAJfQorCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKaW5kZXggNGQ4ZTkyNS4uMjE1MGUzZSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0dlbmVyYXRvckFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMyw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgotICogCisgKiBDb21tb24gcHJvdG9jb2wgYW1vbmcKKyAqICAgICBqYXZheC5wZXJzaXN0ZW5jZS5TZXF1ZW5jZUdlbmVyYXRvcgorICogICAgIGphdmF4LnBlcnNpc3RlbmNlLlRhYmxlR2VuZXJhdG9yCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMSw2NyArMjMsNjcgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBHZW5lcmF0b3JBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQorcHVibGljIGludGVyZmFjZSBHZW5lcmF0b3JBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCiB7CiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3Igb3IgU2VxdWVuY2VHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG5hbWUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLiAgSWYgbm8gb3RoZXIgbWVtYmVyVmFsdWVQYWlycyBleGlzdAotCSAqIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lJyBlbGVtZW50IG9mIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KIAkgKi8KIAlTdHJpbmcgZ2V0TmFtZSgpOwotCQorCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAorCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3Igb3IgU2VxdWVuY2VHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIG5hbWUgZWxlbWVudC4gIElmIG5vIG90aGVyIG1lbWJlclZhbHVlUGFpcnMgZXhpc3QKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuIElmIG5vIG90aGVyIGVsZW1lbnRzIGV4aXN0CiAJICogdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KIAkgKi8KIAl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOwotCQorCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGluaXRpYWxWYWx1ZSBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBvciBTZXF1ZW5jZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgaW5pdGlhbFZhbHVlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4gIElmIG5vIG90aGVyIG1lbWJlclZhbHVlUGFpcnMgZXhpc3QKLQkgKiB0aGUgKkdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgotCSAqLwotCUludGVnZXIgZ2V0SW5pdGlhbFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGluaXRpYWxWYWx1ZSBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBvciBTZXF1ZW5jZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgaW5pdGlhbFZhbHVlIGVsZW1lbnQuICBJZiBubyBvdGhlciBtZW1iZXJWYWx1ZVBhaXJzIGV4aXN0Ci0JICogdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQl2b2lkIHNldEluaXRpYWxWYWx1ZShJbnRlZ2VyIGluaXRpYWxWYWx1ZSk7Ci0JCVN0cmluZyBJTklUSUFMX1ZBTFVFX1BST1BFUlRZID0gImluaXRpYWxWYWx1ZVByb3BlcnR5IjsKLQkJCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGFsbG9jYXRpb25TaXplIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIG9yIFNlcXVlbmNlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBhbGxvY2F0aW9uU2l6ZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuICBJZiBubyBvdGhlciBtZW1iZXJWYWx1ZVBhaXJzIGV4aXN0Ci0JICogdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQlJbnRlZ2VyIGdldEFsbG9jYXRpb25TaXplKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGFsbG9jYXRpb25TaXplIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIG9yIFNlcXVlbmNlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBhbGxvY2F0aW9uU2l6ZSBlbGVtZW50LiAgSWYgbm8gb3RoZXIgbWVtYmVyVmFsdWVQYWlycyBleGlzdAotCSAqIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCi0JICovCi0Jdm9pZCBzZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyIGFsbG9jYXRpb25TaXplKTsKLQkJU3RyaW5nIEFMTE9DQVRJT05fU0laRV9QUk9QRVJUWSA9ICJhbGxvY2F0aW9uU2l6ZVByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbmFtZSBlbGVtZW50LiAgSWYgdGhlIG5hbWUgZWxlbWVudCAKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ25hbWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAogCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogCisKIAkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgaW5pdGlhbFZhbHVlIGVsZW1lbnQuICBJZiB0aGUgaW5pdGlhbFZhbHVlIGVsZW1lbnQgCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdpbml0aWFsVmFsdWUnIGVsZW1lbnQgb2YgdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUludGVnZXIgZ2V0SW5pdGlhbFZhbHVlKCk7CisJCVN0cmluZyBJTklUSUFMX1ZBTFVFX1BST1BFUlRZID0gImluaXRpYWxWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaW5pdGlhbFZhbHVlJyBlbGVtZW50IG9mIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LiBJZiBubyBvdGhlciBlbGVtZW50cyBleGlzdAorCSAqIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCisJICovCisJdm9pZCBzZXRJbml0aWFsVmFsdWUoSW50ZWdlciBpbml0aWFsVmFsdWUpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdpbml0aWFsVmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAogCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldEluaXRpYWxWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKKwogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBhbGxvY2F0aW9uU2l6ZSBlbGVtZW50LiAgSWYgdGhlIGFsbG9jYXRpb25TaXplIGVsZW1lbnQgCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdhbGxvY2F0aW9uU2l6ZScgZWxlbWVudCBvZiB0aGUgKkdlbmVyYXRvciBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpOworCQlTdHJpbmcgQUxMT0NBVElPTl9TSVpFX1BST1BFUlRZID0gImFsbG9jYXRpb25TaXplIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdhbGxvY2F0aW9uU2l6ZScgZWxlbWVudCBvZiB0aGUgKkdlbmVyYXRvciBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4gSWYgbm8gb3RoZXIgZWxlbWVudHMgZXhpc3QKKwkgKiB0aGUgKkdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgorCSAqLworCXZvaWQgc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlciBhbGxvY2F0aW9uU2l6ZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2FsbG9jYXRpb25TaXplJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKIAkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKkdlbmVyYXRvciBhbm5vdGF0aW9uLgogCSAqLwogCVRleHRSYW5nZSBnZXRBbGxvY2F0aW9uU2l6ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9JZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0lkQW5ub3RhdGlvbi5qYXZhCmluZGV4IGFkZTVlNzYuLjFhMTc0NTUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0lkQW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0lkQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDcgKzEwLDggQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKIAogLyoqCi0gKiAKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuSWQKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTE4LDggKzE5LDggQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBJZEFubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCitwdWJsaWMgaW50ZXJmYWNlIElkQW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgogewogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuSUQ7Ci0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0lkQ2xhc3NBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9JZENsYXNzQW5ub3RhdGlvbi5qYXZhCmluZGV4IDI4M2FlZmUuLmIwZmUwMWUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0lkQ2xhc3NBbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSWRDbGFzc0Fubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMyw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgotICogVGhpcyBpbnRlcmZhY2UgY29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLklkQ2xhc3MgYW5ub3RhdGlvbgorICogVGhpcyBpbnRlcmZhY2UgY29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5JZENsYXNzCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMSw0NCArMjIsNDQgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBJZENsYXNzQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgSWRDbGFzc0Fubm90YXRpb24KKwlleHRlbmRzIEFubm90YXRpb24KIHsKIAlmaW5hbCBTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLklEX0NMQVNTOwogCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIGVsZW1lbnQgb2YgdGhlIElkQ2xhc3MgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHZhbHVlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KLQkgKiBSZXR1cm5zIHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBwcmVjZWRpbmcgdGhlIC5jbGFzcy4KLQkgKiA8cD4KKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBJZENsYXNzIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKiBSZXR1cm4gdGhlIHBvcnRpb24gb2YgdGhlIHZhbHVlIHByZWNlZGluZyAiLmNsYXNzIi4KKwkgKiA8cHJlPgogCSAqICAgICAmIzY0O0lkQ2xhc3ModmFsdWU9RW1wbG95ZWUuY2xhc3MpCi0JICogPC9wPgorCSAqIDwvcHJlPgogCSAqIHdpbGwgcmV0dXJuICJFbXBsb3llZSIKLQkgKiovCi0JU3RyaW5nIGdldFZhbHVlKCk7CQotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBlbGVtZW50IG9mIHRoZSBJZENsYXNzIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSB2YWx1ZSBlbGVtZW50LiAgVGhpcyB3aWxsIGFsc28gcmVtb3ZlIHRoZSBJZENsYXNzIAotCSAqIGFubm90YXRpb24gaXRzZWxmLgogCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlUHJvcGVydHkiOwotCQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBxdWFsaWZpZWQgdmFsdWUgbmFtZSBhcyBpdCBpcyByZXNvbHZlZCBpbiB0aGUgQVNUCi0JICogPHA+Ci0JICogICAgICYjNjQ7SWRDbGFzcyhFbXBsb3llZS5jbGFzcykKLQkgKiA8L3A+Ci0JICogd2lsbCByZXR1cm4gIm1vZGVsLkVtcGxveWVlIiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yIG1vZGVsLkVtcGxveWVlCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZENsYXNzKCk7Ci0JCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfQ0xBU1NfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRDbGFzc1Byb3BlcnR5IjsKKwlTdHJpbmcgZ2V0VmFsdWUoKTsKKwkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHZhbHVlIGVsZW1lbnQuICBJZiB0aGUgdmFsdWUgZWxlbWVudCAKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBJZENsYXNzIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqIFRoaXMgd2lsbCBhbHNvIHJlbW92ZSB0aGUgSWRDbGFzcyBhbm5vdGF0aW9uIGl0c2VsZi4KKwkgKi8KKwl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKIAkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgSWRDbGFzcyBhbm5vdGF0aW9uLgogCSAqLwogCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBJZENsYXNzIG5hbWUgYXMgcmVzb2x2ZWQgYnkgdGhlIEFTVCdzIGJpbmRpbmdzLgorCSAqIDxwcmU+CisJICogICAgICYjNjQ7SWRDbGFzcyhFbXBsb3llZS5jbGFzcykKKwkgKiA8L3ByZT4KKwkgKiB3aWxsIHJldHVybiAibW9kZWwuRW1wbG95ZWUiIGlmIHRoZXJlIGlzIGFuIGltcG9ydCBmb3IgbW9kZWwuRW1wbG95ZWUuCisJICovCisJU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCk7CisJCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfQ0xBU1NfTkFNRV9QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZENsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZUFubm90YXRpb24uamF2YQppbmRleCA4OTQzNWQyLi4zYmRmNGFiIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZUFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZUFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMyw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLkluaGVyaXRhbmNlIGFubm90YXRpb24KKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuSW5oZXJpdGFuY2UKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIxLDE3ICsyMiwyNiBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEluaGVyaXRhbmNlQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgSW5oZXJpdGFuY2VBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCiB7CiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5JTkhFUklUQU5DRTsKIAotCUluaGVyaXRhbmNlVHlwZSBnZXRTdHJhdGVneSgpOwotCQotCXZvaWQgc2V0U3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KTsKLQkJU3RyaW5nIFNUUkFURUdZX1BST1BFUlRZID0gInN0cmF0ZWd5UHJvcGVydHkiOwotCQkKIAkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgc3RyYXRlZ3kgZWxlbWVudC4gIElmIHRoZSBzdHJhdGVneSBlbGVtZW50IAorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc3RyYXRlZ3knIGVsZW1lbnQgb2YgdGhlIEluaGVyaXRhbmNlIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlJbmhlcml0YW5jZVR5cGUgZ2V0U3RyYXRlZ3koKTsKKwkJU3RyaW5nIFNUUkFURUdZX1BST1BFUlRZID0gInN0cmF0ZWd5IjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdzdHJhdGVneScgZWxlbWVudCBvZiB0aGUgSW5oZXJpdGFuY2UgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3kpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdzdHJhdGVneScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCiAJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEluaGVyaXRhbmNlIGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldFN0cmF0ZWd5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0luaGVyaXRhbmNlVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VUeXBlLmphdmEKaW5kZXggYjI1ZWFhNC4uZDA1NTM4OCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VUeXBlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCiAvKioKLSAqIAorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBlbnVtCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Jbmhlcml0YW5jZVR5cGUKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTE5LDQxICsyMCw0MyBAQAogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCiBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUgewotCQotCVNJTkdMRV9UQUJMRSwKLQlKT0lORUQsCi0JVEFCTEVfUEVSX0NMQVNTOwotCQotCQotCXB1YmxpYyBzdGF0aWMgSW5oZXJpdGFuY2VUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisKKwlTSU5HTEVfVEFCTEUoSlBBLklOSEVSSVRBTkNFX1RZUEVfX1NJTkdMRV9UQUJMRSksCisJSk9JTkVEKEpQQS5JTkhFUklUQU5DRV9UWVBFX19KT0lORUQpLAorCVRBQkxFX1BFUl9DTEFTUyhKUEEuSU5IRVJJVEFOQ0VfVFlQRV9fVEFCTEVfUEVSX0NMQVNTKTsKKworCisJcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKKworCUluaGVyaXRhbmNlVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewogCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhKUEEuSU5IRVJJVEFOQ0VfVFlQRV9fU0lOR0xFX1RBQkxFKSkgewotCQkJcmV0dXJuIFNJTkdMRV9UQUJMRTsKLQkJfQotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZS5lcXVhbHMoSlBBLklOSEVSSVRBTkNFX1RZUEVfX0pPSU5FRCkpIHsKLQkJCXJldHVybiBKT0lORUQ7Ci0JCX0KLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUuZXF1YWxzKEpQQS5JTkhFUklUQU5DRV9UWVBFX19UQUJMRV9QRVJfQ0xBU1MpKSB7Ci0JCQlyZXR1cm4gVEFCTEVfUEVSX0NMQVNTOworCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBJbmhlcml0YW5jZVR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKKwkJcmV0dXJuIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhqYXZhQW5ub3RhdGlvblZhbHVlKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBJbmhlcml0YW5jZVR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCWZvciAoSW5oZXJpdGFuY2VUeXBlIGluaGVyaXRhbmNlVHlwZSA6IEluaGVyaXRhbmNlVHlwZS52YWx1ZXMoKSkgeworCQkJaWYgKGluaGVyaXRhbmNlVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7CisJCQkJcmV0dXJuIGluaGVyaXRhbmNlVHlwZTsKKwkJCX0KIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoSW5oZXJpdGFuY2VUeXBlIGluaGVyaXRhbmNlVHlwZSkgewotCQlpZiAoaW5oZXJpdGFuY2VUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoaW5oZXJpdGFuY2VUeXBlKSB7Ci0JCQljYXNlIFNJTkdMRV9UQUJMRSA6Ci0JCQkJcmV0dXJuIEpQQS5JTkhFUklUQU5DRV9UWVBFX19TSU5HTEVfVEFCTEU7Ci0JCQljYXNlIEpPSU5FRCA6Ci0JCQkJcmV0dXJuIEpQQS5JTkhFUklUQU5DRV9UWVBFX19KT0lORUQ7Ci0JCQljYXNlIFRBQkxFX1BFUl9DTEFTUyA6Ci0JCQkJcmV0dXJuIEpQQS5JTkhFUklUQU5DRV9UWVBFX19UQUJMRV9QRVJfQ0xBU1M7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGluaGVyaXRhbmNlIHR5cGU6ICIgKyBpbmhlcml0YW5jZVR5cGUpOwotCQl9CisJCXJldHVybiAoaW5oZXJpdGFuY2VUeXBlID09IG51bGwpID8gbnVsbCA6IGluaGVyaXRhbmNlVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7CiAJfQorCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KUEEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pQQS5qYXZhCmluZGV4IDcxY2RmZGEuLmRkMTFlYmUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pQQS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pQQS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMjEgKzksMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7CiAKLQogLyoqCiAgKiBKUEEgSmF2YS1yZWxhdGVkIHN0dWZmIChhbm5vdGF0aW9ucyBldGMuKQotICogCisgKiA8cD4KICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCiAgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBpbnRlcmZhY2UgSlBBIHsKIAogCS8vIEpQQSBwYWNrYWdlCiAJU3RyaW5nIFBBQ0tBR0UgPSAiamF2YXgucGVyc2lzdGVuY2UiOwotCVN0cmluZyBQQUNLQUdFXyA9IFBBQ0tBR0UgKyAiLiI7CisJU3RyaW5nIFBBQ0tBR0VfID0gUEFDS0FHRSArICcuJzsKIAogCiAJLy8gKioqKioqKioqKiBBUEkgKioqKioqKioqKgpAQCAtMjE3LDE1ICsyMTcsOCBAQAogCVN0cmluZyBWRVJTSU9OID0gUEFDS0FHRV8gKyAiVmVyc2lvbiI7CiAKIAkvLyBKUEEgZW51bXMKLQlTdHJpbmcgR0VORVJBVElPTl9UWVBFID0gUEFDS0FHRV8gKyAiR2VuZXJhdGlvblR5cGUiOwotCQlTdHJpbmcgR0VORVJBVElPTl9UWVBFXyA9IEdFTkVSQVRJT05fVFlQRSArICIuIjsKLQkJU3RyaW5nIEdFTkVSQVRJT05fVFlQRV9fQVVUTyA9IEdFTkVSQVRJT05fVFlQRV8gKyAiQVVUTyI7Ci0JCVN0cmluZyBHRU5FUkFUSU9OX1RZUEVfX0lERU5USVRZID0gR0VORVJBVElPTl9UWVBFXyArICJJREVOVElUWSI7Ci0JCVN0cmluZyBHRU5FUkFUSU9OX1RZUEVfX1NFUVVFTkNFID0gR0VORVJBVElPTl9UWVBFXyArICJTRVFVRU5DRSI7Ci0JCVN0cmluZyBHRU5FUkFUSU9OX1RZUEVfX1RBQkxFID0gR0VORVJBVElPTl9UWVBFXyArICJUQUJMRSI7Ci0KIAlTdHJpbmcgQ0FTQ0FERV9UWVBFID0gUEFDS0FHRV8gKyAiQ2FzY2FkZVR5cGUiOwotCQlTdHJpbmcgQ0FTQ0FERV9UWVBFXyA9IENBU0NBREVfVFlQRSArICIuIjsKKwkJU3RyaW5nIENBU0NBREVfVFlQRV8gPSBDQVNDQURFX1RZUEUgKyAnLic7CiAJCVN0cmluZyBDQVNDQURFX1RZUEVfX0FMTCA9IENBU0NBREVfVFlQRV8gKyAiQUxMIjsKIAkJU3RyaW5nIENBU0NBREVfVFlQRV9fTUVSR0UgPSBDQVNDQURFX1RZUEVfICsgIk1FUkdFIjsKIAkJU3RyaW5nIENBU0NBREVfVFlQRV9fUEVSU0lTVCA9IENBU0NBREVfVFlQRV8gKyAiUEVSU0lTVCI7CkBAIC0yMzMsMzkgKzIyNiw0NiBAQAogCQlTdHJpbmcgQ0FTQ0FERV9UWVBFX19SRU1PVkUgPSBDQVNDQURFX1RZUEVfICsgIlJFTU9WRSI7CiAKIAlTdHJpbmcgRElTQ1JJTUlOQVRPUl9UWVBFID0gUEFDS0FHRV8gKyAiRGlzY3JpbWluYXRvclR5cGUiOwotCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9UWVBFXyA9IERJU0NSSU1JTkFUT1JfVFlQRSArICIuIjsKKwkJU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRV8gPSBESVNDUklNSU5BVE9SX1RZUEUgKyAnLic7CiAJCVN0cmluZyBESVNDUklNSU5BVE9SX1RZUEVfX0NIQVIgPSBESVNDUklNSU5BVE9SX1RZUEVfICsgIkNIQVIiOwogCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9UWVBFX19JTlRFR0VSID0gRElTQ1JJTUlOQVRPUl9UWVBFXyArICJJTlRFR0VSIjsKIAkJU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRV9fU1RSSU5HID0gRElTQ1JJTUlOQVRPUl9UWVBFXyArICJTVFJJTkciOwogCiAJU3RyaW5nIEVOVU1fVFlQRSA9IFBBQ0tBR0VfICsgIkVudW1UeXBlIjsKLQkJU3RyaW5nIEVOVU1fVFlQRV8gPSBFTlVNX1RZUEUgKyAiLiI7CisJCVN0cmluZyBFTlVNX1RZUEVfID0gRU5VTV9UWVBFICsgJy4nOwogCQlTdHJpbmcgRU5VTV9UWVBFX19PUkRJTkFMID0gRU5VTV9UWVBFXyArICJPUkRJTkFMIjsKIAkJU3RyaW5nIEVOVU1fVFlQRV9fU1RSSU5HID0gRU5VTV9UWVBFXyArICJTVFJJTkciOwogCiAJU3RyaW5nIEZFVENIX1RZUEUgPSBQQUNLQUdFXyArICJGZXRjaFR5cGUiOwotCQlTdHJpbmcgRkVUQ0hfVFlQRV8gPSBGRVRDSF9UWVBFICsgIi4iOworCQlTdHJpbmcgRkVUQ0hfVFlQRV8gPSBGRVRDSF9UWVBFICsgJy4nOwogCQlTdHJpbmcgRkVUQ0hfVFlQRV9fRUFHRVIgPSBGRVRDSF9UWVBFXyArICJFQUdFUiI7CiAJCVN0cmluZyBGRVRDSF9UWVBFX19MQVpZID0gRkVUQ0hfVFlQRV8gKyAiTEFaWSI7CiAKIAlTdHJpbmcgRkxVU0hfTU9ERV9UWVBFID0gUEFDS0FHRV8gKyAiRmx1c2hNb2RlVHlwZSI7Ci0JCVN0cmluZyBGTFVTSF9NT0RFX1RZUEVfID0gRkxVU0hfTU9ERV9UWVBFICsgIi4iOworCQlTdHJpbmcgRkxVU0hfTU9ERV9UWVBFXyA9IEZMVVNIX01PREVfVFlQRSArICcuJzsKIAkJU3RyaW5nIEZMVVNIX01PREVfVFlQRV9fQVVUTyA9IEZMVVNIX01PREVfVFlQRV8gKyAiQVVUTyI7CiAJCVN0cmluZyBGTFVTSF9NT0RFX1RZUEVfX0NPTU1JVCA9IEZMVVNIX01PREVfVFlQRV8gKyAiQ09NTUlUIjsKIAorCVN0cmluZyBHRU5FUkFUSU9OX1RZUEUgPSBQQUNLQUdFXyArICJHZW5lcmF0aW9uVHlwZSI7CisJCVN0cmluZyBHRU5FUkFUSU9OX1RZUEVfID0gR0VORVJBVElPTl9UWVBFICsgJy4nOworCQlTdHJpbmcgR0VORVJBVElPTl9UWVBFX19BVVRPID0gR0VORVJBVElPTl9UWVBFXyArICJBVVRPIjsKKwkJU3RyaW5nIEdFTkVSQVRJT05fVFlQRV9fSURFTlRJVFkgPSBHRU5FUkFUSU9OX1RZUEVfICsgIklERU5USVRZIjsKKwkJU3RyaW5nIEdFTkVSQVRJT05fVFlQRV9fU0VRVUVOQ0UgPSBHRU5FUkFUSU9OX1RZUEVfICsgIlNFUVVFTkNFIjsKKwkJU3RyaW5nIEdFTkVSQVRJT05fVFlQRV9fVEFCTEUgPSBHRU5FUkFUSU9OX1RZUEVfICsgIlRBQkxFIjsKKwogCVN0cmluZyBJTkhFUklUQU5DRV9UWVBFID0gUEFDS0FHRV8gKyAiSW5oZXJpdGFuY2VUeXBlIjsKLQkJU3RyaW5nIElOSEVSSVRBTkNFX1RZUEVfID0gSU5IRVJJVEFOQ0VfVFlQRSArICIuIjsKKwkJU3RyaW5nIElOSEVSSVRBTkNFX1RZUEVfID0gSU5IRVJJVEFOQ0VfVFlQRSArICcuJzsKIAkJU3RyaW5nIElOSEVSSVRBTkNFX1RZUEVfX0pPSU5FRCA9IElOSEVSSVRBTkNFX1RZUEVfICsgIkpPSU5FRCI7CiAJCVN0cmluZyBJTkhFUklUQU5DRV9UWVBFX19TSU5HTEVfVEFCTEUgPSBJTkhFUklUQU5DRV9UWVBFXyArICJTSU5HTEVfVEFCTEUiOwogCQlTdHJpbmcgSU5IRVJJVEFOQ0VfVFlQRV9fVEFCTEVfUEVSX0NMQVNTID0gSU5IRVJJVEFOQ0VfVFlQRV8gKyAiVEFCTEVfUEVSX0NMQVNTIjsKIAogCVN0cmluZyBQRVJTSVNURU5DRV9DT05URVhUX1RZUEUgPSBQQUNLQUdFXyArICJQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIjsKLQkJU3RyaW5nIFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV8gPSBQRVJTSVNURU5DRV9DT05URVhUX1RZUEUgKyAiLiI7CisJCVN0cmluZyBQRVJTSVNURU5DRV9DT05URVhUX1RZUEVfID0gUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFICsgJy4nOwogCQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX19FWFRFTkRFRCA9IFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV8gKyAiRVhURU5ERUQiOwogCQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX19UUkFOU0FDVElPTiA9IFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV8gKyAiVFJBTlNBQ1RJT04iOwogCiAJU3RyaW5nIFRFTVBPUkFMX1RZUEUgPSBQQUNLQUdFXyArICJUZW1wb3JhbFR5cGUiOwotCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV8gPSBURU1QT1JBTF9UWVBFICsgIi4iOworCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV8gPSBURU1QT1JBTF9UWVBFICsgJy4nOwogCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV9fREFURSA9IFRFTVBPUkFMX1RZUEVfICsgIkRBVEUiOwogCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV9fVElNRSA9IFRFTVBPUkFMX1RZUEVfICsgIlRJTUUiOwogCQlTdHJpbmcgVEVNUE9SQUxfVFlQRV9fVElNRVNUQU1QID0gVEVNUE9SQUxfVFlQRV8gKyAiVElNRVNUQU1QIjsKQEAgLTI5MCw3ICsyOTAsNyBAQAogCiAJLy8gSlBBIFNQSSBwYWNrYWdlCiAJU3RyaW5nIFNQSV9QQUNLQUdFID0gUEFDS0FHRV8gKyAic3BpIjsKLQlTdHJpbmcgU1BJX1BBQ0tBR0VfID0gU1BJX1BBQ0tBR0UgKyAiLiI7CisJU3RyaW5nIFNQSV9QQUNLQUdFXyA9IFNQSV9QQUNLQUdFICsgJy4nOwogCiAJLy8gSlBBIFNQSSBpbnRlcmZhY2VzCiAJU3RyaW5nIEVOVElUWV9NQU5BR0VSX0ZBQ1RPUllfUFJPVklERVIgPSBTUElfUEFDS0FHRV8gKyAiRW50aXR5TWFuYWdlckZhY3RvcnlQcm92aWRlciI7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VDbGFzc0ZpbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUNsYXNzRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOGRiOTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VDbGFzc0ZpbGUuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7CisKKworLyoqCisgKiBKYXZhIGNsYXNzIGZpbGUKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlQ2xhc3NGaWxlCisJZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCit7CisJLyoqCisJICogUmV0dXJuIHRoZSBjbGFzcyBmaWxlJ3MgcGVyc2lzdGVudCB0eXBlLgorCSAqLworCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxM2ZiNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7CisKKy8qKgorICogRGFsaSByZXNvdXJjZSBmb3IgSkRUIGNvbXBpbGF0aW9uIHVuaXQuCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdAorCWV4dGVuZHMgSmF2YVJlc291cmNlTm9kZS5Sb290Cit7CisJLyoqCisJICogUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEpEVCBjb21waWxhdGlvbiB1bml0LgorCSAqLworCUlDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0J3MgYW5ub3RhdGlvbiBmb3JtYXR0ZXIuIFRoaXMgaXMgdXNlZCB0byBtYWtlIGFueQorCSAqIG1hbmlwdWxhdGVkIGFubm90YXRpb25zIHJlYXNvbmFibHkgcmVhZGFibGUgYWZ0ZXIgYmVpbmcgd3JpdHRlbiB0byB0aGUKKwkgKiBKYXZhIHNvdXJjZSBmaWxlLgorCSAqLworCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCk7CisKKwkvKioKKwkgKiBUaGlzIGFsbG93cyB0aGUgcmVzb3VyY2UgbW9kZWwgdG8gbW9kaWZ5IHRoZSBKYXZhIHNvdXJjZSBjb2RlIG9uIHRoZQorCSAqIFVJIHRocmVhZCB3aGVuIGl0IGlzIGV4ZWN1dGluZyBvbiBhbm90aGVyIHRocmVhZC4KKwkgKi8KKwlDb21tYW5kRXhlY3V0b3IgZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKTsKKworCS8qKgorCSAqIFJlc29sdmUgdHlwZSBpbmZvcm1hdGlvbiB0aGF0IGNvdWxkIGJlIGRlcGVuZGVudCBvbiBvdGhlciBmaWxlcyBiZWluZworCSAqIGFkZGVkL3JlbW92ZWQuCisJICovCisJdm9pZCByZXNvbHZlVHlwZXMoKTsKKworCS8qKgorCSAqIFNvbWV0aGluZyBpbiBKYXZhIGhhcyBjaGFuZ2VkICh0eXBpY2FsbHkgZWl0aGVyIHRoZSBjb21waWxhdGlvbiB1bml0J3MKKwkgKiBzb3VyY2UgY29kZSBvciB0aGUgSmF2YSBjbGFzc3BhdGgpOyB1cGRhdGUgdGhlIEpQQSBjb21waWxhdGlvbiB1bml0J3MKKwkgKiBzdGF0ZSB0byBiZSBpbiBzeW5jaCB3aXRoIHRoZSBzb3VyY2UgY29kZSBldGMuCisJICovCisJdm9pZCB1cGRhdGUoKTsKKworCS8qKgorCSAqIEJ1aWxkIGFuIEFTVCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQgd2l0aCBpdHMgYmluZGluZ3MgcmVzb2x2ZWQuCisJICovCisJQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdCgpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiYzdkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbDsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlTW9kZWwgZXh0ZW5kcyBSZXNvdXJjZU1vZGVsIHsKLQotCUpwYUNvbXBpbGF0aW9uVW5pdCBnZXRKcGFDb21waWxhdGlvblVuaXQoKTsKLQotCXZvaWQgcmVzb3VyY2VDaGFuZ2VkKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU5vZGUuamF2YQppbmRleCA5NTc0ZjA4Li5lMWJiZjQ0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VOb2RlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTm9kZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMTIgKzksMTcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7CiAKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwogCiAvKioKLSAqIAorICogQ29tbW9uIGludGVyZmFjZSBmb3IgSmF2YSByZXNvdXJjZSBub2RlcyAoc291cmNlIGNvZGUgb3IgYmluYXJ5KS4KICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIyLDE2ICsyNyw2NSBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZXNvdXJjZU5vZGUgZXh0ZW5kcyBNb2RlbCB7CitwdWJsaWMgaW50ZXJmYWNlIEphdmFSZXNvdXJjZU5vZGUKKwlleHRlbmRzIE1vZGVsCit7CiAKKwkvKioKKwkgKiBSZXR1cm4gdGhlIEVjbGlwc2UgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBKYXZhIHJlc291cmNlIG5vZGUKKwkgKiAodHlwaWNhbGx5IGVpdGhlciBhIEphdmEgc291cmNlIGNvZGUgZmlsZSBvciBhIEpBUikuCisJICovCisJSUZpbGUgZ2V0RmlsZSgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSByb290IG9mIHRoZSBKYXZhIHJlc291cmNlIGNvbnRhaW5tZW50IGhpZXJhcmNoeQorCSAqICh0eXBpY2FsbHkgZWl0aGVyIGEgY29tcGlsYXRpb24gdW5pdCBvciBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCkuCisJICovCisJUm9vdCBnZXRSb290KCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIFtzb3VyY2VdIG5vZGUncyByb290ICh0aGUgY29tcGlsYXRpb24gdW5pdCkuCisJICovCisJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBbc291cmNlXSBub2RlJ3MgdGV4dCByYW5nZSBpbiB0aGUgY29tcGlsYXRpb24gdW5pdCdzIGZpbGUuCisJICovCisJVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSBbc291cmNlXSB3aXRoIHRoZSBzcGVjaWZpZWQgQVNULgorCSAqLwogCXZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKLQlKYXZhUmVzb3VyY2VNb2RlbCBnZXRSZXNvdXJjZU1vZGVsKCk7CisJLyoqCisJICogVXBkYXRlIHRoZSBbc291cmNlXSB3aXRoIHRoZSBzcGVjaWZpZWQgQVNULgorCSAqLworCXZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIAotCUpwYUNvbXBpbGF0aW9uVW5pdCBnZXRKcGFDb21waWxhdGlvblVuaXQoKTsKIAotCXZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCS8qKgorCSAqIHJvb3Qgb2YgSmF2YSByZXNvdXJjZSBjb250YWlubWVudCBoaWVyYXJjaHkKKwkgKi8KKwlpbnRlcmZhY2UgUm9vdCBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUsIEpwYVJlc291cmNlTW9kZWwgewogCi0JVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIHJvb3QncyBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZXMuCisJCSAqLworCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzKCk7CisKKwkJLyoqCisJCSAqIENhbGxlZCAodmlhIGEgaG9vayBpbiBjaGFuZ2Ugbm90aWZpY2F0aW9uKSB3aGVuZXZlciBhbnl0aGluZyBpbiB0aGUKKwkJICogSmF2YSByZXNvdXJjZSBtb2RlbCBjaGFuZ2VzLiBGb3J3YXJkZWQgdG8gbGlzdGVuZXJzLgorCQkgKi8KKwkJdm9pZCByZXNvdXJjZU1vZGVsQ2hhbmdlZCgpOworCisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIGFubm90YXRpb24gcHJvdmlkZXIgdGhhdCBzdXBwbGllcyB0aGUgYW5ub3RhdGlvbnMgZm91bmQKKwkJICogaW4gdGhlIEphdmEgcmVzb3VyY2UgbW9kZWwuCisJCSAqLworCQlKcGFBbm5vdGF0aW9uUHJvdmlkZXIgZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCk7CisKKwl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhYjgzNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBKYXZhIHBhY2thZ2UgZnJhZ21lbnQKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50CisJZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCit7CisJLyoqCisJICogUmV0dXJuIHRoZSBwYWNrYWdlIGZyYWdtZW50J3MgY2xhc3MgZmlsZXMgdGhhdCBjb250YWluICJwZXJzaXN0YWJsZSIgdHlwZXMuCisJICovCisJSXRlcmF0b3I8SmF2YVJlc291cmNlQ2xhc3NGaWxlPiBjbGFzc0ZpbGVzKCk7CisJCVN0cmluZyBDTEFTU19GSUxFU19DT0xMRUNUSU9OID0gImNsYXNzRmlsZXMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHBhY2thZ2UgZnJhZ21lbnQncyBjbGFzcyBmaWxlcy4KKwkgKi8KKwlpbnQgY2xhc3NGaWxlc1NpemUoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgcGFja2FnZSBmcmFnbWVudCdzIEphdmEgcGVyc2lzdGVudCB0eXBlcy4KKwkgKiBSZXR1cm4gb25seSB0aGUgZmlsZXMgdGhhdCBhcmUgYW5ub3RhdGVkIHdpdGggSlBBIGFubm90YXRpb25zLgorCSAqLworCUl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiBwZXJzaXN0ZWRUeXBlcygpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwNTY3NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogSmF2YSBwYWNrYWdlIGZyYWdlbWVudCByb290CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QKKwlleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUuUm9vdAoreworCS8qKgorCSAqIFJldHVybiB0aGUgcGFja2FnZSBmcmFnbWVudCByb290J3MgcGFja2FnZSBmcmFnbWVudHMuCisJICovCisJSXRlcmF0b3I8SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50PiBwYWNrYWdlRnJhZ21lbnRzKCk7CisJCVN0cmluZyBQQUNLQUdFX0ZSQUdNRU5UU19DT0xMRUNUSU9OID0gInBhY2thZ2VGcmFnbWVudHMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCdzIHBhY2thZ2UgZnJhZ21lbnRzLgorCSAqLworCWludCBwYWNrYWdlRnJhZ21lbnRzU2l6ZSgpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKaW5kZXggZDM1NjFkNy4uZmZhOGNmYSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDEwICs5LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKIAogLyoqCi0gKiAKKyAqIEphdmEgc291cmNlIGNvZGUgb3IgYmluYXJ5IHBlcnNpc3RlbnQgYXR0cmlidXRlIChmaWVsZCBvciBwcm9wZXJ0eSkKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIwLDYyICsyMiwxMTUgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotLy9UT0RPIGhvdyBkbyB3ZSBoYW5kbGU6CisvL1RPRE8gaGFuZGxlOgogLy8gIEBCYXNpYwogLy8gIHByaXZhdGUgU3RyaW5nIGZvbywgYmFyOwotcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGV4dGVuZHMgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcgorcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlCisJZXh0ZW5kcyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyCiB7CisJLyoqCisJICogVGhlIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCBhdHRyaWJ1dGUncyBuYW1lIGRvZXMgbm90IGNoYW5nZS4KKwkgKi8KIAlTdHJpbmcgZ2V0TmFtZSgpOwogCQotCU1lbWJlciBnZXRNZW1iZXIoKTsKLQkKLQlib29sZWFuIGlzRm9yRmllbGQoKTsKLQkKLQlib29sZWFuIGlzRm9yUHJvcGVydHkoKTsKLQkKLQlib29sZWFuIHR5cGVJc0Jhc2ljKCk7Ci0JCVN0cmluZyBUWVBFX0lTX0JBU0lDX1BST1BFUlRZID0gInR5cGVJc0Jhc2ljUHJvcGVydHkiOwotCQotCWJvb2xlYW4gaXNGaW5hbCgpOwotCQlTdHJpbmcgRklOQUxfUFJPUEVSVFkgPSAiZmluYWxQcm9wZXJ0eSI7Ci0JCi0JYm9vbGVhbiBpc1B1YmxpYygpOwotCQlTdHJpbmcgUFVCTElDX1BST1BFUlRZID0gInB1YmxpY1Byb3BlcnR5IjsKKwkvKioKKwkgKiBSZXR1cm4gYSBudWxsIGFubm90YXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBuYW1lLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBuYW1lIGlzIG51bGwuCisJICogVGhlIGNvcnJlc3BvbmRpbmcgQW5ub3RhdGlvbkRlZmluaXRpb24gbXVzdCBpbXBsZW1lbnQgI2J1aWxkTnVsbEFubm90YXRpb24oKQorCSAqIHtAbGluayBBbm5vdGF0aW9uRGVmaW5pdGlvbiNidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIsCisJICogb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyKX0KKwkgKi8KKwlBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKIAkKIAkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIHR5cGUgaXMgYSBjb250YWluZXI6Ci0JICogamF2YS51dGlsLkNvbGxlY3Rpb24KLQkgKiBqYXZhLnV0aWwuU2V0Ci0JICogamF2YS51dGlsLkxpc3QKLQkgKiBqYXZhLnV0aWwuTWFwCi0JICogQHJldHVybgorCSAqIFdoZXRoZXIgdGhlIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCBhdHRyaWJ1dGUgaXMgYSBmaWVsZCBkb2VzIG5vdCBjaGFuZ2UuCiAJICovCi0JYm9vbGVhbiB0eXBlSXNDb250YWluZXIoKTsKLQkJU3RyaW5nIFRZUEVfSVNfQ09OVEFJTkVSX1BST1BFUlRZID0gInR5cGVJc0NvbnRhaW5lclByb3BlcnR5IjsKKwlib29sZWFuIGlzRmllbGQoKTsKIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIHF1YWxmaWVkIHR5cGUgbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZQorCSAqIFdoZXRoZXIgdGhlIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCBhdHRyaWJ1dGUgaXMgYSBwcm9wZXJ0eSBkb2VzIG5vdCBjaGFuZ2UuCiAJICovCi0JU3RyaW5nIGdldFF1YWxpZmllZFR5cGVOYW1lKCk7Ci0JCVN0cmluZyBRVUFMSUZJRURfVFlQRV9OQU1FX1BST1BFUlRZID0gInF1YWxmaWVkVHlwZU5hbWVQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgcXVhbGZpZWQgdHlwZSBuYW1lIGZvciB0aGUgYXR0cmlidXRlCi0JICogaWYgaXQgYXMgdmFsaWQgYXMgYSB0YXJnZXQgZW50aXR5IHR5cGUuICBpLmUuIG5vdCBhbiBhcnJheS4KLQkgKiBzZWUgdHlwZUlzQ29udGFpbmVyKCkgdG8gYmUgdXNlZCB3aXRoIHRoaXMKLQkgKi8KLQlTdHJpbmcgZ2V0UXVhbGlmaWVkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoKTsKLQkJU3RyaW5nIFFVQUxJRklFRF9SRUZFUkVOQ0VfRU5USVRZX1RZUEVfTkFNRV9QUk9QRVJUWSA9ICJxdWFsZmllZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lUHJvcGVydHkiOworCWJvb2xlYW4gaXNQcm9wZXJ0eSgpOwogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgcGFyYW1ldGVyIGZvciB1c2UgYXMgYSB0YXJnZXQgZW50aXR5CisJICogUmV0dXJuIHRoZSBhY2Nlc3MgdHlwZSBleHBsaWNpdGx5IHNwZWNpZmllZCBieSB0aGUgamF2YXgucGVyc2lzdGVuY2UuQWNjZXNzIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIEFjY2VzcyBhbm5vdGF0aW9uIGlzIG5vdCBwcmVzZW50LiAKKwkgKiBGb3IgSlBBIDEuMCB0aGlzIGlzIGFsd2F5cyBnb2luZyB0byByZXR1cm4gbnVsbDsgQWNjZXNzIGFubm90YXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiAxLjAuCiAJICovCi0JU3RyaW5nIGdldFF1YWxpZmllZFJlZmVyZW5jZUVudGl0eUVsZW1lbnRUeXBlTmFtZSgpOwotCQlTdHJpbmcgUVVBTElGSUVEX1JFRkVSRU5DRV9FTlRJVFlfRUxFTUVOVF9UWVBFX05BTUVfUFJPUEVSVFkgPSAicXVhbGZpZWRSZWZlcmVuY2VFbnRpdHlFbGVtZW50VHlwZU5hbWVQcm9wZXJ0eSI7Ci0JCQorCUFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzKCk7CisKIAkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGF0dHJpYnV0ZSBoYXMgYW55IG1hcHBpbmcgb3Igbm9uLW1hcHBpbmcgYW5ub3RhdGlvbnMKLQkgKiAob2YgY291cnNlIG9ubHkgcGVyc2lzdGVuY2UgcmVsYXRlZCBhbm5vdGF0aW9ucykKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlJ3MgdHlwZSBpbXBsZW1lbnRzIG9yIGV4dGVuZHMgdGhlIHNwZWNpZmllZAorCSAqIHR5cGUuCiAJICovCi0JYm9vbGVhbiBoYXNBbnlBbm5vdGF0aW9uKCk7CisJYm9vbGVhbiB0eXBlSXNTdWJUeXBlT2YoU3RyaW5nIHR5cGVOYW1lKTsKKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUncyB0eXBlIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUgdHlwZQorCSAqIChpLmUuIGFueSBwcmltaXRpdmUgdHlwZSBleGNlcHQgJ3ZvaWQnKS4KKwkgKi8KKwlib29sZWFuIHR5cGVJc1ZhcmlhYmxlUHJpbWl0aXZlKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBpcyBmb3IgdGhlIHNwZWNpZmllZAorCSAqIG1ldGhvZC4KKwkgKi8KKwlib29sZWFuIGlzRm9yKE1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUsIGludCBvY2N1cnJlbmNlKTsKKworCS8qKgorCSAqIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIKKwkgKi8KKwlpbnQgZ2V0TW9kaWZpZXJzKCk7CisJCVN0cmluZyBNT0RJRklFUlNfUFJPUEVSVFkgPSAibW9kaWZpZXJzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvbHZlZCwgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSdzIHR5cGUKKwkgKiAoZS5nLiAiamF2YS51dGlsLkNvbGxlY3Rpb24iIG9yICJieXRlW10iKS4KKwkgKiBJZiB0aGUgdHlwZSBpcyBhbiBhcnJheSwgdGhpcyBuYW1lIHdpbGwgaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyCisJICogb2YgYnJhY2tldCBwYWlycy4KKwkgKiBUaGlzIG5hbWUgd2lsbCBub3QgaW5jbHVkZSB0aGUgdHlwZSdzIGdlbmVyaWMgdHlwZSBhcmd1bWVudHMKKwkgKiAoZS5nLiAiamF2YS51dGlsLkNvbGxlY3Rpb248amF2YS5sYW5nLlN0cmluZz4iIHdpbGwgb25seSByZXR1cm4KKwkgKiAiamF2YS51dGlsLkNvbGxlY3Rpb24iKS4KKwkgKiBAc2VlICN0eXBlVHlwZUFyZ3VtZW50TmFtZXMoKQorCSAqLworCVN0cmluZyBnZXRUeXBlTmFtZSgpOworCQlTdHJpbmcgVFlQRV9OQU1FX1BST1BFUlRZID0gInR5cGVOYW1lIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSB0eXBlIGlzIGFuIGludGVyZmFjZS4KKwkgKi8KKwlib29sZWFuIHR5cGVJc0ludGVyZmFjZSgpOworCQlTdHJpbmcgVFlQRV9JU19JTlRFUkZBQ0VfUFJPUEVSVFkgPSAidHlwZUlzSW50ZXJmYWNlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSB0eXBlIGlzIGFuIGVudW0uCisJICovCisJYm9vbGVhbiB0eXBlSXNFbnVtKCk7CisJCVN0cmluZyBUWVBFX0lTX0VOVU1fUFJPUEVSVFkgPSAidHlwZUlzRW51bSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlJ3Mgc3VwZXJjbGFzc2VzLgorCSAqLworCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHR5cGVTdXBlcmNsYXNzTmFtZXMoKTsKKwkJU3RyaW5nIFRZUEVfU1VQRVJDTEFTU19OQU1FU19MSVNUID0gInR5cGVTdXBlcmNsYXNzTmFtZXMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZSdzIGludGVyZmFjZXMuCisJICovCisJSXRlcmF0b3I8U3RyaW5nPiB0eXBlSW50ZXJmYWNlTmFtZXMoKTsKKwkJU3RyaW5nIFRZUEVfSU5URVJGQUNFX05BTUVTX0NPTExFQ1RJT04gPSAidHlwZUludGVyZmFjZU5hbWVzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgYXR0cmlidXRlIHR5cGUncyB0eXBlIGFyZ3VtZW50cy4KKwkgKiBUaGUgbmFtZSBmb3IgYW55IGFyZ3VtZW50IHRoYXQgaXMgYW4gYXJyYXkgd2lsbCBjb250YWluIHRoZSBhcHByb3ByaWF0ZQorCSAqIG51bWJlciBvZiBicmFja2V0IHBhaXJzLgorCSAqIFRoZSBuYW1lcyB3aWxsIG5vdCBpbmNsdWRlIGFueSBmdXJ0aGVyIGdlbmVyaWMgdHlwZSBhcmd1bWVudHMuCisJICovCisJTGlzdEl0ZXJhdG9yPFN0cmluZz4gdHlwZVR5cGVBcmd1bWVudE5hbWVzKCk7CisJCVN0cmluZyBUWVBFX1RZUEVfQVJHVU1FTlRfTkFNRVNfTElTVCA9ICJ0eXBlVHlwZUFyZ3VtZW50TmFtZXMiOyAvLyROT04tTkxTLTEkCisKKwlpbnQgdHlwZVR5cGVBcmd1bWVudE5hbWVzU2l6ZSgpOworCisJU3RyaW5nIGdldFR5cGVUeXBlQXJndW1lbnROYW1lKGludCBpbmRleCk7CisKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuamF2YQppbmRleCAyMzRjYmQyLi5kNGEwMGNmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDEzICsxMCwxMSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5NZXRob2RTaWduYXR1cmU7CiAKIC8qKgotICogCisgKiBKYXZhIHNvdXJjZSBjb2RlIG9yIGJpbmFyeSBwZXJzaXN0ZW50IG1lbWJlci4KICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTI0LDE0NiArMjIsMTU3IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcgorCWV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQogewotCi0JLyoqCi0JICogUmV0dXJuIGFsbCA8Y29kZT5KYXZhUmVzb3VyY2U8L2NvZGU+cyB0aGF0IGNvcnJlc3BvbmQgdG8gdHlwZQotCSAqIG1hcHBpbmcgYW5ub3RhdGlvbnMgc3BlY2lmaWVkIGluIHRoZSBzb3VyY2UgY29kZS4gIEluIEpQQSB0aGVzZSBjb3VsZCBiZSAKLQkgKiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MsIEVtYmVkZGFibGUuCi0JICogPHA+RG9lcyBub3QgcmV0dXJuIGR1cGxpY2F0ZSBhbm5vdGF0aW9ucyBhcyB0aGlzIGVycm9yIGlzIGhhbmRsZWQgYnkgdGhlIGphdmEgY29tcGlsZXIuCi0JICovCi0JPFQgZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlPiBJdGVyYXRvcjxUPiBtYXBwaW5nQW5ub3RhdGlvbnMoKTsKLQkJU3RyaW5nIE1BUFBJTkdfQU5OT1RBVElPTlNfQ09MTEVDVElPTiA9ICJtYXBwaW5nQW5ub3RhdGlvbnMiOworCS8vICoqKioqKioqKiogYW5ub3RhdGlvbnMgKioqKioqKioqKgogCQotCWludCBtYXBwaW5nQW5ub3RhdGlvbnNTaXplKCk7CiAJLyoqCi0JICogUmV0dXJuIHRoZSA8Y29kZT5KYXZhUmVzb3VyY2U8L2NvZGU+IHNwZWNpZmllZCBvbiB0aGlzIEphdmFQZXJzaXN0ZW50UmVzb3VyY2UKLQkgKiBJbiB0aGUgY2FzZSBvZiBtdWx0aXBsZXMgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHJldHVybmVkIGFzIGRlZmluZWQgYnkgdGhlIG9yZGVyIG9mCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkdlbmVyaWNKcGFQbGF0Zm9ybSN0eXBlTWFwcGluZ0Fubm90YXRpb25EZWZpbml0aW9ucygpfSBvciAKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uR2VuZXJpY0pwYVBsYXRmb3JtI2F0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKX0KKwkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlICJhbm5vdGF0aW9ucyIgY29sbGVjdGlvbgogCSAqLwotCUphdmFSZXNvdXJjZU5vZGUgZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkphdmFSZXNvdXJjZTwvY29kZT4gd2l0aCB0aGlzIGZ1bGx5IHF1YWxpZmVkIGFubm90YXRpb24gbmFtZS4gCi0JICogSW4gSlBBIHRoZSB2YWxpZCBhbm5vdGF0aW9ucyBhcmUgImphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGRhYmxlIiwgImphdmF4LnBlcnNpc3RlbmNlLkVudGl0eSIsIAotCSAqIGFuZCAiamF2YXgucGVyc2lzdGVuY2UuTWFwcGVkU3VwZXJjbGFzcyIKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGlmIHRoZXJlIGFyZSBkdXBsaWNhdGVzIGluIHRoZSBzb3VyY2UgY29kZQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZSAtIGZ1bGx5IHF1YWxpZmllZCBhbm5vdGF0aW9uIG5hbWUKLQkgKi8KLQkvL1RPRE8gbm90IHN1cmUgd2UgbmVlZCB0aGlzIEFQSSwgZmlyc3QgMiBzZWVtIHN1ZmZpY2llbnQKLQlKYXZhUmVzb3VyY2VOb2RlIGdldE1hcHBpbmdBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7Ci0KLQkvKioKLQkgKiBVc2UgdGhpcyB0byBjaGFuZ2UgdGhlIHR5cGUgbWFwcGluZyBhbm5vdGF0aW9uLiAgVGhpcyB3aWxsIG9ubHkgcmVtb3ZlCi0JICogb3RoZXIgbWFwcGluZyBhbm5vdGF0aW9ucyBpbiBjYXNlIHRoZXJlIHdlcmUgbXVsdGlwbGUgYmVmb3JlLiAgSXQKLQkgKiB3aWxsIG5vdCByZW1vdmUgYW55IG5vbi1tYXBwaW5nIGFubm90YXRpb25zCi0JICogQHBhcmFtIGFubm90YXRpb25OYW1lIC0gZnVsbHkgcXVhbGlmaWVkIGFubm90YXRpb24gbmFtZQotCSAqLwotCXZvaWQgc2V0TWFwcGluZ0Fubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiBhbGwgPGNvZGU+SmF2YVJlc291cmNlPC9jb2RlPnMgdGhhdCBjb3JyZXNwb25kIHRvIGFubm90YXRpb25zIGluIHRoZSBzb3VyY2UgY29kZS4KLQkgKiBEb2VzIG5vdCByZXR1cm4gZHVwbGljYXRlIGFubm90YXRpb25zIGFzIHRoaXMgZXJyb3IgaXMgaGFuZGxlZCBieSB0aGUgamF2YSBjb21waWxlci4KLQkgKiBObyA8Y29kZT5NYXBwaW5nQW5ub3RhdGlvbjwvY29kZT5zIHNob3VsZCBiZSBpbmNsdWRlZC4KLQkgKiBAc2VlICNtYXBwaW5nQW5ub3RhdGlvbnMoKQotCSAqLwotCTxUIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZT4gSXRlcmF0b3I8VD4gIGFubm90YXRpb25zKCk7CisJU3RyaW5nIEFOTk9UQVRJT05TX0NPTExFQ1RJT04gPSAiYW5ub3RhdGlvbnMiOyAvLyROT04tTkxTLTEkCiAJCi0JCVN0cmluZyBBTk5PVEFUSU9OU19DT0xMRUNUSU9OID0gImFubm90YXRpb25zIjsKLQorCS8qKgorCSAqIFJldHVybiB0aGUgbWVtYmVyJ3MgYW5ub3RhdGlvbnMgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBhcHBlYXIuCisJICogRG8gbm90IHJldHVybiBkdXBsaWNhdGUgYW5ub3RhdGlvbnMgYXMgdGhpcyBlcnJvciBpcyBoYW5kbGVkIGJ5IHRoZSBKYXZhCisJICogY29tcGlsZXIuCisJICovCisJSXRlcmF0b3I8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhbm5vdGF0aW9ucy4KKwkgKi8KIAlpbnQgYW5ub3RhdGlvbnNTaXplKCk7Ci0KLQkvL1RPRE8gdGllIHRoZSBzaW5ndWxhciBhbmQgcGx1cmFsIGFubm90YXRpb25zIHRvZ2V0aGVyIHNvbWVob3cgaW4gdGhlIHJlc291cmNlIG1vZGVsIHNvIHdlIGNhbiBnaXZlCi0JLy9hIHZhbGlkYXRpb24gZXJyb3IgZm9yIHRoZSBjYXNlIG9mIGJvdGggYmVpbmcgc3BlY2lmaWVkCi0JLyoqCi0JICogR2l2ZW4gYSBuZXN0YWJsZSBhbmQgY29udGFpbmVyIGFubm90YXRpb24gbmFtZSByZXR1cm4gdGhlIHNwZWNpZmllZCA8Y29kZT5KYXZhUmVzb3VyY2U8L2NvZGU+cy4KLQkgKiBJZiBib3RoIHRoZSBuZXN0YWJsZSBhbmQgY29udGFpbmVyIGFubm90YXRpb25zIGFyZSBzcGVjaWZpZWQgb24gdGhlIFR5cGUsIHRoZW4gb25seQotCSAqIHJldHVybiB0aGUgbmVzdGFibGUgYW5ub3RhdGlvbnMgc3BlY2lmaWVkIHdpdGhpbiB0aGUgY29udGFpbmVyIGFubm90YXRpb24uIFRoaXMgaXMKLQkgKiBvbmx5IGdvaW5nIHRvIHJldHVybiBKYXZhUmVzb3VyY2VzIHRoYXQgbWF0Y2ggdGhlIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUKLQkgKi8KLQk8VCBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGU+IExpc3RJdGVyYXRvcjxUPiBhbm5vdGF0aW9ucyhTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKLQkKIAkKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5KYXZhUmVzb3VyY2U8L2NvZGU+IHdpdGggdGhpcyBmdWxseSBxdWFsaWZlZCBhbm5vdGF0aW9uIG5hbWUuIAorCSAqIFJldHVybiB0aGUgYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KIAkgKiBSZXR1cm4gdGhlIGZpcnN0IGlmIHRoZXJlIGFyZSBkdXBsaWNhdGVzIGluIHRoZSBzb3VyY2UgY29kZS4KIAkgKi8KLQlKYXZhUmVzb3VyY2VOb2RlIGdldEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKKwlBbm5vdGF0aW9uIGdldEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKIAkKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5KYXZhUmVzb3VyY2U8L2NvZGU+IHdpdGggdGhpcyBmdWxseSBxdWFsaWZlZCBhbm5vdGF0aW9uIG5hbWUuIAotCSAqIFJldHVybiB0aGUgZmlyc3QgaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMgaW4gdGhlIHNvdXJjZSBjb2RlLiAgV2lsbCBub3QgcmV0dXJuIG51bGwsCi0JICogYnV0IGEgbnVsbCBPYmplY3QgaW5zdGVhZCBpZiBubyBhbm5vdGF0aW9uIHdpdGggdGhpcyBuYW1lIGV4aXN0cyBpbiB0aGUgamF2YSBzb3VyY2UuCisJICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gdGhlIGZpcnN0IGlmIHRoZXJlIGFyZSBkdXBsaWNhdGVzIGluIHRoZSBzb3VyY2UgY29kZS4KKwkgKiBEbyBub3QgcmV0dXJuIG51bGwsIGJ1dCBhIE51bGwgT2JqZWN0IGluc3RlYWQgaWYgbm8gYW5ub3RhdGlvbgorCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGV4aXN0cyBpbiB0aGUgc291cmNlIGNvZGUuCiAJICovCi0JSmF2YVJlc291cmNlTm9kZSBnZXROb25OdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbnVsbCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5KYXZhUmVzb3VyY2VOb2RlPC9jb2RlPiB3aXRoIHRoaXMgZnVsbHkgcXVhbGlmZWQgYW5ub3RhdGlvbiBuYW1lLgotCSAqIFRoZSBjb3JyZXNwb25kaW5nIEFubm90YXRpb25EZWZpbml0aW9uIG5lZWRzIHRvIGltcGxlbWVudCBidWlsZE51bGxBbm5vdGF0aW9uKCkKLQkgKiB7QGxpbmsgQW5ub3RhdGlvbkRlZmluaXRpb24jYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5Lk1lbWJlcil9Ci0JICovCi0JSmF2YVJlc291cmNlTm9kZSBnZXROdWxsTWFwcGluZ0Fubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQotCS8qKgotCSAqIEFkZCBhbiBhbm5vdGF0aW9uIGZvciB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIGFubm90YXRpb24gbmFtZQotCSAqLwotCUphdmFSZXNvdXJjZU5vZGUgYWRkQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOworCUFubm90YXRpb24gZ2V0Tm9uTnVsbEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKIAkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG5lc3RhYmxlIGFubm90YXRpb25zIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBvcmRlciB0aGF0CisJICogdGhleSBhcHBlYXIuCisJICogSWYgbmVzdGFibGUgYW5kIGNvbnRhaW5lciBhbm5vdGF0aW9ucyBhcmUgYm90aCBzcGVjaWZpZWQgb24gdGhlCisJICogbWVtYmVyIGRpcmVjdGx5LCByZXR1cm4gb25seSB0aGUgbmVzdGFibGUgYW5ub3RhdGlvbnMgc3BlY2lmaWVkIHdpdGhpbgorCSAqIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbi4KKwkgKi8KKwkvLyBUT0RPIHRpZSB0aGUgc2luZ3VsYXIgYW5kIHBsdXJhbCBhbm5vdGF0aW9ucyB0b2dldGhlciBzbyB3ZSBjYW4gZ2VuZXJhdGUKKwkvLyBhIHZhbGlkYXRpb24gZXJyb3Igd2hlbiBib3RoIGFyZSBzcGVjaWZpZWQKKwlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGFubm90YXRpb25zKAorCQkJU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7CisJCisJLyoqCisJICogQWRkIGFuIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogUmV0dXJuIHRoZSBuZXdseS1jcmVhdGVkIGFubm90YXRpb24uCisJICovCisJQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7CisJCisJLyoqCisJICogQWRkIGFuIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogSW5pdGlhbGl6ZSB0aGUgbmV3bHktY3JlYXRlZCBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGluaXRpYWxpemVyLgorCSAqIFJldHVybiB0aGUgYW5ub3RhdGlvbiByZXR1cm5lZCBieSB0aGUgYW5ub3RhdGlvbiBpbml0aWFsaXplci4KKwkgKi8KKwlBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lLCBBbm5vdGF0aW9uSW5pdGlhbGl6ZXIgYW5ub3RhdGlvbkluaXRpYWxpemVyKTsKKwkKKwkvKioKKwkgKiBDYWxsYmFjayB0aGF0IGFsbG93cyBjbGllbnRzIHRvIGluaXRpYWxpemUgYW4gYW5ub3RhdGlvbiBhZGRlZCB0byB0aGUKKwkgKiBtZW1iZXIgYmVmb3JlIHRoZSBtZW1iZXIgZmlyZXMgYSBjaGFuZ2UgZXZlbnQuIFRoZSBpbml0aWFsaXplciBzaG91bGQKKwkgKiBub3QgdHJpZ2dlciBhbnkgY2hhbmdlIGV2ZW50cyBlaXRoZXIuCisJICovCisJaW50ZXJmYWNlIEFubm90YXRpb25Jbml0aWFsaXplciB7CisJCS8qKgorCQkgKiBJbml0aWFsaXplIHRoZSBzcGVjaWZpZWQgc3VwcG9ydGluZyBhbm5vdGF0aW9uLgorCQkgKiBSZXR1cm4gdGhlIG5ld2x5LWNyZWF0ZWQgbmVzdGVkIGFubm90YXRpb24uCisJCSAqLworCQlBbm5vdGF0aW9uIGluaXRpYWxpemVBbm5vdGF0aW9uKEFubm90YXRpb24gc3VwcG9ydGluZ0Fubm90YXRpb24pOworCX0KKwkKKwkvKioKKwkgKiBBZGQgYSBuZXcgbmVzdGFibGUgYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiBDcmVhdGUgYSBuZXcgY29udGFpbmVyIGFubm90YXRpb24gaWYgbmVjZXNzYXJ5IGFuZCBhZGQgdGhlIG5lc3RhYmxlCisJICogYW5ub3RhdGlvbiB0byBpdC4KKwkgKiBJZiBib3RoIHRoZSBuZXN0YWJsZSBhbm5vdGF0aW9uIGFuZCB0aGUgY29udGFpbmVyIGFubm90YXRpb24gYWxyZWFkeQorCSAqIGV4aXN0LCB0aGVuIGFkZCB0byB0aGUgY29udGFpbmVyIGFubm90YXRpb24sIGxlYXZpbmcgdGhlIGV4aXN0aW5nCisJICogbmVzdGFibGUgYW5ub3RhdGlvbiBhbG9uZS4KKwkgKiBJZiBvbmx5IHRoZSBuZXN0YWJsZSBhbm5vdGF0aW9uIGV4aXN0cywgdGhlbiBjcmVhdGUgdGhlIG5ldyBjb250YWluZXIKKwkgKiBhbm5vdGF0aW9uIGFuZCBtb3ZlIHRoZSBleGlzdGluZyBuZXN0YWJsZSBhbm5vdGF0aW9uIHRvIGl0IGFsb25nIHdpdGgKKwkgKiB0aGUgbmV3IG9uZS4gSWYgbmVpdGhlciBhbm5vdGF0aW9uIGV4aXN0cywgdGhlbiBjcmVhdGUgYSBuZXcgbmVzdGFibGUKKwkgKiBhbm5vdGF0aW9uLgorCSAqLworCU5lc3RhYmxlQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKAorCQkJaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKKwkKKwkvKioKKwkgKiBNb3ZlIHRoZSBuZXN0YWJsZSBhbm5vdGF0aW9uIGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyCisJICogYW5ub3RhdGlvbiBhdCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCBpbmRleC4KKwkgKi8KKwl2b2lkIG1vdmVBbm5vdGF0aW9uKAorCQkJaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7CisJCisJLyoqCisJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbi4KKwkgKi8KIAl2b2lkIHJlbW92ZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQorCQogCS8qKgotCSAqIEFkZCBhIG5ldyBOZXN0YWJsZUFubm90YXRpb24gbmFtZWQgbmVzdGFibGVBbm5vdGF0aW9uTmFtZS4gIENyZWF0ZSBhIG5ldyBjb250YWluZXIgYW5ub3RhdGlvbgotCSAqIGlmIG5lY2Vzc2FyeSBhbmQgYWRkIHRoZSBuZXN0YWJsZSBhbm5vdGF0aW9uIHRvIGl0LiAgSWYgYm90aCBuZXN0YWJsZSBhbmQgY29udGFpbmVyIGFscmVhZHkKLQkgKiBleGlzdCB0aGVuIGFkZCB0byB0aGUgY29udGFpbmVyIGFubm90YXRpb24gbGVhdmluZyB0aGUgZXhpc3RpbmcgbmVzdGFibGUgYW5ub3RhaW9uIGFsb25lLgotCSAqIElmIG9ubHkgbmVzdGFibGUgZXhpc3RzLCB0aGVuIGNyZWF0ZSB0aGUgbmV3IGNvbnRhaW5lciBhbm5vdGF0aW9uIGFuZCBtb3ZlIHRoZSBuZXN0YWJsZSB0byBpdAotCSAqIGFsc28gYWRkaW5nIHRoZSBuZXcgb25lLiAgSWYgbmVpdGhlciBleGlzdHMsIGNyZWF0ZSBhIG5ldyBuZXN0YWJsZSBhbm5vdGF0aW9uLgotCSAqIEByZXR1cm4gdGhlIG5ldyBKYXZhUmVzb3VyY2Ugd2l0aCB0aGUgbmFtZSBuZXN0YWJsZUFubm90YXRpb25OYW1lCisJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbmVzdGFibGUgYW5ub3RhdGlvbiBmcm9tIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbiBhdCB0aGUgc3BlY2lmaWVkCisJICogaW5kZXguCisJICogSWYgdGhlcmUgaXMgbm8gY29udGFpbmVyLCBhc3N1bWUgdGhlIGluZGV4IGlzIHplcm8gYW5kIHRoaXMgZG9lcyB0aGUgc2FtZSBhcyAKKwkgKiB7QGxpbmsgI3JlbW92ZUFubm90YXRpb24oU3RyaW5nKX0KIAkgKi8KLQlKYXZhUmVzb3VyY2VOb2RlIGFkZEFubm90YXRpb24oaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKLQkKLQl2b2lkIHJlbW92ZUFubm90YXRpb24oaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKKwl2b2lkIHJlbW92ZUFubm90YXRpb24oCisJCQlpbnQgaW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lLCBTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOwogCQogCS8qKgotCSAqIE1vdmUgbmVzdGFibGVBbm5vdGF0aW9uIGZvdW5kIGluIHRoZSBjb250YWluZXJBbm5vdGF0aW9uIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgCi0JICogaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQgaW5kZXguICAgIAorCSAqIFNldHMgdGhlIHNwZWNpZmllZCBwcmltYXJ5IGFubm90YXRpb24gYXMgdGhlIGZpcnN0IGFubm90YXRpb24sIGFuZCByZW1vdmVzIGFsbCBrbm93biAKKwkgKiBhbm5vdGF0aW9ucyAoaS5lLiBkb2VzIG5vdCByZW1vdmUgbm9uLXBlcnNpc3RlbmNlIGFubm90YXRpb25zKSB3aGljaCBhcmUgbm90IGluY2x1ZGVkCisJICogaW4gdGhlIHN1cHBvcnRpbmcgYW5ub3RhdGlvbnMuCiAJICovCi0Jdm9pZCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOworCUFubm90YXRpb24gc2V0UHJpbWFyeUFubm90YXRpb24oCisJCQlTdHJpbmcgcHJpbWFyeUFubm90YXRpb25OYW1lLCBTdHJpbmdbXSBzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKTsKKwkKKwkKKwkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgogCQogCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIEpEVCBtZW1iZXIgaXMgcGVyc2lzdGFibGUgYWNjb3JkaW5nIHRvIHRoZSBKUEEgc3BlYworCSAqIFJldHVybiB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIEpEVCBtZW1iZXIgaXMgcGVyc2lzdGFibGUgYWNjb3JkaW5nIHRvCisJICogdGhlIEpQQSBzcGVjLgogCSAqLwogCWJvb2xlYW4gaXNQZXJzaXN0YWJsZSgpOwotCQlTdHJpbmcgUEVSU0lTVEFCTEVfUFJPUEVSVFkgPSAicGVyc2lzdGFibGUiOworCQlTdHJpbmcgUEVSU0lTVEFCTEVfUFJPUEVSVFkgPSAicGVyc2lzdGFibGUiOyAvLyROT04tTkxTLTEkCiAJCQogCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIEpEVCBtZW1iZXIgaXMgY3VycmVudGx5IGFubm90YXRlZCBhcyBiZWluZyBwZXJzaXN0ZW50Ci0JICogKGVxdWl2YWxlbnQgdG8gImlzIG1hcHBlZCIpCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgSkRUIG1lbWJlciBpcyBjdXJyZW50bHkgYW5ub3RhdGVkIHdpdGggYW55IHJlY29nbml6ZWQKKwkgKiBhbm5vdGF0aW9ucy4KIAkgKi8KLQlib29sZWFuIGlzUGVyc2lzdGVkKCk7Ci0KKwlib29sZWFuIGlzQW5ub3RhdGVkKCk7CisJCiAJLyoqCiAJICogUmV0dXJuIHdoZXRoZXIgdGhlIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCBtZW1iZXIgaXMgZm9yIHRoZSBzcGVjaWZpZWQKIAkgKiBtZW1iZXIuCiAJICovCiAJYm9vbGVhbiBpc0ZvcihTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VycmVuY2UpOwotCisJCiAJLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCBtZW1iZXIgaXMgZm9yIHRoZSBzcGVjaWZpZWQKLQkgKiBtZXRob2QuCi0JICovCi0JYm9vbGVhbiBpc0ZvcihNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlLCBpbnQgb2NjdXJyZW5jZSk7Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHRleHQgcmFuZ2UgZm9yIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW50IHJlc291cmNlCisJICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGZvciB0aGUgbWVtYmVyJ3MgbmFtZS4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAJCisJCisJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCisJCiAJLyoqCi0JICogUmVzb2x2ZSB0eXBlIGluZm9ybWF0aW9uIHRoYXQgY291bGQgYmUgZGVwZW5kZW50IG9uIG90aGVyIGZpbGVzIGJlaW5nIGFkZGVkL3JlbW92ZWQKKwkgKiBSZXNvbHZlIHR5cGUgaW5mb3JtYXRpb24gdGhhdCBjb3VsZCBiZSBkZXBlbmRlbnQgb24gY2hhbmdlcyBlbHNld2hlcmUKKwkgKiBpbiB0aGUgd29ya3NwYWNlLgogCSAqLwogCXZvaWQgcmVzb2x2ZVR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUuamF2YQppbmRleCBmNzFhM2YzLi5kZGEyMjQ1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsMTAgKzEwLDkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CiAKIC8qKgotICogCisgKiBKYXZhIHNvdXJjZSBjb2RlIG9yIGJpbmFyeSBwZXJzaXN0ZW50IHR5cGUuCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMSw2NSArMjAsMTIzIEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZXh0ZW5kcyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyCi17CQorcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZQorCWV4dGVuZHMgSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcgorewogCS8qKgotCSAqIFJldHVybiBvbmx5IHRoZSBpbW1lZGlhdGVseSBuZXN0ZWQgcGVyc2lzdGFibGUgbmVzdGVkVHlwZXMKLQkgKi8KLQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gbmVzdGVkVHlwZXMoKTsKLQkJU3RyaW5nIE5FU1RFRF9UWVBFU19DT0xMRUNUSU9OID0gIm5lc3RlZFR5cGVzIjsKLQotCS8qKgotCSAqIFJldHVybiBvbmx5IHRoZSBwZXJzaXN0YWJsZSBhdHRyaWJ1dGVzLCB0aG9zZSB0aGF0IHJlc3BvbmQgdHJ1ZSB0bwotCSAqIHtAbGluayBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlI2lzUGVyc2lzdGFibGUoKX0KLQkgKiBUaGlzIHJldHVybnMgZmllbGRzIGFuZCBwcm9wZXJ0aWVzCi0JICovCi0JSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcygpOwotCQlTdHJpbmcgQVRUUklCVVRFU19DT0xMRUNUSU9OID0gImF0dHJpYnV0ZXMiOwotCQotCS8qKgotCSAqIFJldHVybiBvbmx5IHRoZSBwZXJzaXN0YWJsZSBmaWVsZHMsIHRob3NlIHRoYXQgcmVzcG9uZCB0cnVlIHRvCi0JICoge0BsaW5rIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUjaXNQZXJzaXN0YWJsZSgpfQotCSAqIFRoaXMgcmV0dXJucyBmaWx0ZXJzIG91dCBhbGwgcHJvcGVydGllcyBhbmQgb25seSByZXR1cm5zIGZpZWxkcwotCSAqLwotCUl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGZpZWxkcygpOwotCi0JLyoqCi0JICogUmV0dXJuIG9ubHkgdGhlIHBlcnNpc3RhYmxlIGZpZWxkcywgdGhvc2UgdGhhdCByZXNwb25kIHRydWUgdG8KLQkgKiB7QGxpbmsgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSNpc1BlcnNpc3RhYmxlKCl9Ci0JICogVGhpcyByZXR1cm5zIGZpbHRlcnMgb3V0IGFsbCBmaWVsZHMgYW5kIG9ubHkgcmV0dXJucyBwcm9wZXJ0aWVzCi0JICovCi0JSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcHJvcGVydGllcygpOwotCQotCS8vIFRPRE8gcmVuYW1lIHRvIGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFN0cmluZykKLQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUKLQkgKi8KLQlTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQlTdHJpbmcgUVVBTElGSUVEX05BTUVfUFJPUEVSVFkgPSAicXVhbGlmaWVkTmFtZSI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5IHVucXVhbGlmaWVkIHR5cGUgbmFtZQorCSAqIFJldHVybiB0aGUgdW5xdWFsaWZpZWQgKHNob3J0KSB0eXBlIG5hbWUuCiAJICovCiAJU3RyaW5nIGdldE5hbWUoKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7CisJCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCiAKLQlTdHJpbmcgZ2V0U3VwZXJDbGFzc1F1YWxpZmllZE5hbWUoKTsKLQkJU3RyaW5nIFNVUEVSX0NMQVNTX1FVQUxJRklFRF9OQU1FX1BST1BFUlRZID0gInN1cGVyQ2xhc3NRdWFsaWZpZWROYW1lIjsKLQkKLQlBY2Nlc3NUeXBlIGdldEFjY2VzcygpOwotCQlTdHJpbmcgQUNDRVNTX1BST1BFUlRZID0gImFjY2VzcyI7Ci0JCQorCS8qKgorCSAqIFJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZS4KKwkgKi8KKwlTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpOworCQlTdHJpbmcgUVVBTElGSUVEX05BTUVfUFJPUEVSVFkgPSAicXVhbGlmaWVkTmFtZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUncyBzdXBlcmNsYXNzLgorCSAqLworCVN0cmluZyBnZXRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSgpOworCQlTdHJpbmcgU1VQRVJDTEFTU19RVUFMSUZJRURfTkFNRV9QUk9QRVJUWSA9ICJzdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGFic3RyYWN0LgorCSAqLwogCWJvb2xlYW4gaXNBYnN0cmFjdCgpOwotCQlTdHJpbmcgQUJTVFJBQ1RfUFJPUEVSVFkgPSAiYWJzdHJhY3QiOwkKLQkJCi0JTWVtYmVyIGdldE1lbWJlcigpOworCQlTdHJpbmcgQUJTVFJBQ1RfUFJPUEVSVFkgPSAiYWJzdHJhY3QiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHR5cGUncyBhY2Nlc3MgdHlwZSAoImZpZWxkIiBvciAicHJvcGVydHkiKS4KKwkgKi8KKwlBY2Nlc3NUeXBlIGdldEFjY2VzcygpOworCQlTdHJpbmcgQUNDRVNTX1BST1BFUlRZID0gImFjY2VzcyI7IC8vJE5PTi1OTFMtMSQKIAkKIAkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhbnkgYXR0cmlidXRlcyBpbiB0aGlzIHBlcnNpc3RlbnRUeXBlIGhhdmUKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCBhbnkgYW5ub3RhdGlvbnMgdGhhdCBkZXRlcm1pbmUgd2hldGhlciBhbmQgCisJICogaG93IHRoZSB0eXBlIGlzIHBlcnNpc3RlZAorCSAqLworCWJvb2xlYW4gaXNNYXBwZWQoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBoYXMgYW55IGF0dHJpYnV0ZXMgdGhhdCBoYXZlCiAJICogSlBBIGFubm90YXRpb25zIG9uIHRoZW0uCiAJICovCi0JYm9vbGVhbiBoYXNBbnlBdHRyaWJ1dGVBbm5vdGF0aW9ucygpOworCWJvb2xlYW4gaGFzQW55QW5ub3RhdGVkQXR0cmlidXRlcygpOworCisKKwkvLyAqKioqKioqKioqIHR5cGVzICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlbHkgbmVzdGVkIHR5cGVzIChjaGlsZHJlbikuCisJICovCisJSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IHR5cGVzKCk7CisJCVN0cmluZyBUWVBFU19DT0xMRUNUSU9OID0gInR5cGVzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIGFsbCB0aGUgdHlwZXM7IHRoZSB0eXBlIGl0c2VsZiwgaXRzIGNoaWxkcmVuLCBpdHMgZ3JhbmRjaGlsZHJlbiwKKwkgKiBldGMuCisJICovCisJSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU+IGFsbFR5cGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZWx5IG5lc3RlZCBwZXJzaXN0YWJsZSB0eXBlcy4KKwkgKi8KKwlJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGFibGVUeXBlcygpOworCisKKwkvLyAqKioqKioqKioqIGZpZWxkcyAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHR5cGUncyBmaWVsZHMuCisJICovCisJSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gZmllbGRzKCk7CisJCVN0cmluZyBGSUVMRFNfQ09MTEVDVElPTiA9ICJmaWVsZHMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHR5cGUncyBwZXJzaXN0YWJsZSBmaWVsZHMuCisJICovCisJSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcGVyc2lzdGFibGVGaWVsZHMoKTsKKworCS8qKgorCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgcGVyc2lzdGFibGVGaWVsZHMgdGhhdCBhbHNvCisJICogaGF2ZSB0aGUgQWNjZXNzIGFubm90YXRpb24gd2l0aCBhIHZhbHVlIG9mIEZJRUxECisJICovCisJSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcGVyc2lzdGFibGVGaWVsZHNXaXRoU3BlY2lmaWVkRmllbGRBY2Nlc3MoKTsKKworCisJLy8gKioqKioqKioqKiBtZXRob2RzICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgdHlwZSdzIG1ldGhvZHMuIFRoaXMgcmV0dXJucyAqYWxsKiBtZXRob2RzIGZyb20gdGhlIEpEVCBUeXBlCisJICovCisJSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gbWV0aG9kcygpOworCQlTdHJpbmcgTUVUSE9EU19DT0xMRUNUSU9OID0gIm1ldGhvZHMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHR5cGUncyBwZXJzaXN0YWJsZSBwcm9wZXJ0aWVzLiAgVGhpcyByZXR1cm5zIG9ubHkgdGhlIGdldHRlciBtZXRob2RzCisJICogdGhhdCBtYXRjaCB0aGUgSmF2YUJlYW5zIGNyaXRlcmlhIGZvciBKUEEsIGhlbmNlIHRoZSBuYW1lIHByb3BlcnRpZXMgaW5zdGVhZCBvZiBtZXRob2RzCisJICovCisJSXRlcmF0b3I8SmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZT4gcGVyc2lzdGFibGVQcm9wZXJ0aWVzKCk7CisKKwkvKioKKwkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIHBlcnNpc3RhYmxlUHJvcGVydGllcyB0aGF0IGFsc28KKwkgKiBoYXZlIHRoZSBBY2Nlc3MgYW5ub3RhdGlvbiB3aXRoIGEgdmFsdWUgb2YgUFJPUEVSVFkKKwkgKi8KKwlJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBwZXJzaXN0YWJsZVByb3BlcnRpZXNXaXRoU3BlY2lmaWVkUHJvcGVydHlBY2Nlc3MoKTsKKworCisJLy8gKioqKioqKioqKiBhdHRyaWJ1dGVzICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgdHlwZSdzIHBlcnNpc3RhYmxlIGZpZWxkcyBhbmQgcHJvcGVydGllcy4KKwkgKi8KKwlJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBwZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHBlcnNpdGFibGUgcHJvcGVydGllcyBhbmQvb3IgZmllbGRzIGdpdmVuIHRoZSBub24tbnVsbCBzcGVjaWZpZWQgYWNjZXNzIHR5cGUKKwkgKi8KKwlJdGVyYXRvcjxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlPiBwZXJzaXN0YWJsZUF0dHJpYnV0ZXMoQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3MpOworCQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZjBhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CisKKy8qKgorICogSmF2YSBwZXJzaXN0ZW50IHR5cGUgY2FjaGUgLSB1c2VkIHRvIGhvbGQgImV4dGVybmFsIiB0eXBlcworICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlCisJZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlLlJvb3QKK3sKKworCVN0cmluZyBQRVJTSVNURU5UX1RZUEVTX0NPTExFQ1RJT04gPSAicGVyc2lzdGVudFR5cGVzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjYWNoZSdzIHBlcnNpc3RlbnQgdHlwZXMuCisJICovCisJaW50IHBlcnNpc3RlbnRUeXBlc1NpemUoKTsKKworCS8qKgorCSAqIEFkZCBhIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIEpEVCB0eXBlIHRvIHRoZQorCSAqIGNhY2hlLiBSZXR1cm4gdGhlIG5ldyB0eXBlLgorCSAqLworCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGFkZFBlcnNpc3RlbnRUeXBlKElUeXBlIGpkdFR5cGUpOworCisJLyoqCisJICogUmVtb3ZlIGFsbCB0aGUgcGVyc2lzdGVudCB0eXBlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBKQVIgZmlsZS4KKwkgKiBSZXR1cm4gd2hldGhlciBhbnkgcGVyc2lzdGVudCB0eXBlcyB3ZXJlIHJlbW92ZWQuCisJICovCisJYm9vbGVhbiByZW1vdmVQZXJzaXN0ZW50VHlwZXMoSUZpbGUgamFyRmlsZSk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmluZGV4IGYxNWE1NGYuLjE1MTA1YzYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMyw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgotICogCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW4KICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIxLDMzICsyMiwzMyBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGV4dGVuZHMgQmFzZUNvbHVtbkFubm90YXRpb24KK3B1YmxpYyBpbnRlcmZhY2UgSm9pbkNvbHVtbkFubm90YXRpb24KKwlleHRlbmRzIEJhc2VDb2x1bW5Bbm5vdGF0aW9uCiB7CiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5KT0lOX0NPTFVNTjsKIAogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSByZWZlcmVuY2VkQ29sdW1uTmFtZSBlbGVtZW50IG9mIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSByZWZlcmVuY2VkQ29sdW1uTmFtZSB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3JlZmVyZW5jZWRDb2x1bW5OYW1lJyBlbGVtZW50IG9mIHRoZSBKb2luQ29sdW1uIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KIAkgKi8KIAlTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkKKwkJU3RyaW5nIFJFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAicmVmZXJlbmNlZENvbHVtbk5hbWUiOyAvLyROT04tTkxTLTEkCisKIAkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgcmVmZXJlbmNlZENvbHVtbk5hbWUgZWxlbWVudCBvZiB0aGUgamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgcmVmZXJlbmNlZENvbHVtbk5hbWUgdmFsdWVQYWl0IGZyb20gdGhlIEFubm90YXRpb24KKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3JlZmVyZW5jZWRDb2x1bW5OYW1lJyBlbGVtZW50IG9mIHRoZSBKb2luQ29sdW1uIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgogCSAqLwogCXZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJU3RyaW5nIFJFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAicmVmZXJlbmNlZENvbHVtbk5hbWVQcm9wZXJ0eSI7Ci0JCisKIAkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgcmVmZXJlbmNlZENvbHVtbk5hbWUgZWxlbWVudC4gSWYgdGhlIAotCSAqIHJlZmVyZW5jZWRDb2x1bW5OYW1lIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSAKLQkgKiBmb3IgdGhlIEpvaW5Db2x1bW4gYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3JlZmVyZW5jZWRDb2x1bW5OYW1lJyBlbGVtZW50LiBJZiBlbGVtZW50CisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEpvaW5Db2x1bW4gYW5ub3RhdGlvbi4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogCiAJLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3N0aXRpb24gdG91Y2hlcyB0aGUgIHJlZmVyZW5jZWRDb2x1bW5OYW1lIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSAgcmVmZXJlbmNlZENvbHVtbk5hbWUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICdyZWZlcmVuY2VkQ29sdW1uTmFtZScgZWxlbWVudC4KKwkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCiAJICovCiAJYm9vbGVhbiByZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uc0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5zQW5ub3RhdGlvbi5qYXZhCmluZGV4IDhiZTZiY2UuLjcyMWM5MmYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5zQW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5zQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDcgKzEwLDggQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKIAogLyoqCi0gKiAKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbnMKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTE4LDEwICsxOSwxMCBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEpvaW5Db2x1bW5zQW5ub3RhdGlvbiBleHRlbmRzIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVKb2luQ29sdW1uPgorcHVibGljIGludGVyZmFjZSBKb2luQ29sdW1uc0Fubm90YXRpb24KKwlleHRlbmRzIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbj4KIHsKIAlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLkpPSU5fQ09MVU1OUzsKLQkKLQlTdHJpbmcgSk9JTl9DT0xVTU5TX0xJU1QgPSAiam9pbkNvbHVtbnNMaXN0IjsKLQkKKworCVN0cmluZyBKT0lOX0NPTFVNTlNfTElTVCA9ICJqb2luQ29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pvaW5UYWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0pvaW5UYWJsZUFubm90YXRpb24uamF2YQppbmRleCAzOGQ4ZGYzLi5lN2QzZGRlIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVBbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSm9pblRhYmxlQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEyLDcgKzEyLDggQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogCiAvKioKLSAqIAorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luVGFibGUKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIwLDM4ICsyMSw5NiBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEpvaW5UYWJsZUFubm90YXRpb24gZXh0ZW5kcyBUYWJsZUFubm90YXRpb24KK3B1YmxpYyBpbnRlcmZhY2UgSm9pblRhYmxlQW5ub3RhdGlvbgorCWV4dGVuZHMgQmFzZVRhYmxlQW5ub3RhdGlvbgogewogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuSk9JTl9UQUJMRTsKIAorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnam9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIEpvaW5UYWJsZSBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBhbiBlbXB0eSBpdGVyYXRvciBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLwogCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMoKTsKLQkKLQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KTsKLQkKLQlpbnQgaW5kZXhPZkpvaW5Db2x1bW4oSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbik7Ci0JCisJCVN0cmluZyBKT0lOX0NPTFVNTlNfTElTVCA9ICJqb2luQ29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnam9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIEpvaW5UYWJsZSBhbm5vdGF0aW9uLgorCSAqLwogCWludCBqb2luQ29sdW1uc1NpemUoKTsKIAorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnam9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIEpvaW5UYWJsZSBhbm5vdGF0aW9uLgorCSAqLworCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5BdChpbnQgaW5kZXgpOworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdqb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgSm9pblRhYmxlIGFubm90YXRpb24uCisJICovCisJaW50IGluZGV4T2ZKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pOworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdqb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgSm9pblRhYmxlIGFubm90YXRpb24uCisJICovCiAJSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCXZvaWQgcmVtb3ZlSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdqb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgSm9pblRhYmxlIGFubm90YXRpb24uCisJICovCiAJdm9pZCBtb3ZlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTlNfTElTVCA9ICJqb2luQ29sdW1uc0xpc3QiOwotCQorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdqb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgSm9pblRhYmxlIGFubm90YXRpb24uCisJICovCisJdm9pZCByZW1vdmVKb2luQ29sdW1uKGludCBpbmRleCk7CisKKwkvKioKKwkgKiBTaWxlbnRseSBhZGQgYW4gaW5pdGlhbCBqb2luIGNvbHVtbiB0byB0aGUgam9pbiB0YWJsZSAoaS5lLiB3aXRob3V0CisJICogY2hhbmdlIG5vdGlmaWNhdGlvbikuCisJICovCisJSm9pbkNvbHVtbkFubm90YXRpb24gaW5pdGlhbGl6ZUpvaW5Db2x1bW5zKCk7CisKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaW52ZXJzZUpvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBKb2luVGFibGUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmF0b3IgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KIAlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucygpOwotCQotCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGludmVyc2VKb2luQ29sdW1uQXQoaW50IGluZGV4KTsKLQkKLQlpbnQgaW5kZXhPZkludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4pOwotCQorCQlTdHJpbmcgSU5WRVJTRV9KT0lOX0NPTFVNTlNfTElTVCA9ICJpbnZlcnNlSm9pbkNvbHVtbnMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ludmVyc2VKb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgSm9pblRhYmxlIGFubm90YXRpb24uCisJICovCiAJaW50IGludmVyc2VKb2luQ29sdW1uc1NpemUoKTsKIAorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaW52ZXJzZUpvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBKb2luVGFibGUgYW5ub3RhdGlvbi4KKwkgKi8KKwlKb2luQ29sdW1uQW5ub3RhdGlvbiBpbnZlcnNlSm9pbkNvbHVtbkF0KGludCBpbmRleCk7CisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ludmVyc2VKb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgSm9pblRhYmxlIGFubm90YXRpb24uCisJICovCisJaW50IGluZGV4T2ZJbnZlcnNlSm9pbkNvbHVtbihKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uKTsKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaW52ZXJzZUpvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBKb2luVGFibGUgYW5ub3RhdGlvbi4KKwkgKi8KIAlKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCXZvaWQgcmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQkKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaW52ZXJzZUpvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBKb2luVGFibGUgYW5ub3RhdGlvbi4KKwkgKi8KIAl2b2lkIG1vdmVJbnZlcnNlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCVN0cmluZyBJTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUID0gImludmVyc2VKb2luQ29sdW1uc0xpc3QiOworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdpbnZlcnNlSm9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIEpvaW5UYWJsZSBhbm5vdGF0aW9uLgorCSAqLworCXZvaWQgcmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KTsKKworCS8qKgorCSAqIFNpbGVudGx5IGFkZCBhbiBpbml0aWFsIGludmVyc2Ugam9pbiBjb2x1bW4gdG8gdGhlIGpvaW4gdGFibGUgKGkuZS4gd2l0aG91dAorCSAqIGNoYW5nZSBub3RpZmljYXRpb24pLgorCSAqLworCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGluaXRpYWxpemVJbnZlcnNlSm9pbkNvbHVtbnMoKTsKIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvSnBhQ29tcGlsYXRpb25Vbml0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KcGFDb21waWxhdGlvblVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlODhmNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9KcGFDb21waWxhdGlvblVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFDb21waWxhdGlvblVuaXQgZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlIHsKLQotCUlDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0KLQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpOwotCQlTdHJpbmcgUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZID0gInBlcnNpc3RlbnRUeXBlIjsKLQotCS8vIFRPRE8gcmVuYW1lIGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFN0cmluZykKLQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShTdHJpbmcgdHlwZU5hbWUpOwotCi0JSnBhQW5ub3RhdGlvblByb3ZpZGVyIGdldEFubm90YXRpb25Qcm92aWRlcigpOwotCi0JQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcigpOwotCQotCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCk7Ci0KLQl2b2lkIHJlc291cmNlQ2hhbmdlZCgpOwotCQotCS8qKgotCSAqIFJlc29sdmUgdHlwZSBpbmZvcm1hdGlvbiB0aGF0IGNvdWxkIGJlIGRlcGVuZGVudCBvbiBvdGhlciBmaWxlcyBiZWluZyBhZGRlZC9yZW1vdmVkCi0JICovCi0Jdm9pZCByZXNvbHZlVHlwZXMoKTsKLQotCXZvaWQgdXBkYXRlRnJvbUphdmEoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTG9iQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTG9iQW5ub3RhdGlvbi5qYXZhCmluZGV4IDljYWVkZDUuLjhmNzk5YjYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL0xvYkFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Mb2JBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCiAvKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5Mb2IgYW5ub3RhdGlvbgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Mb2IKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTE4LDggKzE5LDggQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBMb2JBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQorcHVibGljIGludGVyZmFjZSBMb2JBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCiB7CiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5MT0I7Ci0JCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9NYW55VG9NYW55QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTWFueVRvTWFueUFubm90YXRpb24uamF2YQppbmRleCA2ZTViODYyLi4xMDUyMGQyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9NYW55VG9NYW55QW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwxMSArOSw5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQogLyoqCi0gKiAKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuTWFueVRvTWFueQogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjEsMzMgKzE5LDggQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBNYW55VG9NYW55QW5ub3RhdGlvbiBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCitwdWJsaWMgaW50ZXJmYWNlIE1hbnlUb01hbnlBbm5vdGF0aW9uIAorCWV4dGVuZHMgT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCiB7CiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5NQU5ZX1RPX01BTlk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbWFwcGVkQnkgZWxlbWVudCBvZiB0aGUgTWFueVRvTWFueSBhbm5vdGF0aW9uLiAKLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG1hcHBlZEJ5IGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkQnkoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbWFwcGVkQnkgZWxlbWVudCBvZiB0aGUgTWFueVRvTWFueSBhbm5vdGF0aW9uLiAKLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIG1hcHBlZEJ5IGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbWFwcGVkQnkpOwotCQlTdHJpbmcgTUFQUEVEX0JZX1BST1BFUlRZID0gIm1hcHBlZEJ5UHJvcGVydHkiOwotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbWFwcGVkQnkgZWxlbWVudC4gIElmIHRoZSBtYXBwZWRCeSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBNYW55VG9NYW55IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zdGl0aW9uIHRvdWNoZXMgdGhlIG1hcHBlZEJ5IGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBtYXBwZWRCeSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gbWFwcGVkQnlUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTWFueVRvT25lQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTWFueVRvT25lQW5ub3RhdGlvbi5qYXZhCmluZGV4IDRmMGQ2ODkuLjBhYzA5ZTYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL01hbnlUb09uZUFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9NYW55VG9PbmVBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTMsNyArMTMsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogCiAvKioKLSAqIAorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmUKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIxLDcgKzIyLDggQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBNYW55VG9PbmVBbm5vdGF0aW9uIGV4dGVuZHMgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KK3B1YmxpYyBpbnRlcmZhY2UgTWFueVRvT25lQW5ub3RhdGlvbgorCWV4dGVuZHMgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KIHsKIAlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLk1BTllfVE9fT05FOwogCQpAQCAtMzYsNyArMzgsNyBAQAogCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgb3B0aW9uYWwgZWxlbWVudC4KIAkgKi8KIAl2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpOwotCQlTdHJpbmcgT1BUSU9OQUxfUFJPUEVSVFkgPSAib3B0aW9uYWxQcm9wZXJ0eSI7CisJCVN0cmluZyBPUFRJT05BTF9QUk9QRVJUWSA9ICJvcHRpb25hbCI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgogCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBvcHRpb25hbCBlbGVtZW50LiAgSWYgdGhlIG9wdGlvbmFsIGVsZW1lbnQgCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9NYXBLZXlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9NYXBLZXlBbm5vdGF0aW9uLmphdmEKaW5kZXggMDQwMmQzNy4uZWQ4ZTU4MSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTWFwS2V5QW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL01hcEtleUFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMyw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleSBhbm5vdGF0aW9uCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleQogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjEsMjMgKzIyLDM0IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFwS2V5QW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgTWFwS2V5QW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgogewogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuTUFQX0tFWTsKIAotCVN0cmluZyBnZXROYW1lKCk7CQotCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0JCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWVQcm9wZXJ0eSI7Ci0JCQogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBuYW1lIGVsZW1lbnQuICBJZiB0aGUgbmFtZSBlbGVtZW50IAorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgTWFwS2V5IGFubm90YXRpb24uCisJICogUmV0dXJucyBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJU3RyaW5nIGdldE5hbWUoKTsKKwkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgTWFwS2V5IGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ25hbWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAogCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBNYXBLZXkgYW5ub3RhdGlvbi4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKIAkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc3RpdGlvbiB0b3VjaGVzIHRoZSBuYW1lIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBuYW1lIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnbmFtZScgZWxlbWVudC4KKwkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCiAJICovCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCWJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uamF2YQppbmRleCAyZDFhY2FmLi4xOWIzZWNjIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL01hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCiAvKioKLSAqIAorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBwZWRTdXBlcmNsYXNzCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0xOCw4ICsxOSw4IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCitwdWJsaWMgaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCiB7CiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5NQVBQRURfU1VQRVJDTEFTUzsKLQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWRDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OYW1lZENvbHVtbkFubm90YXRpb24uamF2YQppbmRleCBhZTlkNTZjLi45NzhiYTFkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OYW1lZENvbHVtbkFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OYW1lZENvbHVtbkFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMywxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogCiAvKioKLSAqIAorICogQ29tbW9uIHByb3RvY29sIGFtb25nCisgKiAgICAgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uCisgKiAgICAgamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbgorICogICAgIGphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JDb2x1bW4KKyAqICAgICBqYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbi4KICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIxLDUwICsyNSw1NyBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkQ29sdW1uQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgTmFtZWRDb2x1bW5Bbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCiB7CiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbmFtZSB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYW5ub3RhdGlvbiBleGlzdHMgaW4gSmF2YSwgZmFsc2UgaWYgaXQgZG9lcyBub3QuCiAJICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbmFtZSBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBuYW1lIHZhbHVlUGFpciBmcm9tIHRoZSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZVByb3BlcnR5IjsKLQkJCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGNvbHVtbkRlZmluaXRpb24gZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgY29sdW1uRGVmaW5pdGlvbiB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KLQkgKi8KLQlTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBjb2x1bW5EZWZpbml0aW9uIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGNvbHVtbkRlZmluaXRpb24gdmFsdWVQYWlyIGZyb20gdGhlIGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIGNvbHVtbkRlZmluaXRpb24pOwotCQlTdHJpbmcgQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFkgPSAiY29sdW1uRGVmaW5pdGlvblByb3BldHkiOworCWJvb2xlYW4gaXNTcGVjaWZpZWQoKTsKIAogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBuYW1lIGVsZW1lbnQuIElmIHRoZSBuYW1lIGVsZW1lbnQKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCVN0cmluZyBnZXROYW1lKCk7CisJCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lJyBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7CisJCQorCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbmFtZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKIAkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgogCSAqLwogCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIAogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBjb2x1bW5EZWZpbml0aW9uIGVsZW1lbnQuIElmIHRoZSBjb2x1bW5EZWZpbml0aW9uIAorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ25hbWUnIGVsZW1lbnQuCisJICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgorCSAqLworCWJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbHVtbkRlZmluaXRpb24nIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCVN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uKCk7CisJCVN0cmluZyBDT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSA9ICJjb2x1bW5EZWZpbml0aW9uIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29sdW1uRGVmaW5pdGlvbicgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIGNvbHVtbkRlZmluaXRpb24pOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdjb2x1bW5EZWZpbml0aW9uJyBlbGVtZW50LiBJZiB0aGUKIAkgKiBlbGVtZW50IGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldENvbHVtbkRlZmluaXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3N0aXRpb24gdG91Y2hlcyB0aGUgbmFtZSBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgbmFtZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLmphdmEKaW5kZXggMzI5MTZiYS4uNzM0ZjA5YyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3ICsxMCw4IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7CiAKIC8qKgotICogCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkTmF0aXZlUXVlcmllcwogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMTgsOSArMTksMTAgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uIGV4dGVuZHMgQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnk+CitwdWJsaWMgaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24KKwlleHRlbmRzIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbj4KIHsKIAlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTOwogCi0JU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QgPSAibmFtZWROYXRpdmVRdWVyaWVzTGlzdCI7CisJU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QgPSAibmFtZWROYXRpdmVRdWVyaWVzIjsgLy8kTk9OLU5MUy0xJAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLmphdmEKaW5kZXggMjk1YmQ5NC4uMjZlNDQ5YyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE0LDcgKzE0LDggQEAKIAogCiAvKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZE5hdGl2ZVF1ZXJ5IGFubm90YXRpb24KKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuTmFtZWROYXRpdmVRdWVyeQogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjIsNDggKzIzLDQ5IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gZXh0ZW5kcyBRdWVyeUFubm90YXRpb24KK3B1YmxpYyBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24KKwlleHRlbmRzIEJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbgogewogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuTkFNRURfTkFUSVZFX1FVRVJZOwogCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHJlc3VsdENsYXNzIGVsZW1lbnQgb2YgdGhlIE5hbWVkTmF0aXZlUXVlcnkgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHJlc3VsdENsYXNzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3Jlc3VsdENsYXNzJyBlbGVtZW50IG9mIHRoZSBOYW1lZE5hdGl2ZVF1ZXJ5IGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KIAkgKi8KIAlTdHJpbmcgZ2V0UmVzdWx0Q2xhc3MoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgcmVzdWx0Q2xhc3MgZWxlbWVudCBvZiB0aGUgTmFtZWROYXRpdmVRdWVyeSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgcmVzdWx0Q2xhc3MgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFJlc3VsdENsYXNzKFN0cmluZyByZXN1bHRDbGFzcyk7Ci0JCVN0cmluZyBSRVNVTFRfQ0xBU1NfUFJPUEVSVFkgPSAicmVzdWx0Q2xhc3NQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHJlc3VsdFNldE1hcHBpbmcgZWxlbWVudCBvZiB0aGUgTmFtZWROYXRpdmVRdWVyeSBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgcmVzdWx0U2V0TWFwcGluZyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCi0JICovCi0JU3RyaW5nIGdldFJlc3VsdFNldE1hcHBpbmcoKTsKKwkJU3RyaW5nIFJFU1VMVF9DTEFTU19QUk9QRVJUWSA9ICJyZXN1bHRDbGFzcyI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSByZXN1bHRTZXRNYXBwaW5nIGVsZW1lbnQgb2YgdGhlIE5hbWVkTmF0aXZlUXVlcnkgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIHJlc3VsdFNldE1hcHBpbmcgZWxlbWVudC4KKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3Jlc3VsdENsYXNzJyBlbGVtZW50IG9mIHRoZSBOYW1lZE5hdGl2ZVF1ZXJ5IGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgogCSAqLwotCXZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcgcmVzdWx0U2V0TWFwcGluZyk7Ci0JCVN0cmluZyBSRVNVTFRfU0VUX01BUFBJTkdfUFJPUEVSVFkgPSAicmVzdWx0U2V0TWFwcGluZ1Byb3BlcnR5IjsKLQkKLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzcygpOwotCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfUkVTVUxUX0NMQVNTX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NQcm9wZXJ0eSI7Ci0JCisJdm9pZCBzZXRSZXN1bHRDbGFzcyhTdHJpbmcgcmVzdWx0Q2xhc3MpOworCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHJlc3VsdENsYXNzIGVsZW1lbnQuIElmIHJlc3VsdENsYXNzIGVsZW1lbnQKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3Jlc3VsdENsYXNzJyBlbGVtZW50LiBJZiBlbGVtZW50CiAJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE5hbWVkTmF0aXZlUXVlcnkgYW5ub3RhdGlvbi4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0UmVzdWx0Q2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogCi0JCisJU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NOYW1lKCk7CisJCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfUkVTVUxUX0NMQVNTX05BTUVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCisKKwogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSByZXN1bHRTZXRNYXBwaW5nIGVsZW1lbnQuIElmIHJlc3VsdFNldE1hcHBpbmcgZWxlbWVudAorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncmVzdWx0U2V0TWFwcGluZycgZWxlbWVudCBvZiB0aGUgTmFtZWROYXRpdmVRdWVyeSBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJU3RyaW5nIGdldFJlc3VsdFNldE1hcHBpbmcoKTsKKwkJU3RyaW5nIFJFU1VMVF9TRVRfTUFQUElOR19QUk9QRVJUWSA9ICJyZXN1bHRTZXRNYXBwaW5nIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdyZXN1bHRTZXRNYXBwaW5nJyBlbGVtZW50IG9mIHRoZSBOYW1lZE5hdGl2ZVF1ZXJ5IGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcgcmVzdWx0U2V0TWFwcGluZyk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3Jlc3VsdFNldE1hcHBpbmcnIGVsZW1lbnQuIElmIGVsZW1lbnQKIAkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgTmFtZWROYXRpdmVRdWVyeSBhbm5vdGF0aW9uLgogCSAqLwogCVRleHRSYW5nZSBnZXRSZXN1bHRTZXRNYXBwaW5nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcmllc0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcmllc0Fubm90YXRpb24uamF2YQppbmRleCBjM2RkY2IyLi4zZTI2ZjgxIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDcgKzEwLDggQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKIAogLyoqCi0gKiAKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuTmFtZWRRdWVyaWVzCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0xOCw5ICsxOSwxMCBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkUXVlcmllc0Fubm90YXRpb24gZXh0ZW5kcyBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlTmFtZWRRdWVyeT4KK3B1YmxpYyBpbnRlcmZhY2UgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbgorCWV4dGVuZHMgQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZU5hbWVkUXVlcnlBbm5vdGF0aW9uPgogewogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuTkFNRURfUVVFUklFUzsKIAotCVN0cmluZyBOQU1FRF9RVUVSSUVTX0xJU1QgPSAibmFtZWRRdWVyaWVzTGlzdCI7CisJU3RyaW5nIE5BTUVEX1FVRVJJRVNfTElTVCA9ICJuYW1lZFF1ZXJpZXMiOyAvLyROT04tTkxTLTEkCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJ5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeUFubm90YXRpb24uamF2YQppbmRleCA2ZGE3YWFiLi40YjQ1OGU5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJ5QW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcnlBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCiAvKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJ5IGFubm90YXRpb24KKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuTmFtZWRRdWVyeQogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMTgsOCArMTksOCBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkUXVlcnlBbm5vdGF0aW9uIGV4dGVuZHMgUXVlcnlBbm5vdGF0aW9uCitwdWJsaWMgaW50ZXJmYWNlIE5hbWVkUXVlcnlBbm5vdGF0aW9uCisJZXh0ZW5kcyBCYXNlTmFtZWRRdWVyeUFubm90YXRpb24KIHsKIAlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLk5BTUVEX1FVRVJZOwotCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQW5ub3RhdGlvbi5qYXZhCmluZGV4IDQ5NTAyZGEuLmRiMDY3YjEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDcgKzEwLDggQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKIAogLyoqCi0gKiAKKyAqIEludGVyZmFjZSBmb3IgZGVhbGluZyB3aXRoIGFubm90YXRpb25zIHRoYXQgY2FuIGJlICJuZXN0ZWQiIHdpdGhpbiBvdGhlcgorICogYW5ub3RhdGlvbnMsIHR5cGljYWxseSB3aXRoaW4gYXJyYXlzLgogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMTgsMTYgKzE5LDE4IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmVzdGFibGVBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbgorcHVibGljIGludGVyZmFjZSBOZXN0YWJsZUFubm90YXRpb24KKwlleHRlbmRzIEFubm90YXRpb24KIHsKLQkvL2N1cnJlbnRseSB1c2luZyB0aGlzIHdoZW4gdGhlIE5lc3RhYmxlQW5ub3RhdGlvbiBpcyBtb3ZlZCBmcm9tCi0JLy9zdGFuZGFsb25lIHRvIG5lc3RlZCBvciBmcm9tIG5lc3RlZCB0byBzdGFuZGFsb25lLgotCS8vbm90IHRoZSBncmVhdGVzdCBzaW5jZSB5b3UgaGF2ZSB0byBtYWtlIHN1cmUgdG8gY2FsbCBhbGwgc2V0dGVyIG1ldGhvZHMKKwkvLyBjdXJyZW50bHkgdXNpbmcgdGhpcyB3aGVuIHRoZSBOZXN0YWJsZUFubm90YXRpb24gaXMgbW92ZWQgZnJvbQorCS8vIHN0YW5kLWFsb25lIHRvIG5lc3RlZCBvciBmcm9tIG5lc3RlZCB0byBzdGFuZC1hbG9uZTsKKwkvLyBub3QgdGhlIGdyZWF0ZXN0LCBzaW5jZSB5b3UgaGF2ZSB0byBtYWtlIHN1cmUgdG8gY2FsbCBhbGwgc2V0dGVyIG1ldGhvZHMKIAl2b2lkIGluaXRpYWxpemVGcm9tKE5lc3RhYmxlQW5ub3RhdGlvbiBvbGRBbm5vdGF0aW9uKTsKLQkKKwogCS8qKgotCSAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBOZXN0YWJsZUFubm90YXRpb24gaXMgYWN0dWFsbHkgbmVzdGVkCi0JICogQHBhcmFtIG5ld0luZGV4CisJICogTW92ZSB0aGUgYW5ub3RhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGluZGV4IHdpdGhpbiBpdHMgY29udGFpbmVyIGFubm90YXRpb24uCisJICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgYW5ub3RhdGlvbiBpcyBhY3R1YWxseSBuZXN0ZWQuCiAJICovCi0Jdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpOworCXZvaWQgbW92ZUFubm90YXRpb24oaW50IGluZGV4KTsKKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjNTExNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlCi0JZXh0ZW5kcyBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTM3MGU3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkFzc29jaWF0aW9uT3ZlcnJpZGUKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTmVzdGFibGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbgorCWV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24sIE5lc3RhYmxlQW5ub3RhdGlvbgoreworCS8vIGNvbWJpbmUgdHdvIGludGVyZmFjZXMKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2YzIwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGUKLQlleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NjZkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkF0dHJpYnV0ZU92ZXJyaWRlCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5lc3RhYmxlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uCisJZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24sIE5lc3RhYmxlQW5ub3RhdGlvbgoreworCS8vIGNvbWJpbmUgdHdvIGludGVyZmFjZXMKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVDb2x1bW5Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiYjBmMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQ29sdW1uQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBOZXN0YWJsZUNvbHVtbkFubm90YXRpb24KKwlleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbiwgQ29sdW1uQW5ub3RhdGlvbgoreworCS8vIGNvbWJpbmUgdHdvIGludGVyZmFjZXMKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZGQ0YzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5lc3RhYmxlSm9pbkNvbHVtbiBleHRlbmRzIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLCBOZXN0YWJsZUFubm90YXRpb24KLXsKLQkvLyBub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMGFjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBOZXN0YWJsZUpvaW5Db2x1bW5Bbm5vdGF0aW9uCisJZXh0ZW5kcyBKb2luQ29sdW1uQW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCit7CisJLy8gY29tYmluZSB0d28gaW50ZXJmYWNlcworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVKb2luVGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUpvaW5UYWJsZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjVhZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVKb2luVGFibGVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOworCisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luVGFibGUKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTmVzdGFibGVKb2luVGFibGVBbm5vdGF0aW9uCisJZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24sIEpvaW5UYWJsZUFubm90YXRpb24KK3sKKwkvLyBjb21iaW5lIHR3byBpbnRlcmZhY2VzCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlTmFtZWROYXRpdmVRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2Q4ZDA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlTmFtZWROYXRpdmVRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnkKLQlleHRlbmRzIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLCBOZXN0YWJsZUFubm90YXRpb24KLXsKLQkvLyBub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NGNjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuTmFtZWROYXRpdmVRdWVyeQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBOZXN0YWJsZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uCisJZXh0ZW5kcyBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCit7CisJLy8gY29tYmluZSB0d28gaW50ZXJmYWNlcworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVOYW1lZFF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZU5hbWVkUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1NGZlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZU5hbWVkUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmVzdGFibGVOYW1lZFF1ZXJ5Ci0JZXh0ZW5kcyBOYW1lZFF1ZXJ5QW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlTmFtZWRRdWVyeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlTmFtZWRRdWVyeUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTAzZDRiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcnkKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTmVzdGFibGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbgorCWV4dGVuZHMgTmFtZWRRdWVyeUFubm90YXRpb24sIE5lc3RhYmxlQW5ub3RhdGlvbgoreworCS8vIGNvbWJpbmVzIHR3byBhbm5vdGF0aW9uCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZGJlOTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uCi0JZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24sIE5lc3RhYmxlQW5ub3RhdGlvbgotewotCS8vIG5vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVhMjg0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbgorCWV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLCBOZXN0YWJsZUFubm90YXRpb24KK3sKKwkvLyBjb21iaW5lIHR3byBpbnRlcmZhY2VzCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVF1ZXJ5SGludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVRdWVyeUhpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmMjczNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVF1ZXJ5SGludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBOZXN0YWJsZVF1ZXJ5SGludAotCWV4dGVuZHMgUXVlcnlIaW50QW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVRdWVyeUhpbnRBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3M2JjNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlUXVlcnlIaW50QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLlF1ZXJ5SGludAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBOZXN0YWJsZVF1ZXJ5SGludEFubm90YXRpb24KKwlleHRlbmRzIFF1ZXJ5SGludEFubm90YXRpb24sIE5lc3RhYmxlQW5ub3RhdGlvbgoreworCS8vIGNvbWJpbmUgdHdvIGludGVyZmFjZXMKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlU2Vjb25kYXJ5VGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlU2Vjb25kYXJ5VGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzNjUzYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVNlY29uZGFyeVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5lc3RhYmxlU2Vjb25kYXJ5VGFibGUKLQlleHRlbmRzIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjA1NjUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLlNlY29uZGFyeVRhYmxlCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5lc3RhYmxlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uCisJZXh0ZW5kcyBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24sIE5lc3RhYmxlQW5ub3RhdGlvbgoreworCS8vIGNvbWJpbmUgdHdvIGludGVyZmFjZXMKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlVW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVVbmlxdWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZWNjYmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVVbmlxdWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludAotCWV4dGVuZHMgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24sIE5lc3RhYmxlQW5ub3RhdGlvbgotewotCS8vIG5vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzNWNiMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5VbmlxdWVDb25zdHJhaW50CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE5lc3RhYmxlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24KKwlleHRlbmRzIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLCBOZXN0YWJsZUFubm90YXRpb24KK3sKKwkvLyBjb21iaW5lIHR3byBpbnRlcmZhY2VzCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9PbmVUb01hbnlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9PbmVUb01hbnlBbm5vdGF0aW9uLmphdmEKaW5kZXggM2NkZWEzYi4uMGQ2ZTlkYyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvT25lVG9NYW55QW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL09uZVRvTWFueUFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDExICs5LDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCiAvKioKLSAqIAorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb01hbnkKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIxLDMyICsxOSw4IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT25lVG9NYW55QW5ub3RhdGlvbiBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCitwdWJsaWMgaW50ZXJmYWNlIE9uZVRvTWFueUFubm90YXRpb24gCisJZXh0ZW5kcyBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KIHsKIAlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLk9ORV9UT19NQU5ZOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG1hcHBlZEJ5IGVsZW1lbnQgb2YgdGhlIE9uZVRvTWFueSBhbm5vdGF0aW9uLiAKLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG1hcHBlZEJ5IGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkQnkoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbWFwcGVkQnkgZWxlbWVudCBvZiB0aGUgT25lVG9NYW55IGFubm90YXRpb24uIAotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgbWFwcGVkQnkgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSk7Ci0JCVN0cmluZyBNQVBQRURfQllfUFJPUEVSVFkgPSAibWFwcGVkQnlQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG1hcHBlZEJ5IGVsZW1lbnQuICBJZiB0aGUgbWFwcGVkQnkgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgT25lVG9NYW55IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zdGl0aW9uIHRvdWNoZXMgdGhlIG1hcHBlZEJ5IGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBtYXBwZWRCeSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gbWFwcGVkQnlUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL09uZVRvT25lQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKaW5kZXggYWVmMzMyMC4uMmUyNjg3YiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTMsNyArMTMsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogCiAvKioKLSAqIAorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZQogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjEsNTIgKzIyLDI4IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgT25lVG9PbmVBbm5vdGF0aW9uIGV4dGVuZHMgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KK3B1YmxpYyBpbnRlcmZhY2UgT25lVG9PbmVBbm5vdGF0aW9uIAorCWV4dGVuZHMgT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCiB7CiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5PTkVfVE9fT05FOwogCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG9wdGlvbmFsIGVsZW1lbnQgb2YgdGhlIE9uZVRvT25lIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBvcHRpb25hbCBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdvcHRpb25hbCcgZWxlbWVudCBvZiB0aGUgT25lVG9PbmUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgogCSAqLwogCUJvb2xlYW4gZ2V0T3B0aW9uYWwoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgb3B0aW9uYWwgZWxlbWVudCBvZiB0aGUgT25lVG9PbmUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIG9wdGlvbmFsIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKTsKLQkJU3RyaW5nIE9QVElPTkFMX1BST1BFUlRZID0gIm9wdGlvbmFsUHJvcGVydHkiOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBtYXBwZWRCeSBlbGVtZW50IG9mIHRoZSBPbmVUb09uZSBhbm5vdGF0aW9uLiAKLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG1hcHBlZEJ5IGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkQnkoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbWFwcGVkQnkgZWxlbWVudCBvZiB0aGUgT25lVG9PbmUgYW5ub3RhdGlvbi4gCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBtYXBwZWRCeSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG1hcHBlZEJ5KTsKLQkJU3RyaW5nIE1BUFBFRF9CWV9QUk9QRVJUWSA9ICJtYXBwZWRCeVByb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbWFwcGVkQnkgZWxlbWVudC4gIElmIHRoZSBtYXBwZWRCeSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBPbmVUb09uZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisJCVN0cmluZyBPUFRJT05BTF9QUk9QRVJUWSA9ICJvcHRpb25hbCI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBvcHRpb25hbCBlbGVtZW50LiAgSWYgdGhlIG9wdGlvbmFsIGVsZW1lbnQgCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdvcHRpb25hbCcgZWxlbWVudCBvZiB0aGUgT25lVG9PbmUgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnb3B0aW9uYWwnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAogCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBPbmVUb09uZSBhbm5vdGF0aW9uLgogCSAqLwogCVRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc3RpdGlvbiB0b3VjaGVzIHRoZSBtYXBwZWRCeSBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgbWFwcGVkQnkgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL09yZGVyQnlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9PcmRlckJ5QW5ub3RhdGlvbi5qYXZhCmluZGV4IGQ3MmFkNmUuLjQ4MmJkNzEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL09yZGVyQnlBbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvT3JkZXJCeUFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMyw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLk9yZGVyQnkgYW5ub3RhdGlvbgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5PcmRlckJ5CiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMSwyNSArMjIsMjYgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBPcmRlckJ5QW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgT3JkZXJCeUFubm90YXRpb24KKwlleHRlbmRzIEFubm90YXRpb24KIHsKIAlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLk9SREVSX0JZOwogCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIGVsZW1lbnQgb2YgdGhlIGphdmF4LnBlcnNpc3RlbmNlLk9yZGVyQnkgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHZhbHVlIHZhbHVlUGFpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIE9yZGVyQnkgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbi4KIAkgKi8KIAlTdHJpbmcgZ2V0VmFsdWUoKTsKKwkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAogCQogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBlbGVtZW50IG9mIHRoZSBqYXZheC5wZXJzaXN0ZW5jZS5PcmRlckJ5IGFubm90YXRpb24uCi0JICogU2V0dGluZyB0aGUgdmFsdWUgdG8gbnVsbCB3aWxsIG5vdCByZW1vdmUgdGhlIE9yZGVyQnkgYW5ub3RhdGlvbgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIE9yZGVyQnkgYW5ub3RhdGlvbi4KKwkgKiBTZXR0aW5nIHRoZSBlbGVtZW50IHRvIG51bGwgd2lsbCBub3QgcmVtb3ZlIHRoZSBPcmRlckJ5IGFubm90YXRpb24uCiAJICovCiAJdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWVQcm9wZXJ0eSI7CiAJCQogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB2YWx1ZSBlbGVtZW50LiAgSWYgdGhlIHZhbHVlIGVsZW1lbnQgCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCiAJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE9yZGVyQnkgYW5ub3RhdGlvbi4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9PdmVycmlkZUFubm90YXRpb24uamF2YQppbmRleCBlYjk1NDgwLi4xOWUxM2QyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9PdmVycmlkZUFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9PdmVycmlkZUFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMyw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLkF0dHJpYnV0ZU92ZXJyaWRlIGFubm90YXRpb24KKyAqIENvbW1vbiBwcm90b2NvbCBmb3IKKyAqICAgICBqYXZheC5wZXJzaXN0ZW5jZS5BdHRyaWJ1dGVPdmVycmlkZQorICogICAgIGphdmF4LnBlcnNpc3RlbmNlLkFzc29jaWF0aW9uT3ZlcnJpZGUKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIxLDMxICsyMywzMiBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIE92ZXJyaWRlQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgT3ZlcnJpZGVBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCiB7CiAKIAkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbmFtZSBlbGVtZW50IG9mIHRoZSBBdHRyaWJ1dGVPdmVycmlkZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbmFtZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lJyBlbGVtZW50IG9mIHRoZSBvdmVycmlkZSBhbm5vdGF0aW9ucy4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgogCSAqLwogCVN0cmluZyBnZXROYW1lKCk7CisJCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCiAJCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgZWxlbWVudCBvZiB0aGUgQXR0cmlidXRlT3ZlcnJpZGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIG5hbWUgZWxlbWVudC4KKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlIG92ZXJyaWRlIGFubm90YXRpb25zLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KIAkgKi8KIAl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOwogCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG5hbWUgZWxlbWVudC4gSWYgbmFtZSBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEF0dHJpYnV0ZU92ZXJyaWRlIGFubm90YXRpb24uCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICduYW1lJyBlbGVtZW50LiBJZiBlbGVtZW50CisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG92ZXJyaWRlIGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogCiAJLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3N0aXRpb24gdG91Y2hlcyB0aGUgdGFibGUgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIHRhYmxlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnbmFtZScgZWxlbWVudC4KKwkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KIAkgKi8KIAlib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9Pd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjZjNGYwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIG1hcHBpbmcgYW5ub3RhdGlvbiB0aGF0IG1heSBoYXZlIHRoZSAnbWFwcGVkQnknCisgKiBlbGVtZW50OgorICogICAgIGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb01hbnkKKyAqICAgICBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb01hbnkKKyAqICAgICBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KKwlleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCit7CisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdtYXBwZWRCeScgZWxlbWVudCBvZiB0aGUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCVN0cmluZyBnZXRNYXBwZWRCeSgpOworCQlTdHJpbmcgTUFQUEVEX0JZX1BST1BFUlRZID0gIm1hcHBlZEJ5IjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbWFwcGVkQnknIGVsZW1lbnQgb2YgdGhlIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG1hcHBlZEJ5KTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ21hcHBlZEJ5JyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ21hcHBlZEJ5JyBlbGVtZW50LgorCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKaW5kZXggMDJhNzRhMS4uMjc4N2YxZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTMsNyArMTMsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogCiAvKioKLSAqIAorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbgogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjEsMjUgKzIyLDM0IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGV4dGVuZHMgTmFtZWRDb2x1bW5Bbm5vdGF0aW9uCitwdWJsaWMgaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbgorCWV4dGVuZHMgTmFtZWRDb2x1bW5Bbm5vdGF0aW9uCiB7CiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTjsKIAotCVN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQotCXZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJU3RyaW5nIFJFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAicmVmZXJlbmNlZENvbHVtbk5hbWVQcm9wZXJ0eSI7Ci0KIAkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc3RpdGlvbiB0b3VjaGVzIHRoZSByZWZlcmVuY2VkQ29sdW1uTmFtZSBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgcmVmZXJlbmNlZENvbHVtbk5hbWUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3JlZmVyZW5jZWRDb2x1bW5OYW1lJyBlbGVtZW50IG9mIHRoZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCiAJICovCi0JYm9vbGVhbiByZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCVN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOworCQlTdHJpbmcgUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSA9ICJyZWZlcmVuY2VkQ29sdW1uTmFtZSI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSByZWZlcmVuY2VkQ29sdW1uTmFtZSBlbGVtZW50LiBJZiB0aGUgcmVmZXJlbmNlZENvbHVtbk5hbWUgCi0JICogZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgUHJpbWFyeUtleUpvaW5Db2x1bW4gYW5ub3RhdGlvbi4KKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3JlZmVyZW5jZWRDb2x1bW5OYW1lJyBlbGVtZW50IG9mIHRoZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhbm5vdGF0aW9uLgorCSAqIFNldCB0aGUgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdyZWZlcmVuY2VkQ29sdW1uTmFtZScgZWxlbWVudC4KKwkgKiBJZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgUHJpbWFyeUtleUpvaW5Db2x1bW4gYW5ub3RhdGlvbi4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAncmVmZXJlbmNlZENvbHVtbk5hbWUnIGVsZW1lbnQuCisJICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgorCSAqLworCWJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjllYjM4MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW5zIGV4dGVuZHMgQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZVByaW1hcnlLZXlKb2luQ29sdW1uPgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOwotCi0JU3RyaW5nIFBLX0pPSU5fQ09MVU1OU19MSVNUID0gInBrSm9pbkNvbHVtbnNMaXN0IjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQwM2I4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLlByaW1hcnlLZXlKb2luQ29sdW1ucworICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uCisJZXh0ZW5kcyBDb250YWluZXJBbm5vdGF0aW9uPE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPgoreworCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOworCisJU3RyaW5nIFBLX0pPSU5fQ09MVU1OU19MSVNUID0gInBrSm9pbkNvbHVtbnMiOyAvLyROT04tTkxTLTEkCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9RdWVyeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1F1ZXJ5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTRkZWZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1F1ZXJ5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBRdWVyeUFubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCi17Ci0JU3RyaW5nIGdldE5hbWUoKTsJCi0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZVByb3BlcnR5IjsKLQkKLQlTdHJpbmcgZ2V0UXVlcnkoKTsJCi0Jdm9pZCBzZXRRdWVyeShTdHJpbmcgcXVlcnkpOwotCQlTdHJpbmcgUVVFUllfUFJPUEVSVFkgPSAicXVlcnlQcm9wZXJ0eSI7Ci0JCi0JTGlzdEl0ZXJhdG9yPFF1ZXJ5SGludEFubm90YXRpb24+IGhpbnRzKCk7Ci0JCi0JUXVlcnlIaW50QW5ub3RhdGlvbiBoaW50QXQoaW50IGluZGV4KTsKLQkKLQlpbnQgaW5kZXhPZkhpbnQoUXVlcnlIaW50QW5ub3RhdGlvbiBoaW50KTsKLQkKLQlpbnQgaGludHNTaXplKCk7Ci0KLQlRdWVyeUhpbnRBbm5vdGF0aW9uIGFkZEhpbnQoaW50IGluZGV4KTsKLQkKLQl2b2lkIHJlbW92ZUhpbnQoaW50IGluZGV4KTsKLQkKLQl2b2lkIG1vdmVIaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkJU3RyaW5nIEhJTlRTX0xJU1QgPSAiaGludHNMaXN0IjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBuYW1lIGVsZW1lbnQuIElmIG5hbWUgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqUXVlcnkgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgcXVlcnkgZWxlbWVudC4gSWYgcXVlcnkgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqUXVlcnkgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0UXVlcnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9RdWVyeUhpbnRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9RdWVyeUhpbnRBbm5vdGF0aW9uLmphdmEKaW5kZXggZTk0OGNmMS4uMmUyOTQ5MSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvUXVlcnlIaW50QW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1F1ZXJ5SGludEFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMyw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLlF1ZXJ5SGludCBhbm5vdGF0aW9uCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLlF1ZXJ5SGludAogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjEsNDQgKzIyLDQ2IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgUXVlcnlIaW50QW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgUXVlcnlIaW50QW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgogewogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuUVVFUllfSElOVDsKIAogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIGVsZW1lbnQgb2YgdGhlIFF1ZXJ5SGludCBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbmFtZSB2YWx1ZVBhaXIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlIFF1ZXJ5SGludCBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uCiAJICovCiAJU3RyaW5nIGdldE5hbWUoKTsKKwkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKIAkKIAkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgbmFtZSBlbGVtZW50IG9mIHRoZSBRdWVyeUhpbnQgYW5ub3RhdGlvbi4KLQkgKiBTZXR0aW5nIHRvIG51bGwgd2lsbCByZW1vdmUgdGhlIG5hbWUgdmFsdWVQYWlyCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lJyBlbGVtZW50IG9mIHRoZSBRdWVyeUhpbnQgYW5ub3RhdGlvbi4KKwkgKiBTZXR0aW5nIHRvIG51bGwgd2lsbCByZW1vdmUgdGhlIGVsZW1lbnQuCiAJICovCiAJdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZVByb3BlcnR5IjsKIAkJCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIGVsZW1lbnQgb2YgdGhlIFF1ZXJ5SGludCBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgdmFsdWUgdmFsdWVQYWlyIGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIGVsZW1lbnQgb2YgdGhlIFF1ZXJ5SGludCBhbm5vdGF0aW9uLgotCSAqIFNldHRpbmcgdG8gbnVsbCB3aWxsIHJlbW92ZSB0aGUgdmFsdWUgdmFsdWVQYWlyCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWVQcm9wZXJ0eSI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbmFtZSBlbGVtZW50LiAgSWYgdGhlIG5hbWUgZWxlbWVudCAKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ25hbWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAogCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBRdWVyeUhpbnQgYW5ub3RhdGlvbi4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKKwogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB2YWx1ZSBlbGVtZW50LiAgSWYgdGhlIHZhbHVlIGVsZW1lbnQgCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgUXVlcnlIaW50IGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24KKwkgKi8KKwlTdHJpbmcgZ2V0VmFsdWUoKTsKKwkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFF1ZXJ5SGludCBhbm5vdGF0aW9uLgorCSAqIFNldHRpbmcgdG8gbnVsbCB3aWxsIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKIAkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgUXVlcnlIaW50IGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1JlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9SZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhCmluZGV4IDU0YjNhZWUuLjQwYmVmYjggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1JlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMywxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwogCiAvKioKLSAqIAorICogQ29tbW9uIHByb3RvY29sIGFtb25nCisgKiAgICAgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lCisgKiAgICAgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvTWFueQorICogICAgIGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvTWFueQorICogICAgIGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMSw5MCArMjUsMTI1IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCitwdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCiB7CiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHRhcmdldEVudGl0eSBlbGVtZW50IG9mIHRoZSByZWxhdGlvbnNoaXAgCi0JICogYW5ub3RhdGlvbnMgKE1hbnlUb01hbnksIE9uZVRvTWFueSwgTWFueVRvT25lLCBPbmVUb09uZSkuCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSB0YXJnZXRFbnRpdHkgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgotCSAqIFJldHVybnMgdGhlIHBvcnRpb24gb2YgdGhlIHRhcmdldEVudGl0eSBwcmVjZWRpbmcgdGhlIC5jbGFzcy4KLQkgKiA8cD4KKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3RhcmdldEVudGl0eScgZWxlbWVudCBvZiB0aGUgcmVsYXRpb25zaGlwIG1hcHBpbmcKKwkgKiBhbm5vdGF0aW9ucy4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqIFJldHVybiB0aGUgcG9ydGlvbiBvZiB0aGUgdmFsdWUgcHJlY2VkaW5nICIuY2xhc3MiLgorCSAqIDxwcmU+CiAJICogICAgICYjNjQ7TWFueVRvTWFueSh0YXJnZXRFbnRpdHk9RW1wbG95ZWUuY2xhc3MpCi0JICogPC9wPgorCSAqIDwvcHJlPgogCSAqIHdpbGwgcmV0dXJuICJFbXBsb3llZSIKLQkgKiovCisJICovCiAJU3RyaW5nIGdldFRhcmdldEVudGl0eSgpOwkKKwkJU3RyaW5nIFRBUkdFVF9FTlRJVFlfUFJPUEVSVFkgPSAidGFyZ2V0RW50aXR5IjsgLy8kTk9OLU5MUy0xJAogCQogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSB0YXJnZXRFbnRpdHkgb2YgdGhlIHJlbGF0aW9uc2hpcCAKLQkgKiBhbm5vdGF0aW9ucyAoTWFueVRvTWFueSwgT25lVG9NYW55LCBNYW55VG9PbmUsIE9uZVRvT25lKS4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIHRhcmdldEVudGl0eSBlbGVtZW50LgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndGFyZ2V0RW50aXR5JyBlbGVtZW50IG9mIHRoZSByZWxhdGlvbnNoaXAgbWFwcGluZworCSAqIGFubm90YXRpb25zLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KIAkgKi8KIAl2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdGFyZ2V0RW50aXR5KTsKLQkJU3RyaW5nIFRBUkdFVF9FTlRJVFlfUFJPUEVSVFkgPSAidGFyZ2V0RW50aXR5UHJvcGVydHkiOwogCQogCS8qKgotCSAqIFJldHVybnMgdGhlIHF1YWxpZmllZCB0YXJnZXRFbnRpdHkgbmFtZSBhcyBpdCBpcyByZXNvbHZlZCBpbiB0aGUgQVNUCi0JICogPHA+Ci0JICogICAgICYjNjQ7TWFueVRvTWFueSh0YXJnZXRFbnRpdHk9RW1wbG95ZWUuY2xhc3MpCi0JICogPC9wPgotCSAqIHdpbGwgcmV0dXJuICJtb2RlbC5FbXBsb3llZSIgaWYgdGhlcmUgaXMgYW4gaW1wb3J0IGZvciBtb2RlbC5FbXBsb3llZQotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKTsKLQkJU3RyaW5nIEZVTExZX1FVQUxGSUVJRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5UHJvcGVydHkiOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBmZXRjaCBlbGVtZW50IG9mIHRoZSByZWxhdGlvbnNoaXAgCi0JICogYW5ub3RhdGlvbnMgKE1hbnlUb01hbnksIE9uZVRvTWFueSwgTWFueVRvT25lLCBPbmVUb09uZSkuCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBmZXRjaCBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCi0JICovCi0JRmV0Y2hUeXBlIGdldEZldGNoKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIGZldGNoIGVsZW1lbnQgb2YgdGhlIHJlbGF0aW9uc2hpcCAKLQkgKiBhbm5vdGF0aW9ucyAoTWFueVRvTWFueSwgT25lVG9NYW55LCBNYW55VG9PbmUsIE9uZVRvT25lKS4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGZldGNoIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpOwotCQlTdHJpbmcgRkVUQ0hfUFJPUEVSVFkgPSAiZmV0Y2hQcm9wZXJ0eSI7Ci0JCi0JYm9vbGVhbiBpc0Nhc2NhZGVBbGwoKTsJCi0Jdm9pZCBzZXRDYXNjYWRlQWxsKGJvb2xlYW4gYWxsKTsKLQkJU3RyaW5nIENBU0NBREVfQUxMX1BST1BFUlRZID0gImNhc2NhZGVBbGxQcm9wZXJ0eSI7Ci0JCi0JYm9vbGVhbiBpc0Nhc2NhZGVNZXJnZSgpOwkKLQl2b2lkIHNldENhc2NhZGVNZXJnZShib29sZWFuIG1lcmdlKTsKLQlTdHJpbmcgQ0FTQ0FERV9NRVJHRV9QUk9QRVJUWSA9ICJjYXNjYWRlTWVyZ2VQcm9wZXJ0eSI7Ci0KLQlib29sZWFuIGlzQ2FzY2FkZVBlcnNpc3QoKTsJCi0Jdm9pZCBzZXRDYXNjYWRlUGVyc2lzdChib29sZWFuIHBlcnNpc3QpOwotCQlTdHJpbmcgQ0FTQ0FERV9QRVJTSVNUX1BST1BFUlRZID0gImNhc2NhZGVQZXJzaXN0UHJvcGVydHkiOwotCi0JYm9vbGVhbiBpc0Nhc2NhZGVSZWZyZXNoKCk7CQotCXZvaWQgc2V0Q2FzY2FkZVJlZnJlc2goYm9vbGVhbiByZWZyZXNoKTsKLQkJU3RyaW5nIENBU0NBREVfUkVGUkVTSF9QUk9QRVJUWSA9ICJjYXNjYWRlUmVmcmVzaFByb3BlcnR5IjsKLQotCWJvb2xlYW4gaXNDYXNjYWRlUmVtb3ZlKCk7CQotCXZvaWQgc2V0Q2FzY2FkZVJlbW92ZShib29sZWFuIHJlbW92ZSk7Ci0JCVN0cmluZyBDQVNDQURFX1JFTU9WRV9QUk9QRVJUWSA9ICJjYXNjYWRlUmVtb3ZlUHJvcGVydHkiOwotCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHRhcmdldEVudGl0eSBlbGVtZW50LiAgSWYgdGhlIHRhcmdldEVudGl0eSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBtYXBwaW5nIGFubm90YXRpb24uCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd0YXJnZXRFbnRpdHknIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSByZWxhdGlvbnNoaXAgbWFwcGluZyBhbm5vdGF0aW9uLgogCSAqLwogCVRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGZldGNoIGVsZW1lbnQuICBJZiB0aGUgZmV0Y2ggZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbWFwcGluZyBhbm5vdGF0aW9uLgorCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIHRhcmdldCBlbnRpdHkgY2xhc3MgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUgQVNUJ3MgYmluZGluZ3MuCisJICogPHByZT4KKwkgKiAgICAgJiM2NDtNYW55VG9NYW55KHRhcmdldEVudGl0eT1FbXBsb3llZS5jbGFzcykKKwkgKiA8L3ByZT4KKwkgKiB3aWxsIHJldHVybiAibW9kZWwuRW1wbG95ZWUiIGlmIHRoZXJlIGlzIGFuIGltcG9ydCBmb3IgbW9kZWwuRW1wbG95ZWUuCisJICogQHJldHVybgorCSAqLworCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpOworCQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1RBUkdFVF9FTlRJVFlfQ0xBU1NfTkFNRV9QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKKworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdmZXRjaCcgZWxlbWVudCBvZiB0aGUgcmVsYXRpb25zaGlwIG1hcHBpbmcgYW5ub3RhdGlvbnMuCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlGZXRjaFR5cGUgZ2V0RmV0Y2goKTsKKwkJU3RyaW5nIEZFVENIX1BST1BFUlRZID0gImZldGNoIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZmV0Y2gnIGVsZW1lbnQgb2YgdGhlIHJlbGF0aW9uc2hpcCBhbm5vdGF0aW9ucy4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnZmV0Y2gnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSByZWxhdGlvbnNoaXAgbWFwcGluZyBhbm5vdGF0aW9uLgogCSAqLwogCVRleHRSYW5nZSBnZXRGZXRjaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKKwogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBjYXNjYWRlIGVsZW1lbnQuICBJZiB0aGUgY2FzY2FkZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBtYXBwaW5nIGFubm90YXRpb24uCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdjYXNjYWRlJyBlbGVtZW50IG9mIHRoZSByZWxhdGlvbnNoaXAgYW5ub3RhdGlvbnMuCisJICovCisJYm9vbGVhbiBpc0Nhc2NhZGVBbGwoKTsJCisJCVN0cmluZyBDQVNDQURFX0FMTF9QUk9QRVJUWSA9ICJjYXNjYWRlQWxsIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdjYXNjYWRlJyBlbGVtZW50IG9mIHRoZSByZWxhdGlvbnNoaXAgYW5ub3RhdGlvbnMuCisJICovCisJdm9pZCBzZXRDYXNjYWRlQWxsKGJvb2xlYW4gYWxsKTsKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2Nhc2NhZGUnIGVsZW1lbnQgb2YgdGhlIHJlbGF0aW9uc2hpcCBhbm5vdGF0aW9ucy4KKwkgKi8KKwlib29sZWFuIGlzQ2FzY2FkZU1lcmdlKCk7CQorCQlTdHJpbmcgQ0FTQ0FERV9NRVJHRV9QUk9QRVJUWSA9ICJjYXNjYWRlTWVyZ2UiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2Nhc2NhZGUnIGVsZW1lbnQgb2YgdGhlIHJlbGF0aW9uc2hpcCBhbm5vdGF0aW9ucy4KKwkgKi8KKwl2b2lkIHNldENhc2NhZGVNZXJnZShib29sZWFuIG1lcmdlKTsKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY2FzY2FkZScgZWxlbWVudCBvZiB0aGUgcmVsYXRpb25zaGlwIGFubm90YXRpb25zLgorCSAqLworCWJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpOwkKKwkJU3RyaW5nIENBU0NBREVfUEVSU0lTVF9QUk9QRVJUWSA9ICJjYXNjYWRlUGVyc2lzdCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY2FzY2FkZScgZWxlbWVudCBvZiB0aGUgcmVsYXRpb25zaGlwIGFubm90YXRpb25zLgorCSAqLworCXZvaWQgc2V0Q2FzY2FkZVBlcnNpc3QoYm9vbGVhbiBwZXJzaXN0KTsKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY2FzY2FkZScgZWxlbWVudCBvZiB0aGUgcmVsYXRpb25zaGlwIGFubm90YXRpb25zLgorCSAqLworCWJvb2xlYW4gaXNDYXNjYWRlUmVmcmVzaCgpOwkKKwkJU3RyaW5nIENBU0NBREVfUkVGUkVTSF9QUk9QRVJUWSA9ICJjYXNjYWRlUmVmcmVzaCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY2FzY2FkZScgZWxlbWVudCBvZiB0aGUgcmVsYXRpb25zaGlwIGFubm90YXRpb25zLgorCSAqLworCXZvaWQgc2V0Q2FzY2FkZVJlZnJlc2goYm9vbGVhbiByZWZyZXNoKTsKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY2FzY2FkZScgZWxlbWVudCBvZiB0aGUgcmVsYXRpb25zaGlwIGFubm90YXRpb25zLgorCSAqLworCWJvb2xlYW4gaXNDYXNjYWRlUmVtb3ZlKCk7CQorCQlTdHJpbmcgQ0FTQ0FERV9SRU1PVkVfUFJPUEVSVFkgPSAiY2FzY2FkZVJlbW92ZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY2FzY2FkZScgZWxlbWVudCBvZiB0aGUgcmVsYXRpb25zaGlwIGFubm90YXRpb25zLgorCSAqLworCXZvaWQgc2V0Q2FzY2FkZVJlbW92ZShib29sZWFuIHJlbW92ZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2Nhc2NhZGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSByZWxhdGlvbnNoaXAgbWFwcGluZyBhbm5vdGF0aW9uLgogCSAqLwogCVRleHRSYW5nZSBnZXRDYXNjYWRlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZUFubm90YXRpb24uamF2YQppbmRleCA5OWZmOTViLi5mZWU3OGE5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZUFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZUFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMiw3ICsxMiw4IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIAogLyoqCi0gKiAKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuU2Vjb25kYXJ5VGFibGUKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIwLDIzICsyMSw0NiBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBleHRlbmRzIFRhYmxlQW5ub3RhdGlvbgorcHVibGljIGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24KKwlleHRlbmRzIEJhc2VUYWJsZUFubm90YXRpb24KIHsKIAlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlNFQ09OREFSWV9UQUJMRTsKIAorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncGtKb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgU2Vjb25kYXJ5VGFibGUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmF0b3IgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KIAlMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zKCk7Ci0JCi0JUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtbkF0KGludCBpbmRleCk7Ci0JCi0JaW50IGluZGV4T2ZQa0pvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtbik7Ci0JCisJCVN0cmluZyBQS19KT0lOX0NPTFVNTlNfTElTVCA9ICJwa0pvaW5Db2x1bW5zIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdwa0pvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBTZWNvbmRhcnlUYWJsZSBhbm5vdGF0aW9uLgorCSAqLwogCWludCBwa0pvaW5Db2x1bW5zU2l6ZSgpOwogCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdwa0pvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBTZWNvbmRhcnlUYWJsZSBhbm5vdGF0aW9uLgorCSAqLworCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW5BdChpbnQgaW5kZXgpOworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdwa0pvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBTZWNvbmRhcnlUYWJsZSBhbm5vdGF0aW9uLgorCSAqLworCWludCBpbmRleE9mUGtKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW4pOworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdwa0pvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBTZWNvbmRhcnlUYWJsZSBhbm5vdGF0aW9uLgorCSAqLwogCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRQa0pvaW5Db2x1bW4oaW50IGluZGV4KTsKLQkKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncGtKb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgU2Vjb25kYXJ5VGFibGUgYW5ub3RhdGlvbi4KKwkgKi8KIAl2b2lkIHJlbW92ZVBrSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdwa0pvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBTZWNvbmRhcnlUYWJsZSBhbm5vdGF0aW9uLgorCSAqLwogCXZvaWQgbW92ZVBrSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7CiAKLQlTdHJpbmcgUEtfSk9JTl9DT0xVTU5TX0xJU1QgPSAicGtKb2luQ29sdW1uc0xpc3QiOwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5qYXZhCmluZGV4IDM5ZjljMTIuLmY1MzMwODYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCiAvKioKLSAqIAorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5TZWNvbmRhcnlUYWJsZXMKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTE4LDkgKzE5LDEwIEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbiBleHRlbmRzIENvbnRhaW5lckFubm90YXRpb248TmVzdGFibGVTZWNvbmRhcnlUYWJsZT4KK3B1YmxpYyBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbgorCWV4dGVuZHMgQ29udGFpbmVyQW5ub3RhdGlvbjxOZXN0YWJsZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbj4KIHsKIAlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlNFQ09OREFSWV9UQUJMRVM7CiAKLQlTdHJpbmcgU0VDT05EQVJZX1RBQkxFU19MSVNUID0gInNlY29uZGFyeVRhYmxlc0xpc3QiOworCVN0cmluZyBTRUNPTkRBUllfVEFCTEVTX0xJU1QgPSAic2Vjb25kYXJ5VGFibGVzIjsgLy8kTk9OLU5MUy0xJAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uamF2YQppbmRleCBiYWM2MzBjLi5kZTk5ODIwIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw3ICsxMyw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLlNlcXVlbmNlR2VuZXJhdG9yIGFubm90YXRpb24KKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuU2VxdWVuY2VHZW5lcmF0b3IKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTIxLDMwICsyMiwzNSBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBleHRlbmRzIEdlbmVyYXRvckFubm90YXRpb24KK3B1YmxpYyBpbnRlcmZhY2UgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uCisJZXh0ZW5kcyBHZW5lcmF0b3JBbm5vdGF0aW9uCiB7CiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5TRVFVRU5DRV9HRU5FUkFUT1I7CiAKIAkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgc2VxdWVuY2VOYW1lIGVsZW1lbnQgb2YgdGhlIFNlcXVlbmNlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBzZXF1ZW5jZU5hbWUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLiAgSWYgbm8gb3RoZXIgbWVtYmVyVmFsdWVQYWlycyBleGlzdAotCSAqIHRoZSBTZXF1ZW5jZUdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2VxdWVuY2VOYW1lJyBlbGVtZW50IG9mIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KIAkgKi8KIAlTdHJpbmcgZ2V0U2VxdWVuY2VOYW1lKCk7Ci0JCisJCVN0cmluZyBTRVFVRU5DRV9OQU1FX1BST1BFUlRZID0gInNlcXVlbmNlTmFtZSI7IC8vJE5PTi1OTFMtMSQKKwogCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBzZXF1ZW5jZU5hbWUgZWxlbWVudCBvZiB0aGUgU2VxdWVuY2VHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIHNlcXVlbmNlTmFtZSBlbGVtZW50LiAgSWYgbm8gb3RoZXIgbWVtYmVyVmFsdWVQYWlycyBleGlzdAotCSAqIHRoZSBTZXF1ZW5jZUdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2VxdWVuY2VOYW1lJyBlbGVtZW50IG9mIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LiBJZiBubyBvdGhlciBlbGVtZW50cyBleGlzdAorCSAqIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCiAJICovCiAJdm9pZCBzZXRTZXF1ZW5jZU5hbWUoU3RyaW5nIHNlcXVlbmNlTmFtZSk7Ci0JCVN0cmluZyBTRVFVRU5DRV9OQU1FX1BST1BFUlRZID0gInNlcXVlbmNlTmFtZVByb3BlcnR5IjsKLQkJCisJCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHNlcXVlbmNlTmFtZSBlbGVtZW50LiAgSWYgdGhlIHNlcXVlbmNlTmFtZSBlbGVtZW50IAorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnc2VxdWVuY2VOYW1lJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKIAkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgU2VxdWVuY2VHZW5lcmF0b3IgYW5ub3RhdGlvbi4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0U2VxdWVuY2VOYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIAorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ3NlcXVlbmNlTmFtZScgZWxlbWVudC4KKwkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCisJICovCisJYm9vbGVhbiBzZXF1ZW5jZU5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9UYWJsZUFubm90YXRpb24uamF2YQppbmRleCA5ODcxZThiLi4wYzUxOGM3IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9UYWJsZUFubm90YXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9UYWJsZUFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDEyICs5LDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7CiAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KIC8qKgotICogCisgKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KKyAqIGphdmF4LnBlcnNpc3RlbmNlLlRhYmxlCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMiw3MSArMTksOCBAQAogICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlQW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgVGFibGVBbm5vdGF0aW9uCisJZXh0ZW5kcyBCYXNlVGFibGVBbm5vdGF0aW9uCiB7CiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5UQUJMRTsKLQotCVN0cmluZyBnZXROYW1lKCk7Ci0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZVByb3BlcnR5IjsKLQkJCi0JU3RyaW5nIGdldENhdGFsb2coKTsKLQl2b2lkIHNldENhdGFsb2coU3RyaW5nIGNhdGFsb2cpOwotCQlTdHJpbmcgQ0FUQUxPR19QUk9QRVJUWSA9ICJjYXRhbG9nUHJvcGVydHkiOwotCi0JU3RyaW5nIGdldFNjaGVtYSgpOwotCXZvaWQgc2V0U2NoZW1hKFN0cmluZyBzY2hlbWEpOwotCQlTdHJpbmcgU0NIRU1BX1BST1BFUlRZID0gInNjaGVtYVByb3BlcnR5IjsKLQkKLQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCi0JVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEF0KGludCBpbmRleCk7Ci0JCi0JaW50IGluZGV4T2ZVbmlxdWVDb25zdHJhaW50KFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnQpOwotCQotCWludCB1bmlxdWVDb25zdHJhaW50c1NpemUoKTsKLQotCVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQkKLQl2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQkKLQl2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkJU3RyaW5nIFVOSVFVRV9DT05TVFJBSU5UU19MSVNUID0gInVuaXF1ZUNvbnN0cmFpbnRzTGlzdCI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbmFtZSBlbGVtZW50LiAgSWYgdGhlIG5hbWUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKlRhYmxlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGNhdGFsb2cgZWxlbWVudC4gIElmIHRoZSBjYXRhbG9nIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpUYWJsZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBzY2hlbWEgZWxlbWVudC4gIElmIHRoZSBzY2hlbWEgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKlRhYmxlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3N0aXRpb24gdG91Y2hlcyB0aGUgbmFtZSBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgbmFtZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zdGl0aW9uIHRvdWNoZXMgdGhlIHNjaGVtYSBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgbmFtZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3N0aXRpb24gdG91Y2hlcyB0aGUgY2F0YWxvZyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgbmFtZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gY2F0YWxvZ1RvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9UYWJsZUdlbmVyYXRvckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhCmluZGV4IDg3NThkMDcuLmU4MDAyNDAgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE0LDcgKzE0LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIAogLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgucGVyc2lzdGVuY2UuVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5UYWJsZUdlbmVyYXRvcgogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjIsMTUwICsyMywyMDkgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBUYWJsZUdlbmVyYXRvckFubm90YXRpb24gZXh0ZW5kcyBHZW5lcmF0b3JBbm5vdGF0aW9uCitwdWJsaWMgaW50ZXJmYWNlIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbgorCWV4dGVuZHMgR2VuZXJhdG9yQW5ub3RhdGlvbgogewotCQogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuVEFCTEVfR0VORVJBVE9SOwogCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHRhYmxlIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSB0YWJsZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuICBJZiBubyBvdGhlciBtZW1iZXJWYWx1ZVBhaXJzIGV4aXN0Ci0JICogdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd0YWJsZScgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgogCSAqLwogCVN0cmluZyBnZXRUYWJsZSgpOwotCQorCQlTdHJpbmcgVEFCTEVfUFJPUEVSVFkgPSAidGFibGUiOyAvLyROT04tTkxTLTEkCisKIAkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgdGFibGUgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIHRhYmxlIGVsZW1lbnQuICBJZiBubyBvdGhlciBtZW1iZXJWYWx1ZVBhaXJzIGV4aXN0CisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd0YWJsZScgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuIElmIG5vIG90aGVyIGVsZW1lbnRzIGV4aXN0CiAJICogdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCiAJICovCiAJdm9pZCBzZXRUYWJsZShTdHJpbmcgdGFibGUpOwotCQlTdHJpbmcgVEFCTEVfUFJPUEVSVFkgPSAidGFibGVQcm9wZXJ0eSI7Ci0JCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBjYXRhbG9nIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBjYXRhbG9nIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4gIElmIG5vIG90aGVyIG1lbWJlclZhbHVlUGFpcnMgZXhpc3QKLQkgKiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQlTdHJpbmcgZ2V0Q2F0YWxvZygpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBjYXRhbG9nIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBjYXRhbG9nIGVsZW1lbnQuICBJZiBubyBvdGhlciBtZW1iZXJWYWx1ZVBhaXJzIGV4aXN0Ci0JICogdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCi0JICovCi0Jdm9pZCBzZXRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKTsKLQkJU3RyaW5nIENBVEFMT0dfUFJPUEVSVFkgPSAiY2F0YWxvZ1Byb3BlcnR5IjsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgc2NoZW1hIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBzY2hlbWEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLiAgSWYgbm8gb3RoZXIgbWVtYmVyVmFsdWVQYWlycyBleGlzdAotCSAqIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgotCSAqLwotCVN0cmluZyBnZXRTY2hlbWEoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgc2NoZW1hIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBzY2hlbWEgZWxlbWVudC4gIElmIG5vIG90aGVyIG1lbWJlclZhbHVlUGFpcnMgZXhpc3QKLQkgKiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQl2b2lkIHNldFNjaGVtYShTdHJpbmcgc2NoZW1hKTsKLQkJU3RyaW5nIFNDSEVNQV9QUk9QRVJUWSA9ICJzY2hlbWFQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHBrQ29sdW1uTmFtZSBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgcGtDb2x1bW5OYW1lIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4gIElmIG5vIG90aGVyIG1lbWJlclZhbHVlUGFpcnMgZXhpc3QKLQkgKiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQlTdHJpbmcgZ2V0UGtDb2x1bW5OYW1lKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHBrQ29sdW1uTmFtZSBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgcGtDb2x1bW5OYW1lIGVsZW1lbnQuICBJZiBubyBvdGhlciBtZW1iZXJWYWx1ZVBhaXJzIGV4aXN0Ci0JICogdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCi0JICovCi0Jdm9pZCBzZXRQa0NvbHVtbk5hbWUoU3RyaW5nIHBrQ29sdW1uTmFtZSk7Ci0JCVN0cmluZyBQS19DT0xVTU5fTkFNRV9QUk9QRVJUWSA9ICJwa0NvbHVtbk5hbWVQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlQ29sdW1uTmFtZSBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgdmFsdWVDb2x1bW5OYW1lIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4gIElmIG5vIG90aGVyIG1lbWJlclZhbHVlUGFpcnMgZXhpc3QKLQkgKiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWVDb2x1bW5OYW1lKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlQ29sdW1uTmFtZSBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgdmFsdWVDb2x1bW5OYW1lIGVsZW1lbnQuICBJZiBubyBvdGhlciBtZW1iZXJWYWx1ZVBhaXJzIGV4aXN0Ci0JICogdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSk7Ci0JCVN0cmluZyBWQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSA9ICJ2YWx1ZUNvbHVtbk5hbWVQcm9wZXJ0eSI7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHBrQ29sdW1uVmFsdWUgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHBrQ29sdW1uVmFsdWUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLiAgSWYgbm8gb3RoZXIgbWVtYmVyVmFsdWVQYWlycyBleGlzdAotCSAqIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgotCSAqLwotCVN0cmluZyBnZXRQa0NvbHVtblZhbHVlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHBrQ29sdW1uVmFsdWUgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIHBrQ29sdW1uVmFsdWUgZWxlbWVudC4gIElmIG5vIG90aGVyIG1lbWJlclZhbHVlUGFpcnMgZXhpc3QKLQkgKiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KLQkgKi8KLQl2b2lkIHNldFBrQ29sdW1uVmFsdWUoU3RyaW5nIHBrQ29sdW1uVmFsdWUpOwotCQlTdHJpbmcgUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZID0gInBrQ29sdW1uVmFsdWVQcm9wZXJ0eSI7Ci0JCi0JTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cygpOwotCQotCVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnRBdChpbnQgaW5kZXgpOwotCQotCWludCBpbmRleE9mVW5pcXVlQ29uc3RyYWludChVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50KTsKLQkKLQlpbnQgdW5pcXVlQ29uc3RyYWludHNTaXplKCk7Ci0KLQlVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCk7Ci0JCi0Jdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCk7Ci0JCi0Jdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCVN0cmluZyBVTklRVUVfQ09OU1RSQUlOVFNfTElTVCA9ICJ1bmlxdWVDb25zdHJhaW50c0xpc3QiOwogCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHRhYmxlIGVsZW1lbnQuICBJZiB0aGUgdGFibGUgZWxlbWVudCAKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3RhYmxlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKIAkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGNhdGFsb2cgZWxlbWVudC4gIElmIHRoZSBjYXRhbG9nIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAndGFibGUnIGVsZW1lbnQuCisJICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgogCSAqLwotCVRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKwlib29sZWFuIHRhYmxlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKIAogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBzY2hlbWEgZWxlbWVudC4gIElmIHRoZSBzY2hlbWEgZWxlbWVudCAKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NjaGVtYScgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCVN0cmluZyBnZXRTY2hlbWEoKTsKKwkJU3RyaW5nIFNDSEVNQV9QUk9QRVJUWSA9ICJzY2hlbWEiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NjaGVtYScgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuIElmIG5vIG90aGVyIGVsZW1lbnRzIGV4aXN0CisJICogdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCisJICovCisJdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHNjaGVtYSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3NjaGVtYScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCiAJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKIAkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgcGtDb2x1bW5OYW1lIGVsZW1lbnQuICBJZiB0aGUgcGtDb2x1bW5OYW1lIGVsZW1lbnQgCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnc2NoZW1hJyBlbGVtZW50LgorCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlib29sZWFuIHNjaGVtYVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NhdGFsb2cnIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlTdHJpbmcgZ2V0Q2F0YWxvZygpOworCQlTdHJpbmcgQ0FUQUxPR19QUk9QRVJUWSA9ICJjYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdjYXRhbG9nJyBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4gSWYgbm8gb3RoZXIgZWxlbWVudHMgZXhpc3QKKwkgKiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KKwkgKi8KKwl2b2lkIHNldENhdGFsb2coU3RyaW5nIGNhdGFsb2cpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdjYXRhbG9nJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICdjYXRhbG9nJyBlbGVtZW50LgorCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlib29sZWFuIGNhdGFsb2dUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdwa0NvbHVtbk5hbWUnIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlTdHJpbmcgZ2V0UGtDb2x1bW5OYW1lKCk7CisJCVN0cmluZyBQS19DT0xVTU5fTkFNRV9QUk9QRVJUWSA9ICJwa0NvbHVtbk5hbWUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3BrQ29sdW1uTmFtZScgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuIElmIG5vIG90aGVyIGVsZW1lbnRzIGV4aXN0CisJICogdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24gd2lsbCBiZSByZW1vdmVkIGFzIHdlbGwuCisJICovCisJdm9pZCBzZXRQa0NvbHVtbk5hbWUoU3RyaW5nIHBrQ29sdW1uTmFtZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3BrQ29sdW1uTmFtZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCiAJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldFBrQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKIAkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgdmFsdWVDb2x1bW5OYW1lIGVsZW1lbnQuICBJZiB0aGUgdmFsdWVDb2x1bW5OYW1lIGVsZW1lbnQgCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAncGtDb2x1bW5OYW1lJyBlbGVtZW50LgorCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlib29sZWFuIHBrQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlQ29sdW1uTmFtZScgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCVN0cmluZyBnZXRWYWx1ZUNvbHVtbk5hbWUoKTsKKwkJU3RyaW5nIFZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gInZhbHVlQ29sdW1uTmFtZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWVDb2x1bW5OYW1lJyBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4gSWYgbm8gb3RoZXIgZWxlbWVudHMgZXhpc3QKKwkgKiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KKwkgKi8KKwl2b2lkIHNldFZhbHVlQ29sdW1uTmFtZShTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWVDb2x1bW5OYW1lJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKIAkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0VmFsdWVDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIAogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBwa0NvbHVtblZhbHVlIGVsZW1lbnQuICBJZiB0aGUgcGtDb2x1bW5WYWx1ZSBlbGVtZW50IAorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ3ZhbHVlQ29sdW1uTmFtZScgZWxlbWVudC4KKwkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCisJICovCisJYm9vbGVhbiB2YWx1ZUNvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdwa0NvbHVtblZhbHVlJyBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJU3RyaW5nIGdldFBrQ29sdW1uVmFsdWUoKTsKKwkJU3RyaW5nIFBLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSA9ICJwa0NvbHVtblZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdwa0NvbHVtblZhbHVlJyBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4gSWYgbm8gb3RoZXIgZWxlbWVudHMgZXhpc3QKKwkgKiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbiB3aWxsIGJlIHJlbW92ZWQgYXMgd2VsbC4KKwkgKi8KKwl2b2lkIHNldFBrQ29sdW1uVmFsdWUoU3RyaW5nIHBrQ29sdW1uVmFsdWUpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdwa0NvbHVtblZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKIAkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KIAkgKi8KIAlUZXh0UmFuZ2UgZ2V0UGtDb2x1bW5WYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICdwa0NvbHVtblZhbHVlJyBlbGVtZW50LgorCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlib29sZWFuIHBrQ29sdW1uVmFsdWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd1bmlxdWVDb25zdHJhaW50cycgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMoKTsKKwkJU3RyaW5nIFVOSVFVRV9DT05TVFJBSU5UU19MSVNUID0gInVuaXF1ZUNvbnN0cmFpbnRzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd1bmlxdWVDb25zdHJhaW50cycgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKi8KKwlpbnQgdW5pcXVlQ29uc3RyYWludHNTaXplKCk7CisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3VuaXF1ZUNvbnN0cmFpbnRzJyBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgorCSAqLworCVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnRBdChpbnQgaW5kZXgpOworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd1bmlxdWVDb25zdHJhaW50cycgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KKwkgKi8KKwlpbnQgaW5kZXhPZlVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludCk7CisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3VuaXF1ZUNvbnN0cmFpbnRzJyBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgorCSAqLworCVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndW5pcXVlQ29uc3RyYWludHMnIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCisJICovCisJdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7CisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3VuaXF1ZUNvbnN0cmFpbnRzJyBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgorCSAqIElmIG5vIG90aGVyIGVsZW1lbnRzIGV4aXN0IHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLgorCSAqLworCXZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOworCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9UZW1wb3JhbEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1RlbXBvcmFsQW5ub3RhdGlvbi5qYXZhCmluZGV4IDNmOWVkYmIuLmYxNTM1YzcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1RlbXBvcmFsQW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1RlbXBvcmFsQW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEzLDcgKzEzLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKIAogLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWwgYW5ub3RhdGlvbgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbAogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMjEsMjUgKzIyLDI2IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVtcG9yYWxBbm5vdGF0aW9uIGV4dGVuZHMgSmF2YVJlc291cmNlTm9kZQorcHVibGljIGludGVyZmFjZSBUZW1wb3JhbEFubm90YXRpb24KKwlleHRlbmRzIEFubm90YXRpb24KIHsKIAlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlRFTVBPUkFMOwogCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIGVsZW1lbnQgb2YgdGhlIFRlbXBvcmFsIGFubm90YXRpb24uCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSB2YWx1ZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIGphdmEuCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgVGVtcG9yYWwgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgogCSAqLwogCVRlbXBvcmFsVHlwZSBnZXRWYWx1ZSgpOworCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCiAJCiAJLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIGVsZW1lbnQgb2YgdGhlIFRlbXBvcmFsIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSB2YWx1ZSBlbGVtZW50LgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFRlbXBvcmFsIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgogCSAqLwogCXZvaWQgc2V0VmFsdWUoVGVtcG9yYWxUeXBlIHZhbHVlKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlUHJvcGVydHkiOwogCQogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB2YWx1ZSBlbGVtZW50LiAgSWYgdGhlIHZhbHVlIGVsZW1lbnQgCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCiAJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRlbXBvcmFsIGFubm90YXRpb24uCiAJICovCiAJVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1RlbXBvcmFsVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVGVtcG9yYWxUeXBlLmphdmEKaW5kZXggZDY1OGY0My4uMmE4NWIwMCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVGVtcG9yYWxUeXBlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVGVtcG9yYWxUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhOwogCiAvKioKLSAqIAorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBlbnVtCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbFR5cGUKICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTE5LDQxICsyMCw0MyBAQAogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICovCiBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgewotCQotCURBVEUsCi0JVElNRSwKLQlUSU1FU1RBTVA7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBUZW1wb3JhbFR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKKworCURBVEUoSlBBLlRFTVBPUkFMX1RZUEVfX0RBVEUpLAorCVRJTUUoSlBBLlRFTVBPUkFMX1RZUEVfX1RJTUUpLAorCVRJTUVTVEFNUChKUEEuVEVNUE9SQUxfVFlQRV9fVElNRVNUQU1QKTsKKworCisJcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKKworCVRlbXBvcmFsVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewogCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhKUEEuVEVNUE9SQUxfVFlQRV9fREFURSkpIHsKLQkJCXJldHVybiBEQVRFOwotCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhKUEEuVEVNUE9SQUxfVFlQRV9fVElNRSkpIHsKLQkJCXJldHVybiBUSU1FOwotCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlLmVxdWFscyhKUEEuVEVNUE9SQUxfVFlQRV9fVElNRVNUQU1QKSkgewotCQkJcmV0dXJuIFRJTUVTVEFNUDsKKwkJdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWU7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVGVtcG9yYWxUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVGVtcG9yYWxUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgeworCQlmb3IgKFRlbXBvcmFsVHlwZSB0ZW1wb3JhbFR5cGUgOiBUZW1wb3JhbFR5cGUudmFsdWVzKCkpIHsKKwkJCWlmICh0ZW1wb3JhbFR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpLmVxdWFscyhqYXZhQW5ub3RhdGlvblZhbHVlKSkgeworCQkJCXJldHVybiB0ZW1wb3JhbFR5cGU7CisJCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKFRlbXBvcmFsVHlwZSB0ZW1wb3JhbFR5cGUpIHsKLQkJaWYgKHRlbXBvcmFsVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKHRlbXBvcmFsVHlwZSkgewotCQkJY2FzZSBEQVRFIDoKLQkJCQlyZXR1cm4gSlBBLlRFTVBPUkFMX1RZUEVfX0RBVEU7Ci0JCQljYXNlIFRJTUUgOgotCQkJCXJldHVybiBKUEEuVEVNUE9SQUxfVFlQRV9fVElNRTsKLQkJCWNhc2UgVElNRVNUQU1QIDoKLQkJCQlyZXR1cm4gSlBBLlRFTVBPUkFMX1RZUEVfX1RJTUVTVEFNUDsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gdGVtcG9yYWwgdHlwZTogIiArIHRlbXBvcmFsVHlwZSk7Ci0JCX0KKwkJcmV0dXJuICh0ZW1wb3JhbFR5cGUgPT0gbnVsbCkgPyBudWxsIDogdGVtcG9yYWxUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKTsKIAl9CisKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1RyYW5zaWVudEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1RyYW5zaWVudEFubm90YXRpb24uamF2YQppbmRleCA1YjgzYTRhLi5lYmFlZjZmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9UcmFuc2llbnRBbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVHJhbnNpZW50QW5ub3RhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDcgKzEwLDggQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YTsKIAogLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgucGVyc2lzdGVuY2UuVHJhbnNpZW50IGFubm90YXRpb24KKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgorICogamF2YXgucGVyc2lzdGVuY2UuVHJhbnNpZW50CiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0xOCw4ICsxOSw4IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJhbnNpZW50QW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgVHJhbnNpZW50QW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgogewogCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuVFJBTlNJRU5UOwotCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24uamF2YQppbmRleCA0NDYyOTI4Li4xYzcyNWFiIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1VuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTMsNyArMTMsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CiAKIC8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLlVuaXF1ZUNvbnN0cmFpbnQgYW5ub3RhdGlvbgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5VbmlxdWVDb25zdHJhaW50CiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yMSwyOCArMjIsNTEgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKK3B1YmxpYyBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24KKwlleHRlbmRzIEFubm90YXRpb24KIHsKIAlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlVOSVFVRV9DT05TVFJBSU5UOwogCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb2x1bW5OYW1lcycgZWxlbWVudCBvZiB0aGUgVW5pcXVlQ29uc3RyYWludCBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uLgorCSAqLwogCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGNvbHVtbk5hbWVzKCk7CisJCVN0cmluZyBDT0xVTU5fTkFNRVNfTElTVCA9ICJjb2x1bW5OYW1lcyI7IC8vJE5PTi1OTFMtMSQKIAorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29sdW1uTmFtZXMnIGVsZW1lbnQgb2YgdGhlIFVuaXF1ZUNvbnN0cmFpbnQgYW5ub3RhdGlvbi4KKwkgKi8KIAlpbnQgY29sdW1uTmFtZXNTaXplKCk7CiAJCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb2x1bW5OYW1lcycgZWxlbWVudCBvZiB0aGUgVW5pcXVlQ29uc3RyYWludCBhbm5vdGF0aW9uLgorCSAqLwogCXZvaWQgYWRkQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSk7CiAKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbHVtbk5hbWVzJyBlbGVtZW50IG9mIHRoZSBVbmlxdWVDb25zdHJhaW50IGFubm90YXRpb24uCisJICovCiAJdm9pZCBhZGRDb2x1bW5OYW1lKGludCBpbmRleCwgU3RyaW5nIGNvbHVtbk5hbWUpOwogCQotCXZvaWQgcmVtb3ZlQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSk7Ci0JCi0Jdm9pZCByZW1vdmVDb2x1bW5OYW1lKGludCBpbmRleCk7Ci0JCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb2x1bW5OYW1lcycgZWxlbWVudCBvZiB0aGUgVW5pcXVlQ29uc3RyYWludCBhbm5vdGF0aW9uLgorCSAqLwogCXZvaWQgbW92ZUNvbHVtbk5hbWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQlTdHJpbmcgQ09MVU1OX05BTUVTX0xJU1QgPSAiY29sdW1uTmFtZXNMaXN0IjsKIAkJCiAJLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3N0aXRpb24gdG91Y2hlcyB0aGUgY29sdW1uTmFtZXMgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGNvbHVtbk5hbWVzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb2x1bW5OYW1lcycgZWxlbWVudCBvZiB0aGUgVW5pcXVlQ29uc3RyYWludCBhbm5vdGF0aW9uLgorCSAqLworCXZvaWQgcmVtb3ZlQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSk7CisJCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb2x1bW5OYW1lcycgZWxlbWVudCBvZiB0aGUgVW5pcXVlQ29uc3RyYWludCBhbm5vdGF0aW9uLgorCSAqLworCXZvaWQgcmVtb3ZlQ29sdW1uTmFtZShpbnQgaW5kZXgpOworCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ2NvbHVtbk5hbWVzJyBlbGVtZW50LgorCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KIAkgKi8KIAlib29sZWFuIGNvbHVtbk5hbWVzVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1ZlcnNpb25Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvamF2YS9WZXJzaW9uQW5ub3RhdGlvbi5qYXZhCmluZGV4IDAzNTgzYTUuLmRkZWE2MjggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9qYXZhL1ZlcnNpb25Bbm5vdGF0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL2phdmEvVmVyc2lvbkFubm90YXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3ICsxMCw4IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmE7CiAKIC8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIGphdmF4LnBlcnNpc3RlbmNlLlZlcnNpb24gYW5ub3RhdGlvbgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCisgKiBqYXZheC5wZXJzaXN0ZW5jZS5WZXJzaW9uCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0xOCw4ICsxOSw4IEBACiAgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmVyc2lvbkFubm90YXRpb24gZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlCitwdWJsaWMgaW50ZXJmYWNlIFZlcnNpb25Bbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCiB7CiAJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5WRVJTSU9OOwotCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzRmYWY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzLk9ybVhtbE1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmVtZi5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BYnN0cmFjdCBYbWwgQWJzdHJhY3QgQ29sdW1uPC9iPjwvZW0+Jy4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4gZXh0ZW5kcyBBYnN0cmFjdFhtbE5hbWVkQ29sdW1uIGltcGxlbWVudHMgWG1sQWJzdHJhY3RDb2x1bW4KLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5zZXJ0YWJsZSgpIDxlbT5JbnNlcnRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnNlcnRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSU5TRVJUQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnNlcnRhYmxlKCkgPGVtPkluc2VydGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluc2VydGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGluc2VydGFibGUgPSBJTlNFUlRBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bGxhYmxlKCkgPGVtPk51bGxhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdWxsYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIE5VTExBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bGxhYmxlKCkgPGVtPk51bGxhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdWxsYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gbnVsbGFibGUgPSBOVUxMQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZSgpIDxlbT5UYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhYmxlKCkgPGVtPlRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YWJsZSA9IFRBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXF1ZSgpIDxlbT5VbmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFVOSVFVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmlxdWUoKSA8ZW0+VW5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIHVuaXF1ZSA9IFVOSVFVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcGRhdGFibGUoKSA8ZW0+VXBkYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcGRhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBVUERBVEFCTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXBkYXRhYmxlKCkgPGVtPlVwZGF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXBkYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiB1cGRhdGFibGUgPSBVUERBVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbnNlcnRhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBYnN0cmFjdENvbHVtbl9JbnNlcnRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCkKLQl7Ci0JCXJldHVybiBpbnNlcnRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uI2dldEluc2VydGFibGUgPGVtPkluc2VydGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluc2VydGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRhYmxlKEJvb2xlYW4gbmV3SW5zZXJ0YWJsZSkKLQl7Ci0JCUJvb2xlYW4gb2xkSW5zZXJ0YWJsZSA9IGluc2VydGFibGU7Ci0JCWluc2VydGFibGUgPSBuZXdJbnNlcnRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX0lOU0VSVEFCTEUsIG9sZEluc2VydGFibGUsIGluc2VydGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TnVsbGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TnVsbGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE51bGxhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBYnN0cmFjdENvbHVtbl9OdWxsYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0TnVsbGFibGUoKQotCXsKLQkJcmV0dXJuIG51bGxhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uI2dldE51bGxhYmxlIDxlbT5OdWxsYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TnVsbGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE51bGxhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiBuZXdOdWxsYWJsZSkKLQl7Ci0JCUJvb2xlYW4gb2xkTnVsbGFibGUgPSBudWxsYWJsZTsKLQkJbnVsbGFibGUgPSBuZXdOdWxsYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19OVUxMQUJMRSwgb2xkTnVsbGFibGUsIG51bGxhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYWJsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBYnN0cmFjdENvbHVtbl9UYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkKLQl7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbiNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyBuZXdUYWJsZSkKLQl7Ci0JCVN0cmluZyBvbGRUYWJsZSA9IHRhYmxlOwotCQl0YWJsZSA9IG5ld1RhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1RBQkxFLCBvbGRUYWJsZSwgdGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaXF1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlxdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVuaXF1ZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWJzdHJhY3RDb2x1bW5fVW5pcXVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKQotCXsKLQkJcmV0dXJuIHVuaXF1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbiNnZXRVbmlxdWUgPGVtPlVuaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVbmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiBuZXdVbmlxdWUpCi0JewotCQlCb29sZWFuIG9sZFVuaXF1ZSA9IHVuaXF1ZTsKLQkJdW5pcXVlID0gbmV3VW5pcXVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRSwgb2xkVW5pcXVlLCB1bmlxdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVwZGF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVwZGF0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWJzdHJhY3RDb2x1bW5fVXBkYXRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRVcGRhdGFibGUoKQotCXsKLQkJcmV0dXJuIHVwZGF0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbiNnZXRVcGRhdGFibGUgPGVtPlVwZGF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcGRhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGFibGUoQm9vbGVhbiBuZXdVcGRhdGFibGUpCi0JewotCQlCb29sZWFuIG9sZFVwZGF0YWJsZSA9IHVwZGF0YWJsZTsKLQkJdXBkYXRhYmxlID0gbmV3VXBkYXRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VQREFUQUJMRSwgb2xkVXBkYXRhYmxlLCB1cGRhdGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19JTlNFUlRBQkxFOgotCQkJCXJldHVybiBnZXRJbnNlcnRhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fTlVMTEFCTEU6Ci0JCQkJcmV0dXJuIGdldE51bGxhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEU6Ci0JCQkJcmV0dXJuIGdldFRhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVU5JUVVFOgotCQkJCXJldHVybiBnZXRVbmlxdWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19VUERBVEFCTEU6Ci0JCQkJcmV0dXJuIGdldFVwZGF0YWJsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19JTlNFUlRBQkxFOgotCQkJCXNldEluc2VydGFibGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19OVUxMQUJMRToKLQkJCQlzZXROdWxsYWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1RBQkxFOgotCQkJCXNldFRhYmxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19VTklRVUU6Ci0JCQkJc2V0VW5pcXVlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFOgotCQkJCXNldFVwZGF0YWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX0lOU0VSVEFCTEU6Ci0JCQkJc2V0SW5zZXJ0YWJsZShJTlNFUlRBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fTlVMTEFCTEU6Ci0JCQkJc2V0TnVsbGFibGUoTlVMTEFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19UQUJMRToKLQkJCQlzZXRUYWJsZShUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRToKLQkJCQlzZXRVbmlxdWUoVU5JUVVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFOgotCQkJCXNldFVwZGF0YWJsZShVUERBVEFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRToKLQkJCQlyZXR1cm4gSU5TRVJUQUJMRV9FREVGQVVMVCA9PSBudWxsID8gaW5zZXJ0YWJsZSAhPSBudWxsIDogIUlOU0VSVEFCTEVfRURFRkFVTFQuZXF1YWxzKGluc2VydGFibGUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFOgotCQkJCXJldHVybiBOVUxMQUJMRV9FREVGQVVMVCA9PSBudWxsID8gbnVsbGFibGUgIT0gbnVsbCA6ICFOVUxMQUJMRV9FREVGQVVMVC5lcXVhbHMobnVsbGFibGUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1RBQkxFOgotCQkJCXJldHVybiBUQUJMRV9FREVGQVVMVCA9PSBudWxsID8gdGFibGUgIT0gbnVsbCA6ICFUQUJMRV9FREVGQVVMVC5lcXVhbHModGFibGUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRToKLQkJCQlyZXR1cm4gVU5JUVVFX0VERUZBVUxUID09IG51bGwgPyB1bmlxdWUgIT0gbnVsbCA6ICFVTklRVUVfRURFRkFVTFQuZXF1YWxzKHVuaXF1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFOgotCQkJCXJldHVybiBVUERBVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IHVwZGF0YWJsZSAhPSBudWxsIDogIVVQREFUQUJMRV9FREVGQVVMVC5lcXVhbHModXBkYXRhYmxlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWJzdHJhY3RDb2x1bW4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fTlVMTEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19UQUJMRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FCU1RSQUNUX0NPTFVNTl9fVU5JUVVFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19VUERBVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9BQlNUUkFDVF9DT0xVTU5fX1VQREFUQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFic3RyYWN0Q29sdW1uLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BQlNUUkFDVF9DT0xVTU5fX0lOU0VSVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX0lOU0VSVEFCTEU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19OVUxMQUJMRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1RBQkxFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQUJTVFJBQ1RfQ09MVU1OX19VTklRVUU6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19VUERBVEFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpbnNlcnRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbnNlcnRhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBudWxsYWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobnVsbGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdW5pcXVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1bmlxdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVwZGF0YWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXBkYXRhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZSgpIHsKLQkJSURPTU5vZGUgdGFibGVOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKHRoaXMubm9kZSwgT3JtWG1sTWFwcGVyLlRBQkxFKTsKLQkJcmV0dXJuICh0YWJsZU5vZGUgPT0gbnVsbCkgPyBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgOiBidWlsZFRleHRSYW5nZSh0YWJsZU5vZGUpOwotCX0KLX0gLy8gQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKaW5kZXggNjFlZmI5Zi4uMTNmZmQ1YSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEyLDExICsxMiw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzLk9ybVhtbE1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmVtZi5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0zNCw5ICszMiwyNyBAQAogICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdAorCWltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZwogewogCS8qKgorCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAorCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFjY2Vzc1R5cGUgQUNDRVNTX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2VzcygpIDxlbT5BY2Nlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjY2VzcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYWNjZXNzID0gQUNDRVNTX0VERUZBVUxUOworCisJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC03OCw2ICs5NCw0NCBAQAogCX0KIAogCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUKKwkgKiBAc2VlICNzZXRBY2Nlc3MoQWNjZXNzVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFjY2Vzc0hvbGRlcl9BY2Nlc3MoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKQorCXsKKwkJcmV0dXJuIGFjY2VzczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nI2dldEFjY2VzcyA8ZW0+QWNjZXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUKKwkgKiBAc2VlICNnZXRBY2Nlc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdBY2Nlc3MpCisJeworCQlBY2Nlc3NUeXBlIG9sZEFjY2VzcyA9IGFjY2VzczsKKwkJYWNjZXNzID0gbmV3QWNjZXNzID09IG51bGwgPyBBQ0NFU1NfRURFRkFVTFQgOiBuZXdBY2Nlc3M7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1MsIG9sZEFjY2VzcywgYWNjZXNzKSk7CisJfQorCisJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CkBAIC0xMjIsNiArMTc2LDggQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M6CisJCQkJcmV0dXJuIGdldEFjY2VzcygpOwogCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRToKIAkJCQlyZXR1cm4gZ2V0TmFtZSgpOwogCQl9CkBAIC0xMzgsNiArMTk0LDkgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M6CisJCQkJc2V0QWNjZXNzKChBY2Nlc3NUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOgogCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwpAQCAtMTU1LDYgKzIxNCw5IEBACiAJewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkKIAkJeworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOgorCQkJCXNldEFjY2VzcyhBQ0NFU1NfRURFRkFVTFQpOworCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU6CiAJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKIAkJCQlyZXR1cm47CkBAIC0xNzIsNiArMjM0LDggQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M6CisJCQkJcmV0dXJuIGFjY2VzcyAhPSBBQ0NFU1NfRURFRkFVTFQ7CiAJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOgogCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7CiAJCX0KQEAgLTE4OSwxNSArMjUzLDI4IEBACiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChhY2Nlc3M6ICIpOworCQlyZXN1bHQuYXBwZW5kKGFjY2Vzcyk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7CiAJCXJlc3VsdC5hcHBlbmQobmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KIAkKKwkKKwkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioKKwkKIAlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIG5hbWVOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKHRoaXMubm9kZSwgT3JtWG1sTWFwcGVyLk5BTUUpOwotCQlyZXR1cm4gKG5hbWVOb2RlICE9IG51bGwpID8gdGhpcy5idWlsZFRleHRSYW5nZShuYW1lTm9kZSkgOiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuTkFNRSk7CiAJfQotCi19IC8vIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZworCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkFDQ0VTUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzSG9sZGVyX0FjY2VzcygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxCYXNlVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxCYXNlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3OGQyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sQmFzZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9ycy5Pcm1YbWxNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5lbWYuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BYnN0cmFjdCBYbWwgQmFzZSBUYWJsZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxCYXNlVGFibGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0WG1sQmFzZVRhYmxlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sQmFzZVRhYmxlCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZygpIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGFsb2coKSA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjYXRhbG9nID0gQ0FUQUxPR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2hlbWEoKSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2hlbWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2hlbWEoKSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2hlbWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hID0gU0NIRU1BX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pcXVlQ29uc3RyYWludHMoKSA8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXF1ZUNvbnN0cmFpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RYbWxCYXNlVGFibGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZVRhYmxlX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VUYWJsZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhdGFsb2coU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZVRhYmxlX0NhdGFsb2coKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkKLQl7Ci0JCXJldHVybiBjYXRhbG9nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VUYWJsZSNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgbmV3Q2F0YWxvZykKLQl7Ci0JCVN0cmluZyBvbGRDYXRhbG9nID0gY2F0YWxvZzsKLQkJY2F0YWxvZyA9IG5ld0NhdGFsb2c7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX0NBVEFMT0csIG9sZENhdGFsb2csIGNhdGFsb2cpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNjaGVtYShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNlVGFibGVfU2NoZW1hKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkKLQl7Ci0JCXJldHVybiBzY2hlbWE7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQmFzZVRhYmxlI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgbmV3U2NoZW1hKQotCXsKLQkJU3RyaW5nIG9sZFNjaGVtYSA9IHNjaGVtYTsKLQkJc2NoZW1hID0gbmV3U2NoZW1hOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19TQ0hFTUEsIG9sZFNjaGVtYSwgc2NoZW1hKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZVRhYmxlX1VuaXF1ZUNvbnN0cmFpbnRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PiBnZXRVbmlxdWVDb25zdHJhaW50cygpCi0JewotCQlpZiAodW5pcXVlQ29uc3RyYWludHMgPT0gbnVsbCkKLQkJewotCQkJdW5pcXVlQ29uc3RyYWludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4oWG1sVW5pcXVlQ29uc3RyYWludC5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTKTsKLQkJfQotCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFVuaXF1ZUNvbnN0cmFpbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fQ0FUQUxPRzoKLQkJCQlyZXR1cm4gZ2V0Q2F0YWxvZygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19TQ0hFTUE6Ci0JCQkJcmV0dXJuIGdldFNjaGVtYSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuIGdldFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19DQVRBTE9HOgotCQkJCXNldENhdGFsb2coKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19TQ0hFTUE6Ci0JCQkJc2V0U2NoZW1hKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOgotCQkJCWdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVW5pcXVlQ29uc3RyYWludD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fQ0FUQUxPRzoKLQkJCQlzZXRDYXRhbG9nKENBVEFMT0dfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fU0NIRU1BOgotCQkJCXNldFNjaGVtYShTQ0hFTUFfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOgotCQkJCWdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX0NBVEFMT0c6Ci0JCQkJcmV0dXJuIENBVEFMT0dfRURFRkFVTFQgPT0gbnVsbCA/IGNhdGFsb2cgIT0gbnVsbCA6ICFDQVRBTE9HX0VERUZBVUxULmVxdWFscyhjYXRhbG9nKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fU0NIRU1BOgotCQkJCXJldHVybiBTQ0hFTUFfRURFRkFVTFQgPT0gbnVsbCA/IHNjaGVtYSAhPSBudWxsIDogIVNDSEVNQV9FREVGQVVMVC5lcXVhbHMoc2NoZW1hKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOgotCQkJCXJldHVybiB1bmlxdWVDb25zdHJhaW50cyAhPSBudWxsICYmICF1bmlxdWVDb25zdHJhaW50cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhdGFsb2c6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhdGFsb2cpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjaGVtYTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2NoZW1hKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIG5hbWVOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKHRoaXMubm9kZSwgT3JtWG1sTWFwcGVyLk5BTUUpOwotCQlyZXR1cm4gKG5hbWVOb2RlID09IG51bGwpID8gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogYnVpbGRUZXh0UmFuZ2UobmFtZU5vZGUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIGNhdGFsb2dOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKHRoaXMubm9kZSwgT3JtWG1sTWFwcGVyLkNBVEFMT0cpOwotCQlyZXR1cm4gKGNhdGFsb2dOb2RlID09IG51bGwpID8gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogYnVpbGRUZXh0UmFuZ2UoY2F0YWxvZ05vZGUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZSgpIHsKLQkJSURPTU5vZGUgc2NoZW1hTm9kZSA9IChJRE9NTm9kZSkgRE9NVXRpbGl0aWVzLmNoaWxkQXR0cmlidXRlTm9kZSh0aGlzLm5vZGUsIE9ybVhtbE1hcHBlci5TQ0hFTUEpOwotCQlyZXR1cm4gKHNjaGVtYU5vZGUgPT0gbnVsbCkgPyBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgOiBidWlsZFRleHRSYW5nZShzY2hlbWFOb2RlKTsKLQl9Ci0KLX0gLy8gQWJzdHJhY3RYbWxCYXNlVGFibGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxDb2x1bW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzk4ZDAzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbENvbHVtbi5qYXZhCkBAIC0wLDAgKzEsNTAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuQm9vbGVhblRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWJzdHJhY3QgWG1sIEFic3RyYWN0IENvbHVtbjwvYj48L2VtPicuCisgKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxDb2x1bW4jZ2V0SW5zZXJ0YWJsZSA8ZW0+SW5zZXJ0YWJsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQ29sdW1uI2dldE51bGxhYmxlIDxlbT5OdWxsYWJsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQ29sdW1uI2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQ29sdW1uI2dldFVuaXF1ZSA8ZW0+VW5pcXVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxDb2x1bW4jZ2V0VXBkYXRhYmxlIDxlbT5VcGRhdGFibGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQ29sdW1uKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhtbENvbHVtbiBleHRlbmRzIEFic3RyYWN0WG1sTmFtZWRDb2x1bW4KK3sKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5zZXJ0YWJsZSgpIDxlbT5JbnNlcnRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbnNlcnRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSU5TRVJUQUJMRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnNlcnRhYmxlKCkgPGVtPkluc2VydGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluc2VydGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb29sZWFuIGluc2VydGFibGUgPSBJTlNFUlRBQkxFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bGxhYmxlKCkgPGVtPk51bGxhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROdWxsYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIE5VTExBQkxFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bGxhYmxlKCkgPGVtPk51bGxhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROdWxsYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJvb2xlYW4gbnVsbGFibGUgPSBOVUxMQUJMRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZSgpIDxlbT5UYWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhYmxlKCkgPGVtPlRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyB0YWJsZSA9IFRBQkxFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXF1ZSgpIDxlbT5VbmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFVuaXF1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFVOSVFVRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmlxdWUoKSA8ZW0+VW5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRVbmlxdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb29sZWFuIHVuaXF1ZSA9IFVOSVFVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcGRhdGFibGUoKSA8ZW0+VXBkYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRVcGRhdGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBVUERBVEFCTEVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXBkYXRhYmxlKCkgPGVtPlVwZGF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VXBkYXRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQm9vbGVhbiB1cGRhdGFibGUgPSBVUERBVEFCTEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWJzdHJhY3RYbWxDb2x1bW4oKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5BQlNUUkFDVF9YTUxfQ09MVU1OOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluc2VydGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluc2VydGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SW5zZXJ0YWJsZShCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxDb2x1bW5fSW5zZXJ0YWJsZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpCisJeworCQlyZXR1cm4gaW5zZXJ0YWJsZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxDb2x1bW4jZ2V0SW5zZXJ0YWJsZSA8ZW0+SW5zZXJ0YWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SW5zZXJ0YWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluc2VydGFibGUoQm9vbGVhbiBuZXdJbnNlcnRhYmxlKQorCXsKKwkJQm9vbGVhbiBvbGRJbnNlcnRhYmxlID0gaW5zZXJ0YWJsZTsKKwkJaW5zZXJ0YWJsZSA9IG5ld0luc2VydGFibGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0NPTFVNTl9fSU5TRVJUQUJMRSwgb2xkSW5zZXJ0YWJsZSwgaW5zZXJ0YWJsZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk51bGxhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OdWxsYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OdWxsYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TnVsbGFibGUoQm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQ29sdW1uX051bGxhYmxlKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpCisJeworCQlyZXR1cm4gbnVsbGFibGU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQ29sdW1uI2dldE51bGxhYmxlIDxlbT5OdWxsYWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TnVsbGFibGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE51bGxhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiBuZXdOdWxsYWJsZSkKKwl7CisJCUJvb2xlYW4gb2xkTnVsbGFibGUgPSBudWxsYWJsZTsKKwkJbnVsbGFibGUgPSBuZXdOdWxsYWJsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQ09MVU1OX19OVUxMQUJMRSwgb2xkTnVsbGFibGUsIG51bGxhYmxlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRUYWJsZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbENvbHVtbl9UYWJsZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkKKwl7CisJCXJldHVybiB0YWJsZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxDb2x1bW4jZ2V0VGFibGUgPGVtPlRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUYWJsZShTdHJpbmcgbmV3VGFibGUpCisJeworCQlTdHJpbmcgb2xkVGFibGUgPSB0YWJsZTsKKwkJdGFibGUgPSBuZXdUYWJsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQ09MVU1OX19UQUJMRSwgb2xkVGFibGUsIHRhYmxlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmlxdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRVbmlxdWUoQm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQ29sdW1uX1VuaXF1ZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvb2xlYW4gZ2V0VW5pcXVlKCkKKwl7CisJCXJldHVybiB1bmlxdWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQ29sdW1uI2dldFVuaXF1ZSA8ZW0+VW5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlxdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFVuaXF1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFVuaXF1ZShCb29sZWFuIG5ld1VuaXF1ZSkKKwl7CisJCUJvb2xlYW4gb2xkVW5pcXVlID0gdW5pcXVlOworCQl1bmlxdWUgPSBuZXdVbmlxdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0NPTFVNTl9fVU5JUVVFLCBvbGRVbmlxdWUsIHVuaXF1ZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVwZGF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXBkYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VXBkYXRhYmxlKEJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbENvbHVtbl9VcGRhdGFibGUoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb29sZWFuIGdldFVwZGF0YWJsZSgpCisJeworCQlyZXR1cm4gdXBkYXRhYmxlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbENvbHVtbiNnZXRVcGRhdGFibGUgPGVtPlVwZGF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRVcGRhdGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRVcGRhdGFibGUoQm9vbGVhbiBuZXdVcGRhdGFibGUpCisJeworCQlCb29sZWFuIG9sZFVwZGF0YWJsZSA9IHVwZGF0YWJsZTsKKwkJdXBkYXRhYmxlID0gbmV3VXBkYXRhYmxlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9DT0xVTU5fX1VQREFUQUJMRSwgb2xkVXBkYXRhYmxlLCB1cGRhdGFibGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQ09MVU1OX19JTlNFUlRBQkxFOgorCQkJCXJldHVybiBnZXRJbnNlcnRhYmxlKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0NPTFVNTl9fTlVMTEFCTEU6CisJCQkJcmV0dXJuIGdldE51bGxhYmxlKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0NPTFVNTl9fVEFCTEU6CisJCQkJcmV0dXJuIGdldFRhYmxlKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0NPTFVNTl9fVU5JUVVFOgorCQkJCXJldHVybiBnZXRVbmlxdWUoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQ09MVU1OX19VUERBVEFCTEU6CisJCQkJcmV0dXJuIGdldFVwZGF0YWJsZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQ09MVU1OX19JTlNFUlRBQkxFOgorCQkJCXNldEluc2VydGFibGUoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQ09MVU1OX19OVUxMQUJMRToKKwkJCQlzZXROdWxsYWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9DT0xVTU5fX1RBQkxFOgorCQkJCXNldFRhYmxlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQ09MVU1OX19VTklRVUU6CisJCQkJc2V0VW5pcXVlKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0NPTFVNTl9fVVBEQVRBQkxFOgorCQkJCXNldFVwZGF0YWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9DT0xVTU5fX0lOU0VSVEFCTEU6CisJCQkJc2V0SW5zZXJ0YWJsZShJTlNFUlRBQkxFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0NPTFVNTl9fTlVMTEFCTEU6CisJCQkJc2V0TnVsbGFibGUoTlVMTEFCTEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQ09MVU1OX19UQUJMRToKKwkJCQlzZXRUYWJsZShUQUJMRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9DT0xVTU5fX1VOSVFVRToKKwkJCQlzZXRVbmlxdWUoVU5JUVVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0NPTFVNTl9fVVBEQVRBQkxFOgorCQkJCXNldFVwZGF0YWJsZShVUERBVEFCTEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0NPTFVNTl9fSU5TRVJUQUJMRToKKwkJCQlyZXR1cm4gSU5TRVJUQUJMRV9FREVGQVVMVCA9PSBudWxsID8gaW5zZXJ0YWJsZSAhPSBudWxsIDogIUlOU0VSVEFCTEVfRURFRkFVTFQuZXF1YWxzKGluc2VydGFibGUpOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9DT0xVTU5fX05VTExBQkxFOgorCQkJCXJldHVybiBOVUxMQUJMRV9FREVGQVVMVCA9PSBudWxsID8gbnVsbGFibGUgIT0gbnVsbCA6ICFOVUxMQUJMRV9FREVGQVVMVC5lcXVhbHMobnVsbGFibGUpOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9DT0xVTU5fX1RBQkxFOgorCQkJCXJldHVybiBUQUJMRV9FREVGQVVMVCA9PSBudWxsID8gdGFibGUgIT0gbnVsbCA6ICFUQUJMRV9FREVGQVVMVC5lcXVhbHModGFibGUpOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9DT0xVTU5fX1VOSVFVRToKKwkJCQlyZXR1cm4gVU5JUVVFX0VERUZBVUxUID09IG51bGwgPyB1bmlxdWUgIT0gbnVsbCA6ICFVTklRVUVfRURFRkFVTFQuZXF1YWxzKHVuaXF1ZSk7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0NPTFVNTl9fVVBEQVRBQkxFOgorCQkJCXJldHVybiBVUERBVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IHVwZGF0YWJsZSAhPSBudWxsIDogIVVQREFUQUJMRV9FREVGQVVMVC5lcXVhbHModXBkYXRhYmxlKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoaW5zZXJ0YWJsZTogIik7CisJCXJlc3VsdC5hcHBlbmQoaW5zZXJ0YWJsZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbnVsbGFibGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKG51bGxhYmxlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0YWJsZTogIik7CisJCXJlc3VsdC5hcHBlbmQodGFibGUpOworCQlyZXN1bHQuYXBwZW5kKCIsIHVuaXF1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQodW5pcXVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB1cGRhdGFibGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHVwZGF0YWJsZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLlRBQkxFKTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRVbmlxdWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKEpQQS5VTklRVUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sQ29sdW1uX1VuaXF1ZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROdWxsYWJsZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgQm9vbGVhblRyYW5zbGF0b3IoSlBBLk5VTExBQkxFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbENvbHVtbl9OdWxsYWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJbnNlcnRhYmxlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihKUEEuSU5TRVJUQUJMRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxDb2x1bW5fSW5zZXJ0YWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRVcGRhdGFibGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKEpQQS5VUERBVEFCTEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sQ29sdW1uX1VwZGF0YWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUYWJsZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuVEFCTEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sQ29sdW1uX1RhYmxlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorfSAvLyBBYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sRW1iZWRkZWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxFbWJlZGRlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZjNlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sRW1iZWRkZWQuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzZSBYbWwgRW1iZWRkZWQ8L2I+PC9lbT4nLgorICoKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxFbWJlZGRlZCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYbWxFbWJlZGRlZCBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyCit7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkgPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBYnN0cmFjdFhtbEVtYmVkZGVkKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuQUJTVFJBQ1RfWE1MX0VNQkVEREVEOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl9BdHRyaWJ1dGVPdmVycmlkZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSB7CisJCWlmIChhdHRyaWJ1dGVPdmVycmlkZXMgPT0gbnVsbCkKKwkJeworCQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPihYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVMpOworCQl9CisJCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTOgorCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTOgorCQkJCWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmNsZWFyKCk7CisJCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBdHRyaWJ1dGVPdmVycmlkZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVM6CisJCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUzoKKwkJCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZU92ZXJyaWRlcy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKwkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSX19BVFRSSUJVVEVfT1ZFUlJJREVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfX0FUVFJJQlVURV9PVkVSUklERVM6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQXR0cmlidXRlT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyX0F0dHJpYnV0ZU92ZXJyaWRlcygpKTsKKwl9CisKK30gLy8gQmFzZVhtbEVtYmVkZGVkCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwZmVkMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDUwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TXVsdGkgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2I+PC9lbT4nLgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRPcmRlckJ5IDxlbT5PcmRlciBCeTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE1hcEtleSA8ZW0+TWFwIEtleTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIGltcGxlbWVudHMgWG1sTWFwcGVkQnlNYXBwaW5nLCBYbWxKb2luVGFibGVNYXBwaW5nCit7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZEJ5KCkgPGVtPk1hcHBlZCBCeTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFwcGVkQnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9CWV9FREVGQVVMVCA9IG51bGw7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkQnkoKSA8ZW0+TWFwcGVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBwZWRCeSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBtYXBwZWRCeSA9IE1BUFBFRF9CWV9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luVGFibGUoKSA8ZW0+Sm9pbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Sm9pblRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sSm9pblRhYmxlIGpvaW5UYWJsZTsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJCeSgpIDxlbT5PcmRlciBCeTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JkZXJCeSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJfQllfRURFRkFVTFQgPSBudWxsOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyQnkoKSA8ZW0+T3JkZXIgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9yZGVyQnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgb3JkZXJCeSA9IE9SREVSX0JZX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleSgpIDxlbT5NYXAgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBNYXBLZXkgbWFwS2V5OworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBCeTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TWFwcGVkQnkoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkQnlNYXBwaW5nX01hcHBlZEJ5KCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKQorCXsKKwkJcmV0dXJuIG1hcHBlZEJ5OworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBwZWRCeSA8ZW0+TWFwcGVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG5ld01hcHBlZEJ5KQorCXsKKwkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gbWFwcGVkQnk7CisJCW1hcHBlZEJ5ID0gbmV3TWFwcGVkQnk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlksIG9sZE1hcHBlZEJ5LCBtYXBwZWRCeSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZU1hcHBpbmdfSm9pblRhYmxlKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkKKwl7CisJCXJldHVybiBqb2luVGFibGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSBuZXdKb2luVGFibGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxKb2luVGFibGUgb2xkSm9pblRhYmxlID0gam9pblRhYmxlOworCQlqb2luVGFibGUgPSBuZXdKb2luVGFibGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFLCBvbGRKb2luVGFibGUsIG5ld0pvaW5UYWJsZSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldEpvaW5UYWJsZSA8ZW0+Sm9pbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Sm9pblRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSBuZXdKb2luVGFibGUpCisJeworCQlpZiAobmV3Sm9pblRhYmxlICE9IGpvaW5UYWJsZSkKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoam9pblRhYmxlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWpvaW5UYWJsZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdKb2luVGFibGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Sm9pblRhYmxlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Sm9pblRhYmxlKG5ld0pvaW5UYWJsZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRSwgbmV3Sm9pblRhYmxlLCBuZXdKb2luVGFibGUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE9yZGVyQnkoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfT3JkZXJCeSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JkZXJCeSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRPcmRlckJ5KCkgeworCQlyZXR1cm4gb3JkZXJCeTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0T3JkZXJCeSA8ZW0+T3JkZXIgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRPcmRlckJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T3JkZXJCeShTdHJpbmcgbmV3T3JkZXJCeSkgeworCQlTdHJpbmcgb2xkT3JkZXJCeSA9IG9yZGVyQnk7CisJCW9yZGVyQnkgPSBuZXdPcmRlckJ5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQlksIG9sZE9yZGVyQnksIG9yZGVyQnkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldE1hcEtleShNYXBLZXkpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBLZXkoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1hcEtleSBnZXRNYXBLZXkoKSB7CisJCXJldHVybiBtYXBLZXk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWFwS2V5KE1hcEtleSBuZXdNYXBLZXksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlNYXBLZXkgb2xkTWFwS2V5ID0gbWFwS2V5OworCQltYXBLZXkgPSBuZXdNYXBLZXk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZLCBvbGRNYXBLZXksIG5ld01hcEtleSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE1hcEtleSA8ZW0+TWFwIEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0TWFwS2V5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFwS2V5KE1hcEtleSBuZXdNYXBLZXkpIHsKKwkJaWYgKG5ld01hcEtleSAhPSBtYXBLZXkpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKG1hcEtleSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCltYXBLZXkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3TWFwS2V5ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01hcEtleSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldE1hcEtleShuZXdNYXBLZXksIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVksIG5ld01hcEtleSwgbmV3TWFwS2V5KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOgorCQkJCXJldHVybiBiYXNpY1NldEpvaW5UYWJsZShudWxsLCBtc2dzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVk6CisJCQkJcmV0dXJuIGJhc2ljU2V0TWFwS2V5KG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFBFRF9CWToKKwkJCQlyZXR1cm4gZ2V0TWFwcGVkQnkoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU6CisJCQkJcmV0dXJuIGdldEpvaW5UYWJsZSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQlk6CisJCQkJcmV0dXJuIGdldE9yZGVyQnkoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVk6CisJCQkJcmV0dXJuIGdldE1hcEtleSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFBFRF9CWToKKwkJCQlzZXRNYXBwZWRCeSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOgorCQkJCXNldEpvaW5UYWJsZSgoWG1sSm9pblRhYmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9CWToKKwkJCQlzZXRPcmRlckJ5KChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVk6CisJCQkJc2V0TWFwS2V5KChNYXBLZXkpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFBFRF9CWToKKwkJCQlzZXRNYXBwZWRCeShNQVBQRURfQllfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU6CisJCQkJc2V0Sm9pblRhYmxlKChYbWxKb2luVGFibGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQlk6CisJCQkJc2V0T3JkZXJCeShPUkRFUl9CWV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWToKKwkJCQlzZXRNYXBLZXkoKE1hcEtleSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQUEVEX0JZOgorCQkJCXJldHVybiBNQVBQRURfQllfRURFRkFVTFQgPT0gbnVsbCA/IG1hcHBlZEJ5ICE9IG51bGwgOiAhTUFQUEVEX0JZX0VERUZBVUxULmVxdWFscyhtYXBwZWRCeSk7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOgorCQkJCXJldHVybiBqb2luVGFibGUgIT0gbnVsbDsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0JZOgorCQkJCXJldHVybiBPUkRFUl9CWV9FREVGQVVMVCA9PSBudWxsID8gb3JkZXJCeSAhPSBudWxsIDogIU9SREVSX0JZX0VERUZBVUxULmVxdWFscyhvcmRlckJ5KTsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVk6CisJCQkJcmV0dXJuIG1hcEtleSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBwZWRCeU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NQVBQRURfQllfTUFQUElOR19fTUFQUEVEX0JZOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5UYWJsZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9NQVBQSU5HX19KT0lOX1RBQkxFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwcGVkQnlNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfQllfTUFQUElOR19fTUFQUEVEX0JZOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFBFRF9CWTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luVGFibGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX01BUFBJTkdfX0pPSU5fVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG1hcHBlZEJ5OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXBwZWRCeSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgb3JkZXJCeTogIik7CisJCXJlc3VsdC5hcHBlbmQob3JkZXJCeSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgeworCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5NQVBQRURfQlkpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPcmRlckJ5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5PUkRFUl9CWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfT3JkZXJCeSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIE1hcEtleS5idWlsZFRyYW5zbGF0b3IoSlBBLk1BUF9LRVksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX01hcEtleSgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxOYW1lZENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbE5hbWVkQ29sdW1uLmphdmEKaW5kZXggMDQxZThjMi4uMWFjMDRmMiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbE5hbWVkQ29sdW1uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbE5hbWVkQ29sdW1uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsMTYgKzEwLDEyIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9ycy5Pcm1YbWxNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5lbWYuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMzIsMTIgKzI4LDIwIEBACiAgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCiAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxOYW1lZENvbHVtbiNnZXRDb2x1bW5EZWZpbml0aW9uIDxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTmFtZWRDb2x1bW4jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbigpCiAgKiBAbW9kZWwga2luZD0iY2xhc3MiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYbWxOYW1lZENvbHVtbiBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbE5hbWVkQ29sdW1uCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYbWxOYW1lZENvbHVtbiBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKIHsKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uRGVmaW5pdGlvbigpIDxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTEwLDcgKzExNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uIERlZmluaXRpb248L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldENvbHVtbkRlZmluaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWRDb2x1bW5fQ29sdW1uRGVmaW5pdGlvbigpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbE5hbWVkQ29sdW1uX0NvbHVtbkRlZmluaXRpb24oKQogCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCkBAIC0xNDUsNyArMTQ5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29sdW1uX05hbWUoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbl9OYW1lKCkKIAkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCiAJICogQGdlbmVyYXRlZAogCSAqLwpAQCAtMjY2LDggKzI3MCwxNyBAQAogCX0KIAkKIAlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIG5hbWVOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKHRoaXMubm9kZSwgT3JtWG1sTWFwcGVyLk5BTUUpOwotCQlyZXR1cm4gKG5hbWVOb2RlID09IG51bGwpID8gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogYnVpbGRUZXh0UmFuZ2UobmFtZU5vZGUpOworCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5OQU1FKTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbl9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkNPTFVNTl9ERUZJTklUSU9OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbE5hbWVkQ29sdW1uX0NvbHVtbkRlZmluaXRpb24oKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKIAl9CiAKIH0gLy8gQWJzdHJhY3RYbWxOYW1lZENvbHVtbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI5MzIyZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKQEAgLTAsMCArMSwzODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlbGF0aW9uc2hpcCBNYXBwaW5nPC9iPjwvZW0+Jy4KKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldFRhcmdldEVudGl0eSA8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRGZXRjaCA8ZW0+RmV0Y2g8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0Q2FzY2FkZSA8ZW0+Q2FzY2FkZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcKK3sKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0RW50aXR5KCkgPGVtPlRhcmdldCBFbnRpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRhcmdldEVudGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0VOVElUWV9FREVGQVVMVCA9IG51bGw7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0RW50aXR5KCkgPGVtPlRhcmdldCBFbnRpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRhcmdldEVudGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRFbnRpdHkgPSBUQVJHRVRfRU5USVRZX0VERUZBVUxUOworCS8qKgorCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAorCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEZldGNoVHlwZSBGRVRDSF9FREVGQVVMVCA9IG51bGw7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmV0Y2goKSA8ZW0+RmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZldGNoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGZldGNoID0gRkVUQ0hfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZSgpIDxlbT5DYXNjYWRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDYXNjYWRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ2FzY2FkZVR5cGUgY2FzY2FkZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5BQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkc7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRUYXJnZXRFbnRpdHkoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX1RhcmdldEVudGl0eSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIHRhcmdldEVudGl0eTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldFRhcmdldEVudGl0eSA8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VGFyZ2V0RW50aXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyBuZXdUYXJnZXRFbnRpdHkpIHsKKwkJU3RyaW5nIG9sZFRhcmdldEVudGl0eSA9IHRhcmdldEVudGl0eTsKKwkJdGFyZ2V0RW50aXR5ID0gbmV3VGFyZ2V0RW50aXR5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWSwgb2xkVGFyZ2V0RW50aXR5LCB0YXJnZXRFbnRpdHkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJMQVpZIjwvY29kZT4uCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCisJICogQHNlZSAjc2V0RmV0Y2goRmV0Y2hUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0ZldGNoKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iTEFaWSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKKwkJcmV0dXJuIGZldGNoOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0RmV0Y2ggPGVtPkZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCisJICogQHNlZSAjZ2V0RmV0Y2goKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpIHsKKwkJRmV0Y2hUeXBlIG9sZEZldGNoID0gZmV0Y2g7CisJCWZldGNoID0gbmV3RmV0Y2ggPT0gbnVsbCA/IEZFVENIX0VERUZBVUxUIDogbmV3RmV0Y2g7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSCwgb2xkRmV0Y2gsIGZldGNoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRDYXNjYWRlKENhc2NhZGVUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7CisJCXJldHVybiBjYXNjYWRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENhc2NhZGUoQ2FzY2FkZVR5cGUgbmV3Q2FzY2FkZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCUNhc2NhZGVUeXBlIG9sZENhc2NhZGUgPSBjYXNjYWRlOworCQljYXNjYWRlID0gbmV3Q2FzY2FkZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREUsIG9sZENhc2NhZGUsIG5ld0Nhc2NhZGUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0Q2FzY2FkZSA8ZW0+Q2FzY2FkZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Q2FzY2FkZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENhc2NhZGUoQ2FzY2FkZVR5cGUgbmV3Q2FzY2FkZSkgeworCQlpZiAobmV3Q2FzY2FkZSAhPSBjYXNjYWRlKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChjYXNjYWRlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNhc2NhZGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q2FzY2FkZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYXNjYWRlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Q2FzY2FkZShuZXdDYXNjYWRlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFLCBuZXdDYXNjYWRlLCBuZXdDYXNjYWRlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOgorCQkJCXJldHVybiBiYXNpY1NldENhc2NhZGUobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWToKKwkJCQlyZXR1cm4gZ2V0VGFyZ2V0RW50aXR5KCk7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDoKKwkJCQlyZXR1cm4gZ2V0RmV0Y2goKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU6CisJCQkJcmV0dXJuIGdldENhc2NhZGUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZOgorCQkJCXNldFRhcmdldEVudGl0eSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDoKKwkJCQlzZXRGZXRjaCgoRmV0Y2hUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOgorCQkJCXNldENhc2NhZGUoKENhc2NhZGVUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZOgorCQkJCXNldFRhcmdldEVudGl0eShUQVJHRVRfRU5USVRZX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDoKKwkJCQlzZXRGZXRjaChGRVRDSF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERToKKwkJCQlzZXRDYXNjYWRlKChDYXNjYWRlVHlwZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWToKKwkJCQlyZXR1cm4gVEFSR0VUX0VOVElUWV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0RW50aXR5ICE9IG51bGwgOiAhVEFSR0VUX0VOVElUWV9FREVGQVVMVC5lcXVhbHModGFyZ2V0RW50aXR5KTsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOgorCQkJCXJldHVybiBmZXRjaCAhPSBGRVRDSF9FREVGQVVMVDsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU6CisJCQkJcmV0dXJuIGNhc2NhZGUgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAodGFyZ2V0RW50aXR5OiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh0YXJnZXRFbnRpdHkpOworCQlyZXN1bHQuYXBwZW5kKCIsIGZldGNoOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChmZXRjaCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB0YXJnZXQtZW50aXR5IGF0dHJpYnV0ZS4KKwkgKi8KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuVEFSR0VUX0VOVElUWSk7CisJfQorCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGFyZ2V0RW50aXR5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5UQVJHRVRfRU5USVRZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfVGFyZ2V0RW50aXR5KCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEZldGNoVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5GRVRDSCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0ZldGNoKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhc2NhZGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gQ2FzY2FkZVR5cGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5DQVNDQURFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfQ2FzY2FkZSgpKTsKKwl9CisJCit9IC8vIFJlbGF0aW9uc2hpcE1hcHBpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MGQ5OWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsNjE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2I+PC9lbT4nLgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0T3B0aW9uYWwgPGVtPk9wdGlvbmFsPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBleHRlbmRzIEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyBpbXBsZW1lbnRzIFhtbEpvaW5UYWJsZU1hcHBpbmcsIFhtbEpvaW5Db2x1bW5zTWFwcGluZywgWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAKK3sKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luVGFibGUoKSA8ZW0+Sm9pbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Sm9pblRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sSm9pblRhYmxlIGpvaW5UYWJsZTsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luQ29sdW1ucygpIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Sm9pbkNvbHVtbnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxKb2luQ29sdW1uPiBqb2luQ29sdW1uczsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSURfRURFRkFVTFQgPSBudWxsOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJvb2xlYW4gaWQgPSBJRF9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwc0lkKCkgPGVtPk1hcHMgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcHNJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQU19JRF9FREVGQVVMVCA9IG51bGw7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwc0lkKCkgPGVtPk1hcHMgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcHNJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBtYXBzSWQgPSBNQVBTX0lEX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpb25hbCgpIDxlbT5PcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3B0aW9uYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBPUFRJT05BTF9FREVGQVVMVCA9IG51bGw7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW9uYWwoKSA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9wdGlvbmFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQm9vbGVhbiBvcHRpb25hbCA9IE9QVElPTkFMX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkc7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlTWFwcGluZ19Kb2luVGFibGUoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKQorCXsKKwkJcmV0dXJuIGpvaW5UYWJsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIG5ld0pvaW5UYWJsZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbEpvaW5UYWJsZSBvbGRKb2luVGFibGUgPSBqb2luVGFibGU7CisJCWpvaW5UYWJsZSA9IG5ld0pvaW5UYWJsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFLCBvbGRKb2luVGFibGUsIG5ld0pvaW5UYWJsZSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyNnZXRKb2luVGFibGUgPGVtPkpvaW4gVGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEpvaW5UYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgbmV3Sm9pblRhYmxlKQorCXsKKwkJaWYgKG5ld0pvaW5UYWJsZSAhPSBqb2luVGFibGUpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGpvaW5UYWJsZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClqb2luVGFibGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEUsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0pvaW5UYWJsZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdKb2luVGFibGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Sm9pblRhYmxlKG5ld0pvaW5UYWJsZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEUsIG5ld0pvaW5UYWJsZSwgbmV3Sm9pblRhYmxlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW59LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pbkNvbHVtbnNNYXBwaW5nX0pvaW5Db2x1bW5zKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpCisJeworCQlpZiAoam9pbkNvbHVtbnMgPT0gbnVsbCkKKwkJeworCQkJam9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSm9pbkNvbHVtbj4oWG1sSm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlMpOworCQl9CisJCXJldHVybiBqb2luQ29sdW1uczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldElkKEJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxEZXJpdmVkSWRfMl8wX0lkKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBnZXRJZCgpCisJeworCQlyZXR1cm4gaWQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkKEJvb2xlYW4gbmV3SWQpCisJeworCQlCb29sZWFuIG9sZElkID0gaWQ7CisJCWlkID0gbmV3SWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHMgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcHMgSWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcyBJZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TWFwc0lkKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHNJZF8yXzBfTWFwc0lkKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TWFwc0lkKCkKKwl7CisJCXJldHVybiBtYXBzSWQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBzSWQgPGVtPk1hcHMgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcHMgSWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1hcHNJZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1hcHNJZChTdHJpbmcgbmV3TWFwc0lkKQorCXsKKwkJU3RyaW5nIG9sZE1hcHNJZCA9IG1hcHNJZDsKKwkJbWFwc0lkID0gbmV3TWFwc0lkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFNfSUQsIG9sZE1hcHNJZCwgbWFwc0lkKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRPcHRpb25hbChCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nX09wdGlvbmFsKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKKwkJcmV0dXJuIG9wdGlvbmFsOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0T3B0aW9uYWwgPGVtPk9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0T3B0aW9uYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKSB7CisJCUJvb2xlYW4gb2xkT3B0aW9uYWwgPSBvcHRpb25hbDsKKwkJb3B0aW9uYWwgPSBuZXdPcHRpb25hbDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUFRJT05BTCwgb2xkT3B0aW9uYWwsIG9wdGlvbmFsKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRToKKwkJCQlyZXR1cm4gYmFzaWNTZXRKb2luVGFibGUobnVsbCwgbXNncyk7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9DT0xVTU5TOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Sm9pbkNvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOgorCQkJCXJldHVybiBnZXRKb2luVGFibGUoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlM6CisJCQkJcmV0dXJuIGdldEpvaW5Db2x1bW5zKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSUQ6CisJCQkJcmV0dXJuIGdldElkKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQU19JRDoKKwkJCQlyZXR1cm4gZ2V0TWFwc0lkKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUw6CisJCQkJcmV0dXJuIGdldE9wdGlvbmFsKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU6CisJCQkJc2V0Sm9pblRhYmxlKChYbWxKb2luVGFibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlM6CisJCQkJZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOworCQkJCWdldEpvaW5Db2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxKb2luQ29sdW1uPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0lEOgorCQkJCXNldElkKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQU19JRDoKKwkJCQlzZXRNYXBzSWQoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX09QVElPTkFMOgorCQkJCXNldE9wdGlvbmFsKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRToKKwkJCQlzZXRKb2luVGFibGUoKFhtbEpvaW5UYWJsZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9DT0xVTU5TOgorCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSUQ6CisJCQkJc2V0SWQoSURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBTX0lEOgorCQkJCXNldE1hcHNJZChNQVBTX0lEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUw6CisJCQkJc2V0T3B0aW9uYWwoT1BUSU9OQUxfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRToKKwkJCQlyZXR1cm4gam9pblRhYmxlICE9IG51bGw7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9DT0xVTU5TOgorCQkJCXJldHVybiBqb2luQ29sdW1ucyAhPSBudWxsICYmICFqb2luQ29sdW1ucy5pc0VtcHR5KCk7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSUQ6CisJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQU19JRDoKKwkJCQlyZXR1cm4gTUFQU19JRF9FREVGQVVMVCA9PSBudWxsID8gbWFwc0lkICE9IG51bGwgOiAhTUFQU19JRF9FREVGQVVMVC5lcXVhbHMobWFwc0lkKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUFRJT05BTDoKKwkJCQlyZXR1cm4gT1BUSU9OQUxfRURFRkFVTFQgPT0gbnVsbCA/IG9wdGlvbmFsICE9IG51bGwgOiAhT1BUSU9OQUxfRURFRkFVTFQuZXF1YWxzKG9wdGlvbmFsKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pblRhYmxlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9NQVBQSU5HX19KT0lOX1RBQkxFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5Db2x1bW5zTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9KT0lOX0NPTFVNTlNfTUFQUElOR19fSk9JTl9DT0xVTU5TOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbERlcml2ZWRJZF8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSUQ6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfREVSSVZFRF9JRF8yMF9fSUQ7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwc0lkXzJfMC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBTX0lEOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX01BUFNfSURfMjBfX01BUFNfSUQ7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5UYWJsZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfTUFQUElOR19fSk9JTl9UQUJMRTogcmV0dXJuIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luQ29sdW1uc01hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fQ09MVU1OU19NQVBQSU5HX19KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fQ09MVU1OUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxEZXJpdmVkSWRfMl8wLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfREVSSVZFRF9JRF8yMF9fSUQ6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0lEOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcHNJZF8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9NQVBTX0lEXzIwX19NQVBTX0lEOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBTX0lEOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7CisJCXJlc3VsdC5hcHBlbmQoaWQpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1hcHNJZDogIik7CisJCXJlc3VsdC5hcHBlbmQobWFwc0lkKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBvcHRpb25hbDogIik7CisJCXJlc3VsdC5hcHBlbmQob3B0aW9uYWwpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqCisJCisJcHVibGljIFRleHRSYW5nZSBnZXRNYXBzSWRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBMl8wLk1BUFNfSUQpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldERlcml2ZWRJZFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEyXzAuSUQpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPcHRpb25hbFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuT1BUSU9OQUwsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19PcHRpb25hbCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBzSWRUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLk1BUFNfSUQsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBzSWRfMl8wX01hcHNJZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJZFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuSUQsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxEZXJpdmVkSWRfMl8wX0lkKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpvaW5Db2x1bW5UcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sSm9pbkNvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBLkpPSU5fQ09MVU1OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luQ29sdW1uc01hcHBpbmdfSm9pbkNvbHVtbnMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpvaW5UYWJsZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxKb2luVGFibGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5KT0lOX1RBQkxFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luVGFibGVNYXBwaW5nX0pvaW5UYWJsZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZWVhZWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sVGFibGUuamF2YQpAQCAtMCwwICsxLDQzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWJzdHJhY3QgWG1sIEJhc2UgVGFibGU8L2I+PC9lbT4nLgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZSNnZXRVbmlxdWVDb25zdHJhaW50cyA8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFRhYmxlKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhtbFRhYmxlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGFsb2coKSA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2F0YWxvZygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRhbG9nKCkgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENhdGFsb2coKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgY2F0YWxvZyA9IENBVEFMT0dfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NoZW1hKCkgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2NoZW1hKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NoZW1hKCkgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2NoZW1hKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHNjaGVtYSA9IFNDSEVNQV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXF1ZUNvbnN0cmFpbnRzKCkgPGVtPlVuaXF1ZSBDb25zdHJhaW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRVbmlxdWVDb25zdHJhaW50cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0WG1sVGFibGUoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5BQlNUUkFDVF9YTUxfVEFCTEU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sVGFibGVfTmFtZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVGFibGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCisJeworCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7CisJCW5hbWUgPSBuZXdOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Q2F0YWxvZyhTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFRhYmxlX0NhdGFsb2coKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkKKwl7CisJCXJldHVybiBjYXRhbG9nOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENhdGFsb2coKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nKFN0cmluZyBuZXdDYXRhbG9nKQorCXsKKwkJU3RyaW5nIG9sZENhdGFsb2cgPSBjYXRhbG9nOworCQljYXRhbG9nID0gbmV3Q2F0YWxvZzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX0NBVEFMT0csIG9sZENhdGFsb2csIGNhdGFsb2cpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFNjaGVtYShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFRhYmxlX1NjaGVtYSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpCisJeworCQlyZXR1cm4gc2NoZW1hOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFNjaGVtYSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgbmV3U2NoZW1hKQorCXsKKwkJU3RyaW5nIG9sZFNjaGVtYSA9IHNjaGVtYTsKKwkJc2NoZW1hID0gbmV3U2NoZW1hOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fU0NIRU1BLCBvbGRTY2hlbWEsIHNjaGVtYSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaXF1ZSBDb25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaXF1ZSBDb25zdHJhaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXF1ZSBDb25zdHJhaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sVGFibGVfVW5pcXVlQ29uc3RyYWludHMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCkKKwl7CisJCWlmICh1bmlxdWVDb25zdHJhaW50cyA9PSBudWxsKQorCQl7CisJCQl1bmlxdWVDb25zdHJhaW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PihYbWxVbmlxdWVDb25zdHJhaW50LmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTKTsKKwkJfQorCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRVbmlxdWVDb25zdHJhaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fTkFNRToKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fQ0FUQUxPRzoKKwkJCQlyZXR1cm4gZ2V0Q2F0YWxvZygpOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fU0NIRU1BOgorCQkJCXJldHVybiBnZXRTY2hlbWEoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzoKKwkJCQlyZXR1cm4gZ2V0VW5pcXVlQ29uc3RyYWludHMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RBQkxFX19OQU1FOgorCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fQ0FUQUxPRzoKKwkJCQlzZXRDYXRhbG9nKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX1NDSEVNQToKKwkJCQlzZXRTY2hlbWEoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOgorCQkJCWdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuY2xlYXIoKTsKKwkJCQlnZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVW5pcXVlQ29uc3RyYWludD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX05BTUU6CisJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RBQkxFX19DQVRBTE9HOgorCQkJCXNldENhdGFsb2coQ0FUQUxPR19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fU0NIRU1BOgorCQkJCXNldFNjaGVtYShTQ0hFTUFfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzoKKwkJCQlnZXRVbmlxdWVDb25zdHJhaW50cygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX05BTUU6CisJCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX0NBVEFMT0c6CisJCQkJcmV0dXJuIENBVEFMT0dfRURFRkFVTFQgPT0gbnVsbCA/IGNhdGFsb2cgIT0gbnVsbCA6ICFDQVRBTE9HX0VERUZBVUxULmVxdWFscyhjYXRhbG9nKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX1NDSEVNQToKKwkJCQlyZXR1cm4gU0NIRU1BX0VERUZBVUxUID09IG51bGwgPyBzY2hlbWEgIT0gbnVsbCA6ICFTQ0hFTUFfRURFRkFVTFQuZXF1YWxzKHNjaGVtYSk7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM6CisJCQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnRzICE9IG51bGwgJiYgIXVuaXF1ZUNvbnN0cmFpbnRzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQobmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgY2F0YWxvZzogIik7CisJCXJlc3VsdC5hcHBlbmQoY2F0YWxvZyk7CisJCXJlc3VsdC5hcHBlbmQoIiwgc2NoZW1hOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChzY2hlbWEpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuTkFNRSk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuQ0FUQUxPRyk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5TQ0hFTUEpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5OQU1FLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFRhYmxlX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQ0FUQUxPRywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxUYWJsZV9DYXRhbG9nKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNjaGVtYVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuU0NIRU1BLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFRhYmxlX1NjaGVtYSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFVuaXF1ZUNvbnN0cmFpbnQuYnVpbGRUcmFuc2xhdG9yKEpQQS5VTklRVUVfQ09OU1RSQUlOVCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxUYWJsZV9VbmlxdWVDb25zdHJhaW50cygpKTsKKwl9CisKK30gLy8gQWJzdHJhY3RYbWxCYXNlVGFibGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxUeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbFR5cGVNYXBwaW5nLmphdmEKaW5kZXggYWM2MzNlOS4uMzIyYjNlYSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbFR5cGVNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbFR5cGVNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTQsMTIgKzE0LDkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzLk9ybVhtbE1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmVtZi5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0zMiwyNSArMjksMzAgQEAKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcjZ2V0QWNjZXNzIDxlbT5BY2Nlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nI2dldE1ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nI2dldEF0dHJpYnV0ZXMgPGVtPkF0dHJpYnV0ZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KICAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sVHlwZU1hcHBpbmcoKQogICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0WG1sVHlwZU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYbWxUeXBlTWFwcGluZyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFR5cGVNYXBwaW5nCiB7CiAJLyoqCisJICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0CisJICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQWNjZXNzVHlwZSBBQ0NFU1NfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzKCkgPGVtPkFjY2VzczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWNjZXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBhY2Nlc3MgPSBBQ0NFU1NfRURFRkFVTFQ7CisKKwkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NOYW1lKCkgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNzEsMjIgKzczLDYgQEAKIAlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZSA9IENMQVNTX05BTUVfRURFRkFVTFQ7CiAKIAkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBY2Nlc3NUeXBlIEFDQ0VTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3MoKSA8ZW0+QWNjZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGFjY2VzcyA9IEFDQ0VTU19FREVGQVVMVDsKLQotCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRhZGF0YUNvbXBsZXRlKCkgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTE2Nyw3ICsxNTMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldENsYXNzTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0NsYXNzTmFtZSgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUeXBlTWFwcGluZ19DbGFzc05hbWUoKQogCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwpAQCAtMTk0LDcgKzE4MCw2IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iUFJPUEVSVFkiPC9jb2RlPi4KIAkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZX0uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8cD4KQEAgLTIwNSw4ICsxOTAsOCBAQAogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzczwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZQogCSAqIEBzZWUgI3NldEFjY2VzcyhBY2Nlc3NUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19BY2Nlc3MoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJQUk9QRVJUWSIKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFjY2Vzc0hvbGRlcl9BY2Nlc3MoKQorCSAqIEBtb2RlbAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKQpAQCAtMjQxLDcgKzIyNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfTWV0YWRhdGFDb21wbGV0ZSgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUeXBlTWFwcGluZ19NZXRhZGF0YUNvbXBsZXRlKCkKIAkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KQEAgLTI3Niw3ICsyNjEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0Rlc2NyaXB0aW9uKCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFR5cGVNYXBwaW5nX0Rlc2NyaXB0aW9uKCkKIAkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCiAJICogQGdlbmVyYXRlZAogCSAqLwpAQCAtMzExLDcgKzI5Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCiAJICogQHNlZSAjc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19BdHRyaWJ1dGVzKCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKQogCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCkBAIC0zODcsMTAgKzM3MiwxMCBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FOgotCQkJCXJldHVybiBnZXRDbGFzc05hbWUoKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BQ0NFU1M6CiAJCQkJcmV0dXJuIGdldEFjY2VzcygpOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX05BTUU6CisJCQkJcmV0dXJuIGdldENsYXNzTmFtZSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFOgogCQkJCXJldHVybiBnZXRNZXRhZGF0YUNvbXBsZXRlKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fREVTQ1JJUFRJT046CkBAIC00MTEsMTIgKzM5NiwxMiBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FOgotCQkJCXNldENsYXNzTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTOgogCQkJCXNldEFjY2VzcygoQWNjZXNzVHlwZSluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX05BTUU6CisJCQkJc2V0Q2xhc3NOYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19NRVRBREFUQV9DT01QTEVURToKIAkJCQlzZXRNZXRhZGF0YUNvbXBsZXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CkBAIC00NDAsMTIgKzQyNSwxMiBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FOgotCQkJCXNldENsYXNzTmFtZShDTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTOgogCQkJCXNldEFjY2VzcyhBQ0NFU1NfRURFRkFVTFQpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FOgorCQkJCXNldENsYXNzTmFtZShDTEFTU19OQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEU6CiAJCQkJc2V0TWV0YWRhdGFDb21wbGV0ZShNRVRBREFUQV9DT01QTEVURV9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwpAQCAtNDY5LDEwICs0NTQsMTAgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY2xhc3NOYW1lICE9IG51bGwgOiAhQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoY2xhc3NOYW1lKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BQ0NFU1M6CiAJCQkJcmV0dXJuIGFjY2VzcyAhPSBBQ0NFU1NfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRToKKwkJCQlyZXR1cm4gQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY2xhc3NOYW1lICE9IG51bGwgOiAhQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoY2xhc3NOYW1lKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19NRVRBREFUQV9DT01QTEVURToKIAkJCQlyZXR1cm4gTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQgPT0gbnVsbCA/IG1ldGFkYXRhQ29tcGxldGUgIT0gbnVsbCA6ICFNRVRBREFUQV9DT01QTEVURV9FREVGQVVMVC5lcXVhbHMobWV0YWRhdGFDb21wbGV0ZSk7CiAJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fREVTQ1JJUFRJT046CkBAIC00OTQsMTAgKzQ3OSwxMCBAQAogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY2xhc3NOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjbGFzc05hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjY2VzczogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoYWNjZXNzOiAiKTsKIAkJcmVzdWx0LmFwcGVuZChhY2Nlc3MpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNsYXNzTmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoY2xhc3NOYW1lKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBtZXRhZGF0YUNvbXBsZXRlOiAiKTsKIAkJcmVzdWx0LmFwcGVuZChtZXRhZGF0YUNvbXBsZXRlKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7CkBAIC01MDgsMTkgKzQ5MywyOSBAQAogCQogCiAJcHVibGljIFRleHRSYW5nZSBnZXRDbGFzc1RleHRSYW5nZSgpIHsKLQkJSURPTU5vZGUgY2xhc3NOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKG5vZGUsIE9ybVhtbE1hcHBlci5DTEFTUyk7Ci0JCWlmIChjbGFzc05vZGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGJ1aWxkVGV4dFJhbmdlKGNsYXNzTm9kZSk7Ci0JCX0KLQkJcmV0dXJuIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuQ0xBU1MpOwogCX0KIAogCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlc1RleHRSYW5nZSgpIHsKLQkJSURPTU5vZGUgYXR0cmlidXRlc05vZGUgPSAoSURPTU5vZGUpIERPTVV0aWxpdGllcy5nZXROb2RlQ2hpbGQobm9kZSwgT3JtWG1sTWFwcGVyLkFUVFJJQlVURVMpOwotCQlpZiAoYXR0cmlidXRlc05vZGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGJ1aWxkVGV4dFJhbmdlKGF0dHJpYnV0ZXNOb2RlKTsKLQkJfQotCQlyZXR1cm4gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5BVFRSSUJVVEVTKTsKIAl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkNMQVNTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUeXBlTWFwcGluZ19DbGFzc05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWV0YWRhdGFDb21wbGV0ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTUVUQURBVEFfQ09NUExFVEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFR5cGVNYXBwaW5nX01ldGFkYXRhQ29tcGxldGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkRFU0NSSVBUSU9OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUeXBlTWFwcGluZ19EZXNjcmlwdGlvbigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQXR0cmlidXRlc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBBdHRyaWJ1dGVzLmJ1aWxkVHJhbnNsYXRvcigpOworCX0JCiAKIH0gLy8gVHlwZU1hcHBpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQXR0cmlidXRlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BdHRyaWJ1dGVzLmphdmEKaW5kZXggYTM4NDVjNy4uZTQwZmVhMiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BdHRyaWJ1dGVzLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9BdHRyaWJ1dGVzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwxNSArOSwyNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZXNfMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTQ4LDEyICs1OCw0MSBAQAogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QXR0cmlidXRlcygpCiAgKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVzIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAorcHVibGljIGNsYXNzIEF0dHJpYnV0ZXMgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxBdHRyaWJ1dGVzXzJfMAogewogCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkgPGVtPkVsZW1lbnQgQ29sbGVjdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sRWxlbWVudENvbGxlY3Rpb24+IGVsZW1lbnRDb2xsZWN0aW9uczsKKworCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkcygpIDxlbT5JZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xNzUsNiArMjE0LDY0IEBACiAJfQogCiAJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVzXzJfMF9EZXNjcmlwdGlvbigpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKKwl7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKKwl7CisJCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50IENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVsZW1lbnQgQ29sbGVjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IENvbGxlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlc18yXzBfRWxlbWVudENvbGxlY3Rpb25zKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxFbGVtZW50Q29sbGVjdGlvbj4gZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkKKwl7CisJCWlmIChlbGVtZW50Q29sbGVjdGlvbnMgPT0gbnVsbCkKKwkJeworCQkJZWxlbWVudENvbGxlY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEVsZW1lbnRDb2xsZWN0aW9uPihYbWxFbGVtZW50Q29sbGVjdGlvbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTEVNRU5UX0NPTExFQ1RJT05TKTsKKwkJfQorCQlyZXR1cm4gZWxlbWVudENvbGxlY3Rpb25zOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCiAJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZH0uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTQxNCw2ICs1MTEsOCBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTEVNRU5UX0NPTExFQ1RJT05TOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19JRFM6CiAJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJZHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEX0lEUzoKQEAgLTQ0OCw2ICs1NDcsMTAgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fRUxFTUVOVF9DT0xMRUNUSU9OUzoKKwkJCQlyZXR1cm4gZ2V0RWxlbWVudENvbGxlY3Rpb25zKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fSURTOgogCQkJCXJldHVybiBnZXRJZHMoKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTUJFRERFRF9JRFM6CkBAIC00ODMsNiArNTg2LDEzIEBACiAJewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkKIAkJeworCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0RFU0NSSVBUSU9OOgorCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTEVNRU5UX0NPTExFQ1RJT05TOgorCQkJCWdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmNsZWFyKCk7CisJCQkJZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxFbGVtZW50Q29sbGVjdGlvbj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19JRFM6CiAJCQkJZ2V0SWRzKCkuY2xlYXIoKTsKIAkJCQlnZXRJZHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbElkPiluZXdWYWx1ZSk7CkBAIC01MzcsNiArNjQ3LDEyIEBACiAJewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkKIAkJeworCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0RFU0NSSVBUSU9OOgorCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fRUxFTUVOVF9DT0xMRUNUSU9OUzoKKwkJCQlnZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19JRFM6CiAJCQkJZ2V0SWRzKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CkBAIC01ODEsNiArNjk3LDEwIEBACiAJewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkKIAkJeworCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOworCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VMRU1FTlRfQ09MTEVDVElPTlM6CisJCQkJcmV0dXJuIGVsZW1lbnRDb2xsZWN0aW9ucyAhPSBudWxsICYmICFlbGVtZW50Q29sbGVjdGlvbnMuaXNFbXB0eSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0lEUzoKIAkJCQlyZXR1cm4gaWRzICE9IG51bGwgJiYgIWlkcy5pc0VtcHR5KCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fRU1CRURERURfSURTOgpAQCAtNjA1LDQgKzcyNSw2OCBAQAogCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CiAJfQogCi19IC8vIEF0dHJpYnV0ZXMKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxYbWxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRBdHRyaWJ1dGVNYXBwaW5ncygpIHsKKwkJLy8gY29udmVydCBsaXN0cyB0byBhcnJheXMgdG8gYXZvaWQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgdG8gcmVzdWx0IGxpc3QKKwkJQXJyYXlMaXN0PFhtbEF0dHJpYnV0ZU1hcHBpbmc+IGF0dHJpYnV0ZU1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxYbWxBdHRyaWJ1dGVNYXBwaW5nPigpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldElkcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7CisJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0RW1iZWRkZWRJZHMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEJhc2ljcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7CisJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0VmVyc2lvbnMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldE1hbnlUb09uZXMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldE9uZVRvTWFueXMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldE9uZVRvT25lcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7CisJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0TWFueVRvTWFueXMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7CisJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0RW1iZWRkZWRzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKKwkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRUcmFuc2llbnRzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKKwkJcmV0dXJuIGF0dHJpYnV0ZU1hcHBpbmdzOworCX0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbEF0dHJpYnV0ZU1hcHBpbmdbXSBFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkgPSBuZXcgWG1sQXR0cmlidXRlTWFwcGluZ1swXTsKKworCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIGJ1aWxkVHJhbnNsYXRvcigKKwkJCUpQQS5BVFRSSUJVVEVTLCAKKwkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlYbWxJZC5idWlsZFRyYW5zbGF0b3IoSlBBLklELCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX0lkcygpKSwKKwkJCVhtbEVtYmVkZGVkSWQuYnVpbGRUcmFuc2xhdG9yKEpQQS5FTUJFRERFRF9JRCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19FbWJlZGRlZElkcygpKSwKKwkJCVhtbEJhc2ljLmJ1aWxkVHJhbnNsYXRvcihKUEEuQkFTSUMsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfQmFzaWNzKCkpLAorCQkJWG1sVmVyc2lvbi5idWlsZFRyYW5zbGF0b3IoSlBBLlZFUlNJT04sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfVmVyc2lvbnMoKSksCisJCQlYbWxNYW55VG9PbmUuYnVpbGRUcmFuc2xhdG9yKEpQQS5NQU5ZX1RPX09ORSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19NYW55VG9PbmVzKCkpLAorCQkJWG1sT25lVG9NYW55LmJ1aWxkVHJhbnNsYXRvcihKUEEuT05FX1RPX01BTlksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfT25lVG9NYW55cygpKSwKKwkJCVhtbE9uZVRvT25lLmJ1aWxkVHJhbnNsYXRvcihKUEEuT05FX1RPX09ORSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19PbmVUb09uZXMoKSksCisJCQlYbWxNYW55VG9NYW55LmJ1aWxkVHJhbnNsYXRvcihKUEEuTUFOWV9UT19NQU5ZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX01hbnlUb01hbnlzKCkpLAorCQkJWG1sRWxlbWVudENvbGxlY3Rpb24uYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVzXzJfMF9FbGVtZW50Q29sbGVjdGlvbnMoKSksCisJCQlYbWxFbWJlZGRlZC5idWlsZFRyYW5zbGF0b3IoSlBBLkVNQkVEREVELCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX0VtYmVkZGVkcygpKSwKKwkJCVhtbFRyYW5zaWVudC5idWlsZFRyYW5zbGF0b3IoSlBBLlRSQU5TSUVOVCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19UcmFuc2llbnRzKCkpLAorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQmFzZVhtbEVtYmVkZGVkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Jhc2VYbWxFbWJlZGRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGJlYmE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQmFzZVhtbEVtYmVkZGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzZSBYbWwgRW1iZWRkZWQ8L2I+PC9lbT4nLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkJhc2VYbWxFbWJlZGRlZCNnZXRBdHRyaWJ1dGVPdmVycmlkZXMgPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEJhc2VYbWxFbWJlZGRlZCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmFzZVhtbEVtYmVkZGVkIGV4dGVuZHMgWG1sQXR0cmlidXRlTWFwcGluZwotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRCYXNlWG1sRW1iZWRkZWRfQXR0cmlidXRlT3ZlcnJpZGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQotfSAvLyBCYXNlWG1sRW1iZWRkZWQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQ2FzY2FkZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQ2FzY2FkZVR5cGUuamF2YQppbmRleCAzZGU1M2Y3Li45ODI5ZTc2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Nhc2NhZGVUeXBlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9DYXNjYWRlVHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksNyArOSwxNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMzQsMTMgKzQyLDEzNCBAQAogICogPC9wPgogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q2FzY2FkZVR5cGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgogICogQGV4dGVuZHMgSnBhRU9iamVjdAogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgaW50ZXJmYWNlIENhc2NhZGVUeXBlIGV4dGVuZHMgSnBhRU9iamVjdAorcHVibGljIGNsYXNzIENhc2NhZGVUeXBlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAogewogCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVBbGwoKSA8ZW0+Q2FzY2FkZSBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzQ2FzY2FkZUFsbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBU0NBREVfQUxMX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVBbGwoKSA8ZW0+Q2FzY2FkZSBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzQ2FzY2FkZUFsbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZUFsbCA9IENBU0NBREVfQUxMX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzY2FkZVBlcnNpc3QoKSA8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0Nhc2NhZGVQZXJzaXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0FTQ0FERV9QRVJTSVNUX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVQZXJzaXN0KCkgPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNDYXNjYWRlUGVyc2lzdCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZVBlcnNpc3QgPSBDQVNDQURFX1BFUlNJU1RfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYXNjYWRlTWVyZ2UoKSA8ZW0+Q2FzY2FkZSBNZXJnZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNDYXNjYWRlTWVyZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDQVNDQURFX01FUkdFX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVNZXJnZSgpIDxlbT5DYXNjYWRlIE1lcmdlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0Nhc2NhZGVNZXJnZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZU1lcmdlID0gQ0FTQ0FERV9NRVJHRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVSZW1vdmUoKSA8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzQ2FzY2FkZVJlbW92ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBU0NBREVfUkVNT1ZFX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVSZW1vdmUoKSA8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzQ2FzY2FkZVJlbW92ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZVJlbW92ZSA9IENBU0NBREVfUkVNT1ZFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzY2FkZVJlZnJlc2goKSA8ZW0+Q2FzY2FkZSBSZWZyZXNoPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0Nhc2NhZGVSZWZyZXNoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0FTQ0FERV9SRUZSRVNIX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVSZWZyZXNoKCkgPGVtPkNhc2NhZGUgUmVmcmVzaDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNDYXNjYWRlUmVmcmVzaCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZVJlZnJlc2ggPSBDQVNDQURFX1JFRlJFU0hfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ2FzY2FkZVR5cGUoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5DQVNDQURFX1RZUEU7CisJfQorCisJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBBbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtNTQsNyArMTgzLDEwIEBACiAJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JYm9vbGVhbiBpc0Nhc2NhZGVBbGwoKTsKKwlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVBbGwoKQorCXsKKwkJcmV0dXJuIGNhc2NhZGVBbGw7CisJfQogCiAJLyoqCiAJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZUFsbCA8ZW0+Q2FzY2FkZSBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTY0LDcgKzE5NiwxMyBAQAogCSAqIEBzZWUgI2lzQ2FzY2FkZUFsbCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0Q2FzY2FkZUFsbChib29sZWFuIHZhbHVlKTsKKwlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlQWxsKGJvb2xlYW4gbmV3Q2FzY2FkZUFsbCkKKwl7CisJCWJvb2xlYW4gb2xkQ2FzY2FkZUFsbCA9IGNhc2NhZGVBbGw7CisJCWNhc2NhZGVBbGwgPSBuZXdDYXNjYWRlQWxsOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9BTEwsIG9sZENhc2NhZGVBbGwsIGNhc2NhZGVBbGwpKTsKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIFBlcnNpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTgwLDcgKzIxOCwxMCBAQAogCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpOworCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZVBlcnNpc3QoKQorCXsKKwkJcmV0dXJuIGNhc2NhZGVQZXJzaXN0OworCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVQZXJzaXN0IDxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTkwLDcgKzIzMSwxMyBAQAogCSAqIEBzZWUgI2lzQ2FzY2FkZVBlcnNpc3QoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQl2b2lkIHNldENhc2NhZGVQZXJzaXN0KGJvb2xlYW4gdmFsdWUpOworCXB1YmxpYyB2b2lkIHNldENhc2NhZGVQZXJzaXN0KGJvb2xlYW4gbmV3Q2FzY2FkZVBlcnNpc3QpCisJeworCQlib29sZWFuIG9sZENhc2NhZGVQZXJzaXN0ID0gY2FzY2FkZVBlcnNpc3Q7CisJCWNhc2NhZGVQZXJzaXN0ID0gbmV3Q2FzY2FkZVBlcnNpc3Q7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX1BFUlNJU1QsIG9sZENhc2NhZGVQZXJzaXN0LCBjYXNjYWRlUGVyc2lzdCkpOworCX0KIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgTWVyZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTEwNiw3ICsyNTMsMTAgQEAKIAkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlib29sZWFuIGlzQ2FzY2FkZU1lcmdlKCk7CisJcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlTWVyZ2UoKQorCXsKKwkJcmV0dXJuIGNhc2NhZGVNZXJnZTsKKwl9CiAKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGUjaXNDYXNjYWRlTWVyZ2UgPGVtPkNhc2NhZGUgTWVyZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTExNiw3ICsyNjYsMTMgQEAKIAkgKiBAc2VlICNpc0Nhc2NhZGVNZXJnZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0Q2FzY2FkZU1lcmdlKGJvb2xlYW4gdmFsdWUpOworCXB1YmxpYyB2b2lkIHNldENhc2NhZGVNZXJnZShib29sZWFuIG5ld0Nhc2NhZGVNZXJnZSkKKwl7CisJCWJvb2xlYW4gb2xkQ2FzY2FkZU1lcmdlID0gY2FzY2FkZU1lcmdlOworCQljYXNjYWRlTWVyZ2UgPSBuZXdDYXNjYWRlTWVyZ2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX01FUkdFLCBvbGRDYXNjYWRlTWVyZ2UsIGNhc2NhZGVNZXJnZSkpOworCX0KIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgUmVtb3ZlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMzIsNyArMjg4LDEwIEBACiAJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JYm9vbGVhbiBpc0Nhc2NhZGVSZW1vdmUoKTsKKwlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVSZW1vdmUoKQorCXsKKwkJcmV0dXJuIGNhc2NhZGVSZW1vdmU7CisJfQogCiAJLyoqCiAJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZVJlbW92ZSA8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTE0Miw3ICszMDEsMTMgQEAKIAkgKiBAc2VlICNpc0Nhc2NhZGVSZW1vdmUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQl2b2lkIHNldENhc2NhZGVSZW1vdmUoYm9vbGVhbiB2YWx1ZSk7CisJcHVibGljIHZvaWQgc2V0Q2FzY2FkZVJlbW92ZShib29sZWFuIG5ld0Nhc2NhZGVSZW1vdmUpCisJeworCQlib29sZWFuIG9sZENhc2NhZGVSZW1vdmUgPSBjYXNjYWRlUmVtb3ZlOworCQljYXNjYWRlUmVtb3ZlID0gbmV3Q2FzY2FkZVJlbW92ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUkVNT1ZFLCBvbGRDYXNjYWRlUmVtb3ZlLCBjYXNjYWRlUmVtb3ZlKSk7CisJfQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBSZWZyZXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xNTgsNyArMzIzLDEwIEBACiAJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JYm9vbGVhbiBpc0Nhc2NhZGVSZWZyZXNoKCk7CisJcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUmVmcmVzaCgpCisJeworCQlyZXR1cm4gY2FzY2FkZVJlZnJlc2g7CisJfQogCiAJLyoqCiAJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZVJlZnJlc2ggPGVtPkNhc2NhZGUgUmVmcmVzaDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTY4LDYgKzMzNiwxODAgQEAKIAkgKiBAc2VlICNpc0Nhc2NhZGVSZWZyZXNoKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0Jdm9pZCBzZXRDYXNjYWRlUmVmcmVzaChib29sZWFuIHZhbHVlKTsKKwlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlUmVmcmVzaChib29sZWFuIG5ld0Nhc2NhZGVSZWZyZXNoKQorCXsKKwkJYm9vbGVhbiBvbGRDYXNjYWRlUmVmcmVzaCA9IGNhc2NhZGVSZWZyZXNoOworCQljYXNjYWRlUmVmcmVzaCA9IG5ld0Nhc2NhZGVSZWZyZXNoOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9SRUZSRVNILCBvbGRDYXNjYWRlUmVmcmVzaCwgY2FzY2FkZVJlZnJlc2gpKTsKKwl9CiAKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfQUxMOgorCQkJCXJldHVybiBpc0Nhc2NhZGVBbGwoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUEVSU0lTVDoKKwkJCQlyZXR1cm4gaXNDYXNjYWRlUGVyc2lzdCgpOworCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9NRVJHRToKKwkJCQlyZXR1cm4gaXNDYXNjYWRlTWVyZ2UoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUkVNT1ZFOgorCQkJCXJldHVybiBpc0Nhc2NhZGVSZW1vdmUoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUkVGUkVTSDoKKwkJCQlyZXR1cm4gaXNDYXNjYWRlUmVmcmVzaCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfQUxMOgorCQkJCXNldENhc2NhZGVBbGwoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUEVSU0lTVDoKKwkJCQlzZXRDYXNjYWRlUGVyc2lzdCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9NRVJHRToKKwkJCQlzZXRDYXNjYWRlTWVyZ2UoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUkVNT1ZFOgorCQkJCXNldENhc2NhZGVSZW1vdmUoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUkVGUkVTSDoKKwkJCQlzZXRDYXNjYWRlUmVmcmVzaCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9BTEw6CisJCQkJc2V0Q2FzY2FkZUFsbChDQVNDQURFX0FMTF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9QRVJTSVNUOgorCQkJCXNldENhc2NhZGVQZXJzaXN0KENBU0NBREVfUEVSU0lTVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9NRVJHRToKKwkJCQlzZXRDYXNjYWRlTWVyZ2UoQ0FTQ0FERV9NRVJHRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9SRU1PVkU6CisJCQkJc2V0Q2FzY2FkZVJlbW92ZShDQVNDQURFX1JFTU9WRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9SRUZSRVNIOgorCQkJCXNldENhc2NhZGVSZWZyZXNoKENBU0NBREVfUkVGUkVTSF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfQUxMOgorCQkJCXJldHVybiBjYXNjYWRlQWxsICE9IENBU0NBREVfQUxMX0VERUZBVUxUOworCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9QRVJTSVNUOgorCQkJCXJldHVybiBjYXNjYWRlUGVyc2lzdCAhPSBDQVNDQURFX1BFUlNJU1RfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX01FUkdFOgorCQkJCXJldHVybiBjYXNjYWRlTWVyZ2UgIT0gQ0FTQ0FERV9NRVJHRV9FREVGQVVMVDsKKwkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUkVNT1ZFOgorCQkJCXJldHVybiBjYXNjYWRlUmVtb3ZlICE9IENBU0NBREVfUkVNT1ZFX0VERUZBVUxUOworCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9SRUZSRVNIOgorCQkJCXJldHVybiBjYXNjYWRlUmVmcmVzaCAhPSBDQVNDQURFX1JFRlJFU0hfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGNhc2NhZGVBbGw6ICIpOworCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGVBbGwpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGVQZXJzaXN0OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChjYXNjYWRlUGVyc2lzdCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgY2FzY2FkZU1lcmdlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChjYXNjYWRlTWVyZ2UpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGVSZW1vdmU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGVSZW1vdmUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGVSZWZyZXNoOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChjYXNjYWRlUmVmcmVzaCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZENhc2NhZGVBbGxUcmFuc2xhdG9yKCksCisJCQlidWlsZENhc2NhZGVQZXJzaXN0VHJhbnNsYXRvcigpLAorCQkJYnVpbGRDYXNjYWRlTWVyZ2VUcmFuc2xhdG9yKCksCisJCQlidWlsZENhc2NhZGVSZW1vdmVUcmFuc2xhdG9yKCksCisJCQlidWlsZENhc2NhZGVSZWZyZXNoVHJhbnNsYXRvcigpCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhc2NhZGVBbGxUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoSlBBLkNBU0NBREVfQUxMLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlQWxsKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYXNjYWRlUGVyc2lzdFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihKUEEuQ0FTQ0FERV9QRVJTSVNULCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlUGVyc2lzdCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FzY2FkZU1lcmdlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEpQQS5DQVNDQURFX01FUkdFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlTWVyZ2UoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhc2NhZGVSZW1vdmVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoSlBBLkNBU0NBREVfUkVNT1ZFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlUmVtb3ZlKCkpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhc2NhZGVSZWZyZXNoVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEpQQS5DQVNDQURFX1JFRlJFU0gsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldENhc2NhZGVUeXBlX0Nhc2NhZGVSZWZyZXNoKCkpOworCX0KKwkKIH0gLy8gQ2FzY2FkZVR5cGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQ2FzY2FkZVR5cGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0Nhc2NhZGVUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDE2Mjg3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQ2FzY2FkZVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXNjYWRlIFR5cGU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENhc2NhZGVUeXBlSW1wbCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXNjYWRlVHlwZUltcGwgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBDYXNjYWRlVHlwZQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVBbGwoKSA8ZW0+Q2FzY2FkZSBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZUFsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBU0NBREVfQUxMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVBbGwoKSA8ZW0+Q2FzY2FkZSBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZUFsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZUFsbCA9IENBU0NBREVfQUxMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzY2FkZVBlcnNpc3QoKSA8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2NhZGVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0FTQ0FERV9QRVJTSVNUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVQZXJzaXN0KCkgPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYXNjYWRlUGVyc2lzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZVBlcnNpc3QgPSBDQVNDQURFX1BFUlNJU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYXNjYWRlTWVyZ2UoKSA8ZW0+Q2FzY2FkZSBNZXJnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYXNjYWRlTWVyZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDQVNDQURFX01FUkdFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVNZXJnZSgpIDxlbT5DYXNjYWRlIE1lcmdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2NhZGVNZXJnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZU1lcmdlID0gQ0FTQ0FERV9NRVJHRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVSZW1vdmUoKSA8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZVJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBU0NBREVfUkVNT1ZFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVSZW1vdmUoKSA8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZVJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZVJlbW92ZSA9IENBU0NBREVfUkVNT1ZFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzY2FkZVJlZnJlc2goKSA8ZW0+Q2FzY2FkZSBSZWZyZXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2NhZGVSZWZyZXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0FTQ0FERV9SRUZSRVNIX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVSZWZyZXNoKCkgPGVtPkNhc2NhZGUgUmVmcmVzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYXNjYWRlUmVmcmVzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZVJlZnJlc2ggPSBDQVNDQURFX1JFRlJFU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FzY2FkZVR5cGVJbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuQ0FTQ0FERV9UWVBFX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBBbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgQWxsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgQWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlQWxsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDYXNjYWRlVHlwZV9DYXNjYWRlQWxsKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVBbGwoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGVBbGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlSW1wbCNpc0Nhc2NhZGVBbGwgPGVtPkNhc2NhZGUgQWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIEFsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNDYXNjYWRlQWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZUFsbChib29sZWFuIG5ld0Nhc2NhZGVBbGwpCi0JewotCQlib29sZWFuIG9sZENhc2NhZGVBbGwgPSBjYXNjYWRlQWxsOwotCQljYXNjYWRlQWxsID0gbmV3Q2FzY2FkZUFsbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9BTEwsIG9sZENhc2NhZGVBbGwsIGNhc2NhZGVBbGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIFBlcnNpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVQZXJzaXN0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDYXNjYWRlVHlwZV9DYXNjYWRlUGVyc2lzdCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpCi0JewotCQlyZXR1cm4gY2FzY2FkZVBlcnNpc3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlSW1wbCNpc0Nhc2NhZGVQZXJzaXN0IDxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNDYXNjYWRlUGVyc2lzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVQZXJzaXN0KGJvb2xlYW4gbmV3Q2FzY2FkZVBlcnNpc3QpCi0JewotCQlib29sZWFuIG9sZENhc2NhZGVQZXJzaXN0ID0gY2FzY2FkZVBlcnNpc3Q7Ci0JCWNhc2NhZGVQZXJzaXN0ID0gbmV3Q2FzY2FkZVBlcnNpc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfUEVSU0lTVCwgb2xkQ2FzY2FkZVBlcnNpc3QsIGNhc2NhZGVQZXJzaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBNZXJnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBNZXJnZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE1lcmdlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlTWVyZ2UoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENhc2NhZGVUeXBlX0Nhc2NhZGVNZXJnZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlTWVyZ2UoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGVNZXJnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGVJbXBsI2lzQ2FzY2FkZU1lcmdlIDxlbT5DYXNjYWRlIE1lcmdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE1lcmdlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Nhc2NhZGVNZXJnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVNZXJnZShib29sZWFuIG5ld0Nhc2NhZGVNZXJnZSkKLQl7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZU1lcmdlID0gY2FzY2FkZU1lcmdlOwotCQljYXNjYWRlTWVyZ2UgPSBuZXdDYXNjYWRlTWVyZ2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfTUVSR0UsIG9sZENhc2NhZGVNZXJnZSwgY2FzY2FkZU1lcmdlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBSZW1vdmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgUmVtb3ZlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgUmVtb3ZlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlUmVtb3ZlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDYXNjYWRlVHlwZV9DYXNjYWRlUmVtb3ZlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVSZW1vdmUoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGVSZW1vdmU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlSW1wbCNpc0Nhc2NhZGVSZW1vdmUgPGVtPkNhc2NhZGUgUmVtb3ZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIFJlbW92ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNDYXNjYWRlUmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZVJlbW92ZShib29sZWFuIG5ld0Nhc2NhZGVSZW1vdmUpCi0JewotCQlib29sZWFuIG9sZENhc2NhZGVSZW1vdmUgPSBjYXNjYWRlUmVtb3ZlOwotCQljYXNjYWRlUmVtb3ZlID0gbmV3Q2FzY2FkZVJlbW92ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9SRU1PVkUsIG9sZENhc2NhZGVSZW1vdmUsIGNhc2NhZGVSZW1vdmUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIFJlZnJlc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgUmVmcmVzaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIFJlZnJlc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVSZWZyZXNoKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDYXNjYWRlVHlwZV9DYXNjYWRlUmVmcmVzaCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUmVmcmVzaCgpCi0JewotCQlyZXR1cm4gY2FzY2FkZVJlZnJlc2g7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlSW1wbCNpc0Nhc2NhZGVSZWZyZXNoIDxlbT5DYXNjYWRlIFJlZnJlc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgUmVmcmVzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNDYXNjYWRlUmVmcmVzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVSZWZyZXNoKGJvb2xlYW4gbmV3Q2FzY2FkZVJlZnJlc2gpCi0JewotCQlib29sZWFuIG9sZENhc2NhZGVSZWZyZXNoID0gY2FzY2FkZVJlZnJlc2g7Ci0JCWNhc2NhZGVSZWZyZXNoID0gbmV3Q2FzY2FkZVJlZnJlc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfUkVGUkVTSCwgb2xkQ2FzY2FkZVJlZnJlc2gsIGNhc2NhZGVSZWZyZXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfQUxMOgotCQkJCXJldHVybiBpc0Nhc2NhZGVBbGwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfUEVSU0lTVDoKLQkJCQlyZXR1cm4gaXNDYXNjYWRlUGVyc2lzdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9NRVJHRToKLQkJCQlyZXR1cm4gaXNDYXNjYWRlTWVyZ2UoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfUkVNT1ZFOgotCQkJCXJldHVybiBpc0Nhc2NhZGVSZW1vdmUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfUkVGUkVTSDoKLQkJCQlyZXR1cm4gaXNDYXNjYWRlUmVmcmVzaCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfQUxMOgotCQkJCXNldENhc2NhZGVBbGwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX1BFUlNJU1Q6Ci0JCQkJc2V0Q2FzY2FkZVBlcnNpc3QoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX01FUkdFOgotCQkJCXNldENhc2NhZGVNZXJnZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfUkVNT1ZFOgotCQkJCXNldENhc2NhZGVSZW1vdmUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX1JFRlJFU0g6Ci0JCQkJc2V0Q2FzY2FkZVJlZnJlc2goKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX0FMTDoKLQkJCQlzZXRDYXNjYWRlQWxsKENBU0NBREVfQUxMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfUEVSU0lTVDoKLQkJCQlzZXRDYXNjYWRlUGVyc2lzdChDQVNDQURFX1BFUlNJU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9NRVJHRToKLQkJCQlzZXRDYXNjYWRlTWVyZ2UoQ0FTQ0FERV9NRVJHRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX1JFTU9WRToKLQkJCQlzZXRDYXNjYWRlUmVtb3ZlKENBU0NBREVfUkVNT1ZFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfUkVGUkVTSDoKLQkJCQlzZXRDYXNjYWRlUmVmcmVzaChDQVNDQURFX1JFRlJFU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfQUxMOgotCQkJCXJldHVybiBjYXNjYWRlQWxsICE9IENBU0NBREVfQUxMX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIGNhc2NhZGVQZXJzaXN0ICE9IENBU0NBREVfUEVSU0lTVF9FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9NRVJHRToKLQkJCQlyZXR1cm4gY2FzY2FkZU1lcmdlICE9IENBU0NBREVfTUVSR0VfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfUkVNT1ZFOgotCQkJCXJldHVybiBjYXNjYWRlUmVtb3ZlICE9IENBU0NBREVfUkVNT1ZFX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX1JFRlJFU0g6Ci0JCQkJcmV0dXJuIGNhc2NhZGVSZWZyZXNoICE9IENBU0NBREVfUkVGUkVTSF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY2FzY2FkZUFsbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FzY2FkZUFsbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FzY2FkZVBlcnNpc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGVQZXJzaXN0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXNjYWRlTWVyZ2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGVNZXJnZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FzY2FkZVJlbW92ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FzY2FkZVJlbW92ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FzY2FkZVJlZnJlc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGVSZWZyZXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIENhc2NhZGVUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0NvbHVtbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQ29sdW1uTWFwcGluZy5qYXZhCmluZGV4IDgxNGZlYmYuLmZlNGIxOTkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQ29sdW1uTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQ29sdW1uTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksNyArOSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Db2x1bW5SZXN1bHQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vQ29sdW1uUmVzdWx0LmphdmEKaW5kZXggMzY1MDQxMC4uMzM2YzU2NCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Db2x1bW5SZXN1bHQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0NvbHVtblJlc3VsdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTExLDkgKzExLDEyIEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMTk5LDQgKzIwMiwyMCBAQAogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAJfQogCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQl9OworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbHVtblJlc3VsdF9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQogfSAvLyBDb2x1bW5SZXN1bHQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5TGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5TGlzdGVuZXIuamF2YQppbmRleCBiMWM1OGYyLi5jYjYwZmNlIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0VudGl0eUxpc3RlbmVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9FbnRpdHlMaXN0ZW5lci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEyLDEwICsxMiwxNSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5TGlzdGVuZXJfMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMzIsNDQgKzM3LDE2IEBACiAgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CiAgKiA8dWw+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFByZVBlcnNpc3QgPGVtPlByZSBQZXJzaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UG9zdFBlcnNpc3QgPGVtPlBvc3QgUGVyc2lzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFByZVJlbW92ZSA8ZW0+UHJlIFJlbW92ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFBvc3RSZW1vdmUgPGVtPlBvc3QgUmVtb3ZlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UHJlVXBkYXRlIDxlbT5QcmUgVXBkYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UG9zdFVwZGF0ZSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CiAgKgogICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcigpCiAgKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKK3B1YmxpYyBjbGFzcyBFbnRpdHlMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyLCBYbWxFbnRpdHlMaXN0ZW5lcl8yXzAKIHsKIAkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NOYW1lKCkgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc05hbWUoKSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZSA9IENMQVNTX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVQZXJzaXN0KCkgPGVtPlByZSBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTE0MCw2ICsxMTcsNDYgQEAKIAlwcm90ZWN0ZWQgUG9zdExvYWQgcG9zdExvYWQ7CiAKIAkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc05hbWUoKSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzTmFtZSgpIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lID0gQ0xBU1NfTkFNRV9FREVGQVVMVDsKKworCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZApAQCAtMjA1LDcgKzIyMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgogCSAqIEBzZWUgI3NldFByZVBlcnNpc3QoUHJlUGVyc2lzdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eUxpc3RlbmVyX1ByZVBlcnNpc3QoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUHJlUGVyc2lzdCgpCiAJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KQEAgLTI2NSw3ICsyODIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCiAJICogQHNlZSAjc2V0UG9zdFBlcnNpc3QoUG9zdFBlcnNpc3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcl9Qb3N0UGVyc2lzdCgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0UGVyc2lzdCgpCiAJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KQEAgLTMyNSw3ICszNDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgogCSAqIEBzZWUgI3NldFByZVJlbW92ZShQcmVSZW1vdmUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcl9QcmVSZW1vdmUoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUHJlUmVtb3ZlKCkKIAkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwpAQCAtMzg1LDcgKzQwMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgogCSAqIEBzZWUgI3NldFBvc3RSZW1vdmUoUG9zdFJlbW92ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eUxpc3RlbmVyX1Bvc3RSZW1vdmUoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFJlbW92ZSgpCiAJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KQEAgLTQ0NSw3ICs0NjIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgogCSAqIEBzZWUgI3NldFByZVVwZGF0ZShQcmVVcGRhdGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcl9QcmVVcGRhdGUoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUHJlVXBkYXRlKCkKIAkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwpAQCAtNTA1LDcgKzUyMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgogCSAqIEBzZWUgI3NldFBvc3RVcGRhdGUoUG9zdFVwZGF0ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eUxpc3RlbmVyX1Bvc3RVcGRhdGUoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFVwZGF0ZSgpCiAJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KQEAgLTU2NSw3ICs1ODIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgTG9hZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCiAJICogQHNlZSAjc2V0UG9zdExvYWQoUG9zdExvYWQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcl9Qb3N0TG9hZCgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0TG9hZCgpCiAJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KQEAgLTYxNiw2ICs2MzMsNDEgQEAKIAl9CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eUxpc3RlbmVyXzJfMF9EZXNjcmlwdGlvbigpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKKwl7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pCisJeworCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKKwl9CisKKwkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKQEAgLTY1Myw4ICs3MDUsNiBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIGdldENsYXNzTmFtZSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1BFUlNJU1Q6CiAJCQkJcmV0dXJuIGdldFByZVBlcnNpc3QoKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfUEVSU0lTVDoKQEAgLTY2OSw2ICs3MTksMTAgQEAKIAkJCQlyZXR1cm4gZ2V0UG9zdFVwZGF0ZSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9MT0FEOgogCQkJCXJldHVybiBnZXRQb3N0TG9hZCgpOworCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19DTEFTU19OQU1FOgorCQkJCXJldHVybiBnZXRDbGFzc05hbWUoKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKIAl9CkBAIC02ODMsOSArNzM3LDYgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19DTEFTU19OQU1FOgotCQkJCXNldENsYXNzTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfUEVSU0lTVDoKIAkJCQlzZXRQcmVQZXJzaXN0KChQcmVQZXJzaXN0KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CkBAIC03MDcsNiArNzU4LDEyIEBACiAJCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX0xPQUQ6CiAJCQkJc2V0UG9zdExvYWQoKFBvc3RMb2FkKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19DTEFTU19OQU1FOgorCQkJCXNldENsYXNzTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CiAJCX0KIAkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKIAl9CkBAIC03MjEsOSArNzc4LDYgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19DTEFTU19OQU1FOgotCQkJCXNldENsYXNzTmFtZShDTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfUEVSU0lTVDoKIAkJCQlzZXRQcmVQZXJzaXN0KChQcmVQZXJzaXN0KW51bGwpOwogCQkJCXJldHVybjsKQEAgLTc0NSw2ICs3OTksMTIgQEAKIAkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfTE9BRDoKIAkJCQlzZXRQb3N0TG9hZCgoUG9zdExvYWQpbnVsbCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX0NMQVNTX05BTUU6CisJCQkJc2V0Q2xhc3NOYW1lKENMQVNTX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKIAkJfQogCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKIAl9CkBAIC03NTksOCArODE5LDYgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19DTEFTU19OQU1FOgotCQkJCXJldHVybiBDTEFTU19OQU1FX0VERUZBVUxUID09IG51bGwgPyBjbGFzc05hbWUgIT0gbnVsbCA6ICFDTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhjbGFzc05hbWUpOwogCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1BFUlNJU1Q6CiAJCQkJcmV0dXJuIHByZVBlcnNpc3QgIT0gbnVsbDsKIAkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfUEVSU0lTVDoKQEAgLTc3NSw2ICs4MzMsMTAgQEAKIAkJCQlyZXR1cm4gcG9zdFVwZGF0ZSAhPSBudWxsOwogCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9MT0FEOgogCQkJCXJldHVybiBwb3N0TG9hZCAhPSBudWxsOworCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7CisJCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19DTEFTU19OQU1FOgorCQkJCXJldHVybiBDTEFTU19OQU1FX0VERUZBVUxUID09IG51bGwgPyBjbGFzc05hbWUgIT0gbnVsbCA6ICFDTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhjbGFzc05hbWUpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKIAl9CkBAIC03ODUsMTUgKzg0Nyw4MiBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlMaXN0ZW5lcl8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19ERVNDUklQVElPTjogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9FTlRJVFlfTElTVEVORVJfMjBfX0RFU0NSSVBUSU9OOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5TGlzdGVuZXJfMl8wLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfRU5USVRZX0xJU1RFTkVSXzIwX19ERVNDUklQVElPTjogcmV0dXJuIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19ERVNDUklQVElPTjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogCXsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNsYXNzTmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBjbGFzc05hbWU6ICIpOwogCQlyZXN1bHQuYXBwZW5kKGNsYXNzTmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KIAotfSAvLyBFbnRpdHlMaXN0ZW5lcgorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCisJCQlidWlsZENsYXNzVHJhbnNsYXRvcigpLAorCQkJUHJlUGVyc2lzdC5idWlsZFRyYW5zbGF0b3IoKSwKKwkJCVBvc3RQZXJzaXN0LmJ1aWxkVHJhbnNsYXRvcigpLAorCQkJUHJlUmVtb3ZlLmJ1aWxkVHJhbnNsYXRvcigpLAorCQkJUG9zdFJlbW92ZS5idWlsZFRyYW5zbGF0b3IoKSwKKwkJCVByZVVwZGF0ZS5idWlsZFRyYW5zbGF0b3IoKSwKKwkJCVBvc3RVcGRhdGUuYnVpbGRUcmFuc2xhdG9yKCksCisJCQlQb3N0TG9hZC5idWlsZFRyYW5zbGF0b3IoKQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuREVTQ1JJUFRJT04sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlMaXN0ZW5lcl8yXzBfRGVzY3JpcHRpb24oKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENsYXNzVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5DTEFTUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5TGlzdGVuZXJfQ2xhc3NOYW1lKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5TGlzdGVuZXJzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0VudGl0eUxpc3RlbmVycy5qYXZhCmluZGV4IDVmZDk2ZjguLmM4OTM2OWQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5TGlzdGVuZXJzLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9FbnRpdHlMaXN0ZW5lcnMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMywxMSArMTMsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTE4MSw1ICsxODQsMTcgQEAKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CiAJfQotCi19IC8vIEVudGl0eUxpc3RlbmVycworCQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJRW50aXR5TGlzdGVuZXIuYnVpbGRUcmFuc2xhdG9yKEpQQS5FTlRJVFlfTElTVEVORVIsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGl0eUxpc3RlbmVyc19FbnRpdHlMaXN0ZW5lcnMoKSkKKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0VudGl0eVJlc3VsdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9FbnRpdHlSZXN1bHQuamF2YQppbmRleCA4ZjdlMmNiLi5mODExMGZhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0VudGl0eVJlc3VsdC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5UmVzdWx0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTQsMTIgKzE0LDE1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0zMzUsNCArMzM4LDI2IEBACiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CiAKKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZEVudGl0eUNsYXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uVHJhbnNsYXRvcigpLAorCQkJRmllbGRSZXN1bHQuYnVpbGRUcmFuc2xhdG9yKEpQQS5GSUVMRF9SRVNVTFQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGl0eVJlc3VsdF9GaWVsZFJlc3VsdHMoKSksCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEVudGl0eUNsYXNzVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5FTlRJVFlfQ0xBU1MsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGl0eVJlc3VsdF9FbnRpdHlDbGFzcygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5UmVzdWx0X0Rpc2NyaW1pbmF0b3JDb2x1bW4oKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CiB9IC8vIEVudGl0eVJlc3VsdApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9FdmVudE1ldGhvZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9FdmVudE1ldGhvZC5qYXZhCmluZGV4IDVjNjY0YTguLmU4MWQyY2UgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRXZlbnRNZXRob2QuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0V2ZW50TWV0aG9kLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTIsOCArMTIsMTIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFdmVudE1ldGhvZF8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTM0LDEyICszOCwzMCBAQAogICogPC9wPgogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RXZlbnRNZXRob2QoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIEV2ZW50TWV0aG9kIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAorcHVibGljIGFic3RyYWN0IGNsYXNzIEV2ZW50TWV0aG9kIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sRXZlbnRNZXRob2RfMl8wCiB7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7CiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZE5hbWUoKSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNDksNyArNzEsNiBAQAogCSAqIEBvcmRlcmVkCiAJICovCiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX05BTUVfRURFRkFVTFQgPSBudWxsOwotCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kTmFtZSgpIDxlbT5NZXRob2QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC04Miw2ICsxMDMsNDEgQEAKIAl9CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kXzJfMF9EZXNjcmlwdGlvbigpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKKwl7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRXZlbnRNZXRob2QjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pCisJeworCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FVkVOVF9NRVRIT0RfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKKwl9CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CkBAIC05NSw4ICsxNTEsNyBAQAogCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpCi0JeworCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsKIAkJcmV0dXJuIG1ldGhvZE5hbWU7CiAJfQogCkBAIC0xMDgsOCArMTYzLDcgQEAKIAkgKiBAc2VlICNnZXRNZXRob2ROYW1lKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kTmFtZShTdHJpbmcgbmV3TWV0aG9kTmFtZSkKLQl7CisJcHVibGljIHZvaWQgc2V0TWV0aG9kTmFtZShTdHJpbmcgbmV3TWV0aG9kTmFtZSkgewogCQlTdHJpbmcgb2xkTWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CiAJCW1ldGhvZE5hbWUgPSBuZXdNZXRob2ROYW1lOwogCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCkBAIC0xMjYsNiArMTgwLDggQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuRVZFTlRfTUVUSE9EX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5FVkVOVF9NRVRIT0RfX01FVEhPRF9OQU1FOgogCQkJCXJldHVybiBnZXRNZXRob2ROYW1lKCk7CiAJCX0KQEAgLTE0Miw2ICsxOTgsOSBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5FVkVOVF9NRVRIT0RfX0RFU0NSSVBUSU9OOgorCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5FVkVOVF9NRVRIT0RfX01FVEhPRF9OQU1FOgogCQkJCXNldE1ldGhvZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwpAQCAtMTU5LDYgKzIxOCw5IEBACiAJewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkKIAkJeworCQkJY2FzZSBPcm1QYWNrYWdlLkVWRU5UX01FVEhPRF9fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5FVkVOVF9NRVRIT0RfX01FVEhPRF9OQU1FOgogCQkJCXNldE1ldGhvZE5hbWUoTUVUSE9EX05BTUVfRURFRkFVTFQpOwogCQkJCXJldHVybjsKQEAgLTE3Niw2ICsyMzgsOCBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5FVkVOVF9NRVRIT0RfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwogCQkJY2FzZSBPcm1QYWNrYWdlLkVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUU6CiAJCQkJcmV0dXJuIE1FVEhPRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtZXRob2ROYW1lICE9IG51bGwgOiAhTUVUSE9EX05BTUVfRURFRkFVTFQuZXF1YWxzKG1ldGhvZE5hbWUpOwogCQl9CkBAIC0xOTMsMTAgKzI1NywyOSBAQAogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWV0aG9kTmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtZXRob2ROYW1lOiAiKTsKIAkJcmVzdWx0LmFwcGVuZChtZXRob2ROYW1lKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAJfQotCi19IC8vIEV2ZW50TWV0aG9kCisJCisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTWV0aG9kTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWV0aG9kTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTUVUSE9EX05BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50TWV0aG9kX01ldGhvZE5hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLkRFU0NSSVBUSU9OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RfMl8wX0Rlc2NyaXB0aW9uKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRmllbGRSZXN1bHQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vRmllbGRSZXN1bHQuamF2YQppbmRleCA5Y2NhNzFlLi41ODI0ZjQyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0ZpZWxkUmVzdWx0LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9GaWVsZFJlc3VsdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTExLDkgKzExLDEyIEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjY3LDQgKzI3MCwyNSBAQAogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAJfQogCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJY3JlYXRlQ29sdW1uVHJhbnNsYXRvcigpCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEZpZWxkUmVzdWx0X05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUNvbHVtblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQ09MVU1OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWVsZFJlc3VsdF9Db2x1bW4oKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CQorCiB9IC8vIEZpZWxkUmVzdWx0CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0luaGVyaXRhbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0luaGVyaXRhbmNlLmphdmEKaW5kZXggYTU3ZTQzYy4uNzgzZTk0NyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Jbmhlcml0YW5jZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vSW5oZXJpdGFuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMSw5ICsxMSwxMyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTE5OCw1ICsyMDIsMzAgQEAKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U3RyYXRlZ3lUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLlNUUkFURUdZKTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCiAKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKKwkJCWVsZW1lbnROYW1lLAorCQkJc3RydWN0dXJhbEZlYXR1cmUsCisJCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAorCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQorCQkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGRTdHJhdGVneVRyYW5zbGF0b3IoKSwKKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTdHJhdGVneVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuU1RSQVRFR1ksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEluaGVyaXRhbmNlX1N0cmF0ZWd5KCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQogfSAvLyBJbmhlcml0YW5jZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9KUEEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vSlBBLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmMWJlZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vSlBBLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGludGVyZmFjZSBKUEEKK3sKKwlTdHJpbmcgU0NIRU1BX05BTUVTUEFDRSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iOworCVN0cmluZyBTQ0hFTUFfTE9DQVRJT04gPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtXzFfMC54c2QiOworCVN0cmluZyBTQ0hFTUFfVkVSU0lPTiA9ICIxLjAiOworCQorCVN0cmluZyBBQ0NFU1MgPSAiYWNjZXNzIjsKKwlTdHJpbmcgQUxMT0NBVElPTl9TSVpFID0gImFsbG9jYXRpb24tc2l6ZSI7CisJU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFID0gImFzc29jaWF0aW9uLW92ZXJyaWRlIjsKKwlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFID0gImF0dHJpYnV0ZS1vdmVycmlkZSI7CisJU3RyaW5nIEFUVFJJQlVURVMgPSAiYXR0cmlidXRlcyI7CisJU3RyaW5nIEJBU0lDID0gImJhc2ljIjsKKwlTdHJpbmcgQ0FTQ0FERSA9ICJjYXNjYWRlIjsKKwlTdHJpbmcgQ0FTQ0FERV9BTEwgPSAiY2FzY2FkZS1hbGwiOworCVN0cmluZyBDQVNDQURFX01FUkdFID0gImNhc2NhZGUtbWVyZ2UiOworCVN0cmluZyBDQVNDQURFX1BFUlNJU1QgPSAiY2FzY2FkZS1wZXJzaXN0IjsKKwlTdHJpbmcgQ0FTQ0FERV9SRUZSRVNIID0gImNhc2NhZGUtcmVmcmVzaCI7CQorCVN0cmluZyBDQVNDQURFX1JFTU9WRSA9ICJjYXNjYWRlLXJlbW92ZSI7CQorCVN0cmluZyBDQVRBTE9HID0gImNhdGFsb2ciOworCVN0cmluZyBDTEFTUyA9ICJjbGFzcyI7CisJU3RyaW5nIENPTFVNTiA9ICJjb2x1bW4iOworCVN0cmluZyBDT0xVTU5fREVGSU5JVElPTj0gImNvbHVtbi1kZWZpbml0aW9uIjsKKwlTdHJpbmcgQ09MVU1OX05BTUUgPSAiY29sdW1uLW5hbWUiOworCVN0cmluZyBDT0xVTU5fUkVTVUxUID0gImNvbHVtbi1yZXN1bHQiOworCVN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7CisJU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OID0gImRpc2NyaW1pbmF0b3ItY29sdW1uIjsKKwlTdHJpbmcgRElTQ1JJTUlOQVRPUl9UWVBFID0gImRpc2NyaW1pbmF0b3ItdHlwZSI7CisJU3RyaW5nIERJU0NSSU1JTkFUT1JfVkFMVUUgPSAiZGlzY3JpbWluYXRvci12YWx1ZSI7CisJU3RyaW5nIEVNQkVEREFCTEUgPSAiZW1iZWRkYWJsZSI7CisJU3RyaW5nIEVNQkVEREVEID0gImVtYmVkZGVkIjsKKwlTdHJpbmcgRU1CRURERURfSUQgPSAiZW1iZWRkZWQtaWQiOworCVN0cmluZyBFTlRJVFkgPSAiZW50aXR5IjsKKwlTdHJpbmcgRU5USVRZX0NMQVNTID0gImVudGl0eS1jbGFzcyI7CisJU3RyaW5nIEVOVElUWV9MSVNURU5FUiA9ICJlbnRpdHktbGlzdGVuZXIiOworCVN0cmluZyBFTlRJVFlfTElTVEVORVJTID0gImVudGl0eS1saXN0ZW5lcnMiOworCVN0cmluZyBFTlRJVFlfTUFQUElOR1MgPSAiZW50aXR5LW1hcHBpbmdzIjsKKwlTdHJpbmcgRU5USVRZX1JFU1VMVCA9ICJlbnRpdHktcmVzdWx0IjsKKwlTdHJpbmcgRU5VTUVSQVRFRCA9ICJlbnVtZXJhdGVkIjsKKwlTdHJpbmcgRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUyA9ICJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIjsKKwlTdHJpbmcgRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUyA9ICJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIjsKKwlTdHJpbmcgRkVUQ0ggPSAiZmV0Y2giOworCVN0cmluZyBGSUVMRF9SRVNVTFQgPSAiZmllbGQtcmVzdWx0IjsKKwlTdHJpbmcgR0VORVJBVEVEX1ZBTFVFID0gImdlbmVyYXRlZC12YWx1ZSI7CisJU3RyaW5nIEdFTkVSQVRPUiA9ICJnZW5lcmF0b3IiOworCVN0cmluZyBISU5UID0gImhpbnQiOworCVN0cmluZyBJRCA9ICJpZCI7CisJU3RyaW5nIElEX0NMQVNTID0gImlkLWNsYXNzIjsKKwlTdHJpbmcgSU5IRVJJVEFOQ0UgPSAiaW5oZXJpdGFuY2UiOworCVN0cmluZyBJTklUSUFMX1ZBTFVFID0gImluaXRpYWwtdmFsdWUiOworCVN0cmluZyBJTlNFUlRBQkxFID0gImluc2VydGFibGUiOworCVN0cmluZyBJTlZFUlNFX0pPSU5fQ09MVU1OID0gImludmVyc2Utam9pbi1jb2x1bW4iOworCVN0cmluZyBKT0lOX0NPTFVNTiA9ICJqb2luLWNvbHVtbiI7CisJU3RyaW5nIEpPSU5fVEFCTEUgPSAiam9pbi10YWJsZSI7CisJU3RyaW5nIExFTkdUSCA9ICJsZW5ndGgiOworCVN0cmluZyBMT0IgPSAibG9iIjsKKwlTdHJpbmcgTUFOWV9UT19NQU5ZID0gIm1hbnktdG8tbWFueSI7CisJU3RyaW5nIE1BTllfVE9fT05FID0gIm1hbnktdG8tb25lIjsKKwlTdHJpbmcgTUFQX0tFWSA9ICJtYXAta2V5IjsKKwlTdHJpbmcgTUFQUEVEX0JZID0gIm1hcHBlZC1ieSI7CisJU3RyaW5nIE1BUFBFRF9TVVBFUkNMQVNTID0gIm1hcHBlZC1zdXBlcmNsYXNzIjsKKwlTdHJpbmcgTUVUQURBVEFfQ09NUExFVEUgPSAibWV0YWRhdGEtY29tcGxldGUiOworCVN0cmluZyBNRVRIT0RfTkFNRSA9ICJtZXRob2QtbmFtZSI7CisJU3RyaW5nIE5BTUUgPSAibmFtZSI7CisJU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSWSA9ICJuYW1lZC1uYXRpdmUtcXVlcnkiOworCVN0cmluZyBOQU1FRF9RVUVSWSA9ICJuYW1lZC1xdWVyeSI7CisJU3RyaW5nIE5VTExBQkxFID0gIm51bGxhYmxlIjsKKwlTdHJpbmcgT05FX1RPX01BTlkgPSAib25lLXRvLW1hbnkiOworCVN0cmluZyBPTkVfVE9fT05FID0gIm9uZS10by1vbmUiOworCVN0cmluZyBPUFRJT05BTCA9ICJvcHRpb25hbCI7CisJU3RyaW5nIE9SREVSX0JZID0gIm9yZGVyLWJ5IjsKKwlTdHJpbmcgUEFDS0FHRSA9ICJwYWNrYWdlIjsKKwlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyA9ICJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIjsKKwlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9ICJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIjsKKwlTdHJpbmcgUEtfQ09MVU1OX05BTUUgPSAicGstY29sdW1uLW5hbWUiOworCVN0cmluZyBQS19DT0xVTU5fVkFMVUUgPSAicGstY29sdW1uLXZhbHVlIjsKKwlTdHJpbmcgUE9TVF9MT0FEID0gInBvc3QtbG9hZCI7CisJU3RyaW5nIFBPU1RfUEVSU0lTVCA9ICJwb3N0LXBlcnNpc3QiOworCVN0cmluZyBQT1NUX1JFTU9WRSA9ICJwb3N0LXJlbW92ZSI7CisJU3RyaW5nIFBPU1RfVVBEQVRFID0gInBvc3QtdXBkYXRlIjsKKwlTdHJpbmcgUFJFX1BFUlNJU1QgPSAicHJlLXBlcnNpc3QiOworCVN0cmluZyBQUkVfUkVNT1ZFID0gInByZS1yZW1vdmUiOworCVN0cmluZyBQUkVfVVBEQVRFID0gInByZS11cGRhdGUiOworCVN0cmluZyBQUkVDSVNJT049ICJwcmVjaXNpb24iOworCVN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTiA9ICJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI7CisJU3RyaW5nIFFVRVJZID0gInF1ZXJ5IjsKKwlTdHJpbmcgUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIjsKKwlTdHJpbmcgUkVTVUxUX0NMQVNTID0gInJlc3VsdC1jbGFzcyI7CisJU3RyaW5nIFJFU1VMVF9TRVRfTUFQUElORyA9ICJyZXN1bHQtc2V0LW1hcHBpbmciOworCVN0cmluZyBTQ0FMRT0gInNjYWxlIjsKKwlTdHJpbmcgU0NIRU1BID0gInNjaGVtYSI7CisJU3RyaW5nIFNFQ09OREFSWV9UQUJMRSA9ICJzZWNvbmRhcnktdGFibGUiOworCVN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1IgPSAic2VxdWVuY2UtZ2VuZXJhdG9yIjsKKwlTdHJpbmcgU0VRVUVOQ0VfTkFNRSA9ICJzZXF1ZW5jZS1uYW1lIjsKKwlTdHJpbmcgU1FMX1JFU1VMVF9TRVRfTUFQUElORyA9ICJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIjsKKwlTdHJpbmcgU1RSQVRFR1kgPSAic3RyYXRlZ3kiOworCVN0cmluZyBUQUJMRSA9ICJ0YWJsZSI7CisJU3RyaW5nIFRBQkxFX0dFTkVSQVRPUiA9ICJ0YWJsZS1nZW5lcmF0b3IiOworCVN0cmluZyBUQVJHRVRfRU5USVRZID0gInRhcmdldC1lbnRpdHkiOworCVN0cmluZyBURU1QT1JBTCA9ICJ0ZW1wb3JhbCI7CisJU3RyaW5nIFRSQU5TSUVOVCA9ICJ0cmFuc2llbnQiOworCVN0cmluZyBVTklRVUUgPSAidW5pcXVlIjsKKwlTdHJpbmcgVU5JUVVFX0NPTlNUUkFJTlQgPSAidW5pcXVlLWNvbnN0cmFpbnQiOworCVN0cmluZyBVUERBVEFCTEUgPSAidXBkYXRhYmxlIjsKKwlTdHJpbmcgVkFMVUUgPSAidmFsdWUiOworCVN0cmluZyBWQUxVRV9DT0xVTU5fTkFNRSA9ICJ2YWx1ZS1jb2x1bW4tbmFtZSI7CisJU3RyaW5nIFZFUlNJT04gPSAidmVyc2lvbiI7CisJU3RyaW5nIFhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFID0gInhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIjsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vTG9iLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL0xvYi5qYXZhCmluZGV4IDI0MjYwMjAuLjAwYzE3YjcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vTG9iLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Mb2IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw4ICsxMCw4IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL01hcEtleS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9NYXBLZXkuamF2YQppbmRleCA4YzQ1Yzk0Li4wMTcyZGE0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL01hcEtleS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vTWFwS2V5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw3ICs5LDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTMwLDEzICszNyw1NCBAQAogICogPC9wPgogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0TWFwS2V5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKICAqIEBleHRlbmRzIEpwYUVPYmplY3QKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGludGVyZmFjZSBNYXBLZXkgZXh0ZW5kcyBKcGFFT2JqZWN0CitwdWJsaWMgY2xhc3MgTWFwS2V5IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAogewogCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcEtleSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLk1BUF9LRVk7CisJfQorCisJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CkBAIC01MCw3ICs5OCwxMCBAQAogCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JU3RyaW5nIGdldE5hbWUoKTsKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWU7CisJfQogCiAJLyoqCiAJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC02MCw2ICsxMTEsMTExIEBACiAJICogQHNlZSAjZ2V0TmFtZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCisJeworCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7CisJCW5hbWUgPSBuZXdOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLk1BUF9LRVlfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5NQVBfS0VZX19OQU1FOgorCQkJCXJldHVybiBnZXROYW1lKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLk1BUF9LRVlfX05BTUU6CisJCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuTUFQX0tFWV9fTkFNRToKKwkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuTUFQX0tFWV9fTkFNRToKKwkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChuYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTUFQX0tFWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWFwS2V5X05hbWUoKSk7CisJfQogCiB9IC8vIE1hcEtleQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9NYXBLZXlJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL01hcEtleUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0YWIyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL01hcEtleUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldE1hcEtleUltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWFwS2V5SW1wbCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIE1hcEtleQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1hcEtleUltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5NQVBfS0VZX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldE1hcEtleV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuTUFQX0tFWV9JTVBMX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuTUFQX0tFWV9JTVBMX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLk1BUF9LRVlfSU1QTF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5NQVBfS0VZX0lNUExfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLk1BUF9LRVlfSU1QTF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIE1hcEtleQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Pcm1BcnRpZmFjdEVkaXQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vT3JtQXJ0aWZhY3RFZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNTY0OTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Pcm1BcnRpZmFjdEVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFBcnRpZmFjdEVkaXQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgT3JtQXJ0aWZhY3RFZGl0IGV4dGVuZHMgSnBhQXJ0aWZhY3RFZGl0Ci17Ci0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHJldHVybiBhbiBvcm0gYXJ0aWZhY3QgZm9yIHRoZSBwcm9qZWN0IGFQcm9qZWN0LgotCSAqIE9wZW5lZCBvbmx5IGZvciByZWFkIGFjY2VzcyAobm8gd3JpdGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChJUHJvamVjdCBhUHJvamVjdCkgewotCQlPcm1BcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFydGlmYWN0RWRpdCA9IG5ldyBPcm1BcnRpZmFjdEVkaXQoYVByb2plY3QsIHRydWUpOwotCQl9IAotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotICAgICAgICAgICAgLy8gc3VwcHJlc3MgaWxsZWdhbCBhcmd1bWVudCBleGNlcHRpb24KLSAgICAgICAgICAgIEpwdENvcmVQbHVnaW4ubG9nKGlhZSk7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0JCi0gICAgLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHJldHVybiBhbiBvcm0gYXJ0aWZhY3QgZm9yIHRoZSBwcm9qZWN0IGFQcm9qZWN0LgotICAgICAqIE9wZW5lZCBmb3IgYm90aCB3cml0ZSBhbmQgcmVhZCBhY2Nlc3MKLSAgICAgKi8JCi0JcHVibGljIHN0YXRpYyBPcm1BcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJT3JtQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgT3JtQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCX0gCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICAvLyBzdXBwcmVzcyBpbGxlZ2FsIGFyZ3VtZW50IGV4Y2VwdGlvbgotICAgICAgICAgICAgSnB0Q29yZVBsdWdpbi5sb2coaWFlKTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQkKLSAgICAKLQlwdWJsaWMgT3JtQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgCi0JCQl0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIoYVByb2plY3QsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1SZXNvdXJjZSBnZXRSZXNvdXJjZShJRmlsZSBmaWxlKSB7Ci0JCS8vIFRoaXMgKnNlZW1zKiB0byBkbyB0aGUgc2FtZSBiYXNpYyB0aGluZyBhcyBiZWxvdywgYnV0IGNpcmN1bXZlbnRzIHRoZQotCQkvLyBVUkkgbXVuZ2luZyB0aGF0IEFydGlmYWN0RWRpdE1vZGVsIGRvZXMgKHNlZSBidWcgMjA5MDkzKQotCQl0cnkgewotCQkJT3JtUmVzb3VyY2UgcmVzb3VyY2UgPSAKLQkJCQkJKE9ybVJlc291cmNlKSBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7Ci0JCQlpZiAoISByZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJcmVzb3VyY2UubG9hZChnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldFJlc291cmNlU2V0KCkuZ2V0TG9hZE9wdGlvbnMoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCUpwdENvcmVQbHVnaW4ubG9nKGlvZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtUmVzb3VyY2UgZ2V0UmVzb3VyY2UoU3RyaW5nIGZpbGVVUkkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoT3JtUmVzb3VyY2UpIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShmaWxlVVJJKSk7Ci0JCX0KLQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Pcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybUZhY3RvcnkuamF2YQppbmRleCBhMjM1OTdhLi45NzZjOGUzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybUZhY3RvcnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybUZhY3RvcnkuamF2YQpAQCAtMSwxMiArMSwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwpAQCAtMjEsMTIgKzIzLDYgQEAKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KICAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZQogICogQGdlbmVyYXRlZApAQCAtODUsNDMgKzgxLDQ0IEBACiAJewogCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKIAkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1M6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sTWFwcGVkU3VwZXJjbGFzcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbnRpdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEVtYmVkZGFibGUoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbElkSW1wbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRW1iZWRkZWRJZEltcGwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEVtYmVkZGVkSW1wbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQmFzaWNJbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFZlcnNpb25JbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUEw6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxNYW55VG9PbmVJbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUEw6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxPbmVUb01hbnlJbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE9uZVRvT25lSW1wbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE1hbnlUb01hbnlJbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sVHJhbnNpZW50SW1wbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0lNUEw6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNhc2NhZGVUeXBlSW1wbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbENvbHVtbkltcGwoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUM6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxCYXNpYygpOworCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNhc2NhZGVUeXBlKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQ29sdW1uKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuQ09MVU1OX1JFU1VMVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbHVtblJlc3VsdCgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9ESVNDUklNSU5BVE9SX0NPTFVNTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRW50aXR5TGlzdGVuZXJzKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEVsZW1lbnRDb2xsZWN0aW9uKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbWJlZGRhYmxlKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRW1iZWRkZWQoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSUQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbWJlZGRlZElkKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEVudGl0eSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVudGl0eUxpc3RlbmVyKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVudGl0eUxpc3RlbmVycygpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1M6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpOwogCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9SRVNVTFQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVFbnRpdHlSZXN1bHQoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FVkVOVF9NRVRIT0Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVFdmVudE1ldGhvZCgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLkZJRUxEX1JFU1VMVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUZpZWxkUmVzdWx0KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sR2VuZXJhdGVkVmFsdWVJbXBsKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEdlbmVyYXRlZFZhbHVlKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sSWQoKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfQ0xBU1M6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxJZENsYXNzKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuSU5IRVJJVEFOQ0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVJbmhlcml0YW5jZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX0NPTFVNTl9JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sSm9pbkNvbHVtbkltcGwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sSm9pblRhYmxlSW1wbCgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX0NPTFVNTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEpvaW5Db2x1bW4oKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEpvaW5UYWJsZSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLkxPQjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUxvYigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLk1BUF9LRVlfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1hcEtleUltcGwoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sTWFueVRvTWFueSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE1hbnlUb09uZSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLk1BUF9LRVk6IHJldHVybiAoRU9iamVjdCljcmVhdGVNYXBLZXkoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQX0tFWV9DTEFTUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE1hcEtleUNsYXNzKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sTWFwcGVkU3VwZXJjbGFzcygpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sTmFtZWRRdWVyeSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE9uZVRvTWFueSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sT25lVG9PbmUoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sT3JkZXJDb2x1bW4oKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlBPU1RfTE9BRDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBvc3RMb2FkKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuUE9TVF9QRVJTSVNUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUG9zdFBlcnNpc3QoKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5QT1NUX1JFTU9WRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBvc3RSZW1vdmUoKTsKQEAgLTEyOSwxNCArMTI2LDE2IEBACiAJCQljYXNlIE9ybVBhY2thZ2UuUFJFX1BFUlNJU1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcmVQZXJzaXN0KCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuUFJFX1JFTU9WRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVByZVJlbW92ZSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlBSRV9VUERBVEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcmVVcGRhdGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0hJTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxRdWVyeUhpbnQoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxUYWJsZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlSW1wbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxTZWNvbmRhcnlUYWJsZSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvcigpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVTcWxSZXN1bHRTZXRNYXBwaW5nKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sVGFibGVHZW5lcmF0b3JJbXBsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1VOSVFVRV9DT05TVFJBSU5UX0lNUEw6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFRhYmxlKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFRhYmxlR2VuZXJhdG9yKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFRyYW5zaWVudCgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9VTklRVUVfQ09OU1RSQUlOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFZlcnNpb24oKTsKIAkJCWRlZmF1bHQ6CiAJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKIAkJfQpAQCAtMTcyLDggKzE3MSw2IEBACiAJCQkJcmV0dXJuIGNyZWF0ZUVudW1lcmF0ZWRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5PUkRFUl9CWToKIAkJCQlyZXR1cm4gY3JlYXRlT3JkZXJCeUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlZFUlNJT05fVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVmVyc2lvblR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWRlZmF1bHQ6CiAJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKIAkJfQpAQCAtMjA5LDggKzIwNiw2IEBACiAJCQkJcmV0dXJuIGNvbnZlcnRFbnVtZXJhdGVkVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5PUkRFUl9CWToKIAkJCQlyZXR1cm4gY29udmVydE9yZGVyQnlUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlZFUlNJT05fVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFZlcnNpb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWRlZmF1bHQ6CiAJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKIAkJfQpAQCAtMjIxLDEwICsyMTYsMTAgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIFhtbEVudGl0eU1hcHBpbmdzIGNyZWF0ZVhtbEVudGl0eU1hcHBpbmdzKCkKKwlwdWJsaWMgWG1sQXNzb2NpYXRpb25PdmVycmlkZSBjcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkKIAl7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzID0gbmV3IFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCXJldHVybiB4bWxFbnRpdHlNYXBwaW5nczsKKwkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gbmV3IFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKKwkJcmV0dXJuIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CiAJfQogCiAJLyoqCkBAIC0yMzIsNTQgKzIyNywxMCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVPdmVycmlkZSBjcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpCiAJewotCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IG5ldyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQl7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gbmV3IFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sTWFwcGVkU3VwZXJjbGFzcyBjcmVhdGVYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQl7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgeG1sTWFwcGVkU3VwZXJjbGFzcyA9IG5ldyBYbWxNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCXJldHVybiB4bWxNYXBwZWRTdXBlcmNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxFbnRpdHkgY3JlYXRlWG1sRW50aXR5KCkKLQl7Ci0JCVhtbEVudGl0eSB4bWxFbnRpdHkgPSBuZXcgWG1sRW50aXR5KCk7Ci0JCXJldHVybiB4bWxFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEVtYmVkZGFibGUgY3JlYXRlWG1sRW1iZWRkYWJsZSgpCi0JewotCQlYbWxFbWJlZGRhYmxlIHhtbEVtYmVkZGFibGUgPSBuZXcgWG1sRW1iZWRkYWJsZSgpOwotCQlyZXR1cm4geG1sRW1iZWRkYWJsZTsKKwkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgeG1sQXR0cmlidXRlT3ZlcnJpZGUgPSBuZXcgWG1sQXR0cmlidXRlT3ZlcnJpZGUoKTsKKwkJcmV0dXJuIHhtbEF0dHJpYnV0ZU92ZXJyaWRlOwogCX0KIAogCS8qKgpAQCAtMjk4LDEwICsyNDksMTAgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIFhtbElkSW1wbCBjcmVhdGVYbWxJZEltcGwoKQorCXB1YmxpYyBYbWxCYXNpYyBjcmVhdGVYbWxCYXNpYygpCiAJewotCQlYbWxJZEltcGwgeG1sSWRJbXBsID0gbmV3IFhtbElkSW1wbCgpOwotCQlyZXR1cm4geG1sSWRJbXBsOworCQlYbWxCYXNpYyB4bWxCYXNpYyA9IG5ldyBYbWxCYXNpYygpOworCQlyZXR1cm4geG1sQmFzaWM7CiAJfQogCiAJLyoqCkBAIC0zMDksMTAgKzI2MCwxMCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgWG1sRW1iZWRkZWRJZEltcGwgY3JlYXRlWG1sRW1iZWRkZWRJZEltcGwoKQorCXB1YmxpYyBDYXNjYWRlVHlwZSBjcmVhdGVDYXNjYWRlVHlwZSgpCiAJewotCQlYbWxFbWJlZGRlZElkSW1wbCB4bWxFbWJlZGRlZElkSW1wbCA9IG5ldyBYbWxFbWJlZGRlZElkSW1wbCgpOwotCQlyZXR1cm4geG1sRW1iZWRkZWRJZEltcGw7CisJCUNhc2NhZGVUeXBlIGNhc2NhZGVUeXBlID0gbmV3IENhc2NhZGVUeXBlKCk7CisJCXJldHVybiBjYXNjYWRlVHlwZTsKIAl9CiAKIAkvKioKQEAgLTMyMCwxMCArMjcxLDEwIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBYbWxCYXNpY0ltcGwgY3JlYXRlWG1sQmFzaWNJbXBsKCkKKwlwdWJsaWMgWG1sQ29sbGVjdGlvblRhYmxlIGNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpCiAJewotCQlYbWxCYXNpY0ltcGwgeG1sQmFzaWNJbXBsID0gbmV3IFhtbEJhc2ljSW1wbCgpOwotCQlyZXR1cm4geG1sQmFzaWNJbXBsOworCQlYbWxDb2xsZWN0aW9uVGFibGUgeG1sQ29sbGVjdGlvblRhYmxlID0gbmV3IFhtbENvbGxlY3Rpb25UYWJsZSgpOworCQlyZXR1cm4geG1sQ29sbGVjdGlvblRhYmxlOwogCX0KIAogCS8qKgpAQCAtMzMxLDEyMCArMjgyLDEwIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBYbWxWZXJzaW9uSW1wbCBjcmVhdGVYbWxWZXJzaW9uSW1wbCgpCisJcHVibGljIFhtbENvbHVtbiBjcmVhdGVYbWxDb2x1bW4oKQogCXsKLQkJWG1sVmVyc2lvbkltcGwgeG1sVmVyc2lvbkltcGwgPSBuZXcgWG1sVmVyc2lvbkltcGwoKTsKLQkJcmV0dXJuIHhtbFZlcnNpb25JbXBsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxNYW55VG9PbmVJbXBsIGNyZWF0ZVhtbE1hbnlUb09uZUltcGwoKQotCXsKLQkJWG1sTWFueVRvT25lSW1wbCB4bWxNYW55VG9PbmVJbXBsID0gbmV3IFhtbE1hbnlUb09uZUltcGwoKTsKLQkJcmV0dXJuIHhtbE1hbnlUb09uZUltcGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9uZVRvTWFueUltcGwgY3JlYXRlWG1sT25lVG9NYW55SW1wbCgpCi0JewotCQlYbWxPbmVUb01hbnlJbXBsIHhtbE9uZVRvTWFueUltcGwgPSBuZXcgWG1sT25lVG9NYW55SW1wbCgpOwotCQlyZXR1cm4geG1sT25lVG9NYW55SW1wbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT25lVG9PbmVJbXBsIGNyZWF0ZVhtbE9uZVRvT25lSW1wbCgpCi0JewotCQlYbWxPbmVUb09uZUltcGwgeG1sT25lVG9PbmVJbXBsID0gbmV3IFhtbE9uZVRvT25lSW1wbCgpOwotCQlyZXR1cm4geG1sT25lVG9PbmVJbXBsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxNYW55VG9NYW55SW1wbCBjcmVhdGVYbWxNYW55VG9NYW55SW1wbCgpCi0JewotCQlYbWxNYW55VG9NYW55SW1wbCB4bWxNYW55VG9NYW55SW1wbCA9IG5ldyBYbWxNYW55VG9NYW55SW1wbCgpOwotCQlyZXR1cm4geG1sTWFueVRvTWFueUltcGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEVtYmVkZGVkSW1wbCBjcmVhdGVYbWxFbWJlZGRlZEltcGwoKQotCXsKLQkJWG1sRW1iZWRkZWRJbXBsIHhtbEVtYmVkZGVkSW1wbCA9IG5ldyBYbWxFbWJlZGRlZEltcGwoKTsKLQkJcmV0dXJuIHhtbEVtYmVkZGVkSW1wbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVHJhbnNpZW50SW1wbCBjcmVhdGVYbWxUcmFuc2llbnRJbXBsKCkKLQl7Ci0JCVhtbFRyYW5zaWVudEltcGwgeG1sVHJhbnNpZW50SW1wbCA9IG5ldyBYbWxUcmFuc2llbnRJbXBsKCk7Ci0JCXJldHVybiB4bWxUcmFuc2llbnRJbXBsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCBjcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpCi0JewotCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCA9IG5ldyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpOwotCQlyZXR1cm4geG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCBjcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKQotCXsKLQkJWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsIHhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCA9IG5ldyBYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKTsKLQkJcmV0dXJuIHhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FzY2FkZVR5cGVJbXBsIGNyZWF0ZUNhc2NhZGVUeXBlSW1wbCgpCi0JewotCQlDYXNjYWRlVHlwZUltcGwgY2FzY2FkZVR5cGVJbXBsID0gbmV3IENhc2NhZGVUeXBlSW1wbCgpOwotCQlyZXR1cm4gY2FzY2FkZVR5cGVJbXBsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb2x1bW5JbXBsIGNyZWF0ZVhtbENvbHVtbkltcGwoKQotCXsKLQkJWG1sQ29sdW1uSW1wbCB4bWxDb2x1bW5JbXBsID0gbmV3IFhtbENvbHVtbkltcGwoKTsKLQkJcmV0dXJuIHhtbENvbHVtbkltcGw7CisJCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBuZXcgWG1sQ29sdW1uKCk7CisJCXJldHVybiB4bWxDb2x1bW47CiAJfQogCiAJLyoqCkBAIC00NzQsMTAgKzMxNSw1NCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRW50aXR5TGlzdGVuZXJzIGNyZWF0ZUVudGl0eUxpc3RlbmVycygpCisJcHVibGljIFhtbEVsZW1lbnRDb2xsZWN0aW9uIGNyZWF0ZVhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKIAl7Ci0JCUVudGl0eUxpc3RlbmVycyBlbnRpdHlMaXN0ZW5lcnMgPSBuZXcgRW50aXR5TGlzdGVuZXJzKCk7Ci0JCXJldHVybiBlbnRpdHlMaXN0ZW5lcnM7CisJCVhtbEVsZW1lbnRDb2xsZWN0aW9uIHhtbEVsZW1lbnRDb2xsZWN0aW9uID0gbmV3IFhtbEVsZW1lbnRDb2xsZWN0aW9uKCk7CisJCXJldHVybiB4bWxFbGVtZW50Q29sbGVjdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sRW1iZWRkYWJsZSBjcmVhdGVYbWxFbWJlZGRhYmxlKCkKKwl7CisJCVhtbEVtYmVkZGFibGUgeG1sRW1iZWRkYWJsZSA9IG5ldyBYbWxFbWJlZGRhYmxlKCk7CisJCXJldHVybiB4bWxFbWJlZGRhYmxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxFbWJlZGRlZCBjcmVhdGVYbWxFbWJlZGRlZCgpCisJeworCQlYbWxFbWJlZGRlZCB4bWxFbWJlZGRlZCA9IG5ldyBYbWxFbWJlZGRlZCgpOworCQlyZXR1cm4geG1sRW1iZWRkZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbEVtYmVkZGVkSWQgY3JlYXRlWG1sRW1iZWRkZWRJZCgpCisJeworCQlYbWxFbWJlZGRlZElkIHhtbEVtYmVkZGVkSWQgPSBuZXcgWG1sRW1iZWRkZWRJZCgpOworCQlyZXR1cm4geG1sRW1iZWRkZWRJZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sRW50aXR5IGNyZWF0ZVhtbEVudGl0eSgpCisJeworCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gbmV3IFhtbEVudGl0eSgpOworCQlyZXR1cm4geG1sRW50aXR5OwogCX0KIAogCS8qKgpAQCAtNDk2LDYgKzM4MSwyOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgRW50aXR5TGlzdGVuZXJzIGNyZWF0ZUVudGl0eUxpc3RlbmVycygpCisJeworCQlFbnRpdHlMaXN0ZW5lcnMgZW50aXR5TGlzdGVuZXJzID0gbmV3IEVudGl0eUxpc3RlbmVycygpOworCQlyZXR1cm4gZW50aXR5TGlzdGVuZXJzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxFbnRpdHlNYXBwaW5ncyBjcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpCisJeworCQlYbWxFbnRpdHlNYXBwaW5ncyB4bWxFbnRpdHlNYXBwaW5ncyA9IG5ldyBYbWxFbnRpdHlNYXBwaW5ncygpOworCQlyZXR1cm4geG1sRW50aXR5TWFwcGluZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVudGl0eVJlc3VsdCBjcmVhdGVFbnRpdHlSZXN1bHQoKQogCXsKIAkJRW50aXR5UmVzdWx0IGVudGl0eVJlc3VsdCA9IG5ldyBFbnRpdHlSZXN1bHQoKTsKQEAgLTUxOCwxMCArNDI1LDIxIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBYbWxHZW5lcmF0ZWRWYWx1ZUltcGwgY3JlYXRlWG1sR2VuZXJhdGVkVmFsdWVJbXBsKCkKKwlwdWJsaWMgWG1sR2VuZXJhdGVkVmFsdWUgY3JlYXRlWG1sR2VuZXJhdGVkVmFsdWUoKQogCXsKLQkJWG1sR2VuZXJhdGVkVmFsdWVJbXBsIHhtbEdlbmVyYXRlZFZhbHVlSW1wbCA9IG5ldyBYbWxHZW5lcmF0ZWRWYWx1ZUltcGwoKTsKLQkJcmV0dXJuIHhtbEdlbmVyYXRlZFZhbHVlSW1wbDsKKwkJWG1sR2VuZXJhdGVkVmFsdWUgeG1sR2VuZXJhdGVkVmFsdWUgPSBuZXcgWG1sR2VuZXJhdGVkVmFsdWUoKTsKKwkJcmV0dXJuIHhtbEdlbmVyYXRlZFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxJZCBjcmVhdGVYbWxJZCgpCisJeworCQlYbWxJZCB4bWxJZCA9IG5ldyBYbWxJZCgpOworCQlyZXR1cm4geG1sSWQ7CiAJfQogCiAJLyoqCkBAIC01NTEsMTAgKzQ2OSwxMCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgWG1sSm9pbkNvbHVtbkltcGwgY3JlYXRlWG1sSm9pbkNvbHVtbkltcGwoKQorCXB1YmxpYyBYbWxKb2luQ29sdW1uIGNyZWF0ZVhtbEpvaW5Db2x1bW4oKQogCXsKLQkJWG1sSm9pbkNvbHVtbkltcGwgeG1sSm9pbkNvbHVtbkltcGwgPSBuZXcgWG1sSm9pbkNvbHVtbkltcGwoKTsKLQkJcmV0dXJuIHhtbEpvaW5Db2x1bW5JbXBsOworCQlYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4gPSBuZXcgWG1sSm9pbkNvbHVtbigpOworCQlyZXR1cm4geG1sSm9pbkNvbHVtbjsKIAl9CiAKIAkvKioKQEAgLTU2MiwxMCArNDgwLDEwIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBYbWxKb2luVGFibGVJbXBsIGNyZWF0ZVhtbEpvaW5UYWJsZUltcGwoKQorCXB1YmxpYyBYbWxKb2luVGFibGUgY3JlYXRlWG1sSm9pblRhYmxlKCkKIAl7Ci0JCVhtbEpvaW5UYWJsZUltcGwgeG1sSm9pblRhYmxlSW1wbCA9IG5ldyBYbWxKb2luVGFibGVJbXBsKCk7Ci0JCXJldHVybiB4bWxKb2luVGFibGVJbXBsOworCQlYbWxKb2luVGFibGUgeG1sSm9pblRhYmxlID0gbmV3IFhtbEpvaW5UYWJsZSgpOworCQlyZXR1cm4geG1sSm9pblRhYmxlOwogCX0KIAogCS8qKgpAQCAtNTg0LDEwICs1MDIsNTQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE1hcEtleUltcGwgY3JlYXRlTWFwS2V5SW1wbCgpCisJcHVibGljIFhtbE1hbnlUb01hbnkgY3JlYXRlWG1sTWFueVRvTWFueSgpCiAJewotCQlNYXBLZXlJbXBsIG1hcEtleUltcGwgPSBuZXcgTWFwS2V5SW1wbCgpOwotCQlyZXR1cm4gbWFwS2V5SW1wbDsKKwkJWG1sTWFueVRvTWFueSB4bWxNYW55VG9NYW55ID0gbmV3IFhtbE1hbnlUb01hbnkoKTsKKwkJcmV0dXJuIHhtbE1hbnlUb01hbnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbE1hbnlUb09uZSBjcmVhdGVYbWxNYW55VG9PbmUoKQorCXsKKwkJWG1sTWFueVRvT25lIHhtbE1hbnlUb09uZSA9IG5ldyBYbWxNYW55VG9PbmUoKTsKKwkJcmV0dXJuIHhtbE1hbnlUb09uZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWFwS2V5IGNyZWF0ZU1hcEtleSgpCisJeworCQlNYXBLZXkgbWFwS2V5ID0gbmV3IE1hcEtleSgpOworCQlyZXR1cm4gbWFwS2V5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxNYXBLZXlDbGFzcyBjcmVhdGVYbWxNYXBLZXlDbGFzcygpCisJeworCQlYbWxNYXBLZXlDbGFzcyB4bWxNYXBLZXlDbGFzcyA9IG5ldyBYbWxNYXBLZXlDbGFzcygpOworCQlyZXR1cm4geG1sTWFwS2V5Q2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbE1hcHBlZFN1cGVyY2xhc3MgY3JlYXRlWG1sTWFwcGVkU3VwZXJjbGFzcygpCisJeworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHhtbE1hcHBlZFN1cGVyY2xhc3MgPSBuZXcgWG1sTWFwcGVkU3VwZXJjbGFzcygpOworCQlyZXR1cm4geG1sTWFwcGVkU3VwZXJjbGFzczsKIAl9CiAKIAkvKioKQEAgLTYxNywxMCArNTc5LDU0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFdmVudE1ldGhvZCBjcmVhdGVFdmVudE1ldGhvZCgpCisJcHVibGljIFhtbE9uZVRvTWFueSBjcmVhdGVYbWxPbmVUb01hbnkoKQogCXsKLQkJRXZlbnRNZXRob2QgZXZlbnRNZXRob2QgPSBuZXcgRXZlbnRNZXRob2QoKTsKLQkJcmV0dXJuIGV2ZW50TWV0aG9kOworCQlYbWxPbmVUb01hbnkgeG1sT25lVG9NYW55ID0gbmV3IFhtbE9uZVRvTWFueSgpOworCQlyZXR1cm4geG1sT25lVG9NYW55OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxPbmVUb09uZSBjcmVhdGVYbWxPbmVUb09uZSgpCisJeworCQlYbWxPbmVUb09uZSB4bWxPbmVUb09uZSA9IG5ldyBYbWxPbmVUb09uZSgpOworCQlyZXR1cm4geG1sT25lVG9PbmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbE9yZGVyQ29sdW1uIGNyZWF0ZVhtbE9yZGVyQ29sdW1uKCkKKwl7CisJCVhtbE9yZGVyQ29sdW1uIHhtbE9yZGVyQ29sdW1uID0gbmV3IFhtbE9yZGVyQ29sdW1uKCk7CisJCXJldHVybiB4bWxPcmRlckNvbHVtbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQorCXsKKwkJWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBuZXcgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBjcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCisJeworCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IG5ldyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOworCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7CiAJfQogCiAJLyoqCkBAIC03MDUsMTAgKzcxMSwxMCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsIGNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpCisJcHVibGljIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkKIAl7Ci0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwgPSBuZXcgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsKCk7Ci0JCXJldHVybiB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGw7CisJCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHhtbFByaW1hcnlLZXlKb2luQ29sdW1uID0gbmV3IFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CisJCXJldHVybiB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKIAl9CiAKIAkvKioKQEAgLTcyNywxMCArNzMzLDEwIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBYbWxUYWJsZSBjcmVhdGVYbWxUYWJsZSgpCisJcHVibGljIFhtbFNlY29uZGFyeVRhYmxlIGNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlKCkKIAl7Ci0JCVhtbFRhYmxlIHhtbFRhYmxlID0gbmV3IFhtbFRhYmxlKCk7Ci0JCXJldHVybiB4bWxUYWJsZTsKKwkJWG1sU2Vjb25kYXJ5VGFibGUgeG1sU2Vjb25kYXJ5VGFibGUgPSBuZXcgWG1sU2Vjb25kYXJ5VGFibGUoKTsKKwkJcmV0dXJuIHhtbFNlY29uZGFyeVRhYmxlOwogCX0KIAogCS8qKgpAQCAtNzM4LDIxICs3NDQsMTAgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIFhtbFNlY29uZGFyeVRhYmxlSW1wbCBjcmVhdGVYbWxTZWNvbmRhcnlUYWJsZUltcGwoKQorCXB1YmxpYyBYbWxTZXF1ZW5jZUdlbmVyYXRvciBjcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvcigpCiAJewotCQlYbWxTZWNvbmRhcnlUYWJsZUltcGwgeG1sU2Vjb25kYXJ5VGFibGVJbXBsID0gbmV3IFhtbFNlY29uZGFyeVRhYmxlSW1wbCgpOwotCQlyZXR1cm4geG1sU2Vjb25kYXJ5VGFibGVJbXBsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwgY3JlYXRlWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCkKLQl7Ci0JCVhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCB4bWxTZXF1ZW5jZUdlbmVyYXRvckltcGwgPSBuZXcgWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCk7Ci0JCXJldHVybiB4bWxTZXF1ZW5jZUdlbmVyYXRvckltcGw7CisJCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHhtbFNlcXVlbmNlR2VuZXJhdG9yID0gbmV3IFhtbFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCXJldHVybiB4bWxTZXF1ZW5jZUdlbmVyYXRvcjsKIAl9CiAKIAkvKioKQEAgLTc3MSwxMCArNzY2LDEwIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBYbWxUYWJsZUdlbmVyYXRvckltcGwgY3JlYXRlWG1sVGFibGVHZW5lcmF0b3JJbXBsKCkKKwlwdWJsaWMgWG1sVGFibGUgY3JlYXRlWG1sVGFibGUoKQogCXsKLQkJWG1sVGFibGVHZW5lcmF0b3JJbXBsIHhtbFRhYmxlR2VuZXJhdG9ySW1wbCA9IG5ldyBYbWxUYWJsZUdlbmVyYXRvckltcGwoKTsKLQkJcmV0dXJuIHhtbFRhYmxlR2VuZXJhdG9ySW1wbDsKKwkJWG1sVGFibGUgeG1sVGFibGUgPSBuZXcgWG1sVGFibGUoKTsKKwkJcmV0dXJuIHhtbFRhYmxlOwogCX0KIAogCS8qKgpAQCAtNzgyLDEwICs3NzcsNDMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIFhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsIGNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCkKKwlwdWJsaWMgWG1sVGFibGVHZW5lcmF0b3IgY3JlYXRlWG1sVGFibGVHZW5lcmF0b3IoKQogCXsKLQkJWG1sVW5pcXVlQ29uc3RyYWludEltcGwgeG1sVW5pcXVlQ29uc3RyYWludEltcGwgPSBuZXcgWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKLQkJcmV0dXJuIHhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsOworCQlYbWxUYWJsZUdlbmVyYXRvciB4bWxUYWJsZUdlbmVyYXRvciA9IG5ldyBYbWxUYWJsZUdlbmVyYXRvcigpOworCQlyZXR1cm4geG1sVGFibGVHZW5lcmF0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbFRyYW5zaWVudCBjcmVhdGVYbWxUcmFuc2llbnQoKQorCXsKKwkJWG1sVHJhbnNpZW50IHhtbFRyYW5zaWVudCA9IG5ldyBYbWxUcmFuc2llbnQoKTsKKwkJcmV0dXJuIHhtbFRyYW5zaWVudDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sVW5pcXVlQ29uc3RyYWludCBjcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCkKKwl7CisJCVhtbFVuaXF1ZUNvbnN0cmFpbnQgeG1sVW5pcXVlQ29uc3RyYWludCA9IG5ldyBYbWxVbmlxdWVDb25zdHJhaW50KCk7CisJCXJldHVybiB4bWxVbmlxdWVDb25zdHJhaW50OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxWZXJzaW9uIGNyZWF0ZVhtbFZlcnNpb24oKQorCXsKKwkJWG1sVmVyc2lvbiB4bWxWZXJzaW9uID0gbmV3IFhtbFZlcnNpb24oKTsKKwkJcmV0dXJuIHhtbFZlcnNpb247CiAJfQogCiAJLyoqCkBAIC0xMDA3LDI2ICsxMDM1LDYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVWZXJzaW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCXJldHVybiAoU3RyaW5nKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZlcnNpb25UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCiAJcHVibGljIE9ybVBhY2thZ2UgZ2V0T3JtUGFja2FnZSgpCiAJewogCQlyZXR1cm4gKE9ybVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vT3JtUGFja2FnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Pcm1QYWNrYWdlLmphdmEKaW5kZXggYjBkNWM3NC4uM2MxYjYyMSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Pcm1QYWNrYWdlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Pcm1QYWNrYWdlLmphdmEKQEAgLTEsMTIgKzEsMTQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKQEAgLTE5LDcgKzIxLDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2U7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTMxLDEyICszNiw2IEBACiAgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KICAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CiAgKiA8L3VsPgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeQogICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCkBAIC03NywyMyArNzYsNjM2IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBPcm1QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlLmluaXQoKTsKIAogCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzIDxlbT5YbWwgRW50aXR5IE1hcHBpbmdzPC9lbT59JyBjbGFzcy4KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NIb2xkZXIgPGVtPlhtbCBBY2Nlc3MgSG9sZGVyPC9lbT59JyBjbGFzcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzSG9sZGVyCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NIb2xkZXIoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQUNDRVNTX0hPTERFUiA9IDk7CiAKIAkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1ZFUlNJT04gPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BQ0NFU1NfSE9MREVSX19BQ0NFU1MgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBY2Nlc3MgSG9sZGVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19IT0xERVJfRkVBVFVSRV9DT1VOVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZworCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfTUFQUElORyA9IDEwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1MgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfMjBfX0FDQ0VTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUUgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgPGVtPkFic3RyYWN0IFhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElORyA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUyA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRSA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBYbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTmFtZWRDb2x1bW4gPGVtPkFic3RyYWN0IFhtbCBOYW1lZCBDb2x1bW48L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxOYW1lZENvbHVtbgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU4gPSA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fTkFNRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgWG1sIE5hbWVkIENvbHVtbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IDI7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbENvbHVtbiA8ZW0+QWJzdHJhY3QgWG1sIENvbHVtbjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbENvbHVtbgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQ09MVU1OID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQ09MVU1OX19OQU1FID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnNlcnRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQ09MVU1OX19JTlNFUlRBQkxFID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0NPTFVNTl9fTlVMTEFCTEUgPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQ09MVU1OX19UQUJMRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQ09MVU1OX19VTklRVUUgPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwZGF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0NPTFVNTl9fVVBEQVRBQkxFID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBYbWwgQ29sdW1uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0NPTFVNTl9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sRW1iZWRkZWQgPGVtPkFic3RyYWN0IFhtbCBFbWJlZGRlZDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEVtYmVkZGVkCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbEVtYmVkZGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0VNQkVEREVEID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9FTUJFRERFRF9fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0VNQkVEREVEX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFic3RyYWN0IFhtbCBFbWJlZGRlZDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9FTUJFRERFRF9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkcgPSA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19BQ0NFU1MgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBYbWwgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgTXVsdGkgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19BQ0NFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19OQU1FID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWSA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSCA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlkgPSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0JZID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWSA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBYbWwgTXVsdGkgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyA8ZW0+QWJzdHJhY3QgWG1sIFNpbmdsZSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkcgPSA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19BQ0NFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fTkFNRSA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSCA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERSA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0lEID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHMgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFNfSUQgPSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX09QVElPTkFMID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFic3RyYWN0IFhtbCBTaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlIDxlbT5BYnN0cmFjdCBYbWwgVGFibGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxUYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9UQUJMRSA9IDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1RBQkxFX19OQU1FID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVEFCTEVfX0NBVEFMT0cgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1RBQkxFX19TQ0hFTUEgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZSBDb25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUyA9IDM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgWG1sIFRhYmxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1RBQkxFX0ZFQVRVUkVfQ09VTlQgPSA0OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcgPGVtPlhtbCBUeXBlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFR5cGVNYXBwaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfTUFQUElORyA9IDc4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTID0gWE1MX0FDQ0VTU19IT0xERVJfX0FDQ0VTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FID0gWE1MX0FDQ0VTU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFID0gWE1MX0FDQ0VTU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDE7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTEwMiwyMzQgKzcxNCwyNSBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0RFU0NSSVBUSU9OID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTiA9IFhNTF9BQ0NFU1NfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAyOwogCiAJLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUyA9IFhNTF9BQ0NFU1NfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAzOwogCiAJLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFR5cGUgTWFwcGluZzwvZW0+JyBjbGFzcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1BBQ0tBR0UgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fU0NIRU1BID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1RBQkxFX0dFTkVSQVRPUlMgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUVVFUklFUyA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfTkFUSVZFX1FVRVJJRVMgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBTdXBlcmNsYXNzZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fTUFQUEVEX1NVUEVSQ0xBU1NFUyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0VOVElUSUVTID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW1iZWRkYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fRU1CRUREQUJMRVMgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW50aXR5IE1hcHBpbmdzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhtbCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19TQ0hFTUEgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVRBTE9HID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1MgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgUGVyc2lzdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBU0NBREVfUEVSU0lTVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlMgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfRkVBVFVSRV9DT1VOVCA9IDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gWE1MX0FDQ0VTU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDQ7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgVHlwZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KQEAgLTMzOSwxNiArNzQyLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sVHlwZU1hcHBpbmcoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HID0gODsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTM1Nyw3ICs3NTEsMTYgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BQ0NFU1MgPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FDQ0VTUyA9IFhNTF9UWVBFX01BUFBJTkdfX0FDQ0VTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FID0gWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMzY2LDcgKzc2OSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEUgPSAyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFID0gWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEU7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTM3NSw3ICs3NzgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0RFU0NSSVBUSU9OID0gMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTiA9IFhNTF9UWVBFX01BUFBJTkdfX0RFU0NSSVBUSU9OOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTM4NCw3ICs3ODcsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVMgPSA0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVMgPSBYTUxfVFlQRV9NQVBQSU5HX19BVFRSSUJVVEVTOwogCiAJLyoqCiAJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFic3RyYWN0IFhtbCBUeXBlIE1hcHBpbmc8L2VtPicgY2xhc3MuCkBAIC0zOTMsNyArNzk2LDE4NjYgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSA1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IFhNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uc01hcHBpbmcgPGVtPlhtbCBKb2luIENvbHVtbnMgTWFwcGluZzwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uc01hcHBpbmcKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5Db2x1bW5zTWFwcGluZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTlNfTUFQUElORyA9IDQzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5TX01BUFBJTkdfX0pPSU5fQ09MVU1OUyA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gQ29sdW1ucyBNYXBwaW5nPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OU19NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSA8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREUgPSAxMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX0NPTFVNTlMgPSBYTUxfSk9JTl9DT0xVTU5TX01BUFBJTkdfX0pPSU5fQ09MVU1OUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19ERVNDUklQVElPTiA9IFhNTF9KT0lOX0NPTFVNTlNfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fVEFCTEUgPSBYTUxfSk9JTl9DT0xVTU5TX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19OQU1FID0gWE1MX0pPSU5fQ09MVU1OU19NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9GRUFUVVJFX0NPVU5UID0gWE1MX0pPSU5fQ09MVU1OU19NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciA8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUiA9IDEyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZSBDb250YWluZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUgPGVtPlhtbCBBdHRyaWJ1dGUgT3ZlcnJpZGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9PVkVSUklERSA9IDEzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFX19ERVNDUklQVElPTiA9IE9ybVYyXzBQYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfMjBfX0RFU0NSSVBUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OID0gT3JtVjJfMFBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV8yMF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFX19OQU1FID0gT3JtVjJfMFBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV8yMF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9PVkVSUklERV9GRUFUVVJFX0NPVU5UID0gT3JtVjJfMFBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV8yMF9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIDxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFX0NPTlRBSU5FUiA9IDE0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfX0FUVFJJQlVURV9PVkVSUklERVMgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBdHRyaWJ1dGUgT3ZlcnJpZGUgQ29udGFpbmVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTID0gMTU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0RFU0NSSVBUSU9OID0gT3JtVjJfMFBhY2thZ2UuWE1MX0FUVFJJQlVURVNfMjBfX0RFU0NSSVBUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgQ29sbGVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fRUxFTUVOVF9DT0xMRUNUSU9OUyA9IE9ybVYyXzBQYWNrYWdlLlhNTF9BVFRSSUJVVEVTXzIwX19FTEVNRU5UX0NPTExFQ1RJT05TOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19JRFMgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFU18yMF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbWJlZGRlZCBJZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fRU1CRURERURfSURTID0gT3JtVjJfMFBhY2thZ2UuWE1MX0FUVFJJQlVURVNfMjBfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzaWNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0JBU0lDUyA9IE9ybVYyXzBQYWNrYWdlLlhNTF9BVFRSSUJVVEVTXzIwX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX1ZFUlNJT05TID0gT3JtVjJfMFBhY2thZ2UuWE1MX0FUVFJJQlVURVNfMjBfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueSBUbyBPbmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX01BTllfVE9fT05FUyA9IE9ybVYyXzBQYWNrYWdlLlhNTF9BVFRSSUJVVEVTXzIwX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9uZSBUbyBNYW55czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19PTkVfVE9fTUFOWVMgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFU18yMF9GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PbmUgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19PTkVfVE9fT05FUyA9IE9ybVYyXzBQYWNrYWdlLlhNTF9BVFRSSUJVVEVTXzIwX0ZFQVRVUkVfQ09VTlQgKyA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnkgVG8gTWFueXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fTUFOWV9UT19NQU5ZUyA9IE9ybVYyXzBQYWNrYWdlLlhNTF9BVFRSSUJVVEVTXzIwX0ZFQVRVUkVfQ09VTlQgKyA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVtYmVkZGVkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19FTUJFRERFRFMgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFU18yMF9GRUFUVVJFX0NPVU5UICsgODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2llbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX1RSQU5TSUVOVFMgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFU18yMF9GRUFUVVJFX0NPVU5UICsgOTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19GRUFUVVJFX0NPVU5UID0gT3JtVjJfMFBhY2thZ2UuWE1MX0FUVFJJQlVURVNfMjBfRkVBVFVSRV9DT1VOVCArIDEwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMgPGVtPlhtbCBCYXNpYzwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYworCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzaWMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUMgPSAxNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19DT0xVTU4gPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX0xPQiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19URU1QT1JBTCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX0VOVU1FUkFURUQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fRkVUQ0ggPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fT1BUSU9OQUwgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2ljPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSA8ZW0+Q2FzY2FkZSBUeXBlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDYXNjYWRlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBU0NBREVfVFlQRSA9IDE3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgQWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfX0NBU0NBREVfQUxMID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIFBlcnNpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBU0NBREVfVFlQRV9fQ0FTQ0FERV9QRVJTSVNUID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIE1lcmdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfX0NBU0NBREVfTUVSR0UgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgUmVtb3ZlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfX0NBU0NBREVfUkVNT1ZFID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIFJlZnJlc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBU0NBREVfVFlQRV9fQ0FTQ0FERV9SRUZSRVNIID0gNDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DYXNjYWRlIFR5cGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGUgPGVtPlhtbCBDb2xsZWN0aW9uIFRhYmxlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvblRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fVEFCTEUgPSAxODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9UQUJMRV9fTkFNRSA9IEFCU1RSQUNUX1hNTF9UQUJMRV9fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9UQUJMRV9fQ0FUQUxPRyA9IEFCU1RSQUNUX1hNTF9UQUJMRV9fQ0FUQUxPRzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFX19TQ0hFTUEgPSBBQlNUUkFDVF9YTUxfVEFCTEVfX1NDSEVNQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUyA9IEFCU1RSQUNUX1hNTF9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9UQUJMRV9fSk9JTl9DT0xVTU5TID0gQUJTVFJBQ1RfWE1MX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDb2xsZWN0aW9uIFRhYmxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fVEFCTEVfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiA8ZW0+WG1sIENvbHVtbjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU4gPSAxOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSBBQlNUUkFDVF9YTUxfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19OQU1FID0gQUJTVFJBQ1RfWE1MX0NPTFVNTl9fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnNlcnRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19JTlNFUlRBQkxFID0gQUJTVFJBQ1RfWE1MX0NPTFVNTl9fSU5TRVJUQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fTlVMTEFCTEUgPSBBQlNUUkFDVF9YTUxfQ09MVU1OX19OVUxMQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fVEFCTEUgPSBBQlNUUkFDVF9YTUxfQ09MVU1OX19UQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fX1VOSVFVRSA9IEFCU1RSQUNUX1hNTF9DT0xVTU5fX1VOSVFVRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fX1VQREFUQUJMRSA9IEFCU1RSQUNUX1hNTF9DT0xVTU5fX1VQREFUQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fX0xFTkdUSCA9IEFCU1RSQUNUX1hNTF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY2lzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19QUkVDSVNJT04gPSBBQlNUUkFDVF9YTUxfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19TQ0FMRSA9IEFCU1RSQUNUX1hNTF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvbHVtbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nIDxlbT5Db2x1bW4gTWFwcGluZzwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDb2x1bW5NYXBwaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX01BUFBJTkcgPSAyMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9NQVBQSU5HX19DT0xVTU4gPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbHVtbiBNYXBwaW5nPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5SZXN1bHQgPGVtPkNvbHVtbiBSZXN1bHQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uUmVzdWx0CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDb2x1bW5SZXN1bHQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fUkVTVUxUID0gMjE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX1JFU1VMVF9fTkFNRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29sdW1uIFJlc3VsdDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9SRVNVTFRfRkVBVFVSRV9DT1VOVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcgPGVtPlhtbCBDb252ZXJ0aWJsZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZworCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkcgPSAyMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19MT0IgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUwgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19FTlVNRVJBVEVEID0gMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29udmVydGlibGUgTWFwcGluZzwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSAzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlzY3JpbWluYXRvckNvbHVtbiA8ZW0+WG1sIERpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbERpc2NyaW1pbmF0b3JDb2x1bW4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSAyMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fTkFNRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0RJU0NSSU1JTkFUT1JfVFlQRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0xFTkdUSCA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIERpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24gPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb248L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTiA9IDI0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTkFNRSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0xPQiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEVNUE9SQUwgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fRU5VTUVSQVRFRCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RBUkdFVF9DTEFTUyA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fRkVUQ0ggPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0JZID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQ09MVU1OID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVkgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DTEFTUyA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IFRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX1RFTVBPUkFMID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9FTlVNRVJBVEVEID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT0xVTU4gPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfSk9JTl9DT0xVTU5TID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTFVNTiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2xsZWN0aW9uIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xMRUNUSU9OX1RBQkxFID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxNzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxODsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUgPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRSA9IDI1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FDQ0VTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQ0xBU1NfTkFNRSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19NRVRBREFUQV9DT01QTEVURSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fREVTQ1JJUFRJT04gPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQVRUUklCVVRFUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVtYmVkZGFibGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkIDxlbT5YbWwgRW1iZWRkZWQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEID0gMjY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9FTUJFRERFRF9fQUNDRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9FTUJFRERFRF9fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUyA9IEFCU1RSQUNUX1hNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBBQlNUUkFDVF9YTUxfRU1CRURERURfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVtYmVkZGVkPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfRU1CRURERURfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkIDxlbT5YbWwgRW1iZWRkZWQgSWQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRCA9IDI3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX19BQ0NFU1MgPSBBQlNUUkFDVF9YTUxfRU1CRURERURfX0FDQ0VTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfX05BTUUgPSBBQlNUUkFDVF9YTUxfRU1CRURERURfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfX0FUVFJJQlVURV9PVkVSUklERVMgPSBBQlNUUkFDVF9YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVtYmVkZGVkIElkPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfRU1CRURERURfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkgPGVtPlhtbCBFbnRpdHk8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZID0gMjg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BQ0NFU1MgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BQ0NFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQ0xBU1NfTkFNRSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX01FVEFEQVRBX0NPTVBMRVRFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fREVTQ1JJUFRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQVRUUklCVVRFUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19OQU1FRF9RVUVSSUVTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19OQU1FRF9OQVRJVkVfUVVFUklFUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUGVyc2lzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJFX1BFUlNJU1QgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgUGVyc2lzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUE9TVF9QRVJTSVNUID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QUkVfUkVNT1ZFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUE9TVF9SRU1PVkUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBVcGRhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BSRV9VUERBVEUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QT1NUX1VQREFURSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QT1NUX0xPQUQgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0FUVFJJQlVURV9PVkVSUklERVMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DQUNIRUFCTEUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19OQU1FID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1RBQkxFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2Vjb25kYXJ5IFRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19TRUNPTkRBUllfVEFCTEVTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkIENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19JRF9DTEFTUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaGVyaXRhbmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19JTkhFUklUQU5DRSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDIyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIFN1cGVyY2xhc3MgTGlzdGVuZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRU5USVRZX0xJU1RFTkVSUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI1OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyNjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyIDxlbT5YbWwgRXZlbnQgTWV0aG9kIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lcgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUiA9IDM0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUFJFX1BFUlNJU1QgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgUGVyc2lzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfUEVSU0lTVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BSRV9SRU1PVkUgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9SRU1PVkUgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBVcGRhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QUkVfVVBEQVRFID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfVVBEQVRFID0gNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IExvYWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QT1NUX0xPQUQgPSA2OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFdmVudCBNZXRob2QgQ29udGFpbmVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IDc7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciA8ZW0+RW50aXR5IExpc3RlbmVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9MSVNURU5FUiA9IDI5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJfX1BSRV9QRVJTSVNUID0gWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BSRV9QRVJTSVNUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgUGVyc2lzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QT1NUX1BFUlNJU1QgPSBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9QRVJTSVNUOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9MSVNURU5FUl9fUFJFX1JFTU9WRSA9IFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QUkVfUkVNT1ZFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJfX1BPU1RfUkVNT1ZFID0gWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfUkVNT1ZFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBVcGRhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9MSVNURU5FUl9fUFJFX1VQREFURSA9IFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QUkVfVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJfX1BPU1RfVVBEQVRFID0gWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfVVBEQVRFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgTG9hZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QT1NUX0xPQUQgPSBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9MT0FEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJfX0RFU0NSSVBUSU9OID0gWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19DTEFTU19OQU1FID0gWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RW50aXR5IExpc3RlbmVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX0ZFQVRVUkVfQ09VTlQgPSBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVycyA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eUxpc3RlbmVycygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9MSVNURU5FUlMgPSAzMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9MSVNURU5FUlNfX0VOVElUWV9MSVNURU5FUlMgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJTX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MgPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HUyA9IDMxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5UmVzdWx0IDxlbT5FbnRpdHkgUmVzdWx0PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW50aXR5UmVzdWx0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1JFU1VMVCA9IDMyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRXZlbnRNZXRob2QgPGVtPkV2ZW50IE1ldGhvZDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FdmVudE1ldGhvZAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RXZlbnRNZXRob2QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9NRVRIT0QgPSAzMzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZpZWxkUmVzdWx0IDxlbT5GaWVsZCBSZXN1bHQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmllbGRSZXN1bHQKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEZpZWxkUmVzdWx0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfUkVTVUxUID0gMzU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZSA8ZW0+WG1sIEdlbmVyYXRlZCBWYWx1ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdGVkVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVEVEX1ZBTFVFID0gMzY7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IgPGVtPlhtbCBHZW5lcmF0b3I8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVE9SID0gMzc7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3JDb250YWluZXIgPGVtPlhtbCBHZW5lcmF0b3IgQ29udGFpbmVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lcgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRPUl9DT05UQUlORVIgPSAzODsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkIDxlbT5YbWwgSWQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEID0gMzk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzIDxlbT5YbWwgSWQgQ2xhc3M8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzcworCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSWRDbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9DTEFTUyA9IDQwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2UgPGVtPkluaGVyaXRhbmNlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRJbmhlcml0YW5jZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSEVSSVRBTkNFID0gNDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uIDxlbT5YbWwgSm9pbiBDb2x1bW48L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pbkNvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTiA9IDQyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlIDxlbT5YbWwgSm9pbiBUYWJsZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFID0gNDQ7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVNYXBwaW5nIDxlbT5YbWwgSm9pbiBUYWJsZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZU1hcHBpbmcKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZU1hcHBpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9NQVBQSU5HID0gNDU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Mb2IgPGVtPkxvYjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Mb2IKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldExvYigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQiA9IDQ2OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSA8ZW0+WG1sIE1hbnkgVG8gTWFueTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWSA9IDQ3OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIDxlbT5YbWwgTWFueSBUbyBPbmU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9PbmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkUgPSA0ODsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleSA8ZW0+TWFwIEtleTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldE1hcEtleSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BUF9LRVkgPSA0OTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcEtleUNsYXNzIDxlbT5YbWwgTWFwIEtleSBDbGFzczwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBLZXlDbGFzcworCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwS2V5Q2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQX0tFWV9DTEFTUyA9IDUwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkQnlNYXBwaW5nIDxlbT5YbWwgTWFwcGVkIEJ5IE1hcHBpbmc8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkQnlNYXBwaW5nCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRCeU1hcHBpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX0JZX01BUFBJTkcgPSA1MTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzczwvZW0+fScgY2xhc3MuCkBAIC00MDMsNyArMjY2NSw2MTkgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1MgPSA0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTUyA9IDUyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnkgPGVtPlhtbCBRdWVyeTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUlkgPSA2OTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnkgPGVtPlhtbCBOYW1lZCBOYXRpdmUgUXVlcnk8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWROYXRpdmVRdWVyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9OQVRJVkVfUVVFUlkgPSA1MzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnkgPGVtPlhtbCBOYW1lZCBRdWVyeTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxOYW1lZFF1ZXJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1FVRVJZID0gNTQ7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZyA8ZW0+WG1sIE51bGwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05VTExfQVRUUklCVVRFX01BUFBJTkcgPSA1NTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSA8ZW0+WG1sIE9uZSBUbyBNYW55PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZID0gNTY7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSA8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvT25lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkUgPSA1NzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uIDxlbT5YbWwgT3JkZXIgQ29sdW1uPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU4gPSA1ODsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cworCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyA9IDU5OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBID0gNjA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Qb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlBvc3RMb2FkCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQb3N0TG9hZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfTE9BRCA9IDYxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFBlcnNpc3QgPGVtPlBvc3QgUGVyc2lzdDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Qb3N0UGVyc2lzdAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0UG9zdFBlcnNpc3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX1BFUlNJU1QgPSA2MjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlBvc3RSZW1vdmUgPGVtPlBvc3QgUmVtb3ZlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlBvc3RSZW1vdmUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFBvc3RSZW1vdmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX1JFTU9WRSA9IDYzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFVwZGF0ZSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFVwZGF0ZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0UG9zdFVwZGF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfVVBEQVRFID0gNjQ7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5QcmVQZXJzaXN0IDxlbT5QcmUgUGVyc2lzdDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5QcmVQZXJzaXN0CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQcmVQZXJzaXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1BFUlNJU1QgPSA2NTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlByZVJlbW92ZSA8ZW0+UHJlIFJlbW92ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5QcmVSZW1vdmUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFByZVJlbW92ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9SRU1PVkUgPSA2NjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5QcmVVcGRhdGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFByZVVwZGF0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9VUERBVEUgPSA2NzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uIDxlbT5YbWwgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW48L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OID0gNjg7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciA8ZW0+WG1sIFF1ZXJ5IENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lcgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfQ09OVEFJTkVSID0gNzA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fVkVSU0lPTiA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9fVkVSU0lPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1NDSEVNQV9MT0NBVElPTiA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9fU0NIRU1BX0xPQ0FUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUVVFUklFUyA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUyA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTUyA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFID0gQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fU0NIRU1BID0gQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0NBVEFMT0cgPSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTID0gQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fVEFCTEVfR0VORVJBVE9SUyA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIFN1cGVyY2xhc3NlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19NQVBQRURfU1VQRVJDTEFTU0VTID0gQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19FTlRJVElFUyA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW1iZWRkYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fRU1CRUREQUJMRVMgPSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDEzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfUkVTVUxUX19ESVNDUklNSU5BVE9SX0NPTFVNTiA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfUkVTVUxUX19FTlRJVFlfQ0xBU1MgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIFJlc3VsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1JFU1VMVF9fRklFTERfUkVTVUxUUyA9IDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RW50aXR5IFJlc3VsdDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9SRVNVTFRfRkVBVFVSRV9DT1VOVCA9IDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX01FVEhPRF9fREVTQ1JJUFRJT04gPSBPcm1WMl8wUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EXzIwX19ERVNDUklQVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTUVUSE9EX19NRVRIT0RfTkFNRSA9IE9ybVYyXzBQYWNrYWdlLlhNTF9FVkVOVF9NRVRIT0RfMjBfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXZlbnQgTWV0aG9kPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgPSBPcm1WMl8wUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1JFU1VMVF9fTkFNRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9SRVNVTFRfX0NPTFVNTiA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RmllbGQgUmVzdWx0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfUkVTVUxUX0ZFQVRVUkVfQ09VTlQgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJhdGVneTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1kgPSAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBHZW5lcmF0ZWQgVmFsdWU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVEVEX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVE9SX19ERVNDUklQVElPTiA9IE9ybVYyXzBQYWNrYWdlLlhNTF9HRU5FUkFUT1JfMjBfX0RFU0NSSVBUSU9OOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFUT1JfX05BTUUgPSBPcm1WMl8wUGFja2FnZS5YTUxfR0VORVJBVE9SXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUUgPSBPcm1WMl8wUGFja2FnZS5YTUxfR0VORVJBVE9SXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsbG9jYXRpb24gU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFID0gT3JtVjJfMFBhY2thZ2UuWE1MX0dFTkVSQVRPUl8yMF9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgR2VuZXJhdG9yPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UID0gT3JtVjJfMFBhY2thZ2UuWE1MX0dFTkVSQVRPUl8yMF9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19TRVFVRU5DRV9HRU5FUkFUT1IgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUiA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEdlbmVyYXRvciBDb250YWluZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19DT0xVTU4gPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0xPQiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19URU1QT1JBTCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0VOVU1FUkFURUQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fVEFCTEVfR0VORVJBVE9SID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19HRU5FUkFURURfVkFMVUUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIElkPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDc7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNDEyLDcgKzMyODYsNTExIEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTEFTU19OQU1FID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfQ0xBU1NfX0NMQVNTX05BTUUgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBJZCBDbGFzczwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9DTEFTU19GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJhdGVneTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5IRVJJVEFOQ0VfX1NUUkFURUdZID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Jbmhlcml0YW5jZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSEVSSVRBTkNFX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gQUJTVFJBQ1RfWE1MX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX19OQU1FID0gQUJTVFJBQ1RfWE1MX0NPTFVNTl9fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnNlcnRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fX0lOU0VSVEFCTEUgPSBBQlNUUkFDVF9YTUxfQ09MVU1OX19JTlNFUlRBQkxFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bGxhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fX05VTExBQkxFID0gQUJTVFJBQ1RfWE1MX0NPTFVNTl9fTlVMTEFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9fVEFCTEUgPSBBQlNUUkFDVF9YTUxfQ09MVU1OX19UQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9fVU5JUVVFID0gQUJTVFJBQ1RfWE1MX0NPTFVNTl9fVU5JUVVFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwZGF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX19VUERBVEFCTEUgPSBBQlNUUkFDVF9YTUxfQ09MVU1OX19VUERBVEFCTEU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gQUJTVFJBQ1RfWE1MX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgSm9pbiBDb2x1bW48L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX05BTUUgPSBBQlNUUkFDVF9YTUxfVEFCTEVfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX0NBVEFMT0cgPSBBQlNUUkFDVF9YTUxfVEFCTEVfX0NBVEFMT0c7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9fU0NIRU1BID0gQUJTVFJBQ1RfWE1MX1RBQkxFX19TQ0hFTUE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSBBQlNUUkFDVF9YTUxfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnZlcnNlIEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9fSU5WRVJTRV9KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gVGFibGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX01BUFBJTkdfX0pPSU5fVEFCTEUgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBKb2luIFRhYmxlIE1hcHBpbmc8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQl9GRUFUVVJFX0NPVU5UID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fQUNDRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX05BTUUgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fVEFSR0VUX0VOVElUWSA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fRkVUQ0ggPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX0NBU0NBREUgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBQRURfQlkgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFBFRF9CWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19KT0lOX1RBQkxFID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19PUkRFUl9CWSA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQlk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWSA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX09SREVSX0NPTFVNTiA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfVEVNUE9SQUwgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBFbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0VOVU1FUkFURUQgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU4gPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hbnkgVG8gTWFueTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fQUNDRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fTkFNRSA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19UQVJHRVRfRU5USVRZID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19GRVRDSCA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fQ0FTQ0FERSA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19KT0lOX1RBQkxFID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fSUQgPSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19JRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBzIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX01BUFNfSUQgPSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBTX0lEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX09QVElPTkFMID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUw7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hbnkgVG8gT25lPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BUF9LRVlfX05BTUUgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1hcCBLZXk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVBfS0VZX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBfS0VZX0NMQVNTX19DTEFTU19OQU1FID0gT3JtVjJfMFBhY2thZ2UuWE1MX01BUF9LRVlfQ0xBU1NfMjBfX0NMQVNTX05BTUU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hcCBLZXkgQ2xhc3M8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQX0tFWV9DTEFTU19GRUFUVVJFX0NPVU5UID0gT3JtVjJfMFBhY2thZ2UuWE1MX01BUF9LRVlfQ0xBU1NfMjBfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX0JZX01BUFBJTkdfX01BUFBFRF9CWSA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hcHBlZCBCeSBNYXBwaW5nPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9CWV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSAxOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNDI0LDYgKzM4MDIsMTUgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FDQ0VTUzsKIAogCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMQVNTX05BTUUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FOworCisJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTQ4NywxMTMgKzM4NzQsMTMgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwogCiAJLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9QRVJTSVNUID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9QRVJTSVNUID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9SRU1PVkUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUkVNT1ZFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9VUERBVEUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfVVBEQVRFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IExvYWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9MT0FEID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzPC9lbT4nIGNsYXNzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSA8ZW0+WG1sIEVudGl0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFkgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NMQVNTX05BTUUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19NRVRBREFUQV9DT01QTEVURSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNjAyLDE2ICszODg5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0FUVFJJQlVURVMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BVFRSSUJVVEVTOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9fREVTQ1JJUFRJT04gPSBPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfMjBfX0RFU0NSSVBUSU9OOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTYyMCwzODUwICszODk4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19OQU1FID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fVEFCTEUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY29uZGFyeSBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fU0VDT05EQVJZX1RBQkxFUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0lEX0NMQVNTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbmhlcml0YW5jZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0UgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX0NPTFVNTiA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX05BTUVEX1FVRVJJRVMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19OQU1FRF9OQVRJVkVfUVVFUklFUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QT1NUX1BFUlNJU1QgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QUkVfUkVNT1ZFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJFX1VQREFURSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QT1NUX1VQREFURSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgTG9hZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUE9TVF9MT0FEID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUgPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0NMQVNTX05BTUUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FDQ0VTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX01FVEFEQVRBX0NPTVBMRVRFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19BVFRSSUJVVEVTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW1iZWRkYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFUyA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0lEUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW1iZWRkZWQgSWRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0VNQkVEREVEX0lEUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzaWNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0JBU0lDUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fVkVSU0lPTlMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnkgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19NQU5ZX1RPX09ORVMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9uZSBUbyBNYW55czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19PTkVfVE9fTUFOWVMgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9uZSBUbyBPbmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX09ORV9UT19PTkVTID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55IFRvIE1hbnlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX01BTllfVE9fTUFOWVMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVtYmVkZGVkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19FTUJFRERFRFMgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zaWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fVFJBTlNJRU5UUyA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXR0cmlidXRlczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCA9IDEwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyA8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX01BUFBJTkcgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkcgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRSA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBYbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgTnVsbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTlVMTF9BVFRSSUJVVEVfTUFQUElORyA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OVUxMX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBOdWxsIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05VTExfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmcgPGVtPkNvbHVtbiBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENvbHVtbk1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fTUFQUElORyA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX01BUFBJTkdfX0NPTFVNTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29sdW1uIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fTUFQUElOR19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPlhtbCBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19OQU1FID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWSA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEUgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIDxlbT5YbWwgTXVsdGkgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkcgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUUgPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZID0gWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIID0gWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEUgPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFID0gWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlkgPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQlkgPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZID0gWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNdWx0aSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyA8ZW0+WG1sIFNpbmdsZSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElORyA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUUgPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWSA9IFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0ggPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEUgPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERSA9IFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUwgPSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fQ09MVU1OUyA9IFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgU2luZ2xlIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQgPGVtPlhtbCBJZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSUQgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX05BTUUgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0NPTFVNTiA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fR0VORVJBVEVEX1ZBTFVFID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1RFTVBPUkFMID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19UQUJMRV9HRU5FUkFUT1IgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgSWQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfRkVBVFVSRV9DT1VOVCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkSW1wbCA8ZW0+WG1sIElkIEltcGw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxJZEltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfSU1QTCA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9JTVBMX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX0lNUExfX0NPTFVNTiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9JTVBMX19HRU5FUkFURURfVkFMVUUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9JTVBMX19URU1QT1JBTCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9JTVBMX19UQUJMRV9HRU5FUkFUT1IgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfSU1QTF9fU0VRVUVOQ0VfR0VORVJBVE9SID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBJZCBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkJhc2VYbWxFbWJlZGRlZCA8ZW0+QmFzZSBYbWwgRW1iZWRkZWQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQmFzZVhtbEVtYmVkZGVkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRCYXNlWG1sRW1iZWRkZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVNFX1hNTF9FTUJFRERFRCA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBU0VfWE1MX0VNQkVEREVEX19OQU1FID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVMgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QmFzZSBYbWwgRW1iZWRkZWQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVNFX1hNTF9FTUJFRERFRF9GRUFUVVJFX0NPVU5UID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZCA8ZW0+WG1sIEVtYmVkZGVkIElkPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSUQgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfX05BTUUgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfX0FUVFJJQlVURV9PVkVSUklERVMgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVtYmVkZGVkIElkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkSW1wbCA8ZW0+WG1sIEVtYmVkZGVkIElkIEltcGw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWRJbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX0lNUEwgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfSU1QTF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9JTVBMX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRlZCBJZCBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljIDxlbT5YbWwgQmFzaWM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2ljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0ltcGwgPGVtPlhtbCBCYXNpYyBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzaWNJbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0lNUEwgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24gPGVtPlhtbCBWZXJzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTiA9IDI0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbkltcGwgPGVtPlhtbCBWZXJzaW9uIEltcGw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFZlcnNpb25JbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fSU1QTCA9IDI1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIDxlbT5YbWwgTWFueSBUbyBPbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9PbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkUgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZUltcGwgPGVtPlhtbCBNYW55IFRvIE9uZSBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hbnlUb09uZUltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfSU1QTCA9IDI3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55IDxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb01hbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTlkgPSAyODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueUltcGwgPGVtPlhtbCBPbmUgVG8gTWFueSBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueUltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfSU1QTCA9IDI5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUgPGVtPlhtbCBPbmUgVG8gT25lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZUltcGwgPGVtPlhtbCBPbmUgVG8gT25lIEltcGw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZUltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9JTVBMID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55IDxlbT5YbWwgTWFueSBUbyBNYW55PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hbnlUb01hbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55SW1wbCA8ZW0+WG1sIE1hbnkgVG8gTWFueSBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55SW1wbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfSU1QTCA9IDMzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQgPGVtPlhtbCBFbWJlZGRlZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERUQgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfX05BTUUgPSBCQVNFX1hNTF9FTUJFRERFRF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUyA9IEJBU0VfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRlZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9GRUFUVVJFX0NPVU5UID0gQkFTRV9YTUxfRU1CRURERURfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZEltcGwgPGVtPlhtbCBFbWJlZGRlZCBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRJbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lNUEwgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSU1QTF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JTVBMX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRlZCBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX05BTUUgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX0NPTFVNTiA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19GRVRDSCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19PUFRJT05BTCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fTE9CID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX1RFTVBPUkFMID0gWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fRU5VTUVSQVRFRCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmFzaWM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfSU1QTF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19JTVBMX19DT0xVTU4gPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19JTVBMX19GRVRDSCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0lNUExfX09QVElPTkFMID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0lNUExfX0xPQiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0lNUExfX1RFTVBPUkFMID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19JTVBMX19FTlVNRVJBVEVEID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBCYXNpYyBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fTkFNRSA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19DT0xVTU4gPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19URU1QT1JBTCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVmVyc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fSU1QTF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX0lNUExfX0NPTFVNTiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fSU1QTF9fVEVNUE9SQUwgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFZlcnNpb24gSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX05BTUUgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fVEFSR0VUX0VOVElUWSA9IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fRkVUQ0ggPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0pPSU5fVEFCTEUgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fQ0FTQ0FERSA9IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fT1BUSU9OQUwgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19KT0lOX0NPTFVNTlMgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hbnkgVG8gT25lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9JTVBMX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9JTVBMX19UQVJHRVRfRU5USVRZID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfSU1QTF9fRkVUQ0ggPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fVEFCTEUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX0lNUExfX0NBU0NBREUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9JTVBMX19PUFRJT05BTCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFueSBUbyBPbmUgSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19OQU1FID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fVEFSR0VUX0VOVElUWSA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19GRVRDSCA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19KT0lOX1RBQkxFID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fQ0FTQ0FERSA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQUEVEX0JZID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fT1JERVJfQlkgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0JZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWSA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19KT0lOX0NPTFVNTlMgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9uZSBUbyBNYW55PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX0lNUExfX05BTUUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX0lNUExfX1RBUkdFVF9FTlRJVFkgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9JTVBMX19GRVRDSCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfSU1QTF9fQ0FTQ0FERSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9JTVBMX19NQVBQRURfQlkgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9JTVBMX19PUkRFUl9CWSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfSU1QTF9fTUFQX0tFWSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE1hbnkgSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX05BTUUgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19UQVJHRVRfRU5USVRZID0gWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0ZFVENIID0gWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0pPSU5fVEFCTEUgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19DQVNDQURFID0gWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX09QVElPTkFMID0gWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19KT0lOX0NPTFVNTlMgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fTUFQUEVEX0JZID0gWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UID0gWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9JTVBMX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX0lNUExfX1RBUkdFVF9FTlRJVFkgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX0lNUExfX0ZFVENIID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fVEFCTEUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfSU1QTF9fQ0FTQ0FERSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfSU1QTF9fT1BUSU9OQUwgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX0lNUExfX01BUFBFRF9CWSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPbmUgVG8gT25lIEltcGw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTkFNRSA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19UQVJHRVRfRU5USVRZID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19GRVRDSCA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fSk9JTl9UQUJMRSA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19DQVNDQURFID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTUFQUEVEX0JZID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX09SREVSX0JZID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9CWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE1hbnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9JTVBMX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfSU1QTF9fVEFSR0VUX0VOVElUWSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9JTVBMX19GRVRDSCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX0lNUExfX0pPSU5fVEFCTEUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9JTVBMX19DQVNDQURFID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9JTVBMX19NQVBQRURfQlkgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfSU1QTF9fT1JERVJfQlkgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9JTVBMX19NQVBfS0VZID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE1hbnkgSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfSU1QTF9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IDxlbT5YbWwgVHJhbnNpZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVHJhbnNpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVCA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfX05BTUUgPSBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFRyYW5zaWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfRkVBVFVSRV9DT1VOVCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudEltcGwgPGVtPlhtbCBUcmFuc2llbnQgSW1wbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUcmFuc2llbnRJbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVF9JTVBMID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVF9JTVBMX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUcmFuc2llbnQgSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfSU1QTF9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSA8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREUgPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX0NPTFVNTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwgPGVtPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZSBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMX19KT0lOX0NPTFVNTlMgPSBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fQ09MVU1OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU1QTF9fTkFNRSA9IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZSA8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFX19DT0xVTU4gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBdHRyaWJ1dGUgT3ZlcnJpZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsIDxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlIEltcGw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFX0lNUEwgPSAzOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTF9fQ09MVU1OID0gWE1MX0FUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTF9fTkFNRSA9IFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9PVkVSUklERV9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQVRUUklCVVRFX09WRVJSSURFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGUgPGVtPkNhc2NhZGUgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q2FzY2FkZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEUgPSA0MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIEFsbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FERV9UWVBFX19DQVNDQURFX0FMTCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBQZXJzaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfX0NBU0NBREVfUEVSU0lTVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBNZXJnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FERV9UWVBFX19DQVNDQURFX01FUkdFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIFJlbW92ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FERV9UWVBFX19DQVNDQURFX1JFTU9WRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBSZWZyZXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfX0NBU0NBREVfUkVGUkVTSCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2FzY2FkZSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FERV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGVJbXBsIDxlbT5DYXNjYWRlIFR5cGUgSW1wbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENhc2NhZGVUeXBlSW1wbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBU0NBREVfVFlQRV9JTVBMID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBBbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX0FMTCA9IENBU0NBREVfVFlQRV9fQ0FTQ0FERV9BTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBQZXJzaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9QRVJTSVNUID0gQ0FTQ0FERV9UWVBFX19DQVNDQURFX1BFUlNJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBNZXJnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FERV9UWVBFX0lNUExfX0NBU0NBREVfTUVSR0UgPSBDQVNDQURFX1RZUEVfX0NBU0NBREVfTUVSR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBSZW1vdmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBU0NBREVfVFlQRV9JTVBMX19DQVNDQURFX1JFTU9WRSA9IENBU0NBREVfVFlQRV9fQ0FTQ0FERV9SRU1PVkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBSZWZyZXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfSU1QTF9fQ0FTQ0FERV9SRUZSRVNIID0gQ0FTQ0FERV9UWVBFX19DQVNDQURFX1JFRlJFU0g7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2FzY2FkZSBUeXBlIEltcGw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfSU1QTF9GRUFUVVJFX0NPVU5UID0gQ0FTQ0FERV9UWVBFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4gPGVtPlhtbCBOYW1lZCBDb2x1bW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX0NPTFVNTiA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX0NPTFVNTl9fTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE5hbWVkIENvbHVtbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE5hbWVkQ29sdW1uIDxlbT5BYnN0cmFjdCBYbWwgTmFtZWQgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTmFtZWRDb2x1bW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sTmFtZWRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fTkFNRSA9IFhNTF9OQU1FRF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgWG1sIE5hbWVkIENvbHVtbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiA8ZW0+WG1sIEFic3RyYWN0IENvbHVtbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWJzdHJhY3RDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQUJTVFJBQ1RfQ09MVU1OID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BQlNUUkFDVF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FCU1RSQUNUX0NPTFVNTl9fTkFNRSA9IFhNTF9OQU1FRF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRSA9IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFID0gWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEUgPSBYTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FCU1RSQUNUX0NPTFVNTl9fVU5JUVVFID0gWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BQlNUUkFDVF9DT0xVTU5fX1VQREFUQUJMRSA9IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEFic3RyYWN0IENvbHVtbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BQlNUUkFDVF9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uIDxlbT5BYnN0cmFjdCBYbWwgQWJzdHJhY3QgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OID0gNDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fTkFNRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEUgPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVU5JUVVFID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VQREFUQUJMRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgWG1sIEFic3RyYWN0IENvbHVtbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4gPGVtPlhtbCBDb2x1bW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gWE1MX0FCU1RSQUNUX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fTkFNRSA9IFhNTF9BQlNUUkFDVF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fSU5TRVJUQUJMRSA9IFhNTF9BQlNUUkFDVF9DT0xVTU5fX0lOU0VSVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fX05VTExBQkxFID0gWE1MX0FCU1RSQUNUX0NPTFVNTl9fTlVMTEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fX1RBQkxFID0gWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19VTklRVUUgPSBYTUxfQUJTVFJBQ1RfQ09MVU1OX19VTklRVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19VUERBVEFCTEUgPSBYTUxfQUJTVFJBQ1RfQ09MVU1OX19VUERBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19MRU5HVEggPSBYTUxfQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fUFJFQ0lTSU9OID0gWE1MX0FCU1RSQUNUX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fU0NBTEUgPSBYTUxfQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDb2x1bW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uSW1wbCA8ZW0+WG1sIENvbHVtbiBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbHVtbkltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX0lNUEwgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9JTVBMX19DT0xVTU5fREVGSU5JVElPTiA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fSU1QTF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9JTVBMX19JTlNFUlRBQkxFID0gQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9JTVBMX19OVUxMQUJMRSA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX0lNUExfX1RBQkxFID0gQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX0lNUExfX1VOSVFVRSA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fSU1QTF9fVVBEQVRBQkxFID0gQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9JTVBMX19MRU5HVEggPSBBQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9JTVBMX19QUkVDSVNJT04gPSBBQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX0lNUExfX1NDQUxFID0gQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29sdW1uIEltcGw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5SZXN1bHQgPGVtPkNvbHVtbiBSZXN1bHQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uUmVzdWx0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDb2x1bW5SZXN1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fUkVTVUxUID0gNDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX1JFU1VMVF9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29sdW1uIFJlc3VsdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9SRVNVTFRfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5YbWwgRGlzY3JpbWluYXRvciBDb2x1bW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlzY3JpbWluYXRvckNvbHVtbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRGlzY3JpbWluYXRvckNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ESVNDUklNSU5BVE9SX0NPTFVNTiA9IDQ5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19OQU1FID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fTEVOR1RIID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRGlzY3JpbWluYXRvciBDb2x1bW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXJzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJTID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJTX19FTlRJVFlfTElTVEVORVJTID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyIDxlbT5FbnRpdHkgTGlzdGVuZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eUxpc3RlbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19DTEFTU19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUGVyc2lzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QUkVfUEVSU0lTVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJfX1BPU1RfUEVSU0lTVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QUkVfUkVNT1ZFID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QT1NUX1JFTU9WRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QUkVfVVBEQVRFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QT1NUX1VQREFURSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJfX1BPU1RfTE9BRCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RW50aXR5IExpc3RlbmVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX0ZFQVRVUkVfQ09VTlQgPSA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5UmVzdWx0IDxlbT5FbnRpdHkgUmVzdWx0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW50aXR5UmVzdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1JFU1VMVCA9IDUyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfUkVTVUxUX19ESVNDUklNSU5BVE9SX0NPTFVNTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfUkVTVUxUX19FTlRJVFlfQ0xBU1MgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIFJlc3VsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1JFU1VMVF9fRklFTERfUkVTVUxUUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RW50aXR5IFJlc3VsdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9SRVNVTFRfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GaWVsZFJlc3VsdCA8ZW0+RmllbGQgUmVzdWx0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZpZWxkUmVzdWx0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRGaWVsZFJlc3VsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1JFU1VMVCA9IDU0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2UgPGVtPkluaGVyaXRhbmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRJbmhlcml0YW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSEVSSVRBTkNFID0gNTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Mb2IgPGVtPkxvYjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Mb2IKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldExvYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQiA9IDYzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5IDxlbT5NYXAgS2V5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0TWFwS2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFQX0tFWSA9IDY0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRXZlbnRNZXRob2QgPGVtPkV2ZW50IE1ldGhvZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FdmVudE1ldGhvZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RXZlbnRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9NRVRIT0QgPSA1MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTUVUSE9EX19NRVRIT0RfTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXZlbnQgTWV0aG9kPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1JFU1VMVF9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9SRVNVTFRfX0NPTFVNTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RmllbGQgUmVzdWx0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfUkVTVUxUX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWUgPGVtPlhtbCBHZW5lcmF0ZWQgVmFsdWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRFRF9WQUxVRSA9IDU1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJhdGVneTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1kgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBHZW5lcmF0ZWQgVmFsdWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVEVEX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWVJbXBsIDxlbT5YbWwgR2VuZXJhdGVkIFZhbHVlIEltcGw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0ZWRWYWx1ZUltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVEVEX1ZBTFVFX0lNUEwgPSA1NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFURURfVkFMVUVfSU1QTF9fR0VORVJBVE9SID0gWE1MX0dFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cmF0ZWd5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVEVEX1ZBTFVFX0lNUExfX1NUUkFURUdZID0gWE1MX0dFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1k7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEdlbmVyYXRlZCBWYWx1ZSBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRFRF9WQUxVRV9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBYTUxfR0VORVJBVEVEX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzcyA8ZW0+WG1sIElkIENsYXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkQ2xhc3MKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfQ0xBU1MgPSA1NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfQ0xBU1NfX0NMQVNTX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBJZCBDbGFzczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9DTEFTU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJhdGVneTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5IRVJJVEFOQ0VfX1NUUkFURUdZID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Jbmhlcml0YW5jZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSEVSSVRBTkNFX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbiA8ZW0+WG1sIEpvaW4gQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5Db2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU4gPSA1OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IFhNTF9BQlNUUkFDVF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9fTkFNRSA9IFhNTF9BQlNUUkFDVF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX19JTlNFUlRBQkxFID0gWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX19OVUxMQUJMRSA9IFhNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fX1RBQkxFID0gWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fX1VOSVFVRSA9IFhNTF9BQlNUUkFDVF9DT0xVTU5fX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9fVVBEQVRBQkxFID0gWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9IFhNTF9BQlNUUkFDVF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gQ29sdW1uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbkltcGwgPGVtPlhtbCBKb2luIENvbHVtbiBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxKb2luQ29sdW1uSW1wbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9JTVBMID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9JTVBMX19DT0xVTU5fREVGSU5JVElPTiA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9JTVBMX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnNlcnRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fSU1QTF9fSU5TRVJUQUJMRSA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX0lOU0VSVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9JTVBMX19OVUxMQUJMRSA9IEFCU1RSQUNUX1hNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fSU1QTF9fVEFCTEUgPSBBQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19UQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9JTVBMX19VTklRVUUgPSBBQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX19VTklRVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fSU1QTF9fVVBEQVRBQkxFID0gQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9fVVBEQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9JTVBMX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgSm9pbiBDb2x1bW4gSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlIDxlbT5YbWwgQmFzZSBUYWJsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX1RBQkxFID0gODA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0VfVEFCTEVfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX1RBQkxFX19DQVRBTE9HID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX1RBQkxFX19TQ0hFTUEgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZSBDb25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmFzZSBUYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX1RBQkxFX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlIDxlbT5YbWwgSm9pbiBUYWJsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFID0gNjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX05BTUUgPSBYTUxfQkFTRV9UQUJMRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9fQ0FUQUxPRyA9IFhNTF9CQVNFX1RBQkxFX19DQVRBTE9HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX1NDSEVNQSA9IFhNTF9CQVNFX1RBQkxFX19TQ0hFTUE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSBYTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TID0gWE1MX0JBU0VfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW52ZXJzZSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TID0gWE1MX0JBU0VfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gVGFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9GRUFUVVJFX0NPVU5UID0gWE1MX0JBU0VfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VUYWJsZSA8ZW0+QWJzdHJhY3QgWG1sIEJhc2UgVGFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxCYXNlVGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQmFzZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEUgPSA3OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fTkFNRSA9IFhNTF9CQVNFX1RBQkxFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19DQVRBTE9HID0gWE1MX0JBU0VfVEFCTEVfX0NBVEFMT0c7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fU0NIRU1BID0gWE1MX0JBU0VfVEFCTEVfX1NDSEVNQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUyA9IFhNTF9CQVNFX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgWG1sIEJhc2UgVGFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9GRUFUVVJFX0NPVU5UID0gWE1MX0JBU0VfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVJbXBsIDxlbT5YbWwgSm9pbiBUYWJsZSBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZUltcGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9JTVBMID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfSU1QTF9fTkFNRSA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX0lNUExfX0NBVEFMT0cgPSBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fQ0FUQUxPRzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX0lNUExfX1NDSEVNQSA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19TQ0hFTUE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX0lNUExfX1VOSVFVRV9DT05TVFJBSU5UUyA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX0lNUExfX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludmVyc2UgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX0lNUExfX0lOVkVSU0VfSk9JTl9DT0xVTU5TID0gQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gVGFibGUgSW1wbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQl9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVBfS0VZX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NYXAgS2V5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFQX0tFWV9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleUltcGwgPGVtPk1hcCBLZXkgSW1wbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRNYXBLZXlJbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFQX0tFWV9JTVBMID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFQX0tFWV9JTVBMX19OQU1FID0gTUFQX0tFWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NYXAgS2V5IEltcGw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVBfS0VZX0lNUExfRkVBVFVSRV9DT1VOVCA9IE1BUF9LRVlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSA8ZW0+WG1sIFF1ZXJ5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWSA9IDY2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9fTkFNRSA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX19OQU1FID0gT3JtVjJfMFBhY2thZ2UuWE1MX1FVRVJZXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC00NDcyLDcgKzM5MDcsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9fUVVFUlkgPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9fUVVFUlkgPSBPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfMjBfRkVBVFVSRV9DT1VOVCArIDE7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNDQ4MSw3ICszOTE2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfX0hJTlRTID0gMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfX0hJTlRTID0gT3JtVjJfMFBhY2thZ2UuWE1MX1FVRVJZXzIwX0ZFQVRVUkVfQ09VTlQgKyAyOwogCiAJLyoqCiAJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBRdWVyeTwvZW0+JyBjbGFzcy4KQEAgLTQ0OTAsMTcgKzM5MjUsMTYgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfRkVBVFVSRV9DT1VOVCA9IDM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0ZFQVRVUkVfQ09VTlQgPSBPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfMjBfRkVBVFVSRV9DT1VOVCArIDM7CiAKIAkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5IDxlbT5YbWwgTmFtZWQgTmF0aXZlIFF1ZXJ5PC9lbT59JyBjbGFzcy4KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkTmF0aXZlUXVlcnkoKQogCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9OQVRJVkVfUVVFUlkgPSA2NzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfTkFUSVZFX1FVRVJZX19ERVNDUklQVElPTiA9IFhNTF9RVUVSWV9fREVTQ1JJUFRJT047CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNDU1NywxNCArMzk5MSwxMyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9OQVRJVkVfUVVFUllfRkVBVFVSRV9DT1VOVCA9IFhNTF9RVUVSWV9GRUFUVVJFX0NPVU5UICsgMjsKIAogCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnkgPGVtPlhtbCBOYW1lZCBRdWVyeTwvZW0+fScgY2xhc3MuCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxOYW1lZFF1ZXJ5KCkKIAkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfUVVFUlkgPSA2ODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfUVVFUllfX0RFU0NSSVBUSU9OID0gWE1MX1FVRVJZX19ERVNDUklQVElPTjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC00NTk0LDIzICs0MDI3LDUxNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9RVUVSWV9fSElOVFMgPSBYTUxfUVVFUllfX0hJTlRTOwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2sgTW9kZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1FVRVJZX19MT0NLX01PREUgPSBYTUxfUVVFUllfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE5hbWVkIFF1ZXJ5PC9lbT4nIGNsYXNzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1FVRVJZX0ZFQVRVUkVfQ09VTlQgPSBYTUxfUVVFUllfRkVBVFVSRV9DT1VOVCArIDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1FVRVJZX0ZFQVRVUkVfQ09VTlQgPSBYTUxfUVVFUllfRkVBVFVSRV9DT1VOVCArIDE7CiAKIAkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Qb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59JyBjbGFzcy4KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Qb3N0TG9hZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0UG9zdExvYWQoKQogCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfTE9BRCA9IDY5OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OVUxMX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1MgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTlVMTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTnVsbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fQUNDRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTkFNRSA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX1RBUkdFVF9FTlRJVFkgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fRkVUQ0ggPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fQ0FTQ0FERSA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQUEVEX0JZID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19KT0lOX1RBQkxFID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX09SREVSX0JZID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9CWTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVkgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9ycGhhbiBSZW1vdmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX09SUEhBTl9SRU1PVkFMID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19PUkRFUl9DT0xVTU4gPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9URU1QT1JBTCA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9FTlVNRVJBVEVEID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NPTFVNTiA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfSk9JTl9DT0xVTU5TID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA4OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPbmUgVG8gTWFueTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0FDQ0VTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fTkFNRSA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1RBUkdFVF9FTlRJVFkgPSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fRkVUQ0ggPSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fQ0FTQ0FERSA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0pPSU5fVEFCTEUgPSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fSk9JTl9DT0xVTU5TID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9DT0xVTU5TOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fSUQgPSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19JRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBzIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fTUFQU19JRCA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFNfSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19PUFRJT05BTCA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX09QVElPTkFMOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWSA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JwaGFuIFJlbW92YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19PUlBIQU5fUkVNT1ZBTCA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPbmUgVG8gT25lPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl9fTkFNRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fX05VTExBQkxFID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnNlcnRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX19JTlNFUlRBQkxFID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fX1VQREFUQUJMRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9yZGVyIENvbHVtbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTID0gWE1MX0FDQ0VTU19IT0xERVJfX0FDQ0VTUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFU0NSSVBUSU9OID0gWE1MX0FDQ0VTU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsaW1pdGVkIElkZW50aWZpZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fREVMSU1JVEVEX0lERU5USUZJRVJTID0gWE1MX0FDQ0VTU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fU0NIRU1BID0gWE1MX0FDQ0VTU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBVEFMT0cgPSBYTUxfQUNDRVNTX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIFBlcnNpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVNDQURFX1BFUlNJU1QgPSBYTUxfQUNDRVNTX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fRU5USVRZX0xJU1RFTkVSUyA9IFhNTF9BQ0NFU1NfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfRkVBVFVSRV9DT1VOVCA9IFhNTF9BQ0NFU1NfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fREVTQ1JJUFRJT04gPSBPcm1WMl8wUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV8yMF9fREVTQ1JJUFRJT047CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WG1sIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURSA9IE9ybVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTID0gT3JtVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfMjBfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9GRUFUVVJFX0NPVU5UID0gT3JtVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfMjBfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfTE9BRF9fREVTQ1JJUFRJT04gPSBFVkVOVF9NRVRIT0RfX0RFU0NSSVBUSU9OOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC00NjMxLDE0ICs0NTU4LDEzIEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9MT0FEX0ZFQVRVUkVfQ09VTlQgPSBFVkVOVF9NRVRIT0RfRkVBVFVSRV9DT1VOVCArIDA7CiAKIAkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Qb3N0UGVyc2lzdCA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59JyBjbGFzcy4KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlBvc3RQZXJzaXN0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQb3N0UGVyc2lzdCgpCiAJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9QRVJTSVNUID0gNzA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9QRVJTSVNUX19ERVNDUklQVElPTiA9IEVWRU5UX01FVEhPRF9fREVTQ1JJUFRJT047CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTQ2NTksMTQgKzQ1ODUsMTMgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX1BFUlNJU1RfRkVBVFVSRV9DT1VOVCA9IEVWRU5UX01FVEhPRF9GRUFUVVJFX0NPVU5UICsgMDsKIAogCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlBvc3RSZW1vdmUgPGVtPlBvc3QgUmVtb3ZlPC9lbT59JyBjbGFzcy4KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlBvc3RSZW1vdmUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFBvc3RSZW1vdmUoKQogCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfUkVNT1ZFID0gNzE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9SRU1PVkVfX0RFU0NSSVBUSU9OID0gRVZFTlRfTUVUSE9EX19ERVNDUklQVElPTjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNDY4NywxNCArNDYxMiwxMyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfUkVNT1ZFX0ZFQVRVUkVfQ09VTlQgPSBFVkVOVF9NRVRIT0RfRkVBVFVSRV9DT1VOVCArIDA7CiAKIAkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Qb3N0VXBkYXRlIDxlbT5Qb3N0IFVwZGF0ZTwvZW0+fScgY2xhc3MuCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Qb3N0VXBkYXRlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQb3N0VXBkYXRlKCkKIAkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX1VQREFURSA9IDcyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfVVBEQVRFX19ERVNDUklQVElPTiA9IEVWRU5UX01FVEhPRF9fREVTQ1JJUFRJT047CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTQ3MTUsMTQgKzQ2MzksMTMgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX1VQREFURV9GRUFUVVJFX0NPVU5UID0gRVZFTlRfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgKyAwOwogCiAJLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUHJlUGVyc2lzdCA8ZW0+UHJlIFBlcnNpc3Q8L2VtPn0nIGNsYXNzLgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUHJlUGVyc2lzdAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0UHJlUGVyc2lzdCgpCiAJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1BFUlNJU1QgPSA3MzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfUEVSU0lTVF9fREVTQ1JJUFRJT04gPSBFVkVOVF9NRVRIT0RfX0RFU0NSSVBUSU9OOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC00NzQzLDE0ICs0NjY2LDEzIEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1BFUlNJU1RfRkVBVFVSRV9DT1VOVCA9IEVWRU5UX01FVEhPRF9GRUFUVVJFX0NPVU5UICsgMDsKIAogCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlByZVJlbW92ZSA8ZW0+UHJlIFJlbW92ZTwvZW0+fScgY2xhc3MuCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5QcmVSZW1vdmUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFByZVJlbW92ZSgpCiAJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1JFTU9WRSA9IDc0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9SRU1PVkVfX0RFU0NSSVBUSU9OID0gRVZFTlRfTUVUSE9EX19ERVNDUklQVElPTjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNDc3MSwxNCArNDY5MywxMyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9SRU1PVkVfRkVBVFVSRV9DT1VOVCA9IEVWRU5UX01FVEhPRF9GRUFUVVJFX0NPVU5UICsgMDsKIAogCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScgY2xhc3MuCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5QcmVVcGRhdGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFByZVVwZGF0ZSgpCiAJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1VQREFURSA9IDc1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9VUERBVEVfX0RFU0NSSVBUSU9OID0gRVZFTlRfTUVUSE9EX19ERVNDUklQVElPTjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNDc5OSwyMyArNDcyMCwxMyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9VUERBVEVfRkVBVFVSRV9DT1VOVCA9IEVWRU5UX01FVEhPRF9GRUFUVVJFX0NPVU5UICsgMDsKIAogCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uIDxlbT5YbWwgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OID0gNzY7Ci0KLQkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSBYTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNDgyNCw3ICs0NzM1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX05BTUUgPSBYTUxfTkFNRURfQ09MVU1OX19OQU1FOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fTkFNRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX05BTUU7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNDgzMyw3ICs0NzQ0LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSBYTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7CiAKIAkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uPC9lbT4nIGNsYXNzLgpAQCAtNDg0Miw1MyArNDc1MywzNCBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9GRUFUVVJFX0NPVU5UID0gWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDE7CiAKIAkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwgPGVtPlhtbCBQcmltYXJ5IEtleSBKb2luIENvbHVtbiBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX0lNUEwgPSA3NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9JTVBMX19DT0xVTU5fREVGSU5JVElPTiA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX1FVRVJJRVMgPSAwOwogCiAJLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX0lNUExfX05BTUUgPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX19OQU1FOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX05BVElWRV9RVUVSSUVTID0gMTsKIAogCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBRdWVyeSBDb250YWluZXI8L2VtPicgY2xhc3MuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fSU1QTF9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uIEltcGw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fSU1QTF9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgPSAyOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50IDxlbT5YbWwgUXVlcnkgSGludDwvZW0+fScgY2xhc3MuCkBAIC00ODk4LDcgKzQ3OTAsMTYgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5SGludCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9ISU5UID0gNzg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0hJTlQgPSA3MTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0hJTlRfX0RFU0NSSVBUSU9OID0gT3JtVjJfMFBhY2thZ2UuWE1MX1FVRVJZX0hJTlRfMjBfX0RFU0NSSVBUSU9OOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTQ5MDcsNyArNDgwOCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0hJTlRfX05BTUUgPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9ISU5UX19OQU1FID0gT3JtVjJfMFBhY2thZ2UuWE1MX1FVRVJZX0hJTlRfMjBfRkVBVFVSRV9DT1VOVCArIDA7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTQ5MTYsNyArNDgxNyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0hJTlRfX1ZBTFVFID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfSElOVF9fVkFMVUUgPSBPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfSElOVF8yMF9GRUFUVVJFX0NPVU5UICsgMTsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUXVlcnkgSGludDwvZW0+JyBjbGFzcy4KQEAgLTQ5MjUsNjIgKzQ4MjYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9ISU5UX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGUgPGVtPlhtbCBUYWJsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEUgPSA4MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfX05BTUUgPSBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfX0NBVEFMT0cgPSBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fQ0FUQUxPRzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9fU0NIRU1BID0gQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX1NDSEVNQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0hJTlRfRkVBVFVSRV9DT1VOVCA9IE9ybVYyXzBQYWNrYWdlLlhNTF9RVUVSWV9ISU5UXzIwX0ZFQVRVUkVfQ09VTlQgKyAyOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGUgPGVtPlhtbCBTZWNvbmRhcnkgVGFibGU8L2VtPn0nIGNsYXNzLgpAQCAtNDk5MCw3ICs0ODM2LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlY29uZGFyeVRhYmxlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRSA9IDgyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEUgPSA3MjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC00OTk5LDcgKzQ4NDUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEVfX05BTUUgPSBYTUxfQkFTRV9UQUJMRV9fTkFNRTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19OQU1FID0gQUJTVFJBQ1RfWE1MX1RBQkxFX19OQU1FOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTUwMDgsNyArNDg1NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9fQ0FUQUxPRyA9IFhNTF9CQVNFX1RBQkxFX19DQVRBTE9HOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEVfX0NBVEFMT0cgPSBBQlNUUkFDVF9YTUxfVEFCTEVfX0NBVEFMT0c7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC01MDE3LDcgKzQ4NjMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEVfX1NDSEVNQSA9IFhNTF9CQVNFX1RBQkxFX19TQ0hFTUE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9fU0NIRU1BID0gQUJTVFJBQ1RfWE1MX1RBQkxFX19TQ0hFTUE7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTUwMjYsNyArNDg3Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gWE1MX0JBU0VfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSBBQlNUUkFDVF9YTUxfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNTAzNSw3ICs0ODgxLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBYTUxfQkFTRV9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDA7CiAKIAkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFNlY29uZGFyeSBUYWJsZTwvZW0+JyBjbGFzcy4KQEAgLTUwNDQsMTE3ICs0ODkwLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQkFTRV9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlSW1wbCA8ZW0+WG1sIFNlY29uZGFyeSBUYWJsZSBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2Vjb25kYXJ5VGFibGVJbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9JTVBMID0gODM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9JTVBMX19OQU1FID0gQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9JTVBMX19DQVRBTE9HID0gQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX0NBVEFMT0c7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX0lNUExfX1NDSEVNQSA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX19TQ0hFTUE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTF9fVU5JUVVFX0NPTlNUUkFJTlRTID0gQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9JTVBMX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlIEltcGw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX0lNUExfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9CQVNFX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yIDxlbT5YbWwgR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRPUiA9IDg0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFUT1JfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsbG9jYXRpb24gU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgR2VuZXJhdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UID0gMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDE7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+WG1sIFNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+fScgY2xhc3MuCkBAIC01MTY0LDcgKzQ5MDAsMTYgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUiA9IDg1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1IgPSA3MzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fREVTQ1JJUFRJT04gPSBYTUxfR0VORVJBVE9SX19ERVNDUklQVElPTjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC01MTk0LDEzICs0OTM5LDMxIEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFID0gWE1MX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFOwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX0NBVEFMT0cgPSBYTUxfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0NIRU1BID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19TRVFVRU5DRV9OQU1FID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19TRVFVRU5DRV9OQU1FID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMjsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgU2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNsYXNzLgpAQCAtNTIwOSw2MiArNDk3Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCA8ZW0+WG1sIFNlcXVlbmNlIEdlbmVyYXRvciBJbXBsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMID0gODY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19OQU1FID0gWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfX0lOSVRJQUxfVkFMVUUgPSBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsbG9jYXRpb24gU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19BTExPQ0FUSU9OX1NJWkUgPSBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19TRVFVRU5DRV9OQU1FID0gWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0VRVUVOQ0VfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgU2VxdWVuY2UgR2VuZXJhdG9yIEltcGw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfRkVBVFVSRV9DT1VOVCA9IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMzsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmcgPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn0nIGNsYXNzLgpAQCAtNTI3NCw3ICs0OTgyLDE2IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRTcWxSZXN1bHRTZXRNYXBwaW5nKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMX1JFU1VMVF9TRVRfTUFQUElORyA9IDg3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTF9SRVNVTFRfU0VUX01BUFBJTkcgPSA3NDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fREVTQ1JJUFRJT04gPSBPcm1WMl8wUGFja2FnZS5YTUxfU1FMX1JFU1VMVF9TRVRfTUFQUElOR18yMF9fREVTQ1JJUFRJT047CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNTI4Myw3ICs1MDAwLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19OQU1FID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19OQU1FID0gT3JtVjJfMFBhY2thZ2UuWE1MX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCArIDA7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IFJlc3VsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNTI5Miw3ICs1MDA5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19FTlRJVFlfUkVTVUxUUyA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fRU5USVRZX1JFU1VMVFMgPSBPcm1WMl8wUGFja2FnZS5YTUxfU1FMX1JFU1VMVF9TRVRfTUFQUElOR18yMF9GRUFUVVJFX0NPVU5UICsgMTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gUmVzdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC01MzAxLDcgKzUwMTgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0NPTFVNTl9SRVNVTFRTID0gMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19DT0xVTU5fUkVTVUxUUyA9IE9ybVYyXzBQYWNrYWdlLlhNTF9TUUxfUkVTVUxUX1NFVF9NQVBQSU5HXzIwX0ZFQVRVUkVfQ09VTlQgKyAyOwogCiAJLyoqCiAJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmc8L2VtPicgY2xhc3MuCkBAIC01MzEwLDcgKzUwMjcsNjIgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSAzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTF9SRVNVTFRfU0VUX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IE9ybVYyXzBQYWNrYWdlLlhNTF9TUUxfUkVTVUxUX1NFVF9NQVBQSU5HXzIwX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGUgPGVtPlhtbCBUYWJsZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEUgPSA3NTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfX05BTUUgPSBBQlNUUkFDVF9YTUxfVEFCTEVfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX19DQVRBTE9HID0gQUJTVFJBQ1RfWE1MX1RBQkxFX19DQVRBTE9HOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX19TQ0hFTUEgPSBBQlNUUkFDVF9YTUxfVEFCTEVfX1NDSEVNQTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSBBQlNUUkFDVF9YTUxfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVGFibGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yIDxlbT5YbWwgVGFibGUgR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KQEAgLTUzMjAsNyArNTA5MiwxNiBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3IoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SID0gODg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUiA9IDc2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX19ERVNDUklQVElPTiA9IFhNTF9HRU5FUkFUT1JfX0RFU0NSSVBUSU9OOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTU0MjIsMTQgKzUyMDMsMjMgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgPSBYTUxfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyA3OwogCiAJLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3JJbXBsIDxlbT5YbWwgVGFibGUgR2VuZXJhdG9yIEltcGw8L2VtPn0nIGNsYXNzLgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudCA8ZW0+WG1sIFRyYW5zaWVudDwvZW0+fScgY2xhc3MuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9ySW1wbCgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUcmFuc2llbnQoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX0lNUEwgPSA4OTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNJRU5UID0gNzc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNJRU5UX19BQ0NFU1MgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC01NDM4LDk3ICs1MjI4LDE2IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19OQU1FID0gWE1MX1RBQkxFX0dFTkVSQVRPUl9fTkFNRTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNJRU5UX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwogCiAJLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFRyYW5zaWVudDwvZW0+JyBjbGFzcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fSU5JVElBTF9WQUxVRSA9IFhNTF9UQUJMRV9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsb2NhdGlvbiBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX0FMTE9DQVRJT05fU0laRSA9IFhNTF9UQUJMRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19UQUJMRSA9IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fQ0FUQUxPRyA9IFhNTF9UQUJMRV9HRU5FUkFUT1JfX0NBVEFMT0c7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1NDSEVNQSA9IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1NDSEVNQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QayBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19QS19DT0xVTU5fTkFNRSA9IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1ZBTFVFX0NPTFVNTl9OQU1FID0gWE1MX1RBQkxFX0dFTkVSQVRPUl9fVkFMVUVfQ09MVU1OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGsgQ29sdW1uIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1BLX0NPTFVNTl9WQUxVRSA9IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19VTklRVUVfQ09OU1RSQUlOVFMgPSBYTUxfVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFRhYmxlIEdlbmVyYXRvciBJbXBsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBYTUxfVEFCTEVfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQgPGVtPlhtbCBVbmlxdWUgQ29uc3RyYWludDwvZW0+fScgY2xhc3MuCkBAIC01NTM4LDcgKzUyNDcsMTYgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFVuaXF1ZUNvbnN0cmFpbnQoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVU5JUVVFX0NPTlNUUkFJTlQgPSA5MDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVU5JUVVFX0NPTlNUUkFJTlQgPSA3OTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVU5JUVVFX0NPTlNUUkFJTlRfX05BTUUgPSBPcm1WMl8wUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfMjBfX05BTUU7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KQEAgLTU1NDcsNyArNTI2NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1VOSVFVRV9DT05TVFJBSU5UX19DT0xVTU5fTkFNRVMgPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9VTklRVUVfQ09OU1RSQUlOVF9fQ09MVU1OX05BTUVTID0gT3JtVjJfMFBhY2thZ2UuWE1MX1VOSVFVRV9DT05TVFJBSU5UXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwogCiAJLyoqCiAJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBVbmlxdWUgQ29uc3RyYWludDwvZW0+JyBjbGFzcy4KQEAgLTU1NTYsMzUgKzUyNzQsODAgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVU5JUVVFX0NPTlNUUkFJTlRfRkVBVFVSRV9DT1VOVCA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1VOSVFVRV9DT05TVFJBSU5UX0ZFQVRVUkVfQ09VTlQgPSBPcm1WMl8wUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfMjBfRkVBVFVSRV9DT1VOVCArIDE7CiAKIAkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50SW1wbCA8ZW0+WG1sIFVuaXF1ZSBDb25zdHJhaW50IEltcGw8L2VtPn0nIGNsYXNzLgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24gPGVtPlhtbCBWZXJzaW9uPC9lbT59JyBjbGFzcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9VTklRVUVfQ09OU1RSQUlOVF9JTVBMID0gOTE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT04gPSA4MDsKIAogCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9VTklRVUVfQ09OU1RSQUlOVF9JTVBMX19DT0xVTU5fTkFNRVMgPSBYTUxfVU5JUVVFX0NPTlNUUkFJTlRfX0NPTFVNTl9OQU1FUzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7CiAKIAkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFVuaXF1ZSBDb25zdHJhaW50IEltcGw8L2VtPicgY2xhc3MuCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9VTklRVUVfQ09OU1RSQUlOVF9JTVBMX0ZFQVRVUkVfQ09VTlQgPSBYTUxfVU5JUVVFX0NPTlNUUkFJTlRfRkVBVFVSRV9DT1VOVCArIDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX05BTUUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fQ09MVU1OID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX0xPQiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX1RFTVBPUkFMID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19FTlVNRVJBVEVEID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBWZXJzaW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUgPGVtPkFjY2VzcyBUeXBlPC9lbT59JyBlbnVtLgpAQCAtNTU5NCw3ICs1MzU3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFjY2Vzc1R5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ0NFU1NfVFlQRSA9IDkyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDQ0VTU19UWVBFID0gODE7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZSA8ZW0+RGlzY3JpbWluYXRvciBUeXBlPC9lbT59JyBlbnVtLgpAQCAtNTYwNCw3ICs1MzY3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldERpc2NyaW1pbmF0b3JUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ1JJTUlOQVRPUl9UWVBFID0gOTM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ1JJTUlOQVRPUl9UWVBFID0gODI7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZSA8ZW0+RW51bSBUeXBlPC9lbT59JyBlbnVtLgpAQCAtNTYxNCw3ICs1Mzc3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudW1UeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5VTV9UWVBFID0gOTQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5VTV9UWVBFID0gODM7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUgPGVtPkZldGNoIFR5cGU8L2VtPn0nIGVudW0uCkBAIC01NjI0LDcgKzUzODcsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RmV0Y2hUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVUQ0hfVFlQRSA9IDk1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFVENIX1RZUEUgPSA4NDsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlIDxlbT5HZW5lcmF0aW9uIFR5cGU8L2VtPn0nIGVudW0uCkBAIC01NjM0LDcgKzUzOTcsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0R2VuZXJhdGlvblR5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5FUkFUSU9OX1RZUEUgPSA5NjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5FUkFUSU9OX1RZUEUgPSA4NTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZSA8ZW0+SW5oZXJpdGFuY2UgVHlwZTwvZW0+fScgZW51bS4KQEAgLTU2NDQsNyArNTQwNyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRJbmhlcml0YW5jZVR5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkhFUklUQU5DRV9UWVBFID0gOTc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5IRVJJVEFOQ0VfVFlQRSA9IDg2OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlIDxlbT5UZW1wb3JhbCBUeXBlPC9lbT59JyBlbnVtLgpAQCAtNTY1NCw3ICs1NDE3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFRlbXBvcmFsVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFTVBPUkFMX1RZUEUgPSA5ODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURU1QT1JBTF9UWVBFID0gODc7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPicgZGF0YSB0eXBlLgpAQCAtNTY2NCw3ICs1NDI3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldERpc2NyaW1pbmF0b3JWYWx1ZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NSSU1JTkFUT1JfVkFMVUUgPSA5OTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDUklNSU5BVE9SX1ZBTFVFID0gODg7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgZGF0YSB0eXBlLgpAQCAtNTY3NCw3ICs1NDM3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudW1lcmF0ZWQoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlVNRVJBVEVEID0gMTAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVU1FUkFURUQgPSA4OTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgZGF0YSB0eXBlLgpAQCAtNTY4NCw4MCArNTQ0Nyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRPcmRlckJ5KCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1JERVJfQlkgPSAxMDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlZlcnNpb24gVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFZlcnNpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9UWVBFID0gMTAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWJzdHJhY3RYbWxUeXBlTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbWJlZGRhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGF0dHJpYnV0ZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcyA9IG51bGw7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1JERVJfQlkgPSA5MDsKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC01NzcxLDIzMSArNTQ2MSwyMSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxOdWxsQXR0cmlidXRlTWFwcGluZ0VDbGFzcyA9IG51bGw7CisJcHJpdmF0ZSBFQ2xhc3MgYWJzdHJhY3RYbWxDb2x1bW5FQ2xhc3MgPSBudWxsOwogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29sdW1uTWFwcGluZ0VDbGFzcyA9IG51bGw7CisJcHJpdmF0ZSBFQ2xhc3MgYWJzdHJhY3RYbWxFbWJlZGRlZEVDbGFzcyA9IG51bGw7CiAKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbElkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbElkSW1wbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBiYXNlWG1sRW1iZWRkZWRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW1iZWRkZWRJZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbWJlZGRlZElkSW1wbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxCYXNpY0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxCYXNpY0ltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVmVyc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxWZXJzaW9uSW1wbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYW55VG9PbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvT25lSW1wbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb01hbnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9NYW55SW1wbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb09uZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb09uZUltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvTWFueUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYW55VG9NYW55SW1wbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbWJlZGRlZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbWJlZGRlZEltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVHJhbnNpZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRyYW5zaWVudEltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxBdHRyaWJ1dGVPdmVycmlkZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxBdHRyaWJ1dGVPdmVycmlkZUltcGxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2FzY2FkZVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2FzY2FkZVR5cGVJbXBsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE5hbWVkQ29sdW1uRUNsYXNzID0gbnVsbDsKKwlwcml2YXRlIEVDbGFzcyBhYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcyA9IG51bGw7CiAKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNjAwOSwxNCArNTQ4OSw5OCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxBYnN0cmFjdENvbHVtbkVDbGFzcyA9IG51bGw7CisJcHJpdmF0ZSBFQ2xhc3MgYWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzID0gbnVsbDsKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgRUNsYXNzIGFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW5FQ2xhc3MgPSBudWxsOworCXByaXZhdGUgRUNsYXNzIGFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhYnN0cmFjdFhtbFRhYmxlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGFic3RyYWN0WG1sVHlwZU1hcHBpbmdFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQWNjZXNzSG9sZGVyRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGF0dHJpYnV0ZXNFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzaWNFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY2FzY2FkZVR5cGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQ29sbGVjdGlvblRhYmxlRUNsYXNzID0gbnVsbDsKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC02MDMwLDcgKzU1OTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDb2x1bW5JbXBsRUNsYXNzID0gbnVsbDsKKwlwcml2YXRlIEVDbGFzcyBjb2x1bW5NYXBwaW5nRUNsYXNzID0gbnVsbDsKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC02MDQ0LDYgKzU2MDgsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXByaXZhdGUgRUNsYXNzIHhtbERpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3MgPSBudWxsOwogCiAJLyoqCkBAIC02MDUxLDcgKzU2MjIsMzUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJpdmF0ZSBFQ2xhc3MgZW50aXR5TGlzdGVuZXJzRUNsYXNzID0gbnVsbDsKKwlwcml2YXRlIEVDbGFzcyB4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxFbWJlZGRhYmxlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGVkRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGVkSWRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sRW50aXR5RUNsYXNzID0gbnVsbDsKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC02MDY1LDYgKzU2NjQsMjAgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHJpdmF0ZSBFQ2xhc3MgZW50aXR5TGlzdGVuZXJzRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXByaXZhdGUgRUNsYXNzIGVudGl0eVJlc3VsdEVDbGFzcyA9IG51bGw7CiAKIAkvKioKQEAgLTYwNzIsNiArNTY4NSwyMCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwcml2YXRlIEVDbGFzcyBldmVudE1ldGhvZEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxFdmVudE1ldGhvZENvbnRhaW5lckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwcml2YXRlIEVDbGFzcyBmaWVsZFJlc3VsdEVDbGFzcyA9IG51bGw7CiAKIAkvKioKQEAgLTYwODYsNyArNTcxMywyMSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxHZW5lcmF0ZWRWYWx1ZUltcGxFQ2xhc3MgPSBudWxsOworCXByaXZhdGUgRUNsYXNzIHhtbEdlbmVyYXRvckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxHZW5lcmF0b3JDb250YWluZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sSWRFQ2xhc3MgPSBudWxsOwogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTYxMTQsNyArNTc1NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEpvaW5Db2x1bW5JbXBsRUNsYXNzID0gbnVsbDsKKwlwcml2YXRlIEVDbGFzcyB4bWxKb2luQ29sdW1uc01hcHBpbmdFQ2xhc3MgPSBudWxsOwogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTYxMjgsNyArNTc2OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEpvaW5UYWJsZUltcGxFQ2xhc3MgPSBudWxsOworCXByaXZhdGUgRUNsYXNzIHhtbEpvaW5UYWJsZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTYxNDIsNiArNTc4MywyMCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxNYW55VG9NYW55RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbE1hbnlUb09uZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwcml2YXRlIEVDbGFzcyBtYXBLZXlFQ2xhc3MgPSBudWxsOwogCiAJLyoqCkBAIC02MTQ5LDE0ICs1ODA0LDIxIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgRUNsYXNzIG1hcEtleUltcGxFQ2xhc3MgPSBudWxsOworCXByaXZhdGUgRUNsYXNzIHhtbE1hcEtleUNsYXNzRUNsYXNzID0gbnVsbDsKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFF1ZXJ5RUNsYXNzID0gbnVsbDsKKwlwcml2YXRlIEVDbGFzcyB4bWxNYXBwZWRCeU1hcHBpbmdFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcyA9IG51bGw7CiAKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNjE3Nyw3ICs1ODM5LDQyIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgRUNsYXNzIGV2ZW50TWV0aG9kRUNsYXNzID0gbnVsbDsKKwlwcml2YXRlIEVDbGFzcyB4bWxOdWxsQXR0cmlidXRlTWFwcGluZ0VDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb01hbnlFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9PbmVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sT3JkZXJDb2x1bW5FQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MgPSBudWxsOwogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTYyNDAsNyArNTkzNywxNCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGxFQ2xhc3MgPSBudWxsOworCXByaXZhdGUgRUNsYXNzIHhtbFF1ZXJ5RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbFF1ZXJ5Q29udGFpbmVyRUNsYXNzID0gbnVsbDsKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC02MjU0LDI3ICs1OTU4LDYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWJzdHJhY3RYbWxCYXNlVGFibGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzZVRhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwogCXByaXZhdGUgRUNsYXNzIHhtbFNlY29uZGFyeVRhYmxlRUNsYXNzID0gbnVsbDsKIAogCS8qKgpAQCAtNjI4MiwyMCArNTk2NSw2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFNlY29uZGFyeVRhYmxlSW1wbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxHZW5lcmF0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCiAJcHJpdmF0ZSBFQ2xhc3MgeG1sU2VxdWVuY2VHZW5lcmF0b3JFQ2xhc3MgPSBudWxsOwogCiAJLyoqCkBAIC02MzAzLDE0ICs1OTcyLDE0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbEVDbGFzcyA9IG51bGw7CisJcHJpdmF0ZSBFQ2xhc3Mgc3FsUmVzdWx0U2V0TWFwcGluZ0VDbGFzcyA9IG51bGw7CiAKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcml2YXRlIEVDbGFzcyBzcWxSZXN1bHRTZXRNYXBwaW5nRUNsYXNzID0gbnVsbDsKKwlwcml2YXRlIEVDbGFzcyB4bWxUYWJsZUVDbGFzcyA9IG51bGw7CiAKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNjMyNCw3ICs1OTkzLDE0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRhYmxlR2VuZXJhdG9ySW1wbEVDbGFzcyA9IG51bGw7CisJcHJpdmF0ZSBFQ2xhc3MgeG1sVHJhbnNpZW50RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbFR5cGVNYXBwaW5nRUNsYXNzID0gbnVsbDsKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC02MzM4LDcgKzYwMTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxVbmlxdWVDb25zdHJhaW50SW1wbEVDbGFzcyA9IG51bGw7CisJcHJpdmF0ZSBFQ2xhc3MgeG1sVmVyc2lvbkVDbGFzcyA9IG51bGw7CiAKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNjQxMSwxMyArNjA4Nyw2IEBACiAJcHJpdmF0ZSBFRGF0YVR5cGUgb3JkZXJCeUVEYXRhVHlwZSA9IG51bGw7CiAKIAkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB2ZXJzaW9uVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKIAkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCiAJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKIAkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KQEAgLTY0NDUsMjAgKzYxMTQsMTAgQEAKIAlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CiAKIAkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIE9ybVBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBzZWUgI2VOU19VUkkKQEAgLTY0NzEsNyArNjEzMCw3IEBACiAJCWlmIChpc0luaXRlZCkgcmV0dXJuIChPcm1QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVBhY2thZ2UuZU5TX1VSSSk7CiAKIAkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlPcm1QYWNrYWdlIHRoZU9ybVBhY2thZ2UgPSAoT3JtUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBPcm1QYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgT3JtUGFja2FnZSgpKTsKKwkJT3JtUGFja2FnZSB0aGVPcm1QYWNrYWdlID0gKE9ybVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIE9ybVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgT3JtUGFja2FnZSgpKTsKIAogCQlpc0luaXRlZCA9IHRydWU7CiAKQEAgLTY0ODAsMzk1ICs2MTM5LDM3NyBAQAogCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CiAKIAkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKKwkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJT3JtVjJfMFBhY2thZ2UgdGhlT3JtVjJfMFBhY2thZ2UgPSAoT3JtVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVYyXzBQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgT3JtVjJfMFBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSA6IE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRSk7CiAJCVBlcnNpc3RlbmNlUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVBhY2thZ2UgPSAoUGVyc2lzdGVuY2VQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSkgOiBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJUGVyc2lzdGVuY2VWMl8wUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID0gKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5lTlNfVVJJKSA6IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZUlOU1RBTkNFKTsKIAogCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwogCQl0aGVPcm1QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKIAkJdGhlUGVyc2lzdGVuY2VQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwogCiAJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKIAkJdGhlT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CiAJCXRoZVBlcnNpc3RlbmNlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwogCiAJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKIAkJdGhlT3JtUGFja2FnZS5mcmVlemUoKTsKIAorICAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChPcm1QYWNrYWdlLmVOU19VUkksIHRoZU9ybVBhY2thZ2UpOwogCQlyZXR1cm4gdGhlT3JtUGFja2FnZTsKIAl9CiAKIAogCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyA8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyA8ZW0+QWJzdHJhY3QgWG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBYbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQorCXB1YmxpYyBFQ2xhc3MgZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKIAl7Ci0JCXJldHVybiB4bWxFbnRpdHlNYXBwaW5nc0VDbGFzczsKKwkJcmV0dXJuIGFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzczsKIAl9CiAKLQogCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbENvbHVtbiA8ZW0+QWJzdHJhY3QgWG1sIENvbHVtbjwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFic3RyYWN0IFhtbCBDb2x1bW48L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxDb2x1bW4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5TWFwcGluZ3NfVmVyc2lvbigpCisJcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFhtbENvbHVtbigpCiAJewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwkJcmV0dXJuIGFic3RyYWN0WG1sQ29sdW1uRUNsYXNzOwogCX0KIAotCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbENvbHVtbiNnZXRJbnNlcnRhYmxlIDxlbT5JbnNlcnRhYmxlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluc2VydGFibGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxDb2x1bW4jZ2V0SW5zZXJ0YWJsZSgpCisJICogQHNlZSAjZ2V0QWJzdHJhY3RYbWxDb2x1bW4oKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlNYXBwaW5nc19EZXNjcmlwdGlvbigpCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWJzdHJhY3RYbWxDb2x1bW5fSW5zZXJ0YWJsZSgpCiAJewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFic3RyYWN0WG1sQ29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAJfQogCi0KIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxDb2x1bW4jZ2V0TnVsbGFibGUgPGVtPk51bGxhYmxlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TnVsbGFibGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxDb2x1bW4jZ2V0TnVsbGFibGUoKQorCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sQ29sdW1uKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQorCXB1YmxpYyBFQXR0cmlidXRlIGdldEFic3RyYWN0WG1sQ29sdW1uX051bGxhYmxlKCkKIAl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWJzdHJhY3RYbWxDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKIAl9CiAKLQogCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFBhY2thZ2UgPGVtPlBhY2thZ2U8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQ29sdW1uI2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0UGFja2FnZSgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFibGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxDb2x1bW4jZ2V0VGFibGUoKQorCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sQ29sdW1uKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGFja2FnZSgpCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWJzdHJhY3RYbWxDb2x1bW5fVGFibGUoKQogCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhYnN0cmFjdFhtbENvbHVtbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwogCX0KIAotCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQ29sdW1uI2dldFVuaXF1ZSA8ZW0+VW5pcXVlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NoZW1hPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFNjaGVtYSgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5pcXVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQ29sdW1uI2dldFVuaXF1ZSgpCisJICogQHNlZSAjZ2V0QWJzdHJhY3RYbWxDb2x1bW4oKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlNYXBwaW5nc19TY2hlbWEoKQorCXB1YmxpYyBFQXR0cmlidXRlIGdldEFic3RyYWN0WG1sQ29sdW1uX1VuaXF1ZSgpCiAJewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFic3RyYWN0WG1sQ29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CiAJfQogCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxDb2x1bW4jZ2V0VXBkYXRhYmxlIDxlbT5VcGRhdGFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VcGRhdGFibGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxDb2x1bW4jZ2V0VXBkYXRhYmxlKCkKKwkgKiBAc2VlICNnZXRBYnN0cmFjdFhtbENvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEFic3RyYWN0WG1sQ29sdW1uX1VwZGF0YWJsZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWJzdHJhY3RYbWxDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59Jy4KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxFbWJlZGRlZCA8ZW0+QWJzdHJhY3QgWG1sIEVtYmVkZGVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFic3RyYWN0IFhtbCBFbWJlZGRlZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEVtYmVkZGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0QWJzdHJhY3RYbWxFbWJlZGRlZCgpCisJeworCQlyZXR1cm4gYWJzdHJhY3RYbWxFbWJlZGRlZEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPkFic3RyYWN0IFhtbCBNdWx0aSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBYbWwgTXVsdGkgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpCisJeworCQlyZXR1cm4gYWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0T3JkZXJCeSA8ZW0+T3JkZXIgQnk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PcmRlciBCeTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRPcmRlckJ5KCkKKwkgKiBAc2VlICNnZXRBYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX09yZGVyQnkoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0TWFwS2V5IDxlbT5NYXAgS2V5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWFwIEtleTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBLZXkoKQorCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfTWFwS2V5KCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSlhYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE5hbWVkQ29sdW1uIDxlbT5BYnN0cmFjdCBYbWwgTmFtZWQgQ29sdW1uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFic3RyYWN0IFhtbCBOYW1lZCBDb2x1bW48L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxOYW1lZENvbHVtbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEFic3RyYWN0WG1sTmFtZWRDb2x1bW4oKQorCXsKKwkJcmV0dXJuIGFic3RyYWN0WG1sTmFtZWRDb2x1bW5FQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxOYW1lZENvbHVtbiNnZXRDb2x1bW5EZWZpbml0aW9uIDxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbHVtbiBEZWZpbml0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTmFtZWRDb2x1bW4jZ2V0Q29sdW1uRGVmaW5pdGlvbigpCisJICogQHNlZSAjZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEFic3RyYWN0WG1sTmFtZWRDb2x1bW5fQ29sdW1uRGVmaW5pdGlvbigpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWJzdHJhY3RYbWxOYW1lZENvbHVtbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTmFtZWRDb2x1bW4jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxOYW1lZENvbHVtbiNnZXROYW1lKCkKKwkgKiBAc2VlICNnZXRBYnN0cmFjdFhtbE5hbWVkQ29sdW1uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbl9OYW1lKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhYnN0cmFjdFhtbE5hbWVkQ29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyA8ZW0+QWJzdHJhY3QgWG1sIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFic3RyYWN0IFhtbCBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQorCXsKKwkJcmV0dXJuIGFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0VGFyZ2V0RW50aXR5IDxlbT5UYXJnZXQgRW50aXR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0VGFyZ2V0RW50aXR5KCkKKwkgKiBAc2VlICNnZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfVGFyZ2V0RW50aXR5KCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0RmV0Y2ggPGVtPkZldGNoPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmV0Y2g8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldEZldGNoKCkKKwkgKiBAc2VlICNnZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfRmV0Y2goKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRDYXNjYWRlIDxlbT5DYXNjYWRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2FzY2FkZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0Q2FzY2FkZSgpCisJICogQHNlZSAjZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPkFic3RyYWN0IFhtbCBTaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWJzdHJhY3QgWG1sIFNpbmdsZSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoKQorCXsKKwkJcmV0dXJuIGFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0T3B0aW9uYWwgPGVtPk9wdGlvbmFsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3B0aW9uYWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE9wdGlvbmFsKCkKKwkgKiBAc2VlICNnZXRBYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfT3B0aW9uYWwoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlIDxlbT5BYnN0cmFjdCBYbWwgVGFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWJzdHJhY3QgWG1sIFRhYmxlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVGFibGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFhtbFRhYmxlKCkKKwl7CisJCXJldHVybiBhYnN0cmFjdFhtbFRhYmxlRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVGFibGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZSNnZXROYW1lKCkKKwkgKiBAc2VlICNnZXRBYnN0cmFjdFhtbFRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWJzdHJhY3RYbWxUYWJsZV9OYW1lKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhYnN0cmFjdFhtbFRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZSNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2F0YWxvZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRDYXRhbG9nKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZSNnZXRDYXRhbG9nKCkKKwkgKiBAc2VlICNnZXRBYnN0cmFjdFhtbFRhYmxlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5TWFwcGluZ3NfQ2F0YWxvZygpCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWJzdHJhY3RYbWxUYWJsZV9DYXRhbG9nKCkKIAl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWJzdHJhY3RYbWxUYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwogCX0KIAotCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0QWNjZXNzIDxlbT5BY2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0QWNjZXNzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVudGl0eU1hcHBpbmdzX0FjY2VzcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0U2VxdWVuY2VHZW5lcmF0b3JzIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFNlcXVlbmNlR2VuZXJhdG9ycygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc19TZXF1ZW5jZUdlbmVyYXRvcnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFRhYmxlR2VuZXJhdG9ycyA8ZW0+VGFibGUgR2VuZXJhdG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGFibGUgR2VuZXJhdG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRUYWJsZUdlbmVyYXRvcnMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfVGFibGVHZW5lcmF0b3JzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXROYW1lZFF1ZXJpZXMgPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0TmFtZWRRdWVyaWVzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzX05hbWVkUXVlcmllcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0TmFtZWROYXRpdmVRdWVyaWVzIDxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzX05hbWVkTmF0aXZlUXVlcmllcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFNxbFJlc3VsdFNldE1hcHBpbmdzIDxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfU3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRNYXBwZWRTdXBlcmNsYXNzZXMgPGVtPk1hcHBlZCBTdXBlcmNsYXNzZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1hcHBlZCBTdXBlcmNsYXNzZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzX01hcHBlZFN1cGVyY2xhc3NlcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldEVudGl0aWVzIDxlbT5FbnRpdGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW50aXRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0RW50aXRpZXMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfRW50aXRpZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRFbWJlZGRhYmxlcyA8ZW0+RW1iZWRkYWJsZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVtYmVkZGFibGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldEVtYmVkZGFibGVzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzX0VtYmVkZGFibGVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSNpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIDxlbT5YbWwgTWFwcGluZyBNZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhtbCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhI2lzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSNnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCXsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVGFibGUjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY2hlbWE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0U2NoZW1hKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZSNnZXRTY2hlbWEoKQorCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sVGFibGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19TY2hlbWEoKQorCXB1YmxpYyBFQXR0cmlidXRlIGdldEFic3RyYWN0WG1sVGFibGVfU2NoZW1hKCkKIAl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWJzdHJhY3RYbWxUYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwogCX0KIAotCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlI2dldFVuaXF1ZUNvbnN0cmFpbnRzIDxlbT5VbmlxdWUgQ29uc3RyYWludHM8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXRhbG9nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldENhdGFsb2coKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVGFibGUjZ2V0VW5pcXVlQ29uc3RyYWludHMoKQorCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sVGFibGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19DYXRhbG9nKCkKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFhtbFRhYmxlX1VuaXF1ZUNvbnN0cmFpbnRzKCkKIAl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYWJzdHJhY3RYbWxUYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwogCX0KIAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0QWNjZXNzIDxlbT5BY2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0QWNjZXNzKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0FjY2VzcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2lzQ2FzY2FkZVBlcnNpc3QgPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNpc0Nhc2NhZGVQZXJzaXN0KCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0Nhc2NhZGVQZXJzaXN0KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0RW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfRW50aXR5TGlzdGVuZXJzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcgPGVtPkFic3RyYWN0IFhtbCBUeXBlIE1hcHBpbmc8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC02ODgyLDY2MyArNjUyMywxODEgQEAKIAkJcmV0dXJuIGFic3RyYWN0WG1sVHlwZU1hcHBpbmdFQ2xhc3M7CiAJfQogCi0KIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc0hvbGRlciA8ZW0+WG1sIEFjY2VzcyBIb2xkZXI8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAc2VlICNnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQWNjZXNzIEhvbGRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NIb2xkZXIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19DbGFzc05hbWUoKQorCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQWNjZXNzSG9sZGVyKCkKIAl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhYnN0cmFjdFhtbFR5cGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJCXJldHVybiB4bWxBY2Nlc3NIb2xkZXJFQ2xhc3M7CiAJfQogCi0KIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nI2dldEFjY2VzcyA8ZW0+QWNjZXNzPC9lbT59Jy4KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NIb2xkZXIjZ2V0QWNjZXNzIDxlbT5BY2Nlc3M8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXRBY2Nlc3MoKQotCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sVHlwZU1hcHBpbmcoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc0hvbGRlciNnZXRBY2Nlc3MoKQorCSAqIEBzZWUgI2dldFhtbEFjY2Vzc0hvbGRlcigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfQWNjZXNzKCkKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxBY2Nlc3NIb2xkZXJfQWNjZXNzKCkKIAl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhYnN0cmFjdFhtbFR5cGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxBY2Nlc3NIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKIAl9CiAKLQogCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcjZ2V0TWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nI2dldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sVHlwZU1hcHBpbmcoKQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfTWV0YWRhdGFDb21wbGV0ZSgpCisJcHVibGljIEVDbGFzcyBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKIAl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhYnN0cmFjdFhtbFR5cGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJCXJldHVybiB4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzOwogCX0KIAotCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19EZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWJzdHJhY3RYbWxUeXBlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXRBdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nI2dldEF0dHJpYnV0ZXMoKQotCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFic3RyYWN0WG1sVHlwZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRJZENsYXNzIDxlbT5JZCBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPklkIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0SWRDbGFzcygpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfSWRDbGFzcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIDxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIFN1cGVyY2xhc3MgTGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEVudGl0eUxpc3RlbmVycygpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRW50aXR5TGlzdGVuZXJzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFByZVBlcnNpc3QgPGVtPlByZSBQZXJzaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJlIFBlcnNpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQcmVQZXJzaXN0KCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19QcmVQZXJzaXN0KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFBvc3RQZXJzaXN0IDxlbT5Qb3N0IFBlcnNpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQb3N0UGVyc2lzdCgpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFBlcnNpc3QoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UHJlUmVtb3ZlIDxlbT5QcmUgUmVtb3ZlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJlIFJlbW92ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFByZVJlbW92ZSgpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUHJlUmVtb3ZlKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFBvc3RSZW1vdmUgPGVtPlBvc3QgUmVtb3ZlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdCBSZW1vdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQb3N0UmVtb3ZlKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19Qb3N0UmVtb3ZlKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZSBVcGRhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQcmVVcGRhdGUoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1ByZVVwZGF0ZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQb3N0VXBkYXRlIDxlbT5Qb3N0IFVwZGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc3QgVXBkYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UG9zdFVwZGF0ZSgpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFVwZGF0ZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdCBMb2FkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UG9zdExvYWQoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1Bvc3RMb2FkKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSA8ZW0+WG1sIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eSgpCi0JewotCQlyZXR1cm4geG1sRW50aXR5RUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyNnZXROYW1lKCkKKwkgKiBAc2VlICNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5X05hbWUoKQorCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfTmFtZSgpCiAJewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAJfQogCi0KIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0VGFibGUgPGVtPlRhYmxlPC9lbT59Jy4KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSA8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFRhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9UYWJsZSgpCisJcHVibGljIEVDbGFzcyBnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkKIAl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwkJcmV0dXJuIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGVFQ2xhc3M7CiAJfQogCi0KIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRTZWNvbmRhcnlUYWJsZXMgPGVtPlNlY29uZGFyeSBUYWJsZXM8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2Vjb25kYXJ5IFRhYmxlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0U2Vjb25kYXJ5VGFibGVzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlI2dldE5hbWUoKQorCSAqIEBzZWUgI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfU2Vjb25kYXJ5VGFibGVzKCkKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlX05hbWUoKQogCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwogCX0KIAotCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zIDxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIDxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgQ29udGFpbmVyPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByaW1hcnlLZXlKb2luQ29sdW1ucygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgQ29udGFpbmVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X1ByaW1hcnlLZXlKb2luQ29sdW1ucygpCisJcHVibGljIEVDbGFzcyBnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkKIAl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwkJcmV0dXJuIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJFQ2xhc3M7CiAJfQogCi0KIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0SWRDbGFzcyA8ZW0+SWQgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JZCBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0SWRDbGFzcygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X0lkQ2xhc3MoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEluaGVyaXRhbmNlIDxlbT5Jbmhlcml0YW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkluaGVyaXRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRJbmhlcml0YW5jZSgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X0luaGVyaXRhbmNlKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXREaXNjcmltaW5hdG9yVmFsdWUgPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXNjcmltaW5hdG9yIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXREaXNjcmltaW5hdG9yVmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVudGl0eV9EaXNjcmltaW5hdG9yVmFsdWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldERpc2NyaW1pbmF0b3JDb2x1bW4gPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldERpc2NyaW1pbmF0b3JDb2x1bW4oKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9EaXNjcmltaW5hdG9yQ29sdW1uKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X1NlcXVlbmNlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRUYWJsZUdlbmVyYXRvciA8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRUYWJsZUdlbmVyYXRvcigpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X1RhYmxlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE5hbWVkUXVlcmllcyA8ZW0+TmFtZWQgUXVlcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TmFtZWQgUXVlcmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0TmFtZWRRdWVyaWVzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfTmFtZWRRdWVyaWVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXROYW1lZE5hdGl2ZVF1ZXJpZXMgPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfTmFtZWROYXRpdmVRdWVyaWVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncyA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X1NxbFJlc3VsdFNldE1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycyA8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVudGl0eV9FeGNsdWRlRGVmYXVsdExpc3RlbmVycygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIFN1cGVyY2xhc3MgTGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNpc0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlfRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRFbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9FbnRpdHlMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQcmVQZXJzaXN0IDxlbT5QcmUgUGVyc2lzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZSBQZXJzaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQcmVQZXJzaXN0KCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfUHJlUGVyc2lzdCgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFBvc3RQZXJzaXN0IDxlbT5Qb3N0IFBlcnNpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFBvc3RQZXJzaXN0KCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfUG9zdFBlcnNpc3QoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQcmVSZW1vdmUgPGVtPlByZSBSZW1vdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QcmUgUmVtb3ZlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQcmVSZW1vdmUoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9QcmVSZW1vdmUoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQb3N0UmVtb3ZlIDxlbT5Qb3N0IFJlbW92ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc3QgUmVtb3ZlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQb3N0UmVtb3ZlKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfUG9zdFJlbW92ZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZSBVcGRhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByZVVwZGF0ZSgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X1ByZVVwZGF0ZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFBvc3RVcGRhdGUgPGVtPlBvc3QgVXBkYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFBvc3RVcGRhdGUoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9Qb3N0VXBkYXRlKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UG9zdExvYWQgPGVtPlBvc3QgTG9hZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc3QgTG9hZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UG9zdExvYWQoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9Qb3N0TG9hZCgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzIDxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9BdHRyaWJ1dGVPdmVycmlkZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEFzc29jaWF0aW9uT3ZlcnJpZGVzIDxlbT5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciNnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcyA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKQorCSAqIEBzZWUgI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfQXNzb2NpYXRpb25PdmVycmlkZXMoKQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfQXNzb2NpYXRpb25PdmVycmlkZXMoKQogCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI0KTsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKIAl9CiAKLQogCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlIDxlbT5YbWwgRW1iZWRkYWJsZTwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlIDxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW1iZWRkYWJsZSgpCisJcHVibGljIEVDbGFzcyBnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZSgpCiAJewotCQlyZXR1cm4geG1sRW1iZWRkYWJsZUVDbGFzczsKKwkJcmV0dXJuIHhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzOwogCX0KIAorCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlI2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29sdW1uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlI2dldENvbHVtbigpCisJICogQHNlZSAjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9Db2x1bW4oKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUjZ2V0TmFtZSgpCisJICogQHNlZSAjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9OYW1lKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxBdHRyaWJ1dGVPdmVycmlkZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSBDb250YWluZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSBDb250YWluZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpCisJeworCQlyZXR1cm4geG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciNnZXRBdHRyaWJ1dGVPdmVycmlkZXMgPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkKKwkgKiBAc2VlICNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyX0F0dHJpYnV0ZU92ZXJyaWRlcygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScuCkBAIC03NTgxLDcgKzY3NDAsNiBAQAogCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXR0cmlidXRlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwogCX0KIAotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldEJhc2ljcyA8ZW0+QmFzaWNzPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNzYzOCw3ICs2Nzk2LDYgQEAKIAkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRPbmVUb09uZXMgPGVtPk9uZSBUbyBPbmVzPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNzY2Nyw3ICs2ODI0LDYgQEAKIAkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRFbWJlZGRlZHMgPGVtPkVtYmVkZGVkczwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTc2OTcsNDE0ICs2ODUzLDYgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyA8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpCi0JewotCQlyZXR1cm4geG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWJzdHJhY3QgWG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpCi0JewotCQlyZXR1cm4gYWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgTnVsbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTnVsbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKCkKLQl7Ci0JCXJldHVybiB4bWxOdWxsQXR0cmlidXRlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nIDxlbT5Db2x1bW4gTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db2x1bW4gTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29sdW1uTWFwcGluZygpCi0JewotCQlyZXR1cm4gY29sdW1uTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmcjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uTWFwcGluZyNnZXRDb2x1bW4oKQotCSAqIEBzZWUgI2dldENvbHVtbk1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29sdW1uTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPlhtbCBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIHhtbFJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldFRhcmdldEVudGl0eSA8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBzZWUgI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX1RhcmdldEVudGl0eSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRGZXRjaCA8ZW0+RmV0Y2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GZXRjaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldEZldGNoKCkKLQkgKiBAc2VlICNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19GZXRjaCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRKb2luVGFibGUgPGVtPkpvaW4gVGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Kb2luIFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0Sm9pblRhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19Kb2luVGFibGUoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0Q2FzY2FkZSA8ZW0+Q2FzY2FkZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNhc2NhZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRDYXNjYWRlKCkKLQkgKiBAc2VlICNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19DYXNjYWRlKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIDxlbT5YbWwgTXVsdGkgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE11bHRpIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpCi0JewotCQlyZXR1cm4geG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE1hcHBlZEJ5IDxlbT5NYXBwZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXBwZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE1hcHBlZEJ5KCkKLQkgKiBAc2VlICNnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfTWFwcGVkQnkoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE9yZGVyQnkgPGVtPk9yZGVyIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3JkZXIgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE9yZGVyQnkoKQotCSAqIEBzZWUgI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19PcmRlckJ5KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBLZXkgPGVtPk1hcCBLZXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NYXAgS2V5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBLZXkoKQotCSAqIEBzZWUgI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBLZXkoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPlhtbCBTaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFNpbmdsZSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpCi0JewotCQlyZXR1cm4geG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0T3B0aW9uYWwgPGVtPk9wdGlvbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3B0aW9uYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyNnZXRPcHRpb25hbCgpCi0JICogQHNlZSAjZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfT3B0aW9uYWwoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyNnZXRKb2luQ29sdW1ucyA8ZW0+Sm9pbiBDb2x1bW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyNnZXRKb2luQ29sdW1ucygpCi0JICogQHNlZSAjZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pbkNvbHVtbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCA8ZW0+WG1sIElkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBJZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbElkKCkKLQl7Ci0JCXJldHVybiB4bWxJZEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldEdlbmVyYXRlZFZhbHVlIDxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0R2VuZXJhdGVkVmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sSWRfR2VuZXJhdGVkVmFsdWUoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbElkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRUZW1wb3JhbCA8ZW0+VGVtcG9yYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UZW1wb3JhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRUZW1wb3JhbCgpCi0JICogQHNlZSAjZ2V0WG1sSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxJZF9UZW1wb3JhbCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sSWRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldFRhYmxlR2VuZXJhdG9yIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0VGFibGVHZW5lcmF0b3IoKQotCSAqIEBzZWUgI2dldFhtbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sSWRfVGFibGVHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbElkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAc2VlICNnZXRYbWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbElkX1NlcXVlbmNlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxJZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkSW1wbCA8ZW0+WG1sIElkIEltcGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIElkIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRJbXBsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSWRJbXBsKCkKLQl7Ci0JCXJldHVybiB4bWxJZEltcGxFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQmFzZVhtbEVtYmVkZGVkIDxlbT5CYXNlIFhtbCBFbWJlZGRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CYXNlIFhtbCBFbWJlZGRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5CYXNlWG1sRW1iZWRkZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCYXNlWG1sRW1iZWRkZWQoKQotCXsKLQkJcmV0dXJuIGJhc2VYbWxFbWJlZGRlZEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQmFzZVhtbEVtYmVkZGVkI2dldEF0dHJpYnV0ZU92ZXJyaWRlcyA8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5CYXNlWG1sRW1iZWRkZWQjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkKLQkgKiBAc2VlICNnZXRCYXNlWG1sRW1iZWRkZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlWG1sRW1iZWRkZWRfQXR0cmlidXRlT3ZlcnJpZGVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSliYXNlWG1sRW1iZWRkZWRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkIDxlbT5YbWwgRW1iZWRkZWQgSWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGVkIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbWJlZGRlZElkKCkKLQl7Ci0JCXJldHVybiB4bWxFbWJlZGRlZElkRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWRJbXBsIDxlbT5YbWwgRW1iZWRkZWQgSWQgSW1wbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW1iZWRkZWQgSWQgSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkSW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVtYmVkZGVkSWRJbXBsKCkKLQl7Ci0JCXJldHVybiB4bWxFbWJlZGRlZElkSW1wbEVDbGFzczsKLQl9Ci0KLQotCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyA8ZW0+WG1sIEJhc2ljPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtODExNyw3ICs2ODY1LDYgQEAKIAkJcmV0dXJuIHhtbEJhc2ljRUNsYXNzOwogCX0KIAotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0RmV0Y2ggPGVtPkZldGNoPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtODEzMiw3ICs2ODc5LDYgQEAKIAkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEJhc2ljRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAJfQogCi0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRPcHRpb25hbCA8ZW0+T3B0aW9uYWw8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC04MTQ3LDQzOCArNjg5Myw2IEBACiAJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxCYXNpY0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwogCX0KIAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjaXNMb2IgPGVtPkxvYjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvYjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNpc0xvYigpCi0JICogQHNlZSAjZ2V0WG1sQmFzaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXNpY19Mb2IoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEJhc2ljRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRUZW1wb3JhbCA8ZW0+VGVtcG9yYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UZW1wb3JhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRUZW1wb3JhbCgpCi0JICogQHNlZSAjZ2V0WG1sQmFzaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXNpY19UZW1wb3JhbCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQmFzaWNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEVudW1lcmF0ZWQgPGVtPkVudW1lcmF0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEVudW1lcmF0ZWQoKQotCSAqIEBzZWUgI2dldFhtbEJhc2ljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQmFzaWNfRW51bWVyYXRlZCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQmFzaWNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0ltcGwgPGVtPlhtbCBCYXNpYyBJbXBsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXNpYyBJbXBsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljSW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEJhc2ljSW1wbCgpCi0JewotCQlyZXR1cm4geG1sQmFzaWNJbXBsRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24gPGVtPlhtbCBWZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBWZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxWZXJzaW9uKCkKLQl7Ci0JCXJldHVybiB4bWxWZXJzaW9uRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiNnZXRUZW1wb3JhbCA8ZW0+VGVtcG9yYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UZW1wb3JhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uI2dldFRlbXBvcmFsKCkKLQkgKiBAc2VlICNnZXRYbWxWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVmVyc2lvbl9UZW1wb3JhbCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVmVyc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb25JbXBsIDxlbT5YbWwgVmVyc2lvbiBJbXBsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBWZXJzaW9uIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbkltcGwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxWZXJzaW9uSW1wbCgpCi0JewotCQlyZXR1cm4geG1sVmVyc2lvbkltcGxFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIDxlbT5YbWwgTWFueSBUbyBPbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hbnkgVG8gT25lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hbnlUb09uZSgpCi0JewotCQlyZXR1cm4geG1sTWFueVRvT25lRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZUltcGwgPGVtPlhtbCBNYW55IFRvIE9uZSBJbXBsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYW55IFRvIE9uZSBJbXBsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZUltcGwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9PbmVJbXBsKCkKLQl7Ci0JCXJldHVybiB4bWxNYW55VG9PbmVJbXBsRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSA8ZW0+WG1sIE9uZSBUbyBNYW55PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPbmUgVG8gTWFueTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxPbmVUb01hbnkoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvTWFueUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldEpvaW5Db2x1bW5zIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkpvaW4gQ29sdW1uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0Sm9pbkNvbHVtbnMoKQotCSAqIEBzZWUgI2dldFhtbE9uZVRvTWFueSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE9uZVRvTWFueV9Kb2luQ29sdW1ucygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55SW1wbCA8ZW0+WG1sIE9uZSBUbyBNYW55IEltcGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9uZSBUbyBNYW55IEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55SW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9uZVRvTWFueUltcGwoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvTWFueUltcGxFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUgPGVtPlhtbCBPbmUgVG8gT25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPbmUgVG8gT25lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT25lVG9PbmUoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvT25lRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0TWFwcGVkQnkgPGVtPk1hcHBlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcHBlZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRNYXBwZWRCeSgpCi0JICogQHNlZSAjZ2V0WG1sT25lVG9PbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPbmVUb09uZV9NYXBwZWRCeSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT25lVG9PbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zIDxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCSAqIEBzZWUgI2dldFhtbE9uZVRvT25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sT25lVG9PbmVfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxPbmVUb09uZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lSW1wbCA8ZW0+WG1sIE9uZSBUbyBPbmUgSW1wbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE9uZSBJbXBsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lSW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9uZVRvT25lSW1wbCgpCi0JewotCQlyZXR1cm4geG1sT25lVG9PbmVJbXBsRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkgPGVtPlhtbCBNYW55IFRvIE1hbnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hbnkgVG8gTWFueTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFueVRvTWFueSgpCi0JewotCQlyZXR1cm4geG1sTWFueVRvTWFueUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55SW1wbCA8ZW0+WG1sIE1hbnkgVG8gTWFueSBJbXBsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYW55IFRvIE1hbnkgSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55SW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hbnlUb01hbnlJbXBsKCkKLQl7Ci0JCXJldHVybiB4bWxNYW55VG9NYW55SW1wbEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZCA8ZW0+WG1sIEVtYmVkZGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbWJlZGRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVtYmVkZGVkKCkKLQl7Ci0JCXJldHVybiB4bWxFbWJlZGRlZEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZEltcGwgPGVtPlhtbCBFbWJlZGRlZCBJbXBsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbWJlZGRlZCBJbXBsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVtYmVkZGVkSW1wbCgpCi0JewotCQlyZXR1cm4geG1sRW1iZWRkZWRJbXBsRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudCA8ZW0+WG1sIFRyYW5zaWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVHJhbnNpZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFRyYW5zaWVudCgpCi0JewotCQlyZXR1cm4geG1sVHJhbnNpZW50RUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudEltcGwgPGVtPlhtbCBUcmFuc2llbnQgSW1wbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVHJhbnNpZW50IEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50SW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFRyYW5zaWVudEltcGwoKQotCXsKLQkJcmV0dXJuIHhtbFRyYW5zaWVudEltcGxFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSA8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZSgpCi0JewotCQlyZXR1cm4geG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSNnZXRKb2luQ29sdW1ucyA8ZW0+Sm9pbiBDb2x1bW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSNnZXRKb2luQ29sdW1ucygpCi0JICogQHNlZSAjZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfSm9pbkNvbHVtbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEFzc29jaWF0aW9uT3ZlcnJpZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwgPGVtPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZSBJbXBsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZSBJbXBsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwoKQotCXsKLQkJcmV0dXJuIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlIDxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBdHRyaWJ1dGUgT3ZlcnJpZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZSgpCi0JewotCQlyZXR1cm4geG1sQXR0cmlidXRlT3ZlcnJpZGVFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZSNnZXRDb2x1bW4gPGVtPkNvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNvbHVtbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZSNnZXRDb2x1bW4oKQotCSAqIEBzZWUgI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfQ29sdW1uKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxBdHRyaWJ1dGVPdmVycmlkZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxBdHRyaWJ1dGVPdmVycmlkZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCA8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSBJbXBsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBdHRyaWJ1dGUgT3ZlcnJpZGUgSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKQotCXsKLQkJcmV0dXJuIHhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbEVDbGFzczsKLQl9Ci0KLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSA8ZW0+Q2FzY2FkZSBUeXBlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtODY2MywxODAgKzY5NzcsMTggQEAKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGVJbXBsIDxlbT5DYXNjYWRlIFR5cGUgSW1wbDwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZSA8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGU8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2FzY2FkZSBUeXBlIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGVJbXBsCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sbGVjdGlvblRhYmxlCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q2FzY2FkZVR5cGVJbXBsKCkKKwlwdWJsaWMgRUNsYXNzIGdldFhtbENvbGxlY3Rpb25UYWJsZSgpCiAJewotCQlyZXR1cm4gY2FzY2FkZVR5cGVJbXBsRUNsYXNzOworCQlyZXR1cm4geG1sQ29sbGVjdGlvblRhYmxlRUNsYXNzOwogCX0KIAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29sdW1uIDxlbT5YbWwgTmFtZWQgQ29sdW1uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBOYW1lZCBDb2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxOYW1lZENvbHVtbigpCi0JewotCQlyZXR1cm4geG1sTmFtZWRDb2x1bW5FQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbHVtbiNnZXRDb2x1bW5EZWZpbml0aW9uIDxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbHVtbiBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29sdW1uI2dldENvbHVtbkRlZmluaXRpb24oKQotCSAqIEBzZWUgI2dldFhtbE5hbWVkQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWRDb2x1bW5fQ29sdW1uRGVmaW5pdGlvbigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTmFtZWRDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29sdW1uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29sdW1uI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbE5hbWVkQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWRDb2x1bW5fTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTmFtZWRDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE5hbWVkQ29sdW1uIDxlbT5BYnN0cmFjdCBYbWwgTmFtZWQgQ29sdW1uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFic3RyYWN0IFhtbCBOYW1lZCBDb2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxOYW1lZENvbHVtbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFic3RyYWN0WG1sTmFtZWRDb2x1bW4oKQotCXsKLQkJcmV0dXJuIGFic3RyYWN0WG1sTmFtZWRDb2x1bW5FQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW4gPGVtPlhtbCBBYnN0cmFjdCBDb2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEFic3RyYWN0IENvbHVtbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEFic3RyYWN0Q29sdW1uKCkKLQl7Ci0JCXJldHVybiB4bWxBYnN0cmFjdENvbHVtbkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldEluc2VydGFibGUgPGVtPkluc2VydGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbnNlcnRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldEluc2VydGFibGUoKQotCSAqIEBzZWUgI2dldFhtbEFic3RyYWN0Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQWJzdHJhY3RDb2x1bW5fSW5zZXJ0YWJsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQWJzdHJhY3RDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldE51bGxhYmxlIDxlbT5OdWxsYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk51bGxhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldE51bGxhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxBYnN0cmFjdENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEFic3RyYWN0Q29sdW1uX051bGxhYmxlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxBYnN0cmFjdENvbHVtbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW4jZ2V0VGFibGUgPGVtPlRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW4jZ2V0VGFibGUoKQotCSAqIEBzZWUgI2dldFhtbEFic3RyYWN0Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQWJzdHJhY3RDb2x1bW5fVGFibGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEFic3RyYWN0Q29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiNnZXRVbmlxdWUgPGVtPlVuaXF1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVuaXF1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiNnZXRVbmlxdWUoKQotCSAqIEBzZWUgI2dldFhtbEFic3RyYWN0Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQWJzdHJhY3RDb2x1bW5fVW5pcXVlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxBYnN0cmFjdENvbHVtbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW4jZ2V0VXBkYXRhYmxlIDxlbT5VcGRhdGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VcGRhdGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW4jZ2V0VXBkYXRhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxBYnN0cmFjdENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEFic3RyYWN0Q29sdW1uX1VwZGF0YWJsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQWJzdHJhY3RDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uIDxlbT5BYnN0cmFjdCBYbWwgQWJzdHJhY3QgQ29sdW1uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFic3RyYWN0IFhtbCBBYnN0cmFjdCBDb2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4oKQotCXsKLQkJcmV0dXJuIGFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW5FQ2xhc3M7Ci0JfQotCi0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uIDxlbT5YbWwgQ29sdW1uPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtODg1MCw3ICs3MDAyLDYgQEAKIAkJcmV0dXJuIHhtbENvbHVtbkVDbGFzczsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTg4NjUsNyArNzAxNiw2IEBACiAJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiNnZXRQcmVjaXNpb24gPGVtPlByZWNpc2lvbjwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTg4ODAsNyArNzAzMCw2IEBACiAJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC04ODk1LDIwICs3MDQ0LDMyIEBACiAJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKIAl9CiAKLQogCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW5JbXBsIDxlbT5YbWwgQ29sdW1uIEltcGw8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nIDxlbT5Db2x1bW4gTWFwcGluZzwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ29sdW1uIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uSW1wbAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbHVtbiBNYXBwaW5nPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmcKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDb2x1bW5JbXBsKCkKKwlwdWJsaWMgRUNsYXNzIGdldENvbHVtbk1hcHBpbmcoKQogCXsKLQkJcmV0dXJuIHhtbENvbHVtbkltcGxFQ2xhc3M7CisJCXJldHVybiBjb2x1bW5NYXBwaW5nRUNsYXNzOwogCX0KIAorCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmcjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db2x1bW48L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uTWFwcGluZyNnZXRDb2x1bW4oKQorCSAqIEBzZWUgI2dldENvbHVtbk1hcHBpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29sdW1uTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KIAogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5SZXN1bHQgPGVtPkNvbHVtbiBSZXN1bHQ8L2VtPn0nLgpAQCAtODkzOCw2ICs3MDk5LDYxIEBACiAJfQogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyA8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkKKwl7CisJCXJldHVybiB4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nI2lzTG9iIDxlbT5Mb2I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nI2lzTG9iKCkKKwkgKiBAc2VlICNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfTG9iKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcjZ2V0VGVtcG9yYWwgPGVtPlRlbXBvcmFsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGVtcG9yYWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nI2dldFRlbXBvcmFsKCkKKwkgKiBAc2VlICNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfVGVtcG9yYWwoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNnZXRFbnVtZXJhdGVkIDxlbT5FbnVtZXJhdGVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW51bWVyYXRlZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcjZ2V0RW51bWVyYXRlZCgpCisJICogQHNlZSAjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0VudW1lcmF0ZWQoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5YbWwgRGlzY3JpbWluYXRvciBDb2x1bW48L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC04OTUwLDcgKzcxNjYsNiBAQAogCQlyZXR1cm4geG1sRGlzY3JpbWluYXRvckNvbHVtbkVDbGFzczsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbERpc2NyaW1pbmF0b3JDb2x1bW4jZ2V0RGlzY3JpbWluYXRvclR5cGUgPGVtPkRpc2NyaW1pbmF0b3IgVHlwZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTg5NjUsNyArNzE4MCw2IEBACiAJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAJfQogCi0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXNjcmltaW5hdG9yQ29sdW1uI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtODk4MCwzMiArNzE5NCwyMzcgQEAKIAkJcmV0dXJuIChFQXR0cmlidXRlKXhtbERpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKIAl9CiAKLQogCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbjwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVycworCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVDbGFzcyBnZXRFbnRpdHlMaXN0ZW5lcnMoKQorCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb24oKQogCXsKLQkJcmV0dXJuIGVudGl0eUxpc3RlbmVyc0VDbGFzczsKKwkJcmV0dXJuIHhtbEVsZW1lbnRDb2xsZWN0aW9uRUNsYXNzOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXJzI2dldEVudGl0eUxpc3RlbmVycyA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUgPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVycyNnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBzZWUgI2dldEVudGl0eUxpc3RlbmVycygpCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGFibGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlMaXN0ZW5lcnNfRW50aXR5TGlzdGVuZXJzKCkKKwlwdWJsaWMgRUNsYXNzIGdldFhtbEVtYmVkZGFibGUoKQogCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUxpc3RlbmVyc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCQlyZXR1cm4geG1sRW1iZWRkYWJsZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQgPGVtPlhtbCBFbWJlZGRlZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW1iZWRkZWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxFbWJlZGRlZCgpCisJeworCQlyZXR1cm4geG1sRW1iZWRkZWRFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQgPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW1iZWRkZWQgSWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbEVtYmVkZGVkSWQoKQorCXsKKwkJcmV0dXJuIHhtbEVtYmVkZGVkSWRFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSA8ZW0+WG1sIEVudGl0eTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW50aXR5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eSgpCisJeworCQlyZXR1cm4geG1sRW50aXR5RUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0TmFtZSgpCisJICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5X05hbWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5UYWJsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0VGFibGUoKQorCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9UYWJsZSgpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0U2Vjb25kYXJ5VGFibGVzIDxlbT5TZWNvbmRhcnkgVGFibGVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWNvbmRhcnkgVGFibGVzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRTZWNvbmRhcnlUYWJsZXMoKQorCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9TZWNvbmRhcnlUYWJsZXMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByaW1hcnlLZXlKb2luQ29sdW1ucyA8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByaW1hcnlLZXlKb2luQ29sdW1ucygpCisJICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X1ByaW1hcnlLZXlKb2luQ29sdW1ucygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldElkQ2xhc3MgPGVtPklkIENsYXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SWQgQ2xhc3M8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldElkQ2xhc3MoKQorCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9JZENsYXNzKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0SW5oZXJpdGFuY2UgPGVtPkluaGVyaXRhbmNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW5oZXJpdGFuY2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEluaGVyaXRhbmNlKCkKKwkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfSW5oZXJpdGFuY2UoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXREaXNjcmltaW5hdG9yVmFsdWUgPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXNjcmltaW5hdG9yIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXREaXNjcmltaW5hdG9yVmFsdWUoKQorCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVudGl0eV9EaXNjcmltaW5hdG9yVmFsdWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXREaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5EaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkKKwkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfRGlzY3JpbWluYXRvckNvbHVtbigpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MgPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKQorCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCkKKwkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNpc0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzIDxlbT5FeGNsdWRlIFN1cGVyY2xhc3MgTGlzdGVuZXJzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCisJICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5X0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEVudGl0eUxpc3RlbmVycyA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEVudGl0eUxpc3RlbmVycygpCisJICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X0VudGl0eUxpc3RlbmVycygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwogCX0KIAogCS8qKgpAQCAtOTAzNiwxMDEgKzc0NTUsMTk3IEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UHJlUGVyc2lzdCA8ZW0+UHJlIFBlcnNpc3Q8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QcmUgUGVyc2lzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQcmVQZXJzaXN0KCkKLQkgKiBAc2VlICNnZXRFbnRpdHlMaXN0ZW5lcigpCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5TGlzdGVuZXJfUHJlUGVyc2lzdCgpCisJcHVibGljIEVDbGFzcyBnZXRFbnRpdHlMaXN0ZW5lcnMoKQogCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUxpc3RlbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJCXJldHVybiBlbnRpdHlMaXN0ZW5lcnNFQ2xhc3M7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UG9zdFBlcnNpc3QgPGVtPlBvc3QgUGVyc2lzdDwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMjZ2V0RW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdCBQZXJzaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFBvc3RQZXJzaXN0KCkKLQkgKiBAc2VlICNnZXRFbnRpdHlMaXN0ZW5lcigpCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXJzI2dldEVudGl0eUxpc3RlbmVycygpCisJICogQHNlZSAjZ2V0RW50aXR5TGlzdGVuZXJzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5TGlzdGVuZXJfUG9zdFBlcnNpc3QoKQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUxpc3RlbmVyc19FbnRpdHlMaXN0ZW5lcnMoKQogCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUxpc3RlbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlMaXN0ZW5lcnNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQcmVSZW1vdmUgPGVtPlByZSBSZW1vdmU8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyA8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZSBSZW1vdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UHJlUmVtb3ZlKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlMaXN0ZW5lcigpCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncwogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlMaXN0ZW5lcl9QcmVSZW1vdmUoKQorCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQogCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUxpc3RlbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJCXJldHVybiB4bWxFbnRpdHlNYXBwaW5nc0VDbGFzczsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQb3N0UmVtb3ZlIDxlbT5Qb3N0IFJlbW92ZTwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdCBSZW1vdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UG9zdFJlbW92ZSgpCi0JICogQHNlZSAjZ2V0RW50aXR5TGlzdGVuZXIoKQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5TGlzdGVuZXJfUG9zdFJlbW92ZSgpCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5TWFwcGluZ3NfRGVzY3JpcHRpb24oKQogCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUxpc3RlbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPGVtPlBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QcmUgVXBkYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFByZVVwZGF0ZSgpCi0JICogQHNlZSAjZ2V0RW50aXR5TGlzdGVuZXIoKQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCisJICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlMaXN0ZW5lcl9QcmVVcGRhdGUoKQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzX1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKIAl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlMaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQb3N0VXBkYXRlIDxlbT5Qb3N0IFVwZGF0ZTwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0UGFja2FnZSA8ZW0+UGFja2FnZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc3QgVXBkYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFBvc3RVcGRhdGUoKQotCSAqIEBzZWUgI2dldEVudGl0eUxpc3RlbmVyKCkKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhY2thZ2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0UGFja2FnZSgpCisJICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlMaXN0ZW5lcl9Qb3N0VXBkYXRlKCkKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlNYXBwaW5nc19QYWNrYWdlKCkKIAl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlMaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59Jy4KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc3QgTG9hZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRQb3N0TG9hZCgpCi0JICogQHNlZSAjZ2V0RW50aXR5TGlzdGVuZXIoKQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NoZW1hPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFNjaGVtYSgpCisJICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlMaXN0ZW5lcl9Qb3N0TG9hZCgpCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5TWFwcGluZ3NfU2NoZW1hKCkKIAl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlMaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2F0YWxvZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRDYXRhbG9nKCkKKwkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVudGl0eU1hcHBpbmdzX0NhdGFsb2coKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRTZXF1ZW5jZUdlbmVyYXRvcnMgPGVtPlNlcXVlbmNlIEdlbmVyYXRvcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcXVlbmNlIEdlbmVyYXRvcnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkKKwkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzX1NlcXVlbmNlR2VuZXJhdG9ycygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFRhYmxlR2VuZXJhdG9ycyA8ZW0+VGFibGUgR2VuZXJhdG9yczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGFibGUgR2VuZXJhdG9yczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRUYWJsZUdlbmVyYXRvcnMoKQorCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfVGFibGVHZW5lcmF0b3JzKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MgPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpCisJICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc19TcWxSZXN1bHRTZXRNYXBwaW5ncygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldE1hcHBlZFN1cGVyY2xhc3NlcyA8ZW0+TWFwcGVkIFN1cGVyY2xhc3NlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWFwcGVkIFN1cGVyY2xhc3NlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRNYXBwZWRTdXBlcmNsYXNzZXMoKQorCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfTWFwcGVkU3VwZXJjbGFzc2VzKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0RW50aXRpZXMgPGVtPkVudGl0aWVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnRpdGllczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRFbnRpdGllcygpCisJICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc19FbnRpdGllcygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldEVtYmVkZGFibGVzIDxlbT5FbWJlZGRhYmxlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW1iZWRkYWJsZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0RW1iZWRkYWJsZXMoKQorCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfRW1iZWRkYWJsZXMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwogCX0KIAogCS8qKgpAQCAtOTE4OSw2ICs3NzA0LDE0NCBAQAogCX0KIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FdmVudE1ldGhvZCA8ZW0+RXZlbnQgTWV0aG9kPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV2ZW50IE1ldGhvZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FdmVudE1ldGhvZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEV2ZW50TWV0aG9kKCkKKwl7CisJCXJldHVybiBldmVudE1ldGhvZEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FdmVudE1ldGhvZCNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGhvZCBOYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkV2ZW50TWV0aG9kI2dldE1ldGhvZE5hbWUoKQorCSAqIEBzZWUgI2dldEV2ZW50TWV0aG9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXZlbnRNZXRob2RfTWV0aG9kTmFtZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXZlbnRNZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIgPGVtPlhtbCBFdmVudCBNZXRob2QgQ29udGFpbmVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFdmVudCBNZXRob2QgQ29udGFpbmVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXIoKQorCXsKKwkJcmV0dXJuIHhtbEV2ZW50TWV0aG9kQ29udGFpbmVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFByZVBlcnNpc3QgPGVtPlByZSBQZXJzaXN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJlIFBlcnNpc3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIjZ2V0UHJlUGVyc2lzdCgpCisJICogQHNlZSAjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVQZXJzaXN0KCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFdmVudE1ldGhvZENvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFBvc3RQZXJzaXN0IDxlbT5Qb3N0IFBlcnNpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIjZ2V0UG9zdFBlcnNpc3QoKQorCSAqIEBzZWUgI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFBlcnNpc3QoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEV2ZW50TWV0aG9kQ29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIjZ2V0UHJlUmVtb3ZlIDxlbT5QcmUgUmVtb3ZlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJlIFJlbW92ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQcmVSZW1vdmUoKQorCSAqIEBzZWUgI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUHJlUmVtb3ZlKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFdmVudE1ldGhvZENvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFBvc3RSZW1vdmUgPGVtPlBvc3QgUmVtb3ZlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdCBSZW1vdmU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIjZ2V0UG9zdFJlbW92ZSgpCisJICogQHNlZSAjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0UmVtb3ZlKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFdmVudE1ldGhvZENvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZSBVcGRhdGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIjZ2V0UHJlVXBkYXRlKCkKKwkgKiBAc2VlICNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1ByZVVwZGF0ZSgpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRXZlbnRNZXRob2RDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQb3N0VXBkYXRlIDxlbT5Qb3N0IFVwZGF0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc3QgVXBkYXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFBvc3RVcGRhdGUoKQorCSAqIEBzZWUgI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFVwZGF0ZSgpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRXZlbnRNZXRob2RDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdCBMb2FkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFBvc3RMb2FkKCkKKwkgKiBAc2VlICNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RMb2FkKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFdmVudE1ldGhvZENvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GaWVsZFJlc3VsdCA8ZW0+RmllbGQgUmVzdWx0PC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtOTI0Miw3ICs3ODk1LDYgQEAKIAkJcmV0dXJuIHhtbEdlbmVyYXRlZFZhbHVlRUNsYXNzOwogCX0KIAotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWUjZ2V0R2VuZXJhdG9yIDxlbT5HZW5lcmF0b3I8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC05MjU3LDcgKzc5MDksNiBAQAogCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sR2VuZXJhdGVkVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlI2dldFN0cmF0ZWd5IDxlbT5TdHJhdGVneTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTkyNzIsMjAgKzc5MjMsMTI4IEBACiAJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxHZW5lcmF0ZWRWYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwogCX0KIAotCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlSW1wbCA8ZW0+WG1sIEdlbmVyYXRlZCBWYWx1ZSBJbXBsPC9lbT59Jy4KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yIDxlbT5YbWwgR2VuZXJhdG9yPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBHZW5lcmF0ZWQgVmFsdWUgSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZUltcGwKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgR2VuZXJhdG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvcgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEdlbmVyYXRlZFZhbHVlSW1wbCgpCisJcHVibGljIEVDbGFzcyBnZXRYbWxHZW5lcmF0b3IoKQogCXsKLQkJcmV0dXJuIHhtbEdlbmVyYXRlZFZhbHVlSW1wbEVDbGFzczsKKwkJcmV0dXJuIHhtbEdlbmVyYXRvckVDbGFzczsKIAl9CiAKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yI2dldE5hbWUoKQorCSAqIEBzZWUgI2dldFhtbEdlbmVyYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEdlbmVyYXRvcl9OYW1lKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0SW5pdGlhbFZhbHVlIDxlbT5Jbml0aWFsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0SW5pdGlhbFZhbHVlKCkKKwkgKiBAc2VlICNnZXRYbWxHZW5lcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxHZW5lcmF0b3JfSW5pdGlhbFZhbHVlKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0QWxsb2NhdGlvblNpemUgPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0QWxsb2NhdGlvblNpemUoKQorCSAqIEBzZWUgI2dldFhtbEdlbmVyYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEdlbmVyYXRvcl9BbGxvY2F0aW9uU2l6ZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sR2VuZXJhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lciA8ZW0+WG1sIEdlbmVyYXRvciBDb250YWluZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEdlbmVyYXRvciBDb250YWluZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyKCkKKwl7CisJCXJldHVybiB4bWxHZW5lcmF0b3JDb250YWluZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyI2dldFNlcXVlbmNlR2VuZXJhdG9yIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKKwkgKiBAc2VlICNnZXRYbWxHZW5lcmF0b3JDb250YWluZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxHZW5lcmF0b3JDb250YWluZXJfU2VxdWVuY2VHZW5lcmF0b3IoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEdlbmVyYXRvckNvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lciNnZXRUYWJsZUdlbmVyYXRvciA8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lciNnZXRUYWJsZUdlbmVyYXRvcigpCisJICogQHNlZSAjZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1RhYmxlR2VuZXJhdG9yKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxHZW5lcmF0b3JDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQgPGVtPlhtbCBJZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxJZCgpCisJeworCQlyZXR1cm4geG1sSWRFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRHZW5lcmF0ZWRWYWx1ZSgpCisJICogQHNlZSAjZ2V0WG1sSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxJZF9HZW5lcmF0ZWRWYWx1ZSgpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sSWRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzcyA8ZW0+WG1sIElkIENsYXNzPC9lbT59Jy4KQEAgLTkzMDAsNyArODA1OSw2IEBACiAJCXJldHVybiB4bWxJZENsYXNzRUNsYXNzOwogCX0KIAotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzcyNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC05MzE1LDcgKzgwNzMsNiBAQAogCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sSWRDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwogCX0KIAotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlIDxlbT5Jbmhlcml0YW5jZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTkzNTYsNyArODExMyw2IEBACiAJCXJldHVybiB4bWxKb2luQ29sdW1uRUNsYXNzOwogCX0KIAotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbiNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTkzNzEsMjAgKzgxMjcsMzIgQEAKIAkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEpvaW5Db2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKIAl9CiAKLQogCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uSW1wbCA8ZW0+WG1sIEpvaW4gQ29sdW1uIEltcGw8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uc01hcHBpbmcgPGVtPlhtbCBKb2luIENvbHVtbnMgTWFwcGluZzwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSm9pbiBDb2x1bW4gSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uSW1wbAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBKb2luIENvbHVtbnMgTWFwcGluZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uc01hcHBpbmcKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxKb2luQ29sdW1uSW1wbCgpCisJcHVibGljIEVDbGFzcyBnZXRYbWxKb2luQ29sdW1uc01hcHBpbmcoKQogCXsKLQkJcmV0dXJuIHhtbEpvaW5Db2x1bW5JbXBsRUNsYXNzOworCQlyZXR1cm4geG1sSm9pbkNvbHVtbnNNYXBwaW5nRUNsYXNzOwogCX0KIAorCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbnNNYXBwaW5nI2dldEpvaW5Db2x1bW5zIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkpvaW4gQ29sdW1uczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uc01hcHBpbmcjZ2V0Sm9pbkNvbHVtbnMoKQorCSAqIEBzZWUgI2dldFhtbEpvaW5Db2x1bW5zTWFwcGluZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEpvaW5Db2x1bW5zTWFwcGluZ19Kb2luQ29sdW1ucygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sSm9pbkNvbHVtbnNNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZSA8ZW0+WG1sIEpvaW4gVGFibGU8L2VtPn0nLgpAQCAtOTM5OSw3ICs4MTY3LDYgQEAKIAkJcmV0dXJuIHhtbEpvaW5UYWJsZUVDbGFzczsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlI2dldEpvaW5Db2x1bW5zIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC05NDE0LDcgKzgxODEsNiBAQAogCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sSm9pblRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAJfQogCi0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZSNnZXRJbnZlcnNlSm9pbkNvbHVtbnMgPGVtPkludmVyc2UgSm9pbiBDb2x1bW5zPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtOTQyOSwyMCArODE5NSwzMiBAQAogCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sSm9pblRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CiAJfQogCi0KIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlSW1wbCA8ZW0+WG1sIEpvaW4gVGFibGUgSW1wbDwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZU1hcHBpbmcgPGVtPlhtbCBKb2luIFRhYmxlIE1hcHBpbmc8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEpvaW4gVGFibGUgSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVJbXBsCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEpvaW4gVGFibGUgTWFwcGluZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVNYXBwaW5nCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSm9pblRhYmxlSW1wbCgpCisJcHVibGljIEVDbGFzcyBnZXRYbWxKb2luVGFibGVNYXBwaW5nKCkKIAl7Ci0JCXJldHVybiB4bWxKb2luVGFibGVJbXBsRUNsYXNzOworCQlyZXR1cm4geG1sSm9pblRhYmxlTWFwcGluZ0VDbGFzczsKIAl9CiAKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVNYXBwaW5nI2dldEpvaW5UYWJsZSA8ZW0+Sm9pbiBUYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkpvaW4gVGFibGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlTWFwcGluZyNnZXRKb2luVGFibGUoKQorCSAqIEBzZWUgI2dldFhtbEpvaW5UYWJsZU1hcHBpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxKb2luVGFibGVNYXBwaW5nX0pvaW5UYWJsZSgpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sSm9pblRhYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KIAogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Mb2IgPGVtPkxvYjwvZW0+fScuCkBAIC05NDU4LDYgKzgyMzYsMzIgQEAKIAl9CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSA8ZW0+WG1sIE1hbnkgVG8gTWFueTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFueSBUbyBNYW55PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9NYW55KCkKKwl7CisJCXJldHVybiB4bWxNYW55VG9NYW55RUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUgPGVtPlhtbCBNYW55IFRvIE9uZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFueSBUbyBPbmU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFueVRvT25lKCkKKwl7CisJCXJldHVybiB4bWxNYW55VG9PbmVFQ2xhc3M7CisJfQorCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleSA8ZW0+TWFwIEtleTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTk0ODUsNzcgKzgyODksMTEzIEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleUltcGwgPGVtPk1hcCBLZXkgSW1wbDwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcEtleUNsYXNzIDxlbT5YbWwgTWFwIEtleSBDbGFzczwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NYXAgS2V5IEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5SW1wbAorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYXAgS2V5IENsYXNzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcEtleUNsYXNzCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWFwS2V5SW1wbCgpCisJcHVibGljIEVDbGFzcyBnZXRYbWxNYXBLZXlDbGFzcygpCiAJewotCQlyZXR1cm4gbWFwS2V5SW1wbEVDbGFzczsKKwkJcmV0dXJuIHhtbE1hcEtleUNsYXNzRUNsYXNzOwogCX0KIAotCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5IDxlbT5YbWwgUXVlcnk8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRCeU1hcHBpbmcgPGVtPlhtbCBNYXBwZWQgQnkgTWFwcGluZzwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUXVlcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnkKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFwcGVkIEJ5IE1hcHBpbmc8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkQnlNYXBwaW5nCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUXVlcnkoKQorCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFwcGVkQnlNYXBwaW5nKCkKIAl7Ci0JCXJldHVybiB4bWxRdWVyeUVDbGFzczsKKwkJcmV0dXJuIHhtbE1hcHBlZEJ5TWFwcGluZ0VDbGFzczsKIAl9CiAKLQogCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZEJ5TWFwcGluZyNnZXRNYXBwZWRCeSA8ZW0+TWFwcGVkIEJ5PC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxRdWVyeSgpCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXBwZWQgQnk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkQnlNYXBwaW5nI2dldE1hcHBlZEJ5KCkKKwkgKiBAc2VlICNnZXRYbWxNYXBwZWRCeU1hcHBpbmcoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxRdWVyeV9OYW1lKCkKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNYXBwZWRCeU1hcHBpbmdfTWFwcGVkQnkoKQogCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYXBwZWRCeU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKIAl9CiAKLQogCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5I2dldFF1ZXJ5IDxlbT5RdWVyeTwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzczwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlF1ZXJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5I2dldFF1ZXJ5KCkKLQkgKiBAc2VlICNnZXRYbWxRdWVyeSgpCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUXVlcnlfUXVlcnkoKQorCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCiAJewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwkJcmV0dXJuIHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3M7CiAJfQogCi0KIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5I2dldEhpbnRzIDxlbT5IaW50czwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRJZENsYXNzIDxlbT5JZCBDbGFzczwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SGludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnkjZ2V0SGludHMoKQotCSAqIEBzZWUgI2dldFhtbFF1ZXJ5KCkKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPklkIENsYXNzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0SWRDbGFzcygpCisJICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFF1ZXJ5X0hpbnRzKCkKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0lkQ2xhc3MoKQogCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAJfQogCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIDxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQorCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNpc0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzIDxlbT5FeGNsdWRlIFN1cGVyY2xhc3MgTGlzdGVuZXJzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKQorCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRFbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RW50aXR5TGlzdGVuZXJzKCkKKwkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FbnRpdHlMaXN0ZW5lcnMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeSA8ZW0+WG1sIE5hbWVkIE5hdGl2ZSBRdWVyeTwvZW0+fScuCkBAIC05NTcwLDcgKzg0MTAsNiBAQAogCQlyZXR1cm4geG1sTmFtZWROYXRpdmVRdWVyeUVDbGFzczsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnkjZ2V0UmVzdWx0Q2xhc3MgPGVtPlJlc3VsdCBDbGFzczwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTk1ODUsNyArODQyNCw2IEBACiAJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZE5hdGl2ZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAJfQogCi0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5I2dldFJlc3VsdFNldE1hcHBpbmcgPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTk2MDAsNyArODQzOCw2IEBACiAJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZE5hdGl2ZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CiAJfQogCi0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeSA8ZW0+WG1sIE5hbWVkIFF1ZXJ5PC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtOTYxNCwzNSArODQ1MSwxODEgQEAKIAkJcmV0dXJuIHhtbE5hbWVkUXVlcnlFQ2xhc3M7CiAJfQogCi0KIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRXZlbnRNZXRob2QgPGVtPkV2ZW50IE1ldGhvZDwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgTnVsbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FdmVudCBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRXZlbnRNZXRob2QKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTnVsbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZwogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV2ZW50TWV0aG9kKCkKKwlwdWJsaWMgRUNsYXNzIGdldFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKCkKIAl7Ci0JCXJldHVybiBldmVudE1ldGhvZEVDbGFzczsKKwkJcmV0dXJuIHhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzOwogCX0KIAotCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRXZlbnRNZXRob2QjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nLgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkgPGVtPlhtbCBPbmUgVG8gTWFueTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGhvZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkV2ZW50TWV0aG9kI2dldE1ldGhvZE5hbWUoKQotCSAqIEBzZWUgI2dldEV2ZW50TWV0aG9kKCkKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV2ZW50TWV0aG9kX01ldGhvZE5hbWUoKQorCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT25lVG9NYW55KCkKIAl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlldmVudE1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCQlyZXR1cm4geG1sT25lVG9NYW55RUNsYXNzOwogCX0KIAorCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSA8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxPbmVUb09uZSgpCisJeworCQlyZXR1cm4geG1sT25lVG9PbmVFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldFByaW1hcnlLZXlKb2luQ29sdW1ucygpCisJICogQHNlZSAjZ2V0WG1sT25lVG9PbmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxPbmVUb09uZV9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE9uZVRvT25lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uIDxlbT5YbWwgT3JkZXIgQ29sdW1uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPcmRlciBDb2x1bW48L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxPcmRlckNvbHVtbigpCisJeworCQlyZXR1cm4geG1sT3JkZXJDb2x1bW5FQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKKwl7CisJCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjaGVtYTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRTY2hlbWEoKQorCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfU2NoZW1hKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXRhbG9nPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldENhdGFsb2coKQorCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQ2F0YWxvZygpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNpc0Nhc2NhZGVQZXJzaXN0IDxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjaXNDYXNjYWRlUGVyc2lzdCgpCisJICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19DYXNjYWRlUGVyc2lzdCgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRFbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldEVudGl0eUxpc3RlbmVycygpCisJICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19FbnRpdHlMaXN0ZW5lcnMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKKwl7CisJCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSNpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIDxlbT5YbWwgTWFwcGluZyBNZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhtbCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhI2lzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKQorCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhI2dldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKKwkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KIAogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Qb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59Jy4KQEAgLTk3NDgsNyArODczMSw2IEBACiAJCXJldHVybiB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkVDbGFzczsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lIDxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtOTc2MywyMCArODc0NSwxMDEgQEAKIAkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByaW1hcnlLZXlKb2luQ29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAJfQogCi0KIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsIDxlbT5YbWwgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4gSW1wbDwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5IDxlbT5YbWwgUXVlcnk8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFF1ZXJ5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsKCkKKwlwdWJsaWMgRUNsYXNzIGdldFhtbFF1ZXJ5KCkKIAl7Ci0JCXJldHVybiB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGxFQ2xhc3M7CisJCXJldHVybiB4bWxRdWVyeUVDbGFzczsKIAl9CiAKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSNnZXROYW1lKCkKKwkgKiBAc2VlICNnZXRYbWxRdWVyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFF1ZXJ5X05hbWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnkjZ2V0UXVlcnkgPGVtPlF1ZXJ5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UXVlcnk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnkjZ2V0UXVlcnkoKQorCSAqIEBzZWUgI2dldFhtbFF1ZXJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUXVlcnlfUXVlcnkoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSNnZXRIaW50cyA8ZW0+SGludHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhpbnRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5I2dldEhpbnRzKCkKKwkgKiBAc2VlICNnZXRYbWxRdWVyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFF1ZXJ5X0hpbnRzKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxRdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciA8ZW0+WG1sIFF1ZXJ5IENvbnRhaW5lcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUXVlcnkgQ29udGFpbmVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUXVlcnlDb250YWluZXIoKQorCXsKKwkJcmV0dXJuIHhtbFF1ZXJ5Q29udGFpbmVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIjZ2V0TmFtZWRRdWVyaWVzIDxlbT5OYW1lZCBRdWVyaWVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5OYW1lZCBRdWVyaWVzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyI2dldE5hbWVkUXVlcmllcygpCisJICogQHNlZSAjZ2V0WG1sUXVlcnlDb250YWluZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFF1ZXJpZXMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFF1ZXJ5Q29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciNnZXROYW1lZE5hdGl2ZVF1ZXJpZXMgPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciNnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKQorCSAqIEBzZWUgI2dldFhtbFF1ZXJ5Q29udGFpbmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWROYXRpdmVRdWVyaWVzKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxRdWVyeUNvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KIAogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQgPGVtPlhtbCBRdWVyeSBIaW50PC9lbT59Jy4KQEAgLTk3OTEsNyArODg1NCw2IEBACiAJCXJldHVybiB4bWxRdWVyeUhpbnRFQ2xhc3M7CiAJfQogCi0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTk4MDYsNyArODg2OCw2IEBACiAJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeUhpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC05ODIxLDEwOSArODg4Miw2IEBACiAJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeUhpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKIAl9CiAKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VUYWJsZSA8ZW0+QWJzdHJhY3QgWG1sIEJhc2UgVGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWJzdHJhY3QgWG1sIEJhc2UgVGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxCYXNlVGFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFhtbEJhc2VUYWJsZSgpCi0JewotCQlyZXR1cm4gYWJzdHJhY3RYbWxCYXNlVGFibGVFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlIDxlbT5YbWwgQmFzZSBUYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmFzZSBUYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXNlVGFibGUoKQotCXsKLQkJcmV0dXJuIHhtbEJhc2VUYWJsZUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VUYWJsZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGUjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sQmFzZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQmFzZVRhYmxlX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEJhc2VUYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXRhbG9nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VUYWJsZSNnZXRDYXRhbG9nKCkKLQkgKiBAc2VlICNnZXRYbWxCYXNlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXNlVGFibGVfQ2F0YWxvZygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQmFzZVRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGUjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY2hlbWE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlI2dldFNjaGVtYSgpCi0JICogQHNlZSAjZ2V0WG1sQmFzZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQmFzZVRhYmxlX1NjaGVtYSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQmFzZVRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VUYWJsZSNnZXRVbmlxdWVDb25zdHJhaW50cyA8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5VbmlxdWUgQ29uc3RyYWludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlI2dldFVuaXF1ZUNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNnZXRYbWxCYXNlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxCYXNlVGFibGVfVW5pcXVlQ29uc3RyYWludHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEJhc2VUYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlIDxlbT5YbWwgVGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVGFibGUoKQotCXsKLQkJcmV0dXJuIHhtbFRhYmxlRUNsYXNzOwotCX0KLQotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlIDxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtOTkzNyw3ICs4ODk1LDYgQEAKIAkJcmV0dXJuIHhtbFNlY29uZGFyeVRhYmxlRUNsYXNzOwogCX0KIAotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZSNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTk5NTIsODAgKzg5MDksNiBAQAogCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sU2Vjb25kYXJ5VGFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKIAl9CiAKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZUltcGwgPGVtPlhtbCBTZWNvbmRhcnkgVGFibGUgSW1wbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlIEltcGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGVJbXBsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sU2Vjb25kYXJ5VGFibGVJbXBsKCkKLQl7Ci0JCXJldHVybiB4bWxTZWNvbmRhcnlUYWJsZUltcGxFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yIDxlbT5YbWwgR2VuZXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBHZW5lcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiB4bWxHZW5lcmF0b3JFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbEdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEdlbmVyYXRvcl9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvciNnZXRJbml0aWFsVmFsdWUgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jbml0aWFsIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvciNnZXRJbml0aWFsVmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbEdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEdlbmVyYXRvcl9Jbml0aWFsVmFsdWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yI2dldEFsbG9jYXRpb25TaXplIDxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yI2dldEFsbG9jYXRpb25TaXplKCkKLQkgKiBAc2VlICNnZXRYbWxHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxHZW5lcmF0b3JfQWxsb2NhdGlvblNpemUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yIDxlbT5YbWwgU2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMTAwMzksNyArODkyMiw2IEBACiAJCXJldHVybiB4bWxTZXF1ZW5jZUdlbmVyYXRvckVDbGFzczsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yI2dldFNlcXVlbmNlTmFtZSA8ZW0+U2VxdWVuY2UgTmFtZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTEwMDU0LDIxICs4OTM2LDYgQEAKIAkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFNlcXVlbmNlR2VuZXJhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAJfQogCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsIDxlbT5YbWwgU2VxdWVuY2UgR2VuZXJhdG9yIEltcGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFNlcXVlbmNlIEdlbmVyYXRvciBJbXBsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCgpCi0JewotCQlyZXR1cm4geG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsRUNsYXNzOwotCX0KLQotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmcgPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0xMDEyNSw2ICs4OTkyLDE5IEBACiAJfQogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlIDxlbT5YbWwgVGFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFRhYmxlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVGFibGUoKQorCXsKKwkJcmV0dXJuIHhtbFRhYmxlRUNsYXNzOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciA8ZW0+WG1sIFRhYmxlIEdlbmVyYXRvcjwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTEwMTM3LDcgKzkwMTcsNiBAQAogCQlyZXR1cm4geG1sVGFibGVHZW5lcmF0b3JFQ2xhc3M7CiAJfQogCi0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0xMDE1Miw3ICs5MDMxLDYgQEAKIAkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAJfQogCi0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMTAxNjcsNyArOTA0NSw2IEBACiAJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUYWJsZUdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwogCX0KIAotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0xMDE4Miw3ICs5MDU5LDYgQEAKIAkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CiAJfQogCi0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRQa0NvbHVtbk5hbWUgPGVtPlBrIENvbHVtbiBOYW1lPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMTAxOTcsNyArOTA3Myw2IEBACiAJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUYWJsZUdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwogCX0KIAotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0VmFsdWVDb2x1bW5OYW1lIDxlbT5WYWx1ZSBDb2x1bW4gTmFtZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTEwMjEyLDcgKzkwODcsNiBAQAogCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFBrQ29sdW1uVmFsdWUgPGVtPlBrIENvbHVtbiBWYWx1ZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTEwMjI3LDcgKzkxMDEsNiBAQAogCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0VW5pcXVlQ29uc3RyYWludHMgPGVtPlVuaXF1ZSBDb25zdHJhaW50czwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTEwMjQyLDIwICs5MTE1LDg3IEBACiAJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxUYWJsZUdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwogCX0KIAotCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9ySW1wbCA8ZW0+WG1sIFRhYmxlIEdlbmVyYXRvciBJbXBsPC9lbT59Jy4KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IDxlbT5YbWwgVHJhbnNpZW50PC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUYWJsZSBHZW5lcmF0b3IgSW1wbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvckltcGwKKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVHJhbnNpZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFRhYmxlR2VuZXJhdG9ySW1wbCgpCisJcHVibGljIEVDbGFzcyBnZXRYbWxUcmFuc2llbnQoKQogCXsKLQkJcmV0dXJuIHhtbFRhYmxlR2VuZXJhdG9ySW1wbEVDbGFzczsKKwkJcmV0dXJuIHhtbFRyYW5zaWVudEVDbGFzczsKIAl9CiAKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcgPGVtPlhtbCBUeXBlIE1hcHBpbmc8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFR5cGUgTWFwcGluZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFR5cGVNYXBwaW5nKCkKKwl7CisJCXJldHVybiB4bWxUeXBlTWFwcGluZ0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZyNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nI2dldENsYXNzTmFtZSgpCisJICogQHNlZSAjZ2V0WG1sVHlwZU1hcHBpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUeXBlTWFwcGluZ19DbGFzc05hbWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFR5cGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0TWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZyNnZXRNZXRhZGF0YUNvbXBsZXRlKCkKKwkgKiBAc2VlICNnZXRYbWxUeXBlTWFwcGluZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFR5cGVNYXBwaW5nX01ldGFkYXRhQ29tcGxldGUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFR5cGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBzZWUgI2dldFhtbFR5cGVNYXBwaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVHlwZU1hcHBpbmdfRGVzY3JpcHRpb24oKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFR5cGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0QXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkF0dHJpYnV0ZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0QXR0cmlidXRlcygpCisJICogQHNlZSAjZ2V0WG1sVHlwZU1hcHBpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxUeXBlTWFwcGluZ19BdHRyaWJ1dGVzKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxUeXBlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KIAogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50IDxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQ8L2VtPn0nLgpAQCAtMTAyNzAsNyArOTIxMCw2IEBACiAJCXJldHVybiB4bWxVbmlxdWVDb25zdHJhaW50RUNsYXNzOwogCX0KIAotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50I2dldENvbHVtbk5hbWVzIDxlbT5Db2x1bW4gTmFtZXM8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0xMDI4NSwyMSArOTIyNCwxOSBAQAogCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVW5pcXVlQ29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwogCX0KIAotCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsIDxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQgSW1wbDwvZW0+fScuCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24gPGVtPlhtbCBWZXJzaW9uPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBVbmlxdWUgQ29uc3RyYWludCBJbXBsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFZlcnNpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCkKKwlwdWJsaWMgRUNsYXNzIGdldFhtbFZlcnNpb24oKQogCXsKLQkJcmV0dXJuIHhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsRUNsYXNzOworCQlyZXR1cm4geG1sVmVyc2lvbkVDbGFzczsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUgPGVtPkFjY2VzcyBUeXBlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMTA0MzQsMjAgKzkzNzEsNiBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5WZXJzaW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlZlcnNpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRWZXJzaW9uVHlwZSgpCi0JewotCQlyZXR1cm4gdmVyc2lvblR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCiAJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTEwNDc5LDgyICs5NDAyLDU5IEBACiAJCWlzQ3JlYXRlZCA9IHRydWU7CiAKIAkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTlRJVFlfTUFQUElOR1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19WRVJTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfX1NDSEVNQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfX0NBVEFMT0cpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fVEFCTEVfR0VORVJBVE9SUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1FVRVJJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fTUFQUEVEX1NVUEVSQ0xBU1NFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfX0VOVElUSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fRU1CRUREQUJMRVMpOworCQlhYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HKTsKIAotCQl4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTKTsKKwkJYWJzdHJhY3RYbWxDb2x1bW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfWE1MX0NPTFVNTik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYWJzdHJhY3RYbWxDb2x1bW5FQ2xhc3MsIEFCU1RSQUNUX1hNTF9DT0xVTU5fX0lOU0VSVEFCTEUpOworCQljcmVhdGVFQXR0cmlidXRlKGFic3RyYWN0WG1sQ29sdW1uRUNsYXNzLCBBQlNUUkFDVF9YTUxfQ09MVU1OX19OVUxMQUJMRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYWJzdHJhY3RYbWxDb2x1bW5FQ2xhc3MsIEFCU1RSQUNUX1hNTF9DT0xVTU5fX1RBQkxFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhYnN0cmFjdFhtbENvbHVtbkVDbGFzcywgQUJTVFJBQ1RfWE1MX0NPTFVNTl9fVU5JUVVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhYnN0cmFjdFhtbENvbHVtbkVDbGFzcywgQUJTVFJBQ1RfWE1MX0NPTFVNTl9fVVBEQVRBQkxFKTsKIAotCQl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19TQ0hFTUEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FUQUxPRyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FTQ0FERV9QRVJTSVNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlMpOworCQlhYnN0cmFjdFhtbEVtYmVkZGVkRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFCU1RSQUNUX1hNTF9FTUJFRERFRCk7CisKKwkJYWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcywgQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9CWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoYWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWSk7CisKKwkJYWJzdHJhY3RYbWxOYW1lZENvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhYnN0cmFjdFhtbE5hbWVkQ29sdW1uRUNsYXNzLCBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYWJzdHJhY3RYbWxOYW1lZENvbHVtbkVDbGFzcywgQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fTkFNRSk7CisKKwkJYWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElORyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLCBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFkpOworCQljcmVhdGVFQXR0cmlidXRlKGFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcywgQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoYWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLCBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREUpOworCisJCWFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX09QVElPTkFMKTsKKworCQlhYnN0cmFjdFhtbFRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFCU1RSQUNUX1hNTF9UQUJMRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYWJzdHJhY3RYbWxUYWJsZUVDbGFzcywgQUJTVFJBQ1RfWE1MX1RBQkxFX19OQU1FKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhYnN0cmFjdFhtbFRhYmxlRUNsYXNzLCBBQlNUUkFDVF9YTUxfVEFCTEVfX0NBVEFMT0cpOworCQljcmVhdGVFQXR0cmlidXRlKGFic3RyYWN0WG1sVGFibGVFQ2xhc3MsIEFCU1RSQUNUX1hNTF9UQUJMRV9fU0NIRU1BKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShhYnN0cmFjdFhtbFRhYmxlRUNsYXNzLCBBQlNUUkFDVF9YTUxfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUyk7CiAKIAkJYWJzdHJhY3RYbWxUeXBlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhYnN0cmFjdFhtbFR5cGVNYXBwaW5nRUNsYXNzLCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhYnN0cmFjdFhtbFR5cGVNYXBwaW5nRUNsYXNzLCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BQ0NFU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGFic3RyYWN0WG1sVHlwZU1hcHBpbmdFQ2xhc3MsIEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhYnN0cmFjdFhtbFR5cGVNYXBwaW5nRUNsYXNzLCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYWJzdHJhY3RYbWxUeXBlTWFwcGluZ0VDbGFzcywgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUyk7CiAKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fSURfQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1BFUlNJU1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9QRVJTSVNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9SRU1PVkUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9SRU1PVkUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1VQREFURSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1VQREFURSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX0xPQUQpOworCQl4bWxBY2Nlc3NIb2xkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FDQ0VTU19IT0xERVIpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbEFjY2Vzc0hvbGRlckVDbGFzcywgWE1MX0FDQ0VTU19IT0xERVJfX0FDQ0VTUyk7CiAKLQkJeG1sRW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19UQUJMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19TRUNPTkRBUllfVEFCTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19JRF9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19JTkhFUklUQU5DRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1NFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19UQUJMRV9HRU5FUkFUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fTkFNRURfUVVFUklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19OQU1FRF9OQVRJVkVfUVVFUklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fRU5USVRZX0xJU1RFTkVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19QUkVfUEVSU0lTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19QT1NUX1BFUlNJU1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fUFJFX1JFTU9WRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19QT1NUX1JFTU9WRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19QUkVfVVBEQVRFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1BPU1RfVVBEQVRFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1BPU1RfTE9BRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0FTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCXhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FUVFJJQlVURV9NQVBQSU5HKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUUpOwogCi0JCXhtbEVtYmVkZGFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VNQkVEREFCTEUpOworCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzcywgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19OQU1FKTsKKworCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVIpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJFQ2xhc3MsIFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfX0FTU09DSUFUSU9OX09WRVJSSURFUyk7CisKKwkJeG1sQXR0cmlidXRlT3ZlcnJpZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FUVFJJQlVURV9PVkVSUklERSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQXR0cmlidXRlT3ZlcnJpZGVFQ2xhc3MsIFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0NPTFVNTik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQXR0cmlidXRlT3ZlcnJpZGVFQ2xhc3MsIFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX05BTUUpOworCisJCXhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lckVDbGFzcywgWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfX0FUVFJJQlVURV9PVkVSUklERVMpOwogCiAJCWF0dHJpYnV0ZXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVRUUklCVVRFUyk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UoYXR0cmlidXRlc0VDbGFzcywgQVRUUklCVVRFU19fSURTKTsKQEAgLTEwNTY4LDk4ICs5NDY4LDkgQEAKIAkJY3JlYXRlRVJlZmVyZW5jZShhdHRyaWJ1dGVzRUNsYXNzLCBBVFRSSUJVVEVTX19FTUJFRERFRFMpOwogCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX1RSQU5TSUVOVFMpOwogCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FUVFJJQlVURV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUUpOwotCi0JCWFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkcpOwotCi0JCXhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9OVUxMX0FUVFJJQlVURV9NQVBQSU5HKTsKLQotCQljb2x1bW5NYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTFVNTl9NQVBQSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb2x1bW5NYXBwaW5nRUNsYXNzLCBDT0xVTU5fTUFQUElOR19fQ09MVU1OKTsKLQotCQl4bWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9SRUxBVElPTlNISVBfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcywgWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLCBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLCBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERSk7Ci0KLQkJeG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFBFRF9CWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWSk7Ci0KLQkJeG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLCBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUFRJT05BTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcywgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9DT0xVTU5TKTsKLQotCQl4bWxJZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbElkRUNsYXNzLCBYTUxfSURfX0dFTkVSQVRFRF9WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sSWRFQ2xhc3MsIFhNTF9JRF9fVEVNUE9SQUwpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbElkRUNsYXNzLCBYTUxfSURfX1RBQkxFX0dFTkVSQVRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sSWRFQ2xhc3MsIFhNTF9JRF9fU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQotCQl4bWxJZEltcGxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0lEX0lNUEwpOwotCi0JCWJhc2VYbWxFbWJlZGRlZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCQVNFX1hNTF9FTUJFRERFRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYmFzZVhtbEVtYmVkZGVkRUNsYXNzLCBCQVNFX1hNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUyk7Ci0KLQkJeG1sRW1iZWRkZWRJZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU1CRURERURfSUQpOwotCi0JCXhtbEVtYmVkZGVkSWRJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERFRF9JRF9JTVBMKTsKLQotCQl4bWxFbWJlZGRlZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU1CRURERUQpOwotCi0JCXhtbEVtYmVkZGVkSW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU1CRURERURfSU1QTCk7Ci0KIAkJeG1sQmFzaWNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0JBU0lDKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxCYXNpY0VDbGFzcywgWE1MX0JBU0lDX19GRVRDSCk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzaWNFQ2xhc3MsIFhNTF9CQVNJQ19fT1BUSU9OQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEJhc2ljRUNsYXNzLCBYTUxfQkFTSUNfX0xPQik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzaWNFQ2xhc3MsIFhNTF9CQVNJQ19fVEVNUE9SQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEJhc2ljRUNsYXNzLCBYTUxfQkFTSUNfX0VOVU1FUkFURUQpOwotCi0JCXhtbEJhc2ljSW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTSUNfSU1QTCk7Ci0KLQkJeG1sVmVyc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVkVSU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVmVyc2lvbkVDbGFzcywgWE1MX1ZFUlNJT05fX1RFTVBPUkFMKTsKLQotCQl4bWxWZXJzaW9uSW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVkVSU0lPTl9JTVBMKTsKLQotCQl4bWxNYW55VG9PbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BTllfVE9fT05FKTsKLQotCQl4bWxNYW55VG9PbmVJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX09ORV9JTVBMKTsKLQotCQl4bWxPbmVUb01hbnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09ORV9UT19NQU5ZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxPbmVUb01hbnlFQ2xhc3MsIFhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TKTsKLQotCQl4bWxPbmVUb01hbnlJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PTkVfVE9fTUFOWV9JTVBMKTsKLQotCQl4bWxPbmVUb09uZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX09ORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sT25lVG9PbmVFQ2xhc3MsIFhNTF9PTkVfVE9fT05FX19NQVBQRURfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE9uZVRvT25lRUNsYXNzLCBYTUxfT05FX1RPX09ORV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKLQotCQl4bWxPbmVUb09uZUltcGxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09ORV9UT19PTkVfSU1QTCk7Ci0KLQkJeG1sTWFueVRvTWFueUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFOWV9UT19NQU5ZKTsKLQotCQl4bWxNYW55VG9NYW55SW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFOWV9UT19NQU5ZX0lNUEwpOwotCi0JCXhtbFRyYW5zaWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVFJBTlNJRU5UKTsKLQotCQl4bWxUcmFuc2llbnRJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UUkFOU0lFTlRfSU1QTCk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGVFQ2xhc3MsIFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9DT0xVTU5TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBc3NvY2lhdGlvbk92ZXJyaWRlRUNsYXNzLCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX05BTUUpOwotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMKTsKLQotCQl4bWxBdHRyaWJ1dGVPdmVycmlkZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVRUUklCVVRFX09WRVJSSURFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxBdHRyaWJ1dGVPdmVycmlkZUVDbGFzcywgWE1MX0FUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBdHRyaWJ1dGVPdmVycmlkZUVDbGFzcywgWE1MX0FUVFJJQlVURV9PVkVSUklERV9fTkFNRSk7Ci0KLQkJeG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTCk7CiAKIAkJY2FzY2FkZVR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0FTQ0FERV9UWVBFKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShjYXNjYWRlVHlwZUVDbGFzcywgQ0FTQ0FERV9UWVBFX19DQVNDQURFX0FMTCk7CkBAIC0xMDY2OCw0OSArOTQ3OSw2OCBAQAogCQljcmVhdGVFQXR0cmlidXRlKGNhc2NhZGVUeXBlRUNsYXNzLCBDQVNDQURFX1RZUEVfX0NBU0NBREVfUkVNT1ZFKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShjYXNjYWRlVHlwZUVDbGFzcywgQ0FTQ0FERV9UWVBFX19DQVNDQURFX1JFRlJFU0gpOwogCi0JCWNhc2NhZGVUeXBlSW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDQVNDQURFX1RZUEVfSU1QTCk7Ci0KLQkJeG1sTmFtZWRDb2x1bW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX05BTUVEX0NPTFVNTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWRDb2x1bW5FQ2xhc3MsIFhNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxOYW1lZENvbHVtbkVDbGFzcywgWE1MX05BTUVEX0NPTFVNTl9fTkFNRSk7Ci0KLQkJYWJzdHJhY3RYbWxOYW1lZENvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OKTsKLQotCQl4bWxBYnN0cmFjdENvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQUJTVFJBQ1RfQ09MVU1OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBYnN0cmFjdENvbHVtbkVDbGFzcywgWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQWJzdHJhY3RDb2x1bW5FQ2xhc3MsIFhNTF9BQlNUUkFDVF9DT0xVTU5fX05VTExBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBYnN0cmFjdENvbHVtbkVDbGFzcywgWE1MX0FCU1RSQUNUX0NPTFVNTl9fVEFCTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEFic3RyYWN0Q29sdW1uRUNsYXNzLCBYTUxfQUJTVFJBQ1RfQ09MVU1OX19VTklRVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEFic3RyYWN0Q29sdW1uRUNsYXNzLCBYTUxfQUJTVFJBQ1RfQ09MVU1OX19VUERBVEFCTEUpOwotCi0JCWFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTik7CisJCXhtbENvbGxlY3Rpb25UYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09MTEVDVElPTl9UQUJMRSk7CiAKIAkJeG1sQ29sdW1uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT0xVTU4pOwogCQljcmVhdGVFQXR0cmlidXRlKHhtbENvbHVtbkVDbGFzcywgWE1MX0NPTFVNTl9fTEVOR1RIKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb2x1bW5FQ2xhc3MsIFhNTF9DT0xVTU5fX1BSRUNJU0lPTik7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ29sdW1uRUNsYXNzLCBYTUxfQ09MVU1OX19TQ0FMRSk7CiAKLQkJeG1sQ29sdW1uSW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09MVU1OX0lNUEwpOworCQljb2x1bW5NYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTFVNTl9NQVBQSU5HKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShjb2x1bW5NYXBwaW5nRUNsYXNzLCBDT0xVTU5fTUFQUElOR19fQ09MVU1OKTsKIAogCQljb2x1bW5SZXN1bHRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09MVU1OX1JFU1VMVCk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoY29sdW1uUmVzdWx0RUNsYXNzLCBDT0xVTU5fUkVTVUxUX19OQU1FKTsKIAorCQl4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NPTlZFUlRJQkxFX01BUFBJTkcpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcywgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0xPQik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzLCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUwpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcywgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0VOVU1FUkFURUQpOworCiAJCXhtbERpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzLCBYTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0RJU0NSSU1JTkFUT1JfVFlQRSk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRGlzY3JpbWluYXRvckNvbHVtbkVDbGFzcywgWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEgpOwogCi0JCWVudGl0eUxpc3RlbmVyc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTlRJVFlfTElTVEVORVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlMaXN0ZW5lcnNFQ2xhc3MsIEVOVElUWV9MSVNURU5FUlNfX0VOVElUWV9MSVNURU5FUlMpOworCQl4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRUxFTUVOVF9DT0xMRUNUSU9OKTsKKworCQl4bWxFbWJlZGRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERBQkxFKTsKKworCQl4bWxFbWJlZGRlZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU1CRURERUQpOworCisJCXhtbEVtYmVkZGVkSWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VNQkVEREVEX0lEKTsKKworCQl4bWxFbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VOVElUWSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19OQU1FKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1RBQkxFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1NFQ09OREFSWV9UQUJMRVMpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0lEX0NMQVNTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUUpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU4pOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1MpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlMpOwogCiAJCWVudGl0eUxpc3RlbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVOVElUWV9MSVNURU5FUik7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoZW50aXR5TGlzdGVuZXJFQ2xhc3MsIEVOVElUWV9MSVNURU5FUl9fQ0xBU1NfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5TGlzdGVuZXJFQ2xhc3MsIEVOVElUWV9MSVNURU5FUl9fUFJFX1BFUlNJU1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUxpc3RlbmVyRUNsYXNzLCBFTlRJVFlfTElTVEVORVJfX1BPU1RfUEVSU0lTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5TGlzdGVuZXJFQ2xhc3MsIEVOVElUWV9MSVNURU5FUl9fUFJFX1JFTU9WRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5TGlzdGVuZXJFQ2xhc3MsIEVOVElUWV9MSVNURU5FUl9fUE9TVF9SRU1PVkUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUxpc3RlbmVyRUNsYXNzLCBFTlRJVFlfTElTVEVORVJfX1BSRV9VUERBVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUxpc3RlbmVyRUNsYXNzLCBFTlRJVFlfTElTVEVORVJfX1BPU1RfVVBEQVRFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlMaXN0ZW5lckVDbGFzcywgRU5USVRZX0xJU1RFTkVSX19QT1NUX0xPQUQpOworCisJCWVudGl0eUxpc3RlbmVyc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTlRJVFlfTElTVEVORVJTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlMaXN0ZW5lcnNFQ2xhc3MsIEVOVElUWV9MSVNURU5FUlNfX0VOVElUWV9MSVNURU5FUlMpOworCisJCXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTlRJVFlfTUFQUElOR1MpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19ERVNDUklQVElPTik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fU0NIRU1BKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fQ0FUQUxPRyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfX1NFUVVFTkNFX0dFTkVSQVRPUlMpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1MpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19NQVBQRURfU1VQRVJDTEFTU0VTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fRU5USVRJRVMpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19FTUJFRERBQkxFUyk7CiAKIAkJZW50aXR5UmVzdWx0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVOVElUWV9SRVNVTFQpOwogCQljcmVhdGVFQXR0cmlidXRlKGVudGl0eVJlc3VsdEVDbGFzcywgRU5USVRZX1JFU1VMVF9fRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwpAQCAtMTA3MjAsNiArOTU1MCwxNSBAQAogCQlldmVudE1ldGhvZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFVkVOVF9NRVRIT0QpOwogCQljcmVhdGVFQXR0cmlidXRlKGV2ZW50TWV0aG9kRUNsYXNzLCBFVkVOVF9NRVRIT0RfX01FVEhPRF9OQU1FKTsKIAorCQl4bWxFdmVudE1ldGhvZENvbnRhaW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRXZlbnRNZXRob2RDb250YWluZXJFQ2xhc3MsIFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QUkVfUEVSU0lTVCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRXZlbnRNZXRob2RDb250YWluZXJFQ2xhc3MsIFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QT1NUX1BFUlNJU1QpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEV2ZW50TWV0aG9kQ29udGFpbmVyRUNsYXNzLCBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUFJFX1JFTU9WRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRXZlbnRNZXRob2RDb250YWluZXJFQ2xhc3MsIFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QT1NUX1JFTU9WRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRXZlbnRNZXRob2RDb250YWluZXJFQ2xhc3MsIFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QUkVfVVBEQVRFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFdmVudE1ldGhvZENvbnRhaW5lckVDbGFzcywgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfVVBEQVRFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFdmVudE1ldGhvZENvbnRhaW5lckVDbGFzcywgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfTE9BRCk7CisKIAkJZmllbGRSZXN1bHRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRklFTERfUkVTVUxUKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShmaWVsZFJlc3VsdEVDbGFzcywgRklFTERfUkVTVUxUX19OQU1FKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShmaWVsZFJlc3VsdEVDbGFzcywgRklFTERfUkVTVUxUX19DT0xVTU4pOwpAQCAtMTA3MjgsNyArOTU2NywxNyBAQAogCQljcmVhdGVFQXR0cmlidXRlKHhtbEdlbmVyYXRlZFZhbHVlRUNsYXNzLCBYTUxfR0VORVJBVEVEX1ZBTFVFX19HRU5FUkFUT1IpOwogCQljcmVhdGVFQXR0cmlidXRlKHhtbEdlbmVyYXRlZFZhbHVlRUNsYXNzLCBYTUxfR0VORVJBVEVEX1ZBTFVFX19TVFJBVEVHWSk7CiAKLQkJeG1sR2VuZXJhdGVkVmFsdWVJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9HRU5FUkFURURfVkFMVUVfSU1QTCk7CisJCXhtbEdlbmVyYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfR0VORVJBVE9SKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxHZW5lcmF0b3JFQ2xhc3MsIFhNTF9HRU5FUkFUT1JfX05BTUUpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbEdlbmVyYXRvckVDbGFzcywgWE1MX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sR2VuZXJhdG9yRUNsYXNzLCBYTUxfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkUpOworCisJCXhtbEdlbmVyYXRvckNvbnRhaW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfR0VORVJBVE9SX0NPTlRBSU5FUik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sR2VuZXJhdG9yQ29udGFpbmVyRUNsYXNzLCBYTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fU0VRVUVOQ0VfR0VORVJBVE9SKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxHZW5lcmF0b3JDb250YWluZXJFQ2xhc3MsIFhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19UQUJMRV9HRU5FUkFUT1IpOworCisJCXhtbElkRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9JRCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sSWRFQ2xhc3MsIFhNTF9JRF9fR0VORVJBVEVEX1ZBTFVFKTsKIAogCQl4bWxJZENsYXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9JRF9DTEFTUyk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sSWRDbGFzc0VDbGFzcywgWE1MX0lEX0NMQVNTX19DTEFTU19OQU1FKTsKQEAgLTEwNzM5LDI1ICs5NTg4LDM1IEBACiAJCXhtbEpvaW5Db2x1bW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0pPSU5fQ09MVU1OKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxKb2luQ29sdW1uRUNsYXNzLCBYTUxfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOwogCi0JCXhtbEpvaW5Db2x1bW5JbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KT0lOX0NPTFVNTl9JTVBMKTsKKwkJeG1sSm9pbkNvbHVtbnNNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KT0lOX0NPTFVNTlNfTUFQUElORyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sSm9pbkNvbHVtbnNNYXBwaW5nRUNsYXNzLCBYTUxfSk9JTl9DT0xVTU5TX01BUFBJTkdfX0pPSU5fQ09MVU1OUyk7CiAKIAkJeG1sSm9pblRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KT0lOX1RBQkxFKTsKIAkJY3JlYXRlRVJlZmVyZW5jZSh4bWxKb2luVGFibGVFQ2xhc3MsIFhNTF9KT0lOX1RBQkxFX19KT0lOX0NPTFVNTlMpOwogCQljcmVhdGVFUmVmZXJlbmNlKHhtbEpvaW5UYWJsZUVDbGFzcywgWE1MX0pPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TKTsKIAotCQl4bWxKb2luVGFibGVJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KT0lOX1RBQkxFX0lNUEwpOworCQl4bWxKb2luVGFibGVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KT0lOX1RBQkxFX01BUFBJTkcpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEpvaW5UYWJsZU1hcHBpbmdFQ2xhc3MsIFhNTF9KT0lOX1RBQkxFX01BUFBJTkdfX0pPSU5fVEFCTEUpOwogCiAJCWxvYkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT0IpOwogCisJCXhtbE1hbnlUb01hbnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BTllfVE9fTUFOWSk7CisKKwkJeG1sTWFueVRvT25lRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX09ORSk7CisKIAkJbWFwS2V5RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1BUF9LRVkpOwogCQljcmVhdGVFQXR0cmlidXRlKG1hcEtleUVDbGFzcywgTUFQX0tFWV9fTkFNRSk7CiAKLQkJbWFwS2V5SW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNQVBfS0VZX0lNUEwpOworCQl4bWxNYXBLZXlDbGFzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQX0tFWV9DTEFTUyk7CiAKLQkJeG1sUXVlcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1FVRVJZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeUVDbGFzcywgWE1MX1FVRVJZX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeUVDbGFzcywgWE1MX1FVRVJZX19RVUVSWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUXVlcnlFQ2xhc3MsIFhNTF9RVUVSWV9fSElOVFMpOworCQl4bWxNYXBwZWRCeU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BUFBFRF9CWV9NQVBQSU5HKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNYXBwZWRCeU1hcHBpbmdFQ2xhc3MsIFhNTF9NQVBQRURfQllfTUFQUElOR19fTUFQUEVEX0JZKTsKKworCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQVBQRURfU1VQRVJDTEFTUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JRF9DTEFTUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUyk7CiAKIAkJeG1sTmFtZWROYXRpdmVRdWVyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTkFNRURfTkFUSVZFX1FVRVJZKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxOYW1lZE5hdGl2ZVF1ZXJ5RUNsYXNzLCBYTUxfTkFNRURfTkFUSVZFX1FVRVJZX19SRVNVTFRfQ0xBU1MpOwpAQCAtMTA3NjUsNiArOTYyNCwyNSBAQAogCiAJCXhtbE5hbWVkUXVlcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX05BTUVEX1FVRVJZKTsKIAorCQl4bWxOdWxsQXR0cmlidXRlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTlVMTF9BVFRSSUJVVEVfTUFQUElORyk7CisKKwkJeG1sT25lVG9NYW55RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PTkVfVE9fTUFOWSk7CisKKwkJeG1sT25lVG9PbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09ORV9UT19PTkUpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbE9uZVRvT25lRUNsYXNzLCBYTUxfT05FX1RPX09ORV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKKworCQl4bWxPcmRlckNvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT1JERVJfQ09MVU1OKTsKKworCQl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19TQ0hFTUEpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FUQUxPRyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVNDQURFX1BFUlNJU1QpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fRU5USVRZX0xJU1RFTkVSUyk7CisKKwkJeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEUpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyk7CisKIAkJcG9zdExvYWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUE9TVF9MT0FEKTsKIAogCQlwb3N0UGVyc2lzdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1NUX1BFUlNJU1QpOwpAQCAtMTA3ODIsNDIgKzk2NjAsMzIgQEAKIAkJeG1sUHJpbWFyeUtleUpvaW5Db2x1bW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkVDbGFzcywgWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKIAotCQl4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX0lNUEwpOworCQl4bWxRdWVyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUVVFUlkpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbFF1ZXJ5RUNsYXNzLCBYTUxfUVVFUllfX05BTUUpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbFF1ZXJ5RUNsYXNzLCBYTUxfUVVFUllfX1FVRVJZKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxRdWVyeUVDbGFzcywgWE1MX1FVRVJZX19ISU5UUyk7CisKKwkJeG1sUXVlcnlDb250YWluZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1FVRVJZX0NPTlRBSU5FUik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUXVlcnlDb250YWluZXJFQ2xhc3MsIFhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX1FVRVJJRVMpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbFF1ZXJ5Q29udGFpbmVyRUNsYXNzLCBYTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9OQVRJVkVfUVVFUklFUyk7CiAKIAkJeG1sUXVlcnlIaW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9RVUVSWV9ISU5UKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeUhpbnRFQ2xhc3MsIFhNTF9RVUVSWV9ISU5UX19OQU1FKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeUhpbnRFQ2xhc3MsIFhNTF9RVUVSWV9ISU5UX19WQUxVRSk7CiAKLQkJYWJzdHJhY3RYbWxCYXNlVGFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfWE1MX0JBU0VfVEFCTEUpOwotCi0JCXhtbEJhc2VUYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTRV9UQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzZVRhYmxlRUNsYXNzLCBYTUxfQkFTRV9UQUJMRV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzZVRhYmxlRUNsYXNzLCBYTUxfQkFTRV9UQUJMRV9fQ0FUQUxPRyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzZVRhYmxlRUNsYXNzLCBYTUxfQkFTRV9UQUJMRV9fU0NIRU1BKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxCYXNlVGFibGVFQ2xhc3MsIFhNTF9CQVNFX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMpOwotCi0JCXhtbFRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UQUJMRSk7Ci0KIAkJeG1sU2Vjb25kYXJ5VGFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1NFQ09OREFSWV9UQUJMRSk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sU2Vjb25kYXJ5VGFibGVFQ2xhc3MsIFhNTF9TRUNPTkRBUllfVEFCTEVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7CiAKLQkJeG1sU2Vjb25kYXJ5VGFibGVJbXBsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTCk7Ci0KLQkJeG1sR2VuZXJhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9HRU5FUkFUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEdlbmVyYXRvckVDbGFzcywgWE1MX0dFTkVSQVRPUl9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sR2VuZXJhdG9yRUNsYXNzLCBYTUxfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxHZW5lcmF0b3JFQ2xhc3MsIFhNTF9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRSk7Ci0KIAkJeG1sU2VxdWVuY2VHZW5lcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1NFUVVFTkNFX0dFTkVSQVRPUik7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sU2VxdWVuY2VHZW5lcmF0b3JFQ2xhc3MsIFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX1NFUVVFTkNFX05BTUUpOwogCi0JCXhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUEwpOwotCiAJCXNxbFJlc3VsdFNldE1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1FMX1JFU1VMVF9TRVRfTUFQUElORyk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoc3FsUmVzdWx0U2V0TWFwcGluZ0VDbGFzcywgU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fTkFNRSk7CiAJCWNyZWF0ZUVSZWZlcmVuY2Uoc3FsUmVzdWx0U2V0TWFwcGluZ0VDbGFzcywgU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fRU5USVRZX1JFU1VMVFMpOwogCQljcmVhdGVFUmVmZXJlbmNlKHNxbFJlc3VsdFNldE1hcHBpbmdFQ2xhc3MsIFNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0NPTFVNTl9SRVNVTFRTKTsKIAorCQl4bWxUYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVEFCTEUpOworCiAJCXhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UQUJMRV9HRU5FUkFUT1IpOwogCQljcmVhdGVFQXR0cmlidXRlKHhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLCBYTUxfVEFCTEVfR0VORVJBVE9SX19UQUJMRSk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MsIFhNTF9UQUJMRV9HRU5FUkFUT1JfX0NBVEFMT0cpOwpAQCAtMTA4MjcsMTIgKzk2OTUsMTggQEAKIAkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUYWJsZUdlbmVyYXRvckVDbGFzcywgWE1MX1RBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX1ZBTFVFKTsKIAkJY3JlYXRlRVJlZmVyZW5jZSh4bWxUYWJsZUdlbmVyYXRvckVDbGFzcywgWE1MX1RBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTKTsKIAotCQl4bWxUYWJsZUdlbmVyYXRvckltcGxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMKTsKKwkJeG1sVHJhbnNpZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UUkFOU0lFTlQpOworCisJCXhtbFR5cGVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UWVBFX01BUFBJTkcpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbFR5cGVNYXBwaW5nRUNsYXNzLCBYTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUeXBlTWFwcGluZ0VDbGFzcywgWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEUpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbFR5cGVNYXBwaW5nRUNsYXNzLCBYTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sVHlwZU1hcHBpbmdFQ2xhc3MsIFhNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVMpOwogCiAJCXhtbFVuaXF1ZUNvbnN0cmFpbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1VOSVFVRV9DT05TVFJBSU5UKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxVbmlxdWVDb25zdHJhaW50RUNsYXNzLCBYTUxfVU5JUVVFX0NPTlNUUkFJTlRfX0NPTFVNTl9OQU1FUyk7CiAKLQkJeG1sVW5pcXVlQ29uc3RyYWludEltcGxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1VOSVFVRV9DT05TVFJBSU5UX0lNUEwpOworCQl4bWxWZXJzaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9WRVJTSU9OKTsKIAogCQkvLyBDcmVhdGUgZW51bXMKIAkJYWNjZXNzVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oQUNDRVNTX1RZUEUpOwpAQCAtMTA4NDcsNyArOTcyMSw2IEBACiAJCWRpc2NyaW1pbmF0b3JWYWx1ZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShESVNDUklNSU5BVE9SX1ZBTFVFKTsKIAkJZW51bWVyYXRlZEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShFTlVNRVJBVEVEKTsKIAkJb3JkZXJCeUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShPUkRFUl9CWSk7Ci0JCXZlcnNpb25UeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFZFUlNJT05fVFlQRSk7CiAJfQogCiAJLyoqCkBAIC0xMDg3NSw3NyArOTc0OCw4OSBAQAogCQlzZXROc1VSSShlTlNfVVJJKTsKIAogCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCU9ybVYyXzBQYWNrYWdlIHRoZU9ybVYyXzBQYWNrYWdlID0gKE9ybVYyXzBQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVYyXzBQYWNrYWdlLmVOU19VUkkpOwogCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKKwkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBBZGQgc3VicGFja2FnZXMKKwkJZ2V0RVN1YnBhY2thZ2VzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlKTsKIAogCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCiAKIAkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCiAKIAkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZygpKTsKLQkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZygpKTsKLQkJeG1sRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmcoKSk7CiAJCWFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7Ci0JCXhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCkpOwotCQl4bWxJZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29sdW1uTWFwcGluZygpKTsKLQkJeG1sSWRJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxJZEltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxJZCgpKTsKLQkJYmFzZVhtbEVtYmVkZGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sRW1iZWRkZWRJZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbEVtYmVkZGVkSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCYXNlWG1sRW1iZWRkZWQoKSk7Ci0JCXhtbEVtYmVkZGVkSWRJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxFbWJlZGRlZElkSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEVtYmVkZGVkSWQoKSk7Ci0JCXhtbEVtYmVkZGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QmFzZVhtbEVtYmVkZGVkKCkpOwotCQl4bWxFbWJlZGRlZEltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbEVtYmVkZGVkSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEVtYmVkZGVkKCkpOwotCQl4bWxCYXNpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7CisJCWFic3RyYWN0WG1sQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbigpKTsKKwkJYWJzdHJhY3RYbWxFbWJlZGRlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKKwkJYWJzdHJhY3RYbWxFbWJlZGRlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkpOworCQlhYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZygpKTsKKwkJYWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxNYXBwZWRCeU1hcHBpbmcoKSk7CisJCWFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sSm9pblRhYmxlTWFwcGluZygpKTsKKwkJYWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOworCQlhYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7CisJCWFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEpvaW5UYWJsZU1hcHBpbmcoKSk7CisJCWFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEpvaW5Db2x1bW5zTWFwcGluZygpKTsKKwkJYWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wKCkpOworCQlhYnN0cmFjdFhtbFR5cGVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sVHlwZU1hcHBpbmcoKSk7CisJCXhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZ18yXzAoKSk7CisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxKb2luQ29sdW1uc01hcHBpbmcoKSk7CisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAoKSk7CisJCXhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMCgpKTsKKwkJYXR0cmlidXRlc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxBdHRyaWJ1dGVzXzJfMCgpKTsKKwkJeG1sQmFzaWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7CiAJCXhtbEJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29sdW1uTWFwcGluZygpKTsKLQkJeG1sQmFzaWNJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxCYXNpY0ltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxCYXNpYygpKTsKLQkJeG1sVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbFZlcnNpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb2x1bW5NYXBwaW5nKCkpOwotCQl4bWxWZXJzaW9uSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sVmVyc2lvbkltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxWZXJzaW9uKCkpOwotCQl4bWxNYW55VG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKCkpOwotCQl4bWxNYW55VG9PbmVJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxNYW55VG9PbmVJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTWFueVRvT25lKCkpOwotCQl4bWxPbmVUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7Ci0JCXhtbE9uZVRvTWFueUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbE9uZVRvTWFueUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxPbmVUb01hbnkoKSk7Ci0JCXhtbE9uZVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpKTsKLQkJeG1sT25lVG9PbmVJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxPbmVUb09uZUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxPbmVUb09uZSgpKTsKLQkJeG1sTWFueVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpKTsKLQkJeG1sTWFueVRvTWFueUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbE1hbnlUb01hbnlJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTWFueVRvTWFueSgpKTsKLQkJeG1sVHJhbnNpZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sVHJhbnNpZW50SW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sVHJhbnNpZW50SW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFRyYW5zaWVudCgpKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQl4bWxBdHRyaWJ1dGVPdmVycmlkZUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJY2FzY2FkZVR5cGVJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q2FzY2FkZVR5cGUoKSk7Ci0JCWFic3RyYWN0WG1sTmFtZWRDb2x1bW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxOYW1lZENvbHVtbigpKTsKLQkJeG1sQWJzdHJhY3RDb2x1bW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxOYW1lZENvbHVtbigpKTsKLQkJYWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sTmFtZWRDb2x1bW4oKSk7Ci0JCWFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBYnN0cmFjdENvbHVtbigpKTsKLQkJeG1sQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQWJzdHJhY3RDb2x1bW4oKSk7Ci0JCXhtbENvbHVtbkltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uKCkpOwotCQl4bWxDb2x1bW5JbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29sdW1uKCkpOworCQl4bWxCYXNpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpKTsKKwkJeG1sQ29sbGVjdGlvblRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxUYWJsZSgpKTsKKwkJeG1sQ29sbGVjdGlvblRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbENvbGxlY3Rpb25UYWJsZV8yXzAoKSk7CisJCXhtbENvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQ29sdW1uKCkpOwogCQl4bWxEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbigpKTsKLQkJeG1sR2VuZXJhdGVkVmFsdWVJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sR2VuZXJhdGVkVmFsdWUoKSk7Ci0JCXhtbEpvaW5Db2x1bW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBYnN0cmFjdENvbHVtbigpKTsKLQkJeG1sSm9pbkNvbHVtbkltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uKCkpOwotCQl4bWxKb2luQ29sdW1uSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEpvaW5Db2x1bW4oKSk7Ci0JCXhtbEpvaW5UYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEJhc2VUYWJsZSgpKTsKLQkJeG1sSm9pblRhYmxlSW1wbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQmFzZVRhYmxlKCkpOwotCQl4bWxKb2luVGFibGVJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sSm9pblRhYmxlKCkpOwotCQltYXBLZXlJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWFwS2V5KCkpOworCQl4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKKwkJeG1sRWxlbWVudENvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkpOworCQl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZygpKTsKKwkJeG1sRW1iZWRkZWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEVtYmVkZGVkKCkpOworCQl4bWxFbWJlZGRlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxFbWJlZGRlZF8yXzAoKSk7CisJCXhtbEVtYmVkZGVkSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEVtYmVkZGVkKCkpOworCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkpOworCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxRdWVyeUNvbnRhaW5lcigpKTsKKwkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyKCkpOworCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcigpKTsKKwkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKSk7CisJCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKSk7CisJCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxFbnRpdHlfMl8wKCkpOworCQllbnRpdHlMaXN0ZW5lckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyKCkpOworCQllbnRpdHlMaXN0ZW5lckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxFbnRpdHlMaXN0ZW5lcl8yXzAoKSk7CisJCXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0QWJzdHJhY3RKcGFSb290RU9iamVjdCgpKTsKKwkJeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxRdWVyeUNvbnRhaW5lcigpKTsKKwkJeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBY2Nlc3NIb2xkZXIoKSk7CisJCWV2ZW50TWV0aG9kRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbEV2ZW50TWV0aG9kXzJfMCgpKTsKKwkJeG1sR2VuZXJhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbEdlbmVyYXRvcl8yXzAoKSk7CisJCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOworCQl4bWxJZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbHVtbk1hcHBpbmcoKSk7CisJCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkpOworCQl4bWxJZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEdlbmVyYXRvckNvbnRhaW5lcigpKTsKKwkJeG1sSm9pbkNvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQ29sdW1uKCkpOworCQl4bWxKb2luVGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbFRhYmxlKCkpOworCQl4bWxNYW55VG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7CisJCXhtbE1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sTWFueVRvTWFueV8yXzAoKSk7CisJCXhtbE1hbnlUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpKTsKKwkJeG1sTWFwS2V5Q2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sTWFwS2V5Q2xhc3NfMl8wKCkpOworCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZygpKTsKIAkJeG1sTmFtZWROYXRpdmVRdWVyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFF1ZXJ5KCkpOwogCQl4bWxOYW1lZFF1ZXJ5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUXVlcnkoKSk7CisJCXhtbE5hbWVkUXVlcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sTmFtZWRRdWVyeV8yXzAoKSk7CisJCXhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOworCQl4bWxPbmVUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpKTsKKwkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sSm9pbkNvbHVtbnNNYXBwaW5nKCkpOworCQl4bWxPbmVUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sT25lVG9NYW55XzJfMCgpKTsKKwkJeG1sT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7CisJCXhtbE9uZVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTWFwcGVkQnlNYXBwaW5nKCkpOworCQl4bWxPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxPbmVUb09uZV8yXzAoKSk7CisJCXhtbE9yZGVyQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbigpKTsKKwkJeG1sT3JkZXJDb2x1bW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkpOworCQl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEFjY2Vzc0hvbGRlcigpKTsKKwkJeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wKCkpOworCQl4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAoKSk7CiAJCXBvc3RMb2FkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXZlbnRNZXRob2QoKSk7CiAJCXBvc3RQZXJzaXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXZlbnRNZXRob2QoKSk7CiAJCXBvc3RSZW1vdmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFdmVudE1ldGhvZCgpKTsKQEAgLTEwOTUzLDk3ICs5ODM4LDc2IEBACiAJCXByZVBlcnNpc3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFdmVudE1ldGhvZCgpKTsKIAkJcHJlUmVtb3ZlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXZlbnRNZXRob2QoKSk7CiAJCXByZVVwZGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV2ZW50TWV0aG9kKCkpOwotCQl4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE5hbWVkQ29sdW1uKCkpOwotCQl4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbE5hbWVkQ29sdW1uKCkpOwotCQl4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYWJzdHJhY3RYbWxCYXNlVGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxCYXNlVGFibGUoKSk7Ci0JCXhtbFRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxCYXNlVGFibGUoKSk7Ci0JCXhtbFNlY29uZGFyeVRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQmFzZVRhYmxlKCkpOwotCQl4bWxTZWNvbmRhcnlUYWJsZUltcGxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEJhc2VUYWJsZSgpKTsKLQkJeG1sU2Vjb25kYXJ5VGFibGVJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sU2Vjb25kYXJ5VGFibGUoKSk7CisJCXhtbFByaW1hcnlLZXlKb2luQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbigpKTsKKwkJeG1sUXVlcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sUXVlcnlfMl8wKCkpOworCQl4bWxRdWVyeUhpbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sUXVlcnlIaW50XzJfMCgpKTsKKwkJeG1sU2Vjb25kYXJ5VGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbFRhYmxlKCkpOwogCQl4bWxTZXF1ZW5jZUdlbmVyYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEdlbmVyYXRvcigpKTsKLQkJeG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3IoKSk7CisJCXhtbFNlcXVlbmNlR2VuZXJhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCgpKTsKKwkJc3FsUmVzdWx0U2V0TWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMCgpKTsKKwkJeG1sVGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbFRhYmxlKCkpOwogCQl4bWxUYWJsZUdlbmVyYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEdlbmVyYXRvcigpKTsKLQkJeG1sVGFibGVHZW5lcmF0b3JJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sVGFibGVHZW5lcmF0b3IoKSk7Ci0JCXhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sVW5pcXVlQ29uc3RyYWludCgpKTsKKwkJeG1sVHJhbnNpZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOworCQl4bWxUeXBlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEFjY2Vzc0hvbGRlcigpKTsKKwkJeG1sVW5pcXVlQ29uc3RyYWludEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxVbmlxdWVDb25zdHJhaW50XzJfMCgpKTsKKwkJeG1sVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKKwkJeG1sVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbHVtbk1hcHBpbmcoKSk7CisJCXhtbFZlcnNpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7CiAKIAkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICJYbWxFbnRpdHlNYXBwaW5ncyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5TWFwcGluZ3NfVmVyc2lvbigpLCB0aGlzLmdldFZlcnNpb25UeXBlKCksICJ2ZXJzaW9uIiwgIjEuMCIsIDEsIDEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVudGl0eU1hcHBpbmdzX0Rlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSwgdGhpcy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGFja2FnZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBhY2thZ2UiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5TWFwcGluZ3NfU2NoZW1hKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2NoZW1hIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVudGl0eU1hcHBpbmdzX0NhdGFsb2coKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjYXRhbG9nIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVudGl0eU1hcHBpbmdzX0FjY2VzcygpLCB0aGlzLmdldEFjY2Vzc1R5cGUoKSwgImFjY2VzcyIsICJQUk9QRVJUWSIsIDAsIDEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc19TZXF1ZW5jZUdlbmVyYXRvcnMoKSwgdGhpcy5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcigpLCBudWxsLCAic2VxdWVuY2VHZW5lcmF0b3JzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc19UYWJsZUdlbmVyYXRvcnMoKSwgdGhpcy5nZXRYbWxUYWJsZUdlbmVyYXRvcigpLCBudWxsLCAidGFibGVHZW5lcmF0b3JzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc19OYW1lZFF1ZXJpZXMoKSwgdGhpcy5nZXRYbWxOYW1lZFF1ZXJ5KCksIG51bGwsICJuYW1lZFF1ZXJpZXMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzX05hbWVkTmF0aXZlUXVlcmllcygpLCB0aGlzLmdldFhtbE5hbWVkTmF0aXZlUXVlcnkoKSwgbnVsbCwgIm5hbWVkTmF0aXZlUXVlcmllcyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfU3FsUmVzdWx0U2V0TWFwcGluZ3MoKSwgdGhpcy5nZXRTcWxSZXN1bHRTZXRNYXBwaW5nKCksIG51bGwsICJzcWxSZXN1bHRTZXRNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfTWFwcGVkU3VwZXJjbGFzc2VzKCksIHRoaXMuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpLCBudWxsLCAibWFwcGVkU3VwZXJjbGFzc2VzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc19FbnRpdGllcygpLCB0aGlzLmdldFhtbEVudGl0eSgpLCBudWxsLCAiZW50aXRpZXMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzX0VtYmVkZGFibGVzKCksIHRoaXMuZ2V0WG1sRW1iZWRkYWJsZSgpLCBudWxsLCAiZW1iZWRkYWJsZXMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3MoYWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MsICJBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmciLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAotCQlpbml0RUNsYXNzKHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5jbGFzcywgIlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9YbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJ4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLCB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCksIG51bGwsICJwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUNsYXNzKGFic3RyYWN0WG1sQ29sdW1uRUNsYXNzLCBBYnN0cmFjdFhtbENvbHVtbi5jbGFzcywgIkFic3RyYWN0WG1sQ29sdW1uIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sQ29sdW1uX0luc2VydGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiaW5zZXJ0YWJsZSIsIG51bGwsIDAsIDEsIEFic3RyYWN0WG1sQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRBYnN0cmFjdFhtbENvbHVtbl9OdWxsYWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJudWxsYWJsZSIsIG51bGwsIDAsIDEsIEFic3RyYWN0WG1sQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRBYnN0cmFjdFhtbENvbHVtbl9UYWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRhYmxlIiwgbnVsbCwgMCwgMSwgQWJzdHJhY3RYbWxDb2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sQ29sdW1uX1VuaXF1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJ1bmlxdWUiLCBudWxsLCAwLCAxLCBBYnN0cmFjdFhtbENvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWJzdHJhY3RYbWxDb2x1bW5fVXBkYXRhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgInVwZGF0YWJsZSIsIG51bGwsIDAsIDEsIEFic3RyYWN0WG1sQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCi0JCWluaXRFQ2xhc3MoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MsIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmNsYXNzLCAiWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX1NjaGVtYSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNjaGVtYSIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19DYXRhbG9nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2F0YWxvZyIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19BY2Nlc3MoKSwgdGhpcy5nZXRBY2Nlc3NUeXBlKCksICJhY2Nlc3MiLCAiUFJPUEVSVFkiLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQ2FzY2FkZVBlcnNpc3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiY2FzY2FkZVBlcnNpc3QiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfRW50aXR5TGlzdGVuZXJzKCksIHRoaXMuZ2V0RW50aXR5TGlzdGVuZXJzKCksIG51bGwsICJlbnRpdHlMaXN0ZW5lcnMiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVDbGFzcyhhYnN0cmFjdFhtbEVtYmVkZGVkRUNsYXNzLCBBYnN0cmFjdFhtbEVtYmVkZGVkLmNsYXNzLCAiQWJzdHJhY3RYbWxFbWJlZGRlZCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoYWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLCAiQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmciLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfT3JkZXJCeSgpLCB0aGlzLmdldE9yZGVyQnkoKSwgIm9yZGVyQnkiLCBudWxsLCAwLCAxLCBBYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0QWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfTWFwS2V5KCksIHRoaXMuZ2V0TWFwS2V5KCksIG51bGwsICJtYXBLZXkiLCBudWxsLCAwLCAxLCBBYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGFic3RyYWN0WG1sTmFtZWRDb2x1bW5FQ2xhc3MsIEFic3RyYWN0WG1sTmFtZWRDb2x1bW4uY2xhc3MsICJBYnN0cmFjdFhtbE5hbWVkQ29sdW1uIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sTmFtZWRDb2x1bW5fQ29sdW1uRGVmaW5pdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvbHVtbkRlZmluaXRpb24iLCBudWxsLCAwLCAxLCBBYnN0cmFjdFhtbE5hbWVkQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRBYnN0cmFjdFhtbE5hbWVkQ29sdW1uX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgQWJzdHJhY3RYbWxOYW1lZENvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcywgQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLCAiQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19UYXJnZXRFbnRpdHkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0YXJnZXRFbnRpdHkiLCBudWxsLCAwLCAxLCBBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19GZXRjaCgpLCB0aGlzLmdldEZldGNoVHlwZSgpLCAiZmV0Y2giLCAiTEFaWSIsIDAsIDEsIEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKSwgdGhpcy5nZXRDYXNjYWRlVHlwZSgpLCBudWxsLCAiY2FzY2FkZSIsIG51bGwsIDAsIDEsIEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcywgQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLCAiQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19PcHRpb25hbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJvcHRpb25hbCIsIG51bGwsIDAsIDEsIEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGFic3RyYWN0WG1sVGFibGVFQ2xhc3MsIEFic3RyYWN0WG1sVGFibGUuY2xhc3MsICJBYnN0cmFjdFhtbFRhYmxlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sVGFibGVfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBBYnN0cmFjdFhtbFRhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRBYnN0cmFjdFhtbFRhYmxlX0NhdGFsb2coKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjYXRhbG9nIiwgbnVsbCwgMCwgMSwgQWJzdHJhY3RYbWxUYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWJzdHJhY3RYbWxUYWJsZV9TY2hlbWEoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzY2hlbWEiLCBudWxsLCAwLCAxLCBBYnN0cmFjdFhtbFRhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRBYnN0cmFjdFhtbFRhYmxlX1VuaXF1ZUNvbnN0cmFpbnRzKCksIHRoaXMuZ2V0WG1sVW5pcXVlQ29uc3RyYWludCgpLCBudWxsLCAidW5pcXVlQ29uc3RyYWludHMiLCBudWxsLCAwLCAtMSwgQWJzdHJhY3RYbWxUYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAogCQlpbml0RUNsYXNzKGFic3RyYWN0WG1sVHlwZU1hcHBpbmdFQ2xhc3MsIEFic3RyYWN0WG1sVHlwZU1hcHBpbmcuY2xhc3MsICJBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfQ2xhc3NOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2xhc3NOYW1lIiwgbnVsbCwgMSwgMSwgQWJzdHJhY3RYbWxUeXBlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19BY2Nlc3MoKSwgdGhpcy5nZXRBY2Nlc3NUeXBlKCksICJhY2Nlc3MiLCAiUFJPUEVSVFkiLCAwLCAxLCBBYnN0cmFjdFhtbFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX01ldGFkYXRhQ29tcGxldGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAibWV0YWRhdGFDb21wbGV0ZSIsIG51bGwsIDAsIDEsIEFic3RyYWN0WG1sVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEFic3RyYWN0WG1sVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfQXR0cmlidXRlcygpLCB0aGlzLmdldEF0dHJpYnV0ZXMoKSwgbnVsbCwgImF0dHJpYnV0ZXMiLCBudWxsLCAwLCAxLCBBYnN0cmFjdFhtbFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCi0JCWluaXRFQ2xhc3MoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIlhtbE1hcHBlZFN1cGVyY2xhc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfSWRDbGFzcygpLCB0aGlzLmdldFhtbElkQ2xhc3MoKSwgbnVsbCwgImlkQ2xhc3MiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJleGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRW50aXR5TGlzdGVuZXJzKCksIHRoaXMuZ2V0RW50aXR5TGlzdGVuZXJzKCksIG51bGwsICJlbnRpdHlMaXN0ZW5lcnMiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1ByZVBlcnNpc3QoKSwgdGhpcy5nZXRQcmVQZXJzaXN0KCksIG51bGwsICJwcmVQZXJzaXN0IiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19Qb3N0UGVyc2lzdCgpLCB0aGlzLmdldFBvc3RQZXJzaXN0KCksIG51bGwsICJwb3N0UGVyc2lzdCIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUHJlUmVtb3ZlKCksIHRoaXMuZ2V0UHJlUmVtb3ZlKCksIG51bGwsICJwcmVSZW1vdmUiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1Bvc3RSZW1vdmUoKSwgdGhpcy5nZXRQb3N0UmVtb3ZlKCksIG51bGwsICJwb3N0UmVtb3ZlIiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19QcmVVcGRhdGUoKSwgdGhpcy5nZXRQcmVVcGRhdGUoKSwgbnVsbCwgInByZVVwZGF0ZSIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFVwZGF0ZSgpLCB0aGlzLmdldFBvc3RVcGRhdGUoKSwgbnVsbCwgInBvc3RVcGRhdGUiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1Bvc3RMb2FkKCksIHRoaXMuZ2V0UG9zdExvYWQoKSwgbnVsbCwgInBvc3RMb2FkIiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVDbGFzcyh4bWxBY2Nlc3NIb2xkZXJFQ2xhc3MsIFhtbEFjY2Vzc0hvbGRlci5jbGFzcywgIlhtbEFjY2Vzc0hvbGRlciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbEFjY2Vzc0hvbGRlcl9BY2Nlc3MoKSwgdGhpcy5nZXRBY2Nlc3NUeXBlKCksICJhY2Nlc3MiLCBudWxsLCAwLCAxLCBYbWxBY2Nlc3NIb2xkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAKLQkJaW5pdEVDbGFzcyh4bWxFbnRpdHlFQ2xhc3MsIFhtbEVudGl0eS5jbGFzcywgIlhtbEVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfVGFibGUoKSwgdGhpcy5nZXRYbWxUYWJsZSgpLCBudWxsLCAidGFibGUiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9TZWNvbmRhcnlUYWJsZXMoKSwgdGhpcy5nZXRYbWxTZWNvbmRhcnlUYWJsZSgpLCBudWxsLCAic2Vjb25kYXJ5VGFibGVzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X1ByaW1hcnlLZXlKb2luQ29sdW1ucygpLCB0aGlzLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCksIG51bGwsICJwcmltYXJ5S2V5Sm9pbkNvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfSWRDbGFzcygpLCB0aGlzLmdldFhtbElkQ2xhc3MoKSwgbnVsbCwgImlkQ2xhc3MiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9Jbmhlcml0YW5jZSgpLCB0aGlzLmdldEluaGVyaXRhbmNlKCksIG51bGwsICJpbmhlcml0YW5jZSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5X0Rpc2NyaW1pbmF0b3JWYWx1ZSgpLCB0aGlzLmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpLCAiZGlzY3JpbWluYXRvclZhbHVlIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfRGlzY3JpbWluYXRvckNvbHVtbigpLCB0aGlzLmdldFhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKSwgbnVsbCwgImRpc2NyaW1pbmF0b3JDb2x1bW4iLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9TZXF1ZW5jZUdlbmVyYXRvcigpLCB0aGlzLmdldFhtbFNlcXVlbmNlR2VuZXJhdG9yKCksIG51bGwsICJzZXF1ZW5jZUdlbmVyYXRvciIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X1RhYmxlR2VuZXJhdG9yKCksIHRoaXMuZ2V0WG1sVGFibGVHZW5lcmF0b3IoKSwgbnVsbCwgInRhYmxlR2VuZXJhdG9yIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfTmFtZWRRdWVyaWVzKCksIHRoaXMuZ2V0WG1sTmFtZWRRdWVyeSgpLCBudWxsLCAibmFtZWRRdWVyaWVzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X05hbWVkTmF0aXZlUXVlcmllcygpLCB0aGlzLmdldFhtbE5hbWVkTmF0aXZlUXVlcnkoKSwgbnVsbCwgIm5hbWVkTmF0aXZlUXVlcmllcyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpLCB0aGlzLmdldFNxbFJlc3VsdFNldE1hcHBpbmcoKSwgbnVsbCwgInNxbFJlc3VsdFNldE1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5X0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlfRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9FbnRpdHlMaXN0ZW5lcnMoKSwgdGhpcy5nZXRFbnRpdHlMaXN0ZW5lcnMoKSwgbnVsbCwgImVudGl0eUxpc3RlbmVycyIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X1ByZVBlcnNpc3QoKSwgdGhpcy5nZXRQcmVQZXJzaXN0KCksIG51bGwsICJwcmVQZXJzaXN0IiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfUG9zdFBlcnNpc3QoKSwgdGhpcy5nZXRQb3N0UGVyc2lzdCgpLCBudWxsLCAicG9zdFBlcnNpc3QiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9QcmVSZW1vdmUoKSwgdGhpcy5nZXRQcmVSZW1vdmUoKSwgbnVsbCwgInByZVJlbW92ZSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X1Bvc3RSZW1vdmUoKSwgdGhpcy5nZXRQb3N0UmVtb3ZlKCksIG51bGwsICJwb3N0UmVtb3ZlIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfUHJlVXBkYXRlKCksIHRoaXMuZ2V0UHJlVXBkYXRlKCksIG51bGwsICJwcmVVcGRhdGUiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9Qb3N0VXBkYXRlKCksIHRoaXMuZ2V0UG9zdFVwZGF0ZSgpLCBudWxsLCAicG9zdFVwZGF0ZSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X1Bvc3RMb2FkKCksIHRoaXMuZ2V0UG9zdExvYWQoKSwgbnVsbCwgInBvc3RMb2FkIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfQXR0cmlidXRlT3ZlcnJpZGVzKCksIHRoaXMuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKSwgbnVsbCwgImF0dHJpYnV0ZU92ZXJyaWRlcyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9Bc3NvY2lhdGlvbk92ZXJyaWRlcygpLCB0aGlzLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSwgbnVsbCwgImFzc29jaWF0aW9uT3ZlcnJpZGVzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVDbGFzcyh4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzLCAiWG1sQXR0cmlidXRlTWFwcGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCi0JCWluaXRFQ2xhc3MoeG1sRW1iZWRkYWJsZUVDbGFzcywgWG1sRW1iZWRkYWJsZS5jbGFzcywgIlhtbEVtYmVkZGFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQ2xhc3MoeG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzcywgWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgIlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lckVDbGFzcywgWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5jbGFzcywgIlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyX0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCksIHRoaXMuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZSgpLCBudWxsLCAiYXNzb2NpYXRpb25PdmVycmlkZXMiLCBudWxsLCAwLCAtMSwgWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzLCBYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgIlhtbEF0dHJpYnV0ZU92ZXJyaWRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9Db2x1bW4oKSwgdGhpcy5nZXRYbWxDb2x1bW4oKSwgbnVsbCwgImNvbHVtbiIsIG51bGwsIDEsIDEsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJFQ2xhc3MsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmNsYXNzLCAiWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl9BdHRyaWJ1dGVPdmVycmlkZXMoKSwgdGhpcy5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZSgpLCBudWxsLCAiYXR0cmlidXRlT3ZlcnJpZGVzIiwgbnVsbCwgMCwgLTEsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCiAJCWluaXRFQ2xhc3MoYXR0cmlidXRlc0VDbGFzcywgQXR0cmlidXRlcy5jbGFzcywgIkF0dHJpYnV0ZXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAJCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfSWRzKCksIHRoaXMuZ2V0WG1sSWQoKSwgbnVsbCwgImlkcyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwpAQCAtMTEwNTcsMTY3ICs5OTIxLDExNiBAQAogCQlpbml0RVJlZmVyZW5jZShnZXRBdHRyaWJ1dGVzX0VtYmVkZGVkcygpLCB0aGlzLmdldFhtbEVtYmVkZGVkKCksIG51bGwsICJlbWJlZGRlZHMiLCBudWxsLCAwLCAtMSwgQXR0cmlidXRlcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAkJaW5pdEVSZWZlcmVuY2UoZ2V0QXR0cmlidXRlc19UcmFuc2llbnRzKCksIHRoaXMuZ2V0WG1sVHJhbnNpZW50KCksIG51bGwsICJ0cmFuc2llbnRzIiwgbnVsbCwgMCwgLTEsIEF0dHJpYnV0ZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAKLQkJaW5pdEVDbGFzcyh4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzLCAiWG1sQXR0cmlidXRlTWFwcGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MsICJBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmciLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5jbGFzcywgIlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNvbHVtbk1hcHBpbmdFQ2xhc3MsIENvbHVtbk1hcHBpbmcuY2xhc3MsICJDb2x1bW5NYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKSwgdGhpcy5nZXRYbWxDb2x1bW4oKSwgbnVsbCwgImNvbHVtbiIsIG51bGwsIDAsIDEsIENvbHVtbk1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLCBYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLCAiWG1sUmVsYXRpb25zaGlwTWFwcGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfVGFyZ2V0RW50aXR5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidGFyZ2V0RW50aXR5IiwgbnVsbCwgMCwgMSwgWG1sUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19GZXRjaCgpLCB0aGlzLmdldEZldGNoVHlwZSgpLCAiZmV0Y2giLCAiTEFaWSIsIDAsIDEsIFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pblRhYmxlKCksIHRoaXMuZ2V0WG1sSm9pblRhYmxlKCksIG51bGwsICJqb2luVGFibGUiLCBudWxsLCAwLCAxLCBYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKSwgdGhpcy5nZXRDYXNjYWRlVHlwZSgpLCBudWxsLCAiY2FzY2FkZSIsIG51bGwsIDAsIDEsIFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBwZWRCeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZEJ5IiwgbnVsbCwgMCwgMSwgWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfT3JkZXJCeSgpLCB0aGlzLmdldE9yZGVyQnkoKSwgIm9yZGVyQnkiLCBudWxsLCAwLCAxLCBYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBLZXkoKSwgdGhpcy5nZXRNYXBLZXkoKSwgbnVsbCwgIm1hcEtleSIsIG51bGwsIDAsIDEsIFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MsICJYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19PcHRpb25hbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJvcHRpb25hbCIsIG51bGwsIDAsIDEsIFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxKb2luQ29sdW1uKCksIG51bGwsICJqb2luQ29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sSWRFQ2xhc3MsIFhtbElkLmNsYXNzLCAiWG1sSWQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxJZF9HZW5lcmF0ZWRWYWx1ZSgpLCB0aGlzLmdldFhtbEdlbmVyYXRlZFZhbHVlKCksIG51bGwsICJnZW5lcmF0ZWRWYWx1ZSIsIG51bGwsIDAsIDEsIFhtbElkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxJZF9UZW1wb3JhbCgpLCB0aGlzLmdldFRlbXBvcmFsVHlwZSgpLCAidGVtcG9yYWwiLCBudWxsLCAwLCAxLCBYbWxJZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sSWRfVGFibGVHZW5lcmF0b3IoKSwgdGhpcy5nZXRYbWxUYWJsZUdlbmVyYXRvcigpLCBudWxsLCAidGFibGVHZW5lcmF0b3IiLCBudWxsLCAwLCAxLCBYbWxJZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sSWRfU2VxdWVuY2VHZW5lcmF0b3IoKSwgdGhpcy5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcigpLCBudWxsLCAic2VxdWVuY2VHZW5lcmF0b3IiLCBudWxsLCAwLCAxLCBYbWxJZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbElkSW1wbEVDbGFzcywgWG1sSWRJbXBsLmNsYXNzLCAiWG1sSWRJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoYmFzZVhtbEVtYmVkZGVkRUNsYXNzLCBCYXNlWG1sRW1iZWRkZWQuY2xhc3MsICJCYXNlWG1sRW1iZWRkZWQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRCYXNlWG1sRW1iZWRkZWRfQXR0cmlidXRlT3ZlcnJpZGVzKCksIHRoaXMuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKSwgbnVsbCwgImF0dHJpYnV0ZU92ZXJyaWRlcyIsIG51bGwsIDAsIC0xLCBCYXNlWG1sRW1iZWRkZWQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbWJlZGRlZElkRUNsYXNzLCBYbWxFbWJlZGRlZElkLmNsYXNzLCAiWG1sRW1iZWRkZWRJZCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbWJlZGRlZElkSW1wbEVDbGFzcywgWG1sRW1iZWRkZWRJZEltcGwuY2xhc3MsICJYbWxFbWJlZGRlZElkSW1wbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGVkRUNsYXNzLCBYbWxFbWJlZGRlZC5jbGFzcywgIlhtbEVtYmVkZGVkIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGVkSW1wbEVDbGFzcywgWG1sRW1iZWRkZWRJbXBsLmNsYXNzLCAiWG1sRW1iZWRkZWRJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQmFzaWNFQ2xhc3MsIFhtbEJhc2ljLmNsYXNzLCAiWG1sQmFzaWMiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKHhtbEJhc2ljRUNsYXNzLCBYbWxCYXNpYy5jbGFzcywgIlhtbEJhc2ljIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXNpY19GZXRjaCgpLCB0aGlzLmdldEZldGNoVHlwZSgpLCAiZmV0Y2giLCAiTEFaWSIsIDAsIDEsIFhtbEJhc2ljLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXNpY19PcHRpb25hbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJvcHRpb25hbCIsIG51bGwsIDAsIDEsIFhtbEJhc2ljLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXNpY19Mb2IoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAibG9iIiwgbnVsbCwgMCwgMSwgWG1sQmFzaWMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEJhc2ljX1RlbXBvcmFsKCksIHRoaXMuZ2V0VGVtcG9yYWxUeXBlKCksICJ0ZW1wb3JhbCIsIG51bGwsIDAsIDEsIFhtbEJhc2ljLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXNpY19FbnVtZXJhdGVkKCksIHRoaXMuZ2V0RW51bVR5cGUoKSwgImVudW1lcmF0ZWQiLCBudWxsLCAwLCAxLCBYbWxCYXNpYy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAotCQlpbml0RUNsYXNzKHhtbEJhc2ljSW1wbEVDbGFzcywgWG1sQmFzaWNJbXBsLmNsYXNzLCAiWG1sQmFzaWNJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sVmVyc2lvbkVDbGFzcywgWG1sVmVyc2lvbi5jbGFzcywgIlhtbFZlcnNpb24iLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxWZXJzaW9uX1RlbXBvcmFsKCksIHRoaXMuZ2V0VGVtcG9yYWxUeXBlKCksICJ0ZW1wb3JhbCIsIG51bGwsIDAsIDEsIFhtbFZlcnNpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxWZXJzaW9uSW1wbEVDbGFzcywgWG1sVmVyc2lvbkltcGwuY2xhc3MsICJYbWxWZXJzaW9uSW1wbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb09uZUVDbGFzcywgWG1sTWFueVRvT25lLmNsYXNzLCAiWG1sTWFueVRvT25lIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb09uZUltcGxFQ2xhc3MsIFhtbE1hbnlUb09uZUltcGwuY2xhc3MsICJYbWxNYW55VG9PbmVJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sT25lVG9NYW55RUNsYXNzLCBYbWxPbmVUb01hbnkuY2xhc3MsICJYbWxPbmVUb01hbnkiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxPbmVUb01hbnlfSm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxKb2luQ29sdW1uKCksIG51bGwsICJqb2luQ29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxPbmVUb01hbnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPbmVUb01hbnlJbXBsRUNsYXNzLCBYbWxPbmVUb01hbnlJbXBsLmNsYXNzLCAiWG1sT25lVG9NYW55SW1wbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE9uZVRvT25lRUNsYXNzLCBYbWxPbmVUb09uZS5jbGFzcywgIlhtbE9uZVRvT25lIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT25lVG9PbmVfTWFwcGVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWRCeSIsIG51bGwsIDAsIDEsIFhtbE9uZVRvT25lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxPbmVUb09uZV9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpLCBudWxsLCAicHJpbWFyeUtleUpvaW5Db2x1bW5zIiwgbnVsbCwgMCwgLTEsIFhtbE9uZVRvT25lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sT25lVG9PbmVJbXBsRUNsYXNzLCBYbWxPbmVUb09uZUltcGwuY2xhc3MsICJYbWxPbmVUb09uZUltcGwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYW55VG9NYW55RUNsYXNzLCBYbWxNYW55VG9NYW55LmNsYXNzLCAiWG1sTWFueVRvTWFueSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYW55VG9NYW55SW1wbEVDbGFzcywgWG1sTWFueVRvTWFueUltcGwuY2xhc3MsICJYbWxNYW55VG9NYW55SW1wbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFRyYW5zaWVudEVDbGFzcywgWG1sVHJhbnNpZW50LmNsYXNzLCAiWG1sVHJhbnNpZW50IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFRyYW5zaWVudEltcGxFQ2xhc3MsIFhtbFRyYW5zaWVudEltcGwuY2xhc3MsICJYbWxUcmFuc2llbnRJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzcywgWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgIlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlX0pvaW5Db2x1bW5zKCksIHRoaXMuZ2V0WG1sSm9pbkNvbHVtbigpLCBudWxsLCAiam9pbkNvbHVtbnMiLCBudWxsLCAxLCAtMSwgWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbEVDbGFzcywgWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwuY2xhc3MsICJYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzLCBYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgIlhtbEF0dHJpYnV0ZU92ZXJyaWRlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfQ29sdW1uKCksIHRoaXMuZ2V0WG1sQ29sdW1uKCksIG51bGwsICJjb2x1bW4iLCBudWxsLCAxLCAxLCBYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbEVDbGFzcywgWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsLmNsYXNzLCAiWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY2FzY2FkZVR5cGVFQ2xhc3MsIENhc2NhZGVUeXBlLmNsYXNzLCAiQ2FzY2FkZVR5cGUiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKGNhc2NhZGVUeXBlRUNsYXNzLCBDYXNjYWRlVHlwZS5jbGFzcywgIkNhc2NhZGVUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRDYXNjYWRlVHlwZV9DYXNjYWRlQWxsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImNhc2NhZGVBbGwiLCBudWxsLCAwLCAxLCBDYXNjYWRlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVBlcnNpc3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiY2FzY2FkZVBlcnNpc3QiLCBudWxsLCAwLCAxLCBDYXNjYWRlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZU1lcmdlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImNhc2NhZGVNZXJnZSIsIG51bGwsIDAsIDEsIENhc2NhZGVUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRDYXNjYWRlVHlwZV9DYXNjYWRlUmVtb3ZlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImNhc2NhZGVSZW1vdmUiLCBudWxsLCAwLCAxLCBDYXNjYWRlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVJlZnJlc2goKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiY2FzY2FkZVJlZnJlc2giLCBudWxsLCAwLCAxLCBDYXNjYWRlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAotCQlpbml0RUNsYXNzKGNhc2NhZGVUeXBlSW1wbEVDbGFzcywgQ2FzY2FkZVR5cGVJbXBsLmNsYXNzLCAiQ2FzY2FkZVR5cGVJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKHhtbENvbGxlY3Rpb25UYWJsZUVDbGFzcywgWG1sQ29sbGVjdGlvblRhYmxlLmNsYXNzLCAiWG1sQ29sbGVjdGlvblRhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCi0JCWluaXRFQ2xhc3MoeG1sTmFtZWRDb2x1bW5FQ2xhc3MsIFhtbE5hbWVkQ29sdW1uLmNsYXNzLCAiWG1sTmFtZWRDb2x1bW4iLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxOYW1lZENvbHVtbl9Db2x1bW5EZWZpbml0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29sdW1uRGVmaW5pdGlvbiIsIG51bGwsIDAsIDEsIFhtbE5hbWVkQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxOYW1lZENvbHVtbl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbE5hbWVkQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYWJzdHJhY3RYbWxOYW1lZENvbHVtbkVDbGFzcywgQWJzdHJhY3RYbWxOYW1lZENvbHVtbi5jbGFzcywgIkFic3RyYWN0WG1sTmFtZWRDb2x1bW4iLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEFic3RyYWN0Q29sdW1uRUNsYXNzLCBYbWxBYnN0cmFjdENvbHVtbi5jbGFzcywgIlhtbEFic3RyYWN0Q29sdW1uIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQWJzdHJhY3RDb2x1bW5fSW5zZXJ0YWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJpbnNlcnRhYmxlIiwgbnVsbCwgMCwgMSwgWG1sQWJzdHJhY3RDb2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEFic3RyYWN0Q29sdW1uX051bGxhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgIm51bGxhYmxlIiwgbnVsbCwgMCwgMSwgWG1sQWJzdHJhY3RDb2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEFic3RyYWN0Q29sdW1uX1RhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidGFibGUiLCBudWxsLCAwLCAxLCBYbWxBYnN0cmFjdENvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQWJzdHJhY3RDb2x1bW5fVW5pcXVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgInVuaXF1ZSIsIG51bGwsIDAsIDEsIFhtbEFic3RyYWN0Q29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxBYnN0cmFjdENvbHVtbl9VcGRhdGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAidXBkYXRhYmxlIiwgbnVsbCwgMCwgMSwgWG1sQWJzdHJhY3RDb2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uRUNsYXNzLCBBYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uLmNsYXNzLCAiQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbiIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ29sdW1uRUNsYXNzLCBYbWxDb2x1bW4uY2xhc3MsICJYbWxDb2x1bW4iLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKHhtbENvbHVtbkVDbGFzcywgWG1sQ29sdW1uLmNsYXNzLCAiWG1sQ29sdW1uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb2x1bW5fTGVuZ3RoKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAibGVuZ3RoIiwgbnVsbCwgMCwgMSwgWG1sQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb2x1bW5fUHJlY2lzaW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAicHJlY2lzaW9uIiwgbnVsbCwgMCwgMSwgWG1sQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb2x1bW5fU2NhbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50T2JqZWN0KCksICJzY2FsZSIsIG51bGwsIDAsIDEsIFhtbENvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAotCQlpbml0RUNsYXNzKHhtbENvbHVtbkltcGxFQ2xhc3MsIFhtbENvbHVtbkltcGwuY2xhc3MsICJYbWxDb2x1bW5JbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKGNvbHVtbk1hcHBpbmdFQ2xhc3MsIENvbHVtbk1hcHBpbmcuY2xhc3MsICJDb2x1bW5NYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKSwgdGhpcy5nZXRYbWxDb2x1bW4oKSwgbnVsbCwgImNvbHVtbiIsIG51bGwsIDAsIDEsIENvbHVtbk1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAKIAkJaW5pdEVDbGFzcyhjb2x1bW5SZXN1bHRFQ2xhc3MsIENvbHVtblJlc3VsdC5jbGFzcywgIkNvbHVtblJlc3VsdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29sdW1uUmVzdWx0X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgQ29sdW1uUmVzdWx0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCisJCWluaXRFQ2xhc3MoeG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzLCBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MsICJYbWxDb252ZXJ0aWJsZU1hcHBpbmciLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfTG9iKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImxvYiIsIG51bGwsIDAsIDEsIFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX1RlbXBvcmFsKCksIHRoaXMuZ2V0VGVtcG9yYWxUeXBlKCksICJ0ZW1wb3JhbCIsIG51bGwsIDAsIDEsIFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0VudW1lcmF0ZWQoKSwgdGhpcy5nZXRFbnVtVHlwZSgpLCAiZW51bWVyYXRlZCIsIG51bGwsIDAsIDEsIFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwogCQlpbml0RUNsYXNzKHhtbERpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3MsIFhtbERpc2NyaW1pbmF0b3JDb2x1bW4uY2xhc3MsICJYbWxEaXNjcmltaW5hdG9yQ29sdW1uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxEaXNjcmltaW5hdG9yQ29sdW1uX0Rpc2NyaW1pbmF0b3JUeXBlKCksIHRoaXMuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSwgImRpc2NyaW1pbmF0b3JUeXBlIiwgIlNUUklORyIsIDAsIDEsIFhtbERpc2NyaW1pbmF0b3JDb2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFQXR0cmlidXRlKGdldFhtbERpc2NyaW1pbmF0b3JDb2x1bW5fTGVuZ3RoKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAibGVuZ3RoIiwgbnVsbCwgMCwgMSwgWG1sRGlzY3JpbWluYXRvckNvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAotCQlpbml0RUNsYXNzKGVudGl0eUxpc3RlbmVyc0VDbGFzcywgRW50aXR5TGlzdGVuZXJzLmNsYXNzLCAiRW50aXR5TGlzdGVuZXJzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlMaXN0ZW5lcnNfRW50aXR5TGlzdGVuZXJzKCksIHRoaXMuZ2V0RW50aXR5TGlzdGVuZXIoKSwgbnVsbCwgImVudGl0eUxpc3RlbmVycyIsIG51bGwsIDAsIC0xLCBFbnRpdHlMaXN0ZW5lcnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3MoeG1sRWxlbWVudENvbGxlY3Rpb25FQ2xhc3MsIFhtbEVsZW1lbnRDb2xsZWN0aW9uLmNsYXNzLCAiWG1sRWxlbWVudENvbGxlY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh4bWxFbWJlZGRhYmxlRUNsYXNzLCBYbWxFbWJlZGRhYmxlLmNsYXNzLCAiWG1sRW1iZWRkYWJsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHhtbEVtYmVkZGVkRUNsYXNzLCBYbWxFbWJlZGRlZC5jbGFzcywgIlhtbEVtYmVkZGVkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoeG1sRW1iZWRkZWRJZEVDbGFzcywgWG1sRW1iZWRkZWRJZC5jbGFzcywgIlhtbEVtYmVkZGVkSWQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh4bWxFbnRpdHlFQ2xhc3MsIFhtbEVudGl0eS5jbGFzcywgIlhtbEVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfVGFibGUoKSwgdGhpcy5nZXRYbWxUYWJsZSgpLCBudWxsLCAidGFibGUiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9TZWNvbmRhcnlUYWJsZXMoKSwgdGhpcy5nZXRYbWxTZWNvbmRhcnlUYWJsZSgpLCBudWxsLCAic2Vjb25kYXJ5VGFibGVzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X1ByaW1hcnlLZXlKb2luQ29sdW1ucygpLCB0aGlzLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCksIG51bGwsICJwcmltYXJ5S2V5Sm9pbkNvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfSWRDbGFzcygpLCB0aGlzLmdldFhtbElkQ2xhc3MoKSwgbnVsbCwgImlkQ2xhc3MiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9Jbmhlcml0YW5jZSgpLCB0aGlzLmdldEluaGVyaXRhbmNlKCksIG51bGwsICJpbmhlcml0YW5jZSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5X0Rpc2NyaW1pbmF0b3JWYWx1ZSgpLCB0aGlzLmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpLCAiZGlzY3JpbWluYXRvclZhbHVlIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfRGlzY3JpbWluYXRvckNvbHVtbigpLCB0aGlzLmdldFhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKSwgbnVsbCwgImRpc2NyaW1pbmF0b3JDb2x1bW4iLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpLCB0aGlzLmdldFNxbFJlc3VsdFNldE1hcHBpbmcoKSwgbnVsbCwgInNxbFJlc3VsdFNldE1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5X0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlfRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9FbnRpdHlMaXN0ZW5lcnMoKSwgdGhpcy5nZXRFbnRpdHlMaXN0ZW5lcnMoKSwgbnVsbCwgImVudGl0eUxpc3RlbmVycyIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAogCQlpbml0RUNsYXNzKGVudGl0eUxpc3RlbmVyRUNsYXNzLCBFbnRpdHlMaXN0ZW5lci5jbGFzcywgIkVudGl0eUxpc3RlbmVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlMaXN0ZW5lcl9DbGFzc05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjbGFzc05hbWUiLCBudWxsLCAxLCAxLCBFbnRpdHlMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5TGlzdGVuZXJfUHJlUGVyc2lzdCgpLCB0aGlzLmdldFByZVBlcnNpc3QoKSwgbnVsbCwgInByZVBlcnNpc3QiLCBudWxsLCAwLCAxLCBFbnRpdHlMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5TGlzdGVuZXJfUG9zdFBlcnNpc3QoKSwgdGhpcy5nZXRQb3N0UGVyc2lzdCgpLCBudWxsLCAicG9zdFBlcnNpc3QiLCBudWxsLCAwLCAxLCBFbnRpdHlMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5TGlzdGVuZXJfUHJlUmVtb3ZlKCksIHRoaXMuZ2V0UHJlUmVtb3ZlKCksIG51bGwsICJwcmVSZW1vdmUiLCBudWxsLCAwLCAxLCBFbnRpdHlMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5TGlzdGVuZXJfUG9zdFJlbW92ZSgpLCB0aGlzLmdldFBvc3RSZW1vdmUoKSwgbnVsbCwgInBvc3RSZW1vdmUiLCBudWxsLCAwLCAxLCBFbnRpdHlMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5TGlzdGVuZXJfUHJlVXBkYXRlKCksIHRoaXMuZ2V0UHJlVXBkYXRlKCksIG51bGwsICJwcmVVcGRhdGUiLCBudWxsLCAwLCAxLCBFbnRpdHlMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5TGlzdGVuZXJfUG9zdFVwZGF0ZSgpLCB0aGlzLmdldFBvc3RVcGRhdGUoKSwgbnVsbCwgInBvc3RVcGRhdGUiLCBudWxsLCAwLCAxLCBFbnRpdHlMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5TGlzdGVuZXJfUG9zdExvYWQoKSwgdGhpcy5nZXRQb3N0TG9hZCgpLCBudWxsLCAicG9zdExvYWQiLCBudWxsLCAwLCAxLCBFbnRpdHlMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGVudGl0eUxpc3RlbmVyc0VDbGFzcywgRW50aXR5TGlzdGVuZXJzLmNsYXNzLCAiRW50aXR5TGlzdGVuZXJzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlMaXN0ZW5lcnNfRW50aXR5TGlzdGVuZXJzKCksIHRoaXMuZ2V0RW50aXR5TGlzdGVuZXIoKSwgbnVsbCwgImVudGl0eUxpc3RlbmVycyIsIG51bGwsIDAsIC0xLCBFbnRpdHlMaXN0ZW5lcnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICJYbWxFbnRpdHlNYXBwaW5ncyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5TWFwcGluZ3NfRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc19QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLCB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCksIG51bGwsICJwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlNYXBwaW5nc19QYWNrYWdlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicGFja2FnZSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlNYXBwaW5nc19TY2hlbWEoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzY2hlbWEiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5TWFwcGluZ3NfQ2F0YWxvZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNhdGFsb2ciLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfU2VxdWVuY2VHZW5lcmF0b3JzKCksIHRoaXMuZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3IoKSwgbnVsbCwgInNlcXVlbmNlR2VuZXJhdG9ycyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfVGFibGVHZW5lcmF0b3JzKCksIHRoaXMuZ2V0WG1sVGFibGVHZW5lcmF0b3IoKSwgbnVsbCwgInRhYmxlR2VuZXJhdG9ycyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfU3FsUmVzdWx0U2V0TWFwcGluZ3MoKSwgdGhpcy5nZXRTcWxSZXN1bHRTZXRNYXBwaW5nKCksIG51bGwsICJzcWxSZXN1bHRTZXRNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfTWFwcGVkU3VwZXJjbGFzc2VzKCksIHRoaXMuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpLCBudWxsLCAibWFwcGVkU3VwZXJjbGFzc2VzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc19FbnRpdGllcygpLCB0aGlzLmdldFhtbEVudGl0eSgpLCBudWxsLCAiZW50aXRpZXMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzX0VtYmVkZGFibGVzKCksIHRoaXMuZ2V0WG1sRW1iZWRkYWJsZSgpLCBudWxsLCAiZW1iZWRkYWJsZXMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAKIAkJaW5pdEVDbGFzcyhlbnRpdHlSZXN1bHRFQ2xhc3MsIEVudGl0eVJlc3VsdC5jbGFzcywgIkVudGl0eVJlc3VsdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5UmVzdWx0X0Rpc2NyaW1pbmF0b3JDb2x1bW4oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkaXNjcmltaW5hdG9yQ29sdW1uIiwgbnVsbCwgMCwgMSwgRW50aXR5UmVzdWx0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlSZXN1bHRfRW50aXR5Q2xhc3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlbnRpdHlDbGFzcyIsIG51bGwsIDEsIDEsIEVudGl0eVJlc3VsdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5UmVzdWx0X0ZpZWxkUmVzdWx0cygpLCB0aGlzLmdldEZpZWxkUmVzdWx0KCksIG51bGwsICJmaWVsZFJlc3VsdHMiLCBudWxsLCAwLCAtMSwgRW50aXR5UmVzdWx0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCi0JCWluaXRFQ2xhc3MoZXZlbnRNZXRob2RFQ2xhc3MsIEV2ZW50TWV0aG9kLmNsYXNzLCAiRXZlbnRNZXRob2QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQ2xhc3MoZXZlbnRNZXRob2RFQ2xhc3MsIEV2ZW50TWV0aG9kLmNsYXNzLCAiRXZlbnRNZXRob2QiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXZlbnRNZXRob2RfTWV0aG9kTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1ldGhvZE5hbWUiLCBudWxsLCAxLCAxLCBFdmVudE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAorCQlpbml0RUNsYXNzKHhtbEV2ZW50TWV0aG9kQ29udGFpbmVyRUNsYXNzLCBYbWxFdmVudE1ldGhvZENvbnRhaW5lci5jbGFzcywgIlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUHJlUGVyc2lzdCgpLCB0aGlzLmdldFByZVBlcnNpc3QoKSwgbnVsbCwgInByZVBlcnNpc3QiLCBudWxsLCAwLCAxLCBYbWxFdmVudE1ldGhvZENvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFBlcnNpc3QoKSwgdGhpcy5nZXRQb3N0UGVyc2lzdCgpLCBudWxsLCAicG9zdFBlcnNpc3QiLCBudWxsLCAwLCAxLCBYbWxFdmVudE1ldGhvZENvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUHJlUmVtb3ZlKCksIHRoaXMuZ2V0UHJlUmVtb3ZlKCksIG51bGwsICJwcmVSZW1vdmUiLCBudWxsLCAwLCAxLCBYbWxFdmVudE1ldGhvZENvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFJlbW92ZSgpLCB0aGlzLmdldFBvc3RSZW1vdmUoKSwgbnVsbCwgInBvc3RSZW1vdmUiLCBudWxsLCAwLCAxLCBYbWxFdmVudE1ldGhvZENvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUHJlVXBkYXRlKCksIHRoaXMuZ2V0UHJlVXBkYXRlKCksIG51bGwsICJwcmVVcGRhdGUiLCBudWxsLCAwLCAxLCBYbWxFdmVudE1ldGhvZENvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFVwZGF0ZSgpLCB0aGlzLmdldFBvc3RVcGRhdGUoKSwgbnVsbCwgInBvc3RVcGRhdGUiLCBudWxsLCAwLCAxLCBYbWxFdmVudE1ldGhvZENvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdExvYWQoKSwgdGhpcy5nZXRQb3N0TG9hZCgpLCBudWxsLCAicG9zdExvYWQiLCBudWxsLCAwLCAxLCBYbWxFdmVudE1ldGhvZENvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwogCQlpbml0RUNsYXNzKGZpZWxkUmVzdWx0RUNsYXNzLCBGaWVsZFJlc3VsdC5jbGFzcywgIkZpZWxkUmVzdWx0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRGaWVsZFJlc3VsdF9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIEZpZWxkUmVzdWx0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRGaWVsZFJlc3VsdF9Db2x1bW4oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb2x1bW4iLCBudWxsLCAxLCAxLCBGaWVsZFJlc3VsdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAotCQlpbml0RUNsYXNzKHhtbEdlbmVyYXRlZFZhbHVlRUNsYXNzLCBYbWxHZW5lcmF0ZWRWYWx1ZS5jbGFzcywgIlhtbEdlbmVyYXRlZFZhbHVlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVDbGFzcyh4bWxHZW5lcmF0ZWRWYWx1ZUVDbGFzcywgWG1sR2VuZXJhdGVkVmFsdWUuY2xhc3MsICJYbWxHZW5lcmF0ZWRWYWx1ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sR2VuZXJhdGVkVmFsdWVfR2VuZXJhdG9yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZ2VuZXJhdG9yIiwgbnVsbCwgMCwgMSwgWG1sR2VuZXJhdGVkVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFQXR0cmlidXRlKGdldFhtbEdlbmVyYXRlZFZhbHVlX1N0cmF0ZWd5KCksIHRoaXMuZ2V0R2VuZXJhdGlvblR5cGUoKSwgInN0cmF0ZWd5IiwgIlRBQkxFIiwgMCwgMSwgWG1sR2VuZXJhdGVkVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAKLQkJaW5pdEVDbGFzcyh4bWxHZW5lcmF0ZWRWYWx1ZUltcGxFQ2xhc3MsIFhtbEdlbmVyYXRlZFZhbHVlSW1wbC5jbGFzcywgIlhtbEdlbmVyYXRlZFZhbHVlSW1wbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVDbGFzcyh4bWxHZW5lcmF0b3JFQ2xhc3MsIFhtbEdlbmVyYXRvci5jbGFzcywgIlhtbEdlbmVyYXRvciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbEdlbmVyYXRvcl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFhtbEdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sR2VuZXJhdG9yX0luaXRpYWxWYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgImluaXRpYWxWYWx1ZSIsIG51bGwsIDAsIDEsIFhtbEdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sR2VuZXJhdG9yX0FsbG9jYXRpb25TaXplKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAiYWxsb2NhdGlvblNpemUiLCBudWxsLCAwLCAxLCBYbWxHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxHZW5lcmF0b3JDb250YWluZXJFQ2xhc3MsIFhtbEdlbmVyYXRvckNvbnRhaW5lci5jbGFzcywgIlhtbEdlbmVyYXRvckNvbnRhaW5lciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9TZXF1ZW5jZUdlbmVyYXRvcigpLCB0aGlzLmdldFhtbFNlcXVlbmNlR2VuZXJhdG9yKCksIG51bGwsICJzZXF1ZW5jZUdlbmVyYXRvciIsIG51bGwsIDAsIDEsIFhtbEdlbmVyYXRvckNvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1RhYmxlR2VuZXJhdG9yKCksIHRoaXMuZ2V0WG1sVGFibGVHZW5lcmF0b3IoKSwgbnVsbCwgInRhYmxlR2VuZXJhdG9yIiwgbnVsbCwgMCwgMSwgWG1sR2VuZXJhdG9yQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sSWRFQ2xhc3MsIFhtbElkLmNsYXNzLCAiWG1sSWQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbElkX0dlbmVyYXRlZFZhbHVlKCksIHRoaXMuZ2V0WG1sR2VuZXJhdGVkVmFsdWUoKSwgbnVsbCwgImdlbmVyYXRlZFZhbHVlIiwgbnVsbCwgMCwgMSwgWG1sSWQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAKIAkJaW5pdEVDbGFzcyh4bWxJZENsYXNzRUNsYXNzLCBYbWxJZENsYXNzLmNsYXNzLCAiWG1sSWRDbGFzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSWRDbGFzc19DbGFzc05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjbGFzc05hbWUiLCBudWxsLCAxLCAxLCBYbWxJZENsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwpAQCAtMTEyMjUsMjggKzEwMDM4LDM4IEBACiAJCWluaXRFQ2xhc3MoaW5oZXJpdGFuY2VFQ2xhc3MsIEluaGVyaXRhbmNlLmNsYXNzLCAiSW5oZXJpdGFuY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAJCWluaXRFQXR0cmlidXRlKGdldEluaGVyaXRhbmNlX1N0cmF0ZWd5KCksIHRoaXMuZ2V0SW5oZXJpdGFuY2VUeXBlKCksICJzdHJhdGVneSIsICJTSU5HTEVfVEFCTEUiLCAwLCAxLCBJbmhlcml0YW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAotCQlpbml0RUNsYXNzKHhtbEpvaW5Db2x1bW5FQ2xhc3MsIFhtbEpvaW5Db2x1bW4uY2xhc3MsICJYbWxKb2luQ29sdW1uIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVDbGFzcyh4bWxKb2luQ29sdW1uRUNsYXNzLCBYbWxKb2luQ29sdW1uLmNsYXNzLCAiWG1sSm9pbkNvbHVtbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSm9pbkNvbHVtbl9SZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlZmVyZW5jZWRDb2x1bW5OYW1lIiwgbnVsbCwgMCwgMSwgWG1sSm9pbkNvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAotCQlpbml0RUNsYXNzKHhtbEpvaW5Db2x1bW5JbXBsRUNsYXNzLCBYbWxKb2luQ29sdW1uSW1wbC5jbGFzcywgIlhtbEpvaW5Db2x1bW5JbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKHhtbEpvaW5Db2x1bW5zTWFwcGluZ0VDbGFzcywgWG1sSm9pbkNvbHVtbnNNYXBwaW5nLmNsYXNzLCAiWG1sSm9pbkNvbHVtbnNNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sSm9pbkNvbHVtbnNNYXBwaW5nX0pvaW5Db2x1bW5zKCksIHRoaXMuZ2V0WG1sSm9pbkNvbHVtbigpLCBudWxsLCAiam9pbkNvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sSm9pbkNvbHVtbnNNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCi0JCWluaXRFQ2xhc3MoeG1sSm9pblRhYmxlRUNsYXNzLCBYbWxKb2luVGFibGUuY2xhc3MsICJYbWxKb2luVGFibGUiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKHhtbEpvaW5UYWJsZUVDbGFzcywgWG1sSm9pblRhYmxlLmNsYXNzLCAiWG1sSm9pblRhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCQlpbml0RVJlZmVyZW5jZShnZXRYbWxKb2luVGFibGVfSm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxKb2luQ29sdW1uKCksIG51bGwsICJqb2luQ29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxKb2luVGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFUmVmZXJlbmNlKGdldFhtbEpvaW5UYWJsZV9JbnZlcnNlSm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxKb2luQ29sdW1uKCksIG51bGwsICJpbnZlcnNlSm9pbkNvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sSm9pblRhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCi0JCWluaXRFQ2xhc3MoeG1sSm9pblRhYmxlSW1wbEVDbGFzcywgWG1sSm9pblRhYmxlSW1wbC5jbGFzcywgIlhtbEpvaW5UYWJsZUltcGwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQ2xhc3MoeG1sSm9pblRhYmxlTWFwcGluZ0VDbGFzcywgWG1sSm9pblRhYmxlTWFwcGluZy5jbGFzcywgIlhtbEpvaW5UYWJsZU1hcHBpbmciLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxKb2luVGFibGVNYXBwaW5nX0pvaW5UYWJsZSgpLCB0aGlzLmdldFhtbEpvaW5UYWJsZSgpLCBudWxsLCAiam9pblRhYmxlIiwgbnVsbCwgMCwgMSwgWG1sSm9pblRhYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAogCQlpbml0RUNsYXNzKGxvYkVDbGFzcywgTG9iLmNsYXNzLCAiTG9iIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCi0JCWluaXRFQ2xhc3MobWFwS2V5RUNsYXNzLCBNYXBLZXkuY2xhc3MsICJNYXBLZXkiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKHhtbE1hbnlUb01hbnlFQ2xhc3MsIFhtbE1hbnlUb01hbnkuY2xhc3MsICJYbWxNYW55VG9NYW55IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoeG1sTWFueVRvT25lRUNsYXNzLCBYbWxNYW55VG9PbmUuY2xhc3MsICJYbWxNYW55VG9PbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyhtYXBLZXlFQ2xhc3MsIE1hcEtleS5jbGFzcywgIk1hcEtleSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWFwS2V5X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTWFwS2V5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCi0JCWluaXRFQ2xhc3MobWFwS2V5SW1wbEVDbGFzcywgTWFwS2V5SW1wbC5jbGFzcywgIk1hcEtleUltcGwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQ2xhc3MoeG1sTWFwS2V5Q2xhc3NFQ2xhc3MsIFhtbE1hcEtleUNsYXNzLmNsYXNzLCAiWG1sTWFwS2V5Q2xhc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAKLQkJaW5pdEVDbGFzcyh4bWxRdWVyeUVDbGFzcywgWG1sUXVlcnkuY2xhc3MsICJYbWxRdWVyeSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgWG1sUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5X1F1ZXJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicXVlcnkiLCBudWxsLCAxLCAxLCBYbWxRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUXVlcnlfSGludHMoKSwgdGhpcy5nZXRYbWxRdWVyeUhpbnQoKSwgbnVsbCwgImhpbnRzIiwgbnVsbCwgMCwgLTEsIFhtbFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUNsYXNzKHhtbE1hcHBlZEJ5TWFwcGluZ0VDbGFzcywgWG1sTWFwcGVkQnlNYXBwaW5nLmNsYXNzLCAiWG1sTWFwcGVkQnlNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTWFwcGVkQnlNYXBwaW5nX01hcHBlZEJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkQnkiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRCeU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAiWG1sTWFwcGVkU3VwZXJjbGFzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19JZENsYXNzKCksIHRoaXMuZ2V0WG1sSWRDbGFzcygpLCBudWxsLCAiaWRDbGFzcyIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzIiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FbnRpdHlMaXN0ZW5lcnMoKSwgdGhpcy5nZXRFbnRpdHlMaXN0ZW5lcnMoKSwgbnVsbCwgImVudGl0eUxpc3RlbmVycyIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAKIAkJaW5pdEVDbGFzcyh4bWxOYW1lZE5hdGl2ZVF1ZXJ5RUNsYXNzLCBYbWxOYW1lZE5hdGl2ZVF1ZXJ5LmNsYXNzLCAiWG1sTmFtZWROYXRpdmVRdWVyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTmFtZWROYXRpdmVRdWVyeV9SZXN1bHRDbGFzcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlc3VsdENsYXNzIiwgbnVsbCwgMCwgMSwgWG1sTmFtZWROYXRpdmVRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKQEAgLTExMjU0LDYgKzEwMDc3LDI1IEBACiAKIAkJaW5pdEVDbGFzcyh4bWxOYW1lZFF1ZXJ5RUNsYXNzLCBYbWxOYW1lZFF1ZXJ5LmNsYXNzLCAiWG1sTmFtZWRRdWVyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAorCQlpbml0RUNsYXNzKHhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5jbGFzcywgIlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh4bWxPbmVUb01hbnlFQ2xhc3MsIFhtbE9uZVRvTWFueS5jbGFzcywgIlhtbE9uZVRvTWFueSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHhtbE9uZVRvT25lRUNsYXNzLCBYbWxPbmVUb09uZS5jbGFzcywgIlhtbE9uZVRvT25lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxPbmVUb09uZV9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpLCBudWxsLCAicHJpbWFyeUtleUpvaW5Db2x1bW5zIiwgbnVsbCwgMCwgLTEsIFhtbE9uZVRvT25lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sT3JkZXJDb2x1bW5FQ2xhc3MsIFhtbE9yZGVyQ29sdW1uLmNsYXNzLCAiWG1sT3JkZXJDb2x1bW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcywgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfU2NoZW1hKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2NoZW1hIiwgbnVsbCwgMCwgMSwgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0NhdGFsb2coKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjYXRhbG9nIiwgbnVsbCwgMCwgMSwgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0Nhc2NhZGVQZXJzaXN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImNhc2NhZGVQZXJzaXN0IiwgbnVsbCwgMCwgMSwgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0VudGl0eUxpc3RlbmVycygpLCB0aGlzLmdldEVudGl0eUxpc3RlbmVycygpLCBudWxsLCAiZW50aXR5TGlzdGVuZXJzIiwgbnVsbCwgMCwgMSwgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcywgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAieG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSwgdGhpcy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0RGVmYXVsdHMiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwogCQlpbml0RUNsYXNzKHBvc3RMb2FkRUNsYXNzLCBQb3N0TG9hZC5jbGFzcywgIlBvc3RMb2FkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCiAJCWluaXRFQ2xhc3MocG9zdFBlcnNpc3RFQ2xhc3MsIFBvc3RQZXJzaXN0LmNsYXNzLCAiUG9zdFBlcnNpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CkBAIC0xMTI2OCw0NiArMTAxMTAsMzYgQEAKIAogCQlpbml0RUNsYXNzKHByZVVwZGF0ZUVDbGFzcywgUHJlVXBkYXRlLmNsYXNzLCAiUHJlVXBkYXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCi0JCWluaXRFQ2xhc3MoeG1sUHJpbWFyeUtleUpvaW5Db2x1bW5FQ2xhc3MsIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uLmNsYXNzLCAiWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4iLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKHhtbFByaW1hcnlLZXlKb2luQ29sdW1uRUNsYXNzLCBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5jbGFzcywgIlhtbFByaW1hcnlLZXlKb2luQ29sdW1uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbl9SZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlZmVyZW5jZWRDb2x1bW5OYW1lIiwgbnVsbCwgMCwgMSwgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAKLQkJaW5pdEVDbGFzcyh4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGxFQ2xhc3MsIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbC5jbGFzcywgIlhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVDbGFzcyh4bWxRdWVyeUVDbGFzcywgWG1sUXVlcnkuY2xhc3MsICJYbWxRdWVyeSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgWG1sUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5X1F1ZXJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicXVlcnkiLCBudWxsLCAxLCAxLCBYbWxRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUXVlcnlfSGludHMoKSwgdGhpcy5nZXRYbWxRdWVyeUhpbnQoKSwgbnVsbCwgImhpbnRzIiwgbnVsbCwgMCwgLTEsIFhtbFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sUXVlcnlDb250YWluZXJFQ2xhc3MsIFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzLCAiWG1sUXVlcnlDb250YWluZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFF1ZXJpZXMoKSwgdGhpcy5nZXRYbWxOYW1lZFF1ZXJ5KCksIG51bGwsICJuYW1lZFF1ZXJpZXMiLCBudWxsLCAwLCAtMSwgWG1sUXVlcnlDb250YWluZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkTmF0aXZlUXVlcmllcygpLCB0aGlzLmdldFhtbE5hbWVkTmF0aXZlUXVlcnkoKSwgbnVsbCwgIm5hbWVkTmF0aXZlUXVlcmllcyIsIG51bGwsIDAsIC0xLCBYbWxRdWVyeUNvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAogCQlpbml0RUNsYXNzKHhtbFF1ZXJ5SGludEVDbGFzcywgWG1sUXVlcnlIaW50LmNsYXNzLCAiWG1sUXVlcnlIaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxRdWVyeUhpbnRfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBYbWxRdWVyeUhpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5SGludF9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMSwgMSwgWG1sUXVlcnlIaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCi0JCWluaXRFQ2xhc3MoYWJzdHJhY3RYbWxCYXNlVGFibGVFQ2xhc3MsIEFic3RyYWN0WG1sQmFzZVRhYmxlLmNsYXNzLCAiQWJzdHJhY3RYbWxCYXNlVGFibGUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEJhc2VUYWJsZUVDbGFzcywgWG1sQmFzZVRhYmxlLmNsYXNzLCAiWG1sQmFzZVRhYmxlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQmFzZVRhYmxlX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgWG1sQmFzZVRhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXNlVGFibGVfQ2F0YWxvZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNhdGFsb2ciLCBudWxsLCAwLCAxLCBYbWxCYXNlVGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEJhc2VUYWJsZV9TY2hlbWEoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzY2hlbWEiLCBudWxsLCAwLCAxLCBYbWxCYXNlVGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEJhc2VUYWJsZV9VbmlxdWVDb25zdHJhaW50cygpLCB0aGlzLmdldFhtbFVuaXF1ZUNvbnN0cmFpbnQoKSwgbnVsbCwgInVuaXF1ZUNvbnN0cmFpbnRzIiwgbnVsbCwgMCwgLTEsIFhtbEJhc2VUYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFRhYmxlRUNsYXNzLCBYbWxUYWJsZS5jbGFzcywgIlhtbFRhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sU2Vjb25kYXJ5VGFibGVFQ2xhc3MsIFhtbFNlY29uZGFyeVRhYmxlLmNsYXNzLCAiWG1sU2Vjb25kYXJ5VGFibGUiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKHhtbFNlY29uZGFyeVRhYmxlRUNsYXNzLCBYbWxTZWNvbmRhcnlUYWJsZS5jbGFzcywgIlhtbFNlY29uZGFyeVRhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCQlpbml0RVJlZmVyZW5jZShnZXRYbWxTZWNvbmRhcnlUYWJsZV9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpLCBudWxsLCAicHJpbWFyeUtleUpvaW5Db2x1bW5zIiwgbnVsbCwgMCwgLTEsIFhtbFNlY29uZGFyeVRhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCi0JCWluaXRFQ2xhc3MoeG1sU2Vjb25kYXJ5VGFibGVJbXBsRUNsYXNzLCBYbWxTZWNvbmRhcnlUYWJsZUltcGwuY2xhc3MsICJYbWxTZWNvbmRhcnlUYWJsZUltcGwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxHZW5lcmF0b3JFQ2xhc3MsIFhtbEdlbmVyYXRvci5jbGFzcywgIlhtbEdlbmVyYXRvciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEdlbmVyYXRvcl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFhtbEdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sR2VuZXJhdG9yX0luaXRpYWxWYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgImluaXRpYWxWYWx1ZSIsIG51bGwsIDAsIDEsIFhtbEdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sR2VuZXJhdG9yX0FsbG9jYXRpb25TaXplKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAiYWxsb2NhdGlvblNpemUiLCBudWxsLCAwLCAxLCBYbWxHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxTZXF1ZW5jZUdlbmVyYXRvckVDbGFzcywgWG1sU2VxdWVuY2VHZW5lcmF0b3IuY2xhc3MsICJYbWxTZXF1ZW5jZUdlbmVyYXRvciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQ2xhc3MoeG1sU2VxdWVuY2VHZW5lcmF0b3JFQ2xhc3MsIFhtbFNlcXVlbmNlR2VuZXJhdG9yLmNsYXNzLCAiWG1sU2VxdWVuY2VHZW5lcmF0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAJCWluaXRFQXR0cmlidXRlKGdldFhtbFNlcXVlbmNlR2VuZXJhdG9yX1NlcXVlbmNlTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNlcXVlbmNlTmFtZSIsIG51bGwsIDAsIDEsIFhtbFNlcXVlbmNlR2VuZXJhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCi0JCWluaXRFQ2xhc3MoeG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsRUNsYXNzLCBYbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwuY2xhc3MsICJYbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KIAkJaW5pdEVDbGFzcyhzcWxSZXN1bHRTZXRNYXBwaW5nRUNsYXNzLCBTcWxSZXN1bHRTZXRNYXBwaW5nLmNsYXNzLCAiU3FsUmVzdWx0U2V0TWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ19OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFNxbFJlc3VsdFNldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFUmVmZXJlbmNlKGdldFNxbFJlc3VsdFNldE1hcHBpbmdfRW50aXR5UmVzdWx0cygpLCB0aGlzLmdldEVudGl0eVJlc3VsdCgpLCBudWxsLCAiZW50aXR5UmVzdWx0cyIsIG51bGwsIDAsIC0xLCBTcWxSZXN1bHRTZXRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RVJlZmVyZW5jZShnZXRTcWxSZXN1bHRTZXRNYXBwaW5nX0NvbHVtblJlc3VsdHMoKSwgdGhpcy5nZXRDb2x1bW5SZXN1bHQoKSwgbnVsbCwgImNvbHVtblJlc3VsdHMiLCBudWxsLCAwLCAtMSwgU3FsUmVzdWx0U2V0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAotCQlpbml0RUNsYXNzKHhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLCBYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgIlhtbFRhYmxlR2VuZXJhdG9yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVDbGFzcyh4bWxUYWJsZUVDbGFzcywgWG1sVGFibGUuY2xhc3MsICJYbWxUYWJsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLCBYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgIlhtbFRhYmxlR2VuZXJhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxUYWJsZUdlbmVyYXRvcl9UYWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRhYmxlIiwgbnVsbCwgMCwgMSwgWG1sVGFibGVHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFQXR0cmlidXRlKGdldFhtbFRhYmxlR2VuZXJhdG9yX0NhdGFsb2coKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjYXRhbG9nIiwgbnVsbCwgMCwgMSwgWG1sVGFibGVHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFQXR0cmlidXRlKGdldFhtbFRhYmxlR2VuZXJhdG9yX1NjaGVtYSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNjaGVtYSIsIG51bGwsIDAsIDEsIFhtbFRhYmxlR2VuZXJhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwpAQCAtMTEzMTYsMTIgKzEwMTQ4LDE4IEBACiAJCWluaXRFQXR0cmlidXRlKGdldFhtbFRhYmxlR2VuZXJhdG9yX1BrQ29sdW1uVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwa0NvbHVtblZhbHVlIiwgbnVsbCwgMCwgMSwgWG1sVGFibGVHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFUmVmZXJlbmNlKGdldFhtbFRhYmxlR2VuZXJhdG9yX1VuaXF1ZUNvbnN0cmFpbnRzKCksIHRoaXMuZ2V0WG1sVW5pcXVlQ29uc3RyYWludCgpLCBudWxsLCAidW5pcXVlQ29uc3RyYWludHMiLCBudWxsLCAwLCAtMSwgWG1sVGFibGVHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAKLQkJaW5pdEVDbGFzcyh4bWxUYWJsZUdlbmVyYXRvckltcGxFQ2xhc3MsIFhtbFRhYmxlR2VuZXJhdG9ySW1wbC5jbGFzcywgIlhtbFRhYmxlR2VuZXJhdG9ySW1wbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVDbGFzcyh4bWxUcmFuc2llbnRFQ2xhc3MsIFhtbFRyYW5zaWVudC5jbGFzcywgIlhtbFRyYW5zaWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAotCQlpbml0RUNsYXNzKHhtbFVuaXF1ZUNvbnN0cmFpbnRFQ2xhc3MsIFhtbFVuaXF1ZUNvbnN0cmFpbnQuY2xhc3MsICJYbWxVbmlxdWVDb25zdHJhaW50IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVDbGFzcyh4bWxUeXBlTWFwcGluZ0VDbGFzcywgWG1sVHlwZU1hcHBpbmcuY2xhc3MsICJYbWxUeXBlTWFwcGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFR5cGVNYXBwaW5nX0NsYXNzTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNsYXNzTmFtZSIsIG51bGwsIDEsIDEsIFhtbFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxUeXBlTWFwcGluZ19NZXRhZGF0YUNvbXBsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgIm1ldGFkYXRhQ29tcGxldGUiLCBudWxsLCAwLCAxLCBYbWxUeXBlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVHlwZU1hcHBpbmdfRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFhtbFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxUeXBlTWFwcGluZ19BdHRyaWJ1dGVzKCksIHRoaXMuZ2V0QXR0cmlidXRlcygpLCBudWxsLCAiYXR0cmlidXRlcyIsIG51bGwsIDAsIDEsIFhtbFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sVW5pcXVlQ29uc3RyYWludEVDbGFzcywgWG1sVW5pcXVlQ29uc3RyYWludC5jbGFzcywgIlhtbFVuaXF1ZUNvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAJCWluaXRFQXR0cmlidXRlKGdldFhtbFVuaXF1ZUNvbnN0cmFpbnRfQ29sdW1uTmFtZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb2x1bW5OYW1lcyIsIG51bGwsIDEsIC0xLCBYbWxVbmlxdWVDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAotCQlpbml0RUNsYXNzKHhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsRUNsYXNzLCBYbWxVbmlxdWVDb25zdHJhaW50SW1wbC5jbGFzcywgIlhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKHhtbFZlcnNpb25FQ2xhc3MsIFhtbFZlcnNpb24uY2xhc3MsICJYbWxWZXJzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCiAJCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCiAJCWluaXRFRW51bShhY2Nlc3NUeXBlRUVudW0sIEFjY2Vzc1R5cGUuY2xhc3MsICJBY2Nlc3NUeXBlIik7CkBAIC0xMTM2MSw3ICsxMDE5OSw2IEBACiAJCWluaXRFRGF0YVR5cGUoZGlzY3JpbWluYXRvclZhbHVlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJEaXNjcmltaW5hdG9yVmFsdWUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCQlpbml0RURhdGFUeXBlKGVudW1lcmF0ZWRFRGF0YVR5cGUsIEVudW1lcmF0b3IuY2xhc3MsICJFbnVtZXJhdGVkIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJaW5pdEVEYXRhVHlwZShvcmRlckJ5RURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJPcmRlckJ5IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVEYXRhVHlwZSh2ZXJzaW9uVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiVmVyc2lvblR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCiAJCS8vIENyZWF0ZSByZXNvdXJjZQogCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKQEAgLTExMzgyLDU0ICsxMDIxOSwxOTYgQEAKIAlwdWJsaWMgaW50ZXJmYWNlIExpdGVyYWxzCiAJewogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyA8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+fScgY2xhc3MuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZworCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpCiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTlRJVFlfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxDb2x1bW4gPGVtPkFic3RyYWN0IFhtbCBDb2x1bW48L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxDb2x1bW4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbENvbHVtbigpCiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX01BUFBJTkdTX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1ZlcnNpb24oKTsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgQUJTVFJBQ1RfWE1MX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbENvbHVtbigpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfRGVzY3JpcHRpb24oKTsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEFCU1RSQUNUX1hNTF9DT0xVTU5fX0lOU0VSVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxDb2x1bW5fSW5zZXJ0YWJsZSgpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX0NPTFVNTl9fTlVMTEFCTEUgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxDb2x1bW5fTnVsbGFibGUoKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkJICogQGdlbmVyYXRlZAogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTlRJVFlfTUFQUElOR1NfX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGFja2FnZSgpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX0NPTFVNTl9fVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxDb2x1bW5fVGFibGUoKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkJICogQGdlbmVyYXRlZAogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTlRJVFlfTUFQUElOR1NfX1NDSEVNQSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19TY2hlbWEoKTsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEFCU1RSQUNUX1hNTF9DT0xVTU5fX1VOSVFVRSA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbENvbHVtbl9VbmlxdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVwZGF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX0NPTFVNTl9fVVBEQVRBQkxFID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sQ29sdW1uX1VwZGF0YWJsZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sRW1iZWRkZWQgPGVtPkFic3RyYWN0IFhtbCBFbWJlZGRlZDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEVtYmVkZGVkCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxFbWJlZGRlZCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEFCU1RSQUNUX1hNTF9FTUJFRERFRCA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbEVtYmVkZGVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPkFic3RyYWN0IFhtbCBNdWx0aSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZworCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9CWSA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19PcmRlckJ5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVkgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfTWFwS2V5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxOYW1lZENvbHVtbiA8ZW0+QWJzdHJhY3QgWG1sIE5hbWVkIENvbHVtbjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE5hbWVkQ29sdW1uCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sTmFtZWRDb2x1bW5fQ29sdW1uRGVmaW5pdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbE5hbWVkQ29sdW1uX05hbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPkFic3RyYWN0IFhtbCBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFkgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX1RhcmdldEVudGl0eSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0ggPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0ZldGNoKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREUgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPkFic3RyYWN0IFhtbCBTaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUFRJT05BTCA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfT3B0aW9uYWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlIDxlbT5BYnN0cmFjdCBYbWwgVGFibGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sVGFibGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBBQlNUUkFDVF9YTUxfVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxUYWJsZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX1RBQkxFX19OQU1FID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sVGFibGVfTmFtZSgpOwogCiAJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCkBAIC0xMTQzNywxMTUgKzEwNDE2LDcgQEAKIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0NhdGFsb2coKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0FjY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1NlcXVlbmNlR2VuZXJhdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1RhYmxlR2VuZXJhdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX05hbWVkUXVlcmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfTkFUSVZFX1FVRVJJRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfTmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19TcWxSZXN1bHRTZXRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIFN1cGVyY2xhc3NlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTX19NQVBQRURfU1VQRVJDTEFTU0VTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX01hcHBlZFN1cGVyY2xhc3NlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW50aXRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU19fRU5USVRJRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfRW50aXRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVtYmVkZGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfTUFQUElOR1NfX0VNQkVEREFCTEVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0VtYmVkZGFibGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WG1sIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURSA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9YbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFMgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBBQlNUUkFDVF9YTUxfVEFCTEVfX0NBVEFMT0cgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxUYWJsZV9DYXRhbG9nKCk7CiAKIAkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgpAQCAtMTE1NTMsMzkgKzEwNDI0LDE1IEBACiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX1NDSEVNQSA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19TY2hlbWEoKTsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEFCU1RSQUNUX1hNTF9UQUJMRV9fU0NIRU1BID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sVGFibGVfU2NoZW1hKCk7CiAKIAkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZSBDb25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FUQUxPRyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19DYXRhbG9nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQWNjZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIFBlcnNpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVNDQURFX1BFUlNJU1QgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQ2FzY2FkZVBlcnNpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19FTlRJVFlfTElTVEVORVJTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0VudGl0eUxpc3RlbmVycygpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQUJTVFJBQ1RfWE1MX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxUYWJsZV9VbmlxdWVDb25zdHJhaW50cygpOwogCiAJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcgPGVtPkFic3RyYWN0IFhtbCBUeXBlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgpAQCAtMTE1OTgsMTIgKzEwNDQ1LDE0IEBACiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZygpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzSG9sZGVyIDxlbT5YbWwgQWNjZXNzIEhvbGRlcjwvZW0+fScgY2xhc3MuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NIb2xkZXIKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NIb2xkZXIoKQogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRSA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0NsYXNzTmFtZSgpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQUNDRVNTX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NIb2xkZXIoKTsKIAogCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCkBAIC0xMTYxMSwxMzkgKzEwNDYwLDE3IEBACiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmdfQWNjZXNzKCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQUNDRVNTX0hPTERFUl9fQUNDRVNTID0gZUlOU1RBTkNFLmdldFhtbEFjY2Vzc0hvbGRlcl9BY2Nlc3MoKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZworCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEUgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19NZXRhZGF0YUNvbXBsZXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZ19EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUyA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQUEVEX1NVUEVSQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fSURfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19JZENsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlRGVmYXVsdExpc3RlbmVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0VudGl0eUxpc3RlbmVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlIFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1BFUlNJU1QgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19QcmVQZXJzaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9QRVJTSVNUID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFBlcnNpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZSBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1JFTU9WRSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1ByZVJlbW92ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9SRU1PVkUgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19Qb3N0UmVtb3ZlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9VUERBVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19QcmVVcGRhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfVVBEQVRFID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFVwZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfTE9BRCA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1Bvc3RMb2FkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5IDxlbT5YbWwgRW50aXR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTlRJVFkgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5KCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BVFRSSUJVVEVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7CiAKIAkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KQEAgLTExNzUxLDE5MSArMTA0NzgsMzUgQEAKIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9OYW1lKCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19OYW1lKCk7CiAKIAkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSA8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFID0gZUlOU1RBTkNFLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkJICogQGdlbmVyYXRlZAogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9UYWJsZSgpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfTmFtZSgpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2Vjb25kYXJ5IFRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIDxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgQ29udGFpbmVyPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkKIAkJICogQGdlbmVyYXRlZAogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX1NFQ09OREFSWV9UQUJMRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X1NlY29uZGFyeVRhYmxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZCBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fSURfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0lkQ2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaGVyaXRhbmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19JTkhFUklUQU5DRSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfSW5oZXJpdGFuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0Rpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9EaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9UYWJsZUdlbmVyYXRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19OQU1FRF9RVUVSSUVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9OYW1lZFF1ZXJpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9OYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9FbnRpdHlMaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZSBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19QUkVfUEVSU0lTVCA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfUHJlUGVyc2lzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19QT1NUX1BFUlNJU1QgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X1Bvc3RQZXJzaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19QUkVfUkVNT1ZFID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9QcmVSZW1vdmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19QT1NUX1JFTU9WRSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfUG9zdFJlbW92ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fUFJFX1VQREFURSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfUHJlVXBkYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fUE9TVF9VUERBVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X1Bvc3RVcGRhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgTG9hZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fUE9TVF9MT0FEID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9Qb3N0TG9hZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9BdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CiAKIAkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCkBAIC0xMTk0MywxNyArMTA1MTQsNTEgQEAKIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBlSU5TVEFOQ0UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl9Bc3NvY2lhdGlvbk92ZXJyaWRlcygpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUgPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT59JyBjbGFzcy4KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZSA8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZTwvZW0+fScgY2xhc3MuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZSgpCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKQogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU1CRUREQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlKCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BVFRSSUJVVEVfT1ZFUlJJREUgPSBlSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0FUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OID0gZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlX0NvbHVtbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0FUVFJJQlVURV9PVkVSUklERV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9OYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPGVtPlhtbCBBdHRyaWJ1dGUgT3ZlcnJpZGUgQ29udGFpbmVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQVRUUklCVVRFX09WRVJSSURFX0NPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQVRUUklCVVRFX09WRVJSSURFX0NPTlRBSU5FUl9fQVRUUklCVVRFX09WRVJSSURFUyA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl9BdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAogCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59JyBjbGFzcy4KQEAgLTEyMDQ2LDI1NCArMTA2NTEsNiBAQAogCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQVRUUklCVVRFU19fVFJBTlNJRU5UUyA9IGVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX1RyYW5zaWVudHMoKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQVRUUklCVVRFX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmdfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyA8ZW0+QWJzdHJhY3QgWG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZyA8ZW0+WG1sIE51bGwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxOdWxsQXR0cmlidXRlTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9OVUxMX0FUVFJJQlVURV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uTWFwcGluZyA8ZW0+Q29sdW1uIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uTWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENvbHVtbk1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBDT0xVTU5fTUFQUElORyA9IGVJTlNUQU5DRS5nZXRDb2x1bW5NYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIENPTFVNTl9NQVBQSU5HX19DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nIDxlbT5YbWwgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUkVMQVRJT05TSElQX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZID0gZUlOU1RBTkNFLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfVGFyZ2V0RW50aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSCA9IGVJTlNUQU5DRS5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0ZldGNoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19Kb2luVGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERSA9IGVJTlNUQU5DRS5nZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPlhtbCBNdWx0aSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQUEVEX0JZID0gZUlOU1RBTkNFLmdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBwZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQlkgPSBlSU5TVEFOQ0UuZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX09yZGVyQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWSA9IGVJTlNUQU5DRS5nZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfTWFwS2V5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyA8ZW0+WG1sIFNpbmdsZSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX09QVElPTkFMID0gZUlOU1RBTkNFLmdldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfT3B0aW9uYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlMgPSBlSU5TVEFOQ0UuZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19Kb2luQ29sdW1ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkIDxlbT5YbWwgSWQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxJZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9JRCA9IGVJTlNUQU5DRS5nZXRYbWxJZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGVkIFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfSURfX0dFTkVSQVRFRF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxJZF9HZW5lcmF0ZWRWYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9JRF9fVEVNUE9SQUwgPSBlSU5TVEFOQ0UuZ2V0WG1sSWRfVGVtcG9yYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0lEX19UQUJMRV9HRU5FUkFUT1IgPSBlSU5TVEFOQ0UuZ2V0WG1sSWRfVGFibGVHZW5lcmF0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBlSU5TVEFOQ0UuZ2V0WG1sSWRfU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZEltcGwgPGVtPlhtbCBJZCBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkSW1wbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9JRF9JTVBMID0gZUlOU1RBTkNFLmdldFhtbElkSW1wbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkJhc2VYbWxFbWJlZGRlZCA8ZW0+QmFzZSBYbWwgRW1iZWRkZWQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQmFzZVhtbEVtYmVkZGVkCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QmFzZVhtbEVtYmVkZGVkKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgQkFTRV9YTUxfRU1CRURERUQgPSBlSU5TVEFOQ0UuZ2V0QmFzZVhtbEVtYmVkZGVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEJBU0VfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gZUlOU1RBTkNFLmdldEJhc2VYbWxFbWJlZGRlZF9BdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkIDxlbT5YbWwgRW1iZWRkZWQgSWQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU1CRURERURfSUQgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWRJZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWRJbXBsIDxlbT5YbWwgRW1iZWRkZWQgSWQgSW1wbDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWRJbXBsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VNQkVEREVEX0lEX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWRJZEltcGwoKTsKLQotCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyA8ZW0+WG1sIEJhc2ljPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMjMyMCwyODQgKzEwNjc3LDYgQEAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVNJQ19fT1BUSU9OQUwgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfT3B0aW9uYWwoKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0JBU0lDX19MT0IgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfTG9iKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0JBU0lDX19URU1QT1JBTCA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY19UZW1wb3JhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0JBU0lDX19FTlVNRVJBVEVEID0gZUlOU1RBTkNFLmdldFhtbEJhc2ljX0VudW1lcmF0ZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0ltcGwgPGVtPlhtbCBCYXNpYyBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2ljSW1wbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVNJQ19JTVBMID0gZUlOU1RBTkNFLmdldFhtbEJhc2ljSW1wbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24gPGVtPlhtbCBWZXJzaW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxWZXJzaW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9WRVJTSU9OX19URU1QT1JBTCA9IGVJTlNUQU5DRS5nZXRYbWxWZXJzaW9uX1RlbXBvcmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbkltcGwgPGVtPlhtbCBWZXJzaW9uIEltcGw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxWZXJzaW9uSW1wbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9WRVJTSU9OX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0WG1sVmVyc2lvbkltcGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUgPGVtPlhtbCBNYW55IFRvIE9uZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9PbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFOWV9UT19PTkUgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvT25lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lSW1wbCA8ZW0+WG1sIE1hbnkgVG8gT25lIEltcGw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hbnlUb09uZUltcGwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFOWV9UT19PTkVfSU1QTCA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9PbmVJbXBsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55IDxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09ORV9UT19NQU5ZID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueV9Kb2luQ29sdW1ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueUltcGwgPGVtPlhtbCBPbmUgVG8gTWFueSBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb01hbnlJbXBsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09ORV9UT19NQU5ZX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55SW1wbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lIDxlbT5YbWwgT25lIFRvIE9uZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvT25lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09ORV9UT19PTkUgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9PbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWSA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb09uZV9NYXBwZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9PTkVfVE9fT05FX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9PbmVfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmVJbXBsIDxlbT5YbWwgT25lIFRvIE9uZSBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvT25lSW1wbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fT05FX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9PbmVJbXBsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSA8ZW0+WG1sIE1hbnkgVG8gTWFueTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQU5ZX1RPX01BTlkgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnlJbXBsIDxlbT5YbWwgTWFueSBUbyBNYW55IEltcGw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55SW1wbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQU5ZX1RPX01BTllfSU1QTCA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55SW1wbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkIDxlbT5YbWwgRW1iZWRkZWQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRlZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTUJFRERFRCA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSW1wbCA8ZW0+WG1sIEVtYmVkZGVkIEltcGw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRJbXBsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VNQkVEREVEX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWRJbXBsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IDxlbT5YbWwgVHJhbnNpZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRyYW5zaWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9UUkFOU0lFTlQgPSBlSU5TVEFOQ0UuZ2V0WG1sVHJhbnNpZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50SW1wbCA8ZW0+WG1sIFRyYW5zaWVudCBJbXBsPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUcmFuc2llbnRJbXBsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1RSQU5TSUVOVF9JTVBMID0gZUlOU1RBTkNFLmdldFhtbFRyYW5zaWVudEltcGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlIDxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREUgPSBlSU5TVEFOQ0UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9DT0xVTU5TID0gZUlOU1RBTkNFLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfSm9pbkNvbHVtbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCA8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlIEltcGw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMID0gZUlOU1RBTkNFLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUgPGVtPlhtbCBBdHRyaWJ1dGUgT3ZlcnJpZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BVFRSSUJVVEVfT1ZFUlJJREUgPSBlSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0FUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OID0gZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlX0NvbHVtbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0FUVFJJQlVURV9PVkVSUklERV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsIDxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlIEltcGw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FUVFJJQlVURV9PVkVSUklERV9JTVBMID0gZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpOwotCi0JCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlIDxlbT5DYXNjYWRlIFR5cGU8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTEyNjQ4LDExMCArMTA3MjcsMTQgQEAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIENBU0NBREVfVFlQRV9fQ0FTQ0FERV9SRUZSRVNIID0gZUlOU1RBTkNFLmdldENhc2NhZGVUeXBlX0Nhc2NhZGVSZWZyZXNoKCk7CiAKIAkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGVJbXBsIDxlbT5DYXNjYWRlIFR5cGUgSW1wbDwvZW0+fScgY2xhc3MuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sbGVjdGlvblRhYmxlIDxlbT5YbWwgQ29sbGVjdGlvbiBUYWJsZTwvZW0+fScgY2xhc3MuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDYXNjYWRlVHlwZUltcGwoKQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uVGFibGUoKQogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBDQVNDQURFX1RZUEVfSU1QTCA9IGVJTlNUQU5DRS5nZXRDYXNjYWRlVHlwZUltcGwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbHVtbiA8ZW0+WG1sIE5hbWVkIENvbHVtbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbHVtbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29sdW1uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX05BTUVEX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZENvbHVtbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkQ29sdW1uX0NvbHVtbkRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9OQU1FRF9DT0xVTU5fX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRDb2x1bW5fTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTmFtZWRDb2x1bW4gPGVtPkFic3RyYWN0IFhtbCBOYW1lZCBDb2x1bW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxOYW1lZENvbHVtbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sTmFtZWRDb2x1bW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sTmFtZWRDb2x1bW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiA8ZW0+WG1sIEFic3RyYWN0IENvbHVtbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFic3RyYWN0Q29sdW1uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FCU1RSQUNUX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxBYnN0cmFjdENvbHVtbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0FCU1RSQUNUX0NPTFVNTl9fSU5TRVJUQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxBYnN0cmFjdENvbHVtbl9JbnNlcnRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0FCU1RSQUNUX0NPTFVNTl9fTlVMTEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQWJzdHJhY3RDb2x1bW5fTnVsbGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQUJTVFJBQ1RfQ09MVU1OX19UQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxBYnN0cmFjdENvbHVtbl9UYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQUJTVFJBQ1RfQ09MVU1OX19VTklRVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQWJzdHJhY3RDb2x1bW5fVW5pcXVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9BQlNUUkFDVF9DT0xVTU5fX1VQREFUQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxBYnN0cmFjdENvbHVtbl9VcGRhdGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uIDxlbT5BYnN0cmFjdCBYbWwgQWJzdHJhY3QgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgQUJTVFJBQ1RfWE1MX0FCU1RSQUNUX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbEFic3RyYWN0Q29sdW1uKCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT0xMRUNUSU9OX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25UYWJsZSgpOwogCiAJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiA8ZW0+WG1sIENvbHVtbjwvZW0+fScgY2xhc3MuCkBAIC0xMjc4OCwxNCArMTA3NzEsMjIgQEAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT0xVTU5fX1NDQUxFID0gZUlOU1RBTkNFLmdldFhtbENvbHVtbl9TY2FsZSgpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbkltcGwgPGVtPlhtbCBDb2x1bW4gSW1wbDwvZW0+fScgY2xhc3MuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uTWFwcGluZyA8ZW0+Q29sdW1uIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbHVtbkltcGwoKQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q29sdW1uTWFwcGluZygpCiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT0xVTU5fSU1QTCA9IGVJTlNUQU5DRS5nZXRYbWxDb2x1bW5JbXBsKCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIENPTFVNTl9NQVBQSU5HID0gZUlOU1RBTkNFLmdldENvbHVtbk1hcHBpbmcoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQ09MVU1OX01BUFBJTkdfX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpOwogCiAJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtblJlc3VsdCA8ZW0+Q29sdW1uIFJlc3VsdDwvZW0+fScgY2xhc3MuCkBAIC0xMjgxNiw2ICsxMDgwNyw0MCBAQAogCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQ09MVU1OX1JFU1VMVF9fTkFNRSA9IGVJTlNUQU5DRS5nZXRDb2x1bW5SZXN1bHRfTmFtZSgpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyA8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19MT0IgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0xvYigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19URU1QT1JBTCA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfVGVtcG9yYWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19FTlVNRVJBVEVEID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19FbnVtZXJhdGVkKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlzY3JpbWluYXRvckNvbHVtbiA8ZW0+WG1sIERpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMjg0MiwyMiArMTA4NjcsMTUwIEBACiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0xFTkdUSCA9IGVJTlNUQU5DRS5nZXRYbWxEaXNjcmltaW5hdG9yQ29sdW1uX0xlbmd0aCgpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVycyA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fScgY2xhc3MuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24gPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb248L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXJzCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW50aXR5TGlzdGVuZXJzKCkKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbigpCiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEVOVElUWV9MSVNURU5FUlMgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5TGlzdGVuZXJzKCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTEVNRU5UX0NPTExFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb24oKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSA8ZW0+WG1sIEVtYmVkZGFibGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGFibGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU1CRUREQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQgPGVtPlhtbCBFbWJlZGRlZDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VNQkVEREVEID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZCA8ZW0+WG1sIEVtYmVkZGVkIElkPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRlZElkKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VNQkVEREVEX0lEID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGVkSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkgPGVtPlhtbCBFbnRpdHk8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VOVElUWSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkJICogQGdlbmVyYXRlZAogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEVOVElUWV9MSVNURU5FUlNfX0VOVElUWV9MSVNURU5FUlMgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5TGlzdGVuZXJzX0VudGl0eUxpc3RlbmVycygpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9UYWJsZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2Vjb25kYXJ5IFRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19TRUNPTkRBUllfVEFCTEVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9TZWNvbmRhcnlUYWJsZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X1ByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX0lEX0NMQVNTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9JZENsYXNzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbmhlcml0YW5jZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0UgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0luaGVyaXRhbmNlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9EaXNjcmltaW5hdG9yVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfRGlzY3JpbWluYXRvckNvbHVtbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X1NxbFJlc3VsdFNldE1hcHBpbmdzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9FeGNsdWRlRGVmYXVsdExpc3RlbmVycygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0VudGl0eUxpc3RlbmVycygpOwogCiAJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyIDxlbT5FbnRpdHkgTGlzdGVuZXI8L2VtPn0nIGNsYXNzLgpAQCAtMTI4NzgsNjAgKzExMDMxLDEyMCBAQAogCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgRU5USVRZX0xJU1RFTkVSX19DTEFTU19OQU1FID0gZUlOU1RBTkNFLmdldEVudGl0eUxpc3RlbmVyX0NsYXNzTmFtZSgpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlIFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVycyA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fScgY2xhc3MuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcnMoKQogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgRU5USVRZX0xJU1RFTkVSX19QUkVfUEVSU0lTVCA9IGVJTlNUQU5DRS5nZXRFbnRpdHlMaXN0ZW5lcl9QcmVQZXJzaXN0KCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEVOVElUWV9MSVNURU5FUlMgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5TGlzdGVuZXJzKCk7CiAKIAkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBFTlRJVFlfTElTVEVORVJfX1BPU1RfUEVSU0lTVCA9IGVJTlNUQU5DRS5nZXRFbnRpdHlMaXN0ZW5lcl9Qb3N0UGVyc2lzdCgpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgRU5USVRZX0xJU1RFTkVSU19fRU5USVRZX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlMaXN0ZW5lcnNfRW50aXR5TGlzdGVuZXJzKCk7CiAKIAkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyA8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+fScgY2xhc3MuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncworCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKIAkJICogQGdlbmVyYXRlZAogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEVOVElUWV9MSVNURU5FUl9fUFJFX1JFTU9WRSA9IGVJTlNUQU5DRS5nZXRFbnRpdHlMaXN0ZW5lcl9QcmVSZW1vdmUoKTsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VOVElUWV9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5ncygpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkJICogQGdlbmVyYXRlZAogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEVOVElUWV9MSVNURU5FUl9fUE9TVF9SRU1PVkUgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5TGlzdGVuZXJfUG9zdFJlbW92ZSgpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfRGVzY3JpcHRpb24oKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZSBVcGRhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgRU5USVRZX0xJU1RFTkVSX19QUkVfVVBEQVRFID0gZUlOU1RBTkNFLmdldEVudGl0eUxpc3RlbmVyX1ByZVVwZGF0ZSgpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBVcGRhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgRU5USVRZX0xJU1RFTkVSX19QT1NUX1VQREFURSA9IGVJTlNUQU5DRS5nZXRFbnRpdHlMaXN0ZW5lcl9Qb3N0VXBkYXRlKCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1BhY2thZ2UoKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgTG9hZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkJICogQGdlbmVyYXRlZAogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEVOVElUWV9MSVNURU5FUl9fUE9TVF9MT0FEID0gZUlOU1RBTkNFLmdldEVudGl0eUxpc3RlbmVyX1Bvc3RMb2FkKCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX01BUFBJTkdTX19TQ0hFTUEgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfU2NoZW1hKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0NhdGFsb2coKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU19fU0VRVUVOQ0VfR0VORVJBVE9SUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19TZXF1ZW5jZUdlbmVyYXRvcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU19fVEFCTEVfR0VORVJBVE9SUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19UYWJsZUdlbmVyYXRvcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfTUFQUElOR1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1NxbFJlc3VsdFNldE1hcHBpbmdzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgU3VwZXJjbGFzc2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfTUFQUElOR1NfX01BUFBFRF9TVVBFUkNMQVNTRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfTWFwcGVkU3VwZXJjbGFzc2VzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnRpdGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTX19FTlRJVElFUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19FbnRpdGllcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW1iZWRkYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU19fRU1CRUREQUJMRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfRW1iZWRkYWJsZXMoKTsKIAogCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlSZXN1bHQgPGVtPkVudGl0eSBSZXN1bHQ8L2VtPn0nIGNsYXNzLgpAQCAtMTI5NjgsNiArMTExODEsOTAgQEAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEVOVElUWV9SRVNVTFRfX0ZJRUxEX1JFU1VMVFMgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5UmVzdWx0X0ZpZWxkUmVzdWx0cygpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkV2ZW50TWV0aG9kIDxlbT5FdmVudCBNZXRob2Q8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRXZlbnRNZXRob2QKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFdmVudE1ldGhvZCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEVWRU5UX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRFdmVudE1ldGhvZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RXZlbnRNZXRob2RfTWV0aG9kTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyIDxlbT5YbWwgRXZlbnQgTWV0aG9kIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lcgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZSBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUFJFX1BFUlNJU1QgPSBlSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUHJlUGVyc2lzdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9QRVJTSVNUID0gZUlOU1RBTkNFLmdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RQZXJzaXN0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUFJFX1JFTU9WRSA9IGVJTlNUQU5DRS5nZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVSZW1vdmUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9SRU1PVkUgPSBlSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFJlbW92ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BSRV9VUERBVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUHJlVXBkYXRlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfVVBEQVRFID0gZUlOU1RBTkNFLmdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RVcGRhdGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgTG9hZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfTE9BRCA9IGVJTlNUQU5DRS5nZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0TG9hZCgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZpZWxkUmVzdWx0IDxlbT5GaWVsZCBSZXN1bHQ8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTEzMDIwLDE0ICsxMTMxNyw4MiBAQAogCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0dFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1kgPSBlSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdGVkVmFsdWVfU3RyYXRlZ3koKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZUltcGwgPGVtPlhtbCBHZW5lcmF0ZWQgVmFsdWUgSW1wbDwvZW0+fScgY2xhc3MuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yIDxlbT5YbWwgR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRlZFZhbHVlSW1wbCgpCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvcgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcigpCiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9HRU5FUkFURURfVkFMVUVfSU1QTCA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0ZWRWYWx1ZUltcGwoKTsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9HRU5FUkFUT1JfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yX05hbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yX0luaXRpYWxWYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWxsb2NhdGlvbiBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkUgPSBlSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yX0FsbG9jYXRpb25TaXplKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyIDxlbT5YbWwgR2VuZXJhdG9yIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3JDb250YWluZXIKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JDb250YWluZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfR0VORVJBVE9SX0NPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JDb250YWluZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JDb250YWluZXJfU2VxdWVuY2VHZW5lcmF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JDb250YWluZXJfVGFibGVHZW5lcmF0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCA8ZW0+WG1sIElkPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSWQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSUQgPSBlSU5TVEFOQ0UuZ2V0WG1sSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0lEX19HRU5FUkFURURfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sSWRfR2VuZXJhdGVkVmFsdWUoKTsKIAogCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzIDxlbT5YbWwgSWQgQ2xhc3M8L2VtPn0nIGNsYXNzLgpAQCAtMTMwODQsMTQgKzExNDQ5LDIyIEBACiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sSm9pbkNvbHVtbl9SZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW5JbXBsIDxlbT5YbWwgSm9pbiBDb2x1bW4gSW1wbDwvZW0+fScgY2xhc3MuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbnNNYXBwaW5nIDxlbT5YbWwgSm9pbiBDb2x1bW5zIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxKb2luQ29sdW1uSW1wbCgpCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW5zTWFwcGluZworCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5Db2x1bW5zTWFwcGluZygpCiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9KT0lOX0NPTFVNTl9JTVBMID0gZUlOU1RBTkNFLmdldFhtbEpvaW5Db2x1bW5JbXBsKCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9KT0lOX0NPTFVNTlNfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRYbWxKb2luQ29sdW1uc01hcHBpbmcoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfSk9JTl9DT0xVTU5TX01BUFBJTkdfX0pPSU5fQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxKb2luQ29sdW1uc01hcHBpbmdfSm9pbkNvbHVtbnMoKTsKIAogCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUgPGVtPlhtbCBKb2luIFRhYmxlPC9lbT59JyBjbGFzcy4KQEAgLTEzMTIwLDE0ICsxMTQ5MywyMiBAQAogCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0pPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TID0gZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZV9JbnZlcnNlSm9pbkNvbHVtbnMoKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVJbXBsIDxlbT5YbWwgSm9pbiBUYWJsZSBJbXBsPC9lbT59JyBjbGFzcy4KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVNYXBwaW5nIDxlbT5YbWwgSm9pbiBUYWJsZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxKb2luVGFibGVJbXBsKCkKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlTWFwcGluZworCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZU1hcHBpbmcoKQogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSk9JTl9UQUJMRV9JTVBMID0gZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZUltcGwoKTsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0pPSU5fVEFCTEVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRYbWxKb2luVGFibGVNYXBwaW5nKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfSk9JTl9UQUJMRV9NQVBQSU5HX19KT0lOX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZU1hcHBpbmdfSm9pblRhYmxlKCk7CiAKIAkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTG9iIDxlbT5Mb2I8L2VtPn0nIGNsYXNzLgpAQCAtMTMxNDAsNiArMTE1MjEsMjYgQEAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgTE9CID0gZUlOU1RBTkNFLmdldExvYigpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkgPGVtPlhtbCBNYW55IFRvIE1hbnk8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hbnlUb01hbnkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFOWV9UT19NQU5ZID0gZUlOU1RBTkNFLmdldFhtbE1hbnlUb01hbnkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUgPGVtPlhtbCBNYW55IFRvIE9uZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9PbmUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFOWV9UT19PTkUgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvT25lKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5IDxlbT5NYXAgS2V5PC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMzE1OCw0OCArMTE1NTksNzQgQEAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIE1BUF9LRVlfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TWFwS2V5X05hbWUoKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXlJbXBsIDxlbT5NYXAgS2V5IEltcGw8L2VtPn0nIGNsYXNzLgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcEtleUNsYXNzIDxlbT5YbWwgTWFwIEtleSBDbGFzczwvZW0+fScgY2xhc3MuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0TWFwS2V5SW1wbCgpCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcEtleUNsYXNzCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwS2V5Q2xhc3MoKQogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBNQVBfS0VZX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0TWFwS2V5SW1wbCgpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQX0tFWV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBLZXlDbGFzcygpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5IDxlbT5YbWwgUXVlcnk8L2VtPn0nIGNsYXNzLgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZEJ5TWFwcGluZyA8ZW0+WG1sIE1hcHBlZCBCeSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnkoKQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRCeU1hcHBpbmcKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRCeU1hcHBpbmcoKQogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUVVFUlkgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnkoKTsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BUFBFRF9CWV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZEJ5TWFwcGluZygpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkJICogQGdlbmVyYXRlZAogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9RVUVSWV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeV9OYW1lKCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFQUEVEX0JZX01BUFBJTkdfX01BUFBFRF9CWSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRCeU1hcHBpbmdfTWFwcGVkQnkoKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcworCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX19RVUVSWSA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeV9RdWVyeSgpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQUEVEX1NVUEVSQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZCBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCQkgKiBAZ2VuZXJhdGVkCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1FVRVJZX19ISU5UUyA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeV9IaW50cygpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JRF9DTEFTUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0lkQ2xhc3MoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIFN1cGVyY2xhc3MgTGlzdGVuZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FTlRJVFlfTElTVEVORVJTID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRW50aXR5TGlzdGVuZXJzKCk7CiAKIAkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeSA8ZW0+WG1sIE5hbWVkIE5hdGl2ZSBRdWVyeTwvZW0+fScgY2xhc3MuCkBAIC0xMzIzOCwyMiArMTE2NjUsMTIwIEBACiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9OQU1FRF9RVUVSWSA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFF1ZXJ5KCk7CiAKIAkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRXZlbnRNZXRob2QgPGVtPkV2ZW50IE1ldGhvZDwvZW0+fScgY2xhc3MuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgPGVtPlhtbCBOdWxsIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkV2ZW50TWV0aG9kCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RXZlbnRNZXRob2QoKQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZworCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKCkKIAkJICogQGdlbmVyYXRlZAogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgRVZFTlRfTUVUSE9EID0gZUlOU1RBTkNFLmdldEV2ZW50TWV0aG9kKCk7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9OVUxMX0FUVFJJQlVURV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKCk7CiAKIAkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55IDxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09ORV9UT19NQU5ZID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lIDxlbT5YbWwgT25lIFRvIE9uZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvT25lKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09ORV9UT19PTkUgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9PbmUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBFVkVOVF9NRVRIT0RfX01FVEhPRF9OQU1FID0gZUlOU1RBTkNFLmdldEV2ZW50TWV0aG9kX01ldGhvZE5hbWUoKTsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9PTkVfVE9fT05FX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9PbmVfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4gPGVtPlhtbCBPcmRlciBDb2x1bW48L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PUkRFUl9DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0WG1sT3JkZXJDb2x1bW4oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19TQ0hFTUEgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfU2NoZW1hKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FUQUxPRyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19DYXRhbG9nKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIFBlcnNpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVNDQURFX1BFUlNJU1QgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQ2FzY2FkZVBlcnNpc3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19FTlRJVFlfTElTVEVORVJTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0VudGl0eUxpc3RlbmVycygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhtbCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CiAKIAkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uUG9zdExvYWQgPGVtPlBvc3QgTG9hZDwvZW0+fScgY2xhc3MuCkBAIC0xMzM0NCwxNCArMTE4NjksNjQgQEAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbl9SZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCA8ZW0+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uIEltcGw8L2VtPn0nIGNsYXNzLgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5IDxlbT5YbWwgUXVlcnk8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsKCkKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnkKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeSgpCiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9JTVBMID0gZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUVVFUlkgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9RVUVSWV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeV9OYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5RdWVyeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX19RVUVSWSA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeV9RdWVyeSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1FVRVJZX19ISU5UUyA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeV9IaW50cygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyIDxlbT5YbWwgUXVlcnkgQ29udGFpbmVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUVVFUllfQ09OVEFJTkVSID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5Q29udGFpbmVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX1FVRVJJRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRRdWVyaWVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9OQVRJVkVfUVVFUklFUyA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAogCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQgPGVtPlhtbCBRdWVyeSBIaW50PC9lbT59JyBjbGFzcy4KQEAgLTEzMzgwLDY4ICsxMTk1NSw2IEBACiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUVVFUllfSElOVF9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlIaW50X1ZhbHVlKCk7CiAKIAkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxCYXNlVGFibGUgPGVtPkFic3RyYWN0IFhtbCBCYXNlIFRhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQmFzZVRhYmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxCYXNlVGFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBBQlNUUkFDVF9YTUxfQkFTRV9UQUJMRSA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbEJhc2VUYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VUYWJsZSA8ZW0+WG1sIEJhc2UgVGFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZVRhYmxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0JBU0VfVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzZVRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQkFTRV9UQUJMRV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxCYXNlVGFibGVfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0JBU0VfVEFCTEVfX0NBVEFMT0cgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzZVRhYmxlX0NhdGFsb2coKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0JBU0VfVEFCTEVfX1NDSEVNQSA9IGVJTlNUQU5DRS5nZXRYbWxCYXNlVGFibGVfU2NoZW1hKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0JBU0VfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUyA9IGVJTlNUQU5DRS5nZXRYbWxCYXNlVGFibGVfVW5pcXVlQ29uc3RyYWludHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZSA8ZW0+WG1sIFRhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sVGFibGUoKTsKLQotCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZSA8ZW0+WG1sIFNlY29uZGFyeSBUYWJsZTwvZW0+fScgY2xhc3MuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMTM0NjAsNTAgKzExOTczLDYgQEAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9TRUNPTkRBUllfVEFCTEVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxTZWNvbmRhcnlUYWJsZV9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZUltcGwgPGVtPlhtbCBTZWNvbmRhcnkgVGFibGUgSW1wbDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTZWNvbmRhcnlUYWJsZUltcGwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfU0VDT05EQVJZX1RBQkxFX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0WG1sU2Vjb25kYXJ5VGFibGVJbXBsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yIDxlbT5YbWwgR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9HRU5FUkFUT1IgPSBlSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfR0VORVJBVE9SX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvcl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFID0gZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvcl9Jbml0aWFsVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsbG9jYXRpb24gU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFID0gZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvcl9BbGxvY2F0aW9uU2l6ZSgpOwotCi0JCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yIDxlbT5YbWwgU2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMzUyMiwxNiArMTE5OTEsNiBAQAogCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0VRVUVOQ0VfTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl9TZXF1ZW5jZU5hbWUoKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwgPGVtPlhtbCBTZXF1ZW5jZSBHZW5lcmF0b3IgSW1wbDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCk7Ci0KLQkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZyA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZzwvZW0+fScgY2xhc3MuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMTM1NjYsNiArMTIwMjUsMTYgQEAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0NPTFVNTl9SRVNVTFRTID0gZUlOU1RBTkNFLmdldFNxbFJlc3VsdFNldE1hcHBpbmdfQ29sdW1uUmVzdWx0cygpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlIDxlbT5YbWwgVGFibGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUYWJsZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9UQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxUYWJsZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yIDxlbT5YbWwgVGFibGUgR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMzYzMiwxNCArMTIxMDEsNTYgQEAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9UQUJMRV9HRU5FUkFUT1JfX1VOSVFVRV9DT05TVFJBSU5UUyA9IGVJTlNUQU5DRS5nZXRYbWxUYWJsZUdlbmVyYXRvcl9VbmlxdWVDb25zdHJhaW50cygpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9ySW1wbCA8ZW0+WG1sIFRhYmxlIEdlbmVyYXRvciBJbXBsPC9lbT59JyBjbGFzcy4KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQgPGVtPlhtbCBUcmFuc2llbnQ8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JJbXBsKCkKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVHJhbnNpZW50KCkKIAkJICogQGdlbmVyYXRlZAogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMID0gZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9ySW1wbCgpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVFJBTlNJRU5UID0gZUlOU1RBTkNFLmdldFhtbFRyYW5zaWVudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nIDxlbT5YbWwgVHlwZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVHlwZU1hcHBpbmcoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVFlQRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbFR5cGVNYXBwaW5nKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFR5cGVNYXBwaW5nX0NsYXNzTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFID0gZUlOU1RBTkNFLmdldFhtbFR5cGVNYXBwaW5nX01ldGFkYXRhQ29tcGxldGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxUeXBlTWFwcGluZ19EZXNjcmlwdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUyA9IGVJTlNUQU5DRS5nZXRYbWxUeXBlTWFwcGluZ19BdHRyaWJ1dGVzKCk7CiAKIAkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludCA8ZW0+WG1sIFVuaXF1ZSBDb25zdHJhaW50PC9lbT59JyBjbGFzcy4KQEAgLTEzNjYwLDE0ICsxMjE3MSwxNCBAQAogCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1VOSVFVRV9DT05TVFJBSU5UX19DT0xVTU5fTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sVW5pcXVlQ29uc3RyYWludF9Db2x1bW5OYW1lcygpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsIDxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQgSW1wbDwvZW0+fScgY2xhc3MuCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiA8ZW0+WG1sIFZlcnNpb248L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxWZXJzaW9uKCkKIAkJICogQGdlbmVyYXRlZAogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1VOSVFVRV9DT05TVFJBSU5UX0lNUEwgPSBlSU5TVEFOQ0UuZ2V0WG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sVmVyc2lvbigpOwogCiAJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUgPGVtPkFjY2VzcyBUeXBlPC9lbT59JyBlbnVtLgpAQCAtMTM3NjksMTYgKzEyMjgwLDYgQEAKIAkJICovCiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgRURhdGFUeXBlIE9SREVSX0JZID0gZUlOU1RBTkNFLmdldE9yZGVyQnkoKTsKIAotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlZlcnNpb24gVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRWZXJzaW9uVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRURhdGFUeXBlIFZFUlNJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRWZXJzaW9uVHlwZSgpOwotCiAJfQogCiB9IC8vT3JtUGFja2FnZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Pcm1SZXNvdXJjZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Pcm1SZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjAxOTljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vT3JtUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9ycy5FbnRpdHlNYXBwaW5nc1RyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgT3JtUmVzb3VyY2UgZXh0ZW5kcyBKcGFYbWxSZXNvdXJjZSAKLXsKLQlwdWJsaWMgT3JtUmVzb3VyY2UoUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0JCXN1cGVyKGFSZW5kZXJlcik7Ci0JfQotCi0JcHVibGljIE9ybVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0JfQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gRW50aXR5TWFwcGluZ3NUcmFuc2xhdG9yLklOU1RBTkNFOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBUT0RPCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21SZXNvdXJjZSgpIHsKLQkJLy8gVE9ETwotCX0KLQkKLQlwdWJsaWMgWG1sRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoWG1sRW50aXR5TWFwcGluZ3MpIGdldFJvb3RPYmplY3QoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybVJlc291cmNlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Pcm1SZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3ZTk1MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybVJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1SZXNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5Ci17Ci0JcHVibGljIE9ybVJlc291cmNlRmFjdG9yeSgpIHsKLQkJdGhpcyhSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIE9ybVJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIE9ybVJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSwgYm9vbGVhbiBsaXN0ZW5pbmdGb3JVcGRhdGVzKSB7Ci0JCXN1cGVyKGFSZW5kZXJlckZhY3RvcnksIGxpc3RlbmluZ0ZvclVwZGF0ZXMpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2UoVVJJLCBSZW5kZXJlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXJldHVybiBuZXcgT3JtUmVzb3VyY2UodXJpLCByZW5kZXJlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Pcm1SZXNvdXJjZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybVJlc291cmNlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyYzlmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybVJlc291cmNlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhWG1sUmVzb3VyY2VNb2RlbDsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1SZXNvdXJjZU1vZGVsIGV4dGVuZHMgSnBhWG1sUmVzb3VyY2VNb2RlbAotewotCXB1YmxpYyBPcm1SZXNvdXJjZU1vZGVsKElGaWxlIGZpbGUpIHsKLQkJc3VwZXIoZmlsZSk7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VNb2RlbCNnZXRSZXNvdXJjZVR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VNb2RlbC5PUk1fUkVTT1VSQ0VfVFlQRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybUFydGlmYWN0RWRpdCBidWlsZEFydGlmYWN0RWRpdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBPcm1BcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gKE9ybVJlc291cmNlKSBzdXBlci5nZXRSZXNvdXJjZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vT3JtWG1sUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybVhtbFJlc291cmNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOTg2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL09ybVhtbFJlc291cmNlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3Rvcnk7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBPcm1YbWxSZXNvdXJjZUZhY3RvcnkKKwlleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkKK3sKKwlwdWJsaWMgT3JtWG1sUmVzb3VyY2VGYWN0b3J5KCkgeworCQl0aGlzKFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpOworCX0KKwkKKwlwdWJsaWMgT3JtWG1sUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFSZW5kZXJlckZhY3RvcnkpOworCX0KKwkKKwlwdWJsaWMgT3JtWG1sUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5LCBib29sZWFuIGxpc3RlbmluZ0ZvclVwZGF0ZXMpIHsKKwkJc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSwgbGlzdGVuaW5nRm9yVXBkYXRlcyk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgcmVuZGVyZXIpIHsKKwkJcmV0dXJuIG5ldyBKcGFYbWxSZXNvdXJjZSh1cmksIHJlbmRlcmVyLCBKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLCBYbWxFbnRpdHlNYXBwaW5ncy5nZXRSb290VHJhbnNsYXRvcigpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RMb2FkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RMb2FkLmphdmEKaW5kZXggOTg0MTlhMy4uNWU2OGFkZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Qb3N0TG9hZC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vUG9zdExvYWQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw2ICsxMCw5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNDksNSArNTIsMTcgQEAKIAl7CiAJCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlBPU1RfTE9BRDsKIAl9Ci0KLX0gLy8gUG9zdExvYWQKKwkKKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKwkKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gYnVpbGRUcmFuc2xhdG9yKAorCQkJSlBBLlBPU1RfTE9BRCwKKwkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RMb2FkKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vUG9zdFBlcnNpc3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vUG9zdFBlcnNpc3QuamF2YQppbmRleCA1NWFjOGYwLi5mZTg4ZGU0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RQZXJzaXN0LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Qb3N0UGVyc2lzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDYgKzEwLDkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC00OSw1ICs1MiwxNyBAQAogCXsKIAkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuUE9TVF9QRVJTSVNUOwogCX0KLQotfSAvLyBQb3N0UGVyc2lzdAorCQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBidWlsZFRyYW5zbGF0b3IoCisJCQlKUEEuUE9TVF9QRVJTSVNULAorCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFBlcnNpc3QoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Qb3N0UmVtb3ZlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RSZW1vdmUuamF2YQppbmRleCBkOWE2OGEwLi4wOWQzOTc0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RSZW1vdmUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RSZW1vdmUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw2ICsxMCw5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNDksNSArNTIsMTcgQEAKIAl7CiAJCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlBPU1RfUkVNT1ZFOwogCX0KLQotfSAvLyBQb3N0UmVtb3ZlCisJCisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisJCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIGJ1aWxkVHJhbnNsYXRvcigKKwkJCUpQQS5QT1NUX1JFTU9WRSwKKwkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RSZW1vdmUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9Qb3N0VXBkYXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RVcGRhdGUuamF2YQppbmRleCBjYmQ2MTdlLi4zNDc0YjI1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RVcGRhdGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RVcGRhdGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw2ICsxMCw5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNDksNSArNTIsMTcgQEAKIAl7CiAJCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlBPU1RfVVBEQVRFOwogCX0KLQotfSAvLyBQb3N0VXBkYXRlCisJCisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisJCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIGJ1aWxkVHJhbnNsYXRvcigKKwkJCUpQQS5QT1NUX1VQREFURSwKKwkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RVcGRhdGUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9QcmVQZXJzaXN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1ByZVBlcnNpc3QuamF2YQppbmRleCA0NjFjYWVjLi45ZDczNjJkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1ByZVBlcnNpc3QuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1ByZVBlcnNpc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw2ICsxMCw5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNDksNSArNTIsMTcgQEAKIAl7CiAJCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlBSRV9QRVJTSVNUOwogCX0KLQotfSAvLyBQcmVQZXJzaXN0CisJCisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisJCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIGJ1aWxkVHJhbnNsYXRvcigKKwkJCUpQQS5QUkVfUEVSU0lTVCwKKwkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1ByZVBlcnNpc3QoKSk7CisJfQkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vUHJlUmVtb3ZlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1ByZVJlbW92ZS5qYXZhCmluZGV4IDgxMDM1ODMuLjY4ZGQ2M2YgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vUHJlUmVtb3ZlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9QcmVSZW1vdmUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw2ICsxMCw5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNDksNSArNTIsMTcgQEAKIAl7CiAJCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlBSRV9SRU1PVkU7CiAJfQotCi19IC8vIFByZVJlbW92ZQorCQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBidWlsZFRyYW5zbGF0b3IoCisJCQlKUEEuUFJFX1JFTU9WRSwKKwkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1ByZVJlbW92ZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1ByZVVwZGF0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9QcmVVcGRhdGUuamF2YQppbmRleCAwMWNkZmY1Li5kNGUzZWQxIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1ByZVVwZGF0ZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vUHJlVXBkYXRlLmphdmEKQEAgLTEwLDYgKzEwLDkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC00OSw1ICs1MiwxNyBAQAogCXsKIAkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuUFJFX1VQREFURTsKIAl9Ci0KLX0gLy8gUHJlVXBkYXRlCisJCisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisJCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIGJ1aWxkVHJhbnNsYXRvcigKKwkJCUpQQS5QUkVfVVBEQVRFLAorCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUHJlVXBkYXRlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vU3FsUmVzdWx0U2V0TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9TcWxSZXN1bHRTZXRNYXBwaW5nLmphdmEKaW5kZXggMzNiYzE2My4uMTdhZTU3MCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9TcWxSZXN1bHRTZXRNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9TcWxSZXN1bHRTZXRNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTQsMTIgKzE0LDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNDMsMTIgKzQ4LDMxIEBACiAgKgogICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRTcWxSZXN1bHRTZXRNYXBwaW5nKCkKICAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIFNxbFJlc3VsdFNldE1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0CitwdWJsaWMgY2xhc3MgU3FsUmVzdWx0U2V0TWFwcGluZyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wCiB7CiAJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7CisKKwkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTExMCw2ICsxMzQsNDEgQEAKIAl9CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wX0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQorCXsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKQorCXsKKwkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtMjE4LDYgKzI3Nyw4IEBACiAJewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkKIAkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX05BTUU6CiAJCQkJcmV0dXJuIGdldE5hbWUoKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19FTlRJVFlfUkVTVUxUUzoKQEAgLTIzOSw2ICszMDAsOSBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fTkFNRToKIAkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKQEAgLTI2NCw2ICszMjgsOSBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX05BTUU6CiAJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKIAkJCQlyZXR1cm47CkBAIC0yODcsNiArMzU0LDggQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7CiAJCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fTkFNRToKIAkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0VOVElUWV9SRVNVTFRTOgpAQCAtMzA4LDEwICszNzcsNDIgQEAKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7CisJCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7CiAJCXJlc3VsdC5hcHBlbmQobmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKIAotfSAvLyBTcWxSZXN1bHRTZXRNYXBwaW5nCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCisJCQlidWlsZEVudGl0eVJlc3VsdFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ29sdW1uUmVzdWx0VHJhbnNsYXRvcigpCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFNxbFJlc3VsdFNldE1hcHBpbmdfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuREVTQ1JJUFRJT04sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMF9EZXNjcmlwdGlvbigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRW50aXR5UmVzdWx0VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIEVudGl0eVJlc3VsdC5idWlsZFRyYW5zbGF0b3IoSlBBLkVOVElUWV9SRVNVTFQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFNxbFJlc3VsdFNldE1hcHBpbmdfRW50aXR5UmVzdWx0cygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29sdW1uUmVzdWx0VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIENvbHVtblJlc3VsdC5idWlsZFRyYW5zbGF0b3IoSlBBLkNPTFVNTl9SRVNVTFQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFNxbFJlc3VsdFNldE1hcHBpbmdfQ29sdW1uUmVzdWx0cygpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFic3RyYWN0Q29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFic3RyYWN0Q29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YjI2OWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBYnN0cmFjdENvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWJzdHJhY3QgQ29sdW1uPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW4jZ2V0SW5zZXJ0YWJsZSA8ZW0+SW5zZXJ0YWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldE51bGxhYmxlIDxlbT5OdWxsYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldFVuaXF1ZSA8ZW0+VW5pcXVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW4jZ2V0VXBkYXRhYmxlIDxlbT5VcGRhdGFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFic3RyYWN0Q29sdW1uKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBYnN0cmFjdENvbHVtbiBleHRlbmRzIFhtbE5hbWVkQ29sdW1uCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbnNlcnRhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBYnN0cmFjdENvbHVtbl9JbnNlcnRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldEluc2VydGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiNnZXRJbnNlcnRhYmxlIDxlbT5JbnNlcnRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbnNlcnRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbnNlcnRhYmxlKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk51bGxhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk51bGxhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROdWxsYWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWJzdHJhY3RDb2x1bW5fTnVsbGFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0TnVsbGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiNnZXROdWxsYWJsZSA8ZW0+TnVsbGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk51bGxhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROdWxsYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRhYmxlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFic3RyYWN0Q29sdW1uX1RhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFic3RyYWN0Q29sdW1uI2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYWJsZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmlxdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVbmlxdWUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFic3RyYWN0Q29sdW1uX1VuaXF1ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRVbmlxdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBYnN0cmFjdENvbHVtbiNnZXRVbmlxdWUgPGVtPlVuaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVbmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVuaXF1ZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVwZGF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXBkYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXBkYXRhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBYnN0cmFjdENvbHVtbl9VcGRhdGFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0VXBkYXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWJzdHJhY3RDb2x1bW4jZ2V0VXBkYXRhYmxlIDxlbT5VcGRhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXBkYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVcGRhdGFibGUoQm9vbGVhbiB2YWx1ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHRhYmxlIGF0dGlidXRlLiAgSWYgdGhlIHRhYmxlIGF0dGlidXRlIAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqdGFibGUgZWxlbWVudC4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoKTsKLQotfSAvLyBBYnN0cmFjdENvbHVtbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBY2Nlc3NIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQWNjZXNzSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1NzAzYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQWNjZXNzSG9sZGVyLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEFjY2VzcyBIb2xkZXI8L2I+PC9lbT4nLgorICoKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc0hvbGRlciNnZXRBY2Nlc3MgPGVtPkFjY2VzczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzSG9sZGVyKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxBY2Nlc3NIb2xkZXIgZXh0ZW5kcyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZQorCSAqIEBzZWUgI3NldEFjY2VzcyhBY2Nlc3NUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzSG9sZGVyX0FjY2VzcygpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzSG9sZGVyI2dldEFjY2VzcyA8ZW0+QWNjZXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUKKwkgKiBAc2VlICNnZXRBY2Nlc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKTsKKworfSAvLyBYbWxBY2Nlc3NIb2xkZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKaW5kZXggYjgyZTU1Ni4uMDdlYWI0NyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwxMiArOSwyNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwogCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZTwvYj48L2VtPicuCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgSW1wbDwvYj48L2VtPicuCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0yNiwxOCArNDAsOTYgQEAKICAqIDxwPgogICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgogICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlI2dldEpvaW5Db2x1bW5zIDxlbT5Kb2luIENvbHVtbnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgogICogPC91bD4KICAqIDwvcD4KICAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgZXh0ZW5kcyBKcGFFT2JqZWN0CitwdWJsaWMgY2xhc3MgWG1sQXNzb2NpYXRpb25PdmVycmlkZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEpvaW5Db2x1bW5zTWFwcGluZywgWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAKIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luQ29sdW1ucygpIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Sm9pbkNvbHVtbnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxKb2luQ29sdW1uPiBqb2luQ29sdW1uczsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pblRhYmxlKCkgPGVtPkpvaW4gVGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEpvaW5UYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbEpvaW5UYWJsZSBqb2luVGFibGU7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFOworCX0KIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC00OSwxMSArMTQxLDExMyBAQAogCSAqIDwvcD4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlX0pvaW5Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pbkNvbHVtbnNNYXBwaW5nX0pvaW5Db2x1bW5zKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCk7CisJcHVibGljIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkKKwl7CisJCWlmIChqb2luQ29sdW1ucyA9PSBudWxsKQorCQl7CisJCQlqb2luQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxKb2luQ29sdW1uPihYbWxKb2luQ29sdW1uLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9DT0xVTU5TKTsKKwkJfQorCQlyZXR1cm4gam9pbkNvbHVtbnM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMF9EZXNjcmlwdGlvbigpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKKwl7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKKwl7CisJCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wX0pvaW5UYWJsZSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpCisJeworCQlyZXR1cm4gam9pblRhYmxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEpvaW5UYWJsZShYbWxKb2luVGFibGUgbmV3Sm9pblRhYmxlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sSm9pblRhYmxlIG9sZEpvaW5UYWJsZSA9IGpvaW5UYWJsZTsKKwkJam9pblRhYmxlID0gbmV3Sm9pblRhYmxlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9UQUJMRSwgb2xkSm9pblRhYmxlLCBuZXdKb2luVGFibGUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlI2dldEpvaW5UYWJsZSA8ZW0+Sm9pbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Sm9pblRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSBuZXdKb2luVGFibGUpCisJeworCQlpZiAobmV3Sm9pblRhYmxlICE9IGpvaW5UYWJsZSkKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoam9pblRhYmxlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWpvaW5UYWJsZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX1RBQkxFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdKb2luVGFibGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Sm9pblRhYmxlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fVEFCTEUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Sm9pblRhYmxlKG5ld0pvaW5UYWJsZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9UQUJMRSwgbmV3Sm9pblRhYmxlLCBuZXdKb2luVGFibGUpKTsKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC02OSw3ICsyNjMsMTAgQEAKIAkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCisJeworCQlyZXR1cm4gbmFtZTsKKwl9CiAKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC03OSw1ICsyNzYsMjE3IEBACiAJICogQHNlZSAjZ2V0TmFtZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotfSAvLyBBc3NvY2lhdGlvbk92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKKwl7CisJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKKwkJbmFtZSA9IG5ld05hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX0NPTFVNTlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRKb2luQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX1RBQkxFOgorCQkJCXJldHVybiBiYXNpY1NldEpvaW5UYWJsZShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX0NPTFVNTlM6CisJCQkJcmV0dXJuIGdldEpvaW5Db2x1bW5zKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fVEFCTEU6CisJCQkJcmV0dXJuIGdldEpvaW5UYWJsZSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fTkFNRToKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fQ09MVU1OUzoKKwkJCQlnZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7CisJCQkJZ2V0Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEpvaW5Db2x1bW4+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX1RBQkxFOgorCQkJCXNldEpvaW5UYWJsZSgoWG1sSm9pblRhYmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19OQU1FOgorCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9DT0xVTU5TOgorCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9UQUJMRToKKwkJCQlzZXRKb2luVGFibGUoKFhtbEpvaW5UYWJsZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19OQU1FOgorCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fQ09MVU1OUzoKKwkJCQlyZXR1cm4gam9pbkNvbHVtbnMgIT0gbnVsbCAmJiAham9pbkNvbHVtbnMuaXNFbXB0eSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX1RBQkxFOgorCQkJCXJldHVybiBqb2luVGFibGUgIT0gbnVsbDsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX05BTUU6CisJCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19ERVNDUklQVElPTjogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV8yMF9fREVTQ1JJUFRJT047CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9UQUJMRTogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV8yMF9fSk9JTl9UQUJMRTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfMjBfX0RFU0NSSVBUSU9OOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0RFU0NSSVBUSU9OOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFXzIwX19KT0lOX1RBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fVEFCTEU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOworCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKG5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSm9pblRhYmxlVHJhbnNsYXRvcigpCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuREVTQ1JJUFRJT04sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMF9EZXNjcmlwdGlvbigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pbkNvbHVtblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxKb2luQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEuSk9JTl9DT0xVTU4sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5Db2x1bW5zTWFwcGluZ19Kb2luQ29sdW1ucygpKTsKKwl9CQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpvaW5UYWJsZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxKb2luVGFibGUuYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5KT0lOX1RBQkxFLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzBfSm9pblRhYmxlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2ZjU5NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgQ29udGFpbmVyPC9iPjwvZW0+Jy4KKyAqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciNnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcyA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfQXNzb2NpYXRpb25PdmVycmlkZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKworfSAvLyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3M2QwMGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgSW1wbDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkNvbHVtbnMoKSA8ZW0+Sm9pbiBDb2x1bW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpvaW5Db2x1bW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gam9pbkNvbHVtbnM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfSm9pbkNvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpCi0JewotCQlpZiAoam9pbkNvbHVtbnMgPT0gbnVsbCkKLQkJewotCQkJam9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSm9pbkNvbHVtbj4oWG1sSm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU1QTF9fSk9JTl9DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gam9pbkNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0lNUExfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Sm9pbkNvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBnZXRKb2luQ29sdW1ucygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCWdldEpvaW5Db2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxKb2luQ29sdW1uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU1QTF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0lNUExfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gam9pbkNvbHVtbnMgIT0gbnVsbCAmJiAham9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTVBMX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKaW5kZXggNzM1ZjRiMS4uMmU4ZDNjMSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwxMiArOSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlTWFwcGluZ18yXzA7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF0dHJpYnV0ZSBNYXBwaW5nPC9iPjwvZW0+Jy4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvYj48L2VtPicuCiAgKiAKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC0zMiwxMCArMzIsOSBAQAogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpCiAgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQXR0cmlidXRlTWFwcGluZyBleHRlbmRzIEpwYUVPYmplY3QKK3B1YmxpYyBpbnRlcmZhY2UgWG1sQXR0cmlidXRlTWFwcGluZyBleHRlbmRzIFhtbEF0dHJpYnV0ZU1hcHBpbmdfMl8wCiB7CiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNjIsNyArNjEsMTAgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KKwkKIAlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpOwogCQotfSAvLyBBdHRyaWJ1dGVNYXBwaW5nCisJLy9UT0RPIHVuc3VyZSBhYm91dCB0aGlzIGFwaSwgbWlnaHQgY2hhbmdlIHNvb24KKwlTdHJpbmcgZ2V0TWFwcGluZ0tleSgpOworCit9IC8vIFhtbEF0dHJpYnV0ZU1hcHBpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlT3ZlcnJpZGUuamF2YQppbmRleCBkZTNhODg2Li4yZDljNTMwIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksNyArOSwxOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMzEsMTMgKzQyLDExOCBAQAogICogPC9wPgogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEF0dHJpYnV0ZU92ZXJyaWRlIGV4dGVuZHMgSnBhRU9iamVjdAorcHVibGljIGNsYXNzIFhtbEF0dHJpYnV0ZU92ZXJyaWRlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wCiB7CiAJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW4oKSA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxDb2x1bW4gY29sdW1uOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQXR0cmlidXRlT3ZlcnJpZGUoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQVRUUklCVVRFX09WRVJSSURFOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wX0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQorCXsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKKwl7CisJCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKKwl9CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtNTEsNyArMTY3LDI3IEBACiAJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JWG1sQ29sdW1uIGdldENvbHVtbigpOworCXB1YmxpYyBYbWxDb2x1bW4gZ2V0Q29sdW1uKCkKKwl7CisJCXJldHVybiBjb2x1bW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29sdW1uKFhtbENvbHVtbiBuZXdDb2x1bW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxDb2x1bW4gb2xkQ29sdW1uID0gY29sdW1uOworCQljb2x1bW4gPSBuZXdDb2x1bW47CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OLCBvbGRDb2x1bW4sIG5ld0NvbHVtbik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQogCiAJLyoqCiAJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlI2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC02MSw3ICsxOTcsMjEgQEAKIAkgKiBAc2VlICNnZXRDb2x1bW4oKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQl2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gdmFsdWUpOworCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uKQorCXsKKwkJaWYgKG5ld0NvbHVtbiAhPSBjb2x1bW4pCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGNvbHVtbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb2x1bW4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0NPTFVNTiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q29sdW1uICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbHVtbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldENvbHVtbihuZXdDb2x1bW4sIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX19DT0xVTU4sIG5ld0NvbHVtbiwgbmV3Q29sdW1uKSk7CisJfQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNzcsNyArMjI3LDEwIEBACiAJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JU3RyaW5nIGdldE5hbWUoKTsKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWU7CisJfQogCiAJLyoqCiAJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTg3LDYgKzI0MCwxNTggQEAKIAkgKiBAc2VlICNnZXROYW1lKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7CisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKKwl7CisJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKKwkJbmFtZSA9IG5ld05hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOworCX0KIAotfSAvLyBBdHRyaWJ1dGVPdmVycmlkZQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0NPTFVNTjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRDb2x1bW4obnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0NPTFVNTjoKKwkJCQlyZXR1cm4gZ2V0Q29sdW1uKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9fTkFNRToKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OOgorCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9fTkFNRToKKwkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0NPTFVNTjoKKwkJCQlzZXRDb2x1bW4oKFhtbENvbHVtbiludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9fTkFNRToKKwkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OOgorCQkJCXJldHVybiBjb2x1bW4gIT0gbnVsbDsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX19OQU1FOgorCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7CisJCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQobmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuREVTQ1JJUFRJT04sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzBfRGVzY3JpcHRpb24oKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQS5DT0xVTU4sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlX0NvbHVtbigpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxM2E2ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSBDb250YWluZXI8L2I+PC9lbT4nLgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzIDxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgZXh0ZW5kcyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyX0F0dHJpYnV0ZU92ZXJyaWRlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7CisKK30gLy8gWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGE4MzU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU92ZXJyaWRlCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uKCkgPGVtPkNvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29sdW1uIGNvbHVtbjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbHVtbihYbWxDb2x1bW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9Db2x1bW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb2x1bW4gZ2V0Q29sdW1uKCkKLQl7Ci0JCXJldHVybiBjb2x1bW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29sdW1uKFhtbENvbHVtbiBuZXdDb2x1bW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDb2x1bW4gb2xkQ29sdW1uID0gY29sdW1uOwotCQljb2x1bW4gPSBuZXdDb2x1bW47Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9JTVBMX19DT0xVTU4sIG9sZENvbHVtbiwgbmV3Q29sdW1uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsI2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uKQotCXsKLQkJaWYgKG5ld0NvbHVtbiAhPSBjb2x1bW4pCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbHVtbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb2x1bW4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTF9fQ09MVU1OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb2x1bW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29sdW1uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0lNUExfX0NPTFVNTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb2x1bW4obmV3Q29sdW1uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9JTVBMX19DT0xVTU4sIG5ld0NvbHVtbiwgbmV3Q29sdW1uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0lNUExfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0lNUExfX0NPTFVNTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDb2x1bW4obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTF9fQ09MVU1OOgotCQkJCXJldHVybiBnZXRDb2x1bW4oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0lNUExfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9JTVBMX19DT0xVTU46Ci0JCQkJc2V0Q29sdW1uKChYbWxDb2x1bW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0lNUExfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9JTVBMX19DT0xVTU46Ci0JCQkJc2V0Q29sdW1uKChYbWxDb2x1bW4pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9JTVBMX19DT0xVTU46Ci0JCQkJcmV0dXJuIGNvbHVtbiAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU1QTF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIEF0dHJpYnV0ZU92ZXJyaWRlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2VUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiN2E2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2VUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmFzZSBUYWJsZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VUYWJsZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGUjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGUjZ2V0VW5pcXVlQ29uc3RyYWludHMgPGVtPlVuaXF1ZSBDb25zdHJhaW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZVRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxCYXNlVGFibGUgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VUYWJsZV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZVRhYmxlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2F0YWxvZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNlVGFibGVfQ2F0YWxvZygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2F0YWxvZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VUYWJsZSNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXRhbG9nKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNjaGVtYShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNlVGFibGVfU2NoZW1hKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTY2hlbWEoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlVGFibGUjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2NoZW1hKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaXF1ZSBDb25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaXF1ZSBDb25zdHJhaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXF1ZSBDb25zdHJhaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VUYWJsZV9VbmlxdWVDb25zdHJhaW50cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PiBnZXRVbmlxdWVDb25zdHJhaW50cygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG5hbWUgYXR0aWJ1dGUuICBJZiB0aGUgbmFtZSBhdHRpYnV0ZSAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKnRhYmxlIGVsZW1lbnQuCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgc2NoZW1hIGF0dGlidXRlLiAgSWYgdGhlIHNjaGVtYSBhdHRpYnV0ZSAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKnRhYmxlIGVsZW1lbnQuCi0JICovCi0JVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBjYXRhbG9nIGF0dGlidXRlLiAgSWYgdGhlIGNhdGFsb2cgYXR0aWJ1dGUgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICp0YWJsZSBlbGVtZW50LgotCSAqLwotCVRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKCk7Ci19IC8vIFhtbEJhc2VUYWJsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpYy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpYy5qYXZhCmluZGV4IDY1MTM4ZTMuLjczMWUwYjEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWMuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwxMCArOSwyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuQm9vbGVhblRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNpYzwvYj48L2VtPicuCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNpYyBJbXBsPC9iPjwvZW0+Jy4KICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTI2LDE5ICszOCwzMDYgQEAKICAqIDx1bD4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0RmV0Y2ggPGVtPkZldGNoPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0T3B0aW9uYWwgPGVtPk9wdGlvbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjaXNMb2IgPGVtPkxvYjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFRlbXBvcmFsIDxlbT5UZW1wb3JhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEVudW1lcmF0ZWQgPGVtPkVudW1lcmF0ZWQ8L2VtPn08L2xpPgogICogPC91bD4KICAqIDwvcD4KICAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2ljKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGludGVyZmFjZSBYbWxCYXNpYyBleHRlbmRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIENvbHVtbk1hcHBpbmcKK3B1YmxpYyBjbGFzcyBYbWxCYXNpYyBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIENvbHVtbk1hcHBpbmcsIFhtbENvbnZlcnRpYmxlTWFwcGluZwogewogCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbHVtbigpIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbENvbHVtbiBjb2x1bW47CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMb2IoKSA8ZW0+TG9iPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0xvYigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQl9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMb2IoKSA8ZW0+TG9iPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0xvYigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gbG9iID0gTE9CX0VERUZBVUxUOworCisJLyoqCisJICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0CisJICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVGVtcG9yYWxUeXBlIFRFTVBPUkFMX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRlbXBvcmFsKCkgPGVtPlRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUZW1wb3JhbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSB0ZW1wb3JhbCA9IFRFTVBPUkFMX0VERUZBVUxUOworCisJLyoqCisJICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0CisJICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRW51bVR5cGUgRU5VTUVSQVRFRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnVtZXJhdGVkKCkgPGVtPkVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVudW1lcmF0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFbnVtVHlwZSBlbnVtZXJhdGVkID0gRU5VTUVSQVRFRF9FREVGQVVMVDsKKworCS8qKgorCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAorCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEZldGNoVHlwZSBGRVRDSF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGZXRjaCgpIDxlbT5GZXRjaDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RmV0Y2goKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBGZXRjaFR5cGUgZmV0Y2ggPSBGRVRDSF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpb25hbCgpIDxlbT5PcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3B0aW9uYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBPUFRJT05BTF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpb25hbCgpIDxlbT5PcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3B0aW9uYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb29sZWFuIG9wdGlvbmFsID0gT1BUSU9OQUxfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQmFzaWMoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQkFTSUM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRDb2x1bW4oWG1sQ29sdW1uKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKQorCXsKKwkJcmV0dXJuIGNvbHVtbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb2x1bW4oWG1sQ29sdW1uIG5ld0NvbHVtbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbENvbHVtbiBvbGRDb2x1bW4gPSBjb2x1bW47CisJCWNvbHVtbiA9IG5ld0NvbHVtbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTFVNTiwgb2xkQ29sdW1uLCBuZXdDb2x1bW4pOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRDb2x1bW4gPGVtPkNvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oWG1sQ29sdW1uIG5ld0NvbHVtbikKKwl7CisJCWlmIChuZXdDb2x1bW4gIT0gY29sdW1uKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChjb2x1bW4gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29sdW1uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTFVNTiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q29sdW1uICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbHVtbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19DT0xVTU4sIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Q29sdW1uKG5ld0NvbHVtbiwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09MVU1OLCBuZXdDb2x1bW4sIG5ld0NvbHVtbikpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9iPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TG9iKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfTG9iKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0xvYigpCisJeworCQlyZXR1cm4gbG9iOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNpc0xvYiA8ZW0+TG9iPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzTG9iKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TG9iKGJvb2xlYW4gbmV3TG9iKQorCXsKKwkJYm9vbGVhbiBvbGRMb2IgPSBsb2I7CisJCWxvYiA9IG5ld0xvYjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0xPQiwgb2xkTG9iLCBsb2IpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQorCSAqIEBzZWUgI3NldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19UZW1wb3JhbCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKQorCXsKKwkJcmV0dXJuIHRlbXBvcmFsOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRUZW1wb3JhbCA8ZW0+VGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUKKwkgKiBAc2VlICNnZXRUZW1wb3JhbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkKKwl7CisJCVRlbXBvcmFsVHlwZSBvbGRUZW1wb3JhbCA9IHRlbXBvcmFsOworCQl0ZW1wb3JhbCA9IG5ld1RlbXBvcmFsID09IG51bGwgPyBURU1QT1JBTF9FREVGQVVMVCA6IG5ld1RlbXBvcmFsOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEVNUE9SQUwsIG9sZFRlbXBvcmFsLCB0ZW1wb3JhbCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQorCSAqIEBzZWUgI3NldEVudW1lcmF0ZWQoRW51bVR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfRW51bWVyYXRlZCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFbnVtVHlwZSBnZXRFbnVtZXJhdGVkKCkKKwl7CisJCXJldHVybiBlbnVtZXJhdGVkOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRFbnVtZXJhdGVkIDxlbT5FbnVtZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQorCSAqIEBzZWUgI2dldEVudW1lcmF0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFbnVtZXJhdGVkKEVudW1UeXBlIG5ld0VudW1lcmF0ZWQpCisJeworCQlFbnVtVHlwZSBvbGRFbnVtZXJhdGVkID0gZW51bWVyYXRlZDsKKwkJZW51bWVyYXRlZCA9IG5ld0VudW1lcmF0ZWQgPT0gbnVsbCA/IEVOVU1FUkFURURfRURFRkFVTFQgOiBuZXdFbnVtZXJhdGVkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fRU5VTUVSQVRFRCwgb2xkRW51bWVyYXRlZCwgZW51bWVyYXRlZCkpOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkxBWlkiPC9jb2RlPi4KIAkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlfS4KQEAgLTU1LDcgKzM1NCwxMCBAQAogCSAqIEBtb2RlbCBkZWZhdWx0PSJMQVpZIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlGZXRjaFR5cGUgZ2V0RmV0Y2goKTsKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkKKwl7CisJCXJldHVybiBmZXRjaDsKKwl9CiAKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0RmV0Y2ggPGVtPkZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC02Niw3ICszNjgsMTMgQEAKIAkgKiBAc2VlICNnZXRGZXRjaCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIHZhbHVlKTsKKwlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpCisJeworCQlGZXRjaFR5cGUgb2xkRmV0Y2ggPSBmZXRjaDsKKwkJZmV0Y2ggPSBuZXdGZXRjaCA9PSBudWxsID8gRkVUQ0hfRURFRkFVTFQgOiBuZXdGZXRjaDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0ZFVENILCBvbGRGZXRjaCwgZmV0Y2gpKTsKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtODIsNyArMzkwLDEwIEBACiAJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JQm9vbGVhbiBnZXRPcHRpb25hbCgpOworCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkKKwl7CisJCXJldHVybiBvcHRpb25hbDsKKwl9CiAKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0T3B0aW9uYWwgPGVtPk9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC05Miw5MCArNDAzLDI4NSBAQAogCSAqIEBzZWUgI2dldE9wdGlvbmFsKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0Jdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIHZhbHVlKTsKKwlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKQorCXsKKwkJQm9vbGVhbiBvbGRPcHRpb25hbCA9IG9wdGlvbmFsOworCQlvcHRpb25hbCA9IG5ld09wdGlvbmFsOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT1BUSU9OQUwsIG9sZE9wdGlvbmFsLCBvcHRpb25hbCkpOworCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9iPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9iKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNpY19Mb2IoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWJvb2xlYW4gaXNMb2IoKTsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTFVNTjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRDb2x1bW4obnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KIAogCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNpc0xvYiA8ZW0+TG9iPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTG9iKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0Jdm9pZCBzZXRMb2IoYm9vbGVhbiB2YWx1ZSk7CisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19DT0xVTU46CisJCQkJcmV0dXJuIGdldENvbHVtbigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTE9COgorCQkJCXJldHVybiBpc0xvYigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEVNUE9SQUw6CisJCQkJcmV0dXJuIGdldFRlbXBvcmFsKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19FTlVNRVJBVEVEOgorCQkJCXJldHVybiBnZXRFbnVtZXJhdGVkKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19GRVRDSDoKKwkJCQlyZXR1cm4gZ2V0RmV0Y2goKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX09QVElPTkFMOgorCQkJCXJldHVybiBnZXRPcHRpb25hbCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZX0uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQHNlZSAjc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzaWNfVGVtcG9yYWwoKQotCSAqIEBtb2RlbAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKTsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19DT0xVTU46CisJCQkJc2V0Q29sdW1uKChYbWxDb2x1bW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0xPQjoKKwkJCQlzZXRMb2IoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RFTVBPUkFMOgorCQkJCXNldFRlbXBvcmFsKChUZW1wb3JhbFR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0VOVU1FUkFURUQ6CisJCQkJc2V0RW51bWVyYXRlZCgoRW51bVR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0ZFVENIOgorCQkJCXNldEZldGNoKChGZXRjaFR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX09QVElPTkFMOgorCQkJCXNldE9wdGlvbmFsKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CiAKIAkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0VGVtcG9yYWwgPGVtPlRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQHNlZSAjZ2V0VGVtcG9yYWwoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQl2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSB2YWx1ZSk7CisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09MVU1OOgorCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0xPQjoKKwkJCQlzZXRMb2IoTE9CX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19URU1QT1JBTDoKKwkJCQlzZXRUZW1wb3JhbChURU1QT1JBTF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fRU5VTUVSQVRFRDoKKwkJCQlzZXRFbnVtZXJhdGVkKEVOVU1FUkFURURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0ZFVENIOgorCQkJCXNldEZldGNoKEZFVENIX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19PUFRJT05BTDoKKwkJCQlzZXRPcHRpb25hbChPUFRJT05BTF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGV9LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQotCSAqIEBzZWUgI3NldEVudW1lcmF0ZWQoRW51bVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNpY19FbnVtZXJhdGVkKCkKLQkgKiBAbW9kZWwKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpOworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTFVNTjoKKwkJCQlyZXR1cm4gY29sdW1uICE9IG51bGw7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19MT0I6CisJCQkJcmV0dXJuIGxvYiAhPSBMT0JfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19URU1QT1JBTDoKKwkJCQlyZXR1cm4gdGVtcG9yYWwgIT0gVEVNUE9SQUxfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19FTlVNRVJBVEVEOgorCQkJCXJldHVybiBlbnVtZXJhdGVkICE9IEVOVU1FUkFURURfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19GRVRDSDoKKwkJCQlyZXR1cm4gZmV0Y2ggIT0gRkVUQ0hfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19PUFRJT05BTDoKKwkJCQlyZXR1cm4gT1BUSU9OQUxfRURFRkFVTFQgPT0gbnVsbCA/IG9wdGlvbmFsICE9IG51bGwgOiAhT1BUSU9OQUxfRURFRkFVTFQuZXF1YWxzKG9wdGlvbmFsKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQogCiAJLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEVudW1lcmF0ZWQgPGVtPkVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCi0JICogQHNlZSAjZ2V0RW51bWVyYXRlZCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0RW51bWVyYXRlZChFbnVtVHlwZSB2YWx1ZSk7CisJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gQ29sdW1uTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTFVNTjogcmV0dXJuIE9ybVBhY2thZ2UuQ09MVU1OX01BUFBJTkdfX0NPTFVNTjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19MT0I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19MT0I7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19URU1QT1JBTDsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19FTlVNRVJBVEVEOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fRU5VTUVSQVRFRDsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KIAotfSAvLyBCYXNpYworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IENvbHVtbk1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuQ09MVU1OX01BUFBJTkdfX0NPTFVNTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19DT0xVTU47CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19MT0I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTE9COworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEVNUE9SQUw7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19FTlVNRVJBVEVEOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQkFTSUNfX0VOVU1FUkFURUQ7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChsb2I6ICIpOworCQlyZXN1bHQuYXBwZW5kKGxvYik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdGVtcG9yYWw6ICIpOworCQlyZXN1bHQuYXBwZW5kKHRlbXBvcmFsKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBlbnVtZXJhdGVkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChlbnVtZXJhdGVkKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBmZXRjaDogIik7CisJCXJlc3VsdC5hcHBlbmQoZmV0Y2gpOworCQlyZXN1bHQuYXBwZW5kKCIsIG9wdGlvbmFsOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChvcHRpb25hbCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuRU5VTUVSQVRFRCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRMb2JUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLkxPQik7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLlRFTVBPUkFMKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAorCQkJYnVpbGRPcHRpb25hbFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCksIAorCQkJYnVpbGRMb2JUcmFuc2xhdG9yKCksCisJCQlidWlsZFRlbXBvcmFsVHJhbnNsYXRvcigpLAorCQkJYnVpbGRFbnVtZXJhdGVkVHJhbnNsYXRvcigpCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEZldGNoVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5GRVRDSCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfRmV0Y2goKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT3B0aW9uYWxUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKEpQQS5PUFRJT05BTCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfT3B0aW9uYWwoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29sdW1uVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbENvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBLkNPTFVNTiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZExvYlRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihKUEEuTE9CLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfTG9iKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUZW1wb3JhbFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuVEVNUE9SQUwsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19UZW1wb3JhbCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRW51bWVyYXRlZFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuRU5VTUVSQVRFRCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0VudW1lcmF0ZWQoKSk7CisJfQkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWNJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDQ1MDE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNpYyBJbXBsPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNpY0ltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQmFzaWNJbXBsIGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgWG1sQmFzaWMKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW4oKSA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb2x1bW4gY29sdW1uOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRmV0Y2hUeXBlIEZFVENIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZldGNoKCkgPGVtPkZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBmZXRjaCA9IEZFVENIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wdGlvbmFsKCkgPGVtPk9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcHRpb25hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIE9QVElPTkFMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wdGlvbmFsKCkgPGVtPk9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcHRpb25hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gb3B0aW9uYWwgPSBPUFRJT05BTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xvYigpIDxlbT5Mb2I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTG9iKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9CX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xvYigpIDxlbT5Mb2I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTG9iKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsb2IgPSBMT0JfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUZW1wb3JhbFR5cGUgVEVNUE9SQUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGVtcG9yYWwoKSA8ZW0+VGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRlbXBvcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHRlbXBvcmFsID0gVEVNUE9SQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbnVtVHlwZSBFTlVNRVJBVEVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudW1lcmF0ZWQoKSA8ZW0+RW51bWVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW51bWVyYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVudW1UeXBlIGVudW1lcmF0ZWQgPSBFTlVNRVJBVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEJhc2ljSW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9CQVNJQ19JTVBMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29sdW1uKFhtbENvbHVtbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENvbHVtbk1hcHBpbmdfQ29sdW1uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb2x1bW4gZ2V0Q29sdW1uKCkKLQl7Ci0JCXJldHVybiBjb2x1bW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29sdW1uKFhtbENvbHVtbiBuZXdDb2x1bW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDb2x1bW4gb2xkQ29sdW1uID0gY29sdW1uOwotCQljb2x1bW4gPSBuZXdDb2x1bW47Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0NPTFVNTiwgb2xkQ29sdW1uLCBuZXdDb2x1bW4pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0ltcGwjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiBuZXdDb2x1bW4pCi0JewotCQlpZiAobmV3Q29sdW1uICE9IGNvbHVtbikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbHVtbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0NPTFVNTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbHVtbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0NPTFVNTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb2x1bW4obmV3Q29sdW1uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0NPTFVNTiwgbmV3Q29sdW1uLCBuZXdDb2x1bW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJMQVpZIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCi0JICogQHNlZSAjc2V0RmV0Y2goRmV0Y2hUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzaWNfRmV0Y2goKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJMQVpZIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkKLQl7Ci0JCXJldHVybiBmZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNJbXBsI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgI2dldEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKQotCXsKLQkJRmV0Y2hUeXBlIG9sZEZldGNoID0gZmV0Y2g7Ci0JCWZldGNoID0gbmV3RmV0Y2ggPT0gbnVsbCA/IEZFVENIX0VERUZBVUxUIDogbmV3RmV0Y2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0ZFVENILCBvbGRGZXRjaCwgZmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW9uYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE9wdGlvbmFsKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNpY19PcHRpb25hbCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKQotCXsKLQkJcmV0dXJuIG9wdGlvbmFsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0ltcGwjZ2V0T3B0aW9uYWwgPGVtPk9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKQotCXsKLQkJQm9vbGVhbiBvbGRPcHRpb25hbCA9IG9wdGlvbmFsOwotCQlvcHRpb25hbCA9IG5ld09wdGlvbmFsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19PUFRJT05BTCwgb2xkT3B0aW9uYWwsIG9wdGlvbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9iPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMb2IoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2ljX0xvYigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMb2IoKQotCXsKLQkJcmV0dXJuIGxvYjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNJbXBsI2lzTG9iIDxlbT5Mb2I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNMb2IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiBuZXdMb2IpCi0JewotCQlib29sZWFuIG9sZExvYiA9IGxvYjsKLQkJbG9iID0gbmV3TG9iOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19MT0IsIG9sZExvYiwgbG9iKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUKLQkgKiBAc2VlICNzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNpY19UZW1wb3JhbCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKQotCXsKLQkJcmV0dXJuIHRlbXBvcmFsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0ltcGwjZ2V0VGVtcG9yYWwgPGVtPlRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQHNlZSAjZ2V0VGVtcG9yYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpCi0JewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0ZW1wb3JhbDsKLQkJdGVtcG9yYWwgPSBuZXdUZW1wb3JhbCA9PSBudWxsID8gVEVNUE9SQUxfRURFRkFVTFQgOiBuZXdUZW1wb3JhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fVEVNUE9SQUwsIG9sZFRlbXBvcmFsLCB0ZW1wb3JhbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQotCSAqIEBzZWUgI3NldEVudW1lcmF0ZWQoRW51bVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNpY19FbnVtZXJhdGVkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudW1UeXBlIGdldEVudW1lcmF0ZWQoKQotCXsKLQkJcmV0dXJuIGVudW1lcmF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljSW1wbCNnZXRFbnVtZXJhdGVkIDxlbT5FbnVtZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQotCSAqIEBzZWUgI2dldEVudW1lcmF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnVtZXJhdGVkKEVudW1UeXBlIG5ld0VudW1lcmF0ZWQpCi0JewotCQlFbnVtVHlwZSBvbGRFbnVtZXJhdGVkID0gZW51bWVyYXRlZDsKLQkJZW51bWVyYXRlZCA9IG5ld0VudW1lcmF0ZWQgPT0gbnVsbCA/IEVOVU1FUkFURURfRURFRkFVTFQgOiBuZXdFbnVtZXJhdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19FTlVNRVJBVEVELCBvbGRFbnVtZXJhdGVkLCBlbnVtZXJhdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0NPTFVNTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDb2x1bW4obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19DT0xVTU46Ci0JCQkJcmV0dXJuIGdldENvbHVtbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19GRVRDSDoKLQkJCQlyZXR1cm4gZ2V0RmV0Y2goKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fT1BUSU9OQUw6Ci0JCQkJcmV0dXJuIGdldE9wdGlvbmFsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0xPQjoKLQkJCQlyZXR1cm4gaXNMb2IoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX1RFTVBPUkFMOgotCQkJCXJldHVybiBnZXRUZW1wb3JhbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19FTlVNRVJBVEVEOgotCQkJCXJldHVybiBnZXRFbnVtZXJhdGVkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19DT0xVTU46Ci0JCQkJc2V0Q29sdW1uKChYbWxDb2x1bW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fRkVUQ0g6Ci0JCQkJc2V0RmV0Y2goKEZldGNoVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19PUFRJT05BTDoKLQkJCQlzZXRPcHRpb25hbCgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19MT0I6Ci0JCQkJc2V0TG9iKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fVEVNUE9SQUw6Ci0JCQkJc2V0VGVtcG9yYWwoKFRlbXBvcmFsVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19FTlVNRVJBVEVEOgotCQkJCXNldEVudW1lcmF0ZWQoKEVudW1UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0NPTFVNTjoKLQkJCQlzZXRDb2x1bW4oKFhtbENvbHVtbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0ZFVENIOgotCQkJCXNldEZldGNoKEZFVENIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX09QVElPTkFMOgotCQkJCXNldE9wdGlvbmFsKE9QVElPTkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0xPQjoKLQkJCQlzZXRMb2IoTE9CX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX1RFTVBPUkFMOgotCQkJCXNldFRlbXBvcmFsKFRFTVBPUkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0VOVU1FUkFURUQ6Ci0JCQkJc2V0RW51bWVyYXRlZChFTlVNRVJBVEVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19DT0xVTU46Ci0JCQkJcmV0dXJuIGNvbHVtbiAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19GRVRDSDoKLQkJCQlyZXR1cm4gZmV0Y2ggIT0gRkVUQ0hfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX09QVElPTkFMOgotCQkJCXJldHVybiBPUFRJT05BTF9FREVGQVVMVCA9PSBudWxsID8gb3B0aW9uYWwgIT0gbnVsbCA6ICFPUFRJT05BTF9FREVGQVVMVC5lcXVhbHMob3B0aW9uYWwpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19MT0I6Ci0JCQkJcmV0dXJuIGxvYiAhPSBMT0JfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX1RFTVBPUkFMOgotCQkJCXJldHVybiB0ZW1wb3JhbCAhPSBURU1QT1JBTF9FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fRU5VTUVSQVRFRDoKLQkJCQlyZXR1cm4gZW51bWVyYXRlZCAhPSBFTlVNRVJBVEVEX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBDb2x1bW5NYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19DT0xVTU46IHJldHVybiBPcm1QYWNrYWdlLkNPTFVNTl9NQVBQSU5HX19DT0xVTU47Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzaWMuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0ZFVENIOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQkFTSUNfX0ZFVENIOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fT1BUSU9OQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT1BUSU9OQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19MT0I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTE9COwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEVNUE9SQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19FTlVNRVJBVEVEOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQkFTSUNfX0VOVU1FUkFURUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBDb2x1bW5NYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkNPTFVNTl9NQVBQSU5HX19DT0xVTU46IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNJQ19JTVBMX19DT0xVTU47Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzaWMuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19GRVRDSDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0ZFVENIOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX09QVElPTkFMOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fT1BUSU9OQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTE9COiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fTE9COwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RFTVBPUkFMOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQkFTSUNfSU1QTF9fVEVNUE9SQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fRU5VTUVSQVRFRDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0JBU0lDX0lNUExfX0VOVU1FUkFURUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmZXRjaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmV0Y2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9wdGlvbmFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvcHRpb25hbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbG9iOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsb2IpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRlbXBvcmFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0ZW1wb3JhbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZW51bWVyYXRlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZW51bWVyYXRlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBCYXNpY0ltcGwKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29sbGVjdGlvblRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbGxlY3Rpb25UYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMzEyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbGxlY3Rpb25UYWJsZS5qYXZhCkBAIC0wLDAgKzEsMjM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvblRhYmxlXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ29sbGVjdGlvbiBUYWJsZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uVGFibGUoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgWG1sQ29sbGVjdGlvblRhYmxlIGV4dGVuZHMgQWJzdHJhY3RYbWxUYWJsZSBpbXBsZW1lbnRzIFhtbENvbGxlY3Rpb25UYWJsZV8yXzAKK3sKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luQ29sdW1ucygpIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Sm9pbkNvbHVtbnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxKb2luQ29sdW1uPiBqb2luQ29sdW1uczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxDb2xsZWN0aW9uVGFibGUoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQ09MTEVDVElPTl9UQUJMRTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8wX0pvaW5Db2x1bW5zKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpCisJeworCQlpZiAoam9pbkNvbHVtbnMgPT0gbnVsbCkKKwkJeworCQkJam9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSm9pbkNvbHVtbj4oWG1sSm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfQ09MTEVDVElPTl9UQUJMRV9fSk9JTl9DT0xVTU5TKTsKKwkJfQorCQlyZXR1cm4gam9pbkNvbHVtbnM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfX0pPSU5fQ09MVU1OUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEpvaW5Db2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfX0pPSU5fQ09MVU1OUzoKKwkJCQlyZXR1cm4gZ2V0Sm9pbkNvbHVtbnMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfX0pPSU5fQ09MVU1OUzoKKwkJCQlnZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7CisJCQkJZ2V0Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEpvaW5Db2x1bW4+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfX0pPSU5fQ09MVU1OUzoKKwkJCQlnZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MTEVDVElPTl9UQUJMRV9fSk9JTl9DT0xVTU5TOgorCQkJCXJldHVybiBqb2luQ29sdW1ucyAhPSBudWxsICYmICFqb2luQ29sdW1ucy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbGxlY3Rpb25UYWJsZV8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9DT0xMRUNUSU9OX1RBQkxFXzIwX19KT0lOX0NPTFVNTlM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb2xsZWN0aW9uVGFibGVfMl8wLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfQ09MTEVDVElPTl9UQUJMRV8yMF9fSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09MTEVDVElPTl9UQUJMRV9fSk9JTl9DT0xVTU5TOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAorCQkJYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCksCisJCQlidWlsZEpvaW5Db2x1bW5zVHJhbnNsYXRvcigpLAorCQkJYnVpbGRVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvcigpCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpvaW5Db2x1bW5zVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuSk9JTl9DT0xVTU4sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8wX0pvaW5Db2x1bW5zKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbHVtbi5qYXZhCmluZGV4IDI4MmYzODMuLjRhZTk0YmIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29sdW1uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxDb2x1bW4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDEwICs5LDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nLgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29sdW1uIEltcGw8L2I+PC9lbT4nLgogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMzEsMTIgKzM3LDkzIEBACiAgKiA8L3A+CiAgKgogICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb2x1bW4oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbENvbHVtbiBleHRlbmRzIFhtbEFic3RyYWN0Q29sdW1uCitwdWJsaWMgY2xhc3MgWG1sQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RYbWxDb2x1bW4KIHsKIAkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGVuZ3RoKCkgPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TGVuZ3RoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgTEVOR1RIX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlbmd0aCgpIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExlbmd0aCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEludGVnZXIgbGVuZ3RoID0gTEVOR1RIX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNpc2lvbigpIDxlbT5QcmVjaXNpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFByZWNpc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFBSRUNJU0lPTl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjaXNpb24oKSA8ZW0+UHJlY2lzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcmVjaXNpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyIHByZWNpc2lvbiA9IFBSRUNJU0lPTl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2FsZSgpIDxlbT5TY2FsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2NhbGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBTQ0FMRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2FsZSgpIDxlbT5TY2FsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2NhbGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyIHNjYWxlID0gU0NBTEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ29sdW1uKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NPTFVNTjsKKwl9CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtNTAsNyArMTM3LDEwIEBACiAJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlJbnRlZ2VyIGdldExlbmd0aCgpOworCXB1YmxpYyBJbnRlZ2VyIGdldExlbmd0aCgpCisJeworCQlyZXR1cm4gbGVuZ3RoOworCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4jZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTYwLDcgKzE1MCwxMyBAQAogCSAqIEBzZWUgI2dldExlbmd0aCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0TGVuZ3RoKEludGVnZXIgdmFsdWUpOworCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIG5ld0xlbmd0aCkKKwl7CisJCUludGVnZXIgb2xkTGVuZ3RoID0gbGVuZ3RoOworCQlsZW5ndGggPSBuZXdMZW5ndGg7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fTEVOR1RILCBvbGRMZW5ndGgsIGxlbmd0aCkpOworCX0KIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWNpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNzYsNyArMTcyLDEwIEBACiAJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlJbnRlZ2VyIGdldFByZWNpc2lvbigpOworCXB1YmxpYyBJbnRlZ2VyIGdldFByZWNpc2lvbigpCisJeworCQlyZXR1cm4gcHJlY2lzaW9uOworCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4jZ2V0UHJlY2lzaW9uIDxlbT5QcmVjaXNpb248L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTg2LDcgKzE4NSwxMyBAQAogCSAqIEBzZWUgI2dldFByZWNpc2lvbigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0UHJlY2lzaW9uKEludGVnZXIgdmFsdWUpOworCXB1YmxpYyB2b2lkIHNldFByZWNpc2lvbihJbnRlZ2VyIG5ld1ByZWNpc2lvbikKKwl7CisJCUludGVnZXIgb2xkUHJlY2lzaW9uID0gcHJlY2lzaW9uOworCQlwcmVjaXNpb24gPSBuZXdQcmVjaXNpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fUFJFQ0lTSU9OLCBvbGRQcmVjaXNpb24sIHByZWNpc2lvbikpOworCX0KIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMDIsNyArMjA3LDEwIEBACiAJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlJbnRlZ2VyIGdldFNjYWxlKCk7CisJcHVibGljIEludGVnZXIgZ2V0U2NhbGUoKQorCXsKKwkJcmV0dXJuIHNjYWxlOworCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMTIsNiArMjIwLDE1NiBAQAogCSAqIEBzZWUgI2dldFNjYWxlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0Jdm9pZCBzZXRTY2FsZShJbnRlZ2VyIHZhbHVlKTsKKwlwdWJsaWMgdm9pZCBzZXRTY2FsZShJbnRlZ2VyIG5ld1NjYWxlKQorCXsKKwkJSW50ZWdlciBvbGRTY2FsZSA9IHNjYWxlOworCQlzY2FsZSA9IG5ld1NjYWxlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NDQUxFLCBvbGRTY2FsZSwgc2NhbGUpKTsKKwl9CiAKLX0gLy8gQ29sdW1uCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fTEVOR1RIOgorCQkJCXJldHVybiBnZXRMZW5ndGgoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19QUkVDSVNJT046CisJCQkJcmV0dXJuIGdldFByZWNpc2lvbigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NDQUxFOgorCQkJCXJldHVybiBnZXRTY2FsZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19MRU5HVEg6CisJCQkJc2V0TGVuZ3RoKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fUFJFQ0lTSU9OOgorCQkJCXNldFByZWNpc2lvbigoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NDQUxFOgorCQkJCXNldFNjYWxlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fTEVOR1RIOgorCQkJCXNldExlbmd0aChMRU5HVEhfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19QUkVDSVNJT046CisJCQkJc2V0UHJlY2lzaW9uKFBSRUNJU0lPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NDQUxFOgorCQkJCXNldFNjYWxlKFNDQUxFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX0xFTkdUSDoKKwkJCQlyZXR1cm4gTEVOR1RIX0VERUZBVUxUID09IG51bGwgPyBsZW5ndGggIT0gbnVsbCA6ICFMRU5HVEhfRURFRkFVTFQuZXF1YWxzKGxlbmd0aCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fUFJFQ0lTSU9OOgorCQkJCXJldHVybiBQUkVDSVNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHByZWNpc2lvbiAhPSBudWxsIDogIVBSRUNJU0lPTl9FREVGQVVMVC5lcXVhbHMocHJlY2lzaW9uKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19TQ0FMRToKKwkJCQlyZXR1cm4gU0NBTEVfRURFRkFVTFQgPT0gbnVsbCA/IHNjYWxlICE9IG51bGwgOiAhU0NBTEVfRURFRkFVTFQuZXF1YWxzKHNjYWxlKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobGVuZ3RoOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChsZW5ndGgpOworCQlyZXN1bHQuYXBwZW5kKCIsIHByZWNpc2lvbjogIik7CisJCXJlc3VsdC5hcHBlbmQocHJlY2lzaW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzY2FsZTogIik7CisJCXJlc3VsdC5hcHBlbmQoc2NhbGUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJZWxlbWVudE5hbWUsCisJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKKwkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCisJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZFVuaXF1ZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTnVsbGFibGVUcmFuc2xhdG9yKCksCisJCQlidWlsZEluc2VydGFibGVUcmFuc2xhdG9yKCksCisJCQlidWlsZFVwZGF0YWJsZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ29sdW1uRGVmaW5pdGlvblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkVGFibGVUcmFuc2xhdG9yKCksCisJCQlidWlsZExlbmd0aFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUHJlY2lzaW9uVHJhbnNsYXRvcigpLAorCQkJYnVpbGRTY2FsZVRyYW5zbGF0b3IoKSwKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTGVuZ3RoVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5MRU5HVEgsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbHVtbl9MZW5ndGgoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJlY2lzaW9uVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5QUkVDSVNJT04sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbHVtbl9QcmVjaXNpb24oKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2NhbGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlNDQUxFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb2x1bW5fU2NhbGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9Cit9IC8vIENvbHVtbkltcGwKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29sdW1uSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxDb2x1bW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDk2YmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxDb2x1bW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29sdW1uIEltcGw8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbHVtbkltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQ29sdW1uSW1wbCBleHRlbmRzIEFic3RyYWN0WG1sQWJzdHJhY3RDb2x1bW4gaW1wbGVtZW50cyBYbWxDb2x1bW4KLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGVuZ3RoKCkgPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGVuZ3RoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgTEVOR1RIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlbmd0aCgpIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgbGVuZ3RoID0gTEVOR1RIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNpc2lvbigpIDxlbT5QcmVjaXNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNpc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFBSRUNJU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjaXNpb24oKSA8ZW0+UHJlY2lzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjaXNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIHByZWNpc2lvbiA9IFBSRUNJU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2FsZSgpIDxlbT5TY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBTQ0FMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2FsZSgpIDxlbT5TY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIHNjYWxlID0gU0NBTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29sdW1uSW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9DT0xVTU5fSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxlbmd0aDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExlbmd0aChJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29sdW1uX0xlbmd0aCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKQotCXsKLQkJcmV0dXJuIGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uSW1wbCNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoSW50ZWdlciBuZXdMZW5ndGgpCi0JewotCQlJbnRlZ2VyIG9sZExlbmd0aCA9IGxlbmd0aDsKLQkJbGVuZ3RoID0gbmV3TGVuZ3RoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTF9fTEVOR1RILCBvbGRMZW5ndGgsIGxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWNpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlY2lzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlY2lzaW9uKEludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb2x1bW5fUHJlY2lzaW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldFByZWNpc2lvbigpCi0JewotCQlyZXR1cm4gcHJlY2lzaW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW5JbXBsI2dldFByZWNpc2lvbiA8ZW0+UHJlY2lzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjaXNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWNpc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNpc2lvbihJbnRlZ2VyIG5ld1ByZWNpc2lvbikKLQl7Ci0JCUludGVnZXIgb2xkUHJlY2lzaW9uID0gcHJlY2lzaW9uOwotCQlwcmVjaXNpb24gPSBuZXdQcmVjaXNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9JTVBMX19QUkVDSVNJT04sIG9sZFByZWNpc2lvbiwgcHJlY2lzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2FsZShJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29sdW1uX1NjYWxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldFNjYWxlKCkKLQl7Ci0JCXJldHVybiBzY2FsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uSW1wbCNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjYWxlKEludGVnZXIgbmV3U2NhbGUpCi0JewotCQlJbnRlZ2VyIG9sZFNjYWxlID0gc2NhbGU7Ci0JCXNjYWxlID0gbmV3U2NhbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9JTVBMX19TQ0FMRSwgb2xkU2NhbGUsIHNjYWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9JTVBMX19MRU5HVEg6Ci0JCQkJcmV0dXJuIGdldExlbmd0aCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTF9fUFJFQ0lTSU9OOgotCQkJCXJldHVybiBnZXRQcmVjaXNpb24oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX0lNUExfX1NDQUxFOgotCQkJCXJldHVybiBnZXRTY2FsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX0lNUExfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX0lNUExfX1BSRUNJU0lPTjoKLQkJCQlzZXRQcmVjaXNpb24oKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX0lNUExfX1NDQUxFOgotCQkJCXNldFNjYWxlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9JTVBMX19MRU5HVEg6Ci0JCQkJc2V0TGVuZ3RoKExFTkdUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTF9fUFJFQ0lTSU9OOgotCQkJCXNldFByZWNpc2lvbihQUkVDSVNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX0lNUExfX1NDQUxFOgotCQkJCXNldFNjYWxlKFNDQUxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTF9fTEVOR1RIOgotCQkJCXJldHVybiBMRU5HVEhfRURFRkFVTFQgPT0gbnVsbCA/IGxlbmd0aCAhPSBudWxsIDogIUxFTkdUSF9FREVGQVVMVC5lcXVhbHMobGVuZ3RoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX0lNUExfX1BSRUNJU0lPTjoKLQkJCQlyZXR1cm4gUFJFQ0lTSU9OX0VERUZBVUxUID09IG51bGwgPyBwcmVjaXNpb24gIT0gbnVsbCA6ICFQUkVDSVNJT05fRURFRkFVTFQuZXF1YWxzKHByZWNpc2lvbik7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9JTVBMX19TQ0FMRToKLQkJCQlyZXR1cm4gU0NBTEVfRURFRkFVTFQgPT0gbnVsbCA/IHNjYWxlICE9IG51bGwgOiAhU0NBTEVfRURFRkFVTFQuZXF1YWxzKHNjYWxlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29sdW1uLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTF9fTEVOR1RIOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09MVU1OX19MRU5HVEg7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTF9fUFJFQ0lTSU9OOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09MVU1OX19QUkVDSVNJT047Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fSU1QTF9fU0NBTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NDQUxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29sdW1uLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX0xFTkdUSDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9JTVBMX19MRU5HVEg7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1BSRUNJU0lPTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9JTVBMX19QUkVDSVNJT047Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NDQUxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09MVU1OX0lNUExfX1NDQUxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobGVuZ3RoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZW5ndGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZWNpc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlY2lzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzY2FsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2NhbGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gQ29sdW1uSW1wbApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0aWJsZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGlibGVNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4MzllZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGlibGVNYXBwaW5nLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDb252ZXJ0aWJsZSBNYXBwaW5nPC9iPjwvZW0+Jy4KKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nI2lzTG9iIDxlbT5Mb2I8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcjZ2V0VGVtcG9yYWwgPGVtPlRlbXBvcmFsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nI2dldEVudW1lcmF0ZWQgPGVtPkVudW1lcmF0ZWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZygpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sQ29udmVydGlibGVNYXBwaW5nIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9iPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TG9iKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfTG9iKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzTG9iKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nI2lzTG9iIDxlbT5Mb2I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNMb2IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldExvYihib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCisJICogQHNlZSAjc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX1RlbXBvcmFsKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nI2dldFRlbXBvcmFsIDxlbT5UZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQorCSAqIEBzZWUgI2dldFRlbXBvcmFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCisJICogQHNlZSAjc2V0RW51bWVyYXRlZChFbnVtVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19FbnVtZXJhdGVkKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNnZXRFbnVtZXJhdGVkIDxlbT5FbnVtZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQorCSAqIEBzZWUgI2dldEVudW1lcmF0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGVudW1lcmF0ZWQgZWxlbWVudC4gIElmIHRoZSBlbnVtZXJhdGVkIGVsZW1lbnQgCisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGJhc2ljIGVsZW1lbnQuCisJICovCisJVGV4dFJhbmdlIGdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgdGVtcG9yYWwgZWxlbWVudC4gIElmIHRoZSB0ZW1wb3JhbCBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBiYXNpYyBlbGVtZW50LgorCSAqLworCVRleHRSYW5nZSBnZXRUZW1wb3JhbFRleHRSYW5nZSgpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBsb2IgZWxlbWVudC4gIElmIHRoZSBsb2IgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgYmFzaWMgZWxlbWVudC4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0TG9iVGV4dFJhbmdlKCk7CisKK30gLy8gQ29udmVydGFibGVNYXBwaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbERpc2NyaW1pbmF0b3JDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmluZGV4IDNmNGNkMDEuLjk5MGQzMzUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTExLDcgKzExLDEwIEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yNjMsNSArMjY2LDMyIEBACiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKIAorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJZWxlbWVudE5hbWUsCisJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKKwkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCisJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZERpc2NybWluaWF0b3JUeXBlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDb2x1bW5EZWZpbml0aW9uVHJhbnNsYXRvcigpLAorCQkJYnVpbGRMZW5ndGhUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGlzY3JtaW5pYXRvclR5cGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkRJU0NSSU1JTkFUT1JfVFlQRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRGlzY3JpbWluYXRvckNvbHVtbl9EaXNjcmltaW5hdG9yVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRMZW5ndGhUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkxFTkdUSCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRGlzY3JpbWluYXRvckNvbHVtbl9MZW5ndGgoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CiB9IC8vIERpc2NyaW1pbmF0b3JDb2x1bW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRWxlbWVudENvbGxlY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRWxlbWVudENvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjg3ZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbGVtZW50Q29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTU0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5Cb29sZWFuVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRWxlbWVudCBDb2xsZWN0aW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbEVsZW1lbnRDb2xsZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wCit7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9iKCkgPGVtPkxvYjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNMb2IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0JfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9iKCkgPGVtPkxvYjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNMb2IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGxvYiA9IExPQl9FREVGQVVMVDsKKworCS8qKgorCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAorCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRlbXBvcmFsVHlwZSBURU1QT1JBTF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZW1wb3JhbCgpIDxlbT5UZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGVtcG9yYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgdGVtcG9yYWwgPSBURU1QT1JBTF9FREVGQVVMVDsKKworCS8qKgorCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAorCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVudW1UeXBlIEVOVU1FUkFURURfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW51bWVyYXRlZCgpIDxlbT5FbnVtZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFbnVtZXJhdGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRW51bVR5cGUgZW51bWVyYXRlZCA9IEVOVU1FUkFURURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0Q2xhc3MoKSA8ZW0+VGFyZ2V0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUYXJnZXRDbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldENsYXNzKCkgPGVtPlRhcmdldCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGFyZ2V0Q2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0Q2xhc3MgPSBUQVJHRVRfQ0xBU1NfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBGZXRjaFR5cGUgRkVUQ0hfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmV0Y2goKSA8ZW0+RmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZldGNoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGZldGNoID0gRkVUQ0hfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJCeSgpIDxlbT5PcmRlciBCeTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JkZXJCeSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJfQllfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJCeSgpIDxlbT5PcmRlciBCeTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JkZXJCeSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBvcmRlckJ5ID0gT1JERVJfQllfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmRlckNvbHVtbigpIDxlbT5PcmRlciBDb2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9yZGVyQ29sdW1uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sT3JkZXJDb2x1bW4gb3JkZXJDb2x1bW47CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXkoKSA8ZW0+TWFwIEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFwS2V5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwS2V5IG1hcEtleTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUNsYXNzKCkgPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcEtleUNsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sTWFwS2V5Q2xhc3MgbWFwS2V5Q2xhc3M7CisKKwkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUZW1wb3JhbFR5cGUgTUFQX0tFWV9URU1QT1JBTF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlUZW1wb3JhbCgpIDxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlUZW1wb3JhbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSBtYXBLZXlUZW1wb3JhbCA9IE1BUF9LRVlfVEVNUE9SQUxfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbnVtVHlwZSBNQVBfS0VZX0VOVU1FUkFURURfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5RW51bWVyYXRlZCgpIDxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcEtleUVudW1lcmF0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFbnVtVHlwZSBtYXBLZXlFbnVtZXJhdGVkID0gTUFQX0tFWV9FTlVNRVJBVEVEX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkgPGVtPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Q29sdW1uKCkgPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxDb2x1bW4gbWFwS2V5Q29sdW1uOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKSA8ZW0+TWFwIEtleSBKb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxKb2luQ29sdW1uPiBtYXBLZXlKb2luQ29sdW1uczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbHVtbigpIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbENvbHVtbiBjb2x1bW47CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSA8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2xsZWN0aW9uVGFibGUoKSA8ZW0+Q29sbGVjdGlvbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29sbGVjdGlvblRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ29sbGVjdGlvblRhYmxlIGNvbGxlY3Rpb25UYWJsZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxFbGVtZW50Q29sbGVjdGlvbigpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTEVNRU5UX0NPTExFQ1RJT047CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9iPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRMb2IoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Mb2IoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTG9iKCkKKwl7CisJCXJldHVybiBsb2I7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2lzTG9iIDxlbT5Mb2I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNMb2IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiBuZXdMb2IpCisJeworCQlib29sZWFuIG9sZExvYiA9IGxvYjsKKwkJbG9iID0gbmV3TG9iOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0xPQiwgb2xkTG9iLCBsb2IpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQorCSAqIEBzZWUgI3NldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19UZW1wb3JhbCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKQorCXsKKwkJcmV0dXJuIHRlbXBvcmFsOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRUZW1wb3JhbCA8ZW0+VGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUKKwkgKiBAc2VlICNnZXRUZW1wb3JhbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkKKwl7CisJCVRlbXBvcmFsVHlwZSBvbGRUZW1wb3JhbCA9IHRlbXBvcmFsOworCQl0ZW1wb3JhbCA9IG5ld1RlbXBvcmFsID09IG51bGwgPyBURU1QT1JBTF9FREVGQVVMVCA6IG5ld1RlbXBvcmFsOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RFTVBPUkFMLCBvbGRUZW1wb3JhbCwgdGVtcG9yYWwpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKKwkgKiBAc2VlICNzZXRFbnVtZXJhdGVkKEVudW1UeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0VudW1lcmF0ZWQoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpCisJeworCQlyZXR1cm4gZW51bWVyYXRlZDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0RW51bWVyYXRlZCA8ZW0+RW51bWVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKKwkgKiBAc2VlICNnZXRFbnVtZXJhdGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RW51bWVyYXRlZChFbnVtVHlwZSBuZXdFbnVtZXJhdGVkKQorCXsKKwkJRW51bVR5cGUgb2xkRW51bWVyYXRlZCA9IGVudW1lcmF0ZWQ7CisJCWVudW1lcmF0ZWQgPSBuZXdFbnVtZXJhdGVkID09IG51bGwgPyBFTlVNRVJBVEVEX0VERUZBVUxUIDogbmV3RW51bWVyYXRlZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19FTlVNRVJBVEVELCBvbGRFbnVtZXJhdGVkLCBlbnVtZXJhdGVkKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXJnZXQgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRUYXJnZXRDbGFzcyhTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfVGFyZ2V0Q2xhc3MoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRUYXJnZXRDbGFzcygpCisJeworCQlyZXR1cm4gdGFyZ2V0Q2xhc3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldFRhcmdldENsYXNzIDxlbT5UYXJnZXQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VGFyZ2V0Q2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXRDbGFzcyhTdHJpbmcgbmV3VGFyZ2V0Q2xhc3MpCisJeworCQlTdHJpbmcgb2xkVGFyZ2V0Q2xhc3MgPSB0YXJnZXRDbGFzczsKKwkJdGFyZ2V0Q2xhc3MgPSBuZXdUYXJnZXRDbGFzczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UQVJHRVRfQ0xBU1MsIG9sZFRhcmdldENsYXNzLCB0YXJnZXRDbGFzcykpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCisJICogQHNlZSAjc2V0RmV0Y2goRmV0Y2hUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0ZldGNoKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpCisJeworCQlyZXR1cm4gZmV0Y2g7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQorCSAqIEBzZWUgI2dldEZldGNoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKQorCXsKKwkJRmV0Y2hUeXBlIG9sZEZldGNoID0gZmV0Y2g7CisJCWZldGNoID0gbmV3RmV0Y2ggPT0gbnVsbCA/IEZFVENIX0VERUZBVUxUIDogbmV3RmV0Y2g7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fRkVUQ0gsIG9sZEZldGNoLCBmZXRjaCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9yZGVyIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcmRlciBCeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBCeTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0T3JkZXJCeShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfT3JkZXJCeSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JkZXJCeSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRPcmRlckJ5KCkKKwl7CisJCXJldHVybiBvcmRlckJ5OworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRPcmRlckJ5IDxlbT5PcmRlciBCeTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE9yZGVyQnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5KFN0cmluZyBuZXdPcmRlckJ5KQorCXsKKwkJU3RyaW5nIG9sZE9yZGVyQnkgPSBvcmRlckJ5OworCQlvcmRlckJ5ID0gbmV3T3JkZXJCeTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9CWSwgb2xkT3JkZXJCeSwgb3JkZXJCeSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3JkZXIgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyIENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0T3JkZXJDb2x1bW4oWG1sT3JkZXJDb2x1bW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfT3JkZXJDb2x1bW4oKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbE9yZGVyQ29sdW1uIGdldE9yZGVyQ29sdW1uKCkKKwl7CisJCXJldHVybiBvcmRlckNvbHVtbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPcmRlckNvbHVtbihYbWxPcmRlckNvbHVtbiBuZXdPcmRlckNvbHVtbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbE9yZGVyQ29sdW1uIG9sZE9yZGVyQ29sdW1uID0gb3JkZXJDb2x1bW47CisJCW9yZGVyQ29sdW1uID0gbmV3T3JkZXJDb2x1bW47CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQ09MVU1OLCBvbGRPcmRlckNvbHVtbiwgbmV3T3JkZXJDb2x1bW4pOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRPcmRlckNvbHVtbiA8ZW0+T3JkZXIgQ29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE9yZGVyQ29sdW1uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T3JkZXJDb2x1bW4oWG1sT3JkZXJDb2x1bW4gbmV3T3JkZXJDb2x1bW4pCisJeworCQlpZiAobmV3T3JkZXJDb2x1bW4gIT0gb3JkZXJDb2x1bW4pCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKG9yZGVyQ29sdW1uICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW9yZGVyQ29sdW1uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU4sIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld09yZGVyQ29sdW1uICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld09yZGVyQ29sdW1uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU4sIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0T3JkZXJDb2x1bW4obmV3T3JkZXJDb2x1bW4sIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU4sIG5ld09yZGVyQ29sdW1uLCBuZXdPcmRlckNvbHVtbikpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0TWFwS2V5KE1hcEtleSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXkoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1hcEtleSBnZXRNYXBLZXkoKQorCXsKKwkJcmV0dXJuIG1hcEtleTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNYXBLZXkoTWFwS2V5IG5ld01hcEtleSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCU1hcEtleSBvbGRNYXBLZXkgPSBtYXBLZXk7CisJCW1hcEtleSA9IG5ld01hcEtleTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZLCBvbGRNYXBLZXksIG5ld01hcEtleSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldE1hcEtleSA8ZW0+TWFwIEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0TWFwS2V5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFwS2V5KE1hcEtleSBuZXdNYXBLZXkpCisJeworCQlpZiAobmV3TWFwS2V5ICE9IG1hcEtleSkKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAobWFwS2V5ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW1hcEtleSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3TWFwS2V5ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01hcEtleSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRNYXBLZXkobmV3TWFwS2V5LCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWSwgbmV3TWFwS2V5LCBuZXdNYXBLZXkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IENsYXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldE1hcEtleUNsYXNzKFhtbE1hcEtleUNsYXNzKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUNsYXNzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxNYXBLZXlDbGFzcyBnZXRNYXBLZXlDbGFzcygpCisJeworCQlyZXR1cm4gbWFwS2V5Q2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWFwS2V5Q2xhc3MoWG1sTWFwS2V5Q2xhc3MgbmV3TWFwS2V5Q2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxNYXBLZXlDbGFzcyBvbGRNYXBLZXlDbGFzcyA9IG1hcEtleUNsYXNzOworCQltYXBLZXlDbGFzcyA9IG5ld01hcEtleUNsYXNzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ0xBU1MsIG9sZE1hcEtleUNsYXNzLCBuZXdNYXBLZXlDbGFzcyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldE1hcEtleUNsYXNzIDxlbT5NYXAgS2V5IENsYXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENsYXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRNYXBLZXlDbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1hcEtleUNsYXNzKFhtbE1hcEtleUNsYXNzIG5ld01hcEtleUNsYXNzKQorCXsKKwkJaWYgKG5ld01hcEtleUNsYXNzICE9IG1hcEtleUNsYXNzKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChtYXBLZXlDbGFzcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCltYXBLZXlDbGFzcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DTEFTUywgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3TWFwS2V5Q2xhc3MgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TWFwS2V5Q2xhc3MpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ0xBU1MsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0TWFwS2V5Q2xhc3MobmV3TWFwS2V5Q2xhc3MsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NMQVNTLCBuZXdNYXBLZXlDbGFzcywgbmV3TWFwS2V5Q2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IFRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQorCSAqIEBzZWUgI3NldE1hcEtleVRlbXBvcmFsKFRlbXBvcmFsVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlUZW1wb3JhbCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0TWFwS2V5VGVtcG9yYWwoKQorCXsKKwkJcmV0dXJuIG1hcEtleVRlbXBvcmFsOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRNYXBLZXlUZW1wb3JhbCA8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCisJICogQHNlZSAjZ2V0TWFwS2V5VGVtcG9yYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXBLZXlUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3TWFwS2V5VGVtcG9yYWwpCisJeworCQlUZW1wb3JhbFR5cGUgb2xkTWFwS2V5VGVtcG9yYWwgPSBtYXBLZXlUZW1wb3JhbDsKKwkJbWFwS2V5VGVtcG9yYWwgPSBuZXdNYXBLZXlUZW1wb3JhbCA9PSBudWxsID8gTUFQX0tFWV9URU1QT1JBTF9FREVGQVVMVCA6IG5ld01hcEtleVRlbXBvcmFsOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfVEVNUE9SQUwsIG9sZE1hcEtleVRlbXBvcmFsLCBtYXBLZXlUZW1wb3JhbCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBFbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQorCSAqIEBzZWUgI3NldE1hcEtleUVudW1lcmF0ZWQoRW51bVR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5RW51bWVyYXRlZCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFbnVtVHlwZSBnZXRNYXBLZXlFbnVtZXJhdGVkKCkKKwl7CisJCXJldHVybiBtYXBLZXlFbnVtZXJhdGVkOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRNYXBLZXlFbnVtZXJhdGVkIDxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKKwkgKiBAc2VlICNnZXRNYXBLZXlFbnVtZXJhdGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFwS2V5RW51bWVyYXRlZChFbnVtVHlwZSBuZXdNYXBLZXlFbnVtZXJhdGVkKQorCXsKKwkJRW51bVR5cGUgb2xkTWFwS2V5RW51bWVyYXRlZCA9IG1hcEtleUVudW1lcmF0ZWQ7CisJCW1hcEtleUVudW1lcmF0ZWQgPSBuZXdNYXBLZXlFbnVtZXJhdGVkID09IG51bGwgPyBNQVBfS0VZX0VOVU1FUkFURURfRURFRkFVTFQgOiBuZXdNYXBLZXlFbnVtZXJhdGVkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfRU5VTUVSQVRFRCwgb2xkTWFwS2V5RW51bWVyYXRlZCwgbWFwS2V5RW51bWVyYXRlZCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkKKwl7CisJCWlmIChtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPT0gbnVsbCkKKwkJeworCQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPihYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVMpOworCQl9CisJCXJldHVybiBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRNYXBLZXlDb2x1bW4oWG1sQ29sdW1uKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUNvbHVtbigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQ29sdW1uIGdldE1hcEtleUNvbHVtbigpCisJeworCQlyZXR1cm4gbWFwS2V5Q29sdW1uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE1hcEtleUNvbHVtbihYbWxDb2x1bW4gbmV3TWFwS2V5Q29sdW1uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sQ29sdW1uIG9sZE1hcEtleUNvbHVtbiA9IG1hcEtleUNvbHVtbjsKKwkJbWFwS2V5Q29sdW1uID0gbmV3TWFwS2V5Q29sdW1uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09MVU1OLCBvbGRNYXBLZXlDb2x1bW4sIG5ld01hcEtleUNvbHVtbik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldE1hcEtleUNvbHVtbiA8ZW0+TWFwIEtleSBDb2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRNYXBLZXlDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDb2x1bW4oWG1sQ29sdW1uIG5ld01hcEtleUNvbHVtbikKKwl7CisJCWlmIChuZXdNYXBLZXlDb2x1bW4gIT0gbWFwS2V5Q29sdW1uKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChtYXBLZXlDb2x1bW4gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWFwS2V5Q29sdW1uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTFVNTiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3TWFwS2V5Q29sdW1uICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01hcEtleUNvbHVtbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT0xVTU4sIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0TWFwS2V5Q29sdW1uKG5ld01hcEtleUNvbHVtbiwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09MVU1OLCBuZXdNYXBLZXlDb2x1bW4sIG5ld01hcEtleUNvbHVtbikpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW59LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlKb2luQ29sdW1ucygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKQorCXsKKwkJaWYgKG1hcEtleUpvaW5Db2x1bW5zID09IG51bGwpCisJCXsKKwkJCW1hcEtleUpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9KT0lOX0NPTFVNTlMpOworCQl9CisJCXJldHVybiBtYXBLZXlKb2luQ29sdW1uczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldENvbHVtbihYbWxDb2x1bW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfQ29sdW1uKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDb2x1bW4gZ2V0Q29sdW1uKCkKKwl7CisJCXJldHVybiBjb2x1bW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29sdW1uKFhtbENvbHVtbiBuZXdDb2x1bW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxDb2x1bW4gb2xkQ29sdW1uID0gY29sdW1uOworCQljb2x1bW4gPSBuZXdDb2x1bW47CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MVU1OLCBvbGRDb2x1bW4sIG5ld0NvbHVtbik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uKQorCXsKKwkJaWYgKG5ld0NvbHVtbiAhPSBjb2x1bW4pCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGNvbHVtbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb2x1bW4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTFVNTiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q29sdW1uICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbHVtbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MVU1OLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldENvbHVtbihuZXdDb2x1bW4sIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xVTU4sIG5ld0NvbHVtbiwgbmV3Q29sdW1uKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9BdHRyaWJ1dGVPdmVycmlkZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKQorCXsKKwkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlcyA9PSBudWxsKQorCQl7CisJCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+KFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9PVkVSUklERVMpOworCQl9CisJCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpCisJeworCQlpZiAoYXNzb2NpYXRpb25PdmVycmlkZXMgPT0gbnVsbCkKKwkJeworCQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4oWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQl9CisJCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2xsZWN0aW9uIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2xsZWN0aW9uIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbGxlY3Rpb24gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldENvbGxlY3Rpb25UYWJsZShYbWxDb2xsZWN0aW9uVGFibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfQ29sbGVjdGlvblRhYmxlKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDb2xsZWN0aW9uVGFibGUgZ2V0Q29sbGVjdGlvblRhYmxlKCkKKwl7CisJCXJldHVybiBjb2xsZWN0aW9uVGFibGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29sbGVjdGlvblRhYmxlKFhtbENvbGxlY3Rpb25UYWJsZSBuZXdDb2xsZWN0aW9uVGFibGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxDb2xsZWN0aW9uVGFibGUgb2xkQ29sbGVjdGlvblRhYmxlID0gY29sbGVjdGlvblRhYmxlOworCQljb2xsZWN0aW9uVGFibGUgPSBuZXdDb2xsZWN0aW9uVGFibGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MTEVDVElPTl9UQUJMRSwgb2xkQ29sbGVjdGlvblRhYmxlLCBuZXdDb2xsZWN0aW9uVGFibGUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRDb2xsZWN0aW9uVGFibGUgPGVtPkNvbGxlY3Rpb24gVGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbGxlY3Rpb24gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENvbGxlY3Rpb25UYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbGxlY3Rpb25UYWJsZShYbWxDb2xsZWN0aW9uVGFibGUgbmV3Q29sbGVjdGlvblRhYmxlKQorCXsKKwkJaWYgKG5ld0NvbGxlY3Rpb25UYWJsZSAhPSBjb2xsZWN0aW9uVGFibGUpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGNvbGxlY3Rpb25UYWJsZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb2xsZWN0aW9uVGFibGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTExFQ1RJT05fVEFCTEUsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0NvbGxlY3Rpb25UYWJsZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb2xsZWN0aW9uVGFibGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTExFQ1RJT05fVEFCTEUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Q29sbGVjdGlvblRhYmxlKG5ld0NvbGxlY3Rpb25UYWJsZSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTExFQ1RJT05fVEFCTEUsIG5ld0NvbGxlY3Rpb25UYWJsZSwgbmV3Q29sbGVjdGlvblRhYmxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQ09MVU1OOgorCQkJCXJldHVybiBiYXNpY1NldE9yZGVyQ29sdW1uKG51bGwsIG1zZ3MpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVk6CisJCQkJcmV0dXJuIGJhc2ljU2V0TWFwS2V5KG51bGwsIG1zZ3MpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ0xBU1M6CisJCQkJcmV0dXJuIGJhc2ljU2V0TWFwS2V5Q2xhc3MobnVsbCwgbXNncyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTFVNTjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRNYXBLZXlDb2x1bW4obnVsbCwgbXNncyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9KT0lOX0NPTFVNTlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNYXBLZXlKb2luQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MVU1OOgorCQkJCXJldHVybiBiYXNpY1NldENvbHVtbihudWxsLCBtc2dzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfT1ZFUlJJREVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BU1NPQ0lBVElPTl9PVkVSUklERVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MTEVDVElPTl9UQUJMRToKKwkJCQlyZXR1cm4gYmFzaWNTZXRDb2xsZWN0aW9uVGFibGUobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0xPQjoKKwkJCQlyZXR1cm4gaXNMb2IoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19URU1QT1JBTDoKKwkJCQlyZXR1cm4gZ2V0VGVtcG9yYWwoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19FTlVNRVJBVEVEOgorCQkJCXJldHVybiBnZXRFbnVtZXJhdGVkKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEFSR0VUX0NMQVNTOgorCQkJCXJldHVybiBnZXRUYXJnZXRDbGFzcygpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0ZFVENIOgorCQkJCXJldHVybiBnZXRGZXRjaCgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0JZOgorCQkJCXJldHVybiBnZXRPcmRlckJ5KCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQ09MVU1OOgorCQkJCXJldHVybiBnZXRPcmRlckNvbHVtbigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVk6CisJCQkJcmV0dXJuIGdldE1hcEtleSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ0xBU1M6CisJCQkJcmV0dXJuIGdldE1hcEtleUNsYXNzKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9URU1QT1JBTDoKKwkJCQlyZXR1cm4gZ2V0TWFwS2V5VGVtcG9yYWwoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0VOVU1FUkFURUQ6CisJCQkJcmV0dXJuIGdldE1hcEtleUVudW1lcmF0ZWQoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6CisJCQkJcmV0dXJuIGdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09MVU1OOgorCQkJCXJldHVybiBnZXRNYXBLZXlDb2x1bW4oKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0pPSU5fQ09MVU1OUzoKKwkJCQlyZXR1cm4gZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xVTU46CisJCQkJcmV0dXJuIGdldENvbHVtbigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9PVkVSUklERVM6CisJCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FTU09DSUFUSU9OX09WRVJSSURFUzoKKwkJCQlyZXR1cm4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xMRUNUSU9OX1RBQkxFOgorCQkJCXJldHVybiBnZXRDb2xsZWN0aW9uVGFibGUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTE9COgorCQkJCXNldExvYigoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RFTVBPUkFMOgorCQkJCXNldFRlbXBvcmFsKChUZW1wb3JhbFR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19FTlVNRVJBVEVEOgorCQkJCXNldEVudW1lcmF0ZWQoKEVudW1UeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEFSR0VUX0NMQVNTOgorCQkJCXNldFRhcmdldENsYXNzKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19GRVRDSDoKKwkJCQlzZXRGZXRjaCgoRmV0Y2hUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQlk6CisJCQkJc2V0T3JkZXJCeSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQ09MVU1OOgorCQkJCXNldE9yZGVyQ29sdW1uKChYbWxPcmRlckNvbHVtbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVk6CisJCQkJc2V0TWFwS2V5KChNYXBLZXkpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NMQVNTOgorCQkJCXNldE1hcEtleUNsYXNzKChYbWxNYXBLZXlDbGFzcyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfVEVNUE9SQUw6CisJCQkJc2V0TWFwS2V5VGVtcG9yYWwoKFRlbXBvcmFsVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfRU5VTUVSQVRFRDoKKwkJCQlzZXRNYXBLZXlFbnVtZXJhdGVkKChFbnVtVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUzoKKwkJCQlnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKS5jbGVhcigpOworCQkJCWdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXR0cmlidXRlT3ZlcnJpZGU+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT0xVTU46CisJCQkJc2V0TWFwS2V5Q29sdW1uKChYbWxDb2x1bW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0pPSU5fQ09MVU1OUzoKKwkJCQlnZXRNYXBLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7CisJCQkJZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEpvaW5Db2x1bW4+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MVU1OOgorCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX09WRVJSSURFUzoKKwkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5jbGVhcigpOworCQkJCWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXR0cmlidXRlT3ZlcnJpZGU+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgorCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKKwkJCQlnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXNzb2NpYXRpb25PdmVycmlkZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xMRUNUSU9OX1RBQkxFOgorCQkJCXNldENvbGxlY3Rpb25UYWJsZSgoWG1sQ29sbGVjdGlvblRhYmxlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTE9COgorCQkJCXNldExvYihMT0JfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19URU1QT1JBTDoKKwkJCQlzZXRUZW1wb3JhbChURU1QT1JBTF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0VOVU1FUkFURUQ6CisJCQkJc2V0RW51bWVyYXRlZChFTlVNRVJBVEVEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEFSR0VUX0NMQVNTOgorCQkJCXNldFRhcmdldENsYXNzKFRBUkdFVF9DTEFTU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0ZFVENIOgorCQkJCXNldEZldGNoKEZFVENIX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQlk6CisJCQkJc2V0T3JkZXJCeShPUkRFUl9CWV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0NPTFVNTjoKKwkJCQlzZXRPcmRlckNvbHVtbigoWG1sT3JkZXJDb2x1bW4pbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVk6CisJCQkJc2V0TWFwS2V5KChNYXBLZXkpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ0xBU1M6CisJCQkJc2V0TWFwS2V5Q2xhc3MoKFhtbE1hcEtleUNsYXNzKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX1RFTVBPUkFMOgorCQkJCXNldE1hcEtleVRlbXBvcmFsKE1BUF9LRVlfVEVNUE9SQUxfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0VOVU1FUkFURUQ6CisJCQkJc2V0TWFwS2V5RW51bWVyYXRlZChNQVBfS0VZX0VOVU1FUkFURURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6CisJCQkJZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT0xVTU46CisJCQkJc2V0TWFwS2V5Q29sdW1uKChYbWxDb2x1bW4pbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfSk9JTl9DT0xVTU5TOgorCQkJCWdldE1hcEtleUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MVU1OOgorCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfT1ZFUlJJREVTOgorCQkJCWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FTU09DSUFUSU9OX09WRVJSSURFUzoKKwkJCQlnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTExFQ1RJT05fVEFCTEU6CisJCQkJc2V0Q29sbGVjdGlvblRhYmxlKChYbWxDb2xsZWN0aW9uVGFibGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19MT0I6CisJCQkJcmV0dXJuIGxvYiAhPSBMT0JfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEVNUE9SQUw6CisJCQkJcmV0dXJuIHRlbXBvcmFsICE9IFRFTVBPUkFMX0VERUZBVUxUOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0VOVU1FUkFURUQ6CisJCQkJcmV0dXJuIGVudW1lcmF0ZWQgIT0gRU5VTUVSQVRFRF9FREVGQVVMVDsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UQVJHRVRfQ0xBU1M6CisJCQkJcmV0dXJuIFRBUkdFVF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0Q2xhc3MgIT0gbnVsbCA6ICFUQVJHRVRfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKHRhcmdldENsYXNzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19GRVRDSDoKKwkJCQlyZXR1cm4gZmV0Y2ggIT0gRkVUQ0hfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQlk6CisJCQkJcmV0dXJuIE9SREVSX0JZX0VERUZBVUxUID09IG51bGwgPyBvcmRlckJ5ICE9IG51bGwgOiAhT1JERVJfQllfRURFRkFVTFQuZXF1YWxzKG9yZGVyQnkpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0NPTFVNTjoKKwkJCQlyZXR1cm4gb3JkZXJDb2x1bW4gIT0gbnVsbDsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZOgorCQkJCXJldHVybiBtYXBLZXkgIT0gbnVsbDsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NMQVNTOgorCQkJCXJldHVybiBtYXBLZXlDbGFzcyAhPSBudWxsOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfVEVNUE9SQUw6CisJCQkJcmV0dXJuIG1hcEtleVRlbXBvcmFsICE9IE1BUF9LRVlfVEVNUE9SQUxfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9FTlVNRVJBVEVEOgorCQkJCXJldHVybiBtYXBLZXlFbnVtZXJhdGVkICE9IE1BUF9LRVlfRU5VTUVSQVRFRF9FREVGQVVMVDsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6CisJCQkJcmV0dXJuIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyAhPSBudWxsICYmICFtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaXNFbXB0eSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09MVU1OOgorCQkJCXJldHVybiBtYXBLZXlDb2x1bW4gIT0gbnVsbDsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0pPSU5fQ09MVU1OUzoKKwkJCQlyZXR1cm4gbWFwS2V5Sm9pbkNvbHVtbnMgIT0gbnVsbCAmJiAhbWFwS2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTFVNTjoKKwkJCQlyZXR1cm4gY29sdW1uICE9IG51bGw7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX09WRVJSSURFUzoKKwkJCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZU92ZXJyaWRlcy5pc0VtcHR5KCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgorCQkJCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlcyAhPSBudWxsICYmICFhc3NvY2lhdGlvbk92ZXJyaWRlcy5pc0VtcHR5KCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MTEVDVElPTl9UQUJMRToKKwkJCQlyZXR1cm4gY29sbGVjdGlvblRhYmxlICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19MT0I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19MT0I7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RFTVBPUkFMOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUw7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0VOVU1FUkFURUQ6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19FTlVNRVJBVEVEOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UQVJHRVRfQ0xBU1M6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19UQVJHRVRfQ0xBU1M7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0ZFVENIOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fRkVUQ0g7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0JZOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fT1JERVJfQlk7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0NPTFVNTjogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX09SREVSX0NPTFVNTjsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWTogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVk7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ0xBU1M6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0NMQVNTOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX1RFTVBPUkFMOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9URU1QT1JBTDsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9FTlVNRVJBVEVEOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9FTlVNRVJBVEVEOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09MVU1OOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9DT0xVTU47CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9KT0lOX0NPTFVNTlM7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTFVNTjogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0NPTFVNTjsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0FUVFJJQlVURV9PVkVSUklERVM7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FTU09DSUFUSU9OX09WRVJSSURFUzogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0FTU09DSUFUSU9OX09WRVJSSURFUzsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MTEVDVElPTl9UQUJMRTogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0NPTExFQ1RJT05fVEFCTEU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0xPQjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTE9COworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RFTVBPUkFMOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fRU5VTUVSQVRFRDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fRU5VTUVSQVRFRDsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX1RBUkdFVF9DTEFTUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEFSR0VUX0NMQVNTOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fRkVUQ0g6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0ZFVENIOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fT1JERVJfQlk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0JZOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fT1JERVJfQ09MVU1OOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU47CisJCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9DTEFTUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DTEFTUzsKKwkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfVEVNUE9SQUw7CisJCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0VOVU1FUkFURUQ6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfRU5VTUVSQVRFRDsKKwkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9DT0xVTU46IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09MVU1OOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfSk9JTl9DT0xVTU5TOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQ09MVU1OOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xVTU47CisJCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19BVFRSSUJVVEVfT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfT1ZFUlJJREVTOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BU1NPQ0lBVElPTl9PVkVSUklERVM7CisJCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19DT0xMRUNUSU9OX1RBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xMRUNUSU9OX1RBQkxFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobG9iOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChsb2IpOworCQlyZXN1bHQuYXBwZW5kKCIsIHRlbXBvcmFsOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh0ZW1wb3JhbCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgZW51bWVyYXRlZDogIik7CisJCXJlc3VsdC5hcHBlbmQoZW51bWVyYXRlZCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgdGFyZ2V0Q2xhc3M6ICIpOworCQlyZXN1bHQuYXBwZW5kKHRhcmdldENsYXNzKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBmZXRjaDogIik7CisJCXJlc3VsdC5hcHBlbmQoZmV0Y2gpOworCQlyZXN1bHQuYXBwZW5kKCIsIG9yZGVyQnk6ICIpOworCQlyZXN1bHQuYXBwZW5kKG9yZGVyQnkpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1hcEtleVRlbXBvcmFsOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXBLZXlUZW1wb3JhbCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbWFwS2V5RW51bWVyYXRlZDogIik7CisJCXJlc3VsdC5hcHBlbmQobWFwS2V5RW51bWVyYXRlZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gc3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBMl8wLkVOVU1FUkFURUQpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldExvYlRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEyXzAuTE9CKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRUZW1wb3JhbFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEyXzAuVEVNUE9SQUwpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRhcmdldENsYXNzVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQTJfMC5UQVJHRVRfQ0xBU1MpOworCX0KKwkKKwkvLyAqKioqKioqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkVGFyZ2V0Q2xhc3NUcmFuc2xhdG9yKCksCisJCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCisJCQlidWlsZE9yZGVyQnlUcmFuc2xhdG9yKCksCisJCQlYbWxPcmRlckNvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk9SREVSX0NPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9PcmRlckNvbHVtbigpKSwJCQorCQkJYnVpbGRNYXBLZXlUcmFuc2xhdG9yKCksCisJCQlYbWxNYXBLZXlDbGFzcy5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfQ0xBU1MsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5Q2xhc3MoKSksCQkKKwkJCWJ1aWxkTWFwS2V5VGVtcG9yYWxUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcEtleUVudW1lcmF0ZWRUcmFuc2xhdG9yKCksCisJCQlYbWxBdHRyaWJ1dGVPdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpKSwJCQorCQkJWG1sQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuTUFQX0tFWV9DT0xVTU4sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5Q29sdW1uKCkpLAkJCisJCQlYbWxKb2luQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlKb2luQ29sdW1ucygpKSwJCQorCQkJWG1sQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0NvbHVtbigpKSwJCQorCQkJYnVpbGRUZW1wb3JhbFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRW51bWVyYXRlZFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTG9iVHJhbnNsYXRvcigpLAorCQkJWG1sQXR0cmlidXRlT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5BVFRSSUJVVEVfT1ZFUlJJREUsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfQXR0cmlidXRlT3ZlcnJpZGVzKCkpLAkJCisJCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuQVNTT0NJQVRJT05fT1ZFUlJJREUsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfQXNzb2NpYXRpb25PdmVycmlkZXMoKSksCQkKKwkJCVhtbENvbGxlY3Rpb25UYWJsZS5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfQ29sbGVjdGlvblRhYmxlKCkpCQkJCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRhcmdldENsYXNzVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQTJfMC5UQVJHRVRfQ0xBU1MsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfVGFyZ2V0Q2xhc3MoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRmV0Y2hUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkZFVENILCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0ZldGNoKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9yZGVyQnlUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKEpQQS5PUkRFUl9CWSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9PcmRlckJ5KCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEuQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0NvbHVtbigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTG9iVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEpQQS5MT0IsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Mb2IoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRlbXBvcmFsVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5URU1QT1JBTCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX1RlbXBvcmFsKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFbnVtZXJhdGVkVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5FTlVNRVJBVEVELCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfRW51bWVyYXRlZCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEpQQS5NQVBfS0VZLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5VGVtcG9yYWxUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfRU5VTUVSQVRFRCwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlUZW1wb3JhbCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5RW51bWVyYXRlZFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuTUFQX0tFWV9FTlVNRVJBVEVELCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUVudW1lcmF0ZWQoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGFibGUuamF2YQppbmRleCA2ZmMzZTIxLi5mMWYyNzdiIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGFibGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGFibGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw2ICsxMCwxMCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTI5LDExICszMyw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBYbWxFbWJlZGRhYmxlIGV4dGVuZHMgQWJzdHJhY3RYbWxUeXBlTWFwcGluZwogewotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFjY2Vzc1R5cGUgQUNDRVNTX0VERUZBVUxUID0gbnVsbDsKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC00NSw2ICs0NCwxMCBAQAogCQlzdXBlcigpOwogCX0KIAkKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7CisJfQorCQogCXB1YmxpYyBYbWxFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKIAkJcmV0dXJuIChYbWxFbnRpdHlNYXBwaW5ncykgZUNvbnRhaW5lcigpOwogCX0KQEAgLTU5LDUgKzYyLDI0IEBACiAJewogCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfRU1CRUREQUJMRTsKIAl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCiAKLX0gLy8gRW1iZWRkYWJsZQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZENsYXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCisJCQlidWlsZE1ldGFkYXRhQ29tcGxldGVUcmFuc2xhdG9yKCksCisJCQlidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBdHRyaWJ1dGVzVHJhbnNsYXRvcigpCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQUNDRVNTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NIb2xkZXJfQWNjZXNzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZC5qYXZhCmluZGV4IGZlMTU4NGMuLjQ4OGU5NWEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGVkLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw2ICs5LDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW1iZWRkZWRfMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTIzLDEwICszNSwyMjEgQEAKICAqCiAgKgogICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRlZCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRW1iZWRkZWQgZXh0ZW5kcyBCYXNlWG1sRW1iZWRkZWQKK3B1YmxpYyBjbGFzcyBYbWxFbWJlZGRlZCBleHRlbmRzIEFic3RyYWN0WG1sRW1iZWRkZWQgaW1wbGVtZW50cyBYbWxFbWJlZGRlZF8yXzAKIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIDxlbT5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlczsKIAotfSAvLyBFbWJlZGRlZAorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxFbWJlZGRlZCgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTUJFRERFRDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyX0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpCisJeworCQlpZiAoYXNzb2NpYXRpb25PdmVycmlkZXMgPT0gbnVsbCkKKwkJeworCQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4oWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCX0KKwkJcmV0dXJuIGFzc29jaWF0aW9uT3ZlcnJpZGVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKKwkJCQlyZXR1cm4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BU1NPQ0lBVElPTl9PVkVSUklERVM6CisJCQkJZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOworCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgorCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgorCQkJCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlcyAhPSBudWxsICYmICFhc3NvY2lhdGlvbk92ZXJyaWRlcy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfX0FTU09DSUFUSU9OX09WRVJSSURFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbWJlZGRlZF8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FTU09DSUFUSU9OX09WRVJSSURFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbWJlZGRlZF8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCisJCQlidWlsZEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQXNzb2NpYXRpb25PdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyX0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWRJZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZElkLmphdmEKaW5kZXggNDVmNjcyMy4uMjg5MTQyYSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZElkLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZElkLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw2ICs5LDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTIzLDEwICsyOCw0NyBAQAogICoKICAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVtYmVkZGVkSWQgZXh0ZW5kcyBYbWxBdHRyaWJ1dGVNYXBwaW5nLCBCYXNlWG1sRW1iZWRkZWQKK3B1YmxpYyBjbGFzcyBYbWxFbWJlZGRlZElkIGV4dGVuZHMgQWJzdHJhY3RYbWxFbWJlZGRlZAogeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxFbWJlZGRlZElkKCkKKwl7CisJCXN1cGVyKCk7CisJfQogCi19IC8vIEVtYmVkZGVkSWQKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfRU1CRURERURfSUQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCkKKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGVkSWRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGVkSWRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNjZhYzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZElkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbWJlZGRlZCBJZDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRJZEltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sRW1iZWRkZWRJZEltcGwgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxFbWJlZGRlZElkCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkgPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxFbWJlZGRlZElkSW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTUJFRERFRF9JRF9JTVBMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRCYXNlWG1sRW1iZWRkZWRfQXR0cmlidXRlT3ZlcnJpZGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkKLQl7Ci0JCWlmIChhdHRyaWJ1dGVPdmVycmlkZXMgPT0gbnVsbCkKLQkJewotCQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPihYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfSU1QTF9fQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfSU1QTF9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9JTVBMX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0lNUExfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9JTVBMX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfSU1QTF9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZU92ZXJyaWRlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IEJhc2VYbWxFbWJlZGRlZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfSU1QTF9fQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuQkFTRV9YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW1iZWRkZWRJZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gQmFzZVhtbEVtYmVkZGVkLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkJBU0VfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfSU1QTF9fQVRUUklCVVRFX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbWJlZGRlZElkLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLX0gLy8gRW1iZWRkZWRJZApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZEltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MDRmZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW1iZWRkZWQ8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSW1wbCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFbWJlZGRlZEltcGwgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxFbWJlZGRlZAotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZU92ZXJyaWRlcygpIDxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZU92ZXJyaWRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRW1iZWRkZWRJbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0VNQkVEREVEX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEJhc2VYbWxFbWJlZGRlZF9BdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKQotCXsKLQkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+KFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JTVBMX19BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JTVBMX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lNUExfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSU1QTF9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXR0cmlidXRlT3ZlcnJpZGU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lNUExfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JTVBMX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZXMgIT0gbnVsbCAmJiAhYXR0cmlidXRlT3ZlcnJpZGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gQmFzZVhtbEVtYmVkZGVkLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JTVBMX19BVFRSSUJVVEVfT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5CQVNFX1hNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbWJlZGRlZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gQmFzZVhtbEVtYmVkZGVkLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkJBU0VfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU1CRURERURfSU1QTF9fQVRUUklCVVRFX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbWJlZGRlZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi19IC8vIEVtYmVkZGVkCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVudGl0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHkuamF2YQppbmRleCA2MDE4Y2IyLi5mMWNiN2E3IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVudGl0eS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTQsMTAgKzE0LDIwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNDEsMjMgKzUxLDEwIEBACiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRJbmhlcml0YW5jZSA8ZW0+SW5oZXJpdGFuY2U8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0RGlzY3JpbWluYXRvclZhbHVlIDxlbT5EaXNjcmltaW5hdG9yIFZhbHVlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldERpc2NyaW1pbmF0b3JDb2x1bW4gPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFNlcXVlbmNlR2VuZXJhdG9yIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0VGFibGVHZW5lcmF0b3IgPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXROYW1lZFF1ZXJpZXMgPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0TmFtZWROYXRpdmVRdWVyaWVzIDxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncyA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycyA8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNpc0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzIDxlbT5FeGNsdWRlIFN1cGVyY2xhc3MgTGlzdGVuZXJzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEVudGl0eUxpc3RlbmVycyA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQcmVQZXJzaXN0IDxlbT5QcmUgUGVyc2lzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQb3N0UGVyc2lzdCA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByZVJlbW92ZSA8ZW0+UHJlIFJlbW92ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQb3N0UmVtb3ZlIDxlbT5Qb3N0IFJlbW92ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQcmVVcGRhdGUgPGVtPlByZSBVcGRhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UG9zdFVwZGF0ZSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UG9zdExvYWQgPGVtPlBvc3QgTG9hZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRBdHRyaWJ1dGVPdmVycmlkZXMgPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMgPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+fTwvbGk+CiAgKiA8L3VsPgogICogPC9wPgogICoKQEAgLTY1LDEzICs2MiwxNTggQEAKICAqIEBtb2RlbCBraW5kPSJjbGFzcyIKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIFhtbEVudGl0eSBleHRlbmRzIEFic3RyYWN0WG1sVHlwZU1hcHBpbmcKK3B1YmxpYyBjbGFzcyBYbWxFbnRpdHkgZXh0ZW5kcyBBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIGltcGxlbWVudHMgWG1sUXVlcnlDb250YWluZXIsIFhtbEdlbmVyYXRvckNvbnRhaW5lciwgWG1sRXZlbnRNZXRob2RDb250YWluZXIsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLCBYbWxFbnRpdHlfMl8wCiB7CisKIAkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZWRRdWVyaWVzKCkgPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TmFtZWRRdWVyaWVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFjY2Vzc1R5cGUgQUNDRVNTX0VERUZBVUxUID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkgPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWVkTmF0aXZlUXVlcmllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbE5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkgPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhYmxlR2VuZXJhdG9yKCkgPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGFibGVHZW5lcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZVBlcnNpc3QoKSA8ZW0+UHJlIFBlcnNpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFByZVBlcnNpc3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQcmVQZXJzaXN0IHByZVBlcnNpc3Q7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0UGVyc2lzdCgpIDxlbT5Qb3N0IFBlcnNpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBvc3RQZXJzaXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUG9zdFBlcnNpc3QgcG9zdFBlcnNpc3Q7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVSZW1vdmUoKSA8ZW0+UHJlIFJlbW92ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJlUmVtb3ZlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJlUmVtb3ZlIHByZVJlbW92ZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3RSZW1vdmUoKSA8ZW0+UG9zdCBSZW1vdmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBvc3RSZW1vdmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQb3N0UmVtb3ZlIHBvc3RSZW1vdmU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVVcGRhdGUoKSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJlVXBkYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUHJlVXBkYXRlIHByZVVwZGF0ZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3RVcGRhdGUoKSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBvc3RVcGRhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBQb3N0VXBkYXRlIHBvc3RVcGRhdGU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0TG9hZCgpIDxlbT5Qb3N0IExvYWQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBvc3RMb2FkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUG9zdExvYWQgcG9zdExvYWQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSA8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXM7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FjaGVhYmxlKCkgPGVtPkNhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2FjaGVhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gQ0FDSEVBQkxFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhY2hlYWJsZSgpIDxlbT5DYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENhY2hlYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJvb2xlYW4gY2FjaGVhYmxlID0gQ0FDSEVBQkxFX0VERUZBVUxUOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTc0LDQ2ICszMTYsNiBAQAogCXByb3RlY3RlZCBYbWxEaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW47CiAKIAkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3I7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZUdlbmVyYXRvcigpIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhYmxlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3I7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZFF1ZXJpZXMoKSA8ZW0+TmFtZWQgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lZFF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSA8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzOwotCi0JLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKSA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0yNzQsOTYgKzM3Niw2IEBACiAJcHJvdGVjdGVkIEVudGl0eUxpc3RlbmVycyBlbnRpdHlMaXN0ZW5lcnM7CiAKIAkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVQZXJzaXN0KCkgPGVtPlByZSBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJlUGVyc2lzdCBwcmVQZXJzaXN0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdFBlcnNpc3QoKSA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0UGVyc2lzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RQZXJzaXN0IHBvc3RQZXJzaXN0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlUmVtb3ZlKCkgPGVtPlByZSBSZW1vdmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZVJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByZVJlbW92ZSBwcmVSZW1vdmU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0UmVtb3ZlKCkgPGVtPlBvc3QgUmVtb3ZlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0UmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdFJlbW92ZSBwb3N0UmVtb3ZlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlVXBkYXRlKCkgPGVtPlByZSBVcGRhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZVVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByZVVwZGF0ZSBwcmVVcGRhdGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0VXBkYXRlKCkgPGVtPlBvc3QgVXBkYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0VXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdFVwZGF0ZSBwb3N0VXBkYXRlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdExvYWQoKSA8ZW0+UG9zdCBMb2FkPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0TG9hZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RMb2FkIHBvc3RMb2FkOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkgPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCi0JLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCkBAIC0zNzIsNiArMzg0LDEwIEBACiAJewogCQlzdXBlcigpOwogCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWTsKKwl9CiAKIAlwdWJsaWMgWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MoKSB7CiAJCXJldHVybiAoWG1sRW50aXR5TWFwcGluZ3MpIGVDb250YWluZXIoKTsKQEAgLTc1NCw3ICs3NzAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCiAJICogQHNlZSAjc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfU2VxdWVuY2VHZW5lcmF0b3IoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1NlcXVlbmNlR2VuZXJhdG9yKCkKIAkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwpAQCAtODE0LDcgKzgzMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KIAkgKiBAc2VlICNzZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9UYWJsZUdlbmVyYXRvcigpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JDb250YWluZXJfVGFibGVHZW5lcmF0b3IoKQogCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCkBAIC04NzQsNyArODkwLDcgQEAKIAkgKiA8L3A+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9OYW1lZFF1ZXJpZXMoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRRdWVyaWVzKCkKIAkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwpAQCAtODk3LDcgKzkxMyw3IEBACiAJICogPC9wPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X05hbWVkTmF0aXZlUXVlcmllcygpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZE5hdGl2ZVF1ZXJpZXMoKQogCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCkBAIC0xMDczLDcgKzEwODksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KIAkgKiBAc2VlICNzZXRQcmVQZXJzaXN0KFByZVBlcnNpc3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfUHJlUGVyc2lzdCgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVQZXJzaXN0KCkKIAkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwpAQCAtMTEzMyw3ICsxMTQ5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgogCSAqIEBzZWUgI3NldFBvc3RQZXJzaXN0KFBvc3RQZXJzaXN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X1Bvc3RQZXJzaXN0KCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RQZXJzaXN0KCkKIAkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwpAQCAtMTE5Myw3ICsxMjA5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KIAkgKiBAc2VlICNzZXRQcmVSZW1vdmUoUHJlUmVtb3ZlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X1ByZVJlbW92ZSgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVSZW1vdmUoKQogCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCkBAIC0xMjUzLDcgKzEyNjksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KIAkgKiBAc2VlICNzZXRQb3N0UmVtb3ZlKFBvc3RSZW1vdmUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfUG9zdFJlbW92ZSgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0UmVtb3ZlKCkKIAkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwpAQCAtMTMxMyw3ICsxMzI5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KIAkgKiBAc2VlICNzZXRQcmVVcGRhdGUoUHJlVXBkYXRlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X1ByZVVwZGF0ZSgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVVcGRhdGUoKQogCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCkBAIC0xMzczLDcgKzEzODksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KIAkgKiBAc2VlICNzZXRQb3N0VXBkYXRlKFBvc3RVcGRhdGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfUG9zdFVwZGF0ZSgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0VXBkYXRlKCkKIAkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwpAQCAtMTQzMyw3ICsxNDQ5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IExvYWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgogCSAqIEBzZWUgI3NldFBvc3RMb2FkKFBvc3RMb2FkKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X1Bvc3RMb2FkKCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RMb2FkKCkKIAkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwpAQCAtMTQ5Myw3ICsxNTA5LDcgQEAKIAkgKiA8L3A+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9BdHRyaWJ1dGVPdmVycmlkZXMoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfQXR0cmlidXRlT3ZlcnJpZGVzKCkKIAkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwpAQCAtMTUxNiw3ICsxNTMyLDcgQEAKIAkgKiA8L3A+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfQXNzb2NpYXRpb25PdmVycmlkZXMoKQogCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCkBAIC0xNTMwLDYgKzE1NDYsNDEgQEAKIAl9CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENhY2hlYWJsZShCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVhYmxlMl8wX0NhY2hlYWJsZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvb2xlYW4gZ2V0Q2FjaGVhYmxlKCkKKwl7CisJCXJldHVybiBjYWNoZWFibGU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDYWNoZWFibGUgPGVtPkNhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDYWNoZWFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDYWNoZWFibGUoQm9vbGVhbiBuZXdDYWNoZWFibGUpCisJeworCQlCb29sZWFuIG9sZENhY2hlYWJsZSA9IGNhY2hlYWJsZTsKKwkJY2FjaGVhYmxlID0gbmV3Q2FjaGVhYmxlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFQUJMRSwgb2xkQ2FjaGVhYmxlLCBjYWNoZWFibGUpKTsKKwl9CisKKwkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKQEAgLTE1MzksMzAgKzE1OTAsMTQgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VGFibGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VDT05EQVJZX1RBQkxFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlY29uZGFyeVRhYmxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JRF9DTEFTUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRJZENsYXNzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFOgotCQkJCXJldHVybiBiYXNpY1NldEluaGVyaXRhbmNlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OOgotCQkJCXJldHVybiBiYXNpY1NldERpc2NyaW1pbmF0b3JDb2x1bW4obnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihudWxsLCBtc2dzKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9RVUVSSUVTOgogCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWRRdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKIAkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5hbWVkTmF0aXZlUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRFbnRpdHlMaXN0ZW5lcnMobnVsbCwgbXNncyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VRVUVOQ0VfR0VORVJBVE9SOgorCQkJCXJldHVybiBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKG51bGwsIG1zZ3MpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihudWxsLCBtc2dzKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUEVSU0lTVDoKIAkJCQlyZXR1cm4gYmFzaWNTZXRQcmVQZXJzaXN0KG51bGwsIG1zZ3MpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUEVSU0lTVDoKQEAgLTE1ODEsNiArMTYxNiwyMiBAQAogCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVM6CiAJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEU6CisJCQkJcmV0dXJuIGJhc2ljU2V0VGFibGUobnVsbCwgbXNncyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VDT05EQVJZX1RBQkxFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlY29uZGFyeVRhYmxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JRF9DTEFTUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRJZENsYXNzKG51bGwsIG1zZ3MpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFOgorCQkJCXJldHVybiBiYXNpY1NldEluaGVyaXRhbmNlKG51bGwsIG1zZ3MpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OOgorCQkJCXJldHVybiBiYXNpY1NldERpc2NyaW1pbmF0b3JDb2x1bW4obnVsbCwgbXNncyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRU5USVRZX0xJU1RFTkVSUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRFbnRpdHlMaXN0ZW5lcnMobnVsbCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTE1OTUsMzggKzE2NDYsMTQgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFOgotCQkJCXJldHVybiBnZXRUYWJsZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFQ09OREFSWV9UQUJMRVM6Ci0JCQkJcmV0dXJuIGdldFNlY29uZGFyeVRhYmxlcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSURfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldElkQ2xhc3MoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkhFUklUQU5DRToKLQkJCQlyZXR1cm4gZ2V0SW5oZXJpdGFuY2UoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFOgotCQkJCXJldHVybiBnZXREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX0NPTFVNTjoKLQkJCQlyZXR1cm4gZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFRhYmxlR2VuZXJhdG9yKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfUVVFUklFUzoKIAkJCQlyZXR1cm4gZ2V0TmFtZWRRdWVyaWVzKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfTkFUSVZFX1FVRVJJRVM6CiAJCQkJcmV0dXJuIGdldE5hbWVkTmF0aXZlUXVlcmllcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGlzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTOgotCQkJCXJldHVybiBnZXRFbnRpdHlMaXN0ZW5lcnMoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1I6CisJCQkJcmV0dXJuIGdldFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SOgorCQkJCXJldHVybiBnZXRUYWJsZUdlbmVyYXRvcigpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUOgogCQkJCXJldHVybiBnZXRQcmVQZXJzaXN0KCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9QRVJTSVNUOgpAQCAtMTY0NSw2ICsxNjcyLDMyIEBACiAJCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKIAkJCQlyZXR1cm4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRUFCTEU6CisJCQkJcmV0dXJuIGdldENhY2hlYWJsZSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUU6CisJCQkJcmV0dXJuIGdldE5hbWUoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRToKKwkJCQlyZXR1cm4gZ2V0VGFibGUoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRUNPTkRBUllfVEFCTEVTOgorCQkJCXJldHVybiBnZXRTZWNvbmRhcnlUYWJsZXMoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6CisJCQkJcmV0dXJuIGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lEX0NMQVNTOgorCQkJCXJldHVybiBnZXRJZENsYXNzKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0U6CisJCQkJcmV0dXJuIGdldEluaGVyaXRhbmNlKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0RGlzY3JpbWluYXRvclZhbHVlKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU46CisJCQkJcmV0dXJuIGdldERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKKwkJCQlyZXR1cm4gZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTOgorCQkJCXJldHVybiBpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzoKKwkJCQlyZXR1cm4gaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlM6CisJCQkJcmV0dXJuIGdldEVudGl0eUxpc3RlbmVycygpOwogCQl9CiAJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwogCX0KQEAgLTE2NjAsMzggKzE3MTMsNiBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFOgotCQkJCXNldFRhYmxlKChYbWxUYWJsZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFQ09OREFSWV9UQUJMRVM6Ci0JCQkJZ2V0U2Vjb25kYXJ5VGFibGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWNvbmRhcnlUYWJsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFNlY29uZGFyeVRhYmxlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSURfQ0xBU1M6Ci0JCQkJc2V0SWRDbGFzcygoWG1sSWRDbGFzcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFOgotCQkJCXNldEluaGVyaXRhbmNlKChJbmhlcml0YW5jZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUU6Ci0JCQkJc2V0RGlzY3JpbWluYXRvclZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX0NPTFVNTjoKLQkJCQlzZXREaXNjcmltaW5hdG9yQ29sdW1uKChYbWxEaXNjcmltaW5hdG9yQ29sdW1uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXNldFNlcXVlbmNlR2VuZXJhdG9yKChYbWxTZXF1ZW5jZUdlbmVyYXRvciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcigoWG1sVGFibGVHZW5lcmF0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9RVUVSSUVTOgogCQkJCWdldE5hbWVkUXVlcmllcygpLmNsZWFyKCk7CiAJCQkJZ2V0TmFtZWRRdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFF1ZXJ5PiluZXdWYWx1ZSk7CkBAIC0xNzAwLDE4ICsxNzIxLDExIEBACiAJCQkJZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuY2xlYXIoKTsKIAkJCQlnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE5hbWVkTmF0aXZlUXVlcnk+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6Ci0JCQkJZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTcWxSZXN1bHRTZXRNYXBwaW5nPiluZXdWYWx1ZSk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VRVUVOQ0VfR0VORVJBVE9SOgorCQkJCXNldFNlcXVlbmNlR2VuZXJhdG9yKChYbWxTZXF1ZW5jZUdlbmVyYXRvciluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlM6Ci0JCQkJc2V0RXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM6Ci0JCQkJc2V0RXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJc2V0RW50aXR5TGlzdGVuZXJzKChFbnRpdHlMaXN0ZW5lcnMpbmV3VmFsdWUpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUjoKKwkJCQlzZXRUYWJsZUdlbmVyYXRvcigoWG1sVGFibGVHZW5lcmF0b3IpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUEVSU0lTVDoKIAkJCQlzZXRQcmVQZXJzaXN0KChQcmVQZXJzaXN0KW5ld1ZhbHVlKTsKQEAgLTE3NDIsNiArMTc1Niw0OCBAQAogCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKIAkJCQlnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXNzb2NpYXRpb25PdmVycmlkZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRUFCTEU6CisJCQkJc2V0Q2FjaGVhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRToKKwkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRToKKwkJCQlzZXRUYWJsZSgoWG1sVGFibGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRUNPTkRBUllfVEFCTEVTOgorCQkJCWdldFNlY29uZGFyeVRhYmxlcygpLmNsZWFyKCk7CisJCQkJZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxTZWNvbmRhcnlUYWJsZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6CisJCQkJZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKKwkJCQlnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lEX0NMQVNTOgorCQkJCXNldElkQ2xhc3MoKFhtbElkQ2xhc3MpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkhFUklUQU5DRToKKwkJCQlzZXRJbmhlcml0YW5jZSgoSW5oZXJpdGFuY2UpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFOgorCQkJCXNldERpc2NyaW1pbmF0b3JWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU46CisJCQkJc2V0RGlzY3JpbWluYXRvckNvbHVtbigoWG1sRGlzY3JpbWluYXRvckNvbHVtbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgorCQkJCWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkuY2xlYXIoKTsKKwkJCQlnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3FsUmVzdWx0U2V0TWFwcGluZz4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTOgorCQkJCXNldEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzoKKwkJCQlzZXRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlM6CisJCQkJc2V0RW50aXR5TGlzdGVuZXJzKChFbnRpdHlMaXN0ZW5lcnMpbmV3VmFsdWUpOworCQkJCXJldHVybjsKIAkJfQogCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwogCX0KQEAgLTE3NTYsNTMgKzE4MTIsMTcgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRToKLQkJCQlzZXRUYWJsZSgoWG1sVGFibGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFQ09OREFSWV9UQUJMRVM6Ci0JCQkJZ2V0U2Vjb25kYXJ5VGFibGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lEX0NMQVNTOgotCQkJCXNldElkQ2xhc3MoKFhtbElkQ2xhc3MpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFOgotCQkJCXNldEluaGVyaXRhbmNlKChJbmhlcml0YW5jZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9WQUxVRToKLQkJCQlzZXREaXNjcmltaW5hdG9yVmFsdWUoRElTQ1JJTUlOQVRPUl9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OOgotCQkJCXNldERpc2NyaW1pbmF0b3JDb2x1bW4oKFhtbERpc2NyaW1pbmF0b3JDb2x1bW4pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcigoWG1sU2VxdWVuY2VHZW5lcmF0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcigoWG1sVGFibGVHZW5lcmF0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1FVRVJJRVM6CiAJCQkJZ2V0TmFtZWRRdWVyaWVzKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfTkFUSVZFX1FVRVJJRVM6CiAJCQkJZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6Ci0JCQkJZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKS5jbGVhcigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFUVVFTkNFX0dFTkVSQVRPUjoKKwkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcigoWG1sU2VxdWVuY2VHZW5lcmF0b3IpbnVsbCk7CiAJCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlM6Ci0JCQkJc2V0RXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM6Ci0JCQkJc2V0RXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJc2V0RW50aXR5TGlzdGVuZXJzKChFbnRpdHlMaXN0ZW5lcnMpbnVsbCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SOgorCQkJCXNldFRhYmxlR2VuZXJhdG9yKChYbWxUYWJsZUdlbmVyYXRvciludWxsKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1BFUlNJU1Q6CiAJCQkJc2V0UHJlUGVyc2lzdCgoUHJlUGVyc2lzdCludWxsKTsKQEAgLTE4MzEsNiArMTg1MSw0NSBAQAogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKIAkJCQlnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFQUJMRToKKwkJCQlzZXRDYWNoZWFibGUoQ0FDSEVBQkxFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRToKKwkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRToKKwkJCQlzZXRUYWJsZSgoWG1sVGFibGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFQ09OREFSWV9UQUJMRVM6CisJCQkJZ2V0U2Vjb25kYXJ5VGFibGVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgorCQkJCWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lEX0NMQVNTOgorCQkJCXNldElkQ2xhc3MoKFhtbElkQ2xhc3MpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFOgorCQkJCXNldEluaGVyaXRhbmNlKChJbmhlcml0YW5jZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9WQUxVRToKKwkJCQlzZXREaXNjcmltaW5hdG9yVmFsdWUoRElTQ1JJTUlOQVRPUl9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OOgorCQkJCXNldERpc2NyaW1pbmF0b3JDb2x1bW4oKFhtbERpc2NyaW1pbmF0b3JDb2x1bW4pbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgorCQkJCWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUzoKKwkJCQlzZXRFeGNsdWRlRGVmYXVsdExpc3RlbmVycyhFWENMVURFX0RFRkFVTFRfTElTVEVORVJTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzoKKwkJCQlzZXRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyhFWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRU5USVRZX0xJU1RFTkVSUzoKKwkJCQlzZXRFbnRpdHlMaXN0ZW5lcnMoKEVudGl0eUxpc3RlbmVycyludWxsKTsKKwkJCQlyZXR1cm47CiAJCX0KIAkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CiAJfQpAQCAtMTg0NSwzOCArMTkwNCwxNCBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEU6Ci0JCQkJcmV0dXJuIHRhYmxlICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VDT05EQVJZX1RBQkxFUzoKLQkJCQlyZXR1cm4gc2Vjb25kYXJ5VGFibGVzICE9IG51bGwgJiYgIXNlY29uZGFyeVRhYmxlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgIT0gbnVsbCAmJiAhcHJpbWFyeUtleUpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JRF9DTEFTUzoKLQkJCQlyZXR1cm4gaWRDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFOgotCQkJCXJldHVybiBpbmhlcml0YW5jZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUU6Ci0JCQkJcmV0dXJuIERJU0NSSU1JTkFUT1JfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGRpc2NyaW1pbmF0b3JWYWx1ZSAhPSBudWxsIDogIURJU0NSSU1JTkFUT1JfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGRpc2NyaW1pbmF0b3JWYWx1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU46Ci0JCQkJcmV0dXJuIGRpc2NyaW1pbmF0b3JDb2x1bW4gIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SOgotCQkJCXJldHVybiB0YWJsZUdlbmVyYXRvciAhPSBudWxsOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1FVRVJJRVM6CiAJCQkJcmV0dXJuIG5hbWVkUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFF1ZXJpZXMuaXNFbXB0eSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTOgogCQkJCXJldHVybiBuYW1lZE5hdGl2ZVF1ZXJpZXMgIT0gbnVsbCAmJiAhbmFtZWROYXRpdmVRdWVyaWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gc3FsUmVzdWx0U2V0TWFwcGluZ3MgIT0gbnVsbCAmJiAhc3FsUmVzdWx0U2V0TWFwcGluZ3MuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzICE9IEVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlNfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgIT0gRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSU19FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTOgotCQkJCXJldHVybiBlbnRpdHlMaXN0ZW5lcnMgIT0gbnVsbDsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1I6CisJCQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGw7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SOgorCQkJCXJldHVybiB0YWJsZUdlbmVyYXRvciAhPSBudWxsOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUOgogCQkJCXJldHVybiBwcmVQZXJzaXN0ICE9IG51bGw7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9QRVJTSVNUOgpAQCAtMTg5NSw2ICsxOTMwLDMyIEBACiAJCQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlcyAhPSBudWxsICYmICFhdHRyaWJ1dGVPdmVycmlkZXMuaXNFbXB0eSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKIAkJCQlyZXR1cm4gYXNzb2NpYXRpb25PdmVycmlkZXMgIT0gbnVsbCAmJiAhYXNzb2NpYXRpb25PdmVycmlkZXMuaXNFbXB0eSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFQUJMRToKKwkJCQlyZXR1cm4gQ0FDSEVBQkxFX0VERUZBVUxUID09IG51bGwgPyBjYWNoZWFibGUgIT0gbnVsbCA6ICFDQUNIRUFCTEVfRURFRkFVTFQuZXF1YWxzKGNhY2hlYWJsZSk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRToKKwkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFOgorCQkJCXJldHVybiB0YWJsZSAhPSBudWxsOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFQ09OREFSWV9UQUJMRVM6CisJCQkJcmV0dXJuIHNlY29uZGFyeVRhYmxlcyAhPSBudWxsICYmICFzZWNvbmRhcnlUYWJsZXMuaXNFbXB0eSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKKwkJCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW5zICE9IG51bGwgJiYgIXByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSURfQ0xBU1M6CisJCQkJcmV0dXJuIGlkQ2xhc3MgIT0gbnVsbDsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkhFUklUQU5DRToKKwkJCQlyZXR1cm4gaW5oZXJpdGFuY2UgIT0gbnVsbDsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFOgorCQkJCXJldHVybiBESVNDUklNSU5BVE9SX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBkaXNjcmltaW5hdG9yVmFsdWUgIT0gbnVsbCA6ICFESVNDUklNSU5BVE9SX1ZBTFVFX0VERUZBVUxULmVxdWFscyhkaXNjcmltaW5hdG9yVmFsdWUpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OOgorCQkJCXJldHVybiBkaXNjcmltaW5hdG9yQ29sdW1uICE9IG51bGw7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6CisJCQkJcmV0dXJuIHNxbFJlc3VsdFNldE1hcHBpbmdzICE9IG51bGwgJiYgIXNxbFJlc3VsdFNldE1hcHBpbmdzLmlzRW1wdHkoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTOgorCQkJCXJldHVybiBleGNsdWRlRGVmYXVsdExpc3RlbmVycyAhPSBFWENMVURFX0RFRkFVTFRfTElTVEVORVJTX0VERUZBVUxUOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM6CisJCQkJcmV0dXJuIGV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzICE9IEVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlNfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRU5USVRZX0xJU1RFTkVSUzoKKwkJCQlyZXR1cm4gZW50aXR5TGlzdGVuZXJzICE9IG51bGw7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwogCX0KQEAgLTE5MDUsMTIgKzE5NjYsMTYyIEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1FVRVJJRVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX1FVRVJJRVM7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9OQVRJVkVfUVVFUklFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxHZW5lcmF0b3JDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VRVUVOQ0VfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fU0VRVUVOQ0VfR0VORVJBVE9SOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19UQUJMRV9HRU5FUkFUT1I7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sRXZlbnRNZXRob2RDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1BFUlNJU1Q6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QUkVfUEVSU0lTVDsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9QRVJTSVNUOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9QRVJTSVNUOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUkVNT1ZFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUFJFX1JFTU9WRTsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9SRU1PVkU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QT1NUX1JFTU9WRTsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BSRV9VUERBVEU7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfVVBEQVRFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9VUERBVEU7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfTE9BRDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfTE9BRDsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0NPTlRBSU5FUl9fQVRUUklCVVRFX09WRVJSSURFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FTU09DSUFUSU9OX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENhY2hlYWJsZTJfMC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRUFCTEU6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfQ0FDSEVBQkxFMl8wX19DQUNIRUFCTEU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5XzJfMC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfUVVFUklFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfUVVFUklFUzsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfTkFUSVZFX1FVRVJJRVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEdlbmVyYXRvckNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fU0VRVUVOQ0VfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1I7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19UQUJMRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFdmVudE1ldGhvZENvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUFJFX1BFUlNJU1Q6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9QRVJTSVNUOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1BFUlNJU1Q7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QUkVfUkVNT1ZFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUkVNT1ZFOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9SRU1PVkU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUFJFX1VQREFURTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURTsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfVVBEQVRFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1VQREFURTsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfTE9BRDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9MT0FEOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSX19BVFRSSUJVVEVfT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2FjaGVhYmxlMl8wLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfQ0FDSEVBQkxFMl8wX19DQUNIRUFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFQUJMRTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlfMl8wLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKIAl7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChjYWNoZWFibGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGNhY2hlYWJsZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7CiAJCXJlc3VsdC5hcHBlbmQobmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgZGlzY3JpbWluYXRvclZhbHVlOiAiKTsKIAkJcmVzdWx0LmFwcGVuZChkaXNjcmltaW5hdG9yVmFsdWUpOwpAQCAtMTkyMSw1ICsyMTMyLDE2NiBAQAogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXREaXNjcmltaW5hdG9yVmFsdWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEpQQS5ESVNDUklNSU5BVE9SX1ZBTFVFKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRJbmhlcml0YW5jZVN0cmF0ZWd5VGV4dFJhbmdlKCkgeworCQlyZXR1cm4gZ2V0SW5oZXJpdGFuY2UoKSAhPSBudWxsID8gZ2V0SW5oZXJpdGFuY2UoKS5nZXRTdHJhdGVneVRleHRSYW5nZSgpIDogZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENhY2hlYWJsZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEyXzAuQ0FDSEVBQkxFKTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCiAKLX0gLy8gRW50aXR5CisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ2FjaGVhYmxlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAorCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkVGFibGVUcmFuc2xhdG9yKCksCisJCQlidWlsZFNlY29uZGFyeVRhYmxlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSWRDbGFzc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSW5oZXJpdGFuY2VUcmFuc2xhdG9yKCksCisJCQlidWlsZERpc2NyaW1pbmF0b3JWYWx1ZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRGlzY3JpbWluYXRvckNvbHVtblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCksCisJCQlidWlsZFRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAorCQkJYnVpbGROYW1lZFF1ZXJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRTcWxSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpLAorCQkJYnVpbGRFeGNsdWRlRGVmYXVsdExpc3RlbmVyc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCisJCQlidWlsZEVudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IoKSwKKwkJCVByZVBlcnNpc3QuYnVpbGRUcmFuc2xhdG9yKCksCisJCQlQb3N0UGVyc2lzdC5idWlsZFRyYW5zbGF0b3IoKSwKKwkJCVByZVJlbW92ZS5idWlsZFRyYW5zbGF0b3IoKSwKKwkJCVBvc3RSZW1vdmUuYnVpbGRUcmFuc2xhdG9yKCksCisJCQlQcmVVcGRhdGUuYnVpbGRUcmFuc2xhdG9yKCksCisJCQlQb3N0VXBkYXRlLmJ1aWxkVHJhbnNsYXRvcigpLAorCQkJUG9zdExvYWQuYnVpbGRUcmFuc2xhdG9yKCksCisJCQlidWlsZEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpLAorCQkJQXR0cmlidXRlcy5idWlsZFRyYW5zbGF0b3IoKQorCQl9OworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQUNDRVNTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NIb2xkZXJfQWNjZXNzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhY2hlYWJsZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuQ0FDSEVBQkxFLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVhYmxlMl8wX0NhY2hlYWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUYWJsZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxUYWJsZS5idWlsZFRyYW5zbGF0b3IoSlBBLlRBQkxFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfVGFibGUoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNlY29uZGFyeVRhYmxlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFNlY29uZGFyeVRhYmxlLmJ1aWxkVHJhbnNsYXRvcihKUEEuU0VDT05EQVJZX1RBQkxFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfU2Vjb25kYXJ5VGFibGVzKCkpOworCX0JCisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X1ByaW1hcnlLZXlKb2luQ29sdW1ucygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSWRDbGFzc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxJZENsYXNzLmJ1aWxkVHJhbnNsYXRvcihKUEEuSURfQ0xBU1MsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9JZENsYXNzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJbmhlcml0YW5jZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBJbmhlcml0YW5jZS5idWlsZFRyYW5zbGF0b3IoSlBBLklOSEVSSVRBTkNFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfSW5oZXJpdGFuY2UoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERpc2NyaW1pbmF0b3JWYWx1ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0Rpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxEaXNjcmltaW5hdG9yQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9EaXNjcmltaW5hdG9yQ29sdW1uKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxTZXF1ZW5jZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoSlBBLlNFUVVFTkNFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1NlcXVlbmNlR2VuZXJhdG9yKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxUYWJsZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoSlBBLlRBQkxFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1RhYmxlR2VuZXJhdG9yKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lZFF1ZXJ5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbE5hbWVkUXVlcnkuYnVpbGRUcmFuc2xhdG9yKEpQQS5OQU1FRF9RVUVSWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRRdWVyaWVzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbE5hbWVkTmF0aXZlUXVlcnkuYnVpbGRUcmFuc2xhdG9yKEpQQS5OQU1FRF9OQVRJVkVfUVVFUlksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkTmF0aXZlUXVlcmllcygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU3FsUmVzdWx0U2V0TWFwcGluZ1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBTcWxSZXN1bHRTZXRNYXBwaW5nLmJ1aWxkVHJhbnNsYXRvcihKUEEuU1FMX1JFU1VMVF9TRVRfTUFQUElORywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X1NxbFJlc3VsdFNldE1hcHBpbmdzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeGNsdWRlRGVmYXVsdExpc3RlbmVyc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihKUEEuRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVyc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihKUEEuRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gRW50aXR5TGlzdGVuZXJzLmJ1aWxkVHJhbnNsYXRvcihKUEEuRU5USVRZX0xJU1RFTkVSUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0VudGl0eUxpc3RlbmVycygpKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcmVQZXJzaXN0VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFByZVBlcnNpc3QuYnVpbGRUcmFuc2xhdG9yKCk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUG9zdFBlcnNpc3RUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gUG9zdFBlcnNpc3QuYnVpbGRUcmFuc2xhdG9yKCk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJlUmVtb3ZlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFByZVJlbW92ZS5idWlsZFRyYW5zbGF0b3IoKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQb3N0UmVtb3ZlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFBvc3RSZW1vdmUuYnVpbGRUcmFuc2xhdG9yKCk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByZVVwZGF0ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBQcmVVcGRhdGUuYnVpbGRUcmFuc2xhdG9yKCk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFBvc3RVcGRhdGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gUG9zdFVwZGF0ZS5idWlsZFRyYW5zbGF0b3IoKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQb3N0TG9hZFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBQb3N0TG9hZC5idWlsZFRyYW5zbGF0b3IoKTsKKwl9CisJCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmJ1aWxkVHJhbnNsYXRvcihKUEEuQVRUUklCVVRFX09WRVJSSURFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl9BdHRyaWJ1dGVPdmVycmlkZXMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQXNzb2NpYXRpb25PdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyX0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5TWFwcGluZ3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5TWFwcGluZ3MuamF2YQppbmRleCBhNzIyYmY0Li43YWZmYWNlIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVudGl0eU1hcHBpbmdzLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHlNYXBwaW5ncy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksNyArOSwxMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CkBAIC0xOCw4ICsyMiwxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVJvb3RUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFSb290RU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMzUsMTcgKzQyLDEzIEBACiAgKiA8cD4KICAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKICAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0UGFja2FnZSA8ZW0+UGFja2FnZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldEFjY2VzcyA8ZW0+QWNjZXNzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0U2VxdWVuY2VHZW5lcmF0b3JzIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3JzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0VGFibGVHZW5lcmF0b3JzIDxlbT5UYWJsZSBHZW5lcmF0b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0TmFtZWRRdWVyaWVzIDxlbT5OYW1lZCBRdWVyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0TmFtZWROYXRpdmVRdWVyaWVzIDxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFNxbFJlc3VsdFNldE1hcHBpbmdzIDxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldE1hcHBlZFN1cGVyY2xhc3NlcyA8ZW0+TWFwcGVkIFN1cGVyY2xhc3NlczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldEVudGl0aWVzIDxlbT5FbnRpdGllczwvZW0+fTwvbGk+CkBAIC01NSwzOSArNTgsNDUgQEAKICAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKICAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIFhtbEVudGl0eU1hcHBpbmdzIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAorcHVibGljIGNsYXNzIFhtbEVudGl0eU1hcHBpbmdzIGV4dGVuZHMgQWJzdHJhY3RKcGFSb290RU9iamVjdCBpbXBsZW1lbnRzIFhtbFF1ZXJ5Q29udGFpbmVyLCBYbWxBY2Nlc3NIb2xkZXIKIHsKIAkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZWRRdWVyaWVzKCkgPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCisJICogQHNlZSAjZ2V0TmFtZWRRdWVyaWVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIjEuMCI7CisJcHJvdGVjdGVkIEVMaXN0PFhtbE5hbWVkUXVlcnk+IG5hbWVkUXVlcmllczsKIAogCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVkTmF0aXZlUXVlcmllcygpIDxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKKwkgKiBAc2VlICNnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7CisJcHJvdGVjdGVkIEVMaXN0PFhtbE5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllczsKIAogCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVmVyc2lvbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAorCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFjY2Vzc1R5cGUgQUNDRVNTX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2VzcygpIDxlbT5BY2Nlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjY2VzcygpCiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyc2lvbkVTZXQ7CisJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYWNjZXNzID0gQUNDRVNTX0VERUZBVUxUOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xODAsMjIgKzE4OSw2IEBACiAJcHJvdGVjdGVkIFN0cmluZyBjYXRhbG9nID0gQ0FUQUxPR19FREVGQVVMVDsKIAogCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFjY2Vzc1R5cGUgQUNDRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2VzcygpIDxlbT5BY2Nlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYWNjZXNzID0gQUNDRVNTX0VERUZBVUxUOwotCi0JLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkgPGVtPlNlcXVlbmNlIEdlbmVyYXRvcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0yMTYsMjYgKzIwOSw2IEBACiAJcHJvdGVjdGVkIEVMaXN0PFhtbFRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvcnM7CiAKIAkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZFF1ZXJpZXMoKSA8ZW0+TmFtZWQgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lZFF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSA8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzOwotCi0JLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKSA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0yOTcsNzkgKzI3MCw0OSBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMS4wIjwvY29kZT4uCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZWQgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5fS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCiAJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgogCSAqIDwvcD4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFZlcnNpb24oKQotCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc19WZXJzaW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iMS4wIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlZlcnNpb25UeXBlIiByZXF1aXJlZD0idHJ1ZSIKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRRdWVyaWVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpCisJcHVibGljIEVMaXN0PFhtbE5hbWVkUXVlcnk+IGdldE5hbWVkUXVlcmllcygpCiAJewotCQlyZXR1cm4gdmVyc2lvbjsKKwkJaWYgKG5hbWVkUXVlcmllcyA9PSBudWxsKQorCQl7CisJCQluYW1lZFF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sTmFtZWRRdWVyeT4oWG1sTmFtZWRRdWVyeS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTKTsKKwkJfQorCQlyZXR1cm4gbmFtZWRRdWVyaWVzOwogCX0KIAogCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeX0uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VmVyc2lvbigpCi0JICogQHNlZSAjdW5zZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkTmF0aXZlUXVlcmllcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKQorCXB1YmxpYyBFTGlzdDxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PiBnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKQogCXsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJYm9vbGVhbiBvbGRWZXJzaW9uRVNldCA9IHZlcnNpb25FU2V0OwotCQl2ZXJzaW9uRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbiwgIW9sZFZlcnNpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRWZXJzaW9uKCkKLQl7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJYm9vbGVhbiBvbGRWZXJzaW9uRVNldCA9IHZlcnNpb25FU2V0OwotCQl2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQkJdmVyc2lvbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1ZFUlNJT04sIG9sZFZlcnNpb24sIFZFUlNJT05fRURFRkFVTFQsIG9sZFZlcnNpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VmVyc2lvbigpCi0JewotCQlyZXR1cm4gdmVyc2lvbkVTZXQ7CisJCWlmIChuYW1lZE5hdGl2ZVF1ZXJpZXMgPT0gbnVsbCkKKwkJeworCQkJbmFtZWROYXRpdmVRdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE5hbWVkTmF0aXZlUXVlcnk+KFhtbE5hbWVkTmF0aXZlUXVlcnkuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfTkFUSVZFX1FVRVJJRVMpOworCQl9CisJCXJldHVybiBuYW1lZE5hdGl2ZVF1ZXJpZXM7CiAJfQogCiAJLyoqCkBAIC01NzQsNyArNTE3LDYgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJQUk9QRVJUWSI8L2NvZGU+LgogCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlfS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtNTg1LDggKzUyNyw4IEBACiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlCiAJICogQHNlZSAjc2V0QWNjZXNzKEFjY2Vzc1R5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc19BY2Nlc3MoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJQUk9QRVJUWSIKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFjY2Vzc0hvbGRlcl9BY2Nlc3MoKQorCSAqIEBtb2RlbAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKQpAQCAtNjU4LDUyICs2MDAsNiBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX05hbWVkUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sTmFtZWRRdWVyeT4gZ2V0TmFtZWRRdWVyaWVzKCkKLQl7Ci0JCWlmIChuYW1lZFF1ZXJpZXMgPT0gbnVsbCkKLQkJewotCQkJbmFtZWRRdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE5hbWVkUXVlcnk+KFhtbE5hbWVkUXVlcnkuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUVVFUklFUyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVkUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc19OYW1lZE5hdGl2ZVF1ZXJpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE5hbWVkTmF0aXZlUXVlcnk+IGdldE5hbWVkTmF0aXZlUXVlcmllcygpCi0JewotCQlpZiAobmFtZWROYXRpdmVRdWVyaWVzID09IG51bGwpCi0JCXsKLQkJCW5hbWVkTmF0aXZlUXVlcmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PihYbWxOYW1lZE5hdGl2ZVF1ZXJ5LmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTKTsKLQkJfQotCQlyZXR1cm4gbmFtZWROYXRpdmVRdWVyaWVzOwotCX0KLQotCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KIAkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmd9LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC04MDUsMTYgKzcwMSwxNiBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWRRdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5hbWVkTmF0aXZlUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQToKIAkJCQlyZXR1cm4gYmFzaWNTZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShudWxsLCBtc2dzKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTOgogCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTOgogCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VGFibGVHZW5lcmF0b3JzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWRRdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5hbWVkTmF0aXZlUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6CiAJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTUFQUEVEX1NVUEVSQ0xBU1NFUzoKQEAgLTgzNyw4ICs3MzMsMTIgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVkVSU0lPTjoKLQkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1FVRVJJRVM6CisJCQkJcmV0dXJuIGdldE5hbWVkUXVlcmllcygpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTOgorCQkJCXJldHVybiBnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1M6CisJCQkJcmV0dXJuIGdldEFjY2VzcygpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0RFU0NSSVBUSU9OOgogCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE6CkBAIC04NDksMTYgKzc0OSwxMCBAQAogCQkJCXJldHVybiBnZXRTY2hlbWEoKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HOgogCQkJCXJldHVybiBnZXRDYXRhbG9nKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTOgotCQkJCXJldHVybiBnZXRBY2Nlc3MoKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTOgogCQkJCXJldHVybiBnZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTOgogCQkJCXJldHVybiBnZXRUYWJsZUdlbmVyYXRvcnMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTOgotCQkJCXJldHVybiBnZXROYW1lZFF1ZXJpZXMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6CiAJCQkJcmV0dXJuIGdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTUFQUEVEX1NVUEVSQ0xBU1NFUzoKQEAgLTg4Miw4ICs3NzYsMTYgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1FVRVJJRVM6CisJCQkJZ2V0TmFtZWRRdWVyaWVzKCkuY2xlYXIoKTsKKwkJCQlnZXROYW1lZFF1ZXJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE5hbWVkUXVlcnk+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfTkFUSVZFX1FVRVJJRVM6CisJCQkJZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuY2xlYXIoKTsKKwkJCQlnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE5hbWVkTmF0aXZlUXVlcnk+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTOgorCQkJCXNldEFjY2VzcygoQWNjZXNzVHlwZSluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0RFU0NSSVBUSU9OOgogCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtOTAwLDkgKzgwMiw2IEBACiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ0FUQUxPRzoKIAkJCQlzZXRDYXRhbG9nKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1M6Ci0JCQkJc2V0QWNjZXNzKChBY2Nlc3NUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU0VRVUVOQ0VfR0VORVJBVE9SUzoKIAkJCQlnZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5jbGVhcigpOwogCQkJCWdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU2VxdWVuY2VHZW5lcmF0b3I+KW5ld1ZhbHVlKTsKQEAgLTkxMSwxNCArODEwLDYgQEAKIAkJCQlnZXRUYWJsZUdlbmVyYXRvcnMoKS5jbGVhcigpOwogCQkJCWdldFRhYmxlR2VuZXJhdG9ycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVGFibGVHZW5lcmF0b3I+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUVVFUklFUzoKLQkJCQlnZXROYW1lZFF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkUXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTmFtZWRRdWVyeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTmFtZWROYXRpdmVRdWVyeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKIAkJCQlnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpLmNsZWFyKCk7CiAJCQkJZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNxbFJlc3VsdFNldE1hcHBpbmc+KW5ld1ZhbHVlKTsKQEAgLTk0OSw4ICs4NDAsMTQgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVkVSU0lPTjoKLQkJCQl1bnNldFZlcnNpb24oKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTOgorCQkJCWdldE5hbWVkUXVlcmllcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTOgorCQkJCWdldE5hbWVkTmF0aXZlUXVlcmllcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTUzoKKwkJCQlzZXRBY2Nlc3MoQUNDRVNTX0VERUZBVUxUKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT046CiAJCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwpAQCAtOTY3LDIxICs4NjQsMTIgQEAKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HOgogCQkJCXNldENhdGFsb2coQ0FUQUxPR19FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTUzoKLQkJCQlzZXRBY2Nlc3MoQUNDRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU0VRVUVOQ0VfR0VORVJBVE9SUzoKIAkJCQlnZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5jbGVhcigpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTOgogCQkJCWdldFRhYmxlR2VuZXJhdG9ycygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRRdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfTkFUSVZFX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6CiAJCQkJZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKS5jbGVhcigpOwogCQkJCXJldHVybjsKQEAgLTEwMDgsOCArODk2LDEyIEBACiAJewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkKIAkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGlzU2V0VmVyc2lvbigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1FVRVJJRVM6CisJCQkJcmV0dXJuIG5hbWVkUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFF1ZXJpZXMuaXNFbXB0eSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTOgorCQkJCXJldHVybiBuYW1lZE5hdGl2ZVF1ZXJpZXMgIT0gbnVsbCAmJiAhbmFtZWROYXRpdmVRdWVyaWVzLmlzRW1wdHkoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1M6CisJCQkJcmV0dXJuIGFjY2VzcyAhPSBBQ0NFU1NfRURFRkFVTFQ7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT046CiAJCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQToKQEAgLTEwMjAsMTYgKzkxMiwxMCBAQAogCQkJCXJldHVybiBTQ0hFTUFfRURFRkFVTFQgPT0gbnVsbCA/IHNjaGVtYSAhPSBudWxsIDogIVNDSEVNQV9FREVGQVVMVC5lcXVhbHMoc2NoZW1hKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DQVRBTE9HOgogCQkJCXJldHVybiBDQVRBTE9HX0VERUZBVUxUID09IG51bGwgPyBjYXRhbG9nICE9IG51bGwgOiAhQ0FUQUxPR19FREVGQVVMVC5lcXVhbHMoY2F0YWxvZyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTOgotCQkJCXJldHVybiBhY2Nlc3MgIT0gQUNDRVNTX0VERUZBVUxUOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NFUVVFTkNFX0dFTkVSQVRPUlM6CiAJCQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9ycyAhPSBudWxsICYmICFzZXF1ZW5jZUdlbmVyYXRvcnMuaXNFbXB0eSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RBQkxFX0dFTkVSQVRPUlM6CiAJCQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9ycyAhPSBudWxsICYmICF0YWJsZUdlbmVyYXRvcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIG5hbWVkUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFF1ZXJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTOgotCQkJCXJldHVybiBuYW1lZE5hdGl2ZVF1ZXJpZXMgIT0gbnVsbCAmJiAhbmFtZWROYXRpdmVRdWVyaWVzLmlzRW1wdHkoKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKIAkJCQlyZXR1cm4gc3FsUmVzdWx0U2V0TWFwcGluZ3MgIT0gbnVsbCAmJiAhc3FsUmVzdWx0U2V0TWFwcGluZ3MuaXNFbXB0eSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX01BUFBFRF9TVVBFUkNMQVNTRVM6CkBAIC0xMDQzLDYgKzkyOSw2MiBAQAogCX0KIAkKIAkKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxRdWVyeUNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9RVUVSSUVTOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfTkFUSVZFX1FVRVJJRVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FDQ0VTU19IT0xERVJfX0FDQ0VTUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX1FVRVJJRVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1FVRVJJRVM7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX05BVElWRV9RVUVSSUVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FDQ0VTU19IT0xERVJfX0FDQ0VTUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCiAJLy8gKioqKioqKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQogCS8qKgpAQCAtMTA1Niw4ICs5OTgsOCBAQAogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmVyc2lvbjogIik7Ci0JCWlmICh2ZXJzaW9uRVNldCkgcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7CisJCXJlc3VsdC5hcHBlbmQoIiAoYWNjZXNzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChhY2Nlc3MpOwogCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKIAkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7CiAJCXJlc3VsdC5hcHBlbmQoIiwgcGFja2FnZTogIik7CkBAIC0xMDY2LDE0ICsxMDA4LDEwMSBAQAogCQlyZXN1bHQuYXBwZW5kKHNjaGVtYSk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgY2F0YWxvZzogIik7CiAJCXJlc3VsdC5hcHBlbmQoY2F0YWxvZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWNjZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY2Nlc3MpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CiAJCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUVPYmplY3QgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIHRoaXM7CisJcHVibGljIExpc3Q8WG1sVHlwZU1hcHBpbmc+IGdldFR5cGVNYXBwaW5ncygpIHsKKwkJLy8gY29udmVydCBsaXN0cyB0byBhcnJheXMgdG8gYXZvaWQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgdG8gcmVzdWx0IGxpc3QKKwkJQXJyYXlMaXN0PFhtbFR5cGVNYXBwaW5nPiB0eXBlTWFwcGluZ3MgPSBuZXcgQXJyYXlMaXN0PFhtbFR5cGVNYXBwaW5nPigpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHR5cGVNYXBwaW5ncywgdGhpcy5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS50b0FycmF5KEVNUFRZX1hNTF9UWVBFX01BUFBJTkdfQVJSQVkpKTsKKwkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0eXBlTWFwcGluZ3MsIHRoaXMuZ2V0RW50aXRpZXMoKS50b0FycmF5KEVNUFRZX1hNTF9UWVBFX01BUFBJTkdfQVJSQVkpKTsKKwkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0eXBlTWFwcGluZ3MsIHRoaXMuZ2V0RW1iZWRkYWJsZXMoKS50b0FycmF5KEVNUFRZX1hNTF9UWVBFX01BUFBJTkdfQVJSQVkpKTsKKwkJcmV0dXJuIHR5cGVNYXBwaW5nczsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbFR5cGVNYXBwaW5nW10gRU1QVFlfWE1MX1RZUEVfTUFQUElOR19BUlJBWSA9IG5ldyBYbWxUeXBlTWFwcGluZ1swXTsKKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZlcnNpb24gLT4gc2NoZW1hIGxvY2F0aW9uIG1hcHBpbmcgKioqKioqKioqKioqKioqKioqKioKKwkKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZXNwYWNlID0gSlBBLlNDSEVNQV9OQU1FU1BBQ0U7CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7CisJCXJldHVybiBuYW1lc3BhY2U7CisJfQorCQorCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gdmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucyA9IGJ1aWxkVmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucygpOworCQorCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gYnVpbGRWZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zKCkgeworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCQltYXAucHV0KEpQQS5TQ0hFTUFfVkVSU0lPTiwgSlBBLlNDSEVNQV9MT0NBVElPTik7CisJCW1hcC5wdXQoSlBBMl8wLlNDSEVNQV9WRVJTSU9OLCBKUEEyXzAuU0NIRU1BX0xPQ0FUSU9OKTsKKwkJcmV0dXJuIG1hcDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbkZvclZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKwkJcmV0dXJuIHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMuZ2V0KHZlcnNpb24pOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBST09UX1RSQU5TTEFUT1I7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUk9PVF9UUkFOU0xBVE9SID0gYnVpbGRSb290VHJhbnNsYXRvcigpOworCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSb290VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVSb290VHJhbnNsYXRvcigKKwkJCQlKUEEuRU5USVRZX01BUFBJTkdTLAorCQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzKCksCisJCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQorCQkJKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZFZlcnNpb25UcmFuc2xhdG9yKHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMpLAorCQkJYnVpbGROYW1lc3BhY2VUcmFuc2xhdG9yKG5hbWVzcGFjZSksCisJCQlidWlsZFNjaGVtYU5hbWVzcGFjZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkU2NoZW1hTG9jYXRpb25UcmFuc2xhdG9yKG5hbWVzcGFjZSwgdmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucyksCisJCQlidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAorCQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKSwKKwkJCWJ1aWxkUGFja2FnZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCisJCQlYbWxTZXF1ZW5jZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLlNFUVVFTkNFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfU2VxdWVuY2VHZW5lcmF0b3JzKCkpLAorCQkJWG1sVGFibGVHZW5lcmF0b3IuYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5UQUJMRV9HRU5FUkFUT1IsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1RhYmxlR2VuZXJhdG9ycygpKSwKKwkJCVhtbE5hbWVkUXVlcnkuYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5OQU1FRF9RVUVSWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRRdWVyaWVzKCkpLAorCQkJWG1sTmFtZWROYXRpdmVRdWVyeS5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk5BTUVEX05BVElWRV9RVUVSWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWROYXRpdmVRdWVyaWVzKCkpLAorCQkJU3FsUmVzdWx0U2V0TWFwcGluZy5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLlNRTF9SRVNVTFRfU0VUX01BUFBJTkcsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1NxbFJlc3VsdFNldE1hcHBpbmdzKCkpLAorCQkJWG1sTWFwcGVkU3VwZXJjbGFzcy5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk1BUFBFRF9TVVBFUkNMQVNTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19NYXBwZWRTdXBlcmNsYXNzZXMoKSksCisJCQlYbWxFbnRpdHkuYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5FTlRJVFksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0VudGl0aWVzKCkpLAorCQkJWG1sRW1iZWRkYWJsZS5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLkVNQkVEREFCTEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0VtYmVkZGFibGVzKCkpLAorCQl9OworCX0KKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuREVTQ1JJUFRJT04sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0Rlc2NyaXB0aW9uKCkpOworCX0KKwkJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUGFja2FnZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuUEFDS0FHRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGFja2FnZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5TQ0hFTUEsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1NjaGVtYSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQ0FUQUxPRywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfQ2F0YWxvZygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5BQ0NFU1MsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc0hvbGRlcl9BY2Nlc3MoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFdmVudE1ldGhvZENvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxFdmVudE1ldGhvZENvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzZmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEV2ZW50TWV0aG9kQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSwyMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEV2ZW50IE1ldGhvZCBDb250YWluZXI8L2I+PC9lbT4nLgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQcmVQZXJzaXN0IDxlbT5QcmUgUGVyc2lzdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFBvc3RQZXJzaXN0IDxlbT5Qb3N0IFBlcnNpc3Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQcmVSZW1vdmUgPGVtPlByZSBSZW1vdmU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQb3N0UmVtb3ZlIDxlbT5Qb3N0IFJlbW92ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFBvc3RVcGRhdGUgPGVtPlBvc3QgVXBkYXRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIjZ2V0UG9zdExvYWQgPGVtPlBvc3QgTG9hZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXIoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmUgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UHJlUGVyc2lzdChQcmVQZXJzaXN0KQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUHJlUGVyc2lzdCgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQcmVQZXJzaXN0IGdldFByZVBlcnNpc3QoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQcmVQZXJzaXN0IDxlbT5QcmUgUGVyc2lzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFByZVBlcnNpc3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFByZVBlcnNpc3QoUHJlUGVyc2lzdCB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFBvc3RQZXJzaXN0KFBvc3RQZXJzaXN0KQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFBlcnNpc3QoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUG9zdFBlcnNpc3QgZ2V0UG9zdFBlcnNpc3QoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQb3N0UGVyc2lzdCA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFBvc3RQZXJzaXN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQb3N0UGVyc2lzdChQb3N0UGVyc2lzdCB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmUgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFByZVJlbW92ZShQcmVSZW1vdmUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVSZW1vdmUoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUHJlUmVtb3ZlIGdldFByZVJlbW92ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFByZVJlbW92ZSA8ZW0+UHJlIFJlbW92ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UHJlUmVtb3ZlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQcmVSZW1vdmUoUHJlUmVtb3ZlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3QgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UG9zdFJlbW92ZShQb3N0UmVtb3ZlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFJlbW92ZSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQb3N0UmVtb3ZlIGdldFBvc3RSZW1vdmUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQb3N0UmVtb3ZlIDxlbT5Qb3N0IFJlbW92ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFBvc3RSZW1vdmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBvc3RSZW1vdmUoUG9zdFJlbW92ZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmUgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFByZVVwZGF0ZShQcmVVcGRhdGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVVcGRhdGUoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUHJlVXBkYXRlIGdldFByZVVwZGF0ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UHJlVXBkYXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQcmVVcGRhdGUoUHJlVXBkYXRlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3QgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UG9zdFVwZGF0ZShQb3N0VXBkYXRlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFVwZGF0ZSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlQb3N0VXBkYXRlIGdldFBvc3RVcGRhdGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQb3N0VXBkYXRlIDxlbT5Qb3N0IFVwZGF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFBvc3RVcGRhdGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBvc3RVcGRhdGUoUG9zdFVwZGF0ZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IExvYWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgTG9hZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IExvYWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFBvc3RMb2FkKFBvc3RMb2FkKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdExvYWQoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUG9zdExvYWQgZ2V0UG9zdExvYWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IExvYWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFBvc3RMb2FkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQb3N0TG9hZChQb3N0TG9hZCB2YWx1ZSk7CisKK30gLy8gWG1sRXZlbnRNZXRob2RDb250YWluZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdGVkVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdGVkVmFsdWUuamF2YQppbmRleCAyNmVlZjhhLi42YjFkNmRiIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEdlbmVyYXRlZFZhbHVlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxHZW5lcmF0ZWRWYWx1ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksOCArOSwxNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0zMiwxMyArMzksNzAgQEAKICAqIDwvcD4KICAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRlZFZhbHVlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKICAqIEBleHRlbmRzIEpwYUVPYmplY3QKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGludGVyZmFjZSBYbWxHZW5lcmF0ZWRWYWx1ZSBleHRlbmRzIEpwYUVPYmplY3QKK3B1YmxpYyBjbGFzcyBYbWxHZW5lcmF0ZWRWYWx1ZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKIHsKIAkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2VuZXJhdG9yKCkgPGVtPkdlbmVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0R2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2VuZXJhdG9yKCkgPGVtPkdlbmVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0R2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRvciA9IEdFTkVSQVRPUl9FREVGQVVMVDsKKworCS8qKgorCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAorCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEdlbmVyYXRpb25UeXBlIFNUUkFURUdZX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cmF0ZWd5KCkgPGVtPlN0cmF0ZWd5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTdHJhdGVneSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5ID0gU1RSQVRFR1lfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sR2VuZXJhdGVkVmFsdWUoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfR0VORVJBVEVEX1ZBTFVFOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdlbmVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CkBAIC01Miw3ICsxMTYsMTAgQEAKIAkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCiAJICogQGdlbmVyYXRlZAogCSAqLwotCVN0cmluZyBnZXRHZW5lcmF0b3IoKTsKKwlwdWJsaWMgU3RyaW5nIGdldEdlbmVyYXRvcigpCisJeworCQlyZXR1cm4gZ2VuZXJhdG9yOworCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZSNnZXRHZW5lcmF0b3IgPGVtPkdlbmVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgpAQCAtNjIsNyArMTI5LDEzIEBACiAJICogQHNlZSAjZ2V0R2VuZXJhdG9yKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0Jdm9pZCBzZXRHZW5lcmF0b3IoU3RyaW5nIHZhbHVlKTsKKwlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0b3IoU3RyaW5nIG5ld0dlbmVyYXRvcikKKwl7CisJCVN0cmluZyBvbGRHZW5lcmF0b3IgPSBnZW5lcmF0b3I7CisJCWdlbmVyYXRvciA9IG5ld0dlbmVyYXRvcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfR0VORVJBVEVEX1ZBTFVFX19HRU5FUkFUT1IsIG9sZEdlbmVyYXRvciwgZ2VuZXJhdG9yKSk7CisJfQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RyYXRlZ3k8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTgxLDcgKzE1NCwxMCBAQAogCSAqIEBtb2RlbCBkZWZhdWx0PSJUQUJMRSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JR2VuZXJhdGlvblR5cGUgZ2V0U3RyYXRlZ3koKTsKKwlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0U3RyYXRlZ3koKQorCXsKKwkJcmV0dXJuIHN0cmF0ZWd5OworCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZSNnZXRTdHJhdGVneSA8ZW0+U3RyYXRlZ3k8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTkyLDExICsxNjgsMTM2IEBACiAJICogQHNlZSAjZ2V0U3RyYXRlZ3koKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQl2b2lkIHNldFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlIHZhbHVlKTsKKwlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSBuZXdTdHJhdGVneSkKKwl7CisJCUdlbmVyYXRpb25UeXBlIG9sZFN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisJCXN0cmF0ZWd5ID0gbmV3U3RyYXRlZ3kgPT0gbnVsbCA/IFNUUkFURUdZX0VERUZBVUxUIDogbmV3U3RyYXRlZ3k7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1ksIG9sZFN0cmF0ZWd5LCBzdHJhdGVneSkpOworCX0KIAogCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBnZW5lcmF0b3IgYXR0aWJ1dGUuICBJZiB0aGUgZ2VuZXJhdG9yIGF0dGlidXRlIAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBnZW5lcmF0ZWQtdmFsdWUgZWxlbWVudC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlUZXh0UmFuZ2UgZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKCk7CisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SOgorCQkJCXJldHVybiBnZXRHZW5lcmF0b3IoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVEVEX1ZBTFVFX19TVFJBVEVHWToKKwkJCQlyZXR1cm4gZ2V0U3RyYXRlZ3koKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SOgorCQkJCXNldEdlbmVyYXRvcigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1k6CisJCQkJc2V0U3RyYXRlZ3koKEdlbmVyYXRpb25UeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SOgorCQkJCXNldEdlbmVyYXRvcihHRU5FUkFUT1JfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVEVEX1ZBTFVFX19TVFJBVEVHWToKKwkJCQlzZXRTdHJhdGVneShTVFJBVEVHWV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVEVEX1ZBTFVFX19HRU5FUkFUT1I6CisJCQkJcmV0dXJuIEdFTkVSQVRPUl9FREVGQVVMVCA9PSBudWxsID8gZ2VuZXJhdG9yICE9IG51bGwgOiAhR0VORVJBVE9SX0VERUZBVUxULmVxdWFscyhnZW5lcmF0b3IpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFURURfVkFMVUVfX1NUUkFURUdZOgorCQkJCXJldHVybiBzdHJhdGVneSAhPSBTVFJBVEVHWV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoZ2VuZXJhdG9yOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChnZW5lcmF0b3IpOworCQlyZXN1bHQuYXBwZW5kKCIsIHN0cmF0ZWd5OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChzdHJhdGVneSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5HRU5FUkFUT1IpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJZWxlbWVudE5hbWUsCisJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKKwkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCisJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZFN0cmF0ZWd5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRHZW5lcmF0b3JUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTdHJhdGVneVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuU1RSQVRFR1ksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRlZFZhbHVlX1N0cmF0ZWd5KCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEdlbmVyYXRvclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuR0VORVJBVE9SLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0ZWRWYWx1ZV9HZW5lcmF0b3IoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CiB9IC8vIEdlbmVyYXRlZFZhbHVlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEdlbmVyYXRlZFZhbHVlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxHZW5lcmF0ZWRWYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3MjI3Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEdlbmVyYXRlZFZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzLk9ybVhtbE1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmVtZi5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdGVkVmFsdWVJbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEdlbmVyYXRlZFZhbHVlSW1wbCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEdlbmVyYXRlZFZhbHVlCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdlbmVyYXRvcigpIDxlbT5HZW5lcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdlbmVyYXRvcigpIDxlbT5HZW5lcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0b3IgPSBHRU5FUkFUT1JfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBHZW5lcmF0aW9uVHlwZSBTVFJBVEVHWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJhdGVneSgpIDxlbT5TdHJhdGVneTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RyYXRlZ3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSA9IFNUUkFURUdZX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEdlbmVyYXRlZFZhbHVlSW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9HRU5FUkFURURfVkFMVUVfSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HZW5lcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdlbmVyYXRvcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEdlbmVyYXRvcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0ZWRWYWx1ZV9HZW5lcmF0b3IoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIGdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWVJbXBsI2dldEdlbmVyYXRvciA8ZW0+R2VuZXJhdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRvcihTdHJpbmcgbmV3R2VuZXJhdG9yKQotCXsKLQkJU3RyaW5nIG9sZEdlbmVyYXRvciA9IGdlbmVyYXRvcjsKLQkJZ2VuZXJhdG9yID0gbmV3R2VuZXJhdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9HRU5FUkFURURfVkFMVUVfSU1QTF9fR0VORVJBVE9SLCBvbGRHZW5lcmF0b3IsIGdlbmVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cmF0ZWd5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IlRBQkxFIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cmF0ZWd5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cmF0ZWd5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZQotCSAqIEBzZWUgI3NldFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdGVkVmFsdWVfU3RyYXRlZ3koKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJUQUJMRSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdlbmVyYXRpb25UeXBlIGdldFN0cmF0ZWd5KCkKLQl7Ci0JCXJldHVybiBzdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWVJbXBsI2dldFN0cmF0ZWd5IDxlbT5TdHJhdGVneTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RyYXRlZ3k8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlCi0JICogQHNlZSAjZ2V0U3RyYXRlZ3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSBuZXdTdHJhdGVneSkKLQl7Ci0JCUdlbmVyYXRpb25UeXBlIG9sZFN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXN0cmF0ZWd5ID0gbmV3U3RyYXRlZ3kgPT0gbnVsbCA/IFNUUkFURUdZX0VERUZBVUxUIDogbmV3U3RyYXRlZ3k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9JTVBMX19TVFJBVEVHWSwgb2xkU3RyYXRlZ3ksIHN0cmF0ZWd5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9JTVBMX19HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGdldEdlbmVyYXRvcigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFURURfVkFMVUVfSU1QTF9fU1RSQVRFR1k6Ci0JCQkJcmV0dXJuIGdldFN0cmF0ZWd5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFURURfVkFMVUVfSU1QTF9fR0VORVJBVE9SOgotCQkJCXNldEdlbmVyYXRvcigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9JTVBMX19TVFJBVEVHWToKLQkJCQlzZXRTdHJhdGVneSgoR2VuZXJhdGlvblR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVEVEX1ZBTFVFX0lNUExfX0dFTkVSQVRPUjoKLQkJCQlzZXRHZW5lcmF0b3IoR0VORVJBVE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9JTVBMX19TVFJBVEVHWToKLQkJCQlzZXRTdHJhdGVneShTVFJBVEVHWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVEVEX1ZBTFVFX0lNUExfX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gR0VORVJBVE9SX0VERUZBVUxUID09IG51bGwgPyBnZW5lcmF0b3IgIT0gbnVsbCA6ICFHRU5FUkFUT1JfRURFRkFVTFQuZXF1YWxzKGdlbmVyYXRvcik7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9JTVBMX19TVFJBVEVHWToKLQkJCQlyZXR1cm4gc3RyYXRlZ3kgIT0gU1RSQVRFR1lfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdlbmVyYXRvcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ2VuZXJhdG9yKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdHJhdGVneTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RyYXRlZ3kpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEdlbmVyYXRvclRleHRSYW5nZSgpIHsKLQkJSURPTU5vZGUgZ2VuZXJhdG9yTm9kZSA9IChJRE9NTm9kZSkgRE9NVXRpbGl0aWVzLmNoaWxkQXR0cmlidXRlTm9kZSh0aGlzLm5vZGUsIE9ybVhtbE1hcHBlci5HRU5FUkFUT1IpOwotCQlyZXR1cm4gKGdlbmVyYXRvck5vZGUgPT0gbnVsbCkgPyBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgOiBidWlsZFRleHRSYW5nZShnZW5lcmF0b3JOb2RlKTsKLQl9Ci19IC8vIEdlbmVyYXRlZFZhbHVlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxHZW5lcmF0b3IuamF2YQppbmRleCA1MWI0MTc0Li4xZjUzNDI0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEdlbmVyYXRvci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw3ICs5LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEdlbmVyYXRvcl8yXzA7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgpAQCAtMzQsMTAgKzM0LDkgQEAKICAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcigpCiAgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sR2VuZXJhdG9yIGV4dGVuZHMgSnBhRU9iamVjdAorcHVibGljIGludGVyZmFjZSBYbWxHZW5lcmF0b3IgZXh0ZW5kcyBYbWxHZW5lcmF0b3JfMl8wCiB7CiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxHZW5lcmF0b3JDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdG9yQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3MmZiYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdG9yQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEdlbmVyYXRvciBDb250YWluZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lciNnZXRTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyI2dldFRhYmxlR2VuZXJhdG9yIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvckNvbnRhaW5lcigpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sR2VuZXJhdG9yQ29udGFpbmVyIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JDb250YWluZXJfU2VxdWVuY2VHZW5lcmF0b3IoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJWG1sU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3JDb250YWluZXIjZ2V0U2VxdWVuY2VHZW5lcmF0b3IgPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9UYWJsZUdlbmVyYXRvcigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxUYWJsZUdlbmVyYXRvciBnZXRUYWJsZUdlbmVyYXRvcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lciNnZXRUYWJsZUdlbmVyYXRvciA8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFRhYmxlR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciB2YWx1ZSk7CisKK30gLy8gWG1sR2VuZXJhdG9yQ29udGFpbmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbElkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbElkLmphdmEKaW5kZXggYzU2ZDM4Yy4uZWJiMzRmMyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxJZC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sSWQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDYgKzksMTYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjUsMTkgKzM1LDI5NiBAQAogICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgogICogPHVsPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRHZW5lcmF0ZWRWYWx1ZSA8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0VGVtcG9yYWwgPGVtPlRlbXBvcmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0VGFibGVHZW5lcmF0b3IgPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldFNlcXVlbmNlR2VuZXJhdG9yIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn08L2xpPgogICogPC91bD4KICAqIDwvcD4KICAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGludGVyZmFjZSBYbWxJZCBleHRlbmRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIENvbHVtbk1hcHBpbmcKK3B1YmxpYyBjbGFzcyBYbWxJZCBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIENvbHVtbk1hcHBpbmcsIFhtbENvbnZlcnRpYmxlTWFwcGluZywgWG1sR2VuZXJhdG9yQ29udGFpbmVyCiB7CiAJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uKCkgPGVtPkNvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29sdW1uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ29sdW1uIGNvbHVtbjsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMb2IoKSA8ZW0+TG9iPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0xvYigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQl9FREVGQVVMVCA9IGZhbHNlOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9iKCkgPGVtPkxvYjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNMb2IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGxvYiA9IExPQl9FREVGQVVMVDsKKwkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUZW1wb3JhbFR5cGUgVEVNUE9SQUxfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGVtcG9yYWwoKSA8ZW0+VGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRlbXBvcmFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHRlbXBvcmFsID0gVEVNUE9SQUxfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudW1lcmF0ZWQoKSA8ZW0+RW51bWVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RW51bWVyYXRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbnVtVHlwZSBFTlVNRVJBVEVEX0VERUZBVUxUID0gRW51bVR5cGUuT1JESU5BTDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnVtZXJhdGVkKCkgPGVtPkVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVudW1lcmF0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFbnVtVHlwZSBlbnVtZXJhdGVkID0gRU5VTUVSQVRFRF9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3I7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFibGVHZW5lcmF0b3IoKSA8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdlbmVyYXRlZFZhbHVlKCkgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0R2VuZXJhdGVkVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxJZCgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9JRDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldENvbHVtbihYbWxDb2x1bW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpCisJeworCQlyZXR1cm4gY29sdW1uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sQ29sdW1uIG9sZENvbHVtbiA9IGNvbHVtbjsKKwkJY29sdW1uID0gbmV3Q29sdW1uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9fQ09MVU1OLCBvbGRDb2x1bW4sIG5ld0NvbHVtbik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uKQorCXsKKwkJaWYgKG5ld0NvbHVtbiAhPSBjb2x1bW4pCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGNvbHVtbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb2x1bW4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9JRF9fQ09MVU1OLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdDb2x1bW4gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29sdW1uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfSURfX0NPTFVNTiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRDb2x1bW4obmV3Q29sdW1uLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0lEX19DT0xVTU4sIG5ld0NvbHVtbiwgbmV3Q29sdW1uKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9iPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRMb2IoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Mb2IoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTG9iKCkKKwl7CisJCXJldHVybiBsb2I7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2lzTG9iIDxlbT5Mb2I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNMb2IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiBuZXdMb2IpCisJeworCQlib29sZWFuIG9sZExvYiA9IGxvYjsKKwkJbG9iID0gbmV3TG9iOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9fTE9CLCBvbGRMb2IsIGxvYikpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCisJICogQHNlZSAjc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX1RlbXBvcmFsKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpCisJeworCQlyZXR1cm4gdGVtcG9yYWw7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldFRlbXBvcmFsIDxlbT5UZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQorCSAqIEBzZWUgI2dldFRlbXBvcmFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKQorCXsKKwkJVGVtcG9yYWxUeXBlIG9sZFRlbXBvcmFsID0gdGVtcG9yYWw7CisJCXRlbXBvcmFsID0gbmV3VGVtcG9yYWwgPT0gbnVsbCA/IFRFTVBPUkFMX0VERUZBVUxUIDogbmV3VGVtcG9yYWw7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0lEX19URU1QT1JBTCwgb2xkVGVtcG9yYWwsIHRlbXBvcmFsKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCisJICogQHNlZSAjc2V0RW51bWVyYXRlZChFbnVtVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19FbnVtZXJhdGVkKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVudW1UeXBlIGdldEVudW1lcmF0ZWQoKQorCXsKKwkJcmV0dXJuIGVudW1lcmF0ZWQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldEVudW1lcmF0ZWQgPGVtPkVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCisJICogQHNlZSAjZ2V0RW51bWVyYXRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgbmV3RW51bWVyYXRlZCkKKwl7CisJCUVudW1UeXBlIG9sZEVudW1lcmF0ZWQgPSBlbnVtZXJhdGVkOworCQllbnVtZXJhdGVkID0gbmV3RW51bWVyYXRlZCA9PSBudWxsID8gRU5VTUVSQVRFRF9FREVGQVVMVCA6IG5ld0VudW1lcmF0ZWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0lEX19FTlVNRVJBVEVELCBvbGRFbnVtZXJhdGVkLCBlbnVtZXJhdGVkKSk7CisJfQorCisJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R2VuZXJhdGVkIFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8cD4KQEAgLTUxLDcgKzMzOCwyNyBAQAogCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JWG1sR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKTsKKwlwdWJsaWMgWG1sR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKQorCXsKKwkJcmV0dXJuIGdlbmVyYXRlZFZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlIG5ld0dlbmVyYXRlZFZhbHVlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sR2VuZXJhdGVkVmFsdWUgb2xkR2VuZXJhdGVkVmFsdWUgPSBnZW5lcmF0ZWRWYWx1ZTsKKwkJZ2VuZXJhdGVkVmFsdWUgPSBuZXdHZW5lcmF0ZWRWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSURfX0dFTkVSQVRFRF9WQUxVRSwgb2xkR2VuZXJhdGVkVmFsdWUsIG5ld0dlbmVyYXRlZFZhbHVlKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CiAKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtNjEsMzYgKzM2OCwyMSBAQAogCSAqIEBzZWUgI2dldEdlbmVyYXRlZFZhbHVlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0Jdm9pZCBzZXRHZW5lcmF0ZWRWYWx1ZShYbWxHZW5lcmF0ZWRWYWx1ZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI3NldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkX1RlbXBvcmFsKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0VGVtcG9yYWwgPGVtPlRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQHNlZSAjZ2V0VGVtcG9yYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSB2YWx1ZSk7CisJcHVibGljIHZvaWQgc2V0R2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUgbmV3R2VuZXJhdGVkVmFsdWUpCisJeworCQlpZiAobmV3R2VuZXJhdGVkVmFsdWUgIT0gZ2VuZXJhdGVkVmFsdWUpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGdlbmVyYXRlZFZhbHVlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWdlbmVyYXRlZFZhbHVlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfSURfX0dFTkVSQVRFRF9WQUxVRSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3R2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3R2VuZXJhdGVkVmFsdWUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9JRF9fR0VORVJBVEVEX1ZBTFVFLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEdlbmVyYXRlZFZhbHVlKG5ld0dlbmVyYXRlZFZhbHVlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0lEX19HRU5FUkFURURfVkFMVUUsIG5ld0dlbmVyYXRlZFZhbHVlLCBuZXdHZW5lcmF0ZWRWYWx1ZSkpOworCX0KIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtMTAyLDExICszOTQsMzEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgogCSAqIEBzZWUgI3NldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSWRfVGFibGVHZW5lcmF0b3IoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1RhYmxlR2VuZXJhdG9yKCkKIAkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwotCVhtbFRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCk7CisJcHVibGljIFhtbFRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCkKKwl7CisJCXJldHVybiB0YWJsZUdlbmVyYXRvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciBuZXdUYWJsZUdlbmVyYXRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbFRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGFibGVHZW5lcmF0b3I7CisJCXRhYmxlR2VuZXJhdG9yID0gbmV3VGFibGVHZW5lcmF0b3I7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0lEX19UQUJMRV9HRU5FUkFUT1IsIG9sZFRhYmxlR2VuZXJhdG9yLCBuZXdUYWJsZUdlbmVyYXRvcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQogCiAJLyoqCiAJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldFRhYmxlR2VuZXJhdG9yIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTExNiw3ICs0MjgsMjEgQEAKIAkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0VGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IgdmFsdWUpOworCXB1YmxpYyB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIG5ld1RhYmxlR2VuZXJhdG9yKQorCXsKKwkJaWYgKG5ld1RhYmxlR2VuZXJhdG9yICE9IHRhYmxlR2VuZXJhdG9yKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmICh0YWJsZUdlbmVyYXRvciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YWJsZUdlbmVyYXRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0lEX19UQUJMRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1RhYmxlR2VuZXJhdG9yICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RhYmxlR2VuZXJhdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfSURfX1RBQkxFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihuZXdUYWJsZUdlbmVyYXRvciwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9fVEFCTEVfR0VORVJBVE9SLCBuZXdUYWJsZUdlbmVyYXRvciwgbmV3VGFibGVHZW5lcmF0b3IpKTsKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTEyOCwxMSArNDU0LDMxIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KIAkgKiBAc2VlICNzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkX1NlcXVlbmNlR2VuZXJhdG9yKCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9TZXF1ZW5jZUdlbmVyYXRvcigpCiAJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpOworCXB1YmxpYyBYbWxTZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpCisJeworCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBvbGRTZXF1ZW5jZUdlbmVyYXRvciA9IHNlcXVlbmNlR2VuZXJhdG9yOworCQlzZXF1ZW5jZUdlbmVyYXRvciA9IG5ld1NlcXVlbmNlR2VuZXJhdG9yOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9fU0VRVUVOQ0VfR0VORVJBVE9SLCBvbGRTZXF1ZW5jZUdlbmVyYXRvciwgbmV3U2VxdWVuY2VHZW5lcmF0b3IpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC0xNDIsNiArNDg4LDMxOCBAQAogCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0Jdm9pZCBzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvciB2YWx1ZSk7CisJcHVibGljIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IpCisJeworCQlpZiAobmV3U2VxdWVuY2VHZW5lcmF0b3IgIT0gc2VxdWVuY2VHZW5lcmF0b3IpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKHNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlcXVlbmNlR2VuZXJhdG9yKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfSURfX1NFUVVFTkNFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3U2VxdWVuY2VHZW5lcmF0b3IgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2VxdWVuY2VHZW5lcmF0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9JRF9fU0VRVUVOQ0VfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBuZXdTZXF1ZW5jZUdlbmVyYXRvcikpOworCX0KIAotfSAvLyBJZAorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fQ09MVU1OOgorCQkJCXJldHVybiBiYXNpY1NldENvbHVtbihudWxsLCBtc2dzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX1NFUVVFTkNFX0dFTkVSQVRPUjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsLCBtc2dzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX1RBQkxFX0dFTkVSQVRPUjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihudWxsLCBtc2dzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX0dFTkVSQVRFRF9WQUxVRToKKwkJCQlyZXR1cm4gYmFzaWNTZXRHZW5lcmF0ZWRWYWx1ZShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19DT0xVTU46CisJCQkJcmV0dXJuIGdldENvbHVtbigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fTE9COgorCQkJCXJldHVybiBpc0xvYigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fVEVNUE9SQUw6CisJCQkJcmV0dXJuIGdldFRlbXBvcmFsKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19FTlVNRVJBVEVEOgorCQkJCXJldHVybiBnZXRFbnVtZXJhdGVkKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1I6CisJCQkJcmV0dXJuIGdldFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19UQUJMRV9HRU5FUkFUT1I6CisJCQkJcmV0dXJuIGdldFRhYmxlR2VuZXJhdG9yKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19HRU5FUkFURURfVkFMVUU6CisJCQkJcmV0dXJuIGdldEdlbmVyYXRlZFZhbHVlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fQ09MVU1OOgorCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19MT0I6CisJCQkJc2V0TG9iKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19URU1QT1JBTDoKKwkJCQlzZXRUZW1wb3JhbCgoVGVtcG9yYWxUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19FTlVNRVJBVEVEOgorCQkJCXNldEVudW1lcmF0ZWQoKEVudW1UeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1I6CisJCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoKFhtbFNlcXVlbmNlR2VuZXJhdG9yKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19UQUJMRV9HRU5FUkFUT1I6CisJCQkJc2V0VGFibGVHZW5lcmF0b3IoKFhtbFRhYmxlR2VuZXJhdG9yKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19HRU5FUkFURURfVkFMVUU6CisJCQkJc2V0R2VuZXJhdGVkVmFsdWUoKFhtbEdlbmVyYXRlZFZhbHVlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19DT0xVTU46CisJCQkJc2V0Q29sdW1uKChYbWxDb2x1bW4pbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fTE9COgorCQkJCXNldExvYihMT0JfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX1RFTVBPUkFMOgorCQkJCXNldFRlbXBvcmFsKFRFTVBPUkFMX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19FTlVNRVJBVEVEOgorCQkJCXNldEVudW1lcmF0ZWQoRU5VTUVSQVRFRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fU0VRVUVOQ0VfR0VORVJBVE9SOgorCQkJCXNldFNlcXVlbmNlR2VuZXJhdG9yKChYbWxTZXF1ZW5jZUdlbmVyYXRvciludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19UQUJMRV9HRU5FUkFUT1I6CisJCQkJc2V0VGFibGVHZW5lcmF0b3IoKFhtbFRhYmxlR2VuZXJhdG9yKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX0dFTkVSQVRFRF9WQUxVRToKKwkJCQlzZXRHZW5lcmF0ZWRWYWx1ZSgoWG1sR2VuZXJhdGVkVmFsdWUpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX0NPTFVNTjoKKwkJCQlyZXR1cm4gY29sdW1uICE9IG51bGw7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19MT0I6CisJCQkJcmV0dXJuIGxvYiAhPSBMT0JfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19URU1QT1JBTDoKKwkJCQlyZXR1cm4gdGVtcG9yYWwgIT0gVEVNUE9SQUxfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19FTlVNRVJBVEVEOgorCQkJCXJldHVybiBlbnVtZXJhdGVkICE9IEVOVU1FUkFURURfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1I6CisJCQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGw7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19UQUJMRV9HRU5FUkFUT1I6CisJCQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yICE9IG51bGw7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19HRU5FUkFURURfVkFMVUU6CisJCQkJcmV0dXJuIGdlbmVyYXRlZFZhbHVlICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IENvbHVtbk1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19DT0xVTU46IHJldHVybiBPcm1QYWNrYWdlLkNPTFVNTl9NQVBQSU5HX19DT0xVTU47CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fTE9COiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fTE9COworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX1RFTVBPUkFMOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUw7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fRU5VTUVSQVRFRDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0VOVU1FUkFURUQ7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sR2VuZXJhdG9yQ29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fU0VRVUVOQ0VfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fU0VRVUVOQ0VfR0VORVJBVE9SOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX1RBQkxFX0dFTkVSQVRPUjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IENvbHVtbk1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuQ09MVU1OX01BUFBJTkdfX0NPTFVNTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0lEX19DT0xVTU47CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19MT0I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9JRF9fTE9COworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9JRF9fVEVNUE9SQUw7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19FTlVNRVJBVEVEOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSURfX0VOVU1FUkFURUQ7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sR2VuZXJhdG9yQ29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19TRVFVRU5DRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9JRF9fU0VRVUVOQ0VfR0VORVJBVE9SOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fVEFCTEVfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSURfX1RBQkxFX0dFTkVSQVRPUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGxvYjogIik7CisJCXJlc3VsdC5hcHBlbmQobG9iKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0ZW1wb3JhbDogIik7CisJCXJlc3VsdC5hcHBlbmQodGVtcG9yYWwpOworCQlyZXN1bHQuYXBwZW5kKCIsIGVudW1lcmF0ZWQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKGVudW1lcmF0ZWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLkVOVU1FUkFURUQpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9iVGV4dFJhbmdlKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImxvYiBub3Qgc3VwcG9ydGVkIGJ5IGlkIG1hcHBpbmdzIik7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidGVtcG9yYWwgbm90IHN1cHBvcnRlZCBieSBpZCBtYXBwaW5ncyIpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCksCisJCQlidWlsZEdlbmVyYXRlZFZhbHVlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRUZW1wb3JhbFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKCksCisJCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQS5DT0xVTU4sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbHVtbk1hcHBpbmdfQ29sdW1uKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRHZW5lcmF0ZWRWYWx1ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxHZW5lcmF0ZWRWYWx1ZS5idWlsZFRyYW5zbGF0b3IoSlBBLkdFTkVSQVRFRF9WQUxVRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSWRfR2VuZXJhdGVkVmFsdWUoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRlbXBvcmFsVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5URU1QT1JBTCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX1RlbXBvcmFsKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxUYWJsZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoSlBBLlRBQkxFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1RhYmxlR2VuZXJhdG9yKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxTZXF1ZW5jZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoSlBBLlNFUVVFTkNFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1NlcXVlbmNlR2VuZXJhdG9yKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sSWRDbGFzcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxJZENsYXNzLmphdmEKaW5kZXggMWJiMGUzZC4uNTBkOGVlNyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxJZENsYXNzLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxJZENsYXNzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTEsOSArMTEsMTIgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0xOTksNCArMjAyLDI1IEBACiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CiAKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJZWxlbWVudE5hbWUsCisJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKKwkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCisJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZENsYXNzVHJhbnNsYXRvcigpCisJCX07CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkNMQVNTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxJZENsYXNzX0NsYXNzTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwogfSAvLyBJZENsYXNzCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbElkSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxJZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2NzVlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbElkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SWQ8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkSW1wbCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxJZEltcGwgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxJZAotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbHVtbigpIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbHVtbiBjb2x1bW47Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHZW5lcmF0ZWRWYWx1ZSgpIDxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdlbmVyYXRlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWU7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUZW1wb3JhbFR5cGUgVEVNUE9SQUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGVtcG9yYWwoKSA8ZW0+VGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRlbXBvcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHRlbXBvcmFsID0gVEVNUE9SQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZUdlbmVyYXRvcigpIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhYmxlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3I7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3I7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSWRJbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0lEX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb2x1bW4oWG1sQ29sdW1uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKQotCXsKLQkJcmV0dXJuIGNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb2x1bW4oWG1sQ29sdW1uIG5ld0NvbHVtbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENvbHVtbiBvbGRDb2x1bW4gPSBjb2x1bW47Ci0JCWNvbHVtbiA9IG5ld0NvbHVtbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fQ09MVU1OLCBvbGRDb2x1bW4sIG5ld0NvbHVtbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkSW1wbCNnZXRDb2x1bW4gPGVtPkNvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oWG1sQ29sdW1uIG5ld0NvbHVtbikKLQl7Ci0JCWlmIChuZXdDb2x1bW4gIT0gY29sdW1uKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb2x1bW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29sdW1uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fQ09MVU1OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb2x1bW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29sdW1uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fQ09MVU1OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbHVtbihuZXdDb2x1bW4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fQ09MVU1OLCBuZXdDb2x1bW4sIG5ld0NvbHVtbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0R2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxJZF9HZW5lcmF0ZWRWYWx1ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKQotCXsKLQkJcmV0dXJuIGdlbmVyYXRlZFZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlIG5ld0dlbmVyYXRlZFZhbHVlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sR2VuZXJhdGVkVmFsdWUgb2xkR2VuZXJhdGVkVmFsdWUgPSBnZW5lcmF0ZWRWYWx1ZTsKLQkJZ2VuZXJhdGVkVmFsdWUgPSBuZXdHZW5lcmF0ZWRWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fR0VORVJBVEVEX1ZBTFVFLCBvbGRHZW5lcmF0ZWRWYWx1ZSwgbmV3R2VuZXJhdGVkVmFsdWUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZEltcGwjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRHZW5lcmF0ZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlIG5ld0dlbmVyYXRlZFZhbHVlKQotCXsKLQkJaWYgKG5ld0dlbmVyYXRlZFZhbHVlICE9IGdlbmVyYXRlZFZhbHVlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChnZW5lcmF0ZWRWYWx1ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClnZW5lcmF0ZWRWYWx1ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX0dFTkVSQVRFRF9WQUxVRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3R2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3R2VuZXJhdGVkVmFsdWUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19HRU5FUkFURURfVkFMVUUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0R2VuZXJhdGVkVmFsdWUobmV3R2VuZXJhdGVkVmFsdWUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fR0VORVJBVEVEX1ZBTFVFLCBuZXdHZW5lcmF0ZWRWYWx1ZSwgbmV3R2VuZXJhdGVkVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI3NldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkX1RlbXBvcmFsKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpCi0JewotCQlyZXR1cm4gdGVtcG9yYWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkSW1wbCNnZXRUZW1wb3JhbCA8ZW0+VGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUKLQkgKiBAc2VlICNnZXRUZW1wb3JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCkKLQl7Ci0JCVRlbXBvcmFsVHlwZSBvbGRUZW1wb3JhbCA9IHRlbXBvcmFsOwotCQl0ZW1wb3JhbCA9IG5ld1RlbXBvcmFsID09IG51bGwgPyBURU1QT1JBTF9FREVGQVVMVCA6IG5ld1RlbXBvcmFsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19URU1QT1JBTCwgb2xkVGVtcG9yYWwsIHRlbXBvcmFsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkX1RhYmxlR2VuZXJhdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUYWJsZUdlbmVyYXRvciBnZXRUYWJsZUdlbmVyYXRvcigpCi0JewotCQlyZXR1cm4gdGFibGVHZW5lcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IgbmV3VGFibGVHZW5lcmF0b3IsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxUYWJsZUdlbmVyYXRvciBvbGRUYWJsZUdlbmVyYXRvciA9IHRhYmxlR2VuZXJhdG9yOwotCQl0YWJsZUdlbmVyYXRvciA9IG5ld1RhYmxlR2VuZXJhdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19UQUJMRV9HRU5FUkFUT1IsIG9sZFRhYmxlR2VuZXJhdG9yLCBuZXdUYWJsZUdlbmVyYXRvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkSW1wbCNnZXRUYWJsZUdlbmVyYXRvciA8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRhYmxlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IgbmV3VGFibGVHZW5lcmF0b3IpCi0JewotCQlpZiAobmV3VGFibGVHZW5lcmF0b3IgIT0gdGFibGVHZW5lcmF0b3IpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRhYmxlR2VuZXJhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXRhYmxlR2VuZXJhdG9yKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fVEFCTEVfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUYWJsZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdUYWJsZUdlbmVyYXRvcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1RBQkxFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihuZXdUYWJsZUdlbmVyYXRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19UQUJMRV9HRU5FUkFUT1IsIG5ld1RhYmxlR2VuZXJhdG9yLCBuZXdUYWJsZUdlbmVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxJZF9TZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igb2xkU2VxdWVuY2VHZW5lcmF0b3IgPSBzZXF1ZW5jZUdlbmVyYXRvcjsKLQkJc2VxdWVuY2VHZW5lcmF0b3IgPSBuZXdTZXF1ZW5jZUdlbmVyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fU0VRVUVOQ0VfR0VORVJBVE9SLCBvbGRTZXF1ZW5jZUdlbmVyYXRvciwgbmV3U2VxdWVuY2VHZW5lcmF0b3IpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZEltcGwjZ2V0U2VxdWVuY2VHZW5lcmF0b3IgPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIG5ld1NlcXVlbmNlR2VuZXJhdG9yKQotCXsKLQkJaWYgKG5ld1NlcXVlbmNlR2VuZXJhdG9yICE9IHNlcXVlbmNlR2VuZXJhdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZXF1ZW5jZUdlbmVyYXRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1NFUVVFTkNFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U2VxdWVuY2VHZW5lcmF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2VxdWVuY2VHZW5lcmF0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19TRVFVRU5DRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U2VxdWVuY2VHZW5lcmF0b3IobmV3U2VxdWVuY2VHZW5lcmF0b3IsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fU0VRVUVOQ0VfR0VORVJBVE9SLCBuZXdTZXF1ZW5jZUdlbmVyYXRvciwgbmV3U2VxdWVuY2VHZW5lcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fQ09MVU1OOgotCQkJCXJldHVybiBiYXNpY1NldENvbHVtbihudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fR0VORVJBVEVEX1ZBTFVFOgotCQkJCXJldHVybiBiYXNpY1NldEdlbmVyYXRlZFZhbHVlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VGFibGVHZW5lcmF0b3IobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX0NPTFVNTjoKLQkJCQlyZXR1cm4gZ2V0Q29sdW1uKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX0dFTkVSQVRFRF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fVEVNUE9SQUw6Ci0JCQkJcmV0dXJuIGdldFRlbXBvcmFsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fQ09MVU1OOgotCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX0dFTkVSQVRFRF9WQUxVRToKLQkJCQlzZXRHZW5lcmF0ZWRWYWx1ZSgoWG1sR2VuZXJhdGVkVmFsdWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fVEVNUE9SQUw6Ci0JCQkJc2V0VGVtcG9yYWwoKFRlbXBvcmFsVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJc2V0VGFibGVHZW5lcmF0b3IoKFhtbFRhYmxlR2VuZXJhdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcigoWG1sU2VxdWVuY2VHZW5lcmF0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fQ09MVU1OOgotCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fR0VORVJBVEVEX1ZBTFVFOgotCQkJCXNldEdlbmVyYXRlZFZhbHVlKChYbWxHZW5lcmF0ZWRWYWx1ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1RFTVBPUkFMOgotCQkJCXNldFRlbXBvcmFsKFRFTVBPUkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcigoWG1sVGFibGVHZW5lcmF0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoKFhtbFNlcXVlbmNlR2VuZXJhdG9yKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX0NPTFVNTjoKLQkJCQlyZXR1cm4gY29sdW1uICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX0dFTkVSQVRFRF9WQUxVRToKLQkJCQlyZXR1cm4gZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fVEVNUE9SQUw6Ci0JCQkJcmV0dXJuIHRlbXBvcmFsICE9IFRFTVBPUkFMX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3IgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gQ29sdW1uTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fQ09MVU1OOiByZXR1cm4gT3JtUGFja2FnZS5DT0xVTU5fTUFQUElOR19fQ09MVU1OOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbElkLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19HRU5FUkFURURfVkFMVUU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9JRF9fR0VORVJBVEVEX1ZBTFVFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9JRF9fVEVNUE9SQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19UQUJMRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9JRF9fVEFCTEVfR0VORVJBVE9SOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfSU1QTF9fU0VRVUVOQ0VfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSURfX1NFUVVFTkNFX0dFTkVSQVRPUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IENvbHVtbk1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuQ09MVU1OX01BUFBJTkdfX0NPTFVNTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX0NPTFVNTjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxJZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX0dFTkVSQVRFRF9WQUxVRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX0dFTkVSQVRFRF9WQUxVRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19URU1QT1JBTDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1RFTVBPUkFMOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX1RBQkxFX0dFTkVSQVRPUjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0lEX0lNUExfX1RBQkxFX0dFTkVSQVRPUjsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9JRF9JTVBMX19TRVFVRU5DRV9HRU5FUkFUT1I7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0ZW1wb3JhbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGVtcG9yYWwpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gSWQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luQ29sdW1uLmphdmEKaW5kZXggYjJlMjYwYS4uMzE0ODRjNCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luQ29sdW1uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luQ29sdW1uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw4ICs5LDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQoraW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTMxLDEyICszNiw1MyBAQAogICogPC9wPgogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pbkNvbHVtbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSm9pbkNvbHVtbiBleHRlbmRzIFhtbEFic3RyYWN0Q29sdW1uCitwdWJsaWMgY2xhc3MgWG1sSm9pbkNvbHVtbiBleHRlbmRzIEFic3RyYWN0WG1sQ29sdW1uCiB7CiAJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxKb2luQ29sdW1uKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0pPSU5fQ09MVU1OOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtNTAsNyArOTYsMTAgQEAKIAkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCiAJICogQGdlbmVyYXRlZAogCSAqLwotCVN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOworCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQorCXsKKwkJcmV0dXJuIHJlZmVyZW5jZWRDb2x1bW5OYW1lOworCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lIDxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC02MCw4ICsxMDksMTI2IEBACiAJICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQl2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyB2YWx1ZSk7Ci0JCi0JVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCk7CisJcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5ld1JlZmVyZW5jZWRDb2x1bW5OYW1lKQorCXsKKwkJU3RyaW5nIG9sZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gcmVmZXJlbmNlZENvbHVtbk5hbWU7CisJCXJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3UmVmZXJlbmNlZENvbHVtbk5hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCBvbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUpKTsKKwl9CiAKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6CisJCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRToKKwkJCQlzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOgorCQkJCXNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOgorCQkJCXJldHVybiBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyByZWZlcmVuY2VkQ29sdW1uTmFtZSAhPSBudWxsIDogIVJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQuZXF1YWxzKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAocmVmZXJlbmNlZENvbHVtbk5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLlJFRkVSRU5DRURfQ09MVU1OX05BTUUpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJZWxlbWVudE5hbWUsCisJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKKwkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCisJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZFJlZmVyZW5jZWRDb2x1bW5OYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRVbmlxdWVUcmFuc2xhdG9yKCksCisJCQlidWlsZE51bGxhYmxlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRJbnNlcnRhYmxlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRVcGRhdGFibGVUcmFuc2xhdG9yKCksCisJCQlidWlsZENvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCksCisJCQlidWlsZFRhYmxlVHJhbnNsYXRvcigpLAorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pbkNvbHVtbl9SZWZlcmVuY2VkQ29sdW1uTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KIH0gLy8gSm9pbkNvbHVtbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luQ29sdW1uSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luQ29sdW1uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWU2NWY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkNvbHVtbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9ycy5Pcm1YbWxNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5lbWYuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Sm9pbiBDb2x1bW48L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5Db2x1bW5JbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEpvaW5Db2x1bW5JbXBsIGV4dGVuZHMgQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbiBpbXBsZW1lbnRzIFhtbEpvaW5Db2x1bW4KLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEpvaW5Db2x1bW5JbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0pPSU5fQ09MVU1OX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxKb2luQ29sdW1uX1JlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCXsKLQkJcmV0dXJuIHJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uSW1wbCNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmV3UmVmZXJlbmNlZENvbHVtbk5hbWUpCi0JewotCQlTdHJpbmcgb2xkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSByZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuZXdSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fSU1QTF9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgb2xkUmVmZXJlbmNlZENvbHVtbk5hbWUsIHJlZmVyZW5jZWRDb2x1bW5OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fQ09MVU1OX0lNUExfX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX0NPTFVNTl9JTVBMX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOgotCQkJCXNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fSU1QTF9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRToKLQkJCQlzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX0NPTFVNTl9JTVBMX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOgotCQkJCXJldHVybiBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyByZWZlcmVuY2VkQ29sdW1uTmFtZSAhPSBudWxsIDogIVJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQuZXF1YWxzKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkNvbHVtbi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fSU1QTF9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkNvbHVtbi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9KT0lOX0NPTFVNTl9JTVBMX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVmZXJlbmNlZENvbHVtbk5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIHJlZmVyZW5jZWRDb2x1bW5OYW1lTm9kZSA9IChJRE9NTm9kZSkgRE9NVXRpbGl0aWVzLmNoaWxkQXR0cmlidXRlTm9kZSh0aGlzLm5vZGUsIE9ybVhtbE1hcHBlci5SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQkJcmV0dXJuIChyZWZlcmVuY2VkQ29sdW1uTmFtZU5vZGUgPT0gbnVsbCkgPyBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgOiBidWlsZFRleHRSYW5nZShyZWZlcmVuY2VkQ29sdW1uTmFtZU5vZGUpOwotCX0KLX0gLy8gSm9pbkNvbHVtbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luQ29sdW1uc01hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkNvbHVtbnNNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI2NGZhNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkNvbHVtbnNNYXBwaW5nLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgSm9pbiBDb2x1bW5zIE1hcHBpbmc8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW5zTWFwcGluZyNnZXRKb2luQ29sdW1ucyA8ZW0+Sm9pbiBDb2x1bW5zPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxKb2luQ29sdW1uc01hcHBpbmcoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbEpvaW5Db2x1bW5zTWFwcGluZyBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxKb2luQ29sdW1uc01hcHBpbmdfSm9pbkNvbHVtbnMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pblRhYmxlLmphdmEKaW5kZXggZGQzOTNjMy4uNWQxODEyMCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luVGFibGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5UYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksNyArOSwxNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwogCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTMxLDEyICs0MCw1MiBAQAogICogPC9wPgogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGludGVyZmFjZSBYbWxKb2luVGFibGUgZXh0ZW5kcyBYbWxCYXNlVGFibGUKK3B1YmxpYyBjbGFzcyBYbWxKb2luVGFibGUgZXh0ZW5kcyBBYnN0cmFjdFhtbFRhYmxlCiB7CiAJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkNvbHVtbnMoKSA8ZW0+Sm9pbiBDb2x1bW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEpvaW5Db2x1bW5zKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gam9pbkNvbHVtbnM7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkgPGVtPkludmVyc2UgSm9pbiBDb2x1bW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEludmVyc2VKb2luQ29sdW1ucygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGludmVyc2VKb2luQ29sdW1uczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxKb2luVGFibGUoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfSk9JTl9UQUJMRTsKKwl9CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTUwLDcgKzk5LDE0IEBACiAJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpOworCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpCisJeworCQlpZiAoam9pbkNvbHVtbnMgPT0gbnVsbCkKKwkJeworCQkJam9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSm9pbkNvbHVtbj4oWG1sSm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TKTsKKwkJfQorCQlyZXR1cm4gam9pbkNvbHVtbnM7CisJfQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW52ZXJzZSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNjYsNyArMTIyLDEzOSBAQAogCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCk7CisJcHVibGljIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEludmVyc2VKb2luQ29sdW1ucygpCisJeworCQlpZiAoaW52ZXJzZUpvaW5Db2x1bW5zID09IG51bGwpCisJCXsKKwkJCWludmVyc2VKb2luQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxKb2luQ29sdW1uPihYbWxKb2luQ29sdW1uLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19JTlZFUlNFX0pPSU5fQ09MVU1OUyk7CisJCX0KKwkJcmV0dXJuIGludmVyc2VKb2luQ29sdW1uczsKKwl9CiAKLQlib29sZWFuIGlzU3BlY2lmaWVkKCk7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0pPSU5fQ09MVU1OUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEpvaW5Db2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSU5WRVJTRV9KT0lOX0NPTFVNTlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TOgorCQkJCXJldHVybiBnZXRKb2luQ29sdW1ucygpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19JTlZFUlNFX0pPSU5fQ09MVU1OUzoKKwkJCQlyZXR1cm4gZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19KT0lOX0NPTFVNTlM6CisJCQkJZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOworCQkJCWdldEpvaW5Db2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxKb2luQ29sdW1uPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19JTlZFUlNFX0pPSU5fQ09MVU1OUzoKKwkJCQlnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5jbGVhcigpOworCQkJCWdldEludmVyc2VKb2luQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSm9pbkNvbHVtbj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TOgorCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TOgorCQkJCWdldEludmVyc2VKb2luQ29sdW1ucygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TOgorCQkJCXJldHVybiBqb2luQ29sdW1ucyAhPSBudWxsICYmICFqb2luQ29sdW1ucy5pc0VtcHR5KCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TOgorCQkJCXJldHVybiBpbnZlcnNlSm9pbkNvbHVtbnMgIT0gbnVsbCAmJiAhaW52ZXJzZUpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoKSB7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZENhdGFsb2dUcmFuc2xhdG9yKCksCisJCQlidWlsZFNjaGVtYVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCisJCQlidWlsZFVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pbkNvbHVtblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxKb2luQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEuSk9JTl9DT0xVTU4sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZV9Kb2luQ29sdW1ucygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5UcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sSm9pbkNvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBLklOVkVSU0VfSk9JTl9DT0xVTU4sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZV9JbnZlcnNlSm9pbkNvbHVtbnMoKSk7CisJfQorCiB9IC8vIEpvaW5UYWJsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luVGFibGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5UYWJsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5ZmI0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5UYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlSW1wbCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxKb2luVGFibGVJbXBsIGV4dGVuZHMgQWJzdHJhY3RYbWxCYXNlVGFibGUgaW1wbGVtZW50cyBYbWxKb2luVGFibGUKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luQ29sdW1ucygpIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Sm9pbkNvbHVtbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxKb2luQ29sdW1uPiBqb2luQ29sdW1uczsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKSA8ZW0+SW52ZXJzZSBKb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gaW52ZXJzZUpvaW5Db2x1bW5zOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEpvaW5UYWJsZUltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfSk9JTl9UQUJMRV9JTVBMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZV9Kb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKQotCXsKLQkJaWYgKGpvaW5Db2x1bW5zID09IG51bGwpCi0JCXsKLQkJCWpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSk9JTl9DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gam9pbkNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW52ZXJzZSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnZlcnNlIEpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludmVyc2UgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlX0ludmVyc2VKb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkKLQl7Ci0JCWlmIChpbnZlcnNlSm9pbkNvbHVtbnMgPT0gbnVsbCkKLQkJewotCQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSU5WRVJTRV9KT0lOX0NPTFVNTlMpOwotCQl9Ci0JCXJldHVybiBpbnZlcnNlSm9pbkNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Sm9pbkNvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX0lNUExfX0lOVkVSU0VfSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBnZXRKb2luQ29sdW1ucygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX0lNUExfX0lOVkVSU0VfSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRKb2luQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSm9pbkNvbHVtbj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9JTVBMX19JTlZFUlNFX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCWdldEludmVyc2VKb2luQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSm9pbkNvbHVtbj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9JTVBMX19JTlZFUlNFX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBqb2luQ29sdW1ucyAhPSBudWxsICYmICFqb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSU5WRVJTRV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGludmVyc2VKb2luQ29sdW1ucyAhPSBudWxsICYmICFpbnZlcnNlSm9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luVGFibGUuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfSU1QTF9fSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9JTVBMX19JTlZFUlNFX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pblRhYmxlLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX0lNUExfX0pPSU5fQ09MVU1OUzsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9JTVBMX19JTlZFUlNFX0pPSU5fQ09MVU1OUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19IC8vIEpvaW5UYWJsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luVGFibGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5UYWJsZU1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzc4ZDUzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luVGFibGVNYXBwaW5nLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEpvaW4gVGFibGUgTWFwcGluZzwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlTWFwcGluZyNnZXRKb2luVGFibGUgPGVtPkpvaW4gVGFibGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZU1hcHBpbmcoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbEpvaW5UYWJsZU1hcHBpbmcgZXh0ZW5kcyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlTWFwcGluZ19Kb2luVGFibGUoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZU1hcHBpbmcjZ2V0Sm9pblRhYmxlIDxlbT5Kb2luIFRhYmxlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRKb2luVGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFueVRvTWFueS5qYXZhCmluZGV4IDg3NDVlZmUuLjg1MzhiYWIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFueVRvTWFueS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFueVRvTWFueS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksNiArOSwyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwogCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjMsOSArMzksNjkxIEBACiAgKgogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFueVRvTWFueSBleHRlbmRzIFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZworcHVibGljIGNsYXNzIFhtbE1hbnlUb01hbnkgZXh0ZW5kcyBBYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBpbXBsZW1lbnRzIFhtbE1hbnlUb01hbnlfMl8wCiB7Ci19IC8vIE1hbnlUb01hbnkKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyQ29sdW1uKCkgPGVtPk9yZGVyIENvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JkZXJDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxPcmRlckNvbHVtbiBvcmRlckNvbHVtbjsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlDbGFzcygpIDxlbT5NYXAgS2V5IENsYXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlDbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbE1hcEtleUNsYXNzIG1hcEtleUNsYXNzOworCS8qKgorCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAorCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRlbXBvcmFsVHlwZSBNQVBfS0VZX1RFTVBPUkFMX0VERUZBVUxUID0gbnVsbDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlUZW1wb3JhbCgpIDxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlUZW1wb3JhbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSBtYXBLZXlUZW1wb3JhbCA9IE1BUF9LRVlfVEVNUE9SQUxfRURFRkFVTFQ7CisJLyoqCisJICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0CisJICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRW51bVR5cGUgTUFQX0tFWV9FTlVNRVJBVEVEX0VERUZBVUxUID0gbnVsbDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlFbnVtZXJhdGVkKCkgPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFwS2V5RW51bWVyYXRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVudW1UeXBlIG1hcEtleUVudW1lcmF0ZWQgPSBNQVBfS0VZX0VOVU1FUkFURURfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkgPGVtPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUNvbHVtbigpIDxlbT5NYXAgS2V5IENvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFwS2V5Q29sdW1uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ29sdW1uIG1hcEtleUNvbHVtbjsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlKb2luQ29sdW1ucygpIDxlbT5NYXAgS2V5IEpvaW4gQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlKb2luQ29sdW1ucygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbEpvaW5Db2x1bW4+IG1hcEtleUpvaW5Db2x1bW5zOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbE1hbnlUb01hbnkoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTUFOWV9UT19NQU5ZOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9yZGVyIENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldE9yZGVyQ29sdW1uKFhtbE9yZGVyQ29sdW1uKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzBfT3JkZXJDb2x1bW4oKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbE9yZGVyQ29sdW1uIGdldE9yZGVyQ29sdW1uKCkKKwl7CisJCXJldHVybiBvcmRlckNvbHVtbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPcmRlckNvbHVtbihYbWxPcmRlckNvbHVtbiBuZXdPcmRlckNvbHVtbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbE9yZGVyQ29sdW1uIG9sZE9yZGVyQ29sdW1uID0gb3JkZXJDb2x1bW47CisJCW9yZGVyQ29sdW1uID0gbmV3T3JkZXJDb2x1bW47CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT1JERVJfQ09MVU1OLCBvbGRPcmRlckNvbHVtbiwgbmV3T3JkZXJDb2x1bW4pOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2dldE9yZGVyQ29sdW1uIDxlbT5PcmRlciBDb2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyIENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0T3JkZXJDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPcmRlckNvbHVtbihYbWxPcmRlckNvbHVtbiBuZXdPcmRlckNvbHVtbikKKwl7CisJCWlmIChuZXdPcmRlckNvbHVtbiAhPSBvcmRlckNvbHVtbikKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAob3JkZXJDb2x1bW4gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpb3JkZXJDb2x1bW4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX09SREVSX0NPTFVNTiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3T3JkZXJDb2x1bW4gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T3JkZXJDb2x1bW4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX09SREVSX0NPTFVNTiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRPcmRlckNvbHVtbihuZXdPcmRlckNvbHVtbiwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX09SREVSX0NPTFVNTiwgbmV3T3JkZXJDb2x1bW4sIG5ld09yZGVyQ29sdW1uKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENsYXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRNYXBLZXlDbGFzcyhYbWxNYXBLZXlDbGFzcykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8wX01hcEtleUNsYXNzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxNYXBLZXlDbGFzcyBnZXRNYXBLZXlDbGFzcygpCisJeworCQlyZXR1cm4gbWFwS2V5Q2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWFwS2V5Q2xhc3MoWG1sTWFwS2V5Q2xhc3MgbmV3TWFwS2V5Q2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxNYXBLZXlDbGFzcyBvbGRNYXBLZXlDbGFzcyA9IG1hcEtleUNsYXNzOworCQltYXBLZXlDbGFzcyA9IG5ld01hcEtleUNsYXNzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ0xBU1MsIG9sZE1hcEtleUNsYXNzLCBuZXdNYXBLZXlDbGFzcyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0TWFwS2V5Q2xhc3MgPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE1hcEtleUNsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFwS2V5Q2xhc3MoWG1sTWFwS2V5Q2xhc3MgbmV3TWFwS2V5Q2xhc3MpCisJeworCQlpZiAobmV3TWFwS2V5Q2xhc3MgIT0gbWFwS2V5Q2xhc3MpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKG1hcEtleUNsYXNzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW1hcEtleUNsYXNzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdNYXBLZXlDbGFzcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNYXBLZXlDbGFzcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DTEFTUywgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRNYXBLZXlDbGFzcyhuZXdNYXBLZXlDbGFzcywgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ0xBU1MsIG5ld01hcEtleUNsYXNzLCBuZXdNYXBLZXlDbGFzcykpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCisJICogQHNlZSAjc2V0TWFwS2V5VGVtcG9yYWwoVGVtcG9yYWxUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzBfTWFwS2V5VGVtcG9yYWwoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldE1hcEtleVRlbXBvcmFsKCkKKwl7CisJCXJldHVybiBtYXBLZXlUZW1wb3JhbDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRNYXBLZXlUZW1wb3JhbCA8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCisJICogQHNlZSAjZ2V0TWFwS2V5VGVtcG9yYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXBLZXlUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3TWFwS2V5VGVtcG9yYWwpCisJeworCQlUZW1wb3JhbFR5cGUgb2xkTWFwS2V5VGVtcG9yYWwgPSBtYXBLZXlUZW1wb3JhbDsKKwkJbWFwS2V5VGVtcG9yYWwgPSBuZXdNYXBLZXlUZW1wb3JhbCA9PSBudWxsID8gTUFQX0tFWV9URU1QT1JBTF9FREVGQVVMVCA6IG5ld01hcEtleVRlbXBvcmFsOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfVEVNUE9SQUwsIG9sZE1hcEtleVRlbXBvcmFsLCBtYXBLZXlUZW1wb3JhbCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBFbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQorCSAqIEBzZWUgI3NldE1hcEtleUVudW1lcmF0ZWQoRW51bVR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMF9NYXBLZXlFbnVtZXJhdGVkKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVudW1UeXBlIGdldE1hcEtleUVudW1lcmF0ZWQoKQorCXsKKwkJcmV0dXJuIG1hcEtleUVudW1lcmF0ZWQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0TWFwS2V5RW51bWVyYXRlZCA8ZW0+TWFwIEtleSBFbnVtZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCisJICogQHNlZSAjZ2V0TWFwS2V5RW51bWVyYXRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1hcEtleUVudW1lcmF0ZWQoRW51bVR5cGUgbmV3TWFwS2V5RW51bWVyYXRlZCkKKwl7CisJCUVudW1UeXBlIG9sZE1hcEtleUVudW1lcmF0ZWQgPSBtYXBLZXlFbnVtZXJhdGVkOworCQltYXBLZXlFbnVtZXJhdGVkID0gbmV3TWFwS2V5RW51bWVyYXRlZCA9PSBudWxsID8gTUFQX0tFWV9FTlVNRVJBVEVEX0VERUZBVUxUIDogbmV3TWFwS2V5RW51bWVyYXRlZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0VOVU1FUkFURUQsIG9sZE1hcEtleUVudW1lcmF0ZWQsIG1hcEtleUVudW1lcmF0ZWQpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzBfTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkKKwl7CisJCWlmIChtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPT0gbnVsbCkKKwkJeworCQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPihYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVMpOworCQl9CisJCXJldHVybiBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRNYXBLZXlDb2x1bW4oWG1sQ29sdW1uKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzBfTWFwS2V5Q29sdW1uKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDb2x1bW4gZ2V0TWFwS2V5Q29sdW1uKCkKKwl7CisJCXJldHVybiBtYXBLZXlDb2x1bW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWFwS2V5Q29sdW1uKFhtbENvbHVtbiBuZXdNYXBLZXlDb2x1bW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxDb2x1bW4gb2xkTWFwS2V5Q29sdW1uID0gbWFwS2V5Q29sdW1uOworCQltYXBLZXlDb2x1bW4gPSBuZXdNYXBLZXlDb2x1bW47CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU4sIG9sZE1hcEtleUNvbHVtbiwgbmV3TWFwS2V5Q29sdW1uKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRNYXBLZXlDb2x1bW4gPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0TWFwS2V5Q29sdW1uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFwS2V5Q29sdW1uKFhtbENvbHVtbiBuZXdNYXBLZXlDb2x1bW4pCisJeworCQlpZiAobmV3TWFwS2V5Q29sdW1uICE9IG1hcEtleUNvbHVtbikKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAobWFwS2V5Q29sdW1uICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW1hcEtleUNvbHVtbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU4sIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld01hcEtleUNvbHVtbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNYXBLZXlDb2x1bW4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09MVU1OLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldE1hcEtleUNvbHVtbihuZXdNYXBLZXlDb2x1bW4sIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTFVNTiwgbmV3TWFwS2V5Q29sdW1uLCBuZXdNYXBLZXlDb2x1bW4pKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMF9NYXBLZXlKb2luQ29sdW1ucygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKQorCXsKKwkJaWYgKG1hcEtleUpvaW5Db2x1bW5zID09IG51bGwpCisJCXsKKwkJCW1hcEtleUpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9KT0lOX0NPTFVNTlMpOworCQl9CisJCXJldHVybiBtYXBLZXlKb2luQ29sdW1uczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PUkRFUl9DT0xVTU46CisJCQkJcmV0dXJuIGJhc2ljU2V0T3JkZXJDb2x1bW4obnVsbCwgbXNncyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DTEFTUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRNYXBLZXlDbGFzcyhudWxsLCBtc2dzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09MVU1OOgorCQkJCXJldHVybiBiYXNpY1NldE1hcEtleUNvbHVtbihudWxsLCBtc2dzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0pPSU5fQ09MVU1OUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1hcEtleUpvaW5Db2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT1JERVJfQ09MVU1OOgorCQkJCXJldHVybiBnZXRPcmRlckNvbHVtbigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ0xBU1M6CisJCQkJcmV0dXJuIGdldE1hcEtleUNsYXNzKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9URU1QT1JBTDoKKwkJCQlyZXR1cm4gZ2V0TWFwS2V5VGVtcG9yYWwoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0VOVU1FUkFURUQ6CisJCQkJcmV0dXJuIGdldE1hcEtleUVudW1lcmF0ZWQoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6CisJCQkJcmV0dXJuIGdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09MVU1OOgorCQkJCXJldHVybiBnZXRNYXBLZXlDb2x1bW4oKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0pPSU5fQ09MVU1OUzoKKwkJCQlyZXR1cm4gZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT1JERVJfQ09MVU1OOgorCQkJCXNldE9yZGVyQ29sdW1uKChYbWxPcmRlckNvbHVtbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ0xBU1M6CisJCQkJc2V0TWFwS2V5Q2xhc3MoKFhtbE1hcEtleUNsYXNzKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9URU1QT1JBTDoKKwkJCQlzZXRNYXBLZXlUZW1wb3JhbCgoVGVtcG9yYWxUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9FTlVNRVJBVEVEOgorCQkJCXNldE1hcEtleUVudW1lcmF0ZWQoKEVudW1UeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOgorCQkJCWdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpLmNsZWFyKCk7CisJCQkJZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBdHRyaWJ1dGVPdmVycmlkZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTFVNTjoKKwkJCQlzZXRNYXBLZXlDb2x1bW4oKFhtbENvbHVtbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfSk9JTl9DT0xVTU5TOgorCQkJCWdldE1hcEtleUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKKwkJCQlnZXRNYXBLZXlKb2luQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSm9pbkNvbHVtbj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PUkRFUl9DT0xVTU46CisJCQkJc2V0T3JkZXJDb2x1bW4oKFhtbE9yZGVyQ29sdW1uKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTOgorCQkJCXNldE1hcEtleUNsYXNzKChYbWxNYXBLZXlDbGFzcyludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9URU1QT1JBTDoKKwkJCQlzZXRNYXBLZXlUZW1wb3JhbChNQVBfS0VZX1RFTVBPUkFMX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9FTlVNRVJBVEVEOgorCQkJCXNldE1hcEtleUVudW1lcmF0ZWQoTUFQX0tFWV9FTlVNRVJBVEVEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOgorCQkJCWdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09MVU1OOgorCQkJCXNldE1hcEtleUNvbHVtbigoWG1sQ29sdW1uKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0pPSU5fQ09MVU1OUzoKKwkJCQlnZXRNYXBLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PUkRFUl9DT0xVTU46CisJCQkJcmV0dXJuIG9yZGVyQ29sdW1uICE9IG51bGw7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DTEFTUzoKKwkJCQlyZXR1cm4gbWFwS2V5Q2xhc3MgIT0gbnVsbDsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX1RFTVBPUkFMOgorCQkJCXJldHVybiBtYXBLZXlUZW1wb3JhbCAhPSBNQVBfS0VZX1RFTVBPUkFMX0VERUZBVUxUOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfRU5VTUVSQVRFRDoKKwkJCQlyZXR1cm4gbWFwS2V5RW51bWVyYXRlZCAhPSBNQVBfS0VZX0VOVU1FUkFURURfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOgorCQkJCXJldHVybiBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgIT0gbnVsbCAmJiAhbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmlzRW1wdHkoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTFVNTjoKKwkJCQlyZXR1cm4gbWFwS2V5Q29sdW1uICE9IG51bGw7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9KT0lOX0NPTFVNTlM6CisJCQkJcmV0dXJuIG1hcEtleUpvaW5Db2x1bW5zICE9IG51bGwgJiYgIW1hcEtleUpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFueVRvTWFueV8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT1JERVJfQ09MVU1OOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV8yMF9fT1JERVJfQ09MVU1OOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9DTEFTUzsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9URU1QT1JBTDogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfVEVNUE9SQUw7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfRU5VTUVSQVRFRDogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfRU5VTUVSQVRFRDsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTFVNTjogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfQ09MVU1OOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfSk9JTl9DT0xVTU5TOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFueVRvTWFueV8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfMjBfX09SREVSX0NPTFVNTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT1JERVJfQ09MVU1OOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9DTEFTUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DTEFTUzsKKwkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfVEVNUE9SQUw7CisJCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZXzIwX19NQVBfS0VZX0VOVU1FUkFURUQ6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfRU5VTUVSQVRFRDsKKwkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9DT0xVTU46IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09MVU1OOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfSk9JTl9DT0xVTU5TOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobWFwS2V5VGVtcG9yYWw6ICIpOworCQlyZXN1bHQuYXBwZW5kKG1hcEtleVRlbXBvcmFsKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtYXBLZXlFbnVtZXJhdGVkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXBLZXlFbnVtZXJhdGVkKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcHBlZEJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRPcmRlckJ5VHJhbnNsYXRvcigpLAorCQkJWG1sT3JkZXJDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5PUkRFUl9DT0xVTU4sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55XzJfMF9PcmRlckNvbHVtbigpKSwJCQorCQkJYnVpbGRNYXBLZXlUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcEtleUNsYXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNYXBLZXlUZW1wb3JhbFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTWFwS2V5RW51bWVyYXRlZFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcEtleUNvbHVtblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTWFwS2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSm9pblRhYmxlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDYXNjYWRlVHJhbnNsYXRvcigpCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcHBlZEJ5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5NQVBQRURfQlksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZEJ5TWFwcGluZ19NYXBwZWRCeSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlDbGFzc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxNYXBLZXlDbGFzcy5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfQ0xBU1MsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55XzJfMF9NYXBLZXlDbGFzcygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5VGVtcG9yYWxUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfVEVNUE9SQUwsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55XzJfMF9NYXBLZXlUZW1wb3JhbCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5RW51bWVyYXRlZFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuTUFQX0tFWV9FTlVNRVJBVEVELCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueV8yXzBfTWFwS2V5RW51bWVyYXRlZCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQXR0cmlidXRlT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hbnlUb01hbnlfMl8wX01hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5Q29sdW1uVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbENvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueV8yXzBfTWFwS2V5Q29sdW1uKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlKb2luQ29sdW1uVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbEpvaW5Db2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueV8yXzBfTWFwS2V5Sm9pbkNvbHVtbnMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpvaW5UYWJsZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxKb2luVGFibGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5KT0lOX1RBQkxFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luVGFibGVNYXBwaW5nX0pvaW5UYWJsZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnlJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzAyNWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9NYW55SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnMuT3JtWG1sTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuZW1mLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hbnkgVG8gTWFueTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueUltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sTWFueVRvTWFueUltcGwgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxNYW55VG9NYW55Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldEVudGl0eSgpIDxlbT5UYXJnZXQgRW50aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9FTlRJVFlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0RW50aXR5KCkgPGVtPlRhcmdldCBFbnRpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhcmdldEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRFbnRpdHkgPSBUQVJHRVRfRU5USVRZX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRmV0Y2hUeXBlIEZFVENIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZldGNoKCkgPGVtPkZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBmZXRjaCA9IEZFVENIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pblRhYmxlKCkgPGVtPkpvaW4gVGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEpvaW5UYWJsZSBqb2luVGFibGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlKCkgPGVtPkNhc2NhZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDYXNjYWRlVHlwZSBjYXNjYWRlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZEJ5KCkgPGVtPk1hcHBlZCBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9CWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWRCeSgpIDxlbT5NYXBwZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZEJ5ID0gTUFQUEVEX0JZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyQnkoKSA8ZW0+T3JkZXIgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSX0JZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyQnkoKSA8ZW0+T3JkZXIgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgb3JkZXJCeSA9IE9SREVSX0JZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5KCkgPGVtPk1hcCBLZXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1hcEtleSBtYXBLZXk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTWFueVRvTWFueUltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTUFOWV9UT19NQU5ZX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYXJnZXRFbnRpdHkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19UYXJnZXRFbnRpdHkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKQotCXsKLQkJcmV0dXJuIHRhcmdldEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueUltcGwjZ2V0VGFyZ2V0RW50aXR5IDxlbT5UYXJnZXQgRW50aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIG5ld1RhcmdldEVudGl0eSkKLQl7Ci0JCVN0cmluZyBvbGRUYXJnZXRFbnRpdHkgPSB0YXJnZXRFbnRpdHk7Ci0JCXRhcmdldEVudGl0eSA9IG5ld1RhcmdldEVudGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX1RBUkdFVF9FTlRJVFksIG9sZFRhcmdldEVudGl0eSwgdGFyZ2V0RW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iTEFaWSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgI3NldEZldGNoKEZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfRmV0Y2goKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJMQVpZIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkKLQl7Ci0JCXJldHVybiBmZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueUltcGwjZ2V0RmV0Y2ggPGVtPkZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCi0JICogQHNlZSAjZ2V0RmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpCi0JewotCQlGZXRjaFR5cGUgb2xkRmV0Y2ggPSBmZXRjaDsKLQkJZmV0Y2ggPSBuZXdGZXRjaCA9PSBudWxsID8gRkVUQ0hfRURFRkFVTFQgOiBuZXdGZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0ZFVENILCBvbGRGZXRjaCwgZmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcHBlZCBCeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZEJ5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBwZWRCeSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkKLQl7Ci0JCXJldHVybiBtYXBwZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueUltcGwjZ2V0TWFwcGVkQnkgPGVtPk1hcHBlZCBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBwZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBuZXdNYXBwZWRCeSkKLQl7Ci0JCVN0cmluZyBvbGRNYXBwZWRCeSA9IG1hcHBlZEJ5OwotCQltYXBwZWRCeSA9IG5ld01hcHBlZEJ5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fTUFQUEVEX0JZLCBvbGRNYXBwZWRCeSwgbWFwcGVkQnkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE9yZGVyQnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX09yZGVyQnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9yZGVyQnkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpCi0JewotCQlyZXR1cm4gb3JkZXJCeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueUltcGwjZ2V0T3JkZXJCeSA8ZW0+T3JkZXIgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcmRlckJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3JkZXJCeShTdHJpbmcgbmV3T3JkZXJCeSkKLQl7Ci0JCVN0cmluZyBvbGRPcmRlckJ5ID0gb3JkZXJCeTsKLQkJb3JkZXJCeSA9IG5ld09yZGVyQnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19PUkRFUl9CWSwgb2xkT3JkZXJCeSwgb3JkZXJCeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWFwS2V5KE1hcEtleSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBLZXkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hcEtleSBnZXRNYXBLZXkoKQotCXsKLQkJcmV0dXJuIG1hcEtleTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNYXBLZXkoTWFwS2V5IG5ld01hcEtleSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCU1hcEtleSBvbGRNYXBLZXkgPSBtYXBLZXk7Ci0JCW1hcEtleSA9IG5ld01hcEtleTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUF9LRVksIG9sZE1hcEtleSwgbmV3TWFwS2V5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueUltcGwjZ2V0TWFwS2V5IDxlbT5NYXAgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNYXBLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXkoTWFwS2V5IG5ld01hcEtleSkKLQl7Ci0JCWlmIChuZXdNYXBLZXkgIT0gbWFwS2V5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChtYXBLZXkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWFwS2V5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUF9LRVksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld01hcEtleSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNYXBLZXkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fTUFQX0tFWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRNYXBLZXkobmV3TWFwS2V5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19NQVBfS0VZLCBuZXdNYXBLZXksIG5ld01hcEtleSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pblRhYmxlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkKLQl7Ci0JCXJldHVybiBqb2luVGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSBuZXdKb2luVGFibGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxKb2luVGFibGUgb2xkSm9pblRhYmxlID0gam9pblRhYmxlOwotCQlqb2luVGFibGUgPSBuZXdKb2luVGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFLCBvbGRKb2luVGFibGUsIG5ld0pvaW5UYWJsZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnlJbXBsI2dldEpvaW5UYWJsZSA8ZW0+Sm9pbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Sm9pblRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSBuZXdKb2luVGFibGUpCi0JewotCQlpZiAobmV3Sm9pblRhYmxlICE9IGpvaW5UYWJsZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoam9pblRhYmxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWpvaW5UYWJsZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdKb2luVGFibGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Sm9pblRhYmxlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0pPSU5fVEFCTEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Sm9pblRhYmxlKG5ld0pvaW5UYWJsZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRSwgbmV3Sm9pblRhYmxlLCBuZXdKb2luVGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhc2NhZGUoQ2FzY2FkZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2FzY2FkZShDYXNjYWRlVHlwZSBuZXdDYXNjYWRlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJQ2FzY2FkZVR5cGUgb2xkQ2FzY2FkZSA9IGNhc2NhZGU7Ci0JCWNhc2NhZGUgPSBuZXdDYXNjYWRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fQ0FTQ0FERSwgb2xkQ2FzY2FkZSwgbmV3Q2FzY2FkZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnlJbXBsI2dldENhc2NhZGUgPGVtPkNhc2NhZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhc2NhZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIG5ld0Nhc2NhZGUpCi0JewotCQlpZiAobmV3Q2FzY2FkZSAhPSBjYXNjYWRlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjYXNjYWRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNhc2NhZGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fQ0FTQ0FERSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q2FzY2FkZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYXNjYWRlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0NBU0NBREUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2FzY2FkZShuZXdDYXNjYWRlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19DQVNDQURFLCBuZXdDYXNjYWRlLCBuZXdDYXNjYWRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXJldHVybiBiYXNpY1NldEpvaW5UYWJsZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0NBU0NBREU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2FzY2FkZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUF9LRVk6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TWFwS2V5KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJcmV0dXJuIGdldFRhcmdldEVudGl0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEZldGNoKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXJldHVybiBnZXRKb2luVGFibGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0NBU0NBREU6Ci0JCQkJcmV0dXJuIGdldENhc2NhZGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUFBFRF9CWToKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkQnkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX09SREVSX0JZOgotCQkJCXJldHVybiBnZXRPcmRlckJ5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19NQVBfS0VZOgotCQkJCXJldHVybiBnZXRNYXBLZXkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19UQVJHRVRfRU5USVRZOgotCQkJCXNldFRhcmdldEVudGl0eSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19GRVRDSDoKLQkJCQlzZXRGZXRjaCgoRmV0Y2hUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXNldEpvaW5UYWJsZSgoWG1sSm9pblRhYmxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19DQVNDQURFOgotCQkJCXNldENhc2NhZGUoKENhc2NhZGVUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19NQVBQRURfQlk6Ci0JCQkJc2V0TWFwcGVkQnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fT1JERVJfQlk6Ci0JCQkJc2V0T3JkZXJCeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19NQVBfS0VZOgotCQkJCXNldE1hcEtleSgoTWFwS2V5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19UQVJHRVRfRU5USVRZOgotCQkJCXNldFRhcmdldEVudGl0eShUQVJHRVRfRU5USVRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19GRVRDSDoKLQkJCQlzZXRGZXRjaChGRVRDSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRToKLQkJCQlzZXRKb2luVGFibGUoKFhtbEpvaW5UYWJsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19DQVNDQURFOgotCQkJCXNldENhc2NhZGUoKENhc2NhZGVUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUFBFRF9CWToKLQkJCQlzZXRNYXBwZWRCeShNQVBQRURfQllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX09SREVSX0JZOgotCQkJCXNldE9yZGVyQnkoT1JERVJfQllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUF9LRVk6Ci0JCQkJc2V0TWFwS2V5KChNYXBLZXkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJcmV0dXJuIFRBUkdFVF9FTlRJVFlfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldEVudGl0eSAhPSBudWxsIDogIVRBUkdFVF9FTlRJVFlfRURFRkFVTFQuZXF1YWxzKHRhcmdldEVudGl0eSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19GRVRDSDoKLQkJCQlyZXR1cm4gZmV0Y2ggIT0gRkVUQ0hfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXJldHVybiBqb2luVGFibGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0NBU0NBREU6Ci0JCQkJcmV0dXJuIGNhc2NhZGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUFBFRF9CWToKLQkJCQlyZXR1cm4gTUFQUEVEX0JZX0VERUZBVUxUID09IG51bGwgPyBtYXBwZWRCeSAhPSBudWxsIDogIU1BUFBFRF9CWV9FREVGQVVMVC5lcXVhbHMobWFwcGVkQnkpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fT1JERVJfQlk6Ci0JCQkJcmV0dXJuIE9SREVSX0JZX0VERUZBVUxUID09IG51bGwgPyBvcmRlckJ5ICE9IG51bGwgOiAhT1JERVJfQllfRURFRkFVTFQuZXF1YWxzKG9yZGVyQnkpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fTUFQX0tFWToKLQkJCQlyZXR1cm4gbWFwS2V5ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19UQVJHRVRfRU5USVRZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fRkVUQ0g6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0NBU0NBREU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19NQVBQRURfQlk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQUEVEX0JZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX09SREVSX0JZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0JZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUF9LRVk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYW55VG9NYW55LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19UQVJHRVRfRU5USVRZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0ZFVENIOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX0NBU0NBREU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQUEVEX0JZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUFBFRF9CWTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9CWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9JTVBMX19PUkRFUl9CWTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0lNUExfX01BUF9LRVk7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFueVRvTWFueS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFyZ2V0RW50aXR5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YXJnZXRFbnRpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmZXRjaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFwcGVkQnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1hcHBlZEJ5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvcmRlckJ5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvcmRlckJ5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZSgpIHsKLQkJSURPTU5vZGUgbWFwcGVkQnlOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKGdldE5vZGUoKSwgT3JtWG1sTWFwcGVyLk1BUFBFRF9CWSk7Ci0JCXJldHVybiAobWFwcGVkQnlOb2RlID09IG51bGwpID8gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogYnVpbGRUZXh0UmFuZ2UobWFwcGVkQnlOb2RlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9PbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFueVRvT25lLmphdmEKaW5kZXggMTBjMzJhYy4uYTRlZWFhNiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9PbmUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb09uZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksNiArOSwxMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yMyw5ICsyOCw1OCBAQAogICoKICAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hbnlUb09uZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFueVRvT25lIGV4dGVuZHMgWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZworcHVibGljIGNsYXNzIFhtbE1hbnlUb09uZSBleHRlbmRzIEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwogewotfSAvLyBNYW55VG9PbmUKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxNYW55VG9PbmUoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTUFOWV9UT19PTkU7CisJfQorCisJLy8gKioqKioqKioqKioqKioqKiBYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAorCQkJYnVpbGRPcHRpb25hbFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNYXBzSWRUcmFuc2xhdG9yKCksCisJCQlidWlsZElkVHJhbnNsYXRvcigpLAorCQkJYnVpbGRKb2luQ29sdW1uVHJhbnNsYXRvcigpLAorCQkJYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCksCisJCQlidWlsZENhc2NhZGVUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9PbmVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb09uZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OTZjOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb09uZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hbnkgVG8gT25lPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9PbmVJbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE1hbnlUb09uZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxNYW55VG9PbmUKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0RW50aXR5KCkgPGVtPlRhcmdldCBFbnRpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhcmdldEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0VOVElUWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRFbnRpdHkoKSA8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldEVudGl0eSA9IFRBUkdFVF9FTlRJVFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBGZXRjaFR5cGUgRkVUQ0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmV0Y2goKSA8ZW0+RmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGZldGNoID0gRkVUQ0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luVGFibGUoKSA8ZW0+Sm9pbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Sm9pblRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSm9pblRhYmxlIGpvaW5UYWJsZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGUoKSA8ZW0+Q2FzY2FkZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENhc2NhZGVUeXBlIGNhc2NhZGU7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW9uYWwoKSA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gT1BUSU9OQUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW9uYWwoKSA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBvcHRpb25hbCA9IE9QVElPTkFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkNvbHVtbnMoKSA8ZW0+Sm9pbiBDb2x1bW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpvaW5Db2x1bW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gam9pbkNvbHVtbnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTWFueVRvT25lSW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9NQU5ZX1RPX09ORV9JTVBMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhcmdldCBFbnRpdHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFyZ2V0RW50aXR5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfVGFyZ2V0RW50aXR5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkKLQl7Ci0JCXJldHVybiB0YXJnZXRFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZUltcGwjZ2V0VGFyZ2V0RW50aXR5IDxlbT5UYXJnZXQgRW50aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIG5ld1RhcmdldEVudGl0eSkKLQl7Ci0JCVN0cmluZyBvbGRUYXJnZXRFbnRpdHkgPSB0YXJnZXRFbnRpdHk7Ci0JCXRhcmdldEVudGl0eSA9IG5ld1RhcmdldEVudGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fVEFSR0VUX0VOVElUWSwgb2xkVGFyZ2V0RW50aXR5LCB0YXJnZXRFbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJMQVpZIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCi0JICogQHNlZSAjc2V0RmV0Y2goRmV0Y2hUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19GZXRjaCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IkxBWlkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKQotCXsKLQkJcmV0dXJuIGZldGNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmVJbXBsI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgI2dldEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKQotCXsKLQkJRmV0Y2hUeXBlIG9sZEZldGNoID0gZmV0Y2g7Ci0JCWZldGNoID0gbmV3RmV0Y2ggPT0gbnVsbCA/IEZFVENIX0VERUZBVUxUIDogbmV3RmV0Y2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0ZFVENILCBvbGRGZXRjaCwgZmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW9uYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE9wdGlvbmFsKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nX09wdGlvbmFsKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpCi0JewotCQlyZXR1cm4gb3B0aW9uYWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZUltcGwjZ2V0T3B0aW9uYWwgPGVtPk9wdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKQotCXsKLQkJQm9vbGVhbiBvbGRPcHRpb25hbCA9IG9wdGlvbmFsOwotCQlvcHRpb25hbCA9IG5ld09wdGlvbmFsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19PUFRJT05BTCwgb2xkT3B0aW9uYWwsIG9wdGlvbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19Kb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKQotCXsKLQkJaWYgKGpvaW5Db2x1bW5zID09IG51bGwpCi0JCXsKLQkJCWpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fQ09MVU1OUyk7Ci0JCX0KLQkJcmV0dXJuIGpvaW5Db2x1bW5zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pblRhYmxlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkKLQl7Ci0JCXJldHVybiBqb2luVGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSBuZXdKb2luVGFibGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxKb2luVGFibGUgb2xkSm9pblRhYmxlID0gam9pblRhYmxlOwotCQlqb2luVGFibGUgPSBuZXdKb2luVGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fVEFCTEUsIG9sZEpvaW5UYWJsZSwgbmV3Sm9pblRhYmxlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lSW1wbCNnZXRKb2luVGFibGUgPGVtPkpvaW4gVGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgbmV3Sm9pblRhYmxlKQotCXsKLQkJaWYgKG5ld0pvaW5UYWJsZSAhPSBqb2luVGFibGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGpvaW5UYWJsZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClqb2luVGFibGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19KT0lOX1RBQkxFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdKb2luVGFibGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Sm9pblRhYmxlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRKb2luVGFibGUobmV3Sm9pblRhYmxlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fVEFCTEUsIG5ld0pvaW5UYWJsZSwgbmV3Sm9pblRhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlKENhc2NhZGVUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19DYXNjYWRlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYXNjYWRlVHlwZSBnZXRDYXNjYWRlKCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENhc2NhZGUoQ2FzY2FkZVR5cGUgbmV3Q2FzY2FkZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCUNhc2NhZGVUeXBlIG9sZENhc2NhZGUgPSBjYXNjYWRlOwotCQljYXNjYWRlID0gbmV3Q2FzY2FkZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fQ0FTQ0FERSwgb2xkQ2FzY2FkZSwgbmV3Q2FzY2FkZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZUltcGwjZ2V0Q2FzY2FkZSA8ZW0+Q2FzY2FkZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGUoQ2FzY2FkZVR5cGUgbmV3Q2FzY2FkZSkKLQl7Ci0JCWlmIChuZXdDYXNjYWRlICE9IGNhc2NhZGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNhc2NhZGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2FzY2FkZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0NBU0NBREUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Nhc2NhZGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2FzY2FkZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0NBU0NBREUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2FzY2FkZShuZXdDYXNjYWRlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0NBU0NBREUsIG5ld0Nhc2NhZGUsIG5ld0Nhc2NhZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRKb2luVGFibGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0NBU0NBREU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2FzY2FkZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Sm9pbkNvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fVEFSR0VUX0VOVElUWToKLQkJCQlyZXR1cm4gZ2V0VGFyZ2V0RW50aXR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0ZFVENIOgotCQkJCXJldHVybiBnZXRGZXRjaCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXJldHVybiBnZXRKb2luVGFibGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fQ0FTQ0FERToKLQkJCQlyZXR1cm4gZ2V0Q2FzY2FkZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19PUFRJT05BTDoKLQkJCQlyZXR1cm4gZ2V0T3B0aW9uYWwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBnZXRKb2luQ29sdW1ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fVEFSR0VUX0VOVElUWToKLQkJCQlzZXRUYXJnZXRFbnRpdHkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19GRVRDSDoKLQkJCQlzZXRGZXRjaCgoRmV0Y2hUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fVEFCTEU6Ci0JCQkJc2V0Sm9pblRhYmxlKChYbWxKb2luVGFibGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fQ0FTQ0FERToKLQkJCQlzZXRDYXNjYWRlKChDYXNjYWRlVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19PUFRJT05BTDoKLQkJCQlzZXRPcHRpb25hbCgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCWdldEpvaW5Db2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxKb2luQ29sdW1uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19UQVJHRVRfRU5USVRZOgotCQkJCXNldFRhcmdldEVudGl0eShUQVJHRVRfRU5USVRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0ZFVENIOgotCQkJCXNldEZldGNoKEZFVENIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fVEFCTEU6Ci0JCQkJc2V0Sm9pblRhYmxlKChYbWxKb2luVGFibGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19DQVNDQURFOgotCQkJCXNldENhc2NhZGUoKENhc2NhZGVUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fT1BUSU9OQUw6Ci0JCQkJc2V0T3B0aW9uYWwoT1BUSU9OQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19UQVJHRVRfRU5USVRZOgotCQkJCXJldHVybiBUQVJHRVRfRU5USVRZX0VERUZBVUxUID09IG51bGwgPyB0YXJnZXRFbnRpdHkgIT0gbnVsbCA6ICFUQVJHRVRfRU5USVRZX0VERUZBVUxULmVxdWFscyh0YXJnZXRFbnRpdHkpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19GRVRDSDoKLQkJCQlyZXR1cm4gZmV0Y2ggIT0gRkVUQ0hfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fVEFCTEU6Ci0JCQkJcmV0dXJuIGpvaW5UYWJsZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19DQVNDQURFOgotCQkJCXJldHVybiBjYXNjYWRlICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX09QVElPTkFMOgotCQkJCXJldHVybiBPUFRJT05BTF9FREVGQVVMVCA9PSBudWxsID8gb3B0aW9uYWwgIT0gbnVsbCA6ICFPUFRJT05BTF9FREVGQVVMVC5lcXVhbHMob3B0aW9uYWwpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGpvaW5Db2x1bW5zICE9IG51bGwgJiYgIWpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fVEFSR0VUX0VOVElUWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fRkVUQ0g6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19KT0lOX1RBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19DQVNDQURFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fT1BUSU9OQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX09QVElPTkFMOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFueVRvT25lLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX1RBUkdFVF9FTlRJVFk7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9JTVBMX19GRVRDSDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fQ0FTQ0FERTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX09QVElPTkFMOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfSU1QTF9fT1BUSU9OQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0lNUExfX0pPSU5fQ09MVU1OUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYW55VG9PbmUuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRhcmdldEVudGl0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFyZ2V0RW50aXR5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmZXRjaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmV0Y2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9wdGlvbmFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvcHRpb25hbCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBNYW55VG9PbmUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFwS2V5Q2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFwS2V5Q2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTc3MzU1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxNYXBLZXlDbGFzcy5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5Cb29sZWFuVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUNsYXNzXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYXAgS2V5IENsYXNzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcEtleUNsYXNzKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbE1hcEtleUNsYXNzIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sTWFwS2V5Q2xhc3NfMl8wCit7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzTmFtZSgpIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NOYW1lKCkgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWUgPSBDTEFTU19OQU1FX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbE1hcEtleUNsYXNzKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX01BUF9LRVlfQ0xBU1M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRDbGFzc05hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwS2V5Q2xhc3NfMl8wX0NsYXNzTmFtZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKQorCXsKKwkJcmV0dXJuIGNsYXNzTmFtZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwS2V5Q2xhc3MjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIG5ld0NsYXNzTmFtZSkKKwl7CisJCVN0cmluZyBvbGRDbGFzc05hbWUgPSBjbGFzc05hbWU7CisJCWNsYXNzTmFtZSA9IG5ld0NsYXNzTmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFQX0tFWV9DTEFTU19fQ0xBU1NfTkFNRSwgb2xkQ2xhc3NOYW1lLCBjbGFzc05hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQX0tFWV9DTEFTU19fQ0xBU1NfTkFNRToKKwkJCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBfS0VZX0NMQVNTX19DTEFTU19OQU1FOgorCQkJCXNldENsYXNzTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUF9LRVlfQ0xBU1NfX0NMQVNTX05BTUU6CisJCQkJc2V0Q2xhc3NOYW1lKENMQVNTX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUF9LRVlfQ0xBU1NfX0NMQVNTX05BTUU6CisJCQkJcmV0dXJuIENMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzTmFtZSAhPSBudWxsIDogIUNMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGNsYXNzTmFtZSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGNsYXNzTmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoY2xhc3NOYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGRDbGFzc05hbWVUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENsYXNzTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQ0xBU1MsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBLZXlDbGFzc18yXzBfQ2xhc3NOYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxNYXBwZWRCeU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFwcGVkQnlNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmNzBmNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFwcGVkQnlNYXBwaW5nLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPd25hYmxlIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9iPjwvZW0+Jy4KKyAqIDxwPgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkQnlNYXBwaW5nI2dldE1hcHBlZEJ5IDxlbT5NYXBwZWQgQnk8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZEJ5TWFwcGluZygpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sTWFwcGVkQnlNYXBwaW5nIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBCeTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TWFwcGVkQnkoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkQnlNYXBwaW5nX01hcHBlZEJ5KCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRNYXBwZWRCeSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZEJ5TWFwcGluZyNnZXRNYXBwZWRCeSA8ZW0+TWFwcGVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgdmFsdWUpOworCisJVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCk7CQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxNYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hcHBlZFN1cGVyY2xhc3MuamF2YQppbmRleCA0ODNkNDI5Li45ZTU4NjdkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hcHBlZFN1cGVyY2xhc3MuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMiw4ICsxMiwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTMzLDEzICszOCw2IEBACiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycyA8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyA8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQcmVQZXJzaXN0IDxlbT5QcmUgUGVyc2lzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UG9zdFBlcnNpc3QgPGVtPlBvc3QgUGVyc2lzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UHJlUmVtb3ZlIDxlbT5QcmUgUmVtb3ZlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQb3N0UmVtb3ZlIDxlbT5Qb3N0IFJlbW92ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UHJlVXBkYXRlIDxlbT5QcmUgVXBkYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQb3N0VXBkYXRlIDxlbT5Qb3N0IFVwZGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UG9zdExvYWQgPGVtPlBvc3QgTG9hZDwvZW0+fTwvbGk+CiAgKiA8L3VsPgogICogPC9wPgogICoKQEAgLTQ5LDExICs0Nyw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBYbWxNYXBwZWRTdXBlcmNsYXNzIGV4dGVuZHMgQWJzdHJhY3RYbWxUeXBlTWFwcGluZwogewotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFjY2Vzc1R5cGUgQUNDRVNTX0VERUZBVUxUID0gbnVsbDsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkQ2xhc3MoKSA8ZW0+SWQgQ2xhc3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTExNiw3NiArMTA5LDYgQEAKIAlwcm90ZWN0ZWQgRW50aXR5TGlzdGVuZXJzIGVudGl0eUxpc3RlbmVyczsKIAogCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZVBlcnNpc3QoKSA8ZW0+UHJlIFBlcnNpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZVBlcnNpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQcmVQZXJzaXN0IHByZVBlcnNpc3Q7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0UGVyc2lzdCgpIDxlbT5Qb3N0IFBlcnNpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3RQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdFBlcnNpc3QgcG9zdFBlcnNpc3Q7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVSZW1vdmUoKSA8ZW0+UHJlIFJlbW92ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlUmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJlUmVtb3ZlIHByZVJlbW92ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3RSZW1vdmUoKSA8ZW0+UG9zdCBSZW1vdmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3RSZW1vdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb3N0UmVtb3ZlIHBvc3RSZW1vdmU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVVcGRhdGUoKSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlVXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJlVXBkYXRlIHByZVVwZGF0ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3RVcGRhdGUoKSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3RVcGRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb3N0VXBkYXRlIHBvc3RVcGRhdGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0TG9hZCgpIDxlbT5Qb3N0IExvYWQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3RMb2FkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdExvYWQgcG9zdExvYWQ7Ci0KLQkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKQEAgLTE5NCw2ICsxMTcsMTAgQEAKIAl7CiAJCXN1cGVyKCk7CiAJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVk7CisJfQogCiAJcHVibGljIFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKCkgewogCQlyZXR1cm4gKFhtbEVudGl0eU1hcHBpbmdzKSBlQ29udGFpbmVyKCk7CkBAIC00MDEsNDI2ICszMjgsNiBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmUgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlUGVyc2lzdChQcmVQZXJzaXN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19QcmVQZXJzaXN0KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmVQZXJzaXN0IGdldFByZVBlcnNpc3QoKQotCXsKLQkJcmV0dXJuIHByZVBlcnNpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlUGVyc2lzdChQcmVQZXJzaXN0IG5ld1ByZVBlcnNpc3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlQcmVQZXJzaXN0IG9sZFByZVBlcnNpc3QgPSBwcmVQZXJzaXN0OwotCQlwcmVQZXJzaXN0ID0gbmV3UHJlUGVyc2lzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9QRVJTSVNULCBvbGRQcmVQZXJzaXN0LCBuZXdQcmVQZXJzaXN0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQcmVQZXJzaXN0IDxlbT5QcmUgUGVyc2lzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZVBlcnNpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVQZXJzaXN0KFByZVBlcnNpc3QgbmV3UHJlUGVyc2lzdCkKLQl7Ci0JCWlmIChuZXdQcmVQZXJzaXN0ICE9IHByZVBlcnNpc3QpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByZVBlcnNpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJlUGVyc2lzdCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfUEVSU0lTVCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlUGVyc2lzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQcmVQZXJzaXN0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9QRVJTSVNULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByZVBlcnNpc3QobmV3UHJlUGVyc2lzdCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1BFUlNJU1QsIG5ld1ByZVBlcnNpc3QsIG5ld1ByZVBlcnNpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc3RQZXJzaXN0KFBvc3RQZXJzaXN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19Qb3N0UGVyc2lzdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9zdFBlcnNpc3QgZ2V0UG9zdFBlcnNpc3QoKQotCXsKLQkJcmV0dXJuIHBvc3RQZXJzaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc3RQZXJzaXN0KFBvc3RQZXJzaXN0IG5ld1Bvc3RQZXJzaXN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUG9zdFBlcnNpc3Qgb2xkUG9zdFBlcnNpc3QgPSBwb3N0UGVyc2lzdDsKLQkJcG9zdFBlcnNpc3QgPSBuZXdQb3N0UGVyc2lzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUEVSU0lTVCwgb2xkUG9zdFBlcnNpc3QsIG5ld1Bvc3RQZXJzaXN0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQb3N0UGVyc2lzdCA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBvc3RQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdFBlcnNpc3QoUG9zdFBlcnNpc3QgbmV3UG9zdFBlcnNpc3QpCi0JewotCQlpZiAobmV3UG9zdFBlcnNpc3QgIT0gcG9zdFBlcnNpc3QpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3RQZXJzaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBvc3RQZXJzaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUEVSU0lTVCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UG9zdFBlcnNpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UG9zdFBlcnNpc3QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9QRVJTSVNULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBvc3RQZXJzaXN0KG5ld1Bvc3RQZXJzaXN0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1BFUlNJU1QsIG5ld1Bvc3RQZXJzaXN0LCBuZXdQb3N0UGVyc2lzdCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZSBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlUmVtb3ZlKFByZVJlbW92ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfUHJlUmVtb3ZlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmVSZW1vdmUgZ2V0UHJlUmVtb3ZlKCkKLQl7Ci0JCXJldHVybiBwcmVSZW1vdmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlUmVtb3ZlKFByZVJlbW92ZSBuZXdQcmVSZW1vdmUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlQcmVSZW1vdmUgb2xkUHJlUmVtb3ZlID0gcHJlUmVtb3ZlOwotCQlwcmVSZW1vdmUgPSBuZXdQcmVSZW1vdmU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfUkVNT1ZFLCBvbGRQcmVSZW1vdmUsIG5ld1ByZVJlbW92ZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UHJlUmVtb3ZlIDxlbT5QcmUgUmVtb3ZlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVSZW1vdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVSZW1vdmUoUHJlUmVtb3ZlIG5ld1ByZVJlbW92ZSkKLQl7Ci0JCWlmIChuZXdQcmVSZW1vdmUgIT0gcHJlUmVtb3ZlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVSZW1vdmUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJlUmVtb3ZlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9SRU1PVkUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZVJlbW92ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQcmVSZW1vdmUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1JFTU9WRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVSZW1vdmUobmV3UHJlUmVtb3ZlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfUkVNT1ZFLCBuZXdQcmVSZW1vdmUsIG5ld1ByZVJlbW92ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3QgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UG9zdFJlbW92ZShQb3N0UmVtb3ZlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19Qb3N0UmVtb3ZlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3N0UmVtb3ZlIGdldFBvc3RSZW1vdmUoKQotCXsKLQkJcmV0dXJuIHBvc3RSZW1vdmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdFJlbW92ZShQb3N0UmVtb3ZlIG5ld1Bvc3RSZW1vdmUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlQb3N0UmVtb3ZlIG9sZFBvc3RSZW1vdmUgPSBwb3N0UmVtb3ZlOwotCQlwb3N0UmVtb3ZlID0gbmV3UG9zdFJlbW92ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUkVNT1ZFLCBvbGRQb3N0UmVtb3ZlLCBuZXdQb3N0UmVtb3ZlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRQb3N0UmVtb3ZlIDxlbT5Qb3N0IFJlbW92ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBvc3RSZW1vdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0UmVtb3ZlKFBvc3RSZW1vdmUgbmV3UG9zdFJlbW92ZSkKLQl7Ci0JCWlmIChuZXdQb3N0UmVtb3ZlICE9IHBvc3RSZW1vdmUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3RSZW1vdmUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcG9zdFJlbW92ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1JFTU9WRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UG9zdFJlbW92ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQb3N0UmVtb3ZlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUkVNT1ZFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBvc3RSZW1vdmUobmV3UG9zdFJlbW92ZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9SRU1PVkUsIG5ld1Bvc3RSZW1vdmUsIG5ld1Bvc3RSZW1vdmUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmUgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZVVwZGF0ZShQcmVVcGRhdGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX1ByZVVwZGF0ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJlVXBkYXRlIGdldFByZVVwZGF0ZSgpCi0JewotCQlyZXR1cm4gcHJlVXBkYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZVVwZGF0ZShQcmVVcGRhdGUgbmV3UHJlVXBkYXRlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUHJlVXBkYXRlIG9sZFByZVVwZGF0ZSA9IHByZVVwZGF0ZTsKLQkJcHJlVXBkYXRlID0gbmV3UHJlVXBkYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1VQREFURSwgb2xkUHJlVXBkYXRlLCBuZXdQcmVVcGRhdGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlVXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlVXBkYXRlKFByZVVwZGF0ZSBuZXdQcmVVcGRhdGUpCi0JewotCQlpZiAobmV3UHJlVXBkYXRlICE9IHByZVVwZGF0ZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlVXBkYXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByZVVwZGF0ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfVVBEQVRFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVVcGRhdGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJlVXBkYXRlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9VUERBVEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlVXBkYXRlKG5ld1ByZVVwZGF0ZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1VQREFURSwgbmV3UHJlVXBkYXRlLCBuZXdQcmVVcGRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc3RVcGRhdGUoUG9zdFVwZGF0ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdFVwZGF0ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9zdFVwZGF0ZSBnZXRQb3N0VXBkYXRlKCkKLQl7Ci0JCXJldHVybiBwb3N0VXBkYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc3RVcGRhdGUoUG9zdFVwZGF0ZSBuZXdQb3N0VXBkYXRlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUG9zdFVwZGF0ZSBvbGRQb3N0VXBkYXRlID0gcG9zdFVwZGF0ZTsKLQkJcG9zdFVwZGF0ZSA9IG5ld1Bvc3RVcGRhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1VQREFURSwgb2xkUG9zdFVwZGF0ZSwgbmV3UG9zdFVwZGF0ZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UG9zdFVwZGF0ZSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3N0VXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdFVwZGF0ZShQb3N0VXBkYXRlIG5ld1Bvc3RVcGRhdGUpCi0JewotCQlpZiAobmV3UG9zdFVwZGF0ZSAhPSBwb3N0VXBkYXRlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3N0VXBkYXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBvc3RVcGRhdGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9VUERBVEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3RVcGRhdGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UG9zdFVwZGF0ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1VQREFURSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0VXBkYXRlKG5ld1Bvc3RVcGRhdGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfVVBEQVRFLCBuZXdQb3N0VXBkYXRlLCBuZXdQb3N0VXBkYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IExvYWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBMb2FkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQb3N0TG9hZChQb3N0TG9hZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfUG9zdExvYWQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvc3RMb2FkIGdldFBvc3RMb2FkKCkKLQl7Ci0JCXJldHVybiBwb3N0TG9hZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0TG9hZChQb3N0TG9hZCBuZXdQb3N0TG9hZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVBvc3RMb2FkIG9sZFBvc3RMb2FkID0gcG9zdExvYWQ7Ci0JCXBvc3RMb2FkID0gbmV3UG9zdExvYWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX0xPQUQsIG9sZFBvc3RMb2FkLCBuZXdQb3N0TG9hZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UG9zdExvYWQgPGVtPlBvc3QgTG9hZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBMb2FkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3N0TG9hZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3RMb2FkKFBvc3RMb2FkIG5ld1Bvc3RMb2FkKQotCXsKLQkJaWYgKG5ld1Bvc3RMb2FkICE9IHBvc3RMb2FkKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3N0TG9hZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwb3N0TG9hZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX0xPQUQsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3RMb2FkICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bvc3RMb2FkKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfTE9BRCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0TG9hZChuZXdQb3N0TG9hZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9MT0FELCBuZXdQb3N0TG9hZCwgbmV3UG9zdExvYWQpKTsKLQl9Ci0KLQkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKQEAgLTgzNCwyMCArMzQxLDYgQEAKIAkJCQlyZXR1cm4gYmFzaWNTZXRJZENsYXNzKG51bGwsIG1zZ3MpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUzoKIAkJCQlyZXR1cm4gYmFzaWNTZXRFbnRpdHlMaXN0ZW5lcnMobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfUEVSU0lTVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmVQZXJzaXN0KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9QRVJTSVNUOgotCQkJCXJldHVybiBiYXNpY1NldFBvc3RQZXJzaXN0KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1JFTU9WRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmVSZW1vdmUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1JFTU9WRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQb3N0UmVtb3ZlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1VQREFURToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmVVcGRhdGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1VQREFURToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQb3N0VXBkYXRlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9MT0FEOgotCQkJCXJldHVybiBiYXNpY1NldFBvc3RMb2FkKG51bGwsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC04NjUsMjUgKzM1OCwxMSBAQAogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSURfQ0xBU1M6CiAJCQkJcmV0dXJuIGdldElkQ2xhc3MoKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGlzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisJCQkJcmV0dXJuIGlzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGlzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisJCQkJcmV0dXJuIGlzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlM6CiAJCQkJcmV0dXJuIGdldEVudGl0eUxpc3RlbmVycygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIGdldFByZVBlcnNpc3QoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUEVSU0lTVDoKLQkJCQlyZXR1cm4gZ2V0UG9zdFBlcnNpc3QoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9SRU1PVkU6Ci0JCQkJcmV0dXJuIGdldFByZVJlbW92ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9SRU1PVkU6Ci0JCQkJcmV0dXJuIGdldFBvc3RSZW1vdmUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9VUERBVEU6Ci0JCQkJcmV0dXJuIGdldFByZVVwZGF0ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9VUERBVEU6Ci0JCQkJcmV0dXJuIGdldFBvc3RVcGRhdGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfTE9BRDoKLQkJCQlyZXR1cm4gZ2V0UG9zdExvYWQoKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKIAl9CkBAIC05MDIsMzUgKzM4MSwxNCBAQAogCQkJCXNldElkQ2xhc3MoKFhtbElkQ2xhc3MpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlM6Ci0JCQkJc2V0RXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7CisJCQkJc2V0RXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKEJvb2xlYW4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM6Ci0JCQkJc2V0RXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7CisJCQkJc2V0RXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKEJvb2xlYW4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlM6CiAJCQkJc2V0RW50aXR5TGlzdGVuZXJzKChFbnRpdHlMaXN0ZW5lcnMpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9QRVJTSVNUOgotCQkJCXNldFByZVBlcnNpc3QoKFByZVBlcnNpc3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUEVSU0lTVDoKLQkJCQlzZXRQb3N0UGVyc2lzdCgoUG9zdFBlcnNpc3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9SRU1PVkU6Ci0JCQkJc2V0UHJlUmVtb3ZlKChQcmVSZW1vdmUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUkVNT1ZFOgotCQkJCXNldFBvc3RSZW1vdmUoKFBvc3RSZW1vdmUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9VUERBVEU6Ci0JCQkJc2V0UHJlVXBkYXRlKChQcmVVcGRhdGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfVVBEQVRFOgotCQkJCXNldFBvc3RVcGRhdGUoKFBvc3RVcGRhdGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfTE9BRDoKLQkJCQlzZXRQb3N0TG9hZCgoUG9zdExvYWQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKIAkJfQogCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwogCX0KQEAgLTk1NywyNyArNDE1LDYgQEAKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlM6CiAJCQkJc2V0RW50aXR5TGlzdGVuZXJzKChFbnRpdHlMaXN0ZW5lcnMpbnVsbCk7CiAJCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1BFUlNJU1Q6Ci0JCQkJc2V0UHJlUGVyc2lzdCgoUHJlUGVyc2lzdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QT1NUX1BFUlNJU1Q6Ci0JCQkJc2V0UG9zdFBlcnNpc3QoKFBvc3RQZXJzaXN0KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9SRU1PVkU6Ci0JCQkJc2V0UHJlUmVtb3ZlKChQcmVSZW1vdmUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9SRU1PVkU6Ci0JCQkJc2V0UG9zdFJlbW92ZSgoUG9zdFJlbW92ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUkVfVVBEQVRFOgotCQkJCXNldFByZVVwZGF0ZSgoUHJlVXBkYXRlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfVVBEQVRFOgotCQkJCXNldFBvc3RVcGRhdGUoKFBvc3RVcGRhdGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9MT0FEOgotCQkJCXNldFBvc3RMb2FkKChQb3N0TG9hZCludWxsKTsKLQkJCQlyZXR1cm47CiAJCX0KIAkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CiAJfQpAQCAtMTAwMCwyMCArNDM3LDYgQEAKIAkJCQlyZXR1cm4gZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgIT0gRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSU19FREVGQVVMVDsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlM6CiAJCQkJcmV0dXJuIGVudGl0eUxpc3RlbmVycyAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJFX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIHByZVBlcnNpc3QgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfUEVSU0lTVDoKLQkJCQlyZXR1cm4gcG9zdFBlcnNpc3QgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9SRU1PVkU6Ci0JCQkJcmV0dXJuIHByZVJlbW92ZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9SRU1PVkU6Ci0JCQkJcmV0dXJuIHBvc3RSZW1vdmUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSRV9VUERBVEU6Ci0JCQkJcmV0dXJuIHByZVVwZGF0ZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUE9TVF9VUERBVEU6Ci0JCQkJcmV0dXJuIHBvc3RVcGRhdGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BPU1RfTE9BRDoKLQkJCQlyZXR1cm4gcG9zdExvYWQgIT0gbnVsbDsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CiAJfQpAQCAtMTAzNyw0ICs0NjAsNzggQEAKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KIAotfSAvLyBNYXBwZWRTdXBlcmNsYXNzCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGRDbGFzc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAorCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSWRDbGFzc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCisJCQlidWlsZEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCisJCQlQcmVQZXJzaXN0LmJ1aWxkVHJhbnNsYXRvcigpLAorCQkJUG9zdFBlcnNpc3QuYnVpbGRUcmFuc2xhdG9yKCksCisJCQlQcmVSZW1vdmUuYnVpbGRUcmFuc2xhdG9yKCksCisJCQlQb3N0UmVtb3ZlLmJ1aWxkVHJhbnNsYXRvcigpLAorCQkJUHJlVXBkYXRlLmJ1aWxkVHJhbnNsYXRvcigpLAorCQkJUG9zdFVwZGF0ZS5idWlsZFRyYW5zbGF0b3IoKSwKKwkJCVBvc3RMb2FkLmJ1aWxkVHJhbnNsYXRvcigpLAorCQkJQXR0cmlidXRlcy5idWlsZFRyYW5zbGF0b3IoKQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkFDQ0VTUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzSG9sZGVyX0FjY2VzcygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJZENsYXNzVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbElkQ2xhc3MuYnVpbGRUcmFuc2xhdG9yKEpQQS5JRF9DTEFTUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19JZENsYXNzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeGNsdWRlRGVmYXVsdExpc3RlbmVyc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihKUEEuRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlRGVmYXVsdExpc3RlbmVycygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnNUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoSlBBLkVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEVudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBFbnRpdHlMaXN0ZW5lcnMuYnVpbGRUcmFuc2xhdG9yKEpQQS5FTlRJVFlfTElTVEVORVJTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0VudGl0eUxpc3RlbmVycygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJlUGVyc2lzdFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBQcmVQZXJzaXN0LmJ1aWxkVHJhbnNsYXRvcigpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFBvc3RQZXJzaXN0VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFBvc3RQZXJzaXN0LmJ1aWxkVHJhbnNsYXRvcigpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByZVJlbW92ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBQcmVSZW1vdmUuYnVpbGRUcmFuc2xhdG9yKCk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUG9zdFJlbW92ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBQb3N0UmVtb3ZlLmJ1aWxkVHJhbnNsYXRvcigpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcmVVcGRhdGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gUHJlVXBkYXRlLmJ1aWxkVHJhbnNsYXRvcigpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQb3N0VXBkYXRlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFBvc3RVcGRhdGUuYnVpbGRUcmFuc2xhdG9yKCk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUG9zdExvYWRUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gUG9zdExvYWQuYnVpbGRUcmFuc2xhdG9yKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYzI5OTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE1hcHBlZEJ5IDxlbT5NYXBwZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0T3JkZXJCeSA8ZW0+T3JkZXIgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0TWFwS2V5IDxlbT5NYXAgS2V5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBleHRlbmRzIFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE9yZGVyQnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX09yZGVyQnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9yZGVyQnkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRPcmRlckJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE9yZGVyQnkgPGVtPk9yZGVyIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3JkZXJCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3JkZXJCeShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNYXBLZXkoTWFwS2V5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX01hcEtleSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNYXBLZXkgZ2V0TWFwS2V5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE1hcEtleSA8ZW0+TWFwIEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWFwS2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBLZXkoTWFwS2V5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkQnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX01hcHBlZEJ5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYXBwZWRCeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBwZWRCeSA8ZW0+TWFwcGVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgdmFsdWUpOwotCi0JVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCk7Ci19IC8vIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZENvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODhmMTliLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVkIENvbHVtbjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29sdW1uI2dldENvbHVtbkRlZmluaXRpb24gPGVtPkNvbHVtbiBEZWZpbml0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWRDb2x1bW4oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5hbWVkQ29sdW1uIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxOYW1lZENvbHVtbl9Db2x1bW5EZWZpbml0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4jZ2V0Q29sdW1uRGVmaW5pdGlvbiA8ZW0+Q29sdW1uIERlZmluaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbiBEZWZpbml0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb2x1bW5EZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWRDb2x1bW5fTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29sdW1uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBuYW1lIGF0dGlidXRlLiAgSWYgdGhlIG5hbWUgYXR0aWJ1dGUgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICp0YWJsZSBlbGVtZW50LgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCk7Ci0KLX0gLy8gTmFtZWRDb2x1bW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWROYXRpdmVRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKaW5kZXggMTNkZjgyMS4uNTJlZmExNSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTQsMTUgKzE0LDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzLk9ybVhtbE1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmVtZi5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTUwLDYgKzUyLDI2IEBACiBwdWJsaWMgY2xhc3MgWG1sTmFtZWROYXRpdmVRdWVyeSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFF1ZXJ5CiB7CiAJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7CisKKwkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTE2MSw2ICsxODMsNDEgQEAKIAl9CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5XzJfMF9EZXNjcmlwdGlvbigpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKKwl7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKKwl7CisJCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKKwl9CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8cD4KQEAgLTM0OSw2ICs0MDYsOCBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19OQU1FOgogCQkJCXJldHVybiBnZXROYW1lKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUVVFUlk6CkBAIC0zNzQsNiArNDMzLDkgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX05BTUU6CiAJCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CkBAIC00MDQsNiArNDY2LDkgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19OQU1FOgogCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwpAQCAtNDMzLDYgKzQ5OCw4IEBACiAJewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkKIAkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX05BTUU6CiAJCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19RVUVSWToKQEAgLTQ1OCw3ICs1MjUsOSBAQAogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKIAkJcmVzdWx0LmFwcGVuZChuYW1lKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBxdWVyeTogIik7CiAJCXJlc3VsdC5hcHBlbmQocXVlcnkpOwpAQCAtNDcxLDcgKzU0MCw0NyBAQAogCX0KIAkKIAlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIG5hbWVOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKGdldE5vZGUoKSwgT3JtWG1sTWFwcGVyLk5BTUUpOwotCQlyZXR1cm4gKG5hbWVOb2RlID09IG51bGwpID8gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogYnVpbGRUZXh0UmFuZ2UobmFtZU5vZGUpOworCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5OQU1FKTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRSZXN1bHRDbGFzc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUmVzdWx0U2V0TWFwcGluZ1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCisJCQlidWlsZFF1ZXJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRIaW50VHJhbnNsYXRvcigpCisJCX07CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSZXN1bHRDbGFzc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuUkVTVUxUX0NMQVNTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxOYW1lZE5hdGl2ZVF1ZXJ5X1Jlc3VsdENsYXNzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlJFU1VMVF9TRVRfTUFQUElORywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTmFtZWROYXRpdmVRdWVyeV9SZXN1bHRTZXRNYXBwaW5nKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQTJfMC5ERVNDUklQVElPTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5XzJfMF9EZXNjcmlwdGlvbigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUXVlcnlUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlFVRVJZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeV9RdWVyeSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSGludFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxRdWVyeUhpbnQuYnVpbGRUcmFuc2xhdG9yKEpQQS5ISU5ULCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeV9IaW50cygpKTsKIAl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZFF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkUXVlcnkuamF2YQppbmRleCA3NDI5NjZhLi5kODcyOWQ2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkUXVlcnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkUXVlcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xNCwxNSArMTQsMTkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnMuT3JtWG1sTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuZW1mLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuTG9ja01vZGVUeXBlXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxOYW1lZFF1ZXJ5XzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC00MCw5ICs0NCwyOSBAQAogICogQG1vZGVsIGtpbmQ9ImNsYXNzIgogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgWG1sTmFtZWRRdWVyeSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFF1ZXJ5CitwdWJsaWMgY2xhc3MgWG1sTmFtZWRRdWVyeSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFF1ZXJ5LCBYbWxOYW1lZFF1ZXJ5XzJfMAogewogCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOworCisJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC05Myw2ICsxMTcsMjIgQEAKIAlwcm90ZWN0ZWQgRUxpc3Q8WG1sUXVlcnlIaW50PiBoaW50czsKIAogCS8qKgorCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAorCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvY2tNb2RlVHlwZV8yXzAgTE9DS19NT0RFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2tNb2RlKCkgPGVtPkxvY2sgTW9kZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TG9ja01vZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBMb2NrTW9kZVR5cGVfMl8wIGxvY2tNb2RlID0gTE9DS19NT0RFX0VERUZBVUxUOworCisJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCkBAIC0xMTQsNiArMTU0LDQxIEBACiAJfQogCiAJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeV8yXzBfRGVzY3JpcHRpb24oKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCisJeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnkjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pCisJeworCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTkFNRURfUVVFUllfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKKwl9CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8cD4KQEAgLTIwNyw2ICsyODIsNDQgQEAKIAl9CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NrIE1vZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Mb2NrTW9kZVR5cGVfMl8wfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2sgTW9kZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NrIE1vZGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuTG9ja01vZGVUeXBlXzJfMAorCSAqIEBzZWUgI3NldExvY2tNb2RlKExvY2tNb2RlVHlwZV8yXzApCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxOYW1lZFF1ZXJ5XzJfMF9Mb2NrTW9kZSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMb2NrTW9kZVR5cGVfMl8wIGdldExvY2tNb2RlKCkKKwl7CisJCXJldHVybiBsb2NrTW9kZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeSNnZXRMb2NrTW9kZSA8ZW0+TG9jayBNb2RlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NrIE1vZGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuTG9ja01vZGVUeXBlXzJfMAorCSAqIEBzZWUgI2dldExvY2tNb2RlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TG9ja01vZGUoTG9ja01vZGVUeXBlXzJfMCBuZXdMb2NrTW9kZSkKKwl7CisJCUxvY2tNb2RlVHlwZV8yXzAgb2xkTG9ja01vZGUgPSBsb2NrTW9kZTsKKwkJbG9ja01vZGUgPSBuZXdMb2NrTW9kZSA9PSBudWxsID8gTE9DS19NT0RFX0VERUZBVUxUIDogbmV3TG9ja01vZGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19MT0NLX01PREUsIG9sZExvY2tNb2RlLCBsb2NrTW9kZSkpOworCX0KKworCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZApAQCAtMjMyLDEyICszNDUsMTYgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfUVVFUllfX05BTUU6CiAJCQkJcmV0dXJuIGdldE5hbWUoKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfUVVFUllfX1FVRVJZOgogCQkJCXJldHVybiBnZXRRdWVyeSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fSElOVFM6CiAJCQkJcmV0dXJuIGdldEhpbnRzKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19MT0NLX01PREU6CisJCQkJcmV0dXJuIGdldExvY2tNb2RlKCk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CiAJfQpAQCAtMjUzLDYgKzM3MCw5IEBACiAJewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkKIAkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fTkFNRToKIAkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKQEAgLTI2Myw2ICszODMsOSBAQAogCQkJCWdldEhpbnRzKCkuY2xlYXIoKTsKIAkJCQlnZXRIaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUXVlcnlIaW50PiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fTE9DS19NT0RFOgorCQkJCXNldExvY2tNb2RlKChMb2NrTW9kZVR5cGVfMl8wKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CiAJCX0KIAkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKIAl9CkBAIC0yNzcsNiArNDAwLDkgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fTkFNRToKIAkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwogCQkJCXJldHVybjsKQEAgLTI4Niw2ICs0MTIsOSBAQAogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fSElOVFM6CiAJCQkJZ2V0SGludHMoKS5jbGVhcigpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfUVVFUllfX0xPQ0tfTU9ERToKKwkJCQlzZXRMb2NrTW9kZShMT0NLX01PREVfRURFRkFVTFQpOworCQkJCXJldHVybjsKIAkJfQogCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKIAl9CkBAIC0zMDAsMTIgKzQyOSwxNiBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfUVVFUllfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fTkFNRToKIAkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fUVVFUlk6CiAJCQkJcmV0dXJuIFFVRVJZX0VERUZBVUxUID09IG51bGwgPyBxdWVyeSAhPSBudWxsIDogIVFVRVJZX0VERUZBVUxULmVxdWFscyhxdWVyeSk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19ISU5UUzoKIAkJCQlyZXR1cm4gaGludHMgIT0gbnVsbCAmJiAhaGludHMuaXNFbXB0eSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fTE9DS19NT0RFOgorCQkJCXJldHVybiBsb2NrTW9kZSAhPSBMT0NLX01PREVfRURFRkFVTFQ7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwogCX0KQEAgLTMxNiwyMSArNDQ5LDk0IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbE5hbWVkUXVlcnlfMl8wLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fTE9DS19NT0RFOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX05BTUVEX1FVRVJZXzIwX19MT0NLX01PREU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxOYW1lZFF1ZXJ5XzJfMC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX05BTUVEX1FVRVJZXzIwX19MT0NLX01PREU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fTE9DS19NT0RFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAJewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKIAkJcmVzdWx0LmFwcGVuZChuYW1lKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBxdWVyeTogIik7CiAJCXJlc3VsdC5hcHBlbmQocXVlcnkpOworCQlyZXN1bHQuYXBwZW5kKCIsIGxvY2tNb2RlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChsb2NrTW9kZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KIAkKIAlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIG5hbWVOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKGdldE5vZGUoKSwgT3JtWG1sTWFwcGVyLk5BTUUpOwotCQlyZXR1cm4gKG5hbWVOb2RlID09IG51bGwpID8gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogYnVpbGRUZXh0UmFuZ2UobmFtZU5vZGUpOworCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5OQU1FKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCisJCQlidWlsZFF1ZXJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRMb2NrTW9kZVRyYW5zbGF0b3IoKSwKKwkJCVhtbFF1ZXJ5SGludC5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLkhJTlQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5X0hpbnRzKCkpLAorCQl9OworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5X05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLkRFU0NSSVBUSU9OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlfMl8wX0Rlc2NyaXB0aW9uKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRRdWVyeVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuUVVFUlksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5X1F1ZXJ5KCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRMb2NrTW9kZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuTkFNRURfUVVFUllfX0xPQ0tfTU9ERSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkUXVlcnlfMl8wX0xvY2tNb2RlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQppbmRleCBkMzdhNTMwLi43ZTRlMTcyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksNiArOSw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTIzLDkgKzI1LDMwIEBACiAgKgogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGludGVyZmFjZSBYbWxOdWxsQXR0cmlidXRlTWFwcGluZyBleHRlbmRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBYbWxOdWxsQXR0cmlidXRlTWFwcGluZyBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZwogewotfSAvLyBYbWxOdWxsQXR0cmlidXRlTWFwcGluZworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX05VTExfQVRUUklCVVRFX01BUFBJTkc7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb01hbnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9NYW55LmphdmEKaW5kZXggNDUwMmY4Zi4uYzdkN2FhMSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb01hbnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvTWFueS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksNyArOSwyMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwogCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjIsMTkgKzM4LDE0NiBAQAogICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgogICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRKb2luQ29sdW1ucyA8ZW0+Sm9pbiBDb2x1bW5zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+CiAgKgogICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb01hbnkoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE9uZVRvTWFueSBleHRlbmRzIFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZworcHVibGljIGNsYXNzIFhtbE9uZVRvTWFueSBleHRlbmRzIEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIGltcGxlbWVudHMgWG1sSm9pbkNvbHVtbnNNYXBwaW5nLCBYbWxPbmVUb01hbnlfMl8wCiB7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luQ29sdW1ucygpIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Sm9pbkNvbHVtbnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxKb2luQ29sdW1uPiBqb2luQ29sdW1uczsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcnBoYW5SZW1vdmFsKCkgPGVtPk9ycGhhbiBSZW1vdmFsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPcnBoYW5SZW1vdmFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gT1JQSEFOX1JFTU9WQUxfRURFRkFVTFQgPSBudWxsOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9ycGhhblJlbW92YWwoKSA8ZW0+T3JwaGFuIFJlbW92YWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9ycGhhblJlbW92YWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb29sZWFuIG9ycGhhblJlbW92YWwgPSBPUlBIQU5fUkVNT1ZBTF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyQ29sdW1uKCkgPGVtPk9yZGVyIENvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JkZXJDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxPcmRlckNvbHVtbiBvcmRlckNvbHVtbjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUNsYXNzKCkgPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcEtleUNsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sTWFwS2V5Q2xhc3MgbWFwS2V5Q2xhc3M7CisKKwkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUZW1wb3JhbFR5cGUgTUFQX0tFWV9URU1QT1JBTF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlUZW1wb3JhbCgpIDxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlUZW1wb3JhbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSBtYXBLZXlUZW1wb3JhbCA9IE1BUF9LRVlfVEVNUE9SQUxfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbnVtVHlwZSBNQVBfS0VZX0VOVU1FUkFURURfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5RW51bWVyYXRlZCgpIDxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcEtleUVudW1lcmF0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFbnVtVHlwZSBtYXBLZXlFbnVtZXJhdGVkID0gTUFQX0tFWV9FTlVNRVJBVEVEX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkgPGVtPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Q29sdW1uKCkgPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxDb2x1bW4gbWFwS2V5Q29sdW1uOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKSA8ZW0+TWFwIEtleSBKb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxKb2luQ29sdW1uPiBtYXBLZXlKb2luQ29sdW1uczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxPbmVUb01hbnkoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfT05FX1RPX01BTlk7CisJfQorCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KIAkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW59LgpAQCAtNDUsMTAgKzE4OCw3MDkgQEAKIAkgKiA8L3A+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55X0pvaW5Db2x1bW5zKCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5Db2x1bW5zTWFwcGluZ19Kb2luQ29sdW1ucygpCiAJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpOworCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpCisJeworCQlpZiAoam9pbkNvbHVtbnMgPT0gbnVsbCkKKwkJeworCQkJam9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSm9pbkNvbHVtbj4oWG1sSm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fQ09MVU1OUyk7CisJCX0KKwkJcmV0dXJuIGpvaW5Db2x1bW5zOworCX0KIAotfSAvLyBPbmVUb01hbnkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9yZGVyIENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldE9yZGVyQ29sdW1uKFhtbE9yZGVyQ29sdW1uKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMF9PcmRlckNvbHVtbigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sT3JkZXJDb2x1bW4gZ2V0T3JkZXJDb2x1bW4oKQorCXsKKwkJcmV0dXJuIG9yZGVyQ29sdW1uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE9yZGVyQ29sdW1uKFhtbE9yZGVyQ29sdW1uIG5ld09yZGVyQ29sdW1uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sT3JkZXJDb2x1bW4gb2xkT3JkZXJDb2x1bW4gPSBvcmRlckNvbHVtbjsKKwkJb3JkZXJDb2x1bW4gPSBuZXdPcmRlckNvbHVtbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SREVSX0NPTFVNTiwgb2xkT3JkZXJDb2x1bW4sIG5ld09yZGVyQ29sdW1uKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldE9yZGVyQ29sdW1uIDxlbT5PcmRlciBDb2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyIENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0T3JkZXJDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPcmRlckNvbHVtbihYbWxPcmRlckNvbHVtbiBuZXdPcmRlckNvbHVtbikKKwl7CisJCWlmIChuZXdPcmRlckNvbHVtbiAhPSBvcmRlckNvbHVtbikKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAob3JkZXJDb2x1bW4gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpb3JkZXJDb2x1bW4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT1JERVJfQ09MVU1OLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdPcmRlckNvbHVtbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPcmRlckNvbHVtbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PUkRFUl9DT0xVTU4sIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0T3JkZXJDb2x1bW4obmV3T3JkZXJDb2x1bW4sIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SREVSX0NPTFVNTiwgbmV3T3JkZXJDb2x1bW4sIG5ld09yZGVyQ29sdW1uKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENsYXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRNYXBLZXlDbGFzcyhYbWxNYXBLZXlDbGFzcykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzBfTWFwS2V5Q2xhc3MoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbE1hcEtleUNsYXNzIGdldE1hcEtleUNsYXNzKCkKKwl7CisJCXJldHVybiBtYXBLZXlDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNYXBLZXlDbGFzcyhYbWxNYXBLZXlDbGFzcyBuZXdNYXBLZXlDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbE1hcEtleUNsYXNzIG9sZE1hcEtleUNsYXNzID0gbWFwS2V5Q2xhc3M7CisJCW1hcEtleUNsYXNzID0gbmV3TWFwS2V5Q2xhc3M7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTLCBvbGRNYXBLZXlDbGFzcywgbmV3TWFwS2V5Q2xhc3MpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0TWFwS2V5Q2xhc3MgPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE1hcEtleUNsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFwS2V5Q2xhc3MoWG1sTWFwS2V5Q2xhc3MgbmV3TWFwS2V5Q2xhc3MpCisJeworCQlpZiAobmV3TWFwS2V5Q2xhc3MgIT0gbWFwS2V5Q2xhc3MpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKG1hcEtleUNsYXNzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW1hcEtleUNsYXNzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ0xBU1MsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld01hcEtleUNsYXNzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01hcEtleUNsYXNzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ0xBU1MsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0TWFwS2V5Q2xhc3MobmV3TWFwS2V5Q2xhc3MsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ0xBU1MsIG5ld01hcEtleUNsYXNzLCBuZXdNYXBLZXlDbGFzcykpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCisJICogQHNlZSAjc2V0TWFwS2V5VGVtcG9yYWwoVGVtcG9yYWxUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMF9NYXBLZXlUZW1wb3JhbCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0TWFwS2V5VGVtcG9yYWwoKQorCXsKKwkJcmV0dXJuIG1hcEtleVRlbXBvcmFsOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0TWFwS2V5VGVtcG9yYWwgPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQorCSAqIEBzZWUgI2dldE1hcEtleVRlbXBvcmFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFwS2V5VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld01hcEtleVRlbXBvcmFsKQorCXsKKwkJVGVtcG9yYWxUeXBlIG9sZE1hcEtleVRlbXBvcmFsID0gbWFwS2V5VGVtcG9yYWw7CisJCW1hcEtleVRlbXBvcmFsID0gbmV3TWFwS2V5VGVtcG9yYWwgPT0gbnVsbCA/IE1BUF9LRVlfVEVNUE9SQUxfRURFRkFVTFQgOiBuZXdNYXBLZXlUZW1wb3JhbDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfVEVNUE9SQUwsIG9sZE1hcEtleVRlbXBvcmFsLCBtYXBLZXlUZW1wb3JhbCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBFbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQorCSAqIEBzZWUgI3NldE1hcEtleUVudW1lcmF0ZWQoRW51bVR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8wX01hcEtleUVudW1lcmF0ZWQoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRW51bVR5cGUgZ2V0TWFwS2V5RW51bWVyYXRlZCgpCisJeworCQlyZXR1cm4gbWFwS2V5RW51bWVyYXRlZDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldE1hcEtleUVudW1lcmF0ZWQgPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBFbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQorCSAqIEBzZWUgI2dldE1hcEtleUVudW1lcmF0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXBLZXlFbnVtZXJhdGVkKEVudW1UeXBlIG5ld01hcEtleUVudW1lcmF0ZWQpCisJeworCQlFbnVtVHlwZSBvbGRNYXBLZXlFbnVtZXJhdGVkID0gbWFwS2V5RW51bWVyYXRlZDsKKwkJbWFwS2V5RW51bWVyYXRlZCA9IG5ld01hcEtleUVudW1lcmF0ZWQgPT0gbnVsbCA/IE1BUF9LRVlfRU5VTUVSQVRFRF9FREVGQVVMVCA6IG5ld01hcEtleUVudW1lcmF0ZWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0VOVU1FUkFURUQsIG9sZE1hcEtleUVudW1lcmF0ZWQsIG1hcEtleUVudW1lcmF0ZWQpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMF9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKQorCXsKKwkJaWYgKG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9PSBudWxsKQorCQl7CisJCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+KFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJfQorCQlyZXR1cm4gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0TWFwS2V5Q29sdW1uKFhtbENvbHVtbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzBfTWFwS2V5Q29sdW1uKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDb2x1bW4gZ2V0TWFwS2V5Q29sdW1uKCkKKwl7CisJCXJldHVybiBtYXBLZXlDb2x1bW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWFwS2V5Q29sdW1uKFhtbENvbHVtbiBuZXdNYXBLZXlDb2x1bW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxDb2x1bW4gb2xkTWFwS2V5Q29sdW1uID0gbWFwS2V5Q29sdW1uOworCQltYXBLZXlDb2x1bW4gPSBuZXdNYXBLZXlDb2x1bW47CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NPTFVNTiwgb2xkTWFwS2V5Q29sdW1uLCBuZXdNYXBLZXlDb2x1bW4pOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0TWFwS2V5Q29sdW1uIDxlbT5NYXAgS2V5IENvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE1hcEtleUNvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1hcEtleUNvbHVtbihYbWxDb2x1bW4gbmV3TWFwS2V5Q29sdW1uKQorCXsKKwkJaWYgKG5ld01hcEtleUNvbHVtbiAhPSBtYXBLZXlDb2x1bW4pCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKG1hcEtleUNvbHVtbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCltYXBLZXlDb2x1bW4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU4sIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld01hcEtleUNvbHVtbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNYXBLZXlDb2x1bW4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU4sIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0TWFwS2V5Q29sdW1uKG5ld01hcEtleUNvbHVtbiwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU4sIG5ld01hcEtleUNvbHVtbiwgbmV3TWFwS2V5Q29sdW1uKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMF9NYXBLZXlKb2luQ29sdW1ucygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKQorCXsKKwkJaWYgKG1hcEtleUpvaW5Db2x1bW5zID09IG51bGwpCisJCXsKKwkJCW1hcEtleUpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0pPSU5fQ09MVU1OUyk7CisJCX0KKwkJcmV0dXJuIG1hcEtleUpvaW5Db2x1bW5zOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9ycGhhbiBSZW1vdmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT3JwaGFuUmVtb3ZhYmxlMl8wX09ycGhhblJlbW92YWwoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb29sZWFuIGdldE9ycGhhblJlbW92YWwoKQorCXsKKwkJcmV0dXJuIG9ycGhhblJlbW92YWw7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRPcnBoYW5SZW1vdmFsIDxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3JwaGFuIFJlbW92YWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE9ycGhhblJlbW92YWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4gbmV3T3JwaGFuUmVtb3ZhbCkKKwl7CisJCUJvb2xlYW4gb2xkT3JwaGFuUmVtb3ZhbCA9IG9ycGhhblJlbW92YWw7CisJCW9ycGhhblJlbW92YWwgPSBuZXdPcnBoYW5SZW1vdmFsOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT1JQSEFOX1JFTU9WQUwsIG9sZE9ycGhhblJlbW92YWwsIG9ycGhhblJlbW92YWwpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fQ09MVU1OUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEpvaW5Db2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SREVSX0NPTFVNTjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRPcmRlckNvbHVtbihudWxsLCBtc2dzKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ0xBU1M6CisJCQkJcmV0dXJuIGJhc2ljU2V0TWFwS2V5Q2xhc3MobnVsbCwgbXNncyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU46CisJCQkJcmV0dXJuIGJhc2ljU2V0TWFwS2V5Q29sdW1uKG51bGwsIG1zZ3MpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9KT0lOX0NPTFVNTlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNYXBLZXlKb2luQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TOgorCQkJCXJldHVybiBnZXRKb2luQ29sdW1ucygpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT1JQSEFOX1JFTU9WQUw6CisJCQkJcmV0dXJuIGdldE9ycGhhblJlbW92YWwoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SREVSX0NPTFVNTjoKKwkJCQlyZXR1cm4gZ2V0T3JkZXJDb2x1bW4oKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ0xBU1M6CisJCQkJcmV0dXJuIGdldE1hcEtleUNsYXNzKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX1RFTVBPUkFMOgorCQkJCXJldHVybiBnZXRNYXBLZXlUZW1wb3JhbCgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9FTlVNRVJBVEVEOgorCQkJCXJldHVybiBnZXRNYXBLZXlFbnVtZXJhdGVkKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6CisJCQkJcmV0dXJuIGdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU46CisJCQkJcmV0dXJuIGdldE1hcEtleUNvbHVtbigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9KT0lOX0NPTFVNTlM6CisJCQkJcmV0dXJuIGdldE1hcEtleUpvaW5Db2x1bW5zKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TOgorCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKKwkJCQlnZXRKb2luQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSm9pbkNvbHVtbj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SUEhBTl9SRU1PVkFMOgorCQkJCXNldE9ycGhhblJlbW92YWwoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SREVSX0NPTFVNTjoKKwkJCQlzZXRPcmRlckNvbHVtbigoWG1sT3JkZXJDb2x1bW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ0xBU1M6CisJCQkJc2V0TWFwS2V5Q2xhc3MoKFhtbE1hcEtleUNsYXNzKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX1RFTVBPUkFMOgorCQkJCXNldE1hcEtleVRlbXBvcmFsKChUZW1wb3JhbFR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfRU5VTUVSQVRFRDoKKwkJCQlzZXRNYXBLZXlFbnVtZXJhdGVkKChFbnVtVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOgorCQkJCWdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpLmNsZWFyKCk7CisJCQkJZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBdHRyaWJ1dGVPdmVycmlkZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09MVU1OOgorCQkJCXNldE1hcEtleUNvbHVtbigoWG1sQ29sdW1uKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0pPSU5fQ09MVU1OUzoKKwkJCQlnZXRNYXBLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7CisJCQkJZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEpvaW5Db2x1bW4+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19KT0lOX0NPTFVNTlM6CisJCQkJZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SUEhBTl9SRU1PVkFMOgorCQkJCXNldE9ycGhhblJlbW92YWwoT1JQSEFOX1JFTU9WQUxfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SREVSX0NPTFVNTjoKKwkJCQlzZXRPcmRlckNvbHVtbigoWG1sT3JkZXJDb2x1bW4pbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DTEFTUzoKKwkJCQlzZXRNYXBLZXlDbGFzcygoWG1sTWFwS2V5Q2xhc3MpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9URU1QT1JBTDoKKwkJCQlzZXRNYXBLZXlUZW1wb3JhbChNQVBfS0VZX1RFTVBPUkFMX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0VOVU1FUkFURUQ6CisJCQkJc2V0TWFwS2V5RW51bWVyYXRlZChNQVBfS0VZX0VOVU1FUkFURURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUzoKKwkJCQlnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09MVU1OOgorCQkJCXNldE1hcEtleUNvbHVtbigoWG1sQ29sdW1uKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfSk9JTl9DT0xVTU5TOgorCQkJCWdldE1hcEtleUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TOgorCQkJCXJldHVybiBqb2luQ29sdW1ucyAhPSBudWxsICYmICFqb2luQ29sdW1ucy5pc0VtcHR5KCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PUlBIQU5fUkVNT1ZBTDoKKwkJCQlyZXR1cm4gT1JQSEFOX1JFTU9WQUxfRURFRkFVTFQgPT0gbnVsbCA/IG9ycGhhblJlbW92YWwgIT0gbnVsbCA6ICFPUlBIQU5fUkVNT1ZBTF9FREVGQVVMVC5lcXVhbHMob3JwaGFuUmVtb3ZhbCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PUkRFUl9DT0xVTU46CisJCQkJcmV0dXJuIG9yZGVyQ29sdW1uICE9IG51bGw7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTOgorCQkJCXJldHVybiBtYXBLZXlDbGFzcyAhPSBudWxsOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9URU1QT1JBTDoKKwkJCQlyZXR1cm4gbWFwS2V5VGVtcG9yYWwgIT0gTUFQX0tFWV9URU1QT1JBTF9FREVGQVVMVDsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfRU5VTUVSQVRFRDoKKwkJCQlyZXR1cm4gbWFwS2V5RW51bWVyYXRlZCAhPSBNQVBfS0VZX0VOVU1FUkFURURfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6CisJCQkJcmV0dXJuIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyAhPSBudWxsICYmICFtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaXNFbXB0eSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU46CisJCQkJcmV0dXJuIG1hcEtleUNvbHVtbiAhPSBudWxsOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9KT0lOX0NPTFVNTlM6CisJCQkJcmV0dXJuIG1hcEtleUpvaW5Db2x1bW5zICE9IG51bGwgJiYgIW1hcEtleUpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkNvbHVtbnNNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5TX01BUFBJTkdfX0pPSU5fQ09MVU1OUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPcnBoYW5SZW1vdmFibGUyXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PUlBIQU5fUkVNT1ZBTDogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9PUlBIQU5fUkVNT1ZBQkxFMl8wX19PUlBIQU5fUkVNT1ZBTDsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPbmVUb01hbnlfMl8wLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT1JERVJfQ09MVU1OOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX09ORV9UT19NQU5ZXzIwX19PUkRFUl9DT0xVTU47CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DTEFTUzogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9DTEFTUzsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX1RFTVBPUkFMOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX09ORV9UT19NQU5ZXzIwX19NQVBfS0VZX1RFTVBPUkFMOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfRU5VTUVSQVRFRDogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9FTlVNRVJBVEVEOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09MVU1OOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX09ORV9UT19NQU5ZXzIwX19NQVBfS0VZX0NPTFVNTjsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9KT0lOX0NPTFVNTlM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luQ29sdW1uc01hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fQ09MVU1OU19NQVBQSU5HX19KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbE9ycGhhblJlbW92YWJsZTJfMC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX09SUEhBTl9SRU1PVkFCTEUyXzBfX09SUEhBTl9SRU1PVkFMOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SUEhBTl9SRU1PVkFMOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvTWFueV8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV8yMF9fT1JERVJfQ09MVU1OOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SREVSX0NPTFVNTjsKKwkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9DTEFTUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX09ORV9UT19NQU5ZXzIwX19NQVBfS0VZX1RFTVBPUkFMOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfVEVNUE9SQUw7CisJCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfT05FX1RPX01BTllfMjBfX01BUF9LRVlfRU5VTUVSQVRFRDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0VOVU1FUkFURUQ7CisJCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfT05FX1RPX01BTllfMjBfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM7CisJCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfT05FX1RPX01BTllfMjBfX01BUF9LRVlfQ09MVU1OOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09MVU1OOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX09ORV9UT19NQU5ZXzIwX19NQVBfS0VZX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0pPSU5fQ09MVU1OUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG9ycGhhblJlbW92YWw6ICIpOworCQlyZXN1bHQuYXBwZW5kKG9ycGhhblJlbW92YWwpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1hcEtleVRlbXBvcmFsOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXBLZXlUZW1wb3JhbCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbWFwS2V5RW51bWVyYXRlZDogIik7CisJCXJlc3VsdC5hcHBlbmQobWFwS2V5RW51bWVyYXRlZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcHBlZEJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRPcnBoYW5SZW1vdmFsVHJhbnNsYXRvcigpLAorCQkJYnVpbGRPcmRlckJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRPcmRlckNvbHVtblRyYW5zbGF0b3IoKSwJCQorCQkJYnVpbGRNYXBLZXlUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcEtleUNsYXNzVHJhbnNsYXRvcigpLAkJCisJCQlidWlsZE1hcEtleVRlbXBvcmFsVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNYXBLZXlFbnVtZXJhdGVkVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSwJCQorCQkJYnVpbGRNYXBLZXlDb2x1bW5UcmFuc2xhdG9yKCksCQkKKwkJCWJ1aWxkTWFwS2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwJCQorCQkJYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCksCisJCQlidWlsZEpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCisJCQlidWlsZENhc2NhZGVUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwcGVkQnlUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk1BUFBFRF9CWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkQnlNYXBwaW5nX01hcHBlZEJ5KCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9ycGhhblJlbW92YWxUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLk9SUEhBTl9SRU1PVkFMLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3JwaGFuUmVtb3ZhYmxlMl8wX09ycGhhblJlbW92YWwoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT3JkZXJDb2x1bW5UcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sT3JkZXJDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5PUkRFUl9DT0xVTU4sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8wX09yZGVyQ29sdW1uKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlUZW1wb3JhbFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuTUFQX0tFWV9URU1QT1JBTCwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueV8yXzBfTWFwS2V5VGVtcG9yYWwoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcEtleUVudW1lcmF0ZWRUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfRU5VTUVSQVRFRCwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueV8yXzBfTWFwS2V5RW51bWVyYXRlZCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5Q2xhc3NUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sTWFwS2V5Q2xhc3MuYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0NMQVNTLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55XzJfMF9NYXBLZXlDbGFzcygpKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxBdHRyaWJ1dGVPdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55XzJfMF9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcEtleUNvbHVtblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0NPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueV8yXzBfTWFwS2V5Q29sdW1uKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlKb2luQ29sdW1uVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbEpvaW5Db2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55XzJfMF9NYXBLZXlKb2luQ29sdW1ucygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pblRhYmxlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbEpvaW5UYWJsZS5idWlsZFRyYW5zbGF0b3IoSlBBLkpPSU5fVEFCTEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZU1hcHBpbmdfSm9pblRhYmxlKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRKb2luQ29sdW1uVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbEpvaW5Db2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQS5KT0lOX0NPTFVNTiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pbkNvbHVtbnNNYXBwaW5nX0pvaW5Db2x1bW5zKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9NYW55SW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb01hbnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzJkNTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb01hbnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9ycy5Pcm1YbWxNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5lbWYuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T25lIFRvIE1hbnk8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueUltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sT25lVG9NYW55SW1wbCBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbE9uZVRvTWFueQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRFbnRpdHkoKSA8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfRU5USVRZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldEVudGl0eSgpIDxlbT5UYXJnZXQgRW50aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0RW50aXR5ID0gVEFSR0VUX0VOVElUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEZldGNoVHlwZSBGRVRDSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGZXRjaCgpIDxlbT5GZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZXRjaFR5cGUgZmV0Y2ggPSBGRVRDSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpvaW5UYWJsZSgpIDxlbT5Kb2luIFRhYmxlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKb2luVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKb2luVGFibGUgam9pblRhYmxlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZSgpIDxlbT5DYXNjYWRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXNjYWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FzY2FkZVR5cGUgY2FzY2FkZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWRCeSgpIDxlbT5NYXBwZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfQllfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkQnkoKSA8ZW0+TWFwcGVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWRCeSA9IE1BUFBFRF9CWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmRlckJ5KCkgPGVtPk9yZGVyIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcmRlckJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUl9CWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmRlckJ5KCkgPGVtPk9yZGVyIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcmRlckJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG9yZGVyQnkgPSBPUkRFUl9CWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleSgpIDxlbT5NYXAgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNYXBLZXkgbWFwS2V5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkNvbHVtbnMoKSA8ZW0+Sm9pbiBDb2x1bW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpvaW5Db2x1bW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gam9pbkNvbHVtbnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT25lVG9NYW55SW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9PTkVfVE9fTUFOWV9JTVBMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhcmdldCBFbnRpdHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFyZ2V0RW50aXR5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfVGFyZ2V0RW50aXR5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkKLQl7Ci0JCXJldHVybiB0YXJnZXRFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueUltcGwjZ2V0VGFyZ2V0RW50aXR5IDxlbT5UYXJnZXQgRW50aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIG5ld1RhcmdldEVudGl0eSkKLQl7Ci0JCVN0cmluZyBvbGRUYXJnZXRFbnRpdHkgPSB0YXJnZXRFbnRpdHk7Ci0JCXRhcmdldEVudGl0eSA9IG5ld1RhcmdldEVudGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fVEFSR0VUX0VOVElUWSwgb2xkVGFyZ2V0RW50aXR5LCB0YXJnZXRFbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJMQVpZIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCi0JICogQHNlZSAjc2V0RmV0Y2goRmV0Y2hUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19GZXRjaCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IkxBWlkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKQotCXsKLQkJcmV0dXJuIGZldGNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnlJbXBsI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgI2dldEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKQotCXsKLQkJRmV0Y2hUeXBlIG9sZEZldGNoID0gZmV0Y2g7Ci0JCWZldGNoID0gbmV3RmV0Y2ggPT0gbnVsbCA/IEZFVENIX0VERUZBVUxUIDogbmV3RmV0Y2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0ZFVENILCBvbGRGZXRjaCwgZmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcHBlZCBCeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZEJ5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19NYXBwZWRCeSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkKLQl7Ci0JCXJldHVybiBtYXBwZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55SW1wbCNnZXRNYXBwZWRCeSA8ZW0+TWFwcGVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG5ld01hcHBlZEJ5KQotCXsKLQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JCW1hcHBlZEJ5ID0gbmV3TWFwcGVkQnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX01BUFBFRF9CWSwgb2xkTWFwcGVkQnksIG1hcHBlZEJ5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9yZGVyIEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPcmRlckJ5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ19PcmRlckJ5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5PcmRlckJ5IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9yZGVyQnkoKQotCXsKLQkJcmV0dXJuIG9yZGVyQnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueUltcGwjZ2V0T3JkZXJCeSA8ZW0+T3JkZXIgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcmRlckJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3JkZXJCeShTdHJpbmcgbmV3T3JkZXJCeSkKLQl7Ci0JCVN0cmluZyBvbGRPcmRlckJ5ID0gb3JkZXJCeTsKLQkJb3JkZXJCeSA9IG5ld09yZGVyQnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX09SREVSX0JZLCBvbGRPcmRlckJ5LCBvcmRlckJ5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNYXBLZXkoTWFwS2V5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX01hcEtleSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFwS2V5IGdldE1hcEtleSgpCi0JewotCQlyZXR1cm4gbWFwS2V5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE1hcEtleShNYXBLZXkgbmV3TWFwS2V5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJTWFwS2V5IG9sZE1hcEtleSA9IG1hcEtleTsKLQkJbWFwS2V5ID0gbmV3TWFwS2V5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19NQVBfS0VZLCBvbGRNYXBLZXksIG5ld01hcEtleSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueUltcGwjZ2V0TWFwS2V5IDxlbT5NYXAgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNYXBLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXkoTWFwS2V5IG5ld01hcEtleSkKLQl7Ci0JCWlmIChuZXdNYXBLZXkgIT0gbWFwS2V5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChtYXBLZXkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWFwS2V5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fTUFQX0tFWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TWFwS2V5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01hcEtleSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX01BUF9LRVksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TWFwS2V5KG5ld01hcEtleSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19NQVBfS0VZLCBuZXdNYXBLZXksIG5ld01hcEtleSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfSm9pblRhYmxlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkKLQl7Ci0JCXJldHVybiBqb2luVGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSBuZXdKb2luVGFibGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxKb2luVGFibGUgb2xkSm9pblRhYmxlID0gam9pblRhYmxlOwotCQlqb2luVGFibGUgPSBuZXdKb2luVGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fVEFCTEUsIG9sZEpvaW5UYWJsZSwgbmV3Sm9pblRhYmxlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55SW1wbCNnZXRKb2luVGFibGUgPGVtPkpvaW4gVGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgbmV3Sm9pblRhYmxlKQotCXsKLQkJaWYgKG5ld0pvaW5UYWJsZSAhPSBqb2luVGFibGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGpvaW5UYWJsZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClqb2luVGFibGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19KT0lOX1RBQkxFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdKb2luVGFibGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Sm9pblRhYmxlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRKb2luVGFibGUobmV3Sm9pblRhYmxlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fVEFCTEUsIG5ld0pvaW5UYWJsZSwgbmV3Sm9pblRhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55X0pvaW5Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpCi0JewotCQlpZiAoam9pbkNvbHVtbnMgPT0gbnVsbCkKLQkJewotCQkJam9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSm9pbkNvbHVtbj4oWG1sSm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fSk9JTl9DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gam9pbkNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlKENhc2NhZGVUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19DYXNjYWRlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYXNjYWRlVHlwZSBnZXRDYXNjYWRlKCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENhc2NhZGUoQ2FzY2FkZVR5cGUgbmV3Q2FzY2FkZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCUNhc2NhZGVUeXBlIG9sZENhc2NhZGUgPSBjYXNjYWRlOwotCQljYXNjYWRlID0gbmV3Q2FzY2FkZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fQ0FTQ0FERSwgb2xkQ2FzY2FkZSwgbmV3Q2FzY2FkZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueUltcGwjZ2V0Q2FzY2FkZSA8ZW0+Q2FzY2FkZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGUoQ2FzY2FkZVR5cGUgbmV3Q2FzY2FkZSkKLQl7Ci0JCWlmIChuZXdDYXNjYWRlICE9IGNhc2NhZGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNhc2NhZGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2FzY2FkZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0NBU0NBREUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Nhc2NhZGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2FzY2FkZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0NBU0NBREUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2FzY2FkZShuZXdDYXNjYWRlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0NBU0NBREUsIG5ld0Nhc2NhZGUsIG5ld0Nhc2NhZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRKb2luVGFibGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0NBU0NBREU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2FzY2FkZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fTUFQX0tFWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRNYXBLZXkobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEpvaW5Db2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJcmV0dXJuIGdldFRhcmdldEVudGl0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19GRVRDSDoKLQkJCQlyZXR1cm4gZ2V0RmV0Y2goKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRToKLQkJCQlyZXR1cm4gZ2V0Sm9pblRhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0NBU0NBREU6Ci0JCQkJcmV0dXJuIGdldENhc2NhZGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fTUFQUEVEX0JZOgotCQkJCXJldHVybiBnZXRNYXBwZWRCeSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19PUkRFUl9CWToKLQkJCQlyZXR1cm4gZ2V0T3JkZXJCeSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19NQVBfS0VZOgotCQkJCXJldHVybiBnZXRNYXBLZXkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBnZXRKb2luQ29sdW1ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fVEFSR0VUX0VOVElUWToKLQkJCQlzZXRUYXJnZXRFbnRpdHkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19GRVRDSDoKLQkJCQlzZXRGZXRjaCgoRmV0Y2hUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fVEFCTEU6Ci0JCQkJc2V0Sm9pblRhYmxlKChYbWxKb2luVGFibGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fQ0FTQ0FERToKLQkJCQlzZXRDYXNjYWRlKChDYXNjYWRlVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19NQVBQRURfQlk6Ci0JCQkJc2V0TWFwcGVkQnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19PUkRFUl9CWToKLQkJCQlzZXRPcmRlckJ5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fTUFQX0tFWToKLQkJCQlzZXRNYXBLZXkoKE1hcEtleSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCWdldEpvaW5Db2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxKb2luQ29sdW1uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19UQVJHRVRfRU5USVRZOgotCQkJCXNldFRhcmdldEVudGl0eShUQVJHRVRfRU5USVRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0ZFVENIOgotCQkJCXNldEZldGNoKEZFVENIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fVEFCTEU6Ci0JCQkJc2V0Sm9pblRhYmxlKChYbWxKb2luVGFibGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19DQVNDQURFOgotCQkJCXNldENhc2NhZGUoKENhc2NhZGVUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fTUFQUEVEX0JZOgotCQkJCXNldE1hcHBlZEJ5KE1BUFBFRF9CWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19PUkRFUl9CWToKLQkJCQlzZXRPcmRlckJ5KE9SREVSX0JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX01BUF9LRVk6Ci0JCQkJc2V0TWFwS2V5KChNYXBLZXkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJcmV0dXJuIFRBUkdFVF9FTlRJVFlfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldEVudGl0eSAhPSBudWxsIDogIVRBUkdFVF9FTlRJVFlfRURFRkFVTFQuZXF1YWxzKHRhcmdldEVudGl0eSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0ZFVENIOgotCQkJCXJldHVybiBmZXRjaCAhPSBGRVRDSF9FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRToKLQkJCQlyZXR1cm4gam9pblRhYmxlICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0NBU0NBREU6Ci0JCQkJcmV0dXJuIGNhc2NhZGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fTUFQUEVEX0JZOgotCQkJCXJldHVybiBNQVBQRURfQllfRURFRkFVTFQgPT0gbnVsbCA/IG1hcHBlZEJ5ICE9IG51bGwgOiAhTUFQUEVEX0JZX0VERUZBVUxULmVxdWFscyhtYXBwZWRCeSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX09SREVSX0JZOgotCQkJCXJldHVybiBPUkRFUl9CWV9FREVGQVVMVCA9PSBudWxsID8gb3JkZXJCeSAhPSBudWxsIDogIU9SREVSX0JZX0VERUZBVUxULmVxdWFscyhvcmRlckJ5KTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fTUFQX0tFWToKLQkJCQlyZXR1cm4gbWFwS2V5ICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gam9pbkNvbHVtbnMgIT0gbnVsbCAmJiAham9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19UQVJHRVRfRU5USVRZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19GRVRDSDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0NBU0NBREU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX01BUFBFRF9CWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlk7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19PUkRFUl9CWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9CWTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX01BUF9LRVk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPbmVUb01hbnkuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19KT0lOX0NPTFVNTlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0lNUExfX1RBUkdFVF9FTlRJVFk7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19GRVRDSDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fSk9JTl9UQUJMRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fQ0FTQ0FERTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19NQVBQRURfQlk7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQlk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19PUkRFUl9CWTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfSU1QTF9fTUFQX0tFWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPbmVUb01hbnkuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9JTVBMX19KT0lOX0NPTFVNTlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0YXJnZXRFbnRpdHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRhcmdldEVudGl0eSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmV0Y2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZldGNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWRCeTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWFwcGVkQnkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9yZGVyQnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG9yZGVyQnkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZSgpIHsKLQkJSURPTU5vZGUgbWFwcGVkQnlOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKGdldE5vZGUoKSwgT3JtWG1sTWFwcGVyLk1BUFBFRF9CWSk7Ci0JCXJldHVybiAobWFwcGVkQnlOb2RlID09IG51bGwpID8gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogYnVpbGRUZXh0UmFuZ2UobWFwcGVkQnlOb2RlKTsKLQl9Ci19IC8vIE9uZVRvTWFueQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb09uZS5qYXZhCmluZGV4IGRlMmFjMGQuLjUyYzk4OTIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9PbmUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvT25lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw4ICs5LDI0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb09uZV8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JwaGFuUmVtb3ZhYmxlMl8wOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTI2LDE3ICs0Miw4NCBAQAogICogPHA+CiAgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CiAgKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldE1hcHBlZEJ5IDxlbT5NYXBwZWQgQnk8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+fTwvbGk+CiAgKiA8L3VsPgogICogPC9wPgogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9PbmUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE9uZVRvT25lIGV4dGVuZHMgWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZworcHVibGljIGNsYXNzIFhtbE9uZVRvT25lIGV4dGVuZHMgQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIGltcGxlbWVudHMgWG1sTWFwcGVkQnlNYXBwaW5nLCBYbWxPbmVUb09uZV8yXzAKIHsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWRCeSgpIDxlbT5NYXBwZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfQllfRURFRkFVTFQgPSBudWxsOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZEJ5KCkgPGVtPk1hcHBlZCBCeTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFwcGVkQnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkQnkgPSBNQVBQRURfQllfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9ycGhhblJlbW92YWwoKSA8ZW0+T3JwaGFuIFJlbW92YWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9ycGhhblJlbW92YWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBPUlBIQU5fUkVNT1ZBTF9FREVGQVVMVCA9IG51bGw7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JwaGFuUmVtb3ZhbCgpIDxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T3JwaGFuUmVtb3ZhbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJvb2xlYW4gb3JwaGFuUmVtb3ZhbCA9IE9SUEhBTl9SRU1PVkFMX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByaW1hcnlLZXlKb2luQ29sdW1ucygpIDxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1uczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxPbmVUb09uZSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9PTkVfVE9fT05FOworCX0KKwogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC00NywxMSArMTMwLDE0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRNYXBwZWRCeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZV9NYXBwZWRCeSgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRCeU1hcHBpbmdfTWFwcGVkQnkoKQogCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JU3RyaW5nIGdldE1hcHBlZEJ5KCk7CisJcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpCisJeworCQlyZXR1cm4gbWFwcGVkQnk7CisJfQogCiAJLyoqCiAJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldE1hcHBlZEJ5IDxlbT5NYXBwZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTYxLDcgKzE0Nyw0OCBAQAogCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0Jdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgdmFsdWUpOworCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBuZXdNYXBwZWRCeSkKKwl7CisJCVN0cmluZyBvbGRNYXBwZWRCeSA9IG1hcHBlZEJ5OworCQltYXBwZWRCeSA9IG5ld01hcHBlZEJ5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19NQVBQRURfQlksIG9sZE1hcHBlZEJ5LCBtYXBwZWRCeSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9ycGhhbiBSZW1vdmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT3JwaGFuUmVtb3ZhYmxlMl8wX09ycGhhblJlbW92YWwoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb29sZWFuIGdldE9ycGhhblJlbW92YWwoKQorCXsKKwkJcmV0dXJuIG9ycGhhblJlbW92YWw7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldE9ycGhhblJlbW92YWwgPGVtPk9ycGhhbiBSZW1vdmFsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0T3JwaGFuUmVtb3ZhbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE9ycGhhblJlbW92YWwoQm9vbGVhbiBuZXdPcnBoYW5SZW1vdmFsKQorCXsKKwkJQm9vbGVhbiBvbGRPcnBoYW5SZW1vdmFsID0gb3JwaGFuUmVtb3ZhbDsKKwkJb3JwaGFuUmVtb3ZhbCA9IG5ld09ycGhhblJlbW92YWw7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX09SUEhBTl9SRU1PVkFMLCBvbGRPcnBoYW5SZW1vdmFsLCBvcnBoYW5SZW1vdmFsKSk7CisJfQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTc3LDggKzIwNCwyNTQgQEAKIAkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkKLQlUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKTsKKwlwdWJsaWMgRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpCisJeworCQlpZiAocHJpbWFyeUtleUpvaW5Db2x1bW5zID09IG51bGwpCisJCXsKKwkJCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7CisJCX0KKwkJcmV0dXJuIHByaW1hcnlLZXlKb2luQ29sdW1uczsKKwl9CiAKLX0gLy8gT25lVG9PbmUKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWToKKwkJCQlyZXR1cm4gZ2V0TWFwcGVkQnkoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fT1JQSEFOX1JFTU9WQUw6CisJCQkJcmV0dXJuIGdldE9ycGhhblJlbW92YWwoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgorCQkJCXJldHVybiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWToKKwkJCQlzZXRNYXBwZWRCeSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX09SUEhBTl9SRU1PVkFMOgorCQkJCXNldE9ycGhhblJlbW92YWwoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgorCQkJCWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7CisJCQkJZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fTUFQUEVEX0JZOgorCQkJCXNldE1hcHBlZEJ5KE1BUFBFRF9CWV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19PUlBIQU5fUkVNT1ZBTDoKKwkJCQlzZXRPcnBoYW5SZW1vdmFsKE9SUEhBTl9SRU1PVkFMX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKKwkJCQlnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWToKKwkJCQlyZXR1cm4gTUFQUEVEX0JZX0VERUZBVUxUID09IG51bGwgPyBtYXBwZWRCeSAhPSBudWxsIDogIU1BUFBFRF9CWV9FREVGQVVMVC5lcXVhbHMobWFwcGVkQnkpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19PUlBIQU5fUkVNT1ZBTDoKKwkJCQlyZXR1cm4gT1JQSEFOX1JFTU9WQUxfRURFRkFVTFQgPT0gbnVsbCA/IG9ycGhhblJlbW92YWwgIT0gbnVsbCA6ICFPUlBIQU5fUkVNT1ZBTF9FREVGQVVMVC5lcXVhbHMob3JwaGFuUmVtb3ZhbCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKKwkJCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW5zICE9IG51bGwgJiYgIXByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcHBlZEJ5TWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fTUFQUEVEX0JZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfTUFQUEVEX0JZX01BUFBJTkdfX01BUFBFRF9CWTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPcnBoYW5SZW1vdmFibGUyXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX09SUEhBTl9SRU1PVkFMOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX09SUEhBTl9SRU1PVkFCTEUyXzBfX09SUEhBTl9SRU1PVkFMOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvT25lXzJfMC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwcGVkQnlNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfQllfTUFQUElOR19fTUFQUEVEX0JZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fTUFQUEVEX0JZOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbE9ycGhhblJlbW92YWJsZTJfMC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX09SUEhBTl9SRU1PVkFCTEUyXzBfX09SUEhBTl9SRU1PVkFMOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fT1JQSEFOX1JFTU9WQUw7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sT25lVG9PbmVfMl8wLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChtYXBwZWRCeTogIik7CisJCXJlc3VsdC5hcHBlbmQobWFwcGVkQnkpOworCQlyZXN1bHQuYXBwZW5kKCIsIG9ycGhhblJlbW92YWw6ICIpOworCQlyZXN1bHQuYXBwZW5kKG9ycGhhblJlbW92YWwpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uIHN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuTUFQUEVEX0JZKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAorCQkJYnVpbGRPcHRpb25hbFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNYXBwZWRCeVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkT3JwaGFuUmVtb3ZhbFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTWFwc0lkVHJhbnNsYXRvcigpLAorCQkJYnVpbGRJZFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCisJCQlidWlsZEpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCisJCQlidWlsZEpvaW5UYWJsZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ2FzY2FkZVRyYW5zbGF0b3IoKQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBwZWRCeVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTUFQUEVEX0JZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRCeU1hcHBpbmdfTWFwcGVkQnkoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT3JwaGFuUmVtb3ZhbFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuT1JQSEFOX1JFTU9WQUwsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPcnBoYW5SZW1vdmFibGUyXzBfT3JwaGFuUmVtb3ZhbCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPbmVUb09uZV9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb09uZUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9PbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYzAzNWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb09uZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzLk9ybVhtbE1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmVtZi5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PbmUgVG8gT25lPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZUltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sT25lVG9PbmVJbXBsIGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgWG1sT25lVG9PbmUKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0RW50aXR5KCkgPGVtPlRhcmdldCBFbnRpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhcmdldEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0VOVElUWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRFbnRpdHkoKSA8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldEVudGl0eSA9IFRBUkdFVF9FTlRJVFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBGZXRjaFR5cGUgRkVUQ0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmV0Y2goKSA8ZW0+RmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGZldGNoID0gRkVUQ0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luVGFibGUoKSA8ZW0+Sm9pbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Sm9pblRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSm9pblRhYmxlIGpvaW5UYWJsZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGUoKSA8ZW0+Q2FzY2FkZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENhc2NhZGVUeXBlIGNhc2NhZGU7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW9uYWwoKSA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gT1BUSU9OQUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW9uYWwoKSA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBvcHRpb25hbCA9IE9QVElPTkFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkNvbHVtbnMoKSA8ZW0+Sm9pbiBDb2x1bW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpvaW5Db2x1bW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gam9pbkNvbHVtbnM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkQnkoKSA8ZW0+TWFwcGVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX0JZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZEJ5KCkgPGVtPk1hcHBlZCBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkQnkgPSBNQVBQRURfQllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW1hcnlLZXlKb2luQ29sdW1ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT25lVG9PbmVJbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX09ORV9UT19PTkVfSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXJnZXQgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBFbnRpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRhcmdldEVudGl0eShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX1RhcmdldEVudGl0eSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpCi0JewotCQlyZXR1cm4gdGFyZ2V0RW50aXR5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZUltcGwjZ2V0VGFyZ2V0RW50aXR5IDxlbT5UYXJnZXQgRW50aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIG5ld1RhcmdldEVudGl0eSkKLQl7Ci0JCVN0cmluZyBvbGRUYXJnZXRFbnRpdHkgPSB0YXJnZXRFbnRpdHk7Ci0JCXRhcmdldEVudGl0eSA9IG5ld1RhcmdldEVudGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19UQVJHRVRfRU5USVRZLCBvbGRUYXJnZXRFbnRpdHksIHRhcmdldEVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkxBWlkiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRGZXRjaChGZXRjaFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0ZldGNoKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iTEFaWSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpCi0JewotCQlyZXR1cm4gZmV0Y2g7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lSW1wbCNnZXRGZXRjaCA8ZW0+RmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUKLQkgKiBAc2VlICNnZXRGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkKLQl7Ci0JCUZldGNoVHlwZSBvbGRGZXRjaCA9IGZldGNoOwotCQlmZXRjaCA9IG5ld0ZldGNoID09IG51bGwgPyBGRVRDSF9FREVGQVVMVCA6IG5ld0ZldGNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0ZFVENILCBvbGRGZXRjaCwgZmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW9uYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE9wdGlvbmFsKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nX09wdGlvbmFsKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpCi0JewotCQlyZXR1cm4gb3B0aW9uYWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lSW1wbCNnZXRPcHRpb25hbCA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcHRpb25hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gbmV3T3B0aW9uYWwpCi0JewotCQlCb29sZWFuIG9sZE9wdGlvbmFsID0gb3B0aW9uYWw7Ci0JCW9wdGlvbmFsID0gbmV3T3B0aW9uYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fT1BUSU9OQUwsIG9sZE9wdGlvbmFsLCBvcHRpb25hbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkQnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9PbmVfTWFwcGVkQnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpCi0JewotCQlyZXR1cm4gbWFwcGVkQnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lSW1wbCNnZXRNYXBwZWRCeSA8ZW0+TWFwcGVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG5ld01hcHBlZEJ5KQotCXsKLQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JCW1hcHBlZEJ5ID0gbmV3TWFwcGVkQnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fTUFQUEVEX0JZLCBvbGRNYXBwZWRCeSwgbWFwcGVkQnkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9PbmVfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKLQl7Ci0JCWlmIChwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPT0gbnVsbCkKLQkJewotCQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPihYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQl9Ci0JCXJldHVybiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19Kb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKQotCXsKLQkJaWYgKGpvaW5Db2x1bW5zID09IG51bGwpCi0JCXsKLQkJCWpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fSk9JTl9DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gam9pbkNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19Kb2luVGFibGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKQotCXsKLQkJcmV0dXJuIGpvaW5UYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIG5ld0pvaW5UYWJsZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEpvaW5UYWJsZSBvbGRKb2luVGFibGUgPSBqb2luVGFibGU7Ci0JCWpvaW5UYWJsZSA9IG5ld0pvaW5UYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19KT0lOX1RBQkxFLCBvbGRKb2luVGFibGUsIG5ld0pvaW5UYWJsZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lSW1wbCNnZXRKb2luVGFibGUgPGVtPkpvaW4gVGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgbmV3Sm9pblRhYmxlKQotCXsKLQkJaWYgKG5ld0pvaW5UYWJsZSAhPSBqb2luVGFibGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGpvaW5UYWJsZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClqb2luVGFibGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fVEFCTEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0pvaW5UYWJsZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdKb2luVGFibGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fVEFCTEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Sm9pblRhYmxlKG5ld0pvaW5UYWJsZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fVEFCTEUsIG5ld0pvaW5UYWJsZSwgbmV3Sm9pblRhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlKENhc2NhZGVUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19DYXNjYWRlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYXNjYWRlVHlwZSBnZXRDYXNjYWRlKCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENhc2NhZGUoQ2FzY2FkZVR5cGUgbmV3Q2FzY2FkZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCUNhc2NhZGVUeXBlIG9sZENhc2NhZGUgPSBjYXNjYWRlOwotCQljYXNjYWRlID0gbmV3Q2FzY2FkZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19DQVNDQURFLCBvbGRDYXNjYWRlLCBuZXdDYXNjYWRlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmVJbXBsI2dldENhc2NhZGUgPGVtPkNhc2NhZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhc2NhZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIG5ld0Nhc2NhZGUpCi0JewotCQlpZiAobmV3Q2FzY2FkZSAhPSBjYXNjYWRlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjYXNjYWRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNhc2NhZGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0NBU0NBREUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Nhc2NhZGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2FzY2FkZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fQ0FTQ0FERSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDYXNjYWRlKG5ld0Nhc2NhZGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19DQVNDQURFLCBuZXdDYXNjYWRlLCBuZXdDYXNjYWRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fSk9JTl9UQUJMRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRKb2luVGFibGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fQ0FTQ0FERToKLQkJCQlyZXR1cm4gYmFzaWNTZXRDYXNjYWRlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEpvaW5Db2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19UQVJHRVRfRU5USVRZOgotCQkJCXJldHVybiBnZXRUYXJnZXRFbnRpdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19GRVRDSDoKLQkJCQlyZXR1cm4gZ2V0RmV0Y2goKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXJldHVybiBnZXRKb2luVGFibGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19DQVNDQURFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fT1BUSU9OQUw6Ci0JCQkJcmV0dXJuIGdldE9wdGlvbmFsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBnZXRKb2luQ29sdW1ucygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX01BUFBFRF9CWToKLQkJCQlyZXR1cm4gZ2V0TWFwcGVkQnkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19UQVJHRVRfRU5USVRZOgotCQkJCXNldFRhcmdldEVudGl0eSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fRkVUQ0g6Ci0JCQkJc2V0RmV0Y2goKEZldGNoVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fVEFCTEU6Ci0JCQkJc2V0Sm9pblRhYmxlKChYbWxKb2luVGFibGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19DQVNDQURFOgotCQkJCXNldENhc2NhZGUoKENhc2NhZGVUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fT1BUSU9OQUw6Ci0JCQkJc2V0T3B0aW9uYWwoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCWdldEpvaW5Db2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxKb2luQ29sdW1uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX01BUFBFRF9CWToKLQkJCQlzZXRNYXBwZWRCeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19UQVJHRVRfRU5USVRZOgotCQkJCXNldFRhcmdldEVudGl0eShUQVJHRVRfRU5USVRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fRkVUQ0g6Ci0JCQkJc2V0RmV0Y2goRkVUQ0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19KT0lOX1RBQkxFOgotCQkJCXNldEpvaW5UYWJsZSgoWG1sSm9pblRhYmxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19DQVNDQURFOgotCQkJCXNldENhc2NhZGUoKENhc2NhZGVUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19PUFRJT05BTDoKLQkJCQlzZXRPcHRpb25hbChPUFRJT05BTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX01BUFBFRF9CWToKLQkJCQlzZXRNYXBwZWRCeShNQVBQRURfQllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJcmV0dXJuIFRBUkdFVF9FTlRJVFlfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldEVudGl0eSAhPSBudWxsIDogIVRBUkdFVF9FTlRJVFlfRURFRkFVTFQuZXF1YWxzKHRhcmdldEVudGl0eSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fRkVUQ0g6Ci0JCQkJcmV0dXJuIGZldGNoICE9IEZFVENIX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fVEFCTEU6Ci0JCQkJcmV0dXJuIGpvaW5UYWJsZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0NBU0NBREU6Ci0JCQkJcmV0dXJuIGNhc2NhZGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19PUFRJT05BTDoKLQkJCQlyZXR1cm4gT1BUSU9OQUxfRURFRkFVTFQgPT0gbnVsbCA/IG9wdGlvbmFsICE9IG51bGwgOiAhT1BUSU9OQUxfRURFRkFVTFQuZXF1YWxzKG9wdGlvbmFsKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGpvaW5Db2x1bW5zICE9IG51bGwgJiYgIWpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19NQVBQRURfQlk6Ci0JCQkJcmV0dXJuIE1BUFBFRF9CWV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkQnkgIT0gbnVsbCA6ICFNQVBQRURfQllfRURFRkFVTFQuZXF1YWxzKG1hcHBlZEJ5KTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIHByaW1hcnlLZXlKb2luQ29sdW1ucyAhPSBudWxsICYmICFwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX1RBUkdFVF9FTlRJVFk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fRkVUQ0g6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0pPSU5fVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fQ0FTQ0FERTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fT1BUSU9OQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX09QVElPTkFMOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fQ09MVU1OUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPbmVUb09uZS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19NQVBQRURfQlk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19NQVBQRURfQlk7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19UQVJHRVRfRU5USVRZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19GRVRDSDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9JTVBMX19KT0lOX1RBQkxFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX0NBU0NBREU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUFRJT05BTDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fT1BUSU9OQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvT25lLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19NQVBQRURfQlk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0lNUExfX01BUFBFRF9CWTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFyZ2V0RW50aXR5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YXJnZXRFbnRpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmZXRjaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3B0aW9uYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG9wdGlvbmFsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWRCeTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWFwcGVkQnkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgewotCQlJRE9NTm9kZSBtYXBwZWRCeU5vZGUgPSAoSURPTU5vZGUpIERPTVV0aWxpdGllcy5jaGlsZEF0dHJpYnV0ZU5vZGUoZ2V0Tm9kZSgpLCBPcm1YbWxNYXBwZXIuTUFQUEVEX0JZKTsKLQkJcmV0dXJuIChtYXBwZWRCeU5vZGUgPT0gbnVsbCkgPyBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgOiBidWlsZFRleHRSYW5nZShtYXBwZWRCeU5vZGUpOwotCX0KLX0gLy8gT25lVG9PbmUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3JkZXJDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3JkZXJDb2x1bW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmQ4ZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxPcmRlckNvbHVtbi5qYXZhCkBAIC0wLDAgKzEsNDA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5Cb29sZWFuVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT3JkZXIgQ29sdW1uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbE9yZGVyQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RYbWxOYW1lZENvbHVtbiBpbXBsZW1lbnRzIFhtbE9yZGVyQ29sdW1uXzJfMAoreworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdWxsYWJsZSgpIDxlbT5OdWxsYWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TnVsbGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBOVUxMQUJMRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdWxsYWJsZSgpIDxlbT5OdWxsYWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TnVsbGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb29sZWFuIG51bGxhYmxlID0gTlVMTEFCTEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5zZXJ0YWJsZSgpIDxlbT5JbnNlcnRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbnNlcnRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSU5TRVJUQUJMRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnNlcnRhYmxlKCkgPGVtPkluc2VydGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluc2VydGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb29sZWFuIGluc2VydGFibGUgPSBJTlNFUlRBQkxFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVwZGF0YWJsZSgpIDxlbT5VcGRhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFVwZGF0YWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFVQREFUQUJMRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcGRhdGFibGUoKSA8ZW0+VXBkYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRVcGRhdGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb29sZWFuIHVwZGF0YWJsZSA9IFVQREFUQUJMRV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxPcmRlckNvbHVtbigpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9PUkRFUl9DT0xVTU47CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk51bGxhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk51bGxhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXROdWxsYWJsZShCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX051bGxhYmxlKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpCisJeworCQlyZXR1cm4gbnVsbGFibGU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uI2dldE51bGxhYmxlIDxlbT5OdWxsYWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TnVsbGFibGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE51bGxhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiBuZXdOdWxsYWJsZSkKKwl7CisJCUJvb2xlYW4gb2xkTnVsbGFibGUgPSBudWxsYWJsZTsKKwkJbnVsbGFibGUgPSBuZXdOdWxsYWJsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19OVUxMQUJMRSwgb2xkTnVsbGFibGUsIG51bGxhYmxlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJbnNlcnRhYmxlKEJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzBfSW5zZXJ0YWJsZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpCisJeworCQlyZXR1cm4gaW5zZXJ0YWJsZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4jZ2V0SW5zZXJ0YWJsZSA8ZW0+SW5zZXJ0YWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SW5zZXJ0YWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluc2VydGFibGUoQm9vbGVhbiBuZXdJbnNlcnRhYmxlKQorCXsKKwkJQm9vbGVhbiBvbGRJbnNlcnRhYmxlID0gaW5zZXJ0YWJsZTsKKwkJaW5zZXJ0YWJsZSA9IG5ld0luc2VydGFibGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fSU5TRVJUQUJMRSwgb2xkSW5zZXJ0YWJsZSwgaW5zZXJ0YWJsZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVwZGF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXBkYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VXBkYXRhYmxlKEJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzBfVXBkYXRhYmxlKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBnZXRVcGRhdGFibGUoKQorCXsKKwkJcmV0dXJuIHVwZGF0YWJsZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4jZ2V0VXBkYXRhYmxlIDxlbT5VcGRhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VXBkYXRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gbmV3VXBkYXRhYmxlKQorCXsKKwkJQm9vbGVhbiBvbGRVcGRhdGFibGUgPSB1cGRhdGFibGU7CisJCXVwZGF0YWJsZSA9IG5ld1VwZGF0YWJsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19VUERBVEFCTEUsIG9sZFVwZGF0YWJsZSwgdXBkYXRhYmxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fTlVMTEFCTEU6CisJCQkJcmV0dXJuIGdldE51bGxhYmxlKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fSU5TRVJUQUJMRToKKwkJCQlyZXR1cm4gZ2V0SW5zZXJ0YWJsZSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX1VQREFUQUJMRToKKwkJCQlyZXR1cm4gZ2V0VXBkYXRhYmxlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX05VTExBQkxFOgorCQkJCXNldE51bGxhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fSU5TRVJUQUJMRToKKwkJCQlzZXRJbnNlcnRhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fVVBEQVRBQkxFOgorCQkJCXNldFVwZGF0YWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX05VTExBQkxFOgorCQkJCXNldE51bGxhYmxlKE5VTExBQkxFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fSU5TRVJUQUJMRToKKwkJCQlzZXRJbnNlcnRhYmxlKElOU0VSVEFCTEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19VUERBVEFCTEU6CisJCQkJc2V0VXBkYXRhYmxlKFVQREFUQUJMRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19OVUxMQUJMRToKKwkJCQlyZXR1cm4gTlVMTEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IG51bGxhYmxlICE9IG51bGwgOiAhTlVMTEFCTEVfRURFRkFVTFQuZXF1YWxzKG51bGxhYmxlKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19JTlNFUlRBQkxFOgorCQkJCXJldHVybiBJTlNFUlRBQkxFX0VERUZBVUxUID09IG51bGwgPyBpbnNlcnRhYmxlICE9IG51bGwgOiAhSU5TRVJUQUJMRV9FREVGQVVMVC5lcXVhbHMoaW5zZXJ0YWJsZSk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fVVBEQVRBQkxFOgorCQkJCXJldHVybiBVUERBVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IHVwZGF0YWJsZSAhPSBudWxsIDogIVVQREFUQUJMRV9FREVGQVVMVC5lcXVhbHModXBkYXRhYmxlKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sT3JkZXJDb2x1bW5fMl8wLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX05VTExBQkxFOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl8yMF9fTlVMTEFCTEU7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX0lOU0VSVEFCTEU6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OXzIwX19JTlNFUlRBQkxFOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19VUERBVEFCTEU6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OXzIwX19VUERBVEFCTEU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPcmRlckNvbHVtbl8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fMjBfX05VTExBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19OVUxMQUJMRTsKKwkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fMjBfX0lOU0VSVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX0lOU0VSVEFCTEU7CisJCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OXzIwX19VUERBVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX1VQREFUQUJMRTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG51bGxhYmxlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChudWxsYWJsZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaW5zZXJ0YWJsZTogIik7CisJCXJlc3VsdC5hcHBlbmQoaW5zZXJ0YWJsZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgdXBkYXRhYmxlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh1cGRhdGFibGUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisJCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCisJCQllbGVtZW50TmFtZSwKKwkJCXN0cnVjdHVyYWxGZWF0dXJlLAorCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKKwkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZE51bGxhYmxlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRJbnNlcnRhYmxlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRVcGRhdGFibGVUcmFuc2xhdG9yKCksCisJCQlidWlsZENvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCksCisJCX07CisJfQorCQkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROdWxsYWJsZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgQm9vbGVhblRyYW5zbGF0b3IoSlBBMl8wLk5VTExBQkxFLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX051bGxhYmxlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEluc2VydGFibGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKEpQQTJfMC5JTlNFUlRBQkxFLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX0luc2VydGFibGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVXBkYXRhYmxlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihKUEEyXzAuVVBEQVRBQkxFLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX1VwZGF0YWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YQppbmRleCA5YzM1YzU3Li40NjZmNmZhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEyLDEwICsxMiwxNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTMzLDcgKzM5LDYgQEAKICAqIDx1bD4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0QWNjZXNzIDxlbT5BY2Nlc3M8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNpc0Nhc2NhZGVQZXJzaXN0IDxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRFbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn08L2xpPgogICogPC91bD4KQEAgLTQxLDEyICs0Niw2NyBAQAogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQogICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0CitwdWJsaWMgY2xhc3MgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxBY2Nlc3NIb2xkZXIsIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMAogewogCS8qKgorCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAorCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFjY2Vzc1R5cGUgQUNDRVNTX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2VzcygpIDxlbT5BY2Nlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjY2VzcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYWNjZXNzID0gQUNDRVNTX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZWxpbWl0ZWRJZGVudGlmaWVycygpIDxlbT5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRGVsaW1pdGVkSWRlbnRpZmllcnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUxJTUlURURfSURFTlRJRklFUlNfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGVsaW1pdGVkSWRlbnRpZmllcnMoKSA8ZW0+RGVsaW1pdGVkIElkZW50aWZpZXJzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0RlbGltaXRlZElkZW50aWZpZXJzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWxpbWl0ZWRJZGVudGlmaWVycyA9IERFTElNSVRFRF9JREVOVElGSUVSU19FREVGQVVMVDsKKworCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2hlbWEoKSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTg3LDIyICsxNDcsNiBAQAogCXByb3RlY3RlZCBTdHJpbmcgY2F0YWxvZyA9IENBVEFMT0dfRURFRkFVTFQ7CiAKIAkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBY2Nlc3NUeXBlIEFDQ0VTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3MoKSA8ZW0+QWNjZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGFjY2VzcyA9IEFDQ0VTU19FREVGQVVMVDsKLQotCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVQZXJzaXN0KCkgPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+fScgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0yMjUsNyArMjY5LDYgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJQUk9QRVJUWSI8L2NvZGU+LgogCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlfS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtMjM2LDggKzI3OSw4IEBACiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlCiAJICogQHNlZSAjc2V0QWNjZXNzKEFjY2Vzc1R5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19BY2Nlc3MoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJQUk9QRVJUWSIKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFjY2Vzc0hvbGRlcl9BY2Nlc3MoKQorCSAqIEBtb2RlbAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKQpAQCAtMjYzLDYgKzMwNiw3NiBAQAogCX0KIAogCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wX0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQorCXsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKKwl7CisJCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaW1pdGVkIElkZW50aWZpZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaW1pdGVkIElkZW50aWZpZXJzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZWxpbWl0ZWRJZGVudGlmaWVycyhib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wX0RlbGltaXRlZElkZW50aWZpZXJzKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RlbGltaXRlZElkZW50aWZpZXJzKCkKKwl7CisJCXJldHVybiBkZWxpbWl0ZWRJZGVudGlmaWVyczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjaXNEZWxpbWl0ZWRJZGVudGlmaWVycyA8ZW0+RGVsaW1pdGVkIElkZW50aWZpZXJzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzRGVsaW1pdGVkSWRlbnRpZmllcnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWxpbWl0ZWRJZGVudGlmaWVycyhib29sZWFuIG5ld0RlbGltaXRlZElkZW50aWZpZXJzKQorCXsKKwkJYm9vbGVhbiBvbGREZWxpbWl0ZWRJZGVudGlmaWVycyA9IGRlbGltaXRlZElkZW50aWZpZXJzOworCQlkZWxpbWl0ZWRJZGVudGlmaWVycyA9IG5ld0RlbGltaXRlZElkZW50aWZpZXJzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19ERUxJTUlURURfSURFTlRJRklFUlMsIG9sZERlbGltaXRlZElkZW50aWZpZXJzLCBkZWxpbWl0ZWRJZGVudGlmaWVycykpOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgUGVyc2lzdDwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CkBAIC0zODMsMTQgKzQ5NiwxOCBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTOgorCQkJCXJldHVybiBnZXRBY2Nlc3MoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFTElNSVRFRF9JREVOVElGSUVSUzoKKwkJCQlyZXR1cm4gaXNEZWxpbWl0ZWRJZGVudGlmaWVycygpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19TQ0hFTUE6CiAJCQkJcmV0dXJuIGdldFNjaGVtYSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVRBTE9HOgogCQkJCXJldHVybiBnZXRDYXRhbG9nKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBU0NBREVfUEVSU0lTVDoKLQkJCQlyZXR1cm4gaXNDYXNjYWRlUGVyc2lzdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKwkJCQlyZXR1cm4gaXNDYXNjYWRlUGVyc2lzdCgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19FTlRJVFlfTElTVEVORVJTOgogCQkJCXJldHVybiBnZXRFbnRpdHlMaXN0ZW5lcnMoKTsKIAkJfQpAQCAtNDA3LDE3ICs1MjQsMjMgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTUzoKKwkJCQlzZXRBY2Nlc3MoKEFjY2Vzc1R5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19ERUxJTUlURURfSURFTlRJRklFUlM6CisJCQkJc2V0RGVsaW1pdGVkSWRlbnRpZmllcnMoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fU0NIRU1BOgogCQkJCXNldFNjaGVtYSgoU3RyaW5nKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBVEFMT0c6CiAJCQkJc2V0Q2F0YWxvZygoU3RyaW5nKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTUzoKLQkJCQlzZXRBY2Nlc3MoKEFjY2Vzc1R5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FTQ0FERV9QRVJTSVNUOgotCQkJCXNldENhc2NhZGVQZXJzaXN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOworCQkJCXNldENhc2NhZGVQZXJzaXN0KChCb29sZWFuKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlM6CiAJCQkJc2V0RW50aXR5TGlzdGVuZXJzKChFbnRpdHlMaXN0ZW5lcnMpbmV3VmFsdWUpOwpAQCAtNDM2LDE1ICs1NTksMjEgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTUzoKKwkJCQlzZXRBY2Nlc3MoQUNDRVNTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFU0NSSVBUSU9OOgorCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFTElNSVRFRF9JREVOVElGSUVSUzoKKwkJCQlzZXREZWxpbWl0ZWRJZGVudGlmaWVycyhERUxJTUlURURfSURFTlRJRklFUlNfRURFRkFVTFQpOworCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fU0NIRU1BOgogCQkJCXNldFNjaGVtYShTQ0hFTUFfRURFRkFVTFQpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FUQUxPRzoKIAkJCQlzZXRDYXRhbG9nKENBVEFMT0dfRURFRkFVTFQpOwogCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTOgotCQkJCXNldEFjY2VzcyhBQ0NFU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FTQ0FERV9QRVJTSVNUOgogCQkJCXNldENhc2NhZGVQZXJzaXN0KENBU0NBREVfUEVSU0lTVF9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwpAQCAtNDY1LDEyICs1OTQsMTYgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTUzoKKwkJCQlyZXR1cm4gYWNjZXNzICE9IEFDQ0VTU19FREVGQVVMVDsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFTElNSVRFRF9JREVOVElGSUVSUzoKKwkJCQlyZXR1cm4gZGVsaW1pdGVkSWRlbnRpZmllcnMgIT0gREVMSU1JVEVEX0lERU5USUZJRVJTX0VERUZBVUxUOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19TQ0hFTUE6CiAJCQkJcmV0dXJuIFNDSEVNQV9FREVGQVVMVCA9PSBudWxsID8gc2NoZW1hICE9IG51bGwgOiAhU0NIRU1BX0VERUZBVUxULmVxdWFscyhzY2hlbWEpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVRBTE9HOgogCQkJCXJldHVybiBDQVRBTE9HX0VERUZBVUxUID09IG51bGwgPyBjYXRhbG9nICE9IG51bGwgOiAhQ0FUQUxPR19FREVGQVVMVC5lcXVhbHMoY2F0YWxvZyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTUzoKLQkJCQlyZXR1cm4gYWNjZXNzICE9IEFDQ0VTU19FREVGQVVMVDsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FTQ0FERV9QRVJTSVNUOgogCQkJCXJldHVybiBjYXNjYWRlUGVyc2lzdCAhPSBDQVNDQURFX1BFUlNJU1RfRURFRkFVTFQ7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlM6CkBAIC00ODUsMjEgKzYxOCwxMDYgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19ERVNDUklQVElPTjogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIwX19ERVNDUklQVElPTjsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFTElNSVRFRF9JREVOVElGSUVSUzogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIwX19ERUxJTUlURURfSURFTlRJRklFUlM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIwX19ERVNDUklQVElPTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFU0NSSVBUSU9OOworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjBfX0RFTElNSVRFRF9JREVOVElGSUVSUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFTElNSVRFRF9JREVOVElGSUVSUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogCXsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNjaGVtYTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoYWNjZXNzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChhY2Nlc3MpOworCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7CisJCXJlc3VsdC5hcHBlbmQoIiwgZGVsaW1pdGVkSWRlbnRpZmllcnM6ICIpOworCQlyZXN1bHQuYXBwZW5kKGRlbGltaXRlZElkZW50aWZpZXJzKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzY2hlbWE6ICIpOwogCQlyZXN1bHQuYXBwZW5kKHNjaGVtYSk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgY2F0YWxvZzogIik7CiAJCXJlc3VsdC5hcHBlbmQoY2F0YWxvZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWNjZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY2Nlc3MpOwogCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGVQZXJzaXN0OiAiKTsKIAkJcmVzdWx0LmFwcGVuZChjYXNjYWRlUGVyc2lzdCk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KIAotfSAvLyBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cworCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCisJCQlidWlsZFNjaGVtYVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRGVsaW1pdGVkSWRlbnRpZmllcnNUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ2FzY2FkZVBlcnNpc3RUcmFuc2xhdG9yKCksCisJCQlFbnRpdHlMaXN0ZW5lcnMuYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5FTlRJVFlfTElTVEVORVJTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19FbnRpdHlMaXN0ZW5lcnMoKSkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLkRFU0NSSVBUSU9OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wX0Rlc2NyaXB0aW9uKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlNDSEVNQSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfU2NoZW1hKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5DQVRBTE9HLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19DYXRhbG9nKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZWxpbWl0ZWRJZGVudGlmaWVyc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihKUEEyXzAuREVMSU1JVElFRF9JREVOVElGSUVSUywgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMF9EZWxpbWl0ZWRJZGVudGlmaWVycygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5BQ0NFU1MsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc0hvbGRlcl9BY2Nlc3MoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhc2NhZGVQZXJzaXN0VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEpQQS5DQVNDQURFX1BFUlNJU1QsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0Nhc2NhZGVQZXJzaXN0KCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQppbmRleCAwNmI2MTdkLi45NDVmNDgzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEyLDEwICsxMiwxNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTM4LDEyICs0NCwzMSBAQAogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQogICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0CitwdWJsaWMgY2xhc3MgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAKIHsKIAkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKKworCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgPGVtPlhtbCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTk1LDYgKzEyMCw0MSBAQAogCX0KIAogCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wX0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQorCXsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKKwl7CisJCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7CisJfQorCisJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WG1sIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtMjE1LDggKzI3NSwxMCBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1hNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXJldHVybiBpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworCQkJCXJldHVybiBpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCk7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM6CiAJCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CiAJCX0KQEAgLTIzMyw4ICsyOTUsMTEgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX0RFU0NSSVBUSU9OOgorCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEU6Ci0JCQkJc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7CisJCQkJc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKEJvb2xlYW4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUzoKIAkJCQlzZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygoWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpbmV3VmFsdWUpOwpAQCAtMjUzLDYgKzMxOCw5IEBACiAJewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkKIAkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURToKIAkJCQlzZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShYTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURV9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwpAQCAtMjczLDYgKzM0MSw4IEBACiAJewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkKIAkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEU6CiAJCQkJcmV0dXJuIHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlICE9IFhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxUOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTOgpAQCAtMjkyLDEwICszNjIsMzcgQEAKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOworCQlyZXN1bHQuYXBwZW5kKCIsIHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlOiAiKTsKIAkJcmVzdWx0LmFwcGVuZCh4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KIAotfSAvLyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCisJCQlidWlsZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAorCQkJWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuREVTQ1JJUFRJT04sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzBfRGVzY3JpcHRpb24oKSk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuYnVpbGRUcmFuc2xhdG9yKEpQQS5QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihKUEEuWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQppbmRleCAxY2I3NDcxLi4xYzNiZWU1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMTIgKzksMTggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uPC9iPjwvZW0+Jy4KLSAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uIEltcGw8L2I+PC9lbT4nLgorICoKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCiAgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQpAQCAtMzAsMTEgKzM2LDUxIEBACiAgKiA8L3A+CiAgKgogICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gZXh0ZW5kcyBYbWxOYW1lZENvbHVtbgorcHVibGljIGNsYXNzIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RYbWxOYW1lZENvbHVtbgogeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIDxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIDxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU47CisJfQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNTAsNyArOTYsMTAgQEAKIAkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCiAJICogQGdlbmVyYXRlZAogCSAqLwotCVN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOworCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQorCXsKKwkJcmV0dXJuIHJlZmVyZW5jZWRDb2x1bW5OYW1lOworCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtNjAsMTMgKzEwOSwxMjIgQEAKIAkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIHZhbHVlKTsKLQorCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBuZXdSZWZlcmVuY2VkQ29sdW1uTmFtZSkKKwl7CisJCVN0cmluZyBvbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHJlZmVyZW5jZWRDb2x1bW5OYW1lOworCQlyZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5ld1JlZmVyZW5jZWRDb2x1bW5OYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgb2xkUmVmZXJlbmNlZENvbHVtbk5hbWUsIHJlZmVyZW5jZWRDb2x1bW5OYW1lKSk7CisJfQogCiAJLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHJlZmVyZW5jZWQtY29sdW1uLW5hbWUgYXR0aWJ1dGUuICBJZiB0aGUgcmVmZXJlbmNlZC1jb2x1bW4tbmFtZSBhdHRpYnV0ZSAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKnRhYmxlIGVsZW1lbnQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCiAJICovCi0JVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCk7CisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOgorCQkJCXJldHVybiBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KIAotfSAvLyBQcmltYXJ5S2V5Sm9pbkNvbHVtbgorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6CisJCQkJc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRToKKwkJCQlzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRToKKwkJCQlyZXR1cm4gUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcmVmZXJlbmNlZENvbHVtbk5hbWUgIT0gbnVsbCA6ICFSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX0VERUZBVUxULmVxdWFscyhyZWZlcmVuY2VkQ29sdW1uTmFtZSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHJlZmVyZW5jZWRDb2x1bW5OYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChyZWZlcmVuY2VkQ29sdW1uTmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLlJFRkVSRU5DRURfQ09MVU1OX05BTUUpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJZWxlbWVudE5hbWUsCisJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKKwkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCisJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZFJlZmVyZW5jZWRDb2x1bW5OYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDb2x1bW5EZWZpbml0aW9uVHJhbnNsYXRvcigpLAorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5fUmVmZXJlbmNlZENvbHVtbk5hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCit9IC8vIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MmI1N2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9ycy5Pcm1YbWxNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5lbWYuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uIEltcGw8L2I+PC9lbT4nLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCBleHRlbmRzIEFic3RyYWN0WG1sTmFtZWRDb2x1bW4gaW1wbGVtZW50cyBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIDxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIDxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbl9SZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQl7Ci0JCXJldHVybiByZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lIDxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBuZXdSZWZlcmVuY2VkQ29sdW1uTmFtZSkKLQl7Ci0JCVN0cmluZyBvbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQlyZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5ld1JlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9JTVBMX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCBvbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fSU1QTF9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRToKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX0lNUExfX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6Ci0JCQkJc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9JTVBMX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOgotCQkJCXNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX0lNUExfX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6Ci0JCQkJcmV0dXJuIFJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJlZmVyZW5jZWRDb2x1bW5OYW1lICE9IG51bGwgOiAhUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9FREVGQVVMVC5lcXVhbHMocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fSU1QTF9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fSU1QTF9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJlZmVyZW5jZWRDb2x1bW5OYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIHJlZmVyZW5jZWRDb2x1bW5OYW1lTm9kZSA9IChJRE9NTm9kZSkgRE9NVXRpbGl0aWVzLmNoaWxkQXR0cmlidXRlTm9kZSh0aGlzLm5vZGUsIE9ybVhtbE1hcHBlci5SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQkJcmV0dXJuIChyZWZlcmVuY2VkQ29sdW1uTmFtZU5vZGUgPT0gbnVsbCkgPyBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgOiBidWlsZFRleHRSYW5nZShyZWZlcmVuY2VkQ29sdW1uTmFtZU5vZGUpOwotCX0KLX0gLy8gWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5LmphdmEKaW5kZXggYjA5ZGU1NS4uOTNlNjRmMSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3ICsxMCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeV8yXzA7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiAKIC8qKgpAQCAtMzUsMTAgKzM1LDkgQEAKICAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5KCkKICAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGludGVyZmFjZSBYbWxRdWVyeSBleHRlbmRzIEpwYUVPYmplY3QKK3B1YmxpYyBpbnRlcmZhY2UgWG1sUXVlcnkgZXh0ZW5kcyBYbWxRdWVyeV8yXzAKIHsKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMDksNCArMTA4LDQgQEAKIAlFTGlzdDxYbWxRdWVyeUhpbnQ+IGdldEhpbnRzKCk7CiAJCiAJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeUNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeUNvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNzQxMWMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5Q29udGFpbmVyLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBRdWVyaWVzIEhvbGRlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIjZ2V0TmFtZWRRdWVyaWVzIDxlbT5OYW1lZCBRdWVyaWVzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIjZ2V0TmFtZWROYXRpdmVRdWVyaWVzIDxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXIoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbFF1ZXJ5Q29udGFpbmVyIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkUXVlcmllcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxYbWxOYW1lZFF1ZXJ5PiBnZXROYW1lZFF1ZXJpZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkTmF0aXZlUXVlcmllcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PiBnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKKworfSAvLyBYbWxRdWVyaWVzSG9sZGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5SGludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeUhpbnQuamF2YQppbmRleCBlZDBhNmM4Li41M2VmNmJkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5SGludC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnlIaW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTEsOSArMTEsMTQgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5SGludF8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0zNiwxMiArNDEsMzEgQEAKICAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5SGludCgpCiAgKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBYbWxRdWVyeUhpbnQgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0CitwdWJsaWMgY2xhc3MgWG1sUXVlcnlIaW50IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sUXVlcnlIaW50XzJfMAogewogCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOworCisJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMDMsNiArMTI3LDQxIEBACiAJfQogCiAJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeUhpbnRfMl8wX0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQorCXsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pCisJeworCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfUVVFUllfSElOVF9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtMTgyLDYgKzI0MSw4IEBACiAJewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkKIAkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUVVFUllfSElOVF9fTkFNRToKIAkJCQlyZXR1cm4gZ2V0TmFtZSgpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19WQUxVRToKQEAgLTIwMCw2ICsyNjEsOSBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUVVFUllfSElOVF9fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19OQU1FOgogCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwpAQCAtMjIwLDYgKzI4NCw5IEBACiAJewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkKIAkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19OQU1FOgogCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwpAQCAtMjQwLDYgKzMwNyw4IEBACiAJewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkKIAkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUVVFUllfSElOVF9fTkFNRToKIAkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19WQUxVRToKQEAgLTI1OSwxMiArMzI4LDM5IEBACiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOworCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwogCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwogCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKIAkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKIAotfSAvLyBRdWVyeUhpbnQKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRWYWx1ZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlIaW50X05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVmFsdWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlZBTFVFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUhpbnRfVmFsdWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuREVTQ1JJUFRJT04sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUhpbnRfMl8wX0Rlc2NyaXB0aW9uKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZWU1MGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVsYXRpb25zaGlwIE1hcHBpbmc8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldFRhcmdldEVudGl0eSA8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0RmV0Y2ggPGVtPkZldGNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRKb2luVGFibGUgPGVtPkpvaW4gVGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldENhc2NhZGUgPGVtPkNhc2NhZGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcgZXh0ZW5kcyBYbWxBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYXJnZXRFbnRpdHkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19UYXJnZXRFbnRpdHkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRhcmdldEVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0VGFyZ2V0RW50aXR5IDxlbT5UYXJnZXQgRW50aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iTEFaWSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgI3NldEZldGNoKEZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfRmV0Y2goKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJMQVpZIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZXRjaFR5cGUgZ2V0RmV0Y2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgI2dldEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlKENhc2NhZGVUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19DYXNjYWRlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNhc2NhZGVUeXBlIGdldENhc2NhZGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldENhc2NhZGUgPGVtPkNhc2NhZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhc2NhZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhc2NhZGUoQ2FzY2FkZVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19Kb2luVGFibGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0Sm9pblRhYmxlIDxlbT5Kb2luIFRhYmxlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRKb2luVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpOwotCi19IC8vIFJlbGF0aW9uc2hpcE1hcHBpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sU2Vjb25kYXJ5VGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sU2Vjb25kYXJ5VGFibGUuamF2YQppbmRleCBhNmNmYjdhLi5mYjU1YjUwIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlY29uZGFyeVRhYmxlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxTZWNvbmRhcnlUYWJsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMTEgKzksMjAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKIAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZWNvbmRhcnkgVGFibGU8L2I+PC9lbT4nLgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFNlY29uZGFyeSBUYWJsZSBJbXBsPC9iPjwvZW0+Jy4KICAqIAogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKQEAgLTMwLDExICszOSw0MSBAQAogICogPC9wPgogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2Vjb25kYXJ5VGFibGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFNlY29uZGFyeVRhYmxlIGV4dGVuZHMgWG1sQmFzZVRhYmxlCitwdWJsaWMgY2xhc3MgWG1sU2Vjb25kYXJ5VGFibGUgZXh0ZW5kcyBBYnN0cmFjdFhtbFRhYmxlCiB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbFNlY29uZGFyeVRhYmxlKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1NFQ09OREFSWV9UQUJMRTsKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNTAsNiArODksMTE3IEBACiAJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJcHVibGljIEVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQorCXsKKwkJaWYgKHByaW1hcnlLZXlKb2luQ29sdW1ucyA9PSBudWxsKQorCQl7CisJCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+KFhtbFByaW1hcnlLZXlKb2luQ29sdW1uLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7CisJCX0KKwkJcmV0dXJuIHByaW1hcnlLZXlKb2luQ29sdW1uczsKKwl9CiAKLX0gLy8gU2Vjb25kYXJ5VGFibGUKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6CisJCQkJcmV0dXJuIGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6CisJCQkJZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKKwkJCQlnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKKwkJCQlnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgorCQkJCXJldHVybiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgIT0gbnVsbCAmJiAhcHJpbWFyeUtleUpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNUcmFuc2xhdG9yKCksCisJCQlidWlsZFVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFNlY29uZGFyeVRhYmxlX1ByaW1hcnlLZXlKb2luQ29sdW1ucygpKTsKKwl9CisKK30gLy8gWG1sU2Vjb25kYXJ5VGFibGVJbXBsCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlY29uZGFyeVRhYmxlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxTZWNvbmRhcnlUYWJsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkNjhkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlY29uZGFyeVRhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgU2Vjb25kYXJ5IFRhYmxlIEltcGw8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlY29uZGFyeVRhYmxlSW1wbCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxTZWNvbmRhcnlUYWJsZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFhtbEJhc2VUYWJsZSBpbXBsZW1lbnRzIFhtbFNlY29uZGFyeVRhYmxlCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFNlY29uZGFyeVRhYmxlSW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2Vjb25kYXJ5VGFibGVfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKLQl7Ci0JCWlmIChwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPT0gbnVsbCkKLQkJewotCQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPihYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX0lNUExfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCX0KLQkJcmV0dXJuIHByaW1hcnlLZXlKb2luQ29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX0lNUExfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9JTVBMX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX0lNUExfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW5zICE9IG51bGwgJiYgIXByaW1hcnlLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFNlY29uZGFyeVRhYmxlLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxTZWNvbmRhcnlUYWJsZS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfSU1QTF9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi19IC8vIFhtbFNlY29uZGFyeVRhYmxlSW1wbApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxTZXF1ZW5jZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxTZXF1ZW5jZUdlbmVyYXRvci5qYXZhCmluZGV4IDE2MWZkYzkuLjc0Mjc2NzggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sU2VxdWVuY2VHZW5lcmF0b3IuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlcXVlbmNlR2VuZXJhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw2ICs5LDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yOSwxMiArMzksMjQzIEBACiAgKiA8L3A+CiAgKgogICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU2VxdWVuY2VHZW5lcmF0b3IgZXh0ZW5kcyBYbWxHZW5lcmF0b3IKK3B1YmxpYyBjbGFzcyBYbWxTZXF1ZW5jZUdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEdlbmVyYXRvciwgWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wCiB7CiAJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsVmFsdWUoKSA8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5pdGlhbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgSU5JVElBTF9WQUxVRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsVmFsdWUoKSA8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5pdGlhbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSW50ZWdlciBpbml0aWFsVmFsdWUgPSBJTklUSUFMX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsbG9jYXRpb25TaXplKCkgPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWxsb2NhdGlvblNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWxsb2NhdGlvblNpemUoKSA8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBbGxvY2F0aW9uU2l6ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEludGVnZXIgYWxsb2NhdGlvblNpemUgPSBBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZygpIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDYXRhbG9nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGFsb2coKSA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2F0YWxvZygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBjYXRhbG9nID0gQ0FUQUxPR19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2hlbWEoKSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTY2hlbWEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2hlbWEoKSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTY2hlbWEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hID0gU0NIRU1BX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcXVlbmNlTmFtZSgpIDxlbT5TZXF1ZW5jZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTZXF1ZW5jZU5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFX05BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VxdWVuY2VOYW1lKCkgPGVtPlNlcXVlbmNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNlcXVlbmNlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBzZXF1ZW5jZU5hbWUgPSBTRVFVRU5DRV9OQU1FX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbFNlcXVlbmNlR2VuZXJhdG9yKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcl8yXzBfRGVzY3JpcHRpb24oKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCisJeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKQorCXsKKwkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JfTmFtZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkKKwl7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvciNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKKwl7CisJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKKwkJbmFtZSA9IG5ld05hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcXVlbmNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtNDgsNyArMjg5LDEwIEBACiAJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlTdHJpbmcgZ2V0U2VxdWVuY2VOYW1lKCk7CisJcHVibGljIFN0cmluZyBnZXRTZXF1ZW5jZU5hbWUoKQorCXsKKwkJcmV0dXJuIHNlcXVlbmNlTmFtZTsKKwl9CiAKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3IjZ2V0U2VxdWVuY2VOYW1lIDxlbT5TZXF1ZW5jZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC01OCw2ICszMDIsNDA0IEBACiAJICogQHNlZSAjZ2V0U2VxdWVuY2VOYW1lKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0Jdm9pZCBzZXRTZXF1ZW5jZU5hbWUoU3RyaW5nIHZhbHVlKTsKKwlwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZU5hbWUoU3RyaW5nIG5ld1NlcXVlbmNlTmFtZSkKKwl7CisJCVN0cmluZyBvbGRTZXF1ZW5jZU5hbWUgPSBzZXF1ZW5jZU5hbWU7CisJCXNlcXVlbmNlTmFtZSA9IG5ld1NlcXVlbmNlTmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19TRVFVRU5DRV9OQU1FLCBvbGRTZXF1ZW5jZU5hbWUsIHNlcXVlbmNlTmFtZSkpOworCX0KIAotfSAvLyBTZXF1ZW5jZUdlbmVyYXRvcgorCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXRpYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SW5pdGlhbFZhbHVlKEludGVnZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JfSW5pdGlhbFZhbHVlKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldEluaXRpYWxWYWx1ZSgpCisJeworCQlyZXR1cm4gaW5pdGlhbFZhbHVlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvciNnZXRJbml0aWFsVmFsdWUgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEluaXRpYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluaXRpYWxWYWx1ZShJbnRlZ2VyIG5ld0luaXRpYWxWYWx1ZSkKKwl7CisJCUludGVnZXIgb2xkSW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlOworCQlpbml0aWFsVmFsdWUgPSBuZXdJbml0aWFsVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRSwgb2xkSW5pdGlhbFZhbHVlLCBpbml0aWFsVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbGxvY2F0aW9uIFNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEFsbG9jYXRpb25TaXplKEludGVnZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JfQWxsb2NhdGlvblNpemUoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEludGVnZXIgZ2V0QWxsb2NhdGlvblNpemUoKQorCXsKKwkJcmV0dXJuIGFsbG9jYXRpb25TaXplOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvciNnZXRBbGxvY2F0aW9uU2l6ZSA8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEFsbG9jYXRpb25TaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlciBuZXdBbGxvY2F0aW9uU2l6ZSkKKwl7CisJCUludGVnZXIgb2xkQWxsb2NhdGlvblNpemUgPSBhbGxvY2F0aW9uU2l6ZTsKKwkJYWxsb2NhdGlvblNpemUgPSBuZXdBbGxvY2F0aW9uU2l6ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkUsIG9sZEFsbG9jYXRpb25TaXplLCBhbGxvY2F0aW9uU2l6ZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Q2F0YWxvZyhTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzBfQ2F0YWxvZygpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKQorCXsKKwkJcmV0dXJuIGNhdGFsb2c7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENhdGFsb2coKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nKFN0cmluZyBuZXdDYXRhbG9nKQorCXsKKwkJU3RyaW5nIG9sZENhdGFsb2cgPSBjYXRhbG9nOworCQljYXRhbG9nID0gbmV3Q2F0YWxvZzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19DQVRBTE9HLCBvbGRDYXRhbG9nLCBjYXRhbG9nKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRTY2hlbWEoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wX1NjaGVtYSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpCisJeworCQlyZXR1cm4gc2NoZW1hOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvciNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTY2hlbWEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIG5ld1NjaGVtYSkKKwl7CisJCVN0cmluZyBvbGRTY2hlbWEgPSBzY2hlbWE7CisJCXNjaGVtYSA9IG5ld1NjaGVtYTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19TQ0hFTUEsIG9sZFNjaGVtYSwgc2NoZW1hKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fTkFNRToKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUU6CisJCQkJcmV0dXJuIGdldEluaXRpYWxWYWx1ZSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRToKKwkJCQlyZXR1cm4gZ2V0QWxsb2NhdGlvblNpemUoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19DQVRBTE9HOgorCQkJCXJldHVybiBnZXRDYXRhbG9nKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0NIRU1BOgorCQkJCXJldHVybiBnZXRTY2hlbWEoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19TRVFVRU5DRV9OQU1FOgorCQkJCXJldHVybiBnZXRTZXF1ZW5jZU5hbWUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX05BTUU6CisJCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRToKKwkJCQlzZXRJbml0aWFsVmFsdWUoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkU6CisJCQkJc2V0QWxsb2NhdGlvblNpemUoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19DQVRBTE9HOgorCQkJCXNldENhdGFsb2coKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX1NDSEVNQToKKwkJCQlzZXRTY2hlbWEoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX1NFUVVFTkNFX05BTUU6CisJCQkJc2V0U2VxdWVuY2VOYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX05BTUU6CisJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRToKKwkJCQlzZXRJbml0aWFsVmFsdWUoSU5JVElBTF9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRToKKwkJCQlzZXRBbGxvY2F0aW9uU2l6ZShBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19DQVRBTE9HOgorCQkJCXNldENhdGFsb2coQ0FUQUxPR19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX1NDSEVNQToKKwkJCQlzZXRTY2hlbWEoU0NIRU1BX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0VRVUVOQ0VfTkFNRToKKwkJCQlzZXRTZXF1ZW5jZU5hbWUoU0VRVUVOQ0VfTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19OQU1FOgorCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRToKKwkJCQlyZXR1cm4gSU5JVElBTF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gaW5pdGlhbFZhbHVlICE9IG51bGwgOiAhSU5JVElBTF9WQUxVRV9FREVGQVVMVC5lcXVhbHMoaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkU6CisJCQkJcmV0dXJuIEFMTE9DQVRJT05fU0laRV9FREVGQVVMVCA9PSBudWxsID8gYWxsb2NhdGlvblNpemUgIT0gbnVsbCA6ICFBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQuZXF1YWxzKGFsbG9jYXRpb25TaXplKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19DQVRBTE9HOgorCQkJCXJldHVybiBDQVRBTE9HX0VERUZBVUxUID09IG51bGwgPyBjYXRhbG9nICE9IG51bGwgOiAhQ0FUQUxPR19FREVGQVVMVC5lcXVhbHMoY2F0YWxvZyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0NIRU1BOgorCQkJCXJldHVybiBTQ0hFTUFfRURFRkFVTFQgPT0gbnVsbCA/IHNjaGVtYSAhPSBudWxsIDogIVNDSEVNQV9FREVGQVVMVC5lcXVhbHMoc2NoZW1hKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19TRVFVRU5DRV9OQU1FOgorCQkJCXJldHVybiBTRVFVRU5DRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzZXF1ZW5jZU5hbWUgIT0gbnVsbCA6ICFTRVFVRU5DRV9OQU1FX0VERUZBVUxULmVxdWFscyhzZXF1ZW5jZU5hbWUpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fQ0FUQUxPRzogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfMjBfX0NBVEFMT0c7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX1NDSEVNQTogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfMjBfX1NDSEVNQTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl8yMF9fQ0FUQUxPRzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fQ0FUQUxPRzsKKwkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfMjBfX1NDSEVNQTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0NIRU1BOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChuYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpbml0aWFsVmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGluaXRpYWxWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgYWxsb2NhdGlvblNpemU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGFsbG9jYXRpb25TaXplKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBjYXRhbG9nOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChjYXRhbG9nKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzY2hlbWE6ICIpOworCQlyZXN1bHQuYXBwZW5kKHNjaGVtYSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgc2VxdWVuY2VOYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChzZXF1ZW5jZU5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5OQU1FKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCisJCQllbGVtZW50TmFtZSwgCisJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCisJCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULCAKKwkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRTZXF1ZW5jZU5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZEluaXRpYWxWYWx1ZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWxsb2NhdGlvblNpemVUcmFuc2xhdG9yKCksCisJCQlidWlsZENhdGFsb2dUcmFuc2xhdG9yKCksCisJCQlidWlsZFNjaGVtYVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvcl9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNlcXVlbmNlTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuU0VRVUVOQ0VfTkFNRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfU2VxdWVuY2VOYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEluaXRpYWxWYWx1ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuSU5JVElBTF9WQUxVRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yX0luaXRpYWxWYWx1ZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBbGxvY2F0aW9uU2l6ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQUxMT0NBVElPTl9TSVpFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JfQWxsb2NhdGlvblNpemUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkRFU0NSSVBUSU9OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yXzJfMF9EZXNjcmlwdGlvbigpKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5DQVRBTE9HLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wX0NhdGFsb2coKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlNDSEVNQSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMF9TY2hlbWEoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlcXVlbmNlR2VuZXJhdG9ySW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIxZmIwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlcXVlbmNlR2VuZXJhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLnRyYW5zbGF0b3JzLk9ybVhtbE1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmVtZi5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFNlcXVlbmNlR2VuZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbFZhbHVlKCkgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIElOSVRJQUxfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbFZhbHVlKCkgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgaW5pdGlhbFZhbHVlID0gSU5JVElBTF9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGxvY2F0aW9uU2l6ZSgpIDxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsbG9jYXRpb25TaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgQUxMT0NBVElPTl9TSVpFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsbG9jYXRpb25TaXplKCkgPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxsb2NhdGlvblNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIGFsbG9jYXRpb25TaXplID0gQUxMT0NBVElPTl9TSVpFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcXVlbmNlTmFtZSgpIDxlbT5TZXF1ZW5jZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VxdWVuY2VOYW1lKCkgPGVtPlNlcXVlbmNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcXVlbmNlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZXF1ZW5jZU5hbWUgPSBTRVFVRU5DRV9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcXVlbmNlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcXVlbmNlTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl9TZXF1ZW5jZU5hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXF1ZW5jZU5hbWUoKQotCXsKLQkJcmV0dXJuIHNlcXVlbmNlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsI2dldFNlcXVlbmNlTmFtZSA8ZW0+U2VxdWVuY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VxdWVuY2VOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VxdWVuY2VOYW1lKFN0cmluZyBuZXdTZXF1ZW5jZU5hbWUpCi0JewotCQlTdHJpbmcgb2xkU2VxdWVuY2VOYW1lID0gc2VxdWVuY2VOYW1lOwotCQlzZXF1ZW5jZU5hbWUgPSBuZXdTZXF1ZW5jZU5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19TRVFVRU5DRV9OQU1FLCBvbGRTZXF1ZW5jZU5hbWUsIHNlcXVlbmNlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXRpYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5pdGlhbFZhbHVlKEludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JfSW5pdGlhbFZhbHVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldEluaXRpYWxWYWx1ZSgpCi0JewotCQlyZXR1cm4gaW5pdGlhbFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwjZ2V0SW5pdGlhbFZhbHVlIDxlbT5Jbml0aWFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbml0aWFsVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsVmFsdWUoSW50ZWdlciBuZXdJbml0aWFsVmFsdWUpCi0JewotCQlJbnRlZ2VyIG9sZEluaXRpYWxWYWx1ZSA9IGluaXRpYWxWYWx1ZTsKLQkJaW5pdGlhbFZhbHVlID0gbmV3SW5pdGlhbFZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fSU5JVElBTF9WQUxVRSwgb2xkSW5pdGlhbFZhbHVlLCBpbml0aWFsVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbGxvY2F0aW9uIFNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsbG9jYXRpb25TaXplKEludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JfQWxsb2NhdGlvblNpemUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0QWxsb2NhdGlvblNpemUoKQotCXsKLQkJcmV0dXJuIGFsbG9jYXRpb25TaXplOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwjZ2V0QWxsb2NhdGlvblNpemUgPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbGxvY2F0aW9uU2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG9jYXRpb25TaXplKEludGVnZXIgbmV3QWxsb2NhdGlvblNpemUpCi0JewotCQlJbnRlZ2VyIG9sZEFsbG9jYXRpb25TaXplID0gYWxsb2NhdGlvblNpemU7Ci0JCWFsbG9jYXRpb25TaXplID0gbmV3QWxsb2NhdGlvblNpemU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19BTExPQ0FUSU9OX1NJWkUsIG9sZEFsbG9jYXRpb25TaXplLCBhbGxvY2F0aW9uU2l6ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fSU5JVElBTF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbFZhbHVlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19BTExPQ0FUSU9OX1NJWkU6Ci0JCQkJcmV0dXJuIGdldEFsbG9jYXRpb25TaXplKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19TRVFVRU5DRV9OQU1FOgotCQkJCXJldHVybiBnZXRTZXF1ZW5jZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fSU5JVElBTF9WQUxVRToKLQkJCQlzZXRJbml0aWFsVmFsdWUoKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfX0FMTE9DQVRJT05fU0laRToKLQkJCQlzZXRBbGxvY2F0aW9uU2l6ZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fU0VRVUVOQ0VfTkFNRToKLQkJCQlzZXRTZXF1ZW5jZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfX0lOSVRJQUxfVkFMVUU6Ci0JCQkJc2V0SW5pdGlhbFZhbHVlKElOSVRJQUxfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfX0FMTE9DQVRJT05fU0laRToKLQkJCQlzZXRBbGxvY2F0aW9uU2l6ZShBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX0lNUExfX1NFUVVFTkNFX05BTUU6Ci0JCQkJc2V0U2VxdWVuY2VOYW1lKFNFUVVFTkNFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19JTklUSUFMX1ZBTFVFOgotCQkJCXJldHVybiBJTklUSUFMX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBpbml0aWFsVmFsdWUgIT0gbnVsbCA6ICFJTklUSUFMX1ZBTFVFX0VERUZBVUxULmVxdWFscyhpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfSU1QTF9fQUxMT0NBVElPTl9TSVpFOgotCQkJCXJldHVybiBBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQgPT0gbnVsbCA/IGFsbG9jYXRpb25TaXplICE9IG51bGwgOiAhQUxMT0NBVElPTl9TSVpFX0VERUZBVUxULmVxdWFscyhhbGxvY2F0aW9uU2l6ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9JTVBMX19TRVFVRU5DRV9OQU1FOgotCQkJCXJldHVybiBTRVFVRU5DRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzZXF1ZW5jZU5hbWUgIT0gbnVsbCA6ICFTRVFVRU5DRV9OQU1FX0VERUZBVUxULmVxdWFscyhzZXF1ZW5jZU5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbml0aWFsVmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGluaXRpYWxWYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWxsb2NhdGlvblNpemU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsbG9jYXRpb25TaXplKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXF1ZW5jZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlcXVlbmNlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCUlET01Ob2RlIG5hbWVOb2RlID0gKElET01Ob2RlKSBET01VdGlsaXRpZXMuY2hpbGRBdHRyaWJ1dGVOb2RlKGdldE5vZGUoKSwgT3JtWG1sTWFwcGVyLk5BTUUpOwotCQlyZXR1cm4gKG5hbWVOb2RlID09IG51bGwpID8gZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDogYnVpbGRUZXh0UmFuZ2UobmFtZU5vZGUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmZTMxYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE9wdGlvbmFsIDxlbT5PcHRpb25hbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0Sm9pbkNvbHVtbnMgPGVtPkpvaW4gQ29sdW1uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBleHRlbmRzIFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW9uYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE9wdGlvbmFsKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nX09wdGlvbmFsKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldE9wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyNnZXRPcHRpb25hbCA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcHRpb25hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nX0pvaW5Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCk7Ci0KLX0gLy8gU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZS5qYXZhCmluZGV4IGRkY2RlOGQuLjViMmMxNDcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGFibGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRhYmxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNiArMTAsOSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTI3LDcgKzMwLDcgQEAKICAqIEBtb2RlbCBraW5kPSJjbGFzcyIKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIFhtbFRhYmxlIGV4dGVuZHMgQWJzdHJhY3RYbWxCYXNlVGFibGUKK3B1YmxpYyBjbGFzcyBYbWxUYWJsZSBleHRlbmRzIEFic3RyYWN0WG1sVGFibGUKIHsKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNDksNCArNTIsMjAgQEAKIAl7CiAJCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9UQUJMRTsKIAl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAorCQkJYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCksCisJCQlidWlsZFVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCiB9IC8vIFRhYmxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRhYmxlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRhYmxlR2VuZXJhdG9yLmphdmEKaW5kZXggNDliYzU2Yy4uOGFiMDRiYSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZUdlbmVyYXRvci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGFibGVHZW5lcmF0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDcgKzksMjEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKIAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0zNiwxMiArNTAsMzEzIEBACiAgKiA8L3A+CiAgKgogICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVGFibGVHZW5lcmF0b3IgZXh0ZW5kcyBYbWxHZW5lcmF0b3IKK3B1YmxpYyBjbGFzcyBYbWxUYWJsZUdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEdlbmVyYXRvcgogewogCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbFZhbHVlKCkgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluaXRpYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIElOSVRJQUxfVkFMVUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbFZhbHVlKCkgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluaXRpYWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEludGVnZXIgaW5pdGlhbFZhbHVlID0gSU5JVElBTF9WQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGxvY2F0aW9uU2l6ZSgpIDxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFsbG9jYXRpb25TaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgQUxMT0NBVElPTl9TSVpFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsbG9jYXRpb25TaXplKCkgPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWxsb2NhdGlvblNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyIGFsbG9jYXRpb25TaXplID0gQUxMT0NBVElPTl9TSVpFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhYmxlKCkgPGVtPlRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFibGUoKSA8ZW0+VGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHRhYmxlID0gVEFCTEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZygpIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDYXRhbG9nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGFsb2coKSA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2F0YWxvZygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBjYXRhbG9nID0gQ0FUQUxPR19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2hlbWEoKSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTY2hlbWEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2hlbWEoKSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTY2hlbWEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hID0gU0NIRU1BX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBrQ29sdW1uTmFtZSgpIDxlbT5QayBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGtDb2x1bW5OYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQS19DT0xVTU5fTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQa0NvbHVtbk5hbWUoKSA8ZW0+UGsgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBrQ29sdW1uTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBwa0NvbHVtbk5hbWUgPSBQS19DT0xVTU5fTkFNRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUNvbHVtbk5hbWUoKSA8ZW0+VmFsdWUgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlQ29sdW1uTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfQ09MVU1OX05BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVDb2x1bW5OYW1lKCkgPGVtPlZhbHVlIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRWYWx1ZUNvbHVtbk5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lID0gVkFMVUVfQ09MVU1OX05BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGtDb2x1bW5WYWx1ZSgpIDxlbT5QayBDb2x1bW4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBrQ29sdW1uVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBLX0NPTFVNTl9WQUxVRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQa0NvbHVtblZhbHVlKCkgPGVtPlBrIENvbHVtbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGtDb2x1bW5WYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBwa0NvbHVtblZhbHVlID0gUEtfQ09MVU1OX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pcXVlQ29uc3RyYWludHMoKSA8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFVuaXF1ZUNvbnN0cmFpbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sVGFibGVHZW5lcmF0b3IoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfVEFCTEVfR0VORVJBVE9SOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yXzJfMF9EZXNjcmlwdGlvbigpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKKwl7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pCisJeworCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcl9OYW1lKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQorCXsKKwkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOworCQluYW1lID0gbmV3TmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7CisJfQorCisJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtNTUsNyArMzcwLDEwIEBACiAJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlTdHJpbmcgZ2V0VGFibGUoKTsKKwlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkKKwl7CisJCXJldHVybiB0YWJsZTsKKwl9CiAKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0VGFibGUgPGVtPlRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC02NSw3ICszODMsMTMgQEAKIAkgKiBAc2VlICNnZXRUYWJsZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0VGFibGUoU3RyaW5nIHZhbHVlKTsKKwlwdWJsaWMgdm9pZCBzZXRUYWJsZShTdHJpbmcgbmV3VGFibGUpCisJeworCQlTdHJpbmcgb2xkVGFibGUgPSB0YWJsZTsKKwkJdGFibGUgPSBuZXdUYWJsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19UQUJMRSwgb2xkVGFibGUsIHRhYmxlKSk7CisJfQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtODEsNyArNDA1LDEwIEBACiAJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlTdHJpbmcgZ2V0Q2F0YWxvZygpOworCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpCisJeworCQlyZXR1cm4gY2F0YWxvZzsKKwl9CiAKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgpAQCAtOTEsNyArNDE4LDEzIEBACiAJICogQHNlZSAjZ2V0Q2F0YWxvZygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgdmFsdWUpOworCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIG5ld0NhdGFsb2cpCisJeworCQlTdHJpbmcgb2xkQ2F0YWxvZyA9IGNhdGFsb2c7CisJCWNhdGFsb2cgPSBuZXdDYXRhbG9nOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0NBVEFMT0csIG9sZENhdGFsb2csIGNhdGFsb2cpKTsKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTEwNyw3ICs0NDAsMTAgQEAKIAkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCiAJICogQGdlbmVyYXRlZAogCSAqLwotCVN0cmluZyBnZXRTY2hlbWEoKTsKKwlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpCisJeworCQlyZXR1cm4gc2NoZW1hOworCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTE3LDcgKzQ1MywxMyBAQAogCSAqIEBzZWUgI2dldFNjaGVtYSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0U2NoZW1hKFN0cmluZyB2YWx1ZSk7CisJcHVibGljIHZvaWQgc2V0U2NoZW1hKFN0cmluZyBuZXdTY2hlbWEpCisJeworCQlTdHJpbmcgb2xkU2NoZW1hID0gc2NoZW1hOworCQlzY2hlbWEgPSBuZXdTY2hlbWE7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fU0NIRU1BLCBvbGRTY2hlbWEsIHNjaGVtYSkpOworCX0KIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBrIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMzMsNyArNDc1LDEwIEBACiAJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlTdHJpbmcgZ2V0UGtDb2x1bW5OYW1lKCk7CisJcHVibGljIFN0cmluZyBnZXRQa0NvbHVtbk5hbWUoKQorCXsKKwkJcmV0dXJuIHBrQ29sdW1uTmFtZTsKKwl9CiAKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0UGtDb2x1bW5OYW1lIDxlbT5QayBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTQzLDcgKzQ4OCwxMyBAQAogCSAqIEBzZWUgI2dldFBrQ29sdW1uTmFtZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0UGtDb2x1bW5OYW1lKFN0cmluZyB2YWx1ZSk7CisJcHVibGljIHZvaWQgc2V0UGtDb2x1bW5OYW1lKFN0cmluZyBuZXdQa0NvbHVtbk5hbWUpCisJeworCQlTdHJpbmcgb2xkUGtDb2x1bW5OYW1lID0gcGtDb2x1bW5OYW1lOworCQlwa0NvbHVtbk5hbWUgPSBuZXdQa0NvbHVtbk5hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX05BTUUsIG9sZFBrQ29sdW1uTmFtZSwgcGtDb2x1bW5OYW1lKSk7CisJfQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTE1OSw3ICs1MTAsMTAgQEAKIAkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCiAJICogQGdlbmVyYXRlZAogCSAqLwotCVN0cmluZyBnZXRWYWx1ZUNvbHVtbk5hbWUoKTsKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlQ29sdW1uTmFtZSgpCisJeworCQlyZXR1cm4gdmFsdWVDb2x1bW5OYW1lOworCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRWYWx1ZUNvbHVtbk5hbWUgPGVtPlZhbHVlIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xNjksNyArNTIzLDEzIEBACiAJICogQHNlZSAjZ2V0VmFsdWVDb2x1bW5OYW1lKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0Jdm9pZCBzZXRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIHZhbHVlKTsKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIG5ld1ZhbHVlQ29sdW1uTmFtZSkKKwl7CisJCVN0cmluZyBvbGRWYWx1ZUNvbHVtbk5hbWUgPSB2YWx1ZUNvbHVtbk5hbWU7CisJCXZhbHVlQ29sdW1uTmFtZSA9IG5ld1ZhbHVlQ29sdW1uTmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19WQUxVRV9DT0xVTU5fTkFNRSwgb2xkVmFsdWVDb2x1bW5OYW1lLCB2YWx1ZUNvbHVtbk5hbWUpKTsKKwl9CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QayBDb2x1bW4gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTE4NSw3ICs1NDUsMTAgQEAKIAkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCiAJICogQGdlbmVyYXRlZAogCSAqLwotCVN0cmluZyBnZXRQa0NvbHVtblZhbHVlKCk7CisJcHVibGljIFN0cmluZyBnZXRQa0NvbHVtblZhbHVlKCkKKwl7CisJCXJldHVybiBwa0NvbHVtblZhbHVlOworCX0KIAogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRQa0NvbHVtblZhbHVlIDxlbT5QayBDb2x1bW4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTE5NSw3ICs1NTgsODMgQEAKIAkgKiBAc2VlICNnZXRQa0NvbHVtblZhbHVlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0Jdm9pZCBzZXRQa0NvbHVtblZhbHVlKFN0cmluZyB2YWx1ZSk7CisJcHVibGljIHZvaWQgc2V0UGtDb2x1bW5WYWx1ZShTdHJpbmcgbmV3UGtDb2x1bW5WYWx1ZSkKKwl7CisJCVN0cmluZyBvbGRQa0NvbHVtblZhbHVlID0gcGtDb2x1bW5WYWx1ZTsKKwkJcGtDb2x1bW5WYWx1ZSA9IG5ld1BrQ29sdW1uVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX1ZBTFVFLCBvbGRQa0NvbHVtblZhbHVlLCBwa0NvbHVtblZhbHVlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdGlhbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJbml0aWFsVmFsdWUoSW50ZWdlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcl9Jbml0aWFsVmFsdWUoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEludGVnZXIgZ2V0SW5pdGlhbFZhbHVlKCkKKwl7CisJCXJldHVybiBpbml0aWFsVmFsdWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldEluaXRpYWxWYWx1ZSA8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SW5pdGlhbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SW5pdGlhbFZhbHVlKEludGVnZXIgbmV3SW5pdGlhbFZhbHVlKQorCXsKKwkJSW50ZWdlciBvbGRJbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWU7CisJCWluaXRpYWxWYWx1ZSA9IG5ld0luaXRpYWxWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFLCBvbGRJbml0aWFsVmFsdWUsIGluaXRpYWxWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsbG9jYXRpb24gU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcl9BbGxvY2F0aW9uU2l6ZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpCisJeworCQlyZXR1cm4gYWxsb2NhdGlvblNpemU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldEFsbG9jYXRpb25TaXplIDxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0QWxsb2NhdGlvblNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyIG5ld0FsbG9jYXRpb25TaXplKQorCXsKKwkJSW50ZWdlciBvbGRBbGxvY2F0aW9uU2l6ZSA9IGFsbG9jYXRpb25TaXplOworCQlhbGxvY2F0aW9uU2l6ZSA9IG5ld0FsbG9jYXRpb25TaXplOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRSwgb2xkQWxsb2NhdGlvblNpemUsIGFsbG9jYXRpb25TaXplKSk7CisJfQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTIxMSw2ICs2NTAsMzAxIEBACiAJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PiBnZXRVbmlxdWVDb25zdHJhaW50cygpOworCXB1YmxpYyBFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PiBnZXRVbmlxdWVDb25zdHJhaW50cygpCisJeworCQlpZiAodW5pcXVlQ29uc3RyYWludHMgPT0gbnVsbCkKKwkJeworCQkJdW5pcXVlQ29uc3RyYWludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4oWG1sVW5pcXVlQ29uc3RyYWludC5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFMpOworCQl9CisJCXJldHVybiB1bmlxdWVDb25zdHJhaW50czsKKwl9CiAKLX0gLy8gVGFibGVHZW5lcmF0b3IKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRVbmlxdWVDb25zdHJhaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX05BTUU6CisJCQkJcmV0dXJuIGdldE5hbWUoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFOgorCQkJCXJldHVybiBnZXRJbml0aWFsVmFsdWUoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkU6CisJCQkJcmV0dXJuIGdldEFsbG9jYXRpb25TaXplKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fVEFCTEU6CisJCQkJcmV0dXJuIGdldFRhYmxlKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fQ0FUQUxPRzoKKwkJCQlyZXR1cm4gZ2V0Q2F0YWxvZygpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1NDSEVNQToKKwkJCQlyZXR1cm4gZ2V0U2NoZW1hKCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX05BTUU6CisJCQkJcmV0dXJuIGdldFBrQ29sdW1uTmFtZSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1ZBTFVFX0NPTFVNTl9OQU1FOgorCQkJCXJldHVybiBnZXRWYWx1ZUNvbHVtbk5hbWUoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUU6CisJCQkJcmV0dXJuIGdldFBrQ29sdW1uVmFsdWUoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFM6CisJCQkJcmV0dXJuIGdldFVuaXF1ZUNvbnN0cmFpbnRzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0RFU0NSSVBUSU9OOgorCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19OQU1FOgorCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUU6CisJCQkJc2V0SW5pdGlhbFZhbHVlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFOgorCQkJCXNldEFsbG9jYXRpb25TaXplKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fVEFCTEU6CisJCQkJc2V0VGFibGUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0NBVEFMT0c6CisJCQkJc2V0Q2F0YWxvZygoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fU0NIRU1BOgorCQkJCXNldFNjaGVtYSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX05BTUU6CisJCQkJc2V0UGtDb2x1bW5OYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19WQUxVRV9DT0xVTU5fTkFNRToKKwkJCQlzZXRWYWx1ZUNvbHVtbk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9WQUxVRToKKwkJCQlzZXRQa0NvbHVtblZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFM6CisJCQkJZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5jbGVhcigpOworCQkJCWdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxVbmlxdWVDb25zdHJhaW50PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0RFU0NSSVBUSU9OOgorCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fTkFNRToKKwkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFOgorCQkJCXNldEluaXRpYWxWYWx1ZShJTklUSUFMX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFOgorCQkJCXNldEFsbG9jYXRpb25TaXplKEFMTE9DQVRJT05fU0laRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1RBQkxFOgorCQkJCXNldFRhYmxlKFRBQkxFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fQ0FUQUxPRzoKKwkJCQlzZXRDYXRhbG9nKENBVEFMT0dfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19TQ0hFTUE6CisJCQkJc2V0U2NoZW1hKFNDSEVNQV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9OQU1FOgorCQkJCXNldFBrQ29sdW1uTmFtZShQS19DT0xVTU5fTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1ZBTFVFX0NPTFVNTl9OQU1FOgorCQkJCXNldFZhbHVlQ29sdW1uTmFtZShWQUxVRV9DT0xVTU5fTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9WQUxVRToKKwkJCQlzZXRQa0NvbHVtblZhbHVlKFBLX0NPTFVNTl9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1VOSVFVRV9DT05TVFJBSU5UUzoKKwkJCQlnZXRVbmlxdWVDb25zdHJhaW50cygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19OQU1FOgorCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRToKKwkJCQlyZXR1cm4gSU5JVElBTF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gaW5pdGlhbFZhbHVlICE9IG51bGwgOiAhSU5JVElBTF9WQUxVRV9FREVGQVVMVC5lcXVhbHMoaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkU6CisJCQkJcmV0dXJuIEFMTE9DQVRJT05fU0laRV9FREVGQVVMVCA9PSBudWxsID8gYWxsb2NhdGlvblNpemUgIT0gbnVsbCA6ICFBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQuZXF1YWxzKGFsbG9jYXRpb25TaXplKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19UQUJMRToKKwkJCQlyZXR1cm4gVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IHRhYmxlICE9IG51bGwgOiAhVEFCTEVfRURFRkFVTFQuZXF1YWxzKHRhYmxlKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19DQVRBTE9HOgorCQkJCXJldHVybiBDQVRBTE9HX0VERUZBVUxUID09IG51bGwgPyBjYXRhbG9nICE9IG51bGwgOiAhQ0FUQUxPR19FREVGQVVMVC5lcXVhbHMoY2F0YWxvZyk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fU0NIRU1BOgorCQkJCXJldHVybiBTQ0hFTUFfRURFRkFVTFQgPT0gbnVsbCA/IHNjaGVtYSAhPSBudWxsIDogIVNDSEVNQV9FREVGQVVMVC5lcXVhbHMoc2NoZW1hKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fTkFNRToKKwkJCQlyZXR1cm4gUEtfQ09MVU1OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBrQ29sdW1uTmFtZSAhPSBudWxsIDogIVBLX0NPTFVNTl9OQU1FX0VERUZBVUxULmVxdWFscyhwa0NvbHVtbk5hbWUpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1ZBTFVFX0NPTFVNTl9OQU1FOgorCQkJCXJldHVybiBWQUxVRV9DT0xVTU5fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVDb2x1bW5OYW1lICE9IG51bGwgOiAhVkFMVUVfQ09MVU1OX05BTUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlQ29sdW1uTmFtZSk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX1ZBTFVFOgorCQkJCXJldHVybiBQS19DT0xVTU5fVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHBrQ29sdW1uVmFsdWUgIT0gbnVsbCA6ICFQS19DT0xVTU5fVkFMVUVfRURFRkFVTFQuZXF1YWxzKHBrQ29sdW1uVmFsdWUpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1VOSVFVRV9DT05TVFJBSU5UUzoKKwkJCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludHMgIT0gbnVsbCAmJiAhdW5pcXVlQ29uc3RyYWludHMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOworCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKG5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGluaXRpYWxWYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQoaW5pdGlhbFZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBhbGxvY2F0aW9uU2l6ZTogIik7CisJCXJlc3VsdC5hcHBlbmQoYWxsb2NhdGlvblNpemUpOworCQlyZXN1bHQuYXBwZW5kKCIsIHRhYmxlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh0YWJsZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgY2F0YWxvZzogIik7CisJCXJlc3VsdC5hcHBlbmQoY2F0YWxvZyk7CisJCXJlc3VsdC5hcHBlbmQoIiwgc2NoZW1hOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChzY2hlbWEpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBrQ29sdW1uTmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQocGtDb2x1bW5OYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZUNvbHVtbk5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHZhbHVlQ29sdW1uTmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgcGtDb2x1bW5WYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQocGtDb2x1bW5WYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLk5BTUUpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRUYWJsZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQa0NvbHVtbk5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZFZhbHVlQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUGtDb2x1bW5WYWx1ZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSW5pdGlhbFZhbHVlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBbGxvY2F0aW9uU2l6ZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCisJCQlYbWxVbmlxdWVDb25zdHJhaW50LmJ1aWxkVHJhbnNsYXRvcihKUEEuVU5JUVVFX0NPTlNUUkFJTlQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yX1VuaXF1ZUNvbnN0cmFpbnRzKCkpCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvcl9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRhYmxlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5UQUJMRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfVGFibGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQ0FUQUxPRywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfQ2F0YWxvZygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlNDSEVNQSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfU2NoZW1hKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFBrQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuUEtfQ09MVU1OX05BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yX1BrQ29sdW1uTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRWYWx1ZUNvbHVtbk5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlZBTFVFX0NPTFVNTl9OQU1FLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUYWJsZUdlbmVyYXRvcl9WYWx1ZUNvbHVtbk5hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUGtDb2x1bW5WYWx1ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuUEtfQ09MVU1OX1ZBTFVFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUYWJsZUdlbmVyYXRvcl9Qa0NvbHVtblZhbHVlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEluaXRpYWxWYWx1ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuSU5JVElBTF9WQUxVRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yX0luaXRpYWxWYWx1ZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBbGxvY2F0aW9uU2l6ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQUxMT0NBVElPTl9TSVpFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JfQWxsb2NhdGlvblNpemUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkRFU0NSSVBUSU9OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yXzJfMF9EZXNjcmlwdGlvbigpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRhYmxlR2VuZXJhdG9ySW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZUdlbmVyYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiMTVmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRhYmxlR2VuZXJhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm0udHJhbnNsYXRvcnMuT3JtWG1sTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuZW1mLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvckltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sVGFibGVHZW5lcmF0b3JJbXBsIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sVGFibGVHZW5lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsVmFsdWUoKSA8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgSU5JVElBTF9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsVmFsdWUoKSA8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBpbml0aWFsVmFsdWUgPSBJTklUSUFMX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsbG9jYXRpb25TaXplKCkgPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxsb2NhdGlvblNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWxsb2NhdGlvblNpemUoKSA8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbGxvY2F0aW9uU2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgYWxsb2NhdGlvblNpemUgPSBBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFibGUoKSA8ZW0+VGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZSgpIDxlbT5UYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFibGUgPSBUQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRhbG9nKCkgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhdGFsb2coKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZygpIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNhdGFsb2cgPSBDQVRBTE9HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzY2hlbWEgPSBTQ0hFTUFfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGtDb2x1bW5OYW1lKCkgPGVtPlBrIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQa0NvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBLX0NPTFVNTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBrQ29sdW1uTmFtZSgpIDxlbT5QayBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGtDb2x1bW5OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBrQ29sdW1uTmFtZSA9IFBLX0NPTFVNTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlQ29sdW1uTmFtZSgpIDxlbT5WYWx1ZSBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVDb2x1bW5OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9DT0xVTU5fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUNvbHVtbk5hbWUoKSA8ZW0+VmFsdWUgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlQ29sdW1uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUgPSBWQUxVRV9DT0xVTU5fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQa0NvbHVtblZhbHVlKCkgPGVtPlBrIENvbHVtbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGtDb2x1bW5WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtfQ09MVU1OX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBrQ29sdW1uVmFsdWUoKSA8ZW0+UGsgQ29sdW1uIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQa0NvbHVtblZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBrQ29sdW1uVmFsdWUgPSBQS19DT0xVTU5fVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmlxdWVDb25zdHJhaW50cygpIDxlbT5VbmlxdWUgQ29uc3RyYWludHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pcXVlQ29uc3RyYWludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUYWJsZUdlbmVyYXRvckltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcl9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9ySW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYWJsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcl9UYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkKLQl7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3JJbXBsI2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFibGUoU3RyaW5nIG5ld1RhYmxlKQotCXsKLQkJU3RyaW5nIG9sZFRhYmxlID0gdGFibGU7Ci0JCXRhYmxlID0gbmV3VGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19UQUJMRSwgb2xkVGFibGUsIHRhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXRhbG9nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yX0NhdGFsb2coKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkKLQl7Ci0JCXJldHVybiBjYXRhbG9nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvckltcGwjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIG5ld0NhdGFsb2cpCi0JewotCQlTdHJpbmcgb2xkQ2F0YWxvZyA9IGNhdGFsb2c7Ci0JCWNhdGFsb2cgPSBuZXdDYXRhbG9nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fQ0FUQUxPRywgb2xkQ2F0YWxvZywgY2F0YWxvZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NoZW1hKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yX1NjaGVtYSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpCi0JewotCQlyZXR1cm4gc2NoZW1hOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvckltcGwjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2NoZW1hKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NoZW1hKFN0cmluZyBuZXdTY2hlbWEpCi0JewotCQlTdHJpbmcgb2xkU2NoZW1hID0gc2NoZW1hOwotCQlzY2hlbWEgPSBuZXdTY2hlbWE7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19TQ0hFTUEsIG9sZFNjaGVtYSwgc2NoZW1hKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGsgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBrIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBrIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQa0NvbHVtbk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JfUGtDb2x1bW5OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGtDb2x1bW5OYW1lKCkKLQl7Ci0JCXJldHVybiBwa0NvbHVtbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9ySW1wbCNnZXRQa0NvbHVtbk5hbWUgPGVtPlBrIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QayBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGtDb2x1bW5OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGtDb2x1bW5OYW1lKFN0cmluZyBuZXdQa0NvbHVtbk5hbWUpCi0JewotCQlTdHJpbmcgb2xkUGtDb2x1bW5OYW1lID0gcGtDb2x1bW5OYW1lOwotCQlwa0NvbHVtbk5hbWUgPSBuZXdQa0NvbHVtbk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19QS19DT0xVTU5fTkFNRSwgb2xkUGtDb2x1bW5OYW1lLCBwa0NvbHVtbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWUgQ29sdW1uIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgQ29sdW1uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlQ29sdW1uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcl9WYWx1ZUNvbHVtbk5hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZUNvbHVtbk5hbWUoKQotCXsKLQkJcmV0dXJuIHZhbHVlQ29sdW1uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3JJbXBsI2dldFZhbHVlQ29sdW1uTmFtZSA8ZW0+VmFsdWUgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZUNvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIG5ld1ZhbHVlQ29sdW1uTmFtZSkKLQl7Ci0JCVN0cmluZyBvbGRWYWx1ZUNvbHVtbk5hbWUgPSB2YWx1ZUNvbHVtbk5hbWU7Ci0JCXZhbHVlQ29sdW1uTmFtZSA9IG5ld1ZhbHVlQ29sdW1uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1ZBTFVFX0NPTFVNTl9OQU1FLCBvbGRWYWx1ZUNvbHVtbk5hbWUsIHZhbHVlQ29sdW1uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBrIENvbHVtbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGsgQ29sdW1uIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBrIENvbHVtbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGtDb2x1bW5WYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcl9Qa0NvbHVtblZhbHVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGtDb2x1bW5WYWx1ZSgpCi0JewotCQlyZXR1cm4gcGtDb2x1bW5WYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3JJbXBsI2dldFBrQ29sdW1uVmFsdWUgPGVtPlBrIENvbHVtbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGsgQ29sdW1uIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQa0NvbHVtblZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGtDb2x1bW5WYWx1ZShTdHJpbmcgbmV3UGtDb2x1bW5WYWx1ZSkKLQl7Ci0JCVN0cmluZyBvbGRQa0NvbHVtblZhbHVlID0gcGtDb2x1bW5WYWx1ZTsKLQkJcGtDb2x1bW5WYWx1ZSA9IG5ld1BrQ29sdW1uVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19QS19DT0xVTU5fVkFMVUUsIG9sZFBrQ29sdW1uVmFsdWUsIHBrQ29sdW1uVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0aWFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0aWFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluaXRpYWxWYWx1ZShJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yX0luaXRpYWxWYWx1ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJbml0aWFsVmFsdWUoKQotCXsKLQkJcmV0dXJuIGluaXRpYWxWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3JJbXBsI2dldEluaXRpYWxWYWx1ZSA8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5pdGlhbFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFZhbHVlKEludGVnZXIgbmV3SW5pdGlhbFZhbHVlKQotCXsKLQkJSW50ZWdlciBvbGRJbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWU7Ci0JCWluaXRpYWxWYWx1ZSA9IG5ld0luaXRpYWxWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX0lOSVRJQUxfVkFMVUUsIG9sZEluaXRpYWxWYWx1ZSwgaW5pdGlhbFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWxsb2NhdGlvbiBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yX0FsbG9jYXRpb25TaXplKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldEFsbG9jYXRpb25TaXplKCkKLQl7Ci0JCXJldHVybiBhbGxvY2F0aW9uU2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3JJbXBsI2dldEFsbG9jYXRpb25TaXplIDxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWxsb2NhdGlvblNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyIG5ld0FsbG9jYXRpb25TaXplKQotCXsKLQkJSW50ZWdlciBvbGRBbGxvY2F0aW9uU2l6ZSA9IGFsbG9jYXRpb25TaXplOwotCQlhbGxvY2F0aW9uU2l6ZSA9IG5ld0FsbG9jYXRpb25TaXplOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fQUxMT0NBVElPTl9TSVpFLCBvbGRBbGxvY2F0aW9uU2l6ZSwgYWxsb2NhdGlvblNpemUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmlxdWUgQ29uc3RyYWludHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlxdWUgQ29uc3RyYWludHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcl9VbmlxdWVDb25zdHJhaW50cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4gZ2V0VW5pcXVlQ29uc3RyYWludHMoKQotCXsKLQkJaWYgKHVuaXF1ZUNvbnN0cmFpbnRzID09IG51bGwpCi0JCXsKLQkJCXVuaXF1ZUNvbnN0cmFpbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFVuaXF1ZUNvbnN0cmFpbnQ+KFhtbFVuaXF1ZUNvbnN0cmFpbnQuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19VTklRVUVfQ09OU1RSQUlOVFMpOwotCQl9Ci0JCXJldHVybiB1bmlxdWVDb25zdHJhaW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1VOSVFVRV9DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFVuaXF1ZUNvbnN0cmFpbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19JTklUSUFMX1ZBTFVFOgotCQkJCXJldHVybiBnZXRJbml0aWFsVmFsdWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX0FMTE9DQVRJT05fU0laRToKLQkJCQlyZXR1cm4gZ2V0QWxsb2NhdGlvblNpemUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1RBQkxFOgotCQkJCXJldHVybiBnZXRUYWJsZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fQ0FUQUxPRzoKLQkJCQlyZXR1cm4gZ2V0Q2F0YWxvZygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fU0NIRU1BOgotCQkJCXJldHVybiBnZXRTY2hlbWEoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1BLX0NPTFVNTl9OQU1FOgotCQkJCXJldHVybiBnZXRQa0NvbHVtbk5hbWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1ZBTFVFX0NPTFVNTl9OQU1FOgotCQkJCXJldHVybiBnZXRWYWx1ZUNvbHVtbk5hbWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1BLX0NPTFVNTl9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0UGtDb2x1bW5WYWx1ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fVU5JUVVFX0NPTlNUUkFJTlRTOgotCQkJCXJldHVybiBnZXRVbmlxdWVDb25zdHJhaW50cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19JTklUSUFMX1ZBTFVFOgotCQkJCXNldEluaXRpYWxWYWx1ZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fQUxMT0NBVElPTl9TSVpFOgotCQkJCXNldEFsbG9jYXRpb25TaXplKChJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19UQUJMRToKLQkJCQlzZXRUYWJsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19DQVRBTE9HOgotCQkJCXNldENhdGFsb2coKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fU0NIRU1BOgotCQkJCXNldFNjaGVtYSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19QS19DT0xVTU5fTkFNRToKLQkJCQlzZXRQa0NvbHVtbk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fVkFMVUVfQ09MVU1OX05BTUU6Ci0JCQkJc2V0VmFsdWVDb2x1bW5OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1BLX0NPTFVNTl9WQUxVRToKLQkJCQlzZXRQa0NvbHVtblZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1VOSVFVRV9DT05TVFJBSU5UUzoKLQkJCQlnZXRVbmlxdWVDb25zdHJhaW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFVuaXF1ZUNvbnN0cmFpbnQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fSU5JVElBTF9WQUxVRToKLQkJCQlzZXRJbml0aWFsVmFsdWUoSU5JVElBTF9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fQUxMT0NBVElPTl9TSVpFOgotCQkJCXNldEFsbG9jYXRpb25TaXplKEFMTE9DQVRJT05fU0laRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fVEFCTEU6Ci0JCQkJc2V0VGFibGUoVEFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX0NBVEFMT0c6Ci0JCQkJc2V0Q2F0YWxvZyhDQVRBTE9HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19TQ0hFTUE6Ci0JCQkJc2V0U2NoZW1hKFNDSEVNQV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fUEtfQ09MVU1OX05BTUU6Ci0JCQkJc2V0UGtDb2x1bW5OYW1lKFBLX0NPTFVNTl9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19WQUxVRV9DT0xVTU5fTkFNRToKLQkJCQlzZXRWYWx1ZUNvbHVtbk5hbWUoVkFMVUVfQ09MVU1OX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1BLX0NPTFVNTl9WQUxVRToKLQkJCQlzZXRQa0NvbHVtblZhbHVlKFBLX0NPTFVNTl9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fVU5JUVVFX0NPTlNUUkFJTlRTOgotCQkJCWdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fSU5JVElBTF9WQUxVRToKLQkJCQlyZXR1cm4gSU5JVElBTF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gaW5pdGlhbFZhbHVlICE9IG51bGwgOiAhSU5JVElBTF9WQUxVRV9FREVGQVVMVC5lcXVhbHMoaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX0FMTE9DQVRJT05fU0laRToKLQkJCQlyZXR1cm4gQUxMT0NBVElPTl9TSVpFX0VERUZBVUxUID09IG51bGwgPyBhbGxvY2F0aW9uU2l6ZSAhPSBudWxsIDogIUFMTE9DQVRJT05fU0laRV9FREVGQVVMVC5lcXVhbHMoYWxsb2NhdGlvblNpemUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fVEFCTEU6Ci0JCQkJcmV0dXJuIFRBQkxFX0VERUZBVUxUID09IG51bGwgPyB0YWJsZSAhPSBudWxsIDogIVRBQkxFX0VERUZBVUxULmVxdWFscyh0YWJsZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19DQVRBTE9HOgotCQkJCXJldHVybiBDQVRBTE9HX0VERUZBVUxUID09IG51bGwgPyBjYXRhbG9nICE9IG51bGwgOiAhQ0FUQUxPR19FREVGQVVMVC5lcXVhbHMoY2F0YWxvZyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19TQ0hFTUE6Ci0JCQkJcmV0dXJuIFNDSEVNQV9FREVGQVVMVCA9PSBudWxsID8gc2NoZW1hICE9IG51bGwgOiAhU0NIRU1BX0VERUZBVUxULmVxdWFscyhzY2hlbWEpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfSU1QTF9fUEtfQ09MVU1OX05BTUU6Ci0JCQkJcmV0dXJuIFBLX0NPTFVNTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwa0NvbHVtbk5hbWUgIT0gbnVsbCA6ICFQS19DT0xVTU5fTkFNRV9FREVGQVVMVC5lcXVhbHMocGtDb2x1bW5OYW1lKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX0lNUExfX1ZBTFVFX0NPTFVNTl9OQU1FOgotCQkJCXJldHVybiBWQUxVRV9DT0xVTU5fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVDb2x1bW5OYW1lICE9IG51bGwgOiAhVkFMVUVfQ09MVU1OX05BTUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlQ29sdW1uTmFtZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19QS19DT0xVTU5fVkFMVUU6Ci0JCQkJcmV0dXJuIFBLX0NPTFVNTl9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gcGtDb2x1bW5WYWx1ZSAhPSBudWxsIDogIVBLX0NPTFVNTl9WQUxVRV9FREVGQVVMVC5lcXVhbHMocGtDb2x1bW5WYWx1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9JTVBMX19VTklRVUVfQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnRzICE9IG51bGwgJiYgIXVuaXF1ZUNvbnN0cmFpbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW5pdGlhbFZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbml0aWFsVmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsbG9jYXRpb25TaXplOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbGxvY2F0aW9uU2l6ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXRhbG9nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXRhbG9nKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzY2hlbWE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNjaGVtYSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGtDb2x1bW5OYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwa0NvbHVtbk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlQ29sdW1uTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVDb2x1bW5OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwa0NvbHVtblZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwa0NvbHVtblZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJSURPTU5vZGUgbmFtZU5vZGUgPSAoSURPTU5vZGUpIERPTVV0aWxpdGllcy5jaGlsZEF0dHJpYnV0ZU5vZGUoZ2V0Tm9kZSgpLCBPcm1YbWxNYXBwZXIuTkFNRSk7Ci0JCXJldHVybiAobmFtZU5vZGUgPT0gbnVsbCkgPyBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgOiBidWlsZFRleHRSYW5nZShuYW1lTm9kZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRyYW5zaWVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2llbnQuamF2YQppbmRleCBhZWFlNTYzLi41YmU5YzAzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRyYW5zaWVudC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHJhbnNpZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw2ICs5LDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTIzLDkgKzI4LDUwIEBACiAgKgogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVHJhbnNpZW50KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGludGVyZmFjZSBYbWxUcmFuc2llbnQgZXh0ZW5kcyBYbWxBdHRyaWJ1dGVNYXBwaW5nCitwdWJsaWMgY2xhc3MgWG1sVHJhbnNpZW50IGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nCiB7Ci19IC8vIFRyYW5zaWVudAorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxUcmFuc2llbnQoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfVFJBTlNJRU5UOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCisJCQllbGVtZW50TmFtZSwKKwkJCXN0cnVjdHVyYWxGZWF0dXJlLAorCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKKwkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKKwkJKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHJhbnNpZW50SW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2llbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYTk1NzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2llbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRyYW5zaWVudDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVHJhbnNpZW50SW1wbCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxUcmFuc2llbnRJbXBsIGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgWG1sVHJhbnNpZW50Ci17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFRyYW5zaWVudEltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfVFJBTlNJRU5UX0lNUEw7Ci0JfQotCi19IC8vIFRyYW5zaWVudApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxUeXBlTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YTcxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFR5cGVNYXBwaW5nLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBUeXBlIE1hcHBpbmc8L2I+PC9lbT4nLgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0TWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZyNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZyNnZXRBdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUeXBlTWFwcGluZygpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sVHlwZU1hcHBpbmcgZXh0ZW5kcyBYbWxBY2Nlc3NIb2xkZXIKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENsYXNzTmFtZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUeXBlTWFwcGluZ19DbGFzc05hbWUoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRDbGFzc05hbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZyNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFR5cGVNYXBwaW5nX01ldGFkYXRhQ29tcGxldGUoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCUJvb2xlYW4gZ2V0TWV0YWRhdGFDb21wbGV0ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nI2dldE1ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TWV0YWRhdGFDb21wbGV0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TWV0YWRhdGFDb21wbGV0ZShCb29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVHlwZU1hcHBpbmdfRGVzY3JpcHRpb24oKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEF0dHJpYnV0ZXMoQXR0cmlidXRlcykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0QXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVzIHZhbHVlKTsKKwkKKwlUZXh0UmFuZ2UgZ2V0Q2xhc3NUZXh0UmFuZ2UoKTsKKworCVRleHRSYW5nZSBnZXRBdHRyaWJ1dGVzVGV4dFJhbmdlKCk7CisKKwkvL1RPRE8gbm90IGhhcHB5IHdpdGggdGhpcywgb3IgdGhlIGNvcnJlc3BvbmRpbmcgb25lIGluIFhtbEF0dHJpYnV0ZU1hcHBpbmcKKwlTdHJpbmcgZ2V0TWFwcGluZ0tleSgpOworfSAvLyBYbWxUeXBlTWFwcGluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxVbmlxdWVDb25zdHJhaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFVuaXF1ZUNvbnN0cmFpbnQuamF2YQppbmRleCA1NTNiMjZmLi5iNmM2NjcyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFVuaXF1ZUNvbnN0cmFpbnQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFVuaXF1ZUNvbnN0cmFpbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDEzICs5LDIzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sVW5pcXVlQ29uc3RyYWludF8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVW5pcXVlIENvbnN0cmFpbnQ8L2I+PC9lbT4nLgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnQ8L2I+PC9lbT4nLgogICogCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwpAQCAtMzIsMTMgKzQyLDk2IEBACiAgKiA8L3A+CiAgKgogICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxVbmlxdWVDb25zdHJhaW50KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGludGVyZmFjZSBYbWxVbmlxdWVDb25zdHJhaW50IGV4dGVuZHMgSnBhRU9iamVjdAorcHVibGljIGNsYXNzIFhtbFVuaXF1ZUNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxVbmlxdWVDb25zdHJhaW50XzJfMAogewogCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW5OYW1lcygpIDxlbT5Db2x1bW4gTmFtZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29sdW1uTmFtZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IGNvbHVtbk5hbWVzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbFVuaXF1ZUNvbnN0cmFpbnQoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfVU5JUVVFX0NPTlNUUkFJTlQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wX05hbWUoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkKKwl7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQorCXsKKwkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOworCQluYW1lID0gbmV3TmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKKwl9CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW4gTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgogCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNTIsNiArMTQ1LDEzMSBAQAogCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Q29sdW1uTmFtZXMoKTsKKwlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRDb2x1bW5OYW1lcygpCisJeworCQlpZiAoY29sdW1uTmFtZXMgPT0gbnVsbCkKKwkJeworCQkJY29sdW1uTmFtZXMgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX1VOSVFVRV9DT05TVFJBSU5UX19DT0xVTU5fTkFNRVMpOworCQl9CisJCXJldHVybiBjb2x1bW5OYW1lczsKKwl9CiAKLX0gLy8gWG1sVW5pcXVlQ29uc3RyYWludAorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9VTklRVUVfQ09OU1RSQUlOVF9fTkFNRToKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9VTklRVUVfQ09OU1RSQUlOVF9fQ09MVU1OX05BTUVTOgorCQkJCXJldHVybiBnZXRDb2x1bW5OYW1lcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfX05BTUU6CisJCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1VOSVFVRV9DT05TVFJBSU5UX19DT0xVTU5fTkFNRVM6CisJCQkJZ2V0Q29sdW1uTmFtZXMoKS5jbGVhcigpOworCQkJCWdldENvbHVtbk5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1VOSVFVRV9DT05TVFJBSU5UX19OQU1FOgorCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9VTklRVUVfQ09OU1RSQUlOVF9fQ09MVU1OX05BTUVTOgorCQkJCWdldENvbHVtbk5hbWVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9VTklRVUVfQ09OU1RSQUlOVF9fTkFNRToKKwkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9VTklRVUVfQ09OU1RSQUlOVF9fQ09MVU1OX05BTUVTOgorCQkJCXJldHVybiBjb2x1bW5OYW1lcyAhPSBudWxsICYmICFjb2x1bW5OYW1lcy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKG5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNvbHVtbk5hbWVzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChjb2x1bW5OYW1lcyk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKwkKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSwKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuTkFNRSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wX05hbWUoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtbk5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkNPTFVNTl9OQU1FLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxVbmlxdWVDb25zdHJhaW50X0NvbHVtbk5hbWVzKCkpOworCX0JCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFVuaXF1ZUNvbnN0cmFpbnRJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFVuaXF1ZUNvbnN0cmFpbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZWExOGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxVbmlxdWVDb25zdHJhaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sVW5pcXVlQ29uc3RyYWludAotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbHVtbk5hbWVzKCkgPGVtPkNvbHVtbiBOYW1lczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW5OYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gY29sdW1uTmFtZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfSU1QTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW4gTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbiBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbiBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFVuaXF1ZUNvbnN0cmFpbnRfQ29sdW1uTmFtZXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldENvbHVtbk5hbWVzKCkKLQl7Ci0JCWlmIChjb2x1bW5OYW1lcyA9PSBudWxsKQotCQl7Ci0JCQljb2x1bW5OYW1lcyA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfSU1QTF9fQ09MVU1OX05BTUVTKTsKLQkJfQotCQlyZXR1cm4gY29sdW1uTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1VOSVFVRV9DT05TVFJBSU5UX0lNUExfX0NPTFVNTl9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0Q29sdW1uTmFtZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1VOSVFVRV9DT05TVFJBSU5UX0lNUExfX0NPTFVNTl9OQU1FUzoKLQkJCQlnZXRDb2x1bW5OYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29sdW1uTmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfSU1QTF9fQ09MVU1OX05BTUVTOgotCQkJCWdldENvbHVtbk5hbWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9VTklRVUVfQ09OU1RSQUlOVF9JTVBMX19DT0xVTU5fTkFNRVM6Ci0JCQkJcmV0dXJuIGNvbHVtbk5hbWVzICE9IG51bGwgJiYgIWNvbHVtbk5hbWVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29sdW1uTmFtZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbHVtbk5hbWVzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIFVuaXF1ZUNvbnN0cmFpbnQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmVyc2lvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxWZXJzaW9uLmphdmEKaW5kZXggYzFlNWVkOS4uODQ2ZGViOSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxWZXJzaW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxWZXJzaW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw2ICs5LDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTIxLDIwICszMSwxOTEgQEAKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uI2dldFRlbXBvcmFsIDxlbT5UZW1wb3JhbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgogICoKICAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVmVyc2lvbiBleHRlbmRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIENvbHVtbk1hcHBpbmcKK3B1YmxpYyBjbGFzcyBYbWxWZXJzaW9uIGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgQ29sdW1uTWFwcGluZywgWG1sQ29udmVydGlibGVNYXBwaW5nCiB7CiAJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uKCkgPGVtPkNvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29sdW1uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ29sdW1uIGNvbHVtbjsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMb2IoKSA8ZW0+TG9iPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0xvYigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQl9FREVGQVVMVCA9IGZhbHNlOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9iKCkgPGVtPkxvYjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNMb2IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGxvYiA9IExPQl9FREVGQVVMVDsKKwkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUZW1wb3JhbFR5cGUgVEVNUE9SQUxfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGVtcG9yYWwoKSA8ZW0+VGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRlbXBvcmFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHRlbXBvcmFsID0gVEVNUE9SQUxfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudW1lcmF0ZWQoKSA8ZW0+RW51bWVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RW51bWVyYXRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbnVtVHlwZSBFTlVNRVJBVEVEX0VERUZBVUxUID0gRW51bVR5cGUuT1JESU5BTDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnVtZXJhdGVkKCkgPGVtPkVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVudW1lcmF0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFbnVtVHlwZSBlbnVtZXJhdGVkID0gRU5VTUVSQVRFRF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxWZXJzaW9uKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1ZFUlNJT047CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRDb2x1bW4oWG1sQ29sdW1uKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKQorCXsKKwkJcmV0dXJuIGNvbHVtbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb2x1bW4oWG1sQ29sdW1uIG5ld0NvbHVtbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbENvbHVtbiBvbGRDb2x1bW4gPSBjb2x1bW47CisJCWNvbHVtbiA9IG5ld0NvbHVtbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09MVU1OLCBvbGRDb2x1bW4sIG5ld0NvbHVtbik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Q29sdW1uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiBuZXdDb2x1bW4pCisJeworCQlpZiAobmV3Q29sdW1uICE9IGNvbHVtbikKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoY29sdW1uICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbHVtbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTFVNTiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q29sdW1uICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbHVtbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTFVNTiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRDb2x1bW4obmV3Q29sdW1uLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTFVNTiwgbmV3Q29sdW1uLCBuZXdDb2x1bW4pKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldExvYihib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0xvYigpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNMb2IoKQorCXsKKwkJcmV0dXJuIGxvYjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiNpc0xvYiA8ZW0+TG9iPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzTG9iKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TG9iKGJvb2xlYW4gbmV3TG9iKQorCXsKKwkJYm9vbGVhbiBvbGRMb2IgPSBsb2I7CisJCWxvYiA9IG5ld0xvYjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTE9CLCBvbGRMb2IsIGxvYikpOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZX0uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTQ2LDExICsyMjcsMTQgQEAKIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCiAJICogQHNlZSAjc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbl9UZW1wb3JhbCgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfVGVtcG9yYWwoKQogCSAqIEBtb2RlbAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKTsKKwlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkKKwl7CisJCXJldHVybiB0ZW1wb3JhbDsKKwl9CiAKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiNnZXRUZW1wb3JhbCA8ZW0+VGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTYxLDYgKzI0NSwyNzkgQEAKIAkgKiBAc2VlICNnZXRUZW1wb3JhbCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIHZhbHVlKTsKKwlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpCisJeworCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0ZW1wb3JhbDsKKwkJdGVtcG9yYWwgPSBuZXdUZW1wb3JhbCA9PSBudWxsID8gVEVNUE9SQUxfRURFRkFVTFQgOiBuZXdUZW1wb3JhbDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVEVNUE9SQUwsIG9sZFRlbXBvcmFsLCB0ZW1wb3JhbCkpOworCX0KIAotfSAvLyBWZXJzaW9uCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCisJICogQHNlZSAjc2V0RW51bWVyYXRlZChFbnVtVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19FbnVtZXJhdGVkKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVudW1UeXBlIGdldEVudW1lcmF0ZWQoKQorCXsKKwkJcmV0dXJuIGVudW1lcmF0ZWQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0RW51bWVyYXRlZCA8ZW0+RW51bWVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKKwkgKiBAc2VlICNnZXRFbnVtZXJhdGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RW51bWVyYXRlZChFbnVtVHlwZSBuZXdFbnVtZXJhdGVkKQorCXsKKwkJRW51bVR5cGUgb2xkRW51bWVyYXRlZCA9IGVudW1lcmF0ZWQ7CisJCWVudW1lcmF0ZWQgPSBuZXdFbnVtZXJhdGVkID09IG51bGwgPyBFTlVNRVJBVEVEX0VERUZBVUxUIDogbmV3RW51bWVyYXRlZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fRU5VTUVSQVRFRCwgb2xkRW51bWVyYXRlZCwgZW51bWVyYXRlZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT0xVTU46CisJCQkJcmV0dXJuIGJhc2ljU2V0Q29sdW1uKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09MVU1OOgorCQkJCXJldHVybiBnZXRDb2x1bW4oKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTE9COgorCQkJCXJldHVybiBpc0xvYigpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19URU1QT1JBTDoKKwkJCQlyZXR1cm4gZ2V0VGVtcG9yYWwoKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fRU5VTUVSQVRFRDoKKwkJCQlyZXR1cm4gZ2V0RW51bWVyYXRlZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09MVU1OOgorCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0xPQjoKKwkJCQlzZXRMb2IoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVEVNUE9SQUw6CisJCQkJc2V0VGVtcG9yYWwoKFRlbXBvcmFsVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19FTlVNRVJBVEVEOgorCQkJCXNldEVudW1lcmF0ZWQoKEVudW1UeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTFVNTjoKKwkJCQlzZXRDb2x1bW4oKFhtbENvbHVtbiludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0xPQjoKKwkJCQlzZXRMb2IoTE9CX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RFTVBPUkFMOgorCQkJCXNldFRlbXBvcmFsKFRFTVBPUkFMX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0VOVU1FUkFURUQ6CisJCQkJc2V0RW51bWVyYXRlZChFTlVNRVJBVEVEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT0xVTU46CisJCQkJcmV0dXJuIGNvbHVtbiAhPSBudWxsOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19MT0I6CisJCQkJcmV0dXJuIGxvYiAhPSBMT0JfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RFTVBPUkFMOgorCQkJCXJldHVybiB0ZW1wb3JhbCAhPSBURU1QT1JBTF9FREVGQVVMVDsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fRU5VTUVSQVRFRDoKKwkJCQlyZXR1cm4gZW51bWVyYXRlZCAhPSBFTlVNRVJBVEVEX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBDb2x1bW5NYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT0xVTU46IHJldHVybiBPcm1QYWNrYWdlLkNPTFVNTl9NQVBQSU5HX19DT0xVTU47CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19MT0I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19MT0I7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19URU1QT1JBTDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX1RFTVBPUkFMOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fRU5VTUVSQVRFRDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0VOVU1FUkFURUQ7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBDb2x1bW5NYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLkNPTFVNTl9NQVBQSU5HX19DT0xVTU46IHJldHVybiBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT0xVTU47CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19MT0I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19MT0I7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19URU1QT1JBTDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RFTVBPUkFMOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fRU5VTUVSQVRFRDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0VOVU1FUkFURUQ7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChsb2I6ICIpOworCQlyZXN1bHQuYXBwZW5kKGxvYik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdGVtcG9yYWw6ICIpOworCQlyZXN1bHQuYXBwZW5kKHRlbXBvcmFsKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBlbnVtZXJhdGVkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChlbnVtZXJhdGVkKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRFbnVtZXJhdGVkVGV4dFJhbmdlKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImVudW1lcmF0ZWQgbm90IHN1cHBvcnRlZCBieSB2ZXJzaW9uIG1hcHBpbmdzIik7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRMb2JUZXh0UmFuZ2UoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigibG9iIG5vdCBzdXBwb3J0ZWQgYnkgdmVyc2lvbiBtYXBwaW5ncyIpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRlbXBvcmFsVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5URU1QT1JBTCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ29sdW1uVHJhbnNsYXRvcigpLCAKKwkJCWJ1aWxkVGVtcG9yYWxUcmFuc2xhdG9yKCksCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQS5DT0xVTU4sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbHVtbk1hcHBpbmdfQ29sdW1uKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUZW1wb3JhbFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuVEVNUE9SQUwsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19UZW1wb3JhbCgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFZlcnNpb25JbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL1htbFZlcnNpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NjM4ODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS9YbWxWZXJzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbkltcGwoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sVmVyc2lvbkltcGwgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBYbWxWZXJzaW9uCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uKCkgPGVtPkNvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29sdW1uIGNvbHVtbjsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRlbXBvcmFsVHlwZSBURU1QT1JBTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZW1wb3JhbCgpIDxlbT5UZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGVtcG9yYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgdGVtcG9yYWwgPSBURU1QT1JBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxWZXJzaW9uSW1wbCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9WRVJTSU9OX0lNUEw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb2x1bW4oWG1sQ29sdW1uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKQotCXsKLQkJcmV0dXJuIGNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb2x1bW4oWG1sQ29sdW1uIG5ld0NvbHVtbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENvbHVtbiBvbGRDb2x1bW4gPSBjb2x1bW47Ci0JCWNvbHVtbiA9IG5ld0NvbHVtbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19DT0xVTU4sIG9sZENvbHVtbiwgbmV3Q29sdW1uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbkltcGwjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiBuZXdDb2x1bW4pCi0JewotCQlpZiAobmV3Q29sdW1uICE9IGNvbHVtbikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbHVtbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fSU1QTF9fQ09MVU1OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb2x1bW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29sdW1uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29sdW1uKG5ld0NvbHVtbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0lNUExfX0NPTFVNTiwgbmV3Q29sdW1uLCBuZXdDb2x1bW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI3NldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFZlcnNpb25fVGVtcG9yYWwoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkKLQl7Ci0JCXJldHVybiB0ZW1wb3JhbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbkltcGwjZ2V0VGVtcG9yYWwgPGVtPlRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQHNlZSAjZ2V0VGVtcG9yYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpCi0JewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0ZW1wb3JhbDsKLQkJdGVtcG9yYWwgPSBuZXdUZW1wb3JhbCA9PSBudWxsID8gVEVNUE9SQUxfRURFRkFVTFQgOiBuZXdUZW1wb3JhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19URU1QT1JBTCwgb2xkVGVtcG9yYWwsIHRlbXBvcmFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fSU1QTF9fQ09MVU1OOgotCQkJCXJldHVybiBiYXNpY1NldENvbHVtbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fSU1QTF9fQ09MVU1OOgotCQkJCXJldHVybiBnZXRDb2x1bW4oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19URU1QT1JBTDoKLQkJCQlyZXR1cm4gZ2V0VGVtcG9yYWwoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fSU1QTF9fQ09MVU1OOgotCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fSU1QTF9fVEVNUE9SQUw6Ci0JCQkJc2V0VGVtcG9yYWwoKFRlbXBvcmFsVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0lNUExfX0NPTFVNTjoKLQkJCQlzZXRDb2x1bW4oKFhtbENvbHVtbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fSU1QTF9fVEVNUE9SQUw6Ci0JCQkJc2V0VGVtcG9yYWwoVEVNUE9SQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fSU1QTF9fQ09MVU1OOgotCQkJCXJldHVybiBjb2x1bW4gIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19URU1QT1JBTDoKLQkJCQlyZXR1cm4gdGVtcG9yYWwgIT0gVEVNUE9SQUxfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IENvbHVtbk1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fSU1QTF9fQ09MVU1OOiByZXR1cm4gT3JtUGFja2FnZS5DT0xVTU5fTUFQUElOR19fQ09MVU1OOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFZlcnNpb24uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fSU1QTF9fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19URU1QT1JBTDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IENvbHVtbk1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuQ09MVU1OX01BUFBJTkdfX0NPTFVNTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fSU1QTF9fQ09MVU1OOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFZlcnNpb24uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RFTVBPUkFMOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9JTVBMX19URU1QT1JBTDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRlbXBvcmFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0ZW1wb3JhbCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBWZXJzaW9uCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvSlBBMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvSlBBMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0MTY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9KUEEyXzAuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSlBBOworCisvKioKKyAqIEpQQSAyLjAgb3JtLnhtbC1yZWxhdGVkIHN0dWZmIChlbGVtZW50cywgYXR0cmlidXRlcyBldGMuKQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgaW50ZXJmYWNlIEpQQTJfMAorCWV4dGVuZHMgSlBBCit7CisJU3RyaW5nIFNDSEVNQV9OQU1FU1BBQ0UgPSBKUEEuU0NIRU1BX05BTUVTUEFDRTsKKwlTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybV8yXzAueHNkIjsKKwlTdHJpbmcgU0NIRU1BX1ZFUlNJT04gPSAiMi4wIjsKKwkKKwkvLyBKUEEgMi4wIHNwZWNpZmljIG5vZGVzCisJCisJU3RyaW5nIENBQ0hFQUJMRSA9ICJjYWNoZWFibGUiOworCVN0cmluZyBDT0xMRUNUSU9OX1RBQkxFID0gImNvbGxlY3Rpb24tdGFibGUiOworCVN0cmluZyBERUxJTUlUSUVEX0lERU5USUZJRVJTID0gImRlbGltaXRlZC1pZGVudGlmaWVycyI7CisJU3RyaW5nIEVMRU1FTlRfQ09MTEVDVElPTiA9ICJlbGVtZW50LWNvbGxlY3Rpb24iOworCVN0cmluZyBNQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERSA9ICJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSI7CisJU3RyaW5nIE1BUF9LRVlfQ0xBU1MgPSAibWFwLWtleS1jbGFzcyI7CisJU3RyaW5nIE1BUF9LRVlfQ09MVU1OID0gIm1hcC1rZXktY29sdW1uIjsKKwlTdHJpbmcgTUFQX0tFWV9DT05WRVJUID0gIm1hcC1rZXktY29udmVydCI7CisJU3RyaW5nIE1BUF9LRVlfRU5VTUVSQVRFRCA9ICJtYXAta2V5LWVudW1lcmF0ZWQiOworCVN0cmluZyBNQVBfS0VZX0pPSU5fQ09MVU1OID0gIm1hcC1rZXktam9pbi1jb2x1bW4iOworCVN0cmluZyBNQVBTX0lEID0gIm1hcHMtaWQiOworCVN0cmluZyBOQU1FRF9RVUVSWV9fTE9DS19NT0RFID0gImxvY2stbW9kZSI7CisJU3RyaW5nIE9SREVSX0NPTFVNTiA9ICJvcmRlci1jb2x1bW4iOworCVN0cmluZyBPUlBIQU5fUkVNT1ZBTCA9ICJvcnBoYW4tcmVtb3ZhbCI7CisJU3RyaW5nIFRBUkdFVF9DTEFTUyA9ICJ0YXJnZXQtY2xhc3MiOworCVN0cmluZyBNQVBfS0VZX1RFTVBPUkFMID0gIm1hcC1rZXktdGVtcG9yYWwiOworCVN0cmluZyBWQUxJREFUSU9OX01PREUgPSAidmFsaWRhdGlvbi1tb2RlIjsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9Mb2NrTW9kZVR5cGVfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvTG9ja01vZGVUeXBlXzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjNlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvTG9ja01vZGVUeXBlXzJfMC5qYXZhCkBAIC0wLDAgKzEsMzYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkxvY2sgTW9kZSBUeXBlIDIwPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldExvY2tNb2RlVHlwZV8yXzAoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIExvY2tNb2RlVHlwZV8yXzAgaW1wbGVtZW50cyBFbnVtZXJhdG9yCit7CisJLyoqCisJICogVGhlICc8ZW0+PGI+UkVBRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNSRUFEX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJUkVBRCgwLCAiUkVBRCIsICJSRUFEIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5XUklURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNXUklURV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVdSSVRFKDAsICJXUklURSIsICJXUklURSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+T1BUSU1JU1RJQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNPUFRJTUlTVElDX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJT1BUSU1JU1RJQygwLCAiT1BUSU1JU1RJQyIsICJPUFRJTUlTVElDIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5PUFRJTUlTVElDIEZPUkNFIElOQ1JFTUVOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UKDAsICJPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIsICJPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+UEVTU0lNSVNUSUMgUkVBRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNQRVNTSU1JU1RJQ19SRUFEX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJUEVTU0lNSVNUSUNfUkVBRCgwLCAiUEVTU0lNSVNUSUNfUkVBRCIsICJQRVNTSU1JU1RJQ19SRUFEIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5QRVNTSU1JU1RJQyBXUklURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNQRVNTSU1JU1RJQ19XUklURV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVBFU1NJTUlTVElDX1dSSVRFKDAsICJQRVNTSU1JU1RJQ19XUklURSIsICJQRVNTSU1JU1RJQ19XUklURSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+UEVTU0lNSVNUSUMgRk9SQ0UgSU5DUkVNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1BFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCgwLCAiUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIiwgIlBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+UkVBRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UkVBRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNSRUFECisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5XUklURTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+V1JJVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjV1JJVEUKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUklURV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5PUFRJTUlTVElDPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PUFRJTUlTVElDPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09QVElNSVNUSUMKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJTUlTVElDX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk9QVElNSVNUSUMgRk9SQ0UgSU5DUkVNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PUFRJTUlTVElDIEZPUkNFIElOQ1JFTUVOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVAorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlBFU1NJTUlTVElDIFJFQUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBFU1NJTUlTVElDIFJFQUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUEVTU0lNSVNUSUNfUkVBRAorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFU1NJTUlTVElDX1JFQURfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+UEVTU0lNSVNUSUMgV1JJVEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBFU1NJTUlTVElDIFdSSVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1BFU1NJTUlTVElDX1dSSVRFCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVTU0lNSVNUSUNfV1JJVEVfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+UEVTU0lNSVNUSUMgRk9SQ0UgSU5DUkVNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5QRVNTSU1JU1RJQyBGT1JDRSBJTkNSRU1FTlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Mb2NrIE1vZGUgVHlwZSAyMDwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9ja01vZGVUeXBlXzJfMFtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBMb2NrTW9kZVR5cGVfMl8wW10KKwkJeworCQkJUkVBRCwKKwkJCVdSSVRFLAorCQkJT1BUSU1JU1RJQywKKwkJCU9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULAorCQkJUEVTU0lNSVNUSUNfUkVBRCwKKwkJCVBFU1NJTUlTVElDX1dSSVRFLAorCQkJUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkxvY2sgTW9kZSBUeXBlIDIwPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8TG9ja01vZGVUeXBlXzJfMD4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Mb2NrIE1vZGUgVHlwZSAyMDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIExvY2tNb2RlVHlwZV8yXzAgZ2V0KFN0cmluZyBsaXRlcmFsKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCisJCXsKKwkJCUxvY2tNb2RlVHlwZV8yXzAgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKKwkJCXsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TG9jayBNb2RlIFR5cGUgMjA8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBMb2NrTW9kZVR5cGVfMl8wIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKKwl7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQorCQl7CisJCQlMb2NrTW9kZVR5cGVfMl8wIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKKwkJCXsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TG9jayBNb2RlIFR5cGUgMjA8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBMb2NrTW9kZVR5cGVfMl8wIGdldChpbnQgdmFsdWUpCisJeworCQlzd2l0Y2ggKHZhbHVlKQorCQl7CisJCQljYXNlIFJFQURfVkFMVUU6IHJldHVybiBSRUFEOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBMb2NrTW9kZVR5cGVfMl8wKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQorCXsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQorCXsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCisJeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9Mb2NrTW9kZVR5cGVfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvT3JtVjJfMEZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9Pcm1WMl8wRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YjY5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvT3JtVjJfMEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE9ybVYyXzBGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnlJbXBsCit7CisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIE9ybVYyXzBGYWN0b3J5IGVJTlNUQU5DRSA9IGluaXQoKTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybVYyXzBGYWN0b3J5IGluaXQoKQorCXsKKwkJdHJ5CisJCXsKKwkJCU9ybVYyXzBGYWN0b3J5IHRoZU9ybVYyXzBGYWN0b3J5ID0gKE9ybVYyXzBGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqcHQub3JtLnYyXzAueG1pIik7IAorCQkJaWYgKHRoZU9ybVYyXzBGYWN0b3J5ICE9IG51bGwpCisJCQl7CisJCQkJcmV0dXJuIHRoZU9ybVYyXzBGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQorCQl7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IE9ybVYyXzBGYWN0b3J5KCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgT3JtVjJfMEZhY3RvcnkoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykKKwl7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQorCQl7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQorCQl7CisJCQljYXNlIE9ybVYyXzBQYWNrYWdlLkxPQ0tfTU9ERV9UWVBFXzIwOgorCQkJCXJldHVybiBjcmVhdGVMb2NrTW9kZVR5cGVfMl8wRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQorCQl7CisJCQljYXNlIE9ybVYyXzBQYWNrYWdlLkxPQ0tfTU9ERV9UWVBFXzIwOgorCQkJCXJldHVybiBjb252ZXJ0TG9ja01vZGVUeXBlXzJfMFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTG9ja01vZGVUeXBlXzJfMCBjcmVhdGVMb2NrTW9kZVR5cGVfMl8wRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQorCXsKKwkJTG9ja01vZGVUeXBlXzJfMCByZXN1bHQgPSBMb2NrTW9kZVR5cGVfMl8wLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRMb2NrTW9kZVR5cGVfMl8wVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCisJeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgT3JtVjJfMFBhY2thZ2UgZ2V0T3JtVjJfMFBhY2thZ2UoKQorCXsKKwkJcmV0dXJuIChPcm1WMl8wUGFja2FnZSlnZXRFUGFja2FnZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGRlcHJlY2F0ZWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQERlcHJlY2F0ZWQKKwlwdWJsaWMgc3RhdGljIE9ybVYyXzBQYWNrYWdlIGdldFBhY2thZ2UoKQorCXsKKwkJcmV0dXJuIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRTsKKwl9CisKK30gLy9Pcm1WMl8wRmFjdG9yeQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL09ybVYyXzBQYWNrYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvT3JtVjJfMFBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWZhYTJhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL09ybVYyXzBQYWNrYWdlLmphdmEKQEAgLTAsMCArMSwzODgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5QZXJzaXN0ZW5jZVYyXzBQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBGYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE9ybVYyXzBQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2VJbXBsCit7CisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTkFNRSA9ICJ2Ml8wIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1VSSSA9ICJqcHQub3JtLnYyXzAueG1pIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAiOworCisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIE9ybVYyXzBQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlLmluaXQoKTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlTWFwcGluZ18yXzAgPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZyAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZU1hcHBpbmdfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfTUFQUElOR18yMCA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX01BUFBJTkdfMjBfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0FDQ0VTU19IT0xERVJfX0FDQ0VTUzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmcgMjA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0FDQ0VTU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wIDxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgMjA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfMjAgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfMjBfX0RFU0NSSVBUSU9OID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfMjBfX0pPSU5fVEFCTEUgPSAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZSAyMDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV8yMF9GRUFUVVJFX0NPVU5UID0gMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wIDxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlIDIwPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFXzIwID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9PVkVSUklERV8yMF9fREVTQ1JJUFRJT04gPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBdHRyaWJ1dGUgT3ZlcnJpZGUgMjA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFXzIwX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVzXzJfMCA8ZW0+WG1sIEF0dHJpYnV0ZXMgMjA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVzXzJfMAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlc18yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFU18yMCA9IDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVTXzIwX19ERVNDUklQVElPTiA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBDb2xsZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFU18yMF9fRUxFTUVOVF9DT0xMRUNUSU9OUyA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZXMgMjA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFU18yMF9GRUFUVVJFX0NPVU5UID0gMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvblRhYmxlXzJfMCA8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGUgMjA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uVGFibGVfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fVEFCTEVfMjAgPSA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9UQUJMRV8yMF9fSk9JTl9DT0xVTU5TID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29sbGVjdGlvbiBUYWJsZSAyMDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFXzIwX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxEZXJpdmVkSWRfMl8wIDxlbT5YbWwgRGVyaXZlZCBJZCAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbERlcml2ZWRJZF8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfREVSSVZFRF9JRF8yMCA9IDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ERVJJVkVEX0lEXzIwX19JRCA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIERlcml2ZWQgSWQgMjA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfREVSSVZFRF9JRF8yMF9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwID0gNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0xPQiA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0xPQjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19URU1QT1JBTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19FTlVNRVJBVEVEID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fRU5VTUVSQVRFRDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX1RBUkdFVF9DTEFTUyA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fT1JERVJfQlkgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fT1JERVJfQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IFRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX1RFTVBPUkFMID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0pPSU5fQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbGxlY3Rpb24gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0NPTExFQ1RJT05fVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxNDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVtYmVkZGVkXzJfMCA8ZW0+WG1sIEVtYmVkZGVkIDIwPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW1iZWRkZWRfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbWJlZGRlZF8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfMjAgPSA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfMjBfX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRlZCAyMDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF8yMF9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGUyXzAgPGVtPlhtbCBDYWNoZWFibGUyIDA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGUyXzAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbENhY2hlYWJsZTJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRUFCTEUyXzAgPSAyNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRUFCTEUyXzBfX0NBQ0hFQUJMRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENhY2hlYWJsZTIgMDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRUFCTEUyXzBfRkVBVFVSRV9DT1VOVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAgPGVtPlhtbCBFbnRpdHkgMjA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMCA9IDg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIwX19DQUNIRUFCTEUgPSBYTUxfQ0FDSEVBQkxFMl8wX19DQUNIRUFCTEU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVudGl0eSAyMDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjBfRkVBVFVSRV9DT1VOVCA9IFhNTF9DQUNIRUFCTEUyXzBfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eUxpc3RlbmVyXzJfMCA8ZW0+WG1sIEVudGl0eSBMaXN0ZW5lciAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eUxpc3RlbmVyXzJfMAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRW50aXR5TGlzdGVuZXJfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9MSVNURU5FUl8yMCA9IDk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTElTVEVORVJfMjBfX0RFU0NSSVBUSU9OID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW50aXR5IExpc3RlbmVyIDIwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9MSVNURU5FUl8yMF9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRXZlbnRNZXRob2RfMl8wIDxlbT5YbWwgRXZlbnQgTWV0aG9kIDIwPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRXZlbnRNZXRob2RfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZF8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRVZFTlRfTUVUSE9EXzIwID0gMTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FVkVOVF9NRVRIT0RfMjBfX0RFU0NSSVBUSU9OID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRXZlbnQgTWV0aG9kIDIwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VWRU5UX01FVEhPRF8yMF9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sR2VuZXJhdG9yXzJfMCA8ZW0+WG1sIEdlbmVyYXRvciAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEdlbmVyYXRvcl8yXzAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEdlbmVyYXRvcl8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVE9SXzIwID0gMTE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFUT1JfMjBfX0RFU0NSSVBUSU9OID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgR2VuZXJhdG9yIDIwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRPUl8yMF9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAgPGVtPlhtbCBNYW55IFRvIE1hbnkgMjA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwID0gMTI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX19PUkRFUl9DT0xVTU4gPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfQ0xBU1MgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfVEVNUE9SQUwgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9FTlVNRVJBVEVEID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9DT0xVTU4gPSA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfSk9JTl9DT0xVTU5TID0gNjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFueSBUbyBNYW55IDIwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMF9GRUFUVVJFX0NPVU5UID0gNzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5Q2xhc3NfMl8wIDxlbT5YbWwgTWFwIEtleSBDbGFzcyAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUNsYXNzXzJfMAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5Q2xhc3NfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUF9LRVlfQ0xBU1NfMjAgPSAxMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQX0tFWV9DTEFTU18yMF9fQ0xBU1NfTkFNRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hcCBLZXkgQ2xhc3MgMjA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQX0tFWV9DTEFTU18yMF9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMCA8ZW0+WG1sIE1hcHMgSWQgMjA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBzSWRfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFNfSURfMjAgPSAxNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBzIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQU19JRF8yMF9fTUFQU19JRCA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hcHMgSWQgMjA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQU19JRF8yMF9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTmFtZWRRdWVyeV8yXzAgPGVtPlhtbCBOYW1lZCBRdWVyeSAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE5hbWVkUXVlcnlfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxOYW1lZFF1ZXJ5XzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9RVUVSWV8yMCA9IDE1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2sgTW9kZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1FVRVJZXzIwX19MT0NLX01PREUgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBOYW1lZCBRdWVyeSAyMDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9RVUVSWV8yMF9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JwaGFuUmVtb3ZhYmxlMl8wIDxlbT5YbWwgT3JwaGFuIFJlbW92YWJsZTIgMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9ycGhhblJlbW92YWJsZTJfMAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT3JwaGFuUmVtb3ZhYmxlMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SUEhBTl9SRU1PVkFCTEUyXzAgPSAyODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcnBoYW4gUmVtb3ZhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SUEhBTl9SRU1PVkFCTEUyXzBfX09SUEhBTl9SRU1PVkFMID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT3JwaGFuIFJlbW92YWJsZTIgMDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUlBIQU5fUkVNT1ZBQkxFMl8wX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wIDxlbT5YbWwgT25lIFRvIE1hbnkgMjA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwID0gMTY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JwaGFuIFJlbW92YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fT1JQSEFOX1JFTU9WQUwgPSBYTUxfT1JQSEFOX1JFTU9WQUJMRTJfMF9fT1JQSEFOX1JFTU9WQUw7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjBfX09SREVSX0NPTFVNTiA9IFhNTF9PUlBIQU5fUkVNT1ZBQkxFMl8wX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9DTEFTUyA9IFhNTF9PUlBIQU5fUkVNT1ZBQkxFMl8wX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9URU1QT1JBTCA9IFhNTF9PUlBIQU5fUkVNT1ZBQkxFMl8wX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX19NQVBfS0VZX0VOVU1FUkFURUQgPSBYTUxfT1JQSEFOX1JFTU9WQUJMRTJfMF9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVMgPSBYTUxfT1JQSEFOX1JFTU9WQUJMRTJfMF9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX19NQVBfS0VZX0NPTFVNTiA9IFhNTF9PUlBIQU5fUkVNT1ZBQkxFMl8wX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9KT0lOX0NPTFVNTlMgPSBYTUxfT1JQSEFOX1JFTU9WQUJMRTJfMF9GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE1hbnkgMjA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjBfRkVBVFVSRV9DT1VOVCA9IFhNTF9PUlBIQU5fUkVNT1ZBQkxFMl8wX0ZFQVRVUkVfQ09VTlQgKyA3OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCA8ZW0+WG1sIFNpbmdsZSBSZWxhdGlvbnNoaXAgTWFwcGluZyAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfMjAgPSAyNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR18yMF9fSUQgPSBYTUxfREVSSVZFRF9JRF8yMF9fSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcyBJZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR18yMF9fTUFQU19JRCA9IFhNTF9ERVJJVkVEX0lEXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBTaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmcgMjA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX0ZFQVRVUkVfQ09VTlQgPSBYTUxfREVSSVZFRF9JRF8yMF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9PbmVfMl8wIDxlbT5YbWwgT25lIFRvIE9uZSAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvT25lXzJfMAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT25lVG9PbmVfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjAgPSAxNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjBfX0lEID0gWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR18yMF9fSUQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcyBJZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjBfX01BUFNfSUQgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX19NQVBTX0lEOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9ycGhhbiBSZW1vdmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV8yMF9fT1JQSEFOX1JFTU9WQUwgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPbmUgVG8gT25lIDIwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjBfRkVBVFVSRV9DT1VOVCA9IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCA8ZW0+WG1sIE9yZGVyIENvbHVtbiAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl8yMCA9IDE4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bGxhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OXzIwX19OVUxMQUJMRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl8yMF9fSU5TRVJUQUJMRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OXzIwX19VUERBVEFCTEUgPSAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPcmRlciBDb2x1bW4gMjA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OXzIwX0ZFQVRVUkVfQ09VTlQgPSAzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzIDIwPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMCA9IDE5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMF9fREVTQ1JJUFRJT04gPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGltaXRlZCBJZGVudGlmaWVyczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjBfX0RFTElNSVRFRF9JREVOVElGSUVSUyA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMF9GRUFUVVJFX0NPVU5UID0gMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YSAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfMjAgPSAyMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfMjBfX0RFU0NSSVBUSU9OID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YSAyMDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBXzIwX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeV8yXzAgPGVtPlhtbCBRdWVyeSAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5XzJfMAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZXzIwID0gMjE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV8yMF9fREVTQ1JJUFRJT04gPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBRdWVyeSAyMDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV8yMF9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlIaW50XzJfMCA8ZW0+WG1sIFF1ZXJ5IEhpbnQgMjA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeUhpbnRfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxRdWVyeUhpbnRfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0hJTlRfMjAgPSAyMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0hJTlRfMjBfX0RFU0NSSVBUSU9OID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUXVlcnkgSGludCAyMDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9ISU5UXzIwX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAgPGVtPlhtbCBTZXF1ZW5jZSBHZW5lcmF0b3IgMjA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfMjAgPSAyMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SXzIwX19DQVRBTE9HID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfMjBfX1NDSEVNQSA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFNlcXVlbmNlIEdlbmVyYXRvciAyMDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfMjBfRkVBVFVSRV9DT1VOVCA9IDI7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wIDxlbT5YbWwgU3FsIFJlc3VsdCBTZXQgTWFwcGluZyAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TUUxfUkVTVUxUX1NFVF9NQVBQSU5HXzIwID0gMjU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TUUxfUkVTVUxUX1NFVF9NQVBQSU5HXzIwX19ERVNDUklQVElPTiA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFNxbCBSZXN1bHQgU2V0IE1hcHBpbmcgMjA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1FMX1JFU1VMVF9TRVRfTUFQUElOR18yMF9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sVW5pcXVlQ29uc3RyYWludF8yXzAgPGVtPlhtbCBVbmlxdWUgQ29uc3RyYWludCAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxVbmlxdWVDb25zdHJhaW50XzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9VTklRVUVfQ09OU1RSQUlOVF8yMCA9IDI2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9VTklRVUVfQ09OU1RSQUlOVF8yMF9fTkFNRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFVuaXF1ZSBDb25zdHJhaW50IDIwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1VOSVFVRV9DT05TVFJBSU5UXzIwX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Mb2NrTW9kZVR5cGVfMl8wIDxlbT5Mb2NrIE1vZGUgVHlwZSAyMDwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuTG9ja01vZGVUeXBlXzJfMAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0TG9ja01vZGVUeXBlXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0tfTU9ERV9UWVBFXzIwID0gMjk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxBdHRyaWJ1dGVNYXBwaW5nXzJfMEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxBdHRyaWJ1dGVPdmVycmlkZV8yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQXR0cmlidXRlc18yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQ29sbGVjdGlvblRhYmxlXzJfMEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxEZXJpdmVkSWRfMl8wRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxFbWJlZGRlZF8yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sRW50aXR5XzJfMEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxFbnRpdHlMaXN0ZW5lcl8yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sRXZlbnRNZXRob2RfMl8wRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbEdlbmVyYXRvcl8yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwS2V5Q2xhc3NfMl8wRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbE1hcHNJZF8yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sTmFtZWRRdWVyeV8yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9NYW55XzJfMEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb09uZV8yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sUXVlcnlfMl8wRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbFF1ZXJ5SGludF8yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbENhY2hlYWJsZTJfMEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxPcnBoYW5SZW1vdmFibGUyXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBsb2NrTW9kZVR5cGVfMl8wRUVudW0gPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIE9ybVYyXzBQYWNrYWdlKCkKKwl7CisJCXN1cGVyKGVOU19VUkksIE9ybVYyXzBGYWN0b3J5LmVJTlNUQU5DRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgorCSAqIAorCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgT3JtVjJfMFBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybVYyXzBQYWNrYWdlIGluaXQoKQorCXsKKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKE9ybVYyXzBQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVYyXzBQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJT3JtVjJfMFBhY2thZ2UgdGhlT3JtVjJfMFBhY2thZ2UgPSAoT3JtVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIE9ybVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IE9ybVYyXzBQYWNrYWdlKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCisJCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7CisJCU9ybVBhY2thZ2UgdGhlT3JtUGFja2FnZSA9IChPcm1QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgT3JtUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVBhY2thZ2UuZU5TX1VSSSkgOiBPcm1QYWNrYWdlLmVJTlNUQU5DRSk7CisJCVBlcnNpc3RlbmNlUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVBhY2thZ2UgPSAoUGVyc2lzdGVuY2VQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSkgOiBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJUGVyc2lzdGVuY2VWMl8wUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID0gKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5lTlNfVVJJKSA6IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZUlOU1RBTkNFKTsKKworCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cworCQl0aGVPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlT3JtUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlUGVyc2lzdGVuY2VQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlT3JtVjJfMFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVBlcnNpc3RlbmNlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlT3JtVjJfMFBhY2thZ2UuZnJlZXplKCk7CisKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSwgdGhlT3JtVjJfMFBhY2thZ2UpOworCQlyZXR1cm4gdGhlT3JtVjJfMFBhY2thZ2U7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMCA8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nIDIwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZyAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZU1hcHBpbmdfMl8wCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQXR0cmlidXRlTWFwcGluZ18yXzAoKQorCXsKKwkJcmV0dXJuIHhtbEF0dHJpYnV0ZU1hcHBpbmdfMl8wRUNsYXNzOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAgPGVtPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZSAyMDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgMjA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wKCkKKwl7CisJCXJldHVybiB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMEVDbGFzczsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMCNnZXREZXNjcmlwdGlvbigpCisJICogQHNlZSAjZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMF9EZXNjcmlwdGlvbigpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAjZ2V0Sm9pblRhYmxlIDxlbT5Kb2luIFRhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wI2dldEpvaW5UYWJsZSgpCisJICogQHNlZSAjZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMF9Kb2luVGFibGUoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAgPGVtPlhtbCBBdHRyaWJ1dGUgT3ZlcnJpZGUgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMCgpCisJeworCQlyZXR1cm4geG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wRUNsYXNzOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBzZWUgI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMF9EZXNjcmlwdGlvbigpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVzXzJfMCA8ZW0+WG1sIEF0dHJpYnV0ZXMgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEF0dHJpYnV0ZXMgMjA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVzXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbEF0dHJpYnV0ZXNfMl8wKCkKKwl7CisJCXJldHVybiB4bWxBdHRyaWJ1dGVzXzJfMEVDbGFzczsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlc18yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVzXzJfMCNnZXREZXNjcmlwdGlvbigpCisJICogQHNlZSAjZ2V0WG1sQXR0cmlidXRlc18yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxBdHRyaWJ1dGVzXzJfMF9EZXNjcmlwdGlvbigpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQXR0cmlidXRlc18yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVzXzJfMCNnZXRFbGVtZW50Q29sbGVjdGlvbnMgPGVtPkVsZW1lbnQgQ29sbGVjdGlvbnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVsZW1lbnQgQ29sbGVjdGlvbnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVzXzJfMCNnZXRFbGVtZW50Q29sbGVjdGlvbnMoKQorCSAqIEBzZWUgI2dldFhtbEF0dHJpYnV0ZXNfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQXR0cmlidXRlc18yXzBfRWxlbWVudENvbGxlY3Rpb25zKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxBdHRyaWJ1dGVzXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvblRhYmxlXzJfMCA8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGUgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGUgMjA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uVGFibGVfMl8wCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ29sbGVjdGlvblRhYmxlXzJfMCgpCisJeworCQlyZXR1cm4geG1sQ29sbGVjdGlvblRhYmxlXzJfMEVDbGFzczsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uVGFibGVfMl8wI2dldEpvaW5Db2x1bW5zIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkpvaW4gQ29sdW1uczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25UYWJsZV8yXzAjZ2V0Sm9pbkNvbHVtbnMoKQorCSAqIEBzZWUgI2dldFhtbENvbGxlY3Rpb25UYWJsZV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8wX0pvaW5Db2x1bW5zKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDb2xsZWN0aW9uVGFibGVfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxEZXJpdmVkSWRfMl8wIDxlbT5YbWwgRGVyaXZlZCBJZCAyMDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRGVyaXZlZCBJZCAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxEZXJpdmVkSWRfMl8wKCkKKwl7CisJCXJldHVybiB4bWxEZXJpdmVkSWRfMl8wRUNsYXNzOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxEZXJpdmVkSWRfMl8wI2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRGVyaXZlZElkXzJfMCNnZXRJZCgpCisJICogQHNlZSAjZ2V0WG1sRGVyaXZlZElkXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbERlcml2ZWRJZF8yXzBfSWQoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbERlcml2ZWRJZF8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKKwl7CisJCXJldHVybiB4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3M7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRUYXJnZXRDbGFzcyA8ZW0+VGFyZ2V0IENsYXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IENsYXNzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldFRhcmdldENsYXNzKCkKKwkgKiBAc2VlICNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfVGFyZ2V0Q2xhc3MoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0RmV0Y2ggPGVtPkZldGNoPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmV0Y2g8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0RmV0Y2goKQorCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9GZXRjaCgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRPcmRlckJ5IDxlbT5PcmRlciBCeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9yZGVyIEJ5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE9yZGVyQnkoKQorCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9PcmRlckJ5KCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE9yZGVyQ29sdW1uIDxlbT5PcmRlciBDb2x1bW48L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5PcmRlciBDb2x1bW48L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0T3JkZXJDb2x1bW4oKQorCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9PcmRlckNvbHVtbigpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXkgPGVtPk1hcCBLZXk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NYXAgS2V5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE1hcEtleSgpCisJICogQHNlZSAjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleSgpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXlDbGFzcyA8ZW0+TWFwIEtleSBDbGFzczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5Q2xhc3MoKQorCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlDbGFzcygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXlUZW1wb3JhbCA8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5VGVtcG9yYWwoKQorCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlUZW1wb3JhbCgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXlFbnVtZXJhdGVkIDxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5RW51bWVyYXRlZCgpCisJICogQHNlZSAjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUVudW1lcmF0ZWQoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPGVtPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpCisJICogQHNlZSAjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXlDb2x1bW4gPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWFwIEtleSBDb2x1bW48L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5Q29sdW1uKCkKKwkgKiBAc2VlICNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5Q29sdW1uKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMgPGVtPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXAgS2V5IEpvaW4gQ29sdW1uczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXlKb2luQ29sdW1ucygpCisJICogQHNlZSAjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUpvaW5Db2x1bW5zKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRDb2x1bW4gPGVtPkNvbHVtbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNvbHVtbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRDb2x1bW4oKQorCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9Db2x1bW4oKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzIDxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldEF0dHJpYnV0ZU92ZXJyaWRlcygpCisJICogQHNlZSAjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0F0dHJpYnV0ZU92ZXJyaWRlcygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcyA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKQorCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9Bc3NvY2lhdGlvbk92ZXJyaWRlcygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0Q29sbGVjdGlvblRhYmxlIDxlbT5Db2xsZWN0aW9uIFRhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29sbGVjdGlvbiBUYWJsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRDb2xsZWN0aW9uVGFibGUoKQorCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9Db2xsZWN0aW9uVGFibGUoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVtYmVkZGVkXzJfMCA8ZW0+WG1sIEVtYmVkZGVkIDIwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbWJlZGRlZCAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVtYmVkZGVkXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbEVtYmVkZGVkXzJfMCgpCisJeworCQlyZXR1cm4geG1sRW1iZWRkZWRfMl8wRUNsYXNzOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMCA8ZW0+WG1sIEVudGl0eSAyMDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW50aXR5IDIwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eV8yXzAoKQorCXsKKwkJcmV0dXJuIHhtbEVudGl0eV8yXzBFQ2xhc3M7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlMaXN0ZW5lcl8yXzAgPGVtPlhtbCBFbnRpdHkgTGlzdGVuZXIgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVudGl0eSBMaXN0ZW5lciAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eUxpc3RlbmVyXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eUxpc3RlbmVyXzJfMCgpCisJeworCQlyZXR1cm4geG1sRW50aXR5TGlzdGVuZXJfMl8wRUNsYXNzOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlMaXN0ZW5lcl8yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlMaXN0ZW5lcl8yXzAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBzZWUgI2dldFhtbEVudGl0eUxpc3RlbmVyXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVudGl0eUxpc3RlbmVyXzJfMF9EZXNjcmlwdGlvbigpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5TGlzdGVuZXJfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFdmVudE1ldGhvZF8yXzAgPGVtPlhtbCBFdmVudCBNZXRob2QgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEV2ZW50IE1ldGhvZCAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEV2ZW50TWV0aG9kXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbEV2ZW50TWV0aG9kXzJfMCgpCisJeworCQlyZXR1cm4geG1sRXZlbnRNZXRob2RfMl8wRUNsYXNzOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFdmVudE1ldGhvZF8yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFdmVudE1ldGhvZF8yXzAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBzZWUgI2dldFhtbEV2ZW50TWV0aG9kXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEV2ZW50TWV0aG9kXzJfMF9EZXNjcmlwdGlvbigpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRXZlbnRNZXRob2RfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxHZW5lcmF0b3JfMl8wIDxlbT5YbWwgR2VuZXJhdG9yIDIwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBHZW5lcmF0b3IgMjA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxHZW5lcmF0b3JfMl8wCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sR2VuZXJhdG9yXzJfMCgpCisJeworCQlyZXR1cm4geG1sR2VuZXJhdG9yXzJfMEVDbGFzczsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sR2VuZXJhdG9yXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEdlbmVyYXRvcl8yXzAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBzZWUgI2dldFhtbEdlbmVyYXRvcl8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxHZW5lcmF0b3JfMl8wX0Rlc2NyaXB0aW9uKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxHZW5lcmF0b3JfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCA8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFueSBUbyBNYW55IDIwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9NYW55XzJfMCgpCisJeworCQlyZXR1cm4geG1sTWFueVRvTWFueV8yXzBFQ2xhc3M7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wI2dldE9yZGVyQ29sdW1uIDxlbT5PcmRlciBDb2x1bW48L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5PcmRlciBDb2x1bW48L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCNnZXRPcmRlckNvbHVtbigpCisJICogQHNlZSAjZ2V0WG1sTWFueVRvTWFueV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYW55VG9NYW55XzJfMF9PcmRlckNvbHVtbigpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAjZ2V0TWFwS2V5Q2xhc3MgPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NYXAgS2V5IENsYXNzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAjZ2V0TWFwS2V5Q2xhc3MoKQorCSAqIEBzZWUgI2dldFhtbE1hbnlUb01hbnlfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFueVRvTWFueV8yXzBfTWFwS2V5Q2xhc3MoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hbnlUb01hbnlfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wI2dldE1hcEtleVRlbXBvcmFsIDxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wI2dldE1hcEtleVRlbXBvcmFsKCkKKwkgKiBAc2VlICNnZXRYbWxNYW55VG9NYW55XzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hbnlUb01hbnlfMl8wX01hcEtleVRlbXBvcmFsKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYW55VG9NYW55XzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCNnZXRNYXBLZXlFbnVtZXJhdGVkIDxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCNnZXRNYXBLZXlFbnVtZXJhdGVkKCkKKwkgKiBAc2VlICNnZXRYbWxNYW55VG9NYW55XzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hbnlUb01hbnlfMl8wX01hcEtleUVudW1lcmF0ZWQoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE1hbnlUb01hbnlfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAjZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzIDxlbT5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wI2dldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpCisJICogQHNlZSAjZ2V0WG1sTWFueVRvTWFueV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYW55VG9NYW55XzJfMF9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hbnlUb01hbnlfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wI2dldE1hcEtleUNvbHVtbiA8ZW0+TWFwIEtleSBDb2x1bW48L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NYXAgS2V5IENvbHVtbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wI2dldE1hcEtleUNvbHVtbigpCisJICogQHNlZSAjZ2V0WG1sTWFueVRvTWFueV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYW55VG9NYW55XzJfMF9NYXBLZXlDb2x1bW4oKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hbnlUb01hbnlfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMgPGVtPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXAgS2V5IEpvaW4gQ29sdW1uczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wI2dldE1hcEtleUpvaW5Db2x1bW5zKCkKKwkgKiBAc2VlICNnZXRYbWxNYW55VG9NYW55XzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hbnlUb01hbnlfMl8wX01hcEtleUpvaW5Db2x1bW5zKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYW55VG9NYW55XzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5Q2xhc3NfMl8wIDxlbT5YbWwgTWFwIEtleSBDbGFzcyAyMDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFwIEtleSBDbGFzcyAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUNsYXNzXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbE1hcEtleUNsYXNzXzJfMCgpCisJeworCQlyZXR1cm4geG1sTWFwS2V5Q2xhc3NfMl8wRUNsYXNzOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlDbGFzc18yXzAjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUNsYXNzXzJfMCNnZXRDbGFzc05hbWUoKQorCSAqIEBzZWUgI2dldFhtbE1hcEtleUNsYXNzXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hcEtleUNsYXNzXzJfMF9DbGFzc05hbWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE1hcEtleUNsYXNzXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMCA8ZW0+WG1sIE1hcHMgSWQgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHMgSWQgMjA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFwc0lkXzJfMCgpCisJeworCQlyZXR1cm4geG1sTWFwc0lkXzJfMEVDbGFzczsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMCNnZXRNYXBzSWQgPGVtPk1hcHMgSWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXBzIElkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMCNnZXRNYXBzSWQoKQorCSAqIEBzZWUgI2dldFhtbE1hcHNJZF8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNYXBzSWRfMl8wX01hcHNJZCgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTWFwc0lkXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTmFtZWRRdWVyeV8yXzAgPGVtPlhtbCBOYW1lZCBRdWVyeSAyMDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTmFtZWQgUXVlcnkgMjA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxOYW1lZFF1ZXJ5XzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbE5hbWVkUXVlcnlfMl8wKCkKKwl7CisJCXJldHVybiB4bWxOYW1lZFF1ZXJ5XzJfMEVDbGFzczsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTmFtZWRRdWVyeV8yXzAjZ2V0TG9ja01vZGUgPGVtPkxvY2sgTW9kZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2sgTW9kZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE5hbWVkUXVlcnlfMl8wI2dldExvY2tNb2RlKCkKKwkgKiBAc2VlICNnZXRYbWxOYW1lZFF1ZXJ5XzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE5hbWVkUXVlcnlfMl8wX0xvY2tNb2RlKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZFF1ZXJ5XzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCA8ZW0+WG1sIE9uZSBUbyBNYW55IDIwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPbmUgVG8gTWFueSAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxPbmVUb01hbnlfMl8wKCkKKwl7CisJCXJldHVybiB4bWxPbmVUb01hbnlfMl8wRUNsYXNzOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wI2dldE9yZGVyQ29sdW1uIDxlbT5PcmRlciBDb2x1bW48L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5PcmRlciBDb2x1bW48L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wI2dldE9yZGVyQ29sdW1uKCkKKwkgKiBAc2VlICNnZXRYbWxPbmVUb01hbnlfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sT25lVG9NYW55XzJfMF9PcmRlckNvbHVtbigpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sT25lVG9NYW55XzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wI2dldE1hcEtleUNsYXNzIDxlbT5NYXAgS2V5IENsYXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAjZ2V0TWFwS2V5Q2xhc3MoKQorCSAqIEBzZWUgI2dldFhtbE9uZVRvTWFueV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxPbmVUb01hbnlfMl8wX01hcEtleUNsYXNzKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxPbmVUb01hbnlfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAjZ2V0TWFwS2V5VGVtcG9yYWwgPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCNnZXRNYXBLZXlUZW1wb3JhbCgpCisJICogQHNlZSAjZ2V0WG1sT25lVG9NYW55XzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE9uZVRvTWFueV8yXzBfTWFwS2V5VGVtcG9yYWwoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9uZVRvTWFueV8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCNnZXRNYXBLZXlFbnVtZXJhdGVkIDxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wI2dldE1hcEtleUVudW1lcmF0ZWQoKQorCSAqIEBzZWUgI2dldFhtbE9uZVRvTWFueV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPbmVUb01hbnlfMl8wX01hcEtleUVudW1lcmF0ZWQoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9uZVRvTWFueV8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wI2dldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA8ZW0+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wI2dldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpCisJICogQHNlZSAjZ2V0WG1sT25lVG9NYW55XzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE9uZVRvTWFueV8yXzBfTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxPbmVUb01hbnlfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAjZ2V0TWFwS2V5Q29sdW1uIDxlbT5NYXAgS2V5IENvbHVtbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCNnZXRNYXBLZXlDb2x1bW4oKQorCSAqIEBzZWUgI2dldFhtbE9uZVRvTWFueV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxPbmVUb01hbnlfMl8wX01hcEtleUNvbHVtbigpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sT25lVG9NYW55XzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMgPGVtPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXAgS2V5IEpvaW4gQ29sdW1uczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKQorCSAqIEBzZWUgI2dldFhtbE9uZVRvTWFueV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxPbmVUb01hbnlfMl8wX01hcEtleUpvaW5Db2x1bW5zKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxPbmVUb01hbnlfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb09uZV8yXzAgPGVtPlhtbCBPbmUgVG8gT25lIDIwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPbmUgVG8gT25lIDIwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9PbmVfMl8wCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT25lVG9PbmVfMl8wKCkKKwl7CisJCXJldHVybiB4bWxPbmVUb09uZV8yXzBFQ2xhc3M7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAgPGVtPlhtbCBPcmRlciBDb2x1bW4gMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9yZGVyIENvbHVtbiAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbE9yZGVyQ29sdW1uXzJfMCgpCisJeworCQlyZXR1cm4geG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAjZ2V0TnVsbGFibGUgPGVtPk51bGxhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TnVsbGFibGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAjZ2V0TnVsbGFibGUoKQorCSAqIEBzZWUgI2dldFhtbE9yZGVyQ29sdW1uXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE9yZGVyQ29sdW1uXzJfMF9OdWxsYWJsZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXRJbnNlcnRhYmxlIDxlbT5JbnNlcnRhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXRJbnNlcnRhYmxlKCkKKwkgKiBAc2VlICNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPcmRlckNvbHVtbl8yXzBfSW5zZXJ0YWJsZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXRVcGRhdGFibGUgPGVtPlVwZGF0YWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVwZGF0YWJsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXRVcGRhdGFibGUoKQorCSAqIEBzZWUgI2dldFhtbE9yZGVyQ29sdW1uXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE9yZGVyQ29sdW1uXzJfMF9VcGRhdGFibGUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9yZGVyQ29sdW1uXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0cyAyMDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0cyAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCgpCisJeworCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wRUNsYXNzOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMF9EZXNjcmlwdGlvbigpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCNpc0RlbGltaXRlZElkZW50aWZpZXJzIDxlbT5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAjaXNEZWxpbWl0ZWRJZGVudGlmaWVycygpCisJICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wX0RlbGltaXRlZElkZW50aWZpZXJzKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGEgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGEgMjA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAoKQorCXsKKwkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMCNnZXREZXNjcmlwdGlvbigpCisJICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wX0Rlc2NyaXB0aW9uKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeV8yXzAgPGVtPlhtbCBRdWVyeSAyMDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUXVlcnkgMjA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeV8yXzAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxRdWVyeV8yXzAoKQorCXsKKwkJcmV0dXJuIHhtbFF1ZXJ5XzJfMEVDbGFzczsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlfMl8wI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAc2VlICNnZXRYbWxRdWVyeV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxRdWVyeV8yXzBfRGVzY3JpcHRpb24oKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFF1ZXJ5XzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlIaW50XzJfMCA8ZW0+WG1sIFF1ZXJ5IEhpbnQgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFF1ZXJ5IEhpbnQgMjA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeUhpbnRfMl8wCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUXVlcnlIaW50XzJfMCgpCisJeworCQlyZXR1cm4geG1sUXVlcnlIaW50XzJfMEVDbGFzczsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlIaW50XzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5SGludF8yXzAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBzZWUgI2dldFhtbFF1ZXJ5SGludF8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxRdWVyeUhpbnRfMl8wX0Rlc2NyaXB0aW9uKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeUhpbnRfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAgPGVtPlhtbCBTZXF1ZW5jZSBHZW5lcmF0b3IgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFNlcXVlbmNlIEdlbmVyYXRvciAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCgpCisJeworCQlyZXR1cm4geG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wRUNsYXNzOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhdGFsb2c8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAjZ2V0Q2F0YWxvZygpCisJICogQHNlZSAjZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wX0NhdGFsb2coKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY2hlbWE8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAjZ2V0U2NoZW1hKCkKKwkgKiBAc2VlICNnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzBfU2NoZW1hKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wIDxlbT5YbWwgU2luZ2xlIFJlbGF0aW9uc2hpcCBNYXBwaW5nIDIwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBTaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmcgMjA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wKCkKKwl7CisJCXJldHVybiB4bWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMEVDbGFzczsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wIDxlbT5YbWwgU3FsIFJlc3VsdCBTZXQgTWFwcGluZyAyMDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgU3FsIFJlc3VsdCBTZXQgTWFwcGluZyAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAoKQorCXsKKwkJcmV0dXJuIHhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wRUNsYXNzOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAc2VlICNnZXRYbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wX0Rlc2NyaXB0aW9uKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sVW5pcXVlQ29uc3RyYWludF8yXzAgPGVtPlhtbCBVbmlxdWUgQ29uc3RyYWludCAyMDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQgMjA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxVbmlxdWVDb25zdHJhaW50XzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wKCkKKwl7CisJCXJldHVybiB4bWxVbmlxdWVDb25zdHJhaW50XzJfMEVDbGFzczsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sVW5pcXVlQ29uc3RyYWludF8yXzAjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxVbmlxdWVDb25zdHJhaW50XzJfMCNnZXROYW1lKCkKKwkgKiBAc2VlICNnZXRYbWxVbmlxdWVDb25zdHJhaW50XzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wX05hbWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGUyXzAgPGVtPlhtbCBDYWNoZWFibGUyIDA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENhY2hlYWJsZTIgMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZTJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbENhY2hlYWJsZTJfMCgpCisJeworCQlyZXR1cm4geG1sQ2FjaGVhYmxlMl8wRUNsYXNzOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGUyXzAjZ2V0Q2FjaGVhYmxlIDxlbT5DYWNoZWFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYWNoZWFibGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGUyXzAjZ2V0Q2FjaGVhYmxlKCkKKwkgKiBAc2VlICNnZXRYbWxDYWNoZWFibGUyXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZWFibGUyXzBfQ2FjaGVhYmxlKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDYWNoZWFibGUyXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9ycGhhblJlbW92YWJsZTJfMCA8ZW0+WG1sIE9ycGhhbiBSZW1vdmFibGUyIDA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9ycGhhbiBSZW1vdmFibGUyIDA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcnBoYW5SZW1vdmFibGUyXzAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxPcnBoYW5SZW1vdmFibGUyXzAoKQorCXsKKwkJcmV0dXJuIHhtbE9ycGhhblJlbW92YWJsZTJfMEVDbGFzczsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JwaGFuUmVtb3ZhYmxlMl8wI2dldE9ycGhhblJlbW92YWwgPGVtPk9ycGhhbiBSZW1vdmFsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3JwaGFuIFJlbW92YWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcnBoYW5SZW1vdmFibGUyXzAjZ2V0T3JwaGFuUmVtb3ZhbCgpCisJICogQHNlZSAjZ2V0WG1sT3JwaGFuUmVtb3ZhYmxlMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT3JwaGFuUmVtb3ZhYmxlMl8wX09ycGhhblJlbW92YWwoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9ycGhhblJlbW92YWJsZTJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Mb2NrTW9kZVR5cGVfMl8wIDxlbT5Mb2NrIE1vZGUgVHlwZSAyMDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkxvY2sgTW9kZSBUeXBlIDIwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuTG9ja01vZGVUeXBlXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0TG9ja01vZGVUeXBlXzJfMCgpCisJeworCQlyZXR1cm4gbG9ja01vZGVUeXBlXzJfMEVFbnVtOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE9ybVYyXzBGYWN0b3J5IGdldE9ybVYyXzBGYWN0b3J5KCkKKwl7CisJCXJldHVybiAoT3JtVjJfMEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCXsKKwkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOworCQlpc0NyZWF0ZWQgPSB0cnVlOworCisJCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworCQl4bWxBdHRyaWJ1dGVNYXBwaW5nXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVRUUklCVVRFX01BUFBJTkdfMjApOworCisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV8yMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzBFQ2xhc3MsIFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV8yMF9fREVTQ1JJUFRJT04pOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wRUNsYXNzLCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfMjBfX0pPSU5fVEFCTEUpOworCisJCXhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVRUUklCVVRFX09WRVJSSURFXzIwKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBdHRyaWJ1dGVPdmVycmlkZV8yXzBFQ2xhc3MsIFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfMjBfX0RFU0NSSVBUSU9OKTsKKworCQl4bWxBdHRyaWJ1dGVzXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVRUUklCVVRFU18yMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQXR0cmlidXRlc18yXzBFQ2xhc3MsIFhNTF9BVFRSSUJVVEVTXzIwX19ERVNDUklQVElPTik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQXR0cmlidXRlc18yXzBFQ2xhc3MsIFhNTF9BVFRSSUJVVEVTXzIwX19FTEVNRU5UX0NPTExFQ1RJT05TKTsKKworCQl4bWxDb2xsZWN0aW9uVGFibGVfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT0xMRUNUSU9OX1RBQkxFXzIwKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDb2xsZWN0aW9uVGFibGVfMl8wRUNsYXNzLCBYTUxfQ09MTEVDVElPTl9UQUJMRV8yMF9fSk9JTl9DT0xVTU5TKTsKKworCQl4bWxEZXJpdmVkSWRfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9ERVJJVkVEX0lEXzIwKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxEZXJpdmVkSWRfMl8wRUNsYXNzLCBYTUxfREVSSVZFRF9JRF8yMF9fSUQpOworCisJCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MsIFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX1RBUkdFVF9DTEFTUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19GRVRDSCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19PUkRFUl9CWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19PUkRFUl9DT0xVTU4pOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcywgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0NMQVNTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MsIFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfVEVNUE9SQUwpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcywgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9FTlVNRVJBVEVEKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MsIFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0NPTFVNTik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0pPSU5fQ09MVU1OUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19DT0xVTU4pOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcywgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcywgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQ09MTEVDVElPTl9UQUJMRSk7CisKKwkJeG1sRW1iZWRkZWRfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERFRF8yMCk7CisKKwkJeG1sRW50aXR5XzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU5USVRZXzIwKTsKKworCQl4bWxFbnRpdHlMaXN0ZW5lcl8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VOVElUWV9MSVNURU5FUl8yMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5TGlzdGVuZXJfMl8wRUNsYXNzLCBYTUxfRU5USVRZX0xJU1RFTkVSXzIwX19ERVNDUklQVElPTik7CisKKwkJeG1sRXZlbnRNZXRob2RfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FVkVOVF9NRVRIT0RfMjApOworCQljcmVhdGVFQXR0cmlidXRlKHhtbEV2ZW50TWV0aG9kXzJfMEVDbGFzcywgWE1MX0VWRU5UX01FVEhPRF8yMF9fREVTQ1JJUFRJT04pOworCisJCXhtbEdlbmVyYXRvcl8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0dFTkVSQVRPUl8yMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sR2VuZXJhdG9yXzJfMEVDbGFzcywgWE1MX0dFTkVSQVRPUl8yMF9fREVTQ1JJUFRJT04pOworCisJCXhtbE1hbnlUb01hbnlfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX01BTllfMjApOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hbnlUb01hbnlfMl8wRUNsYXNzLCBYTUxfTUFOWV9UT19NQU5ZXzIwX19PUkRFUl9DT0xVTU4pOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hbnlUb01hbnlfMl8wRUNsYXNzLCBYTUxfTUFOWV9UT19NQU5ZXzIwX19NQVBfS0VZX0NMQVNTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNYW55VG9NYW55XzJfMEVDbGFzcywgWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9URU1QT1JBTCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MsIFhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfRU5VTUVSQVRFRCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MsIFhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MsIFhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfQ09MVU1OKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYW55VG9NYW55XzJfMEVDbGFzcywgWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9KT0lOX0NPTFVNTlMpOworCisJCXhtbE1hcEtleUNsYXNzXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQX0tFWV9DTEFTU18yMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTWFwS2V5Q2xhc3NfMl8wRUNsYXNzLCBYTUxfTUFQX0tFWV9DTEFTU18yMF9fQ0xBU1NfTkFNRSk7CisKKwkJeG1sTWFwc0lkXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQU19JRF8yMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTWFwc0lkXzJfMEVDbGFzcywgWE1MX01BUFNfSURfMjBfX01BUFNfSUQpOworCisJCXhtbE5hbWVkUXVlcnlfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9OQU1FRF9RVUVSWV8yMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWRRdWVyeV8yXzBFQ2xhc3MsIFhNTF9OQU1FRF9RVUVSWV8yMF9fTE9DS19NT0RFKTsKKworCQl4bWxPbmVUb01hbnlfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PTkVfVE9fTUFOWV8yMCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sT25lVG9NYW55XzJfMEVDbGFzcywgWE1MX09ORV9UT19NQU5ZXzIwX19PUkRFUl9DT0xVTU4pOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbE9uZVRvTWFueV8yXzBFQ2xhc3MsIFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9DTEFTUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sT25lVG9NYW55XzJfMEVDbGFzcywgWE1MX09ORV9UT19NQU5ZXzIwX19NQVBfS0VZX1RFTVBPUkFMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPbmVUb01hbnlfMl8wRUNsYXNzLCBYTUxfT05FX1RPX01BTllfMjBfX01BUF9LRVlfRU5VTUVSQVRFRCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sT25lVG9NYW55XzJfMEVDbGFzcywgWE1MX09ORV9UT19NQU5ZXzIwX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVMpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbE9uZVRvTWFueV8yXzBFQ2xhc3MsIFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9DT0xVTU4pOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbE9uZVRvTWFueV8yXzBFQ2xhc3MsIFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9KT0lOX0NPTFVNTlMpOworCisJCXhtbE9uZVRvT25lXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX09ORV8yMCk7CisKKwkJeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PUkRFUl9DT0xVTU5fMjApOworCQljcmVhdGVFQXR0cmlidXRlKHhtbE9yZGVyQ29sdW1uXzJfMEVDbGFzcywgWE1MX09SREVSX0NPTFVNTl8yMF9fTlVMTEFCTEUpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbE9yZGVyQ29sdW1uXzJfMEVDbGFzcywgWE1MX09SREVSX0NPTFVNTl8yMF9fSU5TRVJUQUJMRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzLCBYTUxfT1JERVJfQ09MVU1OXzIwX19VUERBVEFCTEUpOworCisJCXhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMF9fREVTQ1JJUFRJT04pOworCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjBfX0RFTElNSVRFRF9JREVOVElGSUVSUyk7CisKKwkJeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBXzIwKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzBFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBXzIwX19ERVNDUklQVElPTik7CisKKwkJeG1sUXVlcnlfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9RVUVSWV8yMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUXVlcnlfMl8wRUNsYXNzLCBYTUxfUVVFUllfMjBfX0RFU0NSSVBUSU9OKTsKKworCQl4bWxRdWVyeUhpbnRfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9RVUVSWV9ISU5UXzIwKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeUhpbnRfMl8wRUNsYXNzLCBYTUxfUVVFUllfSElOVF8yMF9fREVTQ1JJUFRJT04pOworCisJCXhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfU0VRVUVOQ0VfR0VORVJBVE9SXzIwKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzBFQ2xhc3MsIFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfMjBfX0NBVEFMT0cpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMEVDbGFzcywgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl8yMF9fU0NIRU1BKTsKKworCQl4bWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwKTsKKworCQl4bWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfU1FMX1JFU1VMVF9TRVRfTUFQUElOR18yMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzBFQ2xhc3MsIFhNTF9TUUxfUkVTVUxUX1NFVF9NQVBQSU5HXzIwX19ERVNDUklQVElPTik7CisKKwkJeG1sVW5pcXVlQ29uc3RyYWludF8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1VOSVFVRV9DT05TVFJBSU5UXzIwKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxVbmlxdWVDb25zdHJhaW50XzJfMEVDbGFzcywgWE1MX1VOSVFVRV9DT05TVFJBSU5UXzIwX19OQU1FKTsKKworCQl4bWxDYWNoZWFibGUyXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NBQ0hFQUJMRTJfMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVhYmxlMl8wRUNsYXNzLCBYTUxfQ0FDSEVBQkxFMl8wX19DQUNIRUFCTEUpOworCisJCXhtbE9ycGhhblJlbW92YWJsZTJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT1JQSEFOX1JFTU9WQUJMRTJfMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sT3JwaGFuUmVtb3ZhYmxlMl8wRUNsYXNzLCBYTUxfT1JQSEFOX1JFTU9WQUJMRTJfMF9fT1JQSEFOX1JFTU9WQUwpOworCisJCS8vIENyZWF0ZSBlbnVtcworCQlsb2NrTW9kZVR5cGVfMl8wRUVudW0gPSBjcmVhdGVFRW51bShMT0NLX01PREVfVFlQRV8yMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwl7CisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47CisJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgcGFja2FnZQorCQlzZXROYW1lKGVOQU1FKTsKKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7CisJCXNldE5zVVJJKGVOU19VUkkpOworCisJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKKwkJT3JtUGFja2FnZSB0aGVPcm1QYWNrYWdlID0gKE9ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKTsKKwkJWE1MVHlwZVBhY2thZ2UgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycworCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycworCisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJeG1sQXR0cmlidXRlTWFwcGluZ18yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxBY2Nlc3NIb2xkZXIoKSk7CisJCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpKTsKKwkJeG1sRW1iZWRkZWRfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpKTsKKwkJeG1sRW50aXR5XzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENhY2hlYWJsZTJfMCgpKTsKKwkJeG1sT25lVG9NYW55XzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE9ycGhhblJlbW92YWJsZTJfMCgpKTsKKwkJeG1sT25lVG9PbmVfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAoKSk7CisJCXhtbE9uZVRvT25lXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE9ycGhhblJlbW92YWJsZTJfMCgpKTsKKwkJeG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxEZXJpdmVkSWRfMl8wKCkpOworCQl4bWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE1hcHNJZF8yXzAoKSk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJaW5pdEVDbGFzcyh4bWxBdHRyaWJ1dGVNYXBwaW5nXzJfMEVDbGFzcywgWG1sQXR0cmlidXRlTWFwcGluZ18yXzAuY2xhc3MsICJYbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh4bWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMEVDbGFzcywgWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAuY2xhc3MsICJYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wX0Rlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzBfSm9pblRhYmxlKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sSm9pblRhYmxlKCksIG51bGwsICJqb2luVGFibGUiLCBudWxsLCAwLCAxLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMEVDbGFzcywgWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wLmNsYXNzLCAiWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wX0Rlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxBdHRyaWJ1dGVzXzJfMEVDbGFzcywgWG1sQXR0cmlidXRlc18yXzAuY2xhc3MsICJYbWxBdHRyaWJ1dGVzXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbEF0dHJpYnV0ZXNfMl8wX0Rlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBYbWxBdHRyaWJ1dGVzXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQXR0cmlidXRlc18yXzBfRWxlbWVudENvbGxlY3Rpb25zKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb24oKSwgbnVsbCwgImVsZW1lbnRDb2xsZWN0aW9ucyIsIG51bGwsIDAsIC0xLCBYbWxBdHRyaWJ1dGVzXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbENvbGxlY3Rpb25UYWJsZV8yXzBFQ2xhc3MsIFhtbENvbGxlY3Rpb25UYWJsZV8yXzAuY2xhc3MsICJYbWxDb2xsZWN0aW9uVGFibGVfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ29sbGVjdGlvblRhYmxlXzJfMF9Kb2luQ29sdW1ucygpLCB0aGVPcm1QYWNrYWdlLmdldFhtbEpvaW5Db2x1bW4oKSwgbnVsbCwgImpvaW5Db2x1bW5zIiwgbnVsbCwgMCwgLTEsIFhtbENvbGxlY3Rpb25UYWJsZV8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxEZXJpdmVkSWRfMl8wRUNsYXNzLCBYbWxEZXJpdmVkSWRfMl8wLmNsYXNzLCAiWG1sRGVyaXZlZElkXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbERlcml2ZWRJZF8yXzBfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiaWQiLCBudWxsLCAwLCAxLCBYbWxEZXJpdmVkSWRfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MsICJYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfVGFyZ2V0Q2xhc3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0YXJnZXRDbGFzcyIsIG51bGwsIDAsIDEsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0ZldGNoKCksIHRoZU9ybVBhY2thZ2UuZ2V0RmV0Y2hUeXBlKCksICJmZXRjaCIsIG51bGwsIDAsIDEsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX09yZGVyQnkoKSwgdGhlT3JtUGFja2FnZS5nZXRPcmRlckJ5KCksICJvcmRlckJ5IiwgbnVsbCwgMCwgMSwgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfT3JkZXJDb2x1bW4oKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxPcmRlckNvbHVtbigpLCBudWxsLCAib3JkZXJDb2x1bW4iLCBudWxsLCAwLCAxLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXkoKSwgdGhlT3JtUGFja2FnZS5nZXRNYXBLZXkoKSwgbnVsbCwgIm1hcEtleSIsIG51bGwsIDAsIDEsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUNsYXNzKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sTWFwS2V5Q2xhc3MoKSwgbnVsbCwgIm1hcEtleUNsYXNzIiwgbnVsbCwgMCwgMSwgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5VGVtcG9yYWwoKSwgdGhlT3JtUGFja2FnZS5nZXRUZW1wb3JhbFR5cGUoKSwgIm1hcEtleVRlbXBvcmFsIiwgbnVsbCwgMCwgMSwgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5RW51bWVyYXRlZCgpLCB0aGVPcm1QYWNrYWdlLmdldEVudW1UeXBlKCksICJtYXBLZXlFbnVtZXJhdGVkIiwgbnVsbCwgMCwgMSwgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKSwgbnVsbCwgIm1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyIsIG51bGwsIDAsIC0xLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlDb2x1bW4oKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxDb2x1bW4oKSwgbnVsbCwgIm1hcEtleUNvbHVtbiIsIG51bGwsIDAsIDEsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUpvaW5Db2x1bW5zKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sSm9pbkNvbHVtbigpLCBudWxsLCAibWFwS2V5Sm9pbkNvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfQ29sdW1uKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ29sdW1uKCksIG51bGwsICJjb2x1bW4iLCBudWxsLCAwLCAxLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9BdHRyaWJ1dGVPdmVycmlkZXMoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZSgpLCBudWxsLCAiYXR0cmlidXRlT3ZlcnJpZGVzIiwgbnVsbCwgMCwgLTEsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZSgpLCBudWxsLCAiYXNzb2NpYXRpb25PdmVycmlkZXMiLCBudWxsLCAwLCAtMSwgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfQ29sbGVjdGlvblRhYmxlKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ29sbGVjdGlvblRhYmxlKCksIG51bGwsICJjb2xsZWN0aW9uVGFibGUiLCBudWxsLCAwLCAxLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxFbWJlZGRlZF8yXzBFQ2xhc3MsIFhtbEVtYmVkZGVkXzJfMC5jbGFzcywgIlhtbEVtYmVkZGVkXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh4bWxFbnRpdHlfMl8wRUNsYXNzLCBYbWxFbnRpdHlfMl8wLmNsYXNzLCAiWG1sRW50aXR5XzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh4bWxFbnRpdHlMaXN0ZW5lcl8yXzBFQ2xhc3MsIFhtbEVudGl0eUxpc3RlbmVyXzJfMC5jbGFzcywgIlhtbEVudGl0eUxpc3RlbmVyXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbEVudGl0eUxpc3RlbmVyXzJfMF9EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5TGlzdGVuZXJfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sRXZlbnRNZXRob2RfMl8wRUNsYXNzLCBYbWxFdmVudE1ldGhvZF8yXzAuY2xhc3MsICJYbWxFdmVudE1ldGhvZF8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFdmVudE1ldGhvZF8yXzBfRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFhtbEV2ZW50TWV0aG9kXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbEdlbmVyYXRvcl8yXzBFQ2xhc3MsIFhtbEdlbmVyYXRvcl8yXzAuY2xhc3MsICJYbWxHZW5lcmF0b3JfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sR2VuZXJhdG9yXzJfMF9EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgWG1sR2VuZXJhdG9yXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbE1hbnlUb01hbnlfMl8wRUNsYXNzLCBYbWxNYW55VG9NYW55XzJfMC5jbGFzcywgIlhtbE1hbnlUb01hbnlfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFueVRvTWFueV8yXzBfT3JkZXJDb2x1bW4oKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxPcmRlckNvbHVtbigpLCBudWxsLCAib3JkZXJDb2x1bW4iLCBudWxsLCAwLCAxLCBYbWxNYW55VG9NYW55XzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFueVRvTWFueV8yXzBfTWFwS2V5Q2xhc3MoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxNYXBLZXlDbGFzcygpLCBudWxsLCAibWFwS2V5Q2xhc3MiLCBudWxsLCAwLCAxLCBYbWxNYW55VG9NYW55XzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTWFueVRvTWFueV8yXzBfTWFwS2V5VGVtcG9yYWwoKSwgdGhlT3JtUGFja2FnZS5nZXRUZW1wb3JhbFR5cGUoKSwgIm1hcEtleVRlbXBvcmFsIiwgbnVsbCwgMCwgMSwgWG1sTWFueVRvTWFueV8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbE1hbnlUb01hbnlfMl8wX01hcEtleUVudW1lcmF0ZWQoKSwgdGhlT3JtUGFja2FnZS5nZXRFbnVtVHlwZSgpLCAibWFwS2V5RW51bWVyYXRlZCIsIG51bGwsIDAsIDEsIFhtbE1hbnlUb01hbnlfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYW55VG9NYW55XzJfMF9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZSgpLCBudWxsLCAibWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzIiwgbnVsbCwgMCwgLTEsIFhtbE1hbnlUb01hbnlfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYW55VG9NYW55XzJfMF9NYXBLZXlDb2x1bW4oKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxDb2x1bW4oKSwgbnVsbCwgIm1hcEtleUNvbHVtbiIsIG51bGwsIDAsIDEsIFhtbE1hbnlUb01hbnlfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYW55VG9NYW55XzJfMF9NYXBLZXlKb2luQ29sdW1ucygpLCB0aGVPcm1QYWNrYWdlLmdldFhtbEpvaW5Db2x1bW4oKSwgbnVsbCwgIm1hcEtleUpvaW5Db2x1bW5zIiwgbnVsbCwgMCwgLTEsIFhtbE1hbnlUb01hbnlfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sTWFwS2V5Q2xhc3NfMl8wRUNsYXNzLCBYbWxNYXBLZXlDbGFzc18yXzAuY2xhc3MsICJYbWxNYXBLZXlDbGFzc18yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYXBLZXlDbGFzc18yXzBfQ2xhc3NOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2xhc3NOYW1lIiwgbnVsbCwgMSwgMSwgWG1sTWFwS2V5Q2xhc3NfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sTWFwc0lkXzJfMEVDbGFzcywgWG1sTWFwc0lkXzJfMC5jbGFzcywgIlhtbE1hcHNJZF8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYXBzSWRfMl8wX01hcHNJZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHNJZCIsIG51bGwsIDAsIDEsIFhtbE1hcHNJZF8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxOYW1lZFF1ZXJ5XzJfMEVDbGFzcywgWG1sTmFtZWRRdWVyeV8yXzAuY2xhc3MsICJYbWxOYW1lZFF1ZXJ5XzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkUXVlcnlfMl8wX0xvY2tNb2RlKCksIHRoaXMuZ2V0TG9ja01vZGVUeXBlXzJfMCgpLCAibG9ja01vZGUiLCBudWxsLCAwLCAxLCBYbWxOYW1lZFF1ZXJ5XzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbE9uZVRvTWFueV8yXzBFQ2xhc3MsIFhtbE9uZVRvTWFueV8yXzAuY2xhc3MsICJYbWxPbmVUb01hbnlfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sT25lVG9NYW55XzJfMF9PcmRlckNvbHVtbigpLCB0aGVPcm1QYWNrYWdlLmdldFhtbE9yZGVyQ29sdW1uKCksIG51bGwsICJvcmRlckNvbHVtbiIsIG51bGwsIDAsIDEsIFhtbE9uZVRvTWFueV8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbE9uZVRvTWFueV8yXzBfTWFwS2V5Q2xhc3MoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxNYXBLZXlDbGFzcygpLCBudWxsLCAibWFwS2V5Q2xhc3MiLCBudWxsLCAwLCAxLCBYbWxPbmVUb01hbnlfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPbmVUb01hbnlfMl8wX01hcEtleVRlbXBvcmFsKCksIHRoZU9ybVBhY2thZ2UuZ2V0VGVtcG9yYWxUeXBlKCksICJtYXBLZXlUZW1wb3JhbCIsIG51bGwsIDAsIDEsIFhtbE9uZVRvTWFueV8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbE9uZVRvTWFueV8yXzBfTWFwS2V5RW51bWVyYXRlZCgpLCB0aGVPcm1QYWNrYWdlLmdldEVudW1UeXBlKCksICJtYXBLZXlFbnVtZXJhdGVkIiwgbnVsbCwgMCwgMSwgWG1sT25lVG9NYW55XzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sT25lVG9NYW55XzJfMF9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZSgpLCBudWxsLCAibWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzIiwgbnVsbCwgMCwgLTEsIFhtbE9uZVRvTWFueV8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbE9uZVRvTWFueV8yXzBfTWFwS2V5Q29sdW1uKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ29sdW1uKCksIG51bGwsICJtYXBLZXlDb2x1bW4iLCBudWxsLCAwLCAxLCBYbWxPbmVUb01hbnlfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxPbmVUb01hbnlfMl8wX01hcEtleUpvaW5Db2x1bW5zKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sSm9pbkNvbHVtbigpLCBudWxsLCAibWFwS2V5Sm9pbkNvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sT25lVG9NYW55XzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbE9uZVRvT25lXzJfMEVDbGFzcywgWG1sT25lVG9PbmVfMl8wLmNsYXNzLCAiWG1sT25lVG9PbmVfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHhtbE9yZGVyQ29sdW1uXzJfMEVDbGFzcywgWG1sT3JkZXJDb2x1bW5fMl8wLmNsYXNzLCAiWG1sT3JkZXJDb2x1bW5fMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX051bGxhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgIm51bGxhYmxlIiwgbnVsbCwgMCwgMSwgWG1sT3JkZXJDb2x1bW5fMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPcmRlckNvbHVtbl8yXzBfSW5zZXJ0YWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJpbnNlcnRhYmxlIiwgbnVsbCwgMCwgMSwgWG1sT3JkZXJDb2x1bW5fMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPcmRlckNvbHVtbl8yXzBfVXBkYXRhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgInVwZGF0YWJsZSIsIG51bGwsIDAsIDEsIFhtbE9yZGVyQ29sdW1uXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMEVDbGFzcywgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wLmNsYXNzLCAiWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wX0Rlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMF9EZWxpbWl0ZWRJZGVudGlmaWVycygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJkZWxpbWl0ZWRJZGVudGlmaWVycyIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMEVDbGFzcywgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wLmNsYXNzLCAiWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wX0Rlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxRdWVyeV8yXzBFQ2xhc3MsIFhtbFF1ZXJ5XzJfMC5jbGFzcywgIlhtbFF1ZXJ5XzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5XzJfMF9EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgWG1sUXVlcnlfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sUXVlcnlIaW50XzJfMEVDbGFzcywgWG1sUXVlcnlIaW50XzJfMC5jbGFzcywgIlhtbFF1ZXJ5SGludF8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxRdWVyeUhpbnRfMl8wX0Rlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBYbWxRdWVyeUhpbnRfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wRUNsYXNzLCBYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAuY2xhc3MsICJYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzBfQ2F0YWxvZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNhdGFsb2ciLCBudWxsLCAwLCAxLCBYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMF9TY2hlbWEoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzY2hlbWEiLCBudWxsLCAwLCAxLCBYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMEVDbGFzcywgWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAuY2xhc3MsICJYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh4bWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMEVDbGFzcywgWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAuY2xhc3MsICJYbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wX0Rlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBYbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wRUNsYXNzLCBYbWxVbmlxdWVDb25zdHJhaW50XzJfMC5jbGFzcywgIlhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVW5pcXVlQ29uc3RyYWludF8yXzBfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxVbmlxdWVDb25zdHJhaW50XzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbENhY2hlYWJsZTJfMEVDbGFzcywgWG1sQ2FjaGVhYmxlMl8wLmNsYXNzLCAiWG1sQ2FjaGVhYmxlMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVhYmxlMl8wX0NhY2hlYWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJjYWNoZWFibGUiLCBudWxsLCAwLCAxLCBYbWxDYWNoZWFibGUyXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxPcnBoYW5SZW1vdmFibGUyXzBFQ2xhc3MsIFhtbE9ycGhhblJlbW92YWJsZTJfMC5jbGFzcywgIlhtbE9ycGhhblJlbW92YWJsZTJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbE9ycGhhblJlbW92YWJsZTJfMF9PcnBoYW5SZW1vdmFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgIm9ycGhhblJlbW92YWwiLCBudWxsLCAwLCAxLCBYbWxPcnBoYW5SZW1vdmFibGUyXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKKwkJaW5pdEVFbnVtKGxvY2tNb2RlVHlwZV8yXzBFRW51bSwgTG9ja01vZGVUeXBlXzJfMC5jbGFzcywgIkxvY2tNb2RlVHlwZV8yXzAiKTsKKwkJYWRkRUVudW1MaXRlcmFsKGxvY2tNb2RlVHlwZV8yXzBFRW51bSwgTG9ja01vZGVUeXBlXzJfMC5SRUFEKTsKKwkJYWRkRUVudW1MaXRlcmFsKGxvY2tNb2RlVHlwZV8yXzBFRW51bSwgTG9ja01vZGVUeXBlXzJfMC5XUklURSk7CisJCWFkZEVFbnVtTGl0ZXJhbChsb2NrTW9kZVR5cGVfMl8wRUVudW0sIExvY2tNb2RlVHlwZV8yXzAuT1BUSU1JU1RJQyk7CisJCWFkZEVFbnVtTGl0ZXJhbChsb2NrTW9kZVR5cGVfMl8wRUVudW0sIExvY2tNb2RlVHlwZV8yXzAuT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQpOworCQlhZGRFRW51bUxpdGVyYWwobG9ja01vZGVUeXBlXzJfMEVFbnVtLCBMb2NrTW9kZVR5cGVfMl8wLlBFU1NJTUlTVElDX1JFQUQpOworCQlhZGRFRW51bUxpdGVyYWwobG9ja01vZGVUeXBlXzJfMEVFbnVtLCBMb2NrTW9kZVR5cGVfMl8wLlBFU1NJTUlTVElDX1dSSVRFKTsKKwkJYWRkRUVudW1MaXRlcmFsKGxvY2tNb2RlVHlwZV8yXzBFRW51bSwgTG9ja01vZGVUeXBlXzJfMC5QRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKKwl7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlTWFwcGluZ18yXzAgPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZyAyMDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZU1hcHBpbmdfMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZ18yXzAoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQVRUUklCVVRFX01BUFBJTkdfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZ18yXzAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wIDxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgMjA8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFXzIwID0gZUlOU1RBTkNFLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFXzIwX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMF9EZXNjcmlwdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFXzIwX19KT0lOX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wX0pvaW5UYWJsZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wIDxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlIDIwPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FUVFJJQlVURV9PVkVSUklERV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQVRUUklCVVRFX09WRVJSSURFXzIwX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzBfRGVzY3JpcHRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZXNfMl8wIDxlbT5YbWwgQXR0cmlidXRlcyAyMDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZXNfMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlc18yXzAoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQVRUUklCVVRFU18yMCA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVzXzJfMCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9BVFRSSUJVVEVTXzIwX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVzXzJfMF9EZXNjcmlwdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBDb2xsZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQVRUUklCVVRFU18yMF9fRUxFTUVOVF9DT0xMRUNUSU9OUyA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVzXzJfMF9FbGVtZW50Q29sbGVjdGlvbnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25UYWJsZV8yXzAgPGVtPlhtbCBDb2xsZWN0aW9uIFRhYmxlIDIwPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvblRhYmxlXzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbENvbGxlY3Rpb25UYWJsZV8yXzAoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09MTEVDVElPTl9UQUJMRV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NPTExFQ1RJT05fVEFCTEVfMjBfX0pPSU5fQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8wX0pvaW5Db2x1bW5zKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxEZXJpdmVkSWRfMl8wIDxlbT5YbWwgRGVyaXZlZCBJZCAyMDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxEZXJpdmVkSWRfMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0RFUklWRURfSURfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sRGVyaXZlZElkXzJfMCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9ERVJJVkVEX0lEXzIwX19JRCA9IGVJTlNUQU5DRS5nZXRYbWxEZXJpdmVkSWRfMl8wX0lkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjA8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19UQVJHRVRfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX1RhcmdldENsYXNzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fRkVUQ0ggPSBlSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0ZldGNoKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fT1JERVJfQlkgPSBlSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX09yZGVyQnkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fT1JERVJfQ09MVU1OID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9PcmRlckNvbHVtbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWSA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0NMQVNTID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlDbGFzcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBUZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9URU1QT1JBTCA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5VGVtcG9yYWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9FTlVNRVJBVEVEID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlFbnVtZXJhdGVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5Q29sdW1uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0pPSU5fQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5Sm9pbkNvbHVtbnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQ09MVU1OID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9Db2x1bW4oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQVRUUklCVVRFX09WRVJSSURFUyA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9Bc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29sbGVjdGlvbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQ09MTEVDVElPTl9UQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfQ29sbGVjdGlvblRhYmxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbWJlZGRlZF8yXzAgPGVtPlhtbCBFbWJlZGRlZCAyMDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVtYmVkZGVkXzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVtYmVkZGVkXzJfMCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTUJFRERFRF8yMCA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZF8yXzAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAgPGVtPlhtbCBFbnRpdHkgMjA8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTlRJVFlfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5TGlzdGVuZXJfMl8wIDxlbT5YbWwgRW50aXR5IExpc3RlbmVyIDIwPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5TGlzdGVuZXJfMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRW50aXR5TGlzdGVuZXJfMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VOVElUWV9MSVNURU5FUl8yMCA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlMaXN0ZW5lcl8yXzAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX0xJU1RFTkVSXzIwX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlMaXN0ZW5lcl8yXzBfRGVzY3JpcHRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEV2ZW50TWV0aG9kXzJfMCA8ZW0+WG1sIEV2ZW50IE1ldGhvZCAyMDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEV2ZW50TWV0aG9kXzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kXzJfMCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FVkVOVF9NRVRIT0RfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RfMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VWRU5UX01FVEhPRF8yMF9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RfMl8wX0Rlc2NyaXB0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxHZW5lcmF0b3JfMl8wIDxlbT5YbWwgR2VuZXJhdG9yIDIwPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sR2VuZXJhdG9yXzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEdlbmVyYXRvcl8yXzAoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfR0VORVJBVE9SXzIwID0gZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvcl8yXzAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfR0VORVJBVE9SXzIwX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JfMl8wX0Rlc2NyaXB0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCA8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzAoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFOWV9UT19NQU5ZXzIwID0gZUlOU1RBTkNFLmdldFhtbE1hbnlUb01hbnlfMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQU5ZX1RPX01BTllfMjBfX09SREVSX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55XzJfMF9PcmRlckNvbHVtbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55XzJfMF9NYXBLZXlDbGFzcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBUZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9URU1QT1JBTCA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55XzJfMF9NYXBLZXlUZW1wb3JhbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBFbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFOWV9UT19NQU5ZXzIwX19NQVBfS0VZX0VOVU1FUkFURUQgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueV8yXzBfTWFwS2V5RW51bWVyYXRlZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55XzJfMF9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFOWV9UT19NQU5ZXzIwX19NQVBfS0VZX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55XzJfMF9NYXBLZXlDb2x1bW4oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfSk9JTl9DT0xVTU5TID0gZUlOU1RBTkNFLmdldFhtbE1hbnlUb01hbnlfMl8wX01hcEtleUpvaW5Db2x1bW5zKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlDbGFzc18yXzAgPGVtPlhtbCBNYXAgS2V5IENsYXNzIDIwPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5Q2xhc3NfMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5Q2xhc3NfMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BUF9LRVlfQ0xBU1NfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwS2V5Q2xhc3NfMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFQX0tFWV9DTEFTU18yMF9fQ0xBU1NfTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBLZXlDbGFzc18yXzBfQ2xhc3NOYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wIDxlbT5YbWwgTWFwcyBJZCAyMDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHNJZF8yXzAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBzSWRfMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BUFNfSURfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwc0lkXzJfMCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwcyBJZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01BUFNfSURfMjBfX01BUFNfSUQgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwc0lkXzJfMF9NYXBzSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE5hbWVkUXVlcnlfMl8wIDxlbT5YbWwgTmFtZWQgUXVlcnkgMjA8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxOYW1lZFF1ZXJ5XzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE5hbWVkUXVlcnlfMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX05BTUVEX1FVRVJZXzIwID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkUXVlcnlfMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NrIE1vZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9OQU1FRF9RVUVSWV8yMF9fTE9DS19NT0RFID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkUXVlcnlfMl8wX0xvY2tNb2RlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wIDxlbT5YbWwgT25lIFRvIE1hbnkgMjA8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fTUFOWV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9PTkVfVE9fTUFOWV8yMF9fT1JERVJfQ09MVU1OID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueV8yXzBfT3JkZXJDb2x1bW4oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8wX01hcEtleUNsYXNzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IFRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT05FX1RPX01BTllfMjBfX01BUF9LRVlfVEVNUE9SQUwgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55XzJfMF9NYXBLZXlUZW1wb3JhbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBFbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT05FX1RPX01BTllfMjBfX01BUF9LRVlfRU5VTUVSQVRFRCA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8wX01hcEtleUVudW1lcmF0ZWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfT05FX1RPX01BTllfMjBfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8wX01hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55XzJfMF9NYXBLZXlDb2x1bW4oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9KT0lOX0NPTFVNTlMgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55XzJfMF9NYXBLZXlKb2luQ29sdW1ucygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9PbmVfMl8wIDxlbT5YbWwgT25lIFRvIE9uZSAyMDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvT25lXzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE9uZVRvT25lXzJfMCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fT05FXzIwID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvT25lXzJfMCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wIDxlbT5YbWwgT3JkZXIgQ29sdW1uIDIwPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09SREVSX0NPTFVNTl8yMCA9IGVJTlNUQU5DRS5nZXRYbWxPcmRlckNvbHVtbl8yXzAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk51bGxhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT1JERVJfQ09MVU1OXzIwX19OVUxMQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxPcmRlckNvbHVtbl8yXzBfTnVsbGFibGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluc2VydGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PUkRFUl9DT0xVTU5fMjBfX0lOU0VSVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX0luc2VydGFibGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVwZGF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09SREVSX0NPTFVNTl8yMF9fVVBEQVRBQkxFID0gZUlOU1RBTkNFLmdldFhtbE9yZGVyQ29sdW1uXzJfMF9VcGRhdGFibGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjA8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMCA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMF9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wX0Rlc2NyaXB0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIwX19ERUxJTUlURURfSURFTlRJRklFUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wX0RlbGltaXRlZElkZW50aWZpZXJzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhIDIwPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfMjBfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMF9EZXNjcmlwdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlfMl8wIDxlbT5YbWwgUXVlcnkgMjA8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeV8yXzAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxRdWVyeV8yXzAoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUVVFUllfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlfMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZXzIwX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeV8yXzBfRGVzY3JpcHRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5SGludF8yXzAgPGVtPlhtbCBRdWVyeSBIaW50IDIwPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlIaW50XzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5SGludF8yXzAoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUVVFUllfSElOVF8yMCA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeUhpbnRfMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX0hJTlRfMjBfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5SGludF8yXzBfRGVzY3JpcHRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCA8ZW0+WG1sIFNlcXVlbmNlIEdlbmVyYXRvciAyMDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SXzIwX19DQVRBTE9HID0gZUlOU1RBTkNFLmdldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMF9DYXRhbG9nKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfMjBfX1NDSEVNQSA9IGVJTlNUQU5DRS5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzBfU2NoZW1hKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCA8ZW0+WG1sIFNpbmdsZSBSZWxhdGlvbnNoaXAgTWFwcGluZyAyMDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwID0gZUlOU1RBTkNFLmdldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMCA8ZW0+WG1sIFNxbCBSZXN1bHQgU2V0IE1hcHBpbmcgMjA8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfU1FMX1JFU1VMVF9TRVRfTUFQUElOR18yMF9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzBfRGVzY3JpcHRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wIDxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQgMjA8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxVbmlxdWVDb25zdHJhaW50XzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1VOSVFVRV9DT05TVFJBSU5UXzIwID0gZUlOU1RBTkNFLmdldFhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVU5JUVVFX0NPTlNUUkFJTlRfMjBfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sVW5pcXVlQ29uc3RyYWludF8yXzBfTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlMl8wIDxlbT5YbWwgQ2FjaGVhYmxlMiAwPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQ2FjaGVhYmxlMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NBQ0hFQUJMRTJfMCA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZWFibGUyXzAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFQUJMRTJfMF9fQ0FDSEVBQkxFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlYWJsZTJfMF9DYWNoZWFibGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9ycGhhblJlbW92YWJsZTJfMCA8ZW0+WG1sIE9ycGhhbiBSZW1vdmFibGUyIDA8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcnBoYW5SZW1vdmFibGUyXzAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxPcnBoYW5SZW1vdmFibGUyXzAoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT1JQSEFOX1JFTU9WQUJMRTJfMCA9IGVJTlNUQU5DRS5nZXRYbWxPcnBoYW5SZW1vdmFibGUyXzAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9ycGhhbiBSZW1vdmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT1JQSEFOX1JFTU9WQUJMRTJfMF9fT1JQSEFOX1JFTU9WQUwgPSBlSU5TVEFOQ0UuZ2V0WG1sT3JwaGFuUmVtb3ZhYmxlMl8wX09ycGhhblJlbW92YWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkxvY2tNb2RlVHlwZV8yXzAgPGVtPkxvY2sgTW9kZSBUeXBlIDIwPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Mb2NrTW9kZVR5cGVfMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0TG9ja01vZGVUeXBlXzJfMCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gTE9DS19NT0RFX1RZUEVfMjAgPSBlSU5TVEFOQ0UuZ2V0TG9ja01vZGVUeXBlXzJfMCgpOworCisJfQorCit9IC8vT3JtVjJfMFBhY2thZ2UKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYwN2YzYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgMjA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMCNnZXRKb2luVGFibGUgPGVtPkpvaW4gVGFibGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wX0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEpvaW5UYWJsZShYbWxKb2luVGFibGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMF9Kb2luVGFibGUoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAjZ2V0Sm9pblRhYmxlIDxlbT5Kb2luIFRhYmxlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRKb2luVGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpOworCit9IC8vIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQXR0cmlidXRlTWFwcGluZ18yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzN2U5NDUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQXR0cmlidXRlTWFwcGluZ18yXzAuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc0hvbGRlcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nIDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmdfMl8wKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMCBleHRlbmRzIFhtbEFjY2Vzc0hvbGRlcgoreworCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZjg5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQXR0cmlidXRlIE92ZXJyaWRlIDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wX0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOworCit9IC8vIFhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEF0dHJpYnV0ZXNfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQXR0cmlidXRlc18yXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjE2ZDlhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEF0dHJpYnV0ZXNfMl8wLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBBdHRyaWJ1dGVzIDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZXNfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlc18yXzAjZ2V0RWxlbWVudENvbGxlY3Rpb25zIDxlbT5FbGVtZW50IENvbGxlY3Rpb25zPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVzXzJfMCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sQXR0cmlidXRlc18yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVzXzJfMF9EZXNjcmlwdGlvbigpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZXNfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudCBDb2xsZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50IENvbGxlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBDb2xsZWN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEF0dHJpYnV0ZXNfMl8wX0VsZW1lbnRDb2xsZWN0aW9ucygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxYbWxFbGVtZW50Q29sbGVjdGlvbj4gZ2V0RWxlbWVudENvbGxlY3Rpb25zKCk7CisKK30gLy8gWG1sQXR0cmlidXRlc18yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDYWNoZWFibGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDYWNoZWFibGUyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDJlZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbENhY2hlYWJsZTJfMC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDYWNoZWFibGUyIDA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlMl8wI2dldENhY2hlYWJsZSA8ZW0+Q2FjaGVhYmxlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxDYWNoZWFibGUyXzAoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbENhY2hlYWJsZTJfMCBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENhY2hlYWJsZShCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQ2FjaGVhYmxlMl8wX0NhY2hlYWJsZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQm9vbGVhbiBnZXRDYWNoZWFibGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZTJfMCNnZXRDYWNoZWFibGUgPGVtPkNhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDYWNoZWFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldENhY2hlYWJsZShCb29sZWFuIHZhbHVlKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgY2FjaGVhYmxlIGFubm90YXRpb24KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0Q2FjaGVhYmxlVGV4dFJhbmdlKCk7Cit9IC8vIFhtbENhY2hlYWJsZTJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbENvbGxlY3Rpb25UYWJsZV8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDb2xsZWN0aW9uVGFibGVfMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5ODlhMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDb2xsZWN0aW9uVGFibGVfMl8wLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENvbGxlY3Rpb24gVGFibGUgMjA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvblRhYmxlXzJfMCNnZXRKb2luQ29sdW1ucyA8ZW0+Sm9pbiBDb2x1bW5zPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8wKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxDb2xsZWN0aW9uVGFibGVfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbENvbGxlY3Rpb25UYWJsZV8yXzBfSm9pbkNvbHVtbnMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKTsKKworfSAvLyBYbWxDb2xsZWN0aW9uVGFibGVfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRGVyaXZlZElkXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbERlcml2ZWRJZF8yXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGZlNzE0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbERlcml2ZWRJZF8yXzAuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBEZXJpdmVkIElkIDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzAjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxEZXJpdmVkSWRfMl8wKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxEZXJpdmVkSWRfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SWQoQm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbERlcml2ZWRJZF8yXzBfSWQoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCUJvb2xlYW4gZ2V0SWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzAjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElkKEJvb2xlYW4gdmFsdWUpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBvZiB0aGUgZGVyaXZlZCBpZCBwYXJ0IG9mIHRoZSBYTUwgZG9jdW1lbnQKKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0RGVyaXZlZElkVGV4dFJhbmdlKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2YjdjYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuamF2YQpAQCAtMCwwICsxLDQyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBLZXlDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldFRhcmdldENsYXNzIDxlbT5UYXJnZXQgQ2xhc3M8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRGZXRjaCA8ZW0+RmV0Y2g8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRPcmRlckJ5IDxlbT5PcmRlciBCeTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE9yZGVyQ29sdW1uIDxlbT5PcmRlciBDb2x1bW48L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXkgPGVtPk1hcCBLZXk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXlDbGFzcyA8ZW0+TWFwIEtleSBDbGFzczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE1hcEtleVRlbXBvcmFsIDxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5RW51bWVyYXRlZCA8ZW0+TWFwIEtleSBFbnVtZXJhdGVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzIDxlbT5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXlDb2x1bW4gPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMgPGVtPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRBdHRyaWJ1dGVPdmVycmlkZXMgPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcyA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0Q29sbGVjdGlvblRhYmxlIDxlbT5Db2xsZWN0aW9uIFRhYmxlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBleHRlbmRzIFhtbENvbnZlcnRpYmxlTWFwcGluZworeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhcmdldCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VGFyZ2V0Q2xhc3MoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX1RhcmdldENsYXNzKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRUYXJnZXRDbGFzcygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldFRhcmdldENsYXNzIDxlbT5UYXJnZXQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VGFyZ2V0Q2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRhcmdldENsYXNzKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQorCSAqIEBzZWUgI3NldEZldGNoKEZldGNoVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9GZXRjaCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUZldGNoVHlwZSBnZXRGZXRjaCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQorCSAqIEBzZWUgI2dldEZldGNoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9yZGVyIEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyIEJ5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRPcmRlckJ5KFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9PcmRlckJ5KCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5PcmRlckJ5IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0T3JkZXJCeSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE9yZGVyQnkgPGVtPk9yZGVyIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBCeTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0T3JkZXJCeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0T3JkZXJCeShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JkZXIgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcmRlciBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXIgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRPcmRlckNvbHVtbihYbWxPcmRlckNvbHVtbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9PcmRlckNvbHVtbigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxPcmRlckNvbHVtbiBnZXRPcmRlckNvbHVtbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE9yZGVyQ29sdW1uIDxlbT5PcmRlciBDb2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyIENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0T3JkZXJDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE9yZGVyQ29sdW1uKFhtbE9yZGVyQ29sdW1uIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0TWFwS2V5KE1hcEtleSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXkoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTWFwS2V5IGdldE1hcEtleSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE1hcEtleSA8ZW0+TWFwIEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0TWFwS2V5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXBLZXkoTWFwS2V5IHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0TWFwS2V5Q2xhc3MoWG1sTWFwS2V5Q2xhc3MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5Q2xhc3MoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJWG1sTWFwS2V5Q2xhc3MgZ2V0TWFwS2V5Q2xhc3MoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXlDbGFzcyA8ZW0+TWFwIEtleSBDbGFzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0TWFwS2V5Q2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1hcEtleUNsYXNzKFhtbE1hcEtleUNsYXNzIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCisJICogQHNlZSAjc2V0TWFwS2V5VGVtcG9yYWwoVGVtcG9yYWxUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleVRlbXBvcmFsKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGVtcG9yYWxUeXBlIGdldE1hcEtleVRlbXBvcmFsKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5VGVtcG9yYWwgPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQorCSAqIEBzZWUgI2dldE1hcEtleVRlbXBvcmFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXBLZXlUZW1wb3JhbChUZW1wb3JhbFR5cGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBFbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCisJICogQHNlZSAjc2V0TWFwS2V5RW51bWVyYXRlZChFbnVtVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlFbnVtZXJhdGVkKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRW51bVR5cGUgZ2V0TWFwS2V5RW51bWVyYXRlZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE1hcEtleUVudW1lcmF0ZWQgPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBFbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQorCSAqIEBzZWUgI2dldE1hcEtleUVudW1lcmF0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1hcEtleUVudW1lcmF0ZWQoRW51bVR5cGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRNYXBLZXlDb2x1bW4oWG1sQ29sdW1uKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUNvbHVtbigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxDb2x1bW4gZ2V0TWFwS2V5Q29sdW1uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5Q29sdW1uIDxlbT5NYXAgS2V5IENvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE1hcEtleUNvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TWFwS2V5Q29sdW1uKFhtbENvbHVtbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5Sm9pbkNvbHVtbnMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q29sdW1uKFhtbENvbHVtbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9Db2x1bW4oKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJWG1sQ29sdW1uIGdldENvbHVtbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0F0dHJpYnV0ZU92ZXJyaWRlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfQXNzb2NpYXRpb25PdmVycmlkZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbGxlY3Rpb24gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbGxlY3Rpb24gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sbGVjdGlvbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q29sbGVjdGlvblRhYmxlKFhtbENvbGxlY3Rpb25UYWJsZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9Db2xsZWN0aW9uVGFibGUoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJWG1sQ29sbGVjdGlvblRhYmxlIGdldENvbGxlY3Rpb25UYWJsZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldENvbGxlY3Rpb25UYWJsZSA8ZW0+Q29sbGVjdGlvbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29sbGVjdGlvbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Q29sbGVjdGlvblRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb2xsZWN0aW9uVGFibGUoWG1sQ29sbGVjdGlvblRhYmxlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB0YXJnZXQtY2xhc3MgYXR0cmlidXRlLgorCSAqLworCVRleHRSYW5nZSBnZXRUYXJnZXRDbGFzc1RleHRSYW5nZSgpOworCit9IC8vIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVtYmVkZGVkXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVtYmVkZGVkXzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YWQyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRW1iZWRkZWRfMl8wLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW1iZWRkZWQgMjA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRfMl8wKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxFbWJlZGRlZF8yXzAgZXh0ZW5kcyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyCit7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRW50aXR5TGlzdGVuZXJfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRW50aXR5TGlzdGVuZXJfMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE5ZGM4MwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFbnRpdHlMaXN0ZW5lcl8yXzAuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbnRpdHkgTGlzdGVuZXIgMjA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5TGlzdGVuZXJfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRW50aXR5TGlzdGVuZXJfMl8wKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxFbnRpdHlMaXN0ZW5lcl8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbnRpdHlMaXN0ZW5lcl8yXzBfRGVzY3JpcHRpb24oKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlMaXN0ZW5lcl8yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gWG1sRW50aXR5TGlzdGVuZXJfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRW50aXR5XzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVudGl0eV8yXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTBlOTEyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVudGl0eV8yXzAuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVudGl0eSAyMDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8wKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxFbnRpdHlfMl8wIGV4dGVuZHMgWG1sQ2FjaGVhYmxlMl8wCit7CisKK30gLy8gWG1sRW50aXR5XzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEV2ZW50TWV0aG9kXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEV2ZW50TWV0aG9kXzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZmJiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRXZlbnRNZXRob2RfMl8wLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRXZlbnQgTWV0aG9kIDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEV2ZW50TWV0aG9kXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kXzJfMCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sRXZlbnRNZXRob2RfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RfMl8wX0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRXZlbnRNZXRob2RfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOworCit9IC8vIFhtbEV2ZW50TWV0aG9kXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEdlbmVyYXRvcl8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxHZW5lcmF0b3JfMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzNjBjOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxHZW5lcmF0b3JfMl8wLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgR2VuZXJhdG9yIDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEdlbmVyYXRvcl8yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JfMl8wKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxHZW5lcmF0b3JfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yXzJfMF9EZXNjcmlwdGlvbigpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEdlbmVyYXRvcl8yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gWG1sR2VuZXJhdG9yXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hbnlUb01hbnlfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFueVRvTWFueV8yXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGI4NGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hbnlUb01hbnlfMl8wLmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcEtleUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hbnkgVG8gTWFueSAyMDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCNnZXRPcmRlckNvbHVtbiA8ZW0+T3JkZXIgQ29sdW1uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCNnZXRNYXBLZXlDbGFzcyA8ZW0+TWFwIEtleSBDbGFzczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAjZ2V0TWFwS2V5VGVtcG9yYWwgPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wI2dldE1hcEtleUVudW1lcmF0ZWQgPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAjZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzIDxlbT5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wI2dldE1hcEtleUNvbHVtbiA8ZW0+TWFwIEtleSBDb2x1bW48L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wI2dldE1hcEtleUpvaW5Db2x1bW5zIDxlbT5NYXAgS2V5IEpvaW4gQ29sdW1uczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzAoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbE1hbnlUb01hbnlfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3JkZXIgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyIENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0T3JkZXJDb2x1bW4oWG1sT3JkZXJDb2x1bW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMF9PcmRlckNvbHVtbigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxPcmRlckNvbHVtbiBnZXRPcmRlckNvbHVtbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAjZ2V0T3JkZXJDb2x1bW4gPGVtPk9yZGVyIENvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXIgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRPcmRlckNvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0T3JkZXJDb2x1bW4oWG1sT3JkZXJDb2x1bW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENsYXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRNYXBLZXlDbGFzcyhYbWxNYXBLZXlDbGFzcykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8wX01hcEtleUNsYXNzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCVhtbE1hcEtleUNsYXNzIGdldE1hcEtleUNsYXNzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCNnZXRNYXBLZXlDbGFzcyA8ZW0+TWFwIEtleSBDbGFzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0TWFwS2V5Q2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1hcEtleUNsYXNzKFhtbE1hcEtleUNsYXNzIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCisJICogQHNlZSAjc2V0TWFwS2V5VGVtcG9yYWwoVGVtcG9yYWxUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzBfTWFwS2V5VGVtcG9yYWwoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUZW1wb3JhbFR5cGUgZ2V0TWFwS2V5VGVtcG9yYWwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wI2dldE1hcEtleVRlbXBvcmFsIDxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUKKwkgKiBAc2VlICNnZXRNYXBLZXlUZW1wb3JhbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TWFwS2V5VGVtcG9yYWwoVGVtcG9yYWxUeXBlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBFbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQorCSAqIEBzZWUgI3NldE1hcEtleUVudW1lcmF0ZWQoRW51bVR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMF9NYXBLZXlFbnVtZXJhdGVkKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRW51bVR5cGUgZ2V0TWFwS2V5RW51bWVyYXRlZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAjZ2V0TWFwS2V5RW51bWVyYXRlZCA8ZW0+TWFwIEtleSBFbnVtZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCisJICogQHNlZSAjZ2V0TWFwS2V5RW51bWVyYXRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TWFwS2V5RW51bWVyYXRlZChFbnVtVHlwZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzBfTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0TWFwS2V5Q29sdW1uKFhtbENvbHVtbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8wX01hcEtleUNvbHVtbigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxDb2x1bW4gZ2V0TWFwS2V5Q29sdW1uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCNnZXRNYXBLZXlDb2x1bW4gPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0TWFwS2V5Q29sdW1uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXBLZXlDb2x1bW4oWG1sQ29sdW1uIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW59LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8wX01hcEtleUpvaW5Db2x1bW5zKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldE1hcEtleUpvaW5Db2x1bW5zKCk7CisKK30gLy8gWG1sTWFueVRvTWFueV8yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBLZXlDbGFzc18yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBLZXlDbGFzc18yXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWZmYTZlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hcEtleUNsYXNzXzJfMC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hcCBLZXkgQ2xhc3MgMjA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5Q2xhc3NfMl8wI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5Q2xhc3NfMl8wKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxNYXBLZXlDbGFzc18yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRDbGFzc05hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5Q2xhc3NfMl8wX0NsYXNzTmFtZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldENsYXNzTmFtZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5Q2xhc3NfMl8wI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBYbWxNYXBLZXlDbGFzc18yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBzSWRfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFwc0lkXzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjN2RjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFwc0lkXzJfMC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogWG1sTWFwc0lkXzJfMC5qYXZhLHYgMS4xIDIwMDkvMTAvMTQgMjE6MDI6MzkgcGZ1bGxicmlnaHQgRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFwcyBJZCAyMDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wI2dldE1hcHNJZCA8ZW0+TWFwcyBJZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwc0lkXzJfMCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sTWFwc0lkXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBzIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXBzIElkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHMgSWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1hcHNJZChTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBzSWRfMl8wX01hcHNJZCgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0TWFwc0lkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wI2dldE1hcHNJZCA8ZW0+TWFwcyBJZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcyBJZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TWFwc0lkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXBzSWQoU3RyaW5nIHZhbHVlKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2Ugb2YgdGhlICJtYXBzLWlkIiBwYXJ0IG9mIHRoZSBYTUwgZG9jdW1lbnQKKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0TWFwc0lkVGV4dFJhbmdlKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTmFtZWRRdWVyeV8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxOYW1lZFF1ZXJ5XzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3N2UyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTmFtZWRRdWVyeV8yXzAuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBOYW1lZCBRdWVyeSAyMDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxOYW1lZFF1ZXJ5XzJfMCNnZXRMb2NrTW9kZSA8ZW0+TG9jayBNb2RlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxOYW1lZFF1ZXJ5XzJfMCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sTmFtZWRRdWVyeV8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jayBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuTG9ja01vZGVUeXBlXzJfMH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NrIE1vZGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jayBNb2RlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkxvY2tNb2RlVHlwZV8yXzAKKwkgKiBAc2VlICNzZXRMb2NrTW9kZShMb2NrTW9kZVR5cGVfMl8wKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTmFtZWRRdWVyeV8yXzBfTG9ja01vZGUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMb2NrTW9kZVR5cGVfMl8wIGdldExvY2tNb2RlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxOYW1lZFF1ZXJ5XzJfMCNnZXRMb2NrTW9kZSA8ZW0+TG9jayBNb2RlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NrIE1vZGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuTG9ja01vZGVUeXBlXzJfMAorCSAqIEBzZWUgI2dldExvY2tNb2RlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRMb2NrTW9kZShMb2NrTW9kZVR5cGVfMl8wIHZhbHVlKTsKKworfSAvLyBYbWxOYW1lZFF1ZXJ5XzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9uZVRvTWFueV8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPbmVUb01hbnlfMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlY2IyYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPbmVUb01hbnlfMl8wLmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcEtleUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9uZSBUbyBNYW55IDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAjZ2V0T3JkZXJDb2x1bW4gPGVtPk9yZGVyIENvbHVtbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCNnZXRNYXBLZXlDbGFzcyA8ZW0+TWFwIEtleSBDbGFzczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCNnZXRNYXBLZXlUZW1wb3JhbCA8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCNnZXRNYXBLZXlFbnVtZXJhdGVkIDxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAjZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzIDxlbT5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAjZ2V0TWFwS2V5Q29sdW1uIDxlbT5NYXAgS2V5IENvbHVtbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCNnZXRNYXBLZXlKb2luQ29sdW1ucyA8ZW0+TWFwIEtleSBKb2luIENvbHVtbnM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzAoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbE9uZVRvTWFueV8yXzAgZXh0ZW5kcyBYbWxPcnBoYW5SZW1vdmFibGUyXzAKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9yZGVyIENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldE9yZGVyQ29sdW1uKFhtbE9yZGVyQ29sdW1uKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMF9PcmRlckNvbHVtbigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxPcmRlckNvbHVtbiBnZXRPcmRlckNvbHVtbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCNnZXRPcmRlckNvbHVtbiA8ZW0+T3JkZXIgQ29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE9yZGVyQ29sdW1uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRPcmRlckNvbHVtbihYbWxPcmRlckNvbHVtbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IENsYXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldE1hcEtleUNsYXNzKFhtbE1hcEtleUNsYXNzKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMF9NYXBLZXlDbGFzcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxNYXBLZXlDbGFzcyBnZXRNYXBLZXlDbGFzcygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCNnZXRNYXBLZXlDbGFzcyA8ZW0+TWFwIEtleSBDbGFzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0TWFwS2V5Q2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1hcEtleUNsYXNzKFhtbE1hcEtleUNsYXNzIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCisJICogQHNlZSAjc2V0TWFwS2V5VGVtcG9yYWwoVGVtcG9yYWxUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMF9NYXBLZXlUZW1wb3JhbCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVRlbXBvcmFsVHlwZSBnZXRNYXBLZXlUZW1wb3JhbCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCNnZXRNYXBLZXlUZW1wb3JhbCA8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCisJICogQHNlZSAjZ2V0TWFwS2V5VGVtcG9yYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1hcEtleVRlbXBvcmFsKFRlbXBvcmFsVHlwZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBFbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKKwkgKiBAc2VlICNzZXRNYXBLZXlFbnVtZXJhdGVkKEVudW1UeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMF9NYXBLZXlFbnVtZXJhdGVkKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRW51bVR5cGUgZ2V0TWFwS2V5RW51bWVyYXRlZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCNnZXRNYXBLZXlFbnVtZXJhdGVkIDxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKKwkgKiBAc2VlICNnZXRNYXBLZXlFbnVtZXJhdGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXBLZXlFbnVtZXJhdGVkKEVudW1UeXBlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8wX01hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldE1hcEtleUNvbHVtbihYbWxDb2x1bW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8wX01hcEtleUNvbHVtbigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxDb2x1bW4gZ2V0TWFwS2V5Q29sdW1uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wI2dldE1hcEtleUNvbHVtbiA8ZW0+TWFwIEtleSBDb2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRNYXBLZXlDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1hcEtleUNvbHVtbihYbWxDb2x1bW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMF9NYXBLZXlKb2luQ29sdW1ucygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRNYXBLZXlKb2luQ29sdW1ucygpOworCit9IC8vIFhtbE9uZVRvTWFueV8yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPbmVUb09uZV8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPbmVUb09uZV8yXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2NiOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9uZVRvT25lXzJfMC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPbmUgVG8gT25lIDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE9uZVRvT25lXzJfMCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sT25lVG9PbmVfMl8wIGV4dGVuZHMgWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAsIFhtbE9ycGhhblJlbW92YWJsZTJfMAoreworCit9IC8vIFhtbE9uZVRvT25lXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyODk1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9yZGVyIENvbHVtbiAyMDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAjZ2V0TnVsbGFibGUgPGVtPk51bGxhYmxlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAjZ2V0SW5zZXJ0YWJsZSA8ZW0+SW5zZXJ0YWJsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wI2dldFVwZGF0YWJsZSA8ZW0+VXBkYXRhYmxlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbE9yZGVyQ29sdW1uXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TnVsbGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TnVsbGFibGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE51bGxhYmxlKEJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzBfTnVsbGFibGUoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCUJvb2xlYW4gZ2V0TnVsbGFibGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXROdWxsYWJsZSA8ZW0+TnVsbGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk51bGxhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXROdWxsYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnNlcnRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnNlcnRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGFibGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEluc2VydGFibGUoQm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uXzJfMF9JbnNlcnRhYmxlKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlCb29sZWFuIGdldEluc2VydGFibGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXRJbnNlcnRhYmxlIDxlbT5JbnNlcnRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJbnNlcnRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbnNlcnRhYmxlKEJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXBkYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VcGRhdGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRVcGRhdGFibGUoQm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uXzJfMF9VcGRhdGFibGUoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCUJvb2xlYW4gZ2V0VXBkYXRhYmxlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAjZ2V0VXBkYXRhYmxlIDxlbT5VcGRhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VXBkYXRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRVcGRhdGFibGUoQm9vbGVhbiB2YWx1ZSk7CisKK30gLy8gWG1sT3JkZXJDb2x1bW5fMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT3JwaGFuUmVtb3ZhYmxlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT3JwaGFuUmVtb3ZhYmxlMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhMThlNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPcnBoYW5SZW1vdmFibGUyXzAuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQ6IFhtbE9ycGhhblJlbW92YWJsZTJfMC5qYXZhLHYgMS4xIDIwMDkvMTAvMjcgMTY6MTY6MDgga21vb3JlIEV4cCAkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9ycGhhbiBSZW1vdmFibGUyIDA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JwaGFuUmVtb3ZhYmxlMl8wI2dldE9ycGhhblJlbW92YWwgPGVtPk9ycGhhbiBSZW1vdmFsPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxPcnBoYW5SZW1vdmFibGUyXzAoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbE9ycGhhblJlbW92YWJsZTJfMCBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcnBoYW4gUmVtb3ZhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3JwaGFuIFJlbW92YWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3JwaGFuIFJlbW92YWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE9ycGhhblJlbW92YWwoQm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE9ycGhhblJlbW92YWJsZTJfMF9PcnBoYW5SZW1vdmFsKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlCb29sZWFuIGdldE9ycGhhblJlbW92YWwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9ycGhhblJlbW92YWJsZTJfMCNnZXRPcnBoYW5SZW1vdmFsIDxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3JwaGFuIFJlbW92YWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE9ycGhhblJlbW92YWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE9ycGhhblJlbW92YWwoQm9vbGVhbiB2YWx1ZSk7CisKK30gLy8gWG1sT3JwaGFuUmVtb3ZhYmxlMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3ZWZkNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzIDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCNpc0RlbGltaXRlZElkZW50aWZpZXJzIDxlbT5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wX0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaW1pdGVkIElkZW50aWZpZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaW1pdGVkIElkZW50aWZpZXJzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZWxpbWl0ZWRJZGVudGlmaWVycyhib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wX0RlbGltaXRlZElkZW50aWZpZXJzKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzRGVsaW1pdGVkSWRlbnRpZmllcnMoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCNpc0RlbGltaXRlZElkZW50aWZpZXJzIDxlbT5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlbGltaXRlZCBJZGVudGlmaWVyczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNEZWxpbWl0ZWRJZGVudGlmaWVycygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGVsaW1pdGVkSWRlbnRpZmllcnMoYm9vbGVhbiB2YWx1ZSk7CisKK30gLy8gWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1OWRjZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhIDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wX0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOworCit9IC8vIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFF1ZXJ5SGludF8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxRdWVyeUhpbnRfMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiNDdmZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxRdWVyeUhpbnRfMl8wLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUXVlcnkgSGludCAyMDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeUhpbnRfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlIaW50XzJfMCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sUXVlcnlIaW50XzJfMCBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5SGludF8yXzBfRGVzY3JpcHRpb24oKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeUhpbnRfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOworCit9IC8vIFhtbFF1ZXJ5SGludF8yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxRdWVyeV8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxRdWVyeV8yXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzY1NDYxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFF1ZXJ5XzJfMC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFF1ZXJ5IDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5XzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5XzJfMCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sUXVlcnlfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlfMl8wX0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOworCit9IC8vIFhtbFF1ZXJ5XzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFNlcXVlbmNlR2VuZXJhdG9yXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFNlcXVlbmNlR2VuZXJhdG9yXzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTA3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgU2VxdWVuY2UgR2VuZXJhdG9yIDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Q2F0YWxvZyhTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzBfQ2F0YWxvZygpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0Q2F0YWxvZygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENhdGFsb2coKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldENhdGFsb2coU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U2NoZW1hKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMF9TY2hlbWEoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFNjaGVtYSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFNjaGVtYSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U2NoZW1hKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMGQ0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQ6IFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wLmphdmEsdiAxLjEgMjAwOS8xMC8xNCAyMTowMjozOSBwZnVsbGJyaWdodCBFeHAgJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBTaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmcgMjA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wIGV4dGVuZHMgWG1sRGVyaXZlZElkXzJfMCwgWG1sTWFwc0lkXzJfMAoreworfSAvLyBYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWRiNGFhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgU3FsIFJlc3VsdCBTZXQgTWFwcGluZyAyMDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wX0Rlc2NyaXB0aW9uKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxVbmlxdWVDb25zdHJhaW50XzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFVuaXF1ZUNvbnN0cmFpbnRfMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0YWYwZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxVbmlxdWVDb25zdHJhaW50XzJfMC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFVuaXF1ZSBDb25zdHJhaW50IDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxVbmlxdWVDb25zdHJhaW50XzJfMCBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sVW5pcXVlQ29uc3RyYWludF8yXzBfTmFtZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0TmFtZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sVW5pcXVlQ29uc3RyYWludF8yXzAjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOworCit9IC8vIFhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvSlBBLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvSlBBLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmMDhlNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9KUEEuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2U7CisKKy8qKgorICogSlBBIHBlcnNpc3RlbmNlLnhtbC1yZWxhdGVkIHN0dWZmIChlbGVtZW50cywgYXR0cmlidXRlcyBldGMuKQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgaW50ZXJmYWNlIEpQQSAKK3sKKwlTdHJpbmcgU0NIRU1BX05BTUVTUEFDRSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSI7CisJU3RyaW5nIFNDSEVNQV9MT0NBVElPTiA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV8xXzAueHNkIjsKKwlTdHJpbmcgU0NIRU1BX1ZFUlNJT04gPSAiMS4wIjsKKwkKKwlTdHJpbmcgQ0xBU1MgPSAiY2xhc3MiOworCisJU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKKworCVN0cmluZyBFWENMVURFX1VOTElTVEVEX0NMQVNTRVMgPSAiZXhjbHVkZS11bmxpc3RlZC1jbGFzc2VzIjsKKworCVN0cmluZyBKQVJfRklMRSA9ICJqYXItZmlsZSI7CisKKwlTdHJpbmcgSlRBX0RBVEFfU09VUkNFID0gImp0YS1kYXRhLXNvdXJjZSI7CisKKwlTdHJpbmcgTUFQUElOR19GSUxFID0gIm1hcHBpbmctZmlsZSI7CisKKwlTdHJpbmcgTk9OX0pUQV9EQVRBX1NPVVJDRSA9ICJub24tanRhLWRhdGEtc291cmNlIjsKKworCVN0cmluZyBQRVJTSVNURU5DRSA9ICJwZXJzaXN0ZW5jZSI7CisJCisJU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVQgPSAicGVyc2lzdGVuY2UtdW5pdCI7CisJCVN0cmluZyBQRVJTSVNURU5DRV9VTklUX19OQU1FID0gIm5hbWUiOworCQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9fVFJBTlNBQ1RJT05fVFlQRSA9ICJ0cmFuc2FjdGlvbi10eXBlIjsKKworCVN0cmluZyBQUk9QRVJUSUVTID0gInByb3BlcnRpZXMiOworCisJU3RyaW5nIFBST1BFUlRZID0gInByb3BlcnR5IjsKKwkJU3RyaW5nIFBST1BFUlRZX19OQU1FID0gIm5hbWUiOworCQlTdHJpbmcgUFJPUEVSVFlfX1ZBTFVFID0gInZhbHVlIjsKKworCVN0cmluZyBQUk9WSURFUiA9ICJwcm92aWRlciI7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTFlMTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFBcnRpZmFjdEVkaXQ7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgZXh0ZW5kcyBKcGFBcnRpZmFjdEVkaXQKLXsKLQkvKioKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiBAcmV0dXJuIGEgcGVyc2lzdGVuY2UgYXJ0aWZhY3QgZm9yIHByb2plY3QgYVByb2plY3QuCi0JICogT3BlbmVkIG9ubHkgZm9yIHJlYWQgYWNjZXNzIChubyB3cml0ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFydGlmYWN0RWRpdCA9IG5ldyBQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdChhUHJvamVjdCwgdHJ1ZSk7Ci0JCX0gCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICAvLyBzdXBwcmVzcyBpbGxlZ2FsIGFyZ3VtZW50IGV4Y2VwdGlvbgotICAgICAgICAgICAgSnB0Q29yZVBsdWdpbi5sb2coaWFlKTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQkKLSAgICAvKioKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiBAcmV0dXJuIGEgcGVyc2lzdGVuY2UgYXJ0aWZhY3QgZm9yIHRoZSBwcm9qZWN0IGFQcm9qZWN0LgotICAgICAqIE9wZW5lZCBmb3IgYm90aCB3cml0ZSBhbmQgcmVhZCBhY2Nlc3MKLSAgICAgKi8JCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShJUHJvamVjdCBhUHJvamVjdCkgewotCQlQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IFBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCX0gCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICAvLyBzdXBwcmVzcyBpbGxlZ2FsIGFyZ3VtZW50IGV4Y2VwdGlvbgotICAgICAgICAgICAgSnB0Q29yZVBsdWdpbi5sb2coaWFlKTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQkKLSAgICAKLQlwdWJsaWMgUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSAKLQkJCXRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlcihhUHJvamVjdCwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUZpbGUgZmlsZSkgewotCQkvLyBUaGlzICpzZWVtcyogdG8gZG8gdGhlIHNhbWUgYmFzaWMgdGhpbmcgYXMgYmVsb3csIGJ1dCBjaXJjdW12ZW50cyB0aGUKLQkJLy8gVVJJIG11bmdpbmcgdGhhdCBBcnRpZmFjdEVkaXRNb2RlbCBkb2VzIChzZWUgYnVnIDIwOTA5MykKLQkJdHJ5IHsKLQkJCVBlcnNpc3RlbmNlUmVzb3VyY2UgcmVzb3VyY2UgPSAKLQkJCQkJKFBlcnNpc3RlbmNlUmVzb3VyY2UpIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKTsKLQkJCWlmICghIHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQlyZXNvdXJjZS5sb2FkKGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRMb2FkT3B0aW9ucygpKTsKLQkJCX0KLQkJCXJldHVybiByZXNvdXJjZTsKLQkJfQotCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJSnB0Q29yZVBsdWdpbi5sb2coaW9lKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW5jZVJlc291cmNlIGdldFJlc291cmNlKFN0cmluZyBmaWxlVVJJKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFBlcnNpc3RlbmNlUmVzb3VyY2UpIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShmaWxlVVJJKSk7Ci0JCX0KLQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHBlcnNpc3RlbmNlIHJlc291cmNlIGZvciB0aGUgZGVmYXVsdCBkZXBsb3kgbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKEpwdENvcmVQbHVnaW4uZ2V0UGVyc2lzdGVuY2VYbWxEZXBsb3ltZW50VVJJKGdldFByb2plY3QoKSkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBwZXJzaXN0ZW5jZSByZXNvdXJjZSB3aXRoIGJhc2UgZGVmYXVsdHMKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VSZXNvdXJjZSBjcmVhdGVEZWZhdWx0UmVzb3VyY2UoKSB7Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotCQlYbWxQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2UoKTsKLQkJcGVyc2lzdGVuY2Uuc2V0VmVyc2lvbigiMS4wIik7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCBwVW5pdCA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBVbml0LnNldE5hbWUoZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCXBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5hZGQocFVuaXQpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChwZXJzaXN0ZW5jZSk7Ci0JCXNhdmUobnVsbCk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VGYWN0b3J5LmphdmEKaW5kZXggNGZiZWRhYS4uZGM3OTVkMSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlRmFjdG9yeS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZUZhY3RvcnkuamF2YQpAQCAtMSwxNSArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwpAQCAtMjEsMTIgKzIyLDYgQEAKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KICAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UKICAqIEBnZW5lcmF0ZWQKQEAgLTg1LDEwICs4MCwxMSBAQAogCXsKIAkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCiAJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9KQVZBX0NMQVNTX1JFRjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX0pBUl9GSUxFX1JFRjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEphckZpbGVSZWYoKTsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9NQVBQSU5HX0ZJTEVfUkVGOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFBlcnNpc3RlbmNlKCk7CiAJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX01BUFBJTkdfRklMRV9SRUY6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX0pBVkFfQ0xBU1NfUkVGOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7CiAJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUFJPUEVSVElFUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFByb3BlcnRpZXMoKTsKIAkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QUk9QRVJUWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFByb3BlcnR5KCk7CiAJCQlkZWZhdWx0OgpAQCAtMTA4LDEwICsxMDQsNiBAQAogCQl7CiAJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9UUkFOU0FDVElPTl9UWVBFOgogCQkJCXJldHVybiBjcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX1RSQU5TQUNUSU9OX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiBjcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9WRVJTSU9OOgotCQkJCXJldHVybiBjcmVhdGVYbWxWZXJzaW9uRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQlkZWZhdWx0OgogCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CiAJCX0KQEAgLTEyOSwxMCArMTIxLDYgQEAKIAkJewogCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfVFJBTlNBQ1RJT05fVFlQRToKIAkJCQlyZXR1cm4gY29udmVydFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9UUkFOU0FDVElPTl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfVkVSU0lPTjoKLQkJCQlyZXR1cm4gY29udmVydFhtbFZlcnNpb25Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJZGVmYXVsdDoKIAkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwogCQl9CkBAIC0xNDMsNiArMTMxLDM5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBYbWxKYXZhQ2xhc3NSZWYgY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCkKKwl7CisJCVhtbEphdmFDbGFzc1JlZiB4bWxKYXZhQ2xhc3NSZWYgPSBuZXcgWG1sSmF2YUNsYXNzUmVmKCk7CisJCXJldHVybiB4bWxKYXZhQ2xhc3NSZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbEphckZpbGVSZWYgY3JlYXRlWG1sSmFyRmlsZVJlZigpCisJeworCQlYbWxKYXJGaWxlUmVmIHhtbEphckZpbGVSZWYgPSBuZXcgWG1sSmFyRmlsZVJlZigpOworCQlyZXR1cm4geG1sSmFyRmlsZVJlZjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sTWFwcGluZ0ZpbGVSZWYgY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKQorCXsKKwkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgPSBuZXcgWG1sTWFwcGluZ0ZpbGVSZWYoKTsKKwkJcmV0dXJuIHhtbE1hcHBpbmdGaWxlUmVmOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZSBjcmVhdGVYbWxQZXJzaXN0ZW5jZSgpCiAJewogCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IG5ldyBYbWxQZXJzaXN0ZW5jZSgpOwpAQCAtMTY1LDI4ICsxODYsNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgWG1sTWFwcGluZ0ZpbGVSZWYgY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKQotCXsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgPSBuZXcgWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJcmV0dXJuIHhtbE1hcHBpbmdGaWxlUmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKYXZhQ2xhc3NSZWYgY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCkKLQl7Ci0JCVhtbEphdmFDbGFzc1JlZiB4bWxKYXZhQ2xhc3NSZWYgPSBuZXcgWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCXJldHVybiB4bWxKYXZhQ2xhc3NSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCiAJcHVibGljIFhtbFByb3BlcnRpZXMgY3JlYXRlWG1sUHJvcGVydGllcygpCiAJewogCQlYbWxQcm9wZXJ0aWVzIHhtbFByb3BlcnRpZXMgPSBuZXcgWG1sUHJvcGVydGllcygpOwpAQCAtMjMxLDQ2ICsyMzAsNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRW51bWVyYXRvciBjcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlyZXR1cm4gKEVudW1lcmF0b3Ipc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0WG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVYbWxWZXJzaW9uRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0WG1sVmVyc2lvblRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwogCXB1YmxpYyBQZXJzaXN0ZW5jZVBhY2thZ2UgZ2V0UGVyc2lzdGVuY2VQYWNrYWdlKCkKIAl7CiAJCXJldHVybiAoUGVyc2lzdGVuY2VQYWNrYWdlKWdldEVQYWNrYWdlKCk7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQYWNrYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQYWNrYWdlLmphdmEKaW5kZXggOWNiMjMzMS4uOGIxNGQzYSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUGFja2FnZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVBhY2thZ2UuamF2YQpAQCAtMSwxOCArMSwxOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CkBAIC0yMCw2ICsyMCw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2U7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTMxLDEyICszNCw2IEBACiAgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KICAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CiAgKiA8L3VsPgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3RvcnkKICAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgpAQCAtNzcsMTU5ICs3NCw2MCBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZS5pbml0KCk7CiAKIAkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlIDxlbT5YbWwgUGVyc2lzdGVuY2U8L2VtPn0nIGNsYXNzLgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmIDxlbT5YbWwgSmF2YSBDbGFzcyBSZWY8L2VtPn0nIGNsYXNzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlKCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbEphdmFDbGFzc1JlZigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRSA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pBVkFfQ0xBU1NfUkVGID0gMDsKIAogCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkphdmEgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9fUEVSU0lTVEVOQ0VfVU5JVFMgPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KQVZBX0NMQVNTX1JFRl9fSkFWQV9DTEFTUyA9IDA7CiAKIAkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgSmF2YSBDbGFzcyBSZWY8L2VtPicgY2xhc3MuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfX1ZFUlNJT04gPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KQVZBX0NMQVNTX1JFRl9GRUFUVVJFX0NPVU5UID0gMTsKIAogCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUGVyc2lzdGVuY2U8L2VtPicgY2xhc3MuCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXJGaWxlUmVmIDxlbT5YbWwgSmFyIEZpbGUgUmVmPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbEphckZpbGVSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSkFSX0ZJTEVfUkVGID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9GRUFUVVJFX0NPVU5UID0gMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSkFSX0ZJTEVfUkVGX19GSUxFX05BTUUgPSAwOwogCiAJLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBKYXIgRmlsZSBSZWY8L2VtPicgY2xhc3MuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fREVTQ1JJUFRJT04gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3ZpZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVIgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkp0YSBEYXRhIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0pUQV9EQVRBX1NPVVJDRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX05PTl9KVEFfREFUQV9TT1VSQ0UgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBpbmcgRmlsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX01BUFBJTkdfRklMRVMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkphciBGaWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzc2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX19DTEFTU0VTID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIFVubGlzdGVkIENsYXNzZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX19FWENMVURFX1VOTElTVEVEX0NMQVNTRVMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX19QUk9QRVJUSUVTID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTkFNRSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1RSQU5TQUNUSU9OX1RZUEUgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0ZFQVRVUkVfQ09VTlQgPSAxMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSkFSX0ZJTEVfUkVGX0ZFQVRVUkVfQ09VTlQgPSAxOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZiA8ZW0+WG1sIE1hcHBpbmcgRmlsZSBSZWY8L2VtPn0nIGNsYXNzLgpAQCAtMjYwLDMyICsxNTgsMTg2IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBJTkdfRklMRV9SRUZfRkVBVFVSRV9DT1VOVCA9IDE7CiAKIAkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZiA8ZW0+WG1sIEphdmEgQ2xhc3MgUmVmPC9lbT59JyBjbGFzcy4KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlIDxlbT5YbWwgUGVyc2lzdGVuY2U8L2VtPn0nIGNsYXNzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWYKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxKYXZhQ2xhc3NSZWYoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2UKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KQVZBX0NMQVNTX1JFRiA9IDM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFID0gMzsKIAogCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KYXZhIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KQVZBX0NMQVNTX1JFRl9fSkFWQV9DTEFTUyA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX19WRVJTSU9OID0gQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX19WRVJTSU9OOwogCiAJLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBKYXZhIENsYXNzIFJlZjwvZW0+JyBjbGFzcy4KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSkFWQV9DTEFTU19SRUZfRkVBVFVSRV9DT1VOVCA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX19TQ0hFTUFfTE9DQVRJT04gPSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfX1NDSEVNQV9MT0NBVElPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfX1BFUlNJU1RFTkNFX1VOSVRTID0gQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVQgPSA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXJlZCBDYWNoZSBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fU0hBUkVEX0NBQ0hFX01PREUgPSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUXzIwX19TSEFSRURfQ0FDSEVfTU9ERTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0aW9uIE1vZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX19WQUxJREFUSU9OX01PREUgPSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUXzIwX19WQUxJREFUSU9OX01PREU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX19ERVNDUklQVElPTiA9IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjBfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvdmlkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX19QUk9WSURFUiA9IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjBfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SnRhIERhdGEgU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSlRBX0RBVEFfU09VUkNFID0gUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMF9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob24gSnRhIERhdGEgU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTk9OX0pUQV9EQVRBX1NPVVJDRSA9IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjBfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGluZyBGaWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTUFQUElOR19GSUxFUyA9IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjBfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SmFyIEZpbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX19KQVJfRklMRVMgPSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUXzIwX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0NMQVNTRVMgPSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUXzIwX0ZFQVRVUkVfQ09VTlQgKyA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0VYQ0xVREVfVU5MSVNURURfQ0xBU1NFUyA9IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjBfRkVBVFVSRV9DT1VOVCArIDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1BST1BFUlRJRVMgPSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUXzIwX0ZFQVRVUkVfQ09VTlQgKyA4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX19OQU1FID0gUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMF9GRUFUVVJFX0NPVU5UICsgOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fVFJBTlNBQ1RJT05fVFlQRSA9IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjBfRkVBVFVSRV9DT1VOVCArIDEwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfRkVBVFVSRV9DT1VOVCA9IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjBfRkVBVFVSRV9DT1VOVCArIDExOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0aWVzIDxlbT5YbWwgUHJvcGVydGllczwvZW0+fScgY2xhc3MuCkBAIC0yOTUsNyArMzQ3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQcm9wZXJ0aWVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRJRVMgPSA0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUSUVTID0gNTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTMyMyw3ICszNzUsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFByb3BlcnR5KCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZID0gNTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJPUEVSVFkgPSA2OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTM2MCwyNyArNDEyLDI4IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfVFJBTlNBQ1RJT05fVFlQRSA9IDY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfVFJBTlNBQ1RJT05fVFlQRSA9IDc7CiAKIAkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFRyYW5zYWN0aW9uIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVPYmplY3QoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9UUkFOU0FDVElPTl9UWVBFX09CSkVDVCA9IDc7CisJcHJpdmF0ZSBFQ2xhc3MgeG1sSmF2YUNsYXNzUmVmRUNsYXNzID0gbnVsbDsKIAogCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+WG1sIFZlcnNpb248L2VtPicgZGF0YSB0eXBlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sVmVyc2lvbigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OID0gODsKKwlwcml2YXRlIEVDbGFzcyB4bWxKYXJGaWxlUmVmRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbE1hcHBpbmdGaWxlUmVmRUNsYXNzID0gbnVsbDsKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC00MDEsMjAgKzQ1NCw2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE1hcHBpbmdGaWxlUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEphdmFDbGFzc1JlZkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KIAlwcml2YXRlIEVDbGFzcyB4bWxQcm9wZXJ0aWVzRUNsYXNzID0gbnVsbDsKIAogCS8qKgpAQCAtNDMyLDIwICs0NzEsNiBAQAogCXByaXZhdGUgRUVudW0geG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlRUVudW0gPSBudWxsOwogCiAJLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgeG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHhtbFZlcnNpb25FRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCiAJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAogCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCiAJICogcGFja2FnZSBVUkkgdmFsdWUuCkBAIC00NzMsMjAgKzQ5OCwxMCBAQAogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKIAogCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgorCSAqIAorCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgUGVyc2lzdGVuY2VQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgorCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAc2VlICNlTlNfVVJJCkBAIC00OTksNyArNTE0LDcgQEAKIAkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFBlcnNpc3RlbmNlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSk7CiAKIAkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlQZXJzaXN0ZW5jZVBhY2thZ2UgdGhlUGVyc2lzdGVuY2VQYWNrYWdlID0gKFBlcnNpc3RlbmNlUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBQZXJzaXN0ZW5jZVBhY2thZ2UoKSk7CisJCVBlcnNpc3RlbmNlUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVBhY2thZ2UgPSAoUGVyc2lzdGVuY2VQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgUGVyc2lzdGVuY2VQYWNrYWdlKCkpOwogCiAJCWlzSW5pdGVkID0gdHJ1ZTsKIApAQCAtNTA4LDI3NiArNTIzLDM2IEBACiAJCVhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKIAogCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcworCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwogCQlPcm1QYWNrYWdlIHRoZU9ybVBhY2thZ2UgPSAoT3JtUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIE9ybVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1QYWNrYWdlLmVOU19VUkkpIDogT3JtUGFja2FnZS5lSU5TVEFOQ0UpOworCQlPcm1WMl8wUGFja2FnZSB0aGVPcm1WMl8wUGFja2FnZSA9IChPcm1WMl8wUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBPcm1WMl8wUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVYyXzBQYWNrYWdlLmVOU19VUkkpIDogT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJUGVyc2lzdGVuY2VWMl8wUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID0gKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5lTlNfVVJJKSA6IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZUlOU1RBTkNFKTsKIAogCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwogCQl0aGVQZXJzaXN0ZW5jZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CiAJCXRoZU9ybVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU9ybVYyXzBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwogCiAJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKIAkJdGhlUGVyc2lzdGVuY2VQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CiAJCXRoZU9ybVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwogCiAJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKIAkJdGhlUGVyc2lzdGVuY2VQYWNrYWdlLmZyZWV6ZSgpOwogCisgIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KFBlcnNpc3RlbmNlUGFja2FnZS5lTlNfVVJJLCB0aGVQZXJzaXN0ZW5jZVBhY2thZ2UpOwogCQlyZXR1cm4gdGhlUGVyc2lzdGVuY2VQYWNrYWdlOwogCX0KIAogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2UgPGVtPlhtbCBQZXJzaXN0ZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGVyc2lzdGVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFBlcnNpc3RlbmNlKCkKLQl7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZSNnZXRQZXJzaXN0ZW5jZVVuaXRzIDxlbT5QZXJzaXN0ZW5jZSBVbml0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGVyc2lzdGVuY2UgVW5pdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZSNnZXRQZXJzaXN0ZW5jZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBlcnNpc3RlbmNlX1BlcnNpc3RlbmNlVW5pdHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFBlcnNpc3RlbmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2UjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZV9WZXJzaW9uKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0IDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF9EZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRQcm92aWRlciA8ZW0+UHJvdmlkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm92aWRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRQcm92aWRlcigpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1Byb3ZpZGVyKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldEp0YURhdGFTb3VyY2UgPGVtPkp0YSBEYXRhIFNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkp0YSBEYXRhIFNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRKdGFEYXRhU291cmNlKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfSnRhRGF0YVNvdXJjZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXROb25KdGFEYXRhU291cmNlIDxlbT5Ob24gSnRhIERhdGEgU291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXROb25KdGFEYXRhU291cmNlKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfTm9uSnRhRGF0YVNvdXJjZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldE1hcHBpbmdGaWxlcyA8ZW0+TWFwcGluZyBGaWxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWFwcGluZyBGaWxlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRNYXBwaW5nRmlsZXMoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF9NYXBwaW5nRmlsZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRKYXJGaWxlcyA8ZW0+SmFyIEZpbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5KYXIgRmlsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0SmFyRmlsZXMoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF9KYXJGaWxlcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldENsYXNzZXMgPGVtPkNsYXNzZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNsYXNzZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0Q2xhc3NlcygpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0NsYXNzZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcyA8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF9FeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldFByb3BlcnRpZXMoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF9Qcm9wZXJ0aWVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfVHJhbnNhY3Rpb25UeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZiA8ZW0+WG1sIE1hcHBpbmcgRmlsZSBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHBpbmcgRmlsZSBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hcHBpbmdGaWxlUmVmKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwaW5nRmlsZVJlZkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWYjZ2V0RmlsZU5hbWUgPGVtPkZpbGUgTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbGUgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmI2dldEZpbGVOYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwaW5nRmlsZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hcHBpbmdGaWxlUmVmX0ZpbGVOYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYXBwaW5nRmlsZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmIDxlbT5YbWwgSmF2YSBDbGFzcyBSZWY8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC03OTAsNyArNTY1LDYgQEAKIAkJcmV0dXJuIHhtbEphdmFDbGFzc1JlZkVDbGFzczsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmI2dldEphdmFDbGFzcyA8ZW0+SmF2YSBDbGFzczwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTgwNSw2ICs1NzksMjUzIEBACiAJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxKYXZhQ2xhc3NSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKIAl9CiAKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXJGaWxlUmVmIDxlbT5YbWwgSmFyIEZpbGUgUmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBKYXIgRmlsZSBSZWY8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXJGaWxlUmVmCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSmFyRmlsZVJlZigpCisJeworCQlyZXR1cm4geG1sSmFyRmlsZVJlZkVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphckZpbGVSZWYjZ2V0RmlsZU5hbWUgPGVtPkZpbGUgTmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbGUgTmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphckZpbGVSZWYjZ2V0RmlsZU5hbWUoKQorCSAqIEBzZWUgI2dldFhtbEphckZpbGVSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxKYXJGaWxlUmVmX0ZpbGVOYW1lKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxKYXJGaWxlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWYgPGVtPlhtbCBNYXBwaW5nIEZpbGUgUmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYXBwaW5nIEZpbGUgUmVmPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWYKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxNYXBwaW5nRmlsZVJlZigpCisJeworCQlyZXR1cm4geG1sTWFwcGluZ0ZpbGVSZWZFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZiNnZXRGaWxlTmFtZSA8ZW0+RmlsZSBOYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmlsZSBOYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWYjZ2V0RmlsZU5hbWUoKQorCSAqIEBzZWUgI2dldFhtbE1hcHBpbmdGaWxlUmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTWFwcGluZ0ZpbGVSZWZfRmlsZU5hbWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE1hcHBpbmdGaWxlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2UgPGVtPlhtbCBQZXJzaXN0ZW5jZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGVyc2lzdGVuY2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFBlcnNpc3RlbmNlKCkKKwl7CisJCXJldHVybiB4bWxQZXJzaXN0ZW5jZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2UjZ2V0UGVyc2lzdGVuY2VVbml0cyA8ZW0+UGVyc2lzdGVuY2UgVW5pdHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBlcnNpc3RlbmNlIFVuaXRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2UjZ2V0UGVyc2lzdGVuY2VVbml0cygpCisJICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQZXJzaXN0ZW5jZV9QZXJzaXN0ZW5jZVVuaXRzKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQZXJzaXN0ZW5jZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQorCXsKKwkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXREZXNjcmlwdGlvbigpCisJICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0Rlc2NyaXB0aW9uKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRQcm92aWRlciA8ZW0+UHJvdmlkZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm92aWRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRQcm92aWRlcigpCisJICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1Byb3ZpZGVyKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRKdGFEYXRhU291cmNlIDxlbT5KdGEgRGF0YSBTb3VyY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KdGEgRGF0YSBTb3VyY2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0SnRhRGF0YVNvdXJjZSgpCisJICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0p0YURhdGFTb3VyY2UoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldE5vbkp0YURhdGFTb3VyY2UgPGVtPk5vbiBKdGEgRGF0YSBTb3VyY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob24gSnRhIERhdGEgU291cmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldE5vbkp0YURhdGFTb3VyY2UoKQorCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF9Ob25KdGFEYXRhU291cmNlKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldE1hcHBpbmdGaWxlcyA8ZW0+TWFwcGluZyBGaWxlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWFwcGluZyBGaWxlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRNYXBwaW5nRmlsZXMoKQorCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF9NYXBwaW5nRmlsZXMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0SmFyRmlsZXMgPGVtPkphciBGaWxlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SmFyIEZpbGVzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldEphckZpbGVzKCkKKwkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfSmFyRmlsZXMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0Q2xhc3NlcyA8ZW0+Q2xhc3NlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2xhc3NlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRDbGFzc2VzKCkKKwkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfQ2xhc3NlcygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcyA8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKQorCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF9FeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRQcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJvcGVydGllczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRQcm9wZXJ0aWVzKCkKKwkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfUHJvcGVydGllcygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0TmFtZSgpCisJICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X05hbWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKKwkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfVHJhbnNhY3Rpb25UeXBlKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7CisJfQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydGllcyA8ZW0+WG1sIFByb3BlcnRpZXM8L2VtPn0nLgpAQCAtODE5LDcgKzg0MCw2IEBACiAJCXJldHVybiB4bWxQcm9wZXJ0aWVzRUNsYXNzOwogCX0KIAotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnRpZXMjZ2V0UHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTgzNCw3ICs4NTQsNiBAQAogCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUHJvcGVydGllc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwogCX0KIAotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHkgPGVtPlhtbCBQcm9wZXJ0eTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTg0OCw3ICs4NjcsNiBAQAogCQlyZXR1cm4geG1sUHJvcGVydHlFQ2xhc3M7CiAJfQogCi0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC04NjMsNyArODgxLDYgQEAKIAkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAJfQogCi0KIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTg3OCw3ICs4OTUsNiBAQAogCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKIAl9CiAKLQogCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBUcmFuc2FjdGlvbiBUeXBlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtODkyLDM3ICs5MDgsNiBAQAogCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlRUVudW07CiAJfQogCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFRyYW5zYWN0aW9uIFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBUcmFuc2FjdGlvbiBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZU9iamVjdCgpCi0JewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlhtbCBWZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5YbWwgVmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRYbWxWZXJzaW9uKCkKLQl7Ci0JCXJldHVybiB4bWxWZXJzaW9uRURhdGFUeXBlOwotCX0KLQotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTk1NSw5ICs5NDAsMTcgQEAKIAkJaXNDcmVhdGVkID0gdHJ1ZTsKIAogCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJeG1sSmF2YUNsYXNzUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KQVZBX0NMQVNTX1JFRik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sSmF2YUNsYXNzUmVmRUNsYXNzLCBYTUxfSkFWQV9DTEFTU19SRUZfX0pBVkFfQ0xBU1MpOworCisJCXhtbEphckZpbGVSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0pBUl9GSUxFX1JFRik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sSmFyRmlsZVJlZkVDbGFzcywgWE1MX0pBUl9GSUxFX1JFRl9fRklMRV9OQU1FKTsKKworCQl4bWxNYXBwaW5nRmlsZVJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQUElOR19GSUxFX1JFRik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTWFwcGluZ0ZpbGVSZWZFQ2xhc3MsIFhNTF9NQVBQSU5HX0ZJTEVfUkVGX19GSUxFX05BTUUpOworCiAJCXhtbFBlcnNpc3RlbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QRVJTSVNURU5DRSk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUGVyc2lzdGVuY2VFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9fUEVSU0lTVEVOQ0VfVU5JVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfX1ZFUlNJT04pOwogCiAJCXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVCk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fREVTQ1JJUFRJT04pOwpAQCAtOTY1LDE5ICs5NTgsMTMgQEAKIAkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX19KVEFfREFUQV9TT1VSQ0UpOwogCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX05PTl9KVEFfREFUQV9TT1VSQ0UpOwogCQljcmVhdGVFUmVmZXJlbmNlKHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX01BUFBJTkdfRklMRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0pBUl9GSUxFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTKTsKIAkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX19DTEFTU0VTKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX19FWENMVURFX1VOTElTVEVEX0NMQVNTRVMpOwogCQljcmVhdGVFUmVmZXJlbmNlKHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1BST1BFUlRJRVMpOwogCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX05BTUUpOwogCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1RSQU5TQUNUSU9OX1RZUEUpOwogCi0JCXhtbE1hcHBpbmdGaWxlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQVBQSU5HX0ZJTEVfUkVGKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNYXBwaW5nRmlsZVJlZkVDbGFzcywgWE1MX01BUFBJTkdfRklMRV9SRUZfX0ZJTEVfTkFNRSk7Ci0KLQkJeG1sSmF2YUNsYXNzUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KQVZBX0NMQVNTX1JFRik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sSmF2YUNsYXNzUmVmRUNsYXNzLCBYTUxfSkFWQV9DTEFTU19SRUZfX0pBVkFfQ0xBU1MpOwotCiAJCXhtbFByb3BlcnRpZXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BST1BFUlRJRVMpOwogCQljcmVhdGVFUmVmZXJlbmNlKHhtbFByb3BlcnRpZXNFQ2xhc3MsIFhNTF9QUk9QRVJUSUVTX19QUk9QRVJUSUVTKTsKIApAQCAtOTg3LDEwICs5NzQsNiBAQAogCiAJCS8vIENyZWF0ZSBlbnVtcwogCQl4bWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFhNTF9QRVJTSVNURU5DRV9VTklUX1RSQU5TQUNUSU9OX1RZUEUpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCXhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShYTUxfUEVSU0lTVEVOQ0VfVU5JVF9UUkFOU0FDVElPTl9UWVBFX09CSkVDVCk7Ci0JCXhtbFZlcnNpb25FRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoWE1MX1ZFUlNJT04pOwogCX0KIAogCS8qKgpAQCAtMTAxOCwzOSArMTAwMSw0OCBAQAogCQlzZXROc1VSSShlTlNfVVJJKTsKIAogCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOworCQlQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlIHRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UgPSAoUGVyc2lzdGVuY2VWMl8wUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLmVOU19VUkkpOwogCQlFY29yZVBhY2thZ2UgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7CisJCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7CisJCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIEFkZCBzdWJwYWNrYWdlcworCQlnZXRFU3VicGFja2FnZXMoKS5hZGQodGhlUGVyc2lzdGVuY2VWMl8wUGFja2FnZSk7CiAKIAkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwogCiAJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwogCiAJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJeG1sUGVyc2lzdGVuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRBYnN0cmFjdEpwYVJvb3RFT2JqZWN0KCkpOworCQl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wKCkpOwogCiAJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCWluaXRFQ2xhc3MoeG1sSmF2YUNsYXNzUmVmRUNsYXNzLCBYbWxKYXZhQ2xhc3NSZWYuY2xhc3MsICJYbWxKYXZhQ2xhc3NSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbEphdmFDbGFzc1JlZl9KYXZhQ2xhc3MoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImphdmFDbGFzcyIsICIiLCAwLCAxLCBYbWxKYXZhQ2xhc3NSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbEphckZpbGVSZWZFQ2xhc3MsIFhtbEphckZpbGVSZWYuY2xhc3MsICJYbWxKYXJGaWxlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxKYXJGaWxlUmVmX0ZpbGVOYW1lKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJmaWxlTmFtZSIsICIiLCAwLCAxLCBYbWxKYXJGaWxlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxNYXBwaW5nRmlsZVJlZkVDbGFzcywgWG1sTWFwcGluZ0ZpbGVSZWYuY2xhc3MsICJYbWxNYXBwaW5nRmlsZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTWFwcGluZ0ZpbGVSZWZfRmlsZU5hbWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZpbGVOYW1lIiwgIiIsIDAsIDEsIFhtbE1hcHBpbmdGaWxlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7CisKIAkJaW5pdEVDbGFzcyh4bWxQZXJzaXN0ZW5jZUVDbGFzcywgWG1sUGVyc2lzdGVuY2UuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUGVyc2lzdGVuY2VfUGVyc2lzdGVuY2VVbml0cygpLCB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0cyIsIG51bGwsIDAsIC0xLCBYbWxQZXJzaXN0ZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VfVmVyc2lvbigpLCB0aGlzLmdldFhtbFZlcnNpb24oKSwgInZlcnNpb24iLCBudWxsLCAxLCAxLCBYbWxQZXJzaXN0ZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAKIAkJaW5pdEVDbGFzcyh4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIlhtbFBlcnNpc3RlbmNlVW5pdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0Rlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfUHJvdmlkZXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm92aWRlciIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9KdGFEYXRhU291cmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAianRhRGF0YVNvdXJjZSIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9Ob25KdGFEYXRhU291cmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibm9uSnRhRGF0YVNvdXJjZSIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9NYXBwaW5nRmlsZXMoKSwgdGhpcy5nZXRYbWxNYXBwaW5nRmlsZVJlZigpLCBudWxsLCAibWFwcGluZ0ZpbGVzIiwgbnVsbCwgMCwgLTEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9KYXJGaWxlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImphckZpbGVzIiwgbnVsbCwgMCwgLTEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9DbGFzc2VzKCksIHRoaXMuZ2V0WG1sSmF2YUNsYXNzUmVmKCksIG51bGwsICJjbGFzc2VzIiwgbnVsbCwgMCwgLTEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9NYXBwaW5nRmlsZXMoKSwgdGhpcy5nZXRYbWxNYXBwaW5nRmlsZVJlZigpLCBudWxsLCAibWFwcGluZ0ZpbGVzIiwgbnVsbCwgMCwgLTEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0phckZpbGVzKCksIHRoaXMuZ2V0WG1sSmFyRmlsZVJlZigpLCBudWxsLCAiamFyRmlsZXMiLCBudWxsLCAwLCAtMSwgWG1sUGVyc2lzdGVuY2VVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfQ2xhc3NlcygpLCB0aGlzLmdldFhtbEphdmFDbGFzc1JlZigpLCBudWxsLCAiY2xhc3NlcyIsIG51bGwsIDAsIC0xLCBYbWxQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9FeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFUmVmZXJlbmNlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9Qcm9wZXJ0aWVzKCksIHRoaXMuZ2V0WG1sUHJvcGVydGllcygpLCBudWxsLCAicHJvcGVydGllcyIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgWG1sUGVyc2lzdGVuY2VVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1RyYW5zYWN0aW9uVHlwZSgpLCB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSgpLCAidHJhbnNhY3Rpb25UeXBlIiwgIkpUQSIsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAKLQkJaW5pdEVDbGFzcyh4bWxNYXBwaW5nRmlsZVJlZkVDbGFzcywgWG1sTWFwcGluZ0ZpbGVSZWYuY2xhc3MsICJYbWxNYXBwaW5nRmlsZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTWFwcGluZ0ZpbGVSZWZfRmlsZU5hbWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZpbGVOYW1lIiwgIiIsIDAsIDEsIFhtbE1hcHBpbmdGaWxlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxKYXZhQ2xhc3NSZWZFQ2xhc3MsIFhtbEphdmFDbGFzc1JlZi5jbGFzcywgIlhtbEphdmFDbGFzc1JlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSmF2YUNsYXNzUmVmX0phdmFDbGFzcygpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF2YUNsYXNzIiwgIiIsIDAsIDEsIFhtbEphdmFDbGFzc1JlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOwotCiAJCWluaXRFQ2xhc3MoeG1sUHJvcGVydGllc0VDbGFzcywgWG1sUHJvcGVydGllcy5jbGFzcywgIlhtbFByb3BlcnRpZXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAJCWluaXRFUmVmZXJlbmNlKGdldFhtbFByb3BlcnRpZXNfUHJvcGVydGllcygpLCB0aGlzLmdldFhtbFByb3BlcnR5KCksIG51bGwsICJwcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIFhtbFByb3BlcnRpZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAKQEAgLTEwNjMsMTAgKzEwNTUsNiBAQAogCQlhZGRFRW51bUxpdGVyYWwoeG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlRUVudW0sIFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5KVEEpOwogCQlhZGRFRW51bUxpdGVyYWwoeG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlRUVudW0sIFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTCk7CiAKLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoeG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0RURhdGFUeXBlLCBFbnVtZXJhdG9yLmNsYXNzLCAiWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVEYXRhVHlwZSh4bWxWZXJzaW9uRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJYbWxWZXJzaW9uIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQogCQkvLyBDcmVhdGUgcmVzb3VyY2UKIAkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CiAJfQpAQCAtMTA4Niw2ICsxMDc0LDYwIEBACiAJcHVibGljIGludGVyZmFjZSBMaXRlcmFscwogCXsKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWYgPGVtPlhtbCBKYXZhIENsYXNzIFJlZjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxKYXZhQ2xhc3NSZWYoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSkFWQV9DTEFTU19SRUYgPSBlSU5TVEFOQ0UuZ2V0WG1sSmF2YUNsYXNzUmVmKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfSkFWQV9DTEFTU19SRUZfX0pBVkFfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sSmF2YUNsYXNzUmVmX0phdmFDbGFzcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZiA8ZW0+WG1sIEphciBGaWxlIFJlZjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphckZpbGVSZWYKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sSmFyRmlsZVJlZigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9KQVJfRklMRV9SRUYgPSBlSU5TVEFOQ0UuZ2V0WG1sSmFyRmlsZVJlZigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmlsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfSkFSX0ZJTEVfUkVGX19GSUxFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sSmFyRmlsZVJlZl9GaWxlTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWYgPGVtPlhtbCBNYXBwaW5nIEZpbGUgUmVmPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWYKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sTWFwcGluZ0ZpbGVSZWYoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQUElOR19GSUxFX1JFRiA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwaW5nRmlsZVJlZigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmlsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFQUElOR19GSUxFX1JFRl9fRklMRV9OQU1FID0gZUlOU1RBTkNFLmdldFhtbE1hcHBpbmdGaWxlUmVmX0ZpbGVOYW1lKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZSA8ZW0+WG1sIFBlcnNpc3RlbmNlPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMTA0LDE0ICsxMTQ2LDYgQEAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QRVJTSVNURU5DRV9fUEVSU0lTVEVOQ0VfVU5JVFMgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VfUGVyc2lzdGVuY2VVbml0cygpOwogCiAJCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BFUlNJU1RFTkNFX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlX1ZlcnNpb24oKTsKLQotCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQ8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTExNjIsMTIgKzExOTYsMTIgQEAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QRVJTSVNURU5DRV9VTklUX19NQVBQSU5HX0ZJTEVTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9NYXBwaW5nRmlsZXMoKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphciBGaWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphciBGaWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9KYXJGaWxlcygpOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0pBUl9GSUxFUyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfSmFyRmlsZXMoKTsKIAogCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCkBAIC0xMjEwLDQyICsxMjQ0LDYgQEAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX19UUkFOU0FDVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9UcmFuc2FjdGlvblR5cGUoKTsKIAogCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmIDxlbT5YbWwgTWFwcGluZyBGaWxlIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbE1hcHBpbmdGaWxlUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BUFBJTkdfRklMRV9SRUYgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01BUFBJTkdfRklMRV9SRUZfX0ZJTEVfTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwaW5nRmlsZVJlZl9GaWxlTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmIDxlbT5YbWwgSmF2YSBDbGFzcyBSZWY8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWYKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sSmF2YUNsYXNzUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0pBVkFfQ0xBU1NfUkVGID0gZUlOU1RBTkNFLmdldFhtbEphdmFDbGFzc1JlZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0pBVkFfQ0xBU1NfUkVGX19KQVZBX0NMQVNTID0gZUlOU1RBTkNFLmdldFhtbEphdmFDbGFzc1JlZl9KYXZhQ2xhc3MoKTsKLQotCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnRpZXMgPGVtPlhtbCBQcm9wZXJ0aWVzPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMjk5LDI2ICsxMjk3LDYgQEAKIAkJICovCiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gWE1MX1BFUlNJU1RFTkNFX1VOSVRfVFJBTlNBQ1RJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUoKTsKIAotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFRyYW5zYWN0aW9uIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRGF0YVR5cGUgWE1MX1BFUlNJU1RFTkNFX1VOSVRfVFJBTlNBQ1RJT05fVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5YbWwgVmVyc2lvbjwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sVmVyc2lvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRURhdGFUeXBlIFhNTF9WRVJTSU9OID0gZUlOU1RBTkNFLmdldFhtbFZlcnNpb24oKTsKLQogCX0KIAogfSAvL1BlcnNpc3RlbmNlUGFja2FnZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUmVzb3VyY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODk4NzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UudHJhbnNsYXRvcnMuUGVyc2lzdGVuY2VUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlUmVzb3VyY2UgZXh0ZW5kcyBKcGFYbWxSZXNvdXJjZQotewotCXB1YmxpYyBQZXJzaXN0ZW5jZVJlc291cmNlKFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcihhUmVuZGVyZXIpOwotCX0KLQotCXB1YmxpYyBQZXJzaXN0ZW5jZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcih1cmksIGFSZW5kZXJlcik7Ci0JfQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gUGVyc2lzdGVuY2VUcmFuc2xhdG9yLklOU1RBTkNFOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBUT0RPCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZUZyb21SZXNvdXJjZSgpIHsKLQkJLy8gVE9ETwotCX0KLQkKLQlwdWJsaWMgWG1sUGVyc2lzdGVuY2UgZ2V0UGVyc2lzdGVuY2UoKSB7Ci0JCXJldHVybiAoWG1sUGVyc2lzdGVuY2UpIGdldFJvb3RPYmplY3QoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VSZXNvdXJjZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGIzNDk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeQotewotCXB1YmxpYyBQZXJzaXN0ZW5jZVJlc291cmNlRmFjdG9yeSgpIHsKLQkJdGhpcyhSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFSZW5kZXJlckZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnksIGJvb2xlYW4gbGlzdGVuaW5nRm9yVXBkYXRlcykgewotCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5LCBsaXN0ZW5pbmdGb3JVcGRhdGVzKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5I2NyZWF0ZVJlc291cmNlKFVSSSwgUmVuZGVyZXIpCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciByZW5kZXJlcikgewotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlUmVzb3VyY2UodXJpLCByZW5kZXJlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ZlNjJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFYbWxSZXNvdXJjZU1vZGVsOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbCBleHRlbmRzIEpwYVhtbFJlc291cmNlTW9kZWwKLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsKElGaWxlIGZpbGUpIHsKLQkJc3VwZXIoZmlsZSk7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgUmVzb3VyY2VNb2RlbCNnZXRSZXNvdXJjZVR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VNb2RlbC5QRVJTSVNURU5DRV9SRVNPVVJDRV9UWVBFOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgYnVpbGRBcnRpZmFjdEVkaXQoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWxSZXNvdXJjZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbFJlc291cmNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNTM2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWxSZXNvdXJjZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKKworLyoqCisgKiAKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbFJlc291cmNlRmFjdG9yeSBleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkKK3sKKwlwdWJsaWMgUGVyc2lzdGVuY2VYbWxSZXNvdXJjZUZhY3RvcnkoKSB7CisJCXRoaXMoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7CisJfQorCQorCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgeworCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5LCBib29sZWFuIGxpc3RlbmluZ0ZvclVwZGF0ZXMpIHsKKwkJc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSwgbGlzdGVuaW5nRm9yVXBkYXRlcyk7CisJfQorCQorCQorCS8qKgorCSAqIEBzZWUgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShVUkksIFJlbmRlcmVyKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgcmVuZGVyZXIpIHsKKwkJcmV0dXJuIG5ldyBKcGFYbWxSZXNvdXJjZSh1cmksIHJlbmRlcmVyLCBKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUsIFhtbFBlcnNpc3RlbmNlLmdldFJvb3RUcmFuc2xhdG9yKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxKYXJGaWxlUmVmLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sSmFyRmlsZVJlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTg0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sSmFyRmlsZVJlZi5qYXZhCkBAIC0wLDAgKzEsMjM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBKYXIgRmlsZSBSZWY8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZiNnZXRGaWxlTmFtZSA8ZW0+RmlsZSBOYW1lPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sSmFyRmlsZVJlZigpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxKYXJGaWxlUmVmIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWxlTmFtZSgpIDxlbT5GaWxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZpbGVOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX05BTUVfRURFRkFVTFQgPSAiIjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbGVOYW1lKCkgPGVtPkZpbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RmlsZU5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZmlsZU5hbWUgPSBGSUxFX05BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sSmFyRmlsZVJlZigpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBQZXJzaXN0ZW5jZVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0pBUl9GSUxFX1JFRjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GaWxlIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmlsZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRGaWxlTmFtZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sSmFyRmlsZVJlZl9GaWxlTmFtZSgpCisJICogQG1vZGVsIGRlZmF1bHQ9IiIgdW5pcXVlPSJmYWxzZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKQorCXsKKwkJcmV0dXJuIGZpbGVOYW1lOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphckZpbGVSZWYjZ2V0RmlsZU5hbWUgPGVtPkZpbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmlsZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRGaWxlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBuZXdGaWxlTmFtZSkKKwl7CisJCVN0cmluZyBvbGRGaWxlTmFtZSA9IGZpbGVOYW1lOworCQlmaWxlTmFtZSA9IG5ld0ZpbGVOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX0pBUl9GSUxFX1JFRl9fRklMRV9OQU1FLCBvbGRGaWxlTmFtZSwgZmlsZU5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9KQVJfRklMRV9SRUZfX0ZJTEVfTkFNRToKKwkJCQlyZXR1cm4gZ2V0RmlsZU5hbWUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfSkFSX0ZJTEVfUkVGX19GSUxFX05BTUU6CisJCQkJc2V0RmlsZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX0pBUl9GSUxFX1JFRl9fRklMRV9OQU1FOgorCQkJCXNldEZpbGVOYW1lKEZJTEVfTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9KQVJfRklMRV9SRUZfX0ZJTEVfTkFNRToKKwkJCQlyZXR1cm4gRklMRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBmaWxlTmFtZSAhPSBudWxsIDogIUZJTEVfTkFNRV9FREVGQVVMVC5lcXVhbHMoZmlsZU5hbWUpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChmaWxlTmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoZmlsZU5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmZpbGVOYW1lKSkgPworCQkJZ2V0VGV4dFRleHRSYW5nZSgpIDoKKwkJCXN1cGVyLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCisJCQkJZWxlbWVudE5hbWUsCisJCQkJc3RydWN0dXJhbEZlYXR1cmUsCisJCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKKwkJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCisJCQkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJCWJ1aWxkRmlsZU5hbWVUcmFuc2xhdG9yKCksCisJCQl9OworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRGaWxlTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcigKKwkJCQlUcmFuc2xhdG9yLlRFWFRfQVRUUklCVVRFX1ZBTFVFLAorCQkJCVBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSmFyRmlsZVJlZl9GaWxlTmFtZSgpCisJCQkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbEphdmFDbGFzc1JlZi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbEphdmFDbGFzc1JlZi5qYXZhCmluZGV4IDQ3OTJjNTAuLmVhMGQ0YjQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxKYXZhQ2xhc3NSZWYuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sSmF2YUNsYXNzUmVmLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtNywxMyArNywxNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yMDAsNCArMjA0LDI5IEBACiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CiAKLX0gLy8gWG1sSmF2YUNsYXNzUmVmCisKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJCWVsZW1lbnROYW1lLAorCQkJCXN0cnVjdHVyYWxGZWF0dXJlLAorCQkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCisJCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQorCQkJKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCQlidWlsZEZpbGVOYW1lVHJhbnNsYXRvcigpLAorCQkJfTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRmlsZU5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoCisJCQkJVHJhbnNsYXRvci5URVhUX0FUVFJJQlVURV9WQUxVRSwKKwkJCQlQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEphdmFDbGFzc1JlZl9KYXZhQ2xhc3MoKQorCQkJKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxNYXBwaW5nRmlsZVJlZi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbE1hcHBpbmdGaWxlUmVmLmphdmEKaW5kZXggNTU3YjliNy4uZDkzZWRhOSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbE1hcHBpbmdGaWxlUmVmLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbE1hcHBpbmdGaWxlUmVmLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtNywxMyArNywxOSBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0xMTcsNiArMTIzLDExIEBACiAJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX01BUFBJTkdfRklMRV9SRUZfX0ZJTEVfTkFNRSwgb2xkRmlsZU5hbWUsIGZpbGVOYW1lKSk7CiAJfQogCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PEFkYXB0ZXI+IGVBZGFwdGVycygpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gc3VwZXIuZUFkYXB0ZXJzKCk7CisJfQogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0yMDAsNCArMjExLDI5IEBACiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CiAKLX0gLy8gWG1sTWFwcGluZ0ZpbGVSZWYKKworCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCisJCQkJZWxlbWVudE5hbWUsCisJCQkJc3RydWN0dXJhbEZlYXR1cmUsCisJCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKKwkJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCisJCQkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJCWJ1aWxkRmlsZU5hbWVUcmFuc2xhdG9yKCksCisJCQl9OworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRGaWxlTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcigKKwkJCQlUcmFuc2xhdG9yLlRFWFRfQVRUUklCVVRFX1ZBTFVFLAorCQkJCVBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGluZ0ZpbGVSZWZfRmlsZU5hbWUoKQorCQkJKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQZXJzaXN0ZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlLmphdmEKaW5kZXggY2RjNzg0My4uYzU5MWQzNyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtNywxOSArNywyMyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlUm9vdFRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhUm9vdEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMzYsMTYgKzQwLDE0IEBACiAgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CiAgKiA8dWw+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2UjZ2V0UGVyc2lzdGVuY2VVbml0cyA8ZW0+UGVyc2lzdGVuY2UgVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgogICogPC91bD4KICAqIDwvcD4KICAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZSgpCiAgKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBYbWxQZXJzaXN0ZW5jZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKK3B1YmxpYyBjbGFzcyBYbWxQZXJzaXN0ZW5jZSBleHRlbmRzIEFic3RyYWN0SnBhUm9vdEVPYmplY3QKIHsKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZVVuaXRzKCkgPGVtPlBlcnNpc3RlbmNlIFVuaXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTU4LDI2ICs2MCw2IEBACiAJcHJvdGVjdGVkIEVMaXN0PFhtbFBlcnNpc3RlbmNlVW5pdD4gcGVyc2lzdGVuY2VVbml0czsKIAogCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCkBAIC04Niw2ICs2OCwxNiBAQAogCXsKIAkJc3VwZXIoKTsKIAl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVPYmplY3QgZUNvbnRhaW5lcigpIHsKKwkJcmV0dXJuIHN1cGVyLmVDb250YWluZXIoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZUJhc2ljU2V0Q29udGFpbmVyKEludGVybmFsRU9iamVjdCBuZXdDb250YWluZXIsIGludCBuZXdDb250YWluZXJGZWF0dXJlSUQpIHsKKwkJc3VwZXIuZUJhc2ljU2V0Q29udGFpbmVyKG5ld0NvbnRhaW5lciwgbmV3Q29udGFpbmVyRmVhdHVyZUlEKTsKKwl9CiAKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtOTksNDEgKzkxLDYgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlX1ZlcnNpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sVmVyc2lvbiIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpCi0JewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikKLQl7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCiAJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdH0uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTE4NCw4ICsxNDEsNiBAQAogCQl7CiAJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfX1BFUlNJU1RFTkNFX1VOSVRTOgogCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXRzKCk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKIAl9CkBAIC0yMDUsOSArMTYwLDYgQEAKIAkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRzKCkuY2xlYXIoKTsKIAkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQZXJzaXN0ZW5jZVVuaXQ+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47CiAJCX0KIAkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKIAl9CkBAIC0yMjUsOSArMTc3LDYgQEAKIAkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9fUEVSU0lTVEVOQ0VfVU5JVFM6CiAJCQkJZ2V0UGVyc2lzdGVuY2VVbml0cygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwogCQl9CiAJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwogCX0KQEAgLTI0NCwzNCArMTkzLDU3IEBACiAJCXsKIAkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9fUEVSU0lTVEVOQ0VfVU5JVFM6CiAJCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdHMgIT0gbnVsbCAmJiAhcGVyc2lzdGVuY2VVbml0cy5pc0VtcHR5KCk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbCA6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CiAJfQogCQogCQotCS8vICoqKioqKioqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkvLyAqKioqKioqKioqKioqKioqIHZlcnNpb24gLT4gc2NoZW1hIGxvY2F0aW9uIG1hcHBpbmcgKioqKioqKioqKioqKioqKioqKioKIAkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZXNwYWNlID0gSlBBLlNDSEVNQV9OQU1FU1BBQ0U7CisJCiAJQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgeworCQlyZXR1cm4gbmFtZXNwYWNlOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMgPSBidWlsZFZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMoKTsKKwkKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkVmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucygpIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJbWFwLnB1dChKUEEuU0NIRU1BX1ZFUlNJT04sIEpQQS5TQ0hFTUFfTE9DQVRJT04pOworCQltYXAucHV0KEpQQTJfMC5TQ0hFTUFfVkVSU0lPTiwgSlBBMl8wLlNDSEVNQV9MT0NBVElPTik7CisJCXJldHVybiBtYXA7CiAJfQogCQogCUBPdmVycmlkZQotCXB1YmxpYyBKcGFFT2JqZWN0IGdldFJvb3QoKSB7Ci0JCXJldHVybiB0aGlzOworCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb25Gb3JWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCXJldHVybiB2ZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zLmdldCh2ZXJzaW9uKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUk9PVF9UUkFOU0xBVE9SID0gYnVpbGRSb290VHJhbnNsYXRvcigpOworCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBnZXRSb290VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFJPT1RfVFJBTlNMQVRPUjsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJvb3RUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVJvb3RUcmFuc2xhdG9yKAorCQkJCUpQQS5QRVJTSVNURU5DRSwKKwkJCQlQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlKCksCisJCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJCWJ1aWxkVmVyc2lvblRyYW5zbGF0b3IodmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucyksCisJCQkJYnVpbGROYW1lc3BhY2VUcmFuc2xhdG9yKG5hbWVzcGFjZSksCisJCQkJYnVpbGRTY2hlbWFOYW1lc3BhY2VUcmFuc2xhdG9yKCksCisJCQkJYnVpbGRTY2hlbWFMb2NhdGlvblRyYW5zbGF0b3IobmFtZXNwYWNlLCB2ZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zKSwKKwkJCQlYbWxQZXJzaXN0ZW5jZVVuaXQuYnVpbGRUcmFuc2xhdG9yKEpQQS5QRVJTSVNURU5DRV9VTklULCBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlX1BlcnNpc3RlbmNlVW5pdHMoKSkKKwkJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlVW5pdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlVW5pdC5qYXZhCmluZGV4IGQzMWE4MGEuLjJlYWNiNjcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQZXJzaXN0ZW5jZVVuaXQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sUGVyc2lzdGVuY2VVbml0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtNyw2ICs3LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2U7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTE0LDEzICsxNSwyMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmNvbW1vbi5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5Cb29sZWFuVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5QZXJzaXN0ZW5jZVYyXzBQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdF8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC01MiwxMiArNjAsNDMgQEAKICAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQogICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgWG1sUGVyc2lzdGVuY2VVbml0IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAorcHVibGljIGNsYXNzIFhtbFBlcnNpc3RlbmNlVW5pdCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFBlcnNpc3RlbmNlVW5pdF8yXzAKIHsKIAkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAgU0hBUkVEX0NBQ0hFX01PREVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hhcmVkQ2FjaGVNb2RlKCkgPGVtPlNoYXJlZCBDYWNoZSBNb2RlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTaGFyZWRDYWNoZU1vZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAgc2hhcmVkQ2FjaGVNb2RlID0gU0hBUkVEX0NBQ0hFX01PREVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIFZBTElEQVRJT05fTU9ERV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWxpZGF0aW9uTW9kZSgpIDxlbT5WYWxpZGF0aW9uIE1vZGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbGlkYXRpb25Nb2RlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCB2YWxpZGF0aW9uTW9kZSA9IFZBTElEQVRJT05fTU9ERV9FREVGQVVMVDsKKworCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xNDgsMTQgKzE4NywxNCBAQAogCXByb3RlY3RlZCBFTGlzdDxYbWxNYXBwaW5nRmlsZVJlZj4gbWFwcGluZ0ZpbGVzOwogCiAJLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmFyRmlsZXMoKSA8ZW0+SmFyIEZpbGVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXJGaWxlcygpIDxlbT5KYXIgRmlsZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHNlZSAjZ2V0SmFyRmlsZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IGphckZpbGVzOworCXByb3RlY3RlZCBFTGlzdDxYbWxKYXJGaWxlUmVmPiBqYXJGaWxlczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzZXMoKSA8ZW0+Q2xhc3NlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yNTUsNiArMjk0LDg0IEBACiAJfQogCiAJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2hhcmVkIENhY2hlIE1vZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iVU5TUEVDSUZJRUQiPC9jb2RlPi4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaGFyZWQgQ2FjaGUgTW9kZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFyZWQgQ2FjaGUgTW9kZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMAorCSAqIEBzZWUgI3NldFNoYXJlZENhY2hlTW9kZShYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzApCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMF9TaGFyZWRDYWNoZU1vZGUoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSJVTlNQRUNJRklFRCIgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCBnZXRTaGFyZWRDYWNoZU1vZGUoKQorCXsKKwkJcmV0dXJuIHNoYXJlZENhY2hlTW9kZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0U2hhcmVkQ2FjaGVNb2RlIDxlbT5TaGFyZWQgQ2FjaGUgTW9kZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2hhcmVkIENhY2hlIE1vZGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAKKwkgKiBAc2VlICNnZXRTaGFyZWRDYWNoZU1vZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaGFyZWRDYWNoZU1vZGUoWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIG5ld1NoYXJlZENhY2hlTW9kZSkKKwl7CisJCVhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCBvbGRTaGFyZWRDYWNoZU1vZGUgPSBzaGFyZWRDYWNoZU1vZGU7CisJCXNoYXJlZENhY2hlTW9kZSA9IG5ld1NoYXJlZENhY2hlTW9kZSA9PSBudWxsID8gU0hBUkVEX0NBQ0hFX01PREVfRURFRkFVTFQgOiBuZXdTaGFyZWRDYWNoZU1vZGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fU0hBUkVEX0NBQ0hFX01PREUsIG9sZFNoYXJlZENhY2hlTW9kZSwgc2hhcmVkQ2FjaGVNb2RlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbiBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkFVVE8iPC9jb2RlPi4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzB9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbiBNb2RlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbGlkYXRpb24gTW9kZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAKKwkgKiBAc2VlICNzZXRWYWxpZGF0aW9uTW9kZShYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdF8yXzBfVmFsaWRhdGlvbk1vZGUoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSJBVVRPIiB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCBnZXRWYWxpZGF0aW9uTW9kZSgpCisJeworCQlyZXR1cm4gdmFsaWRhdGlvbk1vZGU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldFZhbGlkYXRpb25Nb2RlIDxlbT5WYWxpZGF0aW9uIE1vZGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbGlkYXRpb24gTW9kZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAKKwkgKiBAc2VlICNnZXRWYWxpZGF0aW9uTW9kZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25Nb2RlKFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgbmV3VmFsaWRhdGlvbk1vZGUpCisJeworCQlYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIG9sZFZhbGlkYXRpb25Nb2RlID0gdmFsaWRhdGlvbk1vZGU7CisJCXZhbGlkYXRpb25Nb2RlID0gbmV3VmFsaWRhdGlvbk1vZGUgPT0gbnVsbCA/IFZBTElEQVRJT05fTU9ERV9FREVGQVVMVCA6IG5ld1ZhbGlkYXRpb25Nb2RlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1ZBTElEQVRJT05fTU9ERSwgb2xkVmFsaWRhdGlvbk1vZGUsIHZhbGlkYXRpb25Nb2RlKSk7CisJfQorCisJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CkBAIC00OTIsMjQgKzYwOSwyNCBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkphciBGaWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkphciBGaWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphckZpbGVSZWZ9LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CiAJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SmFyIEZpbGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAogCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KIAkgKiA8L3A+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmFyIEZpbGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkphciBGaWxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfSmFyRmlsZXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEphckZpbGVzKCkKKwlwdWJsaWMgRUxpc3Q8WG1sSmFyRmlsZVJlZj4gZ2V0SmFyRmlsZXMoKQogCXsKIAkJaWYgKGphckZpbGVzID09IG51bGwpCiAJCXsKLQkJCWphckZpbGVzID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0pBUl9GSUxFUyk7CisJCQlqYXJGaWxlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxKYXJGaWxlUmVmPihYbWxKYXJGaWxlUmVmLmNsYXNzLCB0aGlzLCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0pBUl9GSUxFUyk7CiAJCX0KIAkJcmV0dXJuIGphckZpbGVzOwogCX0KQEAgLTY0NCw2ICs3NjEsOCBAQAogCQl7CiAJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTUFQUElOR19GSUxFUzoKIAkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1hcHBpbmdGaWxlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SmFyRmlsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0NMQVNTRVM6CiAJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDbGFzc2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19QUk9QRVJUSUVTOgpAQCAtNjYyLDYgKzc4MSwxMCBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19TSEFSRURfQ0FDSEVfTU9ERToKKwkJCQlyZXR1cm4gZ2V0U2hhcmVkQ2FjaGVNb2RlKCk7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fVkFMSURBVElPTl9NT0RFOgorCQkJCXJldHVybiBnZXRWYWxpZGF0aW9uTW9kZSgpOwogCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0RFU0NSSVBUSU9OOgogCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwogCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1BST1ZJREVSOgpAQCAtNjk5LDYgKzgyMiwxMiBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19TSEFSRURfQ0FDSEVfTU9ERToKKwkJCQlzZXRTaGFyZWRDYWNoZU1vZGUoKFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1ZBTElEQVRJT05fTU9ERToKKwkJCQlzZXRWYWxpZGF0aW9uTW9kZSgoWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0RFU0NSSVBUSU9OOgogCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKQEAgLTcxNyw3ICs4NDYsNyBAQAogCQkJCXJldHVybjsKIAkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19KQVJfRklMRVM6CiAJCQkJZ2V0SmFyRmlsZXMoKS5jbGVhcigpOwotCQkJCWdldEphckZpbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKKwkJCQlnZXRKYXJGaWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSmFyRmlsZVJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19DTEFTU0VTOgogCQkJCWdldENsYXNzZXMoKS5jbGVhcigpOwpAQCAtNzQ5LDYgKzg3OCwxMiBAQAogCXsKIAkJc3dpdGNoIChmZWF0dXJlSUQpCiAJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19TSEFSRURfQ0FDSEVfTU9ERToKKwkJCQlzZXRTaGFyZWRDYWNoZU1vZGUoU0hBUkVEX0NBQ0hFX01PREVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19WQUxJREFUSU9OX01PREU6CisJCQkJc2V0VmFsaWRhdGlvbk1vZGUoVkFMSURBVElPTl9NT0RFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fREVTQ1JJUFRJT046CiAJCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOwogCQkJCXJldHVybjsKQEAgLTc5Niw2ICs5MzEsMTAgQEAKIAl7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKQogCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fU0hBUkVEX0NBQ0hFX01PREU6CisJCQkJcmV0dXJuIHNoYXJlZENhY2hlTW9kZSAhPSBTSEFSRURfQ0FDSEVfTU9ERV9FREVGQVVMVDsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19WQUxJREFUSU9OX01PREU6CisJCQkJcmV0dXJuIHZhbGlkYXRpb25Nb2RlICE9IFZBTElEQVRJT05fTU9ERV9FREVGQVVMVDsKIAkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19ERVNDUklQVElPTjoKIAkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKIAkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19QUk9WSURFUjoKQEAgLTgzMyw3ICs5NzIsMTEgQEAKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChzaGFyZWRDYWNoZU1vZGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHNoYXJlZENhY2hlTW9kZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgdmFsaWRhdGlvbk1vZGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHZhbGlkYXRpb25Nb2RlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7CiAJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwogCQlyZXN1bHQuYXBwZW5kKCIsIHByb3ZpZGVyOiAiKTsKIAkJcmVzdWx0LmFwcGVuZChwcm92aWRlcik7CkBAIC04NDEsOCArOTg0LDYgQEAKIAkJcmVzdWx0LmFwcGVuZChqdGFEYXRhU291cmNlKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBub25KdGFEYXRhU291cmNlOiAiKTsKIAkJcmVzdWx0LmFwcGVuZChub25KdGFEYXRhU291cmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqYXJGaWxlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoamFyRmlsZXMpOwogCQlyZXN1bHQuYXBwZW5kKCIsIGV4Y2x1ZGVVbmxpc3RlZENsYXNzZXM6ICIpOwogCQlyZXN1bHQuYXBwZW5kKGV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMpOwogCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwpAQCAtODUyLDUgKzk5Myw4NSBAQAogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9Ci0KLX0gLy8gWG1sUGVyc2lzdGVuY2VVbml0CisJCisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisJCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlQZXJzaXN0ZW5jZVBhY2thZ2UgcGtnID0gUGVyc2lzdGVuY2VQYWNrYWdlLmVJTlNUQU5DRTsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCQlidWlsZFRyYW5zYWN0aW9uVHlwZVRyYW5zbGF0b3IoKSwKKwkJCQlidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAorCQkJCWJ1aWxkUHJvdmlkZXJUcmFuc2xhdG9yKCksCisJCQkJYnVpbGRKdGFEYXRhU291cmNlVHJhbnNsYXRvcigpLAorCQkJCWJ1aWxkTm9uSnRhRGF0YVNvdXJjZVRyYW5zbGF0b3IoKSwKKwkJCQlYbWxNYXBwaW5nRmlsZVJlZi5idWlsZFRyYW5zbGF0b3IoSlBBLk1BUFBJTkdfRklMRSwgcGtnLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9NYXBwaW5nRmlsZXMoKSksCisJCQkJWG1sSmFyRmlsZVJlZi5idWlsZFRyYW5zbGF0b3IoSlBBLkpBUl9GSUxFLCBwa2cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0phckZpbGVzKCkpLAorCQkJCVhtbEphdmFDbGFzc1JlZi5idWlsZFRyYW5zbGF0b3IoSlBBLkNMQVNTLCBwa2cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0NsYXNzZXMoKSksCisJCQkJYnVpbGRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzVHJhbnNsYXRvcigpLAorCQkJCWJ1aWxkU2hhcmVkQ2FjaGVNb2RlVHJhbnNsYXRvcigpLAorCQkJCWJ1aWxkVmFsaWRhdGlvbk1vZGVUcmFuc2xhdG9yKCksCisJCQkJWG1sUHJvcGVydGllcy5idWlsZFRyYW5zbGF0b3IoSlBBLlBST1BFUlRJRVMsIHBrZy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfUHJvcGVydGllcygpKX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoCisJCQkJSlBBLlBFUlNJU1RFTkNFX1VOSVRfX05BTUUsCisJCQkJUGVyc2lzdGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfTmFtZSgpLAorCQkJCVRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zYWN0aW9uVHlwZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcigKKwkJCQlKUEEuUEVSU0lTVEVOQ0VfVU5JVF9fVFJBTlNBQ1RJT05fVFlQRSwKKwkJCQlQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9UcmFuc2FjdGlvblR5cGUoKSwKKwkJCQlUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUgfCBUcmFuc2xhdG9yLlVOU0VUX0lGX05VTEwpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcigKKwkJCQlKUEEuREVTQ1JJUFRJT04sCisJCQkJUGVyc2lzdGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfRGVzY3JpcHRpb24oKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3ZpZGVyVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKAorCQkJCUpQQS5QUk9WSURFUiwKKwkJCQlQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9Qcm92aWRlcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSnRhRGF0YVNvdXJjZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcigKKwkJCQlKUEEuSlRBX0RBVEFfU09VUkNFLAorCQkJCVBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0p0YURhdGFTb3VyY2UoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5vbkp0YURhdGFTb3VyY2VUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoCisJCQkJSlBBLk5PTl9KVEFfREFUQV9TT1VSQ0UsCisJCQkJUGVyc2lzdGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfTm9uSnRhRGF0YVNvdXJjZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhjbHVkZVVubGlzdGVkQ2xhc3Nlc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgQm9vbGVhblRyYW5zbGF0b3IoCisJCQkJSlBBLkVYQ0xVREVfVU5MSVNURURfQ0xBU1NFUywKKwkJCQlQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9FeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTaGFyZWRDYWNoZU1vZGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoCisJCQkJSlBBMl8wLlBFUlNJU1RFTkNFX1VOSVRfX1NIQVJFRF9DQUNIRV9NT0RFLAorCQkJCVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF8yXzBfU2hhcmVkQ2FjaGVNb2RlKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRWYWxpZGF0aW9uTW9kZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcigKKwkJCQlKUEEyXzAuUEVSU0lTVEVOQ0VfVU5JVF9fVkFMSURBVElPTl9NT0RFLAorCQkJCVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF8yXzBfVmFsaWRhdGlvbk1vZGUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5qYXZhCmluZGV4IGJiZWJiODAuLjQ2YWQ0MjYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLmphdmEKQEAgLTcsNiArNyw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sUHJvcGVydGllcy5qYXZhCmluZGV4IGUwOTA2OTQuLjY5YjZmNjQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQcm9wZXJ0aWVzLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFByb3BlcnRpZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC03LDE3ICs3LDIxIEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0xODIsNCArMTg2LDE3IEBACiAJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKIAl9CiAKLX0gLy8gWG1sUHJvcGVydGllcworCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJCVhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihKUEEuUFJPUEVSVFksIFBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydGllc19Qcm9wZXJ0aWVzKCkpLAorCQkJfTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQcm9wZXJ0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFByb3BlcnR5LmphdmEKaW5kZXggODllYTNmNC4uMjJlOTQ0YyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFByb3BlcnR5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFByb3BlcnR5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtNywxMyArNywxNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuY29tbW9uLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5jb21tb24uSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yNjMsNCArMjY3LDM5IEBACiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CiAKLX0gLy8gWG1sUHJvcGVydHkKKworCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCisJCQkJZWxlbWVudE5hbWUsCisJCQkJc3RydWN0dXJhbEZlYXR1cmUsCisJCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKKwkJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCisJCQkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCQlidWlsZFZhbHVlVHJhbnNsYXRvcigpCisJCQl9OworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKAorCQkJCUpQQS5QUk9QRVJUWV9fTkFNRSwKKwkJCQlQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5X05hbWUoKSwKKwkJCQlUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUKKwkJCSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFZhbHVlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKAorCQkJCUpQQS5QUk9QRVJUWV9fVkFMVUUsCisJCQkJUGVyc2lzdGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eV9WYWx1ZSgpLAorCQkJCVRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURQorCQkJKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL0pQQTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL3YyXzAvSlBBMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzOWI1MAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL0pQQTJfMC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuSlBBOworCisvKioKKyAqIEpQQSBwZXJzaXN0ZW5jZTJfMC54bWwtcmVsYXRlZCBzdHVmZiAoZWxlbWVudHMsIGF0dHJpYnV0ZXMgZXRjLikKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGludGVyZmFjZSBKUEEyXzAKKwlleHRlbmRzIEpQQQoreworCVN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFID0gSlBBLlNDSEVNQV9OQU1FU1BBQ0U7CisJU3RyaW5nIFNDSEVNQV9MT0NBVElPTiA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV8yXzAueHNkIjsKKwlTdHJpbmcgU0NIRU1BX1ZFUlNJT04gPSAiMi4wIjsKKwkKKwkvLyBKUEEgMi4wIHNwZWNpZmljIG5vZGVzCisJCisJU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfX1NIQVJFRF9DQUNIRV9NT0RFID0gInNoYXJlZC1jYWNoZS1tb2RlIjsKKwlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9fVkFMSURBVElPTl9NT0RFID0gInZhbGlkYXRpb24tbW9kZSI7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdjJfMC9QZXJzaXN0ZW5jZVYyXzBGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdjJfMC9QZXJzaXN0ZW5jZVYyXzBGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwMzk1NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL1BlcnNpc3RlbmNlVjJfMEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVjJfMEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeUltcGwKK3sKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VWMl8wRmFjdG9yeSBlSU5TVEFOQ0UgPSBpbml0KCk7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5IGluaXQoKQorCXsKKwkJdHJ5CisJCXsKKwkJCVBlcnNpc3RlbmNlVjJfMEZhY3RvcnkgdGhlUGVyc2lzdGVuY2VWMl8wRmFjdG9yeSA9IChQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqcHQucGVyc2lzdGVuY2UudjJfMC54bWkiKTsgCisJCQlpZiAodGhlUGVyc2lzdGVuY2VWMl8wRmFjdG9yeSAhPSBudWxsKQorCQkJeworCQkJCXJldHVybiB0aGVQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQorCQl7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlVjJfMEZhY3RvcnkoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5KCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCisJeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKKwkJeworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCisJeworCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKKwkJeworCQkJY2FzZSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0NBQ0hJTkdfVFlQRV8yMDoKKwkJCQlyZXR1cm4gY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfVkFMSURBVElPTl9NT0RFX1RZUEVfMjA6CisJCQkJcmV0dXJuIGNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzBGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQorCXsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCisJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9DQUNISU5HX1RZUEVfMjA6CisJCQkJcmV0dXJuIGNvbnZlcnRYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzBUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX1ZBTElEQVRJT05fTU9ERV9UWVBFXzIwOgorCQkJCXJldHVybiBjb252ZXJ0WG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIGNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKKwl7CisJCVhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCByZXN1bHQgPSBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAuZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQorCXsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKKwl7CisJCVhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgcmVzdWx0ID0gWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMC5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0WG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQorCXsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UgZ2V0UGVyc2lzdGVuY2VWMl8wUGFja2FnZSgpCisJeworCQlyZXR1cm4gKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlIGdldFBhY2thZ2UoKQorCXsKKwkJcmV0dXJuIFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZUlOU1RBTkNFOworCX0KKworfSAvL1BlcnNpc3RlbmNlVjJfMEZhY3RvcnkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL1BlcnNpc3RlbmNlVjJfMFBhY2thZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL1BlcnNpc3RlbmNlVjJfMFBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzExYjkzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL3YyXzAvUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsNDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wRmFjdG9yeQorICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2VJbXBsCit7CisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTkFNRSA9ICJ2Ml8wIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1VSSSA9ICJqcHQucGVyc2lzdGVuY2UudjJfMC54bWkiOworCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wIjsKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5pbml0KCk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0XzJfMCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgMjA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdF8yXzAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjAgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXJlZCBDYWNoZSBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMF9fU0hBUkVEX0NBQ0hFX01PREUgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkYXRpb24gTW9kZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjBfX1ZBTElEQVRJT05fTU9ERSA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgMjA8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMF9GRUFUVVJFX0NPVU5UID0gMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IENhY2hpbmcgVHlwZSAyMDwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9DQUNISU5HX1RZUEVfMjAgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFZhbGlkYXRpb24gTW9kZSBUeXBlIDIwPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfVkFMSURBVElPTl9NT0RFX1RZUEVfMjAgPSAyOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sUGVyc2lzdGVuY2VVbml0XzJfMEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVFbnVtIHhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMEVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0geG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMEVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgorCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKKwkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcworCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCisJICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZSNlTlNfVVJJCisJICogQHNlZSAjaW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgUGVyc2lzdGVuY2VWMl8wUGFja2FnZSgpCisJeworCQlzdXBlcihlTlNfVVJJLCBQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5LmVJTlNUQU5DRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgorCSAqIAorCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgUGVyc2lzdGVuY2VWMl8wUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZU5TX1VSSQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VWMl8wUGFja2FnZSBpbml0KCkKKwl7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQorCQlQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlIHRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UgPSAoUGVyc2lzdGVuY2VWMl8wUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VWMl8wUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcworCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOworCQlPcm1QYWNrYWdlIHRoZU9ybVBhY2thZ2UgPSAoT3JtUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIE9ybVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1QYWNrYWdlLmVOU19VUkkpIDogT3JtUGFja2FnZS5lSU5TVEFOQ0UpOworCQlPcm1WMl8wUGFja2FnZSB0aGVPcm1WMl8wUGFja2FnZSA9IChPcm1WMl8wUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBPcm1WMl8wUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVYyXzBQYWNrYWdlLmVOU19VUkkpIDogT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJUGVyc2lzdGVuY2VQYWNrYWdlIHRoZVBlcnNpc3RlbmNlUGFja2FnZSA9IChQZXJzaXN0ZW5jZVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBlcnNpc3RlbmNlUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBlcnNpc3RlbmNlUGFja2FnZS5lTlNfVVJJKSA6IFBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0UpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU9ybVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU9ybVYyXzBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVQZXJzaXN0ZW5jZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU9ybVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVBlcnNpc3RlbmNlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAorCQl0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLmZyZWV6ZSgpOworCisgIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZU5TX1VSSSwgdGhlUGVyc2lzdGVuY2VWMl8wUGFja2FnZSk7CisJCXJldHVybiB0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCAyMDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0XzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFBlcnNpc3RlbmNlVW5pdF8yXzAoKQorCXsKKwkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdF8yXzBFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdF8yXzAjZ2V0U2hhcmVkQ2FjaGVNb2RlIDxlbT5TaGFyZWQgQ2FjaGUgTW9kZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNoYXJlZCBDYWNoZSBNb2RlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wI2dldFNoYXJlZENhY2hlTW9kZSgpCisJICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF8yXzBfU2hhcmVkQ2FjaGVNb2RlKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdF8yXzAjZ2V0VmFsaWRhdGlvbk1vZGUgPGVtPlZhbGlkYXRpb24gTW9kZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbGlkYXRpb24gTW9kZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0XzJfMCNnZXRWYWxpZGF0aW9uTW9kZSgpCisJICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF8yXzBfVmFsaWRhdGlvbk1vZGUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdF8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBDYWNoaW5nIFR5cGUgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBDYWNoaW5nIFR5cGUgMjA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wKCkKKwl7CisJCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzBFRW51bTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgVmFsaWRhdGlvbiBNb2RlIFR5cGUgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBWYWxpZGF0aW9uIE1vZGUgVHlwZSAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCgpCisJeworCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMEVFbnVtOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5IGdldFBlcnNpc3RlbmNlVjJfMEZhY3RvcnkoKQorCXsKKwkJcmV0dXJuIChQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKKwl7CisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKKworCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJeG1sUGVyc2lzdGVuY2VVbml0XzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0XzJfMEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjBfX1NIQVJFRF9DQUNIRV9NT0RFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxQZXJzaXN0ZW5jZVVuaXRfMl8wRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMF9fVkFMSURBVElPTl9NT0RFKTsKKworCQkvLyBDcmVhdGUgZW51bXMKKwkJeG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wRUVudW0gPSBjcmVhdGVFRW51bShYTUxfUEVSU0lTVEVOQ0VfVU5JVF9DQUNISU5HX1RZUEVfMjApOworCQl4bWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wRUVudW0gPSBjcmVhdGVFRW51bShYTUxfUEVSU0lTVEVOQ0VfVU5JVF9WQUxJREFUSU9OX01PREVfVFlQRV8yMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwl7CisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47CisJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgcGFja2FnZQorCQlzZXROYW1lKGVOQU1FKTsKKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7CisJCXNldE5zVVJJKGVOU19VUkkpOworCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisKKwkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJaW5pdEVDbGFzcyh4bWxQZXJzaXN0ZW5jZVVuaXRfMl8wRUNsYXNzLCBYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wLmNsYXNzLCAiWG1sUGVyc2lzdGVuY2VVbml0XzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF8yXzBfU2hhcmVkQ2FjaGVNb2RlKCksIHRoaXMuZ2V0WG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wKCksICJzaGFyZWRDYWNoZU1vZGUiLCAiVU5TUEVDSUZJRUQiLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMF9WYWxpZGF0aW9uTW9kZSgpLCB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAoKSwgInZhbGlkYXRpb25Nb2RlIiwgIkFVVE8iLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscworCQlpbml0RUVudW0oeG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wRUVudW0sIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5jbGFzcywgIlhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCIpOworCQlhZGRFRW51bUxpdGVyYWwoeG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wRUVudW0sIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5BTEwpOworCQlhZGRFRW51bUxpdGVyYWwoeG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wRUVudW0sIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5OT05FKTsKKwkJYWRkRUVudW1MaXRlcmFsKHhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMEVFbnVtLCBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAuRU5BQkxFX1NFTEVDVElWRSk7CisJCWFkZEVFbnVtTGl0ZXJhbCh4bWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzBFRW51bSwgWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wLkRJU0FCTEVfU0VMRUNUSVZFKTsKKwkJYWRkRUVudW1MaXRlcmFsKHhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMEVFbnVtLCBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAuVU5TUEVDSUZJRUQpOworCisJCWluaXRFRW51bSh4bWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wRUVudW0sIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIik7CisJCWFkZEVFbnVtTGl0ZXJhbCh4bWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wRUVudW0sIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAuQVVUTyk7CisJCWFkZEVFbnVtTGl0ZXJhbCh4bWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wRUVudW0sIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAuQ0FMTEJBQ0spOworCQlhZGRFRW51bUxpdGVyYWwoeG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMEVFbnVtLCBYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wLk5PTkUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKKwl7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCAyMDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0XzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2hhcmVkIENhY2hlIE1vZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUXzIwX19TSEFSRURfQ0FDSEVfTU9ERSA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wX1NoYXJlZENhY2hlTW9kZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbiBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMF9fVkFMSURBVElPTl9NT0RFID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF8yXzBfVmFsaWRhdGlvbk1vZGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBDYWNoaW5nIFR5cGUgMjA8L2VtPn0nIGVudW0uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5QZXJzaXN0ZW5jZVYyXzBQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gWE1MX1BFUlNJU1RFTkNFX1VOSVRfQ0FDSElOR19UWVBFXzIwID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBWYWxpZGF0aW9uIE1vZGUgVHlwZSAyMDwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5QZXJzaXN0ZW5jZVYyXzBQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIFhNTF9QRVJTSVNURU5DRV9VTklUX1ZBTElEQVRJT05fTU9ERV9UWVBFXzIwID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAoKTsKKworCX0KKworfSAvL1BlcnNpc3RlbmNlVjJfMFBhY2thZ2UKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyYWJjYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5qYXZhCkBAIC0wLDAgKzEsMzEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzA7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgQ2FjaGluZyBUeXBlIDIwPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCBpbXBsZW1lbnRzIEVudW1lcmF0b3IKK3sKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5BTEw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQUxMX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQUxMKDAsICJBTEwiLCAiQUxMIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PTkVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlOT05FKDEsICJOT05FIiwgIk5PTkUiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkVOQUJMRSBTRUxFQ1RJVkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRU5BQkxFX1NFTEVDVElWRV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUVOQUJMRV9TRUxFQ1RJVkUoMiwgIkVOQUJMRV9TRUxFQ1RJVkUiLCAiRU5BQkxFX1NFTEVDVElWRSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+RElTQUJMRSBTRUxFQ1RJVkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRElTQUJMRV9TRUxFQ1RJVkVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlESVNBQkxFX1NFTEVDVElWRSgzLCAiRElTQUJMRV9TRUxFQ1RJVkUiLCAiRElTQUJMRV9TRUxFQ1RJVkUiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlVOU1BFQ0lGSUVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1VOU1BFQ0lGSUVEX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJVU5TUEVDSUZJRUQoNCwgIlVOU1BFQ0lGSUVEIiwgIlVOU1BFQ0lGSUVEIik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5BTEw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNBTEwKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOT05FCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORV9WQUxVRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5FTkFCTEUgU0VMRUNUSVZFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FTkFCTEUgU0VMRUNUSVZFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0VOQUJMRV9TRUxFQ1RJVkUKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkFCTEVfU0VMRUNUSVZFX1ZBTFVFID0gMjsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkRJU0FCTEUgU0VMRUNUSVZFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5ESVNBQkxFIFNFTEVDVElWRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNESVNBQkxFX1NFTEVDVElWRQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0FCTEVfU0VMRUNUSVZFX1ZBTFVFID0gMzsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlVOU1BFQ0lGSUVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5VTlNQRUNJRklFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNVTlNQRUNJRklFRAorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU1BFQ0lGSUVEX1ZBTFVFID0gNDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5YbWwgUGVyc2lzdGVuY2UgVW5pdCBDYWNoaW5nIFR5cGUgMjA8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMFtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzBbXQorCQl7CisJCQlBTEwsCisJCQlOT05FLAorCQkJRU5BQkxFX1NFTEVDVElWRSwKKwkJCURJU0FCTEVfU0VMRUNUSVZFLAorCQkJVU5TUEVDSUZJRUQsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgQ2FjaGluZyBUeXBlIDIwPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8WG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IENhY2hpbmcgVHlwZSAyMDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCBnZXQoU3RyaW5nIGxpdGVyYWwpCisJeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKKwkJeworCQkJWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCisJCQl7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IENhY2hpbmcgVHlwZSAyMDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCisJeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKKwkJeworCQkJWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKKwkJCXsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgQ2FjaGluZyBUeXBlIDIwPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIGdldChpbnQgdmFsdWUpCisJeworCQlzd2l0Y2ggKHZhbHVlKQorCQl7CisJCQljYXNlIEFMTF9WQUxVRTogcmV0dXJuIEFMTDsKKwkJCWNhc2UgTk9ORV9WQUxVRTogcmV0dXJuIE5PTkU7CisJCQljYXNlIEVOQUJMRV9TRUxFQ1RJVkVfVkFMVUU6IHJldHVybiBFTkFCTEVfU0VMRUNUSVZFOworCQkJY2FzZSBESVNBQkxFX1NFTEVDVElWRV9WQUxVRTogcmV0dXJuIERJU0FCTEVfU0VMRUNUSVZFOworCQkJY2FzZSBVTlNQRUNJRklFRF9WQUxVRTogcmV0dXJuIFVOU1BFQ0lGSUVEOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCisJeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpCisJeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCisJeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKKwl7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL1htbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzU4YzMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wLmphdmEKQEAgLTAsMCArMSwyNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5YbWwgUGVyc2lzdGVuY2UgVW5pdCBWYWxpZGF0aW9uIE1vZGUgVHlwZSAyMDwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCBpbXBsZW1lbnRzIEVudW1lcmF0b3IKK3sKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5BVVRPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0FVVE9fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlBVVRPKDAsICJBVVRPIiwgIkFVVE8iKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNBTExCQUNLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NBTExCQUNLX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQ0FMTEJBQ0soMSwgIkNBTExCQUNLIiwgIkNBTExCQUNLIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PTkVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlOT05FKDIsICJOT05FIiwgIk5PTkUiKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFVVE88L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFVVE88L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQVVUTworCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q0FMTEJBQ0s8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNBTExCQUNLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NBTExCQUNLCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfVkFMVUUgPSAxOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOT05FCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORV9WQUxVRSA9IDI7CisKKwkvKioKKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgVmFsaWRhdGlvbiBNb2RlIFR5cGUgMjA8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzBbXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMFtdCisJCXsKKwkJCUFVVE8sCisJCQlDQUxMQkFDSywKKwkJCU5PTkUsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgVmFsaWRhdGlvbiBNb2RlIFR5cGUgMjA8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFZhbGlkYXRpb24gTW9kZSBUeXBlIDIwPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCBnZXQoU3RyaW5nIGxpdGVyYWwpCisJeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKKwkJeworCQkJWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQorCQkJeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgUGVyc2lzdGVuY2UgVW5pdCBWYWxpZGF0aW9uIE1vZGUgVHlwZSAyMDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCisJCXsKKwkJCVhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQorCQkJeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgUGVyc2lzdGVuY2UgVW5pdCBWYWxpZGF0aW9uIE1vZGUgVHlwZSAyMDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgZ2V0KGludCB2YWx1ZSkKKwl7CisJCXN3aXRjaCAodmFsdWUpCisJCXsKKwkJCWNhc2UgQVVUT19WQUxVRTogcmV0dXJuIEFVVE87CisJCQljYXNlIENBTExCQUNLX1ZBTFVFOiByZXR1cm4gQ0FMTEJBQ0s7CisJCQljYXNlIE5PTkVfVkFMVUU6IHJldHVybiBOT05FOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQorCXsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQorCXsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCisJeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9YbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2Y2NhYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdF8yXzAuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgMjA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wI2dldFNoYXJlZENhY2hlTW9kZSA8ZW0+U2hhcmVkIENhY2hlIE1vZGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0XzJfMCNnZXRWYWxpZGF0aW9uTW9kZSA8ZW0+VmFsaWRhdGlvbiBNb2RlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sUGVyc2lzdGVuY2VVbml0XzJfMCBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaGFyZWQgQ2FjaGUgTW9kZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJVTlNQRUNJRklFRCI8L2NvZGU+LgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNoYXJlZCBDYWNoZSBNb2RlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNoYXJlZCBDYWNoZSBNb2RlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wCisJICogQHNlZSAjc2V0U2hhcmVkQ2FjaGVNb2RlKFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wX1NoYXJlZENhY2hlTW9kZSgpCisJICogQG1vZGVsIGRlZmF1bHQ9IlVOU1BFQ0lGSUVEIiB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAgZ2V0U2hhcmVkQ2FjaGVNb2RlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdF8yXzAjZ2V0U2hhcmVkQ2FjaGVNb2RlIDxlbT5TaGFyZWQgQ2FjaGUgTW9kZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2hhcmVkIENhY2hlIE1vZGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAKKwkgKiBAc2VlICNnZXRTaGFyZWRDYWNoZU1vZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNoYXJlZENhY2hlTW9kZShYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbiBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkFVVE8iPC9jb2RlPi4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzB9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbiBNb2RlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbGlkYXRpb24gTW9kZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAKKwkgKiBAc2VlICNzZXRWYWxpZGF0aW9uTW9kZShYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5QZXJzaXN0ZW5jZVYyXzBQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdF8yXzBfVmFsaWRhdGlvbk1vZGUoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSJBVVRPIiB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIGdldFZhbGlkYXRpb25Nb2RlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdF8yXzAjZ2V0VmFsaWRhdGlvbk1vZGUgPGVtPlZhbGlkYXRpb24gTW9kZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbiBNb2RlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMAorCSAqIEBzZWUgI2dldFZhbGlkYXRpb25Nb2RlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRWYWxpZGF0aW9uTW9kZShYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIHZhbHVlKTsKKworfSAvLyBYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UveG1sL0Fic3RyYWN0SnBhRU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3htbC9BYnN0cmFjdEpwYUVPYmplY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGFkZmEwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3htbC9BYnN0cmFjdEpwYUVPYmplY3QuamF2YQpAQCAtMCwwICsxLDI4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5BYnN0cmFjdFRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpwYUVPYmplY3QKKwlleHRlbmRzIEVPYmplY3RJbXBsCisJaW1wbGVtZW50cyBKcGFFT2JqZWN0Cit7CisJcHJvdGVjdGVkIElET01Ob2RlIG5vZGU7CisJCisJLyoqCisJICogU2V0cyBvZiAiaW5zaWduaWZpY2FudCIgZmVhdHVyZSBpZHMsIGtleWVkIGJ5IGNsYXNzLgorCSAqIFRoaXMgaXMgYnVpbHQgdXAgbGF6aWx5LCBhcyB0aGUgb2JqZWN0cyBhcmUgbW9kaWZpZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaHRhYmxlPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3Q+LCBIYXNoU2V0PEludGVnZXI+PiBpbnNpZ25pZmljYW50RmVhdHVyZUlkU2V0cyA9IG5ldyBIYXNodGFibGU8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdD4sIEhhc2hTZXQ8SW50ZWdlcj4+KCk7CisJCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0SnBhRU9iamVjdCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogSnBhRU9iamVjdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgeworCQlmb3IgKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlIDogdGhpcy5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkpIHsKKwkJCWlmICh0aGlzLmVJc1NldChmZWF0dXJlKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKworCS8vICoqKioqKioqKiogY2hhbmdlIG5vdGlmaWNhdGlvbiAqKioqKioqKioqCisKKwkvKioKKwkgKiBvdmVycmlkZSB0byBidWlsZCBhIGN1c3RvbSBsaXN0IGZvciB0aGUgYWRhcHRlcnMKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8QWRhcHRlcj4gZUFkYXB0ZXJzKCkgeworCQlpZiAodGhpcy5lQWRhcHRlcnMgPT0gbnVsbCkgeworCQkJdGhpcy5lQWRhcHRlcnMgPSBuZXcgWG1sRUFkYXB0ZXJMaXN0PEFkYXB0ZXI+KHRoaXMpOworCQl9CisJCXJldHVybiB0aGlzLmVBZGFwdGVyczsKKwl9CisKKwkvKioKKwkgKiBvdmVycmlkZSB0byBwcmV2ZW50IG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBvYmplY3QncyBzdGF0ZSBpcyB1bmNoYW5nZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJaWYgKCAhIG5vdGlmaWNhdGlvbi5pc1RvdWNoKCkpIHsKKwkJCXN1cGVyLmVOb3RpZnkobm90aWZpY2F0aW9uKTsKKwkJCXRoaXMuZmVhdHVyZUNoYW5nZWQobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRCh0aGlzLmdldENsYXNzKCkpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGZlYXR1cmVDaGFuZ2VkKGludCBmZWF0dXJlSWQpIHsKKwkJaWYgKHRoaXMuZmVhdHVyZUlzU2lnbmlmaWNhbnQoZmVhdHVyZUlkKSkgeyAKKwkJCXRoaXMuZ2V0WG1sUmVzb3VyY2UoKS5yZXNvdXJjZU1vZGVsQ2hhbmdlZCgpOworCQl9CisJfQorCisJcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIGdldFhtbFJlc291cmNlKCkgeworCQlyZXR1cm4gKEpwYVhtbFJlc291cmNlKSB0aGlzLmVSZXNvdXJjZSgpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGZlYXR1cmVJc1NpZ25pZmljYW50KGludCBmZWF0dXJlSWQpIHsKKwkJcmV0dXJuICEgdGhpcy5mZWF0dXJlSXNJbnNpZ25pZmljYW50KGZlYXR1cmVJZCk7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gZmVhdHVyZUlzSW5zaWduaWZpY2FudChpbnQgZmVhdHVyZUlkKSB7CisJCXJldHVybiB0aGlzLmluc2lnbmlmaWNhbnRGZWF0dXJlSWRzKCkuY29udGFpbnMoSW50ZWdlci52YWx1ZU9mKGZlYXR1cmVJZCkpOworCX0KKworCS8qKgorCSAqIFJldHVybiBhIHNldCBvZiB0aGUgb2JqZWN0J3MgImluc2lnbmlmaWNhbnQiIGZlYXR1cmUgaWRzLgorCSAqIFRoZXNlIGFyZSB0aGUgRU1GIGZlYXR1cmVzIHRoYXQgd2lsbCBub3QgYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgYWxsCisJICogdGhlIGZlYXR1cmVzIGFyZSB1bnNldC4gIFdlIHVzZSB0aGlzIHRvIGRldGVybWluZSB3aGVuIHRvIHJlbW92ZSAKKwkgKiBhbiBlbGVtZW50IGZyb20gdGhlIHhtbC4KKwkgKiAKKwkgKiBJZiB5b3UgbmVlZCBpbnN0YW5jZS1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyIHhtbCAiaW5zaWduaWZpY2FudCIgYXNwZWN0cywKKwkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4gSWYgY2xhc3MtYmFzZWQgY2FsY3VsYXRpb24gaXMgc3VmZmljaWVudCwKKwkgKiBvdmVycmlkZSAjYWRkSW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHNUbyhTZXQpLgorCSAqIAorCSAqIEBzZWUgaXNBbGxGZWF0dXJlc1Vuc2V0KCkKKwkgKi8KKwlwcm90ZWN0ZWQgU2V0PEludGVnZXI+IGluc2lnbmlmaWNhbnRGZWF0dXJlSWRzKCkgeworCQlzeW5jaHJvbml6ZWQgKGluc2lnbmlmaWNhbnRGZWF0dXJlSWRTZXRzKSB7CisJCQlIYXNoU2V0PEludGVnZXI+IGluc2lnbmlmaWNhbnRYbWxGZWF0dXJlSWRzID0gaW5zaWduaWZpY2FudEZlYXR1cmVJZFNldHMuZ2V0KHRoaXMuZ2V0Q2xhc3MoKSk7CisJCQlpZiAoaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHMgPT0gbnVsbCkgeworCQkJCWluc2lnbmlmaWNhbnRYbWxGZWF0dXJlSWRzID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKKwkJCQl0aGlzLmFkZEluc2lnbmlmaWNhbnRYbWxGZWF0dXJlSWRzVG8oaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHMpOworCQkJCWluc2lnbmlmaWNhbnRGZWF0dXJlSWRTZXRzLnB1dCh0aGlzLmdldENsYXNzKCksIGluc2lnbmlmaWNhbnRYbWxGZWF0dXJlSWRzKTsKKwkJCX0KKwkJCXJldHVybiBpbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkczsKKwkJfQorCX0KKworCS8qKgorCSAqIEFkZCB0aGUgb2JqZWN0J3MgImluc2lnbmlmaWNhbnQiIGZlYXR1cmUgaWRzIHRvIHRoZSBzcGVjaWZpZWQgc2V0LgorCSAqIFRoZXNlIGFyZSB0aGUgRU1GIGZlYXR1cmVzIHRoYXQsIHdoZW4gdGhleSBjaGFuZ2UsIHdpbGwgTk9UIGNhdXNlIHRoZQorCSAqIG9iamVjdCAob3IgaXRzIGNvbnRhaW5pbmcgdHJlZSkgdG8gYmUgdXBkYXRlZCwgaS5lLiBkZWZhdWx0cyBjYWxjdWxhdGVkLgorCSAqIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgImluc2lnbmlmaWNhbnQiIGZlYXR1cmVzIGlzIHN1ZmZpY2llbnQsCisJICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uLAorCSAqIG92ZXJyaWRlICNpbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkcygpLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEluc2lnbmlmaWNhbnRYbWxGZWF0dXJlSWRzVG8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNldDxJbnRlZ2VyPiBpbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkcykgeworCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKKwkvLwlzdXBlci5hZGRJbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkc1RvKGluc2lnbmlmaWNhbnRYbWxGZWF0dXJlSWRzKTsKKwl9CisKKworCS8vICoqKioqKioqKiogdGV4dCByYW5nZXMgKioqKioqKioqKgorCQorCS8qKgorCSAqIFJldHVybiBhIHRleHQgcmFuZ2UgZm9yIHRoZSAidGV4dCIgbm9kZS4KKwkgKiBJZiB0aGUgdGV4dCBub2RlIGRvZXMgbm90IGV4aXN0LCByZXR1cm4gYSB0ZXh0IHJhbmdlIGZvciB0aGlzIG9iamVjdCdzIG5vZGUKKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFRleHRUZXh0UmFuZ2UoKSB7CisJCUlET01Ob2RlIHRleHROb2RlID0gdGhpcy5nZXRUZXh0Tm9kZSgpOworCQlyZXR1cm4gKHRleHROb2RlICE9IG51bGwpID8gYnVpbGRUZXh0UmFuZ2UodGV4dE5vZGUpIDogdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorCQorCXByb3RlY3RlZCBJRE9NTm9kZSBnZXRUZXh0Tm9kZSgpIHsKKwkJTm9kZUxpc3QgY2hpbGRyZW4gPSB0aGlzLm5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpICsrKSB7CisJCQlJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgY2hpbGRyZW4uaXRlbShpKTsKKwkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7CisJCQkJcmV0dXJuIGNoaWxkOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gYSB0ZXh0IHJhbmdlIGZvciB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBub2RlLgorCSAqIElmIHRoZSBhdHRyaWJ1dGUgbm9kZSBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIGEgdGV4dCByYW5nZSBmb3IgdGhpcyBvYmplY3QncworCSAqIG5vZGUKKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZVRleHRSYW5nZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworCQlJRE9NTm9kZSBhdHRyaWJ1dGVOb2RlID0gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZU5hbWUpOworCQlyZXR1cm4gKGF0dHJpYnV0ZU5vZGUgIT0gbnVsbCkgPyBidWlsZFRleHRSYW5nZShhdHRyaWJ1dGVOb2RlKSA6IHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgSURPTU5vZGUgZ2V0QXR0cmlidXRlTm9kZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworCQlyZXR1cm4gKElET01Ob2RlKSB0aGlzLm5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIGEgdGV4dCByYW5nZSBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IG5vZGUuCisJICogSWYgdGhlIGVsZW1lbnQgbm9kZSBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIGEgdGV4dCByYW5nZSBmb3IgdGhpcyBvYmplY3QncworCSAqIG5vZGUKKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEVsZW1lbnRUZXh0UmFuZ2UoU3RyaW5nIGVsZW1lbnROYW1lKSB7CisJCUlET01Ob2RlIGVsZW1lbnROb2RlID0gdGhpcy5nZXRFbGVtZW50Tm9kZShlbGVtZW50TmFtZSk7CisJCXJldHVybiAoZWxlbWVudE5vZGUgIT0gbnVsbCkgPyBidWlsZFRleHRSYW5nZShlbGVtZW50Tm9kZSkgOiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBub2RlIHdpdGggdGhlIGdpdmVuIG5hbWUsIGlmIG9uZSBleGlzdHMKKwkgKi8KKwlwcm90ZWN0ZWQgSURPTU5vZGUgZ2V0RWxlbWVudE5vZGUoU3RyaW5nIGVsZW1lbnROYW1lKSB7CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gdGhpcy5ub2RlLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSArKykgeworCQkJSURPTU5vZGUgY2hpbGQgPSAoSURPTU5vZGUpIGNoaWxkcmVuLml0ZW0oaSk7CisJCQlpZiAoKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCisJCQkJCSYmIGVsZW1lbnROYW1lLmVxdWFscyhjaGlsZC5nZXROb2RlTmFtZSgpKSkgeworCQkJCXJldHVybiBjaGlsZDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRGdWxsVGV4dFJhbmdlKCk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5nZXRGdWxsVGV4dFJhbmdlKCk7CisJfQorCQorCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0RnVsbFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGJ1aWxkVGV4dFJhbmdlKHRoaXMubm9kZSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVGV4dFJhbmdlIGJ1aWxkVGV4dFJhbmdlKElET01Ob2RlIGRvbU5vZGUpIHsKKwkJcmV0dXJuIChkb21Ob2RlID09IG51bGwpID8gbnVsbCA6IG5ldyBET01Ob2RlVGV4dFJhbmdlKGRvbU5vZGUpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCkgeworCQlyZXR1cm4gKHRoaXMubm9kZSA9PSBudWxsKSA/IGZhbHNlIDogdGhpcy5ub2RlLmNvbnRhaW5zKHRleHRPZmZzZXQpOworCX0KKworCisJLy8gKioqKioqKioqKiBjdXN0b20gYWRhcHRlciBsaXN0ICoqKioqKioqKioKKworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgWG1sRUFkYXB0ZXJMaXN0PEUgZXh0ZW5kcyBPYmplY3QgJiBBZGFwdGVyPgorCQlleHRlbmRzIEVBZGFwdGVyTGlzdDxFPgorCXsKKwkJcHVibGljIFhtbEVBZGFwdGVyTGlzdChBYnN0cmFjdEpwYUVPYmplY3QganBhRU9iamVjdCkgeworCQkJc3VwZXIoanBhRU9iamVjdCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZGlkQWRkKGludCBpbmRleCwgRSBuZXdPYmplY3QpIHsKKwkJCXN1cGVyLmRpZEFkZChpbmRleCwgbmV3T2JqZWN0KTsKKwkJCWlmIChuZXdPYmplY3QgaW5zdGFuY2VvZiBFTUYyRE9NQWRhcHRlcikgeworCQkJCU9iamVjdCBuID0gKChFTUYyRE9NQWRhcHRlcikgbmV3T2JqZWN0KS5nZXROb2RlKCk7CisJCQkJaWYgKG4gaW5zdGFuY2VvZiBJRE9NTm9kZSkgeworCQkJCQkoKEFic3RyYWN0SnBhRU9iamVjdCkgdGhpcy5ub3RpZmllcikubm9kZSA9IChJRE9NTm9kZSkgbjsKKwkJCQl9CisJCQl9CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZGlkUmVtb3ZlKGludCBpbmRleCwgRSBvbGRPYmplY3QpIHsKKwkJCWlmICgob2xkT2JqZWN0IGluc3RhbmNlb2YgRU1GMkRPTUFkYXB0ZXIpICYmCisJCQkJCSgoKEVNRjJET01BZGFwdGVyKSBvbGRPYmplY3QpLmdldE5vZGUoKSA9PSAoKEFic3RyYWN0SnBhRU9iamVjdCkgdGhpcy5ub3RpZmllcikubm9kZSkpIHsKKwkJCQkoKEFic3RyYWN0SnBhRU9iamVjdCkgdGhpcy5ub3RpZmllcikubm9kZSA9IG51bGw7CisJCQl9CisJCQlzdXBlci5kaWRSZW1vdmUoaW5kZXgsIG9sZE9iamVjdCk7CisJCX0KKwl9CisKKworCS8vICoqKioqKioqKiogRE9NIG5vZGUgdGV4dCByYW5nZSAqKioqKioqKioqCisKKwkvKioKKwkgKiBBZGFwdCBhbiBJRE9NTm9kZSB0byB0aGUgVGV4dFJhbmdlIGludGVyZmFjZS4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIERPTU5vZGVUZXh0UmFuZ2UKKwkJZXh0ZW5kcyBBYnN0cmFjdFRleHRSYW5nZQorCXsKKwkJcHJpdmF0ZSBmaW5hbCBJRE9NTm9kZSBub2RlOworCisJCURPTU5vZGVUZXh0UmFuZ2UoSURPTU5vZGUgbm9kZSkgeworCQkJc3VwZXIoKTsKKwkJCXRoaXMubm9kZSA9IG5vZGU7CisJCX0KKworCQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKKwkJCXJldHVybiB0aGlzLm5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKKwkJfQorCisJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworCQkJaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CisJCQkJcmV0dXJuICgoSURPTUVsZW1lbnQpIHRoaXMubm9kZSkuZ2V0U3RhcnRFbmRPZmZzZXQoKSAtIHRoaXMubm9kZS5nZXRTdGFydE9mZnNldCgpOworCQkJfQorCQkJcmV0dXJuIHRoaXMubm9kZS5nZXRMZW5ndGgoKTsKKwkJfQorCisJCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKKwkJCXJldHVybiB0aGlzLm5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZU9mT2Zmc2V0KHRoaXMuZ2V0T2Zmc2V0KCkpICsgMTsKKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UveG1sL0Fic3RyYWN0SnBhUm9vdEVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS94bWwvQWJzdHJhY3RKcGFSb290RU9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzODg3ODYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UveG1sL0Fic3RyYWN0SnBhUm9vdEVPYmplY3QuamF2YQpAQCAtMCwwICsxLDMzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkVudW1lcmF0ZWRWYWx1ZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFic3RyYWN0IEpwYSBSb290IEVPYmplY3Q8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2UjZ2V0QWJzdHJhY3RKcGFSb290RU9iamVjdCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFSb290RU9iamVjdCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYVJvb3RFT2JqZWN0Cit7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmVyc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZlcnNpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NoZW1hTG9jYXRpb24oKSA8ZW0+U2NoZW1hIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTY2hlbWFMb2NhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYUxvY2F0aW9uKCkgPGVtPlNjaGVtYSBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2NoZW1hTG9jYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSBTQ0hFTUFfTE9DQVRJT05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWJzdHJhY3RKcGFSb290RU9iamVjdCgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1Q7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlI2dldEpwYVJvb3RFT2JqZWN0X1ZlcnNpb24oKQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkKKwl7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYVJvb3RFT2JqZWN0I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFZlcnNpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRWZXJzaW9uR2VuKFN0cmluZyBuZXdWZXJzaW9uKQorCXsKKwkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOworCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKKwkJc2V0VmVyc2lvbkdlbihuZXdWZXJzaW9uKTsKKwkJc2V0U2NoZW1hTG9jYXRpb24oYnVpbGRTY2hlbWFMb2NhdGlvblN0cmluZyhnZXROYW1lc3BhY2UoKSwgZ2V0U2NoZW1hTG9jYXRpb25Gb3JWZXJzaW9uKG5ld1ZlcnNpb24pKSk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2NoZW1hIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYSBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U2NoZW1hTG9jYXRpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2UjZ2V0SnBhUm9vdEVPYmplY3RfU2NoZW1hTG9jYXRpb24oKQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbigpCisJeworCQlyZXR1cm4gc2NoZW1hTG9jYXRpb247CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhUm9vdEVPYmplY3QjZ2V0U2NoZW1hTG9jYXRpb24gPGVtPlNjaGVtYSBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTY2hlbWFMb2NhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNjaGVtYUxvY2F0aW9uKFN0cmluZyBuZXdTY2hlbWFMb2NhdGlvbikKKwl7CisJCVN0cmluZyBvbGRTY2hlbWFMb2NhdGlvbiA9IHNjaGVtYUxvY2F0aW9uOworCQlzY2hlbWFMb2NhdGlvbiA9IG5ld1NjaGVtYUxvY2F0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfX1NDSEVNQV9MT0NBVElPTiwgb2xkU2NoZW1hTG9jYXRpb24sIHNjaGVtYUxvY2F0aW9uKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9fVkVSU0lPTjoKKwkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOworCQkJY2FzZSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfX1NDSEVNQV9MT0NBVElPTjoKKwkJCQlyZXR1cm4gZ2V0U2NoZW1hTG9jYXRpb24oKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9fVkVSU0lPTjoKKwkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX19TQ0hFTUFfTE9DQVRJT046CisJCQkJc2V0U2NoZW1hTG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfX1ZFUlNJT046CisJCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9fU0NIRU1BX0xPQ0FUSU9OOgorCQkJCXNldFNjaGVtYUxvY2F0aW9uKFNDSEVNQV9MT0NBVElPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX19WRVJTSU9OOgorCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7CisJCQljYXNlIENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9fU0NIRU1BX0xPQ0FUSU9OOgorCQkJCXJldHVybiBTQ0hFTUFfTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHNjaGVtYUxvY2F0aW9uICE9IG51bGwgOiAhU0NIRU1BX0xPQ0FUSU9OX0VERUZBVUxULmVxdWFscyhzY2hlbWFMb2NhdGlvbik7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHZlcnNpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOworCQlyZXN1bHQuYXBwZW5kKCIsIHNjaGVtYUxvY2F0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChzY2hlbWFMb2NhdGlvbik7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZlcnNpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoWE1MLlZFUlNJT04pOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZlcnNpb24gLT4gc2NoZW1hIGxvY2F0aW9uIG1hcHBpbmcgKioqKioqKioqKioqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWVzcGFjZSgpOworCQorCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb25Gb3JWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKTsKKwkKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRTY2hlbWFMb2NhdGlvblN0cmluZyhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgc2NoZW1hTG9jYXRpb24pIHsKKwkJcmV0dXJuIG5hbWVzcGFjZSArICcgJyArIHNjaGVtYUxvY2F0aW9uOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRWZXJzaW9uVHJhbnNsYXRvcihmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMpIHsKKwkJcmV0dXJuIG5ldyBFbnVtZXJhdGVkVmFsdWVUcmFuc2xhdG9yKAorCQkJCVhNTC5WRVJTSU9OLCAKKwkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKcGFSb290RU9iamVjdF9WZXJzaW9uKCksCisJCQkJVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKSB7CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gZW51bWVyYXRlZE9iamVjdFZhbHVlcygpIHsKKwkJCQlyZXR1cm4gdmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lc3BhY2VUcmFuc2xhdG9yKFN0cmluZyBuYW1lc3BhY2UpIHsKKwkJcmV0dXJuIG5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MLk5BTUVTUEFDRSwgbmFtZXNwYWNlKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2NoZW1hTmFtZXNwYWNlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MLk5BTUVTUEFDRV9YU0ksIFhNTC5YU0lfTkFNRVNQQUNFX1VSTCk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNjaGVtYUxvY2F0aW9uVHJhbnNsYXRvcigKKwkJCWZpbmFsIFN0cmluZyBuYW1lc3BhY2UsCisJCQlmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMpIHsKKwkJCisJCXJldHVybiBuZXcgRW51bWVyYXRlZFZhbHVlVHJhbnNsYXRvcigKKwkJCQlYTUwuWFNJX1NDSEVNQV9MT0NBVElPTiwgCisJCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SnBhUm9vdEVPYmplY3RfU2NoZW1hTG9jYXRpb24oKSwKKwkJCQlUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpIHsKKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBlbnVtZXJhdGVkT2JqZWN0VmFsdWVzKCkgeworCQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgeworCQkJCQkJcmV0dXJuIGJ1aWxkU2NoZW1hTG9jYXRpb25TdHJpbmcobmFtZXNwYWNlLCBuZXh0KTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisJCX07CQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS94bWwvQ29tbW9uRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3htbC9Db21tb25GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEyNjk3MAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS94bWwvQ29tbW9uRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDb21tb25GYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnlJbXBsCit7CisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1vbkZhY3RvcnkgZUlOU1RBTkNFID0gaW5pdCgpOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQ29tbW9uRmFjdG9yeSBpbml0KCkKKwl7CisJCXRyeQorCQl7CisJCQlDb21tb25GYWN0b3J5IHRoZUNvbW1vbkZhY3RvcnkgPSAoQ29tbW9uRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgianB0LmNvbW1vbi54bWkiKTsgCisJCQlpZiAodGhlQ29tbW9uRmFjdG9yeSAhPSBudWxsKQorCQkJeworCQkJCXJldHVybiB0aGVDb21tb25GYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQorCQl7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IENvbW1vbkZhY3RvcnkoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21tb25GYWN0b3J5KCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCisJeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKKwkJeworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbW1vblBhY2thZ2UgZ2V0Q29tbW9uUGFja2FnZSgpCisJeworCQlyZXR1cm4gKENvbW1vblBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBDb21tb25QYWNrYWdlIGdldFBhY2thZ2UoKQorCXsKKwkJcmV0dXJuIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOworCX0KKworfSAvL0NvbW1vbkZhY3RvcnkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS94bWwvQ29tbW9uUGFja2FnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3htbC9Db21tb25QYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2M2ExNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS94bWwvQ29tbW9uUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsNDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAorICogPHVsPgorICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKyAqIDwvdWw+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkNvbW1vbkZhY3RvcnkKKyAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ29tbW9uUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlSW1wbAoreworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5BTUUgPSAieG1sIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1VSSSA9ICJqcHQuY29tbW9uLnhtaSI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbCI7CisKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tbW9uUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQ29tbW9uUGFja2FnZS5pbml0KCk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFSb290RU9iamVjdCA8ZW0+SnBhIFJvb3QgRU9iamVjdDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFSb290RU9iamVjdAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2UjZ2V0SnBhUm9vdEVPYmplY3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKUEFfUk9PVF9FT0JKRUNUID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKUEFfUk9PVF9FT0JKRUNUX19WRVJTSU9OID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpQQV9ST09UX0VPQkpFQ1RfX1NDSEVNQV9MT0NBVElPTiA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SnBhIFJvb3QgRU9iamVjdDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpQQV9ST09UX0VPQkpFQ1RfRkVBVFVSRV9DT1VOVCA9IDI7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYVJvb3RFT2JqZWN0IDxlbT5BYnN0cmFjdCBKcGEgUm9vdCBFT2JqZWN0PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhUm9vdEVPYmplY3QKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlI2dldEFic3RyYWN0SnBhUm9vdEVPYmplY3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX19WRVJTSU9OID0gSlBBX1JPT1RfRU9CSkVDVF9fVkVSU0lPTjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfX1NDSEVNQV9MT0NBVElPTiA9IEpQQV9ST09UX0VPQkpFQ1RfX1NDSEVNQV9MT0NBVElPTjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBKcGEgUm9vdCBFT2JqZWN0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UID0gSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGFic3RyYWN0SnBhUm9vdEVPYmplY3RFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MganBhUm9vdEVPYmplY3RFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIENvbW1vblBhY2thZ2UoKQorCXsKKwkJc3VwZXIoZU5TX1VSSSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIENvbW1vblBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbW1vblBhY2thZ2UgaW5pdCgpCisJeworCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgQ29tbW9uUGFja2FnZSgpKTsKKworCQlpc0luaXRlZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCisJCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKKwkJT3JtUGFja2FnZSB0aGVPcm1QYWNrYWdlID0gKE9ybVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBPcm1QYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKSA6IE9ybVBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJT3JtVjJfMFBhY2thZ2UgdGhlT3JtVjJfMFBhY2thZ2UgPSAoT3JtVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVYyXzBQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgT3JtVjJfMFBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSA6IE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRSk7CisJCVBlcnNpc3RlbmNlUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVBhY2thZ2UgPSAoUGVyc2lzdGVuY2VQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSkgOiBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJUGVyc2lzdGVuY2VWMl8wUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID0gKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5lTlNfVVJJKSA6IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZUlOU1RBTkNFKTsKKworCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cworCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVPcm1QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlUGVyc2lzdGVuY2VQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZU9ybVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVBlcnNpc3RlbmNlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlQ29tbW9uUGFja2FnZS5mcmVlemUoKTsKKworICAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChDb21tb25QYWNrYWdlLmVOU19VUkksIHRoZUNvbW1vblBhY2thZ2UpOworCQlyZXR1cm4gdGhlQ29tbW9uUGFja2FnZTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYVJvb3RFT2JqZWN0IDxlbT5BYnN0cmFjdCBKcGEgUm9vdCBFT2JqZWN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFic3RyYWN0IEpwYSBSb290IEVPYmplY3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFSb290RU9iamVjdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEFic3RyYWN0SnBhUm9vdEVPYmplY3QoKQorCXsKKwkJcmV0dXJuIGFic3RyYWN0SnBhUm9vdEVPYmplY3RFQ2xhc3M7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhUm9vdEVPYmplY3QgPGVtPkpwYSBSb290IEVPYmplY3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SnBhIFJvb3QgRU9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFSb290RU9iamVjdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEpwYVJvb3RFT2JqZWN0KCkKKwl7CisJCXJldHVybiBqcGFSb290RU9iamVjdEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFSb290RU9iamVjdCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFSb290RU9iamVjdCNnZXRWZXJzaW9uKCkKKwkgKiBAc2VlICNnZXRKcGFSb290RU9iamVjdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEpwYVJvb3RFT2JqZWN0X1ZlcnNpb24oKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWpwYVJvb3RFT2JqZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhUm9vdEVPYmplY3QjZ2V0U2NoZW1hTG9jYXRpb24gPGVtPlNjaGVtYSBMb2NhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjaGVtYSBMb2NhdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFSb290RU9iamVjdCNnZXRTY2hlbWFMb2NhdGlvbigpCisJICogQHNlZSAjZ2V0SnBhUm9vdEVPYmplY3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKcGFSb290RU9iamVjdF9TY2hlbWFMb2NhdGlvbigpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanBhUm9vdEVPYmplY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb21tb25GYWN0b3J5IGdldENvbW1vbkZhY3RvcnkoKQorCXsKKwkJcmV0dXJuIChDb21tb25GYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKKwl7CisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKKworCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJYWJzdHJhY3RKcGFSb290RU9iamVjdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUKTsKKworCQlqcGFSb290RU9iamVjdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKUEFfUk9PVF9FT0JKRUNUKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShqcGFSb290RU9iamVjdEVDbGFzcywgSlBBX1JPT1RfRU9CSkVDVF9fVkVSU0lPTik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoanBhUm9vdEVPYmplY3RFQ2xhc3MsIEpQQV9ST09UX0VPQkpFQ1RfX1NDSEVNQV9MT0NBVElPTik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwl7CisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47CisJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgcGFja2FnZQorCQlzZXROYW1lKGVOQU1FKTsKKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7CisJCXNldE5zVVJJKGVOU19VUkkpOworCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCWFic3RyYWN0SnBhUm9vdEVPYmplY3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKcGFSb290RU9iamVjdCgpKTsKKworCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworCQlpbml0RUNsYXNzKGFic3RyYWN0SnBhUm9vdEVPYmplY3RFQ2xhc3MsIEFic3RyYWN0SnBhUm9vdEVPYmplY3QuY2xhc3MsICJBYnN0cmFjdEpwYVJvb3RFT2JqZWN0IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyhqcGFSb290RU9iamVjdEVDbGFzcywgSnBhUm9vdEVPYmplY3QuY2xhc3MsICJKcGFSb290RU9iamVjdCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldEpwYVJvb3RFT2JqZWN0X1ZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAxLCAxLCBKcGFSb290RU9iamVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnBhUm9vdEVPYmplY3RfU2NoZW1hTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNjaGVtYUxvY2F0aW9uIiwgbnVsbCwgMSwgMSwgSnBhUm9vdEVPYmplY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJLy8gQ3JlYXRlIHJlc291cmNlCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKKwl7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhUm9vdEVPYmplY3QgPGVtPkFic3RyYWN0IEpwYSBSb290IEVPYmplY3Q8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFSb290RU9iamVjdAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlI2dldEFic3RyYWN0SnBhUm9vdEVPYmplY3QoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBBQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUID0gZUlOU1RBTkNFLmdldEFic3RyYWN0SnBhUm9vdEVPYmplY3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFSb290RU9iamVjdCA8ZW0+SnBhIFJvb3QgRU9iamVjdDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFSb290RU9iamVjdAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlI2dldEpwYVJvb3RFT2JqZWN0KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgSlBBX1JPT1RfRU9CSkVDVCA9IGVJTlNUQU5DRS5nZXRKcGFSb290RU9iamVjdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgSlBBX1JPT1RfRU9CSkVDVF9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRKcGFSb290RU9iamVjdF9WZXJzaW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEpQQV9ST09UX0VPQkpFQ1RfX1NDSEVNQV9MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXRKcGFSb290RU9iamVjdF9TY2hlbWFMb2NhdGlvbigpOworCisJfQorCit9IC8vQ29tbW9uUGFja2FnZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3htbC9FbWZUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3htbC9FbWZUb29scy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMWNjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UveG1sL0VtZlRvb2xzLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitwdWJsaWMgY2xhc3MgRW1mVG9vbHMKK3sKKwlwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgRU9iamVjdD4gVCBjcmVhdGUoCisJCQlFRmFjdG9yeSBlRmFjdG9yeSwgRUNsYXNzIGVDbGFzcywgQ2xhc3M8VD4gamF2YUNsYXNzKSB7CisJCQorCQlFUGFja2FnZSBlUGFja2FnZSA9IGVGYWN0b3J5LmdldEVQYWNrYWdlKCk7CisJCWZvciAoRUNsYXNzaWZpZXIgZWFjaCA6IGVQYWNrYWdlLmdldEVDbGFzc2lmaWVycygpKSB7CisJCQlpZiAoZWFjaCBpbnN0YW5jZW9mIEVDbGFzcykgeworCQkJCUVDbGFzcyBlYWNoRUNsYXNzID0gKEVDbGFzcykgZWFjaDsKKwkJCQlpZiAoZUNsYXNzLmlzU3VwZXJUeXBlT2YoZWFjaEVDbGFzcykpIHsKKwkJCQkJcmV0dXJuIChUKSBlRmFjdG9yeS5jcmVhdGUoZWFjaEVDbGFzcyk7CisJCQkJfQorCQkJfQorCQl9CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkiRmFjdG9yeSBkb2VzIG5vdCBzdXBwb3J0IG9iamVjdHMgb2YgdHlwZSBcJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIlwnIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3htbC9KcGFFT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UveG1sL0pwYUVPYmplY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWEzYjI4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3htbC9KcGFFT2JqZWN0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIENvbW1vbiBEYWxpIGJlaGF2aW9yIGZvciBFTUYgb2JqZWN0cy4KKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSnBhRU9iamVjdAorCWV4dGVuZHMgRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIGFsbCB0aGUgb2JqZWN0J3MgRU1GIGZlYXR1cmVzIGFyZSAidW5zZXQiLgorCSAqLworCWJvb2xlYW4gaXNVbnNldCgpOworCQorCS8qKgorCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgb2JqZWN0J3MgdGV4dCByZXByZXNlbnRhdGlvbiBjb250YWlucyB0aGUgdGV4dCBvZmZzZXQKKwkgKi8KKwlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSB0byBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLiAgVGhpcyBpcyB0aGUgc291cmNlCisJICogcmFuZ2UgdGhhdCB3aWxsIGJlIGhpZ2hsaWdodGVkIGZvciBhIHZhbGlkYXRpb24gZXJyb3IuCisJICovCisJVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSB0byBiZSB1c2VkIGZvciBzZWxlY3Rpb24uICBUaGlzIGlzIHRoZSBzb3VyY2UKKwkgKiByYW5nZSB0aGF0IHdpbGwgYmUgaGlnaGxpZ2h0ZWQgd2hlbiBzZWxlY3RpbmcgaW4gdGhlIHN0cnVjdHVyZSB2aWV3LgorCSAqLworCVRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS94bWwvSnBhUm9vdEVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9yZXNvdXJjZS94bWwvSnBhUm9vdEVPYmplY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTk2ZGNmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3htbC9KcGFSb290RU9iamVjdC5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SnBhIFJvb3QgRU9iamVjdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhUm9vdEVPYmplY3QjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVJvb3RFT2JqZWN0I2dldFNjaGVtYUxvY2F0aW9uIDxlbT5TY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlI2dldEpwYVJvb3RFT2JqZWN0KCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBKcGFSb290RU9iamVjdCBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2UjZ2V0SnBhUm9vdEVPYmplY3RfVmVyc2lvbigpCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0VmVyc2lvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVJvb3RFT2JqZWN0I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFZlcnNpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2NoZW1hIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYSBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U2NoZW1hTG9jYXRpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2UjZ2V0SnBhUm9vdEVPYmplY3RfU2NoZW1hTG9jYXRpb24oKQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFNjaGVtYUxvY2F0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhUm9vdEVPYmplY3QjZ2V0U2NoZW1hTG9jYXRpb24gPGVtPlNjaGVtYSBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTY2hlbWFMb2NhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U2NoZW1hTG9jYXRpb24oU3RyaW5nIHZhbHVlKTsKKwkKKwlUZXh0UmFuZ2UgZ2V0VmVyc2lvblRleHRSYW5nZSgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3htbC9KcGFYbWxSZXNvdXJjZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3htbC9KcGFYbWxSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlODFmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UveG1sL0pwYVhtbFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwyNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VNb2RlbExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUltcGw7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBKcGFYbWxSZXNvdXJjZQorCWV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlSW1wbAorCWltcGxlbWVudHMgSnBhUmVzb3VyY2VNb2RlbAoreworCXByb3RlY3RlZCBmaW5hbCBJQ29udGVudFR5cGUgY29udGVudFR5cGU7CisJCisJcHJvdGVjdGVkIGZpbmFsIFRyYW5zbGF0b3Igcm9vdFRyYW5zbGF0b3I7CisJCisJcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdDxKcGFSZXNvdXJjZU1vZGVsTGlzdGVuZXI+IHJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3Q7CisJCisJCisJcHVibGljIEpwYVhtbFJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIHJlbmRlcmVyLCBJQ29udGVudFR5cGUgY29udGVudFR5cGUsIFRyYW5zbGF0b3Igcm9vdFRyYW5zbGF0b3IpIHsKKwkJc3VwZXIodXJpLCByZW5kZXJlcik7CisJCXRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKwkJdGhpcy5yb290VHJhbnNsYXRvciA9IHJvb3RUcmFuc2xhdG9yOworCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PEpwYVJlc291cmNlTW9kZWxMaXN0ZW5lcj4oSnBhUmVzb3VyY2VNb2RlbExpc3RlbmVyLmNsYXNzKTsKKwl9CisJCisJCisJcHVibGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29udGVudFR5cGU7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKKwkJcmV0dXJuIGdldFJvb3RPYmplY3QoKSA9PSBudWxsID8gbnVsbCA6IGdldFJvb3RPYmplY3QoKS5nZXRWZXJzaW9uKCk7CisJfQorCQorCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgeworCQlpZiAoZ2V0Q29udGVudFR5cGUoKSA9PSBudWxsIHx8IGdldFZlcnNpb24oKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gbmV3IEpwYVJlc291cmNlVHlwZShnZXRDb250ZW50VHlwZSgpLCBnZXRWZXJzaW9uKCkpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIEJhc2ljTm90aWZpZXJJbXBsIG92ZXJyaWRlICoqKioqKioqKioKKwkKKwkvKioKKwkgKiBvdmVycmlkZSB0byBmaXJlIG5vdGlmaWNhdGlvbiBvbmx5IHdoZW4KKwkgKiAtIHRoZSByZXNvdXJjZSdzIHN0YXRlIGhhcyBhY3R1YWxseSBjaGFuZ2VkOyBhbmQKKwkgKiAtIHRoZSByZXNvdXJjZSBpcyBsb2FkZWQ7IGFuZAorCSAqIC0gdGhlIHJlc291cmNlJ3MgcmVzb3VyY2Ugc2V0IGlzIHN0aWxsIHByZXNlbnQgKEVNRiB3aWxsIGZpcmUgYW4KKwkgKiAgICBub3RpZmljYXRpb24gd2hlbiB0aGUgcmVzb3VyY2Ugc2V0IGlzIHNldCB0byAnbnVsbCcsIGp1c3QgYmVmb3JlCisJICogICAgdGhlIHJlc291cmNlIGlzICJ1bmxvYWRlZCIgLSB3ZSB3YW50IHRvIHN3YWxsb3cgdGhpcyBub3RpZmljYXRpb24pCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZU5vdGlmeShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCWlmICggISBub3RpZmljYXRpb24uaXNUb3VjaCgpICYmIHRoaXMuaXNMb2FkZWQoKSAmJiAodGhpcy5yZXNvdXJjZVNldCAhPSBudWxsKSkgeworCQkJc3VwZXIuZU5vdGlmeShub3RpZmljYXRpb24pOworCQkJdGhpcy5yZXNvdXJjZU1vZGVsQ2hhbmdlZCgpOworCQl9CisJfQorCisJLyoqCisJICogd2UgY291bGQgdXNlIHRoaXMgbWV0aG9kIHRvIHN1cHByZXNzIHNvbWUgbm90aWZpY2F0aW9uczsgb3Igd2UgY291bGQganVzdAorCSAqIGNoZWNrIHdoZXRoZXIgJ3Jlc291cmNlU2V0JyBpcyAnbnVsbCcgKHdoaWNoIGlzIHdoYXQgd2UgZG8pCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVzdWx0U2V0Q2xlYXJlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCXJldHVybiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgPT0gdGhpcykgJiYKKwkJCQkJKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2UuY2xhc3MpID09IFJFU09VUkNFX19SRVNPVVJDRV9TRVQpICYmCisJCQkJCShub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSA9PSBudWxsKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBUcmFuc2xhdG9yUmVzb3VyY2UgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCQorCS8qKgorCSAqIG9ubHkgYXBwbGljYWJsZSBmb3IgRFRELWJhc2VkIGZpbGVzCisJICovCisJcHVibGljIFN0cmluZyBnZXREb2N0eXBlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIFRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiB0aGlzLnJvb3RUcmFuc2xhdG9yOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIFRyYW5zbGF0b3JSZXNvdXJjZUltcGwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCQorCS8qKgorCSAqIG9ubHkgYXBwbGljYWJsZSBmb3IgRFRELWJhc2VkIGZpbGVzCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0UHVibGljSWQoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBvbmx5IGFwcGxpY2FibGUgZm9yIERURC1iYXNlZCBmaWxlcworCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFN5c3RlbUlkKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogdGhpcyBzZWVtcyB0byBiZSB0aGUgZGVmYXVsdCB2ZXJzaW9uIG9mIHRoZSBzcGVjIGZvciB0aGlzIGRvYworCSAqIGFuZCB0aGUgaWQgMTAgbWFwcyB0byB0aGUgdmVyc2lvbiAxLjAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRWZXJzaW9uSUQoKSB7CisJCXJldHVybiAxMDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYVJvb3RFT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gKEpwYVJvb3RFT2JqZWN0KSBzdXBlci5nZXRSb290T2JqZWN0KCk7CisJCX0KKwkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJvb3Qgb2JqZWN0cyBvZiBKUEEgWE1MIHJlc291cmNlcyBtdXN0IGltcGxlbWVudCBKcGFSb290RU9iamVjdCIsIGNjZSk7CisJCX0KKwl9CisJCisJCisJLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKKwkKKwlwdWJsaWMgYm9vbGVhbiBmaWxlRXhpc3RzKCkgeworCQlyZXR1cm4gdGhpcy5nZXRGaWxlKCkuZXhpc3RzKCk7CisJfQorCQorCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgeworCQlJRmlsZSBmaWxlID0gZ2V0RmlsZSh0aGlzLnVyaSk7CisJCXJldHVybiAoZmlsZSAhPSBudWxsKSA/IGZpbGUgOiB0aGlzLmdldENvbnZlcnRlZFVSSUZpbGUoKTsKKwl9CisJCisJcHJvdGVjdGVkIElGaWxlIGdldENvbnZlcnRlZFVSSUZpbGUoKSB7CisJCWlmICh0aGlzLnJlc291cmNlU2V0ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCVVSSSBjb252ZXJ0ZWRVUkkgPSB0aGlzLnJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh0aGlzLnVyaSk7CisJCXJldHVybiB0aGlzLnVyaS5lcXVhbHMoY29udmVydGVkVVJJKSA/IG51bGwgOiBnZXRGaWxlKGNvbnZlcnRlZFVSSSk7CisJfQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgRWNsaXBzZSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIFVSSS4KKwkgKiBUaGlzIFVSSSBpcyBhc3N1bWVkIHRvIGJlIGFic29sdXRlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCSAqICAgICBwbGF0Zm9ybTovcmVzb3VyY2UvLi4uLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgSUZpbGUgZ2V0RmlsZShVUkkgdXJpKSB7CisJCWlmICggISBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCVN0cmluZyBmaWxlTmFtZSA9IFVSSS5kZWNvZGUodXJpLnBhdGgoKSkuc3Vic3RyaW5nKEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUkVTT1VSQ0UubGVuZ3RoKCkgKyAxKTsKKwkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlTmFtZSkpOworCX0KKwkKKwlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKKwkJcmV0dXJuIGdldEZpbGUoKS5nZXRQcm9qZWN0KCk7CisJfQorCQorCXB1YmxpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7CisJCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QoZ2V0UHJvamVjdCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgbW9kaWZ5KFJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisJCXRyeSB7CisJCQlydW5uYWJsZS5ydW4oKTsKKwkJCXRyeSB7CisJCQkJc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJSnB0Q29yZVBsdWdpbi5sb2coaW9lKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUpwdENvcmVQbHVnaW4ubG9nKGUpOworCQl9CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCS8vIGltcGxlbWVudGF0aW9uIGluIFRyYW5zbGF0b3JSZXNvdXJjZUltcGwgaXMgYSBiaXQgb2ZmLi4uCisJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0VVJJKCkpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIEpwYVJlc291cmNlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCQorCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlTW9kZWxMaXN0ZW5lcihKcGFSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlTW9kZWxMaXN0ZW5lcihKcGFSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlc291cmNlTW9kZWxDaGFuZ2VkKCkgeworCQlmb3IgKEpwYVJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgeworCQkJbGlzdGVuZXIucmVzb3VyY2VNb2RlbENoYW5nZWQoKTsKKwkJfQorCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIGNhc3QgdGhpbmdzIGJhY2sgdG8gd2hhdCB0aGV5IGFyZSBpbiBFTUYgKioqKioqKioqKgorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxBZGFwdGVyPiBlQWRhcHRlcnMoKSB7CisJCXJldHVybiBzdXBlci5lQWRhcHRlcnMoKTsKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PEVPYmplY3Q+IGdldENvbnRlbnRzKCkgeworCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudHMoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvcmVzb3VyY2UveG1sL1hNTC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3htbC9YTUwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjgzNWNjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Jlc291cmNlL3htbC9YTUwuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbDsKKworLyoqCisgKiBYTUwtcmVsYXRlZCBzdHVmZi4KKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGludGVyZmFjZSBYTUwKK3sKKwlTdHJpbmcgVkVSU0lPTiA9ICJ2ZXJzaW9uIjsKKwkKKwlTdHJpbmcgTkFNRVNQQUNFID0gInhtbG5zIjsKKworCVN0cmluZyBOQU1FU1BBQ0VfWFNJID0gInhtbG5zOnhzaSI7CisJU3RyaW5nIFhTSV9OQU1FU1BBQ0VfVVJMID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsKKworCVN0cmluZyBYU0lfU0NIRU1BX0xPQ0FUSU9OID0gInhzaTpzY2hlbWFMb2NhdGlvbiI7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9BYnN0cmFjdFRleHRSYW5nZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvQWJzdHJhY3RUZXh0UmFuZ2UuamF2YQppbmRleCA4YjhjNWVmLi5lMTRlOTBlIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9BYnN0cmFjdFRleHRSYW5nZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L0Fic3RyYWN0VGV4dFJhbmdlLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlTdHJpbmcgc3RhcnQgPSBTdHJpbmcudmFsdWVPZih0aGlzLmdldE9mZnNldCgpKTsKIAkJU3RyaW5nIGVuZCA9IFN0cmluZy52YWx1ZU9mKHRoaXMuZW5kKCkpOwotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBzdGFydCArICIsICIgKyBlbmQpOworCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBzdGFydCArICIsICIgKyBlbmQpOyAvLyROT04tTkxTLTEkCiAJfQogCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9UZXh0UmFuZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L1RleHRSYW5nZS5qYXZhCmluZGV4IDBjNjUwNTUuLjE1OGE1YWYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L1RleHRSYW5nZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L1RleHRSYW5nZS5qYXZhCkBAIC05LDYgKzksOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CisKIC8qKgogICogQSB0ZXh0IHJhbmdlIGRlZmluZXMgdGhlIG9mZnNldCBpbnRvLCBsZW5ndGggb2YsIGFuZCBsaW5lIG9mIGEgcGllY2UKICAqIG9mIHRleHQuCkBAIC03NCwxMSArNzYsMTQgQEAKIAkJcHJpdmF0ZSBFbXB0eSgpIHsKIAkJCXN1cGVyKCk7CiAJCX0KKwkJcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgeworCQkJcmV0dXJuIElNZXNzYWdlLkxJTkVOT19VTlNFVDsKKwkJfQogCQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIElNZXNzYWdlLk9GRlNFVF9VTlNFVDsKIAkJfQogCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIElNZXNzYWdlLk9GRlNFVF9VTlNFVDsKIAkJfQogCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhpbnQgaW5kZXgpIHsKIAkJCXJldHVybiBmYWxzZTsKQEAgLTg2LDkgKzkxLDYgQEAKIAkJcHVibGljIGJvb2xlYW4gdG91Y2hlcyhpbnQgaW5kZXgpIHsKIAkJCXJldHVybiBpbmRleCA9PSAwOyAgLy8gPz8/CiAJCX0KLQkJcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQkJaWYgKG8gPT0gdGhpcykgewpAQCAtMTA3LDcgKzEwOSw3IEBACiAJCX0KIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRleHRSYW5nZS5FbXB0eSI7CisJCQlyZXR1cm4gIlRleHRSYW5nZS5FbXB0eSI7IC8vJE5PTi1OTFMtMSQKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0F0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0F0dHJpYnV0ZS5qYXZhCmluZGV4IGM0ZTkxN2EuLjQ2N2FhMTAgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9BdHRyaWJ1dGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvQXR0cmlidXRlLmphdmEKQEAgLTQ0LDEwICs0NCw0IEBACiAJICovCiAJYm9vbGVhbiBpc0ZpZWxkKCk7CiAKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIGEgcHJvcGVydHkvbWV0aG9kIHBhaXIuCi0JICovCi0JLy8gVE9ETyByZW5hbWUgdG8gaXNQcm9wZXJ0eSgpPwotCWJvb2xlYW4gaXNNZXRob2QoKTsKLQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L0RlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQppbmRleCA0Nzg2OGQ2Li43MGYxYTc5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpAQCAtMjgsNiArMjgsMTEgQEAKIHB1YmxpYyBpbnRlcmZhY2UgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gewogCiAJLyoqCisJICogUmVkdWNlIHRoZSBudW1iZXIgb2YgTkxTIHdhcm5pbmdzLgorCSAqLworCVN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgogCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24sIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCiAJICogYW5ub3RhdGlvbiBlbGVtZW50LiBSZXR1cm4gbnVsbCBvciBhbiBlbXB0eSBhcnJheQogCSAqIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50LgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L01vZGlmaWVkRGVjbGFyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS91dGlsaXR5L2pkdC9Nb2RpZmllZERlY2xhcmF0aW9uLmphdmEKaW5kZXggNjgyYjI5Ny4uYzM2ZDU4MiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3V0aWxpdHkvamR0L01vZGlmaWVkRGVjbGFyYXRpb24uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdXRpbGl0eS9qZHQvTW9kaWZpZWREZWNsYXJhdGlvbi5qYXZhCkBAIC02MywyMSArNjMsNDIgQEAKIAogCS8qKgogCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGltcG9ydCB0byB0aGUgZGVjbGFyYXRpb24ncyBjb21waWxhdGlvbiB1bml0LgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhcHByb3ByaWF0ZSBpbXBvcnQgd2FzIGFkZGVkIHRvIG9yIGFscmVhZHkgcHJlc2VudCBpbgorCSAqIHRoZSBkZWNsYXJhdGlvbidzIGNvbXBpbGF0aW9uIHVuaXQgKGkuZS4gdGhlIHNwZWNpZmllZCBjbGFzcyBjYW4gYmUKKwkgKiBzdWJzZXF1ZW50bHkgcmVmZXJlbmNlZCB1c2luZyBhICJzaG9ydCIgbmFtZSkuCisJICogQWxzbyByZXR1cm4gdHJ1ZSBpZiBhbiBpbXBvcnQgd2FzIHVubmVjZXNzYXJ5IChpLmUuIHRoZSBzcGVjaWZpZWQgY2xhc3MKKwkgKiBpcyBwYXJ0IG9mIHRoZSAiZGVmYXVsdCIgcGFja2FnZSkuCisJICogVGhpcyBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZyBhICJ3aWxkY2FyZCIgaW1wb3J0IChlLmcuICJqYXZhLnV0aWwuKiIpLgogCSAqLwotCXZvaWQgYWRkSW1wb3J0KFN0cmluZyBpbXBvcnROYW1lKTsKKwlib29sZWFuIGFkZEltcG9ydChTdHJpbmcgY2xhc3NOYW1lKTsKIAogCS8qKgogCSAqIEFkZCB0aGUgc3BlY2lmaWVkIHN0YXRpYyBpbXBvcnQgdG8gdGhlIGRlY2xhcmF0aW9uJ3MgY29tcGlsYXRpb24gdW5pdC4KKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXBwcm9wcmlhdGUgaW1wb3J0IHdhcyBhZGRlZCB0byBvciBhbHJlYWR5IHByZXNlbnQgaW4KKwkgKiB0aGUgZGVjbGFyYXRpb24ncyBjb21waWxhdGlvbiB1bml0IChpLmUuIHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgY2FuIGJlCisJICogc3Vic2VxdWVudGx5IHJlZmVyZW5jZWQgdXNpbmcgYSAic2hvcnQiIG5hbWUpLgorCSAqIEFsc28gcmV0dXJuIHRydWUgaWYgYW4gaW1wb3J0IHdhcyB1bm5lY2Vzc2FyeSAoaS5lLiB0aGUgc3BlY2lmaWVkIGVudW0KKwkgKiBpcyBwYXJ0IG9mIHRoZSAiZGVmYXVsdCIgcGFja2FnZSkuCisJICogVGhpcyBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZyBhICJ3aWxkY2FyZCIgaW1wb3J0IChlLmcuICJqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS4qIikuCiAJICovCi0Jdm9pZCBhZGRTdGF0aWNJbXBvcnQoU3RyaW5nIGltcG9ydE5hbWUpOworCWJvb2xlYW4gYWRkU3RhdGljSW1wb3J0KFN0cmluZyBlbnVtQ29uc3RhbnROYW1lKTsKIAogCS8qKgogCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGltcG9ydCB0byB0aGUgZGVjbGFyYXRpb24ncyBjb21waWxhdGlvbiB1bml0LgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhcHByb3ByaWF0ZSBpbXBvcnQgd2FzIGFkZGVkIHRvIG9yIGFscmVhZHkgcHJlc2VudCBpbgorCSAqIHRoZSBkZWNsYXJhdGlvbidzIGNvbXBpbGF0aW9uIHVuaXQgKGkuZS4gdGhlIHNwZWNpZmllZCBuYW1lIGNhbiBiZQorCSAqIHN1YnNlcXVlbnRseSByZWZlcmVuY2VkIHVzaW5nIGEgInNob3J0IiBuYW1lKS4KKwkgKiBBbHNvIHJldHVybiB0cnVlIGlmIGFuIGltcG9ydCB3YXMgdW5uZWNlc3NhcnkgKGkuZS4gdGhlIHNwZWNpZmllZCBjbGFzcworCSAqIG9yIGVudW0gaXMgcGFydCBvZiB0aGUgImRlZmF1bHQiIHBhY2thZ2UpLgorCSAqIFRoaXMgZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcgYSAid2lsZGNhcmQiIGltcG9ydCAoZS5nLiAiamF2YS51dGlsLioiKS4KIAkgKi8KLQl2b2lkIGFkZEltcG9ydChTdHJpbmcgaW1wb3J0TmFtZSwgYm9vbGVhbiBzdGF0aWNfKTsKKwlib29sZWFuIGFkZEltcG9ydChTdHJpbmcgaW1wb3J0TmFtZSwgYm9vbGVhbiBzdGF0aWNfKTsKIAogCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBoYXMgdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBoYXMgdGhlIHNwZWNpZmllZAorCSAqIChmdWxseS1xdWFsaWZpZWQpIG5hbWUgd2l0aGluIHRoZSBkZWNsYXJhdGlvbidzIGNvbnRleHQ7IGkuZS4gYXR0ZW1wdAorCSAqIHRvIHJlc29sdmUgdGhlIGFubm90YXRpb24ncyBuYW1lICh1c2luZyBpbXBvcnRzIGV0Yy4pIGFuZCByZXR1cm4KKwkgKiB3aGV0aGVyIGl0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBuYW1lLgogCSAqLwogCWJvb2xlYW4gYW5ub3RhdGlvbklzTmFtZWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbmFtZSk7CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5NmRkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1qYXZhQ29tcGlsZXIuLi5hcmdzLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZWE1ZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRiLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmE3ZGIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjExOjIyIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDJjMjg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjU5OjQyIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViYTQ4MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmRiLnVpCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuZGIudWkuaW50ZXJuYWw7IHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmRiO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuZWRpdG9yLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1Njk4MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjY0OGFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuZGIudWkiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjBlNTgzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gREIgVUkKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNiMjc3Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi91aS9pbnRlcm5hbC9EVFBVaVRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSVByb2ZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LlByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuaW50ZXJuYWwuQ29ubmVjdGlvblByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuaW50ZXJuYWwudWkud2l6YXJkcy5DUFdpemFyZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5pbnRlcm5hbC51aS53aXphcmRzLk5ld0NQV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuaW50ZXJuYWwudWkud2l6YXJkcy5Qcm9maWxlV2l6YXJkUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS51aS53aXphcmRzLklXaXphcmRDYXRlZ29yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqICBDb25uZWN0aW9uUHJvZmlsZVVpVG9vbHMKLSAqLwotcHVibGljIGNsYXNzIERUUFVpVG9vbHMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFX0NBVEVHT1JZX0lEID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkKLQkvKioKLQkgKiBMYXVuY2ggdGhlIERUUCBOZXcgQ29ubmVjdGlvbiBQcm9maWxlIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgZGF0YWJhc2UgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqIAotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGFkZGVkIHByb2ZpbGUsIG9yIG51bGwgaWYgdGhlIHdpemFyZCBpcyBjYW5jZWxsZWQuIENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSAKLQkgKiBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgYWRkZWQgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZU5ld1Byb2ZpbGUoKSB7Ci0JCU5ld0NQV2l6YXJkIHdpemFyZDsKLQkJV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZzsKLQotCQkvLyBGaWx0ZXIgZGF0YXNvdXJjZSBjYXRlZ29yeQotCSAgCVZpZXdlckZpbHRlciB2aWV3ZXJGaWx0ZXIgPSBuZXcgVmlld2VyRmlsdGVyKCkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdCggVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCi0JCQkJQ1BXaXphcmROb2RlIHdpemFyZE5vZGUgPSAoIENQV2l6YXJkTm9kZSkgZWxlbWVudDsKLQkJCQlpZiggISggd2l6YXJkTm9kZS5nZXRQcm92aWRlcigpIGluc3RhbmNlb2YgSVdpemFyZENhdGVnb3J5UHJvdmlkZXIpKSB7Ci0JCQkJCUlDYXRlZ29yeSBjYXQgPSBDb25uZWN0aW9uUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm92aWRlcigKLQkJCQkJCQkJCSgoIFByb2ZpbGVXaXphcmRQcm92aWRlcikgd2l6YXJkTm9kZS5nZXRQcm92aWRlcigpKS5nZXRQcm9maWxlKCkpLmdldENhdGVnb3J5KCk7Ci0JCQkJCQotCQkJCQkvLyBPbmx5IGRpc3BsYXkgd2l6YXJkcyBiZWxvbmcgdG8gZGF0YWJhc2UgY2F0ZWdvcnkKLQkJCQkJd2hpbGUoIGNhdCAhPSBudWxsKSB7Ci0JCQkJCQlpZiggY2F0LmdldElkKCkuZXF1YWxzKERBVEFCQVNFX0NBVEVHT1JZX0lEKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWNhdCA9IGNhdC5nZXRQYXJlbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCXdpemFyZCA9IG5ldyBOZXdDUFdpemFyZCggdmlld2VyRmlsdGVyLCBudWxsKTsKLQkJU2hlbGwgY3VycmVudFNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyggY3VycmVudFNoZWxsLCB3aXphcmQpOwotCQl3aXphcmREaWFsb2cuc2V0QmxvY2tPbk9wZW4oIHRydWUpOwotCQkKLQkJTG9jYWxQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYWxQcm9maWxlTGlzdGVuZXIoKTsKLQkJUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRQcm9maWxlTGlzdGVuZXIoIGxpc3RlbmVyKTsKLQkJCi0JCWlmKCB3aXphcmREaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCVByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlUHJvZmlsZUxpc3RlbmVyKCBsaXN0ZW5lcik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJQ29ubmVjdGlvblByb2ZpbGUgYWRkZWRQcm9maWxlID0gbGlzdGVuZXIuYWRkZWRQcm9maWxlOwotCQlQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZVByb2ZpbGVMaXN0ZW5lciggbGlzdGVuZXIpOwotCQkKLQkJcmV0dXJuIGFkZGVkUHJvZmlsZS5nZXROYW1lKCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIExvY2FsUHJvZmlsZUxpc3RlbmVyIGltcGxlbWVudHMgSVByb2ZpbGVMaXN0ZW5lciB7Ci0JCUlDb25uZWN0aW9uUHJvZmlsZSBhZGRlZFByb2ZpbGU7Ci0JCQotCQlwdWJsaWMgdm9pZCBwcm9maWxlQWRkZWQoIElDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQlhZGRlZFByb2ZpbGUgPSBwcm9maWxlOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVDaGFuZ2VkKCBJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVEZWxldGVkKCBJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCQkgIAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDczOTIwZTkuLjllOTEzYmUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5kYgotQnVuZGxlLVZlcnNpb246IDEuMS4yLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDEuMS40LnF1YWxpZmllcgogQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luCiBCdW5kbGUtQ2xhc3NQYXRoOiAuCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0NzczOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0Nvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIERhdGFiYXNlIGNvbm5lY3Rpb24gcHJvZmlsZSBmYWN0b3J5CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgeworCisJLyoqCisJICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgRFRQIGNvbm5lY3Rpb24gcHJvZmlsZXMgdGhlIGZhY3RvcnkgY2FuIHdyYXAgd2l0aAorCSAqIG5ldyBjb25uZWN0aW9uIHByb2ZpbGVzLgorCSAqLworCUl0ZXJhdG9yPFN0cmluZz4gY29ubmVjdGlvblByb2ZpbGVOYW1lcygpOworCisJLyoqCisJICogQnVpbGQgYW5kIHJldHVybiBhIGNvbm5lY3Rpb24gcHJvZmlsZSB0aGF0IHdyYXBzIHRoZSBEVFAgY29ubmVjdGlvbgorCSAqIHByb2ZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogUmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gRFRQIGNvbm5lY3Rpb24gcHJvZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQKKwkgKiBuYW1lLgorCSAqIFVzZSB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIGZpbmRlciB0byBhbGxvdyBjbGllbnRzIHRvIGNvbnRyb2wgaG93CisJICogZGF0YWJhc2Ugb2JqZWN0cyBhcmUgZm91bmQgYmFzZWQgb24gdGhlaXIgbmFtZXMuCisJICovCisJQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSwgRGF0YWJhc2VGaW5kZXIgZmluZGVyKTsKKworCS8qKgorCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBjb25uZWN0aW9uIHByb2ZpbGUgdGhhdCB3cmFwcyB0aGUgRFRQIGNvbm5lY3Rpb24KKwkgKiBwcm9maWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIERUUCBjb25uZWN0aW9uIHByb2ZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkCisJICogbmFtZS4KKwkgKiBDbGllbnRzIHNob3VsZCB1c2UgdGhpcyBtZXRob2Qgd2hlbiBhIEpQQSBwbGF0Zm9ybSBpcyB1bmF2YWlsYWJsZQorCSAqIChlLmcuIGR1cmluZyBwcm9qZWN0IGNyZWF0aW9uKS4gVGhlIHJldHVybmVkIGNvbm5lY3Rpb24gcHJvZmlsZSB3aWxsCisJICogbm90IGJlIGFibGUgdG8gc2VhcmNoIGZvciBkYXRhYmFzZSBvYmplY3RzIGJ5IGFueSBuYW1lcyBvdGhlciB0aGFuCisJICogdGhvc2Ugc3VwcGxpZWQgYnkgdGhlIGZhY3RvcnkgKGkuZS4gbG9va3VwcyBjYW5ub3QgYmUgcGVyZm9ybWVkIHdpdGgKKwkgKiAiaWRlbnRpZmllcnMiKS4KKwkgKi8KKwlDb25uZWN0aW9uUHJvZmlsZSBidWlsZENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZyBuYW1lKTsKKworCS8qKgorCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCBvZiBjaGFuZ2VzIHRvIHRoZSBEVFAKKwkgKiBjb25uZWN0aW9uIHByb2ZpbGVzLgorCSAqLworCXZvaWQgYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworCS8qKgorCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyLgorCSAqLworCXZvaWQgcmVtb3ZlQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvRGF0YWJhc2VGaW5kZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0RhdGFiYXNlRmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhNjc0MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0RhdGFiYXNlRmluZGVyLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGNsaWVudHMgb2YgdGhlIERhbGkgZGIgcGFja2FnZSB0byBwbHVnIGluIGEgY3VzdG9tCisgKiBzdHJhdGVneSBmb3IgY29tcGFyaW5nIGFuIGlkZW50aWZpZXIgdG8gdGhlIG5hbWVzIG9mIGEgY29sbGVjdGlvbiBvZgorICogZGF0YWJhc2Ugb2JqZWN0cy4KKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIERhdGFiYXNlRmluZGVyIHsKKworCS8qKgorCSAqIFNlbGVjdCBhbmQgcmV0dXJuIGZyb20gdGhlIHNwZWNpZmllZCBsaXN0IG9mIGRhdGFiYXNlIG9iamVjdHMgdGhlCisJICogZGF0YWJhc2Ugb2JqZWN0IGlkZW50aWZpZWQgYnkgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLgorCSAqLworCTxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKFRbXSBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBpZGVudGlmaWVyLCBEZWZhdWx0Q2FsbGJhY2sgZGVmYXVsdENhbGxiYWNrKTsKKworCS8qKgorCSAqIFRoZSBwbGF0Zm9ybS1wcm92aWRlZCBmaW5kZXIgaXMgcGFzc2VkIGEgImRlZmF1bHQiIGNhbGxiYWNrIHRoYXQgY2FuIGJlCisJICogdXNlZCBpZiBhcHByb3ByaWF0ZS4KKwkgKi8KKwlpbnRlcmZhY2UgRGVmYXVsdENhbGxiYWNrIHsKKworCQkvKioKKwkJICogU2VsZWN0IGFuZCByZXR1cm4gZnJvbSB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgZGF0YWJhc2Ugb2JqZWN0cyB0aGUKKwkJICogZGF0YWJhc2Ugb2JqZWN0IGlkZW50aWZpZWQgYnkgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLgorCQkgKi8KKwkJPFQgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdD4gVCBzZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIoVFtdIGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIGlkZW50aWZpZXIpOworCisJfQorCisJLyoqCisJICogVGhpcyBmaW5kZXIgc2VhcmNoZXMgZm9yIGFuIGV4YWN0IG1hdGNoLgorCSAqLworCWZpbmFsIGNsYXNzIFNpbXBsZSBpbXBsZW1lbnRzIERhdGFiYXNlRmluZGVyIHsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBEYXRhYmFzZUZpbmRlciBJTlNUQU5DRSA9IG5ldyBTaW1wbGUoKTsKKwkJcHVibGljIHN0YXRpYyBEYXRhYmFzZUZpbmRlciBpbnN0YW5jZSgpIHsKKwkJCXJldHVybiBJTlNUQU5DRTsKKwkJfQorCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCisJCXByaXZhdGUgU2ltcGxlKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCQkvLyBzZWFyY2ggZm9yIGFuIGV4YWN0IG1hdGNoIG9uIHRoZSBuYW1lCisJCXB1YmxpYyA8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIHNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcihUW10gZGF0YWJhc2VPYmplY3RzLCBTdHJpbmcgaWRlbnRpZmllciwgRGVmYXVsdENhbGxiYWNrIGRlZmF1bHRDYWxsYmFjaykgeworCQkJZm9yIChUIGRhdGFiYXNlT2JqZWN0IDogZGF0YWJhc2VPYmplY3RzKSB7CisJCQkJaWYgKGRhdGFiYXNlT2JqZWN0LmdldE5hbWUoKS5lcXVhbHMoaWRlbnRpZmllcikpIHsKKwkJCQkJcmV0dXJuIGRhdGFiYXNlT2JqZWN0OworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuICJEYXRhYmFzZUZpbmRlci5TaW1wbGUiOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGZpbmRlciB1c2VzIHRoZSBwYXNzZWQgaW4gY2FsbGJhY2sgdG8gc2VhcmNoIHRoZSBsaXN0IG9mIGRhdGFiYXNlIG9iamVjdHMuCisJICovCisJZmluYWwgY2xhc3MgRGVmYXVsdCBpbXBsZW1lbnRzIERhdGFiYXNlRmluZGVyIHsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBEYXRhYmFzZUZpbmRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7CisJCXB1YmxpYyBzdGF0aWMgRGF0YWJhc2VGaW5kZXIgaW5zdGFuY2UoKSB7CisJCQlyZXR1cm4gSU5TVEFOQ0U7CisJCX0KKwkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQorCQlwcml2YXRlIERlZmF1bHQoKSB7CisJCQlzdXBlcigpOworCQl9CisJCS8vIHNpbXBseSB1c2UgdGhlIGNhbGxiYWNrCisJCXB1YmxpYyA8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIHNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcihUW10gZGF0YWJhc2VPYmplY3RzLCBTdHJpbmcgaWRlbnRpZmllciwgRGVmYXVsdENhbGxiYWNrIGRlZmF1bHRDYWxsYmFjaykgeworCQkJcmV0dXJuIGRlZmF1bHRDYWxsYmFjay5zZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIoZGF0YWJhc2VPYmplY3RzLCBpZGVudGlmaWVyKTsKKwkJfQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiAiRGF0YWJhc2VGaW5kZXIuRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvRGF0YWJhc2VPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0RhdGFiYXNlT2JqZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmNzU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL0RhdGFiYXNlT2JqZWN0LmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGI7CisKKy8qKgorICogQ29tbW9uIGJlaGF2aW9yIHRvIGFsbCBkYXRhYmFzZSBvYmplY3RzCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworcHVibGljIGludGVyZmFjZSBEYXRhYmFzZU9iamVjdCB7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdCdzIG5hbWUuCisJICovCisJU3RyaW5nIGdldE5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgZGF0YWJhc2Ugb2JqZWN0J3MgImlkZW50aWZpZXIiLCB3aGljaCBpcyB0aGUgb2JqZWN0J3MgbmFtZQorCSAqIG1vZGlmaWVkIHNvIGl0IGNhbiBiZSB1c2VkIGluIGFuIFNRTCBzdGF0ZW1lbnQgKGUuZy4gaWYgdGhlIG5hbWUgY29udGFpbnMKKwkgKiBzcGVjaWFsIGNoYXJhY3RlcnMgb3IgaXMgbWl4ZWQgY2FzZSwgaXQgd2lsbCBiZSBkZWxpbWl0ZWQsIHR5cGljYWxseSBieQorCSAqIGRvdWJsZS1xdW90ZXMpLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBkYXRhYmFzZSBvYmplY3QncyBpZGVudGlmaWVyIG1hdGNoZXMgdGhlIHNwZWNpZmllZAorCSAqICJkZWZhdWx0IG5hbWUiLgorCSAqLworCVN0cmluZyBnZXRJZGVudGlmaWVyKFN0cmluZyBkZWZhdWx0TmFtZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdCdzICJpZGVudGlmaWVyIiwgd2hpY2ggaXMgdGhlIG9iamVjdCdzIG5hbWUKKwkgKiBtb2RpZmllZCBzbyBpdCBjYW4gYmUgdXNlZCBpbiBhbiBTUUwgc3RhdGVtZW50IChlLmcuIGlmIHRoZSBuYW1lIGNvbnRhaW5zCisJICogc3BlY2lhbCBjaGFyYWN0ZXJzIG9yIGlzIG1peGVkIGNhc2UsIGl0IHdpbGwgYmUgZGVsaW1pdGVkLCB0eXBpY2FsbHkgYnkKKwkgKiBkb3VibGUtcXVvdGVzKS4KKwkgKi8KKwlTdHJpbmcgZ2V0SWRlbnRpZmllcigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBkYXRhYmFzZSBvYmplY3QncyBkYXRhYmFzZS4KKwkgKi8KKwlEYXRhYmFzZSBnZXREYXRhYmFzZSgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBkYXRhYmFzZSBvYmplY3QncyBjb25uZWN0aW9uIHByb2ZpbGUuCisJICovCisJQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2NiMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JUHJvZmlsZUxpc3RlbmVyMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LlByb2ZpbGVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZUZpbmRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7CisKKy8qKgorICogV3JhcCB0aGUgRFRQIFByb2ZpbGVNYW5hZ2VyIGluIHlldCBhbm90aGVyIHNpbmdsZXRvbi4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeQorCWltcGxlbWVudHMgQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5Cit7CisJcHJpdmF0ZSBQcm9maWxlTWFuYWdlciBkdHBQcm9maWxlTWFuYWdlcjsKKworCXByaXZhdGUgTG9jYWxQcm9maWxlTGlzdGVuZXIgcHJvZmlsZUxpc3RlbmVyOworCisKKwkvLyAqKioqKioqKioqIHNpbmdsZXRvbiAqKioqKioqKioqCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7CisKKwlwdWJsaWMgc3RhdGljIERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqICdwcml2YXRlJyB0byBlbnN1cmUgc2luZ2xldG9uCisJICovCisJcHJpdmF0ZSBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIGxpZmVjeWNsZSAqKioqKioqKioqCisKKwkvKioKKwkgKiBjYWxsZWQgYnkgcGx1Zy1pbgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKKwkJdGhpcy5kdHBQcm9maWxlTWFuYWdlciA9IFByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCk7CisJCXRoaXMucHJvZmlsZUxpc3RlbmVyID0gbmV3IExvY2FsUHJvZmlsZUxpc3RlbmVyKCk7CisJCXRoaXMuZHRwUHJvZmlsZU1hbmFnZXIuYWRkUHJvZmlsZUxpc3RlbmVyKHRoaXMucHJvZmlsZUxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBjYWxsZWQgYnkgcGx1Zy1pbgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgeworCQl0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLnJlbW92ZVByb2ZpbGVMaXN0ZW5lcih0aGlzLnByb2ZpbGVMaXN0ZW5lcik7CisJCXRoaXMucHJvZmlsZUxpc3RlbmVyID0gbnVsbDsKKwkJdGhpcy5kdHBQcm9maWxlTWFuYWdlciA9IG51bGw7CisJfQorCisKKwkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gcHJvZmlsZXMgKioqKioqKioqKgorCisJcHVibGljIHN5bmNocm9uaXplZCBDb25uZWN0aW9uUHJvZmlsZSBidWlsZENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZyBuYW1lLCBEYXRhYmFzZUZpbmRlciBmaW5kZXIpIHsKKwkJZm9yIChJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSA6IHRoaXMuZHRwUHJvZmlsZU1hbmFnZXIuZ2V0UHJvZmlsZXMoKSkgeworCQkJaWYgKGR0cFByb2ZpbGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiBuZXcgRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyKGR0cFByb2ZpbGUsIGZpbmRlcik7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIHRoaXMuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShuYW1lLCBEYXRhYmFzZUZpbmRlci5TaW1wbGUuaW5zdGFuY2UoKSk7CisJfQorCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY29ubmVjdGlvblByb2ZpbGVOYW1lcygpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPElDb25uZWN0aW9uUHJvZmlsZSwgU3RyaW5nPih0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlcygpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7CisJCQkJIHJldHVybiBkdHBQcm9maWxlLmdldE5hbWUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIHN5bmNocm9uaXplZCBJdGVyYXRvcjxJQ29ubmVjdGlvblByb2ZpbGU+IGR0cENvbm5lY3Rpb25Qcm9maWxlcygpIHsKKwkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPElDb25uZWN0aW9uUHJvZmlsZT4odGhpcy5kdHBQcm9maWxlTWFuYWdlci5nZXRQcm9maWxlcygpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKKworCXB1YmxpYyB2b2lkIGFkZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCQl0aGlzLnByb2ZpbGVMaXN0ZW5lci5hZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJdGhpcy5wcm9maWxlTGlzdGVuZXIucmVtb3ZlQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisJfQorCisKKwkvLyAqKioqKioqKioqIGxpc3RlbmVyICoqKioqKioqKioKKworCS8qKgorCSAqIEZvcndhcmQgZXZlbnRzIHRvIHRoZSBmYWN0b3J5J3MgbGlzdGVuZXJzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIExvY2FsUHJvZmlsZUxpc3RlbmVyIGltcGxlbWVudHMgSVByb2ZpbGVMaXN0ZW5lcjEgeworCQlwcml2YXRlIExpc3RlbmVyTGlzdDxDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI+KENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIuY2xhc3MpOworCisJCUxvY2FsUHJvZmlsZUxpc3RlbmVyKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCisJCXZvaWQgYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOworCQl9CisKKwkJdm9pZCByZW1vdmVDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7CisJCX0KKworCQkvLyAqKioqKioqKioqIElQcm9maWxlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJCXB1YmxpYyB2b2lkIHByb2ZpbGVBZGRlZChJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSkgeworCQkJU3RyaW5nIG5hbWUgPSBkdHBQcm9maWxlLmdldE5hbWUoKTsKKwkJCWZvciAoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7CisJCQkJbGlzdGVuZXIuY29ubmVjdGlvblByb2ZpbGVBZGRlZChuYW1lKTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyB2b2lkIHByb2ZpbGVDaGFuZ2VkKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlLCBTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG9sZERlc2NyaXB0aW9uLCBCb29sZWFuIG9sZEF1dG9Db25uZWN0KSB7CisJCQlTdHJpbmcgbmV3TmFtZSA9IGR0cFByb2ZpbGUuZ2V0TmFtZSgpOworCQkJaWYgKCAhIG5ld05hbWUuZXF1YWxzKG9sZE5hbWUpKSB7CisJCQkJZm9yIChDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKKwkJCQkJbGlzdGVuZXIuY29ubmVjdGlvblByb2ZpbGVSZW5hbWVkKG9sZE5hbWUsIG5ld05hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXB1YmxpYyB2b2lkIHByb2ZpbGVDaGFuZ2VkKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7CisJCQkvLyB0aGlzIG1ldGhvZCBzaG91bGRuJ3QgYmUgY2FsbGVkIG9uIElQcm9maWxlTGlzdGVuZXIxCisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHByb2ZpbGVEZWxldGVkKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7CisJCQlTdHJpbmcgbmFtZSA9IGR0cFByb2ZpbGUuZ2V0TmFtZSgpOworCQkJZm9yIChDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKKwkJCQlsaXN0ZW5lci5jb25uZWN0aW9uUHJvZmlsZVJlbW92ZWQobmFtZSk7CisJCQl9CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3NmZlNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0LmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2VPYmplY3Q7CisKKy8qKgorICogRFRQIGRhdGFiYXNlIG9iamVjdAorICovCitwdWJsaWMgaW50ZXJmYWNlIERUUERhdGFiYXNlT2JqZWN0IGV4dGVuZHMgRGF0YWJhc2VPYmplY3QgeworCisJLyoqCisJICogY292YXJpYW50IG92ZXJyaWRlCisJICovCisJRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyIGdldENvbm5lY3Rpb25Qcm9maWxlKCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0V3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkMmQyYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0V3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMTkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuUmVmcmVzaE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworCisvKioKKyAqICBEVFAgQ2F0YWxvZyBPYmplY3QgV3JhcHBlciBiYXNlIGNsYXNzCisgKi8KK2Fic3RyYWN0IGNsYXNzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcgorCWltcGxlbWVudHMgRFRQRGF0YWJhc2VPYmplY3QKK3sKKwkvLyB3ZSBuZWVkIGEgd2F5IHRvIGdldCB0byB0aGUgY29ubmVjdGlvbiBwcm9maWxlCisJcHJpdmF0ZSBmaW5hbCBEVFBEYXRhYmFzZU9iamVjdCBwYXJlbnQ7CisKKwkvLyBsaXN0ZW4gZm9yIHRoZSAiY2F0YWxvZyBvYmplY3QiIGJlaW5nIHJlZnJlc2hlZAorCXByaXZhdGUgZmluYWwgSUNhdGFsb2dPYmplY3RMaXN0ZW5lciBjYXRhbG9nT2JqZWN0TGlzdGVuZXI7CisKKwkvLyBsaXN0ZW4gZm9yIHRoaXMgRFRQIGNhdGFsb2cgb2JqZWN0IHRvIHJlZnJlc2gKKwlmaW5hbCBJQ2F0YWxvZ09iamVjdCBjYXRhbG9nT2JqZWN0OworCisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCisKKwlEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIoRFRQRGF0YWJhc2VPYmplY3QgcGFyZW50LCBPYmplY3QgZHRwT2JqZWN0KSB7CisJCXN1cGVyKCk7CisJCXRoaXMucGFyZW50ID0gcGFyZW50OworCQlpZiAodGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmlzQ29ubmVjdGVkKCkpIHsKKwkJCS8vIHdlIG9ubHkgbGlzdGVuIHRvICJsaXZlIiBjb25uZWN0aW9ucyAoYXMgb3Bwb3NlZCB0byAib2ZmLWxpbmUiIGNvbm5lY3Rpb25zKTsKKwkJCS8vIGFuZCB0aGUgbW9kZWwgaXMgcmVidWlsdCB3aGVuIHRoZSBjb25uZWN0aW9uIGNvbm5lY3RzIG9yIGRpc2Nvbm5lY3RzCisJCQl0aGlzLmNhdGFsb2dPYmplY3QgPSAoSUNhdGFsb2dPYmplY3QpIGR0cE9iamVjdDsKKwkJCXRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyID0gdGhpcy5idWlsZENhdGFsb2dPYmplY3RMaXN0ZW5lcigpOworCQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5oYXNBbnlMaXN0ZW5lcnMoKSkgeworCQkJCXRoaXMuc3RhcnRMaXN0ZW5pbmcoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoaXMuY2F0YWxvZ09iamVjdCA9IG51bGw7CisJCQl0aGlzLmNhdGFsb2dPYmplY3RMaXN0ZW5lciA9IG51bGw7CisJCX0KKwl9CisKKwlwcml2YXRlIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgYnVpbGRDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgSUNhdGFsb2dPYmplY3RMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSUNhdGFsb2dPYmplY3QgZG1FbGVtZW50LCBpbnQgZXZlbnRUeXBlKSB7CisJCQkJaWYgKGRtRWxlbWVudCA9PSBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIudGhpcy5jYXRhbG9nT2JqZWN0KSB7CisJCQkJCS8vICdldmVudFR5cGUnIGRvZXNuJ3Qgc2VlbSB0byBiZSB2ZXJ5IHVzZWZ1bCwgc28gZHJvcCBpdAorCQkJCQlEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIudGhpcy5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisKKwkvLyB0eXBpY2FsbHksIG5vdGlmeSB0aGUgY29ubmVjdGlvbiBwcm9maWxlIHNvbWV0aGluZyBoYXMgY2hhbmdlZAorCXZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7CisJCXRoaXMuY2xlYXIoKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgRFRQIG9iamVjdCBoYXMgY2hhbmdlZCwgY2xlYXIgdGhlIHdyYXBwZXIncyBzdGF0ZSBzbyBpdCB3aWxsIGJlCisJICogc3luY2hyb25pemVkIG9uLWRlbWFuZC4KKwkgKi8KKwlhYnN0cmFjdCB2b2lkIGNsZWFyKCk7CisKKworCisJLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKKworCURUUERhdGFiYXNlT2JqZWN0IGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIHRoaXMucGFyZW50OworCX0KKworCXB1YmxpYyBEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7CisJCXJldHVybiB0aGlzLnBhcmVudC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOworCX0KKworCXB1YmxpYyBEVFBEYXRhYmFzZVdyYXBwZXIgZ2V0RGF0YWJhc2UoKSB7CisJCXJldHVybiB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0RGF0YWJhc2UoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCBieSB3aGVuZXZlciB3ZSBuZWVkIHRvIGZpbmQgYSBjb21wb25lbnQgYnkgaWRlbnRpZmllcgorCSAqIChlLmcuIFRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoU3RyaW5nKSkuIFdlIGNoYW5uZWwgYWxsIHRoZSBjYWxscyB0byB0aGUKKwkgKiBjb25uZWN0aW9uIHByb2ZpbGUsIHdoaWNoIHRoZW4gZGVsZWdhdGVzIHRvIHRoZSBKUEEgcGxhdGZvcm0tc3VwcGxpZWQKKwkgKiAiZGF0YWJhc2UgZmluZGVyIi4KKwkgKi8KKwk8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIHNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcihUW10gZGF0YWJhc2VPYmplY3RzLCBTdHJpbmcgaWRlbnRpZmllcikgeworCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcihkYXRhYmFzZU9iamVjdHMsIGlkZW50aWZpZXIpOworCX0KKworCS8qKgorCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KKwkgKi8KKwk8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIHNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWQoVFtdIGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChUIGRiT2JqZWN0IDogZGF0YWJhc2VPYmplY3RzKSB7CisJCQlpZiAoZGJPYmplY3QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiBkYk9iamVjdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBFeGFtcGxlczoKKwkgKiBPcmFjbGUgZXRjLgorCSAqICAgICBUYWJsZShGT08pIHZzLiAiRm9vIiA9PiBudWxsCisJICogICAgIFRhYmxlKEJBUikgdnMuICJGb28iID0+ICJCQVIiCisJICogICAgIFRhYmxlKEZvbykgdnMuICJGb28iID0+ICJcIkZvb1wiIgorCSAqICAgICBUYWJsZShCYXIpIHZzLiAiRm9vIiA9PiAiXCJCYXJcIiIKKwkgKiAgICAgCisJICogUG9zdGdyZVNRTCBldGMuCisJICogICAgIFRhYmxlKGZvbykgdnMuICJGb28iID0+IG51bGwKKwkgKiAgICAgVGFibGUoYmFyKSB2cy4gIkZvbyIgPT4gImJhciIKKwkgKiAgICAgVGFibGUoRm9vKSB2cy4gIkZvbyIgPT4gIlwiRm9vXCIiCisJICogICAgIFRhYmxlKEJhcikgdnMuICJGb28iID0+ICJcIkJhclwiIgorCSAqICAgICAKKwkgKiBTUUwgU2VydmVyIGV0Yy4KKwkgKiAgICAgVGFibGUoRm9vKSB2cy4gIkZvbyIgPT4gbnVsbAorCSAqICAgICBUYWJsZShmb28pIHZzLiAiRm9vIiA9PiAiZm9vIgorCSAqICAgICBUYWJsZShiYXIpIHZzLiAiRm9vIiA9PiAiYmFyIgorCSAqICAgICBUYWJsZShCYXIpIHZzLiAiRm9vIiA9PiAiQmFyIgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcihTdHJpbmcgZGVmYXVsdE5hbWUpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2UoKS5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcih0aGlzLmdldE5hbWUoKSwgZGVmYXVsdE5hbWUpOworCX0KKworCS8qKgorCSAqIEV4YW1wbGVzOgorCSAqIE9yYWNsZSBldGMuCisJICogICAgIFRhYmxlKEZPTykgPT4gIkZPTyIKKwkgKiAgICAgVGFibGUoRm9vKSA9PiAiXCJGb29cIiIKKwkgKiAgICAgVGFibGUoZm9vKSA9PiAiXCJmb29cIiIKKwkgKiAgICAgVGFibGUoZm9vKyspID0+ICJcImZvbysrXCIiCisJICogICAgIFRhYmxlKGYibykgPT4gIlwiZlwiXCJvKytcIiIgKGkuZS4gImYiIm8iKQorCSAqICAgICAKKwkgKiBQb3N0Z3JlU1FMIGV0Yy4KKwkgKiAgICAgVGFibGUoRk9PKSA9PiAiXCJGT09cIiIKKwkgKiAgICAgVGFibGUoRm9vKSA9PiAiXCJGb29cIiIKKwkgKiAgICAgVGFibGUoZm9vKSA9PiAiZm9vIgorCSAqICAgICBUYWJsZShmb28rKykgPT4gIlwiZm9vKytcIiIKKwkgKiAgICAgVGFibGUoZiJvKSA9PiAiXCJmXCJcIm8rK1wiIiAoaS5lLiAiZiIibyIpCisJICogICAgIAorCSAqIFNRTCBTZXJ2ZXIgZXRjLgorCSAqICAgICBUYWJsZShGT08pID0+ICJGT08iCisJICogICAgIFRhYmxlKEZvbykgPT4gIkZvbyIKKwkgKiAgICAgVGFibGUoZm9vKSA9PiAiZm9vIgorCSAqICAgICBUYWJsZShmb28rKykgPT4gIlwiZm9vKytcIiIKKwkgKiAgICAgVGFibGUoZiJvKSA9PiAiXCJmXCJcIm8rK1wiIiAoaS5lLiAiZiIibyIpCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgeworCQlyZXR1cm4gdGhpcy5nZXREYXRhYmFzZSgpLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKHRoaXMuZ2V0TmFtZSgpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldE5hbWUoKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIGxpc3RlbmluZyB0byBEVFAgZGF0YWJhc2Ugb2JqZWN0ICoqKioqKioqKioKKworCS8vIHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyAibGl2ZSIgYW5kIGhhcyBsaXN0ZW5lcnMKKwl2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgeworCQl0aGlzLmNoZWNrTGlzdGVuZXIoKTsKKwkJUmVmcmVzaE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5BZGRMaXN0ZW5lcih0aGlzLmNhdGFsb2dPYmplY3QsIHRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyKTsKKwl9CisKKwkvLyB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgaXMgImxpdmUiIGFuZCBoYXMgbm8gbGlzdGVuZXJzCisJdm9pZCBzdG9wTGlzdGVuaW5nKCkgeworCQl0aGlzLmNoZWNrTGlzdGVuZXIoKTsKKyAgICAgICAgUmVmcmVzaE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcih0aGlzLmNhdGFsb2dPYmplY3QsIHRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2hlY2tMaXN0ZW5lcigpIHsKKwkJaWYgKHRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRoZSBjYXRhbG9nIGxpc3RlbmVyIGlzIG51bGwiKTsgIC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQU2NoZW1hV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQU2NoZW1hV3JhcHBlci5qYXZhCmluZGV4IDI3MGYzZDcuLmZhMzAxNjYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFNjaGVtYVdyYXBwZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBTY2hlbWFXcmFwcGVyLmphdmEKQEAgLTEwLDkgKzEwLDEyIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuU1FMVGFibGVzUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TZXF1ZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CkBAIC0yNyw2ICszMCw5IEBACiAJZXh0ZW5kcyBEVFBXcmFwcGVyCiAJaW1wbGVtZW50cyBTY2hlbWEKIHsKKwkvL3VzZWQgZm9yIGFkb3B0ZXIgcHJvZHVjdCBjdXN0b21pemF0aW9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfQU5EX1ZJRVdfVEFCTEVTX09OTFkgPSAic3VwcG9ydFBlcnNpc3RlbnRBbmRWaWV3VGFibGVzT25seSI7CisJCiAJLy8gYmFja3BvaW50ZXIgdG8gcGFyZW50CiAJcHJpdmF0ZSBmaW5hbCBEVFBTY2hlbWFDb250YWluZXJXcmFwcGVyIGNvbnRhaW5lcjsKIApAQCAtOTUsNyArMTAxLDI2IEBACiAJLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+IGR0cFRhYmxlcygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2NoZW1hLmdldFRhYmxlcygpOworCQkKKwkJLy9yZXR1cm4gcGVyc2lzdGVudCBhbmQgdmlldyB0YWJsZXMgb25seSAtIHRoaXMgZmlsdGVycyBvdXQgc3lub255bXMgd2hlcmUgdGhleSBhcmUgbm90CisJCS8vZnVsbHkgc3VwcG9ydGVkIGFuZCBwb3RlbnRpYWxseSBvdGhlciBwcm9ibGVtYXRpYyB0YWJsZSB0eXBlcyAtIHNlZSBidWcgMjY5MDU3CisJCVN0cmluZyBzdXBwb3J0UGVyc2lzdGVudEFuZFZpZXdUYWJsZXNPbmx5ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldFByb3BlcnR5KFBFUlNJU1RFTlRfQU5EX1ZJRVdfVEFCTEVTX09OTFkpOworCQlpZiAoIHN1cHBvcnRQZXJzaXN0ZW50QW5kVmlld1RhYmxlc09ubHkgIT0gbnVsbCAmJiBzdXBwb3J0UGVyc2lzdGVudEFuZFZpZXdUYWJsZXNPbmx5LmVxdWFscygidHJ1ZSIpICkgeworICAgICAgICAgICAgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+IHJlc3VsdCA9CisgICAgICAgICAgICAJbmV3IEFycmF5TGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+KCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJUID0gdGhpcy5kdHBTY2hlbWEuZ2V0VGFibGVzKCkuaXRlcmF0b3IoKTtpdGVyVC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSB0YWJsZQorICAgICAgICAgICAgICAgICAgICAJPSAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlKSBpdGVyVC5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTUUxUYWJsZXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRQZXJzaXN0ZW50VGFibGUoKS5pc1N1cGVyVHlwZU9mKHRhYmxlLmVDbGFzcygpKSB8fAorICAgICAgICAgICAgICAgICAgICAJIFNRTFRhYmxlc1BhY2thZ2UuZUlOU1RBTkNFLmdldFZpZXdUYWJsZSgpLmlzU3VwZXJUeXBlT2YodGFibGUuZUNsYXNzKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQodGFibGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIHRoaXMuZHRwU2NoZW1hLmdldFRhYmxlcygpOworCQl9CiAJfQogCiAJcHVibGljIGludCB0YWJsZXNTaXplKCkgewpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0Fic3RyYWN0VmVuZG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvQWJzdHJhY3RWZW5kb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzRhOWFhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0Fic3RyYWN0VmVuZG9yLmphdmEKQEAgLTAsMCArMSwyOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKKworLyoqCisgKiBDb25zb2xpZGF0ZSB0aGUgYmVoYXZpb3IgY29tbW9uIHRvIHRoZSB0eXBpY2FsIHZlbmRvcnMuCisgKi8KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0VmVuZG9yCisJaW1wbGVtZW50cyBWZW5kb3IKK3sKKworCUFic3RyYWN0VmVuZG9yKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpOworCisKKwkvLyAqKioqKioqKioqIGNhdGFsb2cgYW5kIHNjaGVtYSBzdXBwb3J0ICoqKioqKioqKioKKworCWFic3RyYWN0IENhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKTsKKworCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCkuc3VwcG9ydHNDYXRhbG9ncyhkYXRhYmFzZSk7CisJfQorCisJcHVibGljIExpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCkuZ2V0Q2F0YWxvZ3MoZGF0YWJhc2UpOworCX0KKworCXB1YmxpYyBMaXN0PFNjaGVtYT4gZ2V0U2NoZW1hcyhEYXRhYmFzZSBkYXRhYmFzZSkgeworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCkuZ2V0U2NoZW1hcyhkYXRhYmFzZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInZlbmRvcjogIiArIHRoaXMsIGV4KTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJLyoqCisJICogVHlwaWNhbGx5LCB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBjYXRhbG9nIGlzIHRoZSB1c2VyIG5hbWUuCisJICovCisJcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXREZWZhdWx0Q2F0YWxvZ0lkZW50aWZpZXJzKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUpIHsKKwkJaWYgKCAhIHRoaXMuc3VwcG9ydHNDYXRhbG9ncyhkYXRhYmFzZSkpIHsKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwkJfQorCQlBcnJheUxpc3Q8U3RyaW5nPiBpZGVudGlmaWVycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0aGlzLmFkZERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcnNUbyhkYXRhYmFzZSwgdXNlck5hbWUsIGlkZW50aWZpZXJzKTsKKwkJcmV0dXJuIGlkZW50aWZpZXJzOworCX0KKworCXZvaWQgYWRkRGVmYXVsdENhdGFsb2dJZGVudGlmaWVyc1RvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBpZGVudGlmaWVycykgeworCQlpZGVudGlmaWVycy5hZGQodGhpcy5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcih1c2VyTmFtZSkpOworCX0KKworCS8qKgorCSAqIFR5cGljYWxseSwgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgc2NoZW1hIGlzIHRoZSB1c2VyIG5hbWUuCisJICovCisJcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXREZWZhdWx0U2NoZW1hSWRlbnRpZmllcnMoRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSkgeworCQlBcnJheUxpc3Q8U3RyaW5nPiBpZGVudGlmaWVycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl0aGlzLmFkZERlZmF1bHRTY2hlbWFJZGVudGlmaWVyc1RvKGRhdGFiYXNlLCB1c2VyTmFtZSwgaWRlbnRpZmllcnMpOworCQlyZXR1cm4gaWRlbnRpZmllcnM7CisJfQorCisJLyoqCisJICogVGhlIHVzZXIgbmFtZSBwYXNzZWQgaW4gaGVyZSB3YXMgcmV0cmlldmVkIGZyb20gRFRQLgorCSAqIERUUCBzdG9yZXMgdGhlIHVzZXIgbmFtZSB0aGF0IHdhcyBwYXNzZWQgdG8gaXQgZHVyaW5nIHRoZSBjb25uZWN0aW9uCisJICogdG8gdGhlIGRhdGFiYXNlLiBBcyBhIHJlc3VsdCwgdGhpcyB1c2VyIG5hbWUgaXMgYW4gImlkZW50aWZpZXIiIG5vdCBhICJuYW1lIi4KKwkgKiBJZiB0aGUgdXNlciBuYW1lIHdlcmUgcmV0cmlldmVkIGZyb20gdGhlIEpEQkMgY29ubmVjdGlvbiBpdCB3b3VsZCBwcm9iYWJseQorCSAqIGJlIGEgIm5hbWUiLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjb25uZWN0IHRvIGFuIE9yYWNsZSBkYXRhYmFzZSB3aXRoIHRoZQorCSAqIHVzZXIgbmFtZSAic2NvdHQiLCBidXQgdGhhdCBpZGVudGlmZXIgaXMgZm9sZGVkIHRvIHRoZSBhY3R1YWwgdXNlciBuYW1lCisJICogIlNDT1RUIi4gRFRQIHN0b3JlcyB0aGUgb3JpZ2luYWwgc3RyaW5nICJzY290dCIsIHdoaWxlIHRoZSBPcmFjbGUgSkRCQworCSAqIGRyaXZlciBzdG9yZXMgdGhlIGZvbGRlZCBzdHJpbmcgIlNDT1RUIi4KKwkgKi8KKwl2b2lkIGFkZERlZmF1bHRTY2hlbWFJZGVudGlmaWVyc1RvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBpZGVudGlmaWVycykgeworCQlpZGVudGlmaWVycy5hZGQodXNlck5hbWUpOworCX0KKworCisJLy8gKioqKioqKioqKiBmb2xkaW5nIHN0cmF0ZWd5IHVzZWQgdG8gY29udmVydCBuYW1lcyBhbmQgaWRlbnRpZmllcnMgKioqKioqKioqKgorCisJLyoqCisJICogVGhlIFNRTCBzcGVjIHNheXMgYSAibm9ybWFsIiAobm9uLWRlbGltaXRlZCkgaWRlbnRpZmllciBzaG91bGQgYmUKKwkgKiBmb2xkZWQgdG8gdXBwZXJjYXNlOyBidXQgc29tZSBkYXRhYmFzZXMgZG8gb3RoZXJ3aXNlIChlLmcuIFN5YmFzZSkuCisJICovCisJYWJzdHJhY3QgRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpOworCisKKwkvLyAqKioqKioqKioqIG5hbWUgLT4gaWRlbnRpZmllciAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdE5hbWUpIHsKKwkJcmV0dXJuIHRoaXMubmFtZVJlcXVpcmVzRGVsaW1pdGVycyhuYW1lKSA/IHRoaXMuZGVsaW1pdE5hbWUobmFtZSkKKwkJCQkJCTogdGhpcy5ub3JtYWxOYW1lc01hdGNoKG5hbWUsIGRlZmF1bHROYW1lKSA/IG51bGwgOiBuYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIHRoaXMubmFtZVJlcXVpcmVzRGVsaW1pdGVycyhuYW1lKSA/IHRoaXMuZGVsaW1pdE5hbWUobmFtZSkgOiBuYW1lOworCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2Ugb2JqZWN0IG5hbWUgbXVzdCBiZSBkZWxpbWl0ZWQKKwkgKiB3aGVuIHVzZWQgaW4gYW4gU1FMIHN0YXRlbWVudC4KKwkgKiBJZiB0aGUgbmFtZSBoYXMgYW55ICJzcGVjaWFsIiBjaGFyYWN0ZXJzIChhcyBvcHBvc2VkIHRvIGxldHRlcnMsCisJICogZGlnaXRzLCBhbmQgb3RoZXIgYWxsb3dlZCBjaGFyYWN0ZXJzIFtlLmcuIHVuZGVyc2NvcmVzXSksIGl0IHJlcXVpcmVzCisJICogZGVsaW1pdGVycy4KKwkgKiBJZiB0aGUgbmFtZSBpcyBtaXhlZCBjYXNlIGFuZCB0aGUgZGF0YWJhc2UgZm9sZHMgdW5kZWxpbWl0ZWQgbmFtZXMKKwkgKiAodG8gZWl0aGVyIHVwcGVyY2FzZSBvciBsb3dlcmNhc2UpLCBpdCByZXF1aXJlcyBkZWxpbWl0ZXJzLgorCSAqLworCWJvb2xlYW4gbmFtZVJlcXVpcmVzRGVsaW1pdGVycyhTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gKG5hbWUubGVuZ3RoKCkgPT0gMCkgIC8vICBhbiBlbXB0eSBzdHJpbmcgbXVzdCBiZSBkZWxpbWl0ZWQoPykKKwkJCQkJfHwgdGhpcy5uYW1lQ29udGFpbnNBbnlOb25Ob3JtYWxDaGFyYWN0ZXJzKG5hbWUpCisJCQkJCXx8IHRoaXMubmFtZUlzTm90Rm9sZGVkKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbmFtZSBjb250YWlucyBhbnkgIm5vbi1ub3JtYWwiIGNoYXJhY3RlcnMKKwkgKiB0aGF0IHJlcXVpcmUgdGhlIG5hbWUgdG8gYmUgZGVsaW1pdGVkLgorCSAqIFByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3QgZW1wdHkKKwkgKi8KKwlib29sZWFuIG5hbWVDb250YWluc0FueU5vbk5vcm1hbENoYXJhY3RlcnMoU3RyaW5nIG5hbWUpIHsKKwkJY2hhcltdIHN0cmluZyA9IG5hbWUudG9DaGFyQXJyYXkoKTsKKwkJaWYgKHRoaXMuY2hhcmFjdGVySXNOb25Ob3JtYWxOYW1lU3RhcnQoc3RyaW5nWzBdKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJZm9yIChpbnQgaSA9IHN0cmluZy5sZW5ndGg7IGktLSA+IDE7ICkgeyAgLy8gbm90ZTogc3RvcCBhdCAxCisJCQlpZiAodGhpcy5jaGFyYWN0ZXJJc05vbk5vcm1hbE5hbWVQYXJ0KHN0cmluZ1tpXSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgIm5vbi1ub3JtYWwiIGZvciB0aGUgZmlyc3QKKwkgKiBjaGFyYWN0ZXIgb2YgYSBuYW1lLgorCSAqIFR5cGljYWxseSwgZGF0YWJhc2VzIGFyZSBtb3JlIHJlc3RyaWN0aXZlIGFib3V0IHdoYXQgY2hhcmFjdGVycyBjYW4KKwkgKiBiZSB1c2VkIHRvICpzdGFydCogYW4gaWRlbnRpZmllciAoYXMgb3Bwb3NlZCB0byB0aGUgY2hhcmFjdGVycworCSAqIGFsbG93ZWQgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIGlkZW50aWZpZXIpLgorCSAqLworCWJvb2xlYW4gY2hhcmFjdGVySXNOb25Ob3JtYWxOYW1lU3RhcnQoY2hhciBjKSB7CisJCXJldHVybiAhIHRoaXMuY2hhcmFjdGVySXNOb3JtYWxOYW1lU3RhcnQoYyk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgIm5vcm1hbCIgZm9yIHRoZSBmaXJzdAorCSAqIGNoYXJhY3RlciBvZiBhIG5hbWUuCisJICogVGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhbiBpZGVudGlmaWVyIGNhbiBiZToKKwkgKiAgIC0gYSBsZXR0ZXIKKwkgKiAgIC0gYW55IG9mIHRoZSBleHRlbmRlZCwgdmVuZG9yLXNwZWNpZmljLCAibm9ybWFsIiBzdGFydCBjaGFyYWN0ZXJzCisJICovCisJYm9vbGVhbiBjaGFyYWN0ZXJJc05vcm1hbE5hbWVTdGFydChjaGFyIGMpIHsKKwkJLy8gYWxsIHZlbmRvcnMgYWxsb3cgYSBsZXR0ZXIKKwkJcmV0dXJuIENoYXJhY3Rlci5pc0xldHRlcihjKQorCQkJCXx8IHRoaXMuY2hhcmFjdGVySXNFeHRlbmRlZE5vcm1hbE5hbWVTdGFydChjKTsKKwl9CisKKwlib29sZWFuIGNoYXJhY3RlcklzRXh0ZW5kZWROb3JtYWxOYW1lU3RhcnQoY2hhciBjKSB7CisJCXJldHVybiBhcnJheUNvbnRhaW5zKHRoaXMuZ2V0RXh0ZW5kZWROb3JtYWxOYW1lU3RhcnRDaGFyYWN0ZXJzKCksIGMpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgIm5vcm1hbCIgY2hhcmFjdGVycywgYmV5b25kIGxldHRlcnMsIGZvciB0aGUKKwkgKiBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBuYW1lLgorCSAqIFJldHVybiBudWxsIGlmIHRoZXJlIGFyZSBubyAiZXh0ZW5kZWQiIGNoYXJhY3RlcnMuCisJICovCisJY2hhcltdIGdldEV4dGVuZGVkTm9ybWFsTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgIm5vbi1ub3JtYWwiIGZvciB0aGUgc2Vjb25kCisJICogYW5kIHN1YnNlcXVlbnQgY2hhcmFjdGVycyBvZiBhIG5hbWUuCisJICovCisJYm9vbGVhbiBjaGFyYWN0ZXJJc05vbk5vcm1hbE5hbWVQYXJ0KGNoYXIgYykgeworCQlyZXR1cm4gISB0aGlzLmNoYXJhY3RlcklzTm9ybWFsTmFtZVBhcnQoYyk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgIm5vcm1hbCIgZm9yIHRoZSBzZWNvbmQgYW5kCisJICogc3Vic2VxdWVudCBjaGFyYWN0ZXJzIG9mIGEgbmFtZS4KKwkgKiBUaGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGNoYXJhY3RlcnMgb2YgYSAibm9ybWFsIiBuYW1lIGNhbiBiZToKKwkgKiAgIC0gYSBsZXR0ZXIKKwkgKiAgIC0gYSBkaWdpdAorCSAqICAgLSBhbnkgb2YgdGhlIGV4dGVuZGVkLCB2ZW5kb3Itc3BlY2lmaWMsICJub3JtYWwiIHN0YXJ0IGNoYXJhY3RlcnMKKwkgKiAgIC0gYW55IG9mIHRoZSBleHRlbmRlZCwgdmVuZG9yLXNwZWNpZmljLCAibm9ybWFsIiBwYXJ0IGNoYXJhY3RlcnMKKwkgKi8KKwlib29sZWFuIGNoYXJhY3RlcklzTm9ybWFsTmFtZVBhcnQoY2hhciBjKSB7CisJCS8vIGFsbCB2ZW5kb3JzIGFsbG93IGEgbGV0dGVyIG9yIGRpZ2l0CisJCXJldHVybiBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGMpCisJCQkJfHwgdGhpcy5jaGFyYWN0ZXJJc0V4dGVuZGVkTm9ybWFsTmFtZVN0YXJ0KGMpCisJCQkJfHwgdGhpcy5jaGFyYWN0ZXJJc0V4dGVuZGVkTm9ybWFsTmFtZVBhcnQoYyk7CisJfQorCisJYm9vbGVhbiBjaGFyYWN0ZXJJc0V4dGVuZGVkTm9ybWFsTmFtZVBhcnQoY2hhciBjKSB7CisJCXJldHVybiBhcnJheUNvbnRhaW5zKHRoaXMuZ2V0RXh0ZW5kZWROb3JtYWxOYW1lUGFydENoYXJhY3RlcnMoKSwgYyk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSAibm9ybWFsIiBjaGFyYWN0ZXJzLCBiZXlvbmQgbGV0dGVycyBhbmQgZGlnaXRzIGFuZCB0aGUKKwkgKiAibm9ybWFsIiBmaXJzdCBjaGFyYWN0ZXJzLCBmb3IgdGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCBjaGFyYWN0ZXJzCisJICogb2YgYW4gaWRlbnRpZmllci4gUmV0dXJuIG51bGwgaWYgdGhlcmUgYXJlIG5vIGFkZGl0aW9uYWwgY2hhcmFjdGVycy4KKwkgKi8KKwljaGFyW10gZ2V0RXh0ZW5kZWROb3JtYWxOYW1lUGFydENoYXJhY3RlcnMoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3QgZm9sZGVkIHRvIHRoZSBkYXRhYmFzZSdzCisJICogY2FzZSwgcmVxdWlyaW5nIGl0IHRvIGJlIGRlbGltaXRlZC4KKwkgKi8KKwlib29sZWFuIG5hbWVJc05vdEZvbGRlZChTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gISB0aGlzLmdldEZvbGRpbmdTdHJhdGVneSgpLm5hbWVJc0ZvbGRlZChuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICJub3JtYWwiIG5hbWVzIG1hdGNoLgorCSAqLworCWJvb2xlYW4gbm9ybWFsTmFtZXNNYXRjaChTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgeworCQlyZXR1cm4gdGhpcy5ub3JtYWxJZGVudGlmaWVyc0FyZUNhc2VTZW5zaXRpdmUoKSA/CisJCQkJCQluYW1lMS5lcXVhbHMobmFtZTIpCisJCQkJCToKKwkJCQkJCW5hbWUxLmVxdWFsc0lnbm9yZUNhc2UobmFtZTIpOworCX0KKworCS8qKgorCSAqIFR5cGljYWxseSwgIm5vcm1hbCIgaWRlbnRpZmllcnMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuCisJICovCisJYm9vbGVhbiBub3JtYWxJZGVudGlmaWVyc0FyZUNhc2VTZW5zaXRpdmUoKSB7CisJCXJldHVybiB0aGlzLmdldEZvbGRpbmdTdHJhdGVneSgpLm5vcm1hbElkZW50aWZpZXJzQXJlQ2FzZVNlbnNpdGl2ZSgpOworCX0KKworCS8qKgorCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBuYW1lIGluIGRlbGltaXRlcnMgKHR5cGljYWxseSBkb3VibGUtcXVvdGVzKSwKKwkgKiBjb252ZXJ0aW5nIGl0IHRvIGFuIGlkZW50aWZpZXIuCisJICovCisJU3RyaW5nIGRlbGltaXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5xdW90ZShuYW1lKTsKKwl9CisKKworCS8vICoqKioqKioqKiogaWRlbnRpZmllciAtPiBuYW1lICoqKioqKioqKioKKworCS8vIG5vdCBzdXJlIGhvdyB0byBoYW5kbGUgYW4gZW1wdHkgc3RyaW5nOgorCS8vIGJvdGggIiIgYW5kICJcIlwiIiBhcmUgY29udmVydGVkIHRvICIiIC4uLgorCS8vIGNvbnZlcnQgIiIgdG8gJ251bGwnIHNpbmNlIGVtcHR5IHN0cmluZ3MgbXVzdCBiZSBkZWxpbWl0ZWQ/CisJcHVibGljIFN0cmluZyBjb252ZXJ0SWRlbnRpZmllclRvTmFtZShTdHJpbmcgaWRlbnRpZmllcikgeworCQlyZXR1cm4gKGlkZW50aWZpZXIgPT0gbnVsbCkgPyBudWxsIDoKKwkJCQkJdGhpcy5pZGVudGlmaWVySXNEZWxpbWl0ZWQoaWRlbnRpZmllcikgPworCQkJCQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0KGlkZW50aWZpZXIpCisJCQkJCToKKwkJCQkJCXRoaXMuZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkuZm9sZChpZGVudGlmaWVyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIgaXMgImRlbGltaXRlZCIuCisJICogVGhlIFNRTC05MiBzcGVjIHNheXMgaWRlbnRpZmllcnMgc2hvdWxkIGJlIGRlbGltaXRlZCBieQorCSAqIGRvdWJsZS1xdW90ZXM7IGJ1dCBzb21lIGRhdGFiYXNlcyBhbGxvdyBvdGhlcndpc2UgKGUuZy4gU3liYXNlKS4KKwkgKi8KKwlib29sZWFuIGlkZW50aWZpZXJJc0RlbGltaXRlZChTdHJpbmcgaWRlbnRpZmllcikgeworCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNRdW90ZWQoaWRlbnRpZmllcik7CisJfQorCisKKwkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RFRQVmVuZG9yTmFtZSgpOworCX0KKworCS8qKgorCSAqIHN0YXRpYyBjb252ZW5pZW5jZSBtZXRob2QgLSBhcnJheSBudWxsIGNoZWNrCisJICovCisJc3RhdGljIGJvb2xlYW4gYXJyYXlDb250YWlucyhjaGFyW10gYXJyYXksIGNoYXIgYykgeworCQlyZXR1cm4gKGFycmF5ICE9IG51bGwpICYmIEFycmF5VG9vbHMuY29udGFpbnMoYXJyYXksIGMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0NhdGFsb2dTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0NhdGFsb2dTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljN2E0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYTsKKworLyoqCisgKiBIYW5kbGUgdGhlIHZhcmlldHkgb2YgY2F0YWxvZyAoYW5kIHNjaGVtYSkgY29uZmlndXJhdGlvbnMgZ2VuZXJhdGVkIGJ5IERUUC4KKyAqLworaW50ZXJmYWNlIENhdGFsb2dTdHJhdGVneSB7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgRFRQIGRhdGFiYXNlIGhhcyByZWFsIGNhdGFsb2dzLgorCSAqLworCWJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBkYXRhYmFzZSdzIGNhdGFsb2dzLgorCSAqLworCUxpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UncyBzY2hlbWFzLgorCSAqLworCUxpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKERhdGFiYXNlIGRhdGFiYXNlKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0RCMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0RCMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OWQwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvREIyLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOworCitjbGFzcyBEQjIKKwlleHRlbmRzIEFic3RyYWN0VmVuZG9yCit7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZHRwVmVuZG9yTmFtZTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBVREIgPSBuZXcgREIyKCJEQjIgVURCIik7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgVURCX0lfU0VSSUVTID0gbmV3IERCMigiREIyIFVEQiBpU2VyaWVzIik7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgVURCX1pfU0VSSUVTID0gbmV3IERCMigiREIyIFVEQiB6U2VyaWVzIik7IC8vJE5PTi1OTFMtMSQKKworCXN0YXRpYyBWZW5kb3IgdWRiKCkgeworCQlyZXR1cm4gVURCOworCX0KKworCXN0YXRpYyBWZW5kb3IgdWRiSVNlcmllcygpIHsKKwkJcmV0dXJuIFVEQl9JX1NFUklFUzsKKwl9CisKKwlzdGF0aWMgVmVuZG9yIHVkYlpTZXJpZXMoKSB7CisJCXJldHVybiBVREJfWl9TRVJJRVM7CisJfQorCisJLyoqCisJICogRW5zdXJlIG9ubHkgc3RhdGljIGluc3RhbmNlcy4KKwkgKi8KKwlwcml2YXRlIERCMihTdHJpbmcgZHRwVmVuZG9yTmFtZSkgeworCQlzdXBlcigpOworCQl0aGlzLmR0cFZlbmRvck5hbWUgPSBkdHBWZW5kb3JOYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuZHRwVmVuZG9yTmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlDYXRhbG9nU3RyYXRlZ3kgZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gVW5rbm93bkNhdGFsb2dTdHJhdGVneS5pbnN0YW5jZSgpOyAgLy8gbm90IHZlcmlmaWVkIHlldC4uLgorCX0KKworCUBPdmVycmlkZQorCUZvbGRpbmdTdHJhdGVneSBnZXRGb2xkaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwljaGFyW10gZ2V0RXh0ZW5kZWROb3JtYWxOYW1lUGFydENoYXJhY3RlcnMoKSB7CisJCXJldHVybiBFWFRFTkRFRF9OT1JNQUxfTkFNRV9QQVJUX0NIQVJBQ1RFUlM7CisJfQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9OT1JNQUxfTkFNRV9QQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJ18nIH07CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9EZXJieS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0RlcmJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiY2UwMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9EZXJieS5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7CisKK2NsYXNzIERlcmJ5CisJZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBJTlNUQU5DRSA9IG5ldyBEZXJieSgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJc3RhdGljIFZlbmRvciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBEZXJieSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKSB7CisJCXJldHVybiAiRGVyYnkiOyAvLyROT04tTkxTLTEkCisJfQorCisJQE92ZXJyaWRlCisJQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKKwkJcmV0dXJuIEZhdXhDYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7CisJfQorCisJQE92ZXJyaWRlCisJdm9pZCBhZGREZWZhdWx0U2NoZW1hSWRlbnRpZmllcnNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBpZGVudGlmaWVycykgeworCQlpZGVudGlmaWVycy5hZGQodGhpcy5idWlsZERlZmF1bHRTY2hlbWFJZGVudGlmaWVyKHVzZXJOYW1lKSk7CisJfQorCisJLyoqCisJICogVGhlIGRlZmF1bHQgdXNlciBuYW1lIG9uIERlcmJ5IGlzICJBUFAiIHdoZW4gdGhlIHVzZXIgY29ubmVjdHMgd2l0aG91dAorCSAqIGEgdXNlciBuYW1lLgorCSAqLworCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoU3RyaW5nIHVzZXJOYW1lKSB7CisJCXJldHVybiAoKHVzZXJOYW1lICE9IG51bGwpICYmICh1c2VyTmFtZS5sZW5ndGgoKSAhPSAwKSkgPyB1c2VyTmFtZSA6IERFRkFVTFRfVVNFUl9JREVOVElGSUVSOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9VU0VSX0lERU5USUZJRVIgPSAiQVBQIjsgIC8vJE5PTi1OTFMtMSQKKworCUBPdmVycmlkZQorCWNoYXJbXSBnZXRFeHRlbmRlZE5vcm1hbE5hbWVQYXJ0Q2hhcmFjdGVycygpIHsKKwkJcmV0dXJuIEVYVEVOREVEX05PUk1BTF9OQU1FX1BBUlRfQ0hBUkFDVEVSUzsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX05PUk1BTF9OQU1FX1BBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycgfTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0ZhdXhDYXRhbG9nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9GYXV4Q2F0YWxvZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViNWI0MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9GYXV4Q2F0YWxvZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE7CisKKy8qKgorICogQ2F0YWxvZyBzdHJhdGVneSBmb3IgRFRQIGRhdGFiYXNlcyB0aGF0IGJ1aWxkIGEgInZpcnR1YWwiIGNhdGFsb2cgKHRoYXQgaGFzCisgKiBubyBuYW1lKSBiZWNhdXNlIHRoZSB1bmRlcmx5aW5nIEpEQkMgZHJpdmVyIGRvZXMgbm90IHJldHVybiBhbnkgY2F0YWxvZ3MKKyAqIChlLmcuIE9yYWNsZSkuCisgKiBAc2VlIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0Q2F0YWxvZ3MoKQorICovCitjbGFzcyBGYXV4Q2F0YWxvZ1N0cmF0ZWd5CisJaW1wbGVtZW50cyBDYXRhbG9nU3RyYXRlZ3kKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDYXRhbG9nU3RyYXRlZ3kgSU5TVEFOQ0UgPSBuZXcgRmF1eENhdGFsb2dTdHJhdGVneSgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJc3RhdGljIENhdGFsb2dTdHJhdGVneSBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBGYXV4Q2F0YWxvZ1N0cmF0ZWd5KCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgTGlzdDxTY2hlbWE+IGdldFNjaGVtYXMoRGF0YWJhc2UgZGF0YWJhc2UpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RmF1eENhdGFsb2coZGF0YWJhc2UuZ2V0Q2F0YWxvZ3MoKSkuZ2V0U2NoZW1hcygpOworCX0KKworCXByaXZhdGUgQ2F0YWxvZyBnZXRGYXV4Q2F0YWxvZyhMaXN0PENhdGFsb2c+IGNhdGFsb2dzKSB7CisJCWlmIChjYXRhbG9ncyA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisJCX0KKwkJaWYgKGNhdGFsb2dzLnNpemUoKSAhPSAxKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub3QgYSBzaW5nbGUgY2F0YWxvZzogIiArIGNhdGFsb2dzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCUNhdGFsb2cgY2F0YWxvZyA9IGNhdGFsb2dzLmdldCgwKTsKKwkJaWYgKGNhdGFsb2cuZ2V0TmFtZSgpLmxlbmd0aCgpICE9IDApIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlsbGVnYWwgbmFtZTogIiArIGNhdGFsb2cuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBjYXRhbG9nOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0ZvbGRpbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0ZvbGRpbmdTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MjdmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvRm9sZGluZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOworCisvKioKKyAqIEhhbmRsZSBkYXRhYmFzZS1zcGVjaWZpYyBpZGVudGlmaWVyLWZvbGRpbmcgaXNzdWVzLgorICovCitpbnRlcmZhY2UgRm9sZGluZ1N0cmF0ZWd5IHsKKworCS8qKgorCSAqIEZvbGQgdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqLworCVN0cmluZyBmb2xkKFN0cmluZyBuYW1lKTsKKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2Ugb2JqZWN0IG5hbWUgaXMgYWxyZWFkeSBmb2xkZWQsCisJICogbWVhbmluZywgaWYgaXQgaGFzIG5vIHNwZWNpYWwgY2hhcmFjdGVycywgaXQgcmVxdWlyZXMgbm8gZGVsaW1pdGVycy4KKwkgKi8KKwlib29sZWFuIG5hbWVJc0ZvbGRlZChTdHJpbmcgbmFtZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgZGF0YWJhc2UgaXMgY2FzZS1zZW5zaXRpdmUgd2hlbiB1c2luZyAibm9ybWFsIgorCSAqIChpLmUuIG5vbi1kZWxpbWl0ZWQpIGlkZW50aWZpZXJzLgorCSAqLworCWJvb2xlYW4gbm9ybWFsSWRlbnRpZmllcnNBcmVDYXNlU2Vuc2l0aXZlKCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9IU1FMREIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9IU1FMREIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWY1MWI3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0hTUUxEQi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7CisKK2NsYXNzIEhTUUxEQgorCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgSU5TVEFOQ0UgPSBuZXcgSFNRTERCKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlzdGF0aWMgVmVuZG9yIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEhTUUxEQigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKSB7CisJCXJldHVybiAiSFNRTERCIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBPdmVycmlkZQorCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7CisJCXJldHVybiBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7ICAvLyBub3QgdmVyaWZpZWQgeWV0Li4uCisJfQorCisJQE92ZXJyaWRlCisJRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOworCX0KKworCUBPdmVycmlkZQorCXZvaWQgYWRkRGVmYXVsdFNjaGVtYUlkZW50aWZpZXJzVG8oRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSwgQXJyYXlMaXN0PFN0cmluZz4gaWRlbnRpZmllcnMpIHsKKwkJaWRlbnRpZmllcnMuYWRkKFBVQkxJQ19TQ0hFTUFfSURFTlRJRklFUik7CisJfQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfU0NIRU1BX0lERU5USUZJRVIgPSAiUFVCTElDIjsgIC8vJE5PTi1OTFMtMSQKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0luZm9ybWl4LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvSW5mb3JtaXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDBjNGIyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0luZm9ybWl4LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOworCitjbGFzcyBJbmZvcm1peAorCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgSU5TVEFOQ0UgPSBuZXcgSW5mb3JtaXgoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXN0YXRpYyBWZW5kb3IgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgSW5mb3JtaXgoKSB7CisJCXN1cGVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCkgeworCQlyZXR1cm4gIkluZm9ybWl4IjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBPdmVycmlkZQorCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7CisJCXJldHVybiBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7ICAvLyBub3QgdmVyaWZpZWQgeWV0Li4uCisJfQorCisJQE92ZXJyaWRlCisJRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIExvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOworCX0KKworCUBPdmVycmlkZQorCWNoYXJbXSBnZXRFeHRlbmRlZE5vcm1hbE5hbWVTdGFydENoYXJhY3RlcnMoKSB7CisJCXJldHVybiBFWFRFTkRFRF9OT1JNQUxfTkFNRV9TVEFSVF9DSEFSQUNURVJTOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfTk9STUFMX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycgfTsKKworCUBPdmVycmlkZQorCWNoYXJbXSBnZXRFeHRlbmRlZE5vcm1hbE5hbWVQYXJ0Q2hhcmFjdGVycygpIHsKKwkJcmV0dXJuIEVYVEVOREVEX05PUk1BTF9OQU1FX1BBUlRfQ0hBUkFDVEVSUzsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX05PUk1BTF9OQU1FX1BBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnJCcgfTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0xvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL0xvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzM2M3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKKworLyoqCisgKiBGb2xkICJub3JtYWwiIGlkZW50aWZpZXJzIHRvIGxvd2VyIGNhc2UuCisgKiBJZ25vcmUgdGhlIGNhc2Ugb2YgIm5vcm1hbCIgaWRlbnRpZmllcnMuCisgKi8KK2NsYXNzIExvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneQorCWltcGxlbWVudHMgRm9sZGluZ1N0cmF0ZWd5Cit7CisKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBGb2xkaW5nU3RyYXRlZ3kgSU5TVEFOQ0UgPSBuZXcgTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5KCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlzdGF0aWMgRm9sZGluZ1N0cmF0ZWd5IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIExvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGZvbGQoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBuYW1lSXNGb2xkZWQoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ0lzTG93ZXJjYXNlKG5hbWUpOworCX0KKworCXB1YmxpYyBib29sZWFuIG5vcm1hbElkZW50aWZpZXJzQXJlQ2FzZVNlbnNpdGl2ZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBDbGFzc1Rvb2xzLnRvU3RyaW5nQ2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL01heERCLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTWF4REIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDA4MThjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL01heERCLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOworCitjbGFzcyBNYXhEQgorCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgSU5TVEFOQ0UgPSBuZXcgTWF4REIoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXN0YXRpYyBWZW5kb3IgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgTWF4REIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCkgeworCQlyZXR1cm4gIk1heERCIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBPdmVycmlkZQorCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7CisJCXJldHVybiBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7ICAvLyBub3QgdmVyaWZpZWQgeWV0Li4uCisJfQorCisJQE92ZXJyaWRlCisJRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOworCX0KKworCUBPdmVycmlkZQorCWNoYXJbXSBnZXRFeHRlbmRlZE5vcm1hbE5hbWVTdGFydENoYXJhY3RlcnMoKSB7CisJCXJldHVybiBFWFRFTkRFRF9OT1JNQUxfTkFNRV9TVEFSVF9DSEFSQUNURVJTOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfTk9STUFMX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnIycsICdAJywgJyQnIH07CisKKwlAT3ZlcnJpZGUKKwljaGFyW10gZ2V0RXh0ZW5kZWROb3JtYWxOYW1lUGFydENoYXJhY3RlcnMoKSB7CisJCXJldHVybiBFWFRFTkRFRF9OT1JNQUxfTkFNRV9QQVJUX0NIQVJBQ1RFUlM7CisJfQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9OT1JNQUxfTkFNRV9QQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJ18nIH07CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9NeVNRTC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL015U1FMLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyMzViOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9NeVNRTC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworCitjbGFzcyBNeVNRTAorCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgSU5TVEFOQ0UgPSBuZXcgTXlTUUwoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXN0YXRpYyBWZW5kb3IgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgTXlTUUwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCkgeworCQlyZXR1cm4gIk15U3FsIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRoZSBEVFAgbW9kZWwgZm9yIE15U1FMIGhhcyBhIGRhdGFiYXNlIHRoYXQgY29udGFpbnMgbm8gY2F0YWxvZ3M7CisJICogYnV0LCBpbnN0ZWFkLCBkaXJlY3RseSBob2xkcyBhIHNpbmdsZSBzY2hlbWEgd2l0aCB0aGUgc2FtZSBuYW1lIGFzCisJICogdGhlIGRhdGFiYXNlLiAoVGhpcyBpcyBoYXJkLWNvZGVkIGluIE15U3FsQ2F0YWxvZ0RhdGFiYXNlLmdldFNjaGVtYXMoKS4pCisJICogQWx0aG91Z2ggeW91IGNhbiBxdWFsaWZ5IGlkZW50aWZpZXJzIHdpdGggYSBkYXRhYmFzZSBuYW1lCisJICogaW4gTXlTUUwsIG9ubHkgdGhlIGRhdGFiYXNlIHNwZWNpZmllZCBhdCBsb2dpbiBzZWVtcyB0byBiZSBhdmFpbGFibGUKKwkgKiBpbiB0aGUgRFRQIG1vZGVsLi4uLgorCSAqIAorCSAqIE5COiBJbiBNeVNRTCBEREwsIFNDSEVNQSBpcyBhIHN5bm9ueW0gZm9yIERBVEFCQVNFOyBidXQgdGhlIEpEQkMKKwkgKiBtZXRob2QgRGF0YWJhc2VNZXRhRGF0YS5nZXRTY2hlbWFzKCkgcmV0dXJucyBhbiBlbXB0eSBsaXN0LAorCSAqIHdoaWxlIGdldENhdGFsb2dzKCkgcmV0dXJucyBhIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBkYXRhYmFzZXMuCisJICogWW91IGNhbiBhbHNvIHVzZSB0aGUgSkRCQyBtZXRob2QgQ29ubmVjdGlvbi5zZXRDYXRhbG9nKFN0cmluZykgdG8KKwkgKiBzZXQgdGhlIGRlZmF1bHQgZGF0YWJhc2UuCisJICovCisJQE92ZXJyaWRlCisJQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKKwkJcmV0dXJuIE5vQ2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogTXlTUUwgaXMgYSBiaXQgdW51c3VhbCwgc28gd2UgZm9yY2UgZXhhY3QgbWF0Y2hlcy4KKwkgKiAoZS5nLiBNeVNRTCBmb2xkcyBkYXRhYmFzZSBhbmQgdGFibGUgbmFtZXMgdG8gbG93ZXJjYXNlIG9uIFdpbmRvd3MKKwkgKiBieSBkZWZhdWx0OyBidXQgdGhhdCBkZWZhdWx0IGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZQorCSAqICdsb3dlcl9jYXNlX3RhYmxlX25hbWVzJyBzeXN0ZW0gdmFyaWFibGUuIFRoaXMgaXMgYmVjYXVzZSBkYXRhYmFzZXMgYXJlCisJICogc3RvcmVkIGFzIGRpcmVjdG9yaWVzIGFuZCB0YWJsZXMgYXJlIHN0b3JlZCBhcyBmaWxlcyBpbiB0aGUgdW5kZXJseWluZworCSAqIE8vUzsgYW5kIHRoZSBjYXNlLXNlbnNpdGl2aXR5IG9mIHRoZSBuYW1lcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBiZWhhdmlvcgorCSAqIG9mIGZpbGVuYW1lcyBvbiB0aGUgTy9TLiBUaGVuLCB0byBjb21wbGljYXRlIHRoaW5ncywKKwkgKiBub25lIG9mIHRoZSBvdGhlciBpZGVudGlmaWVycywgbGlrZSBpbmRleCBhbmQgY29sdW1uIG5hbWVzLCBhcmUgZm9sZGVkOworCSAqIGJ1dCB0aGV5IGFyZSBjYXNlLWluc2Vuc2l0aXZlLCB1bmxlc3MgZGVsaW1pdGVkLiBTZWUKKwkgKiBodHRwOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzUuMC9lbi9pZGVudGlmaWVyLWNhc2Utc2Vuc2l0aXZpdHkuaHRtbC4pCisJICovCisJQE92ZXJyaWRlCisJRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIE5vbkZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOworCX0KKworCUBPdmVycmlkZQorCXZvaWQgYWRkRGVmYXVsdFNjaGVtYUlkZW50aWZpZXJzVG8oRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSwgQXJyYXlMaXN0PFN0cmluZz4gaWRlbnRpZmllcnMpIHsKKwkJaWRlbnRpZmllcnMuYWRkKHRoaXMuY29udmVydE5hbWVUb0lkZW50aWZpZXIoZGF0YWJhc2UuZ2V0TmFtZSgpKSk7ICAvLyBobW1tLi4uIH5ianYKKwl9CisKKwkvKioKKwkgKiBNeVNRTCBpcyB0aGUgb25seSB2ZW5kb3IgdGhhdCBhbGxvd3MgYSBkaWdpdC4KKwkgKiBBbHRob3VnaCwgdGhlIG5hbWUgY2Fubm5vdCBiZSAqYWxsKiBkaWdpdHMuCisJICovCisJQE92ZXJyaWRlCisJYm9vbGVhbiBjaGFyYWN0ZXJJc05vcm1hbE5hbWVTdGFydChjaGFyIGMpIHsKKwkJcmV0dXJuIENoYXJhY3Rlci5pc0RpZ2l0KGMpIHx8IHN1cGVyLmNoYXJhY3RlcklzTm9ybWFsTmFtZVN0YXJ0KGMpOworCX0KKworCUBPdmVycmlkZQorCWNoYXJbXSBnZXRFeHRlbmRlZE5vcm1hbE5hbWVTdGFydENoYXJhY3RlcnMoKSB7CisJCXJldHVybiBFWFRFTkRFRF9OT1JNQUxfTkFNRV9TVEFSVF9DSEFSQUNURVJTOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfTk9STUFMX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycsICckJyB9OworCisJLyoqCisJICogQnkgZGVmYXVsdCwgTXlTUUwgZGVsaW1pdHMgaWRlbnRpZmllcnMgd2l0aCBiYWNrdGlja3MgKGApOyBidXQgaXQKKwkgKiBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHRvIHVzZSBkb3VibGUtcXVvdGVzLgorCSAqLworCUBPdmVycmlkZQorCWJvb2xlYW4gaWRlbnRpZmllcklzRGVsaW1pdGVkKFN0cmluZyBpZGVudGlmaWVyKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChpZGVudGlmaWVyLCBCQUNLVElDSykKKwkJCQkJfHwgc3VwZXIuaWRlbnRpZmllcklzRGVsaW1pdGVkKGlkZW50aWZpZXIpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEJBQ0tUSUNLID0gJ2AnOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTm9DYXRhbG9nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Ob0NhdGFsb2dTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZmI3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTm9DYXRhbG9nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYTsKKworLyoqCisgKiBDYXRhbG9nIHN0cmF0ZWd5IGZvciBEVFAgZGF0YWJhc2VzIHRoYXQgZG8gbm90IGhhdmUgY2F0YWxvZ3MKKyAqIChlLmcuIE15U1FMIHNlZSBidWcgMjQ5MDEzKS4KKyAqLworY2xhc3MgTm9DYXRhbG9nU3RyYXRlZ3kKKwlpbXBsZW1lbnRzIENhdGFsb2dTdHJhdGVneQoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIENhdGFsb2dTdHJhdGVneSBJTlNUQU5DRSA9IG5ldyBOb0NhdGFsb2dTdHJhdGVneSgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJc3RhdGljIENhdGFsb2dTdHJhdGVneSBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBOb0NhdGFsb2dTdHJhdGVneSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgTGlzdDxDYXRhbG9nPiBnZXRDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIExpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKERhdGFiYXNlIGRhdGFiYXNlKSB7CisJCXJldHVybiBkYXRhYmFzZS5nZXRTY2hlbWFzKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTm9uRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvTm9uRm9sZGluZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzYzFhZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Ob25Gb2xkaW5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOworCisvKioKKyAqIERvIG5vdCBmb2xkICJub3JtYWwiIGlkZW50aWZpZXJzLgorICogUmVzcGVjdCB0aGUgY2FzZSBvZiAibm9ybWFsIiBpZGVudGlmaWVycy4KKyAqLworY2xhc3MgTm9uRm9sZGluZ1N0cmF0ZWd5CisJaW1wbGVtZW50cyBGb2xkaW5nU3RyYXRlZ3kKK3sKKworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEZvbGRpbmdTdHJhdGVneSBJTlNUQU5DRSA9IG5ldyBOb25Gb2xkaW5nU3RyYXRlZ3koKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXN0YXRpYyBGb2xkaW5nU3RyYXRlZ3kgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgTm9uRm9sZGluZ1N0cmF0ZWd5KCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFNpbmNlIGlkZW50aWZpZXJzIGFyZSBub3QgZm9sZGVkIHRvIHVwcGVyLSBvciBsb3dlci1jYXNlLCB0aGUgbmFtZSBpcworCSAqIGFscmVhZHkgImZvbGRlZCIuCisJICovCisJcHVibGljIFN0cmluZyBmb2xkKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIFNpbmNlIGlkZW50aWZpZXJzIGFyZSBub3QgZm9sZGVkIHRvIHVwcGVyLSBvciBsb3dlci1jYXNlLCB0aGUgbmFtZSBpcworCSAqIGFscmVhZHkgImZvbGRlZCIuCisJICogKE5vbi1mb2xkaW5nIGRhdGFiYXNlcyBkbyBub3QgcmVxdWlyZSBkZWxpbWl0ZXJzIGFyb3VuZCBtaXhlZC1jYXNlCisJICogIm5vcm1hbCIgaWRlbnRpZmllcnMuKQorCSAqLworCXB1YmxpYyBib29sZWFuIG5hbWVJc0ZvbGRlZChTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBub3JtYWxJZGVudGlmaWVyc0FyZUNhc2VTZW5zaXRpdmUoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBDbGFzc1Rvb2xzLnRvU3RyaW5nQ2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL09yYWNsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL09yYWNsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMDRmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvT3JhY2xlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOworCitjbGFzcyBPcmFjbGUKKwlleHRlbmRzIEFic3RyYWN0VmVuZG9yCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVuZG9yIElOU1RBTkNFID0gbmV3IE9yYWNsZSgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJc3RhdGljIFZlbmRvciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBPcmFjbGUoKSB7CisJCXN1cGVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCkgeworCQlyZXR1cm4gIk9yYWNsZSI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAT3ZlcnJpZGUKKwlDYXRhbG9nU3RyYXRlZ3kgZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gRmF1eENhdGFsb2dTdHJhdGVneS5pbnN0YW5jZSgpOworCX0KKworCUBPdmVycmlkZQorCUZvbGRpbmdTdHJhdGVneSBnZXRGb2xkaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwljaGFyW10gZ2V0RXh0ZW5kZWROb3JtYWxOYW1lUGFydENoYXJhY3RlcnMoKSB7CisJCXJldHVybiBFWFRFTkRFRF9OT1JNQUxfTkFNRV9QQVJUX0NIQVJBQ1RFUlM7CisJfQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9OT1JNQUxfTkFNRV9QQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJ18nLCAnJCcsICcjJyB9OworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvUG9zdGdyZVNRTC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1Bvc3RncmVTUUwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWNhZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1Bvc3RncmVTUUwuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKKworY2xhc3MgUG9zdGdyZVNRTAorCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgSU5TVEFOQ0UgPSBuZXcgUG9zdGdyZVNRTCgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJc3RhdGljIFZlbmRvciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBQb3N0Z3JlU1FMKCkgeworCQlzdXBlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKKwkJcmV0dXJuICJwb3N0Z3JlcyI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBUaGUgUG9zdGdyZVNRTCBKREJDIGRyaXZlciByZXR1cm5zIGEgc2luZ2xlIGNhdGFsb2cgZnJvbSB0aGUgY2FsbCB0bworCSAqIERhdGFiYXNlTWV0YURhdGEuZ2V0Q2F0YWxvZ3MoKSB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZQorCSAqIGRhdGFiYXNlIGluaXRpYWxseSBzcGVjaWZpZWQgYnkgdGhlIGNvbm5lY3Rpb24gKGluIHRoZSBKREJDIFVSTCkuCisJICogRFRQIHVzZXMgdGhpcyBjb25maWd1cmF0aW9uIHVubW9kaWZpZWQuIFVuZm9ydHVuYXRlbHksIHRoZSBEVFAKKwkgKiBkYXRhYmFzZSdzIG5hbWUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBQb3N0Z3JlU1FMIGRhdGFiYXNlJ3MKKwkgKiBuYW1lLgorCSAqLworCUBPdmVycmlkZQorCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7CisJCXJldHVybiBTaW1wbGVDYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogVGhlIFBvc3RncmVTUUwgZGF0YWJhc2UgaG9sZHMgYSBzaW5nbGUgY2F0YWxvZyB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzCisJICogdGhlIGRhdGFiYXNlLgorCSAqLworCUBPdmVycmlkZQorCXZvaWQgYWRkRGVmYXVsdENhdGFsb2dJZGVudGlmaWVyc1RvKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUsIEFycmF5TGlzdDxTdHJpbmc+IGlkZW50aWZpZXJzKSB7CisJCWlkZW50aWZpZXJzLmFkZCh0aGlzLmJ1aWxkRGVmYXVsdENhdGFsb2dJZGVudGlmaWVyKGRhdGFiYXNlKSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWZhdWx0Q2F0YWxvZ0lkZW50aWZpZXIoRGF0YWJhc2UgZGF0YWJhc2UpIHsKKwkJcmV0dXJuIHRoaXMuY29udmVydE5hbWVUb0lkZW50aWZpZXIodGhpcy5idWlsZERlZmF1bHRDYXRhbG9nTmFtZShkYXRhYmFzZSkpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2dOYW1lKERhdGFiYXNlIGRhdGFiYXNlKSB7CisJCXJldHVybiAoKENhdGFsb2cpIGRhdGFiYXNlLmdldENhdGFsb2dzKCkuZ2V0KDApKS5nZXROYW1lKCk7CisJfQorCisJLyoqCisJICogUG9zdGdyZVNRTCBoYXMgYSAic2NoZW1hIHNlYXJjaCBwYXRoIi4gVGhlIGRlZmF1bHQgaXM6CisJICogICAgICIkdXNlciIscHVibGljCisJICogSWYgdGhlICIkdXNlciIgc2NoZW1hIGlzIG5vdCBmb3VuZCwgdXNlIHRoZSAicHVibGljIiBzY2hlbWEuCisJICovCisJQE92ZXJyaWRlCisJdm9pZCBhZGREZWZhdWx0U2NoZW1hSWRlbnRpZmllcnNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBpZGVudGlmaWVycykgeworCQlzdXBlci5hZGREZWZhdWx0U2NoZW1hSWRlbnRpZmllcnNUbyhkYXRhYmFzZSwgdXNlck5hbWUsIGlkZW50aWZpZXJzKTsKKwkJaWRlbnRpZmllcnMuYWRkKFBVQkxJQ19TQ0hFTUFfSURFTlRJRklFUik7CisJfQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfU0NIRU1BX0lERU5USUZJRVIgPSAicHVibGljIjsgIC8vJE5PTi1OTFMtMSQKKworCUBPdmVycmlkZQorCWNoYXJbXSBnZXRFeHRlbmRlZE5vcm1hbE5hbWVTdGFydENoYXJhY3RlcnMoKSB7CisJCXJldHVybiBFWFRFTkRFRF9OT1JNQUxfTkFNRV9TVEFSVF9DSEFSQUNURVJTOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfTk9STUFMX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycgfTsKKworCUBPdmVycmlkZQorCWNoYXJbXSBnZXRFeHRlbmRlZE5vcm1hbE5hbWVQYXJ0Q2hhcmFjdGVycygpIHsKKwkJcmV0dXJuIEVYVEVOREVEX05PUk1BTF9OQU1FX1BBUlRfQ0hBUkFDVEVSUzsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX05PUk1BTF9OQU1FX1BBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnJCcgfTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1NRTFNlcnZlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1NRTFNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZTU5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvU1FMU2VydmVyLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKKworY2xhc3MgU1FMU2VydmVyCisJZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBJTlNUQU5DRSA9IG5ldyBTUUxTZXJ2ZXIoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXN0YXRpYyBWZW5kb3IgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgU1FMU2VydmVyKCkgeworCQlzdXBlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKKwkJcmV0dXJuICJTUUwgU2VydmVyIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBPdmVycmlkZQorCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7CisJCXJldHVybiBTaW1wbGVDYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiBCeSBkZWZhdWx0LCBTUUwgU2VydmVyIGlkZW50aWZpZXJzIGFyZSBjYXNlLXNlbnNpdGl2ZSwgZXZlbiB3aXRob3V0CisJICogZGVsaW1pdGVycy4gVGhpcyBjYW4gZGVwZW5kIG9uIHRoZSBjb2xsYXRpb24gc2V0dGluZy4uLi4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgeworCQlyZXR1cm4gTm9uRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogU1FMIFNlcnZlciB3aWxsIHVzZSB0aGUgdXNlci1yZXF1ZXN0ZWQgZGF0YWJhc2U7IGlmIHRoYXQgZGF0YWJhc2UgaXMgbm90CisJICogZm91bmQsIGl0IHdpbGwgZGVmYXVsdCB0byAnbWFzdGVyJy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwl2b2lkIGFkZERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcnNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBpZGVudGlmaWVycykgeworCQlpZGVudGlmaWVycy5hZGQoZGF0YWJhc2UuZ2V0TmFtZSgpKTsKKwkJaWRlbnRpZmllcnMuYWRkKE1BU1RFUl9DQVRBTE9HX0lERU5USUZJRVIpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFTVEVSX0NBVEFMT0dfSURFTlRJRklFUiA9ICJtYXN0ZXIiOyAgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIGRlZmF1bHQgc2NoZW1hIG9uIFNRTCBTZXJ2ZXIgZm9yIGFueSBkYXRhYmFzZSAoY2F0YWxvZykgaXMgJ2RibycuCisJICovCisJQE92ZXJyaWRlCisJdm9pZCBhZGREZWZhdWx0U2NoZW1hSWRlbnRpZmllcnNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBpZGVudGlmaWVycykgeworCQlpZGVudGlmaWVycy5hZGQoREVGQVVMVF9TQ0hFTUFfSURFTlRJRklFUik7CisJfQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9JREVOVElGSUVSID0gImRibyI7ICAvLyROT04tTkxTLTEkCisKKwlAT3ZlcnJpZGUKKwljaGFyW10gZ2V0RXh0ZW5kZWROb3JtYWxOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgeworCQlyZXR1cm4gRVhURU5ERURfTk9STUFMX05BTUVfU1RBUlRfQ0hBUkFDVEVSUzsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX05PUk1BTF9OQU1FX1NUQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJ18nLCAnQCcsICcjJyB9OworCisJQE92ZXJyaWRlCisJY2hhcltdIGdldEV4dGVuZGVkTm9ybWFsTmFtZVBhcnRDaGFyYWN0ZXJzKCkgeworCQlyZXR1cm4gRVhURU5ERURfTk9STUFMX05BTUVfUEFSVF9DSEFSQUNURVJTOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfTk9STUFMX05BTUVfUEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICckJyB9OworCisJLyoqCisJICogQnkgZGVmYXVsdCwgU1FMIFNlcnZlciBkZWxpbWl0cyBpZGVudGlmaWVycyB3aXRoIGJyYWNrZXRzIChbXSk7IGJ1dCBpdAorCSAqIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGRvdWJsZS1xdW90ZXMuCisJICovCisJQE92ZXJyaWRlCisJYm9vbGVhbiBpZGVudGlmaWVySXNEZWxpbWl0ZWQoU3RyaW5nIGlkZW50aWZpZXIpIHsKKwkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKGlkZW50aWZpZXIpCisJCQkJCXx8IHN1cGVyLmlkZW50aWZpZXJJc0RlbGltaXRlZChpZGVudGlmaWVyKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9TaW1wbGVDYXRhbG9nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9TaW1wbGVDYXRhbG9nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTFhMDQxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1NpbXBsZUNhdGFsb2dTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hOworCisvKioKKyAqIENhdGFsb2cgc3RyYXRlZ3kgZm9yIERUUCBkYXRhYmFzZXMgdGhhdCBzaW1wbHkgbW9kZWwgdGhlIGNhdGFsb2dzIHJldHVybmVkCisgKiBieSB0aGUgdW5kZXJseWluZyBKREJDIGRyaXZlciAoZS5nLiBTeWJhc2UpLgorICogQHNlZSBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldENhdGFsb2dzKCkKKyAqLworY2xhc3MgU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5CisJaW1wbGVtZW50cyBDYXRhbG9nU3RyYXRlZ3kKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDYXRhbG9nU3RyYXRlZ3kgSU5TVEFOQ0UgPSBuZXcgU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5KCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlzdGF0aWMgQ2F0YWxvZ1N0cmF0ZWd5IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIFNpbXBsZUNhdGFsb2dTdHJhdGVneSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7CisJCXJldHVybiBkYXRhYmFzZS5nZXRDYXRhbG9ncygpOworCX0KKworCXB1YmxpYyBMaXN0PFNjaGVtYT4gZ2V0U2NoZW1hcyhEYXRhYmFzZSBkYXRhYmFzZSkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvU3liYXNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvU3liYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5NWQyMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9TeWJhc2UuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKKworY2xhc3MgU3liYXNlCisJZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgoreworCXByaXZhdGUgZmluYWwgU3RyaW5nIGR0cFZlbmRvck5hbWU7CisKKwlzdGF0aWMgZmluYWwgVmVuZG9yIEFTQSA9IG5ldyBTeWJhc2UoIlN5YmFzZV9BU0EiKTsgLy8kTk9OLU5MUy0xJAorCXN0YXRpYyBmaW5hbCBWZW5kb3IgQVNFID0gbmV3IFN5YmFzZSgiU3liYXNlX0FTRSIpOyAvLyROT04tTkxTLTEkCisKKwlzdGF0aWMgVmVuZG9yIGFzYSgpIHsKKwkJcmV0dXJuIEFTQTsKKwl9CisKKwlzdGF0aWMgVmVuZG9yIGFzZSgpIHsKKwkJcmV0dXJuIEFTRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgb25seSBzdGF0aWMgaW5zdGFuY2VzLgorCSAqLworCXByaXZhdGUgU3liYXNlKFN0cmluZyBkdHBWZW5kb3JOYW1lKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZHRwVmVuZG9yTmFtZSA9IGR0cFZlbmRvck5hbWU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5kdHBWZW5kb3JOYW1lOworCX0KKworCUBPdmVycmlkZQorCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7CisJCXJldHVybiBTaW1wbGVDYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiBCeSBkZWZhdWx0LCBTeWJhc2UgaWRlbnRpZmllcnMgYXJlIGNhc2Utc2Vuc2l0aXZlLCBldmVuIHdpdGhvdXQKKwkgKiBkZWxpbWl0ZXJzLiBUaGlzIGNhbiBkZXBlbmQgb24gdGhlIGNvbGxhdGlvbiBzZXR0aW5nLi4uLgorCSAqLworCUBPdmVycmlkZQorCUZvbGRpbmdTdHJhdGVneSBnZXRGb2xkaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBOb25Gb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiBTeWJhc2Ugd2lsbCB1c2UgdGhlIHVzZXItcmVxdWVzdGVkIGRhdGFiYXNlOyBpZiB0aGF0IGRhdGFiYXNlIGlzIG5vdAorCSAqIGZvdW5kLCBpdCB3aWxsIGRlZmF1bHQgdG8gJ21hc3RlcicuCisJICovCisJQE92ZXJyaWRlCisJdm9pZCBhZGREZWZhdWx0Q2F0YWxvZ0lkZW50aWZpZXJzVG8oRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSwgQXJyYXlMaXN0PFN0cmluZz4gaWRlbnRpZmllcnMpIHsKKwkJaWRlbnRpZmllcnMuYWRkKGRhdGFiYXNlLmdldE5hbWUoKSk7CisJCWlkZW50aWZpZXJzLmFkZChNQVNURVJfQ0FUQUxPR19JREVOVElGSUVSKTsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BU1RFUl9DQVRBTE9HX0lERU5USUZJRVIgPSAibWFzdGVyIjsgIC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSB0eXBpY2FsIGRlZmF1bHQgc2NoZW1hIG9uIFN5YmFzZSBmb3IgYW55IGRhdGFiYXNlIChjYXRhbG9nKSBpcworCSAqICdkYm8nLgorCSAqIAorCSAqIEFjdHVhbGx5LCB0aGUgZGVmYXVsdCBzY2hlbWEgaXMgbW9yZSBsaWtlIGEgc2VhcmNoIHBhdGg6CisJICogVGhlIHNlcnZlciBsb29rcyBmb3IgYSBzY2hlbWEgb2JqZWN0IChlLmcuIGEgdGFibGUpIGZpcnN0IGluIHRoZSB1c2VyJ3MKKwkgKiBzY2hlbWEsIHRoZW4gaXQgbG9va3MgZm9yIHRoZSBzY2hlbWEgb2JqZWN0IGluIHRoZSBkYXRhYmFzZSBvd25lcidzCisJICogc2NoZW1hIChkYm8pLiBBcyBhIHJlc3VsdCwgaXQncyByZWFsbHkgbm90IHBvc3NpYmxlIHRvIHNwZWNpZnkKKwkgKiB0aGUgImRlZmF1bHQiIHNjaGVtYSB3aXRob3V0IGtub3dpbmcgdGhlIHNjaGVtYSBvYmplY3Qgd2UgYXJlCisJICogbG9va2luZyBmb3IuCisJICogCisJICogKE5vdGU6IHRoZSBjdXJyZW50ICd1c2VyJyBpcyBub3QgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGN1cnJlbnQKKwkgKiAnbG9naW4nIC0gc2VlIHNwX2FkZHVzZXIgYW5kIHNwX2FkZGxvZ2luOyBzbyB3ZSBwcm9iYWJseSBjYW4ndAorCSAqIHVzZSBDb25uZWN0aW9uUHJvZmlsZSNnZXRVc2VyTmFtZSgpLikKKwkgKi8KKwlAT3ZlcnJpZGUKKwl2b2lkIGFkZERlZmF1bHRTY2hlbWFJZGVudGlmaWVyc1RvKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUsIEFycmF5TGlzdDxTdHJpbmc+IGlkZW50aWZpZXJzKSB7CisJCWlkZW50aWZpZXJzLmFkZChERUZBVUxUX1NDSEVNQV9JREVOVElGSUVSKTsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0NIRU1BX0lERU5USUZJRVIgPSAiZGJvIjsgIC8vJE5PTi1OTFMtMSQKKworCUBPdmVycmlkZQorCWNoYXJbXSBnZXRFeHRlbmRlZE5vcm1hbE5hbWVTdGFydENoYXJhY3RlcnMoKSB7CisJCXJldHVybiBFWFRFTkRFRF9OT1JNQUxfTkFNRV9TVEFSVF9DSEFSQUNURVJTOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfTk9STUFMX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycsICdAJyB9OworCisJQE92ZXJyaWRlCisJY2hhcltdIGdldEV4dGVuZGVkTm9ybWFsTmFtZVBhcnRDaGFyYWN0ZXJzKCkgeworCQlyZXR1cm4gRVhURU5ERURfTk9STUFMX05BTUVfUEFSVF9DSEFSQUNURVJTOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfTk9STUFMX05BTUVfUEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICckJywgJ6UnLCAnoycsICcjJyB9OworCisJLyoqCisJICogQnkgZGVmYXVsdCwgU3liYXNlIGRlbGltaXRzIGlkZW50aWZpZXJzIHdpdGggYnJhY2tldHMgKFtdKTsgYnV0IGl0CisJICogY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byB1c2UgZG91YmxlLXF1b3Rlcy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlib29sZWFuIGlkZW50aWZpZXJJc0RlbGltaXRlZChTdHJpbmcgaWRlbnRpZmllcikgeworCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQoaWRlbnRpZmllcikKKwkJCQkJfHwgc3VwZXIuaWRlbnRpZmllcklzRGVsaW1pdGVkKGlkZW50aWZpZXIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1Vua25vd25DYXRhbG9nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Vbmtub3duQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5YTcyOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9Vbmtub3duQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE7CisKKy8qKgorICogQ2F0YWxvZyBzdHJhdGVneSBmb3IgdW5rbm93biBEVFAgZGF0YWJhc2VzLgorICogQHNlZSBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldENhdGFsb2dzKCkKKyAqLworY2xhc3MgVW5rbm93bkNhdGFsb2dTdHJhdGVneQorCWltcGxlbWVudHMgQ2F0YWxvZ1N0cmF0ZWd5Cit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2F0YWxvZ1N0cmF0ZWd5IElOU1RBTkNFID0gbmV3IFVua25vd25DYXRhbG9nU3RyYXRlZ3koKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXN0YXRpYyBDYXRhbG9nU3RyYXRlZ3kgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgVW5rbm93bkNhdGFsb2dTdHJhdGVneSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7CisJCUxpc3Q8Q2F0YWxvZz4gY2F0YWxvZ3MgPSBkYXRhYmFzZS5nZXRDYXRhbG9ncygpOworCQlpZiAoKGNhdGFsb2dzID09IG51bGwpIHx8IGNhdGFsb2dzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHRoaXMuZ2V0RmF1eENhdGFsb2coY2F0YWxvZ3MpID09IG51bGw7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIExpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpIHsKKwkJTGlzdDxDYXRhbG9nPiBjYXRhbG9ncyA9IGRhdGFiYXNlLmdldENhdGFsb2dzKCk7CisJCS8vIGlmIHRoZXJlIGFyZSBubyBjYXRhbG9ncywgdGhlIGRhdGFiYXNlIG11c3QgaG9sZCB0aGUgc2NoZW1hdGEgZGlyZWN0bHkKKwkJaWYgKChjYXRhbG9ncyA9PSBudWxsKSB8fCBjYXRhbG9ncy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwkJfQorCisJCUNhdGFsb2cgZmF1eENhdGFsb2cgPSB0aGlzLmdldEZhdXhDYXRhbG9nKGNhdGFsb2dzKTsKKwkJcmV0dXJuIChmYXV4Q2F0YWxvZyA9PSBudWxsKSA/IGNhdGFsb2dzIDogQ29sbGVjdGlvbnMuPENhdGFsb2c+ZW1wdHlMaXN0KCk7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIExpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKERhdGFiYXNlIGRhdGFiYXNlKSB7CisJCUxpc3Q8Q2F0YWxvZz4gY2F0YWxvZ3MgPSBkYXRhYmFzZS5nZXRDYXRhbG9ncygpOworCQkvLyBpZiB0aGVyZSBhcmUgbm8gY2F0YWxvZ3MsIHRoZSBkYXRhYmFzZSBtdXN0IGhvbGQgdGhlIHNjaGVtYXRhIGRpcmVjdGx5CisJCWlmICgoY2F0YWxvZ3MgPT0gbnVsbCkgfHwgY2F0YWxvZ3MuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gZGF0YWJhc2UuZ2V0U2NoZW1hcygpOworCQl9CisKKwkJQ2F0YWxvZyBmYXV4Q2F0YWxvZyA9IHRoaXMuZ2V0RmF1eENhdGFsb2coY2F0YWxvZ3MpOworCQlyZXR1cm4gKGZhdXhDYXRhbG9nICE9IG51bGwpID8gZmF1eENhdGFsb2cuZ2V0U2NoZW1hcygpIDogQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJfQorCisJcHJpdmF0ZSBDYXRhbG9nIGdldEZhdXhDYXRhbG9nKExpc3Q8Q2F0YWxvZz4gY2F0YWxvZ3MpIHsKKwkJaWYgKGNhdGFsb2dzLnNpemUoKSA9PSAxKSB7CisJCQlDYXRhbG9nIGNhdGFsb2cgPSBjYXRhbG9ncy5nZXQoMCk7CisJCQlpZiAoY2F0YWxvZy5nZXROYW1lKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIGNhdGFsb2c7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvVW5yZWNvZ25pemVkVmVuZG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvVW5yZWNvZ25pemVkVmVuZG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3NTEyMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9VbnJlY29nbml6ZWRWZW5kb3IuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC52ZW5kb3I7CisKKy8qKgorICogCisgKi8KK2NsYXNzIFVucmVjb2duaXplZFZlbmRvcgorCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgSU5TVEFOQ0UgPSBuZXcgVW5yZWNvZ25pemVkVmVuZG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlzdGF0aWMgVmVuZG9yIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIFVucmVjb2duaXplZFZlbmRvcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKSB7CisJCXJldHVybiAiVW5yZWNvZ25pemVkIFZlbmRvciI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBOb3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmUuLi4uCisJICogQXNzdW1lIHRoZSBEVFAgZGF0YWJhc2UgaXMgb3JnYW5pemVkIGludG8gb25lIG9yIG1vcmUgY2F0YWxvZ3MgYW5kCisJICogdGhlIHNjaGVtYXRhIGFyZSBjb250YWluZWQgYnkgdGhvc2UgY2F0YWxvZ3MuIFRoaXMgYXBwZWFycyB0byBiZSB0aGUKKwkgKiBkZWZhdWx0IHdheSBEVFAgYnVpbGRzIG1vZGVscyB0aGVzZSBkYXlzIChpLmUuIGEgZGF0YWJhc2Ugd2l0aCBhdAorCSAqIGxlYXN0IG9uZSBjYXRhbG9nLCBpbnN0ZWFkIG9mIHRoZSBkYXRhYmFzZSBob2xkaW5nIHNjaGVtYXRhCisJICogZGlyZWN0bHkpLgorCSAqLworCUBPdmVycmlkZQorCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7CisJCXJldHVybiBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7CisJfQorCisJQE92ZXJyaWRlCisJRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1VwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1VwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OGQ0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKKworLyoqCisgKiBGb2xkICJub3JtYWwiIGlkZW50aWZpZXJzIHRvIHVwcGVyIGNhc2UuCisgKiBJZ25vcmUgdGhlIGNhc2Ugb2YgIm5vcm1hbCIgaWRlbnRpZmllcnMuCisgKi8KK2NsYXNzIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneQorCWltcGxlbWVudHMgRm9sZGluZ1N0cmF0ZWd5Cit7CisKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBGb2xkaW5nU3RyYXRlZ3kgSU5TVEFOQ0UgPSBuZXcgVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5KCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlzdGF0aWMgRm9sZGluZ1N0cmF0ZWd5IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGZvbGQoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIG5hbWUudG9VcHBlckNhc2UoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBuYW1lSXNGb2xkZWQoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ0lzVXBwZXJjYXNlKG5hbWUpOworCX0KKworCXB1YmxpYyBib29sZWFuIG5vcm1hbElkZW50aWZpZXJzQXJlQ2FzZVNlbnNpdGl2ZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBDbGFzc1Rvb2xzLnRvU3RyaW5nQ2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1ZlbmRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvdmVuZG9yL1ZlbmRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3M2Q3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvVmVuZG9yLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwudmVuZG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYTsKKworLyoqCisgKiBEZWxlZ2F0ZSB2ZW5kb3Itc3BlY2lmaWMgYmVoYXZpb3IgdG8gaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlOgorICogICAtIGNhdGFsb2cgc3VwcG9ydAorICogICAtIGRlZmF1bHQgY2F0YWxvZyBhbmQgc2NoZW1hCisgKiAgIC0gY29udmVydGluZyBuYW1lcyB0byBpZGVudGlmaWVycyBhbmQgdmljZS12ZXJzYQorICogCisgKiBOb3RlOgorICogV2UgdXNlICJuYW1lIiB3aGVuIGRlYWxpbmcgd2l0aCB0aGUgdW5tb2RpZmllZCBuYW1lIG9mIGEgZGF0YWJhc2Ugb2JqZWN0CisgKiBhcyBzdXBwbGllZCBieSB0aGUgZGF0YWJhc2UgaXRzZWxmIChpLmUuIGl0IGlzIG5vdCBkZWxpbWl0ZWQgYW5kIGl0IGlzIGFsd2F5cworICogY2FzZS1zZW5zaXRpdmUpLgorICogV2UgdXNlICJpZGVudGlmaWVyIiB3aGVuIGRlYWxpbmcgd2l0aCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGRhdGFiYXNlCisgKiBvYmplY3QgbmFtZSAoaS5lLiBpdCBtYXkgYmUgZGVsaW1pdGVkIGFuZCwgZGVwZW5kaW5nIG9uIHRoZSB2ZW5kb3IsIGl0IG1heQorICogYmUgY2FzZS1pbnNlbnNpdGl2ZSkuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVmVuZG9yIHsKKworCS8qKgorCSAqIFRoaXMgbXVzdCBtYXRjaCB0aGUgRFRQIHZlbmRvciBuYW1lLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlI2dldFZlbmRvcigpCisJICovCisJU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSB2ZW5kb3Igc3VwcG9ydHMgInJlYWwiIGNhdGFsb2dzIChlLmcuIFN5YmFzZSkuCisJICovCisJYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlJ3MgY2F0YWxvZ3MuCisJICovCisJTGlzdDxDYXRhbG9nPiBnZXRDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBkYXRhYmFzZSdzIGRlZmF1bHQgY2F0YWxvZyBpZGVudGlmaWVycyBmb3IgdGhlCisJICogc3BlY2lmaWVkIHVzZXIuCisJICovCisJTGlzdDxTdHJpbmc+IGdldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcnMoRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBkYXRhYmFzZSdzIHNjaGVtYXMuCisJICovCisJTGlzdDxTY2hlbWE+IGdldFNjaGVtYXMoRGF0YWJhc2UgZGF0YWJhc2UpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UncyBkZWZhdWx0IHNjaGVtYSBpZGVudGlmaWVycyBmb3IgdGhlCisJICogc3BlY2lmaWVkIHVzZXIuCisJICovCisJTGlzdDxTdHJpbmc+IGdldERlZmF1bHRTY2hlbWFJZGVudGlmaWVycyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lKTsKKworCS8qKgorCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBkYXRhYmFzZSBvYmplY3QgbmFtZSB0byBhIHZlbmRvciBpZGVudGlmaWVyLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBpZGVudGlmaWVyIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBkZWZhdWx0IG5hbWUuCisJICovCisJU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdE5hbWUpOworCisJLyoqCisJICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCBuYW1lIHRvIGEgdmVuZG9yIGlkZW50aWZpZXIuCisJICovCisJU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lKTsKKworCS8qKgorCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBkYXRhYmFzZSBvYmplY3QgaWRlbnRpZmllciB0byBhIHZlbmRvciBuYW1lLgorCSAqLworCVN0cmluZyBjb252ZXJ0SWRlbnRpZmllclRvTmFtZShTdHJpbmcgaWRlbnRpZmllcik7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL3ZlbmRvci9WZW5kb3JSZXBvc2l0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvVmVuZG9yUmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OGYwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC92ZW5kb3IvVmVuZG9yUmVwb3NpdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLnZlbmRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitwdWJsaWMgY2xhc3MgVmVuZG9yUmVwb3NpdG9yeSB7CisJcHJpdmF0ZSBmaW5hbCBWZW5kb3JbXSB2ZW5kb3JzOworCisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVuZG9yUmVwb3NpdG9yeSBJTlNUQU5DRSA9IG5ldyBWZW5kb3JSZXBvc2l0b3J5KCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFZlbmRvclJlcG9zaXRvcnkgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgVmVuZG9yUmVwb3NpdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy52ZW5kb3JzID0gdGhpcy5idWlsZFZlbmRvcnMoKTsKKwl9CisKKwlwcml2YXRlIFZlbmRvcltdIGJ1aWxkVmVuZG9ycygpIHsKKwkJQXJyYXlMaXN0PFZlbmRvcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8VmVuZG9yPigpOworCQl0aGlzLmFkZFZlbmRvcnNUbyhsaXN0KTsKKwkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgVmVuZG9yW2xpc3Quc2l6ZSgpXSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFZlbmRvcnNUbyhBcnJheUxpc3Q8VmVuZG9yPiBsaXN0KSB7CisJCXRoaXMuYWRkVmVuZG9yVG8oREIyLnVkYigpLCBsaXN0KTsKKwkJdGhpcy5hZGRWZW5kb3JUbyhEQjIudWRiSVNlcmllcygpLCBsaXN0KTsKKwkJdGhpcy5hZGRWZW5kb3JUbyhEQjIudWRiWlNlcmllcygpLCBsaXN0KTsKKwkJdGhpcy5hZGRWZW5kb3JUbyhEZXJieS5pbnN0YW5jZSgpLCBsaXN0KTsKKwkJdGhpcy5hZGRWZW5kb3JUbyhIU1FMREIuaW5zdGFuY2UoKSwgbGlzdCk7CisJCXRoaXMuYWRkVmVuZG9yVG8oSW5mb3JtaXguaW5zdGFuY2UoKSwgbGlzdCk7CisJCXRoaXMuYWRkVmVuZG9yVG8oTWF4REIuaW5zdGFuY2UoKSwgbGlzdCk7CisJCXRoaXMuYWRkVmVuZG9yVG8oTXlTUUwuaW5zdGFuY2UoKSwgbGlzdCk7CisJCXRoaXMuYWRkVmVuZG9yVG8oT3JhY2xlLmluc3RhbmNlKCksIGxpc3QpOworCQl0aGlzLmFkZFZlbmRvclRvKFBvc3RncmVTUUwuaW5zdGFuY2UoKSwgbGlzdCk7CisJCXRoaXMuYWRkVmVuZG9yVG8oU1FMU2VydmVyLmluc3RhbmNlKCksIGxpc3QpOworCQl0aGlzLmFkZFZlbmRvclRvKFN5YmFzZS5hc2EoKSwgbGlzdCk7CisJCXRoaXMuYWRkVmVuZG9yVG8oU3liYXNlLmFzZSgpLCBsaXN0KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkVmVuZG9yVG8oVmVuZG9yIHZlbmRvciwgQXJyYXlMaXN0PFZlbmRvcj4gbGlzdCkgeworCQlTdHJpbmcgbmFtZSA9IHZlbmRvci5nZXREVFBWZW5kb3JOYW1lKCk7CisJCWZvciAoSXRlcmF0b3I8VmVuZG9yPiBzdHJlYW0gPSBsaXN0Lml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJaWYgKHN0cmVhbS5uZXh0KCkuZ2V0RFRQVmVuZG9yTmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkR1cGxpY2F0ZSB2ZW5kb3I6ICIgKyBuYW1lKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWxpc3QuYWRkKHZlbmRvcik7CisJfQorCisJcHVibGljIFZlbmRvciBnZXRWZW5kb3IoU3RyaW5nIGR0cFZlbmRvck5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IHRoaXMudmVuZG9ycy5sZW5ndGg7IGktLSA+IDA7KSB7CisJCQlWZW5kb3IgdmVuZG9yID0gdGhpcy52ZW5kb3JzW2ldOworCQkJaWYgKHZlbmRvci5nZXREVFBWZW5kb3JOYW1lKCkuZXF1YWxzKGR0cFZlbmRvck5hbWUpKSB7CisJCQkJcmV0dXJuIHZlbmRvcjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gVW5yZWNvZ25pemVkVmVuZG9yLmluc3RhbmNlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNjcwZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzA0ZTEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXI7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwMS5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5oZWxwO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Fib3V0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5ODEyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MTAgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5BYm91dCB0aGlzIGNvbnRlbnQ8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJBYm91dCB0aGlzIGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPjxhIGlkPSJzdGhyZWYyNTYiIG5hbWU9InN0aHJlZjI1NiI+PC9hPgotPGgxPkFib3V0IHRoaXMgY29udGVudDwvaDE+Ci08cD5KYW51YXJ5LCAyMDA4PC9wPgotPGEgaWQ9InN0aHJlZjI1NyIgbmFtZT0ic3RocmVmMjU3Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkxpY2Vuc2U8L3A+Ci08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+PC9jb2RlPi4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT48L2NvZGU+LjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5ODEyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjEwIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+QWJvdXQgdGhpcyBjb250ZW50PC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQWJvdXQgdGhpcyBjb250ZW50IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjU2IiBuYW1lPSJzdGhyZWYyNTYiPjwvYT4KLTxoMT5BYm91dCB0aGlzIGNvbnRlbnQ8L2gxPgotPHA+SmFudWFyeSwgMjAwODwvcD4KLTxhIGlkPSJzdGhyZWYyNTciIG5hbWU9InN0aHJlZjI1NyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5MaWNlbnNlPC9wPgotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPjwvY29kZT4uIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+PC9jb2RlPi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlY2Q3NTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gY2hlYXRzaGVldHMvLFwKLSAgICAgICAgICAgICAgIGRjb21tb24vLFwKLSAgICAgICAgICAgICAgIGltZy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb25jZXB0X21hcHBpbmcuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRzLmh0bSxcCi0gICAgICAgICAgICAgICBjb25jZXB0czAwMS5odG0sXAotICAgICAgICAgICAgICAgY29uY2VwdHMwMDIuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRzMDAzLmh0bSxcCi0gICAgICAgICAgICAgICBjb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkLmh0bSxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIGdldHRpbmdfc3RhcnRlZDAwMi5odG0sXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkMDAzLmh0bSxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIGluZGV4LnhtbCxcCi0gICAgICAgICAgICAgICBsZWdhbC5odG0sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICByZWZfZGV0YWlsc19vcm0uaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9qcGFfZmFjZXQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9uZXdfanBhX3Byb2plY3QuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wcmltYXJ5X2tleS5odG0sXAotICAgICAgICAgICAgICAgcmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwMi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDAzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwNS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA2Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwOC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTAuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxMS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDEyLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTMuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxNC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE1Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTYuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxNy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE4Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0sXAotICAgICAgICAgICAgICAgdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0sXAotICAgICAgICAgICAgICAgdGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0sXAotICAgICAgICAgICAgICAgdGFza19pbmhlcml0YW5jZS5odG0sXAotICAgICAgICAgICAgICAgdGFza19tYW5hZ2Vfb3JtLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0sXAotICAgICAgICAgICAgICAgdGFza19tYXBwaW5nLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrcy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDAyLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwMy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA1Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwNi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDcuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA4Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwOS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTAuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDExLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxMi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTMuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE0Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxNS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTYuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE3Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxOC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTkuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDIwLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAyMS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjIuaHRtLFwKLSAgICAgICAgICAgICAgIHRpcHNfYW5kX3RyaWNrcy5odG0sXAotICAgICAgICAgICAgICAgdG9jLnhtbCxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwMS5odG0sXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3MDAyLmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDMuaHRtLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTkuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyMC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDIxLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjIuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyMy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyNi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI3Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjguaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAzMC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMzEuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAzMi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDMzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMzQuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDIzLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAyNC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjUuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwNC5odG0sXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3MDA1Lmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDYuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwNy5odG0sXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3MDA4Lmh0bQotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9hZGRfcGVyc2lzdGVuY2UueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL2FkZF9wZXJzaXN0ZW5jZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmVlZGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL2FkZF9wZXJzaXN0ZW5jZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoZWF0c2hlZXQgdGl0bGU9IkNyZWF0ZSBhIEpQQSBQcm9qZWN0Ij4KLSAgIDxpbnRybyBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi1jaGVhdHNoZWV0cy5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGF1dG9tYXRpY2FsbHkgbGF1bmNoIHdpemFyZHMsIHBlcmZvcm0gYWN0aW9ucywgYW5kIGd1aWRlIHlvdSB0aHJvdWdoIHRoZSBzdGVwcyB0byBjcmVhdGUgYSBKUEEgcHJvamVjdC4gCi0KLVRvIGxlYXJuIG1vcmUgYWJvdXQgdXNpbmcgY2hlYXQgc2hlZXRzLCBvciB0byBzZWUgYSBsaXN0IG9mIGF2YWlsYWJsZSBjaGVhdCBzaGVldHMsIGNsaWNrIEhlbHAgKD8pLiAKLVRvIHN0YXJ0IHdvcmsgd29ya2luZyBvbiB0aGlzIGNoZWF0IHNoZWV0IGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBCZWdpbiZxdW90OyBidXR0b24gYmVsb3cuIAotCi1MZXQmYXBvcztzIGdldCBzdGFydGVkIQotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaW50cm8+Ci0gICA8aXRlbSB0aXRsZT0iU2V0dXAgdGhlIEVudmlyb25tZW50IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJ0cnVlIiBocmVmPSIvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmRvYy51c2VyL2NfZGF0YWJhc2VfZGV2ZWxvcG1lbnRfc2V0dXAuaHRtbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBZb3VyIGVudmlyb25tZW50IG11c3QgYmUgc2V0IHVwIGJlZm9yZSB5b3UgY2FuIHBlcmZvcm0gdGhlIHN0ZXBzIGluIHRoaXMgY2hlYXQgc2hlZXQuIAotCi1DcmVhdGUgYSBkYXRhYmFzZSBwcm9maWxlIGFuZCBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLQotVGhlIERhdGFiYXNlIENvbm5lY3Rpb24gZGlhbG9nIGF1dG9tYXRpY2FsbHkgYXBwZWFycyB3aGVuIHlvdSBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24uCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGNvbW1hbmQgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLnNxbGVkaXRvci5hdHRhY2hQcm9maWxlQWN0aW9uIiBjb25maXJtPSJmYWxzZSI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgSlBBIFByb2plY3QiIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIiBocmVmPSIvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBVc2UgdGhlIE5ldyBQcm9qZWN0IFdpemFyZCB0byBjcmVhdGUgYSBKUEEgcHJvamVjdC4gCi1TZWxlY3QgPGI+RmlsZS0mZ3Q7TmV3LSZndDtQcm9qZWN0Li4uPC9iPiBhbmQgY2hvb3NlIDxiPkpQQS0mZ3Q7SlBBIFByb2plY3Q8L2I+IGluIHRoZSBsaXN0LiAKLQotT24gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHdpemFyZCwgZW50ZXIgYSBwcm9qZWN0IG5hbWUgYW5kIGxvY2F0aW9uLCBzZWxlY3QgeW91ciB0YXJnZXQgcnVudGltZSwgYW5kIHNlbGVjdCBhIHByZWRlZmluZWQgcHJvamVjdCBjb25maWd1cmF0aW9uLgotCi1DbGljayA8Yj5OZXh0PC9iPiB0byBkaXNwbGF5IHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIHdpemFyZC4KLQotVGhlICZxdW90O05ldyBKUEEgUHJvamVjdCZxdW90OyB3aXphcmQgaXMgYXV0b21hdGljYWxseSBkaXNwbGF5ZWQgd2hlbiB5b3UgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIFBlcmZvcm0mcXVvdDsgYnV0dG9uLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLk9wZW5Qcm9qZWN0V2l6YXJkQWN0aW9uIiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UuamR0LnVpIiBjb25maXJtPSJmYWxzZSI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJTZWxlY3QgUHJvamVjdCBGYWNldCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvcGgtcHJvamVjdHMuaHRtbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBVc2UgdGhlIFByb2plY3QgRmFjZXQgcGFnZSB0byBzZWxlY3QgYSBwcmVkZWZpbmVkIHByb2plY3QgY29uZmlndXJhdGlvbiBvciBzcGVjaWZpYyBzcGVjaWZpYyBmYWNldHMgdG8gaW5jbHVkZSBpbiB0aGUgcHJvamVjdC4gCi0KLUNsaWNrICZxdW90O05leHQmcXVvdDsgdG8gZGlzcGxheSB0aGUgbmV4dCBwYWdlIG9mIHRoZSB3aXphcmQuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IlNwZWNpZnkgdGhlIEpQQSBGYWNldCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qZHQuZG9jLnVzZXIvcmVmX2pwYV9mYWNldC5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVXNlIHRoZSBKUEEgRmFjZXQgcGFnZSB0byBzcGVjaWZ5IHRoZSB0aGUgdmVuZG9yLXNwZWNpZmljIEpQQSBwbGF0Zm9ybSwgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gdXNlLCBhbmQgdGhlIHNwZWNpZmljIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LiAKLQotWW91IGNhbiBhbHNvIHNwZWNpZnkgaWYgRGFsaSBzaG91bGQgY3JlYXRlIGFuIG9ybS54bWwgZmlsZS4KLQotSWYgeW91IGRvIG5vdCBoYXZlIGFuIGFjdGl2ZSBkYXRhYmFzZSBjb25uZWN0aW9uLCBjbGljayA8Yj5BZGQgQ29ubmVjdGlvbnM8L2I+IHRvIGNyZWF0ZSBvbmUuIAotCi1JZiB5b3UgZG8gbm90IGhhdmUgYSBkZWZpbmVkIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LCBjbGljayA8Yj5Db25maWd1cmUgZGVmYXVsdCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeTwvYj4gb3IgPGI+Q29uZmlndXJlIHVzZXIgbGlicmFyaWVzPC9iPiB0byBkZWZpbmUgb25lLiAKLQotQ2xpY2sgPGI+RmluaXNoPC9iPiB0byBjb21wbGV0ZSB0aGUgd2l6YXJkIGFuZCBvcGVuIHRoZSBvcGVuIHRoZSBwcm9qZWN0LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJGaW5pc2giIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYSBKUEEgcHJvamVjdC4gQ29tcGxldGUgdGhlIGFkZGl0aW9uYWwgY2hlYXQgc2hlZXRzIHRvIGFkZCBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgYW5kIG1hcCB0aG9zZSBlbnRpdGllcyB0byBkYXRhYmFzZSB0YWJsZXMuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZV9lbnRpdHkueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZV9lbnRpdHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjRlOGFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGVfZW50aXR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hlYXRzaGVldCB0aXRsZT0iQ3JlYXRlIGEgUGVyc2lzdGVudCBFbnRpdHkiPgotCTxpbnRybyBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi1jaGVhdHNoZWV0cy5odG0iPgotCQk8ZGVzY3JpcHRpb24+Ci1UaGlzIGNoZWF0IHNoZWV0IHdpbGwgYXV0b21hdGljYWxseSBsYXVuY2ggd2l6YXJkcywgcGVyZm9ybSBhY3Rpb25zLCBhbmQgZ3VpZGUgeW91IHRocm91Z2ggdGhlIHN0ZXBzIHRvIGFkZCBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgdG8geW91ciBKYXZhIHByb2plY3QuIAotVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyBjaGVhdCBzaGVldHMgb3IgdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgY2hlYXQgc2hlZXRzLCBjbGljayBIZWxwICg/KS4gCi1UbyBzdGFydCB3b3JrIHdvcmtpbmcgb24gdGhpcyBjaGVhdCBzaGVldCwgY2xpY2sgdGhlIDxiPkNsaWNrIHRvIEJlZ2luPC9iPiBidXR0b24gYmVsb3cuIAotTGV0J3MgZ2V0IHN0YXJ0ZWQhCi0gIDwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQk8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgSlBBIFByb2plY3QiIHNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+Ci1UbyBjcmVhdGUgYSBQZXJzaXN0ZW50IGVudGl0eSwgeW91IG11c3QgY3JlYXRlIGEgSlBBIHByb2plY3QuIElmIHlvdSBhbHJlYWR5IGhhdmUgYSBKUEEgcHJvamVjdCwgeW91IG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgIkNsaWNrIHRvIFNraXAiIGJ1dHRvbi4KLUlmIG5vdCwgc2VsZWN0IDxiPkZpbGUtPk5ldy0+UHJvamVjdC4uLjwvYj4gYW5kIGNob29zZSA8Yj5KUEEtPkpQQSBQcm9qZWN0PC9iPiBpbiB0aGUgbGlzdC4gQ29tcGxldGUgZWFjaCBwYWdlIG9mIHRoZSBDcmVhdGUgSlBBIFByb2plY3Qgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBKUEEgcHJvamVjdC4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJPcGVuIHRoZSBKUEEgRGV2ZWxvcG1lbnQgUGVyc3BlY3RpdmUiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSI+Ci0JCTxhY3Rpb24gcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzIiBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY2hlYXRzaGVldHMuYWN0aW9ucy5PcGVuUGVyc3BlY3RpdmUiIHBhcmFtMT0ib3JnLmVjbGlwc2UuanB0LnVpLlBlcnNpc3RlbmNlUGVyc3BlY3RpdmUiLz4KLQkJPGRlc2NyaXB0aW9uPgotV2hlbiB3b3JraW5nIHdpdGggSlBBICBwZXJzaXN0ZW5jZSwgeW91IHNob3VsZCB1c2UgdGhlIFBlcnNpc3RlbmNlIHBlcnNwZWN0aXZlLiBJZiB5b3UgYWxyZWFkeSBoYXZlIHRoZSBQZXJzaXN0ZW5jZSBwZXJzcGVjdGl2ZSBhY3RpdmUsIHlvdSBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlICJDbGljayB0byBTa2lwIiBidXR0b24uIAotSWYgbm90LCBzZWxlY3QgPGI+V2luZG93LT5PcGVuIFBlcnNwZWN0aXZlLT5PdGhlcjwvYj4gaW4gdGhlIG1lbnViYXIgYXQgdGhlIHRvcCBvZiB0aGUgd29ya2JlbmNoLiBJbiB0aGUgU2VsZWN0IFBlcnNwZWN0aXZlcyBkaWFsb2csIHNlbGVjdCA8Yj5KUEEgRGV2ZWxvcG1lbnQ8L2I+IGFuZCBjbGljayBPSy4gVGhpcyBzdGVwIGNoYW5nZXMgdGhlIHBlcnNwZWN0aXZlIHRvIHNldCB1cCB0aGUgRWNsaXBzZSB3b3JrYmVuY2ggZm9yIEpQQSBkZXZlbG9wbWVudC4KLVlvdSBjYW4gY2xpY2sgdGhlICJDbGljayB0byBQZXJmb3JtIiBidXR0b24gdG8gaGF2ZSB0aGUgIlBlcnNpc3RlbmNlIiBwZXJzcGVjdGl2ZSBvcGVuZWQgYXV0b21hdGljYWxseS4KLSAgIDwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJDcmVhdGUgYSBKYXZhIENsYXNzIj4KLQkJPGRlc2NyaXB0aW9uPgotVGhlIG5leHQgc3RlcCBpcyB0byBjcmVhdGUgYSBuZXcgSmF2YSBjbGFzcy4gSW4gdGhlIG1haW4gdG9vbGJhciBhZ2FpbiwgY2xpY2sgb24gPGI+TmV3IEphdmEgQ2xhc3M8L2I+IGJ1dHRvbiAob3IgdGhlIGxpbmsgYmVsb3cpLgotVGhlIEphdmEgZWRpdG9yIHdpbGwgYXV0b21hdGljYWxseSBvcGVuIHNob3dpbmcgeW91ciBuZXcgY2xhc3MuICAgICAgCi0gICAgIDwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJDcmVhdGUgYSBQZXJzaXN0ZW50IEVudGl0eSI+Ci0JCTxkZXNjcmlwdGlvbj4KLUZpbmFsbHkgd2Ugd2lsbCBtYWtlIHRoZSBKYXZhIGNsYXNzIGEgcGVyc2lzdGVudCBlbnRpdHkuCi1JbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3IHNlbGVjdCB0aGUgSmF2YSBjbGFzcy4gCi1JbiB0aGUgSlBBIERldGFpbHMgdmlldywgdXNlIHRoZSAiTWFwIEFzIiBmaWVsZCB0byBzZWxlY3QgPGI+RW50aXR5PC9iPi4gRGFsaSBhdXRvbWF0aWNhbGx5IGFkZHMgdGhlIEBFbnRpdHkgYW5ub3RhdGlvbiB0byB0aGUgY2xhc3MgaW4gdGhlIEphdmEgZWRpdG9yLiAKLVVzZSB0aGUgVGFibGUsIENhdGFsb2csIGFuZCBTY2hlbWEgZmllbGRzIHRvIGFzc29jaWF0ZSB0aGUgZW50aXR5IHdpdGggYSBzcGVjaWZpYyB0YWJsZSBpbiB0aGUgZGF0YWJhc2UuCi0gICAgIDwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJGaW5pc2giPgotCQk8ZGVzY3JpcHRpb24+Ci1Db25ncmF0dWxhdGlvbnMhIFlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBhZGRlZCBhIEpQQSBlbnRpdHkgdG8geW91ciBKUEEgcHJvamVjdC4gQ29tcGxldGUgdGhlIGFkZGl0aW9uYWwgY2hlYXQgc2hlZXRzIHRvIG1hcCB0aGUgZW50aXR5J3MgZmllbGRzIHRvIGRhdGFiYXNlIHRhYmxlcy4KLSAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvbWFwX2VudGl0eS54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvbWFwX2VudGl0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMzA3ZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL21hcF9lbnRpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGVhdHNoZWV0IHRpdGxlPSJNYXAgYSBKYXZhIFBlcnNpc3RlbnQgRW50aXR5Ij4KLSAgIDxpbnRybyBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi1jaGVhdHNoZWV0cy5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGF1dG9tYXRpY2FsbHkgbGF1bmNoIHdpemFyZHMsIHBlcmZvcm0gYWN0aW9ucywgYW5kIGd1aWRlIHlvdSB0aHJvdWdoIHRoZSBzdGVwcyB0byBtYXAgdGhlIGZpZWxkcyBvZiBhIEpQQSBlbnRpdHkgZW50aXR5IHRvIHlvdXIgZGF0YWJhc2UuCi0KLVRvIGxlYXJuIG1vcmUgYWJvdXQgdXNpbmcgY2hlYXQgc2hlZXRzIG9yIHRvIHNlZSBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNoZWF0IHNoZWV0cywgY2xpY2sgSGVscCAoPykuIAotVG8gc3RhcnQgd29yayB3b3JraW5nIG9uIHRoaXMgY2hlYXQgc2hlZXQsIGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBCZWdpbiZxdW90OyBidXR0b24gYmVsb3cuIAotCi1MZXQmYXBvcztzIGdldCBzdGFydGVkIQotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaW50cm8+Ci0gICA8aXRlbSB0aXRsZT0iU2V0dXAgdGhlIEVudmlyb25tZW50IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJ0cnVlIiBocmVmPSIvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmRvYy51c2VyL2NfZGF0YWJhc2VfZGV2ZWxvcG1lbnRfc2V0dXAuaHRtbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBZb3VyIGVudmlyb25tZW50IG11c3QgYmUgc2V0IHVwIGJlZm9yZSB5b3UgY2FuIHBlcmZvcm0gdGhlIHN0ZXBzIGluIHRoaXMgY2hlYXQgc2hlZXQuIAotCi1DcmVhdGUgYSBkYXRhYmFzZSBwcm9maWxlIGFuZCBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLQotSWYgeW91IGFscmVhZHkgaGF2ZSAoYW5kIGFyZSBjb25uZWN0ZWQgdG8pIGEgZGF0YWJhc2UgY29ubmVjdGlvbiwgeW91ICBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlICZxdW90O0NsaWNrIHRvIFNraXAmcXVvdDsgYnV0dG9uLgotCi1UaGUgRGF0YWJhc2UgQ29ubmVjdGlvbiBkaWFsb2cgYXV0b21hdGljYWxseSBhcHBlYXJzIHdoZW4geW91IGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBQZXJmb3JtJnF1b3Q7IGJ1dHRvbi4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8Y29tbWFuZCBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuc3FsZWRpdG9yLmF0dGFjaFByb2ZpbGVBY3Rpb24iIGNvbmZpcm09ImZhbHNlIj4KLSAgICAgIDwvY29tbWFuZD4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJDcmVhdGUgYSBKUEEgUHJvamVjdCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0idHJ1ZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVXNlIHRoZSBOZXcgUHJvamVjdCBXaXphcmQgdG8gY3JlYXRlIGEgSlBBIHByb2plY3QuIAotU2VsZWN0IDxiPkZpbGUtJmd0O05ldy0mZ3Q7UHJvamVjdC4uLjwvYj4gYW5kIGNob29zZSA8Yj5KUEEtJmd0O0pQQSBQcm9qZWN0PC9iPiBpbiB0aGUgbGlzdC4gCi0KLUNvbXBsZXRlIGVhY2ggcGFnZSBvZiB0aGUgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBKUEEgcHJvamVjdC4KLQotVGhlICZxdW90O05ldyBKUEEgUHJvamVjdCZxdW90OyB3aXphcmQgaXMgYXV0b21hdGljYWxseSBkaXNwbGF5ZWQgd2hlbiB5b3UgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIFBlcmZvcm0mcXVvdDsgYnV0dG9uLgotCi1JZiB5b3UgYWxyZWFkeSBoYXZlIGEgSlBBIHByb2plY3QsIHlvdSAgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtDbGljayB0byBTa2lwJnF1b3Q7IGJ1dHRvbi4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8YWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5PcGVuUHJvamVjdFdpemFyZEFjdGlvbiIgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLmpkdC51aSIgY29uZmlybT0iZmFsc2UiPgotICAgICAgPC9hY3Rpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iT3BlbiB0aGUgSlBBIERldmVsb3BtZW50IFBlcnNwZWN0aXZlIiBkaWFsb2c9ImZhbHNlIiBza2lwPSJ0cnVlIiBocmVmPSIvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgV2hlbiB3b3JraW5nIHdpdGggSlBBICBwZXJzaXN0ZW5jZSwgeW91IHNob3VsZCB1c2UgdGhlIFBlcnNpc3RlbmNlIHBlcnNwZWN0aXZlLiBJZiB5b3UgYWxyZWFkeSBoYXZlIHRoZSBQZXJzaXN0ZW5jZSBwZXJzcGVjdGl2ZSBhY3RpdmUsIHlvdSBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlICZxdW90O0NsaWNrIHRvIFNraXAmcXVvdDsgYnV0dG9uLiAKLUlmIG5vdCwgc2VsZWN0IDxiPldpbmRvdy0mZ3Q7T3BlbiBQZXJzcGVjdGl2ZS0mZ3Q7T3RoZXI8L2I+IGluIHRoZSBtZW51YmFyIGF0IHRoZSB0b3Agb2YgdGhlIHdvcmtiZW5jaC4gSW4gdGhlIFNlbGVjdCBQZXJzcGVjdGl2ZXMgZGlhbG9nLCBzZWxlY3QgPGI+SlBBIERldmVsb3BtZW50PC9iPiBhbmQgY2xpY2sgT0suIFRoaXMgc3RlcCBjaGFuZ2VzIHRoZSBwZXJzcGVjdGl2ZSB0byBzZXQgdXAgdGhlIEVjbGlwc2Ugd29ya2JlbmNoIGZvciBKUEEgZGV2ZWxvcG1lbnQuCi1Zb3UgY2FuIGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBQZXJmb3JtJnF1b3Q7IGJ1dHRvbiB0byBoYXZlIHRoZSAmcXVvdDtQZXJzaXN0ZW5jZSZxdW90OyBwZXJzcGVjdGl2ZSBvcGVuZWQgYXV0b21hdGljYWxseS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8YWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jaGVhdHNoZWV0cy5hY3Rpb25zLk9wZW5QZXJzcGVjdGl2ZSIgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzIiBjb25maXJtPSJmYWxzZSIgcGFyYW0xPSJvcmcuZWNsaXBzZS5qcHQudWkuUGVyc2lzdGVuY2VQZXJzcGVjdGl2ZSI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJDcmVhdGUgYSBKYXZhIENsYXNzIiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGUgbmV4dCBzdGVwIGlzIHRvIGNyZWF0ZSBhIG5ldyBKYXZhIGNsYXNzLiBJbiB0aGUgbWFpbiB0b29sYmFyIGFnYWluLCBjbGljayBvbiA8Yj5OZXcgSmF2YSBDbGFzczwvYj4gYnV0dG9uIChvciB0aGUgbGluayBiZWxvdykuCi1UaGUgSmF2YSBlZGl0b3Igd2lsbCBhdXRvbWF0aWNhbGx5IG9wZW4gc2hvd2luZyB5b3VyIG5ldyBjbGFzcy4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgUGVyc2lzdGVudCBFbnRpdHkiIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIEZpbmFsbHkgd2Ugd2lsbCBtYWtlIHRoZSBKYXZhIGNsYXNzIGEgcGVyc2lzdGVudCBlbnRpdHkuCi1JbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3IHNlbGVjdCB0aGUgSmF2YSBjbGFzcy4gCi1JbiB0aGUgSlBBIERldGFpbHMgdmlldywgdXNlIHRoZSAmcXVvdDtNYXAgQXMmcXVvdDsgZmllbGQgdG8gc2VsZWN0IDxiPkVudGl0eTwvYj4uIERhbGkgYXV0b21hdGljYWxseSBhZGRzIHRoZSBARW50aXR5IGFubm90YXRpb24gdG8gdGhlIGNsYXNzIGluIHRoZSBKYXZhIGVkaXRvci4gCi1Vc2UgdGhlIFRhYmxlLCBDYXRhbG9nLCBhbmQgU2NoZW1hIGZpZWxkcyB0byBhc3NvY2lhdGUgdGhlIGVudGl0eSB3aXRoIGEgc3BlY2lmaWMgdGFibGUgaW4gdGhlIGRhdGFiYXNlLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJBZGQgRmllbGRzIHRvIHRoZSBDbGFzcyIgZGlhbG9nPSJmYWxzZSIgc2tpcD0idHJ1ZSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBOb3cgeW91IHdpbGwgYWRkIHNvbWUgZmllbGRzIHRvIHRoZSBlbnRpdHkgdG8gbWFwIHRvIHJvd3MgaW4gdGhlIGRhdGFiYXNlIHRhYmxlLiAgIAotCi1JZiB5b3VyIHBlcnNpc3RlbnQgZW50aXR5IGFscmVhZHkgaGFzIGZpZWxkcyB0byBtYXAsIHlvdSBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlICZxdW90O0NsaWNrIHRvIFNraXAmcXVvdDsgYnV0dG9uLiBJZiBub3QsIHVzZSB0aGUgSmF2YSBlZGl0b3IgdG8gYWRkIGZpZWxkcyB0byB0aGUgZW50aXR5LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLmFjdGlvbnMuT3BlblBlcnNwZWN0aXZlIiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiIGNvbmZpcm09ImZhbHNlIiBwYXJhbTE9Im9yZy5lY2xpcHNlLmRhbGkudWkuUGVyc2lzdGVuY2VQZXJzcGVjdGl2ZSI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJDcmVhdGUgdGhlIE1hcHBpbmciIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIiBocmVmPSIvb3JnLmVjbGlwc2UuZGFsaS5kb2MudXNlci9yZWZfZW50aXR5X3BhZ2UuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIE5vdyB5b3UgYXJlIHJlYWR5IHRvIG1hcCB0aGUgZW50aXR5IGZpZWxkcyB0byBjb2x1bW5zIGluIHRoZSBkYXRhYmFzZSB0YWJsZS4gSW4gdGhlIFBhY2thZ2UgRXhwbG9yZXIsIHNlbGVjdCB0aGUgSmF2YSBjbGFzcy4gCi0KLUluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcsIGV4cGFuZCB0aGUgcGVyc2lzdGVudCBlbnRpdHkgdG8gZGlzcGxheSB0aGUgZmllbGRzLiBTZWxlY3QgYSBmaWVsZC4gCi0KLVRoZSBKUEEgRGV0YWlscyB2aWV3IGRpc3BsYXlzIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGZpZWxkLiBVc2UgdGhlIE1hcCBBcyBmaWVsZCB0byBzZWxlY3QgdGhlIEJhc2ljIG1hcHBpbmcuIFVzZSB0aGUgQ29sdW1uIGZpZWxkIHRvIHNlbGVjdCBhIGNvbHVtbiBmcm9tIHRoZSBkYXRhYmFzZSB0YWJsZS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8YWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jaGVhdHNoZWV0cy5hY3Rpb25zLk9wZW5QZXJzcGVjdGl2ZSIgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzIiBjb25maXJtPSJmYWxzZSIgcGFyYW0xPSJvcmcuZWNsaXBzZS5kYWxpLnVpLlBlcnNpc3RlbmNlUGVyc3BlY3RpdmUiPgotICAgICAgPC9hY3Rpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iRmluaXNoIiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBDb25ncmF0dWxhdGlvbnMhIFlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBtYXBwZWQgdGhlIGZpZWxkcyBmcm9tIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB0byBhIGNvbHVtbiBpbiBhIGRhdGFiYXNlIHRhYmxlLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0X21hcHBpbmcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfbWFwcGluZy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmY2VhZGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfbWFwcGluZy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowMiAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkJESkZJIiBuYW1lPSJCQUJCREpGSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj4KLTxoMT5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxOCIgbmFtZT0ic3RocmVmMTgiPjwvYT48YSBpZD0ic3RocmVmMTkiIG5hbWU9InN0aHJlZjE5Ij48L2E+VGhlIERhbGkgT1IgKG9iamVjdC1yZWxhdGlvbmFsKSBNYXBwaW5nIFRvb2wgYWxsb3dzIHlvdSB0byBkZXNjcmliZSBob3cgeW91ciBlbnRpdHkgb2JqZWN0cyA8c3BhbiBjbGFzcz0iaXRhbGljIj5tYXA8L3NwYW4+IHRvIHRoZSBkYXRhIHNvdXJjZSAob3Igb3RoZXIgb2JqZWN0cykuIFRoaXMgYXBwcm9hY2ggaXNvbGF0ZXMgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gZnJvbSB0aGUgb2JqZWN0IG1vZGVsJm5kYXNoO2RldmVsb3BlcnMgYXJlIGZyZWUgdG8gZGVzaWduIHRoZWlyIGlkZWFsIG9iamVjdCBtb2RlbCwgYW5kIERCQXMgYXJlIGZyZWUgdG8gZGVzaWduIHRoZWlyIGlkZWFsIHNjaGVtYS48L3A+Ci08cD5UaGVzZSBtYXBwaW5ncyB0cmFuc2Zvcm0gYW4gb2JqZWN0IGRhdGEgbWVtYmVyIHR5cGUgdG8gYSBjb3JyZXNwb25kaW5nIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGF0YSBzb3VyY2UgcmVwcmVzZW50YXRpb24uIFRoZXNlIE9SIG1hcHBpbmdzIGNhbiBhbHNvIHRyYW5zZm9ybSBvYmplY3QgZGF0YSBtZW1iZXJzIHRoYXQgcmVmZXJlbmNlIG90aGVyIGRvbWFpbiBvYmplY3RzIHN0b3JlZCBpbiBvdGhlciB0YWJsZXMgaW4gdGhlIGRhdGFiYXNlIGFuZCBhcmUgcmVsYXRlZCB0aHJvdWdoIGZvcmVpZ24ga2V5cy48L3A+Ci08cD5Zb3UgY2FuIHVzZSB0aGVzZSBtYXBwaW5ncyB0byBtYXAgc2ltcGxlIGRhdGEgdHlwZXMgaW5jbHVkaW5nIHByaW1pdGl2ZXMgKHN1Y2ggYXMgPGNvZGU+aW50PC9jb2RlPiksIEpESyBjbGFzc2VzIChzdWNoIGFzIDxjb2RlPlN0cmluZzwvY29kZT4pLCBhbmQgbGFyZ2Ugb2JqZWN0IChMT0IpIHZhbHVlcy4gWW91IGNhbiBhbHNvIHVzZSB0aGVtIHRvIHRyYW5zZm9ybSBvYmplY3QgZGF0YSBtZW1iZXJzIHRoYXQgcmVmZXJlbmNlIG90aGVyIGRvbWFpbiBvYmplY3RzIGJ5IHdheSBvZiBhc3NvY2lhdGlvbiB3aGVyZSBkYXRhIHNvdXJjZSByZXByZXNlbnRhdGlvbnMgcmVxdWlyZSBvYmplY3QgaWRlbnRpdHkgbWFpbnRlbmFuY2UgKHN1Y2ggYXMgc2VxdWVuY2luZyBhbmQgYmFjayByZWZlcmVuY2VzKSBhbmQgcG9zc2VzcyB2YXJpb3VzIHR5cGVzIG9mIG11bHRpcGxpY2l0eSBhbmQgbmF2aWdhYmlsaXR5LiBUaGUgYXBwcm9wcmlhdGUgbWFwcGluZyBjbGFzcyBpcyBjaG9zZW4gcHJpbWFyaWx5IGJ5IHRoZSBjYXJkaW5hbGl0eSBvZiB0aGUgcmVsYXRpb25zaGlwLjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMTY2MjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfcGVyc2lzdGVuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDIgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQ0FISUMiIG5hbWU9IkJBQkNBSElDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTYiIG5hbWU9InN0aHJlZjE2Ij48L2E+PHNwYW4gY2xhc3M9Iml0YWxpYyI+UGVyc2lzdGVuY2U8L3NwYW4+IHJlZmVycyB0byB0aGUgYWJpbGl0eSB0byBzdG9yZSBvYmplY3RzIGluIGEgZGF0YWJhc2UgYW5kIHVzZSB0aG9zZSBvYmplY3RzIHdpdGggdHJhbnNhY3Rpb25hbCBpbnRlZ3JpdHkuIEluIGEgSjJFRSBhcHBsaWNhdGlvbiwgZGF0YSBpcyB0eXBpY2FsbHkgc3RvcmVkIGFuZCBwZXJzaXN0ZWQgaW4gdGhlIGRhdGEgdGllciwgaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlLjwvcD4KLTxwPjxhIGlkPSJzdGhyZWYxNyIgbmFtZT0ic3RocmVmMTciPjwvYT48c3BhbiBjbGFzcz0iaXRhbGljIj5FbnRpdHkgYmVhbnM8L3NwYW4+IGFyZSBlbnRlcnByaXNlIGJlYW5zIHRoYXQgY29udGFpbiBwZXJzaXN0ZW50IGRhdGEgYW5kIHRoYXQgY2FuIGJlIHNhdmVkIGluIHZhcmlvdXMgcGVyc2lzdGVudCBkYXRhIHN0b3Jlcy4gVGhlIGVudGl0eSBiZWFucyByZXByZXNlbnQgZGF0YSBmcm9tIGEgZGF0YWJhc2U7IGVhY2ggZW50aXR5IGJlYW4gY2FycmllcyBpdHMgb3duIGlkZW50aXR5LiBFbnRpdHkgYmVhbnMgY2FuIGJlIGRlcGxveWVkIHVzaW5nIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmFwcGxpY2F0aW9uLW1hbmFnZWQgcGVyc2lzdGVuY2U8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlPC9zcGFuPi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0cy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOThlNTRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0cy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowMiAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkNvbmNlcHRzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIENvbmNlcHRzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjE1IiBuYW1lPSJzdGhyZWYxNSI+PC9hPjwvcD4KLTxoMT5Db25jZXB0czwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgYW4gb3ZlcnZpZXcgb2YgY29uY2VwdHMgeW91IHNob3VsZCBiZSBmYW1pbGlhciB3aXRoIHdoZW4gdXNpbmcgRGFsaSB0byBjcmVhdGUgbWFwcGluZ3MgZm9yIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcy48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPkluIGFkZGl0aW9uIHRvIHRoZXNlIHNlY3Rpb25zLCB5b3Ugc2hvdWxkIHJldmlldyB0aGUgZm9sbG93aW5nIHJlc291cmNlcyBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbjo8L3A+Ci08dWw+Ci08bGk+Ci08cD5FY2xpcHNlIERhbGkgcHJvamVjdDogPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGk8L2E+PC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSBwcm9qZWN0OiA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzPC9hPjwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+SlNSIDIyMCBFSkIgMy4wIHNwZWNpZmljYXRpb246IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTIyMCI+aHR0cDovL3d3dy5qY3Aub3JnL2VuL2pzci9kZXRhaWw/aWQ9MjIwPC9hPjwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWFjZDkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowMiAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJCR0ZKRyIgbmFtZT0iQkFCQkdGSkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9oMT4KLTxwPlRoZSBKYXZhIDIgRW50ZXJwcmlzZSBFZGl0aW9uKEoyRUUpIEVudGVycHJpc2UgSmF2YUJlYW5zIChFSkIpIGFyZSBhIGNvbXBvbmVudCBhcmNoaXRlY3R1cmUgdGhhdCB5b3UgdXNlIHRvIGRldmVsb3AgYW5kIGRlcGxveSBvYmplY3Qtb3JpZW50ZWQsIGRpc3RyaWJ1dGVkLCBlbnRlcnByaXNlLXNjYWxlIGFwcGxpY2F0aW9ucy4gQW4gYXBwbGljYXRpb24gd3JpdHRlbiBhY2NvcmRpbmcgdG8gdGhlIEVudGVycHJpc2UgSmF2YUJlYW5zIGFyY2hpdGVjdHVyZSBpcyBzY2FsYWJsZSwgdHJhbnNhY3Rpb25hbCwgYW5kIHNlY3VyZS48L3A+Ci08cD5UaGUgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBpbXByb3ZlcyB0aGUgRUpCIGFyY2hpdGVjdHVyZSBieSByZWR1Y2luZyBpdHMgY29tcGxleGl0eSB0aHJvdWdoIHRoZSB1c2Ugb2YgbWV0YWRhdGEgKGFubm90YXRpb25zKSBhbmQgc3BlY2lmeWluZyBwcm9ncmFtbWF0aWMgZGVmYXVsdHMgb2YgdGhhdCBtZXRhZGF0YS48L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODlkOTg4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowMyAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSERIQUdJSCIgbmFtZT0iQ0hESEFHSUgiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPjxhIGlkPSJzdGhyZWYyMCIgbmFtZT0ic3RocmVmMjAiPjwvYT5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2gxPgotPHA+VGhlIEpQQSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHRoZSB1c2Ugb2YgYSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgZm9yIGRlcGxveW1lbnQuIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBkYXRhYmFzZSBhbmQgZW50aXR5IG1hbmFnZXIgb3B0aW9ucywgYW5kIG1heSBjb250YWluIG1vcmUgdGhhbiBvbmUgcGVyc2lzdGVuY2UgdW5pdC4gVG8gZW5hYmxlIHlvdSB0byBlYXNpbHkgZWRpdCB0aGlzIGluZm9ybWF0aW9uLCBEYWxpIHByb3ZpZGVzIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgdGhlIEVjbGlwc2UgWE1MIEVkaXRvciB0byBjcmVhdGUgYW5kIG1haW50YWluIHRoaXMgaW5mb3JtYXRpb24uIFNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPiJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1UbyB3b3JrIHdpdGggbXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdHMsIGNvbW1lbnQgb3V0IGFsbCBidXQgb25lIHBlcnNpc3RlbmNlIHVuaXQgaW4gPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGJlY2E2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowMyAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlRoZSBvcm0ueG1sIGZpbGU8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJUaGUgb3JtLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNIREJJSkFDIiBuYW1lPSJDSERCSUpBQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjIxIiBuYW1lPSJzdGhyZWYyMSI+PC9hPlRoZSBvcm0ueG1sIGZpbGU8L2gxPgotPHA+QWx0aG91Z2ggdGhlIEpQQSBzcGVjaWZpY2F0aW9uIGVtcGhhc2l6ZXMgdGhlIHVzZSBvZiBhbm5vdGF0aW9ucyB0byBzcGVjaWZ5IHBlcnNpc3RlbmNlLCB5b3UgY2FuIGFsc28gdXNlIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIHRvIHN0b3JlIHRoaXMgbWV0YWRhdGEuIERhbGkgZW5hYmxlcyB5b3UgdG8gY3JlYXRlIGEgc3R1YiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIGZvciBhIEpQQSBwcm9qZWN0IHVzaW5nIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDUuaHRtI0NJQUlKQ0NFIj5NYXBwaW5nIEZpbGUgV2l6YXJkPC9hPi4gU2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPiJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgbWV0YWRhdGEgbXVzdCBtYXRjaCB0aGUgWFNEIHNwZWNpZmljYXRpb24gb2YgeW91ciBzZWxlY3RlZCBKUEEgaW1wbGVtZW50YXRpb24uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08cD5EYWxpIHByb3ZpZGVzIGNvbXByZWhlbnNpdmUgc3VwcG9ydCBmb3IgY29uZmlndXJpbmcgWE1MIG1hcHBpbmcgZmlsZXMgdGhyb3VnaCB0aGUgPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPiB0aGF0IGlzIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIGFubm90YXRpb24tYmFzZWQgY29uZmlndXJhdGlvbiBpbiB0aGUgSmF2YSBzb3VyY2UuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gYWxzbyB1c2UgdGhlIEVjbGlwc2UgWE1MIEVkaXRvciB0byBjcmVhdGUgYW5kIG1haW50YWluIHRoZSBtZXRhZGF0YSBpbmZvcm1hdGlvbiBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLURhbGkgd29ya3MgZXhjbHVzaXZlbHkgd2l0aCBYTUwgbWFwcGluZyBmaWxlcyBuYW1lZCA8Y29kZT5vcm0ueG1sPC9jb2RlPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPjxiciAvPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29udGV4dHMueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkZTBlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08Y29udGV4dHM+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hY2Nlc3NUeXBlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaG93IHRoZSB2YXJpYWJsZSBpcyBhY2Nlc3NlZDogUHJvcGVydHkgKGRlZmF1bHQpIG9yIEZpZWxkLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfbmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGlzIGVudGl0eS4gQnkgZGVmYXVsdCwgdGhlIGNsYXNzIG5hbWUgaXMgdXNlZCBhcyB0aGUgZW50aXR5IG5hbWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV90YWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgdGFibGUgYXNzaWduZWQgdG8gdGhpcyBlbnRpdHkuIEJ5IGRlZmF1bHQsIHRoZSBjbGFzcyBuYW1lIGlzIHVzZWQgYXMgdGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfYXR0cmlidXRlT3ZlcnJpZGVzIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgYSBwcm9wZXJ0eSBvciBmaWVsZCB0byBiZSBvdmVycmlkZGVuIChmcm9tIHRoZSBkZWZhdWx0IG1hcHBpbmdzKS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc05hbWUiPgotCQk8ZGVzY3JpcHRpb24+TmFtZSBvZiB0aGUgZGF0YWJhc2UgY29sdW1uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfYXR0cmlidXRlT3ZlcnJpZGVzQ29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBvdmVycmlkZXMgYSBwcm9wZXJ0eSBvciBmaWVsZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc0luc2VydGFibGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIFNRTCBJTlNFUlQgc3RhdGVtZW50cy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc1VwZGF0YWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gU1FMIFVQREFURSBzdGF0ZW1lbnRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX21hcEFzIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaG93IHRoaXMgYXR0cmlidXRlIG1hcHMgdG8gdGhlIGRhdGFiYXNlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19jb2x1bW5UYWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5OYW1lIG9mIHRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBjb2x1bW4uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19jb2x1bW5JbnNlcnRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiBTUUwgSU5TRVJUIHN0YXRlbWVudHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19jb2x1bW5VcGRhdGFibGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIFNRTCBVUERBVEUgc3RhdGVtZW50cy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2ZldGNoVHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZTogRWFnZXIgKGRlZmF1bHQpIG9yIExhenk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX29wdGlvbmFsIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGlzIGZpZWxkIGlzIGNhbiBiZSBudWxsLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfZ2VuZXJhdGVkVmFsdWVTdHJhdGVneSI+Ci0JCTxkZXNjcmlwdGlvbj5EZXRlcm1pbmVzIGhvdyB0aGUgcHJpbWFyeSBrZXkgaXMgZ2VuZXJhdGVkOiBBdXRvIChkZWZhdWx0KSwgU2VxdWVuY2UsIElkZW50aXR5LCBvciBUYWJsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2dlbmVyYXRlZFZhbHVlR2VuZXJhdG9yTmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5VbmlxdWUgbmFtZSBvZiB0aGUgZ2VuZXJhdG9yLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFyZ2V0RW50aXR5Ij4KLQkJPGRlc2NyaXB0aW9uPlRoZSBlbnRpdHkgdG8gd2hpY2ggdGhpcyBhdHRyaWJ1dGUgaXMgbWFwcGVkLiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2Nhc2NhZGVUeXBlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgd2hpY2ggb3BlcmF0aW9ucyBhcmUgcHJvcGFnYXRlZCB0aHJvdWdob3V0IHRoZSBlbnRpdHk6IEFsbCwgUGVyc2lzdCwgTWVyZ2UsIG9yIE1vdmUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19tYXBwZWRCeSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZmllbGQgaW4gdGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgb3ducyB0aGUgcmVsYXRpb25zaGlwLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfam9pbkNvbHVtbk5hbWUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSByZWZlcmVuY2UgZm9yIHRoZSBlbnRpdHkgYXNzb2NpYXRpb24uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19qb2luUmVmZXJlbmNlZENvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5OYW1lIG9mIHRoZSBqb2luIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2VtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgIG1hcHBpbmcgb2YgYW4gZW50aXR54oCZcyBhdHRyaWJ1dGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19lbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgaXMgYmVpbmcgbWFwcGVkIHRvIHRoZSBlbnRpdHnigJlzIGF0dHJpYnV0ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfbWFwQXMiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgdHlwZSBvZiBwZXJzaXN0ZW50IGRvbWFpbiBvYmplY3QgZm9yIHRoZSBKYXZhIGNsYXNzOiBQZXJzaXN0ZW50LCBFbWJlZGRlZCwgb3IgTWFwcGVkIFN1cGVyY2xhc3MuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9pbmhlcml0YW5jZVN0cmF0ZWd5Ij4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaG93IGFuIGVudGl0eSBtYXkgaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gb3RoZXIgZW50aXRpZXM6IFNpbmdsZSB0YWJsZSwgT25lIHRhYmxlIHBlciBjbGFzcywgb3IgSm9pbmVkIHRhYmxlcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlNwZWNpZnlpbmcgaW5oZXJpdGFuY2UiIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfaW5oZXJpdGFuY2VEaXNjcmltaW5hdG9yQ29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aGVuIHVzaW5nIGEgU2luZ2xlIG9yIEpvaW5lZCBpbmhlcml0YW5jZSBzdHJhdGVneS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlNwZWNpZnlpbmcgaW5oZXJpdGFuY2UiIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfaW5oZXJpdGFuY2VEaXNjcmltaW5hdG9yVHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBmaWVsZCB0byBzZXQgdGhlIGRpc2NyaW1pbmF0b3IgdHlwZSB0byBDSEFSIG9yIElOVEVHRVIgKGluc3RlYWQgb2YgaXRzIGRlZmF1bHQ6IFN0cmluZykuIFRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIG11c3QgY29uZm9ybSB0byB0aGlzIHR5cGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2luaGVyaXRhbmNlRGlzY3JpbWluYXRvclZhbHVlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGFuIGVudGl0eSBpbiB0aGlzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gVGhlIHZhbHVlIG11c3QgY29uZm9ybSB0byB0aGUgc3BlY2lmaWVkIGRpc2NyaW1pbmF0b3IgdHlwZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlNwZWNpZnlpbmcgaW5oZXJpdGFuY2UiIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX29yZGVyQnkiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgZGVmYXVsdCBvcmRlciBmb3Igb2JqZWN0cyByZXR1cm5lZCBmcm9tIGEgcXVlcnkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIEVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19qb2luVGFibGVOYW1lIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlICBuYW1lIG9mIHRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIGZvcmVpZ24ga2V5IGZvciBhIG1hbnktdG8tbWFueSBvciBhIHVuaWRpcmVjdGlvbmFsIG9uZS10by1tYW55IGFzc29jaWF0aW9uLiBZb3UgY2FuIGNvbmZpZ3VyZSB0aGUgam9pbiB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgY2F0YWxvZyBvciBzY2hlbWEsIGNvbmZpZ3VyZSBvbmUgb3IgbW9yZSBqb2luIHRhYmxlIGNvbHVtbnMgd2l0aCBhIHVuaXF1ZSBjb25zdHJhaW50LCBhbmQgdXNlIG11bHRpcGxlIGpvaW4gY29sdW1ucyBwZXIgZW50aXR5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfam9pblRhYmxlSm9pbkNvbHVtbnMiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSAgdHdvIG9yIG1vcmUgam9pbiBjb2x1bW5zICh0aGF0IGlzLCBhIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19qb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtbnMiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgam9pbiBjb2x1bW4gb24gdGhlIG93bmVkIChvciBpbnZlcnNlIHNpZGUpIG9mIHRoZSBhc3NvY2lhdGlvbjogdGhlIG93bmVkIGVudGl0eSdzIHByaW1hcnkga2V5IGNvbHVtbi4gPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icHJvcGVydGllc19qYXZhUGVyc2lzdGVuY2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZSBKYXZhIFBlcnNpc3RlbmNlIG9wdGlvbnMgb24gdGhlIFByb3BlcnRpZXMgcGFnZSB0byBzZWxlY3QgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gdXNlIHdpdGggdGhlIHByb2plY3QuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcm9qZWN0IHByb3BlcnRpZXMiIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMiLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9InJlZl9hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InByb3BlcnRpZXNfamF2YVBlcnNpc3RlbmNlQ29ubmVjdGlvbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29ubmVjdGlvbiB1c2VkIHRvIG1hcCB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwcm9wZXJ0aWVzX2phdmFQZXJzaXN0ZW5jZVNjaGVtYSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2Ugc2NoZW1hIHVzZWQgdG8gbWFwIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hZGRQZXJzaXN0ZW5jZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlIEFkZCBQZXJzaXN0ZW5jZSBkaWFsb2cgdG8gZGVmaW5lIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZSB0byBzdG9yZSB0aGUgcGVyc2lzdGVuY2UgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9InJlZl9hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlT3V0bGluZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgSlBBIFN0cnVjdHVyZSB2aWV3IGRpc3BsYXlzIGFuIG91dGxpbmUgb2YgdGhlIHN0cnVjdHVyZSAoaXRzIGF0dHJpYnV0ZXMgYW5kIG1hcHBpbmdzKSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkIG9yIG9wZW5lZCBpbiB0aGUgZWRpdG9yLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIFN0cnVjdHVyZSB2aWV3IiBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2dlbmVyYXRlRW50aXRpZXMiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZSBHZW5lcmF0ZSBFbnRpdGllcyBkaWFsb2cgdG8gY3JlYXRlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcyBiYXNlZCBvbiB5b3VyIGRhdGFiYXNlIHRhYmxlcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJQcm9qZWN0IHByb3BlcnRpZXMiIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMiLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3NvdXJjZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgcHJvamVjdCBmb2xkZXIgbmFtZSBpbiB3aGljaCB0byBnZW5lcmF0ZSB0aGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLiBDbGljayBCcm93c2UgdG8gc2VsZWN0IGFuIGV4aXN0aW5nIGZvbGRlci48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllc19wYWNrYWdlIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBwYWNrYWdlIGluIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMsIG9yIGNsaWNrIEJyb3dzZSB0byBzZWxlY3QgYW4gZXhpc3RpbmcgcGFja2FnZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllc190YWJsZXMiPgotCQk8ZGVzY3JpcHRpb24+U2VsZWN0IHRoZSB0YWJsZXMgZnJvbSB3aGljaCB0byBjcmVhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJQcm9qZWN0IHByb3BlcnRpZXMiIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMiLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGRlZmluZSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB1c2VkIHRvIHN0b3JlIHRoZSBwZXJzaXN0ZW5jZSBlbnRpdGllcyBhbmQgdG8gY3JlYXRlIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBQZXJzaXN0ZW5jZSBkaWFsb2ciIGhyZWY9InJlZl9hZGRfcGVyc2lzdGVuY2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIHByb2plY3QiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX25ld0pQQVByb2plY3QiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGRlZmluZSB0aGUgbmV3IEpQQSBwcm9qZWN0IG5hbWUsIGl0cyBsb2NhdGlvbiwgdGFyZ2V0IHJ1bnRpbWUsIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIHNldHRpbmdzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBQcm9qZWN0IHBhZ2UiIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik5ldyBKUEEgUHJvamVjdCB3aXphcmQiIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkIiAvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIHByb2plY3QiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX2RhdGFiYXNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGVzZSBmaWVsZHMgdG8gZGVmaW5lIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gc3RvcmUgdGhlIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGQgUGVyc2lzdGVuY2UgZGlhbG9nIiBocmVmPSJyZWZfYWRkX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBwcm9qZWN0IiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2VfY2xhc3NwYXRoIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIG9wdGlvbiB0byBhZGQgbGlicmFyaWVzIG9yIEpBUnMgdGhhdCBjb250YWluIHRoZSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBhbmQgZW50aXRpZXMgdG8gdGhlIHByb2plY3TigJlzIEphdmEgQnVpbGQgUGF0aC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBQZXJzaXN0ZW5jZSBkaWFsb2ciIGhyZWY9InJlZl9hZGRfcGVyc2lzdGVuY2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIHByb2plY3QiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9wYWNrYWdpbmciPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZXNlIGZpZWxkcyB0byBjcmVhdGUgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLiBTZWxlY3QgdGhlIHBlcnNpc3RlbmNlIHZlcnNpb24sIHRoZSBuYW1lIG9mIHRoZSBKUEEgcHJvdmlkZXIsIGFuZCBhIHVuaXF1ZSBuYW1lIHRvIGlkZW50aWZ5IHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3aXphcmRfZ2VuZXJhdGVERExfb3B0aW9ucyAiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzZWxlY3Qgd2hpY2ggc2NyaXB0IG9wdGlvbnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHNjcmlwdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgdGFibGVzIChEREwpIGZyb20gZW50aXRpZXMgIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2RkbC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iT3B0aW9ucyBwYWdlICIgaHJlZj0icmVmX29wdGlvbnMuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2l6YXJkX2dlbmVyYXRlRERMX29iamVjdHMgIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHdoaWNoIGVsZW1lbnRzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCBzY3JpcHQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIHRhYmxlcyAoRERMKSBmcm9tIGVudGl0aWVzICIgaHJlZj0idGFza19nZW5lcmF0ZV9kZGwuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik9iamVjdHMgcGFnZSAiIGhyZWY9InJlZl9vYmplY3RzLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndpemFyZF9nZW5lcmF0ZURETF9zYXZlICI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB0aGUgZmlsZW5hbWUgYW5kIGxvY2F0aW9uIG9mIHRoZSBnZW5lcmF0ZWQgc2NyaXB0LiBZb3UgY2FuIGFsc28gcHJldmlldyB0aGUgc2NyaXB0IGFuZCBzcGVjaWZ5IHRvIHJ1biBvciBjb250aW51ZSBlZGl0aW5nIHRoZSBzY3JpcHQgYWZ0ZXIgZ2VuZXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgdGFibGVzIChEREwpIGZyb20gZW50aXRpZXMgIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2RkbC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iU2F2ZSBhbmQgUnVuIERETCBwYWdlICIgaHJlZj0icmVmX3NhdmVfYW5kX3J1bi5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3aXphcmRfZ2VuZXJhdGVERExfc3VtbWFyeSAiPgotCQk8ZGVzY3JpcHRpb24+VGhpcyBwYWdlIHNob3dzIHRoZSBzZXR0aW5ncyB0aGF0IHlvdSBzZWxlY3RlZCBmb3IgdGhlIGdlbmVyYXRlZCBEREwuIFRvIGNoYW5nZSBhbnkgb3B0aW9uIGNsaWNrICJCYWNrIiBvciBjbGljayAiRmluaXNoIiB0byBjb250aW51ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgdGFibGVzIChEREwpIGZyb20gZW50aXRpZXMgIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2RkbC5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yTmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGUgdGFibGUgc2VxdWVuY2UgZ2VuZXJhdG9yLiBUaGlzIG5hbWUgaXMgZ2xvYmFsIHRvIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IChhY3Jvc3MgYWxsIGdlbmVyYXRvciB0eXBlcykuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yVGFibGUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3JQcmltYXJ5S2V5Q29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb2x1bW4gb2YgdGhlIGdlbmVyYXRvciB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgZ2VuZXJhdGVkIElEIHZhbHVlcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3JWYWx1ZUNvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgbmFtZSBmb3IgdGhlIGNvbHVtbiB0aGF0IHN0b3JlcyB0aGUgZ2VuZXJhdGVkIElEIHZhbHVlcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3JQcmltYXJ5S2V5Q29sdW1uVmFsdWUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNvbHVtbiBvZiB0aGUgZ2VuZXJhdG9yIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcHJpbWFyeSBrZXkgdmFsdWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZGF0YWJhc2VBdXRob3JpemF0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0byBjb25uZWN0IChsb2cgaW4pIHRvIGEgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2Ugd2l0aCB5b3VyIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcy4gCi0JCVlvdSBtdXN0IGhhdmUgYSBkZWZpbmVkIGRhdGFiYXNlIGNvbm5lY3Rpb24gKGFuZCBiZSBjb25uZWN0ZWQpIHRvIGFkZCBwZXJzaXN0ZW5jZS4gPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGQgcGVyc2lzdGVuY2UgdG8gYSBKYXZhIHByb2plY3QiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlX3Byb2plY3QuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RlbXBvcmFsIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaWYgdGhlIG1hcHBlZCBmaWVsZCBjb250YWlucyBhIERhdGUgKGphdmEuc3FsLkRhdGUpLCBUaW1lIChqYXZhLnNxbC5UaW1lKSwgb3IgVGltZXN0YW1wIChqYXZhLnNxbC5UaW1lc3RhbXApIHZhbHVlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19wcmltYXJ5S2V5R2VuZXJhdGlvbiI+Ci0JCTxkZXNjcmlwdGlvbj5EZWZpbmUgaG93IHRoZSBwcmltYXJ5IGtleSBpcyBnZW5lcmF0ZWQ8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdG8gdXNlIGEgc3BlY2lmaWMgZGF0YWJhc2UgdGFibGUgZm9yIGdlbmVyYXRpbmcgdGhlIHByaW1hcnkga2V5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfc2VxdWVuY2VHZW5lcmF0b3IiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0byB1c2UgYSBzcGVjaWZpYyBzZXF1ZW5jZSBmb3IgZ2VuZXJhdGluZyB0aGUgcHJpbWFyeSBrZXkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19zZXF1ZW5jZUdlbmVyYXRvck5hbWUiPgotCQk8ZGVzY3JpcHRpb24+TmFtZSBvZiB0aGUgc2VxdWVuY2UuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19zZXF1ZW5jZUdlbmVyYXRvclNlcXVlbmNlIj4KLQkJPGRlc2NyaXB0aW9uPiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2xvYiI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGlmIHRoZSBmaWVsZCBpcyBtYXBwZWQgdG8gamF2YS5zcWwuQ2xvYiBvciBqYXZhLnNxbC5CbG9iLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2VudW1lcmF0ZWQiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBob3cgdG8gcGVyc2lzdCBlbnVtZXJhdGVkIGNvbnN0cmFpbnRzIGlmIHRoZSBTdHJpbmcgdmFsdWUgc3VpdHMgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMgb3IgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgZGF0YWJhc2Ugc2NoZW1hLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZWRpdEludmVyc2VKb2luQ29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfY2F0YWxvZyI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY2F0YWxvZyB0aGF0IGNvbnRhaW5zIHRoZSBUYWJsZS4gVGhpcyBmaWVsZCBvdmVycmlkZXMgdGhlIGRlZmF1bHRzIGluIHRoZSBvcm0ueG1sIGZpbGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9zY2hlbWEiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSBUYWJsZS4gVGhpcyBmaWVsZCBvdmVycmlkZXMgdGhlIGRlZmF1bHRzIGluIHRoZSBvcm0ueG1sIGZpbGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9ybV9wYWNrYWdlIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBKYXZhIHBhY2thZ2UgdGhhdCBjb250YWlucyB0aGUgcGVyc2lzdGVudCBlbnRpdGllcyB0byB3aGljaCB0aGUgb3JtLnhtbCBmaWxlIGFwcGxpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9ybV9zY2hlbWEiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIHNjaGVtYSB0byB1c2UgYXMgdGhlIGRlZmF1bHQgZm9yIGFsbCBlbnRpdGllcyBtYW5hZ2VkIGJ5IHRoaXMgcGVyc2lzdGVuY2UgdW5pdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX2NhdGFsb2ciPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdG8gdXNlIGFzIHRoZSBkZWZhdWx0IGZvciBhbGwgZW50aXRpZXMgbWFuYWdlZCBieSB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9ybV9hY2Nlc3MiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRlZmF1bHQgYWNjZXNzIG1ldGhvZCBmb3IgdmFyaWFibGVzIGluIHRoaXMgcHJvamVjdDogUHJvcGVydHkgb3IgRmllbGQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9ybV9jYXNjYWRlIj4KLQkJPGRlc2NyaXB0aW9uPkFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zIGluIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcm1feG1sIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyB0aGF0IHRoZSBKYXZhIGNsYXNzZXMgaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0IGFyZSBmdWxseSBzcGVjaWZpZWQgYnkgdGhlaXIgbWV0YWRhdGEuIEFueSBhbm5vdGF0aW9ucyB3aWxsIGJlIGlnbm9yZWQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19KUEFQbGF0Zm9ybSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSB2ZW5kb3Itc3BlY2lmaWMgSlBBIGltcGxlbWVudGF0aW9uLkRlZmF1bHQgaXMgR2VuZXJpYy4uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRmFjZXQgcGFnZSIgaHJlZj0icmVmX2pwYV9mYWNldC5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19jcmVhdGVPUk0iPgotCQk8ZGVzY3JpcHRpb24+Q3JlYXRlIGFuIGluaXRpYWwgb3JtLnhtbCBmaWxlLiBVc2UgdGhpcyBmaWxlIHRvIHNwZWNpZnkgcHJvamVjdCBhbmQgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRmFjZXQgcGFnZSIgaHJlZj0icmVmX2pwYV9mYWNldC5odG0iLz4KLQk8L2NvbnRleHQ+Ci0KLQotCi0KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZjYxMjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vY3NzL2JsYWZkb2MuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotQGltcG9ydCAiLi4vLi4vLi4vUFJPRFVDVF9QTFVHSU4vYm9vay5jc3MiOwotCi1zcGFuLmNvbnRyb2wsIHNwYW4uZ3VpLW9iamVjdC1hY3Rpb24sIHAuc3ViaGVhZDIsIHNwYW4uYm9sZCwgcC5ub3RlcDEgewotICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi5uYW1lLCBwLnRpdGxlaW5maWd1cmUsIHNwYW4uaXRhbGljIHsKLSAgZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1wLnRpdGxlaW5maWd1cmUsIHAuc3ViaGVhZDIgewotICBwYWRkaW5nLXRvcDogMTBweDsKLX0KLQotc3Bhbi5jb2RlIHsKLSAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLX0KLQotc3Bhbi5jb3B5cmlnaHRsb2dvIHtmb250LXNpemU6IDAuOGVtfQotCi0uZm9vdGVyIHttYXJnaW4tdG9wOiAyZW07Ym9yZGVyLXRvcDoxcHggc29saWQgI2NjY2NjYztwYWRkaW5nLXRvcDoxZW07fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2h0bWwvY3B5ci5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZGNvbW1vbi9odG1sL2NweXIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODJlYzY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2h0bWwvY3B5ci5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotCi08aGVhZD4KLTwhLS0gIDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7dXJsPS4uLy4uL2xlZ2FsLmh0bSI+IC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBocmVmPSIuLi8uLi9sZWdhbC5odG0iPkxpY2Vuc2UgSW5mb3JtYXRpb248L2E+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlNTU4MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjAyIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+R2V0dGluZyBzdGFydGVkPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIEdldHRpbmcgc3RhcnRlZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYyIiBuYW1lPSJzdGhyZWYyIj48L2E+PC9wPgotPGgxPkdldHRpbmcgc3RhcnRlZDwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gZ2V0dGluZyBzdGFydGVkIHdpdGggdGhlIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAxLmh0bSNCQUJFRkhDRCI+UmVxdWlyZW1lbnRzIGFuZCBpbnN0YWxsYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMi5odG0jQkFCSUdDSkEiPkRhbGkgcXVpY2sgc3RhcnQ8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpc2l0IHRoZSBEYWxpIGhvbWUgcGFnZSBhdDo8L3A+Ci08cD48Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGkvbWFpbi5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaS9tYWluLnBocDwvYT48L2NvZGU+LjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZjhmYTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjIsIDIwMDggMTI6MTQ6MjggLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRUZIQ0QiIG5hbWU9IkJBQkVGSENEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjxhIGlkPSJzdGhyZWYzIiBuYW1lPSJzdGhyZWYzIj48L2E+PGEgaWQ9InN0aHJlZjQiIG5hbWU9InN0aHJlZjQiPjwvYT48L2gxPgotPHA+QmVmb3JlIGluc3RhbGxpbmcgRGFsaSwgZW5zdXJlIHRoYXQgeW91ciBlbnZpcm9ubWVudCBtZWV0cyB0aGUgZm9sbG93aW5nIDxzcGFuIGNsYXNzPSJpdGFsaWMiPm1pbmltdW08L3NwYW4+IHJlcXVpcmVtZW50czo8L3A+Ci08dWw+Ci08bGk+Ci08cD5FY2xpcHNlIDMuNCAoPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzPC9hPjwvY29kZT4pPC9wPgotPC9saT4KLTxsaT4KLTxwPkphdmEgUnVudGltZSBFbnZpcm9ubWVudCAoSlJFKSAxLjUgKDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLmNvbSI+aHR0cDovL2phdmEuY29tPC9hPjwvY29kZT4pPC9wPgotPC9saT4KLTxsaT4KLTxwPkVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIDMuMCAoPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29sczwvYT48L2NvZGU+KTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBmb3IgSmF2YSBFRSA1LiBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGNhbiBiZSBvYnRhaW5lZCBmcm9tOjwvcD4KLTwvbGk+Ci08L3VsPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotPGNvZGU+PGEgaHJlZj0iaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L2Rvd25sb2Fkcy9wZXJzaXN0ZW5jZS9KYXZhUGVyc2lzdGVuY2UuaHRtbCI+aHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L2Rvd25sb2Fkcy9wZXJzaXN0ZW5jZS9KYXZhUGVyc2lzdGVuY2UuaHRtbDwvYT48L2NvZGU+Ci08L3ByZT4KLTxwPlJlZmVyIHRvIDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaS9nZXR0aW5nc3RhcnRlZF9tYWluLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaS9nZXR0aW5nc3RhcnRlZF9tYWluLmh0bWw8L2E+PC9jb2RlPiBmb3IgYWRkaXRpb25hbCBpbnN0YWxsYXRpb24gaW5mb3JtYXRpb24uPC9wPgotPHA+RGFsaSBpcyBpbmNsdWRlZCBhcyBwYXJ0IG9mIFdUUCAyLjAuIE5vIGFkZGl0aW9uYWwgaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQuPC9wPgotPGEgaWQ9InN0aHJlZjUiIG5hbWU9InN0aHJlZjUiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+QWNjZXNzaWJpbGl0eSBGZWF0dXJlczwvcD4KLTxwPkRhbGkgc3VwcG9ydHMgdGhlIHN0YW5kYXJkIGFjY2Vzc2liaWxpdHkgZmVhdHVyZXMgaW4gRWNsaXBzZSwgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+TmF2aWdhdGluZyB0aGUgdXNlciBpbnRlcmZhY2UgdXNpbmcgdGhlIGtleWJvYXJkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TcGVjaWZ5aW5nIGdlbmVyYWwgYWNjZXNzaWJpbGl0eSBwcmVmZXJlbmNlcyBmb3IgdGhlIGVkaXRvci48L3A+Ci08L2xpPgotPC91bD4KLTxwPlNlZSA8YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9hY2Nlc3NpYmlsaXR5L2FjY2Vzc21haW4uaHRtIj5BY2Nlc3NpYmlsaXR5IEZlYXR1cmVzIGluIEVjbGlwc2U8L2E+IGluIHRoZSA8c3BhbiBjbGFzcz0iaXRhbGljIj5Xb3JrYmVuY2ggVXNlciBHdWlkZTwvc3Bhbj4gZm9yIGRldGFpbHMuPC9wPgotPGEgaWQ9InN0aHJlZjYiIG5hbWU9InN0aHJlZjYiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+SGVscCBBY2Nlc3NpYmlsaXR5PC9wPgotPHA+VGhlIGRvY3VtZW50YXRpb24gYW5kIGhlbHAgY29udGFpbnMgbWFya3VwIHRvIGZhY2lsaXRhdGUgYWNjZXNzIGJ5IHRoZSBkaXNhYmxlZCBjb21tdW5pdHkuIFNlZSA8YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci90YXNrcy9oZWxwX2FjY2Vzc2liaWxpdHkuaHRtIj5IZWxwIEFjY2Vzc2liaWxpdHk8L2E+IGluIHRoZSA8c3BhbiBjbGFzcz0iaXRhbGljIj5Xb3JrYmVuY2ggVXNlciBHdWlkZTwvc3Bhbj4gZm9yIGRldGFpbHMuPC9wPgotPHA+V2hlbiB1c2luZyB0aGUgaGVscCwgYmUgYXdhcmUgb2YgdGhlIGZvbGxvd2luZzo8L3A+Ci08dWw+Ci08bGk+Ci08cD5TY3JlZW4gcmVhZGVycyBtYXkgbm90IGFsd2F5cyBjb3JyZWN0bHkgcmVhZCB0aGUgY29kZSBleGFtcGxlcyBpbiB0aGlzIGRvY3VtZW50LiBUaGUgY29udmVudGlvbnMgZm9yIHdyaXRpbmcgY29kZSByZXF1aXJlIHRoYXQgY2xvc2luZyBicmFjZXMgc2hvdWxkIGFwcGVhciBvbiBhbiBvdGhlcndpc2UgZW1wdHkgbGluZTsgaG93ZXZlciwgc29tZSBzY3JlZW4gcmVhZGVycyBtYXkgbm90IGFsd2F5cyByZWFkIGEgbGluZSBvZiB0ZXh0IHRoYXQgY29uc2lzdHMgc29sZWx5IG9mIGEgYnJhY2tldCBvciBicmFjZS48L3A+Ci08L2xpPgotPGxpPgotPHA+VGhpcyBkb2N1bWVudGF0aW9uIG1heSBjb250YWluIGxpbmtzIHRvIFdlYiBzaXRlcyBvZiBvdGhlciBjb21wYW5pZXMgb3Igb3JnYW5pemF0aW9ucyB0aGF0IHdlIGRvIG5vdCBjb250cm9sLiBXZSBuZWl0aGVyIGV2YWx1YXRlIG5vciBtYWtlIGFueSByZXByZXNlbnRhdGlvbnMgcmVnYXJkaW5nIHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHRoZXNlIFdlYiBzaXRlcy48L3A+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1ZTgwNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjAyIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+RGFsaSBxdWljayBzdGFydDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkRhbGkgcXVpY2sgc3RhcnQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSUdDSkEiIG5hbWU9IkJBQklHQ0pBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5EYWxpIHF1aWNrIHN0YXJ0PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY1IiBuYW1lPSJzdGhyZWY1Ij48L2E+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIHRvIGhlbHAgeW91IHF1aWNrbHkgc3RhcnQgdXNpbmcgRGFsaSB0byBjcmVhdGUgcmVsYXRpb25hbCBtYXBwaW5ncyBiZXR3ZWVuIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcyBhbmQgZGF0YWJhc2UgdGFibGVzLjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMy5odG0jQkFCREZIREEiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI0JBQkZHRERHIj5DcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoZSBjb250YWlucyBkZXRhaWxlZCBwcm9jZWR1cmVzIGZvciBidWlsZGluZyB5b3UgZmlyc3QgRGFsaSBwcm9qZWN0LjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRpcHNfYW5kX3RyaWNrcy5odG0jQ0hESEdIQkYiPlRpcHMgYW5kIHRyaWNrczwvYT48YnIgLz4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZDk0ODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDIgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkRGSERBIiBuYW1lPSJCQUJERkhEQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjYiIG5hbWU9InN0aHJlZjYiPjwvYT5UaGlzIHF1aWNrIHN0YXJ0IHNob3dzIGhvdyB0byBjcmVhdGUgYSBuZXcgSlBBIHByb2plY3QuPC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5TZWxlY3QgRmlsZSAmZ3Q7IE5ldyAmZ3Q7IFByb2plY3Q8L3NwYW4+LiBUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyBhcHBlYXJzLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLVlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIEpQQSBwZXJzcGVjdGl2ZSBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbGUgJmd0OyBOZXcgJmd0OyBKUEEgUHJvamVjdDwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIFByb2plY3Q8L3NwYW4+IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIj5OZXcgSlBBIFByb2plY3QgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgYSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPlByb2plY3QgbmFtZTwvc3Bhbj4gKHN1Y2ggYXMgPGNvZGU+UXVpY2tTdGFydDwvY29kZT4pLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JZiBuZWVkZWQsIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhcmdldCBSdW50aW1lPC9zcGFuPiAoc3VjaCBhcyA8Y29kZT5BcGFjaGUgVG9tY2F0PC9jb2RlPikgYW5kIGNvbmZpZ3VyYXRpb24sIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImJvbGQiPlV0aWxpdHkgSlBBIFByb2plY3Qgd2l0aCBKYXZhIDUuMDwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPiBhcHBlYXJzLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhlIFRhcmdldCBSdW50aW1lIGlzIG5vdCByZXF1aXJlZCBmb3IgSmF2YSBTRSBkZXZlbG9wbWVudC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5PbiB0aGUgSlBBIEZhY2V0IGRpYWxvZywgc2VsZWN0IHlvdXIgdmVuZG9yLXNwZWNpZmljIEpQQSBwbGF0Zm9ybSAob3Igc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5HZW5lcmljPC9zcGFuPiksIGRhdGFiYXNlIGNvbm5lY3Rpb24gKG9yIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uKSwgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkgKHN1Y2ggYXMgRWNsaXBzZUxpbmspLCBkZWZpbmUgaG93IERhbGkgc2hvdWxkIG1hbmFnZSBwZXJzaXN0ZW50IGNsYXNzZXMsIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLVNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgdGhlIERlZmF1bHQgU2NoZW1hIGZvciBDb25uZWN0aW9uPC9zcGFuPiBpZiB5b3UgcmVxdWlyZSBhIHNjaGVtYSBvdGhlciB0aGFuIHRoZSBvbmUgdGhhdCBEYWxpIGRlcml2ZXMgZnJvbSB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiwgd2hpY2ggbWF5IGJlIGluY29ycmVjdCBpbiBzb21lIGNhc2VzLiBVc2luZyB0aGlzIG9wdGlvbiwgeW91IGNhbiBzZWxlY3QgYSBkZXZlbG9wbWVudCB0aW1lIHNjaGVtYSBmb3IgZGVmYXVsdHMgYW5kIHZhbGlkYXRpb24uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIHByb2plY3QgdG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbnMgdGhlIEpQQSBwZXJzcGVjdGl2ZS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY3IiBuYW1lPSJzdGhyZWY3Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+UHJvamVjdCBpbiBQYWNrYWdlIEV4cGxvcmVyPC9wPgotPGltZyBzcmM9ImltZy9xdWlja3N0YXJ0X3Byb2plY3QucG5nIiBhbHQ9IlBhY2thZ2UgRXhwbG9yZXIgc2hvd2luZyB0aGUgSlBBIHByb2plY3QuIiB0aXRsZT0iUGFja2FnZSBFeHBsb3JlciBzaG93aW5nIHRoZSBKUEEgcHJvamVjdC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+Tm93IHRoYXQgeW91IGhhdmUgY3JlYXRlZCBhIHByb2plY3Qgd2l0aCBwZXJzaXN0ZW5jZSwgeW91IGNhbiBjb250aW51ZSB3aXRoIDxhIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwNC5odG0jQkFCRkdEREciPkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzPC9hPi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YzJmMTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIzLCAyMDA4IDg6NTk6NDEgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkdEREciIG5hbWU9IkJBQkZHRERHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTAiIG5hbWU9InN0aHJlZjEwIj48L2E+VGhpcyBxdWljayBzdGFydCBzaG93cyBob3cgdG8gY3JlYXRlIGEgbmV3IHBlcnNpc3RlbnQgSmF2YSBlbnRpdHkuIFdlIHdpbGwgY3JlYXRlIGFuIGVudGl0eSB0byBhc3NvY2lhdGUgd2l0aCBhIGRhdGFiYXNlIHRhYmxlLiBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gYWRkIHRoZSBBRERSRVNTIHRhYmxlIHRvIHlvdXIgZGF0YWJhc2UuPC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgSlBBIHByb2plY3QgaW4gdGhlIE5hdmlnYXRvciBvciBQYWNrYWdlIEV4cGxvcmVyIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXcgJmd0OyBPdGhlcjwvc3Bhbj4uIFRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5PC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSBFbnRpdHkgQ2xhc3MgcGFnZSBhcHBlYXJzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgcGFja2FnZSBuYW1lIChzdWNoIGFzIDxjb2RlPnF1aWNrc3RhcnQuZGVtby5tb2RlbDwvY29kZT4pLCB0aGUgY2xhc3MgbmFtZSAoc3VjaCBhcyA8Y29kZT5BZGRyZXNzPC9jb2RlPikgYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmZXJlbmNlMDA0Lmh0bSNDSUFERUNJQSI+RW50aXR5IFByb3BlcnRpZXMgcGFnZTwvYT4gYXBwZWFycywgd2hpY2ggZW5hYmxlcyB5b3UgdG8gZGVmaW5lIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZHMsIHdoaWNoIHlvdSB3aWxsIG1hcCB0byB0aGUgY29sdW1ucyBvZiBhIGRhdGFiYXNlIHRhYmxlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBpZD0ic3RocmVmMTEiIG5hbWU9InN0aHJlZjExIj48L2E+PGEgaWQ9InN0aHJlZjEyIiBuYW1lPSJzdGhyZWYxMiI+PC9hPlVzZSB0aGUgRW50aXR5IEZpZWxkcyBkaWFsb2cgKGludm9rZWQgYnkgY2xpY2tpbmcgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4pIHRvIGFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdG8gdGhlIEFkZHJlc3MgY2xhc3M6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotcHJpdmF0ZSBMb25nIGlkOwotcHJpdmF0ZSBTdHJpbmcgY2l0eTsKLXByaXZhdGUgU3RyaW5nIGNvdW50cnk7Ci1wcml2YXRlIFN0cmluZyBzdGF0ZU9yUHJvdmluY2U7Ci1wcml2YXRlIFN0cmluZyBwb3N0YWxDb2RlOwotcHJpdmF0ZSBTdHJpbmcgc3RyZWV0OwotPC9wcmU+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVlvdSB3aWxsIGFsc28gbmVlZCB0byBhZGQgdGhlIGZvbGxvd2luZyBjb2x1bW5zIHRvIHRoZSBBRERSRVNTIGRhdGFiYXNlIHRhYmxlOgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotTlVNQkVSKDEwLDApIEFERFJFU1NfSUQgKHByaW1hcnkga2V5KQotVkFSQ0hBUjIoODApIFBST1ZJTkNFCi1WQVJDSEFSMig4MCkgQ09VTlRSWQotVkFSQ0hBUjIoMjApIFBfQ09ERQotVkFSQ0hBUjIoODApIFNUUkVFVAotVkFSQ0hBUjIoODApIENJVFkKLTwvcHJlPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotPC9wcmU+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uIFdpdGggdGhlIENyZWF0ZSBKUEEgRW50aXR5IGNvbXBsZXRlZCwgRWNsaXBzZSBkaXNwbGF5cyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZHJlc3M8L3NwYW4+IGVudGl0eSBpbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LjwvcD4KLTxwPkFkZHJlc3MuamF2YSBpbmNsdWRlcyB0aGUgPGNvZGU+QEVudGl0eTwvY29kZT4gYW5ub3RhdGlvbiwgdGhlIHBlcnNpc3RlbmNlIGZpZWxkcywgYXMgd2VsbCBhcyA8Y29kZT5nZXR0ZXI8L2NvZGU+IGFuZCA8Y29kZT5zZXR0ZXI8L2NvZGU+IG1ldGhvZHMgZm9yIGVhY2ggb2YgdGhlIGZpZWxkcy48L3A+Ci08L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjEzIiBuYW1lPSJzdGhyZWYxMyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkFkZHJlc3MgRW50aXR5IGluIEFkZHJlc3MuamF2YTwvcD4KLTxpbWcgc3JjPSJpbWcvamF2YV9lZGl0b3JfYWRkcmVzcy5wbmciIGFsdD0iSmF2YSBlZGl0b3Igd2l0aCB0aGUgQWRkcmVzcyBlbnRpdHkuIiB0aXRsZT0iSmF2YSBlZGl0b3Igd2l0aCB0aGUgQWRkcmVzcyBlbnRpdHkuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPkVjbGlwc2UgYWxzbyBkaXNwbGF5cyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZHJlc3M8L3NwYW4+IGVudGl0eSBpbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3OjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE0IiBuYW1lPSJzdGhyZWYxNCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkFkZHJlc3MgRW50aXR5IGluIHRoZSBKUEEgU3RydWN0dXJlIFZpZXc8L3A+Ci08aW1nIHNyYz0iaW1nL2FkZHJlc3NfamF2YV9KUEFfc3RydWN0dXJlX3F1aWNrc3RhcnQucG5nIiBhbHQ9IkFkZHJlc3MuamF2YSBpbiB0aGUgSlBBIFN0cnVjdHVyZSBWaWV3LiIgdGl0bGU9IkFkZHJlc3MuamF2YSBpbiB0aGUgSlBBIFN0cnVjdHVyZSBWaWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkFkZHJlc3M8L3NwYW4+IGNsYXNzIGluIHRoZSBQYWNrYWdlIEV4cGxvcmVyIHZpZXcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcsIG5vdGljZSB0aGF0IERhbGkgaGFzIGF1dG9tYXRpY2FsbHkgYXNzb2NpYXRlZCB0aGUgQUREUkVTUyBkYXRhYmFzZSB0YWJsZSB3aXRoIHRoZSBlbnRpdHkgYmVjYXVzZSB0aGV5IGFyZSBuYW1lZCBpZGVudGljYWxseS48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLURlcGVuZGluZyBvbiB5b3VyIGRhdGFiYXNlIGNvbm5lY3Rpb24gdHlwZSwgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5TY2hlbWE8L3NwYW4+LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTUiIG5hbWU9InN0aHJlZjE1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+SlBBIERldGFpbHMgVmlldyBmb3IgQWRkcmVzcyBFbnRpdHk8L3A+Ci08aW1nIHNyYz0iaW1nL2FkZHJlc3MuamF2YV9qcGFfZGV0YWlscy5wbmciIGFsdD0iQWRkcmVzcy5qYXZhIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgdGl0bGU9IkFkZHJlc3MuamF2YSBpbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08L29sPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotQWZ0ZXIgYXNzb2NpYXRpbmcgdGhlIGVudGl0eSB3aXRoIHRoZSBkYXRhYmFzZSB0YWJsZSwgeW91IHNob3VsZCB1cGRhdGUgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSB0byBpbmNsdWRlIHRoaXMgSlBBIGVudGl0eS4KLTxwPlJpZ2h0LWNsaWNrIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIFBhY2thZ2UgRXhwbG9yZXIgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIFRvb2xzICZndDsgU3luY2hyb25pemUgQ2xhc3Nlczwvc3Bhbj4uIERhbGkgYWRkcyB0aGUgZm9sbG93aW5nIHRvIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU6PC9wPgotPHA+PGNvZGU+Jmx0O2NsYXNzJmd0O3F1aWNrc3RhcnQuZGVtby5tb2RlbC5BZGRyZXNzJmx0Oy9jbGFzcyZndDs8L2NvZGU+PC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPHA+Tm93IHdlIGFyZSByZWFkeSB0byBtYXAgZWFjaCBmaWVsZHMgaW4gdGhlIEFkZHJlc3MgY2xhc3MgdG8gYSBjb2x1bW4gaW4gdGhlIGRhdGFiYXNlIHRhYmxlLjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+aWQ8L3NwYW4+IGZpZWxkIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodCBjbGljayBpZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IGlkPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+QUREUkVTU19JRDwvc3Bhbj4gaW4gdGhlIE5hbWUgZmllbGQ6PC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTYiIG5hbWU9InN0aHJlZjE2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+SlBBIERldGFpbHMgVmlldyBmb3IgdGhlIGFkZHJlc3NJZCBGaWVsZDwvcD4KLTxpbWcgc3JjPSJpbWcvYWRkcmVzc19pZF9kZXRhaWxzX3F1aWNrc3RhcnQucG5nIiBhbHQ9IlRoZSBKUEEgRGV0YWlscyB2aWV3IGZvciB0aGUgQWRkcmVzcyBlbnRpdHkmcnNxdW87cyBpZCBhdHRyaWJ1dGUuIiB0aXRsZT0iVGhlIEpQQSBEZXRhaWxzIHZpZXcgZm9yIHRoZSBBZGRyZXNzIGVudGl0eSZyc3F1bztzIGlkIGF0dHJpYnV0ZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIEFkZHJlc3MgZW50aXR5OjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBJZAotQENvbHVtbihuYW1lPSJBRERSRVNTX0lEIikKLTwvcHJlPjwvbGk+Ci08bGk+Ci08cD5NYXAgZWFjaCBvZiB0aGUgZm9sbG93aW5nIGZpZWxkcyAoYXMgPHNwYW4gY2xhc3M9ImJvbGQiPkJhc2ljPC9zcGFuPiBtYXBwaW5ncykgdG8gdGhlIGFwcHJvcHJpYXRlIGRhdGFiYXNlIGNvbHVtbjo8L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSFJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBtYXBwaW5ncyBmb3IgZWFjaCBvZiB0aGUgZmllbGRzIGluIHRoZSBBZGRyZXNzIGVudGl0eS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBtYXBwaW5ncyBmb3IgZWFjaCBvZiB0aGUgZmllbGRzIGluIHRoZSBBZGRyZXNzIGVudGl0eS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10OCI+RmllbGQ8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDgiPk1hcCBBczwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10OCI+RGF0YWJhc2UgQ29sdW1uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5jaXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OCByMWMyLXQ4Ij5CYXNpYzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDggcjFjMy10OCI+Q0lUWTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5jb3VudHJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OCByMWMyLXQ4Ij5CYXNpYzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMy10OCI+Q09VTlRSWTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5wb3N0YWxDb2RlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10OCByMWMyLXQ4Ij5CYXNpYzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMy10OCI+UF9DT0RFPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPnByb3ZpbmNlT3JTdGF0ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ4IHIxYzMtdDgiPlBST1ZJTkNFPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPnN0cmVldDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ4IHIxYzMtdDgiPlNUUkVFVDwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RGFsaSBhdXRvbWF0aWNhbGx5IG1hcHMgc29tZSBmaWVsZHMgdG8gdGhlIGNvcnJlY3QgZGF0YWJhc2UgY29sdW1uIChzdWNoIGFzIHRoZSBjaXR5IGZpZWxkIHRvIHRoZSBDaXR5IGNvbHVtbikgaWYgdGhlIG5hbWVzIGFyZSBpZGVudGljYWwuPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3MuamF2YV9qcGFfZGV0YWlscy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3MuamF2YV9qcGFfZGV0YWlscy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjdhNWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzLmphdmFfanBhX2RldGFpbHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2lkX2RldGFpbHNfcXVpY2tzdGFydC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfaWRfZGV0YWlsc19xdWlja3N0YXJ0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmNDBjZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfaWRfZGV0YWlsc19xdWlja3N0YXJ0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19qYXZhX0pQQV9zdHJ1Y3R1cmVfcXVpY2tzdGFydC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfamF2YV9KUEFfc3RydWN0dXJlX3F1aWNrc3RhcnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWY1MWE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19qYXZhX0pQQV9zdHJ1Y3R1cmVfcXVpY2tzdGFydC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NoYW5nZV9jb25uZWN0aW9uX3Byb2ZpbGUucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jaGFuZ2VfY29ubmVjdGlvbl9wcm9maWxlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhYjA1ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NoYW5nZV9jb25uZWN0aW9uX3Byb2ZpbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jb2x1bW5fc3VwcG9ydF9uZXcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jb2x1bW5fc3VwcG9ydF9uZXcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzE2ZThiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY29sdW1uX3N1cHBvcnRfbmV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY29udmVydF9qYXZhX3Byb2plY3RfbmV3LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY29udmVydF9qYXZhX3Byb2plY3RfbmV3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjZGE2ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NvbnZlcnRfamF2YV9wcm9qZWN0X25ldy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NyZWF0ZV9qcGFfZW50aXR5X25ldy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NyZWF0ZV9qcGFfZW50aXR5X25ldy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Yzc4YTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2VudGl0eV9uZXcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2VudGl0eV93aXphcmQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2VudGl0eV93aXphcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmMwYTZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9maWVsZHMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2ZpZWxkcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYTdmYWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2ZpZWxkcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2RldGFpbHNfZW50aXR5bWFwcGluZ3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9kZXRhaWxzX2VudGl0eW1hcHBpbmdzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkNDg4NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2RldGFpbHNfZW50aXR5bWFwcGluZ3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9lbnRlcmluZ19xdWVyeV9uZXcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9lbnRlcmluZ19xdWVyeV9uZXcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGVjMGFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZW50ZXJpbmdfcXVlcnlfbmV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZXJyb3Jfc2FtcGxlLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZXJyb3Jfc2FtcGxlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0OTY0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2Vycm9yX3NhbXBsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2dlbmVyYXRlX2VudGl0aWVzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2NiMjJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9qb2luLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2Vfam9pbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYjY4NzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9qb2luLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2Vfc2luZ2xlLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2Vfc2luZ2xlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0NjQ4Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX3NpbmdsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX3RhYi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX3RhYi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZDcyMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV90YWIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qYXZhX2VkaXRvcl9hZGRyZXNzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvamF2YV9lZGl0b3JfYWRkcmVzcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2VhYTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qYXZhX2VkaXRvcl9hZGRyZXNzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvanBhX3dpemFyZF9jcmVhdGVfZmllbGRzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvanBhX3dpemFyZF9jcmVhdGVfZmllbGRzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1NTBlYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2pwYV93aXphcmRfY3JlYXRlX2ZpZWxkcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBlZF9lbnRpdHlfdHlwZV9saW5rLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjY0ZDA5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ19maWxlX25ldy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNTU3NDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW1iZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjNkMWIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW50aXR5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTY1M2RiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWY1NDM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9zdXBlcmNsYXNzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fYmFzaWNtYXBwaW5ncy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjBiN2ZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fYmFzaWNtYXBwaW5ncy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkYWJsZWVudGl0eW1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODI5NGVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkYWJsZWVudGl0eW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkaWRtYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlOWRjOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkaWRtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkZWRtYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkZWRtYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkNTJiOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2lkbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2lkbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZWZiNWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9pZG1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9tYW55bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b21hbnltYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4MDIyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b21hbnltYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFueXRvb25lbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b29uZW1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2FjYzE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFueXRvb25lbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hcHBlZGVudGl0eS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hcHBlZGVudGl0eS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OGVhMmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRzdXBlcmNsYXNzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOTdjZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRzdXBlcmNsYXNzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fb25ldG9tYW55bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvbWFueW1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGRjOTg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fb25ldG9tYW55bWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvb25lbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvb25lbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZDliYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b29uZW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl90cmFuc2llbnRtYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MDQ4OGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl90cmFuc2llbnRtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl92ZXJzaW9ubWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NzM3MTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl92ZXJzaW9ubWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfZmFjZXRfdGFzay5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfZmFjZXRfdGFzay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZmZjZGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX2ZhY2V0X3Rhc2sucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3BlcnNwZWN0aXZlX2J1dHRvbi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfcGVyc3BlY3RpdmVfYnV0dG9uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0MjVhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfcGVyc3BlY3RpdmVfYnV0dG9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wcm9qZWN0X3Rhc2sucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3Byb2plY3RfdGFzay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZTcxYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3Byb2plY3RfdGFzay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsYy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MzgxYTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbGMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbHIucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbHIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmJjNzQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWx0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWx0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhZjIxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL29wZW5fcGVyc2lzdGVuY2VfZWRpdG9yLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvb3Blbl9wZXJzaXN0ZW5jZV9lZGl0b3IucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjkxMWZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvb3Blbl9wZXJzaXN0ZW5jZV9lZGl0b3IucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV9lZGl0b3JfbmV3LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcGVyc2lzdGVuY2VfZWRpdG9yX25ldy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZWZhZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV9lZGl0b3JfbmV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcGVyc2lzdGVuY2Vfb3V0bGluZV92aWV3LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcGVyc2lzdGVuY2Vfb3V0bGluZV92aWV3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5YWE4Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3BlcnNpc3RlbmNlX291dGxpbmVfdmlldy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3BlcnNpc3RlbmNlX3htbF9lZGl0b3IucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0ZGMxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3BlcnNpc3RlbmNlX3htbF9lZGl0b3IucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wcm9qZWN0X3Byb3BlcnRpZXNfdGFza3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wcm9qZWN0X3Byb3BlcnRpZXNfdGFza3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjYzMTBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcXVpY2tzdGFydF9wcm9qZWN0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcXVpY2tzdGFydF9wcm9qZWN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdjMDY2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlY29uZGFyeV90YWJsZXMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWNvbmRhcnlfdGFibGVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhOTE1OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlY29uZGFyeV90YWJsZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfZW50aXR5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2VudGl0eS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZWJlOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfZW50aXR5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2pwYV9wcm9qZWN0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2pwYV9wcm9qZWN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyMzUwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX21hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODYyNzcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX21hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zeW5jaG9ybml6ZV9jbGFzc2VzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc3luY2hvcm5pemVfY2xhc3Nlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGU2M2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zeW5jaG9ybml6ZV9jbGFzc2VzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfZW50aXR5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfZW50aXR5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFhMWRiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2VudGl0eS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3Rhc2tfZW50ZXJpbmdfcXVlcnkucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YXNrX2VudGVyaW5nX3F1ZXJ5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlYzBhYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3Rhc2tfZW50ZXJpbmdfcXVlcnkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2luZGV4LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Y2YyMmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+Ci08aW5kZXggdmVyc2lvbj0iMS4wIj4KLSAgPGVudHJ5IGtleXdvcmQ9IkBCYXNpYyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmOTciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBDb2x1bW4iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMTkxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJARGlzY3JpbWluYXRvckNvbHVtbiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmODEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBEaXNjcmltaW5hdG9yVmFsdWUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjgzIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJARW1iZWRkYWJsZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGFibGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmNjYiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBFbWJlZGRlZCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jc3RocmVmMTAxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJARW1iZWRkZWRJZCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMi5odG0jc3RocmVmMTA1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJARW50aXR5Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI3N0aHJlZjU5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJARW51bWVyYXRlZCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyMDEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBHZW5lcmF0ZWRWYWx1ZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI3N0aHJlZjIxMCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQElkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEzLmh0bSNzdGhyZWYxMDkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBJbmhlcml0YW5jZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmNzkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBKb2luQ29sdW1uIj4KLSAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNzdGhyZWYxMjAiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjEzMCIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJKb2luIFRhYmxlIEluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDE0Lmh0bSNzdGhyZWYyMDciIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDE1Lmh0bSNzdGhyZWYyMDkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBMb2IiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMTk2IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJATWFueVRvTWFueSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTQuaHRtI3N0aHJlZjExMyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE1hbnlUb09uZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jc3RocmVmMTE4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJATWFwcGVkU3VwZXJjbGFzcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Ik1hcHBlZCBzdXBlcmNsYXNzIj48dG9waWMgaHJlZj0idGFza3MwMDguaHRtI3N0aHJlZjczIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJATmFtZWRRdWVyeSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwOS5odG0jc3RocmVmOTMiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBPbmVUb01hbnkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI3N0aHJlZjEyMyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE9uZVRvT25lIj4KLSAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjEyNyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE9yZGVyQnkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjA0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAU2VxdWVuY2VHZW5lcmF0b3IiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNzdGhyZWYyMTIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBUZW1wb3JhbCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYxOTgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBUcmFuc2llbnQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJUcmFuc2llbnQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNzdGhyZWYxMzMiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBWZXJzaW9uIj4KLSAgICA8ZW50cnkga2V5d29yZD0iVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjEzNyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYXJjaGl0ZWN0dXJlIG9mIERhbGkgZmVhdHVyZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzQuaHRtI3N0aHJlZjI0NiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYXR0cmlidXRlIG92ZXJyaWRlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkF0dHJpYnV0ZSBvdmVycmlkZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTAuaHRtI3N0aHJlZjE3OCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQXR0cmlidXRlIE92ZXJyaWRlcyAtIGluIEphdmEgRGV0YWlscyB2aWV3Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iQXR0cmlidXRlIG92ZXJyaWRlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMC5odG0jc3RocmVmMTgwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJhdHRyaWJ1dGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNzdGhyZWYxOTAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIj48dG9waWMgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNzdGhyZWYxOCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJiYXNpYyBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQEJhc2ljIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJCYXNpYyBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTAuaHRtI3N0aHJlZjk4IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmOTYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSIoU2VlIGFsc28gbWFwcGluZ3MpIj48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY2xhc3NlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyBwZXJzaXN0ZW5jZSB0byI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNTQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRhYmxlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbWJlZGRhYmxlIj48dG9waWMgaHJlZj0idGFza3MwMDcuaHRtI3N0aHJlZjY1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW50aXR5Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNTciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXBwZWQgc3VwZXJjbGFzcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmNzEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzeW5jaHJvbml6aW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwMy5odG0jc3RocmVmNDEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY29sdW1ucyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImRpc2NyaW1pbmF0b3IiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmODIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJqb2luIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjExOSIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE3Lmh0bSNzdGhyZWYxMjkiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKb2luIFRhYmxlIEluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDE0Lmh0bSNzdGhyZWYyMDYiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKb2luIENvbHVtbnMgSW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTUuaHRtI3N0aHJlZjIwOCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmcgdG8iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYxOTIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ2YWx1ZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY4NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJkYXRhYmFzZSB0YWJsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGVudGl0aWVzIGZyb20iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMC5odG0jc3RocmVmMTQzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImRhdGFiYXNlIC0gcGVyc2lzdGVuY2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb25uZWN0aW9uIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEpQQSBPcHRpb25zIj48dG9waWMgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jc3RocmVmMjM1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2NoZW1hIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEpQQSBPcHRpb25zIj48dG9waWMgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jc3RocmVmMjM3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImRldmVsb3BlciBkb2N1bWVudGF0aW9uIC0gRGFsaSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzQuaHRtI3N0aHJlZjI0NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZWFnZXIgZmV0Y2giPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMTk0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRhYmxlIGNsYXNzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGFibGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGFibGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmNjciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY2NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRlZCBJRCBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGVkSWQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMi5odG0jc3RocmVmMTA2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMi5odG0jc3RocmVmMTA0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGVkIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJARW1iZWRkZWQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jc3RocmVmMTAyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jc3RocmVmMTAwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVudGl0aWVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQEVudGl0eSBhbm5vdGF0aW9uIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNjAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlIj48dG9waWMgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmMTciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBKUEEgRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDEuaHRtI3N0aHJlZjI4IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW1iZWRkYWJsZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY2OCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImZyb20gdGFibGVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIj48dG9waWMgaHJlZj0idGFza3MwMjAuaHRtI3N0aHJlZjEzOSIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIGRpYWxvZyI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtI3N0aHJlZjI0MSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNzdGhyZWYxNzciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXBwZWQgc3VwZXJjbGFzcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmNzQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwNC5odG0jc3RocmVmMTAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW5jZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHMiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI3N0aHJlZjgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW50Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNTUiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNjEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzZWNvbmRhcnkgdGFibGVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI3N0aHJlZjE4MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbnVtZXJhdGVkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjIwMCIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjAyIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlcnJvciBtZXNzYWdlcyAtIERhbGkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMi5odG0jc3RocmVmMTQ0IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkVycm9yIG1lc3NhZ2VzIj48dG9waWMgaHJlZj0idGFza3MwMjMuaHRtI3N0aHJlZjE0OSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZXh0ZW5zaW9uIHBvaW50cyAtIERhbGkgZmVhdHVyZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzQuaHRtI3N0aHJlZjI0NyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZmV0Y2ggdHlwZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYxOTMiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIGRpYWxvZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMC5odG0jc3RocmVmMTQyIiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIGRpYWxvZyI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtI3N0aHJlZjI0MCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZ2VuZXJhdGVkIHZhbHVlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IklEIG1hcHBpbmdzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNzdGhyZWYyMTEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzZXF1ZW5jZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0jc3RocmVmMjEzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IklEIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJASWQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IklEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jc3RocmVmMTEwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IklEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jc3RocmVmMTA4IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImluaGVyaXRhbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZW50aXR5Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjc4IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI3N0aHJlZjE4NiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImpvaW5lZCB0YWJsZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmOTAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzaW5nbGUgdGFibGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmODUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgLSBpbiBKYXZhIERldGFpbHMgdmlldyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNzdGhyZWYxODUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Imluc3RhbGxhdGlvbiAtIERhbGkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jc3RocmVmMyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iam9pbmVkIHRhYmxlcyAtIGluaGVyaXRhbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY5MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImF0dHJpYnV0ZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jc3RocmVmMTg4IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW50aXRpZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNzdGhyZWYxNzUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNzdGhyZWYyNDMiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpQQSBwcm9qZWN0Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgbmV3Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNzdGhyZWYyNCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InBsYXRmb3JtIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEpQQSBPcHRpb25zIj48dG9waWMgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jc3RocmVmMjM0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpQQSBTdHJ1Y3R1cmUgdmlldyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBTdHJ1Y3R1cmUgdmlldyI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNzdGhyZWYyMTUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImxhenkgZmV0Y2giPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMTk1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYW55LXRvLW1hbnkgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBNYW55VG9NYW55Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE0Lmh0bSNzdGhyZWYxMTQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTEyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im1hbnktdG8tb25lIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJATWFueVRvT25lIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjExNyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjExNiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXBwZWQgc3VwZXJjbGFzcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBNYXBwZWRTdXBlcmNsYXNzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY3MiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY3MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nIGVudGl0aWVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHMiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI3N0aHJlZjkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmdzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiPjx0b3BpYyBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI3N0aHJlZjE5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYmFzaWMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmOTUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRlZCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDExLmh0bSNzdGhyZWY5OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGVkIElEIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbWJlZGRlZCBJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTIuaHRtI3N0aHJlZjEwMyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IklEIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTMuaHRtI3N0aHJlZjEwNyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbnktdG8tbWFueSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTExIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFueS10by1vbmUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jc3RocmVmMTE1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib25lLXRvLW1hbnkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTIxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib25lLXRvLW9uZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjEyNSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InByb2JsZW1zIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMi5odG0jc3RocmVmMTQ3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idHJhbnNpZW50Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJUcmFuc2llbnQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNzdGhyZWYxMzEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ2ZXJzaW9uIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJWZXJzaW9uIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOS5odG0jc3RocmVmMTM1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im5hbWVkIHF1ZXJpZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbnRpdHkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwOS5odG0jc3RocmVmOTIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibm9ucGVyc2lzdGVudCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNsYXNzZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIj48dG9waWMgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjUzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZmllbGRzLiBTZWUgdHJhbnNpZW50Ij48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib25lLXRvLW1hbnkgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBPbmVUb01hbnkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTI0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTIyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im9uZS10by1vbmUgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBPbmVUb09uZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjEyOCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNy5odG0jc3RocmVmMTI2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBPcmRlckJ5Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjIwNSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib3JkZXJpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjAzIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJvcm0ueG1sIGZpbGUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVGhlIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNzdGhyZWYyMSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbmFnaW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNzdGhyZWY0NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNhbXBsZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jc3RocmVmNDUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib3ZlcnJpZGVzIC0gSlBBIGF0dHJpYnV0ZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJBdHRyaWJ1dGUgb3ZlcnJpZGVzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDEwLmh0bSNzdGhyZWYxNzkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZSI+PHRvcGljIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjE2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZGF0YWJhc2UgY29ubmVjdGlvbiI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKUEEgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjIzNiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImRhdGFiYXNlIHNjaGVtYSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKUEEgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjIzOSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0eSBjbGFzcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNTIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJvcHRpb25zIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEpQQSBPcHRpb25zIj48dG9waWMgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jc3RocmVmMjMxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlBlcnNpc3RlbmNlIFhNTCBFZGl0b3IiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJVc2luZyB0aGUgWE1MIEVkaXRvciB0byBlZGl0IHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDAyLmh0bSNzdGhyZWYzOCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icGVyc2lzdGVuY2UueG1sIGZpbGUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0iY29uY2VwdHMwMDIuaHRtI3N0aHJlZjIwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdG9yIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJVc2luZyB0aGUgWE1MIEVkaXRvciB0byBlZGl0IHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDAyLmh0bSNzdGhyZWYzOSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbmFnaW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jc3RocmVmMzMiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJVc2luZyB0aGUgWE1MIEVkaXRvciB0byBlZGl0IHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDAyLmh0bSNzdGhyZWYzNiIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ildvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNS5odG0jc3RocmVmNTAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzYW1wbGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWYzNCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InN5bmNocm9uaXppbmcgd2l0aCBjbGFzc2VzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwMy5odG0jc3RocmVmNDIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icGVyc2lzdGVudCBlbnRpdHkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNTYiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InBlcnNwZWN0aXZlIC0gSlBBIERldmVsb3BtZW50Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNzdGhyZWYyNDQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InBsYXRmb3JtIC0gSlBBIj4KLSAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKUEEgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjIzMyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icHJvYmxlbXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMi5odG0jc3RocmVmMTQ2IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwcm9qZWN0cyAtIEpQQSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIG5ldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtI3N0aHJlZjYiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNzdGhyZWYyMyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im9wdGlvbnMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSlBBIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyMzIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icXVpY2sgc3RhcnQgLSBEYWxpIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRGFsaSBxdWljayBzdGFydCI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMi5odG0jc3RocmVmNSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icmVxdWlyZW1lbnRzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jc3RocmVmNCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbnQgZW50aXRpZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY1OCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzY2hlbWEgLSBkYXRhYmFzZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSlBBIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyMzgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNlY29uZGFyeSB0YWJsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI3N0aHJlZjE4MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iU2Vjb25kYXJ5IFRhYmxlcyAtIGluIEphdmEgRGV0YWlscyB2aWV3Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNzdGhyZWYxODQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNpbmdsZSB0YWJsZSBpbmhlcml0YW5jZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmODYiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InN1cGVyY2xhc3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY3NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idGFibGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgZW50aXRpZXMgZnJvbSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyI+PHRvcGljIGhyZWY9InRhc2tzMDIwLmh0bSNzdGhyZWYxNDAiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBkaWFsb2ciPjx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bSNzdGhyZWYyNDIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbmhlcml0YW5jZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY4NyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNlY29uZGFyeSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNzdGhyZWYxODIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idGVtcG9yYWwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMTk3IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYxOTkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRyYW5zaWVudCBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQFRyYW5zaWVudCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVHJhbnNpZW50IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOC5odG0jc3RocmVmMTM0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlRyYW5zaWVudCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTguaHRtI3N0aHJlZjEzMiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ2ZXJzaW9uIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJAVmVyc2lvbiI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjEzOCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJWZXJzaW9uIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOS5odG0jc3RocmVmMTM2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InZpZXdzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI3N0aHJlZjE3NiIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jc3RocmVmMTg5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIFN0cnVjdHVyZSB2aWV3Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgU3RydWN0dXJlIHZpZXciPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jc3RocmVmMjE0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Indhcm5pbmcgbWVzc2FnZXMgLSBEYWxpIj4KLSAgICA8ZW50cnkga2V5d29yZD0iVmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zIj48dG9waWMgaHJlZj0idGFza3MwMjIuaHRtI3N0aHJlZjE0NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIGVkaXRvciI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlVzaW5nIHRoZSBYTUwgRWRpdG9yIHRvIGVkaXQgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza3MwMDIuaHRtI3N0aHJlZjM1IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Ildvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNS5odG0jc3RocmVmNDkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLTwvaW5kZXg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvbGVnYWwuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2xlZ2FsLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0Y2U4OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvbGVnYWwuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MTAgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5MZWdhbDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBMZWdhbCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYyNTUiIG5hbWU9InN0aHJlZjI1NSI+PC9hPjwvcD4KLTxoMT5MZWdhbDwvaDE+Ci08cD5Db3B5cmlnaHQgJmNvcHk7IDIwMDYsIDIwMDgsIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC48L3A+Ci08cD5UaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdDo8L3A+Ci08cD48Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+PC9jb2RlPjwvcD4KLTxwPjxhIGhyZWY9ImFib3V0Lmh0bSI+VGVybXMgYW5kIGNvbmRpdGlvbnMgcmVnYXJkaW5nIHRoZSB1c2Ugb2YgdGhpcyBndWlkZS48L2E+PC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjVjMDgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IEphdmEgUGVyc2lzdGVuY2UgRG9jdW1lbnRhdGlvbiAtIERvYwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQotanBhRGV2ZWxvcG1lbnQ9SlBBIERldmVsb3BtZW50Ci1jcmVhdGVBSnBhUHJvamVjdD1DcmVhdGUgYSBKUEEgcHJvamVjdAotY3JlYXRlQUpwYVByb2plY3REZXNjcmlwdGlvbj1UaGlzIGNoZWF0IHNoZWV0IGhlbHBzIHlvdSBjcmVhdGUgYSBKUEEgcHJvamVjdC4KLWNyZWF0ZUFQZXJzaXN0ZW50RW50aXR5PUNyZWF0ZSBhIHBlcnNpc3RlbnQgZW50aXR5Ci1jcmVhdGVBUGVyc2lzdGVudEVudGl0eURlc2NyaXB0aW9uPVRoaXMgY2hlYXQgc2hlZXQgaGVscHMgeW91IGNyZWF0ZSBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkuCi1NYXBBUGVyc2lzdGVudEVudGl0eT1NYXAgYSBwZXJzaXN0ZW50IGVudGl0eQotTWFwQVBlcnNpc3RlbnRFbnRpdHlEZXNjcmlwdGlvbj1UaGlzIGNoZWF0IHNoZWV0IGhlbHBzIHlvdSBtYXAgdGhlIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB0byBhIGRhdGFiYXNlIHRhYmxlLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYzMDhmMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luIG5hbWU9IkpQQSBEb2N1bWVudGF0aW9uIFBsdWctaW4iIGlkPSJvcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIiIHZlcnNpb249IjIuMC4wIiBwcm92aWRlci1uYW1lPSJPcmFjbGUiPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZpbmUgVE9DICAtLT4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLQkJPHRvYyBmaWxlPSJ0b2MueG1sIiBwcmltYXJ5PSJ0cnVlIi8+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmluZSBGMSAgIC0tPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+Ci0JCTxjb250ZXh0cyBmaWxlPSJjb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LnVpIi8+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmluZSBLZXl3b3JkIEluZGV4IC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5pbmRleCI+Ci0JCTxpbmRleCBmaWxlPSJpbmRleC54bWwiLz4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTwhLS0gQ2hlYXRzaGVldHMgLS0+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5jaGVhdFNoZWV0Q29udGVudCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSIlanBhRGV2ZWxvcG1lbnQiIGlkPSJjb20uanBhLmNhdGVnb3J5Ii8+Ci0JCTxjaGVhdHNoZWV0IG5hbWU9IiVjcmVhdGVBSnBhUHJvamVjdCIgY2F0ZWdvcnk9ImNvbS5qcGEuY2F0ZWdvcnkiIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2FkZF9wZXJzaXN0ZW5jZS54bWwiIGlkPSJvcmcuZWNsaXBzZS5qcGEuY2hlYXRzaGVldC5jcmVhdGVwcm9qZWN0MSI+Ci0JCQk8ZGVzY3JpcHRpb24+JWNyZWF0ZUFKcGFQcm9qZWN0RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8L2NoZWF0c2hlZXQ+Ci0JCTxjaGVhdHNoZWV0IG5hbWU9IiVjcmVhdGVBUGVyc2lzdGVudEVudGl0eSIgY2F0ZWdvcnk9ImNvbS5qcGEuY2F0ZWdvcnkiIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2NyZWF0ZV9lbnRpdHkueG1sIiBpZD0ib3JnLmVjbGlwc2UuanBhLmNoZWF0c2hlZXQuYWRkZW50aXR5Ij4KLQkJCTxkZXNjcmlwdGlvbj4lY3JlYXRlQVBlcnNpc3RlbnRFbnRpdHlEZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JCTwvY2hlYXRzaGVldD4KLQkJPGNoZWF0c2hlZXQgbmFtZT0iJU1hcEFQZXJzaXN0ZW50RW50aXR5IiBjYXRlZ29yeT0iY29tLmpwYS5jYXRlZ29yeSIgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvbWFwX2VudGl0eS54bWwiIGlkPSJvcmcuZWNsaXBzZS5qcGEuY2hlYXRzaGVldC5tYXBlbnRpdHkiPgotCQkJPGRlc2NyaXB0aW9uPiVNYXBBUGVyc2lzdGVudEVudGl0eURlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPC9jaGVhdHNoZWV0PgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2RldGFpbHNfb3JtLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZGV0YWlsc19vcm0uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGQxNmQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZGV0YWlsc19vcm0uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDcgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDR0RHSEMiIG5hbWU9IkNBQ0dER0hDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2gxPgotPHA+VGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBkaXNwbGF5cyB0aGUgZGVmYXVsdCBtYXBwaW5nIGFuZCBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHByb2plY3QgYW5kIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXJlYXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDE2Lmh0bSNDQUNDQUNHSCI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDE3Lmh0bSNDQUNFQUdCRyI+UGVyc2lzdGVuY2UgVW5pdCBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoZXNlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBzZXR0aW5ncyBvbiBhIHNwZWNpZmljIGVudGl0eSBvciBtYXBwaW5nLjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhZDVlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pwYV9mYWNldC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowNyAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkpQQSBGYWNldCBwYWdlPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIEZhY2V0IHBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDSUZESUYiIG5hbWU9IkNBQ0lGRElGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5KUEEgRmFjZXQgcGFnZTwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBvbiB0aGUgSlBBIEZhY2V0IHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgR2VuZXJhdGUgRERMIC0gT2JqZWN0cyBwYWdlLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQzIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzIiBoZWFkZXJzPSJyMWMxLXQzIj5QbGF0Zm9ybTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDMgcjFjMi10MyI+VmVuZG9yLXNwZWNpZmljIEpQQSBpbXBsZW1lbnRhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzIHIxYzMtdDMiPkVjbGlwc2VMaW5rPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDMiIGhlYWRlcnM9InIxYzEtdDMiPkNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzIHIxYzItdDMiPlNlbGVjdCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2Ugd2l0aCB0aGUgcHJvamVjdC4gRGFsaSByZXF1aXJlcyBhbiBhY3RpdmUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2UgYW5kIHZhbGlkYXRlIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBtYXBwaW5ncy4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgY29ubmVjdGlvbjwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MyByMWMzLXQzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MyIgaGVhZGVycz0icjFjMS10MyI+Jm5ic3A7Jm5ic3A7T3ZlcnJpZGUgZGVmYXVsdCBzY2hlbWEgZnJvbSBjb25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MyByMWMyLXQzIj5TZWxlY3QgYSBzY2hlbWEgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmUgdGhhdCBpcyBkZXJpdmVkIGZyb20gdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24uIFVzZSB0aGlzIG9wdGlvbiBpZiB0aGUgZGVmYXVsdCBzY2hlbWEgY2Fubm90IGJlIHVzZWQuIEZvciBleGFtcGxlLCB1c2UgdGhpcyBvcHRpb24gd2hlbiB0aGUgZGVwbG95bWVudCBsb2dpbiBkaWZmZXJzIGZyb20gdGhlIGRlc2lnbi10aW1lIGxvZ2luLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDMgcjFjMy10MyI+VGhlIHZhbHVlIGNhbGN1bGF0ZWQgYnkgRGFsaS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MyIgaGVhZGVycz0icjFjMS10MyI+SlBBIEltcGxlbWVudGF0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MyByMWMyLXQzIj5TZWxlY3QgdG8gdXNlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2ZXIgYXQgcnVudGltZTwvc3Bhbj4sIG9yIHNlbGVjdCBhIHNwZWNpZmljIDxzcGFuIGNsYXNzPSJib2xkIj5pbXBsZW1lbnRhdGlvbiBsaWJyYXJ5PC9zcGFuPiB0aGF0IGNvbnRhaW4gdGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIGFuZCBlbnRpdGllcyB0byBiZSBhZGRlZCB0byB0aGUgcHJvamVjdCdzIEphdmEgQnVpbGQgUGF0aC4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Db25maWd1cmUgZGVmYXVsdCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeTwvc3Bhbj4gdG8gY3JlYXRlIGEgZGVmYXVsdCBsaWJyYXJ5IGZvciB0aGUgcHJvamVjdCBvciBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+Q29uZmlndXJlIHVzZXIgbGlicmFyaWVzPC9zcGFuPiB0byBkZWZpbmUgYWRkaXRpb25hbCBsaWJyYXJpZXMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MyByMWMzLXQzIj5EZXRlcm1pbmVkIGJ5IHNlcnZlci48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MyIgaGVhZGVycz0icjFjMS10MyI+UGVyc2lzdGVudCBjbGFzcyBtYW5hZ2VtZW50PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MyByMWMyLXQzIj5TcGVjaWZ5IGlmIERhbGkgd2lsbCA8c3BhbiBjbGFzcz0iYm9sZCI+ZGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgYXV0b21hdGljYWxseTwvc3Bhbj4sIG9yIGlmIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+YW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbDwvc3Bhbj4gZmlsZS4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ob3RlPC9zcGFuPjogVG8gaW5zdXJlIGFwcGxpY2F0aW9uIHBvcnRhYmlsaXR5LCB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgbGlzdCB0aGUgbWFuYWdlZCBwZXJzaXN0ZW5jZSBjbGFzc2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDMgcjFjMy10MyI+RGV0ZXJtaW5lZCBieSBzZXJ2ZXIuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDMiIGhlYWRlcnM9InIxYzEtdDMiPkNyZWF0ZSBvcm0ueG1sPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MyByMWMyLXQzIj5TcGVjaWZ5IGlmIERhbGkgc2hvdWxkIGNyZWF0ZSBhIGRlZmF1bHQgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBmb3IgeW91ciBlbnRpdHkgbWFwcGluZ3MgYW5kIHBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MyByMWMzLXQzIj5TZWxlY3RlZDwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbWFwcGluZ19nZW5lcmFsLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbWFwcGluZ19nZW5lcmFsLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjZWVkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX21hcHBpbmdfZ2VuZXJhbC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDcgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5HZW5lcmFsIGluZm9ybWF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCSEZJSiIgbmFtZT0iQ0FDQkhGSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYWwgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgR2VuZXJhbCBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkphdmEgRGV0YWlscyB2aWV3PC9zcGFuPiBmb3IgZWFjaCBtYXBwaW5nIHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDEwIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTAiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxMCI+RGVmYXVsdDwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjNC10MTAiPkF2YWlsYWJsZSBmb3IgTWFwcGluZyBUeXBlPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPk1hcHBpbmcgVHlwZSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMCByMWMyLXQxMCI+Q2xpY2tpbmcgdGhlIG5hbWUgb2YgdGhlIG1hcHBpbmcgdHlwZSwgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYXMgYSBoeXBlcmxpbmssIGludm9rZXMgdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nLiBVc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBhdHRyaWJ1dGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTAgcjFjMy10MTAiPkJhc2ljPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTAgcjFjNC10MTAiPkFsbCBtYXBwaW5nIHR5cGVzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+PGEgaWQ9IkNBQ0dDQkhCIiBuYW1lPSJDQUNHQ0JIQiI+PC9hPkNvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEwIHIxYzItdDEwIj48YSBpZD0ic3RocmVmMTkxIiBuYW1lPSJzdGhyZWYxOTEiPjwvYT48YSBpZD0ic3RocmVmMTkyIiBuYW1lPSJzdGhyZWYxOTIiPjwvYT5UaGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AQ29sdW1uPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEwIHIxYzMtdDEwIj5CeSBkZWZhdWx0LCB0aGUgQ29sdW1uIGlzIGFzc3VtZWQgdG8gYmUgbmFtZWQgaWRlbnRpY2FsbHkgdG8gdGhlIGF0dHJpYnV0ZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTkuaHRtI0JBQkhJQklJIj5WZXJzaW9uIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDEwIHIxYzItdDEwIj5OYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AQ29sdW1uPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDEwIHIxYzMtdDEwIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPiZuYnNwOyZuYnNwO1RhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTAgcjFjMi10MTAiPk5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMCByMWMzLXQxMCI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTAgcjFjNC10MTAiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtJbnNlcnRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTAgcjFjMi10MTAiPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiA8Y29kZT5TUUwgSU5TRVJUPC9jb2RlPiBzdGF0ZW1lbnRzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDEwIHIxYzMtdDEwIj5UcnVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTAgcjFjNC10MTAiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtVcGRhdGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxMCByMWMyLXQxMCI+U3BlY2lmaWVzIGlmIHRoaXMgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiA8Y29kZT5TUUwgVVBEQVRFPC9jb2RlPiBzdGF0ZW1lbnRzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDEwIHIxYzMtdDEwIj5UcnVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTAgcjFjNC10MTAiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtVbmlxdWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxMCByMWMyLXQxMCI+U2V0cyB0aGUgPGNvZGU+VU5JUVVFPC9jb2RlPiBjb25zdHJhaW50IGZvciB0aGUgY29sdW1uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDEwIHIxYzMtdDEwIj5GYWxzZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDEwIHIxYzQtdDEwIj48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+Jm5ic3A7Jm5ic3A7TnVsbGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxMCByMWMyLXQxMCI+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gYWxsb3dzIG51bGwgdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDEwIHIxYzMtdDEwIj5UcnVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTAgcjFjNC10MTAiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEwYzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+Jm5ic3A7Jm5ic3A7TGVuZ3RoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDEwIHIxYzItdDEwIj5TZXRzIHRoZSBjb2x1bW4gbGVuZ3RoLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxMCByMWMzLXQxMCI+MjU1PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDEwIHIxYzQtdDEwIj48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMWMxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPiZuYnNwOyZuYnNwO1ByZWNpc2lvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxMCByMWMyLXQxMCI+U2V0cyB0aGUgcHJlY2lzaW9uIGZvciB0aGUgY29sdW1uIHZhbHVlcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MTAgcjFjMy10MTAiPjA8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MTAgcjFjNC10MTAiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEyYzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+Jm5ic3A7Jm5ic3A7U2NhbGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10MTAgcjFjMi10MTAiPlNldHMgdGhlIG51bWJlciBvZiBkaWdpdHMgdGhhdCBhcHBlYXIgdG8gdGhlIHJpZ2h0IG9mIHRoZSBkZWNpbWFsIHBvaW50LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxMCByMWMzLXQxMCI+MDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTNjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtDb2x1bW4gRGVmaW5pdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQxMCByMWMyLXQxMCI+RGVmaW5lIHRoZSBEREwgZm9yIGEgY29sdW1uLiBUaGlzIGlzIHVzZWQgd2hlbiBhIHRhYmxlIGlzIGJlaW5nIGdlbmVyYXRlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MTAgcjFjMy10MTAiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTRjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj48YSBpZD0iQ0FDR0dHSEIiIG5hbWU9IkNBQ0dHR0hCIj48L2E+PGEgaWQ9InN0aHJlZjE5MyIgbmFtZT0ic3RocmVmMTkzIj48L2E+PGEgaWQ9InN0aHJlZjE5NCIgbmFtZT0ic3RocmVmMTk0Ij48L2E+PGEgaWQ9InN0aHJlZjE5NSIgbmFtZT0ic3RocmVmMTk1Ij48L2E+RmV0Y2ggVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNGMxLXQxMCByMWMyLXQxMCI+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2U6Ci08dWw+Ci08bGk+Ci08cD5FYWdlciAmbmRhc2g7IERhdGEgaXMgbG9hZGVkIGluIGJlZm9yZSBpdCBpcyBhY3R1YWxseSBuZWVkZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPkxhenkgJm5kYXNoOyBEYXRhIGlzIGxvYWRlZCBvbmx5IHdoZW4gcmVxdWlyZWQgYnkgdGhlIHRyYW5zYWN0aW9uLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDEwIHIxYzMtdDEwIj5FYWdlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNGMxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNC5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTVjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj5PcHRpb25hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNWMxLXQxMCByMWMyLXQxMCI+U3BlY2lmaWVzIGlmIHRoaXMgZmllbGQgaXMgY2FuIGJlIG51bGwuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE1YzEtdDEwIHIxYzMtdDEwIj5ZZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTVjMS10MTAgcjFjNC10MTAiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTZjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj48YSBpZD0iQ0FDQkJJQkkiIG5hbWU9IkNBQ0JCSUJJIj48L2E+PGEgaWQ9InN0aHJlZjE5NiIgbmFtZT0ic3RocmVmMTk2Ij48L2E+TG9iPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE2YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZ5IGlmIHRoZSBmaWVsZCBpcyBtYXBwZWQgdG8gPGNvZGU+amF2YS5zcWwuQ2xvYjwvY29kZT4gb3IgPGNvZGU+amF2YS5zcWwuQmxvYjwvY29kZT4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ATG9iPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNmMxLXQxMCByMWMzLXQxMCI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE2YzEtdDEwIHIxYzQtdDEwIj48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxN2MxLXQxMCIgaGVhZGVycz0icjFjMS10MTAiPjxhIGlkPSJDQUNFQUpHRCIgbmFtZT0iQ0FDRUFKR0QiPjwvYT48YSBpZD0ic3RocmVmMTk3IiBuYW1lPSJzdGhyZWYxOTciPjwvYT48YSBpZD0ic3RocmVmMTk4IiBuYW1lPSJzdGhyZWYxOTgiPjwvYT48YSBpZD0ic3RocmVmMTk5IiBuYW1lPSJzdGhyZWYxOTkiPjwvYT5UZW1wb3JhbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxN2MxLXQxMCByMWMyLXQxMCI+U3BlY2lmaWVzIGlmIHRoaXMgZmllbGQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci08dWw+Ci08bGk+Ci08cD5EYXRlICZuZGFzaDsgPGNvZGU+amF2YS5zcWwuRGF0ZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZSAmbmRhc2g7IDxjb2RlPmphdmEuc3FsLlRpbWU8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWVzdGFtcCAmbmRhc2g7IDxjb2RlPmphdmEuc3FsLlRpbWVzdGFtcDwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBUZW1wb3JhbDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTdjMS10MTAgcjFjMy10MTAiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxN2MxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMThjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj48YSBpZD0ic3RocmVmMjAwIiBuYW1lPSJzdGhyZWYyMDAiPjwvYT48YSBpZD0ic3RocmVmMjAxIiBuYW1lPSJzdGhyZWYyMDEiPjwvYT48YSBpZD0ic3RocmVmMjAyIiBuYW1lPSJzdGhyZWYyMDIiPjwvYT5FbnVtZXJhdGVkPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE4YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZ5IGhvdyB0byBwZXJzaXN0IGVudW1lcmF0ZWQgY29uc3RyYWludHMgaWYgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUgc3VpdHMgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMgb3IgdG8gbWF0Y2ggYW4gZXhpc3RpbmcgZGF0YWJhc2Ugc2NoZW1hLgotPHVsPgotPGxpPgotPHA+b3JkaW5hbDwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5TdHJpbmc8L2NvZGU+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARW51bWVyYXRlZDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMThjMS10MTAgcjFjMy10MTAiPk9yZGluYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMThjMS10MTAgcjFjNC10MTAiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTljMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj5UYXJnZXQgRW50aXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE5YzEtdDEwIHIxYzItdDEwIj5UaGUgcGVyc2lzdGVudCBlbnRpdHkgdG8gd2hpY2ggdGhlIGF0dHJpYnV0ZSBpcyBtYXBwZWQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE5YzEtdDEwIHIxYzMtdDEwIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTljMS10MTAgcjFjNC10MTAiPjxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPiA8YSBocmVmPSJ0YXNrczAxNC5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMjBjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj48YSBpZD0iQ0FDSkFJSEIiIG5hbWU9IkNBQ0pBSUhCIj48L2E+Q2FzY2FkZSBUeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIwYzEtdDEwIHIxYzItdDEwIj5TcGVjaWZ5IHdoaWNoIG9wZXJhdGlvbnMgYXJlIHByb3BhZ2F0ZWQgdGhyb3VnaG91dCB0aGUgZW50aXR5LgotPHVsPgotPGxpPgotPHA+QWxsICZuZGFzaDsgQWxsIG9wZXJhdGlvbnM8L3A+Ci08L2xpPgotPGxpPgotPHA+UGVyc2lzdDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5NZXJnZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Nb3ZlPC9wPgotPC9saT4KLTxsaT4KLTxwPlJlbW92ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SZWZyZXNoPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjBjMS10MTAgcjFjMy10MTAiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMGMxLXQxMCByMWM0LXQxMCI+PGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNC5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMjFjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj48YSBpZD0iQ0FDSkRKSkEiIG5hbWU9IkNBQ0pESkpBIj48L2E+TWFwcGVkIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIxYzEtdDEwIHIxYzItdDEwIj5UaGUgZmllbGQgaW4gdGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgIm93bnMiIHRoZSByZWxhdGlvbnNoaXAuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgb25seSBvbiB0aGUgbm9uLW93bmluZyBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIxYzEtdDEwIHIxYzMtdDEwIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjFjMS10MTAgcjFjNC10MTAiPjxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMjJjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj48YSBpZD0iQ0FDREFESUgiIG5hbWU9IkNBQ0RBRElIIj48L2E+PGEgaWQ9InN0aHJlZjIwMyIgbmFtZT0ic3RocmVmMjAzIj48L2E+PGEgaWQ9InN0aHJlZjIwNCIgbmFtZT0ic3RocmVmMjA0Ij48L2E+PGEgaWQ9InN0aHJlZjIwNSIgbmFtZT0ic3RocmVmMjA1Ij48L2E+T3JkZXIgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjJjMS10MTAgcjFjMi10MTAiPlNwZWNpZnkgdGhlIGRlZmF1bHQgb3JkZXIgZm9yIG9iamVjdHMgcmV0dXJuZWQgZnJvbSBhIHF1ZXJ5OgotPHVsPgotPGxpPgotPHA+Tm8gb3JkZXJpbmc8L3A+Ci08L2xpPgotPGxpPgotPHA+UHJpbWFyeSBrZXk8L3A+Ci08L2xpPgotPGxpPgotPHA+Q3VzdG9tIG9yZGVyaW5nPC9wPgotPC9saT4KLTwvdWw+Ci08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AT3JkZXJCeTwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjJjMS10MTAgcjFjMy10MTAiPlByaW1hcnkga2V5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIyYzEtdDEwIHIxYzQtdDEwIj48YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+LiA8YSBocmVmPSJ0YXNrczAxNC5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMjNjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIzYzEtdDEwIHIxYzItdDEwIj5PdmVycmlkZXMgPHNwYW4gY2xhc3M9ImJvbGQiPkJhc2ljPC9zcGFuPiBtYXBwaW5ncyBvZiBhIG1hcHBlZCBzdXBlcmNsYXNzIChmb3IgZXhhbXBsZSwgaWYgdGhlIGluaGVyaXRlZCBjb2x1bW4gbmFtZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBhIHByZS1leGlzdGluZyBkYXRhIG1vZGVsLCBvciBpbnZhbGlkIGFzIGEgY29sdW1uIG5hbWUgaW4geW91ciBkYXRhYmFzZSkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIzYzEtdDEwIHIxYzMtdDEwIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjNjMS10MTAgcjFjNC10MTAiPjxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4KLTxwPjxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT48L3A+Ci08YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZDRiODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3QuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDcgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5OZXcgSlBBIFByb2plY3QgcGFnZTwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik5ldyBKUEEgUHJvamVjdCBwYWdlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JKQUdDIiBuYW1lPSJDQUNCSkFHQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TmV3IEpQQSBQcm9qZWN0IHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBhdmFpbGFibGUgb24gdGhlIE5ldyBKUEEgUHJvamVjdCBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MiIgaGVhZGVycz0icjFjMS10MiI+UHJvamVjdCBuYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MiByMWMyLXQyIj5OYW1lIG9mIHRoZSBFY2xpcHNlIEpQQSBwcm9qZWN0LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIgcjFjMy10MiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPlByb2plY3QgY29udGVudHM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyIHIxYzItdDIiPkxvY2F0aW9uIG9mIHRoZSB3b3Jrc3BhY2UgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgcHJvamVjdC4KLTxwPlVuc2VsZWN0IFRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VXNlIERlZmF1bHQ8L3NwYW4+IG9wdGlvbiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gdG8gc2VsZWN0IGEgbmV3IGxvY2F0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIgcjFjMy10MiI+Q3VycmVudCB3b3Jrc3BhY2U8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MiIgaGVhZGVycz0icjFjMS10MiI+VGFyZ2V0IHJ1bnRpbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyIHIxYzItdDIiPlNlbGVjdCBhIHByZS1kZWZpbmVkIHRhcmdldCBmb3IgdGhlIHByb2plY3QuCi08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV3PC9zcGFuPiB0byBjcmVhdGUgYSBuZXcgZW52aXJvbm1lbnQgd2l0aCB0aGUgTmV3IFNlcnZlciBSdW50aW1lIHdpemFyZC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyIHIxYzMtdDIiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj5Db25maWd1cmF0aW9uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIgcjFjMi10MiI+U2VsZWN0IGEgcHJvamVjdCBjb25maWd1cmF0aW9uIHdpdGggcHJlLWRlZmluZWQgZmFjZXRzLgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj4mbHQ7Y3VzdG9tJmd0Ozwvc3Bhbj4gdG8gbWFudWFsbHkgc2VsZWN0IHRoZSBmYWNldHMgZm9yIHRoaXMgcHJvamVjdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyIHIxYzMtdDIiPlV0aWxpdHkgSlBBIHByb2plY3Qgd2l0aCBKYXZhIDUuMDwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj5FQVIgbWVtYmVyc2hpcDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIgcjFjMi10MiI+U3BlY2lmeSBpZiB0aGlzIHByb2plY3Qgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFuIEVBUiBmaWxlIGZvciBkZXBsb3ltZW50LgotPHA+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RUFSIFByb2plY3QgTmFtZTwvc3Bhbj4sIG9yIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXc8L3NwYW4+IHRvIGNyZWF0ZSBhIG5ldyBFQVIgcHJvamVjdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyIHIxYzMtdDIiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTgxZmFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowNyAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQkpHQkciIG5hbWU9IkNBQ0JKR0JHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvaDE+Ci08cD5UaGUgQ3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQgYWxsb3dzIHlvdSB0byBjcmVhdGUgYSBuZXcgSmF2YSBwcm9qZWN0IHVzaW5nIEpQQS4gVGhlIHdpemFyZCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIj5OZXcgSlBBIFByb2plY3QgcGFnZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0Njc4Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA3IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQklGQkFGIiBuYW1lPSJCQUJJRkJBRiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxODgiIG5hbWU9InN0aHJlZjE4OCI+PC9hPjxhIGlkPSJzdGhyZWYxODkiIG5hbWU9InN0aHJlZjE4OSI+PC9hPjxhIGlkPSJzdGhyZWYxOTAiIG5hbWU9InN0aHJlZjE5MCI+PC9hPlRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZGlzcGxheXMgdGhlIHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1hcHBlZCBhdHRyaWJ1dGUgYW5kIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXJlYXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkhGSUoiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNC5odG0jQ0FDQkFFQkMiPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNS5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNGQ0NBQiI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmRlMmZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowOCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkpQQSBTdHJ1Y3R1cmUgdmlldzwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBTdHJ1Y3R1cmUgdmlldyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJFR0dGRSIgbmFtZT0iQkFCRUdHRkUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBTdHJ1Y3R1cmUgdmlldzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjE0IiBuYW1lPSJzdGhyZWYyMTQiPjwvYT48YSBpZD0ic3RocmVmMjE1IiBuYW1lPSJzdGhyZWYyMTUiPjwvYT5UaGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBTdHJ1Y3R1cmU8L3NwYW4+IHZpZXcgZGlzcGxheXMgYW4gb3V0bGluZSBvZiB0aGUgc3RydWN0dXJlIChpdHMgYXR0cmlidXRlcyBhbmQgbWFwcGluZ3MpIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgb3Igb3BlbmVkIGluIHRoZSBlZGl0b3IuIFRoZSBzdHJ1Y3R1cmFsIGVsZW1lbnRzIHNob3duIGluIHRoZSBvdXRsaW5lIGFyZSB0aGUgZW50aXR5IGFuZCBpdHMgZmllbGRzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjIxNiIgbmFtZT0ic3RocmVmMjE2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U2FtcGxlIEpQQSBTdHJ1Y3R1cmUgVmlldzwvcD4KLTxpbWcgc3JjPSJpbWcvcGVyc2lzdGVuY2Vfb3V0bGluZV92aWV3LnBuZyIgYWx0PSJTYW1wbGUgSlBBIFN0cnVjdHVyZSB2aWV3IGZvciBhbiBlbnRpdHkuIiB0aXRsZT0iU2FtcGxlIEpQQSBTdHJ1Y3R1cmUgdmlldyBmb3IgYW4gZW50aXR5LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2IxOTE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDggLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSUZCREIiIG5hbWU9IkJBQklGQkRCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjI0MyIgbmFtZT0ic3RocmVmMjQzIj48L2E+PGEgaWQ9InN0aHJlZjI0NCIgbmFtZT0ic3RocmVmMjQ0Ij48L2E+VGhlIDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L3NwYW4+IGRlZmluZXMgdGhlIGluaXRpYWwgc2V0IGFuZCBsYXlvdXQgb2Ygdmlld3MgaW4gdGhlIFdvcmtiZW5jaCB3aW5kb3cgd2hlbiB1c2luZyBEYWxpLiBCeSBkZWZhdWx0LCB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvc3Bhbj4gaW5jbHVkZXMgdGhlIGZvbGxvd2luZyB2aWV3czo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxwPjxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2NvbmNlcHRzLTQuaHRtIj5QZXJzcGVjdGl2ZXM8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNTIwNTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDcgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJGQUVCQiIgbmFtZT0iQkFCRkFFQkIiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE3NSIgbmFtZT0ic3RocmVmMTc1Ij48L2E+PGEgaWQ9InN0aHJlZjE3NiIgbmFtZT0ic3RocmVmMTc2Ij48L2E+PGEgaWQ9InN0aHJlZjE3NyIgbmFtZT0ic3RocmVmMTc3Ij48L2E+VGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBkaXNwbGF5cyB0aGUgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZW50aXR5IGFuZCBjb250YWlucyB0aGUgZm9sbG93aW5nIHRhYnM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNDQUNDQUdHQyI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDEwLmh0bSNDQUNJSkJHSCI+QXR0cmlidXRlIG92ZXJyaWRlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCSElEQSI+U2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI0NBQ0ZIR0hFIj5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJpbWFyeV9rZXkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcmltYXJ5X2tleS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NjA0N2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcmltYXJ5X2tleS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDcgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNGQ0NBQiIgbmFtZT0iQ0FDRkNDQUIiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByaW1hcnkgS2V5IEdlbmVyYXRpb248L3NwYW4+IGFyZWEgaW4gSlBBIERldGFpbHMgdmlldyBmb3IgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPiB0eXBlcy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBDb2x1bW5zIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDEzIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTMiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+PGEgaWQ9IkNBQ0JBSkJDIiBuYW1lPSJDQUNCQUpCQyI+PC9hPlByaW1hcnkgS2V5IEdlbmVyYXRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMyByMWMyLXQxMyI+PGEgaWQ9InN0aHJlZjIxMCIgbmFtZT0ic3RocmVmMjEwIj48L2E+PGEgaWQ9InN0aHJlZjIxMSIgbmFtZT0ic3RocmVmMjExIj48L2E+VGhlc2UgZmllbGRzIGRlZmluZSBob3cgdGhlIHByaW1hcnkga2V5IGlzIGdlbmVyYXRlZC4gVGhlc2UgZmllbGRzIGNvcnJlc3BvbmQgdG8gdGhlIDxjb2RlPkBHZW5lcmF0ZWRWYWx1ZTwvY29kZT4gYW5ub3RhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMyByMWMzLXQxMyI+R2VuZXJhdGVkIFZhbHVlPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+PGEgaWQ9IkNBQ0pFRUVDIiBuYW1lPSJDQUNKRUVFQyI+PC9hPiZuYnNwOyZuYnNwOyZuYnNwO1N0cmF0ZWd5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTMgcjFjMi10MTMiPgotPHVsPgotPGxpPkF1dG88L2xpPgotPGxpPgotPHA+SWRlbnRpdHkgJm5kYXNoOyBWYWx1ZXMgYXJlIGFzc2lnbmVkIGJ5IHRoZSBkYXRhYmFzZSdzIDxzcGFuIGNsYXNzPSJib2xkIj5JZGVudGl0eTwvc3Bhbj4gY29sdW1uLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZXF1ZW5jZSAmbmRhc2g7IFZhbHVlcyBhcmUgYXNzaWduZWQgYnkgYSBzZXF1ZW5jZSB0YWJsZSAoc2VlIDxhIGhyZWY9IiNDQUNGRkhFSCI+U2VxdWVuY2UmbmJzcDtHZW5lcmF0b3I8L2E+KS48L3A+Ci08L2xpPgotPGxpPgotPHA+VGFibGUgJm5kYXNoOyBWYWx1ZXMgYXJlIGFzc2lnbmVkIGJ5IGEgZGF0YWJhc2UgdGFibGUgKHNlZSA8YSBocmVmPSIjQ0FDR0ZFQUgiPlRhYmxlIEdlbmVyYXRvcjwvYT4pLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTMgcjFjMy10MTMiPkF1dG88L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj48YSBpZD0iQkFCRUVBSEoiIG5hbWU9IkJBQkVFQUhKIj48L2E+Jm5ic3A7Jm5ic3A7R2VuZXJhdG9yIE5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMyByMWMyLXQxMyI+VW5pcXVlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCB2YWx1ZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+PGEgaWQ9IkNBQ0dGRUFIIiBuYW1lPSJDQUNHRkVBSCI+PC9hPlRhYmxlIEdlbmVyYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzItdDEzIj5UaGVzZSBmaWVsZHMgZGVmaW5lIHRoZSBkYXRhYmFzZSB0YWJsZSB1c2VkIGZvciBnZW5lcmF0aW5nIHRoZSBwcmltYXJ5IGtleSBhbmQgY29ycmVzcG9uZCB0byB0aGUgPGNvZGU+QFRhYmxlR2VuZXJhdG9yPC9jb2RlPiBhbm5vdGF0aW9uLgotPHA+VGhlc2UgZmllbGRzIGFwcGx5IG9ubHkgd2hlbiA8c3BhbiBjbGFzcz0iYm9sZCI+U3RyYXRlZ3k8L3NwYW4+Jm5ic3A7PSZuYnNwOzxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPiZuYnNwOyZuYnNwO05hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMyByMWMyLXQxMyI+VW5pcXVlIG5hbWUgb2YgdGhlIGdlbmVyYXRvci48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+Jm5ic3A7Jm5ic3A7VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxMyByMWMyLXQxMyI+RGF0YWJhc2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIGdlbmVyYXRlZCBJRCB2YWx1ZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPiZuYnNwOyZuYnNwO1ByaW1hcnkgS2V5IENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDEzIHIxYzItdDEzIj5UaGUgY29sdW1uIGluIHRoZSB0YWJsZSBnZW5lcmF0b3IncyA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+IHRoYXQgY29udGFpbnMgdGhlIHByaW1hcnkga2V5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj4mbmJzcDsmbmJzcDtWYWx1ZSBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxMyByMWMyLXQxMyI+VGhlIGNvbHVtbiB0aGF0IHN0b3JlcyB0aGUgZ2VuZXJhdGVkIElEIHZhbHVlcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPiZuYnNwOyZuYnNwO1ByaW1hcnkgS2V5IENvbHVtbiBWYWx1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxMyByMWMyLXQxMyI+VGhlIHZhbHVlIGZvciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlByaW1hcnkgS2V5IENvbHVtbjwvc3Bhbj4gaW4gdGhlIGdlbmVyYXRvciB0YWJsZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTFjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj48YSBpZD0iQ0FDRkZIRUgiIG5hbWU9IkNBQ0ZGSEVIIj48L2E+U2VxdWVuY2UmbmJzcDtHZW5lcmF0b3I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MTMgcjFjMi10MTMiPjxhIGlkPSJzdGhyZWYyMTIiIG5hbWU9InN0aHJlZjIxMiI+PC9hPjxhIGlkPSJzdGhyZWYyMTMiIG5hbWU9InN0aHJlZjIxMyI+PC9hPlRoZXNlIGZpZWxkcyBkZWZpbmUgdGhlIHNwZWNpZmljIHNlcXVlbmNlIHVzZWQgZm9yIGdlbmVyYXRpbmcgdGhlIHByaW1hcnkga2V5IGFuZCBjb3JyZXNwb25kIHRvIHRoZSA8Y29kZT5AU2VxdWVuY2VHZW5lcmF0b3I8L2NvZGU+IGFubm90YXRpb24uCi08cD5UaGVzZSBmaWVsZHMgYXBwbHkgb25seSB3aGVuIDxzcGFuIGNsYXNzPSJib2xkIj5TdHJhdGVneTwvc3Bhbj4gPSA8c3BhbiBjbGFzcz0iYm9sZCI+U2VxdWVuY2U8L3NwYW4+LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMmMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPiZuYnNwOyZuYnNwO05hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10MTMgcjFjMi10MTMiPk5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlIHRvIHVzZSBmb3IgZGVmaW5pbmcgcHJpbWFyeSBrZXkgdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxM2MxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPiZuYnNwOyZuYnNwO1NlcXVlbmNlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDEzIHIxYzItdDEzIj5VbmlxdWUgbmFtZSBvZiB0aGUgc2VxdWVuY2UuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzFhYTY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA4IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKUEEgT3B0aW9uczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSlBBIE9wdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSkhCQ0kiIG5hbWU9IkJBQkpIQkNJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEpQQSBPcHRpb25zPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMzEiIG5hbWU9InN0aHJlZjIzMSI+PC9hPjxhIGlkPSJzdGhyZWYyMzIiIG5hbWU9InN0aHJlZjIzMiI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQTwvc3Bhbj4gb3B0aW9ucyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb3BlcnRpZXM8L3NwYW4+IHBhZ2UgdG8gc2VsZWN0IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSB3aXRoIHRoZSBwcm9qZWN0LjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHMgcGFnZTwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHBhZ2UuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij48YSBpZD0ic3RocmVmMjMzIiBuYW1lPSJzdGhyZWYyMzMiPjwvYT48YSBpZD0ic3RocmVmMjM0IiBuYW1lPSJzdGhyZWYyMzQiPjwvYT48YSBpZD0ic3RocmVmMjM1IiBuYW1lPSJzdGhyZWYyMzUiPjwvYT48YSBpZD0ic3RocmVmMjM2IiBuYW1lPSJzdGhyZWYyMzYiPjwvYT5QbGF0Zm9ybTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI4IHIxYzItdDI4Ij5TZWxlY3QgdGhlIHZlbmRvci1zcGVjaWZpYyBwbGF0Zm9ybS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij48YSBpZD0ic3RocmVmMjM3IiBuYW1lPSJzdGhyZWYyMzciPjwvYT48YSBpZD0ic3RocmVmMjM4IiBuYW1lPSJzdGhyZWYyMzgiPjwvYT48YSBpZD0ic3RocmVmMjM5IiBuYW1lPSJzdGhyZWYyMzkiPjwvYT5Db25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjggcjFjMi10MjgiPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gbWFwIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLgotPHVsPgotPGxpPgotPHA+VG8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgQ29ubmVjdGlvbnM8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UbyByZWNvbm5lY3QgdG8gYW4gZXhpc3RpbmcgY29ubmVjdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPlJlY29ubmVjdDwvc3Bhbj4uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij4mbmJzcDsmbmJzcDtPdmVycmlkZSBkZWZhdWx0IHNjaGVtYSBmcm9tIGNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyOCByMWMyLXQyOCI+U2VsZWN0IGEgc2NoZW1hIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgb25lIGRlcml2ZWQgZnJvbSB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbi4gVXNlIHRoaXMgb3B0aW9uIGlmIHRoZSBkZWZhdWx0IHNjaGVtYSBpcyBpbmNvcnJlY3Qgb3IgY2Fubm90IGJlIHVzZWQuIEZvciBleGFtcGxlLCB1c2UgdGhpcyBvcHRpb24gd2hlbiB0aGUgZGVwbG95bWVudCBsb2dpbiBkaWZmZXJzIGZyb20gdGhlIGRlc2lnbi10aW1lIGxvZ2luLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPlBlcnNpc3RlbnQgQ2xhc3MgTWFuYWdlbWVudDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI4IHIxYzItdDI4Ij5TcGVjaWZ5IGlmIERhbGkgd2lsbCA8c3BhbiBjbGFzcz0iYm9sZCI+ZGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgYXV0b21hdGljYWxseTwvc3Bhbj4sIG9yIGlmIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+YW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbDwvc3Bhbj4gZmlsZS4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ob3RlPC9zcGFuPjogVG8gaW5zdXJlIGFwcGxpY2F0aW9uIHBvcnRhYmlsaXR5LCB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgbGlzdCB0aGUgbWFuYWdlZCBwZXJzaXN0ZW5jZSBjbGFzc2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tzMDI1Lmh0bSNCQUJEQkNCSSI+TW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2ZGVkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA3IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+UmVmZXJlbmNlPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFJlZmVyZW5jZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYxNjYiIG5hbWU9InN0aHJlZjE2NiI+PC9hPjwvcD4KLTxoMT5SZWZlcmVuY2U8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGRldGFpbGVkIGhlbHAgaW5mb3JtYXRpb24gZm9yIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50cyBpbiB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2w6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDAxLmh0bSNDQUNKSkpKSCI+V2l6YXJkczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDA4Lmh0bSNDQUNESklJRyI+UHJvcGVydHkgcGFnZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyOC5odG0jQ0FDREVJRUUiPlByZWZlcmVuY2VzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjkuaHRtI0NBQ0dFSkRBIj5EaWFsb2dzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtI0JBQklGQkRCIj5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzMS5odG0jQ0FDREhDSUEiPkljb25zIGFuZCBidXR0b25zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzQuaHRtI0NBQ0JCRElCIj5EYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViYWFjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA3IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+V2l6YXJkczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IldpemFyZHMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDSkpKSkgiIG5hbWU9IkNBQ0pKSkpIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5XaXphcmRzPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nIHdpemFyZHM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFHR0dERiI+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1YWYxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA3IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdHR0RGIiBuYW1lPSJDSUFHR0dERiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9oMT4KLTxwPlRoZSBDcmVhdGUgSlBBIHdpemFyZCBlbmFibGVzIHlvdSB0byBxdWlja2x5IGFkZCBhbiBlbnRpdHkgYW5kIGFsc28gYWRkIHBlcnNpc3RlbmNlIGZpZWxkcyB0byB0aGF0IGVudGl0eS4gSW4gYWRkaXRpb24sIHRoaXMgd2l6YXJkIGFkZHMgdGhlIGFjY2Vzc29yIG1ldGhvZHMgKDxjb2RlPmdldHRlcjwvY29kZT4gYW5kIDxjb2RlPnNldHRlcjwvY29kZT4pIGluIHRoZSBjbGFzcyBmaWxlLiBUaGUgd2l6YXJkIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDAzLmh0bSNDSUFGRUlHRiI+RW50aXR5IENsYXNzIHBhZ2U8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAwNC5odG0jQ0lBREVDSUEiPkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2U8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzc2OGM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA3IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+RW50aXR5IENsYXNzIHBhZ2U8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbnRpdHkgQ2xhc3MgcGFnZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGRUlHRiIgbmFtZT0iQ0lBRkVJR0YiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVudGl0eSBDbGFzcyBwYWdlPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEVudGl0eSBDbGFzcyBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDIuaHRtI0NJQUdHR0RGIj5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjE2NyIgbmFtZT0ic3RocmVmMTY3Ij48L2E+PGEgaWQ9InN0aHJlZjE2OCIgbmFtZT0ic3RocmVmMTY4Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj4mbmJzcDs8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIEVudGl0eSBDbGFzcyBwYWdlIG9mIHRoZSBDcmVhdGUgSlBBIEVudGl0aWVzIHdpemFyZC4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDQiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ0Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij4KLTxwPlByb2plY3Q8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ0IHIxYzItdDQiPgotPHA+VGhlIG5hbWUgb2YgdCBoZSBKUEEgcHJvamVjdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ0IHIxYzMtdDQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij4KLTxwPlNvdXJjZSBGb2xkZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ0IHIxYzItdDQiPgotPHA+VGhlIGxvY2F0aW9uIG9mIHRoZSBKUEEgcHJvamVjdCdzIHNyYyBmb2xkZXIuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NCByMWMzLXQ0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Ci08cD5KYXZhIFBhY2thZ2U8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ0IHIxYzItdDQiPgotPHA+VGhlIG5hbWUgb2YgdGhlIGNsYXNzIHBhY2thZ2UuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NCByMWMzLXQ0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Ci08cD5DbGFzcyBuYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NCByMWMyLXQ0Ij4KLTxwPlRoZSBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDQgcjFjMy10NCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPgotPHA+U3VwZXJjbGFzczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDQgcjFjMi10NCI+Ci08cD5TZWxlY3QgdGhlIHN1cGVyY2xhc3MuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NCByMWMzLXQ0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Ci08cD5Jbmhlcml0YW5jZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDQgcjFjMi10NCI+Ci08cD5CZWNhdXNlIHRoZSB3aXphcmQgY3JlYXRlcyBhIEphdmEgY2xhc3Mgd2l0aCBhbiA8Y29kZT5ARW50aXR5PC9jb2RlPiBub3RhdGlvbiwgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHk8L3NwYW4+IG9wdGlvbiBpcyBzZWxlY3RlZCBieSBkZWZhdWx0LjwvcD4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwcGVkIFN1cGVyY2xhc3M8L3NwYW4+IGlmIHlvdSBkZWZpbmVkIGEgc3VwZXJjbGFzcy48L3A+Ci08cD5UbyBhZGQgYW4gPGNvZGU+QEluaGVyaXRhbmNlPC9jb2RlPiBub3RhdGlvbiB0byB0aGUgZW50aXR5LCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkluaGVyaXRhbmNlPC9zcGFuPiBhbmQgdGhlbiBzZWxlY3Qgb25lIG9mIHRoZSBpbmhlcml0YW5jZSBtYXBwaW5nIHN0cmF0ZWdpZXMgKGRlc2NyaWJlZCBpbiBKU1IgMjIwKTo8L3A+Ci08dWw+Ci08bGk+Ci08cD5TSU5HTEVfVEFCTEUgLS0gQWxsIGNsYXNzZXMgaW4gYSBoaWVyYXJjaHkgYXMgbWFwcGVkIHRvIGEgc2luZ2xlIHRhYmxlLiBUaGlzIGFubm90YXRpb24gaXMgd2l0aG91dCBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBpbmhlcml0YW5jZSBzdHJhdGVneS48L3A+Ci08L2xpPgotPGxpPgotPHA+VEFCTEVfUEVSX0NMQVNTIC0tIEVhY2ggY2xhc3MgaXMgbWFwcGVkIHRvIGEgc2VwYXJhdGUgdGFibGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPkpPSU5FRCAtLSBUaGUgcm9vdCBvZiB0aGUgY2xhc3MgaGllcmFyY2h5IGlzIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHRhYmxlLiBFYWNoIHN1YmNsYXNzIGlzIHJlcHJlc2VudGVkIGJ5IGEgc2VwYXJhdGUgdGFibGUgdGhhdCBjb250YWlucyB0aG9zZSBmaWVsZHMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIHN1YmNsYXNzIChub3QgaW5oZXJpdGVkIGZyb20gaXRzIHN1cGVyY2xhc3MpLCBhcyB3ZWxsIGFzIHRoZSBjb2x1bW4ocykgdGhhdCByZXByZXNlbnQgaXRzIHByaW1hcnkga2V5LiBUaGUgcHJpbWFyeSBrZXkgY29sdW1uKHMpIG9mIHRoZSBzdWJjbGFzcyB0YWJsZSBzZXJ2ZXMgYXMgYSBmb3JlaWduIGtleSB0byB0aGUgcHJpbWFyeSBrZXkgb2YgdGhlIHN1cGVyY2xhc3MgdGFibGUuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ0IHIxYzMtdDQiPgotPHA+RW50aXR5PC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPgotPHA+WE1MIEVudGl0eSBNYXBwaW5nczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDQgcjFjMi10NCI+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCB0byBlbnRpdHkgbWFwcGluZ3MgaW4gWE1MPC9zcGFuPiB0byBjcmVhdGUgWE1MIG1hcHBpbmdzIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LCByYXRoZXIgdGhhbiBhbm5vdGF0aW9ucy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQ0IHIxYzMtdDQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTlmNDAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA3IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+RW50aXR5IFByb3BlcnRpZXMgcGFnZTwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBREVDSUEiIG5hbWU9IkNJQURFQ0lBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEVudGl0eSBQcm9wZXJ0aWVzIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMTY5IiBuYW1lPSJzdGhyZWYxNjkiPjwvYT48YSBpZD0ic3RocmVmMTcwIiBuYW1lPSJzdGhyZWYxNzAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPiZuYnNwOzwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIHRvIGJlIGNvbnZlcnRlZCB0byBpbmZvcm1hbC4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij4KLTxwPkVudGl0eSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NSByMWMyLXQ1Ij4KLTxwPlRoZSBuYW1lIG9mIHRoZSBlbnRpdHkuIEJ5IGRlZmF1bHQsIHRoaXMgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBlbnRlcmVkIGFzIHRoZSBjbGFzcyBuYW1lLiBJZiB0aGUgZW50aXR5IG5hbWUgZGlmZmVycyBmcm9tIHRoZSBjbGFzcyBuYW1lLCB0aGVuIHRoZSBlbnRpdHkgbmFtZSBpcyBhZGRlZCBhcyBhbiBhdHRyaWJ1dGUuIEZvciBleGFtcGxlOiA8Y29kZT5ARW50aXR5KG5hbWU9IkVudGl0eU5hbWUiKTwvY29kZT4uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NSByMWMzLXQ1Ij4KLTxwPkRldGVybWluZWQgYnkgc2VydmVyLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij4KLTxwPlRhYmxlIE5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ1IHIxYzItdDUiPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Vc2UgZGVmYXVsdDwvc3Bhbj4gdG8gbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIG1hcHBlZCB0YWJsZSBuYW1lIHRvIHRoZSBlbnRpdHkgbmFtZS4gT3RoZXJ3aXNlLCBjbGVhciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlVzZSBkZWZhdWx0PC9zcGFuPiBvcHRpb24gYW5kIGVudGVyIHRoZSBuYW1lIGluIHRoZSA8c3BhbiBjbGFzcz0iaXRhbGljIj5UYWJsZSBOYW1lPC9zcGFuPiBmaWVsZC4gVGhlc2Ugb3B0aW9ucyByZXN1bHQgaW4gdGhlIGFkZGl0aW9uIG9mIHRoZSA8Y29kZT5AVGFibGU8L2NvZGU+IG9wdGlvbiB0byB0aGUgSmF2YSBjbGFzcyBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDUgcjFjMy10NSI+Ci08cD5Vc2UgZGVmYXVsdC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NSIgaGVhZGVycz0icjFjMS10NSI+Ci08cD5FbnRpdHkgRmllbGRzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NSByMWMyLXQ1Ij4KLTxwPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiBidXR0b24gdG8gYWRkIHBlcnNpc3RlbmNlIGZpZWxkcyB1c2luZyB0aGUgRW50aXR5IEZpZWxkcyBkaWFsb2cuIFRoaXMgZGlhbG9nIGVuYWJsZSB5b3UgdG8gYnVpbGQgYSBmaWVsZCBieSBlbnRlcmluZyBhIGZpZWxkIG5hbWUgYW5kIHNlbGVjdGluZyBhbW9uZyBwZXJzaXN0ZW5jZSB0eXBlcy4gVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5LZXk8L3NwYW4+IG9wdGlvbiBlbmFibGVzIHlvdSB0byBtYXJrIGEgZmllbGQgYXMgYSBwcmltYXJ5IGtleS4gVGhlIGRpYWxvZydzIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IGZ1bmN0aW9uIGVuYWJsZXMgeW91IHRvIGFkZCBvdGhlciBwZXJzaXN0ZW5jZSB0eXBlcyBkZXNjcmliZWQgaW4gdGhlIEpQQSBzcGVjaWZpY2F0aW9uLiBUaGUgPHNwYW4gY2xhc3M9ImJvbGQiPkVkaXQ8L3NwYW4+IGJ1dHRvbiBlbmFibGVzIHlvdSB0byBjaGFuZ2UgdGhlIG5hbWUgb3IgdHlwZSBzZXQgZm9yIGEgcGVyc2lzdGVudCBmaWVsZC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ1IHIxYzMtdDUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij4KLTxwPkFjY2VzcyBUeXBlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NSByMWMyLXQ1Ij4KLTxwPlNlbGVjdCB3aGV0aGVyIHRoZSBlbnRpdHkncyBhY2Nlc3MgdG8gaW5zdGFuY2UgdmFyaWFibGVzIGlzIGZpZWxkLWJhc2VkIG9yIHByb3BlcnR5LWJhc2VkLCBhcyBkZWZpbmVkIGluIHRoZSBKUEEgc3BlY2lmaWNhdGlvbi48L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RmllbGQtYmFzZWQ8L3NwYW4+ICZuZGFzaDsgSW5zdGFuY2UgdmFyaWFibGVzIGFyZSBhY2Nlc3NlZCBkaXJlY3RseS4gQWxsIG5vbi10cmFuc2llbnQgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBwZXJzaXN0ZW50LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+UHJvcGVydHktYmFzZWQ8L3NwYW4+ICZuZGFzaDsgUGVyc2lzdGVudCBzdGF0ZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzLiBUaGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcyBtdXN0IGJlIDxzcGFuIGNsYXNzPSJib2xkIj5wdWJsaWM8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJib2xkIj5wcml2YXRlPC9zcGFuPi48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDUgcjFjMy10NSI+Ci08cD5GaWVsZC1iYXNlZDwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwMS5odG0jQkFCRkJKQkciPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDk5YzY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIxLCAyMDA4IDExOjE2OjE1IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+TWFwcGluZyBGaWxlIFdpemFyZDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hcHBpbmcgRmlsZSBXaXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFJSkNDRSIgbmFtZT0iQ0lBSUpDQ0UiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2gxPgotPHA+VGhlIE1hcHBpbmcgRmlsZSB3aXphcmQgZW5hYmxlcyB5b3UgdG8gYWRkIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgdG8gYSBKUEEgcHJvamVjdCBpZiBubyBvYmplY3QgbWFwIGV4aXN0cyBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGNsZWFyZWQgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DcmVhdGUgb3JtLnhtbDwvc3Bhbj4gb3B0aW9uIG9uIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+LCB5b3UgY2FuIGxhdGVyIGFkZCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB0byB0aGUgc3JjIGZpbGUgb2YgdGhlIHByb2plY3QgdXNpbmcgdGhpcyB3aXphcmQuPC9wPgotPHA+VGhlIDxhIGhyZWY9IiNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4gY29uc2lzdHMgb2YgdGhlIE1hcHBpbmcgRmlsZSBwYWdlLjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YmY3YzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDcgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5NYXBwaW5nIEZpbGUgV2l6YXJkPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFwcGluZyBGaWxlIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjE3MSIgbmFtZT0ic3RocmVmMTcxIj48L2E+Ci08aDE+TWFwcGluZyBGaWxlPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwNS5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjE3MiIgbmFtZT0ic3RocmVmMTcyIj48L2E+PGEgaWQ9InN0aHJlZjE3MyIgbmFtZT0ic3RocmVmMTczIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5NYXBwaW5nIEZpbGUgV2l6YXJkIFByb3BlcnRpZXM8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9Ik1hcHBpbmcgRmlsZSBXaXphcmQgUHJvcGVydGllcyIgc3VtbWFyeT0iIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDYiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10NiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5Qcm9qZWN0PC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NiByMWMyLXQ2Ij4KLTxwPlRoZSBuYW1lIG9mIHRoZSBKUEEgcHJvamVjdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ2IHIxYzMtdDYiPgotPHA+U2VsZWN0ZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDYiIGhlYWRlcnM9InIxYzEtdDYiPgotPHA+U291cmNlIGZvbGRlcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDYgcjFjMi10NiI+Ci08cD5UaGUgbG9jYXRpb24gb2YgdGhlIHByb2plY3QncyBzcmMgZm9sZGVyLiBJZiBuZWVkZWQsIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IHRvIHBvaW50IHRoZSB3aXphcmQgdG8gdGhlIHNyYyBmaWxlJ3MgbG9jYXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NiByMWMzLXQ2Ij4KLTxwPlNlbGVjdGVkLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ2IiBoZWFkZXJzPSJyMWMxLXQ2Ij4KLTxwPkZpbGUgUGF0aDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDYgcjFjMi10NiI+Ci08cD5UaGUgbG9jYXRpb24gZm9yIHRoZSBuZXcgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ2IHIxYzMtdDYiPgotPHA+U2VsZWN0ZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDYiIGhlYWRlcnM9InIxYzEtdDYiPgotPHA+RGVmYXVsdCBBY2Nlc3M8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ2IHIxYzItdDYiPgotPHA+U2VsZWN0IHdoZXRoZXIgdGhlIGFjY2VzcyB0byB0aGUgZW50aXR5IGlzIGZpZWxkLWJhc2VkIG9yIHByb3BlcnR5LWJhc2VkLCBhcyBkZWZpbmVkIGluIEpQQSBzcGVjaWZpY2F0aW9uLjwvcD4KLTx1bD4KLTxsaT4KLTxwPk5vbmUgJm5kYXNoOyBObyBhY2Nlc3MgdHlwZSBzcGVjaWZpZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Qcm9wZXJ0eS1iYXNlZDwvc3Bhbj4gJm5kYXNoOyBQZXJzaXN0ZW50IHN0YXRlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMuIFRoZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzIG11c3QgYmUgPHNwYW4gY2xhc3M9ImJvbGQiPnB1YmxpYzwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPnByaXZhdGU8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RmllbGQtYmFzZWQ8L3NwYW4+ICZuZGFzaDsgSW5zdGFuY2UgdmFyaWFibGVzIGFyZSBhY2Nlc3NlZCBkaXJlY3RseS4gQWxsIG5vbi10cmFuc2llbnQgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBwZXJzaXN0ZW50LjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NiByMWMzLXQ2Ij4KLTxwPk5vbmU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5BZGQgdG8gcGVyc2lzdGVuY2UgdW5pdDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDYgcjFjMi10NiI+Ci08cD5EZXNpZ25hdGVzIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGZvciB0aGlzIG9iamVjdCBtYXAgZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ2IHIxYzMtdDYiPgotPHA+U2VsZWN0ZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MmQzNmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowNyAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPk1hcHBpbmcgRmlsZSBXaXphcmQgUHJvcGVydGllczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hcHBpbmcgRmlsZSBXaXphcmQgUHJvcGVydGllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjE3NCIgbmFtZT0ic3RocmVmMTc0Ij48L2E+Ci08aDE+R2VuZXJhdGUgRERMIGZyb20gRW50aXRpZXMgV2l6YXJkPC9oMT4KLTxwPlRoZSBHZW5lcmF0ZSBEREwgZnJvbSBFbnRpdGllcyBXaXphcmQgdG8gcXVpY2tseSBjcmVhdGUgRERMIHNjcmlwdHMgZnJvbSB5b3VyIHBlcnNpc3RlbnQgZW50aXRpZXMuIERhbGkgYXV0b21hdGljYWxseSBjcmVhdGVzIHRoZSBuZWNlc3NhcnkgcHJpbWFyeSBhbmQgZm9yZWlnbiBrZXlzLCBiYXNlZCBvbiB0aGUgZW50aXR5IG1hcHBpbmdzLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxYjVmYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA3IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+UHJvcGVydHkgcGFnZXM8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcm9wZXJ0eSBwYWdlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNESklJRyIgbmFtZT0iQ0FDREpJSUciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlByb3BlcnR5IHBhZ2VzPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjE2YzBiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDcgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5HZW5lcmFsIGluZm9ybWF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNDQUdHQyIgbmFtZT0iQ0FDQ0FHR0MiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYWwgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgR2VuZXJhbCBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDciPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ3Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10NyI+RGVmYXVsdDwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjNC10NyI+QXZhaWxhYmxlIGZvciBFbnRpdHkmbmJzcDtUeXBlPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij5NYXBwaW5nIFR5cGUgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NyByMWMyLXQ3Ij5DbGlja2luZyB0aGUgbmFtZSBvZiB0aGUgbWFwcGluZyB0eXBlLCB3aGljaCBpcyByZXByZXNlbnRlZCBhcyBhIGh5cGVybGluaywgaW52b2tlcyB0aGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cuIFVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGVudGl0eTogTWFwcGVkIFN1cGVyY2xhc3MsIEVtYmVkZGFibGUgb3IgdGhlIGRlZmF1bHQgbWFwcGluZyB0eXBlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDcgcjFjMy10NyI+RW50aXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NyByMWM0LXQ3Ij48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT4sIDxhIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJGRUlDRSI+RW1iZWRkYWJsZTwvYT4sIGFuZCA8YSBocmVmPSJ0YXNrczAwOC5odG0jQkFCREFHQ0kiPk1hcHBlZCBzdXBlcmNsYXNzPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NyByMWMyLXQ3Ij5UaGUgbmFtZSBvZiB0aGlzIGVudGl0eS4gQnkgZGVmYXVsdCwgdGhlIGNsYXNzIG5hbWUgaXMgdXNlZCBhcyB0aGUgZW50aXR5IG5hbWUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NyByMWMzLXQ3Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ3IHIxYzQtdDciPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij5UYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDcgcjFjMi10NyI+VGhlIGRlZmF1bHQgZGF0YWJhc2UgdGFibGUgaW5mb3JtYXRpb24gZm9yIHRoaXMgZW50aXR5LiBUaGVzZSBmaWVsZHMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGluZm9ybWF0aW9uIGluIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTAuaHRtI0NBQ0lKQkdIIj5BdHRyaWJ1dGUgb3ZlcnJpZGVzPC9hPiBhcmVhLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDcgcjFjMy10NyI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NyByMWM0LXQ3Ij48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NyIgaGVhZGVycz0icjFjMS10NyI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDcgcjFjMi10NyI+VGhlIG5hbWUgb2YgdGhlIHByaW1hcnkgZGF0YWJhc2UgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NyByMWMzLXQ3Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ3IHIxYzQtdDciPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij4mbmJzcDsmbmJzcDtDYXRhbG9nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NyByMWMyLXQ3Ij5UaGUgZGF0YWJhc2UgY2F0YWxvZyB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDcgcjFjMy10NyI+QXMgZGVmaW5lZCBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ3IHIxYzQtdDciPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij4mbmJzcDsmbmJzcDtTY2hlbWE8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ3IHIxYzItdDciPlRoZSBkYXRhYmFzZSBzY2hlbWEgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ3IHIxYzMtdDciPkFzIGRlZmluZWQgaW4gPGNvZGU+b3JtLnhtbDwvY29kZT4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10NyByMWM0LXQ3Ij48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1MWJlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEwLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA3IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+QXR0cmlidXRlIG92ZXJyaWRlczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkF0dHJpYnV0ZSBvdmVycmlkZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDSUpCR0giIG5hbWU9IkNBQ0lKQkdIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5BdHRyaWJ1dGUgb3ZlcnJpZGVzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxNzgiIG5hbWU9InN0aHJlZjE3OCI+PC9hPjxhIGlkPSJzdGhyZWYxNzkiIG5hbWU9InN0aHJlZjE3OSI+PC9hPjxhIGlkPSJzdGhyZWYxODAiIG5hbWU9InN0aHJlZjE4MCI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L3NwYW4+IGFyZWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBzZXR0aW5ncyBzcGVjaWZpZWQgaW4gdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jQ0FDQ0FHR0MiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+IGFyZWEgb2YgYW4gYXR0cmlidXRlLiBBdHRyaWJ1dGUgb3ZlcnJpZGVzIGdlbmVyYWxseSBvdmVycmlkZS9jb25maWd1cmUgYXR0cmlidHVlcyB0aGF0IGFyZSBpbmhlcml0ZWQgb3IgZW1iZWRkZWQuPC9wPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgQXR0cmlidXRlIG92ZXJyaWRlIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgZWFjaCBlbnRpdHkgdHlwZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10OCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDgiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ4Ij5EZWZhdWx0PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWM0LXQ4Ij5BdmFpbGFibGUgZm9yIEVudGl0eSZuYnNwO1R5cGU8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzItdDgiPlNwZWNpZnkgYSBwcm9wZXJ0eSBvciBmaWVsZCB0byBiZSBvdmVycmlkZGVuIChmcm9tIHRoZSBkZWZhdWx0IG1hcHBpbmdzKS4gU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzMtdDgiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDggcjFjNC10OCI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPkpvaW4gQ29sdW1uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMi10OCI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OCByMWMzLXQ4Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ4IHIxYzQtdDgiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jQ0FDQ0FHR0MiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDExLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5ODQzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDExLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA3IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+U2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JISURBIiBuYW1lPSJDQUNCSElEQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxODEiIG5hbWU9InN0aHJlZjE4MSI+PC9hPjxhIGlkPSJzdGhyZWYxODIiIG5hbWU9InN0aHJlZjE4MiI+PC9hPjxhIGlkPSJzdGhyZWYxODMiIG5hbWU9InN0aHJlZjE4MyI+PC9hPjxhIGlkPSJzdGhyZWYxODQiIG5hbWU9InN0aHJlZjE4NCI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlNlY29uZGFyeSBUYWJsZXM8L3NwYW4+IGFyZWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyB0byBhc3NvY2lhdGUgYWRkaXRpb25hbCB0YWJsZXMgd2l0aCBhbiBlbnRpdHkuIFVzZSB0aGlzIGFyZWEgaWYgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIGVudGl0eSBpcyBzcHJlYWQgYWNyb3NzIG11bHRpcGxlIHRhYmxlcy48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZDJmMmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDcgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0ZIR0hFIiBuYW1lPSJDQUNGSEdIRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SW5oZXJpdGFuY2UgaW5mb3JtYXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE4NSIgbmFtZT0ic3RocmVmMTg1Ij48L2E+PGEgaWQ9InN0aHJlZjE4NiIgbmFtZT0ic3RocmVmMTg2Ij48L2E+VGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGF2YWlsYWJsZSBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkluaGVyaXRhbmNlPC9zcGFuPiBhcmVhIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgSW5oZXJpdGFuY2UgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgSW5oZXJpdGFuY2UgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ5Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10OSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDkiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDkiIGhlYWRlcnM9InIxYzEtdDkiPlN0cmF0ZWd5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OSByMWMyLXQ5Ij5TcGVjaWZ5IHRoZSBzdHJhdGVneSB0byB1c2Ugd2hlbiBtYXBwaW5nIGEgY2xhc3Mgb3IgY2xhc3MgaGllcmFyY2h5OgotPHVsPgotPGxpPgotPHA+U2luZ2xlIHRhYmxlICZuZGFzaDsgQWxsIGNsYXNzZXMgaW4gdGhlIGhpZXJhcmNoeSBhcmUgbWFwcGVkIHRvIGEgc2luZ2xlIHRhYmxlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Kb2luZWQgJm5kYXNoOyBUaGUgcm9vdCBvZiB0aGUgaGllcmFyY2h5IGlzIG1hcHBlZCB0byBhIHNpbmdsZSB0YWJsZTsgZWFjaCBjaGlsZCBtYXBzIHRvIGl0cyBvd24gdGFibGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPlRhYmxlIHBlciBjbGFzcyAmbmRhc2g7IEVhY2ggY2xhc3MgaXMgbWFwcGVkIHRvIGEgc2VwYXJhdGUgdGFibGUuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ5IHIxYzMtdDkiPlNpbmdsZSB0YWJsZTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ5IiBoZWFkZXJzPSJyMWMxLXQ5Ij5EaXNjcmltaW5hdG9yIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDkgcjFjMi10OSI+VXNlIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIHdoZW4gdXNpbmcgYSA8c3BhbiBjbGFzcz0iYm9sZCI+U2luZ2xlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+Sm9pbmVkPC9zcGFuPiBpbmhlcml0YW5jZSBzdHJhdGVneS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ5IHIxYzMtdDkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ5IiBoZWFkZXJzPSJyMWMxLXQ5Ij5EaXNjcmltaW5hdG9yIFR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ5IHIxYzItdDkiPlNldCB0aGlzIGZpZWxkIHRvIHNldCB0aGUgZGlzY3JpbWluYXRvciB0eXBlIHRvIDxjb2RlPkNoYXI8L2NvZGU+IG9yIDxjb2RlPkludGVnZXI8L2NvZGU+IChpbnN0ZWFkIG9mIGl0cyBkZWZhdWx0OiA8Y29kZT5TdHJpbmc8L2NvZGU+KS4gVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5EaXNjcmltaW5hdG9yIFZhbHVlPC9zcGFuPiBtdXN0IGNvbmZvcm0gdG8gdGhpcyB0eXBlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDkgcjFjMy10OSI+U3RyaW5nPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDkiIGhlYWRlcnM9InIxYzEtdDkiPkRpc2NyaW1pbmF0b3IgVmFsdWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ5IHIxYzItdDkiPlNwZWNpZnkgdGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGFuIGVudGl0eSBpbiB0aGlzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gVGhlIHZhbHVlIG11c3QgY29uZm9ybSB0byB0aGUgc3BlY2lmaWVkIDxzcGFuIGNsYXNzPSJib2xkIj5EaXNjcmltaW5hdG9yIFR5cGU8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDkgcjFjMy10OSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDkiIGhlYWRlcnM9InIxYzEtdDkiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDkgcjFjMi10OSI+VXNlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHByaW1hcnkga2V5IGpvaW4gY29sdW1ucy4gU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBzZWxlY3QgbmV3IEpvaW4gQ29sdW1uLgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB3aXRoIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDkgcjFjMy10OSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDUxNjc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDcgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMTg3IiBuYW1lPSJzdGhyZWYxODciPjwvYT4KLTxoMT5RdWVyaWVzPC9oMT4KLTxwPlVzZSB0aGUgcXVlcmllcyBhcmVhIG9mIHRoZSBKUEEgRGV0YWlscyB2aWV3IHRvIGNyZWF0ZSBuYW1lZCBxdWVyaWVzIGFuZCBuYW1lZCBuYXRpdmUgcXVlcmllcy4gUmVmZXIgdG8gPGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQklHQkdHIj4iQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI8L2E+IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJJR0JHRyI+Q3JlYXRpbmcgTmFtZWQgUXVlcmllczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MzExYmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowNyAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKb2luIFRhYmxlIEluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JBRUJDIiBuYW1lPSJDQUNCQUVCQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvaDE+Ci08cD5Vc2UgYXJlYSB0byBzcGVjaWZ5IGEgbWFwcGVkIGNvbHVtbiBmb3Igam9pbmluZyBhbiBlbnRpdHkgYXNzb2NpYXRpb24uIEJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBhdmFpbGFibGUgb24gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Kb2luIFRhYmxlPC9zcGFuPiBhcmVhIGluIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj50aGUgSlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIDxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT4gYW5kIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+IG1hcHBpbmcgdHlwZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gVGFibGUgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gVGFibGUgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDExIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTEiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDExIiBoZWFkZXJzPSJyMWMxLXQxMSI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDExIHIxYzItdDExIj5OYW1lIG9mIHRoZSBqb2luIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMSByMWMzLXQxMSI+QnkgZGVmYXVsdCwgdGhlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgcHJpbWFyeSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdGllcyBjb25jYXRlbmF0ZWQgd2l0aCBhbiB1bmRlcnNjb3JlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPjxhIGlkPSJDQUNCQkRGRyIgbmFtZT0iQ0FDQkJERkciPjwvYT5Kb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMSByMWMyLXQxMSI+PGEgaWQ9InN0aHJlZjIwNiIgbmFtZT0ic3RocmVmMjA2Ij48L2E+PGEgaWQ9InN0aHJlZjIwNyIgbmFtZT0ic3RocmVmMjA3Ij48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTEgcjFjMy10MTEiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPkludmVyc2UgSm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTEgcjFjMi10MTEiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMSByMWMzLXQxMSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDMwLmh0bSNDQUNDR0VIQyI+RWRpdCBKb2luIENvbHVtbnMgRGlhbG9nPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQwYjZjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA3IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0ZDRUpDIiBuYW1lPSJDQUNGQ0VKQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Kb2luIFRhYmxlPC9zcGFuPiBhcmVhIGluIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgPGEgaHJlZj0idGFza3MwMTUuaHRtI0JBQkhGQUZKIj5NYW55LXRvLW9uZSBtYXBwaW5nPC9hPiBhbmQgPGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+IG1hcHBpbmcgdHlwZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBDb2x1bW5zIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTIiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxMiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDEyIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxMiIgaGVhZGVycz0icjFjMS10MTIiPkpvaW4gQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTIgcjFjMi10MTIiPjxhIGlkPSJzdGhyZWYyMDgiIG5hbWU9InN0aHJlZjIwOCI+PC9hPjxhIGlkPSJzdGhyZWYyMDkiIG5hbWU9InN0aHJlZjIwOSI+PC9hPlNwZWNpZnkgYSBtYXBwZWQgY29sdW1uIGZvciBqb2luaW5nIGFuIGVudGl0eSBhc3NvY2lhdGlvbi4gVGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QEpvaW5Db2x1bTwvY29kZT4gYXR0cmlidXRlLgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiwgdGhlbiBBZGQsIEVkaXQsIG9yIFJlbW92ZSB0aGUgam9pbiBjb2x1bW5zLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEyIHIxYzMtdDEyIj5CeSBkZWZhdWx0LCB0aGUgbWFwcGluZyBpcyBhc3N1bWVkIHRvIGhhdmUgYSBzaW5nbGUgam9pbi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZlcmVuY2UwMzAuaHRtI0NBQ0NHRUhDIj5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWU2MTFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDcgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5HZW5lcmFsIGluZm9ybWF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNDQUNHSCIgbmFtZT0iQ0FDQ0FDR0giPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYWwgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgR2VuZXJhbCBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTQiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE0Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPlBhY2thZ2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNCByMWMyLXQxNCI+VGhlIEphdmEgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLiBDbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiBhbmQgc2VsZWN0IHRoZSBwYWNrYWdlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTQgcjFjMy10MTQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPlNjaGVtYTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE0IHIxYzItdDE0Ij5UaGUgZGF0YWJhc2Ugc2NoZW1hIHRoYXQgY29udGFpbnMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7c2NoZW1hJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMzLXQxNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+Q2F0YWxvZzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE0IHIxYzItdDE0Ij5UaGUgZGF0YWJhc2UgY2F0YWxvZyB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O2NhdGFsb2cmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE0IHIxYzMtdDE0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5BY2Nlc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNCByMWMyLXQxNCI+U3BlY2lmeSB0aGUgZGVmYXVsdCBhY2Nlc3MgbWV0aG9kIGZvciB0aGUgdmFyaWFibGVzIGluIHRoZSBwcm9qZWN0OgotPHVsPgotPGxpPgotPHA+UHJvcGVydHk8L3A+Ci08L2xpPgotPGxpPgotPHA+RmllbGQ8L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDthY2Nlc3MmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE0IHIxYzMtdDE0Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YTdlMTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDggLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5QZXJzaXN0ZW5jZSBVbml0IGluZm9ybWF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUGVyc2lzdGVuY2UgVW5pdCBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNFQUdCRyIgbmFtZT0iQ0FDRUFHQkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgUGVyc2lzdGVuY2UgVW5pdCBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuIFRoZXNlIGZpZWxkcyBhcmUgY29udGFpbmVkIGluIHRoZSA8Y29kZT4mbHQ7cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPlhNTCBNYXBwaW5nIERhdGEgQ29tcGxldGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNSByMWMyLXQxNSI+U3BlY2lmaWVzIHRoYXQgdGhlIEphdmEgY2xhc3NlcyBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQgYXJlIGZ1bGx5IHNwZWNpZmllZCBieSB0aGVpciBtZXRhZGF0YS4gQW55IGFubm90YXRpb25zIHdpbGwgYmUgaWdub3JlZC4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDt4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTUgcjFjMy10MTUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPlNjaGVtYTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE1IHIxYzItdDE1Ij5UaGUgZGF0YWJhc2Ugc2NoZW1hIHRoYXQgY29udGFpbnMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7c2NoZW1hJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNSByMWMzLXQxNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+Q2F0YWxvZzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE1IHIxYzItdDE1Ij5UaGUgZGF0YWJhc2UgY2F0YWxvZyB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O2NhdGFsb2cmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5BY2Nlc3MgVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE1IHIxYzItdDE1Ij5TcGVjaWZ5IGhvdyB0aGUgZW50aXR5IGl0cyBhY2Nlc3MgaW5zdGFuY2UgdmFyaWFibGVzLgotPHVsPgotPGxpPgotPHA+UHJvcGVydHkgJm5kYXNoOyBQZXJzaXN0ZW50IHN0YXRlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMuIFRoZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzIG11c3QgYmUgPHNwYW4gY2xhc3M9ImJvbGQiPnB1YmxpYzwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPnByaXZhdGU8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5GaWVsZCAmbmRhc2g7IEluc3RhbmNlIHZhcmlhYmxlcyBhcmUgYWNjZXNzZWQgZGlyZWN0bHkuIEFsbCBub24tdHJhbnNpZW50IGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgcGVyc2lzdGVudC48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE1IHIxYzMtdDE1Ij5Qcm9wZXJ0eTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPkNhc2NhZGUgUGVyc2lzdDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE1IHIxYzItdDE1Ij5BZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucyBpbiBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtjYXNjYWRlLXBlcnNpc3QmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YzIwMzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowOCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJwZXJzaXN0ZW5jZS54bWwgRWRpdG9yIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUNDSElEIiBuYW1lPSJDSUFDQ0hJRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvaDE+Ci08cD5UaGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvciBwcm92aWRlcyBhbiBpbnRlcmZhY2VzIHRoYXQgZW5hYmxlcyB5b3UgdG8gdXBkYXRlIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZS4gRm9yIHByb2plY3RzIHVzaW5nIHRoZSBFY2xpcHNlTGluayBwbGF0Zm9ybSAsdGhlIHBlcmlzaXN0ZW5jZS54bWwgRWRpdG9yIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDE5Lmh0bSNDSUFDSUZHSiI+R2VuZXJhbDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIwLmh0bSNDSUFGRkpJRSI+Q29ubmVjdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIxLmh0bSNDSUFKQUZFRyI+Q3VzdG9taXphdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIyLmh0bSNDSUFCRURDSCI+Q2FjaGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIzLmh0bSNDSUFCR0hISSI+TG9nZ2luZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI0Lmh0bSNDSUFGSkNIRSI+T3B0aW9uczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI1Lmh0bSNDSUFDQ0ZDQiI+U2NoZW1hIEdlbmVyYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNi5odG0jQ0lBSEpERkYiPlByb3BlcnRpZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jQ0lBSENKQUgiPlNvdXJjZTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPkZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybSwgdGhlIGZvbGxvd2luZyBzdWJzZXQgb2YgdGhlc2UgcGFnZXMgaXMgYXZhaWxhYmxlOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOS5odG0jQ0lBQ0lGR0oiPkdlbmVyYWw8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNi5odG0jQ0lBSEpERkYiPlByb3BlcnRpZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jQ0lBSENKQUgiPlNvdXJjZTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxOS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTBjMWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxOS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIxLCAyMDA4IDExOjE2OjE3IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+R2VuZXJhbDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYWwiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFDSUZHSiIgbmFtZT0iQ0lBQ0lGR0oiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYWw8L2gxPgotPHA+VGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgR2VuZXJhbCBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyMTYiIG5hbWU9InN0aHJlZjIxNiI+PC9hPjxhIGlkPSJzdGhyZWYyMTciIG5hbWU9InN0aHJlZjIxNyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgR2VuZXJhbCBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBHZW5lcmFsIFBhZ2UiIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwmcnNxdW87cyBHZW5lcmFsIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE2Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTYiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4KLTxwPk5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWMyLXQxNiI+Ci08cD5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWMzLXQxNiI+Ci08cD5UaGUgcHJvamVjdCBuYW1lLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPgotPHA+UGVyc2lzdGVuY2UgUHJvdmlkZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNiByMWMyLXQxNiI+Ci08cD5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTYgcjFjMy10MTYiPgotPHA+RGV0ZXJtaW5lZCBieSB0aGUgc2VydmVyLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPgotPHA+RGVzY3JpcHRpb248L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNiByMWMyLXQxNiI+Ci08cD5FbnRlciBhIGRlc2NyaXB0aW9uIGZvciB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuIFRoaXMgaXMgYW4gb3B0aW9uYWwgcHJvcGVydHkuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPgotPHA+TWFuYWdlZCBDbGFzc2VzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTYgcjFjMi10MTYiPgotPHA+QWRkIG9yIHJlbW92ZSB0aGUgY2xhc3NlcyBtYW5hZ2VkIHRocm91Z2ggdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPgotPHA+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTYgcjFjMi10MTYiPgotPHA+U2VsZWN0IHRvIGluY2x1ZGUgYWxsIGFubm90YXRlZCBlbnRpdHkgY2xhc3NlcyBpbiB0aGUgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNiByMWMzLXQxNiI+Ci08cD5GYWxzZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPgotPHA+WE1MIE1hcHBpbmcgRmlsZXM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNiByMWMyLXQxNiI+Ci08cD5BZGQgb3IgcmVtb3ZlIHRoZSBvYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIFhNTCBmaWxlcyB0aGF0IGRlZmluZSB0aGUgY2xhc3NlcyB0byBiZSBtYW5hZ2VkIGJ5IHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE2IHIxYzMtdDE2Ij4KLTxwPk1ldGEtSU5GXG9ybS54bWw8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5YTViMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIwLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowOCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkNvbm5lY3Rpb248L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDb25uZWN0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZGSklFIiBuYW1lPSJDSUFGRkpJRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29ubmVjdGlvbjwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgQ29ubmVjdGlvbiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyMTkiIG5hbWU9InN0aHJlZjIxOSI+PC9hPjxhIGlkPSJzdGhyZWYyMjAiIG5hbWU9InN0aHJlZjIyMCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgQ29ubmVjdGlvbiBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBDb25uZWN0aW9uIFBhZ2UiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZS54bWwgZWRpdG9yJnJzcXVvO3MgY29ubmVjdGlvbiBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE3Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTciPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+Ci08cD5UcmFuc2FjdGlvbiBUeXBlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTcgcjFjMi10MTciPgotPHA+U3BlY2lmeSBpZiB0aGUgY29ubmVjdGlvbiBmb3IgdGhpcyBwZXJzaXN0ZW5jZSB1bml0IHVzZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHJhbnNhY3Rpb24gdHlwZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkRlZmF1bHQ8L3NwYW4+IC0tIFNlbGVjdCB0byB1c2UgdGhlIGNvbnRhaW5lciB1c2VkIGJ5IHRoZSBjb250YWluZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5KVEE8L3NwYW4+IChKYXZhIFRyYW5zYWN0aW9uIEFQSSkgLS0gVHJhbnNhY3Rpb25zIG9mIHRoZSBKYXZhIEVFIHNlcnZlci48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlJlc291cmNlIExvY2FsPC9zcGFuPiAtLSBOYXRpdmUgYWN0aW9ucyBvZiBhIEpEQkMgZHJpdmVyIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgYSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTcgcjFjMy10MTciPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPgotPHA+QmF0Y2ggV3JpdGluZzwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE3IHIxYzItdDE3Ij4KLTxwPlNwZWNpZnkgdGhlIHVzZSBvZiBiYXRjaCB3cml0aW5nIHRvIG9wdGltaXplIHRyYW5zYWN0aW9ucyB3aXRoIG11bHRpcGxlIHdyaXRlIG9wZXJhdGlvbnMuPC9wPgotPHA+U2V0IHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGludG8gdGhlIHNlc3Npb24gYXQgZGVwbG95bWVudCB0aW1lLjwvcD4KLTxwPk5vdGU6IFRoaXMgcHJvcGVydHkgYXBwbGllcyB3aGVuIHVzZWQgYm90aCBpbiBhIEphdmEgU0UgYW5kIEphdmEgRUUgZW52aXJvbm1lbnQuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlcyBmb3Igb3JhY2xlLnRvcGxpbmsuY29uZmlnLkJhdGNoV3JpdGluZzo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+SkRCQzwvc3Bhbj4mbmRhc2g7VXNlIEpEQkMgYmF0Y2ggd3JpdGluZy48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkJ1ZmZlcmVkPC9zcGFuPiZuZGFzaDtEbyBub3QgdXNlIGVpdGhlciBKREJDIGJhdGNoIHdyaXRpbmcgbm9yIG5hdGl2ZSBwbGF0Zm9ybSBiYXRjaCB3cml0aW5nLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+T3JhY2xlSkRCQzwvc3Bhbj4mbmRhc2g7VXNlIGJvdGggSkRCQyBiYXRjaCB3cml0aW5nIGFuZCBPcmFjbGUgbmF0aXZlIHBsYXRmb3JtIGJhdGNoIHdyaXRpbmcuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ob25lPC9zcGFuPiZuZGFzaDtEbyBub3QgdXNlIGJhdGNoIHdyaXRpbmcgKHR1cm4gaXQgb2ZmKS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE3IHIxYzMtdDE3Ij4KLTxwPk5vbmU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij4KLTxwPkpUQSBEYXRhIFNvdXJjZSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTcgcjFjMi10MTciPgotPHA+SWYgeW91IHNlbGVjdGVkIDxzcGFuIGNsYXNzPSJib2xkIj5KVEE8L3NwYW4+IGFzIHRoZSB0cmFuc2FjdGlvbiB0eXBlLCB0aGVuIGVudGVyIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IEpUQSBkYXRhIHNvdXJjZSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTcgcjFjMy10MTciPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPgotPHA+Tm9uLUpUQSBEYXRhIFNvdXJjZSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTcgcjFjMi10MTciPgotPHA+SWYgeW91IHNlbGVjdGVkIDxzcGFuIGNsYXNzPSJib2xkIj5SZXNvdXJjZSBMb2NhbDwvc3Bhbj4gYXMgdGhlIHRyYW5zYWN0aW9uIHR5cGUsIHRoZW4gZW50ZXIgdGhlIG5hbWUgb2YgdGhlIG5vbi1KVEEgZGF0YSBzb3VyY2UuPC9wPgotPHA+VGhpcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNyByMWMzLXQxNyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+Ci08cD4mbmJzcDsmbmJzcDtCaW5kIFBhcmFtZXRlcnM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNyByMWMyLXQxNyI+Ci08cD5Db250cm9sIHdoZXRoZXIgb3Igbm90IHRoZSBxdWVyeSB1c2VzIHBhcmFtZXRlciBiaW5kaW5nLjwvcD4KLTxwPk5vdGU6IFRoaXMgcHJvcGVydHkgYXBwbGllcyB3aGVuIHVzZWQgaW4gYSBKYXZhIFNFIGVudmlyb25tZW50LjwvcD4KLTxwPlRoaXMgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTcgcjFjMy10MTciPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPgotPHA+RWNsaXBzZUxpbmsgQ29ubmVjdGlvbiBQb29sPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTcgcjFjMi10MTciPgotPHA+RGVmaW5lIHRoZSBjb25uZWN0aW9uIHBvb2wgZHJpdmVyLCBVUkwsIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQuPC9wPgotPHA+VGhlc2UgcHJvcGVydGllcyBhcmUgbm90ZSBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE3IHIxYzMtdDE3Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij4KLTxwPiZuYnNwOyZuYnNwO1JlYWQgQ29ubmVjdGlvbjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE3IHIxYzItdDE3Ij4KLTxwPlRoZSBtYXhpbXVtIGFuZCBtaW5pbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyBhbGxvd2VkIGluIHRoZSBKREJDIHJlYWQgY29ubmVjdGlvbiBwb29sLjwvcD4KLTxwPk5vdGU6IFRoZXNlIHByb3BlcnRpZXMgYXBwbHkgd2hlbiB1c2VkIGluIGEgSmF2YSBTRSBlbnZpcm9ubWVudC48L3A+Ci08cD5UaGVzZSBwcm9wZXJ0aWVzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE3IHIxYzMtdDE3Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij4KLTxwPiZuYnNwOyZuYnNwO1dyaXRlIENvbm5lY3Rpb248L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxNyByMWMyLXQxNyI+Ci08cD5UaGUgbWF4aW11bSBhbmQgbWluaW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgYWxsb3dlZCBpbiB0aGUgSkRCQyB3cml0ZSBjb25uZWN0aW9uIHBvb2wuPC9wPgotPHA+Tm90ZTogVGhlc2UgcHJvcGVydGllcyBhcHBseSB3aGVuIHVzZWQgaW4gYSBKYXZhIFNFIGVudmlyb25tZW50LjwvcD4KLTxwPlRoZXNlIHByb3BlcnRpZXMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTcgcjFjMy10MTciPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzZlOWQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA4IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+Q3VzdG9taXphdGlvbjwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkN1c3RvbWl6YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBSkFGRUciIG5hbWU9IkNJQUpBRkVHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DdXN0b21pemF0aW9uPC9oMT4KLTxwPlRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSBDdXN0b21pemF0aW9uIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjIyMSIgbmFtZT0ic3RocmVmMjIxIj48L2E+PGEgaWQ9InN0aHJlZjIyMiIgbmFtZT0ic3RocmVmMjIyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBDdXN0b21pemF0aW9uIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIEN1c3RvbWl6YXRpb24gUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvciZyc3F1bztzIEN1c3RvbWl6YXRpb24gcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTgiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxOCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE4Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxOCIgaGVhZGVycz0icjFjMS10MTgiPgotPHA+V2VhdmluZzwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE4IHIxYzItdDE4Ij4KLTxwPlNwZWNpZmllcyBpZiB3ZWF2aW5nIG9mIHRoZSBlbnRpdHkgY2xhc3NlcyBpcyBwZXJmb3JtZWQuIFRoZSBFY2xpcHNlTGluayBKUEEgcGVyc2lzdGVuY2UgcHJvdmlkZXIgdXNlcyB3ZWF2aW5nIHRvIGVuaGFuY2UgSlBBIGVudGl0aWVzIGZvciBzdWNoIHByb3BlcnRpZXMgYXMgbGF6eSBsb2FkaW5nLCBjaGFuZ2UgdHJhY2tpbmcsIGZldGNoIGdyb3VwcywgYW5kIGludGVybmFsIG9wdGltaXphdGlvbnMuIFNlbGVjdCBmcm9tIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm8gV2VhdmluZzwvc3Bhbj48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPldlYXZlIER5bmFtaWNhbGx5PC9zcGFuPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+V2VhdmUgU3RhdGljYWxseTwvc3Bhbj4gLS0gVXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBwbGFuIHRvIGV4ZWN1dGUgeW91ciBhcHBsaWNhdGlvbiBvdXRzaWRlIG9mIGEgSmF2YSBFRSA1IGNvbnRhaW5lciBpbiBhbiBlbnZpcm9ubWVudCB0aGF0IGRvZXMgbm90IHBlcm1pdCB0aGUgdXNlIG9mIDxjb2RlPi1qYXZhYWdlbnQ6ZWNsaXBzZWxpbmsuamFyPC9jb2RlPiBvbiB0aGUgSlZNIGNvbW1hbmQgbGluZS4gVGhpcyBhc3N1bWVzIHRoYXQgY2xhc3NlcyBoYXZlIGFscmVhZHkgYmVlbiBzdGF0aWNhbGx5IHdvdmVuLiBSdW4gdGhlIHN0YXRpYyB3ZWF2ZXIgb24gdGhlIGNsYXNzZXMgYmVmb3JlIGRlcGxveWluZyB0aGVtLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTggcjFjMy10MTgiPgotPHA+V2VhdmUgRHluYW1pY2FsbHk8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij4KLTxwPiZuYnNwOyZuYnNwO1dlYXZpbmcgTGF6eTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE4IHIxYzItdDE4Ij4KLTxwPlNlbGVjdCB0aGlzIG9wdG9pbiB0byBlbmFibGUgbGF6eSB3ZWF2aW5nLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE4IHIxYzMtdDE4Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij4KLTxwPiZuYnNwOyZuYnNwO1dlYXZpbmcgRmV0Y2ggR3JvdXBzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTggcjFjMi10MTgiPgotPHA+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBmZXRjaCBncm91cHMgdGhyb3VnaCB3ZWF2aW5nLiBTZXQgdGhpcyBvcHRpb24gdG8gZmFsc2UgaWY6PC9wPgotPHVsPgotPGxpPgotPHA+VGhlcmUgaXMgbm8gd2VhdmluZy48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xhc3NlcyBzaG91bGQgbm90IGJlIGNoYW5nZWQgZHVyaW5nIHdlYXZpbmcgKGZvciBleGFtcGxlLCB3aGVuIGRlYnVnZ2luZykuPC9wPgotPC9saT4KLTwvdWw+Ci08cD5TZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSBmb3IgcGxhdGZvcm1zIHdoZXJlIGl0IGlzIG5vdCBzdXBwb3J0ZWQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTggcjFjMy10MTgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxOCIgaGVhZGVycz0icjFjMS10MTgiPgotPHA+Jm5ic3A7Jm5ic3A7V2VhdmluZyBDaGFuZ2UgVHJhY2tpbmc8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxOCByMWMyLXQxOCI+Ci08cD5TZWxlY3QgdGhpcyBvcHRpb24gdG8gdXNlIHdlYXZpbmcgdG8gZGV0ZWN0IHdoaWNoIGZpZWxkcyBvciBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgY2hhbmdlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE4IHIxYzMtdDE4Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij4KLTxwPiZuYnNwOyZuYnNwO1Rocm93IEV4Y2VwdGlvbnM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxOCByMWMyLXQxOCI+Ci08cD5TZWxlY3QgdGhpcyBvcHRpb24gdG8gc2V0IEVjbGlwc2VMaW5rIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBvciBsb2cgYSB3YXJuaW5nIHdoZW4gaXQgZW5jb3VudGVycyBhIHByb2JsZW0gd2l0aCBhbnkgb2YgdGhlIGZpbGVzIGxpc3RlZCBpbiBhIDxzcGFuIGNsYXNzPSJib2xkIj5wZXJzaXN0ZW5jZS54bWw8L3NwYW4+IGZpbGUgPGNvZGU+Jmx0O21hcHBpbmctZmlsZSZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTggcjFjMy10MTgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxOCIgaGVhZGVycz0icjFjMS10MTgiPgotPHA+U2Vzc2lvbiBDdXN0b21pemVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTggcjFjMi10MTgiPgotPHA+U2VsZWN0IGEgc2Vzc2lvbiBjdXN0b21pemVyIGNsYXNzOiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT5lY2xpcHNlbGluay50b29scy5zZXNzaW9uY29uZmlndXJhdGlvbi5TZXNzaW9uQ3VzdG9taXplcjwvY29kZT4gaW50ZXJmYWNlIGFuZCBwcm92aWRlcyBhIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLiBVc2UgdGhpcyBjbGFzcycgPGNvZGU+Y3VzdG9taXplPC9jb2RlPiBtZXRob2QsIHdoaWNoIHRha2VzIGFuIDxjb2RlPmVjbGlwc2VsaW5rLnNlc3Npb25zLlNlc3Npb248L2NvZGU+LCB0byBwcm9ncmFtbWF0aWNhbGx5IGFjY2VzcyBhZHZhbmNlZCBFY2xpcHNlTGluayBzZXNzaW9uIEFQSS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxOCByMWMzLXQxOCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+Ci08cD5EZXNjcmlwdG9yIEN1c3RvbWl6ZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxOCByMWMyLXQxOCI+Ci08cD5TZWxlY3QgYW4gRWNsaXBzZUxpbmsgZGVzY3JpcHRvciBjdXN0b21pemVyIGNsYXNzJm5kYXNoO2EgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPmVjbGlwc2VsaW5rLnRvb2xzLnNlc3Npb25jb25maWd1cmF0aW9uLkRlc2NyaXB0b3JDdXN0b21pemVyPC9jb2RlPiBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzIGEgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuIFVzZSB0aGlzIGNsYXNzJ3MgPGNvZGU+Y3VzdG9taXplPC9jb2RlPiBtZXRob2QsIHdoaWNoIHRha2VzIGFuIDxjb2RlPmVjbGlwc2VsaW5rLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvcjwvY29kZT4sIHRvIHByb2dyYW1tYXRpY2FsbHkgYWNjZXNzIGFkdmFuY2VkIEVjbGlwc2VMaW5rIGRlc2NyaXB0b3IgYW5kIG1hcHBpbmcgQVBJIGZvciB0aGUgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhlIEpQQSBlbnRpdHkgbmFtZWQgPGNvZGU+Jmx0O0VOVElUWSZndDs8L2NvZGU+LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE4IHIxYzMtdDE4Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPgotPHA+VGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDE4Lmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGlzIHBhZ2UgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5HZW5lcmljPC9zcGFuPiBwbGF0Zm9ybS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiNzU5Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowOCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkNhY2hpbmc8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDYWNoaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUJFRENIIiBuYW1lPSJDSUFCRURDSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q2FjaGluZzwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBDYWNoaW5nIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjIyMyIgbmFtZT0ic3RocmVmMjIzIj48L2E+PGEgaWQ9InN0aHJlZjIyNCIgbmFtZT0ic3RocmVmMjI0Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBDYWNoaW5nIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIENhY2hpbmcgUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sJnJzcXVvO3MgQ2FjaGluZyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIwIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjAiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+Ci08cD5EZWZhdWx0IENhY2hlIFR5cGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMCByMWMyLXQyMCI+Ci08cD5TZWxlY3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgYXMgdGhlIERlZmF1bHQgQ2FjaGUgVHlwZTo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U29mdCB3aXRoIFdlYWsgU3ViY2FjaGU8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIGlzIHNpbWlsYXIgdG8gPHNwYW4gY2xhc3M9ImJvbGQiPldlYWsgd2l0aCBIYXJkIFN1YmNhY2hlPC9zcGFuPiBleGNlcHQgdGhhdCBpdCBtYWludGFpbnMgYSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBzdWJjYWNoZSB0aGF0IHVzZXMgc29mdCByZWZlcmVuY2VzLiBUaGUgc2l6ZSBvZiB0aGUgc3ViY2FjaGUgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAuIFRoZSBzdWJjYWNoZSB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBvYmplY3RzIGFyZSBnYXJiYWdlLWNvbGxlY3RlZCBvbmx5IGlmIHRoZSBzeXN0ZW0gaXMgbG93IG9uIG1lbW9yeS48L3A+Ci08cD5Vc2UgdGhpcyBpZGVudGl0eSBtYXAgaW4gbW9zdCBjaXJjdW1zdGFuY2VzIGFzIGEgbWVhbnMgdG8gY29udHJvbCBtZW1vcnkgdXNlZCBieSB0aGUgY2FjaGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XZWVrIHdpdGggSGFyZCBTdWJjYWNoZTwvc3Bhbj4mbmRhc2g7VGhpcyBvcHRpb24gaXMgc2ltaWxhciB0byA8c3BhbiBjbGFzcz0iYm9sZCI+U29mdCB3aXRoIFdlYWs8L3NwYW4+IHN1YmNhY2hlIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhIG1vc3QgZnJlcXVlbnRseSB1c2VkIHN1YmNhY2hlIHRoYXQgdXNlcyBoYXJkIHJlZmVyZW5jZXMuIFVzZSB0aGlzIGlkZW50aXR5IG1hcCBpZiBzb2Z0IHJlZmVyZW5jZXMgYXJlIG5vdCBzdWl0YWJsZSBmb3IgeW91ciBwbGF0Zm9ybS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPldlYWs8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIGlzIHNpbWlsYXIgdG8gPHNwYW4gY2xhc3M9ImJvbGQiPkZ1bGw8L3NwYW4+LCBleGNlcHQgdGhhdCBvYmplY3RzIGFyZSByZWZlcmVuY2VkIHVzaW5nIHdlYWsgcmVmZXJlbmNlcy4gVGhpcyBvcHRpb24gdXNlcyBsZXNzIG1lbW9yeSB0aGFuIDxzcGFuIGNsYXNzPSJib2xkIj5GdWxsPC9zcGFuPiwgYWxsb3dzIGNvbXBsZXRlIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LjwvcD4KLTxwPlVzZSB0aGlzIGlkZW50aXR5IG1hcCBmb3IgdHJhbnNhY3Rpb25zIHRoYXQsIG9uY2Ugc3RhcnRlZCwgc3RheSBvbiB0aGUgc2VydmVyIHNpZGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Tb2Z0PC9zcGFuPiZuZGFzaDtUaGlzIG9wdGlvbiBpcyBzaW1pbGFyIHRvIDxzcGFuIGNsYXNzPSJib2xkIj5XZWFrPC9zcGFuPiBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZSBvYmplY3RzIHVzaW5nIHNvZnQgcmVmZXJlbmNlcy4gVGhpcyBpZGVudGl0eSBtYXAgZW5hYmxlcyBmdWxsIGdhcmJhZ2UgY29sbGVjdGlvbiB3aGVuIG1lbW9yeSBpcyBsb3cuIEl0IHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZ1bGw8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eTogYWxsIG9iamVjdHMgYXJlIGNhY2hlZCBhbmQgbm90IHJlbW92ZWQuPC9wPgotPHA+Tm90ZTogVGhpcyBwcm9jZXNzIG1heSBiZSBtZW1vcnktaW50ZW5zaXZlIHdoZW4gbWFueSBvYmplY3RzIGFyZSByZWFkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm9uZTwvc3Bhbj4mbmRhc2g7VGhpcyBvcHRpb24gZG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSBvYmplY3RzLlRoaXMgb3B0aW9uIGlzIG5vdCByZWNvbW1lbmRlZC48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIwIHIxYzMtdDIwIj4KLTxwPldlYWsgd2l0aCBoYXJkIHN1YmNhY2hlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+Ci08cD5EZWZhdWx0IENhY2hlIFNpemU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMCByMWMyLXQyMCI+Ci08cD5TZXQgdGhlIHNpemUgb2YgdGhlIGNhY2hlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIwIHIxYzMtdDIwIj4KLTxwPjEwMDA8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj4KLTxwPkRlZmF1bHQgU2hhcmVkIENhY2hlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjAgcjFjMi10MjAiPgotPHA+U3BlY2ZpZXMgaWYgY2FjaGVkIGluc3RhbmNlcyBzaG91bGQgYmUgaW4gdGhlIHNoYXJlZCBjYWNoZSBvciBpbiBhIGNsaWVudCBpc29sYXRlZCBjYWNoZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+Ci08cD5FbnRpdHkgQ2FjaGluZzwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIwIHIxYzItdDIwIj4KLTxwPlNwZWNpZnkgdGhlIGVudGl0eS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+Ci08cD4mbmJzcDsmbmJzcDtDYWNoZSBUeXBlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjAgcjFjMi10MjAiPgotPHA+U2VsZWN0IGEgY2FjaGUgdHlwZS4gU2VlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPkRlZmF1bHQgQ2FjaGU8L3NwYW4+PC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjAgcjFjMy10MjAiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPgotPHA+Jm5ic3A7Jm5ic3A7Q2FjaGUgU2l6ZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDIwIHIxYzItdDIwIj4KLTxwPlNldCB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjAgcjFjMy10MjAiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPgotPHA+Jm5ic3A7Jm5ic3A7U2hhcmVkIENhY2hlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MjAgcjFjMi10MjAiPgotPHA+U2VlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPkRlZmF1bHQgU2hhcmVkIENhY2hlPC9zcGFuPi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhpcyBwYWdlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJpYzwvc3Bhbj4gcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NzdlYTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDggLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5Mb2dnaW5nPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTG9nZ2luZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFCR0hISSIgbmFtZT0iQ0lBQkdISEkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkxvZ2dpbmc8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgTG9nZ2luZyBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjI1IiBuYW1lPSJzdGhyZWYyMjUiPjwvYT48YSBpZD0ic3RocmVmMjI2IiBuYW1lPSJzdGhyZWYyMjYiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPlByb3BlcnRpZXMgb2YgdGhlIExvZ2dpbmcgUGFnZTwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iUHJvcGVydGllcyBvZiB0aGUgTG9nZ2luZyBQYWdlIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBMb2dnaW5nIHBhZ2Ugb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3IuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIzIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj4KLTxwPkxvZ2dpbmcgTGV2ZWw8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMyByMWMyLXQyMyI+Ci08cD5TcGVjaWZpZXMgdGhlIGFtb3VudCBhbmQgZGV0YWlsIG9mIGxvZyBvdXRwdXQgYnkgc2VsZWN0aW5nIHRoZSBsb2cgbGV2ZWwgKGluIGFzY2VuZGluZyBvcmRlciBvZiBpbmZvcm1hdGlvbik6PC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlcyBmb3IgdGhlIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLkxldmVsPC9jb2RlPjo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+T0ZGPC9zcGFuPiZuZGFzaDtkaXNhYmxlcyBsb2dnaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5TRVZFUkU8L3NwYW4+Jm5kYXNoO2xvZ3MgZXhjZXB0aW9ucyBpbmRpY2F0aW5nIFRvcExpbmsgY2Fubm90IGNvbnRpbnVlLCBhcyB3ZWxsIGFzIGFueSBleGNlcHRpb25zIGdlbmVyYXRlZCBkdXJpbmcgbG9naW4uIFRoaXMgaW5jbHVkZXMgYSBzdGFjayB0cmFjZS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPldBUk5JTkc8L3NwYW4+Jm5kYXNoO2xvZ3MgZXhjZXB0aW9ucyB0aGF0IGRvIG5vdCBmb3JjZSBUb3BMaW5rIHRvIHN0b3AsIGluY2x1ZGluZyBhbGwgZXhjZXB0aW9ucyBub3QgbG9nZ2VkIHdpdGggc2V2ZXJlIGxldmVsLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgYSBzdGFjayB0cmFjZS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPklORk88L3NwYW4+Jm5kYXNoO2xvZ3MgdGhlIGxvZ2luL2xvZ291dCBwZXIgc2V2ZXIgc2Vzc2lvbiwgaW5jbHVkaW5nIHRoZSB1c2VyIG5hbWUuIEFmdGVyIGFjcXVpcmluZyB0aGUgc2Vzc2lvbiwgZGV0YWlsZWQgaW5mb3JtYXRpb24gaXMgbG9nZ2VkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Q09ORklHPC9zcGFuPiZuZGFzaDtsb2dzIG9ubHkgbG9naW4sIEpEQkMgY29ubmVjdGlvbiwgYW5kIGRhdGFiYXNlIGluZm9ybWF0aW9uLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RklORTwvc3Bhbj4mbmRhc2g7bG9ncyBTUUwuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GSU5FUjwvc3Bhbj4mbmRhc2g7c2ltaWxhciB0byB3YXJuaW5nLiBJbmNsdWRlcyBzdGFjayB0cmFjZS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZJTkVTVDwvc3Bhbj4mbmRhc2g7aW5jbHVkZXMgYWRkaXRpb25hbCBsb3cgbGV2ZWwgaW5mb3JtYXRpb24uPC9wPgotPC9saT4KLTwvdWw+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLmxldmVsIiB2YWx1ZT0iSU5GTyIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjMgcjFjMy10MjMiPgotPHA+SW5mbzwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPgotPHA+Jm5ic3A7Jm5ic3A7VGltZVN0YW1wPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjMgcjFjMi10MjMiPgotPHA+Q29udHJvbCB3aGV0aGVyIHRoZSB0aW1lc3RhbXAgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPnRydWU8L3NwYW4+Jm5kYXNoO2xvZyBhIHRpbWVzdGFtcC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPmZhbHNlPC9zcGFuPiZuZGFzaDtkbyBub3QgbG9nIGEgdGltZXN0YW1wLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsubG9nZ2luZy50aW1lc3RhbXAiIHZhbHVlPSJmYWxzZSIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjMgcjFjMy10MjMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPgotPHA+Jm5ic3A7Jm5ic3A7VGhyZWFkPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjMgcjFjMi10MjMiPgotPHA+Q29udHJvbCB3aGV0aGVyIGEgdGhyZWFkIGlkZW50aWZpZXIgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPnRydWU8L3NwYW4+Jm5kYXNoO2xvZyBhIHRocmVhZCBpZGVudGlmaWVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+ZmFsc2U8L3NwYW4+Jm5kYXNoO2RvIG5vdCBsb2cgYSB0aHJlYWQgaWRlbnRpZmllci48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIzIHIxYzMtdDIzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj4KLTxwPiZuYnNwOyZuYnNwO1Nlc3Npb248L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMyByMWMyLXQyMyI+Ci08cD5Db250cm9sIHdoZXRoZXIgYW4gRWNsaXBzZUxpbmsgc2Vzc2lvbiBpZGVudGlmaWVyIGlzIGxvZ2dlZCBpbiBlYWNoIGxvZyBlbnRyeS48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj50cnVlPC9zcGFuPiZuZGFzaDtsb2cgYSBFY2xpcHNlTGluayBzZXNzaW9uIGlkZW50aWZpZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5mYWxzZTwvc3Bhbj4mbmRhc2g7ZG8gbm90IGxvZyBhIEVjbGlwc2VMaW5rIHNlc3Npb24gaWRlbnRpZmllci48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcuc2Vzc2lvbiIgdmFsdWU9ImZhbHNlIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMyByMWMzLXQyMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDIzIiBoZWFkZXJzPSJyMWMxLXQyMyI+Ci08cD4mbmJzcDsmbmJzcDtFeGNlcHRpb25zPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjMgcjFjMi10MjMiPgotPHA+Q29udHJvbCB3aGV0aGVyIHRoZSBleGNlcHRpb25zIHRocm93biBmcm9tIHdpdGhpbiB0aGUgVG9wTGluayBjb2RlIGFyZSBsb2dnZWQgcHJpb3IgdG8gcmV0dXJuaW5nIHRoZSBleGNlcHRpb24gdG8gdGhlIGNhbGxpbmcgYXBwbGljYXRpb24uIEVuc3VyZXMgdGhhdCBhbGwgZXhjZXB0aW9ucyBhcmUgbG9nZ2VkIGFuZCBub3QgbWFza2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjb2RlLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPnRydWU8L3NwYW4+Jm5kYXNoO2xvZyBhbGwgZXhjZXB0aW9ucy48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPmZhbHNlPC9zcGFuPiZuZGFzaDtkbyBub3QgbG9nIGV4Y2VwdGlvbnMuPC9wPgotPC9saT4KLTwvdWw+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLmV4Y2VwdGlvbnMiIHZhbHVlPSJ0cnVlIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMyByMWMzLXQyMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDIzIiBoZWFkZXJzPSJyMWMxLXQyMyI+Ci08cD5Mb2dnZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyMyByMWMyLXQyMyI+Ci08cD5TZWxlY3QgdGhlIHR5cGUgb2YgbG9nZ2VyIHRvIHVzZTo8L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0TG9nZ2VyPC9zcGFuPiZuZGFzaDt0aGUgRWNsaXBzZUxpbmsgbmF0aXZlIGxvZ2dlciA8Y29kZT5lY2xpcHNlbGluay5sb2dnaW5nLkRlZmF1bHRTZXNzaW9uTG9nPC9jb2RlPi48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkphdmFMb2dnZXI8L3NwYW4+Jm5kYXNoO3RoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZzwvY29kZT4gbG9nZ2VyIDxjb2RlPmVjbGlwc2VsaW5rLmxvZ2dpbmcuSmF2YUxvZzwvY29kZT4uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5TZXJ2ZXJMb2dnZXI8L3NwYW4+Jm5kYXNoO3RoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZzwvY29kZT4gbG9nZ2VyIDxjb2RlPmVjbGlwc2VsaW5rLnBsYXRmb3JtLnNlcnZlci5TZXJ2ZXJMb2c8L2NvZGU+LiBJbnRlZ3JhdGVzIHdpdGggdGhlIGFwcGxpY2F0aW9uIHNlcnZlcidzIGxvZ2dpbmcgYXMgZGVmaW5lIGluIHRoZSA8Y29kZT5lY2xpcHNlbGluay5wbGF0Zm9ybS5zZXJ2ZXIuU2VydmVyUGxhdGZvcm0uPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5GdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGN1c3RvbSBsb2dnZXIuIFRoZSBjdXN0b20gbG9nZ2VyIG11c3QgaW1wbGVtZW50IHRoZSA8Y29kZT5lY2xpcHNlbGluay5sb2dnaW5nLlNlc3Npb25Mb2c8L2NvZGU+IGludGVyZmFjZS48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcubG9nZ2VyIiB2YWx1ZT0iYWNtZS5sb2dnZXJzLk15Q3VzdG9tTG9nZ2VyIiAvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjMgcjFjMy10MjMiPgotPHA+RGVmYXVsdExvZ2dlcjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzJhNWZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA4IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+T3B0aW9uczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik9wdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRkpDSEUiIG5hbWU9IkNJQUZKQ0hFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5PcHRpb25zPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIE9wdGlvbnMgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDE4Lmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGlzIHBhZ2UgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5HZW5lcmljPC9zcGFuPiBwbGF0Zm9ybS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjIyNyIgbmFtZT0ic3RocmVmMjI3Ij48L2E+PGEgaWQ9InN0aHJlZjIyOCIgbmFtZT0ic3RocmVmMjI4Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBPcHRpb25zIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIE9wdGlvbnMgUGFnZSIgc3VtbWFyeT0iIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI1Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyNSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPlNlc3Npb24gTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzItdDI1Ij4KLTxwPlNwZWNpZnkgdGhlIG5hbWUgYnkgd2hpY2ggdGhlIEVjbGlwc2VMaW5rIHNlc3Npb24gaXMgc3RvcmVkIGluIHRoZSBzdGF0aWMgc2Vzc2lvbiBtYW5hZ2VyLiBVc2UgdGhpcyBvcHRpb24gaWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBFY2xpcHNlTGluayBzaGFyZWQgc2Vzc2lvbiBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIHRoZSBKUEEgb3IgdG8gdXNlIGEgcHJlLWV4aXN0aW5nIEVjbGlwc2VMaW5rIHNlc3Npb24gY29uZmlndXJlZCB0aHJvdWdoIGEgRWNsaXBzZUxpbmsgPGNvZGU+c2Vzc2lvbnMueG1sPC9jb2RlPiBmaWxlPC9wPgotPHA+VmFsaWQgdmFsdWVzOiBhIHZhbGlkIEVjbGlwc2VMaW5rIHNlc3Npb24gbmFtZSB0aGF0IGlzIHVuaXF1ZSBpbiBhIHNlcnZlciBkZXBsb3ltZW50LjwvcD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLnNlc3Npb24tbmFtZSIgdmFsdWU9Ik15U2Vzc2lvbiIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjUgcjFjMy10MjUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+U2Vzc2lvbnMgWE1MPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjUgcjFjMi10MjUiPgotPHA+U3BlY2lmeSBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBsb2FkZWQgZnJvbSB0aGUgRWNsaXBzZUxpbmsgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGZpbGUgKDxjb2RlPnNlc3Npb25zLnhtbDwvY29kZT4pLjwvcD4KLTxwPllvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIGFzIGFuIGFsdGVybmF0aXZlIHRvIGFubm90YXRpb25zIGFuZCBkZXBsb3ltZW50IFhNTC4gSWYgeW91IHNwZWNpZnkgdGhpcyBwcm9wZXJ0eSwgVG9wTGluayB3aWxsIG92ZXJyaWRlIGFsbCBjbGFzcyBhbm5vdGF0aW9uIGFuZCB0aGUgb2JqZWN0IHJlbGF0aW9uYWwgbWFwcGluZyBmcm9tIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+LCBhcyB3ZWxsIGFzIDxjb2RlPk9STS54bWw8L2NvZGU+IGFuZCBvdGhlciBtYXBwaW5nIGZpbGVzLCBpZiBwcmVzZW50LiAuPC9wPgotPHA+SW5kaWNhdGUgdGhlIHNlc3Npb24gYnkgc2V0dGluZyB0aGUgPGNvZGU+ZWNsaXBzZWxpbmsuc2Vzc2lvbi1uYW1lPC9jb2RlPiBwcm9wZXJ0eS48L3A+Ci08cD5Ob3RlOiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgdGhlIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5LCA8Y29kZT5zZXNzaW9ucy54bWw8L2NvZGU+IGZpbGUgd2lsbCBub3QgYmUgdXNlZC48L3A+Ci08cD5WYWxpZCB2YWx1ZXM6IHRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZSBzZXNzaW9ucyBYTUwgZmlsZS48L3A+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJ0b3BsaW5rLnNlc3Npb24teG1sIiB2YWx1ZT0ibXlzZXNzaW9uLnhtbCIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjUgcjFjMy10MjUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+VGFyZ2V0IERhdGFiYXNlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjUgcjFjMi10MjUiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPkV2ZW50IExpc3RlbmVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjUgcjFjMi10MjUiPgotPHA+U3BlY2lmeSBhIGRlc2NyaXB0b3IgZXZlbnQgbGlzdGVuZXIgdG8gYmUgYWRkZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcuPC9wPgotPHA+VmFsaWQgdmFsdWVzOiBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPmVjbGlwc2VsaW5rLnNlc3Npb25zLlNlc3Npb25FdmVudExpc3RlbmVyPC9jb2RlPiBpbnRlcmZhY2UuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsuc2Vzc2lvbi1ldmVudC1saXN0ZW5lciIgdmFsdWU9Im15cGFja2FnZS5NeUNsYXNzLmNsYXNzIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5JbmNsdWRlIERlc2NyaXB0b3IgUXVlcmllczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI1IHIxYzItdDI1Ij4KLTxwPkVuYWJsZSBvciBkaXNhYmxlIHRoZSBkZWZhdWx0IGNvcHlpbmcgb2YgYWxsIG5hbWVkIHF1ZXJpZXMgZnJvbSB0aGUgZGVzY3JpcHRvcnMgdG8gdGhlIHNlc3Npb24uIFRoZXNlIHF1ZXJpZXMgaW5jbHVkZSB0aGUgb25lcyBkZWZpbmVkIHVzaW5nIEVjbGlwc2VMaW5rIEFQSSwgZGVzY3JpcHRvciBhbWVuZG1lbnQgbWV0aG9kcywgYW5kIHNvIG9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJkYzM0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowOCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlNjaGVtYSBHZW5lcmF0aW9uPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU2NoZW1hIEdlbmVyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQ0NGQ0IiIG5hbWU9IkNJQUNDRkNCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TY2hlbWEgR2VuZXJhdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBTY2hlbWEgR2VuZXJhdGlvbiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjI5IiBuYW1lPSJzdGhyZWYyMjkiPjwvYT48YSBpZD0ic3RocmVmMjMwIiBuYW1lPSJzdGhyZWYyMzAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPiZuYnNwOzwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgRWRpdG9yJnJzcXVvO3MgU2NoZW1hIEdlbmVyYXRpb24gcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjciPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI3Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNyIgaGVhZGVycz0icjFjMS10MjciPgotPHA+RERMIEdlbmVyYXRpb24gVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI3IHIxYzItdDI3Ij4KLTxwPlNlbGVjdCB0aGUgdHlwZSBvZiBEREwgZ2VuZXJhdGlvbjo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm9uZTwvc3Bhbj4gLS0gRG8gbm90IGdlbmVyYXRlIERETDsgbm8gc2NoZW1hIGlzIGdlbmVyYXRlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBUYWJsZXM8L3NwYW4+IC0tIENyZWF0ZSBEREwgZm9yIG5vbi1leGlzdGVudCB0YWJsZXM7IGxlYXZlIGV4aXN0aW5nIHRhYmxlcyB1bmNoYW5nZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ecm9wIGFuZCBDcmVhdGUgVGFibGVzPC9zcGFuPiAtLSBDcmVhdGUgRERMIGZvciBhbGwgdGFibGVzOyBkcm9wIGFsbCBleGlzdGluZyB0YWJsZXMuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNyByMWMzLXQyNyI+Ci08cD5Ob25lPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI3IiBoZWFkZXJzPSJyMWMxLXQyNyI+Ci08cD5PdXRwdXQgTW9kZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI3IHIxYzItdDI3Ij4KLTxwPlNlbGVjdCB0aGUgRERMIGdlbmVyYXRpb24gdGFyZ2V0OjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Cb3RoPC9zcGFuPiAtLSBHZW5lcmF0ZSBTUUwgZmlsZXMgYW5kIGV4ZWN1dGUgdGhlbSBvbiB0aGUgZGF0YWJhc2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5EYXRhYmFzZTwvc3Bhbj4gLS0gRXhlY3V0ZSBTUUwgb24gdGhlIGRhdGFiYXNlIG9ubHkgKGRvIG5vdCBnZW5lcmF0ZSBTUUwgZmlsZXMpLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U1FMIFNjcmlwdDwvc3Bhbj4gLS0gR2VuZXJhdGUgU1FMIGZpbGVzIG9ubHkgKGRvIG5vdCBleGVjdXRlIHRoZW0gb24gdGhlIGRhdGFiYXNlKS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI3IHIxYzMtdDI3Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjciIGhlYWRlcnM9InIxYzEtdDI3Ij4KLTxwPkRETCBHZW5lcmF0aW9uIExvY2F0aW9uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjcgcjFjMi10MjciPgotPHA+U3BlY2lmeSB3aGVyZSBFY2xpcHNlTGluayB3cml0ZXMgRERMIG91dHB1dC4gU3BlY2lmeSBhIGZpbGUgc3BlY2lmaWNhdGlvbiB0byBhIGRpcmVjdG9yeSBpbiB3aGljaCB5b3UgaGF2ZSB3cml0ZSBhY2Nlc3MuIFRoZSBmaWxlIHNwZWNpZmljYXRpb24gbWF5IGJlIHJlbGF0aXZlIHRvIHlvdXIgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBvciBhYnNvbHV0ZS4gSWYgaXQgZG9lcyBub3QgZW5kIGluIGEgZmlsZSBzZXBhcmF0b3IsIHRoZW4gRWNsaXBzZUxpbmsgYXBwZW5kcyBvbmUgdGhhdCBpcyB2YWxpZCBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI3IHIxYzMtdDI3Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjciIGhlYWRlcnM9InIxYzEtdDI3Ij4KLTxwPkNyZWF0ZSBEREwgRmlsZSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjcgcjFjMi10MjciPgotPHA+U3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSBEREwgZmlsZSB0aGF0IEVjbGlwc2VMaW5rIGdlbmVyYXRlcyB0aGF0IGNvbnRhaW5zIFNRTCBzdGF0ZW1lbnRzIGZvciBjcmVhdGluZyB0YWJsZXMgZm9yIEpQQSBlbnRpdGllcy4gU3BlY2lmeSBhIGZpbGUgbmFtZSB2YWxpZCBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI3IHIxYzMtdDI3Ij4KLTxwPmNyZWF0ZURETC5qZGJjPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDI3IiBoZWFkZXJzPSJyMWMxLXQyNyI+Ci08cD5Ecm9wIERETCBGaWxlIE5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNyByMWMyLXQyNyI+Ci08cD5TcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIERETCBmaWxlIHRoYXQgRWNsaXBzZUxpbmsgZ2VuZXJhdGVzIHRoYXQgY29udGFpbnMgU1FMIHN0YXRlbWVudHMgZm9yIGRyb3BwaW5nIHRhYmxlcyBmb3IgSlBBIGVudGl0aWVzLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI3IHIxYzMtdDI3Ij4KLTxwPmRyb3BEREwuamRiYzwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTA5YWMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDggLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5Qcm9wZXJ0aWVzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJvcGVydGllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFISkRGRiIgbmFtZT0iQ0lBSEpERkYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlByb3BlcnRpZXM8L2gxPgotPHA+VGhpcyBwYWdlIGVuYWJsZXMgeW91IHRvIGFkZCBvciByZW1vdmUgdGhlIHZlbmRvci1zcGVjaWZpYyA8Y29kZT4mbHQ7cHJvcGVydGllcyZndDs8L2NvZGU+IGVsZW1lbnRzIG9mIHBlcnNpc3RlbmNlLnhtbC48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYjE3ZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowOCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPlNvdXJjZTwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNvdXJjZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFIQ0pBSCIgbmFtZT0iQ0lBSENKQUgiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNvdXJjZTwvaDE+Ci08cD5Vc2luZyB0aGlzIHBhZ2UsIHlvdSBjYW4gbWFudWFsbHkgZWRpdCB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI8L2E+IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhYjliMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA4IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+UHJlZmVyZW5jZXM8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcmVmZXJlbmNlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNERUlFRSIgbmFtZT0iQ0FDREVJRUUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlByZWZlcmVuY2VzPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nIHByZWZlcmVuY2UgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jQkFCSkhCQ0kiPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSlBBIE9wdGlvbnM8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2U1MzE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDggLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5EaWFsb2dzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRGlhbG9ncyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNHRUpEQSIgbmFtZT0iQ0FDR0VKREEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkRpYWxvZ3M8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmcgcHJlZmVyZW5jZSBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bSNDQUNEQUZKRCI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgZGlhbG9nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzAuaHRtI0NBQ0NHRUhDIj5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMwLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmVmMDMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDggLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2ciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQ0dFSEMiIG5hbWU9IkNBQ0NHRUhDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L2gxPgotPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBDb2x1bW5zPC9zcGFuPiBkaWFsb2cgdG8gY3JlYXRlIG9yIG1vZGlmeSB0aGUgam9pbiB0YWJsZXMgYW5kIGNvbHVtbnMgaW4gcmVsYXRpb25zaGlwIG1hcHBpbmdzLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBDb2x1bW5zPC9zcGFuPiBkaWFsb2cuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDMwIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzAiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzMCIgaGVhZGVycz0icjFjMS10MzAiPk5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzMCByMWMyLXQzMCI+TmFtZSBvZiB0aGUgam9pbnQgdGFibGUgY29sdW1uIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzAiIGhlYWRlcnM9InIxYzEtdDMwIj5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzAgcjFjMi10MzAiPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSByZWZlcmVuY2UgZm9yIHRoZSBlbnRpdHkgcmVsYXRpb25zaGlwLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZlcmVuY2UwMTQuaHRtI0NBQ0JBRUJDIj5Kb2luIFRhYmxlIEluZm9ybWF0aW9uPC9hPjxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDE1Lmh0bSNDQUNGQ0VKQyI+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkNGQ2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA4IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+SWNvbnMgYW5kIGJ1dHRvbnM8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJJY29ucyBhbmQgYnV0dG9ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNESENJQSIgbmFtZT0iQ0FDREhDSUEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkljb25zIGFuZCBidXR0b25zPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiBlYWNoIG9mIHRoZSBpY29ucyBhbmQgYnV0dG9ucyB1c2VkIGluIHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbC48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzIuaHRtI0NBQ0dFQUNHIj5JY29uczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDMzLmh0bSNDQUNESkNFSSI+QnV0dG9uczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzUwMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDggLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5JY29uczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ikljb25zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dFQUNHIiBuYW1lPSJDQUNHRUFDRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SWNvbnM8L2gxPgotPHA+VGhlIGZvbGxvd2luZyBpY29ucyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbC48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgaWNvbnMgdXNlZCBpbiB0aGUgRGFsaSBwbHVnLWluLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGljb25zIHVzZWQgaW4gdGhlIERhbGkgcGx1Zy1pbi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzEiPkljb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDMxIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX21hcHBlZGVudGl0eS5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDMxIHIxYzItdDMxIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZyIgYWx0PSJFbWJlZGRhYmxlIGVudGl0eSBpY29uIiB0aXRsZT0iRW1iZWRkYWJsZSBlbnRpdHkgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzMSByMWMyLXQzMSI+PGEgaHJlZj0idGFza3MwMDcuaHRtI0JBQkZFSUNFIj5FbWJlZGRhYmxlPC9hPiBlbnRpdHk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX21hcHBlZHN1cGVyY2xhc3MucG5nIiBhbHQ9Ik1hcHBlZCBzdXBlcmNsYXNzIGljb24iIHRpdGxlPSJNYXBwZWQgc3VwZXJjbGFzcyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDMxIHIxYzItdDMxIj48YSBocmVmPSJ0YXNrczAwOC5odG0jQkFCREFHQ0kiPk1hcHBlZCBzdXBlcmNsYXNzPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fYmFzaWNtYXBwaW5ncy5wbmciIGFsdD0iQmFzaWMgbWFwcGluZyBpY29uIiB0aXRsZT0iQmFzaWMgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDMxIHIxYzItdDMxIj48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmciIGFsdD0iRW1iZWRkZWQgbWFwcGluZyBpY29uIiB0aXRsZT0iRW1iZWRkZWQgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDMxIHIxYzItdDMxIj48YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9lbWJlZGRlZG1hcHBpbmcucG5nIiBhbHQ9IkVtYmVkZGVkIElEIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkVtYmVkZGVkIElEIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzMSByMWMyLXQzMSI+PGEgaHJlZj0idGFza3MwMTIuaHRtI0NJSERJQUVFIj5FbWJlZGRlZCBJRCBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25faWRtYXBwaW5nLnBuZyIgYWx0PSJJRCBtYXBwaW5nIGljb24iIHRpdGxlPSJJRCBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MzEgcjFjMi10MzEiPjxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX21hbnl0b21hbnltYXBwaW5nLnBuZyIgYWx0PSJNYW55LXRvLW1hbnkgbWFwcGluZyBpY29uIiB0aXRsZT0iTWFueS10by1tYW55IG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQzMSByMWMyLXQzMSI+PGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEwYzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9tYW55dG9vbmVtYXBwaW5nLnBuZyIgYWx0PSJNYW55LXRvLW9uZSBtYXBwaW5nIGljb24uIiB0aXRsZT0iTWFueS10by1vbmUgbWFwcGluZyBpY29uLiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MzEgcjFjMi10MzEiPjxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjExYzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9vbmV0b21hbnltYXBwaW5nLnBuZyIgYWx0PSJPbmUtdG8tbWFueSBtYXBwaW5nIGljb24iIHRpdGxlPSJPbmUtdG8tbWFueSBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDMxIHIxYzItdDMxIj48YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMmMxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fb25ldG9vbmVtYXBwaW5nLnBuZyIgYWx0PSJPbmUtdG8tb25lIG1hcHBpbmcgaWNvbi4iIHRpdGxlPSJPbmUtdG8tb25lIG1hcHBpbmcgaWNvbi4iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDMxIHIxYzItdDMxIj48YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEzYzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl90cmFuc2llbnRtYXBwaW5nLnBuZyIgYWx0PSJUcmFuc2llbnQgbWFwcGluZyBpY29uLiIgdGl0bGU9IlRyYW5zaWVudCBtYXBwaW5nIGljb24uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQzMSByMWMyLXQzMSI+PGEgaHJlZj0idGFza3MwMTguaHRtI0JBQkhGSEVJIj5UcmFuc2llbnQgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjE0YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl92ZXJzaW9ubWFwcGluZy5wbmciIGFsdD0iVmVyc2lvbiBtYXBwaW5nIGljb24uIiB0aXRsZT0iVmVyc2lvbiBtYXBwaW5nIGljb24uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNGMxLXQzMSByMWMyLXQzMSI+PGEgaHJlZj0idGFza3MwMTkuaHRtI0JBQkhJQklJIj5WZXJzaW9uIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzEuaHRtI0NBQ0RIQ0lBIj5JY29ucyBhbmQgYnV0dG9uczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NTU4MTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowOSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkJ1dHRvbnM8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJCdXR0b25zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0RKQ0VJIiBuYW1lPSJDQUNESkNFSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QnV0dG9uczwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIGJ1dHRvbnMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGJ1dHRvbnMgdXNlZCBpbiB0aGUgRGFsaSBwbHVnLWluLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGJ1dHRvbnMgdXNlZCBpbiB0aGUgRGFsaSBwbHVnLWluLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzMiI+SWNvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzIiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzMiIgaGVhZGVycz0icjFjMS10MzIiPjxpbWcgc3JjPSJpbWcvbmV3X2pwYV9wZXJzcGVjdGl2ZV9idXR0b24ucG5nIiBhbHQ9IlRoZSBKUEEgUGVyc3BlY3RpdmUgaWNvbiIgdGl0bGU9IlRoZSBKUEEgUGVyc3BlY3RpdmUgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzMiByMWMyLXQzMiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzEuaHRtI0NBQ0RIQ0lBIj5JY29ucyBhbmQgYnV0dG9uczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZjhkYWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowOSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb248L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJEYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JCRElCIiBuYW1lPSJDQUNCQkRJQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjQ1IiBuYW1lPSJzdGhyZWYyNDUiPjwvYT48YSBpZD0ic3RocmVmMjQ2IiBuYW1lPSJzdGhyZWYyNDYiPjwvYT48YSBpZD0ic3RocmVmMjQ3IiBuYW1lPSJzdGhyZWYyNDciPjwvYT5BZGRpdGlvbmFsIERhbGkgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgb25saW5lIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL2luZGV4LnBocC9EYWxpX0RldmVsb3Blcl9Eb2N1bWVudGF0aW9uIj5odHRwOi8vd2lraS5lY2xpcHNlLm9yZy9pbmRleC5waHAvRGFsaV9EZXZlbG9wZXJfRG9jdW1lbnRhdGlvbjwvYT48L2NvZGU+PC9wPgotPHA+VGhpcyBkZXZlbG9wZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD5KYXZhZG9jPC9wPgotPC9saT4KLTxsaT4KLTxwPkV4dGVuc2lvbiBwb2ludCBkb2N1bWVudGF0aW9uPC9wPgotPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRfcGVyc2lzdGVuY2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTM5M2E0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowNCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSElDQUkiIG5hbWU9IkJBQkhJQ0FJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY1MiIgbmFtZT0ic3RocmVmNTIiPjwvYT48YSBpZD0ic3RocmVmNTMiIG5hbWU9InN0aHJlZjUzIj48L2E+PGEgaWQ9InN0aHJlZjU0IiBuYW1lPSJzdGhyZWY1NCI+PC9hPllvdSBjYW4gbWFrZSBhIEphdmEgY2xhc3MgaW50byBvbmUgb2YgdGhlIGZvbGxvd2luZyBwZXJzaXN0ZW50IHR5cGVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAwNy5odG0jQkFCRkVJQ0UiPkVtYmVkZGFibGU8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJEQUdDSSI+TWFwcGVkIHN1cGVyY2xhc3M8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0jQ0lIR0JJRUkiPlNwZWNpZnlpbmcgYWRkaXRpb25hbCB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCI+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMy5odG0jQ0hEQklKQUMiPlRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT4gPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4OWQ1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA0IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNwZWNpZnlpbmcgYWRkaXRpb25hbCB0YWJsZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIR0JJRUkiIG5hbWU9IkNJSEdCSUVJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9oMT4KLTxwPkFkZCBhIHNlY29uZGFyeSB0YWJsZSBhbm5vdGF0aW9uIHRvIGFuIGVudGl0eSBpZiBpdHMgZGF0YSBpcyBzcGxpdCBhY3Jvc3MgbW9yZSBtb3JlIHRoYW4gb25lIHRhYmxlLjwvcD4KLTxwPlRvIGFkZCBhIHNlY29uZGFyeSB0YWJsZSB0byB0aGUgZW50aXR5LDwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGVudGl0eSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlBhY2thZ2UgRXhwbG9yZXI8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+U2Vjb25kYXJ5IFRhYmxlczwvc3Bhbj4gaW5mb3JtYXRpb24uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNzciIG5hbWU9InN0aHJlZjc3Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U3BlY2lmeWluZyBTZWNvbmRhcnkgVGFibGVzPC9wPgotPGltZyBzcmM9ImltZy9zZWNvbmRhcnlfdGFibGVzLnBuZyIgYWx0PSJTZWNvbmRhcnkgVGFibGVzIGFyZWEgb24gdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiB0aXRsZT0iU2Vjb25kYXJ5IFRhYmxlcyBhcmVhIG9uIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IHRvIGFzc29jaWF0ZSBhbiBhZGRpdGlvbmFsIHRhYmxlIHdpdGggdGhlIGVudGl0eS4gVGhlIEVkaXQgU2Vjb25kYXJ5IFRhYmxlIGRpYWxvZyBhcHBlYXJzPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPk5hbWU8L3NwYW4+LCA8c3BhbiBjbGFzcz0iYm9sZCI+Q2F0YWxvZzwvc3Bhbj4sIGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+U2NoZW1hPC9zcGFuPiBvZiB0aGUgYWRkaXRpb25hbCB0YWJsZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgZW50aXR5LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdGhlIGVudGl0eTo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AU2Vjb25kYXJ5VGFibGUobmFtZT0iTkFNRSIsIGNhdGFsb2cgPSAiQ0FUQUxPRyIsIHNjaGVtYSA9ICJTQ0hFTUEiCi0KLTwvcHJlPgotPGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjNiYmE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDMgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEhFSkNKIiBuYW1lPSJDSUhIRUpDSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIzIiBuYW1lPSJzdGhyZWYyMyI+PC9hPjxhIGlkPSJzdGhyZWYyNCIgbmFtZT0ic3RocmVmMjQiPjwvYT5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gY3JlYXRlIGEgbmV3IEpQQSBwcm9qZWN0LjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUGFja2FnZSBFeHBsb3Jlciwgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5GaWxlICZndDsgTmV3ICZndDsgUHJvamVjdDwvc3Bhbj4uIFRoZSBTZWxlY3QgYSB3aXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgSlBBIHBlcnNwZWN0aXZlIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IEpQQSBQcm9qZWN0PC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyNSIgbmFtZT0ic3RocmVmMjUiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TZWxlY3RpbmcgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZDwvcD4KLTxpbWcgc3JjPSJpbWcvc2VsZWN0X2Ffd2l6YXJkX2pwYV9wcm9qZWN0LnBuZyIgYWx0PSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIEpQQSBwcm9qZWN0IHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggSlBBIHByb2plY3Qgc2VsZWN0ZWQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgUHJvamVjdDwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9hPiBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjI2IiBuYW1lPSJzdGhyZWYyNiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRoZSBKUEEgUHJvamVjdCBQYWdlPC9wPgotPGltZyBzcmM9ImltZy9uZXdfanBhX3Byb2plY3RfdGFzay5wbmciIGFsdD0iVGhlIEpQQSBQcm9qZWN0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZC4iIHRpdGxlPSJUaGUgSlBBIFByb2plY3QgcGFnZSBvZiB0aGUgQ3JlYXRlIGEgSlBBIFByb2plY3Qgd2l6YXJkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSBmaWVsZHMgb24gdGhlIDxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIj5OZXcgSlBBIFByb2plY3QgcGFnZTwvYT4gdG8gc3BlY2lmeSB0aGUgcHJvamVjdCBuYW1lIGFuZCBsb2NhdGlvbiwgdGFyZ2V0IHJ1bnRpbWUsIGFuZCBwcmUtZGVmaW5lZCBjb25maWd1cmF0aW9uLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhlIFRhcmdldCBSdW50aW1lIGlzIG5vdCByZXF1aXJlZCBmb3IgSmF2YSBTRSBkZXZlbG9wbWVudC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIDxhIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIj5KUEEgRmFjZXQgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyNyIgbmFtZT0ic3RocmVmMjciPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgSlBBIEZhY2V0IFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL25ld19qcGFfZmFjZXRfdGFzay5wbmciIGFsdD0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiB0aXRsZT0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIGZpZWxkcyBvbiB0aGUgPGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPiB0byBzcGVjaWZ5IHlvdXIgdmVuZGVyLXNwZWNpZmljIHBsYXRmb3JtLCBkYXRhYmFzZSBjb25uZWN0aW9uLCBhbmQgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkuPC9wPgotPHA+SWYgRGFsaSBkZXJpdmVzIHRoZSBpbmNvcnJlY3Qgc2NoZW1hLCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIHRoZSBEZWZhdWx0IFNjaGVtYSBmb3IgQ29ubmVjdGlvbjwvc3Bhbj4uIFVzaW5nIHRoaXMgb3B0aW9uLCB5b3UgY2FuIHNlbGVjdCBhIGRldmVsb3BtZW50IHRpbWUgc2NoZW1hIGZvciBkZWZhdWx0cyBhbmQgdmFsaWRhdGlvbi48L3A+Ci08cD5JZiB5b3UgY2xlYXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DcmVhdGUgb3JtLnhtbDwvc3Bhbj4gb3B0aW9uICh3aGljaCBpcyBzZWxlY3RlZCBieSBkZWZhdWx0KSwgeW91IGNhbiBsYXRlciBhZGQgYSBtYXBwaW5nIGZpbGUgdG8gdGhlIHByb2plY3QgdXNpbmcgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwNS5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotSWYgdGhlIHNlcnZlciBydW50aW1lIGRvZXMgbm90IHByb3ZpZGUgYSBKUEEgaW1wbGVtZW50YXRpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgc2VsZWN0IGEgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkuCi08cD5UbyBpbnN1cmUgdGhlIHBvcnRhYmlsaXR5IG9mIHlvdXIgYXBwbGljYXRpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgbGlzdCB0aGUgbWFuYWdlZCBwZXJzaXN0ZW5jZSBjbGFzc2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIEVKQiAzLjAsIHRoZSBwZXJzaXN0ZW50IGNsYXNzZXMgd2lsbCBiZSBkaXNjb3ZlcmVkIGF1dG9tYXRpY2FsbHkuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uIFlvdSBzaG91bGQgbm93IG9wZW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT48YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwNS5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmJlZWU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA4IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgZGlhbG9nPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgZGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0RBRkpEIiBuYW1lPSJDQUNEQUZKRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgZGlhbG9nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyNDAiIG5hbWU9InN0aHJlZjI0MCI+PC9hPjxhIGlkPSJzdGhyZWYyNDEiIG5hbWU9InN0aHJlZjI0MSI+PC9hPjxhIGlkPSJzdGhyZWYyNDIiIG5hbWU9InN0aHJlZjI0MiI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkdlbmVyYXRlIEVudGl0aWVzPC9zcGFuPiBkaWFsb2cgdG8gY3JlYXRlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcyBmcm9tIHlvdXIgZGF0YWJhc2UgdGFibGVzIGFuZCBjb2x1bW5zLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+R2VuZXJhdGUgRW50aXRpZXMgZGlhbG9nPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIEVudGl0aWVzIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBFbnRpdGllcyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI5Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjkiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyOSIgaGVhZGVycz0icjFjMS10MjkiPlNvdXJjZSBGb2xkZXI8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyOSByMWMyLXQyOSI+RW50ZXIgYSBwcm9qZWN0IGZvbGRlciBuYW1lIGluIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMsIG9yIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IHRvIHNlbGVjdCBhbiBleGlzdGluZyBmb2xkZXIuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI5IiBoZWFkZXJzPSJyMWMxLXQyOSI+UGFja2FnZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI5IHIxYzItdDI5Ij5FbnRlciBhIHBhY2thZ2UgbmFtZSBpbiB3aGljaCB0byBnZW5lcmF0ZSB0aGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLCBvciBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiB0byBzZWxlY3QgYW4gZXhpc3RpbmcgcGFja2FnZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjkiIGhlYWRlcnM9InIxYzEtdDI5Ij5TeW5jaHJvbml6ZSBDbGFzc2VzIGluIHBlcnNpc3RlbmNlLnhtbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI5IHIxYzItdDI5Ij5TcGVjaWZ5IGlmIERhbGkgc2hvdWxkIHVwZGF0ZSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgdG8gaW5jbHVkZSB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI5IiBoZWFkZXJzPSJyMWMxLXQyOSI+VGFibGVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjkgcjFjMi10MjkiPlNlbGVjdCB0aGUgdGFibGVzIGZyb20gd2hpY2ggdG8gY3JlYXRlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcy4gVGhlIHRhYmxlcyBzaG93biBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0aGF0IHlvdSBkZWZpbmVkIGluIHRoZSA8YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKUEEgT3B0aW9uczwvYT4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxwPjxhIGhyZWY9InRhc2tzMDIwLmh0bSNCQUJCQUdGSSI+R2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlczwvYT48L3A+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2luaGVyaXRhbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2luaGVyaXRhbmNlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzNTc0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19pbmhlcml0YW5jZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDQgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSENDQ0pEIiBuYW1lPSJDSUhDQ0NKRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjc4IiBuYW1lPSJzdGhyZWY3OCI+PC9hPjxhIGlkPSJzdGhyZWY3OSIgbmFtZT0ic3RocmVmNzkiPjwvYT5BbiBlbnRpdHkgbWF5IGluaGVyaXQgcHJvcGVydGllcyBmcm9tIG90aGVyIGVudGl0aWVzLiBZb3UgY2FuIHNwZWNpZnkgYSBzcGVjaWZpYyBzdHJhdGVneSB0byB1c2UgZm9yIGluaGVyaXRhbmNlLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBzcGVjaWZ5IGluaGVyaXRhbmNlICg8Y29kZT5ASW5oZXJpdGFuY2UpPC9jb2RlPiBmb3IgYW4gZXhpc3RpbmcgZW50aXR5ICg8Y29kZT5ARW50aXR5PC9jb2RlPik6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgZW50aXR5IGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UGFja2FnZSBFeHBsb3Jlcjwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcsIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5Jbmhlcml0YW5jZTwvc3Bhbj4gaW5mb3JtYXRpb24uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmODAiIG5hbWU9InN0aHJlZjgwIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U3BlY2lmeWluZyBJbmhlcml0YW5jZTwvcD4KLTxpbWcgc3JjPSJpbWcvaW5oZXJpdGFuY2VfdGFiLnBuZyIgYWx0PSJTZWxlY3RpbmcgdGhlIEluaGVyaXRhbmNlIGFyZWEgb24gdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiB0aXRsZT0iU2VsZWN0aW5nIHRoZSBJbmhlcml0YW5jZSBhcmVhIG9uIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+U3RyYXRlZ3k8L3NwYW4+IGxpc3QsIHNlbGVjdCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0aGUgaW5oZXJpdGFuY2Ugc3RyYXRlZ2llczo8L3A+Ci08dWw+Ci08bGk+Ci08cD5BIHNpbmdsZSB0YWJsZSAoZGVmYXVsdCk8L3A+Ci08L2xpPgotPGxpPgotPHA+Sm9pbmVkIHRhYmxlPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uZSB0YWJsZSBwZXIgY2xhc3M8L3A+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIGZvbGxvd2luZyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgcmVtYWluaW5nIGZpZWxkcyBvbiB0aGUgdGFiLiBTZWUgPGEgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNDQUNGSEdIRSI+IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIjwvYT4gZm9yIGFkZGl0aW9uYWwgZGV0YWlscy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBJbmhlcml0YW5jZSB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBJbmhlcml0YW5jZSB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTQiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij48YSBpZD0ic3RocmVmODEiIG5hbWU9InN0aHJlZjgxIj48L2E+PGEgaWQ9InN0aHJlZjgyIiBuYW1lPSJzdGhyZWY4MiI+PC9hPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTQgcjFjMi10MTQiPk5hbWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIHdoZW4gdXNpbmcgYSA8c3BhbiBjbGFzcz0iYm9sZCI+U2luZ2xlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+Sm9pbmVkPC9zcGFuPiBpbmhlcml0YW5jZSBzdHJhdGVneS4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBEaXNjcmltaW5hdG9yQ29sdW1uPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzMtdDE0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5EaXNjcmltaW5hdG9yIFR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMyLXQxNCI+U2V0IHRoZSBkaXNjcmltaW5hdG9yIHR5cGUgdG8gPGNvZGU+Q2hhcjwvY29kZT4gb3IgPGNvZGU+SW50ZWdlcjwvY29kZT4gKGluc3RlYWQgb2YgaXRzIGRlZmF1bHQ6IDxjb2RlPlN0cmluZzwvY29kZT4pLiBUaGUgPHNwYW4gY2xhc3M9ImJvbGQiPkRpc2NyaW1pbmF0b3IgVmFsdWU8L3NwYW4+IG11c3QgY29uZm9ybSB0byB0aGlzIHR5cGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTQgcjFjMy10MTQiPlN0cmluZzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPjxhIGlkPSJzdGhyZWY4MyIgbmFtZT0ic3RocmVmODMiPjwvYT48YSBpZD0ic3RocmVmODQiIG5hbWU9InN0aHJlZjg0Ij48L2E+RGlzY3JpbWluYXRvciBWYWx1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE0IHIxYzItdDE0Ij5TcGVjaWZ5IHRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBhbiBlbnRpdHkgaW4gdGhpcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFRoZSB2YWx1ZSBtdXN0IGNvbmZvcm0gdG8gdGhlIHNwZWNpZmllZCA8c3BhbiBjbGFzcz0iYm9sZCI+RGlzY3JpbWluYXRvciBUeXBlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBEaXNjcmltaW5hdG9yVmFsdWU8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTQgcjFjMy10MTQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPk92ZXJyaWRlIERlZmF1bHQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNCByMWMyLXQxNCI+VXNlIHRoaXMgZmllbGQgdG8gc3BlY2lmeSBjdXN0b20gcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zLgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QFByaW1hcnlLZXlKb2luQ2x1bW48L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTQgcjFjMy10MTQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0aGUgZW50aXR5IGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOSEVSSVRBTkNFX1NUUkFURUdZJmd0Ozwvc3Bhbj4pCi1ARGlzY3JpbWluYXRvckNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RElTQ1JJTUlOQVRPUl9DT0xVTU4mZ3Q7PC9zcGFuPiIsCi0gICAgZGlzY3JpbWluYXRvclR5cGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0RJU0NSSU1JTkFUT1JfVFlQRSZndDs8L3NwYW4+KQotQERpc2NyaW1pbmF0b3JWYWx1ZSh2YWx1ZS0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0RJU0NSSU1JTkFUT1JfVkFMVUUmZ3Q7PC9zcGFuPiIpCi1AUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIsIAotICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iKQotCi08L3ByZT4KLTxwPjxhIGlkPSJzdGhyZWY4NSIgbmFtZT0ic3RocmVmODUiPjwvYT48YSBpZD0ic3RocmVmODYiIG5hbWU9InN0aHJlZjg2Ij48L2E+PGEgaWQ9InN0aHJlZjg3IiBuYW1lPSJzdGhyZWY4NyI+PC9hPlRoZSBmb2xsb3dpbmcgZmlndXJlcyBpbGx1c3RyYXRlcyB0aGUgZGlmZmVyZW50IGluaGVyaXRhbmNlIHN0cmF0ZWdpZXMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmODgiIG5hbWU9InN0aHJlZjg4Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U2luZ2xlIFRhYmxlIEluaGVyaXRhbmNlPC9wPgotPGltZyBzcmM9ImltZy9pbmhlcml0YW5jZV9zaW5nbGUucG5nIiBhbHQ9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGVudGl0eSBpbmhlcml0YW5jZSBpbiBhIHNpbmdsZSB0YWJsZS4iIHRpdGxlPSJUaGlzIGZpZ3VyZSBpbGx1c3RyYXRlcyBlbnRpdHkgaW5oZXJpdGFuY2UgaW4gYSBzaW5nbGUgdGFibGUuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjg5IiBuYW1lPSJzdGhyZWY4OSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPjxhIGlkPSJzdGhyZWY5MCIgbmFtZT0ic3RocmVmOTAiPjwvYT48YSBpZD0ic3RocmVmOTEiIG5hbWU9InN0aHJlZjkxIj48L2E+Sm9pbmVkIFRhYmxlIEluaGVyaXRhbmNlPC9wPgotPGltZyBzcmM9ImltZy9pbmhlcml0YW5jZV9qb2luLnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBpbGx1c3RyYXRlcyBhIGpvaW5lZCBzdWJjbGFzcyBpbmhlcml0YW5jZSBzdHJhdGVneS4iIHRpdGxlPSJUaGlzIGZpZ3VyZSBpbGx1c3RyYXRlcyBhIGpvaW5lZCBzdWJjbGFzcyBpbmhlcml0YW5jZSBzdHJhdGVneS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9vcm0uaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX29ybS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYmEyMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX29ybS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowNCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSERHRENEIiBuYW1lPSJDSUhER0RDRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjQ0IiBuYW1lPSJzdGhyZWY0NCI+PC9hPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L2gxPgotPHA+V2hlbiBjcmVhdGluZyBhIEpQQSBwcm9qZWN0LCAoc2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4pIHlvdSBjYW4gYWxzbyBjcmVhdGUgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBtYXBwaW5nIG1ldGFkYXRhIGFuZCBkZWZhdWx0cy48L3A+Ci08cD48YSBpZD0ic3RocmVmNDUiIG5hbWU9InN0aHJlZjQ1Ij48L2E+RWNsaXBzZSBjcmVhdGVzIHRoZSA8Y29kZT5NRVRBLUlORlxvcm0ueG1sPC9jb2RlPiBmaWxlIGluIHlvdXIgcHJvamVjdCdzIGRpcmVjdG9yeTo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Jmd0OwotJmx0O3BlcnNpc3RlbmNlIHZlcnNpb249IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9WRVJTSU9OJmd0Ozwvc3Bhbj4iCi0gICAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiCi0gICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZQotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfMV8wLnhzZCImZ3Q7Ci0gICZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9VTklUX05BTUUmZ3Q7PC9zcGFuPiImZ3Q7Ci0gICAgJmx0O3Byb3ZpZGVyPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7UEVSU0lTVEVOQ0VfUFJPVklERVImZ3Q7PC9zcGFuPiIgLyZndDsKLSAgJmx0Oy9wZXJzaXN0ZW5jZS11bml0Jmd0OwotJmx0Oy9wZXJzaXN0ZW5jZSZndDsKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwNS5odG0jQ0lIQkNEQ0UiPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMy5odG0jQ0hEQklKQUMiPlRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhNDViYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjAzIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSERBSklEIiBuYW1lPSJDSUhEQUpJRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjMzIiBuYW1lPSJzdGhyZWYzMyI+PC9hPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMzQiIG5hbWU9InN0aHJlZjM0Ij48L2E+V2hlbiB5b3UgY3JlYXRlIGEgcHJvamVjdCwgRWNsaXBzZSBjcmVhdGVzIHRoZSA8Y29kZT5NRVRBLUlORlxwZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIHByb2plY3QncyBkaXJlY3RvcnkuPC9wPgotPHA+WW91IGNhbiBjcmVhdGUgYSBzdHViIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgTUVUQS1JTkYgZGlyZWN0b3J5IHdoZW4geW91IGNyZWF0ZSBhIEpQQSBwcm9qZWN0IChzZWUgPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj4iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPC9hPikuIFlvdSBjYW4gbWFuYWdlIHRoaXMgZmlsZSBlaXRoZXIgdGhyb3VnaCB0aGUgWE1MIGVkaXRvciAoc2VlIDxhIGhyZWY9InRhc2tzMDAyLmh0bSNDSUhFSkFJRSI+IlVzaW5nIHRoZSBYTUwgRWRpdG9yIHRvIGVkaXQgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIjwvYT4pIG9yIHRocm91Z2ggdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotSW4gYWRkaXRvbiB0byB0aGUgR2VuZXJhbCwgQ29ubmVjdGlvbiwgUHJvcGVydGllcyBhbmQgU291cmNlIHBhZ2VzLCB0aGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvciBwYWdlcyBmb3IgcHJvamVjdHMgdGhhdCB1c2UgdGhlIEVjbGlwc2VMaW5rIHBsYXRmb3JtIGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMS5odG0jQ0lBSkFGRUciPkN1c3RvbWl6YXRpb248L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgY2hhbmdlLXRyYWNraW5nIGFuZCBzZXNzaW9uIGN1c3RvbWl6ZXItcmVsYXRlZCBwcm9wZXJ0aWVzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjIuaHRtI0NJQUJFRENIIj5DYWNoaW5nPC9hPjwvcD4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gZGVmaW5lIGNhY2hpbmcgcHJvcGVydGllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIzLmh0bSNDSUFCR0hISSI+TG9nZ2luZzwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwYWdlIHRvIGRlZmluZSBsb2dnaW5nIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNC5odG0jQ0lBRkpDSEUiPk9wdGlvbnM8L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgc2Vzc2lvbiBhbmQgdGFyZ2V0IGRhdGFiYXNlIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNS5odG0jQ0lBQ0NGQ0IiPlNjaGVtYSBHZW5lcmF0aW9uPC9hPjwvcD4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gZGVmaW5lIERETC1yZWxhdGVkIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgcHJvamVjdHMgdXNpbmcgdGhlIEVjbGlwc2VMaW5rIHBsYXRmb3JtLCB0aGUgQ29ubmVjdGlvbnMgcGFnZSBhbHNvIGluY2x1ZGVzIEpEQkMgY29ubmVjdGlvbiBwb29sIHByb3BlcnRpZXMuPC9wPgotPHA+SWYgdGhlIHByb2plY3QgdXNlcyB0aGUgR2VuZXJpYyBwbGF0Zm9ybSwgdGhlbiBvbmx5IHRoZSBHZW5lcmFsLCBDb25uZWN0aW9uLCBQcm9wZXJ0aWVzIGFuZCBTb3VyY2UgcGFnZXMgYXJlIGF2YWlsYWJsZS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxwPlRvIHVzZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBFZGl0b3I6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPk9wZW4gdGhlIDxjb2RlPnBlcmlzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBUaGUgPGEgaHJlZj0icmVmZXJlbmNlMDE5Lmh0bSNDSUFDSUZHSiI+R2VuZXJhbDwvYT4gcGFnZSBvZiB0aGUgZWRpdG9yIGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgR2VuZXJhbCBwYWdlIHRvIGRlZmluZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlcyA8Y29kZT4mbHQ7cGVyc2lzdGVudC11bml0Jmd0OzwvY29kZT4tcmVsYXRlZCBhdHRyaWJ1dGVzIGFzIHdlbGwgYXMgdGhlIDxjb2RlPiZsdDtwcm92aWRlciZndDs8L2NvZGU+LCBhbmQgPGNvZGU+Jmx0O2NsYXNzJmd0OzwvY29kZT4gZWxlbWVudHMgKGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlKS48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1UaGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvcidzIFNvdXJjZSBwYWdlIGVuYWJsZXMgeW91IHRvIHZpZXcgYW5kIGVkaXQgdGhlIHJhdyBYTUwgZmlsZS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgZWRpdG9yLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ4Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10OCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDgiPkVsZW1lbnQgRGVmaW5lZDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10OCIgaGVhZGVycz0icjFjMS10OCI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDggcjFjMi10OCI+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OCByMWMzLXQ4Ij48Y29kZT4mbHQ7cGVyc2lzdGVuY2UtdW5pdCBuYW1lID0gIiZsdDtOYW1lJmd0OyImZ3Q7PC9jb2RlPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5QZXJzaXN0ZW5jZSBQcm92aWRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMi10OCI+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O3Byb3ZpZGVyJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10OCIgaGVhZGVycz0icjFjMS10OCI+RGVzY3JpcHRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzItdDgiPkVudGVyIGEgZGVzY3JpcHRpb24gZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4gVGhpcyBpcyBhbiBvcHRpb25hbCBwcm9wZXJ0eS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPk1hbmFnZWQgQ2xhc3NlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDggcjFjMi10OCI+QWRkIG9yIHJlbW92ZSB0aGUgY2xhc3NlcyBtYW5hZ2VkIHRocm91Z2ggdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10OCByMWMzLXQ4Ij48Y29kZT4mbHQ7Y2xhc3MmZ3Q7PC9jb2RlPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij4mbmJzcDsmbmJzcDtFeGNsdWRlIFVubGlzdGVkIENsYXNzZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ4IHIxYzItdDgiPlNlbGVjdCB0byBpbmNsdWRlIGFsbCBhbm5vdGF0ZWQgZW50aXR5IGNsYXNzZXMgaW4gdGhlIHJvb3Qgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10OCByMWMzLXQ4Ij48Y29kZT4mbHQ7ZXhjbHVkZS11bmxpc3RlZC1jbGFzc2VzJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10OCIgaGVhZGVycz0icjFjMS10OCI+WE1MIE1hcHBpbmcgRmlsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ4IHIxYzItdDgiPkFkZCBvciByZW1vdmUgdGhlIG9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgWE1MIGZpbGVzIGRlZmluZSB0aGUgY2xhc3NlcyBtYW5hZ2VkIHRocm91Z2ggdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10OCByMWMzLXQ4Ij48Y29kZT4mbHQ7bWFwcGluZy1maWxlJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+PC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDIwLmh0bSNDSUFGRkpJRSI+Q29ubmVjdGlvbjwvYT4gcGFnZSB0byBkZWZpbmUgdGhlIDxjb2RlPiZsdDtqdGEtZGF0YS1zb3VyY2UmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O25vbi1qdGEtZGF0YS1zb3VyY2UmZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcyBmb2xsb3dzOjwvcD4KLTxwPlRvIGNvbmZpZ3VyZSB0aGUgSlRBIChKYXZhIFRyYW5zYWN0aW9uIEFQSSkgc291cmNlIHVzZWQgYnkgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyOjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpUQTwvc3Bhbj4gZnJvbSB0aGUgVHJhbnNhY3Rpb24gVHlwZSBsaXN0LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgZ2xvYmFsIEpOREkgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UuPC9wPgotPC9saT4KLTwvb2w+Ci08cD5UbyBjb25maWd1cmUgYSBub24tSlRBIGRhdGEgc291cmNlOjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPlJlc291cmNlIExvY2FsPC9zcGFuPiBmcm9tIHRoZSBUcmFuc2FjdGlvbiBUeXBlIGxpc3QuPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBnbG9iYWwgSk5ESSBuYW1lIG9mIHRoZSBkYXRhIHNvdXJjZS48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RGVmYXVsdCgpPC9zcGFuPiB0byB1c2UgdGhlIGRhdGEgc291cmNlIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2xpPgotPC9vbD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIHRhYmxlIGluIHRoZSBQcm9wZXJ0aWVzIHBhZ2UgdG8gc2V0IHRoZSB2ZW5kb3Itc3BlY2lmaWMgPGNvZGU+Jmx0O3Byb3BlcnRpZXMmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvcD4KLTxwPlRvIGFkZCA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50czo8L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSA8Y29kZT4mbHQ7bmFtZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7dmFsdWUmZ3Q7PC9jb2RlPiBhdHRyaWJ1dGVzIGZvciB0aGUgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4gZWxlbWVudCB1c2luZyB0aGUgdGFibGUncyBOYW1lIGFuZCBWYWx1ZSBmaWVsZHMuPC9wPgotPC9saT4KLTwvb2w+Ci08cD5UbyByZW1vdmUgYSA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50LCBzZWxlY3QgYSBkZWZpbmVkIHByb3BlcnR5IGluIHRoZSB0YWJsZSBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+UmVtb3ZlPC9zcGFuPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLUlmIHRoZSBwcm9qZWN0IHVzZXMgdGhlIEVjbGlwc2VMaW5rIHBsYXRmb3JtLCB0aGUgY29ubmVjdGlvbiBwYWdlIGFsc28gaW5jbHVkZXMgcGFyYW1ldGVycyBmb3IgSkRCQyBjb25uZWN0aW9uIHBvb2xpbmcuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2xpPgotPC9vbD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMDIuaHRtI0NJSEVKQUlFIj5Vc2luZyB0aGUgWE1MIEVkaXRvciB0byBlZGl0IHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFwcGluZy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYXBwaW5nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEyMWY2Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYXBwaW5nLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA1IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+TWFwcGluZyBhbiBlbnRpdHk8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYXBwaW5nIGFuIGVudGl0eSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJER0JJSiIgbmFtZT0iQkFCREdCSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+TWFwcGluZyBhbiBlbnRpdHk8L2gxPgotPHA+RGFsaSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG1hcHBpbmcgdHlwZXMgZm9yIEphdmEgcGVyc2lzdGVudCBlbnRpdGllczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTIuaHRtI0NJSERJQUVFIj5FbWJlZGRlZCBJRCBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTguaHRtI0JBQkhGSEVJIj5UcmFuc2llbnQgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTkuaHRtI0JBQkhJQklJIj5WZXJzaW9uIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPiA8IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4YWQ0Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDMgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5UYXNrczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBUYXNrcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYyMiIgbmFtZT0ic3RocmVmMjIiPjwvYT48L3A+Ci08aDE+VGFza3M8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGRldGFpbGVkIHN0ZXAtYnktc3RlcCBwcm9jZWR1cmVzIGZvciBhY2Nlc3NpbmcgdGhlIERhbGkgT1IgbWFwcGluZyB0b29sIGZ1bmN0aW9uYWxpdHkuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDEuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCI+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyMC5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDIyLmh0bSNCQUJGQUlCQSI+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyNS5odG0jQkFCREJDQkkiPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTNhYjZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDMgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIEpQQSBFbnRpdHkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkJKQkciIG5hbWU9IkJBQkZCSkJHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT48YSBpZD0ic3RocmVmMjgiIG5hbWU9InN0aHJlZjI4Ij48L2E+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9oMT4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBjcmVhdGUgYSBKUEEgZW50aXR5OjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUGFja2FnZSBFeHBsb3Jlciwgc2VsZWN0IHRoZSBKUEEgcHJvamVjdCBhbmQgdGhlbiA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPi4gVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyOSIgbmFtZT0ic3RocmVmMjkiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TZWxlY3RpbmcgdGhlIENyZWF0ZSBhIEpQQSBFbnRpdHkgV2l6YXJkPC9wPgotPGltZyBzcmM9ImltZy9zZWxlY3RfYV93aXphcmRfZW50aXR5LnBuZyIgYWx0PSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIEVudGl0eSBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIEVudGl0eSBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkVudGl0eTwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmZXJlbmNlMDAzLmh0bSNDSUFGRUlHRiI+RW50aXR5IENsYXNzIHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMzAiIG5hbWU9InN0aHJlZjMwIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIEVudGl0eSBDbGFzcyBQYWdlPC9wPgotPGltZyBzcmM9ImltZy9jcmVhdGVfanBhX2VudGl0eV93aXphcmQucG5nIiBhbHQ9IlRoZSBFbnRpdHkgQ2xhc3MgcGFnZSBvZiB0aGUgQ3JlYXRlIGEgSlBBIEVudGl0eSB3aXphcmQuIiB0aXRsZT0iVGhlIEVudGl0eSBDbGFzcyBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgRW50aXR5IHdpemFyZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+Q29tcGxldGUgdGhpcyBwYWdlIGFzIGZvbGxvd3M6PC9wPgotPHVsPgotPGxpPgotPHA+U2VsZWN0IHRoZSBKUEEgcHJvamVjdCBpbiB0aGUgUHJvamVjdCBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIFNvdXJjZSBGb2xkZXIgZmllbGQsIHNlbGVjdCwgb3IgZW50ZXIsIHRoZSBsb2NhdGlvbiBvZiB0aGUgSlBBIHByb2plY3QncyBzcmMgZm9sZGVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QsIG9yIGVudGVyLCB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgcGFja2FnZSBmb3IgdGhpcyBlbnRpdHkgaW4gdGhlIEphdmEgUGFja2FnZSBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgaW4gdGhlIENsYXNzIG5hbWUgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPklmIG5lZWRlZCwgZW50ZXIsIG9yIHNlbGVjdCBhIHN1cGVyY2xhc3MuPC9wPgotPC9saT4KLTxsaT4KLTxwPklmIG5lZWRlZCwgY29tcGxldGUgdGhlIEluaGVyaXRhbmNlIHNlY3Rpb24gYXMgZm9sbG93cyAodGhlc2UgcHJvcGVydGllcyBhcmUgb3B0aW9uYWwpOjwvcD4KLTx1bD4KLTxsaT4KLTxwPkFjY2VwdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkVudGl0eTwvc3Bhbj4gb3B0aW9uICh0aGUgZGVmYXVsdCkgdG8gY3JlYXRlIGEgSmF2YSBjbGFzcyB3aXRoIHRoZSA8Y29kZT5ARW50aXR5PC9jb2RlPiBvcHRpb24uPC9wPgotPC9saT4KLTxsaT4KLTxwPkFsdGVybmF0aXZlbHksIHNlbGVjdCA8YSBocmVmPSJ0YXNrczAwOC5odG0jQkFCREFHQ0kiPk1hcHBlZCBzdXBlcmNsYXNzPC9hPiAoaWYgeW91IGRlZmluZWQgYSBzdXBlciBjbGFzcykuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SW5oZXJpdGFuY2U8L3NwYW4+IGFuZCB0aGVuIHNlbGVjdCBvbmUgb2YgdGhlIEpTUiAyMjAgaW5oZXJpdGFuY2UgbWFwcGluZyBzdHJhdGVnaWVzIChTSU5HTEVfVEFCTEUsIFRBQkxFX1BFUl9DTEFTUywgSk9JTkVEKS48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IHRvIGVudGl0eSBtYXBwaW5ncyBpbiBYTUwgdG8gY3JlYXRlIFhNTCBtYXBwaW5ncyBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPiwgcmF0aGVyIHRoYW4gYW5ub3RhdGlvbnMuPC9wPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4gdG8gcHJvY2VlZCB0byB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDA0Lmh0bSNDSUFERUNJQSI+RW50aXR5IFByb3BlcnRpZXMgcGFnZTwvYT4gd2hlcmUgeW91IGRlZmluZSB0aGUgcGVyc2lzdGVudCBmaWVsZHMgZm9yIHRoZSBlbnRpdHkuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMzEiIG5hbWU9InN0aHJlZjMxIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIEVudGl0eSBQcm9wZXJ0aWVzIFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL2NyZWF0ZV9qcGFfZmllbGRzLnBuZyIgYWx0PSJUaGUgRW50aXR5IFByb3BlcnRpZXMgcGFnZSBvZiB0aGUgQ3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkLiIgdGl0bGU9IlRoZSBFbnRpdHkgUHJvcGVydGllcyBwYWdlIG9mIHRoZSBDcmVhdGUgSlBBIEVudGl0eSB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPkFsdGVybmF0aXZlbHksIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+IHRvIGNvbXBsZXRlIHRoZSBlbnRpdHkuPC9wPgotPC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSBwYWdlIGFzIGZvbGxvd3M6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPklmIG5lZWRlZCwgZW50ZXIgYSBuZXcgbmFtZSBmb3IgdGhlIGVudGl0eS4gRG9pbmcgc28gcmVzdWx0cyBpbiBhZGRpbmcgYSA8Y29kZT5uYW1lPC9jb2RlPiBhdHRyaWJ1dGUgdG8gdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IG5vdGF0aW9uICg8Y29kZT5ARW50aXR5KG5hbWU9IkVudGl0eU5hbWUiKTwvY29kZT4pLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5BY2NlcHQgPHNwYW4gY2xhc3M9ImJvbGQiPlVzZSBkZWZhdWx0PC9zcGFuPiAodGhlIGRlZmF1bHQgc2V0dGluZykgdG8gdXNlIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgbmFtZSBvZiB0aGUgbWFwcGVkIHRhYmxlLiBFbnRlcmluZyBhIGRpZmZlcmVudCBuYW1lIHJlc3VsdHMgaW4gYWRkaW5nIHRoZSA8Y29kZT5AVGFibGU8L2NvZGU+IG5vdGF0aW9uIHdpdGggaXRzIDxjb2RlPm5hbWU8L2NvZGU+IGF0dHJpYnV0ZSBkZWZpbmVkIGFzIHRoZSBuZXcgdGFibGUgKDxjb2RlPkBUYWJsZShuYW1lPSJUYWJsZU5hbWUiKTwvY29kZT4pLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhlIEVudGl0eSBOYW1lLXJlbGF0ZWQgb3B0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSBpZiB5b3Ugc2VsZWN0ZWQgPGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT4gb24gdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwMy5odG0jQ0lBRkVJR0YiPkVudGl0eSBDbGFzcyBwYWdlPC9hPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPkFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdG8gdGhlIGVudGl0eSBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPi4gVGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMzIiIG5hbWU9InN0aHJlZjMyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIEVudGl0eSBGaWVsZHMgRGlhbG9nPC9wPgotPGltZyBzcmM9ImltZy9qcGFfd2l6YXJkX2NyZWF0ZV9maWVsZHMucG5nIiBhbHQ9IlRoZSBFbnRpdHkgRmllbGRzIGRpYWxvZy4iIHRpdGxlPSJUaGUgRW50aXR5IEZpZWxkcyBkaWFsb2cuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+U2VsZWN0IGEgcGVyc2lzdGVuY2UgdHlwZSBmcm9tIHRoZSBUeXBlIGxpc3QuIFlvdSBjYW4gcmV0cmlldmUgYWRkaXRpb25hbCB0eXBlcyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gZnVuY3Rpb24uPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBmaWVsZCBuYW1lIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uIFJlcGVhdCB0aGlzIHByb2NlZHVyZSBmb3IgZWFjaCBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+SWYgbmVlZGVkLCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPktleTwvc3Bhbj4gdG8gZGVzaWduYXRlIHRoZSBmaWVsZCBhcyBhIHByaW1hcnkga2V5LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgZWl0aGVyIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RmllbGQtYmFzZWQ8L3NwYW4+IGFjY2VzcyB0eXBlICh0aGUgZGVmYXVsdCkgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5LWJhc2VkPC9zcGFuPiBhY2Nlc3MgdHlwZS48L3A+Ci08L2xpPgotPC9vbD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtI0JBQklGQkRCIj5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MzAzOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjAzIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+VXNpbmcgdGhlIFhNTCBFZGl0b3IgdG8gZWRpdCB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVc2luZyB0aGUgWE1MIEVkaXRvciB0byBlZGl0IHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhFSkFJRSIgbmFtZT0iQ0lIRUpBSUUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlVzaW5nIHRoZSBYTUwgRWRpdG9yIHRvIGVkaXQgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYzNSIgbmFtZT0ic3RocmVmMzUiPjwvYT48YSBpZD0ic3RocmVmMzYiIG5hbWU9InN0aHJlZjM2Ij48L2E+WW91IGNhbiB3b3JrIHdpdGggdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gYnkgdXNpbmcgdGhlIFhNTCBFZGl0b3IuPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIHdvcmsgd2l0aCB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlOjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UGFja2FnZSBFeHBsb3Jlcjwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPk9wZW4gV2l0aCAmZ3Q7IFhNTCBFZGl0b3I8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjM3IiBuYW1lPSJzdGhyZWYzNyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPk9wZW5pbmcgdGhlIFhNTCBFZGl0b3I8L3A+Ci08aW1nIHNyYz0iaW1nL29wZW5fcGVyc2lzdGVuY2VfZWRpdG9yLnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgT3BlbiAmZ3Q7IFhNTCBFZGl0b3Igb3B0aW9uIGZvciB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUuIiB0aXRsZT0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIE9wZW4gJmd0OyBYTUwgRWRpdG9yIG9wdGlvbiBmb3IgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPjxhIGlkPSJzdGhyZWYzOCIgbmFtZT0ic3RocmVmMzgiPjwvYT48YSBpZD0ic3RocmVmMzkiIG5hbWU9InN0aHJlZjM5Ij48L2E+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+WE1MIEVkaXRvcjwvc3Bhbj4gdG8gZWRpdCB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjQwIiBuYW1lPSJzdGhyZWY0MCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlhNTCBFZGl0b3I8L3A+Ci08aW1nIHNyYz0iaW1nL3BlcnNpc3RlbmNlX3htbF9lZGl0b3IucG5nIiBhbHQ9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBYTUwgRWRpdG9yLiIgdGl0bGU9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBYTUwgRWRpdG9yLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTwvb2w+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSIjQ0lIRUpBSUUiPlVzaW5nIHRoZSBYTUwgRWRpdG9yIHRvIGVkaXQgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYTUwuaHRtbCI+V29ya2luZyB3aXRoIFhNTCBGaWxlczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNjlmNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA0IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+U3luY2hyb25pemluZyBjbGFzc2VzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU3luY2hyb25pemluZyBjbGFzc2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEZFQkFJIiBuYW1lPSJDSUhGRUJBSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U3luY2hyb25pemluZyBjbGFzc2VzPC9oMT4KLTxwPkFzIHlvdSB3b3JrIHdpdGggdGhlIGNsYXNzZXMgaW4geW91ciBKYXZhIHByb2plY3QsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgdG8gcmVmbGVjdCB0aGUgY2hhbmdlcy4gPGEgaWQ9InN0aHJlZjQxIiBuYW1lPSJzdGhyZWY0MSI+PC9hPjxhIGlkPSJzdGhyZWY0MiIgbmFtZT0ic3RocmVmNDIiPjwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gc3luY2hyb25pemUgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTo8L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlBhY2thZ2UgRXhwbG9yZXI8L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5KUEEgVG9vbHMgJmd0OyBTeW5jaHJvbml6ZSBDbGFzc2VzPC9zcGFuPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0iYm9sZCI+QW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbCBvcHRpb248L3NwYW4+IGluIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+LiBJbiBnZW5lcmFsLCB5b3UgZG8gbm90IGhhdmUgdG8gdXNlIHRoaXMgZnVuY3Rpb24gd2l0aGluIHRoZSBjb250YWluZXIuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY0MyIgbmFtZT0ic3RocmVmNDMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TeW5jaHJvbml6aW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgRmlsZTwvcD4KLTxpbWcgc3JjPSJpbWcvc3luY2hvcm5pemVfY2xhc3Nlcy5wbmciIGFsdD0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIEpQQSBUb29scyAmZ3Q7IFN5bmNocm9uaXplIENsYXNzZXMgb3B0aW9uLiIgdGl0bGU9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBKUEEgVG9vbHMgJmd0OyBTeW5jaHJvbml6ZSBDbGFzc2VzIG9wdGlvbi4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+RGFsaSBhZGRzIHRoZSBuZWNlc3NhcnkgPGNvZGU+Jmx0O2NsYXNzJmd0OzwvY29kZT4gZWxlbWVudHMgdG8gdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UGVyc2lzdGVuY2UgWE1MIEVkaXRvcjwvc3Bhbj4gdG8gY29udGludWUgZWRpdGluZyB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvbGk+Ci08L29sPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMDIuaHRtI0NJSEVKQUlFIj5Vc2luZyB0aGUgWE1MIEVkaXRvciB0byBlZGl0IHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkNWRlNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDQgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjQ2IiBuYW1lPSJzdGhyZWY0NiI+PC9hPgotPGgxPkNyZWF0aW5nIGFuIG9ybS54bWwgZmlsZTwvaDE+Ci08cD5JZiB5b3Ugb3B0IG5vdCB0byBjcmVhdGUgYW4gPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB3aGVuIHlvdSBjcmVhdGUgYSBKUEEgcHJvamVjdCwgeW91IGNhbiBjcmVhdGUgb25lIHVzaW5nIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDUuaHRtI0NJQUlKQ0NFIj5NYXBwaW5nIEZpbGUgV2l6YXJkPC9hPi48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gY3JlYXRlIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGU6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPkZyb20gdGhlIE5hdmlnYXRvciBvciBQYWNrYWdlIEV4cGxvcmVyLCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbGUgJmd0OyBOZXcgJmd0OyBPdGhlcjwvc3Bhbj4uIFRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNDciIG5hbWU9InN0aHJlZjQ3Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIFNlbGVjdCBhIFdpemFyZCBEaWFsb2c8L3A+Ci08aW1nIHNyYz0iaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZyIgYWx0PSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIE1hcHBpbmcgZmlsZSBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIE1hcHBpbmcgZmlsZSBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcHBpbmcgRmlsZTwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgTWFwcGluZyBGaWxlIHBhZ2UgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY0OCIgbmFtZT0ic3RocmVmNDgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgTWFwcGluZyBGaWxlIFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL21hcHBpbmdfZmlsZV9uZXcucG5nIiBhbHQ9IlRoZSBNYXBwaW5nIEZpbGUgcGFnZS4iIHRpdGxlPSJUaGUgTWFwcGluZyBGaWxlIHBhZ2UuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+RGVmaW5lIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBwYWdlIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi4gVGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgYXBwZWFycyBpbiB0aGUgc3JjIGRpcmVjdG9yeSBvZiB0aGUgc2VsZWN0ZWQgSlBBIHByb2plY3QuIFlvdSBjYW4gbWFuYWdlIHRoZSBvcm0ueG1sIGZpbGUgdXNpbmcgdGhlIEpQQSBEZXRhaWxzIHZpZXcgb3IgdGhyb3VnaCB0aGUgWE1MIEVkaXRvci4gU2VlIGFsc28gPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoZSBNYXBwaW5nIEZpbGUgV2l6YXJkIHdpbGwgbm90IGFsbG93IHlvdSB0byBwcm9jZWVkIGlmIHlvdSBzZWxlY3QgYSBKUEEgcHJvamVjdCB0aGF0IGFscmVhZHkgaW5jbHVkZXMgYW4gPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08L29sPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhNzQ2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDQgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5Xb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iV29ya2luZyB3aXRoIG9ybS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhCQ0RDRSIgbmFtZT0iQ0lIQkNEQ0UiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjQ5IiBuYW1lPSJzdGhyZWY0OSI+PC9hPjxhIGlkPSJzdGhyZWY1MCIgbmFtZT0ic3RocmVmNTAiPjwvYT5Zb3UgY2FuIHdvcmsgd2l0aCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gYnkgdXNpbmcgdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIHdvcmsgd2l0aCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZTo8L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QYWNrYWdlIEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+T3Blbjwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5TWFwcGluZ3M8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIEpQQSBEZXRhaWxzIHZpZXcgdG8gY29uZmlndXJlIHRoZSBlbnRpdHkgbWFwcGluZyBhbmQgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY1MSIgbmFtZT0ic3RocmVmNTEiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5KUEEgRGV0YWlscyB2aWV3IGZvciBFbnRpdHlNYXBwaW5ncyAob3JtLnhtbCk8L3A+Ci08aW1nIHNyYz0iaW1nL2RldGFpbHNfZW50aXR5bWFwcGluZ3MucG5nIiBhbHQ9IkpQQSBEZXRhaWxzIHZpZXcgZm9yIG9ybS54bWwgZmlsZS4iIHRpdGxlPSJKUEEgRGV0YWlscyB2aWV3IGZvciBvcm0ueG1sIGZpbGUuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPC9vbD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9IiNDSUhCQ0RDRSI+V29ya2luZyB3aXRoIG9ybS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWE1MLmh0bWwiPldvcmtpbmcgd2l0aCBYTUwgRmlsZXM8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMy5odG0jQ0hEQklKQUMiPlRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA2Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmViYTNmOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIxLCAyMDA4IDExOjE2OjExIC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+RW50aXR5PC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW50aXR5IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIHN0YXJ0LS0+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCR0JJRUUiIG5hbWU9IkJBQkdCSUVFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbnRpdHk8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjU1IiBuYW1lPSJzdGhyZWY1NSI+PC9hPjxhIGlkPSJzdGhyZWY1NiIgbmFtZT0ic3RocmVmNTYiPjwvYT48YSBpZD0ic3RocmVmNTciIG5hbWU9InN0aHJlZjU3Ij48L2E+PGEgaWQ9InN0aHJlZjU4IiBuYW1lPSJzdGhyZWY1OCI+PC9hPkFuIDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHk8L3NwYW4+IGlzIGEgcGVyc2lzdGVudCBkb21haW4gb2JqZWN0LjwvcD4KLTxwPkFuIGVudGl0eSA8c3BhbiBjbGFzcz0iaXRhbGljIj5jYW4gYmU8L3NwYW4+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkFic3RyYWN0IG9yIGNvbmNyZXRlIGNsYXNzZXMuIEVudGl0aWVzIG1heSBhbHNvIGV4dGVuZCBub24tZW50aXR5IGNsYXNzZXMgYXMgd2VsbCBhcyBlbnRpdHkgY2xhc3NlcywgYW5kIG5vbi1lbnRpdHkgY2xhc3NlcyBtYXkgZXh0ZW5kIGVudGl0eSBjbGFzc2VzLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QW4gZW50aXR5IDxzcGFuIGNsYXNzPSJpdGFsaWMiPm11c3QgaGF2ZTwvc3Bhbj46PC9wPgotPHVsPgotPGxpPgotPHA+QSBuby1hcmcgY29uc3RydWN0b3IgKHB1YmxpYyBvciBwcm90ZWN0ZWQpOyB0aGUgZW50aXR5IGNsYXNzIG1heSBoYXZlIG90aGVyIGNvbnN0cnVjdG9ycyBhcyB3ZWxsLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+PGEgaWQ9InN0aHJlZjU5IiBuYW1lPSJzdGhyZWY1OSI+PC9hPjxhIGlkPSJzdGhyZWY2MCIgbmFtZT0ic3RocmVmNjAiPjwvYT48YSBpZD0ic3RocmVmNjEiIG5hbWU9InN0aHJlZjYxIj48L2E+RWFjaCBwZXJzaXN0ZW50IGVudGl0eSBtdXN0IGJlIG1hcHBlZCB0byBhIGRhdGFiYXNlIHRhYmxlIGFuZCBjb250YWluIGEgcHJpbWFyeSBrZXkuIFBlcnNpc3RlbnQgZW50aXRpZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCBwZXJzaXN0ZW5jZSB0byBhbiBleGlzdGluZyBlbnRpdHk6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPk9wZW4gdGhlIEphdmEgY2xhc3MgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QYWNrYWdlIEV4cGxvcmVyLjwvc3Bhbj48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IHRoZSBjbGFzcyBpbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgSlBBIERldGFpbHMgdmlldywgY2xpY2sgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsgdG8gYWNjZXNzIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy4gSW4gdGhlIGZvbGxvd2luZyBmaWd1cmUsIGNsaWNraW5nIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmVudGl0eTwvc3Bhbj4gaW52b2tlcyB0aGUgZGlhbG9nIGZyb20gdGhlIEpQQSBEZXRhaWxzIFZpZXcuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNjIiIG5hbWU9InN0aHJlZjYyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIE1hcHBpbmcgVHlwZSBIeXBlcmxpbms8L3A+Ci08aW1nIHNyYz0iaW1nL21hcHBlZF9lbnRpdHlfdHlwZV9saW5rLnBuZyIgYWx0PSJUaGUgSlBBIERldGFpbHMgdmlldyBmb3IgYW4gZW50aXR5IHNob3dpbmcgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsuIiB0aXRsZT0iVGhlIEpQQSBEZXRhaWxzIHZpZXcgZm9yIGFuIGVudGl0eSBzaG93aW5nIHRoZSBtYXBwaW5nIHR5cGUgaHlwZXJsaW5rLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1Zb3UgY2FuIGFsc28gY2hhbmdlIChvciBhZGQpIHBlcnNpc3RlbmNlIGZvciBhbiBlbnRpdHkgYnkgcmlnaHQtY2xpY2tpbmcgdGhlIGNsYXNzIGluIHRoZSBKUEEgU3RydWN0dXJlIFZpZXcgYW5kIHRoZW4gY2xpY2tpbmcgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IEVudGl0eTwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5PC9zcGFuPiBmcm9tIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+T0s8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjYzIiBuYW1lPSJzdGhyZWY2MyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIERpYWxvZzwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nIiBhbHQ9IlRoZSBNYXBwaW5nIFR5cGUgc2VsZWN0aW9uIGRpYWxvZyB3aXRoIEVuaXR5IHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBNYXBwaW5nIFR5cGUgc2VsZWN0aW9uIGRpYWxvZyB3aXRoIEVuaXR5IHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSByZW1haW5pbmcgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTJiNjkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowNCAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkVtYmVkZGFibGU8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbWJlZGRhYmxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZFSUNFIiBuYW1lPSJCQUJGRUlDRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW1iZWRkYWJsZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmNjQiIG5hbWU9InN0aHJlZjY0Ij48L2E+PGEgaWQ9InN0aHJlZjY1IiBuYW1lPSJzdGhyZWY2NSI+PC9hPkFuIDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRlZDwvc3Bhbj4gY2xhc3MgaXMgYSBjbGFzcyB3aG9zZSBpbnN0YW5jZXMgYXJlIHN0b3JlZCBhcyBwYXJ0IG9mIGFuIG93bmluZyBlbnRpdHk7IGl0IHNoYXJlcyB0aGUgaWRlbnRpdHkgb2YgdGhlIG93bmluZyBlbnRpdHkuIEVhY2ggZmllbGQgb2YgdGhlIGVtYmVkZGVkIGNsYXNzIGlzIG1hcHBlZCB0byB0aGUgZGF0YWJhc2UgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvd25pbmcgZW50aXR5LjwvcD4KLTxwPlRvIG92ZXJyaWRlIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHN1YmNsYXNzLCB1c2UgdGhlIDxjb2RlPkBBdHRyaWJ1dGVPdmVycmlkZTwvY29kZT4gYW5ub3RhdGlvbiBmb3IgdGhhdCBzcGVjaWZpYyBjbGFzcy48L3A+Ci08cD48YSBpZD0ic3RocmVmNjYiIG5hbWU9InN0aHJlZjY2Ij48L2E+PGEgaWQ9InN0aHJlZjY3IiBuYW1lPSJzdGhyZWY2NyI+PC9hPjxhIGlkPSJzdGhyZWY2OCIgbmFtZT0ic3RocmVmNjgiPjwvYT5BbiBlbWJlZGRhYmxlIGVudGl0eSBpcyBpZGVudGlmaWVkIGJ5IHRoZSA8Y29kZT5ARW1iZWRkYWJsZTwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gYWRkIGVtYmVkZGFibGUgcGVyc2lzdGVuY2UgdG8gYW4gZXhpc3RpbmcgZW50aXR5OjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5PcGVuIHRoZSBKYXZhIGNsYXNzIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UGFja2FnZSBFeHBsb3Jlcjwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgY2xhc3MgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldy48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsgdG8gb3BlbiB0aGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RW1iZWRkYWJsZTwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk9LPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY2OSIgbmFtZT0ic3RocmVmNjkiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5NYXBwaW5nIFR5cGUgU2VsZWN0aW9uIERpYWxvZyAoRW1iZWRkYWJsZSk8L3A+Ci08aW1nIHNyYz0iaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW1iZWQucG5nIiBhbHQ9IlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyB3aXRoIEVtYmVkZGFibGUgc2VsZWN0ZWQuIiB0aXRsZT0iVGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIHdpdGggRW1iZWRkYWJsZSBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSB0aGUgcmVtYWluaW5nIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxkbD4KLTxkZD48YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjwvZGQ+Ci08ZGQ+PGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48L2RkPgotPGRkPjxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48L2RkPgotPC9kbD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA4Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNTQ2NTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA0IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+TWFwcGVkIHN1cGVyY2xhc3M8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYXBwZWQgc3VwZXJjbGFzcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJEQUdDSSIgbmFtZT0iQkFCREFHQ0kiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1hcHBlZCBzdXBlcmNsYXNzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY3MCIgbmFtZT0ic3RocmVmNzAiPjwvYT48YSBpZD0ic3RocmVmNzEiIG5hbWU9InN0aHJlZjcxIj48L2E+QW4gZW50aXR5IHRoYXQgZXh0ZW5kcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwZWQgU3VwZXJjbGFzczwvc3Bhbj4gY2xhc3MgaW5oZXJpdHMgdGhlIHBlcnNpc3RlbnQgc3RhdGUgYW5kIG1hcHBpbmcgaW5mb3JtYXRpb24gZnJvbSBhIHN1cGVyY2xhc3MuIFlvdSBzaG91bGQgdXNlIGEgbWFwcGVkIHN1cGVyY2xhc3MgdG8gZGVmaW5lIG1hcHBpbmcgaW5mb3JtYXRpb24gdGhhdCBpcyBjb21tb24gdG8gbXVsdGlwbGUgZW50aXR5IGNsYXNzZXMuPC9wPgotPHA+QSBtYXBwZWQgc3VwZXJjbGFzcyA8c3BhbiBjbGFzcz0iaXRhbGljIj5jYW4gYmU8L3NwYW4+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkFic3RyYWN0IG9yIGNvbmNyZXRlIGNsYXNzZXM8L3A+Ci08L2xpPgotPC91bD4KLTxwPkEgbWFwcGVkIHN1cGVyY2xhc3MgPHNwYW4gY2xhc3M9Iml0YWxpYyI+Y2Fubm90IGJlPC9zcGFuPjo8L3A+Ci08dWw+Ci08bGk+Ci08cD5CZSBxdWVyaWVkIG9yIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBFbnRpdHktTWFuYWdlciBvciBRdWVyeSBvcGVyYXRpb25zPC9wPgotPC9saT4KLTxsaT4KLTxwPkJlIHRoZSB0YXJnZXQgb2YgYSBwZXJzaXN0ZW50IHJlbGF0aW9uc2hpcDwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QSBtYXBwZWQgc3VwZXJjbGFzcyBkb2VzIG5vdCBoYXZlIGEgZGVmaW5lZCBkYXRhYmFzZSB0YWJsZS4gSW5zdGVhZCwgaXRzIG1hcHBpbmcgaW5mb3JtYXRpb24gaXMgZGVyaXZlZCBmcm9tIGl0cyBzdXBlcmNsYXNzLiBUbyBvdmVycmlkZSB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBzdWJjbGFzcywgdXNlIHRoZSA8Y29kZT5AQXR0cmlidXRlT3ZlcnJpZGU8L2NvZGU+IGFubm90YXRpb24gZm9yIHRoYXQgc3BlY2lmaWMgY2xhc3MuPC9wPgotPHA+PGEgaWQ9InN0aHJlZjcyIiBuYW1lPSJzdGhyZWY3MiI+PC9hPjxhIGlkPSJzdGhyZWY3MyIgbmFtZT0ic3RocmVmNzMiPjwvYT48YSBpZD0ic3RocmVmNzQiIG5hbWU9InN0aHJlZjc0Ij48L2E+PGEgaWQ9InN0aHJlZjc1IiBuYW1lPSJzdGhyZWY3NSI+PC9hPkEgbWFwcGVkIHN1cGVyY2xhc3MgaXMgaWRlbnRpZmllZCBieSB0aGUgPGNvZGU+QE1hcHBlZFN1cGVyY2xhc3M8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCBNYXBwZWQgU3VwZXJjbGFzcyBwZXJzaXN0ZW5jZSB0byBhbiBleGlzdGluZyBlbnRpdHk6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPk9wZW4gdGhlIEphdmEgY2xhc3MgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QYWNrYWdlIEV4cGxvcmVyPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IHRoZSBjbGFzcyBpbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgSlBBIERldGFpbHMgdmlldywgY2xpY2sgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsgdG8gb3BlbiB0aGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwcGVkIFN1cGVyY2xhc3M8L3NwYW4+IGFuZCB0aGVuIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNzYiIG5hbWU9InN0aHJlZjc2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+TWFwcGluZyBUeXBlIFNlbGVjdGlvbiBEaWFsb2cgKE1hcHBlZCBTdXBlcmNsYXNzKTwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9zdXBlcmNsYXNzLnBuZyIgYWx0PSJUaGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cgd2l0aCBNYXBwZWQgU3VwZXJjbGFzcyBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cgd2l0aCBNYXBwZWQgU3VwZXJjbGFzcyBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSB0aGUgcmVtYWluaW5nIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0jQ0lIR0JJRUkiPlNwZWNpZnlpbmcgYWRkaXRpb25hbCB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCI+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2E+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxNjBkMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDUgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5DcmVhdGluZyBOYW1lZCBRdWVyaWVzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJJR0JHRyIgbmFtZT0iQkFCSUdCR0ciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjkyIiBuYW1lPSJzdGhyZWY5MiI+PC9hPjxhIGlkPSJzdGhyZWY5MyIgbmFtZT0ic3RocmVmOTMiPjwvYT5OYW1lZCBxdWVyaWVzIGltcHJvdmUgYXBwbGljYXRpb24gcGVyZm9ybWFuY2UgYmVjYXVzZSB0aGV5IGFyZSBwcmVwYXJlZCBvbmNlIGFuZCB0aGV5IChhbmQgYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgc3VwcG9ydGluZyBvYmplY3RzKSBjYW4gYmUgZWZmaWNpZW50bHkgcmV1c2VkIHRoZXJlYWZ0ZXIsIG1ha2luZyB0aGVtIHdlbGwgc3VpdGVkIGZvciBjb21wbGV4IGFuZCBmcmVxdWVudGx5IGV4ZWN1dGVkIG9wZXJhdGlvbnMuIE5hbWVkIHF1ZXJpZXMgdXNlIHRoZSBKUEEgcXVlcnkgbGFuZ3VhZ2UgZm9yIHBvcnRhYmxlIGV4ZWN1dGlvbiBvbiBhbnkgdW5kZXJseWluZyBkYXRhYmFzZTsgbmFtZWQgbmF0aXZlIHF1ZXJpZXMgdXNlIHRoZSBTUUwgbGFuZ3VhZ2UgbmF0aXZlIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBhZGQgPGNvZGU+QE5hbWVkUXVlcnk8L2NvZGU+IGFuZCA8Y29kZT5ATmFtZWROYXRpdmVRdWVyeTwvY29kZT4gYW5ub3RhdGlvbnMgdG8gdGhlIGVudGl0eS48L3A+Ci08cD5UbyBjcmVhdGUgYSBuYW1lZCBxdWVyeTo8L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+U2VsZWN0IHRoZSBlbnRpdHkgaW4gdGhlIFBhY2thZ2UgRXhwbG9yZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBleHBhbmQgUXVlcmllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gZm9yIGEgbmFtZWQgcXVlcnksIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgTmF0aXZlPC9zcGFuPiBmb3IgYSBuYXRpdmUgcXVlcnkuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBkaWFsb2cgdGhhdCBhcHBlYXJzLCBlbnRlciB0aGUgbmFtZSBvZiB0aGUgcXVlcnkgaW4gdGhlIE5hbWUgZmllbGQgYW5kIHRoZW4gY2xpY2sgT0suPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBxdWVyeSBpbiB0aGUgUXVlcnkgZmllbGQuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmOTQiIG5hbWU9InN0aHJlZjk0Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+RW50ZXJpbmcgYSBOYW1lZCBRdWVyeTwvcD4KLTxpbWcgc3JjPSJpbWcvdGFza19lbnRlcmluZ19xdWVyeS5wbmciIGFsdD0iVGhlIFF1ZXJpZXMgc2VjdGlvbiBvZiB0aGUgSlBBIERldGFpbHMgdmlldy4iIHRpdGxlPSJUaGUgUXVlcmllcyBzZWN0aW9uIG9mIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjdhNGU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDUgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5CYXNpYyBtYXBwaW5nPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQmFzaWMgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJCQUJDRSIgbmFtZT0iQkFCQkFCQ0UiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkJhc2ljIG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjk1IiBuYW1lPSJzdGhyZWY5NSI+PC9hPjxhIGlkPSJzdGhyZWY5NiIgbmFtZT0ic3RocmVmOTYiPjwvYT48YSBpZD0ic3RocmVmOTciIG5hbWU9InN0aHJlZjk3Ij48L2E+PGEgaWQ9InN0aHJlZjk4IiBuYW1lPSJzdGhyZWY5OCI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5CYXNpYyBNYXBwaW5nPC9zcGFuPiB0byBtYXAgYW4gYXR0cmlidXRlIGRpcmVjdGx5IHRvIGEgZGF0YWJhc2UgY29sdW1uLiBCYXNpYyBtYXBwaW5ncyBtYXkgYmUgdXNlZCBvbmx5IHdpdGggdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGUgdHlwZXM6PC9wPgotPHVsPgotPGxpPgotPHA+SmF2YSBwcmltaXRpdmUgdHlwZXMgYW5kIHdyYXBwZXJzIG9mIHRoZSBwcmltaXRpdmUgdHlwZXM8L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS5sYW5nLlN0cmluZywgamF2YS5tYXRoLkJpZ0ludGVnZXI8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmphdmEubWF0aC5CaWdEZWNpbWFsPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLnV0aWwuRGF0ZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS51dGlsLkNhbGVuZGFyLCBqYXZhLnNxbC5EYXRlPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLnNxbC5UaW1lPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLnNxbC5UaW1lc3RhbXA8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmJ5dGVbXTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+Qnl0ZVtdPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5jaGFyW108L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPkNoYXJhY3RlcltdPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5lbnVtczwvcD4KLTwvbGk+Ci08bGk+Ci08cD5hbnkgb3RoZXIgdHlwZSB0aGF0IGltcGxlbWVudHMgPGNvZGU+U2VyaWFsaXphYmxlPC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VG8gY3JlYXRlIGEgYmFzaWMgbWFwcGluZzo8L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgcmlnaHQtY2xpY2sgdGhlIGZpZWxkIHRvIG1hcC4gU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBCYXNpYzwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE1Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5FbnRpdHkgTWFwIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE1IHIxYzItdDE1Ij5EZWZpbmVzIHRoaXMgbWFwcGluZyBhcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5CYXNpYyBNYXBwaW5nPC9zcGFuPi4KLTxwPlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBCYXNpYzwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNSByMWMzLXQxNSI+QmFzaWM8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5Db2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNSByMWMyLXQxNSI+VGhlIGRhdGFiYXNlIGNvbHVtbiBtYXBwZWQgdG8gdGhlIGVudGl0eSBhdHRyaWJ1dGUuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHQ0JIQiI+IkNvbHVtbiI8L2E+IGZvciBkZXRhaWxzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE1IHIxYzMtdDE1Ij5CeSBkZWZhdWx0LCB0aGUgQ29sdW1uIGlzIGFzc3VtZWQgdG8gYmUgbmFtZWQgaWRlbnRpY2FsbHkgdG8gdGhlIGF0dHJpYnV0ZSBhbmQgYWx3YXlzIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5JTlNFUlQ8L2NvZGU+IGFuZCA8Y29kZT5VUERBVEU8L2NvZGU+IHN0YXRlbWVudHMuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNSByMWMyLXQxNSI+TmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTUgcjFjMy10MTUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxNSIgaGVhZGVycz0icjFjMS10MTUiPkZldGNoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTUgcjFjMi10MTUiPkRlZmluZXMgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0dHSEIiPiJGZXRjaCBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5FYWdlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5MYXp5PC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNSByMWMzLXQxNSI+RWFnZXI8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5PcHRpb25hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE1IHIxYzItdDE1Ij5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNSByMWMzLXQxNSI+WWVzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+VGVtcG9yYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNSByMWMyLXQxNSI+U3BlY2lmaWVzIHRoZSB0eXBlIG9mIGRhdGEuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNFQUpHRCI+IlRlbXBvcmFsIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5EYXRlPC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWU8L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZXN0YW1wPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNSByMWMzLXQxNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+TG9iPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTUgcjFjMi10MTUiPlNwZWNpZmllcyBpZiB0aGlzIGlzIGEgbGFyZ2Ugb2JqZWN0cyAoQkxPQiBvciBDTE9CKS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JCSUJJIj4iTG9iIjwvYT4gZm9yIGRldGFpbHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTUgcjFjMy10MTUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQENvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIsIHRhYmxlPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX1RBQkxFJmd0Ozwvc3Bhbj4iLCAKLSAgICBpbnNlcnRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtJTlNFUlRBQkxFJmd0Ozwvc3Bhbj4sIHVwZGF0YWJsZT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VVBEQVRBQkxFJmd0Ozwvc3Bhbj4pCi1AQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtGRVRDSF9UWVBFJmd0Ozwvc3Bhbj4sIG9wdGlvbmFsID0gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O09QVElPTkFMJmd0Ozwvc3Bhbj4pCi1AVGVtcG9yYWwoVGVtcG9yYWxUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtURU1QT1JBTCZndDs8L3NwYW4+KQotCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDExLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODBlNjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDExLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowNSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkVtYmVkZGVkIG1hcHBpbmc8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbWJlZGRlZCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkNCSERGIiBuYW1lPSJCQUJDQkhERiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW1iZWRkZWQgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmOTkiIG5hbWU9InN0aHJlZjk5Ij48L2E+PGEgaWQ9InN0aHJlZjEwMCIgbmFtZT0ic3RocmVmMTAwIj48L2E+PGEgaWQ9InN0aHJlZjEwMSIgbmFtZT0ic3RocmVmMTAxIj48L2E+PGEgaWQ9InN0aHJlZjEwMiIgbmFtZT0ic3RocmVmMTAyIj48L2E+VXNlIGFuIDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRlZCBNYXBwaW5nPC9zcGFuPiB0byBzcGVjaWZ5IGEgcGVyc2lzdGVudCBmaWVsZCBvciBwcm9wZXJ0eSBvZiBhbiBlbnRpdHkgd2hvc2UgdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgYW4gZW1iZWRkYWJsZSBjbGFzcy48L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgcmlnaHQtY2xpY2sgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgYXMgJmd0OyBFbWJlZGRlZDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE2Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTYiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij5FbnRpdHkgTWFwcGluZyBIeXBlcmxuazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE2IHIxYzItdDE2Ij5EZWZpbmVzIHRoaXMgbWFwcGluZyBhcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRlZDwvc3Bhbj4uCi08cD5UaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARW1iZWRkZWQ8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTYgcjFjMy10MTYiPkVtYmVkZGVkPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+QXR0cmlidXRlIE92ZXJyaWRlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZ5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG1hcHBpbmcgb2YgYW4gZW50aXR5J3MgYXR0cmlidXRlLiBTZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij5Db2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTYgcjFjMi10MTYiPlRoZSBkYXRhYmFzZSBjb2x1bW4gKGFuZCBpdHMgdGFibGUpIG1hcHBlZCB0byB0aGUgZW50aXR5IGF0dHJpYnV0ZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dDQkhCIj4iQ29sdW1uIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5OYW1lICZuZGFzaDsgTmFtZSBvZiB0aGUgZGF0YWJhc2UgY29sdW1uLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UYWJsZSAmbmRhc2g7IE5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEVtYmVkZGVkCi1AQXR0cmlidXRlT3ZlcnJpZGUoY29sdW1uPUBDb2x1bW4odGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fVEFCTEUmZ3Q7PC9zcGFuPiIsIG5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iKSkKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiYTc1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDUgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5FbWJlZGRlZCBJRCBtYXBwaW5nPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW1iZWRkZWQgSUQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhESUFFRSIgbmFtZT0iQ0lIRElBRUUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVtYmVkZGVkIElEIG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjEwMyIgbmFtZT0ic3RocmVmMTAzIj48L2E+PGEgaWQ9InN0aHJlZjEwNCIgbmFtZT0ic3RocmVmMTA0Ij48L2E+PGEgaWQ9InN0aHJlZjEwNSIgbmFtZT0ic3RocmVmMTA1Ij48L2E+PGEgaWQ9InN0aHJlZjEwNiIgbmFtZT0ic3RocmVmMTA2Ij48L2E+VXNlIGFuIDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRlZCBJRCBNYXBwaW5nPC9zcGFuPiB0byBzcGVjaWZ5IHRoZSBwcmltYXJ5IGtleSBvZiBhbiBlbWJlZGRlZCBJRC4gVGhlc2UgbWFwcGluZ3MgbWF5IGJlIHVzZWQgd2l0aCBhIDxhIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJGRUlDRSI+RW1iZWRkYWJsZTwvYT4gZW50aXRpZXMuPC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBFbWJlZGRlZCBJZDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE3Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTciPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij5FbnRpdHkgTWFwcGluZyBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNyByMWMyLXQxNyI+RGVmaW5lcyB0aGlzIG1hcHBpbmcgYXMgYSA8c3BhbiBjbGFzcz0iYm9sZCI+RW1iZWRkZWQgSWQ8L3NwYW4+LgotPHA+VGhpcyBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QEVtYmVkZGVkSWQ8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTcgcjFjMy10MTciPkVtYmVkZGVkIElkPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1ARW1iZWRkZWRJZAotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmYwYTI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDUgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5JRCBtYXBwaW5nPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSUQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJHQ0JIRyIgbmFtZT0iQkFCR0NCSEciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPklEIG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjEwNyIgbmFtZT0ic3RocmVmMTA3Ij48L2E+PGEgaWQ9InN0aHJlZjEwOCIgbmFtZT0ic3RocmVmMTA4Ij48L2E+PGEgaWQ9InN0aHJlZjEwOSIgbmFtZT0ic3RocmVmMTA5Ij48L2E+PGEgaWQ9InN0aHJlZjExMCIgbmFtZT0ic3RocmVmMTEwIj48L2E+VXNlIGFuIDxzcGFuIGNsYXNzPSJib2xkIj5JRCBNYXBwaW5nPC9zcGFuPiB0byBzcGVjaWZ5IHRoZSBwcmltYXJ5IGtleSBvZiBhbiBlbnRpdHkuIElEIG1hcHBpbmdzIG1heSBiZSB1c2VkIHdpdGggYSA8YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT4gb3IgPGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT4uIEVhY2ggPGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+IG11c3QgaGF2ZSBhbiBJRCBtYXBwaW5nLjwvcD4KLTxvbCBzdGFydD0iMSI+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCBzZWxlY3QgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+UmlnaHQgY2xpY2sgdGhlIGZpbGVkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIGFzICZndDsgSUQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkhGSUoiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+IGZpZWxkcyBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTgiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+RW50aXR5IE1hcHBpbmcgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTggcjFjMi10MTgiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGFuIDxzcGFuIGNsYXNzPSJib2xkIj5JRCBNYXBwaW5nPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBJZDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOCByMWMzLXQxOCI+SUQ8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij5Db2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOCByMWMyLXQxOCI+VGhlIGRhdGFiYXNlIGNvbHVtbiBtYXBwZWQgdG8gdGhlIGVudGl0eSBhdHRyaWJ1dGUuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHQ0JIQiI+IkNvbHVtbiI8L2E+IGZvciBkZXRhaWxzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE4IHIxYzMtdDE4Ij5CeSBkZWZhdWx0LCB0aGUgQ29sdW1uIGlzIGFzc3VtZWQgdG8gYmUgbmFtZWQgaWRlbnRpY2FsbHkgdG8gdGhlIGF0dHJpYnV0ZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij5UYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE4IHIxYzItdDE4Ij5UaGUgZGF0YWJhc2UgdGFibGUgbWFwcGVkIHRvIHRoZSBlbnRpdHkgYXR0cmlidXRlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE4IHIxYzMtdDE4Ij5CeSBkZWZhdWx0LCB0aGUgVGFibGUgaXMgYXNzdW1lZCB0byBiZSBpZGVudGljYWwgdG8gdGhlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXR5LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxOCIgaGVhZGVycz0icjFjMS10MTgiPlRlbXBvcmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTggcjFjMi10MTgiPlNwZWNpZmllcyB0aGUgdHlwZSBvZiBkYXRhLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDRUFKR0QiPiJUZW1wb3JhbCI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RGF0ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lPC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWVzdGFtcDwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTggcjFjMy10MTgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSBmaWVsZHMgaW4gPGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNGQ0NBQiI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvYT4gYXJlYSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUEsgR2VuZXJhdGlvbiB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBLIEdlbmVyYXRpb24gdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE5Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTkiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzItdDE5Ij5UaGVzZSBmaWVsZHMgZGVmaW5lIGhvdyB0aGUgcHJpbWFyeSBrZXkgaXMgZ2VuZXJhdGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij4mbmJzcDsmbmJzcDtTdHJhdGVneTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE5IHIxYzItdDE5Ij5TZWUgPGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNCQUpCQyI+IlByaW1hcnkgS2V5IEdlbmVyYXRpb24iPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkF1dG88L3A+Ci08L2xpPgotPGxpPgotPHA+U2VxdWVuY2U8L3A+Ci08L2xpPgotPGxpPgotPHA+SWRlbnRpdHk8L3A+Ci08L2xpPgotPGxpPgotPHA+VGFibGU8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE5IHIxYzMtdDE5Ij5BdXRvPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7R2VuZXJhdG9yJm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzItdDE5Ij5OYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBnZW5lcmF0b3Igc3BlY2lmaWVkIGluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+U3RyYXRlZ3k8L3NwYW4+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5BZGRpdGlvbmFsIGZpZWxkcyB3aWxsIGFwcGVhciBpbiB0aGUgPGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNGQ0NBQiI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvYT4gYXJlYSwgZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBTdHJhdGVneS4gU2VlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPiJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPC9hPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQElkCi1AQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgdGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iLCBpbnNlcnRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtJTlNFUlRBQkxFJmd0Ozwvc3Bhbj4sCi0gICAgdXBkYXRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtVUERBVEFCTEUmZ3Q7PC9zcGFuPikKLUBUZW1wb3JhbCg8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEVNUE9SQUwmZ3Q7PC9zcGFuPikKLUBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT1HZW5lcmF0b3JUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtTVFJBVEVHWSZndDs8L3NwYW4+LCBnZW5lcmF0b3I9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtHRU5FUkFUT1JfTkFNRSZndDs8L3NwYW4+IilAVGFibGVHZW5lcmF0b3IobmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX0dFTkVSQVRPUl9OQU1FJmd0Ozwvc3Bhbj4iLCB0YWJsZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfR0VORVJBVE9SX1RBQkxFJmd0Ozwvc3Bhbj4iLCAKLSAgICBwa0NvbHVtbk5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX0dFTkVSQVRPUl9QSyZndDs8L3NwYW4+IiwgCi0gICAgdmFsdWVDb2x1bW5OYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9HRU5FUkFUT1JfVkFMVUVfQ09MVU1OJmd0Ozwvc3Bhbj4iLCAKLSAgICBwa0NvbHVtblZhbHVlID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9HRU5FUkFUT1JfUEtfQ09MVU1OX1ZBTFVFJmd0Ozwvc3Bhbj4iKUBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7U0VRVUVOQ0VfR0VORVJBVE9SX05BTUUmZ3Q7PC9zcGFuPiIsIAotICAgIHNlcXVlbmNlTmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1NFUVVFTkNFX0dFTkVSQVRPUl9TRVFVRU5DRSZndDs8L3NwYW4+IikKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzMTUzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA1IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+TWFueS10by1tYW55IG1hcHBpbmc8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYW55LXRvLW1hbnkgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJFSUVHRCIgbmFtZT0iQkFCRUlFR0QiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1hbnktdG8tbWFueSBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMTEiIG5hbWU9InN0aHJlZjExMSI+PC9hPjxhIGlkPSJzdGhyZWYxMTIiIG5hbWU9InN0aHJlZjExMiI+PC9hPjxhIGlkPSJzdGhyZWYxMTMiIG5hbWU9InN0aHJlZjExMyI+PC9hPjxhIGlkPSJzdGhyZWYxMTQiIG5hbWU9InN0aHJlZjExNCI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55LXRvLU1hbnkgTWFwcGluZzwvc3Bhbj4gdG8gZGVmaW5lIGEgbWFueS12YWx1ZWQgYXNzb2NpYXRpb24gd2l0aCBtYW55LXRvLW1hbnkgbXVsdGlwbGljaXR5LiBBIG1hbnktdG8tbWFueSBtYXBwaW5nIGhhcyB0d28gc2lkZXM6IHRoZSA8c3BhbiBjbGFzcz0iaXRhbGljIj5vd25pbmcgc2lkZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJpdGFsaWMiPm5vbi1vd25pbmcgc2lkZTwvc3Bhbj4uIFlvdSBtdXN0IHNwZWNpZnkgdGhlIGpvaW4gdGFibGUgb24gdGhlIG93bmluZyBzaWRlLiBGb3IgYmlkaXJlY3Rpb25hbCBtYXBwaW5ncywgZWl0aGVyIHNpZGUgbWF5IGJlIHRoZSBvd25pbmcgc2lkZS48L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IE1hbnktdG9NYW55PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZCBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgb2YgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjAiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIwIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPk1hcHBpbmcgRW50aXR5IEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIwIHIxYzItdDIwIj5EZWZpbmVzIHRoaXMgbWFwcGluZyBhcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55IHRvIE1hbnkgTWFwcGluZzwvc3Bhbj4uCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ATWFueVRvTWFueTwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMCByMWMzLXQyMCI+TWFueSB0byBNYW55PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+VGFyZ2V0IEVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIwIHIxYzItdDIwIj5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMCByMWMzLXQyMCI+bnVsbAotPHA+WW91IGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdGFyZ2V0IGVudGl0eSwgc2luY2UgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+RmV0Y2g8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMyLXQyMCI+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHR0dIQiI+IkZldGNoIFR5cGUiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkVhZ2VyPC9wPgotPC9saT4KLTxsaT4KLTxwPkxhenk8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIwIHIxYzMtdDIwIj5MYXp5PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+TWFwcGVkIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjAgcjFjMi10MjAiPlRoZSBkYXRhYmFzZSBmaWVsZCB0aGF0IG93bnMgdGhlIHJlbGF0aW9uc2hpcC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+T3JkZXIgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMCByMWMyLXQyMCI+U3BlY2lmeSB0aGUgZGVmYXVsdCBvcmRlciBmb3Igb2JqZWN0cyByZXR1cm5lZCBmcm9tIGEgcXVlcnkuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNEQURJSCI+Ik9yZGVyIEJ5IjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5ObyBvcmRlcmluZzwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QcmltYXJ5IGtleTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DdXN0b208L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIwIHIxYzMtdDIwIj5ObyBvcmRlcmluZzwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSBmaWVsZHMgaW4gdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxNC5odG0jQ0FDQkFFQkMiPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L2E+IGFyZWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIEpvaW4gVGFibGUgdGFiIG9mIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgSm9pbiBUYWJsZSB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIxIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjEiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIxIHIxYzItdDIxIj5OYW1lIG9mIHRoZSBqb2luIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMSByMWMzLXQyMSI+WW91IG11c3Qgc3BlY2lmeSB0aGUgam9pbiB0YWJsZSBvbiB0aGUgb3duaW5nIHNpZGUuCi08cD5CeSBkZWZhdWx0LCB0aGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBwcmltYXJ5IHRhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0aWVzIGNvbmNhdGVuYXRlZCB3aXRoIGFuIHVuZGVyc2NvcmUuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+Sm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjEgcjFjMi10MjEiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMSByMWMzLXQyMSI+QnkgZGVmYXVsdCwgdGhlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgcHJpbWFyeSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdGllcyBjb25jYXRlbmF0ZWQgd2l0aCBhbiB1bmRlcnNjb3JlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPkludmVyc2UgSm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjEgcjFjMi10MjEiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMSByMWMzLXQyMSI+QnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgaXMgYXNzdW1lZCB0byBoYXZlIGEgc2luZ2xlIGpvaW4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VG8gYWRkIGEgbmV3IEpvaW4gb3IgSW52ZXJzZSBKb2luIENvbHVtbiwgY2xpY2sgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5BZGQ8L3NwYW4+LjwvcD4KLTxwPlRvIGVkaXQgYW4gZXhpc3RpbmcgSm9pbiBvciBJbnZlcnNlIEpvaW4gQ29sdW1uLCBzZWxlY3QgdGhlIGZpZWxkIHRvIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkVkaXQ8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBKb2luVGFibGUoam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OJmd0Ozwvc3Bhbj4iKSwgCi0gICAgbmFtZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9UQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iKQotQE1hbnlUb01hbnkoY2FzY2FkZT1DYXNjYWRlVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q0FTQ0FERV9UWVBFJmd0Ozwvc3Bhbj4sIGZldGNoPUZldGNoVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LAotICAgIHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LCBtYXBwZWRCeSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7TUFQUEVEX0JZJmd0Ozwvc3Bhbj4iKQotQE9yZGVyQnkoIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtPUkRFUl9CWSZndDs8L3NwYW4+IikKLQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ1OWRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDUgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5NYW55LXRvLW9uZSBtYXBwaW5nPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFueS10by1vbmUgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJIRkFGSiIgbmFtZT0iQkFCSEZBRkoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1hbnktdG8tb25lIG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjExNSIgbmFtZT0ic3RocmVmMTE1Ij48L2E+PGEgaWQ9InN0aHJlZjExNiIgbmFtZT0ic3RocmVmMTE2Ij48L2E+PGEgaWQ9InN0aHJlZjExNyIgbmFtZT0ic3RocmVmMTE3Ij48L2E+PGEgaWQ9InN0aHJlZjExOCIgbmFtZT0ic3RocmVmMTE4Ij48L2E+VXNlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbnktdG8tT25lPC9zcGFuPiBtYXBwaW5nIHRvIGRlZmluZXMgYSBzaW5nbGUtdmFsdWVkIGFzc29jaWF0aW9uIHRvIGFub3RoZXIgZW50aXR5IGNsYXNzIHRoYXQgaGFzIG1hbnktdG8tb25lIG11bHRpcGxpY2l0eS48L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0IGNsaWNrIHRoZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IE1hbnktdG8tT25lPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgSlBBIERldGFpbHMgdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW9uIHRoZSBHZW5lcmFsIHRhYiBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGlvbiB0aGUgR2VuZXJhbCB0YWIgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjIiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIyIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyMiIgaGVhZGVycz0icjFjMS10MjIiPk1hcHBpbmcgRW50aXR5IEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIyIHIxYzItdDIyIj5EZWZpbmVzIG1hcHBpbmcgYXMgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbnktdG8tT25lPC9zcGFuPi4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QE1hbnlUb09uZTwvY29kZT4gYW5ub3RhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMiByMWMzLXQyMiI+TWFueS10by1PbmU8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjIiIGhlYWRlcnM9InIxYzEtdDIyIj5UYXJnZXQgRW50aXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjIgcjFjMi10MjIiPlRoZSBlbnRpdHkgdG8gd2hpY2ggdGhpcyBhdHRyaWJ1dGUgaXMgbWFwcGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIyIHIxYzMtdDIyIj5udWxsCi08cD5Zb3UgZG8gbm90IG5lZWQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB0YXJnZXQgZW50aXR5LCBzaW5jZSBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiBvYmplY3QgYmVpbmcgcmVmZXJlbmNlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjIiIGhlYWRlcnM9InIxYzEtdDIyIj5GZXRjaDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIyIHIxYzItdDIyIj5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjIgcjFjMy10MjIiPkVhZ2VyPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDIyIiBoZWFkZXJzPSJyMWMxLXQyMiI+Q2FzY2FkZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDIyIHIxYzItdDIyIj5TZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDSkFJSEIiPiJDYXNjYWRlIFR5cGUiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkRlZmF1bHQ8L3A+Ci08L2xpPgotPGxpPgotPHA+QWxsPC9wPgotPC9saT4KLTxsaT4KLTxwPlBlcnNpc3Q8L3A+Ci08L2xpPgotPGxpPgotPHA+TWVyZ2U8L3A+Ci08L2xpPgotPGxpPgotPHA+UmVtb3ZlPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMiByMWMzLXQyMiI+RGVmYXVsdDwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyMiIgaGVhZGVycz0icjFjMS10MjIiPk9wdGlvbmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjIgcjFjMi10MjIiPlNwZWNpZmllcyBpZiB0aGlzIGZpZWxkIGlzIGNhbiBiZSBudWxsLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIyIHIxYzMtdDIyIj5ZZXM8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgZmllbGRzIG9uIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTUuaHRtI0NBQ0ZDRUpDIj5Kb2luIENvbHVtbnMgSW5mb3JtYXRpb248L2E+IHRhYiBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIzIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjMiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIzIiBoZWFkZXJzPSJyMWMxLXQyMyI+Sm9pbiBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMyByMWMyLXQyMyI+PGEgaWQ9InN0aHJlZjExOSIgbmFtZT0ic3RocmVmMTE5Ij48L2E+PGEgaWQ9InN0aHJlZjEyMCIgbmFtZT0ic3RocmVmMTIwIj48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjMgcjFjMy10MjMiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEpvaW5UYWJsZShqb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9DT0xVTU4mZ3Q7PC9zcGFuPiIpLCAKLSAgICBuYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX1RBQkxFX05BTUUmZ3Q7PC9zcGFuPiIpCi1ATWFueVRvT25lKHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LCBmZXRjaD08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LCAKLSAgICBjYXNjYWRlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDQVNDQURFX1RZUEUmZ3Q7PC9zcGFuPikKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE2Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc5MjdkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA1IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+T25lLXRvLW1hbnkgbWFwcGluZzwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik9uZS10by1tYW55IG1hcHBpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSEdFQkQiIG5hbWU9IkJBQkhHRUJEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5PbmUtdG8tbWFueSBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMjEiIG5hbWU9InN0aHJlZjEyMSI+PC9hPjxhIGlkPSJzdGhyZWYxMjIiIG5hbWU9InN0aHJlZjEyMiI+PC9hPjxhIGlkPSJzdGhyZWYxMjMiIG5hbWU9InN0aHJlZjEyMyI+PC9hPjxhIGlkPSJzdGhyZWYxMjQiIG5hbWU9InN0aHJlZjEyNCI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5PbmUtdG8tTWFueSBNYXBwaW5nPC9zcGFuPiB0byBkZWZpbmUgYSByZWxhdGlvbnNoaXAgd2l0aCBvbmUtdG8tbWFueSBtdWx0aXBsaWNpdHkuPC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBPbmUtdG8tbWFueTwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT4gZmllbGRzIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBHZW5lcmFsIHRhYiBvZiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIEdlbmVyYWwgdGFiIG9mIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjQiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI0Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPk1hcHBpbmcgRW50aXR5IFR5cGUgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjQgcjFjMi10MjQiPkRlZmluZXMgbWFwcGluZyBhcyA8c3BhbiBjbGFzcz0iYm9sZCI+T25lLXRvLU1hbnk8L3NwYW4+LiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AT25lVG9NYW55PC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI0IHIxYzMtdDI0Ij5PbmUtdG8tTWFueTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPlRhcmdldCBFbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNCByMWMyLXQyNCI+VGhlIGVudGl0eSB0byB3aGljaCB0aGlzIGF0dHJpYnV0ZSBpcyBtYXBwZWQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPkNhc2NhZGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNCByMWMyLXQyNCI+U2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0pBSUhCIj4iQ2FzY2FkZSBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5EZWZhdWx0PC9wPgotPC9saT4KLTxsaT4KLTxwPkFsbDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QZXJzaXN0PC9wPgotPC9saT4KLTxsaT4KLTxwPk1lcmdlPC9wPgotPC9saT4KLTxsaT4KLTxwPlJlbW92ZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPkZldGNoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjQgcjFjMi10MjQiPkRlZmluZXMgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0dHSEIiPiJGZXRjaCBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5FYWdlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5MYXp5PC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNCByMWMzLXQyNCI+RWFnZXI8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij5NYXBwZWQgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNCByMWMyLXQyNCI+VGhlIGRhdGFiYXNlIGZpZWxkIHRoYXQgb3ducyB0aGUgcmVsYXRpb25zaGlwLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI0IHIxYzMtdDI0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij5PcmRlciBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI0IHIxYzItdDI0Ij5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0RBRElIIj4iT3JkZXIgQnkiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPk5vIG9yZGVyaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5PC9wPgotPC9saT4KLTxsaT4KLTxwPkN1c3RvbTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjQgcjFjMy10MjQiPk5vIG9yZGVyaW5nPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxNC5odG0jQ0FDQkFFQkMiPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L2E+IGZpZWxkcyBpbiB0aGUgSlBBIERldGFpbHMgdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIEpvaW4gVGFibGUgdGFiIG9mIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgSm9pbiBUYWJsZSB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzItdDI1Ij5OYW1lIG9mIHRoZSBqb2luIHRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjUgcjFjMy10MjUiPkJ5IGRlZmF1bHQsIHRoZSBuYW1lIGlzIGFzc3VtZWQgdG8gYmUgdGhlIHByaW1hcnkgdGFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXRpZXMgY29uY2F0ZW5hdGVkIHdpdGggYW4gdW5kZXJzY29yZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij5Kb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMyLXQyNSI+U3BlY2lmeSB0d28gb3IgbW9yZSBqb2luIGNvbHVtbnMgKHRoYXQgaXMsIGEgcHJpbWFyeSBrZXkpLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij5JbnZlcnNlIEpvaW4gQ29sdW1uczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI1IHIxYzItdDI1Ij5UaGUgam9pbiBjb2x1bW4gb24gdGhlIG93bmVkIChvciBpbnZlcnNlKSBzaWRlIG9mIHRoZSBhc3NvY2lhdGlvbjogdGhlIG93bmVkIGVudGl0eSdzIHByaW1hcnkga2V5IGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AT25lVG9NYW55KHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+KQotQENvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OJmd0Ozwvc3Bhbj4iKQotCi0KLUBPbmVUb01hbnkodGFyZ2V0RW50aXR5PTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQVJHRVRfRU5USVRZJmd0Ozwvc3Bhbj4uY2xhc3MsIGNhc2NhZGU9Q2FzY2FkZVR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NBU0NBREVfVFlQRSZndDs8L3NwYW4+LCAKLSAgICBmZXRjaCA9IEZldGNoVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LCBtYXBwZWRCeSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7TUFQUEVEX0JZJmd0Ozwvc3Bhbj4iKUBPcmRlckJ5KCI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7T1JERVJfQlkmZ3Q7PC9zcGFuPiIpCi1ASm9pblRhYmxlKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX1RBQkxFX05BTUUmZ3Q7PC9zcGFuPiIsIGpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9Ci0gICAgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OJmd0Ozwvc3Bhbj4iKSwgCi0gICAgaW52ZXJzZUpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtJTlZFUlNFX0pPSU5fQ09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIsIAotICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7SU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTiZndDs8L3NwYW4+IikpCi0KLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZiZjA3NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA2IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+T25lLXRvLW9uZSBtYXBwaW5nPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iT25lLXRvLW9uZSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZIQkNKIiBuYW1lPSJCQUJGSEJDSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+T25lLXRvLW9uZSBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMjUiIG5hbWU9InN0aHJlZjEyNSI+PC9hPjxhIGlkPSJzdGhyZWYxMjYiIG5hbWU9InN0aHJlZjEyNiI+PC9hPjxhIGlkPSJzdGhyZWYxMjciIG5hbWU9InN0aHJlZjEyNyI+PC9hPjxhIGlkPSJzdGhyZWYxMjgiIG5hbWU9InN0aHJlZjEyOCI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5PbmUtdG8tT25lIE1hcHBpbmc8L3NwYW4+IHRvIGRlZmluZSBhIHJlbGF0aW9uc2hpcCB3aXRoIG9uZS10by1tYW55IG11bHRpcGxpY2l0eS48L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IE9uZS10by1PbmU8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPiBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHNlbGVjdGVkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkhGSUoiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+IGZpZWxkcyBpbiB0aGUgSlBBIERldGFpbHMgdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjYiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI2Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPk1hcHBlZCBFbnRpdHkgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjYgcjFjMi10MjYiPkRlZmluZXMgbWFwcGluZyBhcyA8c3BhbiBjbGFzcz0iYm9sZCI+T25lLXRvLU9uZTwvc3Bhbj4uIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBPbmVUb09uZTwvY29kZT4gYW5ub3RhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNiByMWMzLXQyNiI+T25lLXRvLU9uZTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPlRhcmdldCBFbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNiByMWMyLXQyNiI+VGhlIGVudGl0eSB0byB3aGljaCB0aGlzIGF0dHJpYnV0ZSBpcyBtYXBwZWQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjYgcjFjMy10MjYiPm51bGwKLTxwPllvdSBkbyBub3QgbmVlZCB0byBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHRhcmdldCBlbnRpdHksIHNpbmNlIGl0IGNhbiBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIG9iamVjdCBiZWluZyByZWZlcmVuY2VkLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPkZldGNoIFR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNiByMWMyLXQyNiI+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHR0dIQiI+IkZldGNoIFR5cGUiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkVhZ2VyPC9wPgotPC9saT4KLTxsaT4KLTxwPkxhenk8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI2IHIxYzMtdDI2Ij5FYWdlcjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPk1hcHBlZCBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI2IHIxYzItdDI2Ij5UaGUgZGF0YWJhc2UgZmllbGQgdGhhdCBvd25zIHRoZSByZWxhdGlvbnNoaXAuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjYgcjFjMy10MjYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMTUuaHRtI0NBQ0ZDRUpDIj5Kb2luIENvbHVtbnMgSW5mb3JtYXRpb248L2E+IGZpZWxkcyBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI3Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjciPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI3IiBoZWFkZXJzPSJyMWMxLXQyNyI+Sm9pbiBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNyByMWMyLXQyNyI+PGEgaWQ9InN0aHJlZjEyOSIgbmFtZT0ic3RocmVmMTI5Ij48L2E+PGEgaWQ9InN0aHJlZjEzMCIgbmFtZT0ic3RocmVmMTMwIj48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjcgcjFjMy10MjciPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQE9uZVRvT25lKHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LCBjYXNjYWRlPUNhc2NhZGVUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDQVNDQURFX1RZUEUmZ3Q7PC9zcGFuPiwgCi0gICAgZmV0Y2ggPSBGZXRjaFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0ZFVENIX1RZUEUmZ3Q7PC9zcGFuPiwgbWFwcGVkQnkgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O01BUFBFRF9CWSZndDs8L3NwYW4+IikKLUBKb2luQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0KLSAgICAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OJmd0Ozwvc3Bhbj4iLCBpbnNlcnRhYmxlID0gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOU0VSVEFCTEUmZ3Q7PC9zcGFuPiwgCi0gICAgdXBkYXRhYmxlID0gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1VQREFUQUJMRSZndDs8L3NwYW4+KQotCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE4Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOTk0ZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA2IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+VHJhbnNpZW50IG1hcHBpbmc8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJUcmFuc2llbnQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJIRkhFSSIgbmFtZT0iQkFCSEZIRUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlRyYW5zaWVudCBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMzEiIG5hbWU9InN0aHJlZjEzMSI+PC9hPjxhIGlkPSJzdGhyZWYxMzIiIG5hbWU9InN0aHJlZjEzMiI+PC9hPjxhIGlkPSJzdGhyZWYxMzMiIG5hbWU9InN0aHJlZjEzMyI+PC9hPjxhIGlkPSJzdGhyZWYxMzQiIG5hbWU9InN0aHJlZjEzNCI+PC9hPlVzZSB0aGUgVHJhbnNpZW50IE1hcHBpbmcgdG8gc3BlY2lmeSBhIGZpZWxkIG9mIHRoZSBlbnRpdHkgY2xhc3MgdGhhdCA8c3BhbiBjbGFzcz0iaXRhbGljIj5pcyBub3Q8L3NwYW4+IHBlcnNpc3RlbnQuPC9wPgotPHA+VG8gY3JlYXRlIGEgdHJhbnNpZW50IG1hcHBpbmc6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgVHJhbnNpZW50PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb24gdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBUcmFuc2llbnQKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhNWNiNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA2IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+VmVyc2lvbiBtYXBwaW5nPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVmVyc2lvbiBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkhJQklJIiBuYW1lPSJCQUJISUJJSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+VmVyc2lvbiBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMzUiIG5hbWU9InN0aHJlZjEzNSI+PC9hPjxhIGlkPSJzdGhyZWYxMzYiIG5hbWU9InN0aHJlZjEzNiI+PC9hPjxhIGlkPSJzdGhyZWYxMzciIG5hbWU9InN0aHJlZjEzNyI+PC9hPjxhIGlkPSJzdGhyZWYxMzgiIG5hbWU9InN0aHJlZjEzOCI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5WZXJzaW9uIE1hcHBpbmc8L3NwYW4+IHRvIHNwZWNpZnkgdGhlIGZpZWxkIHVzZWQgZm9yIG9wdGltaXN0aWMgbG9ja2luZy4gSWYgdGhlIGVudGl0eSBpcyBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUgdGFibGVzLCB5b3Ugc2hvdWxkIHVzZSBhIHZlcnNpb24gbWFwcGluZyBvbmx5IHdpdGggdGhlIHByaW1hcnkgdGFibGUuIFlvdSBzaG91bGQgaGF2ZSBvbmx5IGEgc2luZ2xlIHZlcnNpb24gbWFwcGluZyBwZXIgcGVyc2lzdGVudCBlbnRpdHkuIFZlcnNpb24gbWFwcGluZ3MgbWF5IGJlIHVzZWQgb25seSB3aXRoIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlIHR5cGVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxjb2RlPmludDwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+SW50ZWdlcjwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+c2hvcnQsIFNob3J0PC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5sb25nLCBMb25nPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5UaW1lc3RhbXA8L2NvZGU+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5UbyBjcmVhdGUgYSB2ZXJzaW9uIG1hcHBpbmc6PC9wPgotPG9sIHN0YXJ0PSIxIj4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBWZXJzaW9uPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIHJlbWFpbmluZyBmaWVsZHMgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI4Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjgiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyOCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij5NYXBwZWQgRW50aXR5IEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI4IHIxYzItdDI4Ij5EZWZpbmVzIHRoZSBtYXBwaW5nIGFzIFZlcnNpb24uIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBWZXJzaW9uPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI4IHIxYzMtdDI4Ij5WZXJzaW9uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI4IiBoZWFkZXJzPSJyMWMxLXQyOCI+Q29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjggcjFjMi10MjgiPlRoZSBkYXRhYmFzZSBjb2x1bW4gbWFwcGVkIHRvIHRoZSBlbnRpdHkgYXR0cmlidXRlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0NCSEIiPiJDb2x1bW4iPC9hPiBmb3IgZGV0YWlscy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyOCByMWMzLXQyOCI+QnkgZGVmYXVsdCwgdGhlIENvbHVtbiBpcyBhc3N1bWVkIHRvIGJlIG5hbWVkIGlkZW50aWNhbGx5IHRvIHRoZSBhdHRyaWJ1dGUgYW5kIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+SU5TRVJUPC9jb2RlPiBhbmQgPGNvZGU+VVBEQVRFPC9jb2RlPiBzdGF0ZW1lbnRzLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPlRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjggcjFjMi10MjgiPk5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlLiBUaGlzIG11c3QgYmUgdGhlIHByaW1hcnkgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUncyBlbnRpdHkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjggcjFjMy10MjgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPlRlbXBvcmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjggcjFjMi10MjgiPlNwZWNpZmllcyB0aGUgdHlwZSBvZiBkYXRhLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDRUFKR0QiPiJUZW1wb3JhbCI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RGF0ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lPC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWVzdGFtcDwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjggcjFjMy10MjgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQFZlcnNpb24KLUBDb2x1bW4odGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fVEFCTEUmZ3Q7PC9zcGFuPiIsIG5hbWU9IiZsdDs8c3BhbiBjbGFzcz0iaXRhbGljIj5DT0xVTU5fTkFNRTwvc3Bhbj4mZ3Q7IikKLQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTA5ODRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowNiAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkJBR0ZJIiBuYW1lPSJCQUJCQUdGSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj4KLTxoMT5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMzkiIG5hbWU9InN0aHJlZjEzOSI+PC9hPjxhIGlkPSJzdGhyZWYxNDAiIG5hbWU9InN0aHJlZjE0MCI+PC9hPlVzZSB0aGlzIHByb2NlZHVyZSB0byBnZW5lcmF0ZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgZnJvbSBkYXRhYmFzZSB0YWJsZXMuIFlvdSBtdXN0IGNyZWF0ZSBhIEpQQSBwcm9qZWN0IGFuZCBlc3RhYmxpc2ggYSBkYXRhYmFzZSBjb25uZWN0aW9uIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmJlZm9yZTwvc3Bhbj4gZ2VuZXJhdGluZyBwZXJzaXN0ZW50IGVudGl0aWVzLiBTZWUgPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj4iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIEpQQSBwcm9qZWN0IGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+UGFja2FnZSBFeHBsb3Jlcjwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkpQQSBUb29scyAmZ3Q7IEdlbmVyYXRlIEVudGl0aWVzPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNDEiIG5hbWU9InN0aHJlZjE0MSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkdlbmVyYXRpbmcgRW50aXRpZXM8L3A+Ci08aW1nIHNyYz0iaW1nL2dlbmVyYXRlX2VudGl0aWVzLnBuZyIgYWx0PSJVc2luZyB0aGUgSlBBIFRvb2xzICZndDsgR2VuZXJhdGUgRW50aXRpZXMgbWVudSBvcHRpb24uIiB0aXRsZT0iVXNpbmcgdGhlIEpQQSBUb29scyAmZ3Q7IEdlbmVyYXRlIEVudGl0aWVzIG1lbnUgb3B0aW9uLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPklmIHlvdSBhcmUgbm90IGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIGRhdGFiYXNlLCB0aGUgRGF0YWJhc2UgQ29ubmVjdGlvbiBwYWdlIGFwcGVhcnMuIFNlbGVjdCB5b3VyIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHNjaGVtYSwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5SZWNvbm5lY3Q8L3NwYW4+LjwvcD4KLTxwPlRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIGNvbm5lY3Rpb248L3NwYW4+LjwvcD4KLTxwPkFmdGVyIGNvbm5lY3RpbmcgdG8gdGhlIGRhdGFiYXNlLCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGlkPSJzdGhyZWYxNDIiIG5hbWU9InN0aHJlZjE0MiI+PC9hPjxhIGlkPSJzdGhyZWYxNDMiIG5hbWU9InN0aHJlZjE0MyI+PC9hPk9uIHRoZSA8YSBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bSNDQUNEQUZKRCI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgZGlhbG9nPC9hPiBkaWFsb2csIHNlbGVjdCB0aGUgdGFibGVzIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgY3JlYXRlcyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgZm9yIGVhY2ggZGF0YWJhc2UgdGFibGUuIEVhY2ggZW50aXR5IGNvbnRhaW5zIGZpZWxkcyBiYXNlZCBvbiB0aGUgdGFibGUncyBjb2x1bW5zLiBFY2xpcHNlIHdpbGwgYWxzbyBnZW5lcmF0ZSBlbnRpdHkgcmVsYXRpb25zaGlwcyAoc3VjaCBhcyBvbmUtdG8tb25lKSBiYXNlZCBvbiB0aGUgdGFibGUgY29uc3RyYWludHMuIDxhIGhyZWY9IiNDSUhKSUpKQyI+RmlndXJlOiBHZW5lcmF0aW5nIEVudGl0aWVzIGZyb20gVGFibGVzPC9hPiBpbGx1c3RyYXRlcyBob3cgRWNsaXBzZSBnZW5lcmF0ZXMgZW50aXRpZXMgZnJvbSB0YWJsZXMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0iQ0lISklKSkMiIG5hbWU9IkNJSEpJSkpDIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+R2VuZXJhdGluZyBFbnRpdGllcyBmcm9tIFRhYmxlczwvcD4KLTxpbWcgc3JjPSJpbWcvdGFibGVfZW50aXR5LnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgRU1QTE9ZRUUgYW5kIEFERFJFU1MgZW50aXRpZXMgZ2VuZXJhdGVkIGZyb20gZGF0YWJhc2UgdGFibGVzLiIgdGl0bGU9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBFTVBMT1lFRSBhbmQgQUREUkVTUyBlbnRpdGllcyBnZW5lcmF0ZWQgZnJvbSBkYXRhYmFzZSB0YWJsZXMuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08cD48YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKUEEgT3B0aW9uczwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Y5NTMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowNiAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkdlbmVyYXRpbmcgRERMIGZyb20gRW50aXRpZXM8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIERETCBmcm9tIEVudGl0aWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEpJR0JFIiBuYW1lPSJDSUhKSUdCRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGluZyBEREwgZnJvbSBFbnRpdGllczwvaDE+Ci08cD5XaGVuIHVzaW5nIGEgdmVuZG9yLXNwZWNpZmljIHBsYXRmb3JtLCB5b3UgY2FuIGNyZWF0ZSBhIERETCBzY3JpcHQgZnJvbSB5b3VyIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9wPgotPHA+VG8gZ2VuZXJhdGUgYSBEREwgc2NyaXB0OjwvcD4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBKUEEgcHJvamVjdCBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlBhY2thZ2UgRXhwbG9yZXI8L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5KUEEgVG9vbHMgJmd0OyBHZW5lcmF0ZSBEREw8L3NwYW4+LjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08cD48YSBocmVmPSJ0YXNrczAwMS5odG0jQkFCRkJKQkciPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvYT48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jQkFCSkhCQ0kiPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSlBBIE9wdGlvbnM8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkN2ZlYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDYgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5WYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXM8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkFJQkEiIG5hbWU9IkJBQkZBSUJBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTQ0IiBuYW1lPSJzdGhyZWYxNDQiPjwvYT48YSBpZD0ic3RocmVmMTQ1IiBuYW1lPSJzdGhyZWYxNDUiPjwvYT48YSBpZD0ic3RocmVmMTQ2IiBuYW1lPSJzdGhyZWYxNDYiPjwvYT48YSBpZD0ic3RocmVmMTQ3IiBuYW1lPSJzdGhyZWYxNDciPjwvYT5FcnJvcnMgYW5kIHdhcm5pbmdzIG9uIHBlcnNpc3RlbnQgZW50aXRpZXMgYW5kIG1hcHBpbmdzIGFyZSBpbmRpY2F0ZWQgd2l0aCBhIHJlZCBlcnJvciBvciB5ZWxsb3cgd2FybmluZyBuZXh0IHRvIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBlcnJvciwgYXMgd2VsbCBhcyB0aGUgcGFyZW50IGNvbnRhaW5lcnMgdXAgdG8gdGhlIHByb2plY3QuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTQ4IiBuYW1lPSJzdGhyZWYxNDgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TYW1wbGUgRXJyb3JzIGFuZCBXYXJuaW5nczwvcD4KLTxpbWcgc3JjPSJpbWcvZXJyb3Jfc2FtcGxlLnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBzaG93cyBzYW1wbGUgZXJyb3IgYW5kIHdhcm5pbmcgaWNvbnMgaW4gdGhlIEV4cGxvcmVyIHZpZXcuIiB0aXRsZT0iVGhpcyBmaWd1cmUgc2hvd3Mgc2FtcGxlIGVycm9yIGFuZCB3YXJuaW5nIGljb25zIGluIHRoZSBFeHBsb3JlciB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyMy5odG0jQ0lIRkVERUkiPkVycm9yIG1lc3NhZ2VzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyNC5odG0jQ0lIR0VBSUoiPldhcm5pbmcgbWVzc2FnZXM8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPHA+PGEgaHJlZj0iLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvY29uY2VwdHMvY3ByYnZpZXcuaHRtIj5Qcm9ibGVtcyB2aWV3PC9hPjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmZhODFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IEp1bHkgMjMsIDIwMDggODo1OTo0OSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPkVycm9yIG1lc3NhZ2VzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRXJyb3IgbWVzc2FnZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gc3RhcnQtLT4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhGRURFSSIgbmFtZT0iQ0lIRkVERUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVycm9yIG1lc3NhZ2VzPGEgaWQ9InN0aHJlZjE1MSIgbmFtZT0ic3RocmVmMTUxIj48L2E+PC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBlcnJvciBtZXNzYWdlcyAoaW5jbHVkaW5nIGhvdyB0byByZXNvbHZlIHRoZSBpc3N1ZSkgeW91IG1heSBlbmNvdW50ZXIgd2hpbGUgd29ya2luZyB3aXRoIERhbGkuPC9wPgotPGEgaWQ9InN0aHJlZjE1MiIgbmFtZT0ic3RocmVmMTUyIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkF0dHJpYnV0ZSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0FUVFJJQlVURV9fTkFNRSZndDs8L3NwYW4+IiBoYXMgaW52YWxpZCBtYXBwaW5nIHR5cGUgaW4gdGhpcyBjb250ZXh0PC9wPgotPHA+VGhlIG1hcHBlZCBhdHRyaWJ1dGUgaXMgaW52YWxpZC4gRWl0aGVyIGNoYW5nZSB0aGUgbWFwcGluZyB0eXBlIG9yIGNoYW5nZSB0aGUgZW50aXR5IHR5cGUuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPiJNYXBwaW5nIGFuIGVudGl0eSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNTMiIG5hbWU9InN0aHJlZjE1MyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5BdHRyaWJ1dGUgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtBVFRSSUJVVEVfTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+RGFsaSBjYW5ub3QgbWFwIHRoZSBhdHRyaWJ1dGUgdG8gYSBkYXRhYmFzZSB0YWJsZSBhbmQgY29sdW1uLiBWZXJpZnkgdGhhdCB5b3UgZGF0YWJhc2UgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBpcyBjb3JyZWN0LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPiJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNTQiIG5hbWU9InN0aHJlZjE1NCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5DbGFzcyAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NMQVNTX05BTUUmZ3Q7PC9zcGFuPiIgaXMgbm90IGFubm90YXRlZCBhcyBhIHBlcnNpc3RlbnQgY2xhc3MuPC9wPgotPHA+VGhlIGNsYXNzIGhhcyBub3QgYmVlbiBpZGVudGlmaWVkIGFzIGEgcGVyc2lzdGVudCBjbGFzcy4gQ29uZmlndXJlIHRoZSBjbGFzcyBhcyBhbiBFbnRpdHksIE1hcHBlZCBTdXBlcmNsYXNzLCBvciBFbWJlZGRhYmxlIHBlcnNpc3RlbnQgZW50aXR5LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPiJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI8L2E+LjwvcD4KLTxhIGlkPSJzdGhyZWYxNTUiIG5hbWU9InN0aHJlZjE1NSI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5Db2x1bW4gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+WW91IG1hcHBlZCBhbiBlbnRpdHkncyBmaWVsZCB0byBhbiBpbmNvcnJlY3Qgb3IgaW52YWxpZCBjb2x1bW4gaW4gdGhlIGRhdGFiYXNlIHRhYmxlLiBCeSBkZWZhdWx0LCBEYWxpIHdpbGwgYXR0ZW1wdCB0byBtYXAgZWFjaCBmaWVsZCBpbiB0aGUgZW50aXR5IHdpdGggYW4gaWRlbnRpY2FsbHkgbmFtZWQgcm93IGluIHRoZSBkYXRhYmFzZSB0YWJsZS4gSWYgdGhlIGZpZWxkJ3MgbmFtZSBkaWZmZXJzIGZyb20gdGhlIHJvdydzIG5hbWUsIHlvdSBtdXN0IGV4cGxpY2l0bHkgY3JlYXRlIHRoZSBtYXBwaW5nLjwvcD4KLTxwPk1hcCB0aGUgZmllbGQgdG8gYSB2YWxpZCByb3cgaW4gdGhlIGRhdGFiYXNlIHRhYmxlIGFzIHNob3duIGluIDxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPiJNYXBwaW5nIGFuIGVudGl0eSI8L2E+LjwvcD4KLTxhIGlkPSJzdGhyZWYxNTYiIG5hbWU9InN0aHJlZjE1NiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5EdXBsaWNhdGUgY2xhc3MgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDTEFTU19OQU1FJmd0Ozwvc3Bhbj4iLjwvcD4KLTxwPllvdSBjcmVhdGVkIHRvIHBlcnNpc3RlbmNlIGNsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lLiBFYWNoIEphdmEgY2xhc3MgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUuIFNlZSA8YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPiJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNTciIG5hbWU9InN0aHJlZjE1NyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5FbnRpdHkgZG9lcyBub3QgaGF2ZSBhbiBJZCBvciBFbWJlZGRlZCBJZC48L3A+Ci08cD5Zb3UgY3JlYXRlZCBhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGhvdXQgaWRlbnRpZnlpbmcgaXRzIHByaW1hcnkga2V5LiBBIHBlcnNpc3RlbnQgZW50aXR5IG11c3QgaGF2ZSBhIHByaW1hcnkga2V5IGZpZWxkIGRlc2lnbmF0ZWQgd2l0aCBhbiA8Y29kZT5ASWQ8L2NvZGU+IG9yIDxjb2RlPkBFbWJlZGRlZElkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTxwPkFkZCBhbiBJRCBtYXBwaW5nIHRvIHRoZSBlbnRpdHkgYXMgc2hvd24gaW4gPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj4iSUQgbWFwcGluZyI8L2E+IG9yIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNDSUhESUFFRSI+IkVtYmVkZGVkIElEIG1hcHBpbmciPC9hPi48L3A+Ci08YSBpZD0ic3RocmVmMTU4IiBuYW1lPSJzdGhyZWYxNTgiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+TXVsdGlwbGUgcGVyc2lzdGVuY2UueG1sIGZpbGVzIGluIHByb2plY3QuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBKUEEgcHJvamVjdCB3aXRoIG1vcmUgdGhhbiBvbmUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBFYWNoIEpQQSBwcm9qZWN0IG11c3QgY29udGFpbiBhIDxzcGFuIGNsYXNzPSJpdGFsaWMiPnNpbmdsZTwvc3Bhbj4gPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPiJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTU5IiBuYW1lPSJzdGhyZWYxNTkiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+Tm8gcGVyc2lzdGVuY2UgdW5pdCBkZWZpbmVkLjwvcD4KLTxwPlRoZXJlIGlzIG5vIHBlcnNpc3RlbmNlIHVuaXQgZGVmaW5lZCBpbiB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBVc2UgdGhlICZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9VTklUX05BTUUmZ3Q7PC9zcGFuPiIgdGFnIHRvIGRlZmluZSB0aGUgcGVyc2lzdGVudCB1bml0LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj4iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNjAiIG5hbWU9InN0aHJlZjE2MCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5ObyBwZXJzaXN0ZW5jZS54bWwgZmlsZSBpbiBwcm9qZWN0LjwvcD4KLTxwPllvdSBjcmVhdGVkIGEgSlBBIHByb2plY3Qgd2l0aG91dCBhIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS4gRWFjaCBKUEEgcHJvamVjdCBtdXN0IGNvbnRhaW4gYSA8c3BhbiBjbGFzcz0iaXRhbGljIj5zaW5nbGU8L3NwYW4+IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj4iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE2MSIgbmFtZT0ic3RocmVmMTYxIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPlJlZmVyZW5jZWQgY29sdW1uICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIgaW4gam9pbiBjb2x1bW4gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+VGhlIGNvbHVtbiB0aGF0IHlvdSBzZWxlY3RlZCB0byBqb2luIGEgcmVsYXRpb25zaGlwIG1hcHBpbmcgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGRhdGFiYXNlIHRhYmxlLiBFaXRoZXIgc2VsZWN0IGEgZGlmZmVyZW50IGNvbHVtbiBvbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDE0Lmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT4gb3IgY3JlYXRlIHRoZSBuZWNlc3NhcnkgY29sdW1uIG9uIHRoZSBkYXRhYmFzZSB0YWJsZS48L3A+Ci08cD5TZWUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNjIiIG5hbWU9InN0aHJlZjE2MiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5TY2hlbWEgIiZsdDs8c3BhbiBjbGFzcz0iaXRhbGljIj5TQ0hFTUFfTkFNRTwvc3Bhbj4mZ3Q7IiBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIHRhYmxlL2pvaW4gdGFibGUgIiZsdDs8c3BhbiBjbGFzcz0iaXRhbGljIj5UQUJMRV9OQU1FPC9zcGFuPiZndDsiLjwvcD4KLTxwPkRlZmluZSB0aGUgZGVmYXVsdCBkYXRhYmFzZSBzY2hlbWEgaW5mb3JtYXRpb24gaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPiJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE2MyIgbmFtZT0ic3RocmVmMTYzIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPlRhYmxlICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+WW91IGFzc29jaWF0ZWQgYSBwZXJzaXN0ZW50IGVudGl0eSB0byBhbiBpbmNvcnJlY3Qgb3IgaW52YWxpZCBkYXRhYmFzZSB0YWJsZS4gQnkgZGVmYXVsdCwgRGFsaSB3aWxsIGF0dGVtcHQgdG8gYXNzb2NpYXRlIGVhY2ggcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBhbiBpZGVudGljYWxseSBuYW1lZCBkYXRhYmFzZSB0YWJsZS4gSWYgdGhlIGVudGl0eSdzIG5hbWUgZGlmZmVycyBmcm9tIHRoZSB0YWJsZSdzIG5hbWUsIHlvdSBtdXN0IGV4cGxpY2l0bHkgY3JlYXRlIHRoZSBhc3NvY2lhdGlvbi48L3A+Ci08cD5Bc3NvY2lhdGUgdGhlIGVudGl0eSB3aXRoIGEgdmFsaWQgZGF0YWJhc2UgdGFibGUgYXMgc2hvd24gaW4gPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj4iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPC9hPi48L3A+Ci08YSBpZD0ic3RocmVmMTY0IiBuYW1lPSJzdGhyZWYxNjQiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+VW5yZXNvbHZlZCBnZW5lcmF0b3IgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtHRU5FUkFUT1JfTkFNRSZndDs8L3NwYW4+IiBpcyBkZWZpbmVkIGluIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBwZXJzaXN0ZW5jZSBlbnRpdHkgdGhhdCB1c2VzIHNlcXVlbmNpbmcgb3IgYSB0YWJsZSBnZW5lcmF0b3IsIGJ1dCBkaWQgbm90IGRlZmluZSB0aGUgZ2VuZXJhdG9yIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBFaXRoZXIgZGVmaW5lIHRoZSBnZW5lcmF0b3IgYnkgdXNpbmcgYW4gYW5ub3RhdGlvbiBvciBpbmNsdWRpbmcgaXQgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGUuPC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxwPjxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2NwcmJ2aWV3Lmh0bSI+UHJvYmxlbXMgdmlldzwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTkzN2U3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowNiAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPldhcm5pbmcgbWVzc2FnZXM8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJXYXJuaW5nIG1lc3NhZ2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEdFQUlKIiBuYW1lPSJDSUhHRUFJSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+V2FybmluZyBtZXNzYWdlczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gd2FybmluZyBtZXNzYWdlcyAoaW5jbHVkaW5nIGhvdyB0byByZXNvbHZlIHRoZSBpc3N1ZSkgeW91IG1heSBlbmNvdW50ZXIgd2hpbGUgd29ya2luZyB3aXRoIERhbGkuPC9wPgotPGEgaWQ9InN0aHJlZjE2MyIgbmFtZT0ic3RocmVmMTYzIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkNvbm5lY3Rpb24gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT05ORUNUSU9OX05BTUUmZ3Q7PC9zcGFuPiIgaXMgbm90IGFjdGl2ZS4gTm8gdmFsaWRhdGlvbiB3aWxsIGJlIGRvbmUgYWdhaW5zdCB0aGUgZGF0YSBzb3VyY2UuPC9wPgotPHA+VGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24geW91IHNwZWNpZmllZCB0byB1c2Ugd2l0aCB0aGUgSlBBIHByb2plY3QgaXMgbm90IGFjdGl2ZS4gVGhlIEpQQSBwcm9qZWN0IHJlcXVpcmVzIGFuIGFjdGl2ZSBjb25uZWN0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNjQiIG5hbWU9InN0aHJlZjE2NCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5ObyBjb25uZWN0aW9uIHNwZWNpZmllZCBmb3IgdGhlIHByb2plY3QuIE5vIGRhdGEtc3BlY2lmaWMgdmFsaWRhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC48L3A+Ci08cD5Zb3UgY3JlYXRlZCBhIEpQQSBwcm9qZWN0IHdpdGhvdXQgc3BlY2lmeWluZyBhIGRhdGFiYXNlIGNvbm5lY3Rpb24uIFRoZSBKUEEgcHJvamVjdCByZXF1aXJlcyBhbiBhY3RpdmUgY29ubmVjdGlvbi48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj4iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPC9hPiBvciA8YSBocmVmPSJ0YXNrczAyNS5odG0jQkFCREJDQkkiPiJNb2RpZnlpbmcgcGVyc2lzdGVudCBwcm9qZWN0IHByb3BlcnRpZXMiPC9hPiBmb3IgaW5mb3JtYXRpb24gb24gc3BlY2lmeWluZyBhIGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxwPjxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2NwcmJ2aWV3Lmh0bSI+UHJvYmxlbXMgdmlldzwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTllN2ZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowNiAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJEQkNCSSIgbmFtZT0iQkFCREJDQkkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvaDE+Ci08cD5FYWNoIHBlcnNpc3RlbnQgcHJvamVjdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24uIFRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkRhdGFiYXNlIENvbm5lY3Rpb248L3NwYW4+IHVzZSB0aGUgTmV3IENvbm5lY3Rpb24gd2l6YXJkLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBtb2RpZnkgdGhlIHZlbmRlci1zcGVjaWZpYyBwbGF0Zm9ybSBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggeW91ciBKUEEgcHJvamVjdC48L3A+Ci08b2wgc3RhcnQ9IjEiPgotPGxpPgotPHA+UmlnaHQtY2xpY2sgdGhlIHByb2plY3QgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5FeHBsb3Jlcjwvc3Bhbj4gdmlldyBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+UHJvcGVydGllczwvc3Bhbj4uIFRoZSBQcm9wZXJ0aWVzIHBhZ2UgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNjUiIG5hbWU9InN0aHJlZjE2NSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRoZSBQcm9wZXJ0aWVzIFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL3Byb2plY3RfcHJvcGVydGllc190YXNrcy5wbmciIGFsdD0iVGhlIFBlcnNpc3RlbmNlIHBhZ2UuIiB0aXRsZT0iVGhlIFBlcnNpc3RlbmNlIHBhZ2UuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIHJlbWFpbmluZyBmaWVsZHMgb24gdGhlIFByb3BlcnRpZXMgJm5kYXNoOyBKUEEgcGFnZSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk9LPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFByb3BlcnRpZXMgLSBKYXZhIFBlcnNpc3RlbmNlIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUHJvcGVydGllcyAtIEphdmEgUGVyc2lzdGVuY2UgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyOSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI5Ij5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjkiIGhlYWRlcnM9InIxYzEtdDI5Ij5QbGF0Zm9ybTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI5IHIxYzItdDI5Ij5TZWxlY3QgdGhlIHZlbmRvci1zcGVjaWZpYyBwbGF0Zm9ybSBmb3IgdGhlIEpQQSBpbXBsZW1lbnRhdGlvbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjkiIGhlYWRlcnM9InIxYzEtdDI5Ij5EYXRhYmFzZSBDb25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjkgcjFjMi10MjkiPkRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gdXNlIHRvIHN0b3JlIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLiBUbyBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBDb25uZWN0aW9uPC9zcGFuPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjkiIGhlYWRlcnM9InIxYzEtdDI5Ij4mbmJzcDsmbmJzcDtPdmVycmlkZSBkZWZhdWx0IHNjaGVtYSBmcm9tIGNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyOSByMWMyLXQyOSI+U2VsZWN0IGEgc2NoZW1hIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgb25lIGRlcml2ZWQgZnJvbSB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbi4gVXNlIHRoaXMgb3B0aW9uIGlmIHRoZSBkZWZhdWx0IHNjaGVtYSBjYW5ub3QgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHVzZSB0aGlzIG9wdGlvbiBpbiBjYXNlcyB3aGVyZSB0aGUgZGVwbG95bWVudCBsb2dpbiBkaWZmZXJzIGZyb20gdGhlIGRlc2lnbi10aW1lIGxvZ2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5UbyBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBjb25uZWN0aW9uczwvc3Bhbj4uPC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKUEEgT3B0aW9uczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjk1NGZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBKdWx5IDIxLCAyMDA4IDExOjE2OjE5IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+VGlwcyBhbmQgdHJpY2tzPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFRpcHMgYW5kIHRyaWNrcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBzdGFydC0tPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNIREhHSEJGIiBuYW1lPSJDSERIR0hCRiI+PC9hPjwvcD4KLTxoMT5UaXBzIGFuZCB0cmlja3M8L2gxPgotPHA+VGhlIGZvbGxvd2luZyB0aXBzIGFuZCB0cmlja3MgZ2l2ZSBzb21lIGhlbHBmdWwgaWRlYXMgZm9yIGluY3JlYXNpbmcgeW91ciBwcm9kdWN0aXZpdHkuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0iI0JBQkZJSUhBIj48c3BhbiBjbGFzcz0iYm9sZCI+RGF0YWJhc2UgQ29ubmVjdGlvbnM8L3NwYW4+PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSIjQkFCQ0hBSEYiPjxzcGFuIGNsYXNzPSJib2xkIj5TY2hlbWEtYmFzZWQgcGVyc2lzdGVuY2UueG1sPC9zcGFuPjwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHRpcHMgYW5kIHRyaWNrcyBpbiB0aGlzIGNhdGVnb3J5LiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgdGlwcyBhbmQgdHJpY2tzIGluIHRoaXMgY2F0ZWdvcnkuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIiPlRpcDwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MiI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPjxhIGlkPSJCQUJGSUlIQSIgbmFtZT0iQkFCRklJSEEiPjwvYT48c3BhbiBjbGFzcz0iYm9sZCI+RGF0YWJhc2UgQ29ubmVjdGlvbnM8L3NwYW4+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MiByMWMyLXQyIj5XaGVuIHN0YXJ0aW5nIGEgbmV3IHdvcmtiZW5jaCBzZXNzaW9uLCBiZSBzdXJlIHRvIHJlY29ubmVjdCB0byB5b3VyIGRhdGFiYXNlIChpZiB5b3UgYXJlIHdvcmtpbmcgb25saW5lKS4gVGhpcyBhbGxvd3MgRGFsaSB0byBwcm92aWRlIGRhdGFiYXNlLXJlbGF0ZWQgbWFwcGluZyBhc3Npc3RhbmNlIGFuZCB2YWxpZGF0aW9uLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj48YSBpZD0iQkFCQ0hBSEYiIG5hbWU9IkJBQkNIQUhGIj48L2E+PHNwYW4gY2xhc3M9ImJvbGQiPlNjaGVtYS1iYXNlZCBwZXJzaXN0ZW5jZS54bWw8L3NwYW4+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MiByMWMyLXQyIj5JZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsLCB5b3UgbWF5IG5lZWQgdG8gY29uZmlndXJlIHlvdXIgRWNsaXBzZSB3b3Jrc3BhY2UgcHJveHkgaW4gdGhlIDxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtNzIuaHRtIj5QcmVmZXJlbmNlcyBkaWFsb2c8L2E+ICg8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPlByZWZlcmVuY2VzICZndDsgSW50ZXJuZXQgJmd0OyBQcm94eSBTZXR0aW5nczwvc3Bhbj4pIHRvIHByb3Blcmx5IHZhbGlkYXRlIGEgc2NoZW1hLWJhc2VkIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RvYy54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThjZWY5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+Ci08IS0tIFVzZXIgR3VpZGUgLS0+Ci0gIDx0b2MgbGFiZWw9IkRhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBVc2VyIEd1aWRlIj4KLSAgICA8dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkLmh0bSIgbGFiZWw9IkdldHRpbmcgc3RhcnRlZCI+Ci0gICAgICA8dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAxLmh0bSNCQUJFRkhDRCIgbGFiZWw9IlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uIiAvPgotICAgICAgPHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMi5odG0jQkFCSUdDSkEiIGxhYmVsPSJEYWxpIHF1aWNrIHN0YXJ0Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMy5odG0jQkFCREZIREEiIGxhYmVsPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwNC5odG0jQkFCRkdEREciIGxhYmVsPSJDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyIgLz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJjb25jZXB0cy5odG0iIGxhYmVsPSIgQ29uY2VwdHMiPgotICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIiBsYWJlbD0iVW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlIiAvPgotICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiAvPgotICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyIgbGFiZWw9IlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSSI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiIGxhYmVsPSJUaGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJjb25jZXB0czAwMy5odG0jQ0hEQklKQUMiIGxhYmVsPSJUaGUgb3JtLnhtbCBmaWxlIiAvPgotICAgICAgPC90b3BpYz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJ0YXNrcy5odG0iIGxhYmVsPSIgVGFza3MiPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiIgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDAxLmh0bSNCQUJGQkpCRyIgbGFiZWw9IkNyZWF0aW5nIGEgSlBBIEVudGl0eSIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDIuaHRtI0NJSEVKQUlFIiBsYWJlbD0iVXNpbmcgdGhlIFhNTCBFZGl0b3IgdG8gZWRpdCB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwMy5odG0jQ0lIRkVCQUkiIGxhYmVsPSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA0Lmh0bSNzdGhyZWY0NiIgbGFiZWw9IkNyZWF0aW5nIGFuIG9ybS54bWwgZmlsZSIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNDSUhCQ0RDRSIgbGFiZWw9Ildvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGUiIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSIgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSIgbGFiZWw9IkVudGl0eSIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJGRUlDRSIgbGFiZWw9IkVtYmVkZGFibGUiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jQkFCREFHQ0kiIGxhYmVsPSJNYXBwZWQgc3VwZXJjbGFzcyIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSIgbGFiZWw9IlNwZWNpZnlpbmcgYWRkaXRpb25hbCB0YWJsZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiIGxhYmVsPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwOS5odG0jQkFCSUdCR0ciIGxhYmVsPSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiIGxhYmVsPSJCYXNpYyBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIiBsYWJlbD0iRW1iZWRkZWQgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDEyLmh0bSNDSUhESUFFRSIgbGFiZWw9IkVtYmVkZGVkIElEIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciIGxhYmVsPSJJRCBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIiBsYWJlbD0iTWFueS10by1tYW55IG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiIGxhYmVsPSJNYW55LXRvLW9uZSBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIiBsYWJlbD0iT25lLXRvLW1hbnkgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiIgbGFiZWw9Ik9uZS10by1vbmUgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNCQUJIRkhFSSIgbGFiZWw9IlRyYW5zaWVudCBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI0JBQkhJQklJIiBsYWJlbD0iVmVyc2lvbiBtYXBwaW5nIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyMC5odG0jQkFCQkFHRkkiIGxhYmVsPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDIxLmh0bSNDSUhKSUdCRSIgbGFiZWw9IkdlbmVyYXRpbmcgRERMIGZyb20gRW50aXRpZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza3MwMjIuaHRtI0JBQkZBSUJBIiBsYWJlbD0iVmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDIzLmh0bSNDSUhGRURFSSIgbGFiZWw9IkVycm9yIG1lc3NhZ2VzIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMjQuaHRtI0NJSEdFQUlKIiBsYWJlbD0iV2FybmluZyBtZXNzYWdlcyIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza3MwMjUuaHRtI0JBQkRCQ0JJIiBsYWJlbD0iTW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzIiAvPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGxhYmVsPSIgUmVmZXJlbmNlIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iV2l6YXJkcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciIGxhYmVsPSJDcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZCI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIiBsYWJlbD0iTmV3IEpQQSBQcm9qZWN0IHBhZ2UiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIiBsYWJlbD0iSlBBIEZhY2V0IHBhZ2UiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDIuaHRtI0NJQUdHR0RGIiBsYWJlbD0iQ3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDAzLmh0bSNDSUFGRUlHRiIgbGFiZWw9IkVudGl0eSBDbGFzcyBwYWdlIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDQuaHRtI0NJQURFQ0lBIiBsYWJlbD0iRW50aXR5IFByb3BlcnRpZXMgcGFnZSIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNS5odG0jQ0lBSUpDQ0UiIGxhYmVsPSJNYXBwaW5nIEZpbGUgV2l6YXJkIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDA2Lmh0bSNzdGhyZWYxNzEiIGxhYmVsPSJNYXBwaW5nIEZpbGUiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDcuaHRtI3N0aHJlZjE3NCIgbGFiZWw9IkdlbmVyYXRlIERETCBmcm9tIEVudGl0aWVzIFdpemFyZCIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgbGFiZWw9IlByb3BlcnR5IHBhZ2VzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIiBsYWJlbD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jQ0FDQ0FHR0MiIGxhYmVsPSJHZW5lcmFsIGluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTAuaHRtI0NBQ0lKQkdIIiBsYWJlbD0iQXR0cmlidXRlIG92ZXJyaWRlcyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCSElEQSIgbGFiZWw9IlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNDQUNGSEdIRSIgbGFiZWw9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTMuaHRtI3N0aHJlZjE4NyIgbGFiZWw9IlF1ZXJpZXMiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIiBsYWJlbD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkhGSUoiIGxhYmVsPSJHZW5lcmFsIGluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTQuaHRtI0NBQ0JBRUJDIiBsYWJlbD0iSm9pbiBUYWJsZSBJbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE1Lmh0bSNDQUNGQ0VKQyIgbGFiZWw9IkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNGQ0NBQiIgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIiBsYWJlbD0iSlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE2Lmh0bSNDQUNDQUNHSCIgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxNy5odG0jQ0FDRUFHQkciIGxhYmVsPSJQZXJzaXN0ZW5jZSBVbml0IGluZm9ybWF0aW9uIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIiBsYWJlbD0iSlBBIFN0cnVjdHVyZSB2aWV3IiAvPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE4Lmh0bSNDSUFDQ0hJRCIgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBFZGl0b3IiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTkuaHRtI0NJQUNJRkdKIiBsYWJlbD0iR2VuZXJhbCIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDIwLmh0bSNDSUFGRkpJRSIgbGFiZWw9IkNvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAyMS5odG0jQ0lBSkFGRUciIGxhYmVsPSJDdXN0b21pemF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjIuaHRtI0NJQUJFRENIIiBsYWJlbD0iQ2FjaGluZyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDIzLmh0bSNDSUFCR0hISSIgbGFiZWw9IkxvZ2dpbmciIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNC5odG0jQ0lBRkpDSEUiIGxhYmVsPSJPcHRpb25zIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjUuaHRtI0NJQUNDRkNCIiBsYWJlbD0iU2NoZW1hIEdlbmVyYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNi5odG0jQ0lBSEpERkYiIGxhYmVsPSJQcm9wZXJ0aWVzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI0NJQUhDSkFIIiBsYWJlbD0iU291cmNlIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUHJlZmVyZW5jZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jQkFCSkhCQ0kiIGxhYmVsPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEpQQSBPcHRpb25zIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iRGlhbG9ncyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bSNDQUNEQUZKRCIgbGFiZWw9IkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIGRpYWxvZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMC5odG0jQ0FDQ0dFSEMiIGxhYmVsPSJFZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2ciIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiIGxhYmVsPSJKUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmUiIC8+Ci0gICAgICA8dG9waWMgbGFiZWw9Ikljb25zIGFuZCBidXR0b25zIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMi5odG0jQ0FDR0VBQ0ciIGxhYmVsPSJJY29ucyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMy5odG0jQ0FDREpDRUkiIGxhYmVsPSJCdXR0b25zIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzQuaHRtI0NBQ0JCRElCIiBsYWJlbD0iRGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiIgLz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJ0aXBzX2FuZF90cmlja3MuaHRtIiBsYWJlbD0iVGlwcyBhbmQgdHJpY2tzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ3aGF0c19uZXcwMDEuaHRtI0JHR0NKSEFHIiBsYWJlbD0iQ3JlYXRlIEpQQSBFbnRpdHkgV2l6YXJkIiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwMi5odG0jQkdHSUhKQ0oiIGxhYmVsPSJOYW1lZCBRdWVyeSBTdXBwb3J0IiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwMy5odG0jQkdHR0FDQ0QiIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgRWRpdG9yIiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwNC5odG0jQkdHSUlDRUYiIGxhYmVsPSJPdmVycmlkZSB0aGUgRGVmYXVsdCBTY2hlbWEgZm9yIENvbm5lY3Rpb24iIC8+Ci0gICAgICA8dG9waWMgaHJlZj0id2hhdHNfbmV3MDA1Lmh0bSNzdGhyZWYyNTIiIGxhYmVsPSJOZXcgTWFwcGluZyBGaWxlIFdpemFyZCIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ3aGF0c19uZXcwMDYuaHRtI3N0aHJlZjI1MyIgbGFiZWw9IkNvbnZlcnQgdG8gSmF2YSBQcm9qZWN0IiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwNy5odG0jc3RocmVmMjU0IiBsYWJlbD0iQ29sdW1uIERlZmluaXRpb24gU3VwcG9ydCIgLz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJsZWdhbC5odG0iIGxhYmVsPSIgTGVnYWwiPgotICAgICAgPHRvcGljIGhyZWY9ImFib3V0Lmh0bSNzdGhyZWYyNTYiIGxhYmVsPSJBYm91dCB0aGlzIGNvbnRlbnQiIC8+Ci0gICAgPC90b3BpYz4KLSAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiNjcxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA5IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+V2hhdCdzIG5ldzwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBXaGF0J3MgbmV3IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjI0OCIgbmFtZT0ic3RocmVmMjQ4Ij48L2E+IFdoYXQncyBuZXc8L3A+Ci08cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgZGVzY3JpcHRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbmV3IGZlYXR1cmVzIGFuZCBzaWduaWZpY2FudCBjaGFuZ2VzIG1hZGUgdG8gdGhlIERhbGkgT1IgTWFwcGluZyBUb29sIGZvciBSZWxlYXNlIDIuMDo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJ3aGF0c19uZXcwMDEuaHRtI0JHR0NKSEFHIj5DcmVhdGUgSlBBIEVudGl0eSBXaXphcmQ8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwMi5odG0jQkdHSUhKQ0oiPk5hbWVkIFF1ZXJ5IFN1cHBvcnQ8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwMy5odG0jQkdHR0FDQ0QiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwNC5odG0jQkdHSUlDRUYiPk92ZXJyaWRlIHRoZSBEZWZhdWx0IFNjaGVtYSBmb3IgQ29ubmVjdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDA1Lmh0bSNCR0dHREdJRSI+TmV3IE1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwNi5odG0jQkdHQ0dESkciPlRoZSBDb252ZXJ0IHRvIEphdmEgUHJvamVjdCBPcHRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwNy5odG0jQkdHRkdCSEoiPkRlZmluaW5nIENvbHVtbnMgaW4gSlBBIERldGFpbHMgVmlldyBmb3IgRW50aXR5IEF0dHJpYnV0ZXM8L2E+PC9wPgotPC9saT4KLTxsaSBzdHlsZT0ibGlzdC1zdHlsZTogbm9uZSI+PGEgaHJlZj0id2hhdHNfbmV3MDA4Lmh0bSNDRUdJRENDRSI+R2VuZXJhdGUgRERMIGZyb20gRW50aXRpZXMgd2l6YXJkPC9hPjwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1ZmRjMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA5IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+Q3JlYXRlIEpQQSBFbnRpdHkgV2l6YXJkPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRlIEpQQSBFbnRpdHkgV2l6YXJkIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJHR0NKSEFHIiBuYW1lPSJCR0dDSkhBRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRlIEpQQSBFbnRpdHkgV2l6YXJkPC9oMT4KLTxwPlVzZSB0aGUgQ3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkIHRvIHF1aWNrbHkgY3JlYXRlIGFuIGVudGl0eS4gVGhpcyB3aXphcmQgYXV0b21hdGljYWxseSBjcmVhdGVzIGEgSmF2YSBjbGFzcyBhbm5vdGF0ZWQgd2l0aCA8Y29kZT5ARW50aXR5PC9jb2RlPiBhbmQgZW5hYmxlcyB1c2VycyB0byBhZGQgcGVyc2lzdGVuY2UgZmllbGRzIHRvIHRoZSBlbnRpdHkuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMjQ5IiBuYW1lPSJzdGhyZWYyNDkiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgQ3JlYXRlIE5ldyBKUEEgRW50aXR5IFdpemFyZDwvcD4KLTxpbWcgc3JjPSJpbWcvY3JlYXRlX2pwYV9lbnRpdHlfbmV3LnBuZyIgYWx0PSJUaGUgRW50aXR5IENsYXNzIHBhZ2Ugb2YgdGhlIENyZWF0ZSBOZXcgSlBBIEVudGl0eSB3aXphcmQuIiB0aXRsZT0iVGhlIEVudGl0eSBDbGFzcyBwYWdlIG9mIHRoZSBDcmVhdGUgTmV3IEpQQSBFbnRpdHkgd2l6YXJkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT48YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwNS5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZjFjYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowOSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPk5hbWVkIFF1ZXJ5IFN1cHBvcnQ8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJOYW1lZCBRdWVyeSBTdXBwb3J0IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJHR0lISkNKIiBuYW1lPSJCR0dJSEpDSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TmFtZWQgUXVlcnkgU3VwcG9ydDwvaDE+Ci08cD5UaGUgSlBBIERldGFpbHMgdmlldyBmb3IgYW4gZW50aXR5IGluY2x1ZGVzIGZ1bmN0aW9ucyBmb3IgYWRkaW5nIG5hbWVkIGFuZCBuYW1lZCBuYXRpdmUgcXVlcmllcyB0byBhbiBlbnRpdHkuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMjUwIiBuYW1lPSJzdGhyZWYyNTAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5FbnRlcmluZyBhIE5hbWVkIFF1ZXJ5PC9wPgotPGltZyBzcmM9ImltZy9lbnRlcmluZ19xdWVyeV9uZXcucG5nIiBhbHQ9IlRoZSBRdWVyaWVzIHNlY3Rpb24gb2YgdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiB0aXRsZT0iVGhlIFF1ZXJpZXMgc2VjdGlvbiBvZiB0aGUgSlBBIERldGFpbHMgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza3MwMDkuaHRtI0JBQklHQkdHIj5DcmVhdGluZyBOYW1lZCBRdWVyaWVzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMTVlZjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowOSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L3RpdGxlPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDUtMDctMTBUMTI6NTc6MjArMDg6MDAiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJwZXJzaXN0ZW5jZS54bWwgRWRpdG9yIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJHR0dBQ0NEIiBuYW1lPSJCR0dHQUNDRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvaDE+Ci08cD5SYXRoZXIgdGhhbiBlZGl0IHRoZSBYTUwgZm9yIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4sIHRoaXMgcmVsZWFzZSBvZiBEYWxpIHByb3ZpZGVzIGFuIGVkaXRvciB0aGF0IGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSBmaWxlJ3MgPGNvZGU+Jmx0O3BlcnNpc3RlbmNlLXVuaXQmZ3Q7PC9jb2RlPiBlbGVtZW50LCBpdHMgPGNvZGU+dHJhbnNhY3Rpb24gdHlwZTwvY29kZT4gYXR0cmlidXRlIGFzIHdlbGwgYXMgaXRzIDxjb2RlPiZsdDtwcm92aWRlciZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7Y2xhc3MmZ3Q7PC9jb2RlPiwgZGF0YSBzb3VyY2UgYW5kIDxjb2RlPiZsdDtwcm9wZXJ0aWVzJmd0OzwvY29kZT4gc3ViLWVsZW1lbnRzLiBUaGUgZWR0aW9yIGFsc28gZW5hYmxlcyB5b3UgdG8gZWRpdCB0aGUgZmlsZSBkaXJlY3RseS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyNTEiIG5hbWU9InN0aHJlZjI1MSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRoZSBwZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9wPgotPGltZyBzcmM9ImltZy9wZXJzaXN0ZW5jZV9lZGl0b3JfbmV3LnBuZyIgYWx0PSJUaGUgR2VuZXJhbCBwYWdlIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgRWRpdG9yLiIgdGl0bGU9IlRoZSBHZW5lcmFsIHBhZ2Ugb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3IuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZlcmVuY2UwMTguaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iODYlIj48YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA4LCZuYnNwO09yYWNsZS4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMWEzZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwOCAxNDo0MjowOSAtLT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotPHRpdGxlPk92ZXJyaWRlIHRoZSBEZWZhdWx0IFNjaGVtYSBmb3IgQ29ubmVjdGlvbjwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik92ZXJyaWRlIHRoZSBEZWZhdWx0IFNjaGVtYSBmb3IgQ29ubmVjdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPGxpbmsgcmVsPSJzdGFydCIgaHJlZj0iLi4vLi4vaW5kZXguaHRtIiB0aXRsZT0iSG9tZSIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJjb250ZW50cyIgaHJlZj0idG9jLmh0bSIgdGl0bGU9IkNvbnRlbnRzIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCR0dJSUNFRiIgbmFtZT0iQkdHSUlDRUYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk92ZXJyaWRlIHRoZSBEZWZhdWx0IFNjaGVtYSBmb3IgQ29ubmVjdGlvbjwvaDE+Ci08cD5JbiBzb21lIGNhc2VzLCBEYWxpIGNhbm5vdCBjYWxjdWxhdGUgdGhlIGNvcnJlY3Qgc2NoZW1hIGZvciBhIHByb2plY3QuIElmIHN1Y2ggYW4gaW5zdGFuY2UgYXJpc2VzLCB5b3UgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNjaGVtYSBkZXJpdmVkIGZyb20gdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSB0aGUgRGVmYXVsdCBTY2hlbWEgZm9yIENvbm5lY3Rpb248L3NwYW4+IG9wdGlvbiBpbiB0aGUgSlBBIEZhY2V0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBOZXcgSlBBIEVudGl0eSB3aXphcmQgKGlsbHVzdHJhdGVkIGluIDxhIGhyZWY9IiNCR0dKRkZDRCI+RmlndXJlOiBDaGFuZ2luZyB0aGUgU2NoZW1hIGZvciBhIFByb2plY3Q8L2E+KSBvciB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgSlBBIHByb2plY3QgKGFjY2Vzc2VkIGJ5IHNlbGVjdGluZyB0aGUgSlBBIHByb2plY3QgYW5kIHRoZW4gPHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnRpZXMgJmd0OyBKUEE8L3NwYW4+KS4gVXNlIHRoaXMgb3B0aW9uIHdoZW4gdGhlIGRlZmF1bHQgbG9naW4gaW5mb3JtYXRpb24gY2Fubm90IGJlIHVzZWQsIHN1Y2ggYXMgd2hlbiB0aGUgZGVwbG95bWVudCBsb2dpbiBkaWZmZXJzIGZyb20gdGhlIGRlc2lnbi10aW1lIGxvZ2luLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9IkJHR0pGRkNEIiBuYW1lPSJCR0dKRkZDRCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkNoYW5naW5nIHRoZSBTY2hlbWEgZm9yIGEgUHJvamVjdDwvcD4KLTxpbWcgc3JjPSJpbWcvY2hhbmdlX2Nvbm5lY3Rpb25fcHJvZmlsZS5wbmciIGFsdD0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZCB3aXRoIHRoZSBPdmVycmlkZSBkZWZ1YWx0IHNjaGVtYSBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgSlBBIEZhY2V0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkIHdpdGggdGhlIE92ZXJyaWRlIGRlZnVhbHQgc2NoZW1hIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzODhlMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA5IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+Q2hhbmdpbmcgdGhlIFNjaGVtYSBmb3IgYSBQcm9qZWN0PC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ2hhbmdpbmcgdGhlIFNjaGVtYSBmb3IgYSBQcm9qZWN0IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjUyIiBuYW1lPSJzdGhyZWYyNTIiPjwvYT4KLTxoMT5OZXcgTWFwcGluZyBGaWxlIFdpemFyZDwvaDE+Ci08cD5UaGUgTWFwcGluZyBGaWxlIHdpemFyZCBlbmFibGVzIHlvdSB0byBhZGQgYW4gb2JqZWN0IG1hcCAob3JtLnhtbCkgdG8gYSBKUEEgcHJvamVjdCBpZiBubyBvYmplY3QgbWFwIGV4aXN0cyBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkLiBDb21wbGV0aW5nIHRoZSB3aXphcmQgcmVzdWx0cyBpbiBhIHN0dWIgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJCR0dHREdJRSIgbmFtZT0iQkdHR0RHSUUiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5OZXcgTWFwcGluZyBGaWxlIFdpemFyZDwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ19maWxlX25ldy5wbmciIGFsdD0iVGhlIE1hcHBpbmcgRmlsZSBwYWdlIG9mIHRoZSBOZXcgTWFwcGluZyBGaWxlIHdpemFyZC4iIHRpdGxlPSJUaGUgTWFwcGluZyBGaWxlIHBhZ2Ugb2YgdGhlIE5ldyBNYXBwaW5nIEZpbGUgd2l6YXJkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDA1Lmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMy5odG0jQ0hEQklKQUMiPlRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWE4YjRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDggMTQ6NDI6MDkgLS0+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLTx0aXRsZT5OZXcgTWFwcGluZyBGaWxlIFdpemFyZDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik5ldyBNYXBwaW5nIEZpbGUgV2l6YXJkIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjUzIiBuYW1lPSJzdGhyZWYyNTMiPjwvYT4KLTxoMT5Db252ZXJ0IHRvIEphdmEgUHJvamVjdDwvaDE+Ci08cD5UaGUgQ29udmVydCB0byBKUEEgUHJvamVjdCBvcHRpb24gKGFjY2Vzc2VkIGJ5IHNlbGVjdGluZyBhIEphdmEgcHJvamVjdCBhbmQgdGhlbiBjbGlja2luZyA8c3BhbiBjbGFzcz0iYm9sZCI+TmV3ICZndDsgSlBBIFRvb2xzICZndDsgQ29udmVydCB0byBKUEEgUHJvamVjdDwvc3Bhbj4pIGVuYWJsZXMgeW91IHRvIGNvbnZlcnQgYSBub24tZmFjZXRlZCBKYXZhIHByb2plY3QgaW50byBhIGZhY2V0ZWQgSmF2YSBwcm9qZWN0LiBTZWxlY3RpbmcgdGhpcyBvcHRpb24gaW52b2tlcyB0aGUgTW9kaWZ5IEZhY2V0ZWQgUHJvamVjdCB3aXphcmQsIHdoaWNoIHByb21wdHMgeW91IHRvIGFkZCB0aGUgSlBBIGZhY2V0LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9IkJHR0NHREpHIiBuYW1lPSJCR0dDR0RKRyI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPlRoZSBDb252ZXJ0IHRvIEphdmEgUHJvamVjdCBPcHRpb248L3A+Ci08aW1nIHNyYz0iaW1nL2NvbnZlcnRfamF2YV9wcm9qZWN0X25ldy5wbmciIGFsdD0iQSBKYXZhIHByb2plY3QgaW4gdGhlIE5hdmlnYXRvciB3aXRoIHRoZSBKUEEgVG9vbHMgJmd0OyBDb252ZXJ0IHRvIEphdmEgb3B0aW9uIHNlbGVjdGVkLiIgdGl0bGU9IkEgSmF2YSBwcm9qZWN0IGluIHRoZSBOYXZpZ2F0b3Igd2l0aCB0aGUgSlBBIFRvb2xzICZndDsgQ29udmVydCB0byBKYXZhIG9wdGlvbiBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk3MjNmMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA5IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+Q29sdW1uIERlZmluaXRpb24gU3VwcG9ydDwvdGl0bGU+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4wIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwNS0wNy0xMFQxMjo1NzoyMCswODowMCIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNvbHVtbiBEZWZpbml0aW9uIFN1cHBvcnQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTxsaW5rIHJlbD0ic3RhcnQiIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bSIgdGl0bGU9IkhvbWUiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0iY29udGVudHMiIGhyZWY9InRvYy5odG0iIHRpdGxlPSJDb250ZW50cyIgdHlwZT0idGV4dC9odG1sIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPjxhIGlkPSJzdGhyZWYyNTQiIG5hbWU9InN0aHJlZjI1NCI+PC9hPgotPGgxPkNvbHVtbiBEZWZpbml0aW9uIFN1cHBvcnQ8L2gxPgotPHA+VGhlIEpQQSBEZXRhaWxzIHZpZXcgZm9yIGF0dHJpYnV0ZXMgZW5hYmxlcyB5b3UgdG8gbW9kaWZ5IHRoZSBudWxsYWJsZSBhbmQgdW5pcXVlIGNvbHVtbiBjb25zdHJhaW50cyBhbmQgc3VjaCBjb2x1bW4gcHJvcGVydGllcyBhcyBsZW5ndGgsIHNjYWxlLCBhbmQgcHJlY2lzaW9uLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9IkJHR0ZHQkhKIiBuYW1lPSJCR0dGR0JISiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkRlZmluaW5nIENvbHVtbnMgaW4gSlBBIERldGFpbHMgVmlldyBmb3IgRW50aXR5IEF0dHJpYnV0ZXM8L3A+Ci08aW1nIHNyYz0iaW1nL2NvbHVtbl9zdXBwb3J0X25ldy5wbmciIGFsdD0iVGhlIEpQQSBEZXRhaWxzIFZpZXcgZm9yIGFuIGVudGl0eSB3aXRoIGl0cyBEZXRhaWxzIHNlY3Rpb24gZXhwYW5kZWQgdG8gc2hvdyB0aGUgY29sdW1uIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4iIHRpdGxlPSJUaGUgSlBBIERldGFpbHMgVmlldyBmb3IgYW4gZW50aXR5IHdpdGggaXRzIERldGFpbHMgc2VjdGlvbiBleHBhbmRlZCB0byBzaG93IHRoZSBjb2x1bW4gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiIHdpZHRoPSI4NiUiPjxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMDgsJm5ic3A7T3JhY2xlLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0YjVjOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA4IDE0OjQyOjA5IC0tPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci08dGl0bGU+R2VuZXJhdGUgRERMIGZyb20gRW50aXRpZXMgd2l6YXJkPC90aXRsZT4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjAiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDA1LTA3LTEwVDEyOjU3OjIwKzA4OjAwIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdGUgRERMIGZyb20gRW50aXRpZXMgd2l6YXJkIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08bGluayByZWw9InN0YXJ0IiBocmVmPSIuLi8uLi9pbmRleC5odG0iIHRpdGxlPSJIb21lIiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9ImNvbnRlbnRzIiBocmVmPSJ0b2MuaHRtIiB0aXRsZT0iQ29udGVudHMiIHR5cGU9InRleHQvaHRtbCIgLz4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNFR0lEQ0NFIiBuYW1lPSJDRUdJRENDRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgRERMIGZyb20gRW50aXRpZXMgd2l6YXJkPC9oMT4KLTxwPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkdlbmVyYXRlIERETDwvc3Bhbj4gd2l6YXJkIHRvIHF1aWNrbHkgY3JlYXRlIERETCBzY3JpcHRzIGZyb20geW91ciBwZXJzaXN0ZW50IGVudGl0aWVzLiBEYWxpIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5IHByaW1hcnkgYW5kIGZvcmVpZ24ga2V5cywgYmFzZWQgb24gdGhlIGVudGl0eSBtYXBwaW5ncy48L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQ0lISklHQkUiPkdlbmVyYXRpbmcgRERMIGZyb20gRW50aXRpZXM8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+PGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOCwmbmJzcDtPcmFjbGUuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjAwY2U4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9wZXJzaXN0ZW5jZS5qYXIiIHNvdXJjZXBhdGg9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbnNyYy56aXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2MzExZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDFiYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1dlZCBBcHIgMzAgMTc6MjQ6NDEgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTA4YzVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW47c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IGxpYi9wZXJzaXN0ZW5jZS5qYXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IGphdmF4LnBlcnNpc3RlbmNlLAotIGphdmF4LnBlcnNpc3RlbmNlLnNwaSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZjU4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgyPkFib3V0IFRoaXMgQ29udGVudDwvSDI+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgCi0gIG91dCBiZWxvdy4gSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCAKLSAgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIAotICB0byB0aGUgUmVkaXN0cmlidXRvciYjODIxNztzIGxpY2Vuc2UgZm9yIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND48YSBuYW1lPSJKUEEiIGlkPSJKUEEiPjwvYT5KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB2MS4wPC9oND4KLQotPGJsb2NrcXVvdGU+Ci0gIDxwPlRoZSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB3aGljaCBpcyBkaXN0cmlidXRlZCB1bmRlciA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwiPkNEREwgCi0gICAgdjEuMDwvYT4gaXMgcmVxdWlyZWQgYnkgdGhlIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBQcm9qZWN0IGluIG9yZGVyIAotICAgIHRvIHN1cHBvcnQgdGhpcyBzdGFuZGFyZC48L3A+Ci08L2Jsb2NrcXVvdGU+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjdiY2UzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2U9MS41Ci1qYXZhY1RhcmdldD0xLjUKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBsaWIvcGVyc2lzdGVuY2UuamFyLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9saWIvcGVyc2lzdGVuY2UuamFyIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2xpYi9wZXJzaXN0ZW5jZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWIyMzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2xpYi9wZXJzaXN0ZW5jZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMzExMjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IC0gRERMIEdlbmVyYXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2RkbGdlbi9NYWluLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2RkbGdlbi9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZWEwYWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9kZGxnZW4vTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotCi0vKiogCi0gKiBUaGlzIGNsYXNzIGNyZWF0ZXMgYSBFY2xpcHNlTGluayA8Y29kZT5FbnRpdHlNYW5hZ2VyRmFjdG9yeTwvY29kZT4sIAotICogYW5kIGV4ZWN1dGVzIHRoZSBEREwgZ2VuZXJhdG9yIHdpdGggdGhlIGNvbW1hbmQgc2V0IGluIHRoZSBwcm9wZXJ0aWVzOiAKLSAqICAgICA8Y29kZT5lY2xpcHNlbGluay5kZGwtZ2VuZXJhdGlvbi5vdXRwdXQtbW9kZTwvY29kZT4gCi0gKiAgICAgPGNvZGU+ZWNsaXBzZWxpbmsuYXBwbGljYXRpb24tbG9jYXRpb248L2NvZGU+Ci0gKiAKLSAqIEN1cnJlbnQgY29tbWFuZC1saW5lIGFyZ3VtZW50czoKLSAqICAgICBbLXB1IHB1TmFtZV0gLSBwZXJzaXN0ZW5jZSB1bml0IG5hbWUKLSAqICAgICBbLXAgcHJvcGVydGllc0ZpbGVQYXRoXSAtIHByb3BlcnRpZXMgZm9yIEVjbGlwc2VMaW5rIEVudGl0eU1hbmFnZXIKLSAqICAKLSAqICBFeGFtcGxlIG9mIGEgcHJvcGVydGllcyBmaWxlOgotICogIAllY2xpcHNlbGluay5qZGJjLmJpbmQtcGFyYW1ldGVycz1mYWxzZQotICogIAllY2xpcHNlbGluay5qZGJjLmRyaXZlcj1vcmcuYXBhY2hlLmRlcmJ5LmpkYmMuRW1iZWRkZWREcml2ZXIKLSAqICAJZWNsaXBzZWxpbmsuamRiYy51cmw9amRiY1w6ZGVyYnlcOmNcOi9kZXJieWRiL3Rlc3RkYjtjcmVhdGVcPXRydWUKLSAqICAJZWNsaXBzZWxpbmsuamRiYy51c2VyPXRyYW4KLSAqICAJZWNsaXBzZWxpbmsuamRiYy5wYXNzd29yZD0KLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy5sZXZlbD1GSU5FU1QKLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy50aW1lc3RhbXA9ZmFsc2UKLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy50aHJlYWQ9ZmFsc2UKLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy5zZXNzaW9uPWZhbHNlCi0gKiAgCWVjbGlwc2VsaW5rLmxvZ2dpbmcuZXhjZXB0aW9ucz10cnVlCi0gKiAgCWVjbGlwc2VsaW5rLm9ybS50aHJvdy5leGNlcHRpb25zPXRydWUKLSAqICAJZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb24ub3V0cHV0LW1vZGU9ZGF0YWJhc2UKLSAqICAJZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb249ZHJvcC1hbmQtY3JlYXRlLXRhYmxlcwotICogIAllY2xpcHNlbGluay5hcHBsaWNhdGlvbi1sb2NhdGlvbj1jXDovX1Byb2plY3RzXy9FeGFtcGxlRERMCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluCi17Ci0JcHJvdGVjdGVkIEVudGl0eU1hbmFnZXJGYWN0b3J5IGVtZjsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZWNsaXBzZUxpbmtQcm9wZXJ0aWVzOwotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZURETEZpbGVOYW1lOwotCXByaXZhdGUgU3RyaW5nIGRyb3BERExGaWxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBhcHBMb2NhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoOwotCXByaXZhdGUgYm9vbGVhbiBpc0RlYnVnTW9kZTsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgTWFpbigpLmV4ZWN1dGUoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBNYWluKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoU3RyaW5nW10gYXJncykgewotCQl0aGlzLmluaXRpYWxpemVXaXRoKGFyZ3MpOwotCQkKLQkJdGhpcy5lbWYgPSBQZXJzaXN0ZW5jZS5jcmVhdGVFbnRpdHlNYW5hZ2VyRmFjdG9yeSh0aGlzLmdldFBVTmFtZShhcmdzKSwgdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMpOwotCQl0aGlzLnBlcmZvcm0oKTsKLQkJdGhpcy5jbG9zZUVudGl0eU1hbmFnZXJGYWN0b3J5KCk7Ci0JCQotCQl0aGlzLmRpc3Bvc2UoKTsKLQkJcmV0dXJuOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtKCkgewotCQkvLyBjcmVhdGUgYW4gRU0gdG8gZ2VuZXJhdGUgc2NoZW1hLgotCQl0aGlzLmVtZi5jcmVhdGVFbnRpdHlNYW5hZ2VyKCkuY2xvc2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2VFbnRpdHlNYW5hZ2VyRmFjdG9yeSgpIHsKLQkJdGhpcy5lbWYuY2xvc2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVXaXRoKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQl0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGggPSB0aGlzLmdldEVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgoYXJncyk7Ci0JCXRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKHRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCk7Ci0JCQotCQl0aGlzLmNyZWF0ZURETEZpbGVOYW1lID0gdGhpcy5nZXRDb25maWdQcm9wZXJ0eUFzU3RyaW5nKCAKLQkJCQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSwgCi0JCQkJCQl0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcywgIAotCQkJCQkJU2NoZW1hR2VuZXJhdGlvbi5ERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0NSRUFURV9GSUxFX05BTUUpOwotCi0JCXRoaXMuZHJvcERETEZpbGVOYW1lID0gdGhpcy5nZXRDb25maWdQcm9wZXJ0eUFzU3RyaW5nKAotCQkJCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19EUk9QX0ZJTEVfTkFNRSwgCi0JCQkJCQl0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcywgIAotCQkJCQkJU2NoZW1hR2VuZXJhdGlvbi5ERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RST1BfRklMRV9OQU1FKTsgCi0JCQotCQl0aGlzLmFwcExvY2F0aW9uID0gdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMuZ2V0KAotCQkJCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19BUFBMSUNBVElPTl9MT0NBVElPTik7Ci0KLQkJdGhpcy5pc0RlYnVnTW9kZSA9IHRoaXMuZ2V0RGVidWdNb2RlKGFyZ3MpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzcG9zZSgpIHsKLQotCQlpZiggISB0aGlzLmlzRGVidWdNb2RlKSB7Ci0JCQluZXcgRmlsZSh0aGlzLmFwcExvY2F0aW9uICsgIi8iICsgdGhpcy5jcmVhdGVERExGaWxlTmFtZSkuZGVsZXRlKCk7Ci0JCQluZXcgRmlsZSh0aGlzLmFwcExvY2F0aW9uICsgIi8iICsgdGhpcy5kcm9wRERMRmlsZU5hbWUpLmRlbGV0ZSgpOwotCQkJbmV3IEZpbGUodGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKS5kZWxldGUoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvcGVydGllcyhTdHJpbmcgZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCkgewotCQkKLQkJU2V0PEVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gcHJvcGVydGllc1NldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwcm9wZXJ0aWVzU2V0ID0gdGhpcy5sb2FkRWNsaXBzZUxpbmtQcm9wZXJ0aWVzKGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWlzc2luZzogIiArIGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgsIGUpOwotCQl9Ci0JCQotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJZm9yKEVudHJ5PE9iamVjdCwgT2JqZWN0PiBwcm9wZXJ0eSA6IHByb3BlcnRpZXNTZXQpIHsKLQkJCXByb3BlcnRpZXMucHV0KChTdHJpbmcpcHJvcGVydHkuZ2V0S2V5KCksIChTdHJpbmcpcHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0gICAgcHJpdmF0ZSBTZXQ8RW50cnk8T2JqZWN0LCBPYmplY3Q+PiBsb2FkRWNsaXBzZUxpbmtQcm9wZXJ0aWVzKFN0cmluZyBlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCk7Ci0gICAgICAgIAotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wZXJ0aWVzLmxvYWQoc3RyZWFtKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhcmd1bWVudCBxdWVyaWVzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIFN0cmluZyBnZXRQVU5hbWUoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFyZ3VtZW50VmFsdWUoIi1wdSIsIGFyZ3MpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRFY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5nZXRBcmd1bWVudFZhbHVlKCItcCIsIGFyZ3MpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXREZWJ1Z01vZGUoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmFyZ3VtZW50RXhpc3RzKCItZGVidWciLCBhcmdzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXJndW1lbnRWYWx1ZShTdHJpbmcgYXJndW1lbnQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1tpXTsKLQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoYXJndW1lbnQpKSB7Ci0JCQkJaW50IGogPSBpICsgMTsKLQkJCQlpZiAoaiA8IGFyZ3MubGVuZ3RoKSB7Ci0JCQkJCXJldHVybiBhcmdzW2pdOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFyZ3VtZW50RXhpc3RzKFN0cmluZyBhcmd1bWVudCwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmd1bWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gKioqKioqIHV0aWxpdHkgbWV0aG9kcyAqKioqKioqCi0JCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIHByb3ZpZGVkIG1hcCBmb3IgYW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIGtleS4gIElmIHRoYXQgb2JqZWN0IGlzIG5vdCBhdmFpbGFibGUsIGNoZWNrIHRoZQotICAgICAqIFN5c3RlbSBwcm9wZXJ0aWVzLiAgSWYgaXQgaXMgbm90IGF2YWlsYWJsZSBmcm9tIGVpdGhlciBsb2NhdGlvbiwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAKLSAgICAgKiBAcGFyYW0gbWFwIAotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgCi0gICAgICogQHJldHVybiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ1Byb3BlcnR5QXNTdHJpbmcoU3RyaW5nIHByb3BlcnR5S2V5LCBNYXA8U3RyaW5nLCBTdHJpbmc+IG92ZXJyaWRlcywgU3RyaW5nIGRlZmF1bHRWYWx1ZSl7Ci0gICAgCVN0cmluZyB2YWx1ZSA9IHRoaXMuZ2V0Q29uZmlnUHJvcGVydHlBc1N0cmluZyhwcm9wZXJ0eUtleSwgb3ZlcnJpZGVzKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpewotICAgICAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ1Byb3BlcnR5QXNTdHJpbmcoU3RyaW5nIHByb3BlcnR5S2V5LCBNYXA8U3RyaW5nLCBTdHJpbmc+IG92ZXJyaWRlcyl7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0gICAgICAgIGlmIChvdmVycmlkZXMgIT0gbnVsbCl7Ci0gICAgICAgICAgICB2YWx1ZSA9IChTdHJpbmcpb3ZlcnJpZGVzLmdldChwcm9wZXJ0eUtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpewotICAgICAgICAgICAgdmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHlLZXkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLmNsYXNzcGF0aAppbmRleCBmYjA1ZTAwLi45MTIzOTUyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8uY2xhc3NwYXRoCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5jbGFzc3BhdGgKQEAgLTEsMTEgKzEsMTMgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CiA8Y2xhc3NwYXRoPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+CiAJCTxhY2Nlc3NydWxlcz4KIAkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb3JlLyoqIi8+CiAJCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS8qKiIvPgorCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+CiAJCTwvYWNjZXNzcnVsZXM+CiAJPC9jbGFzc3BhdGhlbnRyeT4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwppbmRleCA2MTRlZWNjLi4xZGUzM2Y0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCkBAIC0xLDMgKzEsNiBAQAotI01vbiBBcHIgMDcgMTQ6MjY6NDggRURUIDIwMDgKKyNXZWQgU2VwIDA5IDEyOjU4OjA3IEVEVCAyMDA5CiBlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZW5jb2RpbmcvL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMC54c2Q9VVRGOAorZW5jb2RpbmcvL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMS54c2Q9VVRGOAorZW5jb2RpbmcvL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2Q9VVRGOAogZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwppbmRleCAxYjYyMTkyLi5kY2ZhNTAyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0xLDcgKzEsMTIgQEAKICNTdW4gRmViIDI0IDIxOjI1OjM0IEVTVCAyMDA4CiBlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggOWVjMTFiOC4uZmRjZDMwMyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMjggKzMsNjkgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogMS4zLjAucXVhbGlmaWVyCiBCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4KK0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtQ2xhc3NQYXRoOiAuCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmRiO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAorIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIiwKKyBvcmcuZWNsaXBzZS5qcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCisgb3JnLmVjbGlwc2UuanB0LmRiO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCisgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMTAwLDIuMC4wKSIsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzIiwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aSxvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cyIsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbiwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb24sCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3B0aW9ucywKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmRkbGdlbgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZywKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24sCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbCwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24sCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmdlbmVyYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuZGRsZ2VuO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9uczt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dCwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbiwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucwogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvYnVpbGQucHJvcGVydGllcwppbmRleCBlOWJkYjZmLi4wZjQxZWFlIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTEwLDExICsxMCwxNiBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogamF2YWNTb3VyY2U9MS41CiBqYXZhY1RhcmdldD0xLjUKLXNvdXJjZS4uID0gc3JjLworc291cmNlLi4gPSBzcmMvLFwKKyAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwogb3V0cHV0Li4gPSBiaW4vCiBiaW4uaW5jbHVkZXMgPSAuLFwKICAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCiAgICAgICAgICAgICAgICBhYm91dC5odG1sLFwKICAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIHNjaGVtYXMvCiBqYXJzLmNvbXBpbGUub3JkZXIgPSAuCitzcmMuaW5jbHVkZXMgPSBtb2RlbC8KK3NyYy5pbmNsdWRlcyA9IG1vZGVsLyxcCisgICAgICAgICAgICAgICBzY2hlbWFzLwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvbW9kZWwvZWNsaXBzZUxpbmtSZXNvdXJjZU1vZGVscy5nZW5tb2RlbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL21vZGVsL2VjbGlwc2VMaW5rUmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhYTlhZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL21vZGVsL2VjbGlwc2VMaW5rUmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwKQEAgLTAsMCArMSwyNzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgorICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYyIKKyAgICBjcmVhdGlvbkNvbW1hbmRzPSJmYWxzZSIgY3JlYXRpb25JY29ucz0iZmFsc2UiIGVkaXREaXJlY3Rvcnk9IiIgZWRpdG9yRGlyZWN0b3J5PSIiCisgICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUiIG1vZGVsTmFtZT0iRWNsaXBzZUxpbmtDb3JlIiBlZGl0UGx1Z2luQ2xhc3M9IiIKKyAgICBlZGl0b3JQbHVnaW5DbGFzcz0iIiB1cGRhdGVDbGFzc3BhdGg9ImZhbHNlIiByb290RXh0ZW5kc0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3QiCisgICAgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdCIgc3VwcHJlc3NJbnRlcmZhY2VzPSJ0cnVlIgorICAgIHRlc3RzRGlyZWN0b3J5PSIiIHRlc3RTdWl0ZUNsYXNzPSIiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5lY29yZSIKKyAgICBjb21wbGlhbmNlTGV2ZWw9IjUuMCIgY29weXJpZ2h0RmllbGRzPSJmYWxzZSIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9qcGFSZXNvdXJjZU1vZGVscy5nZW5tb2RlbCMvL29ybSAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9qcGFSZXNvdXJjZU1vZGVscy5nZW5tb2RlbCMvL3htbCI+CisgIDxmb3JlaWduTW9kZWw+ZWNsaXBzZWxpbmtfb3JtLmVjb3JlPC9mb3JlaWduTW9kZWw+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkVjbGlwc2VMaW5rT3JtIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UiCisgICAgICBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIiBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGVjb3JlUGFja2FnZT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8iPgorICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZUNvb3JkaW5hdGlvblR5cGUiPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZUNvb3JkaW5hdGlvblR5cGUvU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZUNvb3JkaW5hdGlvblR5cGUvSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVDb29yZGluYXRpb25UeXBlL1NFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTIi8+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0NhY2hlQ29vcmRpbmF0aW9uVHlwZS9OT05FIi8+CisgICAgPC9nZW5FbnVtcz4KKyAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlIj4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL0ZVTEwiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL1dFQUsiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL1NPRlQiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL1NPRlRfV0VBSyIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZVR5cGUvSEFSRF9XRUFLIi8+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0NhY2hlVHlwZS9DQUNIRSIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZVR5cGUvTk9ORSIvPgorICAgIDwvZ2VuRW51bXM+CisgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENoYW5nZVRyYWNraW5nVHlwZSI+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENoYW5nZVRyYWNraW5nVHlwZS9BVFRSSUJVVEUiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2hhbmdlVHJhY2tpbmdUeXBlL09CSkVDVCIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDaGFuZ2VUcmFja2luZ1R5cGUvREVGRVJSRUQiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2hhbmdlVHJhY2tpbmdUeXBlL0FVVE8iLz4KKyAgICA8L2dlbkVudW1zPgorICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxEaXJlY3Rpb24iPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxEaXJlY3Rpb24vSU4iLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRGlyZWN0aW9uL09VVCIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxEaXJlY3Rpb24vSU5fT1VUIi8+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbERpcmVjdGlvbi9PVVRfQ1VSU09SIi8+CisgICAgPC9nZW5FbnVtcz4KKyAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vRXhpc3RlbmNlVHlwZSI+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0V4aXN0ZW5jZVR5cGUvQ0hFQ0tfQ0FDSEUiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vRXhpc3RlbmNlVHlwZS9DSEVDS19EQVRBQkFTRSIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9FeGlzdGVuY2VUeXBlL0FTU1VNRV9FWElTVEVOQ0UiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vRXhpc3RlbmNlVHlwZS9BU1NVTUVfTk9OX0VYSVNURU5DRSIvPgorICAgIDwvZ2VuRW51bXM+CisgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEpvaW5GZXRjaFR5cGUiPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxKb2luRmV0Y2hUeXBlL0lOTkVSIi8+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEpvaW5GZXRjaFR5cGUvT1VURVIiLz4KKyAgICA8L2dlbkVudW1zPgorICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUiPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUvQUxMX0NPTFVNTlMiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlL0NIQU5HRURfQ09MVU1OUyIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUvU0VMRUNURURfQ09MVU1OUyIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUvVkVSU0lPTl9DT0xVTU4iLz4KKyAgICA8L2dlbkVudW1zPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQWNjZXNzTWV0aG9kcyI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQWNjZXNzTWV0aG9kcy9nZXRNZXRob2QiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxBY2Nlc3NNZXRob2RzL3NldE1ldGhvZCIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyL2FjY2Vzc01ldGhvZHMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQXR0cmlidXRlcyI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0F0dHJpYnV0ZXMvYmFzaWNDb2xsZWN0aW9ucyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL2Jhc2ljTWFwcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL3RyYW5zZm9ybWF0aW9ucyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL3ZhcmlhYmxlT25lVG9PbmVzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEJhc2ljIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxCYXNpY0NvbGxlY3Rpb24iLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEJhc2ljTWFwIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlL2V4cGlyeSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlL3NpemUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZS9zaGFyZWQiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZS90eXBlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUvYWx3YXlzUmVmcmVzaCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlL3JlZnJlc2hPbmx5SWZOZXdlciIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlL2Rpc2FibGVIaXRzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUvY29vcmRpbmF0aW9uVHlwZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlL2V4cGlyeVRpbWVPZkRheSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlSG9sZGVyIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGVIb2xkZXIvY2FjaGUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZUhvbGRlci9leGlzdGVuY2VDaGVja2luZyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDaGFuZ2VUcmFja2luZyI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2hhbmdlVHJhY2tpbmcvdHlwZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENoYW5nZVRyYWNraW5nSG9sZGVyIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIvY2hhbmdlVHJhY2tpbmciLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2xvbmVDb3B5UG9saWN5Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDbG9uZUNvcHlQb2xpY3kvbWV0aG9kIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2xvbmVDb3B5UG9saWN5L3dvcmtpbmdDb3B5TWV0aG9kIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnNpb25WYWx1ZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVyc2lvblZhbHVlL2RhdGFWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnNpb25WYWx1ZS9vYmplY3RWYWx1ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJ0ZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlci9jbGFzc05hbWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJ0ZXJIb2xkZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJ0ZXJIb2xkZXIvY29udmVydGVyIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlckhvbGRlci90eXBlQ29udmVydGVyIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlckhvbGRlci9vYmplY3RUeXBlQ29udmVydGVyIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlckhvbGRlci9zdHJ1Y3RDb252ZXJ0ZXIiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJ0ZXJzSG9sZGVyIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGVyc0hvbGRlci9jb252ZXJ0ZXJzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlcnNIb2xkZXIvdHlwZUNvbnZlcnRlcnMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGVyc0hvbGRlci9vYmplY3RUeXBlQ29udmVydGVycyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJ0ZXJzSG9sZGVyL3N0cnVjdENvbnZlcnRlcnMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGlibGVNYXBwaW5nIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGlibGVNYXBwaW5nL2NvbnZlcnQiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29weVBvbGljeSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29weVBvbGljeS9jbGFzcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEN1c3RvbWl6ZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEN1c3RvbWl6ZXIvY3VzdG9taXplckNsYXNzTmFtZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEN1c3RvbWl6ZXJIb2xkZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDdXN0b21pemVySG9sZGVyL2N1c3RvbWl6ZXIiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRWxlbWVudENvbGxlY3Rpb24iLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbWJlZGRhYmxlIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW1iZWRkYWJsZS9jb3B5UG9saWN5Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVtYmVkZGFibGUvaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW1iZWRkYWJsZS9jbG9uZUNvcHlQb2xpY3kiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbWJlZGRhYmxlL2V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbWJlZGRlZCIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW1iZWRkZWRJZCIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVudGl0eSI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVudGl0eS9vcHRpbWlzdGljTG9ja2luZyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbnRpdHkvY29weVBvbGljeSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbnRpdHkvaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW50aXR5L2Nsb25lQ29weVBvbGljeSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVudGl0eS9leGNsdWRlRGVmYXVsdE1hcHBpbmdzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sSWQiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sSm9pbkZldGNoIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxKb2luRmV0Y2gvam9pbkZldGNoIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE1hbnlUb01hbnkiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxNYW55VG9PbmUiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTWFwcGVkU3VwZXJjbGFzcy9vcHRpbWlzdGljTG9ja2luZyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL2NvcHlQb2xpY3kiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTWFwcGVkU3VwZXJjbGFzcy9pbnN0YW50aWF0aW9uQ29weVBvbGljeSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL2Nsb25lQ29weVBvbGljeSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE11dGFibGUiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE11dGFibGUvbXV0YWJsZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkQ29udmVydGVyIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxOYW1lZENvbnZlcnRlci9uYW1lIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkvbmFtZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkvcmVzdWx0Q2xhc3MiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5L3Jlc3VsdFNldE1hcHBpbmciLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5L3Byb2NlZHVyZU5hbWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5L3JldHVybnNSZXN1bHRTZXQiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS9oaW50cyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5L3BhcmFtZXRlcnMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sT2JqZWN0VHlwZUNvbnZlcnRlciI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sT2JqZWN0VHlwZUNvbnZlcnRlci9kYXRhVHlwZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9iamVjdFR5cGVDb252ZXJ0ZXIvb2JqZWN0VHlwZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPYmplY3RUeXBlQ29udmVydGVyL2NvbnZlcnNpb25WYWx1ZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPYmplY3RUeXBlQ29udmVydGVyL2RlZmF1bHRPYmplY3RWYWx1ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPbmVUb01hbnkiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPbmVUb09uZSIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9wdGltaXN0aWNMb2NraW5nIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZy90eXBlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sT3B0aW1pc3RpY0xvY2tpbmcvY2FzY2FkZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZy9zZWxlY3RlZENvbHVtbnMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sT3JkZXJDb2x1bW4iLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEvZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcmltYXJ5S2V5Ii8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcml2YXRlT3duZWQiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFByaXZhdGVPd25lZC9wcml2YXRlT3duZWQiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUHJvcGVydHkiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFByb3BlcnR5L25hbWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcm9wZXJ0eS92YWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFByb3BlcnR5L3ZhbHVlVHlwZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFByb3BlcnR5Q29udGFpbmVyIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUHJvcGVydHlDb250YWluZXIvcHJvcGVydGllcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFF1ZXJ5Q29udGFpbmVyIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUXVlcnlDb250YWluZXIvbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUmVhZE9ubHkiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFJlYWRPbmx5L3JlYWRPbmx5Ii8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyL2RpcmVjdGlvbiIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci9uYW1lIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyL3F1ZXJ5UGFyYW1ldGVyIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyL3R5cGUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIvamRiY1R5cGUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIvamRiY1R5cGVOYW1lIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFN0cnVjdENvbnZlcnRlciI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RydWN0Q29udmVydGVyL2NvbnZlcnRlciIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxUaW1lT2ZEYXkiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFRpbWVPZkRheS9ob3VyIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVGltZU9mRGF5L21pbnV0ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFRpbWVPZkRheS9zZWNvbmQiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxUaW1lT2ZEYXkvbWlsbGlzZWNvbmQiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxUcmFuc2Zvcm1hdGlvbiIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFRyYW5zaWVudCIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFR5cGVDb252ZXJ0ZXIiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFR5cGVDb252ZXJ0ZXIvZGF0YVR5cGUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxUeXBlQ29udmVydGVyL29iamVjdFR5cGUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxWYXJpYWJsZU9uZVRvT25lIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVmVyc2lvbiIvPgorICAgIDxuZXN0ZWRHZW5QYWNrYWdlcyBwcmVmaXg9IkVjbGlwc2VMaW5rT3JtVjFfMSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybSIKKyAgICAgICAgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIgYWRhcHRlckZhY3Rvcnk9ImZhbHNlIiBlY29yZVBhY2thZ2U9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEiPgorICAgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvSWRWYWxpZGF0aW9uVHlwZV8xXzEiPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvSWRWYWxpZGF0aW9uVHlwZV8xXzEvTlVMTCIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvSWRWYWxpZGF0aW9uVHlwZV8xXzEvWkVSTyIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvSWRWYWxpZGF0aW9uVHlwZV8xXzEvTk9ORSIvPgorICAgICAgPC9nZW5FbnVtcz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxCYXNpY18xXzEiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvWG1sQmFzaWNfMV8xL2dlbmVyYXRlZFZhbHVlIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvWG1sRW50aXR5XzFfMSI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxFbnRpdHlfMV8xL3ByaW1hcnlLZXkiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMS9wcmltYXJ5S2V5Ii8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvWG1sUHJpbWFyeUtleV8xXzEiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxQcmltYXJ5S2V5XzFfMS92YWxpZGF0aW9uIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxQcmltYXJ5S2V5XzFfMS9jb2x1bW5zIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgPC9uZXN0ZWRHZW5QYWNrYWdlcz4KKyAgICA8bmVzdGVkR2VuUGFja2FnZXMgcHJlZml4PSJFY2xpcHNlTGlua09ybVYyXzAiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0iCisgICAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIGFkYXB0ZXJGYWN0b3J5PSJmYWxzZSIgZWNvcmVQYWNrYWdlPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wIj4KKyAgICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL09yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMCI+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9PcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzAvTk9ORSIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wL0NPUlJFQ1RJT04iLz4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL09yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMC9FWENFUFRJT04iLz4KKyAgICAgIDwvZ2VuRW51bXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wIj4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wL21hcEtleUNvbnZlcnQiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMC9tYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCIvPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbE1hbnlUb01hbnlfMl8wIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxPbmVUb01hbnlfMl8wIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wIj4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wL3ZhbGlkYXRpb25Nb2RlIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgPC9uZXN0ZWRHZW5QYWNrYWdlcz4KKyAgPC9nZW5QYWNrYWdlcz4KKzwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9tb2RlbC9lY2xpcHNlbGlua19vcm0uZWNvcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9tb2RlbC9lY2xpcHNlbGlua19vcm0uZWNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE2ODE4NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL21vZGVsL2VjbGlwc2VsaW5rX29ybS5lY29yZQpAQCAtMCwwICsxLDMzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ib3JtIgorICAgIG5zVVJJPSJqcHQuZWNsaXBzZWxpbmsub3JtLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybSI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQWNjZXNzTWV0aG9kcyI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdldE1ldGhvZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2V0TWV0aG9kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBY2Nlc3NNZXRob2RzSG9sZGVyIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgIGludGVyZmFjZT0idHJ1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFjY2Vzc01ldGhvZHMiIGVUeXBlPSIjLy9YbWxBY2Nlc3NNZXRob2RzIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEF0dHJpYnV0ZU1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgorICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyICMvL1htbFByb3BlcnR5Q29udGFpbmVyIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXR0cmlidXRlcyIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL0F0dHJpYnV0ZXMiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNpY0NvbGxlY3Rpb25zIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1htbEJhc2ljQ29sbGVjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNpY01hcHMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vWG1sQmFzaWNNYXAiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHJhbnNmb3JtYXRpb25zIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1htbFRyYW5zZm9ybWF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhcmlhYmxlT25lVG9PbmVzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1htbFZhcmlhYmxlT25lVG9PbmUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWMiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxCYXNpYyAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbE11dGFibGUgIy8vWG1sQ29udmVydGlibGVNYXBwaW5nICMvL3YxXzEvWG1sQmFzaWNfMV8xIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWNDb2xsZWN0aW9uIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbEF0dHJpYnV0ZU1hcHBpbmciLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxCYXNpY01hcCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ2FjaGUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHBpcnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNpemUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNoYXJlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSIjLy9DYWNoZVR5cGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx3YXlzUmVmcmVzaCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZnJlc2hPbmx5SWZOZXdlciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2FibGVIaXRzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29vcmRpbmF0aW9uVHlwZSIgZVR5cGU9IiMvL0NhY2hlQ29vcmRpbmF0aW9uVHlwZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4cGlyeVRpbWVPZkRheSIgZVR5cGU9IiMvL1htbFRpbWVPZkRheSIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ2FjaGVIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWNoZSIgZVR5cGU9IiMvL1htbENhY2hlIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4aXN0ZW5jZUNoZWNraW5nIiBlVHlwZT0iIy8vRXhpc3RlbmNlVHlwZSIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENoYW5nZVRyYWNraW5nIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9IiMvL1htbENoYW5nZVRyYWNraW5nVHlwZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDaGFuZ2VUcmFja2luZ0hvbGRlciIgYWJzdHJhY3Q9InRydWUiCisgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGFuZ2VUcmFja2luZyIgZVR5cGU9IiMvL1htbENoYW5nZVRyYWNraW5nIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENsb25lQ29weVBvbGljeSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1ldGhvZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya2luZ0NvcHlNZXRob2QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbnZlcnNpb25WYWx1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRhdGFWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvYmplY3RWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb252ZXJ0ZXIiIGVTdXBlclR5cGVzPSIjLy9YbWxOYW1lZENvbnZlcnRlciI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsYXNzTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb252ZXJ0ZXJIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udmVydGVyIiBlVHlwZT0iIy8vWG1sQ29udmVydGVyIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InR5cGVDb252ZXJ0ZXIiIGVUeXBlPSIjLy9YbWxUeXBlQ29udmVydGVyIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9iamVjdFR5cGVDb252ZXJ0ZXIiIGVUeXBlPSIjLy9YbWxPYmplY3RUeXBlQ29udmVydGVyIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0cnVjdENvbnZlcnRlciIgZVR5cGU9IiMvL1htbFN0cnVjdENvbnZlcnRlciIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb252ZXJ0ZXJzSG9sZGVyIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgIGludGVyZmFjZT0idHJ1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnZlcnRlcnMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vWG1sQ29udmVydGVyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InR5cGVDb252ZXJ0ZXJzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1htbFR5cGVDb252ZXJ0ZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib2JqZWN0VHlwZUNvbnZlcnRlcnMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vWG1sT2JqZWN0VHlwZUNvbnZlcnRlciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdHJ1Y3RDb252ZXJ0ZXJzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1htbFN0cnVjdENvbnZlcnRlciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb252ZXJ0aWJsZU1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgorICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQ29udmVydGlibGVNYXBwaW5nICMvL1htbENvbnZlcnRlckhvbGRlciI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnZlcnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ29weVBvbGljeSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDdXN0b21pemVyIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VzdG9taXplckNsYXNzTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDdXN0b21pemVySG9sZGVyIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgIGludGVyZmFjZT0idHJ1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImN1c3RvbWl6ZXIiIGVUeXBlPSIjLy9YbWxDdXN0b21pemVyIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVsZW1lbnRDb2xsZWN0aW9uIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sRWxlbWVudENvbGxlY3Rpb24gIy8vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbWJlZGRhYmxlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sRW1iZWRkYWJsZSAjLy9YbWxDdXN0b21pemVySG9sZGVyICMvL1htbENoYW5nZVRyYWNraW5nSG9sZGVyICMvL1htbENvbnZlcnRlcnNIb2xkZXIgIy8vWG1sUHJvcGVydHlDb250YWluZXIiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb3B5UG9saWN5IiBlVHlwZT0iIy8vWG1sQ29weVBvbGljeSIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnN0YW50aWF0aW9uQ29weVBvbGljeSIKKyAgICAgICAgZVR5cGU9IiMvL1htbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNsb25lQ29weVBvbGljeSIgZVR5cGU9IiMvL1htbENsb25lQ29weVBvbGljeSIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdWRlRGVmYXVsdE1hcHBpbmdzIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW1iZWRkZWQiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxFbWJlZGRlZCAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW1iZWRkZWRJZCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEVtYmVkZGVkSWQgIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEVudGl0eSAjLy9YbWxSZWFkT25seSAjLy9YbWxDdXN0b21pemVySG9sZGVyICMvL1htbENoYW5nZVRyYWNraW5nSG9sZGVyICMvL1htbENhY2hlSG9sZGVyICMvL1htbENvbnZlcnRlcnNIb2xkZXIgIy8vWG1sUXVlcnlDb250YWluZXIgIy8vWG1sUHJvcGVydHlDb250YWluZXIgIy8vdjFfMS9YbWxFbnRpdHlfMV8xIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW1pc3RpY0xvY2tpbmciIGVUeXBlPSIjLy9YbWxPcHRpbWlzdGljTG9ja2luZyIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb3B5UG9saWN5IiBlVHlwZT0iIy8vWG1sQ29weVBvbGljeSIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnN0YW50aWF0aW9uQ29weVBvbGljeSIKKyAgICAgICAgZVR5cGU9IiMvL1htbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNsb25lQ29weVBvbGljeSIgZVR5cGU9IiMvL1htbENsb25lQ29weVBvbGljeSIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdWRlRGVmYXVsdE1hcHBpbmdzIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5TWFwcGluZ3MiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncyAjLy9YbWxDb252ZXJ0ZXJzSG9sZGVyICMvL1htbFF1ZXJ5Q29udGFpbmVyIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSWQiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxJZCAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbE11dGFibGUgIy8vWG1sQ29udmVydGlibGVNYXBwaW5nIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxKb2luRmV0Y2giIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqb2luRmV0Y2giIGVUeXBlPSIjLy9YbWxKb2luRmV0Y2hUeXBlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hbnlUb01hbnkiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxNYW55VG9NYW55ICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sSm9pbkZldGNoICMvL3YyXzAvWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvT25lIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sTWFueVRvT25lICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sSm9pbkZldGNoIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwcGVkU3VwZXJjbGFzcyIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MgIy8vWG1sUmVhZE9ubHkgIy8vWG1sQ3VzdG9taXplckhvbGRlciAjLy9YbWxDaGFuZ2VUcmFja2luZ0hvbGRlciAjLy9YbWxDYWNoZUhvbGRlciAjLy9YbWxDb252ZXJ0ZXJzSG9sZGVyICMvL1htbFByb3BlcnR5Q29udGFpbmVyICMvL3YxXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEgIy8vdjJfMC9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGltaXN0aWNMb2NraW5nIiBlVHlwZT0iIy8vWG1sT3B0aW1pc3RpY0xvY2tpbmciCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29weVBvbGljeSIgZVR5cGU9IiMvL1htbENvcHlQb2xpY3kiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiCisgICAgICAgIGVUeXBlPSIjLy9YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjbG9uZUNvcHlQb2xpY3kiIGVUeXBlPSIjLy9YbWxDbG9uZUNvcHlQb2xpY3kiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE11dGFibGUiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtdXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTmFtZWRDb252ZXJ0ZXIiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN1bHRDbGFzcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdWx0U2V0TWFwcGluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvY2VkdXJlTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmV0dXJuc1Jlc3VsdFNldCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImhpbnRzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxRdWVyeUhpbnQiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFyYW1ldGVycyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT2JqZWN0VHlwZUNvbnZlcnRlciIgZVN1cGVyVHlwZXM9IiMvL1htbE5hbWVkQ29udmVydGVyIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF0YVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib2JqZWN0VHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb252ZXJzaW9uVmFsdWVzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1htbENvbnZlcnNpb25WYWx1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0T2JqZWN0VmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9NYW55IiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sT25lVG9NYW55ICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sUHJpdmF0ZU93bmVkICMvL1htbEpvaW5GZXRjaCAjLy92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMCIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9uZVRvT25lIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sT25lVG9PbmUgIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxQcml2YXRlT3duZWQgIy8vWG1sSm9pbkZldGNoIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT3B0aW1pc3RpY0xvY2tpbmciPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iIy8vWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWxlY3RlZENvbHVtbnMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbENvbHVtbiIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPcmRlckNvbHVtbiIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbE9yZGVyQ29sdW1uICMvL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQcmltYXJ5S2V5IiBlU3VwZXJUeXBlcz0iIy8vdjFfMS9YbWxQcmltYXJ5S2V5XzFfMSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByaXZhdGVPd25lZCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByaXZhdGVPd25lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByb3BlcnR5Ij4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUHJvcGVydHlDb250YWluZXIiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydGllcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9YbWxQcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxRdWVyeUNvbnRhaW5lciIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyIKKyAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IiBjb250YWlubWVudD0idHJ1ZSIKKyAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFJlYWRPbmx5IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhZE9ubHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXJlY3Rpb24iIGVUeXBlPSIjLy9YbWxEaXJlY3Rpb24iLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icXVlcnlQYXJhbWV0ZXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImpkYmNUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludE9iamVjdCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqZGJjVHlwZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFN0cnVjdENvbnZlcnRlciIgZVN1cGVyVHlwZXM9IiMvL1htbE5hbWVkQ29udmVydGVyIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29udmVydGVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFRpbWVPZkRheSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhvdXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbnV0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2Vjb25kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludE9iamVjdCIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaWxsaXNlY29uZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVHJhbnNmb3JtYXRpb24iIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFRyYW5zaWVudCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbFRyYW5zaWVudCAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVHlwZUNvbnZlcnRlciIgZVN1cGVyVHlwZXM9IiMvL1htbE5hbWVkQ29udmVydGVyIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF0YVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib2JqZWN0VHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxWYXJpYWJsZU9uZVRvT25lIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbEF0dHJpYnV0ZU1hcHBpbmciLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxWZXJzaW9uIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sVmVyc2lvbiAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbE11dGFibGUgIy8vWG1sQ29udmVydGlibGVNYXBwaW5nIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJDYWNoZUNvb3JkaW5hdGlvblR5cGUiPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiIHZhbHVlPSIxIi8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyIgdmFsdWU9IjIiLz4KKyAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5PTkUiIHZhbHVlPSIzIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iQ2FjaGVUeXBlIj4KKyAgICA8ZUxpdGVyYWxzIG5hbWU9IkZVTEwiLz4KKyAgICA8ZUxpdGVyYWxzIG5hbWU9IldFQUsiIHZhbHVlPSIxIi8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJTT0ZUIiB2YWx1ZT0iMiIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iU09GVF9XRUFLIiB2YWx1ZT0iMyIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iSEFSRF9XRUFLIiB2YWx1ZT0iNCIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0FDSEUiIHZhbHVlPSI1Ii8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJOT05FIiB2YWx1ZT0iNiIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlhtbENoYW5nZVRyYWNraW5nVHlwZSI+CisgICAgPGVMaXRlcmFscyBuYW1lPSJBVFRSSUJVVEUiIGxpdGVyYWw9IkFUVFJJQlVURSIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iT0JKRUNUIiB2YWx1ZT0iMSIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iREVGRVJSRUQiIHZhbHVlPSIyIi8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJBVVRPIiB2YWx1ZT0iMyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlhtbERpcmVjdGlvbiI+CisgICAgPGVMaXRlcmFscyBuYW1lPSJJTiIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1VUIiB2YWx1ZT0iMSIgbGl0ZXJhbD0iT1VUIi8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJJTl9PVVQiIHZhbHVlPSIyIiBsaXRlcmFsPSJJTl9PVVQiLz4KKyAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9VVF9DVVJTT1IiIHZhbHVlPSIzIiBsaXRlcmFsPSJPVVRfQ1VSU09SIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iRXhpc3RlbmNlVHlwZSI+CisgICAgPGVMaXRlcmFscyBuYW1lPSJDSEVDS19DQUNIRSIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0hFQ0tfREFUQUJBU0UiIHZhbHVlPSIxIi8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJBU1NVTUVfRVhJU1RFTkNFIiB2YWx1ZT0iMiIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiIHZhbHVlPSIzIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iWG1sSm9pbkZldGNoVHlwZSI+CisgICAgPGVMaXRlcmFscyBuYW1lPSJJTk5FUiIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1VURVIiIHZhbHVlPSIxIiBsaXRlcmFsPSJPVVRFUiIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSI+CisgICAgPGVMaXRlcmFscyBuYW1lPSJBTExfQ09MVU1OUyIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0hBTkdFRF9DT0xVTU5TIiB2YWx1ZT0iMSIgbGl0ZXJhbD0iQ0hBTkdFRF9DT0xVTU5TIi8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJTRUxFQ1RFRF9DT0xVTU5TIiB2YWx1ZT0iMiIgbGl0ZXJhbD0iU0VMRUNURURfQ09MVU1OUyIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iVkVSU0lPTl9DT0xVTU4iIHZhbHVlPSIzIiBsaXRlcmFsPSJWRVJTSU9OX0NPTFVNTiIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVTdWJwYWNrYWdlcyBuYW1lPSJ2MV8xIiBuc1VSST0ianB0LmVjbGlwc2VsaW5rLm9ybS52MV8xLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xIj4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2ljXzFfMSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEdlbmVyYXRvckNvbnRhaW5lciI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ2VuZXJhdGVkVmFsdWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sR2VuZXJhdGVkVmFsdWUiCisgICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5XzFfMSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJpbWFyeUtleSIgZVR5cGU9IiMvL3YxXzEvWG1sUHJpbWFyeUtleV8xXzEiCisgICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmltYXJ5S2V5IiBlVHlwZT0iIy8vWG1sUHJpbWFyeUtleSIKKyAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUHJpbWFyeUtleV8xXzEiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbGlkYXRpb24iIGVUeXBlPSIjLy92MV8xL0lkVmFsaWRhdGlvblR5cGVfMV8xIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29sdW1ucyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxDb2x1bW4iCisgICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJJZFZhbGlkYXRpb25UeXBlXzFfMSI+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5VTEwiLz4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iWkVSTyIgdmFsdWU9IjIiLz4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iTk9ORSIgdmFsdWU9IjIiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgPC9lU3VicGFja2FnZXM+CisgIDxlU3VicGFja2FnZXMgbmFtZT0idjJfMCIgbnNVUkk9ImpwdC5lY2xpcHNlbGluay5vcm0udjJfMC54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMCI+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hcEtleUNvbnZlcnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyIKKyAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlIgorICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbENvbnZlcnRpYmxlTWFwcGluZyAjLy9YbWxDb252ZXJ0ZXJzSG9sZGVyICMvL3YyXzAvWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYW55VG9NYW55XzJfMCIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbENvbnZlcnRlckhvbGRlciAjLy92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMCIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy92Ml8wL1htbENhY2hlYWJsZTJfMCIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9NYW55XzJfMCIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbENvbnZlcnRlckhvbGRlciAjLy92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMCIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT3JkZXJDb2x1bW5fMl8wIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWxpZGF0aW9uTW9kZSIgZVR5cGU9IiMvL3YyXzAvT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9Ik9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMCI+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5PTkUiLz4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ09SUkVDVElPTiIgdmFsdWU9IjEiLz4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iRVhDRVBUSU9OIiB2YWx1ZT0iMiIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICA8L2VTdWJwYWNrYWdlcz4KKzwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmluZGV4IDk5NmVjZmMuLjc3NWM3NDMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0xLDUgKzEsNSBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgorIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgogIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsNSArMjAsMTEgQEAKICMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgLSBDb3JlCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZworcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgLSBDb3JlCitwcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQorCitFQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlQgPSBFY2xpcHNlTGluayBYTUwgbWFwcGluZyBmaWxlcworCitFQ0xJUFNFTElOSzFfMF94X1BMQVRGT1JNID0gRWNsaXBzZUxpbmsgMS4wLngKK0VDTElQU0VMSU5LMV8xX3hfUExBVEZPUk0gPSBFY2xpcHNlTGluayAxLjEueAorRUNMSVBTRUxJTksyXzBfeF9QTEFURk9STSA9IEVjbGlwc2VMaW5rIDIuMC54CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnhtbAppbmRleCA5MzRlMTg0Li40Y2NjZmI5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi54bWwKQEAgLTEsMTIgKzEsMTcyIEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgogPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgogPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGFQbGF0Zm9ybSI+Ci0gICAgICA8anBhUGxhdGZvcm0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua1BsYXRmb3JtIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjbGlwc2VsaW5rLnBsYXRmb3JtIgotICAgICAgICAgICAgbGFiZWw9IkVjbGlwc2VMaW5rIj4KLSAgICAgIDwvanBhUGxhdGZvcm0+Ci0gICA8L2V4dGVuc2lvbj4KKwkKKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlLmNvbnRlbnRUeXBlcyI+CisJCQorCQk8Y29udGVudC10eXBlCisJCQlpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGVudC5vcm0iCisJCQluYW1lPSIlRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UIgorCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZW50Lm1hcHBpbmdGaWxlIj4KKwkJCTxkZXNjcmliZXIKKwkJCQljbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuWE1MUm9vdEVsZW1lbnRDb250ZW50RGVzY3JpYmVyMiI+CisJCQkJPHBhcmFtZXRlciAKKwkJCQkJbmFtZT0iZWxlbWVudCIgCisJCQkJCXZhbHVlPSJ7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybX1lbnRpdHktbWFwcGluZ3MiLz4KKwkJCTwvZGVzY3JpYmVyPgorCQk8L2NvbnRlbnQtdHlwZT4KKwkJCisJPC9leHRlbnNpb24+CisJCisJCisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LmNvcmUuanBhUGxhdGZvcm1zIj4KKwkJCisJCTxqcGFQbGF0Zm9ybQorCQkJaWQ9Im9yZy5lY2xpcHNlLmVjbGlwc2VsaW5rLnBsYXRmb3JtIgorICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVBsYXRmb3JtRmFjdG9yeSIKKwkJCWxhYmVsPSIlRUNMSVBTRUxJTksxXzBfeF9QTEFURk9STSIKKwkJCWpwYUZhY2V0VmVyc2lvbj0iMS4wIj4KKwkJPC9qcGFQbGF0Zm9ybT4KKwkgICAgCisJICAgIDxqcGFQbGF0Zm9ybQorCSAgICAgICAgaWQ9ImVjbGlwc2VsaW5rMV8xIgorCSAgICAgICAgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLkVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1GYWN0b3J5IgorCSAgICAgICAgbGFiZWw9IiVFQ0xJUFNFTElOSzFfMV94X1BMQVRGT1JNIgorCSAgICAgICAganBhRmFjZXRWZXJzaW9uPSIxLjAiPgorCSAgICA8L2pwYVBsYXRmb3JtPgorCisJICAgIDxqcGFQbGF0Zm9ybQorCSAgICAgICAgaWQ9ImVjbGlwc2VsaW5rMl8wIgorCSAgICAgICAgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLkVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1GYWN0b3J5IgorCSAgICAgICAgbGFiZWw9IiVFQ0xJUFNFTElOSzJfMF94X1BMQVRGT1JNIgorCSAgICAgICAganBhRmFjZXRWZXJzaW9uPSIyLjAiPgorCSAgICA8L2pwYVBsYXRmb3JtPgorCisJPC9leHRlbnNpb24+CisKKworCQorCTwhLS0KKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqIExpYnJhcnkgUHJvdmlkZXIgRnJhbWV3b3JrIEludGVncmF0aW9uICoKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwktLT4KKwkKKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5kb3dubG9hZGFibGVMaWJyYXJpZXMiPgorCQkKKwkJPGltcG9ydC1kZWZpbml0aW9ucyAKKwkJCXVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpL2Rldi9lY2xpcHNlbGluay9lY2xpcHNlbGluay1kb3dubG9hZGFibGUtbGlicy54bWwiPgorCQkJPGVuYWJsZW1lbnQ+CisJCQkJPHdpdGggdmFyaWFibGU9InJlcXVlc3RpbmdQcm9qZWN0RmFjZXQiPgorCQkJCQk8dGVzdCAKKwkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIAorCQkJCQkJdmFsdWU9ImpwdC5qcGEiIAorCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+CisJCQkJPC93aXRoPgorCQkJPC9lbmFibGVtZW50PgorCQk8L2ltcG9ydC1kZWZpbml0aW9ucz4KKwkJCisJPC9leHRlbnNpb24+CisJCisJCisJPGV4dGVuc2lvbiAKKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnJhcnlQcm92aWRlcnMiPgorCQkKKwkJPHByb3ZpZGVyIGlkPSJqcGEtZWNsaXBzZWxpbmstdXNlci1saWJyYXJ5LXByb3ZpZGVyIiBleHRlbmRzPSJ3dHAtdXNlci1saWJyYXJ5LXByb3ZpZGVyIj4KKwkJCTxwYXJhbSBuYW1lPSJ2YWxpZGF0b3IiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LnVzZXIuS2V5Q2xhc3Nlc1ZhbGlkYXRvciIvPgorCQkJPHBhcmFtIG5hbWU9InZhbGlkYXRvci5wYXJhbS4wIiB2YWx1ZT0iamF2YXgucGVyc2lzdGVuY2UuRW50aXR5Ii8+CisJCQk8cGFyYW0gbmFtZT0idmFsaWRhdG9yLnBhcmFtLjEiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSIvPgorCQkJPGVuYWJsZW1lbnQ+CisJCQkJPGFuZD4KKwkJCQkJPHdpdGggdmFyaWFibGU9InJlcXVlc3RpbmdQcm9qZWN0RmFjZXQiPgorCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGEiIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgorCQkJCQk8L3dpdGg+CisJCQkJCTx3aXRoIHZhcmlhYmxlPSJqcGFQbGF0Zm9ybSI+CisJCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS5lY2xpcHNlbGluay5wbGF0Zm9ybSIvPgorCQkJCQk8L3dpdGg+CisJCQkJPC9hbmQ+CisJCQk8L2VuYWJsZW1lbnQ+CisJCTwvcHJvdmlkZXI+CisJCQorCQk8IS0tIGVjbGlwc2VsaW5rIDEuMSBsaWJyYXJ5IHByb3ZpZGVyIGlzIGZvciBub3cgYSBzaW1wbGUgY29weSBvZiBlY2xpcHNlbGluayBsaWJyYXJ5IHByb3ZpZGVyIC0tPgorCQk8cHJvdmlkZXIgaWQ9ImpwYS1lY2xpcHNlbGluazFfMS11c2VyLWxpYnJhcnktcHJvdmlkZXIiIGV4dGVuZHM9Ind0cC11c2VyLWxpYnJhcnktcHJvdmlkZXIiPgorCQkJPHBhcmFtIG5hbWU9InZhbGlkYXRvciIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YudXNlci5LZXlDbGFzc2VzVmFsaWRhdG9yIi8+CisJCQk8cGFyYW0gbmFtZT0idmFsaWRhdG9yLnBhcmFtLjAiIHZhbHVlPSJqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHkiLz4KKwkJCTxwYXJhbSBuYW1lPSJ2YWxpZGF0b3IucGFyYW0uMSIgdmFsdWU9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIi8+CisJCQk8ZW5hYmxlbWVudD4KKwkJCQk8YW5kPgorCQkJCQk8d2l0aCB2YXJpYWJsZT0icmVxdWVzdGluZ1Byb2plY3RGYWNldCI+CisJCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiB2YWx1ZT0ianB0LmpwYSIgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+CisJCQkJCTwvd2l0aD4KKwkJCQkJPHdpdGggdmFyaWFibGU9ImpwYVBsYXRmb3JtIj4KKwkJCQkJCTxlcXVhbHMgdmFsdWU9ImVjbGlwc2VsaW5rMV8xIi8+CisJCQkJCTwvd2l0aD4KKwkJCQk8L2FuZD4KKwkJCTwvZW5hYmxlbWVudD4KKwkJPC9wcm92aWRlcj4KKwkJCisJCTwhLS0gZWNsaXBzZWxpbmsgMi4wIGxpYnJhcnkgcHJvdmlkZXIgaXMgZm9yIG5vdyBhIHNpbXBsZSBjb3B5IG9mIGVjbGlwc2VsaW5rIGxpYnJhcnkgcHJvdmlkZXIgLS0+CisJCTxwcm92aWRlciBpZD0ianBhLWVjbGlwc2VsaW5rMl8wLXVzZXItbGlicmFyeS1wcm92aWRlciIgZXh0ZW5kcz0id3RwLXVzZXItbGlicmFyeS1wcm92aWRlciI+CisJCQk8cGFyYW0gbmFtZT0idmFsaWRhdG9yIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi51c2VyLktleUNsYXNzZXNWYWxpZGF0b3IiLz4KKwkJCTxwYXJhbSBuYW1lPSJ2YWxpZGF0b3IucGFyYW0uMCIgdmFsdWU9ImphdmF4LnBlcnNpc3RlbmNlLkVudGl0eSIvPgorCQkJPHBhcmFtIG5hbWU9InZhbGlkYXRvci5wYXJhbS4xIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUiLz4KKwkJCTxlbmFibGVtZW50PgorCQkJCTxhbmQ+CisJCQkJCTx3aXRoIHZhcmlhYmxlPSJyZXF1ZXN0aW5nUHJvamVjdEZhY2V0Ij4KKwkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIHZhbHVlPSJqcHQuanBhIiBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KKwkJCQkJPC93aXRoPgorCQkJCQk8d2l0aCB2YXJpYWJsZT0ianBhUGxhdGZvcm0iPgorCQkJCQkJPGVxdWFscyB2YWx1ZT0iZWNsaXBzZWxpbmsyXzAiLz4KKwkJCQkJPC93aXRoPgorCQkJCTwvYW5kPgorCQkJPC9lbmFibGVtZW50PgorCQk8L3Byb3ZpZGVyPgorCisJPC9leHRlbnNpb24+CisJCisJCisJPCEtLSAqKioqKiBXVFAgZXh0ZW5zaW9ucyAqKioqKiAtLT4KKworCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5yZXNvdXJjZUZhY3RvcmllcyI+CisJCQorCQk8cmVzb3VyY2VGYWN0b3J5CisJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VGYWN0b3J5IgorCQkJaXNEZWZhdWx0PSJ0cnVlIj4KKwkJCTxjb250ZW50VHlwZUJpbmRpbmcKKwkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZW50Lm9ybSI+CisJCQk8L2NvbnRlbnRUeXBlQmluZGluZz4KKwkJPC9yZXNvdXJjZUZhY3Rvcnk+CisJICAgIAorCTwvZXh0ZW5zaW9uPgorCQorCQorCTxleHRlbnNpb24gCisJCXBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY2F0YWxvZ0NvbnRyaWJ1dGlvbnMiPgorCQkKKwkJPGNhdGFsb2dDb250cmlidXRpb24gaWQ9ImRlZmF1bHQiPgorCQkJCisJCQk8cHVibGljCisJCQkJcHVibGljSWQ9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iCisJCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzAueHNkIi8+CisJCQkKKwkJCTx1cmkKKwkJCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzFfMC54c2QiCisJCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzAueHNkIiAvPgorCQkJCisJCQk8dXJpCisJCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX29ybV8xXzEueHNkIgorCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZCIgLz4KKwkJCQorCQkJPHVyaQorCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8wLnhzZCIKKwkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QiIC8+CisJCQkKKwkJCQorCQk8L2NhdGFsb2dDb250cmlidXRpb24+CisJCQorICAgIDwvZXh0ZW5zaW9uPgorCQogPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua19qcGFfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfanBhX3ZhbGlkYXRpb24ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmRmMjIzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfanBhX3ZhbGlkYXRpb24ucHJvcGVydGllcwpAQCAtMCwwICsxLDE0IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQ0FDSEVfRVhQSVJZX0FORF9FWFBJUllfVElNRV9PRl9EQVlfQk9USF9TUEVDSUZJRUQ9VGhlIEBDYWNoZSBhbm5vdGF0aW9uIG9uIGVudGl0eSBcInswfVwiIGhhcyBib3RoIGV4cGlyeSgpIGFuZCBleHBpcnlUaW1lT2ZEYXkoKSBzcGVjaWZpZWQuIE9ubHkgb25lIG9mIHRoZSB0d28gbWF5IGJlIHNwZWNpZmllZAorQ09OVkVSVEVSX0NMQVNTX0lNUExFTUVOVFNfQ09OVkVSVEVSPVRoZSBjb252ZXJ0ZXIgY2xhc3MgXCJ7MH1cIiBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyIGludGVyZmFjZQorQ1VTVE9NSVpFUl9DTEFTU19JTVBMRU1FTlRTX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUj1UaGUgY3VzdG9taXplciBjbGFzcyBcInswfVwiIGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLkRlc2NyaXB0b3JDdXN0b21pemVyIGludGVyZmFjZQorTVVMVElQTEVfT0JKRUNUX1ZBTFVFU19GT1JfREFUQV9WQUxVRT1NdWx0aXBsZSBvYmplY3QgdmFsdWVzIGFyZSBzcGVjaWZpZWQgZm9yIHRoZSBkYXRhIHZhbHVlIFwiezB9XCIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzAueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8wLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjFkMWRhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8wLnhzZApAQCAtMCwwICsxLDMxMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIEphdmEgUGVyc2lzdGVuY2UgQVBJIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZSBzY2hlbWEgLS0+Cis8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAorICB4bWxuczpvcm09Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAorICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKKyAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAorICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAorICB2ZXJzaW9uPSIxLjAiPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICBAKCMpZWNsaXBzZWxpbmtfb3JtXzFfMC54c2QgMS4wICBGZWJydWFyeSAxIDIwMDgKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorICA8eHNkOmFubm90YXRpb24+CisgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKKworICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBuZXcgbmF0aXZlIEVjbGlwc2VMaW5rIFhNTCBtZXRhZGF0YQorICAgICAgIGZvcm1hdCB1c2VkIGZvciBKUEEgYW5kIG5hdGl2ZSBkZXBsb3ltZW50IHhtbCBmaWxlcy4gCisKKyAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5VHlwZSIvPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ2ZXJzaW9uVHlwZSI+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XSsoXC5bMC05XSspKiIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LW1hcHBpbmdzIj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgVGhlIGVudGl0eS1tYXBwaW5ncyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYW4gbWFwcGluZworICAgICAgICBmaWxlLiBJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGZvdXIgdHlwZXMgb2YgZWxlbWVudHM6CisKKyAgICAgICAgMS4gVGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBjb250YWlucyBtZXRhZGF0YQorICAgICAgICBmb3IgdGhlIGVudGlyZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgaWYgdGhpcyBlbGVtZW50CisgICAgICAgIG9jY3VycyBpbiBtdWx0aXBsZSBtYXBwaW5nIGZpbGVzIHdpdGhpbiB0aGUgc2FtZSBwZXJzaXN0ZW5jZSB1bml0LgorICAgICAgICAKKyAgICAgICAgMi4gVGhlIHBhY2thZ2UsIHNjaGVtYSwgY2F0YWxvZyBhbmQgYWNjZXNzIGVsZW1lbnRzIGFwcGx5IHRvIGFsbCBvZgorICAgICAgICB0aGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBkZWZpbmVkIGluCisgICAgICAgIHRoZSBzYW1lIGZpbGUgaW4gd2hpY2ggdGhleSBvY2N1ci4KKworICAgICAgICAzLiBUaGUgc2VxdWVuY2UtZ2VuZXJhdG9yLCB0YWJsZS1nZW5lcmF0b3IsIG5hbWVkLXF1ZXJ5LAorICAgICAgICBuYW1lZC1uYXRpdmUtcXVlcnkgYW5kIHNxbC1yZXN1bHQtc2V0LW1hcHBpbmcgZWxlbWVudHMgYXJlIGdsb2JhbAorICAgICAgICB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZQorICAgICAgICBzZXF1ZW5jZS1nZW5lcmF0b3Igb3IgdGFibGUtZ2VuZXJhdG9yIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUKKyAgICAgICAgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyBhbHNvIAorICAgICAgICB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIG5hbWVkLXF1ZXJ5IG9yIG5hbWVkLW5hdGl2ZS1xdWVyeQorICAgICAgICBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgCisgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQuCisKKyAgICAgICAgNC4gVGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZWFjaCBkZWZpbmUKKyAgICAgICAgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgbWFuYWdlZCBwZXJzaXN0ZW50IGNsYXNzLiBUaGUgbWFwcGluZworICAgICAgICBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlc2UgZWxlbWVudHMgbWF5IGJlIGNvbXBsZXRlIG9yIGl0IG1heQorICAgICAgICBiZSBwYXJ0aWFsLgorCisgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiAKKyAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCisgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyIgdHlwZT0ib3JtOm1hcHBlZC1zdXBlcmNsYXNzIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eSIgdHlwZT0ib3JtOmVudGl0eSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRhYmxlIiB0eXBlPSJvcm06ZW1iZWRkYWJsZSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uVHlwZSIgCisgICAgICAgICAgICAgICAgICAgICBmaXhlZD0iMS4wIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCisgICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKKworICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQgdGhlbiAKKyAgICAgICAgdGhlIGNvbXBsZXRlIHNldCBvZiBtYXBwaW5nIG1ldGFkYXRhIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdCAKKyAgICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBYTUwgbWFwcGluZyBmaWxlcyBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgCisgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBUaGVzZSBkZWZhdWx0cyBhcmUgYXBwbGllZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhcyBhIHdob2xlIAorICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTCAKKyAgICAgICAgZWxlbWVudCBzZXR0aW5ncy4gCisgICAgICAgIAorICAgICAgICBzY2hlbWEgLSBVc2VkIGFzIHRoZSBzY2hlbWEgZm9yIGFsbCB0YWJsZXMgb3Igc2Vjb25kYXJ5IHRhYmxlcworICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAorICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcyBvciBzZWNvbmRhcnkgdGFibGVzCisgICAgICAgICAgICB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0CisgICAgICAgIGFjY2VzcyAtIFVzZWQgYXMgdGhlIGFjY2VzcyB0eXBlIGZvciBhbGwgbWFuYWdlZCBjbGFzc2VzIGluCisgICAgICAgICAgICB0aGUgcGVyc2lzdGVuY2UgdW5pdAorICAgICAgICBjYXNjYWRlLXBlcnNpc3QgLSBBZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucworICAgICAgICAgICAgaW4gZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQKKyAgICAgICAgZW50aXR5LWxpc3RlbmVycyAtIExpc3Qgb2YgZGVmYXVsdCBlbnRpdHkgbGlzdGVuZXJzIHRvIGJlIGludm9rZWQgCisgICAgICAgICAgICBvbiBlYWNoIGVudGl0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhbiBlbnRpdHkuIElzIGFsbG93ZWQgdG8gYmUKKyAgICAgICAgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGFubm90YXRpb25zLgorICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIAorICAgICAgICBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIG9uIHRoZSBlbnRpdHkgY2xhc3MgKGFuZCBpdHMgZmllbGRzCisgICAgICAgIG9yIHByb3BlcnRpZXMpIGFyZSB0byBiZSBwcm9jZXNzZWQuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiAKKyAgICAgICAgdGhlIGRlZmF1bHRpbmcgcnVsZXMgZm9yIHRoZSBlbnRpdHkgYW5kIGl0cyBzdWJlbGVtZW50cyB3aWxsIAorICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgorCisgICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ib3JtOnRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWNvbmRhcnktdGFibGUiIHR5cGU9Im9ybTpzZWNvbmRhcnktdGFibGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9Im9ybTppbmhlcml0YW5jZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdmFsdWUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAorICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZXMiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIGVudGl0eSBmaWVsZCBvciBwcm9wZXJ0eSBtYXBwaW5ncy4KKyAgICAgICAgSXQgbWF5IGJlIHNwYXJzZWx5IHBvcHVsYXRlZCB0byBpbmNsdWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlCisgICAgICAgIGZpZWxkcyBvciBwcm9wZXJ0aWVzLiBJZiBtZXRhZGF0YS1jb21wbGV0ZSBmb3IgdGhlIGVudGl0eSBpcyB0cnVlCisgICAgICAgIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGRlZmF1bHRlZCBhY2NvcmRpbmcKKyAgICAgICAgdG8gdGhlIGRlZmF1bHQgcnVsZXMuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ib3JtOmlkIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmJhc2ljLWNvbGxlY3Rpb24iCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLW1hcCIgdHlwZT0ib3JtOmJhc2ljLW1hcCIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb24iCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tb25lIiB0eXBlPSJvcm06bWFueS10by1vbmUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1tYW55IiB0eXBlPSJvcm06b25lLXRvLW1hbnkiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1vbmUiIHR5cGU9Im9ybTpvbmUtdG8tb25lIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIiB0eXBlPSJvcm06dmFyaWFibGUtb25lLXRvLW9uZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtYXRpb24iIHR5cGU9Im9ybTp0cmFuc2Zvcm1hdGlvbiIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IiB0eXBlPSJvcm06dHJhbnNpZW50IgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJhY2Nlc3MtdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIFRoaXMgZWxlbWVudCBkZXRlcm1pbmVzIGhvdyB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgYWNjZXNzZXMgdGhlCisgICAgICAgIHN0YXRlIG9mIGFuIGVudGl0eSBvciBlbWJlZGRlZCBvYmplY3QuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9QRVJUWSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5TGlzdGVuZXJzIHsKKyAgICAgICAgICBDbGFzc1tdIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVyIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVyIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cworICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXJlbW92ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUmVtb3ZlIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXJlbW92ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFJlbW92ZSB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXVwZGF0ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlVXBkYXRlIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXVwZGF0ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFVwZGF0ZSB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1sb2FkIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0TG9hZCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBBIHVzZXIgZGVmaW5lZCBtYXBwaW5nJ3MgcHJvcGVydHkuCisJCUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQorCQlAUmV0ZW50aW9uKFJVTlRJTUUpCisJCXB1YmxpYyBAaW50ZXJmYWNlIFByb3BlcnR5IHsKKwkJCS8qKgorCQkJKiBQcm9wZXJ0eSBuYW1lLgorCQkJKi8gCisJCQlTdHJpbmcgbmFtZSgpOworCQkJCisJCQkvKioKKwkJCSogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIFByb3BlcnR5IHZhbHVlLAorCQkJKiBjb252ZXJ0ZWQgdG8gYW4gaW5zdGFuY2Ugb2YgdmFsdWVUeXBlLgorCQkJKi8gCisJCQlTdHJpbmcgdmFsdWUoKTsKKwkJCQorCQkJLyoqCisJCQkqIFByb3BlcnR5IHZhbHVlIHR5cGUuCisJCQkqIFRoZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gdmFsdWVUeXBlIGJ5IENvbnZlcnNpb25NYW5hZ2VyLgorCQkJKiBJZiBzcGVjaWZpZWQgbXVzdCBiZSBhIHNpbXBsZSB0eXBlIHRoYXQgY291bGQgYmUgaGFuZGxlZCBieSAKKwkJCSogQ29udmVyc2lvbk1hbmFnZXI6IAorCQkJKiBudW1lcmljYWwsIGJvb2xlYW4sIHRlbXBvcmFsLiAgCisJCQkqLyAKKwkJCUNsYXNzIHZhbHVlVHlwZSgpIGRlZmF1bHQgU3RyaW5nLmNsYXNzOworCQl9CisJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAKKyAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1oaW50Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKSAKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUXVlcnlIaW50IHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtcXVlcnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFF1ZXJ5IHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyBxdWVyeSgpOworICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZE5hdGl2ZVF1ZXJ5IHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyBxdWVyeSgpOworICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7IC8vbmFtZWQgU3FsUmVzdWx0U2V0TWFwcGluZworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTcWxSZXN1bHRTZXRNYXBwaW5nIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIEVudGl0eVJlc3VsdFtdIGVudGl0aWVzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBDb2x1bW5SZXN1bHRbXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktcmVzdWx0IiB0eXBlPSJvcm06ZW50aXR5LXJlc3VsdCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1yZXN1bHQiIHR5cGU9Im9ybTpjb2x1bW4tcmVzdWx0IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktcmVzdWx0Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlSZXN1bHQgeworICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzKCk7CisgICAgICAgICAgRmllbGRSZXN1bHRbXSBmaWVsZHMoKSBkZWZhdWx0IHt9OworICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1yZXN1bHQiIHR5cGU9Im9ybTpmaWVsZC1yZXN1bHQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJlbnRpdHktY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1yZXN1bHQiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZpZWxkUmVzdWx0IHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyBjb2x1bW4oKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWNvbmRhcnktdGFibGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OworICAgICAgICAgfQorCisgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAorICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFVuaXF1ZUNvbnN0cmFpbnQgeworICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIAorICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtbiB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKKyAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7CisgICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KKyAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi1jb2x1bW4iPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luQ29sdW1uIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7CisgICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY2Nlc3MtbWV0aG9kcyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXR0cmlidXRlT3ZlcnJpZGUgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgQ29sdW1uIGNvbHVtbigpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCisgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkLWNsYXNzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWRDbGFzcyB7CisgICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKKyAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQtaWQiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZElkIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKKyAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zaWVudCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zaWVudCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmVyc2lvbiB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKKyAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7CisgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKKyAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKKyAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJCS8qKgorCQkgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCisJCSAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCisJCSAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCisJCSAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCisJCSAqICAKKwkJICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKKwkJICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCisJCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCisJCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAorCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4gCisJCSAqLyAKKwkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCisJCUBSZXRlbnRpb24oUlVOVElNRSkKKwkJcHVibGljIEBpbnRlcmZhY2UgUmVhZFRyYW5zZm9ybWVyIHsKKwkJICAgIC8qKgorCQkgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAorCQkgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkF0dHJpYnV0ZVRyYW5zZm9ybWVyIAorCQkgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyAKKwkJICAgICAqIGJ1aWxkQXR0cmlidXRlVmFsdWUgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgCisJCSAgICAgKiBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlLgorCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCisJCSAgICAgKi8gCisJCSAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOworCQkKKwkJICAgIC8qKgorCQkgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKKwkJICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAorCQkgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAorCQkgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCisJCSAgICAgKi8gCisJCSAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKKwkJfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJCS8qKgorCQkgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCisJCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCisJCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAorCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4KKwkJICogIAorCQkgKiBBIHNpbmdsZSBXcml0ZVRyYW5zZm9ybWVyIG1heSBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgb24gdGhlIG1ldGhvZCBvciAKKwkJICogYXR0cmlidXRlLiBNdWx0aXBsZSBXcml0ZVRyYW5zZm9ybWVycyBzaG91bGQgYmUgd3JhcHBlZCBpbnRvIAorCQkgKiBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uLiBObyBXcml0ZVRyYW5zZm9ybWVycyBzcGVjaWZpZWQgZm9yIAorCQkgKiByZWFkLW9ubHkgbWFwcGluZy4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgd3JpdGUtb25seSwgaXQgCisJCSAqIHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIAorCQkgKiBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KKwkJICovIAorCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKKwkJQFJldGVudGlvbihSVU5USU1FKQorCQlwdWJsaWMgQGludGVyZmFjZSBXcml0ZVRyYW5zZm9ybWVyIHsKKwkJICAgIC8qKgorCQkgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAorCQkgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkZpZWxkVHJhbnNmb3JtZXIgCisJCSAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIGJ1aWxkRmllbGRWYWx1ZSAKKwkJICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgZGF0YWJhc2UgCisJCSAgICAgKiBjb2x1bW4uIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSAKKwkJICAgICAqIHN1cHBvcnRlZCB0aGUgbWV0aG9kIGJ1aWxkRmllbGRWYWx1ZSBpbiB0aGUgY2xhc3Mgc2hvdWxkIGJlIAorCQkgICAgICogZGVmaW5lZCB0byByZXR1cm4gdGhlIHJlbGV2YW50IEphdmEgdHlwZSwgbm90IGp1c3QgT2JqZWN0IGFzIAorCQkgICAgICogZGVmaW5lZCBpbiB0aGUgaW50ZXJmYWNlLCBmb3IgaW5zdGFuY2U6CisJCSAgICAgKiBwdWJsaWMgVGltZSBidWlsZEZpZWxkVmFsdWUoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgZmllbGROYW1lLCBTZXNzaW9uIHNlc3Npb24pLgorCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCisJCSAgICAgKi8gCisJCSAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOworCQkKKwkJICAgIC8qKgorCQkgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKKwkJICAgICAqIGEgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSBjb2x1bW4uCisJCSAgICAgKiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgc3VwcG9ydGVkIHRoZSAKKwkJICAgICAqIG1ldGhvZCBzaG91bGQgYmUgZGVmaW5lZCB0byByZXR1cm4gYSBwYXJ0aWN1bGFyIHR5cGUsIG5vdCBqdXN0IAorCQkgICAgICogT2JqZWN0LCBmb3IgaW5zdGFuY2U6CisJCSAgICAgKiBwdWJsaWMgVGltZSBnZXRTdGFydFRpbWUoKS4KKwkJICAgICAqIFRoZSBtZXRob2QgbWF5IHJlcXVpcmUgYSBUcmFuc2llbnQgYW5ub3RhdGlvbiB0byBhdm9pZCBiZWluZyAKKwkJICAgICAqIG1hcHBlZCBhcyBCYXNpYyBieSBkZWZhdWx0LgorCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCisJCSAgICAgKi8gCisJCSAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKKwkJCisJCSAgICAvKioKKwkJICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgorCQkgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKKwkJICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAorCQkgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCisJCSAgICAgKi8gCisJCSAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOworCQl9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtYXRpb24iPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCQkvKioKKwkJICogVHJhbnNmb3JtYXRpb24gaXMgYW4gb3B0aW9uYWwgYW5ub3RhdGlvbiBmb3IgCisJCSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KKwkJICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGFsbG93cyB0byBtYXAgYW4gYXR0cmlidXRlIHRvIG9uZSBvciBtb3JlIAorCQkgKiBkYXRhYmFzZSBjb2x1bW5zLgorCQkgKiAKKwkJICogVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbiBpcyBhbiBvcHRpb25hbCBwYXJ0IG9mIAorCQkgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgZGVmaW5pdGlvbi4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgCisJCSAqIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIAorCQkgKiB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KKwkJICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKKwkJICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCisJCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCisJCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAorCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4gCisJCSAqLyAKKwkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCisJCUBSZXRlbnRpb24oUlVOVElNRSkKKwkJcHVibGljIEBpbnRlcmZhY2UgVHJhbnNmb3JtYXRpb24geworCQkgICAgLyoqCisJCSAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAorCQkgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKKwkJICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCisJCSAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKKwkJICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAorCQkgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCisJCSAgICAgKi8KKwkJICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7CisJCSAgICAKKwkJICAgIC8qKgorCQkgICAgICogKE9wdGlvbmFsKSBUaGUgb3B0aW9uYWwgZWxlbWVudCBpcyBhIGhpbnQgYXMgdG8gd2hldGhlciB0aGUgdmFsdWUKKwkJICAgICAqICBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgbWF5IGJlIG51bGwuIEl0IGlzIGRpc3JlZ2FyZGVkCisJCSAgICAgKiAgZm9yIHByaW1pdGl2ZSB0eXBlcywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgbm9uLW9wdGlvbmFsLgorCQkgICAgICovCisJCSAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOworCQl9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTpyZWFkLXRyYW5zZm9ybWVyIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTp3cml0ZS10cmFuc2Zvcm1lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCisgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7CisgICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgeworICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKKyAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCisgICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAorICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFURSIvPgorICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+CisgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgorICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1lcmF0ZWQiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnVtZXJhdGVkIHsKKyAgICAgICAgICBFbnVtVHlwZSB2YWx1ZSgpIGRlZmF1bHQgT1JESU5BTDsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06ZW51bS10eXBlIi8+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBFbnVtVHlwZSB7CisgICAgICAgICAgT1JESU5BTCwKKyAgICAgICAgICBTVFJJTkcKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1JESU5BTCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgeworICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7CisgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Y2hvaWNlPiAgICAgICAKKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDwveHNkOmNob2ljZT4gICAgICAgCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAorICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhc2NhZGUtdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIHB1YmxpYyBlbnVtIENhc2NhZGVUeXBlIHsgQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIfTsKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1hbGwiIHR5cGU9Im9ybTplbXB0eVR5cGUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9Im9ybTplbXB0eVR5cGUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9PbmUgeworICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7CisgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAorICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9NYW55IHsKKyAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisgICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7CisgICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmNob2ljZT4gICAgICAgCisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8L3hzZDpjaG9pY2U+ICAgICAgIAorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKKyAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLXRhYmxlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5UYWJsZSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEpvaW5Db2x1bW5bXSBpbnZlcnNlSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OworICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludmVyc2Utam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKKyAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisgICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7CisgICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKKyAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBHZW5lcmF0ZWRWYWx1ZSB7CisgICAgICAgICAgR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IEFVVE87CisgICAgICAgICAgU3RyaW5nIGdlbmVyYXRvcigpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06Z2VuZXJhdGlvbi10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJhdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXkgeworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7CisgICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7CisgICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUKKyAgICAgICAgICB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1N9OworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JWYWx1ZSB7CisgICAgICAgICAgU3RyaW5nIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgcHVibGljIGVudW0gRGlzY3JpbWluYXRvclR5cGUgeyBTVFJJTkcsIENIQVIsIElOVEVHRVIgfTsKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBUiIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdFUiIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW4geworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDb2x1bW4geworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiRFRZUEUiOworICAgICAgICAgIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKCkgZGVmYXVsdCBTVFJJTkc7CisgICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOworICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDMxOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgZW1iZWRkYWJsZSBvYmplY3RzLiBJcyAKKyAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKKyAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAorICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCisgICAgICAgIGluIHRoZSBjbGFzcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgCisgICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkYWJsZSB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIAorICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiAKKyAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCisgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYSBtYXBwZWQgc3VwZXJjbGFzcy4gSXMgCisgICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCisgICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKKyAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAorICAgICAgICBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCBiZSByZWN1cnNpdmVseSAKKyAgICAgICAgYXBwbGllZC4KKworICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwcGVkU3VwZXJjbGFzc3t9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDE7CisgICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlcXVlbmNlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLWdlbmVyYXRvciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlR2VuZXJhdG9yIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBwa0NvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBwa0NvbHVtblZhbHVlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwOworICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7CisgICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorICAKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJ0ZXIiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJ0ZXIgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCisgICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50CisgICAgICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyIGludGVyZmFjZS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDbGFzcyBjb252ZXJ0ZXJDbGFzcygpOyAKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorICAKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLWNvbnZlcnRlciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFR5cGVDb252ZXJ0ZXIgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQorICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiBUaGUKKyAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlIGZpZWxkIAorICAgICAgICAgICAqIG9yIHByb3BlcnR5LgorICAgICAgICAgICAqLworICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKKyAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgZmllbGQgCisgICAgICAgICAgICogb3IgcHJvcGVydHkuCisgICAgICAgICAgICovCisgICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorICAKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPYmplY3RUeXBlQ29udmVydGVyIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKKyAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiBUaGUKKyAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlCisgICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCisgICAgICAgICAgICovCisgICAgICAgICAgQ2xhc3MgZGF0YVR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBlbnRpdHkuIFRoZQorICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVudCAKKyAgICAgICAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDbGFzcyBvYmplY3RUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBjb252ZXJzaW9uIHZhbHVlcyB0byBiZSB1c2VkIAorICAgICAgICAgICAqIHdpdGggdGhlIG9iamVjdCBjb252ZXJ0ZXIuCisgICAgICAgICAgICovCisgICAgICAgICAgQ29udmVyc2lvblZhbHVlW10gY29udmVyc2lvblZhbHVlcygpOworCisgICAgICAgICAgIC8qKgorICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgYSBkZWZhdWx0IG9iamVjdCB2YWx1ZS4gVXNlZCBmb3IgCisgICAgICAgICAgICAqIGxlZ2FjeSBkYXRhIGlmIHRoZSBkYXRhIHZhbHVlIGlzIG1pc3NpbmcuCisgICAgICAgICAgICAqLworICAgICAgICAgICBTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVyc2lvbi12YWx1ZSIgdHlwZT0ib3JtOmNvbnZlcnNpb24tdmFsdWUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LW9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorICAKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJzaW9uVmFsdWUgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgZGF0YWJhc2UgdmFsdWUuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSgpOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBvYmplY3QgdmFsdWUuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIG9iamVjdFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisgIAorICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgIAorICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdHJ1Y3RDb252ZXJ0ZXIgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCisgICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgCisgICAgICAgICAgICogaW1wbGVtZW50IHRoZSBFY2xpcHNlTGluayBpbnRlcmZhY2UgCisgICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBTdHJpbmcgY29udmVydGVyKCk7IAorICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhIAorICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgb24gYW4gRW50aXR5LgorICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0aGF0IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAorICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgYmUgc3BlY2lmaWVkIAorICAgICAgICAgKiBhcyB0aGUgYXJndW1lbnQuCisgICAgICAgICAqIAorICAgICAgICAgKiBBIENvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4KKyAgICAgICAgICogCisgICAgICAgICAqIEZvciBpbnN0YW5jZToKKyAgICAgICAgICogQEVudGl0eQorICAgICAgICAgKiBAQ29weVBvbGljeSgiZXhhbXBsZS5NeUNvcHlQb2xpY3kiKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29weVBvbGljeSB7CisKKyAgICAgICAgLyoKKyAgICAgICAgKiAoUmVxdWlyZWQpCisgICAgICAgICogVGhpcyBkZWZpbmVzIHRoZSBjbGFzcyBvZiB0aGUgY29weSBwb2xpY3kuIEl0IG11c3Qgc3BlY2lmeSBhIGNsYXNzIAorICAgICAgICAqIHRoYXQgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kKKyAgICAgICAgKi8KKyAgICAgICAgQ2xhc3MgdmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgIAorICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAorICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkluc3RhbnRpYXRpb25Db3B5UG9saWN5IAorICAgICAgICAgKiBvbiBhbiBFbnRpdHkuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHRoZSBkZWZhdWx0IENvcHlQb2xpY3kgaW4gCisgICAgICAgICAqIEVjbGlwc2VMaW5rIGFuZCB0aGVyZWZvcmUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBvbmx5IHVzZWQgdG8gCisgICAgICAgICAqIG92ZXJyaWRlIG90aGVyIHR5cGVzIG9mIGNvcHkgcG9saWNpZXMKKyAgICAgICAgICogCisgICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5IG9yIAorICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLgorICAgICAgICAgKiAKKyAgICAgICAgICogRXhhbXBsZToKKyAgICAgICAgICogQEVudGl0eQorICAgICAgICAgKiBASW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbnN0YW50aWF0aW9uQ29weVBvbGljeSB7CisgICAgICAgIH0KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAvKioKKyAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYW4gCisgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ2xvbmVDb3B5UG9saWN5IG9uIGFuIAorICAgICAgICAgKiBFbnRpdHkuIEEgQ2xvbmVDb3B5UG9saWN5IG11c3Qgc3BlY2lmeSBhdCBvbmUgb3IgYm90aCBvZiB0aGUgIm1ldGhvZCIgCisgICAgICAgICAqIG9yICJ3b3JraW5nQ29weU1ldGhvZCIuICJ3b3JraW5nQ29weU1ldGhvZCIgaXMgdXNlZCB0byBjbG9uZSBvYmplY3RzIAorICAgICAgICAgKiB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIgYXMgdGhleSBhcmUgcmVnaXN0ZXJlZCBpbiAKKyAgICAgICAgICogRWNsaXBzZUxpbmsncyB0cmFuc2FjdGlvbmFsIG1lY2hhbmlzbSwgdGhlIFVuaXRPZldvcmsuICJtZXRob2QiIHdpbGwgCisgICAgICAgICAqIGJlIHVzZWQgZm9yIHRoZSBjbG9uZSB0aGF0IGlzIHVzZWQgZm9yIGNvbXBhcmlzb24gaW4gY29uanVuY3Rpb24gd2l0aCAKKyAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQorICAgICAgICAgKiAgCisgICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5IG9yIAorICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLgorICAgICAgICAgKiAKKyAgICAgICAgICogRXhhbXBsZToKKyAgICAgICAgICogQEVudGl0eQorICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KG1ldGhvZD0ibXlDbG9uZU1ldGhvZCIpCisgICAgICAgICAqIAorICAgICAgICAgKiBvcjoKKyAgICAgICAgICogCisgICAgICAgICAqIEBFbnRpdHkKKyAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiLCB3b3JraW5nQ29weU1ldGhvZD0ibXlXb3JraW5nQ29weUNsb25lTWV0aG9kIikKKyAgICAgICAgICogCisgICAgICAgICAqIG9yOgorICAgICAgICAgKiAKKyAgICAgICAgICBARW50aXR5CisgICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kod29ya2luZ0NvcHlNZXRob2ROYW1lPSJteVdvcmtpbmdDb3B5Q2xvbmUiKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2xvbmVDb3B5UG9saWN5IHsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiAoT3B0aW9uYWwpCisgICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkIHRoaXMgZGVmaW5lcyAKKyAgICAgICAgICAgICAqIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgd2lsbCBiZSB1c2VkIAorICAgICAgICAgICAgICogZm9yIGNvbXBhcmlzb24gYnkKKyAgICAgICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIChPcHRpb25hbCkKKyAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQKKyAgICAgICAgICAgICAqIHRoaXMgZGVmaW5lcyBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IAorICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgb2JqZWN0IHJldHVybmVkIHdoZW4gcmVnaXN0ZXJpbmcgYW4gCisgICAgICAgICAgICAgKiBPYmplY3QgaW4gYW4gRWNsaXBzZUxpbmsgVW5pdE9mV29yaworICAgICAgICAgICAgICovCisgICAgICAgICAgICBTdHJpbmcgd29ya2luZ0NvcHlNZXRob2QoKTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0id29ya2luZy1jb3B5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sbGVjdGlvbi10YWJsZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7CisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0YWJsZS4gSWYgaXQgaXMgbm90IAorICAgICAgICAgICAqIHNwZWNpZmllZCwgaXQgaXMgZGVmYXVsdGVkIHRvIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmc6IAorICAgICAgICAgICAqIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZW50aXR5OyAiXyIgOyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwIAorICAgICAgICAgICAqIHByb3BlcnR5IG9yIGZpZWxkIG9mIHRoZSBzb3VyY2UgZW50aXR5LgorICAgICAgICAgICAqLworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsgCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBjYXRhbG9nIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAorICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBjYXRhbG9nLgorICAgICAgICAgICAqLworICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsgCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBzY2hlbWEgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCisgICAgICAgICAgICogdW5pdCBkZWZhdWx0IHNjaGVtYS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsgCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSBhIHByaW1hcnkga2V5IGNvbHVtbiB0aGF0IGlzIHVzZWQgYXMgYSAKKyAgICAgICAgICAgKiBmb3JlaWduIGtleSB0byBqb2luIHRvIGFub3RoZXIgdGFibGUuIElmIHRoZSBzb3VyY2UgZW50aXR5IHVzZXMgYSAKKyAgICAgICAgICAgKiBjb21wb3NpdGUgcHJpbWFyeSBrZXksIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbXVzdCBiZSBzcGVjaWZpZWQgCisgICAgICAgICAgICogZm9yIGVhY2ggZmllbGQgb2YgdGhlIGNvbXBvc2l0ZSBwcmltYXJ5IGtleS4gSW4gYSBzaW5nbGUgcHJpbWFyeSAKKyAgICAgICAgICAgKiBrZXkgY2FzZSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtYXkgb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQuIAorICAgICAgICAgICAqIERlZmF1bHRpbmcgd2lsbCBhcHBseSBvdGhlcndpc2UgYXMgZm9sbG93czoKKyAgICAgICAgICAgKiBuYW1lLCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgCisgICAgICAgICAgICogb2YgdGhlIHNvdXJjZSBlbnRpdHkuIHJlZmVyZW5jZWRDb2x1bW5OYW1lLCB0aGUgc2FtZSBuYW1lIG9mIAorICAgICAgICAgICAqIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSBvZiB0aGUgc291cmNlIGVudGl0eS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHByaW1hcnlLZXlKb2luQ29sdW1ucygpIGRlZmF1bHQge307IAorIAorICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVW5pcXVlIGNvbnN0cmFpbnRzIHRoYXQgYXJlIHRvIGJlIHBsYWNlZCBvbiB0aGUgdGFibGUuIAorICAgICAgICAgICAqIFRoZXNlIGFyZSBvbmx5IHVzZWQgaWYgdGFibGUgZ2VuZXJhdGlvbiBpcyBpbiBlZmZlY3QuCisgICAgICAgICAgICovCisgICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsgCisgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorICAKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNDb2xsZWN0aW9uIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAorICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCisgICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAorICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAorICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKKyAgICAgICAgICAgKiBMQVpZLgorICAgICAgICAgICAqLworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsgCisgCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKKyAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgorICAgICAgICAgICAqLworICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTpjb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCisgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCisgICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKKyAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCisgICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCisgICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAorICAgICAgICAgICAqIExBWlkuCisgICAgICAgICAgICovCisgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKKyAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKKyAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfa2V5Ii4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCk7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIGtleSBjb252ZXJ0ZXIuIERlZmF1bHQgaXMgZXF1aXZhbGVudCB0byAKKyAgICAgICAgICAgKiBzcGVjaWZ5aW5nIEBDb252ZXJ0KCJub25lIiksIG1lYW5pbmcgbm8gY29udmVydGVyIHdpbGwgYmUgYWRkZWQgdG8gCisgICAgICAgICAgICogdGhlIGRpcmVjdCBtYXAga2V5LgorICAgICAgICAgICAqLworICAgICAgICAgIENvbnZlcnQga2V5Q29udmVydGVyKCkgZGVmYXVsdCBAQ29udmVydDsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKKyAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgorICAgICAgICAgICAqLworICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdmFsdWUgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCisgICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAorICAgICAgICAgICAqIHRoZSB2YWx1ZSBjb2x1bW4gbWFwcGluZy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDb252ZXJ0IHZhbHVlQ29udmVydGVyKCkgZGVmYXVsdCBAQ29udmVydDsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+ICAgIAorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+ICAgIAorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTpjb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCisgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqb2luLWZldGNoLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBKb2luRmV0Y2hUeXBlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCisgICAgICAgICAqIFRoaXMgZG9lcyBub3QgYWxsb3cgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgSU5ORVIsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCisgICAgICAgICAqIFRoaXMgYWxsb3dzIGZvciBudWxsL2VtcHR5IHZhbHVlcy4KKyAgICAgICAgICovCisgICAgICAgIE9VVEVSLAorICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5ORVIiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVEVSIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisgIAorICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgIAorICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIC8qKiAKKyAgICAgICAgICogQW4gb3B0aW1pc3RpYy1sb2NraW5nIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIAorICAgICAgICAgKiBvcHRpbWlzdGljIGxvY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIG9yIGRlbGV0aW5nIAorICAgICAgICAgKiBlbnRpdGllcy4gQW4gb3B0aW1pc3RpYy1sb2NraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uCisgICAgICAgICAqIGFuIGVudGl0eSBvciBtYXBwZWQtc3VwZXJjbGFzcy4KKyAgICAgICAgICogCisgICAgICAgICAqIEl0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgb3B0aW1pc3RpYy1sb2NraW5nLXR5cGUuCisgICAgICAgICAqLyAKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3B0aW1pc3RpY0xvY2tpbmcgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2Ygb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSB0byB1c2UuCisgICAgICAgICAgICovCisgICAgICAgICAgT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHR5cGUoKSBkZWZhdWx0IFZFUlNJT05fQ09MVU1OOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBGb3IgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBvZiB0eXBlIAorICAgICAgICAgICAqIFNFTEVDVEVEX0NPTFVNTlMsIHRoaXMgYW5ub3RhdGlvbiBtZW1iZXIgYmVjb21lcyBhIChSZXF1aXJlZCkgCisgICAgICAgICAgICogZmllbGQuCisgICAgICAgICAgICovCisgICAgICAgICAgQ29sdW1uW10gc2VsZWN0ZWRDb2x1bW5zKCkgZGVmYXVsdCB7fTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB3aGVyZSB0aGUgb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBzaG91bGQgCisgICAgICAgICAgICogY2FzY2FkZSBsb2NrLiBDdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgd2l0aCBWRVJTSU9OX0NPTFVNTiBsb2NraW5nLgorICAgICAgICAgICAqLworICAgICAgICAgIGJvb2xlYW4gY2FzY2FkZSgpIGRlZmF1bHQgZmFsc2U7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VsZWN0ZWQtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgIAorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmctdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhc2NhZGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIC8qKiAKKyAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKKyAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0CisgICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7CisgICAgICAgICAgLyoqCisgICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQorICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAorICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICAgICAgICovCisgICAgICAgICAgQUxMX0NPTFVNTlMsCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKKyAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KKyAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQorICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCisgICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KKyAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKKyAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAorCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCisgICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQorICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBWRVJTSU9OX0NPTFVNTgorICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAgIAorICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBUaGUgQ2FjaGUgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNldCBhbiAKKyAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuaW52YWxpZGF0aW9uLkNhY2hlSW52YWxpZGF0aW9uUG9saWN5IAorICAgICAgICAgKiB3aGljaCBzZXRzIG9iamVjdHMgaW4gRWNsaXBzZUxpbmsncyBpZGVudGl0eSBtYXBzIHRvIGJlIGludmFsaWQgCisgICAgICAgICAqIGZvbGxvd2luZyBnaXZlbiBydWxlcy4gQnkgZGVmYXVsdCBpbiBFY2xpcHNlTGluaywgb2JqZWN0cyBkbyBub3QgCisgICAgICAgICAqIGV4cGlyZSBpbiB0aGUgY2FjaGUuIFNldmVyYWwgZGlmZmVyZW50IHBvbGljaWVzIGFyZSBhdmFpbGFibGUgdG8gCisgICAgICAgICAqIGFsbG93IG9iamVjdHMgdG8gZXhwaXJlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZVR5cGUKKyAgICAgICAgICogCisgICAgICAgICAqIEEgQ2FjaGUgYW5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzLiAKKyAgICAgICAgICogSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ2FjaGUgYW5ub3RhdGlvbiBzaG91bGQgb25seSBiZSBkZWZpbmVkIAorICAgICAgICAgKiBvbiB0aGUgcm9vdCBvZiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorICAgICAgICAgKi8KKyAgICAgICAgQFRhcmdldCh7VFlQRX0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2FjaGUgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2FjaGUgdG8gdXNlLgorICAgICAgICAgICAqLyAKKyAgICAgICAgICBDYWNoZVR5cGUgdHlwZSgpIGRlZmF1bHQgU09GVF9XRUFLOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2l6ZSBvZiBjYWNoZSB0byB1c2UuCisgICAgICAgICAgICovIAorICAgICAgICAgIGludCBzaXplKCkgZGVmYXVsdCAxMDA7CisKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBDYWNoZWQgaW5zdGFuY2VzIGluIHRoZSBzaGFyZWQgY2FjaGUgb3IgYSBjbGllbnQgCisJICAgICAgICAgKiBpc29sYXRlZCBjYWNoZS4KKwkgICAgICAgICAqLyAKKwkgICAgICAgIGJvb2xlYW4gc2hhcmVkKCkgZGVmYXVsdCB0cnVlOworCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCisJICAgICAgICAgKiBRdWVyaWVzIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayAKKwkgICAgICAgICAqIHRvIHRoZSBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQorCSAgICAgICAgICovIAorCSAgICAgICAgaW50IGV4cGlyeSgpIGRlZmF1bHQgLTE7IC8vIG1pbnVzIG9uZSBpcyBubyBleHBpcnkuCisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIChPcHRpb25hbCkgRXhwaXJlIGNhY2hlZCBpbnN0YW5jZSBhIHNwZWNpZmljIHRpbWUgb2YgZGF5LiBRdWVyaWVzIAorCSAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKKwkgICAgICAgICAqIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5CisJICAgICAgICAgKi8gCisJICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7CisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIChPcHRpb25hbCkgRm9yY2UgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UgdG8gYWx3YXlzIAorCSAgICAgICAgICogcmVmcmVzaCB0aGUgY2FjaGUuCisJICAgICAgICAgKi8gCisJICAgICAgICBib29sZWFuIGFsd2F5c1JlZnJlc2goKSBkZWZhdWx0IGZhbHNlOworCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbGwgcXVlcmllcyB0aGF0IGdvIHRvIHRoZSBkYXRhYmFzZSwgcmVmcmVzaCB0aGUKKwkgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKKwkgICAgICAgICAqIG5ld2VyIHRoYW4gdGhlIGRhdGEgaW4gdGhlIGNhY2hlIChhcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcHRpbWlzdGljIAorCSAgICAgICAgICogbG9ja2luZyBmaWVsZCkKKwkgICAgICAgICAqLyAKKwkgICAgICAgIGJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyKCkgZGVmYXVsdCBmYWxzZTsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBTZXR0aW5nIHRvIHRydWUgd2lsbCBmb3JjZSBhbGwgcXVlcmllcyB0byBieXBhc3MgdGhlIAorCSAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKKwkgICAgICAgICAqIFRoaXMgZm9yY2VzIGFsbCBxdWVyaWVzIHRvIGhpdCB0aGUgZGF0YWJhc2UuCisJICAgICAgICAgKi8gCisJICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2FjaGUgY29vcmRpbmF0aW9uIG1vZGUuCisJICAgICAgICAgKi8gCisJICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKKwkgICAgICB9CisJCisJICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJICA8L3hzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpjaG9pY2U+CisJICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnkiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiLz4KKwkgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeS10aW1lLW9mLWRheSIgdHlwZT0ib3JtOnRpbWUtb2YtZGF5IiBtaW5PY2N1cnM9IjAiLz4KKwkgIDwveHNkOmNob2ljZT4KKwkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNpemUiIHR5cGU9InhzZDppbnRlZ2VyIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFyZWQiIHR5cGU9InhzZDpib29sZWFuIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2FjaGUtdHlwZSIvPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZyZXNoLW9ubHktaWYtbmV3ZXIiIHR5cGU9InhzZDpib29sZWFuIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb29yZGluYXRpb24tdHlwZSIgdHlwZT0ib3JtOmNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAKKworCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KKwkgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCQorCSAgICAgIC8qKiAKKyAgICAgICAgICogVGhlIENhY2hlVHlwZSBlbnVtIGlzIHVzZWQgd2l0aCB0aGUgQ2FjaGUgYW5ub3RhdGlvbiBmb3IgYSAKKyAgICAgICAgICogcGVyc2lzdGVudCBjbGFzcy4gSXQgZGVmaW5lcyB0aGUgdHlwZSBvZiBJZGVudGl0eU1hcC9DYWNoZSB1c2VkIGZvciAKKyAgICAgICAgICogdGhlIGNsYXNzLiBCeSBkZWZhdWx0IHRoZSBTT0ZUX1dFQUsgY2FjaGUgdHlwZSBpcyB1c2VkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKKyAgICAgICAgICovCisJICAgICAgcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogUHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LiBDYWNoZXMgYWxsIG9iamVjdHMKKwkgICAgICAgICAqIGFuZCBkb2VzIG5vdCByZW1vdmUgdGhlbS4gCisJICAgICAgICAgKiBXQVJOSU5HOiBUaGlzIG1ldGhvZCBtYXkgYmUgbWVtb3J5IGludGVuc2l2ZSB3aGVuIG1hbnkgb2JqZWN0cyBhcmUgCisJICAgICAgICAgKiByZWFkLgorCSAgICAgICAgICovCisJICAgICAgICBGVUxMLAorCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQorCSAgICAgICAgICogb2JqZWN0cyB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKKwkgICAgICAgICAqIGNvbGxlY3Rpb24gYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4KKwkgICAgICAgICAqLworCSAgICAgICAgV0VBSywKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKKwkgICAgICAgICAqIG9iamVjdHMgdXNpbmcgc29mdCByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCisJICAgICAgICAgKiBjb2xsZWN0aW9uIHdoZW4gbWVtb3J5IGlzIGxvdyBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZAorCSAgICAgICAgICogZ3VhcmFudGVlZCBpZGVudGl0eS4KKwkgICAgICAgICAqLworCSAgICAgICAgU09GVCwKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogU2ltaWxhciB0byB0aGUgV0VBSyBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgaXQgbWFpbnRhaW5zIGEKKwkgICAgICAgICAqIG1vc3QtZnJlcXVlbnRseS11c2VkIHN1Yi1jYWNoZS4gVGhlIHNpemUgb2YgdGhlIHN1Yi1jYWNoZSBpcworCSAgICAgICAgICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAgYXMgc3BlY2lmaWVkIGJ5CisJICAgICAgICAgKiBkZXNjcmlwdG9yJ3Mgc2V0SWRlbnRpdHlNYXBTaXplKCkgbWV0aG9kLiBUaGUgc3ViLWNhY2hlCisJICAgICAgICAgKiB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBvYmplY3RzIGFyZQorCSAgICAgICAgICogZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuCisJICAgICAgICAgKi8KKwkgICAgICAgIFNPRlRfV0VBSywKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogSWRlbnRpY2FsIHRvIHRoZSBzb2Z0IGNhY2hlIHdlYWsgKFNPRlRfV0VBSykgaWRlbnRpdHkgbWFwIGV4Y2VwdCAKKwkgICAgICAgICAqIHRoYXQgaXQgdXNlcyBoYXJkIHJlZmVyZW5jZXMgaW4gdGhlIHN1Yi1jYWNoZS4gVXNlIHRoaXMgaWRlbnRpdHkgCisJICAgICAgICAgKiBtYXAgaWYgc29mdCByZWZlcmVuY2VzIGRvIG5vdCBiZWhhdmUgcHJvcGVybHkgb24geW91ciBwbGF0Zm9ybS4KKwkgICAgICAgICAqLworCSAgICAgICAgSEFSRF9XRUFLLAorCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiBBIGNhY2hlIGlkZW50aXR5IG1hcCBtYWludGFpbnMgYSBmaXhlZCBudW1iZXIgb2Ygb2JqZWN0cworCSAgICAgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gT2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZQorCSAgICAgICAgICogb24gYSBsZWFzdC1yZWNlbnRseS11c2VkIGJhc2lzLiBUaGlzIG1ldGhvZCBhbGxvd3Mgb2JqZWN0CisJICAgICAgICAgKiBpZGVudGl0eSBmb3IgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBvYmplY3RzLgorCSAgICAgICAgICogV0FSTklORzogRnVybmlzaGVzIGNhY2hpbmcgYW5kIGlkZW50aXR5LCBidXQgZG9lcyBub3QgZ3VhcmFudGVlIAorCSAgICAgICAgICogaWRlbnRpdHkuCisJICAgICAgICAgKi8KKwkgICAgICAgIENBQ0hFLAorCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiBXQVJOSU5HOiBEb2VzIG5vdCBwcmVzZXJ2ZSBvYmplY3QgaWRlbnRpdHkgYW5kIGRvZXMgbm90IGNhY2hlIAorCSAgICAgICAgICogb2JqZWN0cy4KKwkgICAgICAgICAqLworCSAgICAgICAgTk9ORQorCSAgICAgIH0KKwkKKwkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgIDwveHNkOmFubm90YXRpb24+CisJICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisJICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZVTEwiLz4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VBSyIvPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUIi8+CisJICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlRfV0VBSyIvPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVJEX1dFQUsiLz4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FDSEUiLz4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgorCSAgPC94c2Q6cmVzdHJpY3Rpb24+CisJPC94c2Q6c2ltcGxlVHlwZT4KKworCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAorCisJPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIj4KKwkgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCQorCSAgICAgIC8qKiAKKyAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKKyAgICAgICAgICovIAorCSAgICAgIHB1YmxpYyBlbnVtIENhY2hlQ29vcmRpbmF0aW9uVHlwZSB7CisJICAgICAgICAvKioKKwkgICAgICAgICAqIFNlbmRzIGEgbGlzdCBvZiBjaGFuZ2VkIG9iamVjdHMgaW5jbHVkaW5nIGRhdGEgYWJvdXQgdGhlIGNoYW5nZXMuCisJICAgICAgICAgKiBUaGlzIGRhdGEgaXMgbWVyZ2VkIGludG8gdGhlIHJlY2VpdmluZyBjYWNoZS4KKwkgICAgICAgICAqLworCSAgICAgICAgU0VORF9PQkpFQ1RfQ0hBTkdFUywKKwkKKwkgICAgICAgICAvKioKKwkgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgdGhlIGlkZW50aXRpZXMgb2YgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGNoYW5nZWQuIAorCSAgICAgICAgICAqIFRoZSByZWNlaXZpbmcgY2FjaGUgaW52YWxpZGF0ZXMgdGhlIG9iamVjdHMgKHJhdGhlciB0aGFuIGNoYW5naW5nIAorCSAgICAgICAgICAqIGFueSBvZiB0aGUgZGF0YSkKKwkgICAgICAgICAgKi8KKwkgICAgICAgICBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKKwkKKwkgICAgICAgICAvKioKKwkgICAgICAgICAgKiBTYW1lIGFzIFNFTkRfT0JKRUNUX0NIQU5HRVMgZXhjZXB0IGl0IGFsc28gaW5jbHVkZXMgYW55IG5ld2x5CisJICAgICAgICAgICogY3JlYXRlZCBvYmplY3RzIGZyb20gdGhlIHRyYW5zYWN0aW9uLgorCSAgICAgICAgICAqLworCSAgICAgICAgIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAorCQorCSAgICAgICAgIC8qKgorCSAgICAgICAgICAqIERvZXMgbm8gY2FjaGUgY29vcmRpbmF0aW9uLgorCSAgICAgICAgICAqLworCSAgICAgICAgIE5PTkUKKyAgICAgICAgfQorCQorCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIvPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyIvPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+CisJICA8L3hzZDpyZXN0cmljdGlvbj4KKwk8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAorCisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lLW9mLWRheSI+CisJICA8eHNkOmFubm90YXRpb24+CisJICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkKKwkgICAgICBAVGFyZ2V0KHt9KQorCSAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKwkgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgeworCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIEhvdXIgb2YgdGhlIGRheS4KKwkgICAgICAgICAqLyAKKwkgICAgICAgIGludCBob3VyKCkgZGVmYXVsdCAwOworCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbnV0ZSBvZiB0aGUgZGF5LgorCSAgICAgICAgICovIAorCSAgICAgICAgaW50IG1pbnV0ZSgpIGRlZmF1bHQgMDsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBTZWNvbmQgb2YgdGhlIGRheS4KKwkgICAgICAgICAqLyAKKwkgICAgICAgIGludCBzZWNvbmQoKSBkZWZhdWx0IDA7CisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIChPcHRpb25hbCkgTWlsbGlzZWNvbmQgb2YgdGhlIGRheS4KKwkgICAgICAgICAqLyAKKwkgICAgICAgIGludCBtaWxsaXNlY29uZCgpIGRlZmF1bHQgMDsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogSW50ZXJuYWwgdXNlLiBEbyBub3QgbW9kaWZ5LgorCSAgICAgICAgICovIAorCSAgICAgICAgYm9vbGVhbiBzcGVjaWZpZWQoKSBkZWZhdWx0IHRydWU7CisJICAgICAgfQorCQorCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImhvdXIiIHR5cGU9InhzZDppbnRlZ2VyIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaW51dGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaWxsaXNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKyAgCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBUaGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIAorICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jaGFuZ2V0cmFja2luZy5PYmplY3RDaGFuZ2VQb2xpY3kgCisgICAgICAgICAqIHdoaWNoIGNvbXB1dGVzIGNoYW5nZXMgc2V0cyBmb3IgRWNsaXBzZUxpbmsncyBVbml0T2ZXb3JrIGNvbW1pdCAKKyAgICAgICAgICogcHJvY2Vzcy4gQW4gT2JqZWN0Q2hhbmdlUG9saWN5IGlzIHN0b3JlZCBvbiBhbiBFbnRpdHkncyBkZXNjcmlwdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBBIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gbWF5IGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHkgb3IgCisgICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MuCisgICAgICAgICAqLyAKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2hhbmdlVHJhY2tpbmcgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2hhbmdlIHRyYWNraW5nIHRvIHVzZS4KKyAgICAgICAgICAgKi8gCisgICAgICAgICAgQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKCkgZGVmYXVsdCBBVVRPOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nLXR5cGUiIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisgCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZy10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uIAorICAgICAgICAgKi8gCisgICAgICAgIHB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7CisgICAgICAgICAgLyoqCisgICAgICAgICAgICogQW4gQVRUUklCVVRFIGNoYW5nZSB0cmFja2luZyB0eXBlIGFsbG93cyBjaGFuZ2UgdHJhY2tpbmcgYXQgdGhlCisgICAgICAgICAgICogYXR0cmlidXRlIGxldmVsIG9mIGFuIG9iamVjdC4gT2JqZWN0cyB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyB3aWxsCisgICAgICAgICAgICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSAKKyAgICAgICAgICAgKiByZXN1bHRzIG9mIHRoZSBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBBVFRSSUJVVEUsCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBBbiBPQkpFQ1QgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBhbGxvd3MgYW4gb2JqZWN0IHRvIGNhbGN1bGF0ZSBmb3IgCisgICAgICAgICAgICogaXRzZWxmIHdoZXRoZXIgaXQgaGFzIGNoYW5nZWQuIENoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIHByb2Nlc3NlZCBpbiAKKyAgICAgICAgICAgKiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgCisgICAgICAgICAgICogY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICAgICAgICovCisgICAgICAgICAgT0JKRUNULAorCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogQSBERUZFUlJFRCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGRlZmVycyBhbGwgY2hhbmdlIGRldGVjdGlvbiB0bworICAgICAgICAgICAqIHRoZSBVbml0T2ZXb3JrJ3MgY2hhbmdlIGRldGVjdGlvbiBwcm9jZXNzLiBFc3NlbnRpYWxseSwgdGhlIAorICAgICAgICAgICAqIGNhbGN1bGF0ZUNoYW5nZXMoKSBtZXRob2Qgd2lsbCBydW4gZm9yIGFsbCBvYmplY3RzIGluIGEgVW5pdE9mV29yay4gCisgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBPYmplY3RDaGFuZ2VQb2xpY3kKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBERUZFUlJFRCwKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIFdpbGwgbm90IHNldCBhbnkgY2hhbmdlIHRyYWNraW5nIHBvbGljeS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBBVVRPCisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgIDwveHNkOmFubm90YXRpb24+CisJICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisJICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVFJJQlVURSIvPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPQkpFQ1QiLz4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVGRVJSRUQiLz4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgorCSAgPC94c2Q6cmVzdHJpY3Rpb24+CisJPC94c2Q6c2ltcGxlVHlwZT4KKyAgCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9taXplciI+CisJICA8eHNkOmFubm90YXRpb24+CisJICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkKKyAgICAgIC8qKiAKKyAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAorICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlc3Npb25zLmZhY3Rvcmllcy5EZXNjcmlwdG9yQ3VzdG9taXplciAKKyAgICAgICAqIGludGVyZmFjZSBhbmQgaXMgdG8gcnVuIGFnYWluc3QgYW4gZW5ldGl0eSdzIGNsYXNzIGRlc2NyaXB0b3IgYWZ0ZXIgYWxsIAorICAgICAgICogbWV0YWRhdGEgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQuCisgICAgICAgKgorICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MgCisgICAgICAgKiBvciBFbWJlZGRhYmxlIGNsYXNzLiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDdXN0b21pemVyIGlzIG5vdCAKKyAgICAgICAqIGluaGVyaXRlZCBmcm9tIGl0cyBwYXJlbnQgY2xhc3Nlcy4gCisgICAgICAgKi8gCisJICAgIEBUYXJnZXQoe1RZUEV9KQorCSAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisJICAgIHB1YmxpYyBAaW50ZXJmYWNlIEN1c3RvbWl6ZXIgeworCSAgICAgIC8qKgorCSAgICAgICAqIChSZXF1aXJlZCkgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciBjdXN0b21pemVyIGNsYXNzIHRoYXQgCisJICAgICAgICogc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHRoZSByZWxhdGVkIGVudGl0eSBvciBlbWJlZGRhYmxlIGNsYXNzLgorCSAgICAgICAqLworCSAgICAgIENsYXNzIHZhbHVlKCk7IAorCSAgICB9CisJCisJICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJICA8L3hzZDphbm5vdGF0aW9uPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKyAgCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIC8qKiAKKyAgICAgICAgICogQSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24gYWxsb3dzIHRoZSBkZWZpbml0aW9uIG9mIAorICAgICAgICAgKiBxdWVyaWVzIHRoYXQgY2FsbCBzdG9yZWQgcHJvY2VkdXJlcyBhcyBuYW1lZCBxdWVyaWVzLgorICAgICAgICAgCisgICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgorICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKKyAgICAgICAgICovIAorCSAgICAgIEBUYXJnZXQoe1RZUEV9KQorCSAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKwkgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKFJlcXVpcmVkKSBVbmlxdWUgbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhpcyBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgorCSAgICAgICAgICovCisJICAgICAgICBTdHJpbmcgbmFtZSgpOworCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIFF1ZXJ5IGhpbnRzLgorCSAgICAgICAgICovCisJICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307CisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIChPcHRpb25hbCkgUmVmZXJzIHRvIHRoZSBjbGFzcyBvZiB0aGUgcmVzdWx0LgorCSAgICAgICAgICovCisJICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgU1FMUmVzdWx0TWFwcGluZy4KKwkgICAgICAgICAqLworCSAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOworCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgorCSAgICAgICAgICovCisJICAgICAgICBTdHJpbmcgcHJvY2VkdXJlTmFtZSgpOworCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIHF1ZXJ5IHNob3VsZCByZXR1cm4gYSByZXN1bHQgc2V0LgorCSAgICAgICAgICovCisJICAgICAgICBib29sZWFuIHJldHVybnNSZXN1bHRTZXQoKSBkZWZhdWx0IHRydWU7IAorCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgYXJndW1lbnRzIHRvIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgorCSAgICAgICAgICovCisJICAgICAgICBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKKwkgICAgICB9CisJCisJICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJICA8L3hzZDphbm5vdGF0aW9uPgorCSAgICA8eHNkOnNlcXVlbmNlPgorCSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgbWluT2NjdXJzPSIwIiAKKwkgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJvcm06c3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiIAorCSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJICAgIDwveHNkOnNlcXVlbmNlPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KKwkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5zLXJlc3VsdC1zZXQiIHR5cGU9InhzZDpib29sZWFuIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisgIAorICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgIAorICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIj4KKwkgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCQorICAgICAgICAvKiogCisgICAgICAgICAqIEEgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24gaXMgdXNlZCB3aXRoaW4gYSAKKyAgICAgICAgICogTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uLiAKKyAgICAgICAgICovIAorCSAgICAgIEBUYXJnZXQoe30pCisJICAgICAgQFJldGVudGlvbihSVU5USU1FKQorCSAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciB7CisJICAgICAgICAvKioKKwkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIuCisJICAgICAgICAgKi8KKwkgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBkZWZhdWx0IElOOworCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIFN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyIG5hbWUuCisJICAgICAgICAgKi8KKwkgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgcXVlcnkgcGFyYW1ldGVyIG5hbWUuCisJICAgICAgICAgKi8KKwkgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcigpOworCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIEphdmEgY2xhc3MgZGVzaXJlZCBiYWNrIGZyb20gdGhlIHByb2NlZHVyZSwgCisJICAgICAgICAgKiB0aGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm9jZWR1cmUuCisJICAgICAgICAgKi8KKwkgICAgICAgIENsYXNzIHR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBjb2RlLCB0aGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCAKKwkgICAgICAgICAqIGZyb20gdGhlIHByb2NlZHVyZS4KKwkgICAgICAgICAqLworCSAgICAgICAgaW50IGpkYmNUeXBlKCkgZGVmYXVsdCAtMTsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIG5hbWUsIHRoaXMgbWF5IGJlIHJlcXVpcmVkIGZvciBBUlJBWSBvciAKKwkgICAgICAgICAqIFNUUlVDVCB0eXBlcy4KKwkgICAgICAgICAqLworCSAgICAgICAgU3RyaW5nIGpkYmNUeXBlTmFtZSgpIGRlZmF1bHQgIiI7CisJICAgICAgfQorCQorCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ib3JtOmRpcmVjdGlvbi10eXBlIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJxdWVyeS1wYXJhbWV0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKwkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KKwkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJCisJPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCQorCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXJlY3Rpb24tdHlwZSI+CisJICA8eHNkOmFubm90YXRpb24+CisJICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uLgorICAgICAgICAgKiBJdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSAKKyAgICAgICAgICogcGFyYW1ldGVycyBvZiBhIG5hbWVkIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCisgICAgICAgICAqLworCSAgICAgIHB1YmxpYyBlbnVtIERpcmVjdGlvbiB7CisJICAgICAgICAvKioKKwkgICAgICAgICAqIElucHV0IHBhcmFtZXRlcgorCSAgICAgICAgICovCisJICAgICAgICBJTiwKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogT3V0cHV0IHBhcmFtZXRlcgorCSAgICAgICAgICovCisJICAgICAgICBPVVQsCisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIElucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyCisJICAgICAgICAgKi8KKwkgICAgICAgIElOX09VVCwKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogT3V0cHV0IGN1cnNvcgorCSAgICAgICAgICovCisJICAgICAgICBPVVRfQ1VSU09SCisJICAgICAgfQorCQorCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUIi8+CisJICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOX09VVCIvPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRfQ1VSU09SIi8+CisJICA8L3hzZDpyZXN0cmljdGlvbj4KKwk8L3hzZDpzaW1wbGVUeXBlPgorCQorCTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKwkKKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJCQkvKiogCisJCQkJICogVmFyaWFibGUgb25lIHRvIG9uZSBtYXBwaW5ncyBhcmUgdXNlZCB0byByZXByZXNlbnQgYSBwb2ludGVyIAorCQkJCSAqIHJlZmVyZW5jZXMgYmV0d2VlbiBhIGphdmEgb2JqZWN0IGFuZCBhbiBpbXBsZW1lbnRlciBvZiBhbiBpbnRlcmZhY2UuIAorCQkJCSAqIFRoaXMgbWFwcGluZyBpcyB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHBvaW50ZXIgKHN0b3JlZCBpbiBhbiAKKwkJCQkgKiBpbnN0YW5jZSB2YXJpYWJsZSkgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2JqZWN0cy4gSW4gdGhlIAorCQkJCSAqIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGVzLCB0aGVzZSBtYXBwaW5ncyBhcmUgbm9ybWFsbHkgaW1wbGVtZW50ZWQgCisJCQkJICogdXNpbmcgYSBmb3JlaWduIGtleSBhbmQgYSB0eXBlIGNvZGUuCisJCQkJICogCisJCQkJICogQSBWYXJpYWJsZU9uZVRvT25lIGNhbiBiZSBzcGVjaWZpZWQgd2l0aGluIGFuIEVudGl0eSwgCisJCQkJICogTWFwcGVkU3VwZXJjbGFzcyBhbmQgRW1iZWRkYWJsZSBjbGFzcy4gCisJCQkJICovIAorCQkJCUBUYXJnZXQoe01FVEhPRCwgRklFTER9KSAKKwkJCQlAUmV0ZW50aW9uKFJVTlRJTUUpCisJCQkJcHVibGljIEBpbnRlcmZhY2UgVmFyaWFibGVPbmVUb09uZSB7CisJCQkJICAgIC8qKgorCQkJCSAgICAgKiAoT3B0aW9uYWwpIFRoZSBpbnRlcmZhY2UgY2xhc3MgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSAKKwkJCQkgICAgICogYXNzb2NpYXRpb24uIElmIG5vdCBzcGVjaWZpZWQgaXQgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIAorCQkJCSAgICAgKiBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuCisJCQkJICAgICAqLworCQkJCSAgICBDbGFzcyB0YXJnZXRJbnRlcmZhY2UoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisJCQkJICAgIAorCQkJCSAgICAvKioKKwkJCQkgICAgICogKE9wdGlvbmFsKSBUaGUgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgY2FzY2FkZWQgdG8gdGhlIHRhcmdldCBvZiAKKwkJCQkgICAgICogdGhlIGFzc29jaWF0aW9uLgorCQkJCSAgICAgKi8KKwkJCQkgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKKwkJCQkgICAgCisJCQkJICAgIC8qKgorCQkJCSAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAorCQkJCSAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAorCQkJCSAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAorCQkJCSAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKKwkJCQkgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCisJCQkJICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgorCQkJCSAgICAgKi8KKwkJCQkgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKKwkJCQkgICAgCisJCQkJICAgIC8qKgorCQkJCSAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIG9wdGlvbmFsLiBJZiBzZXQgdG8gZmFsc2UgCisJCQkJICAgICAqIHRoZW4gYSBub24tbnVsbCByZWxhdGlvbnNoaXAgbXVzdCBhbHdheXMgZXhpc3QuCisJCQkJICAgICAqLworCQkJCSAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOworCQkJCSAgCisJCQkJICAgIC8qKgorCQkJCSAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aWxsIGhvbGQgdGhlIHR5cGUgCisJCQkJICAgICAqIGluZGljYXRvcnMuIElmIHRoZSBEaXNjcmltaW5hdG9yQ29sdW1uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIAorCQkJCSAgICAgKiBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gZGVmYXVsdHMgdG8gIkRUWVBFIiBhbmQgdGhlIAorCQkJCSAgICAgKiBkaXNjcmltaW5hdG9yIHR5cGUgdG8gU1RSSU5HLgorCQkJCSAgICAgKi8KKwkJCQkgICAgRGlzY3JpbWluYXRvckNvbHVtbiBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCBARGlzY3JpbWluYXRvckNvbHVtbjsKKwkJCQkgICAgCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGxpc3Qgb2YgZGlzY3JpbWluYXRvciB0eXBlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggCisgICAgICAgICAgICAgKiB0aGlzIFZhcmlhYmxlT25lVG9PbmUuIElmIG5vbmUgYXJlIHNwZWNpZmllZCB0aGVuIHRob3NlIGVudGl0aWVzIAorICAgICAgICAgICAgICogd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHRoYXQgaW1wbGVtZW50IHRoZSB0YXJnZXQgaW50ZXJmYWNlIAorICAgICAgICAgICAgICogd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiB0eXBlcy4gVGhlIGRpc2NyaW1pbmF0b3IgdHlwZSB3aWxsIAorICAgICAgICAgICAgICogZGVmYXVsdCBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIFNUUklORzogRW50aXR5Lm5hbWUoKQorICAgICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIENIQVI6IEZpcnN0IGxldHRlciBvZiB0aGUgCisgICAgICAgICAgICAgKiAgICBFbnRpdHkgY2xhc3MKKyAgICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBJTlRFR0VSOiBUaGUgbmV4dCBpbnRlZ2VyIGFmdGVyIAorICAgICAgICAgICAgICogICAgdGhlIGhpZ2hlc3QgaW50ZWdlciBleHBsaWNpdGx5IGFkZGVkLgorICAgICAgICAgICAgICovCisJCQkJICAgIERpc2NyaW1pbmF0b3JDbGFzc1tdIGRpc2NyaW1pbmF0b3JDbGFzc2VzKCkgZGVmYXVsdCB7fTsKKwkJCQl9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY2xhc3MiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIKKyAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKKyAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWludGVyZmFjZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBBIERpc2NyaW1pbmF0b3JDbGFzcyBpcyB1c2VkIHdpdGhpbiBhIFZhcmlhYmxlT25lVG9PbmUgYW5ub3RhdGlvbi4KKyAgICAgICAgICovIAorICAgICAgICBAVGFyZ2V0KHt9KSAKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ2xhc3MgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRpc2NyaW1pbmF0b3IgdG8gYmUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3IoKTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNsYXNzIHRvIHRoZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCisgICAgICAgICAgICogZGlzY3JpbWluYXRvci4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDbGFzcyB2YWx1ZSgpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKwk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXR5cGUiPgorCSAgPHhzZDphbm5vdGF0aW9uPgorCSAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJICAgICAgICAvKioKKyAgICAgICAgICAgKiBUaGUgRXhpc3RlbmNlQ2hlY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCisgICAgICAgICAgICogY2hlY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIGVudGl0aWVzLgorICAgICAgICAgICAqIAorICAgICAgICAgICAqIEFuIGV4aXN0ZW5jZS1jaGVja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbiBhbiBFbnRpdHkgb3IgCisgICAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbm5vdGF0aW9uLgorICAgICAgICAgICAqLworICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEV4aXN0ZW5jZUNoZWNraW5nIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogKE9wdGlvbmFsKSBTZXQgdGhlIGV4aXN0ZW5jZSBjaGVjayBmb3IgZGV0ZXJtaW5pbmcKKyAgICAgICAgICAgICAqIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICBFeGlzdGVuY2VUeXBlIHZhbHVlKCkgZGVmYXVsdCBDSEVDS19DQUNIRTsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIGFuZCAKKyAgICAgICAgICAgKiBpdCBpcyBpbiB0aGUgY2FjaGUsIHRoZW4gaXQgbXVzdCBleGlzdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDSEVDS19DQUNIRSwKKwkJCQorICAgICAgICAgIC8qKgorICAgICAgICAgICAqIFBlcmZvcm0gZG9lcyBleGlzdCBjaGVjayBvbiB0aGUgZGF0YWJhc2UuCisgICAgICAgICAgICovCisgICAgICAgICAgQ0hFQ0tfREFUQUJBU0UsCisJCQkKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgdGhlbiAKKyAgICAgICAgICAgKiBpdCBtdXN0IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIAorICAgICAgICAgICAqIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBBU1NVTUVfRVhJU1RFTkNFLAorCQkJCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogQXNzdW1lIHRoYXQgdGhlIG9iamVjdCBkb2VzIG5vdCBleGlzdC4gVGhpcyBtYXkgYmUgdXNlZCBpZiB0aGUgCisgICAgICAgICAgICogYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suICAKKyAgICAgICAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIGZvcmNlIGFuIGluc2VydCB0byBiZSBjYWxsZWQuCisgICAgICAgICAgICovCisgICAgICAgICAgQVNTVU1FX05PTl9FWElTVEVOQ0UKKwkJCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CSAKKwkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfQ0FDSEUiIC8+CisJICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0RBVEFCQVNFIiAvPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1NVTUVfRVhJU1RFTkNFIiAvPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1NVTUVfTk9OX0VYSVNURU5DRSIvPgorCSAgPC94c2Q6cmVzdHJpY3Rpb24+CisJPC94c2Q6c2ltcGxlVHlwZT4JCisJCis8L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzEueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDNmZjE3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZApAQCAtMCwwICsxLDMyNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIEphdmEgUGVyc2lzdGVuY2UgQVBJIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZSBzY2hlbWEgLS0+Cis8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAorICB4bWxuczpvcm09Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAorICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKKyAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAorICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAorICB2ZXJzaW9uPSIxLjEiPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICBAKCMpZWNsaXBzZWxpbmtfb3JtXzFfMS54c2QgMS4xICBGZWJydWFyeSA0IDIwMDkKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorICA8eHNkOmFubm90YXRpb24+CisgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKKworICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBuZXcgbmF0aXZlIEVjbGlwc2VMaW5rIFhNTCBtZXRhZGF0YQorICAgICAgIGZvcm1hdCB1c2VkIGZvciBKUEEgYW5kIG5hdGl2ZSBkZXBsb3ltZW50IHhtbCBmaWxlcy4gCisKKyAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5VHlwZSIvPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ2ZXJzaW9uVHlwZSI+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XSsoXC5bMC05XSspKiIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LW1hcHBpbmdzIj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgVGhlIGVudGl0eS1tYXBwaW5ncyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYW4gbWFwcGluZworICAgICAgICBmaWxlLiBJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGZvdXIgdHlwZXMgb2YgZWxlbWVudHM6CisKKyAgICAgICAgMS4gVGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBjb250YWlucyBtZXRhZGF0YQorICAgICAgICBmb3IgdGhlIGVudGlyZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgaWYgdGhpcyBlbGVtZW50CisgICAgICAgIG9jY3VycyBpbiBtdWx0aXBsZSBtYXBwaW5nIGZpbGVzIHdpdGhpbiB0aGUgc2FtZSBwZXJzaXN0ZW5jZSB1bml0LgorICAgICAgICAKKyAgICAgICAgMi4gVGhlIHBhY2thZ2UsIHNjaGVtYSwgY2F0YWxvZyBhbmQgYWNjZXNzIGVsZW1lbnRzIGFwcGx5IHRvIGFsbCBvZgorICAgICAgICB0aGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBkZWZpbmVkIGluCisgICAgICAgIHRoZSBzYW1lIGZpbGUgaW4gd2hpY2ggdGhleSBvY2N1ci4KKworICAgICAgICAzLiBUaGUgc2VxdWVuY2UtZ2VuZXJhdG9yLCB0YWJsZS1nZW5lcmF0b3IsIG5hbWVkLXF1ZXJ5LAorICAgICAgICBuYW1lZC1uYXRpdmUtcXVlcnkgYW5kIHNxbC1yZXN1bHQtc2V0LW1hcHBpbmcgZWxlbWVudHMgYXJlIGdsb2JhbAorICAgICAgICB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZQorICAgICAgICBzZXF1ZW5jZS1nZW5lcmF0b3Igb3IgdGFibGUtZ2VuZXJhdG9yIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUKKyAgICAgICAgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyBhbHNvIAorICAgICAgICB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIG5hbWVkLXF1ZXJ5IG9yIG5hbWVkLW5hdGl2ZS1xdWVyeQorICAgICAgICBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgCisgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQuCisKKyAgICAgICAgNC4gVGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZWFjaCBkZWZpbmUKKyAgICAgICAgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgbWFuYWdlZCBwZXJzaXN0ZW50IGNsYXNzLiBUaGUgbWFwcGluZworICAgICAgICBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlc2UgZWxlbWVudHMgbWF5IGJlIGNvbXBsZXRlIG9yIGl0IG1heQorICAgICAgICBiZSBwYXJ0aWFsLgorCisgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiAKKyAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCisgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyIgdHlwZT0ib3JtOm1hcHBlZC1zdXBlcmNsYXNzIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eSIgdHlwZT0ib3JtOmVudGl0eSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRhYmxlIiB0eXBlPSJvcm06ZW1iZWRkYWJsZSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uVHlwZSIgCisgICAgICAgICAgICAgICAgICAgICBmaXhlZD0iMS4xIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCisgICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKKworICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQgdGhlbiAKKyAgICAgICAgdGhlIGNvbXBsZXRlIHNldCBvZiBtYXBwaW5nIG1ldGFkYXRhIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdCAKKyAgICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBYTUwgbWFwcGluZyBmaWxlcyBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgCisgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBUaGVzZSBkZWZhdWx0cyBhcmUgYXBwbGllZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhcyBhIHdob2xlIAorICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTCAKKyAgICAgICAgZWxlbWVudCBzZXR0aW5ncy4gCisgICAgICAgIAorICAgICAgICBzY2hlbWEgLSBVc2VkIGFzIHRoZSBzY2hlbWEgZm9yIGFsbCB0YWJsZXMgb3Igc2Vjb25kYXJ5IHRhYmxlcworICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAorICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcyBvciBzZWNvbmRhcnkgdGFibGVzCisgICAgICAgICAgICB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0CisgICAgICAgIGFjY2VzcyAtIFVzZWQgYXMgdGhlIGFjY2VzcyB0eXBlIGZvciBhbGwgbWFuYWdlZCBjbGFzc2VzIGluCisgICAgICAgICAgICB0aGUgcGVyc2lzdGVuY2UgdW5pdAorICAgICAgICBjYXNjYWRlLXBlcnNpc3QgLSBBZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucworICAgICAgICAgICAgaW4gZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQKKyAgICAgICAgZW50aXR5LWxpc3RlbmVycyAtIExpc3Qgb2YgZGVmYXVsdCBlbnRpdHkgbGlzdGVuZXJzIHRvIGJlIGludm9rZWQgCisgICAgICAgICAgICBvbiBlYWNoIGVudGl0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhbiBlbnRpdHkuIElzIGFsbG93ZWQgdG8gYmUKKyAgICAgICAgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGFubm90YXRpb25zLgorICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIAorICAgICAgICBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIG9uIHRoZSBlbnRpdHkgY2xhc3MgKGFuZCBpdHMgZmllbGRzCisgICAgICAgIG9yIHByb3BlcnRpZXMpIGFyZSB0byBiZSBwcm9jZXNzZWQuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiAKKyAgICAgICAgdGhlIGRlZmF1bHRpbmcgcnVsZXMgZm9yIHRoZSBlbnRpdHkgYW5kIGl0cyBzdWJlbGVtZW50cyB3aWxsIAorICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgorCisgICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ib3JtOnRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWNvbmRhcnktdGFibGUiIHR5cGU9Im9ybTpzZWNvbmRhcnktdGFibGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCisgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXkiIHR5cGU9Im9ybTpwcmltYXJ5LWtleSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9Im9ybTppbmhlcml0YW5jZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdmFsdWUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiAKKyAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAorICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZXMiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIGVudGl0eSBmaWVsZCBvciBwcm9wZXJ0eSBtYXBwaW5ncy4KKyAgICAgICAgSXQgbWF5IGJlIHNwYXJzZWx5IHBvcHVsYXRlZCB0byBpbmNsdWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlCisgICAgICAgIGZpZWxkcyBvciBwcm9wZXJ0aWVzLiBJZiBtZXRhZGF0YS1jb21wbGV0ZSBmb3IgdGhlIGVudGl0eSBpcyB0cnVlCisgICAgICAgIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGRlZmF1bHRlZCBhY2NvcmRpbmcKKyAgICAgICAgdG8gdGhlIGRlZmF1bHQgcnVsZXMuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ib3JtOmlkIiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmJhc2ljLWNvbGxlY3Rpb24iCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLW1hcCIgdHlwZT0ib3JtOmJhc2ljLW1hcCIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb24iCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tb25lIiB0eXBlPSJvcm06bWFueS10by1vbmUiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1tYW55IiB0eXBlPSJvcm06b25lLXRvLW1hbnkiCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1vbmUiIHR5cGU9Im9ybTpvbmUtdG8tb25lIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIiB0eXBlPSJvcm06dmFyaWFibGUtb25lLXRvLW9uZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtYXRpb24iIHR5cGU9Im9ybTp0cmFuc2Zvcm1hdGlvbiIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IiB0eXBlPSJvcm06dHJhbnNpZW50IgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJhY2Nlc3MtdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIFRoaXMgZWxlbWVudCBkZXRlcm1pbmVzIGhvdyB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgYWNjZXNzZXMgdGhlCisgICAgICAgIHN0YXRlIG9mIGFuIGVudGl0eSBvciBlbWJlZGRlZCBvYmplY3QuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9QRVJUWSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5TGlzdGVuZXJzIHsKKyAgICAgICAgICBDbGFzc1tdIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVyIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVyIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cworICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXJlbW92ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUmVtb3ZlIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXJlbW92ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFJlbW92ZSB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXVwZGF0ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlVXBkYXRlIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXVwZGF0ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFVwZGF0ZSB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1sb2FkIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0TG9hZCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBBIHVzZXIgZGVmaW5lZCBtYXBwaW5nJ3MgcHJvcGVydHkuCisJCUBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQorCQlAUmV0ZW50aW9uKFJVTlRJTUUpCisJCXB1YmxpYyBAaW50ZXJmYWNlIFByb3BlcnR5IHsKKwkJCS8qKgorCQkJKiBQcm9wZXJ0eSBuYW1lLgorCQkJKi8gCisJCQlTdHJpbmcgbmFtZSgpOworCQkJCisJCQkvKioKKwkJCSogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIFByb3BlcnR5IHZhbHVlLAorCQkJKiBjb252ZXJ0ZWQgdG8gYW4gaW5zdGFuY2Ugb2YgdmFsdWVUeXBlLgorCQkJKi8gCisJCQlTdHJpbmcgdmFsdWUoKTsKKwkJCQorCQkJLyoqCisJCQkqIFByb3BlcnR5IHZhbHVlIHR5cGUuCisJCQkqIFRoZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gdmFsdWVUeXBlIGJ5IENvbnZlcnNpb25NYW5hZ2VyLgorCQkJKiBJZiBzcGVjaWZpZWQgbXVzdCBiZSBhIHNpbXBsZSB0eXBlIHRoYXQgY291bGQgYmUgaGFuZGxlZCBieSAKKwkJCSogQ29udmVyc2lvbk1hbmFnZXI6IAorCQkJKiBudW1lcmljYWwsIGJvb2xlYW4sIHRlbXBvcmFsLiAgCisJCQkqLyAKKwkJCUNsYXNzIHZhbHVlVHlwZSgpIGRlZmF1bHQgU3RyaW5nLmNsYXNzOworCQl9CisJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAKKyAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1oaW50Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKSAKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUXVlcnlIaW50IHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtcXVlcnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFF1ZXJ5IHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyBxdWVyeSgpOworICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZE5hdGl2ZVF1ZXJ5IHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyBxdWVyeSgpOworICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7IC8vbmFtZWQgU3FsUmVzdWx0U2V0TWFwcGluZworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTcWxSZXN1bHRTZXRNYXBwaW5nIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIEVudGl0eVJlc3VsdFtdIGVudGl0aWVzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBDb2x1bW5SZXN1bHRbXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktcmVzdWx0IiB0eXBlPSJvcm06ZW50aXR5LXJlc3VsdCIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1yZXN1bHQiIHR5cGU9Im9ybTpjb2x1bW4tcmVzdWx0IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktcmVzdWx0Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlSZXN1bHQgeworICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzKCk7CisgICAgICAgICAgRmllbGRSZXN1bHRbXSBmaWVsZHMoKSBkZWZhdWx0IHt9OworICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1yZXN1bHQiIHR5cGU9Im9ybTpmaWVsZC1yZXN1bHQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJlbnRpdHktY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1yZXN1bHQiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZpZWxkUmVzdWx0IHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyBjb2x1bW4oKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWNvbmRhcnktdGFibGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OworICAgICAgICAgfQorCisgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAorICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFVuaXF1ZUNvbnN0cmFpbnQgeworICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIAorICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtbiB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKKyAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7CisgICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KKyAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi1jb2x1bW4iPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luQ29sdW1uIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7CisgICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY2Nlc3MtbWV0aG9kcyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXR0cmlidXRlT3ZlcnJpZGUgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgQ29sdW1uIGNvbHVtbigpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCisgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkLWNsYXNzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWRDbGFzcyB7CisgICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZC1pZCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkSWQge30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zaWVudCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zaWVudCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmVyc2lvbiB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIC8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7CisgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKKyAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCQkvKioKKwkJICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgorCQkgKiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIAorCQkgKiBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIAorCQkgKiB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgorCQkgKiAgCisJCSAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCisJCSAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAorCQkgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAorCQkgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKKwkJICogV3JpdGVUcmFuc2Zvcm1lcikuIAorCQkgKi8gCisJCUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQorCQlAUmV0ZW50aW9uKFJVTlRJTUUpCisJCXB1YmxpYyBAaW50ZXJmYWNlIFJlYWRUcmFuc2Zvcm1lciB7CisJCSAgICAvKioKKwkJICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKKwkJICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5BdHRyaWJ1dGVUcmFuc2Zvcm1lciAKKwkJICAgICAqIGludGVyZmFjZS4gVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkLCBpdHMgCisJCSAgICAgKiBidWlsZEF0dHJpYnV0ZVZhbHVlIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZhbHVlIHRvIGJlIAorCQkgICAgICogYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZS4KKwkJICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgorCQkgICAgICovIAorCQkgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKKwkJCisJCSAgICAvKioKKwkJICAgICAqIFRoZSBtYXBwZWQgY2xhc3MgbXVzdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIHdoaWNoIHJldHVybnMgCisJCSAgICAgKiBhIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUgKG5vdCBhc3NpZ25zIHRoZSB2YWx1ZSB0byAKKwkJICAgICAqIHRoZSBhdHRyaWJ1dGUpLiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSAKKwkJICAgICAqIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgorCQkgICAgICovIAorCQkgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7CisJCX0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCQkvKioKKwkJICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgorCQkgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAorCQkgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKKwkJICogV3JpdGVUcmFuc2Zvcm1lcikuCisJCSAqICAKKwkJICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCisJCSAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKKwkJICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKKwkJICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAorCQkgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKKwkJICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCisJCSAqLyAKKwkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCisJCUBSZXRlbnRpb24oUlVOVElNRSkKKwkJcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7CisJCSAgICAvKioKKwkJICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKKwkJICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAorCQkgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCisJCSAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAorCQkgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCisJCSAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKKwkJICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKKwkJICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgorCQkgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KKwkJICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgorCQkgICAgICovIAorCQkgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKKwkJCisJCSAgICAvKioKKwkJICAgICAqIFRoZSBtYXBwZWQgY2xhc3MgbXVzdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIHdoaWNoIHJldHVybnMgCisJCSAgICAgKiBhIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgZGF0YWJhc2UgY29sdW1uLgorCQkgICAgICogTm90ZSB0aGF0IGZvciBkZGwgZ2VuZXJhdGlvbiBhbmQgcmV0dXJuaW5nIHRvIGJlIHN1cHBvcnRlZCB0aGUgCisJCSAgICAgKiBtZXRob2Qgc2hvdWxkIGJlIGRlZmluZWQgdG8gcmV0dXJuIGEgcGFydGljdWxhciB0eXBlLCBub3QganVzdCAKKwkJICAgICAqIE9iamVjdCwgZm9yIGluc3RhbmNlOgorCQkgICAgICogcHVibGljIFRpbWUgZ2V0U3RhcnRUaW1lKCkuCisJCSAgICAgKiBUaGUgbWV0aG9kIG1heSByZXF1aXJlIGEgVHJhbnNpZW50IGFubm90YXRpb24gdG8gYXZvaWQgYmVpbmcgCisJCSAgICAgKiBtYXBwZWQgYXMgQmFzaWMgYnkgZGVmYXVsdC4KKwkJICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgorCQkgICAgICovIAorCQkgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7CisJCQorCQkgICAgLyoqCisJCSAgICAgKiBTcGVjaWZ5IGhlcmUgdGhlIGNvbHVtbiBpbnRvIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbi4KKwkJICAgICAqIFRoZSBvbmx5IGNhc2Ugd2hlbiB0aGlzIGNvdWxkIGJlIHNraXBwZWQgaXMgaWYgYSBzaW5nbGUgCisJCSAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRlcyBhbiBhdHRyaWJ1dGUgLSB0aGUgYXR0cmlidXRlJ3MgbmFtZSAKKwkJICAgICAqIHdpbGwgYmUgdXNlZCBhcyBhIGNvbHVtbiBuYW1lLgorCQkgICAgICovIAorCQkgICAgQ29sdW1uIGNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKKwkJfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWF0aW9uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkJLyoqCisJCSAqIFRyYW5zZm9ybWF0aW9uIGlzIGFuIG9wdGlvbmFsIGFubm90YXRpb24gZm9yIAorCQkgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCisJCSAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBhbGxvd3MgdG8gbWFwIGFuIGF0dHJpYnV0ZSB0byBvbmUgb3IgbW9yZSAKKwkJICogZGF0YWJhc2UgY29sdW1ucy4KKwkJICogCisJCSAqIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24gaXMgYW4gb3B0aW9uYWwgcGFydCBvZiAKKwkJICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGRlZmluaXRpb24uIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIAorCQkgKiB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyAKKwkJICogdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCisJCSAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCisJCSAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAorCQkgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAorCQkgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKKwkJICogV3JpdGVUcmFuc2Zvcm1lcikuIAorCQkgKi8gCisJCUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQorCQlAUmV0ZW50aW9uKFJVTlRJTUUpCisJCXB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zZm9ybWF0aW9uIHsKKwkJICAgIC8qKgorCQkgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKKwkJICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCisJCSAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAorCQkgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCisJCSAgICAgKiBoaW50IHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCAKKwkJICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgorCQkgICAgICovCisJCSAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOworCQkgICAgCisJCSAgICAvKioKKwkJICAgICAqIChPcHRpb25hbCkgVGhlIG9wdGlvbmFsIGVsZW1lbnQgaXMgYSBoaW50IGFzIHRvIHdoZXRoZXIgdGhlIHZhbHVlCisJCSAgICAgKiAgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IG1heSBiZSBudWxsLiBJdCBpcyBkaXNyZWdhcmRlZAorCQkgICAgICogIGZvciBwcmltaXRpdmUgdHlwZXMsIHdoaWNoIGFyZSBjb25zaWRlcmVkIG5vbi1vcHRpb25hbC4KKwkJICAgICAqLworCQkgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKKwkJfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06cmVhZC10cmFuc2Zvcm1lciIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06d3JpdGUtdHJhbnNmb3JtZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmZXRjaC10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgcHVibGljIGVudW0gRmV0Y2hUeXBlIHsgTEFaWSwgRUFHRVIgfTsKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBWlkiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBR0VSIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9iIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTG9iIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRlbXBvcmFsIHsKKyAgICAgICAgICBUZW1wb3JhbFR5cGUgdmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06dGVtcG9yYWwtdHlwZSIvPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwtdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIHB1YmxpYyBlbnVtIFRlbXBvcmFsVHlwZSB7CisgICAgICAgICAgREFURSwgLy8gamF2YS5zcWwuRGF0ZQorICAgICAgICAgIFRJTUUsIC8vIGphdmEuc3FsLlRpbWUKKyAgICAgICAgICBUSU1FU1RBTVAgLy8gamF2YS5zcWwuVGltZXN0YW1wCisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQVRFIi8+CisgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUUiLz4KKyAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRVNUQU1QIi8+CisgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bWVyYXRlZCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudW1lcmF0ZWQgeworICAgICAgICAgIEVudW1UeXBlIHZhbHVlKCkgZGVmYXVsdCBPUkRJTkFMOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTplbnVtLXR5cGUiLz4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0tdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKKyAgICAgICAgICBPUkRJTkFMLAorICAgICAgICAgIFNUUklORworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRJTkFMIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW9uZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb09uZSB7CisgICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOworICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307CisgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKKyAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpjaG9pY2U+ICAgICAgIAorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPC94c2Q6Y2hvaWNlPiAgICAgICAKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCisgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYXNjYWRlLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBDYXNjYWRlVHlwZSB7IEFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSH07CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtYWxsIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvT25lIHsKKyAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisgICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOworICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb01hbnkgeworICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKKyAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6Y2hvaWNlPiAgICAgICAKKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDwveHNkOmNob2ljZT4gICAgICAgCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAorICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi10YWJsZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgeworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvTWFueSB7CisgICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOworICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307CisgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOworICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyYXRlZC12YWx1ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlIHsKKyAgICAgICAgICBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgQVVUTzsKKyAgICAgICAgICBTdHJpbmcgZ2VuZXJhdG9yKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTpnZW5lcmF0aW9uLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmF0b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3JkZXItYnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcmRlckJ5IHsKKyAgICAgICAgICBTdHJpbmcgdmFsdWUoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmhlcml0YW5jZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEluaGVyaXRhbmNlIHsKKyAgICAgICAgICBJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IFNJTkdMRV9UQUJMRTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTppbmhlcml0YW5jZS10eXBlIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iaW5oZXJpdGFuY2UtdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIHB1YmxpYyBlbnVtIEluaGVyaXRhbmNlVHlwZQorICAgICAgICAgIHsgU0lOR0xFX1RBQkxFLCBKT0lORUQsIFRBQkxFX1BFUl9DTEFTU307CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSU5HTEVfVEFCTEUiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU5FRCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEVfUEVSX0NMQVNTIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvclZhbHVlIHsKKyAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7IFNUUklORywgQ0hBUiwgSU5URUdFUiB9OworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFSIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR0VSIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbiB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJEVFlQRSI7CisgICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsKKyAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7CisgICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRhYmxlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBlbWJlZGRhYmxlIG9iamVjdHMuIElzIAorICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAorICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCisgICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKKyAgICAgICAgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCAKKyAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRhYmxlIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgCisgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIAorICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYSBtYXBwZWQgc3VwZXJjbGFzcy4gSXMgCisgICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCisgICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKKyAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAorICAgICAgICBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCBiZSByZWN1cnNpdmVseSAKKyAgICAgICAgYXBwbGllZC4KKworICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwcGVkU3VwZXJjbGFzc3t9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiAKKyAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDE7CisgICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlcXVlbmNlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLWdlbmVyYXRvciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlR2VuZXJhdG9yIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBwa0NvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBwa0NvbHVtblZhbHVlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwOworICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7CisgICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorICAKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJ0ZXIiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJ0ZXIgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCisgICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50CisgICAgICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyIGludGVyZmFjZS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDbGFzcyBjb252ZXJ0ZXJDbGFzcygpOyAKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorICAKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLWNvbnZlcnRlciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFR5cGVDb252ZXJ0ZXIgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQorICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiBUaGUKKyAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlIGZpZWxkIAorICAgICAgICAgICAqIG9yIHByb3BlcnR5LgorICAgICAgICAgICAqLworICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKKyAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgZmllbGQgCisgICAgICAgICAgICogb3IgcHJvcGVydHkuCisgICAgICAgICAgICovCisgICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorICAKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPYmplY3RUeXBlQ29udmVydGVyIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKKyAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiBUaGUKKyAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlCisgICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCisgICAgICAgICAgICovCisgICAgICAgICAgQ2xhc3MgZGF0YVR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBlbnRpdHkuIFRoZQorICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVudCAKKyAgICAgICAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDbGFzcyBvYmplY3RUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBjb252ZXJzaW9uIHZhbHVlcyB0byBiZSB1c2VkIAorICAgICAgICAgICAqIHdpdGggdGhlIG9iamVjdCBjb252ZXJ0ZXIuCisgICAgICAgICAgICovCisgICAgICAgICAgQ29udmVyc2lvblZhbHVlW10gY29udmVyc2lvblZhbHVlcygpOworCisgICAgICAgICAgIC8qKgorICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgYSBkZWZhdWx0IG9iamVjdCB2YWx1ZS4gVXNlZCBmb3IgCisgICAgICAgICAgICAqIGxlZ2FjeSBkYXRhIGlmIHRoZSBkYXRhIHZhbHVlIGlzIG1pc3NpbmcuCisgICAgICAgICAgICAqLworICAgICAgICAgICBTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVyc2lvbi12YWx1ZSIgdHlwZT0ib3JtOmNvbnZlcnNpb24tdmFsdWUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LW9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorICAKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJzaW9uVmFsdWUgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgZGF0YWJhc2UgdmFsdWUuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSgpOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBvYmplY3QgdmFsdWUuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIG9iamVjdFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisgIAorICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgIAorICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdHJ1Y3RDb252ZXJ0ZXIgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCisgICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgCisgICAgICAgICAgICogaW1wbGVtZW50IHRoZSBFY2xpcHNlTGluayBpbnRlcmZhY2UgCisgICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBTdHJpbmcgY29udmVydGVyKCk7IAorICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhIAorICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgb24gYW4gRW50aXR5LgorICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0aGF0IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAorICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgYmUgc3BlY2lmaWVkIAorICAgICAgICAgKiBhcyB0aGUgYXJndW1lbnQuCisgICAgICAgICAqIAorICAgICAgICAgKiBBIENvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3Mgb3IgCisgICAgICAgICAqIEVtYmVkZGFibGUuCisgICAgICAgICAqIAorICAgICAgICAgKiBGb3IgaW5zdGFuY2U6CisgICAgICAgICAqIEBFbnRpdHkKKyAgICAgICAgICogQENvcHlQb2xpY3koImV4YW1wbGUuTXlDb3B5UG9saWN5IikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvcHlQb2xpY3kgeworCisgICAgICAgIC8qCisgICAgICAgICogKFJlcXVpcmVkKQorICAgICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgY2xhc3Mgb2YgdGhlIGNvcHkgcG9saWN5LiBJdCBtdXN0IHNwZWNpZnkgYSBjbGFzcyAKKyAgICAgICAgKiB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5CisgICAgICAgICovCisgICAgICAgIENsYXNzIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKKyAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5JbnN0YW50aWF0aW9uQ29weVBvbGljeSAKKyAgICAgICAgICogb24gYW4gRW50aXR5LiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB0aGUgZGVmYXVsdCBDb3B5UG9saWN5IGluIAorICAgICAgICAgKiBFY2xpcHNlTGluayBhbmQgdGhlcmVmb3JlIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgb25seSB1c2VkIHRvIAorICAgICAgICAgKiBvdmVycmlkZSBvdGhlciB0eXBlcyBvZiBjb3B5IHBvbGljaWVzCisgICAgICAgICAqIAorICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCisgICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEV4YW1wbGU6CisgICAgICAgICAqIEBFbnRpdHkKKyAgICAgICAgICogQEluc3RhbnRpYXRpb25Db3B5UG9saWN5IAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgeworICAgICAgICB9CisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAorICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNsb25lQ29weVBvbGljeSBvbiBhbiAKKyAgICAgICAgICogRW50aXR5LiBBIENsb25lQ29weVBvbGljeSBtdXN0IHNwZWNpZnkgYXQgb25lIG9yIGJvdGggb2YgdGhlICJtZXRob2QiIAorICAgICAgICAgKiBvciAid29ya2luZ0NvcHlNZXRob2QiLiAid29ya2luZ0NvcHlNZXRob2QiIGlzIHVzZWQgdG8gY2xvbmUgb2JqZWN0cyAKKyAgICAgICAgICogdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyIGFzIHRoZXkgYXJlIHJlZ2lzdGVyZWQgaW4gCisgICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgdHJhbnNhY3Rpb25hbCBtZWNoYW5pc20sIHRoZSBVbml0T2ZXb3JrLiAibWV0aG9kIiB3aWxsIAorICAgICAgICAgKiBiZSB1c2VkIGZvciB0aGUgY2xvbmUgdGhhdCBpcyB1c2VkIGZvciBjb21wYXJpc29uIGluIGNvbmp1bmN0aW9uIHdpdGggCisgICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKKyAgICAgICAgICogIAorICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcworICAgICAgICAgKiBvciBFbWJlZGRhYmxlLgorICAgICAgICAgKiAKKyAgICAgICAgICogRXhhbXBsZToKKyAgICAgICAgICogQEVudGl0eQorICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KG1ldGhvZD0ibXlDbG9uZU1ldGhvZCIpCisgICAgICAgICAqIAorICAgICAgICAgKiBvcjoKKyAgICAgICAgICogCisgICAgICAgICAqIEBFbnRpdHkKKyAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiLCB3b3JraW5nQ29weU1ldGhvZD0ibXlXb3JraW5nQ29weUNsb25lTWV0aG9kIikKKyAgICAgICAgICogCisgICAgICAgICAqIG9yOgorICAgICAgICAgKiAKKyAgICAgICAgICBARW50aXR5CisgICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kod29ya2luZ0NvcHlNZXRob2ROYW1lPSJteVdvcmtpbmdDb3B5Q2xvbmUiKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2xvbmVDb3B5UG9saWN5IHsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiAoT3B0aW9uYWwpCisgICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkIHRoaXMgZGVmaW5lcyAKKyAgICAgICAgICAgICAqIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgd2lsbCBiZSB1c2VkIAorICAgICAgICAgICAgICogZm9yIGNvbXBhcmlzb24gYnkKKyAgICAgICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIChPcHRpb25hbCkKKyAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQKKyAgICAgICAgICAgICAqIHRoaXMgZGVmaW5lcyBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IAorICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgb2JqZWN0IHJldHVybmVkIHdoZW4gcmVnaXN0ZXJpbmcgYW4gCisgICAgICAgICAgICAgKiBPYmplY3QgaW4gYW4gRWNsaXBzZUxpbmsgVW5pdE9mV29yaworICAgICAgICAgICAgICovCisgICAgICAgICAgICBTdHJpbmcgd29ya2luZ0NvcHlNZXRob2QoKTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0id29ya2luZy1jb3B5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sbGVjdGlvbi10YWJsZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7CisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0YWJsZS4gSWYgaXQgaXMgbm90IAorICAgICAgICAgICAqIHNwZWNpZmllZCwgaXQgaXMgZGVmYXVsdGVkIHRvIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmc6IAorICAgICAgICAgICAqIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZW50aXR5OyAiXyIgOyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwIAorICAgICAgICAgICAqIHByb3BlcnR5IG9yIGZpZWxkIG9mIHRoZSBzb3VyY2UgZW50aXR5LgorICAgICAgICAgICAqLworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsgCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBjYXRhbG9nIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAorICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBjYXRhbG9nLgorICAgICAgICAgICAqLworICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsgCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBzY2hlbWEgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCisgICAgICAgICAgICogdW5pdCBkZWZhdWx0IHNjaGVtYS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsgCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSBhIHByaW1hcnkga2V5IGNvbHVtbiB0aGF0IGlzIHVzZWQgYXMgYSAKKyAgICAgICAgICAgKiBmb3JlaWduIGtleSB0byBqb2luIHRvIGFub3RoZXIgdGFibGUuIElmIHRoZSBzb3VyY2UgZW50aXR5IHVzZXMgYSAKKyAgICAgICAgICAgKiBjb21wb3NpdGUgcHJpbWFyeSBrZXksIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbXVzdCBiZSBzcGVjaWZpZWQgCisgICAgICAgICAgICogZm9yIGVhY2ggZmllbGQgb2YgdGhlIGNvbXBvc2l0ZSBwcmltYXJ5IGtleS4gSW4gYSBzaW5nbGUgcHJpbWFyeSAKKyAgICAgICAgICAgKiBrZXkgY2FzZSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtYXkgb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQuIAorICAgICAgICAgICAqIERlZmF1bHRpbmcgd2lsbCBhcHBseSBvdGhlcndpc2UgYXMgZm9sbG93czoKKyAgICAgICAgICAgKiBuYW1lLCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgCisgICAgICAgICAgICogb2YgdGhlIHNvdXJjZSBlbnRpdHkuIHJlZmVyZW5jZWRDb2x1bW5OYW1lLCB0aGUgc2FtZSBuYW1lIG9mIAorICAgICAgICAgICAqIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSBvZiB0aGUgc291cmNlIGVudGl0eS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHByaW1hcnlLZXlKb2luQ29sdW1ucygpIGRlZmF1bHQge307IAorIAorICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVW5pcXVlIGNvbnN0cmFpbnRzIHRoYXQgYXJlIHRvIGJlIHBsYWNlZCBvbiB0aGUgdGFibGUuIAorICAgICAgICAgICAqIFRoZXNlIGFyZSBvbmx5IHVzZWQgaWYgdGFibGUgZ2VuZXJhdGlvbiBpcyBpbiBlZmZlY3QuCisgICAgICAgICAgICovCisgICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsgCisgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorICAKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNDb2xsZWN0aW9uIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAorICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCisgICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAorICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAorICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKKyAgICAgICAgICAgKiBMQVpZLgorICAgICAgICAgICAqLworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsgCisgCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKKyAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgorICAgICAgICAgICAqLworICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTpjb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisgIAorICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgIAorICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLW1hcCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljTWFwIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAorICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCisgICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAorICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAorICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKKyAgICAgICAgICAgKiBMQVpZLgorICAgICAgICAgICAqLworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCBtYXAgCisgICAgICAgICAgICoga2V5LiBJZiB0aGUgbmFtZSBvbiB0ZSBrZXkgY29sdW1uIGlzICIiLCB0aGUgbmFtZSB3aWxsIGRlZmF1bHQgdG86CisgICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9yIGZpZWxkOyAiX0tFWSIuCisgICAgICAgICAgICovCisgICAgICAgICAgQ29sdW1uIGtleUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUga2V5IGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAorICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKKyAgICAgICAgICAgKiB0aGUgZGlyZWN0IG1hcCBrZXkuCisgICAgICAgICAgICovCisgICAgICAgICAgQ29udmVydCBrZXlDb252ZXJ0ZXIoKSBkZWZhdWx0IEBDb252ZXJ0OworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IAorICAgICAgICAgICAqIGNvbGxlY3Rpb24gZGF0YS4gRGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IG9yIGZpZWxkIG5hbWUuCisgICAgICAgICAgICovCisgICAgICAgICAgQ29sdW1uIHZhbHVlQ29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB2YWx1ZSBjb252ZXJ0ZXIuIERlZmF1bHQgaXMgZXF1aXZhbGVudCB0byAKKyAgICAgICAgICAgKiBzcGVjaWZ5aW5nIEBDb252ZXJ0KCJub25lIiksIG1lYW5pbmcgbm8gY29udmVydGVyIHdpbGwgYmUgYWRkZWQgdG8gCisgICAgICAgICAgICogdGhlIHZhbHVlIGNvbHVtbiBtYXBwaW5nLgorICAgICAgICAgICAqLworICAgICAgICAgIENvbnZlcnQgdmFsdWVDb252ZXJ0ZXIoKSBkZWZhdWx0IEBDb252ZXJ0OworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtleS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtleS1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPiAgICAKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMiI+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KKyAgICAgIDwveHNkOmNob2ljZT4gICAgCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmNvbGxlY3Rpb24tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqb2luLWZldGNoLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBKb2luRmV0Y2hUeXBlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCisgICAgICAgICAqIFRoaXMgZG9lcyBub3QgYWxsb3cgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgSU5ORVIsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCisgICAgICAgICAqIFRoaXMgYWxsb3dzIGZvciBudWxsL2VtcHR5IHZhbHVlcy4KKyAgICAgICAgICovCisgICAgICAgIE9VVEVSLAorICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5ORVIiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVEVSIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisgIAorICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgIAorICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIC8qKiAKKyAgICAgICAgICogQW4gb3B0aW1pc3RpYy1sb2NraW5nIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIAorICAgICAgICAgKiBvcHRpbWlzdGljIGxvY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIG9yIGRlbGV0aW5nIAorICAgICAgICAgKiBlbnRpdGllcy4gQW4gb3B0aW1pc3RpYy1sb2NraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uCisgICAgICAgICAqIGFuIGVudGl0eSBvciBtYXBwZWQtc3VwZXJjbGFzcy4KKyAgICAgICAgICogCisgICAgICAgICAqIEl0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgb3B0aW1pc3RpYy1sb2NraW5nLXR5cGUuCisgICAgICAgICAqLyAKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3B0aW1pc3RpY0xvY2tpbmcgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2Ygb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSB0byB1c2UuCisgICAgICAgICAgICovCisgICAgICAgICAgT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHR5cGUoKSBkZWZhdWx0IFZFUlNJT05fQ09MVU1OOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBGb3IgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBvZiB0eXBlIAorICAgICAgICAgICAqIFNFTEVDVEVEX0NPTFVNTlMsIHRoaXMgYW5ub3RhdGlvbiBtZW1iZXIgYmVjb21lcyBhIChSZXF1aXJlZCkgCisgICAgICAgICAgICogZmllbGQuCisgICAgICAgICAgICovCisgICAgICAgICAgQ29sdW1uW10gc2VsZWN0ZWRDb2x1bW5zKCkgZGVmYXVsdCB7fTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB3aGVyZSB0aGUgb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBzaG91bGQgCisgICAgICAgICAgICogY2FzY2FkZSBsb2NrLiBDdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgd2l0aCBWRVJTSU9OX0NPTFVNTiBsb2NraW5nLgorICAgICAgICAgICAqLworICAgICAgICAgIGJvb2xlYW4gY2FzY2FkZSgpIGRlZmF1bHQgZmFsc2U7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VsZWN0ZWQtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgIAorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmctdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhc2NhZGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIC8qKiAKKyAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKKyAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0CisgICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7CisgICAgICAgICAgLyoqCisgICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQorICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAorICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICAgICAgICovCisgICAgICAgICAgQUxMX0NPTFVNTlMsCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKKyAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KKyAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQorICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCisgICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KKyAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKKyAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAorCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCisgICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQorICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBWRVJTSU9OX0NPTFVNTgorICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJCS8qKiAKKwkJICogIFRoZSBQcmltYXJ5S2V5IGFubm90YXRpb24gYWxsb3dzIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb2YgdGhlIElkLgorCQkgKiAgQSB2YWxpZGF0aW9uIHBvbGljeSBjYW4gYmUgZ2l2ZW4gdGhhdCBhbGxvd3Mgc3BlY2lmeWluZyBpZiB6ZXJvIGlzIGEgdmFsaWQgaWQgdmFsdWUuCisJCSAqICBUaGUgc2V0IG9mIHByaW1hcnkga2V5IGNvbHVtbnMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIHByZWNpc2VseS4KKwkJICogCisJCSAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAorCQkgKiBAc2luY2UgRWNsaXBzZUxpbmsgMS4xCisJCSAqLyAKKwkJQFRhcmdldCh7VFlQRX0pCisJCUBSZXRlbnRpb24oUlVOVElNRSkKKwkJcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleSB7CisJCSAgICAvKioKKwkJICAgICAqIChPcHRpb25hbCkgQ29uZmlndXJlcyB3aGF0IGlkIHZhbGlkYXRpb24gaXMgZG9uZS4KKwkJICAgICAqIEJ5IGRlZmF1bHQgMCBpcyBub3QgYSB2YWxpZCBpZCB2YWx1ZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBhbGxvdyAwIGlkIHZhbHVlcy4KKwkJICAgICAqLworCQkgICAgSWRWYWxpZGF0aW9uIHZhbGlkYXRpb24oKSBkZWZhdWx0IElkVmFsaWRhdGlvbi5aRVJPOyAKKwkJCisJCSAgICAvKioKKwkJICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IHRoZSBwcmltYXJ5IGtleSBjb2x1bW5zIGRpcmVjdGx5LgorCQkgICAgICogVGhpcyBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIEBJZCBpZiB0aGUgcHJpbWFyeSBrZXkgaW5jbHVkZXMgYSBub24gYmFzaWMgZmllbGQsCisJCSAgICAgKiBzdWNoIGFzIGEgZm9yZWlnbiBrZXksIG9yIGEgaW5oZXJpdGFuY2UgZGlzY3JpbWluYXRvciwgZW1iZWRkZWQsIG9yIHRyYW5zZm9ybWF0aW9uIG1hcHBlZCBmaWVsZC4KKwkJICAgICAqLworCQkgICAgQ29sdW1uW10gY29sdW1ucygpIGRlZmF1bHQge307CisJCX0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgIAorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIHR5cGU9Im9ybTppZC12YWxpZGF0aW9uIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpZC12YWxpZGF0aW9uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkJLyoqIAorCQkgKiBUaGUgSWRWYWxpZGF0aW9uIGVudW0gZGV0ZXJtaW5lcyB0aGUgdHlwZSB2YWx1ZSB0aGF0IGFyZSB2YWxpZCBmb3IgYW4gSWQuCisJCSAqIEJ5IGRlZmF1bHQgbnVsbCBpcyBub3QgYWxsb3dlZCwgYW5kIDAgaXMgbm90IGFsbG93IGZvciBzaW5nbGV0b24gaWRzIG9mIGxvbmcgb3IgaW50IHR5cGUuCisJCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFpFUk8gZm9yIHNpbmdsZXRvbiBpZHMsIGFuZCBOVUxMIGZvciBjb21wb3NpdGUgaWRzLgorCQkgKiBUaGlzIGNhbiBiZSBzZXQgdXNpbmcgdGhlIEBQcmltYXJ5S2V5IGFubm90YXRpb24sIG9yIENsYXNzRGVzY3JpcHRvciBBUEkuCisJCSAqIAorCQkgKiBAc2VlIFByaW1hcnlLZXkKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5DbGFzc0Rlc2NyaXB0b3Ijc2V0SWRWYWxpZGF0aW9uKElkVmFsaWRhdGlvbikKKwkJICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCisJCSAqIEBzaW5jZSBFY2xpcHNlTGluayAxLjAgCisJCSAqLyAKKwkJcHVibGljIGVudW0gSWRWYWxpZGF0aW9uIHsKKwkJICAgIC8qKgorCQkgICAgICogT25seSBudWxsIGlzIG5vdCBhbGxvd2VkIGFzIGFuIGlkIHZhbHVlLCAwIGlzIGFsbG93ZWQuCisJCSAgICAgKi8KKwkJICAgIE5VTEwsCisJCQorCQkgICAgLyoqCisJCSAgICAgKiBudWxsIGFuZCAwIGFyZSBub3QgYWxsb3dlZCwgKG9ubHkgaW50IGFuZCBsb25nKS4KKwkJICAgICAqLworCQkgICAgWkVSTywKKwkJCisJCSAgICAvKioKKwkJICAgICAqIE5vIGlkIHZhbGlkYXRpb24gaXMgZG9uZS4KKwkJICAgICAqLworCQkgICAgTk9ORQorCQl9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5VTEwiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpFUk8iLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIC8qKiAKKyAgICAgICAgICogVGhlIENhY2hlIGFubm90YXRpb24gaXMgdXNlZCB0byBzZXQgYW4gCisgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmludmFsaWRhdGlvbi5DYWNoZUludmFsaWRhdGlvblBvbGljeSAKKyAgICAgICAgICogd2hpY2ggc2V0cyBvYmplY3RzIGluIEVjbGlwc2VMaW5rJ3MgaWRlbnRpdHkgbWFwcyB0byBiZSBpbnZhbGlkIAorICAgICAgICAgKiBmb2xsb3dpbmcgZ2l2ZW4gcnVsZXMuIEJ5IGRlZmF1bHQgaW4gRWNsaXBzZUxpbmssIG9iamVjdHMgZG8gbm90IAorICAgICAgICAgKiBleHBpcmUgaW4gdGhlIGNhY2hlLiBTZXZlcmFsIGRpZmZlcmVudCBwb2xpY2llcyBhcmUgYXZhaWxhYmxlIHRvIAorICAgICAgICAgKiBhbGxvdyBvYmplY3RzIHRvIGV4cGlyZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGVUeXBlCisgICAgICAgICAqIAorICAgICAgICAgKiBBIENhY2hlIGFub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4gCisgICAgICAgICAqIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIENhY2hlIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCAKKyAgICAgICAgICogb24gdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKyAgICAgICAgICovCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KQorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS4KKyAgICAgICAgICAgKi8gCisgICAgICAgICAgQ2FjaGVUeXBlIHR5cGUoKSBkZWZhdWx0IFNPRlRfV0VBSzsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNpemUgb2YgY2FjaGUgdG8gdXNlLgorICAgICAgICAgICAqLyAKKyAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgMTAwOworCisJICAgICAgICAvKioKKwkgICAgICAgICAqIChPcHRpb25hbCkgQ2FjaGVkIGluc3RhbmNlcyBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGEgY2xpZW50IAorCSAgICAgICAgICogaXNvbGF0ZWQgY2FjaGUuCisJICAgICAgICAgKi8gCisJICAgICAgICBib29sZWFuIHNoYXJlZCgpIGRlZmF1bHQgdHJ1ZTsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGFmdGVyIGEgZml4IHBlcmlvZCBvZiB0aW1lIChtcykuIAorCSAgICAgICAgICogUXVlcmllcyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgCisJICAgICAgICAgKiB0byB0aGUgZGF0YWJhc2UgZm9yIGEgcmVmcmVzaGVkIGNvcHkKKwkgICAgICAgICAqLyAKKwkgICAgICAgIGludCBleHBpcnkoKSBkZWZhdWx0IC0xOyAvLyBtaW51cyBvbmUgaXMgbm8gZXhwaXJ5LgorCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYSBzcGVjaWZpYyB0aW1lIG9mIGRheS4gUXVlcmllcyAKKwkgICAgICAgICAqIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayB0byB0aGUgCisJICAgICAgICAgKiBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQorCSAgICAgICAgICovIAorCSAgICAgICAgVGltZU9mRGF5IGV4cGlyeVRpbWVPZkRheSgpIGRlZmF1bHQgQFRpbWVPZkRheShzcGVjaWZpZWQ9ZmFsc2UpOworCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIEZvcmNlIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlIHRvIGFsd2F5cyAKKwkgICAgICAgICAqIHJlZnJlc2ggdGhlIGNhY2hlLgorCSAgICAgICAgICovIAorCSAgICAgICAgYm9vbGVhbiBhbHdheXNSZWZyZXNoKCkgZGVmYXVsdCBmYWxzZTsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBGb3IgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UsIHJlZnJlc2ggdGhlCisJICAgICAgICAgKiBjYWNoZSBvbmx5IGlmIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRhdGFiYXNlIGJ5IGEgcXVlcnkgaXMgCisJICAgICAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBjYWNoZSAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW1pc3RpYyAKKwkgICAgICAgICAqIGxvY2tpbmcgZmllbGQpCisJICAgICAgICAgKi8gCisJICAgICAgICBib29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcigpIGRlZmF1bHQgZmFsc2U7CisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIChPcHRpb25hbCkgU2V0dGluZyB0byB0cnVlIHdpbGwgZm9yY2UgYWxsIHF1ZXJpZXMgdG8gYnlwYXNzIHRoZSAKKwkgICAgICAgICAqIGNhY2hlIGZvciBoaXRzIGJ1dCBzdGlsbCByZXNvbHZlIGFnYWluc3QgdGhlIGNhY2hlIGZvciBpZGVudGl0eS4gCisJICAgICAgICAgKiBUaGlzIGZvcmNlcyBhbGwgcXVlcmllcyB0byBoaXQgdGhlIGRhdGFiYXNlLgorCSAgICAgICAgICovIAorCSAgICAgICAgYm9vbGVhbiBkaXNhYmxlSGl0cygpIGRlZmF1bHQgZmFsc2U7CisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhY2hlIGNvb3JkaW5hdGlvbiBtb2RlLgorCSAgICAgICAgICovIAorCSAgICAgICAgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGUoKSBkZWZhdWx0IFNFTkRfT0JKRUNUX0NIQU5HRVM7CisJICAgICAgfQorCQorCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6Y2hvaWNlPgorCSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIi8+CisJICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnktdGltZS1vZi1kYXkiIHR5cGU9Im9ybTp0aW1lLW9mLWRheSIgbWluT2NjdXJzPSIwIi8+CisJICA8L3hzZDpjaG9pY2U+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNhY2hlLXR5cGUiLz4KKwkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsd2F5cy1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmcmVzaC1vbmx5LWlmLW5ld2VyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzYWJsZS1oaXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29vcmRpbmF0aW9uLXR5cGUiIHR5cGU9Im9ybTpjYWNoZS1jb29yZGluYXRpb24tdHlwZSIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gCisKKwk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+CisJICA8eHNkOmFubm90YXRpb24+CisJICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkKKwkgICAgICAvKiogCisgICAgICAgICAqIFRoZSBDYWNoZVR5cGUgZW51bSBpcyB1c2VkIHdpdGggdGhlIENhY2hlIGFubm90YXRpb24gZm9yIGEgCisgICAgICAgICAqIHBlcnNpc3RlbnQgY2xhc3MuIEl0IGRlZmluZXMgdGhlIHR5cGUgb2YgSWRlbnRpdHlNYXAvQ2FjaGUgdXNlZCBmb3IgCisgICAgICAgICAqIHRoZSBjbGFzcy4gQnkgZGVmYXVsdCB0aGUgU09GVF9XRUFLIGNhY2hlIHR5cGUgaXMgdXNlZC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCisgICAgICAgICAqLworCSAgICAgIHB1YmxpYyBlbnVtIENhY2hlVHlwZSB7CisJICAgICAgICAvKioKKwkgICAgICAgICAqIFByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4gQ2FjaGVzIGFsbCBvYmplY3RzCisJICAgICAgICAgKiBhbmQgZG9lcyBub3QgcmVtb3ZlIHRoZW0uIAorCSAgICAgICAgICogV0FSTklORzogVGhpcyBtZXRob2QgbWF5IGJlIG1lbW9yeSBpbnRlbnNpdmUgd2hlbiBtYW55IG9iamVjdHMgYXJlIAorCSAgICAgICAgICogcmVhZC4KKwkgICAgICAgICAqLworCSAgICAgICAgRlVMTCwKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKKwkgICAgICAgICAqIG9iamVjdHMgdXNpbmcgd2VhayByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCisJICAgICAgICAgKiBjb2xsZWN0aW9uIGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuCisJICAgICAgICAgKi8KKwkgICAgICAgIFdFQUssCisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCisJICAgICAgICAgKiBvYmplY3RzIHVzaW5nIHNvZnQgcmVmZXJlbmNlcy4gVGhpcyBtZXRob2QgYWxsb3dzIGZ1bGwgZ2FyYmFnZQorCSAgICAgICAgICogY29sbGVjdGlvbiB3aGVuIG1lbW9yeSBpcyBsb3cgYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQKKwkgICAgICAgICAqIGd1YXJhbnRlZWQgaWRlbnRpdHkuCisJICAgICAgICAgKi8KKwkgICAgICAgIFNPRlQsCisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIFdFQUsgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhCisJICAgICAgICAgKiBtb3N0LWZyZXF1ZW50bHktdXNlZCBzdWItY2FjaGUuIFRoZSBzaXplIG9mIHRoZSBzdWItY2FjaGUgaXMKKwkgICAgICAgICAqIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgaWRlbnRpdHkgbWFwIGFzIHNwZWNpZmllZCBieQorCSAgICAgICAgICogZGVzY3JpcHRvcidzIHNldElkZW50aXR5TWFwU2l6ZSgpIG1ldGhvZC4gVGhlIHN1Yi1jYWNoZQorCSAgICAgICAgICogdXNlcyBzb2Z0IHJlZmVyZW5jZXMgdG8gZW5zdXJlIHRoYXQgdGhlc2Ugb2JqZWN0cyBhcmUKKwkgICAgICAgICAqIGdhcmJhZ2UtY29sbGVjdGVkIG9ubHkgaWYgdGhlIHN5c3RlbSBpcyBsb3cgb24gbWVtb3J5LgorCSAgICAgICAgICovCisJICAgICAgICBTT0ZUX1dFQUssCisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIElkZW50aWNhbCB0byB0aGUgc29mdCBjYWNoZSB3ZWFrIChTT0ZUX1dFQUspIGlkZW50aXR5IG1hcCBleGNlcHQgCisJICAgICAgICAgKiB0aGF0IGl0IHVzZXMgaGFyZCByZWZlcmVuY2VzIGluIHRoZSBzdWItY2FjaGUuIFVzZSB0aGlzIGlkZW50aXR5IAorCSAgICAgICAgICogbWFwIGlmIHNvZnQgcmVmZXJlbmNlcyBkbyBub3QgYmVoYXZlIHByb3Blcmx5IG9uIHlvdXIgcGxhdGZvcm0uCisJICAgICAgICAgKi8KKwkgICAgICAgIEhBUkRfV0VBSywKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogQSBjYWNoZSBpZGVudGl0eSBtYXAgbWFpbnRhaW5zIGEgZml4ZWQgbnVtYmVyIG9mIG9iamVjdHMKKwkgICAgICAgICAqIHNwZWNpZmllZCBieSB0aGUgYXBwbGljYXRpb24uIE9iamVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUKKwkgICAgICAgICAqIG9uIGEgbGVhc3QtcmVjZW50bHktdXNlZCBiYXNpcy4gVGhpcyBtZXRob2QgYWxsb3dzIG9iamVjdAorCSAgICAgICAgICogaWRlbnRpdHkgZm9yIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgb2JqZWN0cy4KKwkgICAgICAgICAqIFdBUk5JTkc6IEZ1cm5pc2hlcyBjYWNoaW5nIGFuZCBpZGVudGl0eSwgYnV0IGRvZXMgbm90IGd1YXJhbnRlZSAKKwkgICAgICAgICAqIGlkZW50aXR5LgorCSAgICAgICAgICovCisJICAgICAgICBDQUNIRSwKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogV0FSTklORzogRG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSAKKwkgICAgICAgICAqIG9iamVjdHMuCisJICAgICAgICAgKi8KKwkgICAgICAgIE5PTkUKKwkgICAgICB9CisJCisJICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJICA8L3hzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGVUxMIi8+CisJICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFQUsiLz4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVCIvPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUX1dFQUsiLz4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEFSRF9XRUFLIi8+CisJICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFIi8+CisJICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KKwkgIDwveHNkOnJlc3RyaWN0aW9uPgorCTwveHNkOnNpbXBsZVR5cGU+CisKKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKKworCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1jb29yZGluYXRpb24tdHlwZSI+CisJICA8eHNkOmFubm90YXRpb24+CisJICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkKKwkgICAgICAvKiogCisgICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCisgICAgICAgICAqLyAKKwkgICAgICBwdWJsaWMgZW51bSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgeworCSAgICAgICAgLyoqCisJICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgY2hhbmdlZCBvYmplY3RzIGluY2x1ZGluZyBkYXRhIGFib3V0IHRoZSBjaGFuZ2VzLgorCSAgICAgICAgICogVGhpcyBkYXRhIGlzIG1lcmdlZCBpbnRvIHRoZSByZWNlaXZpbmcgY2FjaGUuCisJICAgICAgICAgKi8KKwkgICAgICAgIFNFTkRfT0JKRUNUX0NIQU5HRVMsCisJCisJICAgICAgICAgLyoqCisJICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIHRoZSBpZGVudGl0aWVzIG9mIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkLiAKKwkgICAgICAgICAgKiBUaGUgcmVjZWl2aW5nIGNhY2hlIGludmFsaWRhdGVzIHRoZSBvYmplY3RzIChyYXRoZXIgdGhhbiBjaGFuZ2luZyAKKwkgICAgICAgICAgKiBhbnkgb2YgdGhlIGRhdGEpCisJICAgICAgICAgICovCisJICAgICAgICAgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCisJCisJICAgICAgICAgLyoqCisJICAgICAgICAgICogU2FtZSBhcyBTRU5EX09CSkVDVF9DSEFOR0VTIGV4Y2VwdCBpdCBhbHNvIGluY2x1ZGVzIGFueSBuZXdseQorCSAgICAgICAgICAqIGNyZWF0ZWQgb2JqZWN0cyBmcm9tIHRoZSB0cmFuc2FjdGlvbi4KKwkgICAgICAgICAgKi8KKwkgICAgICAgICBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywKKwkKKwkgICAgICAgICAvKioKKwkgICAgICAgICAgKiBEb2VzIG5vIGNhY2hlIGNvb3JkaW5hdGlvbi4KKwkgICAgICAgICAgKi8KKwkgICAgICAgICBOT05FCisgICAgICAgIH0KKwkKKwkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgIDwveHNkOmFubm90YXRpb24+CisJICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisJICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfT0JKRUNUX0NIQU5HRVMiLz4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiLz4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiLz4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgorCSAgPC94c2Q6cmVzdHJpY3Rpb24+CisJPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKKworCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZS1vZi1kYXkiPgorCSAgPHhzZDphbm5vdGF0aW9uPgorCSAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJCisJICAgICAgQFRhcmdldCh7fSkKKwkgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisJICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGltZU9mRGF5IHsKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBIb3VyIG9mIHRoZSBkYXkuCisJICAgICAgICAgKi8gCisJICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBNaW51dGUgb2YgdGhlIGRheS4KKwkgICAgICAgICAqLyAKKwkgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7CisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIChPcHRpb25hbCkgU2Vjb25kIG9mIHRoZSBkYXkuCisJICAgICAgICAgKi8gCisJICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOworCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbGxpc2Vjb25kIG9mIHRoZSBkYXkuCisJICAgICAgICAgKi8gCisJICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7CisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIEludGVybmFsIHVzZS4gRG8gbm90IG1vZGlmeS4KKwkgICAgICAgICAqLyAKKwkgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOworCSAgICAgIH0KKwkKKwkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgIDwveHNkOmFubm90YXRpb24+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWludXRlIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2Vjb25kIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisgIAorICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgIAorICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIC8qKiAKKyAgICAgICAgICogVGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAKKyAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY2hhbmdldHJhY2tpbmcuT2JqZWN0Q2hhbmdlUG9saWN5IAorICAgICAgICAgKiB3aGljaCBjb21wdXRlcyBjaGFuZ2VzIHNldHMgZm9yIEVjbGlwc2VMaW5rJ3MgVW5pdE9mV29yayBjb21taXQgCisgICAgICAgICAqIHByb2Nlc3MuIEFuIE9iamVjdENoYW5nZVBvbGljeSBpcyBzdG9yZWQgb24gYW4gRW50aXR5J3MgZGVzY3JpcHRvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIG1heSBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKKyAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgorICAgICAgICAgKi8gCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KQorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENoYW5nZVRyYWNraW5nIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNoYW5nZSB0cmFja2luZyB0byB1c2UuCisgICAgICAgICAgICovIAorICAgICAgICAgIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQVVUTzsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZy10eXBlIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorIAorICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmctdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIC8qKiAKKyAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uLiAKKyAgICAgICAgICovIAorICAgICAgICBwdWJsaWMgZW51bSBDaGFuZ2VUcmFja2luZ1R5cGUgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIEFuIEFUVFJJQlVURSBjaGFuZ2UgdHJhY2tpbmcgdHlwZSBhbGxvd3MgY2hhbmdlIHRyYWNraW5nIGF0IHRoZQorICAgICAgICAgICAqIGF0dHJpYnV0ZSBsZXZlbCBvZiBhbiBvYmplY3QuIE9iamVjdHMgd2l0aCBjaGFuZ2VkIGF0dHJpYnV0ZXMgd2lsbAorICAgICAgICAgICAqIGJlIHByb2Nlc3NlZCBpbiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgCisgICAgICAgICAgICogcmVzdWx0cyBvZiB0aGUgY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICAgICAgICovCisgICAgICAgICAgQVRUUklCVVRFLAorCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogQW4gT0JKRUNUIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgYWxsb3dzIGFuIG9iamVjdCB0byBjYWxjdWxhdGUgZm9yIAorICAgICAgICAgICAqIGl0c2VsZiB3aGV0aGVyIGl0IGhhcyBjaGFuZ2VkLiBDaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBwcm9jZXNzZWQgaW4gCisgICAgICAgICAgICogdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgb2YgdGhlIAorICAgICAgICAgICAqIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgorICAgICAgICAgICAqLworICAgICAgICAgIE9CSkVDVCwKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIEEgREVGRVJSRUQgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBkZWZlcnMgYWxsIGNoYW5nZSBkZXRlY3Rpb24gdG8KKyAgICAgICAgICAgKiB0aGUgVW5pdE9mV29yaydzIGNoYW5nZSBkZXRlY3Rpb24gcHJvY2Vzcy4gRXNzZW50aWFsbHksIHRoZSAKKyAgICAgICAgICAgKiBjYWxjdWxhdGVDaGFuZ2VzKCkgbWV0aG9kIHdpbGwgcnVuIGZvciBhbGwgb2JqZWN0cyBpbiBhIFVuaXRPZldvcmsuIAorICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgT2JqZWN0Q2hhbmdlUG9saWN5CisgICAgICAgICAgICovCisgICAgICAgICAgREVGRVJSRUQsCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBXaWxsIG5vdCBzZXQgYW55IGNoYW5nZSB0cmFja2luZyBwb2xpY3kuCisgICAgICAgICAgICovCisgICAgICAgICAgQVVUTworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJICA8L3hzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVFRSSUJVVEUiLz4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0JKRUNUIi8+CisJICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFRkVSUkVEIi8+CisJICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KKwkgIDwveHNkOnJlc3RyaWN0aW9uPgorCTwveHNkOnNpbXBsZVR5cGU+CisgIAorICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgIAorICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbWl6ZXIiPgorCSAgPHhzZDphbm5vdGF0aW9uPgorCSAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJCisgICAgICAvKiogCisgICAgICAgKiBUaGUgQ3VzdG9taXplciBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKKyAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuRGVzY3JpcHRvckN1c3RvbWl6ZXIgCisgICAgICAgKiBpbnRlcmZhY2UgYW5kIGlzIHRvIHJ1biBhZ2FpbnN0IGFuIGVuZXRpdHkncyBjbGFzcyBkZXNjcmlwdG9yIGFmdGVyIGFsbCAKKyAgICAgICAqIG1ldGFkYXRhIHByb2Nlc3NpbmcgaGFzIGJlZW4gY29tcGxldGVkLgorICAgICAgICoKKyAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIAorICAgICAgICogb3IgRW1iZWRkYWJsZSBjbGFzcy4gSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ3VzdG9taXplciBpcyBub3QgCisgICAgICAgKiBpbmhlcml0ZWQgZnJvbSBpdHMgcGFyZW50IGNsYXNzZXMuIAorICAgICAgICovIAorCSAgICBAVGFyZ2V0KHtUWVBFfSkKKwkgICAgQFJldGVudGlvbihSVU5USU1FKQorCSAgICBwdWJsaWMgQGludGVyZmFjZSBDdXN0b21pemVyIHsKKwkgICAgICAvKioKKwkgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyB0aGF0IAorCSAgICAgICAqIHNob3VsZCBiZSBhcHBsaWVkIGZvciB0aGUgcmVsYXRlZCBlbnRpdHkgb3IgZW1iZWRkYWJsZSBjbGFzcy4KKwkgICAgICAgKi8KKwkgICAgICBDbGFzcyB2YWx1ZSgpOyAKKwkgICAgfQorCQorCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisgIAorICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgIAorICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAvKiogCisgICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIGFsbG93cyB0aGUgZGVmaW5pdGlvbiBvZiAKKyAgICAgICAgICogcXVlcmllcyB0aGF0IGNhbGwgc3RvcmVkIHByb2NlZHVyZXMgYXMgbmFtZWQgcXVlcmllcy4KKyAgICAgICAgIAorICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IKKyAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4gCisgICAgICAgICAqLyAKKwkgICAgICBAVGFyZ2V0KHtUWVBFfSkKKwkgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisJICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSB7CisJICAgICAgICAvKioKKwkgICAgICAgICAqIChSZXF1aXJlZCkgVW5pcXVlIG5hbWUgdGhhdCByZWZlcmVuY2VzIHRoaXMgc3RvcmVkIHByb2NlZHVyZSBxdWVyeS4KKwkgICAgICAgICAqLworCSAgICAgICAgU3RyaW5nIG5hbWUoKTsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBRdWVyeSBoaW50cy4KKwkgICAgICAgICAqLworCSAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OworCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIFJlZmVycyB0byB0aGUgY2xhc3Mgb2YgdGhlIHJlc3VsdC4KKwkgICAgICAgICAqLworCSAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIFNRTFJlc3VsdE1hcHBpbmcuCisJICAgICAgICAgKi8KKwkgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS4KKwkgICAgICAgICAqLworCSAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWUoKTsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBxdWVyeSBzaG91bGQgcmV0dXJuIGEgcmVzdWx0IHNldC4KKwkgICAgICAgICAqLworCSAgICAgICAgYm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0KCkgZGVmYXVsdCB0cnVlOyAKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGFyZ3VtZW50cyB0byB0aGUgc3RvcmVkIHByb2NlZHVyZS4KKwkgICAgICAgICAqLworCSAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307CisJICAgICAgfQorCQorCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwkgICAgPHhzZDpzZXF1ZW5jZT4KKwkgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgCisJICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlciIgdHlwZT0ib3JtOnN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIiAKKwkgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCSAgICA8L3hzZDpzZXF1ZW5jZT4KKwkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmV0dXJucy1yZXN1bHQtc2V0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorICAKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciI+CisJICA8eHNkOmFubm90YXRpb24+CisJICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBBIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uIGlzIHVzZWQgd2l0aGluIGEgCisgICAgICAgICAqIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbi4gCisgICAgICAgICAqLyAKKwkgICAgICBAVGFyZ2V0KHt9KQorCSAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKwkgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgeworCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyLgorCSAgICAgICAgICovCisJICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKCkgZGVmYXVsdCBJTjsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBTdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlciBuYW1lLgorCSAgICAgICAgICovCisJICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIHF1ZXJ5IHBhcmFtZXRlciBuYW1lLgorCSAgICAgICAgICovCisJICAgICAgICBTdHJpbmcgcXVlcnlQYXJhbWV0ZXIoKTsKKwkKKwkgICAgICAgIC8qKgorCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBKYXZhIGNsYXNzIGRlc2lyZWQgYmFjayBmcm9tIHRoZSBwcm9jZWR1cmUsIAorCSAgICAgICAgICogdGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJvY2VkdXJlLgorCSAgICAgICAgICovCisJICAgICAgICBDbGFzcyB0eXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOworCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgY29kZSwgdGhpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgCisJICAgICAgICAgKiBmcm9tIHRoZSBwcm9jZWR1cmUuCisJICAgICAgICAgKi8KKwkgICAgICAgIGludCBqZGJjVHlwZSgpIGRlZmF1bHQgLTE7CisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBuYW1lLCB0aGlzIG1heSBiZSByZXF1aXJlZCBmb3IgQVJSQVkgb3IgCisJICAgICAgICAgKiBTVFJVQ1QgdHlwZXMuCisJICAgICAgICAgKi8KKwkgICAgICAgIFN0cmluZyBqZGJjVHlwZU5hbWUoKSBkZWZhdWx0ICIiOworCSAgICAgIH0KKwkKKwkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgIDwveHNkOmFubm90YXRpb24+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9Im9ybTpkaXJlY3Rpb24tdHlwZSIvPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icXVlcnktcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+CisJICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCQorCTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKwkKKwk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlyZWN0aW9uLXR5cGUiPgorCSAgPHhzZDphbm5vdGF0aW9uPgorCSAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJCisgICAgICAgIC8qKiAKKyAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbi4KKyAgICAgICAgICogSXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgCisgICAgICAgICAqIHBhcmFtZXRlcnMgb2YgYSBuYW1lZCBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgorICAgICAgICAgKi8KKwkgICAgICBwdWJsaWMgZW51bSBEaXJlY3Rpb24geworCSAgICAgICAgLyoqCisJICAgICAgICAgKiBJbnB1dCBwYXJhbWV0ZXIKKwkgICAgICAgICAqLworCSAgICAgICAgSU4sCisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIE91dHB1dCBwYXJhbWV0ZXIKKwkgICAgICAgICAqLworCSAgICAgICAgT1VULAorCQorCSAgICAgICAgLyoqCisJICAgICAgICAgKiBJbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcgorCSAgICAgICAgICovCisJICAgICAgICBJTl9PVVQsCisJCisJICAgICAgICAvKioKKwkgICAgICAgICAqIE91dHB1dCBjdXJzb3IKKwkgICAgICAgICAqLworCSAgICAgICAgT1VUX0NVUlNPUgorCSAgICAgIH0KKwkKKwkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgIDwveHNkOmFubm90YXRpb24+CisJICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisJICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOIi8+CisJICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVCIvPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTl9PVVQiLz4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUX0NVUlNPUiIvPgorCSAgPC94c2Q6cmVzdHJpY3Rpb24+CisJPC94c2Q6c2ltcGxlVHlwZT4KKwkKKwk8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisJCisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJCQkJLyoqIAorCQkJCSAqIFZhcmlhYmxlIG9uZSB0byBvbmUgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcG9pbnRlciAKKwkJCQkgKiByZWZlcmVuY2VzIGJldHdlZW4gYSBqYXZhIG9iamVjdCBhbmQgYW4gaW1wbGVtZW50ZXIgb2YgYW4gaW50ZXJmYWNlLiAKKwkJCQkgKiBUaGlzIG1hcHBpbmcgaXMgdXN1YWxseSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBwb2ludGVyIChzdG9yZWQgaW4gYW4gCisJCQkJICogaW5zdGFuY2UgdmFyaWFibGUpIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMuIEluIHRoZSAKKwkJCQkgKiByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlcywgdGhlc2UgbWFwcGluZ3MgYXJlIG5vcm1hbGx5IGltcGxlbWVudGVkIAorCQkJCSAqIHVzaW5nIGEgZm9yZWlnbiBrZXkgYW5kIGEgdHlwZSBjb2RlLgorCQkJCSAqIAorCQkJCSAqIEEgVmFyaWFibGVPbmVUb09uZSBjYW4gYmUgc3BlY2lmaWVkIHdpdGhpbiBhbiBFbnRpdHksIAorCQkJCSAqIE1hcHBlZFN1cGVyY2xhc3MgYW5kIEVtYmVkZGFibGUgY2xhc3MuIAorCQkJCSAqLyAKKwkJCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgCisJCQkJQFJldGVudGlvbihSVU5USU1FKQorCQkJCXB1YmxpYyBAaW50ZXJmYWNlIFZhcmlhYmxlT25lVG9PbmUgeworCQkJCSAgICAvKioKKwkJCQkgICAgICogKE9wdGlvbmFsKSBUaGUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgCisJCQkJICAgICAqIGFzc29jaWF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSAKKwkJCQkgICAgICogb2YgdGhlIG9iamVjdCBiZWluZyByZWZlcmVuY2VkLgorCQkJCSAgICAgKi8KKwkJCQkgICAgQ2xhc3MgdGFyZ2V0SW50ZXJmYWNlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOworCQkJCSAgICAKKwkJCQkgICAgLyoqCisJCQkJICAgICAqIChPcHRpb25hbCkgVGhlIG9wZXJhdGlvbnMgdGhhdCBtdXN0IGJlIGNhc2NhZGVkIHRvIHRoZSB0YXJnZXQgb2YgCisJCQkJICAgICAqIHRoZSBhc3NvY2lhdGlvbi4KKwkJCQkgICAgICovCisJCQkJICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307CisJCQkJICAgIAorCQkJCSAgICAvKioKKwkJCQkgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKKwkJCQkgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKKwkJCQkgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKKwkJCQkgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCisJCQkJICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAorCQkJCSAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KKwkJCQkgICAgICovCisJCQkJICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7CisJCQkJICAgIAorCQkJCSAgICAvKioKKwkJCQkgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBpcyBvcHRpb25hbC4gSWYgc2V0IHRvIGZhbHNlIAorCQkJCSAgICAgKiB0aGVuIGEgbm9uLW51bGwgcmVsYXRpb25zaGlwIG11c3QgYWx3YXlzIGV4aXN0LgorCQkJCSAgICAgKi8KKwkJCQkgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKKwkJCQkgIAorCQkJCSAgICAvKioKKwkJCQkgICAgICogKE9wdGlvbmFsKSBUaGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2lsbCBob2xkIHRoZSB0eXBlIAorCQkJCSAgICAgKiBpbmRpY2F0b3JzLiBJZiB0aGUgRGlzY3JpbWluYXRvckNvbHVtbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmFtZSAKKwkJCQkgICAgICogb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIGRlZmF1bHRzIHRvICJEVFlQRSIgYW5kIHRoZSAKKwkJCQkgICAgICogZGlzY3JpbWluYXRvciB0eXBlIHRvIFNUUklORy4KKwkJCQkgICAgICovCisJCQkJICAgIERpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgQERpc2NyaW1pbmF0b3JDb2x1bW47CisJCQkJICAgIAorICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbGlzdCBvZiBkaXNjcmltaW5hdG9yIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCAKKyAgICAgICAgICAgICAgICAgICAgICogdGhpcyBWYXJpYWJsZU9uZVRvT25lLiBJZiBub25lIGFyZSBzcGVjaWZpZWQgdGhlbiB0aG9zZSBlbnRpdGllcyAKKyAgICAgICAgICAgICAgICAgICAgICogd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHRoYXQgaW1wbGVtZW50IHRoZSB0YXJnZXQgaW50ZXJmYWNlIAorICAgICAgICAgICAgICAgICAgICAgKiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHR5cGVzLiBUaGUgZGlzY3JpbWluYXRvciB0eXBlIHdpbGwgCisgICAgICAgICAgICAgICAgICAgICAqIGRlZmF1bHQgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIFNUUklORzogRW50aXR5Lm5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgQ0hBUjogRmlyc3QgbGV0dGVyIG9mIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICogICAgRW50aXR5IGNsYXNzCisgICAgICAgICAgICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBJTlRFR0VSOiBUaGUgbmV4dCBpbnRlZ2VyIGFmdGVyIAorICAgICAgICAgICAgICAgICAgICAgKiAgICB0aGUgaGlnaGVzdCBpbnRlZ2VyIGV4cGxpY2l0bHkgYWRkZWQuCisgICAgICAgICAgICAgICAgICAgICAqLworCQkJCSAgICBEaXNjcmltaW5hdG9yQ2xhc3NbXSBkaXNjcmltaW5hdG9yQ2xhc3NlcygpIGRlZmF1bHQge307CisJCQkJfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jbGFzcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWludGVyZmFjZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBBIERpc2NyaW1pbmF0b3JDbGFzcyBpcyB1c2VkIHdpdGhpbiBhIFZhcmlhYmxlT25lVG9PbmUgYW5ub3RhdGlvbi4KKyAgICAgICAgICovIAorICAgICAgICBAVGFyZ2V0KHt9KSAKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ2xhc3MgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRpc2NyaW1pbmF0b3IgdG8gYmUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3IoKTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNsYXNzIHRvIHRoZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCisgICAgICAgICAgICogZGlzY3JpbWluYXRvci4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDbGFzcyB2YWx1ZSgpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAKKwk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXR5cGUiPgorCSAgPHhzZDphbm5vdGF0aW9uPgorCSAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJICAgICAgICAvKioKKyAgICAgICAgICAgKiBUaGUgRXhpc3RlbmNlQ2hlY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCisgICAgICAgICAgICogY2hlY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIGVudGl0aWVzLgorICAgICAgICAgICAqIAorICAgICAgICAgICAqIEFuIGV4aXN0ZW5jZS1jaGVja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbiBhbiBFbnRpdHkgb3IgCisgICAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbm5vdGF0aW9uLgorICAgICAgICAgICAqLworICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEV4aXN0ZW5jZUNoZWNraW5nIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogKE9wdGlvbmFsKSBTZXQgdGhlIGV4aXN0ZW5jZSBjaGVjayBmb3IgZGV0ZXJtaW5pbmcKKyAgICAgICAgICAgICAqIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICBFeGlzdGVuY2VUeXBlIHZhbHVlKCkgZGVmYXVsdCBDSEVDS19DQUNIRTsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIGFuZCAKKyAgICAgICAgICAgKiBpdCBpcyBpbiB0aGUgY2FjaGUsIHRoZW4gaXQgbXVzdCBleGlzdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDSEVDS19DQUNIRSwKKwkJCQorICAgICAgICAgIC8qKgorICAgICAgICAgICAqIFBlcmZvcm0gZG9lcyBleGlzdCBjaGVjayBvbiB0aGUgZGF0YWJhc2UuCisgICAgICAgICAgICovCisgICAgICAgICAgQ0hFQ0tfREFUQUJBU0UsCisJCQkKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgdGhlbiAKKyAgICAgICAgICAgKiBpdCBtdXN0IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIAorICAgICAgICAgICAqIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBBU1NVTUVfRVhJU1RFTkNFLAorCQkJCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogQXNzdW1lIHRoYXQgdGhlIG9iamVjdCBkb2VzIG5vdCBleGlzdC4gVGhpcyBtYXkgYmUgdXNlZCBpZiB0aGUgCisgICAgICAgICAgICogYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suICAKKyAgICAgICAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIGZvcmNlIGFuIGluc2VydCB0byBiZSBjYWxsZWQuCisgICAgICAgICAgICovCisgICAgICAgICAgQVNTVU1FX05PTl9FWElTVEVOQ0UKKwkJCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CSAKKwkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKwkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfQ0FDSEUiIC8+CisJICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0RBVEFCQVNFIiAvPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1NVTUVfRVhJU1RFTkNFIiAvPgorCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1NVTUVfTk9OX0VYSVNURU5DRSIvPgorCSAgPC94c2Q6cmVzdHJpY3Rpb24+CisJPC94c2Q6c2ltcGxlVHlwZT4JCisJCis8L3hzZDpzY2hlbWE+CisKKwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMl8wLnhzZCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2YmYwOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QKQEAgLTAsMCArMSwzNTIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgCisgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgCisgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uIAorIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgCisgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgQ29udHJpYnV0b3JzOgorICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gZnJvbSBPcmFjbGUgVG9wTGluaworICAgICB0d2FyZSAtIHVwZGF0ZSB2ZXJzaW9uIG51bWJlciB0byAyLjAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLS0+CisKKzwhLS0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgb2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZyBmaWxlIHNjaGVtYSAtLT4KKzx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIgCisgIHhtbG5zOm9ybT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIgCisgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAorICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgCisgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgCisgIHZlcnNpb249IjIuMCI+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIEAoIyllY2xpcHNlbGlua19vcm1fMl8wLnhzZCAyLjAgIE9jdG9iZXIgNSAyMDA4CisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgPHhzZDphbm5vdGF0aW9uPgorICAgICA8eHNkOmRvY3VtZW50YXRpb24+PCFbQ0RBVEFbCisKKyAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgbmF0aXZlIEVjbGlwc2VsaW5rIFhNTCBtYXBwaW5nIGZpbGUKKyAgICAgICBUaGUgZmlsZSBtYXkgYmUgbmFtZWQgIk1FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiIGluIHRoZSBwZXJzaXN0ZW5jZQorICAgICAgIGFyY2hpdmUgb3IgaXQgbWF5IGJlIG5hbWVkIHNvbWUgb3RoZXIgbmFtZSB3aGljaCB3b3VsZCBiZQorICAgICAgIHVzZWQgdG8gbG9jYXRlIHRoZSBmaWxlIGFzIHJlc291cmNlIG9uIHRoZSBjbGFzc3BhdGguCisgICAgICAgT2JqZWN0L3JlbGF0aW9uYWwgbWFwcGluZyBmaWxlcyBtdXN0IGluZGljYXRlIHRoZSBvYmplY3QvcmVsYXRpb25hbAorICAgICAgIG1hcHBpbmcgZmlsZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHBlcnNpc3RlbmNlIG5hbWVzcGFjZToKKworICAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0KKworICAgICAgIGFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6CisKKyAgICAgICA8ZW50aXR5LW1hcHBpbmdzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIgorICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIAorICAgICAgIGVjbGlwc2VsaW5rX29ybV8yXzAueHNkCisgICAgICAgdmVyc2lvbj0iMi4wIj4KKyAgICAgICAuLi4KKyAgICAgICA8L2VudGl0eS1tYXBwaW5ncz4KKworICAgICBdXT48L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5VHlwZSIvPgorICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY2Nlc3MtbWV0aG9kcyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisgIAorICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgIAorICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBUaGUgQ2FjaGUgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNldCBhbiAKKyAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuaW52YWxpZGF0aW9uLkNhY2hlSW52YWxpZGF0aW9uUG9saWN5IAorICAgICAgICAgKiB3aGljaCBzZXRzIG9iamVjdHMgaW4gRWNsaXBzZUxpbmsncyBpZGVudGl0eSBtYXBzIHRvIGJlIGludmFsaWQgCisgICAgICAgICAqIGZvbGxvd2luZyBnaXZlbiBydWxlcy4gQnkgZGVmYXVsdCBpbiBFY2xpcHNlTGluaywgb2JqZWN0cyBkbyBub3QgCisgICAgICAgICAqIGV4cGlyZSBpbiB0aGUgY2FjaGUuIFNldmVyYWwgZGlmZmVyZW50IHBvbGljaWVzIGFyZSBhdmFpbGFibGUgdG8gCisgICAgICAgICAqIGFsbG93IG9iamVjdHMgdG8gZXhwaXJlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZVR5cGUKKyAgICAgICAgICogCisgICAgICAgICAqIEEgQ2FjaGUgYW5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzLiAKKyAgICAgICAgICogSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ2FjaGUgYW5ub3RhdGlvbiBzaG91bGQgb25seSBiZSBkZWZpbmVkIAorICAgICAgICAgKiBvbiB0aGUgcm9vdCBvZiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorICAgICAgICAgKi8KKyAgICAgICAgQFRhcmdldCh7VFlQRX0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2FjaGUgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2FjaGUgdG8gdXNlLgorICAgICAgICAgICAqLyAKKyAgICAgICAgICBDYWNoZVR5cGUgdHlwZSgpIGRlZmF1bHQgU09GVF9XRUFLOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2l6ZSBvZiBjYWNoZSB0byB1c2UuCisgICAgICAgICAgICovIAorICAgICAgICAgIGludCBzaXplKCkgZGVmYXVsdCAxMDA7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIENhY2hlZCBpbnN0YW5jZXMgaW4gdGhlIHNoYXJlZCBjYWNoZSBvciBhIGNsaWVudCAKKyAgICAgICAgICAgKiBpc29sYXRlZCBjYWNoZS4KKyAgICAgICAgICAgKi8gCisgICAgICAgICAgYm9vbGVhbiBzaGFyZWQoKSBkZWZhdWx0IHRydWU7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCisgICAgICAgICAgICogUXVlcmllcyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgCisgICAgICAgICAgICogdG8gdGhlIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5CisgICAgICAgICAgICovIAorICAgICAgICAgIGludCBleHBpcnkoKSBkZWZhdWx0IC0xOyAvLyBtaW51cyBvbmUgaXMgbm8gZXhwaXJ5LgorCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGEgc3BlY2lmaWMgdGltZSBvZiBkYXkuIFF1ZXJpZXMgCisgICAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKKyAgICAgICAgICAgKiBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQorICAgICAgICAgICAqLyAKKyAgICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvcmNlIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlIHRvIGFsd2F5cyAKKyAgICAgICAgICAgKiByZWZyZXNoIHRoZSBjYWNoZS4KKyAgICAgICAgICAgKi8gCisgICAgICAgICAgYm9vbGVhbiBhbHdheXNSZWZyZXNoKCkgZGVmYXVsdCBmYWxzZTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlLCByZWZyZXNoIHRoZQorICAgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKKyAgICAgICAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBjYWNoZSAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW1pc3RpYyAKKyAgICAgICAgICAgKiBsb2NraW5nIGZpZWxkKQorICAgICAgICAgICAqLyAKKyAgICAgICAgICBib29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcigpIGRlZmF1bHQgZmFsc2U7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIGZvcmNlIGFsbCBxdWVyaWVzIHRvIGJ5cGFzcyB0aGUgCisgICAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKKyAgICAgICAgICAgKiBUaGlzIGZvcmNlcyBhbGwgcXVlcmllcyB0byBoaXQgdGhlIGRhdGFiYXNlLgorICAgICAgICAgICAqLyAKKyAgICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhY2hlIGNvb3JkaW5hdGlvbiBtb2RlLgorICAgICAgICAgICAqLyAKKyAgICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpjaG9pY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUtb2YtZGF5IiB0eXBlPSJvcm06dGltZS1vZi1kYXkiIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOmNob2ljZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXJlZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2FjaGUtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsd2F5cy1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZnJlc2gtb25seS1pZi1uZXdlciIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29vcmRpbmF0aW9uLXR5cGUiIHR5cGU9Im9ybTpjYWNoZS1jb29yZGluYXRpb24tdHlwZSIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+IAorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBUaGUgQ2FjaGVUeXBlIGVudW0gaXMgdXNlZCB3aXRoIHRoZSBDYWNoZSBhbm5vdGF0aW9uIGZvciBhIAorICAgICAgICAgKiBwZXJzaXN0ZW50IGNsYXNzLiBJdCBkZWZpbmVzIHRoZSB0eXBlIG9mIElkZW50aXR5TWFwL0NhY2hlIHVzZWQgZm9yIAorICAgICAgICAgKiB0aGUgY2xhc3MuIEJ5IGRlZmF1bHQgdGhlIFNPRlRfV0VBSyBjYWNoZSB0eXBlIGlzIHVzZWQuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBQcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuIENhY2hlcyBhbGwgb2JqZWN0cworICAgICAgICAgICAqIGFuZCBkb2VzIG5vdCByZW1vdmUgdGhlbS4gCisgICAgICAgICAgICogV0FSTklORzogVGhpcyBtZXRob2QgbWF5IGJlIG1lbW9yeSBpbnRlbnNpdmUgd2hlbiBtYW55IG9iamVjdHMgYXJlIAorICAgICAgICAgICAqIHJlYWQuCisgICAgICAgICAgICovCisgICAgICAgICAgRlVMTCwKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCisgICAgICAgICAgICogb2JqZWN0cyB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKKyAgICAgICAgICAgKiBjb2xsZWN0aW9uIGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuCisgICAgICAgICAgICovCisgICAgICAgICAgV0VBSywKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCisgICAgICAgICAgICogb2JqZWN0cyB1c2luZyBzb2Z0IHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKKyAgICAgICAgICAgKiBjb2xsZWN0aW9uIHdoZW4gbWVtb3J5IGlzIGxvdyBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZAorICAgICAgICAgICAqIGd1YXJhbnRlZWQgaWRlbnRpdHkuCisgICAgICAgICAgICovCisgICAgICAgICAgU09GVCwKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIFdFQUsgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhCisgICAgICAgICAgICogbW9zdC1mcmVxdWVudGx5LXVzZWQgc3ViLWNhY2hlLiBUaGUgc2l6ZSBvZiB0aGUgc3ViLWNhY2hlIGlzCisgICAgICAgICAgICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAgYXMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICogZGVzY3JpcHRvcidzIHNldElkZW50aXR5TWFwU2l6ZSgpIG1ldGhvZC4gVGhlIHN1Yi1jYWNoZQorICAgICAgICAgICAqIHVzZXMgc29mdCByZWZlcmVuY2VzIHRvIGVuc3VyZSB0aGF0IHRoZXNlIG9iamVjdHMgYXJlCisgICAgICAgICAgICogZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuCisgICAgICAgICAgICovCisgICAgICAgICAgU09GVF9XRUFLLAorCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogSWRlbnRpY2FsIHRvIHRoZSBzb2Z0IGNhY2hlIHdlYWsgKFNPRlRfV0VBSykgaWRlbnRpdHkgbWFwIGV4Y2VwdCAKKyAgICAgICAgICAgKiB0aGF0IGl0IHVzZXMgaGFyZCByZWZlcmVuY2VzIGluIHRoZSBzdWItY2FjaGUuIFVzZSB0aGlzIGlkZW50aXR5IAorICAgICAgICAgICAqIG1hcCBpZiBzb2Z0IHJlZmVyZW5jZXMgZG8gbm90IGJlaGF2ZSBwcm9wZXJseSBvbiB5b3VyIHBsYXRmb3JtLgorICAgICAgICAgICAqLworICAgICAgICAgIEhBUkRfV0VBSywKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIEEgY2FjaGUgaWRlbnRpdHkgbWFwIG1haW50YWlucyBhIGZpeGVkIG51bWJlciBvZiBvYmplY3RzCisgICAgICAgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gT2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZQorICAgICAgICAgICAqIG9uIGEgbGVhc3QtcmVjZW50bHktdXNlZCBiYXNpcy4gVGhpcyBtZXRob2QgYWxsb3dzIG9iamVjdAorICAgICAgICAgICAqIGlkZW50aXR5IGZvciB0aGUgbW9zdCBjb21tb25seSB1c2VkIG9iamVjdHMuCisgICAgICAgICAgICogV0FSTklORzogRnVybmlzaGVzIGNhY2hpbmcgYW5kIGlkZW50aXR5LCBidXQgZG9lcyBub3QgZ3VhcmFudGVlIAorICAgICAgICAgICAqIGlkZW50aXR5LgorICAgICAgICAgICAqLworICAgICAgICAgIENBQ0hFLAorCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogV0FSTklORzogRG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSAKKyAgICAgICAgICAgKiBvYmplY3RzLgorICAgICAgICAgICAqLworICAgICAgICAgIE5PTkUKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlVMTCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VBSyIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVF9XRUFLIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVJEX1dFQUsiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAgCisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENhY2hlIGFubm90YXRpb24uCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAorICAgICAgICAgKi8gCisgICAgICAgIHB1YmxpYyBlbnVtIENhY2hlQ29vcmRpbmF0aW9uVHlwZSB7CisgICAgICAgICAgLyoqCisgICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIGNoYW5nZWQgb2JqZWN0cyBpbmNsdWRpbmcgZGF0YSBhYm91dCB0aGUgY2hhbmdlcy4KKyAgICAgICAgICAgKiBUaGlzIGRhdGEgaXMgbWVyZ2VkIGludG8gdGhlIHJlY2VpdmluZyBjYWNoZS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBTRU5EX09CSkVDVF9DSEFOR0VTLAorCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIHRoZSBpZGVudGl0aWVzIG9mIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkLiAKKyAgICAgICAgICAgKiBUaGUgcmVjZWl2aW5nIGNhY2hlIGludmFsaWRhdGVzIHRoZSBvYmplY3RzIChyYXRoZXIgdGhhbiBjaGFuZ2luZyAKKyAgICAgICAgICAgKiBhbnkgb2YgdGhlIGRhdGEpCisgICAgICAgICAgICovCisgICAgICAgICAgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBTYW1lIGFzIFNFTkRfT0JKRUNUX0NIQU5HRVMgZXhjZXB0IGl0IGFsc28gaW5jbHVkZXMgYW55IG5ld2x5CisgICAgICAgICAgICogY3JlYXRlZCBvYmplY3RzIGZyb20gdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgICAqLworICAgICAgICAgIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAorCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogRG9lcyBubyBjYWNoZSBjb29yZGluYXRpb24uCisgICAgICAgICAgICovCisgICAgICAgICAgTk9ORQorICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX09CSkVDVF9DSEFOR0VTIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAvKiogCisgICAgICAgICAqIFRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgCisgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNoYW5nZXRyYWNraW5nLk9iamVjdENoYW5nZVBvbGljeSAKKyAgICAgICAgICogd2hpY2ggY29tcHV0ZXMgY2hhbmdlcyBzZXRzIGZvciBFY2xpcHNlTGluaydzIFVuaXRPZldvcmsgY29tbWl0IAorICAgICAgICAgKiBwcm9jZXNzLiBBbiBPYmplY3RDaGFuZ2VQb2xpY3kgaXMgc3RvcmVkIG9uIGFuIEVudGl0eSdzIGRlc2NyaXB0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEEgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBtYXkgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCisgICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KKyAgICAgICAgICovIAorICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDaGFuZ2VUcmFja2luZyB7CisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBjaGFuZ2UgdHJhY2tpbmcgdG8gdXNlLgorICAgICAgICAgICAqLyAKKyAgICAgICAgICBDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUoKSBkZWZhdWx0IEFVVE87CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmctdHlwZSIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZy10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uIAorICAgICAgICAgKi8gCisgICAgICAgIHB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7CisgICAgICAgICAgLyoqCisgICAgICAgICAgICogQW4gQVRUUklCVVRFIGNoYW5nZSB0cmFja2luZyB0eXBlIGFsbG93cyBjaGFuZ2UgdHJhY2tpbmcgYXQgdGhlCisgICAgICAgICAgICogYXR0cmlidXRlIGxldmVsIG9mIGFuIG9iamVjdC4gT2JqZWN0cyB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyB3aWxsCisgICAgICAgICAgICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSAKKyAgICAgICAgICAgKiByZXN1bHRzIG9mIHRoZSBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBBVFRSSUJVVEUsCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBBbiBPQkpFQ1QgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBhbGxvd3MgYW4gb2JqZWN0IHRvIGNhbGN1bGF0ZSBmb3IgCisgICAgICAgICAgICogaXRzZWxmIHdoZXRoZXIgaXQgaGFzIGNoYW5nZWQuIENoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIHByb2Nlc3NlZCBpbiAKKyAgICAgICAgICAgKiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgCisgICAgICAgICAgICogY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICAgICAgICovCisgICAgICAgICAgT0JKRUNULAorCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogQSBERUZFUlJFRCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGRlZmVycyBhbGwgY2hhbmdlIGRldGVjdGlvbiB0bworICAgICAgICAgICAqIHRoZSBVbml0T2ZXb3JrJ3MgY2hhbmdlIGRldGVjdGlvbiBwcm9jZXNzLiBFc3NlbnRpYWxseSwgdGhlIAorICAgICAgICAgICAqIGNhbGN1bGF0ZUNoYW5nZXMoKSBtZXRob2Qgd2lsbCBydW4gZm9yIGFsbCBvYmplY3RzIGluIGEgVW5pdE9mV29yay4gCisgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBPYmplY3RDaGFuZ2VQb2xpY3kKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBERUZFUlJFRCwKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIFdpbGwgbm90IHNldCBhbnkgY2hhbmdlIHRyYWNraW5nIHBvbGljeS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBBVVRPCisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVFJJQlVURSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0JKRUNUIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUZFUlJFRCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbWl6ZXIiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAvKiogCisgICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAorICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLkRlc2NyaXB0b3JDdXN0b21pemVyIAorICAgICAgICAgKiBpbnRlcmZhY2UgYW5kIGlzIHRvIHJ1biBhZ2FpbnN0IGFuIGVuZXRpdHkncyBjbGFzcyBkZXNjcmlwdG9yIGFmdGVyIGFsbCAKKyAgICAgICAgICogbWV0YWRhdGEgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIAorICAgICAgICAgKiBvciBFbWJlZGRhYmxlIGNsYXNzLiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDdXN0b21pemVyIGlzIG5vdCAKKyAgICAgICAgICogaW5oZXJpdGVkIGZyb20gaXRzIHBhcmVudCBjbGFzc2VzLiAKKyAgICAgICAgICovIAorICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDdXN0b21pemVyIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyB0aGF0IAorICAgICAgICAgICAqIHNob3VsZCBiZSBhcHBsaWVkIGZvciB0aGUgcmVsYXRlZCBlbnRpdHkgb3IgZW1iZWRkYWJsZSBjbGFzcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDbGFzcyB2YWx1ZSgpOyAKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXJlY3Rpb24tdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIC8qKiAKKyAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbi4KKyAgICAgICAgICogSXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgCisgICAgICAgICAqIHBhcmFtZXRlcnMgb2YgYSBuYW1lZCBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGVudW0gRGlyZWN0aW9uIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBJbnB1dCBwYXJhbWV0ZXIKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBJTiwKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIE91dHB1dCBwYXJhbWV0ZXIKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBPVVQsCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBJbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcgorICAgICAgICAgICAqLworICAgICAgICAgIElOX09VVCwKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIE91dHB1dCBjdXJzb3IKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBPVVRfQ1VSU09SCisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVQiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOX09VVCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUX0NVUlNPUiIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LW1hcHBpbmdzIj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBtYXBwaW5nCisgICAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgorCisgICAgICAgICAgMS4gVGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBjb250YWlucyBtZXRhZGF0YQorICAgICAgICAgIGZvciB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCBpZiB0aGlzIGVsZW1lbnQKKyAgICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KKworICAgICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKKyAgICAgICAgICB0aGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBkZWZpbmVkIGluCisgICAgICAgICAgdGhlIHNhbWUgZmlsZSBpbiB3aGljaCB0aGV5IG9jY3VyLgorCisgICAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKKyAgICAgICAgICBuYW1lZC1uYXRpdmUtcXVlcnkgYW5kIHNxbC1yZXN1bHQtc2V0LW1hcHBpbmcgZWxlbWVudHMgYXJlIGdsb2JhbAorICAgICAgICAgIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCisgICAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCisgICAgICAgICAgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyBhbHNvCisgICAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSwgbmFtZWQtbmF0aXZlLXF1ZXJ5LCBvcgorICAgICAgICAgIHJlc3VsdC1zZXQtbWFwcGluZyBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBtYXBwaW5nCisgICAgICAgICAgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LgorCisgICAgICAgICAgNC4gVGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZWFjaCBkZWZpbmUKKyAgICAgICAgICB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBtYW5hZ2VkIHBlcnNpc3RlbnQgY2xhc3MuIFRoZSBtYXBwaW5nCisgICAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKKyAgICAgICAgICBiZSBwYXJ0aWFsLgorCisgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyIgdHlwZT0ib3JtOm1hcHBlZC1zdXBlcmNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGFibGUiIHR5cGU9Im9ybTplbWJlZGRhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uVHlwZSIgZml4ZWQ9IjIuMCIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKKyAgICAgICAgICogY2hlY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIGVudGl0aWVzLgorICAgICAgICAgKiAKKyAgICAgICAgICogQW4gZXhpc3RlbmNlLWNoZWNraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uIGFuIEVudGl0eSBvciAKKyAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbm5vdGF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRXhpc3RlbmNlQ2hlY2tpbmcgeworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBTZXQgdGhlIGV4aXN0ZW5jZSBjaGVjayBmb3IgZGV0ZXJtaW5pbmcKKyAgICAgICAgICAgKiBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LgorICAgICAgICAgICAqLworICAgICAgICAgIEV4aXN0ZW5jZVR5cGUgdmFsdWUoKSBkZWZhdWx0IENIRUNLX0NBQ0hFOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCBhbmQgCisgICAgICAgICAqIGl0IGlzIGluIHRoZSBjYWNoZSwgdGhlbiBpdCBtdXN0IGV4aXN0LgorICAgICAgICAgKi8KKyAgICAgICAgQ0hFQ0tfQ0FDSEUsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm0gZG9lcyBleGlzdCBjaGVjayBvbiB0aGUgZGF0YWJhc2UuCisgICAgICAgICAqLworICAgICAgICBDSEVDS19EQVRBQkFTRSwKKworICAgICAgICAvKioKKyAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIHRoZW4gCisgICAgICAgICAqIGl0IG11c3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgCisgICAgICAgICAqIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4KKyAgICAgICAgICovCisgICAgICAgIEFTU1VNRV9FWElTVEVOQ0UsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFzc3VtZSB0aGF0IHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIAorICAgICAgICAgKiBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4gIAorICAgICAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIGZvcmNlIGFuIGluc2VydCB0byBiZSBjYWxsZWQuCisgICAgICAgICAqLworICAgICAgICBBU1NVTUVfTk9OX0VYSVNURU5DRQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+ICAgIAorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0NBQ0hFIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19EQVRBQkFTRSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX0VYSVNURU5DRSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4gCisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCisgICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKKworICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQsCisgICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQKKyAgICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBYTUwgbWFwcGluZyBmaWxlcyBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZQorICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTAorICAgICAgICBlbGVtZW50IHNldHRpbmdzLgorCisgICAgICAgIHNjaGVtYSAtIFVzZWQgYXMgdGhlIHNjaGVtYSBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywKKyAgICAgICAgICAgIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgZ2VuZXJhdG9ycworICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAorICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywKKyAgICAgICAgICAgIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgZ2VuZXJhdG9ycworICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAorICAgICAgICBhY2Nlc3MgLSBVc2VkIGFzIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbgorICAgICAgICAgICAgdGhlIHBlcnNpc3RlbmNlIHVuaXQKKyAgICAgICAgY2FzY2FkZS1wZXJzaXN0IC0gQWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMKKyAgICAgICAgICAgIGluIGFsbCBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdAorICAgICAgICBlbnRpdHktbGlzdGVuZXJzIC0gTGlzdCBvZiBkZWZhdWx0IGVudGl0eSBsaXN0ZW5lcnMgdG8gYmUgaW52b2tlZAorICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlbGltaXRlZC1pZGVudGlmaWVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGFuIGVudGl0eS4gSXMgYWxsb3dlZCB0byBiZQorICAgICAgICBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYW5ub3RhdGlvbnMuCisgICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8KKyAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcworICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4KKyAgICAgICAgdGhlIGRlZmF1bHRpbmcgcnVsZXMgZm9yIHRoZSBlbnRpdHkgYW5kIGl0cyBzdWItZWxlbWVudHMgd2lsbAorICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgorCisgICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ib3JtOnRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWNvbmRhcnktdGFibGUiIHR5cGU9Im9ybTpzZWNvbmRhcnktdGFibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXkiIHR5cGU9Im9ybTpwcmltYXJ5LWtleSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9Im9ybTppbmhlcml0YW5jZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImFjY2Vzcy10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgVGhpcyBlbGVtZW50IGRldGVybWluZXMgaG93IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBhY2Nlc3NlcyB0aGUKKyAgICAgICAgc3RhdGUgb2YgYW4gZW50aXR5IG9yIGVtYmVkZGVkIG9iamVjdC4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0e307CisgICAgICAgICAgSm9pblRhYmxlIGpvaW5UYWJsZSgpIGRlZmF1bHQgQEpvaW5UYWJsZTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIENvbHVtbiBjb2x1bW4oKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGVzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgVGhpcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBlbnRpdHkgZmllbGQgb3IgcHJvcGVydHkgbWFwcGluZ3MuCisgICAgICAgIEl0IG1heSBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgdG8gaW5jbHVkZSBvbmx5IGEgc3Vic2V0IG9mIHRoZQorICAgICAgICBmaWVsZHMgb3IgcHJvcGVydGllcy4gSWYgbWV0YWRhdGEtY29tcGxldGUgZm9yIHRoZSBlbnRpdHkgaXMgdHJ1ZQorICAgICAgICB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBkZWZhdWx0ZWQgYWNjb3JkaW5nCisgICAgICAgIHRvIHRoZSBkZWZhdWx0IHJ1bGVzLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJvcm06aWQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIiB0eXBlPSJvcm06YmFzaWMtY29sbGVjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLW1hcCIgdHlwZT0ib3JtOmJhc2ljLW1hcCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1tYW55IiB0eXBlPSJvcm06b25lLXRvLW1hbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tb25lIiB0eXBlPSJvcm06b25lLXRvLW9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiIHR5cGU9Im9ybTp2YXJpYWJsZS1vbmUtdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIiB0eXBlPSJvcm06ZWxlbWVudC1jb2xsZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiIgdHlwZT0ib3JtOnRyYW5zZm9ybWF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IiB0eXBlPSJvcm06dHJhbnNpZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWMgeworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7CisgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9iIiB0eXBlPSJvcm06bG9iIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNDb2xsZWN0aW9uIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAorICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCisgICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAorICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAorICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKKyAgICAgICAgICAgKiBMQVpZLgorICAgICAgICAgICAqLworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsgCisgCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKKyAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgorICAgICAgICAgICAqLworICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTplY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCisgICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKKyAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCisgICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCisgICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAorICAgICAgICAgICAqIExBWlkuCisgICAgICAgICAgICovCisgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKKyAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKKyAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfS0VZIi4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCisgICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAorICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCisgICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAorICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKKyAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCisgICAgICAgICAgICovCisgICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+ICAgIAorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgorICAgICAgPC94c2Q6Y2hvaWNlPiAgICAKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06ZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhc2NhZGUtdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIHB1YmxpYyBlbnVtIENhc2NhZGVUeXBlIHsgQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIfTsKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1hbGwiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIC8qKgorICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKKyAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5DbG9uZUNvcHlQb2xpY3kgb24gYW4gCisgICAgICAgICAqIEVudGl0eS4gQSBDbG9uZUNvcHlQb2xpY3kgbXVzdCBzcGVjaWZ5IGF0IG9uZSBvciBib3RoIG9mIHRoZSAibWV0aG9kIiAKKyAgICAgICAgICogb3IgIndvcmtpbmdDb3B5TWV0aG9kIi4gIndvcmtpbmdDb3B5TWV0aG9kIiBpcyB1c2VkIHRvIGNsb25lIG9iamVjdHMgCisgICAgICAgICAqIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgdXNlciBhcyB0aGV5IGFyZSByZWdpc3RlcmVkIGluIAorICAgICAgICAgKiBFY2xpcHNlTGluaydzIHRyYW5zYWN0aW9uYWwgbWVjaGFuaXNtLCB0aGUgVW5pdE9mV29yay4gIm1ldGhvZCIgd2lsbCAKKyAgICAgICAgICogYmUgdXNlZCBmb3IgdGhlIGNsb25lIHRoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiBpbiBjb25qdW5jdGlvbiB3aXRoIAorICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5CisgICAgICAgICAqICAKKyAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MKKyAgICAgICAgICogb3IgRW1iZWRkYWJsZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEV4YW1wbGU6CisgICAgICAgICAqIEBFbnRpdHkKKyAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiKQorICAgICAgICAgKiAKKyAgICAgICAgICogb3I6CisgICAgICAgICAqIAorICAgICAgICAgKiBARW50aXR5CisgICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIiwgd29ya2luZ0NvcHlNZXRob2Q9Im15V29ya2luZ0NvcHlDbG9uZU1ldGhvZCIpCisgICAgICAgICAqIAorICAgICAgICAgKiBvcjoKKyAgICAgICAgICogCisgICAgICAgICAqIEBFbnRpdHkKKyAgICAgICAgICogQENsb25lQ29weVBvbGljeSh3b3JraW5nQ29weU1ldGhvZE5hbWU9Im15V29ya2luZ0NvcHlDbG9uZSIpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDbG9uZUNvcHlQb2xpY3kgeworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIChPcHRpb25hbCkKKyAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQgdGhpcyBkZWZpbmVzIAorICAgICAgICAgICAgICogYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCB3aWxsIGJlIHVzZWQgCisgICAgICAgICAgICAgKiBmb3IgY29tcGFyaXNvbiBieQorICAgICAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCk7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogKE9wdGlvbmFsKQorICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZAorICAgICAgICAgICAgICogdGhpcyBkZWZpbmVzIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgCisgICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgd2hlbiByZWdpc3RlcmluZyBhbiAKKyAgICAgICAgICAgICAqIE9iamVjdCBpbiBhbiBFY2xpcHNlTGluayBVbml0T2ZXb3JrCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFN0cmluZyB3b3JraW5nQ29weU1ldGhvZCgpOworCisgICAgICAgIH0KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ3b3JraW5nLWNvcHktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgeworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRhYmxlLiBJZiBpdCBpcyBub3QgCisgICAgICAgICAgICogc3BlY2lmaWVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGZvbGxvd2luZzogCisgICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBlbnRpdHk7ICJfIiA7IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgCisgICAgICAgICAgICogcHJvcGVydHkgb3IgZmllbGQgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOyAKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhdGFsb2cgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCisgICAgICAgICAgICogdW5pdCBkZWZhdWx0IGNhdGFsb2cuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOyAKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNjaGVtYSBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKKyAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgc2NoZW1hLgorICAgICAgICAgICAqLworICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOyAKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY29sdW1uIHRoYXQgaXMgdXNlZCBhcyBhIAorICAgICAgICAgICAqIGZvcmVpZ24ga2V5IHRvIGpvaW4gdG8gYW5vdGhlciB0YWJsZS4gSWYgdGhlIHNvdXJjZSBlbnRpdHkgdXNlcyBhIAorICAgICAgICAgICAqIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtdXN0IGJlIHNwZWNpZmllZCAKKyAgICAgICAgICAgKiBmb3IgZWFjaCBmaWVsZCBvZiB0aGUgY29tcG9zaXRlIHByaW1hcnkga2V5LiBJbiBhIHNpbmdsZSBwcmltYXJ5IAorICAgICAgICAgICAqIGtleSBjYXNlLCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG1heSBvcHRpb25hbGx5IGJlIHNwZWNpZmllZC4gCisgICAgICAgICAgICogRGVmYXVsdGluZyB3aWxsIGFwcGx5IG90aGVyd2lzZSBhcyBmb2xsb3dzOgorICAgICAgICAgICAqIG5hbWUsIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSAKKyAgICAgICAgICAgKiBvZiB0aGUgc291cmNlIGVudGl0eS4gcmVmZXJlbmNlZENvbHVtbk5hbWUsIHRoZSBzYW1lIG5hbWUgb2YgCisgICAgICAgICAgICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIG9mIHRoZSBzb3VyY2UgZW50aXR5LgorICAgICAgICAgICAqLworICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsgCisgCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBVbmlxdWUgY29uc3RyYWludHMgdGhhdCBhcmUgdG8gYmUgcGxhY2VkIG9uIHRoZSB0YWJsZS4gCisgICAgICAgICAgICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpZiB0YWJsZSBnZW5lcmF0aW9uIGlzIGluIGVmZmVjdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OyAKKyAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOworICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKKyAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgorICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQorICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJzaW9uVmFsdWUgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgZGF0YWJhc2UgdmFsdWUuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSgpOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBvYmplY3QgdmFsdWUuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIG9iamVjdFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVydGVyIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVydGVyIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAorICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgorICAgICAgICAgICAqLworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAorICAgICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UuCisgICAgICAgICAgICovCisgICAgICAgICAgQ2xhc3MgY29udmVydGVyQ2xhc3MoKTsgCisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhIAorICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgb24gYW4gRW50aXR5LgorICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0aGF0IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAorICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgYmUgc3BlY2lmaWVkIAorICAgICAgICAgKiBhcyB0aGUgYXJndW1lbnQuCisgICAgICAgICAqIAorICAgICAgICAgKiBBIENvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3Mgb3IgCisgICAgICAgICAqIEVtYmVkZGFibGUuCisgICAgICAgICAqIAorICAgICAgICAgKiBGb3IgaW5zdGFuY2U6CisgICAgICAgICAqIEBFbnRpdHkKKyAgICAgICAgICogQENvcHlQb2xpY3koImV4YW1wbGUuTXlDb3B5UG9saWN5IikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvcHlQb2xpY3kgeworCisgICAgICAgIC8qCisgICAgICAgICogKFJlcXVpcmVkKQorICAgICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgY2xhc3Mgb2YgdGhlIGNvcHkgcG9saWN5LiBJdCBtdXN0IHNwZWNpZnkgYSBjbGFzcyAKKyAgICAgICAgKiB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5CisgICAgICAgICovCisgICAgICAgIENsYXNzIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbiB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJEVFlQRSI7CisgICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsKKyAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7CisgICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBBIERpc2NyaW1pbmF0b3JDbGFzcyBpcyB1c2VkIHdpdGhpbiBhIFZhcmlhYmxlT25lVG9PbmUgYW5ub3RhdGlvbi4KKyAgICAgICAgICovIAorICAgICAgICBAVGFyZ2V0KHt9KSAKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ2xhc3MgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRpc2NyaW1pbmF0b3IgdG8gYmUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3IoKTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNsYXNzIHRvIHRoZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCisgICAgICAgICAgICogZGlzY3JpbWluYXRvci4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDbGFzcyB2YWx1ZSgpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7IFNUUklORywgQ0hBUiwgSU5URUdFUiB9OworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFSIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR0VSIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvclZhbHVlIHsKKyAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnQtY29sbGVjdGlvbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVsZW1lbnRDb2xsZWN0aW9uIHsKKyAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMiI+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGVtYmVkZGFibGUgb2JqZWN0cy4gSXMKKyAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAorICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUKKyAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkCisgICAgICAgIGluIHRoZSBjbGFzcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwKKyAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRhYmxlIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQtaWQiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZElkIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXIiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBEZWZpbmVzIGFuIGVudGl0eSBsaXN0ZW5lciB0byBiZSBpbnZva2VkIGF0IGxpZmVjeWNsZSBldmVudHMKKyAgICAgICAgZm9yIHRoZSBlbnRpdGllcyB0aGF0IGxpc3QgdGhpcyBsaXN0ZW5lci4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgeworICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LXJlc3VsdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5UmVzdWx0IHsKKyAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcygpOworICAgICAgICAgIEZpZWxkUmVzdWx0W10gZmllbGRzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtcmVzdWx0IiB0eXBlPSJvcm06ZmllbGQtcmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBFbnVtVHlwZSB7CisgICAgICAgICAgT1JESU5BTCwKKyAgICAgICAgICBTVFJJTkcKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1JESU5BTCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7CisgICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXJlc3VsdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmllbGRSZXN1bHQgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgU3RyaW5nIGNvbHVtbigpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyYXRlZC12YWx1ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlIHsKKyAgICAgICAgICBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgQVVUTzsKKyAgICAgICAgICBTdHJpbmcgZ2VuZXJhdG9yKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTpnZW5lcmF0aW9uLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmF0b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkLWNsYXNzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWRDbGFzcyB7CisgICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpZC12YWxpZGF0aW9uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBUaGUgSWRWYWxpZGF0aW9uIGVudW0gZGV0ZXJtaW5lcyB0aGUgdHlwZSB2YWx1ZSB0aGF0IGFyZSB2YWxpZCBmb3IgYW4gSWQuCisgICAgICAgICAqIEJ5IGRlZmF1bHQgbnVsbCBpcyBub3QgYWxsb3dlZCwgYW5kIDAgaXMgbm90IGFsbG93IGZvciBzaW5nbGV0b24gaWRzIG9mIGxvbmcgb3IgaW50IHR5cGUuCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFpFUk8gZm9yIHNpbmdsZXRvbiBpZHMsIGFuZCBOVUxMIGZvciBjb21wb3NpdGUgaWRzLgorICAgICAgICAgKiBUaGlzIGNhbiBiZSBzZXQgdXNpbmcgdGhlIEBQcmltYXJ5S2V5IGFubm90YXRpb24sIG9yIENsYXNzRGVzY3JpcHRvciBBUEkuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlIFByaW1hcnlLZXkKKyAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5DbGFzc0Rlc2NyaXB0b3Ijc2V0SWRWYWxpZGF0aW9uKElkVmFsaWRhdGlvbikKKyAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCisgICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAxLjAgCisgICAgICAgICAqLyAKKyAgICAgICAgcHVibGljIGVudW0gSWRWYWxpZGF0aW9uIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogT25seSBudWxsIGlzIG5vdCBhbGxvd2VkIGFzIGFuIGlkIHZhbHVlLCAwIGlzIGFsbG93ZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIE5VTEwsCisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogbnVsbCBhbmQgMCBhcmUgbm90IGFsbG93ZWQsIChvbmx5IGludCBhbmQgbG9uZykuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFpFUk8sCisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogTm8gaWQgdmFsaWRhdGlvbiBpcyBkb25lLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBOT05FCisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlVMTCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkVSTyIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5oZXJpdGFuY2UgeworICAgICAgICAgIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlLXR5cGUiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpbmhlcml0YW5jZS10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlIHsgU0lOR0xFX1RBQkxFLCBKT0lORUQsIFRBQkxFX1BFUl9DTEFTUyB9OworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAorICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkluc3RhbnRpYXRpb25Db3B5UG9saWN5IAorICAgICAgICAgKiBvbiBhbiBFbnRpdHkuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHRoZSBkZWZhdWx0IENvcHlQb2xpY3kgaW4gCisgICAgICAgICAqIEVjbGlwc2VMaW5rIGFuZCB0aGVyZWZvcmUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBvbmx5IHVzZWQgdG8gCisgICAgICAgICAqIG92ZXJyaWRlIG90aGVyIHR5cGVzIG9mIGNvcHkgcG9saWNpZXMKKyAgICAgICAgICogCisgICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKKyAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgorICAgICAgICAgKiAKKyAgICAgICAgICogRXhhbXBsZToKKyAgICAgICAgICogQEVudGl0eQorICAgICAgICAgKiBASW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbnN0YW50aWF0aW9uQ29weVBvbGljeSB7CisgICAgICAgIH0KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi1jb2x1bW4iPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luQ29sdW1uIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7CisgICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqb2luLWZldGNoLXR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBKb2luRmV0Y2hUeXBlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCisgICAgICAgICAqIFRoaXMgZG9lcyBub3QgYWxsb3cgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgSU5ORVIsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCisgICAgICAgICAqIFRoaXMgYWxsb3dzIGZvciBudWxsL2VtcHR5IHZhbHVlcy4KKyAgICAgICAgICovCisgICAgICAgIE9VVEVSLAorICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5ORVIiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVEVSIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi10YWJsZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5UYWJsZSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEpvaW5Db2x1bW5bXSBpbnZlcnNlSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OworICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludmVyc2Utam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2stbW9kZS10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIHB1YmxpYyBlbnVtIExvY2tNb2RlVHlwZSB7IFJFQUQsIFdSSVRFLCBPUFRJTUlTVElDLAorICAgICAgICBPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgUEVTU0lNSVNUSUNfUkVBRCwgUEVTU0lNSVNUSUNfV1JJVEUsCisgICAgICAgIFBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgTk9ORX07CisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1JJVEUiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUMiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19SRUFEIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19XUklURSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvTWFueSB7CisgICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOworICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307CisgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOworICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgeworICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7CisgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXkgeworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5LWNsYXNzIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Q2xhc3MgeworICAgICAgICAgIENsYXNzIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY29sdW1uIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Q29sdW1uIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOworICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOworICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7CisgICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KKyAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleUpvaW5Db2x1bW4geworICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKKyAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCBmYWxzZTsKKyAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGEgbWFwcGVkIHN1cGVyY2xhc3MuIElzCisgICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKKyAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlCisgICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZAorICAgICAgICBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCBiZSByZWN1cnNpdmVseQorICAgICAgICBhcHBsaWVkLgorCisgICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5IiB0eXBlPSJvcm06cHJpbWFyeS1rZXkiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZE5hdGl2ZVF1ZXJ5IHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyBxdWVyeSgpOworICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7IC8vbmFtZWQgU3FsUmVzdWx0U2V0TWFwcGluZworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1xdWVyeSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUXVlcnkgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7CisgICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2stbW9kZSIgdHlwZT0ib3JtOmxvY2stbW9kZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIC8qKiAKKyAgICAgICAgICogQSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24gYWxsb3dzIHRoZSBkZWZpbml0aW9uIG9mIAorICAgICAgICAgKiBxdWVyaWVzIHRoYXQgY2FsbCBzdG9yZWQgcHJvY2VkdXJlcyBhcyBuYW1lZCBxdWVyaWVzLgorICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IKKyAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4gCisgICAgICAgICAqLyAKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSB7CisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKFJlcXVpcmVkKSBVbmlxdWUgbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhpcyBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgorICAgICAgICAgICAqLworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFF1ZXJ5IGhpbnRzLgorICAgICAgICAgICAqLworICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgUmVmZXJzIHRvIHRoZSBjbGFzcyBvZiB0aGUgcmVzdWx0LgorICAgICAgICAgICAqLworICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgU1FMUmVzdWx0TWFwcGluZy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgorICAgICAgICAgICAqLworICAgICAgICAgIFN0cmluZyBwcm9jZWR1cmVOYW1lKCk7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIHF1ZXJ5IHNob3VsZCByZXR1cm4gYSByZXN1bHQgc2V0LgorICAgICAgICAgICAqLworICAgICAgICAgIGJvb2xlYW4gcmV0dXJuc1Jlc3VsdFNldCgpIGRlZmF1bHQgdHJ1ZTsgCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgYXJndW1lbnRzIHRvIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgorICAgICAgICAgICAqLworICAgICAgICAgIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJvcm06c3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJvY2VkdXJlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5zLXJlc3VsdC1zZXQiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9iamVjdFR5cGVDb252ZXJ0ZXIgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQorICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQorICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UKKyAgICAgICAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCisgICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IAorICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgorICAgICAgICAgICAqLworICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGNvbnZlcnNpb24gdmFsdWVzIHRvIGJlIHVzZWQgCisgICAgICAgICAgICogd2l0aCB0aGUgb2JqZWN0IGNvbnZlcnRlci4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBDb252ZXJzaW9uVmFsdWVbXSBjb252ZXJzaW9uVmFsdWVzKCk7CisKKyAgICAgICAgICAgLyoqCisgICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSBhIGRlZmF1bHQgb2JqZWN0IHZhbHVlLiBVc2VkIGZvciAKKyAgICAgICAgICAgICogbGVnYWN5IGRhdGEgaWYgdGhlIGRhdGEgdmFsdWUgaXMgbWlzc2luZy4KKyAgICAgICAgICAgICovCisgICAgICAgICAgIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIiB0eXBlPSJvcm06Y29udmVyc2lvbi12YWx1ZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtb2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb01hbnkgeworICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKKyAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgPC94c2Q6Y2hvaWNlPgorICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICA8L3hzZDpjaG9pY2U+CisgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+CisgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgPC94c2Q6c2VxdWVuY2U+CisgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KKyAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9ycGhhbi1yZW1vdmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9PbmUgeworICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7CisgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGJvb2xlYW4gb3JwaGFuUmVtb3ZhbCgpIGRlZmF1bHQgZmFsc2U7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcy1pZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAvKiogCisgICAgICAgICAqIEFuIG9wdGltaXN0aWMtbG9ja2luZyBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKKyAgICAgICAgICogb3B0aW1pc3RpYyBsb2NraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyAKKyAgICAgICAgICogZW50aXRpZXMuIEFuIG9wdGltaXN0aWMtbG9ja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbgorICAgICAgICAgKiBhbiBlbnRpdHkgb3IgbWFwcGVkLXN1cGVyY2xhc3MuCisgICAgICAgICAqIAorICAgICAgICAgKiBJdCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG9wdGltaXN0aWMtbG9ja2luZy10eXBlLgorICAgICAgICAgKi8gCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KQorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9wdGltaXN0aWNMb2NraW5nIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgdG8gdXNlLgorICAgICAgICAgICAqLworICAgICAgICAgIE9wdGltaXN0aWNMb2NraW5nVHlwZSB0eXBlKCkgZGVmYXVsdCBWRVJTSU9OX0NPTFVNTjsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgb2YgdHlwZSAKKyAgICAgICAgICAgKiBTRUxFQ1RFRF9DT0xVTU5TLCB0aGlzIGFubm90YXRpb24gbWVtYmVyIGJlY29tZXMgYSAoUmVxdWlyZWQpIAorICAgICAgICAgICAqIGZpZWxkLgorICAgICAgICAgICAqLworICAgICAgICAgIENvbHVtbltdIHNlbGVjdGVkQ29sdW1ucygpIGRlZmF1bHQge307CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgd2hlcmUgdGhlIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgc2hvdWxkIAorICAgICAgICAgICAqIGNhc2NhZGUgbG9jay4gQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHdpdGggVkVSU0lPTl9DT0xVTU4gbG9ja2luZy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBib29sZWFuIGNhc2NhZGUoKSBkZWZhdWx0IGZhbHNlOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlbGVjdGVkLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAKKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXNjYWRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZy10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBBIHNpbXBsZSB0eXBlIHRoYXQgaXMgdXNlZCB3aXRoaW4gYW4gb3B0aW1pc3RpYy1sb2NraW5nIAorICAgICAgICAgKiBzcGVjaWZpY2F0aW9uIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2Ygb3B0aW1pc3RpYy1sb2NraW5nIHRoYXQKKyAgICAgICAgICogRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIG9yIGRlbGV0aW5nIGVudGl0aWVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGVudW0gT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgZXZlcnkgZmllbGQgaW4gdGhlIHRhYmxlCisgICAgICAgICAgICogaW4gdGhlIFdIRVJFIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZSBvciBhIGRlbGV0ZS4gSWYgYW55IGZpZWxkCisgICAgICAgICAgICogaGFzIGJlZW4gY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBBTExfQ09MVU1OUywKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBvbmx5IHRoZSBjaGFuZ2VkIGZpZWxkcworICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUuIElmIGFueSBmaWVsZCBoYXMgYmVlbgorICAgICAgICAgICAqIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIEEgZGVsZXRlCisgICAgICAgICAgICogd2lsbCBvbmx5IGNvbXBhcmUgdGhlIHByaW1hcnkga2V5LgorICAgICAgICAgICAqLworICAgICAgICAgIENIQU5HRURfQ09MVU1OUywKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIGNvbXBhcmVzIHNlbGVjdGVkIGZpZWxkcyBpbiB0aGUgV0hFUkUKKyAgICAgICAgICAgKiBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZCBoYXMgYmVlbgorICAgICAgICAgICAqIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIE5vdGUgdGhhdAorICAgICAgICAgICAqIHRoZSBmaWVsZHMgc3BlY2lmaWVkIG11c3QgYmUgbWFwcGVkIGFuZCBub3QgYmUgcHJpbWFyeSBrZXlzLgorICAgICAgICAgICAqLworICAgICAgICAgIFNFTEVDVEVEX0NPTFVNTlMsCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgYSBzaW5nbGUgdmVyc2lvbiBudW1iZXIKKyAgICAgICAgICAgKiBpbiB0aGUgd2hlcmUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBUaGUgdmVyc2lvbiBmaWVsZCBtdXN0IGJlCisgICAgICAgICAgICogbWFwcGVkIGFuZCBub3QgYmUgdGhlIHByaW1hcnkga2V5LgorICAgICAgICAgICAqLworICAgICAgICAgIFZFUlNJT05fQ09MVU1OCisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMX0NPTFVNTlMiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQU5HRURfQ09MVU1OUyIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VMRUNURURfQ09MVU1OUyIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkVSU0lPTl9DT0xVTU4iLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4gIAorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3JkZXItYnkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcmRlckJ5IHsKKyAgICAgICAgICBTdHJpbmcgdmFsdWUoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvcmRlci1jb2x1bW4iPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcmRlckNvbHVtbiB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7CisgICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOworICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGlvbi1tb2RlIiB0eXBlPSJvcm06b3JkZXItY29sdW1uLXZhbGlkYXRpb24tbW9kZSIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbi12YWxpZGF0aW9uLW1vZGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBwdWJsaWMgZW51bSBPcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlIHsKKyAgICAgICAgICBOT05FLAorICAgICAgICAgIENPUlJFQ1RJT04sCisgICAgICAgICAgRVhDRVBUSU9OCisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPUlJFQ1RJT04iLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYQ0VQVElPTiIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtbG9hZCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdExvYWQge30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcGVyc2lzdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFBlcnNpc3Qge30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcmVtb3ZlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UmVtb3ZlIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXVwZGF0ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFVwZGF0ZSB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXBlcnNpc3QiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVBlcnNpc3Qge30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXVwZGF0ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlVXBkYXRlIHt9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIC8qKgorICAgICAgICAgKiAgVGhlIFByaW1hcnlLZXkgYW5ub3RhdGlvbiBhbGxvd3MgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvZiB0aGUgSWQuCisgICAgICAgICAqICBBIHZhbGlkYXRpb24gcG9saWN5IGNhbiBiZSBnaXZlbiB0aGF0IGFsbG93cyBzcGVjaWZ5aW5nIGlmIHplcm8gaXMgYSB2YWxpZCBpZCB2YWx1ZS4KKyAgICAgICAgICogIFRoZSBzZXQgb2YgcHJpbWFyeSBrZXkgY29sdW1ucyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgcHJlY2lzZWx5LgorICAgICAgICAgKiAKKyAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCisgICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAxLjEKKyAgICAgICAgICovCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KQorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXkgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgQ29uZmlndXJlcyB3aGF0IGlkIHZhbGlkYXRpb24gaXMgZG9uZS4KKyAgICAgICAgICAgKiBCeSBkZWZhdWx0IDAgaXMgbm90IGEgdmFsaWQgaWQgdmFsdWUsIHRoaXMgY2FuIGJlIHVzZWQgdG8gYWxsb3cgMCBpZCB2YWx1ZXMuCisgICAgICAgICAgICovCisgICAgICAgICAgSWRWYWxpZGF0aW9uIHZhbGlkYXRpb24oKSBkZWZhdWx0IElkVmFsaWRhdGlvbi5aRVJPOyAKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IHRoZSBwcmltYXJ5IGtleSBjb2x1bW5zIGRpcmVjdGx5LgorICAgICAgICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBASWQgaWYgdGhlIHByaW1hcnkga2V5IGluY2x1ZGVzIGEgbm9uIGJhc2ljIGZpZWxkLAorICAgICAgICAgICAqIHN1Y2ggYXMgYSBmb3JlaWduIGtleSwgb3IgYSBpbmhlcml0YW5jZSBkaXNjcmltaW5hdG9yLCBlbWJlZGRlZCwgb3IgdHJhbnNmb3JtYXRpb24gbWFwcGVkIGZpZWxkLgorICAgICAgICAgICAqLworICAgICAgICAgIENvbHVtbltdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAKKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiB0eXBlPSJvcm06aWQtdmFsaWRhdGlvbiIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvcGVydHkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBBIHVzZXIgZGVmaW5lZCBtYXBwaW5nJ3MgcHJvcGVydHkuCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFRZUEV9KQorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByb3BlcnR5IHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBQcm9wZXJ0eSBuYW1lLgorICAgICAgICAgICAqLyAKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIFByb3BlcnR5IHZhbHVlLAorICAgICAgICAgICAqIGNvbnZlcnRlZCB0byBhbiBpbnN0YW5jZSBvZiB2YWx1ZVR5cGUuCisgICAgICAgICAgICovIAorICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogUHJvcGVydHkgdmFsdWUgdHlwZS4KKyAgICAgICAgICAgKiBUaGUgdmFsdWUgY29udmVydGVkIHRvIHZhbHVlVHlwZSBieSBDb252ZXJzaW9uTWFuYWdlci4KKyAgICAgICAgICAgKiBJZiBzcGVjaWZpZWQgbXVzdCBiZSBhIHNpbXBsZSB0eXBlIHRoYXQgY291bGQgYmUgaGFuZGxlZCBieSAKKyAgICAgICAgICAgKiBDb252ZXJzaW9uTWFuYWdlcjogCisgICAgICAgICAgICogbnVtZXJpY2FsLCBib29sZWFuLCB0ZW1wb3JhbC4gIAorICAgICAgICAgICAqLyAKKyAgICAgICAgICBDbGFzcyB2YWx1ZVR5cGUoKSBkZWZhdWx0IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1oaW50Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBRdWVyeUhpbnQgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgU3RyaW5nIHZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLXRyYW5zZm9ybWVyIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFubm90YXRpb24gZm9yIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KKyAgICAgICAgICogVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgd3JpdGUtb25seSwgaXQgc2hvdWxkIGhhdmUgYSAKKyAgICAgICAgICogUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIGNvbHVtbihzKSAKKyAgICAgICAgICogdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKKyAgICAgICAgICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCisgICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCisgICAgICAgICAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAorICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyKS4KKyAgICAgICAgICovCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJlYWRUcmFuc2Zvcm1lciB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKKyAgICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5BdHRyaWJ1dGVUcmFuc2Zvcm1lciAKKyAgICAgICAgICAgICAqIGludGVyZmFjZS4gVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkLCBpdHMgCisgICAgICAgICAgICAgKiBidWlsZEF0dHJpYnV0ZVZhbHVlIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZhbHVlIHRvIGJlIAorICAgICAgICAgICAgICogYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgorICAgICAgICAgICAgICovIAorICAgICAgICAgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAorICAgICAgICAgICAgICogYSB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlIChub3QgYXNzaWducyB0aGUgdmFsdWUgdG8gCisgICAgICAgICAgICAgKiB0aGUgYXR0cmlidXRlKS4gRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgCisgICAgICAgICAgICAgKiBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KKyAgICAgICAgICAgICAqLyAKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWNvbmRhcnktdGFibGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2VxdWVuY2VHZW5lcmF0b3IgeworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisgICAgICAgICAgU3RyaW5nIHNlcXVlbmNlTmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOworICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDE7CisgICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlcXVlbmNlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3FsUmVzdWx0U2V0TWFwcGluZyB7CisgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKyAgICAgICAgICBFbnRpdHlSZXN1bHRbXSBlbnRpdGllcygpIGRlZmF1bHQge307CisgICAgICAgICAgQ29sdW1uUmVzdWx0W10gY29sdW1ucygpIGRlZmF1bHQge307CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1yZXN1bHQiIHR5cGU9Im9ybTplbnRpdHktcmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLXJlc3VsdCIgdHlwZT0ib3JtOmNvbHVtbi1yZXN1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgLyoqIAorICAgICAgICAgKiBBIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uIGlzIHVzZWQgd2l0aGluIGEgCisgICAgICAgICAqIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbi4gCisgICAgICAgICAqLyAKKyAgICAgICAgQFRhcmdldCh7fSkKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIuCisgICAgICAgICAgICovCisgICAgICAgICAgRGlyZWN0aW9uIGRpcmVjdGlvbigpIGRlZmF1bHQgSU47CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyIG5hbWUuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgcXVlcnkgcGFyYW1ldGVyIG5hbWUuCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIHF1ZXJ5UGFyYW1ldGVyKCk7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIEphdmEgY2xhc3MgZGVzaXJlZCBiYWNrIGZyb20gdGhlIHByb2NlZHVyZSwgCisgICAgICAgICAgICogdGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJvY2VkdXJlLgorICAgICAgICAgICAqLworICAgICAgICAgIENsYXNzIHR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgY29kZSwgdGhpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgCisgICAgICAgICAgICogZnJvbSB0aGUgcHJvY2VkdXJlLgorICAgICAgICAgICAqLworICAgICAgICAgIGludCBqZGJjVHlwZSgpIGRlZmF1bHQgLTE7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgbmFtZSwgdGhpcyBtYXkgYmUgcmVxdWlyZWQgZm9yIEFSUkFZIG9yIAorICAgICAgICAgICAqIFNUUlVDVCB0eXBlcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBTdHJpbmcgamRiY1R5cGVOYW1lKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJvcm06ZGlyZWN0aW9uLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icXVlcnktcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RydWN0Q29udmVydGVyIHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAorICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgorICAgICAgICAgICAqLworICAgICAgICAgIFN0cmluZyBuYW1lKCk7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IAorICAgICAgICAgICAqIGltcGxlbWVudCB0aGUgRWNsaXBzZUxpbmsgaW50ZXJmYWNlIAorICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyCisgICAgICAgICAgICovCisgICAgICAgICAgU3RyaW5nIGNvbnZlcnRlcigpOyAKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLWdlbmVyYXRvciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlR2VuZXJhdG9yIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpOworICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBwa0NvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOworICAgICAgICAgIFN0cmluZyBwa0NvbHVtblZhbHVlKCkgZGVmYXVsdCAiIjsKKyAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwOworICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7CisgICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVtcG9yYWwgeworICAgICAgICAgIFRlbXBvcmFsVHlwZSB2YWx1ZSgpOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp0ZW1wb3JhbC10eXBlIi8+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbC10eXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKKyAgICAgICAgICBEQVRFLCAvLyBqYXZhLnNxbC5EYXRlCisgICAgICAgICAgVElNRSwgLy8gamF2YS5zcWwuVGltZQorICAgICAgICAgIFRJTUVTVEFNUCAvLyBqYXZhLnNxbC5UaW1lc3RhbXAKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFURSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRVNUQU1QIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAgCisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lLW9mLWRheSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe30pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGltZU9mRGF5IHsKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIEhvdXIgb2YgdGhlIGRheS4KKyAgICAgICAgICAgKi8gCisgICAgICAgICAgaW50IGhvdXIoKSBkZWZhdWx0IDA7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbnV0ZSBvZiB0aGUgZGF5LgorICAgICAgICAgICAqLyAKKyAgICAgICAgICBpbnQgbWludXRlKCkgZGVmYXVsdCAwOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBTZWNvbmQgb2YgdGhlIGRheS4KKyAgICAgICAgICAgKi8gCisgICAgICAgICAgaW50IHNlY29uZCgpIGRlZmF1bHQgMDsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgTWlsbGlzZWNvbmQgb2YgdGhlIGRheS4KKyAgICAgICAgICAgKi8gCisgICAgICAgICAgaW50IG1pbGxpc2Vjb25kKCkgZGVmYXVsdCAwOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogSW50ZXJuYWwgdXNlLiBEbyBub3QgbW9kaWZ5LgorICAgICAgICAgICAqLyAKKyAgICAgICAgICBib29sZWFuIHNwZWNpZmllZCgpIGRlZmF1bHQgdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaG91ciIgdHlwZT0ieHNkOmludGVnZXIiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaW51dGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2Vjb25kIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbGxpc2Vjb25kIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBpcyBhbiBvcHRpb25hbCBhbm5vdGF0aW9uIGZvciAKKyAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgorICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgYWxsb3dzIHRvIG1hcCBhbiBhdHRyaWJ1dGUgdG8gb25lIG9yIG1vcmUgCisgICAgICAgICAqIGRhdGFiYXNlIGNvbHVtbnMuCisgICAgICAgICAqIAorICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uIGlzIGFuIG9wdGlvbmFsIHBhcnQgb2YgCisgICAgICAgICAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBkZWZpbml0aW9uLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyAKKyAgICAgICAgICogd3JpdGUtb25seSwgaXQgc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgCisgICAgICAgICAqIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgorICAgICAgICAgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAorICAgICAgICAgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKKyAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKKyAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCisgICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLiAKKyAgICAgICAgICovIAorICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKKyAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2Zvcm1hdGlvbiB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCisgICAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAorICAgICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKKyAgICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAorICAgICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCisgICAgICAgICAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcHRpb25hbCBlbGVtZW50IGlzIGEgaGludCBhcyB0byB3aGV0aGVyIHRoZSB2YWx1ZQorICAgICAgICAgICAgICogIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSBtYXkgYmUgbnVsbC4gSXQgaXMgZGlzcmVnYXJkZWQKKyAgICAgICAgICAgICAqICBmb3IgcHJpbWl0aXZlIHR5cGVzLCB3aGljaCBhcmUgY29uc2lkZXJlZCBub24tb3B0aW9uYWwuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7CisgICAgICAgIH0KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOnJlYWQtdHJhbnNmb3JtZXIiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOndyaXRlLXRyYW5zZm9ybWVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zaWVudCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zaWVudCB7fQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLWNvbnZlcnRlciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFR5cGVDb252ZXJ0ZXIgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQorICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiBUaGUKKyAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlIGZpZWxkIAorICAgICAgICAgICAqIG9yIHByb3BlcnR5LgorICAgICAgICAgICAqLworICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKKyAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgZmllbGQgCisgICAgICAgICAgICogb3IgcHJvcGVydHkuCisgICAgICAgICAgICovCisgICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaXF1ZS1jb25zdHJhaW50Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQorICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7CisgICAgICAgICAgU3RyaW5nW10gY29sdW1uTmFtZXMoKTsKKyAgICAgICAgfQorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAvKiogCisgICAgICAgICAqIFZhcmlhYmxlIG9uZSB0byBvbmUgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcG9pbnRlciAKKyAgICAgICAgICogcmVmZXJlbmNlcyBiZXR3ZWVuIGEgamF2YSBvYmplY3QgYW5kIGFuIGltcGxlbWVudGVyIG9mIGFuIGludGVyZmFjZS4gCisgICAgICAgICAqIFRoaXMgbWFwcGluZyBpcyB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHBvaW50ZXIgKHN0b3JlZCBpbiBhbiAKKyAgICAgICAgICogaW5zdGFuY2UgdmFyaWFibGUpIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMuIEluIHRoZSAKKyAgICAgICAgICogcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZXMsIHRoZXNlIG1hcHBpbmdzIGFyZSBub3JtYWxseSBpbXBsZW1lbnRlZCAKKyAgICAgICAgICogdXNpbmcgYSBmb3JlaWduIGtleSBhbmQgYSB0eXBlIGNvZGUuCisgICAgICAgICAqIAorICAgICAgICAgKiBBIFZhcmlhYmxlT25lVG9PbmUgY2FuIGJlIHNwZWNpZmllZCB3aXRoaW4gYW4gRW50aXR5LCAKKyAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbmQgRW1iZWRkYWJsZSBjbGFzcy4gCisgICAgICAgICAqLyAKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIAorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZhcmlhYmxlT25lVG9PbmUgeworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGludGVyZmFjZSBjbGFzcyB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIAorICAgICAgICAgICAqIGFzc29jaWF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSAKKyAgICAgICAgICAgKiBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuCisgICAgICAgICAgICovCisgICAgICAgICAgQ2xhc3MgdGFyZ2V0SW50ZXJmYWNlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgY2FzY2FkZWQgdG8gdGhlIHRhcmdldCBvZiAKKyAgICAgICAgICAgKiB0aGUgYXNzb2NpYXRpb24uCisgICAgICAgICAgICovCisgICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCisgICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKKyAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAorICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAorICAgICAgICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAorICAgICAgICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgorICAgICAgICAgICAqLworICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7CisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIG9wdGlvbmFsLiBJZiBzZXQgdG8gZmFsc2UgCisgICAgICAgICAgICogdGhlbiBhIG5vbi1udWxsIHJlbGF0aW9uc2hpcCBtdXN0IGFsd2F5cyBleGlzdC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2lsbCBob2xkIHRoZSB0eXBlIAorICAgICAgICAgICAqIGluZGljYXRvcnMuIElmIHRoZSBEaXNjcmltaW5hdG9yQ29sdW1uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIAorICAgICAgICAgICAqIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiBkZWZhdWx0cyB0byAiRFRZUEUiIGFuZCB0aGUgCisgICAgICAgICAgICogZGlzY3JpbWluYXRvciB0eXBlIHRvIFNUUklORy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBEaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0IEBEaXNjcmltaW5hdG9yQ29sdW1uOworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbGlzdCBvZiBkaXNjcmltaW5hdG9yIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCAKKyAgICAgICAgICAgKiB0aGlzIFZhcmlhYmxlT25lVG9PbmUuIElmIG5vbmUgYXJlIHNwZWNpZmllZCB0aGVuIHRob3NlIGVudGl0aWVzIAorICAgICAgICAgICAqIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCB0aGF0IGltcGxlbWVudCB0aGUgdGFyZ2V0IGludGVyZmFjZSAKKyAgICAgICAgICAgKiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHR5cGVzLiBUaGUgZGlzY3JpbWluYXRvciB0eXBlIHdpbGwgCisgICAgICAgICAgICogZGVmYXVsdCBhcyBmb2xsb3dzOgorICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBTVFJJTkc6IEVudGl0eS5uYW1lKCkKKyAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgQ0hBUjogRmlyc3QgbGV0dGVyIG9mIHRoZSAKKyAgICAgICAgICAgKiAgICBFbnRpdHkgY2xhc3MKKyAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgSU5URUdFUjogVGhlIG5leHQgaW50ZWdlciBhZnRlciAKKyAgICAgICAgICAgKiAgICB0aGUgaGlnaGVzdCBpbnRlZ2VyIGV4cGxpY2l0bHkgYWRkZWQuCisgICAgICAgICAgICovCisgICAgICAgICAgRGlzY3JpbWluYXRvckNsYXNzW10gZGlzY3JpbWluYXRvckNsYXNzZXMoKSBkZWZhdWx0IHt9OworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+CisgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICAvKioKKyAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgorICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAorICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKKyAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCisgICAgICAgICAqICAKKyAgICAgICAgICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCisgICAgICAgICAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKKyAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKKyAgICAgICAgICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAorICAgICAgICAgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKKyAgICAgICAgICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCisgICAgICAgICAqLyAKKyAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCisgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKKyAgICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAorICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCisgICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAorICAgICAgICAgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCisgICAgICAgICAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKKyAgICAgICAgICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKKyAgICAgICAgICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgorICAgICAgICAgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KKyAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgorICAgICAgICAgICAgICovIAorICAgICAgICAgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAorICAgICAgICAgICAgICogYSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIGNvbHVtbi4KKyAgICAgICAgICAgICAqIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSBzdXBwb3J0ZWQgdGhlIAorICAgICAgICAgICAgICogbWV0aG9kIHNob3VsZCBiZSBkZWZpbmVkIHRvIHJldHVybiBhIHBhcnRpY3VsYXIgdHlwZSwgbm90IGp1c3QgCisgICAgICAgICAgICAgKiBPYmplY3QsIGZvciBpbnN0YW5jZToKKyAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGdldFN0YXJ0VGltZSgpLgorICAgICAgICAgICAgICogVGhlIG1ldGhvZCBtYXkgcmVxdWlyZSBhIFRyYW5zaWVudCBhbm5vdGF0aW9uIHRvIGF2b2lkIGJlaW5nIAorICAgICAgICAgICAgICogbWFwcGVkIGFzIEJhc2ljIGJ5IGRlZmF1bHQuCisgICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KKyAgICAgICAgICAgICAqLyAKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgorICAgICAgICAgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKKyAgICAgICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAorICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCisgICAgICAgICAgICAgKi8gCisgICAgICAgICAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOworICAgICAgICB9CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8L3hzZDpzY2hlbWE+CisKKwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL0VjbGlwc2VMaW5rSnBhUHJvamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL0VjbGlwc2VMaW5rSnBhUHJvamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDhlNTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvRWNsaXBzZUxpbmtKcGFQcm9qZWN0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOworCisvKioKKyAqIEVjbGlwc2VMaW5rIEpQQSBwcm9qZWN0LgorICogPHA+CisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0pwYVByb2plY3QKKwlleHRlbmRzIEpwYVByb2plY3QKK3sKKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbW9kZWwgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZpbGUKKwkgKiA8Y29kZT5NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sPC9jb2RlPiBpZiB0aGF0IGZpbGUgaGFzIHRoZQorCSAqIEVjbGlwc2VMaW5rIGNvbnRlbnQgdHlwZS4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbiNERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfRklMRV9QQVRICisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4jRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUKKwkgKi8KKwlKcGFYbWxSZXNvdXJjZSBnZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL0VjbGlwc2VMaW5rTWFwcGluZ0tleXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGUzYTk2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL0VjbGlwc2VMaW5rTWFwcGluZ0tleXMuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlOworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMgeworCisJU3RyaW5nIEJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZID0gImJhc2ljQ29sbGVjdGlvbiI7CisJU3RyaW5nIEJBU0lDX01BUF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAiYmFzaWNNYXAiOworCVN0cmluZyBUUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAidHJhbnNmb3JtYXRpb24iOworCVN0cmluZyBWQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJ2YXJpYWJsZU9uZVRvT25lIjsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzYTNlZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKKworLyoqCisgKiAKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcKK3sKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZGVmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKKworLyoqCisgKiAKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nIGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZworeworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxMzJkZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNNYXBwaW5nLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7CisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBleHRlbmRzIEJhc2ljTWFwcGluZworeworCUVjbGlwc2VMaW5rTXV0YWJsZSBnZXRNdXRhYmxlKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGQ5NDFhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OworCisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGVudW0gRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgeworCisJU0VORF9PQkpFQ1RfQ0hBTkdFUywKKwlJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKKwlTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywKKwlOT05FOworCQorCisJcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBmcm9tSmF2YVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGUgamF2YUNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgeworCQlpZiAoamF2YUNhY2hlQ29vcmRpbmF0aW9uVHlwZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlzd2l0Y2ggKGphdmFDYWNoZUNvb3JkaW5hdGlvblR5cGUpIHsKKwkJCWNhc2UgU0VORF9PQkpFQ1RfQ0hBTkdFUzoKKwkJCQlyZXR1cm4gU0VORF9PQkpFQ1RfQ0hBTkdFUzsKKwkJCWNhc2UgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFM6CisJCQkJcmV0dXJuIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTOworCQkJY2FzZSBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUzoKKwkJCQlyZXR1cm4gU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM7CisJCQljYXNlIE5PTkU6CisJCQkJcmV0dXJuIE5PTkU7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2FjaGUgY29vcmRpbmF0aW9uIHR5cGU6ICIgKyBqYXZhQ2FjaGVDb29yZGluYXRpb25UeXBlKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgeworCQlpZiAoY2FjaGVDb29yZGluYXRpb25UeXBlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXN3aXRjaCAoY2FjaGVDb29yZGluYXRpb25UeXBlKSB7CisJCQljYXNlIFNFTkRfT0JKRUNUX0NIQU5HRVM6CisJCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVM7CisJCQljYXNlIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTOgorCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzsKKwkJCWNhc2UgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM6CisJCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTOworCQkJY2FzZSBOT05FOgorCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5OT05FOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIGNvb3JkaW5hdGlvbiB0eXBlOiAiICsgY2FjaGVDb29yZGluYXRpb25UeXBlKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCQorCisJcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlIG9ybUNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgeworCQlpZiAob3JtQ2FjaGVDb29yZGluYXRpb25UeXBlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXN3aXRjaCAob3JtQ2FjaGVDb29yZGluYXRpb25UeXBlKSB7CisJCQljYXNlIFNFTkRfT0JKRUNUX0NIQU5HRVM6CisJCQkJcmV0dXJuIFNFTkRfT0JKRUNUX0NIQU5HRVM7CisJCQljYXNlIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTOgorCQkJCXJldHVybiBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzsKKwkJCWNhc2UgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM6CisJCQkJcmV0dXJuIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTOworCQkJY2FzZSBOT05FOgorCQkJCXJldHVybiBOT05FOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIGNvb3JkaW5hdGlvbiB0eXBlOiAiICsgb3JtQ2FjaGVDb29yZGluYXRpb25UeXBlKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCQorCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZSB0b09ybVJlc291cmNlTW9kZWwoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgY2FjaGVDb29yZGluYXRpb25UeXBlKSB7CisJCWlmIChjYWNoZUNvb3JkaW5hdGlvblR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJc3dpdGNoIChjYWNoZUNvb3JkaW5hdGlvblR5cGUpIHsKKwkJCWNhc2UgU0VORF9PQkpFQ1RfQ0hBTkdFUzoKKwkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTOworCQkJY2FzZSBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzoKKwkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzsKKwkJCWNhc2UgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM6CisJCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM7CisJCQljYXNlIE5PTkU6CisJCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuTk9ORTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSBjb29yZGluYXRpb24gdHlwZTogIiArIGNhY2hlQ29vcmRpbmF0aW9uVHlwZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGVUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkM2JkYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGVUeXBlLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKKworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBlbnVtIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIHsKKworCVNPRlRfV0VBSywKKwlIQVJEX1dFQUssCisJV0VBSywKKwlTT0ZULAorCUZVTEwsCisJQ0FDSEUsCisJTk9ORTsKKwkKKworCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtDYWNoZVR5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlIGphdmFDYWNoZVR5cGUpIHsKKwkJaWYgKGphdmFDYWNoZVR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJc3dpdGNoIChqYXZhQ2FjaGVUeXBlKSB7CisJCQljYXNlIEZVTEw6CisJCQkJcmV0dXJuIEZVTEw7CisJCQljYXNlIFdFQUs6CisJCQkJcmV0dXJuIFdFQUs7CisJCQljYXNlIFNPRlQ6CisJCQkJcmV0dXJuIFNPRlQ7CisJCQljYXNlIFNPRlRfV0VBSzoKKwkJCQlyZXR1cm4gU09GVF9XRUFLOworCQkJY2FzZSBIQVJEX1dFQUs6CisJCQkJcmV0dXJuIEhBUkRfV0VBSzsKKwkJCWNhc2UgQ0FDSEU6CisJCQkJcmV0dXJuIENBQ0hFOworCQkJY2FzZSBOT05FOgorCQkJCXJldHVybiBOT05FOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIHR5cGU6ICIgKyBqYXZhQ2FjaGVUeXBlKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGNhY2hlVHlwZSkgeworCQlpZiAoY2FjaGVUeXBlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXN3aXRjaCAoY2FjaGVUeXBlKSB7CisJCQljYXNlIEZVTEw6CisJCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLkZVTEw7CisJCQljYXNlIFdFQUs6CisJCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLldFQUs7CisJCQljYXNlIFNPRlQ6CisJCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLlNPRlQ7CisJCQljYXNlIFNPRlRfV0VBSzoKKwkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuU09GVF9XRUFLOworCQkJY2FzZSBIQVJEX1dFQUs6CisJCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLkhBUkRfV0VBSzsKKwkJCWNhc2UgQ0FDSEU6CisJCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLkNBQ0hFOworCQkJY2FzZSBOT05FOgorCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5OT05FOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIHR5cGU6ICIgKyBjYWNoZVR5cGUpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJCisKKwlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUgb3JtQ2FjaGVUeXBlKSB7CisJCWlmIChvcm1DYWNoZVR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJc3dpdGNoIChvcm1DYWNoZVR5cGUpIHsKKwkJCWNhc2UgRlVMTDoKKwkJCQlyZXR1cm4gRlVMTDsKKwkJCWNhc2UgV0VBSzoKKwkJCQlyZXR1cm4gV0VBSzsKKwkJCWNhc2UgU09GVDoKKwkJCQlyZXR1cm4gU09GVDsKKwkJCWNhc2UgU09GVF9XRUFLOgorCQkJCXJldHVybiBTT0ZUX1dFQUs7CisJCQljYXNlIEhBUkRfV0VBSzoKKwkJCQlyZXR1cm4gSEFSRF9XRUFLOworCQkJY2FzZSBDQUNIRToKKwkJCQlyZXR1cm4gQ0FDSEU7CisJCQljYXNlIE5PTkU6CisJCQkJcmV0dXJuIE5PTkU7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2FjaGUgdHlwZTogIiArIG9ybUNhY2hlVHlwZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwkKKwlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGNhY2hlVHlwZSkgeworCQlpZiAoY2FjaGVUeXBlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXN3aXRjaCAoY2FjaGVUeXBlKSB7CisJCQljYXNlIEZVTEw6CisJCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTDsKKwkJCWNhc2UgV0VBSzoKKwkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5XRUFLOworCQkJY2FzZSBTT0ZUOgorCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLlNPRlQ7CisJCQljYXNlIFNPRlRfV0VBSzoKKwkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5TT0ZUX1dFQUs7CisJCQljYXNlIEhBUkRfV0VBSzoKKwkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5IQVJEX1dFQUs7CisJCQljYXNlIENBQ0hFOgorCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkNBQ0hFOworCQkJY2FzZSBOT05FOgorCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLk5PTkU7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2FjaGUgdHlwZTogIiArIGNhY2hlVHlwZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NhY2hpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2EyOGMxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEKQEAgLTAsMCArMSwyMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7CisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NhY2hpbmcgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQoreworCS8vKioqKioqKioqKioqKioqKiogc2hhcmVkICoqKioqKioqKioqKioqKioqKioqKioqKgorCQorCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRTaGFyZWQgYW5kIHNwZWNpZmllZFNoYXJlZC4KKwkgKiBJZiBnZXRTcGVjaWZpZWRTaGFyZWQoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGlzRGVmYXVsdFNoYXJlZCgpCisJICovCisJYm9vbGVhbiBpc1NoYXJlZCgpOworCQorCWJvb2xlYW4gaXNEZWZhdWx0U2hhcmVkKCk7CisJCVN0cmluZyBERUZBVUxUX1NIQVJFRF9QUk9QRVJUWSA9ICJkZWZhdWx0U2hhcmVkIjsgLy8kTk9OLU5MUy0xJAorCQlib29sZWFuIERFRkFVTFRfU0hBUkVEID0gdHJ1ZTsKKwkKKwlCb29sZWFuIGdldFNwZWNpZmllZFNoYXJlZCgpOworCQorCS8qKgorCSAqIFNldHRpbmcgdGhpcyB0byBmYWxzZSBtZWFucyB0aGF0IGNhY2hlVHlwZSwgY2FjaGVTaXplLCBhbHdheXNSZWZyZXNoLCAKKwkgKiByZWZyZXNoT25seUlmTmV3ZXIsIGRpc2FibGVIaXRzLCBjYWNoZUNvb3JkaW5hdGlvblR5cGUgd2lsbCBhbGwgYmUgc2V0IAorCSAqIHRvIHRoZWlyIGRlZmF1bHQgc3RhdGVzLiAgVGhlc2Ugc2V0dGluZ3MgZG8gbm90IGFwcGx5IHRvIGEgY2FjaGUgdGhhdCBpcyBub3Qgc2hhcmVkCisJICogQHBhcmFtIG5ld1NwZWNpZmllZFNoYXJlZAorCSAqLworCXZvaWQgc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4gbmV3U3BlY2lmaWVkU2hhcmVkKTsKKwkJU3RyaW5nIFNQRUNJRklFRF9TSEFSRURfUFJPUEVSVFkgPSAic3BlY2lmaWVkU2hhcmVkIjsgLy8kTk9OLU5MUy0xJAorCQorCQorCS8vKioqKioqKioqKioqKioqKiogY2FjaGUgdHlwZSAqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29tYmluYXRpb24gb2YgZGVmYXVsdFR5cGUgYW5kIHNwZWNpZmllZFR5cGUuCisJICogSWYgZ2V0U3BlY2lmaWVkVHlwZSgpIHJldHVybnMgbnVsbCwgdGhlbiByZXR1cm4gZ2V0RGVmYXVsdFR5cGUoKQorCSAqLworCUVjbGlwc2VMaW5rQ2FjaGVUeXBlIGdldFR5cGUoKTsKKwkKKwlFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXREZWZhdWx0VHlwZSgpOwkJCisJCVN0cmluZyBERUZBVUxUX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdFR5cGUiOyAvLyROT04tTkxTLTEkCisJCUVjbGlwc2VMaW5rQ2FjaGVUeXBlIERFRkFVTFRfVFlQRSA9IEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSzsKKwkJCisJRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0U3BlY2lmaWVkVHlwZSgpOwkKKwl2b2lkIHNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUgbmV3U3BlY2lmaWVkVHlwZSk7CisJCVN0cmluZyBTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRUeXBlIjsgLy8kTk9OLU5MUy0xJAorCQorCQorCS8vKioqKioqKioqKioqKioqKiogc2l6ZSAqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCQorCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRTaXplIGFuZCBzcGVjaWZpZWRTaXplLgorCSAqIElmIGdldFNwZWNpZmllZFNpemUoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHRTaXplKCkKKwkgKi8KKwlpbnQgZ2V0U2l6ZSgpOworCisJaW50IGdldERlZmF1bHRTaXplKCk7CisJaW50IERFRkFVTFRfU0laRSA9IDEwMDsKKwkJU3RyaW5nIERFRkFVTFRfU0laRV9QUk9QRVJUWSA9ICJkZWZhdWx0U2l6ZSI7IC8vJE5PTi1OTFMtMSQKKworCUludGVnZXIgZ2V0U3BlY2lmaWVkU2l6ZSgpOworCXZvaWQgc2V0U3BlY2lmaWVkU2l6ZShJbnRlZ2VyIG5ld1NwZWNpZmllZFNpemUpOworCQlTdHJpbmcgU1BFQ0lGSUVEX1NJWkVfUFJPUEVSVFkgPSAic3BlY2lmaWVkU2l6ZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvLyoqKioqKioqKioqKioqKioqIGFsd2F5cyByZWZyZXNoICoqKioqKioqKioqKioqKioqKioqKioqKgkJCisJCQorCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRBbHdheXNSZWZyZXNoIGFuZCBzcGVjaWZpZWRBbHdheXNSZWZyZXNoLgorCSAqIElmIGdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKQorCSAqLworCWJvb2xlYW4gaXNBbHdheXNSZWZyZXNoKCk7CisJCisJYm9vbGVhbiBpc0RlZmF1bHRBbHdheXNSZWZyZXNoKCk7CisJCVN0cmluZyBERUZBVUxUX0FMV0FZU19SRUZSRVNIX1BST1BFUlRZID0gImRlZmF1bHRBbHdheXNSZWZyZXNoIjsgLy8kTk9OLU5MUy0xJAorCQlib29sZWFuIERFRkFVTFRfQUxXQVlTX1JFRlJFU0ggPSBmYWxzZTsKKwkKKwlCb29sZWFuIGdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKTsKKwl2b2lkIHNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbiBuZXdTcGVjaWZpZWRBbHdheXNSZWZyZXNoKTsKKwkJU3RyaW5nIFNQRUNJRklFRF9BTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRBbHdheXNSZWZyZXNoIjsgLy8kTk9OLU5MUy0xJAorCisKKwkvLyoqKioqKioqKioqKioqKioqIHJlZnJlc2ggb25seSBpZiBuZXdlciAqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCisJLyoqCisJICogVGhpcyBpcyB0aGUgY29tYmluYXRpb24gb2YgZGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlciBhbmQgc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyLgorCSAqIElmIGdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpIHJldHVybnMgbnVsbCwgdGhlbiByZXR1cm4gaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkKKwkgKi8KKwlib29sZWFuIGlzUmVmcmVzaE9ubHlJZk5ld2VyKCk7CisJCisJYm9vbGVhbiBpc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKTsKKwkJU3RyaW5nIERFRkFVTFRfUkVGUkVTSF9PTkxZX0lGX05FV0VSX1BST1BFUlRZID0gImRlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIiOyAvLyROT04tTkxTLTEkCisJCWJvb2xlYW4gREVGQVVMVF9SRUZSRVNIX09OTFlfSUZfTkVXRVIgPSBmYWxzZTsKKwkKKwlCb29sZWFuIGdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpOworCXZvaWQgc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4gbmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKTsKKwkJU3RyaW5nIFNQRUNJRklFRF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFkgPSAic3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyIjsgLy8kTk9OLU5MUy0xJAorCisJCQorCS8vKioqKioqKioqKioqKioqKiogZGlzYWJsZSBoaXRzICoqKioqKioqKioqKioqKioqKioqKioqKgorCQkKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBkZWZhdWx0RGlzYWJsZUhpdHMgYW5kIHNwZWNpZmllZERpc2FibGVIaXRzLgorCSAqIElmIGdldFNwZWNpZmllZERpc2FibGVIaXRzKCkgcmV0dXJucyBudWxsLCB0aGVuIHJldHVybiBnZXREZWZhdWx0RGlzYWJsZUhpdHMoKQorCSAqLworCWJvb2xlYW4gaXNEaXNhYmxlSGl0cygpOworCQorCWJvb2xlYW4gaXNEZWZhdWx0RGlzYWJsZUhpdHMoKTsKKwkJU3RyaW5nIERFRkFVTFRfRElTQUJMRV9ISVRTX1BST1BFUlRZID0gImRlZmF1bHREaXNhYmxlSGl0cyI7IC8vJE5PTi1OTFMtMSQKKwkJYm9vbGVhbiBERUZBVUxUX0RJU0FCTEVfSElUUyA9IGZhbHNlOworCQorCUJvb2xlYW4gZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKTsKKwl2b2lkIHNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4gbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHMpOworCQlTdHJpbmcgU1BFQ0lGSUVEX0RJU0FCTEVfSElUU19QUk9QRVJUWSA9ICJzcGVjaWZpZWREaXNhYmxlSGl0cyI7IC8vJE5PTi1OTFMtMSQKKworCQkKKwkvLyoqKioqKioqKioqKioqKioqIGNvb3JkaW5hdGlvbiB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKgorCQorCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRDb29yZGluYXRpb25UeXBlIGFuZCBzcGVjaWZpZWRDb29yZGluYXRpb25UeXBlLgorCSAqIElmIGdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkKKwkgKi8KKwlFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRDb29yZGluYXRpb25UeXBlKCk7CisJCisJRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKTsJCQorCQlTdHJpbmcgREVGQVVMVF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSA9ICJkZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKKwkJRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgREVGQVVMVF9DT09SRElOQVRJT05fVFlQRSA9IEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVM7CisJCQorCUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKTsJCisJdm9pZCBzZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIG5ld1NwZWNpZmllZENvb3JkaW5hdGlvblR5cGUpOworCQlTdHJpbmcgU1BFQ0lGSUVEX0NPT1JESU5BVElPTl9UWVBFX1BST1BFUlRZID0gInNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCisKKwkJCQorCS8vKioqKioqKioqKioqKioqKiogZXhpc3RlbmNlIGNoZWNraW5nICoqKioqKioqKioqKioqKioqKioqKioqKgorCQorCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRFeGlzdGVuY2VUeXBlIGFuZCBzcGVjaWZpZWRFeGlzdGVuY2VUeXBlLgorCSAqIElmIGdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkKKwkgKi8KKwlFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0RXhpc3RlbmNlVHlwZSgpOworCQorCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpOwkJCisJCVN0cmluZyBERUZBVUxUX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZID0gImRlZmF1bHRFeGlzdGVuY2VUeXBlIjsgLy8kTk9OLU5MUy0xJAorCQlFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgREVGQVVMVF9FWElTVEVOQ0VfVFlQRSA9IEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRTsKKwkJCisJRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKTsJCisJdm9pZCBzZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBuZXdTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKTsKKwkJU3RyaW5nIFNQRUNJRklFRF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRFeGlzdGVuY2VUeXBlIjsgLy8kTk9OLU5MUy0xJAorCisJCQorCS8vKioqKioqKioqKioqKioqKiogZXhwaXJ5ICoqKioqKioqKioqKioqKioqKioqKioqKgorCisJLyoqCisJICogY29ycmVzcG9uZHMgdG8gdGhlIENhY2hlIGV4cGlyeSBlbGVtZW50LiAgSWYgdGhpcyByZXR1cm5zCisJICogYSBub24tbnVsbCB2YWx1ZSB0aGVuIGdldEV4cGlyeVRpbWVPZkRheSB3aWxsIHJldHVybiBudWxsLgorCSAqIEl0IGlzIG5vdCB2YWxpZCB0byBzcGVjaWZ5IGJvdGgKKwkgKi8KKwlJbnRlZ2VyIGdldEV4cGlyeSgpOworCQorCS8qKgorCSAqIFNldHRpbmcgdGhpcyB0byBhIG5vbi1udWxsIHZhbHVlIHdpbGwgc2V0IHRpbWVPZkRheUV4cGlyeSB0byBudWxsCisJICogQHBhcmFtIGV4cGlyeQorCSAqLworCXZvaWQgc2V0RXhwaXJ5KEludGVnZXIgZXhwaXJ5KTsKKwkJU3RyaW5nIEVYUElSWV9QUk9QRVJUWSA9ICJleHBpcnkiOyAvLyROT04tTkxTLTEkCisJCisJCQorCS8qKgorCSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBDYWNoZSBleHBpcnlUaW1lT2ZEYXkgYW5ub3RhdGlvbiBvciB4bWwgZWxlbWVudC4gIAorCSAqIElmIHRoaXMgcmV0dXJucyBhIG5vbi1udWxsIHZhbHVlIHRoZW4gZ2V0RXhwaXJ5IHdpbGwgcmV0dXJuIG51bGwuCisJICogSXQgaXMgbm90IHZhbGlkIHRvIHNwZWNpZnkgYm90aC4KKwkgKi8KKwlFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSBnZXRFeHBpcnlUaW1lT2ZEYXkoKTsKKwkKKwkvKioKKwkgKiBBZGQgQ2FjaGUgZXhwaXJ5VGltZU9mRGF5IGFubm90YXRpb24gb3IgeG1sIGVsZW1lbnQsIHRoaXMgd2lsbCBzZXQgCisJICogRXhwaXJ5IHRvIG51bGwgYXMgaXQgaXMgbm90IHZhbGlkIHRvIHNldCBib3RoIGV4cGlyeSBhbmQgdGltZU9mRGF5RXhwaXJ5CisJICovCisJRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkgYWRkRXhwaXJ5VGltZU9mRGF5KCk7CisJCisJLyoqCisJICogUmVtb3ZlcyB0aGUgQ2FjaGUgZXhwaXJ5VGltZU9mRGF5IGFubm90YXRpb24veG1sIGVsZW1lbnQKKwkgKi8KKwl2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheSgpOworCQlTdHJpbmcgRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZID0gImV4cGlyeVRpbWVPZkRheSI7IC8vJE5PTi1OTFMtMSQKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTUwNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQoreworCS8qKgorCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRUeXBlIGFuZCBzcGVjaWZpZWRUeXBlLgorCSAqIElmIGdldFNwZWNpZmllZFR5cGUoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHRUeXBlKCkKKwkgKi8KKwlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXRUeXBlKCk7CisJCisJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0RGVmYXVsdFR5cGUoKTsJCQorCQlTdHJpbmcgREVGQVVMVF9UWVBFX1BST1BFUlRZID0gImRlZmF1bHRUeXBlIjsgLy8kTk9OLU5MUy0xJAorCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBERUZBVUxUX1RZUEUgPSBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPOworCQkKKwlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXRTcGVjaWZpZWRUeXBlKCk7CQorCXZvaWQgc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBuZXdTcGVjaWZpZWRUeXBlKTsKKwkJU3RyaW5nIFNQRUNJRklFRF9UWVBFX1BST1BFUlRZID0gInNwZWNpZmllZFR5cGUiOyAvLyROT04tTkxTLTEkCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkYzQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGU7CisKKworLyoqCisgKiAKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgZW51bSBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSB7CisKKwlBVFRSSUJVVEUsCisJT0JKRUNULAorCURFRkVSUkVELAorCUFVVE87CisJCisKKwlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZSBqYXZhQ2hhbmdlVHJhY2tpbmdUeXBlKSB7CisJCWlmIChqYXZhQ2hhbmdlVHJhY2tpbmdUeXBlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXN3aXRjaCAoamF2YUNoYW5nZVRyYWNraW5nVHlwZSkgeworCQkJY2FzZSBBVFRSSUJVVEU6CisJCQkJcmV0dXJuIEFUVFJJQlVURTsKKwkJCWNhc2UgT0JKRUNUOgorCQkJCXJldHVybiBPQkpFQ1Q7CisJCQljYXNlIERFRkVSUkVEOgorCQkJCXJldHVybiBERUZFUlJFRDsKKwkJCWNhc2UgQVVUTzoKKwkJCQlyZXR1cm4gQVVUTzsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjaGFuZ2UgdHJhY2tpbmcgdHlwZTogIiArIGphdmFDaGFuZ2VUcmFja2luZ1R5cGUpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlIHRvSmF2YVJlc291cmNlTW9kZWwoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgY2hhbmdlVHJhY2tpbmdUeXBlKSB7CisJCWlmIChjaGFuZ2VUcmFja2luZ1R5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJc3dpdGNoIChjaGFuZ2VUcmFja2luZ1R5cGUpIHsKKwkJCWNhc2UgQVRUUklCVVRFOgorCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEU7CisJCQljYXNlIE9CSkVDVDoKKwkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUOworCQkJY2FzZSBERUZFUlJFRDoKKwkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQ7CisJCQljYXNlIEFVVE86CisJCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE87CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2hhbmdlIHRyYWNraW5nIHR5cGU6ICIgKyBjaGFuZ2VUcmFja2luZ1R5cGUpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJCisJcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChYbWxDaGFuZ2VUcmFja2luZ1R5cGUgb3JtQ2hhbmdlVHJhY2tpbmdUeXBlKSB7CisJCWlmIChvcm1DaGFuZ2VUcmFja2luZ1R5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJc3dpdGNoIChvcm1DaGFuZ2VUcmFja2luZ1R5cGUpIHsKKwkJCWNhc2UgQVRUUklCVVRFOgorCQkJCXJldHVybiBBVFRSSUJVVEU7CisJCQljYXNlIE9CSkVDVDoKKwkJCQlyZXR1cm4gT0JKRUNUOworCQkJY2FzZSBERUZFUlJFRDoKKwkJCQlyZXR1cm4gREVGRVJSRUQ7CisJCQljYXNlIEFVVE86CisJCQkJcmV0dXJuIEFVVE87CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2hhbmdlIHRyYWNraW5nIHR5cGU6ICIgKyBvcm1DaGFuZ2VUcmFja2luZ1R5cGUpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJCisJcHVibGljIHN0YXRpYyBYbWxDaGFuZ2VUcmFja2luZ1R5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGNoYW5nZVRyYWNraW5nVHlwZSkgeworCQlpZiAoY2hhbmdlVHJhY2tpbmdUeXBlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXN3aXRjaCAoY2hhbmdlVHJhY2tpbmdUeXBlKSB7CisJCQljYXNlIEFUVFJJQlVURToKKwkJCQlyZXR1cm4gWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURTsKKwkJCWNhc2UgT0JKRUNUOgorCQkJCXJldHVybiBYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUOworCQkJY2FzZSBERUZFUlJFRDoKKwkJCQlyZXR1cm4gWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEOworCQkJY2FzZSBBVVRPOgorCQkJCXJldHVybiBYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTzsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjaGFuZ2UgdHJhY2tpbmcgdHlwZTogIiArIGNoYW5nZVRyYWNraW5nVHlwZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NTVjNTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gYSBDb252ZXJzaW9uVmFsdWUgcmVzb3VyY2UgbW9kZWwgb2JqZWN0CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBleHRlbmRzIEpwYUNvbnRleHROb2RlCit7CisJU3RyaW5nIGdldERhdGFWYWx1ZSgpOwkKKwl2b2lkIHNldERhdGFWYWx1ZShTdHJpbmcgZGF0YVZhbHVlKTsKKwkJU3RyaW5nIERBVEFfVkFMVUVfUFJPUEVSVFkgPSAiZGF0YVZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCQkKKwlTdHJpbmcgZ2V0T2JqZWN0VmFsdWUoKTsJCisJdm9pZCBzZXRPYmplY3RWYWx1ZShTdHJpbmcgb2JqZWN0VmFsdWUpOworCQlTdHJpbmcgT0JKRUNUX1ZBTFVFX1BST1BFUlRZID0gIm9iamVjdFZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCisJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGdldFBhcmVudCgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDb252ZXJ0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmVhNjI2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDb252ZXJ0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byBhIENvbnZlcnQgcmVzb3VyY2UgbW9kZWwgb2JqZWN0CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NvbnZlcnQgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZSwgQ29udmVydGVyCit7CisJCisJU3RyaW5nIEVDTElQU0VfTElOS19DT05WRVJURVIgPSAiZWNsaXBzZUxpbmtDb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCisJCisJU3RyaW5nIGdldENvbnZlcnRlck5hbWUoKTsKKwkKKwlTdHJpbmcgZ2V0RGVmYXVsdENvbnZlcnRlck5hbWUoKTsKKwkJU3RyaW5nIERFRkFVTFRfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFkgPSAiZGVmYXVsdENvbnZlcnRlck5hbWUiOyAvLyROT04tTkxTLTEkCisKKwlTdHJpbmcgZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpOworCQorCXZvaWQgc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZShTdHJpbmcgY29udmVydGVyTmFtZSk7CisJCVN0cmluZyBTUEVDSUZJRURfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ29udmVydGVyTmFtZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBSZXNlcnZlZCBuYW1lIGZvciBzcGVjaWZ5aW5nIGEgc2VyaWFsaXplZCBvYmplY3QgY29udmVydGVyLiAgSW4gdGhpcworCSAqIGNhc2UgdGhlcmUgZG9lcyBub3QgbmVlZCB0byBiZSBhIGNvcnJlc3BvbmRpbmcgQEN1c3RvbUNvbnZlcnRlciBkZWZpbmVkLgorCSAqLworCVN0cmluZyBTRVJJQUxJWkVEX0NPTlZFUlRFUiA9ICJzZXJpYWxpemVkIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFJlc2VydmVkIG5hbWUgZm9yIHNwZWNpZnlpbmcgYSBjbGFzcyBpbnN0YW5jZSBjb252ZXJ0ZXIuICBXaWxsIHVzZSBhIENsYXNzSW5zdGFuY2VDb252ZXJ0ZXIKKwkgKiBvbiB0aGUgYXNzb2NpYXRlZCBtYXBwaW5nLiAgV2hlbiB1c2luZyBhIENsYXNzSW5zdGFuY2VDb252ZXJ0ZXIgdGhlIGRhdGFiYXNlIHJlcHJlc2VudGF0aW9uIGlzIGEgCisJICogU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgQ2xhc3MgbmFtZSBhbmQgdGhlIG9iamVjdC1tb2RlbCByZXByZXNlbnRhdGlvbiBpcyBhbiBpbnN0YW5jZSAKKwkgKiBvZiB0aGF0IGNsYXNzIGJ1aWx0IHdpdGggYSBuby1hcmdzIGNvbnN0cnVjdG9yCisJICogSW4gdGhpcyBjYXNlIHRoZXJlIGRvZXMgbm90IG5lZWQgdG8gYmUgYSBjb3JyZXNwb25kaW5nIEBDdXN0b21Db252ZXJ0ZXIgZGVmaW5lZC4KKwkgKi8KKwlTdHJpbmcgQ0xBU1NfSU5TVEFOQ0VfQ09OVkVSVEVSID0gImNsYXNzLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFJlc2VydmVkIG5hbWUgZm9yIHNwZWNpZnlpbmcgbm8gY29udmVydGVyLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBhIHNpdHVhdGlvbiB3aGVyZSBlaXRoZXIgCisJICogIGFub3RoZXIgY29udmVydGVyIGlzIGRlZmF1bHRlZCBvciBhbm90aGVyIGNvbnZlcnRlciBpcyBzZXQuCisJICogIEluIHRoaXMgY2FzZSB0aGVyZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGEgY29ycmVzcG9uZGluZyBAQ3VzdG9tQ29udmVydGVyIGRlZmluZWQuCisJICovCisJU3RyaW5nIE5PX0NPTlZFUlRFUiA9ICJub25lIjsgLy8kTk9OLU5MUy0xJAorCQorCVN0cmluZ1tdIFJFU0VSVkVEX0NPTlZFUlRFUl9OQU1FUyA9IHtOT19DT05WRVJURVIsIENMQVNTX0lOU1RBTkNFX0NPTlZFUlRFUiwgU0VSSUFMSVpFRF9DT05WRVJURVJ9OworCQorCVN0cmluZyBERUZBVUxUX0NPTlZFUlRFUl9OQU1FID0gTk9fQ09OVkVSVEVSOworCisJLyoqCisJICogVGhpcyB3aWxsIHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIGNvbnZlcnRlciBzcGVjaWZpZWQgb24gdGhlIG1hcHBpbmcKKwkgKiBAcmV0dXJuCisJICovCisJRWNsaXBzZUxpbmtDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCk7CisJCVN0cmluZyBDT05WRVJURVJfUFJPUEVSVFkgPSAiY29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFBvc3NpYmxlIHZhbHVlcyBmb3IgY29udmVydGVyIHR5cGUgYXJlOgorCSAqIHtAdmFsdWUgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlciNUWVBFX0NPTlZFUlRFUn0KKwkgKiB7QHZhbHVlIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXIjU1RSVUNUX0NPTlZFUlRFUn0KKwkgKiB7QHZhbHVlIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXIjQ1VTVE9NX0NPTlZFUlRFUn0KKwkgKiB7QHZhbHVlIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXIjTk9fQ09OVkVSVEVSfQorCSAqIHtAdmFsdWUgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlciNPQkpFQ1RfVFlQRV9DT05WRVJURVJ9CisJICogQHBhcmFtIGNvbnZlcnRlclR5cGUKKwkgKi8KKwl2b2lkIHNldENvbnZlcnRlcihTdHJpbmcgY29udmVydGVyVHlwZSk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOWIzZjkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gYSAqQ3VzdG9tQ29udmVydGVyIHJlc291cmNlIG1vZGVsIG9iamVjdAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDb252ZXJ0ZXIgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQoreworCS8qKgorCSAqIFJldHVybiBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgY29udmVydGVyLgorCSAqIFBvc3NpYmlsaXRpZXMgYXJlIGJlbG93LCBOT19DT05WRVJURVIsIENVU1RPTV9DT05WRVJURVIsIAorCSAqIE9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgU1RSVUNUX0NPTlZFUlRFUiwgVFlQRV9DT05WRVJURVIKKwkgKi8KKwlTdHJpbmcgZ2V0VHlwZSgpOworCQlTdHJpbmcgTk9fQ09OVkVSVEVSID0gIm5vQ29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgQ1VTVE9NX0NPTlZFUlRFUiA9ICJjdXN0b21Db252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBPQkpFQ1RfVFlQRV9DT05WRVJURVIgPSAib2JqZWN0VHlwZUNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIFNUUlVDVF9DT05WRVJURVIgPSAic3RydWN0Q29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgVFlQRV9DT05WRVJURVIgPSAidHlwZUNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKKwkKKwlTdHJpbmcgZ2V0TmFtZSgpOwkKKwl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOworCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFJldHVybiB0aGUgY2hhciB0byBiZSB1c2VkIGZvciBicm93c2luZyBvciBjcmVhdGluZyB0aGUgY29udmVydGVyIGNsYXNzIElUeXBlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUjZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIpCisJICovCisJY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29udmVydGVyIGRlZmluaXRpb24gb3ZlcnJpZGVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSAKKwkgKiBnaXZlbiBjb252ZXJ0ZXIKKwkgKiAoZS5nLiBhIGNvbnZlcnRlciBkZWZpbmVkIGluIG9ybS54bWwgb3ZlcnJpZGVzIG9uZSBkZWZpbmVkIGluIGphdmEpLgorCSAqLworCWJvb2xlYW4gb3ZlcnJpZGVzKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcik7CisJCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbnZlcnRlciBpcyBhIGR1cGxpY2F0ZSBvZiB0aGUgZ2l2ZW4gY29udmVydGVyLgorCSAqIEEgY29udmVydGVyIGlzIG5vdCBhIGR1cGxpY2F0ZSBvZiBhbm90aGVyIGNvbnZlcnRlciBpZiBpcyB0aGUgc2FtZSBleGFjdCBjb252ZXJ0ZXIsCisJICogaWYgaXQgaXMgYSBuYW1lbGVzcyBjb252ZXJ0ZXIgKHdoaWNoIGlzIGFuIGVycm9yIGNvbmRpdGlvbiksIG9yIGlmIGl0IG92ZXJyaWRlcyAKKwkgKiBvciBpcyBvdmVycmlkZGVuIGJ5IHRoZSBvdGhlciBjb252ZXJ0ZXIuIAorCSAqLworCWJvb2xlYW4gZHVwbGljYXRlcyhFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2ZGIyMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIGEgQ3VzdG9tQ29udmVydGVyIHJlc291cmNlIG1vZGVsIG9iamVjdAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcgoreworCQkKKwlTdHJpbmcgZ2V0Q29udmVydGVyQ2xhc3MoKTsJCisJdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpOworCQlTdHJpbmcgQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZID0gImNvbnZlcnRlckNsYXNzIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgRUNMSVBTRUxJTktfQ09OVkVSVEVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ3VzdG9taXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDdXN0b21pemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3ZDZlNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ3VzdG9taXplci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gYSBDdXN0b21pemVyIHJlc291cmNlIG1vZGVsIG9iamVjdAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDdXN0b21pemVyIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKK3sKKwkKKwlTdHJpbmcgZ2V0Q3VzdG9taXplckNsYXNzKCk7CisJCisJU3RyaW5nIGdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKTsKKwkJU3RyaW5nIERFRkFVTFRfQ1VTVE9NSVpFUl9DTEFTU19QUk9QRVJUWSA9ICJkZWZhdWx0Q3VzdG9taXplckNsYXNzIjsgLy8kTk9OLU5MUy0xJAorCQorCVN0cmluZyBnZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKTsJCisJdm9pZCBzZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoU3RyaW5nIGN1c3RvbWl6ZXJDbGFzcyk7CisJCVN0cmluZyBTUEVDSUZJRURfQ1VTVE9NSVpFUl9DTEFTU19QUk9QRVJUWSA9ICJzcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBFQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuRGVzY3JpcHRvckN1c3RvbWl6ZXIiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGNoYXIgdG8gYmUgdXNlZCBmb3IgYnJvd3Npbmcgb3IgY3JlYXRpbmcgdGhlIGN1c3RvbWl6ZXIgY2xhc3MgSVR5cGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSNnZXRGdWxseVF1YWxpZmllZE5hbWUoY2hhcikKKwkgKi8KKwljaGFyIGdldEN1c3RvbWl6ZXJDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFbWJlZGRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0VtYmVkZGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGVhYjFlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFbWJlZGRhYmxlLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0VtYmVkZGFibGUgZXh0ZW5kcyBFbWJlZGRhYmxlCit7CisJRWNsaXBzZUxpbmtDdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKTsKKwkKKwlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkNWZmZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRW50aXR5LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rRW50aXR5IGV4dGVuZHMgRW50aXR5Cit7CisJRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKTsKKwkKKwlFY2xpcHNlTGlua1JlYWRPbmx5IGdldFJlYWRPbmx5KCk7CisJCisJRWNsaXBzZUxpbmtDdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKTsKKwkKKwlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MTAyNjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OworCisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGVudW0gRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIHsKKworICAgIENIRUNLX0NBQ0hFLAorICAgIENIRUNLX0RBVEFCQVNFLAorICAgIEFTU1VNRV9FWElTVEVOQ0UsCisgICAgQVNTVU1FX05PTl9FWElTVEVOQ0U7CisJCisKKwlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBmcm9tSmF2YVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlIGphdmFFeGlzdGVuY2VUeXBlKSB7CisJCWlmIChqYXZhRXhpc3RlbmNlVHlwZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlzd2l0Y2ggKGphdmFFeGlzdGVuY2VUeXBlKSB7CisJCQljYXNlIENIRUNLX0NBQ0hFOgorCQkJCXJldHVybiBDSEVDS19DQUNIRTsKKwkJCWNhc2UgQ0hFQ0tfREFUQUJBU0U6CisJCQkJcmV0dXJuIENIRUNLX0RBVEFCQVNFOworCQkJY2FzZSBBU1NVTUVfRVhJU1RFTkNFOgorCQkJCXJldHVybiBBU1NVTUVfRVhJU1RFTkNFOworCQkJY2FzZSBBU1NVTUVfTk9OX0VYSVNURU5DRToKKwkJCQlyZXR1cm4gQVNTVU1FX05PTl9FWElTVEVOQ0U7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZXhpc3RlbmNlIHR5cGU6ICIgKyBqYXZhRXhpc3RlbmNlVHlwZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlIHRvSmF2YVJlc291cmNlTW9kZWwoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGV4aXN0ZW5jZVR5cGUpIHsKKwkJaWYgKGV4aXN0ZW5jZVR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJc3dpdGNoIChleGlzdGVuY2VUeXBlKSB7CisJCQljYXNlIENIRUNLX0NBQ0hFOgorCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUuQ0hFQ0tfQ0FDSEU7CisJCQljYXNlIENIRUNLX0RBVEFCQVNFOgorCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0U7CisJCQljYXNlIEFTU1VNRV9FWElTVEVOQ0U6CisJCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFOworCQkJY2FzZSBBU1NVTUVfTk9OX0VYSVNURU5DRToKKwkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGV4aXN0ZW5jZSB0eXBlOiAiICsgZXhpc3RlbmNlVHlwZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwkKKworCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlIG9ybUV4aXN0ZW5jZVR5cGUpIHsKKwkJaWYgKG9ybUV4aXN0ZW5jZVR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJc3dpdGNoIChvcm1FeGlzdGVuY2VUeXBlKSB7CisJCQljYXNlIENIRUNLX0NBQ0hFOgorCQkJCXJldHVybiBDSEVDS19DQUNIRTsKKwkJCWNhc2UgQ0hFQ0tfREFUQUJBU0U6CisJCQkJcmV0dXJuIENIRUNLX0RBVEFCQVNFOworCQkJY2FzZSBBU1NVTUVfRVhJU1RFTkNFOgorCQkJCXJldHVybiBBU1NVTUVfRVhJU1RFTkNFOworCQkJY2FzZSBBU1NVTUVfTk9OX0VYSVNURU5DRToKKwkJCQlyZXR1cm4gQVNTVU1FX05PTl9FWElTVEVOQ0U7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZXhpc3RlbmNlIHR5cGU6ICIgKyBvcm1FeGlzdGVuY2VUeXBlKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCQorCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBleGlzdGVuY2VUeXBlKSB7CisJCWlmIChleGlzdGVuY2VUeXBlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXN3aXRjaCAoZXhpc3RlbmNlVHlwZSkgeworCQkJY2FzZSBDSEVDS19DQUNIRToKKwkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQ0hFQ0tfQ0FDSEU7CisJCQljYXNlIENIRUNLX0RBVEFCQVNFOgorCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRTsKKwkJCWNhc2UgQVNTVU1FX0VYSVNURU5DRToKKwkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRTsKKwkJCWNhc2UgQVNTVU1FX05PTl9FWElTVEVOQ0U6CisJCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGV4aXN0ZW5jZSB0eXBlOiAiICsgZXhpc3RlbmNlVHlwZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmNTIwYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byBhIFRpbWVPZkRheSByZXNvdXJjZSBtb2RlbCBvYmplY3QKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKK3sKKwkKKwlJbnRlZ2VyIGdldEhvdXIoKTsKKwl2b2lkIHNldEhvdXIoSW50ZWdlciBob3VyKTsKKwkJU3RyaW5nIEhPVVJfUFJPUEVSVFkgPSAiaG91ciI7IC8vJE5PTi1OTFMtMSQKKworCUludGVnZXIgZ2V0TWludXRlKCk7CisJdm9pZCBzZXRNaW51dGUoSW50ZWdlciBtaW51dGUpOworCQlTdHJpbmcgTUlOVVRFX1BST1BFUlRZID0gIm1pbnV0ZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwlJbnRlZ2VyIGdldFNlY29uZCgpOworCXZvaWQgc2V0U2Vjb25kKEludGVnZXIgc2Vjb25kKTsKKwkJU3RyaW5nIFNFQ09ORF9QUk9QRVJUWSA9ICJzZWNvbmQiOyAvLyROT04tTkxTLTEkCisJCisJSW50ZWdlciBnZXRNaWxsaXNlY29uZCgpOworCXZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBtaWxsaXNlY29uZCk7CisJCVN0cmluZyBNSUxMSVNFQ09ORF9QUk9QRVJUWSA9ICJtaWxsaXNlY29uZCI7IC8vJE5PTi1OTFMtMSQKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rSWRNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0YTQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rSWRNYXBwaW5nLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0lkTWFwcGluZyBleHRlbmRzIElkTWFwcGluZworeworCUVjbGlwc2VMaW5rTXV0YWJsZSBnZXRNdXRhYmxlKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0pvaW5GZXRjaC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODg5M2EwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0pvaW5GZXRjaCBleHRlbmRzIEpwYUNvbnRleHROb2RlCit7CisJRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGdldFZhbHVlKCk7CisJdm9pZCBzZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgbmV3Sm9pbkZldGNoVmFsdWUpOworCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCisJCUVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBERUZBVUxUX1ZBTFVFID0gRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmQ4NGRjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7CisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGVudW0gRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIHsKKworCUlOTkVSLAorCU9VVEVSOworCQorCisJcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZSBqYXZhSm9pbkZldGNoVHlwZSkgeworCQlpZiAoamF2YUpvaW5GZXRjaFR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJc3dpdGNoIChqYXZhSm9pbkZldGNoVHlwZSkgeworCQkJY2FzZSBJTk5FUjoKKwkJCQlyZXR1cm4gSU5ORVI7CisJCQljYXNlIE9VVEVSOgorCQkJCXJldHVybiBPVVRFUjsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBqb2luIGZldGNoIHR5cGU6ICIgKyBqYXZhSm9pbkZldGNoVHlwZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlIHRvSmF2YVJlc291cmNlTW9kZWwoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGpvaW5GZXRjaFR5cGUpIHsKKwkJaWYgKGpvaW5GZXRjaFR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJc3dpdGNoIChqb2luRmV0Y2hUeXBlKSB7CisJCQljYXNlIElOTkVSOgorCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVI7CisJCQljYXNlIE9VVEVSOgorCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVI7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gam9pbiBmZXRjaCB0eXBlOiAiICsgam9pbkZldGNoVHlwZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwkKKworCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKFhtbEpvaW5GZXRjaFR5cGUgb3JtSm9pbkZldGNoVHlwZSkgeworCQlpZiAob3JtSm9pbkZldGNoVHlwZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlzd2l0Y2ggKG9ybUpvaW5GZXRjaFR5cGUpIHsKKwkJCWNhc2UgSU5ORVI6CisJCQkJcmV0dXJuIElOTkVSOworCQkJY2FzZSBPVVRFUjoKKwkJCQlyZXR1cm4gT1VURVI7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gam9pbiBmZXRjaCB0eXBlOiAiICsgb3JtSm9pbkZldGNoVHlwZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwkKKwlwdWJsaWMgc3RhdGljIFhtbEpvaW5GZXRjaFR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBmZXRjaFR5cGUpIHsKKwkJaWYgKGZldGNoVHlwZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlzd2l0Y2ggKGZldGNoVHlwZSkgeworCQkJY2FzZSBJTk5FUjoKKwkJCQlyZXR1cm4gWG1sSm9pbkZldGNoVHlwZS5JTk5FUjsKKwkJCWNhc2UgT1VURVI6CisJCQkJcmV0dXJuIFhtbEpvaW5GZXRjaFR5cGUuT1VURVI7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gam9pbiBmZXRjaCB0eXBlOiAiICsgZmV0Y2hUeXBlKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTk5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBleHRlbmRzIE1hcHBlZFN1cGVyY2xhc3MKK3sKKwlFY2xpcHNlTGlua0NhY2hpbmcgZ2V0Q2FjaGluZygpOworCQorCUVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0UmVhZE9ubHkoKTsKKwkKKwlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpOworCQorCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua011dGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rTXV0YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NjE0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua011dGFibGUuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua011dGFibGUgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQoreworCWJvb2xlYW4gaXNNdXRhYmxlKCk7CisJCisJYm9vbGVhbiBpc0RlZmF1bHRNdXRhYmxlKCk7CisJCVN0cmluZyBERUZBVUxUX01VVEFCTEVfUFJPUEVSVFkgPSAiZGVmYXVsdE11dGFibGUiOyAgLy8kTk9OLU5MUy0xJAorCQorCUJvb2xlYW4gZ2V0U3BlY2lmaWVkTXV0YWJsZSgpOworCXZvaWQgc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuIG5ld1NwZWNpZmllZE11dGFibGUpOworCQlTdHJpbmcgU1BFQ0lGSUVEX01VVEFCTEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkTXV0YWJsZSI7ICAvLyROT04tTkxTLTEkCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NGQyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIGEgT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZSBtb2RlbCBvYmplY3QKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyCit7CisJU3RyaW5nIGdldERhdGFUeXBlKCk7CQorCXZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIGRhdGFUeXBlKTsKKwkJU3RyaW5nIERBVEFfVFlQRV9QUk9QRVJUWSA9ICJkYXRhVHlwZSI7IC8vJE5PTi1OTFMtMSQKKwkJCisJU3RyaW5nIGdldE9iamVjdFR5cGUoKTsJCisJdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBvYmplY3RUeXBlKTsKKwkJU3RyaW5nIE9CSkVDVF9UWVBFX1BST1BFUlRZID0gIm9iamVjdFR5cGUiOyAvLyROT04tTkxTLTEkCisKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGNvbnZlcnNpb24gdmFsdWVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBjb252ZXJzaW9uIHZhbHVlcy4KKwkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCisJICovCisJPFQgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gTGlzdEl0ZXJhdG9yPFQ+IGNvbnZlcnNpb25WYWx1ZXMoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbnZlcnNpb24gdmFsdWVzLgorCSAqLworCWludCBjb252ZXJzaW9uVmFsdWVzU2l6ZSgpOworCisJLyoqCisJICogQWRkIGEgY29udmVyc2lvbiB2YWx1ZSB0byB0aGUgb2JqZWN0IHR5cGUgbWFwcGluZyByZXR1cm4gdGhlIG9iamVjdCAKKwkgKiByZXByZXNlbnRpbmcgaXQuCisJICovCisJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgYWRkQ29udmVyc2lvblZhbHVlKGludCBpbmRleCk7CisKKwkvKioKKwkgKiBBZGQgYSBjb252ZXJzaW9uIHZhbHVlIHRvIHRoZSBvYmplY3QgdHlwZSBtYXBwaW5nIHJldHVybiB0aGUgb2JqZWN0IAorCSAqIHJlcHJlc2VudGluZyBpdC4KKwkgKi8KKwlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBhZGRDb252ZXJzaW9uVmFsdWUoKTsKKworCS8qKgorCSAqIFJlbW92ZSB0aGUgY29udmVyc2lvbiB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggZnJvbSB0aGUgZW50aXR5LgorCSAqLworCXZvaWQgcmVtb3ZlQ29udmVyc2lvblZhbHVlKGludCBpbmRleCk7CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIGNvbnZlcnNpb24gdmFsdWUgZnJvbSB0aGUgZW50aXR5LgorCSAqLworCXZvaWQgcmVtb3ZlQ29udmVyc2lvblZhbHVlKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSk7CisKKwkvKioKKwkgKiBNb3ZlIHRoZSBjb252ZXJzaW9uIHZhbHVlcyBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KKwkgKi8KKwl2b2lkIG1vdmVDb252ZXJzaW9uVmFsdWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOworCQlTdHJpbmcgQ09OVkVSU0lPTl9WQUxVRVNfTElTVCA9ICJjb252ZXJzaW9uVmFsdWVzIjsgLy8kTk9OLU5MUy0xJAorCisJCisJLyoqCisJICogUmV0dXJucyBhIExpc3RJdGVyYXRvciBvZiB0aGUgQ29udmVyc2lvblZhbHVlIGRhdGFWYWx1ZXMuCisJICogQHJldHVybgorCSAqLworCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGRhdGFWYWx1ZXMoKTsKKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGRlZmF1bHQgb2JqZWN0IHZhbHVlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJU3RyaW5nIGdldERlZmF1bHRPYmplY3RWYWx1ZSgpOworCXZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlKFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUpOworCQlTdHJpbmcgREVGQVVMVF9PQkpFQ1RfVkFMVUVfUFJPUEVSVFkgPSAiZGVmYXVsdE9iamVjdFZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZmFlZWEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyAKKwlleHRlbmRzIE9uZVRvTWFueU1hcHBpbmcsIEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZworeworCUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlIGdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOworCQorCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGdldFByaXZhdGVPd25lZCgpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxMDE3MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CisKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSB7QGxpbmsgUmVsYXRpb25zaGlwUmVmZXJlbmNlfSBvZiBhbiAKKyAqIHtAbGluayBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmd9CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlCisJZXh0ZW5kcyBPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UsCisJCUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCit7CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjI4MDA2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKKworLyoqCisgKiAKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIGV4dGVuZHMgT25lVG9PbmVNYXBwaW5nLCBFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcKK3sKKwlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBnZXRQcml2YXRlT3duZWQoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1ByaXZhdGVPd25lZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTE1YzUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1ByaXZhdGVPd25lZC5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGV4dGVuZHMgSnBhQ29udGV4dE5vZGUKK3sKKwlib29sZWFuIGlzUHJpdmF0ZU93bmVkKCk7CisJdm9pZCBzZXRQcml2YXRlT3duZWQoYm9vbGVhbiBwcml2YXRlT3duZWQpOworCQlTdHJpbmcgUFJJVkFURV9PV05FRF9QUk9QRVJUWSA9ICJwcml2YXRlT3duZWQiOyAvLyROT04tTkxTLTEkCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1JlYWRPbmx5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1JlYWRPbmx5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5OWU0MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rUmVhZE9ubHkuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtSZWFkT25seSBleHRlbmRzIEpwYUNvbnRleHROb2RlCit7CisJYm9vbGVhbiBpc1JlYWRPbmx5KCk7CisJCisJYm9vbGVhbiBpc0RlZmF1bHRSZWFkT25seSgpOworCQlTdHJpbmcgREVGQVVMVF9SRUFEX09OTFlfUFJPUEVSVFkgPSAiZGVmYXVsdFJlYWRPbmx5IjsgLy8kTk9OLU5MUy0xJAorCQlib29sZWFuIERFRkFVTFRfUkVBRF9PTkxZID0gZmFsc2U7CisJCisJQm9vbGVhbiBnZXRTcGVjaWZpZWRSZWFkT25seSgpOworCXZvaWQgc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbiBuZXdTcGVjaWZpZWRSZWFkT25seSk7CisJCVN0cmluZyBTUEVDSUZJRURfUkVBRF9PTkxZX1BST1BFUlRZID0gInNwZWNpZmllZFJlYWRPbmx5IjsgLy8kTk9OLU5MUy0xJAorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGM2ZGExCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgCisJZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nCit7CisJRWNsaXBzZUxpbmtKb2luRmV0Y2ggZ2V0Sm9pbkZldGNoKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTczYmZlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gYSBTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2UgbW9kZWwgb2JqZWN0CisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyCit7CisJU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCk7CQorCXZvaWQgc2V0Q29udmVydGVyQ2xhc3MoU3RyaW5nIGNvbnZlcnRlckNsYXNzKTsKKwkJU3RyaW5nIENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSA9ICJjb252ZXJ0ZXJDbGFzcyI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIEVDTElQU0VMSU5LX1NUUlVDVF9DT05WRVJURVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5kYXRhYmFzZS5jb252ZXJ0ZXJzLlN0cnVjdENvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1ZDNlZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nCit7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MDkxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gYSBUeXBlQ29udmVydGVyIHJlc291cmNlIG1vZGVsIG9iamVjdAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXIKK3sKKwlTdHJpbmcgZ2V0RGF0YVR5cGUoKTsJCisJdm9pZCBzZXREYXRhVHlwZShTdHJpbmcgZGF0YVR5cGUpOworCQlTdHJpbmcgREFUQV9UWVBFX1BST1BFUlRZID0gImRhdGFUeXBlIjsgLy8kTk9OLU5MUy0xJAorCQkKKwlTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpOwkKKwl2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIG9iamVjdFR5cGUpOworCQlTdHJpbmcgT0JKRUNUX1RZUEVfUFJPUEVSVFkgPSAib2JqZWN0VHlwZSI7IC8vJE5PTi1OTFMtMSQKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNDE0YzAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4yCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcKK3sKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjhlOTkwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7CisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nCisJZXh0ZW5kcyBWZXJzaW9uTWFwcGluZworeworCUVjbGlwc2VMaW5rTXV0YWJsZSBnZXRNdXRhYmxlKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMjk0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmcuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKKworLyoqCisgKiAKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmcsIEphdmFKcGFDb250ZXh0Tm9kZQoreworCQorCS8qKgorCSAqIFJldHVybiB0cnVlIGlmIHRoZSBleGlzdGVuY2UtY2hlY2tpbmcgbW9kZWwgb2JqZWN0IGV4aXN0cy4gIAorCSAqIEhhdmUgdG8gaGF2ZSBhIHNlcGFyYXRlIGZsYWcgZm9yIHRoaXMgc2luY2UgdGhlIGRlZmF1bHQgZXhpc3RlbmNlCisJICogdHlwZSBpcyBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaGFzRXhpc3RlbmNlQ2hlY2tpbmcoKSByZXR1cm5zCisJICogdHJ1ZSBvciBmYWxzZS4KKwkgKi8KKwlib29sZWFuIGhhc0V4aXN0ZW5jZUNoZWNraW5nKCk7CisJdm9pZCBzZXRFeGlzdGVuY2VDaGVja2luZyhib29sZWFuIGV4aXN0ZW5jZUNoZWNraW5nKTsKKwkJU3RyaW5nIEVYSVNURU5DRV9DSEVDS0lOR19QUk9QRVJUWSA9ICJleGlzdGVuY2VDaGVja2luZyI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSBFY2xpcHNlTGlua0phdmFDYWNoaW5nIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBDYWNoZUFubm90YXRpb24gCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgb2JqZWN0IGNyZWF0aW9uLgorCSAqLworCXZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKKwkKKwkvKioKKwkgKiBVcGRhdGUgdGhlIEVjbGlwc2VMaW5rSmF2YUNhY2hpbmcgY29udGV4dCBtb2RlbCBvYmplY3QgdG8gbWF0Y2ggdGhlIENhY2hlQW5ub3RhdGlvbiAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdCN1cGRhdGUoKX0KKwkgKi8KKwl2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDAwNjMyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7CisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjIKKyAqLworcHVibGljIGludGVyZmFjZSBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZXh0ZW5kcyBKYXZhSnBhQ29udGV4dE5vZGUKK3sKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSBKYXZhQ29udmVydGVySG9sZGVyIGNvbnRleHQgbW9kZWwgb2JqZWN0IHRvIG1hdGNoIHRoZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSAKKwkgKiByZXNvdXJjZSBtb2RlbCBvYmplY3QuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBvYmplY3QgY3JlYXRpb24uCisJICovCisJdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpOworCQorCS8qKgorCSAqIFVwZGF0ZSB0aGUgSmF2YUNvbnZlcnRlckhvbGRlciBjb250ZXh0IG1vZGVsIG9iamVjdCB0byBtYXRjaCB0aGUgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgCisJICogcmVzb3VyY2UgbW9kZWwgb2JqZWN0LiBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3QjdXBkYXRlKCl9CisJICovCisJdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCk7CisJCisJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgZ2V0Q3VzdG9tQ29udmVydGVyKCk7CisJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgYWRkQ3VzdG9tQ29udmVydGVyKCk7CisJdm9pZCByZW1vdmVDdXN0b21Db252ZXJ0ZXIoKTsKKwlTdHJpbmcgQ1VTVE9NX0NPTlZFUlRFUl9QUk9QRVJUWSA9ICJjdXN0b21Db252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCisJCisJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigpOworCXZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigpOworCVN0cmluZyBPQkpFQ1RfVFlQRV9DT05WRVJURVJfUFJPUEVSVFkgPSAib2JqZWN0VHlwZUNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKKwkKKwlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBhZGRTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwl2b2lkIHJlbW92ZVN0cnVjdENvbnZlcnRlcigpOworCVN0cmluZyBTVFJVQ1RfQ09OVkVSVEVSX1BST1BFUlRZID0gInN0cnVjdENvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKKwkKKwlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpOworCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBhZGRUeXBlQ29udmVydGVyKCk7CisJdm9pZCByZW1vdmVUeXBlQ29udmVydGVyKCk7CisJU3RyaW5nIFRZUEVfQ09OVkVSVEVSX1BST1BFUlRZID0gInR5cGVDb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCisJCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGFjN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0VtYmVkZGFibGU7CisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlIGV4dGVuZHMgRWNsaXBzZUxpbmtFbWJlZGRhYmxlLCBKYXZhRW1iZWRkYWJsZQoreworCUphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBnZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkNjllNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW50aXR5OworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YUVjbGlwc2VMaW5rRW50aXR5IGV4dGVuZHMgRWNsaXBzZUxpbmtFbnRpdHksIEphdmFFbnRpdHkKK3sKKwlKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZ2V0Q29udmVydGVySG9sZGVyKCk7CisKKwlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKTsKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5YzRmNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcy5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOworCisvKioKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBleHRlbmRzIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcywgSmF2YU1hcHBlZFN1cGVyY2xhc3MKK3sKKwlKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZ2V0Q29udmVydGVySG9sZGVyKCk7CisJCisJLy8qKioqKioqKiogY292YXJpYW50IG92ZXJyaWRlcyAqKioqKioqKioqKgorCisJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBnZXRDYWNoaW5nKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTRlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQoreworCS8vKioqKioqKioqKioqIGN1c3RvbUNvbnZlcnRlcnMgKioqKioqKioqKioqKioqKioqKioqCisJCisJLyoqCisJICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgY3VzdG9tIGNvbnZlcnRlcnMuCisJICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgorCSAqLworCTxUIGV4dGVuZHMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IExpc3RJdGVyYXRvcjxUPiBjdXN0b21Db252ZXJ0ZXJzKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjdXN0b20gY29udmVydGVycy4KKwkgKi8KKwlpbnQgY3VzdG9tQ29udmVydGVyc1NpemUoKTsKKworCS8qKgorCSAqIEFkZCBhIGN1c3RvbSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnZlcnRlciBob2xkZXIsIHJldHVybiB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyBpdC4KKwkgKi8KKwlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBhZGRDdXN0b21Db252ZXJ0ZXIoaW50IGluZGV4KTsKKworCS8qKgorCSAqIFJlbW92ZSB0aGUgY3VzdG9tIGNvbnZlcnRlciBhdCB0aGUgaW5kZXggZnJvbSB0aGUgY29udmVydGVyIGhvbGRlci4KKwkgKi8KKwl2b2lkIHJlbW92ZUN1c3RvbUNvbnZlcnRlcihpbnQgaW5kZXgpOworCisJLyoqCisJICogUmVtb3ZlIHRoZSBjdXN0b20gY29udmVydGVyIGF0IGZyb20gdGhlIGNvbnZlcnRlciBob2xkZXIuCisJICovCisJdm9pZCByZW1vdmVDdXN0b21Db252ZXJ0ZXIoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyKTsKKworCS8qKgorCSAqIE1vdmUgdGhlIGN1c3RvbSBjb252ZXJ0ZXIgZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCisJICovCisJdm9pZCBtb3ZlQ3VzdG9tQ29udmVydGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKKworCVN0cmluZyBDVVNUT01fQ09OVkVSVEVSU19MSVNUID0gImN1c3RvbUNvbnZlcnRlcnMiOyAvLyROT04tTkxTLTEkCisKKwkKKwkvLyoqKioqKioqKioqKiBvYmplY3QgdHlwZSBjb252ZXJ0ZXJzICoqKioqKioqKioqKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgb2JqZWN0IHR5cGUgY29udmVydGVycy4KKwkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCisJICovCisJPFQgZXh0ZW5kcyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IExpc3RJdGVyYXRvcjxUPiBvYmplY3RUeXBlQ29udmVydGVycygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2JqZWN0IHR5cGUgY29udmVydGVycy4KKwkgKi8KKwlpbnQgb2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCk7CisKKwkvKioKKwkgKiBBZGQgYSBvYmplY3QgdHlwZSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnZlcnRlciBob2xkZXIsIHJldHVybiB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyBpdC4KKwkgKi8KKwlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYWRkT2JqZWN0VHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpOworCisJLyoqCisJICogUmVtb3ZlIHRoZSBvYmplY3QgdHlwZSBjb252ZXJ0ZXIgYXQgdGhlIGluZGV4IGZyb20gdGhlIGNvbnZlcnRlciBob2xkZXIuCisJICovCisJdm9pZCByZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKGludCBpbmRleCk7CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIG9iamVjdCB0eXBlIGNvbnZlcnRlciBhdCBmcm9tIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLgorCSAqLworCXZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyKTsKKworCS8qKgorCSAqIE1vdmUgdGhlIG9iamVjdCB0eXBlIGNvbnZlcnRlciBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KKwkgKi8KKwl2b2lkIG1vdmVPYmplY3RUeXBlQ29udmVydGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKKworCVN0cmluZyBPQkpFQ1RfVFlQRV9DT05WRVJURVJTX0xJU1QgPSAib2JqZWN0VHlwZUNvbnZlcnRlcnMiOyAvLyROT04tTkxTLTEkCisJCisJCisJLy8qKioqKioqKioqKiogc3RydWN0IGNvbnZlcnRlcnMgKioqKioqKioqKioqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBzdHJ1Y3QgY29udmVydGVycy4KKwkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCisJICovCisJPFQgZXh0ZW5kcyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gTGlzdEl0ZXJhdG9yPFQ+IHN0cnVjdENvbnZlcnRlcnMoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHN0cnVjdCBjb252ZXJ0ZXJzLgorCSAqLworCWludCBzdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpOworCisJLyoqCisJICogQWRkIGEgc3RydWN0IGNvbnZlcnRlciB0byB0aGUgY29udmVydGVyIGhvbGRlciwgcmV0dXJuIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIGl0LgorCSAqLworCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGFkZFN0cnVjdENvbnZlcnRlcihpbnQgaW5kZXgpOworCisJLyoqCisJICogUmVtb3ZlIHRoZSBzdHJ1Y3QgY29udmVydGVyIGF0IHRoZSBpbmRleCBmcm9tIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLgorCSAqLworCXZvaWQgcmVtb3ZlU3RydWN0Q29udmVydGVyKGludCBpbmRleCk7CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIHN0cnVjdCBjb252ZXJ0ZXIgYXQgZnJvbSB0aGUgY29udmVydGVyIGhvbGRlci4KKwkgKi8KKwl2b2lkIHJlbW92ZVN0cnVjdENvbnZlcnRlcihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIpOworCisJLyoqCisJICogTW92ZSB0aGUgc3RydWN0IGNvbnZlcnRlciBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KKwkgKi8KKwl2b2lkIG1vdmVTdHJ1Y3RDb252ZXJ0ZXIoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOworCisJU3RyaW5nIFNUUlVDVF9DT05WRVJURVJTX0xJU1QgPSAic3RydWN0Q29udmVydGVycyI7IC8vJE5PTi1OTFMtMSQKKworCQorCS8vKioqKioqKioqKioqIHR5cGUgY29udmVydGVycyAqKioqKioqKioqKioqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIHR5cGUgY29udmVydGVycy4KKwkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCisJICovCisJPFQgZXh0ZW5kcyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IExpc3RJdGVyYXRvcjxUPiB0eXBlQ29udmVydGVycygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdHlwZSBjb252ZXJ0ZXJzLgorCSAqLworCWludCB0eXBlQ29udmVydGVyc1NpemUoKTsKKworCS8qKgorCSAqIEFkZCBhIHR5cGUgY29udmVydGVyIHRvIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLCByZXR1cm4gdGhlIG9iamVjdCByZXByZXNlbnRpbmcgaXQuCisJICovCisJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGFkZFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KTsKKworCS8qKgorCSAqIFJlbW92ZSB0aGUgdHlwZSBjb252ZXJ0ZXIgYXQgdGhlIGluZGV4IGZyb20gdGhlIGNvbnZlcnRlciBob2xkZXIuCisJICovCisJdm9pZCByZW1vdmVUeXBlQ29udmVydGVyKGludCBpbmRleCk7CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIHR5cGUgY29udmVydGVyIGF0IGZyb20gdGhlIGNvbnZlcnRlciBob2xkZXIuCisJICovCisJdm9pZCByZW1vdmVUeXBlQ29udmVydGVyKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIpOworCisJLyoqCisJICogTW92ZSB0aGUgdHlwZSBjb252ZXJ0ZXIgZnJvbSB0aGUgc291cmNlIGluZGV4IHRvIHRoZSB0YXJnZXQgaW5kZXguCisJICovCisJdm9pZCBtb3ZlVHlwZUNvbnZlcnRlcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7CisKKwlTdHJpbmcgVFlQRV9DT05WRVJURVJTX0xJU1QgPSAidHlwZUNvbnZlcnRlcnMiOyAvLyROT04tTkxTLTEkCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzQyNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MuamF2YQpAQCAtMCwwICsxLDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7CisKK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyAKKwlleHRlbmRzIEVudGl0eU1hcHBpbmdzCit7CisJCisJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZ2V0Q29udmVydGVySG9sZGVyKCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGUzOTE2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZy5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOworCitwdWJsaWMgaW50ZXJmYWNlIE9ybUVjbGlwc2VMaW5rQ2FjaGluZworCWV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nLCBYbWxDb250ZXh0Tm9kZQoreworCXZvaWQgdXBkYXRlKEphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNhY2hpbmcpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5M2UzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0VtYmVkZGFibGU7CisKKy8qKgorICogCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgZXh0ZW5kcyBFY2xpcHNlTGlua0VtYmVkZGFibGUsIE9ybUVtYmVkZGFibGUKK3sKKwlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBnZXRDb252ZXJ0ZXJIb2xkZXIoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlOTY1MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eS5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0VudGl0eTsKKworcHVibGljIGludGVyZmFjZSBPcm1FY2xpcHNlTGlua0VudGl0eSBleHRlbmRzIEVjbGlwc2VMaW5rRW50aXR5LCBPcm1FbnRpdHkKK3sKKwlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBnZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkKKwlPcm1FY2xpcHNlTGlua0NhY2hpbmcgZ2V0Q2FjaGluZygpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOGVlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7CisKK3B1YmxpYyBpbnRlcmZhY2UgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGV4dGVuZHMgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLCBPcm1NYXBwZWRTdXBlcmNsYXNzCit7CisJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZ2V0Q29udmVydGVySG9sZGVyKCk7CisJCisJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NzdmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmc7CisKKy8qKgorICogIENhY2hlVHlwZQorICovCitwdWJsaWMgZW51bSBDYWNoZVR5cGUgeworCXNvZnRfd2VhaywgCisJaGFyZF93ZWFrLCAKKwl3ZWFrLAorCXNvZnQsCisJZnVsbCwKKwlub25lOyAKKworCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTEwgPSAiRnVsbCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFSRF9XRUFLID0gIkhhcmRXZWFrIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIk5PTkUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPRlQgPSAiU29mdCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09GVF9XRUFLID0gIlNvZnRXZWFrIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFLID0gIldlYWsiOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODRiMTZjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoaW5nLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkVudGl0eTsKKworLyoqCisgKiAgQ2FjaGluZworICovCitwdWJsaWMgaW50ZXJmYWNlIENhY2hpbmcgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCit7CisJQ2FjaGVUeXBlIGdldERlZmF1bHRDYWNoZVR5cGVEZWZhdWx0KCk7CisJQ2FjaGVUeXBlIGdldENhY2hlVHlwZURlZmF1bHQoKTsKKwl2b2lkIHNldENhY2hlVHlwZURlZmF1bHQoQ2FjaGVUeXBlIGNhY2hlVHlwZURlZmF1bHQpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSA9ICJjYWNoZVR5cGVEZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxUID0gImVjbGlwc2VsaW5rLmNhY2hlLnR5cGUuZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIENhY2hlVHlwZSBERUZBVUxUX0NBQ0hFX1RZUEVfREVGQVVMVCA9IENhY2hlVHlwZS5zb2Z0X3dlYWs7CisKKwlJbnRlZ2VyIGdldERlZmF1bHRDYWNoZVNpemVEZWZhdWx0KCk7CisJSW50ZWdlciBnZXRDYWNoZVNpemVEZWZhdWx0KCk7CisJdm9pZCBzZXRDYWNoZVNpemVEZWZhdWx0KEludGVnZXIgY2FjaGVTaXplRGVmYXVsdCk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZID0gImNhY2hlU2l6ZURlZmF1bHQiOyAvLyROT04tTkxTLTEkCisJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9TSVpFX0RFRkFVTFQgPSAiZWNsaXBzZWxpbmsuY2FjaGUuc2l6ZS5kZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgSW50ZWdlciBERUZBVUxUX0NBQ0hFX1NJWkVfREVGQVVMVCA9IEludGVnZXIudmFsdWVPZigxMDApOworCisJQm9vbGVhbiBnZXREZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0KCk7CisJQm9vbGVhbiBnZXRTaGFyZWRDYWNoZURlZmF1bHQoKTsKKwl2b2lkIHNldFNoYXJlZENhY2hlRGVmYXVsdChCb29sZWFuIHNoYXJlZENhY2hlRGVmYXVsdCk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkgPSAic2hhcmVkQ2FjaGVEZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQgPSAiZWNsaXBzZWxpbmsuY2FjaGUuc2hhcmVkLmRlZmF1bHQiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfU0hBUkVEX0NBQ0hFX0RFRkFVTFQgPSBCb29sZWFuLlRSVUU7CisKKworCUNhY2hlVHlwZSBnZXREZWZhdWx0Q2FjaGVUeXBlKCk7CisJQ2FjaGVUeXBlIGdldENhY2hlVHlwZU9mKFN0cmluZyBlbnRpdHlOYW1lKTsKKwl2b2lkIHNldENhY2hlVHlwZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBDYWNoZVR5cGUgY2FjaGVUeXBlKTsKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9UWVBFX1BST1BFUlRZID0gImNhY2hlVHlwZSI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NBQ0hFX1RZUEUgPSAiZWNsaXBzZWxpbmsuY2FjaGUudHlwZS4iOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgREVGQVVMVF9DQUNIRV9UWVBFID0gQ2FjaGVUeXBlLnNvZnRfd2VhazsKKworCUludGVnZXIgZ2V0RGVmYXVsdENhY2hlU2l6ZSgpOworCUludGVnZXIgZ2V0Q2FjaGVTaXplT2YoU3RyaW5nIGVudGl0eU5hbWUpOworCXZvaWQgc2V0Q2FjaGVTaXplT2YoU3RyaW5nIGVudGl0eU5hbWUsIEludGVnZXIgY2FjaGVTaXplKTsKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX1BST1BFUlRZID0gImNhY2hlU2l6ZSI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUgPSAiZWNsaXBzZWxpbmsuY2FjaGUuc2l6ZS4iOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfQ0FDSEVfU0laRSA9IEludGVnZXIudmFsdWVPZigxMDApOworCisJQm9vbGVhbiBnZXREZWZhdWx0U2hhcmVkQ2FjaGUoKTsKKwlCb29sZWFuIGdldFNoYXJlZENhY2hlT2YoU3RyaW5nIGVudGl0eU5hbWUpOworCXZvaWQgc2V0U2hhcmVkQ2FjaGVPZihTdHJpbmcgZW50aXR5TmFtZSwgQm9vbGVhbiBzaGFyZWRDYWNoZSk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX0NBQ0hFX1BST1BFUlRZID0gInNoYXJlZENhY2hlIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFID0gImVjbGlwc2VsaW5rLmNhY2hlLnNoYXJlZC4iOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfU0hBUkVEX0NBQ0hFID0gQm9vbGVhbi5UUlVFOworCisJRmx1c2hDbGVhckNhY2hlIGdldERlZmF1bHRGbHVzaENsZWFyQ2FjaGUoKTsKKwlGbHVzaENsZWFyQ2FjaGUgZ2V0Rmx1c2hDbGVhckNhY2hlKCk7CisJdm9pZCBzZXRGbHVzaENsZWFyQ2FjaGUoRmx1c2hDbGVhckNhY2hlIG5ld0ZsdXNoQ2xlYXJDYWNoZSk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRkxVU0hfQ0xFQVJfQ0FDSEVfUFJPUEVSVFkgPSAiZmx1c2hDbGVhckNhY2hlIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRkxVU0hfQ0xFQVJfQ0FDSEUgPSAiZWNsaXBzZWxpbmsuZmx1c2gtY2xlYXIuY2FjaGUiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBGbHVzaENsZWFyQ2FjaGUgREVGQVVMVF9GTFVTSF9DTEVBUl9DQUNIRSA9IEZsdXNoQ2xlYXJDYWNoZS5kcm9wX2ludmFsaWRhdGU7CisKKworCUxpc3RJdGVyYXRvcjxFbnRpdHk+IGVudGl0aWVzKCk7CisJaW50IGVudGl0aWVzU2l6ZSgpOworCWJvb2xlYW4gZW50aXR5RXhpc3RzKFN0cmluZyBlbnRpdHkpOworCUVudGl0eSBhZGRFbnRpdHkoU3RyaW5nIGVudGl0eSk7CisJdm9pZCByZW1vdmVFbnRpdHkoU3RyaW5nIGVudGl0eSk7CisJCVN0cmluZyBFTlRJVElFU19MSVNUID0gImVudGl0aWVzIjsgLy8kTk9OLU5MUy0xJAorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0ZsdXNoQ2xlYXJDYWNoZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9GbHVzaENsZWFyQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTllMzNmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9GbHVzaENsZWFyQ2FjaGUuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nOworCisvKioKKyAqICBGbHVzaENsZWFyQ2FjaGUKKyAqLworcHVibGljIGVudW0gRmx1c2hDbGVhckNhY2hlIHsKKwlkcm9wLAorCWRyb3BfaW52YWxpZGF0ZSwKKwltZXJnZTsgCisKKwkvLyBFY2xpcHNlTGluayB2YWx1ZSBzdHJpbmcKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QID0gIkRyb3AiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfSU5WQUxJREFURSA9ICJEcm9wSW52YWxpZGF0ZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVSR0UgPSAiTWVyZ2UiOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9CYXRjaFdyaXRpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQmF0Y2hXcml0aW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzYjhhNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQmF0Y2hXcml0aW5nLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCisvKioKKyAqICBCYXRjaFdyaXRpbmcKKyAqLworcHVibGljIGVudW0gQmF0Y2hXcml0aW5nIHsKKwkJCW5vbmUsIAorCQkJamRiYywgCisJCQlidWZmZXJlZCwgCisJCQlvcmFjbGVfamRiYzsKKworCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZworCXN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJOb25lIjsKKwlzdGF0aWMgZmluYWwgU3RyaW5nIEpEQkMgPSAiSkRCQyI7CisJc3RhdGljIGZpbmFsIFN0cmluZyBCVUZGRVJFRCA9ICJCdWZmZXJlZCI7CisJc3RhdGljIGZpbmFsIFN0cmluZyBPUkFDTEVfSkRCQyA9ICJPcmFjbGUtSkRCQyI7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjZmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb24uamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKKworLyoqCisgKiAgQ29ubmVjdGlvbgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb24gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCit7CisJQm9vbGVhbiBnZXREZWZhdWx0TmF0aXZlU3FsKCk7CisJQm9vbGVhbiBnZXROYXRpdmVTcWwoKTsKKwl2b2lkIHNldE5hdGl2ZVNxbChCb29sZWFuIG5ld05hdGl2ZVNxbCk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFX1NRTF9QUk9QRVJUWSA9ICJuYXRpdmVTcWwiOyAvLyROT04tTkxTLTEkCisJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19OQVRJVkVfU1FMID0gImVjbGlwc2VsaW5rLmpkYmMubmF0aXZlLXNxbCI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9OQVRJVkVfU1FMID0gQm9vbGVhbi5GQUxTRTsKKworCUJhdGNoV3JpdGluZyBnZXREZWZhdWx0QmF0Y2hXcml0aW5nKCk7CisJQmF0Y2hXcml0aW5nIGdldEJhdGNoV3JpdGluZygpOworCXZvaWQgc2V0QmF0Y2hXcml0aW5nKEJhdGNoV3JpdGluZyBuZXdCYXRjaFdyaXRpbmcpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEJBVENIX1dSSVRJTkdfUFJPUEVSVFkgPSAiYmF0Y2hXcml0aW5nIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORyA9ICJlY2xpcHNlbGluay5qZGJjLmJhdGNoLXdyaXRpbmciOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBCYXRjaFdyaXRpbmcgREVGQVVMVF9CQVRDSF9XUklUSU5HID0gQmF0Y2hXcml0aW5nLm5vbmU7CisKKwlCb29sZWFuIGdldERlZmF1bHRDYWNoZVN0YXRlbWVudHMoKTsKKwlCb29sZWFuIGdldENhY2hlU3RhdGVtZW50cygpOworCXZvaWQgc2V0Q2FjaGVTdGF0ZW1lbnRzKEJvb2xlYW4gbmV3Q2FjaGVTdGF0ZW1lbnRzKTsKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZID0gImNhY2hlU3RhdGVtZW50cyI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFMgPSAiZWNsaXBzZWxpbmsuamRiYy5jYWNoZS1zdGF0ZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX0NBQ0hFX1NUQVRFTUVOVFMgPSBCb29sZWFuLkZBTFNFOworCisJSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpOworCUludGVnZXIgZ2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpOworCXZvaWQgc2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZShJbnRlZ2VyIG5ld0NhY2hlU3RhdGVtZW50c1NpemUpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSA9ICJjYWNoZVN0YXRlbWVudHNTaXplIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFID0gImVjbGlwc2VsaW5rLmpkYmMuY2FjaGUtc3RhdGVtZW50cy5zaXplIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgSW50ZWdlciBERUZBVUxUX0NBQ0hFX1NUQVRFTUVOVFNfU0laRSA9IEludGVnZXIudmFsdWVPZig1MCk7CisKKwlTdHJpbmcgZ2V0RGVmYXVsdERyaXZlcigpOworCVN0cmluZyBnZXREcml2ZXIoKTsKKwl2b2lkIHNldERyaXZlcihTdHJpbmcgbmV3RHJpdmVyKTsKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfUFJPUEVSVFkgPSAiZHJpdmVyIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRFJJVkVSID0gImVjbGlwc2VsaW5rLmpkYmMuZHJpdmVyIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRFJJVkVSID0gIiI7IC8vJE5PTi1OTFMtMSQKKworCVN0cmluZyBnZXREZWZhdWx0VXJsKCk7CisJU3RyaW5nIGdldFVybCgpOworCXZvaWQgc2V0VXJsKFN0cmluZyBuZXdVcmwpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QUk9QRVJUWSA9ICJ1cmwiOyAvLyROT04tTkxTLTEkCisJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19VUkwgPSAiZWNsaXBzZWxpbmsuamRiYy51cmwiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9VUkwgPSAiIjsgLy8kTk9OLU5MUy0xJAorCisJU3RyaW5nIGdldERlZmF1bHRVc2VyKCk7CisJU3RyaW5nIGdldFVzZXIoKTsKKwl2b2lkIHNldFVzZXIoU3RyaW5nIG5ld1VzZXIpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfUFJPUEVSVFkgPSAidXNlciI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1VTRVIgPSAiZWNsaXBzZWxpbmsuamRiYy51c2VyIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVVNFUiA9ICIiOyAvLyROT04tTkxTLTEkCisKKwlTdHJpbmcgZ2V0RGVmYXVsdFBhc3N3b3JkKCk7CisJU3RyaW5nIGdldFBhc3N3b3JkKCk7CisJdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgbmV3UGFzc3dvcmQpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX1BST1BFUlRZID0gInBhc3N3b3JkIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUEFTU1dPUkQgPSAiZWNsaXBzZWxpbmsuamRiYy5wYXNzd29yZCI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBU1NXT1JEID0gIiI7IC8vJE5PTi1OTFMtMSQKKworCUJvb2xlYW4gZ2V0RGVmYXVsdEJpbmRQYXJhbWV0ZXJzKCk7CisJQm9vbGVhbiBnZXRCaW5kUGFyYW1ldGVycygpOworCXZvaWQgc2V0QmluZFBhcmFtZXRlcnMoQm9vbGVhbiBuZXdCaW5kUGFyYW1ldGVycyk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgQklORF9QQVJBTUVURVJTX1BST1BFUlRZID0gImJpbmRQYXJhbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTID0gImVjbGlwc2VsaW5rLmpkYmMuYmluZC1wYXJhbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX0JJTkRfUEFSQU1FVEVSUyA9IEJvb2xlYW4uVFJVRTsKKworCUJvb2xlYW4gZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpOworCUJvb2xlYW4gZ2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCk7CisJdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoQm9vbGVhbiBuZXdSZWFkQ29ubmVjdGlvbnNTaGFyZWQpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZID0gInJlYWRDb25uZWN0aW9uc1NoYXJlZCI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEID0gImVjbGlwc2VsaW5rLmpkYmMucmVhZC1jb25uZWN0aW9ucy5zaGFyZWQiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19TSEFSRUQgPSBCb29sZWFuLkZBTFNFOworCisJSW50ZWdlciBnZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWluKCk7CisJSW50ZWdlciBnZXRSZWFkQ29ubmVjdGlvbnNNaW4oKTsKKwl2b2lkIHNldFJlYWRDb25uZWN0aW9uc01pbihJbnRlZ2VyIG5ld1JlYWRDb25uZWN0aW9uc01pbik7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkgPSAicmVhZENvbm5lY3Rpb25zTWluIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19NSU4gPSAiZWNsaXBzZWxpbmsuamRiYy5yZWFkLWNvbm5lY3Rpb25zLm1pbiI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9SRUFEX0NPTk5FQ1RJT05TX01JTiA9IEludGVnZXIudmFsdWVPZigyKTsKKworCUludGVnZXIgZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc01heCgpOworCUludGVnZXIgZ2V0UmVhZENvbm5lY3Rpb25zTWF4KCk7CisJdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNNYXgoSW50ZWdlciBuZXdSZWFkQ29ubmVjdGlvbnNNYXgpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZID0gInJlYWRDb25uZWN0aW9uc01heCI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYID0gImVjbGlwc2VsaW5rLmpkYmMucmVhZC1jb25uZWN0aW9ucy5tYXgiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19NQVggPSBJbnRlZ2VyLnZhbHVlT2YoMik7CisKKwlJbnRlZ2VyIGdldERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWluKCk7CisJSW50ZWdlciBnZXRXcml0ZUNvbm5lY3Rpb25zTWluKCk7CisJdm9pZCBzZXRXcml0ZUNvbm5lY3Rpb25zTWluKEludGVnZXIgbmV3V3JpdGVDb25uZWN0aW9uc01pbik7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZID0gIndyaXRlQ29ubmVjdGlvbnNNaW4iOyAvLyROT04tTkxTLTEkCisJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NSU4gPSAiZWNsaXBzZWxpbmsuamRiYy53cml0ZS1jb25uZWN0aW9ucy5taW4iOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfV1JJVEVfQ09OTkVDVElPTlNfTUlOID0gSW50ZWdlci52YWx1ZU9mKDUpOworCisJSW50ZWdlciBnZXREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01heCgpOworCUludGVnZXIgZ2V0V3JpdGVDb25uZWN0aW9uc01heCgpOworCXZvaWQgc2V0V3JpdGVDb25uZWN0aW9uc01heChJbnRlZ2VyIG5ld1dyaXRlQ29ubmVjdGlvbnNNYXgpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSA9ICJ3cml0ZUNvbm5lY3Rpb25zTWF4IjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUFYID0gImVjbGlwc2VsaW5rLmpkYmMud3JpdGUtY29ubmVjdGlvbnMubWF4IjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgSW50ZWdlciBERUZBVUxUX1dSSVRFX0NPTk5FQ1RJT05TX01BWCA9IEludGVnZXIudmFsdWVPZigxMCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0N1c3RvbWl6YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vQ3VzdG9taXphdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOWIwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0N1c3RvbWl6YXRpb24uamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkVudGl0eTsKKworLyoqCisgKiAgQ3VzdG9taXphdGlvbgorICovCitwdWJsaWMgaW50ZXJmYWNlIEN1c3RvbWl6YXRpb24gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCit7CisJQm9vbGVhbiBnZXREZWZhdWx0VGhyb3dFeGNlcHRpb25zKCk7CisJQm9vbGVhbiBnZXRUaHJvd0V4Y2VwdGlvbnMoKTsKKwl2b2lkIHNldFRocm93RXhjZXB0aW9ucyhCb29sZWFuIG5ld1Rocm93RXhjZXB0aW9ucyk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSA9ICJ0aHJvd0V4Y2VwdGlvbnMiOyAvLyROT04tTkxTLTEkCisJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TID0gImVjbGlwc2VsaW5rLm9ybS50aHJvdy5leGNlcHRpb25zIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1RIUk9XX0VYQ0VQVElPTlMgPSBCb29sZWFuLlRSVUU7CisJCisJV2VhdmluZyBnZXREZWZhdWx0V2VhdmluZygpOworCVdlYXZpbmcgZ2V0V2VhdmluZygpOworCXZvaWQgc2V0V2VhdmluZyhXZWF2aW5nIG5ld1dlYXZpbmcpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfUFJPUEVSVFkgPSAid2VhdmluZyI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dFQVZJTkcgPSAiZWNsaXBzZWxpbmsud2VhdmluZyI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIFdlYXZpbmcgREVGQVVMVF9XRUFWSU5HID0gV2VhdmluZy50cnVlXzsKKyAKKwlCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nTGF6eSgpOworCUJvb2xlYW4gZ2V0V2VhdmluZ0xhenkoKTsKKwl2b2lkIHNldFdlYXZpbmdMYXp5KEJvb2xlYW4gbmV3V2VhdmluZ0xhenkpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfTEFaWV9QUk9QRVJUWSA9ICJ3ZWF2aW5nTGF6eSI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dFQVZJTkdfTEFaWSA9ICJlY2xpcHNlbGluay53ZWF2aW5nLmxhenkiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfV0VBVklOR19MQVpZID0gQm9vbGVhbi5UUlVFOworCQorCUJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdDaGFuZ2VUcmFja2luZygpOworCUJvb2xlYW4gZ2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCk7CisJdm9pZCBzZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoQm9vbGVhbiBuZXdXZWF2aW5nQ2hhbmdlVHJhY2tpbmcpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZID0gIndlYXZpbmdDaGFuZ2VUcmFja2luZyI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HID0gImVjbGlwc2VsaW5rLndlYXZpbmcuY2hhbmdldHJhY2tpbmciOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkcgPSBCb29sZWFuLlRSVUU7CisKKwlCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nRmV0Y2hHcm91cHMoKTsKKwlCb29sZWFuIGdldFdlYXZpbmdGZXRjaEdyb3VwcygpOworCXZvaWQgc2V0V2VhdmluZ0ZldGNoR3JvdXBzKEJvb2xlYW4gbmV3V2VhdmluZ0ZldGNoR3JvdXBzKTsKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSA9ICJ3ZWF2aW5nRmV0Y2hHcm91cHMiOyAvLyROT04tTkxTLTEkCisJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUyA9ICJlY2xpcHNlbGluay53ZWF2aW5nLmZldGNoZ3JvdXBzIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1dFQVZJTkdfRkVUQ0hfR1JPVVBTID0gQm9vbGVhbi5UUlVFOworCisJQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0ludGVybmFsKCk7CisJQm9vbGVhbiBnZXRXZWF2aW5nSW50ZXJuYWwoKTsKKwl2b2lkIHNldFdlYXZpbmdJbnRlcm5hbChCb29sZWFuIG5ld1dlYXZpbmdJbnRlcm5hbCk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSA9ICJ3ZWF2aW5nSW50ZXJuYWwiOyAvLyROT04tTkxTLTEkCisJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XRUFWSU5HX0lOVEVSTkFMID0gImVjbGlwc2VsaW5rLndlYXZpbmcuaW50ZXJuYWwiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfV0VBVklOR19JTlRFUk5BTCA9IEJvb2xlYW4uVFJVRTsKKworCUJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdFYWdlcigpOworCUJvb2xlYW4gZ2V0V2VhdmluZ0VhZ2VyKCk7CisJdm9pZCBzZXRXZWF2aW5nRWFnZXIoQm9vbGVhbiBuZXdXZWF2aW5nRWFnZXIpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfRUFHRVJfUFJPUEVSVFkgPSAid2VhdmluZ0VhZ2VyIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV0VBVklOR19FQUdFUiA9ICJlY2xpcHNlbGluay53ZWF2aW5nLmVhZ2VyIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1dFQVZJTkdfRUFHRVIgPSBCb29sZWFuLkZBTFNFOworCisJU3RyaW5nIGdldERlZmF1bHREZXNjcmlwdG9yQ3VzdG9taXplcigpOworCVN0cmluZyBnZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKFN0cmluZyBlbnRpdHlOYW1lKTsKKwl2b2lkIHNldERlc2NyaXB0b3JDdXN0b21pemVyT2YoU3RyaW5nIGVudGl0eU5hbWUsIFN0cmluZyBuZXdEZXNjcmlwdG9yQ3VzdG9taXplcik7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZID0gImRlc2NyaXB0b3JDdXN0b21pemVyIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSID0gImVjbGlwc2VsaW5rLmRlc2NyaXB0b3IuY3VzdG9taXplci4iOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ERVNDUklQVE9SX0NVU1RPTUlaRVIgPSBudWxsOwkvLyBubyBkZWZhdWx0CisKKwlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzZXNzaW9uQ3VzdG9taXplcnMoKTsKKwlpbnQgc2Vzc2lvbkN1c3RvbWl6ZXJzU2l6ZSgpOworCWJvb2xlYW4gc2Vzc2lvbkN1c3RvbWl6ZXJFeGlzdHMoU3RyaW5nIHNlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lKTsKKwlTdHJpbmcgYWRkU2Vzc2lvbkN1c3RvbWl6ZXIoU3RyaW5nIG5ld1Nlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lKTsKKwl2b2lkIHJlbW92ZVNlc3Npb25DdXN0b21pemVyKFN0cmluZyBzZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZSk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DVVNUT01JWkVSX0xJU1QgPSAic2Vzc2lvbkN1c3RvbWl6ZXJzIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSA9ICJzZXNzaW9uQ3VzdG9taXplciI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFU1NJT05fQ1VTVE9NSVpFUiA9ICJlY2xpcHNlbGluay5zZXNzaW9uLmN1c3RvbWl6ZXIiOyAvLyROT04tTkxTLTEkCisKKwlMaXN0SXRlcmF0b3I8RW50aXR5PiBlbnRpdGllcygpOworCWludCBlbnRpdGllc1NpemUoKTsKKwlib29sZWFuIGVudGl0eUV4aXN0cyhTdHJpbmcgZW50aXR5KTsKKwlFbnRpdHkgYWRkRW50aXR5KFN0cmluZyBlbnRpdHkpOworCXZvaWQgcmVtb3ZlRW50aXR5KFN0cmluZyBlbnRpdHkpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUSUVTX0xJU1QgPSAiZW50aXRpZXMiOyAvLyROT04tTkxTLTEkCisJCQorCVN0cmluZyBnZXREZWZhdWx0UHJvZmlsZXIoKTsKKwlTdHJpbmcgZ2V0UHJvZmlsZXIoKTsKKwl2b2lkIHNldFByb2ZpbGVyKFN0cmluZyBuZXdQcm9maWxlcik7CisJdm9pZCBzZXRQcm9maWxlcihQcm9maWxlciBuZXdQcm9maWxlcik7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRVJfUFJPUEVSVFkgPSAicHJvZmlsZXIiOyAvLyROT04tTkxTLTEkCisJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19QUk9GSUxFUiA9ICJlY2xpcHNlbGluay5wcm9maWxlciI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BST0ZJTEVSID0gCisJCQlBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKFByb2ZpbGVyLm5vX3Byb2ZpbGVyKTsKKwkJU3RyaW5nIEVDTElQU0VMSU5LX1NFU1NJT05fUFJPRklMRVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5zZXNzaW9ucy5TZXNzaW9uUHJvZmlsZXIiOyAvLyROT04tTkxTLTEkCisJCQorCUJvb2xlYW4gZ2V0RGVmYXVsdFZhbGlkYXRpb25Pbmx5KCk7CisJQm9vbGVhbiBnZXRWYWxpZGF0aW9uT25seSgpOworCXZvaWQgc2V0VmFsaWRhdGlvbk9ubHkoQm9vbGVhbiBuZXdWYWxpZGF0aW9uT25seSk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9PTkxZX1BST1BFUlRZID0gInZhbGlkYXRpb25Pbmx5IjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVkFMSURBVElPTl9PTkxZID0gImVjbGlwc2VsaW5rLnZhbGlkYXRpb24tb25seSI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9WQUxJREFUSU9OX09OTFkgPSBCb29sZWFuLlRSVUU7CisKKwlTdHJpbmcgZ2V0RGVmYXVsdEV4Y2VwdGlvbkhhbmRsZXIoKTsKKwlTdHJpbmcgZ2V0RXhjZXB0aW9uSGFuZGxlcigpOworCXZvaWQgc2V0RXhjZXB0aW9uSGFuZGxlcihTdHJpbmcgbmV3RXhjZXB0aW9uSGFuZGxlcik7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX0hBTkRMRVJfUFJPUEVSVFkgPSAiZXhjZXB0aW9uSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0VYQ0VQVElPTl9IQU5ETEVSID0gImVjbGlwc2VsaW5rLmV4Y2VwdGlvbi1oYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhDRVBUSU9OX0hBTkRMRVIgPSBudWxsOwkvLyBubyBkZWZhdWx0CisKKwkJU3RyaW5nIEVDTElQU0VMSU5LX0VYQ0VQVElPTl9IQU5ETEVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZXhjZXB0aW9ucy5FeGNlcHRpb25IYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Byb2ZpbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Byb2ZpbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2YThiZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUHJvZmlsZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOworCisvKioKKyAqICBQcm9maWxlcgorICovCitwdWJsaWMgZW51bSBQcm9maWxlciB7CisJcGVyZm9ybWFuY2VfcHJvZmlsZXIsIAorCXF1ZXJ5X21vbml0b3IsCisJbm9fcHJvZmlsZXI7CisKKwkvLyBFY2xpcHNlTGluayB2YWx1ZSBzdHJpbmcKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJGT1JNQU5DRV9QUk9GSUxFUiA9ICJQZXJmb3JtYW5jZVByb2ZpbGVyIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX01PTklUT1IgPSAiUXVlcnlNb25pdG9yIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1BST0ZJTEVSID0gIk5vUHJvZmlsZXIiOyAvLyROT04tTkxTLTEkCisKKwkvLyBFY2xpcHNlTGluayBwcm9maWxlciBjbGFzcyBuYW1lcworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUkZPUk1BTkNFX1BST0ZJTEVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMucHJvZmlsZXIuUGVyZm9ybWFuY2VQcm9maWxlciI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9NT05JVE9SX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMucHJvZmlsZXIuUXVlcnlNb25pdG9yIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIHRoZSBQcm9maWxlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaXRlcmFsLgorCSAqLworCXB1YmxpYyBzdGF0aWMgUHJvZmlsZXIgZ2V0UHJvZmlsZXJGb3IoU3RyaW5nIGxpdGVyYWwpIHsKKwkJCisJCWZvciggUHJvZmlsZXIgcHJvZmlsZXIgOiBQcm9maWxlci52YWx1ZXMoKSkgeworCQkJaWYocHJvZmlsZXIudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcHJvZmlsZXI7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb2ZpbGVyQ2xhc3NOYW1lKFN0cmluZyBwcm9maWxlclZhbHVlKSB7CisJCWlmIChwcm9maWxlclZhbHVlID09IFBFUkZPUk1BTkNFX1BST0ZJTEVSKSB7CisJCQlyZXR1cm4gUEVSRk9STUFOQ0VfUFJPRklMRVJfQ0xBU1NfTkFNRTsKKwkJfQorCQlpZiAocHJvZmlsZXJWYWx1ZSA9PSBRVUVSWV9NT05JVE9SKSB7CisJCQlyZXR1cm4gUVVFUllfTU9OSVRPUl9DTEFTU19OQU1FOworCQl9CisJCXJldHVybiBwcm9maWxlclZhbHVlOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4NzdlZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZy5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247CisKKy8qKgorICogIFdlYXZpbmcKKyAqLworcHVibGljIGVudW0gV2VhdmluZyB7CisJdHJ1ZV8sCisJZmFsc2VfLCAKKwlzdGF0aWNfOworCisJLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRV8gPSAidHJ1ZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMU0VfID0gImZhbHNlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUSUNfID0gInN0YXRpYyI7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0dlbmVyYWxQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0dlbmVyYWxQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjMWNiNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2dlbmVyYWwvR2VuZXJhbFByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOworCisvKioKKyAqICBHZW5lcmFsUHJvcGVydGllcworICovCitwdWJsaWMgaW50ZXJmYWNlIEdlbmVyYWxQcm9wZXJ0aWVzIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcworeworCisJQm9vbGVhbiBnZXREZWZhdWx0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCk7CisJQm9vbGVhbiBnZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKTsKKwl2b2lkIHNldEV4Y2x1ZGVFY2xpcHNlbGlua09ybShCb29sZWFuIG5ld0V4Y2x1ZGVFY2xpcHNlbGlua09ybSk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fUFJPUEVSVFkgPSAiZXhjbHVkZUVjbGlwc2VsaW5rT3JtIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRVhDTFVERV9FQ0xJUFNFTElOS19PUk0gPSAiZWNsaXBzZWxpbmsuZXhjbHVkZS1lY2xpcHNlbGluay1vcm0iOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfRVhDTFVERV9FQ0xJUFNFTElOS19PUk0gPSBCb29sZWFuLkZBTFNFOworCQkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OWU5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dlci5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZzsKKworLyoqCisgKiBMb2dnZXIKKyAqLworcHVibGljIGVudW0gTG9nZ2VyIHsKKwkJCWRlZmF1bHRfbG9nZ2VyLCAKKwkJCWphdmFfbG9nZ2VyLCAKKwkJCXNlcnZlcl9sb2dnZXI7CisJCisJLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0dHRVIgPSAiRGVmYXVsdExvZ2dlciI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0xPR0dFUiA9ICJKYXZhTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9MT0dHRVIgPSAiU2VydmVyTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAorCQorCS8vIEVjbGlwc2VMaW5rIGxvZ2dlciBjbGFzcyBuYW1lcworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HR0VSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubG9nZ2luZy5EZWZhdWx0U2Vzc2lvbkxvZyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0xPR0dFUl9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmxvZ2dpbmcuSmF2YUxvZyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfTE9HR0VSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uc2VydmVyLlNlcnZlckxvZyI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIExvZ2dlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaXRlcmFsLgorCSAqLworCXB1YmxpYyBzdGF0aWMgTG9nZ2VyIGdldExvZ2dlckZvcihTdHJpbmcgbGl0ZXJhbCkgeworCQkKKwkJZm9yKCBMb2dnZXIgbG9nZ2VyIDogTG9nZ2VyLnZhbHVlcygpKSB7CisJCQlpZihsb2dnZXIudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gbG9nZ2VyOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2dnZXJDbGFzc05hbWUoU3RyaW5nIGxvZ2dlclZhbHVlKSB7CisJCWlmIChsb2dnZXJWYWx1ZSA9PSBERUZBVUxUX0xPR0dFUikgeworCQkJcmV0dXJuIERFRkFVTFRfTE9HR0VSX0NMQVNTX05BTUU7CisJCX0KKwkJaWYgKGxvZ2dlclZhbHVlID09IEpBVkFfTE9HR0VSKSB7CisJCQlyZXR1cm4gSkFWQV9MT0dHRVJfQ0xBU1NfTkFNRTsKKwkJfQorCQlpZiAobG9nZ2VyVmFsdWUgPT0gU0VSVkVSX0xPR0dFUikgeworCQkJcmV0dXJuIFNFUlZFUl9MT0dHRVJfQ0xBU1NfTkFNRTsKKwkJfQorCQlyZXR1cm4gbG9nZ2VyVmFsdWU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwYTNjZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZy5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKKworLyoqCisgKiBMb2dnaW5nCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTG9nZ2luZyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKK3sKKwlMb2dnaW5nTGV2ZWwgZ2V0RGVmYXVsdExldmVsKCk7CisJTG9nZ2luZ0xldmVsIGdldExldmVsKCk7CisJdm9pZCBzZXRMZXZlbChMb2dnaW5nTGV2ZWwgbGV2ZWwpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIExFVkVMX1BST1BFUlRZID0gImxldmVsIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfTEVWRUwgPSAiZWNsaXBzZWxpbmsubG9nZ2luZy5sZXZlbCI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBERUZBVUxUX0xFVkVMID0gTG9nZ2luZ0xldmVsLmluZm87CisJCisJQm9vbGVhbiBnZXREZWZhdWx0VGltZXN0YW1wKCk7CisJQm9vbGVhbiBnZXRUaW1lc3RhbXAoKTsKKwl2b2lkIHNldFRpbWVzdGFtcChCb29sZWFuIHRpbWVzdGFtcCk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVNUQU1QX1BST1BFUlRZID0gInRpbWVzdGFtcCI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1RJTUVTVEFNUCA9ICJlY2xpcHNlbGluay5sb2dnaW5nLnRpbWVzdGFtcCI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9USU1FU1RBTVAgPSBCb29sZWFuLlRSVUU7CisJCisJQm9vbGVhbiBnZXREZWZhdWx0VGhyZWFkKCk7CisJQm9vbGVhbiBnZXRUaHJlYWQoKTsKKwl2b2lkIHNldFRocmVhZChCb29sZWFuIHRocmVhZCk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEhSRUFEX1BST1BFUlRZID0gInRocmVhZCI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1RIUkVBRCA9ICJlY2xpcHNlbGluay5sb2dnaW5nLnRocmVhZCI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9USFJFQUQgPSBCb29sZWFuLlRSVUU7CisJCisJQm9vbGVhbiBnZXREZWZhdWx0U2Vzc2lvbigpOworCUJvb2xlYW4gZ2V0U2Vzc2lvbigpOworCXZvaWQgc2V0U2Vzc2lvbihCb29sZWFuIHNlc3Npb24pOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fUFJPUEVSVFkgPSAic2Vzc2lvbiI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFU1NJT04gPSAiZWNsaXBzZWxpbmsubG9nZ2luZy5zZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1NFU1NJT04gPSBCb29sZWFuLlRSVUU7CisJCisJQm9vbGVhbiBnZXREZWZhdWx0RXhjZXB0aW9ucygpOworCUJvb2xlYW4gZ2V0RXhjZXB0aW9ucygpOworCXZvaWQgc2V0RXhjZXB0aW9ucyhCb29sZWFuIGV4Y2VwdGlvbnMpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTlNfUFJPUEVSVFkgPSAiZXhjZXB0aW9ucyI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0VYQ0VQVElPTlMgPSAiZWNsaXBzZWxpbmsubG9nZ2luZy5leGNlcHRpb25zIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX0VYQ0VQVElPTlMgPSBCb29sZWFuLkZBTFNFOworCQkKKwlTdHJpbmcgZ2V0RGVmYXVsdExvZ0ZpbGVMb2NhdGlvbigpOworCVN0cmluZyBnZXRMb2dGaWxlTG9jYXRpb24oKTsKKwl2b2lkIHNldExvZ0ZpbGVMb2NhdGlvbihTdHJpbmcgbmV3TG9nRmlsZUxvY2F0aW9uKTsKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSA9ICJsb2dGaWxlTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCisJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19MT0dfRklMRV9MT0NBVElPTiA9ICJlY2xpcHNlbGluay5sb2dnaW5nLmZpbGUiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0dfRklMRV9MT0NBVElPTiA9IG51bGw7CQkvLyBObyBEZWZhdWx0CisJCQorCVN0cmluZyBnZXREZWZhdWx0TG9nZ2VyKCk7CisJU3RyaW5nIGdldExvZ2dlcigpOworCXZvaWQgc2V0TG9nZ2VyKFN0cmluZyBuZXdMb2dnZXIpOworCXZvaWQgc2V0TG9nZ2VyKExvZ2dlciBuZXdMb2dnZXIpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dFUl9QUk9QRVJUWSA9ICJsb2dnZXIiOyAvLyROT04tTkxTLTEkCisJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19MT0dHRVIgPSAiZWNsaXBzZWxpbmsubG9nZ2luZy5sb2dnZXIiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0dHRVIgPSAKKwkJCUFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoTG9nZ2VyLmRlZmF1bHRfbG9nZ2VyKTsKKwkJU3RyaW5nIEVDTElQU0VMSU5LX0xPR0dFUl9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmxvZ2dpbmcuU2Vzc2lvbkxvZyI7IC8vJE5PTi1OTFMtMSQKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ0xldmVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdMZXZlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MDQxODMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdMZXZlbC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZzsKKworLyoqCisgKiAgTG9nZ2luZ0xldmVsCisgKi8KK3B1YmxpYyBlbnVtIExvZ2dpbmdMZXZlbCB7CisJCQlvZmYsIAorCQkJc2V2ZXJlLCAKKwkJCXdhcm5pbmcsIAorCQkJaW5mbywgCisJCQljb25maWcsIAorCQkJZmluZSwgCisJCQlmaW5lciwKKwkJCWZpbmVzdCwKKwkJCWFsbDsKKworCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9GRiA9ICJPRkYiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVkVSRSA9ICJTRVZFUkUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5JTkcgPSAiV0FSTklORyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GTyA9ICJJTkZPIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUcgPSAiQ09ORklHIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5FID0gIkZJTkUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkVSID0gIkZJTkVSIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5FU1QgPSAiRklORVNUIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEwgPSAiQUxMIjsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvT3B0aW9ucy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9PcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiMDFhZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvT3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CisKKy8qKgorICogIFNlc3Npb24gT3B0aW9ucworICovCitwdWJsaWMgaW50ZXJmYWNlIE9wdGlvbnMgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCit7CisJU3RyaW5nIGdldERlZmF1bHRTZXNzaW9uTmFtZSgpOworCVN0cmluZyBnZXRTZXNzaW9uTmFtZSgpOworCXZvaWQgc2V0U2Vzc2lvbk5hbWUoU3RyaW5nIG5ld1Nlc3Npb25OYW1lKTsgCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9OQU1FX1BST1BFUlRZID0gInNlc3Npb25OYW1lIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTl9OQU1FID0gImVjbGlwc2VsaW5rLnNlc3Npb24tbmFtZSI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFU1NJT05fTkFNRSA9ICIiOwkvLyBubyBkZWZhdWx0IC8vJE5PTi1OTFMtMSQKKworCVN0cmluZyBnZXREZWZhdWx0U2Vzc2lvbnNYbWwoKTsKKwlTdHJpbmcgZ2V0U2Vzc2lvbnNYbWwoKTsKKwl2b2lkIHNldFNlc3Npb25zWG1sKFN0cmluZyBuZXdTZXNzaW9uc1htbCk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTlNfWE1MX1BST1BFUlRZID0gInNlc3Npb25zWG1sIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTlNfWE1MID0gImVjbGlwc2VsaW5rLnNlc3Npb25zLXhtbCI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFU1NJT05TX1hNTCA9ICIiOwkvLyBubyBkZWZhdWx0IC8vJE5PTi1OTFMtMSQKKwkJCisJQm9vbGVhbiBnZXREZWZhdWx0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7CisJQm9vbGVhbiBnZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKTsKKwl2b2lkIHNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyhCb29sZWFuIG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSA9ICJpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXN5IjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUyA9ICJlY2xpcHNlbGluay5zZXNzaW9uLmluY2x1ZGUuZGVzY3JpcHRvci5xdWVyaWVzIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMgPSBCb29sZWFuLlRSVUU7CisJCQorCVN0cmluZyBnZXREZWZhdWx0VGFyZ2V0RGF0YWJhc2UoKTsKKwlTdHJpbmcgZ2V0VGFyZ2V0RGF0YWJhc2UoKTsKKwl2b2lkIHNldFRhcmdldERhdGFiYXNlKFN0cmluZyBuZXdUYXJnZXREYXRhYmFzZSk7CisJdm9pZCBzZXRUYXJnZXREYXRhYmFzZShUYXJnZXREYXRhYmFzZSBuZXdUYXJnZXREYXRhYmFzZSk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZID0gInRhcmdldERhdGFiYXNlIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVEFSR0VUX0RBVEFCQVNFID0gImVjbGlwc2VsaW5rLnRhcmdldC1kYXRhYmFzZSI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RBUkdFVF9EQVRBQkFTRSA9IAorCQkJQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihUYXJnZXREYXRhYmFzZS5hdXRvKTsKKworCVN0cmluZyBnZXREZWZhdWx0VGFyZ2V0U2VydmVyKCk7CisJU3RyaW5nIGdldFRhcmdldFNlcnZlcigpOworCXZvaWQgc2V0VGFyZ2V0U2VydmVyKFN0cmluZyBuZXdUYXJnZXRTZXJ2ZXIpOworCXZvaWQgc2V0VGFyZ2V0U2VydmVyKFRhcmdldFNlcnZlciBuZXdUYXJnZXRTZXJ2ZXIpOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9TRVJWRVJfUFJPUEVSVFkgPSAidGFyZ2V0U2VydmVyIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVEFSR0VUX1NFUlZFUiA9ICJlY2xpcHNlbGluay50YXJnZXQtc2VydmVyIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEFSR0VUX1NFUlZFUiA9IAorCQkJQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihUYXJnZXRTZXJ2ZXIubm9uZSk7CisKKwlTdHJpbmcgZ2V0RGVmYXVsdEV2ZW50TGlzdGVuZXIoKTsKKwlTdHJpbmcgZ2V0RXZlbnRMaXN0ZW5lcigpOworCXZvaWQgc2V0RXZlbnRMaXN0ZW5lcihTdHJpbmcgbmV3RXZlbnRMaXN0ZW5lcik7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSA9ICJldmVudExpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTl9FVkVOVF9MSVNURU5FUiA9ICJlY2xpcHNlbGluay5zZXNzaW9uLWV2ZW50LWxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VTU0lPTl9FVkVOVF9MSVNURU5FUiA9IG51bGw7CS8vIG5vIGRlZmF1bHQKKwkJU3RyaW5nIEVDTElQU0VMSU5LX0VWRU5UX0xJU1RFTkVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2Uuc2Vzc2lvbnMuU2Vzc2lvbkV2ZW50TGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCisKKwlCb29sZWFuIGdldERlZmF1bHRUZW1wb3JhbE11dGFibGUoKTsKKwlCb29sZWFuIGdldFRlbXBvcmFsTXV0YWJsZSgpOworCXZvaWQgc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4gdGVtcG9yYWxNdXRhYmxlKTsKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBURU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZID0gInRlbXBvcmFsTXV0YWJsZSI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1RFTVBPUkFMX01VVEFCTEUgPSAiZWNsaXBzZWxpbmsudGVtcG9yYWwubXV0YWJsZSI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9URU1QT1JBTF9NVVRBQkxFID0gQm9vbGVhbi5GQUxTRTsKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0RGF0YWJhc2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0RGF0YWJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWEzNDEyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UYXJnZXREYXRhYmFzZS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7CisKKy8qKgorICogIFRhcmdldERhdGFiYXNlCisgKi8KK3B1YmxpYyBlbnVtIFRhcmdldERhdGFiYXNlIHsKKwkJCWF0dHVuaXR5LAorCQkJYXV0bywKKwkJCWNsb3Vkc2NhcGUsCisJCQlkYXRhYmFzZSwKKwkJCWRiMiwKKwkJCWRiMm1haW5mcmFtZSwKKwkJCWRiYXNlLAorCQkJZGVyYnksCisJCQloc3FsLAorCQkJaW5mb3JtaXgsCisJCQlqYXZhZGIsCisJCQlteXNxbCwKKwkJCW9yYWNsZSwKKwkJCW9yYWNsZTExLAorCQkJb3JhY2xlMTAsCisJCQlvcmFjbGU5LAorCQkJb3JhY2xlOCwKKwkJCXBvaW50YmFzZSwKKwkJCXBvc3RncmVzcWwsCisJCQlzcWxhbnl3aGVyZSwKKwkJCXNxbHNlcnZlciwKKwkJCXN5YmFzZSwKKwkJCXRpbWVzdGVuOworCisJLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCisJc3RhdGljIGZpbmFsIFN0cmluZyBBVFRVTklUWSA9ICJBdHR1bml0eSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPID0gIkF1dG8iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPVURTQ0FQRSA9ICJDbG91ZHNjYXBlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFID0gIkRhdGFiYXNlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERCMiA9ICJEQjIiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREIyTUFJTkZSQU1FID0gIkRCMk1haW5mcmFtZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQkFTRSA9ICJEQmFzZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERVJCWSA9ICJEZXJieSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBIU1FMID0gIkhTUUwiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT1JNSVggPSAiSW5mb3JtaXgiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQURCID0gIkphdmFEQiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNWVNRTCA9ICJNeVNRTCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBPUkFDTEUgPSAiT3JhY2xlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9SQUNMRTExID0gIk9yYWNsZTExIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9SQUNMRTEwID0gIk9yYWNsZTEwZyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBPUkFDTEU5ID0gIk9yYWNsZTlpIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9SQUNMRTggPSAiT3JhY2xlOGkiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9JTlRCQVNFID0gIlBvaW50QmFzZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NUR1JFU1FMID0gIlBvc3RncmVTUUwiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1FMQU5ZV0hFUkUgPSAiU1FMQW55d2hlcmUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1FMU0VSVkVSID0gIlNRTFNlcnZlciI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTWUJBU0UgPSAiU3liYXNlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTVEVOID0gIlRpbWVzVGVuIjsKKworCS8qKgorCSAqIFJldHVybiB0aGUgVGFyZ2V0RGF0YWJhc2UgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbGl0ZXJhbC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRhcmdldERhdGFiYXNlIGdldFRhcmdldERhdGFiYXNlRm9yKFN0cmluZyBsaXRlcmFsKSB7CisJCQorCQlmb3IoIFRhcmdldERhdGFiYXNlIHRhcmdldERhdGFiYXNlIDogVGFyZ2V0RGF0YWJhc2UudmFsdWVzKCkpIHsKKwkJCWlmKHRhcmdldERhdGFiYXNlLnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHRhcmdldERhdGFiYXNlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0U2VydmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldFNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNGU3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldFNlcnZlci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7CisKKy8qKgorICogIFRhcmdldFNlcnZlcgorICovCitwdWJsaWMgZW51bSBUYXJnZXRTZXJ2ZXIgeworCQkJbm9uZSwKKwkJCW9jNGosCisJCQlzdW5hczksCisJCQl3ZWJzcGhlcmUsCisJCQl3ZWJzcGhlcmVfNl8xLAorCQkJd2VibG9naWMsCisJCQl3ZWJsb2dpY185LAorCQkJd2VibG9naWNfMTAsCisJCQlqYm9zczsKKworCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZworCXN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJOb25lIjsKKwlzdGF0aWMgZmluYWwgU3RyaW5nIE9DNEogPSAiT0M0SiI7CisJc3RhdGljIGZpbmFsIFN0cmluZyBTVU5BUzkgPSAiU3VuQVM5IjsKKwlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNQSEVSRSA9ICJXZWJTcGhlcmUiOworCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU1BIRVJFXzZfMSA9ICJXZWJTcGhlcmVfNl8xIjsKKwlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkxPR0lDID0gIldlYkxvZ2ljIjsKKwlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkxPR0lDXzkgPSAiV2ViTG9naWNfOSI7CisJc3RhdGljIGZpbmFsIFN0cmluZyBXRUJMT0dJQ18xMCA9ICJXZWJMb2dpY18xMCI7CisJc3RhdGljIGZpbmFsIFN0cmluZyBKQk9TUyA9ICJKQm9zcyI7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIFRhcmdldFNlcnZlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaXRlcmFsLgorCSAqLworCXB1YmxpYyBzdGF0aWMgVGFyZ2V0U2VydmVyIGdldFRhcmdldFNlcnZlckZvcihTdHJpbmcgbGl0ZXJhbCkgeworCQkKKwkJZm9yKCBUYXJnZXRTZXJ2ZXIgdGFyZ2V0U2VydmVyIDogVGFyZ2V0U2VydmVyLnZhbHVlcygpKSB7CisJCQlpZih0YXJnZXRTZXJ2ZXIudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gdGFyZ2V0U2VydmVyOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTJhNWNmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGUuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjsKKworLyoqCisgKiAgRGRsR2VuZXJhdGlvblR5cGUKKyAqLworcHVibGljIGVudW0gRGRsR2VuZXJhdGlvblR5cGUgeworCW5vbmUsIAorCWNyZWF0ZV90YWJsZXMsIAorCWRyb3BfYW5kX2NyZWF0ZV90YWJsZXM7CisJCisJLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJub25lIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfVEFCTEVTID0gImNyZWF0ZS10YWJsZXMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfQU5EX0NSRUFURV9UQUJMRVMgPSAiZHJvcC1hbmQtY3JlYXRlLXRhYmxlcyI7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vT3V0cHV0TW9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vT3V0cHV0TW9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZGY2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9PdXRwdXRNb2RlLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247CisKKy8qKgorICogIE91dHB1dE1vZGUKKyAqLworcHVibGljIGVudW0gT3V0cHV0TW9kZSB7CisJYm90aCwgCisJc3FsX3NjcmlwdCwgCisJZGF0YWJhc2U7CisKKwkvLyBFY2xpcHNlTGluayB2YWx1ZSBzdHJpbmcKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT1RIID0gImJvdGgiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFID0gImRhdGFiYXNlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUUxfU0NSSVBUID0gInNxbC1zY3JpcHQiOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhODhiM2EKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CisKKy8qKgorICogIFNjaGVtYUdlbmVyYXRpb24KKyAqLworcHVibGljIGludGVyZmFjZSBTY2hlbWFHZW5lcmF0aW9uIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcworeworCURkbEdlbmVyYXRpb25UeXBlIGdldERlZmF1bHREZGxHZW5lcmF0aW9uVHlwZSgpOworCURkbEdlbmVyYXRpb25UeXBlIGdldERkbEdlbmVyYXRpb25UeXBlKCk7CisJdm9pZCBzZXREZGxHZW5lcmF0aW9uVHlwZShEZGxHZW5lcmF0aW9uVHlwZSBkZGxHZW5lcmF0aW9uVHlwZSk7CisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSA9ICJkZGxHZW5lcmF0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUgPSAiZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb24iOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBEZGxHZW5lcmF0aW9uVHlwZSBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RETF9HRU5FUkFUSU9OX1RZUEUgPSBEZGxHZW5lcmF0aW9uVHlwZS5ub25lOworCisJT3V0cHV0TW9kZSBnZXREZWZhdWx0T3V0cHV0TW9kZSgpOworCU91dHB1dE1vZGUgZ2V0T3V0cHV0TW9kZSgpOworCXZvaWQgc2V0T3V0cHV0TW9kZShPdXRwdXRNb2RlIG91dHB1dE1vZGUpOyAvLyBwdXQKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTU9ERV9QUk9QRVJUWSA9ICJvdXRwdXRNb2RlIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUgPSAiZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb24ub3V0cHV0LW1vZGUiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fT1VUUFVUX01PREUgPSBudWxsOwkJLy8gTm8gRGVmYXVsdAorCisJU3RyaW5nIGdldERlZmF1bHRDcmVhdGVGaWxlTmFtZSgpOworCVN0cmluZyBnZXRDcmVhdGVGaWxlTmFtZSgpOworCXZvaWQgc2V0Q3JlYXRlRmlsZU5hbWUoU3RyaW5nIGNyZWF0ZUZpbGVOYW1lKTsKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZID0gImNyZWF0ZUZpbGVOYW1lIjsgLy8kTk9OLU5MUy0xJAorCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSA9ICJlY2xpcHNlbGluay5jcmVhdGUtZGRsLWpkYmMtZmlsZS1uYW1lIjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQ1JFQVRFX0ZJTEVfTkFNRSA9ICJjcmVhdGVEREwuamRiYyI7IC8vJE5PTi1OTFMtMSQKKwkKKwlTdHJpbmcgZ2V0RGVmYXVsdERyb3BGaWxlTmFtZSgpOworCVN0cmluZyBnZXREcm9wRmlsZU5hbWUoKTsKKwl2b2lkIHNldERyb3BGaWxlTmFtZShTdHJpbmcgZHJvcEZpbGVOYW1lKTsKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QX0ZJTEVfTkFNRV9QUk9QRVJUWSA9ICJkcm9wRmlsZU5hbWUiOyAvLyROT04tTkxTLTEkCisJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19EUk9QX0ZJTEVfTkFNRSA9ICJlY2xpcHNlbGluay5kcm9wLWRkbC1qZGJjLWZpbGUtbmFtZSI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RST1BfRklMRV9OQU1FID0gImRyb3BEREwuamRiYyI7IC8vJE5PTi1OTFMtMSQKKwkJCisJU3RyaW5nIGdldERlZmF1bHRBcHBsaWNhdGlvbkxvY2F0aW9uKCk7CisJU3RyaW5nIGdldEFwcGxpY2F0aW9uTG9jYXRpb24oKTsKKwl2b2lkIHNldEFwcGxpY2F0aW9uTG9jYXRpb24oU3RyaW5nIGFwcGxpY2F0aW9uTG9jYXRpb24pOworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZID0gImFwcGxpY2F0aW9uTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCisJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19BUFBMSUNBVElPTl9MT0NBVElPTiA9ICJlY2xpcHNlbGluay5hcHBsaWNhdGlvbi1sb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0FQUExJQ0FUSU9OX0xPQ0FUSU9OID0gIi4iOyAvLyROT04tTkxTLTEkCisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxOThlMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworCitwdWJsaWMgY2xhc3MgRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzIHsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIERFRkFVTFRfUEFSTVMgPSBuZXcgU3RyaW5nWzBdOworCXByaXZhdGUgc3RhdGljIFRleHRSYW5nZSBERUZBVUxUX1RFWFRfUkFOR0UgPSBUZXh0UmFuZ2UuRW1wdHkuaW5zdGFuY2UoKTsKKwkKKwlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZSgKKwkJCWludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgT2JqZWN0IHRhcmdldE9iamVjdCkgeworCQlyZXR1cm4gYnVpbGRNZXNzYWdlKHNldmVyaXR5LCBtZXNzYWdlSWQsIERFRkFVTFRfUEFSTVMsIHRhcmdldE9iamVjdCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKAorCQkJaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcywgT2JqZWN0IHRhcmdldE9iamVjdCkgeworCQlyZXR1cm4gYnVpbGRNZXNzYWdlKHNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QsIERFRkFVTFRfVEVYVF9SQU5HRSk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKAorCQkJaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBPYmplY3QgdGFyZ2V0T2JqZWN0LCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7CisJCXJldHVybiBidWlsZE1lc3NhZ2Uoc2V2ZXJpdHksIG1lc3NhZ2VJZCwgREVGQVVMVF9QQVJNUywgdGFyZ2V0T2JqZWN0LCB0ZXh0UmFuZ2UpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZSgKKwkJCWludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXRPYmplY3QsIFRleHRSYW5nZSB0ZXh0UmFuZ2UpIHsKKwkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBFY2xpcHNlTGlua01lc3NhZ2UoRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQlVORExFX05BTUUsIHNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QpOworCQlpZiAodGV4dFJhbmdlID09IG51bGwpIHsKKwkJCS8vbG9nIGFuIGV4Y2VwdGlvbiBhbmQgdGhlbiBjb250aW51ZSB3aXRob3V0IHNldHRpbmcgbG9jYXRpb24gaW5mb3JtYXRpb24KKwkJCS8vQXQgbGVhc3QgdGhlIHVzZXIgd2lsbCBzdGlsbCBnZXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSBhbmQgd2lsbAorCQkJLy9iZSBhYmxlIHRvIHNlZSBvdGhlciB2YWxpZGF0aW9uIG1lc3NhZ2VzIHdpdGggdmFsaWQgdGV4dFJhbmdlcworCQkJSnB0Q29yZVBsdWdpbi5sb2cobmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCB0ZXh0IHJhbmdlIGZvciBtZXNzYWdlIElEOiAiICsgbWVzc2FnZUlkKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQllbHNlIHsKKwkJCW1lc3NhZ2Uuc2V0TGluZU5vKHRleHRSYW5nZS5nZXRMaW5lTnVtYmVyKCkpOworCQkJbWVzc2FnZS5zZXRPZmZzZXQodGV4dFJhbmdlLmdldE9mZnNldCgpKTsKKwkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7CisJCX0KKwkJcmV0dXJuIG1lc3NhZ2U7CisJfQorCQorCQorCXByaXZhdGUgRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzKCkgeworCQlzdXBlcigpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBVc2VkIHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2luZyB0aGlzIGNsYXNzTG9hZGVyLgorCSAqIE90aGVyd2lzZSB0aGUgd3N0IHZhbGlkYXRpb24gbWVzc2FnZSBhdHRlbXB0cyB0byB1c2UgdGhlIENsYXNzTG9hZGVyCisJICogb2YgSnBhVmFsaWRhdG9yIHdoaWNoIGlzIGluIHRoZSBvcmcuZWNsaXBzZS5qcHQuY29yZSBwbHVnaW4uCisJICogCisJICogQW5vdGhlciB3YXkgd2UgY291bGQgcG90ZW50aWFsbHkgc29sdmUgdGhpcyBpcyB0byBoYXZlIGEgc2VwYXJhdGUKKwkgKiBFY2xpc3BlTGlua0pwYVZhbGlkYXRvciBhbmQgc2V0IHVwIHRoZSBleHRlbnNpb24gcG9pbnRzIHNvIHRoYXQKKwkgKiBpdCBvbmx5IHJ1bnMgYWdhaW5zdCBqcGFQcm9qZWN0cyB3aXRoIHRoZSBFY2xpc3BlTGlua1BsYXRmb3JtCisJICogd2hpbGUgSnBhVmFsaWRhdG9yIHJ1bnMgYWdhaW5zdCBqcGFQcm9qZWN0cyB3aXRoIHRoZSBHZW5lcmljUGxhdGZvcm0uCisJICogSSBhbSB1bnN1cmUgaWYgdGhpcyBpcyBwb3NzaWJsZQorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIEVjbGlwc2VMaW5rTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2UgeworCQlwdWJsaWMgRWNsaXBzZUxpbmtNZXNzYWdlKFN0cmluZyBhQnVuZGxlTmFtZSwgaW50IGFTZXZlcml0eSwgU3RyaW5nIGFuSWQsIFN0cmluZ1tdIGFQYXJhbXMsIE9iamVjdCBhVGFyZ2V0T2JqZWN0KSB7CisJCQlzdXBlcihhQnVuZGxlTmFtZSwgYVNldmVyaXR5LCBhbklkLCBhUGFyYW1zLCBhVGFyZ2V0T2JqZWN0KTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoTG9jYWxlIGxvY2FsZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKwkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG51bGw7CisJCQl0cnkgeworCQkJCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRCdW5kbGVOYW1lKCksIGxvY2FsZSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKwkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIHN1cGVyLmdldEJ1bmRsZShsb2NhbGUsIGNsYXNzTG9hZGVyKTsKKwkJCX0KKwkJCXJldHVybiBidW5kbGU7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMzI2OGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkdlbmVyaWNKcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtGYWN0b3J5IGV4dGVuZHMgR2VuZXJpY0pwYUZhY3RvcnkKLXsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQocGFyZW50LCBwZXJzaXN0ZW5jZVVuaXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGFhOWNhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmludGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKKworLyoqCisgKiBQcm92aWRlcyBhbm5vdGF0aW9ucyBmb3IgMS4wIEVjbGlwc2VMaW5rIHBsYXRmb3JtCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIKKwlleHRlbmRzIEFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmludGlvblByb3ZpZGVyCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBJTlNUQU5DRSA9IAorCQkJbmV3IEVjbGlwc2VMaW5rSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCisJICovCisJcHVibGljIHN0YXRpYyBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgeworCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwkJCisJCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsJCQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgeworCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CQkKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7CQkKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwkJCisJCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkpOwkJCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZWJlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5KcGFQcm9qZWN0Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua0pwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSnBhRmFjdG9yeQorCWV4dGVuZHMgQWJzdHJhY3RKcGFGYWN0b3J5Cit7CisJcHVibGljIEVjbGlwc2VMaW5rSnBhRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvLyAqKioqKioqKioqIENvcmUgTW9kZWwgKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFY2xpcHNlTGlua0pwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZykgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rSnBhUHJvamVjdEltcGwoKEpwYVByb2plY3QyXzAuQ29uZmlnKSBjb25maWcpOworCX0KKwkKKwkKKwkKKwkvLyAqKioqKioqKioqIEphdmEgQ29udGV4dCBNb2RlbCAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUocGFyZW50LCBqcnBhKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFCYXNpY01hcHBpbmcgYnVpbGRKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyhwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUVtYmVkZGFibGUgYnVpbGRKYXZhRW1iZWRkYWJsZShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFFY2xpcHNlTGlua0VudGl0eSBidWlsZEphdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VudGl0eUltcGwocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFJZE1hcHBpbmcgYnVpbGRKYXZhSWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0lkTWFwcGluZyhwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBidWlsZEphdmFNYXBwZWRTdXBlcmNsYXNzKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbChwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YVZlcnNpb25NYXBwaW5nIGJ1aWxkSmF2YVZlcnNpb25NYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhT25lVG9NYW55TWFwcGluZyBidWlsZEphdmFPbmVUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFPbmVUb09uZU1hcHBpbmcgYnVpbGRKYXZhT25lVG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyhwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YU1hbnlUb01hbnlNYXBwaW5nIGJ1aWxkSmF2YU1hbnlUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nKHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhTWFueVRvT25lTWFwcGluZyBidWlsZEphdmFNYW55VG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcocGFyZW50KTsKKwl9CisKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyBidWlsZEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyhwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nIGJ1aWxkSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyhwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nIGJ1aWxkSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyhwYXJlbnQpOworCX0KKworCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyBidWlsZEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKHBhcmVudCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDlkZWZhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm1WYXJpYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFQbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5LlNpbXBsZVZlcnNpb247CisKKy8qKgorICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKKyAqIGl0IGlzIGluaXRpYWxpemVkKS4KKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1GYWN0b3J5CisJaW1wbGVtZW50cyBKcGFQbGF0Zm9ybUZhY3RvcnkKK3sKKworCS8qKgorCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtKFN0cmluZyBpZCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybSgKKwkJCWlkLAorCQkJYnVpbGRKcGFWZXJzaW9uKCksCisJCQluZXcgRWNsaXBzZUxpbmtKcGFGYWN0b3J5KCksIAorCQkJYnVpbGRKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKSwgCisJCQlFY2xpcHNlTGlua0pwYVBsYXRmb3JtUHJvdmlkZXIuaW5zdGFuY2UoKSwgCisJCQlidWlsZEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkpOworCX0KKwkKKwlwcml2YXRlIEpwYVBsYXRmb3JtLlZlcnNpb24gYnVpbGRKcGFWZXJzaW9uKCkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVmVyc2lvbigKKwkJCQlKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8xXzAsCisJCQkJSnB0Q29yZVBsdWdpbi5KUEFfRkFDRVRfVkVSU0lPTl8xXzAKKwkJCSk7CisJfQorCQorCXByb3RlY3RlZCBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYnVpbGRKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcigKKwkJCUdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCksCisJCQlFY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJfQorCQorCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBidWlsZEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgeworCQlyZXR1cm4gbmV3IEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgeworCQkJcHVibGljIFN1cHBvcnRlZCBnZXRUYWJsZVBlckNvbmNyZXRlQ2xhc3NJbmhlcml0YW5jZUlzU3VwcG9ydGVkKCkgeworCQkJCXJldHVybiBTdXBwb3J0ZWQuTk87CisJCQl9CisJCQlwdWJsaWMgYm9vbGVhbiBpc0pvaW5UYWJsZU92ZXJyaWRhYmxlKCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfTsKKwl9CisKKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgRWNsaXBzZUxpbmtWZXJzaW9uIGV4dGVuZHMgU2ltcGxlVmVyc2lvbiB7CisJCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZWNsaXBzZUxpbmtWZXJzaW9uOworCisJCXB1YmxpYyBFY2xpcHNlTGlua1ZlcnNpb24oU3RyaW5nIGVjbGlwc2VMaW5rVmVyc2lvbiwgU3RyaW5nIGpwYVZlcnNpb24pIHsKKwkJCXN1cGVyKGpwYVZlcnNpb24pOworCQkJdGhpcy5lY2xpcHNlTGlua1ZlcnNpb24gPSBlY2xpcHNlTGlua1ZlcnNpb247CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworCQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtWZXJzaW9uOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgRWNsaXBzZUxpbmsgdmVyc2lvbjogIiArIHRoaXMuZ2V0VmVyc2lvbigpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODhiYTg4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVudGl0eURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbERlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOworCisvKioKKyAqIEVjbGlwc2VMaW5rIHBsYXRmb3JtCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pwYVBsYXRmb3JtUHJvdmlkZXIKKwlleHRlbmRzIEFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcgoreworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVjbGlwc2VsaW5rLnBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAorCisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1Qcm92aWRlciBJTlNUQU5DRSA9IAorCQkJbmV3IEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlcigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVByb3ZpZGVyKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKiogcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKgkKKwkKKwlwdWJsaWMgSnBhUmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7CisJCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7CisJCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOworCQl9CisJCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7CisJCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKKwkJfQorCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKSkgeworCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzFfMF9SRVNPVVJDRV9UWVBFOworCQl9CisJCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKSkgeworCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKKwkJfQorCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKSkgeworCQkJcmV0dXJuIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFOworCQl9CisJCWVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb250ZW50VHlwZS50b1N0cmluZygpKTsKKwkJfQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gYnVpbGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCkgeworCQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCisJCXJldHVybiBuZXcgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10geworCQkJSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAorCQkJSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCisJCQlQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAorCQkJT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCisJCQlFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpfTsKKwl9CisKKwkKKwkvLyAqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmdzICoqKioqKioqKgkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCkgeworCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IGVjbGlwc2VsaW5rIHVzZXMKKwkJLy8gTk9URTogbm8gdHlwZSBtYXBwaW5ncyBzcGVjaWZpYyB0byBlY2xpcHNlbGluaworCQlyZXR1cm4gbmV3IEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7CisJCQlKYXZhRW50aXR5RGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uaW5zdGFuY2UoKX07CisJfQorCQorCQorCS8vICoqKioqKioqKiBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgeworCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IGVjbGlwc2VsaW5rIHVzZXMKKwkJcmV0dXJuIG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7CisJCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBidWlsZE5vbk51bGxTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgeworCQkvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBvcmRlciB0aGF0IGVjbGlwc2VsaW5rIHVzZXMKKwkJcmV0dXJuIG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7CisJCQlKYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07CisJfQorCQorCQorCS8vICoqKioqKioqKiBtYXBwaW5nIGZpbGVzICoqKioqKioqKgkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUmVzb3VyY2VEZWZpbml0aW9uW10gYnVpbGRSZXNvdXJjZURlZmluaXRpb25zKCkgeworCQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCisJCXJldHVybiBuZXcgUmVzb3VyY2VEZWZpbml0aW9uW10geworCQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJR2VuZXJpY09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhUHJvamVjdEltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYVByb2plY3RJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhYzc4YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYVByb2plY3RJbXBsLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLkpwYVByb2plY3QyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKKworLyoqCisgKiBFY2xpcHNlTGluay1zcGVjaWZpYyBKUEEgcHJvamVjdC4KKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSnBhUHJvamVjdEltcGwKKwlleHRlbmRzIEFic3RyYWN0SnBhUHJvamVjdAorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtKcGFQcm9qZWN0Cit7CisJcHVibGljIEVjbGlwc2VMaW5rSnBhUHJvamVjdEltcGwoSnBhUHJvamVjdDJfMC5Db25maWcgY29uZmlnKSB7CisJCXN1cGVyKGNvbmZpZyk7CisJfQorCisJcHVibGljIEpwYVhtbFJlc291cmNlIGdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCkgeworCQlyZXR1cm4gKEpwYVhtbFJlc291cmNlKSB0aGlzLmdldFJlc291cmNlTW9kZWwoCisJCQkJSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9GSUxFX1BBVEgsCisJCQkJSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFCisJCQkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTJlYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImVjbGlwc2VsaW5rX2pwYV92YWxpZGF0aW9uIjsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9FWFBJUllfQU5EX0VYUElSWV9USU1FX09GX0RBWV9CT1RIX1NQRUNJRklFRCA9ICJDQUNIRV9FWFBJUllfQU5EX0VYUElSWV9USU1FX09GX0RBWV9CT1RIX1NQRUNJRklFRCI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJURVJfQ0xBU1NfSU1QTEVNRU5UU19DT05WRVJURVIgPSAiQ09OVkVSVEVSX0NMQVNTX0lNUExFTUVOVFNfQ09OVkVSVEVSIjsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01JWkVSX0NMQVNTX0lNUExFTUVOVFNfREVTQ1JJUFRPUl9DVVNUT01JWkVSID0gIkNVU1RPTUlaRVJfQ0xBU1NfSU1QTEVNRU5UU19ERVNDUklQVE9SX0NVU1RPTUlaRVIiOworCQkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVBMRV9PQkpFQ1RfVkFMVUVTX0ZPUl9EQVRBX1ZBTFVFID0gIk1VTFRJUExFX09CSkVDVF9WQUxVRVNfRk9SX0RBVEFfVkFMVUUiOworCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmI3YTA2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlcjsKKworLyoqCisgKiBFY2xpcHNlTGluayBvcm0ueG1sCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlcgorCWltcGxlbWVudHMgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpwYVJlc291cmNlTW9kZWxQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7CisJCXJldHVybiBKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEU7CisJfQorCQorCXB1YmxpYyBKcGFYbWxSZXNvdXJjZSBidWlsZFJlc291cmNlTW9kZWwoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlKSB7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXIuZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihmaWxlKS5nZXRYbWxSZXNvdXJjZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua1BsYXRmb3JtLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtQbGF0Zm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2I2MjM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua1BsYXRmb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkdlbmVyaWNKcGFQbGF0Zm9ybTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGxhdGZvcm0gZXh0ZW5kcyBHZW5lcmljSnBhUGxhdGZvcm0KLXsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lY2xpcHNlbGluay5wbGF0Zm9ybSI7Ci0KLQkvLyAqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rUGxhdGZvcm0oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCS8vICoqKioqKioqKiBNb2RlbCBjb25zdHJ1Y3Rpb24gLyB1cGRhdGluZyAqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhRmFjdG9yeSBidWlsZEpwYUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtGYWN0b3J5KCk7Ci0JfQotCi0JLy8gKioqKioqKioqIGphdmEgYW5ub3RhdGlvbiBzdXBwb3J0ICoqKioqKioqKgotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5qYXZhCmluZGV4IGY5MTNmY2QuLjdiYjJmZDIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw3ICs5LDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKIAogLyoqCkBAIC0xOCw0MiArMjUsMTExIEBACiBwdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luCiB7CiAJLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbiBwbHVnaW47Ci0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUiOyAvLyROT04tTkxTLTEkCisJCiAJLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCisJICogVmVyc2lvbiBzdHJpbmcgZm9yIEVjbGlwc2VMaW5rIHBsYXRmb3JtIHZlcnNpb24gMS4wCiAJICovCi0JcHVibGljIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbigpIHt9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzFfMCA9ICIxLjAiOyAgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFZlcnNpb24gc3RyaW5nIGZvciBFY2xpcHNlTGluayBwbGF0Zm9ybSB2ZXJzaW9uIDEuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1BMQVRGT1JNX1ZFUlNJT05fMV8xID0gIjEuMSI7ICAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogVmVyc2lvbiBzdHJpbmcgZm9yIEVjbGlwc2VMaW5rIHBsYXRmb3JtIHZlcnNpb24gMi4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8yXzAgPSAiMi4wIjsgIC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBWYWx1ZSBvZiB0aGUgY29udGVudC10eXBlIGZvciBlY2xpcHNlbGluay1vcm0ueG1sICBtYXBwaW5ncyBmaWxlcy4gVXNlIHRoaXMgCisJICogdmFsdWUgdG8gcmV0cmlldmUgdGhlIE9STSB4bWwgY29udGVudCB0eXBlIGZyb20gdGhlIGNvbnRlbnQgdHlwZSBtYW5hZ2VyIAorCSAqIGFuZCB0byBhZGQgbmV3IGVjbGlwc2VsaW5rLW9ybS54bWwtbGlrZSBleHRlbnNpb25zIHRvIHRoaXMgY29udGVudCB0eXBlLgogCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyI2dldENvbnRlbnRUeXBlKFN0cmluZykKIAkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBFQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSA9IAorCQkJUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoUExVR0lOX0lEICsgIi5jb250ZW50Lm9ybSIpOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogVGhlIHJlc291cmNlIHR5cGUgZm9yIGVjbGlwc2VsaW5rLW9ybS54bWwgdmVyc2lvbiAxLjAgbWFwcGluZyBmaWxlcworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VUeXBlIEVDTElQU0VMSU5LX09STV9YTUxfMV8wX1JFU09VUkNFX1RZUEUKKwkJCT0gbmV3IEpwYVJlc291cmNlVHlwZShFQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rLlNDSEVNQV9WRVJTSU9OKTsKKwkKKwkvKioKKwkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgZWNsaXBzZWxpbmstb3JtLnhtbCB2ZXJzaW9uIDEuMSBtYXBwaW5nIGZpbGVzCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBKcGFSZXNvdXJjZVR5cGUgRUNMSVBTRUxJTktfT1JNX1hNTF8xXzFfUkVTT1VSQ0VfVFlQRQorCQkJPSBuZXcgSnBhUmVzb3VyY2VUeXBlKEVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMS5TQ0hFTUFfVkVSU0lPTik7CisJCisJLyoqCisJICogVGhlIHJlc291cmNlIHR5cGUgZm9yIGVjbGlwc2VsaW5rLW9ybS54bWwgdmVyc2lvbiAyLjAgbWFwcGluZyBmaWxlcworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VUeXBlIEVDTElQU0VMSU5LX09STV9YTUxfMl8wX1JFU09VUkNFX1RZUEUKKwkJCT0gbmV3IEpwYVJlc291cmNlVHlwZShFQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzAuU0NIRU1BX1ZFUlNJT04pOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9GSUxFX1BBVEggPSAiTUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbCI7IC8vJE5PTi1OTFMtMSQKKwkKKwkKKwkvLyAqKioqKioqKioqIHNpbmdsZXRvbiAqKioqKioqKioqCisJcHJpdmF0ZSBzdGF0aWMgSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luIElOU1RBTkNFOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uIEpQVCBFY2xpcHNlTGluayBwbHVnLWluLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgbWFwcGluZyBmaWxlIGRlcGxveW1lbnQgVVJJIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuCisJICogKCJXRUItSU5GL2NsYXNzZXMvTUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbCIgZm9yIHdlYiBwcm9qZWN0cyBhbmQKKwkgKiAgIk1FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiIGluIG90aGVyIGNhc2VzKQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbERlcGxveW1lbnRVUkkoSVByb2plY3QgcHJvamVjdCkgeworCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXREZXBsb3ltZW50VVJJKHByb2plY3QsIERFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9GSUxFX1BBVEgpOworCX0KKwkKKwkvKioKKwkgKiBMb2cgdGhlIHNwZWNpZmllZCBzdGF0dXMuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgeworCQlJTlNUQU5DRS5nZXRMb2coKS5sb2coc3RhdHVzKTsKKyAgICB9CisJCisJLyoqCisJICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKKyAgICAgICAgbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwpKTsKKyAgICB9CisJCisJLyoqCisJICogTG9nIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIG9yIGVycm9yLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgeworCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSkpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHBsdWctaW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgkKKwkKKwlwdWJsaWMgSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luKCkgeworCQlzdXBlcigpOworCX0KKwkJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7CisJCUlOU1RBTkNFID0gdGhpczsKIAl9CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7CisJCUlOU1RBTkNFID0gbnVsbDsKIAkJc3VwZXIuc3RvcChjb250ZXh0KTsKIAl9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rSnBhUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNmI0MTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uRWNsaXBzZUxpbmtDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5FY2xpcHNlTGlua0N1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkVjbGlwc2VMaW5rTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnMuRWNsaXBzZUxpbmtPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pwYVByb3BlcnRpZXMgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1Byb3BlcnRpZXMKLXsKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQ7Ci0JCi0JcHJpdmF0ZSBDYWNoaW5nIGNhY2hpbmc7Ci0JcHJpdmF0ZSBDb25uZWN0aW9uIGNvbm5lY3Rpb247Ci0JcHJpdmF0ZSBDdXN0b21pemF0aW9uIGN1c3RvbWl6YXRpb247Ci0JcHJpdmF0ZSBMb2dnaW5nIGxvZ2dpbmc7Ci0JcHJpdmF0ZSBPcHRpb25zIG9wdGlvbnM7Ci0JcHJpdmF0ZSBTY2hlbWFHZW5lcmF0aW9uIHNjaGVtYUdlbmVyYXRpb247Ci0JCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydGllc0FkYXB0ZXI7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlcjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pbml0aWFsaXplKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0ID0gcGFyZW50OwotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBwZXJzaXN0ZW5jZVVuaXRIb2xkZXIgPSAKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0Pih0aGlzLnBlcnNpc3RlbmNlVW5pdCk7Ci0JCQotCQl0aGlzLnByb3BlcnRpZXNBZGFwdGVyID0gdGhpcy5idWlsZFByb3BlcnRpZXNBZGFwdGVyKHBlcnNpc3RlbmNlVW5pdEhvbGRlcik7Ci0JCXRoaXMucHJvcGVydHlMaXN0QWRhcHRlciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUxpc3RBZGFwdGVyKHRoaXMucHJvcGVydGllc0FkYXB0ZXIpOwotCQkKLQkJdGhpcy5jYWNoaW5nID0gdGhpcy5idWlsZENhY2hpbmcoKTsKLQkJdGhpcy5jb25uZWN0aW9uID0gdGhpcy5idWlsZENvbm5lY3Rpb24oKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uID0gdGhpcy5idWlsZEN1c3RvbWl6YXRpb24oKTsKLQkJdGhpcy5sb2dnaW5nID0gdGhpcy5idWlsZExvZ2dpbmcoKTsKLQkJdGhpcy5vcHRpb25zID0gdGhpcy5idWlsZE9wdGlvbnMoKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uID0gdGhpcy5idWlsZFNjaGVtYUdlbmVyYXRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBidWlsZFByb3BlcnR5TGlzdEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnRpZXNBZGFwdGVyKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFByb3BlcnR5Pihwcm9wZXJ0aWVzQWRhcHRlciwgUHJvcGVydHkuVkFMVUVfUFJPUEVSVFkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IGJ1aWxkUHJvcGVydGllc0FkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgUHJvcGVydHk+KHN1YmplY3RIb2xkZXIsIFBlcnNpc3RlbmNlVW5pdC5QUk9QRVJUSUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxQcm9wZXJ0eT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnByb3BlcnRpZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucHJvcGVydGllc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENhY2hpbmcgYnVpbGRDYWNoaW5nKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ2FjaGluZyh0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLCB0aGlzLnByb3BlcnR5TGlzdEFkYXB0ZXIoKSk7Ci0JfQotCQotCXByaXZhdGUgQ29ubmVjdGlvbiBidWlsZENvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDb25uZWN0aW9uKHRoaXMucGVyc2lzdGVuY2VVbml0KCksIHRoaXMucHJvcGVydHlMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIEN1c3RvbWl6YXRpb24gYnVpbGRDdXN0b21pemF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbih0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLCB0aGlzLnByb3BlcnR5TGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMb2dnaW5nIGJ1aWxkTG9nZ2luZygpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0xvZ2dpbmcodGhpcy5wZXJzaXN0ZW5jZVVuaXQoKSwgdGhpcy5wcm9wZXJ0eUxpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgT3B0aW9ucyBidWlsZE9wdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcHRpb25zKHRoaXMucGVyc2lzdGVuY2VVbml0KCksIHRoaXMucHJvcGVydHlMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFNjaGVtYUdlbmVyYXRpb24gYnVpbGRTY2hlbWFHZW5lcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbih0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLCB0aGlzLnByb3BlcnR5TGlzdEFkYXB0ZXIoKSk7Ci0JfQotCQotCS8vICoqKioqKioqIEJlaGF2aW9yICoqKioqKioqKgotCXB1YmxpYyBDYWNoaW5nIGdldENhY2hpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hpbmc7Ci0JfQotCQotCXB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb247Ci0JfQotCi0JcHVibGljIEN1c3RvbWl6YXRpb24gZ2V0Q3VzdG9taXphdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXphdGlvbjsKLQl9Ci0KLQlwdWJsaWMgTG9nZ2luZyBnZXRMb2dnaW5nKCkgewotCQlyZXR1cm4gdGhpcy5sb2dnaW5nOwotCX0KLQotCXB1YmxpYyBPcHRpb25zIGdldE9wdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnM7Ci0JfQotCQotCXB1YmxpYyBTY2hlbWFHZW5lcmF0aW9uIGdldFNjaGVtYUdlbmVyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYUdlbmVyYXRpb247Ci0JfQotCi0JcHVibGljIExpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBwcm9wZXJ0aWVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMucHJvcGVydGllc0FkYXB0ZXI7Ci0JfQotCi0JcHVibGljIExpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBwcm9wZXJ0eUxpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5wcm9wZXJ0eUxpc3RBZGFwdGVyOwotCX0KLQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXQ7Ci0JfQotCQotCXB1YmxpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLnBlcnNpc3RlbmNlVW5pdC5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXRlbUlzUHJvcGVydHkoUHJvcGVydHkgaXRlbSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5SWRGb3IoUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjY1Zjk0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLQotLyoqCi0gKiBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgZXh0ZW5kcyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ci17Ci0JcHJpdmF0ZSBFY2xpcHNlTGlua1Byb3BlcnRpZXMgZWNsaXBzZUxpbmtQcm9wZXJ0aWVzOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdChQZXJzaXN0ZW5jZSBwYXJlbnQsIFhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJc3VwZXIocGFyZW50LCBwZXJzaXN0ZW5jZVVuaXQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCkgewotCQlzdXBlci5pbml0aWFsaXplKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCXRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzID0gbmV3IEVjbGlwc2VMaW5rSnBhUHJvcGVydGllcyh0aGlzKTsKLQl9Ci0KLQkvLyAqKioqKioqKiBCZWhhdmlvciAqKioqKioqKioKLQlwdWJsaWMgQ2FjaGluZyBnZXRDYWNoaW5nKCkgewotCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMuZ2V0Q2FjaGluZygpOwotCX0KLQkKLQlwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMuZ2V0Q29ubmVjdGlvbigpOwotCX0KLQotCXB1YmxpYyBDdXN0b21pemF0aW9uIGdldEN1c3RvbWl6YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcy5nZXRDdXN0b21pemF0aW9uKCk7Ci0JfQotCi0JcHVibGljIExvZ2dpbmcgZ2V0TG9nZ2luZygpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzLmdldExvZ2dpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hR2VuZXJhdGlvbiBnZXRTY2hlbWFHZW5lcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMuZ2V0U2NoZW1hR2VuZXJhdGlvbigpOwotCX0KLQotCXB1YmxpYyBPcHRpb25zIGdldE9wdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcy5nZXRPcHRpb25zKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTYxNTFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLSAqIAotICogTGlzdGVucyB0byB0aGUgcHJvcGVydHlMaXN0QWRhcHRlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCAKLQkJCQlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLXsKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQ7Ci0KLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdFByb3BlcnR5TGlzdExpc3RlbmVyIHByb3BlcnR5TGlzdExpc3RlbmVyOwotCi0JLy8ga2V5ID0gRWNsaXBzZUxpbmsgcHJvcGVydHkga2V5OyB2YWx1ZSA9IHByb3BlcnR5IGlkCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAvIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzKAotCQkJUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgCi0JCQlMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmluaXRpYWxpemUocGFyZW50LCBwcm9wZXJ0eUxpc3RBZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKAotCQkJUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgCi0JCQlMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlcikgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCA9IHBhcmVudDsKLQkJCi0JCXRoaXMucHJvcGVydHlMaXN0TGlzdGVuZXIgPSBuZXcgUGVyc2lzdGVuY2VVbml0UHJvcGVydHlMaXN0TGlzdGVuZXIodGhpcyk7Ci0JCXByb3BlcnR5TGlzdEFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLnByb3BlcnR5TGlzdExpc3RlbmVyKTsKLQkJCi0JCXRoaXMuaW5pdGlhbGl6ZVByb3BlcnR5TmFtZXMoKTsKLQkJdGhpcy5pbml0aWFsaXplUHJvcGVydGllcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0eU5hbWVzKCkgewotCQl0aGlzLnByb3BlcnR5TmFtZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJdGhpcy5hZGRQcm9wZXJ0eU5hbWVzKHRoaXMucHJvcGVydHlOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCk7Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0OwotCX0KLQkKLQlwdWJsaWMgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXQuZ2V0SnBhUHJvamVjdCgpOwotCX0KLQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eUxpc3RMaXN0ZW5lciBwcm9wZXJ0eUxpc3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIHRoaXMucHJvcGVydHlMaXN0TGlzdGVuZXI7Ci0JfQotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHVzZWQgYnkgdGhlIG1ldGhvZHM6IGl0ZW1Jc1Byb3BlcnR5Ci0JICogYW5kIHByb3BlcnR5SWRGb3IuCi0JICogCi0JICoga2V5ID0gRWNsaXBzZUxpbmsgcHJvcGVydHkga2V5OyB2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpOwotCi0JLyoqCi0JICogTWV0aG9kIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHRoZSBnaXZlbiBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpdGVtSXNQcm9wZXJ0eShQcm9wZXJ0eSBpdGVtKSB7Ci0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb3BlcnR5IGlzIG51bGwiKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5wcm9wZXJ0eU5hbWVzKCkua2V5U2V0KCkuY29udGFpbnMoaXRlbS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgdXNlZCBmb3IgY2hhbmdlIG5vdGlmaWNhdGlvbiBvZiB0aGUgZ2l2ZW4KLQkgKiBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5SWRGb3IoUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJU3RyaW5nIHByb3BlcnR5SWQgPSB0aGlzLnByb3BlcnR5TmFtZXMoKS5nZXQocHJvcGVydHkuZ2V0TmFtZSgpKTsKLQkJaWYgKHByb3BlcnR5SWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBwcm9wZXJ0eTogIiArIHByb3BlcnR5LnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eUlkOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZWNsaXBzZUxpbmtLZXlGb3IoU3RyaW5nIHByb3BlcnR5SWQpIHsKLQkJZm9yIChTdHJpbmcgZWNsaXBzZUxpbmtLZXkgOiB0aGlzLnByb3BlcnR5TmFtZXMoKS5rZXlTZXQoKSkgewotCQkJaWYgKHRoaXMucHJvcGVydHlOYW1lcygpLmdldChlY2xpcHNlTGlua0tleSkuZXF1YWxzKHByb3BlcnR5SWQpKSB7Ci0JCQkJcmV0dXJuIGVjbGlwc2VMaW5rS2V5OwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eUlkKTsKLQl9Ci0KLQkvLyAqKioqKiogZ2V0L3NldCBTdHJpbmcgY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBnaXZlbiBQcm9wZXJ0eSBmcm9tIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKFN0cmluZyBlbEtleSkgewotCQlyZXR1cm4gdGhpcy5nZXRTdHJpbmdWYWx1ZShlbEtleSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdWYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcga2V5U3VmZml4KSB7Ci0JCVN0cmluZyBlbEtleSA9IChrZXlTdWZmaXggPT0gbnVsbCkgPyBrZXkgOiBrZXkgKyBrZXlTdWZmaXg7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmNvbnRhaW5zUHJvcGVydHkoZWxLZXkpKSB7Ci0JCQkvLyBUT1JFVklFVyAtIGhhbmRsZSBpbmNvcnJlY3QgU3RyaW5nIGluIHBlcnNpc3RlbmNlLnhtbAotCQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpLmdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUHV0IHRoZSBnaXZlbiBTdHJpbmcgdmFsdWUgaW50byB0aGUgUGVyc2lzdGVuY2VYbWwuCi0JICogQHBhcmFtIGtleSAtCi0JICogICAgICAgICAgICBFY2xpcHNlTGluayBLZXkKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHV0U3RyaW5nVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCXRoaXMucHV0U3RyaW5nVmFsdWUoa2V5LCBudWxsLCBuZXdWYWx1ZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgZ2l2ZW4gU3RyaW5nIHZhbHVlIGludG8gdGhlIFBlcnNpc3RlbmNlWG1sLgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEVjbGlwc2VMaW5rIEtleQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKLQkgKiBAcGFyYW0gYWxsb3dEdXBsaWNhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXRTdHJpbmdWYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcgbmV3VmFsdWUsIGJvb2xlYW4gYWxsb3dEdXBsaWNhdGUpIHsKLQkJdGhpcy5wdXRTdHJpbmdWYWx1ZShrZXksIG51bGwsIG5ld1ZhbHVlLCBhbGxvd0R1cGxpY2F0ZSk7Ci0JfQotCi0JLyoqCi0JICogUHV0IHRoZSBnaXZlbiBTdHJpbmcgdmFsdWUgaW50byB0aGUgUGVyc2lzdGVuY2VYbWwuCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgRWNsaXBzZUxpbmsgS2V5Ci0JICogQHBhcmFtIGtleVN1ZmZpeAotCSAqICAgICAgICAgICAgZS5nLiBlbnRpdHkgbmFtZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKLQkgKiBAcGFyYW0gYWxsb3dEdXBsaWNhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXRTdHJpbmdWYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcga2V5U3VmZml4LCBTdHJpbmcgbmV3VmFsdWUsIGJvb2xlYW4gYWxsb3dEdXBsaWNhdGUpIHsKLQkJU3RyaW5nIGVsS2V5ID0gKGtleVN1ZmZpeCA9PSBudWxsKSA/IGtleSA6IGtleSArIGtleVN1ZmZpeDsKLQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkoZWxLZXkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5wdXRQcm9wZXJ0eShlbEtleSwgbmV3VmFsdWUsIGFsbG93RHVwbGljYXRlKTsKLQkJfQotCX0KLQotCS8vICoqKioqKiBJbnRlZ2VyIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgdGhlIEludGVnZXIgdmFsdWUgb2YgdGhlIGdpdmVuIFByb3BlcnR5IGZyb20gdGhlIFBlcnNpc3RlbmNlWG1sLgotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIGdldEludGVnZXJWYWx1ZShTdHJpbmcgZWxLZXkpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SW50ZWdlclZhbHVlKGVsS2V5LCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBnZXRJbnRlZ2VyVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIGtleVN1ZmZpeCkgewotCQlTdHJpbmcgZWxLZXkgPSAoa2V5U3VmZml4ID09IG51bGwpID8ga2V5IDoga2V5ICsga2V5U3VmZml4OwotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5jb250YWluc1Byb3BlcnR5KGVsS2V5KSkgewotCQkJU3RyaW5nIGVjbGlwc2VMaW5rVmFsdWUgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KS5nZXRWYWx1ZSgpOwotCQkJLy8gVE9SRVZJRVcgLSBoYW5kbGUgaW5jb3JyZWN0IGVjbGlwc2VMaW5rVmFsdWUgU3RyaW5nIGluCi0JCQkvLyBwZXJzaXN0ZW5jZS54bWwKLQkJCXJldHVybiBnZXRJbnRlZ2VyVmFsdWVPZihlY2xpcHNlTGlua1ZhbHVlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBQdXQgdGhlIGdpdmVuIEludGVnZXIgdmFsdWUgaW50byB0aGUgUGVyc2lzdGVuY2VYbWwuCi0JICogQHBhcmFtIGtleSAtCi0JICogICAgICAgICAgICBFY2xpcHNlTGluayBLZXkKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHV0SW50ZWdlclZhbHVlKFN0cmluZyBrZXksIEludGVnZXIgbmV3VmFsdWUpIHsKLQkJdGhpcy5wdXRJbnRlZ2VyVmFsdWUoa2V5LCBudWxsLCBuZXdWYWx1ZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgZ2l2ZW4gSW50ZWdlciB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBFY2xpcHNlTGluayBLZXkKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0JICogQHBhcmFtIGFsbG93RHVwbGljYXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHV0SW50ZWdlclZhbHVlKFN0cmluZyBrZXksIEludGVnZXIgbmV3VmFsdWUsIGJvb2xlYW4gYWxsb3dEdXBsaWNhdGUpIHsKLQkJdGhpcy5wdXRJbnRlZ2VyVmFsdWUoa2V5LCBudWxsLCBuZXdWYWx1ZSwgYWxsb3dEdXBsaWNhdGUpOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgZ2l2ZW4gSW50ZWdlciB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBFY2xpcHNlTGluayBLZXkKLQkgKiBAcGFyYW0ga2V5U3VmZml4Ci0JICogICAgICAgICAgICBlLmcuIGVudGl0eSBuYW1lCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotCSAqIEBwYXJhbSBhbGxvd0R1cGxpY2F0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1dEludGVnZXJWYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcga2V5U3VmZml4LCBJbnRlZ2VyIG5ld1ZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlKSB7Ci0JCVN0cmluZyBlbEtleSA9IChrZXlTdWZmaXggPT0gbnVsbCkgPyBrZXkgOiBrZXkgKyBrZXlTdWZmaXg7Ci0JCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KGVsS2V5KTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0KCkucHV0UHJvcGVydHkoZWxLZXksIG5ld1ZhbHVlLnRvU3RyaW5nKCksIGFsbG93RHVwbGljYXRlKTsKLQkJfQotCX0KLQotCS8vICoqKioqKiBCb29sZWFuIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBCb29sZWFuIHZhbHVlIG9mIHRoZSBnaXZlbiBQcm9wZXJ0eSBmcm9tIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoU3RyaW5nIGVsS2V5KSB7Ci0JCXJldHVybiB0aGlzLmdldEJvb2xlYW5WYWx1ZShlbEtleSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQm9vbGVhbiB2YWx1ZSBvZiB0aGUgZ2l2ZW4gUHJvcGVydHkgZnJvbSB0aGUgUGVyc2lzdGVuY2VYbWwuCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKFN0cmluZyBrZXksIFN0cmluZyBrZXlTdWZmaXgpIHsKLQkJU3RyaW5nIGVsS2V5ID0gKGtleVN1ZmZpeCA9PSBudWxsKSA/IGtleSA6IGtleSArIGtleVN1ZmZpeDsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0KCkuY29udGFpbnNQcm9wZXJ0eShlbEtleSkpIHsKLQkJCVN0cmluZyBlY2xpcHNlTGlua1ZhbHVlID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkuZ2V0VmFsdWUoKTsKLQkJCS8vIFRPUkVWSUVXIC0gaGFuZGxlIGluY29ycmVjdCBlY2xpcHNlTGlua1ZhbHVlIFN0cmluZyBpbgotCQkJLy8gcGVyc2lzdGVuY2UueG1sCi0JCQlyZXR1cm4gZ2V0Qm9vbGVhblZhbHVlT2YoZWNsaXBzZUxpbmtWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUHV0IHRoZSBnaXZlbiBCb29sZWFuIHZhbHVlIGludG8gdGhlIFBlcnNpc3RlbmNlWG1sLgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEVjbGlwc2VMaW5rIEtleQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXRCb29sZWFuVmFsdWUoU3RyaW5nIGtleSwgQm9vbGVhbiBuZXdWYWx1ZSkgewotCQl0aGlzLnB1dEJvb2xlYW5WYWx1ZShrZXksIG51bGwsIG5ld1ZhbHVlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUHV0IHRoZSBnaXZlbiBCb29sZWFuIHZhbHVlIGludG8gdGhlIFBlcnNpc3RlbmNlWG1sLgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEVjbGlwc2VMaW5rIEtleQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKLQkgKiBAcGFyYW0gYWxsb3dEdXBsaWNhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXRCb29sZWFuVmFsdWUoU3RyaW5nIGtleSwgQm9vbGVhbiBuZXdWYWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZSkgewotCQl0aGlzLnB1dEJvb2xlYW5WYWx1ZShrZXksIG51bGwsIG5ld1ZhbHVlLCBhbGxvd0R1cGxpY2F0ZSk7Ci0JfQotCi0JLyoqCi0JICogUHV0IHRoZSBnaXZlbiBCb29sZWFuIHZhbHVlIGludG8gdGhlIFBlcnNpc3RlbmNlWG1sLgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEVjbGlwc2VMaW5rIEtleQotCSAqIEBwYXJhbSBrZXlTdWZmaXgKLQkgKiAgICAgICAgICAgIGUuZy4gZW50aXR5IG5hbWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0JICogQHBhcmFtIGFsbG93RHVwbGljYXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHV0Qm9vbGVhblZhbHVlKFN0cmluZyBrZXksIFN0cmluZyBrZXlTdWZmaXgsIEJvb2xlYW4gbmV3VmFsdWUsIGJvb2xlYW4gYWxsb3dEdXBsaWNhdGUpIHsKLQkJU3RyaW5nIGVsS2V5ID0gKGtleVN1ZmZpeCA9PSBudWxsKSA/IGtleSA6IGtleSArIGtleVN1ZmZpeDsKLQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkoZWxLZXkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5wdXRQcm9wZXJ0eShlbEtleSwgbmV3VmFsdWUudG9TdHJpbmcoKSwgYWxsb3dEdXBsaWNhdGUpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqIEVudW0gY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqIAotCS8qKgotCSAqIFJldHVybnMgdGhlIEVudW0gdmFsdWUgb2YgdGhlIGdpdmVuIFByb3BlcnR5IGZyb20gdGhlIFBlcnNpc3RlbmNlWG1sLgotCSAqLwotCXByb3RlY3RlZCA8VCBleHRlbmRzIEVudW08VD4+IFQgZ2V0RW51bVZhbHVlKFN0cmluZyBlbEtleSwgVFtdIGVudW1WYWx1ZXMpIHsKLQkJcmV0dXJuIGdldEVudW1WYWx1ZShlbEtleSwgbnVsbCwgZW51bVZhbHVlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgRW51bTxUPj4gVCBnZXRFbnVtVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIGtleVN1ZmZpeCwgVFtdIGVudW1WYWx1ZXMpIHsKLQkJU3RyaW5nIGVsS2V5ID0gKGtleVN1ZmZpeCA9PSBudWxsKSA/IGtleSA6IGtleSArIGtleVN1ZmZpeDsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0KCkuY29udGFpbnNQcm9wZXJ0eShlbEtleSkpIHsKLQkJCVN0cmluZyBlbFN0cmluZ1ZhbHVlID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkuZ2V0VmFsdWUoKTsKLQkJCS8vIFRPUkVWSUVXIC0gaGFuZGxlIGluY29ycmVjdCBlY2xpcHNlTGlua1ZhbHVlIFN0cmluZyBpbiBwZXJzaXN0ZW5jZS54bWwKLQkJCXJldHVybiBnZXRFbnVtVmFsdWVPZihlbFN0cmluZ1ZhbHVlLCBlbnVtVmFsdWVzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBQdXQgdGhlIGdpdmVuIEVudW0gdmFsdWUgaW50byB0aGUgUGVyc2lzdGVuY2VYbWwuCi0JICogCi0JICogQHBhcmFtIGtleSAtCi0JICogICAgICAgICAgICBFY2xpcHNlTGluayBLZXkKLQkgKi8KLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBFbnVtPFQ+PiB2b2lkIHB1dEVudW1WYWx1ZShTdHJpbmcga2V5LCBUIG5ld1ZhbHVlKSB7Ci0JCXRoaXMucHV0RW51bVZhbHVlKGtleSwgbnVsbCwgbmV3VmFsdWUsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBFbnVtPFQ+PiB2b2lkIHB1dEVudW1WYWx1ZShTdHJpbmcga2V5LCBUIG5ld1ZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlKSB7Ci0JCXRoaXMucHV0RW51bVZhbHVlKGtleSwgbnVsbCwgbmV3VmFsdWUsIGFsbG93RHVwbGljYXRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBFbnVtPFQ+PiB2b2lkIHB1dEVudW1WYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcga2V5U3VmZml4LCBUIG5ld1ZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlKSB7Ci0JCVN0cmluZyBlbEtleSA9IChrZXlTdWZmaXggPT0gbnVsbCkgPyBrZXkgOiBrZXkgKyBrZXlTdWZmaXg7Ci0JCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KGVsS2V5KTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0KCkucHV0UHJvcGVydHkoZWxLZXksIGdldEVjbGlwc2VMaW5rU3RyaW5nVmFsdWVPZihuZXdWYWx1ZSksIGFsbG93RHVwbGljYXRlKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqIENvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioKLQkvKioKLQkgKiBQdXQgaW50byBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcy4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IC0KLQkgKiAgICAgICAgICAgIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUgLQotCSAqICAgICAgICAgICAgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgdm9pZCBwdXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJU3RyaW5nIGVsS2V5ID0gdGhpcy5lY2xpcHNlTGlua0tleUZvcihrZXkpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXRoaXMucmVtb3ZlUHJvcGVydHkoZWxLZXkpOwotCQllbHNlIGlmICh2YWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKQotCQkJdGhpcy5wdXRFbnVtVmFsdWUoZWxLZXksIChFbnVtKSB2YWx1ZSk7Ci0JCWVsc2UKLQkJCSB0aGlzLnB1dFByb3BlcnR5XyhlbEtleSwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwdXRQcm9wZXJ0eV8oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0KCkucHV0UHJvcGVydHkoa2V5LCB2YWx1ZS50b1N0cmluZygpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcgZWxLZXkpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShlbEtleSk7Ci0JfQotCi0JcHJvdGVjdGVkIFNldDxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllc1NldFdpdGhQcmVmaXgoU3RyaW5nIGtleVByZWZpeCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLnByb3BlcnRpZXNXaXRoUHJlZml4KGtleVByZWZpeCkpOwotCX0KLQotCS8qKgotCSAqIEV4dHJhY3RzIHRoZSBlbnRpdHlOYW1lIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgbmFtZS4gSWYgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBoYXMgbm8gc3VmZml4LCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RW50aXR5TmFtZShQcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZ2V0RW50aXR5TmFtZShwcm9wZXJ0eS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEV4dHJhY3RzIHRoZSBlbnRpdHlOYW1lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nLiBJZiB0aGUgc3RyaW5nCi0JICogaGFzIG5vIHN1ZmZpeCwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVudGl0eU5hbWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpbnQgaW5kZXggPSBwcm9wZXJ0eU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQl9Ci0KLQkvLyAqKioqKiogU3RhdGljIG1ldGhvZHMgKioqKioqKiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBFY2xpcHNlTGluayBzdHJpbmcgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFY2xpcHNlTGlua1N0cmluZ1ZhbHVlT2YoT2JqZWN0IHZhbHVlKSB7Ci0JCQotCQlpZiAodmFsdWUuZ2V0Q2xhc3MoKS5pc0VudW0oKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIENsYXNzVG9vbHMuc3RhdGljRmllbGRWYWx1ZSh2YWx1ZS5nZXRDbGFzcygpLCB2YWx1ZS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkpOwotCQl9Ci0JCXJldHVybiB2YWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVudW0gY29uc3RhbnQgb2YgdGhlIHNwZWNpZmllZCBlbnVtIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBFbnVtPFQ+PiBUIGdldEVudW1WYWx1ZU9mKFN0cmluZyBlbFN0cmluZ1ZhbHVlLCBUW10gZW51bVZhbHVlcykgewotCQlmb3IgKFQgZW51bVZhbHVlIDogZW51bVZhbHVlcykgewotCQkJaWYgKGdldEVjbGlwc2VMaW5rU3RyaW5nVmFsdWVPZihlbnVtVmFsdWUpLmVxdWFscyhlbFN0cmluZ1ZhbHVlKSkgewotCQkJCXJldHVybiBlbnVtVmFsdWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIGdldEJvb2xlYW5WYWx1ZU9mKFN0cmluZyBlbFN0cmluZ1ZhbHVlKSB7Ci0JCWlmIChlbFN0cmluZ1ZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YoZWxTdHJpbmdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbnRlZ2VyIGdldEludGVnZXJWYWx1ZU9mKFN0cmluZyBlbFN0cmluZ1ZhbHVlKSB7Ci0JCWlmIChlbFN0cmluZ1ZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoZWxTdHJpbmdWYWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua1Byb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJjMGJiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua1Byb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotCi0vKioKLSAqICBFY2xpcHNlTGlua1Byb3BlcnRpZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1Byb3BlcnRpZXMgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JQ2FjaGluZyBnZXRDYWNoaW5nKCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19QUk9QRVJUWSA9ICJjYWNoaW5nUHJvcGVydHkiOwotCQkKLQlDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fUFJPUEVSVFkgPSAiY29ubmVjdGlvblByb3BlcnR5IjsKLQkKLQlDdXN0b21pemF0aW9uIGdldEN1c3RvbWl6YXRpb24oKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01JWkFUSU9OX1BST1BFUlRZID0gImN1c3RvbWl6YXRpb25Qcm9wZXJ0eSI7Ci0JCQotCQlMb2dnaW5nIGdldExvZ2dpbmcoKTsKLQkJCXN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0lOR19QUk9QRVJUWSA9ICJsb2dnaW5nUHJvcGVydHkiOwotCQkJCi0JCU9wdGlvbnMgZ2V0T3B0aW9ucygpOwotCQkJc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05TX1BST1BFUlRZID0gIm9wdGlvbnNQcm9wZXJ0eSI7Ci0JCQotCVNjaGVtYUdlbmVyYXRpb24gZ2V0U2NoZW1hR2VuZXJhdGlvbigpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9HRU5FUkFUSU9OX1BST1BFUlRZID0gInNjaGVtYUdlbmVyYXRpb25Qcm9wZXJ0eSI7Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNmU5NGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBleHRlbmRzIE1vZGVsLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi17Ci0JLyoqCi0JICogTWV0aG9kIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHRoZSBnaXZlbiBwcm9wZXJ0eS4KLQkgKi8KLQlib29sZWFuIGl0ZW1Jc1Byb3BlcnR5KFByb3BlcnR5IGl0ZW0pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZSB1c2VkIGZvciBjaGFuZ2Ugbm90aWZpY2F0aW9uIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS4KLQkgKi8KLQlTdHJpbmcgcHJvcGVydHlJZEZvcihQcm9wZXJ0eSBwcm9wZXJ0eSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBQZXJzaXN0ZW5jZVVuaXQgb2YgdGhpcyBQcm9wZXJ0aWVzLgotCSAqLwotCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0IHRoZSBQZXJzaXN0ZW5jZVVuaXQgYmVsb25ncyB0by4KLQkgKi8KLQlKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eUxpc3RMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVuY2VVbml0UHJvcGVydHlMaXN0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzM2M0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eUxpc3RMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eUxpc3RMaXN0ZW5lciBOb3RpZmllcyB0aGUgZ2l2ZW4gcGFyZW50IHdoZW4gYSBjaGFuZ2UKLSAqIG9jY3VyZWQgaW4gSlBUIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eUxpc3RMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBwYXJlbnQ7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAvIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0UHJvcGVydHlMaXN0TGlzdGVuZXIoUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBCZWhhdmlvciAqKioqKioqKioqCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkKFByb3BlcnR5IG5ld0l0ZW0sIE1vZGVsIHNvdXJjZSkgewotCQlpZiAodGhpcy5tb2RlbCgpLml0ZW1Jc1Byb3BlcnR5KG5ld0l0ZW0pKSB7Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5tb2RlbCgpLnByb3BlcnR5SWRGb3IobmV3SXRlbSk7Ci0JCQl0aGlzLm1vZGVsKCkucHJvcGVydHlDaGFuZ2VkKAotCQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHNvdXJjZSwgcHJvcGVydHlOYW1lLCBudWxsLCBuZXdJdGVtKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlKFByb3BlcnR5IGl0ZW0sIE1vZGVsIHNvdXJjZSkgewotCQlpZiAodGhpcy5tb2RlbCgpLml0ZW1Jc1Byb3BlcnR5KGl0ZW0pKSB7Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5tb2RlbCgpLnByb3BlcnR5SWRGb3IoaXRlbSk7Ci0JCQl0aGlzLm1vZGVsKCkucHJvcGVydHlDaGFuZ2VkKAotCQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHNvdXJjZSwgcHJvcGVydHlOYW1lLCBpdGVtLCBudWxsKSk7IC8vIG9sZEl0ZW0gaXMgdGhlIHJlbW92ZWQgcHJvcGVydHkKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyByZXBsYWNlCi0JcHJvdGVjdGVkIFByb3BlcnR5IHNldChQcm9wZXJ0eSBuZXdJdGVtLCBNb2RlbCBzb3VyY2UpIHsKLQkJaWYgKHRoaXMubW9kZWwoKS5pdGVtSXNQcm9wZXJ0eShuZXdJdGVtKSkgewotCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMubW9kZWwoKS5wcm9wZXJ0eUlkRm9yKG5ld0l0ZW0pOwotCQkJdGhpcy5tb2RlbCgpLnByb3BlcnR5Q2hhbmdlZCgKLQkJCQluZXcgUHJvcGVydHlDaGFuZ2VFdmVudChzb3VyY2UsIHByb3BlcnR5TmFtZSwgbnVsbCwgbmV3SXRlbSkpOyAvLyBvbGRJdGVtIHVua25vd24KLQkJCXJldHVybiBuZXdJdGVtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqKioqKiogTGlzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCWZvciAoSXRlcmF0b3I8UHJvcGVydHk+IHN0cmVhbSA9IHRoaXMuaXRlbXMoZSk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQl0aGlzLmFkZChzdHJlYW0ubmV4dCgpLCBlLmdldFNvdXJjZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQlmb3IgKEl0ZXJhdG9yPFByb3BlcnR5PiBzdHJlYW0gPSB0aGlzLml0ZW1zKGUpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJdGhpcy5yZW1vdmUoc3RyZWFtLm5leHQoKSwgZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCS8vIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoMjcwKSBkb2VzIG5vdCBwcm92aWRlIG9sZCB2YWx1ZQotCQlmb3IgKEl0ZXJhdG9yPFByb3BlcnR5PiBuZXdTdHJlYW0gPSB0aGlzLml0ZW1zKGUpOyBuZXdTdHJlYW0uaGFzTmV4dCgpOykgewotCQkJdGhpcy5zZXQobmV3U3RyZWFtLm5leHQoKSwgZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigic291cmNlOiAiICsgZS5nZXRTb3VyY2UoKSArICIgLSBhc3BlY3Q6ICIgKyBlLmdldEFzcGVjdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJzb3VyY2U6ICIgKyBlLmdldFNvdXJjZSgpICsgIiAtIGFzcGVjdDogIiArIGUuZ2V0QXNwZWN0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInNvdXJjZTogIiArIGUuZ2V0U291cmNlKCkgKyAiIC0gYXNwZWN0OiAiICsgZS5nZXRBc3BlY3ROYW1lKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiKCAiICsgdGhpcy5tb2RlbCgpLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIikiOwotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIG1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBJdGVyYXRvcjxQcm9wZXJ0eT4gaXRlbXMoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmF0b3I8UHJvcGVydHk+KSBldmVudC5pdGVtcygpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IGdldFNvdXJjZShMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4pIGV2ZW50LmdldFNvdXJjZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2NhY2hpbmcvQ2FjaGVQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jYWNoaW5nL0NhY2hlUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTkwMjZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2NhY2hpbmcvQ2FjaGVQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBDYWNoZVByb3BlcnRpZXMKLSAqLwotcHVibGljIGNsYXNzIENhY2hlUHJvcGVydGllcyBpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBTdHJpbmcgZW50aXR5TmFtZTsKLQotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBDYWNoZVR5cGUgdHlwZTsKLQlwcml2YXRlIEludGVnZXIgc2l6ZTsKLQlwcml2YXRlIEJvb2xlYW4gaXNTaGFyZWQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgQ2FjaGVQcm9wZXJ0aWVzKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCXRoaXMuZW50aXR5TmFtZSA9IGVudGl0eU5hbWU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvcnMgKioqKioqKioqKgotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZihvID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDYWNoZVByb3BlcnRpZXMgY2FjaGUgPSAoQ2FjaGVQcm9wZXJ0aWVzKSBvOwotCQlyZXR1cm4gKAotCQkJKHRoaXMudHlwZSA9PSBudWxsID8KLQkJCQljYWNoZS50eXBlID09IG51bGwgOiB0aGlzLnR5cGUuZXF1YWxzKGNhY2hlLnR5cGUpKSAmJgotCQkJKHRoaXMuaXNTaGFyZWQgPT0gbnVsbCA/Ci0JCQkJY2FjaGUuaXNTaGFyZWQgPT0gbnVsbCA6IHRoaXMuaXNTaGFyZWQuZXF1YWxzKGNhY2hlLmlzU2hhcmVkKSkgJiYKLQkJCSh0aGlzLnNpemUgPT0gbnVsbCA/Ci0JCQkJY2FjaGUuc2l6ZSA9PSBudWxsIDogdGhpcy5zaXplLmVxdWFscyhjYWNoZS5zaXplKSkpOwotCX0KLQkKLQkgQE92ZXJyaWRlCi0JIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ2FjaGVQcm9wZXJ0aWVzIGNsb25lKCkgewotCQkgdHJ5IHsKLQkJCSByZXR1cm4gKENhY2hlUHJvcGVydGllcylzdXBlci5jbG9uZSgpOwotCQkgfQotCQkgY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJIH0KLQkgfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuICh0aGlzLnR5cGUgPT0gbnVsbCkgJiYKLQkJCQkJKHRoaXMuc2l6ZSA9PSBudWxsKSAmJgotCQkJCQkodGhpcy5pc1NoYXJlZCA9PSBudWxsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldHRlci9zZXR0ZXIgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0RW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIGVudGl0eU5hbWU7Ci0JfQotCi0JcHVibGljIENhY2hlVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotCQl0aGlzLnR5cGUgPSBjYWNoZVR5cGU7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaXplKEludGVnZXIgY2FjaGVTaXplKSB7Ci0JCXRoaXMuc2l6ZSA9IGNhY2hlU2l6ZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNTaGFyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hhcmVkKEJvb2xlYW4gaXNTaGFyZWQpIHsKLQkJdGhpcy5pc1NoYXJlZCA9IGlzU2hhcmVkOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5idWlsZFNpbXBsZVRvU3RyaW5nT24odGhpcywgc2IpOwotCQlzYi5hcHBlbmQoIiAoIik7Ci0JCXRoaXMudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoInR5cGU6ICIpOwotCQlzYi5hcHBlbmQodGhpcy50eXBlKTsKLQkJc2IuYXBwZW5kKCIsIHNpemU6ICIpOwotCQlzYi5hcHBlbmQodGhpcy5zaXplKTsKLQkJc2IuYXBwZW5kKCIsIGlzU2hhcmVkOiAiKTsKLQkJc2IuYXBwZW5kKHRoaXMuaXNTaGFyZWQpOwotCQlzYi5hcHBlbmQoIiwgZW50aXR5TmFtZTogIik7Ci0JCXNiLmFwcGVuZCh0aGlzLmVudGl0eU5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jYWNoaW5nL0NhY2hlVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY2FjaGluZy9DYWNoZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiZjAzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jYWNoaW5nL0NhY2hlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZzsKLQotLyoqCi0gKiAgQ2FjaGVUeXBlCi0gKi8KLXB1YmxpYyBlbnVtIENhY2hlVHlwZSB7Ci0Jc29mdF93ZWFrLCAKLQloYXJkX3dlYWssIAotCXdlYWssCi0Jc29mdCwKLQlmdWxsLAotCW5vbmU7IAotCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTCA9ICJGdWxsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVJEX1dFQUsgPSAiSGFyZFdlYWsiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSAiTk9ORSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09GVCA9ICJTb2Z0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0ZUX1dFQUsgPSAiU29mdFdlYWsiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQUsgPSAiV2VhayI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jYWNoaW5nL0NhY2hpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2NhY2hpbmcvQ2FjaGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODJhYWMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2NhY2hpbmcvQ2FjaGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogIENhY2hpbmcKLSAqLwotcHVibGljIGludGVyZmFjZSBDYWNoaW5nIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotewotCUNhY2hlVHlwZSBnZXREZWZhdWx0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCUNhY2hlVHlwZSBnZXRDYWNoZVR5cGVEZWZhdWx0KCk7Ci0Jdm9pZCBzZXRDYWNoZVR5cGVEZWZhdWx0KENhY2hlVHlwZSBjYWNoZVR5cGVEZWZhdWx0KTsKLQkJCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZID0gImNhY2hlVHlwZURlZmF1bHRQcm9wZXJ0eSI7Ci0JCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCA9ICJlY2xpcHNlbGluay5jYWNoZS50eXBlLmRlZmF1bHQiOwotCQkJc3RhdGljIGZpbmFsIENhY2hlVHlwZSBERUZBVUxUX0NBQ0hFX1RZUEVfREVGQVVMVCA9IENhY2hlVHlwZS5zb2Z0X3dlYWs7Ci0KLQlJbnRlZ2VyIGdldERlZmF1bHRDYWNoZVNpemVEZWZhdWx0KCk7Ci0JSW50ZWdlciBnZXRDYWNoZVNpemVEZWZhdWx0KCk7Ci0Jdm9pZCBzZXRDYWNoZVNpemVEZWZhdWx0KEludGVnZXIgY2FjaGVTaXplRGVmYXVsdCk7Ci0JCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSA9ICJjYWNoZVNpemVEZWZhdWx0UHJvcGVydHkiOwotCQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9TSVpFX0RFRkFVTFQgPSAiZWNsaXBzZWxpbmsuY2FjaGUuc2l6ZS5kZWZhdWx0IjsKLQkJCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfQ0FDSEVfU0laRV9ERUZBVUxUID0gbmV3IEludGVnZXIoMTAwMCk7Ci0KLQlCb29sZWFuIGdldERlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHQoKTsKLQlCb29sZWFuIGdldFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCXZvaWQgc2V0U2hhcmVkQ2FjaGVEZWZhdWx0KEJvb2xlYW4gc2hhcmVkQ2FjaGVEZWZhdWx0KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSA9ICJzaGFyZWRDYWNoZURlZmF1bHRQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCA9ICJlY2xpcHNlbGluay5jYWNoZS5zaGFyZWQuZGVmYXVsdCI7Ci0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfU0hBUkVEX0NBQ0hFX0RFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQotCUNhY2hlVHlwZSBnZXREZWZhdWx0Q2FjaGVUeXBlKCk7Ci0JQ2FjaGVUeXBlIGdldENhY2hlVHlwZShTdHJpbmcgZW50aXR5TmFtZSk7Ci0Jdm9pZCBzZXRDYWNoZVR5cGUoQ2FjaGVUeXBlIGNhY2hlVHlwZSwgU3RyaW5nIGVudGl0eU5hbWUpOwotCQkJc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9UWVBFX1BST1BFUlRZID0gImNhY2hlVHlwZVByb3BlcnR5IjsKLQkJCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSA9ICJlY2xpcHNlbGluay5jYWNoZS50eXBlLiI7Ci0JCQlzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIERFRkFVTFRfQ0FDSEVfVFlQRSA9IENhY2hlVHlwZS5zb2Z0X3dlYWs7Ci0KLQlJbnRlZ2VyIGdldERlZmF1bHRDYWNoZVNpemUoKTsKLQlJbnRlZ2VyIGdldENhY2hlU2l6ZShTdHJpbmcgZW50aXR5TmFtZSk7Ci0Jdm9pZCBzZXRDYWNoZVNpemUoSW50ZWdlciBjYWNoZVNpemUsIFN0cmluZyBlbnRpdHlOYW1lKTsKLQkJCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU0laRV9QUk9QRVJUWSA9ICJjYWNoZVNpemVQcm9wZXJ0eSI7Ci0JCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUgPSAiZWNsaXBzZWxpbmsuY2FjaGUuc2l6ZS4iOwotCQkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9DQUNIRV9TSVpFID0gbmV3IEludGVnZXIoMTAwMCk7Ci0KLQlCb29sZWFuIGdldERlZmF1bHRTaGFyZWRDYWNoZSgpOwotCUJvb2xlYW4gZ2V0U2hhcmVkQ2FjaGUoU3RyaW5nIGVudGl0eU5hbWUpOwotCXZvaWQgc2V0U2hhcmVkQ2FjaGUoQm9vbGVhbiBzaGFyZWRDYWNoZSwgU3RyaW5nIGVudGl0eU5hbWUpOwotCQkJc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURfQ0FDSEVfUFJPUEVSVFkgPSAic2hhcmVkQ2FjaGVQcm9wZXJ0eSI7Ci0JCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSA9ICJlY2xpcHNlbGluay5jYWNoZS5zaGFyZWQuIjsKLQkJCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfU0hBUkVEX0NBQ0hFID0gQm9vbGVhbi5UUlVFOwotCi0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBlbnRpdGllcygpOwotCWludCBlbnRpdGllc1NpemUoKTsKLQlib29sZWFuIGVudGl0eUV4aXN0cyhTdHJpbmcgZW50aXR5KTsKLQlTdHJpbmcgYWRkRW50aXR5KFN0cmluZyBlbnRpdHkpOwotCXZvaWQgcmVtb3ZlRW50aXR5KFN0cmluZyBlbnRpdHkpOwotCQlTdHJpbmcgRU5USVRJRVNfTElTVF9QUk9QRVJUWSA9ICJlbnRpdGllc0xpc3RQcm9wZXJ0eSI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2NhY2hpbmcvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jYWNoaW5nL0VjbGlwc2VMaW5rQ2FjaGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWVkOWM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2NhY2hpbmcvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rQ2FjaGluZyBlbmNhcHN1bGF0ZXMgRWNsaXBzZUxpbmsgQ2FjaGluZyBwcm9wZXJ0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDYWNoaW5nIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi0JaW1wbGVtZW50cyBDYWNoaW5nCi17Ci0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQlwcml2YXRlIENhY2hlVHlwZSBjYWNoZVR5cGVEZWZhdWx0OwotCXByaXZhdGUgSW50ZWdlciBjYWNoZVNpemVEZWZhdWx0OwotCXByaXZhdGUgQm9vbGVhbiBzaGFyZWRDYWNoZURlZmF1bHQ7Ci0KLQkvLyBrZXkgPSBFbnRpdHkgbmFtZSA7IHZhbHVlID0gQ2FjaGUgcHJvcGVydGllcwotCXByaXZhdGUgTWFwPFN0cmluZywgQ2FjaGVQcm9wZXJ0aWVzPiBlbnRpdGllc0NhY2hlUHJvcGVydGllczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoaW5nKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIExpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBwcm9wZXJ0eUxpc3RBZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgcHJvcGVydHlMaXN0QWRhcHRlcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQkvLyBUT1JFVklFVyAtIGhhbmRsZSBpbmNvcnJlY3QgU3RyaW5nIGluIHBlcnNpc3RlbmNlLnhtbAotCQl0aGlzLmVudGl0aWVzQ2FjaGVQcm9wZXJ0aWVzID0gCi0JCQluZXcgSGFzaE1hcDxTdHJpbmcsIENhY2hlUHJvcGVydGllcz4oKTsKLQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0ID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQsIENhY2hlVHlwZS52YWx1ZXMoKSk7Ci0JCXRoaXMuY2FjaGVTaXplRGVmYXVsdCA9IAotCQkJdGhpcy5nZXRJbnRlZ2VyVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU0laRV9ERUZBVUxUKTsKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHQgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1NIQVJFRF9ERUZBVUxUKTsKLQkJCi0JCVNldDxQcm9wZXJ0eT4gY2FjaGVUeXBlUHJvcGVydGllcyA9IAotCQkJdGhpcy5nZXRQcm9wZXJ0aWVzU2V0V2l0aFByZWZpeChFQ0xJUFNFTElOS19DQUNIRV9UWVBFKTsKLQkJU2V0PFByb3BlcnR5PiBjYWNoZVNpemVQcm9wZXJ0aWVzID0gCi0JCQl0aGlzLmdldFByb3BlcnRpZXNTZXRXaXRoUHJlZml4KEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUpOwotCQlTZXQ8UHJvcGVydHk+IHNoYXJlZENhY2hlUHJvcGVydGllcyA9IAotCQkJdGhpcy5nZXRQcm9wZXJ0aWVzU2V0V2l0aFByZWZpeChFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUpOwotCQkKLQkJdGhpcy5pbml0aWFsaXplRW50aXRpZXNDYWNoZVR5cGUoY2FjaGVUeXBlUHJvcGVydGllcyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0aWVzQ2FjaGVTaXplKGNhY2hlU2l6ZVByb3BlcnRpZXMpOwotCQl0aGlzLmluaXRpYWxpemVFbnRpdGllc1NoYXJlZENhY2hlKHNoYXJlZENhY2hlUHJvcGVydGllcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVFbnRpdGllc0NhY2hlVHlwZShTZXQ8UHJvcGVydHk+IHByb3BlcnRpZXMpIHsKLQkJZm9yIChQcm9wZXJ0eSBwcm9wZXJ0eSA6IHByb3BlcnRpZXMpIHsKLQkJCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5nZXRFbnRpdHlOYW1lKHByb3BlcnR5KTsKLQkJCUNhY2hlVHlwZSBjYWNoZVR5cGUgPSBnZXRFbnVtVmFsdWVPZihwcm9wZXJ0eS5nZXRWYWx1ZSgpLCBDYWNoZVR5cGUudmFsdWVzKCkpOwotCQkJdGhpcy5zZXRDYWNoZVR5cGVfKGNhY2hlVHlwZSwgZW50aXR5TmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVudGl0aWVzQ2FjaGVTaXplKFNldDxQcm9wZXJ0eT4gcHJvcGVydGllcykgewotCQlmb3IgKFByb3BlcnR5IHByb3BlcnR5IDogcHJvcGVydGllcykgewotCQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmdldEVudGl0eU5hbWUocHJvcGVydHkpOwotCQkJdGhpcy5zZXRDYWNoZVNpemVfKHByb3BlcnR5LCBlbnRpdHlOYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRW50aXRpZXNTaGFyZWRDYWNoZShTZXQ8UHJvcGVydHk+IHByb3BlcnRpZXMpIHsKLQkJZm9yIChQcm9wZXJ0eSBwcm9wZXJ0eSA6IHByb3BlcnRpZXMpIHsKLQkJCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5nZXRFbnRpdHlOYW1lKHByb3BlcnR5KTsKLQkJCXRoaXMuc2V0U2hhcmVkQ2FjaGVfKHByb3BlcnR5LCBlbnRpdHlOYW1lKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCS8qKgotCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCi0JICogCQlrZXkgPSBFY2xpcHNlTGluayBwcm9wZXJ0eSBrZXk7Ci0JICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQsCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0NBQ0hFX1NJWkVfREVGQVVMVCwKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQsCi0JCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSk7Ci0JCQotCQkvLyBEb24ndCBuZWVkIHRvIGluaXRpYWxpemUgcHJvcGVydHlOYW1lcyBmb3I6IAotCQkvLyBjYWNoZVR5cGUsIHNoYXJlZENhY2hlLCBjYWNoZVNpemUKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdXNlZCBmb3IgaWRlbnRpZnlpbmcgdGhlIGdpdmVuIHByb3BlcnR5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGl0ZW1Jc1Byb3BlcnR5KFByb3BlcnR5IGl0ZW0pIHsKLQkJYm9vbGVhbiBpc1Byb3BlcnR5ID0gc3VwZXIuaXRlbUlzUHJvcGVydHkoaXRlbSk7Ci0JCQotCQlpZiAoICEgaXNQcm9wZXJ0eSAmJiBpdGVtLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGl0ZW0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSkgfHwgCi0JCQkJCQlpdGVtLmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUpIHx8IAotCQkJCQkJaXRlbS5nZXROYW1lKCkuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gaXNQcm9wZXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lIHVzZWQgZm9yIGNoYW5nZSBub3RpZmljYXRpb24gb2YgdGhlIGdpdmVuCi0JICogcHJvcGVydHkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBwcm9wZXJ0eUlkRm9yKFByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIucHJvcGVydHlJZEZvcihwcm9wZXJ0eSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAocHJvcGVydHkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSkpIHsKLQkJCQlyZXR1cm4gQ0FDSEVfVFlQRV9QUk9QRVJUWTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5LmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUpKSB7Ci0JCQkJcmV0dXJuIENBQ0hFX1NJWkVfUFJPUEVSVFk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eS5nZXROYW1lKCkuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUpKSB7Ci0JCQkJcmV0dXJuIFNIQVJFRF9DQUNIRV9QUk9QRVJUWTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHByb3BlcnR5OiAiICsgcHJvcGVydHkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGFzcGVjdE5hbWUgPSBldmVudC5nZXRBc3BlY3ROYW1lKCk7Ci0JCWlmIChhc3BlY3ROYW1lLmVxdWFscyhDQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhDQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLmNhY2hlU2l6ZURlZmF1bHRDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhTSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkpIHsKLQkJCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0Q2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoQ0FDSEVfVFlQRV9QUk9QRVJUWSkpIHsKLQkJCXRoaXMuY2FjaGVUeXBlQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoQ0FDSEVfU0laRV9QUk9QRVJUWSkpIHsKLQkJCXRoaXMuY2FjaGVTaXplQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSkgewotCQkJdGhpcy5zaGFyZWRDYWNoZUNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBldmVudCByZWNlaXZlZCAtIHByb3BlcnR5IG5vdCBhcHBsaWNhYmxlOiAiICsgYXNwZWN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVUeXBlICoqKioqKioqKioKLQlwdWJsaWMgQ2FjaGVUeXBlIGdldENhY2hlVHlwZShTdHJpbmcgZW50aXR5TmFtZSkgewotCQlDYWNoZVByb3BlcnRpZXMgY2FjaGUgPSB0aGlzLmNhY2hlUHJvcGVydGllc09mKGVudGl0eU5hbWUpOwotCQlyZXR1cm4gKGNhY2hlID09IG51bGwpID8gbnVsbCA6IGNhY2hlLmdldFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVR5cGUoQ2FjaGVUeXBlIG5ld0NhY2hlVHlwZSwgU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJQ2FjaGVQcm9wZXJ0aWVzIG9sZCA9IHRoaXMuc2V0Q2FjaGVUeXBlXyhuZXdDYWNoZVR5cGUsIGVudGl0eU5hbWUpOwotCQl0aGlzLnB1dEVudW1WYWx1ZShFQ0xJUFNFTElOS19DQUNIRV9UWVBFLCBlbnRpdHlOYW1lLCBuZXdDYWNoZVR5cGUsIGZhbHNlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1RZUEVfUFJPUEVSVFksIG9sZCwgdGhpcy5jYWNoZVByb3BlcnRpZXNPZihlbnRpdHlOYW1lKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhY2hlVHlwZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJLy8gcHJvcGVydHkgPT0gbnVsbCB3aGVuIHJlbW92ZWQKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSAocHJvcGVydHkgPT0gbnVsbCkgPyB0aGlzLmdldEVudGl0eU5hbWUoKFByb3BlcnR5KSBldmVudC5nZXRPbGRWYWx1ZSgpKSA6IHRoaXMuZ2V0RW50aXR5TmFtZShwcm9wZXJ0eSk7Ci0JCUNhY2hlUHJvcGVydGllcyBvbGQgPSB0aGlzLnNldENhY2hlVHlwZV8ocHJvcGVydHksIGVudGl0eU5hbWUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIHRoaXMuY2FjaGVQcm9wZXJ0aWVzT2YoZW50aXR5TmFtZSkpOwotCX0KLQotCXB1YmxpYyBDYWNoZVR5cGUgZ2V0RGVmYXVsdENhY2hlVHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLmNhY2hlVHlwZURlZmF1bHQgPT0gbnVsbCkgPyBERUZBVUxUX0NBQ0hFX1RZUEUgOiB0aGlzLmNhY2hlVHlwZURlZmF1bHQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVNpemUgKioqKioqKioqKgotCXB1YmxpYyBJbnRlZ2VyIGdldENhY2hlU2l6ZShTdHJpbmcgZW50aXR5TmFtZSkgewotCQlDYWNoZVByb3BlcnRpZXMgY2FjaGUgPSB0aGlzLmNhY2hlUHJvcGVydGllc09mKGVudGl0eU5hbWUpOwotCQlyZXR1cm4gKGNhY2hlID09IG51bGwpID8gbnVsbCA6IGNhY2hlLmdldFNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVNpemUoSW50ZWdlciBuZXdDYWNoZVNpemUsIFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCUNhY2hlUHJvcGVydGllcyBvbGQgPSB0aGlzLnNldENhY2hlU2l6ZV8obmV3Q2FjaGVTaXplLCBlbnRpdHlOYW1lKTsKLQkJdGhpcy5wdXRJbnRlZ2VyVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU0laRSArIGVudGl0eU5hbWUsIG5ld0NhY2hlU2l6ZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TSVpFX1BST1BFUlRZLCBvbGQsIHRoaXMuY2FjaGVQcm9wZXJ0aWVzT2YoZW50aXR5TmFtZSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVNpemVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCS8vIHByb3BlcnR5ID09IG51bGwgd2hlbiByZW1vdmVkCi0JCVN0cmluZyBlbnRpdHlOYW1lID0gKHByb3BlcnR5ID09IG51bGwpID8gdGhpcy5nZXRFbnRpdHlOYW1lKChQcm9wZXJ0eSkgZXZlbnQuZ2V0T2xkVmFsdWUoKSkgOiB0aGlzLmdldEVudGl0eU5hbWUocHJvcGVydHkpOwotCQlDYWNoZVByb3BlcnRpZXMgb2xkID0gdGhpcy5zZXRDYWNoZVNpemVfKHByb3BlcnR5LCBlbnRpdHlOYW1lKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCB0aGlzLmNhY2hlUHJvcGVydGllc09mKGVudGl0eU5hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTaXplKCkgewotCQlyZXR1cm4gKHRoaXMuY2FjaGVTaXplRGVmYXVsdCA9PSBudWxsKSA/IERFRkFVTFRfQ0FDSEVfU0laRSA6IHRoaXMuY2FjaGVTaXplRGVmYXVsdDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNoYXJlZENhY2hlICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRTaGFyZWRDYWNoZShTdHJpbmcgZW50aXR5TmFtZSkgewotCQlDYWNoZVByb3BlcnRpZXMgY2FjaGUgPSB0aGlzLmNhY2hlUHJvcGVydGllc09mKGVudGl0eU5hbWUpOwotCQlyZXR1cm4gKGNhY2hlID09IG51bGwpID8gbnVsbCA6IGNhY2hlLmlzU2hhcmVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hhcmVkQ2FjaGUoQm9vbGVhbiBuZXdTaGFyZWRDYWNoZSwgU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJQ2FjaGVQcm9wZXJ0aWVzIG9sZCA9IHRoaXMuc2V0U2hhcmVkQ2FjaGVfKG5ld1NoYXJlZENhY2hlLCBlbnRpdHlOYW1lKTsKLQkJdGhpcy5wdXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFLCBlbnRpdHlOYW1lLCBuZXdTaGFyZWRDYWNoZSwgZmFsc2UpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0hBUkVEX0NBQ0hFX1BST1BFUlRZLCBvbGQsIHRoaXMuY2FjaGVQcm9wZXJ0aWVzT2YoZW50aXR5TmFtZSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaGFyZWRDYWNoZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgZW50aXR5TmFtZTsKLQkJUHJvcGVydHkgbmV3UHJvcGVydHkgPSAoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCS8vIHByb3BlcnR5ID09IG51bGwgd2hlbiByZW1vdmVkCi0JCWVudGl0eU5hbWUgPSAobmV3UHJvcGVydHkgPT0gbnVsbCkgPyAKLQkJCXRoaXMuZ2V0RW50aXR5TmFtZSgoUHJvcGVydHkpIGV2ZW50LmdldE9sZFZhbHVlKCkpIDogdGhpcy5nZXRFbnRpdHlOYW1lKG5ld1Byb3BlcnR5KTsKLQkJQ2FjaGVQcm9wZXJ0aWVzIG9sZCA9IHRoaXMuc2V0U2hhcmVkQ2FjaGVfKG5ld1Byb3BlcnR5LCBlbnRpdHlOYW1lKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCB0aGlzLmNhY2hlUHJvcGVydGllc09mKGVudGl0eU5hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0U2hhcmVkQ2FjaGUoKSB7Ci0JCXJldHVybiAodGhpcy5zaGFyZWRDYWNoZURlZmF1bHQgPT0gbnVsbCkgPyBERUZBVUxUX1NIQVJFRF9DQUNIRSA6IHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0OwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqKioqCi0JcHVibGljIENhY2hlVHlwZSBnZXRDYWNoZVR5cGVEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZVR5cGVEZWZhdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlVHlwZURlZmF1bHQoQ2FjaGVUeXBlIG5ld0NhY2hlVHlwZURlZmF1bHQpIHsKLQkJQ2FjaGVUeXBlIG9sZCA9IHRoaXMuY2FjaGVUeXBlRGVmYXVsdDsKLQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0ID0gbmV3Q2FjaGVUeXBlRGVmYXVsdDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFksIG5ld0NhY2hlVHlwZURlZmF1bHQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZLCBvbGQsIG5ld0NhY2hlVHlwZURlZmF1bHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVR5cGVEZWZhdWx0Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUNhY2hlVHlwZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBDYWNoZVR5cGUudmFsdWVzKCkpOwotCQlDYWNoZVR5cGUgb2xkID0gdGhpcy5jYWNoZVR5cGVEZWZhdWx0OwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIENhY2hlVHlwZSBnZXREZWZhdWx0Q2FjaGVUeXBlRGVmYXVsdCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfQ0FDSEVfVFlQRV9ERUZBVUxUOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTaXplRGVmYXVsdCAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0Q2FjaGVTaXplRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVTaXplRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVNpemVEZWZhdWx0KEludGVnZXIgbmV3Q2FjaGVTaXplRGVmYXVsdCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuY2FjaGVTaXplRGVmYXVsdDsKLQkJdGhpcy5jYWNoZVNpemVEZWZhdWx0ID0gbmV3Q2FjaGVTaXplRGVmYXVsdDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFksIG5ld0NhY2hlU2l6ZURlZmF1bHQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZLCBvbGQsIG5ld0NhY2hlU2l6ZURlZmF1bHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVNpemVEZWZhdWx0Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUludGVnZXIgbmV3VmFsdWUgPSBnZXRJbnRlZ2VyVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5jYWNoZVNpemVEZWZhdWx0OwotCQl0aGlzLmNhY2hlU2l6ZURlZmF1bHQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdENhY2hlU2l6ZURlZmF1bHQoKSB7Ci0JCXJldHVybiBERUZBVUxUX0NBQ0hFX1NJWkVfREVGQVVMVDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNoYXJlZENhY2hlRGVmYXVsdCAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5zaGFyZWRDYWNoZURlZmF1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hhcmVkQ2FjaGVEZWZhdWx0KEJvb2xlYW4gbmV3U2hhcmVkQ2FjaGVEZWZhdWx0KSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zaGFyZWRDYWNoZURlZmF1bHQ7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0ID0gbmV3U2hhcmVkQ2FjaGVEZWZhdWx0OwotCQl0aGlzLnB1dFByb3BlcnR5KFNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZLCBuZXdTaGFyZWRDYWNoZURlZmF1bHQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFksIG9sZCwgbmV3U2hhcmVkQ2FjaGVEZWZhdWx0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2hhcmVkQ2FjaGVEZWZhdWx0Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0OwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0KCkgewotCQlyZXR1cm4gREVGQVVMVF9TSEFSRURfQ0FDSEVfREVGQVVMVDsKLQl9Ci0KLQkvLyAqKioqKiogQ2FjaGVQcm9wZXJ0aWVzICoqKioqKioKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gdXBkYXRlIHRoZSBDYWNoZVR5cGUgaW4gZW50aXRpZXNDYWNoZSBtYXAuIFJldHVybnMKLQkgKiB0aGUgb2xkIHZhbHVlIG9mIENhY2hlUHJvcGVydGllcwotCSAqLwotCXByaXZhdGUgQ2FjaGVQcm9wZXJ0aWVzIHNldENhY2hlVHlwZV8oUHJvcGVydHkgbmV3UHJvcGVydHksIFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChuZXdQcm9wZXJ0eSA9PSBudWxsKSA/IG51bGwgOiBuZXdQcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQlDYWNoZVR5cGUgbmV3VmFsdWUgPSBnZXRFbnVtVmFsdWVPZihzdHJpbmdWYWx1ZSwgQ2FjaGVUeXBlLnZhbHVlcygpKTsKLQkJcmV0dXJuIHRoaXMuc2V0Q2FjaGVUeXBlXyhuZXdWYWx1ZSwgZW50aXR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBDYWNoZVByb3BlcnRpZXMgc2V0Q2FjaGVUeXBlXyhDYWNoZVR5cGUgbmV3VmFsdWUsIFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCUNhY2hlUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gdGhpcy5jYWNoZVByb3BlcnRpZXNPZihlbnRpdHlOYW1lKTsKLQkJQ2FjaGVQcm9wZXJ0aWVzIG9sZCA9IHByb3BlcnRpZXMuY2xvbmUoKTsKLQkJcHJvcGVydGllcy5zZXRUeXBlKG5ld1ZhbHVlKTsKLQkJdGhpcy5wdXRFbnRpdHlDYWNoZVByb3BlcnRpZXMoZW50aXR5TmFtZSwgcHJvcGVydGllcyk7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHVwZGF0ZSB0aGUgQ2FjaGVTaXplIGluIGVudGl0aWVzQ2FjaGUgbWFwLiBSZXR1cm5zCi0JICogdGhlIG9sZCB2YWx1ZSBvZiBDYWNoZVByb3BlcnRpZXMKLQkgKi8KLQlwcml2YXRlIENhY2hlUHJvcGVydGllcyBzZXRDYWNoZVNpemVfKFByb3BlcnR5IG5ld1Byb3BlcnR5LCBTdHJpbmcgZW50aXR5TmFtZSkgewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAobmV3UHJvcGVydHkgPT0gbnVsbCkgPyBudWxsIDogbmV3UHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJcmV0dXJuIHRoaXMuc2V0Q2FjaGVTaXplXyhuZXdWYWx1ZSwgZW50aXR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBDYWNoZVByb3BlcnRpZXMgc2V0Q2FjaGVTaXplXyhJbnRlZ2VyIG5ld1ZhbHVlLCBTdHJpbmcgZW50aXR5TmFtZSkgewotCQlDYWNoZVByb3BlcnRpZXMgcHJvcGVydGllcyA9IHRoaXMuY2FjaGVQcm9wZXJ0aWVzT2YoZW50aXR5TmFtZSk7Ci0JCUNhY2hlUHJvcGVydGllcyBvbGQgPSBwcm9wZXJ0aWVzLmNsb25lKCk7Ci0JCXByb3BlcnRpZXMuc2V0U2l6ZShuZXdWYWx1ZSk7Ci0JCXRoaXMucHV0RW50aXR5Q2FjaGVQcm9wZXJ0aWVzKGVudGl0eU5hbWUsIHByb3BlcnRpZXMpOwotCQlyZXR1cm4gb2xkOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byB1cGRhdGUgdGhlIFNoYXJlZENhY2hlIGluIGVudGl0aWVzQ2FjaGVQcm9wZXJ0aWVzIG1hcC4KLQkgKiBSZXR1cm5zIHRoZSBvbGQgdmFsdWUgb2YgQ2FjaGVQcm9wZXJ0aWVzCi0JICovCi0JcHJpdmF0ZSBDYWNoZVByb3BlcnRpZXMgc2V0U2hhcmVkQ2FjaGVfKFByb3BlcnR5IG5ld1Byb3BlcnR5LCBTdHJpbmcgZW50aXR5TmFtZSkgewotCQlTdHJpbmcgbmV3VmFsdWUgPSAobmV3UHJvcGVydHkgPT0gbnVsbCkgPyBudWxsIDogbmV3UHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuIHRoaXMuc2V0U2hhcmVkQ2FjaGVfKG5ld1ZhbHVlLCBlbnRpdHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hlUHJvcGVydGllcyBzZXRTaGFyZWRDYWNoZV8oU3RyaW5nIG5ld1N0cmluZywgU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKG5ld1N0cmluZyk7Ci0JCXJldHVybiBzZXRTaGFyZWRDYWNoZV8obmV3VmFsdWUsIGVudGl0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgQ2FjaGVQcm9wZXJ0aWVzIHNldFNoYXJlZENhY2hlXyhCb29sZWFuIG5ld1ZhbHVlLCBTdHJpbmcgZW50aXR5TmFtZSkgewotCQlDYWNoZVByb3BlcnRpZXMgcHJvcGVydGllcyA9IHRoaXMuY2FjaGVQcm9wZXJ0aWVzT2YoZW50aXR5TmFtZSk7Ci0JCUNhY2hlUHJvcGVydGllcyBvbGQgPSBwcm9wZXJ0aWVzLmNsb25lKCk7Ci0JCXByb3BlcnRpZXMuc2V0U2hhcmVkKG5ld1ZhbHVlKTsKLQkJdGhpcy5wdXRFbnRpdHlDYWNoZVByb3BlcnRpZXMoZW50aXR5TmFtZSwgcHJvcGVydGllcyk7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ2FjaGVQcm9wZXJ0aWVzIG9mIHRoZSBFbnRpdHkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKi8KLQlwcml2YXRlIENhY2hlUHJvcGVydGllcyBjYWNoZVByb3BlcnRpZXNPZihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlDYWNoZVByb3BlcnRpZXMgcHJvcGVydGllcyA9IHRoaXMuZW50aXRpZXNDYWNoZVByb3BlcnRpZXMuZ2V0KGVudGl0eU5hbWUpOwotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IENhY2hlUHJvcGVydGllcyhlbnRpdHlOYW1lKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYWxsIENhY2hlUHJvcGVydGllcyB0byBkZWZhdWx0LgotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhckNhY2hlUHJvcGVydGllcyhTdHJpbmcgZW50aXR5TmFtZSkgewotCQl0aGlzLnNldENhY2hlVHlwZShudWxsLCBlbnRpdHlOYW1lKTsKLQkJdGhpcy5zZXRDYWNoZVNpemUobnVsbCwgZW50aXR5TmFtZSk7Ci0JCXRoaXMuc2V0U2hhcmVkQ2FjaGUobnVsbCwgZW50aXR5TmFtZSk7Ci0JfQotCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCi0JLyoqCi0JICogUHV0IHRoZSBnaXZlbiBFbnRpdHkgQ2FjaGVQcm9wZXJ0aWVzIGluIHRoaXMgZW50aXRpZXNDYWNoZVByb3BlcnRpZXMgbWFwLgotCSAqIEBwYXJhbSBlbnRpdHlOYW1lIC0gRW50aXR5IG5hbWUuIFRoZSBlbnRpdHkgbWF5IGJlIGEgbmV3IG9yIGFuIGV4aXN0aW5nIGVudGl0eS4KLQkgKiBAcGFyYW0gcHJvcGVydGllcyAtIEVudGl0eSBDYWNoZVByb3BlcnRpZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHV0RW50aXR5Q2FjaGVQcm9wZXJ0aWVzKFN0cmluZyBlbnRpdHlOYW1lLCBDYWNoZVByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQl0aGlzLmFkZE9yUmVwbGFjZVByb3BlcnRpZXNGb3JFbnRpdHkoZW50aXR5TmFtZSwgcHJvcGVydGllcyk7Ci0JfQotCi0JLy8gKioqKioqIGVudGl0aWVzIGxpc3QgKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IGVudGl0aWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5lbnRpdGllc0NhY2hlUHJvcGVydGllcy5rZXlTZXQoKSkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCBlbnRpdGllc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0aWVzQ2FjaGVQcm9wZXJ0aWVzLnNpemUoKTsKLQl9Ci0KLQkvKiAKLQkgKiBWZXJpZmllcyBpZiB0aGlzIGVudGl0aWVzQ2FjaGVQcm9wZXJ0aWVzIG1hcCBjb250YWlucyB0aGUgZ2l2ZW4gRW50aXR5LiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlbnRpdHlFeGlzdHMoU3RyaW5nIGVudGl0eSkgewotCQlyZXR1cm4gdGhpcy5lbnRpdGllc0NhY2hlUHJvcGVydGllcy5jb250YWluc0tleShlbnRpdHkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgYWRkRW50aXR5KFN0cmluZyBlbnRpdHkpIHsKLQkJaWYgKGVudGl0eUV4aXN0cyhlbnRpdHkpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbnRpdHkgIiArIGVudGl0eSArICIgYWxyZWFkeSBleGlzdC4iKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5hZGRPclJlcGxhY2VQcm9wZXJ0aWVzRm9yRW50aXR5KGVudGl0eSwgbmV3IENhY2hlUHJvcGVydGllcyhlbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIG9yIHJlcGxhY2VzIHRoZSBnaXZlbiBFbnRpdHkgQ2FjaGVQcm9wZXJ0aWVzIGluIHRoaXMKLQkgKiBlbnRpdGllc0NhY2hlUHJvcGVydGllcyBtYXAuIAotCSAqIElmIHRoZSBzcGVjaWZpZWQgRW50aXR5IGV4aXN0cyBhbmQgdGhlIGdpdmVuIENhY2hlUHJvcGVydGllcyBpcyBlbXB0eSAKLQkgKiAoaS5lLiBhbGwgcHJvcGVydGllcyBhcmUgbnVsbCkgdGhlIG1hcHBpbmcgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gZW50aXR5IC0gRW50aXR5IG5hbWUKLQkgKiBAcGFyYW0gcHJvcGVydGllcyAtIEVudGl0eSBDYWNoZVByb3BlcnRpZXMKLQkgKiBAcmV0dXJuIEVudGl0eSBuYW1lIGFkZGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYWRkT3JSZXBsYWNlUHJvcGVydGllc0ZvckVudGl0eShTdHJpbmcgZW50aXR5LCBDYWNoZVByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlpZiAodGhpcy5lbnRpdHlFeGlzdHMoZW50aXR5KSkgewotCQkJdGhpcy5yZXBsYWNlRW50aXR5XyhlbnRpdHksIHByb3BlcnRpZXMpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdGhpcy5lbnRpdGllc0NhY2hlUHJvcGVydGllcy5wdXQoZW50aXR5LCBwcm9wZXJ0aWVzKTsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoRU5USVRJRVNfTElTVF9QUk9QRVJUWSk7Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgdGhlIGdpdmVuIEVudGl0eSBDYWNoZVByb3BlcnRpZXMgaW4gdGhpcwotCSAqIGVudGl0aWVzQ2FjaGVQcm9wZXJ0aWVzIG1hcC4KLQkgKiBJZiB0aGUgZ2l2ZW4gRW50aXR5IENhY2hlUHJvcGVydGllcyBpcyBlbXB0eSAoaS5lLiBhbGwgcHJvcGVydGllcyBhcmUgbnVsbCkgdGhlIAotCSAqIG1hcHBpbmcgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG1hcC4KLQkgKiBAcGFyYW0gZW50aXR5IC0gRW50aXR5IG5hbWUKLQkgKiBAcGFyYW0gcHJvcGVydGllcyAtIEVudGl0eSBDYWNoZVByb3BlcnRpZXMKLQkgKiBAcmV0dXJuIEVudGl0eSBuYW1lIHJlcGxhY2VkCi0JICovCi0JcHJpdmF0ZSBDYWNoZVByb3BlcnRpZXMgcmVwbGFjZUVudGl0eV8oU3RyaW5nIGVudGl0eSwgQ2FjaGVQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJQ2FjaGVQcm9wZXJ0aWVzIG9sZCA9IHRoaXMuZW50aXRpZXNDYWNoZVByb3BlcnRpZXMuZ2V0KGVudGl0eSk7Ci0JCWlmIChwcm9wZXJ0aWVzLmlzRW1wdHkoKSkgewotCQkJdGhpcy5lbnRpdGllc0NhY2hlUHJvcGVydGllcy5yZW1vdmUoZW50aXR5KTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEVOVElUSUVTX0xJU1RfUFJPUEVSVFkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5lbnRpdGllc0NhY2hlUHJvcGVydGllcy5wdXQoZW50aXR5LCBwcm9wZXJ0aWVzKTsKLQkJfQotCQlyZXR1cm4gb2xkOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVudGl0eShTdHJpbmcgZW50aXR5KSB7Ci0JCWlmICggISB0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5jbGVhckNhY2hlUHJvcGVydGllcyhlbnRpdHkpOwotCQl0aGlzLmVudGl0aWVzQ2FjaGVQcm9wZXJ0aWVzLnJlbW92ZShlbnRpdHkpOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChFTlRJVElFU19MSVNUX1BST1BFUlRZKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jb25uZWN0aW9uL0JhdGNoV3JpdGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY29ubmVjdGlvbi9CYXRjaFdyaXRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyYTVjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jb25uZWN0aW9uL0JhdGNoV3JpdGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jb25uZWN0aW9uOwotCi0vKioKLSAqICBCYXRjaFdyaXRpbmcKLSAqLwotcHVibGljIGVudW0gQmF0Y2hXcml0aW5nIHsKLQkJCW5vbmUsIAotCQkJamRiYywgCi0JCQlidWZmZXJlZCwgCi0JCQlvcmFjbGVfamRiYzsKLQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJOb25lIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpEQkMgPSAiSkRCQyI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBCVUZGRVJFRCA9ICJCdWZmZXJlZCI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBPUkFDTEVfSkRCQyA9ICJPcmFjbGUtSkRCQyI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jb25uZWN0aW9uL0Nvbm5lY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2Nvbm5lY3Rpb24vQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDNkODZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2Nvbm5lY3Rpb24vQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogIENvbm5lY3Rpb24KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotewotCVBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXREZWZhdWx0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldFRyYW5zYWN0aW9uVHlwZSgpOwotCXZvaWQgc2V0VHJhbnNhY3Rpb25UeXBlKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBuZXdUcmFuc2FjdGlvblR5cGUpOwotCQkvLyBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZID0gInRyYW5zYWN0aW9uVHlwZVByb3BlcnR5IjsKLQkJc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEUgPSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBOwotCi0JU3RyaW5nIGdldERlZmF1bHRKdGFEYXRhU291cmNlKCk7Ci0JU3RyaW5nIGdldEp0YURhdGFTb3VyY2UoKTsKLQl2b2lkIHNldEp0YURhdGFTb3VyY2UoU3RyaW5nIG5ld0p0YURhdGFTb3VyY2UpOwotCQkvLyBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBKVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkgPSAianRhRGF0YVNvdXJjZVByb3BlcnR5IjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0pUQV9EQVRBX1NPVVJDRSA9ICIiOwotCi0JU3RyaW5nIGdldERlZmF1bHROb25KdGFEYXRhU291cmNlKCk7Ci0JU3RyaW5nIGdldE5vbkp0YURhdGFTb3VyY2UoKTsKLQl2b2lkIHNldE5vbkp0YURhdGFTb3VyY2UoU3RyaW5nIG5ld05vbkp0YURhdGFTb3VyY2UpOwotCQkvLyBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBOT05fSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZID0gIm5vbkp0YURhdGFTb3VyY2VQcm9wZXJ0eSI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9OT05fSlRBX0RBVEFfU09VUkNFID0gIiI7Ci0KLQlCb29sZWFuIGdldERlZmF1bHROYXRpdmVTcWwoKTsKLQlCb29sZWFuIGdldE5hdGl2ZVNxbCgpOwotCXZvaWQgc2V0TmF0aXZlU3FsKEJvb2xlYW4gbmV3TmF0aXZlU3FsKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVfU1FMX1BST1BFUlRZID0gIm5hdGl2ZVNxbFByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX05BVElWRV9TUUwgPSAiZWNsaXBzZWxpbmsuamRiYy5uYXRpdmUtc3FsIjsKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9OQVRJVkVfU1FMID0gQm9vbGVhbi5GQUxTRTsKLQotCUJhdGNoV3JpdGluZyBnZXREZWZhdWx0QmF0Y2hXcml0aW5nKCk7Ci0JQmF0Y2hXcml0aW5nIGdldEJhdGNoV3JpdGluZygpOwotCXZvaWQgc2V0QmF0Y2hXcml0aW5nKEJhdGNoV3JpdGluZyBuZXdCYXRjaFdyaXRpbmcpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEJBVENIX1dSSVRJTkdfUFJPUEVSVFkgPSAiYmF0Y2hXcml0aW5nUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORyA9ICJlY2xpcHNlbGluay5qZGJjLmJhdGNoLXdyaXRpbmciOwotCQlzdGF0aWMgZmluYWwgQmF0Y2hXcml0aW5nIERFRkFVTFRfQkFUQ0hfV1JJVElORyA9IEJhdGNoV3JpdGluZy5ub25lOwotCQkKLQlCb29sZWFuIGdldERlZmF1bHRDYWNoZVN0YXRlbWVudHMoKTsKLQlCb29sZWFuIGdldENhY2hlU3RhdGVtZW50cygpOwotCXZvaWQgc2V0Q2FjaGVTdGF0ZW1lbnRzKEJvb2xlYW4gbmV3Q2FjaGVTdGF0ZW1lbnRzKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZID0gImNhY2hlU3RhdGVtZW50c1Byb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFMgPSAiZWNsaXBzZWxpbmsuamRiYy5jYWNoZS1zdGF0ZW1lbnRzIjsKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9DQUNIRV9TVEFURU1FTlRTID0gQm9vbGVhbi5GQUxTRTsKLQkJCi0JSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpOwotCUludGVnZXIgZ2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpOwotCXZvaWQgc2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZShJbnRlZ2VyIG5ld0NhY2hlU3RhdGVtZW50c1NpemUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSA9ICJjYWNoZVN0YXRlbWVudHNTaXplUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFID0gImVjbGlwc2VsaW5rLmpkYmMuY2FjaGUtc3RhdGVtZW50cy5zaXplIjsKLQkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9DQUNIRV9TVEFURU1FTlRTX1NJWkUgPSA1MDsKLQkJCi0JU3RyaW5nIGdldERlZmF1bHREcml2ZXIoKTsKLQlTdHJpbmcgZ2V0RHJpdmVyKCk7Ci0Jdm9pZCBzZXREcml2ZXIoU3RyaW5nIG5ld0RyaXZlcik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX1BST1BFUlRZID0gImRyaXZlclByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0RSSVZFUiA9ICJlY2xpcHNlbGluay5qZGJjLmRyaXZlciI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9EUklWRVIgPSAiIjsKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRVcmwoKTsKLQlTdHJpbmcgZ2V0VXJsKCk7Ci0Jdm9pZCBzZXRVcmwoU3RyaW5nIG5ld1VybCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1BST1BFUlRZID0gInVybFByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1VSTCA9ICJlY2xpcHNlbGluay5qZGJjLnVybCI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9VUkwgPSAiIjsKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRVc2VyKCk7Ci0JU3RyaW5nIGdldFVzZXIoKTsKLQl2b2lkIHNldFVzZXIoU3RyaW5nIG5ld1VzZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfUFJPUEVSVFkgPSAidXNlclByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1VTRVIgPSAiZWNsaXBzZWxpbmsuamRiYy51c2VyIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1VTRVIgPSAiIjsKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRQYXNzd29yZCgpOwotCVN0cmluZyBnZXRQYXNzd29yZCgpOwotCXZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIG5ld1Bhc3N3b3JkKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9QUk9QRVJUWSA9ICJwYXNzd29yZFByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1BBU1NXT1JEID0gImVjbGlwc2VsaW5rLmpkYmMucGFzc3dvcmQiOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFTU1dPUkQgPSAiIjsKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdEJpbmRQYXJhbWV0ZXJzKCk7Ci0JQm9vbGVhbiBnZXRCaW5kUGFyYW1ldGVycygpOwotCXZvaWQgc2V0QmluZFBhcmFtZXRlcnMoQm9vbGVhbiBuZXdCaW5kUGFyYW1ldGVycyk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQklORF9QQVJBTUVURVJTX1BST1BFUlRZID0gImJpbmRQYXJhbWV0ZXJzUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTID0gImVjbGlwc2VsaW5rLmpkYmMuYmluZC1wYXJhbWV0ZXJzIjsKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9CSU5EX1BBUkFNRVRFUlMgPSBCb29sZWFuLlRSVUU7Ci0JCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpOwotCUJvb2xlYW4gZ2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCk7Ci0Jdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoQm9vbGVhbiBuZXdSZWFkQ29ubmVjdGlvbnNTaGFyZWQpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZID0gInJlYWRDb25uZWN0aW9uc1NoYXJlZFByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEID0gImVjbGlwc2VsaW5rLmpkYmMucmVhZC1jb25uZWN0aW9ucy5zaGFyZWQiOwotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEID0gQm9vbGVhbi5GQUxTRTsKLQotCUludGVnZXIgZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc01pbigpOwotCUludGVnZXIgZ2V0UmVhZENvbm5lY3Rpb25zTWluKCk7Ci0Jdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNNaW4oSW50ZWdlciBuZXdSZWFkQ29ubmVjdGlvbnNNaW4pOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZID0gInJlYWRDb25uZWN0aW9uc01pblByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOID0gImVjbGlwc2VsaW5rLmpkYmMucmVhZC1jb25uZWN0aW9ucy5taW4iOwotCQlzdGF0aWMgZmluYWwgSW50ZWdlciBERUZBVUxUX1JFQURfQ09OTkVDVElPTlNfTUlOID0gMjsKLQotCUludGVnZXIgZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc01heCgpOwotCUludGVnZXIgZ2V0UmVhZENvbm5lY3Rpb25zTWF4KCk7Ci0Jdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNNYXgoSW50ZWdlciBuZXdSZWFkQ29ubmVjdGlvbnNNYXgpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZID0gInJlYWRDb25uZWN0aW9uc01heFByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYID0gImVjbGlwc2VsaW5rLmpkYmMucmVhZC1jb25uZWN0aW9ucy5tYXgiOwotCQlzdGF0aWMgZmluYWwgSW50ZWdlciBERUZBVUxUX1JFQURfQ09OTkVDVElPTlNfTUFYID0gMjsKLQotCUludGVnZXIgZ2V0RGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNaW4oKTsKLQlJbnRlZ2VyIGdldFdyaXRlQ29ubmVjdGlvbnNNaW4oKTsKLQl2b2lkIHNldFdyaXRlQ29ubmVjdGlvbnNNaW4oSW50ZWdlciBuZXdXcml0ZUNvbm5lY3Rpb25zTWluKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkgPSAid3JpdGVDb25uZWN0aW9uc01pblByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01JTiA9ICJlY2xpcHNlbGluay5qZGJjLndyaXRlLWNvbm5lY3Rpb25zLm1pbiI7Ci0JCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfV1JJVEVfQ09OTkVDVElPTlNfTUlOID0gNTsKLQotCUludGVnZXIgZ2V0RGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNYXgoKTsKLQlJbnRlZ2VyIGdldFdyaXRlQ29ubmVjdGlvbnNNYXgoKTsKLQl2b2lkIHNldFdyaXRlQ29ubmVjdGlvbnNNYXgoSW50ZWdlciBuZXdXcml0ZUNvbm5lY3Rpb25zTWF4KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkgPSAid3JpdGVDb25uZWN0aW9uc01heFByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01BWCA9ICJlY2xpcHNlbGluay5qZGJjLndyaXRlLWNvbm5lY3Rpb25zLm1heCI7Ci0JCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfV1JJVEVfQ09OTkVDVElPTlNfTUFYID0gMTA7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jb25uZWN0aW9uL0VjbGlwc2VMaW5rQ29ubmVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1NmY1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jb25uZWN0aW9uL0VjbGlwc2VMaW5rQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rQ29ubmVjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb25uZWN0aW9uIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi0JaW1wbGVtZW50cyBDb25uZWN0aW9uCi17Ci0JLy8gKioqKioqKioqKiBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdHJhbnNhY3Rpb25UeXBlOwotCXByaXZhdGUgU3RyaW5nIGp0YURhdGFTb3VyY2U7Ci0JcHJpdmF0ZSBTdHJpbmcgbm9uSnRhRGF0YVNvdXJjZTsKLQkKLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgotCXByaXZhdGUgQmF0Y2hXcml0aW5nIGJhdGNoV3JpdGluZzsKLQlwcml2YXRlIEJvb2xlYW4gbmF0aXZlU3FsOwotCXByaXZhdGUgQm9vbGVhbiBjYWNoZVN0YXRlbWVudHM7Ci0JcHJpdmF0ZSBJbnRlZ2VyIGNhY2hlU3RhdGVtZW50c1NpemU7Ci0JcHJpdmF0ZSBTdHJpbmcgZHJpdmVyOwotCXByaXZhdGUgU3RyaW5nIHVybDsKLQlwcml2YXRlIFN0cmluZyB1c2VyOwotCXByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOwotCXByaXZhdGUgQm9vbGVhbiBiaW5kUGFyYW1ldGVyczsKLQlwcml2YXRlIEJvb2xlYW4gcmVhZENvbm5lY3Rpb25zU2hhcmVkOwotCXByaXZhdGUgSW50ZWdlciByZWFkQ29ubmVjdGlvbnNNaW47Ci0JcHJpdmF0ZSBJbnRlZ2VyIHJlYWRDb25uZWN0aW9uc01heDsKLQlwcml2YXRlIEludGVnZXIgd3JpdGVDb25uZWN0aW9uc01pbjsKLQlwcml2YXRlIEludGVnZXIgd3JpdGVDb25uZWN0aW9uc01heDsKLQkKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtDb25uZWN0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIExpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBwcm9wZXJ0eUxpc3RBZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgcHJvcGVydHlMaXN0QWRhcHRlcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQkvLyBUT1JFVklFVyAtIGhhbmRsZSBpbmNvcnJlY3QgU3RyaW5nIGluIHBlcnNpc3RlbmNlLnhtbAotCQl0aGlzLnRyYW5zYWN0aW9uVHlwZSA9IAotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKTsKLQkJdGhpcy5qdGFEYXRhU291cmNlID0gCi0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmdldEp0YURhdGFTb3VyY2UoKTsKLQkJdGhpcy5ub25KdGFEYXRhU291cmNlID0gCi0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmdldE5vbkp0YURhdGFTb3VyY2UoKTsKLQkJdGhpcy5iYXRjaFdyaXRpbmcgPSAKLQkJCXRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX0JBVENIX1dSSVRJTkcsIEJhdGNoV3JpdGluZy52YWx1ZXMoKSk7Ci0JCXRoaXMubmF0aXZlU3FsID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19OQVRJVkVfU1FMKTsKLQkJdGhpcy5jYWNoZVN0YXRlbWVudHMgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFMpOwotCQl0aGlzLmNhY2hlU3RhdGVtZW50c1NpemUgPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFNfU0laRSk7Ci0JCXRoaXMuZHJpdmVyID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0RSSVZFUik7Ci0JCXRoaXMudXJsID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1VSTCk7Ci0JCXRoaXMudXNlciA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19VU0VSKTsKLQkJdGhpcy5wYXNzd29yZCA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19QQVNTV09SRCk7Ci0JCXRoaXMuYmluZFBhcmFtZXRlcnMgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX0JJTkRfUEFSQU1FVEVSUyk7Ci0JCXRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRCk7Ci0JCXRoaXMucmVhZENvbm5lY3Rpb25zTWluID0gCi0JCQl0aGlzLmdldEludGVnZXJWYWx1ZShFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01JTik7Ci0JCXRoaXMucmVhZENvbm5lY3Rpb25zTWF4ID0gCi0JCQl0aGlzLmdldEludGVnZXJWYWx1ZShFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01BWCk7Ci0JCXRoaXMud3JpdGVDb25uZWN0aW9uc01pbiA9IAotCQkJdGhpcy5nZXRJbnRlZ2VyVmFsdWUoRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUlOKTsKLQkJdGhpcy53cml0ZUNvbm5lY3Rpb25zTWF4ID0gCi0JCQl0aGlzLmdldEludGVnZXJWYWx1ZShFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NQVgpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGFuZCBhZGQgbGlzdGVuZXJzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShwYXJlbnQsIHByb3BlcnR5TGlzdEFkYXB0ZXIpOwotCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0KCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwgCi0JCQl0aGlzLmJ1aWxkVHJhbnNhY3Rpb25UeXBlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0KCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVBlcnNpc3RlbmNlVW5pdC5KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFksCi0JCQl0aGlzLmJ1aWxkSnRhRGF0YVNvdXJjZUNoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQZXJzaXN0ZW5jZVVuaXQuTk9OX0pUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSwKLQkJCXRoaXMuYnVpbGROb25KdGFEYXRhU291cmNlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleQotCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTkFUSVZFX1NRTCwKLQkJCU5BVElWRV9TUUxfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0JBVENIX1dSSVRJTkcsCi0JCQlCQVRDSF9XUklUSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19EUklWRVIsCi0JCQlEUklWRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1VSTCwKLQkJCVVSTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVVNFUiwKLQkJCVVTRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1BBU1NXT1JELAotCQkJUEFTU1dPUkRfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0JJTkRfUEFSQU1FVEVSUywKLQkJCUJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19TSEFSRUQsCi0JCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19NSU4sCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19NQVgsCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUlOLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NQVgsCi0JCQlXUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBhc3BlY3ROYW1lID0gZXZlbnQuZ2V0QXNwZWN0TmFtZSgpOwotCQlpZiAoYXNwZWN0TmFtZS5lcXVhbHMoTkFUSVZFX1NRTF9QUk9QRVJUWSkpIHsKLQkJCXRoaXMubmF0aXZlU3FsQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJIGVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKEJBVENIX1dSSVRJTkdfUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLmJhdGNoV3JpdGluZ0NoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCSBlbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhDQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZKSkgewotCQkJIHRoaXMuY2FjaGVTdGF0ZW1lbnRzQ2hhbmdlZChldmVudCk7Ci0JCSB9Ci0JCSBlbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhEUklWRVJfUFJPUEVSVFkpKSB7Ci0JCQkgdGhpcy5kcml2ZXJDaGFuZ2VkKGV2ZW50KTsKLQkJIH0KLQkJIGVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFVSTF9QUk9QRVJUWSkpIHsKLQkJCSB0aGlzLnVybENoYW5nZWQoZXZlbnQpOwotCQkgfQotCQkgZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoVVNFUl9QUk9QRVJUWSkpIHsKLQkJCSB0aGlzLnVzZXJDaGFuZ2VkKGV2ZW50KTsKLQkJIH0KLQkJIGVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFBBU1NXT1JEX1BST1BFUlRZKSkgewotCQkJIHRoaXMucGFzc3dvcmRDaGFuZ2VkKGV2ZW50KTsKLQkJIH0KLQkJIGVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKEJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSkpIHsKLQkJCSB0aGlzLmJpbmRQYXJhbWV0ZXJzQ2hhbmdlZChldmVudCk7Ci0JCSB9Ci0JCSBlbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSkpIHsKLQkJCSB0aGlzLnJlYWRDb25uZWN0aW9uc1NoYXJlZENoYW5nZWQoZXZlbnQpOwotCQkgfQotCQkgZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZKSkgewotCQkJIHRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZUNoYW5nZWQoZXZlbnQpOwotCQkgfQotCQkgZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpKSB7Ci0JCQkgdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKGV2ZW50KTsKLQkJIH0KLQkJIGVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKSkgewotCQkJIHRoaXMucmVhZENvbm5lY3Rpb25zTWF4Q2hhbmdlZChldmVudCk7Ci0JCSB9Ci0JCSBlbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhXUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpKSB7Ci0JCQkgdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluQ2hhbmdlZChldmVudCk7Ci0JCSB9Ci0JCSBlbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhXUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpKSB7Ci0JCQkgdGhpcy53cml0ZUNvbm5lY3Rpb25zTWF4Q2hhbmdlZChldmVudCk7Ci0JCSB9Ci0JfQotCi0JLy8gKioqKioqKioqKiBUcmFuc2FjdGlvblR5cGUgKioqKioqKioqKgotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2FjdGlvblR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uVHlwZShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgbmV3VHJhbnNhY3Rpb25UeXBlKSB7Ci0JCVBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBvbGQgPSB0aGlzLnRyYW5zYWN0aW9uVHlwZTsKLQkJdGhpcy50cmFuc2FjdGlvblR5cGUgPSBuZXdUcmFuc2FjdGlvblR5cGU7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLnNldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSggbmV3VHJhbnNhY3Rpb25UeXBlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFksIG9sZCwgbmV3VHJhbnNhY3Rpb25UeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdHJhbnNhY3Rpb25UeXBlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBuZXdWYWx1ZSA9IChQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCVBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBvbGQgPSB0aGlzLnRyYW5zYWN0aW9uVHlwZTsKLQkJdGhpcy50cmFuc2FjdGlvblR5cGUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldERlZmF1bHRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEU7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUcmFuc2FjdGlvblR5cGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlFY2xpcHNlTGlua0Nvbm5lY3Rpb24udGhpcy50cmFuc2FjdGlvblR5cGVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEp0YURhdGFTb3VyY2UgKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SnRhRGF0YVNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuanRhRGF0YVNvdXJjZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SnRhRGF0YVNvdXJjZShTdHJpbmcgbmV3SnRhRGF0YVNvdXJjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5qdGFEYXRhU291cmNlOwotCQl0aGlzLmp0YURhdGFTb3VyY2UgPSBuZXdKdGFEYXRhU291cmNlOwotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5zZXRKdGFEYXRhU291cmNlKCBuZXdKdGFEYXRhU291cmNlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSwgb2xkLCBuZXdKdGFEYXRhU291cmNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQganRhRGF0YVNvdXJjZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgbmV3VmFsdWUgPSAoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQlTdHJpbmcgb2xkID0gdGhpcy5qdGFEYXRhU291cmNlOwotCQl0aGlzLmp0YURhdGFTb3VyY2UgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEp0YURhdGFTb3VyY2UoKSB7Ci0JCXJldHVybiBERUZBVUxUX0pUQV9EQVRBX1NPVVJDRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEp0YURhdGFTb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlFY2xpcHNlTGlua0Nvbm5lY3Rpb24udGhpcy5qdGFEYXRhU291cmNlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqKioqKiBOb25KdGFEYXRhU291cmNlICoqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5vbkp0YURhdGFTb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLm5vbkp0YURhdGFTb3VyY2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5vbkp0YURhdGFTb3VyY2UoU3RyaW5nIG5ld05vbkp0YURhdGFTb3VyY2UpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubm9uSnRhRGF0YVNvdXJjZTsKLQkJdGhpcy5ub25KdGFEYXRhU291cmNlID0gbmV3Tm9uSnRhRGF0YVNvdXJjZTsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0KCkuc2V0Tm9uSnRhRGF0YVNvdXJjZSggbmV3Tm9uSnRhRGF0YVNvdXJjZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOT05fSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZLCBvbGQsIG5ld05vbkp0YURhdGFTb3VyY2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBub25KdGFEYXRhU291cmNlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5vbkp0YURhdGFTb3VyY2U7Ci0JCXRoaXMubm9uSnRhRGF0YVNvdXJjZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9OX0pUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5vbkp0YURhdGFTb3VyY2UoKSB7Ci0JCXJldHVybiBERUZBVUxUX05PTl9KVEFfREFUQV9TT1VSQ0U7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROb25KdGFEYXRhU291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJRWNsaXBzZUxpbmtDb25uZWN0aW9uLnRoaXMubm9uSnRhRGF0YVNvdXJjZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqKioqKiogTmF0aXZlU3FsICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXROYXRpdmVTcWwoKSB7Ci0JCXJldHVybiB0aGlzLm5hdGl2ZVNxbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYXRpdmVTcWwoQm9vbGVhbiBuZXdOYXRpdmVTcWwpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLm5hdGl2ZVNxbDsKLQkJdGhpcy5uYXRpdmVTcWwgPSBuZXdOYXRpdmVTcWw7Ci0JCXRoaXMucHV0UHJvcGVydHkoTkFUSVZFX1NRTF9QUk9QRVJUWSwgbmV3TmF0aXZlU3FsKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BVElWRV9TUUxfUFJPUEVSVFksIG9sZCwgbmV3TmF0aXZlU3FsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbmF0aXZlU3FsQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMubmF0aXZlU3FsOwotCQl0aGlzLm5hdGl2ZVNxbCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0TmF0aXZlU3FsKCkgewotCQlyZXR1cm4gREVGQVVMVF9OQVRJVkVfU1FMOwotCX0KLQotCS8vICoqKioqKioqKiogQmF0Y2hXcml0aW5nICoqKioqKioqKioKLQkKLQlwdWJsaWMgQmF0Y2hXcml0aW5nIGdldEJhdGNoV3JpdGluZygpIHsKLQkJcmV0dXJuIHRoaXMuYmF0Y2hXcml0aW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRCYXRjaFdyaXRpbmcoQmF0Y2hXcml0aW5nIG5ld0JhdGNoV3JpdGluZykgewotCQlCYXRjaFdyaXRpbmcgb2xkID0gdGhpcy5iYXRjaFdyaXRpbmc7Ci0JCXRoaXMuYmF0Y2hXcml0aW5nID0gbmV3QmF0Y2hXcml0aW5nOwotCQl0aGlzLnB1dFByb3BlcnR5KEJBVENIX1dSSVRJTkdfUFJPUEVSVFksIG5ld0JhdGNoV3JpdGluZyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChCQVRDSF9XUklUSU5HX1BST1BFUlRZLCBvbGQsIG5ld0JhdGNoV3JpdGluZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhdGNoV3JpdGluZ0NoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlCYXRjaFdyaXRpbmcgbmV3VmFsdWUgPSBnZXRFbnVtVmFsdWVPZihzdHJpbmdWYWx1ZSwgQmF0Y2hXcml0aW5nLnZhbHVlcygpKTsKLQkJQmF0Y2hXcml0aW5nIG9sZCA9IHRoaXMuYmF0Y2hXcml0aW5nOwotCQl0aGlzLmJhdGNoV3JpdGluZyA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEJhdGNoV3JpdGluZyBnZXREZWZhdWx0QmF0Y2hXcml0aW5nKCkgewotCQlyZXR1cm4gREVGQVVMVF9CQVRDSF9XUklUSU5HOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTdGF0ZW1lbnRzICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRDYWNoZVN0YXRlbWVudHMoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlU3RhdGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVN0YXRlbWVudHMoQm9vbGVhbiBuZXdDYWNoZVN0YXRlbWVudHMpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmNhY2hlU3RhdGVtZW50czsKLQkJdGhpcy5jYWNoZVN0YXRlbWVudHMgPSBuZXdDYWNoZVN0YXRlbWVudHM7Ci0JCXRoaXMucHV0UHJvcGVydHkoQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSwgbmV3Q2FjaGVTdGF0ZW1lbnRzKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFksIG9sZCwgbmV3Q2FjaGVTdGF0ZW1lbnRzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVTdGF0ZW1lbnRzQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMuY2FjaGVTdGF0ZW1lbnRzOwotCQl0aGlzLmNhY2hlU3RhdGVtZW50cyA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0Q2FjaGVTdGF0ZW1lbnRzKCkgewotCQlyZXR1cm4gREVGQVVMVF9DQUNIRV9TVEFURU1FTlRTOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTdGF0ZW1lbnRzU2l6ZSAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVN0YXRlbWVudHNTaXplKEludGVnZXIgbmV3Q2FjaGVTdGF0ZW1lbnRzU2l6ZSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQkJdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplID0gbmV3Q2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFksIG5ld0NhY2hlU3RhdGVtZW50c1NpemUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZLCBvbGQsIG5ld0NhY2hlU3RhdGVtZW50c1NpemUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVN0YXRlbWVudHNTaXplQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUludGVnZXIgbmV3VmFsdWUgPSBnZXRJbnRlZ2VyVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQkJdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRDYWNoZVN0YXRlbWVudHNTaXplKCkgewotCQlyZXR1cm4gREVGQVVMVF9DQUNIRV9TVEFURU1FTlRTX1NJWkU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBEcml2ZXIgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyKCkgewotCQlyZXR1cm4gdGhpcy5kcml2ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RHJpdmVyKFN0cmluZyBuZXdEcml2ZXIpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZHJpdmVyOwotCQl0aGlzLmRyaXZlciA9IG5ld0RyaXZlcjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShEUklWRVJfUFJPUEVSVFksIG5ld0RyaXZlcik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChEUklWRVJfUFJPUEVSVFksIG9sZCwgbmV3RHJpdmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJpdmVyQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRyaXZlcjsKLQkJdGhpcy5kcml2ZXIgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RHJpdmVyKCkgewotCQlyZXR1cm4gREVGQVVMVF9EUklWRVI7Ci0JfQotCi0JLy8gKioqKioqKioqKiBVUkwgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gdGhpcy51cmw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyBuZXdVcmwpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudXJsOwotCQl0aGlzLnVybCA9IG5ld1VybDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShVUkxfUFJPUEVSVFksIG5ld1VybCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVUkxfUFJPUEVSVFksIG9sZCwgbmV3VXJsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXJsQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnVybDsKLQkJdGhpcy51cmwgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VXJsKCkgewotCQlyZXR1cm4gREVGQVVMVF9VUkw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBVc2VyICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldFVzZXIoKSB7Ci0JCXJldHVybiB0aGlzLnVzZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXNlcihTdHJpbmcgbmV3VXNlcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy51c2VyOwotCQl0aGlzLnVzZXIgPSBuZXdVc2VyOwotCQl0aGlzLnB1dFByb3BlcnR5KFVTRVJfUFJPUEVSVFksIG5ld1VzZXIpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVVNFUl9QUk9QRVJUWSwgb2xkLCBuZXdVc2VyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXNlckNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgbmV3VmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlTdHJpbmcgb2xkID0gdGhpcy51c2VyOwotCQl0aGlzLnVzZXIgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VXNlcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfVVNFUjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFBhc3N3b3JkICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotCQlyZXR1cm4gdGhpcy5wYXNzd29yZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgbmV3UGFzc3dvcmQpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucGFzc3dvcmQ7Ci0JCXRoaXMucGFzc3dvcmQgPSBuZXdQYXNzd29yZDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShQQVNTV09SRF9QUk9QRVJUWSwgbmV3UGFzc3dvcmQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEFTU1dPUkRfUFJPUEVSVFksIG9sZCwgbmV3UGFzc3dvcmQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwYXNzd29yZENoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgbmV3VmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlTdHJpbmcgb2xkID0gdGhpcy5wYXNzd29yZDsKLQkJdGhpcy5wYXNzd29yZCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfUEFTU1dPUkQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBCaW5kUGFyYW1ldGVycyAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0QmluZFBhcmFtZXRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLmJpbmRQYXJhbWV0ZXJzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJpbmRQYXJhbWV0ZXJzKEJvb2xlYW4gbmV3QmluZFBhcmFtZXRlcnMpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmJpbmRQYXJhbWV0ZXJzOwotCQl0aGlzLmJpbmRQYXJhbWV0ZXJzID0gbmV3QmluZFBhcmFtZXRlcnM7Ci0JCXRoaXMucHV0UHJvcGVydHkoQklORF9QQVJBTUVURVJTX1BST1BFUlRZLCBuZXdCaW5kUGFyYW1ldGVycyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChCSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFksIG9sZCwgbmV3QmluZFBhcmFtZXRlcnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBiaW5kUGFyYW1ldGVyc0NoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmJpbmRQYXJhbWV0ZXJzOwotCQl0aGlzLmJpbmRQYXJhbWV0ZXJzID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRCaW5kUGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIERFRkFVTFRfQklORF9QQVJBTUVURVJTOwotCX0KLQotCS8vICoqKioqKioqKiogUmVhZENvbm5lY3Rpb25zU2hhcmVkICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKSB7Ci0JCXJldHVybiB0aGlzLnJlYWRDb25uZWN0aW9uc1NoYXJlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoQm9vbGVhbiBuZXdSZWFkQ29ubmVjdGlvbnNTaGFyZWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnJlYWRDb25uZWN0aW9uc1NoYXJlZDsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWQgPSBuZXdSZWFkQ29ubmVjdGlvbnNTaGFyZWQ7Ci0JCXRoaXMucHV0UHJvcGVydHkoUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFksIG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSwgb2xkLCBuZXdSZWFkQ29ubmVjdGlvbnNTaGFyZWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkQ29ubmVjdGlvbnNTaGFyZWRDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWQ7Ci0JCXRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEOwotCX0KLQotCS8vICoqKioqKioqKiogUmVhZENvbm5lY3Rpb25zTWluICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRSZWFkQ29ubmVjdGlvbnNNaW4oKSB7Ci0JCXJldHVybiB0aGlzLnJlYWRDb25uZWN0aW9uc01pbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNNaW4oSW50ZWdlciBuZXdSZWFkQ29ubmVjdGlvbnNNaW4pIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnJlYWRDb25uZWN0aW9uc01pbjsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW4gPSBuZXdSZWFkQ29ubmVjdGlvbnNNaW47Ci0JCXRoaXMucHV0UHJvcGVydHkoUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIG5ld1JlYWRDb25uZWN0aW9uc01pbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUFEX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSwgb2xkLCBuZXdSZWFkQ29ubmVjdGlvbnNNaW4pOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW47Ci0JCXRoaXMucmVhZENvbm5lY3Rpb25zTWluID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNaW4oKSB7Ci0JCXJldHVybiBERUZBVUxUX1JFQURfQ09OTkVDVElPTlNfTUlOOwotCX0KLQotCS8vICoqKioqKioqKiogUmVhZENvbm5lY3Rpb25zTWF4ICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRSZWFkQ29ubmVjdGlvbnNNYXgoKSB7Ci0JCXJldHVybiB0aGlzLnJlYWRDb25uZWN0aW9uc01heDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNNYXgoSW50ZWdlciBuZXdSZWFkQ29ubmVjdGlvbnNNYXgpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnJlYWRDb25uZWN0aW9uc01heDsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXggPSBuZXdSZWFkQ29ubmVjdGlvbnNNYXg7Ci0JCXRoaXMucHV0UHJvcGVydHkoUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFksIG5ld1JlYWRDb25uZWN0aW9uc01heCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgb2xkLCBuZXdSZWFkQ29ubmVjdGlvbnNNYXgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkQ29ubmVjdGlvbnNNYXhDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXg7Ci0JCXRoaXMucmVhZENvbm5lY3Rpb25zTWF4ID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNYXgoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JFQURfQ09OTkVDVElPTlNfTUFYOwotCX0KLQotCS8vICoqKioqKioqKiogV3JpdGVDb25uZWN0aW9uc01pbiAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0V3JpdGVDb25uZWN0aW9uc01pbigpIHsKLQkJcmV0dXJuIHRoaXMud3JpdGVDb25uZWN0aW9uc01pbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXcml0ZUNvbm5lY3Rpb25zTWluKEludGVnZXIgbmV3V3JpdGVDb25uZWN0aW9uc01pbikgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMud3JpdGVDb25uZWN0aW9uc01pbjsKLQkJdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluID0gbmV3V3JpdGVDb25uZWN0aW9uc01pbjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIG5ld1dyaXRlQ29ubmVjdGlvbnNNaW4pOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBvbGQsIG5ld1dyaXRlQ29ubmVjdGlvbnNNaW4pOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUNvbm5lY3Rpb25zTWluQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUludGVnZXIgbmV3VmFsdWUgPSBnZXRJbnRlZ2VyVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlJbnRlZ2VyIG9sZCA9IHRoaXMud3JpdGVDb25uZWN0aW9uc01pbjsKLQkJdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWluKCkgewotCQlyZXR1cm4gREVGQVVMVF9XUklURV9DT05ORUNUSU9OU19NSU47Ci0JfQotCi0JLy8gKioqKioqKioqKiBXcml0ZUNvbm5lY3Rpb25zTWF4ICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRXcml0ZUNvbm5lY3Rpb25zTWF4KCkgewotCQlyZXR1cm4gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWF4OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdyaXRlQ29ubmVjdGlvbnNNYXgoSW50ZWdlciBuZXdXcml0ZUNvbm5lY3Rpb25zTWF4KSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWF4OwotCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXggPSBuZXdXcml0ZUNvbm5lY3Rpb25zTWF4OwotCQl0aGlzLnB1dFByb3BlcnR5KFdSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgbmV3V3JpdGVDb25uZWN0aW9uc01heCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFksIG9sZCwgbmV3V3JpdGVDb25uZWN0aW9uc01heCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ29ubmVjdGlvbnNNYXhDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWF4OwotCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXggPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNYXgoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dSSVRFX0NPTk5FQ1RJT05TX01BWDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2N1c3RvbWl6YXRpb24vQ3VzdG9taXphdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY3VzdG9taXphdGlvbi9DdXN0b21pemF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNGU3NmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY3VzdG9taXphdGlvbi9DdXN0b21pemF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLQotLyoqCi0gKiAgQ3VzdG9taXphdGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEN1c3RvbWl6YXRpb24gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JQm9vbGVhbiBnZXREZWZhdWx0VGhyb3dFeGNlcHRpb25zKCk7Ci0JQm9vbGVhbiBnZXRUaHJvd0V4Y2VwdGlvbnMoKTsKLQl2b2lkIHNldFRocm93RXhjZXB0aW9ucyhCb29sZWFuIG5ld1Rocm93RXhjZXB0aW9ucyk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSA9ICJ0aHJvd0V4Y2VwdGlvbnNQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TID0gImVjbGlwc2VsaW5rLm9ybS50aHJvdy5leGNlcHRpb25zIjsKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9USFJPV19FWENFUFRJT05TID0gQm9vbGVhbi5UUlVFOwotCQotCVdlYXZpbmcgZ2V0RGVmYXVsdFdlYXZpbmcoKTsKLQlXZWF2aW5nIGdldFdlYXZpbmcoKTsKLQl2b2lkIHNldFdlYXZpbmcoV2VhdmluZyBuZXdXZWF2aW5nKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX1BST1BFUlRZID0gIndlYXZpbmdQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XRUFWSU5HID0gImVjbGlwc2VsaW5rLndlYXZpbmciOwotCQlzdGF0aWMgZmluYWwgV2VhdmluZyBERUZBVUxUX1dFQVZJTkcgPSBXZWF2aW5nLnRydWVfOwotIAotCUJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdMYXp5KCk7Ci0JQm9vbGVhbiBnZXRXZWF2aW5nTGF6eSgpOwotCXZvaWQgc2V0V2VhdmluZ0xhenkoQm9vbGVhbiBuZXdXZWF2aW5nTGF6eSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19MQVpZX1BST1BFUlRZID0gIndlYXZpbmdMYXp5UHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV0VBVklOR19MQVpZID0gImVjbGlwc2VsaW5rLndlYXZpbmcubGF6eSI7Ci0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfV0VBVklOR19MQVpZID0gQm9vbGVhbi5UUlVFOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdDaGFuZ2VUcmFja2luZygpOwotCUJvb2xlYW4gZ2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCk7Ci0Jdm9pZCBzZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoQm9vbGVhbiBuZXdXZWF2aW5nQ2hhbmdlVHJhY2tpbmcpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZID0gIndlYXZpbmdDaGFuZ2VUcmFja2luZ1Byb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HID0gImVjbGlwc2VsaW5rLndlYXZpbmcuY2hhbmdldHJhY2tpbmciOwotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HID0gQm9vbGVhbi5UUlVFOwotCi0JQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0ZldGNoR3JvdXBzKCk7Ci0JQm9vbGVhbiBnZXRXZWF2aW5nRmV0Y2hHcm91cHMoKTsKLQl2b2lkIHNldFdlYXZpbmdGZXRjaEdyb3VwcyhCb29sZWFuIG5ld1dlYXZpbmdGZXRjaEdyb3Vwcyk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkgPSAid2VhdmluZ0ZldGNoR3JvdXBzUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV0VBVklOR19GRVRDSF9HUk9VUFMgPSAiZWNsaXBzZWxpbmsud2VhdmluZy5mZXRjaGdyb3VwcyI7Ci0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfV0VBVklOR19GRVRDSF9HUk9VUFMgPSBCb29sZWFuLlRSVUU7Ci0JCi0JU3RyaW5nIGdldERlZmF1bHRTZXNzaW9uQ3VzdG9taXplcigpOwotCVN0cmluZyBnZXRTZXNzaW9uQ3VzdG9taXplcigpOwotCXZvaWQgc2V0U2Vzc2lvbkN1c3RvbWl6ZXIoU3RyaW5nIG5ld1Nlc3Npb25DdXN0b21pemVyKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFkgPSAic2Vzc2lvbkN1c3RvbWl6ZXJQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TRVNTSU9OX0NVU1RPTUlaRVIgPSAiZWNsaXBzZWxpbmsuc2Vzc2lvbi5jdXN0b21pemVyIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFU1NJT05fQ1VTVE9NSVpFUiA9IG51bGw7CS8vIG5vIGRlZmF1bHQKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdERlc2NyaXB0b3JDdXN0b21pemVyKCk7Ci0JU3RyaW5nIGdldERlc2NyaXB0b3JDdXN0b21pemVyKFN0cmluZyBlbnRpdHlOYW1lKTsKLQl2b2lkIHNldERlc2NyaXB0b3JDdXN0b21pemVyKFN0cmluZyBuZXdEZXNjcmlwdG9yQ3VzdG9taXplciwgU3RyaW5nIGVudGl0eU5hbWUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSA9ICJkZXNjcmlwdG9yQ3VzdG9taXplclByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiA9ICJlY2xpcHNlbGluay5kZXNjcmlwdG9yLmN1c3RvbWl6ZXIuIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiA9IG51bGw7CS8vIG5vIGRlZmF1bHQKLQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gZW50aXRpZXMoKTsKLQlpbnQgZW50aXRpZXNTaXplKCk7Ci0JYm9vbGVhbiBlbnRpdHlFeGlzdHMoU3RyaW5nIGVudGl0eSk7Ci0JU3RyaW5nIGFkZEVudGl0eShTdHJpbmcgZW50aXR5KTsKLQl2b2lkIHJlbW92ZUVudGl0eShTdHJpbmcgZW50aXR5KTsKLQkJU3RyaW5nIEVOVElUSUVTX0xJU1RfUFJPUEVSVFkgPSAiZW50aXRpZXNMaXN0UHJvcGVydHkiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jdXN0b21pemF0aW9uL0N1c3RvbWl6ZXJQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9jdXN0b21pemF0aW9uL0N1c3RvbWl6ZXJQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOGY4ZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY3VzdG9taXphdGlvbi9DdXN0b21pemVyUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBDdXN0b21pemVyUHJvcGVydGllcwotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9taXplclByb3BlcnRpZXMgaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgU3RyaW5nIGVudGl0eU5hbWU7Ci0KLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgotCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBDdXN0b21pemVyUHJvcGVydGllcyhTdHJpbmcgZW50aXR5TmFtZSkgewotCQl0aGlzLmVudGl0eU5hbWUgPSBlbnRpdHlOYW1lOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3JzICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYobyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQ3VzdG9taXplclByb3BlcnRpZXMgY3VzdG9taXplciA9IChDdXN0b21pemVyUHJvcGVydGllcykgbzsKLQkJcmV0dXJuICgKLQkJCSh0aGlzLmNsYXNzTmFtZSA9PSBudWxsID8KLQkJCQljdXN0b21pemVyLmNsYXNzTmFtZSA9PSBudWxsIDogdGhpcy5jbGFzc05hbWUuZXF1YWxzKGN1c3RvbWl6ZXIuY2xhc3NOYW1lKSkpOwotCX0KLQkKLQkgQE92ZXJyaWRlCi0JIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ3VzdG9taXplclByb3BlcnRpZXMgY2xvbmUoKSB7Ci0JCSB0cnkgewotCQkJIHJldHVybiAoQ3VzdG9taXplclByb3BlcnRpZXMpc3VwZXIuY2xvbmUoKTsKLQkJIH0KLQkJIGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCSB9Ci0JIH0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzTmFtZSA9PSBudWxsOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0dGVyL3NldHRlciAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHlOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBuZXdDbGFzc05hbWUpIHsKLQkJdGhpcy5jbGFzc05hbWUgPSBuZXdDbGFzc05hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmJ1aWxkU2ltcGxlVG9TdHJpbmdPbih0aGlzLCBzYik7Ci0JCXNiLmFwcGVuZCgiICgiKTsKLQkJdGhpcy50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCgiIGNsYXNzOiAiKTsKLQkJc2IuYXBwZW5kKHRoaXMuY2xhc3NOYW1lKTsKLQkJc2IuYXBwZW5kKCIsIGVudGl0eU5hbWU6ICIpOwotCQlzYi5hcHBlbmQodGhpcy5lbnRpdHlOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzg5OWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbiBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotCWltcGxlbWVudHMgQ3VzdG9taXphdGlvbgotewotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBCb29sZWFuIHRocm93RXhjZXB0aW9uczsKLQlwcml2YXRlIFdlYXZpbmcgd2VhdmluZzsKLQlwcml2YXRlIEJvb2xlYW4gd2VhdmluZ0xhenk7Ci0JcHJpdmF0ZSBCb29sZWFuIHdlYXZpbmdDaGFuZ2VUcmFja2luZzsKLQlwcml2YXRlIEJvb2xlYW4gd2VhdmluZ0ZldGNoR3JvdXBzOwotCXByaXZhdGUgU3RyaW5nIHNlc3Npb25DdXN0b21pemVyOwotCi0JLy8ga2V5ID0gRW50aXR5IG5hbWUgOyB2YWx1ZSA9IEN1c3RvbWl6ZXIgcHJvcGVydGllcwotCXByaXZhdGUgTWFwPFN0cmluZywgQ3VzdG9taXplclByb3BlcnRpZXM+IGVudGl0aWVzQ3VzdG9taXplclByb3BlcnRpZXM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24oUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBwcm9wZXJ0eUxpc3RBZGFwdGVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCS8vIFRPUkVWSUVXIC0gaGFuZGxlIGluY29ycmVjdCBTdHJpbmcgaW4gcGVyc2lzdGVuY2UueG1sCi0JCXRoaXMuZW50aXRpZXNDdXN0b21pemVyUHJvcGVydGllcyA9IAotCQkJbmV3IEhhc2hNYXA8U3RyaW5nLCBDdXN0b21pemVyUHJvcGVydGllcz4oKTsKLQotCQl0aGlzLnRocm93RXhjZXB0aW9ucyA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUyk7Ci0JCXRoaXMud2VhdmluZyA9IAotCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfV0VBVklORywgV2VhdmluZy52YWx1ZXMoKSk7Ci0JCXRoaXMud2VhdmluZ0xhenkgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1dFQVZJTkdfTEFaWSk7Ci0JCXRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19XRUFWSU5HX0NIQU5HRV9UUkFDS0lORyk7Ci0JCXRoaXMud2VhdmluZ0ZldGNoR3JvdXBzID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUyk7Ci0JCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXIgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSKTsKLQotCQlTZXQ8UHJvcGVydHk+IHByb3BlcnRpZXMgPSAKLQkJCXRoaXMuZ2V0UHJvcGVydGllc1NldFdpdGhQcmVmaXgoRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSKTsKLQkJCi0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0aWVzQ3VzdG9taXplckNsYXNzKHByb3BlcnRpZXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRW50aXRpZXNDdXN0b21pemVyQ2xhc3MoU2V0PFByb3BlcnR5PiBwcm9wZXJ0aWVzKSB7Ci0JCWZvciAoUHJvcGVydHkgcHJvcGVydHkgOiBwcm9wZXJ0aWVzKSB7Ci0JCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZ2V0RW50aXR5TmFtZShwcm9wZXJ0eSk7Ci0JCQl0aGlzLnNldEN1c3RvbWl6ZXJDbGFzc18ocHJvcGVydHksIGVudGl0eU5hbWUpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleQotCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUywKLQkJCVRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1dFQVZJTkcsCi0JCQlXRUFWSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XRUFWSU5HX0xBWlksCi0JCQlXRUFWSU5HX0xBWllfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HLAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1dFQVZJTkdfRkVUQ0hfR1JPVVBTLAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFU1NJT05fQ1VTVE9NSVpFUiwKLQkJCVNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSk7Ci0KLQkJLy8gRG9uJ3QgbmVlZCB0byBpbml0aWFsaXplIHByb3BlcnR5TmFtZXMgZm9yOiAKLQkJLy8gZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0eQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB1c2VkIGZvciBpZGVudGlmeWluZyB0aGUgZ2l2ZW4gcHJvcGVydHkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXRlbUlzUHJvcGVydHkoUHJvcGVydHkgaXRlbSkgewotCQlib29sZWFuIGlzUHJvcGVydHkgPSBzdXBlci5pdGVtSXNQcm9wZXJ0eShpdGVtKTsKLQkJCi0JCWlmICggISBpc1Byb3BlcnR5ICYmIGl0ZW0uZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQlpZiAoaXRlbS5nZXROYW1lKCkuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVIpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gaXNQcm9wZXJ0eTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lIHVzZWQgZm9yIGNoYW5nZSBub3RpZmljYXRpb24gb2YgdGhlIGdpdmVuCi0JICogcHJvcGVydHkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBwcm9wZXJ0eUlkRm9yKFByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIucHJvcGVydHlJZEZvcihwcm9wZXJ0eSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAocHJvcGVydHkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSKSkgewotCQkJCXJldHVybiBERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBwcm9wZXJ0eTogIiArIHByb3BlcnR5LnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBhc3BlY3ROYW1lID0gZXZlbnQuZ2V0QXNwZWN0TmFtZSgpOwotCQlpZiAoYXNwZWN0TmFtZS5lcXVhbHMoVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSkpIHsKLQkJCXRoaXMudGhyb3dFeGNlcHRpb25zQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoV0VBVklOR19QUk9QRVJUWSkpIHsKLQkJCXRoaXMud2VhdmluZ0NoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFdFQVZJTkdfTEFaWV9QUk9QRVJUWSkpIHsKLQkJCXRoaXMud2VhdmluZ0xhenlDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSkpIHsKLQkJCXRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLndlYXZpbmdGZXRjaEdyb3Vwc0NoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSkpIHsKLQkJCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLmRlc2NyaXB0b3JDdXN0b21pemVyQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGV2ZW50IHJlY2VpdmVkIC0gcHJvcGVydHkgbm90IGFwcGxpY2FibGU6ICIgKyBhc3BlY3ROYW1lKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBUaHJvd0V4Y2VwdGlvbnMgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFRocm93RXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMudGhyb3dFeGNlcHRpb25zOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUaHJvd0V4Y2VwdGlvbnMoQm9vbGVhbiBuZXdUaHJvd0V4Y2VwdGlvbnMpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnRocm93RXhjZXB0aW9uczsKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnMgPSBuZXdUaHJvd0V4Y2VwdGlvbnM7Ci0JCXRoaXMucHV0UHJvcGVydHkoVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSwgbmV3VGhyb3dFeGNlcHRpb25zKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFksIG9sZCwgbmV3VGhyb3dFeGNlcHRpb25zKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGhyb3dFeGNlcHRpb25zQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMudGhyb3dFeGNlcHRpb25zOwotCQl0aGlzLnRocm93RXhjZXB0aW9ucyA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFRocm93RXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIERFRkFVTFRfVEhST1dfRVhDRVBUSU9OUzsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdMYXp5ICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRXZWF2aW5nTGF6eSgpIHsKLQkJcmV0dXJuIHRoaXMud2VhdmluZ0xhenk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2VhdmluZ0xhenkoQm9vbGVhbiBuZXdXZWF2aW5nTGF6eSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0xhenk7Ci0JCXRoaXMud2VhdmluZ0xhenkgPSBuZXdXZWF2aW5nTGF6eTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXRUFWSU5HX0xBWllfUFJPUEVSVFksIG5ld1dlYXZpbmdMYXp5KTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfTEFaWV9QUk9QRVJUWSwgb2xkLCBuZXdXZWF2aW5nTGF6eSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdlYXZpbmdMYXp5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0xhenk7Ci0JCXRoaXMud2VhdmluZ0xhenkgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdMYXp5KCkgewotCQlyZXR1cm4gREVGQVVMVF9XRUFWSU5HX0xBWlk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nQ2hhbmdlVHJhY2tpbmcgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFdlYXZpbmdDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIHRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdlYXZpbmdDaGFuZ2VUcmFja2luZyhCb29sZWFuIG5ld1dlYXZpbmdDaGFuZ2VUcmFja2luZykgewotCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nOwotCQl0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZyA9IG5ld1dlYXZpbmdDaGFuZ2VUcmFja2luZzsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSwgbmV3V2VhdmluZ0NoYW5nZVRyYWNraW5nKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZLCBvbGQsIG5ld1dlYXZpbmdDaGFuZ2VUcmFja2luZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdlYXZpbmdDaGFuZ2VUcmFja2luZ0NoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZzsKLQkJdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmcgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIERFRkFVTFRfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkc7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nRmV0Y2hHcm91cHMgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFdlYXZpbmdGZXRjaEdyb3VwcygpIHsKLQkJcmV0dXJuIHRoaXMud2VhdmluZ0ZldGNoR3JvdXBzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdlYXZpbmdGZXRjaEdyb3VwcyhCb29sZWFuIG5ld1dlYXZpbmdGZXRjaEdyb3VwcykgewotCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0ZldGNoR3JvdXBzOwotCQl0aGlzLndlYXZpbmdGZXRjaEdyb3VwcyA9IG5ld1dlYXZpbmdGZXRjaEdyb3VwczsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSwgbmV3V2VhdmluZ0ZldGNoR3JvdXBzKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZLCBvbGQsIG5ld1dlYXZpbmdGZXRjaEdyb3Vwcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdlYXZpbmdGZXRjaEdyb3Vwc0NoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdGZXRjaEdyb3VwczsKLQkJdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHMgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdGZXRjaEdyb3VwcygpIHsKLQkJcmV0dXJuIERFRkFVTFRfV0VBVklOR19GRVRDSF9HUk9VUFM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uQ3VzdG9taXplciAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRTZXNzaW9uQ3VzdG9taXplcigpIHsKLQkJcmV0dXJuIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2Vzc2lvbkN1c3RvbWl6ZXIoU3RyaW5nIG5ld1Nlc3Npb25DdXN0b21pemVyKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNlc3Npb25DdXN0b21pemVyOwotCQl0aGlzLnNlc3Npb25DdXN0b21pemVyID0gbmV3U2Vzc2lvbkN1c3RvbWl6ZXI7Ci0JCXRoaXMucHV0UHJvcGVydHkoU0VTU0lPTl9DVVNUT01JWkVSX1BST1BFUlRZLCBuZXdTZXNzaW9uQ3VzdG9taXplcik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFksIG9sZCwgbmV3U2Vzc2lvbkN1c3RvbWl6ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXNzaW9uQ3VzdG9taXplckNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgbmV3VmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlTdHJpbmcgb2xkID0gdGhpcy5zZXNzaW9uQ3VzdG9taXplcjsKLQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplciA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTZXNzaW9uQ3VzdG9taXplcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0VTU0lPTl9DVVNUT01JWkVSOwotCX0KLQotCS8vICoqKioqKioqKiogV2VhdmluZyAqKioqKioqKioqCi0JCi0JcHVibGljIFdlYXZpbmcgZ2V0V2VhdmluZygpIHsKLQkJcmV0dXJuIHRoaXMud2VhdmluZzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0V2VhdmluZyhXZWF2aW5nIG5ld1dlYXZpbmcpIHsKLQkJV2VhdmluZyBvbGQgPSB0aGlzLndlYXZpbmc7Ci0JCXRoaXMud2VhdmluZyA9IG5ld1dlYXZpbmc7Ci0JCXRoaXMucHV0UHJvcGVydHkoV0VBVklOR19QUk9QRVJUWSwgbmV3V2VhdmluZyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX1BST1BFUlRZLCBvbGQsIG5ld1dlYXZpbmcpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3ZWF2aW5nQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCVdlYXZpbmcgbmV3VmFsdWUgPSBnZXRFbnVtVmFsdWVPZihzdHJpbmdWYWx1ZSwgV2VhdmluZy52YWx1ZXMoKSk7Ci0JCVdlYXZpbmcgb2xkID0gdGhpcy53ZWF2aW5nOwotCQl0aGlzLndlYXZpbmcgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBXZWF2aW5nIGdldERlZmF1bHRXZWF2aW5nKCkgewotCQlyZXR1cm4gREVGQVVMVF9XRUFWSU5HOwotCX0KLQotCS8vICoqKioqKioqKiogRGVzY3JpcHRvckN1c3RvbWl6ZXIgKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXIoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJQ3VzdG9taXplclByb3BlcnRpZXMgY3VzdG9taXplciA9IHRoaXMuY3VzdG9taXplclByb3BlcnRpZXNPZihlbnRpdHlOYW1lKTsKLQkJcmV0dXJuIChjdXN0b21pemVyID09IG51bGwpID8gbnVsbCA6IGN1c3RvbWl6ZXIuZ2V0Q2xhc3NOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0b3JDdXN0b21pemVyKFN0cmluZyBuZXdEZXNjcmlwdG9yQ3VzdG9taXplciwgU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJQ3VzdG9taXplclByb3BlcnRpZXMgb2xkID0gdGhpcy5zZXRDdXN0b21pemVyQ2xhc3NfKG5ld0Rlc2NyaXB0b3JDdXN0b21pemVyLCBlbnRpdHlOYW1lKTsKLQkJdGhpcy5wdXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVIsIGVudGl0eU5hbWUsIG5ld0Rlc2NyaXB0b3JDdXN0b21pemVyLCBmYWxzZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFksIG9sZCwgdGhpcy5jdXN0b21pemVyUHJvcGVydGllc09mKGVudGl0eU5hbWUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVzY3JpcHRvckN1c3RvbWl6ZXJDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWU7Ci0JCVByb3BlcnR5IG5ld1Byb3BlcnR5ID0gKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkvLyBwcm9wZXJ0eSA9PSBudWxsIHdoZW4gcmVtb3ZlZAotCQllbnRpdHlOYW1lID0gKG5ld1Byb3BlcnR5ID09IG51bGwpID8gCi0JCQl0aGlzLmdldEVudGl0eU5hbWUoKFByb3BlcnR5KSBldmVudC5nZXRPbGRWYWx1ZSgpKSA6IHRoaXMuZ2V0RW50aXR5TmFtZShuZXdQcm9wZXJ0eSk7Ci0JCUN1c3RvbWl6ZXJQcm9wZXJ0aWVzIG9sZCA9IHRoaXMuc2V0Q3VzdG9taXplckNsYXNzXyhuZXdQcm9wZXJ0eSwgZW50aXR5TmFtZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgdGhpcy5jdXN0b21pemVyUHJvcGVydGllc09mKGVudGl0eU5hbWUpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RGVzY3JpcHRvckN1c3RvbWl6ZXIoKSB7Ci0JCXJldHVybiBERUZBVUxUX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUjsKLQl9Ci0KLQotCS8vICoqKioqKiBDdXN0b21pemVyUHJvcGVydGllcyAqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gdXBkYXRlIHRoZSBDdXN0b21pemVyQ2xhc3MgaW4gZW50aXRpZXNDdXN0b21pemVyUHJvcGVydGllcyBtYXAuCi0JICogUmV0dXJucyB0aGUgb2xkIHZhbHVlIG9mIEN1c3RvbWl6ZXJQcm9wZXJ0aWVzCi0JICovCi0JcHJpdmF0ZSBDdXN0b21pemVyUHJvcGVydGllcyBzZXRDdXN0b21pemVyQ2xhc3NfKFByb3BlcnR5IG5ld1Byb3BlcnR5LCBTdHJpbmcgZW50aXR5TmFtZSkgewotCQlTdHJpbmcgbmV3VmFsdWUgPSAobmV3UHJvcGVydHkgPT0gbnVsbCkgPyBudWxsIDogbmV3UHJvcGVydHkuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuIHRoaXMuc2V0Q3VzdG9taXplckNsYXNzXyhuZXdWYWx1ZSwgZW50aXR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBDdXN0b21pemVyUHJvcGVydGllcyBzZXRDdXN0b21pemVyQ2xhc3NfKFN0cmluZyBuZXdWYWx1ZSwgU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJQ3VzdG9taXplclByb3BlcnRpZXMgcHJvcGVydGllcyA9IHRoaXMuY3VzdG9taXplclByb3BlcnRpZXNPZihlbnRpdHlOYW1lKTsKLQkJQ3VzdG9taXplclByb3BlcnRpZXMgb2xkID0gcHJvcGVydGllcy5jbG9uZSgpOwotCQlwcm9wZXJ0aWVzLnNldENsYXNzTmFtZShuZXdWYWx1ZSk7Ci0JCXRoaXMucHV0RW50aXR5Q3VzdG9taXplclByb3BlcnRpZXMoZW50aXR5TmFtZSwgcHJvcGVydGllcyk7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ3VzdG9taXplclByb3BlcnRpZXMgb2YgdGhlIEVudGl0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqLwotCXByaXZhdGUgQ3VzdG9taXplclByb3BlcnRpZXMgY3VzdG9taXplclByb3BlcnRpZXNPZihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlDdXN0b21pemVyUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gdGhpcy5lbnRpdGllc0N1c3RvbWl6ZXJQcm9wZXJ0aWVzLmdldChlbnRpdHlOYW1lKTsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJcHJvcGVydGllcyA9IG5ldyBDdXN0b21pemVyUHJvcGVydGllcyhlbnRpdHlOYW1lKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYWxsIEN1c3RvbWl6ZXJQcm9wZXJ0aWVzIHRvIGRlZmF1bHQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyQ3VzdG9taXplclByb3BlcnRpZXMoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJdGhpcy5zZXREZXNjcmlwdG9yQ3VzdG9taXplcihudWxsLCBlbnRpdHlOYW1lKTsKLQl9Ci0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0JLyoqCi0JICogUHV0IHRoZSBnaXZlbiBFbnRpdHkgQ3VzdG9taXplclByb3BlcnRpZXMgaW4gdGhpcyBlbnRpdGllc0N1c3RvbWl6ZXJQcm9wZXJ0aWVzIG1hcC4KLQkgKiBAcGFyYW0gZW50aXR5TmFtZSAtIEVudGl0eSBuYW1lLiBUaGUgZW50aXR5IG1heSBiZSBhIG5ldyBvciBhbiBleGlzdGluZyBlbnRpdHkuCi0JICogQHBhcmFtIHByb3BlcnRpZXMgLSBFbnRpdHkgQ3VzdG9taXplclByb3BlcnRpZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHV0RW50aXR5Q3VzdG9taXplclByb3BlcnRpZXMoU3RyaW5nIGVudGl0eU5hbWUsIEN1c3RvbWl6ZXJQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJdGhpcy5hZGRPclJlcGxhY2VQcm9wZXJ0aWVzRm9yRW50aXR5KGVudGl0eU5hbWUsIHByb3BlcnRpZXMpOwotCX0KLQkKLQotCi0JLy8gKioqKioqIGVudGl0aWVzIGxpc3QgKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBlbnRpdGllcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuZW50aXRpZXNDdXN0b21pemVyUHJvcGVydGllcy5rZXlTZXQoKSkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCBlbnRpdGllc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0aWVzQ3VzdG9taXplclByb3BlcnRpZXMuc2l6ZSgpOwotCX0KLQotCS8qIAotCSAqIFZlcmlmaWVzIGlmIHRoaXMgZW50aXRpZXNDYWNoZVByb3BlcnRpZXMgbWFwIGNvbnRhaW5zIHRoZSBnaXZlbiBFbnRpdHkuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVudGl0eUV4aXN0cyhTdHJpbmcgZW50aXR5KSB7Ci0JCXJldHVybiB0aGlzLmVudGl0aWVzQ3VzdG9taXplclByb3BlcnRpZXMuY29udGFpbnNLZXkoZW50aXR5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGFkZEVudGl0eShTdHJpbmcgZW50aXR5KSB7Ci0JCWlmIChlbnRpdHlFeGlzdHMoZW50aXR5KSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRW50aXR5ICIgKyBlbnRpdHkgKyAiIGFscmVhZHkgZXhpc3QuIik7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYWRkT3JSZXBsYWNlUHJvcGVydGllc0ZvckVudGl0eShlbnRpdHksIG5ldyBDdXN0b21pemVyUHJvcGVydGllcyhlbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIG9yIFJlcGxhY2VzIHRoZSBnaXZlbiBFbnRpdHkgQ3VzdG9taXplclByb3BlcnRpZXMgaW4gCi0JICogdGhpcyBlbnRpdGllc0N1c3RvbWl6ZXJQcm9wZXJ0aWVzIG1hcC4KLQkgKiBJZiB0aGUgc3BlY2lmaWVkIEVudGl0eSBleGlzdHMgYW5kIHRoZSBnaXZlbiBDdXN0b21pemVyUHJvcGVydGllcyBpcyBlbXB0eSAKLQkgKiAoaS5lLiBhbGwgcHJvcGVydGllcyBhcmUgbnVsbCkgdGhlIG1hcHBpbmcgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG1hcC4KLQkgKiBAcGFyYW0gZW50aXR5IC0gRW50aXR5IG5hbWUKLQkgKiBAcGFyYW0gcHJvcGVydGllcyAtIEVudGl0eSBDdXN0b21pemVyUHJvcGVydGllcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBhZGRPclJlcGxhY2VQcm9wZXJ0aWVzRm9yRW50aXR5KFN0cmluZyBlbnRpdHksIEN1c3RvbWl6ZXJQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJaWYgKGVudGl0eUV4aXN0cyhlbnRpdHkpKSB7Ci0JCQl0aGlzLnJlcGxhY2VFbnRpdHlfKGVudGl0eSwgcHJvcGVydGllcyk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0aGlzLmVudGl0aWVzQ3VzdG9taXplclByb3BlcnRpZXMucHV0KGVudGl0eSwgcHJvcGVydGllcyk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEVOVElUSUVTX0xJU1RfUFJPUEVSVFkpOwotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBnaXZlbiBFbnRpdHkgQ3VzdG9taXplclByb3BlcnRpZXMgaW4gdGhpcwotCSAqIGVudGl0aWVzQ3VzdG9taXplclByb3BlcnRpZXMgbWFwLgotCSAqIElmIHRoZSBFbnRpdHkgQ3VzdG9taXplclByb3BlcnRpZXMgaXMgZW1wdHkgKGkuZS4gYWxsIHByb3BlcnRpZXMgaXMgbnVsbCkgdGhlIAotCSAqIG1hcHBpbmcgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG1hcC4KLQkgKiBAcGFyYW0gZW50aXR5IC0gRW50aXR5IG5hbWUKLQkgKiBAcGFyYW0gcHJvcGVydGllcyAtIEVudGl0eSBDdXN0b21pemVyUHJvcGVydGllcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEN1c3RvbWl6ZXJQcm9wZXJ0aWVzIHJlcGxhY2VFbnRpdHlfKFN0cmluZyBlbnRpdHksIEN1c3RvbWl6ZXJQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJQ3VzdG9taXplclByb3BlcnRpZXMgb2xkID0gdGhpcy5lbnRpdGllc0N1c3RvbWl6ZXJQcm9wZXJ0aWVzLmdldChlbnRpdHkpOwotCQlpZiAocHJvcGVydGllcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZW50aXRpZXNDdXN0b21pemVyUHJvcGVydGllcy5yZW1vdmUoZW50aXR5KTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEVOVElUSUVTX0xJU1RfUFJPUEVSVFkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5lbnRpdGllc0N1c3RvbWl6ZXJQcm9wZXJ0aWVzLnB1dChlbnRpdHksIHByb3BlcnRpZXMpOwotCQl9Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRW50aXR5KFN0cmluZyBlbnRpdHkpIHsKLQkJaWYgKCAhIGVudGl0eUV4aXN0cyhlbnRpdHkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5jbGVhckN1c3RvbWl6ZXJQcm9wZXJ0aWVzKGVudGl0eSk7Ci0JCXRoaXMuZW50aXRpZXNDdXN0b21pemVyUHJvcGVydGllcy5yZW1vdmUoZW50aXR5KTsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoRU5USVRJRVNfTElTVF9QUk9QRVJUWSk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2N1c3RvbWl6YXRpb24vV2VhdmluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY3VzdG9taXphdGlvbi9XZWF2aW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YTZjYzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvY3VzdG9taXphdGlvbi9XZWF2aW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uOwotCi0vKioKLSAqICBXZWF2aW5nCi0gKi8KLXB1YmxpYyBlbnVtIFdlYXZpbmcgewotCXRydWVfLAotCWZhbHNlXywgCi0Jc3RhdGljXzsKLQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUVfID0gInRydWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFXyA9ICJmYWxzZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDXyA9ICJzdGF0aWMiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTVhMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uPgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nCit7CisJCisJcHVibGljIEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZmEwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb247CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiAoKEVjbGlwc2VMaW5rSnBhRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKHBhcmVudCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ3ZDE3MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb247CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8RWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24+CisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZworeworCQorCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19NQVBfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwY2UxZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb247CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJCW5ldyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19NQVBfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiAoKEVjbGlwc2VMaW5rSnBhRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcocGFyZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDIxZDYwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0SmF2YUJhc2ljTWFwcGluZyAKKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nCit7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZTsKKwkKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLm11dGFibGUgPSBuZXcgSmF2YUVjbGlwc2VMaW5rTXV0YWJsZSh0aGlzKTsKKwl9CisJCisJLy8qKioqKioqKioqKioqKiBKYXZhQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nW10gYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgeworCQlyZXR1cm4gQXJyYXlUb29scy5hZGRBbGwoCisJCQlzdXBlci5idWlsZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKKwkJCUVjbGlwc2VMaW5rLk1VVEFCTEUsCisJCQlFY2xpcHNlTGluay5DT05WRVJUKTsKKwl9CQkKKworCS8vKioqKioqKioqKioqKiogQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIgYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlclR5cGUpIHsKKwkJSmF2YUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gc3VwZXIuYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXIoY29udmVydGVyVHlwZSk7CisJCWlmIChqYXZhQ29udmVydGVyICE9IG51bGwpIHsKKwkJCXJldHVybiBqYXZhQ29udmVydGVyOworCQl9CisJCWlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSB7CisJCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnQodGhpcywgdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCkgeworCQkvL2NoZWNrIEBDb252ZXJ0IGZpcnN0LCB0aGlzIGlzIHRoZSBvcmRlciB0aGF0IEVjbGlwc2VMaW5rIHNlYXJjaGVzCisJCWlmICh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpICE9IG51bGwpIHsKKwkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUjsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCk7CisJfQorCQorCS8vKioqKioqKioqKioqIEVjbGlwc2VsaW5rSmF2YUJhc2ljTWFwcGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEVjbGlwc2VMaW5rTXV0YWJsZSBnZXRNdXRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5tdXRhYmxlOworCX0KKworCQorCS8vKioqKioqKioqKioqIGluaXRpYWxpemF0aW9uL3VwZGF0ZSAqKioqKioqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisJCXRoaXMubXV0YWJsZS5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLm11dGFibGUudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCX0KKworCS8vICoqKioqKioqKiogY29kZSBhc3Npc3QgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWlmIChnZXRDb252ZXJ0ZXIoKSAhPSBudWxsKSB7CisJCQlyZXN1bHQgPSBnZXRDb252ZXJ0ZXIoKS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCQorCS8vKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXRoaXMubXV0YWJsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0ltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzMwYzRkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDYWNoaW5nSW1wbC5qYXZhCkBAIC0wLDAgKzEsNTk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLkpwYUZhY3RvcnkyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDYWNoZWFibGVIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nSW1wbAorCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIAorCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nLAorCQlKYXZhQ2FjaGVhYmxlSG9sZGVyMl8wCit7CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIHNwZWNpZmllZFR5cGU7CisJcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkU2l6ZTsKKwlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRTaGFyZWQ7CisJcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkQWx3YXlzUmVmcmVzaDsKKwlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXI7CisJcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkRGlzYWJsZUhpdHM7CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gZXhpc3RlbmNlQ2hlY2tpbmc7CisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBzcGVjaWZpZWRFeGlzdGVuY2VUeXBlOworCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZGVmYXVsdEV4aXN0ZW5jZVR5cGU7CisKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKKwkKKwlwcm90ZWN0ZWQgSW50ZWdlciBleHBpcnk7CisJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSBleHBpcnlUaW1lT2ZEYXk7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFDYWNoZWFibGUyXzAgY2FjaGVhYmxlOworCQorCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworCQorCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nSW1wbChKYXZhVHlwZU1hcHBpbmcgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuY2FjaGVhYmxlID0gKChKcGFGYWN0b3J5Ml8wKSB0aGlzLmdldEpwYUZhY3RvcnkoKSkuYnVpbGRKYXZhQ2FjaGVhYmxlKHRoaXMpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YVR5cGVNYXBwaW5nIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChKYXZhVHlwZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOworCX0KKwkKKworCS8vcXVlcnkgZm9yIHRoZSBjYWNoZSBhbm5vdGF0aW9uIGV2ZXJ5IHRpbWUgb24gc2V0dGVycy4KKwkvL2NhbGwgb25lIHNldHRlciBhbmQgdGhlIENhY2hlQW5ub3RhdGlvbiBjb3VsZCBjaGFuZ2UuIAorCS8vWW91IGNvdWxkIGNhbGwgbW9yZSB0aGFuIG9uZSBzZXR0ZXIgYmVmb3JlIHRoaXMgb2JqZWN0IGhhcyByZWNlaXZlZCBhbnkgbm90aWZpY2F0aW9uCisJLy9mcm9tIHRoZSBqYXZhIHJlc291cmNlIG1vZGVsCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGdldENhY2hlQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLgorCQkJCWdldE5vbk51bGxBbm5vdGF0aW9uKGdldENhY2hlQW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBnZXRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oKSB7CisJCXJldHVybiAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS4KKwkJCQlnZXRBbm5vdGF0aW9uKGdldEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRDYWNoZUFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXRUeXBlKCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkVHlwZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0VHlwZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRUeXBlKCk7CisJfQorCisJcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGdldERlZmF1bHRUeXBlKCkgeworCQlyZXR1cm4gREVGQVVMVF9UWVBFOworCX0KKwkJCisJcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGdldFNwZWNpZmllZFR5cGUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFR5cGU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUgbmV3U3BlY2lmaWVkVHlwZSkgeworCQlFY2xpcHNlTGlua0NhY2hlVHlwZSBvbGRTcGVjaWZpZWRUeXBlID0gdGhpcy5zcGVjaWZpZWRUeXBlOworCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBuZXdTcGVjaWZpZWRUeXBlOworCQl0aGlzLmdldENhY2hlQW5ub3RhdGlvbigpLnNldFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRUeXBlKSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFR5cGUsIG5ld1NwZWNpZmllZFR5cGUpOworCX0KKwkKKwkvKioKKwkgKiBpbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4KKwkgKiBUaGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggSW52YWxpZFRocmVhZEFjY2VzcyBleGNlcHRpb25zIGluIHRoZSBVSQorCSAqIHdoZW4geW91IHNldCBhIHZhbHVlIGZyb20gdGhlIFVJIGFuZCB0aGUgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHlldC4KKwkgKiBBZGRpbmcgdGhlIGFubm90YXRpb24gY2F1c2VzIGFuIHVwZGF0ZSB0byBvY2N1ciBhbmQgdGhlbiB0aGUgZXhjZXB0aW9uLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFR5cGVfKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIG5ld1NwZWNpZmllZFR5cGUpIHsKKwkJRWNsaXBzZUxpbmtDYWNoZVR5cGUgb2xkU3BlY2lmaWVkVHlwZSA9IHRoaXMuc3BlY2lmaWVkVHlwZTsKKwkJdGhpcy5zcGVjaWZpZWRUeXBlID0gbmV3U3BlY2lmaWVkVHlwZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVHlwZSwgbmV3U3BlY2lmaWVkVHlwZSk7CisJfQorCisJcHVibGljIGludCBnZXRTaXplKCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkU2l6ZSgpID09IG51bGwpID8gZ2V0RGVmYXVsdFNpemUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU2l6ZSgpLmludFZhbHVlKCk7CisJfQorCisJcHVibGljIGludCBnZXREZWZhdWx0U2l6ZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1NJWkU7CisJfQorCQorCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZFNpemUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFNpemU7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2l6ZShJbnRlZ2VyIG5ld1NwZWNpZmllZFNpemUpIHsKKwkJSW50ZWdlciBvbGRTcGVjaWZpZWRTaXplID0gdGhpcy5zcGVjaWZpZWRTaXplOworCQl0aGlzLnNwZWNpZmllZFNpemUgPSBuZXdTcGVjaWZpZWRTaXplOworCQlnZXRDYWNoZUFubm90YXRpb24oKS5zZXRTaXplKG5ld1NwZWNpZmllZFNpemUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TSVpFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTaXplLCBuZXdTcGVjaWZpZWRTaXplKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2l6ZV8oSW50ZWdlciBuZXdTcGVjaWZpZWRTaXplKSB7CisJCUludGVnZXIgb2xkU3BlY2lmaWVkU2l6ZSA9IHRoaXMuc3BlY2lmaWVkU2l6ZTsKKwkJdGhpcy5zcGVjaWZpZWRTaXplID0gbmV3U3BlY2lmaWVkU2l6ZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0laRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2l6ZSwgbmV3U3BlY2lmaWVkU2l6ZSk7CisJfQorCisKKwlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNoYXJlZCA9PSBudWxsKSA/IHRoaXMuaXNEZWZhdWx0U2hhcmVkKCkgOiB0aGlzLnNwZWNpZmllZFNoYXJlZC5ib29sZWFuVmFsdWUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0U2hhcmVkKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfU0hBUkVEOworCX0KKwkKKwlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRTaGFyZWQoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFNoYXJlZDsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4gbmV3U3BlY2lmaWVkU2hhcmVkKSB7CisJCUJvb2xlYW4gb2xkU2hhcmVkID0gdGhpcy5zcGVjaWZpZWRTaGFyZWQ7CisJCXRoaXMuc3BlY2lmaWVkU2hhcmVkID0gbmV3U3BlY2lmaWVkU2hhcmVkOworCQl0aGlzLmdldENhY2hlQW5ub3RhdGlvbigpLnNldFNoYXJlZChuZXdTcGVjaWZpZWRTaGFyZWQpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfU0hBUkVEX1BST1BFUlRZLCBvbGRTaGFyZWQsIG5ld1NwZWNpZmllZFNoYXJlZCk7CisJCQorCQlpZiAobmV3U3BlY2lmaWVkU2hhcmVkID09IEJvb2xlYW4uRkFMU0UpIHsKKwkJCXNldFNwZWNpZmllZFR5cGUobnVsbCk7CisJCQlzZXRTcGVjaWZpZWRTaXplKG51bGwpOworCQkJc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChudWxsKTsKKwkJCXNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihudWxsKTsKKwkJCXNldFNwZWNpZmllZERpc2FibGVIaXRzKG51bGwpOworCQkJc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShudWxsKTsKKwkJCXNldEV4cGlyeShudWxsKTsKKwkJCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7CisJCQkJcmVtb3ZlRXhwaXJ5VGltZU9mRGF5KCk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTaGFyZWRfKEJvb2xlYW4gbmV3U3BlY2lmaWVkU2hhcmVkKSB7CisJCUJvb2xlYW4gb2xkU3BlY2lmaWVkU2hhcmVkID0gdGhpcy5zcGVjaWZpZWRTaGFyZWQ7CisJCXRoaXMuc3BlY2lmaWVkU2hhcmVkID0gbmV3U3BlY2lmaWVkU2hhcmVkOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfU0hBUkVEX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTaGFyZWQsIG5ld1NwZWNpZmllZFNoYXJlZCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNBbHdheXNSZWZyZXNoKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaCA9PSBudWxsKSA/IHRoaXMuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpIDogdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoLmJvb2xlYW5WYWx1ZSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfQUxXQVlTX1JFRlJFU0g7CisJfQorCQorCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2g7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbiBuZXdTcGVjaWZpZWRBbHdheXNSZWZyZXNoKSB7CisJCUJvb2xlYW4gb2xkQWx3YXlzUmVmcmVzaCA9IHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaDsKKwkJdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoID0gbmV3U3BlY2lmaWVkQWx3YXlzUmVmcmVzaDsKKwkJdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKS5zZXRBbHdheXNSZWZyZXNoKG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2gpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFksIG9sZEFsd2F5c1JlZnJlc2gsIG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2gpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2hfKEJvb2xlYW4gbmV3U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCkgeworCQlCb29sZWFuIG9sZEFsd2F5c1JlZnJlc2ggPSB0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2g7CisJCXRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaCA9IG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2g7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9BTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSwgb2xkQWx3YXlzUmVmcmVzaCwgbmV3U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNSZWZyZXNoT25seUlmTmV3ZXIoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIgPT0gbnVsbCkgPyB0aGlzLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpIDogdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIuYm9vbGVhblZhbHVlKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1JFRlJFU0hfT05MWV9JRl9ORVdFUjsKKwl9CisJCisJcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXI7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcikgeworCQlCb29sZWFuIG9sZFJlZnJlc2hPbmx5SWZOZXdlciA9IHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOworCQl0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciA9IG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcjsKKwkJdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIobmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1JFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSwgb2xkUmVmcmVzaE9ubHlJZk5ld2VyLCBuZXdTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcl8oQm9vbGVhbiBuZXdTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIpIHsKKwkJQm9vbGVhbiBvbGRSZWZyZXNoT25seUlmTmV3ZXIgPSB0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcjsKKwkJdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIgPSBuZXdTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXI7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFksIG9sZFJlZnJlc2hPbmx5SWZOZXdlciwgbmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0Rpc2FibGVIaXRzKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMgPT0gbnVsbCkgPyB0aGlzLmlzRGVmYXVsdERpc2FibGVIaXRzKCkgOiB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzLmJvb2xlYW5WYWx1ZSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHREaXNhYmxlSGl0cygpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX0RJU0FCTEVfSElUUzsKKwl9CisJCisJcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuIG5ld1NwZWNpZmllZERpc2FibGVIaXRzKSB7CisJCUJvb2xlYW4gb2xkRGlzYWJsZUhpdHMgPSB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOworCQl0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzID0gbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHM7CisJCXRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uKCkuc2V0RGlzYWJsZUhpdHMobmV3U3BlY2lmaWVkRGlzYWJsZUhpdHMpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfRElTQUJMRV9ISVRTX1BST1BFUlRZLCBvbGREaXNhYmxlSGl0cywgbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHMpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZERpc2FibGVIaXRzXyhCb29sZWFuIG5ld1NwZWNpZmllZERpc2FibGVIaXRzKSB7CisJCUJvb2xlYW4gb2xkRGlzYWJsZUhpdHMgPSB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOworCQl0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzID0gbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHM7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9ESVNBQkxFX0hJVFNfUFJPUEVSVFksIG9sZERpc2FibGVIaXRzLCBuZXdTcGVjaWZpZWREaXNhYmxlSGl0cyk7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRDb29yZGluYXRpb25UeXBlKCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCk7CisJfQorCisJcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkgeworCQlyZXR1cm4gREVGQVVMVF9DT09SRElOQVRJT05fVFlQRTsKKwl9CisJCQorCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIG5ld1NwZWNpZmllZENvb3JkaW5hdGlvblR5cGUpIHsKKwkJRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgb2xkU3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSA9IHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKKwkJdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlID0gbmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKKwkJdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKS5zZXRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSkpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSwgbmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSk7CisJfQorCQorCS8qKgorCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgorCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCisJICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgorCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZV8oRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgbmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSkgeworCQlFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBvbGRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlID0gdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlOworCQl0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgPSBuZXdTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSwgbmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGhhc0V4aXN0ZW5jZUNoZWNraW5nKCkgeworCQlyZXR1cm4gdGhpcy5leGlzdGVuY2VDaGVja2luZzsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0RXhpc3RlbmNlQ2hlY2tpbmcoYm9vbGVhbiBuZXdFeGlzdGVuY2VDaGVja2luZykgeworCQlib29sZWFuIG9sZEV4aXN0ZW5jZUNoZWNraW5nID0gdGhpcy5leGlzdGVuY2VDaGVja2luZzsKKwkJdGhpcy5leGlzdGVuY2VDaGVja2luZyA9IG5ld0V4aXN0ZW5jZUNoZWNraW5nOworCQlpZiAobmV3RXhpc3RlbmNlQ2hlY2tpbmcpIHsKKwkJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hZGRBbm5vdGF0aW9uKGdldEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbk5hbWUoKSk7CisJCX0KKwkJZWxzZSB7CisJCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUucmVtb3ZlQW5ub3RhdGlvbihnZXRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25OYW1lKCkpOworCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhJU1RFTkNFX0NIRUNLSU5HX1BST1BFUlRZLCBvbGRFeGlzdGVuY2VDaGVja2luZywgbmV3RXhpc3RlbmNlQ2hlY2tpbmcpOworCQlzZXREZWZhdWx0RXhpc3RlbmNlVHlwZShjYWNsdWxhdGVEZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RXhpc3RlbmNlQ2hlY2tpbmdfKGJvb2xlYW4gbmV3RXhpc3RlbmNlQ2hlY2tpbmcpIHsKKwkJYm9vbGVhbiBvbGRFeGlzdGVuY2VDaGVja2luZyA9IHRoaXMuZXhpc3RlbmNlQ2hlY2tpbmc7CisJCXRoaXMuZXhpc3RlbmNlQ2hlY2tpbmcgPSBuZXdFeGlzdGVuY2VDaGVja2luZzsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChFWElTVEVOQ0VfQ0hFQ0tJTkdfUFJPUEVSVFksIG9sZEV4aXN0ZW5jZUNoZWNraW5nLCBuZXdFeGlzdGVuY2VDaGVja2luZyk7CisJfQorCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgY2FjbHVsYXRlRGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSB7CisJCWlmIChoYXNFeGlzdGVuY2VDaGVja2luZygpKSB7CisJCQlyZXR1cm4gRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFOworCQl9CisJCXJldHVybiBERUZBVUxUX0VYSVNURU5DRV9UWVBFOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldEV4aXN0ZW5jZVR5cGUoKSB7CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkgOiB0aGlzLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKTsKKwl9CisKKwlwdWJsaWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0RXhpc3RlbmNlVHlwZTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG5ld0RlZmF1bHRFeGlzdGVuY2VUeXBlKSB7CisJCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBvbGREZWZhdWx0RXhpc3RlbmNlVHlwZSA9IHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGU7CisJCXRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGUgPSBuZXdEZWZhdWx0RXhpc3RlbmNlVHlwZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZLCBvbGREZWZhdWx0RXhpc3RlbmNlVHlwZSwgbmV3RGVmYXVsdEV4aXN0ZW5jZVR5cGUpOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGUpIHsKKwkJaWYgKCFoYXNFeGlzdGVuY2VDaGVja2luZygpKSB7CisJCQlpZiAobmV3U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSAhPSBudWxsKSB7CisJCQkJc2V0RXhpc3RlbmNlQ2hlY2tpbmcodHJ1ZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG9sZFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPSB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7CisJCXRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA9IG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGU7CisJCXRoaXMuZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSkpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkRXhpc3RlbmNlVHlwZSwgbmV3U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSk7CisJfQorCQorCS8qKgorCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgorCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCisJICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgorCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZV8oRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGUpIHsKKwkJRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG9sZFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPSB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7CisJCXRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA9IG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlLCBuZXdTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKTsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRFeHBpcnkoKSB7CisJCXJldHVybiB0aGlzLmV4cGlyeTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0RXhwaXJ5KEludGVnZXIgbmV3RXhwaXJ5KSB7CisJCUludGVnZXIgb2xkRXhwaXJ5ID0gdGhpcy5leHBpcnk7CisJCXRoaXMuZXhwaXJ5ID0gbmV3RXhwaXJ5OworCQlnZXRDYWNoZUFubm90YXRpb24oKS5zZXRFeHBpcnkobmV3RXhwaXJ5KTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChFWFBJUllfUFJPUEVSVFksIG9sZEV4cGlyeSwgbmV3RXhwaXJ5KTsKKwkJaWYgKG5ld0V4cGlyeSAhPSBudWxsICYmIHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpIHsKKwkJCXJlbW92ZUV4cGlyeVRpbWVPZkRheSgpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldEV4cGlyeV8oSW50ZWdlciBuZXdFeHBpcnkpIHsKKwkJSW50ZWdlciBvbGRFeHBpcnkgPSB0aGlzLmV4cGlyeTsKKwkJdGhpcy5leHBpcnkgPSBuZXdFeHBpcnk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1BST1BFUlRZLCBvbGRFeHBpcnksIG5ld0V4cGlyeSk7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSBnZXRFeHBpcnlUaW1lT2ZEYXkoKSB7CisJCXJldHVybiB0aGlzLmV4cGlyeVRpbWVPZkRheTsKKwl9CisJCisJcHVibGljIEVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IGFkZEV4cGlyeVRpbWVPZkRheSgpIHsKKwkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImV4cGlyeVRpbWVPZkRheSBhbHJlYWR5IGV4aXN0cywgdXNlIGdldEV4cGlyeVRpbWVPZkRheSgpIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlpZiAodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oZ2V0Q2FjaGVBbm5vdGF0aW9uTmFtZSgpKSA9PSBudWxsKSB7CisJCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbihnZXRDYWNoZUFubm90YXRpb25OYW1lKCkpOworCQl9CisJCUphdmFFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSBuZXdFeHBpcnlUaW1lT2ZEYXkgPSBuZXcgSmF2YUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5KHRoaXMpOworCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IG5ld0V4cGlyeVRpbWVPZkRheTsKKwkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheUFubm90YXRpb24gPSBnZXRDYWNoZUFubm90YXRpb24oKS5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJbmV3RXhwaXJ5VGltZU9mRGF5LmluaXRpYWxpemUodGltZU9mRGF5QW5ub3RhdGlvbik7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZLCBudWxsLCBuZXdFeHBpcnlUaW1lT2ZEYXkpOworCQlzZXRFeHBpcnkobnVsbCk7CisJCXJldHVybiBuZXdFeHBpcnlUaW1lT2ZEYXk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheSgpIHsKKwkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRpbWVPZkRheUV4cGlyeSBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkgb2xkRXhwaXJ5VGltZU9mRGF5ID0gdGhpcy5leHBpcnlUaW1lT2ZEYXk7CisJCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gbnVsbDsKKwkJZ2V0Q2FjaGVBbm5vdGF0aW9uKCkucmVtb3ZlRXhwaXJ5VGltZU9mRGF5KCk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZLCBvbGRFeHBpcnlUaW1lT2ZEYXksIG51bGwpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRFeHBpcnlUaW1lT2ZEYXkoSmF2YUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IG5ld0V4cGlyeVRpbWVPZkRheSkgeworCQlKYXZhRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkgb2xkRXhwaXJ5VGltZU9mRGF5ID0gdGhpcy5leHBpcnlUaW1lT2ZEYXk7CisJCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gbmV3RXhwaXJ5VGltZU9mRGF5OworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSwgb2xkRXhwaXJ5VGltZU9mRGF5LCBuZXdFeHBpcnlUaW1lT2ZEYXkpOworCX0KKwkKKwlwdWJsaWMgSmF2YUNhY2hlYWJsZTJfMCBnZXRDYWNoZWFibGUoKSB7CisJCXJldHVybiB0aGlzLmNhY2hlYWJsZTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpIHsKKwkJQ2FjaGVhYmxlSG9sZGVyMl8wIGNhY2hlYWJsZUhvbGRlciA9IGdldENhY2hlYWJsZVN1cGVyUGVyc2lzdGVudFR5cGUoZ2V0UGFyZW50KCkuZ2V0UGVyc2lzdGVudFR5cGUoKSk7CisJCWlmIChjYWNoZWFibGVIb2xkZXIgIT0gbnVsbCkgeworCQkJcmV0dXJuIGNhY2hlYWJsZUhvbGRlci5nZXRDYWNoZWFibGUoKS5pc0NhY2hlYWJsZSgpOworCQl9CisJCXJldHVybiB0cnVlOy8vKChQZXJzaXN0ZW5jZVVuaXQyXzApIGdldFBlcnNpc3RlbmNlVW5pdCgpKS5jYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCk7CisJfQorCQorCXByb3RlY3RlZCBDYWNoZWFibGVIb2xkZXIyXzAgZ2V0Q2FjaGVhYmxlU3VwZXJQZXJzaXN0ZW50VHlwZShQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgeworCQlQZXJzaXN0ZW50VHlwZSBzdXBlclBlcnNpc3RlbnRUeXBlID0gcGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpOworCQlpZiAoc3VwZXJQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7CisJCQlpZiAoc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBDYWNoZWFibGVIb2xkZXIyXzApIHsKKwkJCQlyZXR1cm4gKENhY2hlYWJsZUhvbGRlcjJfMCkgc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCQl9CisJCQlyZXR1cm4gZ2V0Q2FjaGVhYmxlU3VwZXJQZXJzaXN0ZW50VHlwZShzdXBlclBlcnNpc3RlbnRUeXBlKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IHJlc291cmNlUGVyc2lzdGVudFR5cGU7CisJCWluaXRpYWxpemUoZ2V0Q2FjaGVBbm5vdGF0aW9uKCkpOworCQlpbml0aWFsaXplKGdldEV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbigpKTsKKwkJdGhpcy5jYWNoZWFibGUuaW5pdGlhbGl6ZShyZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlKSB7CisJCXRoaXMuc3BlY2lmaWVkVHlwZSA9IHRoaXMuc3BlY2lmaWVkVHlwZShjYWNoZSk7CisJCXRoaXMuc3BlY2lmaWVkU2l6ZSA9IHRoaXMuc3BlY2lmaWVkU2l6ZShjYWNoZSk7CisJCXRoaXMuc3BlY2lmaWVkU2hhcmVkID0gdGhpcy5zcGVjaWZpZWRTaGFyZWQoY2FjaGUpOworCQl0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2ggPSB0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2goY2FjaGUpOworCQl0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciA9IHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKGNhY2hlKTsKKwkJdGhpcy5zcGVjaWZpZWREaXNhYmxlSGl0cyA9IHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMoY2FjaGUpOworCQl0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgPSB0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoY2FjaGUpOworCQl0aGlzLmluaXRpYWxpemVFeHBpcnkoY2FjaGUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nKSB7CisJCXRoaXMuZXhpc3RlbmNlQ2hlY2tpbmcgPSBleGlzdGVuY2VDaGVja2luZyAhPSBudWxsOworCQl0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPSBzcGVjaWZpZWRFeGlzdGVuY2VUeXBlKGV4aXN0ZW5jZUNoZWNraW5nKTsKKwkJdGhpcy5kZWZhdWx0RXhpc3RlbmNlVHlwZSA9IHRoaXMuY2FjbHVsYXRlRGVmYXVsdEV4aXN0ZW5jZVR5cGUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRXhwaXJ5KEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlKSB7CisJCWlmIChjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKSA9PSBudWxsKSB7CisJCQl0aGlzLmV4cGlyeSA9IGNhY2hlLmdldEV4cGlyeSgpOworCQl9CisJCWVsc2UgeworCQkJaWYgKGNhY2hlLmdldEV4cGlyeSgpID09IG51bGwpIHsgLy9oYW5kbGUgd2l0aCB2YWxpZGF0aW9uIGlmIGJvdGggZXhwaXJ5IGFuZCBleHBpcnlUaW1lT2ZEYXkgYXJlIHNldAorCQkJCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gbmV3IEphdmFFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSh0aGlzKTsKKwkJCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5pbml0aWFsaXplKGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUgPSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworCQl1cGRhdGUoZ2V0Q2FjaGVBbm5vdGF0aW9uKCkpOworCQl1cGRhdGUoZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKCkpOworCQl1cGRhdGVFeHBpcnkoZ2V0Q2FjaGVBbm5vdGF0aW9uKCkpOworCQl0aGlzLmNhY2hlYWJsZS51cGRhdGUocmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSkgeworCQlzZXRTcGVjaWZpZWRUeXBlXyh0aGlzLnNwZWNpZmllZFR5cGUoY2FjaGUpKTsKKwkJc2V0U3BlY2lmaWVkU2l6ZV8odGhpcy5zcGVjaWZpZWRTaXplKGNhY2hlKSk7CisJCXNldFNwZWNpZmllZFNoYXJlZF8odGhpcy5zcGVjaWZpZWRTaGFyZWQoY2FjaGUpKTsKKwkJc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaF8odGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoKGNhY2hlKSk7CisJCXNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcl8odGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoY2FjaGUpKTsKKwkJc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHNfKHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMoY2FjaGUpKTsKKwkJc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZV8odGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKGNhY2hlKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nKSB7CisJCXNldEV4aXN0ZW5jZUNoZWNraW5nXyhleGlzdGVuY2VDaGVja2luZyAhPSBudWxsKTsKKwkJc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZV8oc3BlY2lmaWVkRXhpc3RlbmNlVHlwZShleGlzdGVuY2VDaGVja2luZykpOworCQlzZXREZWZhdWx0RXhpc3RlbmNlVHlwZShjYWNsdWxhdGVEZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXhwaXJ5KEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlKSB7CisJCWlmIChjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKSA9PSBudWxsKSB7CisJCQlzZXRFeHBpcnlUaW1lT2ZEYXkobnVsbCk7CisJCQlzZXRFeHBpcnlfKGNhY2hlLmdldEV4cGlyeSgpKTsKKwkJfQorCQllbHNlIHsKKwkJCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7CisJCQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkudXBkYXRlKGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGNhY2hlLmdldEV4cGlyeSgpID09IG51bGwpeworCQkJCXNldEV4cGlyeVRpbWVPZkRheShuZXcgSmF2YUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5KHRoaXMpKTsKKwkJCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5pbml0aWFsaXplKGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKKwkJCX0KKwkJCWVsc2UgeyAvL2hhbmRsZSB3aXRoIHZhbGlkYXRpb24gaWYgYm90aCBleHBpcnkgYW5kIGV4cGlyeVRpbWVPZkRheSBhcmUgc2V0CisJCQkJc2V0RXhwaXJ5VGltZU9mRGF5KG51bGwpOworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIHNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGVUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChjYWNoZS5nZXRUeXBlKCkpOworCX0KKworCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZFNpemUoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUpIHsKKwkJcmV0dXJuIGNhY2hlLmdldFNpemUoKTsKKwl9CisJCisJcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkU2hhcmVkKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlKSB7CisJCXJldHVybiBjYWNoZS5nZXRTaGFyZWQoKTsKKwl9CQorCQorCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZEFsd2F5c1JlZnJlc2goRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUpIHsKKwkJcmV0dXJuIGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKTsKKwl9CQorCQorCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSkgeworCQlyZXR1cm4gY2FjaGUuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCk7CisJfQkKKwkKKwlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWREaXNhYmxlSGl0cyhFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSkgeworCQlyZXR1cm4gY2FjaGUuZ2V0RGlzYWJsZUhpdHMoKTsKKwl9CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChjYWNoZS5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgSW50ZWdlciBleHBpcnkoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUpIHsKKwkJcmV0dXJuIGNhY2hlLmdldEV4cGlyeSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIHNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcpIHsKKwkJaWYgKGV4aXN0ZW5jZUNoZWNraW5nID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOworCX0KKworCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRDYWNoZUFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7CisJCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXRoaXMudmFsaWRhdGVFeHBpcnkobWVzc2FnZXMsIGFzdFJvb3QpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRXhwaXJ5KExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IGdldENhY2hlQW5ub3RhdGlvbigpOworCQlpZiAoY2FjaGUuZ2V0RXhwaXJ5KCkgIT0gbnVsbCAmJiBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKSAhPSBudWxsKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ0FDSEVfRVhQSVJZX0FORF9FWFBJUllfVElNRV9PRl9EQVlfQk9USF9TUEVDSUZJRUQsCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRQYXJlbnQoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKX0sCisJCQkJCXRoaXMsIAorCQkJCQlnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCisJCQkJKQorCQkJKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTg0MjhmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUgaW1wbGVtZW50cyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nCit7CisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGU7CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIHNwZWNpZmllZFR5cGU7CisJCisJCisJcHVibGljIEphdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nKEphdmFUeXBlTWFwcGluZyBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFUeXBlTWFwcGluZyBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoSmF2YVR5cGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSnBhRmFjdG9yeSBnZXRKcGFGYWN0b3J5KCkgeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rSnBhRmFjdG9yeSkgc3VwZXIuZ2V0SnBhRmFjdG9yeSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBnZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKSB7CisJCXJldHVybiAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRBbm5vdGF0aW9uKGdldENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbigpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oZ2V0Q2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUucmVtb3ZlQW5ub3RhdGlvbihnZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25OYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFR5cGUoKSAhPSBudWxsKSA/IHRoaXMuZ2V0U3BlY2lmaWVkVHlwZSgpIDogdGhpcy5nZXREZWZhdWx0VHlwZSgpOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0RGVmYXVsdFR5cGUoKSB7CisJCXJldHVybiBERUZBVUxUX1RZUEU7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXRTcGVjaWZpZWRUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUeXBlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIG5ld1NwZWNpZmllZFR5cGUpIHsKKwkJaWYgKHRoaXMuc3BlY2lmaWVkVHlwZSA9PSBuZXdTcGVjaWZpZWRUeXBlKSB7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIG9sZFNwZWNpZmllZFR5cGUgPSB0aGlzLnNwZWNpZmllZFR5cGU7CisJCXRoaXMuc3BlY2lmaWVkVHlwZSA9IG5ld1NwZWNpZmllZFR5cGU7CisJCQorCQlpZiAobmV3U3BlY2lmaWVkVHlwZSAhPSBudWxsKSB7CisJCQlpZiAoZ2V0Q2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKCkgPT0gbnVsbCkgeworCQkJCWFkZENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbigpOworCQkJfQorCQkJZ2V0Q2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRUeXBlKSk7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoZ2V0Q2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKCkgIT0gbnVsbCkgeworCQkJCXJlbW92ZUNoYW5nZVRyYWNraW5nQW5ub3RhdGlvbigpOworCQkJfQorCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFR5cGUsIG5ld1NwZWNpZmllZFR5cGUpOworCX0KKwkKKwkvKioKKwkgKiBpbnRlcm5hbCBzZXR0ZXIgdXNlZCBvbmx5IGZvciB1cGRhdGluZyBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbC4KKwkgKiBUaGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggSW52YWxpZFRocmVhZEFjY2VzcyBleGNlcHRpb25zIGluIHRoZSBVSQorCSAqIHdoZW4geW91IHNldCBhIHZhbHVlIGZyb20gdGhlIFVJIGFuZCB0aGUgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHlldC4KKwkgKiBBZGRpbmcgdGhlIGFubm90YXRpb24gY2F1c2VzIGFuIHVwZGF0ZSB0byBvY2N1ciBhbmQgdGhlbiB0aGUgZXhjZXB0aW9uLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFR5cGVfKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIG5ld1NwZWNpZmllZFR5cGUpIHsKKwkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgb2xkU3BlY2lmaWVkVHlwZSA9IHRoaXMuc3BlY2lmaWVkVHlwZTsKKwkJdGhpcy5zcGVjaWZpZWRUeXBlID0gbmV3U3BlY2lmaWVkVHlwZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkVHlwZSwgbmV3U3BlY2lmaWVkVHlwZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUgPSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBjaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gPSB0aGlzLmdldENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbigpOworCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBjaGFuZ2VUcmFja2luZ1R5cGUoY2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0gcmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKKwkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gY2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uID0gdGhpcy5nZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlXyhjaGFuZ2VUcmFja2luZ1R5cGUoY2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSk7CisJfQorCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBjaGFuZ2VUcmFja2luZ1R5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gY2hhbmdlVHJhY2tpbmcpIHsKKwkJaWYgKGNoYW5nZVRyYWNraW5nID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWVsc2UgaWYgKGNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcuREVGQVVMVF9UWVBFOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChjaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gY2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uID0gZ2V0Q2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKCk7CisJCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBjaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gPT0gbnVsbCA/IG51bGwgOiBjaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOworCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNjOGI4NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlCit7CQorCXByaXZhdGUgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIHJlc291cmNlQ29udmVyc2lvblZhbHVlOworCQorCXByaXZhdGUgU3RyaW5nIGRhdGFWYWx1ZTsKKwkKKwlwcml2YXRlIFN0cmluZyBvYmplY3RWYWx1ZTsKKwkKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlKEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CQkKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5kYXRhVmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGF0YVZhbHVlKFN0cmluZyBuZXdEYXRhVmFsdWUpIHsKKwkJU3RyaW5nIG9sZERhdGFWYWx1ZSA9IHRoaXMuZGF0YVZhbHVlOworCQl0aGlzLmRhdGFWYWx1ZSA9IG5ld0RhdGFWYWx1ZTsKKwkJdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5zZXREYXRhVmFsdWUobmV3RGF0YVZhbHVlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1ZBTFVFX1BST1BFUlRZLCBvbGREYXRhVmFsdWUsIG5ld0RhdGFWYWx1ZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldERhdGFWYWx1ZV8oU3RyaW5nIG5ld0RhdGFWYWx1ZSkgeworCQlTdHJpbmcgb2xkRGF0YVZhbHVlID0gdGhpcy5kYXRhVmFsdWU7CisJCXRoaXMuZGF0YVZhbHVlID0gbmV3RGF0YVZhbHVlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVkFMVUVfUFJPUEVSVFksIG9sZERhdGFWYWx1ZSwgbmV3RGF0YVZhbHVlKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRPYmplY3RWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMub2JqZWN0VmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIG5ld09iamVjdFZhbHVlKSB7CisJCVN0cmluZyBvbGRPYmplY3RWYWx1ZSA9IHRoaXMub2JqZWN0VmFsdWU7CisJCXRoaXMub2JqZWN0VmFsdWUgPSBuZXdPYmplY3RWYWx1ZTsKKwkJdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5zZXRPYmplY3RWYWx1ZShuZXdPYmplY3RWYWx1ZSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1ZBTFVFX1BST1BFUlRZLCBvbGRPYmplY3RWYWx1ZSwgbmV3T2JqZWN0VmFsdWUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RWYWx1ZV8oU3RyaW5nIG5ld09iamVjdFZhbHVlKSB7CisJCVN0cmluZyBvbGRPYmplY3RWYWx1ZSA9IHRoaXMub2JqZWN0VmFsdWU7CisJCXRoaXMub2JqZWN0VmFsdWUgPSBuZXdPYmplY3RWYWx1ZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVkFMVUVfUFJPUEVSVFksIG9sZE9iamVjdFZhbHVlLCBuZXdPYmplY3RWYWx1ZSk7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUpIHsKKwkJdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlOworCQl0aGlzLmRhdGFWYWx1ZSA9IHRoaXMuZGF0YVZhbHVlKCk7CisJCXRoaXMub2JqZWN0VmFsdWUgPSB0aGlzLm9iamVjdFZhbHVlKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUpIHsKKwkJdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlOworCQl0aGlzLnNldERhdGFWYWx1ZV8odGhpcy5kYXRhVmFsdWUoKSk7CisJCXRoaXMuc2V0T2JqZWN0VmFsdWVfKHRoaXMub2JqZWN0VmFsdWUoKSk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBkYXRhVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgb2JqZWN0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXREYXRhVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T2JqZWN0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXZhbGlkYXRlRGF0YVZhbHVlc1VuaXF1ZShtZXNzYWdlcywgYXN0Um9vdCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRGF0YVZhbHVlc1VuaXF1ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJTGlzdDxTdHJpbmc+IGRhdGFWYWx1ZXMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChnZXRQYXJlbnQoKS5kYXRhVmFsdWVzKCkpOworCQlkYXRhVmFsdWVzLnJlbW92ZSh0aGlzLmRhdGFWYWx1ZSk7CisJCWlmIChkYXRhVmFsdWVzLmNvbnRhaW5zKHRoaXMuZGF0YVZhbHVlKSkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1VTFRJUExFX09CSkVDVF9WQUxVRVNfRk9SX0RBVEFfVkFMVUUsCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5kYXRhVmFsdWV9LCAKKwkJCQkJdGhpcywKKwkJCQkJdGhpcy5nZXREYXRhVmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkpCisJCQkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWQyZjYzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0LmphdmEKQEAgLTAsMCArMSwyNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0IGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUgaW1wbGVtZW50cyBFY2xpcHNlTGlua0NvbnZlcnQsIEphdmFDb252ZXJ0ZXIKK3sKKwlwcml2YXRlIFN0cmluZyBzcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOworCQorCXByaXZhdGUgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CisJCisJcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyOworCQorCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0KEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuaW5pdGlhbGl6ZShqcnBhKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKEphdmFBdHRyaWJ1dGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUjsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQkKKwlwdWJsaWMgdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwoKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmFkZEFubm90YXRpb24oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOworCQlpZiAoZ2V0Q29udmVydGVyKCkgIT0gbnVsbCkgeworCQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihnZXRDb252ZXJ0ZXIoKS5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKKwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gZ2V0UmVzb3VyY2VDb252ZXJ0KCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKworCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGdldFJlc291cmNlQ29udmVydCgpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlck5hbWUoKSB7CisJCXJldHVybiBnZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkgPT0gbnVsbCA/IGdldERlZmF1bHRDb252ZXJ0ZXJOYW1lKCkgOiBnZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29udmVydGVyTmFtZSgpIHsKKwkJcmV0dXJuIERFRkFVTFRfQ09OVkVSVEVSX05BTUU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZENvbnZlcnRlck5hbWUpIHsKKwkJU3RyaW5nIG9sZFNwZWNpZmllZENvbnZlcnRlck5hbWUgPSB0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWU7CisJCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyTmFtZSA9IG5ld1NwZWNpZmllZENvbnZlcnRlck5hbWU7CisJCWdldFJlc291cmNlQ29udmVydCgpLnNldFZhbHVlKG5ld1NwZWNpZmllZENvbnZlcnRlck5hbWUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT05WRVJURVJfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ29udmVydGVyTmFtZSwgbmV3U3BlY2lmaWVkQ29udmVydGVyTmFtZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENvbnZlcnRlck5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKSB7CisJCVN0cmluZyBvbGRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lID0gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOworCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWUgPSBuZXdTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT05WRVJURVJfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ29udmVydGVyTmFtZSwgbmV3U3BlY2lmaWVkQ29udmVydGVyTmFtZSk7CisJfQorCisJcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB7CisJCXJldHVybiB0aGlzLmNvbnZlcnRlcjsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRDb252ZXJ0ZXJUeXBlKCkgeworCQlpZiAodGhpcy5jb252ZXJ0ZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLk5PX0NPTlZFUlRFUjsKKwkJfQorCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihTdHJpbmcgY29udmVydGVyVHlwZSkgeworCQlpZiAoZ2V0Q29udmVydGVyVHlwZSgpID09IGNvbnZlcnRlclR5cGUpIHsKKwkJCXJldHVybjsKKwkJfQorCQlKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIgb2xkQ29udmVydGVyID0gdGhpcy5jb252ZXJ0ZXI7CisJCUphdmFFY2xpcHNlTGlua0NvbnZlcnRlciBuZXdDb252ZXJ0ZXIgPSBidWlsZENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlKTsKKwkJdGhpcy5jb252ZXJ0ZXIgPSBudWxsOworCQlpZiAob2xkQ29udmVydGVyICE9IG51bGwpIHsKKwkJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24ob2xkQ29udmVydGVyLmdldEFubm90YXRpb25OYW1lKCkpOworCQl9CisJCXRoaXMuY29udmVydGVyID0gbmV3Q29udmVydGVyOworCQlpZiAobmV3Q29udmVydGVyICE9IG51bGwpIHsKKwkJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmFkZEFubm90YXRpb24obmV3Q29udmVydGVyLmdldEFubm90YXRpb25OYW1lKCkpOworCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXIsIG5ld0NvbnZlcnRlcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlcihKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIgbmV3Q29udmVydGVyKSB7CisJCUphdmFFY2xpcHNlTGlua0NvbnZlcnRlciBvbGRDb252ZXJ0ZXIgPSB0aGlzLmNvbnZlcnRlcjsKKwkJdGhpcy5jb252ZXJ0ZXIgPSBuZXdDb252ZXJ0ZXI7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXIsIG5ld0NvbnZlcnRlcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0ganJwYTsKKwkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lID0gdGhpcy5nZXRSZXNvdXJjZUNvbnZlcnRlck5hbWUoKTsKKwkJdGhpcy5jb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyKHRoaXMuZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0ganJwYTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lXyh0aGlzLmdldFJlc291cmNlQ29udmVydGVyTmFtZSgpKTsKKwkJaWYgKGdldFJlc291cmNlQ29udmVydGVyVHlwZSgpID09IGdldENvbnZlcnRlclR5cGUoKSkgeworCQkJZ2V0Q29udmVydGVyKCkudXBkYXRlKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKKwkJfQorCQllbHNlIHsKKwkJCUphdmFFY2xpcHNlTGlua0NvbnZlcnRlciBqYXZhQ29udmVydGVyID0gYnVpbGRDb252ZXJ0ZXIoZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCkpOworCQkJc2V0Q29udmVydGVyKGphdmFDb252ZXJ0ZXIpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VDb252ZXJ0ZXJOYW1lKCkgeworCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIHJlc291cmNlQ29udmVydCA9IGdldFJlc291cmNlQ29udmVydCgpOworCQlyZXR1cm4gcmVzb3VyY2VDb252ZXJ0ID09IG51bGwgPyBudWxsIDogcmVzb3VyY2VDb252ZXJ0LmdldFZhbHVlKCk7CisJfQorCisJCisJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlciBidWlsZENvbnZlcnRlcihTdHJpbmcgY29udmVydGVyVHlwZSkgeworCQlpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5OT19DT05WRVJURVIpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLkNVU1RPTV9DT05WRVJURVIpIHsKKwkJCXJldHVybiBidWlsZEN1c3RvbUNvbnZlcnRlcigpOworCQl9CisJCWVsc2UgaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpIHsKKwkJCXJldHVybiBidWlsZFR5cGVDb252ZXJ0ZXIoKTsKKwkJfQorCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikgeworCQkJcmV0dXJuIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQl9CisJCWVsc2UgaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUikgeworCQkJcmV0dXJuIGJ1aWxkU3RydWN0Q29udmVydGVyKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgYnVpbGRDdXN0b21Db252ZXJ0ZXIoKSB7CisJCUphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gbmV3IEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcih0aGlzKTsKKwkJY29udGV4dENvbnZlcnRlci5pbml0aWFsaXplKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKKwkJcmV0dXJuIGNvbnRleHRDb252ZXJ0ZXI7CisJfQorCisJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgYnVpbGRUeXBlQ29udmVydGVyKCkgeworCQlKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBuZXcgSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcih0aGlzKTsKKwkJY29udGV4dENvbnZlcnRlci5pbml0aWFsaXplKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKKwkJcmV0dXJuIGNvbnRleHRDb252ZXJ0ZXI7CisJfQorCisJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKCkgeworCQlKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBuZXcgSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcih0aGlzKTsKKwkJY29udGV4dENvbnZlcnRlci5pbml0aWFsaXplKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKKwkJcmV0dXJuIGNvbnRleHRDb252ZXJ0ZXI7CisJfQorCisJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBidWlsZFN0cnVjdENvbnZlcnRlcigpIHsKKwkJSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBuZXcgSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKHRoaXMpOworCQljb250ZXh0Q29udmVydGVyLmluaXRpYWxpemUodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQlyZXR1cm4gY29udGV4dENvbnZlcnRlcjsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlQ29udmVydGVyVHlwZSgpIHsKKwkJaWYgKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkgIT0gbnVsbCkgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLkNVU1RPTV9DT05WRVJURVI7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkgIT0gbnVsbCkgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSOworCQl9CisJCWVsc2UgaWYgKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpICE9IG51bGwpIHsKKwkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVI7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUjsKKwkJfQorCQkKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLy8qKioqKioqKioqKioqKiogY29kZSBhc3Npc3QgKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWlmICh0aGlzLmNvbnZlcnRWYWx1ZVRvdWNoZXMocG9zLCBhc3RSb290KSkgeworCQkJcmVzdWx0ID0gdGhpcy5wZXJzaXN0ZW5jZUNvbnZlcnRlcnNOYW1lcyhmaWx0ZXIpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gY29udmVydFZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlpZiAoZ2V0UmVzb3VyY2VDb252ZXJ0KCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VDb252ZXJ0KCkudmFsdWVUb3VjaGVzKHBvcywgYXN0Um9vdCk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHBlcnNpc3RlbmNlQ29udmVydGVyc05hbWVzKCkgeworCQlpZih0aGlzLmdldEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KCkuY29udmVydGVyc1NpemUoKSA9PSAwKSB7CisJCQlyZXR1cm4gRW1wdHlJdGVyYXRvci48U3RyaW5nPiBpbnN0YW5jZSgpOworCQl9CisJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IodGhpcy5nZXRFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCgpLnVuaXF1ZUNvbnZlcnRlck5hbWVzKCkpOworCX0KKworCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjb252ZXJ0ZXJzTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHRoaXMucGVyc2lzdGVuY2VDb252ZXJ0ZXJzTmFtZXMoKSwgZmlsdGVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBwZXJzaXN0ZW5jZUNvbnZlcnRlcnNOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKKwkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmNvbnZlcnRlcnNOYW1lcyhmaWx0ZXIpKTsKKwl9CisKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgZ2V0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQoKSB7CisJCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJfQorCQorCS8vKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQlpZiAoZ2V0Q29udmVydGVyKCkgIT0gbnVsbCkgeworCQkJZ2V0Q29udmVydGVyKCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkYTBjMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydGVyCit7CisJcHJpdmF0ZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKKwkKKwlwcml2YXRlIFN0cmluZyBuYW1lOworCQorCQorCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIuZ2V0QW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOworCQorCUBPdmVycmlkZQorCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7CisJCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOworCX0KKwkKKwlwdWJsaWMgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgeworCQlyZXR1cm4gJy4nOworCX0KKwkKKwkvLyAqKioqKioqKioqKioqKioqIG5hbWUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7CisJCXRoaXMubmFtZSA9IG5ld05hbWU7CisJCWdldEFubm90YXRpb24oKS5zZXROYW1lKG5ld05hbWUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldE5hbWVfKFN0cmluZyBuZXdOYW1lKSB7CisJCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuZXdOYW1lOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgPSBqcnBtOworCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUoZ2V0QW5ub3RhdGlvbigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIganJwbSkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudE1lbWJlciA9IGpycG07CisJCXRoaXMuc2V0TmFtZV8odGhpcy5uYW1lKGdldEFubm90YXRpb24oKSkpOworCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hZGRDb252ZXJ0ZXIodGhpcyk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgbmFtZShFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlcikgeworCQlyZXR1cm4gcmVzb3VyY2VDb252ZXJ0ZXIgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZUNvbnZlcnRlci5nZXROYW1lKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXMoRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCS8vIGphdmEgaXMgYXQgdGhlIGJhc2Ugb2YgdGhlIHRyZWUKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBkdXBsaWNhdGVzKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcikgeworCQlyZXR1cm4gKHRoaXMgIT0gY29udmVydGVyKQorCQkJCSYmICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLm5hbWUpCisJCQkJJiYgdGhpcy5uYW1lLmVxdWFscyhjb252ZXJ0ZXIuZ2V0TmFtZSgpKQorCQkJCSYmICEgdGhpcy5vdmVycmlkZXMoY29udmVydGVyKQorCQkJCSYmICEgY29udmVydGVyLm92ZXJyaWRlcyh0aGlzKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBnZXRBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVySW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI2YzBkNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsMzY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXJJbXBsIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUgaW1wbGVtZW50cyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIKK3sKKwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKKwkKKwlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGN1c3RvbUNvbnZlcnRlcjsKKwlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvYmplY3RUeXBlQ29udmVydGVyOworCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgc3RydWN0Q29udmVydGVyOworCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIHR5cGVDb252ZXJ0ZXI7CisJCisJcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlckltcGwoSmF2YVR5cGVNYXBwaW5nIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwkvLyoqKioqKioqKioqKioqIGNvbnZlcnRlciAqKioqKioqKioqKioqCisJcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGdldEN1c3RvbUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIHRoaXMuY3VzdG9tQ29udmVydGVyOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgYWRkQ3VzdG9tQ29udmVydGVyKCkgeworCQlpZiAodGhpcy5jdXN0b21Db252ZXJ0ZXIgIT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY3VzdG9tIGNvbnZlcnRlciBhbHJlYWR5IGV4aXN0cyIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJdGhpcy5jdXN0b21Db252ZXJ0ZXIgPSBidWlsZEN1c3RvbUNvbnZlcnRlcigpOworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbih0aGlzLmN1c3RvbUNvbnZlcnRlci5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChDVVNUT01fQ09OVkVSVEVSX1BST1BFUlRZLCBudWxsLCB0aGlzLmN1c3RvbUNvbnZlcnRlcik7CisJCXJldHVybiB0aGlzLmN1c3RvbUNvbnZlcnRlcjsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkQ3VzdG9tQ29udmVydGVyXygpIHsKKwkJdGhpcy5jdXN0b21Db252ZXJ0ZXIgPSBidWlsZEN1c3RvbUNvbnZlcnRlcigpOwkKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChDVVNUT01fQ09OVkVSVEVSX1BST1BFUlRZLCBudWxsLCB0aGlzLmN1c3RvbUNvbnZlcnRlcik7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUN1c3RvbUNvbnZlcnRlcigpIHsKKwkJaWYgKHRoaXMuY3VzdG9tQ29udmVydGVyID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvbnZlcnRlciBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQJCQkKKwkJfQorCQlKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb2xkQ29udmVydGVyID0gdGhpcy5jdXN0b21Db252ZXJ0ZXI7CisJCXRoaXMuY3VzdG9tQ29udmVydGVyID0gbnVsbDsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24ob2xkQ29udmVydGVyLmdldEFubm90YXRpb25OYW1lKCkpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENVU1RPTV9DT05WRVJURVJfUFJPUEVSVFksIG9sZENvbnZlcnRlciwgbnVsbCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUN1c3RvbUNvbnZlcnRlcl8oKSB7CisJCXRoaXMuY3VzdG9tQ29udmVydGVyID0gbnVsbDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChDVVNUT01fQ09OVkVSVEVSX1BST1BFUlRZLCB0aGlzLmN1c3RvbUNvbnZlcnRlciwgbnVsbCk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udmVydGVyQW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGdldFJlc291cmNlQ29udmVydGVyKCkgeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oZ2V0Q29udmVydGVyQW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCQorCQorCS8vKioqKioqKioqKioqKiogb2JqZWN0IHR5cGUgY29udmVydGVyICoqKioqKioqKioqKioKKwlwdWJsaWMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSB7CisJCXJldHVybiB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXI7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigpIHsKKwkJaWYgKHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvYmplY3QgdHlwZSBjb252ZXJ0ZXIgYWxyZWFkeSBleGlzdHMiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlciA9IGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbih0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfQ09OVkVSVEVSX1BST1BFUlRZLCBudWxsLCB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIpOworCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlQ29udmVydGVyOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRPYmplY3RUeXBlQ29udmVydGVyXygpIHsKKwkJdGhpcy5vYmplY3RUeXBlQ29udmVydGVyID0gYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKCk7CQkJCisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfQ09OVkVSVEVSX1BST1BFUlRZLCBudWxsLCB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKCkgeworCQlpZiAodGhpcy5vYmplY3RUeXBlQ29udmVydGVyID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm9iamVjdCB0eXBlIGNvbnZlcnRlciBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQJCQkKKwkJfQorCQlKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9sZENvbnZlcnRlciA9IHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcjsKKwkJdGhpcy5vYmplY3RUeXBlQ29udmVydGVyID0gbnVsbDsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24ob2xkQ29udmVydGVyLmdldEFubm90YXRpb25OYW1lKCkpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9QUk9QRVJUWSwgb2xkQ29udmVydGVyLCBudWxsKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVPYmplY3RUeXBlQ29udmVydGVyXygpIHsKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9sZENvbnZlcnRlciA9IHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcjsKKwkJdGhpcy5vYmplY3RUeXBlQ29udmVydGVyID0gbnVsbDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVFlQRV9DT05WRVJURVJfUFJPUEVSVFksIG9sZENvbnZlcnRlciwgbnVsbCk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0T2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGdldFJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSB0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0QW5ub3RhdGlvbihnZXRPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCQorCQorCS8vKioqKioqKioqKioqKiogdHlwZSBjb252ZXJ0ZXIgKioqKioqKioqKioqKgorCXB1YmxpYyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIHRoaXMudHlwZUNvbnZlcnRlcjsKKwl9CisJCisJcHVibGljIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBhZGRUeXBlQ29udmVydGVyKCkgeworCQlpZiAodGhpcy50eXBlQ29udmVydGVyICE9IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInR5cGUgY29udmVydGVyIGFscmVhZHkgZXhpc3RzIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQl0aGlzLnR5cGVDb252ZXJ0ZXIgPSBidWlsZFR5cGVDb252ZXJ0ZXIoKTsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24odGhpcy50eXBlQ29udmVydGVyLmdldEFubm90YXRpb25OYW1lKCkpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfQ09OVkVSVEVSX1BST1BFUlRZLCBudWxsLCB0aGlzLnR5cGVDb252ZXJ0ZXIpOworCQlyZXR1cm4gdGhpcy50eXBlQ29udmVydGVyOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlQ29udmVydGVyXygpIHsKKwkJdGhpcy50eXBlQ29udmVydGVyID0gYnVpbGRUeXBlQ29udmVydGVyKCk7CQkKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX0NPTlZFUlRFUl9QUk9QRVJUWSwgbnVsbCwgdGhpcy50eXBlQ29udmVydGVyKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlVHlwZUNvbnZlcnRlcigpIHsKKwkJaWYgKHRoaXMudHlwZUNvbnZlcnRlciA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0eXBlIGNvbnZlcnRlciBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQJCQkKKwkJfQorCQlKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9sZENvbnZlcnRlciA9IHRoaXMudHlwZUNvbnZlcnRlcjsKKwkJdGhpcy50eXBlQ29udmVydGVyID0gbnVsbDsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24ob2xkQ29udmVydGVyLmdldEFubm90YXRpb25OYW1lKCkpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfQ09OVkVSVEVSX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXIsIG51bGwpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVUeXBlQ29udmVydGVyXygpIHsKKwkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9sZENvbnZlcnRlciA9IHRoaXMudHlwZUNvbnZlcnRlcjsKKwkJdGhpcy50eXBlQ29udmVydGVyID0gbnVsbDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX0NPTlZFUlRFUl9QUk9QRVJUWSwgb2xkQ29udmVydGVyLCBudWxsKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlQ29udmVydGVyQW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gZ2V0UmVzb3VyY2VUeXBlQ29udmVydGVyKCkgeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRBbm5vdGF0aW9uKGdldFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJCisJLy8qKioqKioqKioqKioqKiBzdHJ1Y3QgY29udmVydGVyICoqKioqKioqKioqKioKKwlwdWJsaWMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgZ2V0U3RydWN0Q29udmVydGVyKCkgeworCQlyZXR1cm4gdGhpcy5zdHJ1Y3RDb252ZXJ0ZXI7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBhZGRTdHJ1Y3RDb252ZXJ0ZXIoKSB7CisJCWlmICh0aGlzLnN0cnVjdENvbnZlcnRlciAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzdHJ1Y3QgY29udmVydGVyIGFscmVhZHkgZXhpc3RzIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQl0aGlzLnN0cnVjdENvbnZlcnRlciA9IGJ1aWxkU3RydWN0Q29udmVydGVyKCk7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hZGRBbm5vdGF0aW9uKHRoaXMuc3RydWN0Q29udmVydGVyLmdldEFubm90YXRpb25OYW1lKCkpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNUUlVDVF9DT05WRVJURVJfUFJPUEVSVFksIG51bGwsIHRoaXMuc3RydWN0Q29udmVydGVyKTsKKwkJcmV0dXJuIHRoaXMuc3RydWN0Q29udmVydGVyOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTdHJ1Y3RDb252ZXJ0ZXJfKCkgeworCQl0aGlzLnN0cnVjdENvbnZlcnRlciA9IGJ1aWxkU3RydWN0Q29udmVydGVyKCk7CQkKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTVFJVQ1RfQ09OVkVSVEVSX1BST1BFUlRZLCBudWxsLCB0aGlzLnN0cnVjdENvbnZlcnRlcik7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZVN0cnVjdENvbnZlcnRlcigpIHsKKwkJaWYgKHRoaXMuc3RydWN0Q29udmVydGVyID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInN0cnVjdCBjb252ZXJ0ZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCQkJCisJCX0KKwkJSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9sZENvbnZlcnRlciA9IHRoaXMuc3RydWN0Q29udmVydGVyOworCQl0aGlzLnN0cnVjdENvbnZlcnRlciA9IG51bGw7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKG9sZENvbnZlcnRlci5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTVFJVQ1RfQ09OVkVSVEVSX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXIsIG51bGwpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTdHJ1Y3RDb252ZXJ0ZXJfKCkgeworCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvbGRDb252ZXJ0ZXIgPSB0aGlzLnN0cnVjdENvbnZlcnRlcjsKKwkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXIgPSBudWxsOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNUUlVDVF9DT05WRVJURVJfUFJPUEVSVFksIG9sZENvbnZlcnRlciwgbnVsbCk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RydWN0Q29udmVydGVyQW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGdldFJlc291cmNlU3RydWN0Q29udmVydGVyKCkgeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oZ2V0U3RydWN0Q29udmVydGVyQW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpycHQ7CisJCXRoaXMudXBkYXRlQ3VzdG9tQ29udmVydGVyKCk7CisJCXRoaXMudXBkYXRlT2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQl0aGlzLnVwZGF0ZVR5cGVDb252ZXJ0ZXIoKTsKKwkJdGhpcy51cGRhdGVTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ3VzdG9tQ29udmVydGVyKCkgeworCQlpZiAoZ2V0UmVzb3VyY2VDb252ZXJ0ZXIoKSAhPSBudWxsKSB7CisJCQlpZiAodGhpcy5jdXN0b21Db252ZXJ0ZXIgIT0gbnVsbCkgeworCQkJCXRoaXMuY3VzdG9tQ29udmVydGVyLnVwZGF0ZSh0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUpOworCQkJfQorCQkJZWxzZSB7CisJCQkJYWRkQ3VzdG9tQ29udmVydGVyXygpOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJaWYgKHRoaXMuY3VzdG9tQ29udmVydGVyICE9IG51bGwpIHsKKwkJCQlyZW1vdmVDdXN0b21Db252ZXJ0ZXJfKCk7CisJCQl9CisJCX0JCisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9iamVjdFR5cGVDb252ZXJ0ZXIoKSB7CisJCWlmIChnZXRSZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIoKSAhPSBudWxsKSB7CisJCQlpZiAodGhpcy5vYmplY3RUeXBlQ29udmVydGVyICE9IG51bGwpIHsKKwkJCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIudXBkYXRlKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlhZGRPYmplY3RUeXBlQ29udmVydGVyXygpOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJaWYgKHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKSB7CisJCQkJcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcl8oKTsKKwkJCX0KKwkJfQkKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlVHlwZUNvbnZlcnRlcigpIHsKKwkJaWYgKGdldFJlc291cmNlVHlwZUNvbnZlcnRlcigpICE9IG51bGwpIHsKKwkJCWlmICh0aGlzLnR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkgeworCQkJCXRoaXMudHlwZUNvbnZlcnRlci51cGRhdGUodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWFkZFR5cGVDb252ZXJ0ZXJfKCk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlpZiAodGhpcy50eXBlQ29udmVydGVyICE9IG51bGwpIHsKKwkJCQlyZW1vdmVUeXBlQ29udmVydGVyKCk7CisJCQl9CisJCX0JCisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0cnVjdENvbnZlcnRlcigpIHsKKwkJaWYgKGdldFJlc291cmNlU3RydWN0Q29udmVydGVyKCkgIT0gbnVsbCkgeworCQkJaWYgKHRoaXMuc3RydWN0Q29udmVydGVyICE9IG51bGwpIHsKKwkJCQl0aGlzLnN0cnVjdENvbnZlcnRlci51cGRhdGUodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWFkZFN0cnVjdENvbnZlcnRlcl8oKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWlmICh0aGlzLnN0cnVjdENvbnZlcnRlciAhPSBudWxsKSB7CisJCQkJcmVtb3ZlU3RydWN0Q29udmVydGVyXygpOworCQkJfQorCQl9CQorCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0ganJwdDsKKwkJdGhpcy5pbml0aWFsaXplQ3VzdG9tQ29udmVydGVyKCk7CisJCXRoaXMuaW5pdGlhbGl6ZU9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJdGhpcy5pbml0aWFsaXplVHlwZUNvbnZlcnRlcigpOworCQl0aGlzLmluaXRpYWxpemVTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUN1c3RvbUNvbnZlcnRlcigpIHsKKwkJaWYgKGdldFJlc291cmNlQ29udmVydGVyKCkgIT0gbnVsbCkgeworCQkJdGhpcy5jdXN0b21Db252ZXJ0ZXIgPSBidWlsZEN1c3RvbUNvbnZlcnRlcigpOworCQl9CQkKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9iamVjdFR5cGVDb252ZXJ0ZXIoKSB7CisJCWlmIChnZXRSZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIoKSAhPSBudWxsKSB7CisJCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIgPSBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJfQkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUeXBlQ29udmVydGVyKCkgeworCQlpZiAoZ2V0UmVzb3VyY2VUeXBlQ29udmVydGVyKCkgIT0gbnVsbCkgeworCQkJdGhpcy50eXBlQ29udmVydGVyID0gYnVpbGRUeXBlQ29udmVydGVyKCk7CisJCX0JCQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3RydWN0Q29udmVydGVyKCkgeworCQlpZiAoZ2V0UmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIoKSAhPSBudWxsKSB7CisJCQl0aGlzLnN0cnVjdENvbnZlcnRlciA9IGJ1aWxkU3RydWN0Q29udmVydGVyKCk7CisJCX0JCQorCX0KKwlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGJ1aWxkQ3VzdG9tQ29udmVydGVyKCkgeworCQlKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG5ldyBKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIodGhpcyk7CisJCWNvbnRleHRDb252ZXJ0ZXIuaW5pdGlhbGl6ZSh0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUpOworCQlyZXR1cm4gY29udGV4dENvbnZlcnRlcjsKKwl9CisKKwlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBidWlsZFR5cGVDb252ZXJ0ZXIoKSB7CisJCUphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG5ldyBKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKHRoaXMpOworCQljb250ZXh0Q29udmVydGVyLmluaXRpYWxpemUodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlKTsKKwkJcmV0dXJuIGNvbnRleHRDb252ZXJ0ZXI7CisJfQorCisJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKCkgeworCQlKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBuZXcgSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcih0aGlzKTsKKwkJY29udGV4dENvbnZlcnRlci5pbml0aWFsaXplKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7CisJCXJldHVybiBjb250ZXh0Q29udmVydGVyOworCX0KKworCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgYnVpbGRTdHJ1Y3RDb252ZXJ0ZXIoKSB7CisJCUphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gbmV3IEphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcih0aGlzKTsKKwkJY29udGV4dENvbnZlcnRlci5pbml0aWFsaXplKHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSk7CisJCXJldHVybiBjb250ZXh0Q29udmVydGVyOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldFRleHRSYW5nZShhc3RSb290KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJaWYgKHRoaXMuY3VzdG9tQ29udmVydGVyICE9IG51bGwpIHsKKwkJCXRoaXMuY3VzdG9tQ29udmVydGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCX0KKwkJaWYgKHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKSB7CisJCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJfQorCQlpZiAodGhpcy50eXBlQ29udmVydGVyICE9IG51bGwpIHsKKwkJCXRoaXMudHlwZUNvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl9CisJCWlmICh0aGlzLnN0cnVjdENvbnZlcnRlciAhPSBudWxsKSB7CisJCQl0aGlzLnN0cnVjdENvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl9CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5MDgwNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgZXh0ZW5kcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIgCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcgoreworCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRlckNsYXNzOworCQorCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgc3VwZXIuZ2V0QW5ub3RhdGlvbigpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGNvbnZlcnRlciBjbGFzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJDbGFzcygpIHsKKwkJcmV0dXJuIHRoaXMuY29udmVydGVyQ2xhc3M7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29udmVydGVyQ2xhc3MoU3RyaW5nIG5ld0NvbnZlcnRlckNsYXNzKSB7CisJCVN0cmluZyBvbGRDb252ZXJ0ZXJDbGFzcyA9IHRoaXMuY29udmVydGVyQ2xhc3M7CisJCXRoaXMuY29udmVydGVyQ2xhc3MgPSBuZXdDb252ZXJ0ZXJDbGFzczsKKwkJZ2V0QW5ub3RhdGlvbigpLnNldENvbnZlcnRlckNsYXNzKG5ld0NvbnZlcnRlckNsYXNzKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfQ0xBU1NfUFJPUEVSVFksIG9sZENvbnZlcnRlckNsYXNzLCBuZXdDb252ZXJ0ZXJDbGFzcyk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlckNsYXNzXyhTdHJpbmcgbmV3Q29udmVydGVyQ2xhc3MpIHsKKwkJU3RyaW5nIG9sZENvbnZlcnRlckNsYXNzID0gdGhpcy5jb252ZXJ0ZXJDbGFzczsKKwkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IG5ld0NvbnZlcnRlckNsYXNzOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkQ29udmVydGVyQ2xhc3MsIG5ld0NvbnZlcnRlckNsYXNzKTsKKwl9CisKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZShqcnBtKTsKKwkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IHRoaXMuY29udmVydGVyQ2xhc3MoZ2V0QW5ub3RhdGlvbigpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIganJwbSkgeworCQlzdXBlci51cGRhdGUoanJwbSk7CisJCXRoaXMuc2V0Q29udmVydGVyQ2xhc3NfKHRoaXMuY29udmVydGVyQ2xhc3MoZ2V0QW5ub3RhdGlvbigpKSk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgY29udmVydGVyQ2xhc3MoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIHJlc291cmNlQ29udmVydGVyKSB7CisJCXJldHVybiByZXNvdXJjZUNvbnZlcnRlciA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpLmdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKwkKKwkKKwkvLyoqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXZhbGlkYXRlQ29udmVydGVyQ2xhc3MobWVzc2FnZXMsIGFzdFJvb3QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnZlcnRlckNsYXNzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlpZiAodGhpcy5jb252ZXJ0ZXJDbGFzcyA9PSBudWxsKSB7CisJCQkvL0Fubm90YXRpb24gaXRzZWxmIHdpbGwgaGF2ZSBjb21waWxlIGVycm9yIGlmIGNvbnZlcnRlciBjbGFzcyBub3QgZGVmaW5lZAorCQkJcmV0dXJuOworCQl9CisJCWlmICghIGdldEFubm90YXRpb24oKS5jb252ZXJ0ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoRUNMSVBTRUxJTktfQ09OVkVSVEVSX0NMQVNTX05BTUUsIGFzdFJvb3QpKSB7CisJCQltZXNzYWdlcy5hZGQoCisJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKKwkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKKwkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09OVkVSVEVSX0NMQVNTX0lNUExFTUVOVFNfQ09OVkVSVEVSLAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuY29udmVydGVyQ2xhc3N9LAorCQkJCQl0aGlzLCAKKwkJCQkJZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoYXN0Um9vdCkKKwkJCQkpCisJCQkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmYxOWI1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUgaW1wbGVtZW50cyBFY2xpcHNlTGlua0N1c3RvbWl6ZXIKK3sJCisJcHJpdmF0ZSBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworCQorCXByaXZhdGUgU3RyaW5nIGN1c3RvbWl6ZXJDbGFzczsKKwkKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCXB1YmxpYyBjaGFyIGdldEN1c3RvbWl6ZXJDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7CisJCXJldHVybiAnLic7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0pwYUZhY3RvcnkgZ2V0SnBhRmFjdG9yeSgpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua0pwYUZhY3RvcnkpIHN1cGVyLmdldEpwYUZhY3RvcnkoKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZUN1c3RvbWl6ZXIoKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5hZGRBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZUN1c3RvbWl6ZXIoKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5yZW1vdmVBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gZ2V0UmVzb3VyY2VDdXN0b21pemVyKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKworCXByb3RlY3RlZCBFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGdldFJlc291cmNlQ3VzdG9taXplcigpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0QW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRDdXN0b21pemVyQ2xhc3MoKSB7CisJCXJldHVybiBnZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSB7CisJCXJldHVybiB0aGlzLmN1c3RvbWl6ZXJDbGFzczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoU3RyaW5nIG5ld0N1c3RvbWl6ZXJDbGFzcykgeworCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuY3VzdG9taXplckNsYXNzLCBuZXdDdXN0b21pemVyQ2xhc3MpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZEN1c3RvbWl6ZXJDbGFzcyA9IHRoaXMuY3VzdG9taXplckNsYXNzOworCQl0aGlzLmN1c3RvbWl6ZXJDbGFzcyA9IG5ld0N1c3RvbWl6ZXJDbGFzczsKKwkJaWYgKHRoaXMuY3VzdG9taXplckNsYXNzICE9IG51bGwpIHsKKwkJCWFkZFJlc291cmNlQ3VzdG9taXplcigpOworCQl9CisJCWVsc2UgeworCQkJcmVtb3ZlUmVzb3VyY2VDdXN0b21pemVyKCk7CisJCX0KKwkJaWYgKG5ld0N1c3RvbWl6ZXJDbGFzcyAhPSBudWxsKSB7CisJCQlnZXRSZXNvdXJjZUN1c3RvbWl6ZXIoKS5zZXRWYWx1ZShuZXdDdXN0b21pemVyQ2xhc3MpOworCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFksIG9sZEN1c3RvbWl6ZXJDbGFzcywgbmV3Q3VzdG9taXplckNsYXNzKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0Q3VzdG9taXplckNsYXNzXyhTdHJpbmcgbmV3Q3VzdG9taXplckNsYXNzKSB7CisJCVN0cmluZyBvbGRDdXN0b21pemVyQ2xhc3MgPSB0aGlzLmN1c3RvbWl6ZXJDbGFzczsKKwkJdGhpcy5jdXN0b21pemVyQ2xhc3MgPSBuZXdDdXN0b21pemVyQ2xhc3M7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFksIG9sZEN1c3RvbWl6ZXJDbGFzcywgbmV3Q3VzdG9taXplckNsYXNzKTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpycHQ7CisJCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gcmVzb3VyY2VDdXN0b21pemVyID0gZ2V0UmVzb3VyY2VDdXN0b21pemVyKCk7CisJCXRoaXMuY3VzdG9taXplckNsYXNzID0gdGhpcy5jdXN0b21pemVyQ2xhc3MocmVzb3VyY2VDdXN0b21pemVyKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0ganJwdDsKKwkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiByZXNvdXJjZUN1c3RvbWl6ZXIgPSBnZXRSZXNvdXJjZUN1c3RvbWl6ZXIoKTsKKwkJdGhpcy5zZXRDdXN0b21pemVyQ2xhc3NfKHRoaXMuY3VzdG9taXplckNsYXNzKHJlc291cmNlQ3VzdG9taXplcikpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbWl6ZXJDbGFzcyhFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIHJlc291cmNlQ3VzdG9taXplcikgeworCQlyZXR1cm4gcmVzb3VyY2VDdXN0b21pemVyID09IG51bGwgPyBudWxsIDogcmVzb3VyY2VDdXN0b21pemVyLmdldFZhbHVlKCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRDdXN0b21pemVyQ2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIGdldFJlc291cmNlQ3VzdG9taXplcigpLmdldFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOworCX0KKwkKKwkvLyoqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXZhbGlkYXRlQ29udmVydGVyQ2xhc3MobWVzc2FnZXMsIGFzdFJvb3QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnZlcnRlckNsYXNzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIHJlc291cmNlQ3VzdG9taXplciA9IGdldFJlc291cmNlQ3VzdG9taXplcigpOworCQlpZiAocmVzb3VyY2VDdXN0b21pemVyICE9IG51bGwgJiYgIXJlc291cmNlQ3VzdG9taXplci5jdXN0b21pemVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OQU1FLCBhc3RSb290KSkgeworCQkJbWVzc2FnZXMuYWRkKAorCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCisJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNVU1RPTUlaRVJfQ0xBU1NfSU1QTEVNRU5UU19ERVNDUklQVE9SX0NVU1RPTUlaRVIsCisJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5jdXN0b21pemVyQ2xhc3N9LAorCQkJCQl0aGlzLCAKKwkJCQkJZ2V0Q3VzdG9taXplckNsYXNzVGV4dFJhbmdlKGFzdFJvb3QpCisJCQkJKQorCQkJKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjRjZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVJbXBsIGV4dGVuZHMgQWJzdHJhY3RKYXZhRW1iZWRkYWJsZSBpbXBsZW1lbnRzIEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUKK3sKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIGNvbnZlcnRlckhvbGRlcjsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjaGFuZ2VUcmFja2luZzsKKwkKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmNvbnZlcnRlckhvbGRlciA9IG5ldyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXJJbXBsKHRoaXMpOworCQl0aGlzLmN1c3RvbWl6ZXIgPSBuZXcgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplcih0aGlzKTsKKwkJdGhpcy5jaGFuZ2VUcmFja2luZyA9IG5ldyBKYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyh0aGlzKTsKKwl9CisJCisJcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBnZXRDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiB0aGlzLmNvbnZlcnRlckhvbGRlcjsKKwl9CisJCisJcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgeworCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpIHsKKwkJcmV0dXJuIHRoaXMuY2hhbmdlVHJhY2tpbmc7CisJfQkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZShqcnB0KTsKKwkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIuaW5pdGlhbGl6ZShqcnB0KTsKKwkJdGhpcy5jdXN0b21pemVyLmluaXRpYWxpemUoanJwdCk7CisJCXRoaXMuY2hhbmdlVHJhY2tpbmcuaW5pdGlhbGl6ZShqcnB0KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJc3VwZXIudXBkYXRlKGpycHQpOworCQl0aGlzLmNvbnZlcnRlckhvbGRlci51cGRhdGUoanJwdCk7CisJCXRoaXMuY3VzdG9taXplci51cGRhdGUoanJwdCk7CisJCXRoaXMuY2hhbmdlVHJhY2tpbmcudXBkYXRlKGpycHQpOworCX0KKwkKKwkKKwkvLyoqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXRoaXMuY29udmVydGVySG9sZGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXRoaXMuY3VzdG9taXplci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLmNoYW5nZVRyYWNraW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHlJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWIzMzZhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHlJbXBsLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0VudGl0eUltcGwgZXh0ZW5kcyBBYnN0cmFjdEphdmFFbnRpdHkgaW1wbGVtZW50cyBKYXZhRWNsaXBzZUxpbmtFbnRpdHkKK3sKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBlY2xpcHNlTGlua0NhY2hpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBjb252ZXJ0ZXJIb2xkZXI7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5OworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXI7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNoYW5nZVRyYWNraW5nOworCisJcHVibGljIEphdmFFY2xpcHNlTGlua0VudGl0eUltcGwoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmVjbGlwc2VMaW5rQ2FjaGluZyA9IG5ldyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nSW1wbCh0aGlzKTsKKwkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIgPSBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVySW1wbCh0aGlzKTsKKwkJdGhpcy5yZWFkT25seSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtSZWFkT25seSh0aGlzKTsKKwkJdGhpcy5jaGFuZ2VUcmFja2luZyA9IG5ldyBKYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyh0aGlzKTsKKwkJdGhpcy5jdXN0b21pemVyID0gbmV3IEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIodGhpcyk7CisJfQorCQorCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKSB7CisJCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rQ2FjaGluZzsKKwl9CisJCisJcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBnZXRDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiB0aGlzLmNvbnZlcnRlckhvbGRlcjsKKwl9CisJCisJcHVibGljIEVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0UmVhZE9ubHkoKSB7CisJCXJldHVybiB0aGlzLnJlYWRPbmx5OworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtDdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKSB7CisJCXJldHVybiB0aGlzLmN1c3RvbWl6ZXI7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCkgeworCQlyZXR1cm4gdGhpcy5jaGFuZ2VUcmFja2luZzsKKwl9CisKKwlwdWJsaWMgSmF2YUNhY2hlYWJsZTJfMCBnZXRDYWNoZWFibGUoKSB7CisJCXJldHVybiAoKEphdmFDYWNoZWFibGVIb2xkZXIyXzApIGdldENhY2hpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSB7CisJCXJldHVybiAoKEphdmFDYWNoZWFibGVIb2xkZXIyXzApIGdldENhY2hpbmcoKSkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZShqcnB0KTsKKwkJdGhpcy5lY2xpcHNlTGlua0NhY2hpbmcuaW5pdGlhbGl6ZShqcnB0KTsKKwkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIuaW5pdGlhbGl6ZShqcnB0KTsKKwkJdGhpcy5yZWFkT25seS5pbml0aWFsaXplKGpycHQpOworCQl0aGlzLmN1c3RvbWl6ZXIuaW5pdGlhbGl6ZShqcnB0KTsKKwkJdGhpcy5jaGFuZ2VUcmFja2luZy5pbml0aWFsaXplKGpycHQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgeworCQlzdXBlci51cGRhdGUoanJwdCk7CisJCXRoaXMuZWNsaXBzZUxpbmtDYWNoaW5nLnVwZGF0ZShqcnB0KTsKKwkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIudXBkYXRlKGpycHQpOworCQl0aGlzLnJlYWRPbmx5LnVwZGF0ZShqcnB0KTsKKwkJdGhpcy5jdXN0b21pemVyLnVwZGF0ZShqcnB0KTsKKwkJdGhpcy5jaGFuZ2VUcmFja2luZy51cGRhdGUoanJwdCk7CisJfQorCQorCQorCS8vKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLmVjbGlwc2VMaW5rQ2FjaGluZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLmNvbnZlcnRlckhvbGRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLnJlYWRPbmx5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXRoaXMuY3VzdG9taXplci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLmNoYW5nZVRyYWNraW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM4MGUwNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5LmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSBleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheQoreworCQorCXByb3RlY3RlZCBJbnRlZ2VyIGhvdXI7CisJcHJvdGVjdGVkIEludGVnZXIgbWludXRlOworCXByb3RlY3RlZCBJbnRlZ2VyIHNlY29uZDsKKwlwcm90ZWN0ZWQgSW50ZWdlciBtaWxsaXNlY29uZDsKKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheTsKKwkKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5KEVjbGlwc2VMaW5rQ2FjaGluZyBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJcHVibGljIEludGVnZXIgZ2V0SG91cigpIHsKKwkJcmV0dXJuIHRoaXMuaG91cjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIb3VyKEludGVnZXIgbmV3SG91cikgeworCQlJbnRlZ2VyIG9sZEhvdXIgPSB0aGlzLmhvdXI7CisJCXRoaXMuaG91ciA9IG5ld0hvdXI7CisJCXRoaXMudGltZU9mRGF5LnNldEhvdXIobmV3SG91cik7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSE9VUl9QUk9QRVJUWSwgb2xkSG91ciwgbmV3SG91cik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0SG91cl8oSW50ZWdlciBuZXdIb3VyKSB7CisJCUludGVnZXIgb2xkSG91ciA9IHRoaXMuaG91cjsKKwkJdGhpcy5ob3VyID0gbmV3SG91cjsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChIT1VSX1BST1BFUlRZLCBvbGRIb3VyLCBuZXdIb3VyKTsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRNaW51dGUoKSB7CisJCXJldHVybiB0aGlzLm1pbnV0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNaW51dGUoSW50ZWdlciBuZXdNaW51dGUpIHsKKwkJSW50ZWdlciBvbGRNaW51dGUgPSB0aGlzLm1pbnV0ZTsKKwkJdGhpcy5taW51dGUgPSBuZXdNaW51dGU7CisJCXRoaXMudGltZU9mRGF5LnNldE1pbnV0ZShuZXdNaW51dGUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1JTlVURV9QUk9QRVJUWSwgb2xkTWludXRlLCBuZXdNaW51dGUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldE1pbnV0ZV8oSW50ZWdlciBuZXdNaW51dGUpIHsKKwkJSW50ZWdlciBvbGRNaW51dGUgPSB0aGlzLm1pbnV0ZTsKKwkJdGhpcy5taW51dGUgPSBuZXdNaW51dGU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUlOVVRFX1BST1BFUlRZLCBvbGRNaW51dGUsIG5ld01pbnV0ZSk7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0U2Vjb25kKCkgeworCQlyZXR1cm4gdGhpcy5zZWNvbmQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2Vjb25kKEludGVnZXIgbmV3U2Vjb25kKSB7CisJCUludGVnZXIgb2xkU2Vjb25kID0gdGhpcy5zZWNvbmQ7CisJCXRoaXMuc2Vjb25kID0gbmV3U2Vjb25kOworCQl0aGlzLnRpbWVPZkRheS5zZXRTZWNvbmQobmV3U2Vjb25kKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTRUNPTkRfUFJPUEVSVFksIG9sZFNlY29uZCwgbmV3U2Vjb25kKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U2Vjb25kXyhJbnRlZ2VyIG5ld1NlY29uZCkgeworCQlJbnRlZ2VyIG9sZFNlY29uZCA9IHRoaXMuc2Vjb25kOworCQl0aGlzLnNlY29uZCA9IG5ld1NlY29uZDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTRUNPTkRfUFJPUEVSVFksIG9sZFNlY29uZCwgbmV3U2Vjb25kKTsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXRNaWxsaXNlY29uZCgpIHsKKwkJcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBuZXdNaWxsaXNlY29uZCkgeworCQlJbnRlZ2VyIG9sZE1pbGxpc2Vjb25kID0gdGhpcy5taWxsaXNlY29uZDsKKwkJdGhpcy5taWxsaXNlY29uZCA9IG5ld01pbGxpc2Vjb25kOworCQl0aGlzLnRpbWVPZkRheS5zZXRNaWxsaXNlY29uZChuZXdNaWxsaXNlY29uZCk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUlMTElTRUNPTkRfUFJPUEVSVFksIG9sZE1pbGxpc2Vjb25kLCBuZXdNaWxsaXNlY29uZCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldE1pbGxpc2Vjb25kXyhJbnRlZ2VyIG5ld01pbGxpc2Vjb25kKSB7CisJCUludGVnZXIgb2xkTWlsbGlzZWNvbmQgPSB0aGlzLm1pbGxpc2Vjb25kOworCQl0aGlzLm1pbGxpc2Vjb25kID0gbmV3TWlsbGlzZWNvbmQ7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUlMTElTRUNPTkRfUFJPUEVSVFksIG9sZE1pbGxpc2Vjb25kLCBuZXdNaWxsaXNlY29uZCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnRpbWVPZkRheS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSkgeworCQl0aGlzLnRpbWVPZkRheSA9IHRpbWVPZkRheTsKKwkJdGhpcy5ob3VyID0gZ2V0SG91cih0aW1lT2ZEYXkpOworCQl0aGlzLm1pbnV0ZSA9IGdldE1pbnV0ZSh0aW1lT2ZEYXkpOworCQl0aGlzLnNlY29uZCA9IGdldFNlY29uZCh0aW1lT2ZEYXkpOworCQl0aGlzLm1pbGxpc2Vjb25kID0gZ2V0TWlsbGlzZWNvbmQodGltZU9mRGF5KTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkpIHsKKwkJdGhpcy50aW1lT2ZEYXkgPSB0aW1lT2ZEYXk7CisJCXRoaXMuc2V0SG91cl8oZ2V0SG91cih0aW1lT2ZEYXkpKTsKKwkJdGhpcy5zZXRNaW51dGVfKGdldE1pbnV0ZSh0aW1lT2ZEYXkpKTsKKwkJdGhpcy5zZXRTZWNvbmRfKGdldFNlY29uZCh0aW1lT2ZEYXkpKTsKKwkJdGhpcy5zZXRNaWxsaXNlY29uZF8oZ2V0TWlsbGlzZWNvbmQodGltZU9mRGF5KSk7CisJfQorCQorCXByb3RlY3RlZCBJbnRlZ2VyIGdldEhvdXIoRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSkgeworCQlyZXR1cm4gdGltZU9mRGF5LmdldEhvdXIoKTsKKwl9CisJCisJcHJvdGVjdGVkIEludGVnZXIgZ2V0TWludXRlKEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkpIHsKKwkJcmV0dXJuIHRpbWVPZkRheS5nZXRNaW51dGUoKTsKKwl9CisJCisJcHJvdGVjdGVkIEludGVnZXIgZ2V0U2Vjb25kKEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkpIHsKKwkJcmV0dXJuIHRpbWVPZkRheS5nZXRTZWNvbmQoKTsKKwl9CisJCisJcHJvdGVjdGVkIEludGVnZXIgZ2V0TWlsbGlzZWNvbmQoRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSkgeworCQlyZXR1cm4gdGltZU9mRGF5LmdldE1pbGxpc2Vjb25kKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxZWY4ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0lkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nIAorCWV4dGVuZHMgQWJzdHJhY3RKYXZhSWRNYXBwaW5nCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0lkTWFwcGluZworeworCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGU7CisJCisJcHVibGljIEphdmFFY2xpcHNlTGlua0lkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5tdXRhYmxlID0gbmV3IEphdmFFY2xpcHNlTGlua011dGFibGUodGhpcyk7CisJfQorCQorCS8vKioqKioqKioqKioqKiogSmF2YUF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ1tdIGJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKKwkJcmV0dXJuIEFycmF5VG9vbHMuYWRkQWxsKAorCQkJc3VwZXIuYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCisJCQlFY2xpcHNlTGluay5NVVRBQkxFLAorCQkJRWNsaXBzZUxpbmsuQ09OVkVSVCk7CisJfQkJCisKKwkKKwkvLyoqKioqKioqKioqKioqIEFic3RyYWN0SmF2YUlkTWFwcGluZyBvdmVycmlkZXMgKioqKioqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSmF2YUNvbnZlcnRlciBidWlsZFNwZWNpZmllZENvbnZlcnRlcihTdHJpbmcgY29udmVydGVyVHlwZSkgeworCQlKYXZhQ29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSBzdXBlci5idWlsZFNwZWNpZmllZENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlKTsKKwkJaWYgKGphdmFDb252ZXJ0ZXIgIT0gbnVsbCkgeworCQkJcmV0dXJuIGphdmFDb252ZXJ0ZXI7CisJCX0KKwkJaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpIHsKKwkJCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydCh0aGlzLCB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKSB7CisJCS8vY2hlY2sgQENvbnZlcnQgZmlyc3QsIHRoaXMgaXMgdGhlIG9yZGVyIHRoYXQgRWNsaXBzZUxpbmsgc2VhcmNoZXMKKwkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkgIT0gbnVsbCkgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSOworCQl9CisJCXJldHVybiBzdXBlci5nZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKTsKKwl9CisJCisJCisJLy8qKioqKioqKioqKiogRWNsaXBzZWxpbmtJZE1hcHBpbmcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBFY2xpcHNlTGlua011dGFibGUgZ2V0TXV0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMubXV0YWJsZTsKKwl9CisJCisJCisJLy8qKioqKioqKioqKiogaW5pdGlhbGl6YXRpb24vdXBkYXRlICoqKioqKioqKioqKioqKioKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCXN1cGVyLmluaXRpYWxpemUoKTsKKwkJdGhpcy5tdXRhYmxlLmluaXRpYWxpemUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMubXV0YWJsZS51cGRhdGUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJfQorCQorCS8vICoqKioqKioqKiogY29kZSBhc3Npc3QgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWlmIChnZXRDb252ZXJ0ZXIoKSAhPSBudWxsKSB7CisJCQlyZXN1bHQgPSBnZXRDb252ZXJ0ZXIoKS5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvLyoqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLm11dGFibGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0pvaW5GZXRjaC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWFhYzA3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2ggCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZSAKKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSm9pbkZldGNoCit7CisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBqb2luRmV0Y2hWYWx1ZTsJCisJCisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworCQorCQorCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2goSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0Sm9pbkZldGNoQW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGdldFJlc291cmNlSm9pbkZldGNoKCkgeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihnZXRKb2luRmV0Y2hBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VKb2luRmV0Y2goKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmFkZEFubm90YXRpb24oZ2V0Sm9pbkZldGNoQW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlSm9pbkZldGNoKCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKGdldEpvaW5GZXRjaEFubm90YXRpb25OYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5qb2luRmV0Y2hWYWx1ZTsKKwl9CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0pvaW5GZXRjaC5ERUZBVUxUX1ZBTFVFOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgbmV3Sm9pbkZldGNoVmFsdWUpIHsKKwkJaWYgKHRoaXMuam9pbkZldGNoVmFsdWUgPT0gbmV3Sm9pbkZldGNoVmFsdWUpIHsKKwkJCXJldHVybjsKKwkJfQorCQkJCQorCQlFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgb2xkSm9pbkZldGNoVmFsdWUgPSB0aGlzLmpvaW5GZXRjaFZhbHVlOworCQl0aGlzLmpvaW5GZXRjaFZhbHVlID0gbmV3Sm9pbkZldGNoVmFsdWU7CisJCQorCQlpZiAobmV3Sm9pbkZldGNoVmFsdWUgIT0gbnVsbCkgeworCQkJaWYgKGdldFJlc291cmNlSm9pbkZldGNoKCkgPT0gbnVsbCkgeworCQkJCWFkZFJlc291cmNlSm9pbkZldGNoKCk7CisJCQl9CisJCQlnZXRSZXNvdXJjZUpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKG5ld0pvaW5GZXRjaFZhbHVlKSk7CQkKKwkJfQorCQllbHNlIHsKKwkJCWlmIChnZXRSZXNvdXJjZUpvaW5GZXRjaCgpICE9IG51bGwpIHsKKwkJCQlyZW1vdmVSZXNvdXJjZUpvaW5GZXRjaCgpOworCQkJfQorCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRWNsaXBzZUxpbmtKb2luRmV0Y2guVkFMVUVfUFJPUEVSVFksIG9sZEpvaW5GZXRjaFZhbHVlLCBuZXdKb2luRmV0Y2hWYWx1ZSk7CisJfQorCQorCS8qKgorCSAqIGludGVybmFsIHNldHRlciB1c2VkIG9ubHkgZm9yIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLgorCSAqIFRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCBJbnZhbGlkVGhyZWFkQWNjZXNzIGV4Y2VwdGlvbnMgaW4gdGhlIFVJCisJICogd2hlbiB5b3Ugc2V0IGEgdmFsdWUgZnJvbSB0aGUgVUkgYW5kIHRoZSBhbm5vdGF0aW9uIGRvZXNuJ3QgZXhpc3QgeWV0LgorCSAqIEFkZGluZyB0aGUgYW5ub3RhdGlvbiBjYXVzZXMgYW4gdXBkYXRlIHRvIG9jY3VyIGFuZCB0aGVuIHRoZSBleGNlcHRpb24uCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBuZXdKb2luRmV0Y2hWYWx1ZSkgeworCQlFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgb2xkSm9pbkZldGNoVmFsdWUgPSB0aGlzLmpvaW5GZXRjaFZhbHVlOworCQl0aGlzLmpvaW5GZXRjaFZhbHVlID0gbmV3Sm9pbkZldGNoVmFsdWU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRWNsaXBzZUxpbmtKb2luRmV0Y2guVkFMVUVfUFJPUEVSVFksIG9sZEpvaW5GZXRjaFZhbHVlLCBuZXdKb2luRmV0Y2hWYWx1ZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0ganJwYTsKKwkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIHJlc291cmNlSm9pbkZldGNoID0gdGhpcy5nZXRSZXNvdXJjZUpvaW5GZXRjaCgpOworCQl0aGlzLmpvaW5GZXRjaFZhbHVlID0gdGhpcy5qb2luRmV0Y2gocmVzb3VyY2VKb2luRmV0Y2gpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0ganJwYTsKKwkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIHJlc291cmNlSm9pbkZldGNoID0gdGhpcy5nZXRSZXNvdXJjZUpvaW5GZXRjaCgpOworCQlzZXRWYWx1ZV8oam9pbkZldGNoKHJlc291cmNlSm9pbkZldGNoKSk7CisJfQorCQorCXByaXZhdGUgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGpvaW5GZXRjaChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gcmVzb3VyY2VKb2luRmV0Y2gpIHsKKwkJaWYgKHJlc291cmNlSm9pbkZldGNoID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmIChyZXNvdXJjZUpvaW5GZXRjaC5nZXRWYWx1ZSgpID09IG51bGwpIHsgCisJCQkvLyBASm9pbkZldGNoIGlzIGVxdWl2YWxlbnQgdG8gQEpvaW5GZXRjaChKb2luRmV0Y2guSU5ORVIpCisJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCk7CisJCX0KKwkJcmV0dXJuIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwocmVzb3VyY2VKb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gcmVzb3VyY2VKb2luRmV0Y2ggPSB0aGlzLmdldFJlc291cmNlSm9pbkZldGNoKCk7CisJCXJldHVybiByZXNvdXJjZUpvaW5GZXRjaCA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlSm9pbkZldGNoLmdldFRleHRSYW5nZShhc3RSb290KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjYmFhNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhTWFueVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZworCWV4dGVuZHMgQWJzdHJhY3RKYXZhTWFueVRvTWFueU1hcHBpbmcKKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZworeworCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOworCQorCQorCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5qb2luRmV0Y2ggPSBuZXcgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoKHRoaXMpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nW10gYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgeworCQlyZXR1cm4gQXJyYXlUb29scy5hZGRBbGwoCisJCQlzdXBlci5idWlsZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKKwkJCUVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOworCX0JCQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7CisJCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZSgpOworCQl0aGlzLmpvaW5GZXRjaC5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLmpvaW5GZXRjaC51cGRhdGUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXRoaXMuam9pbkZldGNoLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGIzNjYxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZworCWV4dGVuZHMgQWJzdHJhY3RKYXZhTWFueVRvT25lTWFwcGluZworCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nCit7CisJcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaCBqb2luRmV0Y2g7CisJCisJCisJcHVibGljIEphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuam9pbkZldGNoID0gbmV3IEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaCh0aGlzKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ1tdIGJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKKwkJcmV0dXJuIEFycmF5VG9vbHMuYWRkQWxsKAorCQkJc3VwZXIuYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCisJCQlFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKKwl9CisJCisJcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkZldGNoOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisJCXRoaXMuam9pbkZldGNoLmluaXRpYWxpemUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuam9pbkZldGNoLnVwZGF0ZSh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy5qb2luRmV0Y2gudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5MTVmYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbAorCWV4dGVuZHMgQWJzdHJhY3RKYXZhTWFwcGVkU3VwZXJjbGFzcworCWltcGxlbWVudHMgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcywKKwkJQ2FjaGVhYmxlSG9sZGVyMl8wCit7CisJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgZWNsaXBzZUxpbmtDYWNoaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgY29udmVydGVySG9sZGVyOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seTsKKworCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXI7CisKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY2hhbmdlVHJhY2tpbmc7CisKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmVjbGlwc2VMaW5rQ2FjaGluZyA9IG5ldyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nSW1wbCh0aGlzKTsKKwkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIgPSBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVySW1wbCh0aGlzKTsKKwkJdGhpcy5yZWFkT25seSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtSZWFkT25seSh0aGlzKTsKKwkJdGhpcy5jdXN0b21pemVyID0gbmV3IEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIodGhpcyk7CisJCXRoaXMuY2hhbmdlVHJhY2tpbmcgPSBuZXcgSmF2YUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcodGhpcyk7CisJfQorCQorCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKSB7CisJCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rQ2FjaGluZzsKKwl9CisJCisJcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBnZXRDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiB0aGlzLmNvbnZlcnRlckhvbGRlcjsKKwl9CisJCisJcHVibGljIEVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0UmVhZE9ubHkoKSB7CisJCXJldHVybiB0aGlzLnJlYWRPbmx5OworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtDdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKSB7CisJCXJldHVybiB0aGlzLmN1c3RvbWl6ZXI7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCkgeworCQlyZXR1cm4gdGhpcy5jaGFuZ2VUcmFja2luZzsKKwl9CisJCisJcHVibGljIENhY2hlYWJsZTJfMCBnZXRDYWNoZWFibGUoKSB7CisJCXJldHVybiAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0Q2FjaGluZygpKS5nZXRDYWNoZWFibGUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpIHsKKwkJcmV0dXJuICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRDYWNoaW5nKCkpLmNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7CisJCXN1cGVyLmluaXRpYWxpemUoanJwdCk7CisJCXRoaXMuZWNsaXBzZUxpbmtDYWNoaW5nLmluaXRpYWxpemUoanJwdCk7CisJCXRoaXMuY29udmVydGVySG9sZGVyLmluaXRpYWxpemUoanJwdCk7CisJCXRoaXMucmVhZE9ubHkuaW5pdGlhbGl6ZShqcnB0KTsKKwkJdGhpcy5jdXN0b21pemVyLmluaXRpYWxpemUoanJwdCk7CisJCXRoaXMuY2hhbmdlVHJhY2tpbmcuaW5pdGlhbGl6ZShqcnB0KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJc3VwZXIudXBkYXRlKGpycHQpOworCQl0aGlzLmVjbGlwc2VMaW5rQ2FjaGluZy51cGRhdGUoanJwdCk7CisJCXRoaXMuY29udmVydGVySG9sZGVyLnVwZGF0ZShqcnB0KTsKKwkJdGhpcy5yZWFkT25seS51cGRhdGUoanJwdCk7CisJCXRoaXMuY3VzdG9taXplci51cGRhdGUoanJwdCk7CisJCXRoaXMuY2hhbmdlVHJhY2tpbmcudXBkYXRlKGpycHQpOworCX0KKwkKKwkKKwkvLyoqKioqKioqKiogVmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy5lY2xpcHNlTGlua0NhY2hpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy5yZWFkT25seS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLmN1c3RvbWl6ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy5jaGFuZ2VUcmFja2luZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTXV0YWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNdXRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5ODNjNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTXV0YWJsZS5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNdXRhYmxlIGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUgaW1wbGVtZW50cyBFY2xpcHNlTGlua011dGFibGUKK3sKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0TXV0YWJsZTsKKwlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRNdXRhYmxlOworCQorCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKKwkKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTXV0YWJsZShKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKKwkJcmV0dXJuIChKYXZhQXR0cmlidXRlTWFwcGluZykgdGhpcy5nZXRQYXJlbnQoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXV0YWJsZUFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIGdldFJlc291cmNlTXV0YWJsZSgpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKGdldE11dGFibGVBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VNdXRhYmxlKCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKGdldE11dGFibGVBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVzb3VyY2VNdXRhYmxlKCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKGdldE11dGFibGVBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0TXV0YWJsZSgpIHsKKwkJSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhQXR0cmlidXRlID0gKEphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUpIHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwkJaWYgKGphdmFBdHRyaWJ1dGUudHlwZUlzRGF0ZU9yQ2FsZW5kYXIoKSkgeworCQkJQm9vbGVhbiBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0TXV0YWJsZSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLmdldFRlbXBvcmFsTXV0YWJsZSgpOworCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRNdXRhYmxlID09IG51bGwgPyBmYWxzZSA6IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRNdXRhYmxlLmJvb2xlYW5WYWx1ZSgpOworCQl9CisJCXJldHVybiBqYXZhQXR0cmlidXRlLnR5cGVJc1NlcmlhbGl6YWJsZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzTXV0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTXV0YWJsZSAhPSBudWxsID8gdGhpcy5zcGVjaWZpZWRNdXRhYmxlLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0TXV0YWJsZTsgCisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE11dGFibGUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRNdXRhYmxlOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TXV0YWJsZShib29sZWFuIG5ld0RlZmF1bHRNdXRhYmxlKSB7CisJCWJvb2xlYW4gb2xkRGVmYXVsdE11dGFibGUgPSB0aGlzLmRlZmF1bHRNdXRhYmxlOworCQl0aGlzLmRlZmF1bHRNdXRhYmxlID0gbmV3RGVmYXVsdE11dGFibGU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9NVVRBQkxFX1BST1BFUlRZLCBvbGREZWZhdWx0TXV0YWJsZSwgbmV3RGVmYXVsdE11dGFibGUpOworCX0KKwkKKwlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRNdXRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRNdXRhYmxlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4gbmV3U3BlY2lmaWVkTXV0YWJsZSkgeworCQlpZiAodGhpcy5zcGVjaWZpZWRNdXRhYmxlID09IG5ld1NwZWNpZmllZE11dGFibGUpIHsKKwkJCXJldHVybjsKKwkJfQorCQlCb29sZWFuIG9sZFNwZWNpZmllZE11dGFibGUgPSB0aGlzLnNwZWNpZmllZE11dGFibGU7CisJCXRoaXMuc3BlY2lmaWVkTXV0YWJsZSA9IG5ld1NwZWNpZmllZE11dGFibGU7CisKKwkJaWYgKG5ld1NwZWNpZmllZE11dGFibGUgIT0gbnVsbCkgeworCQkJaWYgKGdldFJlc291cmNlTXV0YWJsZSgpID09IG51bGwpIHsKKwkJCQlhZGRSZXNvdXJjZU11dGFibGUoKTsKKwkJCX0KKwkJCWlmIChuZXdTcGVjaWZpZWRNdXRhYmxlLmJvb2xlYW5WYWx1ZSgpKSB7CisJCQkJaWYgKGdldFJlc291cmNlTXV0YWJsZSgpLmdldFZhbHVlKCkgPT0gQm9vbGVhbi5GQUxTRSkgeworCQkJCQlnZXRSZXNvdXJjZU11dGFibGUoKS5zZXRWYWx1ZShudWxsKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlnZXRSZXNvdXJjZU11dGFibGUoKS5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCXJlbW92ZVJlc291cmNlTXV0YWJsZSgpOworCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRWNsaXBzZUxpbmtNdXRhYmxlLlNQRUNJRklFRF9NVVRBQkxFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRNdXRhYmxlLCBuZXdTcGVjaWZpZWRNdXRhYmxlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTXV0YWJsZV8oQm9vbGVhbiBuZXdTcGVjaWZpZWRNdXRhYmxlKSB7CisJCUJvb2xlYW4gb2xkU3BlY2lmaWVkTXV0YWJsZSA9IHRoaXMuc3BlY2lmaWVkTXV0YWJsZTsKKwkJdGhpcy5zcGVjaWZpZWRNdXRhYmxlID0gbmV3U3BlY2lmaWVkTXV0YWJsZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTVVUQUJMRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkTXV0YWJsZSwgbmV3U3BlY2lmaWVkTXV0YWJsZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0ganJwYTsKKwkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiByZXNvdXJjZU11dGFibGUgPSB0aGlzLmdldFJlc291cmNlTXV0YWJsZSgpOworCQl0aGlzLnNwZWNpZmllZE11dGFibGUgPSB0aGlzLnNwZWNpZmllZE11dGFibGUocmVzb3VyY2VNdXRhYmxlKTsKKwkJdGhpcy5kZWZhdWx0TXV0YWJsZSA9IHRoaXMuY2FsY3VsYXRlRGVmYXVsdE11dGFibGUoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGpycGE7CisJCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gcmVzb3VyY2VNdXRhYmxlID0gdGhpcy5nZXRSZXNvdXJjZU11dGFibGUoKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRNdXRhYmxlXyh0aGlzLnNwZWNpZmllZE11dGFibGUocmVzb3VyY2VNdXRhYmxlKSk7CisJCXRoaXMuc2V0RGVmYXVsdE11dGFibGUodGhpcy5jYWxjdWxhdGVEZWZhdWx0TXV0YWJsZSgpKTsKKwl9CisJCisJcHJpdmF0ZSBCb29sZWFuIHNwZWNpZmllZE11dGFibGUoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiByZXNvdXJjZU11dGFibGUpIHsKKwkJaWYgKHJlc291cmNlTXV0YWJsZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAocmVzb3VyY2VNdXRhYmxlLmdldFZhbHVlKCkgPT0gbnVsbCkgeyAvL0BNdXRhYmxlIGlzIGVxdWl2YWxlbnQgdG8gQE11dGFibGUodHJ1ZSkKKwkJCXJldHVybiBCb29sZWFuLlRSVUU7CisJCX0KKwkJcmV0dXJuIHJlc291cmNlTXV0YWJsZS5nZXRWYWx1ZSgpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiByZXNvdXJjZU11dGFibGUgPSB0aGlzLmdldFJlc291cmNlTXV0YWJsZSgpOworCQlyZXR1cm4gcmVzb3VyY2VNdXRhYmxlID09IG51bGwgPyBudWxsIDogcmVzb3VyY2VNdXRhYmxlLmdldFRleHRSYW5nZShhc3RSb290KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2ZTBjOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGV4dGVuZHMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIKK3sJCisJcHJpdmF0ZSBTdHJpbmcgZGF0YVR5cGU7CisJCisJcHJpdmF0ZSBTdHJpbmcgb2JqZWN0VHlwZTsKKwkKKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWU7CisJCisJcHJpdmF0ZSBmaW5hbCBMaXN0PEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gY29udmVyc2lvblZhbHVlczsKKwkKKwkKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuY29udmVyc2lvblZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8SmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHN1cGVyLmdldEFubm90YXRpb24oKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBkYXRhIHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKSB7CisJCXJldHVybiB0aGlzLmRhdGFUeXBlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShTdHJpbmcgbmV3RGF0YVR5cGUpIHsKKwkJU3RyaW5nIG9sZERhdGFUeXBlID0gdGhpcy5kYXRhVHlwZTsKKwkJdGhpcy5kYXRhVHlwZSA9IG5ld0RhdGFUeXBlOworCQlnZXRBbm5vdGF0aW9uKCkuc2V0RGF0YVR5cGUobmV3RGF0YVR5cGUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVFlQRV9QUk9QRVJUWSwgb2xkRGF0YVR5cGUsIG5ld0RhdGFUeXBlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGF0YVR5cGVfKFN0cmluZyBuZXdEYXRhVHlwZSkgeworCQlTdHJpbmcgb2xkRGF0YVR5cGUgPSB0aGlzLmRhdGFUeXBlOworCQl0aGlzLmRhdGFUeXBlID0gbmV3RGF0YVR5cGU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREFUQV9UWVBFX1BST1BFUlRZLCBvbGREYXRhVHlwZSwgbmV3RGF0YVR5cGUpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIG9iamVjdCB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFN0cmluZyBnZXRPYmplY3RUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBuZXdPYmplY3RUeXBlKSB7CisJCVN0cmluZyBvbGRPYmplY3RUeXBlID0gdGhpcy5vYmplY3RUeXBlOworCQl0aGlzLm9iamVjdFR5cGUgPSBuZXdPYmplY3RUeXBlOworCQlnZXRBbm5vdGF0aW9uKCkuc2V0T2JqZWN0VHlwZShuZXdPYmplY3RUeXBlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVFlQRV9QUk9QRVJUWSwgb2xkT2JqZWN0VHlwZSwgbmV3T2JqZWN0VHlwZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdFR5cGVfKFN0cmluZyBuZXdPYmplY3RUeXBlKSB7CisJCVN0cmluZyBvbGRPYmplY3RUeXBlID0gdGhpcy5vYmplY3RUeXBlOworCQl0aGlzLm9iamVjdFR5cGUgPSBuZXdPYmplY3RUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGRPYmplY3RUeXBlLCBuZXdPYmplY3RUeXBlKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBjb252ZXJzaW9uIHZhbHVlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBjb252ZXJzaW9uVmFsdWVzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4odGhpcy5jb252ZXJzaW9uVmFsdWVzKTsKKwl9CisJCisJcHVibGljIGludCBjb252ZXJzaW9uVmFsdWVzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlcy5zaXplKCk7CisJfQorCQorCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgYWRkQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgeworCQlKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlID0gbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSh0aGlzKTsKKwkJdGhpcy5jb252ZXJzaW9uVmFsdWVzLmFkZChpbmRleCwgY29udmVyc2lvblZhbHVlKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIHJlc291cmNlQ29udmVyc2lvblZhbHVlID0gZ2V0QW5ub3RhdGlvbigpLmFkZENvbnZlcnNpb25WYWx1ZShpbmRleCk7CisJCWNvbnZlcnNpb25WYWx1ZS5pbml0aWFsaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlKTsKKwkJZmlyZUl0ZW1BZGRlZChDT05WRVJTSU9OX1ZBTFVFU19MSVNULCBpbmRleCwgY29udmVyc2lvblZhbHVlKTsKKwkJcmV0dXJuIGNvbnZlcnNpb25WYWx1ZTsKKwl9CisJCisJcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBhZGRDb252ZXJzaW9uVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmFkZENvbnZlcnNpb25WYWx1ZSh0aGlzLmNvbnZlcnNpb25WYWx1ZXMuc2l6ZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkQ29udmVyc2lvblZhbHVlKGludCBpbmRleCwgSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSkgeworCQlhZGRJdGVtVG9MaXN0KGluZGV4LCBjb252ZXJzaW9uVmFsdWUsIHRoaXMuY29udmVyc2lvblZhbHVlcywgQ09OVkVSU0lPTl9WQUxVRVNfTElTVCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZENvbnZlcnNpb25WYWx1ZShKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlKSB7CisJCXRoaXMuYWRkQ29udmVyc2lvblZhbHVlKHRoaXMuY29udmVyc2lvblZhbHVlcy5zaXplKCksIGNvbnZlcnNpb25WYWx1ZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKKwkJdGhpcy5yZW1vdmVDb252ZXJzaW9uVmFsdWUodGhpcy5jb252ZXJzaW9uVmFsdWVzLmluZGV4T2YoY29udmVyc2lvblZhbHVlKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpIHsKKwkJSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIHJlbW92ZWRDb252ZXJzaW9uVmFsdWUgPSB0aGlzLmNvbnZlcnNpb25WYWx1ZXMucmVtb3ZlKGluZGV4KTsKKwkJZ2V0QW5ub3RhdGlvbigpLnJlbW92ZUNvbnZlcnNpb25WYWx1ZShpbmRleCk7CisJCWZpcmVJdGVtUmVtb3ZlZChDT05WRVJTSU9OX1ZBTFVFU19MSVNULCBpbmRleCwgcmVtb3ZlZENvbnZlcnNpb25WYWx1ZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZV8oSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSkgeworCQlyZW1vdmVJdGVtRnJvbUxpc3QoY29udmVyc2lvblZhbHVlLCB0aGlzLmNvbnZlcnNpb25WYWx1ZXMsIENPTlZFUlNJT05fVkFMVUVTX0xJU1QpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBtb3ZlQ29udmVyc2lvblZhbHVlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuY29udmVyc2lvblZhbHVlcywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJZ2V0QW5ub3RhdGlvbigpLm1vdmVDb252ZXJzaW9uVmFsdWUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJZmlyZUl0ZW1Nb3ZlZChDT05WRVJTSU9OX1ZBTFVFU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCisJfQorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBkYXRhVmFsdWVzKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgU3RyaW5nPihjb252ZXJzaW9uVmFsdWVzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIG5leHQpIHsKKwkJCQlyZXR1cm4gbmV4dC5nZXREYXRhVmFsdWUoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBkZWZhdWx0IG9iamVjdCB2YWx1ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcgbmV3RGVmYXVsdE9iamVjdFZhbHVlKSB7CisJCVN0cmluZyBvbGREZWZhdWx0T2JqZWN0VmFsdWUgPSB0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZTsKKwkJdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWUgPSBuZXdEZWZhdWx0T2JqZWN0VmFsdWU7CisJCWdldEFubm90YXRpb24oKS5zZXREZWZhdWx0T2JqZWN0VmFsdWUobmV3RGVmYXVsdE9iamVjdFZhbHVlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkRGVmYXVsdE9iamVjdFZhbHVlLCBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0T2JqZWN0VmFsdWVfKFN0cmluZyBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpIHsKKwkJU3RyaW5nIG9sZERlZmF1bHRPYmplY3RWYWx1ZSA9IHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOworCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IG5ld0RlZmF1bHRPYmplY3RWYWx1ZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkRGVmYXVsdE9iamVjdFZhbHVlLCBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZShqcnBtKTsKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlciA9IGdldEFubm90YXRpb24oKTsKKwkJdGhpcy5kYXRhVHlwZSA9IHRoaXMuZGF0YVR5cGUocmVzb3VyY2VDb252ZXJ0ZXIpOworCQl0aGlzLm9iamVjdFR5cGUgPSB0aGlzLm9iamVjdFR5cGUocmVzb3VyY2VDb252ZXJ0ZXIpOworCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlKHJlc291cmNlQ29udmVydGVyKTsKKwkJdGhpcy5pbml0aWFsaXplQ29udmVyc2lvblZhbHVlcyhyZXNvdXJjZUNvbnZlcnRlcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJzaW9uVmFsdWVzKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gcmVzb3VyY2VDb252ZXJ0ZXIpIHsKKwkJaWYgKHJlc291cmNlQ29udmVydGVyID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSByZXNvdXJjZUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7CisJCQorCQl3aGlsZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKSB7CisJCQl0aGlzLmNvbnZlcnNpb25WYWx1ZXMuYWRkKGJ1aWxkQ29udmVyc2lvblZhbHVlKHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgYnVpbGRDb252ZXJzaW9uVmFsdWUoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIHJlc291cmNlQ29udmVyc2lvblZhbHVlKSB7CisJCUphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUgPSBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlKHRoaXMpOworCQljb252ZXJzaW9uVmFsdWUuaW5pdGlhbGl6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSk7CisJCXJldHVybiBjb252ZXJzaW9uVmFsdWU7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKKwkJc3VwZXIudXBkYXRlKGpycG0pOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIHJlc291cmNlQ29udmVydGVyID0gZ2V0QW5ub3RhdGlvbigpOworCQl0aGlzLnNldERhdGFUeXBlXyh0aGlzLmRhdGFUeXBlKHJlc291cmNlQ29udmVydGVyKSk7CisJCXRoaXMuc2V0T2JqZWN0VHlwZV8odGhpcy5vYmplY3RUeXBlKHJlc291cmNlQ29udmVydGVyKSk7CisJCXRoaXMuc2V0RGVmYXVsdE9iamVjdFZhbHVlXyh0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZShyZXNvdXJjZUNvbnZlcnRlcikpOworCQl0aGlzLnVwZGF0ZUNvbnZlcnNpb25WYWx1ZXMocmVzb3VyY2VDb252ZXJ0ZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb252ZXJzaW9uVmFsdWVzKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gcmVzb3VyY2VDb252ZXJ0ZXIpIHsKKwkJTGlzdEl0ZXJhdG9yPEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gY29udGV4dENvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJzaW9uVmFsdWVzKCk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IHJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IHJlc291cmNlQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKKwkJd2hpbGUgKGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSkgeworCQkJSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZXMgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7CisJCQlpZiAocmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSkgeworCQkJCWNvbnZlcnNpb25WYWx1ZXMudXBkYXRlKHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlQ29udmVyc2lvblZhbHVlXyhjb252ZXJzaW9uVmFsdWVzKTsKKwkJCX0KKwkJfQorCQkKKwkJd2hpbGUgKHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpIHsKKwkJCWFkZENvbnZlcnNpb25WYWx1ZShidWlsZENvbnZlcnNpb25WYWx1ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBkYXRhVHlwZShFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIHJlc291cmNlQ29udmVydGVyKSB7CisJCXJldHVybiByZXNvdXJjZUNvbnZlcnRlciA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlQ29udmVydGVyLmdldERhdGFUeXBlKCk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgb2JqZWN0VHlwZShFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIHJlc291cmNlQ29udmVydGVyKSB7CisJCXJldHVybiByZXNvdXJjZUNvbnZlcnRlciA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlQ29udmVydGVyLmdldE9iamVjdFR5cGUoKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlcikgeworCQlyZXR1cm4gcmVzb3VyY2VDb252ZXJ0ZXIgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCWZvciAoSXRlcmF0b3I8SmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBzdHJlYW0gPSBjb252ZXJzaW9uVmFsdWVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7CisJCQlzdHJlYW0ubmV4dCgpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMmZkMzIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFPbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFPbmVUb01hbnlNYXBwaW5nPE9uZVRvTWFueUFubm90YXRpb24+CisJaW1wbGVtZW50cyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcKK3sKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoIGpvaW5GZXRjaDsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25lZDsKKwkKKwkKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5qb2luRmV0Y2ggPSBuZXcgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoKHRoaXMpOworCQl0aGlzLnByaXZhdGVPd25lZCA9IG5ldyBKYXZhRWNsaXBzZUxpbmtQcml2YXRlT3duZWQodGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKYXZhUmVsYXRpb25zaGlwUmVmZXJlbmNlIGJ1aWxkUmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSh0aGlzKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ1tdIGJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKKwkJcmV0dXJuIEFycmF5VG9vbHMuYWRkQWxsKAorCQkJc3VwZXIuYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCisJCQlFY2xpcHNlTGluay5KT0lOX0ZFVENILAorCQkJRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCk7CisJfQkJCisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiAoSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlKSBzdXBlci5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBwcml2YXRlIG93bmVkICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBnZXRQcml2YXRlT3duZWQoKSB7CisJCXJldHVybiB0aGlzLnByaXZhdGVPd25lZDsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRQcml2YXRlT3duZWRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24gZ2V0UmVzb3VyY2VQcml2YXRlT3duZWQoKSB7CisJCXJldHVybiAoRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oZ2V0UHJpdmF0ZU93bmVkQW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlUHJpdmF0ZU93bmVkKCkgeworCQl0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oZ2V0UHJpdmF0ZU93bmVkQW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlUHJpdmF0ZU93bmVkKCkgeworCQl0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oZ2V0UHJpdmF0ZU93bmVkQW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogam9pbiBmZXRjaCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtKb2luRmV0Y2ggZ2V0Sm9pbkZldGNoKCkgeworCQlyZXR1cm4gdGhpcy5qb2luRmV0Y2g7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgLT4gY29udGV4dCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisJCXRoaXMuam9pbkZldGNoLmluaXRpYWxpemUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCXRoaXMucHJpdmF0ZU93bmVkLmluaXRpYWxpemUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuam9pbkZldGNoLnVwZGF0ZSh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJdGhpcy5wcml2YXRlT3duZWQudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy5qb2luRmV0Y2gudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy5wcml2YXRlT3duZWQudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5Y2Q3NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJCW5ldyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKS5nZXRLZXkoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmdldEFubm90YXRpb25OYW1lKCk7CisJfQorCisJcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkuYnVpbGRNYXBwaW5nKHBhcmVudCwgZmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHRlc3REZWZhdWx0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKKwkJU3RyaW5nIHRhcmdldEVudGl0eSA9IHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TXVsdGlSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZSgpOworCQlyZXR1cm4gKHRhcmdldEVudGl0eSAhPSBudWxsKSAKKwkJCQkmJiAocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkodGFyZ2V0RW50aXR5KSAhPSBudWxsKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2M0NjdkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UKKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLAorCQlKYXZhSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UKK3sKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKKwkKKwkKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlKAorCQkJSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5ID0gYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJfQorCQorCQorCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KHRoaXMpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldFBhcmVudCgpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSm9pbmluZ1N0cmF0ZWd5IGNhbGN1bGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgeworCQlpZiAodGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpICE9IG51bGwpIHsKKwkJCXJldHVybiB0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5OworCQl9CisJCWVsc2UgaWYgKHRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpKSB7CisJCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIHRoaXMuam9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworCQl9CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJcmVzdWx0ID0gdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIG1hcHBlZCBieSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKSB7CisJCXN1cGVyLnNldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCk7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBtYXlCZU1hcHBlZEJ5KEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGVkQnlNYXBwaW5nKSB7CisJCXJldHVybiBzdXBlci5tYXlCZU1hcHBlZEJ5KG1hcHBlZEJ5TWFwcGluZykgfHwKKwkJCW1hcHBlZEJ5TWFwcGluZy5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBqb2luIHRhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpIHsKKwkJc3VwZXIuc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBtYXlIYXZlRGVmYXVsdEpvaW5UYWJsZSgpIHsKKwkJcmV0dXJuIHN1cGVyLm1heUhhdmVEZWZhdWx0Sm9pblRhYmxlKCkKKwkJCSYmICEgdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5Lmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogam9pbiBjb2x1bW5zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gdXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBnZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpID09IHRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpIHsKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIHZvaWQgdW5zZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luQ29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy5tYXBwZWRCeUpvaW5pbmdTdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpID09IG51bGwgCisJCQkmJiB0aGlzLmpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKSA9PSBudWxsOworCX0KKwkKKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlID0+IGNvbnRleHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVnaWVzKCkgeworCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuaW5pdGlhbGl6ZSgpOworCQlzdXBlci5pbml0aWFsaXplSm9pbmluZ1N0cmF0ZWdpZXMoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlSm9pbmluZ1N0cmF0ZWdpZXMoKSB7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS51cGRhdGUoKTsKKwkJc3VwZXIudXBkYXRlSm9pbmluZ1N0cmF0ZWdpZXMoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBWYWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYTdjMGEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFPbmVUb09uZU1hcHBpbmcKKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nCit7CisJcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaCBqb2luRmV0Y2g7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duZWQ7CisJCisJCisJcHVibGljIEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5qb2luRmV0Y2ggPSBuZXcgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoKHRoaXMpOworCQl0aGlzLnByaXZhdGVPd25lZCA9IG5ldyBKYXZhRWNsaXBzZUxpbmtQcml2YXRlT3duZWQodGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmdbXSBidWlsZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7CisJCXJldHVybiBBcnJheVRvb2xzLmFkZEFsbCgKKwkJCXN1cGVyLmJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAorCQkJRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwKKwkJCUVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQpOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtKb2luRmV0Y2ggZ2V0Sm9pbkZldGNoKCkgeworCQlyZXR1cm4gdGhpcy5qb2luRmV0Y2g7CisJfQorCisJcHVibGljIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGdldFByaXZhdGVPd25lZCgpIHsKKwkJcmV0dXJuIHRoaXMucHJpdmF0ZU93bmVkOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisJCXRoaXMuam9pbkZldGNoLmluaXRpYWxpemUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCXRoaXMucHJpdmF0ZU93bmVkLmluaXRpYWxpemUodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuam9pbkZldGNoLnVwZGF0ZSh0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJdGhpcy5wcml2YXRlT3duZWQudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLmpvaW5GZXRjaC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCQl0aGlzLnByaXZhdGVPd25lZC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczNzBhMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmdldEtleSgpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uTmFtZSgpOworCX0KKwkKKwlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmJ1aWxkTWFwcGluZyhwYXJlbnQsIGZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiB0ZXN0RGVmYXVsdChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7CisJCVN0cmluZyB0YXJnZXRFbnRpdHkgPSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNpbmdsZVJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKCk7CisJCXJldHVybiAodGFyZ2V0RW50aXR5ICE9IG51bGwpCisJCQkJJiYgKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RW50aXR5KHRhcmdldEVudGl0eSkgIT0gbnVsbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWM5YzExCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7CisKKy8qKgorICogRWNsaXBzZUxpbmsgSmF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZQorICovCitwdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZQorCWV4dGVuZHMgQWJzdHJhY3RKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZQorCWltcGxlbWVudHMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAKK3sKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZShQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgeworCQlzdXBlcihwYXJlbnQsIGpycGEpOworCX0KKworCisJLy8gKioqKioqKioqKiBBY2Nlc3NIb2xkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3MpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YgamF2YS51dGlsLkRhdGUgb3IgamF2YS51dGlsLkNhbGVuZGFyLgorCSAqLworCXB1YmxpYyBib29sZWFuIHR5cGVJc0RhdGVPckNhbGVuZGFyKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUudHlwZUlzU3ViVHlwZU9mKERBVEVfVFlQRV9OQU1FKQorCQkJCXx8IHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLnR5cGVJc1N1YlR5cGVPZihDQUxFTkRBUl9UWVBFX05BTUUpOworCX0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX1RZUEVfTkFNRSA9IGphdmEudXRpbC5EYXRlLmNsYXNzLmdldE5hbWUoKTsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxFTkRBUl9UWVBFX05BTUUgPSBqYXZhLnV0aWwuQ2FsZW5kYXIuY2xhc3MuZ2V0TmFtZSgpOworCisJcHVibGljIGJvb2xlYW4gdHlwZUlzU2VyaWFsaXphYmxlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUudHlwZUlzVmFyaWFibGVQcmltaXRpdmUoKQorCQkJCXx8IHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLnR5cGVJc1N1YlR5cGVPZihTRVJJQUxJWkFCTEVfVFlQRV9OQU1FKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB0eXBlSXNWYWxpZEZvclZhcmlhYmxlT25lVG9PbmUoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS50eXBlSXNJbnRlcmZhY2UoKQorCQkJCSYmIHRoaXMuaW50ZXJmYWNlSXNWYWxpZEZvclZhcmlhYmxlT25lVG9PbmUodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0VHlwZU5hbWUoKSk7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gaW50ZXJmYWNlSXNWYWxpZEZvclZhcmlhYmxlT25lVG9PbmUoU3RyaW5nIGludGVyZmFjZU5hbWUpIHsKKwkJcmV0dXJuICEgdGhpcy5pbnRlcmZhY2VJc0ludmFsaWRGb3JWYXJpYWJsZU9uZVRvT25lKGludGVyZmFjZU5hbWUpOworCX0KKworCS8vIFRPRE8gd2UgY291bGQgcHJvYmFibHkgYWRkIG1vcmUgaW50ZXJmYWNlcyB0byB0aGlzIGxpc3QuLi4KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcmZhY2VJc0ludmFsaWRGb3JWYXJpYWJsZU9uZVRvT25lKFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7CisJCXJldHVybiAoaW50ZXJmYWNlTmFtZSA9PSBudWxsKSB8fAorCQkJCXRoaXMudHlwZUlzQ29udGFpbmVyKGludGVyZmFjZU5hbWUpIHx8CisJCQkJaW50ZXJmYWNlTmFtZS5lcXVhbHMoIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmluZGlyZWN0aW9uLlZhbHVlSG9sZGVySW50ZXJmYWNlIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUoKSB7CisJCXJldHVybiB0aGlzLmdldEpwYUNvbnRhaW5lcih0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRUeXBlTmFtZSgpKS5nZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZE1hcEtleVR5cGVOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5nZXRKcGFDb250YWluZXIodGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0VHlwZU5hbWUoKSkuZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRNYXBLZXlUeXBlTmFtZSgoTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKSB0aGlzLmdldE1hcHBpbmcoKSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpIHsKKwkJU3RyaW5nIHR5cGVOYW1lID0gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0VHlwZU5hbWUoKTsKKwkJaWYgKHR5cGVOYW1lID09IG51bGwpIHsKKwkJCXJldHVybiBNZXRhbW9kZWxGaWVsZC5ERUZBVUxUX1RZUEVfTkFNRTsKKwkJfQorCQlpZiAoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmUodHlwZU5hbWUpKSB7CisJCQlyZXR1cm4gQ2xhc3NUb29scy53cmFwcGVyQ2xhc3NOYW1lKHR5cGVOYW1lKTsgIC8vID8/PworCQl9CisJCXJldHVybiB0eXBlTmFtZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ByaXZhdGVPd25lZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtQcml2YXRlT3duZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzg5MTBiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtQcml2YXRlT3duZWQuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1ByaXZhdGVPd25lZAorCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkCit7CisJcHJvdGVjdGVkIGJvb2xlYW4gcHJpdmF0ZU93bmVkOworCQorCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKKwkKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFByaXZhdGVPd25lZEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbiBnZXRSZXNvdXJjZVByaXZhdGVPd25lZCgpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFubm90YXRpb24oZ2V0UHJpdmF0ZU93bmVkQW5ub3RhdGlvbk5hbWUoKSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlUHJpdmF0ZU93bmVkKCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKGdldFByaXZhdGVPd25lZEFubm90YXRpb25OYW1lKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZVByaXZhdGVPd25lZCgpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihnZXRQcml2YXRlT3duZWRBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVPd25lZCgpIHsKKwkJcmV0dXJuIHRoaXMucHJpdmF0ZU93bmVkOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRQcml2YXRlT3duZWQoYm9vbGVhbiBuZXdQcml2YXRlT3duZWQpIHsKKwkJaWYgKHRoaXMucHJpdmF0ZU93bmVkID09IG5ld1ByaXZhdGVPd25lZCkgeworCQkJcmV0dXJuOworCQl9CisJCWJvb2xlYW4gb2xkUHJpdmF0ZU93bmVkID0gdGhpcy5wcml2YXRlT3duZWQ7CisJCXRoaXMucHJpdmF0ZU93bmVkID0gbmV3UHJpdmF0ZU93bmVkOworCisJCWlmIChuZXdQcml2YXRlT3duZWQpIHsKKwkJCWFkZFJlc291cmNlUHJpdmF0ZU93bmVkKCk7CisJCX0KKwkJZWxzZSB7CisJCQkvL2hhdmUgdG8gY2hlY2sgaWYgYW5ub3RhdGlvbiBleGlzdHMgaW4gY2FzZSB0aGUgY2hhbmdlIGlzIGZyb20gZmFsc2UgdG8gbnVsbCBvciB2aWNlIHZlcnNhCisJCQlpZiAoZ2V0UmVzb3VyY2VQcml2YXRlT3duZWQoKSAhPSBudWxsKSB7CisJCQkJcmVtb3ZlUmVzb3VyY2VQcml2YXRlT3duZWQoKTsKKwkJCX0KKwkJfQorCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBSSVZBVEVfT1dORURfUFJPUEVSVFksIG9sZFByaXZhdGVPd25lZCwgbmV3UHJpdmF0ZU93bmVkKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0UHJpdmF0ZU93bmVkXyhib29sZWFuIG5ld1ByaXZhdGVPd25lZCkgeworCQlib29sZWFuIG9sZFByaXZhdGVPd25lZCA9IHRoaXMucHJpdmF0ZU93bmVkOworCQl0aGlzLnByaXZhdGVPd25lZCA9IG5ld1ByaXZhdGVPd25lZDsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChQUklWQVRFX09XTkVEX1BST1BFUlRZLCBvbGRQcml2YXRlT3duZWQsIG5ld1ByaXZhdGVPd25lZCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7CisJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0ganJwYTsKKwkJdGhpcy5wcml2YXRlT3duZWQgPSBwcml2YXRlT3duZWQoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGpycGE7CisJCXRoaXMuc2V0UHJpdmF0ZU93bmVkXyhwcml2YXRlT3duZWQoKSk7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBwcml2YXRlT3duZWQoKSB7CisJCXJldHVybiBnZXRSZXNvdXJjZVByaXZhdGVPd25lZCgpICE9IG51bGw7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24gcmVzb3VyY2VQcml2YXRlT3duZWQgPSB0aGlzLmdldFJlc291cmNlUHJpdmF0ZU93bmVkKCk7CisJCXJldHVybiByZXNvdXJjZVByaXZhdGVPd25lZCA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlUHJpdmF0ZU93bmVkLmdldFRleHRSYW5nZShhc3RSb290KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rUmVhZE9ubHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rUmVhZE9ubHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzY4YTljCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtSZWFkT25seS5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVhZE9ubHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1JlYWRPbmx5IGV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUgaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlYWRPbmx5Cit7CisJcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUmVhZE9ubHk7CisJCisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGU7CisJCisJCisJcHVibGljIEphdmFFY2xpcHNlTGlua1JlYWRPbmx5KEphdmFUeXBlTWFwcGluZyBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZWFkT25seUFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24gZ2V0UmVzb3VyY2VSZWFkT25seSgpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oZ2V0UmVhZE9ubHlBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VSZWFkT25seSgpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oZ2V0UmVhZE9ubHlBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVzb3VyY2VSZWFkT25seSgpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oZ2V0UmVhZE9ubHlBbm5vdGF0aW9uTmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSAhPSBudWxsKSA/IHRoaXMuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0UmVhZE9ubHkoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0UmVhZE9ubHkoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua1JlYWRPbmx5LkRFRkFVTFRfUkVBRF9PTkxZOworCX0KKwkKKwlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRSZWFkT25seSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVhZE9ubHk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4gbmV3UmVhZE9ubHkpIHsKKwkJaWYgKHRoaXMuc3BlY2lmaWVkUmVhZE9ubHkgPT0gbmV3UmVhZE9ubHkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlCb29sZWFuIG9sZFJlYWRPbmx5ID0gdGhpcy5zcGVjaWZpZWRSZWFkT25seTsKKwkJdGhpcy5zcGVjaWZpZWRSZWFkT25seSA9IG5ld1JlYWRPbmx5OworCisJCWlmIChuZXdSZWFkT25seSAhPSBudWxsICYmIG5ld1JlYWRPbmx5LmJvb2xlYW5WYWx1ZSgpKSB7CisJCQlhZGRSZXNvdXJjZVJlYWRPbmx5KCk7CisJCX0KKwkJZWxzZSB7CisJCQkvL2hhdmUgdG8gY2hlY2sgaWYgYW5ub3RhdGlvbiBleGlzdHMgaW4gY2FzZSB0aGUgY2hhbmdlIGlzIGZyb20gZmFsc2UgdG8gbnVsbCBvciB2aWNlIHZlcnNhCisJCQlpZiAoZ2V0UmVzb3VyY2VSZWFkT25seSgpICE9IG51bGwpIHsKKwkJCQlyZW1vdmVSZXNvdXJjZVJlYWRPbmx5KCk7CisJCQl9CisJCX0KKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVBRF9PTkxZX1BST1BFUlRZLCBvbGRSZWFkT25seSwgbmV3UmVhZE9ubHkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRSZWFkT25seV8oQm9vbGVhbiBuZXdSZWFkT25seSkgeworCQlCb29sZWFuIG9sZFJlYWRPbmx5ID0gdGhpcy5zcGVjaWZpZWRSZWFkT25seTsKKwkJdGhpcy5zcGVjaWZpZWRSZWFkT25seSA9IG5ld1JlYWRPbmx5OworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUFEX09OTFlfUFJPUEVSVFksIG9sZFJlYWRPbmx5LCBuZXdSZWFkT25seSk7CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCkgeworCQl0aGlzLnJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBqcnB0OworCQl0aGlzLnNwZWNpZmllZFJlYWRPbmx5ID0gcmVhZE9ubHkoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0ganJwdDsKKwkJdGhpcy5zZXRTcGVjaWZpZWRSZWFkT25seV8ocmVhZE9ubHkoKSk7CisJfQorCQorCXByaXZhdGUgQm9vbGVhbiByZWFkT25seSgpIHsKKwkJcmV0dXJuIGdldFJlc291cmNlUmVhZE9ubHkoKSA9PSBudWxsID8gbnVsbCA6IEJvb2xlYW4uVFJVRTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uIHJlc291cmNlUmVhZE9ubHkgPSB0aGlzLmdldFJlc291cmNlUmVhZE9ubHkoKTsKKwkJcmV0dXJuIHJlc291cmNlUmVhZE9ubHkgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZVJlYWRPbmx5LmdldFRleHRSYW5nZShhc3RSb290KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2E3OGYyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBleHRlbmRzIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIKK3sJCisJcHJpdmF0ZSBTdHJpbmcgY29udmVydGVyQ2xhc3M7CisJCisJCisJcHVibGljIEphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVI7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7CisJCXJldHVybiAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSBzdXBlci5nZXRBbm5vdGF0aW9uKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogY29udmVydGVyIGNsYXNzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkgeworCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDbGFzczsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0Q29udmVydGVyQ2xhc3MoU3RyaW5nIG5ld0NvbnZlcnRlckNsYXNzKSB7CisJCVN0cmluZyBvbGRDb252ZXJ0ZXJDbGFzcyA9IHRoaXMuY29udmVydGVyQ2xhc3M7CisJCXRoaXMuY29udmVydGVyQ2xhc3MgPSBuZXdDb252ZXJ0ZXJDbGFzczsKKwkJZ2V0QW5ub3RhdGlvbigpLnNldENvbnZlcnRlcihuZXdDb252ZXJ0ZXJDbGFzcyk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXJDbGFzcywgbmV3Q29udmVydGVyQ2xhc3MpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzc18oU3RyaW5nIG5ld0NvbnZlcnRlckNsYXNzKSB7CisJCVN0cmluZyBvbGRDb252ZXJ0ZXJDbGFzcyA9IHRoaXMuY29udmVydGVyQ2xhc3M7CisJCXRoaXMuY29udmVydGVyQ2xhc3MgPSBuZXdDb252ZXJ0ZXJDbGFzczsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfQ0xBU1NfUFJPUEVSVFksIG9sZENvbnZlcnRlckNsYXNzLCBuZXdDb252ZXJ0ZXJDbGFzcyk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgaW50ZXJhY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIganJwbSkgeworCQlzdXBlci5pbml0aWFsaXplKGpycG0pOworCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gdGhpcy5jb252ZXJ0ZXJDbGFzcyhnZXRBbm5vdGF0aW9uKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqcnBtKSB7CisJCXN1cGVyLnVwZGF0ZShqcnBtKTsKKwkJdGhpcy5zZXRDb252ZXJ0ZXJDbGFzc18odGhpcy5jb252ZXJ0ZXJDbGFzcyhnZXRBbm5vdGF0aW9uKCkpKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0ZXJDbGFzcyhFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gcmVzb3VyY2VDb252ZXJ0ZXIpIHsKKwkJcmV0dXJuIHJlc291cmNlQ29udmVydGVyID09IG51bGwgPyBudWxsIDogcmVzb3VyY2VDb252ZXJ0ZXIuZ2V0Q29udmVydGVyKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1NGZiMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uPiAKKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nCit7CisJCisJcHVibGljIEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlRSQU5TRk9STUFUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmODdmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOworCitwdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCQluZXcgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVFJBTlNGT1JNQVRJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiAoKEVjbGlwc2VMaW5rSnBhRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcocGFyZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNGViYWEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKKworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgZXh0ZW5kcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIKKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcgorewkKKwlwcml2YXRlIFN0cmluZyBkYXRhVHlwZTsKKwkKKwlwcml2YXRlIFN0cmluZyBvYmplY3RUeXBlOworCQorCQorCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVI7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBzdXBlci5nZXRBbm5vdGF0aW9uKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogZGF0YSB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5kYXRhVHlwZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIG5ld0RhdGFUeXBlKSB7CisJCVN0cmluZyBvbGREYXRhVHlwZSA9IHRoaXMuZGF0YVR5cGU7CisJCXRoaXMuZGF0YVR5cGUgPSBuZXdEYXRhVHlwZTsKKwkJZ2V0QW5ub3RhdGlvbigpLnNldERhdGFUeXBlKG5ld0RhdGFUeXBlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1RZUEVfUFJPUEVSVFksIG9sZERhdGFUeXBlLCBuZXdEYXRhVHlwZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldERhdGFUeXBlXyhTdHJpbmcgbmV3RGF0YVR5cGUpIHsKKwkJU3RyaW5nIG9sZERhdGFUeXBlID0gdGhpcy5kYXRhVHlwZTsKKwkJdGhpcy5kYXRhVHlwZSA9IG5ld0RhdGFUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVFlQRV9QUk9QRVJUWSwgb2xkRGF0YVR5cGUsIG5ld0RhdGFUeXBlKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBvYmplY3QgdHlwZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgbmV3T2JqZWN0VHlwZSkgeworCQlTdHJpbmcgb2xkT2JqZWN0VHlwZSA9IHRoaXMub2JqZWN0VHlwZTsKKwkJdGhpcy5vYmplY3RUeXBlID0gbmV3T2JqZWN0VHlwZTsKKwkJZ2V0QW5ub3RhdGlvbigpLnNldE9iamVjdFR5cGUobmV3T2JqZWN0VHlwZSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfUFJPUEVSVFksIG9sZE9iamVjdFR5cGUsIG5ld09iamVjdFR5cGUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RUeXBlXyhTdHJpbmcgbmV3T2JqZWN0VHlwZSkgeworCQlTdHJpbmcgb2xkT2JqZWN0VHlwZSA9IHRoaXMub2JqZWN0VHlwZTsKKwkJdGhpcy5vYmplY3RUeXBlID0gbmV3T2JqZWN0VHlwZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVFlQRV9QUk9QRVJUWSwgb2xkT2JqZWN0VHlwZSwgbmV3T2JqZWN0VHlwZSk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgaW50ZXJhY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIganJwbSkgeworCQlzdXBlci5pbml0aWFsaXplKGpycG0pOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIHJlc291cmNlQ29udmVydGVyID0gZ2V0QW5ub3RhdGlvbigpOworCQl0aGlzLmRhdGFUeXBlID0gdGhpcy5kYXRhVHlwZShyZXNvdXJjZUNvbnZlcnRlcik7CisJCXRoaXMub2JqZWN0VHlwZSA9IHRoaXMub2JqZWN0VHlwZShyZXNvdXJjZUNvbnZlcnRlcik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0pIHsKKwkJc3VwZXIudXBkYXRlKGpycG0pOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIHJlc291cmNlQ29udmVydGVyID0gZ2V0QW5ub3RhdGlvbigpOworCQl0aGlzLnNldERhdGFUeXBlXyh0aGlzLmRhdGFUeXBlKHJlc291cmNlQ29udmVydGVyKSk7CisJCXRoaXMuc2V0T2JqZWN0VHlwZV8odGhpcy5vYmplY3RUeXBlKHJlc291cmNlQ29udmVydGVyKSk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZGF0YVR5cGUoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlcikgeworCQlyZXR1cm4gcmVzb3VyY2VDb252ZXJ0ZXIgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIG9iamVjdFR5cGUoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnRlcikgeworCQlyZXR1cm4gcmVzb3VyY2VDb252ZXJ0ZXIgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNzBjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uOworCitwdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcgCisJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24+CisJaW1wbGVtZW50cyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nCit7CisJCisJcHVibGljIEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVkFSSUFCTEVfT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjBlNjA1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb247CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCQluZXcgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCQorCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuICgoRWNsaXBzZUxpbmtKcGFGYWN0b3J5KSBmYWN0b3J5KS5idWlsZEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHRlc3REZWZhdWx0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKKwkJcmV0dXJuICgoSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGVyc2lzdGVudEF0dHJpYnV0ZSkudHlwZUlzVmFsaWRGb3JWYXJpYWJsZU9uZVRvT25lKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1ZTc5MwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVZlcnNpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0SmF2YVZlcnNpb25NYXBwaW5nCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nCit7CisJcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZTsKKwkKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMubXV0YWJsZSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtNdXRhYmxlKHRoaXMpOworCX0KKwkKKwkvLyoqKioqKioqKioqKioqIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmdbXSBidWlsZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7CisJCXJldHVybiBBcnJheVRvb2xzLmFkZEFsbCgKKwkJCXN1cGVyLmJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAorCQkJRWNsaXBzZUxpbmsuTVVUQUJMRSwKKwkJCUVjbGlwc2VMaW5rLkNPTlZFUlQpOworCX0JCQorCisJCisJLy8qKioqKioqKioqKioqKiBFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIG92ZXJyaWRlcyAqKioqKioqKioqKioqKioKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGJ1aWxkU3BlY2lmaWVkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7CisJCUphdmFDb252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9IHN1cGVyLmJ1aWxkU3BlY2lmaWVkQ29udmVydGVyKGNvbnZlcnRlclR5cGUpOworCQlpZiAoamF2YUNvbnZlcnRlciAhPSBudWxsKSB7CisJCQlyZXR1cm4gamF2YUNvbnZlcnRlcjsKKwkJfQorCQlpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgeworCQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0KHRoaXMsIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlQ29udmVydGVyVHlwZSgpIHsKKwkJLy9jaGVjayBAQ29udmVydCBmaXJzdCwgdGhpcyBpcyB0aGUgb3JkZXIgdGhhdCBFY2xpcHNlTGluayBzZWFyY2hlcworCQlpZiAodGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVI7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlQ29udmVydGVyVHlwZSgpOworCX0KKwkKKwkKKwkvLyoqKioqKioqKioqKiBFY2xpcHNlbGlua1ZlcnNpb25NYXBwaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtNdXRhYmxlIGdldE11dGFibGUoKSB7CisJCXJldHVybiB0aGlzLm11dGFibGU7CisJfQorCQorCQorCS8vKioqKioqKioqKioqIGluaXRpYWxpemF0aW9uL3VwZGF0ZSAqKioqKioqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisJCXRoaXMubXV0YWJsZS5pbml0aWFsaXplKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLm11dGFibGUudXBkYXRlKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCX0KKwkKKwkvLyAqKioqKioqKioqIGNvZGUgYXNzaXN0ICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSXRlcmF0b3I8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5qYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlpZiAoZ2V0Q29udmVydGVyKCkgIT0gbnVsbCkgeworCQkJcmVzdWx0ID0gZ2V0Q29udmVydGVyKCkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOworCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLy8qKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKKwkJdGhpcy5tdXRhYmxlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MzE4YjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtMb2dnaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0xvZ2dpbmcgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLQlpbXBsZW1lbnRzIExvZ2dpbmcKLXsKLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgotCXByaXZhdGUgTG9nZ2luZ0xldmVsIGxldmVsOwotCXByaXZhdGUgQm9vbGVhbiB0aW1lc3RhbXA7Ci0JcHJpdmF0ZSBCb29sZWFuIHRocmVhZDsKLQlwcml2YXRlIEJvb2xlYW4gc2Vzc2lvbjsKLQlwcml2YXRlIEJvb2xlYW4gZXhjZXB0aW9uczsKLQlwcml2YXRlIFN0cmluZyBsb2dGaWxlTG9jYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbG9nZ2VyOyAvLyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUgc2luY2UgdmFsdWUgY2FuIGJlIExvZ2dlciBvciBjdXN0b20gY2xhc3MKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtMb2dnaW5nKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIExpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBwcm9wZXJ0eUxpc3RBZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgcHJvcGVydHlMaXN0QWRhcHRlcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQkvLyBUT1JFVklFVyAtIGhhbmRsZSBpbmNvcnJlY3QgU3RyaW5nIGluIHBlcnNpc3RlbmNlLnhtbAotCQl0aGlzLmxldmVsID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19MRVZFTCwgTG9nZ2luZ0xldmVsLnZhbHVlcygpKTsKLQkJdGhpcy50aW1lc3RhbXAgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1RJTUVTVEFNUCk7Ci0JCXRoaXMudGhyZWFkID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19USFJFQUQpOwotCQl0aGlzLnNlc3Npb24gPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1NFU1NJT04pOwotCQl0aGlzLmV4Y2VwdGlvbnMgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX0VYQ0VQVElPTlMpOwotCQl0aGlzLmxvZ0ZpbGVMb2NhdGlvbiA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19MT0dfRklMRV9MT0NBVElPTik7Ci0JCQotCQlMb2dnZXIgc3RhbmRhcmRMb2dnZXIgPSB0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19MT0dHRVIsIExvZ2dlci52YWx1ZXMoKSk7Ci0JCWlmKCAhIHRoaXMucGVyc2lzdGVuY2VVbml0KCkuY29udGFpbnNQcm9wZXJ0eShFQ0xJUFNFTElOS19MT0dHRVIpKSB7Ci0JCQl0aGlzLmxvZ2dlciA9IG51bGw7Ci0JCX0KLQkJZWxzZSBpZihzdGFuZGFyZExvZ2dlciA9PSBudWxsKSB7Ci0JCQl0aGlzLmxvZ2dlciA9IHRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfTE9HR0VSKTsgLy8gY3VzdG9tIGxvZ2dlcgotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5sb2dnZXIgPSBnZXRFY2xpcHNlTGlua1N0cmluZ1ZhbHVlT2Yoc3RhbmRhcmRMb2dnZXIpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleQotCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTEVWRUwsCi0JCQlMRVZFTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVElNRVNUQU1QLAotCQkJVElNRVNUQU1QX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19USFJFQUQsCi0JCQlUSFJFQURfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFU1NJT04sCi0JCQlTRVNTSU9OX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19FWENFUFRJT05TLAotCQkJRVhDRVBUSU9OU19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTE9HX0ZJTEVfTE9DQVRJT04sCi0JCQlMT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTE9HR0VSLAotCQkJTE9HR0VSX1BST1BFUlRZKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgYXNwZWN0TmFtZSA9IGV2ZW50LmdldEFzcGVjdE5hbWUoKTsKLQkJaWYgKGFzcGVjdE5hbWUuZXF1YWxzKExFVkVMX1BST1BFUlRZKSkgewotCQkJdGhpcy5sZXZlbENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFRJTUVTVEFNUF9QUk9QRVJUWSkpIHsKLQkJCXRoaXMudGltZXN0YW1wQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoVEhSRUFEX1BST1BFUlRZKSkgewotCQkJdGhpcy50aHJlYWRDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhTRVNTSU9OX1BST1BFUlRZKSkgewotCQkJdGhpcy5zZXNzaW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoRVhDRVBUSU9OU19QUk9QRVJUWSkpIHsKLQkJCXRoaXMuZXhjZXB0aW9uc0NoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKExPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZKSkgewotCQkJdGhpcy5sb2dGaWxlTG9jYXRpb25DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhMT0dHRVJfUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLmxvZ2dlckNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBldmVudCByZWNlaXZlZCAtIHByb3BlcnR5IG5vdCBhcHBsaWNhYmxlOiAiICsgYXNwZWN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8vICoqKioqKioqKiogTG9nZ2luZ0xldmVsICoqKioqKioqKioKLQkKLQlwdWJsaWMgTG9nZ2luZ0xldmVsIGdldExldmVsKCkgewotCQlyZXR1cm4gdGhpcy5sZXZlbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGV2ZWwoTG9nZ2luZ0xldmVsIG5ld0xldmVsKSB7Ci0JCUxvZ2dpbmdMZXZlbCBvbGQgPSB0aGlzLmxldmVsOwotCQl0aGlzLmxldmVsID0gbmV3TGV2ZWw7Ci0JCXRoaXMucHV0UHJvcGVydHkoTEVWRUxfUFJPUEVSVFksIG5ld0xldmVsKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExFVkVMX1BST1BFUlRZLCBvbGQsIG5ld0xldmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGV2ZWxDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJTG9nZ2luZ0xldmVsIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIExvZ2dpbmdMZXZlbC52YWx1ZXMoKSk7Ci0JCUxvZ2dpbmdMZXZlbCBvbGQgPSB0aGlzLmxldmVsOwotCQl0aGlzLmxldmVsID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgTG9nZ2luZ0xldmVsIGdldERlZmF1bHRMZXZlbCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfTEVWRUw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUaW1lc3RhbXAgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIHRoaXMudGltZXN0YW1wOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChCb29sZWFuIG5ld1RpbWVzdGFtcCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMudGltZXN0YW1wOwotCQl0aGlzLnRpbWVzdGFtcCA9IG5ld1RpbWVzdGFtcDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShUSU1FU1RBTVBfUFJPUEVSVFksIG5ld1RpbWVzdGFtcCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUSU1FU1RBTVBfUFJPUEVSVFksIG9sZCwgbmV3VGltZXN0YW1wKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGltZXN0YW1wQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMudGltZXN0YW1wOwotCQl0aGlzLnRpbWVzdGFtcCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VGltZXN0YW1wKCkgewotCQlyZXR1cm4gREVGQVVMVF9USU1FU1RBTVA7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUaHJlYWQgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFRocmVhZCgpIHsKLQkJcmV0dXJuIHRoaXMudGhyZWFkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRocmVhZChCb29sZWFuIG5ld1RocmVhZCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMudGhyZWFkOwotCQl0aGlzLnRocmVhZCA9IG5ld1RocmVhZDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShUSFJFQURfUFJPUEVSVFksIG5ld1RocmVhZCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUSFJFQURfUFJPUEVSVFksIG9sZCwgbmV3VGhyZWFkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGhyZWFkQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMudGhyZWFkOwotCQl0aGlzLnRocmVhZCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VGhyZWFkKCkgewotCQlyZXR1cm4gREVGQVVMVF9USFJFQUQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRTZXNzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5zZXNzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oQm9vbGVhbiBuZXdTZXNzaW9uKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zZXNzaW9uOwotCQl0aGlzLnNlc3Npb24gPSBuZXdTZXNzaW9uOwotCQl0aGlzLnB1dFByb3BlcnR5KFNFU1NJT05fUFJPUEVSVFksIG5ld1Nlc3Npb24pOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9QUk9QRVJUWSwgb2xkLCBuZXdTZXNzaW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2Vzc2lvbkNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNlc3Npb247Ci0JCXRoaXMuc2Vzc2lvbiA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0U2Vzc2lvbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0VTU0lPTjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV4Y2VwdGlvbnMgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldEV4Y2VwdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmV4Y2VwdGlvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhjZXB0aW9ucyhCb29sZWFuIG5ld0V4Y2VwdGlvbnMpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmV4Y2VwdGlvbnM7Ci0JCXRoaXMuZXhjZXB0aW9ucyA9IG5ld0V4Y2VwdGlvbnM7Ci0JCXRoaXMucHV0UHJvcGVydHkoRVhDRVBUSU9OU19QUk9QRVJUWSwgbmV3RXhjZXB0aW9ucyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENFUFRJT05TX1BST1BFUlRZLCBvbGQsIG5ld0V4Y2VwdGlvbnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGNlcHRpb25zQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHJpbmdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMuZXhjZXB0aW9uczsKLQkJdGhpcy5leGNlcHRpb25zID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gREVGQVVMVF9FWENFUFRJT05TOwotCX0KLQotCS8vICoqKioqKioqKiogbG9nRmlsZUxvY2F0aW9uICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldExvZ0ZpbGVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMubG9nRmlsZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvZ0ZpbGVMb2NhdGlvbihTdHJpbmcgbmV3TG9nRmlsZUxvY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmxvZ0ZpbGVMb2NhdGlvbjsKLQkJdGhpcy5sb2dGaWxlTG9jYXRpb24gPSBuZXdMb2dGaWxlTG9jYXRpb247Ci0JCXRoaXMucHV0UHJvcGVydHkoTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFksIG5ld0xvZ0ZpbGVMb2NhdGlvbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCBuZXdMb2dGaWxlTG9jYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dGaWxlTG9jYXRpb25DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubG9nRmlsZUxvY2F0aW9uOwotCQl0aGlzLmxvZ0ZpbGVMb2NhdGlvbiA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRMb2dGaWxlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBERUZBVUxUX0xPR19GSUxFX0xPQ0FUSU9OOwotCX0KLQotCS8vICoqKioqKioqKiogTG9nZ2VyICoqKioqKioqKioKLQkvKioKLQkgKiBSZXR1cm5zIExvZ2dlciBvciBjdXN0b20gbG9nZ2VyIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gRWNsaXBzZUxpbmsgc3RyaW5nIHZhbHVlIGZvciBMb2dnZXIgZW51bSBvciBjdXN0b20gbG9nZ2VyIGNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dnZXIoKSB7Ci0JCXJldHVybiB0aGlzLmxvZ2dlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIEVjbGlwc2VMaW5rIGxvZ2dlci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TG9nZ2VyIC0gTG9nZ2VyCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9nZ2VyKExvZ2dlciBuZXdMb2dnZXIpIHsKLQkJaWYoIG5ld0xvZ2dlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldExvZ2dlcl8oKFN0cmluZykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5zZXRMb2dnZXJfKGdldEVjbGlwc2VMaW5rU3RyaW5nVmFsdWVPZihuZXdMb2dnZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIEVjbGlwc2VMaW5rIGxvZ2dlciBvciBjdXN0b20gbG9nZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBuZXdMb2dnZXIgLQotCSAqICAgICAgICAgICAgQ2FuIGJlIGEgRWNsaXBzZUxpbmsgbG9nZ2VyIGxpdGVyYWwgb3IKLQkgKiAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjdXN0b20gbG9nZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvZ2dlcihTdHJpbmcgbmV3TG9nZ2VyKSB7Ci0JCWlmKCBuZXdMb2dnZXIgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRMb2dnZXJfKChTdHJpbmcpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyRm9yKG5ld0xvZ2dlcik7Ci0JCWlmKGxvZ2dlciA9PSBudWxsKSB7CS8vIGN1c3RvbSBMb2dnZXIgY2xhc3MKLQkJCXRoaXMuc2V0TG9nZ2VyXyhuZXdMb2dnZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zZXRMb2dnZXIobG9nZ2VyKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0TG9nZ2VyXyhTdHJpbmcgbmV3TG9nZ2VyKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmxvZ2dlcjsKLQkJdGhpcy5sb2dnZXIgPSBuZXdMb2dnZXI7Ci0JCXRoaXMucHV0UHJvcGVydHkoTE9HR0VSX1BST1BFUlRZLCBuZXdMb2dnZXIpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTE9HR0VSX1BST1BFUlRZLCBvbGQsIG5ld0xvZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ2dlckNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgbmV3VmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlTdHJpbmcgb2xkID0gdGhpcy5sb2dnZXI7Ci0JCXRoaXMubG9nZ2VyID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdExvZ2dlcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfTE9HR0VSOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2xvZ2dpbmcvTG9nZ2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9sb2dnaW5nL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWM1ZDFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2xvZ2dpbmcvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmxvZ2dpbmc7Ci0KLS8qKgotICogTG9nZ2VyCi0gKi8KLXB1YmxpYyBlbnVtIExvZ2dlciB7Ci0JCQlkZWZhdWx0X2xvZ2dlciwgCi0JCQlqYXZhX2xvZ2dlciwgCi0JCQlzZXJ2ZXJfbG9nZ2VyOwotCQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HR0VSID0gIkRlZmF1bHRMb2dnZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTE9HR0VSID0gIkphdmFMb2dnZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9MT0dHRVIgPSAiU2VydmVyTG9nZ2VyIjsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIExvZ2dlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaXRlcmFsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9nZ2VyIGdldExvZ2dlckZvcihTdHJpbmcgbGl0ZXJhbCkgewotCQkKLQkJZm9yKCBMb2dnZXIgbG9nZ2VyIDogTG9nZ2VyLnZhbHVlcygpKSB7Ci0JCQlpZihsb2dnZXIudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gbG9nZ2VyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9sb2dnaW5nL0xvZ2dpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2xvZ2dpbmcvTG9nZ2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWUwYjRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2xvZ2dpbmcvTG9nZ2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqIExvZ2dpbmcKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2dnaW5nIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotewotCUxvZ2dpbmdMZXZlbCBnZXREZWZhdWx0TGV2ZWwoKTsKLQlMb2dnaW5nTGV2ZWwgZ2V0TGV2ZWwoKTsKLQl2b2lkIHNldExldmVsKExvZ2dpbmdMZXZlbCBsZXZlbCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxfUFJPUEVSVFkgPSAibGV2ZWxQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19MRVZFTCA9ICJlY2xpcHNlbGluay5sb2dnaW5nLmxldmVsIjsKLQkJc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBERUZBVUxUX0xFVkVMID0gTG9nZ2luZ0xldmVsLmluZm87Ci0JCi0JQm9vbGVhbiBnZXREZWZhdWx0VGltZXN0YW1wKCk7Ci0JQm9vbGVhbiBnZXRUaW1lc3RhbXAoKTsKLQl2b2lkIHNldFRpbWVzdGFtcChCb29sZWFuIHRpbWVzdGFtcCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVNUQU1QX1BST1BFUlRZID0gInRpbWVzdGFtcFByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1RJTUVTVEFNUCA9ICJlY2xpcHNlbGluay5sb2dnaW5nLnRpbWVzdGFtcCI7Ci0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfVElNRVNUQU1QID0gQm9vbGVhbi5UUlVFOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFRocmVhZCgpOwotCUJvb2xlYW4gZ2V0VGhyZWFkKCk7Ci0Jdm9pZCBzZXRUaHJlYWQoQm9vbGVhbiB0aHJlYWQpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9QUk9QRVJUWSA9ICJ0aHJlYWRQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19USFJFQUQgPSAiZWNsaXBzZWxpbmsubG9nZ2luZy50aHJlYWQiOwotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1RIUkVBRCA9IEJvb2xlYW4uVFJVRTsKLQkKLQlCb29sZWFuIGdldERlZmF1bHRTZXNzaW9uKCk7Ci0JQm9vbGVhbiBnZXRTZXNzaW9uKCk7Ci0Jdm9pZCBzZXRTZXNzaW9uKEJvb2xlYW4gc2Vzc2lvbik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9QUk9QRVJUWSA9ICJzZXNzaW9uUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTiA9ICJlY2xpcHNlbGluay5sb2dnaW5nLnNlc3Npb24iOwotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1NFU1NJT04gPSBCb29sZWFuLlRSVUU7Ci0JCi0JQm9vbGVhbiBnZXREZWZhdWx0RXhjZXB0aW9ucygpOwotCUJvb2xlYW4gZ2V0RXhjZXB0aW9ucygpOwotCXZvaWQgc2V0RXhjZXB0aW9ucyhCb29sZWFuIGV4Y2VwdGlvbnMpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTlNfUFJPUEVSVFkgPSAiZXhjZXB0aW9uc1Byb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0VYQ0VQVElPTlMgPSAiZWNsaXBzZWxpbmsubG9nZ2luZy5leGNlcHRpb25zIjsKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9FWENFUFRJT05TID0gQm9vbGVhbi5GQUxTRTsKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRMb2dGaWxlTG9jYXRpb24oKTsKLQlTdHJpbmcgZ2V0TG9nRmlsZUxvY2F0aW9uKCk7Ci0Jdm9pZCBzZXRMb2dGaWxlTG9jYXRpb24oU3RyaW5nIG5ld0xvZ0ZpbGVMb2NhdGlvbik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFkgPSAibG9nRmlsZUxvY2F0aW9uUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfTE9HX0ZJTEVfTE9DQVRJT04gPSAiZWNsaXBzZWxpbmsubG9nZ2luZy5maWxlIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xPR19GSUxFX0xPQ0FUSU9OID0gbnVsbDsJCS8vIE5vIERlZmF1bHQKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRMb2dnZXIoKTsKLQlTdHJpbmcgZ2V0TG9nZ2VyKCk7Ci0Jdm9pZCBzZXRMb2dnZXIoU3RyaW5nIG5ld0xvZ2dlcik7Ci0Jdm9pZCBzZXRMb2dnZXIoTG9nZ2VyIG5ld0xvZ2dlcik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0VSX1BST1BFUlRZID0gImxvZ2dlclByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0xPR0dFUiA9ICJlY2xpcHNlbGluay5sb2dnaW5nLmxvZ2dlciI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0dHRVIgPSAKLQkJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5nZXRFY2xpcHNlTGlua1N0cmluZ1ZhbHVlT2YoTG9nZ2VyLmRlZmF1bHRfbG9nZ2VyKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvbG9nZ2luZy9Mb2dnaW5nTGV2ZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2xvZ2dpbmcvTG9nZ2luZ0xldmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MGY0NzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvbG9nZ2luZy9Mb2dnaW5nTGV2ZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZzsKLQotLyoqCi0gKiAgTG9nZ2luZ0xldmVsCi0gKi8KLXB1YmxpYyBlbnVtIExvZ2dpbmdMZXZlbCB7Ci0JCQlvZmYsIAotCQkJc2V2ZXJlLCAKLQkJCXdhcm5pbmcsIAotCQkJaW5mbywgCi0JCQljb25maWcsIAotCQkJZmluZSwgCi0JCQlmaW5lciwgCi0JCQlmaW5lc3Q7Ci0KLQkvLyBFY2xpcHNlTGluayB2YWx1ZSBzdHJpbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPRkYgPSAiT0ZGIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVZFUkUgPSAiU0VWRVJFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HID0gIldBUk5JTkciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElORk8gPSAiSU5GTyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHID0gIkNPTkZJRyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklORSA9ICJGSU5FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5FUiA9ICJGSU5FUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklORVNUID0gIkZJTkVTVCI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9ucy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhMzc2OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqICBFY2xpcHNlTGlua09wdGlvbnMKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3B0aW9ucyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotCWltcGxlbWVudHMgT3B0aW9ucwotewotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBTdHJpbmcgc2Vzc2lvbk5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgc2Vzc2lvbnNYbWw7Ci0JcHJpdmF0ZSBCb29sZWFuIGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllczsKLQlwcml2YXRlIFRhcmdldERhdGFiYXNlIHRhcmdldERhdGFiYXNlOwotCXByaXZhdGUgU3RyaW5nIGV2ZW50TGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcHRpb25zKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIExpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBwcm9wZXJ0eUxpc3RBZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgcHJvcGVydHlMaXN0QWRhcHRlcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQkvLyBUT1JFVklFVyAtIGhhbmRsZSBpbmNvcnJlY3QgU3RyaW5nIGluIHBlcnNpc3RlbmNlLnhtbAotCQl0aGlzLnNlc3Npb25OYW1lID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1NFU1NJT05fTkFNRSk7Ci0JCXRoaXMuc2Vzc2lvbnNYbWwgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfU0VTU0lPTlNfWE1MKTsKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMpOwotCQl0aGlzLnRhcmdldERhdGFiYXNlID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19UQVJHRVRfREFUQUJBU0UsIFRhcmdldERhdGFiYXNlLnZhbHVlcygpKTsKLQkJdGhpcy5ldmVudExpc3RlbmVyID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1NFU1NJT05fRVZFTlRfTElTVEVORVIpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCS8qKgotCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCi0JICogCQlrZXkgPSBFY2xpcHNlTGluayBwcm9wZXJ0eSBrZXkKLQkgKiAJCXZhbHVlID0gcHJvcGVydHkgaWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFU1NJT05fTkFNRSwKLQkJCVNFU1NJT05fTkFNRV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfU0VTU0lPTlNfWE1MLAotCQkJU0VTU0lPTlNfWE1MX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTLAotCQkJU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVEFSR0VUX0RBVEFCQVNFLAotCQkJVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGFzcGVjdE5hbWUgPSBldmVudC5nZXRBc3BlY3ROYW1lKCk7Ci0JCWlmIChhc3BlY3ROYW1lLmVxdWFscyhTRVNTSU9OX05BTUVfUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLnNlc3Npb25OYW1lQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoU0VTU0lPTlNfWE1MX1BST1BFUlRZKSkgewotCQkJdGhpcy5zZXNzaW9uc1htbENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKFRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSkpIHsKLQkJCXRoaXMudGFyZ2V0RGF0YWJhc2VDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhTRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKSkgewotCQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZKSkgewotCQkJdGhpcy5ldmVudExpc3RlbmVyQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGV2ZW50IHJlY2VpdmVkIC0gcHJvcGVydHkgbm90IGFwcGxpY2FibGU6ICIgKyBhc3BlY3ROYW1lKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uTmFtZSAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRTZXNzaW9uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2Vzc2lvbk5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2Vzc2lvbk5hbWUoU3RyaW5nIG5ld1Nlc3Npb25OYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNlc3Npb25OYW1lOwotCQl0aGlzLnNlc3Npb25OYW1lID0gbmV3U2Vzc2lvbk5hbWU7Ci0JCXRoaXMucHV0UHJvcGVydHkoU0VTU0lPTl9OQU1FX1BST1BFUlRZLCBuZXdTZXNzaW9uTmFtZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OX05BTUVfUFJPUEVSVFksIG9sZCwgbmV3U2Vzc2lvbk5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXNzaW9uTmFtZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgbmV3VmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlTdHJpbmcgb2xkID0gdGhpcy5zZXNzaW9uTmFtZTsKLQkJdGhpcy5zZXNzaW9uTmFtZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTZXNzaW9uTmFtZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0VTU0lPTl9OQU1FOwotCX0KLQotCQkvLyAqKioqKioqKioqIFNlc3Npb25zWG1sICoqKioqKioqKioKLQkJcHVibGljIFN0cmluZyBnZXRTZXNzaW9uc1htbCgpIHsKLQkJCXJldHVybiB0aGlzLnNlc3Npb25zWG1sOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U2Vzc2lvbnNYbWwoU3RyaW5nIG5ld1Nlc3Npb25zWG1sKSB7Ci0JCQlTdHJpbmcgb2xkID0gdGhpcy5zZXNzaW9uc1htbDsKLQkJCXRoaXMuc2Vzc2lvbnNYbWwgPSBuZXdTZXNzaW9uc1htbDsKLQkJCXRoaXMucHV0UHJvcGVydHkoU0VTU0lPTlNfWE1MX1BST1BFUlRZLCBuZXdTZXNzaW9uc1htbCk7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTlNfWE1MX1BST1BFUlRZLCBvbGQsIG5ld1Nlc3Npb25zWG1sKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzZXNzaW9uc1htbENoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJU3RyaW5nIG5ld1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJCVN0cmluZyBvbGQgPSB0aGlzLnNlc3Npb25zWG1sOwotCQkJdGhpcy5zZXNzaW9uc1htbCA9IG5ld1ZhbHVlOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTZXNzaW9uc1htbCgpIHsKLQkJCXJldHVybiBERUZBVUxUX1NFU1NJT05TX1hNTDsKLQkJfQotCi0JLy8gKioqKioqKioqKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpIHsKLQkJcmV0dXJuIHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyhCb29sZWFuIG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcykgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzOwotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyA9IG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllczsKLQkJdGhpcy5wdXRQcm9wZXJ0eShTRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZLCBuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSwgb2xkLCBuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXM7Ci0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUYXJnZXREYXRhYmFzZSAqKioqKioqKioqCi0JcHVibGljIFRhcmdldERhdGFiYXNlIGdldFRhcmdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXREYXRhYmFzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RGF0YWJhc2UoVGFyZ2V0RGF0YWJhc2UgbmV3VGFyZ2V0RGF0YWJhc2UpIHsKLQkJVGFyZ2V0RGF0YWJhc2Ugb2xkID0gdGhpcy50YXJnZXREYXRhYmFzZTsKLQkJdGhpcy50YXJnZXREYXRhYmFzZSA9IG5ld1RhcmdldERhdGFiYXNlOwotCQl0aGlzLnB1dFByb3BlcnR5KFRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSwgbmV3VGFyZ2V0RGF0YWJhc2UpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZLCBvbGQsIG5ld1RhcmdldERhdGFiYXNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGFyZ2V0RGF0YWJhc2VDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJVGFyZ2V0RGF0YWJhc2UgbmV3VmFsdWUgPSBnZXRFbnVtVmFsdWVPZihzdHJpbmdWYWx1ZSwgVGFyZ2V0RGF0YWJhc2UudmFsdWVzKCkpOwotCQlUYXJnZXREYXRhYmFzZSBvbGQgPSB0aGlzLnRhcmdldERhdGFiYXNlOwotCQl0aGlzLnRhcmdldERhdGFiYXNlID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgVGFyZ2V0RGF0YWJhc2UgZ2V0RGVmYXVsdFRhcmdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gREVGQVVMVF9UQVJHRVRfREFUQUJBU0U7Ci0JfQotCi0JLy8gKioqKioqKioqKiBFdmVudExpc3RlbmVyICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldEV2ZW50TGlzdGVuZXIoKSB7Ci0JCXJldHVybiB0aGlzLmV2ZW50TGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXZlbnRMaXN0ZW5lcihTdHJpbmcgbmV3RXZlbnRMaXN0ZW5lcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5ldmVudExpc3RlbmVyOwotCQl0aGlzLmV2ZW50TGlzdGVuZXIgPSBuZXdFdmVudExpc3RlbmVyOwotCQl0aGlzLnB1dFByb3BlcnR5KFNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFksIG5ld0V2ZW50TGlzdGVuZXIpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSwgb2xkLCBuZXdFdmVudExpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXZlbnRMaXN0ZW5lckNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgbmV3VmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlTdHJpbmcgb2xkID0gdGhpcy5ldmVudExpc3RlbmVyOwotCQl0aGlzLmV2ZW50TGlzdGVuZXIgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RXZlbnRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0VTU0lPTl9FVkVOVF9MSVNURU5FUjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcHRpb25zL09wdGlvbnMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29wdGlvbnMvT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzkxYmIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29wdGlvbnMvT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLQotLyoqCi0gKiAgU2Vzc2lvbiBPcHRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3B0aW9ucyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLXsKLQlTdHJpbmcgZ2V0RGVmYXVsdFNlc3Npb25OYW1lKCk7Ci0JU3RyaW5nIGdldFNlc3Npb25OYW1lKCk7Ci0Jdm9pZCBzZXRTZXNzaW9uTmFtZShTdHJpbmcgbmV3U2Vzc2lvbk5hbWUpOyAKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX05BTUVfUFJPUEVSVFkgPSAic2Vzc2lvbk5hbWVQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TRVNTSU9OX05BTUUgPSAiZWNsaXBzZWxpbmsuc2Vzc2lvbi1uYW1lIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFU1NJT05fTkFNRSA9ICIiOwkvLyBubyBkZWZhdWx0Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdFNlc3Npb25zWG1sKCk7Ci0JU3RyaW5nIGdldFNlc3Npb25zWG1sKCk7Ci0Jdm9pZCBzZXRTZXNzaW9uc1htbChTdHJpbmcgbmV3U2Vzc2lvbnNYbWwpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05TX1hNTF9QUk9QRVJUWSA9ICJzZXNzaW9uc1htbFByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFU1NJT05TX1hNTCA9ICJlY2xpcHNlbGluay5zZXNzaW9ucy14bWwiOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VTU0lPTlNfWE1MID0gIiI7CS8vIG5vIGRlZmF1bHQKLQkJCi0JQm9vbGVhbiBnZXREZWZhdWx0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7Ci0JQm9vbGVhbiBnZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKTsKLQl2b2lkIHNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyhCb29sZWFuIG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSA9ICJpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTID0gImVjbGlwc2VsaW5rLnNlc3Npb24uaW5jbHVkZS5kZXNjcmlwdG9yLnF1ZXJpZXMiOwotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMgPSBCb29sZWFuLlRSVUU7Ci0JCQotCVRhcmdldERhdGFiYXNlIGdldERlZmF1bHRUYXJnZXREYXRhYmFzZSgpOwotCVRhcmdldERhdGFiYXNlIGdldFRhcmdldERhdGFiYXNlKCk7Ci0Jdm9pZCBzZXRUYXJnZXREYXRhYmFzZShUYXJnZXREYXRhYmFzZSBuZXdUYXJnZXREYXRhYmFzZSk7IC8vIHB1dAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSA9ICJ0YXJnZXREYXRhYmFzZVByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1RBUkdFVF9EQVRBQkFTRSA9ICJlY2xpcHNlbGluay50YXJnZXQtZGF0YWJhc2UiOwotCQlzdGF0aWMgZmluYWwgVGFyZ2V0RGF0YWJhc2UgREVGQVVMVF9UQVJHRVRfREFUQUJBU0UgPSBUYXJnZXREYXRhYmFzZS5hdXRvOwotCi0JU3RyaW5nIGdldERlZmF1bHRFdmVudExpc3RlbmVyKCk7Ci0JU3RyaW5nIGdldEV2ZW50TGlzdGVuZXIoKTsKLQl2b2lkIHNldEV2ZW50TGlzdGVuZXIoU3RyaW5nIG5ld0V2ZW50TGlzdGVuZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFkgPSAiZXZlbnRMaXN0ZW5lclByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFU1NJT05fRVZFTlRfTElTVEVORVIgPSAiZWNsaXBzZWxpbmsuc2Vzc2lvbi1ldmVudC1saXN0ZW5lciI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVNTSU9OX0VWRU5UX0xJU1RFTkVSID0gbnVsbDsJLy8gbm8gZGVmYXVsdAotCQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVIgPSAiZWNsaXBzZWxpbmsudGFyZ2V0LXNlcnZlciI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29wdGlvbnMvVGFyZ2V0RGF0YWJhc2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29wdGlvbnMvVGFyZ2V0RGF0YWJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0Yjk4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcHRpb25zL1RhcmdldERhdGFiYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcHRpb25zOwotCi0vKioKLSAqICBUYXJnZXREYXRhYmFzZQotICovCi1wdWJsaWMgZW51bSBUYXJnZXREYXRhYmFzZSB7Ci0JCQlhdHR1bml0eSwKLQkJCWF1dG8sCi0JCQljbG91ZHNjYXBlLAotCQkJZGF0YWJhc2UsCi0JCQlkYjIsCi0JCQlkYjJtYWluZnJhbWUsCi0JCQlkYmFzZSwKLQkJCWRlcmJ5LAotCQkJaHNxbCwKLQkJCWluZm9ybWl4LAotCQkJamF2YWRiLAotCQkJbXlzcWw0LAotCQkJb3JhY2xlLAotCQkJcG9pbnRiYXNlLAotCQkJcG9zdGdyZXNxbCwKLQkJCXNxbGFueXdoZXJlLAotCQkJc3Fsc2VydmVyLAotCQkJc3liYXNlLAotCQkJdGltZXN0ZW47Ci0KLQkvLyBFY2xpcHNlTGluayB2YWx1ZSBzdHJpbmcKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFVOSVRZID0gIkF0dHVuaXR5IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE8gPSAiQXV0byI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDTE9VRFNDQVBFID0gIkNsb3Vkc2NhcGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQUJBU0UgPSAiRGF0YWJhc2UiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREIyID0gIkRCMiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQjJNQUlORlJBTUUgPSAiREIyTWFpbmZyYW1lIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERCQVNFID0gIkRCYXNlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFUkJZID0gIkRlcmJ5IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhTUUwgPSAiSFNRTCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPUk1JWCA9ICJJbmZvcm1peCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBREIgPSAiSmF2YURCIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1ZU1FMNCA9ICJNeVNRTDQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JBQ0xFID0gIk9yYWNsZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQT0lOVEJBU0UgPSAiUG9pbnRCYXNlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RHUkVTUUwgPSAiUG9zdGdyZVNRTCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTUUxBTllXSEVSRSA9ICJTUUxBbnlXaGVyZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTUUxTRVJWRVIgPSAiU1FMU2VydmVyIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNZQkFTRSA9ICJTeWJhc2UiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVNURU4gPSAiVGltZXNUZW4iOwotCi19Ci0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29wdGlvbnMvVGFyZ2V0U2VydmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcHRpb25zL1RhcmdldFNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzExYzg4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29wdGlvbnMvVGFyZ2V0U2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcHRpb25zOwotCi0vKioKLSAqICBUYXJnZXRTZXJ2ZXIKLSAqLwotcHVibGljIGVudW0gVGFyZ2V0U2VydmVyIHsKLQkJCW5vbmUsCi0JCQlvYzRqXzEwXzFfMywKLQkJCW9jNGpfMTFfMV8xLAotCQkJc3VuYXM5OwotCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIk5vbmUiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgT0M0Sl8xMF8xXzMgPSAiT0M0Sl8xMF8xXzMiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgT0M0Sl8xMV8xXzEgPSAiT0M0Sl8xMV8xXzEiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU1VOQVM5ID0gIlN1bkFTOSI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxMzRmMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzSW1wbC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RFbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NJbXBsCisJZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzCit7CisKKwlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgY29udmVydGVySG9sZGVyOworCQorCXB1YmxpYyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzSW1wbChPcm1YbWwgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZSkgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlKTsKKwkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIgPSBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIodGhpcywgKFhtbEVudGl0eU1hcHBpbmdzKSB0aGlzLnhtbEVudGl0eU1hcHBpbmdzKTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKiBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJcHVibGljIEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIGdldENvbnZlcnRlckhvbGRlcigpIHsKKwkJcmV0dXJuIHRoaXMuY29udmVydGVySG9sZGVyOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLmNvbnZlcnRlckhvbGRlci51cGRhdGUoKTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBsYXRlc3REb2N1bWVudFZlcnNpb24oKSB7CisJCXJldHVybiBnZXRKcGFQbGF0Zm9ybSgpLmdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoCisJCQkJSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKS5nZXRWZXJzaW9uKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTEzY2EwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNmb3JtYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkKK3sJCisKKwkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rLXNwZWNpZmljIE9STSBDb250ZXh0IE1vZGVsICoqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50aXR5TWFwcGluZ3MgYnVpbGRFbnRpdHlNYXBwaW5ncyhPcm1YbWwgcGFyZW50LCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzSW1wbChwYXJlbnQsIChYbWxFbnRpdHlNYXBwaW5ncykgeG1sRW50aXR5TWFwcGluZ3MpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlLk93bmVyIG93bmVyLCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUocGFyZW50LCBvd25lciwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtRW1iZWRkYWJsZSBidWlsZE9ybUVtYmVkZGFibGUoT3JtUGVyc2lzdGVudFR5cGUgdHlwZSwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlSW1wbCh0eXBlLCAoWG1sRW1iZWRkYWJsZSkgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtRW50aXR5IGJ1aWxkT3JtRW50aXR5KE9ybVBlcnNpc3RlbnRUeXBlIHR5cGUsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbnRpdHlJbXBsKHR5cGUsIChYbWxFbnRpdHkpIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1NYXBwZWRTdXBlcmNsYXNzIGJ1aWxkT3JtTWFwcGVkU3VwZXJjbGFzcyhPcm1QZXJzaXN0ZW50VHlwZSB0eXBlLCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NJbXBsKHR5cGUsIChYbWxNYXBwZWRTdXBlcmNsYXNzKSByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtQmFzaWNNYXBwaW5nIGJ1aWxkT3JtQmFzaWNNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcocGFyZW50LCAoWG1sQmFzaWMpIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1JZE1hcHBpbmcgYnVpbGRPcm1JZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZyhwYXJlbnQsIChYbWxJZCkgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybU1hbnlUb01hbnlNYXBwaW5nIGJ1aWxkT3JtTWFueVRvTWFueU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55IHJlc291cmNlTWFwcGluZykgeworCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcocGFyZW50LCAoWG1sTWFueVRvTWFueSkgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybU1hbnlUb09uZU1hcHBpbmcgYnVpbGRPcm1NYW55VG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZykgeworCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZyhwYXJlbnQsIChYbWxNYW55VG9PbmUpIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1PbmVUb01hbnlNYXBwaW5nIGJ1aWxkT3JtT25lVG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcocGFyZW50LCAoWG1sT25lVG9NYW55KSByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtT25lVG9PbmVNYXBwaW5nIGJ1aWxkT3JtT25lVG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcocGFyZW50LCAoWG1sT25lVG9PbmUpIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1WZXJzaW9uTWFwcGluZyBidWlsZE9ybVZlcnNpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKHBhcmVudCwgKFhtbFZlcnNpb24pIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcgYnVpbGRPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljQ29sbGVjdGlvbiByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcgYnVpbGRPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWNNYXAgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgYnVpbGRPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sVHJhbnNmb3JtYXRpb24gcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyBidWlsZE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbFZhcmlhYmxlT25lVG9PbmUgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmstc3BlY2lmaWMgT1JNIFZpcnR1YWwgUmVzb3VyY2UgTW9kZWwgKioqKioqKioqKgorCQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEJhc2ljIGJ1aWxkVmlydHVhbFhtbEJhc2ljKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpYyhvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxJZCBidWlsZFZpcnR1YWxYbWxJZChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUlkTWFwcGluZyBqYXZhSWRNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sSWQob3JtVHlwZU1hcHBpbmcsIGphdmFJZE1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sRW1iZWRkZWRJZCBidWlsZFZpcnR1YWxYbWxFbWJlZGRlZElkKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRW1iZWRkZWRJZE1hcHBpbmcgamF2YUVtYmVkZGVkSWRNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWRJZChvcm1UeXBlTWFwcGluZywgamF2YUVtYmVkZGVkSWRNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEVtYmVkZGVkIGJ1aWxkVmlydHVhbFhtbEVtYmVkZGVkKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRW1iZWRkZWRNYXBwaW5nIGphdmFFbWJlZGRlZE1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZChvcm1UeXBlTWFwcGluZywgamF2YUVtYmVkZGVkTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxNYW55VG9NYW55IGJ1aWxkVmlydHVhbFhtbE1hbnlUb01hbnkoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55KG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFueVRvTWFueU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sTWFueVRvT25lIGJ1aWxkVmlydHVhbFhtbE1hbnlUb09uZShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YU1hbnlUb09uZU1hcHBpbmcgamF2YU1hbnlUb09uZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9PbmUob3JtVHlwZU1hcHBpbmcsIGphdmFNYW55VG9PbmVNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbE9uZVRvTWFueSBidWlsZFZpcnR1YWxYbWxPbmVUb01hbnkoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55KG9ybVR5cGVNYXBwaW5nLCAoSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgamF2YU9uZVRvTWFueU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sT25lVG9PbmUgYnVpbGRWaXJ0dWFsWG1sT25lVG9PbmUoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFPbmVUb09uZU1hcHBpbmcgamF2YU9uZVRvT25lTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvT25lKG9ybVR5cGVNYXBwaW5nLCBqYXZhT25lVG9PbmVNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbFZlcnNpb24gYnVpbGRWaXJ0dWFsWG1sVmVyc2lvbihPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YVZlcnNpb25NYXBwaW5nIGphdmFWZXJzaW9uTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFZlcnNpb24ob3JtVHlwZU1hcHBpbmcsIGphdmFWZXJzaW9uTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxUcmFuc2llbnQgYnVpbGRWaXJ0dWFsWG1sVHJhbnNpZW50KE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhVHJhbnNpZW50TWFwcGluZyBqYXZhVHJhbnNpZW50TWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zaWVudChvcm1UeXBlTWFwcGluZywgamF2YVRyYW5zaWVudE1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgWG1sQmFzaWNDb2xsZWN0aW9uIGJ1aWxkVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNDb2xsZWN0aW9uKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nIGphdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNDb2xsZWN0aW9uKG9ybVR5cGVNYXBwaW5nLCBqYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBYbWxCYXNpY01hcCBidWlsZFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcgamF2YUJhc2ljTWFwTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwKG9ybVR5cGVNYXBwaW5nLCBqYXZhQmFzaWNNYXBNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIFhtbFRyYW5zZm9ybWF0aW9uIGJ1aWxkVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24oT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyBqYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24ob3JtVHlwZU1hcHBpbmcsIGphdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgWG1sVmFyaWFibGVPbmVUb09uZSBidWlsZFZpcnR1YWxFY2xpcHNlTGlua1htbFZhcmlhYmxlT25lVG9PbmUoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nIGphdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFZhcmlhYmxlT25lVG9PbmUob3JtVHlwZU1hcHBpbmcsIGphdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxOdWxsQXR0cmlidXRlTWFwcGluZyBidWlsZFZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZyhPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxOdWxsQXR0cmlidXRlTWFwcGluZyhvcm1UeXBlTWFwcGluZywgamF2YUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTk0MDhlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5OdWxsT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVudGl0eURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0T3JtWG1sRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybVhtbERlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJCW5ldyBFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybVhtbERlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0U7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkoKTsKKwl9CisKKwlwdWJsaWMgSnBhUmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKKwkJcmV0dXJuIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFOworCX0KKwkKKwkKKwkvLyAqKioqKioqKiogT1JNIHR5cGUgbWFwcGluZ3MgKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKKwkJLy8gb3JkZXIgc2hvdWxkIG5vdCBtYXR0ZXIgaGVyZSwgYnV0IHdlJ2xsIHVzZSB0aGUgc2FtZSBvcmRlciBhcyBmb3IgamF2YQorCQkvLyBAc2VlIHtAbGluayBFY2xpcHNlTGlua0pwYVBsYXRmb3JtUHJvdmlkZXJ9CisJCXJldHVybiBuZXcgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uW10geworCQkJT3JtRW50aXR5RGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmluc3RhbmNlKCl9OworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIE9STSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgeworCQkvLyBvcmRlciBzaG91bGQgbm90IG1hdHRlciBoZXJlLCBidXQgd2UnbGwgdXNlIHRoZSBzYW1lIG9yZGVyIGFzIGZvciBqYXZhCisJCS8vIEBzZWUge0BsaW5rIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlcn0KKwkJcmV0dXJuIG5ldyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKKwkJCU9ybVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybUlkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1PbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzM5OTE5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbjsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZworCWV4dGVuZHMgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFhtbEJhc2ljQ29sbGVjdGlvbj4gCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcKK3sKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxCYXNpY0NvbGxlY3Rpb24gcmVzb3VyY2VNYXBwaW5nKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgeworCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZyh0aGlzKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7CisJCSgoQXR0cmlidXRlcykgcmVzb3VyY2VBdHRyaWJ1dGVzKS5nZXRCYXNpY0NvbGxlY3Rpb25zKCkuYWRkKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7CisJCSgoQXR0cmlidXRlcykgcmVzb3VyY2VBdHRyaWJ1dGVzKS5nZXRCYXNpY0NvbGxlY3Rpb25zKCkucmVtb3ZlKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisKKwlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgeworCQlyZXR1cm4gMjM7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiZmYxYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb247CisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uCisJaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJCW5ldyBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBFbWZUb29scy5jcmVhdGUoCisJCQkJZmFjdG9yeSwgCisJCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXNpY0NvbGxlY3Rpb24oKSwgCisJCQkJWG1sQmFzaWNDb2xsZWN0aW9uLmNsYXNzKTsKKwl9CisJCisJcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKKwkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKKwkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiAoKEVjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5KSBmYWN0b3J5KS4KKwkJCQlidWlsZE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyhwYXJlbnQsIChYbWxCYXNpY0NvbGxlY3Rpb24pIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFJlc291cmNlTWFwcGluZygKKwkJCU9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCAKKwkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiAoKEVjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5KSBmYWN0b3J5KS4KKwkJCQlidWlsZFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbihvcm1UeXBlTWFwcGluZywgKEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZGU2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwOworCitwdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxYbWxCYXNpY01hcD4gCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZworeworCXB1YmxpYyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWNNYXAgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgeworCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZyh0aGlzKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX01BUF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFRvUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKKwkJKChBdHRyaWJ1dGVzKSByZXNvdXJjZUF0dHJpYnV0ZXMpLmdldEJhc2ljTWFwcygpLmFkZCh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworCQkoKEF0dHJpYnV0ZXMpIHJlc291cmNlQXR0cmlidXRlcykuZ2V0QmFzaWNNYXBzKCkucmVtb3ZlKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisKKwkKKwlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgeworCQlyZXR1cm4gMjc7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhODlhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwOworCitwdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uCisJaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCisJICovCisJcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbnNmb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX01BUF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKKwkJCQlmYWN0b3J5LCAKKwkJCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2ljTWFwKCksIAorCQkJCVhtbEJhc2ljTWFwLmNsYXNzKTsKKwl9CisJCisJcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKKwkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKKwkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiAoKEVjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5KSBmYWN0b3J5KS4KKwkJCQlidWlsZE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKHBhcmVudCwgKFhtbEJhc2ljTWFwKSByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFZpcnR1YWxSZXNvdXJjZU1hcHBpbmcoCisJCQlPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgCisJCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZywgCisJCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gKChFY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeSkgZmFjdG9yeSkuCisJCQkJYnVpbGRWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcChvcm1UeXBlTWFwcGluZywgKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZykgamF2YUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ1Yjg1NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdE9ybUJhc2ljTWFwcGluZzxYbWxCYXNpYz4KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nCit7CisJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlOworCQorCQorCXB1YmxpYyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWMgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwkJdGhpcy5tdXRhYmxlID0gbmV3IE9ybUVjbGlwc2VMaW5rTXV0YWJsZSh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCQorCQorCXB1YmxpYyBFY2xpcHNlTGlua011dGFibGUgZ2V0TXV0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMubXV0YWJsZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGJ1aWxkU3BlY2lmaWVkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7CisJCU9ybUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBzdXBlci5idWlsZFNwZWNpZmllZENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlKTsKKwkJaWYgKG9ybUNvbnZlcnRlciAhPSBudWxsKSB7CisJCQlyZXR1cm4gb3JtQ29udmVydGVyOworCQl9CisJCWlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSB7CisJCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydCh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKSB7CisJCS8vY2hlY2sgQENvbnZlcnQgZmlyc3QsIHRoaXMgaXMgdGhlIG9yZGVyIHRoYXQgRWNsaXBzZUxpbmsgc2VhcmNoZXMKKwkJaWYgKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnQoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVI7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlQ29udmVydGVyVHlwZSgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlLWNvbnRleHQgaW50ZXJhY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5tdXRhYmxlLnVwZGF0ZSgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCS8vIFRPRE8gLSBtdXRhYmxlIHZhbGlkYXRpb24KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDYWNoaW5nSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZ0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWI3ZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZ0ltcGwuamF2YQpAQCAtMCwwICsxLDcwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGVIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheTsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQ2FjaGluZ0ltcGwgCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyAKKwkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nLAorCQlPcm1DYWNoZWFibGVIb2xkZXIyXzAKK3sKKwlwcm90ZWN0ZWQgZmluYWwgWG1sQ2FjaGVIb2xkZXIgcmVzb3VyY2U7CisJCisJcHJvdGVjdGVkIGludCBkZWZhdWx0U2l6ZTsKKwlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRTaXplOworCQorCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRTaGFyZWQ7CisJcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkU2hhcmVkOworCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlVHlwZSBkZWZhdWx0VHlwZTsKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZVR5cGUgc3BlY2lmaWVkVHlwZTsKKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0QWx3YXlzUmVmcmVzaDsKKwlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRBbHdheXNSZWZyZXNoOworCQorCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXI7CisJcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOworCQorCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHREaXNhYmxlSGl0czsKKwlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWREaXNhYmxlSGl0czsKKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZGVmYXVsdENvb3JkaW5hdGlvblR5cGU7CisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHNwZWNpZmllZENvb3JkaW5hdGlvblR5cGU7CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBzcGVjaWZpZWRFeGlzdGVuY2VUeXBlOworCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZGVmYXVsdEV4aXN0ZW5jZVR5cGU7CisJCisJcHJvdGVjdGVkIEludGVnZXIgZXhwaXJ5OworCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSBleHBpcnlUaW1lT2ZEYXk7CisKKwlwcm90ZWN0ZWQgZmluYWwgT3JtQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZTsKKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDYWNoaW5nSW1wbChPcm1UeXBlTWFwcGluZyBwYXJlbnQsIFhtbENhY2hlSG9sZGVyIHJlc291cmNlLCBYbWxDYWNoZWFibGUyXzAgY2FjaGVhYmxlUmVzb3VyY2UsIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNhY2hpbmcpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCQlYbWxDYWNoZSByZXNvdXJjZUNhY2hlID0gZ2V0UmVzb3VyY2VDYWNoZSgpOworCQl0aGlzLmRlZmF1bHRTaXplID0gdGhpcy5kZWZhdWx0U2l6ZShqYXZhQ2FjaGluZyk7CisJCXRoaXMuc3BlY2lmaWVkU2l6ZSA9IGdldFJlc291cmNlU2l6ZShyZXNvdXJjZUNhY2hlKTsKKwkJdGhpcy5kZWZhdWx0U2hhcmVkID0gdGhpcy5kZWZhdWx0U2hhcmVkKGphdmFDYWNoaW5nKTsKKwkJdGhpcy5zcGVjaWZpZWRTaGFyZWQgPSB0aGlzLmdldFJlc291cmNlU2hhcmVkKHJlc291cmNlQ2FjaGUpOworCQl0aGlzLmRlZmF1bHRBbHdheXNSZWZyZXNoID0gdGhpcy5kZWZhdWx0QWx3YXlzUmVmcmVzaChqYXZhQ2FjaGluZyk7CisJCXRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaCA9IHRoaXMuZ2V0UmVzb3VyY2VBbHdheXNSZWZyZXNoKHJlc291cmNlQ2FjaGUpOworCQl0aGlzLmRlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIgPSB0aGlzLmRlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoamF2YUNhY2hpbmcpOworCQl0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciA9IHRoaXMuZ2V0UmVzb3VyY2VSZWZyZXNoT25seUlmTmV3ZXIocmVzb3VyY2VDYWNoZSk7CisJCXRoaXMuZGVmYXVsdERpc2FibGVIaXRzID0gdGhpcy5kZWZhdWx0RGlzYWJsZUhpdHMoamF2YUNhY2hpbmcpOworCQl0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzID0gdGhpcy5nZXRSZXNvdXJjZURpc2FibGVIaXRzKHJlc291cmNlQ2FjaGUpOworCQl0aGlzLmRlZmF1bHRUeXBlID0gdGhpcy5kZWZhdWx0VHlwZShqYXZhQ2FjaGluZyk7CisJCXRoaXMuc3BlY2lmaWVkVHlwZSA9IHRoaXMuZ2V0UmVzb3VyY2VUeXBlKHJlc291cmNlQ2FjaGUpOworCQl0aGlzLmRlZmF1bHRDb29yZGluYXRpb25UeXBlID0gdGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZShqYXZhQ2FjaGluZyk7CisJCXRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSA9IHRoaXMuZ2V0UmVzb3VyY2VDb29yZGluYXRpb25UeXBlKHJlc291cmNlQ2FjaGUpOworCQl0aGlzLmRlZmF1bHRFeGlzdGVuY2VUeXBlID0gdGhpcy5kZWZhdWx0RXhpc3RlbmNlVHlwZShqYXZhQ2FjaGluZyk7CisJCXRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA9IHRoaXMuZ2V0UmVzb3VyY2VFeGlzdGVuY2VDaGVja2luZygpOworCQl0aGlzLmluaXRpYWxpemVFeHBpcnkocmVzb3VyY2VDYWNoZSk7CisJCXRoaXMuY2FjaGVhYmxlID0gKChPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkpIGdldFhtbENvbnRleHROb2RlRmFjdG9yeSgpKS5idWlsZE9ybUNhY2hlYWJsZSh0aGlzLCBjYWNoZWFibGVSZXNvdXJjZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9ybVR5cGVNYXBwaW5nIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChPcm1UeXBlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNpemUgPT0gbnVsbCkgPyB0aGlzLmRlZmF1bHRTaXplIDogdGhpcy5zcGVjaWZpZWRTaXplLmludFZhbHVlKCk7CisJfQorCQorCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFNpemUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRTaXplOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2l6ZShpbnQgbmV3U2l6ZSkgeworCQlpbnQgb2xkU2l6ZSA9IHRoaXMuZGVmYXVsdFNpemU7CisJCXRoaXMuZGVmYXVsdFNpemUgPSBuZXdTaXplOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0laRV9QUk9QRVJUWSwgb2xkU2l6ZSwgbmV3U2l6ZSk7CisJfQorCQorCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZFNpemUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFNpemU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNpemUoSW50ZWdlciBuZXdTcGVjaWZpZWRTaXplKSB7CisJCUludGVnZXIgb2xkU3BlY2lmaWVkU2l6ZSA9IHRoaXMuc3BlY2lmaWVkU2l6ZTsKKwkJdGhpcy5zcGVjaWZpZWRTaXplID0gbmV3U3BlY2lmaWVkU2l6ZTsKKwkJaWYgKG9sZFNwZWNpZmllZFNpemUgIT0gbmV3U3BlY2lmaWVkU2l6ZSkgeworCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpICE9IG51bGwpIHsKKwkJCQl0aGlzLmdldFJlc291cmNlQ2FjaGUoKS5zZXRTaXplKG5ld1NwZWNpZmllZFNpemUpOwkJCQkJCQorCQkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FjaGUoKS5pc1Vuc2V0KCkpIHsKKwkJCQkJcmVtb3ZlUmVzb3VyY2VDYWNoZSgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZFNpemUgIT0gbnVsbCkgeworCQkJCWFkZFJlc291cmNlQ2FjaGUoKTsKKwkJCQlnZXRSZXNvdXJjZUNhY2hlKCkuc2V0U2l6ZShuZXdTcGVjaWZpZWRTaXplKTsKKwkJCX0KKwkJfQorCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TSVpFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTaXplLCBuZXdTcGVjaWZpZWRTaXplKTsJCQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTaXplXyhJbnRlZ2VyIG5ld1NwZWNpZmllZFNpemUpIHsKKwkJSW50ZWdlciBvbGRTcGVjaWZpZWRTaXplID0gdGhpcy5zcGVjaWZpZWRTaXplOworCQl0aGlzLnNwZWNpZmllZFNpemUgPSBuZXdTcGVjaWZpZWRTaXplOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TSVpFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRTaXplLCBuZXdTcGVjaWZpZWRTaXplKTsKKwl9CisJCisJCisJcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRTaGFyZWQgPT0gbnVsbCkgPyB0aGlzLmRlZmF1bHRTaGFyZWQgOiB0aGlzLnNwZWNpZmllZFNoYXJlZC5ib29sZWFuVmFsdWUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0U2hhcmVkKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2hhcmVkOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2hhcmVkKGJvb2xlYW4gbmV3RGVmYXVsdFNoYXJlZCkgeworCQlib29sZWFuIG9sZERlZmF1bHRTaGFyZWQgPSB0aGlzLmRlZmF1bHRTaGFyZWQ7CisJCXRoaXMuZGVmYXVsdFNoYXJlZCA9IG5ld0RlZmF1bHRTaGFyZWQ7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TSEFSRURfUFJPUEVSVFksIG9sZERlZmF1bHRTaGFyZWQsIG5ld0RlZmF1bHRTaGFyZWQpOwkKKwl9CisJCisJcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkU2hhcmVkKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTaGFyZWQ7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuIG5ld1NwZWNpZmllZFNoYXJlZCkgeworCQlCb29sZWFuIG9sZFNwZWNpZmllZFNoYXJlZCA9IHRoaXMuc3BlY2lmaWVkU2hhcmVkOworCQl0aGlzLnNwZWNpZmllZFNoYXJlZCA9IG5ld1NwZWNpZmllZFNoYXJlZDsKKwkJaWYgKG9sZFNwZWNpZmllZFNoYXJlZCAhPSBuZXdTcGVjaWZpZWRTaGFyZWQpIHsKKwkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FjaGUoKSAhPSBudWxsKSB7CisJCQkJdGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkuc2V0U2hhcmVkKG5ld1NwZWNpZmllZFNoYXJlZCk7CQkJCQkJCisJCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpLmlzVW5zZXQoKSkgeworCQkJCQlyZW1vdmVSZXNvdXJjZUNhY2hlKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAobmV3U3BlY2lmaWVkU2hhcmVkICE9IG51bGwpIHsKKwkJCQlhZGRSZXNvdXJjZUNhY2hlKCk7CisJCQkJZ2V0UmVzb3VyY2VDYWNoZSgpLnNldFNoYXJlZChuZXdTcGVjaWZpZWRTaGFyZWQpOworCQkJfQorCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NIQVJFRF9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkU2hhcmVkLCBuZXdTcGVjaWZpZWRTaGFyZWQpOwkJCisJCWlmIChuZXdTcGVjaWZpZWRTaGFyZWQgPT0gQm9vbGVhbi5GQUxTRSkgeworCQkJc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKKwkJCXNldFNwZWNpZmllZFNpemUobnVsbCk7CisJCQlzZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKG51bGwpOworCQkJc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOworCQkJc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMobnVsbCk7CisJCQlzZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKG51bGwpOworCQkJc2V0RXhwaXJ5KG51bGwpOworCQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpIHsKKwkJCQlyZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTaGFyZWRfKEJvb2xlYW4gbmV3U3BlY2lmaWVkU2hhcmVkKSB7CisJCUJvb2xlYW4gb2xkU3BlY2lmaWVkU2hhcmVkID0gdGhpcy5zcGVjaWZpZWRTaGFyZWQ7CisJCXRoaXMuc3BlY2lmaWVkU2hhcmVkID0gbmV3U3BlY2lmaWVkU2hhcmVkOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TSEFSRURfUFJPUEVSVFksIG9sZFNwZWNpZmllZFNoYXJlZCwgbmV3U3BlY2lmaWVkU2hhcmVkKTsJCisJfQorCQorCQorCXB1YmxpYyBib29sZWFuIGlzQWx3YXlzUmVmcmVzaCgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2ggPT0gbnVsbCkgPyB0aGlzLmRlZmF1bHRBbHdheXNSZWZyZXNoIDogdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoLmJvb2xlYW5WYWx1ZSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWx3YXlzUmVmcmVzaDsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEFsd2F5c1JlZnJlc2goYm9vbGVhbiBuZXdEZWZhdWx0QWx3YXlzUmVmcmVzaCkgeworCQlib29sZWFuIG9sZERlZmF1bHRBbHdheXNSZWZyZXNoID0gdGhpcy5kZWZhdWx0QWx3YXlzUmVmcmVzaDsKKwkJdGhpcy5kZWZhdWx0QWx3YXlzUmVmcmVzaCA9IG5ld0RlZmF1bHRBbHdheXNSZWZyZXNoOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFksIG9sZERlZmF1bHRBbHdheXNSZWZyZXNoLCBuZXdEZWZhdWx0QWx3YXlzUmVmcmVzaCk7CQorCX0KKwkKKwlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4gbmV3U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCkgeworCQlCb29sZWFuIG9sZFNwZWNpZmllZEFsd2F5c1JlZnJlc2ggPSB0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2g7CisJCXRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaCA9IG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2g7CisJCWlmIChvbGRTcGVjaWZpZWRBbHdheXNSZWZyZXNoICE9IG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2gpIHsKKwkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FjaGUoKSAhPSBudWxsKSB7CisJCQkJdGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChuZXdTcGVjaWZpZWRBbHdheXNSZWZyZXNoKTsJCQkJCQkKKwkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkuaXNVbnNldCgpKSB7CisJCQkJCXJlbW92ZVJlc291cmNlQ2FjaGUoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChuZXdTcGVjaWZpZWRBbHdheXNSZWZyZXNoICE9IG51bGwpIHsKKwkJCQlhZGRSZXNvdXJjZUNhY2hlKCk7CisJCQkJZ2V0UmVzb3VyY2VDYWNoZSgpLnNldEFsd2F5c1JlZnJlc2gobmV3U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCk7CisJCQl9CisJCX0KKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFksIG9sZFNwZWNpZmllZEFsd2F5c1JlZnJlc2gsIG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2gpOwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2hfKEJvb2xlYW4gbmV3U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCkgeworCQlCb29sZWFuIG9sZFNwZWNpZmllZEFsd2F5c1JlZnJlc2ggPSB0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2g7CisJCXRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaCA9IG5ld1NwZWNpZmllZEFsd2F5c1JlZnJlc2g7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0FMV0FZU19SRUZSRVNIX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRBbHdheXNSZWZyZXNoLCBuZXdTcGVjaWZpZWRBbHdheXNSZWZyZXNoKTsJCisJfQorCQorCQorCXB1YmxpYyBib29sZWFuIGlzUmVmcmVzaE9ubHlJZk5ld2VyKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyID09IG51bGwpID8gdGhpcy5kZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyIDogdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIuYm9vbGVhblZhbHVlKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcjsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcihib29sZWFuIG5ld0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIpIHsKKwkJYm9vbGVhbiBvbGREZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyID0gdGhpcy5kZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyOworCQl0aGlzLmRlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIgPSBuZXdEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfUkVGUkVTSF9PTkxZX0lGX05FV0VSX1BST1BFUlRZLCBvbGREZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyLCBuZXdEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKTsJCisJfQorCQorCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiBuZXdTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIpIHsKKwkJQm9vbGVhbiBvbGRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIgPSB0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcjsKKwkJdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIgPSBuZXdTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXI7CisJCWlmIChvbGRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIgIT0gbmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKSB7CisJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkgIT0gbnVsbCkgeworCQkJCXRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihuZXdTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIpOwkJCQkJCQorCQkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FjaGUoKS5pc1Vuc2V0KCkpIHsKKwkJCQkJcmVtb3ZlUmVzb3VyY2VDYWNoZSgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciAhPSBudWxsKSB7CisJCQkJYWRkUmVzb3VyY2VDYWNoZSgpOworCQkJCWdldFJlc291cmNlQ2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIobmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKTsKKwkJCX0KKwkJfQorCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciwgbmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKTsJCQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXJfKEJvb2xlYW4gbmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKSB7CisJCUJvb2xlYW4gb2xkU3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyID0gdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXI7CisJCXRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyID0gbmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciwgbmV3U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKTsJCisJfQorCQorCQorCXB1YmxpYyBib29sZWFuIGlzRGlzYWJsZUhpdHMoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWREaXNhYmxlSGl0cyA9PSBudWxsKSA/IHRoaXMuZGVmYXVsdERpc2FibGVIaXRzIDogdGhpcy5zcGVjaWZpZWREaXNhYmxlSGl0cy5ib29sZWFuVmFsdWUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHREaXNhYmxlSGl0czsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdERpc2FibGVIaXRzKGJvb2xlYW4gbmV3RGVmYXVsdERpc2FibGVIaXRzKSB7CisJCWJvb2xlYW4gb2xkRGVmYXVsdERpc2FibGVIaXRzID0gdGhpcy5kZWZhdWx0RGlzYWJsZUhpdHM7CisJCXRoaXMuZGVmYXVsdERpc2FibGVIaXRzID0gbmV3RGVmYXVsdERpc2FibGVIaXRzOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfRElTQUJMRV9ISVRTX1BST1BFUlRZLCBvbGREZWZhdWx0RGlzYWJsZUhpdHMsIG5ld0RlZmF1bHREaXNhYmxlSGl0cyk7CQorCX0KKwkKKwlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHM7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4gbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHMpIHsKKwkJQm9vbGVhbiBvbGRTcGVjaWZpZWREaXNhYmxlSGl0cyA9IHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHM7CisJCXRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMgPSBuZXdTcGVjaWZpZWREaXNhYmxlSGl0czsKKwkJaWYgKG9sZFNwZWNpZmllZERpc2FibGVIaXRzICE9IG5ld1NwZWNpZmllZERpc2FibGVIaXRzKSB7CisJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkgIT0gbnVsbCkgeworCQkJCXRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpLnNldERpc2FibGVIaXRzKG5ld1NwZWNpZmllZERpc2FibGVIaXRzKTsJCQkJCQkKKwkJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkuaXNVbnNldCgpKSB7CisJCQkJCXJlbW92ZVJlc291cmNlQ2FjaGUoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChuZXdTcGVjaWZpZWREaXNhYmxlSGl0cyAhPSBudWxsKSB7CisJCQkJYWRkUmVzb3VyY2VDYWNoZSgpOworCQkJCWdldFJlc291cmNlQ2FjaGUoKS5zZXREaXNhYmxlSGl0cyhuZXdTcGVjaWZpZWREaXNhYmxlSGl0cyk7CisJCQl9CisJCX0KKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRElTQUJMRV9ISVRTX1BST1BFUlRZLCBvbGRTcGVjaWZpZWREaXNhYmxlSGl0cywgbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHMpOwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZERpc2FibGVIaXRzXyhCb29sZWFuIG5ld1NwZWNpZmllZERpc2FibGVIaXRzKSB7CisJCUJvb2xlYW4gb2xkU3BlY2lmaWVkRGlzYWJsZUhpdHMgPSB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOworCQl0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzID0gbmV3U3BlY2lmaWVkRGlzYWJsZUhpdHM7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0RJU0FCTEVfSElUU19QUk9QRVJUWSwgb2xkU3BlY2lmaWVkRGlzYWJsZUhpdHMsIG5ld1NwZWNpZmllZERpc2FibGVIaXRzKTsJCisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXRUeXBlKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVHlwZSA9PSBudWxsKSA/IHRoaXMuZGVmYXVsdFR5cGUgOiB0aGlzLnNwZWNpZmllZFR5cGU7CisJfQorCisJcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGdldERlZmF1bHRUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0VHlwZTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUgbmV3RGVmYXVsdFR5cGUpIHsKKwkJRWNsaXBzZUxpbmtDYWNoZVR5cGUgb2xkRGVmYXVsdFR5cGU9IHRoaXMuZGVmYXVsdFR5cGU7CisJCXRoaXMuZGVmYXVsdFR5cGUgPSBuZXdEZWZhdWx0VHlwZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1RZUEVfUFJPUEVSVFksIG9sZERlZmF1bHRUeXBlLCBuZXdEZWZhdWx0VHlwZSk7CQkJCQorCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0U3BlY2lmaWVkVHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVHlwZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZSBuZXdTcGVjaWZpZWRUeXBlKSB7CisJCUVjbGlwc2VMaW5rQ2FjaGVUeXBlIG9sZFNwZWNpZmllZFR5cGUgPSB0aGlzLnNwZWNpZmllZFR5cGU7CisJCXRoaXMuc3BlY2lmaWVkVHlwZSA9IG5ld1NwZWNpZmllZFR5cGU7CisJCWlmIChvbGRTcGVjaWZpZWRUeXBlICE9IG5ld1NwZWNpZmllZFR5cGUpIHsKKwkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FjaGUoKSAhPSBudWxsKSB7CisJCQkJdGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkuc2V0VHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkVHlwZSkpOwkJCQkJCQorCQkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FjaGUoKS5pc1Vuc2V0KCkpIHsKKwkJCQkJcmVtb3ZlUmVzb3VyY2VDYWNoZSgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKG5ld1NwZWNpZmllZFR5cGUgIT0gbnVsbCkgeworCQkJCWFkZFJlc291cmNlQ2FjaGUoKTsKKwkJCQlnZXRSZXNvdXJjZUNhY2hlKCkuc2V0VHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkVHlwZSkpOworCQkJfQorCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZFR5cGUsIG5ld1NwZWNpZmllZFR5cGUpOwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFR5cGVfKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIG5ld1NwZWNpZmllZFR5cGUpIHsKKwkJRWNsaXBzZUxpbmtDYWNoZVR5cGUgb2xkU3BlY2lmaWVkVHlwZT0gdGhpcy5zcGVjaWZpZWRUeXBlOworCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBuZXdTcGVjaWZpZWRUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRUeXBlLCBuZXdTcGVjaWZpZWRUeXBlKTsJCQorCX0KKwkKKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0Q29vcmRpbmF0aW9uVHlwZSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgPT0gbnVsbCkgPyB0aGlzLmRlZmF1bHRDb29yZGluYXRpb25UeXBlIDogdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRDb29yZGluYXRpb25UeXBlOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBuZXdEZWZhdWx0Y0Nvb3JkaW5hdGlvblR5cGUpIHsKKwkJRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgb2xkRGVmYXVsdGNDb29yZGluYXRpb25UeXBlPSB0aGlzLmRlZmF1bHRDb29yZGluYXRpb25UeXBlOworCQl0aGlzLmRlZmF1bHRDb29yZGluYXRpb25UeXBlID0gbmV3RGVmYXVsdGNDb29yZGluYXRpb25UeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ09PUkRJTkFUSU9OX1RZUEVfUFJPUEVSVFksIG9sZERlZmF1bHRjQ29vcmRpbmF0aW9uVHlwZSwgbmV3RGVmYXVsdGNDb29yZGluYXRpb25UeXBlKTsJCQkJCisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIG5ld1NwZWNpZmllZENvb3JkaW5hdGlvblR5cGUpIHsKKwkJRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgb2xkU3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSA9IHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKKwkJdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlID0gbmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKKwkJaWYgKG9sZFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgIT0gbmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSkgeworCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpICE9IG51bGwpIHsKKwkJCQl0aGlzLmdldFJlc291cmNlQ2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKSk7CQkJCQkJCisJCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpLmlzVW5zZXQoKSkgeworCQkJCQlyZW1vdmVSZXNvdXJjZUNhY2hlKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAobmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSAhPSBudWxsKSB7CisJCQkJYWRkUmVzb3VyY2VDYWNoZSgpOworCQkJCWdldFJlc291cmNlQ2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKSk7CisJCQl9CisJCX0KKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ09PUkRJTkFUSU9OX1RZUEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUsIG5ld1NwZWNpZmllZENvb3JkaW5hdGlvblR5cGUpOwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGVfKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIG5ld1NwZWNpZmllZENvb3JkaW5hdGlvblR5cGUpIHsKKwkJRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgb2xkU3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSA9IHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKKwkJdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlID0gbmV3U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ09PUkRJTkFUSU9OX1RZUEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUsIG5ld1NwZWNpZmllZENvb3JkaW5hdGlvblR5cGUpOwkJCisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0RXhpc3RlbmNlVHlwZSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPT0gbnVsbCkgPyB0aGlzLmRlZmF1bHRFeGlzdGVuY2VUeXBlIDogdGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0RXhpc3RlbmNlVHlwZTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG5ld0RlZmF1bHRFeGlzdGVuY2VUeXBlKSB7CisJCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBvbGREZWZhdWx0RXhpc3RlbmNlVHlwZSA9IHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGU7CisJCXRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGUgPSBuZXdEZWZhdWx0RXhpc3RlbmNlVHlwZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZLCBvbGREZWZhdWx0RXhpc3RlbmNlVHlwZSwgbmV3RGVmYXVsdEV4aXN0ZW5jZVR5cGUpOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGUpIHsKKwkJRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG9sZFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPSB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7CisJCXRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA9IG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGU7CisJCXRoaXMucmVzb3VyY2Uuc2V0RXhpc3RlbmNlQ2hlY2tpbmcoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChuZXdTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlLCBuZXdTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKTsJCQkKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZV8oRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGUpIHsKKwkJRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG9sZFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPSB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7CisJCXRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA9IG5ld1NwZWNpZmllZEV4aXN0ZW5jZVR5cGU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlLCBuZXdTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKTsJCQorCX0JCisJCisJcHVibGljIEludGVnZXIgZ2V0RXhwaXJ5KCkgeworCQlyZXR1cm4gdGhpcy5leHBpcnk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEV4cGlyeShJbnRlZ2VyIG5ld0V4cGlyeSkgeworCQlJbnRlZ2VyIG9sZEV4cGlyeSA9IHRoaXMuZXhwaXJ5OworCQl0aGlzLmV4cGlyeSA9IG5ld0V4cGlyeTsKKwkJaWYgKG9sZEV4cGlyeSAhPSBuZXdFeHBpcnkpIHsKKwkJCWlmICh0aGlzLmdldFJlc291cmNlQ2FjaGUoKSAhPSBudWxsKSB7CisJCQkJdGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkuc2V0RXhwaXJ5KG5ld0V4cGlyeSk7CQkJCQkJCisJCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpLmlzVW5zZXQoKSkgeworCQkJCQlyZW1vdmVSZXNvdXJjZUNhY2hlKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAobmV3RXhwaXJ5ICE9IG51bGwpIHsKKwkJCQlhZGRSZXNvdXJjZUNhY2hlKCk7CisJCQkJdGhpcy5nZXRSZXNvdXJjZUNhY2hlKCkuc2V0RXhwaXJ5KG5ld0V4cGlyeSk7CQkJCQkJCisJCQl9CisJCX0KKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChFWFBJUllfUFJPUEVSVFksIG9sZEV4cGlyeSwgbmV3RXhwaXJ5KTsKKwkJaWYgKG5ld0V4cGlyeSAhPSBudWxsICYmIHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpIHsKKwkJCXJlbW92ZUV4cGlyeVRpbWVPZkRheSgpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldEV4cGlyeV8oSW50ZWdlciBuZXdFeHBpcnkpIHsKKwkJSW50ZWdlciBvbGRFeHBpcnkgPSB0aGlzLmV4cGlyeTsKKwkJdGhpcy5leHBpcnkgPSBuZXdFeHBpcnk7CQkKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChFWFBJUllfUFJPUEVSVFksIG9sZEV4cGlyeSwgbmV3RXhwaXJ5KTsKKwl9CisJCisJcHVibGljIEVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IGdldEV4cGlyeVRpbWVPZkRheSgpIHsKKwkJcmV0dXJuIHRoaXMuZXhwaXJ5VGltZU9mRGF5OworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkgYWRkRXhwaXJ5VGltZU9mRGF5KCkgeworCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgIT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZXhwaXJ5VGltZU9mRGF5IGFscmVhZHkgZXhpc3RzLCB1c2UgZ2V0RXhwaXJ5VGltZU9mRGF5KCkiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmIChnZXRSZXNvdXJjZUNhY2hlKCkgPT0gbnVsbCkgeworCQkJYWRkUmVzb3VyY2VDYWNoZSgpOworCQl9CisJCU9ybUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IG5ld0V4cGlyeVRpbWVPZkRheSA9IG5ldyBPcm1FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSh0aGlzKTsKKwkJdGhpcy5leHBpcnlUaW1lT2ZEYXkgPSBuZXdFeHBpcnlUaW1lT2ZEYXk7CisJCVhtbFRpbWVPZkRheSByZXNvdXJjZVRpbWVPZkRheSA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGltZU9mRGF5KCk7CisJCW5ld0V4cGlyeVRpbWVPZkRheS5pbml0aWFsaXplKHJlc291cmNlVGltZU9mRGF5KTsKKwkJZ2V0UmVzb3VyY2VDYWNoZSgpLnNldEV4cGlyeVRpbWVPZkRheShyZXNvdXJjZVRpbWVPZkRheSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZLCBudWxsLCBuZXdFeHBpcnlUaW1lT2ZEYXkpOworCQlzZXRFeHBpcnkobnVsbCk7CisJCXJldHVybiBuZXdFeHBpcnlUaW1lT2ZEYXk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheSgpIHsKKwkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRpbWVPZkRheUV4cGlyeSBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkgb2xkRXhwaXJ5VGltZU9mRGF5ID0gdGhpcy5leHBpcnlUaW1lT2ZEYXk7CisJCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gbnVsbDsKKwkJZ2V0UmVzb3VyY2VDYWNoZSgpLnNldEV4cGlyeVRpbWVPZkRheShudWxsKTsKKwkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDYWNoZSgpLmlzVW5zZXQoKSkgeworCQkJcmVtb3ZlUmVzb3VyY2VDYWNoZSgpOworCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZLCBvbGRFeHBpcnlUaW1lT2ZEYXksIG51bGwpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRFeHBpcnlUaW1lT2ZEYXkoT3JtRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkgbmV3RXhwaXJ5VGltZU9mRGF5KSB7CisJCU9ybUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IG9sZEV4cGlyeVRpbWVPZkRheSA9IHRoaXMuZXhwaXJ5VGltZU9mRGF5OworCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IG5ld0V4cGlyeVRpbWVPZkRheTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChFWFBJUllfVElNRV9PRl9EQVlfUFJPUEVSVFksIG9sZEV4cGlyeVRpbWVPZkRheSwgbmV3RXhwaXJ5VGltZU9mRGF5KTsKKwl9CisJCisJcHJvdGVjdGVkIFhtbENhY2hlIGdldFJlc291cmNlQ2FjaGUoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlLmdldENhY2hlKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlQ2FjaGUoKSB7CisJCXRoaXMucmVzb3VyY2Uuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsJCQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZUNhY2hlKCkgeworCQl0aGlzLnJlc291cmNlLnNldENhY2hlKG51bGwpOworCX0KKwkKKwlwdWJsaWMgT3JtQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuY2FjaGVhYmxlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgeworCQlpZiAoIWdldFBhcmVudCgpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZ2V0UGFyZW50KCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJCWlmIChqYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCAmJiBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQ2FjaGVhYmxlSG9sZGVyMl8wKSB7CisJCQkJcmV0dXJuICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKS5pc0NhY2hlYWJsZSgpOworCQkJfQorCQl9CisJCUNhY2hlYWJsZUhvbGRlcjJfMCBjYWNoZWFibGVIb2xkZXIgPSBnZXRDYWNoZWFibGVTdXBlclBlcnNpc3RlbnRUeXBlKGdldFBhcmVudCgpLmdldFBlcnNpc3RlbnRUeXBlKCkpOworCQlpZiAoY2FjaGVhYmxlSG9sZGVyICE9IG51bGwpIHsKKwkJCXJldHVybiBjYWNoZWFibGVIb2xkZXIuZ2V0Q2FjaGVhYmxlKCkuaXNDYWNoZWFibGUoKTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsvLygoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgQ2FjaGVhYmxlSG9sZGVyMl8wIGdldENhY2hlYWJsZVN1cGVyUGVyc2lzdGVudFR5cGUoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKKwkJUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZSA9IHBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKKwkJaWYgKHN1cGVyUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgeworCQkJaWYgKHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQ2FjaGVhYmxlSG9sZGVyMl8wKSB7CisJCQkJcmV0dXJuIChDYWNoZWFibGVIb2xkZXIyXzApIHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQkJfQorCQkJcmV0dXJuIGdldENhY2hlYWJsZVN1cGVyUGVyc2lzdGVudFR5cGUoc3VwZXJQZXJzaXN0ZW50VHlwZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8vICoqKioqKioqKioqKioqKiogaW5pdGlhbGl6ZS91cGRhdGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFeHBpcnkoWG1sQ2FjaGUgcmVzb3VyY2VDYWNoZSkgeworCQlpZiAocmVzb3VyY2VDYWNoZSA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHJlc291cmNlQ2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkgPT0gbnVsbCkgeworCQkJdGhpcy5leHBpcnkgPSByZXNvdXJjZUNhY2hlLmdldEV4cGlyeSgpOworCQl9CisJCWVsc2UgeworCQkJaWYgKHJlc291cmNlQ2FjaGUuZ2V0RXhwaXJ5KCkgPT0gbnVsbCkgeyAvL2hhbmRsZSB3aXRoIHZhbGlkYXRpb24gaWYgYm90aCBleHBpcnkgYW5kIGV4cGlyeVRpbWVPZkRheSBhcmUgc2V0CisJCQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkgPSBuZXcgT3JtRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkodGhpcyk7CisJCQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkuaW5pdGlhbGl6ZShyZXNvdXJjZUNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDYWNoaW5nKSB7CisJCVhtbENhY2hlIHJlc291cmNlQ2FjaGUgPSBnZXRSZXNvdXJjZUNhY2hlKCk7CisJCXNldERlZmF1bHRTaXplKHRoaXMuZGVmYXVsdFNpemUoamF2YUNhY2hpbmcpKTsKKwkJc2V0U3BlY2lmaWVkU2l6ZV8odGhpcy5nZXRSZXNvdXJjZVNpemUocmVzb3VyY2VDYWNoZSkpOworCQlzZXREZWZhdWx0U2hhcmVkKHRoaXMuZGVmYXVsdFNoYXJlZChqYXZhQ2FjaGluZykpOworCQlzZXRTcGVjaWZpZWRTaGFyZWRfKHRoaXMuZ2V0UmVzb3VyY2VTaGFyZWQocmVzb3VyY2VDYWNoZSkpOworCQlzZXREZWZhdWx0QWx3YXlzUmVmcmVzaCh0aGlzLmRlZmF1bHRBbHdheXNSZWZyZXNoKGphdmFDYWNoaW5nKSk7CisJCXNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2hfKHRoaXMuZ2V0UmVzb3VyY2VBbHdheXNSZWZyZXNoKHJlc291cmNlQ2FjaGUpKTsKKwkJc2V0RGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcih0aGlzLmRlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoamF2YUNhY2hpbmcpKTsKKwkJc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyXyh0aGlzLmdldFJlc291cmNlUmVmcmVzaE9ubHlJZk5ld2VyKHJlc291cmNlQ2FjaGUpKTsKKwkJc2V0RGVmYXVsdERpc2FibGVIaXRzKHRoaXMuZGVmYXVsdERpc2FibGVIaXRzKGphdmFDYWNoaW5nKSk7CisJCXNldFNwZWNpZmllZERpc2FibGVIaXRzXyh0aGlzLmdldFJlc291cmNlRGlzYWJsZUhpdHMocmVzb3VyY2VDYWNoZSkpOworCQlzZXREZWZhdWx0VHlwZSh0aGlzLmRlZmF1bHRUeXBlKGphdmFDYWNoaW5nKSk7CisJCXNldFNwZWNpZmllZFR5cGVfKHRoaXMuZ2V0UmVzb3VyY2VUeXBlKHJlc291cmNlQ2FjaGUpKTsKKwkJc2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUodGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZShqYXZhQ2FjaGluZykpOworCQlzZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlXyh0aGlzLmdldFJlc291cmNlQ29vcmRpbmF0aW9uVHlwZShyZXNvdXJjZUNhY2hlKSk7CisJCXNldERlZmF1bHRFeGlzdGVuY2VUeXBlKHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGUoamF2YUNhY2hpbmcpKTsKKwkJc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZV8odGhpcy5nZXRSZXNvdXJjZUV4aXN0ZW5jZUNoZWNraW5nKCkpOworCQl0aGlzLnVwZGF0ZUV4cGlyeShyZXNvdXJjZUNhY2hlKTsKKwkJdGhpcy5jYWNoZWFibGUudXBkYXRlKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUV4cGlyeShYbWxDYWNoZSByZXNvdXJjZUNhY2hlKSB7CisJCWlmIChyZXNvdXJjZUNhY2hlID09IG51bGwpIHsKKwkJCXNldEV4cGlyeVRpbWVPZkRheShudWxsKTsKKwkJCXNldEV4cGlyeV8obnVsbCk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHJlc291cmNlQ2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkgPT0gbnVsbCkgeworCQkJc2V0RXhwaXJ5VGltZU9mRGF5KG51bGwpOworCQkJc2V0RXhwaXJ5XyhyZXNvdXJjZUNhY2hlLmdldEV4cGlyeSgpKTsKKwkJfQorCQllbHNlIHsKKwkJCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7CisJCQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkudXBkYXRlKHJlc291cmNlQ2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOworCQkJfQorCQkJZWxzZSBpZiAocmVzb3VyY2VDYWNoZS5nZXRFeHBpcnkoKSA9PSBudWxsKXsKKwkJCQlzZXRFeHBpcnlUaW1lT2ZEYXkobmV3IE9ybUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5KHRoaXMpKTsKKwkJCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5pbml0aWFsaXplKHJlc291cmNlQ2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOworCQkJfQorCQkJZWxzZSB7IC8vaGFuZGxlIHdpdGggdmFsaWRhdGlvbiBpZiBib3RoIGV4cGlyeSBhbmQgZXhwaXJ5VGltZU9mRGF5IGFyZSBzZXQKKwkJCQlzZXRFeHBpcnlUaW1lT2ZEYXkobnVsbCk7CisJCQl9CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIGludCBkZWZhdWx0U2l6ZShKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDYWNoaW5nKSB7CisJCXJldHVybiAoamF2YUNhY2hpbmcgPT0gbnVsbCkgPyBERUZBVUxUX1NJWkUgOiBqYXZhQ2FjaGluZy5nZXRTaXplKCk7CisJfQorCQorCXByb3RlY3RlZCBJbnRlZ2VyIGdldFJlc291cmNlU2l6ZShYbWxDYWNoZSByZXNvdXJjZSkgeworCQlyZXR1cm4gKHJlc291cmNlID09IG51bGwpID8gbnVsbCA6IHJlc291cmNlLmdldFNpemUoKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFNoYXJlZChKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDYWNoaW5nKSB7CisJCWlmIChqYXZhQ2FjaGluZyA9PSBudWxsKSB7CisJCQlyZXR1cm4gREVGQVVMVF9TSEFSRUQ7CisJCX0KKwkJcmV0dXJuIGdldFJlc291cmNlQ2FjaGUoKSA9PSBudWxsID8gamF2YUNhY2hpbmcuaXNTaGFyZWQoKSA6IERFRkFVTFRfU0hBUkVEOworCX0KKwkKKwlwcm90ZWN0ZWQgQm9vbGVhbiBnZXRSZXNvdXJjZVNoYXJlZChYbWxDYWNoZSByZXNvdXJjZSkgeworCQlyZXR1cm4gKHJlc291cmNlID09IG51bGwpID8gbnVsbCA6IHJlc291cmNlLmdldFNoYXJlZCgpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0QWx3YXlzUmVmcmVzaChKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDYWNoaW5nKSB7CisJCWlmIChqYXZhQ2FjaGluZyA9PSBudWxsKSB7CisJCQlyZXR1cm4gREVGQVVMVF9BTFdBWVNfUkVGUkVTSDsKKwkJfQorCQlyZXR1cm4gZ2V0UmVzb3VyY2VDYWNoZSgpID09IG51bGwgPyBqYXZhQ2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSA6IERFRkFVTFRfQUxXQVlTX1JFRlJFU0g7CisJfQorCQorCXByb3RlY3RlZCBCb29sZWFuIGdldFJlc291cmNlQWx3YXlzUmVmcmVzaChYbWxDYWNoZSByZXNvdXJjZSkgeworCQlyZXR1cm4gKHJlc291cmNlID09IG51bGwpID8gbnVsbCA6IHJlc291cmNlLmdldEFsd2F5c1JlZnJlc2goKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcihKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDYWNoaW5nKSB7CisJCWlmIChqYXZhQ2FjaGluZyA9PSBudWxsKSB7CisJCQlyZXR1cm4gREVGQVVMVF9SRUZSRVNIX09OTFlfSUZfTkVXRVI7CisJCX0KKwkJcmV0dXJuIGdldFJlc291cmNlQ2FjaGUoKSA9PSBudWxsID8gamF2YUNhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSA6IERFRkFVTFRfUkVGUkVTSF9PTkxZX0lGX05FV0VSOworCX0KKwkKKwlwcm90ZWN0ZWQgQm9vbGVhbiBnZXRSZXNvdXJjZVJlZnJlc2hPbmx5SWZOZXdlcihYbWxDYWNoZSByZXNvdXJjZSkgeworCQlyZXR1cm4gKHJlc291cmNlID09IG51bGwpID8gbnVsbCA6IHJlc291cmNlLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0RGlzYWJsZUhpdHMoSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ2FjaGluZykgeworCQlpZiAoamF2YUNhY2hpbmcgPT0gbnVsbCkgeworCQkJcmV0dXJuIERFRkFVTFRfRElTQUJMRV9ISVRTOworCQl9CisJCXJldHVybiBnZXRSZXNvdXJjZUNhY2hlKCkgPT0gbnVsbCA/IGphdmFDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSA6IERFRkFVTFRfRElTQUJMRV9ISVRTOworCX0KKwkKKwlwcm90ZWN0ZWQgQm9vbGVhbiBnZXRSZXNvdXJjZURpc2FibGVIaXRzKFhtbENhY2hlIHJlc291cmNlKSB7CisJCXJldHVybiAocmVzb3VyY2UgPT0gbnVsbCkgPyBudWxsIDogcmVzb3VyY2UuZ2V0RGlzYWJsZUhpdHMoKTsKKwl9CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGRlZmF1bHRUeXBlKEphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNhY2hpbmcpIHsKKwkJaWYgKGphdmFDYWNoaW5nID09IG51bGwpIHsKKwkJCXJldHVybiBERUZBVUxUX1RZUEU7CisJCX0KKwkJcmV0dXJuIGdldFJlc291cmNlQ2FjaGUoKSA9PSBudWxsID8gamF2YUNhY2hpbmcuZ2V0VHlwZSgpIDogREVGQVVMVF9UWVBFOworCX0KKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKFhtbENhY2hlIHJlc291cmNlKSB7CisJCXJldHVybiAocmVzb3VyY2UgPT0gbnVsbCkgPyBudWxsIDogRWNsaXBzZUxpbmtDYWNoZVR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwocmVzb3VyY2UuZ2V0VHlwZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGRlZmF1bHRDb29yZGluYXRpb25UeXBlKEphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNhY2hpbmcpIHsKKwkJaWYgKGphdmFDYWNoaW5nID09IG51bGwpIHsKKwkJCXJldHVybiBERUZBVUxUX0NPT1JESU5BVElPTl9UWVBFOworCQl9CisJCXJldHVybiBnZXRSZXNvdXJjZUNhY2hlKCkgPT0gbnVsbCA/IGphdmFDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSA6IERFRkFVTFRfQ09PUkRJTkFUSU9OX1RZUEU7CisJfQorCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRSZXNvdXJjZUNvb3JkaW5hdGlvblR5cGUoWG1sQ2FjaGUgcmVzb3VyY2UpIHsKKwkJcmV0dXJuIChyZXNvdXJjZSA9PSBudWxsKSA/IG51bGwgOiBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbChyZXNvdXJjZS5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGRlZmF1bHRFeGlzdGVuY2VUeXBlKEphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNhY2hpbmcpIHsKKwkJcmV0dXJuIChqYXZhQ2FjaGluZyA9PSBudWxsKSA/IERFRkFVTFRfRVhJU1RFTkNFX1RZUEUgOiBqYXZhQ2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCk7CisJfQorCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0UmVzb3VyY2VFeGlzdGVuY2VDaGVja2luZygpIHsKKwkJcmV0dXJuICh0aGlzLnJlc291cmNlID09IG51bGwpID8gbnVsbCA6IEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh0aGlzLnJlc291cmNlLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgSW50ZWdlciBnZXRSZXNvdXJjZUV4cGlyeShYbWxDYWNoZSByZXNvdXJjZSkgeworCQlyZXR1cm4gKHJlc291cmNlID09IG51bGwpID8gbnVsbCA6IHJlc291cmNlLmdldEV4cGlyeSgpOworCX0KKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCVhtbENhY2hlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VDYWNoZSgpOworCQlyZXR1cm4gcmVzb3VyY2UgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDJiNWI0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ0hvbGRlcjsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nCit7CisJcHJvdGVjdGVkIGZpbmFsIFhtbENoYW5nZVRyYWNraW5nSG9sZGVyIHJlc291cmNlOworCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBkZWZhdWx0VHlwZTsKKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgc3BlY2lmaWVkVHlwZTsKKwkKKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyhPcm1UeXBlTWFwcGluZyBwYXJlbnQsIFhtbENoYW5nZVRyYWNraW5nSG9sZGVyIHJlc291cmNlLCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGphdmFDaGFuZ2VUcmFja2luZykgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisJCXRoaXMuZGVmYXVsdFR5cGUgPSBjYWxjdWxhdGVEZWZhdWx0VHlwZShqYXZhQ2hhbmdlVHJhY2tpbmcpOworCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBnZXRSZXNvdXJjZUNoYW5nZVRyYWNraW5nKCk7CisJfQorCQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXRUeXBlKCkgeworCQlyZXR1cm4gKGdldFNwZWNpZmllZFR5cGUoKSAhPSBudWxsKSA/IGdldFNwZWNpZmllZFR5cGUoKSA6IGdldERlZmF1bHRUeXBlKCk7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXREZWZhdWx0VHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuZGVmYXVsdFR5cGU7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUeXBlXyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBuZXdEZWZhdWx0VHlwZSkgeworCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBvbGREZWZhdWx0VHlwZSA9IHRoaXMuZGVmYXVsdFR5cGU7CisJCXRoaXMuZGVmYXVsdFR5cGUgPSBuZXdEZWZhdWx0VHlwZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1RZUEVfUFJPUEVSVFksIG9sZERlZmF1bHRUeXBlLCBuZXdEZWZhdWx0VHlwZSk7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXRTcGVjaWZpZWRUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUeXBlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIG5ld1NwZWNpZmllZFR5cGUpIHsKKwkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgb2xkU3BlY2lmaWVkVHlwZSA9IHRoaXMuc3BlY2lmaWVkVHlwZTsKKwkJdGhpcy5zcGVjaWZpZWRUeXBlID0gbmV3U3BlY2lmaWVkVHlwZTsKKwkJCisJCWlmIChuZXdTcGVjaWZpZWRUeXBlID09IG51bGwpIHsKKwkJCXRoaXMucmVzb3VyY2Uuc2V0Q2hhbmdlVHJhY2tpbmcobnVsbCk7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAodGhpcy5yZXNvdXJjZS5nZXRDaGFuZ2VUcmFja2luZygpID09IG51bGwpIHsKKwkJCQl0aGlzLnJlc291cmNlLnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7CisJCQl9CisJCQl0aGlzLnJlc291cmNlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkVHlwZSkpOworCQl9CisJCQorCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRUeXBlLCBuZXdTcGVjaWZpZWRUeXBlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVHlwZV8oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgbmV3U3BlY2lmaWVkVHlwZSkgeworCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBvbGRTcGVjaWZpZWRUeXBlID0gdGhpcy5zcGVjaWZpZWRUeXBlOworCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBuZXdTcGVjaWZpZWRUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UWVBFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRUeXBlLCBuZXdTcGVjaWZpZWRUeXBlKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGphdmFDaGFuZ2VUcmFja2luZykgeworCQlzZXREZWZhdWx0VHlwZV8oY2FsY3VsYXRlRGVmYXVsdFR5cGUoamF2YUNoYW5nZVRyYWNraW5nKSk7CisJCXNldFNwZWNpZmllZFR5cGVfKGdldFJlc291cmNlQ2hhbmdlVHJhY2tpbmcoKSk7CisJfQorCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBjYWxjdWxhdGVEZWZhdWx0VHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGphdmFDaGFuZ2VUcmFja2luZykgeworCQlyZXR1cm4gKGphdmFDaGFuZ2VUcmFja2luZyAhPSBudWxsKSA/IGphdmFDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkgOiBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLkRFRkFVTFRfVFlQRTsKKwl9CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFJlc291cmNlQ2hhbmdlVHJhY2tpbmcoKSB7CisJCVhtbENoYW5nZVRyYWNraW5nIHhtbENoYW5nZVRyYWNraW5nID0gdGhpcy5yZXNvdXJjZS5nZXRDaGFuZ2VUcmFja2luZygpOworCQlyZXR1cm4gKHhtbENoYW5nZVRyYWNraW5nICE9IG51bGwpID8gRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoeG1sQ2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKSA6IG51bGw7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2UuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxYTcxZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlIGltcGxlbWVudHMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUKK3sJCisJcHJpdmF0ZSBYbWxDb252ZXJzaW9uVmFsdWUgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWU7CisJCisJcHJpdmF0ZSBTdHJpbmcgZGF0YVZhbHVlOworCQorCXByaXZhdGUgU3RyaW5nIG9iamVjdFZhbHVlOworCQorCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZShPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5kYXRhVmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGF0YVZhbHVlKFN0cmluZyBuZXdEYXRhVmFsdWUpIHsKKwkJU3RyaW5nIG9sZERhdGFWYWx1ZSA9IHRoaXMuZGF0YVZhbHVlOworCQl0aGlzLmRhdGFWYWx1ZSA9IG5ld0RhdGFWYWx1ZTsKKwkJdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5zZXREYXRhVmFsdWUobmV3RGF0YVZhbHVlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1ZBTFVFX1BST1BFUlRZLCBvbGREYXRhVmFsdWUsIG5ld0RhdGFWYWx1ZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldERhdGFWYWx1ZV8oU3RyaW5nIG5ld0RhdGFWYWx1ZSkgeworCQlTdHJpbmcgb2xkRGF0YVZhbHVlID0gdGhpcy5kYXRhVmFsdWU7CisJCXRoaXMuZGF0YVZhbHVlID0gbmV3RGF0YVZhbHVlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVkFMVUVfUFJPUEVSVFksIG9sZERhdGFWYWx1ZSwgbmV3RGF0YVZhbHVlKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRPYmplY3RWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMub2JqZWN0VmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIG5ld09iamVjdFZhbHVlKSB7CisJCVN0cmluZyBvbGRPYmplY3RWYWx1ZSA9IHRoaXMub2JqZWN0VmFsdWU7CisJCXRoaXMub2JqZWN0VmFsdWUgPSBuZXdPYmplY3RWYWx1ZTsKKwkJdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5zZXRPYmplY3RWYWx1ZShuZXdPYmplY3RWYWx1ZSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1ZBTFVFX1BST1BFUlRZLCBvbGRPYmplY3RWYWx1ZSwgbmV3T2JqZWN0VmFsdWUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RWYWx1ZV8oU3RyaW5nIG5ld09iamVjdFZhbHVlKSB7CisJCVN0cmluZyBvbGRPYmplY3RWYWx1ZSA9IHRoaXMub2JqZWN0VmFsdWU7CisJCXRoaXMub2JqZWN0VmFsdWUgPSBuZXdPYmplY3RWYWx1ZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVkFMVUVfUFJPUEVSVFksIG9sZE9iamVjdFZhbHVlLCBuZXdPYmplY3RWYWx1ZSk7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShYbWxDb252ZXJzaW9uVmFsdWUgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUpIHsKKwkJdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlOworCQl0aGlzLmRhdGFWYWx1ZSA9IHRoaXMuZ2V0UmVzb3VyY2VEYXRhVmFsdWUoKTsKKwkJdGhpcy5vYmplY3RWYWx1ZSA9IHRoaXMuZ2V0UmVzb3VyY2VPYmplY3RWYWx1ZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoWG1sQ29udmVyc2lvblZhbHVlIHJlc291cmNlQ29udmVyc2lvblZhbHVlKSB7CisJCXRoaXMucmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZTsKKwkJdGhpcy5zZXREYXRhVmFsdWVfKHRoaXMuZ2V0UmVzb3VyY2VEYXRhVmFsdWUoKSk7CisJCXRoaXMuc2V0T2JqZWN0VmFsdWVfKHRoaXMuZ2V0UmVzb3VyY2VPYmplY3RWYWx1ZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlRGF0YVZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlT2JqZWN0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXREYXRhVmFsdWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZVRleHRSYW5nZSgpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T2JqZWN0VmFsdWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdmFsaWRhdGVEYXRhVmFsdWVzVW5pcXVlKG1lc3NhZ2VzKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVEYXRhVmFsdWVzVW5pcXVlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7CisJCUxpc3Q8U3RyaW5nPiBkYXRhVmFsdWVzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoZ2V0UGFyZW50KCkuZGF0YVZhbHVlcygpKTsKKwkJZGF0YVZhbHVlcy5yZW1vdmUodGhpcy5kYXRhVmFsdWUpOworCQlpZiAoZGF0YVZhbHVlcy5jb250YWlucyh0aGlzLmRhdGFWYWx1ZSkpIHsKKwkJCW1lc3NhZ2VzLmFkZCgKKwkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAorCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5NVUxUSVBMRV9PQkpFQ1RfVkFMVUVTX0ZPUl9EQVRBX1ZBTFVFLAorCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZGF0YVZhbHVlfSwgCisJCQkJCXRoaXMsCisJCQkJCXRoaXMuZ2V0RGF0YVZhbHVlVGV4dFJhbmdlKCkKKwkJCQkpCisJCQkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOWE4YzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0LmphdmEKQEAgLTAsMCArMSwyNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDb252ZXJ0IGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydCwgT3JtQ29udmVydGVyCit7CisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOworCQorCXByb3RlY3RlZCBYbWxDb252ZXJ0aWJsZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nOworCQorCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjw/PiBjb252ZXJ0ZXI7CisJCisJcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVydChPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgWG1sQ29udmVydGlibGVNYXBwaW5nIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmluaXRpYWxpemUocmVzb3VyY2VNYXBwaW5nKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7CisJCXJldHVybiAoT3JtQXR0cmlidXRlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVI7CisJfQorCQkKKwlwdWJsaWMgdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwoKSB7CisJCXRoaXMucmVzb3VyY2VNYXBwaW5nLnNldENvbnZlcnQoIiIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZXNvdXJjZU1vZGVsKCkgeworCQl0aGlzLnJlc291cmNlTWFwcGluZy5zZXRDb252ZXJ0KG51bGwpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VNYXBwaW5nLmdldENvbnZlcnRUZXh0UmFuZ2UoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJOYW1lKCkgeworCQlyZXR1cm4gZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpID09IG51bGwgPyBnZXREZWZhdWx0Q29udmVydGVyTmFtZSgpIDogZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbnZlcnRlck5hbWUoKSB7CisJCXJldHVybiBERUZBVUxUX0NPTlZFUlRFUl9OQU1FOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ29udmVydGVyTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKFN0cmluZyBuZXdTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKSB7CisJCVN0cmluZyBvbGRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lID0gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOworCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWUgPSBuZXdTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOworCQl0aGlzLnJlc291cmNlTWFwcGluZy5zZXRDb252ZXJ0KG5ld1NwZWNpZmllZENvbnZlcnRlck5hbWUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT05WRVJURVJfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ29udmVydGVyTmFtZSwgbmV3U3BlY2lmaWVkQ29udmVydGVyTmFtZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENvbnZlcnRlck5hbWVfKFN0cmluZyBuZXdTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKSB7CisJCVN0cmluZyBvbGRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lID0gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOworCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWUgPSBuZXdTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT05WRVJURVJfTkFNRV9QUk9QRVJUWSwgb2xkU3BlY2lmaWVkQ29udmVydGVyTmFtZSwgbmV3U3BlY2lmaWVkQ29udmVydGVyTmFtZSk7CisJfQorCisJcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPD8+IGdldENvbnZlcnRlcigpIHsKKwkJcmV0dXJuIHRoaXMuY29udmVydGVyOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnZlcnRlclR5cGUoKSB7CisJCWlmICh0aGlzLmNvbnZlcnRlciA9PSBudWxsKSB7CisJCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSOworCQl9CisJCXJldHVybiB0aGlzLmNvbnZlcnRlci5nZXRUeXBlKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7CisJCWlmIChnZXRDb252ZXJ0ZXJUeXBlKCkgPT0gY29udmVydGVyVHlwZSkgeworCQkJcmV0dXJuOworCQl9CisJCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyPD8+IG9sZENvbnZlcnRlciA9IHRoaXMuY29udmVydGVyOworCQlpZiAob2xkQ29udmVydGVyICE9IG51bGwpIHsKKwkJCXRoaXMuY29udmVydGVyID0gbnVsbDsgLy9zZXQgdG8gbnVsbCBub3cgdG8gYXZvaWQgdXBkYXRlIHRyaWdnZXJpbmcgZXZlbnRzCisJCQlyZW1vdmVDb252ZXJ0ZXIob2xkQ29udmVydGVyLmdldFR5cGUoKSk7CisJCX0KKwkJSnBhRU9iamVjdCByZXNvdXJjZUNvbnZlcnRlciA9IGJ1aWxkUmVzb3VyY2VDb252ZXJ0ZXIoY29udmVydGVyVHlwZSk7CisJCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyPD8+IG5ld0NvbnZlcnRlciA9IGJ1aWxkQ29udmVydGVyKGNvbnZlcnRlclR5cGUsIHJlc291cmNlQ29udmVydGVyKTsKKwkJdGhpcy5jb252ZXJ0ZXIgPSBuZXdDb252ZXJ0ZXI7CisJCWlmIChuZXdDb252ZXJ0ZXIgIT0gbnVsbCkgeworCQkJYWRkQ29udmVydGVyKGNvbnZlcnRlclR5cGUsIHJlc291cmNlQ29udmVydGVyKTsKKwkJfQorCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9QUk9QRVJUWSwgb2xkQ29udmVydGVyLCBuZXdDb252ZXJ0ZXIpOworCX0KKworCS8vVE9ETyB5ZXMsIGkga25vdywgbWFueSBpZi9lbHNlIHR5cGUgY2hlY2tzIGluIHRoZSBtZXRob2RzIGJlbG93LgorCS8vd2lsbCBsb29rIGF0IGZhY3RvcmluZyB0aGlzIG91dCB3aGVuIEkgaGF2ZSB0aW1lIGFmdGVyIE0zISAgQWxzbyBFY2xpcHNlTGlua0phdmFDb252ZXJ0CisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7CisJCWlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLkNVU1RPTV9DT05WRVJURVIpIHsKKwkJCXRoaXMucmVzb3VyY2VNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKKwkJfQorCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKSB7CisJCQl0aGlzLnJlc291cmNlTWFwcGluZy5zZXRUeXBlQ29udmVydGVyKG51bGwpOworCQl9CisJCWVsc2UgaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSB7CisJCQl0aGlzLnJlc291cmNlTWFwcGluZy5zZXRPYmplY3RUeXBlQ29udmVydGVyKG51bGwpOworCQl9CisJCWVsc2UgaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUikgeworCQkJdGhpcy5yZXNvdXJjZU1hcHBpbmcuc2V0U3RydWN0Q29udmVydGVyKG51bGwpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBKcGFFT2JqZWN0IGJ1aWxkUmVzb3VyY2VDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlclR5cGUpIHsKKwkJaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUikgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7CisJCX0KKwkJZWxzZSBpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUikgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOworCQl9CisJCWVsc2UgaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSB7CisJCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7CisJCX0KKwkJZWxzZSBpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKSB7CisJCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlclR5cGUsIEpwYUVPYmplY3QgcmVzb3VyY2VDb252ZXJ0ZXIpIHsKKwkJaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUikgeworCQkJdGhpcy5yZXNvdXJjZU1hcHBpbmcuc2V0Q29udmVydGVyKChYbWxDb252ZXJ0ZXIpIHJlc291cmNlQ29udmVydGVyKTsKKwkJfQorCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKSB7CisJCQl0aGlzLnJlc291cmNlTWFwcGluZy5zZXRUeXBlQ29udmVydGVyKChYbWxUeXBlQ29udmVydGVyKSByZXNvdXJjZUNvbnZlcnRlcik7CisJCX0KKwkJZWxzZSBpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVIpIHsKKwkJCXRoaXMucmVzb3VyY2VNYXBwaW5nLnNldE9iamVjdFR5cGVDb252ZXJ0ZXIoKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpIHJlc291cmNlQ29udmVydGVyKTsKKwkJfQorCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVIpIHsKKwkJCXRoaXMucmVzb3VyY2VNYXBwaW5nLnNldFN0cnVjdENvbnZlcnRlcigoWG1sU3RydWN0Q29udmVydGVyKSByZXNvdXJjZUNvbnZlcnRlcik7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPD8+IGJ1aWxkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlLCBKcGFFT2JqZWN0IHJlc291cmNlQ29udmVydGVyKSB7CisJCWlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLk5PX0NPTlZFUlRFUikgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUikgeworCQkJcmV0dXJuIGJ1aWxkQ3VzdG9tQ29udmVydGVyKChYbWxDb252ZXJ0ZXIpIHJlc291cmNlQ29udmVydGVyKTsKKwkJfQorCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKSB7CisJCQlyZXR1cm4gYnVpbGRUeXBlQ29udmVydGVyKChYbWxUeXBlQ29udmVydGVyKSByZXNvdXJjZUNvbnZlcnRlcik7CisJCX0KKwkJZWxzZSBpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVIpIHsKKwkJCXJldHVybiBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXIoKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpIHJlc291cmNlQ29udmVydGVyKTsKKwkJfQorCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVIpIHsKKwkJCXJldHVybiBidWlsZFN0cnVjdENvbnZlcnRlcigoWG1sU3RydWN0Q29udmVydGVyKSByZXNvdXJjZUNvbnZlcnRlcik7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0Q29udmVydGVyKE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPD8+IG5ld0NvbnZlcnRlcikgeworCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjw/PiBvbGRDb252ZXJ0ZXIgPSB0aGlzLmNvbnZlcnRlcjsKKwkJdGhpcy5jb252ZXJ0ZXIgPSBuZXdDb252ZXJ0ZXI7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXIsIG5ld0NvbnZlcnRlcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sQ29udmVydGlibGVNYXBwaW5nIHJlc291cmNlTWFwcGluZykgeworCQl0aGlzLnJlc291cmNlTWFwcGluZyA9IHJlc291cmNlTWFwcGluZzsKKwkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lID0gdGhpcy5nZXRSZXNvdXJjZUNvbnZlcnQoKTsKKwkJdGhpcy5jb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJdGhpcy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lXyh0aGlzLmdldFJlc291cmNlQ29udmVydCgpKTsKKwkJaWYgKGdldFJlc291cmNlQ29udmVydGVyVHlwZSgpID09IGdldENvbnZlcnRlclR5cGUoKSkgeworCQkJdGhpcy5jb252ZXJ0ZXIudXBkYXRlKCk7CisJCX0KKwkJZWxzZSB7CisJCQlzZXRDb252ZXJ0ZXIoYnVpbGRDb252ZXJ0ZXIoKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUNvbnZlcnQoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlTWFwcGluZyA9PSBudWxsID8gbnVsbCA6IHRoaXMucmVzb3VyY2VNYXBwaW5nLmdldENvbnZlcnQoKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlQ29udmVydGVyVHlwZSgpIHsKKwkJaWYgKHRoaXMucmVzb3VyY2VNYXBwaW5nLmdldENvbnZlcnRlcigpICE9IG51bGwpIHsKKwkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSOworCQl9CisJCWVsc2UgaWYgKHRoaXMucmVzb3VyY2VNYXBwaW5nLmdldFR5cGVDb252ZXJ0ZXIoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVI7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5yZXNvdXJjZU1hcHBpbmcuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpICE9IG51bGwpIHsKKwkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVI7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5yZXNvdXJjZU1hcHBpbmcuZ2V0U3RydWN0Q29udmVydGVyKCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVI7CisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX0KKwlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4gYnVpbGRDb252ZXJ0ZXIoKSB7CisJCWlmICh0aGlzLnJlc291cmNlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gYnVpbGRDdXN0b21Db252ZXJ0ZXIodGhpcy5yZXNvdXJjZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpOworCQl9CisJCWVsc2UgaWYgKHRoaXMucmVzb3VyY2VNYXBwaW5nLmdldFR5cGVDb252ZXJ0ZXIoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gYnVpbGRUeXBlQ29udmVydGVyKHRoaXMucmVzb3VyY2VNYXBwaW5nLmdldFR5cGVDb252ZXJ0ZXIoKSk7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5yZXNvdXJjZU1hcHBpbmcuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpICE9IG51bGwpIHsKKwkJCXJldHVybiBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXIodGhpcy5yZXNvdXJjZU1hcHBpbmcuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpKTsKKwkJfQorCQllbHNlIGlmICh0aGlzLnJlc291cmNlTWFwcGluZy5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gYnVpbGRTdHJ1Y3RDb252ZXJ0ZXIodGhpcy5yZXNvdXJjZU1hcHBpbmcuZ2V0U3RydWN0Q29udmVydGVyKCkpOworCQl9CisJCQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgYnVpbGRDdXN0b21Db252ZXJ0ZXIoWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyKSB7CisJCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBuZXcgT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIodGhpcyk7CisJCWNvbnRleHRDb252ZXJ0ZXIuaW5pdGlhbGl6ZShyZXNvdXJjZUNvbnZlcnRlcik7CisJCXJldHVybiBjb250ZXh0Q29udmVydGVyOworCX0KKworCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgYnVpbGRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIpIHsKKwkJT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBuZXcgT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKHRoaXMpOworCQljb250ZXh0Q29udmVydGVyLmluaXRpYWxpemUocmVzb3VyY2VDb252ZXJ0ZXIpOworCQlyZXR1cm4gY29udGV4dENvbnZlcnRlcjsKKwl9CisKKwlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyKSB7CisJCU9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gbmV3IE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcih0aGlzKTsKKwkJY29udGV4dENvbnZlcnRlci5pbml0aWFsaXplKHJlc291cmNlQ29udmVydGVyKTsKKwkJcmV0dXJuIGNvbnRleHRDb252ZXJ0ZXI7CisJfQorCisJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGJ1aWxkU3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcikgeworCQlPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gbmV3IE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKHRoaXMpOworCQljb250ZXh0Q29udmVydGVyLmluaXRpYWxpemUocmVzb3VyY2VDb252ZXJ0ZXIpOworCQlyZXR1cm4gY29udGV4dENvbnZlcnRlcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCWlmIChnZXRDb252ZXJ0ZXIoKSAhPSBudWxsKSB7CisJCQlnZXRDb252ZXJ0ZXIoKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDI5NDVmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPFQgZXh0ZW5kcyBYbWxOYW1lZENvbnZlcnRlcj4KKwlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUgaW1wbGVtZW50cyBFY2xpcHNlTGlua0NvbnZlcnRlcgoreworCXByb3RlY3RlZCBUIHJlc291cmNlQ29udmVydGVyOworCQorCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKKwkKKwkKKwlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBzdXBlci5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwl9CisJCisJCisJcHJvdGVjdGVkIFQgZ2V0WG1sUmVzb3VyY2UoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVydGVyOworCX0KKwkKKwlwdWJsaWMgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgeworCQlyZXR1cm4gJyQnOworCX0KKwkKKwkvLyAqKioqKioqKioqKioqKioqIG5hbWUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7CisJCXRoaXMubmFtZSA9IG5ld05hbWU7CisJCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXIuc2V0TmFtZShuZXdOYW1lKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmV3TmFtZSkgeworCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKKwkJdGhpcy5uYW1lID0gbmV3TmFtZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZSBpbnRlcmFjdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoVCByZXNvdXJjZSkgeworCQl0aGlzLnJlc291cmNlQ29udmVydGVyID0gcmVzb3VyY2U7CisJCXRoaXMubmFtZSA9IGdldFJlc291cmNlTmFtZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXRoaXMuc2V0TmFtZV8oZ2V0UmVzb3VyY2VOYW1lKCkpOworCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5hZGRDb252ZXJ0ZXIodGhpcyk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUNvbnZlcnRlci5nZXROYW1lKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXMoRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCS8vIHRoaXMgaXNuJ3QgaWRlYWwsIGJ1dCBpdCB3aWxsIGhhdmUgdG8gZG8gdW50aWwgd2UgaGF2ZSBmdXJ0aGVyIGFkb3B0ZXIgaW5wdXQKKwkJcmV0dXJuIHRoaXMuZ2V0TmFtZSgpLmVxdWFscyhjb252ZXJ0ZXIuZ2V0TmFtZSgpKSAmJiBjb252ZXJ0ZXIgaW5zdGFuY2VvZiBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGR1cGxpY2F0ZXMoRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCXJldHVybiAodGhpcyAhPSBjb252ZXJ0ZXIpCisJCQkJJiYgISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMubmFtZSkKKwkJCQkmJiB0aGlzLm5hbWUuZXF1YWxzKGNvbnZlcnRlci5nZXROYW1lKCkpCisJCQkJJiYgISB0aGlzLm92ZXJyaWRlcyhjb252ZXJ0ZXIpCisJCQkJJiYgISBjb252ZXJ0ZXIub3ZlcnJpZGVzKHRoaXMpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVydGVyLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDcxZjMwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLmphdmEKQEAgLTAsMCArMSw0NTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZSBpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyCit7CQorCXByaXZhdGUgZmluYWwgWG1sQ29udmVydGVyc0hvbGRlciByZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXI7CisJCisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGN1c3RvbUNvbnZlcnRlcnM7CisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8T3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvYmplY3RUeXBlQ29udmVydGVyczsKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gc3RydWN0Q29udmVydGVyczsKKwlwcm90ZWN0ZWQgZmluYWwgTGlzdDxPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IHR5cGVDb252ZXJ0ZXJzOworCQorCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbENvbnZlcnRlcnNIb2xkZXIgcmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyID0gcmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyOworCQl0aGlzLmN1c3RvbUNvbnZlcnRlcnMgPSBuZXcgQXJyYXlMaXN0PE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPigpOworCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJzID0gbmV3IEFycmF5TGlzdDxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+KCk7CisJCXRoaXMuc3RydWN0Q29udmVydGVycyA9IG5ldyBBcnJheUxpc3Q8T3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+KCk7CisJCXRoaXMudHlwZUNvbnZlcnRlcnMgPSBuZXcgQXJyYXlMaXN0PE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4oKTsKKwkJdGhpcy5pbml0aWFsaXplQ3VzdG9tQ29udmVydGVycygpOworCQl0aGlzLmluaXRpYWxpemVPYmplY3RUeXBlQ29udmVydGVycygpOworCQl0aGlzLmluaXRpYWxpemVTdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCXRoaXMuaW5pdGlhbGl6ZVR5cGVDb252ZXJ0ZXJzKCk7CQkKKwl9CisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBjdXN0b21Db252ZXJ0ZXJzKCkgeworCQlyZXR1cm4gdGhpcy5jdXN0b21Db252ZXJ0ZXJzLmxpc3RJdGVyYXRvcigpOworCX0KKworCXB1YmxpYyBpbnQgY3VzdG9tQ29udmVydGVyc1NpemUoKSB7CisJCXJldHVybiB0aGlzLmN1c3RvbUNvbnZlcnRlcnMuc2l6ZSgpOworCX0KKworCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBhZGRDdXN0b21Db252ZXJ0ZXIoaW50IGluZGV4KSB7CisJCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7CisJCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkQ3VzdG9tQ29udmVydGVyKHJlc291cmNlQ29udmVydGVyKTsKKwkJdGhpcy5jdXN0b21Db252ZXJ0ZXJzLmFkZChpbmRleCwgY29udGV4dENvbnZlcnRlcik7CisJCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldENvbnZlcnRlcnMoKS5hZGQoaW5kZXgsIHJlc291cmNlQ29udmVydGVyKTsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKENVU1RPTV9DT05WRVJURVJTX0xJU1QsIGluZGV4LCBjb250ZXh0Q29udmVydGVyKTsKKwkJcmV0dXJuIGNvbnRleHRDb252ZXJ0ZXI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkQ3VzdG9tQ29udmVydGVyKGludCBpbmRleCwgT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyKSB7CisJCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGNvbnZlcnRlciwgdGhpcy5jdXN0b21Db252ZXJ0ZXJzLCBDVVNUT01fQ09OVkVSVEVSU19MSVNUKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRDdXN0b21Db252ZXJ0ZXIoT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyKSB7CisJCXRoaXMuYWRkQ3VzdG9tQ29udmVydGVyKHRoaXMuY3VzdG9tQ29udmVydGVycy5zaXplKCksIGNvbnZlcnRlcik7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlQ3VzdG9tQ29udmVydGVyKGludCBpbmRleCkgeworCQlPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciByZW1vdmVkQ29udmVydGVyID0gdGhpcy5jdXN0b21Db252ZXJ0ZXJzLnJlbW92ZShpbmRleCk7CisJCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldENvbnZlcnRlcnMoKS5yZW1vdmUoaW5kZXgpOworCQlmaXJlSXRlbVJlbW92ZWQoQ1VTVE9NX0NPTlZFUlRFUlNfTElTVCwgaW5kZXgsIHJlbW92ZWRDb252ZXJ0ZXIpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUN1c3RvbUNvbnZlcnRlcihFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKwkJdGhpcy5yZW1vdmVDdXN0b21Db252ZXJ0ZXIodGhpcy5jdXN0b21Db252ZXJ0ZXJzLmluZGV4T2YoY29udmVydGVyKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29udmVydGVyXyhFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KGNvbnZlcnRlciwgdGhpcy5jdXN0b21Db252ZXJ0ZXJzLCBDVVNUT01fQ09OVkVSVEVSU19MSVNUKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlQ3VzdG9tQ29udmVydGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuY3VzdG9tQ29udmVydGVycywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJdGhpcy5yZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIuZ2V0Q29udmVydGVycygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJZmlyZUl0ZW1Nb3ZlZChDVVNUT01fQ09OVkVSVEVSU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIG1vdmVDdXN0b21Db252ZXJ0ZXJfKGludCBpbmRleCwgT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyKSB7CisJCW1vdmVJdGVtSW5MaXN0KGluZGV4LCB0aGlzLmN1c3RvbUNvbnZlcnRlcnMuaW5kZXhPZihjb252ZXJ0ZXIpLCB0aGlzLmN1c3RvbUNvbnZlcnRlcnMsIENVU1RPTV9DT05WRVJURVJTX0xJU1QpOworCX0KKworCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvYmplY3RUeXBlQ29udmVydGVycygpIHsKKwkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcnMubGlzdEl0ZXJhdG9yKCk7CisJfQorCisJcHVibGljIGludCBvYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSB7CisJCXJldHVybiB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KSB7CisJCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7CisJCU9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IHRoaXMuYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcik7CisJCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcnMuYWRkKGluZGV4LCBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcik7CisJCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKGluZGV4LCByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIpOworCQl0aGlzLmZpcmVJdGVtQWRkZWQoT0JKRUNUX1RZUEVfQ09OVkVSVEVSU19MSVNULCBpbmRleCwgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIpOworCQlyZXR1cm4gY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkT2JqZWN0VHlwZUNvbnZlcnRlcihpbnQgaW5kZXgsIE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKwkJYWRkSXRlbVRvTGlzdChpbmRleCwgY29udmVydGVyLCB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJzLCBPQkpFQ1RfVFlQRV9DT05WRVJURVJTX0xJU1QpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlcikgeworCQl0aGlzLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIodGhpcy5vYmplY3RUeXBlQ29udmVydGVycy5zaXplKCksIGNvbnZlcnRlcik7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpIHsKKwkJT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIHJlbW92ZWRPYmplY3RUeXBlQ29udmVydGVyID0gdGhpcy5vYmplY3RUeXBlQ29udmVydGVycy5yZW1vdmUoaW5kZXgpOworCQl0aGlzLnJlc291cmNlQ29udmVydGVyc0hvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZShpbmRleCk7CisJCWZpcmVJdGVtUmVtb3ZlZChPQkpFQ1RfVFlQRV9DT05WRVJURVJTX0xJU1QsIGluZGV4LCByZW1vdmVkT2JqZWN0VHlwZUNvbnZlcnRlcik7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCXRoaXMucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcih0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJzLmluZGV4T2YoY29udmVydGVyKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcl8oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlcikgeworCQlyZW1vdmVJdGVtRnJvbUxpc3QoY29udmVydGVyLCB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJzLCBPQkpFQ1RfVFlQRV9DT05WRVJURVJTX0xJU1QpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVPYmplY3RUeXBlQ29udmVydGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcnMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQlmaXJlSXRlbU1vdmVkKE9CSkVDVF9UWVBFX0NPTlZFUlRFUlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcl8oaW50IGluZGV4LCBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCW1vdmVJdGVtSW5MaXN0KGluZGV4LCB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJzLmluZGV4T2YoY29udmVydGVyKSwgdGhpcy5vYmplY3RUeXBlQ29udmVydGVycywgT0JKRUNUX1RZUEVfQ09OVkVSVEVSU19MSVNUKTsKKwl9CisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBzdHJ1Y3RDb252ZXJ0ZXJzKCkgeworCQlyZXR1cm4gdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzLmxpc3RJdGVyYXRvcigpOworCX0KKworCXB1YmxpYyBpbnQgc3RydWN0Q29udmVydGVyc1NpemUoKSB7CisJCXJldHVybiB0aGlzLnN0cnVjdENvbnZlcnRlcnMuc2l6ZSgpOworCX0KKworCXB1YmxpYyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBhZGRTdHJ1Y3RDb252ZXJ0ZXIoaW50IGluZGV4KSB7CisJCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7CisJCU9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkU3RydWN0Q29udmVydGVyKHJlc291cmNlU3RydWN0Q29udmVydGVyKTsKKwkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzLmFkZChpbmRleCwgY29udGV4dFN0cnVjdENvbnZlcnRlcik7CisJCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQoaW5kZXgsIHJlc291cmNlU3RydWN0Q29udmVydGVyKTsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKFNUUlVDVF9DT05WRVJURVJTX0xJU1QsIGluZGV4LCBjb250ZXh0U3RydWN0Q29udmVydGVyKTsKKwkJcmV0dXJuIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkU3RydWN0Q29udmVydGVyKGludCBpbmRleCwgT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGNvbnZlcnRlciwgdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzLCBTVFJVQ1RfQ09OVkVSVEVSU19MSVNUKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTdHJ1Y3RDb252ZXJ0ZXIoT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCXRoaXMuYWRkU3RydWN0Q29udmVydGVyKHRoaXMuc3RydWN0Q29udmVydGVycy5zaXplKCksIGNvbnZlcnRlcik7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlU3RydWN0Q29udmVydGVyKGludCBpbmRleCkgeworCQlPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciByZW1vdmVkU3RydWN0Q29udmVydGVyID0gdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzLnJlbW92ZShpbmRleCk7CisJCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUoaW5kZXgpOworCQlmaXJlSXRlbVJlbW92ZWQoU1RSVUNUX0NPTlZFUlRFUlNfTElTVCwgaW5kZXgsIHJlbW92ZWRTdHJ1Y3RDb252ZXJ0ZXIpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVN0cnVjdENvbnZlcnRlcihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKwkJdGhpcy5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIodGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzLmluZGV4T2YoY29udmVydGVyKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3RydWN0Q29udmVydGVyXyhFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKwkJcmVtb3ZlSXRlbUZyb21MaXN0KGNvbnZlcnRlciwgdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzLCBTVFJVQ1RfQ09OVkVSVEVSU19MSVNUKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlU3RydWN0Q29udmVydGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7CisJCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuc3RydWN0Q29udmVydGVycywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJdGhpcy5yZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJZmlyZUl0ZW1Nb3ZlZChTVFJVQ1RfQ09OVkVSVEVSU19MSVNULCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIG1vdmVTdHJ1Y3RDb252ZXJ0ZXJfKGludCBpbmRleCwgT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCW1vdmVJdGVtSW5MaXN0KGluZGV4LCB0aGlzLnN0cnVjdENvbnZlcnRlcnMuaW5kZXhPZihjb252ZXJ0ZXIpLCB0aGlzLnN0cnVjdENvbnZlcnRlcnMsIFNUUlVDVF9DT05WRVJURVJTX0xJU1QpOworCX0KKworCisJcHVibGljIExpc3RJdGVyYXRvcjxPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IHR5cGVDb252ZXJ0ZXJzKCkgeworCQlyZXR1cm4gdGhpcy50eXBlQ29udmVydGVycy5saXN0SXRlcmF0b3IoKTsKKwl9CisKKwlwdWJsaWMgaW50IHR5cGVDb252ZXJ0ZXJzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMudHlwZUNvbnZlcnRlcnMuc2l6ZSgpOworCX0KKworCXB1YmxpYyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgYWRkVHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpIHsKKwkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKKwkJT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyID0gdGhpcy5idWlsZFR5cGVDb252ZXJ0ZXIocmVzb3VyY2VUeXBlQ29udmVydGVyKTsKKwkJdGhpcy50eXBlQ29udmVydGVycy5hZGQoaW5kZXgsIGNvbnRleHRUeXBlQ29udmVydGVyKTsKKwkJdGhpcy5yZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQoaW5kZXgsIHJlc291cmNlVHlwZUNvbnZlcnRlcik7CisJCXRoaXMuZmlyZUl0ZW1BZGRlZChUWVBFX0NPTlZFUlRFUlNfTElTVCwgaW5kZXgsIGNvbnRleHRUeXBlQ29udmVydGVyKTsKKwkJcmV0dXJuIGNvbnRleHRUeXBlQ29udmVydGVyOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4LCBPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCWFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGNvbnZlcnRlciwgdGhpcy50eXBlQ29udmVydGVycywgVFlQRV9DT05WRVJURVJTX0xJU1QpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVDb252ZXJ0ZXIoT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlcikgeworCQl0aGlzLmFkZFR5cGVDb252ZXJ0ZXIodGhpcy50eXBlQ29udmVydGVycy5zaXplKCksIGNvbnZlcnRlcik7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlVHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpIHsKKwkJT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIHJlbW92ZWRUeXBlQ29udmVydGVyID0gdGhpcy50eXBlQ29udmVydGVycy5yZW1vdmUoaW5kZXgpOworCQl0aGlzLnJlc291cmNlQ29udmVydGVyc0hvbGRlci5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZShpbmRleCk7CisJCWZpcmVJdGVtUmVtb3ZlZChUWVBFX0NPTlZFUlRFUlNfTElTVCwgaW5kZXgsIHJlbW92ZWRUeXBlQ29udmVydGVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVUeXBlQ29udmVydGVyKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKwkJdGhpcy5yZW1vdmVUeXBlQ29udmVydGVyKHRoaXMudHlwZUNvbnZlcnRlcnMuaW5kZXhPZihjb252ZXJ0ZXIpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVUeXBlQ29udmVydGVyXyhFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCXJlbW92ZUl0ZW1Gcm9tTGlzdChjb252ZXJ0ZXIsIHRoaXMudHlwZUNvbnZlcnRlcnMsIFRZUEVfQ09OVkVSVEVSU19MSVNUKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3ZlVHlwZUNvbnZlcnRlcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgeworCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLnR5cGVDb252ZXJ0ZXJzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl0aGlzLnJlc291cmNlQ29udmVydGVyc0hvbGRlci5nZXRUeXBlQ29udmVydGVycygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKKwkJZmlyZUl0ZW1Nb3ZlZChUWVBFX0NPTlZFUlRFUlNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBtb3ZlVHlwZUNvbnZlcnRlcl8oaW50IGluZGV4LCBPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCW1vdmVJdGVtSW5MaXN0KGluZGV4LCB0aGlzLnR5cGVDb252ZXJ0ZXJzLmluZGV4T2YoY29udmVydGVyKSwgdGhpcy50eXBlQ29udmVydGVycywgVFlQRV9DT05WRVJURVJTX0xJU1QpOworCX0KKwkJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUN1c3RvbUNvbnZlcnRlcnMoKSB7CisJCWZvciAoWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyIDogdGhpcy5yZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIuZ2V0Q29udmVydGVycygpKSB7CisJCQl0aGlzLmN1c3RvbUNvbnZlcnRlcnMuYWRkKHRoaXMuYnVpbGRDdXN0b21Db252ZXJ0ZXIocmVzb3VyY2VDb252ZXJ0ZXIpKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB7CisJCWZvciAoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlciA6IHRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpIHsKKwkJCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcnMuYWRkKHRoaXMuYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKHJlc291cmNlQ29udmVydGVyKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVN0cnVjdENvbnZlcnRlcnMoKSB7CisJCWZvciAoWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlQ29udmVydGVyIDogdGhpcy5yZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpKSB7CisJCQl0aGlzLnN0cnVjdENvbnZlcnRlcnMuYWRkKHRoaXMuYnVpbGRTdHJ1Y3RDb252ZXJ0ZXIocmVzb3VyY2VDb252ZXJ0ZXIpKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVHlwZUNvbnZlcnRlcnMoKSB7CisJCWZvciAoWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlciA6IHRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkpIHsKKwkJCXRoaXMudHlwZUNvbnZlcnRlcnMuYWRkKHRoaXMuYnVpbGRUeXBlQ29udmVydGVyKHJlc291cmNlQ29udmVydGVyKSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGJ1aWxkQ3VzdG9tQ29udmVydGVyKFhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcikgeworCQlPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gbmV3IE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKHRoaXMpOworCQljb250ZXh0Q29udmVydGVyLmluaXRpYWxpemUocmVzb3VyY2VDb252ZXJ0ZXIpOworCQlyZXR1cm4gY29udGV4dENvbnZlcnRlcjsKKwl9CisKKwlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGJ1aWxkVHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyKSB7CisJCU9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gbmV3IE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcih0aGlzKTsKKwkJY29udGV4dENvbnZlcnRlci5pbml0aWFsaXplKHJlc291cmNlQ29udmVydGVyKTsKKwkJcmV0dXJuIGNvbnRleHRDb252ZXJ0ZXI7CisJfQorCisJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcikgeworCQlPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG5ldyBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIodGhpcyk7CisJCWNvbnRleHRDb252ZXJ0ZXIuaW5pdGlhbGl6ZShyZXNvdXJjZUNvbnZlcnRlcik7CisJCXJldHVybiBjb250ZXh0Q29udmVydGVyOworCX0KKworCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBidWlsZFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIpIHsKKwkJT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG5ldyBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcih0aGlzKTsKKwkJY29udGV4dENvbnZlcnRlci5pbml0aWFsaXplKHJlc291cmNlQ29udmVydGVyKTsKKwkJcmV0dXJuIGNvbnRleHRDb252ZXJ0ZXI7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQl0aGlzLnVwZGF0ZUN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJdGhpcy51cGRhdGVPYmplY3RUeXBlQ29udmVydGVycygpOworCQl0aGlzLnVwZGF0ZVN0cnVjdENvbnZlcnRlcnMoKTsKKwkJdGhpcy51cGRhdGVUeXBlQ29udmVydGVycygpOwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUN1c3RvbUNvbnZlcnRlcnMoKSB7CisJCUNvbGxlY3Rpb248T3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGNvbnRleHRDb252ZXJ0ZXJzVG9SZW1vdmUgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihjdXN0b21Db252ZXJ0ZXJzKCkpOworCQlDb2xsZWN0aW9uPE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBjb250ZXh0Q29udmVydGVyc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdDxPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4oKTsKKwkJaW50IHJlc291cmNlSW5kZXggPSAwOworCQkKKwkJLy8gbWFrZSBhIGNvcHkgb2YgdGhlIFhNTCBjb252ZXJzaW9uIHZhbHVlcyAodG8gcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKQorCQlMaXN0PFhtbENvbnZlcnRlcj4geG1sQ29udmVydGVycyA9IHRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldENvbnZlcnRlcnMoKTsKKwkJZm9yIChYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIgOiB4bWxDb252ZXJ0ZXJzLnRvQXJyYXkobmV3IFhtbENvbnZlcnRlclt4bWxDb252ZXJ0ZXJzLnNpemUoKV0pKSB7CisJCQlib29sZWFuIGNvbnRleHRDb252ZXJ0ZXJGb3VuZCA9IGZhbHNlOworCQkJZm9yIChPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyIDogY29udGV4dENvbnZlcnRlcnNUb1JlbW92ZSkgeworCQkJCWlmIChjb250ZXh0Q29udmVydGVyLmdldFhtbFJlc291cmNlKCkgPT0gcmVzb3VyY2VDb252ZXJ0ZXIpIHsKKwkJCQkJbW92ZUN1c3RvbUNvbnZlcnRlcl8ocmVzb3VyY2VJbmRleCwgY29udGV4dENvbnZlcnRlcik7CisJCQkJCWNvbnRleHRDb252ZXJ0ZXJzVG9SZW1vdmUucmVtb3ZlKGNvbnRleHRDb252ZXJ0ZXIpOworCQkJCQljb250ZXh0Q29udmVydGVyc1RvVXBkYXRlLmFkZChjb250ZXh0Q29udmVydGVyKTsKKwkJCQkJY29udGV4dENvbnZlcnRlckZvdW5kID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKCFjb250ZXh0Q29udmVydGVyRm91bmQpIHsKKwkJCQlhZGRDdXN0b21Db252ZXJ0ZXIodGhpcy5idWlsZEN1c3RvbUNvbnZlcnRlcihyZXNvdXJjZUNvbnZlcnRlcikpOworCQkJfQorCQkJcmVzb3VyY2VJbmRleCsrOworCQl9CisJCWZvciAoT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA6IGNvbnRleHRDb252ZXJ0ZXJzVG9SZW1vdmUpIHsKKwkJCXJlbW92ZUNvbnZlcnRlcl8oY29udGV4dENvbnZlcnRlcik7CisJCX0KKwkJLy9maXJzdCBoYW5kbGUgYWRkaW5nL3JlbW92aW5nIG9mIHRoZSBjb252ZXJ0ZXJzLCB0aGVuIHVwZGF0ZSB0aGUgb3RoZXJzIGxhc3QsIAorCQkvL3RoaXMgY2F1c2VzIGxlc3MgY2h1cm4gaW4gdGhlIHVwZGF0ZSBwcm9jZXNzCisJCWZvciAoT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA6IGNvbnRleHRDb252ZXJ0ZXJzVG9VcGRhdGUpIHsKKwkJCWNvbnRleHRDb252ZXJ0ZXIudXBkYXRlKCk7CisJCX0JCisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgeworCQlDb2xsZWN0aW9uPE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gY29udGV4dENvbnZlcnRlcnNUb1JlbW92ZSA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpOworCQlDb2xsZWN0aW9uPE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gY29udGV4dENvbnZlcnRlcnNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3Q8T3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPigpOworCQlpbnQgcmVzb3VyY2VJbmRleCA9IDA7CisKKwkJLy8gbWFrZSBhIGNvcHkgb2YgdGhlIFhNTCBjb252ZXJ0ZXJzICh0byBwcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24pCisJCUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4geG1sQ29udmVydGVycyA9IHRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCWZvciAoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciB4bWxDb252ZXJ0ZXIgOiB4bWxDb252ZXJ0ZXJzLnRvQXJyYXkobmV3IFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJbeG1sQ29udmVydGVycy5zaXplKCldKSkgeworCQkJYm9vbGVhbiBjb250ZXh0Q29udmVydGVyRm91bmQgPSBmYWxzZTsKKwkJCWZvciAoT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyIDogY29udGV4dENvbnZlcnRlcnNUb1JlbW92ZSkgeworCQkJCWlmIChjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXRYbWxSZXNvdXJjZSgpID09IHhtbENvbnZlcnRlcikgeworCQkJCQltb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcl8ocmVzb3VyY2VJbmRleCwgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIpOworCQkJCQljb250ZXh0Q29udmVydGVyc1RvUmVtb3ZlLnJlbW92ZShjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcik7CisJCQkJCWNvbnRleHRDb252ZXJ0ZXJzVG9VcGRhdGUuYWRkKGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyKTsKKwkJCQkJY29udGV4dENvbnZlcnRlckZvdW5kID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKCFjb250ZXh0Q29udmVydGVyRm91bmQpIHsKKwkJCQlhZGRPYmplY3RUeXBlQ29udmVydGVyKHRoaXMuYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKHhtbENvbnZlcnRlcikpOworCQkJfQorCQkJcmVzb3VyY2VJbmRleCsrOworCQl9CisJCWZvciAoT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyIDogY29udGV4dENvbnZlcnRlcnNUb1JlbW92ZSkgeworCQkJcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcl8oY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIpOworCQl9CisJCS8vZmlyc3QgaGFuZGxlIGFkZGluZy9yZW1vdmluZyBvZiB0aGUgY29udmVydGVycywgdGhlbiB1cGRhdGUgdGhlIG90aGVycyBsYXN0LCAKKwkJLy90aGlzIGNhdXNlcyBsZXNzIGNodXJuIGluIHRoZSB1cGRhdGUgcHJvY2VzcworCQlmb3IgKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA6IGNvbnRleHRDb252ZXJ0ZXJzVG9VcGRhdGUpIHsKKwkJCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnVwZGF0ZSgpOworCQl9CQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUeXBlQ29udmVydGVycygpIHsKKwkJQ29sbGVjdGlvbjxPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IGNvbnRleHRDb252ZXJ0ZXJzVG9SZW1vdmUgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0eXBlQ29udmVydGVycygpKTsKKwkJQ29sbGVjdGlvbjxPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IGNvbnRleHRDb252ZXJ0ZXJzVG9VcGRhdGUgPSBuZXcgQXJyYXlMaXN0PE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4oKTsKKwkJaW50IHJlc291cmNlSW5kZXggPSAwOworCQkKKwkJTGlzdDxYbWxUeXBlQ29udmVydGVyPiB4bWxDb252ZXJ0ZXJzID0gdGhpcy5yZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKTsKKwkJZm9yIChYbWxUeXBlQ29udmVydGVyIHhtbENvbnZlcnRlciA6IHhtbENvbnZlcnRlcnMudG9BcnJheShuZXcgWG1sVHlwZUNvbnZlcnRlclt4bWxDb252ZXJ0ZXJzLnNpemUoKV0pKSB7CisJCQlib29sZWFuIGNvbnRleHRUeXBlQ29udmVydGVyRm91bmQgPSBmYWxzZTsKKwkJCWZvciAoT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyIDogY29udGV4dENvbnZlcnRlcnNUb1JlbW92ZSkgeworCQkJCWlmIChjb250ZXh0VHlwZUNvbnZlcnRlci5nZXRYbWxSZXNvdXJjZSgpID09IHhtbENvbnZlcnRlcikgeworCQkJCQltb3ZlVHlwZUNvbnZlcnRlcl8ocmVzb3VyY2VJbmRleCwgY29udGV4dFR5cGVDb252ZXJ0ZXIpOworCQkJCQljb250ZXh0Q29udmVydGVyc1RvUmVtb3ZlLnJlbW92ZShjb250ZXh0VHlwZUNvbnZlcnRlcik7CisJCQkJCWNvbnRleHRDb252ZXJ0ZXJzVG9VcGRhdGUuYWRkKGNvbnRleHRUeXBlQ29udmVydGVyKTsKKwkJCQkJY29udGV4dFR5cGVDb252ZXJ0ZXJGb3VuZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmICghY29udGV4dFR5cGVDb252ZXJ0ZXJGb3VuZCkgeworCQkJCWFkZFR5cGVDb252ZXJ0ZXIodGhpcy5idWlsZFR5cGVDb252ZXJ0ZXIoeG1sQ29udmVydGVyKSk7CisJCQl9CisJCQlyZXNvdXJjZUluZGV4Kys7CisJCX0KKwkJZm9yIChPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIgOiBjb250ZXh0Q29udmVydGVyc1RvUmVtb3ZlKSB7CisJCQlyZW1vdmVUeXBlQ29udmVydGVyXyhjb250ZXh0VHlwZUNvbnZlcnRlcik7CisJCX0KKwkJLy9maXJzdCBoYW5kbGUgYWRkaW5nL3JlbW92aW5nIG9mIHRoZSBjb252ZXJ0ZXJzLCB0aGVuIHVwZGF0ZSB0aGUgb3RoZXJzIGxhc3QsIAorCQkvL3RoaXMgY2F1c2VzIGxlc3MgY2h1cm4gaW4gdGhlIHVwZGF0ZSBwcm9jZXNzCisJCWZvciAoT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyIDogY29udGV4dENvbnZlcnRlcnNUb1VwZGF0ZSkgeworCQkJY29udGV4dFR5cGVDb252ZXJ0ZXIudXBkYXRlKCk7CisJCX0JCisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0cnVjdENvbnZlcnRlcnMoKSB7CisJCUNvbGxlY3Rpb248T3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IGNvbnRleHRDb252ZXJ0ZXJzVG9SZW1vdmUgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzdHJ1Y3RDb252ZXJ0ZXJzKCkpOworCQlDb2xsZWN0aW9uPE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBjb250ZXh0Q29udmVydGVyc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdDxPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4oKTsKKwkJaW50IHJlc291cmNlSW5kZXggPSAwOworCQkKKwkJLy8gbWFrZSBhIGNvcHkgb2YgdGhlIFhNTCBjb252ZXJ0ZXJzICh0byBwcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24pCisJCUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiB4bWxDb252ZXJ0ZXJzID0gdGhpcy5yZXNvdXJjZUNvbnZlcnRlcnNIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpOworCQlmb3IgKFhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlciA6IHhtbENvbnZlcnRlcnMudG9BcnJheShuZXcgWG1sU3RydWN0Q29udmVydGVyW3htbENvbnZlcnRlcnMuc2l6ZSgpXSkpIHsKKwkJCWJvb2xlYW4gY29udGV4dFN0cnVjdENvbnZlcnRlckZvdW5kID0gZmFsc2U7CisJCQlmb3IgKE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgOiBjb250ZXh0Q29udmVydGVyc1RvUmVtb3ZlKSB7CisJCQkJaWYgKGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0WG1sUmVzb3VyY2UoKSA9PSByZXNvdXJjZVN0cnVjdENvbnZlcnRlcikgeworCQkJCQltb3ZlU3RydWN0Q29udmVydGVyXyhyZXNvdXJjZUluZGV4LCBjb250ZXh0U3RydWN0Q29udmVydGVyKTsKKwkJCQkJY29udGV4dENvbnZlcnRlcnNUb1JlbW92ZS5yZW1vdmUoY29udGV4dFN0cnVjdENvbnZlcnRlcik7CisJCQkJCWNvbnRleHRDb252ZXJ0ZXJzVG9VcGRhdGUuYWRkKGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIpOworCQkJCQljb250ZXh0U3RydWN0Q29udmVydGVyRm91bmQgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoIWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJGb3VuZCkgeworCQkJCWFkZFN0cnVjdENvbnZlcnRlcih0aGlzLmJ1aWxkU3RydWN0Q29udmVydGVyKHJlc291cmNlU3RydWN0Q29udmVydGVyKSk7CisJCQl9CisJCQlyZXNvdXJjZUluZGV4Kys7CisJCX0KKwkJZm9yIChPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyIDogY29udGV4dENvbnZlcnRlcnNUb1JlbW92ZSkgeworCQkJcmVtb3ZlU3RydWN0Q29udmVydGVyXyhjb250ZXh0U3RydWN0Q29udmVydGVyKTsKKwkJfQorCQkvL2ZpcnN0IGhhbmRsZSBhZGRpbmcvcmVtb3Zpbmcgb2YgdGhlIGNvbnZlcnRlcnMsIHRoZW4gdXBkYXRlIHRoZSBvdGhlcnMgbGFzdCwgCisJCS8vdGhpcyBjYXVzZXMgbGVzcyBjaHVybiBpbiB0aGUgdXBkYXRlIHByb2Nlc3MKKwkJZm9yIChPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyIDogY29udGV4dENvbnZlcnRlcnNUb1VwZGF0ZSkgeworCQkJY29udGV4dFN0cnVjdENvbnZlcnRlci51cGRhdGUoKTsKKwkJfQkKKwl9CisKKwkvLyoqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwl9CisKKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VDb252ZXJ0ZXJzSG9sZGVyLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKKwl9CisKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDU3NzJmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBleHRlbmRzIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPFhtbENvbnZlcnRlcj4KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyCit7CQorCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRlckNsYXNzOworCQorCQorCXB1YmxpYyBPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUjsKKwl9CisKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGNvbnZlcnRlciBjbGFzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJDbGFzcygpIHsKKwkJcmV0dXJuIHRoaXMuY29udmVydGVyQ2xhc3M7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlckNsYXNzKFN0cmluZyBuZXdDb252ZXJ0ZXJDbGFzcykgeworCQlTdHJpbmcgb2xkQ29udmVydGVyQ2xhc3MgPSB0aGlzLmNvbnZlcnRlckNsYXNzOworCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gbmV3Q29udmVydGVyQ2xhc3M7CisJCXRoaXMucmVzb3VyY2VDb252ZXJ0ZXIuc2V0Q2xhc3NOYW1lKG5ld0NvbnZlcnRlckNsYXNzKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfQ0xBU1NfUFJPUEVSVFksIG9sZENvbnZlcnRlckNsYXNzLCBuZXdDb252ZXJ0ZXJDbGFzcyk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlckNsYXNzXyhTdHJpbmcgbmV3Q29udmVydGVyQ2xhc3MpIHsKKwkJU3RyaW5nIG9sZENvbnZlcnRlckNsYXNzID0gdGhpcy5jb252ZXJ0ZXJDbGFzczsKKwkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IG5ld0NvbnZlcnRlckNsYXNzOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkQ29udmVydGVyQ2xhc3MsIG5ld0NvbnZlcnRlckNsYXNzKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZSBpbnRlcmFjdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sQ29udmVydGVyIHhtbFJlc291cmNlKSB7CisJCXN1cGVyLmluaXRpYWxpemUoeG1sUmVzb3VyY2UpOworCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gZ2V0UmVzb3VyY2VDbGFzc05hbWUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJc2V0Q29udmVydGVyQ2xhc3NfKGdldFJlc291cmNlQ2xhc3NOYW1lKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlQ2xhc3NOYW1lKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUNvbnZlcnRlci5nZXRDbGFzc05hbWUoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdmFsaWRhdGVDb252ZXJ0ZXJDbGFzcyhtZXNzYWdlcyk7CisJfQorLy9UT0RPIHZhbGlkYXRlIGNvbnZlcnRlciBjbGFzcwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnZlcnRlckNsYXNzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7CisvLwkJaWYgKCFnZXRSZXNvdXJjZUNvbnZlcnRlcigpLmltcGxlbWVudHNDb252ZXJ0ZXIoKSkgeworLy8JCQltZXNzYWdlcy5hZGQoCisvLwkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorLy8JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisvLwkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09OVkVSVEVSX0NMQVNTX0lNUExFTUVOVFNfQ09OVkVSVEVSLAorLy8JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5jb252ZXJ0ZXJDbGFzc30sCisvLwkJCQkJdGhpcywgCisvLwkJCQkJZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKQorLy8JCQkJKQorLy8JCQkpOworLy8JCX0KKwl9CisJCisvLwlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKCkgeworLy8JCXJldHVybiBnZXRSZXNvdXJjZUNvbnZlcnRlcigpLmdldENsYXNzTmFtZVRleHRSYW5nZSgpOworLy8JfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDk0OGFlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ3VzdG9taXplci5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyOworCitwdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDdXN0b21pemVyIGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDdXN0b21pemVyCit7CisJcHJvdGVjdGVkIGZpbmFsIFhtbEN1c3RvbWl6ZXJIb2xkZXIgcmVzb3VyY2U7CisJCisJcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDdXN0b21pemVyQ2xhc3M7CisJCisJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q3VzdG9taXplckNsYXNzOworCQorCXB1YmxpYyBPcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIoT3JtVHlwZU1hcHBpbmcgcGFyZW50LCBYbWxDdXN0b21pemVySG9sZGVyIHJlc291cmNlLCBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgamF2YUN1c3RvbWl6ZXIpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCQl0aGlzLmRlZmF1bHRDdXN0b21pemVyQ2xhc3MgPSBnZXRKYXZhQ3VzdG9taXplckNsYXNzKGphdmFDdXN0b21pemVyKTsKKwkJdGhpcy5zcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MgPSBnZXRSZXNvdXJjZUN1c3RvbWl6ZXJDbGFzcygpOworCX0KKwkKKwlwdWJsaWMgY2hhciBnZXRDdXN0b21pemVyQ2xhc3NFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgeworCQlyZXR1cm4gJyQnOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEN1c3RvbWl6ZXJDbGFzcygpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzID09IG51bGwgPyB0aGlzLmRlZmF1bHRDdXN0b21pemVyQ2xhc3MgOiB0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzczsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q3VzdG9taXplckNsYXNzOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKFN0cmluZyBuZXdEZWZhdWx0Q3VzdG9taXplckNsYXNzKSB7CisJCVN0cmluZyBvbGREZWZhdWx0Q3VzdG9taXplckNsYXNzID0gdGhpcy5kZWZhdWx0Q3VzdG9taXplckNsYXNzOworCQl0aGlzLmRlZmF1bHRDdXN0b21pemVyQ2xhc3MgPSBuZXdEZWZhdWx0Q3VzdG9taXplckNsYXNzOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ1VTVE9NSVpFUl9DTEFTU19QUk9QRVJUWSwgb2xkRGVmYXVsdEN1c3RvbWl6ZXJDbGFzcywgbmV3RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcyk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDdXN0b21pemVyQ2xhc3M7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhTdHJpbmcgbmV3Q3VzdG9taXplckNsYXNzKSB7CisJCVN0cmluZyBvbGRDdXN0b21pemVyQ2xhc3MgPSB0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzczsKKwkJdGhpcy5zcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MgPSBuZXdDdXN0b21pemVyQ2xhc3M7CisJCWlmIChvbGRDdXN0b21pemVyQ2xhc3MgIT0gbmV3Q3VzdG9taXplckNsYXNzKSB7CisJCQlpZiAodGhpcy5nZXRSZXNvdXJjZUN1c3RvbWl6ZXIoKSAhPSBudWxsKSB7CisJCQkJdGhpcy5nZXRSZXNvdXJjZUN1c3RvbWl6ZXIoKS5zZXRDdXN0b21pemVyQ2xhc3NOYW1lKG5ld0N1c3RvbWl6ZXJDbGFzcyk7CQkJCQkJCisJCQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VDdXN0b21pemVyKCkuaXNVbnNldCgpKSB7CisJCQkJCXJlbW92ZVJlc291cmNlQ3VzdG9taXplcigpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKG5ld0N1c3RvbWl6ZXJDbGFzcyAhPSBudWxsKSB7CisJCQkJYWRkUmVzb3VyY2VDdXN0b21pemVyKCk7CisJCQkJZ2V0UmVzb3VyY2VDdXN0b21pemVyKCkuc2V0Q3VzdG9taXplckNsYXNzTmFtZShuZXdDdXN0b21pemVyQ2xhc3MpOworCQkJfQorCQl9CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFksIG9sZEN1c3RvbWl6ZXJDbGFzcywgbmV3Q3VzdG9taXplckNsYXNzKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzXyhTdHJpbmcgbmV3Q3VzdG9taXplckNsYXNzKSB7CisJCVN0cmluZyBvbGRDdXN0b21pemVyQ2xhc3MgPSB0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzczsKKwkJdGhpcy5zcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MgPSBuZXdDdXN0b21pemVyQ2xhc3M7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFksIG9sZEN1c3RvbWl6ZXJDbGFzcywgbmV3Q3VzdG9taXplckNsYXNzKTsKKwl9CisJCisJcHJvdGVjdGVkIFhtbEN1c3RvbWl6ZXIgZ2V0UmVzb3VyY2VDdXN0b21pemVyKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXRDdXN0b21pemVyKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlQ3VzdG9taXplcigpIHsKKwkJdGhpcy5yZXNvdXJjZS5zZXRDdXN0b21pemVyKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ3VzdG9taXplcigpKTsJCQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZUN1c3RvbWl6ZXIoKSB7CisJCXRoaXMucmVzb3VyY2Uuc2V0Q3VzdG9taXplcihudWxsKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShFY2xpcHNlTGlua0N1c3RvbWl6ZXIgamF2YUN1c3RvbWl6ZXIpIHsKKwkJc2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcyhnZXRKYXZhQ3VzdG9taXplckNsYXNzKGphdmFDdXN0b21pemVyKSk7CisJCXNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzc18oZ2V0UmVzb3VyY2VDdXN0b21pemVyQ2xhc3MoKSk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0SmF2YUN1c3RvbWl6ZXJDbGFzcyhFY2xpcHNlTGlua0N1c3RvbWl6ZXIgamF2YUN1c3RvbWl6ZXIpIHsKKwkJcmV0dXJuIChqYXZhQ3VzdG9taXplciA9PSBudWxsKSA/IG51bGwgOiBqYXZhQ3VzdG9taXplci5nZXRDdXN0b21pemVyQ2xhc3MoKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUN1c3RvbWl6ZXJDbGFzcygpIHsKKwkJWG1sQ3VzdG9taXplciByZXNvdXJjZSA9IGdldFJlc291cmNlQ3VzdG9taXplcigpOworCQlyZXR1cm4gKHJlc291cmNlID09IG51bGwpID8gbnVsbCA6IHJlc291cmNlLmdldEN1c3RvbWl6ZXJDbGFzc05hbWUoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlYbWxDdXN0b21pemVyIHJlc291cmNlID0gZ2V0UmVzb3VyY2VDdXN0b21pemVyKCk7CisJCXJldHVybiByZXNvdXJjZSA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlLmdldEN1c3RvbWl6ZXJDbGFzc05hbWVUZXh0UmFuZ2UoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjIzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlSW1wbC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXJIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwgZXh0ZW5kcyBBYnN0cmFjdE9ybUVtYmVkZGFibGUKKwlpbXBsZW1lbnRzIE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZQoreworCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplcjsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjaGFuZ2VUcmFja2luZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgY29udmVydGVySG9sZGVyOworCQorCXB1YmxpYyBPcm1FY2xpcHNlTGlua0VtYmVkZGFibGVJbXBsKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sRW1iZWRkYWJsZSByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCQl0aGlzLmN1c3RvbWl6ZXIgPSBuZXcgT3JtRWNsaXBzZUxpbmtDdXN0b21pemVyKHRoaXMsIChYbWxDdXN0b21pemVySG9sZGVyKSB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcsIGdldEphdmFDdXN0b21pemVyKCkpOworCQl0aGlzLmNoYW5nZVRyYWNraW5nID0gbmV3IE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcodGhpcywgKFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKSB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcsIGdldEphdmFDaGFuZ2VUcmFja2luZygpKTsKKwkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIgPSBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIodGhpcywgKFhtbENvbnZlcnRlcnNIb2xkZXIpIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZyk7IAorCX0KKworCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpIHsKKwkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKKwl9CisJCisJcHVibGljIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZ2V0Q2hhbmdlVHJhY2tpbmcoKSB7CisJCXJldHVybiB0aGlzLmNoYW5nZVRyYWNraW5nOworCX0KKworCXB1YmxpYyBFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBnZXRDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiB0aGlzLmNvbnZlcnRlckhvbGRlcjsKKwl9CisKKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlLWNvbnRleHQgaW50ZXJhY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLmN1c3RvbWl6ZXIudXBkYXRlKGdldEphdmFDdXN0b21pemVyKCkpOworCQl0aGlzLmNoYW5nZVRyYWNraW5nLnVwZGF0ZShnZXRKYXZhQ2hhbmdlVHJhY2tpbmcoKSk7CisJCXRoaXMuY29udmVydGVySG9sZGVyLnVwZGF0ZSgpOyAKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUgZ2V0SmF2YUVtYmVkZGFibGVGb3JEZWZhdWx0cygpIHsKKwkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBzdXBlci5nZXRKYXZhRW1iZWRkYWJsZUZvckRlZmF1bHRzKCk7CisJfQorCQorCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0SmF2YUN1c3RvbWl6ZXIoKSB7CisJCUphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUgamF2YUVtYmVkZGFibGUgPSBnZXRKYXZhRW1iZWRkYWJsZUZvckRlZmF1bHRzKCk7CisJCXJldHVybiAoamF2YUVtYmVkZGFibGUgPT0gbnVsbCkgPyBudWxsIDogamF2YUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpOworCX0KKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRKYXZhQ2hhbmdlVHJhY2tpbmcoKSB7CisJCUphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUgamF2YUVtYmVkZGFibGUgPSBnZXRKYXZhRW1iZWRkYWJsZUZvckRlZmF1bHRzKCk7CisJCXJldHVybiAoamF2YUVtYmVkZGFibGUgPT0gbnVsbCkgPyBudWxsIDogamF2YUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl0aGlzLmN1c3RvbWl6ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy5jaGFuZ2VUcmFja2luZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eUltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2M4YWVhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUNhY2hlYWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUNhY2hlYWJsZUhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0VudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlYWRPbmx5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0VudGl0eUltcGwgZXh0ZW5kcyBBYnN0cmFjdE9ybUVudGl0eQorCWltcGxlbWVudHMgT3JtRWNsaXBzZUxpbmtFbnRpdHkKK3sKKwlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seTsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXI7CisJCisJcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY2hhbmdlVHJhY2tpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBjb252ZXJ0ZXJIb2xkZXI7CisJCisJCisJcHVibGljIE9ybUVjbGlwc2VMaW5rRW50aXR5SW1wbChPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFhtbEVudGl0eSByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCQl0aGlzLnJlYWRPbmx5ID0gbmV3IE9ybUVjbGlwc2VMaW5rUmVhZE9ubHkodGhpcywgKFhtbFJlYWRPbmx5KSB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcsIGdldEphdmFSZWFkT25seSgpKTsKKwkJdGhpcy5jdXN0b21pemVyID0gbmV3IE9ybUVjbGlwc2VMaW5rQ3VzdG9taXplcih0aGlzLCAoWG1sQ3VzdG9taXplckhvbGRlcikgdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLCBnZXRKYXZhQ3VzdG9taXplcigpKTsKKwkJdGhpcy5jaGFuZ2VUcmFja2luZyA9IG5ldyBPcm1FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nKHRoaXMsIChYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcikgdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLCBnZXRKYXZhQ2hhbmdlVHJhY2tpbmcoKSk7CisJCXRoaXMuY2FjaGluZyA9IG5ldyBPcm1FY2xpcHNlTGlua0NhY2hpbmdJbXBsKHRoaXMsIChYbWxDYWNoZUhvbGRlcikgdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nLCAoWG1sQ2FjaGVhYmxlMl8wKSB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcsIGdldEphdmFDYWNoaW5nKCkpOworCQl0aGlzLmNvbnZlcnRlckhvbGRlciA9IG5ldyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcih0aGlzLCAoWG1sQ29udmVydGVyc0hvbGRlcikgdGhpcy5yZXNvdXJjZVR5cGVNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIE9ybUVjbGlwc2VMaW5rQ2FjaGluZyBnZXRDYWNoaW5nKCkgeworCQlyZXR1cm4gdGhpcy5jYWNoaW5nOworCX0KKworCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpIHsKKwkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKKwl9CisKKwlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpIHsKKwkJcmV0dXJuIHRoaXMuY2hhbmdlVHJhY2tpbmc7CisJfQorCisJcHVibGljIE9ybUVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0UmVhZE9ubHkoKSB7CisJCXJldHVybiB0aGlzLnJlYWRPbmx5OworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgZ2V0Q29udmVydGVySG9sZGVyKCkgeworCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJIb2xkZXI7CisJfQorCisJcHVibGljIE9ybUNhY2hlYWJsZTJfMCBnZXRDYWNoZWFibGUoKSB7CisJCXJldHVybiAoKE9ybUNhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0Q2FjaGluZygpKS5nZXRDYWNoZWFibGUoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpIHsKKwkJcmV0dXJuICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRDYWNoaW5nKCkpLmNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZS1jb250ZXh0IGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMucmVhZE9ubHkudXBkYXRlKGdldEphdmFSZWFkT25seSgpKTsKKwkJdGhpcy5jdXN0b21pemVyLnVwZGF0ZShnZXRKYXZhQ3VzdG9taXplcigpKTsKKwkJdGhpcy5jaGFuZ2VUcmFja2luZy51cGRhdGUoZ2V0SmF2YUNoYW5nZVRyYWNraW5nKCkpOworCQl0aGlzLmNhY2hpbmcudXBkYXRlKGdldEphdmFDYWNoaW5nKCkpOworCQl0aGlzLmNvbnZlcnRlckhvbGRlci51cGRhdGUoKTsgCisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZ2V0SmF2YUVudGl0eUZvckRlZmF1bHRzKCkgeworCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgc3VwZXIuZ2V0SmF2YUVudGl0eUZvckRlZmF1bHRzKCk7CisJfQorCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua1JlYWRPbmx5IGdldEphdmFSZWFkT25seSgpIHsKKwkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGphdmFFbnRpdHkgPSBnZXRKYXZhRW50aXR5Rm9yRGVmYXVsdHMoKTsKKwkJcmV0dXJuIChqYXZhRW50aXR5ID09IG51bGwpID8gbnVsbCA6IGphdmFFbnRpdHkuZ2V0UmVhZE9ubHkoKTsKKwl9CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRKYXZhQ3VzdG9taXplcigpIHsKKwkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGphdmFFbnRpdHkgPSBnZXRKYXZhRW50aXR5Rm9yRGVmYXVsdHMoKTsKKwkJcmV0dXJuIChqYXZhRW50aXR5ID09IG51bGwpID8gbnVsbCA6IGphdmFFbnRpdHkuZ2V0Q3VzdG9taXplcigpOworCX0KKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRKYXZhQ2hhbmdlVHJhY2tpbmcoKSB7CisJCUphdmFFY2xpcHNlTGlua0VudGl0eSBqYXZhRW50aXR5ID0gZ2V0SmF2YUVudGl0eUZvckRlZmF1bHRzKCk7CisJCXJldHVybiAoamF2YUVudGl0eSA9PSBudWxsKSA/IG51bGwgOiBqYXZhRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCk7CisJfQorCQorCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGdldEphdmFDYWNoaW5nKCkgeworCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgamF2YUVudGl0eSA9IGdldEphdmFFbnRpdHlGb3JEZWZhdWx0cygpOworCQlyZXR1cm4gKGphdmFFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogamF2YUVudGl0eS5nZXRDYWNoaW5nKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy5yZWFkT25seS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl0aGlzLmN1c3RvbWl6ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy5jaGFuZ2VUcmFja2luZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl0aGlzLmNhY2hpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwY2YzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheTsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkKK3sKKwkKKwlwcm90ZWN0ZWQgSW50ZWdlciBob3VyOworCXByb3RlY3RlZCBJbnRlZ2VyIG1pbnV0ZTsKKwlwcm90ZWN0ZWQgSW50ZWdlciBzZWNvbmQ7CisJcHJvdGVjdGVkIEludGVnZXIgbWlsbGlzZWNvbmQ7CisJCisJcHJvdGVjdGVkIFhtbFRpbWVPZkRheSByZXNvdXJjZVRpbWVPZkRheTsKKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkoT3JtRWNsaXBzZUxpbmtDYWNoaW5nIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwkKKwlwdWJsaWMgSW50ZWdlciBnZXRIb3VyKCkgeworCQlyZXR1cm4gdGhpcy5ob3VyOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhvdXIoSW50ZWdlciBuZXdIb3VyKSB7CisJCUludGVnZXIgb2xkSG91ciA9IHRoaXMuaG91cjsKKwkJdGhpcy5ob3VyID0gbmV3SG91cjsKKwkJdGhpcy5yZXNvdXJjZVRpbWVPZkRheS5zZXRIb3VyKG5ld0hvdXIpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEhPVVJfUFJPUEVSVFksIG9sZEhvdXIsIG5ld0hvdXIpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldEhvdXJfKEludGVnZXIgbmV3SG91cikgeworCQlJbnRlZ2VyIG9sZEhvdXIgPSB0aGlzLmhvdXI7CisJCXRoaXMuaG91ciA9IG5ld0hvdXI7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSE9VUl9QUk9QRVJUWSwgb2xkSG91ciwgbmV3SG91cik7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0TWludXRlKCkgeworCQlyZXR1cm4gdGhpcy5taW51dGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWludXRlKEludGVnZXIgbmV3TWludXRlKSB7CisJCUludGVnZXIgb2xkTWludXRlID0gdGhpcy5taW51dGU7CisJCXRoaXMubWludXRlID0gbmV3TWludXRlOworCQl0aGlzLnJlc291cmNlVGltZU9mRGF5LnNldE1pbnV0ZShuZXdNaW51dGUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1JTlVURV9QUk9QRVJUWSwgb2xkTWludXRlLCBuZXdNaW51dGUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldE1pbnV0ZV8oSW50ZWdlciBuZXdNaW51dGUpIHsKKwkJSW50ZWdlciBvbGRNaW51dGUgPSB0aGlzLm1pbnV0ZTsKKwkJdGhpcy5taW51dGUgPSBuZXdNaW51dGU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUlOVVRFX1BST1BFUlRZLCBvbGRNaW51dGUsIG5ld01pbnV0ZSk7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0U2Vjb25kKCkgeworCQlyZXR1cm4gdGhpcy5zZWNvbmQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2Vjb25kKEludGVnZXIgbmV3U2Vjb25kKSB7CisJCUludGVnZXIgb2xkU2Vjb25kID0gdGhpcy5zZWNvbmQ7CisJCXRoaXMuc2Vjb25kID0gbmV3U2Vjb25kOworCQl0aGlzLnJlc291cmNlVGltZU9mRGF5LnNldFNlY29uZChuZXdTZWNvbmQpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFQ09ORF9QUk9QRVJUWSwgb2xkU2Vjb25kLCBuZXdTZWNvbmQpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTZWNvbmRfKEludGVnZXIgbmV3U2Vjb25kKSB7CisJCUludGVnZXIgb2xkU2Vjb25kID0gdGhpcy5zZWNvbmQ7CisJCXRoaXMuc2Vjb25kID0gbmV3U2Vjb25kOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNFQ09ORF9QUk9QRVJUWSwgb2xkU2Vjb25kLCBuZXdTZWNvbmQpOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldE1pbGxpc2Vjb25kKCkgeworCQlyZXR1cm4gdGhpcy5taWxsaXNlY29uZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNaWxsaXNlY29uZChJbnRlZ2VyIG5ld01pbGxpc2Vjb25kKSB7CisJCUludGVnZXIgb2xkTWlsbGlzZWNvbmQgPSB0aGlzLm1pbGxpc2Vjb25kOworCQl0aGlzLm1pbGxpc2Vjb25kID0gbmV3TWlsbGlzZWNvbmQ7CisJCXRoaXMucmVzb3VyY2VUaW1lT2ZEYXkuc2V0TWlsbGlzZWNvbmQobmV3TWlsbGlzZWNvbmQpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1JTExJU0VDT05EX1BST1BFUlRZLCBvbGRNaWxsaXNlY29uZCwgbmV3TWlsbGlzZWNvbmQpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRNaWxsaXNlY29uZF8oSW50ZWdlciBuZXdNaWxsaXNlY29uZCkgeworCQlJbnRlZ2VyIG9sZE1pbGxpc2Vjb25kID0gdGhpcy5taWxsaXNlY29uZDsKKwkJdGhpcy5taWxsaXNlY29uZCA9IG5ld01pbGxpc2Vjb25kOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1JTExJU0VDT05EX1BST1BFUlRZLCBvbGRNaWxsaXNlY29uZCwgbmV3TWlsbGlzZWNvbmQpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VUaW1lT2ZEYXkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFhtbFRpbWVPZkRheSByZXNvdXJjZSkgeworCQl0aGlzLnJlc291cmNlVGltZU9mRGF5ID0gcmVzb3VyY2U7CisJCXRoaXMuaG91ciA9IGdldFJlc291cmNlSG91cigpOworCQl0aGlzLm1pbnV0ZSA9IGdldFJlc291cmNlTWludXRlKCk7CisJCXRoaXMuc2Vjb25kID0gZ2V0UmVzb3VyY2VTZWNvbmQoKTsKKwkJdGhpcy5taWxsaXNlY29uZCA9IGdldFJlc291cmNlTWlsbGlzZWNvbmQoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKFhtbFRpbWVPZkRheSByZXNvdXJjZSkgeworCQl0aGlzLnJlc291cmNlVGltZU9mRGF5ID0gcmVzb3VyY2U7CisJCXRoaXMuc2V0SG91cl8oZ2V0UmVzb3VyY2VIb3VyKCkpOworCQl0aGlzLnNldE1pbnV0ZV8oZ2V0UmVzb3VyY2VNaW51dGUoKSk7CisJCXRoaXMuc2V0U2Vjb25kXyhnZXRSZXNvdXJjZVNlY29uZCgpKTsKKwkJdGhpcy5zZXRNaWxsaXNlY29uZF8oZ2V0UmVzb3VyY2VNaWxsaXNlY29uZCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIEludGVnZXIgZ2V0UmVzb3VyY2VIb3VyKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVRpbWVPZkRheS5nZXRIb3VyKCk7CisJfQorCQorCXByb3RlY3RlZCBJbnRlZ2VyIGdldFJlc291cmNlTWludXRlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVRpbWVPZkRheS5nZXRNaW51dGUoKTsKKwl9CisJCisJcHJvdGVjdGVkIEludGVnZXIgZ2V0UmVzb3VyY2VTZWNvbmQoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlVGltZU9mRGF5LmdldFNlY29uZCgpOworCX0KKwkKKwlwcm90ZWN0ZWQgSW50ZWdlciBnZXRSZXNvdXJjZU1pbGxpc2Vjb25kKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVRpbWVPZkRheS5nZXRNaWxsaXNlY29uZCgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rSWRNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlN2IwMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0lkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1JZE1hcHBpbmc8WG1sSWQ+CisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0lkTWFwcGluZworeworCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua011dGFibGUgbXV0YWJsZTsKKwkKKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbElkIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJCXRoaXMubXV0YWJsZSA9IG5ldyBPcm1FY2xpcHNlTGlua011dGFibGUodGhpcywgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtNdXRhYmxlIGdldE11dGFibGUoKSB7CisJCXJldHVybiB0aGlzLm11dGFibGU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9ybUNvbnZlcnRlciBidWlsZFNwZWNpZmllZENvbnZlcnRlcihTdHJpbmcgY29udmVydGVyVHlwZSkgeworCQlPcm1Db252ZXJ0ZXIgb3JtQ29udmVydGVyID0gc3VwZXIuYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXIoY29udmVydGVyVHlwZSk7CisJCWlmIChvcm1Db252ZXJ0ZXIgIT0gbnVsbCkgeworCQkJcmV0dXJuIG9ybUNvbnZlcnRlcjsKKwkJfQorCQlpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgeworCQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0NvbnZlcnQodGhpcywgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlQ29udmVydGVyVHlwZSgpIHsKKwkJLy9jaGVjayBAQ29udmVydCBmaXJzdCwgdGhpcyBpcyB0aGUgb3JkZXIgdGhhdCBFY2xpcHNlTGluayBzZWFyY2hlcworCQlpZiAodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydCgpICE9IG51bGwpIHsKKwkJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUjsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCk7CisJfQorCQorCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UtY29udGV4dCBpbnRlcmFjdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLm11dGFibGUudXBkYXRlKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJLy8gVE9ETyAtIG11dGFibGUgdmFsaWRhdGlvbgorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0pvaW5GZXRjaC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rSm9pbkZldGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3MzRkYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0pvaW5GZXRjaC5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaDsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoIGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtKb2luRmV0Y2gKK3sKKwlwcm90ZWN0ZWQgWG1sSm9pbkZldGNoIHJlc291cmNlOworCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgam9pbkZldGNoVmFsdWU7CisJCisJCisJcHVibGljIE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBYbWxKb2luRmV0Y2ggcmVzb3VyY2UpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCQl0aGlzLmpvaW5GZXRjaFZhbHVlID0gZ2V0UmVzb3VyY2VKb2luRmV0Y2goKTsKKwl9CisJCisJCisJcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkZldGNoVmFsdWU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBuZXdKb2luRmV0Y2hWYWx1ZSkgeworCQlFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgb2xkSm9pbkZldGNoVmFsdWUgPSB0aGlzLmpvaW5GZXRjaFZhbHVlOworCQl0aGlzLmpvaW5GZXRjaFZhbHVlID0gbmV3Sm9pbkZldGNoVmFsdWU7CisJCXRoaXMucmVzb3VyY2Uuc2V0Sm9pbkZldGNoKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3Sm9pbkZldGNoVmFsdWUpKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkSm9pbkZldGNoVmFsdWUsIG5ld0pvaW5GZXRjaFZhbHVlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBuZXdKb2luRmV0Y2hWYWx1ZSkgeworCQlFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgb2xkSm9pbkZldGNoVmFsdWUgPSB0aGlzLmpvaW5GZXRjaFZhbHVlOworCQl0aGlzLmpvaW5GZXRjaFZhbHVlID0gbmV3Sm9pbkZldGNoVmFsdWU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZEpvaW5GZXRjaFZhbHVlLCBuZXdKb2luRmV0Y2hWYWx1ZSk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogaW5pdGlhbGl6ZS91cGRhdGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7CisJCXNldFZhbHVlXyhnZXRSZXNvdXJjZUpvaW5GZXRjaCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBnZXRSZXNvdXJjZUpvaW5GZXRjaCgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh0aGlzLnJlc291cmNlLmdldEpvaW5GZXRjaCgpKTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTVjZDMxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1NYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1NYW55VG9NYW55TWFwcGluZzxYbWxNYW55VG9NYW55PgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nCit7CisJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoIGpvaW5GZXRjaDsKKwkKKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sTWFueVRvTWFueSByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCQl0aGlzLmpvaW5GZXRjaCA9IG5ldyBPcm1FY2xpcHNlTGlua0pvaW5GZXRjaCh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7CisJCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZS1jb250ZXh0IGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuam9pbkZldGNoLnVwZGF0ZSgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCS8vIFRPRE8gLSBwcml2YXRlIG93bmVkLCBqb2luIGZldGNoIHZhbGlkYXRpb24KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzhhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZyBleHRlbmRzIEFic3RyYWN0T3JtTWFueVRvT25lTWFwcGluZzxYbWxNYW55VG9PbmU+CisJaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcKK3sKKwlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOworCQorCQorCXB1YmxpYyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE1hbnlUb09uZSByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCQl0aGlzLmpvaW5GZXRjaCA9IG5ldyBPcm1FY2xpcHNlTGlua0pvaW5GZXRjaCh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7CisJCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZS1jb250ZXh0IGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuam9pbkZldGNoLnVwZGF0ZSgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCS8vIFRPRE8gLSBwcml2YXRlIG93bmVkLCBqb2luIGZldGNoIHZhbGlkYXRpb24KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3NTcwNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NJbXBsLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwKKwlleHRlbmRzIEFic3RyYWN0T3JtTWFwcGVkU3VwZXJjbGFzcworCWltcGxlbWVudHMKKwkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLAorCQlDYWNoZWFibGVIb2xkZXIyXzAKK3sKKwlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seTsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXI7CisJCisJcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY2hhbmdlVHJhY2tpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBjb252ZXJ0ZXJIb2xkZXI7CisJCisJCisJcHVibGljIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJCXRoaXMucmVhZE9ubHkgPSBuZXcgT3JtRWNsaXBzZUxpbmtSZWFkT25seSh0aGlzLCAoWG1sUmVhZE9ubHkpIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZywgZ2V0SmF2YVJlYWRPbmx5KCkpOworCQl0aGlzLmN1c3RvbWl6ZXIgPSBuZXcgT3JtRWNsaXBzZUxpbmtDdXN0b21pemVyKHRoaXMsIChYbWxDdXN0b21pemVySG9sZGVyKSB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcsIGdldEphdmFDdXN0b21pemVyKCkpOworCQl0aGlzLmNoYW5nZVRyYWNraW5nID0gbmV3IE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcodGhpcywgKFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKSB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcsIGdldEphdmFDaGFuZ2VUcmFja2luZygpKTsKKwkJdGhpcy5jYWNoaW5nID0gbmV3IE9ybUVjbGlwc2VMaW5rQ2FjaGluZ0ltcGwodGhpcywgKFhtbENhY2hlSG9sZGVyKSB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcsIChYbWxDYWNoZWFibGUyXzApIHRoaXMucmVzb3VyY2VUeXBlTWFwcGluZywgZ2V0SmF2YUNhY2hpbmcoKSk7CisJCXRoaXMuY29udmVydGVySG9sZGVyID0gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKHRoaXMsIChYbWxDb252ZXJ0ZXJzSG9sZGVyKSB0aGlzLnJlc291cmNlVHlwZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKSB7CisJCXJldHVybiB0aGlzLmNhY2hpbmc7CisJfQorCisJcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgeworCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyOworCX0KKworCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCkgeworCQlyZXR1cm4gdGhpcy5jaGFuZ2VUcmFja2luZzsKKwl9CisKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtSZWFkT25seSBnZXRSZWFkT25seSgpIHsKKwkJcmV0dXJuIHRoaXMucmVhZE9ubHk7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBnZXRDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiB0aGlzLmNvbnZlcnRlckhvbGRlcjsKKwl9CisJCQorCXB1YmxpYyBDYWNoZWFibGUyXzAgZ2V0Q2FjaGVhYmxlKCkgeworCQlyZXR1cm4gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldENhY2hpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSB7CisJCXJldHVybiAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0Q2FjaGluZygpKS5jYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCk7CisJfQorCQorCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UtY29udGV4dCBpbnRlcmFjdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnJlYWRPbmx5LnVwZGF0ZShnZXRKYXZhUmVhZE9ubHkoKSk7CisJCXRoaXMuY3VzdG9taXplci51cGRhdGUoZ2V0SmF2YUN1c3RvbWl6ZXIoKSk7CisJCXRoaXMuY2hhbmdlVHJhY2tpbmcudXBkYXRlKGdldEphdmFDaGFuZ2VUcmFja2luZygpKTsKKwkJdGhpcy5jYWNoaW5nLnVwZGF0ZShnZXRKYXZhQ2FjaGluZygpKTsKKwkJdGhpcy5jb252ZXJ0ZXJIb2xkZXIudXBkYXRlKCk7IAorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBnZXRKYXZhTWFwcGVkU3VwZXJjbGFzc0ZvckRlZmF1bHRzKCkgeworCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHN1cGVyLmdldEphdmFNYXBwZWRTdXBlcmNsYXNzRm9yRGVmYXVsdHMoKTsKKwl9CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0SmF2YVJlYWRPbmx5KCkgeworCQlKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGphdmFNYXBwZWRTdXBlcmNsYXNzID0gZ2V0SmF2YU1hcHBlZFN1cGVyY2xhc3NGb3JEZWZhdWx0cygpOworCQlyZXR1cm4gKGphdmFNYXBwZWRTdXBlcmNsYXNzID09IG51bGwpID8gbnVsbCA6IGphdmFNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7CisJfQorCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0SmF2YUN1c3RvbWl6ZXIoKSB7CisJCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YU1hcHBlZFN1cGVyY2xhc3MgPSBnZXRKYXZhTWFwcGVkU3VwZXJjbGFzc0ZvckRlZmF1bHRzKCk7CisJCXJldHVybiAoamF2YU1hcHBlZFN1cGVyY2xhc3MgPT0gbnVsbCkgPyBudWxsIDogamF2YU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpOworCX0KKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRKYXZhQ2hhbmdlVHJhY2tpbmcoKSB7CisJCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YU1hcHBlZFN1cGVyY2xhc3MgPSBnZXRKYXZhTWFwcGVkU3VwZXJjbGFzc0ZvckRlZmF1bHRzKCk7CisJCXJldHVybiAoamF2YU1hcHBlZFN1cGVyY2xhc3MgPT0gbnVsbCkgPyBudWxsIDogamF2YU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgZ2V0SmF2YUNhY2hpbmcoKSB7CisJCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YU1hcHBlZFN1cGVyY2xhc3MgPSBnZXRKYXZhTWFwcGVkU3VwZXJjbGFzc0ZvckRlZmF1bHRzKCk7CisJCXJldHVybiAoamF2YU1hcHBlZFN1cGVyY2xhc3MgPT0gbnVsbCkgPyBudWxsIDogamF2YU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCXRoaXMucmVhZE9ubHkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy5jdXN0b21pemVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCXRoaXMuY2hhbmdlVHJhY2tpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdGhpcy5jYWNoaW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTXV0YWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTXV0YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODk5NzkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNdXRhYmxlLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZTsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTXV0YWJsZSBleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUgCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua011dGFibGUKK3sKKwlwcm90ZWN0ZWQgZmluYWwgWG1sTXV0YWJsZSByZXNvdXJjZTsKKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0TXV0YWJsZTsKKwkKKwlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRNdXRhYmxlOworCQorCQorCXB1YmxpYyBPcm1FY2xpcHNlTGlua011dGFibGUoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIFhtbE11dGFibGUgcmVzb3VyY2UpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworCQl0aGlzLmRlZmF1bHRNdXRhYmxlID0gdGhpcy5jYWxjdWxhdGVEZWZhdWx0TXV0YWJsZSgpOworCQl0aGlzLnNwZWNpZmllZE11dGFibGUgPSB0aGlzLmdldFJlc291cmNlTXV0YWJsZSgpOworCX0KKwkJCisJQE92ZXJyaWRlCisJcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJfQorCQorCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7CisJCXJldHVybiAoT3JtQXR0cmlidXRlTWFwcGluZykgZ2V0UGFyZW50KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzTXV0YWJsZSgpIHsKKwkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE11dGFibGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE11dGFibGUuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmRlZmF1bHRNdXRhYmxlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRNdXRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0TXV0YWJsZTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE11dGFibGUoYm9vbGVhbiBuZXdEZWZhdWx0TXV0YWJsZSkgeworCQlib29sZWFuIG9sZERlZmF1bHRNdXRhYmxlID0gdGhpcy5kZWZhdWx0TXV0YWJsZTsKKwkJdGhpcy5kZWZhdWx0TXV0YWJsZSA9IG5ld0RlZmF1bHRNdXRhYmxlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTVVUQUJMRV9QUk9QRVJUWSwgb2xkRGVmYXVsdE11dGFibGUsIG5ld0RlZmF1bHRNdXRhYmxlKTsKKwl9CisJCisJcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkTXV0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTXV0YWJsZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuIG5ld1NwZWNpZmllZE11dGFibGUpIHsKKwkJQm9vbGVhbiBvbGRTcGVjaWZpZWRNdXRhYmxlID0gdGhpcy5zcGVjaWZpZWRNdXRhYmxlOworCQl0aGlzLnNwZWNpZmllZE11dGFibGUgPSBuZXdTcGVjaWZpZWRNdXRhYmxlOworCQl0aGlzLnJlc291cmNlLnNldE11dGFibGUobmV3U3BlY2lmaWVkTXV0YWJsZSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01VVEFCTEVfUFJPUEVSVFksIG9sZFNwZWNpZmllZE11dGFibGUsIG5ld1NwZWNpZmllZE11dGFibGUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRNdXRhYmxlXyhCb29sZWFuIG5ld1NwZWNpZmllZE11dGFibGUpIHsKKwkJQm9vbGVhbiBvbGRTcGVjaWZpZWRNdXRhYmxlID0gdGhpcy5zcGVjaWZpZWRNdXRhYmxlOworCQl0aGlzLnNwZWNpZmllZE11dGFibGUgPSBuZXdTcGVjaWZpZWRNdXRhYmxlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9NVVRBQkxFX1BST1BFUlRZLCBvbGRTcGVjaWZpZWRNdXRhYmxlLCBuZXdTcGVjaWZpZWRNdXRhYmxlKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBpbml0aWFsaXplL3VwZGF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7CisJCXNldERlZmF1bHRNdXRhYmxlKHRoaXMuY2FsY3VsYXRlRGVmYXVsdE11dGFibGUoKSk7CisJCXNldFNwZWNpZmllZE11dGFibGVfKHRoaXMuZ2V0UmVzb3VyY2VNdXRhYmxlKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgQm9vbGVhbiBnZXRSZXNvdXJjZU11dGFibGUoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlLmdldE11dGFibGUoKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdE11dGFibGUoKSB7CisJCUphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YUF0dHJpYnV0ZSA9IChKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKSB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwkJaWYgKGphdmFBdHRyaWJ1dGUgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChqYXZhQXR0cmlidXRlLnR5cGVJc0RhdGVPckNhbGVuZGFyKCkpIHsKKwkJCUJvb2xlYW4gcGVyc2lzdGVuY2VVbml0RGVmYXVsdE11dGFibGUgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuZ2V0VGVtcG9yYWxNdXRhYmxlKCk7CisJCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0RGVmYXVsdE11dGFibGUgPT0gbnVsbCA/IGZhbHNlIDogcGVyc2lzdGVuY2VVbml0RGVmYXVsdE11dGFibGUuYm9vbGVhblZhbHVlKCk7CisJCX0KKwkJcmV0dXJuIGphdmFBdHRyaWJ1dGUudHlwZUlzU2VyaWFsaXphYmxlKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2UuZ2V0TXV0YWJsZVRleHRSYW5nZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGVjZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBleHRlbmRzIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+CisJaW1wbGVtZW50cyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIKK3sJCisJcHJpdmF0ZSBTdHJpbmcgZGF0YVR5cGU7CisJCisJcHJpdmF0ZSBTdHJpbmcgb2JqZWN0VHlwZTsKKwkKKwlwcml2YXRlIGZpbmFsIExpc3Q8T3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXM7CisJCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlOworCQorCQorCXB1YmxpYyBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMuY29udmVyc2lvblZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8T3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+KCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUjsKKwl9CQorCQorCS8vICoqKioqKioqKioqKioqKiogZGF0YSB0eXBlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5kYXRhVHlwZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIG5ld0RhdGFUeXBlKSB7CisJCVN0cmluZyBvbGREYXRhVHlwZSA9IHRoaXMuZGF0YVR5cGU7CisJCXRoaXMuZGF0YVR5cGUgPSBuZXdEYXRhVHlwZTsKKwkJZ2V0WG1sUmVzb3VyY2UoKS5zZXREYXRhVHlwZShuZXdEYXRhVHlwZSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREFUQV9UWVBFX1BST1BFUlRZLCBvbGREYXRhVHlwZSwgbmV3RGF0YVR5cGUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREYXRhVHlwZV8oU3RyaW5nIG5ld0RhdGFUeXBlKSB7CisJCVN0cmluZyBvbGREYXRhVHlwZSA9IHRoaXMuZGF0YVR5cGU7CisJCXRoaXMuZGF0YVR5cGUgPSBuZXdEYXRhVHlwZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1RZUEVfUFJPUEVSVFksIG9sZERhdGFUeXBlLCBuZXdEYXRhVHlwZSk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogb2JqZWN0IHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFR5cGUoKSB7CisJCXJldHVybiB0aGlzLm9iamVjdFR5cGU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIG5ld09iamVjdFR5cGUpIHsKKwkJU3RyaW5nIG9sZE9iamVjdFR5cGUgPSB0aGlzLm9iamVjdFR5cGU7CisJCXRoaXMub2JqZWN0VHlwZSA9IG5ld09iamVjdFR5cGU7CisJCWdldFhtbFJlc291cmNlKCkuc2V0T2JqZWN0VHlwZShuZXdPYmplY3RUeXBlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVFlQRV9QUk9QRVJUWSwgb2xkT2JqZWN0VHlwZSwgbmV3T2JqZWN0VHlwZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdFR5cGVfKFN0cmluZyBuZXdPYmplY3RUeXBlKSB7CisJCVN0cmluZyBvbGRPYmplY3RUeXBlID0gdGhpcy5vYmplY3RUeXBlOworCQl0aGlzLm9iamVjdFR5cGUgPSBuZXdPYmplY3RUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGRPYmplY3RUeXBlLCBuZXdPYmplY3RUeXBlKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBjb252ZXJzaW9uIHZhbHVlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8T3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8T3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+KHRoaXMuY29udmVyc2lvblZhbHVlcyk7CisJfQorCQorCXB1YmxpYyBpbnQgY29udmVyc2lvblZhbHVlc1NpemUoKSB7CisJCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZXMuc2l6ZSgpOworCX0KKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgYWRkQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgeworCQlYbWxDb252ZXJzaW9uVmFsdWUgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnNpb25WYWx1ZSgpOworCQlPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb250ZXh0Q29udmVyc2lvblZhbHVlID0gYnVpbGRDb252ZXJzaW9uVmFsdWUocmVzb3VyY2VDb252ZXJzaW9uVmFsdWUpOworCQl0aGlzLmNvbnZlcnNpb25WYWx1ZXMuYWRkKGluZGV4LCBjb250ZXh0Q29udmVyc2lvblZhbHVlKTsKKwkJZ2V0WG1sUmVzb3VyY2UoKS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuYWRkKGluZGV4LCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSk7CisJCWZpcmVJdGVtQWRkZWQoQ09OVkVSU0lPTl9WQUxVRVNfTElTVCwgaW5kZXgsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUpOworCQlyZXR1cm4gY29udGV4dENvbnZlcnNpb25WYWx1ZTsKKwl9CisJCisJcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGFkZENvbnZlcnNpb25WYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMuYWRkQ29udmVyc2lvblZhbHVlKHRoaXMuY29udmVyc2lvblZhbHVlcy5zaXplKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4LCBPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKKwkJYWRkSXRlbVRvTGlzdChpbmRleCwgY29udmVyc2lvblZhbHVlLCB0aGlzLmNvbnZlcnNpb25WYWx1ZXMsIENPTlZFUlNJT05fVkFMVUVTX0xJU1QpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRDb252ZXJzaW9uVmFsdWUoT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlKSB7CisJCXRoaXMuYWRkQ29udmVyc2lvblZhbHVlKHRoaXMuY29udmVyc2lvblZhbHVlcy5zaXplKCksIGNvbnZlcnNpb25WYWx1ZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpIHsKKwkJT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgcmVtb3ZlZEpvaW5Db2x1bW4gPSB0aGlzLmNvbnZlcnNpb25WYWx1ZXMucmVtb3ZlKGluZGV4KTsKKwkJZ2V0WG1sUmVzb3VyY2UoKS5nZXRDb252ZXJzaW9uVmFsdWVzKCkucmVtb3ZlKGluZGV4KTsKKwkJZmlyZUl0ZW1SZW1vdmVkKENPTlZFUlNJT05fVkFMVUVTX0xJU1QsIGluZGV4LCByZW1vdmVkSm9pbkNvbHVtbik7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKKwkJdGhpcy5yZW1vdmVDb252ZXJzaW9uVmFsdWUodGhpcy5jb252ZXJzaW9uVmFsdWVzLmluZGV4T2YoY29udmVyc2lvblZhbHVlKSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZV8oRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlKSB7CisJCXJlbW92ZUl0ZW1Gcm9tTGlzdChjb252ZXJzaW9uVmFsdWUsIHRoaXMuY29udmVyc2lvblZhbHVlcywgQ09OVkVSU0lPTl9WQUxVRVNfTElTVCk7CisJfQorCQorCXB1YmxpYyB2b2lkIG1vdmVDb252ZXJzaW9uVmFsdWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5jb252ZXJzaW9uVmFsdWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQlnZXRYbWxSZXNvdXJjZSgpLmdldENvbnZlcnNpb25WYWx1ZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCWZpcmVJdGVtTW92ZWQoQ09OVkVSU0lPTl9WQUxVRVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsJCQorCX0KKwkKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gZGF0YVZhbHVlcygpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgU3RyaW5nPihjb252ZXJzaW9uVmFsdWVzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgbmV4dCkgeworCQkJCXJldHVybiBuZXh0LmdldERhdGFWYWx1ZSgpOworCQkJfQorCQl9OworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGRlZmF1bHQgb2JqZWN0IHZhbHVlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0T2JqZWN0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlKFN0cmluZyBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpIHsKKwkJU3RyaW5nIG9sZERlZmF1bHRPYmplY3RWYWx1ZSA9IHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOworCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IG5ld0RlZmF1bHRPYmplY3RWYWx1ZTsKKwkJZ2V0WG1sUmVzb3VyY2UoKS5zZXREZWZhdWx0T2JqZWN0VmFsdWUobmV3RGVmYXVsdE9iamVjdFZhbHVlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkRGVmYXVsdE9iamVjdFZhbHVlLCBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0T2JqZWN0VmFsdWVfKFN0cmluZyBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpIHsKKwkJU3RyaW5nIG9sZERlZmF1bHRPYmplY3RWYWx1ZSA9IHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOworCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IG5ld0RlZmF1bHRPYmplY3RWYWx1ZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkRGVmYXVsdE9iamVjdFZhbHVlLCBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxPYmplY3RUeXBlQ29udmVydGVyIHhtbFJlc291cmNlKSB7CisJCXN1cGVyLmluaXRpYWxpemUoeG1sUmVzb3VyY2UpOworCQl0aGlzLmRhdGFUeXBlID0gdGhpcy5nZXRSZXNvdXJjZURhdGFUeXBlKCk7CisJCXRoaXMub2JqZWN0VHlwZSA9IHRoaXMuZ2V0UmVzb3VyY2VPYmplY3RUeXBlKCk7CisJCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlID0gdGhpcy5nZXRSZXNvdXJjZURlZmF1bHRPYmplY3RWYWx1ZSgpOworCQl0aGlzLmluaXRpYWxpemVDb252ZXJzaW9uVmFsdWVzKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJzaW9uVmFsdWVzKCkgewkKKwkJZm9yIChYbWxDb252ZXJzaW9uVmFsdWUgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgOiBnZXRYbWxSZXNvdXJjZSgpLmdldENvbnZlcnNpb25WYWx1ZXMoKSkgeworCQkJdGhpcy5jb252ZXJzaW9uVmFsdWVzLmFkZChidWlsZENvbnZlcnNpb25WYWx1ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSkpOworCQl9CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXNldERhdGFUeXBlXyhnZXRSZXNvdXJjZURhdGFUeXBlKCkpOworCQlzZXRPYmplY3RUeXBlXyhnZXRSZXNvdXJjZU9iamVjdFR5cGUoKSk7CisJCXNldERlZmF1bHRPYmplY3RWYWx1ZV8oZ2V0UmVzb3VyY2VEZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJCXVwZGF0ZUNvbnZlcnNpb25WYWx1ZXMoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udmVyc2lvblZhbHVlcyggKSB7CisJCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBYTUwgY29udmVyc2lvbiB2YWx1ZXMgKHRvIHByZXZlbnQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbikKKwkJSXRlcmF0b3I8WG1sQ29udmVyc2lvblZhbHVlPiB4bWxDb252ZXJzaW9uVmFsdWVzID0gbmV3IENsb25lSXRlcmF0b3I8WG1sQ29udmVyc2lvblZhbHVlPih0aGlzLmdldFhtbFJlc291cmNlKCkuZ2V0Q29udmVyc2lvblZhbHVlcygpKTsKKwkJCisJCWZvciAoSXRlcmF0b3I8T3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gdGhpcy5jb252ZXJzaW9uVmFsdWVzKCk7IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKTsgKSB7CisJCQlPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOworCQkJaWYgKHhtbENvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKSB7CisJCQkJY29udGV4dENvbnZlcnNpb25WYWx1ZS51cGRhdGUoeG1sQ29udmVyc2lvblZhbHVlcy5uZXh0KCkpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVtb3ZlQ29udmVyc2lvblZhbHVlXyhjb250ZXh0Q29udmVyc2lvblZhbHVlKTsKKwkJCX0KKwkJfQorCQkKKwkJd2hpbGUgKHhtbENvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKSB7CisJCQlhZGRDb252ZXJzaW9uVmFsdWUoYnVpbGRDb252ZXJzaW9uVmFsdWUoeG1sQ29udmVyc2lvblZhbHVlcy5uZXh0KCkpKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgYnVpbGRDb252ZXJzaW9uVmFsdWUoWG1sQ29udmVyc2lvblZhbHVlIHJlc291cmNlQ29udmVyc2lvblZhbHVlKSB7CisJCU9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSA9IG5ldyBPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSh0aGlzKTsKKwkJY29udmVyc2lvblZhbHVlLmluaXRpYWxpemUocmVzb3VyY2VDb252ZXJzaW9uVmFsdWUpOworCQlyZXR1cm4gY29udmVyc2lvblZhbHVlOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlRGF0YVR5cGUoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVydGVyLmdldERhdGFUeXBlKCk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZU9iamVjdFR5cGUoKSB7CisJCXJldHVybiB0aGlzLnJlc291cmNlQ29udmVydGVyLmdldE9iamVjdFR5cGUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlRGVmYXVsdE9iamVjdFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJZm9yIChJdGVyYXRvcjxPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gc3RyZWFtID0gY29udmVyc2lvblZhbHVlcygpOyBzdHJlYW0uaGFzTmV4dCgpOykgeworCQkJc3RyZWFtLm5leHQoKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2M3YTA5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1PbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdE9ybU9uZVRvTWFueU1hcHBpbmc8WG1sT25lVG9NYW55PgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nCit7CisJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25lZDsKKwkKKwlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOworCQorCQorCXB1YmxpYyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCQl0aGlzLnByaXZhdGVPd25lZCA9IG5ldyBPcm1FY2xpcHNlTGlua1ByaXZhdGVPd25lZCh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJCXRoaXMuam9pbkZldGNoID0gbmV3IE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoKHRoaXMsIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBidWlsZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSB7CisJCXJldHVybiAoT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UpIHN1cGVyLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgZ2V0UHJpdmF0ZU93bmVkKCkgeworCQlyZXR1cm4gdGhpcy5wcml2YXRlT3duZWQ7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7CisJCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZSAtPiBjb250ZXh0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMucHJpdmF0ZU93bmVkLnVwZGF0ZSgpOworCQl0aGlzLmpvaW5GZXRjaC51cGRhdGUoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJLy8gVE9ETyAtIHByaXZhdGUgb3duZWQsIGpvaW4gZmV0Y2ggdmFsaWRhdGlvbgorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjMmY4NQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZQorCWV4dGVuZHMgQWJzdHJhY3RPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UKKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlLAorCQlPcm1Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZQoreworCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJCisJCisJcHVibGljIE9ybUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlKAorCQkJT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHBhcmVudCwgWG1sT25lVG9NYW55IHJlc291cmNlKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2UpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWdpZXMoKSB7CisJCXRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSA9IGJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwkJCisJCXN1cGVyLmluaXRpYWxpemVKb2luaW5nU3RyYXRlZ2llcygpOworCX0KKwkKKwlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kodGhpcywgZ2V0UmVzb3VyY2VNYXBwaW5nKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtUmVsYXRpb25zaGlwUmVmZXJlbmNlIG5ld1JlbGF0aW9uc2hpcFJlZmVyZW5jZSkgeworCQlzdXBlci5pbml0aWFsaXplT24obmV3UmVsYXRpb25zaGlwUmVmZXJlbmNlKTsKKwkJbmV3UmVsYXRpb25zaGlwUmVmZXJlbmNlLmluaXRpYWxpemVGcm9tSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UodGhpcyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoCisJCQlPcm1Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSBvbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZShvbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2UpOworCQlpbnQgaW5kZXggPSAwOworCQlmb3IgKEpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IAorCQkJCUNvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSgKKwkJCQkJb2xkUmVsYXRpb25zaGlwUmVmZXJlbmNlLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5zcGVjaWZpZWRKb2luQ29sdW1ucygpKSkgeworCQkJT3JtSm9pbkNvbHVtbiBuZXdKb2luQ29sdW1uID0gZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW5kZXgrKyk7CisJCQluZXdKb2luQ29sdW1uLmluaXRpYWxpemVGcm9tKGpvaW5Db2x1bW4pOworCQl9CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxPbmVUb01hbnkgZ2V0UmVzb3VyY2VNYXBwaW5nKCkgeworCQlyZXR1cm4gKFhtbE9uZVRvTWFueSkgc3VwZXIuZ2V0UmVzb3VyY2VNYXBwaW5nKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKb2luaW5nU3RyYXRlZ3kgY2FsY3VsYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB7CisJCWlmICh0aGlzLm1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIHRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5Lmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkpIHsKKwkJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CisJCX0KKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBtYXBwZWQgYnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkgeworCQlzdXBlci5zZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpOworCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gbWF5QmVNYXBwZWRCeShBdHRyaWJ1dGVNYXBwaW5nIG1hcHBlZEJ5TWFwcGluZykgeworCQlyZXR1cm4gc3VwZXIubWF5QmVNYXBwZWRCeShtYXBwZWRCeU1hcHBpbmcpIHx8CisJCQltYXBwZWRCeU1hcHBpbmcuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogam9pbiB0YWJsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKSB7CisJCXN1cGVyLnNldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOworCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luVGFibGUoKSB7CisJCXJldHVybiBzdXBlci5tYXlIYXZlRGVmYXVsdEpvaW5UYWJsZSgpCisJCQkmJiAhIHRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGpvaW4gY29sdW1ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIE9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpIHsKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gdXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKSB7CisJCXJldHVybiBnZXRQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpID09IHRoaXMuam9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpIHsKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7CisJCXRoaXMubWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwkJdGhpcy5qb2luVGFibGVKb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIHZvaWQgdW5zZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkgeworCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luQ29sdW1uKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgPT4gY29udGV4dCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKb2luaW5nU3RyYXRlZ2llcygpIHsKKwkJdGhpcy5qb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LnVwZGF0ZSgpOworCQlzdXBlci51cGRhdGVKb2luaW5nU3RyYXRlZ2llcygpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIFZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQl0aGlzLmpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NTU2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1PbmVUb09uZU1hcHBpbmc8WG1sT25lVG9PbmU+CisJaW1wbGVtZW50cyBFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZworeworCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duZWQ7CisJCisJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoIGpvaW5GZXRjaDsKKwkKKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE9uZVRvT25lIHJlc291cmNlTWFwcGluZykgeworCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7CisJCXRoaXMucHJpdmF0ZU93bmVkID0gbmV3IE9ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkKHRoaXMsIHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwkJdGhpcy5qb2luRmV0Y2ggPSBuZXcgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2godGhpcywgdGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgZ2V0UHJpdmF0ZU93bmVkKCkgeworCQlyZXR1cm4gdGhpcy5wcml2YXRlT3duZWQ7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7CisJCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZS1jb250ZXh0IGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMucHJpdmF0ZU93bmVkLnVwZGF0ZSgpOworCQl0aGlzLmpvaW5GZXRjaC51cGRhdGUoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgeworCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOworCQkvLyBUT0RPIC0gcHJpdmF0ZSBvd25lZCwgam9pbiBmZXRjaCB2YWxpZGF0aW9uCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjc3NmQzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOworCisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUgZXh0ZW5kcyBBYnN0cmFjdE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUKK3sKKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgT3duZXIgb3duZXIsIFhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXN1cGVyKHBhcmVudCwgb3duZXIsIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCS8vKioqKioqKioqKioqKioqKioqIEFjY2Vzc0hvbGRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqCisJCisJLyoqCisJICogRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGRvZXMgbm90IHN1cHBvcnQgc3BlY2lmaWVkIGFjY2VzcyAobm8gYWNjZXNzIGVsZW1lbnQgaW4gMS4wKSwgc28gd2UgcmV0dXJuIG51bGwKKwkgKi8KKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRTcGVjaWZpZWRBY2Nlc3MoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdTcGVjaWZpZWRBY2Nlc3MpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJzcGVjaWZpZWRBY2Nlc3MgaXMgbm90IHN1cHBvcnRlZCBmb3IgT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ByaXZhdGVPd25lZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyZjdiZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ByaXZhdGVPd25lZC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZDsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQKK3sKKwlwcm90ZWN0ZWQgZmluYWwgWG1sUHJpdmF0ZU93bmVkIHJlc291cmNlOworCQorCXByb3RlY3RlZCBib29sZWFuIHByaXZhdGVPd25lZDsKKwkKKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtQcml2YXRlT3duZWQoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIFhtbFByaXZhdGVPd25lZCByZXNvdXJjZSkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisJCXRoaXMucHJpdmF0ZU93bmVkID0gdGhpcy5nZXRSZXNvdXJjZVByaXZhdGVPd25lZCgpOworCX0KKwkKKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVPd25lZCgpIHsKKwkJcmV0dXJuIHRoaXMucHJpdmF0ZU93bmVkOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRQcml2YXRlT3duZWQoYm9vbGVhbiBuZXdQcml2YXRlT3duZWQpIHsKKwkJYm9vbGVhbiBvbGRQcml2YXRlT3duZWQgPSB0aGlzLnByaXZhdGVPd25lZDsKKwkJdGhpcy5wcml2YXRlT3duZWQgPSBuZXdQcml2YXRlT3duZWQ7CisJCXRoaXMucmVzb3VyY2Uuc2V0UHJpdmF0ZU93bmVkKG5ld1ByaXZhdGVPd25lZCk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJJVkFURV9PV05FRF9QUk9QRVJUWSwgb2xkUHJpdmF0ZU93bmVkLCBuZXdQcml2YXRlT3duZWQpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcml2YXRlT3duZWRfKGJvb2xlYW4gbmV3UHJpdmF0ZU93bmVkKSB7CisJCWJvb2xlYW4gb2xkUHJpdmF0ZU93bmVkID0gdGhpcy5wcml2YXRlT3duZWQ7CisJCXRoaXMucHJpdmF0ZU93bmVkID0gbmV3UHJpdmF0ZU93bmVkOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBSSVZBVEVfT1dORURfUFJPUEVSVFksIG9sZFByaXZhdGVPd25lZCwgbmV3UHJpdmF0ZU93bmVkKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBpbml0aWFsaXplL3VwZGF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKKwkJc2V0UHJpdmF0ZU93bmVkXyh0aGlzLmdldFJlc291cmNlUHJpdmF0ZU93bmVkKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRSZXNvdXJjZVByaXZhdGVPd25lZCgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2UuaXNQcml2YXRlT3duZWQoKTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtSZWFkT25seS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rUmVhZE9ubHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDY5Y2IzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rUmVhZE9ubHkuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seTsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rUmVhZE9ubHkgZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlYWRPbmx5Cit7CisJcHJvdGVjdGVkIGZpbmFsIFhtbFJlYWRPbmx5IHJlc291cmNlOworCQorCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRSZWFkT25seTsKKwkKKwlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRSZWFkT25seTsKKwkKKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtSZWFkT25seShPcm1UeXBlTWFwcGluZyBwYXJlbnQsIFhtbFJlYWRPbmx5IHJlc291cmNlLCBFY2xpcHNlTGlua1JlYWRPbmx5IGphdmFSZWFkT25seSkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisJCXRoaXMuZGVmYXVsdFJlYWRPbmx5ID0gdGhpcy5nZXRKYXZhUmVhZE9ubHkoamF2YVJlYWRPbmx5KTsKKwkJdGhpcy5zcGVjaWZpZWRSZWFkT25seSA9IHRoaXMuZ2V0UmVzb3VyY2VSZWFkT25seSgpOworCX0KKwkKKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUmVhZE9ubHkgPT0gbnVsbCkgPyB0aGlzLmRlZmF1bHRSZWFkT25seSA6IHRoaXMuc3BlY2lmaWVkUmVhZE9ubHkuYm9vbGVhblZhbHVlKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJlYWRPbmx5KCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0UmVhZE9ubHk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldERlZmF1bHRSZWFkT25seShib29sZWFuIG5ld1ZhbHVlKSB7CisJCWJvb2xlYW4gb2xkVmFsdWUgPSB0aGlzLmRlZmF1bHRSZWFkT25seTsKKwkJdGhpcy5kZWZhdWx0UmVhZE9ubHkgPSBuZXdWYWx1ZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1JFQURfT05MWV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKwl9CisJCisJcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSB7CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFJlYWRPbmx5OworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuIG5ld1NwZWNpZmllZFJlYWRPbmx5KSB7CisJCUJvb2xlYW4gb2xkU3BlY2lmaWVkUmVhZE9ubHkgPSB0aGlzLnNwZWNpZmllZFJlYWRPbmx5OworCQl0aGlzLnNwZWNpZmllZFJlYWRPbmx5ID0gbmV3U3BlY2lmaWVkUmVhZE9ubHk7CisJCXRoaXMucmVzb3VyY2Uuc2V0UmVhZE9ubHkobmV3U3BlY2lmaWVkUmVhZE9ubHkpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUFEX09OTFlfUFJPUEVSVFksIG9sZFNwZWNpZmllZFJlYWRPbmx5LCBuZXdTcGVjaWZpZWRSZWFkT25seSk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogaW5pdGlhbGl6ZS91cGRhdGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoRWNsaXBzZUxpbmtSZWFkT25seSBqYXZhUmVhZE9ubHkpIHsKKwkJc2V0RGVmYXVsdFJlYWRPbmx5KHRoaXMuZ2V0SmF2YVJlYWRPbmx5KGphdmFSZWFkT25seSkpOworCQlzZXRTcGVjaWZpZWRSZWFkT25seSh0aGlzLmdldFJlc291cmNlUmVhZE9ubHkoKSk7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGdldEphdmFSZWFkT25seShFY2xpcHNlTGlua1JlYWRPbmx5IGphdmFSZWFkT25seSkgeworCQlyZXR1cm4gKGphdmFSZWFkT25seSA9PSBudWxsKSA/IGZhbHNlIDogamF2YVJlYWRPbmx5LmlzUmVhZE9ubHkoKTsKKwl9CisJCisJcHJvdGVjdGVkIEJvb2xlYW4gZ2V0UmVzb3VyY2VSZWFkT25seSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2UuZ2V0UmVhZE9ubHkoKTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXRSZWFkT25seVRleHRSYW5nZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmNGIxZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOworCitwdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgZXh0ZW5kcyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjxYbWxTdHJ1Y3RDb252ZXJ0ZXI+CisJaW1wbGVtZW50cyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcgorewkKKwlwcml2YXRlIFN0cmluZyBjb252ZXJ0ZXJDbGFzczsKKwkKKwkKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQkKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGNvbnZlcnRlciBjbGFzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJDbGFzcygpIHsKKwkJcmV0dXJuIHRoaXMuY29udmVydGVyQ2xhc3M7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlckNsYXNzKFN0cmluZyBuZXdDb252ZXJ0ZXJDbGFzcykgeworCQlTdHJpbmcgb2xkQ29udmVydGVyQ2xhc3MgPSB0aGlzLmNvbnZlcnRlckNsYXNzOworCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gbmV3Q29udmVydGVyQ2xhc3M7CisJCWdldFhtbFJlc291cmNlKCkuc2V0Q29udmVydGVyKG5ld0NvbnZlcnRlckNsYXNzKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfQ0xBU1NfUFJPUEVSVFksIG9sZENvbnZlcnRlckNsYXNzLCBuZXdDb252ZXJ0ZXJDbGFzcyk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlckNsYXNzXyhTdHJpbmcgbmV3Q29udmVydGVyQ2xhc3MpIHsKKwkJU3RyaW5nIG9sZENvbnZlcnRlckNsYXNzID0gdGhpcy5jb252ZXJ0ZXJDbGFzczsKKwkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IG5ld0NvbnZlcnRlckNsYXNzOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkQ29udmVydGVyQ2xhc3MsIG5ld0NvbnZlcnRlckNsYXNzKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZSBpbnRlcmFjdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWG1sU3RydWN0Q29udmVydGVyIHhtbFJlc291cmNlKSB7CisJCXN1cGVyLmluaXRpYWxpemUoeG1sUmVzb3VyY2UpOworCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gZ2V0UmVzb3VyY2VDb252ZXJ0ZXJDbGFzcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQlzZXRDb252ZXJ0ZXJDbGFzc18oZ2V0UmVzb3VyY2VDb252ZXJ0ZXJDbGFzcygpKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUNvbnZlcnRlckNsYXNzKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUNvbnZlcnRlci5nZXRDb252ZXJ0ZXIoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKwkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKKwkJdmFsaWRhdGVDb252ZXJ0ZXJDbGFzcyhtZXNzYWdlcyk7CisJfQorCQorLy9UT0RPIHZhbGlkYXRlIGNvbnZlcnRlciBjbGFzcwkKKwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnZlcnRlckNsYXNzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7CisvLwkJaWYgKCFnZXRSZXNvdXJjZUNvbnZlcnRlcigpLmltcGxlbWVudHNDb252ZXJ0ZXIoKSkgeworLy8JCQltZXNzYWdlcy5hZGQoCisvLwkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAorLy8JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCisvLwkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09OVkVSVEVSX0NMQVNTX0lNUExFTUVOVFNfQ09OVkVSVEVSLAorLy8JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5jb252ZXJ0ZXJDbGFzc30sCisvLwkJCQkJdGhpcywgCisvLwkJCQkJZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKQorLy8JCQkJKQorLy8JCQkpOworLy8JCX0KKwl9CisJCisvLwlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKCkgeworLy8JCXJldHVybiBnZXRSZXNvdXJjZUNvbnZlcnRlcigpLmdldENsYXNzTmFtZVRleHRSYW5nZSgpOworLy8JfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwY2RlNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNmb3JtYXRpb247CisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZworCWV4dGVuZHMgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFhtbFRyYW5zZm9ybWF0aW9uPiAKKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nCit7CisJcHVibGljIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxUcmFuc2Zvcm1hdGlvbiByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7CisJCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKHRoaXMpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVFJBTlNGT1JNQVRJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRUb1Jlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7CisJCSgoQXR0cmlidXRlcykgcmVzb3VyY2VBdHRyaWJ1dGVzKS5nZXRUcmFuc2Zvcm1hdGlvbnMoKS5hZGQodGhpcy5yZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKKwkJKChBdHRyaWJ1dGVzKSByZXNvdXJjZUF0dHJpYnV0ZXMpLmdldFRyYW5zZm9ybWF0aW9ucygpLnJlbW92ZSh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCisJCisJcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIDg1OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmVjODNiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbjsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbgorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJCW5ldyBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlRSQU5TRk9STUFUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAorCQkJCWZhY3RvcnksIAorCQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVHJhbnNmb3JtYXRpb24oKSwgCisJCQkJWG1sVHJhbnNmb3JtYXRpb24uY2xhc3MpOworCX0KKwkKKwlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKAorCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIAorCQkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAorCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuICgoRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkpIGZhY3RvcnkpLgorCQkJCWJ1aWxkT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcocGFyZW50LCAoWG1sVHJhbnNmb3JtYXRpb24pIHJlc291cmNlTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFJlc291cmNlTWFwcGluZygKKwkJCU9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCAKKwkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nLCAKKwkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiAoKEVjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5KSBmYWN0b3J5KS4KKwkJCQlidWlsZFZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uKG9ybVR5cGVNYXBwaW5nLCAoSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nKSBqYXZhQXR0cmlidXRlTWFwcGluZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOTRjNGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBleHRlbmRzIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPFhtbFR5cGVDb252ZXJ0ZXI+IAorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyCit7CQorCXByaXZhdGUgU3RyaW5nIGRhdGFUeXBlOworCQorCXByaXZhdGUgU3RyaW5nIG9iamVjdFR5cGU7CisJCisJCisJcHVibGljIE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCQorCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSOworCX0KKwkJCisJLy8gKioqKioqKioqKioqKioqKiBkYXRhIHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKSB7CisJCXJldHVybiB0aGlzLmRhdGFUeXBlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShTdHJpbmcgbmV3RGF0YVR5cGUpIHsKKwkJU3RyaW5nIG9sZERhdGFUeXBlID0gdGhpcy5kYXRhVHlwZTsKKwkJdGhpcy5kYXRhVHlwZSA9IG5ld0RhdGFUeXBlOworCQlnZXRYbWxSZXNvdXJjZSgpLnNldERhdGFUeXBlKG5ld0RhdGFUeXBlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1RZUEVfUFJPUEVSVFksIG9sZERhdGFUeXBlLCBuZXdEYXRhVHlwZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldERhdGFUeXBlXyhTdHJpbmcgbmV3RGF0YVR5cGUpIHsKKwkJU3RyaW5nIG9sZERhdGFUeXBlID0gdGhpcy5kYXRhVHlwZTsKKwkJdGhpcy5kYXRhVHlwZSA9IG5ld0RhdGFUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVFlQRV9QUk9QRVJUWSwgb2xkRGF0YVR5cGUsIG5ld0RhdGFUeXBlKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBvYmplY3QgdHlwZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgbmV3T2JqZWN0VHlwZSkgeworCQlTdHJpbmcgb2xkT2JqZWN0VHlwZSA9IHRoaXMub2JqZWN0VHlwZTsKKwkJdGhpcy5vYmplY3RUeXBlID0gbmV3T2JqZWN0VHlwZTsKKwkJZ2V0WG1sUmVzb3VyY2UoKS5zZXRPYmplY3RUeXBlKG5ld09iamVjdFR5cGUpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGRPYmplY3RUeXBlLCBuZXdPYmplY3RUeXBlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc2V0T2JqZWN0VHlwZV8oU3RyaW5nIG5ld09iamVjdFR5cGUpIHsKKwkJU3RyaW5nIG9sZE9iamVjdFR5cGUgPSB0aGlzLm9iamVjdFR5cGU7CisJCXRoaXMub2JqZWN0VHlwZSA9IG5ld09iamVjdFR5cGU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfUFJPUEVSVFksIG9sZE9iamVjdFR5cGUsIG5ld09iamVjdFR5cGUpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHJlc291cmNlIGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYbWxUeXBlQ29udmVydGVyIHhtbFJlc291cmNlKSB7CisJCXN1cGVyLmluaXRpYWxpemUoeG1sUmVzb3VyY2UpOworCQl0aGlzLmRhdGFUeXBlID0gZ2V0UmVzb3VyY2VEYXRhVHlwZSgpOworCQl0aGlzLm9iamVjdFR5cGUgPSBnZXRSZXNvdXJjZU9iamVjdFR5cGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJc2V0RGF0YVR5cGVfKGdldFJlc291cmNlRGF0YVR5cGUoKSk7CisJCXNldE9iamVjdFR5cGVfKGdldFJlc291cmNlT2JqZWN0VHlwZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZURhdGFUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlT2JqZWN0VHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VDb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTUwYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZTsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcKKwlleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxYbWxWYXJpYWJsZU9uZVRvT25lPiAKKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcKK3sKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sVmFyaWFibGVPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7CisJCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKHRoaXMpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVkFSSUFCTEVfT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFRvUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKKwkJKChBdHRyaWJ1dGVzKSByZXNvdXJjZUF0dHJpYnV0ZXMpLmdldFZhcmlhYmxlT25lVG9PbmVzKCkuYWRkKHRoaXMucmVzb3VyY2VBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlRnJvbVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7CisJCSgoQXR0cmlidXRlcykgcmVzb3VyY2VBdHRyaWJ1dGVzKS5nZXRWYXJpYWJsZU9uZVRvT25lcygpLnJlbW92ZSh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCisJcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIDY1OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiMGE5YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmU7CisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbgorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBFbWZUb29scy5jcmVhdGUoCisJCQkJZmFjdG9yeSwgCisJCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxWYXJpYWJsZU9uZVRvT25lKCksIAorCQkJCVhtbFZhcmlhYmxlT25lVG9PbmUuY2xhc3MpOworCX0KKwkKKwlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKAorCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIAorCQkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAorCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuICgoRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkpIGZhY3RvcnkpLgorCQkJCWJ1aWxkT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyhwYXJlbnQsIChYbWxWYXJpYWJsZU9uZVRvT25lKSByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFZpcnR1YWxSZXNvdXJjZU1hcHBpbmcoCisJCQlPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgCisJCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZywgCisJCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gKChFY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeSkgZmFjdG9yeSkuCisJCQkJYnVpbGRWaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lKG9ybVR5cGVNYXBwaW5nLCAoSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcpIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGE5ZGIwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7CisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RPcm1WZXJzaW9uTWFwcGluZzxYbWxWZXJzaW9uPgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZworewkKKwlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGU7CisJCisJCisJcHVibGljIE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbFZlcnNpb24gcmVzb3VyY2VNYXBwaW5nKSB7CisJCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKKwkJdGhpcy5tdXRhYmxlID0gbmV3IE9ybUVjbGlwc2VMaW5rTXV0YWJsZSh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJfQorCQorCQorCXB1YmxpYyBFY2xpcHNlTGlua011dGFibGUgZ2V0TXV0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMubXV0YWJsZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGJ1aWxkU3BlY2lmaWVkQ29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXJUeXBlKSB7CisJCU9ybUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBzdXBlci5idWlsZFNwZWNpZmllZENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlKTsKKwkJaWYgKG9ybUNvbnZlcnRlciAhPSBudWxsKSB7CisJCQlyZXR1cm4gb3JtQ29udmVydGVyOworCQl9CisJCWlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSB7CisJCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydCh0aGlzLCB0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZyk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VDb252ZXJ0ZXJUeXBlKCkgeworCQkvL2NoZWNrIEBDb252ZXJ0IGZpcnN0LCB0aGlzIGlzIHRoZSBvcmRlciB0aGF0IEVjbGlwc2VMaW5rIHNlYXJjaGVzCisJCWlmICh0aGlzLnJlc291cmNlQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0KCkgIT0gbnVsbCkgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSOworCQl9CisJCXJldHVybiBzdXBlci5nZXRSZXNvdXJjZUNvbnZlcnRlclR5cGUoKTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKiByZXNvdXJjZS1jb250ZXh0IGludGVyYWN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5tdXRhYmxlLnVwZGF0ZSgpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7CisJCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7CisJCS8vIFRPRE8gLSBtdXRhYmxlIHZhbGlkYXRpb24KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZDhhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWMuamF2YQpAQCAtMCwwICsxLDI4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sQmFzaWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7CisKKy8qKgorICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljIGV4dGVuZHMgWG1sQmFzaWMKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFCYXNpY01hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxCYXNpYyB2aXJ0dWFsWG1sQmFzaWM7CisJCisJcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUJhc2ljTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMgPSBuZXcgVmlydHVhbFhtbEJhc2ljKG9ybVR5cGVNYXBwaW5nLCBqYXZhQmFzaWNNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRDb2x1bW4oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oWG1sQ29sdW1uIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbEJhc2ljLnNldENvbHVtbih2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRGZXRjaCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgeworCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRGZXRjaChuZXdGZXRjaCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRPcHRpb25hbCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gbmV3T3B0aW9uYWwpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0T3B0aW9uYWwobmV3T3B0aW9uYWwpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzTG9iKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuaXNMb2IoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiBuZXdMb2IpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0TG9iKG5ld0xvYik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9iVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0TG9iVGV4dFJhbmdlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldFRlbXBvcmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIHNldFRlbXBvcmFsKXsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0VGVtcG9yYWwoc2V0VGVtcG9yYWwpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRlbXBvcmFsVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldEVudW1lcmF0ZWQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRFbnVtZXJhdGVkKEVudW1UeXBlIHNldEVudW1lcmF0ZWQpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0RW51bWVyYXRlZChzZXRFbnVtZXJhdGVkKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRFbnVtZXJhdGVkVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBnZXRNdXRhYmxlKCkgeworCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoKChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZykuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCX0KKwkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZigoKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKS5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRNdXRhYmxlKEJvb2xlYW4gdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TXV0YWJsZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRDb252ZXJ0KCkgeworCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgeworCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENvbnZlcnQoU3RyaW5nIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBYbWxDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkgeworCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgeworCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyID0gKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUikgeworCQkJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sQ29udmVydGVyKHRoaXMub3JtVHlwZU1hcHBpbmcsIChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBYbWxPYmplY3RUeXBlQ29udmVydGVyIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSB7CisJCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSB7CisJCQlFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7CisJCQlpZiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVIpIHsKKwkJCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE9iamVjdFR5cGVDb252ZXJ0ZXIodGhpcy5vcm1UeXBlTWFwcGluZywgKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbFN0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKSB7CisJCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSB7CisJCQlFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7CisJCQlpZiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKSB7CisJCQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxTdHJ1Y3RDb252ZXJ0ZXIodGhpcy5vcm1UeXBlTWFwcGluZywgKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpIHsKKwkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpIHsKKwkJCUVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJCWlmIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKSB7CisJCQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUeXBlQ29udmVydGVyKHRoaXMub3JtVHlwZU1hcHBpbmcsIChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQJCQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7CisJCS8vIFRPRE8gZ2V0IGZyb20gamF2YSBhbm5vdGF0aW9ucworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNDb2xsZWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU4YzMxYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb24uamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb24gZXh0ZW5kcyBYbWxCYXNpY0NvbGxlY3Rpb24KK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisJCQorCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyB2aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZzsKKworCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb24oT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcgamF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcgPSBuZXcgVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcob3JtVHlwZU1hcHBpbmcsIGphdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQJCQorCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7CisJCS8vIFRPRE8gZ2V0IGZyb20gamF2YSBhbm5vdGF0aW9ucworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjYmIyNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcCBleHRlbmRzIFhtbEJhc2ljTWFwCit7CisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisJCQorCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyB2aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZzsKKworCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nIGphdmFCYXNpY01hcE1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUJhc2ljTWFwTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyA9IG5ldyBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyhvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljTWFwTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQ29udmVyc2lvblZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQ29udmVyc2lvblZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg2YjlhYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxDb252ZXJzaW9uVmFsdWUuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlOworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxDb252ZXJzaW9uVmFsdWUgZXh0ZW5kcyBYbWxDb252ZXJzaW9uVmFsdWUKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGphdmFDb252ZXJzaW9uVmFsdWU7CisJCisJcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbENvbnZlcnNpb25WYWx1ZShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgamF2YUNvbnZlcnNpb25WYWx1ZSkgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUNvbnZlcnNpb25WYWx1ZSA9IGphdmFDb252ZXJzaW9uVmFsdWU7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVZhbHVlKCkgeworCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiB0aGlzLmphdmFDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldERhdGFWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VmFsdWUoKSB7CisJCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIHRoaXMuamF2YUNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXREYXRhVmFsdWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE9iamVjdFZhbHVlVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5MzhlMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxDb252ZXJ0ZXIgZXh0ZW5kcyBYbWxDb252ZXJ0ZXIKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGphdmFDb252ZXJ0ZXI7CisJCisJcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbENvbnZlcnRlcihPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgamF2YUNvbnZlcnRlcikgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUNvbnZlcnRlciA9IGphdmFDb252ZXJ0ZXI7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisJCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIHRoaXMuamF2YUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIHRoaXMuamF2YUNvbnZlcnRlci5nZXROYW1lKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyOGM2MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbEVtYmVkZGVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZCBleHRlbmRzIFhtbEVtYmVkZGVkCit7CisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhRW1iZWRkZWRNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCisJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxYbWxFbWJlZGRlZCB2aXJ0dWFsWG1sRW1iZWRkZWQ7CisJCQorCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkTWFwcGluZyBqYXZhRW1iZWRkZWRNYXBwaW5nKSB7CisJCXN1cGVyKCk7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFFbWJlZGRlZE1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbEVtYmVkZGVkID0gbmV3IFZpcnR1YWxYbWxFbWJlZGRlZChvcm1UeXBlTWFwcGluZywgamF2YUVtYmVkZGVkTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkSWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZElkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2OGQzNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZElkLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxFbWJlZGRlZElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7CisKKy8qKgorICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkSWQgZXh0ZW5kcyBYbWxFbWJlZGRlZElkCit7CisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhRW1iZWRkZWRJZE1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbEVtYmVkZGVkSWQgdmlydHVhbFhtbEVtYmVkZGVkSWQ7CisJCQorCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZElkKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRW1iZWRkZWRJZE1hcHBpbmcgamF2YUVtYmVkZGVkSWRNYXBwaW5nKSB7CisJCXN1cGVyKCk7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFFbWJlZGRlZElkTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWRJZCA9IG5ldyBWaXJ0dWFsWG1sRW1iZWRkZWRJZChvcm1UeXBlTWFwcGluZywgamF2YUVtYmVkZGVkSWRNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWRJZC5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWRJZC5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZElkLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbElkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sSWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTgyMTY2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbElkLmphdmEKQEAgLTAsMCArMSwyODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKKworLyoqCisgKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAorICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sSWQgZXh0ZW5kcyBYbWxJZAoreworCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUlkTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKKworCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sSWQgdmlydHVhbFhtbElkOworCQkKKwlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sSWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhSWRNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxJZCA9IG5ldyBWaXJ0dWFsWG1sSWQob3JtVHlwZU1hcHBpbmcsIGphdmFJZE1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbElkLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldENvbHVtbigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0Q29sdW1uKHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0VGVtcG9yYWwoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpeworCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRUZW1wb3JhbChuZXdUZW1wb3JhbCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRUZW1wb3JhbFRleHRSYW5nZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBYbWxHZW5lcmF0ZWRWYWx1ZSBnZXRHZW5lcmF0ZWRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldEdlbmVyYXRlZFZhbHVlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbElkLnNldEdlbmVyYXRlZFZhbHVlKHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbElkLnNldFNlcXVlbmNlR2VuZXJhdG9yKHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRUYWJsZUdlbmVyYXRvcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbElkLnNldFRhYmxlR2VuZXJhdG9yKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVudW1UeXBlIGdldEVudW1lcmF0ZWQoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRFbnVtZXJhdGVkKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0RW51bWVyYXRlZCh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNMb2IoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5pc0xvYigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRMb2IodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldExvYlRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldExvYlRleHRSYW5nZSgpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBnZXRNdXRhYmxlKCkgeworCQkvL2Rvbid0IG5lZWQgaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgY2hlY2sgYmVjYXVzZSB0aGVyZSBpcyBubyBkZWZhdWx0IElkIG1hcHBpbmcKKwkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZigoKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKS5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRNdXRhYmxlKEJvb2xlYW4gdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRDb252ZXJ0KCkgeworCQkvL2Rvbid0IG5lZWQgaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgY2hlY2sgYmVjYXVzZSB0aGVyZSBpcyBubyBkZWZhdWx0IElkIG1hcHBpbmcKKwkJaWYgKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSB7CisJCQlyZXR1cm4gKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlck5hbWUoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Q29udmVydChTdHJpbmcgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkgeworCQkvL2Rvbid0IG5lZWQgaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgY2hlY2sgYmVjYXVzZSB0aGVyZSBpcyBubyBkZWZhdWx0IElkIG1hcHBpbmcKKwkJaWYgKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSB7CisJCQlFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7CisJCQlpZiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSKSB7CisJCQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxDb252ZXJ0ZXIodGhpcy5vcm1UeXBlTWFwcGluZywgKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpIHsKKwkJLy9kb24ndCBuZWVkIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIGNoZWNrIGJlY2F1c2UgdGhlcmUgaXMgbm8gZGVmYXVsdCBJZCBtYXBwaW5nCisJCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgeworCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyID0gKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSB7CisJCQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPYmplY3RUeXBlQ29udmVydGVyKHRoaXMub3JtVHlwZU1hcHBpbmcsIChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBYbWxTdHJ1Y3RDb252ZXJ0ZXIgZ2V0U3RydWN0Q29udmVydGVyKCkgeworCQkvL2Rvbid0IG5lZWQgaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgY2hlY2sgYmVjYXVzZSB0aGVyZSBpcyBubyBkZWZhdWx0IElkIG1hcHBpbmcKKwkJaWYgKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSB7CisJCQlFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7CisJCQlpZiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKSB7CisJCQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxTdHJ1Y3RDb252ZXJ0ZXIodGhpcy5vcm1UeXBlTWFwcGluZywgKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpIHsKKwkJLy9kb24ndCBuZWVkIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIGNoZWNrIGJlY2F1c2UgdGhlcmUgaXMgbm8gZGVmYXVsdCBJZCBtYXBwaW5nCisJCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgeworCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyID0gKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpIHsKKwkJCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFR5cGVDb252ZXJ0ZXIodGhpcy5vcm1UeXBlTWFwcGluZywgKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TXV0YWJsZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0VGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvTWFueS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NWVmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvTWFueS5qYXZhCkBAIC0wLDAgKzEsMTkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbFhtbE1hbnlUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7CisKKy8qKgorICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnkgZXh0ZW5kcyBYbWxNYW55VG9NYW55Cit7CisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbE1hbnlUb01hbnkgdmlydHVhbFhtbE1hbnlUb01hbnk7CisJCQorCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55KE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nKSB7CisJCXN1cGVyKCk7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFNYW55VG9NYW55TWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueSA9IG5ldyBWaXJ0dWFsWG1sTWFueVRvTWFueShvcm1UeXBlTWFwcGluZywgamF2YU1hbnlUb01hbnlNYXBwaW5nKTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0JCisJCisJQE92ZXJyaWRlCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0RmV0Y2goKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpIHsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5zZXRGZXRjaChuZXdGZXRjaCk7CisJfQorCisJcHVibGljIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRKb2luQ29sdW1ucygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDYXNjYWRlVHlwZSBnZXRDYXNjYWRlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRDYXNjYWRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENhc2NhZGUoQ2FzY2FkZVR5cGUgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5zZXRDYXNjYWRlKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5zZXRKb2luVGFibGUodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldFRhcmdldEVudGl0eSh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE1hcHBlZEJ5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldE1hcHBlZEJ5KHZhbHVlKTsKKwl9CisKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwS2V5IGdldE1hcEtleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0TWFwS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE1hcEtleShNYXBLZXkgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5zZXRNYXBLZXkodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE9yZGVyQnkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE9yZGVyQnkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T3JkZXJCeShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5zZXRPcmRlckJ5KHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKSB7CisJCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG51bGw7IC8vZG9uJ3QgcmV0dXJuIGRlZmF1bHQgdmFsdWUsIGl0IG9ubHkgYXBwbGllcyBmb3IgYW4gZW1wdHkgQEpvaW5GZXRjaAorCQl9CisJCXJldHVybiBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKCgoSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcpLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQJCQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7CisJCS8vIFRPRE8gZ2V0IGZyb20gamF2YSBhbm5vdGF0aW9ucworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9PbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9PbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQ3MDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZS5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sTWFueVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7CisKKy8qKgorICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZSBleHRlbmRzIFhtbE1hbnlUb09uZQoreworCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YU1hbnlUb09uZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbE1hbnlUb09uZSB2aXJ0dWFsWG1sTWFueVRvT25lOworCQkKKwlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvT25lKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhTWFueVRvT25lTWFwcGluZyBqYXZhTWFueVRvT25lTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhTWFueVRvT25lTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lID0gbmV3IFZpcnR1YWxYbWxNYW55VG9PbmUob3JtVHlwZU1hcHBpbmcsIGphdmFNYW55VG9PbmVNYXBwaW5nKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0RmV0Y2goKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpIHsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLnNldEZldGNoKG5ld0ZldGNoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRPcHRpb25hbCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gbmV3T3B0aW9uYWwpIHsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLnNldE9wdGlvbmFsKG5ld09wdGlvbmFsKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldEpvaW5Db2x1bW5zKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0Q2FzY2FkZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXRDYXNjYWRlKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0Sm9pblRhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuc2V0Sm9pblRhYmxlKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuc2V0VGFyZ2V0RW50aXR5KHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpIHsKKwkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gbnVsbDsgLy9kb24ndCByZXR1cm4gZGVmYXVsdCB2YWx1ZSwgaXQgb25seSBhcHBsaWVzIGZvciBhbiBlbXB0eSBASm9pbkZldGNoCisJCX0KKwkJcmV0dXJuIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwoKChKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nKSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MGNjOTcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKKworLyoqCisgKiBWaXJ0dWFsVmVyc2lvbiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBWZXJzaW9uIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhVmVyc2lvbk1hcHBpbmcgZXhpc3RzLgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgZXh0ZW5kcyBYbWxOdWxsQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcKK3sKKwkKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgdmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nOworCQorCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxOdWxsQXR0cmlidXRlTWFwcGluZyhPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nID0gbmV3IFZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZyhvcm1UeXBlTWFwcGluZywgamF2YUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CQorCQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWNhYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CisKKy8qKgorICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbE9iamVjdFR5cGVDb252ZXJ0ZXIgZXh0ZW5kcyBYbWxPYmplY3RUeXBlQ29udmVydGVyCit7CisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgamF2YUNvbnZlcnRlcjsKKwkKKwlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sT2JqZWN0VHlwZUNvbnZlcnRlcihPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGphdmFDb252ZXJ0ZXIpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFDb252ZXJ0ZXIgPSBqYXZhQ29udmVydGVyOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIHRoaXMuamF2YUNvbnZlcnRlci5nZXROYW1lKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKSB7CisJCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIHRoaXMuamF2YUNvbnZlcnRlci5nZXREYXRhVHlwZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRPYmplY3RUeXBlKCkgeworCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiB0aGlzLmphdmFDb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRPYmplY3RWYWx1ZSgpIHsKKwkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gdGhpcy5qYXZhQ29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxDb252ZXJzaW9uVmFsdWU+IGdldENvbnZlcnNpb25WYWx1ZXMoKSB7CisJCUVMaXN0PFhtbENvbnZlcnNpb25WYWx1ZT4gY29udmVyc2lvblZhbHVlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb252ZXJzaW9uVmFsdWU+KFhtbENvbnZlcnNpb25WYWx1ZS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTKTsKKwkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gY29udmVyc2lvblZhbHVlczsKKwkJfQorCQlmb3IgKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGphdmFDb252ZXJzaW9uVmFsdWUgOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5qYXZhQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKSkpIHsKKwkJCVhtbENvbnZlcnNpb25WYWx1ZSB4bWxDb252ZXJzaW9uVmFsdWUgPSBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sQ29udmVyc2lvblZhbHVlKHRoaXMub3JtVHlwZU1hcHBpbmcsIGphdmFDb252ZXJzaW9uVmFsdWUpOworCQkJY29udmVyc2lvblZhbHVlcy5hZGQoeG1sQ29udmVyc2lvblZhbHVlKTsKKwkJfQorCQlyZXR1cm4gY29udmVyc2lvblZhbHVlczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQzYTc5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueS5qYXZhCkBAIC0wLDAgKzEsMjI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sT25lVG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CisKKy8qKgorICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueSBleHRlbmRzIFhtbE9uZVRvTWFueQorewkKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbE9uZVRvTWFueSB2aXJ0dWFsWG1sT25lVG9NYW55OworCQkKKwlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55KAorCQkJT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YU9uZVRvTWFueU1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueSA9IG5ldyBWaXJ0dWFsWG1sT25lVG9NYW55KG9ybVR5cGVNYXBwaW5nLCBqYXZhT25lVG9NYW55TWFwcGluZyk7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0RmV0Y2goKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldEZldGNoKG5ld0ZldGNoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2FzY2FkZVR5cGUgZ2V0Q2FzY2FkZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRDYXNjYWRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENhc2NhZGUoQ2FzY2FkZVR5cGUgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldENhc2NhZGUodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRKb2luVGFibGUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRKb2luVGFibGUodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRUYXJnZXRFbnRpdHkodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE1hcHBlZEJ5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0TWFwcGVkQnkodmFsdWUpOworCX0KKworCQorCUBPdmVycmlkZQorCXB1YmxpYyBNYXBLZXkgZ2V0TWFwS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE1hcEtleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRNYXBLZXkoTWFwS2V5IHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRNYXBLZXkodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE9yZGVyQnkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0T3JkZXJCeSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5KFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0T3JkZXJCeSh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCk7CisJfQkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7CisJCS8vVE9ETyBuZWVkIHRvIGNoZWNrIG1ldGFkYXRhQ29tcGxldGUgaGVyZQorCQlFTGlzdDxYbWxKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IAorCQkJbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0pPSU5fQ09MVU1OUyk7CisJCS8vVE9ETyBoZXJlIGknbSB1c2luZyBqb2luQ29sdW1ucygpIHdoaWxlIFZpcnR1YWxYbWxKb2luVGFibGUgdXNlcyBzcGVjaWZpZWRKb2luQ29sdW1ucygpPz8/CisJCWZvciAoSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IAorCQkJCUNvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSgKKwkJCQkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS4KKwkJCQkJCWdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5qb2luQ29sdW1ucygpKSkgeworCQkJWG1sSm9pbkNvbHVtbiB4bWxKb2luQ29sdW1uID0gbmV3IFZpcnR1YWxYbWxKb2luQ29sdW1uKGpvaW5Db2x1bW4sIHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpOworCQkJam9pbkNvbHVtbnMuYWRkKHhtbEpvaW5Db2x1bW4pOworCQl9CisJCXJldHVybiBqb2luQ29sdW1uczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKSB7CisJCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG51bGw7IC8vZG9uJ3QgcmV0dXJuIGRlZmF1bHQgdmFsdWUsIGl0IG9ubHkgYXBwbGllcyBmb3IgYW4gZW1wdHkgQEpvaW5GZXRjaAorCQl9CisJCXJldHVybiBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVPd25lZCgpIHsKKwkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4gdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvT25lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5MzVhNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZS5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7CisKKy8qKgorICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvT25lIGV4dGVuZHMgWG1sT25lVG9PbmUKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFPbmVUb09uZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbE9uZVRvT25lIHZpcnR1YWxYbWxPbmVUb09uZTsKKwkJCisJcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvT25lKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhT25lVG9PbmVNYXBwaW5nIGphdmFPbmVUb09uZU1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YU9uZVRvT25lTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUgPSBuZXcgVmlydHVhbFhtbE9uZVRvT25lKG9ybVR5cGVNYXBwaW5nLCBqYXZhT25lVG9PbmVNYXBwaW5nKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRGZXRjaCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRGZXRjaChuZXdGZXRjaCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRPcHRpb25hbCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gbmV3T3B0aW9uYWwpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0T3B0aW9uYWwobmV3T3B0aW9uYWwpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldEpvaW5Db2x1bW5zKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRDYXNjYWRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENhc2NhZGUoQ2FzY2FkZVR5cGUgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0Q2FzY2FkZSh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0Sm9pblRhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRKb2luVGFibGUodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0VGFyZ2V0RW50aXR5KHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0TWFwcGVkQnkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0TWFwcGVkQnkodmFsdWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRNYXBwZWRCeVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKSB7CisJCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG51bGw7IC8vZG9uJ3QgcmV0dXJuIGRlZmF1bHQgdmFsdWUsIGl0IG9ubHkgYXBwbGllcyBmb3IgYW4gZW1wdHkgQEpvaW5GZXRjaAorCQl9CisJCXJldHVybiBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKCgoSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZU93bmVkKCkgeworCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gKChKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcpLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFByaXZhdGVPd25lZChib29sZWFuIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAkJCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKKwkJLy8gVE9ETyBnZXQgZnJvbSBqYXZhIGFubm90YXRpb25zCisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJpdmF0ZU93bmVkVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sU3RydWN0Q29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sU3RydWN0Q29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkOGE1MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxTdHJ1Y3RDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxTdHJ1Y3RDb252ZXJ0ZXIgZXh0ZW5kcyBYbWxTdHJ1Y3RDb252ZXJ0ZXIKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGphdmFDb252ZXJ0ZXI7CisJCisJcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbFN0cnVjdENvbnZlcnRlcihPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgamF2YUNvbnZlcnRlcikgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUNvbnZlcnRlciA9IGphdmFDb252ZXJ0ZXI7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXIoKSB7CisJCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIHRoaXMuamF2YUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoU3RyaW5nIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCWlmIChpc09ybU1ldGFkYXRhQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIHRoaXMuamF2YUNvbnZlcnRlci5nZXROYW1lKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2Zvcm1hdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjZGQ5YzQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24uamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbjsKKworLyoqCisgKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAorICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24gZXh0ZW5kcyBYbWxUcmFuc2Zvcm1hdGlvbgoreworCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCQkKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcgdmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24oT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyBqYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nKSB7CisJCXN1cGVyKCk7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcgPSBuZXcgVmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcob3JtVHlwZU1hcHBpbmcsIGphdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNpZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlODNmYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2llbnQuamF2YQpAQCAtMCwwICsxLDczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxYbWxUcmFuc2llbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKKworLyoqCisgKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAorICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNpZW50IGV4dGVuZHMgWG1sVHJhbnNpZW50Cit7CisJCQorCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YVRyYW5zaWVudE1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFhtbFRyYW5zaWVudCB2aXJ0dWFsWG1sVHJhbnNpZW50OworCQorCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2llbnQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFUcmFuc2llbnRNYXBwaW5nIGphdmFUcmFuc2llbnRNYXBwaW5nKSB7CisJCXN1cGVyKCk7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFUcmFuc2llbnRNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxUcmFuc2llbnQgPSBuZXcgVmlydHVhbFhtbFRyYW5zaWVudChvcm1UeXBlTWFwcGluZywgamF2YVRyYW5zaWVudE1hcHBpbmcpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxUcmFuc2llbnQuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxUcmFuc2llbnQuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sVHJhbnNpZW50LnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFRyYW5zaWVudC5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQJCQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFR5cGVDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxUeXBlQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1YjBhYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxUeXBlQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyOworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUeXBlQ29udmVydGVyIGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcgoreworCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGphdmFDb252ZXJ0ZXI7CisJCisJcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbFR5cGVDb252ZXJ0ZXIoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBqYXZhQ29udmVydGVyKSB7CisJCXN1cGVyKCk7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQ29udmVydGVyID0gamF2YUNvbnZlcnRlcjsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiB0aGlzLmphdmFDb252ZXJ0ZXIuZ2V0TmFtZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlKCkgeworCQlpZiAoaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiB0aGlzLmphdmFDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpIHsKKwkJaWYgKGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gdGhpcy5qYXZhQ29udmVydGVyLmdldE9iamVjdFR5cGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFZhcmlhYmxlT25lVG9PbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiZDBjMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lOworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lIGV4dGVuZHMgWG1sVmFyaWFibGVPbmVUb09uZQoreworCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisJCQorCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZyB2aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZzsKKworCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyBqYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nID0gbmV3IFZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nKG9ybVR5cGVNYXBwaW5nLCBqYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQXR0cmlidXRlTWFwcGluZy5nZXROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQl0aGlzLnZpcnR1YWxYbWxBdHRyaWJ1dGVNYXBwaW5nLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAkJCisJfQorCQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKKwkJLy8gVE9ETyBnZXQgZnJvbSBqYXZhIGFubm90YXRpb25zCisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFZlcnNpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWZXJzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0NmQzYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWZXJzaW9uLmphdmEKQEAgLTAsMCArMSwyNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsWG1sVmVyc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uOworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxWZXJzaW9uIGV4dGVuZHMgWG1sVmVyc2lvbgoreworCQkKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFWZXJzaW9uTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKKworCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sVmVyc2lvbiB2aXJ0dWFsWG1sVmVyc2lvbjsKKwkKKwlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmVyc2lvbihPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YVZlcnNpb25NYXBwaW5nIGphdmFWZXJzaW9uTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhVmVyc2lvbk1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbFZlcnNpb24gPSBuZXcgVmlydHVhbFhtbFZlcnNpb24ob3JtVHlwZU1hcHBpbmcsIGphdmFWZXJzaW9uTWFwcGluZyk7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbFZlcnNpb24uc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldENvbHVtbigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5zZXRDb2x1bW4odmFsdWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldFRlbXBvcmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKXsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFbnVtVHlwZSBnZXRFbnVtZXJhdGVkKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXRFbnVtZXJhdGVkKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzTG9iKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5pc0xvYigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldExvYlRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0TG9iVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldFRlbXBvcmFsVGV4dFJhbmdlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEJvb2xlYW4gZ2V0TXV0YWJsZSgpIHsKKwkJLy9kb24ndCBuZWVkIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIGNoZWNrIGJlY2F1c2UgdGhlcmUgaXMgbm8gZGVmYXVsdCBJZCBtYXBwaW5nCisJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoKChFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKS5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRNdXRhYmxlKEJvb2xlYW4gdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRDb252ZXJ0KCkgeworCQkvL2Rvbid0IG5lZWQgaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgY2hlY2sgYmVjYXVzZSB0aGVyZSBpcyBubyBkZWZhdWx0IElkIG1hcHBpbmcKKwkJaWYgKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSB7CisJCQlyZXR1cm4gKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlck5hbWUoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Q29udmVydChTdHJpbmcgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRNdXRhYmxlVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0VGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQ29udmVydGVyIGdldENvbnZlcnRlcigpIHsKKwkJLy9kb24ndCBuZWVkIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIGNoZWNrIGJlY2F1c2UgdGhlcmUgaXMgbm8gZGVmYXVsdCBJZCBtYXBwaW5nCisJCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgeworCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyID0gKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUikgeworCQkJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sQ29udmVydGVyKHRoaXMub3JtVHlwZU1hcHBpbmcsIChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBYbWxPYmplY3RUeXBlQ29udmVydGVyIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSB7CisJCS8vZG9uJ3QgbmVlZCBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSBjaGVjayBiZWNhdXNlIHRoZXJlIGlzIG5vIGRlZmF1bHQgSWQgbWFwcGluZworCQlpZiAodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpIHsKKwkJCUVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJCWlmIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikgeworCQkJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sT2JqZWN0VHlwZUNvbnZlcnRlcih0aGlzLm9ybVR5cGVNYXBwaW5nLCAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sU3RydWN0Q29udmVydGVyIGdldFN0cnVjdENvbnZlcnRlcigpIHsKKwkJLy9kb24ndCBuZWVkIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIGNoZWNrIGJlY2F1c2UgdGhlcmUgaXMgbm8gZGVmYXVsdCBJZCBtYXBwaW5nCisJCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgeworCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyID0gKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUikgeworCQkJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sU3RydWN0Q29udmVydGVyKHRoaXMub3JtVHlwZU1hcHBpbmcsIChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBYbWxUeXBlQ29udmVydGVyIGdldFR5cGVDb252ZXJ0ZXIoKSB7CisJCS8vZG9uJ3QgbmVlZCBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSBjaGVjayBiZWNhdXNlIHRoZXJlIGlzIG5vIGRlZmF1bHQgSWQgbWFwcGluZworCQlpZiAodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpIHsKKwkJCUVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJCWlmIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKSB7CisJCQkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUeXBlQ29udmVydGVyKHRoaXMub3JtVHlwZU1hcHBpbmcsIChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAkJCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKKwkJLy8gVE9ETyBnZXQgZnJvbSBqYXZhIGFubm90YXRpb25zCisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtKYXJGaWxlUmVmLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0phckZpbGVSZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTdmMTNlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtKYXJGaWxlUmVmLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RKYXJGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphckZpbGVSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmFyRmlsZVJlZiAKKwlleHRlbmRzIEFic3RyYWN0SmFyRmlsZVJlZgoreworCXB1YmxpYyBFY2xpcHNlTGlua0phckZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmKSB7CisJCXN1cGVyKHBhcmVudCwgeG1sSmFyRmlsZVJlZik7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElQYXRoW10gcmVzb2x2ZURlcGxveW1lbnRKYXJGaWxlUGF0aFdlYihJUGF0aCByb290LCBJUGF0aCBqYXJGaWxlUGF0aCkgeworCQlJUGF0aFtdIGdlbmVyaWNQYXRoID0gc3VwZXIucmVzb2x2ZURlcGxveW1lbnRKYXJGaWxlUGF0aFdlYihyb290LCBqYXJGaWxlUGF0aCk7CisJCXJldHVybiBBcnJheVRvb2xzLnJlbW92ZUxhc3QoZ2VuZXJpY1BhdGgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0OWZhOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LmphdmEKQEAgLTAsMCArMSwzNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlLkltcGxpZWRNYXBwaW5nRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtKcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsLkdlbmVyYWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkVjbGlwc2VMaW5rQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbC5FY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5FY2xpcHNlTGlua0xvZ2dpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5FY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOworCisvKioKKyAqIEVjbGlwc2VMaW5rIHBlcnNpc3RlbmNlIHVuaXQKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0CisJZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdAoreworCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZjsKKworCXByaXZhdGUvKmZpbmFsKi8gR2VuZXJhbFByb3BlcnRpZXMgZ2VuZXJhbFByb3BlcnRpZXM7CisJcHJpdmF0ZSBDb25uZWN0aW9uIGNvbm5lY3Rpb247CisJcHJpdmF0ZSBDdXN0b21pemF0aW9uIGN1c3RvbWl6YXRpb247CisJcHJpdmF0ZSBDYWNoaW5nIGNhY2hpbmc7CisJcHJpdmF0ZSBMb2dnaW5nIGxvZ2dpbmc7CisJcHJvdGVjdGVkIE9wdGlvbnMgb3B0aW9uczsKKwlwcml2YXRlIFNjaGVtYUdlbmVyYXRpb24gc2NoZW1hR2VuZXJhdGlvbjsKKworCS8qIGdsb2JhbCBjb252ZXJ0ZXIgZGVmaW5pdGlvbnMsIGRlZmluZWQgZWxzZXdoZXJlIGluIG1vZGVsICovCisJcHJvdGVjdGVkIGZpbmFsIExpc3Q8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlcnMgPSBuZXcgQXJyYXlMaXN0PEVjbGlwc2VMaW5rQ29udmVydGVyPigpOworCisKKwlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7CisJCXN1cGVyKHBhcmVudCwgeG1sUGVyc2lzdGVuY2VVbml0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKKworCQl0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzID0gdGhpcy5idWlsZEVjbGlwc2VMaW5rR2VuZXJhbFByb3BlcnRpZXMoKTsKKwkJdGhpcy5jb25uZWN0aW9uID0gdGhpcy5idWlsZEVjbGlwc2VMaW5rQ29ubmVjdGlvbigpOworCQl0aGlzLmN1c3RvbWl6YXRpb24gPSB0aGlzLmJ1aWxkRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uKCk7CisJCXRoaXMuY2FjaGluZyA9IHRoaXMuYnVpbGRFY2xpcHNlTGlua0NhY2hpbmcoKTsKKwkJdGhpcy5sb2dnaW5nID0gdGhpcy5idWlsZEVjbGlwc2VMaW5rTG9nZ2luZygpOworCQl0aGlzLm9wdGlvbnMgPSB0aGlzLmJ1aWxkRWNsaXBzZUxpbmtPcHRpb25zKCk7CisJCXRoaXMuc2NoZW1hR2VuZXJhdGlvbiA9IHRoaXMuYnVpbGRFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb24oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKFNldDxTdHJpbmc+IG5vblVwZGF0ZUFzcGVjdE5hbWVzKSB7CisJCXN1cGVyLmFkZE5vblVwZGF0ZUFzcGVjdE5hbWVzVG8obm9uVXBkYXRlQXNwZWN0TmFtZXMpOworCQlub25VcGRhdGVBc3BlY3ROYW1lcy5hZGQoQ09OVkVSVEVSU19MSVNUKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7CisJCXN1cGVyLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOworCQl0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOworCQl0aGlzLmNvbm5lY3Rpb24ucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7CisJCXRoaXMuY3VzdG9taXphdGlvbi5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKKwkJdGhpcy5jYWNoaW5nLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOworCQl0aGlzLmxvZ2dpbmcucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7CisJCXRoaXMub3B0aW9ucy5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKKwkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlzdXBlci5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKKwkJdGhpcy5nZW5lcmFsUHJvcGVydGllcy5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKKwkJdGhpcy5jb25uZWN0aW9uLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eU5hbWUpOworCQl0aGlzLmN1c3RvbWl6YXRpb24ucHJvcGVydHlSZW1vdmVkKHByb3BlcnR5TmFtZSk7CisJCXRoaXMuY2FjaGluZy5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKKwkJdGhpcy5sb2dnaW5nLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eU5hbWUpOworCQl0aGlzLm9wdGlvbnMucHJvcGVydHlSZW1vdmVkKHByb3BlcnR5TmFtZSk7CisJCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBtYXBwaW5nIGZpbGUgcmVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gbWFwcGluZ0ZpbGVSZWZzKCkgeworCQlpZiAodGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSB7CisJCQlyZXR1cm4gc3VwZXIubWFwcGluZ0ZpbGVSZWZzKCk7CisJCX0KKwkJcmV0dXJuIG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4oCisJCQlzdXBlci5tYXBwaW5nRmlsZVJlZnMoKSwgdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBtYXBwaW5nRmlsZVJlZnNTaXplKCkgeworCQlpZiAodGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSB7CisJCQlyZXR1cm4gc3VwZXIubWFwcGluZ0ZpbGVSZWZzU2l6ZSgpOworCQl9CisJCXJldHVybiAxICsgc3VwZXIubWFwcGluZ0ZpbGVSZWZzU2l6ZSgpOworCX0KKworCisJLy8gKioqKioqKioqKioqKioqKiBpbXBsaWVkIGVjbGlwc2VsaW5rIG1hcHBpbmcgZmlsZSByZWYgKioqKioqKioqKioqKioqKioqKgorCisJLyoqCisJICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBpbXBsaWVkIGVjbGlwc2VsaW5rIG1hcHBpbmcgZmlsZSByZWYKKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTVBMSUVEX0VDTElQU0VMSU5LX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFkgPSAiaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYiOyAvLyROT04tTkxTLTEkCisKKworCXB1YmxpYyBNYXBwaW5nRmlsZVJlZiBnZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpIHsKKwkJcmV0dXJuIHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWY7CisJfQorCisJcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmIHNldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCkgeworCQlpZiAodGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgaW1wbGllZCBlY2xpcHNlbGluayBtYXBwaW5nIGZpbGUgcmVmIGlzIGFscmVhZHkgc2V0LiIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBidWlsZEVjbGlwc2VMaW5rSW1wbGllZE1hcHBpbmdGaWxlUmVmKCk7CisJCXRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYgPSBtYXBwaW5nRmlsZVJlZjsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChJTVBMSUVEX0VDTElQU0VMSU5LX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksIG51bGwsIG1hcHBpbmdGaWxlUmVmKTsKKwkJcmV0dXJuIG1hcHBpbmdGaWxlUmVmOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVuc2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSB7CisJCWlmICh0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBpbXBsaWVkIGVjbGlwc2VsaW5rIG1hcHBpbmcgZmlsZSByZWYgaXMgYWxyZWFkeSB1bnNldC4iKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZjsKKwkJdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZi5kaXNwb3NlKCk7CisJCXRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYgPSBudWxsOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElNUExJRURfRUNMSVBTRUxJTktfTUFQUElOR19GSUxFX1JFRl9QUk9QRVJUWSwgbWFwcGluZ0ZpbGVSZWYsIG51bGwpOworCX0KKworCisJLy8gKioqKioqKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHJvdGVjdGVkIEdlbmVyYWxQcm9wZXJ0aWVzIGJ1aWxkRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcygpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzKHRoaXMpOworCX0KKwkKKwlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBidWlsZEVjbGlwc2VMaW5rQ29ubmVjdGlvbigpIHsKKwkJcmV0dXJuIChDb25uZWN0aW9uKSBnZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb24odGhpcyk7CisJfQorCQorCXByb3RlY3RlZCBDdXN0b21pemF0aW9uIGJ1aWxkRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uKCkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbih0aGlzKTsKKwl9CisJCisJcHJvdGVjdGVkIENhY2hpbmcgYnVpbGRFY2xpcHNlTGlua0NhY2hpbmcoKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDYWNoaW5nKHRoaXMpOworCX0KKwkKKwlwcm90ZWN0ZWQgTG9nZ2luZyBidWlsZEVjbGlwc2VMaW5rTG9nZ2luZygpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0xvZ2dpbmcodGhpcyk7CisJfQorCQorCXByb3RlY3RlZCBPcHRpb25zIGJ1aWxkRWNsaXBzZUxpbmtPcHRpb25zKCkgeworCQlyZXR1cm4gKE9wdGlvbnMpIGdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3B0aW9ucyh0aGlzKTsKKwl9CisJCisJcHJvdGVjdGVkIFNjaGVtYUdlbmVyYXRpb24gYnVpbGRFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb24oKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uKHRoaXMpOworCX0KKwkKKworCS8vICoqKioqKioqKioqKioqKiogcHJvcGVydGllcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCXB1YmxpYyBHZW5lcmFsUHJvcGVydGllcyBnZXRHZW5lcmFsUHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXM7CisJfQorCisJcHVibGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuY29ubmVjdGlvbjsKKwl9CisKKwlwdWJsaWMgQ3VzdG9taXphdGlvbiBnZXRDdXN0b21pemF0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5jdXN0b21pemF0aW9uOworCX0KKworCXB1YmxpYyBDYWNoaW5nIGdldENhY2hpbmcoKSB7CisJCXJldHVybiB0aGlzLmNhY2hpbmc7CisJfQorCisJcHVibGljIExvZ2dpbmcgZ2V0TG9nZ2luZygpIHsKKwkJcmV0dXJuIHRoaXMubG9nZ2luZzsKKwl9CisKKwlwdWJsaWMgT3B0aW9ucyBnZXRPcHRpb25zKCkgeworCQlyZXR1cm4gdGhpcy5vcHRpb25zOworCX0KKworCXB1YmxpYyBTY2hlbWFHZW5lcmF0aW9uIGdldFNjaGVtYUdlbmVyYXRpb24oKSB7CisJCXJldHVybiB0aGlzLnNjaGVtYUdlbmVyYXRpb247CisJfQorCisKKwkvLyAqKioqKioqKioqKioqKioqIGNvbnZlcnRlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwkvKioKKwkgKiBJZGVudGlmaWVyIGZvciBjaGFuZ2VzIHRvIHRoZSBsaXN0IG9mIGdsb2JhbCBjb252ZXJ0ZXIgZGVmaW5pdGlvbnMuCisJICogTm90ZSB0aGF0IHRoZXJlIGFyZSBubyBncmFudWxhciBjaGFuZ2VzIHRvIHRoaXMgbGlzdC4gIFRoZXJlIGlzIG9ubHkKKwkgKiBub3RpZmljYXRpb24gdGhhdCB0aGUgZW50aXJlIGxpc3QgaGFzIGNoYW5nZWQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVEVSU19MSVNUID0gImNvbnZlcnRlcnMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBBZGQgdGhlIGNvbnZlcnRlciBkZWZpbml0aW9uIChkZWZpbmVkIGVsc2V3aGVyZSkgdG8gdGhlIGxpc3Qgb2YgY29udmVydGVycworCSAqIGRlZmluZWQgd2l0aGluIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KKwkgKiBOb3RlIHRoYXQgdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIHRoZSBwcm9jZXNzIG9mIHVwZGF0aW5nIHRoZQorCSAqIGxvY2FsIGNvbnZlcnRlciBkZWZpbml0aW9uLgorCSAqIE5vIGNoYW5nZSBub3RpZmljYXRpb24gYWNjb21wYW5pZXMgdGhpcyBhY3Rpb24gc3BlY2lmaWNhbGx5LgorCSAqLworCXB1YmxpYyB2b2lkIGFkZENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKwkJdGhpcy5jb252ZXJ0ZXJzLmFkZChjb252ZXJ0ZXIpOworCX0KKworCS8qKgorCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgY29udmVydGVycyBkZWZpbmVkIHdpdGhpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQsCisJICogaW5jbHVkZWQgZHVwbGljYXRlbHkgbmFtZWQgY29udmVydGVycyBkZWZpbml0aW9ucy4KKwkgKi8KKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVydGVyPiBhbGxDb252ZXJ0ZXJzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVydGVyPih0aGlzLmNvbnZlcnRlcnMpOworCX0KKworCXB1YmxpYyBpbnQgY29udmVydGVyc1NpemUoKSB7CisJCXJldHVybiB0aGlzLmNvbnZlcnRlcnMuc2l6ZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgbmFtZXMgb2YgdGhlIGNvbnZlcnRlcnMgZGVmaW5lZCBpbiB0aGUgcGVyc2lzdGVuY2UKKwkgKiB1bml0LCB3aXRoIGR1cGxpY2F0ZXMgcmVtb3ZlZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gdW5pcXVlQ29udmVydGVyTmFtZXMoKSB7CisJCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5hbGxOb25OdWxsQ29udmVydGVyTmFtZXMoKSk7CisJCXJldHVybiBuYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbbmFtZXMuc2l6ZSgpXSk7CisJfQorCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gYWxsTm9uTnVsbENvbnZlcnRlck5hbWVzKCkgeworCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPih0aGlzLmFsbENvbnZlcnRlck5hbWVzKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBjb252ZXJ0ZXJOYW1lKSB7CisJCQkJcmV0dXJuIGNvbnZlcnRlck5hbWUgIT0gbnVsbDsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBhbGxDb252ZXJ0ZXJOYW1lcygpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVydGVyLCBTdHJpbmc+KHRoaXMuYWxsQ29udmVydGVycygpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcikgeworCQkJCXJldHVybiBjb252ZXJ0ZXIuZ2V0TmFtZSgpOworCQkJfQorCQl9OworCX0KKworCisJLy8gKioqKioqKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKFhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKKwkJdGhpcy5jb252ZXJ0ZXJzLmNsZWFyKCk7CisJCXN1cGVyLnVwZGF0ZShwZXJzaXN0ZW5jZVVuaXQpOworCQljb252ZXJ0ZXJzVXBkYXRlZCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHBvc3RVcGRhdGUoKSB7CisJCXN1cGVyLnBvc3RVcGRhdGUoKTsKKwkJaWYgKHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYgIT0gbnVsbCkgeworCQkJdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZi5wb3N0VXBkYXRlKCk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFwcGluZ0ZpbGVSZWZzKCkgeworCQlzdXBlci5pbml0aWFsaXplTWFwcGluZ0ZpbGVSZWZzKCk7CisKKwkJLy8gdXNlIGltcGxpZWQgbWFwcGluZyBmaWxlIGlmIAorCQkvLyBhKSBwcm9wZXJ0aWVzIGRvZXMgbm90IGV4Y2x1ZGUgaXQKKwkJLy8gYikgaXQgaXNuJ3Qgb3RoZXJ3aXNlIHNwZWNpZmllZAorCQkvLyBjKSB0aGUgZmlsZSBhY3R1YWxseSBleGlzdHMKKwkJaWYgKCEgaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVJc0V4Y2x1ZGVkKCkKKwkJCQkmJiAhIGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlSXNTcGVjaWZpZWQoKQorCQkJCSYmIGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlRXhpc3RzKCkpIHsKKworCQkJdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiA9IGJ1aWxkRWNsaXBzZUxpbmtJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKKwkJfQorCX0KKworCXByaXZhdGUgSW1wbGllZE1hcHBpbmdGaWxlUmVmIGJ1aWxkRWNsaXBzZUxpbmtJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSB7CisJCXJldHVybiBuZXcgSW1wbGllZE1hcHBpbmdGaWxlUmVmKHRoaXMsIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfRklMRV9QQVRIKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNYXBwaW5nRmlsZVJlZnMoKSB7CisJCXN1cGVyLnVwZGF0ZU1hcHBpbmdGaWxlUmVmcygpOworCisJCS8vIHVzZSBpbXBsaWVkIG1hcHBpbmcgZmlsZSBpZiAKKwkJLy8gYSkgcHJvcGVydGllcyBkb2VzIG5vdCBleGNsdWRlIGl0CisJCS8vIGIpIGl0IGlzbid0IG90aGVyd2lzZSBzcGVjaWZpZWQKKwkJLy8gYykgdGhlIGZpbGUgYWN0dWFsbHkgZXhpc3RzCisJCWlmICghIGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlSXNFeGNsdWRlZCgpCisJCQkJJiYgISBpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZUlzU3BlY2lmaWVkKCkKKwkJCQkmJiBpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZUV4aXN0cygpKSB7CisKKwkJCWlmICh0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmID09IG51bGwpIHsKKwkJCQlzZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpOworCQkJfQorCQkJZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKS51cGRhdGUobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiAhPSBudWxsKSB7CisJCQl1bnNldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZUlzRXhjbHVkZWQoKSB7CisJCXJldHVybiBnZXRHZW5lcmFsUHJvcGVydGllcygpLmdldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpID09IEJvb2xlYW4uVFJVRTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZUlzU3BlY2lmaWVkKCkgeworCQlTdHJpbmcgaW1wbGllZE1hcHBpbmdGaWxlID0gSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9GSUxFX1BBVEg7CisJCWZvciAoSXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IHN0cmVhbSA9IHNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCWlmIChpbXBsaWVkTWFwcGluZ0ZpbGUuZXF1YWxzKHN0cmVhbS5uZXh0KCkuZ2V0RmlsZU5hbWUoKSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVjbGlwc2VMaW5rSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rSnBhUHJvamVjdCkgc3VwZXIuZ2V0SnBhUHJvamVjdCgpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZUV4aXN0cygpIHsKKwkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpICE9IG51bGw7CisJfQorCisJLy8gVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHBlcnNpc3RlbmNlIHVuaXQgaGFzIGJlZW4gdXBkYXRlZCB0byBlbnN1cmUKKwkvLyB3ZSBjYXRjaCBhbGwgYWRkZWQgY29udmVydGVycworCXByb3RlY3RlZCB2b2lkIGNvbnZlcnRlcnNVcGRhdGVkKCkgeworCQlmaXJlTGlzdENoYW5nZWQoQ09OVkVSVEVSU19MSVNULCB0aGlzLmNvbnZlcnRlcnMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGViZWVmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworCisvKioKKyAqIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcworICogCisgKiBMaXN0ZW5zIHRvIHRoZSBwcm9wZXJ0eUxpc3RBZGFwdGVyCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKK3sKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyhQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJLy8gKioqKioqKiogQ29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKgorCQorCXByb3RlY3RlZCBTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzU2V0V2l0aFByZWZpeChTdHJpbmcga2V5UHJlZml4KSB7CisJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucHJvcGVydGllc1dpdGhOYW1lUHJlZml4KGtleVByZWZpeCkpOworCX0KKworCS8qKgorCSAqIEV4dHJhY3RzIHRoZSBlbnRpdHlOYW1lIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgbmFtZS4gSWYgdGhlIHByb3BlcnR5IG5hbWUKKwkgKiBoYXMgbm8gc3VmZml4LCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdEVudGl0eU5hbWVPZihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkpIHsKKwkJcmV0dXJuIGV4dHJhY3RFbnRpdHlOYW1lT2YocHJvcGVydHkuZ2V0TmFtZSgpKTsKKwl9CisKKwkvKioKKwkgKiBFeHRyYWN0cyB0aGUgZW50aXR5TmFtZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy4gSWYgdGhlIHN0cmluZworCSAqIGhhcyBubyBzdWZmaXgsIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0RW50aXR5TmFtZU9mKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJaW50IGluZGV4ID0gcHJvcGVydHlOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisJCWlmIChpbmRleCA9PSAtMSkgeworCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjA5NzU4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuSmFyRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkVjbGlwc2VMaW5rQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuRWNsaXBzZUxpbmtPcHRpb25zOworCisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeQoreworCQorCUBPdmVycmlkZQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQocGFyZW50LCB4bWxQZXJzaXN0ZW5jZVVuaXQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmFyRmlsZVJlZiBidWlsZEphckZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKYXJGaWxlUmVmKHBhcmVudCwgeG1sSmFyRmlsZVJlZik7CisJfQorCisJcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRDb25uZWN0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0Nvbm5lY3Rpb24ocGFyZW50KTsKKwl9CisJCisJcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRPcHRpb25zKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09wdGlvbnMocGFyZW50KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDFiZGMzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBFRmFjdG9yeSBnZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCkgeworCQlyZXR1cm4gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5IGJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkoKTsKKwl9CisJCisJcHVibGljIEpwYVJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7CisJCXJldHVybiBKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VjbGlwc2VMaW5rQ2FjaGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk0ZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmcuamF2YQpAQCAtMCwwICsxLDU1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkZsdXNoQ2xlYXJDYWNoZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CisKKy8qKgorICogRWNsaXBzZUxpbmtDYWNoaW5nIGVuY2Fwc3VsYXRlcyBFY2xpcHNlTGluayBDYWNoaW5nIHByb3BlcnRpZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NhY2hpbmcgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKKwlpbXBsZW1lbnRzIENhY2hpbmcKK3sKKwkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgorCXByaXZhdGUgQ2FjaGVUeXBlIGNhY2hlVHlwZURlZmF1bHQ7CisJcHJpdmF0ZSBJbnRlZ2VyIGNhY2hlU2l6ZURlZmF1bHQ7CisJcHJpdmF0ZSBCb29sZWFuIHNoYXJlZENhY2hlRGVmYXVsdDsKKwlwcml2YXRlIEZsdXNoQ2xlYXJDYWNoZSBmbHVzaENsZWFyQ2FjaGU7CisKKwlwcml2YXRlIExpc3Q8RW50aXR5PiBlbnRpdGllczsKKwkKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCisJcHVibGljIEVjbGlwc2VMaW5rQ2FjaGluZyhQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCisJLyoqCisJICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgeworCQkvLyBUT1JFVklFVyAtIGhhbmRsZSBpbmNvcnJlY3QgU3RyaW5nIGluIHBlcnNpc3RlbmNlLnhtbAorCQl0aGlzLmVudGl0aWVzID0gbmV3IEFycmF5TGlzdDxFbnRpdHk+KCk7CisJCXRoaXMuY2FjaGVUeXBlRGVmYXVsdCA9IAorCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxULCBDYWNoZVR5cGUudmFsdWVzKCkpOworCQl0aGlzLmNhY2hlU2l6ZURlZmF1bHQgPSAKKwkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkVfREVGQVVMVCk7CisJCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0ID0gCisJCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCk7CisJCXRoaXMuZmx1c2hDbGVhckNhY2hlID0gCisJCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19GTFVTSF9DTEVBUl9DQUNIRSwgRmx1c2hDbGVhckNhY2hlLnZhbHVlcygpKTsKKwkJCisJCVNldDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IGNhY2hlVHlwZVByb3BlcnRpZXMgPSAKKwkJCXRoaXMuZ2V0UHJvcGVydGllc1NldFdpdGhQcmVmaXgoRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSk7CisJCVNldDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IGNhY2hlU2l6ZVByb3BlcnRpZXMgPSAKKwkJCXRoaXMuZ2V0UHJvcGVydGllc1NldFdpdGhQcmVmaXgoRUNMSVBTRUxJTktfQ0FDSEVfU0laRSk7CisJCVNldDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IHNoYXJlZENhY2hlUHJvcGVydGllcyA9IAorCQkJdGhpcy5nZXRQcm9wZXJ0aWVzU2V0V2l0aFByZWZpeChFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUpOworCQkKKwkJdGhpcy5pbml0aWFsaXplRW50aXRpZXNDYWNoZVR5cGUoY2FjaGVUeXBlUHJvcGVydGllcyk7CisJCXRoaXMuaW5pdGlhbGl6ZUVudGl0aWVzQ2FjaGVTaXplKGNhY2hlU2l6ZVByb3BlcnRpZXMpOworCQl0aGlzLmluaXRpYWxpemVFbnRpdGllc1NoYXJlZENhY2hlKHNoYXJlZENhY2hlUHJvcGVydGllcyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVFbnRpdGllc0NhY2hlVHlwZShTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBjYWNoZVR5cGVQcm9wZXJ0aWVzKSB7CisJCWZvciAoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGNhY2hlVHlwZVByb3BlcnR5IDogY2FjaGVUeXBlUHJvcGVydGllcykgeworCQkJdGhpcy5zZXRFbnRpdHlDYWNoZVR5cGVPZihjYWNoZVR5cGVQcm9wZXJ0eSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVudGl0aWVzQ2FjaGVTaXplKFNldDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IGNhY2hlU2l6ZVByb3BlcnRpZXMpIHsKKwkJZm9yIChQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgY2FjaGVTaXplUHJvcGVydHkgOiBjYWNoZVNpemVQcm9wZXJ0aWVzKSB7CisJCQl0aGlzLnNldEVudGl0eUNhY2hlU2l6ZU9mKGNhY2hlU2l6ZVByb3BlcnR5KTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRW50aXRpZXNTaGFyZWRDYWNoZShTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBzaGFyZWRDYWNoZVByb3BlcnRpZXMpIHsKKwkJZm9yIChQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgc2hhcmVkQ2FjaGVQcm9wZXJ0eSA6IHNoYXJlZENhY2hlUHJvcGVydGllcykgeworCQkJdGhpcy5zZXRFbnRpdHlTaGFyZWRDYWNoZU9mKHNoYXJlZENhY2hlUHJvcGVydHkpOworCQl9CisJfQorCisJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCkpIHsKKwkJCXRoaXMuY2FjaGVUeXBlRGVmYXVsdENoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ0FDSEVfU0laRV9ERUZBVUxUKSkgeworCQkJdGhpcy5jYWNoZVNpemVEZWZhdWx0Q2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCkpIHsKKwkJCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0Q2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSkpIHsKKwkJCXRoaXMuY2FjaGVUeXBlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19DQUNIRV9TSVpFKSkgeworCQkJdGhpcy5jYWNoZVNpemVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSkpIHsKKwkJCXRoaXMuc2hhcmVkQ2FjaGVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRkxVU0hfQ0xFQVJfQ0FDSEUpKSB7CisJCQl0aGlzLmZsdXNoQ2xlYXJDYWNoZUNoYW5nZWQobmV3VmFsdWUpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCkpIHsKKwkJCXRoaXMuY2FjaGVUeXBlRGVmYXVsdENoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9TSVpFX0RFRkFVTFQpKSB7CisJCQl0aGlzLmNhY2hlU2l6ZURlZmF1bHRDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQpKSB7CisJCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdENoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSkpIHsKKwkJCXRoaXMuY2FjaGVUeXBlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUpKSB7CisJCQl0aGlzLmNhY2hlU2l6ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUpKSB7CisJCQl0aGlzLnNoYXJlZENhY2hlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRkxVU0hfQ0xFQVJfQ0FDSEUpKSB7CisJCQl0aGlzLmZsdXNoQ2xlYXJDYWNoZUNoYW5nZWQobnVsbCk7CisJCX0KKwl9CisJCisJLyoqCisJICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKKwkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleTsKKwkgKiAJCXZhbHVlID0gcHJvcGVydHkgaWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCUVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCwKKwkJCUNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfQ0FDSEVfU0laRV9ERUZBVUxULAorCQkJQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCwKKwkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19GTFVTSF9DTEVBUl9DQUNIRSwKKwkJCUZMVVNIX0NMRUFSX0NBQ0hFX1BST1BFUlRZKTsKKwkJCisJCS8vIERvbid0IG5lZWQgdG8gaW5pdGlhbGl6ZSBwcm9wZXJ0eU5hbWVzIGZvcjogCisJCS8vIGNhY2hlVHlwZSwgc2hhcmVkQ2FjaGUsIGNhY2hlU2l6ZQorCX0KKworCS8qKgorCSAqIE1ldGhvZCB1c2VkIGZvciBpZGVudGlmeWluZyB0aGUgZ2l2ZW4gcHJvcGVydHkuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXRlbUlzUHJvcGVydHkoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGl0ZW0pIHsKKwkJYm9vbGVhbiBpc1Byb3BlcnR5ID0gc3VwZXIuaXRlbUlzUHJvcGVydHkoaXRlbSk7CisJCQorCQlpZiAoICEgaXNQcm9wZXJ0eSAmJiBpdGVtLmdldE5hbWUoKSAhPSBudWxsKSB7CisJCQkJaWYgKGl0ZW0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSkgfHwgCisJCQkJCQlpdGVtLmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUpIHx8IAorCQkJCQkJaXRlbS5nZXROYW1lKCkuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUpKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJfQorCQlyZXR1cm4gaXNQcm9wZXJ0eTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lIHVzZWQgZm9yIGNoYW5nZSBub3RpZmljYXRpb24gb2YgdGhlIGdpdmVuCisJICogcHJvcGVydHkuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBwcm9wZXJ0eUlkT2YoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5KSB7CisJCXRyeSB7CisJCQlyZXR1cm4gc3VwZXIucHJvcGVydHlJZE9mKHByb3BlcnR5KTsKKwkJfQorCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCWlmIChwcm9wZXJ0eS5nZXROYW1lKCkuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19DQUNIRV9UWVBFKSkgeworCQkJCXJldHVybiBDQUNIRV9UWVBFX1BST1BFUlRZOworCQkJfQorCQkJZWxzZSBpZiAocHJvcGVydHkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfU0laRSkpIHsKKwkJCQlyZXR1cm4gQ0FDSEVfU0laRV9QUk9QRVJUWTsKKwkJCX0KKwkJCWVsc2UgaWYgKHByb3BlcnR5LmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSkpIHsKKwkJCQlyZXR1cm4gU0hBUkVEX0NBQ0hFX1BST1BFUlRZOworCQkJfQorCQl9CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eS50b1N0cmluZygpKTsKKwl9CisJCisJcHVibGljIEVudGl0eSBhZGRFbnRpdHkoU3RyaW5nIGVudGl0eU5hbWUpIHsKKwkJaWYgKHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbnRpdHkgIiArIGVudGl0eU5hbWUgKyAiIGFscmVhZHkgZXhpc3RzLiIpOworCQl9CisJCUVudGl0eSBuZXdFbnRpdHkgPSB0aGlzLmJ1aWxkRW50aXR5KGVudGl0eU5hbWUpOworCQl0aGlzLmVudGl0aWVzLmFkZChuZXdFbnRpdHkpOworCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChFTlRJVElFU19MSVNULCB0aGlzLmVudGl0aWVzKTsKKwkJcmV0dXJuIG5ld0VudGl0eTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVFbnRpdHkoU3RyaW5nIGVudGl0eU5hbWUpIHsKKwkJaWYgKCAhIHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJRW50aXR5IGVudGl0eSA9IHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSk7CisJCXRoaXMuY2xlYXJFbnRpdHkoZW50aXR5KTsKKwkJdGhpcy5yZW1vdmVFbnRpdHkoZW50aXR5KTsKKwl9CisKKwkvLyAqKioqKioqKioqIENhY2hlVHlwZSAqKioqKioqKioqCisJcHVibGljIENhY2hlVHlwZSBnZXRDYWNoZVR5cGVPZihTdHJpbmcgZW50aXR5TmFtZSkgeworCQlFbnRpdHkgZW50aXR5ID0gdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKTsKKwkJcmV0dXJuIChlbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogZW50aXR5LmdldENhY2hlVHlwZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhY2hlVHlwZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBDYWNoZVR5cGUgbmV3Q2FjaGVUeXBlKSB7CisJCUVudGl0eSBvbGQgPSB0aGlzLnNldEVudGl0eUNhY2hlVHlwZU9mKGVudGl0eU5hbWUsIG5ld0NhY2hlVHlwZSk7CisJCXRoaXMucHV0RW51bVZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEUsIGVudGl0eU5hbWUsIG5ld0NhY2hlVHlwZSwgZmFsc2UpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfVFlQRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2FjaGVUeXBlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmV4dHJhY3RFbnRpdHlOYW1lT2YocHJvcGVydHlOYW1lKTsKKwkJRW50aXR5IG9sZCA9IHRoaXMuc2V0RW50aXR5Q2FjaGVUeXBlT2YoZW50aXR5TmFtZSwgc3RyaW5nVmFsdWUpOyAKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1RZUEVfUFJPUEVSVFksIG9sZCwgdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKSk7CisJfQorCQorCXB1YmxpYyBDYWNoZVR5cGUgZ2V0RGVmYXVsdENhY2hlVHlwZSgpIHsKKwkJcmV0dXJuICh0aGlzLmNhY2hlVHlwZURlZmF1bHQgPT0gbnVsbCkgPyBERUZBVUxUX0NBQ0hFX1RZUEUgOiB0aGlzLmNhY2hlVHlwZURlZmF1bHQ7CisJfQorCisJLy8gKioqKioqKioqKiBDYWNoZVNpemUgKioqKioqKioqKgorCXB1YmxpYyBJbnRlZ2VyIGdldENhY2hlU2l6ZU9mKFN0cmluZyBlbnRpdHlOYW1lKSB7CisJCUVudGl0eSBlbnRpdHkgPSB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpOworCQlyZXR1cm4gKGVudGl0eSA9PSBudWxsKSA/IG51bGwgOiBlbnRpdHkuZ2V0Q2FjaGVTaXplKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2FjaGVTaXplT2YoU3RyaW5nIGVudGl0eU5hbWUsIEludGVnZXIgbmV3Q2FjaGVTaXplKSB7CisJCUVudGl0eSBvbGQgPSB0aGlzLnNldEVudGl0eUNhY2hlU2l6ZU9mKGVudGl0eU5hbWUsIG5ld0NhY2hlU2l6ZSk7CisJCXRoaXMucHV0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUgKyBlbnRpdHlOYW1lLCBuZXdDYWNoZVNpemUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU0laRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2FjaGVTaXplQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmV4dHJhY3RFbnRpdHlOYW1lT2YocHJvcGVydHlOYW1lKTsKKwkJRW50aXR5IG9sZCA9IHRoaXMuc2V0RW50aXR5Q2FjaGVTaXplT2YoZW50aXR5TmFtZSwgc3RyaW5nVmFsdWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU0laRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTaXplKCkgeworCQlyZXR1cm4gKHRoaXMuY2FjaGVTaXplRGVmYXVsdCA9PSBudWxsKSA/IERFRkFVTFRfQ0FDSEVfU0laRSA6IHRoaXMuY2FjaGVTaXplRGVmYXVsdDsKKwl9CisKKwkvLyAqKioqKioqKioqIFNoYXJlZENhY2hlICoqKioqKioqKioKKwlwdWJsaWMgQm9vbGVhbiBnZXRTaGFyZWRDYWNoZU9mKFN0cmluZyBlbnRpdHlOYW1lKSB7CisJCUVudGl0eSBlbnRpdHkgPSB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpOworCQlyZXR1cm4gKGVudGl0eSA9PSBudWxsKSA/IG51bGwgOiBlbnRpdHkuY2FjaGVJc1NoYXJlZCgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNoYXJlZENhY2hlT2YoU3RyaW5nIGVudGl0eU5hbWUsIEJvb2xlYW4gbmV3U2hhcmVkQ2FjaGUpIHsKKwkJRW50aXR5IG9sZCA9IHRoaXMuc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihlbnRpdHlOYW1lLCBuZXdTaGFyZWRDYWNoZSk7CisJCXRoaXMucHV0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSwgZW50aXR5TmFtZSwgbmV3U2hhcmVkQ2FjaGUsIGZhbHNlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNIQVJFRF9DQUNIRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2hhcmVkQ2FjaGVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZXh0cmFjdEVudGl0eU5hbWVPZihwcm9wZXJ0eU5hbWUpOworCQlFbnRpdHkgb2xkID0gdGhpcy5zZXRFbnRpdHlTaGFyZWRDYWNoZU9mKGVudGl0eU5hbWUsIHN0cmluZ1ZhbHVlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNIQVJFRF9DQUNIRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0U2hhcmVkQ2FjaGUoKSB7CisJCXJldHVybiAodGhpcy5zaGFyZWRDYWNoZURlZmF1bHQgPT0gbnVsbCkgPyBERUZBVUxUX1NIQVJFRF9DQUNIRSA6IHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0OworCX0KKworCS8vICoqKioqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqKioqCisJcHVibGljIENhY2hlVHlwZSBnZXRDYWNoZVR5cGVEZWZhdWx0KCkgeworCQlyZXR1cm4gdGhpcy5jYWNoZVR5cGVEZWZhdWx0OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhY2hlVHlwZURlZmF1bHQoQ2FjaGVUeXBlIG5ld0NhY2hlVHlwZURlZmF1bHQpIHsKKwkJQ2FjaGVUeXBlIG9sZCA9IHRoaXMuY2FjaGVUeXBlRGVmYXVsdDsKKwkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0ID0gbmV3Q2FjaGVUeXBlRGVmYXVsdDsKKwkJdGhpcy5wdXRQcm9wZXJ0eShDQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFksIG5ld0NhY2hlVHlwZURlZmF1bHQpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZLCBvbGQsIG5ld0NhY2hlVHlwZURlZmF1bHQpOworCX0KKworCXByaXZhdGUgdm9pZCBjYWNoZVR5cGVEZWZhdWx0Q2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwkJQ2FjaGVUeXBlIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIENhY2hlVHlwZS52YWx1ZXMoKSk7CisJCUNhY2hlVHlwZSBvbGQgPSB0aGlzLmNhY2hlVHlwZURlZmF1bHQ7CisJCXRoaXMuY2FjaGVUeXBlRGVmYXVsdCA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgQ2FjaGVUeXBlIGdldERlZmF1bHRDYWNoZVR5cGVEZWZhdWx0KCkgeworCQlyZXR1cm4gREVGQVVMVF9DQUNIRV9UWVBFX0RFRkFVTFQ7CisJfQorCisJLy8gKioqKioqKioqKiBDYWNoZVNpemVEZWZhdWx0ICoqKioqKioqKioKKwlwdWJsaWMgSW50ZWdlciBnZXRDYWNoZVNpemVEZWZhdWx0KCkgeworCQlyZXR1cm4gdGhpcy5jYWNoZVNpemVEZWZhdWx0OworCX0KKworCXB1YmxpYyB2b2lkIHNldENhY2hlU2l6ZURlZmF1bHQoSW50ZWdlciBuZXdDYWNoZVNpemVEZWZhdWx0KSB7CisJCUludGVnZXIgb2xkID0gdGhpcy5jYWNoZVNpemVEZWZhdWx0OworCQl0aGlzLmNhY2hlU2l6ZURlZmF1bHQgPSBuZXdDYWNoZVNpemVEZWZhdWx0OworCQl0aGlzLnB1dFByb3BlcnR5KENBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSwgbmV3Q2FjaGVTaXplRGVmYXVsdCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFksIG9sZCwgbmV3Q2FjaGVTaXplRGVmYXVsdCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNhY2hlU2l6ZURlZmF1bHRDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOworCQlJbnRlZ2VyIG9sZCA9IHRoaXMuY2FjaGVTaXplRGVmYXVsdDsKKwkJdGhpcy5jYWNoZVNpemVEZWZhdWx0ID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRDYWNoZVNpemVEZWZhdWx0KCkgeworCQlyZXR1cm4gREVGQVVMVF9DQUNIRV9TSVpFX0RFRkFVTFQ7CisJfQorCisJLy8gKioqKioqKioqKiBTaGFyZWRDYWNoZURlZmF1bHQgKioqKioqKioqKgorCXB1YmxpYyBCb29sZWFuIGdldFNoYXJlZENhY2hlRGVmYXVsdCgpIHsKKwkJcmV0dXJuIHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0OworCX0KKworCXB1YmxpYyB2b2lkIHNldFNoYXJlZENhY2hlRGVmYXVsdChCb29sZWFuIG5ld1NoYXJlZENhY2hlRGVmYXVsdCkgeworCQlCb29sZWFuIG9sZCA9IHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0OworCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdCA9IG5ld1NoYXJlZENhY2hlRGVmYXVsdDsKKwkJdGhpcy5wdXRQcm9wZXJ0eShTSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSwgbmV3U2hhcmVkQ2FjaGVEZWZhdWx0KTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZLCBvbGQsIG5ld1NoYXJlZENhY2hlRGVmYXVsdCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNoYXJlZENhY2hlRGVmYXVsdENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7CisJCQorCQlCb29sZWFuIG9sZCA9IHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0OworCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdCA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHQoKSB7CisJCXJldHVybiBERUZBVUxUX1NIQVJFRF9DQUNIRV9ERUZBVUxUOworCX0KKworCS8vICoqKioqKioqKiogRmx1c2hDbGVhckNhY2hlICoqKioqKioqKioKKwkKKwlwdWJsaWMgRmx1c2hDbGVhckNhY2hlIGdldEZsdXNoQ2xlYXJDYWNoZSgpIHsKKwkJcmV0dXJuIHRoaXMuZmx1c2hDbGVhckNhY2hlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRGbHVzaENsZWFyQ2FjaGUoRmx1c2hDbGVhckNhY2hlIG5ld0ZsdXNoQ2xlYXJDYWNoZSkgeworCQlGbHVzaENsZWFyQ2FjaGUgb2xkID0gdGhpcy5mbHVzaENsZWFyQ2FjaGU7CisJCXRoaXMuZmx1c2hDbGVhckNhY2hlID0gbmV3Rmx1c2hDbGVhckNhY2hlOworCQl0aGlzLnB1dFByb3BlcnR5KEZMVVNIX0NMRUFSX0NBQ0hFX1BST1BFUlRZLCBuZXdGbHVzaENsZWFyQ2FjaGUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxVU0hfQ0xFQVJfQ0FDSEVfUFJPUEVSVFksIG9sZCwgbmV3Rmx1c2hDbGVhckNhY2hlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZmx1c2hDbGVhckNhY2hlQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwkJRmx1c2hDbGVhckNhY2hlIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIEZsdXNoQ2xlYXJDYWNoZS52YWx1ZXMoKSk7CisJCUZsdXNoQ2xlYXJDYWNoZSBvbGQgPSB0aGlzLmZsdXNoQ2xlYXJDYWNoZTsKKwkJdGhpcy5mbHVzaENsZWFyQ2FjaGUgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZMVVNIX0NMRUFSX0NBQ0hFX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisJCisJcHVibGljIEZsdXNoQ2xlYXJDYWNoZSBnZXREZWZhdWx0Rmx1c2hDbGVhckNhY2hlKCkgeworCQlyZXR1cm4gREVGQVVMVF9GTFVTSF9DTEVBUl9DQUNIRTsKKwl9CisKKwkvLyAqKioqKiogRW50aXR5IENhY2hlVHlwZSAqKioqKioqCisJLyoqCisJICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQorCSAqLworCXByaXZhdGUgRW50aXR5IHNldEVudGl0eUNhY2hlVHlwZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwkJQ2FjaGVUeXBlIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIENhY2hlVHlwZS52YWx1ZXMoKSk7CisJCXJldHVybiB0aGlzLnNldEVudGl0eUNhY2hlVHlwZU9mKGVudGl0eU5hbWUsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvbGQgRW50aXR5CisJICovCisJcHJpdmF0ZSBFbnRpdHkgc2V0RW50aXR5Q2FjaGVUeXBlT2YoU3RyaW5nIGVudGl0eU5hbWUsIENhY2hlVHlwZSBjYWNoZVR5cGUpIHsKKwkJRW50aXR5IGVudGl0eSA9ICh0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgPworCQkJCQkJdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKSA6CisJCQkJCQl0aGlzLmFkZEVudGl0eShlbnRpdHlOYW1lKTsKKwkJcmV0dXJuIHRoaXMuc2V0RW50aXR5Q2FjaGVUeXBlT2YoZW50aXR5LCBjYWNoZVR5cGUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKKwkgKi8KKwlwcml2YXRlIEVudGl0eSBzZXRFbnRpdHlDYWNoZVR5cGVPZihFbnRpdHkgZW50aXR5LCBDYWNoZVR5cGUgY2FjaGVUeXBlKSB7CisJCWlmKGVudGl0eSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJRW50aXR5IG9sZCA9IGVudGl0eS5jbG9uZSgpOworCQllbnRpdHkuc2V0Q2FjaGVUeXBlKGNhY2hlVHlwZSk7CisJCXJldHVybiBvbGQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEVudGl0eUNhY2hlVHlwZU9mKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBjYWNoZVR5cGVQcm9wZXJ0eSkgeworCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZXh0cmFjdEVudGl0eU5hbWVPZihjYWNoZVR5cGVQcm9wZXJ0eSk7CisJCXRoaXMuc2V0RW50aXR5Q2FjaGVUeXBlT2YoZW50aXR5TmFtZSwgY2FjaGVUeXBlUHJvcGVydHkuZ2V0VmFsdWUoKSk7CisJfQorCisJLy8gKioqKioqIEVudGl0eSBDYWNoZSBzaXplICoqKioqKioKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvbGQgRW50aXR5CisJICovCisJcHJpdmF0ZSBFbnRpdHkgc2V0RW50aXR5Q2FjaGVTaXplT2YoU3RyaW5nIGVudGl0eU5hbWUsIFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOworCQlyZXR1cm4gdGhpcy5zZXRFbnRpdHlDYWNoZVNpemVPZihlbnRpdHlOYW1lLCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQorCSAqLworCXByaXZhdGUgRW50aXR5IHNldEVudGl0eUNhY2hlU2l6ZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBJbnRlZ2VyIHNpemUpIHsKKwkJRW50aXR5IGVudGl0eSA9ICh0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgPworCQkJCQkJdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKSA6CisJCQkJCQl0aGlzLmFkZEVudGl0eShlbnRpdHlOYW1lKTsKKwkJcmV0dXJuIHRoaXMuc2V0RW50aXR5Q2FjaGVTaXplT2YoZW50aXR5LCBzaXplKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvbGQgRW50aXR5CisJICovCisJcHJpdmF0ZSBFbnRpdHkgc2V0RW50aXR5Q2FjaGVTaXplT2YoRW50aXR5IGVudGl0eSwgSW50ZWdlciBzaXplKSB7CisJCWlmKGVudGl0eSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJRW50aXR5IG9sZCA9IGVudGl0eS5jbG9uZSgpOworCQllbnRpdHkuc2V0Q2FjaGVTaXplKHNpemUpOworCQlyZXR1cm4gb2xkOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRFbnRpdHlDYWNoZVNpemVPZihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgY2FjaGVTaXplUHJvcGVydHkpIHsKKwkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmV4dHJhY3RFbnRpdHlOYW1lT2YoY2FjaGVTaXplUHJvcGVydHkpOworCQl0aGlzLnNldEVudGl0eUNhY2hlU2l6ZU9mKGVudGl0eU5hbWUsIGNhY2hlU2l6ZVByb3BlcnR5LmdldFZhbHVlKCkpOworCX0KKworCS8vICoqKioqKiBFbnRpdHkgU2hhcmVkQ2FjaGUgKioqKioqKgorCS8qKgorCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKKwkgKi8KKwlwcml2YXRlIEVudGl0eSBzZXRFbnRpdHlTaGFyZWRDYWNoZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKKwkJcmV0dXJuIHRoaXMuc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihlbnRpdHlOYW1lLCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQorCSAqLworCXByaXZhdGUgRW50aXR5IHNldEVudGl0eVNoYXJlZENhY2hlT2YoU3RyaW5nIGVudGl0eU5hbWUsIEJvb2xlYW4gc2hhcmVkQ2FjaGUpIHsKKwkJRW50aXR5IGVudGl0eSA9ICh0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgPworCQkJCQkJdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKSA6CisJCQkJCQl0aGlzLmFkZEVudGl0eShlbnRpdHlOYW1lKTsKKwkJcmV0dXJuIHRoaXMuc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihlbnRpdHksIHNoYXJlZENhY2hlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvbGQgRW50aXR5CisJICovCisJcHJpdmF0ZSBFbnRpdHkgc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihFbnRpdHkgZW50aXR5LCBCb29sZWFuIHNoYXJlZENhY2hlKSB7CisJCWlmKGVudGl0eSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJRW50aXR5IG9sZCA9IGVudGl0eS5jbG9uZSgpOworCQllbnRpdHkuc2V0U2hhcmVkQ2FjaGUoc2hhcmVkQ2FjaGUpOworCQlyZXR1cm4gb2xkOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRFbnRpdHlTaGFyZWRDYWNoZU9mKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBzaGFyZWRDYWNoZVByb3BlcnR5KSB7CisJCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5leHRyYWN0RW50aXR5TmFtZU9mKHNoYXJlZENhY2hlUHJvcGVydHkpOworCQl0aGlzLnNldEVudGl0eVNoYXJlZENhY2hlT2YoZW50aXR5TmFtZSwgc2hhcmVkQ2FjaGVQcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKKwl9CisKKwkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCisKKwkvKioKKwkgKiBTZXQgYWxsIEVudGl0eSBwcm9wZXJ0aWVzIHRvIGRlZmF1bHQuCisJICovCisJcHJpdmF0ZSB2b2lkIGNsZWFyRW50aXR5KEVudGl0eSBlbnRpdHkpIHsKKwkJaWYoZW50aXR5LmlzRW1wdHkoKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBlbnRpdHlOYW1lID0gZW50aXR5LmdldE5hbWUoKTsKKwkJdGhpcy5zZXRDYWNoZVR5cGVPZihlbnRpdHlOYW1lLCBudWxsKTsKKwkJdGhpcy5zZXRDYWNoZVNpemVPZihlbnRpdHlOYW1lLCBudWxsKTsKKwkJdGhpcy5zZXRTaGFyZWRDYWNoZU9mKGVudGl0eU5hbWUsIG51bGwpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIEVudGl0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqLworCXByaXZhdGUgRW50aXR5IGdldEVudGl0eU5hbWVkKFN0cmluZyBuYW1lKSB7CisJCWZvcihFbnRpdHkgZW50aXR5OiB0aGlzLmVudGl0aWVzKSB7CisJCQlpZihlbnRpdHkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiBlbnRpdHk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBFbnRpdHkgYnVpbGRFbnRpdHkoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIG5ldyBFbnRpdHkodGhpcywgbmFtZSk7CisJfQorCQorCXByaXZhdGUgdm9pZCByZW1vdmVFbnRpdHkoRW50aXR5IGVudGl0eSkgeworCQlpZihlbnRpdHkgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMuZW50aXRpZXMucmVtb3ZlKGVudGl0eSk7CisJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEVOVElUSUVTX0xJU1QsIHRoaXMuZW50aXRpZXMpOworCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBFbnRpdHkgZXhpc3QuCisJICovCisJcHVibGljIGJvb2xlYW4gZW50aXR5RXhpc3RzKFN0cmluZyBuYW1lKSB7CisJCWZvcihFbnRpdHkgZW50aXR5OiB0aGlzLmVudGl0aWVzKSB7CisJCQlpZihlbnRpdHkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvLyAqKioqKiogZW50aXRpZXMgbGlzdCAqKioqKioqCisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEVudGl0eT4gZW50aXRpZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8RW50aXR5Pih0aGlzLmVudGl0aWVzKTsKKwl9CisKKwlwdWJsaWMgaW50IGVudGl0aWVzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuZW50aXRpZXMuc2l6ZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTk3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VudGl0eS5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7CisKKy8qKgorICogIEVudGl0eQorICovCitwdWJsaWMgY2xhc3MgRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCit7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIENhY2hpbmcgcGFyZW50OworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVFlQRV9QUk9QRVJUWSA9IENhY2hpbmcuQ0FDSEVfVFlQRV9QUk9QRVJUWTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NJWkVfUFJPUEVSVFkgPSBDYWNoaW5nLkNBQ0hFX1NJWkVfUFJPUEVSVFk7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURfQ0FDSEVfUFJPUEVSVFkgPSBDYWNoaW5nLlNIQVJFRF9DQUNIRV9QUk9QRVJUWTsgLy8kTk9OLU5MUy0xJAorCisJLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKKwlwcml2YXRlIENhY2hlVHlwZSBjYWNoZVR5cGU7CisJcHJpdmF0ZSBJbnRlZ2VyIGNhY2hlU2l6ZTsKKwlwcml2YXRlIEJvb2xlYW4gY2FjaGVJc1NoYXJlZDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgorCXB1YmxpYyBFbnRpdHkoQ2FjaGluZyBwYXJlbnQsIFN0cmluZyBuYW1lKSB7CisJCXRoaXMocGFyZW50KTsKKwkJdGhpcy5pbml0aWFsaXplKG5hbWUpOworCX0KKwkKKwlwcml2YXRlIEVudGl0eShDYWNoaW5nIHBhcmVudCkgeworCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoU3RyaW5nIG5hbWUpIHsKKwkJaWYoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJLy8gKioqKioqKioqKiBiZWhhdmlvcnMgKioqKioqKioqKgorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCQlpZihvID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgbzsKKwkJcmV0dXJuICgKKwkJCSh0aGlzLmNhY2hlVHlwZSA9PSBudWxsID8KKwkJCQllbnRpdHkuY2FjaGVUeXBlID09IG51bGwgOiB0aGlzLmNhY2hlVHlwZS5lcXVhbHMoZW50aXR5LmNhY2hlVHlwZSkpICYmCisJCQkodGhpcy5jYWNoZUlzU2hhcmVkID09IG51bGwgPworCQkJCWVudGl0eS5jYWNoZUlzU2hhcmVkID09IG51bGwgOiB0aGlzLmNhY2hlSXNTaGFyZWQuZXF1YWxzKGVudGl0eS5jYWNoZUlzU2hhcmVkKSkgJiYKKwkJCSh0aGlzLmNhY2hlU2l6ZSA9PSBudWxsID8KKwkJCQllbnRpdHkuY2FjaGVTaXplID09IG51bGwgOiB0aGlzLmNhY2hlU2l6ZS5lcXVhbHMoZW50aXR5LmNhY2hlU2l6ZSkpKTsKKwl9CisJCisJIEBPdmVycmlkZQorCSBwdWJsaWMgRW50aXR5IGNsb25lKCkgeworCQkgdHJ5IHsKKwkJCSByZXR1cm4gKEVudGl0eSlzdXBlci5jbG9uZSgpOworCQkgfQorCQkgY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7CisJCQkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKKwkJIH0KKwkgfQorCisJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKwkJcmV0dXJuICh0aGlzLmNhY2hlVHlwZSA9PSBudWxsKSAmJgorCQkJCQkodGhpcy5jYWNoZVNpemUgPT0gbnVsbCkgJiYKKwkJCQkJKHRoaXMuY2FjaGVJc1NoYXJlZCA9PSBudWxsKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gZW50aXR5TmFtZUlzVmFsaWQoKSB7CisJCXJldHVybiAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKTsKKwl9CisKKwlwdWJsaWMgQ2FjaGluZyBnZXRQYXJlbnQoKSB7CisJCXJldHVybiB0aGlzLnBhcmVudDsKKwl9CisJCisJLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8vICoqKioqKioqKiogY2FjaGVUeXBlICoqKioqKioqKioKKwlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGdldENhY2hlVHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuY2FjaGVUeXBlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldENhY2hlVHlwZShDYWNoZVR5cGUgY2FjaGVUeXBlKSB7CisJCUNhY2hlVHlwZSBvbGQgPSB0aGlzLmNhY2hlVHlwZTsKKwkJdGhpcy5jYWNoZVR5cGUgPSBjYWNoZVR5cGU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9UWVBFX1BST1BFUlRZLCBvbGQsIGNhY2hlVHlwZSk7CisJfQorCisJLy8gKioqKioqKioqKiBjYWNoZVNpemUgKioqKioqKioqKgorCXByb3RlY3RlZCBJbnRlZ2VyIGdldENhY2hlU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuY2FjaGVTaXplOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldENhY2hlU2l6ZShJbnRlZ2VyIGNhY2hlU2l6ZSkgeworCQlJbnRlZ2VyIG9sZCA9IHRoaXMuY2FjaGVTaXplOworCQl0aGlzLmNhY2hlU2l6ZSA9IGNhY2hlU2l6ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NJWkVfUFJPUEVSVFksIG9sZCwgY2FjaGVTaXplKTsKKwl9CisKKwkvLyAqKioqKioqKioqIGNhY2hlSXNTaGFyZWQgKioqKioqKioqKgorCXByb3RlY3RlZCBCb29sZWFuIGNhY2hlSXNTaGFyZWQoKSB7CisJCXJldHVybiB0aGlzLmNhY2hlSXNTaGFyZWQ7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U2hhcmVkQ2FjaGUoQm9vbGVhbiBpc1NoYXJlZCkgeworCQlCb29sZWFuIG9sZCA9IHRoaXMuY2FjaGVJc1NoYXJlZDsKKwkJdGhpcy5jYWNoZUlzU2hhcmVkID0gaXNTaGFyZWQ7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSEFSRURfQ0FDSEVfUFJPUEVSVFksIG9sZCwgaXNTaGFyZWQpOworCX0KKworCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKCJuYW1lOiAiKTsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJCXNiLmFwcGVuZCgiLCBjYWNoZVR5cGU6ICIpOworCQlzYi5hcHBlbmQodGhpcy5jYWNoZVR5cGUpOworCQlzYi5hcHBlbmQoIiwgY2FjaGVTaXplOiAiKTsKKwkJc2IuYXBwZW5kKHRoaXMuY2FjaGVTaXplKTsKKwkJc2IuYXBwZW5kKCIsIGNhY2hlSXNTaGFyZWQ6ICIpOworCQlzYi5hcHBlbmQodGhpcy5jYWNoZUlzU2hhcmVkKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0VjbGlwc2VMaW5rQ29ubmVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmJlNjhjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb24uamF2YQpAQCAtMCwwICsxLDYwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQmF0Y2hXcml0aW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOworCisvKioKKyAqICBFY2xpcHNlTGlua0Nvbm5lY3Rpb24KKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29ubmVjdGlvbiBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcworCWltcGxlbWVudHMgQ29ubmVjdGlvbgoreworCQorCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCisJcHJpdmF0ZSBCYXRjaFdyaXRpbmcgYmF0Y2hXcml0aW5nOworCXByaXZhdGUgQm9vbGVhbiBuYXRpdmVTcWw7CisJcHJpdmF0ZSBCb29sZWFuIGNhY2hlU3RhdGVtZW50czsKKwlwcml2YXRlIEludGVnZXIgY2FjaGVTdGF0ZW1lbnRzU2l6ZTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlcjsKKwlwcm90ZWN0ZWQgU3RyaW5nIHVybDsKKwlwcm90ZWN0ZWQgU3RyaW5nIHVzZXI7CisJcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZDsKKwlwcml2YXRlIEJvb2xlYW4gYmluZFBhcmFtZXRlcnM7CisJcHJpdmF0ZSBCb29sZWFuIHJlYWRDb25uZWN0aW9uc1NoYXJlZDsKKwlwcml2YXRlIEludGVnZXIgcmVhZENvbm5lY3Rpb25zTWluOworCXByaXZhdGUgSW50ZWdlciByZWFkQ29ubmVjdGlvbnNNYXg7CisJcHJpdmF0ZSBJbnRlZ2VyIHdyaXRlQ29ubmVjdGlvbnNNaW47CisJcHJpdmF0ZSBJbnRlZ2VyIHdyaXRlQ29ubmVjdGlvbnNNYXg7CisJCisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCisJcHVibGljIEVjbGlwc2VMaW5rQ29ubmVjdGlvbihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCisJLyoqCisJICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgeworCQl0aGlzLmluaXRpYWxpemVEYXRhYmFzZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzKCk7CisJCQorCQl0aGlzLmJhdGNoV3JpdGluZyA9IAorCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORywgQmF0Y2hXcml0aW5nLnZhbHVlcygpKTsKKwkJdGhpcy5uYXRpdmVTcWwgPSAKKwkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX05BVElWRV9TUUwpOworCQl0aGlzLmNhY2hlU3RhdGVtZW50cyA9IAorCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UUyk7CisJCXRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZSA9IAorCQkJdGhpcy5nZXRJbnRlZ2VyVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFKTsKKwkJdGhpcy5iaW5kUGFyYW1ldGVycyA9IAorCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTKTsKKwkJdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWQgPSAKKwkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEKTsKKwkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW4gPSAKKwkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOKTsKKwkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXggPSAKKwkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYKTsKKwkJdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluID0gCisJCQl0aGlzLmdldEludGVnZXJWYWx1ZShFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NSU4pOworCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXggPSAKKwkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01BWCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEYXRhYmFzZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzKCkgeworCQl0aGlzLmRyaXZlciA9IAorCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19EUklWRVIpOworCQl0aGlzLnVybCA9IAorCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19VUkwpOworCQl0aGlzLnVzZXIgPSAKKwkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfVVNFUik7CisJCXRoaXMucGFzc3dvcmQgPSAKKwkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfUEFTU1dPUkQpOworCX0KKworCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgorCQorCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgeworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19OQVRJVkVfU1FMKSkgeworCQkJdGhpcy5uYXRpdmVTcWxDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0JBVENIX1dSSVRJTkcpKSB7CisJCQl0aGlzLmJhdGNoV3JpdGluZ0NoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UUykpIHsKKwkJCXRoaXMuY2FjaGVTdGF0ZW1lbnRzQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19EUklWRVIpKSB7CisJCQl0aGlzLmRyaXZlckNoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVVJMKSkgeworCQkJdGhpcy51cmxDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1VTRVIpKSB7CisJCQl0aGlzLnVzZXJDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1BBU1NXT1JEKSkgeworCQkJdGhpcy5wYXNzd29yZENoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTKSkgeworCQkJdGhpcy5iaW5kUGFyYW1ldGVyc0NoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19TSEFSRUQpKSB7CisJCQl0aGlzLnJlYWRDb25uZWN0aW9uc1NoYXJlZENoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFKSkgeworCQkJdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01JTikpIHsKKwkJCXJlYWRDb25uZWN0aW9uc01pbkNoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19NQVgpKSB7CisJCQlyZWFkQ29ubmVjdGlvbnNNYXhDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01JTikpIHsKKwkJCXdyaXRlQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01BWCkpIHsKKwkJCXdyaXRlQ29ubmVjdGlvbnNNYXhDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19OQVRJVkVfU1FMKSkgeworCQkJdGhpcy5uYXRpdmVTcWxDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORykpIHsKKwkJCXRoaXMuYmF0Y2hXcml0aW5nQ2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFMpKSB7CisJCQl0aGlzLmNhY2hlU3RhdGVtZW50c0NoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19EUklWRVIpKSB7CisJCQl0aGlzLmRyaXZlckNoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19VUkwpKSB7CisJCQl0aGlzLnVybENoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19VU0VSKSkgeworCQkJdGhpcy51c2VyQ2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1BBU1NXT1JEKSkgeworCQkJdGhpcy5wYXNzd29yZENoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlMpKSB7CisJCQl0aGlzLmJpbmRQYXJhbWV0ZXJzQ2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEKSkgeworCQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWRDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFKSkgeworCQkJdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplQ2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOKSkgeworCQkJcmVhZENvbm5lY3Rpb25zTWluQ2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYKSkgeworCQkJcmVhZENvbm5lY3Rpb25zTWF4Q2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01JTikpIHsKKwkJCXdyaXRlQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUFYKSkgeworCQkJd3JpdGVDb25uZWN0aW9uc01heENoYW5nZWQobnVsbCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAorCSAqIAkJa2V5ID0gRWNsaXBzZUxpbmsgcHJvcGVydHkga2V5CisJICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJdGhpcy5hZGREYXRhYmFzZUNvbm5lY3Rpb25Qcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19OQVRJVkVfU1FMLAorCQkJTkFUSVZFX1NRTF9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORywKKwkJCUJBVENIX1dSSVRJTkdfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCUVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFMsCisJCQlDQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTX1NJWkUsCisJCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCUVDTElQU0VMSU5LX0JJTkRfUEFSQU1FVEVSUywKKwkJCUJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19TSEFSRUQsCisJCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19NSU4sCisJCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19NQVgsCisJCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUlOLAorCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NQVgsCisJCQlXUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGREYXRhYmFzZUNvbm5lY3Rpb25Qcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCUVDTElQU0VMSU5LX0RSSVZFUiwKKwkJCURSSVZFUl9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfVVJMLAorCQkJVVJMX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19VU0VSLAorCQkJVVNFUl9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfUEFTU1dPUkQsCisJCQlQQVNTV09SRF9QUk9QRVJUWSk7CisJfQorCisJLyoqCisgICAgICogRG9lcyBhbGwgcHJlLXRyZWF0bWVudCBpbiB0aGlzIG1ldGhvZCBiZWZvcmUgdGhlIHByb3BlcnR5IGlzIHNldAorCSAqLworCXByb3RlY3RlZCB2b2lkIHByZVNldFByb3BlcnR5KCkgeworCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKKwl9CisKKwkvLyAqKioqKioqKioqIE5hdGl2ZVNxbCAqKioqKioqKioqCisJcHVibGljIEJvb2xlYW4gZ2V0TmF0aXZlU3FsKCkgeworCQlyZXR1cm4gdGhpcy5uYXRpdmVTcWw7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmF0aXZlU3FsKEJvb2xlYW4gbmV3TmF0aXZlU3FsKSB7CisJCXRoaXMucHJlU2V0UHJvcGVydHkoKTsKKwkJCisJCUJvb2xlYW4gb2xkID0gdGhpcy5uYXRpdmVTcWw7CisJCXRoaXMubmF0aXZlU3FsID0gbmV3TmF0aXZlU3FsOworCQl0aGlzLnB1dFByb3BlcnR5KE5BVElWRV9TUUxfUFJPUEVSVFksIG5ld05hdGl2ZVNxbCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQVRJVkVfU1FMX1BST1BFUlRZLCBvbGQsIG5ld05hdGl2ZVNxbCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBuYXRpdmVTcWxDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOworCQkKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLm5hdGl2ZVNxbDsKKwkJdGhpcy5uYXRpdmVTcWwgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BVElWRV9TUUxfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHROYXRpdmVTcWwoKSB7CisJCXJldHVybiBERUZBVUxUX05BVElWRV9TUUw7CisJfQorCisJLy8gKioqKioqKioqKiBCYXRjaFdyaXRpbmcgKioqKioqKioqKgorCQorCXB1YmxpYyBCYXRjaFdyaXRpbmcgZ2V0QmF0Y2hXcml0aW5nKCkgeworCQlyZXR1cm4gdGhpcy5iYXRjaFdyaXRpbmc7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEJhdGNoV3JpdGluZyhCYXRjaFdyaXRpbmcgbmV3QmF0Y2hXcml0aW5nKSB7CisJCXRoaXMucHJlU2V0UHJvcGVydHkoKTsKKwkJCisJCUJhdGNoV3JpdGluZyBvbGQgPSB0aGlzLmJhdGNoV3JpdGluZzsKKwkJdGhpcy5iYXRjaFdyaXRpbmcgPSBuZXdCYXRjaFdyaXRpbmc7CisJCXRoaXMucHV0UHJvcGVydHkoQkFUQ0hfV1JJVElOR19QUk9QRVJUWSwgbmV3QmF0Y2hXcml0aW5nKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEJBVENIX1dSSVRJTkdfUFJPUEVSVFksIG9sZCwgbmV3QmF0Y2hXcml0aW5nKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYmF0Y2hXcml0aW5nQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwkJQmF0Y2hXcml0aW5nIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIEJhdGNoV3JpdGluZy52YWx1ZXMoKSk7CisJCUJhdGNoV3JpdGluZyBvbGQgPSB0aGlzLmJhdGNoV3JpdGluZzsKKwkJdGhpcy5iYXRjaFdyaXRpbmcgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEJBVENIX1dSSVRJTkdfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKwkKKwlwdWJsaWMgQmF0Y2hXcml0aW5nIGdldERlZmF1bHRCYXRjaFdyaXRpbmcoKSB7CisJCXJldHVybiBERUZBVUxUX0JBVENIX1dSSVRJTkc7CisJfQorCisJLy8gKioqKioqKioqKiBDYWNoZVN0YXRlbWVudHMgKioqKioqKioqKgorCXB1YmxpYyBCb29sZWFuIGdldENhY2hlU3RhdGVtZW50cygpIHsKKwkJcmV0dXJuIHRoaXMuY2FjaGVTdGF0ZW1lbnRzOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhY2hlU3RhdGVtZW50cyhCb29sZWFuIG5ld0NhY2hlU3RhdGVtZW50cykgeworCQl0aGlzLnByZVNldFByb3BlcnR5KCk7CisJCQorCQlCb29sZWFuIG9sZCA9IHRoaXMuY2FjaGVTdGF0ZW1lbnRzOworCQl0aGlzLmNhY2hlU3RhdGVtZW50cyA9IG5ld0NhY2hlU3RhdGVtZW50czsKKwkJdGhpcy5wdXRQcm9wZXJ0eShDQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZLCBuZXdDYWNoZVN0YXRlbWVudHMpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSwgb2xkLCBuZXdDYWNoZVN0YXRlbWVudHMpOworCX0KKworCXByaXZhdGUgdm9pZCBjYWNoZVN0YXRlbWVudHNDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOworCQkKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLmNhY2hlU3RhdGVtZW50czsKKwkJdGhpcy5jYWNoZVN0YXRlbWVudHMgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRDYWNoZVN0YXRlbWVudHMoKSB7CisJCXJldHVybiBERUZBVUxUX0NBQ0hFX1NUQVRFTUVOVFM7CisJfQorCisJLy8gKioqKioqKioqKiBDYWNoZVN0YXRlbWVudHNTaXplICoqKioqKioqKioKKwlwdWJsaWMgSW50ZWdlciBnZXRDYWNoZVN0YXRlbWVudHNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplOworCX0KKworCXB1YmxpYyB2b2lkIHNldENhY2hlU3RhdGVtZW50c1NpemUoSW50ZWdlciBuZXdDYWNoZVN0YXRlbWVudHNTaXplKSB7CisJCXRoaXMucHJlU2V0UHJvcGVydHkoKTsKKwkJCisJCUludGVnZXIgb2xkID0gdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplOworCQl0aGlzLmNhY2hlU3RhdGVtZW50c1NpemUgPSBuZXdDYWNoZVN0YXRlbWVudHNTaXplOworCQl0aGlzLnB1dFByb3BlcnR5KENBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSwgbmV3Q2FjaGVTdGF0ZW1lbnRzU2l6ZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFksIG9sZCwgbmV3Q2FjaGVTdGF0ZW1lbnRzU2l6ZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNhY2hlU3RhdGVtZW50c1NpemVDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOworCQkKKwkJSW50ZWdlciBvbGQgPSB0aGlzLmNhY2hlU3RhdGVtZW50c1NpemU7CisJCXRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZSA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpIHsKKwkJcmV0dXJuIERFRkFVTFRfQ0FDSEVfU1RBVEVNRU5UU19TSVpFOworCX0KKworCS8vICoqKioqKioqKiogRHJpdmVyICoqKioqKioqKioKKwlwdWJsaWMgU3RyaW5nIGdldERyaXZlcigpIHsKKwkJcmV0dXJuIHRoaXMuZHJpdmVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldERyaXZlcihTdHJpbmcgbmV3RHJpdmVyKSB7CisJCXRoaXMucHJlU2V0UHJvcGVydHkoKTsKKwkJCisJCVN0cmluZyBvbGQgPSB0aGlzLmRyaXZlcjsKKwkJdGhpcy5kcml2ZXIgPSBuZXdEcml2ZXI7CisJCXRoaXMucHV0UHJvcGVydHkoRFJJVkVSX1BST1BFUlRZLCBuZXdEcml2ZXIpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRFJJVkVSX1BST1BFUlRZLCBvbGQsIG5ld0RyaXZlcik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZHJpdmVyQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuZHJpdmVyOworCQl0aGlzLmRyaXZlciA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRFJJVkVSX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHREcml2ZXIoKSB7CisJCXJldHVybiBERUZBVUxUX0RSSVZFUjsKKwl9CisKKwkvLyAqKioqKioqKioqIFVSTCAqKioqKioqKioqCisJcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisJCXJldHVybiB0aGlzLnVybDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIG5ld1VybCkgeworCQl0aGlzLnByZVNldFByb3BlcnR5KCk7CisJCQorCQlTdHJpbmcgb2xkID0gdGhpcy51cmw7CisJCXRoaXMudXJsID0gbmV3VXJsOworCQl0aGlzLnB1dFByb3BlcnR5KFVSTF9QUk9QRVJUWSwgbmV3VXJsKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFVSTF9QUk9QRVJUWSwgb2xkLCBuZXdVcmwpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVybENoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnVybDsKKwkJdGhpcy51cmwgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFVSTF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VXJsKCkgeworCQlyZXR1cm4gREVGQVVMVF9VUkw7CisJfQorCisJLy8gKioqKioqKioqKiBVc2VyICoqKioqKioqKioKKwlwdWJsaWMgU3RyaW5nIGdldFVzZXIoKSB7CisJCXJldHVybiB0aGlzLnVzZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXNlcihTdHJpbmcgbmV3VXNlcikgeworCQl0aGlzLnByZVNldFByb3BlcnR5KCk7CisJCQorCQlTdHJpbmcgb2xkID0gdGhpcy51c2VyOworCQl0aGlzLnVzZXIgPSBuZXdVc2VyOworCQl0aGlzLnB1dFByb3BlcnR5KFVTRVJfUFJPUEVSVFksIG5ld1VzZXIpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVVNFUl9QUk9QRVJUWSwgb2xkLCBuZXdVc2VyKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1c2VyQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudXNlcjsKKwkJdGhpcy51c2VyID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVU0VSX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRVc2VyKCkgeworCQlyZXR1cm4gREVGQVVMVF9VU0VSOworCX0KKworCS8vICoqKioqKioqKiogUGFzc3dvcmQgKioqKioqKioqKgorCXB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisJCXJldHVybiB0aGlzLnBhc3N3b3JkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBuZXdQYXNzd29yZCkgeworCQl0aGlzLnByZVNldFByb3BlcnR5KCk7CisJCQorCQlTdHJpbmcgb2xkID0gdGhpcy5wYXNzd29yZDsKKwkJdGhpcy5wYXNzd29yZCA9IG5ld1Bhc3N3b3JkOworCQl0aGlzLnB1dFByb3BlcnR5KFBBU1NXT1JEX1BST1BFUlRZLCBuZXdQYXNzd29yZCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQQVNTV09SRF9QUk9QRVJUWSwgb2xkLCBuZXdQYXNzd29yZCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcGFzc3dvcmRDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5wYXNzd29yZDsKKwkJdGhpcy5wYXNzd29yZCA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEFTU1dPUkRfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhc3N3b3JkKCkgeworCQlyZXR1cm4gREVGQVVMVF9QQVNTV09SRDsKKwl9CisKKwkvLyAqKioqKioqKioqIEJpbmRQYXJhbWV0ZXJzICoqKioqKioqKioKKwlwdWJsaWMgQm9vbGVhbiBnZXRCaW5kUGFyYW1ldGVycygpIHsKKwkJcmV0dXJuIHRoaXMuYmluZFBhcmFtZXRlcnM7CisJfQorCisJcHVibGljIHZvaWQgc2V0QmluZFBhcmFtZXRlcnMoQm9vbGVhbiBuZXdCaW5kUGFyYW1ldGVycykgeworCQl0aGlzLnByZVNldFByb3BlcnR5KCk7CisJCQorCQlCb29sZWFuIG9sZCA9IHRoaXMuYmluZFBhcmFtZXRlcnM7CisJCXRoaXMuYmluZFBhcmFtZXRlcnMgPSBuZXdCaW5kUGFyYW1ldGVyczsKKwkJdGhpcy5wdXRQcm9wZXJ0eShCSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFksIG5ld0JpbmRQYXJhbWV0ZXJzKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSwgb2xkLCBuZXdCaW5kUGFyYW1ldGVycyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGJpbmRQYXJhbWV0ZXJzQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKKwkJCisJCUJvb2xlYW4gb2xkID0gdGhpcy5iaW5kUGFyYW1ldGVyczsKKwkJdGhpcy5iaW5kUGFyYW1ldGVycyA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQklORF9QQVJBTUVURVJTX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0QmluZFBhcmFtZXRlcnMoKSB7CisJCXJldHVybiBERUZBVUxUX0JJTkRfUEFSQU1FVEVSUzsKKwl9CisKKwkvLyAqKioqKioqKioqIFJlYWRDb25uZWN0aW9uc1NoYXJlZCAqKioqKioqKioqCisJcHVibGljIEJvb2xlYW4gZ2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCkgeworCQlyZXR1cm4gdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKEJvb2xlYW4gbmV3UmVhZENvbm5lY3Rpb25zU2hhcmVkKSB7CisJCXRoaXMucHJlU2V0UHJvcGVydHkoKTsKKwkJCisJCUJvb2xlYW4gb2xkID0gdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWQ7CisJCXRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkID0gbmV3UmVhZENvbm5lY3Rpb25zU2hhcmVkOworCQl0aGlzLnB1dFByb3BlcnR5KFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZLCBuZXdSZWFkQ29ubmVjdGlvbnNTaGFyZWQpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFksIG9sZCwgbmV3UmVhZENvbm5lY3Rpb25zU2hhcmVkKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVhZENvbm5lY3Rpb25zU2hhcmVkQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKKwkJCisJCUJvb2xlYW4gb2xkID0gdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWQ7CisJCXRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpIHsKKwkJcmV0dXJuIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19TSEFSRUQ7CisJfQorCisJLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNNaW4gKioqKioqKioqKgorCXB1YmxpYyBJbnRlZ2VyIGdldFJlYWRDb25uZWN0aW9uc01pbigpIHsKKwkJcmV0dXJuIHRoaXMucmVhZENvbm5lY3Rpb25zTWluOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlYWRDb25uZWN0aW9uc01pbihJbnRlZ2VyIG5ld1JlYWRDb25uZWN0aW9uc01pbikgeworCQl0aGlzLnByZVNldFByb3BlcnR5KCk7CisJCQorCQlJbnRlZ2VyIG9sZCA9IHRoaXMucmVhZENvbm5lY3Rpb25zTWluOworCQl0aGlzLnJlYWRDb25uZWN0aW9uc01pbiA9IG5ld1JlYWRDb25uZWN0aW9uc01pbjsKKwkJdGhpcy5wdXRQcm9wZXJ0eShSRUFEX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSwgbmV3UmVhZENvbm5lY3Rpb25zTWluKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBvbGQsIG5ld1JlYWRDb25uZWN0aW9uc01pbik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlYWRDb25uZWN0aW9uc01pbkNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCUludGVnZXIgbmV3VmFsdWUgPSBnZXRJbnRlZ2VyVmFsdWVPZihzdHJpbmdWYWx1ZSk7CisJCQorCQlJbnRlZ2VyIG9sZCA9IHRoaXMucmVhZENvbm5lY3Rpb25zTWluOworCQl0aGlzLnJlYWRDb25uZWN0aW9uc01pbiA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNaW4oKSB7CisJCXJldHVybiBERUZBVUxUX1JFQURfQ09OTkVDVElPTlNfTUlOOworCX0KKworCS8vICoqKioqKioqKiogUmVhZENvbm5lY3Rpb25zTWF4ICoqKioqKioqKioKKwlwdWJsaWMgSW50ZWdlciBnZXRSZWFkQ29ubmVjdGlvbnNNYXgoKSB7CisJCXJldHVybiB0aGlzLnJlYWRDb25uZWN0aW9uc01heDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNNYXgoSW50ZWdlciBuZXdSZWFkQ29ubmVjdGlvbnNNYXgpIHsKKwkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOworCQkKKwkJSW50ZWdlciBvbGQgPSB0aGlzLnJlYWRDb25uZWN0aW9uc01heDsKKwkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXggPSBuZXdSZWFkQ29ubmVjdGlvbnNNYXg7CisJCXRoaXMucHV0UHJvcGVydHkoUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFksIG5ld1JlYWRDb25uZWN0aW9uc01heCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgb2xkLCBuZXdSZWFkQ29ubmVjdGlvbnNNYXgpOworCX0KKworCXByaXZhdGUgdm9pZCByZWFkQ29ubmVjdGlvbnNNYXhDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOworCQkKKwkJSW50ZWdlciBvbGQgPSB0aGlzLnJlYWRDb25uZWN0aW9uc01heDsKKwkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXggPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWF4KCkgeworCQlyZXR1cm4gREVGQVVMVF9SRUFEX0NPTk5FQ1RJT05TX01BWDsKKwl9CisKKwkvLyAqKioqKioqKioqIFdyaXRlQ29ubmVjdGlvbnNNaW4gKioqKioqKioqKgorCXB1YmxpYyBJbnRlZ2VyIGdldFdyaXRlQ29ubmVjdGlvbnNNaW4oKSB7CisJCXJldHVybiB0aGlzLndyaXRlQ29ubmVjdGlvbnNNaW47CisJfQorCisJcHVibGljIHZvaWQgc2V0V3JpdGVDb25uZWN0aW9uc01pbihJbnRlZ2VyIG5ld1dyaXRlQ29ubmVjdGlvbnNNaW4pIHsKKwkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOworCQkKKwkJSW50ZWdlciBvbGQgPSB0aGlzLndyaXRlQ29ubmVjdGlvbnNNaW47CisJCXRoaXMud3JpdGVDb25uZWN0aW9uc01pbiA9IG5ld1dyaXRlQ29ubmVjdGlvbnNNaW47CisJCXRoaXMucHV0UHJvcGVydHkoV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBuZXdXcml0ZUNvbm5lY3Rpb25zTWluKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdSSVRFX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSwgb2xkLCBuZXdXcml0ZUNvbm5lY3Rpb25zTWluKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGVDb25uZWN0aW9uc01pbkNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCUludGVnZXIgbmV3VmFsdWUgPSBnZXRJbnRlZ2VyVmFsdWVPZihzdHJpbmdWYWx1ZSk7CisJCQorCQlJbnRlZ2VyIG9sZCA9IHRoaXMud3JpdGVDb25uZWN0aW9uc01pbjsKKwkJdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWluKCkgeworCQlyZXR1cm4gREVGQVVMVF9XUklURV9DT05ORUNUSU9OU19NSU47CisJfQorCisJLy8gKioqKioqKioqKiBXcml0ZUNvbm5lY3Rpb25zTWF4ICoqKioqKioqKioKKwlwdWJsaWMgSW50ZWdlciBnZXRXcml0ZUNvbm5lY3Rpb25zTWF4KCkgeworCQlyZXR1cm4gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWF4OworCX0KKworCXB1YmxpYyB2b2lkIHNldFdyaXRlQ29ubmVjdGlvbnNNYXgoSW50ZWdlciBuZXdXcml0ZUNvbm5lY3Rpb25zTWF4KSB7CisJCXRoaXMucHJlU2V0UHJvcGVydHkoKTsKKwkJCisJCUludGVnZXIgb2xkID0gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWF4OworCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXggPSBuZXdXcml0ZUNvbm5lY3Rpb25zTWF4OworCQl0aGlzLnB1dFByb3BlcnR5KFdSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgbmV3V3JpdGVDb25uZWN0aW9uc01heCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFksIG9sZCwgbmV3V3JpdGVDb25uZWN0aW9uc01heCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlQ29ubmVjdGlvbnNNYXhDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOworCQkKKwkJSW50ZWdlciBvbGQgPSB0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXg7CisJCXRoaXMud3JpdGVDb25uZWN0aW9uc01heCA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV1JJVEVfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01heCgpIHsKKwkJcmV0dXJuIERFRkFVTFRfV1JJVEVfQ09OTkVDVElPTlNfTUFYOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyY2Q5YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uLmphdmEKQEAgLTAsMCArMSw3NDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLlByb2ZpbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5XZWF2aW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKKworLyoqCisgKiAgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24gZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKKwlpbXBsZW1lbnRzIEN1c3RvbWl6YXRpb24KK3sKKwkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgorCXByaXZhdGUgQm9vbGVhbiB0aHJvd0V4Y2VwdGlvbnM7CisJcHJpdmF0ZSBXZWF2aW5nIHdlYXZpbmc7CisJcHJpdmF0ZSBCb29sZWFuIHdlYXZpbmdMYXp5OworCXByaXZhdGUgQm9vbGVhbiB3ZWF2aW5nQ2hhbmdlVHJhY2tpbmc7CisJcHJpdmF0ZSBCb29sZWFuIHdlYXZpbmdGZXRjaEdyb3VwczsKKwlwcml2YXRlIEJvb2xlYW4gd2VhdmluZ0ludGVybmFsOworCXByaXZhdGUgQm9vbGVhbiB3ZWF2aW5nRWFnZXI7CisJcHJpdmF0ZSBCb29sZWFuIHZhbGlkYXRpb25Pbmx5OworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHNlc3Npb25DdXN0b21pemVyczsKKwlwcml2YXRlIFN0cmluZyBwcm9maWxlcjsgLy8gc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlIHNpbmNlIHZhbHVlIGNhbiBiZSBQcm9maWxlciBvciBjdXN0b20gY2xhc3MKKwlwcml2YXRlIFN0cmluZyBleGNlcHRpb25IYW5kbGVyOworCisJcHJpdmF0ZSBMaXN0PEVudGl0eT4gZW50aXRpZXM7CisJCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgorCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24oUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKworCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCS8qKgorCSAqIEluaXRpYWxpemVzIHByb3BlcnRpZXMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpIHsKKwkJLy8gVE9SRVZJRVcgLSBoYW5kbGUgaW5jb3JyZWN0IFN0cmluZyBpbiBwZXJzaXN0ZW5jZS54bWwKKwkJdGhpcy5lbnRpdGllcyA9IG5ldyBBcnJheUxpc3Q8RW50aXR5PigpOworCisJCXRoaXMudGhyb3dFeGNlcHRpb25zID0gCisJCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TKTsKKwkJdGhpcy53ZWF2aW5nID0gCisJCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19XRUFWSU5HLCBXZWF2aW5nLnZhbHVlcygpKTsKKwkJdGhpcy53ZWF2aW5nTGF6eSA9IAorCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfV0VBVklOR19MQVpZKTsKKwkJdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmcgPSAKKwkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HKTsKKwkJdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHMgPSAKKwkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1dFQVZJTkdfRkVUQ0hfR1JPVVBTKTsKKwkJdGhpcy53ZWF2aW5nSW50ZXJuYWwgPSAKKwkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1dFQVZJTkdfSU5URVJOQUwpOworCQl0aGlzLndlYXZpbmdFYWdlciA9IAorCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfV0VBVklOR19FQUdFUik7CisJCXRoaXMudmFsaWRhdGlvbk9ubHkgPSAKKwkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1ZBTElEQVRJT05fT05MWSk7CisJCXRoaXMuaW5pdGlhbGl6ZVNlc3Npb25DdXN0b21pemVyc0Zyb21QZXJzaXN0ZW5jZVVuaXQoKTsKKworCQlTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBwcm9wZXJ0aWVzID0gCisJCQl0aGlzLmdldFByb3BlcnRpZXNTZXRXaXRoUHJlZml4KEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUik7CisJCXRoaXMuaW5pdGlhbGl6ZUVudGl0aWVzQ3VzdG9taXplckNsYXNzKHByb3BlcnRpZXMpOworCQkKKwkJdGhpcy5wcm9maWxlciA9IHRoaXMuZ2V0UHJvZmlsZXJQcm9wZXJ0eVZhbHVlKCk7CisJCXRoaXMuZXhjZXB0aW9uSGFuZGxlciA9IAorCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXNzaW9uQ3VzdG9taXplcnNGcm9tUGVyc2lzdGVuY2VVbml0KCkgeworCQlTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBwcm9wZXJ0aWVzID0gCisJCQl0aGlzLmdldFByb3BlcnRpZXNTZXRXaXRoUHJlZml4KEVDTElQU0VMSU5LX1NFU1NJT05fQ1VTVE9NSVpFUik7CisJCQorCQl0aGlzLnNlc3Npb25DdXN0b21pemVycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihwcm9wZXJ0aWVzLnNpemUoKSk7CisJCXRoaXMuaW5pdGlhbGl6ZVNlc3Npb25DdXN0b21pemVyc1dpdGgocHJvcGVydGllcyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXNzaW9uQ3VzdG9taXplcnNXaXRoKFNldDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IHByb3BlcnRpZXMpIHsKKwkJZm9yIChQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgOiBwcm9wZXJ0aWVzKSB7CisJCQl0aGlzLnNlc3Npb25DdXN0b21pemVycy5hZGQocHJvcGVydHkuZ2V0VmFsdWUoKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVudGl0aWVzQ3VzdG9taXplckNsYXNzKFNldDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IGRlc2NyaXB0b3JDdXN0b21pemVyUHJvcGVydGllcykgeworCQlmb3IgKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBkZXNjcmlwdG9yQ3VzdG9taXplclByb3BlcnR5IDogZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0aWVzKSB7CisJCQl0aGlzLnNldEVudGl0eURlc2NyaXB0b3JDdXN0b21pemVyT2YoZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0eSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBHZXRzIHRoZSBQcm9maWxlciBwcm9wZXJ0eSBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqLworCXByaXZhdGUgU3RyaW5nIGdldFByb2ZpbGVyUHJvcGVydHlWYWx1ZSgpIHsKKworCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1BST0ZJTEVSKTsKKwkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOwkvLyBubyBwcm9wZXJ0eSBmb3VuZAorCQl9CisJCVByb2ZpbGVyIHN0YW5kYXJkUHJvZmlsZXIgPSB0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19QUk9GSUxFUiwgUHJvZmlsZXIudmFsdWVzKCkpOworCQlyZXR1cm4gKHN0YW5kYXJkUHJvZmlsZXIgPT0gbnVsbCkgPyB2YWx1ZSA6IGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihzdGFuZGFyZFByb2ZpbGVyKTsKKwl9CisKKwkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKKwkKKwlwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3VmFsdWUpIHsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUykpIHsKKwkJCXRoaXMudGhyb3dFeGNlcHRpb25zQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HKSkgeworCQkJdGhpcy53ZWF2aW5nQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0xBWlkpKSB7CisJCQl0aGlzLndlYXZpbmdMYXp5Q2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0NIQU5HRV9UUkFDS0lORykpIHsKKwkJCXRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUykpIHsKKwkJCXRoaXMud2VhdmluZ0ZldGNoR3JvdXBzQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0lOVEVSTkFMKSkgeworCQkJdGhpcy53ZWF2aW5nSW50ZXJuYWxDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfRUFHRVIpKSB7CisJCQl0aGlzLndlYXZpbmdFYWdlckNoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVkFMSURBVElPTl9PTkxZKSkgeworCQkJdGhpcy52YWxpZGF0aW9uT25seUNoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSKSkgeworCQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplcnNDaGFuZ2VkKCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSKSkgeworCQkJdGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplckNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19QUk9GSUxFUikpIHsKKwkJCXRoaXMucHJvZmlsZXJDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0VYQ0VQVElPTl9IQU5ETEVSKSkgeworCQkJdGhpcy5leGNlcHRpb25IYW5kbGVyQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwl9CisJCQorCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlMpKSB7CisJCQl0aGlzLnRocm93RXhjZXB0aW9uc0NoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HKSkgeworCQkJdGhpcy53ZWF2aW5nQ2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfTEFaWSkpIHsKKwkJCXRoaXMud2VhdmluZ0xhenlDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkcpKSB7CisJCQl0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZ0NoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUykpIHsKKwkJCXRoaXMud2VhdmluZ0ZldGNoR3JvdXBzQ2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfSU5URVJOQUwpKSB7CisJCQl0aGlzLndlYXZpbmdJbnRlcm5hbENoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0VBR0VSKSkgeworCQkJdGhpcy53ZWF2aW5nRWFnZXJDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVkFMSURBVElPTl9PTkxZKSkgeworCQkJdGhpcy52YWxpZGF0aW9uT25seUNoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OX0NVU1RPTUlaRVIpKSB7CisJCQl0aGlzLnNlc3Npb25DdXN0b21pemVyc0NoYW5nZWQoKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVIpKSB7CisJCQl0aGlzLmRlc2NyaXB0b3JDdXN0b21pemVyQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfUFJPRklMRVIpKSB7CisJCQl0aGlzLnByb2ZpbGVyQ2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0VYQ0VQVElPTl9IQU5ETEVSKSkgeworCQkJdGhpcy5leGNlcHRpb25IYW5kbGVyQ2hhbmdlZChudWxsKTsKKwkJfQorCQkKKwl9CisKKwkvKioKKwkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAorCSAqIAkJa2V5ID0gRWNsaXBzZUxpbmsgcHJvcGVydHkga2V5CisJICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TLAorCQkJVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfV0VBVklORywKKwkJCVdFQVZJTkdfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCUVDTElQU0VMSU5LX1dFQVZJTkdfTEFaWSwKKwkJCVdFQVZJTkdfTEFaWV9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkcsCisJCQlXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfV0VBVklOR19GRVRDSF9HUk9VUFMsCisJCQlXRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfV0VBVklOR19JTlRFUk5BTCwKKwkJCVdFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCUVDTElQU0VMSU5LX1dFQVZJTkdfRUFHRVIsCisJCQlXRUFWSU5HX0VBR0VSX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19WQUxJREFUSU9OX09OTFksCisJCQlWQUxJREFUSU9OX09OTFlfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCUVDTElQU0VMSU5LX1NFU1NJT05fQ1VTVE9NSVpFUiwKKwkJCVNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfUFJPRklMRVIsCisJCQlQUk9GSUxFUl9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVIsCisJCQlFWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSk7CisKKwkJLy8gRG9uJ3QgbmVlZCB0byBpbml0aWFsaXplIHByb3BlcnR5TmFtZXMgZm9yOiAKKwkJLy8gZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0eQorCX0KKworCS8qKgorCSAqIE1ldGhvZCB1c2VkIGZvciBpZGVudGlmeWluZyB0aGUgZ2l2ZW4gcHJvcGVydHkuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXRlbUlzUHJvcGVydHkoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGl0ZW0pIHsKKwkJYm9vbGVhbiBpc1Byb3BlcnR5ID0gc3VwZXIuaXRlbUlzUHJvcGVydHkoaXRlbSk7CisJCQorCQlpZiAoICEgaXNQcm9wZXJ0eSAmJiBpdGVtLmdldE5hbWUoKSAhPSBudWxsKSB7CisJCQkJaWYgKGl0ZW0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSKSkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCX0KKwkJcmV0dXJuIGlzUHJvcGVydHk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZSB1c2VkIGZvciBjaGFuZ2Ugbm90aWZpY2F0aW9uIG9mIHRoZSBnaXZlbgorCSAqIHByb3BlcnR5LgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgcHJvcGVydHlJZE9mKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSkgeworCQl0cnkgeworCQkJcmV0dXJuIHN1cGVyLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7CisJCX0KKwkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQlpZiAocHJvcGVydHkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSKSkgeworCQkJCXJldHVybiBERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFk7CisJCQl9CisJCX0KKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBwcm9wZXJ0eTogIiArIHByb3BlcnR5KTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlwdWJsaWMgRW50aXR5IGFkZEVudGl0eShTdHJpbmcgZW50aXR5TmFtZSkgeworCQlpZiAodGhpcy5lbnRpdHlFeGlzdHMoZW50aXR5TmFtZSkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVudGl0eSAiICsgZW50aXR5TmFtZSArICIgYWxyZWFkeSBleGlzdHMuIik7CisJCX0KKwkJRW50aXR5IG5ld0VudGl0eSA9IHRoaXMuYnVpbGRFbnRpdHkoZW50aXR5TmFtZSk7CisJCXRoaXMuZW50aXRpZXMuYWRkKG5ld0VudGl0eSk7CisJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEVOVElUSUVTX0xJU1QsIHRoaXMuZW50aXRpZXMpOworCQlyZXR1cm4gbmV3RW50aXR5OworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUVudGl0eShTdHJpbmcgZW50aXR5TmFtZSkgeworCQlpZiAoICEgdGhpcy5lbnRpdHlFeGlzdHMoZW50aXR5TmFtZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlFbnRpdHkgZW50aXR5ID0gdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKTsKKwkJdGhpcy5jbGVhckVudGl0eShlbnRpdHkpOworCQl0aGlzLnJlbW92ZUVudGl0eShlbnRpdHkpOworCX0KKworCQorCS8vICoqKioqKioqKiogVGhyb3dFeGNlcHRpb25zICoqKioqKioqKioKKwlwdWJsaWMgQm9vbGVhbiBnZXRUaHJvd0V4Y2VwdGlvbnMoKSB7CisJCXJldHVybiB0aGlzLnRocm93RXhjZXB0aW9uczsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0VGhyb3dFeGNlcHRpb25zKEJvb2xlYW4gbmV3VGhyb3dFeGNlcHRpb25zKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy50aHJvd0V4Y2VwdGlvbnM7CisJCXRoaXMudGhyb3dFeGNlcHRpb25zID0gbmV3VGhyb3dFeGNlcHRpb25zOworCQl0aGlzLnB1dFByb3BlcnR5KFRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFksIG5ld1Rocm93RXhjZXB0aW9ucyk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUSFJPV19FWENFUFRJT05TX1BST1BFUlRZLCBvbGQsIG5ld1Rocm93RXhjZXB0aW9ucyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRocm93RXhjZXB0aW9uc0NoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7CisJCQorCQlCb29sZWFuIG9sZCA9IHRoaXMudGhyb3dFeGNlcHRpb25zOworCQl0aGlzLnRocm93RXhjZXB0aW9ucyA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCQorCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRUaHJvd0V4Y2VwdGlvbnMoKSB7CisJCXJldHVybiBERUZBVUxUX1RIUk9XX0VYQ0VQVElPTlM7CisJfQorCisJLy8gKioqKioqKioqKiBXZWF2aW5nTGF6eSAqKioqKioqKioqCisJcHVibGljIEJvb2xlYW4gZ2V0V2VhdmluZ0xhenkoKSB7CisJCXJldHVybiB0aGlzLndlYXZpbmdMYXp5OworCX0KKworCXB1YmxpYyB2b2lkIHNldFdlYXZpbmdMYXp5KEJvb2xlYW4gbmV3V2VhdmluZ0xhenkpIHsKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdMYXp5OworCQl0aGlzLndlYXZpbmdMYXp5ID0gbmV3V2VhdmluZ0xhenk7CisJCXRoaXMucHV0UHJvcGVydHkoV0VBVklOR19MQVpZX1BST1BFUlRZLCBuZXdXZWF2aW5nTGF6eSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX0xBWllfUFJPUEVSVFksIG9sZCwgbmV3V2VhdmluZ0xhenkpOworCX0KKworCXByaXZhdGUgdm9pZCB3ZWF2aW5nTGF6eUNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7CisJCQorCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0xhenk7CisJCXRoaXMud2VhdmluZ0xhenkgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfTEFaWV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdMYXp5KCkgeworCQlyZXR1cm4gREVGQVVMVF9XRUFWSU5HX0xBWlk7CisJfQorCisJLy8gKioqKioqKioqKiBXZWF2aW5nQ2hhbmdlVHJhY2tpbmcgKioqKioqKioqKgorCXB1YmxpYyBCb29sZWFuIGdldFdlYXZpbmdDaGFuZ2VUcmFja2luZygpIHsKKwkJcmV0dXJuIHRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nOworCX0KKworCXB1YmxpYyB2b2lkIHNldFdlYXZpbmdDaGFuZ2VUcmFja2luZyhCb29sZWFuIG5ld1dlYXZpbmdDaGFuZ2VUcmFja2luZykgeworCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nOworCQl0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZyA9IG5ld1dlYXZpbmdDaGFuZ2VUcmFja2luZzsKKwkJdGhpcy5wdXRQcm9wZXJ0eShXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSwgbmV3V2VhdmluZ0NoYW5nZVRyYWNraW5nKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZLCBvbGQsIG5ld1dlYXZpbmdDaGFuZ2VUcmFja2luZyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdlYXZpbmdDaGFuZ2VUcmFja2luZ0NoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7CisJCQorCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nOworCQl0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZyA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKSB7CisJCXJldHVybiBERUZBVUxUX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HOworCX0KKworCS8vICoqKioqKioqKiogV2VhdmluZ0ZldGNoR3JvdXBzICoqKioqKioqKioKKwlwdWJsaWMgQm9vbGVhbiBnZXRXZWF2aW5nRmV0Y2hHcm91cHMoKSB7CisJCXJldHVybiB0aGlzLndlYXZpbmdGZXRjaEdyb3VwczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRXZWF2aW5nRmV0Y2hHcm91cHMoQm9vbGVhbiBuZXdXZWF2aW5nRmV0Y2hHcm91cHMpIHsKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdGZXRjaEdyb3VwczsKKwkJdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHMgPSBuZXdXZWF2aW5nRmV0Y2hHcm91cHM7CisJCXRoaXMucHV0UHJvcGVydHkoV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFksIG5ld1dlYXZpbmdGZXRjaEdyb3Vwcyk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSwgb2xkLCBuZXdXZWF2aW5nRmV0Y2hHcm91cHMpOworCX0KKworCXByaXZhdGUgdm9pZCB3ZWF2aW5nRmV0Y2hHcm91cHNDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOworCQkKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdGZXRjaEdyb3VwczsKKwkJdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHMgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0ZldGNoR3JvdXBzKCkgeworCQlyZXR1cm4gREVGQVVMVF9XRUFWSU5HX0ZFVENIX0dST1VQUzsKKwl9CisKKwkvLyAqKioqKioqKioqIFdlYXZpbmdJbnRlcm5hbCAqKioqKioqKioqCisJcHVibGljIEJvb2xlYW4gZ2V0V2VhdmluZ0ludGVybmFsKCkgeworCQlyZXR1cm4gdGhpcy53ZWF2aW5nSW50ZXJuYWw7CisJfQorCisJcHVibGljIHZvaWQgc2V0V2VhdmluZ0ludGVybmFsKEJvb2xlYW4gbmV3V2VhdmluZ0ludGVybmFsKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nSW50ZXJuYWw7CisJCXRoaXMud2VhdmluZ0ludGVybmFsID0gbmV3V2VhdmluZ0ludGVybmFsOworCQl0aGlzLnB1dFByb3BlcnR5KFdFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFksIG5ld1dlYXZpbmdJbnRlcm5hbCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX0lOVEVSTkFMX1BST1BFUlRZLCBvbGQsIG5ld1dlYXZpbmdJbnRlcm5hbCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdlYXZpbmdJbnRlcm5hbENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7CisJCQorCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0ludGVybmFsOworCQl0aGlzLndlYXZpbmdJbnRlcm5hbCA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdJbnRlcm5hbCgpIHsKKwkJcmV0dXJuIERFRkFVTFRfV0VBVklOR19JTlRFUk5BTDsKKwl9CisKKwkvLyAqKioqKioqKioqIFdlYXZpbmdFYWdlciAqKioqKioqKioqCisJcHVibGljIEJvb2xlYW4gZ2V0V2VhdmluZ0VhZ2VyKCkgeworCQlyZXR1cm4gdGhpcy53ZWF2aW5nRWFnZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0V2VhdmluZ0VhZ2VyKEJvb2xlYW4gbmV3V2VhdmluZ0VhZ2VyKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nRWFnZXI7CisJCXRoaXMud2VhdmluZ0VhZ2VyID0gbmV3V2VhdmluZ0VhZ2VyOworCQl0aGlzLnB1dFByb3BlcnR5KFdFQVZJTkdfRUFHRVJfUFJPUEVSVFksIG5ld1dlYXZpbmdFYWdlcik7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX0VBR0VSX1BST1BFUlRZLCBvbGQsIG5ld1dlYXZpbmdFYWdlcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdlYXZpbmdFYWdlckNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7CisJCQorCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0VhZ2VyOworCQl0aGlzLndlYXZpbmdFYWdlciA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19FQUdFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdFYWdlcigpIHsKKwkJcmV0dXJuIERFRkFVTFRfV0VBVklOR19FQUdFUjsKKwl9CisKKwkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Pbmx5ICoqKioqKioqKioKKwlwdWJsaWMgQm9vbGVhbiBnZXRWYWxpZGF0aW9uT25seSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsaWRhdGlvbk9ubHk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbk9ubHkoQm9vbGVhbiBuZXdWYWxpZGF0aW9uT25seSkgeworCQlCb29sZWFuIG9sZCA9IHRoaXMudmFsaWRhdGlvbk9ubHk7CisJCXRoaXMudmFsaWRhdGlvbk9ubHkgPSBuZXdWYWxpZGF0aW9uT25seTsKKwkJdGhpcy5wdXRQcm9wZXJ0eShWQUxJREFUSU9OX09OTFlfUFJPUEVSVFksIG5ld1ZhbGlkYXRpb25Pbmx5KTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTElEQVRJT05fT05MWV9QUk9QRVJUWSwgb2xkLCBuZXdWYWxpZGF0aW9uT25seSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRpb25Pbmx5Q2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKKwkJCisJCUJvb2xlYW4gb2xkID0gdGhpcy52YWxpZGF0aW9uT25seTsKKwkJdGhpcy52YWxpZGF0aW9uT25seSA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMSURBVElPTl9PTkxZX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VmFsaWRhdGlvbk9ubHkoKSB7CisJCXJldHVybiBERUZBVUxUX1ZBTElEQVRJT05fT05MWTsKKwl9CisKKwkvLyAqKioqKioqKioqIFNlc3Npb25DdXN0b21pemVycyAqKioqKioqKioqCisJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHNlc3Npb25DdXN0b21pemVycygpeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5zZXNzaW9uQ3VzdG9taXplcnMpOworCX0KKwkKKwlwdWJsaWMgaW50IHNlc3Npb25DdXN0b21pemVyc1NpemUoKXsKKwkJcmV0dXJuIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBzZXNzaW9uQ3VzdG9taXplckV4aXN0cyhTdHJpbmcgc2Vzc2lvbkN1c3RvbWl6ZXJDbGFzc05hbWUpIHsKKworCQlmb3IgKFN0cmluZyBzZXNzaW9uQ3VzdG9taXplciA6IHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzKSB7CisJCQlpZihzZXNzaW9uQ3VzdG9taXplci5lcXVhbHMoc2Vzc2lvbkN1c3RvbWl6ZXJDbGFzc05hbWUpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBTdHJpbmcgYWRkU2Vzc2lvbkN1c3RvbWl6ZXIoU3RyaW5nIG5ld1Nlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lKXsKKworCQlpZiggISB0aGlzLnNlc3Npb25DdXN0b21pemVyRXhpc3RzKG5ld1Nlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lKSkgeworCQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplcnMuYWRkKG5ld1Nlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lKTsKKwkJCXRoaXMucHV0UHJvcGVydHkoU0VTU0lPTl9DVVNUT01JWkVSX1BST1BFUlRZLCBuZXdTZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZSwgdHJ1ZSk7CisJCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChTRVNTSU9OX0NVU1RPTUlaRVJfTElTVCwgdGhpcy5zZXNzaW9uQ3VzdG9taXplcnMpOworCQkJcmV0dXJuIG5ld1Nlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVTZXNzaW9uQ3VzdG9taXplcihTdHJpbmcgY2xhc3NOYW1lKXsKKworCQlpZih0aGlzLnJlbW92ZVNlc3Npb25DdXN0b21pemVyXyhjbGFzc05hbWUpICE9IG51bGwpIHsKKwkJCXRoaXMucmVtb3ZlUHJvcGVydHkoU0VTU0lPTl9DVVNUT01JWkVSX1BST1BFUlRZLCBjbGFzc05hbWUpOworCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoU0VTU0lPTl9DVVNUT01JWkVSX0xJU1QsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIFN0cmluZyByZW1vdmVTZXNzaW9uQ3VzdG9taXplcl8oU3RyaW5nIGNsYXNzTmFtZSl7CisKKwkJZm9yICggTGlzdEl0ZXJhdG9yPFN0cmluZz4gaSA9IHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzKCk7IGkuaGFzTmV4dCgpOykgeworCQkJU3RyaW5nIHNlc3Npb25DdXN0b21pemVyID0gaS5uZXh0KCk7CisJCQlpZihzZXNzaW9uQ3VzdG9taXplci5lcXVhbHMoY2xhc3NOYW1lKSkgeworCQkJCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzLnJlbW92ZShzZXNzaW9uQ3VzdG9taXplcik7CisJCQkJcmV0dXJuIHNlc3Npb25DdXN0b21pemVyOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgdm9pZCBzZXNzaW9uQ3VzdG9taXplcnNDaGFuZ2VkKCkgeworCisJCXRoaXMuaW5pdGlhbGl6ZVNlc3Npb25DdXN0b21pemVyc0Zyb21QZXJzaXN0ZW5jZVVuaXQoKTsKKwkJdGhpcy5maXJlTGlzdENoYW5nZWQoU0VTU0lPTl9DVVNUT01JWkVSX0xJU1QsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFdlYXZpbmcgKioqKioqKioqKgorCQorCXB1YmxpYyBXZWF2aW5nIGdldFdlYXZpbmcoKSB7CisJCXJldHVybiB0aGlzLndlYXZpbmc7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFdlYXZpbmcoV2VhdmluZyBuZXdXZWF2aW5nKSB7CisJCVdlYXZpbmcgb2xkID0gdGhpcy53ZWF2aW5nOworCQl0aGlzLndlYXZpbmcgPSBuZXdXZWF2aW5nOworCQl0aGlzLnB1dFByb3BlcnR5KFdFQVZJTkdfUFJPUEVSVFksIG5ld1dlYXZpbmcpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19QUk9QRVJUWSwgb2xkLCBuZXdXZWF2aW5nKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgd2VhdmluZ0NoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCVdlYXZpbmcgbmV3VmFsdWUgPSBnZXRFbnVtVmFsdWVPZihzdHJpbmdWYWx1ZSwgV2VhdmluZy52YWx1ZXMoKSk7CisJCVdlYXZpbmcgb2xkID0gdGhpcy53ZWF2aW5nOworCQl0aGlzLndlYXZpbmcgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKwkKKwlwdWJsaWMgV2VhdmluZyBnZXREZWZhdWx0V2VhdmluZygpIHsKKwkJcmV0dXJuIERFRkFVTFRfV0VBVklORzsKKwl9CisKKwkvLyAqKioqKioqKioqIEV4Y2VwdGlvbkhhbmRsZXIgKioqKioqKioqKgorCXB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uSGFuZGxlcigpIHsKKwkJcmV0dXJuIHRoaXMuZXhjZXB0aW9uSGFuZGxlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb25IYW5kbGVyKFN0cmluZyBuZXdFeGNlcHRpb25IYW5kbGVyKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmV4Y2VwdGlvbkhhbmRsZXI7CisJCXRoaXMuZXhjZXB0aW9uSGFuZGxlciA9IG5ld0V4Y2VwdGlvbkhhbmRsZXI7CisJCXRoaXMucHV0UHJvcGVydHkoRVhDRVBUSU9OX0hBTkRMRVJfUFJPUEVSVFksIG5ld0V4Y2VwdGlvbkhhbmRsZXIpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhDRVBUSU9OX0hBTkRMRVJfUFJPUEVSVFksIG9sZCwgbmV3RXhjZXB0aW9uSGFuZGxlcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGV4Y2VwdGlvbkhhbmRsZXJDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5leGNlcHRpb25IYW5kbGVyOworCQl0aGlzLmV4Y2VwdGlvbkhhbmRsZXIgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYQ0VQVElPTl9IQU5ETEVSX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRFeGNlcHRpb25IYW5kbGVyKCkgeworCQlyZXR1cm4gREVGQVVMVF9FWENFUFRJT05fSEFORExFUjsKKwl9CisKKwkvLyAqKioqKioqKioqIERlc2NyaXB0b3JDdXN0b21pemVyICoqKioqKioqKioKKwkKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0b3JDdXN0b21pemVyT2YoU3RyaW5nIGVudGl0eU5hbWUpIHsKKwkJRW50aXR5IGVudGl0eSA9IHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSk7CisJCXJldHVybiAoZW50aXR5ID09IG51bGwpID8gbnVsbCA6IGVudGl0eS5nZXREZXNjcmlwdG9yQ3VzdG9taXplcigpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgbmV3RGVzY3JpcHRvckN1c3RvbWl6ZXIpIHsKKwkJRW50aXR5IG9sZCA9IHRoaXMuc2V0RW50aXR5RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHlOYW1lLCBuZXdEZXNjcmlwdG9yQ3VzdG9taXplcik7CisJCXRoaXMucHV0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSLCBlbnRpdHlOYW1lLCBuZXdEZXNjcmlwdG9yQ3VzdG9taXplciwgZmFsc2UpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZLCBvbGQsIHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSkpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZGVzY3JpcHRvckN1c3RvbWl6ZXJDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZXh0cmFjdEVudGl0eU5hbWVPZihwcm9wZXJ0eU5hbWUpOworCQlFbnRpdHkgb2xkID0gdGhpcy5zZXRFbnRpdHlEZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eU5hbWUsIHN0cmluZ1ZhbHVlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0RGVzY3JpcHRvckN1c3RvbWl6ZXIoKSB7CisJCXJldHVybiBERUZBVUxUX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvbGQgRW50aXR5CisJICovCisJcHJpdmF0ZSBFbnRpdHkgc2V0RW50aXR5RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihTdHJpbmcgZW50aXR5TmFtZSwgU3RyaW5nIGRlc2NyaXB0b3JDdXN0b21pemVyQ2xhc3NOYW1lKSB7CisJCUVudGl0eSBlbnRpdHkgPSAodGhpcy5lbnRpdHlFeGlzdHMoZW50aXR5TmFtZSkpID8KKwkJCQkJCXRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSkgOgorCQkJCQkJdGhpcy5hZGRFbnRpdHkoZW50aXR5TmFtZSk7CisJCXJldHVybiB0aGlzLnNldEVudGl0eURlc2NyaXB0b3JDdXN0b21pemVyT2YoZW50aXR5LCBkZXNjcmlwdG9yQ3VzdG9taXplckNsYXNzTmFtZSk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKKwkgKi8KKwlwcml2YXRlIEVudGl0eSBzZXRFbnRpdHlEZXNjcmlwdG9yQ3VzdG9taXplck9mKEVudGl0eSBlbnRpdHksIFN0cmluZyBkZXNjcmlwdG9yQ3VzdG9taXplckNsYXNzTmFtZSkgeworCQlpZihlbnRpdHkgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCUVudGl0eSBvbGQgPSBlbnRpdHkuY2xvbmUoKTsKKwkJZW50aXR5LnNldERlc2NyaXB0b3JDdXN0b21pemVyKGRlc2NyaXB0b3JDdXN0b21pemVyQ2xhc3NOYW1lKTsKKwkJcmV0dXJuIG9sZDsKKwl9CisJCisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHVwZGF0ZSB0aGUgZGVzY3JpcHRvckN1c3RvbWl6ZXJDbGFzc05hbWUgaW4gZW50aXRpZXMuCisJICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQorCSAqLworCXByaXZhdGUgRW50aXR5IHNldEVudGl0eURlc2NyaXB0b3JDdXN0b21pemVyT2YoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGRlc2NyaXB0b3JDdXN0b21pemVyUHJvcGVydHkpIHsKKwkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmV4dHJhY3RFbnRpdHlOYW1lT2YoZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0eSk7CisJCXJldHVybiB0aGlzLnNldEVudGl0eURlc2NyaXB0b3JDdXN0b21pemVyT2YoZW50aXR5TmFtZSwgZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFByb2ZpbGVyICoqKioqKioqKioKKwkvKioKKwkgKiBSZXR1cm5zIFByb2ZpbGVyIG9yIGN1c3RvbSBwcm9maWxlciBjbGFzcy4KKwkgKiAKKwkgKiBAcmV0dXJuIEVjbGlwc2VMaW5rIHN0cmluZyB2YWx1ZSBmb3IgUHJvZmlsZXIgZW51bSBvciBjdXN0b20gcHJvZmlsZXIgY2xhc3MKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVyKCkgeworCQlyZXR1cm4gdGhpcy5wcm9maWxlcjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIEVjbGlwc2VMaW5rIHByb2ZpbGVyLgorCSAqIAorCSAqIEBwYXJhbSBuZXdQcm9maWxlciAtIFByb2ZpbGVyCisJICovCisJcHVibGljIHZvaWQgc2V0UHJvZmlsZXIoUHJvZmlsZXIgbmV3UHJvZmlsZXIpIHsKKwkJaWYoIG5ld1Byb2ZpbGVyID09IG51bGwpIHsKKwkJCXRoaXMuc2V0UHJvZmlsZXJfKChTdHJpbmcpIG51bGwpOworCQkJcmV0dXJuOworCQl9CisJCXRoaXMuc2V0UHJvZmlsZXJfKGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihuZXdQcm9maWxlcikpOworCX0KKworCS8qKgorCSAqIFNldHMgRWNsaXBzZUxpbmsgcHJvZmlsZXIgb3IgY3VzdG9tIHByb2ZpbGVyLgorCSAqIAorCSAqIEBwYXJhbSBuZXdQcm9maWxlciAtCisJICogICAgICAgICAgICBDYW4gYmUgYSBFY2xpcHNlTGluayBwcm9maWxlciBsaXRlcmFsIG9yCisJICogICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY3VzdG9tIHByb2ZpbGVyLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFByb2ZpbGVyKFN0cmluZyBuZXdQcm9maWxlcikgeworCQlpZiggbmV3UHJvZmlsZXIgPT0gbnVsbCkgeworCQkJdGhpcy5zZXRQcm9maWxlcl8oKFN0cmluZykgbnVsbCk7CisJCQlyZXR1cm47CisJCX0KKwkJUHJvZmlsZXIgcCA9IFByb2ZpbGVyLmdldFByb2ZpbGVyRm9yKG5ld1Byb2ZpbGVyKTsKKwkJaWYocCA9PSBudWxsKSB7CS8vIGN1c3RvbSBwcm9maWxlciBjbGFzcworCQkJdGhpcy5zZXRQcm9maWxlcl8obmV3UHJvZmlsZXIpOworCQl9CisJCWVsc2UgeworCQkJdGhpcy5zZXRQcm9maWxlcihwKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgc2V0UHJvZmlsZXJfKFN0cmluZyBuZXdQcm9maWxlcikgeworCQlTdHJpbmcgb2xkID0gdGhpcy5wcm9maWxlcjsKKwkJdGhpcy5wcm9maWxlciA9IG5ld1Byb2ZpbGVyOworCQl0aGlzLnB1dFByb3BlcnR5KFBST0ZJTEVSX1BST1BFUlRZLCBuZXdQcm9maWxlcik7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9GSUxFUl9QUk9QRVJUWSwgb2xkLCBuZXdQcm9maWxlcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHByb2ZpbGVyQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMucHJvZmlsZXI7CisJCXRoaXMucHJvZmlsZXIgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST0ZJTEVSX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQcm9maWxlcigpIHsKKwkJcmV0dXJuIERFRkFVTFRfUFJPRklMRVI7CisJfQorCisKKwkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCisKKwkvKioKKwkgKiBTZXQgYWxsIEVudGl0eSBwcm9wZXJ0aWVzIHRvIGRlZmF1bHQuCisJICovCisJcHJpdmF0ZSB2b2lkIGNsZWFyRW50aXR5KEVudGl0eSBlbnRpdHkpIHsKKwkJaWYoZW50aXR5LmlzRW1wdHkoKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBlbnRpdHlOYW1lID0gZW50aXR5LmdldE5hbWUoKTsKKwkJdGhpcy5zZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eU5hbWUsIG51bGwpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIEVudGl0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCSAqLworCXByaXZhdGUgRW50aXR5IGdldEVudGl0eU5hbWVkKFN0cmluZyBuYW1lKSB7CisJCWZvcihFbnRpdHkgZW50aXR5OiB0aGlzLmVudGl0aWVzKSB7CisJCQlpZihlbnRpdHkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiBlbnRpdHk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBFbnRpdHkgYnVpbGRFbnRpdHkoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIG5ldyBFbnRpdHkodGhpcywgbmFtZSk7CisJfQorCQorCXByaXZhdGUgdm9pZCByZW1vdmVFbnRpdHkoRW50aXR5IGVudGl0eSkgeworCQlpZihlbnRpdHkgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMuZW50aXRpZXMucmVtb3ZlKGVudGl0eSk7CisJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEVOVElUSUVTX0xJU1QsIHRoaXMuZW50aXRpZXMpOworCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBFbnRpdHkgZXhpc3QuCisJICovCisJcHVibGljIGJvb2xlYW4gZW50aXR5RXhpc3RzKFN0cmluZyBuYW1lKSB7CisJCWZvcihFbnRpdHkgZW50aXR5OiB0aGlzLmVudGl0aWVzKSB7CisJCQlpZihlbnRpdHkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvLyAqKioqKiogZW50aXRpZXMgbGlzdCAqKioqKioqCisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEVudGl0eT4gZW50aXRpZXMoKSB7CisJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8RW50aXR5Pih0aGlzLmVudGl0aWVzKTsKKwl9CisKKwlwdWJsaWMgaW50IGVudGl0aWVzU2l6ZSgpIHsKKwkJcmV0dXJuIHRoaXMuZW50aXRpZXMuc2l6ZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZjg5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VudGl0eS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOworCisvKioKKyAqICBFbnRpdHkKKyAqLworcHVibGljIGNsYXNzIEVudGl0eSBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQoreworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBDdXN0b21pemF0aW9uIHBhcmVudDsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSA9IEN1c3RvbWl6YXRpb24uREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZOyAvLyROT04tTkxTLTEkCisKKwkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgorCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0b3JDdXN0b21pemVyOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCisJcHVibGljIEVudGl0eShDdXN0b21pemF0aW9uIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKKwkJdGhpcyhwYXJlbnQpOworCQl0aGlzLmluaXRpYWxpemUobmFtZSk7CisJfQorCisJcHJpdmF0ZSBFbnRpdHkoQ3VzdG9taXphdGlvbiBwYXJlbnQpIHsKKwkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJfQorCQorCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKFN0cmluZyBuYW1lKSB7CisJCWlmKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkobmFtZSkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQl0aGlzLm5hbWUgPSBuYW1lOworCX0KKworCS8vICoqKioqKioqKiogYmVoYXZpb3JzICoqKioqKioqKioKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJaWYobyA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJRW50aXR5IGN1c3RvbWl6ZXIgPSAoRW50aXR5KSBvOworCQlyZXR1cm4gKAorCQkJKHRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIgPT0gbnVsbCA/CisJCQkJY3VzdG9taXplci5kZXNjcmlwdG9yQ3VzdG9taXplciA9PSBudWxsIDogCisJCQkJdGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplci5lcXVhbHMoY3VzdG9taXplci5kZXNjcmlwdG9yQ3VzdG9taXplcikpKTsKKwl9CisJCisJIEBPdmVycmlkZQorCSBwdWJsaWMgRW50aXR5IGNsb25lKCkgeworCQkgdHJ5IHsKKwkJCSByZXR1cm4gKEVudGl0eSlzdXBlci5jbG9uZSgpOworCQkgfQorCQkgY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7CisJCQkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKKwkJIH0KKwkgfQorCisJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKwkJcmV0dXJuIHRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIgPT0gbnVsbDsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gZW50aXR5TmFtZUlzVmFsaWQoKSB7CisJCXJldHVybiAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKTsKKwl9CisKKwlwdWJsaWMgQ3VzdG9taXphdGlvbiBnZXRQYXJlbnQoKSB7CisJCXJldHVybiB0aGlzLnBhcmVudDsKKwl9CisKKwkvLyAqKioqKioqKioqIGdldHRlci9zZXR0ZXIgKioqKioqKioqKgorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0b3JDdXN0b21pemVyKCkgeworCQlyZXR1cm4gdGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplcjsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZXNjcmlwdG9yQ3VzdG9taXplcihTdHJpbmcgZGVzY3JpcHRvckN1c3RvbWl6ZXIpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXI7CisJCXRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIgPSBkZXNjcmlwdG9yQ3VzdG9taXplcjsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSwgb2xkLCBkZXNjcmlwdG9yQ3VzdG9taXplcik7CisJfQorCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQoIm5hbWU6ICIpOworCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKKwkJc2IuYXBwZW5kKCIsIGRlc2NyaXB0b3JDdXN0b21pemVyOiAiKTsKKwkJc2IuYXBwZW5kKHRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0N2IwMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmdlbmVyYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsLkdlbmVyYWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOworCisvKioKKyAqICBFY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCisJaW1wbGVtZW50cyBHZW5lcmFsUHJvcGVydGllcworeworCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCisJcHJpdmF0ZSBCb29sZWFuIGV4Y2x1ZGVFY2xpcHNlbGlua09ybTsKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKKwlwdWJsaWMgRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcyhQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCisJLyoqCisJICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgeworCQkKKwkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm0gPSAKKwkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX0VYQ0xVREVfRUNMSVBTRUxJTktfT1JNKTsKKwl9CisKKworCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgorCQorCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgeworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSkpIHsKKwkJCWV4Y2x1ZGVFY2xpcHNlbGlua09ybUNoYW5nZWQobmV3VmFsdWUpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0VYQ0xVREVfRUNMSVBTRUxJTktfT1JNKSkgeworCQkJZXhjbHVkZUVjbGlwc2VsaW5rT3JtQ2hhbmdlZChudWxsKTsJCQkKKwkJfQorCX0KKwkKKwkKKwkvKioKKwkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAorCSAqIAkJa2V5ID0gRWNsaXBzZUxpbmsgcHJvcGVydHkga2V5CisJICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSwKKwkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKTsKKwl9CisKKwkKKwkvLyAqKioqKioqKioqIEV4Y2x1ZGVFY2xpcHNlbGlua09ybSAqKioqKioqKioqCisJcHVibGljIEJvb2xlYW4gZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCkgeworCQlyZXR1cm4gdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm07CisJfQorCisJcHVibGljIHZvaWQgc2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKEJvb2xlYW4gbmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm07CisJCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtID0gbmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtOworCQl0aGlzLnB1dFByb3BlcnR5KEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZLCBuZXdFeGNsdWRlRWNsaXBzZWxpbmtPcm0pOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fUFJPUEVSVFksIG9sZCwgbmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZXhjbHVkZUVjbGlwc2VsaW5rT3JtQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKKwkJCisJCUJvb2xlYW4gb2xkID0gdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm07CisJCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpIHsKKwkJcmV0dXJuIERFRkFVTFRfRVhDTFVERV9FQ0xJUFNFTElOS19PUk07CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4ZDJkMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nLmphdmEKQEAgLTAsMCArMSwzNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmdMZXZlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKKworLyoqCisgKiAgRWNsaXBzZUxpbmtMb2dnaW5nCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0xvZ2dpbmcgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKKwlpbXBsZW1lbnRzIExvZ2dpbmcKK3sKKwkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgorCXByaXZhdGUgTG9nZ2luZ0xldmVsIGxldmVsOworCXByaXZhdGUgQm9vbGVhbiB0aW1lc3RhbXA7CisJcHJpdmF0ZSBCb29sZWFuIHRocmVhZDsKKwlwcml2YXRlIEJvb2xlYW4gc2Vzc2lvbjsKKwlwcml2YXRlIEJvb2xlYW4gZXhjZXB0aW9uczsKKwlwcml2YXRlIFN0cmluZyBsb2dGaWxlTG9jYXRpb247CisJcHJpdmF0ZSBTdHJpbmcgbG9nZ2VyOyAvLyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUgc2luY2UgdmFsdWUgY2FuIGJlIExvZ2dlciBvciBjdXN0b20gY2xhc3MKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKKwlwdWJsaWMgRWNsaXBzZUxpbmtMb2dnaW5nKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKKwkvKioKKwkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7CisJCS8vIFRPUkVWSUVXIC0gaGFuZGxlIGluY29ycmVjdCBTdHJpbmcgaW4gcGVyc2lzdGVuY2UueG1sCisJCXRoaXMubGV2ZWwgPSAKKwkJCXRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX0xFVkVMLCBMb2dnaW5nTGV2ZWwudmFsdWVzKCkpOworCQl0aGlzLnRpbWVzdGFtcCA9IAorCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfVElNRVNUQU1QKTsKKwkJdGhpcy50aHJlYWQgPSAKKwkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1RIUkVBRCk7CisJCXRoaXMuc2Vzc2lvbiA9IAorCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfU0VTU0lPTik7CisJCXRoaXMuZXhjZXB0aW9ucyA9IAorCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfRVhDRVBUSU9OUyk7CisJCXRoaXMubG9nRmlsZUxvY2F0aW9uID0gCisJCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0xPR19GSUxFX0xPQ0FUSU9OKTsKKwkJCisJCXRoaXMubG9nZ2VyID0gdGhpcy5nZXRMb2dnZXJQcm90ZXJ0eVZhbHVlKCk7CisJfQorCisJLyoqCisJICogR2V0cyB0aGUgTG9nZ2VyIHByb3BlcnR5IGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0TG9nZ2VyUHJvdGVydHlWYWx1ZSgpIHsKKworCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0xPR0dFUik7CisJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsJLy8gbm8gcHJvcGVydHkgZm91bmQKKwkJfQorCQlMb2dnZXIgc3RhbmRhcmRMb2dnZXIgPSB0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19MT0dHRVIsIExvZ2dlci52YWx1ZXMoKSk7CisJCXJldHVybiAoc3RhbmRhcmRMb2dnZXIgPT0gbnVsbCkgPyB2YWx1ZSA6IGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihzdGFuZGFyZExvZ2dlcik7CisJfQorCisJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0xFVkVMKSkgeworCQkJdGhpcy5sZXZlbENoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVElNRVNUQU1QKSkgeworCQkJdGhpcy50aW1lc3RhbXBDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RIUkVBRCkpIHsKKwkJCXRoaXMudGhyZWFkQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OKSkgeworCQkJdGhpcy5zZXNzaW9uQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FWENFUFRJT05TKSkgeworCQkJdGhpcy5leGNlcHRpb25zQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19MT0dfRklMRV9MT0NBVElPTikpIHsKKwkJCXRoaXMubG9nRmlsZUxvY2F0aW9uQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19MT0dHRVIpKSB7CisJCQl0aGlzLmxvZ2dlckNoYW5nZWQobmV3VmFsdWUpOworCQl9CisJfQorCQkKKwlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19MRVZFTCkpIHsKKwkJCXRoaXMubGV2ZWxDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVElNRVNUQU1QKSkgeworCQkJdGhpcy50aW1lc3RhbXBDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVEhSRUFEKSkgeworCQkJdGhpcy50aHJlYWRDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTikpIHsKKwkJCXRoaXMuc2Vzc2lvbkNoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FWENFUFRJT05TKSkgeworCQkJdGhpcy5leGNlcHRpb25zQ2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0xPR19GSUxFX0xPQ0FUSU9OKSkgeworCQkJdGhpcy5sb2dGaWxlTG9jYXRpb25DaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfTE9HR0VSKSkgeworCQkJdGhpcy5sb2dnZXJDaGFuZ2VkKG51bGwpOworCQl9CisJfQorCisJLyoqCisJICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKKwkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleQorCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfTEVWRUwsCisJCQlMRVZFTF9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfVElNRVNUQU1QLAorCQkJVElNRVNUQU1QX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19USFJFQUQsCisJCQlUSFJFQURfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCUVDTElQU0VMSU5LX1NFU1NJT04sCisJCQlTRVNTSU9OX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19FWENFUFRJT05TLAorCQkJRVhDRVBUSU9OU19QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfTE9HX0ZJTEVfTE9DQVRJT04sCisJCQlMT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfTE9HR0VSLAorCQkJTE9HR0VSX1BST1BFUlRZKTsKKwl9CisKKwkvLyAqKioqKioqKioqIExvZ2dpbmdMZXZlbCAqKioqKioqKioqCisJCisJcHVibGljIExvZ2dpbmdMZXZlbCBnZXRMZXZlbCgpIHsKKwkJcmV0dXJuIHRoaXMubGV2ZWw7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldExldmVsKExvZ2dpbmdMZXZlbCBuZXdMZXZlbCkgeworCQlMb2dnaW5nTGV2ZWwgb2xkID0gdGhpcy5sZXZlbDsKKwkJdGhpcy5sZXZlbCA9IG5ld0xldmVsOworCQl0aGlzLnB1dFByb3BlcnR5KExFVkVMX1BST1BFUlRZLCBuZXdMZXZlbCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMRVZFTF9QUk9QRVJUWSwgb2xkLCBuZXdMZXZlbCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGxldmVsQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwkJTG9nZ2luZ0xldmVsIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIExvZ2dpbmdMZXZlbC52YWx1ZXMoKSk7CisJCUxvZ2dpbmdMZXZlbCBvbGQgPSB0aGlzLmxldmVsOworCQl0aGlzLmxldmVsID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMRVZFTF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCQorCXB1YmxpYyBMb2dnaW5nTGV2ZWwgZ2V0RGVmYXVsdExldmVsKCkgeworCQlyZXR1cm4gREVGQVVMVF9MRVZFTDsKKwl9CisKKwkvLyAqKioqKioqKioqIFRpbWVzdGFtcCAqKioqKioqKioqCisJcHVibGljIEJvb2xlYW4gZ2V0VGltZXN0YW1wKCkgeworCQlyZXR1cm4gdGhpcy50aW1lc3RhbXA7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKEJvb2xlYW4gbmV3VGltZXN0YW1wKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy50aW1lc3RhbXA7CisJCXRoaXMudGltZXN0YW1wID0gbmV3VGltZXN0YW1wOworCQl0aGlzLnB1dFByb3BlcnR5KFRJTUVTVEFNUF9QUk9QRVJUWSwgbmV3VGltZXN0YW1wKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRJTUVTVEFNUF9QUk9QRVJUWSwgb2xkLCBuZXdUaW1lc3RhbXApOworCX0KKworCXByaXZhdGUgdm9pZCB0aW1lc3RhbXBDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOworCQkKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLnRpbWVzdGFtcDsKKwkJdGhpcy50aW1lc3RhbXAgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRJTUVTVEFNUF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFRpbWVzdGFtcCgpIHsKKwkJcmV0dXJuIERFRkFVTFRfVElNRVNUQU1QOworCX0KKworCS8vICoqKioqKioqKiogVGhyZWFkICoqKioqKioqKioKKwlwdWJsaWMgQm9vbGVhbiBnZXRUaHJlYWQoKSB7CisJCXJldHVybiB0aGlzLnRocmVhZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUaHJlYWQoQm9vbGVhbiBuZXdUaHJlYWQpIHsKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLnRocmVhZDsKKwkJdGhpcy50aHJlYWQgPSBuZXdUaHJlYWQ7CisJCXRoaXMucHV0UHJvcGVydHkoVEhSRUFEX1BST1BFUlRZLCBuZXdUaHJlYWQpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEhSRUFEX1BST1BFUlRZLCBvbGQsIG5ld1RocmVhZCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRocmVhZENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7CisJCQorCQlCb29sZWFuIG9sZCA9IHRoaXMudGhyZWFkOworCQl0aGlzLnRocmVhZCA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEhSRUFEX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VGhyZWFkKCkgeworCQlyZXR1cm4gREVGQVVMVF9USFJFQUQ7CisJfQorCisJLy8gKioqKioqKioqKiBTZXNzaW9uICoqKioqKioqKioKKwlwdWJsaWMgQm9vbGVhbiBnZXRTZXNzaW9uKCkgeworCQlyZXR1cm4gdGhpcy5zZXNzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlc3Npb24oQm9vbGVhbiBuZXdTZXNzaW9uKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy5zZXNzaW9uOworCQl0aGlzLnNlc3Npb24gPSBuZXdTZXNzaW9uOworCQl0aGlzLnB1dFByb3BlcnR5KFNFU1NJT05fUFJPUEVSVFksIG5ld1Nlc3Npb24pOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9QUk9QRVJUWSwgb2xkLCBuZXdTZXNzaW9uKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2Vzc2lvbkNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7CisJCQorCQlCb29sZWFuIG9sZCA9IHRoaXMuc2Vzc2lvbjsKKwkJdGhpcy5zZXNzaW9uID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0U2Vzc2lvbigpIHsKKwkJcmV0dXJuIERFRkFVTFRfU0VTU0lPTjsKKwl9CisKKwkvLyAqKioqKioqKioqIEV4Y2VwdGlvbnMgKioqKioqKioqKgorCXB1YmxpYyBCb29sZWFuIGdldEV4Y2VwdGlvbnMoKSB7CisJCXJldHVybiB0aGlzLmV4Y2VwdGlvbnM7CisJfQorCisJcHVibGljIHZvaWQgc2V0RXhjZXB0aW9ucyhCb29sZWFuIG5ld0V4Y2VwdGlvbnMpIHsKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLmV4Y2VwdGlvbnM7CisJCXRoaXMuZXhjZXB0aW9ucyA9IG5ld0V4Y2VwdGlvbnM7CisJCXRoaXMucHV0UHJvcGVydHkoRVhDRVBUSU9OU19QUk9QRVJUWSwgbmV3RXhjZXB0aW9ucyk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENFUFRJT05TX1BST1BFUlRZLCBvbGQsIG5ld0V4Y2VwdGlvbnMpOworCX0KKworCXByaXZhdGUgdm9pZCBleGNlcHRpb25zQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKKwkJCisJCUJvb2xlYW4gb2xkID0gdGhpcy5leGNlcHRpb25zOworCQl0aGlzLmV4Y2VwdGlvbnMgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYQ0VQVElPTlNfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRFeGNlcHRpb25zKCkgeworCQlyZXR1cm4gREVGQVVMVF9FWENFUFRJT05TOworCX0KKworCS8vICoqKioqKioqKiogbG9nRmlsZUxvY2F0aW9uICoqKioqKioqKioKKwlwdWJsaWMgU3RyaW5nIGdldExvZ0ZpbGVMb2NhdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMubG9nRmlsZUxvY2F0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldExvZ0ZpbGVMb2NhdGlvbihTdHJpbmcgbmV3TG9nRmlsZUxvY2F0aW9uKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmxvZ0ZpbGVMb2NhdGlvbjsKKwkJdGhpcy5sb2dGaWxlTG9jYXRpb24gPSBuZXdMb2dGaWxlTG9jYXRpb247CisJCXRoaXMucHV0UHJvcGVydHkoTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFksIG5ld0xvZ0ZpbGVMb2NhdGlvbik7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCBuZXdMb2dGaWxlTG9jYXRpb24pOworCX0KKworCXByaXZhdGUgdm9pZCBsb2dGaWxlTG9jYXRpb25DaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5sb2dGaWxlTG9jYXRpb247CisJCXRoaXMubG9nRmlsZUxvY2F0aW9uID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0TG9nRmlsZUxvY2F0aW9uKCkgeworCQlyZXR1cm4gREVGQVVMVF9MT0dfRklMRV9MT0NBVElPTjsKKwl9CisKKwkvLyAqKioqKioqKioqIExvZ2dlciAqKioqKioqKioqCisJLyoqCisJICogUmV0dXJucyBMb2dnZXIgb3IgY3VzdG9tIGxvZ2dlciBjbGFzcy4KKwkgKiAKKwkgKiBAcmV0dXJuIEVjbGlwc2VMaW5rIHN0cmluZyB2YWx1ZSBmb3IgTG9nZ2VyIGVudW0gb3IgY3VzdG9tIGxvZ2dlciBjbGFzcworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TG9nZ2VyKCkgeworCQlyZXR1cm4gdGhpcy5sb2dnZXI7CisJfQorCisJLyoqCisJICogU2V0cyBFY2xpcHNlTGluayBsb2dnZXIuCisJICogCisJICogQHBhcmFtIG5ld0xvZ2dlciAtIExvZ2dlcgorCSAqLworCXB1YmxpYyB2b2lkIHNldExvZ2dlcihMb2dnZXIgbmV3TG9nZ2VyKSB7CisJCWlmKCBuZXdMb2dnZXIgPT0gbnVsbCkgeworCQkJdGhpcy5zZXRMb2dnZXJfKChTdHJpbmcpIG51bGwpOworCQkJcmV0dXJuOworCQl9CisJCXRoaXMuc2V0TG9nZ2VyXyhnZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YobmV3TG9nZ2VyKSk7CisJfQorCisJLyoqCisJICogU2V0cyBFY2xpcHNlTGluayBsb2dnZXIgb3IgY3VzdG9tIGxvZ2dlci4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3TG9nZ2VyIC0KKwkgKiAgICAgICAgICAgIENhbiBiZSBhIEVjbGlwc2VMaW5rIGxvZ2dlciBsaXRlcmFsIG9yCisJICogICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY3VzdG9tIGxvZ2dlci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb2dnZXIoU3RyaW5nIG5ld0xvZ2dlcikgeworCQlpZiggbmV3TG9nZ2VyID09IG51bGwpIHsKKwkJCXRoaXMuc2V0TG9nZ2VyXyhudWxsKTsKKwkJCXJldHVybjsKKwkJfQorCQlMb2dnZXIgbCA9IExvZ2dlci5nZXRMb2dnZXJGb3IobmV3TG9nZ2VyKTsKKwkJaWYobCA9PSBudWxsKSB7CS8vIGN1c3RvbSBMb2dnZXIgY2xhc3MKKwkJCXRoaXMuc2V0TG9nZ2VyXyhuZXdMb2dnZXIpOworCQl9CisJCWVsc2UgeworCQkJdGhpcy5zZXRMb2dnZXIobCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHNldExvZ2dlcl8oU3RyaW5nIG5ld0xvZ2dlcikgeworCQlTdHJpbmcgb2xkID0gdGhpcy5sb2dnZXI7CisJCXRoaXMubG9nZ2VyID0gbmV3TG9nZ2VyOworCQl0aGlzLnB1dFByb3BlcnR5KExPR0dFUl9QUk9QRVJUWSwgbmV3TG9nZ2VyKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExPR0dFUl9QUk9QRVJUWSwgb2xkLCBuZXdMb2dnZXIpOworCX0KKworCXByaXZhdGUgdm9pZCBsb2dnZXJDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5sb2dnZXI7CisJCXRoaXMubG9nZ2VyID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0dHRVJfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdExvZ2dlcigpIHsKKwkJcmV0dXJuIERFRkFVTFRfTE9HR0VSOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvRWNsaXBzZUxpbmtPcHRpb25zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzgzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMzk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuVGFyZ2V0RGF0YWJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlRhcmdldFNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKKworLyoqCisgKiAgRWNsaXBzZUxpbmtPcHRpb25zCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09wdGlvbnMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKKwlpbXBsZW1lbnRzIE9wdGlvbnMKK3sKKwkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgorCXByaXZhdGUgU3RyaW5nIHNlc3Npb25OYW1lOworCXByaXZhdGUgU3RyaW5nIHNlc3Npb25zWG1sOworCXByaXZhdGUgQm9vbGVhbiBpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXM7CisJcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RGF0YWJhc2U7IC8vIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZSBzaW5jZSB2YWx1ZSBjYW4gYmUgVGFyZ2V0RGF0YWJhc2Ugb3IgY3VzdG9tIGNsYXNzCisJcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0U2VydmVyOyAvLyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUgc2luY2UgdmFsdWUgY2FuIGJlIFRhcmdldFNlcnZlciBvciBjdXN0b20gY2xhc3MKKwlwcml2YXRlIFN0cmluZyBldmVudExpc3RlbmVyOworCXByaXZhdGUgQm9vbGVhbiB0ZW1wb3JhbE11dGFibGU7CisKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKKwlwdWJsaWMgRWNsaXBzZUxpbmtPcHRpb25zKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKKwkvKioKKwkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7CisJCS8vIFRPUkVWSUVXIC0gaGFuZGxlIGluY29ycmVjdCBTdHJpbmcgaW4gcGVyc2lzdGVuY2UueG1sCisJCXRoaXMuc2Vzc2lvbk5hbWUgPSAKKwkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfU0VTU0lPTl9OQU1FKTsKKwkJdGhpcy5zZXNzaW9uc1htbCA9IAorCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19TRVNTSU9OU19YTUwpOworCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyA9IAorCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUyk7CisJCXRoaXMudGFyZ2V0RGF0YWJhc2UgPSB0aGlzLmdldFRhcmdldERhdGFiYXNlRnJvbVBlcnNpc3RlbmNlWG1sKCk7CisJCXRoaXMudGFyZ2V0U2VydmVyID0gdGhpcy5nZXRUYXJnZXRTZXJ2ZXJGcm9tUGVyc2lzdGVuY2VYbWwoKTsKKwkJdGhpcy5ldmVudExpc3RlbmVyID0gCisJCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1NFU1NJT05fRVZFTlRfTElTVEVORVIpOworCQl0aGlzLnRlbXBvcmFsTXV0YWJsZSA9IAorCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfVEVNUE9SQUxfTVVUQUJMRSk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0RGF0YWJhc2VGcm9tUGVyc2lzdGVuY2VYbWwoKSB7CisKKwkJU3RyaW5nIHZhbHVlID0gdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19UQVJHRVRfREFUQUJBU0UpOworCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJVGFyZ2V0RGF0YWJhc2Ugc3RhbmRhcmRUYXJnZXREYXRhYmFzZSA9IHRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX1RBUkdFVF9EQVRBQkFTRSwgVGFyZ2V0RGF0YWJhc2UudmFsdWVzKCkpOworCQlyZXR1cm4gKHN0YW5kYXJkVGFyZ2V0RGF0YWJhc2UgPT0gbnVsbCkgPyB2YWx1ZSA6IGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihzdGFuZGFyZFRhcmdldERhdGFiYXNlKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRTZXJ2ZXJGcm9tUGVyc2lzdGVuY2VYbWwoKSB7CisKKwkJU3RyaW5nIHZhbHVlID0gdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19UQVJHRVRfU0VSVkVSKTsKKwkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCVRhcmdldFNlcnZlciBzdGFuZGFyZFRhcmdldFNlcnZlciA9IHRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVIsIFRhcmdldFNlcnZlci52YWx1ZXMoKSk7CisJCXJldHVybiAoc3RhbmRhcmRUYXJnZXRTZXJ2ZXIgPT0gbnVsbCkgPyB2YWx1ZSA6IGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihzdGFuZGFyZFRhcmdldFNlcnZlcik7CisJfQorCisJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFU1NJT05fTkFNRSkpIHsKKwkJCXRoaXMuc2Vzc2lvbk5hbWVDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFU1NJT05TX1hNTCkpIHsKKwkJCXRoaXMuc2Vzc2lvbnNYbWxDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RBUkdFVF9EQVRBQkFTRSkpIHsKKwkJCXRoaXMudGFyZ2V0RGF0YWJhc2VDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVIpKSB7CisJCQl0aGlzLnRhcmdldFNlcnZlckNoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUykpIHsKKwkJCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSKSkgeworCQkJdGhpcy5ldmVudExpc3RlbmVyQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19URU1QT1JBTF9NVVRBQkxFKSkgeworCQkJdGhpcy50ZW1wb3JhbE11dGFibGVDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQkKKwl9CisJCisJcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTl9OQU1FKSkgeworCQkJdGhpcy5zZXNzaW9uTmFtZUNoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OU19YTUwpKSB7CisJCQl0aGlzLnNlc3Npb25zWG1sQ2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RBUkdFVF9EQVRBQkFTRSkpIHsKKwkJCXRoaXMudGFyZ2V0RGF0YWJhc2VDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVEFSR0VUX1NFUlZFUikpIHsKKwkJCXRoaXMudGFyZ2V0U2VydmVyQ2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMpKSB7CisJCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSKSkgeworCQkJdGhpcy5ldmVudExpc3RlbmVyQ2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RFTVBPUkFMX01VVEFCTEUpKSB7CisJCQl0aGlzLnRlbXBvcmFsTXV0YWJsZUNoYW5nZWQobnVsbCk7CisJCX0JCisJfQorCisJLyoqCisJICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKKwkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleQorCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfU0VTU0lPTl9OQU1FLAorCQkJU0VTU0lPTl9OQU1FX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19TRVNTSU9OU19YTUwsCisJCQlTRVNTSU9OU19YTUxfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCUVDTElQU0VMSU5LX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMsCisJCQlTRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19UQVJHRVRfREFUQUJBU0UsCisJCQlUQVJHRVRfREFUQUJBU0VfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCUVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVIsCisJCQlUQVJHRVRfU0VSVkVSX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSLAorCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfVEVNUE9SQUxfTVVUQUJMRSwKKwkJCVRFTVBPUkFMX01VVEFCTEVfUFJPUEVSVFkpOworCX0KKworCisJLy8gKioqKioqKioqKiBTZXNzaW9uTmFtZSAqKioqKioqKioqCisJcHVibGljIFN0cmluZyBnZXRTZXNzaW9uTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuc2Vzc2lvbk5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2Vzc2lvbk5hbWUoU3RyaW5nIG5ld1Nlc3Npb25OYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNlc3Npb25OYW1lOworCQl0aGlzLnNlc3Npb25OYW1lID0gbmV3U2Vzc2lvbk5hbWU7CisJCXRoaXMucHV0UHJvcGVydHkoU0VTU0lPTl9OQU1FX1BST1BFUlRZLCBuZXdTZXNzaW9uTmFtZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OX05BTUVfUFJPUEVSVFksIG9sZCwgbmV3U2Vzc2lvbk5hbWUpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXNzaW9uTmFtZUNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNlc3Npb25OYW1lOworCQl0aGlzLnNlc3Npb25OYW1lID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OX05BTUVfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlc3Npb25OYW1lKCkgeworCQlyZXR1cm4gREVGQVVMVF9TRVNTSU9OX05BTUU7CisJfQorCisJLy8gKioqKioqKioqKiBTZXNzaW9uc1htbCAqKioqKioqKioqCisJcHVibGljIFN0cmluZyBnZXRTZXNzaW9uc1htbCgpIHsKKwkJcmV0dXJuIHRoaXMuc2Vzc2lvbnNYbWw7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2Vzc2lvbnNYbWwoU3RyaW5nIG5ld1Nlc3Npb25zWG1sKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNlc3Npb25zWG1sOworCQl0aGlzLnNlc3Npb25zWG1sID0gbmV3U2Vzc2lvbnNYbWw7CisJCXRoaXMucHV0UHJvcGVydHkoU0VTU0lPTlNfWE1MX1BST1BFUlRZLCBuZXdTZXNzaW9uc1htbCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OU19YTUxfUFJPUEVSVFksIG9sZCwgbmV3U2Vzc2lvbnNYbWwpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXNzaW9uc1htbENoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnNlc3Npb25zWG1sOworCQl0aGlzLnNlc3Npb25zWG1sID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OU19YTUxfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlc3Npb25zWG1sKCkgeworCQlyZXR1cm4gREVGQVVMVF9TRVNTSU9OU19YTUw7CisJfQorCisJLy8gKioqKioqKioqKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgKioqKioqKioqKgorCXB1YmxpYyBCb29sZWFuIGdldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpIHsKKwkJcmV0dXJuIHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyhCb29sZWFuIG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcykgeworCQlCb29sZWFuIG9sZCA9IHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzOworCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyA9IG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllczsKKwkJdGhpcy5wdXRQcm9wZXJ0eShTRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZLCBuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSwgb2xkLCBuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOworCX0KKworCXByaXZhdGUgdm9pZCBpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOworCQkKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllczsKKwkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKSB7CisJCXJldHVybiBERUZBVUxUX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVM7CisJfQorCisJLy8gKioqKioqKioqKiBUYXJnZXREYXRhYmFzZSAqKioqKioqKioqCisJLyoqCisJICogUmV0dXJucyBUYXJnZXREYXRhYmFzZSBvciBjdXN0b20gdGFyZ2V0RGF0YWJhc2UgY2xhc3MuCisJICogCisJICogQHJldHVybiBFY2xpcHNlTGluayBzdHJpbmcgdmFsdWUgZm9yIFRhcmdldERhdGFiYXNlIGVudW0gb3IgY3VzdG9tIHRhcmdldERhdGFiYXNlIGNsYXNzCisJICovCisJcHVibGljIFN0cmluZyBnZXRUYXJnZXREYXRhYmFzZSgpIHsKKwkJcmV0dXJuIHRoaXMudGFyZ2V0RGF0YWJhc2U7CisJfQorCisJLyoqCisJICogU2V0cyBFY2xpcHNlTGluayB0YXJnZXREYXRhYmFzZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3VGFyZ2V0RGF0YWJhc2UgLSBUYXJnZXREYXRhYmFzZQorCSAqLworCXB1YmxpYyB2b2lkIHNldFRhcmdldERhdGFiYXNlKFRhcmdldERhdGFiYXNlIG5ld1RhcmdldERhdGFiYXNlKSB7CisJCWlmKCBuZXdUYXJnZXREYXRhYmFzZSA9PSBudWxsKSB7CisJCQl0aGlzLnNldFRhcmdldERhdGFiYXNlXygoU3RyaW5nKSBudWxsKTsKKwkJCXJldHVybjsKKwkJfQorCQl0aGlzLnNldFRhcmdldERhdGFiYXNlXyhnZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YobmV3VGFyZ2V0RGF0YWJhc2UpKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIEVjbGlwc2VMaW5rIHRhcmdldERhdGFiYXNlIG9yIGN1c3RvbSB0YXJnZXREYXRhYmFzZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmV3VGFyZ2V0RGF0YWJhc2UgLQorCSAqICAgICAgICAgICAgQ2FuIGJlIGEgRWNsaXBzZUxpbmsgVGFyZ2V0RGF0YWJhc2UgbGl0ZXJhbCBvcgorCSAqICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGN1c3RvbSB0YXJnZXREYXRhYmFzZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXREYXRhYmFzZShTdHJpbmcgbmV3VGFyZ2V0RGF0YWJhc2UpIHsKKwkJaWYoIG5ld1RhcmdldERhdGFiYXNlID09IG51bGwpIHsKKwkJCXRoaXMuc2V0VGFyZ2V0RGF0YWJhc2VfKChTdHJpbmcpIG51bGwpOworCQkJcmV0dXJuOworCQl9CisJCVRhcmdldERhdGFiYXNlIGN1c3RvbVRhcmdldERhdGFiYXNlID0gVGFyZ2V0RGF0YWJhc2UuZ2V0VGFyZ2V0RGF0YWJhc2VGb3IobmV3VGFyZ2V0RGF0YWJhc2UpOworCQlpZihjdXN0b21UYXJnZXREYXRhYmFzZSA9PSBudWxsKSB7CS8vIGN1c3RvbSBUYXJnZXREYXRhYmFzZSBjbGFzcworCQkJdGhpcy5zZXRUYXJnZXREYXRhYmFzZV8obmV3VGFyZ2V0RGF0YWJhc2UpOworCQl9CisJCWVsc2UgeworCQkJdGhpcy5zZXRUYXJnZXREYXRhYmFzZShjdXN0b21UYXJnZXREYXRhYmFzZSk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHNldFRhcmdldERhdGFiYXNlXyhTdHJpbmcgbmV3VGFyZ2V0RGF0YWJhc2UpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudGFyZ2V0RGF0YWJhc2U7CisJCXRoaXMudGFyZ2V0RGF0YWJhc2UgPSBuZXdUYXJnZXREYXRhYmFzZTsKKwkJdGhpcy5wdXRQcm9wZXJ0eShUQVJHRVRfREFUQUJBU0VfUFJPUEVSVFksIG5ld1RhcmdldERhdGFiYXNlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSwgb2xkLCBuZXdUYXJnZXREYXRhYmFzZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRhcmdldERhdGFiYXNlQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudGFyZ2V0RGF0YWJhc2U7CisJCXRoaXMudGFyZ2V0RGF0YWJhc2UgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldERhdGFiYXNlKCkgeworCQlyZXR1cm4gREVGQVVMVF9UQVJHRVRfREFUQUJBU0U7CisJfQorCisJLy8gKioqKioqKioqKiBUYXJnZXRTZXJ2ZXIgKioqKioqKioqKgorCS8qKgorCSAqIFJldHVybnMgVGFyZ2V0U2VydmVyIG9yIGN1c3RvbSB0YXJnZXRTZXJ2ZXIgY2xhc3MuCisJICogCisJICogQHJldHVybiBFY2xpcHNlTGluayBzdHJpbmcgdmFsdWUgZm9yIFRhcmdldFNlcnZlciBlbnVtIG9yIGN1c3RvbSB0YXJnZXRTZXJ2ZXIgY2xhc3MKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldFNlcnZlcigpIHsKKwkJcmV0dXJuIHRoaXMudGFyZ2V0U2VydmVyOworCX0KKworCS8qKgorCSAqIFNldHMgRWNsaXBzZUxpbmsgdGFyZ2V0U2VydmVyLgorCSAqIAorCSAqIEBwYXJhbSBuZXdUYXJnZXRTZXJ2ZXIgLSBUYXJnZXRTZXJ2ZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXRTZXJ2ZXIoVGFyZ2V0U2VydmVyIG5ld1RhcmdldFNlcnZlcikgeworCQlpZiggbmV3VGFyZ2V0U2VydmVyID09IG51bGwpIHsKKwkJCXRoaXMuc2V0VGFyZ2V0U2VydmVyXygoU3RyaW5nKSBudWxsKTsKKwkJCXJldHVybjsKKwkJfQorCQl0aGlzLnNldFRhcmdldFNlcnZlcl8oZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKG5ld1RhcmdldFNlcnZlcikpOworCX0KKworCS8qKgorCSAqIFNldHMgRWNsaXBzZUxpbmsgdGFyZ2V0U2VydmVyIG9yIGN1c3RvbSB0YXJnZXRTZXJ2ZXIuCisJICogCisJICogQHBhcmFtIG5ld1RhcmdldFNlcnZlciAtCisJICogICAgICAgICAgICBDYW4gYmUgYSBFY2xpcHNlTGluayBUYXJnZXRTZXJ2ZXIgbGl0ZXJhbCBvcgorCSAqICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGN1c3RvbSB0YXJnZXRTZXJ2ZXIuCisJICovCisJcHVibGljIHZvaWQgc2V0VGFyZ2V0U2VydmVyKFN0cmluZyBuZXdUYXJnZXRTZXJ2ZXIpIHsKKwkJaWYoIG5ld1RhcmdldFNlcnZlciA9PSBudWxsKSB7CisJCQl0aGlzLnNldFRhcmdldFNlcnZlcl8oKFN0cmluZykgbnVsbCk7CisJCQlyZXR1cm47CisJCX0KKwkJVGFyZ2V0U2VydmVyIGN1c3RvbVRhcmdldFNlcnZlciA9IFRhcmdldFNlcnZlci5nZXRUYXJnZXRTZXJ2ZXJGb3IobmV3VGFyZ2V0U2VydmVyKTsKKwkJaWYoY3VzdG9tVGFyZ2V0U2VydmVyID09IG51bGwpIHsJLy8gY3VzdG9tIFRhcmdldFNlcnZlciBjbGFzcworCQkJdGhpcy5zZXRUYXJnZXRTZXJ2ZXJfKG5ld1RhcmdldFNlcnZlcik7CisJCX0KKwkJZWxzZSB7CisJCQl0aGlzLnNldFRhcmdldFNlcnZlcihjdXN0b21UYXJnZXRTZXJ2ZXIpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBzZXRUYXJnZXRTZXJ2ZXJfKFN0cmluZyBuZXdUYXJnZXRTZXJ2ZXIpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudGFyZ2V0U2VydmVyOworCQl0aGlzLnRhcmdldFNlcnZlciA9IG5ld1RhcmdldFNlcnZlcjsKKwkJdGhpcy5wdXRQcm9wZXJ0eShUQVJHRVRfU0VSVkVSX1BST1BFUlRZLCBuZXdUYXJnZXRTZXJ2ZXIpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSwgb2xkLCBuZXdUYXJnZXRTZXJ2ZXIpOworCX0KKworCXByaXZhdGUgdm9pZCB0YXJnZXRTZXJ2ZXJDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy50YXJnZXRTZXJ2ZXI7CisJCXRoaXMudGFyZ2V0U2VydmVyID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUQVJHRVRfU0VSVkVSX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0U2VydmVyKCkgeworCQlyZXR1cm4gREVGQVVMVF9UQVJHRVRfU0VSVkVSOworCX0KKworCS8vICoqKioqKioqKiogRXZlbnRMaXN0ZW5lciAqKioqKioqKioqCisJcHVibGljIFN0cmluZyBnZXRFdmVudExpc3RlbmVyKCkgeworCQlyZXR1cm4gdGhpcy5ldmVudExpc3RlbmVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldEV2ZW50TGlzdGVuZXIoU3RyaW5nIG5ld0V2ZW50TGlzdGVuZXIpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuZXZlbnRMaXN0ZW5lcjsKKwkJdGhpcy5ldmVudExpc3RlbmVyID0gbmV3RXZlbnRMaXN0ZW5lcjsKKwkJdGhpcy5wdXRQcm9wZXJ0eShTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZLCBuZXdFdmVudExpc3RlbmVyKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFksIG9sZCwgbmV3RXZlbnRMaXN0ZW5lcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGV2ZW50TGlzdGVuZXJDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5ldmVudExpc3RlbmVyOworCQl0aGlzLmV2ZW50TGlzdGVuZXIgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEV2ZW50TGlzdGVuZXIoKSB7CisJCXJldHVybiBERUZBVUxUX1NFU1NJT05fRVZFTlRfTElTVEVORVI7CisJfQorCQorCS8vICoqKioqKioqKiogVGVtcG9yYWxNdXRhYmxlICoqKioqKioqKioKKworCXB1YmxpYyBCb29sZWFuIGdldFRlbXBvcmFsTXV0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMudGVtcG9yYWxNdXRhYmxlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuIG5ld1RlbXBvcmFsTXV0YWJsZSkgeworCQlCb29sZWFuIG9sZCA9IHRoaXMudGVtcG9yYWxNdXRhYmxlOworCQl0aGlzLnRlbXBvcmFsTXV0YWJsZSA9IG5ld1RlbXBvcmFsTXV0YWJsZTsKKwkJdGhpcy5wdXRQcm9wZXJ0eShURU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZLCBuZXdUZW1wb3JhbE11dGFibGUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEVNUE9SQUxfTVVUQUJMRV9QUk9QRVJUWSwgb2xkLCBuZXdUZW1wb3JhbE11dGFibGUpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZW1wb3JhbE11dGFibGVDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOworCQkKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLnRlbXBvcmFsTXV0YWJsZTsKKwkJdGhpcy50ZW1wb3JhbE11dGFibGUgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRFTVBPUkFMX01VVEFCTEVfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKwkKKwlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VGVtcG9yYWxNdXRhYmxlKCkgeworCQlyZXR1cm4gREVGQVVMVF9URU1QT1JBTF9NVVRBQkxFOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzNzhkNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLkRkbEdlbmVyYXRpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uT3V0cHV0TW9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CisKKy8qKgorICogRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uIGVuY2Fwc3VsYXRlcyBFY2xpcHNlTGluayBTY2hlbWFHZW5lcmF0aW9uCisgKiBwcm9wZXJ0aWVzLgorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uCisJZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgaW1wbGVtZW50cyBTY2hlbWFHZW5lcmF0aW9uCit7CisJLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKKwkKKwlwcml2YXRlIE91dHB1dE1vZGUgb3V0cHV0TW9kZTsKKwlwcml2YXRlIERkbEdlbmVyYXRpb25UeXBlIGRkbEdlbmVyYXRpb25UeXBlOworCXByaXZhdGUgU3RyaW5nIGNyZWF0ZUZpbGVOYW1lOworCXByaXZhdGUgU3RyaW5nIGRyb3BGaWxlTmFtZTsKKwlwcml2YXRlIFN0cmluZyBhcHBsaWNhdGlvbkxvY2F0aW9uOworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCQorCXB1YmxpYyBFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb24oUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIHByb3BlcnRpZXMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpIHsKKwkJdGhpcy5vdXRwdXRNb2RlID0gCisJCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSwgT3V0cHV0TW9kZS52YWx1ZXMoKSk7CisJCXRoaXMuZGRsR2VuZXJhdGlvblR5cGUgPSAKKwkJCXRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUsIERkbEdlbmVyYXRpb25UeXBlLnZhbHVlcygpKTsKKwkJdGhpcy5jcmVhdGVGaWxlTmFtZSA9IAorCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19DUkVBVEVfRklMRV9OQU1FKTsKKwkJdGhpcy5kcm9wRmlsZU5hbWUgPSAKKwkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfRFJPUF9GSUxFX05BTUUpOworCQl0aGlzLmFwcGxpY2F0aW9uTG9jYXRpb24gPSAKKwkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT04pOworCX0KKworCS8qKgorCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZToga2V5ID0gRWNsaXBzZUxpbmsgcHJvcGVydHkKKwkgKiBrZXk7IHZhbHVlID0gcHJvcGVydHkgaWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCUVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFLAorCQkJT1VUUFVUX01PREVfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCUVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUsCisJCQlERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlFQ0xJUFNFTElOS19DUkVBVEVfRklMRV9OQU1FLAorCQkJQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfRFJPUF9GSUxFX05BTUUsCisJCQlEUk9QX0ZJTEVfTkFNRV9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT04sCisJCQlBUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSk7CisJfQorCisJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCisJCisJcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFKSkgeworCQkJdGhpcy5vdXRwdXRNb2RlQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFKSkgeworCQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZUNoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSkpIHsKKwkJCXRoaXMuY3JlYXRlRmlsZU5hbWVDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FKSkgeworCQkJdGhpcy5kcm9wRmlsZU5hbWVDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0FQUExJQ0FUSU9OX0xPQ0FUSU9OKSkgeworCQkJdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUpKSB7CisJCQl0aGlzLm91dHB1dE1vZGVDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSkpIHsKKwkJCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSkpIHsKKwkJCXRoaXMuY3JlYXRlRmlsZU5hbWVDaGFuZ2VkKG51bGwpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRFJPUF9GSUxFX05BTUUpKSB7CisJCQl0aGlzLmRyb3BGaWxlTmFtZUNoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19BUFBMSUNBVElPTl9MT0NBVElPTikpIHsKKwkJCXRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbkNoYW5nZWQobnVsbCk7CisJCX0KKwl9CisKKwkvLyAqKioqKioqKioqIERkbEdlbmVyYXRpb25UeXBlICoqKioqKioqKioKKwlwdWJsaWMgRGRsR2VuZXJhdGlvblR5cGUgZ2V0RGRsR2VuZXJhdGlvblR5cGUoKSB7CisJCXJldHVybiB0aGlzLmRkbEdlbmVyYXRpb25UeXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldERkbEdlbmVyYXRpb25UeXBlKERkbEdlbmVyYXRpb25UeXBlIG5ld0RkbEdlblR5cGUpIHsKKwkJRGRsR2VuZXJhdGlvblR5cGUgb2xkID0gdGhpcy5kZGxHZW5lcmF0aW9uVHlwZTsKKwkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZSA9IG5ld0RkbEdlblR5cGU7CisJCXRoaXMucHV0UHJvcGVydHkoRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSwgbmV3RGRsR2VuVHlwZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZLCBvbGQsIG5ld0RkbEdlblR5cGUpOworCX0KKworCXByaXZhdGUgdm9pZCBkZGxHZW5lcmF0aW9uVHlwZUNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCURkbEdlbmVyYXRpb25UeXBlIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIERkbEdlbmVyYXRpb25UeXBlLnZhbHVlcygpKTsKKwkJRGRsR2VuZXJhdGlvblR5cGUgb2xkID0gdGhpcy5kZGxHZW5lcmF0aW9uVHlwZTsKKwkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZSA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIERkbEdlbmVyYXRpb25UeXBlIGdldERlZmF1bHREZGxHZW5lcmF0aW9uVHlwZSgpIHsKKwkJcmV0dXJuIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRERMX0dFTkVSQVRJT05fVFlQRTsKKwl9CisKKwkvLyAqKioqKioqKioqIE91dHB1dE1vZGUgKioqKioqKioqKgorCXB1YmxpYyBPdXRwdXRNb2RlIGdldE91dHB1dE1vZGUoKSB7CisJCXJldHVybiB0aGlzLm91dHB1dE1vZGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0T3V0cHV0TW9kZShPdXRwdXRNb2RlIG5ld091dHB1dE1vZGUpIHsKKwkJT3V0cHV0TW9kZSBvbGQgPSB0aGlzLm91dHB1dE1vZGU7CisJCXRoaXMub3V0cHV0TW9kZSA9IG5ld091dHB1dE1vZGU7CisJCXRoaXMucHV0UHJvcGVydHkoT1VUUFVUX01PREVfUFJPUEVSVFksIG5ld091dHB1dE1vZGUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1VUUFVUX01PREVfUFJPUEVSVFksIG9sZCwgbmV3T3V0cHV0TW9kZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIG91dHB1dE1vZGVDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlPdXRwdXRNb2RlIG5ld1ZhbHVlID0gZ2V0RW51bVZhbHVlT2Yoc3RyaW5nVmFsdWUsIE91dHB1dE1vZGUudmFsdWVzKCkpOworCQlPdXRwdXRNb2RlIG9sZCA9IHRoaXMub3V0cHV0TW9kZTsKKwkJdGhpcy5vdXRwdXRNb2RlID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPVVRQVVRfTU9ERV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIE91dHB1dE1vZGUgZ2V0RGVmYXVsdE91dHB1dE1vZGUoKSB7CisJCXJldHVybiBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX09VVFBVVF9NT0RFOworCX0KKworCS8vICoqKioqKioqKiogQ3JlYXRlRmlsZU5hbWUgKioqKioqKioqKgorCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlRmlsZU5hbWUoKSB7CisJCXJldHVybiB0aGlzLmNyZWF0ZUZpbGVOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldENyZWF0ZUZpbGVOYW1lKFN0cmluZyBuZXdDcmVhdGVGaWxlTmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5jcmVhdGVGaWxlTmFtZTsKKwkJdGhpcy5jcmVhdGVGaWxlTmFtZSA9IG5ld0NyZWF0ZUZpbGVOYW1lOworCQl0aGlzLnB1dFByb3BlcnR5KENSRUFURV9GSUxFX05BTUVfUFJPUEVSVFksIG5ld0NyZWF0ZUZpbGVOYW1lKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENSRUFURV9GSUxFX05BTUVfUFJPUEVSVFksIG9sZCwgbmV3Q3JlYXRlRmlsZU5hbWUpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVGaWxlTmFtZUNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmNyZWF0ZUZpbGVOYW1lOworCQl0aGlzLmNyZWF0ZUZpbGVOYW1lID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDcmVhdGVGaWxlTmFtZSgpIHsKKwkJcmV0dXJuIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQ1JFQVRFX0ZJTEVfTkFNRTsKKwl9CisKKwkvLyAqKioqKioqKioqIGRyb3BGaWxlTmFtZSAqKioqKioqKioqCisJcHVibGljIFN0cmluZyBnZXREcm9wRmlsZU5hbWUoKSB7CisJCXJldHVybiB0aGlzLmRyb3BGaWxlTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREcm9wRmlsZU5hbWUoU3RyaW5nIG5ld0Ryb3BGaWxlTmFtZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5kcm9wRmlsZU5hbWU7CisJCXRoaXMuZHJvcEZpbGVOYW1lID0gbmV3RHJvcEZpbGVOYW1lOworCQl0aGlzLnB1dFByb3BlcnR5KERST1BfRklMRV9OQU1FX1BST1BFUlRZLCBuZXdEcm9wRmlsZU5hbWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRFJPUF9GSUxFX05BTUVfUFJPUEVSVFksIG9sZCwgbmV3RHJvcEZpbGVOYW1lKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZHJvcEZpbGVOYW1lQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuZHJvcEZpbGVOYW1lOworCQl0aGlzLmRyb3BGaWxlTmFtZSA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRFJPUF9GSUxFX05BTUVfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdERyb3BGaWxlTmFtZSgpIHsKKwkJcmV0dXJuIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRFJPUF9GSUxFX05BTUU7CisJfQorCisJLy8gKioqKioqKioqKiBhcHBsaWNhdGlvbkxvY2F0aW9uICoqKioqKioqKioKKwlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uTG9jYXRpb24oKSB7CisJCXJldHVybiB0aGlzLmFwcGxpY2F0aW9uTG9jYXRpb247CisJfQorCisJcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb25Mb2NhdGlvbihTdHJpbmcgbmV3QXBwbGljYXRpb25Mb2NhdGlvbikgeworCQlTdHJpbmcgb2xkID0gdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uOworCQl0aGlzLmFwcGxpY2F0aW9uTG9jYXRpb24gPSBuZXdBcHBsaWNhdGlvbkxvY2F0aW9uOworCQl0aGlzLnB1dFByb3BlcnR5KEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZLCBuZXdBcHBsaWNhdGlvbkxvY2F0aW9uKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZLCBvbGQsIG5ld0FwcGxpY2F0aW9uTG9jYXRpb24pOworCX0KKworCXByaXZhdGUgdm9pZCBhcHBsaWNhdGlvbkxvY2F0aW9uQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbjsKKwkJdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0QXBwbGljYXRpb25Mb2NhdGlvbigpIHsKKwkJcmV0dXJuIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQVBQTElDQVRJT05fTE9DQVRJT047CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NGU4ODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uOwotCi0vKioKLSAqICBEZGxHZW5lcmF0aW9uVHlwZQotICovCi1wdWJsaWMgZW51bSBEZGxHZW5lcmF0aW9uVHlwZSB7Ci0Jbm9uZSwgCi0JY3JlYXRlX3RhYmxlcywgCi0JZHJvcF9hbmRfY3JlYXRlX3RhYmxlczsKLQkKLQkvLyBFY2xpcHNlTGluayB2YWx1ZSBzdHJpbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIm5vbmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9UQUJMRVMgPSAiY3JlYXRlLXRhYmxlcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUF9BTkRfQ1JFQVRFX1RBQkxFUyA9ICJkcm9wLWFuZC1jcmVhdGUtdGFibGVzIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9zY2hlbWEvZ2VuZXJhdGlvbi9FY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTBiNDhiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbiBlbmNhcHN1bGF0ZXMgRWNsaXBzZUxpbmsgU2NoZW1hR2VuZXJhdGlvbgotICogcHJvcGVydGllcy4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbgotCWV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGltcGxlbWVudHMgU2NoZW1hR2VuZXJhdGlvbgotewotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBPdXRwdXRNb2RlIG91dHB1dE1vZGU7Ci0JcHJpdmF0ZSBEZGxHZW5lcmF0aW9uVHlwZSBkZGxHZW5lcmF0aW9uVHlwZTsKLQlwcml2YXRlIFN0cmluZyBjcmVhdGVGaWxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBkcm9wRmlsZU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgYXBwbGljYXRpb25Mb2NhdGlvbjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIExpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBwcm9wZXJ0eUxpc3RBZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgcHJvcGVydHlMaXN0QWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQl0aGlzLm91dHB1dE1vZGUgPSAKLQkJCXRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFLCBPdXRwdXRNb2RlLnZhbHVlcygpKTsKLQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZSA9IAotCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSwgRGRsR2VuZXJhdGlvblR5cGUudmFsdWVzKCkpOwotCQl0aGlzLmNyZWF0ZUZpbGVOYW1lID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0NSRUFURV9GSUxFX05BTUUpOwotCQl0aGlzLmRyb3BGaWxlTmFtZSA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19EUk9QX0ZJTEVfTkFNRSk7Ci0JCXRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbiA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19BUFBMSUNBVElPTl9MT0NBVElPTik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiBrZXkgPSBFY2xpcHNlTGluayBwcm9wZXJ0eQotCSAqIGtleTsgdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUsCi0JCQlPVVRQVVRfTU9ERV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSwKLQkJCURETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0NSRUFURV9GSUxFX05BTUUsCi0JCQlDUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19EUk9QX0ZJTEVfTkFNRSwKLQkJCURST1BfRklMRV9OQU1FX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19BUFBMSUNBVElPTl9MT0NBVElPTiwKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgYXNwZWN0TmFtZSA9IGV2ZW50LmdldEFzcGVjdE5hbWUoKTsKLQkJCi0JCWlmIChhc3BlY3ROYW1lLmVxdWFscyhPVVRQVVRfTU9ERV9QUk9QRVJUWSkpIHsKLQkJCXRoaXMub3V0cHV0TW9kZUNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGFzcGVjdE5hbWUuZXF1YWxzKERETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSkpIHsKLQkJCXRoaXMuY3JlYXRlRmlsZU5hbWVDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIGlmIChhc3BlY3ROYW1lLmVxdWFscyhEUk9QX0ZJTEVfTkFNRV9QUk9QRVJUWSkpIHsKLQkJCXRoaXMuZHJvcEZpbGVOYW1lQ2hhbmdlZChldmVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXNwZWN0TmFtZS5lcXVhbHMoQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkpKSB7Ci0JCQl0aGlzLmFwcGxpY2F0aW9uTG9jYXRpb25DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgZXZlbnQgcmVjZWl2ZWQgLSBwcm9wZXJ0eSBub3QgYXBwbGljYWJsZTogIiArIGFzcGVjdE5hbWUpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIERkbEdlbmVyYXRpb25UeXBlICoqKioqKioqKioKLQlwdWJsaWMgRGRsR2VuZXJhdGlvblR5cGUgZ2V0RGRsR2VuZXJhdGlvblR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRkbEdlbmVyYXRpb25UeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERkbEdlbmVyYXRpb25UeXBlKERkbEdlbmVyYXRpb25UeXBlIG5ld0RkbEdlblR5cGUpIHsKLQkJRGRsR2VuZXJhdGlvblR5cGUgb2xkID0gdGhpcy5kZGxHZW5lcmF0aW9uVHlwZTsKLQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZSA9IG5ld0RkbEdlblR5cGU7Ci0JCXRoaXMucHV0UHJvcGVydHkoRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSwgbmV3RGRsR2VuVHlwZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZLCBvbGQsIG5ld0RkbEdlblR5cGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZGxHZW5lcmF0aW9uVHlwZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3RyaW5nVmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlEZGxHZW5lcmF0aW9uVHlwZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBEZGxHZW5lcmF0aW9uVHlwZS52YWx1ZXMoKSk7Ci0JCURkbEdlbmVyYXRpb25UeXBlIG9sZCA9IHRoaXMuZGRsR2VuZXJhdGlvblR5cGU7Ci0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIERkbEdlbmVyYXRpb25UeXBlIGdldERlZmF1bHREZGxHZW5lcmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRERMX0dFTkVSQVRJT05fVFlQRTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIE91dHB1dE1vZGUgKioqKioqKioqKgotCXB1YmxpYyBPdXRwdXRNb2RlIGdldE91dHB1dE1vZGUoKSB7Ci0JCXJldHVybiB0aGlzLm91dHB1dE1vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0TW9kZShPdXRwdXRNb2RlIG5ld091dHB1dE1vZGUpIHsKLQkJT3V0cHV0TW9kZSBvbGQgPSB0aGlzLm91dHB1dE1vZGU7Ci0JCXRoaXMub3V0cHV0TW9kZSA9IG5ld091dHB1dE1vZGU7Ci0JCXRoaXMucHV0UHJvcGVydHkoT1VUUFVUX01PREVfUFJPUEVSVFksIG5ld091dHB1dE1vZGUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1VUUFVUX01PREVfUFJPUEVSVFksIG9sZCwgbmV3T3V0cHV0TW9kZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG91dHB1dE1vZGVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJT3V0cHV0TW9kZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBPdXRwdXRNb2RlLnZhbHVlcygpKTsKLQkJT3V0cHV0TW9kZSBvbGQgPSB0aGlzLm91dHB1dE1vZGU7Ci0JCXRoaXMub3V0cHV0TW9kZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgT3V0cHV0TW9kZSBnZXREZWZhdWx0T3V0cHV0TW9kZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fT1VUUFVUX01PREU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDcmVhdGVGaWxlTmFtZSAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlRmlsZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRlRmlsZU5hbWUoU3RyaW5nIG5ld0NyZWF0ZUZpbGVOYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNyZWF0ZUZpbGVOYW1lOwotCQl0aGlzLmNyZWF0ZUZpbGVOYW1lID0gbmV3Q3JlYXRlRmlsZU5hbWU7Ci0JCXRoaXMucHV0UHJvcGVydHkoQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSwgbmV3Q3JlYXRlRmlsZU5hbWUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSwgb2xkLCBuZXdDcmVhdGVGaWxlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpbGVOYW1lQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IChldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6ICgoUHJvcGVydHkpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFZhbHVlKCk7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNyZWF0ZUZpbGVOYW1lOwotCQl0aGlzLmNyZWF0ZUZpbGVOYW1lID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5nZXRBc3BlY3ROYW1lKCksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENyZWF0ZUZpbGVOYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9DUkVBVEVfRklMRV9OQU1FOwotCX0KLQotCS8vICoqKioqKioqKiogZHJvcEZpbGVOYW1lICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldERyb3BGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHJvcEZpbGVOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERyb3BGaWxlTmFtZShTdHJpbmcgbmV3RHJvcEZpbGVOYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRyb3BGaWxlTmFtZTsKLQkJdGhpcy5kcm9wRmlsZU5hbWUgPSBuZXdEcm9wRmlsZU5hbWU7Ci0JCXRoaXMucHV0UHJvcGVydHkoRFJPUF9GSUxFX05BTUVfUFJPUEVSVFksIG5ld0Ryb3BGaWxlTmFtZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChEUk9QX0ZJTEVfTkFNRV9QUk9QRVJUWSwgb2xkLCBuZXdEcm9wRmlsZU5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkcm9wRmlsZU5hbWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gKGV2ZW50LmdldE5ld1ZhbHVlKCkgPT0gbnVsbCkgPyBudWxsIDogKChQcm9wZXJ0eSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZHJvcEZpbGVOYW1lOwotCQl0aGlzLmRyb3BGaWxlTmFtZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHREcm9wRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RST1BfRklMRV9OQU1FOwotCX0KLQotCS8vICoqKioqKioqKiogYXBwbGljYXRpb25Mb2NhdGlvbiAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvbkxvY2F0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uTG9jYXRpb24oU3RyaW5nIG5ld0FwcGxpY2F0aW9uTG9jYXRpb24pIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbjsKLQkJdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uID0gbmV3QXBwbGljYXRpb25Mb2NhdGlvbjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShBUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSwgbmV3QXBwbGljYXRpb25Mb2NhdGlvbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCBuZXdBcHBsaWNhdGlvbkxvY2F0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXBwbGljYXRpb25Mb2NhdGlvbkNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgbmV3VmFsdWUgPSAoZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiAoKFByb3BlcnR5KSBldmVudC5nZXROZXdWYWx1ZSgpKS5nZXRWYWx1ZSgpOwotCQlTdHJpbmcgb2xkID0gdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uOwotCQl0aGlzLmFwcGxpY2F0aW9uTG9jYXRpb24gPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmdldEFzcGVjdE5hbWUoKSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0QXBwbGljYXRpb25Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQVBQTElDQVRJT05fTE9DQVRJT047Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvc2NoZW1hL2dlbmVyYXRpb24vT3V0cHV0TW9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvc2NoZW1hL2dlbmVyYXRpb24vT3V0cHV0TW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjI4YWE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3NjaGVtYS9nZW5lcmF0aW9uL091dHB1dE1vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uOwotCi0vKioKLSAqICBPdXRwdXRNb2RlCi0gKi8KLXB1YmxpYyBlbnVtIE91dHB1dE1vZGUgewotCWJvdGgsIAotCXNxbF9zY3JpcHQsIAotCWRhdGFiYXNlOwotCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9USCA9ICJib3RoIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRSA9ICJkYXRhYmFzZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1FMX1NDUklQVCA9ICJzcWwtc2NyaXB0IjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjMWE5My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLQotLyoqCi0gKiAgU2NoZW1hR2VuZXJhdGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUdlbmVyYXRpb24gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JRGRsR2VuZXJhdGlvblR5cGUgZ2V0RGVmYXVsdERkbEdlbmVyYXRpb25UeXBlKCk7Ci0JRGRsR2VuZXJhdGlvblR5cGUgZ2V0RGRsR2VuZXJhdGlvblR5cGUoKTsKLQl2b2lkIHNldERkbEdlbmVyYXRpb25UeXBlKERkbEdlbmVyYXRpb25UeXBlIGRkbEdlbmVyYXRpb25UeXBlKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZID0gImRkbEdlbmVyYXRpb25UeXBlUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSA9ICJlY2xpcHNlbGluay5kZGwtZ2VuZXJhdGlvbiI7Ci0JCXN0YXRpYyBmaW5hbCBEZGxHZW5lcmF0aW9uVHlwZSBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RETF9HRU5FUkFUSU9OX1RZUEUgPSBEZGxHZW5lcmF0aW9uVHlwZS5ub25lOwotCi0JT3V0cHV0TW9kZSBnZXREZWZhdWx0T3V0cHV0TW9kZSgpOwotCU91dHB1dE1vZGUgZ2V0T3V0cHV0TW9kZSgpOwotCXZvaWQgc2V0T3V0cHV0TW9kZShPdXRwdXRNb2RlIG91dHB1dE1vZGUpOyAvLyBwdXQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTU9ERV9QUk9QRVJUWSA9ICJvdXRwdXRNb2RlUHJvcGVydHkiOwotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUgPSAiZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb24ub3V0cHV0LW1vZGUiOwotCQlzdGF0aWMgZmluYWwgT3V0cHV0TW9kZSBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX09VVFBVVF9NT0RFID0gbnVsbDsJCS8vIE5vIERlZmF1bHQKLQotCVN0cmluZyBnZXREZWZhdWx0Q3JlYXRlRmlsZU5hbWUoKTsKLQlTdHJpbmcgZ2V0Q3JlYXRlRmlsZU5hbWUoKTsKLQl2b2lkIHNldENyZWF0ZUZpbGVOYW1lKFN0cmluZyBjcmVhdGVGaWxlTmFtZSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSA9ICJjcmVhdGVGaWxlTmFtZVByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NSRUFURV9GSUxFX05BTUUgPSAiZWNsaXBzZWxpbmsuY3JlYXRlLWRkbC1qZGJjLWZpbGUtbmFtZSI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9DUkVBVEVfRklMRV9OQU1FID0gImNyZWF0ZURETC5qZGJjIjsKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdERyb3BGaWxlTmFtZSgpOwotCVN0cmluZyBnZXREcm9wRmlsZU5hbWUoKTsKLQl2b2lkIHNldERyb3BGaWxlTmFtZShTdHJpbmcgZHJvcEZpbGVOYW1lKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QX0ZJTEVfTkFNRV9QUk9QRVJUWSA9ICJkcm9wRmlsZU5hbWVQcm9wZXJ0eSI7Ci0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19EUk9QX0ZJTEVfTkFNRSA9ICJlY2xpcHNlbGluay5kcm9wLWRkbC1qZGJjLWZpbGUtbmFtZSI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9EUk9QX0ZJTEVfTkFNRSA9ICJkcm9wRERMLmpkYmMiOwotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdEFwcGxpY2F0aW9uTG9jYXRpb24oKTsKLQlTdHJpbmcgZ2V0QXBwbGljYXRpb25Mb2NhdGlvbigpOwotCXZvaWQgc2V0QXBwbGljYXRpb25Mb2NhdGlvbihTdHJpbmcgYXBwbGljYXRpb25Mb2NhdGlvbik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkgPSAiYXBwbGljYXRpb25Mb2NhdGlvblByb3BlcnR5IjsKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0FQUExJQ0FUSU9OX0xPQ0FUSU9OID0gImVjbGlwc2VsaW5rLmFwcGxpY2F0aW9uLWxvY2F0aW9uIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0FQUExJQ0FUSU9OX0xPQ0FUSU9OID0gIi4iOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2RkbGdlbi9FY2xpcHNlTGlua0RETEdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2RkbGdlbi9FY2xpcHNlTGlua0RETEdlbmVyYXRvci5qYXZhCmluZGV4IDUyMDZjMWIuLjRiNzRlMGIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9kZGxnZW4vRWNsaXBzZUxpbmtERExHZW5lcmF0b3IuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZGRsZ2VuL0VjbGlwc2VMaW5rRERMR2VuZXJhdG9yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTExLDE3ICsxMSwyNSBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwogaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CkBAIC0yOSwyNCArMzcsMjggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hlc0xpc3RlbmVyMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnB0Q29yZU1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmxvZ2dpbmcuTG9nZ2luZ0xldmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uRGRsR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbi5PdXRwdXRNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvckpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZ0xldmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uRGRsR2VuZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5PdXRwdXRNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwogCiAvKioKICAqICBFY2xpcHNlTGlua0RMTEdlbmVyYXRvciBsYXVuY2hlcyB0aGUgRWNsaXBzZUxpbmsgRERMIGdlbmVyYXRvciBpbiBhIHNlcGFyYXRlIFZNLgpAQCAtNTUsMjUgKzY3LDI1IEBACiAgKiAgSXQgd2lsbCB0aGFuIGxhdW5jaCB0aGUgY29uZmlndXJhdGlvbiBjcmVhdGVkIHdpdGggdGhlIGxvZ2luIGluZm9ybWF0aW9uIGZyb20gCiAgKiAgdGhlIGN1cnJlbnQgRGFsaSBwcm9qZWN0LCBhbmQgcGFzc2VzIGl0IHRvIEVjbGlwc2VMaW5rLgogICogIAotICogIFByZS1yZXE6CisgKiAgUHJlLXJlcSBpbiBQREUgZW52aXJvbm1lbnQ6CiAgKiAgCW9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi5qYXIgaW4gRUNMSVBTRV9IT01FL3BsdWdpbnMKICAqLwogcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yCiB7Ci0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgRUNMSVBTRUxJTktfRERMX0dFTl9KQVJfVkVSU0lPTiA9ICIxLjAuMCI7CS8vJE5PTi1OTFMtMSQKKwlzdGF0aWMgcHVibGljIFN0cmluZyBFQ0xJUFNFTElOS19ERExfR0VOX0pBUl9WRVJTSU9OID0gIjEuMC4xMDAiOwkvLyROT04tTkxTLTEkCiAJc3RhdGljIHB1YmxpYyBTdHJpbmcgTEFVTkNIX0NPTkZJR19OQU1FID0gIkVjbGlwc2VMaW5rIjsgICAvLyROT04tTkxTLTEkCiAJc3RhdGljIHB1YmxpYyBTdHJpbmcgRERMX0dFTl9QQUNLQUdFX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuIjsgICAvLyROT04tTkxTLTEkCiAJc3RhdGljIHB1YmxpYyBTdHJpbmcgRUNMSVBTRUxJTktfRERMX0dFTl9DTEFTUyA9IERETF9HRU5fUEFDS0FHRV9OQU1FICsgIi5NYWluIjsJICAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgRUNMSVBTRUxJTktfRERMX0dFTl9KQVIgPSBERExfR0VOX1BBQ0tBR0VfTkFNRSArICJfIiArIEVDTElQU0VMSU5LX0RETF9HRU5fSkFSX1ZFUlNJT04gKyAiLmphciI7CS8vJE5PTi1OTFMtMSQKKwlzdGF0aWMgcHVibGljIFN0cmluZyBFQ0xJUFNFTElOS19ERExfR0VOX0pBUiA9IERETF9HRU5fUEFDS0FHRV9OQU1FICsgIl8iOwkvLyROT04tTkxTLTEkCisJc3RhdGljIHB1YmxpYyBTdHJpbmcgQlVORExFX0NMQVNTUEFUSCA9ICJCdW5kbGUtQ2xhc3NQYXRoIjsJICAvLyROT04tTkxTLTEkCiAJc3RhdGljIHB1YmxpYyBTdHJpbmcgUFJPUEVSVElFU19GSUxFX05BTUUgPSAibG9naW4ucHJvcGVydGllcyI7CSAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIEVDTElQU0VfSE9NRSA9ICJFQ0xJUFNFX0hPTUUiOwkgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBQTFVHSU5TX0RJUiA9ICJwbHVnaW5zIjsJICAvLyROT04tTkxTLTEkCisJc3RhdGljIHB1YmxpYyBTdHJpbmcgUExVR0lOU19ESVIgPSAicGx1Z2lucy8iOwkgIC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIElWTUluc3RhbGwganJlOwogCXByaXZhdGUgSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBsYXVuY2hDb25maWc7CiAJcHJpdmF0ZSBJTGF1bmNoIGxhdW5jaDsKIAkKIAlwcml2YXRlIFN0cmluZyBwdU5hbWU7Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IHByb2plY3Q7CisJcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3Q7CiAJcHJpdmF0ZSBTdHJpbmcgcHJvamVjdExvY2F0aW9uOwogCXByaXZhdGUgYm9vbGVhbiBpc0RlYnVnID0gZmFsc2U7CiAJCkBAIC04Niw0MyArOTgsMjAgQEAKIAkJbmV3IEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yKHB1TmFtZSwgcHJvamVjdCwgcHJvamVjdExvY2F0aW9uLCBtb25pdG9yKS5nZW5lcmF0ZSgpOwogCX0KIAotCXByaXZhdGUgRWNsaXBzZUxpbmtERExHZW5lcmF0b3IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcHJvamVjdExvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwlwcml2YXRlIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QganBhUHJvamVjdCwgU3RyaW5nIHByb2plY3RMb2NhdGlvbiwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogCQlzdXBlcigpOwogCQl0aGlzLnB1TmFtZSA9IHB1TmFtZTsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKwkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKIAkJdGhpcy5wcm9qZWN0TG9jYXRpb24gPSBwcm9qZWN0TG9jYXRpb247CiAJCXRoaXMuaW5pdGlhbGl6ZSgpOwogCX0KLQkKLQkvLyAqKioqKioqKioqIFF1ZXJpZXMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybSBnZXRQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLnByb2plY3QuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUxhdW5jaCBnZXRMYXVuY2goKSB7Ci0JCXJldHVybiB0aGlzLmxhdW5jaDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElMYXVuY2hNYW5hZ2VyIGdldExhdW5jaE1hbmFnZXIoKSB7Ci0JCXJldHVybiBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCX0KLQkKLQlwcml2YXRlIElWTUluc3RhbGwgZ2V0UHJvamVjdEpSRSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiBKYXZhUnVudGltZS5nZXRWTUluc3RhbGwodGhpcy5wcm9qZWN0LmdldEphdmFQcm9qZWN0KCkpOwotCX0KIAogCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgogCQogCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CiAJCXRyeSB7CiAJCQl0aGlzLmpyZSA9IHRoaXMuZ2V0UHJvamVjdEpSRSgpOwotCQkJaWYodGhpcy5qcmUgPT0gbnVsbCkgeworCQkJaWYgKHRoaXMuanJlID09IG51bGwpIHsKIAkJCQlTdHJpbmcgbWVzc2FnZSA9ICJDb3VsZCBub3QgaWRlbnRpZnkgdGhlIFZNLiI7CiAJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7CiAJCQl9CkBAIC0xMzYsMzAgKzEyNSwyNiBAQAogCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlKCkgewogCQl0aGlzLnByZUdlbmVyYXRlKCk7CiAJCVN0cmluZyBwcm9wZXJ0aWVzRmlsZSAgPSB0aGlzLnByb2plY3RMb2NhdGlvbiArICIvIiArIFBST1BFUlRJRVNfRklMRV9OQU1FOwotCQl0cnkgewotCQkJdGhpcy5pbml0aWFsaXplTGF1bmNoQ29uZmlndXJhdGlvbih0aGlzLnByb2plY3RMb2NhdGlvbiwgcHJvcGVydGllc0ZpbGUpOwotCQotCQkJdGhpcy5zYXZlTG9naW5Qcm9wZXJ0aWVzKHRoaXMucHJvamVjdExvY2F0aW9uLCBwcm9wZXJ0aWVzRmlsZSk7Ci0JCi0JCQl0aGlzLmxhdW5jaCA9IHRoaXMuc2F2ZUFuZExhdW5jaENvbmZpZygpOwotCQkJdGhpcy5hZGRMYXVuY2hMaXN0ZW5lcigpOwotCQl9IAotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQorCQkKKwkJdGhpcy5pbml0aWFsaXplTGF1bmNoQ29uZmlndXJhdGlvbih0aGlzLnByb2plY3RMb2NhdGlvbiwgcHJvcGVydGllc0ZpbGUpOworCisJCXRoaXMuc2F2ZUxvZ2luUHJvcGVydGllcyh0aGlzLnByb2plY3RMb2NhdGlvbiwgcHJvcGVydGllc0ZpbGUpOworCisJCXRoaXMuYWRkTGF1bmNoTGlzdGVuZXIoKTsKKwkJdGhpcy5sYXVuY2ggPSB0aGlzLnNhdmVBbmRMYXVuY2hDb25maWcoKTsKIAl9CiAJCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVMYXVuY2hDb25maWd1cmF0aW9uKFN0cmluZyBwcm9qZWN0TG9jYXRpb24sIFN0cmluZyBwcm9wZXJ0aWVzRmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplTGF1bmNoQ29uZmlndXJhdGlvbihTdHJpbmcgcHJvamVjdExvY2F0aW9uLCBTdHJpbmcgcHJvcGVydGllc0ZpbGUpIHsKIAogCQl0aGlzLnNwZWNpZnlKUkUodGhpcy5qcmUuZ2V0TmFtZSgpLCB0aGlzLmpyZS5nZXRWTUluc3RhbGxUeXBlKCkuZ2V0SWQoKSk7CiAJCQotCQl0aGlzLnNwZWNpZnlQcm9qZWN0KHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsgCisJCXRoaXMuc3BlY2lmeVByb2plY3QodGhpcy5qcGFQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOyAKIAkJdGhpcy5zcGVjaWZ5TWFpblR5cGUoRUNMSVBTRUxJTktfRERMX0dFTl9DTEFTUyk7CQogCQkKLQkJdGhpcy5zcGVjaWZ5UHJvZ3JhbUFyZ3VtZW50cyh0aGlzLnB1TmFtZSwgcHJvcGVydGllc0ZpbGUpOyAKKwkJdGhpcy5zcGVjaWZ5UHJvZ3JhbUFyZ3VtZW50cyh0aGlzLnB1TmFtZSwgcHJvcGVydGllc0ZpbGUpOyAgLy8gLXB1ICYgLXAKIAkJdGhpcy5zcGVjaWZ5V29ya2luZ0Rpcihwcm9qZWN0TG9jYXRpb24pOyAKIAotCQl0aGlzLnNwZWNpZnlDbGFzc3BhdGhQcm9wZXJ0aWVzKHRoaXMucHJvamVjdCwgdGhpcy5idWlsZEpkYmNKYXJQYXRoKCksIHRoaXMuYnVpbGRCb290c3RyYXBKYXJQYXRoKCkpOworCQl0aGlzLnNwZWNpZnlDbGFzc3BhdGhQcm9wZXJ0aWVzKHRoaXMuanBhUHJvamVjdCwgdGhpcy5idWlsZEpkYmNKYXJQYXRoKCksIHRoaXMuYnVpbGRCb290c3RyYXBKYXJQYXRoKCkpOwogCX0KIAkKIAlwcml2YXRlIHZvaWQgYWRkTGF1bmNoTGlzdGVuZXIoKSB7CkBAIC0xNjgsNDIgKzE1MywxMTkgQEAKIAl9CiAJCiAJcHJvdGVjdGVkIHZvaWQgcHJlR2VuZXJhdGUoKSB7Ci0JCXRoaXMucHJvamVjdC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmRpc2Nvbm5lY3QoKTsKKwkJLy9kaXNjb25uZWN0IHNpbmNlIHRoZSBydW50aW1lIHByb3ZpZGVyIHdpbGwgbmVlZCB0byBjb25uZWN0IHRvIGdlbmVyYXRlIHRoZSB0YWJsZXMKKwkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmpwYVByb2plY3QuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKKwkJaWYgKGNwICE9IG51bGwpIHsKKwkJCWNwLmRpc2Nvbm5lY3QoKTsKKwkJfQogCX0KIAkKIAlwcm90ZWN0ZWQgdm9pZCBwb3N0R2VuZXJhdGUoKSB7CiAJCXRyeSB7Ci0JCQlpZighIHRoaXMuaXNEZWJ1ZykgeworCQkJaWYgKCAhIHRoaXMuaXNEZWJ1ZykgewogCQkJCXRoaXMucmVtb3ZlTGF1bmNoQ29uZmlndXJhdGlvbihMQVVOQ0hfQ09ORklHX05BTUUpOwogCQkJfQogCQl9CiAJCWNhdGNoICggQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKIAkJfQotCQl0aGlzLnByb2plY3QuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5jb25uZWN0KCk7CisJCS8vcmVjb25uZWN0IHNpbmNlIHdlIGRpc2Nvbm5lY3RlZCBpbiBwcmVHZW5lcmF0ZSgpLCAKKwkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmpwYVByb2plY3QuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKKwkJaWYgKGNwICE9IG51bGwpIHsKKwkJCWNwLmNvbm5lY3QoKTsKKwkJfQogCQkKIAkJdGhpcy52YWxpZGF0ZVByb2plY3QoKTsKIAl9CiAKIAlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVByb2plY3QoKSB7Ci0JCSBKcGFWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IEpwYVZhbGlkYXRvcigpOwotCQkgSVByb2plY3QgcHJvamVjdCA9IHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCSBKcGFIZWxwZXIgaGVscGVyID0gbmV3IEpwYUhlbHBlcigpOwotCQkgaGVscGVyLnNldFByb2plY3QocHJvamVjdCk7CisJCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLmpwYVByb2plY3QuZ2V0UHJvamVjdCgpOworCQlWYWxpZGF0ZUpvYiBqb2IgPSBuZXcgVmFsaWRhdGVKb2IocHJvamVjdCk7CisJCWpvYi5zZXRSdWxlKHByb2plY3QpOworCQlqb2Iuc2NoZWR1bGUoKTsKKwl9CiAKLQkJIFZhbGlkYXRvckpvYiB2YWxpZGF0b3JKb2IgPSBuZXcgVmFsaWRhdG9ySm9iKHZhbGlkYXRvciwgIkpQQSBWYWxpZGF0b3IiLCAiIiwgcHJvamVjdCwgaGVscGVyKTsKLQkJIHZhbGlkYXRvckpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQkgdmFsaWRhdG9ySm9iLnNldFVzZXIodHJ1ZSk7Ci0JCSB2YWxpZGF0b3JKb2Iuc2NoZWR1bGUoKTsKKwkvKioKKwkgKiBQZXJmb3JtcyB2YWxpZGF0aW9uIGFmdGVyIHRhYmxlcyBoYXZlIGJlZW4gZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBjbGFzcyBWYWxpZGF0ZUpvYiBleHRlbmRzIEpvYiAKKwl7CQorCQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7CisJCQorCQkKKwkJcHVibGljIFZhbGlkYXRlSm9iKElQcm9qZWN0IHByb2plY3QpIHsKKwkJCXN1cGVyKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9KT0IpOworCQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKwkJfQorCQkKKwkJCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7CisJCQl0cnkgeworCQkJCVZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLnZhbGlkYXRlKAorCQkJCQluZXcgSVByb2plY3RbXSB7dGhpcy5wcm9qZWN0fSwgdHJ1ZSwgZmFsc2UsIG1vbml0b3IpOworCQkJfQorCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQlzdGF0dXMgPSBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKKwkJCX0KKwkJCXJldHVybiBzdGF0dXM7CisJCX0KIAl9CiAJCiAJcHJpdmF0ZSBJUGF0aCBidWlsZEpkYmNKYXJQYXRoKCkgewotCQlyZXR1cm4gbmV3IFBhdGgodGhpcy5wcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0RHJpdmVySmFyTGlzdCgpKTsKKwkJcmV0dXJuIG5ldyBQYXRoKHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Ecml2ZXJKYXJMaXN0KCkpOworCX0KKwkKKwlwcml2YXRlIFN0cmluZyBnZXRKcGFQcm9qZWN0Q29ubmVjdGlvbkRyaXZlckphckxpc3QoKSB7CisJCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5qcGFQcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7CisJCXJldHVybiAoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldERyaXZlckphckxpc3QoKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKIAlwcml2YXRlIElQYXRoIGJ1aWxkQm9vdHN0cmFwSmFyUGF0aCgpIHsKLQkJSVBhdGggcGF0aCA9IEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlKEVDTElQU0VfSE9NRSk7Ci0JCXJldHVybiBwYXRoLmFwcGVuZChQTFVHSU5TX0RJUikuYXBwZW5kKEVDTElQU0VMSU5LX0RETF9HRU5fSkFSKTsKKwkJdHJ5IHsKKwkJCUZpbGUgamFySW5zdGFsbERpciA9IHRoaXMuZ2V0QnVuZGxlUGFyZW50RGlyKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5QTFVHSU5fSUQpOworCisJCQlMaXN0PEZpbGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKKwkJCXRoaXMuZmluZEZpbGUoRUNMSVBTRUxJTktfRERMX0dFTl9KQVIsIGphckluc3RhbGxEaXIsIHJlc3VsdCk7CisJCQlpZiAocmVzdWx0LmlzRW1wdHkoKSkgeworCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZDogIiArIERETF9HRU5fUEFDS0FHRV9OQU1FICsgIi5qYXIgaW46ICIgKyBqYXJJbnN0YWxsRGlyKTsKKwkJCX0KKwkJCUZpbGUgZGRsR2VuSmFyRmlsZSA9IHJlc3VsdC5nZXQoMCk7CisJCQlTdHJpbmcgZGRsR2VuSmFyUGF0aCA9IGRkbEdlbkphckZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOworCQkJcmV0dXJuIG5ldyBQYXRoKGRkbEdlbkphclBhdGgpOworCQl9CisJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBmaW5kRmlsZShTdHJpbmcgZmlsZU5hbWUsIEZpbGUgZGlyZWN0b3J5LCBMaXN0PD8gc3VwZXIgRmlsZT4gbGlzdCkgeworCQlpZihkaXJlY3RvcnkubGlzdEZpbGVzKCkgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGRpcmVjdG9yeTogIiArIGRpcmVjdG9yeSk7CisJCX0KKwkJZm9yIChGaWxlIGZpbGUgOiBkaXJlY3RvcnkubGlzdEZpbGVzKCkpIHsKKwkJCWlmIChmaWxlLmdldE5hbWUoKS5zdGFydHNXaXRoKGZpbGVOYW1lKSkgeworCQkJCWxpc3QuYWRkKGZpbGUpOworCQkJfQorCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworCQkJCXRoaXMuZmluZEZpbGUoZmlsZU5hbWUsIGZpbGUsIGxpc3QpOworCQkJfQorCQl9CisJfSAKKwkKKwlwcml2YXRlIEZpbGUgZ2V0QnVuZGxlUGFyZW50RGlyKFN0cmluZyBidW5kbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCWlmIChQbGF0Zm9ybS5pbkRldmVsb3BtZW50TW9kZSgpKSB7CisJCQlMb2NhdGlvbiBlY2xpcHNlSG9tZUxvYyA9IFBsYXRmb3JtLmdldEluc3RhbGxMb2NhdGlvbigpOworCQkJU3RyaW5nIGVjbGlwc2VIb21lID0gZWNsaXBzZUhvbWVMb2MuZ2V0VVJMKCkuZ2V0UGF0aCgpOworCQkJaWYgKCAhIGVjbGlwc2VIb21lLmVuZHNXaXRoKFBMVUdJTlNfRElSKSkgeworCQkJCWVjbGlwc2VIb21lICs9IFBMVUdJTlNfRElSOworCQkJfQorCQkJcmV0dXJuIG5ldyBGaWxlKGVjbGlwc2VIb21lKTsKKwkJfQorCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOworCQlyZXR1cm4gRmlsZUxvY2F0b3IuZ2V0QnVuZGxlRmlsZShidW5kbGUpLmdldFBhcmVudEZpbGUoKTsKIAl9CiAKIAlwcml2YXRlIElMYXVuY2hlc0xpc3RlbmVyMiBidWlsZExhdW5jaExpc3RlbmVyKCkgewpAQCAtMjM0LDcgKzI5Niw3IEBACiAJCX07CiAJfQogCi0JLy8gKioqKioqKioqKiBsYXVuY2ggY29uZmlndXJhdGlvbiAqKioqKioqKioqCisJLy8gKioqKioqKioqKiBTZXR0aW5nIExhdW5jaCBDb25maWd1cmF0aW9uICoqKioqKioqKioKIAkKIAlwcml2YXRlIHZvaWQgc3BlY2lmeUpSRShTdHJpbmcganJlTmFtZSwgU3RyaW5nIHZtSWQpIHsKIApAQCAtMjU2LDMyICszMTgsMjkgQEAKIAogCQlTdHJpbmdCdWZmZXIgcHJvZ3JhbUFyZ3VtZW50cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQodGhpcy5idWlsZFB1TmFtZUFyZ3VtZW50KHB1TmFtZSkpOwotCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCh0aGlzLmJ1aWxkUHJvcGVydGllc1BhdGhBcmd1bWVudChwcm9wZXJ0aWVzUGF0aCkpOworCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCh0aGlzLmJ1aWxkUHJvcGVydGllc0ZpbGVBcmd1bWVudChwcm9wZXJ0aWVzUGF0aCkpOwogCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCh0aGlzLmJ1aWxkRGVidWdBcmd1bWVudCgpKTsKIAkJCiAJCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUywgcHJvZ3JhbUFyZ3VtZW50cy50b1N0cmluZygpKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc3BlY2lmeUNsYXNzcGF0aFByb3BlcnRpZXMoSnBhUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBqZGJjSmFyLCBJUGF0aCBib290c3RyYXBKYXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gRERMX0dFTiBqYXIKLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBib290c3RyYXBFbnRyeSA9IEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkoYm9vdHN0cmFwSmFyKTsKLQkJYm9vdHN0cmFwRW50cnkuc2V0Q2xhc3NwYXRoUHJvcGVydHkoSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5VU0VSX0NMQVNTRVMpOwotCQkvLyBEZWZhdWx0IFByb2plY3QgY2xhc3NwYXRoCi0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZGVmYXVsdEVudHJ5ID0gSmF2YVJ1bnRpbWUubmV3RGVmYXVsdFByb2plY3RDbGFzc3BhdGhFbnRyeShwcm9qZWN0LmdldEphdmFQcm9qZWN0KCkpOwotCQlkZWZhdWx0RW50cnkuc2V0Q2xhc3NwYXRoUHJvcGVydHkoSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5VU0VSX0NMQVNTRVMpOwotCQkvLyBKREJDIGphcgotCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGpkYmNFbnRyeSA9IEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkoamRiY0phcik7Ci0JCWpkYmNFbnRyeS5zZXRDbGFzc3BhdGhQcm9wZXJ0eShJUnVudGltZUNsYXNzcGF0aEVudHJ5LlVTRVJfQ0xBU1NFUyk7Ci0JCS8vIFN5c3RlbSBMaWJyYXJ5ICAKLQkJSVBhdGggc3lzdGVtTGlic1BhdGggPSBuZXcgUGF0aChKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSKTsKLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBzeXN0ZW1MaWJzRW50cnkgPSBKYXZhUnVudGltZS5uZXdSdW50aW1lQ29udGFpbmVyQ2xhc3NwYXRoRW50cnkoc3lzdGVtTGlic1BhdGgsIElSdW50aW1lQ2xhc3NwYXRoRW50cnkuU1RBTkRBUkRfQ0xBU1NFUyk7Ci0KKwlwcml2YXRlIHZvaWQgc3BlY2lmeUNsYXNzcGF0aFByb3BlcnRpZXMoSnBhUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBqZGJjSmFyLCBJUGF0aCBib290c3RyYXBKYXIpICB7CiAJCUxpc3Q8U3RyaW5nPiBjbGFzc3BhdGggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJY2xhc3NwYXRoLmFkZChib290c3RyYXBFbnRyeS5nZXRNZW1lbnRvKCkpOwotCQljbGFzc3BhdGguYWRkKGRlZmF1bHRFbnRyeS5nZXRNZW1lbnRvKCkpOwotCQljbGFzc3BhdGguYWRkKGpkYmNFbnRyeS5nZXRNZW1lbnRvKCkpOwotCQljbGFzc3BhdGguYWRkKHN5c3RlbUxpYnNFbnRyeS5nZXRNZW1lbnRvKCkpOwotCQkKKwkJdHJ5IHsKKwkJCS8vIERETF9HRU4gamFyCisJCQljbGFzc3BhdGguYWRkKHRoaXMuZ2V0QXJjaGl2ZUNsYXNzcGF0aEVudHJ5KGJvb3RzdHJhcEphcikuZ2V0TWVtZW50bygpKTsKKwkJCS8vIERlZmF1bHQgUHJvamVjdCBjbGFzc3BhdGgKKwkJCWNsYXNzcGF0aC5hZGQodGhpcy5nZXREZWZhdWx0UHJvamVjdENsYXNzcGF0aEVudHJ5KHByb2plY3QuZ2V0SmF2YVByb2plY3QoKSkuZ2V0TWVtZW50bygpKTsKKwkJCS8vIE9zZ2kgQnVuZGxlcworCQkJY2xhc3NwYXRoLmFkZEFsbCh0aGlzLmdldFBlcnNpc3RlbmNlT3NnaUJ1bmRsZXNNZW1lbnRvKCkpOworCQkJLy8gSkRCQyBqYXIKKwkJCWNsYXNzcGF0aC5hZGQodGhpcy5nZXRBcmNoaXZlQ2xhc3NwYXRoRW50cnkoamRiY0phcikuZ2V0TWVtZW50bygpKTsKKwkJCS8vIFN5c3RlbSBMaWJyYXJ5ICAKKwkJCWNsYXNzcGF0aC5hZGQodGhpcy5nZXRTeXN0ZW1MaWJyYXJ5Q2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOworCQl9CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBbiBlcnJvciBvY2N1cnMgZ2VuZXJhdGluZyBhIG1lbWVudG8iLCBlKTsKKwkJfQogCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ0xBU1NQQVRILCBjbGFzc3BhdGgpOwogCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVGQVVMVF9DTEFTU1BBVEgsIGZhbHNlKTsKIAl9CkBAIC0yOTEsMTEgKzM1MCw1NyBAQAogCQlGaWxlIHdvcmtpbmdEaXIgPSBuZXcgUGF0aChwcm9qZWN0TG9jYXRpb24pLnRvRmlsZSgpOwogCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksIHdvcmtpbmdEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwogCX0KKworCS8vICoqKioqKioqKiogQ2xhc3NwYXRoRW50cnkgKioqKioqKioqKgogCQotCXByaXZhdGUgSUxhdW5jaCBzYXZlQW5kTGF1bmNoQ29uZmlnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gdGhpcy5sYXVuY2hDb25maWcuZG9TYXZlKCk7CisJcHJpdmF0ZSBJUnVudGltZUNsYXNzcGF0aEVudHJ5IGdldFN5c3RlbUxpYnJhcnlDbGFzc3BhdGhFbnRyeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlJUGF0aCBzeXN0ZW1MaWJzUGF0aCA9IG5ldyBQYXRoKEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIpOworCQlyZXR1cm4gSmF2YVJ1bnRpbWUubmV3UnVudGltZUNvbnRhaW5lckNsYXNzcGF0aEVudHJ5KHN5c3RlbUxpYnNQYXRoLCBJUnVudGltZUNsYXNzcGF0aEVudHJ5LlNUQU5EQVJEX0NMQVNTRVMpOworCX0KKwkKKwlwcml2YXRlIElSdW50aW1lQ2xhc3NwYXRoRW50cnkgZ2V0RGVmYXVsdFByb2plY3RDbGFzc3BhdGhFbnRyeShJSmF2YVByb2plY3QgcHJvamVjdCkgeworCisJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgcHJvamVjdEVudHJ5ID0gSmF2YVJ1bnRpbWUubmV3RGVmYXVsdFByb2plY3RDbGFzc3BhdGhFbnRyeShwcm9qZWN0KTsKKwkJcHJvamVjdEVudHJ5LnNldENsYXNzcGF0aFByb3BlcnR5KElSdW50aW1lQ2xhc3NwYXRoRW50cnkuVVNFUl9DTEFTU0VTKTsKIAkJCi0JCXJldHVybiBjb25maWd1cmF0aW9uLmxhdW5jaChJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCXJldHVybiBwcm9qZWN0RW50cnk7CisJfQorCQorCXByaXZhdGUgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBnZXRBcmNoaXZlQ2xhc3NwYXRoRW50cnkoSVBhdGggYXJjaGl2ZVBhdGgpIHsKKworCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGFyY2hpdmVFbnRyeSA9IEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkoYXJjaGl2ZVBhdGgpOworCQlhcmNoaXZlRW50cnkuc2V0Q2xhc3NwYXRoUHJvcGVydHkoSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5VU0VSX0NMQVNTRVMpOworCQkKKwkJcmV0dXJuIGFyY2hpdmVFbnRyeTsKKwl9CisJCisJcHJpdmF0ZSBJUnVudGltZUNsYXNzcGF0aEVudHJ5IGdldEJ1bmRsZUNsYXNzcGF0aEVudHJ5KFN0cmluZyBidW5kbGVJZCkgeworCisJCUlQYXRoIHBlcnNpc3RDbGFzc3BhdGggPSB0aGlzLmdldEJ1bmRsZUNsYXNzcGF0aChidW5kbGVJZCk7CisJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgYnVuZGxlRW50cnkgPSB0aGlzLmdldEFyY2hpdmVDbGFzc3BhdGhFbnRyeShwZXJzaXN0Q2xhc3NwYXRoKTsKKwkJCisJCXJldHVybiBidW5kbGVFbnRyeTsKKwl9CisKKwkvLyAqKioqKioqKioqIExhdW5jaENvbmZpZyAqKioqKioqKioqCisJCisJcHJpdmF0ZSBJTGF1bmNoIHNhdmVBbmRMYXVuY2hDb25maWcoKSB7CisJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBudWxsOworCQlJTGF1bmNoIHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQljb25maWd1cmF0aW9uID0gdGhpcy5sYXVuY2hDb25maWcuZG9TYXZlKCk7CisJCX0KKwkJY2F0Y2ggKENvcmVFeGNlcHRpb24gc2F2ZUV4Y2VwdGlvbikgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBzYXZlIExhdW5jaENvbmZpZyIsIHNhdmVFeGNlcHRpb24pOworCQl9CisJCSB0cnkgeworCQkJcmVzdWx0ID0gY29uZmlndXJhdGlvbi5sYXVuY2goSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworCQl9CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGxhdWNoRXhjZXB0aW9uKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgbGF1bmNoIiwgbGF1Y2hFeGNlcHRpb24pOworCQl9CisJCXJldHVybiByZXN1bHQ7CiAJfQogCiAJcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGJ1aWxkTGF1bmNoQ29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKQEAgLTM0MSwyNyArNDQ2LDM2IEBACiAJCQlPdXRwdXRNb2RlLkRBVEFCQVNFKTsKIAl9CiAJCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTG9naW5Qcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOworCXByaXZhdGUgdm9pZCBidWlsZENvbm5lY3Rpb25Qcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgeworCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuanBhUHJvamVjdC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwogCiAJCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywgIAogCQkJQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlMsCiAJCQkiZmFsc2UiKTsKIAkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLCAKIAkJCUNvbm5lY3Rpb24uRUNMSVBTRUxJTktfRFJJVkVSLAotCQkJcHJvZmlsZS5nZXREcml2ZXJDbGFzc05hbWUoKSk7CisJCQkoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldERyaXZlckNsYXNzTmFtZSgpKTsKIAkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAogCQkJQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19VUkwsCi0JCQlwcm9maWxlLmdldFVybCgpKTsKKwkJCShjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VVJMKCkpOwogCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCiAJCQlDb25uZWN0aW9uLkVDTElQU0VMSU5LX1VTRVIsCi0JCQlwcm9maWxlLmdldFVzZXJOYW1lKCkpOworCQkJKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVc2VyTmFtZSgpKTsKIAkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAogCQkJQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19QQVNTV09SRCwKLQkJCXByb2ZpbGUuZ2V0VXNlclBhc3N3b3JkKCkpOworCQkJKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVc2VyUGFzc3dvcmQoKSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBidWlsZENvbm5lY3Rpb25Qb29saW5nUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKKwkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAorCQkJQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRCwKKwkJCSJ0cnVlIik7CisJfQorCQorCXByaXZhdGUgdm9pZCBidWlsZExvZ2dpbmdQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewogCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCiAJCQlMb2dnaW5nLkVDTElQU0VMSU5LX0xFVkVMLAotCQkJTG9nZ2luZ0xldmVsLkZJTkVTVCk7CisJCQlMb2dnaW5nTGV2ZWwuRklORSk7CiAJCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKIAkJCUxvZ2dpbmcuRUNMSVBTRUxJTktfVElNRVNUQU1QLAogCQkJImZhbHNlIik7CkBAIC0zNzQsNiArNDg4LDkgQEAKIAkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAogCQkJTG9nZ2luZy5FQ0xJUFNFTElOS19FWENFUFRJT05TLAogCQkJInRydWUiKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGJ1aWxkQ3VzdG9taXphdGlvblByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7CiAJCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKIAkJCUN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUywKIAkJCSJ0cnVlIik7CkBAIC0zODYsMTQgKzUwMywyMiBAQAogCXByaXZhdGUgdm9pZCBzYXZlTG9naW5Qcm9wZXJ0aWVzKFN0cmluZyBwcm9qZWN0TG9jYXRpb24sIFN0cmluZyBwcm9wZXJ0aWVzRmlsZSkgewogCQlQcm9wZXJ0aWVzIGVsUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAJCQotCQl0aGlzLmJ1aWxkTG9naW5Qcm9wZXJ0aWVzKGVsUHJvcGVydGllcyk7CisJCXRoaXMuYnVpbGRDb25uZWN0aW9uUHJvcGVydGllcyhlbFByb3BlcnRpZXMpOworCQkKKwkJdGhpcy5idWlsZENvbm5lY3Rpb25Qb29saW5nUHJvcGVydGllcyhlbFByb3BlcnRpZXMpOworCQkKKwkJdGhpcy5idWlsZExvZ2dpbmdQcm9wZXJ0aWVzKGVsUHJvcGVydGllcyk7CisJCQorCQl0aGlzLmJ1aWxkQ3VzdG9taXphdGlvblByb3BlcnRpZXMoZWxQcm9wZXJ0aWVzKTsKIAkJCiAJCXRoaXMuYnVpbGRERExNb2RlUHJvcGVydGllcyhlbFByb3BlcnRpZXMpOwogCiAJCXRoaXMuYnVpbGRQcm9qZWN0TG9jYXRpb25Qcm9wZXJ0eShlbFByb3BlcnRpZXMsIHByb2plY3RMb2NhdGlvbik7CiAJICAgIHRyeSB7CiAJICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwcm9wZXJ0aWVzRmlsZSk7Ci0JICAgICAgICBmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKKwkJCWlmICghZmlsZS5leGlzdHMoKSAmJiAhIGZpbGUuY3JlYXRlTmV3RmlsZSgpKSB7CisJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNyZWF0ZU5ld0ZpbGUoKSBmYWlsZWQ6ICIgKyBmaWxlKTsgLy8kTk9OLU5MUy0xJAorCQkJfQogCSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKIAkgICAgICAgIGVsUHJvcGVydGllcy5zdG9yZShzdHJlYW0sIG51bGwpOwogCQkgICAgc3RyZWFtLmNsb3NlKCk7CkBAIC00MTAsMTEgKzUzNSwxMDggQEAKIAkJcmV0dXJuICIgLXB1IFwiIiArIHB1TmFtZSArICJcIiI7CiAJfQogCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkUHJvcGVydGllc1BhdGhBcmd1bWVudChTdHJpbmcgcHJvcGVydGllc0ZpbGUpIHsKKwlwcml2YXRlIFN0cmluZyBidWlsZFByb3BlcnRpZXNGaWxlQXJndW1lbnQoU3RyaW5nIHByb3BlcnRpZXNGaWxlKSB7CiAJCXJldHVybiAiIC1wIFwiIiArIHByb3BlcnRpZXNGaWxlICsgIlwiIjsKIAl9CiAJCiAJcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWJ1Z0FyZ3VtZW50KCkgewogCQlyZXR1cm4gKHRoaXMuaXNEZWJ1ZykgPyAiIC1kZWJ1ZyIgOiAiIjsKIAl9CisJCisJLy8gKioqKioqKioqKiBRdWVyaWVzICoqKioqKioqKioKKwkKKwlwcm90ZWN0ZWQgSnBhUGxhdGZvcm0gZ2V0UGxhdGZvcm0oKSB7CisJCXJldHVybiB0aGlzLmpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKTsKKwl9CisJCisJcHJvdGVjdGVkIElMYXVuY2ggZ2V0TGF1bmNoKCkgeworCQlyZXR1cm4gdGhpcy5sYXVuY2g7CisJfQorCQorCXByb3RlY3RlZCBJTGF1bmNoTWFuYWdlciBnZXRMYXVuY2hNYW5hZ2VyKCkgeworCQlyZXR1cm4gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKKwl9CisJCisJcHJpdmF0ZSBJVk1JbnN0YWxsIGdldFByb2plY3RKUkUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXJldHVybiBKYXZhUnVudGltZS5nZXRWTUluc3RhbGwodGhpcy5qcGFQcm9qZWN0LmdldEphdmFQcm9qZWN0KCkpOworCX0KKworCS8vICoqKioqKioqKiogQnVuZGxlcyAqKioqKioqKioKKworCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFBlcnNpc3RlbmNlT3NnaUJ1bmRsZXNNZW1lbnRvKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWlmIChqYXZheFBlcnNpc3RlbmNlQnVuZGxlRXhpc3RzKCkpIHsKKwkJCXJlc3VsdC5hZGQodGhpcy5nZXRCdW5kbGVDbGFzc3BhdGhFbnRyeShKQVZBWF9QRVJTSVNURU5DRV9CVU5ETEUpLmdldE1lbWVudG8oKSk7CisJCQlyZXN1bHQuYWRkKHRoaXMuZ2V0QnVuZGxlQ2xhc3NwYXRoRW50cnkoT1JHX0VDTElQU0VfUEVSU0lTVEVOQ0VfQ09SRV9CVU5ETEUpLmdldE1lbWVudG8oKSk7CisJCQlyZXN1bHQuYWRkKHRoaXMuZ2V0QnVuZGxlQ2xhc3NwYXRoRW50cnkoT1JHX0VDTElQU0VfUEVSU0lTVEVOQ0VfQVNNX0JVTkRMRSkuZ2V0TWVtZW50bygpKTsKKwkJCXJlc3VsdC5hZGQodGhpcy5nZXRCdW5kbGVDbGFzc3BhdGhFbnRyeShPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9BTlRMUl9CVU5ETEUpLmdldE1lbWVudG8oKSk7CisJCQlyZXN1bHQuYWRkKHRoaXMuZ2V0QnVuZGxlQ2xhc3NwYXRoRW50cnkoT1JHX0VDTElQU0VfUEVSU0lTVEVOQ0VfSlBBX0JVTkRMRSkuZ2V0TWVtZW50bygpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwlwcml2YXRlIElQYXRoIGdldEJ1bmRsZUNsYXNzcGF0aChTdHJpbmcgcGx1Z2luSUQpIHsKKwkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JRCk7CisJCWlmIChidW5kbGUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24ocGx1Z2luSUQgKyAiIGNhbm5vdCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgUGxhdGZvcm0iKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5nZXRDbGFzc1BhdGgoYnVuZGxlKTsKKwl9CisKKwlwcml2YXRlIElQYXRoIGdldENsYXNzUGF0aChCdW5kbGUgYnVuZGxlKSB7CisJCVN0cmluZyBwYXRoID0gKFN0cmluZykgYnVuZGxlLmdldEhlYWRlcnMoKS5nZXQoQlVORExFX0NMQVNTUEFUSCk7CisJCWlmIChwYXRoID09IG51bGwpIHsKKwkJCXBhdGggPSAiLiI7CisJCX0KKwkJTWFuaWZlc3RFbGVtZW50W10gZWxlbWVudHMgPSBudWxsOworCQl0cnkgeworCQkJZWxlbWVudHMgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VIZWFkZXIoQlVORExFX0NMQVNTUEFUSCwgcGF0aCk7CisJCX0KKwkJY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBidW5kbGUgaGVhZGVyOiAiICsgYnVuZGxlLCBlKTsKKwkJfQorCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkgeworCQkJCU1hbmlmZXN0RWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07CisJCQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRWYWx1ZSgpOworCQkJCWlmICgiLiIuZXF1YWxzKHZhbHVlKSkgeworCQkJCQl2YWx1ZSA9ICIvIjsJCS8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJVVJMIHVybCA9IGJ1bmRsZS5nZXRFbnRyeSh2YWx1ZSk7CisJCQkJaWYgKHVybCAhPSBudWxsKSB7CisJCQkJCXRyeSB7CisJCQkJCQlVUkwgcmVzb2x2ZWRVUkwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7CisJCQkJCQlTdHJpbmcgZmlsZXN0cmluZyA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChyZXNvbHZlZFVSTCkuZ2V0RmlsZSgpOworCQkgICAgICAgICAgICAgICAgaWYgKGZpbGVzdHJpbmcuc3RhcnRzV2l0aCgiZmlsZToiKSkgewkvLyROT04tTkxTLTEkCisJCSAgICAgICAgICAgICAgICAJZmlsZXN0cmluZyA9IGZpbGVzdHJpbmcuc3Vic3RyaW5nKGZpbGVzdHJpbmcuaW5kZXhPZignOicpICsgMSk7CisJCSAgICAgICAgICAgICAgICB9CisJCSAgICAgICAgICAgICAgICBpZiAoZmlsZXN0cmluZy5lbmRzV2l0aCgiIS8iKSkgewkJLy8kTk9OLU5MUy0xJAorCQkgICAgICAgICAgICAgICAgCWZpbGVzdHJpbmcgPSBmaWxlc3RyaW5nLnN1YnN0cmluZygwLCBmaWxlc3RyaW5nLmxhc3RJbmRleE9mKCchJykpOworCQkgICAgICAgICAgICAgICAgfQorCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZXN0cmluZyk7CisJCQkJCQlTdHJpbmcgZmlsZVBhdGggPSBmaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKKwkJCQkJCXJldHVybiBuZXcgUGF0aChmaWxlUGF0aCk7CisJCQkJCX0KKwkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciBsb2NhdGluZyBidW5kbGU6ICIgKyBidW5kbGUsIGUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gamF2YXhQZXJzaXN0ZW5jZUJ1bmRsZUV4aXN0cygpIHsKKwkJcmV0dXJuIFBsYXRmb3JtLmdldEJ1bmRsZShKQVZBWF9QRVJTSVNURU5DRV9CVU5ETEUpICE9IG51bGw7CisJfQorCisJLy8gKioqKioqKioqKiBjb25zdGFudHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX1BFUlNJU1RFTkNFX0JVTkRMRSA9ICJqYXZheC5wZXJzaXN0ZW5jZSI7CQkJCQkvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR19FQ0xJUFNFX1BFUlNJU1RFTkNFX0NPUkVfQlVORExFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvcmUiOwkvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR19FQ0xJUFNFX1BFUlNJU1RFTkNFX0FTTV9CVU5ETEUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYXNtIjsJLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9BTlRMUl9CVU5ETEUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW50bHIiOwkvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR19FQ0xJUFNFX1BFUlNJU1RFTkNFX0pQQV9CVU5ETEUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhIjsJLy8kTk9OLU5MUy0xJAorCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4MDZkZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0VjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKKwlleHRlbmRzIE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyCit7CisJLyoqCisJICogcmVxdWlyZWQgZGVmYXVsdCBjb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhGSUxFX1BBVEgpKSB7CisJCQlyZXR1cm4gbmV3IFBhdGgoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9GSUxFX1BBVEgpLnRvUG9ydGFibGVTdHJpbmcoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZlcnNpb24oKSB7CisJCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpLmdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoCisJCQkJSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKS5nZXRWZXJzaW9uKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGZpbGVWZXJzaW9uU3VwcG9ydGVkKFN0cmluZyBmaWxlVmVyc2lvbikgeworCQlyZXR1cm4gZmlsZVZlcnNpb24uZXF1YWxzKEVjbGlwc2VMaW5rLlNDSEVNQV9WRVJTSU9OKQorCQkJCXx8IGZpbGVWZXJzaW9uLmVxdWFscyhFY2xpcHNlTGluazFfMS5TQ0hFTUFfVkVSU0lPTikKKwkJCQl8fCBmaWxlVmVyc2lvbi5lcXVhbHMoRWNsaXBzZUxpbmsyXzAuU0NIRU1BX1ZFUlNJT04pOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBmaWxlVmVyc2lvblN1cHBvcnRlZEZvckZhY2V0VmVyc2lvbihTdHJpbmcgZmlsZVZlcnNpb24sIFN0cmluZyBqcGFGYWNldFZlcnNpb24pIHsKKwkJLy8gYXNzdW1lIHRoYXQgcGxhdGZvcm0gaGFzIGJlZW4gcG9saWNlZCBmb3IgZmFjZXQgdmVyc2lvbiBhbHJlYWR5CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHBvcnRlZFBsYXRmb3JtSWQoU3RyaW5nIGlkKSB7CisJCXJldHVybiBpZC5lcXVhbHMoRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVByb3ZpZGVyLklEKSAKKwkJCQl8fCBpZC5lcXVhbHMoRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVByb3ZpZGVyLklEKQorCQkJCXx8IGlkLmVxdWFscyhFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuSUQpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0VjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZDg4ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5BYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbiBleHRlbmRzIE9ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbgoreworCXB1YmxpYyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgeworCQlzdXBlcihkYXRhTW9kZWwpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyIGdldFhtbFJlc291cmNlUHJvdmlkZXIoSUZpbGUgZmlsZSkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyLmdldFhtbFJlc291cmNlUHJvdmlkZXIoZmlsZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNDEwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQmFzaWNDb2xsZWN0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKKwl9CisJCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYjM5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5CYXNpY01hcAorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKKwl9CisJCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTc4MDEzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIChUeXBlKSBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBOdWxsRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTEyMDc0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DaGFuZ2VUcmFja2luZworICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIChUeXBlKSBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmE0NjliCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0CisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWY3ZTRiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0ZXIKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOTkyODcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkN1c3RvbWl6ZXIKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24ocGFyZW50LCAoVHlwZSkgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZDRhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkV4aXN0ZW5jZUNoZWNraW5nCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgKFR5cGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzRhZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkpvaW5GZXRjaAorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IE51bGxFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI2OWZiZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuTXV0YWJsZQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODA4ZGNhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcgorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDA2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Qcml2YXRlT3duZWQKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbihwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyMTY1MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlJlYWRPbmx5CisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbihwYXJlbnQsIChUeXBlKSBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZGM0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzcwZjFlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5TdHJ1Y3RDb252ZXJ0ZXIKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwODM2MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlRyYW5zZm9ybWF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBOdWxsRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NTUyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKHBhcmVudCwgbWVtYmVyKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWE5OWUwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5WYXJpYWJsZU9uZVRvT25lCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbgorCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIG1lbWJlcik7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IE51bGxFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk5M2E4ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuV3JpdGVUcmFuc2Zvcm1lcgorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24KKwlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBtZW1iZXIpOworCX0KKworCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMmViNjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZQorICovCitwdWJsaWMgY2xhc3MgTnVsbEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uCisJZXh0ZW5kcyBOdWxsQW5ub3RhdGlvbgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24KK3sKKworCXByb3RlY3RlZCBOdWxsRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOworCX0KKworCS8vICoqKioqIHR5cGUKKwlwdWJsaWMgQ2FjaGVUeXBlIGdldFR5cGUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoQ2FjaGVUeXBlIHR5cGUpIHsKKwkJaWYgKHR5cGUgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VHlwZSh0eXBlKTsKKwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvLyAqKioqKiBzaXplCisJcHVibGljIEludGVnZXIgZ2V0U2l6ZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2l6ZShJbnRlZ2VyIHNpemUpIHsKKwkJaWYgKHNpemUgIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0U2l6ZShzaXplKTsKKwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2l6ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvLyAqKioqKiBzaGFyZWQKKwlwdWJsaWMgQm9vbGVhbiBnZXRTaGFyZWQoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNoYXJlZChCb29sZWFuIHNoYXJlZCkgeworCQlpZiAoc2hhcmVkICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFNoYXJlZChzaGFyZWQpOworCQl9CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRTaGFyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLy8gKioqKiogZXhwaXJ5CisJcHVibGljIEludGVnZXIgZ2V0RXhwaXJ5KCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFeHBpcnkoSW50ZWdlciBleHBpcnkpIHsKKwkJaWYgKGV4cGlyeSAhPSBudWxsKSB7CisJCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRFeHBpcnkoZXhwaXJ5KTsKKwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8vICoqKioqIGV4cGlyeSB0aW1lIG9mIGRheQorCXB1YmxpYyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZ2V0RXhwaXJ5VGltZU9mRGF5KCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGFkZEV4cGlyeVRpbWVPZkRheSgpIHsKKwkJcmV0dXJuIHRoaXMuYWRkQW5ub3RhdGlvbigpLmFkZEV4cGlyeVRpbWVPZkRheSgpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheSgpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGltZU9mRGF5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8vICoqKioqIGFsd2F5cyByZWZyZXNoCisJcHVibGljIEJvb2xlYW4gZ2V0QWx3YXlzUmVmcmVzaCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuIGFsd2F5c1JlZnJlc2gpIHsKKwkJaWYgKGFsd2F5c1JlZnJlc2ggIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0QWx3YXlzUmVmcmVzaChhbHdheXNSZWZyZXNoKTsKKwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QWx3YXlzUmVmcmVzaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvLyAqKioqKiByZWZyZXNoIG9ubHkgaWYgbmV3ZXIKKwlwdWJsaWMgQm9vbGVhbiBnZXRSZWZyZXNoT25seUlmTmV3ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgeworCQlpZiAocmVmcmVzaE9ubHlJZk5ld2VyICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihyZWZyZXNoT25seUlmTmV3ZXIpOworCQl9CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRSZWZyZXNoT25seUlmTmV3ZXJUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLy8gKioqKiogZGlzYWJsZSBoaXRzCisJcHVibGljIEJvb2xlYW4gZ2V0RGlzYWJsZUhpdHMoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldERpc2FibGVIaXRzKEJvb2xlYW4gZGlzYWJsZUhpdHMpIHsKKwkJaWYgKGRpc2FibGVIaXRzICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldERpc2FibGVIaXRzKGRpc2FibGVIaXRzKTsKKwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RGlzYWJsZXNIaXRzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8vICoqKioqIGNvb3JkaW5hdGlvbiB0eXBlCisJcHVibGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRDb29yZGluYXRpb25UeXBlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKSB7CisJCWlmIChjb29yZGluYXRpb25UeXBlICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldENvb3JkaW5hdGlvblR5cGUoY29vcmRpbmF0aW9uVHlwZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENvb3JkaW5hdGlvblR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0ZTQyYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZTsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Kb2luRmV0Y2gKKyAqLworcHVibGljIGNsYXNzIE51bGxFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24KKwlleHRlbmRzIE51bGxBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24KK3sKKwlwcm90ZWN0ZWQgTnVsbEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOworCX0KKworCS8vICoqKioqIHZhbHVlCisJcHVibGljIEpvaW5GZXRjaFR5cGUgZ2V0VmFsdWUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKEpvaW5GZXRjaFR5cGUgdmFsdWUpIHsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFZhbHVlKHZhbHVlKTsKKwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOGYwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHJhbnNmb3JtYXRpb24KKyAqLworcHVibGljIGNsYXNzIE51bGxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbgorCWV4dGVuZHMgTnVsbEFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCit7CQorCXByb3RlY3RlZCBOdWxsRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOworCX0KKworCS8vICoqKioqIGZldGNoCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCkgeworCQlpZiAoZmV0Y2ggIT0gbnVsbCkgeworCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0RmV0Y2goZmV0Y2gpOworCQl9CQkJCQorCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvLyAqKioqKiBvcHRpb25hbAorCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKSB7CisJCWlmIChvcHRpb25hbCAhPSBudWxsKSB7CisJCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRPcHRpb25hbChvcHRpb25hbCk7CisJCX0JCQkJCisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhM2ZlODMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5WYXJpYWJsZU9uZVRvT25lCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbgorCWV4dGVuZHMgTnVsbEFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24KK3sJCisJcHJvdGVjdGVkIE51bGxFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKKwkJcmV0dXJuIChFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uKSBzdXBlci5hZGRBbm5vdGF0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckNvbHVtbkFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzVlNjBjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckNvbHVtbkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxDb2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb247CisKKy8qKgorICogamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQ29sdW1uQW5ub3RhdGlvbgorCWV4dGVuZHMgTnVsbENvbHVtbkFubm90YXRpb24KK3sJCisJcHVibGljIE51bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJcHJpdmF0ZSBFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIGdldFdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIHRoaXMucGFyZW50OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29sdW1uQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5nZXRXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbigpLmFkZENvbHVtbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkZGU4ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk9iamVjdFR5cGVDb252ZXJ0ZXIKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlR5cGVDb252ZXJ0ZXIKKyAqLworYWJzdHJhY3QgY2xhc3MgQmluYXJ5QmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgoreworCVN0cmluZyBkYXRhVHlwZTsKKwlTdHJpbmcgb2JqZWN0VHlwZTsKKworCisJQmluYXJ5QmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5kYXRhVHlwZSA9IHRoaXMuYnVpbGREYXRhVHlwZSgpOworCQl0aGlzLm9iamVjdFR5cGUgPSB0aGlzLmJ1aWxkT2JqZWN0VHlwZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0RGF0YVR5cGVfKHRoaXMuYnVpbGREYXRhVHlwZSgpKTsKKwkJdGhpcy5zZXRPYmplY3RUeXBlXyh0aGlzLmJ1aWxkT2JqZWN0VHlwZSgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogZGF0YSB0eXBlCisJcHVibGljIFN0cmluZyBnZXREYXRhVHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuZGF0YVR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIGRhdGFUeXBlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXREYXRhVHlwZV8oU3RyaW5nIGRhdGFUeXBlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmRhdGFUeXBlOworCQl0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1RZUEVfUFJPUEVSVFksIG9sZCwgZGF0YVR5cGUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGF0YVR5cGUoKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0RGF0YVR5cGVFbGVtZW50TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldERhdGFUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCWFic3RyYWN0IFN0cmluZyBnZXREYXRhVHlwZUVsZW1lbnROYW1lKCk7CisKKwkvLyAqKioqKiBvYmplY3QgdHlwZQorCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBvYmplY3RUeXBlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRPYmplY3RUeXBlXyhTdHJpbmcgb2JqZWN0VHlwZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5vYmplY3RUeXBlOworCQl0aGlzLm9iamVjdFR5cGUgPSBvYmplY3RUeXBlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfUFJPUEVSVFksIG9sZCwgb2JqZWN0VHlwZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRPYmplY3RUeXBlKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldE9iamVjdFR5cGVFbGVtZW50TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE9iamVjdFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJYWJzdHJhY3QgU3RyaW5nIGdldE9iamVjdFR5cGVFbGVtZW50TmFtZSgpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzNDdhOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQmFzaWNDb2xsZWN0aW9uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbgoreworCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTk1YzJmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQmFzaWNNYXAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbgoreworCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZmE1OGIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBDYWNoZVR5cGUgdHlwZTsKKwlwcml2YXRlIEludGVnZXIgc2l6ZTsKKwlwcml2YXRlIEJvb2xlYW4gc2hhcmVkOworCXByaXZhdGUgSW50ZWdlciBleHBpcnk7CisJcHJpdmF0ZSBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZXhwaXJ5VGltZU9mRGF5OworCXByaXZhdGUgQm9vbGVhbiBhbHdheXNSZWZyZXNoOworCXByaXZhdGUgQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXI7CisJcHJpdmF0ZSBCb29sZWFuIGRpc2FibGVIaXRzOworCXByaXZhdGUgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGU7CisKKworCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy50eXBlID0gdGhpcy5idWlsZFR5cGUoKTsKKwkJdGhpcy5zaXplID0gdGhpcy5idWlsZFNpemUoKTsKKwkJdGhpcy5zaGFyZWQgPSB0aGlzLmJ1aWxkU2hhcmVkKCk7CisJCXRoaXMuZXhwaXJ5ID0gdGhpcy5idWlsZEV4cGlyeSgpOworCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IHRoaXMuYnVpbGRFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJdGhpcy5hbHdheXNSZWZyZXNoID0gdGhpcy5idWlsZEFsd2F5c1JlZnJlc2goKTsKKwkJdGhpcy5yZWZyZXNoT25seUlmTmV3ZXIgPSB0aGlzLmJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyKCk7CisJCXRoaXMuZGlzYWJsZUhpdHMgPSB0aGlzLmJ1aWxkRGlzYWJsZUhpdHMoKTsKKwkJdGhpcy5jb29yZGluYXRpb25UeXBlID0gdGhpcy5idWlsZENvb3JkaW5hdGlvblR5cGUoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCS8vIFRPRE8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFR5cGVfKHRoaXMuYnVpbGRUeXBlKCkpOworCQl0aGlzLnNldFNpemVfKHRoaXMuYnVpbGRTaXplKCkpOworCQl0aGlzLnNldFNoYXJlZF8odGhpcy5idWlsZFNoYXJlZCgpKTsKKwkJdGhpcy5zZXRFeHBpcnlfKHRoaXMuYnVpbGRFeHBpcnkoKSk7CisJCXRoaXMudXBkYXRlRXhwaXJ5VGltZU9mRGF5KCk7CisJCXRoaXMuc2V0QWx3YXlzUmVmcmVzaF8odGhpcy5idWlsZEFsd2F5c1JlZnJlc2goKSk7CisJCXRoaXMuc2V0UmVmcmVzaE9ubHlJZk5ld2VyXyh0aGlzLmJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQl0aGlzLnNldERpc2FibGVIaXRzXyh0aGlzLmJ1aWxkRGlzYWJsZUhpdHMoKSk7CisJCXRoaXMuc2V0Q29vcmRpbmF0aW9uVHlwZV8odGhpcy5idWlsZENvb3JkaW5hdGlvblR5cGUoKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIENhY2hlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiB0eXBlCisJcHVibGljIENhY2hlVHlwZSBnZXRUeXBlKCkgeworCQlyZXR1cm4gdGhpcy50eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoQ2FjaGVUeXBlIHR5cGUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFR5cGVfKENhY2hlVHlwZSB0eXBlKSB7CisJCUNhY2hlVHlwZSBvbGQgPSB0aGlzLnR5cGU7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOworCX0KKworCXByaXZhdGUgQ2FjaGVUeXBlIGJ1aWxkVHlwZSgpIHsKKwkJcmV0dXJuIENhY2hlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19UWVBFKSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIHNpemUKKwlwdWJsaWMgSW50ZWdlciBnZXRTaXplKCkgeworCQlyZXR1cm4gdGhpcy5zaXplOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNpemUoSW50ZWdlciBzaXplKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRTaXplXyhJbnRlZ2VyIHNpemUpIHsKKwkJSW50ZWdlciBvbGQgPSB0aGlzLnNpemU7CisJCXRoaXMuc2l6ZSA9IHNpemU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSVpFX1BST1BFUlRZLCBvbGQsIHNpemUpOworCX0KKworCXByaXZhdGUgSW50ZWdlciBidWlsZFNpemUoKSB7CisJCXJldHVybiAoSW50ZWdlcikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DQUNIRV9fU0laRSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRTaXplVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIHNoYXJlZAorCXB1YmxpYyBCb29sZWFuIGdldFNoYXJlZCgpIHsKKwkJcmV0dXJuIHRoaXMuc2hhcmVkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNoYXJlZChCb29sZWFuIHNoYXJlZCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0U2hhcmVkXyhCb29sZWFuIHNoYXJlZCkgeworCQlCb29sZWFuIG9sZCA9IHRoaXMuc2hhcmVkOworCQl0aGlzLnNoYXJlZCA9IHNoYXJlZDsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNIQVJFRF9QUk9QRVJUWSwgb2xkLCBzaGFyZWQpOworCX0KKworCXByaXZhdGUgQm9vbGVhbiBidWlsZFNoYXJlZCgpIHsKKwkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19TSEFSRUQpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2hhcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIGV4cGlyeQorCXB1YmxpYyBJbnRlZ2VyIGdldEV4cGlyeSgpIHsKKwkJcmV0dXJuIHRoaXMuZXhwaXJ5OworCX0KKworCXB1YmxpYyB2b2lkIHNldEV4cGlyeShJbnRlZ2VyIGV4cGlyeSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0RXhwaXJ5XyhJbnRlZ2VyIGV4cGlyeSkgeworCQlJbnRlZ2VyIG9sZCA9IHRoaXMuZXhwaXJ5OworCQl0aGlzLmV4cGlyeSA9IGV4cGlyeTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9QUk9QRVJUWSwgb2xkLCBleHBpcnkpOworCX0KKworCXByaXZhdGUgSW50ZWdlciBidWlsZEV4cGlyeSgpIHsKKwkJcmV0dXJuIChJbnRlZ2VyKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19FWFBJUlkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIGV4cGlyeSB0aW1lIG9mIGRheQorCXB1YmxpYyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZ2V0RXhwaXJ5VGltZU9mRGF5KCkgeworCQlyZXR1cm4gdGhpcy5leHBpcnlUaW1lT2ZEYXk7CisJfQorCisJcHVibGljIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBhZGRFeHBpcnlUaW1lT2ZEYXkoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheSgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gYnVpbGRFeHBpcnlUaW1lT2ZEYXkoKSB7CisJCUlBbm5vdGF0aW9uIGpkdFRpbWVPZkRheSA9IHRoaXMuZ2V0SmR0RXhwaXJ5VGltZU9mRGF5KCk7CisJCXJldHVybiAoamR0VGltZU9mRGF5ID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRUaW1lT2ZEYXkoamR0VGltZU9mRGF5KTsKKwl9CisKKwlwcml2YXRlIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBidWlsZFRpbWVPZkRheShJQW5ub3RhdGlvbiBqZHRUaW1lT2ZEYXkpIHsKKwkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24odGhpcywgamR0VGltZU9mRGF5KTsKKwl9CisKKwlwcml2YXRlIElBbm5vdGF0aW9uIGdldEpkdEV4cGlyeVRpbWVPZkRheSgpIHsKKwkJcmV0dXJuIChJQW5ub3RhdGlvbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0RXhwaXJ5VGltZU9mRGF5KEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBleHBpcnlUaW1lT2ZEYXkpIHsKKwkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIG9sZCA9IHRoaXMuZXhwaXJ5VGltZU9mRGF5OworCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IGV4cGlyeVRpbWVPZkRheTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSwgb2xkLCBleHBpcnlUaW1lT2ZEYXkpOworCX0KKworCS8vIFRPRE8KKwlwcml2YXRlIHZvaWQgdXBkYXRlRXhwaXJ5VGltZU9mRGF5KCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKy8vCQlJQW5ub3RhdGlvbiBqZHRUaW1lT2ZEYXkgPSB0aGlzLmdldEpkdEV4cGlyeVRpbWVPZkRheSgpOworLy8JCWlmIChqZHRUaW1lT2ZEYXkgPT0gbnVsbCkgeworLy8JCQl0aGlzLnNldEV4cGlyeVRpbWVPZkRheShudWxsKTsKKy8vCQl9IGVsc2UgeworLy8JCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgPT0gbnVsbCkgeworLy8JCQkJdGhpcy5zZXRFeHBpcnlUaW1lT2ZEYXkodGhpcy5idWlsZFRpbWVPZkRheShqZHRUaW1lT2ZEYXkpKTsKKy8vCQkJfSBlbHNlIHsKKy8vCQkJCXRoaXMuZXhwaXJ5VGltZU9mRGF5LnVwZGF0ZShqZHRUaW1lT2ZEYXkpOworLy8JCQl9CisvLwkJfQorCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGltZU9mRGF5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIGFsd2F5cyByZWZyZXNoCisJcHVibGljIEJvb2xlYW4gZ2V0QWx3YXlzUmVmcmVzaCgpIHsKKwkJcmV0dXJuIHRoaXMuYWx3YXlzUmVmcmVzaDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4gYWx3YXlzUmVmcmVzaCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0QWx3YXlzUmVmcmVzaF8oQm9vbGVhbiBhbHdheXNSZWZyZXNoKSB7CisJCUJvb2xlYW4gb2xkID0gdGhpcy5hbHdheXNSZWZyZXNoOworCQl0aGlzLmFsd2F5c1JlZnJlc2ggPSBhbHdheXNSZWZyZXNoOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFksIG9sZCwgYWx3YXlzUmVmcmVzaCk7CisJfQorCisJcHJpdmF0ZSBCb29sZWFuIGJ1aWxkQWx3YXlzUmVmcmVzaCgpIHsKKwkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19BTFdBWVNfUkVGUkVTSCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRBbHdheXNSZWZyZXNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIHJlZnJlc2ggb25seSBpZiBuZXdlcgorCXB1YmxpYyBCb29sZWFuIGdldFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKKwkJcmV0dXJuIHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0UmVmcmVzaE9ubHlJZk5ld2VyXyhCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgeworCQlCb29sZWFuIG9sZCA9IHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyOworCQl0aGlzLnJlZnJlc2hPbmx5SWZOZXdlciA9IHJlZnJlc2hPbmx5SWZOZXdlcjsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSwgb2xkLCByZWZyZXNoT25seUlmTmV3ZXIpOworCX0KKworCXByaXZhdGUgQm9vbGVhbiBidWlsZFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKKwkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVIpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmcmVzaE9ubHlJZk5ld2VyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCS8vICoqKioqIGRpc2FibGUgaGl0cworCXB1YmxpYyBCb29sZWFuIGdldERpc2FibGVIaXRzKCkgeworCQlyZXR1cm4gdGhpcy5kaXNhYmxlSGl0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREaXNhYmxlSGl0cyhCb29sZWFuIGRpc2FibGVIaXRzKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXREaXNhYmxlSGl0c18oQm9vbGVhbiBkaXNhYmxlSGl0cykgeworCQlCb29sZWFuIG9sZCA9IHRoaXMuZGlzYWJsZUhpdHM7CisJCXRoaXMuZGlzYWJsZUhpdHMgPSBkaXNhYmxlSGl0czsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU0FCTEVfSElUU19QUk9QRVJUWSwgb2xkLCBkaXNhYmxlSGl0cyk7CisJfQorCisJcHJpdmF0ZSBCb29sZWFuIGJ1aWxkRGlzYWJsZUhpdHMoKSB7CisJCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DQUNIRV9fRElTQUJMRV9ISVRTKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldERpc2FibGVzSGl0c1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKiBjb29yZGluYXRpb24gdHlwZQorCXB1YmxpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0Q29vcmRpbmF0aW9uVHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMuY29vcmRpbmF0aW9uVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlXyhDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSkgeworCQlDYWNoZUNvb3JkaW5hdGlvblR5cGUgb2xkID0gdGhpcy5jb29yZGluYXRpb25UeXBlOworCQl0aGlzLmNvb3JkaW5hdGlvblR5cGUgPSBjb29yZGluYXRpb25UeXBlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCBjb29yZGluYXRpb25UeXBlKTsKKwl9CisKKwlwcml2YXRlIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBidWlsZENvb3JkaW5hdGlvblR5cGUoKSB7CisJCXJldHVybiBDYWNoZUNvb3JkaW5hdGlvblR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEUpKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENvb3JkaW5hdGlvblR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYzhmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNoYW5nZVRyYWNraW5nCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24KK3sKKwlwcml2YXRlIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZTsKKworCisJcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwkvLyBUT0RPCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogdmFsdWUKKwlwdWJsaWMgQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUpIHsKKwkJQ2hhbmdlVHJhY2tpbmdUeXBlIG9sZCA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKKwl9CisKKwlwcml2YXRlIENoYW5nZVRyYWNraW5nVHlwZSBidWlsZFZhbHVlKCkgeworCQlyZXR1cm4gQ2hhbmdlVHJhY2tpbmdUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HX19WQUxVRSkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2OGM1NQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnNpb25WYWx1ZQorICovCitmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbgoreworCXByaXZhdGUgU3RyaW5nIGRhdGFWYWx1ZTsKKwlwcml2YXRlIFN0cmluZyBvYmplY3RWYWx1ZTsKKworCisJQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMuZGF0YVZhbHVlID0gdGhpcy5idWlsZERhdGFWYWx1ZSgpOworCQl0aGlzLm9iamVjdFZhbHVlID0gdGhpcy5idWlsZE9iamVjdFZhbHVlKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldERhdGFWYWx1ZV8odGhpcy5idWlsZERhdGFWYWx1ZSgpKTsKKwkJdGhpcy5zZXRPYmplY3RWYWx1ZV8odGhpcy5idWlsZE9iamVjdFZhbHVlKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIGRhdGEgdmFsdWUKKwlwdWJsaWMgU3RyaW5nIGdldERhdGFWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMuZGF0YVZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldERhdGFWYWx1ZShTdHJpbmcgZGF0YVZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXREYXRhVmFsdWVfKFN0cmluZyBkYXRhVmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuZGF0YVZhbHVlOworCQl0aGlzLmRhdGFWYWx1ZSA9IGRhdGFWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVkFMVUVfUFJPUEVSVFksIG9sZCwgZGF0YVZhbHVlKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZERhdGFWYWx1ZSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXREYXRhVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogb2JqZWN0IHZhbHVlCisJcHVibGljIFN0cmluZyBnZXRPYmplY3RWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMub2JqZWN0VmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIG9iamVjdFZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRPYmplY3RWYWx1ZV8oU3RyaW5nIG9iamVjdFZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLm9iamVjdFZhbHVlOworCQl0aGlzLm9iamVjdFZhbHVlID0gb2JqZWN0VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVkFMVUVfUFJPUEVSVFksIG9sZCwgb2JqZWN0VmFsdWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkT2JqZWN0VmFsdWUoKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRPYmplY3RWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMWQ0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24KK3sKKwlwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQ29udmVydEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogdmFsdWUKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DT05WRVJUX19WQUxVRSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwMTkxYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0ZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbgoreworCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRlckNsYXNzOworCisKKwlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMuY29udmVydGVyQ2xhc3MgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ2xhc3MoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0Q29udmVydGVyQ2xhc3NfKHRoaXMuYnVpbGRDb252ZXJ0ZXJDbGFzcygpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQmluYXJ5TmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGluay5DT05WRVJURVJfX05BTUU7CisJfQorCisJLy8gKioqKioqKioqKiBDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIGNvbnZlcnRlciBjbGFzcworCXB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydGVyQ2xhc3MoKSB7CisJCXJldHVybiB0aGlzLmNvbnZlcnRlckNsYXNzOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlckNsYXNzKFN0cmluZyBjb252ZXJ0ZXJDbGFzcykgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0Q29udmVydGVyQ2xhc3NfKFN0cmluZyBjb252ZXJ0ZXJDbGFzcykgeworCQlTdHJpbmcgb2xkID0gdGhpcy5jb252ZXJ0ZXJDbGFzczsKKwkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IGNvbnZlcnRlckNsYXNzOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZLCBvbGQsIGNvbnZlcnRlckNsYXNzKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZENvbnZlcnRlckNsYXNzKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DT05WRVJURVJfX0NPTlZFUlRFUl9DTEFTUyk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb252ZXJ0ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZU5hbWUsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiZDEzYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ3VzdG9taXplcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbgoreworCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisKKwlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEN1c3RvbWl6ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHZhbHVlCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUl9fVkFMVUUpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gY3VzdG9taXplckNsYXNzSW1wbGVtZW50c0ludGVyZmFjZShTdHJpbmcgaW50ZXJmYWNlTmFtZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNGFkZDIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZTsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5FeGlzdGVuY2VDaGVja2luZworICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBFeGlzdGVuY2VUeXBlIHZhbHVlOworCisKKwlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHZhbHVlCisJcHVibGljIEV4aXN0ZW5jZVR5cGUgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKEV4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhFeGlzdGVuY2VUeXBlIHZhbHVlKSB7CisJCUV4aXN0ZW5jZVR5cGUgb2xkID0gdGhpcy52YWx1ZTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOworCX0KKworCXByaXZhdGUgRXhpc3RlbmNlVHlwZSBidWlsZFZhbHVlKCkgeworCQlyZXR1cm4gRXhpc3RlbmNlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lOR19fVkFMVUUpKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzcyZmYyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkpvaW5GZXRjaAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24KK3sKKwlwcml2YXRlIEpvaW5GZXRjaFR5cGUgdmFsdWU7CisKKworCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBCaW5hcnlKb2luRmV0Y2hBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHZhbHVlCisJcHVibGljIEpvaW5GZXRjaFR5cGUgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKEpvaW5GZXRjaFR5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhKb2luRmV0Y2hUeXBlIHZhbHVlKSB7CisJCUpvaW5GZXRjaFR5cGUgb2xkID0gdGhpcy52YWx1ZTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOworCX0KKworCXByaXZhdGUgSm9pbkZldGNoVHlwZSBidWlsZFZhbHVlKCkgeworCQlyZXR1cm4gSm9pbkZldGNoVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0hfX1ZBTFVFKSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZGVlYjQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk11dGFibGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24KK3sKKwlwcml2YXRlIEJvb2xlYW4gdmFsdWU7CisKKworCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogTXV0YWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogdmFsdWUKKwlwdWJsaWMgQm9vbGVhbiBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJQm9vbGVhbiBvbGQgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7CisJfQorCisJcHJpdmF0ZSBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7CisJCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5NVVRBQkxFX19WQUxVRSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OWYxNzcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnRlcgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuU3RydWN0Q29udmVydGVyCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5PYmplY3RUeXBlQ29udmVydGVyCisgKi8KK2Fic3RyYWN0IGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgoreworCVN0cmluZyBuYW1lOworCisJQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldE5hbWVfKHRoaXMuYnVpbGROYW1lKCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIE5hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBuYW1lCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5uYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldE5hbWVfKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZSgpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXROYW1lRWxlbWVudE5hbWUoKSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCWFic3RyYWN0IFN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyM2IxMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24KK3sKKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWU7CisJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzOworCisKKwlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IHRoaXMuYnVpbGREZWZhdWx0T2JqZWN0VmFsdWUoKTsKKwkJdGhpcy5jb252ZXJzaW9uVmFsdWVzID0gdGhpcy5idWlsZENvbnZlcnNpb25WYWx1ZXMoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0RGVmYXVsdE9iamVjdFZhbHVlXyh0aGlzLmJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlKCkpOworCQl0aGlzLnVwZGF0ZUNvbnZlcnNpb25WYWx1ZXMoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQmluYXJ5TmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX05BTUU7CisJfQorCisJLy8gKioqKioqKioqKiBCaW5hcnlCYXNlVHlwZUNvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldERhdGFUeXBlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0T2JqZWN0VHlwZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRTsKKwl9CisKKwkvLyAqKioqKioqKioqIE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIGRlZmF1bHQgb2JqZWN0IHZhbHVlCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0T2JqZWN0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0T2JqZWN0VmFsdWUoU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlXyhTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZTsKKwkJdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWUgPSBkZWZhdWx0T2JqZWN0VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBkZWZhdWx0T2JqZWN0VmFsdWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldERlZmF1bHRPYmplY3RWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKiBjb252ZXJzaW9uIHZhbHVlcworCXB1YmxpYyBMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4odGhpcy5jb252ZXJzaW9uVmFsdWVzKTsKKwl9CisKKwlwdWJsaWMgaW50IGNvbnZlcnNpb25WYWx1ZXNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZUF0KGludCBpbmRleCkgeworCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVzLmdldChpbmRleCk7CisJfQorCisJcHVibGljIGludCBpbmRleE9mQ29udmVyc2lvblZhbHVlKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBjb252ZXJzaW9uVmFsdWUpIHsKKwkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlcy5pbmRleE9mKGNvbnZlcnNpb25WYWx1ZSk7CisJfQorCisJcHVibGljIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBhZGRDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVDb252ZXJzaW9uVmFsdWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIFZlY3RvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IGJ1aWxkQ29udmVyc2lvblZhbHVlcygpIHsKKwkJT2JqZWN0W10gamR0Q29udmVyc2lvblZhbHVlcyA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVMpOworCQlWZWN0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4oamR0Q29udmVyc2lvblZhbHVlcy5sZW5ndGgpOworCQlmb3IgKE9iamVjdCBqZHRDb252ZXJzaW9uVmFsdWUgOiBqZHRDb252ZXJzaW9uVmFsdWVzKSB7CisJCQlyZXN1bHQuYWRkKG5ldyBCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24odGhpcywgKElBbm5vdGF0aW9uKSBqZHRDb252ZXJzaW9uVmFsdWUpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8vIFRPRE8KKwlwcml2YXRlIHZvaWQgdXBkYXRlQ29udmVyc2lvblZhbHVlcygpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwMmYzMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUHJpdmF0ZU93bmVkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbgoreworCisJcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjRkYWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkT25seQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uCit7CisKKwlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjM3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlJlYWRUcmFuc2Zvcm1lcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uCit7CisKKwlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKworCS8vICoqKioqKioqKiogQmluYXJ5VHJhbnNmb3JtZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSX19UUkFOU0ZPUk1FUl9DTEFTUzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSX19NRVRIT0Q7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkOTY1NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5TdHJ1Y3RDb252ZXJ0ZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbgoreworCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRlcjsKKworCisJcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLmNvbnZlcnRlciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXIoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0Q29udmVydGVyXyh0aGlzLmJ1aWxkQ29udmVydGVyKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBCaW5hcnlOYW1lZENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVJfX05BTUU7CisJfQorCisKKwkvLyAqKioqKioqKioqIFN0cnVjdENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogY29udmVydGVyCisJcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXIoKSB7CisJCXJldHVybiB0aGlzLmNvbnZlcnRlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlcikgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0Q29udmVydGVyXyhTdHJpbmcgY29udmVydGVyKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmNvbnZlcnRlcjsKKwkJdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfUFJPUEVSVFksIG9sZCwgY29udmVydGVyKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZENvbnZlcnRlcigpIHsKKwkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRlclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGU5NTA3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlRpbWVPZkRheQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24KK3sKKwlwcml2YXRlIEludGVnZXIgaG91cjsKKwlwcml2YXRlIEludGVnZXIgbWludXRlOworCXByaXZhdGUgSW50ZWdlciBzZWNvbmQ7CisJcHJpdmF0ZSBJbnRlZ2VyIG1pbGxpc2Vjb25kOworCisKKwlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMuaG91ciA9IHRoaXMuYnVpbGRIb3VyKCk7CisJCXRoaXMubWludXRlID0gdGhpcy5idWlsZE1pbnV0ZSgpOworCQl0aGlzLnNlY29uZCA9IHRoaXMuYnVpbGRTZWNvbmQoKTsKKwkJdGhpcy5taWxsaXNlY29uZCA9IHRoaXMuYnVpbGRNaWxsaXNlY29uZCgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy5zZXRIb3VyXyh0aGlzLmJ1aWxkSG91cigpKTsKKwkJdGhpcy5zZXRNaW51dGVfKHRoaXMuYnVpbGRNaW51dGUoKSk7CisJCXRoaXMuc2V0U2Vjb25kXyh0aGlzLmJ1aWxkU2Vjb25kKCkpOworCQl0aGlzLnNldE1pbGxpc2Vjb25kXyh0aGlzLmJ1aWxkTWlsbGlzZWNvbmQoKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIFRpbWVPZkRheUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogaG91cgorCXB1YmxpYyBJbnRlZ2VyIGdldEhvdXIoKSB7CisJCXJldHVybiB0aGlzLmhvdXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0SG91cihJbnRlZ2VyIGhvdXIpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEhvdXJfKEludGVnZXIgaG91cikgeworCQlJbnRlZ2VyIG9sZCA9IHRoaXMuaG91cjsKKwkJdGhpcy5ob3VyID0gaG91cjsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhPVVJfUFJPUEVSVFksIG9sZCwgaG91cik7CisJfQorCisJcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkSG91cigpIHsKKwkJcmV0dXJuIChJbnRlZ2VyKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZX19IT1VSKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEhvdXJUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogbWludXRlCisJcHVibGljIEludGVnZXIgZ2V0TWludXRlKCkgeworCQlyZXR1cm4gdGhpcy5taW51dGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWludXRlKEludGVnZXIgbmV3TWludXRlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRNaW51dGVfKEludGVnZXIgbmV3TWludXRlKSB7CisJCUludGVnZXIgb2xkTWludXRlID0gdGhpcy5taW51dGU7CisJCXRoaXMubWludXRlID0gbmV3TWludXRlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUlOVVRFX1BST1BFUlRZLCBvbGRNaW51dGUsIG5ld01pbnV0ZSk7CisJfQorCisJcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkTWludXRlKCkgeworCQlyZXR1cm4gKEludGVnZXIpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuVElNRV9PRl9EQVlfX01JTlVURSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRNaW51dGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogc2Vjb25kCisJcHVibGljIEludGVnZXIgZ2V0U2Vjb25kKCkgeworCQlyZXR1cm4gdGhpcy5zZWNvbmQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2Vjb25kKEludGVnZXIgbmV3U2Vjb25kKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRTZWNvbmRfKEludGVnZXIgbmV3U2Vjb25kKSB7CisJCUludGVnZXIgb2xkU2Vjb25kID0gdGhpcy5zZWNvbmQ7CisJCXRoaXMuc2Vjb25kID0gbmV3U2Vjb25kOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VDT05EX1BST1BFUlRZLCBvbGRTZWNvbmQsIG5ld1NlY29uZCk7CisJfQorCisJcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkU2Vjb25kKCkgeworCQlyZXR1cm4gKEludGVnZXIpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuVElNRV9PRl9EQVlfX1NFQ09ORCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRTZWNvbmRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJLy8gKioqKiogbWlsbGlzZWNvbmQKKwlwdWJsaWMgSW50ZWdlciBnZXRNaWxsaXNlY29uZCgpIHsKKwkJcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBuZXdNaWxsaXNlY29uZCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0TWlsbGlzZWNvbmRfKEludGVnZXIgbmV3TWlsbGlzZWNvbmQpIHsKKwkJSW50ZWdlciBvbGRNaWxsaXNlY29uZCA9IHRoaXMubWlsbGlzZWNvbmQ7CisJCXRoaXMubWlsbGlzZWNvbmQgPSBuZXdNaWxsaXNlY29uZDsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1JTExJU0VDT05EX1BST1BFUlRZLCBvbGRNaWxsaXNlY29uZCwgbmV3TWlsbGlzZWNvbmQpOworCX0KKworCXByaXZhdGUgSW50ZWdlciBidWlsZE1pbGxpc2Vjb25kKCkgeworCQlyZXR1cm4gKEludGVnZXIpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuVElNRV9PRl9EQVlfX01JTExJU0VDT05EKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE1pbGxpc2Vjb25kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTJjNjBhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlRyYW5zZm9ybWF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbgorCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24KK3sKKwlwcml2YXRlIEZldGNoVHlwZSBmZXRjaDsKKwlwcml2YXRlIEJvb2xlYW4gb3B0aW9uYWw7CisKKworCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLmZldGNoID0gdGhpcy5idWlsZEZldGNoKCk7CisJCXRoaXMub3B0aW9uYWwgPSB0aGlzLmJ1aWxkT3B0aW9uYWwoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJc3VwZXIudXBkYXRlKCk7CisJCXRoaXMuc2V0RmV0Y2hfKHRoaXMuYnVpbGRGZXRjaCgpKTsKKwkJdGhpcy5zZXRPcHRpb25hbF8odGhpcy5idWlsZE9wdGlvbmFsKCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogZmV0Y2gKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgeworCQlyZXR1cm4gdGhpcy5mZXRjaDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEZldGNoXyhGZXRjaFR5cGUgZmV0Y2gpIHsKKwkJRmV0Y2hUeXBlIG9sZCA9IHRoaXMuZmV0Y2g7CisJCXRoaXMuZmV0Y2ggPSBmZXRjaDsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKKwl9CisKKwlwcml2YXRlIEZldGNoVHlwZSBidWlsZEZldGNoKCkgeworCQlyZXR1cm4gRmV0Y2hUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT05fX0ZFVENIKSk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRGZXRjaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwkvLyAqKioqKiBvcHRpb25hbAorCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgeworCQlyZXR1cm4gdGhpcy5vcHRpb25hbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRPcHRpb25hbF8oQm9vbGVhbiBvcHRpb25hbCkgeworCQlCb29sZWFuIG9sZCA9IHRoaXMub3B0aW9uYWw7CisJCXRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9QVElPTkFMX1BST1BFUlRZLCBvbGQsIG9wdGlvbmFsKTsKKwl9CisKKwlwcml2YXRlIEJvb2xlYW4gYnVpbGRPcHRpb25hbCgpIHsKKwkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OX19PUFRJT05BTCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2ZjE2ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Xcml0ZVRyYW5zZm9ybWVyCisgKi8KK2Fic3RyYWN0IGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbgoreworCXByaXZhdGUgU3RyaW5nIHRyYW5zZm9ybWVyQ2xhc3M7CisJcHJpdmF0ZSBTdHJpbmcgbWV0aG9kOworCisKKwlCaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCQl0aGlzLnRyYW5zZm9ybWVyQ2xhc3MgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtZXJDbGFzcygpOworCQl0aGlzLm1ldGhvZCA9IHRoaXMuYnVpbGRNZXRob2QoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCXN1cGVyLnVwZGF0ZSgpOworCQl0aGlzLnNldFRyYW5zZm9ybWVyQ2xhc3NfKHRoaXMuYnVpbGRUcmFuc2Zvcm1lckNsYXNzKCkpOworCQl0aGlzLnNldE1ldGhvZF8odGhpcy5idWlsZE1ldGhvZCgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogVHJhbnNmb3JtZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHRyYW5zZm9ybWVyIGNsYXNzCisJcHVibGljIFN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzKCkgeworCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lckNsYXNzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRyYW5zZm9ybWVyQ2xhc3MoU3RyaW5nIHRyYW5zZm9ybWVyQ2xhc3MpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFRyYW5zZm9ybWVyQ2xhc3NfKFN0cmluZyB0cmFuc2Zvcm1lckNsYXNzKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnRyYW5zZm9ybWVyQ2xhc3M7CisJCXRoaXMudHJhbnNmb3JtZXJDbGFzcyA9IHRyYW5zZm9ybWVyQ2xhc3M7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUUkFOU0ZPUk1FUl9DTEFTU19QUk9QRVJUWSwgb2xkLCB0cmFuc2Zvcm1lckNsYXNzKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZFRyYW5zZm9ybWVyQ2xhc3MoKSB7CisJCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0VHJhbnNmb3JtZXJDbGFzc0VsZW1lbnROYW1lKCkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHJhbnNmb3JtZXJDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlhYnN0cmFjdCBTdHJpbmcgZ2V0VHJhbnNmb3JtZXJDbGFzc0VsZW1lbnROYW1lKCk7CisKKwkvLyAqKioqKiBtZXRob2QKKwlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpIHsKKwkJcmV0dXJuIHRoaXMubWV0aG9kOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRNZXRob2RfKFN0cmluZyBtZXRob2QpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMubWV0aG9kOworCQl0aGlzLm1ldGhvZCA9IG1ldGhvZDsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1FVEhPRF9QUk9QRVJUWSwgb2xkLCBtZXRob2QpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkTWV0aG9kKCkgeworCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldE1ldGhvZEVsZW1lbnROYW1lKCkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWV0aG9kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCWFic3RyYWN0IFN0cmluZyBnZXRNZXRob2RFbGVtZW50TmFtZSgpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjY2YzhjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlR5cGVDb252ZXJ0ZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCit7CisJcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKKwkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCisJLy8gKioqKioqKioqKiBCaW5hcnlOYW1lZENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19OQU1FOworCX0KKworCisJLy8gKioqKioqKioqKiBCaW5hcnlCYXNlVHlwZUNvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldERhdGFUeXBlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRPYmplY3RUeXBlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGEyZmZkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlZhcmlhYmxlT25lVG9PbmUKKyAqLworcHVibGljIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24KKwlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24KK3sKKwlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgeworCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2Y3ZGZjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5Q29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCisgKi8KK3B1YmxpYyBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uCisJZXh0ZW5kcyBCaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbgoreworCXByaXZhdGUgQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW47CisKKworCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7CisJCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7CisJCXRoaXMuY29sdW1uID0gdGhpcy5idWlsZENvbHVtbigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJdGhpcy51cGRhdGVDb2x1bW4oKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQmluYXJ5VHJhbnNmb3JtZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUl9fVFJBTlNGT1JNRVJfQ0xBU1M7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVJfX01FVEhPRDsKKwl9CisKKworCS8vICoqKioqKioqKiogV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogY29sdW1uCisJcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy5jb2x1bW47CisJfQorCisJcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Tm9uTnVsbENvbHVtbigpIHsKKwkJcmV0dXJuICh0aGlzLmNvbHVtbiAhPSBudWxsKSA/IHRoaXMuY29sdW1uIDogbmV3IE51bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uKHRoaXMpOworCX0KKworCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGFkZENvbHVtbigpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENvbHVtblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlwcml2YXRlIENvbHVtbkFubm90YXRpb24gYnVpbGRDb2x1bW4oKSB7CisJCUlBbm5vdGF0aW9uIGpkdENvbHVtbiA9IHRoaXMuZ2V0SmR0Q29sdW1uKCk7CisJCXJldHVybiAoamR0Q29sdW1uID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRDb2x1bW4oamR0Q29sdW1uKTsKKwl9CisKKwlwcml2YXRlIENvbHVtbkFubm90YXRpb24gYnVpbGRDb2x1bW4oSUFubm90YXRpb24gamR0Q29sdW1uKSB7CisJCXJldHVybiBuZXcgQmluYXJ5Q29sdW1uQW5ub3RhdGlvbih0aGlzLCBqZHRDb2x1bW4pOworCX0KKworCXByaXZhdGUgSUFubm90YXRpb24gZ2V0SmR0Q29sdW1uKCkgeworCQlyZXR1cm4gKElBbm5vdGF0aW9uKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSX19DT0xVTU4pOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRDb2x1bW4oQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4pIHsKKwkJQ29sdW1uQW5ub3RhdGlvbiBvbGQgPSB0aGlzLmNvbHVtbjsKKwkJdGhpcy5jb2x1bW4gPSBjb2x1bW47CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xVTU5fUFJPUEVSVFksIG9sZCwgY29sdW1uKTsKKwl9CisKKwkvLyBUT0RPCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbHVtbigpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisvLwkJSUFubm90YXRpb24gamR0Q29sdW1uID0gdGhpcy5nZXRKZHRDb2x1bW4oKTsKKy8vCQlpZiAoamR0Q29sdW1uID09IG51bGwpIHsKKy8vCQkJdGhpcy5zZXRDb2x1bW4obnVsbCk7CisvLwkJfSBlbHNlIHsKKy8vCQkJaWYgKHRoaXMuY29sdW1uID09IG51bGwpIHsKKy8vCQkJCXRoaXMuc2V0Q29sdW1uKHRoaXMuYnVpbGRDb2x1bW4oamR0Q29sdW1uKSk7CisvLwkJCX0gZWxzZSB7CisvLwkJCQl0aGlzLmNvbHVtbi51cGRhdGUoamR0Q29sdW1uKTsKKy8vCQkJfQorLy8JCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxNTFlZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5CYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5PYmplY3RUeXBlQ29udmVydGVyCisgKi8KK2Fic3RyYWN0IGNsYXNzIFNvdXJjZUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgorCWltcGxlbWVudHMgQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KK3sKKwlmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhdGFUeXBlRGVjbGFyYXRpb25BZGFwdGVyOworCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhdGFUeXBlQWRhcHRlcjsKKwlTdHJpbmcgZGF0YVR5cGU7CisKKwlmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG9iamVjdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXI7CisJZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gb2JqZWN0VHlwZUFkYXB0ZXI7CisJU3RyaW5nIG9iamVjdFR5cGU7CisKKworCVNvdXJjZUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgeworCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhKTsKKwkJdGhpcy5kYXRhVHlwZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRUeXBlQWRhcHRlcih0aGlzLmdldERhdGFUeXBlRWxlbWVudE5hbWUoKSk7CisJCXRoaXMuZGF0YVR5cGVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMubWVtYmVyLCB0aGlzLmRhdGFUeXBlRGVjbGFyYXRpb25BZGFwdGVyKTsKKworCQl0aGlzLm9iamVjdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkVHlwZUFkYXB0ZXIodGhpcy5nZXRPYmplY3RUeXBlRWxlbWVudE5hbWUoKSk7CisJCXRoaXMub2JqZWN0VHlwZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5tZW1iZXIsIHRoaXMub2JqZWN0VHlwZURlY2xhcmF0aW9uQWRhcHRlcik7CisJfQorCisJcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVHlwZUFkYXB0ZXIoU3RyaW5nIGVsZW1lbnROYW1lKSB7CisJCSAvLyBmYWxzZSA9IGRvIG5vdCByZW1vdmUgYW5ub3RhdGlvbiB3aGVuIGVtcHR5CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5kYWEsIGVsZW1lbnROYW1lLCBmYWxzZSwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOworCQl0aGlzLmRhdGFUeXBlID0gdGhpcy5idWlsZERhdGFUeXBlKGFzdFJvb3QpOworCQl0aGlzLm9iamVjdFR5cGUgPSB0aGlzLmJ1aWxkT2JqZWN0VHlwZShhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOworCQl0aGlzLnNldERhdGFUeXBlKHRoaXMuYnVpbGREYXRhVHlwZShhc3RSb290KSk7CisJCXRoaXMuc2V0T2JqZWN0VHlwZSh0aGlzLmJ1aWxkT2JqZWN0VHlwZShhc3RSb290KSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEJhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBkYXRhIHR5cGUKKwlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5kYXRhVHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShTdHJpbmcgZGF0YVR5cGUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuZGF0YVR5cGUsIGRhdGFUeXBlKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLmRhdGFUeXBlOworCQl0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7CisJCXRoaXMuZGF0YVR5cGVBZGFwdGVyLnNldFZhbHVlKGRhdGFUeXBlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVFlQRV9QUk9QRVJUWSwgb2xkLCBkYXRhVHlwZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGREYXRhVHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5kYXRhVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXREYXRhVHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuZGF0YVR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOworCX0KKworCWFic3RyYWN0IFN0cmluZyBnZXREYXRhVHlwZUVsZW1lbnROYW1lKCk7CisKKwkvLyAqKioqKiBvYmplY3QgdHlwZQorCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpIHsKKwkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBvYmplY3RUeXBlKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm9iamVjdFR5cGUsIG9iamVjdFR5cGUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMub2JqZWN0VHlwZTsKKwkJdGhpcy5vYmplY3RUeXBlID0gb2JqZWN0VHlwZTsKKwkJdGhpcy5vYmplY3RUeXBlQWRhcHRlci5zZXRWYWx1ZShvYmplY3RUeXBlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGQsIG9iamVjdFR5cGUpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T2JqZWN0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMub2JqZWN0VHlwZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRPYmplY3RUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLm9iamVjdFR5cGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCWFic3RyYWN0IFN0cmluZyBnZXRPYmplY3RUeXBlRWxlbWVudE5hbWUoKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzY0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5CYXNpY0NvbGxlY3Rpb24KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+CisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwkKKwlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGRjZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkJhc2ljTWFwCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+CisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCQorCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmM5MTYzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw0MTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5NZW1iZXJBbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPFR5cGU+CisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVFlQRV9BREFQVEVSID0gYnVpbGRUeXBlQWRhcHRlcigpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdHlwZUFkYXB0ZXI7CisJcHJpdmF0ZSBDYWNoZVR5cGUgdHlwZTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IFNJWkVfQURBUFRFUiA9IGJ1aWxkU2l6ZUFkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBzaXplQWRhcHRlcjsKKwlwcml2YXRlIEludGVnZXIgc2l6ZTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IFNIQVJFRF9BREFQVEVSID0gYnVpbGRTaGFyZWRBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gc2hhcmVkQWRhcHRlcjsKKwlwcml2YXRlIEJvb2xlYW4gc2hhcmVkOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gRVhQSVJZX0FEQVBURVIgPSBidWlsZEV4cGlyeUFkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBleHBpcnlBZGFwdGVyOworCXByaXZhdGUgSW50ZWdlciBleHBpcnk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBBTFdBWVNfUkVGUkVTSF9BREFQVEVSID0gYnVpbGRBbHdheXNSZWZyZXNoQWRhcHRlcigpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFsd2F5c1JlZnJlc2hBZGFwdGVyOworCXByaXZhdGUgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGV4cGlyeVRpbWVPZkRheTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IFJFRlJFU0hfT05MWV9JRl9ORVdFUl9BREFQVEVSID0gYnVpbGRSZWZyZXNoT25seUlmTmV3ZXJBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gcmVmcmVzaE9ubHlJZk5ld2VyQWRhcHRlcjsKKwlwcml2YXRlIEJvb2xlYW4gYWx3YXlzUmVmcmVzaDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IERJU0FCTEVfSElUU19BREFQVEVSID0gYnVpbGREaXNhYmxlSGl0c0FkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkaXNhYmxlSGl0c0FkYXB0ZXI7CisJcHJpdmF0ZSBCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gQ09PUkRJTkFUSU9OX1RZUEVfQURBUFRFUiA9IGJ1aWxkQ29vcmRpbmF0aW9uVHlwZUFkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGNvb3JkaW5hdGlvblR5cGVBZGFwdGVyOworCXByaXZhdGUgQm9vbGVhbiBkaXNhYmxlSGl0czsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgRVhQSVJZX1RJTUVfT0ZfREFZX0FEQVBURVIgPSBidWlsZEV4cGlyeVRpbWVPZkRheUFkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIE1lbWJlckFubm90YXRpb25BZGFwdGVyIGV4cGlyeVRpbWVPZkRheUFkYXB0ZXI7CisJcHJpdmF0ZSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZTsKKworCisJcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlKSB7CisJCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwkJdGhpcy50eXBlQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0eXBlLCBUWVBFX0FEQVBURVIpOworCQl0aGlzLnNpemVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPih0eXBlLCBTSVpFX0FEQVBURVIpOworCQl0aGlzLnNoYXJlZEFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHR5cGUsIFNIQVJFRF9BREFQVEVSKTsKKwkJdGhpcy5leHBpcnlBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPih0eXBlLCBFWFBJUllfQURBUFRFUik7CisJCXRoaXMuYWx3YXlzUmVmcmVzaEFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHR5cGUsIEFMV0FZU19SRUZSRVNIX0FEQVBURVIpOworCQl0aGlzLnJlZnJlc2hPbmx5SWZOZXdlckFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHR5cGUsIFJFRlJFU0hfT05MWV9JRl9ORVdFUl9BREFQVEVSKTsKKwkJdGhpcy5kaXNhYmxlSGl0c0FkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHR5cGUsIERJU0FCTEVfSElUU19BREFQVEVSKTsKKwkJdGhpcy5jb29yZGluYXRpb25UeXBlQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0eXBlLCBDT09SRElOQVRJT05fVFlQRV9BREFQVEVSKTsKKwkJdGhpcy5leHBpcnlUaW1lT2ZEYXlBZGFwdGVyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHR5cGUsIEVYUElSWV9USU1FX09GX0RBWV9BREFQVEVSKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy50eXBlID0gdGhpcy5idWlsZFR5cGUoYXN0Um9vdCk7CisJCXRoaXMuc2l6ZSA9IHRoaXMuYnVpbGRTaXplKGFzdFJvb3QpOworCQl0aGlzLnNoYXJlZCA9IHRoaXMuYnVpbGRTaGFyZWQoYXN0Um9vdCk7CisJCXRoaXMuZXhwaXJ5ID0gdGhpcy5idWlsZEV4cGlyeShhc3RSb290KTsKKwkJdGhpcy5pbml0aWFsaXplRXhwaXJ5VGltZU9mRGF5KGFzdFJvb3QpOworCQl0aGlzLmFsd2F5c1JlZnJlc2ggPSB0aGlzLmJ1aWxkQWx3YXlzUmVmcmVzaChhc3RSb290KTsKKwkJdGhpcy5yZWZyZXNoT25seUlmTmV3ZXIgPSB0aGlzLmJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyKGFzdFJvb3QpOworCQl0aGlzLmRpc2FibGVIaXRzID0gdGhpcy5idWlsZERpc2FibGVIaXRzKGFzdFJvb3QpOworCQl0aGlzLmNvb3JkaW5hdGlvblR5cGUgPSB0aGlzLmJ1aWxkQ29vcmRpbmF0aW9uVHlwZShhc3RSb290KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUV4cGlyeVRpbWVPZkRheShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXlBZGFwdGVyLmdldEFubm90YXRpb24oYXN0Um9vdCkgIT0gbnVsbCkgeworCQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkgPSB0aGlzLmJ1aWxkRXhwaXJ5VGltZU9mRGF5KCk7CisJCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5pbml0aWFsaXplKGFzdFJvb3QpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0VHlwZSh0aGlzLmJ1aWxkVHlwZShhc3RSb290KSk7CisJCXRoaXMuc2V0U2l6ZSh0aGlzLmJ1aWxkU2l6ZShhc3RSb290KSk7CisJCXRoaXMuc2V0U2hhcmVkKHRoaXMuYnVpbGRTaGFyZWQoYXN0Um9vdCkpOworCQl0aGlzLnNldEV4cGlyeSh0aGlzLmJ1aWxkRXhwaXJ5KGFzdFJvb3QpKTsKKwkJdGhpcy51cGRhdGVFeHBpcnlUaW1lT2ZEYXkoYXN0Um9vdCk7CisJCXRoaXMuc2V0QWx3YXlzUmVmcmVzaCh0aGlzLmJ1aWxkQWx3YXlzUmVmcmVzaChhc3RSb290KSk7CisJCXRoaXMuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKHRoaXMuYnVpbGRSZWZyZXNoT25seUlmTmV3ZXIoYXN0Um9vdCkpOworCQl0aGlzLnNldERpc2FibGVIaXRzKHRoaXMuYnVpbGREaXNhYmxlSGl0cyhhc3RSb290KSk7CisJCXRoaXMuc2V0Q29vcmRpbmF0aW9uVHlwZSh0aGlzLmJ1aWxkQ29vcmRpbmF0aW9uVHlwZShhc3RSb290KSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUV4cGlyeVRpbWVPZkRheShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXlBZGFwdGVyLmdldEFubm90YXRpb24oYXN0Um9vdCkgPT0gbnVsbCkgeworCQkJdGhpcy5zZXRFeHBpcnlUaW1lT2ZEYXkobnVsbCk7CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSA9PSBudWxsKSB7CisJCQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGV0b2QgPSB0aGlzLmJ1aWxkRXhwaXJ5VGltZU9mRGF5KCk7CisJCQkJZXRvZC5pbml0aWFsaXplKGFzdFJvb3QpOworCQkJCXRoaXMuc2V0RXhwaXJ5VGltZU9mRGF5KGV0b2QpOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzLmdldEV4cGlyeVRpbWVPZkRheSgpLnVwZGF0ZShhc3RSb290KTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMudHlwZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIENhY2hlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiB0eXBlCisJcHVibGljIENhY2hlVHlwZSBnZXRUeXBlKCkgeworCQlyZXR1cm4gdGhpcy50eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoQ2FjaGVUeXBlIHR5cGUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMudHlwZSwgdHlwZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlDYWNoZVR5cGUgb2xkID0gdGhpcy50eXBlOworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLnR5cGVBZGFwdGVyLnNldFZhbHVlKENhY2hlVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUodHlwZSkpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKKwl9CisKKwlwcml2YXRlIENhY2hlVHlwZSBidWlsZFR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIENhY2hlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLnR5cGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShUWVBFX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCS8vICoqKioqIHNpemUKKwlwdWJsaWMgSW50ZWdlciBnZXRTaXplKCkgeworCQlyZXR1cm4gdGhpcy5zaXplOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNpemUoSW50ZWdlciBzaXplKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnNpemUsIHNpemUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJSW50ZWdlciBvbGQgPSB0aGlzLnNpemU7CisJCXRoaXMuc2l6ZSA9IHNpemU7CisJCXRoaXMuc2l6ZUFkYXB0ZXIuc2V0VmFsdWUoc2l6ZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSVpFX1BST1BFUlRZLCBvbGQsIHNpemUpOworCX0KKworCXByaXZhdGUgSW50ZWdlciBidWlsZFNpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuc2l6ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRTaXplVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoU0laRV9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKwkvLyAqKioqKiBzaGFyZWQKKwlwdWJsaWMgQm9vbGVhbiBnZXRTaGFyZWQoKSB7CisJCXJldHVybiB0aGlzLnNoYXJlZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTaGFyZWQoQm9vbGVhbiBzaGFyZWQpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuc2hhcmVkLCBzaGFyZWQpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJQm9vbGVhbiBvbGQgPSB0aGlzLnNoYXJlZDsKKwkJdGhpcy5zaGFyZWQgPSBzaGFyZWQ7CisJCXRoaXMuc2hhcmVkQWRhcHRlci5zZXRWYWx1ZShzaGFyZWQpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0hBUkVEX1BST1BFUlRZLCBvbGQsIHNoYXJlZCk7CisJfQorCisJcHJpdmF0ZSBCb29sZWFuIGJ1aWxkU2hhcmVkKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLnNoYXJlZEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRTaGFyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShTSEFSRURfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisJLy8gKioqKiogZXhwaXJ5CisJcHVibGljIEludGVnZXIgZ2V0RXhwaXJ5KCkgeworCQlyZXR1cm4gdGhpcy5leHBpcnk7CisJfQorCisJcHVibGljIHZvaWQgc2V0RXhwaXJ5KEludGVnZXIgZXhwaXJ5KSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmV4cGlyeSwgZXhwaXJ5KSkgeworCQkJcmV0dXJuOworCQl9CisJCUludGVnZXIgb2xkID0gdGhpcy5leHBpcnk7CisJCXRoaXMuZXhwaXJ5ID0gZXhwaXJ5OworCQl0aGlzLmV4cGlyeUFkYXB0ZXIuc2V0VmFsdWUoZXhwaXJ5KTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9QUk9QRVJUWSwgb2xkLCBleHBpcnkpOworCX0KKworCXByaXZhdGUgSW50ZWdlciBidWlsZEV4cGlyeShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5leHBpcnlBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoRVhQSVJZX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCS8vICoqKioqIGV4cGlyeSB0aW1lIG9mIGRheQorCXB1YmxpYyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZ2V0RXhwaXJ5VGltZU9mRGF5KCkgeworCQlyZXR1cm4gdGhpcy5leHBpcnlUaW1lT2ZEYXk7CisJfQorCisJcHVibGljIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBhZGRFeHBpcnlUaW1lT2ZEYXkoKSB7CisJCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCInZXhwaXJ5VGltZU9mRGF5JyBlbGVtZW50IGFscmVhZHkgZXhpc3RzIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IHRoaXMuYnVpbGRFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJdGhpcy5leHBpcnlUaW1lT2ZEYXlBZGFwdGVyLm5ld01hcmtlckFubm90YXRpb24oKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSwgbnVsbCwgdGhpcy5leHBpcnlUaW1lT2ZEYXkpOworCQlyZXR1cm4gdGhpcy5leHBpcnlUaW1lT2ZEYXk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlRXhwaXJ5VGltZU9mRGF5KCkgeworCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gZXhwaXJ5VGltZU9mRGF5IGVsZW1lbnQgZXhpc3RzIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IG51bGw7CisJCXRoaXMuZXhwaXJ5VGltZU9mRGF5QWRhcHRlci5yZW1vdmVBbm5vdGF0aW9uKCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWFBJUllfVElNRV9PRl9EQVlfUFJPUEVSVFksIHRoaXMuZXhwaXJ5VGltZU9mRGF5LCBudWxsKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0RXhwaXJ5VGltZU9mRGF5KEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBleHBpcnlUaW1lT2ZEYXkpIHsKKwkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIG9sZCA9IHRoaXMuZXhwaXJ5VGltZU9mRGF5OworCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IGV4cGlyeVRpbWVPZkRheTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSwgb2xkLCBleHBpcnlUaW1lT2ZEYXkpOworCX0KKworCXByaXZhdGUgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGJ1aWxkRXhwaXJ5VGltZU9mRGF5KCkgeworCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbih0aGlzLCB0aGlzLm1lbWJlciwgRVhQSVJZX1RJTUVfT0ZfREFZX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGltZU9mRGF5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBudWxsOy8vVE9ETyByZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEVYUElSWV9USU1FX09GX0RBWV9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKwkvLyAqKioqKiBhbHdheXMgcmVmcmVzaAorCXB1YmxpYyBCb29sZWFuIGdldEFsd2F5c1JlZnJlc2goKSB7CisJCXJldHVybiB0aGlzLmFsd2F5c1JlZnJlc2g7CisJfQorCisJcHVibGljIHZvaWQgc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuIGFsd2F5c1JlZnJlc2gpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuYWx3YXlzUmVmcmVzaCwgYWx3YXlzUmVmcmVzaCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlCb29sZWFuIG9sZCA9IHRoaXMuYWx3YXlzUmVmcmVzaDsKKwkJdGhpcy5hbHdheXNSZWZyZXNoID0gYWx3YXlzUmVmcmVzaDsKKwkJdGhpcy5hbHdheXNSZWZyZXNoQWRhcHRlci5zZXRWYWx1ZShhbHdheXNSZWZyZXNoKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEFMV0FZU19SRUZSRVNIX1BST1BFUlRZLCBvbGQsIGFsd2F5c1JlZnJlc2gpOworCX0KKworCXByaXZhdGUgQm9vbGVhbiBidWlsZEFsd2F5c1JlZnJlc2goQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuYWx3YXlzUmVmcmVzaEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRBbHdheXNSZWZyZXNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoQUxXQVlTX1JFRlJFU0hfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisJLy8gKioqKiogcmVmcmVzaCBvbmx5IGlmIG5ld2VyCisJcHVibGljIEJvb2xlYW4gZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkgeworCQlyZXR1cm4gdGhpcy5yZWZyZXNoT25seUlmTmV3ZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnJlZnJlc2hPbmx5SWZOZXdlciwgcmVmcmVzaE9ubHlJZk5ld2VyKSkgeworCQkJcmV0dXJuOworCQl9CisJCUJvb2xlYW4gb2xkID0gdGhpcy5yZWZyZXNoT25seUlmTmV3ZXI7CisJCXRoaXMucmVmcmVzaE9ubHlJZk5ld2VyID0gcmVmcmVzaE9ubHlJZk5ld2VyOworCQl0aGlzLnJlZnJlc2hPbmx5SWZOZXdlckFkYXB0ZXIuc2V0VmFsdWUocmVmcmVzaE9ubHlJZk5ld2VyKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSwgb2xkLCByZWZyZXNoT25seUlmTmV3ZXIpOworCX0KKworCXByaXZhdGUgQm9vbGVhbiBidWlsZFJlZnJlc2hPbmx5SWZOZXdlcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5yZWZyZXNoT25seUlmTmV3ZXJBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmcmVzaE9ubHlJZk5ld2VyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoUkVGUkVTSF9PTkxZX0lGX05FV0VSX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCS8vICoqKioqIGRpc2FibGUgaGl0cworCXB1YmxpYyBCb29sZWFuIGdldERpc2FibGVIaXRzKCkgeworCQlyZXR1cm4gdGhpcy5kaXNhYmxlSGl0czsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREaXNhYmxlSGl0cyhCb29sZWFuIGRpc2FibGVIaXRzKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmRpc2FibGVIaXRzLCBkaXNhYmxlSGl0cykpIHsKKwkJCXJldHVybjsKKwkJfQorCQlCb29sZWFuIG9sZCA9IHRoaXMuZGlzYWJsZUhpdHM7CisJCXRoaXMuZGlzYWJsZUhpdHMgPSBkaXNhYmxlSGl0czsKKwkJdGhpcy5kaXNhYmxlSGl0c0FkYXB0ZXIuc2V0VmFsdWUoZGlzYWJsZUhpdHMpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTQUJMRV9ISVRTX1BST1BFUlRZLCBvbGQsIGRpc2FibGVIaXRzKTsKKwl9CisKKwlwcml2YXRlIEJvb2xlYW4gYnVpbGREaXNhYmxlSGl0cyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5kaXNhYmxlSGl0c0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXREaXNhYmxlc0hpdHNUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShESVNBQkxFX0hJVFNfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisJLy8gKioqKiogY29vcmRpbmF0aW9uIHR5cGUKKwlwdWJsaWMgQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldENvb3JkaW5hdGlvblR5cGUoKSB7CisJCXJldHVybiB0aGlzLmNvb3JkaW5hdGlvblR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29vcmRpbmF0aW9uVHlwZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5jb29yZGluYXRpb25UeXBlLCBjb29yZGluYXRpb25UeXBlKSkgeworCQkJcmV0dXJuOworCQl9CisJCUNhY2hlQ29vcmRpbmF0aW9uVHlwZSBvbGQgPSB0aGlzLmNvb3JkaW5hdGlvblR5cGU7CisJCXRoaXMuY29vcmRpbmF0aW9uVHlwZSA9IGNvb3JkaW5hdGlvblR5cGU7CisJCXRoaXMuY29vcmRpbmF0aW9uVHlwZUFkYXB0ZXIuc2V0VmFsdWUoQ2FjaGVDb29yZGluYXRpb25UeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZShjb29yZGluYXRpb25UeXBlKSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX1BST1BFUlRZLCBvbGQsIGNvb3JkaW5hdGlvblR5cGUpOworCX0KKworCXByaXZhdGUgQ2FjaGVDb29yZGluYXRpb25UeXBlIGJ1aWxkQ29vcmRpbmF0aW9uVHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gQ2FjaGVDb29yZGluYXRpb25UeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuY29vcmRpbmF0aW9uVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29vcmRpbmF0aW9uVHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKENPT1JESU5BVElPTl9UWVBFX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX1RZUEUpOworCX0KKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkU2l6ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX1NJWkUsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkU2hhcmVkQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5DQUNIRV9fU0hBUkVELCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZEV4cGlyeUFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX0VYUElSWSwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRBbHdheXNSZWZyZXNoQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5DQUNIRV9fQUxXQVlTX1JFRlJFU0gsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5DQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZERpc2FibGVIaXRzQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5DQUNIRV9fRElTQUJMRV9ISVRTLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQ29vcmRpbmF0aW9uVHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkRXhwaXJ5VGltZU9mRGF5QWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSwgRWNsaXBzZUxpbmsuVElNRV9PRl9EQVkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzBiYzlhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DaGFuZ2VUcmFja2luZworICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248VHlwZT4KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKKwlwcml2YXRlIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZTsKKworCisJcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlKSB7CisJCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odHlwZSwgVkFMVUVfQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0VmFsdWUodGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKKwl9CisKKworCS8vICoqKioqKioqKiogQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHZhbHVlCisJcHVibGljIENoYW5nZVRyYWNraW5nVHlwZSBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWUoQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlDaGFuZ2VUcmFja2luZ1R5cGUgb2xkID0gdGhpcy52YWx1ZTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZShDaGFuZ2VUcmFja2luZ1R5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKHZhbHVlKSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7CisJfQorCisJcHJpdmF0ZSBDaGFuZ2VUcmFja2luZ1R5cGUgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gQ2hhbmdlVHJhY2tpbmdUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HX19WQUxVRSwgZmFsc2UpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MzM5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnNpb25WYWx1ZQorICovCitmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248TWVtYmVyPgorCWltcGxlbWVudHMgTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24KK3sKKwlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGF0YVZhbHVlRGVjbGFyYXRpb25BZGFwdGVyOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGF0YVZhbHVlQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyBkYXRhVmFsdWU7CisKKwlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gb2JqZWN0VmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXI7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBvYmplY3RWYWx1ZUFkYXB0ZXI7CisJcHJpdmF0ZSBTdHJpbmcgb2JqZWN0VmFsdWU7CisKKworCVNvdXJjZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgeworCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgaWRhYSwgbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihtZW1iZXIsIGlkYWEpKTsKKwkJdGhpcy5kYXRhVmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkRGF0YVZhbHVlQWRhcHRlcihpZGFhKTsKKwkJdGhpcy5kYXRhVmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIodGhpcy5kYXRhVmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIpOworCQl0aGlzLm9iamVjdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZE9iamVjdFZhbHVlQWRhcHRlcihpZGFhKTsKKwkJdGhpcy5vYmplY3RWYWx1ZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcih0aGlzLm9iamVjdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKKwl9CisKKwlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKKwkJcmV0dXJuIG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLm1lbWJlciwgZGFlYSk7CisJfQorCisJcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRGF0YVZhbHVlQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIpIHsKKwkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUUsIGZhbHNlKTsKKwl9CisKKwlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRPYmplY3RWYWx1ZUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKSB7CisJCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLCBFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUsIGZhbHNlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy5kYXRhVmFsdWUgPSB0aGlzLmJ1aWxkRGF0YVZhbHVlKGFzdFJvb3QpOworCQl0aGlzLm9iamVjdFZhbHVlID0gdGhpcy5idWlsZE9iamVjdFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnNldERhdGFWYWx1ZSh0aGlzLmJ1aWxkRGF0YVZhbHVlKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRPYmplY3RWYWx1ZSh0aGlzLmJ1aWxkT2JqZWN0VmFsdWUoYXN0Um9vdCkpOworCX0KKworCXB1YmxpYyBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkgeworCQlyZXR1cm4gKEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcikgdGhpcy5hbm5vdGF0aW9uQWRhcHRlcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLmRhdGFWYWx1ZSk7CisJCXNiLmFwcGVuZCgiPT4iKTsgLy8kTk9OLU5MUy0xJAorCQlzYi5hcHBlbmQodGhpcy5vYmplY3RWYWx1ZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIENvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogZGF0YSB2YWx1ZQorCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5kYXRhVmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGF0YVZhbHVlKFN0cmluZyBkYXRhVmFsdWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuZGF0YVZhbHVlLCBkYXRhVmFsdWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMuZGF0YVZhbHVlOworCQl0aGlzLmRhdGFWYWx1ZSA9IGRhdGFWYWx1ZTsKKwkJdGhpcy5kYXRhVmFsdWVBZGFwdGVyLnNldFZhbHVlKGRhdGFWYWx1ZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1ZBTFVFX1BST1BFUlRZLCBvbGQsIGRhdGFWYWx1ZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGREYXRhVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZGF0YVZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldERhdGFWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuZGF0YVZhbHVlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKwkvLyAqKioqKiBvYmplY3QgdmFsdWUKKwlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5vYmplY3RWYWx1ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RWYWx1ZShTdHJpbmcgb2JqZWN0VmFsdWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMub2JqZWN0VmFsdWUsIG9iamVjdFZhbHVlKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLm9iamVjdFZhbHVlOworCQl0aGlzLm9iamVjdFZhbHVlID0gb2JqZWN0VmFsdWU7CisJCXRoaXMub2JqZWN0VmFsdWVBZGFwdGVyLnNldFZhbHVlKG9iamVjdFZhbHVlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBvYmplY3RWYWx1ZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRPYmplY3RWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5vYmplY3RWYWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRPYmplY3RWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMub2JqZWN0VmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOworCX0KKworCisJLy8qKioqKioqKioqKiogTmVzdGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uCisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShOZXN0YWJsZUFubm90YXRpb24gb2xkQW5ub3RhdGlvbikgeworCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gb2xkQ29udmVyc2lvblZhbHVlID0gKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbjsKKwkJdGhpcy5zZXREYXRhVmFsdWUob2xkQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKKwkJdGhpcy5zZXRPYmplY3RWYWx1ZShvbGRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7CisJCXRoaXMuZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkubW92ZUFubm90YXRpb24obmV3SW5kZXgpOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlzdGF0aWMgTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY3JlYXRlQ29udmVyc2lvblZhbHVlKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgaW50IGluZGV4KSB7CisJCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uKHBhcmVudCwgbWVtYmVyLCBidWlsZENvbnZlcnNpb25WYWx1ZUFubm90YXRpb25BZGFwdGVyKGRhYSwgaW5kZXgpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZENvbnZlcnNpb25WYWx1ZUFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVMsIGluZGV4LCBFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFLCBmYWxzZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTY2NWYxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7CisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKworCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhdHRyaWJ1dGUsIFZBTFVFX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnNldFZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIENvbnZlcnRBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIHZhbHVlCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZSh2YWx1ZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBib29sZWFuIHZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhWQUxVRV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ09OVkVSVF9fVkFMVUUsIGZhbHNlLCBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjllMTcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydGVyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IENPTlZFUlRFUl9DTEFTU19BREFQVEVSID0gYnVpbGRDb252ZXJ0ZXJDbGFzc0FkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGNvbnZlcnRlckNsYXNzQWRhcHRlcjsKKwlwcml2YXRlIFN0cmluZyBjb252ZXJ0ZXJDbGFzczsKKworCisJcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgeworCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwkJdGhpcy5jb252ZXJ0ZXJDbGFzc0FkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4obWVtYmVyLCBDT05WRVJURVJfQ0xBU1NfQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7CisJCXRoaXMuY29udmVydGVyQ2xhc3MgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ2xhc3MoYXN0Um9vdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnVwZGF0ZShhc3RSb290KTsKKwkJdGhpcy5zZXRDb252ZXJ0ZXJDbGFzcyh0aGlzLmJ1aWxkQ29udmVydGVyQ2xhc3MoYXN0Um9vdCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBTb3VyY2VOYW1lZENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rLkNPTlZFUlRFUl9fTkFNRTsKKwl9CisKKworCS8vICoqKioqKioqKiogQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBjb252ZXJ0ZXIgY2xhc3MKKwlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkgeworCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDbGFzczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuY29udmVydGVyQ2xhc3MsIGNvbnZlcnRlckNsYXNzKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBvbGQgPSB0aGlzLmNvbnZlcnRlckNsYXNzOworCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gY29udmVydGVyQ2xhc3M7CisJCXRoaXMuY29udmVydGVyQ2xhc3NBZGFwdGVyLnNldFZhbHVlKGNvbnZlcnRlckNsYXNzKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkLCBjb252ZXJ0ZXJDbGFzcyk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRDb252ZXJ0ZXJDbGFzcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDbGFzc0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKENPTlZFUlRFUl9DTEFTU19BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjb252ZXJ0ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZU5hbWUsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiAodGhpcy5jb252ZXJ0ZXJDbGFzcyAhPSBudWxsKQorCQkJCSYmIEpEVFRvb2xzLnR5cGVJc1N1YlR5cGVPZih0aGlzLmNvbnZlcnRlckNsYXNzQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpLCBpbnRlcmZhY2VOYW1lKTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZENvbnZlcnRlckNsYXNzQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNPTlZFUlRFUl9fQ09OVkVSVEVSX0NMQVNTLCBmYWxzZSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2QzMmQxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LlR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ3VzdG9taXplcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxUeXBlPgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7CisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKworCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBUeXBlIHR5cGUpIHsKKwkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0eXBlLCBWQUxVRV9BREFQVEVSKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy5zZXRWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOworCX0KKworCisJLy8gKioqKioqKioqKiBDdXN0b21pemVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiB2YWx1ZQorCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy52YWx1ZSwgdmFsdWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUodmFsdWUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjdXN0b21pemVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gKHRoaXMudmFsdWUgIT0gbnVsbCkKKwkJCQkmJiBKRFRUb29scy50eXBlSXNTdWJUeXBlT2YodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSwgaW50ZXJmYWNlTmFtZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5DVVNUT01JWkVSX19WQUxVRSwgZmFsc2UsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjU2ZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGU7CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuRXhpc3RlbmNlQ2hlY2tpbmcKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPFR5cGU+CisJaW1wbGVtZW50cyBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7CisJcHJpdmF0ZSBFeGlzdGVuY2VUeXBlIHZhbHVlOworCisKKwlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKKwkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0eXBlLCBWQUxVRV9BREFQVEVSKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJdGhpcy5zZXRWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOworCX0KKworCisJLy8gKioqKioqKioqKiBFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogdmFsdWUKKwlwdWJsaWMgRXhpc3RlbmNlVHlwZSBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWUoRXhpc3RlbmNlVHlwZSB2YWx1ZSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy52YWx1ZSwgdmFsdWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJRXhpc3RlbmNlVHlwZSBvbGQgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKEV4aXN0ZW5jZVR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKHZhbHVlKSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7CisJfQorCisJcHJpdmF0ZSBFeGlzdGVuY2VUeXBlIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIEV4aXN0ZW5jZVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkdfX1ZBTFVFLCBmYWxzZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiZTAwYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkpvaW5GZXRjaAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7CisJcHJpdmF0ZSBKb2luRmV0Y2hUeXBlIHZhbHVlOworCisKKwlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhdHRyaWJ1dGUsIFZBTFVFX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLnNldFZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIEpvaW5GZXRjaEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogdmFsdWUKKwlwdWJsaWMgSm9pbkZldGNoVHlwZSBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWUoSm9pbkZldGNoVHlwZSB2YWx1ZSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy52YWx1ZSwgdmFsdWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJSm9pbkZldGNoVHlwZSBvbGQgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKEpvaW5GZXRjaFR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKHZhbHVlKSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7CisJfQorCisJcHJpdmF0ZSBKb2luRmV0Y2hUeXBlIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIEpvaW5GZXRjaFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX19WQUxVRSwgZmFsc2UpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyNThkOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5NdXRhYmxlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiB2YWx1ZUFkYXB0ZXI7CisJcHJpdmF0ZSBCb29sZWFuIHZhbHVlOworCisKKwlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGF0dHJpYnV0ZSwgVkFMVUVfQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0VmFsdWUodGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKKwl9CisKKworCS8vICoqKioqKioqKiogTXV0YWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogdmFsdWUKKwlwdWJsaWMgQm9vbGVhbiBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgeworCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy52YWx1ZSwgdmFsdWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJQm9vbGVhbiBvbGQgPSB0aGlzLnZhbHVlOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKKwl9CisKKwlwcml2YXRlIEJvb2xlYW4gYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5NVVRBQkxFX19WQUxVRSwgZmFsc2UsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGE3Nzg3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0ZXIKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlN0cnVjdENvbnZlcnRlcgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHlwZUNvbnZlcnRlcgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcgorICovCithYnN0cmFjdCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxNZW1iZXI+CisJaW1wbGVtZW50cyBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgoreworCWZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZURlY2xhcmF0aW9uQWRhcHRlcjsKKwlmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKKwlTdHJpbmcgbmFtZTsKKwkJCisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCisKKwlTb3VyY2VFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKKwkJc3VwZXIocGFyZW50LCBtZW1iZXIsIGRhYSk7CisJCXRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgdGhpcy5nZXROYW1lRWxlbWVudE5hbWUoKSwgZmFsc2UpOyAvLyBmYWxzZSA9IGRvIG5vdCByZW1vdmUgYW5ub3RhdGlvbiB3aGVuIGVtcHR5CisJCXRoaXMubmFtZUFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5tZW1iZXIsIHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZShhc3RSb290KTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0TmFtZSh0aGlzLmJ1aWxkTmFtZShhc3RSb290KSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMubmFtZSk7CisJfQorCQorCisJLy8gKioqKioqKioqKiBOYW1lZENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogbmFtZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm5hbWUsIG5hbWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZShuYW1lKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE92ZXJyaWRlQW5ub3RhdGlvbi5OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKKwl9CisKKwlhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOWM1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Bbm5vdGF0aW9uQ29udGFpbmVyVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk9iamVjdFR5cGVDb252ZXJ0ZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBERUZBVUxUX09CSkVDVF9WQUxVRV9BREFQVEVSID0gYnVpbGREZWZhdWx0T2JqZWN0VmFsdWVBZGFwdGVyKCk7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkZWZhdWx0T2JqZWN0VmFsdWVBZGFwdGVyOworCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZTsKKworCXByaXZhdGUgZmluYWwgVmVjdG9yPE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzID0gbmV3IFZlY3RvcjxOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4oKTsKKwlwcml2YXRlIGZpbmFsIENvbnZlcnNpb25WYWx1ZXNBbm5vdGF0aW9uQ29udGFpbmVyIGNvbnZlcnNpb25WYWx1ZXNDb250YWluZXIgPSBuZXcgQ29udmVyc2lvblZhbHVlc0Fubm90YXRpb25Db250YWluZXIoKTsKKworCisJcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKKwkJc3VwZXIocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihtZW1iZXIsIERFRkFVTFRfT0JKRUNUX1ZBTFVFX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOworCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IHRoaXMuYnVpbGREZWZhdWx0T2JqZWN0VmFsdWUoYXN0Um9vdCk7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy5pbml0aWFsaXplKHRoaXMuY29udmVyc2lvblZhbHVlc0NvbnRhaW5lciwgYXN0Um9vdCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnVwZGF0ZShhc3RSb290KTsKKwkJdGhpcy5zZXREZWZhdWx0T2JqZWN0VmFsdWUodGhpcy5idWlsZERlZmF1bHRPYmplY3RWYWx1ZShhc3RSb290KSk7CisJCUFubm90YXRpb25Db250YWluZXJUb29scy51cGRhdGUodGhpcy5jb252ZXJzaW9uVmFsdWVzQ29udGFpbmVyLCBhc3RSb290KTsKKwl9CisKKworCS8vICoqKioqKioqKiogU291cmNlTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX05BTUU7CisJfQorCisKKwkvLyAqKioqKioqKioqIFNvdXJjZUJhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0RGF0YVR5cGVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOworCX0KKworCUBPdmVycmlkZQorCVN0cmluZyBnZXRPYmplY3RUeXBlRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOworCX0KKworCisJLy8gKioqKioqKioqKiBPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBkZWZhdWx0IG9iamVjdCB2YWx1ZQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlKFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlLCBkZWZhdWx0T2JqZWN0VmFsdWUpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOworCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IGRlZmF1bHRPYmplY3RWYWx1ZTsKKwkJdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWVBZGFwdGVyLnNldFZhbHVlKGRlZmF1bHRPYmplY3RWYWx1ZSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBkZWZhdWx0T2JqZWN0VmFsdWUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXREZWZhdWx0T2JqZWN0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShERUZBVUxUX09CSkVDVF9WQUxVRV9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKwkvLyAqKioqKiBjb252ZXJzaW9uIHZhbHVlcworCXB1YmxpYyBMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzKCkgeworCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4odGhpcy5jb252ZXJzaW9uVmFsdWVzKTsKKwl9CisKKwlMaXN0SXRlcmF0b3I8TmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IG5lc3RhYmxlQ29udmVyc2lvblZhbHVlcygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4odGhpcy5jb252ZXJzaW9uVmFsdWVzKTsKKwl9CisKKwlwdWJsaWMgaW50IGNvbnZlcnNpb25WYWx1ZXNTaXplKCkgeworCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVzLnNpemUoKTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY29udmVyc2lvblZhbHVlQXQoaW50IGluZGV4KSB7CisJCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZXMuZ2V0KGluZGV4KTsKKwl9CisKKwlwdWJsaWMgaW50IGluZGV4T2ZDb252ZXJzaW9uVmFsdWUoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZSkgeworCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVzLmluZGV4T2YoY29udmVyc2lvblZhbHVlKTsKKwl9CisKKwlwdWJsaWMgTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gYWRkQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgeworCQlyZXR1cm4gKE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uKSBBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMuYWRkTmVzdGVkQW5ub3RhdGlvbihpbmRleCwgdGhpcy5jb252ZXJzaW9uVmFsdWVzQ29udGFpbmVyKTsKKwl9CisKKwlOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBhZGRDb252ZXJzaW9uVmFsdWVJbnRlcm5hbCgpIHsKKwkJTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY29udmVyc2lvblZhbHVlID0gdGhpcy5idWlsZENvbnZlcnNpb25WYWx1ZSh0aGlzLmNvbnZlcnNpb25WYWx1ZXMuc2l6ZSgpKTsKKwkJdGhpcy5jb252ZXJzaW9uVmFsdWVzLmFkZChjb252ZXJzaW9uVmFsdWUpOworCQlyZXR1cm4gY29udmVyc2lvblZhbHVlOworCX0KKworCXByaXZhdGUgTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gYnVpbGRDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KSB7CisJCXJldHVybiBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uY3JlYXRlQ29udmVyc2lvblZhbHVlKHRoaXMsIHRoaXMubWVtYmVyLCB0aGlzLmRhYSwgaW5kZXgpOworCX0KKworCXZvaWQgY29udmVyc2lvblZhbHVlQWRkZWQoaW50IGluZGV4LCBOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBjb252ZXJzaW9uVmFsdWUpIHsKKwkJdGhpcy5maXJlSXRlbUFkZGVkKENPTlZFUlNJT05fVkFMVUVTX0xJU1QsIGluZGV4LCBjb252ZXJzaW9uVmFsdWUpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdmVDb252ZXJzaW9uVmFsdWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLm1vdmVOZXN0ZWRBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5jb252ZXJzaW9uVmFsdWVzQ29udGFpbmVyKTsKKwl9CisKKwlOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBtb3ZlQ29udmVyc2lvblZhbHVlSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuY29udmVyc2lvblZhbHVlcywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KS5nZXQodGFyZ2V0SW5kZXgpOworCX0KKworCXZvaWQgY29udmVyc2lvblZhbHVlTW92ZWQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJdGhpcy5maXJlSXRlbU1vdmVkKENPTlZFUlNJT05fVkFMVUVTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgeworCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMucmVtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbmRleCwgdGhpcy5jb252ZXJzaW9uVmFsdWVzQ29udGFpbmVyKTsKKwl9CisKKwlOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiByZW1vdmVDb252ZXJzaW9uVmFsdWVJbnRlcm5hbChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlcy5yZW1vdmUoaW5kZXgpOworCX0KKworCXZvaWQgY29udmVyc2lvblZhbHVlUmVtb3ZlZChpbnQgaW5kZXgsIE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZSkgeworCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChDT05WRVJTSU9OX1ZBTFVFU19MSVNULCBpbmRleCwgY29udmVyc2lvblZhbHVlKTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZERlZmF1bHRPYmplY3RWYWx1ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFLCBmYWxzZSwgU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogY29udmVyc2lvbiB2YWx1ZSBjb250YWluZXIgKioqKioqKioqKgorCisJLyoqCisJICogYWRhcHQgdGhlIEFubm90YXRpb25Db250YWluZXIgaW50ZXJmYWNlIHRvIHRoZSBvYmplY3QgdHlwZSBjb252ZXJ0ZXIncworCSAqIGNvbnZlcnNpb24gdmFsdWVzCisJICovCisJY2xhc3MgQ29udmVyc2lvblZhbHVlc0Fubm90YXRpb25Db250YWluZXIKKwkJaW1wbGVtZW50cyBBbm5vdGF0aW9uQ29udGFpbmVyPE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiAKKwl7CisJCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKSB7CisJCQlyZXR1cm4gU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi50aGlzLmdldEFubm90YXRpb25OYW1lKCk7CisJCX0KKworCQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0Q29udGFpbmVySmR0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkJcmV0dXJuIFNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24udGhpcy5nZXRKZHRBbm5vdGF0aW9uKGFzdFJvb3QpOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKKwkJCXJldHVybiBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7CisJCX0KKworCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBuZXN0ZWRBbm5vdGF0aW9ucygpIHsKKwkJCXJldHVybiBTb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLnRoaXMubmVzdGFibGVDb252ZXJzaW9uVmFsdWVzKCk7CisJCX0KKworCQlwdWJsaWMgaW50IG5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKKwkJCXJldHVybiBTb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLnRoaXMuY29udmVyc2lvblZhbHVlc1NpemUoKTsKKwkJfQorCisJCXB1YmxpYyBOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBhZGROZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoKSB7CisJCQlyZXR1cm4gU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi50aGlzLmFkZENvbnZlcnNpb25WYWx1ZUludGVybmFsKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uQWRkZWQoaW50IGluZGV4LCBOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uKSB7CisJCQlTb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLnRoaXMuY29udmVyc2lvblZhbHVlQWRkZWQoaW5kZXgsIG5lc3RlZEFubm90YXRpb24pOworCQl9CisKKwkJcHVibGljIE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIG1vdmVOZXN0ZWRBbm5vdGF0aW9uSW50ZXJuYWwoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJCXJldHVybiBTb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLnRoaXMubW92ZUNvbnZlcnNpb25WYWx1ZUludGVybmFsKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBuZXN0ZWRBbm5vdGF0aW9uTW92ZWQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKKwkJCVNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24udGhpcy5jb252ZXJzaW9uVmFsdWVNb3ZlZCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOworCQl9CisKKwkJcHVibGljIE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIHJlbW92ZU5lc3RlZEFubm90YXRpb25JbnRlcm5hbChpbnQgaW5kZXgpIHsKKwkJCXJldHVybiBTb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLnRoaXMucmVtb3ZlQ29udmVyc2lvblZhbHVlSW50ZXJuYWwoaW5kZXgpOworCQl9CisKKwkJcHVibGljIHZvaWQgbmVzdGVkQW5ub3RhdGlvblJlbW92ZWQoaW50IGluZGV4LCBOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uKSB7CisJCQlTb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLnRoaXMuY29udmVyc2lvblZhbHVlUmVtb3ZlZChpbmRleCwgbmVzdGVkQW5ub3RhdGlvbik7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTE4YmJmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUHJpdmF0ZU93bmVkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisKKwlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJLy8gbm90aGluZyB0byB1cGRhdGUKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3ZmIwZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZE9ubHkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPFR5cGU+CisJaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCisJcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKKwkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJLy8gbm90aGluZyB0byB1cGRhdGUKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI3NGM0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlJlYWRUcmFuc2Zvcm1lcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisKKwlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisKKwkvLyAqKioqKioqKioqIFNvdXJjZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0VHJhbnNmb3JtZXJDbGFzc0VsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUl9fVFJBTlNGT1JNRVJfQ0xBU1M7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUl9fTUVUSE9EOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMTQ0MzgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5TdHJ1Y3RDb252ZXJ0ZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gQ09OVkVSVEVSX0FEQVBURVIgPSBidWlsZENvbnZlcnRlckFkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGNvbnZlcnRlckFkYXB0ZXI7CisJcHJpdmF0ZSBTdHJpbmcgY29udmVydGVyOworCisKKwlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCQl0aGlzLmNvbnZlcnRlckFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4obWVtYmVyLCBDT05WRVJURVJfQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7CisJCXRoaXMuY29udmVydGVyID0gdGhpcy5idWlsZENvbnZlcnRlcihhc3RSb290KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIudXBkYXRlKGFzdFJvb3QpOworCQl0aGlzLnNldENvbnZlcnRlcih0aGlzLmJ1aWxkQ29udmVydGVyKGFzdFJvb3QpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogU291cmNlTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCUBPdmVycmlkZQorCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSX19OQU1FOworCX0KKworCisJLy8gKioqKioqKioqKiBTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIGNvbnZlcnRlcgorCXB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydGVyKCkgeworCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXIpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuY29udmVydGVyLCBjb252ZXJ0ZXIpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMuY29udmVydGVyOworCQl0aGlzLmNvbnZlcnRlciA9IGNvbnZlcnRlcjsKKwkJdGhpcy5jb252ZXJ0ZXJBZGFwdGVyLnNldFZhbHVlKGNvbnZlcnRlcik7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfUFJPUEVSVFksIG9sZCwgY29udmVydGVyKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZENvbnZlcnRlcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydGVyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoQ09OVkVSVEVSX0FEQVBURVIsIGFzdFJvb3QpOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQ29udmVydGVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUiwgZmFsc2UsIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlMzZiYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDE5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVGltZU9mRGF5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248VHlwZT4KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbgoreworCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gaG91ckRlY2xhcmF0aW9uQWRhcHRlcjsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBob3VyQWRhcHRlcjsKKwlwcml2YXRlIEludGVnZXIgaG91cjsKKworCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gbWludXRlRGVjbGFyYXRpb25BZGFwdGVyOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IG1pbnV0ZUFkYXB0ZXI7CisJcHJpdmF0ZSBJbnRlZ2VyIG1pbnV0ZTsKKworCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IHNlY29uZEFkYXB0ZXI7CisJcHJpdmF0ZSBJbnRlZ2VyIHNlY29uZDsKKworCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gbWlsbGlzZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXI7CisJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gbWlsbGlzZWNvbmRBZGFwdGVyOworCXByaXZhdGUgSW50ZWdlciBtaWxsaXNlY29uZDsKKworCisJcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgeworCQlzdXBlcihwYXJlbnQsIHR5cGUsIGRhYSk7CisJCXRoaXMuaG91ckRlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkSG91ckFkYXB0ZXIoZGFhKTsKKwkJdGhpcy5ob3VyQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odHlwZSwgdGhpcy5ob3VyRGVjbGFyYXRpb25BZGFwdGVyKTsKKwkJdGhpcy5taW51dGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZE1pbnV0ZUFkYXB0ZXIoZGFhKTsKKwkJdGhpcy5taW51dGVBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPih0eXBlLCB0aGlzLm1pbnV0ZURlY2xhcmF0aW9uQWRhcHRlcik7CisJCXRoaXMuc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRTZWNvbmRBZGFwdGVyKGRhYSk7CisJCXRoaXMuc2Vjb25kQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odHlwZSwgdGhpcy5zZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXIpOworCQl0aGlzLm1pbGxpc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRNaWxsaXNlY29uZEFkYXB0ZXIoZGFhKTsKKwkJdGhpcy5taWxsaXNlY29uZEFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHR5cGUsIHRoaXMubWlsbGlzZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQl0aGlzLmhvdXIgPSB0aGlzLmJ1aWxkSG91cihhc3RSb290KTsKKwkJdGhpcy5taW51dGUgPSB0aGlzLmJ1aWxkTWludXRlKGFzdFJvb3QpOworCQl0aGlzLnNlY29uZCA9IHRoaXMuYnVpbGRTZWNvbmQoYXN0Um9vdCk7CisJCXRoaXMubWlsbGlzZWNvbmQgPSB0aGlzLmJ1aWxkTWlsbGlzZWNvbmQoYXN0Um9vdCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0SG91cih0aGlzLmJ1aWxkSG91cihhc3RSb290KSk7CisJCXRoaXMuc2V0TWludXRlKHRoaXMuYnVpbGRNaW51dGUoYXN0Um9vdCkpOworCQl0aGlzLnNldFNlY29uZCh0aGlzLmJ1aWxkU2Vjb25kKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRNaWxsaXNlY29uZCh0aGlzLmJ1aWxkTWlsbGlzZWNvbmQoYXN0Um9vdCkpOworCX0KKworCisJLy8gKioqKioqKioqKiBUaW1lT2ZEYXlBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCS8vICoqKioqIGhvdXIKKwlwdWJsaWMgSW50ZWdlciBnZXRIb3VyKCkgeworCQlyZXR1cm4gdGhpcy5ob3VyOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhvdXIoSW50ZWdlciBob3VyKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLmhvdXIsIGhvdXIpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJSW50ZWdlciBvbGQgPSB0aGlzLmhvdXI7CisJCXRoaXMuaG91ciA9IGhvdXI7CisJCXRoaXMuaG91ckFkYXB0ZXIuc2V0VmFsdWUoaG91cik7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChIT1VSX1BST1BFUlRZLCBvbGQsIGhvdXIpOworCX0KKworCXByaXZhdGUgSW50ZWdlciBidWlsZEhvdXIoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuaG91ckFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRIb3VyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5ob3VyRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKwkvLyAqKioqKiBtaW51dGUKKwlwdWJsaWMgSW50ZWdlciBnZXRNaW51dGUoKSB7CisJCXJldHVybiB0aGlzLm1pbnV0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNaW51dGUoSW50ZWdlciBuZXdNaW51dGUpIHsKKwkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm1pbnV0ZSwgbmV3TWludXRlKSkgeworCQkJcmV0dXJuOworCQl9CisJCUludGVnZXIgb2xkTWludXRlID0gdGhpcy5taW51dGU7CisJCXRoaXMubWludXRlID0gbmV3TWludXRlOworCQl0aGlzLm1pbnV0ZUFkYXB0ZXIuc2V0VmFsdWUobmV3TWludXRlKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChNSU5VVEVfUFJPUEVSVFksIG9sZE1pbnV0ZSwgbmV3TWludXRlKTsKKwl9CisKKwlwcml2YXRlIEludGVnZXIgYnVpbGRNaW51dGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMubWludXRlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE1pbnV0ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubWludXRlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKwkvLyAqKioqKiBzZWNvbmQKKwlwdWJsaWMgSW50ZWdlciBnZXRTZWNvbmQoKSB7CisJCXJldHVybiB0aGlzLnNlY29uZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTZWNvbmQoSW50ZWdlciBuZXdTZWNvbmQpIHsKKwkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnNlY29uZCwgbmV3U2Vjb25kKSkgeworCQkJcmV0dXJuOworCQl9CisJCUludGVnZXIgb2xkU2Vjb25kID0gdGhpcy5zZWNvbmQ7CisJCXRoaXMuc2Vjb25kID0gbmV3U2Vjb25kOworCQl0aGlzLnNlY29uZEFkYXB0ZXIuc2V0VmFsdWUobmV3U2Vjb25kKTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChTRUNPTkRfUFJPUEVSVFksIG9sZFNlY29uZCwgbmV3U2Vjb25kKTsKKwl9CisKKwlwcml2YXRlIEludGVnZXIgYnVpbGRTZWNvbmQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuc2Vjb25kQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFNlY29uZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKKwl9CisKKwkvLyAqKioqKiBtaWxsaXNlY29uZAorCXB1YmxpYyBJbnRlZ2VyIGdldE1pbGxpc2Vjb25kKCkgeworCQlyZXR1cm4gdGhpcy5taWxsaXNlY29uZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNaWxsaXNlY29uZChJbnRlZ2VyIG5ld01pbGxpc2Vjb25kKSB7CisJCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQodGhpcy5taWxsaXNlY29uZCwgbmV3TWlsbGlzZWNvbmQpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJSW50ZWdlciBvbGRNaWxsaXNlY29uZCA9IHRoaXMubWlsbGlzZWNvbmQ7CisJCXRoaXMubWlsbGlzZWNvbmQgPSBuZXdNaWxsaXNlY29uZDsKKwkJdGhpcy5taWxsaXNlY29uZEFkYXB0ZXIuc2V0VmFsdWUobmV3TWlsbGlzZWNvbmQpOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1JTExJU0VDT05EX1BST1BFUlRZLCBvbGRNaWxsaXNlY29uZCwgbmV3TWlsbGlzZWNvbmQpOworCX0KKworCXByaXZhdGUgSW50ZWdlciBidWlsZE1pbGxpc2Vjb25kKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLm1pbGxpc2Vjb25kQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE1pbGxpc2Vjb25kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5taWxsaXNlY29uZERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkSG91ckFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZGFhLCBFY2xpcHNlTGluay5USU1FX09GX0RBWV9fSE9VUiwgZmFsc2UsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkTWludXRlQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihkYWEsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZX19NSU5VVEUsIGZhbHNlLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZFNlY29uZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZGFhLCBFY2xpcHNlTGluay5USU1FX09GX0RBWV9fU0VDT05ELCBmYWxzZSwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRNaWxsaXNlY29uZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZGFhLCBFY2xpcHNlTGluay5USU1FX09GX0RBWV9fTUlMTElTRUNPTkQsIGZhbHNlLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI0ZTZlNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHJhbnNmb3JtYXRpb24KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCisJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBGRVRDSF9BREFQVEVSID0gYnVpbGRGZXRjaEFkYXB0ZXIoKTsKKwlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZldGNoQWRhcHRlcjsKKwlwcml2YXRlIEZldGNoVHlwZSBmZXRjaDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IE9QVElPTkFMX0FEQVBURVIgPSBidWlsZE9wdGlvbmFsQWRhcHRlcigpOworCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG9wdGlvbmFsQWRhcHRlcjsKKwlwcml2YXRlIEJvb2xlYW4gb3B0aW9uYWw7CisKKworCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKKwkJdGhpcy5mZXRjaEFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYXR0cmlidXRlLCBGRVRDSF9BREFQVEVSKTsKKwkJdGhpcy5vcHRpb25hbEFkYXB0ZXIgPSBuZXcgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGF0dHJpYnV0ZSwgT1BUSU9OQUxfQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMub3B0aW9uYWwgPSB0aGlzLmJ1aWxkT3B0aW9uYWwoYXN0Um9vdCk7CisJCXRoaXMuZmV0Y2ggPSB0aGlzLmJ1aWxkRmV0Y2goYXN0Um9vdCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0T3B0aW9uYWwodGhpcy5idWlsZE9wdGlvbmFsKGFzdFJvb3QpKTsKKwkJdGhpcy5zZXRGZXRjaCh0aGlzLmJ1aWxkRmV0Y2goYXN0Um9vdCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMuZmV0Y2gpOworCX0KKworCisJLy8gKioqKioqKioqKiBUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJLy8gKioqKiogZmV0Y2gKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgeworCQlyZXR1cm4gdGhpcy5mZXRjaDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMuZmV0Y2gsIGZldGNoKSkgeworCQkJcmV0dXJuOworCQl9CisJCUZldGNoVHlwZSBvbGQgPSB0aGlzLmZldGNoOworCQl0aGlzLmZldGNoID0gZmV0Y2g7CisJCXRoaXMuZmV0Y2hBZGFwdGVyLnNldFZhbHVlKEZldGNoVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUoZmV0Y2gpKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKKwl9CisKKwlwcml2YXRlIEZldGNoVHlwZSBidWlsZEZldGNoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiBGZXRjaFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5mZXRjaEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShGRVRDSF9BREFQVEVSLCBhc3RSb290KTsKKwl9CisKKwkvLyAqKioqKiBvcHRpb25hbAorCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgeworCQlyZXR1cm4gdGhpcy5vcHRpb25hbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLm9wdGlvbmFsLCBvcHRpb25hbCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlCb29sZWFuIG9sZCA9IHRoaXMub3B0aW9uYWw7CisJCXRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKKwkJdGhpcy5vcHRpb25hbEFkYXB0ZXIuc2V0VmFsdWUob3B0aW9uYWwpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1BUSU9OQUxfUFJPUEVSVFksIG9sZCwgb3B0aW9uYWwpOworCX0KKworCXByaXZhdGUgQm9vbGVhbiBidWlsZE9wdGlvbmFsKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLm9wdGlvbmFsQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoT1BUSU9OQUxfQURBUFRFUiwgYXN0Um9vdCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkT3B0aW9uYWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OX19PUFRJT05BTCwgZmFsc2UsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRGZXRjaEFkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT05fX0ZFVENILCBmYWxzZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZWFjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbjsKKworLyoqCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkVHJhbnNmb3JtZXIKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLldyaXRlVHJhbnNmb3JtZXIKKyAqLworYWJzdHJhY3QgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24KK3sKKwlmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRyYW5zZm9ybWVyQ2xhc3NEZWNsYXJhdGlvbkFkYXB0ZXI7CisJZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdHJhbnNmb3JtZXJDbGFzc0FkYXB0ZXI7CisJU3RyaW5nIHRyYW5zZm9ybWVyQ2xhc3M7CisKKwlmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG1ldGhvZERlY2xhcmF0aW9uQWRhcHRlcjsKKwlmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBtZXRob2RBZGFwdGVyOworCVN0cmluZyBtZXRob2Q7CisKKworCVNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgeworCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgZGFhKTsKKwkJdGhpcy50cmFuc2Zvcm1lckNsYXNzRGVjbGFyYXRpb25BZGFwdGVyID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgdGhpcy5nZXRUcmFuc2Zvcm1lckNsYXNzRWxlbWVudE5hbWUoKSwgZmFsc2UsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCQl0aGlzLnRyYW5zZm9ybWVyQ2xhc3NBZGFwdGVyID0gbmV3IFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGF0dHJpYnV0ZSwgdGhpcy50cmFuc2Zvcm1lckNsYXNzRGVjbGFyYXRpb25BZGFwdGVyKTsKKworCQl0aGlzLm1ldGhvZERlY2xhcmF0aW9uQWRhcHRlciA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgdGhpcy5nZXRNZXRob2RFbGVtZW50TmFtZSgpLCBmYWxzZSk7CisJCXRoaXMubWV0aG9kQWRhcHRlciA9IG5ldyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhdHRyaWJ1dGUsIHRoaXMubWV0aG9kRGVjbGFyYXRpb25BZGFwdGVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMudHJhbnNmb3JtZXJDbGFzcyA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1lckNsYXNzKGFzdFJvb3QpOworCQl0aGlzLm1ldGhvZCA9IHRoaXMuYnVpbGRNZXRob2QoYXN0Um9vdCk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXRoaXMuc2V0VHJhbnNmb3JtZXJDbGFzcyh0aGlzLmJ1aWxkVHJhbnNmb3JtZXJDbGFzcyhhc3RSb290KSk7CisJCXRoaXMuc2V0TWV0aG9kKHRoaXMuYnVpbGRNZXRob2QoYXN0Um9vdCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJc2IuYXBwZW5kKHRoaXMudHJhbnNmb3JtZXJDbGFzcyk7CisJfQorCisKKwkvLyAqKioqKioqKioqIFRyYW5zZm9ybWVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiB0cmFuc2Zvcm1lciBjbGFzcworCXB1YmxpYyBTdHJpbmcgZ2V0VHJhbnNmb3JtZXJDbGFzcygpIHsKKwkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXJDbGFzczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUcmFuc2Zvcm1lckNsYXNzKFN0cmluZyB0cmFuc2Zvcm1lckNsYXNzKSB7CisJCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh0aGlzLnRyYW5zZm9ybWVyQ2xhc3MsIHRyYW5zZm9ybWVyQ2xhc3MpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMudHJhbnNmb3JtZXJDbGFzczsKKwkJdGhpcy50cmFuc2Zvcm1lckNsYXNzID0gdHJhbnNmb3JtZXJDbGFzczsKKwkJdGhpcy50cmFuc2Zvcm1lckNsYXNzQWRhcHRlci5zZXRWYWx1ZSh0cmFuc2Zvcm1lckNsYXNzKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRSQU5TRk9STUVSX0NMQVNTX1BST1BFUlRZLCBvbGQsIHRyYW5zZm9ybWVyQ2xhc3MpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkVHJhbnNmb3JtZXJDbGFzcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lckNsYXNzQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKKwl9CisKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRyYW5zZm9ybWVyQ2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnRyYW5zZm9ybWVyQ2xhc3NEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOworCX0KKworCWFic3RyYWN0IFN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzRWxlbWVudE5hbWUoKTsKKworCS8vICoqKioqIG1ldGhvZAorCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgeworCQlyZXR1cm4gdGhpcy5tZXRob2Q7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWV0aG9kKFN0cmluZyBtZXRob2QpIHsKKwkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHRoaXMubWV0aG9kLCBtZXRob2QpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIG9sZCA9IHRoaXMubWV0aG9kOworCQl0aGlzLm1ldGhvZCA9IG1ldGhvZDsKKwkJdGhpcy5tZXRob2RBZGFwdGVyLnNldFZhbHVlKG1ldGhvZCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNRVRIT0RfUFJPUEVSVFksIG9sZCwgbWV0aG9kKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZE1ldGhvZChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gdGhpcy5tZXRob2RBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWV0aG9kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5tZXRob2REZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOworCX0KKworCWFic3RyYWN0IFN0cmluZyBnZXRNZXRob2RFbGVtZW50TmFtZSgpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmY3NjcwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247CisKKy8qKgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHlwZUNvbnZlcnRlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgorCWV4dGVuZHMgU291cmNlQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KKwlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7CisKKworCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7CisJCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7CisJCXJldHVybiBBTk5PVEFUSU9OX05BTUU7CisJfQorCisKKwkvLyAqKioqKioqKioqIFNvdXJjZU5hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX05BTUU7CisJfQorCisKKwkvLyAqKioqKioqKioqIFNvdXJjZUJhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0RGF0YVR5cGVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEU7CisJfQorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldE9iamVjdFR5cGVFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODE5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlZhcmlhYmxlT25lVG9PbmUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPgorCWltcGxlbWVudHMgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbgoreworCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKKworCisJcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCS8vIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQorCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQkvLyBub3RoaW5nIHRvIHVwZGF0ZQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAyNmYxNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uOworCisvKioKKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLldyaXRlVHJhbnNmb3JtZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24KKwlleHRlbmRzIFNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOworCisJcHJpdmF0ZSBmaW5hbCBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlciBjb2x1bW5BZGFwdGVyOworCXByaXZhdGUgQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW47CisKKworCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOworCQl0aGlzLmNvbHVtbkFkYXB0ZXIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5tZW1iZXIsIGJ1aWxkQ29sdW1uQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5kYWEpKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgeworCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKKwkJaWYgKHRoaXMuY29sdW1uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpICE9IG51bGwpIHsKKwkJCXRoaXMuY29sdW1uID0gY3JlYXRlQ29sdW1uKHRoaXMsIHRoaXMubWVtYmVyLCB0aGlzLmRhYSk7CisJCQl0aGlzLmNvbHVtbi5pbml0aWFsaXplKGFzdFJvb3QpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CisJCXN1cGVyLnVwZGF0ZShhc3RSb290KTsKKwkJaWYgKHRoaXMuY29sdW1uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpID09IG51bGwpIHsKKwkJCXRoaXMuc2V0Q29sdW1uKG51bGwpOworCQl9IGVsc2UgeworCQkJaWYgKHRoaXMuY29sdW1uID09IG51bGwpIHsKKwkJCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbCA9IGNyZWF0ZUNvbHVtbih0aGlzLCB0aGlzLm1lbWJlciwgdGhpcy5kYWEpOworCQkJCWNvbC5pbml0aWFsaXplKGFzdFJvb3QpOworCQkJCXRoaXMuc2V0Q29sdW1uKGNvbCk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuY29sdW1uLnVwZGF0ZShhc3RSb290KTsKKwkJCX0KKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBTb3VyY2VUcmFuc2Zvcm1lckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJU3RyaW5nIGdldFRyYW5zZm9ybWVyQ2xhc3NFbGVtZW50TmFtZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSX19UUkFOU0ZPUk1FUl9DTEFTUzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudE5hbWUoKSB7CisJCXJldHVybiBFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUl9fTUVUSE9EOworCX0KKworCisJLy8gKioqKioqKioqKiBXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvLyAqKioqKiBjb2x1bW4KKwlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW4oKSB7CisJCXJldHVybiB0aGlzLmNvbHVtbjsKKwl9CisKKwlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXROb25OdWxsQ29sdW1uKCkgeworCQlyZXR1cm4gKHRoaXMuY29sdW1uICE9IG51bGwpID8gdGhpcy5jb2x1bW4gOiBuZXcgTnVsbEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckNvbHVtbkFubm90YXRpb24odGhpcyk7CisJfQorCisJcHVibGljIENvbHVtbkFubm90YXRpb24gYWRkQ29sdW1uKCkgeworCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbCA9IGNyZWF0ZUNvbHVtbih0aGlzLCB0aGlzLm1lbWJlciwgdGhpcy5kYWEpOworCQljb2wubmV3QW5ub3RhdGlvbigpOworCQl0aGlzLnNldENvbHVtbihjb2wpOworCQlyZXR1cm4gY29sOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbigpIHsKKwkJdGhpcy5jb2x1bW4ucmVtb3ZlQW5ub3RhdGlvbigpOworCQl0aGlzLnNldENvbHVtbihudWxsKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0Q29sdW1uKENvbHVtbkFubm90YXRpb24gbmV3Q29sdW1uKSB7CisJCUNvbHVtbkFubm90YXRpb24gb2xkID0gdGhpcy5jb2x1bW47CisJCXRoaXMuY29sdW1uID0gbmV3Q29sdW1uOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MVU1OX1BST1BFUlRZLCBvbGQsIG5ld0NvbHVtbik7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRDb2x1bW5UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJaWYgKHRoaXMuY29sdW1uICE9IG51bGwpIHsKKwkJCXJldHVybiB0aGlzLmNvbHVtbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7CisJCX0KKwkJcmV0dXJuIGdldFRleHRSYW5nZShhc3RSb290KTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZENvbHVtbkFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgd3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25BZGFwdGVyKSB7CisJCXJldHVybiBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcih3cml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkFkYXB0ZXIsIEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSX19DT0xVTU4sIEpQQS5DT0xVTU4sIGZhbHNlKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBDb2x1bW5Bbm5vdGF0aW9uIGNyZWF0ZUNvbHVtbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciB3cml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkFkYXB0ZXIpIHsKKwkJcmV0dXJuIG5ldyBTb3VyY2VDb2x1bW5Bbm5vdGF0aW9uKHBhcmVudCwgbWVtYmVyLCBidWlsZENvbHVtbkFubm90YXRpb25BZGFwdGVyKHdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uQWRhcHRlcikpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBjMWU1NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLkFic3RyYWN0WG1sUmVzb3VyY2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXIKKwlleHRlbmRzIEFic3RyYWN0WG1sUmVzb3VyY2VQcm92aWRlcgorCWltcGxlbWVudHMgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcworeworCS8qKgorCSAqIChDb252ZW5pZW5jZSBtZXRob2QpIFJldHVybnMgYW4gRWNsaXBzZUxpbmsgT1JNIHJlc291cmNlIG1vZGVsIHByb3ZpZGVyIGZvciAKKwkgKiB0aGUgZ2l2ZW4gZmlsZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlciBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyKElGaWxlIGZpbGUpIHsKKwkJcmV0dXJuIGdldFhtbFJlc291cmNlUHJvdmlkZXJfKGZpbGUuZ2V0UHJvamVjdCgpLCBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7CisJfQorCQorCS8qKgorCSAqIChDb252ZW5pZW5jZSBtZXRob2QpIFJldHVybnMgYW4gRWNsaXBzZUxpbmsgT1JNIHJlc291cmNlIG1vZGVsIHByb3ZpZGVyIGZvcgorCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGluIHRoZSBzcGVjaWZpZWQgZGVwbG95IGxvY2F0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXIgZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZGVwbG95TG9jYXRpb24pIHsKKwkJcmV0dXJuIGdldFhtbFJlc291cmNlUHJvdmlkZXJfKHByb2plY3QsIEpwdENvcmVQbHVnaW4uZ2V0RGVwbG95bWVudFVSSShwcm9qZWN0LCBkZXBsb3lMb2NhdGlvbikpOworCQkKKwl9CisJCisJLyoqCisJICogKENvbnZlbmllbmNlIG1ldGhvZCkgUmV0dXJucyBhbiBFY2xpcHNlTGluayBPUk0gcmVzb3VyY2UgbW9kZWwgcHJvdmlkZXIgZm9yIAorCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGluIHRoZSBkZWZhdWx0IGRlcGxveSBsb2NhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyIGdldERlZmF1bHRYbWxSZXNvdXJjZVByb3ZpZGVyKElQcm9qZWN0IHByb2plY3QpIHsKKwkJcmV0dXJuIGdldFhtbFJlc291cmNlUHJvdmlkZXIocHJvamVjdCwgSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9GSUxFX1BBVEgpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXIgZ2V0WG1sUmVzb3VyY2VQcm92aWRlcl8oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGxvY2F0aW9uKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyKHByb2plY3QsIG5ldyBQYXRoKGxvY2F0aW9uKSk7CisJfQorCQorCQorCXB1YmxpYyBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCkgeworCQl0aGlzKHByb2plY3QsIG5ldyBQYXRoKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfRklMRV9QQVRIKSk7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCwgSVBhdGggZmlsZVBhdGgpIHsKKwkJc3VwZXIocHJvamVjdCwgZmlsZVBhdGgsIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUm9vdChPYmplY3QgY29uZmlnKSB7CisJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gKElEYXRhTW9kZWwpIGNvbmZpZzsKKwkJWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVudGl0eU1hcHBpbmdzKCk7CisJCWVudGl0eU1hcHBpbmdzLnNldFZlcnNpb24oZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFZFUlNJT04pKTsKKwkJZ2V0UmVzb3VyY2VDb250ZW50cygpLmFkZChlbnRpdHlNYXBwaW5ncyk7CisJCQorCQlBY2Nlc3NUeXBlIGRlZmF1bHRBY2Nlc3MgPSAoQWNjZXNzVHlwZSkgZGF0YU1vZGVsLmdldFByb3BlcnR5KERFRkFVTFRfQUNDRVNTKTsgCisJCWlmIChkZWZhdWx0QWNjZXNzICE9IG51bGwpIHsKKwkJCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHB1TWV0YWRhdGEgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7CisJCQllbnRpdHlNYXBwaW5ncy5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShwdU1ldGFkYXRhKTsKKwkJCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHB1RGVmYXVsdHMgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCQkJcHVNZXRhZGF0YS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwdURlZmF1bHRzKTsKKwkJCXB1RGVmYXVsdHMuc2V0QWNjZXNzKGRlZmF1bHRBY2Nlc3MpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwZDQxMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhQW5ub3RhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1GYWN0b3J5LkVjbGlwc2VMaW5rVmVyc2lvbjsKKworLyoqCisgKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBKUEEgcGxhdGZvcm0gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZQorICogaXQgaXMgaW5pdGlhbGl6ZWQpLgorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybUZhY3RvcnkKKwlpbXBsZW1lbnRzIEpwYVBsYXRmb3JtRmFjdG9yeQoreworCS8qKgorCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybUZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtKFN0cmluZyBpZCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybSgKKwkJCWlkLAorCQkJYnVpbGRKcGFWZXJzaW9uKCksCisJCQluZXcgRWNsaXBzZUxpbmtKcGFGYWN0b3J5KCksIAorCQkJYnVpbGRKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKSwKKwkJCUVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLCAKKwkJCWJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSk7CisJfQorCQorCXByb3RlY3RlZCBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYnVpbGRKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcigKKwkJCUdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCksCisJCQlFY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJfQorCQorCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBidWlsZEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgeworCQlyZXR1cm4gbmV3IEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgeworCQkJcHVibGljIFN1cHBvcnRlZCBnZXRUYWJsZVBlckNvbmNyZXRlQ2xhc3NJbmhlcml0YW5jZUlzU3VwcG9ydGVkKCkgeworCQkJCXJldHVybiBTdXBwb3J0ZWQuWUVTOworCQkJfQorCQkJcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVPdmVycmlkYWJsZSgpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgSnBhUGxhdGZvcm0uVmVyc2lvbiBidWlsZEpwYVZlcnNpb24oKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWZXJzaW9uKAorCQkJCUpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzFfMSwKKwkJCQlKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzFfMAorCQkJKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNDk0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVudGl0eURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbERlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbERlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbjsKKworLyoqCisgKiBFY2xpcHNlTGluayBwbGF0Zm9ybQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVByb3ZpZGVyCisJZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXIKK3sKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJlY2xpcHNlbGluazFfMSI7IC8vJE5PTi1OTFMtMSQKKworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUHJvdmlkZXIgSU5TVEFOQ0UgPSAKKwkJCW5ldyBFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXIoKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtUHJvdmlkZXIgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiByZXNvdXJjZSBtb2RlbHMgKioqKioqKioqKgorCQorCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUgZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKKwkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSkpIHsKKwkJCXJldHVybiBKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEU7CisJCX0KKwkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uSkFSX0NPTlRFTlRfVFlQRSkpIHsKKwkJCXJldHVybiBKcHRDb3JlUGx1Z2luLkpBUl9SRVNPVVJDRV9UWVBFOworCQl9CisJCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUpKSB7CisJCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMV8wX1JFU09VUkNFX1RZUEU7CisJCX0KKwkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7CisJCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFOworCQl9CisJCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7CisJCQlyZXR1cm4gSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEU7CisJCX0KKwkJZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNvbnRlbnRUeXBlLnRvU3RyaW5nKCkpOworCQl9CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSBidWlsZFJlc291cmNlTW9kZWxQcm92aWRlcnMoKSB7CisJCS8vIG9yZGVyIHNob3VsZCBub3QgYmUgaW1wb3J0YW50IGhlcmUKKwkJcmV0dXJuIG5ldyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSB7CisJCQlKYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCisJCQlKYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKKwkJCVBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCisJCQlPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKKwkJCUVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCl9OworCX0KKworCQorCS8vICoqKioqKioqKiBqYXZhIHR5cGUgbWFwcGluZ3MgKioqKioqKioqCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGROb25OdWxsSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCS8vIG9yZGVyIGRldGVybWluZWQgYnkgYW5hbHl6aW5nIG9yZGVyIHRoYXQgZWNsaXBzZWxpbmsgdXNlcworCQkvLyBOT1RFOiBubyB0eXBlIG1hcHBpbmdzIHNwZWNpZmljIHRvIGVjbGlwc2VsaW5rCisJCXJldHVybiBuZXcgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKKwkJCUphdmFFbnRpdHlEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKKwl9CisJCisJCisJLy8gKioqKioqKioqIGphdmEgYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKgkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGROb25OdWxsRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCS8vIG9yZGVyIGRldGVybWluZWQgYnkgYW5hbHl6aW5nIG9yZGVyIHRoYXQgZWNsaXBzZWxpbmsgdXNlcworCQkvLyBOT1RFOiBubyBuZXcgYXR0cmlidXRlIG1hcHBpbmdzIGZyb20gZWNsaXBzZWxpbmsgMS4wIHRvIDEuMQorCQlyZXR1cm4gbmV3IEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKKwkJCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkTm9uTnVsbFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCS8vIG9yZGVyIGRldGVybWluZWQgYnkgYW5hbHl6aW5nIG9yZGVyIHRoYXQgZWNsaXBzZWxpbmsgdXNlcworCQkvLyBOT1RFOiBubyBuZXcgYXR0cmlidXRlIG1hcHBpbmdzIGZyb20gZWNsaXBzZWxpbmsgMS4wIHRvIDEuMQorCQlyZXR1cm4gbmV3IEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKKwkJCUphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKKwl9CisJCisJCisJLy8gKioqKioqKioqIG1hcHBpbmcgZmlsZXMgKioqKioqKioqCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBSZXNvdXJjZURlZmluaXRpb25bXSBidWlsZFJlc291cmNlRGVmaW5pdGlvbnMoKSB7CisJCS8vIG9yZGVyIHNob3VsZCBub3QgYmUgaW1wb3J0YW50IGhlcmUKKwkJcmV0dXJuIG5ldyBSZXNvdXJjZURlZmluaXRpb25bXSB7CisJCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJR2VuZXJpY09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uLmluc3RhbmNlKCl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8xQ29udGV4dE5vZGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMUNvbnRleHROb2RlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMzgxODcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMUNvbnRleHROb2RlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uOworCisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDFfMUNvbnRleHROb2RlRmFjdG9yeSBleHRlbmRzIEVjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5Cit7CQorCQorCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsxLjEtc3BlY2lmaWMgT1JNIENvbnRleHQgTW9kZWwgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5Pd25lciBvd25lciwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlMV8xKHBhcmVudCwgb3duZXIsIChYbWxBdHRyaWJ1dGVNYXBwaW5nKSByZXNvdXJjZU1hcHBpbmcpOworCX0KKworCQorCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmstc3BlY2lmaWMgT1JNIFZpcnR1YWwgUmVzb3VyY2UgTW9kZWwgKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxCYXNpYyBidWlsZFZpcnR1YWxYbWxCYXNpYyhPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWMxXzEob3JtVHlwZU1hcHBpbmcsIGphdmFCYXNpY01hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sSWQgYnVpbGRWaXJ0dWFsWG1sSWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbElkMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhSWRNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEVtYmVkZGVkSWQgYnVpbGRWaXJ0dWFsWG1sRW1iZWRkZWRJZChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFFbWJlZGRlZElkTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkSWQxXzEob3JtVHlwZU1hcHBpbmcsIGphdmFFbWJlZGRlZElkTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxFbWJlZGRlZCBidWlsZFZpcnR1YWxYbWxFbWJlZGRlZChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkTWFwcGluZyBqYXZhRW1iZWRkZWRNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQxXzEob3JtVHlwZU1hcHBpbmcsIGphdmFFbWJlZGRlZE1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sTWFueVRvTWFueSBidWlsZFZpcnR1YWxYbWxNYW55VG9NYW55KE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvTWFueTFfMShvcm1UeXBlTWFwcGluZywgamF2YU1hbnlUb01hbnlNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbE1hbnlUb09uZSBidWlsZFZpcnR1YWxYbWxNYW55VG9PbmUoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFNYW55VG9PbmVNYXBwaW5nIGphdmFNYW55VG9PbmVNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvT25lMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFueVRvT25lTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxPbmVUb01hbnkgYnVpbGRWaXJ0dWFsWG1sT25lVG9NYW55KE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueTFfMShvcm1UeXBlTWFwcGluZywgKEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGphdmFPbmVUb01hbnlNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbE9uZVRvT25lIGJ1aWxkVmlydHVhbFhtbE9uZVRvT25lKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhT25lVG9PbmVNYXBwaW5nIGphdmFPbmVUb09uZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZTFfMShvcm1UeXBlTWFwcGluZywgamF2YU9uZVRvT25lTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxWZXJzaW9uIGJ1aWxkVmlydHVhbFhtbFZlcnNpb24oT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFWZXJzaW9uTWFwcGluZyBqYXZhVmVyc2lvbk1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxWZXJzaW9uMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhVmVyc2lvbk1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQmFzaWNDb2xsZWN0aW9uIGJ1aWxkVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNDb2xsZWN0aW9uKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nIGphdmFCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNDb2xsZWN0aW9uMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxCYXNpY01hcCBidWlsZFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcgamF2YUJhc2ljTWFwTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhQmFzaWNNYXBNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbFRyYW5zZm9ybWF0aW9uIGJ1aWxkVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24oT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyBqYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24xXzEob3JtVHlwZU1hcHBpbmcsIGphdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sVmFyaWFibGVPbmVUb09uZSBidWlsZFZpcnR1YWxFY2xpcHNlTGlua1htbFZhcmlhYmxlT25lVG9PbmUoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nIGphdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFZhcmlhYmxlT25lVG9PbmUxXzEob3JtVHlwZU1hcHBpbmcsIGphdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxUcmFuc2llbnQgYnVpbGRWaXJ0dWFsWG1sVHJhbnNpZW50KE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhVHJhbnNpZW50TWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zaWVudDFfMShvcm1UeXBlTWFwcGluZywgamF2YUF0dHJpYnV0ZU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRWaXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhRWNsaXBzZUxpbmtsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcxXzEob3JtVHlwZU1hcHBpbmcsIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZDU5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5OdWxsT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVudGl0eURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbERlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1YbWxEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCQluZXcgRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBPcm1YbWxEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbDFfMURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBFRmFjdG9yeSBnZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBidWlsZENvbnRleHROb2RlRmFjdG9yeSgpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVhtbDFfMUNvbnRleHROb2RlRmFjdG9yeSgpOworCX0KKwkKKwlwdWJsaWMgSnBhUmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKKwkJcmV0dXJuIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFOworCX0KKwkKKwkKKwkvLyAqKioqKioqKiogT1JNIHR5cGUgbWFwcGluZ3MgKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKKwkJLy8gb3JkZXIgc2hvdWxkIG5vdCBtYXR0ZXIgaGVyZSwgYnV0IHdlJ2xsIHVzZSB0aGUgc2FtZSBvcmRlciBhcyBmb3IgamF2YQorCQkvLyBAc2VlIHtAbGluayBFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXJ9CisJCS8vIE5PVEU6IG5vIG5ldyB0eXBlIG1hcHBpbmcgcHJvdmlkZXJzIGZyb20gZWNsaXBzZWxpbmsgMS4wIHRvIDEuMQorCQlyZXR1cm4gbmV3IE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKKwkJCU9ybUVudGl0eURlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybUVtYmVkZGFibGVEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1NYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBPUk0gYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBidWlsZE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKKwkJLy8gb3JkZXIgc2hvdWxkIG5vdCBtYXR0ZXIgaGVyZSwgYnV0IHdlJ2xsIHVzZSB0aGUgc2FtZSBvcmRlciBhcyBmb3IgamF2YQorCQkvLyBAc2VlIHtAbGluayBFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXJ9CisJCXJldHVybiBuZXcgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7CisJCQlPcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1JZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1NYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1PbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU51bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUxXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZTFfMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNDQ2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUxXzEuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOworCisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUxXzEgCisJZXh0ZW5kcyBBYnN0cmFjdE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgCit7CisJCisJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgc3BlY2lmaWVkQWNjZXNzOworCQorCXB1YmxpYyBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUxXzEoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBPd25lciBvd25lciwgWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJc3VwZXIocGFyZW50LCBvd25lciwgcmVzb3VyY2VNYXBwaW5nKTsKKwkJdGhpcy5zcGVjaWZpZWRBY2Nlc3MgPSBnZXRSZXNvdXJjZUFjY2VzcygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGdldFJlc291cmNlQXR0cmlidXRlTWFwcGluZygpIHsKKwkJcmV0dXJuIChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBzdXBlci5nZXRSZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcoKTsKKwl9CisJCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBY2Nlc3M7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlIG5ld1NwZWNpZmllZEFjY2VzcykgeworCQlBY2Nlc3NUeXBlIG9sZEFjY2VzcyA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzOworCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IG5ld1NwZWNpZmllZEFjY2VzczsKKwkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZU1hcHBpbmcoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwobmV3U3BlY2lmaWVkQWNjZXNzKSk7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0FDQ0VTU19QUk9QRVJUWSwgb2xkQWNjZXNzLCBuZXdTcGVjaWZpZWRBY2Nlc3MpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3NfKEFjY2Vzc1R5cGUgbmV3U3BlY2lmaWVkQWNjZXNzKSB7CisJCUFjY2Vzc1R5cGUgb2xkQWNjZXNzID0gdGhpcy5zcGVjaWZpZWRBY2Nlc3M7CisJCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gbmV3U3BlY2lmaWVkQWNjZXNzOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BQ0NFU1NfUFJPUEVSVFksIG9sZEFjY2VzcywgbmV3U3BlY2lmaWVkQWNjZXNzKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzdXBlci51cGRhdGUoKTsKKwkJc2V0U3BlY2lmaWVkQWNjZXNzXyhnZXRSZXNvdXJjZUFjY2VzcygpKTsKKwl9CisJCisJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZ2V0UmVzb3VyY2VBY2Nlc3MoKSB7CisJCXJldHVybiBBY2Nlc3NUeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKGdldFJlc291cmNlQXR0cmlidXRlTWFwcGluZygpLmdldEFjY2VzcygpKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFFY2xpcHNlTGlua2xYbWxOdWxsQXR0cmlidXRlTWFwcGluZzFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhRWNsaXBzZUxpbmtsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcxXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjgxN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhRWNsaXBzZUxpbmtsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcxXzEuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxOdWxsQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7CisKKy8qKgorICogVmlydHVhbFZlcnNpb24gaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgVmVyc2lvbiB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YVZlcnNpb25NYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YUVjbGlwc2VMaW5rbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nMV8xCisJZXh0ZW5kcyBYbWxOdWxsQXR0cmlidXRlTWFwcGluZyAKKwlpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcKK3sJCisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgdmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nOworCQorCXB1YmxpYyBWaXJ0dWFFY2xpcHNlTGlua2xYbWxOdWxsQXR0cmlidXRlTWFwcGluZzFfMShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nID0gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE51bGxBdHRyaWJ1dGVNYXBwaW5nKG9ybVR5cGVNYXBwaW5nLCBqYXZhQXR0cmlidXRlTWFwcGluZyk7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcuc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0JCisJCisJcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLmdldEFjY2Vzc01ldGhvZHMoKTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nLnNldEFjY2Vzc01ldGhvZHModmFsdWUpOworCX0KKwkKKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxOdWxsQXR0cmlidXRlTWFwcGluZy5nZXRQcm9wZXJ0aWVzKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWMxXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljMV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3ZjNkNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljMV8xLmphdmEKQEAgLTAsMCArMSwyODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7CisKKy8qKgorICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljMV8xIGV4dGVuZHMgWG1sQmFzaWMKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFCYXNpY01hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljIHZpcnR1YWxYbWxCYXNpYzsKKwkJCisJcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljMV8xKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUJhc2ljTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMgPSBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWMob3JtVHlwZU1hcHBpbmcsIGphdmFCYXNpY01hcHBpbmcpOworCX0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5pc09ybU1ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRDb2x1bW4oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oWG1sQ29sdW1uIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbEJhc2ljLnNldENvbHVtbih2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRGZXRjaCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgeworCQl0aGlzLnZpcnR1YWxYbWxCYXNpYy5zZXRGZXRjaChuZXdGZXRjaCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRPcHRpb25hbCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gbmV3T3B0aW9uYWwpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0T3B0aW9uYWwobmV3T3B0aW9uYWwpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzTG9iKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuaXNMb2IoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiBuZXdMb2IpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0TG9iKG5ld0xvYik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9iVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0TG9iVGV4dFJhbmdlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldFRlbXBvcmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIHNldFRlbXBvcmFsKXsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0VGVtcG9yYWwoc2V0VGVtcG9yYWwpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRlbXBvcmFsVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldEVudW1lcmF0ZWQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRFbnVtZXJhdGVkKEVudW1UeXBlIHNldEVudW1lcmF0ZWQpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0RW51bWVyYXRlZChzZXRFbnVtZXJhdGVkKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRFbnVtZXJhdGVkVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBnZXRNdXRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0TXV0YWJsZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRNdXRhYmxlKEJvb2xlYW4gdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0TXV0YWJsZSh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TXV0YWJsZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldE11dGFibGVUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnQoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRDb252ZXJ0KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENvbnZlcnQoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbEJhc2ljLnNldENvbnZlcnQodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRDb252ZXJ0VGV4dFJhbmdlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbENvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRDb252ZXJ0ZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbEJhc2ljLnNldENvbnZlcnRlcih2YWx1ZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0T2JqZWN0VHlwZUNvbnZlcnRlcih2YWx1ZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbFN0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpYy5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbEJhc2ljLnNldFN0cnVjdENvbnZlcnRlcih2YWx1ZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldFR5cGVDb252ZXJ0ZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0VHlwZUNvbnZlcnRlcih2YWx1ZSk7CisJfQorCQkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWMuZ2V0QWNjZXNzTWV0aG9kcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWMuc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljLmdldFByb3BlcnRpZXMoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIHZhbHVlKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxTZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgdmFsdWUpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEdlbmVyYXRlZFZhbHVlIGdldEdlbmVyYXRlZFZhbHVlKCkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWRWYWx1ZShYbWxHZW5lcmF0ZWRWYWx1ZSB2YWx1ZSkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCQorCX0KKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbjFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNDb2xsZWN0aW9uMV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxMzFmZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbjFfMS5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7CisKKy8qKgorICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbjFfMSBleHRlbmRzIFhtbEJhc2ljQ29sbGVjdGlvbgoreworCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKKworCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb24gdmlydHVhbFhtbEJhc2ljQ29sbGVjdGlvbjsKKwkJCisJcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbjFfMShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyBqYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWNDb2xsZWN0aW9uID0gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbihvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmcpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpY0NvbGxlY3Rpb24uZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpY0NvbGxlY3Rpb24uZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWNDb2xsZWN0aW9uLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljQ29sbGVjdGlvbi5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljQ29sbGVjdGlvbi5nZXRBY2Nlc3NNZXRob2RzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxCYXNpY0NvbGxlY3Rpb24uc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljQ29sbGVjdGlvbi5nZXRQcm9wZXJ0aWVzKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNNYXAxXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwMV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxOWRhYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwMV8xLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKKworLyoqCisgKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAorICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWNNYXAxXzEgZXh0ZW5kcyBYbWxCYXNpY01hcAoreworCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCisJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwIHZpcnR1YWxYbWxCYXNpY01hcDsKKwkJCisJcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljTWFwMV8xKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcgamF2YUJhc2ljTWFwTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhQmFzaWNNYXBNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxCYXNpY01hcCA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcChvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljTWFwTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEJhc2ljTWFwLmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWNNYXAuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sQmFzaWNNYXAuc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWNNYXAuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0KKworCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxCYXNpY01hcC5nZXRBY2Nlc3NNZXRob2RzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxCYXNpY01hcC5zZXRBY2Nlc3NNZXRob2RzKHZhbHVlKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sQmFzaWNNYXAuZ2V0UHJvcGVydGllcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQxXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkMV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlYTQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkMV8xLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZDFfMSBleHRlbmRzIFhtbEVtYmVkZGVkCit7CisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhRW1iZWRkZWRNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCisJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkIHZpcnR1YWxYbWxFbWJlZGRlZDsKKwkJCisJcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkMV8xKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRW1iZWRkZWRNYXBwaW5nIGphdmFFbWJlZGRlZE1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YUVtYmVkZGVkTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQgPSBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQob3JtVHlwZU1hcHBpbmcsIGphdmFFbWJlZGRlZE1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZC5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbEVtYmVkZGVkLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0QWNjZXNzTWV0aG9kcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldFByb3BlcnRpZXMoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkSWQxXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkSWQxXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTU5YTZjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWRJZDFfMS5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKKworLyoqCisgKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAorICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWRJZDFfMSBleHRlbmRzIFhtbEVtYmVkZGVkSWQKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFFbWJlZGRlZElkTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKKworCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZElkIHZpcnR1YWxYbWxFbWJlZGRlZElkOworCQkKKwlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWRJZDFfMShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFFbWJlZGRlZElkTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhRW1iZWRkZWRJZE1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQgPSBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWRJZChvcm1UeXBlTWFwcGluZywgamF2YUVtYmVkZGVkSWRNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWRJZC5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWRJZC5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZElkLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZElkLmdldEFjY2Vzc01ldGhvZHMoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQuc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkSWQuZ2V0UHJvcGVydGllcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sSWQxXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbElkMV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjNWMwNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbElkMV8xLmphdmEKQEAgLTAsMCArMSwyNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyOworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxJZDFfMSBleHRlbmRzIFhtbElkCit7CisJCQorCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUlkTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKKworCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxJZCB2aXJ0dWFsWG1sSWQ7CisJCQorCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxJZDFfMShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUlkTWFwcGluZyBqYXZhSWRNYXBwaW5nKSB7CisJCXN1cGVyKCk7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFJZE1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbElkID0gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbElkKG9ybVR5cGVNYXBwaW5nLCBqYXZhSWRNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRDb2x1bW4oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oWG1sQ29sdW1uIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbElkLnNldENvbHVtbih2YWx1ZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldFRlbXBvcmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKXsKKwkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0VGVtcG9yYWwobmV3VGVtcG9yYWwpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRlbXBvcmFsVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRHZW5lcmF0ZWRWYWx1ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWRWYWx1ZShYbWxHZW5lcmF0ZWRWYWx1ZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRHZW5lcmF0ZWRWYWx1ZSh2YWx1ZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbFNlcXVlbmNlR2VuZXJhdG9yIGdldFNlcXVlbmNlR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvciB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRTZXF1ZW5jZUdlbmVyYXRvcih2YWx1ZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbFRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0VGFibGVHZW5lcmF0b3IoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRUYWJsZUdlbmVyYXRvcih2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFbnVtVHlwZSBnZXRFbnVtZXJhdGVkKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0RW51bWVyYXRlZCgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRFbnVtZXJhdGVkKEVudW1UeXBlIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbElkLnNldEVudW1lcmF0ZWQodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRFbnVtZXJhdGVkVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzTG9iKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuaXNMb2IoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TG9iKGJvb2xlYW4gdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0TG9iKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRMb2JUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRMb2JUZXh0UmFuZ2UoKTsKKwl9CisJCQorCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGdldE11dGFibGUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRNdXRhYmxlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE11dGFibGUoQm9vbGVhbiB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRNdXRhYmxlKHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnQoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRDb252ZXJ0KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENvbnZlcnQoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbElkLnNldENvbnZlcnQodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQ29udmVydGVyIGdldENvbnZlcnRlcigpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldENvbnZlcnRlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0Q29udmVydGVyKHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRPYmplY3RUeXBlQ29udmVydGVyKHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sU3RydWN0Q29udmVydGVyIGdldFN0cnVjdENvbnZlcnRlcigpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldFN0cnVjdENvbnZlcnRlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sSWQuc2V0U3RydWN0Q29udmVydGVyKHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBnZXRUeXBlQ29udmVydGVyKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sSWQuZ2V0VHlwZUNvbnZlcnRlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxJZC5zZXRUeXBlQ29udmVydGVyKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldEFjY2Vzc01ldGhvZHMoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbElkLnNldEFjY2Vzc01ldGhvZHModmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRQcm9wZXJ0aWVzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TXV0YWJsZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbElkLmdldE11dGFibGVUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxJZC5nZXRDb252ZXJ0VGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55MV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55MV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2NzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnkxXzEuamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55MV8xIGV4dGVuZHMgWG1sTWFueVRvTWFueQoreworCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCisJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnkgdmlydHVhbFhtbE1hbnlUb01hbnk7CisJCQorCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55MV8xKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nKSB7CisJCXN1cGVyKCk7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFNYW55VG9NYW55TWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueSA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9NYW55KG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFueVRvTWFueU1hcHBpbmcpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRGZXRjaCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldEZldGNoKG5ld0ZldGNoKTsKKwl9CisKKwlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldEpvaW5Db2x1bW5zKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LmdldENhc2NhZGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldENhc2NhZGUodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldEpvaW5UYWJsZSh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0VGFyZ2V0RW50aXR5KHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0TWFwcGVkQnkodmFsdWUpOworCX0KKworCQorCUBPdmVycmlkZQorCXB1YmxpYyBNYXBLZXkgZ2V0TWFwS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRNYXBLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TWFwS2V5KE1hcEtleSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldE1hcEtleSh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0T3JkZXJCeSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5KFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9NYW55LnNldE9yZGVyQnkodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRNYXBwZWRCeVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuc2V0Sm9pbkZldGNoKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb01hbnkuZ2V0QWNjZXNzTWV0aG9kcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5zZXRBY2Nlc3NNZXRob2RzKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRQcm9wZXJ0aWVzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvTWFueS5nZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZTFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvT25lMV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhZjc5YwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZTFfMS5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9PbmUxXzEgZXh0ZW5kcyBYbWxNYW55VG9PbmUKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFNYW55VG9PbmVNYXBwaW5nIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCisJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZSB2aXJ0dWFsWG1sTWFueVRvT25lOworCQkKKwlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvT25lMV8xKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhTWFueVRvT25lTWFwcGluZyBqYXZhTWFueVRvT25lTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhTWFueVRvT25lTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lID0gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb09uZShvcm1UeXBlTWFwcGluZywgamF2YU1hbnlUb09uZU1hcHBpbmcpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRGZXRjaCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuc2V0RmV0Y2gobmV3RmV0Y2gpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldE9wdGlvbmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuc2V0T3B0aW9uYWwobmV3T3B0aW9uYWwpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuZ2V0Sm9pbkNvbHVtbnMoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2FzY2FkZVR5cGUgZ2V0Q2FzY2FkZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRDYXNjYWRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENhc2NhZGUoQ2FzY2FkZVR5cGUgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLnNldENhc2NhZGUodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRKb2luVGFibGUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXRKb2luVGFibGUodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0Sm9pbkZldGNoKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldEpvaW5GZXRjaCgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuc2V0Sm9pbkZldGNoKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRBY2Nlc3NNZXRob2RzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxNYW55VG9PbmUuc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE1hbnlUb09uZS5nZXRQcm9wZXJ0aWVzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sTWFueVRvT25lLmdldEpvaW5GZXRjaFRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55MV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkxXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDAzYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55MV8xLmphdmEKQEAgLTAsMCArMSwyMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OworCisvKioKKyAqIFZpcnR1YWxCYXNpYyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBCYXNpYyB1c2VkIHdoZW4gdGhlcmUgaXMgCisgKiBubyB0YWcgaW4gdGhlIG9ybS54bWwgYW5kIGFuIHVuZGVybHlpbmcgamF2YUJhc2ljTWFwcGluZyBleGlzdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkxXzEgZXh0ZW5kcyBYbWxPbmVUb01hbnkKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55IHZpcnR1YWxYbWxPbmVUb01hbnk7CisJCQorCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkxXzEoCisJCQlPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhT25lVG9NYW55TWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55ID0gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueShvcm1UeXBlTWFwcGluZywgamF2YU9uZVRvTWFueU1hcHBpbmcpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldEZldGNoKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRGZXRjaChuZXdGZXRjaCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0Q2FzY2FkZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5zZXRDYXNjYWRlKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0Sm9pblRhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0Sm9pblRhYmxlKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0VGFyZ2V0RW50aXR5KHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRNYXBwZWRCeSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldE1hcHBlZEJ5KHZhbHVlKTsKKwl9CisKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwS2V5IGdldE1hcEtleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRNYXBLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TWFwS2V5KE1hcEtleSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0TWFwS2V5KHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRPcmRlckJ5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE9yZGVyQnkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T3JkZXJCeShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldE9yZGVyQnkodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE1hcHBlZEJ5VGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpOworCX0JCisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldEpvaW5Db2x1bW5zKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0Sm9pbkZldGNoKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldEpvaW5GZXRjaCgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0Sm9pbkZldGNoKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNQcml2YXRlT3duZWQoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuaXNQcml2YXRlT3duZWQoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4gdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldFByaXZhdGVPd25lZCh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0QWNjZXNzTWV0aG9kcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldEFjY2Vzc01ldGhvZHModmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0UHJvcGVydGllcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZTFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUxXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Y4NTc3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUxXzEuamF2YQpAQCAtMCwwICsxLDIwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7CisKKy8qKgorICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvT25lMV8xIGV4dGVuZHMgWG1sT25lVG9PbmUKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFPbmVUb09uZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUgdmlydHVhbFhtbE9uZVRvT25lOworCQkKKwlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUxXzEoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFPbmVUb09uZU1hcHBpbmcgamF2YU9uZVRvT25lTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhT25lVG9PbmVNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZSA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZShvcm1UeXBlTWFwcGluZywgamF2YU9uZVRvT25lTWFwcGluZyk7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0RmV0Y2goKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgbmV3RmV0Y2gpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0RmV0Y2gobmV3RmV0Y2gpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0T3B0aW9uYWwoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG5ld09wdGlvbmFsKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldE9wdGlvbmFsKG5ld09wdGlvbmFsKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRKb2luQ29sdW1ucygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDYXNjYWRlVHlwZSBnZXRDYXNjYWRlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0Q2FzY2FkZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldENhc2NhZGUodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldEpvaW5UYWJsZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0Sm9pblRhYmxlKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldFRhcmdldEVudGl0eSh2YWx1ZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE1hcHBlZEJ5KCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldE1hcHBlZEJ5KHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0Sm9pbkZldGNoKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldEpvaW5GZXRjaCh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZU93bmVkKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuaXNQcml2YXRlT3duZWQoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4gdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0UHJpdmF0ZU93bmVkKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldEFjY2Vzc01ldGhvZHMoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldEFjY2Vzc01ldGhvZHModmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRQcm9wZXJ0aWVzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0Sm9pbkZldGNoVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJpdmF0ZU93bmVkVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0UHJpdmF0ZU93bmVkVGV4dFJhbmdlKCk7CisJfQkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24xXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uMV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwZDJlMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uMV8xLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbjsKKworLyoqCisgKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAorICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24xXzEgZXh0ZW5kcyBYbWxUcmFuc2Zvcm1hdGlvbgoreworCisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24gdmlydHVhbFhtbFRyYW5zZm9ybWF0aW9uOworCQkKKwlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNmb3JtYXRpb24xXzEoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyBqYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nKSB7CisJCXN1cGVyKCk7CisJCXRoaXMub3JtVHlwZU1hcHBpbmcgPSBvcm1UeXBlTWFwcGluZzsKKwkJdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZyA9IGphdmFUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbFRyYW5zZm9ybWF0aW9uID0gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uKG9ybVR5cGVNYXBwaW5nLCBqYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVHJhbnNmb3JtYXRpb24uZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxUcmFuc2Zvcm1hdGlvbi5nZXROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQl0aGlzLnZpcnR1YWxYbWxUcmFuc2Zvcm1hdGlvbi5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxUcmFuc2Zvcm1hdGlvbi5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxUcmFuc2Zvcm1hdGlvbi5nZXRBY2Nlc3NNZXRob2RzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxUcmFuc2Zvcm1hdGlvbi5zZXRBY2Nlc3NNZXRob2RzKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVHJhbnNmb3JtYXRpb24uZ2V0UHJvcGVydGllcygpOworCX0KKwkJCisJQE92ZXJyaWRlCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zaWVudDFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNpZW50MV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczNmI0MAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zaWVudDFfMS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2llbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKKworLyoqCisgKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAorICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNpZW50MV8xIGV4dGVuZHMgWG1sVHJhbnNpZW50Cit7CisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhVHJhbnNpZW50TWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZzsKKworCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2llbnQgdmlydHVhbFhtbFRyYW5zaWVudDsKKwkKKwlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sVHJhbnNpZW50MV8xKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhVHJhbnNpZW50TWFwcGluZyBqYXZhVHJhbnNpZW50TWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhVHJhbnNpZW50TWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sVHJhbnNpZW50ID0gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zaWVudChvcm1UeXBlTWFwcGluZywgamF2YVRyYW5zaWVudE1hcHBpbmcpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxUcmFuc2llbnQuZ2V0TWFwcGluZ0tleSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxUcmFuc2llbnQuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sVHJhbnNpZW50LnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFRyYW5zaWVudC5nZXROYW1lVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxUcmFuc2llbnQuZ2V0QWNjZXNzTWV0aG9kcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykgeworCQl0aGlzLnZpcnR1YWxYbWxUcmFuc2llbnQuc2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lMV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5MTE0OQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFZhcmlhYmxlT25lVG9PbmUxXzEuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sVmFyaWFibGVPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZTsKKworLyoqCisgKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAorICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmFyaWFibGVPbmVUb09uZTFfMSBleHRlbmRzIFhtbFZhcmlhYmxlT25lVG9PbmUKK3sKKworCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmFyaWFibGVPbmVUb09uZSB2aXJ0dWFsWG1sVmFyaWFibGVPbmVUb09uZTsKKwkJCisJcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbFZhcmlhYmxlT25lVG9PbmUxXzEoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nIGphdmFWYXJpYWJsZU9uZVRvT25lTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbFZhcmlhYmxlT25lVG9PbmUgPSBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmFyaWFibGVPbmVUb09uZShvcm1UeXBlTWFwcGluZywgamF2YVZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmFyaWFibGVPbmVUb09uZS5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZhcmlhYmxlT25lVG9PbmUuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sVmFyaWFibGVPbmVUb09uZS5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWYXJpYWJsZU9uZVRvT25lLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmFyaWFibGVPbmVUb09uZS5nZXRBY2Nlc3NNZXRob2RzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxWYXJpYWJsZU9uZVRvT25lLnNldEFjY2Vzc01ldGhvZHModmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWZXJzaW9uMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWZXJzaW9uMV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjNzEzYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbFZlcnNpb24xXzEuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWZXJzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247CisKKy8qKgorICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbFZlcnNpb24xXzEgZXh0ZW5kcyBYbWxWZXJzaW9uCit7CisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhVmVyc2lvbk1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmVyc2lvbiB2aXJ0dWFsWG1sVmVyc2lvbjsKKwkKKwlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmVyc2lvbjFfMShPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YVZlcnNpb25NYXBwaW5nIGphdmFWZXJzaW9uTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhVmVyc2lvbk1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbFZlcnNpb24gPSBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmVyc2lvbihvcm1UeXBlTWFwcGluZywgamF2YVZlcnNpb25NYXBwaW5nKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5zZXROYW1lKG5ld05hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0Q29sdW1uKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLnNldENvbHVtbih2YWx1ZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0VGVtcG9yYWwoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVudW1UeXBlIGdldEVudW1lcmF0ZWQoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldEVudW1lcmF0ZWQoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0RW51bWVyYXRlZChFbnVtVHlwZSB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNMb2IoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmlzTG9iKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldExvYihib29sZWFuIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0JCisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRFbnVtZXJhdGVkVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXRFbnVtZXJhdGVkVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9iVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXRMb2JUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRUZW1wb3JhbFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBnZXRNdXRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXRNdXRhYmxlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE11dGFibGUoQm9vbGVhbiB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLnNldE11dGFibGUodmFsdWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0Q29udmVydCgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0KFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLnNldENvbnZlcnQodmFsdWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TXV0YWJsZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0TXV0YWJsZVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldENvbnZlcnRUZXh0UmFuZ2UoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQ29udmVydGVyIGdldENvbnZlcnRlcigpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0Q29udmVydGVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFhtbENvbnZlcnRlciB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLnNldENvbnZlcnRlcih2YWx1ZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLnNldE9iamVjdFR5cGVDb252ZXJ0ZXIodmFsdWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBYbWxTdHJ1Y3RDb252ZXJ0ZXIgZ2V0U3RydWN0Q29udmVydGVyKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbFZlcnNpb24uc2V0U3RydWN0Q29udmVydGVyKHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBnZXRUeXBlQ29udmVydGVyKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sVmVyc2lvbi5nZXRUeXBlQ29udmVydGVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbFZlcnNpb24uc2V0VHlwZUNvbnZlcnRlcih2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxWZXJzaW9uLmdldEFjY2Vzc01ldGhvZHMoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKSB7CisJCXRoaXMudmlydHVhbFhtbFZlcnNpb24uc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbFZlcnNpb24uZ2V0UHJvcGVydGllcygpOworCX0JCisJCisJQE92ZXJyaWRlCisJcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIHZhbHVlKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL0VjbGlwc2VMaW5rMl8wSnBhRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvRWNsaXBzZUxpbmsyXzBKcGFGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzZGMxZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL0VjbGlwc2VMaW5rMl8wSnBhRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuR2VuZXJpY01ldGFtb2RlbFN5bmNocm9uaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLkdlbmVyaWNQZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFDYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFEZXJpdmVkSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFNYXBzSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFPcnBoYW5SZW1vdmFsMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5KcGFQcm9qZWN0Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuTWV0YW1vZGVsU3luY2hyb25pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuUGVyc2lzdGVudFR5cGVNZXRhbW9kZWxTeW5jaHJvbml6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFEZXJpdmVkSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYXBzSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMDsKKworLyoqCisgKiAgRWNsaXBzZUxpbmsyXzBKcGFGYWN0b3J5CisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEpwYUZhY3RvcnkKKwlleHRlbmRzIEVjbGlwc2VMaW5rSnBhRmFjdG9yeQoreworCXByb3RlY3RlZCBFY2xpcHNlTGluazJfMEpwYUZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCS8vICoqKioqKioqKiogQ29yZSBNb2RlbCAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIE1ldGFtb2RlbFN5bmNocm9uaXplciBidWlsZE1ldGFtb2RlbFN5bmNocm9uaXplcihKcGFQcm9qZWN0Ml8wIGpwYVByb2plY3QpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljTWV0YW1vZGVsU3luY2hyb25pemVyKGpwYVByb2plY3QpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUGVyc2lzdGVudFR5cGVNZXRhbW9kZWxTeW5jaHJvbml6ZXIgYnVpbGRQZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplcihQZXJzaXN0ZW50VHlwZU1ldGFtb2RlbFN5bmNocm9uaXplci5Pd25lciBvd25lciwgUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljUGVyc2lzdGVudFR5cGVNZXRhbW9kZWxTeW5jaHJvbml6ZXIob3duZXIsIHBlcnNpc3RlbnRUeXBlKTsKKwl9CisJCisJLy8gKioqKioqKioqKiBKYXZhIENvbnRleHQgTW9kZWwgKioqKioqKioqKgorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoUGVyc2lzdGVudFR5cGUuT3duZXIgb3duZXIsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlMl8wKG93bmVyLCBqcnB0KTsKKwl9CisJCisJLy9UaGUgMi4wIEpQQSBzcGVjIHN1cHBvcnRzIGFzc29jaWF0aW9uIG92ZXJyaWRlcyBvbiBhbiBlbWJlZGRlZCBtYXBwaW5nIHdoaWxlIHRoZSAxLjAgc3BlYyBkaWQgbm90CisJQE92ZXJyaWRlCisJcHVibGljIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBwYXJlbnQsIE93bmVyIG93bmVyKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKHBhcmVudCwgb3duZXIpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGJ1aWxkSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGpycG0sIFN0cmluZyBuYW1lLCBKb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5KSB7CisJCXJldHVybiBuZXcgVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKGpycG0sIG5hbWUsIGpvaW5pbmdTdHJhdGVneSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhRGVyaXZlZElkMl8wIGJ1aWxkSmF2YURlcml2ZWRJZChKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YURlcml2ZWRJZDJfMChwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBidWlsZEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFNYXBzSWQyXzAgYnVpbGRKYXZhTWFwc0lkKEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFwc0lkMl8wKHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRKYXZhU2VxdWVuY2VHZW5lcmF0b3IoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzAocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEphdmFPbmVUb01hbnlNYXBwaW5nIGJ1aWxkSmF2YU9uZVRvTWFueU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMChwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSmF2YU9uZVRvT25lTWFwcGluZyBidWlsZEphdmFPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7CisJCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wKHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhQ2FjaGVhYmxlMl8wIGJ1aWxkSmF2YUNhY2hlYWJsZShKYXZhQ2FjaGVhYmxlSG9sZGVyMl8wIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQ2FjaGVhYmxlMl8wKHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkSmF2YU9ycGhhblJlbW92YWwoSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzAgcGFyZW50KSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFPcnBoYW5SZW1vdmFsMl8wKHBhcmVudCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDdhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhQW5ub3RhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVBsYXRmb3JtRmFjdG9yeS5FY2xpcHNlTGlua1ZlcnNpb247CisKKy8qKgorICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKKyAqIGl0IGlzIGluaXRpYWxpemVkKS4KKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1GYWN0b3J5CisJaW1wbGVtZW50cyBKcGFQbGF0Zm9ybUZhY3RvcnkKK3sKKwkvKioKKwkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1GYWN0b3J5KCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtKFN0cmluZyBpZCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybSgKKwkJCWlkLAorCQkJYnVpbGRKcGFWZXJzaW9uKCksCisJCQluZXcgRWNsaXBzZUxpbmsyXzBKcGFGYWN0b3J5KCksIAorCQkJdGhpcy5idWlsZEpwYUFubm90YXRpb25Qcm92aWRlcigpLAorCQkJRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyLmluc3RhbmNlKCksIAorCQkJdGhpcy5idWlsZEpwYVZhcmlhdGlvbigpKTsKKwl9CisJCisJcHJpdmF0ZSBKcGFQbGF0Zm9ybS5WZXJzaW9uIGJ1aWxkSnBhVmVyc2lvbigpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1ZlcnNpb24oCisJCQkJSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX1BMQVRGT1JNX1ZFUlNJT05fMl8wLAorCQkJCUpwdENvcmVQbHVnaW4uSlBBX0ZBQ0VUX1ZFUlNJT05fMl8wCisJCQkpOworCX0KKwkKKwlwcm90ZWN0ZWQgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkSnBhQW5ub3RhdGlvblByb3ZpZGVyKCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIoCisJCQlHZW5lcmljMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpLAorCQkJRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpOworCX0KKworCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBidWlsZEpwYVZhcmlhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKKwkJCXB1YmxpYyBTdXBwb3J0ZWQgZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpIHsKKwkJCQlyZXR1cm4gU3VwcG9ydGVkLllFUzsKKwkJCX0KKwkJCXB1YmxpYyBib29sZWFuIGlzSm9pblRhYmxlT3ZlcnJpZGFibGUoKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX07CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzFmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKcGFQbGF0Zm9ybVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkphclJlc291cmNlTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLk9ybVJlc291cmNlTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbnRpdHlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbERlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZ0RlZmluaXRpb24yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5HZW5lcmljT3JtWG1sMl8wRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzBEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKKworLyoqCisgKiAgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIKKwlleHRlbmRzIEFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcgoreworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImVjbGlwc2VsaW5rMl8wIjsgLy8kTk9OLU5MUy0xJAorCQorCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUHJvdmlkZXIgSU5TVEFOQ0UgPSAKKwkJCW5ldyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIoKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHJlc291cmNlIG1vZGVscyAqKioqKioqKioqCisJCisJcHVibGljIEpwYVJlc291cmNlVHlwZSBnZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgeworCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKSkgeworCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfUkVTT1VSQ0VfVFlQRTsKKwkJfQorCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KQVJfQ09OVEVOVF9UWVBFKSkgeworCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uSkFSX1JFU09VUkNFX1RZUEU7CisJCX0KKwkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRSkpIHsKKwkJCXJldHVybiBKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRTsKKwkJfQorCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSkpIHsKKwkJCXJldHVybiBKcHRDb3JlUGx1Z2luLk9STV9YTUxfMl8wX1JFU09VUkNFX1RZUEU7CisJCX0KKwkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSkpIHsKKwkJCXJldHVybiBKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRTsKKwkJfQorCQllbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29udGVudFR5cGUudG9TdHJpbmcoKSk7CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIGJ1aWxkUmVzb3VyY2VNb2RlbFByb3ZpZGVycygpIHsKKwkJLy8gb3JkZXIgc2hvdWxkIG5vdCBiZSBpbXBvcnRhbnQgaGVyZQorCQlyZXR1cm4gbmV3IEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIHsKKwkJCUphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKKwkJCUphclJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAorCQkJUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKKwkJCU9ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAorCQkJRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKX07CisJfQorCisJCisJLy8gKioqKioqKioqIGphdmEgdHlwZSBtYXBwaW5ncyAqKioqKioqKioJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSBidWlsZE5vbk51bGxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKKwkJLy8gb3JkZXIgZGV0ZXJtaW5lZCBieSBhbmFseXppbmcgb3JkZXIgdGhhdCBlY2xpcHNlbGluayB1c2VzCisJCS8vIE5PVEU6IG5vIHR5cGUgbWFwcGluZ3Mgc3BlY2lmaWMgdG8gZWNsaXBzZWxpbmsKKwkJcmV0dXJuIG5ldyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10geworCQkJSmF2YUVudGl0eURlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFbWJlZGRhYmxlRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmluc3RhbmNlKCl9OworCX0KKwkKKwkKKwkvLyAqKioqKioqKiogamF2YSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBidWlsZE5vbk51bGxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKKwkJLy8gb3JkZXIgZGV0ZXJtaW5lZCBieSBhbmFseXppbmcgb3JkZXIgdGhhdCBlY2xpcHNlbGluayB1c2VzCisJCS8vIE5PVEU6IG5vIG5ldyBhdHRyaWJ1dGUgbWFwcGluZ3MgZnJvbSBlY2xpcHNlbGluayAxLjAgdG8gMS4xCisJCXJldHVybiBuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10geworCQkJSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCl9OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGROb25OdWxsU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKKwkJLy8gb3JkZXIgZGV0ZXJtaW5lZCBieSBhbmFseXppbmcgb3JkZXIgdGhhdCBlY2xpcHNlbGluayB1c2VzCisJCS8vIE5PVEU6IG5vIG5ldyBhdHRyaWJ1dGUgbWFwcGluZ3MgZnJvbSBlY2xpcHNlbGluayAxLjAgdG8gMS4xCisJCXJldHVybiBuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10geworCQkJSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKKwkJCUphdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCisJCQlKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKKwl9CisJCisJCisJLy8gKioqKioqKioqIG1hcHBpbmcgZmlsZXMgKioqKioqKioqCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBSZXNvdXJjZURlZmluaXRpb25bXSBidWlsZFJlc291cmNlRGVmaW5pdGlvbnMoKSB7CisJCS8vIG9yZGVyIHNob3VsZCBub3QgYmUgaW1wb3J0YW50IGhlcmUKKwkJcmV0dXJuIG5ldyBSZXNvdXJjZURlZmluaXRpb25bXSB7CisJCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUdlbmVyaWNPcm1YbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlHZW5lcmljT3JtWG1sMl8wRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJRWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlFY2xpcHNlTGlua09ybVhtbDFfMURlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCUVjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbi5pbnN0YW5jZSgpfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5ZWNhNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworCisvKioKKyAqICBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wCisJZXh0ZW5kcyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nCisJaW1wbGVtZW50cyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzAKK3sKKwkKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ1tdIGJ1aWxkU3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKKwkJcmV0dXJuIEFycmF5VG9vbHMuYWRkQWxsKAorCQkJc3VwZXIuYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCisJCQlKUEEyXzAuT05FX1RPX09ORV9fT1JQSEFOX1JFTU9WQUwpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZTM2YjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKKworLyoqCisgKiAgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAKKwlleHRlbmRzIEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZworCWltcGxlbWVudHMgRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAKK3sKKwkKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nW10gYnVpbGRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgeworCQlyZXR1cm4gQXJyYXlUb29scy5hZGRBbGwoCisJCQlzdXBlci5idWlsZFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKKwkJCUpQQTJfMC5PTkVfVE9fT05FX19PUlBIQU5fUkVNT1ZBTCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjZjZjU1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1DYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5HZW5lcmljT3JtRGVyaXZlZElkMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uR2VuZXJpY09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1NYXBzSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT3JwaGFuUmVtb3ZhbDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLlZpcnR1YWxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUNhY2hlYWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUNhY2hlYWJsZUhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybURlcml2ZWRJZDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hcHNJZDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZTFfMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLlZpcnR1YUVjbGlwc2VMaW5rbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nMV8xOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWMxXzE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY0NvbGxlY3Rpb24xXzE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcDFfMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkSWQxXzE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxJZDFfMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbE1hbnlUb01hbnkxXzE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxNYW55VG9PbmUxXzE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2Zvcm1hdGlvbjFfMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zaWVudDFfMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbFZhcmlhYmxlT25lVG9PbmUxXzE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybS5WaXJ0dWFsRWNsaXBzZUxpbmtYbWxWZXJzaW9uMV8xOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNmb3JtYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5IGV4dGVuZHMgRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkKK3sJCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlLk93bmVyIG93bmVyLCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUxXzEocGFyZW50LCBvd25lciwgKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHJlc291cmNlTWFwcGluZyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKE9ybUVtYmVkZGVkTWFwcGluZzJfMCBwYXJlbnQsIE93bmVyIG93bmVyLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKHBhcmVudCwgb3duZXIsIHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlIGJ1aWxkT3JtQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZShPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wKHBhcmVudCwgYXNzb2NpYXRpb25PdmVycmlkZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1TZXF1ZW5jZUdlbmVyYXRvciBidWlsZE9ybVNlcXVlbmNlR2VuZXJhdG9yKFhtbENvbnRleHROb2RlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yIHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzAocGFyZW50LCByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybURlcml2ZWRJZDJfMCBidWlsZE9ybURlcml2ZWRJZChPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHBhcmVudCwgWG1sRGVyaXZlZElkXzJfMCByZXNvdXJjZSkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1EZXJpdmVkSWQyXzAocGFyZW50LCByZXNvdXJjZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYnVpbGRPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEVsZW1lbnRDb2xsZWN0aW9uIHJlc291cmNlTWFwcGluZykgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3JtTWFwc0lkMl8wIGJ1aWxkT3JtTWFwc0lkKE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50LCBYbWxNYXBzSWRfMl8wIHJlc291cmNlKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybU1hcHNJZDJfMChwYXJlbnQsIHJlc291cmNlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9ybUNhY2hlYWJsZTJfMCBidWlsZE9ybUNhY2hlYWJsZShPcm1DYWNoZWFibGVIb2xkZXIyXzAgcGFyZW50LCBYbWxDYWNoZWFibGUyXzAgcmVzb3VyY2UpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtQ2FjaGVhYmxlMl8wKHBhcmVudCwgcmVzb3VyY2UpOworCX0KKwkKKwlwdWJsaWMgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkT3JtT3JwaGFuUmVtb3ZhbChPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wIHBhcmVudCwgWG1sT3JwaGFuUmVtb3ZhYmxlMl8wIHJlc291cmNlKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybU9ycGhhblJlbW92YWwyXzAocGFyZW50LCByZXNvdXJjZSk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogT1JNIFZpcnR1YWwgUmVzb3VyY2UgTW9kZWwgKioqKioqKioqKgorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxCYXNpYyBidWlsZFZpcnR1YWxYbWxCYXNpYyhPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sQmFzaWMxXzEob3JtVHlwZU1hcHBpbmcsIGphdmFCYXNpY01hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sSWQgYnVpbGRWaXJ0dWFsWG1sSWQoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbElkMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhSWRNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEVtYmVkZGVkSWQgYnVpbGRWaXJ0dWFsWG1sRW1iZWRkZWRJZChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFFbWJlZGRlZElkTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkSWQxXzEob3JtVHlwZU1hcHBpbmcsIGphdmFFbWJlZGRlZElkTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxFbWJlZGRlZCBidWlsZFZpcnR1YWxYbWxFbWJlZGRlZChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVtYmVkZGVkTWFwcGluZyBqYXZhRW1iZWRkZWRNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQyXzAob3JtVHlwZU1hcHBpbmcsIGphdmFFbWJlZGRlZE1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sTWFueVRvTWFueSBidWlsZFZpcnR1YWxYbWxNYW55VG9NYW55KE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvTWFueTFfMShvcm1UeXBlTWFwcGluZywgamF2YU1hbnlUb01hbnlNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbE1hbnlUb09uZSBidWlsZFZpcnR1YWxYbWxNYW55VG9PbmUoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFNYW55VG9PbmVNYXBwaW5nIGphdmFNYW55VG9PbmVNYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sTWFueVRvT25lMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFueVRvT25lTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxPbmVUb01hbnkgYnVpbGRWaXJ0dWFsWG1sT25lVG9NYW55KE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueTJfMChvcm1UeXBlTWFwcGluZywgKEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzApIGphdmFPbmVUb01hbnlNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbE9uZVRvT25lIGJ1aWxkVmlydHVhbFhtbE9uZVRvT25lKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhT25lVG9PbmVNYXBwaW5nIGphdmFPbmVUb09uZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZTJfMChvcm1UeXBlTWFwcGluZywgKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGphdmFPbmVUb09uZU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sVmVyc2lvbiBidWlsZFZpcnR1YWxYbWxWZXJzaW9uKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhVmVyc2lvbk1hcHBpbmcgamF2YVZlcnNpb25NYXBwaW5nKSB7CisJCXJldHVybiBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sVmVyc2lvbjFfMShvcm1UeXBlTWFwcGluZywgamF2YVZlcnNpb25NYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEJhc2ljQ29sbGVjdGlvbiBidWlsZFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbihPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyBqYXZhQmFzaWNDb2xsZWN0aW9uTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbEJhc2ljQ29sbGVjdGlvbjFfMShvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljQ29sbGVjdGlvbk1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQmFzaWNNYXAgYnVpbGRWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nIGphdmFCYXNpY01hcE1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxCYXNpY01hcDFfMShvcm1UeXBlTWFwcGluZywgamF2YUJhc2ljTWFwTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxUcmFuc2Zvcm1hdGlvbiBidWlsZFZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgamF2YVRyYW5zZm9ybWF0aW9uTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxFY2xpcHNlTGlua1htbFRyYW5zZm9ybWF0aW9uMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhVHJhbnNmb3JtYXRpb25NYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbFZhcmlhYmxlT25lVG9PbmUgYnVpbGRWaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyBqYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxWYXJpYWJsZU9uZVRvT25lMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhVmFyaWFibGVPbmVUb09uZU1hcHBpbmcpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sVHJhbnNpZW50IGJ1aWxkVmlydHVhbFhtbFRyYW5zaWVudChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YVRyYW5zaWVudE1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxUcmFuc2llbnQxXzEob3JtVHlwZU1hcHBpbmcsIGphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmlydHVhbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZykgeworCQlyZXR1cm4gbmV3IFZpcnR1YUVjbGlwc2VMaW5rbFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nMV8xKG9ybVR5cGVNYXBwaW5nLCBqYXZhQXR0cmlidXRlTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGJ1aWxkVmlydHVhbFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoU3RyaW5nIG5hbWUsIE9ybVR5cGVNYXBwaW5nIHBhcmVudCwgSm9pbmluZ1N0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSkgeworCQlyZXR1cm4gbmV3IFZpcnR1YWxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlMl8wKG5hbWUsIHBhcmVudCwgam9pbmluZ1N0cmF0ZWd5KTsJCQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sRWxlbWVudENvbGxlY3Rpb24gYnVpbGRWaXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24yXzAoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YU1hcHBpbmcpIHsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbGVtZW50Q29sbGVjdGlvbjJfMChvcm1UeXBlTWFwcGluZywgamF2YU1hcHBpbmcpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzBEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiMWQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5OdWxsT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGVEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVudGl0eURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtWG1sRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IEVjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtWG1sRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1YbWwyXzBEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0U7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkoKTsKKwl9CisJCisJcHVibGljIEpwYVJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7CisJCXJldHVybiBKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRTsKKwl9CisJCisJCisJLy8gKioqKioqKioqIE9STSB0eXBlIG1hcHBpbmdzICoqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZ0RlZmluaXRpb25bXSBidWlsZE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCS8vIG9yZGVyIHNob3VsZCBub3QgbWF0dGVyIGhlcmUsIGJ1dCB3ZSdsbCB1c2UgdGhlIHNhbWUgb3JkZXIgYXMgZm9yIGphdmEKKwkJLy8gQHNlZSB7QGxpbmsgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVByb3ZpZGVyfQorCQkvLyBOT1RFOiBubyBuZXcgdHlwZSBtYXBwaW5nIHByb3ZpZGVycyBmcm9tIGVjbGlwc2VsaW5rIDEuMCB0byAxLjEKKwkJcmV0dXJuIG5ldyBPcm1UeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7CisJCQlPcm1FbnRpdHlEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1FbWJlZGRhYmxlRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uaW5zdGFuY2UoKX07CisJfQorCQorCQorCS8vICoqKioqKioqKiogT1JNIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gYnVpbGRPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7CisJCS8vIG9yZGVyIHNob3VsZCBub3QgbWF0dGVyIGhlcmUsIGJ1dCB3ZSdsbCB1c2UgdGhlIHNhbWUgb3JkZXIgYXMgZm9yIGphdmEKKwkJLy8gQHNlZSB7QGxpbmsgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVByb3ZpZGVyfQorCQlyZXR1cm4gbmV3IE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10geworCQkJT3JtVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlPcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAorCQkJT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKKwkJCU9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCisJCQlOdWxsT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sRWxlbWVudENvbGxlY3Rpb24yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEVsZW1lbnRDb2xsZWN0aW9uMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0ZWMwNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbEVsZW1lbnRDb2xsZWN0aW9uMl8wLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLlZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKKworLyoqCisgKiBWaXJ0dWFsQmFzaWMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQmFzaWMgdXNlZCB3aGVuIHRoZXJlIGlzIAorICogbm8gdGFnIGluIHRoZSBvcm0ueG1sIGFuZCBhbiB1bmRlcmx5aW5nIGphdmFCYXNpY01hcHBpbmcgZXhpc3RzLgorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sRWxlbWVudENvbGxlY3Rpb24yXzAgZXh0ZW5kcyBYbWxFbGVtZW50Q29sbGVjdGlvbgoreworCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZzsKKwkKKwlwcm90ZWN0ZWQgZmluYWwgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhQXR0cmlidXRlTWFwcGluZzsKKworCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24yXzAgdmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uOworCQorCXB1YmxpYyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbGVtZW50Q29sbGVjdGlvbjJfMChPcm1UeXBlTWFwcGluZyBvcm1UeXBlTWFwcGluZywgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24gPSBuZXcgVmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uMl8wKG9ybVR5cGVNYXBwaW5nLCBqYXZhTWFwcGluZyk7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHRoaXMub3JtVHlwZU1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24uc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZVRleHRSYW5nZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBYbWxDb2x1bW4gZ2V0Q29sdW1uKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sdW1uKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2x1bW4odmFsdWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5nZXRUZW1wb3JhbCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSBuZXdUZW1wb3JhbCl7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHNldCB2YWx1ZXMgb24gYSB2aXJ0dWFsIG1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldEVudW1lcmF0ZWQoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0RW51bWVyYXRlZChFbnVtVHlwZSB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNMb2IoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5pc0xvYigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9CQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRMb2JUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5nZXRMb2JUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRUZW1wb3JhbFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVsZW1lbnRDb2xsZWN0aW9uLmdldFRlbXBvcmFsVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQkvLyBUT0RPIGdldCBmcm9tIGphdmEgYW5ub3RhdGlvbnMKKwkJcmV0dXJuIG51bGw7CisJfQkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbGVtZW50Q29sbGVjdGlvbi5nZXRBY2Nlc3MoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sRWxlbWVudENvbGxlY3Rpb24uc2V0QWNjZXNzKHZhbHVlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjI1MDkwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQyXzAuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLlZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkMV8xOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7CisKKy8qKgorICogVmlydHVhbEJhc2ljIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEJhc2ljIHVzZWQgd2hlbiB0aGVyZSBpcyAKKyAqIG5vIHRhZyBpbiB0aGUgb3JtLnhtbCBhbmQgYW4gdW5kZXJseWluZyBqYXZhQmFzaWNNYXBwaW5nIGV4aXN0cy4KKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbEVtYmVkZGVkMl8wIGV4dGVuZHMgWG1sRW1iZWRkZWQKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFFbWJlZGRlZE1hcHBpbmcgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQxXzEgdmlydHVhbFhtbEVtYmVkZGVkOworCQkKKwlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sRW1iZWRkZWQyXzAoT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFbWJlZGRlZE1hcHBpbmcgamF2YUVtYmVkZGVkTWFwcGluZykgeworCQlzdXBlcigpOworCQl0aGlzLm9ybVR5cGVNYXBwaW5nID0gb3JtVHlwZU1hcHBpbmc7CisJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmcgPSBqYXZhRW1iZWRkZWRNYXBwaW5nOworCQl0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZCA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxFbWJlZGRlZDFfMShvcm1UeXBlTWFwcGluZywgamF2YUVtYmVkZGVkTWFwcGluZyk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbEVtYmVkZGVkLmdldE1hcHBpbmdLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0TmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0TmFtZVRleHRSYW5nZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZC5nZXRBY2Nlc3NNZXRob2RzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZC5zZXRBY2Nlc3NNZXRob2RzKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuZ2V0UHJvcGVydGllcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxFbWJlZGRlZC5nZXRBY2Nlc3MoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sRW1iZWRkZWQuc2V0QWNjZXNzKG51bGwpOworCX0KKwkKKy8vCUBPdmVycmlkZQorLy8JcHVibGljIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHsKKy8vCQlFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPihYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVMpOworLy8JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IGphdmFBdHRyaWJ1dGVPdmVycmlkZXM7CisvLwkJaWYgKCF0aGlzLmlzT3JtTWV0YWRhdGFDb21wbGV0ZSgpKSB7CisvLwkJCWphdmFBdHRyaWJ1dGVPdmVycmlkZXMgPSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuYXR0cmlidXRlT3ZlcnJpZGVzKCk7CisvLwkJfQorLy8JCWVsc2UgeworLy8JCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gdGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKy8vCQl9CisvLwkJZm9yIChKYXZhQXR0cmlidXRlT3ZlcnJpZGUgamF2YUF0dHJpYnV0ZU92ZXJyaWRlIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGphdmFBdHRyaWJ1dGVPdmVycmlkZXMpKSB7CisvLwkJCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBuZXcgVmlydHVhbFhtbENvbHVtbih0aGlzLm9ybVR5cGVNYXBwaW5nLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkpOworLy8JCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSB4bWxBdHRyaWJ1dGVPdmVycmlkZSA9IG5ldyBWaXJ0dWFsWG1sQXR0cmlidXRlT3ZlcnJpZGUoamF2YUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSwgeG1sQ29sdW1uKTsKKy8vCQkJYXR0cmlidXRlT3ZlcnJpZGVzLmFkZCh4bWxBdHRyaWJ1dGVPdmVycmlkZSk7CisvLwkJfQorLy8JCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZXM7CisvLwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL1ZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueTJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MmViODEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkyXzAuamF2YQpAQCAtMCwwICsxLDIzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHk7CisKKy8qKgorICogIFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueTJfMAorICovCitwdWJsaWMgY2xhc3MgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55Ml8wIGV4dGVuZHMgWG1sT25lVG9NYW55Cit7CisJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nOworCQorCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wIGphdmFBdHRyaWJ1dGVNYXBwaW5nOworCisJcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvTWFueSB2aXJ0dWFsWG1sT25lVG9NYW55OworCQkKKwlwdWJsaWMgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9NYW55Ml8wKAorCQkJT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmcsIEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzAgamF2YU9uZVRvTWFueU1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YU9uZVRvTWFueU1hcHBpbmc7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvTWFueSA9IG5ldyBWaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb01hbnkob3JtVHlwZU1hcHBpbmcsIGphdmFPbmVUb01hbnlNYXBwaW5nKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdGhpcy5vcm1UeXBlTWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKTsKKwl9CisJCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXROYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0TmFtZShuZXdOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRGZXRjaCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0RmV0Y2gobmV3RmV0Y2gpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDYXNjYWRlVHlwZSBnZXRDYXNjYWRlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldENhc2NhZGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0Q2FzY2FkZSh2YWx1ZSk7CisJfQorCQorCXByaXZhdGUgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBnZXRPcnBoYW5SZW1vdmFsT2YoT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nKSB7CisJCXJldHVybiAoKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvbmVUb01hbnlNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEJvb2xlYW4gZ2V0T3JwaGFuUmVtb3ZhbCgpIHsKKwkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZih0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpOworCQl9CisJCXJldHVybiBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuIG5ld09ycGhhblJlbW92YWwpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0Sm9pblRhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0Sm9pblRhYmxlKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0VGFyZ2V0RW50aXR5KHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRNYXBwZWRCeSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldE1hcHBlZEJ5KHZhbHVlKTsKKwl9CisKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwS2V5IGdldE1hcEtleSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRNYXBLZXkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0TWFwS2V5KE1hcEtleSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0TWFwS2V5KHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRPcmRlckJ5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE9yZGVyQnkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T3JkZXJCeShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldE9yZGVyQnkodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldE1hcHBlZEJ5VGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpOworCX0JCisJCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldEpvaW5Db2x1bW5zKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0Sm9pbkZldGNoKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LmdldEpvaW5GZXRjaCgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuc2V0Sm9pbkZldGNoKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNQcml2YXRlT3duZWQoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuaXNQcml2YXRlT3duZWQoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4gdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldFByaXZhdGVPd25lZCh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0QWNjZXNzTWV0aG9kcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9NYW55LnNldEFjY2Vzc01ldGhvZHModmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0UHJvcGVydGllcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvTWFueS5nZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkVGV4dFJhbmdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9WaXJ0dWFsRWNsaXBzZUxpbmtYbWxPbmVUb09uZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2E3OTYwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUyXzAuamF2YQpAQCAtMCwwICsxLDIyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eTsKKworLyoqCisgKiAgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUyXzAKKyAqLworcHVibGljIGNsYXNzIFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvT25lMl8wIGV4dGVuZHMgWG1sT25lVG9PbmUKK3sKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgb3JtVHlwZU1hcHBpbmc7CisJCisJcHJvdGVjdGVkIGZpbmFsIEphdmFPbmVUb09uZU1hcHBpbmcyXzAgamF2YUF0dHJpYnV0ZU1hcHBpbmc7CisKKwlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUgdmlydHVhbFhtbE9uZVRvT25lOworCisJcHVibGljIFZpcnR1YWxFY2xpcHNlTGlua1htbE9uZVRvT25lMl8wKE9ybVR5cGVNYXBwaW5nIG9ybVR5cGVNYXBwaW5nLCBKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGphdmFPbmVUb09uZU1hcHBpbmcpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5vcm1UeXBlTWFwcGluZyA9IG9ybVR5cGVNYXBwaW5nOworCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nID0gamF2YU9uZVRvT25lTWFwcGluZzsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUgPSBuZXcgVmlydHVhbEVjbGlwc2VMaW5rWG1sT25lVG9PbmUob3JtVHlwZU1hcHBpbmcsIGphdmFPbmVUb09uZU1hcHBpbmcpOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybU1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRNYXBwaW5nS2V5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE5hbWUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldE5hbWUobmV3TmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE5hbWVUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldEZldGNoKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKSB7CisJCXRoaXMudmlydHVhbFhtbE9uZVRvT25lLnNldEZldGNoKG5ld0ZldGNoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldE9wdGlvbmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRPcHRpb25hbChuZXdPcHRpb25hbCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0Sm9pbkNvbHVtbnMoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2FzY2FkZVR5cGUgZ2V0Q2FzY2FkZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldENhc2NhZGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Q2FzY2FkZShDYXNjYWRlVHlwZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRDYXNjYWRlKHZhbHVlKTsKKwl9CisJCisJcHJpdmF0ZSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nKSB7CisJCXJldHVybiAoKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvbmVUb09uZU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEJvb2xlYW4gZ2V0T3JwaGFuUmVtb3ZhbCgpIHsKKwkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZih0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nKTsKKwkJaWYgKHRoaXMuaXNPcm1NZXRhZGF0YUNvbXBsZXRlKCkpIHsKKwkJCXJldHVybiBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpOworCQl9CisJCXJldHVybiBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuIG5ld09ycGhhblJlbW92YWwpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IHZhbHVlcyBvbiBhIHZpcnR1YWwgbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0Sm9pblRhYmxlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRKb2luVGFibGUodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFRhcmdldEVudGl0eShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0VGFyZ2V0RW50aXR5KHZhbHVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0TWFwcGVkQnkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0TWFwcGVkQnkodmFsdWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRNYXBwZWRCeVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRKb2luRmV0Y2goKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0Sm9pbkZldGNoKHZhbHVlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNQcml2YXRlT3duZWQoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5pc1ByaXZhdGVPd25lZCgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRQcml2YXRlT3duZWQoYm9vbGVhbiB2YWx1ZSkgeworCQl0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5zZXRQcml2YXRlT3duZWQodmFsdWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkgeworCQlyZXR1cm4gdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuZ2V0QWNjZXNzTWV0aG9kcygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgdmFsdWUpIHsKKwkJdGhpcy52aXJ0dWFsWG1sT25lVG9PbmUuc2V0QWNjZXNzTWV0aG9kcyh2YWx1ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpIHsKKwkJcmV0dXJuIHRoaXMudmlydHVhbFhtbE9uZVRvT25lLmdldFByb3BlcnRpZXMoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRleHRSYW5nZSBnZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiB0aGlzLnZpcnR1YWxYbWxPbmVUb09uZS5nZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKTsKKwl9CQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwodGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSB2YWx1ZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBzZXQgdmFsdWVzIG9uIGEgdmlydHVhbCBtYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDZmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5KcGFPcHRpb25zMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5FY2xpcHNlTGlua0Nvbm5lY3Rpb24yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuRWNsaXBzZUxpbmtPcHRpb25zMl8wOworCisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeQoreworCQorCUBPdmVycmlkZQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQyXzAocGFyZW50LCB4bWxQZXJzaXN0ZW5jZVVuaXQpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29ubmVjdGlvbjJfMCBidWlsZENvbm5lY3Rpb24oUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29ubmVjdGlvbjJfMCgoUGVyc2lzdGVuY2VVbml0Ml8wKSBwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSnBhT3B0aW9uczJfMCBidWlsZE9wdGlvbnMoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3B0aW9uczJfMCgoUGVyc2lzdGVuY2VVbml0Ml8wKSBwYXJlbnQpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZjViYWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBFRmFjdG9yeSBnZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCkgeworCQlyZXR1cm4gUGVyc2lzdGVuY2VWMl8wRmFjdG9yeS5lSU5TVEFOQ0U7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBidWlsZENvbnRleHROb2RlRmFjdG9yeSgpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5KCk7CisJfQorCQorCXB1YmxpYyBKcGFSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgeworCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMl8wX1JFU09VUkNFX1RZUEU7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZmM5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0Ml8wLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuU2hhcmVkQ2FjaGVNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlZhbGlkYXRpb25Nb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb24yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczJfMDsKKworLyoqCisgKiAgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQyXzAKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0Ml8wCisJZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdAorCWltcGxlbWVudHMgUGVyc2lzdGVuY2VVbml0Ml8wCit7CisJcHJvdGVjdGVkIFNoYXJlZENhY2hlTW9kZSBzcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGU7CisJcHJvdGVjdGVkIFNoYXJlZENhY2hlTW9kZSBkZWZhdWx0U2hhcmVkQ2FjaGVNb2RlOworCQorCXByb3RlY3RlZCBWYWxpZGF0aW9uTW9kZSBzcGVjaWZpZWRWYWxpZGF0aW9uTW9kZTsKKwlwcm90ZWN0ZWQgVmFsaWRhdGlvbk1vZGUgZGVmYXVsdFZhbGlkYXRpb25Nb2RlOworCisJcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0Ml8wKFBlcnNpc3RlbmNlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCkgeworCQlzdXBlcihwYXJlbnQsIHhtbFBlcnNpc3RlbmNlVW5pdCk7CisKKwkJdGhpcy5zcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKCk7CisJCXRoaXMuZGVmYXVsdFNoYXJlZENhY2hlTW9kZSA9IHRoaXMuYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVNb2RlKCk7CisKKwkJdGhpcy5zcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSgpOworCQl0aGlzLmRlZmF1bHRWYWxpZGF0aW9uTW9kZSA9IHRoaXMuYnVpbGREZWZhdWx0VmFsaWRhdGlvbk1vZGUoKTsKKwl9CisKKwkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKKworCXByb3RlY3RlZCBTaGFyZWRDYWNoZU1vZGUgYnVpbGRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoKSB7CisJCXJldHVybiBTaGFyZWRDYWNoZU1vZGUuZnJvbVhtbFJlc291cmNlTW9kZWwodGhpcy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTaGFyZWRDYWNoZU1vZGUoKSk7CisJfQorCQorCXByb3RlY3RlZCBTaGFyZWRDYWNoZU1vZGUgYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVNb2RlKCkgeworCQlyZXR1cm4gU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFOworCX0KKworCXByb3RlY3RlZCBWYWxpZGF0aW9uTW9kZSBidWlsZFNwZWNpZmllZFZhbGlkYXRpb25Nb2RlKCkgeworCQlyZXR1cm4gVmFsaWRhdGlvbk1vZGUuZnJvbVhtbFJlc291cmNlTW9kZWwodGhpcy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRWYWxpZGF0aW9uTW9kZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIFZhbGlkYXRpb25Nb2RlIGJ1aWxkRGVmYXVsdFZhbGlkYXRpb25Nb2RlKCkgeworCQlyZXR1cm4gREVGQVVMVF9WQUxJREFUSU9OX01PREU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdCBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKSB7CisJCXJldHVybiB0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdDsKKwl9CisKKworCS8vICoqKioqKioqKioqKioqKiogcHJvcGVydGllcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyBDb25uZWN0aW9uMl8wIGdldENvbm5lY3Rpb24oKSB7CisJCXJldHVybiAoQ29ubmVjdGlvbjJfMCkgc3VwZXIuZ2V0Q29ubmVjdGlvbigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3B0aW9uczJfMCBnZXRPcHRpb25zKCkgeworCQlyZXR1cm4gKE9wdGlvbnMyXzApIHRoaXMub3B0aW9uczsKKwl9CisKKwkvLyAqKioqKioqKioqIHVwZGF0aW5nICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZShvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQgeHB1KSB7CisJCXN1cGVyLnVwZGF0ZSh4cHUpOworCQkKKwkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQgPSB4cHU7CisJCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKHRoaXMuYnVpbGRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoKSk7CisJCXRoaXMuc2V0RGVmYXVsdFNoYXJlZENhY2hlTW9kZSh0aGlzLmJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlTW9kZSgpKTsKKwkJdGhpcy5zZXRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSh0aGlzLmJ1aWxkU3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUoKSk7CisJCXRoaXMuc2V0RGVmYXVsdFZhbGlkYXRpb25Nb2RlKHRoaXMuYnVpbGREZWZhdWx0VmFsaWRhdGlvbk1vZGUoKSk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogc2hhcmVkIGNhY2hlIG1vZGUgKioqKioqKioqKgorCisJcHVibGljIFNoYXJlZENhY2hlTW9kZSBnZXRTaGFyZWRDYWNoZU1vZGUoKSB7CisJCXJldHVybiAodGhpcy5zcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSA6IHRoaXMuZGVmYXVsdFNoYXJlZENhY2hlTW9kZTsKKwl9CisKKwlwdWJsaWMgU2hhcmVkQ2FjaGVNb2RlIGdldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSgpIHsKKwkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUgc3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKSB7CisJCVNoYXJlZENhY2hlTW9kZSBvbGQgPSB0aGlzLnNwZWNpZmllZFNoYXJlZENhY2hlTW9kZTsKKwkJdGhpcy5zcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUgPSBzcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGU7CisJCXRoaXMuZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuc2V0U2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS50b1htbFJlc291cmNlTW9kZWwoc3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKSk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0hBUkVEX0NBQ0hFX01PREVfUFJPUEVSVFksIG9sZCwgc3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKTsKKwl9CisKKwlwdWJsaWMgU2hhcmVkQ2FjaGVNb2RlIGdldERlZmF1bHRTaGFyZWRDYWNoZU1vZGUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRTaGFyZWRDYWNoZU1vZGU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUgZGVmYXVsdFNoYXJlZENhY2hlTW9kZSkgeworCQlTaGFyZWRDYWNoZU1vZGUgb2xkID0gdGhpcy5kZWZhdWx0U2hhcmVkQ2FjaGVNb2RlOworCQl0aGlzLmRlZmF1bHRTaGFyZWRDYWNoZU1vZGUgPSBkZWZhdWx0U2hhcmVkQ2FjaGVNb2RlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TSEFSRURfQ0FDSEVfTU9ERV9QUk9QRVJUWSwgb2xkLCBkZWZhdWx0U2hhcmVkQ2FjaGVNb2RlKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpIHsKKwkJc3dpdGNoIChnZXRTaGFyZWRDYWNoZU1vZGUoKSkgeworCQkJY2FzZSBOT05FOgorCQkJY2FzZSBFTkFCTEVfU0VMRUNUSVZFOgorCQkJCXJldHVybiBmYWxzZTsKKwkJCWNhc2UgQUxMOgorCQkJY2FzZSBESVNBQkxFX1NFTEVDVElWRToKKwkJCWNhc2UgVU5TUEVDSUZJRUQ6CisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIHRydWU7Ly9udWxsCisJfQorCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uIG1vZGUgKioqKioqKioqKgorCisJcHVibGljIFZhbGlkYXRpb25Nb2RlIGdldFZhbGlkYXRpb25Nb2RlKCkgeworCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFZhbGlkYXRpb25Nb2RlIDogdGhpcy5kZWZhdWx0VmFsaWRhdGlvbk1vZGU7CisJfQorCisJcHVibGljIFZhbGlkYXRpb25Nb2RlIGdldFNwZWNpZmllZFZhbGlkYXRpb25Nb2RlKCkgeworCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRWYWxpZGF0aW9uTW9kZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZShWYWxpZGF0aW9uTW9kZSBzcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSkgeworCQlWYWxpZGF0aW9uTW9kZSBvbGQgPSB0aGlzLnNwZWNpZmllZFZhbGlkYXRpb25Nb2RlOworCQl0aGlzLnNwZWNpZmllZFZhbGlkYXRpb25Nb2RlID0gc3BlY2lmaWVkVmFsaWRhdGlvbk1vZGU7CisKKwkJdGhpcy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5zZXRWYWxpZGF0aW9uTW9kZShWYWxpZGF0aW9uTW9kZS50b1htbFJlc291cmNlTW9kZWwoc3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUpKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9WQUxJREFUSU9OX01PREVfUFJPUEVSVFksIG9sZCwgc3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUpOworCX0KKworCXB1YmxpYyBWYWxpZGF0aW9uTW9kZSBnZXREZWZhdWx0VmFsaWRhdGlvbk1vZGUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRWYWxpZGF0aW9uTW9kZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VmFsaWRhdGlvbk1vZGUoVmFsaWRhdGlvbk1vZGUgZGVmYXVsdFZhbGlkYXRpb25Nb2RlKSB7CisJCVZhbGlkYXRpb25Nb2RlIG9sZCA9IHRoaXMuZGVmYXVsdFZhbGlkYXRpb25Nb2RlOworCQl0aGlzLmRlZmF1bHRWYWxpZGF0aW9uTW9kZSA9IGRlZmF1bHRWYWxpZGF0aW9uTW9kZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVkFMSURBVElPTl9NT0RFX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRWYWxpZGF0aW9uTW9kZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0VjbGlwc2VMaW5rQ29ubmVjdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0VjbGlwc2VMaW5rQ29ubmVjdGlvbjJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYmZjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uMl8wLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkVjbGlwc2VMaW5rQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uMl8wOworCisKKy8qKgorICogIEVjbGlwc2VMaW5rQ29ubmVjdGlvbjJfMAorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb25uZWN0aW9uMl8wIGV4dGVuZHMgRWNsaXBzZUxpbmtDb25uZWN0aW9uCisJaW1wbGVtZW50cyBDb25uZWN0aW9uMl8wCit7CisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCisJcHVibGljIEVjbGlwc2VMaW5rQ29ubmVjdGlvbjJfMChQZXJzaXN0ZW5jZVVuaXQyXzAgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCQorCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEYXRhYmFzZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzKCkgeworCQl0aGlzLmRyaXZlciA9IAorCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSKTsKKwkJdGhpcy51cmwgPSAKKwkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VSTCk7CisJCXRoaXMudXNlciA9IAorCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVNFUik7CisJCXRoaXMucGFzc3dvcmQgPSAKKwkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1BBU1NXT1JEKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcG9zdEluaXRpYWxpemVQcm9wZXJ0aWVzKCkgeworCQlzdXBlci5wb3N0SW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKKworCQkvLyBJbml0aWFsaXplIFByb3BlcnRpZXMgZnJvbSBsZWdhY3kgcHJvcGVydGllcyBuYW1lcyBpZiBub3QgaW5pdGlhbGl6ZWQuCisJCWlmKHRoaXMucGVyc2lzdGVuY2VVbml0S2V5RXhpc3RzKEVDTElQU0VMSU5LX0RSSVZFUikpIHsKKwkJCWlmKHRoaXMuZHJpdmVyID09IG51bGwpIHsKKwkJCQl0aGlzLmRyaXZlciA9IHRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfRFJJVkVSKTsKKwkJCX0KKwkJfQorCQlpZih0aGlzLnBlcnNpc3RlbmNlVW5pdEtleUV4aXN0cyhFQ0xJUFNFTElOS19VUkwpKSB7CisJCQlpZih0aGlzLnVybCA9PSBudWxsKSB7CisJCQkJdGhpcy51cmwgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1VSTCk7CisJCQl9CisJCX0KKwkJaWYodGhpcy5wZXJzaXN0ZW5jZVVuaXRLZXlFeGlzdHMoRUNMSVBTRUxJTktfVVNFUikpIHsKKwkJCWlmKHRoaXMudXNlciA9PSBudWxsKSB7CisJCQkJdGhpcy51c2VyID0gdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19VU0VSKTsKKwkJCX0KKwkJfQorCQlpZih0aGlzLnBlcnNpc3RlbmNlVW5pdEtleUV4aXN0cyhFQ0xJUFNFTElOS19QQVNTV09SRCkpIHsKKwkJCWlmKHRoaXMucGFzc3dvcmQgPT0gbnVsbCkgeworCQkJCXRoaXMucGFzc3dvcmQgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1BBU1NXT1JEKTsKKwkJCX0KKwkJfQorCX0KKworCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7CisJCXN1cGVyLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOworCisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19EUklWRVIpKSB7CisJCQl0aGlzLmRyaXZlckNoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VSTCkpIHsKKwkJCXRoaXMudXJsQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVNFUikpIHsKKwkJCXRoaXMudXNlckNoYW5nZWQobmV3VmFsdWUpOworCQl9CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1BBU1NXT1JEKSkgeworCQkJdGhpcy5wYXNzd29yZENoYW5nZWQobmV3VmFsdWUpOworCQl9CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCXN1cGVyLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eU5hbWUpOworCQkKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX0RSSVZFUikpIHsKKwkJCXRoaXMuZHJpdmVyQ2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VUkwpKSB7CisJCQl0aGlzLnVybENoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVNFUikpIHsKKwkJCXRoaXMudXNlckNoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfUEFTU1dPUkQpKSB7CisJCQl0aGlzLnBhc3N3b3JkQ2hhbmdlZChudWxsKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZERhdGFiYXNlQ29ubmVjdGlvblByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX0RSSVZFUiwKKwkJCUNvbm5lY3Rpb24uRFJJVkVSX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVJMLAorCQkJQ29ubmVjdGlvbi5VUkxfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCUpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VU0VSLAorCQkJQ29ubmVjdGlvbi5VU0VSX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfUEFTU1dPUkQsCisJCQlDb25uZWN0aW9uLlBBU1NXT1JEX1BST1BFUlRZKTsKKwl9CisJCisJLyoqCisJICogTWlncmF0ZSBwcm9wZXJ0aWVzIG5hbWVzIHRvIEVjbGlwc2VMaW5rIDIuMCBuYW1lcy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgbWlncmF0ZVByb3BlcnRpZXMoKSB7CisJCXRoaXMubWlncmF0ZVN0cmluZ1Byb3BlcnR5KEVDTElQU0VMSU5LX0RSSVZFUiwgSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX0RSSVZFUiwgdGhpcy5kcml2ZXIpOworCQl0aGlzLm1pZ3JhdGVTdHJpbmdQcm9wZXJ0eShFQ0xJUFNFTElOS19VUkwsIEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VUkwsIHRoaXMudXJsKTsKKwkJdGhpcy5taWdyYXRlU3RyaW5nUHJvcGVydHkoRUNMSVBTRUxJTktfVVNFUiwgSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VTRVIsIHRoaXMudXNlcik7CisJCXRoaXMubWlncmF0ZVN0cmluZ1Byb3BlcnR5KEVDTElQU0VMSU5LX1BBU1NXT1JELCBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfUEFTU1dPUkQsIHRoaXMucGFzc3dvcmQpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgbWlncmF0ZVN0cmluZ1Byb3BlcnR5KFN0cmluZyBvbGRLZXksIFN0cmluZyBuZXdLZXksIFN0cmluZyB2YWx1ZSkgeworCQlpZih0aGlzLnBlcnNpc3RlbmNlVW5pdEtleUV4aXN0cyhvbGRLZXkpKSB7CisJCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KG9sZEtleSk7CisJCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnNldFByb3BlcnR5KG5ld0tleSwgdmFsdWUpOworCQl9CisJfQorCisJLyoqCisgICAgICogTWlncmF0ZSBhbGwgcHJvcGVydGllcyBuYW1lcyBiZWZvcmUgdGhlIHByb3BlcnR5IGlzIHNldAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHByZVNldFByb3BlcnR5KCkgeworCQkKKwkJdGhpcy5taWdyYXRlUHJvcGVydGllcygpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWFmZDJjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uczJfMC5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuRWNsaXBzZUxpbmtPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnMyXzA7CisKKy8qKgorICogIEVjbGlwc2VMaW5rT3B0aW9uczJfMAorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcHRpb25zMl8wIGV4dGVuZHMgRWNsaXBzZUxpbmtPcHRpb25zCisJaW1wbGVtZW50cyBPcHRpb25zMl8wCit7CisJLy8gKioqKioqKioqKiBHZW5lcmljQ29ubmVjdGlvbiBwcm9wZXJ0aWVzICoqKioqKioqKioKKwlwcml2YXRlIEludGVnZXIgbG9ja1RpbWVvdXQ7CisJcHJpdmF0ZSBJbnRlZ2VyIHF1ZXJ5VGltZW91dDsKKwlwcml2YXRlIFN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0OworCXByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZTsKKwlwcml2YXRlIFN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmU7CisJCisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCisJcHVibGljIEVjbGlwc2VMaW5rT3B0aW9uczJfMChQZXJzaXN0ZW5jZVVuaXQyXzAgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCisJLyoqCisJICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgeworCQlzdXBlci5pbml0aWFsaXplUHJvcGVydGllcygpOworCQkKKwkJdGhpcy5sb2NrVGltZW91dCA9IAorCQkJdGhpcy5nZXRJbnRlZ2VyVmFsdWUoUEVSU0lTVEVOQ0VfTE9DS19USU1FT1VUKTsKKwkJdGhpcy5xdWVyeVRpbWVvdXQgPSAKKwkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKFBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQpOworCisJCS8vIFZhbGlkYXRpb25Nb2RlIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIHBlcnNpc3RlbmNlIHVuaXQgZWxlbWVudAorCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QgPSAKKwkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVCk7CisJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlID0gCisJCQl0aGlzLmdldFN0cmluZ1ZhbHVlKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURSk7CisJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlID0gCisJCQl0aGlzLmdldFN0cmluZ1ZhbHVlKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRSk7CisJfQorCisJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3VmFsdWUpIHsKKwkJc3VwZXIucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7CisJCQorCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQpKSB7CisJCQl0aGlzLmxvY2tUaW1lb3V0Q2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9RVUVSWV9USU1FT1VUKSkgeworCQkJdGhpcy5xdWVyeVRpbWVvdXRDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1QpKSB7CisJCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RDaGFuZ2VkKG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURSkpIHsKKwkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlQ2hhbmdlZChuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUpKSB7CisJCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUNoYW5nZWQobmV3VmFsdWUpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJc3VwZXIucHJvcGVydHlSZW1vdmVkKHByb3BlcnR5TmFtZSk7CisJCQorCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQpKSB7CisJCQl0aGlzLmxvY2tUaW1lb3V0Q2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQpKSB7CisJCQl0aGlzLnF1ZXJ5VGltZW91dENoYW5nZWQobnVsbCk7CisJCX0KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUKSkgeworCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0Q2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURSkpIHsKKwkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlQ2hhbmdlZChudWxsKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRSkpIHsKKwkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlQ2hhbmdlZChudWxsKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCisJICogCQlrZXkgPSBQVSBwcm9wZXJ0eSBrZXkKKwkgKiAJCXZhbHVlID0gcHJvcGVydHkgaWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlQRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQsCisJCQlMT0NLX1RJTUVPVVRfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLnB1dCgKKwkJCVBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQsCisJCQlRVUVSWV9USU1FT1VUX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNULAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMucHV0KAorCQkJUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5wdXQoCisJCQlQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUsCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQyXzAgZ2V0UGVyc2lzdGVuY2VVbml0KCkgeworCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdDJfMCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJfQorCisJLy8gKioqKioqKioqKiBMb2NrVGltZW91dCAqKioqKioqKioqCisJcHVibGljIEludGVnZXIgZ2V0TG9ja1RpbWVvdXQoKSB7CisJCXJldHVybiB0aGlzLmxvY2tUaW1lb3V0OworCX0KKworCXB1YmxpYyB2b2lkIHNldExvY2tUaW1lb3V0KEludGVnZXIgbmV3TG9ja1RpbWVvdXQpIHsKKwkJSW50ZWdlciBvbGQgPSB0aGlzLmxvY2tUaW1lb3V0OworCQl0aGlzLmxvY2tUaW1lb3V0ID0gbmV3TG9ja1RpbWVvdXQ7CisJCXRoaXMucHV0UHJvcGVydHkoTE9DS19USU1FT1VUX1BST1BFUlRZLCBuZXdMb2NrVGltZW91dCk7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0NLX1RJTUVPVVRfUFJPUEVSVFksIG9sZCwgbmV3TG9ja1RpbWVvdXQpOworCX0KKworCXByaXZhdGUgdm9pZCBsb2NrVGltZW91dENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJCUludGVnZXIgbmV3VmFsdWUgPSBnZXRJbnRlZ2VyVmFsdWVPZihzdHJpbmdWYWx1ZSk7CisJCQorCQlJbnRlZ2VyIG9sZCA9IHRoaXMubG9ja1RpbWVvdXQ7CisJCXRoaXMubG9ja1RpbWVvdXQgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExPQ0tfVElNRU9VVF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdExvY2tUaW1lb3V0KCkgeworCQlyZXR1cm4gREVGQVVMVF9MT0NLX1RJTUVPVVQ7CisJfQorCisJLy8gKioqKioqKioqKiBRdWVyeVRpbWVvdXQgKioqKioqKioqKgorCXB1YmxpYyBJbnRlZ2VyIGdldFF1ZXJ5VGltZW91dCgpIHsKKwkJcmV0dXJuIHRoaXMucXVlcnlUaW1lb3V0OworCX0KKworCXB1YmxpYyB2b2lkIHNldFF1ZXJ5VGltZW91dChJbnRlZ2VyIG5ld1F1ZXJ5VGltZW91dCkgeworCQlJbnRlZ2VyIG9sZCA9IHRoaXMucXVlcnlUaW1lb3V0OworCQl0aGlzLnF1ZXJ5VGltZW91dCA9IG5ld1F1ZXJ5VGltZW91dDsKKwkJdGhpcy5wdXRQcm9wZXJ0eShRVUVSWV9USU1FT1VUX1BST1BFUlRZLCBuZXdRdWVyeVRpbWVvdXQpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVFUllfVElNRU9VVF9QUk9QRVJUWSwgb2xkLCBuZXdRdWVyeVRpbWVvdXQpOworCX0KKworCXByaXZhdGUgdm9pZCBxdWVyeVRpbWVvdXRDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOworCQkKKwkJSW50ZWdlciBvbGQgPSB0aGlzLnF1ZXJ5VGltZW91dDsKKwkJdGhpcy5xdWVyeVRpbWVvdXQgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFFVRVJZX1RJTUVPVVRfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRRdWVyeVRpbWVvdXQoKSB7CisJCXJldHVybiBERUZBVUxUX1FVRVJZX1RJTUVPVVQ7CisJfQorCisJCisJLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0ICoqKioqKioqKioKKwlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoKSB7CisJCXJldHVybiB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3Q7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdChTdHJpbmcgbmV3VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCkgeworCQlTdHJpbmcgb2xkID0gdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0OworCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QgPSBuZXdWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0OworCQl0aGlzLnB1dFByb3BlcnR5KFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFksIG5ld1ZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwgb2xkLCBuZXdWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdENoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3Q7CisJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCA9IG5ld1ZhbHVlOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCgpIHsKKwkJcmV0dXJuIERFRkFVTFRfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVDsKKwl9CisKKwkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSAqKioqKioqKioqCisJcHVibGljIFN0cmluZyBnZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoKSB7CisJCXJldHVybiB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoU3RyaW5nIG5ld1ZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGU7CisJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlID0gbmV3VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlOworCQl0aGlzLnB1dFByb3BlcnR5KFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwgbmV3VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwgb2xkLCBuZXdWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUpOworCX0KKworCXByaXZhdGUgdm9pZCB2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGU7CisJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlID0gbmV3VmFsdWU7CisJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgpIHsKKwkJcmV0dXJuIERFRkFVTFRfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFOworCX0KKworCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlICoqKioqKioqKioKKwlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgpIHsKKwkJcmV0dXJuIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZShTdHJpbmcgbmV3VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZTsKKwkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUgPSBuZXdWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmU7CisJCXRoaXMucHV0UHJvcGVydHkoVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLCBuZXdWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUpOworCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLCBvbGQsIG5ld1ZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZTsKKwkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUgPSBuZXdWYWx1ZTsKKwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKCkgeworCQlyZXR1cm4gREVGQVVMVF9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkU7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjMmFiYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBDb21tb24gcHJvdG9jb2wgYW1vbmc6CisgKiAgICAgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHlwZUNvbnZlcnRlcgorICogICAgIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk9iamVjdFR5cGVDb252ZXJ0ZXIKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KKwlleHRlbmRzIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCit7CisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdkYXRhVHlwZScgZWxlbWVudCBvZiB0aGUgVHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgorCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCVN0cmluZyBnZXREYXRhVHlwZSgpOworCQlTdHJpbmcgREFUQV9UWVBFX1BST1BFUlRZID0gImRhdGFUeXBlIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGF0YVR5cGUnIGVsZW1lbnQgb2YgdGhlIFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXREYXRhVHlwZShTdHJpbmcgZGF0YVR5cGUpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnZGF0YVR5cGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUeXBlQ29udmVydGVyIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldERhdGFUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdvYmplY3RUeXBlJyBlbGVtZW50IG9mIHRoZSBUeXBlQ29udmVydGVyIGFubm90YXRpb24uCisJICogUmV0dXJucyBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJU3RyaW5nIGdldE9iamVjdFR5cGUoKTsKKwkJU3RyaW5nIE9CSkVDVF9UWVBFX1BST1BFUlRZID0gIm9iamVjdFR5cGUiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdvYmplY3RUeXBlJyBlbGVtZW50IG9mIHRoZSBUeXBlQ29udmVydGVyIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgb2JqZWN0VHlwZSk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdvYmplY3RUeXBlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgorCSAqLworCVRleHRSYW5nZSBnZXRPYmplY3RUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DYWNoZUNvb3JkaW5hdGlvblR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmIzZTFhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBlbnVtCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZUNvb3JkaW5hdGlvblR5cGUKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgZW51bSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgeworCisJU0VORF9PQkpFQ1RfQ0hBTkdFUyhFY2xpcHNlTGluay5DQUNIRV9DT09SRElOQVRJT05fVFlQRV9fU0VORF9PQkpFQ1RfQ0hBTkdFUyksCisJSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMoRWNsaXBzZUxpbmsuQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfX0lOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKSwKKwlTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyhFY2xpcHNlTGluay5DQUNIRV9DT09SRElOQVRJT05fVFlQRV9fU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpLAorCU5PTkUoRWNsaXBzZUxpbmsuQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfX05PTkUpOworCisKKwlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOworCisJQ2FjaGVDb29yZGluYXRpb25UeXBlKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgeworCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOworCX0KKworCXByaXZhdGUgc3RhdGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKKwkJZm9yIChDYWNoZUNvb3JkaW5hdGlvblR5cGUgY2FjaGVDb29yZGluYXRpb25UeXBlIDogQ2FjaGVDb29yZGluYXRpb25UeXBlLnZhbHVlcygpKSB7CisJCQlpZiAoY2FjaGVDb29yZGluYXRpb25UeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKS5lcXVhbHMoamF2YUFubm90YXRpb25WYWx1ZSkpIHsKKwkJCQlyZXR1cm4gY2FjaGVDb29yZGluYXRpb25UeXBlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgY2FjaGVDb29yZGluYXRpb25UeXBlKSB7CisJCXJldHVybiAoY2FjaGVDb29yZGluYXRpb25UeXBlID09IG51bGwpID8gbnVsbCA6IGNhY2hlQ29vcmRpbmF0aW9uVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DYWNoZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NhY2hlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MjAwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DYWNoZVR5cGUuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGVudW0KKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlVHlwZQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBlbnVtIENhY2hlVHlwZSB7CisKKwlGVUxMKEVjbGlwc2VMaW5rLkNBQ0hFX1RZUEVfX0ZVTEwpLAorCVdFQUsoRWNsaXBzZUxpbmsuQ0FDSEVfVFlQRV9fV0VBSyksCisJU09GVChFY2xpcHNlTGluay5DQUNIRV9UWVBFX19TT0ZUKSwKKwlTT0ZUX1dFQUsoRWNsaXBzZUxpbmsuQ0FDSEVfVFlQRV9fU09GVF9XRUFLKSwKKwlIQVJEX1dFQUsoRWNsaXBzZUxpbmsuQ0FDSEVfVFlQRV9fSEFSRF9XRUFLKSwKKwlDQUNIRShFY2xpcHNlTGluay5DQUNIRV9UWVBFX19DQUNIRSksCisJTk9ORShFY2xpcHNlTGluay5DQUNIRV9UWVBFX19OT05FKTsKKworCisJcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKKworCUNhY2hlVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgeworCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKwkJfQorCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKKwkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBDYWNoZVR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKKwkJcmV0dXJuIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhqYXZhQW5ub3RhdGlvblZhbHVlKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBDYWNoZVR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCWZvciAoQ2FjaGVUeXBlIGNhY2hlVHlwZSA6IENhY2hlVHlwZS52YWx1ZXMoKSkgeworCQkJaWYgKGNhY2hlVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7CisJCQkJcmV0dXJuIGNhY2hlVHlwZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoQ2FjaGVUeXBlIGNhY2hlVHlwZSkgeworCQlyZXR1cm4gKGNhY2hlVHlwZSA9PSBudWxsKSA/IG51bGwgOiBjYWNoZVR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2hhbmdlVHJhY2tpbmdUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DaGFuZ2VUcmFja2luZ1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzIyZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2hhbmdlVHJhY2tpbmdUeXBlLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBlbnVtCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DaGFuZ2VUcmFja2luZ1R5cGUKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgZW51bSBDaGFuZ2VUcmFja2luZ1R5cGUgeworCisJQVRUUklCVVRFKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lOR19UWVBFX19BVFRSSUJVVEUpLAorCU9CSkVDVChFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkdfVFlQRV9fT0JKRUNUKSwKKwlERUZFUlJFRChFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkdfVFlQRV9fREVGRVJSRUQpLAorCUFVVE8oRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HX1RZUEVfX0FVVE8pOworCisKKwlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOworCisJQ2hhbmdlVHJhY2tpbmdUeXBlKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgeworCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIENoYW5nZVRyYWNraW5nVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgeworCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOworCX0KKworCXByaXZhdGUgc3RhdGljIENoYW5nZVRyYWNraW5nVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKKwkJZm9yIChDaGFuZ2VUcmFja2luZ1R5cGUgY2hhbmdlVHJhY2tpbmdUeXBlIDogQ2hhbmdlVHJhY2tpbmdUeXBlLnZhbHVlcygpKSB7CisJCQlpZiAoY2hhbmdlVHJhY2tpbmdUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKS5lcXVhbHMoamF2YUFubm90YXRpb25WYWx1ZSkpIHsKKwkJCQlyZXR1cm4gY2hhbmdlVHJhY2tpbmdUeXBlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShDaGFuZ2VUcmFja2luZ1R5cGUgY2hhbmdlVHJhY2tpbmdUeXBlKSB7CisJCXJldHVybiAoY2hhbmdlVHJhY2tpbmdUeXBlID09IG51bGwpID8gbnVsbCA6IGNoYW5nZVRyYWNraW5nVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGluay5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjcxZTcwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmsuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCisvKioKKyAqIEVjbGlwc2VMaW5rIEphdmEtcmVsYXRlZCBzdHVmZiAoYW5ub3RhdGlvbnMgZXRjLikKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmsgeworCisJLy8gRWNsaXBzZUxpbmsgcGFja2FnZQorCVN0cmluZyBQQUNLQUdFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBQQUNLQUdFXyA9IFBBQ0tBR0UgKyAiLiI7CisKKworCS8vICoqKioqKioqKiogQVBJICoqKioqKioqKioKKworCS8vIEVjbGlzcGVMaW5rIGFubm90YXRpb25zCisJU3RyaW5nIEJBU0lDX0NPTExFQ1RJT04gPSBQQUNLQUdFXyArICJCYXNpY0NvbGxlY3Rpb24iOworCVN0cmluZyBCQVNJQ19NQVAgPSBQQUNLQUdFXyArICJCYXNpY01hcCI7CisJU3RyaW5nIENBQ0hFID0gUEFDS0FHRV8gKyAiQ2FjaGUiOworCQlTdHJpbmcgQ0FDSEVfX1NIQVJFRCA9ICJzaGFyZWQiOworCQlTdHJpbmcgQ0FDSEVfX0VYUElSWSA9ICJleHBpcnkiOworCQlTdHJpbmcgQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSA9ICJleHBpcnlUaW1lT2ZEYXkiOworCQlTdHJpbmcgQ0FDSEVfX1RZUEUgPSAidHlwZSI7CisJCVN0cmluZyBDQUNIRV9fU0laRSA9ICJzaXplIjsKKwkJU3RyaW5nIENBQ0hFX19BTFdBWVNfUkVGUkVTSCA9ICJhbHdheXNSZWZyZXNoIjsKKwkJU3RyaW5nIENBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVIgPSAicmVmcmVzaE9ubHlJZk5ld2VyIjsKKwkJU3RyaW5nIENBQ0hFX19ESVNBQkxFX0hJVFMgPSAiZGlzYWJsZUhpdHMiOworCQlTdHJpbmcgQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFID0gImNvb3JkaW5hdGlvblR5cGUiOworCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkcgPSBQQUNLQUdFXyArICJDaGFuZ2VUcmFja2luZyI7CisJCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfX1ZBTFVFID0gInZhbHVlIjsKKwlTdHJpbmcgQ09OVkVSU0lPTl9WQUxVRSA9IFBBQ0tBR0VfICsgIkNvbnZlcnNpb25WYWx1ZSI7CisJCVN0cmluZyBDT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFID0gImRhdGFWYWx1ZSI7CisJCVN0cmluZyBDT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUgPSAib2JqZWN0VmFsdWUiOworCVN0cmluZyBDT05WRVJUID0gUEFDS0FHRV8gKyAiQ29udmVydCI7CisJCVN0cmluZyBDT05WRVJUX19WQUxVRSA9ICJ2YWx1ZSI7CisJU3RyaW5nIENPTlZFUlRFUiA9IFBBQ0tBR0VfICsgIkNvbnZlcnRlciI7CisJCVN0cmluZyBDT05WRVJURVJfX05BTUUgPSAibmFtZSI7CisJCVN0cmluZyBDT05WRVJURVJfX0NPTlZFUlRFUl9DTEFTUyA9ICJjb252ZXJ0ZXJDbGFzcyI7CisJU3RyaW5nIENVU1RPTUlaRVIgPSBQQUNLQUdFXyArICJDdXN0b21pemVyIjsKKwkJU3RyaW5nIENVU1RPTUlaRVJfX1ZBTFVFID0gInZhbHVlIjsKKwlTdHJpbmcgRVhJU1RFTkNFX0NIRUNLSU5HID0gUEFDS0FHRV8gKyAiRXhpc3RlbmNlQ2hlY2tpbmciOworCQlTdHJpbmcgRVhJU1RFTkNFX0NIRUNLSU5HX19WQUxVRSA9ICJ2YWx1ZSI7CisJU3RyaW5nIEpPSU5fRkVUQ0ggPSBQQUNLQUdFXyArICJKb2luRmV0Y2giOworCQlTdHJpbmcgSk9JTl9GRVRDSF9fVkFMVUUgPSAidmFsdWUiOworCVN0cmluZyBNVVRBQkxFID0gUEFDS0FHRV8gKyAiTXV0YWJsZSI7CisJCVN0cmluZyBNVVRBQkxFX19WQUxVRSA9ICJ2YWx1ZSI7CisJU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IFBBQ0tBR0VfICsgIk9iamVjdFR5cGVDb252ZXJ0ZXIiOworCQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOworCQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUgPSAiZGF0YVR5cGUiOworCQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9ICJvYmplY3RUeXBlIjsKKwkJU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVMgPSAiY29udmVyc2lvblZhbHVlcyI7CisJCVN0cmluZyBPQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFID0gImRlZmF1bHRPYmplY3RWYWx1ZSI7CisJU3RyaW5nIFBSSVZBVEVfT1dORUQgPSBQQUNLQUdFXyArICJQcml2YXRlT3duZWQiOworCVN0cmluZyBSRUFEX09OTFkgPSBQQUNLQUdFXyArICJSZWFkT25seSI7CisJU3RyaW5nIFJFQURfVFJBTlNGT1JNRVIgPSBQQUNLQUdFXyArICJSZWFkVHJhbnNmb3JtZXIiOworCQlTdHJpbmcgUkVBRF9UUkFOU0ZPUk1FUl9fVFJBTlNGT1JNRVJfQ0xBU1MgPSAidHJhbnNmb3JtZXJDbGFzcyI7CisJCVN0cmluZyBSRUFEX1RSQU5TRk9STUVSX19NRVRIT0QgPSAibWV0aG9kIjsKKwlTdHJpbmcgU1RSVUNUX0NPTlZFUlRFUiA9IFBBQ0tBR0VfICsgIlN0cnVjdENvbnZlcnRlciI7CisJCVN0cmluZyBTVFJVQ1RfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOworCQlTdHJpbmcgU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSID0gImNvbnZlcnRlciI7CisJU3RyaW5nIFRJTUVfT0ZfREFZID0gUEFDS0FHRV8gKyAiVGltZU9mRGF5IjsKKwkJU3RyaW5nIFRJTUVfT0ZfREFZX19IT1VSID0gImhvdXIiOworCQlTdHJpbmcgVElNRV9PRl9EQVlfX01JTlVURSA9ICJtaW51dGUiOworCQlTdHJpbmcgVElNRV9PRl9EQVlfX1NFQ09ORCA9ICJzZWNvbmQiOworCQlTdHJpbmcgVElNRV9PRl9EQVlfX01JTExJU0VDT05EID0gIm1pbGxpc2Vjb25kIjsKKwlTdHJpbmcgVFJBTlNGT1JNQVRJT04gPSBQQUNLQUdFXyArICJUcmFuc2Zvcm1hdGlvbiI7CisJCVN0cmluZyBUUkFOU0ZPUk1BVElPTl9fRkVUQ0ggPSAiZmV0Y2giOworCQlTdHJpbmcgVFJBTlNGT1JNQVRJT05fX09QVElPTkFMID0gIm9wdGlvbmFsIjsKKwlTdHJpbmcgVFlQRV9DT05WRVJURVIgPSBQQUNLQUdFXyArICJUeXBlQ29udmVydGVyIjsKKwkJU3RyaW5nIFRZUEVfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOworCQlTdHJpbmcgVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSA9ICJkYXRhVHlwZSI7CisJCVN0cmluZyBUWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUgPSAib2JqZWN0VHlwZSI7CisJU3RyaW5nIFZBUklBQkxFX09ORV9UT19PTkUgPSBQQUNLQUdFXyArICJWYXJpYWJsZU9uZVRvT25lIjsKKwlTdHJpbmcgV1JJVEVfVFJBTlNGT1JNRVIgPSBQQUNLQUdFXyArICJXcml0ZVRyYW5zZm9ybWVyIjsKKwkJU3RyaW5nIFdSSVRFX1RSQU5TRk9STUVSX19UUkFOU0ZPUk1FUl9DTEFTUyA9ICJ0cmFuc2Zvcm1lckNsYXNzIjsKKwkJU3RyaW5nIFdSSVRFX1RSQU5TRk9STUVSX19NRVRIT0QgPSAibWV0aG9kIjsKKwkJU3RyaW5nIFdSSVRFX1RSQU5TRk9STUVSX19DT0xVTU4gPSAiY29sdW1uIjsKKwlTdHJpbmcgV1JJVEVfVFJBTlNGT1JNRVJTID0gUEFDS0FHRV8gKyAiV3JpdGVUcmFuc2Zvcm1lcnMiOworCQlTdHJpbmcgV1JJVEVfVFJBTlNGT1JNRVJTX19WQUxVRSA9ICJ2YWx1ZSI7CisKKwkvLyBFY2xpcHNlTGluayBlbnVtcworCVN0cmluZyBDQUNIRV9DT09SRElOQVRJT05fVFlQRSA9IFBBQ0tBR0VfICsgIkNhY2hlQ29vcmRpbmF0aW9uVHlwZSI7CisJCVN0cmluZyBDQUNIRV9DT09SRElOQVRJT05fVFlQRV8gPSBDQUNIRV9DT09SRElOQVRJT05fVFlQRSArICIuIjsKKwkJU3RyaW5nIENBQ0hFX0NPT1JESU5BVElPTl9UWVBFX19TRU5EX09CSkVDVF9DSEFOR0VTID0gQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfICsgIlNFTkRfT0JKRUNUX0NIQU5HRVMiOworCQlTdHJpbmcgQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfX0lOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTID0gQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfICsgIklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTIjsKKwkJU3RyaW5nIENBQ0hFX0NPT1JESU5BVElPTl9UWVBFX19TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyA9IENBQ0hFX0NPT1JESU5BVElPTl9UWVBFXyArICJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyI7CisJCVN0cmluZyBDQUNIRV9DT09SRElOQVRJT05fVFlQRV9fTk9ORSA9IENBQ0hFX0NPT1JESU5BVElPTl9UWVBFXyArICJOT05FIjsKKwlTdHJpbmcgQ0FDSEVfVFlQRSA9IFBBQ0tBR0VfICsgIkNhY2hlVHlwZSI7CisJCVN0cmluZyBDQUNIRV9UWVBFXyA9IENBQ0hFX1RZUEUgKyAiLiI7CisJCVN0cmluZyBDQUNIRV9UWVBFX19GVUxMID0gQ0FDSEVfVFlQRV8gKyAiRlVMTCI7CisJCVN0cmluZyBDQUNIRV9UWVBFX19XRUFLID0gQ0FDSEVfVFlQRV8gKyAiV0VBSyI7CisJCVN0cmluZyBDQUNIRV9UWVBFX19TT0ZUID0gQ0FDSEVfVFlQRV8gKyAiU09GVCI7CisJCVN0cmluZyBDQUNIRV9UWVBFX19TT0ZUX1dFQUsgPSBDQUNIRV9UWVBFXyArICJTT0ZUX1dFQUsiOworCQlTdHJpbmcgQ0FDSEVfVFlQRV9fSEFSRF9XRUFLID0gQ0FDSEVfVFlQRV8gKyAiSEFSRF9XRUFLIjsKKwkJU3RyaW5nIENBQ0hFX1RZUEVfX0NBQ0hFID0gQ0FDSEVfVFlQRV8gKyAiQ0FDSEUiOworCQlTdHJpbmcgQ0FDSEVfVFlQRV9fTk9ORSA9IENBQ0hFX1RZUEVfICsgIk5PTkUiOworCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfVFlQRSA9IFBBQ0tBR0VfICsgIkNoYW5nZVRyYWNraW5nVHlwZSI7CisJCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfVFlQRV8gPSBDSEFOR0VfVFJBQ0tJTkdfVFlQRSArICIuIjsKKwkJU3RyaW5nIENIQU5HRV9UUkFDS0lOR19UWVBFX19BVFRSSUJVVEUgPSBDSEFOR0VfVFJBQ0tJTkdfVFlQRV8gKyAiQVRUUklCVVRFIjsKKwkJU3RyaW5nIENIQU5HRV9UUkFDS0lOR19UWVBFX19PQkpFQ1QgPSBDSEFOR0VfVFJBQ0tJTkdfVFlQRV8gKyAiT0JKRUNUIjsKKwkJU3RyaW5nIENIQU5HRV9UUkFDS0lOR19UWVBFX19ERUZFUlJFRCA9IENIQU5HRV9UUkFDS0lOR19UWVBFXyArICJERUZFUlJFRCI7CisJCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfVFlQRV9fQVVUTyA9IENIQU5HRV9UUkFDS0lOR19UWVBFXyArICJBVVRPIjsKKwlTdHJpbmcgRVhJU1RFTkNFX1RZUEUgPSBQQUNLQUdFXyArICJFeGlzdGVuY2VUeXBlIjsKKwkJU3RyaW5nIEVYSVNURU5DRV9UWVBFXyA9IEVYSVNURU5DRV9UWVBFICsgIi4iOworCQlTdHJpbmcgRVhJU1RFTkNFX1RZUEVfX0NIRUNLX0NBQ0hFID0gRVhJU1RFTkNFX1RZUEVfICsgIkNIRUNLX0NBQ0hFIjsKKwkJU3RyaW5nIEVYSVNURU5DRV9UWVBFX19DSEVDS19EQVRBQkFTRSA9IEVYSVNURU5DRV9UWVBFXyArICJDSEVDS19EQVRBQkFTRSI7CisJCVN0cmluZyBFWElTVEVOQ0VfVFlQRV9fQVNTVU1FX0VYSVNURU5DRSA9IEVYSVNURU5DRV9UWVBFXyArICJBU1NVTUVfRVhJU1RFTkNFIjsKKwkJU3RyaW5nIEVYSVNURU5DRV9UWVBFX19BU1NVTUVfTk9OX0VYSVNURU5DRSA9IEVYSVNURU5DRV9UWVBFXyArICJBU1NVTUVfTk9OX0VYSVNURU5DRSI7CisJU3RyaW5nIEpPSU5fRkVUQ0hfVFlQRSA9IFBBQ0tBR0VfICsgIkpvaW5GZXRjaFR5cGUiOworCQlTdHJpbmcgSk9JTl9GRVRDSF9UWVBFXyA9IEpPSU5fRkVUQ0hfVFlQRSArICIuIjsKKwkJU3RyaW5nIEpPSU5fRkVUQ0hfVFlQRV9fSU5ORVIgPSBKT0lOX0ZFVENIX1RZUEVfICsgIklOTkVSIjsKKwkJU3RyaW5nIEpPSU5fRkVUQ0hfVFlQRV9fT1VURVIgPSBKT0lOX0ZFVENIX1RZUEVfICsgIk9VVEVSIjsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmNWU3YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQmFzaWNDb2xsZWN0aW9uCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24KKwlleHRlbmRzIEFubm90YXRpb24KK3sKKwlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuQkFTSUNfQ09MTEVDVElPTjsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NDA0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZWxpbmsgYW5ub3RhdGlvbgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQmFzaWNNYXAKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCit7CisJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLkJBU0lDX01BUDsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MmRiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCit7CisJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLkNBQ0hFOworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd0eXBlJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJQ2FjaGVUeXBlIGdldFR5cGUoKTsKKwkJU3RyaW5nIFRZUEVfUFJPUEVSVFkgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3R5cGUnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0VHlwZShDYWNoZVR5cGUgdHlwZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3R5cGUnIGVsZW1lbnQuCisJICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQorCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisJCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NpemUnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlJbnRlZ2VyIGdldFNpemUoKTsKKwkJU3RyaW5nIFNJWkVfUFJPUEVSVFkgPSAic2l6ZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NpemUnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0U2l6ZShJbnRlZ2VyIHNpemUpOworCQkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3NpemUnIGVsZW1lbnQuCisJICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQorCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0U2l6ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisJCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NoYXJlZCcgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUJvb2xlYW4gZ2V0U2hhcmVkKCk7CisJCVN0cmluZyBTSEFSRURfUFJPUEVSVFkgPSAic2hhcmVkIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2hhcmVkJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldFNoYXJlZChCb29sZWFuIHNoYXJlZCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3NoYXJlZCcgZWxlbWVudC4KKwkgKiBJZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9CisJICogZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgorCSAqLworCVRleHRSYW5nZSBnZXRTaGFyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2V4cGlyeScgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUludGVnZXIgZ2V0RXhwaXJ5KCk7CisJCVN0cmluZyBFWFBJUllfUFJPUEVSVFkgPSAiZXhwaXJ5IjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZXhwaXJ5JyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldEV4cGlyeShJbnRlZ2VyIGV4cGlyeSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2V4cGlyeScgZWxlbWVudC4KKwkgKiBJZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9CisJICogZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgorCSAqLworCVRleHRSYW5nZSBnZXRFeHBpcnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCQorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdleHBpcnlUaW1lT2ZEYXknIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZ2V0RXhwaXJ5VGltZU9mRGF5KCk7CisJCVN0cmluZyBFWFBJUllfVElNRV9PRl9EQVlfUFJPUEVSVFkgPSAiZXhwaXJ5VGltZU9mRGF5IjsgLy8kTk9OLU5MUy0xJAorCisJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGFkZEV4cGlyeVRpbWVPZkRheSgpOworCisJdm9pZCByZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdleHBpcnlUaW1lT2ZEYXknIGVsZW1lbnQuCisJICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQorCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGltZU9mRGF5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKwkKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnYWx3YXlzUmVmcmVzaCcgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUJvb2xlYW4gZ2V0QWx3YXlzUmVmcmVzaCgpOworCQlTdHJpbmcgQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFkgPSAiYWx3YXlzUmVmcmVzaCI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2Fsd2F5c1JlZnJlc2gnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuIGFsd2F5c1JlZnJlc2gpOworCQkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2Fsd2F5c1JlZnJlc2gnIGVsZW1lbnQuCisJICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQorCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0QWx3YXlzUmVmcmVzaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisJCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3JlZnJlc2hPbmx5SWZOZXdlcicgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUJvb2xlYW4gZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCk7CisJCVN0cmluZyBSRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFkgPSAicmVmcmVzaE9ubHlJZk5ld2VyIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncmVmcmVzaE9ubHlJZk5ld2VyJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcik7CisJCQorCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAncmVmcmVzaE9ubHlJZk5ld2VyJyBlbGVtZW50LgorCSAqIElmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0KKwkgKiBmb3IgdGhlIENhY2hlIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldFJlZnJlc2hPbmx5SWZOZXdlclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisJCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2Rpc2FibGVIaXRzJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJQm9vbGVhbiBnZXREaXNhYmxlSGl0cygpOworCQlTdHJpbmcgRElTQUJMRV9ISVRTX1BST1BFUlRZID0gImRpc2FibGVIaXRzIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGlzYWJsZUhpdHMnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0RGlzYWJsZUhpdHMoQm9vbGVhbiBkaXNhYmxlSGl0cyk7CisJCQorCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnZGlzYWJsZUhpdHMnIGVsZW1lbnQuCisJICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQorCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0RGlzYWJsZXNIaXRzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKwkKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29vcmRpbmF0aW9uVHlwZScgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUNhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRDb29yZGluYXRpb25UeXBlKCk7CisJCVN0cmluZyBDT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSA9ICJjb29yZGluYXRpb25UeXBlIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29vcmRpbmF0aW9uVHlwZScgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnY29vcmRpbmF0aW9uVHlwZScgZWxlbWVudC4KKwkgKiBJZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9CisJICogZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgorCSAqLworCVRleHRSYW5nZSBnZXRDb29yZGluYXRpb25UeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYTVmYTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DaGFuZ2VUcmFja2luZworICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24KKwlleHRlbmRzIEFubm90YXRpb24KK3sKKwlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HOworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUNoYW5nZVRyYWNraW5nVHlwZSBnZXRWYWx1ZSgpOworCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldFZhbHVlKENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiAgSWYgdGhlIGVsZW1lbnQgCisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzE2NWVkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnNpb25WYWx1ZQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCit7CisJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUU7CisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2RhdGFWYWx1ZScgZWxlbWVudCBvZiB0aGUgQ29udmVyc2lvblZhbHVlIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlTdHJpbmcgZ2V0RGF0YVZhbHVlKCk7CisJCVN0cmluZyBEQVRBX1ZBTFVFX1BST1BFUlRZID0gImRhdGFWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGF0YVZhbHVlJyBlbGVtZW50IG9mIHRoZSBDb252ZXJzaW9uVmFsdWUgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXREYXRhVmFsdWUoU3RyaW5nIGRhdGFWYWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2RhdGFWYWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENvbnZlcnNpb25WYWx1ZSBhbm5vdGF0aW9uLgorCSAqLworCVRleHRSYW5nZSBnZXREYXRhVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ29iamVjdFZhbHVlJyBlbGVtZW50IG9mIHRoZSBDb252ZXJzaW9uVmFsdWUgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCVN0cmluZyBnZXRPYmplY3RWYWx1ZSgpOworCQlTdHJpbmcgT0JKRUNUX1ZBTFVFX1BST1BFUlRZID0gIm9iamVjdFZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdvYmplY3RWYWx1ZScgZWxlbWVudCBvZiB0aGUgQ29udmVyc2lvblZhbHVlIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIG9iamVjdFZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnb2JqZWN0VmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDb252ZXJzaW9uVmFsdWUgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0T2JqZWN0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhZjIwNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgoreworCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5DT05WRVJUOworCQkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBDb252ZXJ0IGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlTdHJpbmcgZ2V0VmFsdWUoKTsKKwkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIENvbnZlcnQgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDb252ZXJ0IGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ3ZhbHVlJyBlbGVtZW50LgorCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlib29sZWFuIHZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2ZThhMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnRlcgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uCisJZXh0ZW5kcyBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgoreworCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5DT05WRVJURVI7CisJCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29udmVydGVyQ2xhc3MnIGVsZW1lbnQgb2YgdGhlIENvbnZlcnRlciBhbm5vdGF0aW9uLgorCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgorCSAqLworCVN0cmluZyBnZXRDb252ZXJ0ZXJDbGFzcygpOworCQlTdHJpbmcgQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZID0gImNvbnZlcnRlckNsYXNzIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29udmVydGVyQ2xhc3MnIGVsZW1lbnQgb2YgdGhlIENvbnZlcnRlciBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldENvbnZlcnRlckNsYXNzKFN0cmluZyB2YWx1ZSk7CisJCQorCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnY29udmVydGVyQ2xhc3MnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbnZlcnRlciBjbGFzcyBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciNFQ0xJUFNFTElOS19DT05WRVJURVJfQ0xBU1NfTkFNRQorCSAqLworCWJvb2xlYW4gY29udmVydGVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWNmYzVkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlbGluayBhbm5vdGF0aW9uCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DdXN0b21pemVyCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCit7CisJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLkNVU1RPTUlaRVI7CisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBDdXN0b21pemVyIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlTdHJpbmcgZ2V0VmFsdWUoKTsKKwkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgQ3VzdG9taXplciBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ3VzdG9taXplciBhbm5vdGF0aW9uLgorCSAqLworCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VzdG9taXplciBjbGFzcyBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXIjRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSX0NMQVNTX05BTUUKKwkgKi8KKwlib29sZWFuIGN1c3RvbWl6ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZU5hbWUsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkNDk3NQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkV4aXN0ZW5jZUNoZWNraW5nCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgoreworCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkc7CisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJRXhpc3RlbmNlVHlwZSBnZXRWYWx1ZSgpOworCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldFZhbHVlKEV4aXN0ZW5jZVR5cGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEV4aXN0ZW5jZUNoZWNraW5nIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjZlZTFlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkpvaW5GZXRjaAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCit7CisJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0g7CisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBKb2luRmV0Y2ggYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUpvaW5GZXRjaFR5cGUgZ2V0VmFsdWUoKTsKKwkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgSm9pbkZldGNoIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0VmFsdWUoSm9pbkZldGNoVHlwZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgSm9pbkZldGNoIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZjQ5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VsaW5rIGFubm90YXRpb24KKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk11dGFibGUKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24KKwlleHRlbmRzIEFubm90YXRpb24KK3sKKwlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuTVVUQUJMRTsKKwkJCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgTXV0YWJsZSBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJQm9vbGVhbiBnZXRWYWx1ZSgpOworCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgTXV0YWJsZSBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBNdXRhYmxlIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwNDY5MAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogQ29tbW9uIHByb3RvY29sIGFtb25nOgorICogICAgIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnRlcgorICogICAgIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlN0cnVjdENvbnZlcnRlcgorICogICAgIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlR5cGVDb252ZXJ0ZXIKKyAqICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5PYmplY3RUeXBlQ29udmVydGVyCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgoreworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgKkNvbnZlcnRlciBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJU3RyaW5nIGdldE5hbWUoKTsKKwkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlICpDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ25hbWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDdXN0b21Db252ZXJ0ZXIgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODJkNGRjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbgorCWV4dGVuZHMgQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KK3sKKwlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSOworCQorCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29udmVyc2lvblZhbHVlcycgZWxlbWVudCBvZiB0aGUgT2JqZWN0VHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBhbiBlbXB0eSBpdGVyYXRvciBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IGNvbnZlcnNpb25WYWx1ZXMoKTsKKwkJU3RyaW5nIENPTlZFUlNJT05fVkFMVUVTX0xJU1QgPSAiY29udmVyc2lvblZhbHVlcyI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnNpb25WYWx1ZXMnIGVsZW1lbnQgb2YgdGhlIE9iamVjdFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KKwkgKi8KKwlpbnQgY29udmVyc2lvblZhbHVlc1NpemUoKTsKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnNpb25WYWx1ZXMnIGVsZW1lbnQgb2YgdGhlIE9iamVjdFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KKwkgKi8KKwlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY29udmVyc2lvblZhbHVlQXQoaW50IGluZGV4KTsKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnNpb25WYWx1ZXMnIGVsZW1lbnQgb2YgdGhlIE9iamVjdFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KKwkgKi8KKwlpbnQgaW5kZXhPZkNvbnZlcnNpb25WYWx1ZShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY29udmVyc2lvblZhbHVlKTsKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnNpb25WYWx1ZXMnIGVsZW1lbnQgb2YgdGhlIE9iamVjdFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KKwkgKi8KKwlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gYWRkQ29udmVyc2lvblZhbHVlKGludCBpbmRleCk7CisJCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCisJICovCisJdm9pZCBtb3ZlQ29udmVyc2lvblZhbHVlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKKwkKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnNpb25WYWx1ZXMnIGVsZW1lbnQgb2YgdGhlIE9iamVjdFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KKwkgKi8KKwl2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpOworCQorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdkZWZhdWx0T2JqZWN0VmFsdWUnIGVsZW1lbnQgb2YgdGhlIE9iamVjdFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCVN0cmluZyBnZXREZWZhdWx0T2JqZWN0VmFsdWUoKTsKKwkJU3RyaW5nIERFRkFVTFRfT0JKRUNUX1ZBTFVFX1BST1BFUlRZID0gImRlZmF1bHRPYmplY3RWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGVmYXVsdE9iamVjdFZhbHVlJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgorCSAqLworCXZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2RlZmF1bHRPYmplY3RWYWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE9iamVjdFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0RGVmYXVsdE9iamVjdFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDM3YzYwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Qcml2YXRlT3duZWQKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgorewkKKwlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRDsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzJmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZE9ubHkKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCit7CQorCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5SRUFEX09OTFk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNTM2MWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlJlYWRUcmFuc2Zvcm1lcgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uCisJZXh0ZW5kcyBFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbgoreworCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVmZjMzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuU3RydWN0Q29udmVydGVyCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24KKwlleHRlbmRzIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCit7CisJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVI7CisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnRlcicgZWxlbWVudCBvZiB0aGUgU3RydWN0Q29udmVydGVyIGFubm90YXRpb24uCisJICogUmV0dXJucyBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCisJICovCisJU3RyaW5nIGdldENvbnZlcnRlcigpOworCQlTdHJpbmcgQ09OVkVSVEVSX1BST1BFUlRZID0gImNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29udmVydGVyJyBlbGVtZW50IG9mIHRoZSBTdHJ1Y3RDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlcik7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2NvbnZlcnRlcicgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFN0cnVjdENvbnZlcnRlciBhbm5vdGF0aW9uLgorCSAqLworCVRleHRSYW5nZSBnZXRDb252ZXJ0ZXJUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MGVkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlRpbWVPZkRheQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uCisJZXh0ZW5kcyBBbm5vdGF0aW9uCit7CisJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZOworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdob3VyJyBlbGVtZW50IG9mIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbi4KKwkgKi8KKwlJbnRlZ2VyIGdldEhvdXIoKTsKKwkJU3RyaW5nIEhPVVJfUFJPUEVSVFkgPSAiaG91ciI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaG91cicgZWxlbWVudCBvZiB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCisJICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50IGZyb20gdGhlIGFubm90YXRpb24KKwkgKi8KKwl2b2lkIHNldEhvdXIoSW50ZWdlciBob3VyKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnaG91cicgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgorCSAqLworCVRleHRSYW5nZSBnZXRIb3VyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdtaW51dGUnIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uLgorCSAqLworCUludGVnZXIgZ2V0TWludXRlKCk7CisJCVN0cmluZyBNSU5VVEVfUFJPUEVSVFkgPSAibWludXRlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdtaW51dGUnIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBhbm5vdGF0aW9uCisJICovCisJdm9pZCBzZXRNaW51dGUoSW50ZWdlciBtaW51dGUpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdtaW51dGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0TWludXRlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdzZWNvbmQnIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgorCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uLgorCSAqLworCUludGVnZXIgZ2V0U2Vjb25kKCk7CisJCVN0cmluZyBTRUNPTkRfUFJPUEVSVFkgPSAic2Vjb25kIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdzZWNvbmQnIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBhbm5vdGF0aW9uCisJICovCisJdm9pZCBzZXRTZWNvbmQoSW50ZWdlciBzZWNvbmQpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdzZWNvbmQnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0U2Vjb25kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdtaWxsaXNlY29uZCcgZWxlbWVudCBvZiB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24uCisJICovCisJSW50ZWdlciBnZXRNaWxsaXNlY29uZCgpOworCQlTdHJpbmcgTUlMTElTRUNPTkRfUFJPUEVSVFkgPSAibWlsbGlzZWNvbmQiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ21pbGxpc2Vjb25kJyBlbGVtZW50IG9mIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQgZnJvbSB0aGUgYW5ub3RhdGlvbgorCSAqLworCXZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBtaWxsaXNlY29uZCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ21pbGxpc2Vjb25kJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldE1pbGxpc2Vjb25kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBlNDA0MAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlRyYW5zZm9ybWF0aW9uCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgoreworCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTjsKKworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZmV0Y2gnIGVsZW1lbnQgb2YgdGhlIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlGZXRjaFR5cGUgZ2V0RmV0Y2goKTsKKwkJU3RyaW5nIEZFVENIX1BST1BFUlRZID0gImZldGNoIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdmZXRjaCcgZWxlbWVudCBvZiB0aGUgVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdmZXRjaCcgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdvcHRpb25hbCcgZWxlbWVudCBvZiB0aGUgVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUJvb2xlYW4gZ2V0T3B0aW9uYWwoKTsKKwkJU3RyaW5nIE9QVElPTkFMX1BST1BFUlRZID0gIm9wdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdvcHRpb25hbCcgZWxlbWVudCBvZiB0aGUgVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbi4KKwkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCisJICovCisJdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnb3B0aW9uYWwnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAorCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uLgorCSAqLworCVRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMmM5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIENvbW1vbiBwcm90b2NvbCBhbW9uZzoKKyAqICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkVHJhbnNmb3JtZXIKKyAqICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Xcml0ZVRyYW5zZm9ybWVyCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgoreworCS8qKgorCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndHJhbnNmb3JtZXJDbGFzcycgZWxlbWVudCBvZiB0aGUgKlRyYW5zZm9ybWVyIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKiBSZXR1cm4gdGhlIHBvcnRpb24gb2YgdGhlIHZhbHVlIHByZWNlZGluZyAiLmNsYXNzIi4KKwkgKiA8cHJlPgorCSAqICAgICAmIzY0O1JlYWRUcmFuc2Zvcm1lcih0cmFuc2Zvcm1lckNsYXNzPUVtcGxveWVlLmNsYXNzKQorCSAqIDwvcHJlPgorCSAqIHdpbGwgcmV0dXJuICJFbXBsb3llZSIuCisJICovCisJU3RyaW5nIGdldFRyYW5zZm9ybWVyQ2xhc3MoKTsKKwkJU3RyaW5nIFRSQU5TRk9STUVSX0NMQVNTX1BST1BFUlRZID0gInRyYW5zZm9ybWVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3RyYW5zZm9ybWVyQ2xhc3MnIGVsZW1lbnQgb2YgdGhlICpUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldFRyYW5zZm9ybWVyQ2xhc3MoU3RyaW5nIHRyYW5zZm9ybWVyQ2xhc3MpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd0cmFuc2Zvcm1lckNsYXNzJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKlRyYW5zZm9ybWVyIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldFRyYW5zZm9ybWVyQ2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOworCisKKwkvKioKKwkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ21ldGhvZCcgZWxlbWVudCBvZiB0aGUgKlRyYW5zZm9ybWVyIGFubm90YXRpb24uCisJICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KKwkgKi8KKwlTdHJpbmcgZ2V0TWV0aG9kKCk7CisJCVN0cmluZyBNRVRIT0RfUFJPUEVSVFkgPSAibWV0aG9kIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdtZXRob2QnIGVsZW1lbnQgb2YgdGhlICpUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgorCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KKwkgKi8KKwl2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbWV0aG9kJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKlRyYW5zZm9ybWVyIGFubm90YXRpb24uCisJICovCisJVGV4dFJhbmdlIGdldE1ldGhvZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMjhjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHlwZUNvbnZlcnRlcgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgorCWV4dGVuZHMgQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24KK3sKKwlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVI7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmNDU2MwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgorICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVmFyaWFibGVPbmVUb09uZQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4yCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbgorCWV4dGVuZHMgQW5ub3RhdGlvbgoreworCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5WQVJJQUJMRV9PTkVfVE9fT05FOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMGUyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VsaW5rIGFubm90YXRpb24KKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLldyaXRlVHJhbnNmb3JtZXIKKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24KKwlleHRlbmRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCit7CisJU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSOworCisJLyoqCisJICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb2x1bW4nIGVsZW1lbnQgb2YgdGhlIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGlvbi4KKwkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgorCSAqLworCUNvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uKCk7CisJCVN0cmluZyBDT0xVTU5fUFJPUEVSVFkgPSAiY29sdW1uIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmV0dXJuIGEgQ29sdW1uQW5ub3RhdGlvbiwgYnV0IGRvIG5vdCByZXR1cm4gbnVsbCBpZiB0aGUgJ2NvbHVtbicKKwkgKiBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9uIHRoZSBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRpb24uIEluc3RlYWQKKwkgKiByZXR1cm4gYSBudWxsIG9iamVjdC4KKwkgKi8KKwlDb2x1bW5Bbm5vdGF0aW9uIGdldE5vbk51bGxDb2x1bW4oKTsKKworCS8qKgorCSAqIEFkZCB0aGUgJ2NvbHVtbicgZWxlbWVudCB0byB0aGUgV3JpdGVUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgorCSAqLworCUNvbHVtbkFubm90YXRpb24gYWRkQ29sdW1uKCk7CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlICdjb2x1bW4nIGVsZW1lbnQgZnJvbSB0aGUgV3JpdGVUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgorCSAqLworCXZvaWQgcmVtb3ZlQ29sdW1uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2NvbHVtbicgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCisJICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGlvbi4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0Q29sdW1uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRXhpc3RlbmNlVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRXhpc3RlbmNlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYjA2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FeGlzdGVuY2VUeXBlLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBlbnVtCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5FeGlzdGVuY2VUeXBlCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGVudW0gRXhpc3RlbmNlVHlwZSB7CisKKyAgICBDSEVDS19DQUNIRShFY2xpcHNlTGluay5FWElTVEVOQ0VfVFlQRV9fQ0hFQ0tfQ0FDSEUpLAorICAgIENIRUNLX0RBVEFCQVNFKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9UWVBFX19DSEVDS19EQVRBQkFTRSksCisgICAgQVNTVU1FX0VYSVNURU5DRShFY2xpcHNlTGluay5FWElTVEVOQ0VfVFlQRV9fQVNTVU1FX0VYSVNURU5DRSksCisgICAgQVNTVU1FX05PTl9FWElTVEVOQ0UoRWNsaXBzZUxpbmsuRVhJU1RFTkNFX1RZUEVfX0FTU1VNRV9OT05fRVhJU1RFTkNFKTsKKworCisJcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKKworCUV4aXN0ZW5jZVR5cGUoU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKKwkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWU7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgRXhpc3RlbmNlVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgeworCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOworCX0KKworCXByaXZhdGUgc3RhdGljIEV4aXN0ZW5jZVR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCWZvciAoRXhpc3RlbmNlVHlwZSBleGlzdGVuY2VUeXBlIDogRXhpc3RlbmNlVHlwZS52YWx1ZXMoKSkgeworCQkJaWYgKGV4aXN0ZW5jZVR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpLmVxdWFscyhqYXZhQW5ub3RhdGlvblZhbHVlKSkgeworCQkJCXJldHVybiBleGlzdGVuY2VUeXBlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShFeGlzdGVuY2VUeXBlIGV4aXN0ZW5jZVR5cGUpIHsKKwkJcmV0dXJuIChleGlzdGVuY2VUeXBlID09IG51bGwpID8gbnVsbCA6IGV4aXN0ZW5jZVR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvSm9pbkZldGNoVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvSm9pbkZldGNoVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MDI3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luRmV0Y2hUeXBlLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBlbnVtCisgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Kb2luRmV0Y2hUeXBlCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGVudW0gSm9pbkZldGNoVHlwZSB7CisKKyAgICBJTk5FUihFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEVfX0lOTkVSKSwKKyAgICBPVVRFUihFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEVfX09VVEVSKTsKKworCisJcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKKworCUpvaW5GZXRjaFR5cGUoU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKKwkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWU7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgSm9pbkZldGNoVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgeworCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOworCX0KKworCXByaXZhdGUgc3RhdGljIEpvaW5GZXRjaFR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7CisJCWZvciAoSm9pbkZldGNoVHlwZSBqb2luRmV0Y2hUeXBlIDogSm9pbkZldGNoVHlwZS52YWx1ZXMoKSkgeworCQkJaWYgKGpvaW5GZXRjaFR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpLmVxdWFscyhqYXZhQW5ub3RhdGlvblZhbHVlKSkgeworCQkJCXJldHVybiBqb2luRmV0Y2hUeXBlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShKb2luRmV0Y2hUeXBlIGpvaW5GZXRjaFR5cGUpIHsKKwkJcmV0dXJuIChqb2luRmV0Y2hUeXBlID09IG51bGwpID8gbnVsbCA6IGpvaW5GZXRjaFR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlODk3MwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KKyAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnNpb25WYWx1ZQorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbgorCWV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLCBOZXN0YWJsZUFubm90YXRpb24KK3sKKwkvLyBjb21iaW5lIHR3byBpbnRlcmZhY2VzCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0F0dHJpYnV0ZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vQXR0cmlidXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTM1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0F0dHJpYnV0ZXMuamF2YQpAQCAtMCwwICsxLDM5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+Jy4KKyAqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRCYXNpY0NvbGxlY3Rpb25zIDxlbT5CYXNpYyBDb2xsZWN0aW9uczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0QmFzaWNNYXBzIDxlbT5CYXNpYyBNYXBzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRUcmFuc2Zvcm1hdGlvbnMgPGVtPlRyYW5zZm9ybWF0aW9uczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0VmFyaWFibGVPbmVUb09uZXMgPGVtPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXMoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQXR0cmlidXRlcyBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzCit7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzaWNDb2xsZWN0aW9ucygpIDxlbT5CYXNpYyBDb2xsZWN0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCYXNpY0NvbGxlY3Rpb25zKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sQmFzaWNDb2xsZWN0aW9uPiBiYXNpY0NvbGxlY3Rpb25zOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzaWNNYXBzKCkgPGVtPkJhc2ljIE1hcHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QmFzaWNNYXBzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sQmFzaWNNYXA+IGJhc2ljTWFwczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zZm9ybWF0aW9ucygpIDxlbT5UcmFuc2Zvcm1hdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHJhbnNmb3JtYXRpb25zKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sVHJhbnNmb3JtYXRpb24+IHRyYW5zZm9ybWF0aW9uczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmxlT25lVG9PbmVzKCkgPGVtPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhcmlhYmxlT25lVG9PbmVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sVmFyaWFibGVPbmVUb09uZT4gdmFyaWFibGVPbmVUb09uZXM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQXR0cmlidXRlcygpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuQVRUUklCVVRFUzsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNpYyBDb2xsZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb259LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzaWMgQ29sbGVjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNpYyBDb2xsZWN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19CYXNpY0NvbGxlY3Rpb25zKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxCYXNpY0NvbGxlY3Rpb24+IGdldEJhc2ljQ29sbGVjdGlvbnMoKQorCXsKKwkJaWYgKGJhc2ljQ29sbGVjdGlvbnMgPT0gbnVsbCkKKwkJeworCQkJYmFzaWNDb2xsZWN0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxCYXNpY0NvbGxlY3Rpb24+KFhtbEJhc2ljQ29sbGVjdGlvbi5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDX0NPTExFQ1RJT05TKTsKKwkJfQorCQlyZXR1cm4gYmFzaWNDb2xsZWN0aW9uczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNpYyBNYXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2ljIE1hcHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNpYyBNYXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzX0Jhc2ljTWFwcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sQmFzaWNNYXA+IGdldEJhc2ljTWFwcygpCisJeworCQlpZiAoYmFzaWNNYXBzID09IG51bGwpCisJCXsKKwkJCWJhc2ljTWFwcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxCYXNpY01hcD4oWG1sQmFzaWNNYXAuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19NQVBTKTsKKwkJfQorCQlyZXR1cm4gYmFzaWNNYXBzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRyYW5zZm9ybWF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UcmFuc2Zvcm1hdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2Zvcm1hdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXNfVHJhbnNmb3JtYXRpb25zKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxUcmFuc2Zvcm1hdGlvbj4gZ2V0VHJhbnNmb3JtYXRpb25zKCkKKwl7CisJCWlmICh0cmFuc2Zvcm1hdGlvbnMgPT0gbnVsbCkKKwkJeworCQkJdHJhbnNmb3JtYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFRyYW5zZm9ybWF0aW9uPihYbWxUcmFuc2Zvcm1hdGlvbi5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TRk9STUFUSU9OUyk7CisJCX0KKwkJcmV0dXJuIHRyYW5zZm9ybWF0aW9uczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJsZSBPbmUgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFibGUgT25lIFRvIE9uZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXNfVmFyaWFibGVPbmVUb09uZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFZhcmlhYmxlT25lVG9PbmU+IGdldFZhcmlhYmxlT25lVG9PbmVzKCkKKwl7CisJCWlmICh2YXJpYWJsZU9uZVRvT25lcyA9PSBudWxsKQorCQl7CisJCQl2YXJpYWJsZU9uZVRvT25lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxWYXJpYWJsZU9uZVRvT25lPihYbWxWYXJpYWJsZU9uZVRvT25lLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVkFSSUFCTEVfT05FX1RPX09ORVMpOworCQl9CisJCXJldHVybiB2YXJpYWJsZU9uZVRvT25lczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDX0NPTExFQ1RJT05TOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QmFzaWNDb2xsZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19NQVBTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QmFzaWNNYXBzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TRk9STUFUSU9OUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFRyYW5zZm9ybWF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WQVJJQUJMRV9PTkVfVE9fT05FUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFZhcmlhYmxlT25lVG9PbmVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19DT0xMRUNUSU9OUzoKKwkJCQlyZXR1cm4gZ2V0QmFzaWNDb2xsZWN0aW9ucygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfTUFQUzoKKwkJCQlyZXR1cm4gZ2V0QmFzaWNNYXBzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19UUkFOU0ZPUk1BVElPTlM6CisJCQkJcmV0dXJuIGdldFRyYW5zZm9ybWF0aW9ucygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVkFSSUFCTEVfT05FX1RPX09ORVM6CisJCQkJcmV0dXJuIGdldFZhcmlhYmxlT25lVG9PbmVzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlM6CisJCQkJZ2V0QmFzaWNDb2xsZWN0aW9ucygpLmNsZWFyKCk7CisJCQkJZ2V0QmFzaWNDb2xsZWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQmFzaWNDb2xsZWN0aW9uPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfTUFQUzoKKwkJCQlnZXRCYXNpY01hcHMoKS5jbGVhcigpOworCQkJCWdldEJhc2ljTWFwcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQmFzaWNNYXA+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19UUkFOU0ZPUk1BVElPTlM6CisJCQkJZ2V0VHJhbnNmb3JtYXRpb25zKCkuY2xlYXIoKTsKKwkJCQlnZXRUcmFuc2Zvcm1hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFRyYW5zZm9ybWF0aW9uPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVkFSSUFCTEVfT05FX1RPX09ORVM6CisJCQkJZ2V0VmFyaWFibGVPbmVUb09uZXMoKS5jbGVhcigpOworCQkJCWdldFZhcmlhYmxlT25lVG9PbmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxWYXJpYWJsZU9uZVRvT25lPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlM6CisJCQkJZ2V0QmFzaWNDb2xsZWN0aW9ucygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfTUFQUzoKKwkJCQlnZXRCYXNpY01hcHMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TRk9STUFUSU9OUzoKKwkJCQlnZXRUcmFuc2Zvcm1hdGlvbnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1ZBUklBQkxFX09ORV9UT19PTkVTOgorCQkJCWdldFZhcmlhYmxlT25lVG9PbmVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlM6CisJCQkJcmV0dXJuIGJhc2ljQ29sbGVjdGlvbnMgIT0gbnVsbCAmJiAhYmFzaWNDb2xsZWN0aW9ucy5pc0VtcHR5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19NQVBTOgorCQkJCXJldHVybiBiYXNpY01hcHMgIT0gbnVsbCAmJiAhYmFzaWNNYXBzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TRk9STUFUSU9OUzoKKwkJCQlyZXR1cm4gdHJhbnNmb3JtYXRpb25zICE9IG51bGwgJiYgIXRyYW5zZm9ybWF0aW9ucy5pc0VtcHR5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WQVJJQUJMRV9PTkVfVE9fT05FUzoKKwkJCQlyZXR1cm4gdmFyaWFibGVPbmVUb09uZXMgIT0gbnVsbCAmJiAhdmFyaWFibGVPbmVUb09uZXMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8WG1sQXR0cmlidXRlTWFwcGluZz4gZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSB7CisJCS8vIGNvbnZlcnQgbGlzdHMgdG8gYXJyYXlzIHRvIGF2b2lkIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gd2hpbGUgYWRkaW5nIHRvIHJlc3VsdCBsaXN0CisJCUFycmF5TGlzdDxYbWxBdHRyaWJ1dGVNYXBwaW5nPiBhdHRyaWJ1dGVNYXBwaW5ncyA9IG5ldyBBcnJheUxpc3Q8WG1sQXR0cmlidXRlTWFwcGluZz4oKTsKKwkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRJZHMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEVtYmVkZGVkSWRzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKKwkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRCYXNpY3MoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEJhc2ljQ29sbGVjdGlvbnMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEJhc2ljTWFwcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7CisJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0VmVyc2lvbnMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldE1hbnlUb09uZXMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldE9uZVRvTWFueXMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldE9uZVRvT25lcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7CisJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0VmFyaWFibGVPbmVUb09uZXMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldE1hbnlUb01hbnlzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKKwkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOworCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEVtYmVkZGVkcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7CisJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0VHJhbnNmb3JtYXRpb25zKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKKwkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRUcmFuc2llbnRzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKKwkJcmV0dXJuIGF0dHJpYnV0ZU1hcHBpbmdzOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgWG1sQXR0cmlidXRlTWFwcGluZ1tdIEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSA9IG5ldyBYbWxBdHRyaWJ1dGVNYXBwaW5nWzBdOworCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKKwkJCWVsZW1lbnROYW1lLCAKKwkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKKwkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlcygpLCAKKwkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gYnVpbGRUcmFuc2xhdG9yKAorCQkJRWNsaXBzZUxpbmsuQVRUUklCVVRFUywgCisJCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUeXBlTWFwcGluZ19BdHRyaWJ1dGVzKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJWG1sSWQuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLklELCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX0lkcygpKSwKKwkJCVhtbEVtYmVkZGVkSWQuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLkVNQkVEREVEX0lELCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX0VtYmVkZGVkSWRzKCkpLAorCQkJWG1sQmFzaWMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLkJBU0lDLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX0Jhc2ljcygpKSwKKwkJCVhtbEJhc2ljQ29sbGVjdGlvbi5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuQkFTSUNfQ09MTEVDVElPTiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX0Jhc2ljQ29sbGVjdGlvbnMoKSksCisJCQlYbWxCYXNpY01hcC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuQkFTSUNfTUFQLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfQmFzaWNNYXBzKCkpLAorCQkJWG1sVmVyc2lvbi5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuVkVSU0lPTiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19WZXJzaW9ucygpKSwKKwkJCVhtbE1hbnlUb09uZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuTUFOWV9UT19PTkUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfTWFueVRvT25lcygpKSwKKwkJCVhtbE9uZVRvTWFueS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuT05FX1RPX01BTlksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfT25lVG9NYW55cygpKSwKKwkJCVhtbE9uZVRvT25lLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5PTkVfVE9fT05FLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX09uZVRvT25lcygpKSwKKwkJCVhtbFZhcmlhYmxlT25lVG9PbmUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlZBUklBQkxFX09ORV9UT19PTkUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19WYXJpYWJsZU9uZVRvT25lcygpKSwKKwkJCVhtbE1hbnlUb01hbnkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk1BTllfVE9fTUFOWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19NYW55VG9NYW55cygpKSwKKwkJCVhtbEVsZW1lbnRDb2xsZWN0aW9uLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVzXzJfMF9FbGVtZW50Q29sbGVjdGlvbnMoKSksCisJCQlYbWxFbWJlZGRlZC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuRU1CRURERUQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfRW1iZWRkZWRzKCkpLAorCQkJWG1sVHJhbnNmb3JtYXRpb24uYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlRSQU5TRk9STUFUSU9OLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfVHJhbnNmb3JtYXRpb25zKCkpLAorCQkJWG1sVHJhbnNpZW50LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5UUkFOU0lFTlQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfVHJhbnNpZW50cygpKSwKKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9DYWNoZUNvb3JkaW5hdGlvblR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzgzZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9DYWNoZUNvb3JkaW5hdGlvblR5cGUuamF2YQpAQCAtMCwwICsxLDI5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiAKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkNhY2hlIENvb3JkaW5hdGlvbiBUeXBlPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKiAKKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldENhY2hlQ29vcmRpbmF0aW9uVHlwZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gQ2FjaGVDb29yZGluYXRpb25UeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNFTkQgT0JKRUNUIENIQU5HRVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU0VORF9PQkpFQ1RfQ0hBTkdFU19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVNFTkRfT0JKRUNUX0NIQU5HRVMoMCwgIlNFTkRfT0JKRUNUX0NIQU5HRVMiLCAiU0VORF9PQkpFQ1RfQ0hBTkdFUyIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+SU5WQUxJREFURSBDSEFOR0VEIE9CSkVDVFM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFNfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUygxLCAiSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiLCAiSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNFTkQgTkVXIE9CSkVDVFMgV0lUSCBDSEFOR0VTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMoMiwgIlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTIiwgIlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PTkVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlOT05FKDMsICJOT05FIiwgIk5PTkUiKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNFTkQgT0JKRUNUIENIQU5HRVM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNFTkQgT0JKRUNUIENIQU5HRVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU0VORF9PQkpFQ1RfQ0hBTkdFUworCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTkRfT0JKRUNUX0NIQU5HRVNfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+SU5WQUxJREFURSBDSEFOR0VEIE9CSkVDVFM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOVkFMSURBVEUgQ0hBTkdFRCBPQkpFQ1RTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFNfVkFMVUUgPSAxOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+U0VORCBORVcgT0JKRUNUUyBXSVRIIENIQU5HRVM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNFTkQgTkVXIE9CSkVDVFMgV0lUSCBDSEFOR0VTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVNfVkFMVUUgPSAyOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOT05FCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORV9WQUxVRSA9IDM7CisKKwkvKioKKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+Q2FjaGUgQ29vcmRpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIENhY2hlQ29vcmRpbmF0aW9uVHlwZVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBDYWNoZUNvb3JkaW5hdGlvblR5cGVbXQorCQl7CisJCQlTRU5EX09CSkVDVF9DSEFOR0VTLAorCQkJSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCisJCQlTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywKKwkJCU5PTkUsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+Q2FjaGUgQ29vcmRpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDYWNoZUNvb3JkaW5hdGlvblR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q2FjaGUgQ29vcmRpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCisJCXsKKwkJCUNhY2hlQ29vcmRpbmF0aW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQorCQkJeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCisJeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKKwkJeworCQkJQ2FjaGVDb29yZGluYXRpb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKKwkJCXsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q2FjaGUgQ29vcmRpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0KGludCB2YWx1ZSkKKwl7CisJCXN3aXRjaCAodmFsdWUpCisJCXsKKwkJCWNhc2UgU0VORF9PQkpFQ1RfQ0hBTkdFU19WQUxVRTogcmV0dXJuIFNFTkRfT0JKRUNUX0NIQU5HRVM7CisJCQljYXNlIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTX1ZBTFVFOiByZXR1cm4gSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFM7CisJCQljYXNlIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTX1ZBTFVFOiByZXR1cm4gU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM7CisJCQljYXNlIE5PTkVfVkFMVUU6IHJldHVybiBOT05FOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBDYWNoZUNvb3JkaW5hdGlvblR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCisJeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpCisJeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCisJeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKKwl7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL0NhY2hlQ29vcmRpbmF0aW9uVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9DYWNoZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vQ2FjaGVUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhkMDU5NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vQ2FjaGVUeXBlLmphdmEKQEAgLTAsMCArMSwzNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKiAKKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldENhY2hlVHlwZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gQ2FjaGVUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkZVTEw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRlVMTF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUZVTEwoMCwgIkZVTEwiLCAiRlVMTCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+V0VBSzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNXRUFLX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJV0VBSygxLCAiV0VBSyIsICJXRUFLIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TT0ZUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NPRlRfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlTT0ZUKDIsICJTT0ZUIiwgIlNPRlQiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNPRlQgV0VBSzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTT0ZUX1dFQUtfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlTT0ZUX1dFQUsoMywgIlNPRlRfV0VBSyIsICJTT0ZUX1dFQUsiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkhBUkQgV0VBSzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNIQVJEX1dFQUtfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlIQVJEX1dFQUsoNCwgIkhBUkRfV0VBSyIsICJIQVJEX1dFQUsiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNBQ0hFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NBQ0hFX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQ0FDSEUoNSwgIkNBQ0hFIiwgIkNBQ0hFIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PTkVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlOT05FKDYsICJOT05FIiwgIk5PTkUiKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkZVTEw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZVTEw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRlVMTAorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTExfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+V0VBSzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+V0VBSzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNXRUFLCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VBS19WQUxVRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TT0ZUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TT0ZUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NPRlQKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0ZUX1ZBTFVFID0gMjsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNPRlQgV0VBSzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U09GVCBXRUFLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NPRlRfV0VBSworCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPRlRfV0VBS19WQUxVRSA9IDM7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5IQVJEIFdFQUs8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkhBUkQgV0VBSzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNIQVJEX1dFQUsKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQVJEX1dFQUtfVkFMVUUgPSA0OworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q0FDSEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNBQ0hFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NBQ0hFCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfVkFMVUUgPSA1OworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOT05FCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORV9WQUxVRSA9IDY7CisKKwkvKioKKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+Q2FjaGUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IENhY2hlVHlwZVtdCisJCXsKKwkJCUZVTEwsCisJCQlXRUFLLAorCQkJU09GVCwKKwkJCVNPRlRfV0VBSywKKwkJCUhBUkRfV0VBSywKKwkJCUNBQ0hFLAorCQkJTk9ORSwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5DYWNoZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Q2FjaGVUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNhY2hlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDYWNoZVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCisJCXsKKwkJCUNhY2hlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQorCQkJeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5DYWNoZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQ2FjaGVUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKKwl7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQorCQl7CisJCQlDYWNoZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQorCQkJeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5DYWNoZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQ2FjaGVUeXBlIGdldChpbnQgdmFsdWUpCisJeworCQlzd2l0Y2ggKHZhbHVlKQorCQl7CisJCQljYXNlIEZVTExfVkFMVUU6IHJldHVybiBGVUxMOworCQkJY2FzZSBXRUFLX1ZBTFVFOiByZXR1cm4gV0VBSzsKKwkJCWNhc2UgU09GVF9WQUxVRTogcmV0dXJuIFNPRlQ7CisJCQljYXNlIFNPRlRfV0VBS19WQUxVRTogcmV0dXJuIFNPRlRfV0VBSzsKKwkJCWNhc2UgSEFSRF9XRUFLX1ZBTFVFOiByZXR1cm4gSEFSRF9XRUFLOworCQkJY2FzZSBDQUNIRV9WQUxVRTogcmV0dXJuIENBQ0hFOworCQkJY2FzZSBOT05FX1ZBTFVFOiByZXR1cm4gTk9ORTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgQ2FjaGVUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQorCXsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQorCXsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCisJeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9DYWNoZVR5cGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmsuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGI5YjE4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FY2xpcHNlTGluay5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uSlBBOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmsKKwlleHRlbmRzIEpQQQoreworCVN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iOworCVN0cmluZyBTQ0hFTUFfTE9DQVRJT04gPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX29ybV8xXzAueHNkIjsKKwlTdHJpbmcgU0NIRU1BX1ZFUlNJT04gPSAiMS4wIjsKKwkKKwkvLyBFY2xpcHNlTGluayBzcGVjaWZpYyBub2RlcworCQorCVN0cmluZyBBQ0NFU1NfTUVUSE9EUyA9ICJhY2Nlc3MtbWV0aG9kcyI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgQUNDRVNTX01FVEhPRFNfX0dFVF9NRVRIT0QgPSAiZ2V0LW1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgQUNDRVNTX01FVEhPRFNfX1NFVF9NRVRIT0QgPSAic2V0LW1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKKwkKKwlTdHJpbmcgQkFTSUNfQ09MTEVDVElPTiA9ICJiYXNpYy1jb2xsZWN0aW9uIjsgIC8vJE5PTi1OTFMtMSQKKwkKKwlTdHJpbmcgQkFTSUNfTUFQID0gImJhc2ljLW1hcCI7ICAvLyROT04tTkxTLTEkCisJCisJU3RyaW5nIENBQ0hFID0gImNhY2hlIjsgIC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgQ0FDSEVfX0VYUElSWSA9ICJleHBpcnkiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBDQUNIRV9fU0laRSA9ICJzaXplIjsgIC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgQ0FDSEVfX1NIQVJFRCA9ICJzaGFyZWQiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBDQUNIRV9fVFlQRSA9ICJ0eXBlIjsgIC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgQ0FDSEVfX0FMV0FZU19SRUZSRVNIID0gImFsd2F5cy1yZWZyZXNoIjsgIC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUiA9ICJyZWZyZXNoLW9ubHktaWYtbmV3ZXIiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBDQUNIRV9fRElTQUJMRV9ISVRTID0gImRpc2FibGUtaGl0cyI7ICAvLyROT04tTkxTLTEkCisJU3RyaW5nIENBQ0hFX19DT09SRElOQVRJT05fVFlQRSA9ICJjb29yZGluYXRpb24tdHlwZSI7ICAvLyROT04tTkxTLTEkCisJCisJU3RyaW5nIENIQU5HRV9UUkFDS0lORyA9ICJjaGFuZ2UtdHJhY2tpbmciOyAgLy8kTk9OLU5MUy0xJAorCQkKKwlTdHJpbmcgQ09OVkVSU0lPTl9WQUxVRSA9ICJjb252ZXJzaW9uLXZhbHVlIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBDT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFID0gImRhdGEtdmFsdWUiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIENPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRSA9ICJvYmplY3QtdmFsdWUiOyAvLyROT04tTkxTLTEkCisKKwlTdHJpbmcgQ09OVkVSVCA9ICJjb252ZXJ0IjsgLy8kTk9OLU5MUy0xJAorCQorCVN0cmluZyBDT05WRVJURVIgPSAiY29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBDT05WRVJURVJfX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBDT05WRVJURVJfX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwlTdHJpbmcgQ09QWV9QT0xJQ1kgPSAiY29weS1wb2xpY3kiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBDT1BZX1BPTElDWV9fQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCisJCisJU3RyaW5nIENMT05FX0NPUFlfUE9MSUNZID0gImNsb25lLWNvcHktcG9saWN5IjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgQ0xPTkVfQ09QWV9QT0xJQ1lfX01FVEhPRCA9ICJtZXRob2QiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBDTE9ORV9DT1BZX1BPTElDWV9fV09SS0lOR19DT1BZX01FVEhPRCA9ICJ3b3JraW5nLWNvcHktbWV0aG9kIjsgLy8kTk9OLU5MUy0xJAorCQorCVN0cmluZyBDVVNUT01JWkVSID0gImN1c3RvbWl6ZXIiOyAgLy8kTk9OLU5MUy0xJAorCisJU3RyaW5nIEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyA9ICJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiOyAgLy8kTk9OLU5MUy0xJAorCisJU3RyaW5nIEVYSVNURU5DRV9DSEVDS0lORyA9ICJleGlzdGVuY2UtY2hlY2tpbmciOyAgLy8kTk9OLU5MUy0xJAorCQorCVN0cmluZyBFWFBJUllfVElNRV9PRl9EQVkgPSAiZXhwaXJ5LXRpbWUtb2YtZGF5IjsgIC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgRVhQSVJZX1RJTUVfT0ZfREFZX19IT1VSID0gImhvdXIiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBFWFBJUllfVElNRV9PRl9EQVlfX01JTlVURSA9ICJtaW51dGUiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBFWFBJUllfVElNRV9PRl9EQVlfX1NFQ09ORCA9ICJzZWNvbmQiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBFWFBJUllfVElNRV9PRl9EQVlfX01JTExJU0VDT05EID0gIm1pbGxpc2Vjb25kIjsgIC8vJE5PTi1OTFMtMSQKKwkKKwlTdHJpbmcgSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSA9ICJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IjsgLy8kTk9OLU5MUy0xJAorCisJU3RyaW5nIEpPSU5fRkVUQ0ggPSAiam9pbi1mZXRjaCI7ICAvLyROT04tTkxTLTEkCisJCisJU3RyaW5nIE1VVEFCTEUgPSAibXV0YWJsZSI7ICAvLyROT04tTkxTLTEkCisJCisJU3RyaW5nIE5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUlkgPSAibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIE5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIE5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlQgPSAiaGludCI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIE5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9DTEFTUyA9ICJyZXN1bHQtY2xhc3MiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBOQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkcgPSAicmVzdWx0LXNldC1tYXBwaW5nIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUFJPQ0VEVVJFX05BTUUgPSAicHJvY2VkdXJlLW5hbWUiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBOQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVRVUk5TX1JFU1VMVF9TRVQgPSAicmV0dXJucy1yZXN1bHQtc2V0IjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBOQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QQVJBTUVURVIgPSAicGFyYW1ldGVyIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgUEFSQU1FVEVSX19ESVJFQ1RJT04gPSAiZGlyZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgUEFSQU1FVEVSX19OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBQQVJBTUVURVJfX1FVRVJZX1BBUkFNRVRFUiA9ICJxdWVyeS1wYXJhbWV0ZXIiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBQQVJBTUVURVJfX1RZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIFBBUkFNRVRFUl9fSkRCQ19UWVBFID0gImpkYmMtdHlwZSI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIFBBUkFNRVRFUl9fSkRCQ19UWVBFX05BTUUgPSAiamRiYy10eXBlLW5hbWUiOyAvLyROT04tTkxTLTEkCisJCQorCisJU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUiA9ICJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBPQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSA9ICJkYXRhLXR5cGUiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUgPSAib2JqZWN0LXR5cGUiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUUgPSAiZGVmYXVsdC1vYmplY3QtdmFsdWUiOyAvLyROT04tTkxTLTEkCisKKwlTdHJpbmcgT1BUSU1JU1RJQ19MT0NLSU5HID0gIm9wdGltaXN0aWMtbG9ja2luZyI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIE9QVElNSVNUSUNfTE9DS0lOR19fU0VMRUNURURfQ09MVU1OID0gInNlbGVjdGVkLWNvbHVtbiI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIE9QVElNSVNUSUNfTE9DS0lOR19fVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgT1BUSU1JU1RJQ19MT0NLSU5HX19DQVNDQURFID0gImNhc2NhZGUiOyAvLyROT04tTkxTLTEkCisKKwlTdHJpbmcgUFJJVkFURV9PV05FRCA9ICJwcml2YXRlLW93bmVkIjsgIC8vJE5PTi1OTFMtMSQKKwkKKwlTdHJpbmcgUFJPUEVSVFkgPSAicHJvcGVydHkiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIFBST1BFUlRZX19OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIFBST1BFUlRZX19WQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgUFJPUEVSVFlfX1ZBTFVFX1RZUEUgPSAidmFsdWUtdHlwZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwlTdHJpbmcgUkVBRF9PTkxZID0gInJlYWQtb25seSI7ICAvLyROT04tTkxTLTEkCisJCisJCisJU3RyaW5nIFNUUlVDVF9DT05WRVJURVIgPSAic3RydWN0LWNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgU1RSVUNUX0NPTlZFUlRFUl9fTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBTVFJVQ1RfQ09OVkVSVEVSX19DT05WRVJURVIgPSAiY29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAorCQorCVN0cmluZyBUUkFOU0ZPUk1BVElPTiA9ICJ0cmFuc2Zvcm1hdGlvbiI7ICAvLyROT04tTkxTLTEkCisKKwlTdHJpbmcgVFlQRSA9ICJ0eXBlIjsgIC8vJE5PTi1OTFMtMSQKKwkKKwlTdHJpbmcgVFlQRV9DT05WRVJURVIgPSAidHlwZS1jb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIFRZUEVfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIFRZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUgPSAiZGF0YS10eXBlIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBUWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUgPSAib2JqZWN0LXR5cGUiOyAvLyROT04tTkxTLTEkCisJCQorCVN0cmluZyBWQVJJQUJMRV9PTkVfVE9fT05FID0gInZhcmlhYmxlLW9uZS10by1vbmUiOyAgLy8kTk9OLU5MUy0xJAorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxMTU2NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmphdmEKQEAgLTAsMCArMSw4MTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeUltcGwKK3sKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybUZhY3RvcnkgZUlOU1RBTkNFID0gaW5pdCgpOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1GYWN0b3J5IGluaXQoKQorCXsKKwkJdHJ5CisJCXsKKwkJCUVjbGlwc2VMaW5rT3JtRmFjdG9yeSB0aGVFY2xpcHNlTGlua09ybUZhY3RvcnkgPSAoRWNsaXBzZUxpbmtPcm1GYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqcHQuZWNsaXBzZWxpbmsub3JtLnhtaSIpOyAKKwkJCWlmICh0aGVFY2xpcHNlTGlua09ybUZhY3RvcnkgIT0gbnVsbCkKKwkJCXsKKwkJCQlyZXR1cm4gdGhlRWNsaXBzZUxpbmtPcm1GYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQorCQl7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtRmFjdG9yeSgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVjbGlwc2VMaW5rT3JtRmFjdG9yeSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKQorCXsKKwkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEFjY2Vzc01ldGhvZHMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVM6IHJldHVybiAoRU9iamVjdCljcmVhdGVBdHRyaWJ1dGVzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUM6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxCYXNpYygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxCYXNpY0NvbGxlY3Rpb24oKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVA6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxCYXNpY01hcCgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQ2FjaGUoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQ2xvbmVDb3B5UG9saWN5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbENvbnZlcnNpb25WYWx1ZSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbENvbnZlcnRlcigpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQ29weVBvbGljeSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NVU1RPTUlaRVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxDdXN0b21pemVyKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRWxlbWVudENvbGxlY3Rpb24oKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRW1iZWRkYWJsZSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRW1iZWRkZWQoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEVtYmVkZGVkSWQoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbnRpdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1M6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sSWQoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxNYW55VG9NYW55KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxNYW55VG9PbmUoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9DT05WRVJURVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxOYW1lZENvbnZlcnRlcigpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sT25lVG9NYW55KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE9uZVRvT25lKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sT3B0aW1pc3RpY0xvY2tpbmcoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU46IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxPcmRlckNvbHVtbigpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUHJpbWFyeUtleSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUHJvcGVydHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVF9DT05WRVJURVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFRpbWVPZkRheSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sVHJhbnNmb3JtYXRpb24oKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxUcmFuc2llbnQoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sVmFyaWFibGVPbmVUb09uZSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxWZXJzaW9uKCk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5DQUNIRV9DT09SRElOQVRJT05fVFlQRToKKwkJCQlyZXR1cm4gY3JlYXRlQ2FjaGVDb29yZGluYXRpb25UeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5DQUNIRV9UWVBFOgorCQkJCXJldHVybiBjcmVhdGVDYWNoZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfVFlQRToKKwkJCQlyZXR1cm4gY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmdUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRElSRUNUSU9OOgorCQkJCXJldHVybiBjcmVhdGVYbWxEaXJlY3Rpb25Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkVYSVNURU5DRV9UWVBFOgorCQkJCXJldHVybiBjcmVhdGVFeGlzdGVuY2VUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9UWVBFOgorCQkJCXJldHVybiBjcmVhdGVYbWxKb2luRmV0Y2hUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX1RZUEU6CisJCQkJcmV0dXJuIGNyZWF0ZVhtbE9wdGltaXN0aWNMb2NraW5nVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCisJeworCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEU6CisJCQkJcmV0dXJuIGNvbnZlcnRDYWNoZUNvb3JkaW5hdGlvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQ0FDSEVfVFlQRToKKwkJCQlyZXR1cm4gY29udmVydENhY2hlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX1RZUEU6CisJCQkJcmV0dXJuIGNvbnZlcnRYbWxDaGFuZ2VUcmFja2luZ1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0RJUkVDVElPTjoKKwkJCQlyZXR1cm4gY29udmVydFhtbERpcmVjdGlvblRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5FWElTVEVOQ0VfVFlQRToKKwkJCQlyZXR1cm4gY29udmVydEV4aXN0ZW5jZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfVFlQRToKKwkJCQlyZXR1cm4gY29udmVydFhtbEpvaW5GZXRjaFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19UWVBFOgorCQkJCXJldHVybiBjb252ZXJ0WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGNyZWF0ZVhtbEFjY2Vzc01ldGhvZHMoKQorCXsKKwkJWG1sQWNjZXNzTWV0aG9kcyB4bWxBY2Nlc3NNZXRob2RzID0gbmV3IFhtbEFjY2Vzc01ldGhvZHMoKTsKKwkJcmV0dXJuIHhtbEFjY2Vzc01ldGhvZHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEF0dHJpYnV0ZXMgY3JlYXRlQXR0cmlidXRlcygpCisJeworCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlcygpOworCQlyZXR1cm4gYXR0cmlidXRlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQmFzaWMgY3JlYXRlWG1sQmFzaWMoKQorCXsKKwkJWG1sQmFzaWMgeG1sQmFzaWMgPSBuZXcgWG1sQmFzaWMoKTsKKwkJcmV0dXJuIHhtbEJhc2ljOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxCYXNpY0NvbGxlY3Rpb24gY3JlYXRlWG1sQmFzaWNDb2xsZWN0aW9uKCkKKwl7CisJCVhtbEJhc2ljQ29sbGVjdGlvbiB4bWxCYXNpY0NvbGxlY3Rpb24gPSBuZXcgWG1sQmFzaWNDb2xsZWN0aW9uKCk7CisJCXJldHVybiB4bWxCYXNpY0NvbGxlY3Rpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbEJhc2ljTWFwIGNyZWF0ZVhtbEJhc2ljTWFwKCkKKwl7CisJCVhtbEJhc2ljTWFwIHhtbEJhc2ljTWFwID0gbmV3IFhtbEJhc2ljTWFwKCk7CisJCXJldHVybiB4bWxCYXNpY01hcDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQ2FjaGUgY3JlYXRlWG1sQ2FjaGUoKQorCXsKKwkJWG1sQ2FjaGUgeG1sQ2FjaGUgPSBuZXcgWG1sQ2FjaGUoKTsKKwkJcmV0dXJuIHhtbENhY2hlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDaGFuZ2VUcmFja2luZyBjcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpCisJeworCQlYbWxDaGFuZ2VUcmFja2luZyB4bWxDaGFuZ2VUcmFja2luZyA9IG5ldyBYbWxDaGFuZ2VUcmFja2luZygpOworCQlyZXR1cm4geG1sQ2hhbmdlVHJhY2tpbmc7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbENsb25lQ29weVBvbGljeSBjcmVhdGVYbWxDbG9uZUNvcHlQb2xpY3koKQorCXsKKwkJWG1sQ2xvbmVDb3B5UG9saWN5IHhtbENsb25lQ29weVBvbGljeSA9IG5ldyBYbWxDbG9uZUNvcHlQb2xpY3koKTsKKwkJcmV0dXJuIHhtbENsb25lQ29weVBvbGljeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQ29udmVyc2lvblZhbHVlIGNyZWF0ZVhtbENvbnZlcnNpb25WYWx1ZSgpCisJeworCQlYbWxDb252ZXJzaW9uVmFsdWUgeG1sQ29udmVyc2lvblZhbHVlID0gbmV3IFhtbENvbnZlcnNpb25WYWx1ZSgpOworCQlyZXR1cm4geG1sQ29udmVyc2lvblZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDb252ZXJ0ZXIgY3JlYXRlWG1sQ29udmVydGVyKCkKKwl7CisJCVhtbENvbnZlcnRlciB4bWxDb252ZXJ0ZXIgPSBuZXcgWG1sQ29udmVydGVyKCk7CisJCXJldHVybiB4bWxDb252ZXJ0ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbENvcHlQb2xpY3kgY3JlYXRlWG1sQ29weVBvbGljeSgpCisJeworCQlYbWxDb3B5UG9saWN5IHhtbENvcHlQb2xpY3kgPSBuZXcgWG1sQ29weVBvbGljeSgpOworCQlyZXR1cm4geG1sQ29weVBvbGljeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQ3VzdG9taXplciBjcmVhdGVYbWxDdXN0b21pemVyKCkKKwl7CisJCVhtbEN1c3RvbWl6ZXIgeG1sQ3VzdG9taXplciA9IG5ldyBYbWxDdXN0b21pemVyKCk7CisJCXJldHVybiB4bWxDdXN0b21pemVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxFbGVtZW50Q29sbGVjdGlvbiBjcmVhdGVYbWxFbGVtZW50Q29sbGVjdGlvbigpCisJeworCQlYbWxFbGVtZW50Q29sbGVjdGlvbiB4bWxFbGVtZW50Q29sbGVjdGlvbiA9IG5ldyBYbWxFbGVtZW50Q29sbGVjdGlvbigpOworCQlyZXR1cm4geG1sRWxlbWVudENvbGxlY3Rpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbEVtYmVkZGFibGUgY3JlYXRlWG1sRW1iZWRkYWJsZSgpCisJeworCQlYbWxFbWJlZGRhYmxlIHhtbEVtYmVkZGFibGUgPSBuZXcgWG1sRW1iZWRkYWJsZSgpOworCQlyZXR1cm4geG1sRW1iZWRkYWJsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sRW1iZWRkZWQgY3JlYXRlWG1sRW1iZWRkZWQoKQorCXsKKwkJWG1sRW1iZWRkZWQgeG1sRW1iZWRkZWQgPSBuZXcgWG1sRW1iZWRkZWQoKTsKKwkJcmV0dXJuIHhtbEVtYmVkZGVkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxFbWJlZGRlZElkIGNyZWF0ZVhtbEVtYmVkZGVkSWQoKQorCXsKKwkJWG1sRW1iZWRkZWRJZCB4bWxFbWJlZGRlZElkID0gbmV3IFhtbEVtYmVkZGVkSWQoKTsKKwkJcmV0dXJuIHhtbEVtYmVkZGVkSWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbEVudGl0eSBjcmVhdGVYbWxFbnRpdHkoKQorCXsKKwkJWG1sRW50aXR5IHhtbEVudGl0eSA9IG5ldyBYbWxFbnRpdHkoKTsKKwkJcmV0dXJuIHhtbEVudGl0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sRW50aXR5TWFwcGluZ3MgY3JlYXRlWG1sRW50aXR5TWFwcGluZ3MoKQorCXsKKwkJWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MgPSBuZXcgWG1sRW50aXR5TWFwcGluZ3MoKTsKKwkJcmV0dXJuIHhtbEVudGl0eU1hcHBpbmdzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxJZCBjcmVhdGVYbWxJZCgpCisJeworCQlYbWxJZCB4bWxJZCA9IG5ldyBYbWxJZCgpOworCQlyZXR1cm4geG1sSWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGNyZWF0ZVhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKKwl7CisJCVhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5ID0gbmV3IFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCk7CisJCXJldHVybiB4bWxJbnN0YW50aWF0aW9uQ29weVBvbGljeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sTWFueVRvTWFueSBjcmVhdGVYbWxNYW55VG9NYW55KCkKKwl7CisJCVhtbE1hbnlUb01hbnkgeG1sTWFueVRvTWFueSA9IG5ldyBYbWxNYW55VG9NYW55KCk7CisJCXJldHVybiB4bWxNYW55VG9NYW55OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxNYW55VG9PbmUgY3JlYXRlWG1sTWFueVRvT25lKCkKKwl7CisJCVhtbE1hbnlUb09uZSB4bWxNYW55VG9PbmUgPSBuZXcgWG1sTWFueVRvT25lKCk7CisJCXJldHVybiB4bWxNYW55VG9PbmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbE1hcHBlZFN1cGVyY2xhc3MgY3JlYXRlWG1sTWFwcGVkU3VwZXJjbGFzcygpCisJeworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHhtbE1hcHBlZFN1cGVyY2xhc3MgPSBuZXcgWG1sTWFwcGVkU3VwZXJjbGFzcygpOworCQlyZXR1cm4geG1sTWFwcGVkU3VwZXJjbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sTmFtZWRDb252ZXJ0ZXIgY3JlYXRlWG1sTmFtZWRDb252ZXJ0ZXIoKQorCXsKKwkJWG1sTmFtZWRDb252ZXJ0ZXIgeG1sTmFtZWRDb252ZXJ0ZXIgPSBuZXcgWG1sTmFtZWRDb252ZXJ0ZXIoKTsKKwkJcmV0dXJuIHhtbE5hbWVkQ29udmVydGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGNyZWF0ZVhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQorCXsKKwkJWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSB4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5ID0gbmV3IFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKTsKKwkJcmV0dXJuIHhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCisJeworCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBuZXcgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQlyZXR1cm4geG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sT25lVG9NYW55IGNyZWF0ZVhtbE9uZVRvTWFueSgpCisJeworCQlYbWxPbmVUb01hbnkgeG1sT25lVG9NYW55ID0gbmV3IFhtbE9uZVRvTWFueSgpOworCQlyZXR1cm4geG1sT25lVG9NYW55OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxPbmVUb09uZSBjcmVhdGVYbWxPbmVUb09uZSgpCisJeworCQlYbWxPbmVUb09uZSB4bWxPbmVUb09uZSA9IG5ldyBYbWxPbmVUb09uZSgpOworCQlyZXR1cm4geG1sT25lVG9PbmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbE9wdGltaXN0aWNMb2NraW5nIGNyZWF0ZVhtbE9wdGltaXN0aWNMb2NraW5nKCkKKwl7CisJCVhtbE9wdGltaXN0aWNMb2NraW5nIHhtbE9wdGltaXN0aWNMb2NraW5nID0gbmV3IFhtbE9wdGltaXN0aWNMb2NraW5nKCk7CisJCXJldHVybiB4bWxPcHRpbWlzdGljTG9ja2luZzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sT3JkZXJDb2x1bW4gY3JlYXRlWG1sT3JkZXJDb2x1bW4oKQorCXsKKwkJWG1sT3JkZXJDb2x1bW4geG1sT3JkZXJDb2x1bW4gPSBuZXcgWG1sT3JkZXJDb2x1bW4oKTsKKwkJcmV0dXJuIHhtbE9yZGVyQ29sdW1uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBjcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCisJeworCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IG5ldyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOworCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbFByaW1hcnlLZXkgY3JlYXRlWG1sUHJpbWFyeUtleSgpCisJeworCQlYbWxQcmltYXJ5S2V5IHhtbFByaW1hcnlLZXkgPSBuZXcgWG1sUHJpbWFyeUtleSgpOworCQlyZXR1cm4geG1sUHJpbWFyeUtleTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sUHJvcGVydHkgY3JlYXRlWG1sUHJvcGVydHkoKQorCXsKKwkJWG1sUHJvcGVydHkgeG1sUHJvcGVydHkgPSBuZXcgWG1sUHJvcGVydHkoKTsKKwkJcmV0dXJuIHhtbFByb3BlcnR5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgY3JlYXRlWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCkKKwl7CisJCVhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciB4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgPSBuZXcgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCk7CisJCXJldHVybiB4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbFN0cnVjdENvbnZlcnRlciBjcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKQorCXsKKwkJWG1sU3RydWN0Q29udmVydGVyIHhtbFN0cnVjdENvbnZlcnRlciA9IG5ldyBYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwkJcmV0dXJuIHhtbFN0cnVjdENvbnZlcnRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sVGltZU9mRGF5IGNyZWF0ZVhtbFRpbWVPZkRheSgpCisJeworCQlYbWxUaW1lT2ZEYXkgeG1sVGltZU9mRGF5ID0gbmV3IFhtbFRpbWVPZkRheSgpOworCQlyZXR1cm4geG1sVGltZU9mRGF5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxUcmFuc2Zvcm1hdGlvbiBjcmVhdGVYbWxUcmFuc2Zvcm1hdGlvbigpCisJeworCQlYbWxUcmFuc2Zvcm1hdGlvbiB4bWxUcmFuc2Zvcm1hdGlvbiA9IG5ldyBYbWxUcmFuc2Zvcm1hdGlvbigpOworCQlyZXR1cm4geG1sVHJhbnNmb3JtYXRpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbFRyYW5zaWVudCBjcmVhdGVYbWxUcmFuc2llbnQoKQorCXsKKwkJWG1sVHJhbnNpZW50IHhtbFRyYW5zaWVudCA9IG5ldyBYbWxUcmFuc2llbnQoKTsKKwkJcmV0dXJuIHhtbFRyYW5zaWVudDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBjcmVhdGVYbWxUeXBlQ29udmVydGVyKCkKKwl7CisJCVhtbFR5cGVDb252ZXJ0ZXIgeG1sVHlwZUNvbnZlcnRlciA9IG5ldyBYbWxUeXBlQ29udmVydGVyKCk7CisJCXJldHVybiB4bWxUeXBlQ29udmVydGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxWYXJpYWJsZU9uZVRvT25lIGNyZWF0ZVhtbFZhcmlhYmxlT25lVG9PbmUoKQorCXsKKwkJWG1sVmFyaWFibGVPbmVUb09uZSB4bWxWYXJpYWJsZU9uZVRvT25lID0gbmV3IFhtbFZhcmlhYmxlT25lVG9PbmUoKTsKKwkJcmV0dXJuIHhtbFZhcmlhYmxlT25lVG9PbmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbFZlcnNpb24gY3JlYXRlWG1sVmVyc2lvbigpCisJeworCQlYbWxWZXJzaW9uIHhtbFZlcnNpb24gPSBuZXcgWG1sVmVyc2lvbigpOworCQlyZXR1cm4geG1sVmVyc2lvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNyZWF0ZUNhY2hlQ29vcmRpbmF0aW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKKwl7CisJCUNhY2hlQ29vcmRpbmF0aW9uVHlwZSByZXN1bHQgPSBDYWNoZUNvb3JkaW5hdGlvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydENhY2hlQ29vcmRpbmF0aW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQorCXsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENhY2hlVHlwZSBjcmVhdGVDYWNoZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCisJeworCQlDYWNoZVR5cGUgcmVzdWx0ID0gQ2FjaGVUeXBlLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDYWNoZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKKwl7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDaGFuZ2VUcmFja2luZ1R5cGUgY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmdUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQorCXsKKwkJWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIHJlc3VsdCA9IFhtbENoYW5nZVRyYWNraW5nVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0WG1sQ2hhbmdlVHJhY2tpbmdUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCisJeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sRGlyZWN0aW9uIGNyZWF0ZVhtbERpcmVjdGlvbkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKKwl7CisJCVhtbERpcmVjdGlvbiByZXN1bHQgPSBYbWxEaXJlY3Rpb24uZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFhtbERpcmVjdGlvblRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQorCXsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEV4aXN0ZW5jZVR5cGUgY3JlYXRlRXhpc3RlbmNlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKKwl7CisJCUV4aXN0ZW5jZVR5cGUgcmVzdWx0ID0gRXhpc3RlbmNlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0RXhpc3RlbmNlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQorCXsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbEpvaW5GZXRjaFR5cGUgY3JlYXRlWG1sSm9pbkZldGNoVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKKwl7CisJCVhtbEpvaW5GZXRjaFR5cGUgcmVzdWx0ID0gWG1sSm9pbkZldGNoVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0WG1sSm9pbkZldGNoVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQorCXsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBjcmVhdGVYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCisJeworCQlYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgcmVzdWx0ID0gWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKKwl7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua09ybVBhY2thZ2UgZ2V0RWNsaXBzZUxpbmtPcm1QYWNrYWdlKCkKKwl7CisJCXJldHVybiAoRWNsaXBzZUxpbmtPcm1QYWNrYWdlKWdldEVQYWNrYWdlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlARGVwcmVjYXRlZAorCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1QYWNrYWdlIGdldFBhY2thZ2UoKQorCXsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0U7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybVBhY2thZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0ODFiZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmphdmEKQEAgLTAsMCArMSw4ODM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3RvcnkKKyAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1QYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2VJbXBsCit7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOQU1FID0gIm9ybSI7CisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfVVJJID0gImpwdC5lY2xpcHNlbGluay5vcm0ueG1pIjsKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybSI7CisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEVjbGlwc2VMaW5rT3JtUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmluaXQoKTsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzIDxlbT5YbWwgQWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcworCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTID0gMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2V0IE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9EID0gMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2V0IE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9EID0gMTsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEFjY2VzcyBNZXRob2RzPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTX0ZFQVRVUkVfQ09VTlQgPSAyOworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgPGVtPlhtbCBBY2Nlc3MgTWV0aG9kcyBIb2xkZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlcgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUiA9IDE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUyA9IDA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBY2Nlc3MgTWV0aG9kcyBIb2xkZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX0ZFQVRVUkVfQ09VTlQgPSAxOworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcgPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX01BUFBJTkcgPSAyOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FID0gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTID0gMzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0RFU0NSSVBUSU9OID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19ERVNDUklQVElPTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBDb2xsZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19FTEVNRU5UX0NPTExFQ1RJT05TID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTEVNRU5UX0NPTExFQ1RJT05TOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fSURTID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19JRFM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVtYmVkZGVkIElkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19FTUJFRERFRF9JRFMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEX0lEUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzaWNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0JBU0lDUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19WRVJTSU9OUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fVkVSU0lPTlM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnkgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19NQU5ZX1RPX09ORVMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX01BTllfVE9fT05FUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T25lIFRvIE1hbnlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX09ORV9UT19NQU5ZUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fT05FX1RPX01BTllTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PbmUgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19PTkVfVE9fT05FUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fT05FX1RPX09ORVM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnkgVG8gTWFueXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fTUFOWV9UT19NQU5ZUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fTUFOWV9UT19NQU5ZUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW1iZWRkZWRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0VNQkVEREVEUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fRU1CRURERURTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2llbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX1RSQU5TSUVOVFMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TSUVOVFM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2ljIENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0JBU0lDX0NPTExFQ1RJT05TID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNpYyBNYXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0JBU0lDX01BUFMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zZm9ybWF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19UUkFOU0ZPUk1BVElPTlMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCArIDI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX1ZBUklBQkxFX09ORV9UT19PTkVTID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX0ZFQVRVUkVfQ09VTlQgKyAzOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX0ZFQVRVUkVfQ09VTlQgKyA0OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljIDxlbT5YbWwgQmFzaWM8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUMgPSA0OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19OQU1FID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09MVU1OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fTE9CID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfX0xPQjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEVNUE9SQUw7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX19FTlVNRVJBVEVEOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX19GRVRDSDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fT1BUSU9OQUwgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT1BUSU9OQUw7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk11dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fTVVUQUJMRSA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyAyOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX1RZUEVfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19PQkpFQ1RfVFlQRV9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgNTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDY7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fQ09OVkVSVCA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyA3OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDg7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgOTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGVkIFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX0dFTkVSQVRFRF9WQUxVRSA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyAxMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2ljPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgMTE7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uIDxlbT5YbWwgQmFzaWMgQ29sbGVjdGlvbjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb24KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNDb2xsZWN0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0NPTExFQ1RJT04gPSA1OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1MgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl9fTkFNRSA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0NPTExFQ1RJT05fX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2ljIENvbGxlY3Rpb248L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXAgPGVtPlhtbCBCYXNpYyBNYXA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNNYXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQID0gNjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQX19BQ0NFU1MgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQX19OQU1FID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2ljIE1hcDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19NQVBfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlIDxlbT5YbWwgQ2FjaGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEUgPSA3OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHBpcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fRVhQSVJZID0gMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX19TSVpFID0gMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfX1NIQVJFRCA9IDI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fVFlQRSA9IDM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsd2F5cyBSZWZyZXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfX0FMV0FZU19SRUZSRVNIID0gNDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUiA9IDU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2FibGUgSGl0czwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX19ESVNBQkxFX0hJVFMgPSA2OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db29yZGluYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX19DT09SRElOQVRJT05fVFlQRSA9IDc7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cGlyeSBUaW1lIE9mIERheTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVkgPSA4OworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ2FjaGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfRkVBVFVSRV9DT1VOVCA9IDk7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIgPGVtPlhtbCBDYWNoZSBIb2xkZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVIb2xkZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfSE9MREVSID0gODsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFID0gMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhpc3RlbmNlIENoZWNraW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfSE9MREVSX19FWElTVEVOQ0VfQ0hFQ0tJTkcgPSAxOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ2FjaGUgSG9sZGVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX0hPTERFUl9GRUFUVVJFX0NPVU5UID0gMjsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZyA8ZW0+WG1sIENoYW5nZSBUcmFja2luZzwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZworCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DSEFOR0VfVFJBQ0tJTkcgPSA5OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0hBTkdFX1RSQUNLSU5HX19UWVBFID0gMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENoYW5nZSBUcmFja2luZzwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DSEFOR0VfVFJBQ0tJTkdfRkVBVFVSRV9DT1VOVCA9IDE7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIgPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgSG9sZGVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVIgPSAxMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIFRyYWNraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUl9fQ0hBTkdFX1RSQUNLSU5HID0gMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENoYW5nZSBUcmFja2luZyBIb2xkZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUl9GRUFUVVJFX0NPVU5UID0gMTsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kgPGVtPlhtbCBDbG9uZSBDb3B5IFBvbGljeTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2xvbmVDb3B5UG9saWN5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NMT05FX0NPUFlfUE9MSUNZID0gMTE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NMT05FX0NPUFlfUE9MSUNZX19NRVRIT0QgPSAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JraW5nIENvcHkgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0QgPSAxOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfRkVBVFVSRV9DT1VOVCA9IDI7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlIDxlbT5YbWwgQ29udmVyc2lvbiBWYWx1ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVyc2lvblZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlNJT05fVkFMVUUgPSAxMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUUgPSAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUgPSAxOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29udmVyc2lvbiBWYWx1ZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJTSU9OX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSAyOworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyIDxlbT5YbWwgTmFtZWQgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX0NPTlZFUlRFUiA9IDMzOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FID0gMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE5hbWVkIENvbnZlcnRlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCA9IDE7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyIDxlbT5YbWwgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSID0gMTM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJfX05BTUUgPSBYTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSX19DTEFTU19OQU1FID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvbnZlcnRlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyIDxlbT5YbWwgQ29udmVydGVyIEhvbGRlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUl9IT0xERVIgPSAxNDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSX0hPTERFUl9fQ09OVkVSVEVSID0gMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUiA9IDE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IDI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSID0gMzsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvbnZlcnRlciBIb2xkZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSX0hPTERFUl9GRUFUVVJFX0NPVU5UID0gNDsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyIDxlbT5YbWwgQ29udmVydGVycyBIb2xkZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlcgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUlNfSE9MREVSID0gMTU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTID0gMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTID0gMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMgPSAyOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTID0gMzsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvbnZlcnRlcnMgSG9sZGVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUlNfSE9MREVSX0ZFQVRVUkVfQ09VTlQgPSA0OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyA8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HID0gMTY7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0xPQiA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0xPQjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19URU1QT1JBTCA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX1RFTVBPUkFMOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0VOVU1FUkFURUQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVFlQRV9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19PQkpFQ1RfVFlQRV9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fU1RSVUNUX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJUID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5IDxlbT5YbWwgQ29weSBQb2xpY3k8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb3B5UG9saWN5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPUFlfUE9MSUNZID0gMTc7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09QWV9QT0xJQ1lfX0NMQVNTID0gMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvcHkgUG9saWN5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPUFlfUE9MSUNZX0ZFQVRVUkVfQ09VTlQgPSAxOworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIgPGVtPlhtbCBDdXN0b21pemVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DVVNUT01JWkVSID0gMTg7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NVU1RPTUlaRVJfX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRSA9IDA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDdXN0b21pemVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NVU1RPTUlaRVJfRkVBVFVSRV9DT1VOVCA9IDE7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciA8ZW0+WG1sIEN1c3RvbWl6ZXIgSG9sZGVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXJIb2xkZXIKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DVVNUT01JWkVSX0hPTERFUiA9IDE5OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXN0b21pemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVIgPSAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ3VzdG9taXplciBIb2xkZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ1VTVE9NSVpFUl9IT0xERVJfRkVBVFVSRV9DT1VOVCA9IDE7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24gPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb248L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OID0gMjA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1M7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTE9CID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19MT0I7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19URU1QT1JBTCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEVNUE9SQUw7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0VOVU1FUkFURUQgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0VOVU1FUkFURUQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEFSR0VUX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UQVJHRVRfQ0xBU1M7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fRkVUQ0g7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9CWSA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQlk7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU47CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVkgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVk7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ0xBU1MgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ0xBU1M7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfVEVNUE9SQUw7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9FTlVNRVJBVEVEID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0VOVU1FUkFURUQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTFVNTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfSk9JTl9DT0xVTU5TOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTFVNTiA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MVU1OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9PVkVSUklERVM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FTU09DSUFUSU9OX09WRVJSSURFUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sbGVjdGlvbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MTEVDVElPTl9UQUJMRSA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MTEVDVElPTl9UQUJMRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJUID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDc7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDg7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgOTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDEwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09OVkVSVCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMTE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxMjsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMTM7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSA8ZW0+WG1sIEVtYmVkZGFibGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEUgPSAyMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQ0xBU1NfTkFNRSA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NMQVNTX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fTUVUQURBVEFfQ09NUExFVEUgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19NRVRBREFUQV9DT01QTEVURTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19ERVNDUklQVElPTiA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0RFU0NSSVBUSU9OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQVRUUklCVVRFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FUVFJJQlVURVM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19DVVNUT01JWkVSID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIFRyYWNraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQ0hBTkdFX1RSQUNLSU5HID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19TVFJVQ1RfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyA2OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgNzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyA4OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbG9uZSBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0NMT05FX0NPUFlfUE9MSUNZID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgOTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMTA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDExOworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkIDxlbT5YbWwgRW1iZWRkZWQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERUQgPSAyMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1M7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW1iZWRkZWQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgKyAyOworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQgPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSUQgPSAyMzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1M7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9fQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfT1ZFUlJJREVTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW1iZWRkZWQgSWQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0ZFQVRVUkVfQ09VTlQgKyAyOworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSA8ZW0+WG1sIEVudGl0eTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWSA9IDI0OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fQUNDRVNTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DTEFTU19OQU1FID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTEFTU19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fTUVUQURBVEFfQ09NUExFVEUgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX01FVEFEQVRBX0NPTVBMRVRFOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fREVTQ1JJUFRJT04gPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RFU0NSSVBUSU9OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BVFRSSUJVVEVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19BVFRSSUJVVEVTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX05BTUVEX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1FVRVJJRVM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9OQVRJVkVfUVVFUklFUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFUVVFTkNFX0dFTkVSQVRPUjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19UQUJMRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUEVSU0lTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QT1NUX1BFUlNJU1QgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUEVSU0lTVDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJFX1JFTU9WRSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1JFTU9WRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1JFTU9WRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJFX1VQREFURSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBVcGRhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BPU1RfVVBEQVRFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1VQREFURTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QT1NUX0xPQUQgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfTE9BRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQ0FDSEVBQkxFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRUFCTEU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19UQUJMRSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY29uZGFyeSBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fU0VDT05EQVJZX1RBQkxFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VDT05EQVJZX1RBQkxFUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZCBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fSURfQ0xBU1MgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lEX0NMQVNTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbmhlcml0YW5jZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0UgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUkVBRF9PTkxZID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXN0b21pemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DVVNUT01JWkVSID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NBQ0hFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAzOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgQ2hlY2tpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VYSVNURU5DRV9DSEVDS0lORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgNDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyA1OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyA2OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDc7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1NUUlVDVF9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyA4OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyA5OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDEwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJJTUFSWV9LRVkgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDExOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpbWlzdGljIExvY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DT1BZX1BPTElDWSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDE0OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbG9uZSBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQ0xPTkVfQ09QWV9QT0xJQ1kgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDE1OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTY7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDE3OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzIDxlbT5YbWwgRW50aXR5IE1hcHBpbmdzPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HUyA9IDI1OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19WRVJTSU9OID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19WRVJTSU9OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1NDSEVNQV9MT0NBVElPTiA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU0NIRU1BX0xPQ0FUSU9OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1FVRVJJRVM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0RFU0NSSVBUSU9OID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19ERVNDUklQVElPTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fUEFDS0FHRSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEFDS0FHRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19TQ0hFTUEgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NDSEVNQTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fQ0FUQUxPRyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ0FUQUxPRzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1RBQkxFX0dFTkVSQVRPUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RBQkxFX0dFTkVSQVRPUlM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIFN1cGVyY2xhc3NlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19NQVBQRURfU1VQRVJDTEFTU0VTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19NQVBQRURfU1VQRVJDTEFTU0VTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19FTlRJVElFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fRU5USVRJRVM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVtYmVkZGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0VNQkVEREFCTEVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19FTUJFRERBQkxFUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyAzOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyA0OworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW50aXR5IE1hcHBpbmdzPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyA1OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkIDxlbT5YbWwgSWQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSUQgPSAyNjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1M7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX0lEX19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfSURfX0NPTFVNTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0xPQiA9IE9ybVBhY2thZ2UuWE1MX0lEX19MT0I7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1RFTVBPUkFMID0gT3JtUGFja2FnZS5YTUxfSURfX1RFTVBPUkFMOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0VOVU1FUkFURUQgPSBPcm1QYWNrYWdlLlhNTF9JRF9fRU5VTUVSQVRFRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1I7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19UQUJMRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9JRF9fVEFCTEVfR0VORVJBVE9SOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fR0VORVJBVEVEX1ZBTFVFID0gT3JtUGFja2FnZS5YTUxfSURfX0dFTkVSQVRFRF9WQUxVRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXV0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19NVVRBQkxFID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgMzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fVFlQRV9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgNDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0lEX0ZFQVRVUkVfQ09VTlQgKyA1OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1NUUlVDVF9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgNjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19DT05WRVJUID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDc7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBJZDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDg7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPlhtbCBJbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSAyNzsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWV9GRUFUVVJFX0NPVU5UID0gMDsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2ggPGVtPlhtbCBKb2luIEZldGNoPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2goKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9GRVRDSCA9IDI4OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSCA9IDA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBKb2luIEZldGNoPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fRkVUQ0hfRkVBVFVSRV9DT1VOVCA9IDE7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSA8ZW0+WG1sIE1hbnkgVG8gTWFueTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hbnlUb01hbnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZID0gMjk7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1M7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX1RBUkdFVF9FTlRJVFkgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1RBUkdFVF9FTlRJVFk7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fRkVUQ0g7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX0NBU0NBREUgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NBU0NBREU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTUFQUEVEX0JZID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBQRURfQlk7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX0pPSU5fVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0pPSU5fVEFCTEU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19PUkRFUl9CWSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT1JERVJfQlk7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVkgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVk7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fT1JERVJfQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PUkRFUl9DT0xVTU47CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ0xBU1MgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ0xBU1M7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfVEVNUE9SQUw7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9FTlVNRVJBVEVEID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0VOVU1FUkFURUQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTFVNTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfSk9JTl9DT0xVTU5TOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fSk9JTl9GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyA0OworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFueSBUbyBNYW55PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyA1OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSA8ZW0+WG1sIE1hbnkgVG8gT25lPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYW55VG9PbmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkUgPSAzMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1M7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX1RBUkdFVF9FTlRJVFkgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVEFSR0VUX0VOVElUWTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fRkVUQ0ggPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fRkVUQ0g7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fQ0FTQ0FERSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19DQVNDQURFOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0pPSU5fVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSk9JTl9UQUJMRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fSk9JTl9DT0xVTU5TID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0pPSU5fQ09MVU1OUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fSUQgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSUQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHMgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fTUFQU19JRCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19NQVBTX0lEOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19PUFRJT05BTCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19PUFRJT05BTDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19KT0lOX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDI7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE9uZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDM7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTUyA9IDMxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTEFTU19OQU1FID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMQVNTX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX01FVEFEQVRBX0NPTVBMRVRFID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX01FVEFEQVRBX0NPTVBMRVRFOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ERVNDUklQVElPTiA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ERVNDUklQVElPTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BVFRSSUJVVEVTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURVM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkIENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lEX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lEX0NMQVNTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FTlRJVFlfTElTVEVORVJTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ1VTVE9NSVpFUiA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBDaGVja2luZzwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWElTVEVOQ0VfQ0hFQ0tJTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgNDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgNTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDY7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDc7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1RSVUNUX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgODsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgOTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVkgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRUFCTEUgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGltaXN0aWMgTG9ja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTI7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDEzOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE1OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE2OworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxNzsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdXRhYmxlIDxlbT5YbWwgTXV0YWJsZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdXRhYmxlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE11dGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVUQUJMRSA9IDMyOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NdXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVUQUJMRV9fTVVUQUJMRSA9IDA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNdXRhYmxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VVEFCTEVfRkVBVFVSRV9DT1VOVCA9IDE7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSA8ZW0+WG1sIE5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcnk8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUlkgPSAzNDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX05BTUUgPSAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXN1bHQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfQ0xBU1MgPSAxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXN1bHQgU2V0IE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkcgPSAyOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZWR1cmUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FID0gMzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV0dXJucyBSZXN1bHQgU2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVUVVJOU19SRVNVTFRfU0VUID0gNDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlRTID0gNTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSUyA9IDY7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBOYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJ5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfRkVBVFVSRV9DT1VOVCA9IDc7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciA8ZW0+WG1sIE9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gMzU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX05BTUUgPSBYTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnNpb24gVmFsdWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMzsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDQ7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55IDxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWSA9IDM2OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19OQU1FID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fVEFSR0VUX0VOVElUWSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19UQVJHRVRfRU5USVRZOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19GRVRDSDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19DQVNDQURFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0NBU0NBREU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBQRURfQlkgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQUEVEX0JZOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0pPSU5fVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9UQUJMRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fT1JERVJfQlkgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT1JERVJfQlk7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcnBoYW4gUmVtb3ZhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19PUlBIQU5fUkVNT1ZBTCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PUlBIQU5fUkVNT1ZBTDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX09SREVSX0NPTFVNTiA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PUkRFUl9DT0xVTU47CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DTEFTUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IFRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9URU1QT1JBTDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBFbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0VOVU1FUkFURUQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09MVU1OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfSk9JTl9DT0xVTU5TID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfSk9JTl9DT0xVTU5TOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcml2YXRlIE93bmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX1BSSVZBVEVfT1dORUQgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19KT0lOX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgNDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyA1OworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyA2OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lIDxlbT5YbWwgT25lIFRvIE9uZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FID0gMzc7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19OQU1FOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fVEFSR0VUX0VOVElUWSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1RBUkdFVF9FTlRJVFk7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fRkVUQ0ggPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19GRVRDSDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0NBU0NBREUgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19DQVNDQURFOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fSk9JTl9UQUJMRSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0pPSU5fVEFCTEU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fSk9JTl9DT0xVTU5TID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSk9JTl9DT0xVTU5TOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0lEID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSUQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHMgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19NQVBTX0lEID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fTUFQU19JRDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19PUFRJT05BTCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX09QVElPTkFMOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19NQVBQRURfQlkgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19NQVBQRURfQlk7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9ycGhhbiBSZW1vdmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fT1JQSEFOX1JFTU9WQUwgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19PUlBIQU5fUkVNT1ZBTDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpdmF0ZSBPd25lZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1BSSVZBVEVfT1dORUQgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyAyOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fSk9JTl9GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDM7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPbmUgVG8gT25lPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDQ7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcgPGVtPlhtbCBPcHRpbWlzdGljIExvY2tpbmc8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HID0gMzg7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1RZUEUgPSAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19DQVNDQURFID0gMTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VsZWN0ZWQgQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU5TID0gMjsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9wdGltaXN0aWMgTG9ja2luZzwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfRkVBVFVSRV9DT1VOVCA9IDM7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4gPGVtPlhtbCBPcmRlciBDb2x1bW48L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OID0gMzk7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bGxhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX19OVUxMQUJMRSA9IE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fTlVMTEFCTEU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc2VydGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fX0lOU0VSVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX0lOU0VSVEFCTEU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwZGF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl9fVVBEQVRBQkxFID0gT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19VUERBVEFCTEU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkYXRpb24gTW9kZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl9fVkFMSURBVElPTl9NT0RFID0gT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT3JkZXIgQ29sdW1uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBID0gNDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fREVTQ1JJUFRJT04gPSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19ERVNDUklQVElPTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WG1sIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURSA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1hNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleSA8ZW0+WG1sIFByaW1hcnkgS2V5PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWSA9IDQxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfX1ZBTElEQVRJT04gPSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9QUklNQVJZX0tFWV8xMV9fVkFMSURBVElPTjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfX0NPTFVNTlMgPSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9QUklNQVJZX0tFWV8xMV9fQ09MVU1OUzsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFByaW1hcnkgS2V5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9QUklNQVJZX0tFWV8xMV9GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcml2YXRlT3duZWQgPGVtPlhtbCBQcml2YXRlIE93bmVkPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcml2YXRlT3duZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJVkFURV9PV05FRCA9IDQyOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcml2YXRlIE93bmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJVkFURV9PV05FRF9fUFJJVkFURV9PV05FRCA9IDA7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQcml2YXRlIE93bmVkPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSVZBVEVfT1dORURfRkVBVFVSRV9DT1VOVCA9IDE7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkgPGVtPlhtbCBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWSA9IDQzOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJPUEVSVFlfX05BTUUgPSAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZX19WQUxVRSA9IDE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWV9fVkFMVUVfVFlQRSA9IDI7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQcm9wZXJ0eTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWV9GRUFUVVJFX0NPVU5UID0gMzsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eUNvbnRhaW5lciA8ZW0+WG1sIFByb3BlcnR5IENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eUNvbnRhaW5lcgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWV9DT05UQUlORVIgPSA0NDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTID0gMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFByb3BlcnR5IENvbnRhaW5lcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IDE7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIgPGVtPlhtbCBRdWVyeSBDb250YWluZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfQ09OVEFJTkVSID0gNDU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVMgPSAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUXVlcnkgQ29udGFpbmVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UID0gMTsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSA8ZW0+WG1sIFJlYWQgT25seTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZWFkT25seSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRUFEX09OTFkgPSA0NjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVBRF9PTkxZX19SRUFEX09OTFkgPSAwOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUmVhZCBPbmx5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFQURfT05MWV9GRUFUVVJFX0NPVU5UID0gMTsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgPGVtPlhtbCBTdG9yZWQgUHJvY2VkdXJlIFBhcmFtZXRlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSID0gNDc7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19ESVJFQ1RJT04gPSAwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX05BTUUgPSAxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RdWVyeSBQYXJhbWV0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSID0gMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19UWVBFID0gMzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SmRiYyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRSA9IDQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpkYmMgVHlwZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRV9OQU1FID0gNTsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFN0b3JlZCBQcm9jZWR1cmUgUGFyYW1ldGVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX0ZFQVRVUkVfQ09VTlQgPSA2OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlciA8ZW0+WG1sIFN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0cnVjdENvbnZlcnRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVFJVQ1RfQ09OVkVSVEVSID0gNDg7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVFJVQ1RfQ09OVkVSVEVSX19OQU1FID0gWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFN0cnVjdCBDb252ZXJ0ZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RSVUNUX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkgPGVtPlhtbCBUaW1lIE9mIERheTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGltZU9mRGF5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RJTUVfT0ZfREFZID0gNDk7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvdXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9USU1FX09GX0RBWV9fSE9VUiA9IDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbnV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RJTUVfT0ZfREFZX19NSU5VVEUgPSAxOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWNvbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9USU1FX09GX0RBWV9fU0VDT05EID0gMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWlsbGlzZWNvbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQgPSAzOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVGltZSBPZiBEYXk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVElNRV9PRl9EQVlfRkVBVFVSRV9DT1VOVCA9IDQ7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNmb3JtYXRpb24gPGVtPlhtbCBUcmFuc2Zvcm1hdGlvbjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUcmFuc2Zvcm1hdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0ZPUk1BVElPTiA9IDUwOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TRk9STUFUSU9OX19OQU1FID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TRk9STUFUSU9OX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUcmFuc2Zvcm1hdGlvbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0ZPUk1BVElPTl9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IDxlbT5YbWwgVHJhbnNpZW50PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUcmFuc2llbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNJRU5UID0gNTE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVF9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BQ0NFU1M7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNJRU5UX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNJRU5UX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVHJhbnNpZW50PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVF9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIgPGVtPlhtbCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9DT05WRVJURVIgPSA1MjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfQ09OVkVSVEVSX19OQU1FID0gWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDA7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMTsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFR5cGUgQ29udmVydGVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgPSBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgKyAyOworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUgPGVtPlhtbCBWYXJpYWJsZSBPbmUgVG8gT25lPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmFyaWFibGVPbmVUb09uZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FID0gNTM7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19OQU1FID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVmFyaWFibGUgT25lIFRvIE9uZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uIDxlbT5YbWwgVmVyc2lvbjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZlcnNpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTiA9IDU0OworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BQ0NFU1M7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19OQU1FID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTkFNRTsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09MVU1OOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19MT0IgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19MT0I7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19URU1QT1JBTDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX0VOVU1FUkFURUQgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19FTlVNRVJBVEVEOworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCArIDE7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk11dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19NVVRBQkxFID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9GRUFUVVJFX0NPVU5UICsgMzsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCArIDQ7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCArIDU7CisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9GRUFUVVJFX0NPVU5UICsgNjsKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX0NPTlZFUlQgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyA3OworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVmVyc2lvbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyA4OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZSA8ZW0+Q2FjaGUgQ29vcmRpbmF0aW9uIFR5cGU8L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0Q2FjaGVDb29yZGluYXRpb25UeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEUgPSA1NTsKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUgPGVtPkNhY2hlIFR5cGU8L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0Q2FjaGVUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfVFlQRSA9IDU2OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZSA8ZW0+WG1sIENoYW5nZSBUcmFja2luZyBUeXBlPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DSEFOR0VfVFJBQ0tJTkdfVFlQRSA9IDU3OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbERpcmVjdGlvbiA8ZW0+WG1sIERpcmVjdGlvbjwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbERpcmVjdGlvbgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxEaXJlY3Rpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRElSRUNUSU9OID0gNTg7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZSA8ZW0+RXhpc3RlbmNlIFR5cGU8L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldEV4aXN0ZW5jZVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWElTVEVOQ0VfVFlQRSA9IDU5OworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUgPGVtPlhtbCBKb2luIEZldGNoIFR5cGU8L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9GRVRDSF9UWVBFID0gNjA7CisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIDxlbT5YbWwgT3B0aW1pc3RpYyBMb2NraW5nIFR5cGU8L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09QVElNSVNUSUNfTE9DS0lOR19UWVBFID0gNjE7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQWNjZXNzTWV0aG9kc0VDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQWNjZXNzTWV0aG9kc0hvbGRlckVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgYXR0cmlidXRlc0VDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzaWNFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbEJhc2ljQ29sbGVjdGlvbkVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzaWNNYXBFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbENhY2hlRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxDYWNoZUhvbGRlckVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQ2hhbmdlVHJhY2tpbmdFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbENoYW5nZVRyYWNraW5nSG9sZGVyRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxDbG9uZUNvcHlQb2xpY3lFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbENvbnZlcnNpb25WYWx1ZUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQ29udmVydGVyRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxDb252ZXJ0ZXJIb2xkZXJFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbENvbnZlcnRlcnNIb2xkZXJFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQ29weVBvbGljeUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQ3VzdG9taXplckVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sQ3VzdG9taXplckhvbGRlckVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sRWxlbWVudENvbGxlY3Rpb25FQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGFibGVFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGVkRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxFbWJlZGRlZElkRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxFbnRpdHlFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxJZEVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3lFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbEpvaW5GZXRjaEVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvTWFueUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvT25lRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxNdXRhYmxlRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxOYW1lZENvbnZlcnRlckVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9NYW55RUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb09uZUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbE9yZGVyQ29sdW1uRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sUHJpbWFyeUtleUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sUHJpdmF0ZU93bmVkRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxQcm9wZXJ0eUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sUHJvcGVydHlDb250YWluZXJFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbFF1ZXJ5Q29udGFpbmVyRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxSZWFkT25seUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxTdHJ1Y3RDb252ZXJ0ZXJFQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbFRpbWVPZkRheUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sVHJhbnNmb3JtYXRpb25FQ2xhc3MgPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbFRyYW5zaWVudEVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sVHlwZUNvbnZlcnRlckVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sVmFyaWFibGVPbmVUb09uZUVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sVmVyc2lvbkVDbGFzcyA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBjYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bSA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBjYWNoZVR5cGVFRW51bSA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSB4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSB4bWxEaXJlY3Rpb25FRW51bSA9IG51bGw7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBleGlzdGVuY2VUeXBlRUVudW0gPSBudWxsOworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0geG1sSm9pbkZldGNoVHlwZUVFbnVtID0gbnVsbDsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVFbnVtIHhtbE9wdGltaXN0aWNMb2NraW5nVHlwZUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgorCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKKwkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcworCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCisJICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVjbGlwc2VMaW5rT3JtUGFja2FnZSgpCisJeworCQlzdXBlcihlTlNfVVJJLCBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCisJICogCisJICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBFY2xpcHNlTGlua09ybVBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtUGFja2FnZSBpbml0KCkKKwl7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChFY2xpcHNlTGlua09ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBFY2xpcHNlTGlua09ybVBhY2thZ2UoKSk7CisKKwkJaXNJbml0ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcworCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCVhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcworCQlFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lSU5TVEFOQ0UpOworCQlFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCisJCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCisJCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5mcmVlemUoKTsKKworICAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSwgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlKTsKKwkJcmV0dXJuIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyA8ZW0+WG1sIEFjY2VzcyBNZXRob2RzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBY2Nlc3MgTWV0aG9kczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQWNjZXNzTWV0aG9kcygpCisJeworCQlyZXR1cm4geG1sQWNjZXNzTWV0aG9kc0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzI2dldEdldE1ldGhvZCA8ZW0+R2V0IE1ldGhvZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdldCBNZXRob2Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyNnZXRHZXRNZXRob2QoKQorCSAqIEBzZWUgI2dldFhtbEFjY2Vzc01ldGhvZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxBY2Nlc3NNZXRob2RzX0dldE1ldGhvZCgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQWNjZXNzTWV0aG9kc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMjZ2V0U2V0TWV0aG9kIDxlbT5TZXQgTWV0aG9kPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2V0IE1ldGhvZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzI2dldFNldE1ldGhvZCgpCisJICogQHNlZSAjZ2V0WG1sQWNjZXNzTWV0aG9kcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEFjY2Vzc01ldGhvZHNfU2V0TWV0aG9kKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxBY2Nlc3NNZXRob2RzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgPGVtPlhtbCBBY2Nlc3MgTWV0aG9kcyBIb2xkZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEFjY2VzcyBNZXRob2RzIEhvbGRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpCisJeworCQlyZXR1cm4geG1sQWNjZXNzTWV0aG9kc0hvbGRlckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlciNnZXRBY2Nlc3NNZXRob2RzKCkKKwkgKiBAc2VlICNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxBY2Nlc3NNZXRob2RzSG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcgPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQorCXsKKwkJcmV0dXJuIHhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgPGVtPkF0dHJpYnV0ZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXR0cmlidXRlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0QXR0cmlidXRlcygpCisJeworCQlyZXR1cm4gYXR0cmlidXRlc0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0QmFzaWNDb2xsZWN0aW9ucyA8ZW0+QmFzaWMgQ29sbGVjdGlvbnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2ljIENvbGxlY3Rpb25zPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0QmFzaWNDb2xsZWN0aW9ucygpCisJICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0dHJpYnV0ZXNfQmFzaWNDb2xsZWN0aW9ucygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXR0cmlidXRlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRCYXNpY01hcHMgPGVtPkJhc2ljIE1hcHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2ljIE1hcHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRCYXNpY01hcHMoKQorCSAqIEBzZWUgI2dldEF0dHJpYnV0ZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBdHRyaWJ1dGVzX0Jhc2ljTWFwcygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXR0cmlidXRlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRUcmFuc2Zvcm1hdGlvbnMgPGVtPlRyYW5zZm9ybWF0aW9uczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VHJhbnNmb3JtYXRpb25zPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0VHJhbnNmb3JtYXRpb25zKCkKKwkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19UcmFuc2Zvcm1hdGlvbnMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0VmFyaWFibGVPbmVUb09uZXMgPGVtPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5WYXJpYWJsZSBPbmUgVG8gT25lczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFZhcmlhYmxlT25lVG9PbmVzKCkKKwkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19WYXJpYWJsZU9uZVRvT25lcygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXR0cmlidXRlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyA8ZW0+WG1sIEJhc2ljPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXNpYzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbEJhc2ljKCkKKwl7CisJCXJldHVybiB4bWxCYXNpY0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uIDxlbT5YbWwgQmFzaWMgQ29sbGVjdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmFzaWMgQ29sbGVjdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxCYXNpY0NvbGxlY3Rpb24oKQorCXsKKwkJcmV0dXJuIHhtbEJhc2ljQ29sbGVjdGlvbkVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXAgPGVtPlhtbCBCYXNpYyBNYXA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEJhc2ljIE1hcDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbEJhc2ljTWFwKCkKKwl7CisJCXJldHVybiB4bWxCYXNpY01hcEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUgPGVtPlhtbCBDYWNoZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ2FjaGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxDYWNoZSgpCisJeworCQlyZXR1cm4geG1sQ2FjaGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0RXhwaXJ5IDxlbT5FeHBpcnk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHBpcnk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0RXhwaXJ5KCkKKwkgKiBAc2VlICNnZXRYbWxDYWNoZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlX0V4cGlyeSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2FjaGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRTaXplIDxlbT5TaXplPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2l6ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRTaXplKCkKKwkgKiBAc2VlICNnZXRYbWxDYWNoZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlX1NpemUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0U2hhcmVkIDxlbT5TaGFyZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaGFyZWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0U2hhcmVkKCkKKwkgKiBAc2VlICNnZXRYbWxDYWNoZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlX1NoYXJlZCgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2FjaGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRUeXBlKCkKKwkgKiBAc2VlICNnZXRYbWxDYWNoZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlX1R5cGUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0QWx3YXlzUmVmcmVzaCA8ZW0+QWx3YXlzIFJlZnJlc2g8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHdheXMgUmVmcmVzaDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRBbHdheXNSZWZyZXNoKCkKKwkgKiBAc2VlICNnZXRYbWxDYWNoZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlX0Fsd2F5c1JlZnJlc2goKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0UmVmcmVzaE9ubHlJZk5ld2VyIDxlbT5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkKKwkgKiBAc2VlICNnZXRYbWxDYWNoZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlX1JlZnJlc2hPbmx5SWZOZXdlcigpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2FjaGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXREaXNhYmxlSGl0cyA8ZW0+RGlzYWJsZSBIaXRzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGlzYWJsZSBIaXRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldERpc2FibGVIaXRzKCkKKwkgKiBAc2VlICNnZXRYbWxDYWNoZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlX0Rpc2FibGVIaXRzKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDYWNoZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldENvb3JkaW5hdGlvblR5cGUgPGVtPkNvb3JkaW5hdGlvbiBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29vcmRpbmF0aW9uIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0Q29vcmRpbmF0aW9uVHlwZSgpCisJICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZV9Db29yZGluYXRpb25UeXBlKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDYWNoZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeVRpbWVPZkRheSA8ZW0+RXhwaXJ5IFRpbWUgT2YgRGF5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RXhwaXJ5IFRpbWUgT2YgRGF5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeVRpbWVPZkRheSgpCisJICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDYWNoZV9FeHBpcnlUaW1lT2ZEYXkoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbENhY2hlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyIDxlbT5YbWwgQ2FjaGUgSG9sZGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDYWNoZSBIb2xkZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxDYWNoZUhvbGRlcigpCisJeworCQlyZXR1cm4geG1sQ2FjaGVIb2xkZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIjZ2V0Q2FjaGUgPGVtPkNhY2hlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2FjaGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIjZ2V0Q2FjaGUoKQorCSAqIEBzZWUgI2dldFhtbENhY2hlSG9sZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQ2FjaGVIb2xkZXJfQ2FjaGUoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbENhY2hlSG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcgPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlciNnZXRFeGlzdGVuY2VDaGVja2luZygpCisJICogQHNlZSAjZ2V0WG1sQ2FjaGVIb2xkZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZUhvbGRlcl9FeGlzdGVuY2VDaGVja2luZygpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2FjaGVIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmcgPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmc8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENoYW5nZSBUcmFja2luZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbENoYW5nZVRyYWNraW5nKCkKKwl7CisJCXJldHVybiB4bWxDaGFuZ2VUcmFja2luZ0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZyNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZyNnZXRUeXBlKCkKKwkgKiBAc2VlICNnZXRYbWxDaGFuZ2VUcmFja2luZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENoYW5nZVRyYWNraW5nX1R5cGUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENoYW5nZVRyYWNraW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyIDxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nIEhvbGRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nIEhvbGRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ0hvbGRlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkKKwl7CisJCXJldHVybiB4bWxDaGFuZ2VUcmFja2luZ0hvbGRlckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ0hvbGRlciNnZXRDaGFuZ2VUcmFja2luZyA8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyI2dldENoYW5nZVRyYWNraW5nKCkKKwkgKiBAc2VlICNnZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDaGFuZ2VUcmFja2luZ0hvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kgPGVtPlhtbCBDbG9uZSBDb3B5IFBvbGljeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ2xvbmUgQ29weSBQb2xpY3k8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ2xvbmVDb3B5UG9saWN5KCkKKwl7CisJCXJldHVybiB4bWxDbG9uZUNvcHlQb2xpY3lFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldE1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWV0aG9kPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsb25lQ29weVBvbGljeSNnZXRNZXRob2QoKQorCSAqIEBzZWUgI2dldFhtbENsb25lQ29weVBvbGljeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENsb25lQ29weVBvbGljeV9NZXRob2QoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENsb25lQ29weVBvbGljeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsb25lQ29weVBvbGljeSNnZXRXb3JraW5nQ29weU1ldGhvZCA8ZW0+V29ya2luZyBDb3B5IE1ldGhvZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmtpbmcgQ29weSBNZXRob2Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldFdvcmtpbmdDb3B5TWV0aG9kKCkKKwkgKiBAc2VlICNnZXRYbWxDbG9uZUNvcHlQb2xpY3koKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDbG9uZUNvcHlQb2xpY3lfV29ya2luZ0NvcHlNZXRob2QoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENsb25lQ29weVBvbGljeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUgPGVtPlhtbCBDb252ZXJzaW9uIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb252ZXJzaW9uIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbENvbnZlcnNpb25WYWx1ZSgpCisJeworCQlyZXR1cm4geG1sQ29udmVyc2lvblZhbHVlRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZSNnZXREYXRhVmFsdWUgPGVtPkRhdGEgVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EYXRhIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZSNnZXREYXRhVmFsdWUoKQorCSAqIEBzZWUgI2dldFhtbENvbnZlcnNpb25WYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvbnZlcnNpb25WYWx1ZV9EYXRhVmFsdWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbnZlcnNpb25WYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZSNnZXRPYmplY3RWYWx1ZSA8ZW0+T2JqZWN0IFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T2JqZWN0IFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZSNnZXRPYmplY3RWYWx1ZSgpCisJICogQHNlZSAjZ2V0WG1sQ29udmVyc2lvblZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ29udmVyc2lvblZhbHVlX09iamVjdFZhbHVlKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDb252ZXJzaW9uVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyIDxlbT5YbWwgQ29udmVydGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb252ZXJ0ZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ29udmVydGVyKCkKKwl7CisJCXJldHVybiB4bWxDb252ZXJ0ZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyI2dldENsYXNzTmFtZSgpCisJICogQHNlZSAjZ2V0WG1sQ29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ29udmVydGVyX0NsYXNzTmFtZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciA8ZW0+WG1sIENvbnZlcnRlciBIb2xkZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENvbnZlcnRlciBIb2xkZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ29udmVydGVySG9sZGVyKCkKKwl7CisJCXJldHVybiB4bWxDb252ZXJ0ZXJIb2xkZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyI2dldENvbnZlcnRlciA8ZW0+Q29udmVydGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29udmVydGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRDb252ZXJ0ZXIoKQorCSAqIEBzZWUgI2dldFhtbENvbnZlcnRlckhvbGRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENvbnZlcnRlckhvbGRlcl9Db252ZXJ0ZXIoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbENvbnZlcnRlckhvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRUeXBlQ29udmVydGVyIDxlbT5UeXBlIENvbnZlcnRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRUeXBlQ29udmVydGVyKCkKKwkgKiBAc2VlICNnZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQ29udmVydGVySG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCisJICogQHNlZSAjZ2V0WG1sQ29udmVydGVySG9sZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbENvbnZlcnRlckhvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRTdHJ1Y3RDb252ZXJ0ZXIgPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQorCSAqIEBzZWUgI2dldFhtbENvbnZlcnRlckhvbGRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbENvbnZlcnRlckhvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyIDxlbT5YbWwgQ29udmVydGVycyBIb2xkZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENvbnZlcnRlcnMgSG9sZGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCkKKwl7CisJCXJldHVybiB4bWxDb252ZXJ0ZXJzSG9sZGVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlciNnZXRDb252ZXJ0ZXJzIDxlbT5Db252ZXJ0ZXJzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIjZ2V0Q29udmVydGVycygpCisJICogQHNlZSAjZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENvbnZlcnRlcnNIb2xkZXJfQ29udmVydGVycygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQ29udmVydGVyc0hvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlciNnZXRUeXBlQ29udmVydGVycyA8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlciNnZXRUeXBlQ29udmVydGVycygpCisJICogQHNlZSAjZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbENvbnZlcnRlcnNIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlciNnZXRPYmplY3RUeXBlQ29udmVydGVycygpCisJICogQHNlZSAjZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENvbnZlcnRlcnNIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbENvbnZlcnRlcnNIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIjZ2V0U3RydWN0Q29udmVydGVycyA8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIjZ2V0U3RydWN0Q29udmVydGVycygpCisJICogQHNlZSAjZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENvbnZlcnRlcnNIb2xkZXJfU3RydWN0Q29udmVydGVycygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQ29udmVydGVyc0hvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcgPGVtPlhtbCBDb252ZXJ0aWJsZSBNYXBwaW5nPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb252ZXJ0aWJsZSBNYXBwaW5nPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpCisJeworCQlyZXR1cm4geG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNnZXRDb252ZXJ0IDxlbT5Db252ZXJ0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29udmVydDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcjZ2V0Q29udmVydCgpCisJICogQHNlZSAjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5IDxlbT5YbWwgQ29weSBQb2xpY3k8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENvcHkgUG9saWN5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvcHlQb2xpY3kKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxDb3B5UG9saWN5KCkKKwl7CisJCXJldHVybiB4bWxDb3B5UG9saWN5RUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvcHlQb2xpY3kjZ2V0Q2xhc3NfIDxlbT5DbGFzczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNsYXNzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvcHlQb2xpY3kjZ2V0Q2xhc3NfKCkKKwkgKiBAc2VlICNnZXRYbWxDb3B5UG9saWN5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ29weVBvbGljeV9DbGFzcygpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ29weVBvbGljeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVyIDxlbT5YbWwgQ3VzdG9taXplcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ3VzdG9taXplcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ3VzdG9taXplcigpCisJeworCQlyZXR1cm4geG1sQ3VzdG9taXplckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVyI2dldEN1c3RvbWl6ZXJDbGFzc05hbWUgPGVtPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVyI2dldEN1c3RvbWl6ZXJDbGFzc05hbWUoKQorCSAqIEBzZWUgI2dldFhtbEN1c3RvbWl6ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDdXN0b21pemVyX0N1c3RvbWl6ZXJDbGFzc05hbWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEN1c3RvbWl6ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciA8ZW0+WG1sIEN1c3RvbWl6ZXIgSG9sZGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDdXN0b21pemVyIEhvbGRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpCisJeworCQlyZXR1cm4geG1sQ3VzdG9taXplckhvbGRlckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyI2dldEN1c3RvbWl6ZXIgPGVtPkN1c3RvbWl6ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DdXN0b21pemVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXJIb2xkZXIjZ2V0Q3VzdG9taXplcigpCisJICogQHNlZSAjZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEN1c3RvbWl6ZXJIb2xkZXJfQ3VzdG9taXplcigpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQ3VzdG9taXplckhvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb24oKQorCXsKKwkJcmV0dXJuIHhtbEVsZW1lbnRDb2xsZWN0aW9uRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlIDxlbT5YbWwgRW1iZWRkYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW1iZWRkYWJsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW1iZWRkYWJsZSgpCisJeworCQlyZXR1cm4geG1sRW1iZWRkYWJsZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldENvcHlQb2xpY3kgPGVtPkNvcHkgUG9saWN5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDb3B5UG9saWN5KCkKKwkgKiBAc2VlICNnZXRYbWxFbWJlZGRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW1iZWRkYWJsZV9Db3B5UG9saWN5KCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCisJICogQHNlZSAjZ2V0WG1sRW1iZWRkYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVtYmVkZGFibGVfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVtYmVkZGFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldENsb25lQ29weVBvbGljeSA8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldENsb25lQ29weVBvbGljeSgpCisJICogQHNlZSAjZ2V0WG1sRW1iZWRkYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVtYmVkZGFibGVfQ2xvbmVDb3B5UG9saWN5KCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKKwkgKiBAc2VlICNnZXRYbWxFbWJlZGRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW1iZWRkYWJsZV9FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkIDxlbT5YbWwgRW1iZWRkZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW1iZWRkZWQoKQorCXsKKwkJcmV0dXJuIHhtbEVtYmVkZGVkRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkIDxlbT5YbWwgRW1iZWRkZWQgSWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGVkIElkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxFbWJlZGRlZElkKCkKKwl7CisJCXJldHVybiB4bWxFbWJlZGRlZElkRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkgPGVtPlhtbCBFbnRpdHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVudGl0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxFbnRpdHkoKQorCXsKKwkJcmV0dXJuIHhtbEVudGl0eUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0T3B0aW1pc3RpY0xvY2tpbmcgPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0T3B0aW1pc3RpY0xvY2tpbmcoKQorCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9PcHRpbWlzdGljTG9ja2luZygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENvcHlQb2xpY3kgPGVtPkNvcHkgUG9saWN5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENvcHlQb2xpY3koKQorCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9Db3B5UG9saWN5KCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCisJICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2xvbmVDb3B5UG9saWN5IDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDbG9uZUNvcHlQb2xpY3koKQorCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9DbG9uZUNvcHlQb2xpY3koKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQorCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVudGl0eV9FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MgPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eU1hcHBpbmdzKCkKKwl7CisJCXJldHVybiB4bWxFbnRpdHlNYXBwaW5nc0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQgPGVtPlhtbCBJZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxJZCgpCisJeworCQlyZXR1cm4geG1sSWRFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5YbWwgSW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKKwl7CisJCXJldHVybiB4bWxJbnN0YW50aWF0aW9uQ29weVBvbGljeUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoIDxlbT5YbWwgSm9pbiBGZXRjaDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSm9pbiBGZXRjaDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2gKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxKb2luRmV0Y2goKQorCXsKKwkJcmV0dXJuIHhtbEpvaW5GZXRjaEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2gjZ2V0Sm9pbkZldGNoIDxlbT5Kb2luIEZldGNoPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2gjZ2V0Sm9pbkZldGNoKCkKKwkgKiBAc2VlICNnZXRYbWxKb2luRmV0Y2goKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxKb2luRmV0Y2hFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSA8ZW0+WG1sIE1hbnkgVG8gTWFueTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFueSBUbyBNYW55PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9NYW55KCkKKwl7CisJCXJldHVybiB4bWxNYW55VG9NYW55RUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUgPGVtPlhtbCBNYW55IFRvIE9uZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFueSBUbyBPbmU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFueVRvT25lKCkKKwl7CisJCXJldHVybiB4bWxNYW55VG9PbmVFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQorCXsKKwkJcmV0dXJuIHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRPcHRpbWlzdGljTG9ja2luZyA8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0T3B0aW1pc3RpY0xvY2tpbmcoKQorCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX09wdGltaXN0aWNMb2NraW5nKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDb3B5UG9saWN5IDxlbT5Db3B5IFBvbGljeTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q29weVBvbGljeSgpCisJICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfQ29weVBvbGljeSgpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQorCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDbG9uZUNvcHlQb2xpY3koKQorCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0Nsb25lQ29weVBvbGljeSgpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCisJICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdXRhYmxlIDxlbT5YbWwgTXV0YWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTXV0YWJsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdXRhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTXV0YWJsZSgpCisJeworCQlyZXR1cm4geG1sTXV0YWJsZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdXRhYmxlI2dldE11dGFibGUgPGVtPk11dGFibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NdXRhYmxlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGUjZ2V0TXV0YWJsZSgpCisJICogQHNlZSAjZ2V0WG1sTXV0YWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE11dGFibGVfTXV0YWJsZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTXV0YWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlciA8ZW0+WG1sIE5hbWVkIENvbnZlcnRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTmFtZWQgQ29udmVydGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKQorCXsKKwkJcmV0dXJuIHhtbE5hbWVkQ29udmVydGVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyI2dldE5hbWUoKQorCSAqIEBzZWUgI2dldFhtbE5hbWVkQ29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWRDb252ZXJ0ZXJfTmFtZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTmFtZWRDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSA8ZW0+WG1sIE5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcnk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcnk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQorCXsKKwkJcmV0dXJuIHhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldE5hbWUoKQorCSAqIEBzZWUgI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X05hbWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJlc3VsdENsYXNzIDxlbT5SZXN1bHQgQ2xhc3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXN1bHQgQ2xhc3M8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXN1bHRDbGFzcygpCisJICogQHNlZSAjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmVzdWx0Q2xhc3MoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJlc3VsdFNldE1hcHBpbmcgPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJlc3VsdFNldE1hcHBpbmcoKQorCSAqIEBzZWUgI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Jlc3VsdFNldE1hcHBpbmcoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFByb2NlZHVyZU5hbWUgPGVtPlByb2NlZHVyZSBOYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvY2VkdXJlIE5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRQcm9jZWR1cmVOYW1lKCkKKwkgKiBAc2VlICNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9Qcm9jZWR1cmVOYW1lKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXR1cm5zUmVzdWx0U2V0IDxlbT5SZXR1cm5zIFJlc3VsdCBTZXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXR1cm5zIFJlc3VsdCBTZXQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXR1cm5zUmVzdWx0U2V0KCkKKwkgKiBAc2VlICNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXR1cm5zUmVzdWx0U2V0KCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldEhpbnRzIDxlbT5IaW50czwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SGludHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRIaW50cygpCisJICogQHNlZSAjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfSGludHMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UGFyYW1ldGVycyA8ZW0+UGFyYW1ldGVyczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGFyYW1ldGVyczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFBhcmFtZXRlcnMoKQorCSAqIEBzZWUgI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1BhcmFtZXRlcnMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciA8ZW0+WG1sIE9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCkKKwl7CisJCXJldHVybiB4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0RGF0YVR5cGUgPGVtPkRhdGEgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGEgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldERhdGFUeXBlKCkKKwkgKiBAc2VlICNnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9EYXRhVHlwZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0T2JqZWN0VHlwZSA8ZW0+T2JqZWN0IFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldE9iamVjdFR5cGUoKQorCSAqIEBzZWUgI2dldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX09iamVjdFR5cGUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0Q29udmVyc2lvblZhbHVlcyA8ZW0+Q29udmVyc2lvbiBWYWx1ZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnZlcnNpb24gVmFsdWVzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0Q29udmVyc2lvblZhbHVlcygpCisJICogQHNlZSAjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfQ29udmVyc2lvblZhbHVlcygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0RGVmYXVsdE9iamVjdFZhbHVlIDxlbT5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgT2JqZWN0IFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkKKwkgKiBAc2VlICNnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9EZWZhdWx0T2JqZWN0VmFsdWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55IDxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9uZSBUbyBNYW55PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbE9uZVRvTWFueSgpCisJeworCQlyZXR1cm4geG1sT25lVG9NYW55RUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSA8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxPbmVUb09uZSgpCisJeworCQlyZXR1cm4geG1sT25lVG9PbmVFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nIDxlbT5YbWwgT3B0aW1pc3RpYyBMb2NraW5nPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPcHRpbWlzdGljIExvY2tpbmc8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxPcHRpbWlzdGljTG9ja2luZygpCisJeworCQlyZXR1cm4geG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcjZ2V0VHlwZSgpCisJICogQHNlZSAjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPcHRpbWlzdGljTG9ja2luZ19UeXBlKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPcHRpbWlzdGljTG9ja2luZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldENhc2NhZGUgPGVtPkNhc2NhZGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXNjYWRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldENhc2NhZGUoKQorCSAqIEBzZWUgI2dldFhtbE9wdGltaXN0aWNMb2NraW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfQ2FzY2FkZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldFNlbGVjdGVkQ29sdW1ucyA8ZW0+U2VsZWN0ZWQgQ29sdW1uczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VsZWN0ZWQgQ29sdW1uczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRTZWxlY3RlZENvbHVtbnMoKQorCSAqIEBzZWUgI2dldFhtbE9wdGltaXN0aWNMb2NraW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfU2VsZWN0ZWRDb2x1bW5zKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxPcHRpbWlzdGljTG9ja2luZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbiA8ZW0+WG1sIE9yZGVyIENvbHVtbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT3JkZXIgQ29sdW1uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT3JkZXJDb2x1bW4oKQorCXsKKwkJcmV0dXJuIHhtbE9yZGVyQ29sdW1uRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCisJeworCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKKwkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXkgPGVtPlhtbCBQcmltYXJ5IEtleTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUHJpbWFyeSBLZXk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFByaW1hcnlLZXkoKQorCXsKKwkJcmV0dXJuIHhtbFByaW1hcnlLZXlFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZCA8ZW0+WG1sIFByaXZhdGUgT3duZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFByaXZhdGUgT3duZWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpdmF0ZU93bmVkCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUHJpdmF0ZU93bmVkKCkKKwl7CisJCXJldHVybiB4bWxQcml2YXRlT3duZWRFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpdmF0ZU93bmVkI2lzUHJpdmF0ZU93bmVkIDxlbT5Qcml2YXRlIE93bmVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcml2YXRlT3duZWQjaXNQcml2YXRlT3duZWQoKQorCSAqIEBzZWUgI2dldFhtbFByaXZhdGVPd25lZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFByaXZhdGVPd25lZF9Qcml2YXRlT3duZWQoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByaXZhdGVPd25lZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSA8ZW0+WG1sIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFByb3BlcnR5KCkKKwl7CisJCXJldHVybiB4bWxQcm9wZXJ0eUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXROYW1lKCkKKwkgKiBAc2VlICNnZXRYbWxQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFByb3BlcnR5X05hbWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWUoKQorCSAqIEBzZWUgI2dldFhtbFByb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUHJvcGVydHlfVmFsdWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWVUeXBlIDxlbT5WYWx1ZSBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXRWYWx1ZVR5cGUoKQorCSAqIEBzZWUgI2dldFhtbFByb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUHJvcGVydHlfVmFsdWVUeXBlKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eUNvbnRhaW5lciA8ZW0+WG1sIFByb3BlcnR5IENvbnRhaW5lcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUHJvcGVydHkgQ29udGFpbmVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Q29udGFpbmVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKQorCXsKKwkJcmV0dXJuIHhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHlDb250YWluZXIjZ2V0UHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJvcGVydGllczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eUNvbnRhaW5lciNnZXRQcm9wZXJ0aWVzKCkKKwkgKiBAc2VlICNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyIDxlbT5YbWwgUXVlcnkgQ29udGFpbmVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBRdWVyeSBDb250YWluZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxRdWVyeUNvbnRhaW5lcigpCisJeworCQlyZXR1cm4geG1sUXVlcnlDb250YWluZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciNnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyI2dldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCisJICogQHNlZSAjZ2V0WG1sUXVlcnlDb250YWluZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFF1ZXJ5Q29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlYWRPbmx5IDxlbT5YbWwgUmVhZCBPbmx5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBSZWFkIE9ubHk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxSZWFkT25seSgpCisJeworCQlyZXR1cm4geG1sUmVhZE9ubHlFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHkjZ2V0UmVhZE9ubHkgPGVtPlJlYWQgT25seTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlYWQgT25seTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSNnZXRSZWFkT25seSgpCisJICogQHNlZSAjZ2V0WG1sUmVhZE9ubHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxSZWFkT25seV9SZWFkT25seSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUmVhZE9ubHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIDxlbT5YbWwgU3RvcmVkIFByb2NlZHVyZSBQYXJhbWV0ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFN0b3JlZCBQcm9jZWR1cmUgUGFyYW1ldGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCisJeworCQlyZXR1cm4geG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXREaXJlY3Rpb24gPGVtPkRpcmVjdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpcmVjdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0RGlyZWN0aW9uKCkKKwkgKiBAc2VlICNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfRGlyZWN0aW9uKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldE5hbWUoKQorCSAqIEBzZWUgI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9OYW1lKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0UXVlcnlQYXJhbWV0ZXIgPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0UXVlcnlQYXJhbWV0ZXIoKQorCSAqIEBzZWUgI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9RdWVyeVBhcmFtZXRlcigpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRUeXBlKCkKKwkgKiBAc2VlICNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfVHlwZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldEpkYmNUeXBlIDxlbT5KZGJjIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KZGJjIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldEpkYmNUeXBlKCkKKwkgKiBAc2VlICNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfSmRiY1R5cGUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRKZGJjVHlwZU5hbWUgPGVtPkpkYmMgVHlwZSBOYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldEpkYmNUeXBlTmFtZSgpCisJICogQHNlZSAjZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlTmFtZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlciA8ZW0+WG1sIFN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFN0cnVjdCBDb252ZXJ0ZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sU3RydWN0Q29udmVydGVyKCkKKwl7CisJCXJldHVybiB4bWxTdHJ1Y3RDb252ZXJ0ZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyI2dldENvbnZlcnRlciA8ZW0+Q29udmVydGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29udmVydGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlciNnZXRDb252ZXJ0ZXIoKQorCSAqIEBzZWUgI2dldFhtbFN0cnVjdENvbnZlcnRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFN0cnVjdENvbnZlcnRlcl9Db252ZXJ0ZXIoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFN0cnVjdENvbnZlcnRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkgPGVtPlhtbCBUaW1lIE9mIERheTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVGltZSBPZiBEYXk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVGltZU9mRGF5KCkKKwl7CisJCXJldHVybiB4bWxUaW1lT2ZEYXlFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldEhvdXIgPGVtPkhvdXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ib3VyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRIb3VyKCkKKwkgKiBAc2VlICNnZXRYbWxUaW1lT2ZEYXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUaW1lT2ZEYXlfSG91cigpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVGltZU9mRGF5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldE1pbnV0ZSA8ZW0+TWludXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWludXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRNaW51dGUoKQorCSAqIEBzZWUgI2dldFhtbFRpbWVPZkRheSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFRpbWVPZkRheV9NaW51dGUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFRpbWVPZkRheUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRTZWNvbmQgPGVtPlNlY29uZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlY29uZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0U2Vjb25kKCkKKwkgKiBAc2VlICNnZXRYbWxUaW1lT2ZEYXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUaW1lT2ZEYXlfU2Vjb25kKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUaW1lT2ZEYXlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0TWlsbGlzZWNvbmQgPGVtPk1pbGxpc2Vjb25kPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWlsbGlzZWNvbmQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldE1pbGxpc2Vjb25kKCkKKwkgKiBAc2VlICNnZXRYbWxUaW1lT2ZEYXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUaW1lT2ZEYXlfTWlsbGlzZWNvbmQoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFRpbWVPZkRheUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbiA8ZW0+WG1sIFRyYW5zZm9ybWF0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUcmFuc2Zvcm1hdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFRyYW5zZm9ybWF0aW9uKCkKKwl7CisJCXJldHVybiB4bWxUcmFuc2Zvcm1hdGlvbkVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IDxlbT5YbWwgVHJhbnNpZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUcmFuc2llbnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVHJhbnNpZW50KCkKKwl7CisJCXJldHVybiB4bWxUcmFuc2llbnRFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIgPGVtPlhtbCBUeXBlIENvbnZlcnRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVHlwZSBDb252ZXJ0ZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFR5cGVDb252ZXJ0ZXIoKQorCXsKKwkJcmV0dXJuIHhtbFR5cGVDb252ZXJ0ZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciNnZXREYXRhVHlwZSA8ZW0+RGF0YSBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF0YSBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0RGF0YVR5cGUoKQorCSAqIEBzZWUgI2dldFhtbFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUeXBlQ29udmVydGVyX0RhdGFUeXBlKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlIDxlbT5PYmplY3QgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9iamVjdCBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0T2JqZWN0VHlwZSgpCisJICogQHNlZSAjZ2V0WG1sVHlwZUNvbnZlcnRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVHlwZUNvbnZlcnRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lIDxlbT5YbWwgVmFyaWFibGUgT25lIFRvIE9uZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVmFyaWFibGUgT25lIFRvIE9uZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVmFyaWFibGVPbmVUb09uZSgpCisJeworCQlyZXR1cm4geG1sVmFyaWFibGVPbmVUb09uZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiA8ZW0+WG1sIFZlcnNpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFZlcnNpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbFZlcnNpb24oKQorCXsKKwkJcmV0dXJuIHhtbFZlcnNpb25FQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlIDxlbT5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkNhY2hlIENvb3JkaW5hdGlvbiBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0Q2FjaGVDb29yZGluYXRpb25UeXBlKCkKKwl7CisJCXJldHVybiBjYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUgPGVtPkNhY2hlIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5DYWNoZSBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0Q2FjaGVUeXBlKCkKKwl7CisJCXJldHVybiBjYWNoZVR5cGVFRW51bTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGUgPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVFbnVtIGdldFhtbENoYW5nZVRyYWNraW5nVHlwZSgpCisJeworCQlyZXR1cm4geG1sQ2hhbmdlVHJhY2tpbmdUeXBlRUVudW07CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlyZWN0aW9uIDxlbT5YbWwgRGlyZWN0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+WG1sIERpcmVjdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXJlY3Rpb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVFbnVtIGdldFhtbERpcmVjdGlvbigpCisJeworCQlyZXR1cm4geG1sRGlyZWN0aW9uRUVudW07CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZSA8ZW0+RXhpc3RlbmNlIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5FeGlzdGVuY2UgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRFeGlzdGVuY2VUeXBlKCkKKwl7CisJCXJldHVybiBleGlzdGVuY2VUeXBlRUVudW07CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZSA8ZW0+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlhtbCBKb2luIEZldGNoIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0WG1sSm9pbkZldGNoVHlwZSgpCisJeworCQlyZXR1cm4geG1sSm9pbkZldGNoVHlwZUVFbnVtOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSA8ZW0+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKCkKKwl7CisJCXJldHVybiB4bWxPcHRpbWlzdGljTG9ja2luZ1R5cGVFRW51bTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmtPcm1GYWN0b3J5IGdldEVjbGlwc2VMaW5rT3JtRmFjdG9yeSgpCisJeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCisJICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJeworCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47CisJCWlzQ3JlYXRlZCA9IHRydWU7CisKKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisJCXhtbEFjY2Vzc01ldGhvZHNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FDQ0VTU19NRVRIT0RTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBY2Nlc3NNZXRob2RzRUNsYXNzLCBYTUxfQUNDRVNTX01FVEhPRFNfX0dFVF9NRVRIT0QpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbEFjY2Vzc01ldGhvZHNFQ2xhc3MsIFhNTF9BQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRCk7CisKKwkJeG1sQWNjZXNzTWV0aG9kc0hvbGRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyRUNsYXNzLCBYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUyk7CisKKwkJeG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVRUUklCVVRFX01BUFBJTkcpOworCisJCWF0dHJpYnV0ZXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVRUUklCVVRFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoYXR0cmlidXRlc0VDbGFzcywgQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlMpOworCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX0JBU0lDX01BUFMpOworCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX1RSQU5TRk9STUFUSU9OUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoYXR0cmlidXRlc0VDbGFzcywgQVRUUklCVVRFU19fVkFSSUFCTEVfT05FX1RPX09ORVMpOworCisJCXhtbEJhc2ljRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9CQVNJQyk7CisKKwkJeG1sQmFzaWNDb2xsZWN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9CQVNJQ19DT0xMRUNUSU9OKTsKKworCQl4bWxCYXNpY01hcEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTSUNfTUFQKTsKKworCQl4bWxDYWNoZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ0FDSEUpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbENhY2hlRUNsYXNzLCBYTUxfQ0FDSEVfX0VYUElSWSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVFQ2xhc3MsIFhNTF9DQUNIRV9fU0laRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVFQ2xhc3MsIFhNTF9DQUNIRV9fU0hBUkVEKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDYWNoZUVDbGFzcywgWE1MX0NBQ0hFX19UWVBFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDYWNoZUVDbGFzcywgWE1MX0NBQ0hFX19BTFdBWVNfUkVGUkVTSCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVFQ2xhc3MsIFhNTF9DQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDYWNoZUVDbGFzcywgWE1MX0NBQ0hFX19ESVNBQkxFX0hJVFMpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbENhY2hlRUNsYXNzLCBYTUxfQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDYWNoZUVDbGFzcywgWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVkpOworCisJCXhtbENhY2hlSG9sZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DQUNIRV9IT0xERVIpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbENhY2hlSG9sZGVyRUNsYXNzLCBYTUxfQ0FDSEVfSE9MREVSX19DQUNIRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVIb2xkZXJFQ2xhc3MsIFhNTF9DQUNIRV9IT0xERVJfX0VYSVNURU5DRV9DSEVDS0lORyk7CisKKwkJeG1sQ2hhbmdlVHJhY2tpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NIQU5HRV9UUkFDS0lORyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2hhbmdlVHJhY2tpbmdFQ2xhc3MsIFhNTF9DSEFOR0VfVFJBQ0tJTkdfX1RZUEUpOworCisJCXhtbENoYW5nZVRyYWNraW5nSG9sZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDaGFuZ2VUcmFja2luZ0hvbGRlckVDbGFzcywgWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVJfX0NIQU5HRV9UUkFDS0lORyk7CisKKwkJeG1sQ2xvbmVDb3B5UG9saWN5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DTE9ORV9DT1BZX1BPTElDWSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2xvbmVDb3B5UG9saWN5RUNsYXNzLCBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX01FVEhPRCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2xvbmVDb3B5UG9saWN5RUNsYXNzLCBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0QpOworCisJCXhtbENvbnZlcnNpb25WYWx1ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09OVkVSU0lPTl9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ29udmVyc2lvblZhbHVlRUNsYXNzLCBYTUxfQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ29udmVyc2lvblZhbHVlRUNsYXNzLCBYTUxfQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFKTsKKworCQl4bWxDb252ZXJ0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NPTlZFUlRFUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ29udmVydGVyRUNsYXNzLCBYTUxfQ09OVkVSVEVSX19DTEFTU19OQU1FKTsKKworCQl4bWxDb252ZXJ0ZXJIb2xkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NPTlZFUlRFUl9IT0xERVIpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbENvbnZlcnRlckhvbGRlckVDbGFzcywgWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQ29udmVydGVySG9sZGVyRUNsYXNzLCBYTUxfQ09OVkVSVEVSX0hPTERFUl9fVFlQRV9DT05WRVJURVIpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbENvbnZlcnRlckhvbGRlckVDbGFzcywgWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQ29udmVydGVySG9sZGVyRUNsYXNzLCBYTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUik7CisKKwkJeG1sQ29udmVydGVyc0hvbGRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09OVkVSVEVSU19IT0xERVIpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbENvbnZlcnRlcnNIb2xkZXJFQ2xhc3MsIFhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQ29udmVydGVyc0hvbGRlckVDbGFzcywgWE1MX0NPTlZFUlRFUlNfSE9MREVSX19UWVBFX0NPTlZFUlRFUlMpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbENvbnZlcnRlcnNIb2xkZXJFQ2xhc3MsIFhNTF9DT05WRVJURVJTX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQ29udmVydGVyc0hvbGRlckVDbGFzcywgWE1MX0NPTlZFUlRFUlNfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSUyk7CisKKwkJeG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3MsIFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJUKTsKKworCQl4bWxDb3B5UG9saWN5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT1BZX1BPTElDWSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ29weVBvbGljeUVDbGFzcywgWE1MX0NPUFlfUE9MSUNZX19DTEFTUyk7CisKKwkJeG1sQ3VzdG9taXplckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ1VTVE9NSVpFUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ3VzdG9taXplckVDbGFzcywgWE1MX0NVU1RPTUlaRVJfX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRSk7CisKKwkJeG1sQ3VzdG9taXplckhvbGRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ1VTVE9NSVpFUl9IT0xERVIpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEN1c3RvbWl6ZXJIb2xkZXJFQ2xhc3MsIFhNTF9DVVNUT01JWkVSX0hPTERFUl9fQ1VTVE9NSVpFUik7CisKKwkJeG1sRWxlbWVudENvbGxlY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VMRU1FTlRfQ09MTEVDVElPTik7CisKKwkJeG1sRW1iZWRkYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU1CRUREQUJMRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW1iZWRkYWJsZUVDbGFzcywgWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbWJlZGRhYmxlRUNsYXNzLCBYTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW1iZWRkYWJsZUVDbGFzcywgWE1MX0VNQkVEREFCTEVfX0NMT05FX0NPUFlfUE9MSUNZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbWJlZGRhYmxlRUNsYXNzLCBYTUxfRU1CRUREQUJMRV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTKTsKKworCQl4bWxFbWJlZGRlZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU1CRURERUQpOworCisJCXhtbEVtYmVkZGVkSWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VNQkVEREVEX0lEKTsKKworCQl4bWxFbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VOVElUWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkcpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1kpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MpOworCisJCXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTlRJVFlfTUFQUElOR1MpOworCisJCXhtbElkRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9JRCk7CisKKwkJeG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3lFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kpOworCisJCXhtbEpvaW5GZXRjaEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSk9JTl9GRVRDSCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sSm9pbkZldGNoRUNsYXNzLCBYTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSCk7CisKKwkJeG1sTWFueVRvTWFueUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFOWV9UT19NQU5ZKTsKKworCQl4bWxNYW55VG9PbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BTllfVE9fT05FKTsKKworCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQVBQRURfU1VQRVJDTEFTUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkcpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1kpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MpOworCisJCXhtbE11dGFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01VVEFCTEUpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbE11dGFibGVFQ2xhc3MsIFhNTF9NVVRBQkxFX19NVVRBQkxFKTsKKworCQl4bWxOYW1lZENvbnZlcnRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTkFNRURfQ09OVkVSVEVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxOYW1lZENvbnZlcnRlckVDbGFzcywgWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRSk7CisKKwkJeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcywgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX05BTUUpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MsIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfQ0xBU1MpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MsIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkcpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MsIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QUk9DRURVUkVfTkFNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcywgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcywgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlRTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSUyk7CisKKwkJeG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLCBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MsIFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLCBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzcywgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUUpOworCisJCXhtbE9uZVRvTWFueUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX01BTlkpOworCisJCXhtbE9uZVRvT25lRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PTkVfVE9fT05FKTsKKworCQl4bWxPcHRpbWlzdGljTG9ja2luZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT1BUSU1JU1RJQ19MT0NLSU5HKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPcHRpbWlzdGljTG9ja2luZ0VDbGFzcywgWE1MX09QVElNSVNUSUNfTE9DS0lOR19fVFlQRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MsIFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREUpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbE9wdGltaXN0aWNMb2NraW5nRUNsYXNzLCBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU5TKTsKKworCQl4bWxPcmRlckNvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT1JERVJfQ09MVU1OKTsKKworCQl4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MpOworCisJCXhtbFByaW1hcnlLZXlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BSSU1BUllfS0VZKTsKKworCQl4bWxQcml2YXRlT3duZWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BSSVZBVEVfT1dORUQpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbFByaXZhdGVPd25lZEVDbGFzcywgWE1MX1BSSVZBVEVfT1dORURfX1BSSVZBVEVfT1dORUQpOworCisJCXhtbFByb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QUk9QRVJUWSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUHJvcGVydHlFQ2xhc3MsIFhNTF9QUk9QRVJUWV9fTkFNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUHJvcGVydHlFQ2xhc3MsIFhNTF9QUk9QRVJUWV9fVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbFByb3BlcnR5RUNsYXNzLCBYTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEUpOworCisJCXhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QUk9QRVJUWV9DT05UQUlORVIpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzLCBYTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTKTsKKworCQl4bWxRdWVyeUNvbnRhaW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUVVFUllfQ09OVEFJTkVSKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxRdWVyeUNvbnRhaW5lckVDbGFzcywgWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTKTsKKworCQl4bWxSZWFkT25seUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUkVBRF9PTkxZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxSZWFkT25seUVDbGFzcywgWE1MX1JFQURfT05MWV9fUkVBRF9PTkxZKTsKKworCQl4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MsIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fRElSRUNUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MsIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fTkFNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1FVRVJZX1BBUkFNRVRFUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1RZUEUpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcywgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEUpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcywgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRSk7CisKKwkJeG1sU3RydWN0Q29udmVydGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9TVFJVQ1RfQ09OVkVSVEVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTdHJ1Y3RDb252ZXJ0ZXJFQ2xhc3MsIFhNTF9TVFJVQ1RfQ09OVkVSVEVSX19DT05WRVJURVIpOworCisJCXhtbFRpbWVPZkRheUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVElNRV9PRl9EQVkpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbFRpbWVPZkRheUVDbGFzcywgWE1MX1RJTUVfT0ZfREFZX19IT1VSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUaW1lT2ZEYXlFQ2xhc3MsIFhNTF9USU1FX09GX0RBWV9fTUlOVVRFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUaW1lT2ZEYXlFQ2xhc3MsIFhNTF9USU1FX09GX0RBWV9fU0VDT05EKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUaW1lT2ZEYXlFQ2xhc3MsIFhNTF9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQpOworCisJCXhtbFRyYW5zZm9ybWF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UUkFOU0ZPUk1BVElPTik7CisKKwkJeG1sVHJhbnNpZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UUkFOU0lFTlQpOworCisJCXhtbFR5cGVDb252ZXJ0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1RZUEVfQ09OVkVSVEVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUeXBlQ29udmVydGVyRUNsYXNzLCBYTUxfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVHlwZUNvbnZlcnRlckVDbGFzcywgWE1MX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSk7CisKKwkJeG1sVmFyaWFibGVPbmVUb09uZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVkFSSUFCTEVfT05FX1RPX09ORSk7CisKKwkJeG1sVmVyc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVkVSU0lPTik7CisKKwkJLy8gQ3JlYXRlIGVudW1zCisJCWNhY2hlQ29vcmRpbmF0aW9uVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEUpOworCQljYWNoZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKENBQ0hFX1RZUEUpOworCQl4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFhNTF9DSEFOR0VfVFJBQ0tJTkdfVFlQRSk7CisJCXhtbERpcmVjdGlvbkVFbnVtID0gY3JlYXRlRUVudW0oWE1MX0RJUkVDVElPTik7CisJCWV4aXN0ZW5jZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKEVYSVNURU5DRV9UWVBFKTsKKwkJeG1sSm9pbkZldGNoVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oWE1MX0pPSU5fRkVUQ0hfVFlQRSk7CisJCXhtbE9wdGltaXN0aWNMb2NraW5nVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oWE1MX09QVElNSVNUSUNfTE9DS0lOR19UWVBFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOworCisJLyoqCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKKwkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCXsKKwkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKKwkJaXNJbml0aWFsaXplZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCisJCXNldE5hbWUoZU5BTUUpOworCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKKwkJc2V0TnNVUkkoZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcworCQlFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpOworCQlFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpOworCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKKwkJT3JtUGFja2FnZSB0aGVPcm1QYWNrYWdlID0gKE9ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBBZGQgc3VicGFja2FnZXMKKwkJZ2V0RVN1YnBhY2thZ2VzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UpOworCQlnZXRFU3VicGFja2FnZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSk7CisKKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycworCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycworCisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJeG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7CisJCXhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkpOworCQl4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKSk7CisJCWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRBdHRyaWJ1dGVzKCkpOworCQl4bWxCYXNpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEJhc2ljKCkpOworCQl4bWxCYXNpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7CisJCXhtbEJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTXV0YWJsZSgpKTsKKwkJeG1sQmFzaWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7CisJCXhtbEJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZ2V0WG1sQmFzaWNfMV8xKCkpOworCQl4bWxCYXNpY0NvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7CisJCXhtbEJhc2ljQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7CisJCXhtbEJhc2ljTWFwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOworCQl4bWxCYXNpY01hcEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7CisJCXhtbENvbnZlcnRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE5hbWVkQ29udmVydGVyKCkpOworCQl4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7CisJCXhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENvbnZlcnRlckhvbGRlcigpKTsKKwkJeG1sRWxlbWVudENvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbigpKTsKKwkJeG1sRWxlbWVudENvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKSk7CisJCXhtbEVtYmVkZGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxFbWJlZGRhYmxlKCkpOworCQl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpKTsKKwkJeG1sRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkpOworCQl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpKTsKKwkJeG1sRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFByb3BlcnR5Q29udGFpbmVyKCkpOworCQl4bWxFbWJlZGRlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEVtYmVkZGVkKCkpOworCQl4bWxFbWJlZGRlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7CisJCXhtbEVtYmVkZGVkSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxFbWJlZGRlZElkKCkpOworCQl4bWxFbWJlZGRlZElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKKwkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sRW50aXR5KCkpOworCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxSZWFkT25seSgpKTsKKwkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpKTsKKwkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSk7CisJCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENhY2hlSG9sZGVyKCkpOworCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCkpOworCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxRdWVyeUNvbnRhaW5lcigpKTsKKwkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKSk7CisJCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmdldFhtbEVudGl0eV8xXzEoKSk7CisJCXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sRW50aXR5TWFwcGluZ3MoKSk7CisJCXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpKTsKKwkJeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxRdWVyeUNvbnRhaW5lcigpKTsKKwkJeG1sSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxJZCgpKTsKKwkJeG1sSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOworCQl4bWxJZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE11dGFibGUoKSk7CisJCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkpOworCQl4bWxNYW55VG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sTWFueVRvTWFueSgpKTsKKwkJeG1sTWFueVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7CisJCXhtbE1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxKb2luRmV0Y2goKSk7CisJCXhtbE1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5nZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAoKSk7CisJCXhtbE1hbnlUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbE1hbnlUb09uZSgpKTsKKwkJeG1sTWFueVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKKwkJeG1sTWFueVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sSm9pbkZldGNoKCkpOworCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpKTsKKwkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFJlYWRPbmx5KCkpOworCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpKTsKKwkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkpOworCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ2FjaGVIb2xkZXIoKSk7CisJCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCkpOworCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKSk7CisJCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSgpKTsKKwkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wKCkpOworCQl4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKSk7CisJCXhtbE9uZVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbE9uZVRvTWFueSgpKTsKKwkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKKwkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUHJpdmF0ZU93bmVkKCkpOworCQl4bWxPbmVUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxKb2luRmV0Y2goKSk7CisJCXhtbE9uZVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCgpKTsKKwkJeG1sT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxPbmVUb09uZSgpKTsKKwkJeG1sT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOworCQl4bWxPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFByaXZhdGVPd25lZCgpKTsKKwkJeG1sT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxKb2luRmV0Y2goKSk7CisJCXhtbE9yZGVyQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sT3JkZXJDb2x1bW4oKSk7CisJCXhtbE9yZGVyQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkpOworCQl4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQl4bWxQcmltYXJ5S2V5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZ2V0WG1sUHJpbWFyeUtleV8xXzEoKSk7CisJCXhtbFN0cnVjdENvbnZlcnRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE5hbWVkQ29udmVydGVyKCkpOworCQl4bWxUcmFuc2Zvcm1hdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKKwkJeG1sVHJhbnNmb3JtYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOworCQl4bWxUcmFuc2llbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxUcmFuc2llbnQoKSk7CisJCXhtbFRyYW5zaWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7CisJCXhtbFR5cGVDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxOYW1lZENvbnZlcnRlcigpKTsKKwkJeG1sVmFyaWFibGVPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKKwkJeG1sVmFyaWFibGVPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7CisJCXhtbFZlcnNpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxWZXJzaW9uKCkpOworCQl4bWxWZXJzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKKwkJeG1sVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE11dGFibGUoKSk7CisJCXhtbFZlcnNpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJaW5pdEVDbGFzcyh4bWxBY2Nlc3NNZXRob2RzRUNsYXNzLCBYbWxBY2Nlc3NNZXRob2RzLmNsYXNzLCAiWG1sQWNjZXNzTWV0aG9kcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQWNjZXNzTWV0aG9kc19HZXRNZXRob2QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJnZXRNZXRob2QiLCBudWxsLCAwLCAxLCBYbWxBY2Nlc3NNZXRob2RzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxBY2Nlc3NNZXRob2RzX1NldE1ldGhvZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNldE1ldGhvZCIsIG51bGwsIDAsIDEsIFhtbEFjY2Vzc01ldGhvZHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyRUNsYXNzLCBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzLCAiWG1sQWNjZXNzTWV0aG9kc0hvbGRlciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpLCB0aGlzLmdldFhtbEFjY2Vzc01ldGhvZHMoKSwgbnVsbCwgImFjY2Vzc01ldGhvZHMiLCBudWxsLCAwLCAxLCBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcywgWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcywgIlhtbEF0dHJpYnV0ZU1hcHBpbmciLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoYXR0cmlidXRlc0VDbGFzcywgQXR0cmlidXRlcy5jbGFzcywgIkF0dHJpYnV0ZXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfQmFzaWNDb2xsZWN0aW9ucygpLCB0aGlzLmdldFhtbEJhc2ljQ29sbGVjdGlvbigpLCBudWxsLCAiYmFzaWNDb2xsZWN0aW9ucyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRBdHRyaWJ1dGVzX0Jhc2ljTWFwcygpLCB0aGlzLmdldFhtbEJhc2ljTWFwKCksIG51bGwsICJiYXNpY01hcHMiLCBudWxsLCAwLCAtMSwgQXR0cmlidXRlcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0QXR0cmlidXRlc19UcmFuc2Zvcm1hdGlvbnMoKSwgdGhpcy5nZXRYbWxUcmFuc2Zvcm1hdGlvbigpLCBudWxsLCAidHJhbnNmb3JtYXRpb25zIiwgbnVsbCwgMCwgLTEsIEF0dHJpYnV0ZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfVmFyaWFibGVPbmVUb09uZXMoKSwgdGhpcy5nZXRYbWxWYXJpYWJsZU9uZVRvT25lKCksIG51bGwsICJ2YXJpYWJsZU9uZVRvT25lcyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sQmFzaWNFQ2xhc3MsIFhtbEJhc2ljLmNsYXNzLCAiWG1sQmFzaWMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh4bWxCYXNpY0NvbGxlY3Rpb25FQ2xhc3MsIFhtbEJhc2ljQ29sbGVjdGlvbi5jbGFzcywgIlhtbEJhc2ljQ29sbGVjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHhtbEJhc2ljTWFwRUNsYXNzLCBYbWxCYXNpY01hcC5jbGFzcywgIlhtbEJhc2ljTWFwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoeG1sQ2FjaGVFQ2xhc3MsIFhtbENhY2hlLmNsYXNzLCAiWG1sQ2FjaGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbENhY2hlX0V4cGlyeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgImV4cGlyeSIsIG51bGwsIDAsIDEsIFhtbENhY2hlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDYWNoZV9TaXplKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAic2l6ZSIsIG51bGwsIDAsIDEsIFhtbENhY2hlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDYWNoZV9TaGFyZWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAic2hhcmVkIiwgbnVsbCwgMCwgMSwgWG1sQ2FjaGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbENhY2hlX1R5cGUoKSwgdGhpcy5nZXRDYWNoZVR5cGUoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVfQWx3YXlzUmVmcmVzaCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJhbHdheXNSZWZyZXNoIiwgbnVsbCwgMCwgMSwgWG1sQ2FjaGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbENhY2hlX1JlZnJlc2hPbmx5SWZOZXdlcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJyZWZyZXNoT25seUlmTmV3ZXIiLCBudWxsLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVfRGlzYWJsZUhpdHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiZGlzYWJsZUhpdHMiLCBudWxsLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVfQ29vcmRpbmF0aW9uVHlwZSgpLCB0aGlzLmdldENhY2hlQ29vcmRpbmF0aW9uVHlwZSgpLCAiY29vcmRpbmF0aW9uVHlwZSIsICIiLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ2FjaGVfRXhwaXJ5VGltZU9mRGF5KCksIHRoaXMuZ2V0WG1sVGltZU9mRGF5KCksIG51bGwsICJleHBpcnlUaW1lT2ZEYXkiLCBudWxsLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbENhY2hlSG9sZGVyRUNsYXNzLCBYbWxDYWNoZUhvbGRlci5jbGFzcywgIlhtbENhY2hlSG9sZGVyIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ2FjaGVIb2xkZXJfQ2FjaGUoKSwgdGhpcy5nZXRYbWxDYWNoZSgpLCBudWxsLCAiY2FjaGUiLCBudWxsLCAwLCAxLCBYbWxDYWNoZUhvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVIb2xkZXJfRXhpc3RlbmNlQ2hlY2tpbmcoKSwgdGhpcy5nZXRFeGlzdGVuY2VUeXBlKCksICJleGlzdGVuY2VDaGVja2luZyIsICIiLCAwLCAxLCBYbWxDYWNoZUhvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbENoYW5nZVRyYWNraW5nRUNsYXNzLCBYbWxDaGFuZ2VUcmFja2luZy5jbGFzcywgIlhtbENoYW5nZVRyYWNraW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDaGFuZ2VUcmFja2luZ19UeXBlKCksIHRoaXMuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdUeXBlKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgWG1sQ2hhbmdlVHJhY2tpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxDaGFuZ2VUcmFja2luZ0hvbGRlckVDbGFzcywgWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuY2xhc3MsICJYbWxDaGFuZ2VUcmFja2luZ0hvbGRlciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCksIHRoaXMuZ2V0WG1sQ2hhbmdlVHJhY2tpbmcoKSwgbnVsbCwgImNoYW5nZVRyYWNraW5nIiwgbnVsbCwgMCwgMSwgWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxDbG9uZUNvcHlQb2xpY3lFQ2xhc3MsIFhtbENsb25lQ29weVBvbGljeS5jbGFzcywgIlhtbENsb25lQ29weVBvbGljeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X01ldGhvZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1ldGhvZCIsIG51bGwsIDAsIDEsIFhtbENsb25lQ29weVBvbGljeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X1dvcmtpbmdDb3B5TWV0aG9kKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAid29ya2luZ0NvcHlNZXRob2QiLCBudWxsLCAwLCAxLCBYbWxDbG9uZUNvcHlQb2xpY3kuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxDb252ZXJzaW9uVmFsdWVFQ2xhc3MsIFhtbENvbnZlcnNpb25WYWx1ZS5jbGFzcywgIlhtbENvbnZlcnNpb25WYWx1ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ29udmVyc2lvblZhbHVlX0RhdGFWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGF0YVZhbHVlIiwgbnVsbCwgMCwgMSwgWG1sQ29udmVyc2lvblZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb252ZXJzaW9uVmFsdWVfT2JqZWN0VmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm9iamVjdFZhbHVlIiwgbnVsbCwgMCwgMSwgWG1sQ29udmVyc2lvblZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sQ29udmVydGVyRUNsYXNzLCBYbWxDb252ZXJ0ZXIuY2xhc3MsICJYbWxDb252ZXJ0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbENvbnZlcnRlcl9DbGFzc05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNsYXNzTmFtZSIsIG51bGwsIDAsIDEsIFhtbENvbnZlcnRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbENvbnZlcnRlckhvbGRlckVDbGFzcywgWG1sQ29udmVydGVySG9sZGVyLmNsYXNzLCAiWG1sQ29udmVydGVySG9sZGVyIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpLCB0aGlzLmdldFhtbENvbnZlcnRlcigpLCBudWxsLCAiY29udmVydGVyIiwgbnVsbCwgMCwgMSwgWG1sQ29udmVydGVySG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpLCB0aGlzLmdldFhtbFR5cGVDb252ZXJ0ZXIoKSwgbnVsbCwgInR5cGVDb252ZXJ0ZXIiLCBudWxsLCAwLCAxLCBYbWxDb252ZXJ0ZXJIb2xkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbENvbnZlcnRlckhvbGRlcl9PYmplY3RUeXBlQ29udmVydGVyKCksIHRoaXMuZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpLCBudWxsLCAib2JqZWN0VHlwZUNvbnZlcnRlciIsIG51bGwsIDAsIDEsIFhtbENvbnZlcnRlckhvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ29udmVydGVySG9sZGVyX1N0cnVjdENvbnZlcnRlcigpLCB0aGlzLmdldFhtbFN0cnVjdENvbnZlcnRlcigpLCBudWxsLCAic3RydWN0Q29udmVydGVyIiwgbnVsbCwgMCwgMSwgWG1sQ29udmVydGVySG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sQ29udmVydGVyc0hvbGRlckVDbGFzcywgWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcywgIlhtbENvbnZlcnRlcnNIb2xkZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX0NvbnZlcnRlcnMoKSwgdGhpcy5nZXRYbWxDb252ZXJ0ZXIoKSwgbnVsbCwgImNvbnZlcnRlcnMiLCBudWxsLCAwLCAtMSwgWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9UeXBlQ29udmVydGVycygpLCB0aGlzLmdldFhtbFR5cGVDb252ZXJ0ZXIoKSwgbnVsbCwgInR5cGVDb252ZXJ0ZXJzIiwgbnVsbCwgMCwgLTEsIFhtbENvbnZlcnRlcnNIb2xkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbENvbnZlcnRlcnNIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSwgdGhpcy5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCksIG51bGwsICJvYmplY3RUeXBlQ29udmVydGVycyIsIG51bGwsIDAsIC0xLCBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1N0cnVjdENvbnZlcnRlcnMoKSwgdGhpcy5nZXRYbWxTdHJ1Y3RDb252ZXJ0ZXIoKSwgbnVsbCwgInN0cnVjdENvbnZlcnRlcnMiLCBudWxsLCAwLCAtMSwgWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcywgWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzLCAiWG1sQ29udmVydGlibGVNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbnZlcnQiLCBudWxsLCAwLCAxLCBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxDb3B5UG9saWN5RUNsYXNzLCBYbWxDb3B5UG9saWN5LmNsYXNzLCAiWG1sQ29weVBvbGljeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ29weVBvbGljeV9DbGFzcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNsYXNzIiwgbnVsbCwgMCwgMSwgWG1sQ29weVBvbGljeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbEN1c3RvbWl6ZXJFQ2xhc3MsIFhtbEN1c3RvbWl6ZXIuY2xhc3MsICJYbWxDdXN0b21pemVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDdXN0b21pemVyX0N1c3RvbWl6ZXJDbGFzc05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImN1c3RvbWl6ZXJDbGFzc05hbWUiLCBudWxsLCAwLCAxLCBYbWxDdXN0b21pemVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sQ3VzdG9taXplckhvbGRlckVDbGFzcywgWG1sQ3VzdG9taXplckhvbGRlci5jbGFzcywgIlhtbEN1c3RvbWl6ZXJIb2xkZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxDdXN0b21pemVySG9sZGVyX0N1c3RvbWl6ZXIoKSwgdGhpcy5nZXRYbWxDdXN0b21pemVyKCksIG51bGwsICJjdXN0b21pemVyIiwgbnVsbCwgMCwgMSwgWG1sQ3VzdG9taXplckhvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbEVsZW1lbnRDb2xsZWN0aW9uRUNsYXNzLCBYbWxFbGVtZW50Q29sbGVjdGlvbi5jbGFzcywgIlhtbEVsZW1lbnRDb2xsZWN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoeG1sRW1iZWRkYWJsZUVDbGFzcywgWG1sRW1iZWRkYWJsZS5jbGFzcywgIlhtbEVtYmVkZGFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbEVtYmVkZGFibGVfQ29weVBvbGljeSgpLCB0aGlzLmdldFhtbENvcHlQb2xpY3koKSwgbnVsbCwgImNvcHlQb2xpY3kiLCBudWxsLCAwLCAxLCBYbWxFbWJlZGRhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbWJlZGRhYmxlX0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCksIHRoaXMuZ2V0WG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSwgbnVsbCwgImluc3RhbnRpYXRpb25Db3B5UG9saWN5IiwgbnVsbCwgMCwgMSwgWG1sRW1iZWRkYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW1iZWRkYWJsZV9DbG9uZUNvcHlQb2xpY3koKSwgdGhpcy5nZXRYbWxDbG9uZUNvcHlQb2xpY3koKSwgbnVsbCwgImNsb25lQ29weVBvbGljeSIsIG51bGwsIDAsIDEsIFhtbEVtYmVkZGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbEVtYmVkZGFibGVfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJleGNsdWRlRGVmYXVsdE1hcHBpbmdzIiwgbnVsbCwgMCwgMSwgWG1sRW1iZWRkYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbEVtYmVkZGVkRUNsYXNzLCBYbWxFbWJlZGRlZC5jbGFzcywgIlhtbEVtYmVkZGVkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoeG1sRW1iZWRkZWRJZEVDbGFzcywgWG1sRW1iZWRkZWRJZC5jbGFzcywgIlhtbEVtYmVkZGVkSWQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh4bWxFbnRpdHlFQ2xhc3MsIFhtbEVudGl0eS5jbGFzcywgIlhtbEVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X09wdGltaXN0aWNMb2NraW5nKCksIHRoaXMuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmcoKSwgbnVsbCwgIm9wdGltaXN0aWNMb2NraW5nIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfQ29weVBvbGljeSgpLCB0aGlzLmdldFhtbENvcHlQb2xpY3koKSwgbnVsbCwgImNvcHlQb2xpY3kiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpLCB0aGlzLmdldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCksIG51bGwsICJpbnN0YW50aWF0aW9uQ29weVBvbGljeSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X0Nsb25lQ29weVBvbGljeSgpLCB0aGlzLmdldFhtbENsb25lQ29weVBvbGljeSgpLCBudWxsLCAiY2xvbmVDb3B5UG9saWN5IiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJleGNsdWRlRGVmYXVsdE1hcHBpbmdzIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAiWG1sRW50aXR5TWFwcGluZ3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh4bWxJZEVDbGFzcywgWG1sSWQuY2xhc3MsICJYbWxJZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5RUNsYXNzLCBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeS5jbGFzcywgIlhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoeG1sSm9pbkZldGNoRUNsYXNzLCBYbWxKb2luRmV0Y2guY2xhc3MsICJYbWxKb2luRmV0Y2giLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCksIHRoaXMuZ2V0WG1sSm9pbkZldGNoVHlwZSgpLCAiam9pbkZldGNoIiwgbnVsbCwgMCwgMSwgWG1sSm9pbkZldGNoLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sTWFueVRvTWFueUVDbGFzcywgWG1sTWFueVRvTWFueS5jbGFzcywgIlhtbE1hbnlUb01hbnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh4bWxNYW55VG9PbmVFQ2xhc3MsIFhtbE1hbnlUb09uZS5jbGFzcywgIlhtbE1hbnlUb09uZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICJYbWxNYXBwZWRTdXBlcmNsYXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX09wdGltaXN0aWNMb2NraW5nKCksIHRoaXMuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmcoKSwgbnVsbCwgIm9wdGltaXN0aWNMb2NraW5nIiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19Db3B5UG9saWN5KCksIHRoaXMuZ2V0WG1sQ29weVBvbGljeSgpLCBudWxsLCAiY29weVBvbGljeSIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSwgdGhpcy5nZXRYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpLCBudWxsLCAiaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0Nsb25lQ29weVBvbGljeSgpLCB0aGlzLmdldFhtbENsb25lQ29weVBvbGljeSgpLCBudWxsLCAiY2xvbmVDb3B5UG9saWN5IiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sTXV0YWJsZUVDbGFzcywgWG1sTXV0YWJsZS5jbGFzcywgIlhtbE11dGFibGUiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNdXRhYmxlX011dGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAibXV0YWJsZSIsIG51bGwsIDAsIDEsIFhtbE11dGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxOYW1lZENvbnZlcnRlckVDbGFzcywgWG1sTmFtZWRDb252ZXJ0ZXIuY2xhc3MsICJYbWxOYW1lZENvbnZlcnRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTmFtZWRDb252ZXJ0ZXJfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbE5hbWVkQ29udmVydGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcywgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5jbGFzcywgIlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Jlc3VsdENsYXNzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVzdWx0Q2xhc3MiLCBudWxsLCAwLCAxLCBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Jlc3VsdFNldE1hcHBpbmcoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXN1bHRTZXRNYXBwaW5nIiwgbnVsbCwgMCwgMSwgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9Qcm9jZWR1cmVOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvY2VkdXJlTmFtZSIsIG51bGwsIDAsIDEsIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmV0dXJuc1Jlc3VsdFNldCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJyZXR1cm5zUmVzdWx0U2V0IiwgbnVsbCwgMCwgMSwgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9IaW50cygpLCB0aGVPcm1QYWNrYWdlLmdldFhtbFF1ZXJ5SGludCgpLCBudWxsLCAiaGludHMiLCBudWxsLCAwLCAtMSwgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9QYXJhbWV0ZXJzKCksIHRoaXMuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCksIG51bGwsICJwYXJhbWV0ZXJzIiwgbnVsbCwgMCwgLTEsIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLCBYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCAiWG1sT2JqZWN0VHlwZUNvbnZlcnRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9EYXRhVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGF0YVR5cGUiLCBudWxsLCAwLCAxLCBYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX09iamVjdFR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm9iamVjdFR5cGUiLCBudWxsLCAwLCAxLCBYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0NvbnZlcnNpb25WYWx1ZXMoKSwgdGhpcy5nZXRYbWxDb252ZXJzaW9uVmFsdWUoKSwgbnVsbCwgImNvbnZlcnNpb25WYWx1ZXMiLCBudWxsLCAwLCAtMSwgWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9EZWZhdWx0T2JqZWN0VmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlZmF1bHRPYmplY3RWYWx1ZSIsIG51bGwsIDAsIDEsIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxPbmVUb01hbnlFQ2xhc3MsIFhtbE9uZVRvTWFueS5jbGFzcywgIlhtbE9uZVRvTWFueSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHhtbE9uZVRvT25lRUNsYXNzLCBYbWxPbmVUb09uZS5jbGFzcywgIlhtbE9uZVRvT25lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MsIFhtbE9wdGltaXN0aWNMb2NraW5nLmNsYXNzLCAiWG1sT3B0aW1pc3RpY0xvY2tpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbE9wdGltaXN0aWNMb2NraW5nX1R5cGUoKSwgdGhpcy5nZXRYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBYbWxPcHRpbWlzdGljTG9ja2luZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfQ2FzY2FkZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJjYXNjYWRlIiwgbnVsbCwgMCwgMSwgWG1sT3B0aW1pc3RpY0xvY2tpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbE9wdGltaXN0aWNMb2NraW5nX1NlbGVjdGVkQ29sdW1ucygpLCB0aGVPcm1QYWNrYWdlLmdldFhtbENvbHVtbigpLCBudWxsLCAic2VsZWN0ZWRDb2x1bW5zIiwgbnVsbCwgMCwgLTEsIFhtbE9wdGltaXN0aWNMb2NraW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sT3JkZXJDb2x1bW5FQ2xhc3MsIFhtbE9yZGVyQ29sdW1uLmNsYXNzLCAiWG1sT3JkZXJDb2x1bW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcywgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJleGNsdWRlRGVmYXVsdE1hcHBpbmdzIiwgbnVsbCwgMCwgMSwgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxQcmltYXJ5S2V5RUNsYXNzLCBYbWxQcmltYXJ5S2V5LmNsYXNzLCAiWG1sUHJpbWFyeUtleSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHhtbFByaXZhdGVPd25lZEVDbGFzcywgWG1sUHJpdmF0ZU93bmVkLmNsYXNzLCAiWG1sUHJpdmF0ZU93bmVkIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUHJpdmF0ZU93bmVkX1ByaXZhdGVPd25lZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJwcml2YXRlT3duZWQiLCBudWxsLCAwLCAxLCBYbWxQcml2YXRlT3duZWQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxQcm9wZXJ0eUVDbGFzcywgWG1sUHJvcGVydHkuY2xhc3MsICJYbWxQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUHJvcGVydHlfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUHJvcGVydHlfVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIFhtbFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQcm9wZXJ0eV9WYWx1ZVR5cGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZVR5cGUiLCBudWxsLCAwLCAxLCBYbWxQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzLCBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcywgIlhtbFByb3BlcnR5Q29udGFpbmVyIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpLCB0aGlzLmdldFhtbFByb3BlcnR5KCksIG51bGwsICJwcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sUXVlcnlDb250YWluZXJFQ2xhc3MsIFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzLCAiWG1sUXVlcnlDb250YWluZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKSwgdGhpcy5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCksIG51bGwsICJuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMiLCBudWxsLCAwLCAtMSwgWG1sUXVlcnlDb250YWluZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxSZWFkT25seUVDbGFzcywgWG1sUmVhZE9ubHkuY2xhc3MsICJYbWxSZWFkT25seSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFJlYWRPbmx5X1JlYWRPbmx5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgInJlYWRPbmx5IiwgbnVsbCwgMCwgMSwgWG1sUmVhZE9ubHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MsIFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci5jbGFzcywgIlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0RpcmVjdGlvbigpLCB0aGlzLmdldFhtbERpcmVjdGlvbigpLCAiZGlyZWN0aW9uIiwgbnVsbCwgMCwgMSwgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9RdWVyeVBhcmFtZXRlcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInF1ZXJ5UGFyYW1ldGVyIiwgbnVsbCwgMCwgMSwgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgImpkYmNUeXBlIiwgbnVsbCwgMCwgMSwgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfSmRiY1R5cGVOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiamRiY1R5cGVOYW1lIiwgbnVsbCwgMCwgMSwgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sU3RydWN0Q29udmVydGVyRUNsYXNzLCBYbWxTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MsICJYbWxTdHJ1Y3RDb252ZXJ0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFN0cnVjdENvbnZlcnRlcl9Db252ZXJ0ZXIoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbnZlcnRlciIsIG51bGwsIDAsIDEsIFhtbFN0cnVjdENvbnZlcnRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbFRpbWVPZkRheUVDbGFzcywgWG1sVGltZU9mRGF5LmNsYXNzLCAiWG1sVGltZU9mRGF5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxUaW1lT2ZEYXlfSG91cigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgImhvdXIiLCBudWxsLCAwLCAxLCBYbWxUaW1lT2ZEYXkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFRpbWVPZkRheV9NaW51dGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50T2JqZWN0KCksICJtaW51dGUiLCBudWxsLCAwLCAxLCBYbWxUaW1lT2ZEYXkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFRpbWVPZkRheV9TZWNvbmQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50T2JqZWN0KCksICJzZWNvbmQiLCBudWxsLCAwLCAxLCBYbWxUaW1lT2ZEYXkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFRpbWVPZkRheV9NaWxsaXNlY29uZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgIm1pbGxpc2Vjb25kIiwgbnVsbCwgMCwgMSwgWG1sVGltZU9mRGF5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sVHJhbnNmb3JtYXRpb25FQ2xhc3MsIFhtbFRyYW5zZm9ybWF0aW9uLmNsYXNzLCAiWG1sVHJhbnNmb3JtYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyh4bWxUcmFuc2llbnRFQ2xhc3MsIFhtbFRyYW5zaWVudC5jbGFzcywgIlhtbFRyYW5zaWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHhtbFR5cGVDb252ZXJ0ZXJFQ2xhc3MsIFhtbFR5cGVDb252ZXJ0ZXIuY2xhc3MsICJYbWxUeXBlQ29udmVydGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxUeXBlQ29udmVydGVyX0RhdGFUeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkYXRhVHlwZSIsIG51bGwsIDAsIDEsIFhtbFR5cGVDb252ZXJ0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFhtbFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAib2JqZWN0VHlwZSIsIG51bGwsIDAsIDEsIFhtbFR5cGVDb252ZXJ0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxWYXJpYWJsZU9uZVRvT25lRUNsYXNzLCBYbWxWYXJpYWJsZU9uZVRvT25lLmNsYXNzLCAiWG1sVmFyaWFibGVPbmVUb09uZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKHhtbFZlcnNpb25FQ2xhc3MsIFhtbFZlcnNpb24uY2xhc3MsICJYbWxWZXJzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCisJCWluaXRFRW51bShjYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bSwgQ2FjaGVDb29yZGluYXRpb25UeXBlLmNsYXNzLCAiQ2FjaGVDb29yZGluYXRpb25UeXBlIik7CisJCWFkZEVFbnVtTGl0ZXJhbChjYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bSwgQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMpOworCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVDb29yZGluYXRpb25UeXBlRUVudW0sIENhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyk7CisJCWFkZEVFbnVtTGl0ZXJhbChjYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bSwgQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKTsKKwkJYWRkRUVudW1MaXRlcmFsKGNhY2hlQ29vcmRpbmF0aW9uVHlwZUVFbnVtLCBDYWNoZUNvb3JkaW5hdGlvblR5cGUuTk9ORSk7CisKKwkJaW5pdEVFbnVtKGNhY2hlVHlwZUVFbnVtLCBDYWNoZVR5cGUuY2xhc3MsICJDYWNoZVR5cGUiKTsKKwkJYWRkRUVudW1MaXRlcmFsKGNhY2hlVHlwZUVFbnVtLCBDYWNoZVR5cGUuRlVMTCk7CisJCWFkZEVFbnVtTGl0ZXJhbChjYWNoZVR5cGVFRW51bSwgQ2FjaGVUeXBlLldFQUspOworCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVUeXBlRUVudW0sIENhY2hlVHlwZS5TT0ZUKTsKKwkJYWRkRUVudW1MaXRlcmFsKGNhY2hlVHlwZUVFbnVtLCBDYWNoZVR5cGUuU09GVF9XRUFLKTsKKwkJYWRkRUVudW1MaXRlcmFsKGNhY2hlVHlwZUVFbnVtLCBDYWNoZVR5cGUuSEFSRF9XRUFLKTsKKwkJYWRkRUVudW1MaXRlcmFsKGNhY2hlVHlwZUVFbnVtLCBDYWNoZVR5cGUuQ0FDSEUpOworCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVUeXBlRUVudW0sIENhY2hlVHlwZS5OT05FKTsKKworCQlpbml0RUVudW0oeG1sQ2hhbmdlVHJhY2tpbmdUeXBlRUVudW0sIFhtbENoYW5nZVRyYWNraW5nVHlwZS5jbGFzcywgIlhtbENoYW5nZVRyYWNraW5nVHlwZSIpOworCQlhZGRFRW51bUxpdGVyYWwoeG1sQ2hhbmdlVHJhY2tpbmdUeXBlRUVudW0sIFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOworCQlhZGRFRW51bUxpdGVyYWwoeG1sQ2hhbmdlVHJhY2tpbmdUeXBlRUVudW0sIFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOworCQlhZGRFRW51bUxpdGVyYWwoeG1sQ2hhbmdlVHJhY2tpbmdUeXBlRUVudW0sIFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7CisJCWFkZEVFbnVtTGl0ZXJhbCh4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSwgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOworCisJCWluaXRFRW51bSh4bWxEaXJlY3Rpb25FRW51bSwgWG1sRGlyZWN0aW9uLmNsYXNzLCAiWG1sRGlyZWN0aW9uIik7CisJCWFkZEVFbnVtTGl0ZXJhbCh4bWxEaXJlY3Rpb25FRW51bSwgWG1sRGlyZWN0aW9uLklOKTsKKwkJYWRkRUVudW1MaXRlcmFsKHhtbERpcmVjdGlvbkVFbnVtLCBYbWxEaXJlY3Rpb24uT1VUKTsKKwkJYWRkRUVudW1MaXRlcmFsKHhtbERpcmVjdGlvbkVFbnVtLCBYbWxEaXJlY3Rpb24uSU5fT1VUKTsKKwkJYWRkRUVudW1MaXRlcmFsKHhtbERpcmVjdGlvbkVFbnVtLCBYbWxEaXJlY3Rpb24uT1VUX0NVUlNPUik7CisKKwkJaW5pdEVFbnVtKGV4aXN0ZW5jZVR5cGVFRW51bSwgRXhpc3RlbmNlVHlwZS5jbGFzcywgIkV4aXN0ZW5jZVR5cGUiKTsKKwkJYWRkRUVudW1MaXRlcmFsKGV4aXN0ZW5jZVR5cGVFRW51bSwgRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRSk7CisJCWFkZEVFbnVtTGl0ZXJhbChleGlzdGVuY2VUeXBlRUVudW0sIEV4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UpOworCQlhZGRFRW51bUxpdGVyYWwoZXhpc3RlbmNlVHlwZUVFbnVtLCBFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOworCQlhZGRFRW51bUxpdGVyYWwoZXhpc3RlbmNlVHlwZUVFbnVtLCBFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFKTsKKworCQlpbml0RUVudW0oeG1sSm9pbkZldGNoVHlwZUVFbnVtLCBYbWxKb2luRmV0Y2hUeXBlLmNsYXNzLCAiWG1sSm9pbkZldGNoVHlwZSIpOworCQlhZGRFRW51bUxpdGVyYWwoeG1sSm9pbkZldGNoVHlwZUVFbnVtLCBYbWxKb2luRmV0Y2hUeXBlLklOTkVSKTsKKwkJYWRkRUVudW1MaXRlcmFsKHhtbEpvaW5GZXRjaFR5cGVFRW51bSwgWG1sSm9pbkZldGNoVHlwZS5PVVRFUik7CisKKwkJaW5pdEVFbnVtKHhtbE9wdGltaXN0aWNMb2NraW5nVHlwZUVFbnVtLCBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUuY2xhc3MsICJYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUiKTsKKwkJYWRkRUVudW1MaXRlcmFsKHhtbE9wdGltaXN0aWNMb2NraW5nVHlwZUVFbnVtLCBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUuQUxMX0NPTFVNTlMpOworCQlhZGRFRW51bUxpdGVyYWwoeG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlRUVudW0sIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZS5DSEFOR0VEX0NPTFVNTlMpOworCQlhZGRFRW51bUxpdGVyYWwoeG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlRUVudW0sIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZS5TRUxFQ1RFRF9DT0xVTU5TKTsKKwkJYWRkRUVudW1MaXRlcmFsKHhtbE9wdGltaXN0aWNMb2NraW5nVHlwZUVFbnVtLCBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUuVkVSU0lPTl9DT0xVTU4pOworCisJCS8vIENyZWF0ZSByZXNvdXJjZQorCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKwkgKiA8dWw+CisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKwkgKiA8L3VsPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIExpdGVyYWxzCisJeworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzIDxlbT5YbWwgQWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcworCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kcygpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BQ0NFU1NfTUVUSE9EUyA9IGVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZXQgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQUNDRVNTX01FVEhPRFNfX0dFVF9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc19HZXRNZXRob2QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNldCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9BQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzX1NldE1ldGhvZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgPGVtPlhtbCBBY2Nlc3MgTWV0aG9kcyBIb2xkZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlcgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTID0gZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcgPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FUVFJJQlVURV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXMoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBBVFRSSUJVVEVTID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2ljIENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFUVFJJQlVURVNfX0JBU0lDX0NPTExFQ1RJT05TID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfQmFzaWNDb2xsZWN0aW9ucygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzaWMgTWFwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBVFRSSUJVVEVTX19CQVNJQ19NQVBTID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfQmFzaWNNYXBzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc2Zvcm1hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQVRUUklCVVRFU19fVFJBTlNGT1JNQVRJT05TID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfVHJhbnNmb3JtYXRpb25zKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJsZSBPbmUgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBVFRSSUJVVEVTX19WQVJJQUJMRV9PTkVfVE9fT05FUyA9IGVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX1ZhcmlhYmxlT25lVG9PbmVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMgPGVtPlhtbCBCYXNpYzwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYworCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWMoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFTSUMgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb24gPGVtPlhtbCBCYXNpYyBDb2xsZWN0aW9uPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNDb2xsZWN0aW9uKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0JBU0lDX0NPTExFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNDb2xsZWN0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXAgPGVtPlhtbCBCYXNpYyBNYXA8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljTWFwKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0JBU0lDX01BUCA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY01hcCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlIDxlbT5YbWwgQ2FjaGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NBQ0hFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHBpcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DQUNIRV9fRVhQSVJZID0gZUlOU1RBTkNFLmdldFhtbENhY2hlX0V4cGlyeSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFX19TSVpFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlX1NpemUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNoYXJlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFX19TSEFSRUQgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfU2hhcmVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0FDSEVfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWx3YXlzIFJlZnJlc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DQUNIRV9fQUxXQVlTX1JFRlJFU0ggPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfQWx3YXlzUmVmcmVzaCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUiA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZV9SZWZyZXNoT25seUlmTmV3ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc2FibGUgSGl0czwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFX19ESVNBQkxFX0hJVFMgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfRGlzYWJsZUhpdHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvb3JkaW5hdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlX0Nvb3JkaW5hdGlvblR5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4cGlyeSBUaW1lIE9mIERheTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVkgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfRXhwaXJ5VGltZU9mRGF5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIgPGVtPlhtbCBDYWNoZSBIb2xkZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NBQ0hFX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZUhvbGRlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlSG9sZGVyX0NhY2hlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgQ2hlY2tpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DQUNIRV9IT0xERVJfX0VYSVNURU5DRV9DSEVDS0lORyA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZUhvbGRlcl9FeGlzdGVuY2VDaGVja2luZygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nIDxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZygpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DSEFOR0VfVFJBQ0tJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2hhbmdlVHJhY2tpbmcoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DSEFOR0VfVFJBQ0tJTkdfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdfVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyIDxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nIEhvbGRlcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ0hvbGRlcgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIFRyYWNraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUl9fQ0hBTkdFX1RSQUNLSU5HID0gZUlOU1RBTkNFLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5IDxlbT5YbWwgQ2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDbG9uZUNvcHlQb2xpY3koKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2xvbmVDb3B5UG9saWN5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DTE9ORV9DT1BZX1BPTElDWV9fTUVUSE9EID0gZUlOU1RBTkNFLmdldFhtbENsb25lQ29weVBvbGljeV9NZXRob2QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmtpbmcgQ29weSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DTE9ORV9DT1BZX1BPTElDWV9fV09SS0lOR19DT1BZX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRYbWxDbG9uZUNvcHlQb2xpY3lfV29ya2luZ0NvcHlNZXRob2QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUgPGVtPlhtbCBDb252ZXJzaW9uIFZhbHVlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVyc2lvblZhbHVlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NPTlZFUlNJT05fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVyc2lvblZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJzaW9uVmFsdWVfRGF0YVZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVyc2lvblZhbHVlX09iamVjdFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyIDxlbT5YbWwgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NPTlZFUlRFUiA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT05WRVJURVJfX0NMQVNTX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyX0NsYXNzTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciA8ZW0+WG1sIENvbnZlcnRlciBIb2xkZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09OVkVSVEVSX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUiA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NPTlZFUlRFUl9IT0xERVJfX1RZUEVfQ09OVkVSVEVSID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DT05WRVJURVJfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DT05WRVJURVJfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyIDxlbT5YbWwgQ29udmVydGVycyBIb2xkZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlcgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT05WRVJURVJTX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUyA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX0NvbnZlcnRlcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQ09OVkVSVEVSU19IT0xERVJfX1RZUEVfQ09OVkVSVEVSUyA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1R5cGVDb252ZXJ0ZXJzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DT05WRVJURVJTX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfU3RydWN0Q29udmVydGVycygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyA8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09OVkVSVElCTEVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJUID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeSA8ZW0+WG1sIENvcHkgUG9saWN5PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvcHlQb2xpY3kKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvcHlQb2xpY3koKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29weVBvbGljeSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT1BZX1BPTElDWV9fQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29weVBvbGljeV9DbGFzcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIgPGVtPlhtbCBDdXN0b21pemVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEN1c3RvbWl6ZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ1VTVE9NSVpFUiA9IGVJTlNUQU5DRS5nZXRYbWxDdXN0b21pemVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DdXN0b21pemVyIENsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DVVNUT01JWkVSX19DVVNUT01JWkVSX0NMQVNTX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ3VzdG9taXplcl9DdXN0b21pemVyQ2xhc3NOYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciA8ZW0+WG1sIEN1c3RvbWl6ZXIgSG9sZGVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXJIb2xkZXIKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEN1c3RvbWl6ZXJIb2xkZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ1VTVE9NSVpFUl9IT0xERVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9taXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NVU1RPTUlaRVJfSE9MREVSX19DVVNUT01JWkVSID0gZUlOU1RBTkNFLmdldFhtbEN1c3RvbWl6ZXJIb2xkZXJfQ3VzdG9taXplcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTEVNRU5UX0NPTExFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlIDxlbT5YbWwgRW1iZWRkYWJsZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VNQkVEREFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTUJFRERBQkxFX19DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlX0NvcHlQb2xpY3koKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV9DbG9uZUNvcHlQb2xpY3koKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VNQkVEREFCTEVfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZCA8ZW0+WG1sIEVtYmVkZGVkPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRlZCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTUJFRERFRCA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQgPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRlZElkKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VNQkVEREVEX0lEID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGVkSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkgPGVtPlhtbCBFbnRpdHk8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3B0aW1pc3RpYyBMb2NraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X09wdGltaXN0aWNMb2NraW5nKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0NvcHlQb2xpY3koKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbG9uZSBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fQ0xPTkVfQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0Nsb25lQ29weVBvbGljeSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyA8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncworCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQgPGVtPlhtbCBJZDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSWQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSUQgPSBlSU5TVEFOQ0UuZ2V0WG1sSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSA8ZW0+WG1sIEluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2ggPGVtPlhtbCBKb2luIEZldGNoPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0pPSU5fRkVUQ0ggPSBlSU5TVEFOQ0UuZ2V0WG1sSm9pbkZldGNoKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSCA9IGVJTlNUQU5DRS5nZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSA8ZW0+WG1sIE1hbnkgVG8gTWFueTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BTllfVE9fTUFOWSA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIDxlbT5YbWwgTWFueSBUbyBPbmU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYW55VG9PbmUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFOWV9UT19PTkUgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvT25lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQUEVEX1NVUEVSQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3B0aW1pc3RpYyBMb2NraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX09wdGltaXN0aWNMb2NraW5nKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0NvcHlQb2xpY3koKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbG9uZSBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0Nsb25lQ29weVBvbGljeSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdXRhYmxlIDxlbT5YbWwgTXV0YWJsZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdXRhYmxlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNdXRhYmxlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01VVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sTXV0YWJsZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TXV0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01VVEFCTEVfX01VVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sTXV0YWJsZV9NdXRhYmxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb252ZXJ0ZXIgPGVtPlhtbCBOYW1lZCBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb252ZXJ0ZXIKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29udmVydGVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX05BTUVEX0NPTlZFUlRFUiA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZENvbnZlcnRlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZENvbnZlcnRlcl9OYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSA8ZW0+WG1sIE5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcnk8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzdWx0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmVzdWx0Q2xhc3MoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBTZXQgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Jlc3VsdFNldE1hcHBpbmcoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2NlZHVyZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUFJPQ0VEVVJFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9Qcm9jZWR1cmVOYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXR1cm5zIFJlc3VsdCBTZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVRVUk5TX1JFU1VMVF9TRVQgPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXR1cm5zUmVzdWx0U2V0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVFMgPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9IaW50cygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSUyA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1BhcmFtZXRlcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyIDxlbT5YbWwgT2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gZUlOU1RBTkNFLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRhdGEgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFID0gZUlOU1RBTkNFLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfRGF0YVR5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX09iamVjdFR5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnNpb24gVmFsdWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTID0gZUlOU1RBTkNFLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfQ29udmVyc2lvblZhbHVlcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFID0gZUlOU1RBTkNFLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfRGVmYXVsdE9iamVjdFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55IDxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPbmVUb01hbnkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT05FX1RPX01BTlkgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUgPGVtPlhtbCBPbmUgVG8gT25lPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fT05FID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvT25lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcgPGVtPlhtbCBPcHRpbWlzdGljIExvY2tpbmc8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9wdGltaXN0aWNMb2NraW5nKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09QVElNSVNUSUNfTE9DS0lORyA9IGVJTlNUQU5DRS5nZXRYbWxPcHRpbWlzdGljTG9ja2luZygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09QVElNSVNUSUNfTE9DS0lOR19fVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxPcHRpbWlzdGljTG9ja2luZ19UeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19DQVNDQURFID0gZUlOU1RBTkNFLmdldFhtbE9wdGltaXN0aWNMb2NraW5nX0Nhc2NhZGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlbGVjdGVkIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX09QVElNSVNUSUNfTE9DS0lOR19fU0VMRUNURURfQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxPcHRpbWlzdGljTG9ja2luZ19TZWxlY3RlZENvbHVtbnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbiA8ZW0+WG1sIE9yZGVyIENvbHVtbjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW4oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT1JERVJfQ09MVU1OID0gZUlOU1RBTkNFLmdldFhtbE9yZGVyQ29sdW1uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXkgPGVtPlhtbCBQcmltYXJ5IEtleTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BSSU1BUllfS0VZID0gZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcml2YXRlT3duZWQgPGVtPlhtbCBQcml2YXRlIE93bmVkPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpdmF0ZU93bmVkKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BSSVZBVEVfT1dORUQgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJpdmF0ZU93bmVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcml2YXRlIE93bmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUFJJVkFURV9PV05FRF9fUFJJVkFURV9PV05FRCA9IGVJTlNUQU5DRS5nZXRYbWxQcml2YXRlT3duZWRfUHJpdmF0ZU93bmVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkgPGVtPlhtbCBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QUk9QRVJUWV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eV9OYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BST1BFUlRZX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eV9WYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BST1BFUlRZX19WQUxVRV9UWVBFID0gZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5X1ZhbHVlVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Q29udGFpbmVyIDxlbT5YbWwgUHJvcGVydHkgQ29udGFpbmVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Q29udGFpbmVyCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QUk9QRVJUWV9DT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIgPGVtPlhtbCBRdWVyeSBDb250YWluZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1FVRVJZX0NPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSA8ZW0+WG1sIFJlYWQgT25seTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUmVhZE9ubHkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUkVBRF9PTkxZID0gZUlOU1RBTkNFLmdldFhtbFJlYWRPbmx5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9SRUFEX09OTFlfX1JFQURfT05MWSA9IGVJTlNUQU5DRS5nZXRYbWxSZWFkT25seV9SZWFkT25seSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciA8ZW0+WG1sIFN0b3JlZCBQcm9jZWR1cmUgUGFyYW1ldGVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSID0gZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlyZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0RJUkVDVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfRGlyZWN0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX05hbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5IFBhcmFtZXRlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19RVUVSWV9QQVJBTUVURVIgPSBlSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX1F1ZXJ5UGFyYW1ldGVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX1R5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpkYmMgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KZGJjIFR5cGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfSmRiY1R5cGVOYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyIDxlbT5YbWwgU3RydWN0IENvbnZlcnRlcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXIKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0cnVjdENvbnZlcnRlcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TVFJVQ1RfQ09OVkVSVEVSID0gZUlOU1RBTkNFLmdldFhtbFN0cnVjdENvbnZlcnRlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSID0gZUlOU1RBTkNFLmdldFhtbFN0cnVjdENvbnZlcnRlcl9Db252ZXJ0ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkgPGVtPlhtbCBUaW1lIE9mIERheTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRpbWVPZkRheSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9USU1FX09GX0RBWSA9IGVJTlNUQU5DRS5nZXRYbWxUaW1lT2ZEYXkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhvdXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9USU1FX09GX0RBWV9fSE9VUiA9IGVJTlNUQU5DRS5nZXRYbWxUaW1lT2ZEYXlfSG91cigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWludXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVElNRV9PRl9EQVlfX01JTlVURSA9IGVJTlNUQU5DRS5nZXRYbWxUaW1lT2ZEYXlfTWludXRlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWNvbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9USU1FX09GX0RBWV9fU0VDT05EID0gZUlOU1RBTkNFLmdldFhtbFRpbWVPZkRheV9TZWNvbmQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1pbGxpc2Vjb25kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVElNRV9PRl9EQVlfX01JTExJU0VDT05EID0gZUlOU1RBTkNFLmdldFhtbFRpbWVPZkRheV9NaWxsaXNlY29uZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uIDxlbT5YbWwgVHJhbnNmb3JtYXRpb248L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNmb3JtYXRpb24KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRyYW5zZm9ybWF0aW9uKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1RSQU5TRk9STUFUSU9OID0gZUlOU1RBTkNFLmdldFhtbFRyYW5zZm9ybWF0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IDxlbT5YbWwgVHJhbnNpZW50PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHJhbnNpZW50KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1RSQU5TSUVOVCA9IGVJTlNUQU5DRS5nZXRYbWxUcmFuc2llbnQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyIDxlbT5YbWwgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHlwZUNvbnZlcnRlcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9UWVBFX0NPTlZFUlRFUiA9IGVJTlNUQU5DRS5nZXRYbWxUeXBlQ29udmVydGVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFID0gZUlOU1RBTkNFLmdldFhtbFR5cGVDb252ZXJ0ZXJfRGF0YVR5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFID0gZUlOU1RBTkNFLmdldFhtbFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUgPGVtPlhtbCBWYXJpYWJsZSBPbmUgVG8gT25lPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZhcmlhYmxlT25lVG9PbmUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVkFSSUFCTEVfT05FX1RPX09ORSA9IGVJTlNUQU5DRS5nZXRYbWxWYXJpYWJsZU9uZVRvT25lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiA8ZW0+WG1sIFZlcnNpb248L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9WRVJTSU9OID0gZUlOU1RBTkNFLmdldFhtbFZlcnNpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUgPGVtPkNhY2hlIENvb3JkaW5hdGlvbiBUeXBlPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRDYWNoZUNvb3JkaW5hdGlvblR5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIENBQ0hFX0NPT1JESU5BVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldENhY2hlQ29vcmRpbmF0aW9uVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZSA8ZW0+Q2FjaGUgVHlwZTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0Q2FjaGVUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBDQUNIRV9UWVBFID0gZUlOU1RBTkNFLmdldENhY2hlVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZSA8ZW0+WG1sIENoYW5nZSBUcmFja2luZyBUeXBlPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZ1R5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIFhNTF9DSEFOR0VfVFJBQ0tJTkdfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxDaGFuZ2VUcmFja2luZ1R5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXJlY3Rpb24gPGVtPlhtbCBEaXJlY3Rpb248L2VtPn0nIGVudW0uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXJlY3Rpb24KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbERpcmVjdGlvbigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gWE1MX0RJUkVDVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxEaXJlY3Rpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlIDxlbT5FeGlzdGVuY2UgVHlwZTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldEV4aXN0ZW5jZVR5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIEVYSVNURU5DRV9UWVBFID0gZUlOU1RBTkNFLmdldEV4aXN0ZW5jZVR5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlIDxlbT5YbWwgSm9pbiBGZXRjaCBUeXBlPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoVHlwZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gWE1MX0pPSU5fRkVUQ0hfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxKb2luRmV0Y2hUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIDxlbT5YbWwgT3B0aW1pc3RpYyBMb2NraW5nIFR5cGU8L2VtPn0nIGVudW0uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gWE1MX09QVElNSVNUSUNfTE9DS0lOR19UWVBFID0gZUlOU1RBTkNFLmdldFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSgpOworCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybVhtbFJlc291cmNlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybVhtbFJlc291cmNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NzY4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OworCisvKioKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeQoreworCXB1YmxpYyBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlRmFjdG9yeSgpIHsKKwkJdGhpcyhSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKKwl9CisJCisJcHVibGljIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFSZW5kZXJlckZhY3RvcnkpOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnksIGJvb2xlYW4gbGlzdGVuaW5nRm9yVXBkYXRlcykgeworCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5LCBsaXN0ZW5pbmdGb3JVcGRhdGVzKTsKKwl9CisJCisJCisJLyoqCisJICogQHNlZSBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5I2NyZWF0ZVJlc291cmNlKFVSSSwgUmVuZGVyZXIpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciByZW5kZXJlcikgeworCQlyZXR1cm4gbmV3IEpwYVhtbFJlc291cmNlKHVyaSwgcmVuZGVyZXIsIEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgWG1sRW50aXR5TWFwcGluZ3MuZ2V0Um9vdFRyYW5zbGF0b3IoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FeGlzdGVuY2VUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0V4aXN0ZW5jZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWE2MzBlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FeGlzdGVuY2VUeXBlLmphdmEKQEAgLTAsMCArMSwyOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5FeGlzdGVuY2UgVHlwZTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqIAorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0RXhpc3RlbmNlVHlwZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gRXhpc3RlbmNlVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKK3sKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DSEVDSyBDQUNIRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDSEVDS19DQUNIRV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUNIRUNLX0NBQ0hFKDAsICJDSEVDS19DQUNIRSIsICJDSEVDS19DQUNIRSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q0hFQ0sgREFUQUJBU0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ0hFQ0tfREFUQUJBU0VfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDSEVDS19EQVRBQkFTRSgxLCAiQ0hFQ0tfREFUQUJBU0UiLCAiQ0hFQ0tfREFUQUJBU0UiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFTU1VNRSBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQVNTVU1FX0VYSVNURU5DRV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUFTU1VNRV9FWElTVEVOQ0UoMiwgIkFTU1VNRV9FWElTVEVOQ0UiLCAiQVNTVU1FX0VYSVNURU5DRSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+QVNTVU1FIE5PTiBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQVNTVU1FX05PTl9FWElTVEVOQ0VfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlBU1NVTUVfTk9OX0VYSVNURU5DRSgzLCAiQVNTVU1FX05PTl9FWElTVEVOQ0UiLCAiQVNTVU1FX05PTl9FWElTVEVOQ0UiKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNIRUNLIENBQ0hFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DSEVDSyBDQUNIRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDSEVDS19DQUNIRQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIRUNLX0NBQ0hFX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNIRUNLIERBVEFCQVNFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DSEVDSyBEQVRBQkFTRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDSEVDS19EQVRBQkFTRQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIRUNLX0RBVEFCQVNFX1ZBTFVFID0gMTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFTU1VNRSBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFTU1VNRSBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQVNTVU1FX0VYSVNURU5DRQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTU1VNRV9FWElTVEVOQ0VfVkFMVUUgPSAyOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+QVNTVU1FIE5PTiBFWElTVEVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFTU1VNRSBOT04gRVhJU1RFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0FTU1VNRV9OT05fRVhJU1RFTkNFCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTVU1FX05PTl9FWElTVEVOQ0VfVkFMVUUgPSAzOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeGlzdGVuY2VUeXBlW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IEV4aXN0ZW5jZVR5cGVbXQorCQl7CisJCQlDSEVDS19DQUNIRSwKKwkJCUNIRUNLX0RBVEFCQVNFLAorCQkJQVNTVU1FX0VYSVNURU5DRSwKKwkJCUFTU1VNRV9OT05fRVhJU1RFTkNFLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8RXhpc3RlbmNlVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEV4aXN0ZW5jZVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCisJCXsKKwkJCUV4aXN0ZW5jZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKKwkJCXsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RXhpc3RlbmNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBFeGlzdGVuY2VUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKKwl7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQorCQl7CisJCQlFeGlzdGVuY2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKKwkJCXsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RXhpc3RlbmNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBFeGlzdGVuY2VUeXBlIGdldChpbnQgdmFsdWUpCisJeworCQlzd2l0Y2ggKHZhbHVlKQorCQl7CisJCQljYXNlIENIRUNLX0NBQ0hFX1ZBTFVFOiByZXR1cm4gQ0hFQ0tfQ0FDSEU7CisJCQljYXNlIENIRUNLX0RBVEFCQVNFX1ZBTFVFOiByZXR1cm4gQ0hFQ0tfREFUQUJBU0U7CisJCQljYXNlIEFTU1VNRV9FWElTVEVOQ0VfVkFMVUU6IHJldHVybiBBU1NVTUVfRVhJU1RFTkNFOworCQkJY2FzZSBBU1NVTUVfTk9OX0VYSVNURU5DRV9WQUxVRTogcmV0dXJuIEFTU1VNRV9OT05fRVhJU1RFTkNFOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFeGlzdGVuY2VUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQorCXsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQorCXsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCisJeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9FeGlzdGVuY2VUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFjY2Vzc01ldGhvZHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQWNjZXNzTWV0aG9kcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZTA5NzkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFjY2Vzc01ldGhvZHMuamF2YQpAQCAtMCwwICsxLDI4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEFjY2VzcyBNZXRob2RzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzI2dldEdldE1ldGhvZCA8ZW0+R2V0IE1ldGhvZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMjZ2V0U2V0TWV0aG9kIDxlbT5TZXQgTWV0aG9kPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHMoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgWG1sQWNjZXNzTWV0aG9kcyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2V0TWV0aG9kKCkgPGVtPkdldCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEdldE1ldGhvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX01FVEhPRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHZXRNZXRob2QoKSA8ZW0+R2V0IE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0R2V0TWV0aG9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldE1ldGhvZCA9IEdFVF9NRVRIT0RfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2V0TWV0aG9kKCkgPGVtPlNldCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNldE1ldGhvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX01FVEhPRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXRNZXRob2QoKSA8ZW0+U2V0IE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2V0TWV0aG9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHNldE1ldGhvZCA9IFNFVF9NRVRIT0RfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcygpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0FDQ0VTU19NRVRIT0RTOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdldCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdldCBNZXRob2Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R2V0IE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0R2V0TWV0aG9kKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc19HZXRNZXRob2QoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRHZXRNZXRob2QoKQorCXsKKwkJcmV0dXJuIGdldE1ldGhvZDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyNnZXRHZXRNZXRob2QgPGVtPkdldCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdldCBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEdldE1ldGhvZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEdldE1ldGhvZChTdHJpbmcgbmV3R2V0TWV0aG9kKQorCXsKKwkJU3RyaW5nIG9sZEdldE1ldGhvZCA9IGdldE1ldGhvZDsKKwkJZ2V0TWV0aG9kID0gbmV3R2V0TWV0aG9kOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9ELCBvbGRHZXRNZXRob2QsIGdldE1ldGhvZCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNldCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNldCBNZXRob2Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2V0IE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U2V0TWV0aG9kKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc19TZXRNZXRob2QoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRTZXRNZXRob2QoKQorCXsKKwkJcmV0dXJuIHNldE1ldGhvZDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyNnZXRTZXRNZXRob2QgPGVtPlNldCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNldCBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFNldE1ldGhvZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNldE1ldGhvZChTdHJpbmcgbmV3U2V0TWV0aG9kKQorCXsKKwkJU3RyaW5nIG9sZFNldE1ldGhvZCA9IHNldE1ldGhvZDsKKwkJc2V0TWV0aG9kID0gbmV3U2V0TWV0aG9kOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9ELCBvbGRTZXRNZXRob2QsIHNldE1ldGhvZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9EOgorCQkJCXJldHVybiBnZXRHZXRNZXRob2QoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRDoKKwkJCQlyZXR1cm4gZ2V0U2V0TWV0aG9kKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9EOgorCQkJCXNldEdldE1ldGhvZCgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfX1NFVF9NRVRIT0Q6CisJCQkJc2V0U2V0TWV0aG9kKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19fR0VUX01FVEhPRDoKKwkJCQlzZXRHZXRNZXRob2QoR0VUX01FVEhPRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9EOgorCQkJCXNldFNldE1ldGhvZChTRVRfTUVUSE9EX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9EOgorCQkJCXJldHVybiBHRVRfTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBnZXRNZXRob2QgIT0gbnVsbCA6ICFHRVRfTUVUSE9EX0VERUZBVUxULmVxdWFscyhnZXRNZXRob2QpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9EOgorCQkJCXJldHVybiBTRVRfTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBzZXRNZXRob2QgIT0gbnVsbCA6ICFTRVRfTUVUSE9EX0VERUZBVUxULmVxdWFscyhzZXRNZXRob2QpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChnZXRNZXRob2Q6ICIpOworCQlyZXN1bHQuYXBwZW5kKGdldE1ldGhvZCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgc2V0TWV0aG9kOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChzZXRNZXRob2QpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGRHZXRNZXRob2RUcmFuc2xhdG9yKCksCisJCQlidWlsZFNldE1ldGhvZFRyYW5zbGF0b3IoKSwKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkR2V0TWV0aG9kVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9ELCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNfR2V0TWV0aG9kKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNldE1ldGhvZFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzX1NldE1ldGhvZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKK30gLy8gWG1sQWNjZXNzTWV0aG9kcwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzNjZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQWNjZXNzIE1ldGhvZHMgSG9sZGVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgZXh0ZW5kcyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIHZhbHVlKTsKKworfSAvLyBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NzY3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvYj48L2VtPicuCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxBdHRyaWJ1dGVNYXBwaW5nIAorCWV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcsIAorCQkJWG1sQWNjZXNzTWV0aG9kc0hvbGRlciwgWG1sUHJvcGVydHlDb250YWluZXIKK3sKK30gLy8gWG1sQXR0cmlidXRlTWFwcGluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpYy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MzU4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljLmphdmEKQEAgLTAsMCArMSwxMjMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sQmFzaWNfMV8xOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEJhc2ljPC9iPjwvZW0+Jy4KKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbEJhc2ljIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljIGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sTXV0YWJsZSwgWG1sQ29udmVydGlibGVNYXBwaW5nLCBYbWxCYXNpY18xXzEKK3sKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE11dGFibGUoKSA8ZW0+TXV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TXV0YWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIE1VVEFCTEVfRURFRkFVTFQgPSBudWxsOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE11dGFibGUoKSA8ZW0+TXV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TXV0YWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJvb2xlYW4gbXV0YWJsZSA9IE1VVEFCTEVfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVyKCkgPGVtPkNvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ29udmVydGVyIGNvbnZlcnRlcjsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlQ29udmVydGVyKCkgPGVtPlR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sVHlwZUNvbnZlcnRlciB0eXBlQ29udmVydGVyOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBvYmplY3RUeXBlQ29udmVydGVyOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdENvbnZlcnRlcigpIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxTdHJ1Y3RDb252ZXJ0ZXIgc3RydWN0Q29udmVydGVyOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0KCkgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbnZlcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRfRURFRkFVTFQgPSBudWxsOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnQoKSA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29udmVydCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0ID0gQ09OVkVSVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkgPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZUdlbmVyYXRvcigpIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRhYmxlR2VuZXJhdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3I7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2VuZXJhdGVkVmFsdWUoKSA8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRHZW5lcmF0ZWRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbEdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbEJhc2ljKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQkFTSUM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXV0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNdXRhYmxlKEJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE11dGFibGVfTXV0YWJsZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvb2xlYW4gZ2V0TXV0YWJsZSgpCisJeworCQlyZXR1cm4gbXV0YWJsZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0TXV0YWJsZSA8ZW0+TXV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TXV0YWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE11dGFibGUoQm9vbGVhbiBuZXdNdXRhYmxlKQorCXsKKwkJQm9vbGVhbiBvbGRNdXRhYmxlID0gbXV0YWJsZTsKKwkJbXV0YWJsZSA9IG5ld011dGFibGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX01VVEFCTEUsIG9sZE11dGFibGUsIG11dGFibGUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENvbnZlcnQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfQ29udmVydCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydCgpCisJeworCQlyZXR1cm4gY29udmVydDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0Q29udmVydCA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Q29udmVydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbnZlcnQoU3RyaW5nIG5ld0NvbnZlcnQpCisJeworCQlTdHJpbmcgb2xkQ29udmVydCA9IGNvbnZlcnQ7CisJCWNvbnZlcnQgPSBuZXdDb252ZXJ0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJULCBvbGRDb252ZXJ0LCBjb252ZXJ0KSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1NlcXVlbmNlR2VuZXJhdG9yKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxTZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpCisJeworCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBvbGRTZXF1ZW5jZUdlbmVyYXRvciA9IHNlcXVlbmNlR2VuZXJhdG9yOworCQlzZXF1ZW5jZUdlbmVyYXRvciA9IG5ld1NlcXVlbmNlR2VuZXJhdG9yOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1IsIG9sZFNlcXVlbmNlR2VuZXJhdG9yLCBuZXdTZXF1ZW5jZUdlbmVyYXRvcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFNlcXVlbmNlR2VuZXJhdG9yIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvciBuZXdTZXF1ZW5jZUdlbmVyYXRvcikKKwl7CisJCWlmIChuZXdTZXF1ZW5jZUdlbmVyYXRvciAhPSBzZXF1ZW5jZUdlbmVyYXRvcikKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoc2VxdWVuY2VHZW5lcmF0b3IgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc2VxdWVuY2VHZW5lcmF0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1NlcXVlbmNlR2VuZXJhdG9yICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NlcXVlbmNlR2VuZXJhdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUiwgbmV3U2VxdWVuY2VHZW5lcmF0b3IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1RhYmxlR2VuZXJhdG9yKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxUYWJsZUdlbmVyYXRvciBnZXRUYWJsZUdlbmVyYXRvcigpCisJeworCQlyZXR1cm4gdGFibGVHZW5lcmF0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IgbmV3VGFibGVHZW5lcmF0b3IsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxUYWJsZUdlbmVyYXRvciBvbGRUYWJsZUdlbmVyYXRvciA9IHRhYmxlR2VuZXJhdG9yOworCQl0YWJsZUdlbmVyYXRvciA9IG5ld1RhYmxlR2VuZXJhdG9yOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1IsIG9sZFRhYmxlR2VuZXJhdG9yLCBuZXdUYWJsZUdlbmVyYXRvcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFRhYmxlR2VuZXJhdG9yIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0VGFibGVHZW5lcmF0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciBuZXdUYWJsZUdlbmVyYXRvcikKKwl7CisJCWlmIChuZXdUYWJsZUdlbmVyYXRvciAhPSB0YWJsZUdlbmVyYXRvcikKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAodGFibGVHZW5lcmF0b3IgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdGFibGVHZW5lcmF0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1RhYmxlR2VuZXJhdG9yICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RhYmxlR2VuZXJhdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEFCTEVfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFRhYmxlR2VuZXJhdG9yKG5ld1RhYmxlR2VuZXJhdG9yLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUiwgbmV3VGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R2VuZXJhdGVkIFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRHZW5lcmF0ZWRWYWx1ZShYbWxHZW5lcmF0ZWRWYWx1ZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNfMV8xX0dlbmVyYXRlZFZhbHVlKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxHZW5lcmF0ZWRWYWx1ZSBnZXRHZW5lcmF0ZWRWYWx1ZSgpCisJeworCQlyZXR1cm4gZ2VuZXJhdGVkVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0R2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUgbmV3R2VuZXJhdGVkVmFsdWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxHZW5lcmF0ZWRWYWx1ZSBvbGRHZW5lcmF0ZWRWYWx1ZSA9IGdlbmVyYXRlZFZhbHVlOworCQlnZW5lcmF0ZWRWYWx1ZSA9IG5ld0dlbmVyYXRlZFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUUsIG9sZEdlbmVyYXRlZFZhbHVlLCBuZXdHZW5lcmF0ZWRWYWx1ZSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEdlbmVyYXRlZFZhbHVlIDxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0R2VuZXJhdGVkVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWRWYWx1ZShYbWxHZW5lcmF0ZWRWYWx1ZSBuZXdHZW5lcmF0ZWRWYWx1ZSkKKwl7CisJCWlmIChuZXdHZW5lcmF0ZWRWYWx1ZSAhPSBnZW5lcmF0ZWRWYWx1ZSkKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZ2VuZXJhdGVkVmFsdWUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUUsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0dlbmVyYXRlZFZhbHVlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0dlbmVyYXRlZFZhbHVlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEdlbmVyYXRlZFZhbHVlKG5ld0dlbmVyYXRlZFZhbHVlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0dFTkVSQVRFRF9WQUxVRSwgbmV3R2VuZXJhdGVkVmFsdWUsIG5ld0dlbmVyYXRlZFZhbHVlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKKwl7CisJCXJldHVybiBhY2Nlc3NNZXRob2RzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKKwkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCisJeworCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQorCXsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKKwkJeworCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVMpOworCQl9CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q29udmVydGVyKFhtbENvbnZlcnRlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQ29udmVydGVyIGdldENvbnZlcnRlcigpCisJeworCQlyZXR1cm4gY29udmVydGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgbmV3Q29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sQ29udmVydGVyIG9sZENvbnZlcnRlciA9IGNvbnZlcnRlcjsKKwkJY29udmVydGVyID0gbmV3Q29udmVydGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVIsIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0Q29udmVydGVyIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Q29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFhtbENvbnZlcnRlciBuZXdDb252ZXJ0ZXIpCisJeworCQlpZiAobmV3Q29udmVydGVyICE9IGNvbnZlcnRlcikKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoY29udmVydGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q29udmVydGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRDb252ZXJ0ZXIobmV3Q29udmVydGVyLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlRFUiwgbmV3Q29udmVydGVyLCBuZXdDb252ZXJ0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX1R5cGVDb252ZXJ0ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpCisJeworCQlyZXR1cm4gdHlwZUNvbnZlcnRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgbmV3VHlwZUNvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbFR5cGVDb252ZXJ0ZXIgb2xkVHlwZUNvbnZlcnRlciA9IHR5cGVDb252ZXJ0ZXI7CisJCXR5cGVDb252ZXJ0ZXIgPSBuZXdUeXBlQ29udmVydGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUiwgb2xkVHlwZUNvbnZlcnRlciwgbmV3VHlwZUNvbnZlcnRlcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFR5cGVDb252ZXJ0ZXIgPGVtPlR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyKQorCXsKKwkJaWYgKG5ld1R5cGVDb252ZXJ0ZXIgIT0gdHlwZUNvbnZlcnRlcikKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAodHlwZUNvbnZlcnRlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0eXBlQ29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1R5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VHlwZUNvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFR5cGVDb252ZXJ0ZXIobmV3VHlwZUNvbnZlcnRlciwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUiwgbmV3VHlwZUNvbnZlcnRlciwgbmV3VHlwZUNvbnZlcnRlcikpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKKwl7CisJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBuZXdPYmplY3RUeXBlQ29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBvbGRPYmplY3RUeXBlQ29udmVydGVyID0gb2JqZWN0VHlwZUNvbnZlcnRlcjsKKwkJb2JqZWN0VHlwZUNvbnZlcnRlciA9IG5ld09iamVjdFR5cGVDb252ZXJ0ZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgb2xkT2JqZWN0VHlwZUNvbnZlcnRlciwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIpCisJeworCQlpZiAobmV3T2JqZWN0VHlwZUNvbnZlcnRlciAhPSBvYmplY3RUeXBlQ29udmVydGVyKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChvYmplY3RUeXBlQ29udmVydGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW9iamVjdFR5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBuZXdPYmplY3RUeXBlQ29udmVydGVyLCBuZXdPYmplY3RUeXBlQ29udmVydGVyKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IEN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxTdHJ1Y3RDb252ZXJ0ZXIgZ2V0U3RydWN0Q29udmVydGVyKCkKKwl7CisJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciBuZXdTdHJ1Y3RDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgb2xkU3RydWN0Q29udmVydGVyID0gc3RydWN0Q29udmVydGVyOworCQlzdHJ1Y3RDb252ZXJ0ZXIgPSBuZXdTdHJ1Y3RDb252ZXJ0ZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVIsIG9sZFN0cnVjdENvbnZlcnRlciwgbmV3U3RydWN0Q29udmVydGVyKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0U3RydWN0Q29udmVydGVyIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIG5ld1N0cnVjdENvbnZlcnRlcikKKwl7CisJCWlmIChuZXdTdHJ1Y3RDb252ZXJ0ZXIgIT0gc3RydWN0Q29udmVydGVyKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChzdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc3RydWN0Q29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU1RSVUNUX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3U3RydWN0Q29udmVydGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1N0cnVjdENvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVIsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG5ld1N0cnVjdENvbnZlcnRlciwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIsIG5ld1N0cnVjdENvbnZlcnRlcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRDb252ZXJ0ZXIobnVsbCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RZUEVfQ09OVkVSVEVSOgorCQkJCXJldHVybiBiYXNpY1NldFR5cGVDb252ZXJ0ZXIobnVsbCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSOgorCQkJCXJldHVybiBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihudWxsLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SOgorCQkJCXJldHVybiBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1I6CisJCQkJcmV0dXJuIGJhc2ljU2V0VGFibGVHZW5lcmF0b3IobnVsbCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0dFTkVSQVRFRF9WQUxVRToKKwkJCQlyZXR1cm4gYmFzaWNTZXRHZW5lcmF0ZWRWYWx1ZShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTVVUQUJMRToKKwkJCQlyZXR1cm4gZ2V0TXV0YWJsZSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVI6CisJCQkJcmV0dXJuIGdldENvbnZlcnRlcigpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcigpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6CisJCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU1RSVUNUX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gZ2V0U3RydWN0Q29udmVydGVyKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlQ6CisJCQkJcmV0dXJuIGdldENvbnZlcnQoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SOgorCQkJCXJldHVybiBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1I6CisJCQkJcmV0dXJuIGdldFRhYmxlR2VuZXJhdG9yKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0dFTkVSQVRFRF9WQUxVRToKKwkJCQlyZXR1cm4gZ2V0R2VuZXJhdGVkVmFsdWUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUFJPUEVSVElFUzoKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTVVUQUJMRToKKwkJCQlzZXRNdXRhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlRFUjoKKwkJCQlzZXRDb252ZXJ0ZXIoKFhtbENvbnZlcnRlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUjoKKwkJCQlzZXRUeXBlQ29udmVydGVyKChYbWxUeXBlQ29udmVydGVyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKKwkJCQlzZXRPYmplY3RUeXBlQ29udmVydGVyKChYbWxPYmplY3RUeXBlQ29udmVydGVyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVI6CisJCQkJc2V0U3RydWN0Q29udmVydGVyKChYbWxTdHJ1Y3RDb252ZXJ0ZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVDoKKwkJCQlzZXRDb252ZXJ0KChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SOgorCQkJCXNldFNlcXVlbmNlR2VuZXJhdG9yKChYbWxTZXF1ZW5jZUdlbmVyYXRvciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1I6CisJCQkJc2V0VGFibGVHZW5lcmF0b3IoKFhtbFRhYmxlR2VuZXJhdG9yKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0dFTkVSQVRFRF9WQUxVRToKKwkJCQlzZXRHZW5lcmF0ZWRWYWx1ZSgoWG1sR2VuZXJhdGVkVmFsdWUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQUNDRVNTX01FVEhPRFM6CisJCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19NVVRBQkxFOgorCQkJCXNldE11dGFibGUoTVVUQUJMRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVI6CisJCQkJc2V0Q29udmVydGVyKChYbWxDb252ZXJ0ZXIpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUjoKKwkJCQlzZXRUeXBlQ29udmVydGVyKChYbWxUeXBlQ29udmVydGVyKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgorCQkJCXNldE9iamVjdFR5cGVDb252ZXJ0ZXIoKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSOgorCQkJCXNldFN0cnVjdENvbnZlcnRlcigoWG1sU3RydWN0Q29udmVydGVyKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVDoKKwkJCQlzZXRDb252ZXJ0KENPTlZFUlRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SOgorCQkJCXNldFNlcXVlbmNlR2VuZXJhdG9yKChYbWxTZXF1ZW5jZUdlbmVyYXRvciludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUjoKKwkJCQlzZXRUYWJsZUdlbmVyYXRvcigoWG1sVGFibGVHZW5lcmF0b3IpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUU6CisJCQkJc2V0R2VuZXJhdGVkVmFsdWUoKFhtbEdlbmVyYXRlZFZhbHVlKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX01VVEFCTEU6CisJCQkJcmV0dXJuIE1VVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IG11dGFibGUgIT0gbnVsbCA6ICFNVVRBQkxFX0VERUZBVUxULmVxdWFscyhtdXRhYmxlKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVEVSOgorCQkJCXJldHVybiBjb252ZXJ0ZXIgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVI6CisJCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXIgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgorCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVI6CisJCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlciAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJUOgorCQkJCXJldHVybiBDT05WRVJUX0VERUZBVUxUID09IG51bGwgPyBjb252ZXJ0ICE9IG51bGwgOiAhQ09OVkVSVF9FREVGQVVMVC5lcXVhbHMoY29udmVydCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUjoKKwkJCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3IgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEFCTEVfR0VORVJBVE9SOgorCQkJCXJldHVybiB0YWJsZUdlbmVyYXRvciAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUU6CisJCQkJcmV0dXJuIGdlbmVyYXRlZFZhbHVlICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbE11dGFibGUuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX01VVEFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VVEFCTEVfX01VVEFCTEU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVySG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQ7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sR2VuZXJhdG9yQ29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19TRVFVRU5DRV9HRU5FUkFUT1I7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19UQUJMRV9HRU5FUkFUT1I7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzaWNfMV8xLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUU6IHJldHVybiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9CQVNJQ18xMV9fR0VORVJBVEVEX1ZBTFVFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQUNDRVNTX01FVEhPRFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUFJPUEVSVElFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sTXV0YWJsZS5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVVRBQkxFX19NVVRBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTVVUQUJMRTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVEVSOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RZUEVfQ09OVkVSVEVSOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19PQkpFQ1RfVFlQRV9DT05WRVJURVI7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX1NUUlVDVF9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVDsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxHZW5lcmF0b3JDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1NFUVVFTkNFX0dFTkVSQVRPUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUjsKKwkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXNpY18xXzEuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuWE1MX0JBU0lDXzExX19HRU5FUkFURURfVkFMVUU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChtdXRhYmxlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtdXRhYmxlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBjb252ZXJ0OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChjb252ZXJ0KTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRNdXRhYmxlVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEVjbGlwc2VMaW5rLk1VVEFCTEUpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkNPTlZFUlQpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJZWxlbWVudE5hbWUsIAorCQkJc3RydWN0dXJhbEZlYXR1cmUsIAorCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXNpYygpLCAKKwkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRGZXRjaFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkT3B0aW9uYWxUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTXV0YWJsZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ29sdW1uVHJhbnNsYXRvcigpLCAKKwkJCWJ1aWxkR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yKCksIAorCQkJYnVpbGRMb2JUcmFuc2xhdG9yKCksCisJCQlidWlsZFRlbXBvcmFsVHJhbnNsYXRvcigpLAorCQkJYnVpbGRFbnVtZXJhdGVkVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpLAorCQkJYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCisJCQlidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCisJCQlidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCisJCQlidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKCksCisJCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNdXRhYmxlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk1VVEFCTEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTXV0YWJsZV9NdXRhYmxlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEdlbmVyYXRlZFZhbHVlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbEdlbmVyYXRlZFZhbHVlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazFfMS5HRU5FUkFURURfVkFMVUUsIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2ljXzFfMV9HZW5lcmF0ZWRWYWx1ZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxPYmplY3RUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX1N0cnVjdENvbnZlcnRlcigpKTsKKwl9CisJCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFRhYmxlR2VuZXJhdG9yLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazFfMS5UQUJMRV9HRU5FUkFUT1IsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9UYWJsZUdlbmVyYXRvcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sU2VxdWVuY2VHZW5lcmF0b3IuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMV8xLlNFUVVFTkNFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1NlcXVlbmNlR2VuZXJhdG9yKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpY0NvbGxlY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWNDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyZmJmZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWNDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSwzNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmFzaWMgQ29sbGVjdGlvbiBJbXBsPC9iPjwvZW0+Jy4KKyAqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4gKgorICoKKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNDb2xsZWN0aW9uKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbEJhc2ljQ29sbGVjdGlvbiBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcKK3sKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxCYXNpY0NvbGxlY3Rpb24oKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9CQVNJQ19DT0xMRUNUSU9OOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQorCXsKKwkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOworCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbiNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKKwl7CisJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCisJeworCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQorCQl7CisJCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTKTsKKwkJfQorCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6CisJCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTOgorCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOworCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpCisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpY01hcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpY01hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YmQ2YmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljTWFwLmphdmEKQEAgLTAsMCArMSwzNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmFzaWMgTWFwIEltcGw8L2I+PC9lbT4nLgorICoKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiAqCisgKgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpY01hcCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxCYXNpY01hcCBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcKK3sKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxCYXNpY01hcCgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0JBU0lDX01BUDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKKwl7CisJCXJldHVybiBhY2Nlc3NNZXRob2RzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKKwkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQorCXsKKwkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKKwl7CisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCisJCXsKKwkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fUFJPUEVSVElFUyk7CisJCX0KKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFM6CisJCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fUFJPUEVSVElFUzoKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fUFJPUEVSVElFUzoKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFM6CisJCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19NQVBfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2FjaGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDg3NjBkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDYWNoZS5qYXZhCkBAIC0wLDAgKzEsODQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENhY2hlPC9iPjwvZW0+Jy4KKyAqIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0RXhwaXJ5IDxlbT5FeHBpcnk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRTaXplIDxlbT5TaXplPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0U2hhcmVkIDxlbT5TaGFyZWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0QWx3YXlzUmVmcmVzaCA8ZW0+QWx3YXlzIFJlZnJlc2g8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRSZWZyZXNoT25seUlmTmV3ZXIgPGVtPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldERpc2FibGVIaXRzIDxlbT5EaXNhYmxlIEhpdHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRDb29yZGluYXRpb25UeXBlIDxlbT5Db29yZGluYXRpb24gVHlwZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeVRpbWVPZkRheSA8ZW0+RXhwaXJ5IFRpbWUgT2YgRGF5PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbENhY2hlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHBpcnkoKSA8ZW0+RXhwaXJ5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFeHBpcnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBFWFBJUllfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhwaXJ5KCkgPGVtPkV4cGlyeTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RXhwaXJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSW50ZWdlciBleHBpcnkgPSBFWFBJUllfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZSgpIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgU0laRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaXplKCkgPGVtPlNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyIHNpemUgPSBTSVpFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNoYXJlZCgpIDxlbT5TaGFyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNoYXJlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaGFyZWQoKSA8ZW0+U2hhcmVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTaGFyZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb29sZWFuIHNoYXJlZCA9IFNIQVJFRF9FREVGQVVMVDsKKworCS8qKgorCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAorCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENhY2hlVHlwZSBUWVBFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIENhY2hlVHlwZSB0eXBlID0gVFlQRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHdheXNSZWZyZXNoKCkgPGVtPkFsd2F5cyBSZWZyZXNoPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBbHdheXNSZWZyZXNoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gQUxXQVlTX1JFRlJFU0hfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx3YXlzUmVmcmVzaCgpIDxlbT5BbHdheXMgUmVmcmVzaDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWx3YXlzUmVmcmVzaCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJvb2xlYW4gYWx3YXlzUmVmcmVzaCA9IEFMV0FZU19SRUZSRVNIX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZnJlc2hPbmx5SWZOZXdlcigpIDxlbT5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlZnJlc2hPbmx5SWZOZXdlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFJFRlJFU0hfT05MWV9JRl9ORVdFUl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZyZXNoT25seUlmTmV3ZXIoKSA8ZW0+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWZyZXNoT25seUlmTmV3ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlciA9IFJFRlJFU0hfT05MWV9JRl9ORVdFUl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNhYmxlSGl0cygpIDxlbT5EaXNhYmxlIEhpdHM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERpc2FibGVIaXRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gRElTQUJMRV9ISVRTX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc2FibGVIaXRzKCkgPGVtPkRpc2FibGUgSGl0czwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGlzYWJsZUhpdHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb29sZWFuIGRpc2FibGVIaXRzID0gRElTQUJMRV9ISVRTX0VERUZBVUxUOworCisJLyoqCisJICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0CisJICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2FjaGVDb29yZGluYXRpb25UeXBlIENPT1JESU5BVElPTl9UWVBFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvb3JkaW5hdGlvblR5cGUoKSA8ZW0+Q29vcmRpbmF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvb3JkaW5hdGlvblR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSA9IENPT1JESU5BVElPTl9UWVBFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhwaXJ5VGltZU9mRGF5KCkgPGVtPkV4cGlyeSBUaW1lIE9mIERheTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RXhwaXJ5VGltZU9mRGF5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sVGltZU9mRGF5IGV4cGlyeVRpbWVPZkRheTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxDYWNoZSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NBQ0hFOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4cGlyeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhwaXJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cGlyeTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RXhwaXJ5KEludGVnZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlX0V4cGlyeSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXRFeHBpcnkoKQorCXsKKwkJcmV0dXJuIGV4cGlyeTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0RXhwaXJ5IDxlbT5FeHBpcnk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cGlyeTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RXhwaXJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RXhwaXJ5KEludGVnZXIgbmV3RXhwaXJ5KQorCXsKKwkJSW50ZWdlciBvbGRFeHBpcnkgPSBleHBpcnk7CisJCWV4cGlyeSA9IG5ld0V4cGlyeTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRVhQSVJZLCBvbGRFeHBpcnksIGV4cGlyeSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U2l6ZShJbnRlZ2VyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZV9TaXplKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldFNpemUoKQorCXsKKwkJcmV0dXJuIHNpemU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFNpemUgPGVtPlNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaXplKEludGVnZXIgbmV3U2l6ZSkKKwl7CisJCUludGVnZXIgb2xkU2l6ZSA9IHNpemU7CisJCXNpemUgPSBuZXdTaXplOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSVpFLCBvbGRTaXplLCBzaXplKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2hhcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaGFyZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2hhcmVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRTaGFyZWQoQm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVfU2hhcmVkKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBnZXRTaGFyZWQoKQorCXsKKwkJcmV0dXJuIHNoYXJlZDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0U2hhcmVkIDxlbT5TaGFyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNoYXJlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0U2hhcmVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2hhcmVkKEJvb2xlYW4gbmV3U2hhcmVkKQorCXsKKwkJQm9vbGVhbiBvbGRTaGFyZWQgPSBzaGFyZWQ7CisJCXNoYXJlZCA9IG5ld1NoYXJlZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fU0hBUkVELCBvbGRTaGFyZWQsIHNoYXJlZCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlCisJICogQHNlZSAjc2V0VHlwZShDYWNoZVR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlX1R5cGUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ2FjaGVUeXBlIGdldFR5cGUoKQorCXsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZQorCSAqIEBzZWUgI2dldFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlKENhY2hlVHlwZSBuZXdUeXBlKQorCXsKKwkJQ2FjaGVUeXBlIG9sZFR5cGUgPSB0eXBlOworCQl0eXBlID0gbmV3VHlwZSA9PSBudWxsID8gVFlQRV9FREVGQVVMVCA6IG5ld1R5cGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbHdheXMgUmVmcmVzaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWx3YXlzIFJlZnJlc2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWx3YXlzIFJlZnJlc2g8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEFsd2F5c1JlZnJlc2goQm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVfQWx3YXlzUmVmcmVzaCgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvb2xlYW4gZ2V0QWx3YXlzUmVmcmVzaCgpCisJeworCQlyZXR1cm4gYWx3YXlzUmVmcmVzaDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0QWx3YXlzUmVmcmVzaCA8ZW0+QWx3YXlzIFJlZnJlc2g8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsd2F5cyBSZWZyZXNoPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRBbHdheXNSZWZyZXNoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuIG5ld0Fsd2F5c1JlZnJlc2gpCisJeworCQlCb29sZWFuIG9sZEFsd2F5c1JlZnJlc2ggPSBhbHdheXNSZWZyZXNoOworCQlhbHdheXNSZWZyZXNoID0gbmV3QWx3YXlzUmVmcmVzaDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fQUxXQVlTX1JFRlJFU0gsIG9sZEFsd2F5c1JlZnJlc2gsIGFsd2F5c1JlZnJlc2gpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZV9SZWZyZXNoT25seUlmTmV3ZXIoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb29sZWFuIGdldFJlZnJlc2hPbmx5SWZOZXdlcigpCisJeworCQlyZXR1cm4gcmVmcmVzaE9ubHlJZk5ld2VyOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRSZWZyZXNoT25seUlmTmV3ZXIgPGVtPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSZWZyZXNoT25seUlmTmV3ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiBuZXdSZWZyZXNoT25seUlmTmV3ZXIpCisJeworCQlCb29sZWFuIG9sZFJlZnJlc2hPbmx5SWZOZXdlciA9IHJlZnJlc2hPbmx5SWZOZXdlcjsKKwkJcmVmcmVzaE9ubHlJZk5ld2VyID0gbmV3UmVmcmVzaE9ubHlJZk5ld2VyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVIsIG9sZFJlZnJlc2hPbmx5SWZOZXdlciwgcmVmcmVzaE9ubHlJZk5ld2VyKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzYWJsZSBIaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNhYmxlIEhpdHM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzYWJsZSBIaXRzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREaXNhYmxlSGl0cyhCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZV9EaXNhYmxlSGl0cygpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvb2xlYW4gZ2V0RGlzYWJsZUhpdHMoKQorCXsKKwkJcmV0dXJuIGRpc2FibGVIaXRzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXREaXNhYmxlSGl0cyA8ZW0+RGlzYWJsZSBIaXRzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNhYmxlIEhpdHM8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERpc2FibGVIaXRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGlzYWJsZUhpdHMoQm9vbGVhbiBuZXdEaXNhYmxlSGl0cykKKwl7CisJCUJvb2xlYW4gb2xkRGlzYWJsZUhpdHMgPSBkaXNhYmxlSGl0czsKKwkJZGlzYWJsZUhpdHMgPSBuZXdEaXNhYmxlSGl0czsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRElTQUJMRV9ISVRTLCBvbGREaXNhYmxlSGl0cywgZGlzYWJsZUhpdHMpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db29yZGluYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvb3JkaW5hdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvb3JkaW5hdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUKKwkgKiBAc2VlICNzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVfQ29vcmRpbmF0aW9uVHlwZSgpCisJICogQG1vZGVsIGRlZmF1bHQ9IiIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRDb29yZGluYXRpb25UeXBlKCkKKwl7CisJCXJldHVybiBjb29yZGluYXRpb25UeXBlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRDb29yZGluYXRpb25UeXBlIDxlbT5Db29yZGluYXRpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29vcmRpbmF0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZQorCSAqIEBzZWUgI2dldENvb3JkaW5hdGlvblR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBuZXdDb29yZGluYXRpb25UeXBlKQorCXsKKwkJQ2FjaGVDb29yZGluYXRpb25UeXBlIG9sZENvb3JkaW5hdGlvblR5cGUgPSBjb29yZGluYXRpb25UeXBlOworCQljb29yZGluYXRpb25UeXBlID0gbmV3Q29vcmRpbmF0aW9uVHlwZSA9PSBudWxsID8gQ09PUkRJTkFUSU9OX1RZUEVfRURFRkFVTFQgOiBuZXdDb29yZGluYXRpb25UeXBlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19DT09SRElOQVRJT05fVFlQRSwgb2xkQ29vcmRpbmF0aW9uVHlwZSwgY29vcmRpbmF0aW9uVHlwZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4cGlyeSBUaW1lIE9mIERheTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhwaXJ5IFRpbWUgT2YgRGF5PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cGlyeSBUaW1lIE9mIERheTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0RXhwaXJ5VGltZU9mRGF5KFhtbFRpbWVPZkRheSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVfRXhwaXJ5VGltZU9mRGF5KCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxUaW1lT2ZEYXkgZ2V0RXhwaXJ5VGltZU9mRGF5KCkKKwl7CisJCXJldHVybiBleHBpcnlUaW1lT2ZEYXk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RXhwaXJ5VGltZU9mRGF5KFhtbFRpbWVPZkRheSBuZXdFeHBpcnlUaW1lT2ZEYXksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxUaW1lT2ZEYXkgb2xkRXhwaXJ5VGltZU9mRGF5ID0gZXhwaXJ5VGltZU9mRGF5OworCQlleHBpcnlUaW1lT2ZEYXkgPSBuZXdFeHBpcnlUaW1lT2ZEYXk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSwgb2xkRXhwaXJ5VGltZU9mRGF5LCBuZXdFeHBpcnlUaW1lT2ZEYXkpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRFeHBpcnlUaW1lT2ZEYXkgPGVtPkV4cGlyeSBUaW1lIE9mIERheTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhwaXJ5IFRpbWUgT2YgRGF5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRFeHBpcnlUaW1lT2ZEYXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFeHBpcnlUaW1lT2ZEYXkoWG1sVGltZU9mRGF5IG5ld0V4cGlyeVRpbWVPZkRheSkKKwl7CisJCWlmIChuZXdFeHBpcnlUaW1lT2ZEYXkgIT0gZXhwaXJ5VGltZU9mRGF5KQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChleHBpcnlUaW1lT2ZEYXkgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZXhwaXJ5VGltZU9mRGF5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdFeHBpcnlUaW1lT2ZEYXkgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RXhwaXJ5VGltZU9mRGF5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEV4cGlyeVRpbWVPZkRheShuZXdFeHBpcnlUaW1lT2ZEYXksIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZLCBuZXdFeHBpcnlUaW1lT2ZEYXksIG5ld0V4cGlyeVRpbWVPZkRheSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVk6CisJCQkJcmV0dXJuIGJhc2ljU2V0RXhwaXJ5VGltZU9mRGF5KG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRVhQSVJZOgorCQkJCXJldHVybiBnZXRFeHBpcnkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fU0laRToKKwkJCQlyZXR1cm4gZ2V0U2l6ZSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSEFSRUQ6CisJCQkJcmV0dXJuIGdldFNoYXJlZCgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19UWVBFOgorCQkJCXJldHVybiBnZXRUeXBlKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0FMV0FZU19SRUZSRVNIOgorCQkJCXJldHVybiBnZXRBbHdheXNSZWZyZXNoKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUjoKKwkJCQlyZXR1cm4gZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0RJU0FCTEVfSElUUzoKKwkJCQlyZXR1cm4gZ2V0RGlzYWJsZUhpdHMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEU6CisJCQkJcmV0dXJuIGdldENvb3JkaW5hdGlvblR5cGUoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZOgorCQkJCXJldHVybiBnZXRFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWToKKwkJCQlzZXRFeHBpcnkoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fU0laRToKKwkJCQlzZXRTaXplKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1NIQVJFRDoKKwkJCQlzZXRTaGFyZWQoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fVFlQRToKKwkJCQlzZXRUeXBlKChDYWNoZVR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fQUxXQVlTX1JFRlJFU0g6CisJCQkJc2V0QWx3YXlzUmVmcmVzaCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVI6CisJCQkJc2V0UmVmcmVzaE9ubHlJZk5ld2VyKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0RJU0FCTEVfSElUUzoKKwkJCQlzZXREaXNhYmxlSGl0cygoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19DT09SRElOQVRJT05fVFlQRToKKwkJCQlzZXRDb29yZGluYXRpb25UeXBlKChDYWNoZUNvb3JkaW5hdGlvblR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZOgorCQkJCXNldEV4cGlyeVRpbWVPZkRheSgoWG1sVGltZU9mRGF5KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWToKKwkJCQlzZXRFeHBpcnkoRVhQSVJZX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1NJWkU6CisJCQkJc2V0U2l6ZShTSVpFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1NIQVJFRDoKKwkJCQlzZXRTaGFyZWQoU0hBUkVEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1RZUEU6CisJCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0FMV0FZU19SRUZSRVNIOgorCQkJCXNldEFsd2F5c1JlZnJlc2goQUxXQVlTX1JFRlJFU0hfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSOgorCQkJCXNldFJlZnJlc2hPbmx5SWZOZXdlcihSRUZSRVNIX09OTFlfSUZfTkVXRVJfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRElTQUJMRV9ISVRTOgorCQkJCXNldERpc2FibGVIaXRzKERJU0FCTEVfSElUU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19DT09SRElOQVRJT05fVFlQRToKKwkJCQlzZXRDb29yZGluYXRpb25UeXBlKENPT1JESU5BVElPTl9UWVBFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWToKKwkJCQlzZXRFeHBpcnlUaW1lT2ZEYXkoKFhtbFRpbWVPZkRheSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUlk6CisJCQkJcmV0dXJuIEVYUElSWV9FREVGQVVMVCA9PSBudWxsID8gZXhwaXJ5ICE9IG51bGwgOiAhRVhQSVJZX0VERUZBVUxULmVxdWFscyhleHBpcnkpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSVpFOgorCQkJCXJldHVybiBTSVpFX0VERUZBVUxUID09IG51bGwgPyBzaXplICE9IG51bGwgOiAhU0laRV9FREVGQVVMVC5lcXVhbHMoc2l6ZSk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1NIQVJFRDoKKwkJCQlyZXR1cm4gU0hBUkVEX0VERUZBVUxUID09IG51bGwgPyBzaGFyZWQgIT0gbnVsbCA6ICFTSEFSRURfRURFRkFVTFQuZXF1YWxzKHNoYXJlZCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1RZUEU6CisJCQkJcmV0dXJuIHR5cGUgIT0gVFlQRV9FREVGQVVMVDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fQUxXQVlTX1JFRlJFU0g6CisJCQkJcmV0dXJuIEFMV0FZU19SRUZSRVNIX0VERUZBVUxUID09IG51bGwgPyBhbHdheXNSZWZyZXNoICE9IG51bGwgOiAhQUxXQVlTX1JFRlJFU0hfRURFRkFVTFQuZXF1YWxzKGFsd2F5c1JlZnJlc2gpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVI6CisJCQkJcmV0dXJuIFJFRlJFU0hfT05MWV9JRl9ORVdFUl9FREVGQVVMVCA9PSBudWxsID8gcmVmcmVzaE9ubHlJZk5ld2VyICE9IG51bGwgOiAhUkVGUkVTSF9PTkxZX0lGX05FV0VSX0VERUZBVUxULmVxdWFscyhyZWZyZXNoT25seUlmTmV3ZXIpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19ESVNBQkxFX0hJVFM6CisJCQkJcmV0dXJuIERJU0FCTEVfSElUU19FREVGQVVMVCA9PSBudWxsID8gZGlzYWJsZUhpdHMgIT0gbnVsbCA6ICFESVNBQkxFX0hJVFNfRURFRkFVTFQuZXF1YWxzKGRpc2FibGVIaXRzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEU6CisJCQkJcmV0dXJuIGNvb3JkaW5hdGlvblR5cGUgIT0gQ09PUkRJTkFUSU9OX1RZUEVfRURFRkFVTFQ7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWToKKwkJCQlyZXR1cm4gZXhwaXJ5VGltZU9mRGF5ICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGV4cGlyeTogIik7CisJCXJlc3VsdC5hcHBlbmQoZXhwaXJ5KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzaXplOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChzaXplKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzaGFyZWQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKHNoYXJlZCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7CisJCXJlc3VsdC5hcHBlbmQodHlwZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgYWx3YXlzUmVmcmVzaDogIik7CisJCXJlc3VsdC5hcHBlbmQoYWx3YXlzUmVmcmVzaCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgcmVmcmVzaE9ubHlJZk5ld2VyOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChyZWZyZXNoT25seUlmTmV3ZXIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGRpc2FibGVIaXRzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChkaXNhYmxlSGl0cyk7CisJCXJlc3VsdC5hcHBlbmQoIiwgY29vcmRpbmF0aW9uVHlwZTogIik7CisJCXJlc3VsdC5hcHBlbmQoY29vcmRpbmF0aW9uVHlwZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZEV4cGlyeVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRXhwaXJ5VGltZU9mRGF5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRTaXplVHJhbnNsYXRvcigpLAorCQkJYnVpbGRTaGFyZWRUcmFuc2xhdG9yKCksCisJCQlidWlsZFR5cGVUcmFuc2xhdG9yKCksCisJCQlidWlsZEFsd2F5c1JlZnJlc2hUcmFuc2xhdG9yKCksCisJCQlidWlsZFJlZnJlc2hPbmx5SWZOZXdlclRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRGlzYWJsZUhpdHNUcmFuc2xhdG9yKCksCisJCQlidWlsZENvb3JkaW5hdGlvblR5cGVUcmFuc2xhdG9yKCksCisJCX07CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhwaXJ5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNBQ0hFX19FWFBJUlksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfRXhwaXJ5KCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeHBpcnlUaW1lT2ZEYXlUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sVGltZU9mRGF5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWFBJUllfVElNRV9PRl9EQVksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfRXhwaXJ5VGltZU9mRGF5KCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTaXplVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNBQ0hFX19TSVpFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlX1NpemUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2hhcmVkVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNBQ0hFX19TSEFSRUQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfU2hhcmVkKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0FDSEVfX1RZUEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBbHdheXNSZWZyZXNoVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNBQ0hFX19BTFdBWVNfUkVGUkVTSCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZV9BbHdheXNSZWZyZXNoKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJlZnJlc2hPbmx5SWZOZXdlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlX1JlZnJlc2hPbmx5SWZOZXdlcigpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREaXNhYmxlSGl0c1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DQUNIRV9fRElTQUJMRV9ISVRTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlX0Rpc2FibGVIaXRzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvb3JkaW5hdGlvblR5cGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlX0Nvb3JkaW5hdGlvblR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisKK30gLy8gWG1sQ2FjaGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2FjaGVIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2FjaGVIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzNkMjVjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDYWNoZUhvbGRlci5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENhY2hlIEhvbGRlcjwvYj48L2VtPicuCisgKiAgCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKiAKKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlciNnZXRDYWNoZSA8ZW0+Q2FjaGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlciNnZXRFeGlzdGVuY2VDaGVja2luZyA8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxDYWNoZUhvbGRlciBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldENhY2hlKFhtbENhY2hlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZUhvbGRlcl9DYWNoZSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxDYWNoZSBnZXRDYWNoZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyI2dldENhY2hlIDxlbT5DYWNoZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENhY2hlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDYWNoZShYbWxDYWNoZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgQ2hlY2tpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZQorCSAqIEBzZWUgI3NldEV4aXN0ZW5jZUNoZWNraW5nKEV4aXN0ZW5jZVR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyX0V4aXN0ZW5jZUNoZWNraW5nKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFeGlzdGVuY2VUeXBlIGdldEV4aXN0ZW5jZUNoZWNraW5nKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcgPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCisJICogQHNlZSAjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEV4aXN0ZW5jZUNoZWNraW5nKEV4aXN0ZW5jZVR5cGUgdmFsdWUpOworCit9IC8vIFhtbENhY2hlSG9sZGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENoYW5nZVRyYWNraW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENoYW5nZVRyYWNraW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzMGJlZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2hhbmdlVHJhY2tpbmcuamF2YQpAQCAtMCwwICsxLDIyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ2hhbmdlIFRyYWNraW5nPC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqIAorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmcoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgWG1sQ2hhbmdlVHJhY2tpbmcgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0CisJICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIFRZUEVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIHR5cGUgPSBUWVBFX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbENoYW5nZVRyYWNraW5nKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQ0hBTkdFX1RSQUNLSU5HOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlCisJICogQHNlZSAjc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nX1R5cGUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFR5cGUoKQorCXsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZQorCSAqIEBzZWUgI2dldFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZSBuZXdUeXBlKQorCXsKKwkJWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIG9sZFR5cGUgPSB0eXBlOworCQl0eXBlID0gbmV3VHlwZSA9PSBudWxsID8gVFlQRV9FREVGQVVMVCA6IG5ld1R5cGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX19UWVBFOgorCQkJCXJldHVybiBnZXRUeXBlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19fVFlQRToKKwkJCQlzZXRUeXBlKChYbWxDaGFuZ2VUcmFja2luZ1R5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfX1RZUEU6CisJCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19fVFlQRToKKwkJCQlyZXR1cm4gdHlwZSAhPSBUWVBFX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkVHlwZVRyYW5zbGF0b3IoKQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdfVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKworfSAvLyBYbWxDaGFuZ2VUcmFja2luZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjYwYTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENoYW5nZVRyYWNraW5nSG9sZGVyLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiAKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDaGFuZ2UgVHJhY2tpbmcgSG9sZGVyPC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqIAorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyI2dldENoYW5nZVRyYWNraW5nIDxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbENoYW5nZVRyYWNraW5nSG9sZGVyIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoYW5nZSBUcmFja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q2hhbmdlVHJhY2tpbmcoWG1sQ2hhbmdlVHJhY2tpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCVhtbENoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIjZ2V0Q2hhbmdlVHJhY2tpbmcgPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRDaGFuZ2VUcmFja2luZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q2hhbmdlVHJhY2tpbmcoWG1sQ2hhbmdlVHJhY2tpbmcgdmFsdWUpOworCit9IC8vIFhtbENoYW5nZVRyYWNraW5nSG9sZGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENoYW5nZVRyYWNraW5nVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDaGFuZ2VUcmFja2luZ1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWUxYjkwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDaGFuZ2VUcmFja2luZ1R5cGUuamF2YQpAQCAtMCwwICsxLDI5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5YbWwgQ2hhbmdlIFRyYWNraW5nIFR5cGU8L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiAgCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKiAKKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nVHlwZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFUVFJJQlVURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNBVFRSSUJVVEVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlBVFRSSUJVVEUoMCwgIkFUVFJJQlVURSIsICJBVFRSSUJVVEUiKSwgLyoqCisJICogVGhlICc8ZW0+PGI+T0JKRUNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09CSkVDVF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU9CSkVDVCgxLCAiT0JKRUNUIiwgIk9CSkVDVCIpLCAvKioKKwkgKiBUaGUgJzxlbT48Yj5ERUZFUlJFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNERUZFUlJFRF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCURFRkVSUkVEKDIsICJERUZFUlJFRCIsICJERUZFUlJFRCIpLCAvKioKKwkgKiBUaGUgJzxlbT48Yj5BVVRPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0FVVE9fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlBVVRPKDMsICJBVVRPIiwgIkFVVE8iKQorCTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFUVFJJQlVURTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QVRUUklCVVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0FUVFJJQlVURQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURV9WQUxVRSA9IDA7CisKKy8qKgorCSAqIFRoZSAnPGVtPjxiPk9CSkVDVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T0JKRUNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09CSkVDVAorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9WQUxVRSA9IDE7CisKKy8qKgorCSAqIFRoZSAnPGVtPjxiPkRFRkVSUkVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5ERUZFUlJFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNERUZFUlJFRAorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkVSUkVEX1ZBTFVFID0gMjsKKworLyoqCisJICogVGhlICc8ZW0+PGI+QVVUTzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QVVUTzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNBVVRPCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19WQUxVRSA9IDM7CisKKwkvKioKKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIENoYW5nZSBUcmFja2luZyBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBYbWxDaGFuZ2VUcmFja2luZ1R5cGVbXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlW10KKwkJeworCQkJQVRUUklCVVRFLAorCQkJT0JKRUNULAorCQkJREVGRVJSRUQsCisJCQlBVVRPLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFhtbENoYW5nZVRyYWNraW5nVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgQ2hhbmdlIFRyYWNraW5nIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBYbWxDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCisJCXsKKwkJCVhtbENoYW5nZVRyYWNraW5nVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQorCQkJeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgQ2hhbmdlIFRyYWNraW5nIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBYbWxDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCisJCXsKKwkJCVhtbENoYW5nZVRyYWNraW5nVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCisJCQl7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFhtbENoYW5nZVRyYWNraW5nVHlwZSBnZXQoaW50IHZhbHVlKQorCXsKKwkJc3dpdGNoICh2YWx1ZSkKKwkJeworCQkJY2FzZSBBVFRSSUJVVEVfVkFMVUU6IHJldHVybiBBVFRSSUJVVEU7CisJCQljYXNlIE9CSkVDVF9WQUxVRTogcmV0dXJuIE9CSkVDVDsKKwkJCWNhc2UgREVGRVJSRURfVkFMVUU6IHJldHVybiBERUZFUlJFRDsKKwkJCWNhc2UgQVVUT19WQUxVRTogcmV0dXJuIEFVVE87CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIFhtbENoYW5nZVRyYWNraW5nVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKKwl7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkKKwl7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkKKwl7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQorCXsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vWG1sQ2hhbmdlVHJhY2tpbmdUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENsb25lQ29weVBvbGljeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDbG9uZUNvcHlQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzcyYmJlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDbG9uZUNvcHlQb2xpY3kuamF2YQpAQCAtMCwwICsxLDI5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjIKKyAqCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldE1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldFdvcmtpbmdDb3B5TWV0aG9kIDxlbT5Xb3JraW5nIENvcHkgTWV0aG9kPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENsb25lQ29weVBvbGljeSgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxDbG9uZUNvcHlQb2xpY3kgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZCgpIDxlbT5NZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1ldGhvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZCgpIDxlbT5NZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1ldGhvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBtZXRob2QgPSBNRVRIT0RfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya2luZ0NvcHlNZXRob2QoKSA8ZW0+V29ya2luZyBDb3B5IE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0V29ya2luZ0NvcHlNZXRob2QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktJTkdfQ09QWV9NRVRIT0RfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya2luZ0NvcHlNZXRob2QoKSA8ZW0+V29ya2luZyBDb3B5IE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0V29ya2luZ0NvcHlNZXRob2QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgd29ya2luZ0NvcHlNZXRob2QgPSBXT1JLSU5HX0NPUFlfTUVUSE9EX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbENsb25lQ29weVBvbGljeSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NMT05FX0NPUFlfUE9MSUNZOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TWV0aG9kKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X01ldGhvZCgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpCisJeworCQlyZXR1cm4gbWV0aG9kOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kjZ2V0TWV0aG9kIDxlbT5NZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TWV0aG9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWV0aG9kKFN0cmluZyBuZXdNZXRob2QpCisJeworCQlTdHJpbmcgb2xkTWV0aG9kID0gbWV0aG9kOworCQltZXRob2QgPSBuZXdNZXRob2Q7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX01FVEhPRCwgb2xkTWV0aG9kLCBtZXRob2QpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JraW5nIENvcHkgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JraW5nIENvcHkgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmtpbmcgQ29weSBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFdvcmtpbmdDb3B5TWV0aG9kKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X1dvcmtpbmdDb3B5TWV0aG9kKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0V29ya2luZ0NvcHlNZXRob2QoKQorCXsKKwkJcmV0dXJuIHdvcmtpbmdDb3B5TWV0aG9kOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kjZ2V0V29ya2luZ0NvcHlNZXRob2QgPGVtPldvcmtpbmcgQ29weSBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmtpbmcgQ29weSBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFdvcmtpbmdDb3B5TWV0aG9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0V29ya2luZ0NvcHlNZXRob2QoU3RyaW5nIG5ld1dvcmtpbmdDb3B5TWV0aG9kKQorCXsKKwkJU3RyaW5nIG9sZFdvcmtpbmdDb3B5TWV0aG9kID0gd29ya2luZ0NvcHlNZXRob2Q7CisJCXdvcmtpbmdDb3B5TWV0aG9kID0gbmV3V29ya2luZ0NvcHlNZXRob2Q7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0QsIG9sZFdvcmtpbmdDb3B5TWV0aG9kLCB3b3JraW5nQ29weU1ldGhvZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19NRVRIT0Q6CisJCQkJcmV0dXJuIGdldE1ldGhvZCgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19XT1JLSU5HX0NPUFlfTUVUSE9EOgorCQkJCXJldHVybiBnZXRXb3JraW5nQ29weU1ldGhvZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DTE9ORV9DT1BZX1BPTElDWV9fTUVUSE9EOgorCQkJCXNldE1ldGhvZCgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0Q6CisJCQkJc2V0V29ya2luZ0NvcHlNZXRob2QoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19NRVRIT0Q6CisJCQkJc2V0TWV0aG9kKE1FVEhPRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19XT1JLSU5HX0NPUFlfTUVUSE9EOgorCQkJCXNldFdvcmtpbmdDb3B5TWV0aG9kKFdPUktJTkdfQ09QWV9NRVRIT0RfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX01FVEhPRDoKKwkJCQlyZXR1cm4gTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBtZXRob2QgIT0gbnVsbCA6ICFNRVRIT0RfRURFRkFVTFQuZXF1YWxzKG1ldGhvZCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0Q6CisJCQkJcmV0dXJuIFdPUktJTkdfQ09QWV9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtpbmdDb3B5TWV0aG9kICE9IG51bGwgOiAhV09SS0lOR19DT1BZX01FVEhPRF9FREVGQVVMVC5lcXVhbHMod29ya2luZ0NvcHlNZXRob2QpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChtZXRob2Q6ICIpOworCQlyZXN1bHQuYXBwZW5kKG1ldGhvZCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgd29ya2luZ0NvcHlNZXRob2Q6ICIpOworCQlyZXN1bHQuYXBwZW5kKHdvcmtpbmdDb3B5TWV0aG9kKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTWV0aG9kVHJhbnNsYXRvcigpLAorCQkJYnVpbGRXb3JraW5nQ29weU1ldGhvZFRyYW5zbGF0b3IoKSwKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWV0aG9kVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNMT05FX0NPUFlfUE9MSUNZX19NRVRIT0QsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X01ldGhvZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRXb3JraW5nQ29weU1ldGhvZFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DTE9ORV9DT1BZX1BPTElDWV9fV09SS0lOR19DT1BZX01FVEhPRCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDbG9uZUNvcHlQb2xpY3lfV29ya2luZ0NvcHlNZXRob2QoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCit9IC8vIFhtbENsb25lQ29weVBvbGljeQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJzaW9uVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVyc2lvblZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3ZWQxZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVyc2lvblZhbHVlLmphdmEKQEAgLTAsMCArMSwzMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENvbnZlcnNpb24gVmFsdWU8L2I+PC9lbT4nLgorICogIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlI2dldERhdGFWYWx1ZSA8ZW0+RGF0YSBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZSNnZXRPYmplY3RWYWx1ZSA8ZW0+T2JqZWN0IFZhbHVlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnNpb25WYWx1ZSgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxDb252ZXJzaW9uVmFsdWUgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFWYWx1ZSgpIDxlbT5EYXRhIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREYXRhVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfVkFMVUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YVZhbHVlKCkgPGVtPkRhdGEgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERhdGFWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBkYXRhVmFsdWUgPSBEQVRBX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFZhbHVlKCkgPGVtPk9iamVjdCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T2JqZWN0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9WQUxVRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RWYWx1ZSgpIDxlbT5PYmplY3QgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9iamVjdFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG9iamVjdFZhbHVlID0gT0JKRUNUX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbENvbnZlcnNpb25WYWx1ZSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NPTlZFUlNJT05fVkFMVUU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF0YSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREYXRhVmFsdWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJzaW9uVmFsdWVfRGF0YVZhbHVlKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXREYXRhVmFsdWUoKQorCXsKKwkJcmV0dXJuIGRhdGFWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlI2dldERhdGFWYWx1ZSA8ZW0+RGF0YSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RGF0YVZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGF0YVZhbHVlKFN0cmluZyBuZXdEYXRhVmFsdWUpCisJeworCQlTdHJpbmcgb2xkRGF0YVZhbHVlID0gZGF0YVZhbHVlOworCQlkYXRhVmFsdWUgPSBuZXdEYXRhVmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRSwgb2xkRGF0YVZhbHVlLCBkYXRhVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE9iamVjdFZhbHVlKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVyc2lvblZhbHVlX09iamVjdFZhbHVlKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRPYmplY3RWYWx1ZSgpCisJeworCQlyZXR1cm4gb2JqZWN0VmFsdWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZSNnZXRPYmplY3RWYWx1ZSA8ZW0+T2JqZWN0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE9iamVjdFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIG5ld09iamVjdFZhbHVlKQorCXsKKwkJU3RyaW5nIG9sZE9iamVjdFZhbHVlID0gb2JqZWN0VmFsdWU7CisJCW9iamVjdFZhbHVlID0gbmV3T2JqZWN0VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFLCBvbGRPYmplY3RWYWx1ZSwgb2JqZWN0VmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFOgorCQkJCXJldHVybiBnZXREYXRhVmFsdWUoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUU6CisJCQkJcmV0dXJuIGdldE9iamVjdFZhbHVlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUU6CisJCQkJc2V0RGF0YVZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUU6CisJCQkJc2V0T2JqZWN0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUU6CisJCQkJc2V0RGF0YVZhbHVlKERBVEFfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUU6CisJCQkJc2V0T2JqZWN0VmFsdWUoT0JKRUNUX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUU6CisJCQkJcmV0dXJuIERBVEFfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGRhdGFWYWx1ZSAhPSBudWxsIDogIURBVEFfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGRhdGFWYWx1ZSk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFOgorCQkJCXJldHVybiBPQkpFQ1RfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IG9iamVjdFZhbHVlICE9IG51bGwgOiAhT0JKRUNUX1ZBTFVFX0VERUZBVUxULmVxdWFscyhvYmplY3RWYWx1ZSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRhdGFWYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQoZGF0YVZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBvYmplY3RWYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQob2JqZWN0VmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXREYXRhVmFsdWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRSk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T2JqZWN0VmFsdWVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFKTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKKwkJCWVsZW1lbnROYW1lLAorCQkJc3RydWN0dXJhbEZlYXR1cmUsCisJCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAorCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQorCQkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGREYXRhVmFsdWVUcmFuc2xhdG9yKCksCisJCQlidWlsZE9iamVjdFZhbHVlVHJhbnNsYXRvcigpCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERhdGFWYWx1ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnNpb25WYWx1ZV9EYXRhVmFsdWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VmFsdWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnNpb25WYWx1ZV9PYmplY3RWYWx1ZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKK30gLy8gWG1sQ29udmVyc2lvblZhbHVlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODE1ZDZhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEN1c3RvbUNvbnZlcnRlcjwvYj48L2VtPicuCisgKiAgCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKiAKKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXIjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcigpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxDb252ZXJ0ZXIgZXh0ZW5kcyBYbWxOYW1lZENvbnZlcnRlcgoreworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc05hbWUoKSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FX0VERUZBVUxUID0gbnVsbDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc05hbWUoKSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZSA9IENMQVNTX05BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ29udmVydGVyKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQ09OVkVSVEVSOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Q2xhc3NOYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyX0NsYXNzTmFtZSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkKKwl7CisJCXJldHVybiBjbGFzc05hbWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlciNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgbmV3Q2xhc3NOYW1lKQorCXsKKwkJU3RyaW5nIG9sZENsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKwkJY2xhc3NOYW1lID0gbmV3Q2xhc3NOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9fQ0xBU1NfTkFNRSwgb2xkQ2xhc3NOYW1lLCBjbGFzc05hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfX0NMQVNTX05BTUU6CisJCQkJcmV0dXJuIGdldENsYXNzTmFtZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfX0NMQVNTX05BTUU6CisJCQkJc2V0Q2xhc3NOYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfX0NMQVNTX05BTUU6CisJCQkJc2V0Q2xhc3NOYW1lKENMQVNTX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX19DTEFTU19OQU1FOgorCQkJCXJldHVybiBDTEFTU19OQU1FX0VERUZBVUxUID09IG51bGwgPyBjbGFzc05hbWUgIT0gbnVsbCA6ICFDTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhjbGFzc05hbWUpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChjbGFzc05hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGNsYXNzTmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZENsYXNzVHJhbnNsYXRvcigpLAorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDbGFzc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVJfX0NMQVNTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcl9DbGFzc05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCit9IC8vIFhtbENvbnZlcnRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0ZXJIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGVySG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjY2IzNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGVySG9sZGVyLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ3VzdG9tQ29udmVydGVyIEhvbGRlcjwvYj48L2VtPicuCisgKiAgCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKiAKKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0Q29udmVydGVyIDxlbT5Db252ZXJ0ZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0VHlwZUNvbnZlcnRlciA8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlciA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyI2dldFN0cnVjdENvbnZlcnRlciA8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbENvbnZlcnRlckhvbGRlciBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9Db252ZXJ0ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJWG1sQ29udmVydGVyIGdldENvbnZlcnRlcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRDb252ZXJ0ZXIgPGVtPkNvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCVhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRUeXBlQ29udmVydGVyIDxlbT5UeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIEN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IEN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCVhtbFN0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0U3RydWN0Q29udmVydGVyIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgdmFsdWUpOworCit9IC8vIFhtbENvbnZlcnRlckhvbGRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0ZXJzSG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRlcnNIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzYzMzRiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0ZXJzSG9sZGVyLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENvbnZlcnRlcnMgSG9sZGVyPC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqIAorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIjZ2V0Q29udmVydGVycyA8ZW0+Q29udmVydGVyczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIjZ2V0VHlwZUNvbnZlcnRlcnMgPGVtPlR5cGUgQ29udmVydGVyczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyI2dldFN0cnVjdENvbnZlcnRlcnMgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXIoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbENvbnZlcnRlcnNIb2xkZXIgZXh0ZW5kcyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfQ29udmVydGVycygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxYbWxDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9UeXBlQ29udmVydGVycygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxYbWxUeXBlQ29udmVydGVyPiBnZXRUeXBlQ29udmVydGVycygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpOworCit9IC8vIFhtbENvbnZlcnRlcnNIb2xkZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGlibGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRpYmxlTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYmU0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRpYmxlTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LlRleHRSYW5nZTsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiAKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDb252ZXJ0aWJsZSBNYXBwaW5nPC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqIAorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNnZXRDb252ZXJ0IDxlbT5Db252ZXJ0PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZygpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sQ29udmVydGlibGVNYXBwaW5nIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZywgWG1sQ29udmVydGVySG9sZGVyCit7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRDb252ZXJ0KFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0Q29udmVydCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNnZXRDb252ZXJ0IDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDb252ZXJ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb252ZXJ0KFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgY29udmVydCBlbGVtZW50LiAgSWYgdGhlIGNvbnZlcnQgZWxlbWVudCAKKwkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbWFwcGluZyBlbGVtZW50LgorCSAqLworCVRleHRSYW5nZSBnZXRDb252ZXJ0VGV4dFJhbmdlKCk7CisKK30gLy8gWG1sQ29udmVydGlibGVNYXBwaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvcHlQb2xpY3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29weVBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjJmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvcHlQb2xpY3kuamF2YQpAQCAtMCwwICsxLDIyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENvcHkgUG9saWN5PC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjIKKyAqCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeSNnZXRDbGFzc18gPGVtPkNsYXNzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvcHlQb2xpY3koKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgWG1sQ29weVBvbGljeSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NfKCkgPGVtPkNsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDbGFzc18oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzXygpIDxlbT5DbGFzczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2xhc3NfKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzXyA9IENMQVNTX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbENvcHlQb2xpY3koKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9DT1BZX1BPTElDWTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENsYXNzKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29weVBvbGljeV9DbGFzcygpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENsYXNzXygpCisJeworCQlyZXR1cm4gY2xhc3NfOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5I2dldENsYXNzXyA8ZW0+Q2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDbGFzc18oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDbGFzcyhTdHJpbmcgbmV3Q2xhc3MpCisJeworCQlTdHJpbmcgb2xkQ2xhc3MgPSBjbGFzc187CisJCWNsYXNzXyA9IG5ld0NsYXNzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZX19DTEFTUywgb2xkQ2xhc3MsIGNsYXNzXykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZX19DTEFTUzoKKwkJCQlyZXR1cm4gZ2V0Q2xhc3NfKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZX19DTEFTUzoKKwkJCQlzZXRDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09QWV9QT0xJQ1lfX0NMQVNTOgorCQkJCXNldENsYXNzKENMQVNTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZX19DTEFTUzoKKwkJCQlyZXR1cm4gQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzXyAhPSBudWxsIDogIUNMQVNTX0VERUZBVUxULmVxdWFscyhjbGFzc18pOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChjbGFzczogIik7CisJCXJlc3VsdC5hcHBlbmQoY2xhc3NfKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09QWV9QT0xJQ1lfX0NMQVNTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvcHlQb2xpY3lfQ2xhc3MoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCit9IC8vIFhtbENvcHlQb2xpY3kKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ3VzdG9taXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDdXN0b21pemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmNmIzNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ3VzdG9taXplci5qYXZhCkBAIC0wLDAgKzEsMjM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEN1c3RvbWl6ZXI8L2I+PC9lbT4nLgorICogIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplciNnZXRDdXN0b21pemVyQ2xhc3NOYW1lIDxlbT5DdXN0b21pemVyIENsYXNzIE5hbWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplcigpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxDdXN0b21pemVyIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkgPGVtPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q3VzdG9taXplckNsYXNzTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NSVpFUl9DTEFTU19OQU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1c3RvbWl6ZXJDbGFzc05hbWUoKSA8ZW0+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbWl6ZXJDbGFzc05hbWUgPSBDVVNUT01JWkVSX0NMQVNTX05BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ3VzdG9taXplcigpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NVU1RPTUlaRVI7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DdXN0b21pemVyIENsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRDdXN0b21pemVyQ2xhc3NOYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplcl9DdXN0b21pemVyQ2xhc3NOYW1lKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkKKwl7CisJCXJldHVybiBjdXN0b21pemVyQ2xhc3NOYW1lOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVyI2dldEN1c3RvbWl6ZXJDbGFzc05hbWUgPGVtPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3VzdG9taXplckNsYXNzTmFtZShTdHJpbmcgbmV3Q3VzdG9taXplckNsYXNzTmFtZSkKKwl7CisJCVN0cmluZyBvbGRDdXN0b21pemVyQ2xhc3NOYW1lID0gY3VzdG9taXplckNsYXNzTmFtZTsKKwkJY3VzdG9taXplckNsYXNzTmFtZSA9IG5ld0N1c3RvbWl6ZXJDbGFzc05hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9fQ1VTVE9NSVpFUl9DTEFTU19OQU1FLCBvbGRDdXN0b21pemVyQ2xhc3NOYW1lLCBjdXN0b21pemVyQ2xhc3NOYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9fQ1VTVE9NSVpFUl9DTEFTU19OQU1FOgorCQkJCXJldHVybiBnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NVU1RPTUlaRVJfX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRToKKwkJCQlzZXRDdXN0b21pemVyQ2xhc3NOYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DVVNUT01JWkVSX19DVVNUT01JWkVSX0NMQVNTX05BTUU6CisJCQkJc2V0Q3VzdG9taXplckNsYXNzTmFtZShDVVNUT01JWkVSX0NMQVNTX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9fQ1VTVE9NSVpFUl9DTEFTU19OQU1FOgorCQkJCXJldHVybiBDVVNUT01JWkVSX0NMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGN1c3RvbWl6ZXJDbGFzc05hbWUgIT0gbnVsbCA6ICFDVVNUT01JWkVSX0NMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGN1c3RvbWl6ZXJDbGFzc05hbWUpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChjdXN0b21pemVyQ2xhc3NOYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChjdXN0b21pemVyQ2xhc3NOYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRDdXN0b21pemVyQ2xhc3NOYW1lVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5DTEFTUyk7CisJfQorCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKKwkJCWVsZW1lbnROYW1lLAorCQkJc3RydWN0dXJhbEZlYXR1cmUsCisJCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAorCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQorCQkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGRDbGFzc1RyYW5zbGF0b3IoKQorCQl9OworCX0KKwkJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkNMQVNTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEN1c3RvbWl6ZXJfQ3VzdG9taXplckNsYXNzTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKworfSAvLyBYbWxDdXN0b21pemVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEN1c3RvbWl6ZXJIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ3VzdG9taXplckhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNWVhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEN1c3RvbWl6ZXJIb2xkZXIuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEN1c3RvbWl6ZXIgSG9sZGVyPC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqIAorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXJIb2xkZXIjZ2V0Q3VzdG9taXplciA8ZW0+Q3VzdG9taXplcjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDdXN0b21pemVySG9sZGVyKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxDdXN0b21pemVySG9sZGVyIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q3VzdG9taXplcihYbWxDdXN0b21pemVyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDdXN0b21pemVySG9sZGVyX0N1c3RvbWl6ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJWG1sQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciNnZXRDdXN0b21pemVyIDxlbT5DdXN0b21pemVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRDdXN0b21pemVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDdXN0b21pemVyKFhtbEN1c3RvbWl6ZXIgdmFsdWUpOworCit9IC8vIFhtbEN1c3RvbWl6ZXJIb2xkZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRGlyZWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbERpcmVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZDI1NWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbERpcmVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlhtbCBEaXJlY3Rpb248L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiAgCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4yCisgKgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRGlyZWN0aW9uKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBYbWxEaXJlY3Rpb24gaW1wbGVtZW50cyBFbnVtZXJhdG9yCit7CisJLyoqCisJICogVGhlICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSU5fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlJTigwLCAiSU4iLCAiSU4iKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNPVVRfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlPVVQoMSwgIk9VVCIsICJPVVQiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPklOIE9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNJTl9PVVRfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlJTl9PVVQoMiwgIklOX09VVCIsICJJTl9PVVQiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk9VVCBDVVJTT1I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjT1VUX0NVUlNPUl9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU9VVF9DVVJTT1IoMywgIk9VVF9DVVJTT1IiLCAiT1VUX0NVUlNPUiIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lOCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjT1VUCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUX1ZBTFVFID0gMTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPklOIE9VVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU4gT1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lOX09VVAorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX09VVF9WQUxVRSA9IDI7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5PVVQgQ1VSU09SPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PVVQgQ1VSU09SPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09VVF9DVVJTT1IKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRfQ1VSU09SX1ZBTFVFID0gMzsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5YbWwgRGlyZWN0aW9uPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBYbWxEaXJlY3Rpb25bXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgWG1sRGlyZWN0aW9uW10KKwkJeworCQkJSU4sCisJCQlPVVQsCisJCQlJTl9PVVQsCisJCQlPVVRfQ1VSU09SLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlhtbCBEaXJlY3Rpb248L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxYbWxEaXJlY3Rpb24+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIERpcmVjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFhtbERpcmVjdGlvbiBnZXQoU3RyaW5nIGxpdGVyYWwpCisJeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKKwkJeworCQkJWG1sRGlyZWN0aW9uIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCisJCQl7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBEaXJlY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBYbWxEaXJlY3Rpb24gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCisJCXsKKwkJCVhtbERpcmVjdGlvbiByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCisJCQl7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBEaXJlY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBYbWxEaXJlY3Rpb24gZ2V0KGludCB2YWx1ZSkKKwl7CisJCXN3aXRjaCAodmFsdWUpCisJCXsKKwkJCWNhc2UgSU5fVkFMVUU6IHJldHVybiBJTjsKKwkJCWNhc2UgT1VUX1ZBTFVFOiByZXR1cm4gT1VUOworCQkJY2FzZSBJTl9PVVRfVkFMVUU6IHJldHVybiBJTl9PVVQ7CisJCQljYXNlIE9VVF9DVVJTT1JfVkFMVUU6IHJldHVybiBPVVRfQ1VSU09SOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBYbWxEaXJlY3Rpb24oaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCisJeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpCisJeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCisJeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKKwl7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL1htbERpcmVjdGlvbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbGVtZW50Q29sbGVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbGVtZW50Q29sbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1Y2M0ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVsZW1lbnRDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMjIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwS2V5Q2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbGVtZW50IENvbGxlY3Rpb248L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbigpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxFbGVtZW50Q29sbGVjdGlvbiBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiBpbXBsZW1lbnRzIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMAoreworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVyKCkgPGVtPkNvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ29udmVydGVyIGNvbnZlcnRlcjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXIoKSA8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxUeXBlQ29udmVydGVyIHR5cGVDb252ZXJ0ZXI7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlcjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdENvbnZlcnRlcigpIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxTdHJ1Y3RDb252ZXJ0ZXIgc3RydWN0Q29udmVydGVyOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnQoKSA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29udmVydCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0KCkgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbnZlcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgY29udmVydCA9IENPTlZFUlRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXJzKCkgPGVtPkNvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29udmVydGVycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbENvbnZlcnRlcj4gY29udmVydGVyczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXJzKCkgPGVtPlR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IHR5cGVDb252ZXJ0ZXJzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IG9iamVjdFR5cGVDb252ZXJ0ZXJzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RydWN0Q29udmVydGVycygpIDxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBzdHJ1Y3RDb252ZXJ0ZXJzOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUNvbnZlcnQoKSA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Q29udmVydCgpIDxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbWFwS2V5Q29udmVydCA9IE1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sRWxlbWVudENvbGxlY3Rpb24oKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTEVNRU5UX0NPTExFQ1RJT047CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKKwl7CisJCXJldHVybiBhY2Nlc3NNZXRob2RzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKKwkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQorCXsKKwkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKKwl7CisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCisJCXsKKwkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUFJPUEVSVElFUyk7CisJCX0KKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkKKwl7CisJCXJldHVybiBjb252ZXJ0ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udmVydGVyKFhtbENvbnZlcnRlciBuZXdDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxDb252ZXJ0ZXIgb2xkQ29udmVydGVyID0gY29udmVydGVyOworCQljb252ZXJ0ZXIgPSBuZXdDb252ZXJ0ZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVIsIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0Q29udmVydGVyIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Q29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFhtbENvbnZlcnRlciBuZXdDb252ZXJ0ZXIpCisJeworCQlpZiAobmV3Q29udmVydGVyICE9IGNvbnZlcnRlcikKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoY29udmVydGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVIsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0NvbnZlcnRlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldENvbnZlcnRlcihuZXdDb252ZXJ0ZXIsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUiwgbmV3Q29udmVydGVyLCBuZXdDb252ZXJ0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX1R5cGVDb252ZXJ0ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpCisJeworCQlyZXR1cm4gdHlwZUNvbnZlcnRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgbmV3VHlwZUNvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbFR5cGVDb252ZXJ0ZXIgb2xkVHlwZUNvbnZlcnRlciA9IHR5cGVDb252ZXJ0ZXI7CisJCXR5cGVDb252ZXJ0ZXIgPSBuZXdUeXBlQ29udmVydGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVIsIG9sZFR5cGVDb252ZXJ0ZXIsIG5ld1R5cGVDb252ZXJ0ZXIpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRUeXBlQ29udmVydGVyIDxlbT5UeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgbmV3VHlwZUNvbnZlcnRlcikKKwl7CisJCWlmIChuZXdUeXBlQ29udmVydGVyICE9IHR5cGVDb252ZXJ0ZXIpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKHR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdHlwZUNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3VHlwZUNvbnZlcnRlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdUeXBlQ29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFR5cGVDb252ZXJ0ZXIobmV3VHlwZUNvbnZlcnRlciwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVIsIG5ld1R5cGVDb252ZXJ0ZXIsIG5ld1R5cGVDb252ZXJ0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCisJeworCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgbmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgb2xkT2JqZWN0VHlwZUNvbnZlcnRlciA9IG9iamVjdFR5cGVDb252ZXJ0ZXI7CisJCW9iamVjdFR5cGVDb252ZXJ0ZXIgPSBuZXdPYmplY3RUeXBlQ29udmVydGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBvbGRPYmplY3RUeXBlQ29udmVydGVyLCBuZXdPYmplY3RUeXBlQ29udmVydGVyKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0T2JqZWN0VHlwZUNvbnZlcnRlciA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikKKwl7CisJCWlmIChuZXdPYmplY3RUeXBlQ29udmVydGVyICE9IG9iamVjdFR5cGVDb252ZXJ0ZXIpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpb2JqZWN0VHlwZUNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihuZXdPYmplY3RUeXBlQ29udmVydGVyLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbFN0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQorCXsKKwkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIG5ld1N0cnVjdENvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbFN0cnVjdENvbnZlcnRlciBvbGRTdHJ1Y3RDb252ZXJ0ZXIgPSBzdHJ1Y3RDb252ZXJ0ZXI7CisJCXN0cnVjdENvbnZlcnRlciA9IG5ld1N0cnVjdENvbnZlcnRlcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVIsIG9sZFN0cnVjdENvbnZlcnRlciwgbmV3U3RydWN0Q29udmVydGVyKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0U3RydWN0Q29udmVydGVyIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIG5ld1N0cnVjdENvbnZlcnRlcikKKwl7CisJCWlmIChuZXdTdHJ1Y3RDb252ZXJ0ZXIgIT0gc3RydWN0Q29udmVydGVyKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChzdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc3RydWN0Q29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVIsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1N0cnVjdENvbnZlcnRlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdHJ1Y3RDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRTdHJ1Y3RDb252ZXJ0ZXIobmV3U3RydWN0Q29udmVydGVyLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIsIG5ld1N0cnVjdENvbnZlcnRlcikpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Q29udmVydChTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb252ZXJ0KCkKKwl7CisJCXJldHVybiBjb252ZXJ0OworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRDb252ZXJ0IDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDb252ZXJ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29udmVydChTdHJpbmcgbmV3Q29udmVydCkKKwl7CisJCVN0cmluZyBvbGRDb252ZXJ0ID0gY29udmVydDsKKwkJY29udmVydCA9IG5ld0NvbnZlcnQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJULCBvbGRDb252ZXJ0LCBjb252ZXJ0KSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfQ29udmVydGVycygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJzKCkKKwl7CisJCWlmIChjb252ZXJ0ZXJzID09IG51bGwpCisJCXsKKwkJCWNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQ29udmVydGVyPihYbWxDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVJTKTsKKwkJfQorCQlyZXR1cm4gY29udmVydGVyczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCkKKwl7CisJCWlmICh0eXBlQ29udmVydGVycyA9PSBudWxsKQorCQl7CisJCQl0eXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUeXBlQ29udmVydGVyPihYbWxUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTKTsKKwkJfQorCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpCisJeworCQlpZiAob2JqZWN0VHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKKwkJeworCQkJb2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4oWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMpOworCQl9CisJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IGdldFN0cnVjdENvbnZlcnRlcnMoKQorCXsKKwkJaWYgKHN0cnVjdENvbnZlcnRlcnMgPT0gbnVsbCkKKwkJeworCQkJc3RydWN0Q29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+KFhtbFN0cnVjdENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTKTsKKwkJfQorCQlyZXR1cm4gc3RydWN0Q29udmVydGVyczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1hcEtleUNvbnZlcnQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5Q29udmVydCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TWFwS2V5Q29udmVydCgpCisJeworCQlyZXR1cm4gbWFwS2V5Q29udmVydDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0TWFwS2V5Q29udmVydCA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDb252ZXJ0KFN0cmluZyBuZXdNYXBLZXlDb252ZXJ0KQorCXsKKwkJU3RyaW5nIG9sZE1hcEtleUNvbnZlcnQgPSBtYXBLZXlDb252ZXJ0OworCQltYXBLZXlDb252ZXJ0ID0gbmV3TWFwS2V5Q29udmVydDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09OVkVSVCwgb2xkTWFwS2V5Q29udmVydCwgbWFwS2V5Q29udmVydCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCisJeworCQlpZiAobWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPT0gbnVsbCkKKwkJeworCQkJbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4oWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJfQorCQlyZXR1cm4gbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSOgorCQkJCXJldHVybiBiYXNpY1NldENvbnZlcnRlcihudWxsLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSOgorCQkJCXJldHVybiBiYXNpY1NldFR5cGVDb252ZXJ0ZXIobnVsbCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6CisJCQkJcmV0dXJuIGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVI6CisJCQkJcmV0dXJuIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RydWN0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSOgorCQkJCXJldHVybiBnZXRDb252ZXJ0ZXIoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSOgorCQkJCXJldHVybiBnZXRUeXBlQ29udmVydGVyKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6CisJCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVI6CisJCQkJcmV0dXJuIGdldFN0cnVjdENvbnZlcnRlcigpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVDoKKwkJCQlyZXR1cm4gZ2V0Q29udmVydCgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gZ2V0Q29udmVydGVycygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTOgorCQkJCXJldHVybiBnZXRUeXBlQ29udmVydGVycygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOgorCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTlZFUlQ6CisJCQkJcmV0dXJuIGdldE1hcEtleUNvbnZlcnQoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgorCQkJCXJldHVybiBnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVI6CisJCQkJc2V0Q29udmVydGVyKChYbWxDb252ZXJ0ZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSOgorCQkJCXNldFR5cGVDb252ZXJ0ZXIoKFhtbFR5cGVDb252ZXJ0ZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKKwkJCQlzZXRPYmplY3RUeXBlQ29udmVydGVyKChYbWxPYmplY3RUeXBlQ29udmVydGVyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSOgorCQkJCXNldFN0cnVjdENvbnZlcnRlcigoWG1sU3RydWN0Q29udmVydGVyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJUOgorCQkJCXNldENvbnZlcnQoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSUzoKKwkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKKwkJCQlnZXRDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUlM6CisJCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKKwkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmNsZWFyKCk7CisJCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSUzoKKwkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKKwkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxTdHJ1Y3RDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTlZFUlQ6CisJCQkJc2V0TWFwS2V5Q29udmVydCgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKKwkJCQlnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmNsZWFyKCk7CisJCQkJZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSOgorCQkJCXNldENvbnZlcnRlcigoWG1sQ29udmVydGVyKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSOgorCQkJCXNldFR5cGVDb252ZXJ0ZXIoKFhtbFR5cGVDb252ZXJ0ZXIpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgorCQkJCXNldE9iamVjdFR5cGVDb252ZXJ0ZXIoKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUjoKKwkJCQlzZXRTdHJ1Y3RDb252ZXJ0ZXIoKFhtbFN0cnVjdENvbnZlcnRlciludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJUOgorCQkJCXNldENvbnZlcnQoQ09OVkVSVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSUzoKKwkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUlM6CisJCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6CisJCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOgorCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09OVkVSVDoKKwkJCQlzZXRNYXBLZXlDb252ZXJ0KE1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6CisJCQkJZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gY29udmVydGVyICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gdHlwZUNvbnZlcnRlciAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgorCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSOgorCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlQ6CisJCQkJcmV0dXJuIENPTlZFUlRfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnZlcnQgIT0gbnVsbCA6ICFDT05WRVJUX0VERUZBVUxULmVxdWFscyhjb252ZXJ0KTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuIGNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhY29udmVydGVycy5pc0VtcHR5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIW9iamVjdFR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOgorCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXN0cnVjdENvbnZlcnRlcnMuaXNFbXB0eSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT05WRVJUOgorCQkJCXJldHVybiBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQgPT0gbnVsbCA/IG1hcEtleUNvbnZlcnQgIT0gbnVsbCA6ICFNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQuZXF1YWxzKG1hcEtleUNvbnZlcnQpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6CisJCQkJcmV0dXJuIG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzICE9IG51bGwgJiYgIW1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fVFlQRV9DT05WRVJURVI7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVI7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJUOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlcnNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUzsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19UWVBFX0NPTlZFUlRFUlM7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQ09OVkVSVDsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BST1BFUlRJRVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckhvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUjsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlQ7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVJTOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSUzsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT05WRVJUOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGNvbnZlcnQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKGNvbnZlcnQpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1hcEtleUNvbnZlcnQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKG1hcEtleUNvbnZlcnQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsyXzAuRU5VTUVSQVRFRCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9iVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEVjbGlwc2VMaW5rMl8wLkxPQik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsyXzAuVEVNUE9SQUwpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rMl8wLkNPTlZFUlQpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKwkKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKKwkJCWVsZW1lbnROYW1lLCAKKwkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKKwkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb24oKSwgCisJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZFRhcmdldENsYXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRGZXRjaFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRPcmRlckJ5VHJhbnNsYXRvcigpLAorCQkJWG1sT3JkZXJDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk9SREVSX0NPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9PcmRlckNvbHVtbigpKSwJCQorCQkJYnVpbGRNYXBLZXlUcmFuc2xhdG9yKCksCisJCQlYbWxNYXBLZXlDbGFzcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuTUFQX0tFWV9DTEFTUywgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlDbGFzcygpKSwJCQorCQkJYnVpbGRNYXBLZXlUZW1wb3JhbFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTWFwS2V5RW51bWVyYXRlZFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTWFwS2V5Q29udmVydFRyYW5zbGF0b3IoKSwKKwkJCVhtbEF0dHJpYnV0ZU92ZXJyaWRlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKSksCQkKKwkJCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk1BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREUsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpKSwJCQorCQkJWG1sQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5NQVBfS0VZX0NPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlDb2x1bW4oKSksCQkKKwkJCVhtbEpvaW5Db2x1bW4uYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5Sm9pbkNvbHVtbnMoKSksCQkKKwkJCVhtbENvbHVtbi5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0NvbHVtbigpKSwJCQorCQkJYnVpbGRUZW1wb3JhbFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRW51bWVyYXRlZFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTG9iVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpLAorCQkJWG1sQXR0cmlidXRlT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLkFUVFJJQlVURV9PVkVSUklERSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9BdHRyaWJ1dGVPdmVycmlkZXMoKSksCQkKKwkJCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLkFTU09DSUFUSU9OX09WRVJSSURFLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkpLAorCQkJWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpKSwKKwkJCVhtbENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX1R5cGVDb252ZXJ0ZXIoKSksCisJCQlYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpKSwKKwkJCVhtbENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkpLAorCQkJWG1sQ29sbGVjdGlvblRhYmxlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5DT0xMRUNUSU9OX1RBQkxFLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0NvbGxlY3Rpb25UYWJsZSgpKSwKKwkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5Q29udmVydFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5NQVBfS0VZX0NPTlZFUlQsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLkNPTlZFUlQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzAxZjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGFibGUuamF2YQpAQCAtMCwwICsxLDEwMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVtYmVkZGFibGU8L2I+PC9lbT4nLgorICogIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDb3B5UG9saWN5IDxlbT5Db3B5IFBvbGljeTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldENsb25lQ29weVBvbGljeSA8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbEVtYmVkZGFibGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSBpbXBsZW1lbnRzIFhtbEN1c3RvbWl6ZXJIb2xkZXIsIFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLCBYbWxDb252ZXJ0ZXJzSG9sZGVyLCBYbWxQcm9wZXJ0eUNvbnRhaW5lcgoreworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1c3RvbWl6ZXIoKSA8ZW0+Q3VzdG9taXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q3VzdG9taXplcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbEN1c3RvbWl6ZXIgY3VzdG9taXplcjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZVRyYWNraW5nKCkgPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2hhbmdlVHJhY2tpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxDaGFuZ2VUcmFja2luZyBjaGFuZ2VUcmFja2luZzsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcnMoKSA8ZW0+Q29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb252ZXJ0ZXJzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29udmVydGVyPiBjb252ZXJ0ZXJzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXJzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gdHlwZUNvbnZlcnRlcnM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IHN0cnVjdENvbnZlcnRlcnM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29weVBvbGljeSgpIDxlbT5Db3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29weVBvbGljeSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbENvcHlQb2xpY3kgY29weVBvbGljeTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgaW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbG9uZUNvcHlQb2xpY3koKSA8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENsb25lQ29weVBvbGljeSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbENsb25lQ29weVBvbGljeSBjbG9uZUNvcHlQb2xpY3k7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb29sZWFuIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sRW1iZWRkYWJsZSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0VNQkVEREFCTEU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VzdG9taXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRDdXN0b21pemVyKFhtbEN1c3RvbWl6ZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEN1c3RvbWl6ZXJIb2xkZXJfQ3VzdG9taXplcigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkKKwl7CisJCXJldHVybiBjdXN0b21pemVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEN1c3RvbWl6ZXIoWG1sQ3VzdG9taXplciBuZXdDdXN0b21pemVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sQ3VzdG9taXplciBvbGRDdXN0b21pemVyID0gY3VzdG9taXplcjsKKwkJY3VzdG9taXplciA9IG5ld0N1c3RvbWl6ZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUiwgb2xkQ3VzdG9taXplciwgbmV3Q3VzdG9taXplcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0Q3VzdG9taXplciA8ZW0+Q3VzdG9taXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Q3VzdG9taXplcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1c3RvbWl6ZXIoWG1sQ3VzdG9taXplciBuZXdDdXN0b21pemVyKQorCXsKKwkJaWYgKG5ld0N1c3RvbWl6ZXIgIT0gY3VzdG9taXplcikKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoY3VzdG9taXplciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljdXN0b21pemVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DVVNUT01JWkVSLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdDdXN0b21pemVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0N1c3RvbWl6ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVIsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Q3VzdG9taXplcihuZXdDdXN0b21pemVyLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUiwgbmV3Q3VzdG9taXplciwgbmV3Q3VzdG9taXplcikpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoYW5nZSBUcmFja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q2hhbmdlVHJhY2tpbmcoWG1sQ2hhbmdlVHJhY2tpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpCisJeworCQlyZXR1cm4gY2hhbmdlVHJhY2tpbmc7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2hhbmdlVHJhY2tpbmcoWG1sQ2hhbmdlVHJhY2tpbmcgbmV3Q2hhbmdlVHJhY2tpbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxDaGFuZ2VUcmFja2luZyBvbGRDaGFuZ2VUcmFja2luZyA9IGNoYW5nZVRyYWNraW5nOworCQljaGFuZ2VUcmFja2luZyA9IG5ld0NoYW5nZVRyYWNraW5nOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NIQU5HRV9UUkFDS0lORywgb2xkQ2hhbmdlVHJhY2tpbmcsIG5ld0NoYW5nZVRyYWNraW5nKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDaGFuZ2VUcmFja2luZyA8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENoYW5nZVRyYWNraW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q2hhbmdlVHJhY2tpbmcoWG1sQ2hhbmdlVHJhY2tpbmcgbmV3Q2hhbmdlVHJhY2tpbmcpCisJeworCQlpZiAobmV3Q2hhbmdlVHJhY2tpbmcgIT0gY2hhbmdlVHJhY2tpbmcpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGNoYW5nZVRyYWNraW5nICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNoYW5nZVRyYWNraW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkcsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0NoYW5nZVRyYWNraW5nICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NoYW5nZVRyYWNraW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkcsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Q2hhbmdlVHJhY2tpbmcobmV3Q2hhbmdlVHJhY2tpbmcsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkcsIG5ld0NoYW5nZVRyYWNraW5nLCBuZXdDaGFuZ2VUcmFja2luZykpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX0NvbnZlcnRlcnMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbENvbnZlcnRlcj4gZ2V0Q29udmVydGVycygpCisJeworCQlpZiAoY29udmVydGVycyA9PSBudWxsKQorCQl7CisJCQljb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbENvbnZlcnRlcj4oWG1sQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPTlZFUlRFUlMpOworCQl9CisJCXJldHVybiBjb252ZXJ0ZXJzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9UeXBlQ29udmVydGVycygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gZ2V0VHlwZUNvbnZlcnRlcnMoKQorCXsKKwkJaWYgKHR5cGVDb252ZXJ0ZXJzID09IG51bGwpCisJCXsKKwkJCXR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+KFhtbFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fVFlQRV9DT05WRVJURVJTKTsKKwkJfQorCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpCisJeworCQlpZiAob2JqZWN0VHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKKwkJeworCQkJb2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4oWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTKTsKKwkJfQorCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfU3RydWN0Q29udmVydGVycygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKKwl7CisJCWlmIChzdHJ1Y3RDb252ZXJ0ZXJzID09IG51bGwpCisJCXsKKwkJCXN0cnVjdENvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPihYbWxTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fU1RSVUNUX0NPTlZFUlRFUlMpOworCQl9CisJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q29weVBvbGljeShYbWxDb3B5UG9saWN5KQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlX0NvcHlQb2xpY3koKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbENvcHlQb2xpY3kgZ2V0Q29weVBvbGljeSgpCisJeworCQlyZXR1cm4gY29weVBvbGljeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb3B5UG9saWN5KFhtbENvcHlQb2xpY3kgbmV3Q29weVBvbGljeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbENvcHlQb2xpY3kgb2xkQ29weVBvbGljeSA9IGNvcHlQb2xpY3k7CisJCWNvcHlQb2xpY3kgPSBuZXdDb3B5UG9saWN5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZLCBvbGRDb3B5UG9saWN5LCBuZXdDb3B5UG9saWN5KTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDb3B5UG9saWN5IDxlbT5Db3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENvcHlQb2xpY3koKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb3B5UG9saWN5KFhtbENvcHlQb2xpY3kgbmV3Q29weVBvbGljeSkKKwl7CisJCWlmIChuZXdDb3B5UG9saWN5ICE9IGNvcHlQb2xpY3kpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGNvcHlQb2xpY3kgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0NvcHlQb2xpY3kgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29weVBvbGljeSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Q29weVBvbGljeShuZXdDb3B5UG9saWN5LCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09QWV9QT0xJQ1ksIG5ld0NvcHlQb2xpY3ksIG5ld0NvcHlQb2xpY3kpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlX0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCisJeworCQlyZXR1cm4gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3ksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBvbGRJbnN0YW50aWF0aW9uQ29weVBvbGljeSA9IGluc3RhbnRpYXRpb25Db3B5UG9saWN5OworCQlpbnN0YW50aWF0aW9uQ29weVBvbGljeSA9IG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIG9sZEluc3RhbnRpYXRpb25Db3B5UG9saWN5LCBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpCisJeworCQlpZiAobmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgIT0gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGluc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWluc3RhbnRpYXRpb25Db3B5UG9saWN5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5LCBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV9DbG9uZUNvcHlQb2xpY3koKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbENsb25lQ29weVBvbGljeSBnZXRDbG9uZUNvcHlQb2xpY3koKQorCXsKKwkJcmV0dXJuIGNsb25lQ29weVBvbGljeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDbG9uZUNvcHlQb2xpY3koWG1sQ2xvbmVDb3B5UG9saWN5IG5ld0Nsb25lQ29weVBvbGljeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbENsb25lQ29weVBvbGljeSBvbGRDbG9uZUNvcHlQb2xpY3kgPSBjbG9uZUNvcHlQb2xpY3k7CisJCWNsb25lQ29weVBvbGljeSA9IG5ld0Nsb25lQ29weVBvbGljeTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWSwgb2xkQ2xvbmVDb3B5UG9saWN5LCBuZXdDbG9uZUNvcHlQb2xpY3kpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldENsb25lQ29weVBvbGljeSA8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRDbG9uZUNvcHlQb2xpY3koKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDbG9uZUNvcHlQb2xpY3koWG1sQ2xvbmVDb3B5UG9saWN5IG5ld0Nsb25lQ29weVBvbGljeSkKKwl7CisJCWlmIChuZXdDbG9uZUNvcHlQb2xpY3kgIT0gY2xvbmVDb3B5UG9saWN5KQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChjbG9uZUNvcHlQb2xpY3kgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2xvbmVDb3B5UG9saWN5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q2xvbmVDb3B5UG9saWN5ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Nsb25lQ29weVBvbGljeSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Q2xvbmVDb3B5UG9saWN5KG5ld0Nsb25lQ29weVBvbGljeSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NMT05FX0NPUFlfUE9MSUNZLCBuZXdDbG9uZUNvcHlQb2xpY3ksIG5ld0Nsb25lQ29weVBvbGljeSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKKwl7CisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCisJCXsKKwkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BST1BFUlRJRVMpOworCQl9CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb29sZWFuIGdldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQorCXsKKwkJcmV0dXJuIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKEJvb2xlYW4gbmV3RXhjbHVkZURlZmF1bHRNYXBwaW5ncykKKwl7CisJCUJvb2xlYW4gb2xkRXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3M7CisJCWV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBuZXdFeGNsdWRlRGVmYXVsdE1hcHBpbmdzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUywgb2xkRXhjbHVkZURlZmF1bHRNYXBwaW5ncywgZXhjbHVkZURlZmF1bHRNYXBwaW5ncykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVI6CisJCQkJcmV0dXJuIGJhc2ljU2V0Q3VzdG9taXplcihudWxsLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkc6CisJCQkJcmV0dXJuIGJhc2ljU2V0Q2hhbmdlVHJhY2tpbmcobnVsbCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1RZUEVfQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RydWN0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZOgorCQkJCXJldHVybiBiYXNpY1NldENvcHlQb2xpY3kobnVsbCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKKwkJCQlyZXR1cm4gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShudWxsLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWToKKwkJCQlyZXR1cm4gYmFzaWNTZXRDbG9uZUNvcHlQb2xpY3kobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVI6CisJCQkJcmV0dXJuIGdldEN1c3RvbWl6ZXIoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkc6CisJCQkJcmV0dXJuIGdldENoYW5nZVRyYWNraW5nKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gZ2V0Q29udmVydGVycygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1RZUEVfQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcnMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgorCQkJCXJldHVybiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTOgorCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZOgorCQkJCXJldHVybiBnZXRDb3B5UG9saWN5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKKwkJCQlyZXR1cm4gZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWToKKwkJCQlyZXR1cm4gZ2V0Q2xvbmVDb3B5UG9saWN5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgorCQkJCXJldHVybiBnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVI6CisJCQkJc2V0Q3VzdG9taXplcigoWG1sQ3VzdG9taXplciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NIQU5HRV9UUkFDS0lORzoKKwkJCQlzZXRDaGFuZ2VUcmFja2luZygoWG1sQ2hhbmdlVHJhY2tpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTOgorCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCWdldENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbENvbnZlcnRlcj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19UWVBFX0NPTlZFUlRFUlM6CisJCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6CisJCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxPYmplY3RUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTOgorCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFN0cnVjdENvbnZlcnRlcj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QUk9QRVJUSUVTOgorCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOworCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZOgorCQkJCXNldENvcHlQb2xpY3koKFhtbENvcHlQb2xpY3kpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgorCQkJCXNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KChYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NMT05FX0NPUFlfUE9MSUNZOgorCQkJCXNldENsb25lQ29weVBvbGljeSgoWG1sQ2xvbmVDb3B5UG9saWN5KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgorCQkJCXNldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DVVNUT01JWkVSOgorCQkJCXNldEN1c3RvbWl6ZXIoKFhtbEN1c3RvbWl6ZXIpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NIQU5HRV9UUkFDS0lORzoKKwkJCQlzZXRDaGFuZ2VUcmFja2luZygoWG1sQ2hhbmdlVHJhY2tpbmcpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPTlZFUlRFUlM6CisJCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1RZUEVfQ09OVkVSVEVSUzoKKwkJCQlnZXRUeXBlQ29udmVydGVycygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6CisJCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19TVFJVQ1RfQ09OVkVSVEVSUzoKKwkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzoKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09QWV9QT0xJQ1k6CisJCQkJc2V0Q29weVBvbGljeSgoWG1sQ29weVBvbGljeSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKKwkJCQlzZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgoWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NMT05FX0NPUFlfUE9MSUNZOgorCQkJCXNldENsb25lQ29weVBvbGljeSgoWG1sQ2xvbmVDb3B5UG9saWN5KW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6CisJCQkJc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUjoKKwkJCQlyZXR1cm4gY3VzdG9taXplciAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NIQU5HRV9UUkFDS0lORzoKKwkJCQlyZXR1cm4gY2hhbmdlVHJhY2tpbmcgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTOgorCQkJCXJldHVybiBjb252ZXJ0ZXJzICE9IG51bGwgJiYgIWNvbnZlcnRlcnMuaXNFbXB0eSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1RZUEVfQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhdHlwZUNvbnZlcnRlcnMuaXNFbXB0eSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIW9iamVjdFR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19TVFJVQ1RfQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gc3RydWN0Q29udmVydGVycyAhPSBudWxsICYmICFzdHJ1Y3RDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZOgorCQkJCXJldHVybiBjb3B5UG9saWN5ICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKKwkJCQlyZXR1cm4gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWToKKwkJCQlyZXR1cm4gY2xvbmVDb3B5UG9saWN5ICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgorCQkJCXJldHVybiBFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQgPT0gbnVsbCA/IGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgIT0gbnVsbCA6ICFFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQuZXF1YWxzKGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDdXN0b21pemVySG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NVU1RPTUlaRVJfSE9MREVSX19DVVNUT01JWkVSOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NIQU5HRV9UUkFDS0lORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUl9fQ0hBTkdFX1RSQUNLSU5HOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlcnNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX0NPTlZFUlRFUlM7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1RZUEVfQ09OVkVSVEVSUzsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUlM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ3VzdG9taXplckhvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DVVNUT01JWkVSX0hPTERFUl9fQ1VTVE9NSVpFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSX19DSEFOR0VfVFJBQ0tJTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NIQU5HRV9UUkFDS0lORzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19UWVBFX0NPTlZFUlRFUlM7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3M6ICIpOworCQlyZXN1bHQuYXBwZW5kKGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisJCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJZWxlbWVudE5hbWUsIAorCQkJc3RydWN0dXJhbEZlYXR1cmUsIAorCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlKCksIAorCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGRDbGFzc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpLAorCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ3VzdG9taXplclRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ2hhbmdlVHJhY2tpbmdUcmFuc2xhdG9yKCksCisJCQlidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKKwkJCUF0dHJpYnV0ZXMuYnVpbGRUcmFuc2xhdG9yKCksCisJCQlidWlsZENvcHlQb2xpY3lUcmFuc2xhdG9yKCksCisJCQlidWlsZEluc3RhbnRpYXRpb25Db3lwUG9saWN5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRDbG9uZUNvcHlQb2xpY3lUcmFuc2xhdG9yKCksCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3NUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDdXN0b21pemVyVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbEN1c3RvbWl6ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDaGFuZ2VUcmFja2luZ1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDaGFuZ2VUcmFja2luZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb3B5UG9saWN5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbENvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPUFlfUE9MSUNZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfQ29weVBvbGljeSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSW5zdGFudGlhdGlvbkNveXBQb2xpY3lUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLklOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2xvbmVDb3B5UG9saWN5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbENsb25lQ29weVBvbGljeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0xPTkVfQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV9DbG9uZUNvcHlQb2xpY3koKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzA3YjMxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZC5qYXZhCkBAIC0wLDAgKzEsMzU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW1iZWRkZWQgSW1wbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbEVtYmVkZGVkIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkIGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZworeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbEVtYmVkZGVkKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfRU1CRURERUQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKKwl7CisJCXJldHVybiBhY2Nlc3NNZXRob2RzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKKwkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCisJeworCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQorCXsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKKwkJeworCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX1BST1BFUlRJRVMpOworCQl9CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19QUk9QRVJUSUVTOgorCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQUNDRVNTX01FVEhPRFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fUFJPUEVSVElFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKKwkJCWVsZW1lbnROYW1lLCAKKwkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKKwkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWQoKSwgCisJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWRJZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZElkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4MDNmYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWRJZC5qYXZhCkBAIC0wLDAgKzEsMzUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW1iZWRkZWQgSWQgSW1wbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgWG1sRW1iZWRkZWRJZCBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkIGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZworeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbEVtYmVkZGVkSWQoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTUJFRERFRF9JRDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQorCXsKKwkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOworCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQorCXsKKwkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKKwl7CisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCisJCXsKKwkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTKTsKKwkJfQorCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFM6CisJCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFM6CisJCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFM6CisJCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTOgorCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOworCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUzoKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FDQ0VTU19NRVRIT0RTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX1BST1BFUlRJRVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCisJCQllbGVtZW50TmFtZSwgCisJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCisJCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVtYmVkZGVkSWQoKSwgCisJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNWUyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVudGl0eS5qYXZhCkBAIC0wLDAgKzEsMTU5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sRW50aXR5XzFfMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiAKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbnRpdHk8L2I+PC9lbT4nLgorICogIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE9wdGltaXN0aWNMb2NraW5nIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q29weVBvbGljeSA8ZW0+Q29weSBQb2xpY3k8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2xvbmVDb3B5UG9saWN5IDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5KCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbEVudGl0eSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkgaW1wbGVtZW50cyBYbWxSZWFkT25seSwgWG1sQ3VzdG9taXplckhvbGRlciwgWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIsIFhtbENhY2hlSG9sZGVyLCBYbWxDb252ZXJ0ZXJzSG9sZGVyLCBYbWxRdWVyeUNvbnRhaW5lciwgWG1sUHJvcGVydHlDb250YWluZXIsIFhtbEVudGl0eV8xXzEKK3sKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhZE9ubHkoKSA8ZW0+UmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZWFkT25seSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFJFQURfT05MWV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFkT25seSgpIDxlbT5SZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlYWRPbmx5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQm9vbGVhbiByZWFkT25seSA9IFJFQURfT05MWV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1c3RvbWl6ZXIoKSA8ZW0+Q3VzdG9taXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q3VzdG9taXplcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbEN1c3RvbWl6ZXIgY3VzdG9taXplcjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZVRyYWNraW5nKCkgPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2hhbmdlVHJhY2tpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxDaGFuZ2VUcmFja2luZyBjaGFuZ2VUcmFja2luZzsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhY2hlKCkgPGVtPkNhY2hlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDYWNoZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbENhY2hlIGNhY2hlOworCisJLyoqCisJICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0CisJICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRXhpc3RlbmNlVHlwZSBFWElTVEVOQ0VfQ0hFQ0tJTkdfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSA8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFeGlzdGVuY2VDaGVja2luZygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEV4aXN0ZW5jZVR5cGUgZXhpc3RlbmNlQ2hlY2tpbmcgPSBFWElTVEVOQ0VfQ0hFQ0tJTkdfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXJzKCkgPGVtPkNvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29udmVydGVycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbENvbnZlcnRlcj4gY29udmVydGVyczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXJzKCkgPGVtPlR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IHR5cGVDb252ZXJ0ZXJzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IG9iamVjdFR5cGVDb252ZXJ0ZXJzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RydWN0Q29udmVydGVycygpIDxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBzdHJ1Y3RDb252ZXJ0ZXJzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkgPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiBuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbWFyeUtleSgpIDxlbT5QcmltYXJ5IEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJpbWFyeUtleSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbFByaW1hcnlLZXlfMV8xIHByaW1hcnlLZXk7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpbWlzdGljTG9ja2luZygpIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9wdGltaXN0aWNMb2NraW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sT3B0aW1pc3RpY0xvY2tpbmcgb3B0aW1pc3RpY0xvY2tpbmc7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5UG9saWN5KCkgPGVtPkNvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb3B5UG9saWN5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ29weVBvbGljeSBjb3B5UG9saWN5OworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpbnN0YW50aWF0aW9uQ29weVBvbGljeTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsb25lQ29weVBvbGljeSgpIDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ2xvbmVDb3B5UG9saWN5IGNsb25lQ29weVBvbGljeTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJvb2xlYW4gZXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxFbnRpdHkoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTlRJVFk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRSZWFkT25seShCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZWFkT25seV9SZWFkT25seSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvb2xlYW4gZ2V0UmVhZE9ubHkoKQorCXsKKwkJcmV0dXJuIHJlYWRPbmx5OworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UmVhZE9ubHkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSZWFkT25seSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KEJvb2xlYW4gbmV3UmVhZE9ubHkpCisJeworCQlCb29sZWFuIG9sZFJlYWRPbmx5ID0gcmVhZE9ubHk7CisJCXJlYWRPbmx5ID0gbmV3UmVhZE9ubHk7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRUFEX09OTFksIG9sZFJlYWRPbmx5LCByZWFkT25seSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q3VzdG9taXplcihYbWxDdXN0b21pemVyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDdXN0b21pemVySG9sZGVyX0N1c3RvbWl6ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbEN1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpCisJeworCQlyZXR1cm4gY3VzdG9taXplcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDdXN0b21pemVyKFhtbEN1c3RvbWl6ZXIgbmV3Q3VzdG9taXplciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbEN1c3RvbWl6ZXIgb2xkQ3VzdG9taXplciA9IGN1c3RvbWl6ZXI7CisJCWN1c3RvbWl6ZXIgPSBuZXdDdXN0b21pemVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUiwgb2xkQ3VzdG9taXplciwgbmV3Q3VzdG9taXplcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDdXN0b21pemVyIDxlbT5DdXN0b21pemVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRDdXN0b21pemVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3VzdG9taXplcihYbWxDdXN0b21pemVyIG5ld0N1c3RvbWl6ZXIpCisJeworCQlpZiAobmV3Q3VzdG9taXplciAhPSBjdXN0b21pemVyKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChjdXN0b21pemVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWN1c3RvbWl6ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q3VzdG9taXplciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDdXN0b21pemVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NVU1RPTUlaRVIsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Q3VzdG9taXplcihuZXdDdXN0b21pemVyLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DVVNUT01JWkVSLCBuZXdDdXN0b21pemVyLCBuZXdDdXN0b21pemVyKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIFRyYWNraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRDaGFuZ2VUcmFja2luZyhYbWxDaGFuZ2VUcmFja2luZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJfQ2hhbmdlVHJhY2tpbmcoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbENoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCkKKwl7CisJCXJldHVybiBjaGFuZ2VUcmFja2luZzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDaGFuZ2VUcmFja2luZyhYbWxDaGFuZ2VUcmFja2luZyBuZXdDaGFuZ2VUcmFja2luZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbENoYW5nZVRyYWNraW5nIG9sZENoYW5nZVRyYWNraW5nID0gY2hhbmdlVHJhY2tpbmc7CisJCWNoYW5nZVRyYWNraW5nID0gbmV3Q2hhbmdlVHJhY2tpbmc7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DSEFOR0VfVFJBQ0tJTkcsIG9sZENoYW5nZVRyYWNraW5nLCBuZXdDaGFuZ2VUcmFja2luZyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDaGFuZ2VUcmFja2luZyA8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENoYW5nZVRyYWNraW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q2hhbmdlVHJhY2tpbmcoWG1sQ2hhbmdlVHJhY2tpbmcgbmV3Q2hhbmdlVHJhY2tpbmcpCisJeworCQlpZiAobmV3Q2hhbmdlVHJhY2tpbmcgIT0gY2hhbmdlVHJhY2tpbmcpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGNoYW5nZVRyYWNraW5nICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNoYW5nZVRyYWNraW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORywgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q2hhbmdlVHJhY2tpbmcgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2hhbmdlVHJhY2tpbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldENoYW5nZVRyYWNraW5nKG5ld0NoYW5nZVRyYWNraW5nLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DSEFOR0VfVFJBQ0tJTkcsIG5ld0NoYW5nZVRyYWNraW5nLCBuZXdDaGFuZ2VUcmFja2luZykpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q2FjaGUoWG1sQ2FjaGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyX0NhY2hlKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDYWNoZSBnZXRDYWNoZSgpCisJeworCQlyZXR1cm4gY2FjaGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2FjaGUoWG1sQ2FjaGUgbmV3Q2FjaGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxDYWNoZSBvbGRDYWNoZSA9IGNhY2hlOworCQljYWNoZSA9IG5ld0NhY2hlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEUsIG9sZENhY2hlLCBuZXdDYWNoZSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDYWNoZSA8ZW0+Q2FjaGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRDYWNoZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENhY2hlKFhtbENhY2hlIG5ld0NhY2hlKQorCXsKKwkJaWYgKG5ld0NhY2hlICE9IGNhY2hlKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChjYWNoZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljYWNoZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q2FjaGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2FjaGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Q2FjaGUobmV3Q2FjaGUsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFLCBuZXdDYWNoZSwgbmV3Q2FjaGUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgQ2hlY2tpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZQorCSAqIEBzZWUgI3NldEV4aXN0ZW5jZUNoZWNraW5nKEV4aXN0ZW5jZVR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyX0V4aXN0ZW5jZUNoZWNraW5nKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXhpc3RlbmNlVHlwZSBnZXRFeGlzdGVuY2VDaGVja2luZygpCisJeworCQlyZXR1cm4gZXhpc3RlbmNlQ2hlY2tpbmc7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRFeGlzdGVuY2VDaGVja2luZyA8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUKKwkgKiBAc2VlICNnZXRFeGlzdGVuY2VDaGVja2luZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEV4aXN0ZW5jZUNoZWNraW5nKEV4aXN0ZW5jZVR5cGUgbmV3RXhpc3RlbmNlQ2hlY2tpbmcpCisJeworCQlFeGlzdGVuY2VUeXBlIG9sZEV4aXN0ZW5jZUNoZWNraW5nID0gZXhpc3RlbmNlQ2hlY2tpbmc7CisJCWV4aXN0ZW5jZUNoZWNraW5nID0gbmV3RXhpc3RlbmNlQ2hlY2tpbmcgPT0gbnVsbCA/IEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVCA6IG5ld0V4aXN0ZW5jZUNoZWNraW5nOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhJU1RFTkNFX0NIRUNLSU5HLCBvbGRFeGlzdGVuY2VDaGVja2luZywgZXhpc3RlbmNlQ2hlY2tpbmcpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKQorCXsKKwkJaWYgKGNvbnZlcnRlcnMgPT0gbnVsbCkKKwkJeworCQkJY29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb252ZXJ0ZXI+KFhtbENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlMpOworCQl9CisJCXJldHVybiBjb252ZXJ0ZXJzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9UeXBlQ29udmVydGVycygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gZ2V0VHlwZUNvbnZlcnRlcnMoKQorCXsKKwkJaWYgKHR5cGVDb252ZXJ0ZXJzID09IG51bGwpCisJCXsKKwkJCXR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+KFhtbFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19UWVBFX0NPTlZFUlRFUlMpOworCQl9CisJCXJldHVybiB0eXBlQ29udmVydGVyczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKKwl7CisJCWlmIChvYmplY3RUeXBlQ29udmVydGVycyA9PSBudWxsKQorCQl7CisJCQlvYmplY3RUeXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPihYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyk7CisJCX0KKwkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1N0cnVjdENvbnZlcnRlcnMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpCisJeworCQlpZiAoc3RydWN0Q29udmVydGVycyA9PSBudWxsKQorCQl7CisJCQlzdHJ1Y3RDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4oWG1sU3RydWN0Q29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNUX0NPTlZFUlRFUlMpOworCQl9CisJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wdGltaXN0aWMgTG9ja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0T3B0aW1pc3RpY0xvY2tpbmcoWG1sT3B0aW1pc3RpY0xvY2tpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV9PcHRpbWlzdGljTG9ja2luZygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sT3B0aW1pc3RpY0xvY2tpbmcgZ2V0T3B0aW1pc3RpY0xvY2tpbmcoKQorCXsKKwkJcmV0dXJuIG9wdGltaXN0aWNMb2NraW5nOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE9wdGltaXN0aWNMb2NraW5nKFhtbE9wdGltaXN0aWNMb2NraW5nIG5ld09wdGltaXN0aWNMb2NraW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sT3B0aW1pc3RpY0xvY2tpbmcgb2xkT3B0aW1pc3RpY0xvY2tpbmcgPSBvcHRpbWlzdGljTG9ja2luZzsKKwkJb3B0aW1pc3RpY0xvY2tpbmcgPSBuZXdPcHRpbWlzdGljTG9ja2luZzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORywgb2xkT3B0aW1pc3RpY0xvY2tpbmcsIG5ld09wdGltaXN0aWNMb2NraW5nKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE9wdGltaXN0aWNMb2NraW5nIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0T3B0aW1pc3RpY0xvY2tpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPcHRpbWlzdGljTG9ja2luZyhYbWxPcHRpbWlzdGljTG9ja2luZyBuZXdPcHRpbWlzdGljTG9ja2luZykKKwl7CisJCWlmIChuZXdPcHRpbWlzdGljTG9ja2luZyAhPSBvcHRpbWlzdGljTG9ja2luZykKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAob3B0aW1pc3RpY0xvY2tpbmcgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpb3B0aW1pc3RpY0xvY2tpbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fT1BUSU1JU1RJQ19MT0NLSU5HLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdPcHRpbWlzdGljTG9ja2luZyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPcHRpbWlzdGljTG9ja2luZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkcsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0T3B0aW1pc3RpY0xvY2tpbmcobmV3T3B0aW1pc3RpY0xvY2tpbmcsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORywgbmV3T3B0aW1pc3RpY0xvY2tpbmcsIG5ld09wdGltaXN0aWNMb2NraW5nKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRDb3B5UG9saWN5KFhtbENvcHlQb2xpY3kpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV9Db3B5UG9saWN5KCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDb3B5UG9saWN5IGdldENvcHlQb2xpY3koKQorCXsKKwkJcmV0dXJuIGNvcHlQb2xpY3k7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29weVBvbGljeShYbWxDb3B5UG9saWN5IG5ld0NvcHlQb2xpY3ksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxDb3B5UG9saWN5IG9sZENvcHlQb2xpY3kgPSBjb3B5UG9saWN5OworCQljb3B5UG9saWN5ID0gbmV3Q29weVBvbGljeTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPUFlfUE9MSUNZLCBvbGRDb3B5UG9saWN5LCBuZXdDb3B5UG9saWN5KTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENvcHlQb2xpY3kgPGVtPkNvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Q29weVBvbGljeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvcHlQb2xpY3koWG1sQ29weVBvbGljeSBuZXdDb3B5UG9saWN5KQorCXsKKwkJaWYgKG5ld0NvcHlQb2xpY3kgIT0gY29weVBvbGljeSkKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoY29weVBvbGljeSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb3B5UG9saWN5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdDb3B5UG9saWN5ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvcHlQb2xpY3kpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Q29weVBvbGljeShuZXdDb3B5UG9saWN5LCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT1BZX1BPTElDWSwgbmV3Q29weVBvbGljeSwgbmV3Q29weVBvbGljeSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQorCXsKKwkJcmV0dXJuIGluc3RhbnRpYXRpb25Db3B5UG9saWN5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgb2xkSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPSBpbnN0YW50aWF0aW9uQ29weVBvbGljeTsKKwkJaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPSBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIG9sZEluc3RhbnRpYXRpb25Db3B5UG9saWN5LCBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSkKKwl7CisJCWlmIChuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBpbnN0YW50aWF0aW9uQ29weVBvbGljeSkKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3ksIG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xvbmUgQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRDbG9uZUNvcHlQb2xpY3koWG1sQ2xvbmVDb3B5UG9saWN5KQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfQ2xvbmVDb3B5UG9saWN5KCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDbG9uZUNvcHlQb2xpY3kgZ2V0Q2xvbmVDb3B5UG9saWN5KCkKKwl7CisJCXJldHVybiBjbG9uZUNvcHlQb2xpY3k7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSBuZXdDbG9uZUNvcHlQb2xpY3ksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxDbG9uZUNvcHlQb2xpY3kgb2xkQ2xvbmVDb3B5UG9saWN5ID0gY2xvbmVDb3B5UG9saWN5OworCQljbG9uZUNvcHlQb2xpY3kgPSBuZXdDbG9uZUNvcHlQb2xpY3k7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWSwgb2xkQ2xvbmVDb3B5UG9saWN5LCBuZXdDbG9uZUNvcHlQb2xpY3kpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2xvbmVDb3B5UG9saWN5IDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENsb25lQ29weVBvbGljeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENsb25lQ29weVBvbGljeShYbWxDbG9uZUNvcHlQb2xpY3kgbmV3Q2xvbmVDb3B5UG9saWN5KQorCXsKKwkJaWYgKG5ld0Nsb25lQ29weVBvbGljeSAhPSBjbG9uZUNvcHlQb2xpY3kpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGNsb25lQ29weVBvbGljeSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljbG9uZUNvcHlQb2xpY3kpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xPTkVfQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0Nsb25lQ29weVBvbGljeSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDbG9uZUNvcHlQb2xpY3kpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xPTkVfQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Q2xvbmVDb3B5UG9saWN5KG5ld0Nsb25lQ29weVBvbGljeSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xPTkVfQ09QWV9QT0xJQ1ksIG5ld0Nsb25lQ29weVBvbGljeSwgbmV3Q2xvbmVDb3B5UG9saWN5KSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+IGdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCisJeworCQlpZiAobmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzID09IG51bGwpCisJCXsKKwkJCW5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PihYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTKTsKKwkJfQorCQlyZXR1cm4gbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKKwl7CisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCisJCXsKKwkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJPUEVSVElFUyk7CisJCX0KKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRQcmltYXJ5S2V5KFhtbFByaW1hcnlLZXlfMV8xKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfMV8xX1ByaW1hcnlLZXkoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbFByaW1hcnlLZXlfMV8xIGdldFByaW1hcnlLZXkoKQorCXsKKwkJcmV0dXJuIHByaW1hcnlLZXk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJpbWFyeUtleShYbWxQcmltYXJ5S2V5XzFfMSBuZXdQcmltYXJ5S2V5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sUHJpbWFyeUtleV8xXzEgb2xkUHJpbWFyeUtleSA9IHByaW1hcnlLZXk7CisJCXByaW1hcnlLZXkgPSBuZXdQcmltYXJ5S2V5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVksIG9sZFByaW1hcnlLZXksIG5ld1ByaW1hcnlLZXkpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UHJpbWFyeUtleSA8ZW0+UHJpbWFyeSBLZXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRQcmltYXJ5S2V5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleShYbWxQcmltYXJ5S2V5XzFfMSBuZXdQcmltYXJ5S2V5KQorCXsKKwkJaWYgKG5ld1ByaW1hcnlLZXkgIT0gcHJpbWFyeUtleSkKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAocHJpbWFyeUtleSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwcmltYXJ5S2V5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdQcmltYXJ5S2V5ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ByaW1hcnlLZXkpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVksIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0UHJpbWFyeUtleShuZXdQcmltYXJ5S2V5LCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWSwgbmV3UHJpbWFyeUtleSwgbmV3UHJpbWFyeUtleSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvb2xlYW4gZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCisJeworCQlyZXR1cm4gZXhjbHVkZURlZmF1bHRNYXBwaW5nczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhCb29sZWFuIG5ld0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpCisJeworCQlCb29sZWFuIG9sZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOworCQlleGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gbmV3RXhjbHVkZURlZmF1bHRNYXBwaW5nczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUywgb2xkRXhjbHVkZURlZmF1bHRNYXBwaW5ncywgZXhjbHVkZURlZmF1bHRNYXBwaW5ncykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRDdXN0b21pemVyKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HOgorCQkJCXJldHVybiBiYXNpY1NldENoYW5nZVRyYWNraW5nKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU6CisJCQkJcmV0dXJuIGJhc2ljU2V0Q2FjaGUobnVsbCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT05WRVJURVJTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19UWVBFX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNUX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWToKKwkJCQlyZXR1cm4gYmFzaWNTZXRQcmltYXJ5S2V5KG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fT1BUSU1JU1RJQ19MT0NLSU5HOgorCQkJCXJldHVybiBiYXNpY1NldE9wdGltaXN0aWNMb2NraW5nKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1k6CisJCQkJcmV0dXJuIGJhc2ljU2V0Q29weVBvbGljeShudWxsLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6CisJCQkJcmV0dXJuIGJhc2ljU2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kobnVsbCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWToKKwkJCQlyZXR1cm4gYmFzaWNTZXRDbG9uZUNvcHlQb2xpY3kobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVBRF9PTkxZOgorCQkJCXJldHVybiBnZXRSZWFkT25seSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUjoKKwkJCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HOgorCQkJCXJldHVybiBnZXRDaGFuZ2VUcmFja2luZygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU6CisJCQkJcmV0dXJuIGdldENhY2hlKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWElTVEVOQ0VfQ0hFQ0tJTkc6CisJCQkJcmV0dXJuIGdldEV4aXN0ZW5jZUNoZWNraW5nKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT05WRVJURVJTOgorCQkJCXJldHVybiBnZXRDb252ZXJ0ZXJzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19UWVBFX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuIGdldFR5cGVDb252ZXJ0ZXJzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgorCQkJCXJldHVybiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNUX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuIGdldFN0cnVjdENvbnZlcnRlcnMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKKwkJCQlyZXR1cm4gZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWToKKwkJCQlyZXR1cm4gZ2V0UHJpbWFyeUtleSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fT1BUSU1JU1RJQ19MT0NLSU5HOgorCQkJCXJldHVybiBnZXRPcHRpbWlzdGljTG9ja2luZygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1k6CisJCQkJcmV0dXJuIGdldENvcHlQb2xpY3koKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6CisJCQkJcmV0dXJuIGdldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWToKKwkJCQlyZXR1cm4gZ2V0Q2xvbmVDb3B5UG9saWN5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6CisJCQkJcmV0dXJuIGdldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRUFEX09OTFk6CisJCQkJc2V0UmVhZE9ubHkoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NVU1RPTUlaRVI6CisJCQkJc2V0Q3VzdG9taXplcigoWG1sQ3VzdG9taXplciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HOgorCQkJCXNldENoYW5nZVRyYWNraW5nKChYbWxDaGFuZ2VUcmFja2luZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU6CisJCQkJc2V0Q2FjaGUoKFhtbENhY2hlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWElTVEVOQ0VfQ0hFQ0tJTkc6CisJCQkJc2V0RXhpc3RlbmNlQ2hlY2tpbmcoKEV4aXN0ZW5jZVR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlM6CisJCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7CisJCQkJZ2V0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQ29udmVydGVyPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVFlQRV9DT05WRVJURVJTOgorCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKKwkJCQlnZXRUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6CisJCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxPYmplY3RUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNUX0NPTlZFUlRFUlM6CisJCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7CisJCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU3RydWN0Q29udmVydGVyPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgorCQkJCWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmNsZWFyKCk7CisJCQkJZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJPUEVSVElFUzoKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZOgorCQkJCXNldFByaW1hcnlLZXkoKFhtbFByaW1hcnlLZXlfMV8xKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkc6CisJCQkJc2V0T3B0aW1pc3RpY0xvY2tpbmcoKFhtbE9wdGltaXN0aWNMb2NraW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT1BZX1BPTElDWToKKwkJCQlzZXRDb3B5UG9saWN5KChYbWxDb3B5UG9saWN5KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgorCQkJCXNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KChYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xPTkVfQ09QWV9QT0xJQ1k6CisJCQkJc2V0Q2xvbmVDb3B5UG9saWN5KChYbWxDbG9uZUNvcHlQb2xpY3kpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKKwkJCQlzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRUFEX09OTFk6CisJCQkJc2V0UmVhZE9ubHkoUkVBRF9PTkxZX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DVVNUT01JWkVSOgorCQkJCXNldEN1c3RvbWl6ZXIoKFhtbEN1c3RvbWl6ZXIpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HOgorCQkJCXNldENoYW5nZVRyYWNraW5nKChYbWxDaGFuZ2VUcmFja2luZyludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRToKKwkJCQlzZXRDYWNoZSgoWG1sQ2FjaGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhJU1RFTkNFX0NIRUNLSU5HOgorCQkJCXNldEV4aXN0ZW5jZUNoZWNraW5nKEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09OVkVSVEVSUzoKKwkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19UWVBFX0NPTlZFUlRFUlM6CisJCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6CisJCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVF9DT05WRVJURVJTOgorCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKKwkJCQlnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVk6CisJCQkJc2V0UHJpbWFyeUtleSgoWG1sUHJpbWFyeUtleV8xXzEpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fT1BUSU1JU1RJQ19MT0NLSU5HOgorCQkJCXNldE9wdGltaXN0aWNMb2NraW5nKChYbWxPcHRpbWlzdGljTG9ja2luZyludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT1BZX1BPTElDWToKKwkJCQlzZXRDb3B5UG9saWN5KChYbWxDb3B5UG9saWN5KW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6CisJCQkJc2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMT05FX0NPUFlfUE9MSUNZOgorCQkJCXNldENsb25lQ29weVBvbGljeSgoWG1sQ2xvbmVDb3B5UG9saWN5KW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKKwkJCQlzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JFQURfT05MWToKKwkJCQlyZXR1cm4gUkVBRF9PTkxZX0VERUZBVUxUID09IG51bGwgPyByZWFkT25seSAhPSBudWxsIDogIVJFQURfT05MWV9FREVGQVVMVC5lcXVhbHMocmVhZE9ubHkpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUjoKKwkJCQlyZXR1cm4gY3VzdG9taXplciAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HOgorCQkJCXJldHVybiBjaGFuZ2VUcmFja2luZyAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU6CisJCQkJcmV0dXJuIGNhY2hlICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWElTVEVOQ0VfQ0hFQ0tJTkc6CisJCQkJcmV0dXJuIGV4aXN0ZW5jZUNoZWNraW5nICE9IEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuIGNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhY29udmVydGVycy5pc0VtcHR5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19UWVBFX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIW9iamVjdFR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVF9DT05WRVJURVJTOgorCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXN0cnVjdENvbnZlcnRlcnMuaXNFbXB0eSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgorCQkJCXJldHVybiBuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgIT0gbnVsbCAmJiAhbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWToKKwkJCQlyZXR1cm4gcHJpbWFyeUtleSAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fT1BUSU1JU1RJQ19MT0NLSU5HOgorCQkJCXJldHVybiBvcHRpbWlzdGljTG9ja2luZyAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1k6CisJCQkJcmV0dXJuIGNvcHlQb2xpY3kgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6CisJCQkJcmV0dXJuIGluc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWToKKwkJCQlyZXR1cm4gY2xvbmVDb3B5UG9saWN5ICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6CisJCQkJcmV0dXJuIEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCA9PSBudWxsID8gZXhjbHVkZURlZmF1bHRNYXBwaW5ncyAhPSBudWxsIDogIUVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVC5lcXVhbHMoZXhjbHVkZURlZmF1bHRNYXBwaW5ncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlYWRPbmx5LmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVBRF9PTkxZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SRUFEX09OTFlfX1JFQURfT05MWTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDdXN0b21pemVySG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVI7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DSEFOR0VfVFJBQ0tJTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVJfX0NIQU5HRV9UUkFDS0lORzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDYWNoZUhvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYSVNURU5DRV9DSEVDS0lORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfSE9MREVSX19FWElTVEVOQ0VfQ0hFQ0tJTkc7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1RZUEVfQ09OVkVSVEVSUzsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlfMV8xLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVk6IHJldHVybiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9FTlRJVFlfMTFfX1BSSU1BUllfS0VZOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUmVhZE9ubHkuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkVBRF9PTkxZX19SRUFEX09OTFk6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVBRF9PTkxZOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEN1c3RvbWl6ZXJIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSX19DSEFOR0VfVFJBQ0tJTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENhY2hlSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX0hPTERFUl9fQ0FDSEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX0hPTERFUl9fRVhJU1RFTkNFX0NIRUNLSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYSVNURU5DRV9DSEVDS0lORzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlM7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVFlQRV9DT05WRVJURVJTOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1RSVUNUX0NPTlZFUlRFUlM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEVudGl0eV8xXzEuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuWE1MX0VOVElUWV8xMV9fUFJJTUFSWV9LRVk6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVk7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChyZWFkT25seTogIik7CisJCXJlc3VsdC5hcHBlbmQocmVhZE9ubHkpOworCQlyZXN1bHQuYXBwZW5kKCIsIGV4aXN0ZW5jZUNoZWNraW5nOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChleGlzdGVuY2VDaGVja2luZyk7CisJCXJlc3VsdC5hcHBlbmQoIiwgZXhjbHVkZURlZmF1bHRNYXBwaW5nczogIik7CisJCXJlc3VsdC5hcHBlbmQoZXhjbHVkZURlZmF1bHRNYXBwaW5ncyk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVhZE9ubHlUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisJCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCisJCQllbGVtZW50TmFtZSwgCisJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCisJCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eSgpLCAKKwkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ2FjaGVhYmxlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRSZWFkT25seVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRXhpc3RlbmNlQ2hlY2tpbmdUcmFuc2xhdG9yKCksCisJCQlidWlsZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3NUcmFuc2xhdG9yKCksCisJCQlidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDdXN0b21pemVyVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDaGFuZ2VUcmFja2luZ1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkVGFibGVUcmFuc2xhdG9yKCksCisJCQlidWlsZFNlY29uZGFyeVRhYmxlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSWRDbGFzc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUHJpbWFyeUtleVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSW5oZXJpdGFuY2VUcmFuc2xhdG9yKCksCisJCQlidWlsZERpc2NyaW1pbmF0b3JWYWx1ZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRGlzY3JpbWluYXRvckNvbHVtblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkT3B0aW1pc3RpY0xvY2tpbmdUcmFuc2xhdG9yKCksCisJCQlidWlsZENhY2hlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCisJCQlidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCisJCQlidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCisJCQlidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ29weVBvbGljeVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSW5zdGFudGlhdGlvbkNveXBQb2xpY3lUcmFuc2xhdG9yKCksCisJCQlidWlsZENsb25lQ29weVBvbGljeVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCksCisJCQlidWlsZFRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAorCQkJYnVpbGROYW1lZFF1ZXJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRTcWxSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpLAorCQkJYnVpbGRFeGNsdWRlRGVmYXVsdExpc3RlbmVyc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCisJCQlidWlsZEVudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUHJlUGVyc2lzdFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUG9zdFBlcnNpc3RUcmFuc2xhdG9yKCksCisJCQlidWlsZFByZVJlbW92ZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUG9zdFJlbW92ZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUHJlVXBkYXRlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQb3N0VXBkYXRlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQb3N0TG9hZFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpLAorCQkJQXR0cmlidXRlcy5idWlsZFRyYW5zbGF0b3IoKQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDdXN0b21pemVyVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbEN1c3RvbWl6ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDaGFuZ2VUcmFja2luZ1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDaGFuZ2VUcmFja2luZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcmltYXJ5S2V5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFByaW1hcnlLZXkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMV8xLlBSSU1BUllfS0VZLCBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMV8xX1ByaW1hcnlLZXkoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9wdGltaXN0aWNMb2NraW5nVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbE9wdGltaXN0aWNMb2NraW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PUFRJTUlTVElDX0xPQ0tJTkcsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X09wdGltaXN0aWNMb2NraW5nKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYWNoZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDYWNoZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVIb2xkZXJfQ2FjaGUoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX0NvbnZlcnRlcnMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9UeXBlQ29udmVydGVycygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxPYmplY3RUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9PYmplY3RUeXBlQ29udmVydGVycygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFN0cnVjdENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1N0cnVjdENvbnZlcnRlcnMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvcHlQb2xpY3lUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQ29weVBvbGljeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0NvcHlQb2xpY3koKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEluc3RhbnRpYXRpb25Db3lwUG9saWN5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2xvbmVDb3B5UG9saWN5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbENsb25lQ29weVBvbGljeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0xPTkVfQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0Nsb25lQ29weVBvbGljeSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmVhZE9ubHlUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUkVBRF9PTkxZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFJlYWRPbmx5X1JlYWRPbmx5KCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEV4aXN0ZW5jZUNoZWNraW5nVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZUhvbGRlcl9FeGlzdGVuY2VDaGVja2luZygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYQ0xVREVfREVGQVVMVF9NQVBQSU5HUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUlksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVudGl0eU1hcHBpbmdzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVudGl0eU1hcHBpbmdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcwYjYyZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5TWFwcGluZ3MuamF2YQpAQCAtMCwwICsxLDUwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlUm9vdFRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGluazJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiAKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2I+PC9lbT4nLgorICogIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbEVudGl0eU1hcHBpbmdzIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzIGltcGxlbWVudHMgWG1sQ29udmVydGVyc0hvbGRlciwgWG1sUXVlcnlDb250YWluZXIKK3sKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXJzKCkgPGVtPkNvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29udmVydGVycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbENvbnZlcnRlcj4gY29udmVydGVyczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXJzKCkgPGVtPlR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IHR5cGVDb252ZXJ0ZXJzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IG9iamVjdFR5cGVDb252ZXJ0ZXJzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RydWN0Q29udmVydGVycygpIDxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBzdHJ1Y3RDb252ZXJ0ZXJzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkgPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiBuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sRW50aXR5TWFwcGluZ3MoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTlRJVFlfTUFQUElOR1M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfQ29udmVydGVycygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJzKCkKKwl7CisJCWlmIChjb252ZXJ0ZXJzID09IG51bGwpCisJCXsKKwkJCWNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQ29udmVydGVyPihYbWxDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DT05WRVJURVJTKTsKKwkJfQorCQlyZXR1cm4gY29udmVydGVyczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCkKKwl7CisJCWlmICh0eXBlQ29udmVydGVycyA9PSBudWxsKQorCQl7CisJCQl0eXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUeXBlQ29udmVydGVyPihYbWxUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVFlQRV9DT05WRVJURVJTKTsKKwkJfQorCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpCisJeworCQlpZiAob2JqZWN0VHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKKwkJeworCQkJb2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4oWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMpOworCQl9CisJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IGdldFN0cnVjdENvbnZlcnRlcnMoKQorCXsKKwkJaWYgKHN0cnVjdENvbnZlcnRlcnMgPT0gbnVsbCkKKwkJeworCQkJc3RydWN0Q29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+KFhtbFN0cnVjdENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTKTsKKwkJfQorCQlyZXR1cm4gc3RydWN0Q29udmVydGVyczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeT4gZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKKwl7CisJCWlmIChuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPT0gbnVsbCkKKwkJeworCQkJbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+KFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVMpOworCQl9CisJCXJldHVybiBuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DT05WRVJURVJTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UWVBFX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1RSVUNUX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gZ2V0Q29udmVydGVycygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVFlQRV9DT05WRVJURVJTOgorCQkJCXJldHVybiBnZXRUeXBlQ29udmVydGVycygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTOgorCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6CisJCQkJcmV0dXJuIGdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NPTlZFUlRFUlM6CisJCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7CisJCQkJZ2V0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQ29udmVydGVyPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVFlQRV9DT05WRVJURVJTOgorCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKKwkJCQlnZXRUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6CisJCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxPYmplY3RUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1RSVUNUX0NPTlZFUlRFUlM6CisJCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7CisJCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU3RydWN0Q29udmVydGVyPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgorCQkJCWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmNsZWFyKCk7CisJCQkJZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ09OVkVSVEVSUzoKKwkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UWVBFX0NPTlZFUlRFUlM6CisJCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6CisJCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTOgorCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKKwkJCQlnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DT05WRVJURVJTOgorCQkJCXJldHVybiBjb252ZXJ0ZXJzICE9IG51bGwgJiYgIWNvbnZlcnRlcnMuaXNFbXB0eSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVFlQRV9DT05WRVJURVJTOgorCQkJCXJldHVybiB0eXBlQ29udmVydGVycyAhPSBudWxsICYmICF0eXBlQ29udmVydGVycy5pc0VtcHR5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgorCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVycyAhPSBudWxsICYmICFvYmplY3RUeXBlQ29udmVydGVycy5pc0VtcHR5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TVFJVQ1RfQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gc3RydWN0Q29udmVydGVycyAhPSBudWxsICYmICFzdHJ1Y3RDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKKwkJCQlyZXR1cm4gbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzICE9IG51bGwgJiYgIW5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlcnNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUzsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19UWVBFX0NPTlZFUlRFUlM7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxRdWVyeUNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NPTlZFUlRFUlM7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVFlQRV9DT05WRVJURVJTOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1RSVUNUX0NPTlZFUlRFUlM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogdmVyc2lvbiAtPiBzY2hlbWEgbG9jYXRpb24gbWFwcGluZyAqKioqKioqKioqKioqKioqKioqKgorCQorCXByaXZhdGUgc3RhdGljIFN0cmluZyBuYW1lc3BhY2UgPSBFY2xpcHNlTGluay5TQ0hFTUFfTkFNRVNQQUNFOworCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgeworCQlyZXR1cm4gbmFtZXNwYWNlOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMgPSBidWlsZFZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMoKTsKKwkKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkVmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucygpIHsKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKwkJbWFwLnB1dChFY2xpcHNlTGluay5TQ0hFTUFfVkVSU0lPTiwgRWNsaXBzZUxpbmsuU0NIRU1BX0xPQ0FUSU9OKTsKKwkJbWFwLnB1dChFY2xpcHNlTGluazFfMS5TQ0hFTUFfVkVSU0lPTiwgRWNsaXBzZUxpbmsxXzEuU0NIRU1BX0xPQ0FUSU9OKTsKKwkJbWFwLnB1dChFY2xpcHNlTGluazJfMC5TQ0hFTUFfVkVSU0lPTiwgRWNsaXBzZUxpbmsyXzAuU0NIRU1BX0xPQ0FUSU9OKTsKKwkJcmV0dXJuIG1hcDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbkZvclZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKwkJcmV0dXJuIHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMuZ2V0KHZlcnNpb24pOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIFJPT1RfVFJBTlNMQVRPUiA9IGJ1aWxkUm9vdFRyYW5zbGF0b3IoKTsKKwkKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBST09UX1RSQU5TTEFUT1I7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSb290VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVSb290VHJhbnNsYXRvcigKKwkJCQlFY2xpcHNlTGluay5FTlRJVFlfTUFQUElOR1MsCisJCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5ncygpLAorCQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkVmVyc2lvblRyYW5zbGF0b3IodmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucyksCisJCQlidWlsZE5hbWVzcGFjZVRyYW5zbGF0b3IobmFtZXNwYWNlKSwKKwkJCWJ1aWxkU2NoZW1hTmFtZXNwYWNlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRTY2hlbWFMb2NhdGlvblRyYW5zbGF0b3IobmFtZXNwYWNlLCB2ZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zKSwKKwkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCisJCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSksCisJCQlidWlsZFBhY2thZ2VUcmFuc2xhdG9yKCksCisJCQlidWlsZFNjaGVtYVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAorCQkJWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkpLAorCQkJWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9UeXBlQ29udmVydGVycygpKSwKKwkJCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkpLAorCQkJWG1sU3RydWN0Q29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfU3RydWN0Q29udmVydGVycygpKSwKKwkJCVhtbFNlcXVlbmNlR2VuZXJhdG9yLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5TRVFVRU5DRV9HRU5FUkFUT1IsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1NlcXVlbmNlR2VuZXJhdG9ycygpKSwKKwkJCVhtbFRhYmxlR2VuZXJhdG9yLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5UQUJMRV9HRU5FUkFUT1IsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1RhYmxlR2VuZXJhdG9ycygpKSwKKwkJCVhtbE5hbWVkUXVlcnkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk5BTUVEX1FVRVJZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFF1ZXJpZXMoKSksCisJCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5OQU1FRF9OQVRJVkVfUVVFUlksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkTmF0aXZlUXVlcmllcygpKSwKKwkJCVhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUlksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkpLAorCQkJU3FsUmVzdWx0U2V0TWFwcGluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuU1FMX1JFU1VMVF9TRVRfTUFQUElORywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfU3FsUmVzdWx0U2V0TWFwcGluZ3MoKSksCisJCQlYbWxNYXBwZWRTdXBlcmNsYXNzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5NQVBQRURfU1VQRVJDTEFTUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfTWFwcGVkU3VwZXJjbGFzc2VzKCkpLAorCQkJWG1sRW50aXR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5FTlRJVFksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0VudGl0aWVzKCkpLAorCQkJWG1sRW1iZWRkYWJsZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuRU1CRUREQUJMRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfRW1iZWRkYWJsZXMoKSksCisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxJZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxJZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMmFlZDEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbElkLmphdmEKQEAgLTAsMCArMSw5MzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIElkPC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqIAorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxJZCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxJZCBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIFhtbE11dGFibGUsIFhtbENvbnZlcnRpYmxlTWFwcGluZworeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE11dGFibGUoKSA8ZW0+TXV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TXV0YWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIE1VVEFCTEVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXV0YWJsZSgpIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNdXRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQm9vbGVhbiBtdXRhYmxlID0gTVVUQUJMRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcigpIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbnZlcnRlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbENvbnZlcnRlciBjb252ZXJ0ZXI7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlQ29udmVydGVyKCkgPGVtPlR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sVHlwZUNvbnZlcnRlciB0eXBlQ29udmVydGVyOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxPYmplY3RUeXBlQ29udmVydGVyIG9iamVjdFR5cGVDb252ZXJ0ZXI7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKSA8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sU3RydWN0Q29udmVydGVyIHN0cnVjdENvbnZlcnRlcjsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0KCkgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbnZlcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydCgpIDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb252ZXJ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnQgPSBDT05WRVJUX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbElkKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfSUQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXV0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNdXRhYmxlKEJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE11dGFibGVfTXV0YWJsZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvb2xlYW4gZ2V0TXV0YWJsZSgpCisJeworCQlyZXR1cm4gbXV0YWJsZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0TXV0YWJsZSA8ZW0+TXV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TXV0YWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE11dGFibGUoQm9vbGVhbiBuZXdNdXRhYmxlKQorCXsKKwkJQm9vbGVhbiBvbGRNdXRhYmxlID0gbXV0YWJsZTsKKwkJbXV0YWJsZSA9IG5ld011dGFibGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX01VVEFCTEUsIG9sZE11dGFibGUsIG11dGFibGUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENvbnZlcnQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfQ29udmVydCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydCgpCisJeworCQlyZXR1cm4gY29udmVydDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0Q29udmVydCA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Q29udmVydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbnZlcnQoU3RyaW5nIG5ld0NvbnZlcnQpCisJeworCQlTdHJpbmcgb2xkQ29udmVydCA9IGNvbnZlcnQ7CisJCWNvbnZlcnQgPSBuZXdDb252ZXJ0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJULCBvbGRDb252ZXJ0LCBjb252ZXJ0KSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKKwl7CisJCXJldHVybiBhY2Nlc3NNZXRob2RzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKKwkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCisJeworCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQorCXsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKKwkJeworCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1BST1BFUlRJRVMpOworCQl9CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q29udmVydGVyKFhtbENvbnZlcnRlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQ29udmVydGVyIGdldENvbnZlcnRlcigpCisJeworCQlyZXR1cm4gY29udmVydGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgbmV3Q29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sQ29udmVydGVyIG9sZENvbnZlcnRlciA9IGNvbnZlcnRlcjsKKwkJY29udmVydGVyID0gbmV3Q29udmVydGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJURVIsIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0Q29udmVydGVyIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Q29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFhtbENvbnZlcnRlciBuZXdDb252ZXJ0ZXIpCisJeworCQlpZiAobmV3Q29udmVydGVyICE9IGNvbnZlcnRlcikKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoY29udmVydGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q29udmVydGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRDb252ZXJ0ZXIobmV3Q29udmVydGVyLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUiwgbmV3Q29udmVydGVyLCBuZXdDb252ZXJ0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX1R5cGVDb252ZXJ0ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpCisJeworCQlyZXR1cm4gdHlwZUNvbnZlcnRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgbmV3VHlwZUNvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbFR5cGVDb252ZXJ0ZXIgb2xkVHlwZUNvbnZlcnRlciA9IHR5cGVDb252ZXJ0ZXI7CisJCXR5cGVDb252ZXJ0ZXIgPSBuZXdUeXBlQ29udmVydGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19UWVBFX0NPTlZFUlRFUiwgb2xkVHlwZUNvbnZlcnRlciwgbmV3VHlwZUNvbnZlcnRlcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldFR5cGVDb252ZXJ0ZXIgPGVtPlR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyKQorCXsKKwkJaWYgKG5ld1R5cGVDb252ZXJ0ZXIgIT0gdHlwZUNvbnZlcnRlcikKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAodHlwZUNvbnZlcnRlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0eXBlQ29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1R5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VHlwZUNvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFR5cGVDb252ZXJ0ZXIobmV3VHlwZUNvbnZlcnRlciwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19UWVBFX0NPTlZFUlRFUiwgbmV3VHlwZUNvbnZlcnRlciwgbmV3VHlwZUNvbnZlcnRlcikpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKKwl7CisJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBuZXdPYmplY3RUeXBlQ29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBvbGRPYmplY3RUeXBlQ29udmVydGVyID0gb2JqZWN0VHlwZUNvbnZlcnRlcjsKKwkJb2JqZWN0VHlwZUNvbnZlcnRlciA9IG5ld09iamVjdFR5cGVDb252ZXJ0ZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgb2xkT2JqZWN0VHlwZUNvbnZlcnRlciwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIpCisJeworCQlpZiAobmV3T2JqZWN0VHlwZUNvbnZlcnRlciAhPSBvYmplY3RUeXBlQ29udmVydGVyKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChvYmplY3RUeXBlQ29udmVydGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW9iamVjdFR5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBuZXdPYmplY3RUeXBlQ29udmVydGVyLCBuZXdPYmplY3RUeXBlQ29udmVydGVyKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IEN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxTdHJ1Y3RDb252ZXJ0ZXIgZ2V0U3RydWN0Q29udmVydGVyKCkKKwl7CisJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciBuZXdTdHJ1Y3RDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgb2xkU3RydWN0Q29udmVydGVyID0gc3RydWN0Q29udmVydGVyOworCQlzdHJ1Y3RDb252ZXJ0ZXIgPSBuZXdTdHJ1Y3RDb252ZXJ0ZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1NUUlVDVF9DT05WRVJURVIsIG9sZFN0cnVjdENvbnZlcnRlciwgbmV3U3RydWN0Q29udmVydGVyKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0U3RydWN0Q29udmVydGVyIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIG5ld1N0cnVjdENvbnZlcnRlcikKKwl7CisJCWlmIChuZXdTdHJ1Y3RDb252ZXJ0ZXIgIT0gc3RydWN0Q29udmVydGVyKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChzdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc3RydWN0Q29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3U3RydWN0Q29udmVydGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1N0cnVjdENvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1NUUlVDVF9DT05WRVJURVIsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG5ld1N0cnVjdENvbnZlcnRlciwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19TVFJVQ1RfQ09OVkVSVEVSLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIsIG5ld1N0cnVjdENvbnZlcnRlcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRDb252ZXJ0ZXIobnVsbCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSOgorCQkJCXJldHVybiBiYXNpY1NldFR5cGVDb252ZXJ0ZXIobnVsbCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19TVFJVQ1RfQ09OVkVSVEVSOgorCQkJCXJldHVybiBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fTVVUQUJMRToKKwkJCQlyZXR1cm4gZ2V0TXV0YWJsZSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJURVI6CisJCQkJcmV0dXJuIGdldENvbnZlcnRlcigpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19UWVBFX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcigpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6CisJCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gZ2V0U3RydWN0Q29udmVydGVyKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlQ6CisJCQkJcmV0dXJuIGdldENvbnZlcnQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fUFJPUEVSVElFUzoKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fTVVUQUJMRToKKwkJCQlzZXRNdXRhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUjoKKwkJCQlzZXRDb252ZXJ0ZXIoKFhtbENvbnZlcnRlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19UWVBFX0NPTlZFUlRFUjoKKwkJCQlzZXRUeXBlQ29udmVydGVyKChYbWxUeXBlQ29udmVydGVyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKKwkJCQlzZXRPYmplY3RUeXBlQ29udmVydGVyKChYbWxPYmplY3RUeXBlQ29udmVydGVyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1NUUlVDVF9DT05WRVJURVI6CisJCQkJc2V0U3RydWN0Q29udmVydGVyKChYbWxTdHJ1Y3RDb252ZXJ0ZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVDoKKwkJCQlzZXRDb252ZXJ0KChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFM6CisJCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19NVVRBQkxFOgorCQkJCXNldE11dGFibGUoTVVUQUJMRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJURVI6CisJCQkJc2V0Q29udmVydGVyKChYbWxDb252ZXJ0ZXIpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19UWVBFX0NPTlZFUlRFUjoKKwkJCQlzZXRUeXBlQ29udmVydGVyKChYbWxUeXBlQ29udmVydGVyKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgorCQkJCXNldE9iamVjdFR5cGVDb252ZXJ0ZXIoKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19TVFJVQ1RfQ09OVkVSVEVSOgorCQkJCXNldFN0cnVjdENvbnZlcnRlcigoWG1sU3RydWN0Q29udmVydGVyKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVDoKKwkJCQlzZXRDb252ZXJ0KENPTlZFUlRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX01VVEFCTEU6CisJCQkJcmV0dXJuIE1VVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IG11dGFibGUgIT0gbnVsbCA6ICFNVVRBQkxFX0VERUZBVUxULmVxdWFscyhtdXRhYmxlKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVEVSOgorCQkJCXJldHVybiBjb252ZXJ0ZXIgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fVFlQRV9DT05WRVJURVI6CisJCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXIgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgorCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1NUUlVDVF9DT05WRVJURVI6CisJCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlciAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJUOgorCQkJCXJldHVybiBDT05WRVJUX0VERUZBVUxUID09IG51bGwgPyBjb252ZXJ0ICE9IG51bGwgOiAhQ09OVkVSVF9FREVGQVVMVC5lcXVhbHMoY29udmVydCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbE11dGFibGUuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX01VVEFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VVEFCTEVfX01VVEFCTEU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVySG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQ7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1NfTUVUSE9EUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19QUk9QRVJUSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNdXRhYmxlLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VVEFCTEVfX01VVEFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19NVVRBQkxFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckhvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJURVI7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fVFlQRV9DT05WRVJURVI7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1NUUlVDVF9DT05WRVJURVI7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJUOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobXV0YWJsZTogIik7CisJCXJlc3VsdC5hcHBlbmQobXV0YWJsZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgY29udmVydDogIik7CisJCXJlc3VsdC5hcHBlbmQoY29udmVydCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE11dGFibGVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuTVVUQUJMRSk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuQ09OVkVSVCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJZWxlbWVudE5hbWUsIAorCQkJc3RydWN0dXJhbEZlYXR1cmUsIAorCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxJZCgpLCAKKwkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNdXRhYmxlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCksCisJCQlidWlsZEdlbmVyYXRlZFZhbHVlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRUZW1wb3JhbFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ29udmVydFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpLAorCQkJYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAorCQkJYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAorCQkJYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCisJCQlidWlsZFRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAorCQkJYnVpbGRTZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTXV0YWJsZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5NVVRBQkxFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE11dGFibGVfTXV0YWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFN0cnVjdENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOGM4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEluc3RhbnRpYXRpb25Db3B5UG9saWN5LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgSW5zdGFudGlhdGlvbiBQb2xpY3k8L2I+PC9lbT4nLgorICogIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMgorICogQHNpbmNlIDIuMgorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k7CisJfQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHt9OworCX0KKworfSAvLyBYbWxJbnN0YW50aWF0aW9uUG9saWN5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5GZXRjaC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luRmV0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjQ3NDkyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luRmV0Y2guamF2YQpAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEpvaW4gRmV0Y2g8L2I+PC9lbT4nLgorICogIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoI2dldEpvaW5GZXRjaCA8ZW0+Sm9pbiBGZXRjaDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2goKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbEpvaW5GZXRjaCBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCisJICogQHNlZSAjc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaCNnZXRKb2luRmV0Y2ggPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKKwkgKiBAc2VlICNnZXRKb2luRmV0Y2goKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlIHZhbHVlKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgam9pbi1mZXRjaCBlbGVtZW50LgorCSAqLworCVRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5GZXRjaFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkZldGNoVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NTdmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5GZXRjaFR5cGUuamF2YQpAQCAtMCwwICsxLDI0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5YbWwgSm9pbiBGZXRjaCBUeXBlPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2hUeXBlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBYbWxKb2luRmV0Y2hUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworCS8qKgorCSAqIFRoZSAnPGVtPjxiPklOTkVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lOTkVSX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJSU5ORVIoMCwgIklOTkVSIiwgIklOTkVSIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5PVVRFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNPVVRFUl9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU9VVEVSKDEsICJPVVRFUiIsICJPVVRFUiIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+SU5ORVI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOTkVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lOTkVSCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5ORVJfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+T1VURVI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9VVEVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09VVEVSCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VURVJfVkFMVUUgPSAxOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlhtbCBKb2luIEZldGNoIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbEpvaW5GZXRjaFR5cGVbXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgWG1sSm9pbkZldGNoVHlwZVtdCisJCXsKKwkJCUlOTkVSLAorCQkJT1VURVIsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFhtbEpvaW5GZXRjaFR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCisJCXsKKwkJCVhtbEpvaW5GZXRjaFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKKwkJCXsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCisJCXsKKwkJCVhtbEpvaW5GZXRjaFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQorCQkJeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgSm9pbiBGZXRjaCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgWG1sSm9pbkZldGNoVHlwZSBnZXQoaW50IHZhbHVlKQorCXsKKwkJc3dpdGNoICh2YWx1ZSkKKwkJeworCQkJY2FzZSBJTk5FUl9WQUxVRTogcmV0dXJuIElOTkVSOworCQkJY2FzZSBPVVRFUl9WQUxVRTogcmV0dXJuIE9VVEVSOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBYbWxKb2luRmV0Y2hUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQorCXsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQorCXsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCisJeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9YbWxKb2luRmV0Y2hUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFueVRvTWFueS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhY2E2NzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnkuamF2YQpAQCAtMCwwICsxLDY0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFueSBUbyBNYW55PC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqIAorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55KCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbE1hbnlUb01hbnkgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIFhtbEpvaW5GZXRjaCwgWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCit7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7CisKKwkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxKb2luRmV0Y2hUeXBlIEpPSU5fRkVUQ0hfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkZldGNoKCkgPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbEpvaW5GZXRjaFR5cGUgam9pbkZldGNoID0gSk9JTl9GRVRDSF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlDb252ZXJ0KCkgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFwS2V5Q29udmVydCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUNvbnZlcnQoKSA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG1hcEtleUNvbnZlcnQgPSBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpIDxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbE1hbnlUb01hbnkoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9NQU5ZX1RPX01BTlk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQorCSAqIEBzZWUgI3NldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0Sm9pbkZldGNoKCkKKwl7CisJCXJldHVybiBqb2luRmV0Y2g7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0Sm9pbkZldGNoIDxlbT5Kb2luIEZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCisJICogQHNlZSAjZ2V0Sm9pbkZldGNoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgbmV3Sm9pbkZldGNoKQorCXsKKwkJWG1sSm9pbkZldGNoVHlwZSBvbGRKb2luRmV0Y2ggPSBqb2luRmV0Y2g7CisJCWpvaW5GZXRjaCA9IG5ld0pvaW5GZXRjaCA9PSBudWxsID8gSk9JTl9GRVRDSF9FREVGQVVMVCA6IG5ld0pvaW5GZXRjaDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0pPSU5fRkVUQ0gsIG9sZEpvaW5GZXRjaCwgam9pbkZldGNoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNYXBLZXlDb252ZXJ0KFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUNvbnZlcnQoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE1hcEtleUNvbnZlcnQoKQorCXsKKwkJcmV0dXJuIG1hcEtleUNvbnZlcnQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0TWFwS2V5Q29udmVydCA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDb252ZXJ0KFN0cmluZyBuZXdNYXBLZXlDb252ZXJ0KQorCXsKKwkJU3RyaW5nIG9sZE1hcEtleUNvbnZlcnQgPSBtYXBLZXlDb252ZXJ0OworCQltYXBLZXlDb252ZXJ0ID0gbmV3TWFwS2V5Q29udmVydDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVCwgb2xkTWFwS2V5Q29udmVydCwgbWFwS2V5Q29udmVydCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCisJeworCQlpZiAobWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPT0gbnVsbCkKKwkJeworCQkJbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4oWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJfQorCQlyZXR1cm4gbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKKwl7CisJCXJldHVybiBhY2Nlc3NNZXRob2RzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKKwkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCisJeworCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQorCXsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKKwkJeworCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QUk9QRVJUSUVTKTsKKwkJfQorCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSk9JTl9GRVRDSDoKKwkJCQlyZXR1cm4gZ2V0Sm9pbkZldGNoKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQ6CisJCQkJcmV0dXJuIGdldE1hcEtleUNvbnZlcnQoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgorCQkJCXJldHVybiBnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19KT0lOX0ZFVENIOgorCQkJCXNldEpvaW5GZXRjaCgoWG1sSm9pbkZldGNoVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgorCQkJCXNldE1hcEtleUNvbnZlcnQoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6CisJCQkJZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOworCQkJCWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6CisJCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QUk9QRVJUSUVTOgorCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0pPSU5fRkVUQ0g6CisJCQkJc2V0Sm9pbkZldGNoKEpPSU5fRkVUQ0hfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDoKKwkJCQlzZXRNYXBLZXlDb252ZXJ0KE1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6CisJCQkJZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0pPSU5fRkVUQ0g6CisJCQkJcmV0dXJuIGpvaW5GZXRjaCAhPSBKT0lOX0ZFVENIX0VERUZBVUxUOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgorCQkJCXJldHVybiBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQgPT0gbnVsbCA/IG1hcEtleUNvbnZlcnQgIT0gbnVsbCA6ICFNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQuZXF1YWxzKG1hcEtleUNvbnZlcnQpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6CisJCQkJcmV0dXJuIG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzICE9IG51bGwgJiYgIW1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19KT0lOX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9DT05WRVJUOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkZldGNoLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfX0pPSU5fRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSk9JTl9GRVRDSDsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChqb2luRmV0Y2g6ICIpOworCQlyZXN1bHQuYXBwZW5kKGpvaW5GZXRjaCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbWFwS2V5Q29udmVydDogIik7CisJCXJlc3VsdC5hcHBlbmQobWFwS2V5Q29udmVydCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJZWxlbWVudE5hbWUsIAorCQkJc3RydWN0dXJhbEZlYXR1cmUsIAorCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55KCksIAorCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcHBlZEJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRPcmRlckJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRNYXBLZXlUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcEtleUNsYXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNYXBLZXlUZW1wb3JhbFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTWFwS2V5RW51bWVyYXRlZFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTWFwS2V5Q29udmVydFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcEtleUNvbHVtblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTWFwS2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpLAorCQkJYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAorCQkJYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAorCQkJYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCisJCQlidWlsZEpvaW5UYWJsZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ2FzY2FkZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlDb252ZXJ0VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk1BUF9LRVlfQ09OVkVSVCwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUNvbnZlcnQoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQXNzb2NpYXRpb25PdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERSwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxPYmplY3RUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX1N0cnVjdENvbnZlcnRlcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFueVRvT25lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb09uZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YzRlNjYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb09uZS5qYXZhCkBAIC0wLDAgKzEsNDg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFueSBUbyBPbmU8L2I+PC9lbT4nLgorICogIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hbnlUb09uZSgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxNYW55VG9PbmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sSm9pbkZldGNoCit7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7CisKKwkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxKb2luRmV0Y2hUeXBlIEpPSU5fRkVUQ0hfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkZldGNoKCkgPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbEpvaW5GZXRjaFR5cGUgam9pbkZldGNoID0gSk9JTl9GRVRDSF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxNYW55VG9PbmUoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9NQU5ZX1RPX09ORTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCisJICogQHNlZSAjc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKQorCXsKKwkJcmV0dXJuIGpvaW5GZXRjaDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lI2dldEpvaW5GZXRjaCA8ZW0+Sm9pbiBGZXRjaDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQorCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlIG5ld0pvaW5GZXRjaCkKKwl7CisJCVhtbEpvaW5GZXRjaFR5cGUgb2xkSm9pbkZldGNoID0gam9pbkZldGNoOworCQlqb2luRmV0Y2ggPSBuZXdKb2luRmV0Y2ggPT0gbnVsbCA/IEpPSU5fRkVUQ0hfRURFRkFVTFQgOiBuZXdKb2luRmV0Y2g7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0pPSU5fRkVUQ0gsIG9sZEpvaW5GZXRjaCwgam9pbkZldGNoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKKwl7CisJCXJldHVybiBhY2Nlc3NNZXRob2RzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKKwkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQorCXsKKwkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKKwl7CisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCisJCXsKKwkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QUk9QRVJUSUVTKTsKKwkJfQorCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6CisJCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6CisJCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19KT0lOX0ZFVENIOgorCQkJCXJldHVybiBnZXRKb2luRmV0Y2goKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUFJPUEVSVElFUzoKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSk9JTl9GRVRDSDoKKwkJCQlzZXRKb2luRmV0Y2goKFhtbEpvaW5GZXRjaFR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6CisJCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19KT0lOX0ZFVENIOgorCQkJCXNldEpvaW5GZXRjaChKT0lOX0ZFVENIX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19KT0lOX0ZFVENIOgorCQkJCXJldHVybiBqb2luRmV0Y2ggIT0gSk9JTl9GRVRDSF9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkZldGNoLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19KT0lOX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUFJPUEVSVElFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkZldGNoLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfX0pPSU5fRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19KT0lOX0ZFVENIOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoam9pbkZldGNoOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChqb2luRmV0Y2gpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKwkKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKKwkJCWVsZW1lbnROYW1lLCAKKwkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKKwkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFueVRvT25lKCksIAorCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAorCQkJYnVpbGRPcHRpb25hbFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNYXBzSWRUcmFuc2xhdG9yKCksCisJCQlidWlsZElkVHJhbnNsYXRvcigpLAorCQkJYnVpbGRKb2luQ29sdW1uVHJhbnNsYXRvcigpLAorCQkJYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCksCisJCQlidWlsZENhc2NhZGVUcmFuc2xhdG9yKCksCisJCQlidWlsZEpvaW5GZXRjaFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJpdmF0ZU93bmVkVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJpdmF0ZU93bmVkX1ByaXZhdGVPd25lZCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFwcGVkU3VwZXJjbGFzcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxNYXBwZWRTdXBlcmNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1ZjU0YgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFwcGVkU3VwZXJjbGFzcy5qYXZhCkBAIC0wLDAgKzEsMTYyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmsxXzE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiAKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYXBwZWQgU3VwZXJjbGFzczwvYj48L2VtPicuCisgKiAgCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKiAKKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldE9wdGltaXN0aWNMb2NraW5nIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENvcHlQb2xpY3kgPGVtPkNvcHkgUG9saWN5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q2xvbmVDb3B5UG9saWN5IDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgWG1sTWFwcGVkU3VwZXJjbGFzcyBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIGltcGxlbWVudHMgWG1sUmVhZE9ubHksIFhtbEN1c3RvbWl6ZXJIb2xkZXIsIFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLCBYbWxDYWNoZUhvbGRlciwgWG1sQ29udmVydGVyc0hvbGRlciwgWG1sUHJvcGVydHlDb250YWluZXIsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMAoreworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFkT25seSgpIDxlbT5SZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlYWRPbmx5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gUkVBRF9PTkxZX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYWRPbmx5KCkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVhZE9ubHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb29sZWFuIHJlYWRPbmx5ID0gUkVBRF9PTkxZX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VzdG9taXplcigpIDxlbT5DdXN0b21pemVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDdXN0b21pemVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ3VzdG9taXplciBjdXN0b21pemVyOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlVHJhY2tpbmcoKSA8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDaGFuZ2VUcmFja2luZygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbENoYW5nZVRyYWNraW5nIGNoYW5nZVRyYWNraW5nOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FjaGUoKSA8ZW0+Q2FjaGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENhY2hlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ2FjaGUgY2FjaGU7CisKKwkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFeGlzdGVuY2VUeXBlIEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGlzdGVuY2VDaGVja2luZygpIDxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEV4aXN0ZW5jZUNoZWNraW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRXhpc3RlbmNlVHlwZSBleGlzdGVuY2VDaGVja2luZyA9IEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcnMoKSA8ZW0+Q29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb252ZXJ0ZXJzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29udmVydGVyPiBjb252ZXJ0ZXJzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXJzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gdHlwZUNvbnZlcnRlcnM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IHN0cnVjdENvbnZlcnRlcnM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbWFyeUtleSgpIDxlbT5QcmltYXJ5IEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJpbWFyeUtleSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbFByaW1hcnlLZXkgcHJpbWFyeUtleTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWNoZWFibGUoKSA8ZW0+Q2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDYWNoZWFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBDQUNIRUFCTEVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FjaGVhYmxlKCkgPGVtPkNhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2FjaGVhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQm9vbGVhbiBjYWNoZWFibGUgPSBDQUNIRUFCTEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpbWlzdGljTG9ja2luZygpIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE9wdGltaXN0aWNMb2NraW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sT3B0aW1pc3RpY0xvY2tpbmcgb3B0aW1pc3RpY0xvY2tpbmc7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5UG9saWN5KCkgPGVtPkNvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb3B5UG9saWN5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ29weVBvbGljeSBjb3B5UG9saWN5OworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpbnN0YW50aWF0aW9uQ29weVBvbGljeTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsb25lQ29weVBvbGljeSgpIDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ2xvbmVDb3B5UG9saWN5IGNsb25lQ29weVBvbGljeTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJvb2xlYW4gZXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxNYXBwZWRTdXBlcmNsYXNzKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTUFQUEVEX1NVUEVSQ0xBU1M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRSZWFkT25seShCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZWFkT25seV9SZWFkT25seSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvb2xlYW4gZ2V0UmVhZE9ubHkoKQorCXsKKwkJcmV0dXJuIHJlYWRPbmx5OworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFJlYWRPbmx5IDxlbT5SZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0UmVhZE9ubHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShCb29sZWFuIG5ld1JlYWRPbmx5KQorCXsKKwkJQm9vbGVhbiBvbGRSZWFkT25seSA9IHJlYWRPbmx5OworCQlyZWFkT25seSA9IG5ld1JlYWRPbmx5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRUFEX09OTFksIG9sZFJlYWRPbmx5LCByZWFkT25seSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q3VzdG9taXplcihYbWxDdXN0b21pemVyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDdXN0b21pemVySG9sZGVyX0N1c3RvbWl6ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbEN1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpCisJeworCQlyZXR1cm4gY3VzdG9taXplcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDdXN0b21pemVyKFhtbEN1c3RvbWl6ZXIgbmV3Q3VzdG9taXplciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbEN1c3RvbWl6ZXIgb2xkQ3VzdG9taXplciA9IGN1c3RvbWl6ZXI7CisJCWN1c3RvbWl6ZXIgPSBuZXdDdXN0b21pemVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSLCBvbGRDdXN0b21pemVyLCBuZXdDdXN0b21pemVyKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDdXN0b21pemVyIDxlbT5DdXN0b21pemVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRDdXN0b21pemVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3VzdG9taXplcihYbWxDdXN0b21pemVyIG5ld0N1c3RvbWl6ZXIpCisJeworCQlpZiAobmV3Q3VzdG9taXplciAhPSBjdXN0b21pemVyKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChjdXN0b21pemVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWN1c3RvbWl6ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdDdXN0b21pemVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0N1c3RvbWl6ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEN1c3RvbWl6ZXIobmV3Q3VzdG9taXplciwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSLCBuZXdDdXN0b21pemVyLCBuZXdDdXN0b21pemVyKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIFRyYWNraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRDaGFuZ2VUcmFja2luZyhYbWxDaGFuZ2VUcmFja2luZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJfQ2hhbmdlVHJhY2tpbmcoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbENoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCkKKwl7CisJCXJldHVybiBjaGFuZ2VUcmFja2luZzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDaGFuZ2VUcmFja2luZyhYbWxDaGFuZ2VUcmFja2luZyBuZXdDaGFuZ2VUcmFja2luZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbENoYW5nZVRyYWNraW5nIG9sZENoYW5nZVRyYWNraW5nID0gY2hhbmdlVHJhY2tpbmc7CisJCWNoYW5nZVRyYWNraW5nID0gbmV3Q2hhbmdlVHJhY2tpbmc7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORywgb2xkQ2hhbmdlVHJhY2tpbmcsIG5ld0NoYW5nZVRyYWNraW5nKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDaGFuZ2VUcmFja2luZyA8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENoYW5nZVRyYWNraW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q2hhbmdlVHJhY2tpbmcoWG1sQ2hhbmdlVHJhY2tpbmcgbmV3Q2hhbmdlVHJhY2tpbmcpCisJeworCQlpZiAobmV3Q2hhbmdlVHJhY2tpbmcgIT0gY2hhbmdlVHJhY2tpbmcpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGNoYW5nZVRyYWNraW5nICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNoYW5nZVRyYWNraW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdDaGFuZ2VUcmFja2luZyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDaGFuZ2VUcmFja2luZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORywgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRDaGFuZ2VUcmFja2luZyhuZXdDaGFuZ2VUcmFja2luZywgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkcsIG5ld0NoYW5nZVRyYWNraW5nLCBuZXdDaGFuZ2VUcmFja2luZykpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q2FjaGUoWG1sQ2FjaGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyX0NhY2hlKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDYWNoZSBnZXRDYWNoZSgpCisJeworCQlyZXR1cm4gY2FjaGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2FjaGUoWG1sQ2FjaGUgbmV3Q2FjaGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxDYWNoZSBvbGRDYWNoZSA9IGNhY2hlOworCQljYWNoZSA9IG5ld0NhY2hlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRSwgb2xkQ2FjaGUsIG5ld0NhY2hlKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDYWNoZSA8ZW0+Q2FjaGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRDYWNoZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENhY2hlKFhtbENhY2hlIG5ld0NhY2hlKQorCXsKKwkJaWYgKG5ld0NhY2hlICE9IGNhY2hlKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChjYWNoZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljYWNoZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdDYWNoZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYWNoZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldENhY2hlKG5ld0NhY2hlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFLCBuZXdDYWNoZSwgbmV3Q2FjaGUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgQ2hlY2tpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZQorCSAqIEBzZWUgI3NldEV4aXN0ZW5jZUNoZWNraW5nKEV4aXN0ZW5jZVR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyX0V4aXN0ZW5jZUNoZWNraW5nKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRXhpc3RlbmNlVHlwZSBnZXRFeGlzdGVuY2VDaGVja2luZygpCisJeworCQlyZXR1cm4gZXhpc3RlbmNlQ2hlY2tpbmc7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcgPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCisJICogQHNlZSAjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFeGlzdGVuY2VDaGVja2luZyhFeGlzdGVuY2VUeXBlIG5ld0V4aXN0ZW5jZUNoZWNraW5nKQorCXsKKwkJRXhpc3RlbmNlVHlwZSBvbGRFeGlzdGVuY2VDaGVja2luZyA9IGV4aXN0ZW5jZUNoZWNraW5nOworCQlleGlzdGVuY2VDaGVja2luZyA9IG5ld0V4aXN0ZW5jZUNoZWNraW5nID09IG51bGwgPyBFWElTVEVOQ0VfQ0hFQ0tJTkdfRURFRkFVTFQgOiBuZXdFeGlzdGVuY2VDaGVja2luZzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhJU1RFTkNFX0NIRUNLSU5HLCBvbGRFeGlzdGVuY2VDaGVja2luZywgZXhpc3RlbmNlQ2hlY2tpbmcpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKQorCXsKKwkJaWYgKGNvbnZlcnRlcnMgPT0gbnVsbCkKKwkJeworCQkJY29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb252ZXJ0ZXI+KFhtbENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUyk7CisJCX0KKwkJcmV0dXJuIGNvbnZlcnRlcnM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1R5cGVDb252ZXJ0ZXJzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiBnZXRUeXBlQ29udmVydGVycygpCisJeworCQlpZiAodHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKKwkJeworCQkJdHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4oWG1sVHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTKTsKKwkJfQorCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpCisJeworCQlpZiAob2JqZWN0VHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKKwkJeworCQkJb2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4oWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyk7CisJCX0KKwkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1N0cnVjdENvbnZlcnRlcnMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpCisJeworCQlpZiAoc3RydWN0Q29udmVydGVycyA9PSBudWxsKQorCQl7CisJCQlzdHJ1Y3RDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4oWG1sU3RydWN0Q29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUyk7CisJCX0KKwkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW1pc3RpYyBMb2NraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRPcHRpbWlzdGljTG9ja2luZyhYbWxPcHRpbWlzdGljTG9ja2luZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19PcHRpbWlzdGljTG9ja2luZygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sT3B0aW1pc3RpY0xvY2tpbmcgZ2V0T3B0aW1pc3RpY0xvY2tpbmcoKQorCXsKKwkJcmV0dXJuIG9wdGltaXN0aWNMb2NraW5nOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE9wdGltaXN0aWNMb2NraW5nKFhtbE9wdGltaXN0aWNMb2NraW5nIG5ld09wdGltaXN0aWNMb2NraW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sT3B0aW1pc3RpY0xvY2tpbmcgb2xkT3B0aW1pc3RpY0xvY2tpbmcgPSBvcHRpbWlzdGljTG9ja2luZzsKKwkJb3B0aW1pc3RpY0xvY2tpbmcgPSBuZXdPcHRpbWlzdGljTG9ja2luZzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT1BUSU1JU1RJQ19MT0NLSU5HLCBvbGRPcHRpbWlzdGljTG9ja2luZywgbmV3T3B0aW1pc3RpY0xvY2tpbmcpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldE9wdGltaXN0aWNMb2NraW5nIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0T3B0aW1pc3RpY0xvY2tpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPcHRpbWlzdGljTG9ja2luZyhYbWxPcHRpbWlzdGljTG9ja2luZyBuZXdPcHRpbWlzdGljTG9ja2luZykKKwl7CisJCWlmIChuZXdPcHRpbWlzdGljTG9ja2luZyAhPSBvcHRpbWlzdGljTG9ja2luZykKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAob3B0aW1pc3RpY0xvY2tpbmcgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpb3B0aW1pc3RpY0xvY2tpbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkcsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld09wdGltaXN0aWNMb2NraW5nICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld09wdGltaXN0aWNMb2NraW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT1BUSU1JU1RJQ19MT0NLSU5HLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldE9wdGltaXN0aWNMb2NraW5nKG5ld09wdGltaXN0aWNMb2NraW5nLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORywgbmV3T3B0aW1pc3RpY0xvY2tpbmcsIG5ld09wdGltaXN0aWNMb2NraW5nKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRDb3B5UG9saWN5KFhtbENvcHlQb2xpY3kpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfQ29weVBvbGljeSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQ29weVBvbGljeSBnZXRDb3B5UG9saWN5KCkKKwl7CisJCXJldHVybiBjb3B5UG9saWN5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvcHlQb2xpY3koWG1sQ29weVBvbGljeSBuZXdDb3B5UG9saWN5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sQ29weVBvbGljeSBvbGRDb3B5UG9saWN5ID0gY29weVBvbGljeTsKKwkJY29weVBvbGljeSA9IG5ld0NvcHlQb2xpY3k7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZLCBvbGRDb3B5UG9saWN5LCBuZXdDb3B5UG9saWN5KTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDb3B5UG9saWN5IDxlbT5Db3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENvcHlQb2xpY3koKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb3B5UG9saWN5KFhtbENvcHlQb2xpY3kgbmV3Q29weVBvbGljeSkKKwl7CisJCWlmIChuZXdDb3B5UG9saWN5ICE9IGNvcHlQb2xpY3kpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGNvcHlQb2xpY3kgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdDb3B5UG9saWN5ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvcHlQb2xpY3kpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRDb3B5UG9saWN5KG5ld0NvcHlQb2xpY3ksIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1ksIG5ld0NvcHlQb2xpY3ksIG5ld0NvcHlQb2xpY3kpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCisJeworCQlyZXR1cm4gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3ksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBvbGRJbnN0YW50aWF0aW9uQ29weVBvbGljeSA9IGluc3RhbnRpYXRpb25Db3B5UG9saWN5OworCQlpbnN0YW50aWF0aW9uQ29weVBvbGljeSA9IG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBvbGRJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KQorCXsKKwkJaWYgKG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IGluc3RhbnRpYXRpb25Db3B5UG9saWN5KQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChpbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbnN0YW50aWF0aW9uQ29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbG9uZSBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldENsb25lQ29weVBvbGljeShYbWxDbG9uZUNvcHlQb2xpY3kpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfQ2xvbmVDb3B5UG9saWN5KCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDbG9uZUNvcHlQb2xpY3kgZ2V0Q2xvbmVDb3B5UG9saWN5KCkKKwl7CisJCXJldHVybiBjbG9uZUNvcHlQb2xpY3k7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSBuZXdDbG9uZUNvcHlQb2xpY3ksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxDbG9uZUNvcHlQb2xpY3kgb2xkQ2xvbmVDb3B5UG9saWN5ID0gY2xvbmVDb3B5UG9saWN5OworCQljbG9uZUNvcHlQb2xpY3kgPSBuZXdDbG9uZUNvcHlQb2xpY3k7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZLCBvbGRDbG9uZUNvcHlQb2xpY3ksIG5ld0Nsb25lQ29weVBvbGljeSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q2xvbmVDb3B5UG9saWN5IDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENsb25lQ29weVBvbGljeSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENsb25lQ29weVBvbGljeShYbWxDbG9uZUNvcHlQb2xpY3kgbmV3Q2xvbmVDb3B5UG9saWN5KQorCXsKKwkJaWYgKG5ld0Nsb25lQ29weVBvbGljeSAhPSBjbG9uZUNvcHlQb2xpY3kpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGNsb25lQ29weVBvbGljeSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljbG9uZUNvcHlQb2xpY3kpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q2xvbmVDb3B5UG9saWN5ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Nsb25lQ29weVBvbGljeSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldENsb25lQ29weVBvbGljeShuZXdDbG9uZUNvcHlQb2xpY3ksIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xPTkVfQ09QWV9QT0xJQ1ksIG5ld0Nsb25lQ29weVBvbGljeSwgbmV3Q2xvbmVDb3B5UG9saWN5KSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQorCXsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKKwkJeworCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVMpOworCQl9CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UHJpbWFyeUtleShYbWxQcmltYXJ5S2V5KQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMV9QcmltYXJ5S2V5KCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxQcmltYXJ5S2V5IGdldFByaW1hcnlLZXkoKQorCXsKKwkJcmV0dXJuIHByaW1hcnlLZXk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJpbWFyeUtleShYbWxQcmltYXJ5S2V5IG5ld1ByaW1hcnlLZXksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxQcmltYXJ5S2V5IG9sZFByaW1hcnlLZXkgPSBwcmltYXJ5S2V5OworCQlwcmltYXJ5S2V5ID0gbmV3UHJpbWFyeUtleTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVksIG9sZFByaW1hcnlLZXksIG5ld1ByaW1hcnlLZXkpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UHJpbWFyeUtleSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSBuZXdQcmltYXJ5S2V5KQorCXsKKwkJaWYgKG5ld1ByaW1hcnlLZXkgIT0gcHJpbWFyeUtleSkKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAocHJpbWFyeUtleSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwcmltYXJ5S2V5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVksIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1ByaW1hcnlLZXkgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJpbWFyeUtleSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSSU1BUllfS0VZLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFByaW1hcnlLZXkobmV3UHJpbWFyeUtleSwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWSwgbmV3UHJpbWFyeUtleSwgbmV3UHJpbWFyeUtleSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Q2FjaGVhYmxlKEJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlYWJsZTJfMF9DYWNoZWFibGUoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb29sZWFuIGdldENhY2hlYWJsZSgpCisJeworCQlyZXR1cm4gY2FjaGVhYmxlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENhY2hlYWJsZSA8ZW0+Q2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENhY2hlYWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENhY2hlYWJsZShCb29sZWFuIG5ld0NhY2hlYWJsZSkKKwl7CisJCUJvb2xlYW4gb2xkQ2FjaGVhYmxlID0gY2FjaGVhYmxlOworCQljYWNoZWFibGUgPSBuZXdDYWNoZWFibGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFQUJMRSwgb2xkQ2FjaGVhYmxlLCBjYWNoZWFibGUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoQm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKKwl7CisJCXJldHVybiBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhCb29sZWFuIG5ld0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpCisJeworCQlCb29sZWFuIG9sZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOworCQlleGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gbmV3RXhjbHVkZURlZmF1bHRNYXBwaW5nczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTLCBvbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzLCBleGNsdWRlRGVmYXVsdE1hcHBpbmdzKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVI6CisJCQkJcmV0dXJuIGJhc2ljU2V0Q3VzdG9taXplcihudWxsLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HOgorCQkJCXJldHVybiBiYXNpY1NldENoYW5nZVRyYWNraW5nKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRToKKwkJCQlyZXR1cm4gYmFzaWNTZXRDYWNoZShudWxsLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UWVBFX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRPYmplY3RUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NUUlVDVF9DT05WRVJURVJTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RydWN0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVk6CisJCQkJcmV0dXJuIGJhc2ljU2V0UHJpbWFyeUtleShudWxsLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT1BUSU1JU1RJQ19MT0NLSU5HOgorCQkJCXJldHVybiBiYXNpY1NldE9wdGltaXN0aWNMb2NraW5nKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT1BZX1BPTElDWToKKwkJCQlyZXR1cm4gYmFzaWNTZXRDb3B5UG9saWN5KG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgorCQkJCXJldHVybiBiYXNpY1NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWToKKwkJCQlyZXR1cm4gYmFzaWNTZXRDbG9uZUNvcHlQb2xpY3kobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRUFEX09OTFk6CisJCQkJcmV0dXJuIGdldFJlYWRPbmx5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVI6CisJCQkJcmV0dXJuIGdldEN1c3RvbWl6ZXIoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HOgorCQkJCXJldHVybiBnZXRDaGFuZ2VUcmFja2luZygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRToKKwkJCQlyZXR1cm4gZ2V0Q2FjaGUoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhJU1RFTkNFX0NIRUNLSU5HOgorCQkJCXJldHVybiBnZXRFeGlzdGVuY2VDaGVja2luZygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT05WRVJURVJTOgorCQkJCXJldHVybiBnZXRDb252ZXJ0ZXJzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RZUEVfQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcnMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1RSVUNUX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuIGdldFN0cnVjdENvbnZlcnRlcnMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWToKKwkJCQlyZXR1cm4gZ2V0UHJpbWFyeUtleSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRUFCTEU6CisJCQkJcmV0dXJuIGdldENhY2hlYWJsZSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkc6CisJCQkJcmV0dXJuIGdldE9wdGltaXN0aWNMb2NraW5nKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZOgorCQkJCXJldHVybiBnZXRDb3B5UG9saWN5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6CisJCQkJcmV0dXJuIGdldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZOgorCQkJCXJldHVybiBnZXRDbG9uZUNvcHlQb2xpY3koKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgorCQkJCXJldHVybiBnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRUFEX09OTFk6CisJCQkJc2V0UmVhZE9ubHkoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ1VTVE9NSVpFUjoKKwkJCQlzZXRDdXN0b21pemVyKChYbWxDdXN0b21pemVyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORzoKKwkJCQlzZXRDaGFuZ2VUcmFja2luZygoWG1sQ2hhbmdlVHJhY2tpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEU6CisJCQkJc2V0Q2FjaGUoKFhtbENhY2hlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYSVNURU5DRV9DSEVDS0lORzoKKwkJCQlzZXRFeGlzdGVuY2VDaGVja2luZygoRXhpc3RlbmNlVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT05WRVJURVJTOgorCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCWdldENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbENvbnZlcnRlcj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTOgorCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKKwkJCQlnZXRUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKKwkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmNsZWFyKCk7CisJCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NUUlVDVF9DT05WRVJURVJTOgorCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFN0cnVjdENvbnZlcnRlcj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJPUEVSVElFUzoKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVk6CisJCQkJc2V0UHJpbWFyeUtleSgoWG1sUHJpbWFyeUtleSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRUFCTEU6CisJCQkJc2V0Q2FjaGVhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORzoKKwkJCQlzZXRPcHRpbWlzdGljTG9ja2luZygoWG1sT3B0aW1pc3RpY0xvY2tpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1k6CisJCQkJc2V0Q29weVBvbGljeSgoWG1sQ29weVBvbGljeSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgorCQkJCXNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KChYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWToKKwkJCQlzZXRDbG9uZUNvcHlQb2xpY3koKFhtbENsb25lQ29weVBvbGljeSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6CisJCQkJc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRUFEX09OTFk6CisJCQkJc2V0UmVhZE9ubHkoUkVBRF9PTkxZX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVI6CisJCQkJc2V0Q3VzdG9taXplcigoWG1sQ3VzdG9taXplciludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORzoKKwkJCQlzZXRDaGFuZ2VUcmFja2luZygoWG1sQ2hhbmdlVHJhY2tpbmcpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRToKKwkJCQlzZXRDYWNoZSgoWG1sQ2FjaGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWElTVEVOQ0VfQ0hFQ0tJTkc6CisJCQkJc2V0RXhpc3RlbmNlQ2hlY2tpbmcoRVhJU1RFTkNFX0NIRUNLSU5HX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPTlZFUlRFUlM6CisJCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UWVBFX0NPTlZFUlRFUlM6CisJCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKKwkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUzoKKwkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWToKKwkJCQlzZXRQcmltYXJ5S2V5KChYbWxQcmltYXJ5S2V5KW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVBQkxFOgorCQkJCXNldENhY2hlYWJsZShDQUNIRUFCTEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT1BUSU1JU1RJQ19MT0NLSU5HOgorCQkJCXNldE9wdGltaXN0aWNMb2NraW5nKChYbWxPcHRpbWlzdGljTG9ja2luZyludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZOgorCQkJCXNldENvcHlQb2xpY3koKFhtbENvcHlQb2xpY3kpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgorCQkJCXNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KChYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZOgorCQkJCXNldENsb25lQ29weVBvbGljeSgoWG1sQ2xvbmVDb3B5UG9saWN5KW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgorCQkJCXNldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRUFEX09OTFk6CisJCQkJcmV0dXJuIFJFQURfT05MWV9FREVGQVVMVCA9PSBudWxsID8gcmVhZE9ubHkgIT0gbnVsbCA6ICFSRUFEX09OTFlfRURFRkFVTFQuZXF1YWxzKHJlYWRPbmx5KTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ1VTVE9NSVpFUjoKKwkJCQlyZXR1cm4gY3VzdG9taXplciAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkc6CisJCQkJcmV0dXJuIGNoYW5nZVRyYWNraW5nICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFOgorCQkJCXJldHVybiBjYWNoZSAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWElTVEVOQ0VfQ0hFQ0tJTkc6CisJCQkJcmV0dXJuIGV4aXN0ZW5jZUNoZWNraW5nICE9IEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUzoKKwkJCQlyZXR1cm4gY29udmVydGVycyAhPSBudWxsICYmICFjb252ZXJ0ZXJzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTOgorCQkJCXJldHVybiB0eXBlQ29udmVydGVycyAhPSBudWxsICYmICF0eXBlQ29udmVydGVycy5pc0VtcHR5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIW9iamVjdFR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1RSVUNUX0NPTlZFUlRFUlM6CisJCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnMgIT0gbnVsbCAmJiAhc3RydWN0Q29udmVydGVycy5pc0VtcHR5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSSU1BUllfS0VZOgorCQkJCXJldHVybiBwcmltYXJ5S2V5ICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFQUJMRToKKwkJCQlyZXR1cm4gQ0FDSEVBQkxFX0VERUZBVUxUID09IG51bGwgPyBjYWNoZWFibGUgIT0gbnVsbCA6ICFDQUNIRUFCTEVfRURFRkFVTFQuZXF1YWxzKGNhY2hlYWJsZSk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORzoKKwkJCQlyZXR1cm4gb3B0aW1pc3RpY0xvY2tpbmcgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1k6CisJCQkJcmV0dXJuIGNvcHlQb2xpY3kgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKKwkJCQlyZXR1cm4gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xPTkVfQ09QWV9QT0xJQ1k6CisJCQkJcmV0dXJuIGNsb25lQ29weVBvbGljeSAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6CisJCQkJcmV0dXJuIEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCA9PSBudWxsID8gZXhjbHVkZURlZmF1bHRNYXBwaW5ncyAhPSBudWxsIDogIUVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVC5lcXVhbHMoZXhjbHVkZURlZmF1bHRNYXBwaW5ncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlYWRPbmx5LmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRUFEX09OTFk6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFQURfT05MWV9fUkVBRF9PTkxZOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEN1c3RvbWl6ZXJIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NVU1RPTUlaRVJfSE9MREVSX19DVVNUT01JWkVSOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVJfX0NIQU5HRV9UUkFDS0lORzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDYWNoZUhvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX0hPTERFUl9fQ0FDSEU7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWElTVEVOQ0VfQ0hFQ0tJTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX0hPTERFUl9fRVhJU1RFTkNFX0NIRUNLSU5HOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlcnNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSSU1BUllfS0VZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTFfX1BSSU1BUllfS0VZOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENhY2hlYWJsZTJfMC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVBQkxFOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX0NBQ0hFQUJMRTJfMF9fQ0FDSEVBQkxFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxSZWFkT25seS5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SRUFEX09OTFlfX1JFQURfT05MWTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JFQURfT05MWTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDdXN0b21pemVySG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NVU1RPTUlaRVJfSE9MREVSX19DVVNUT01JWkVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ1VTVE9NSVpFUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSX19DSEFOR0VfVFJBQ0tJTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkc7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2FjaGVIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfSE9MREVSX19DQUNIRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0VYSVNURU5DRV9DSEVDS0lORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYSVNURU5DRV9DSEVDS0lORzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUzsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RZUEVfQ09OVkVSVEVSUzsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUk9QRVJUSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU18xMV9fUFJJTUFSWV9LRVk6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDYWNoZWFibGUyXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9DQUNIRUFCTEUyXzBfX0NBQ0hFQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFQUJMRTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAocmVhZE9ubHk6ICIpOworCQlyZXN1bHQuYXBwZW5kKHJlYWRPbmx5KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBleGlzdGVuY2VDaGVja2luZzogIik7CisJCXJlc3VsdC5hcHBlbmQoZXhpc3RlbmNlQ2hlY2tpbmcpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNhY2hlYWJsZTogIik7CisJCXJlc3VsdC5hcHBlbmQoY2FjaGVhYmxlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChleGNsdWRlRGVmYXVsdE1hcHBpbmdzKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIFRleHRSYW5nZSBnZXRSZWFkT25seVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluay5SRUFEX09OTFkpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldENhY2hlYWJsZVRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEyXzAuQ0FDSEVBQkxFKTsKKwl9CisJCisJCisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisJCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCisJCQllbGVtZW50TmFtZSwgCisJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCisJCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3MoKSwgCisJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZENsYXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCisJCQlidWlsZENhY2hlYWJsZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTWV0YWRhdGFDb21wbGV0ZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUmVhZE9ubHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEV4aXN0ZW5jZUNoZWNraW5nVHJhbnNsYXRvcigpLAorCQkJYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpLAorCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ3VzdG9taXplclRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ2hhbmdlVHJhY2tpbmdUcmFuc2xhdG9yKCksCisJCQlidWlsZElkQ2xhc3NUcmFuc2xhdG9yKCksCisJCQlidWlsZFByaW1hcnlLZXlUcmFuc2xhdG9yKCksCisJCQlidWlsZE9wdGltaXN0aWNMb2NraW5nVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDYWNoZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpLAorCQkJYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAorCQkJYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAorCQkJYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCisJCQlidWlsZENvcHlQb2xpY3lUcmFuc2xhdG9yKCksCisJCQlidWlsZEluc3RhbnRpYXRpb25Db3lwUG9saWN5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRDbG9uZUNvcHlQb2xpY3lUcmFuc2xhdG9yKCksCisJCQlidWlsZEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVyc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRW50aXR5TGlzdGVuZXJzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQcmVQZXJzaXN0VHJhbnNsYXRvcigpLAorCQkJYnVpbGRQb3N0UGVyc2lzdFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUHJlUmVtb3ZlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQb3N0UmVtb3ZlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQcmVVcGRhdGVUcmFuc2xhdG9yKCksCisJCQlidWlsZFBvc3RVcGRhdGVUcmFuc2xhdG9yKCksCisJCQlidWlsZFBvc3RMb2FkVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKKwkJCUF0dHJpYnV0ZXMuYnVpbGRUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FjaGVhYmxlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQTJfMC5DQUNIRUFCTEUsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZWFibGUyXzBfQ2FjaGVhYmxlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmVhZE9ubHlUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUkVBRF9PTkxZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFJlYWRPbmx5X1JlYWRPbmx5KCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEV4aXN0ZW5jZUNoZWNraW5nVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZUhvbGRlcl9FeGlzdGVuY2VDaGVja2luZygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYQ0xVREVfREVGQVVMVF9NQVBQSU5HUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ3VzdG9taXplclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDdXN0b21pemVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DVVNUT01JWkVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEN1c3RvbWl6ZXJIb2xkZXJfQ3VzdG9taXplcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2hhbmdlVHJhY2tpbmdUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQ2hhbmdlVHJhY2tpbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcl9DaGFuZ2VUcmFja2luZygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJpbWFyeUtleVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxQcmltYXJ5S2V5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazFfMS5QUklNQVJZX0tFWSwgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzFfUHJpbWFyeUtleSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT3B0aW1pc3RpY0xvY2tpbmdUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sT3B0aW1pc3RpY0xvY2tpbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9QVElNSVNUSUNfTE9DS0lORywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX09wdGltaXN0aWNMb2NraW5nKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYWNoZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDYWNoZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVIb2xkZXJfQ2FjaGUoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX0NvbnZlcnRlcnMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9UeXBlQ29udmVydGVycygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxPYmplY3RUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9PYmplY3RUeXBlQ29udmVydGVycygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFN0cnVjdENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1N0cnVjdENvbnZlcnRlcnMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvcHlQb2xpY3lUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQ29weVBvbGljeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19Db3B5UG9saWN5KCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJbnN0YW50aWF0aW9uQ295cFBvbGljeVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDbG9uZUNvcHlQb2xpY3lUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQ2xvbmVDb3B5UG9saWN5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DTE9ORV9DT1BZX1BPTElDWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0Nsb25lQ29weVBvbGljeSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxNdXRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE11dGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmI1OWVlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxNdXRhYmxlLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiAKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNdXRhYmxlPC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqIAorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGUjZ2V0TXV0YWJsZSA8ZW0+TXV0YWJsZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNdXRhYmxlKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxNdXRhYmxlIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk11dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk11dGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TXV0YWJsZShCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNdXRhYmxlX011dGFibGUoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCUJvb2xlYW4gZ2V0TXV0YWJsZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGUjZ2V0TXV0YWJsZSA8ZW0+TXV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TXV0YWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TXV0YWJsZShCb29sZWFuIHZhbHVlKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbXV0YWJsZSBhdHRpYnV0ZS4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0TXV0YWJsZVRleHRSYW5nZSgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGFiN2IyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZENvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiAKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBOYW1lZCBDb252ZXJ0ZXI8L2I+PC9lbT4nLgorICogIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb252ZXJ0ZXIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZENvbnZlcnRlcigpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxOYW1lZENvbnZlcnRlciBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sTmFtZWRDb252ZXJ0ZXIoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9OQU1FRF9DT05WRVJURVI7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRDb252ZXJ0ZXJfTmFtZSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKKwkJbmFtZSA9IG5ld05hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FOgorCQkJCXJldHVybiBnZXROYW1lKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRToKKwkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9DT05WRVJURVJfX05BTUU6CisJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRToKKwkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChuYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVEVSX19OQU1FLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkQ29udmVydGVyX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisKK30gLy8gWG1sTmFtZWRDb252ZXJ0ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5ZTkwOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5qYXZhCkBAIC0wLDAgKzEsNjQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuQm9vbGVhblRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyeTwvYj48L2VtPicuCisgKiAgCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4yCisgKgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UmVzdWx0Q2xhc3MgPGVtPlJlc3VsdCBDbGFzczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UmVzdWx0U2V0TWFwcGluZyA8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRQcm9jZWR1cmVOYW1lIDxlbT5Qcm9jZWR1cmUgTmFtZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UmV0dXJuc1Jlc3VsdFNldCA8ZW0+UmV0dXJucyBSZXN1bHQgU2V0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRIaW50cyA8ZW0+SGludHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFBhcmFtZXRlcnMgPGVtPlBhcmFtZXRlcnM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VsdENsYXNzKCkgPGVtPlJlc3VsdCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVzdWx0Q2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9DTEFTU19FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bHRDbGFzcygpIDxlbT5SZXN1bHQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlc3VsdENsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdENsYXNzID0gUkVTVUxUX0NMQVNTX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VsdFNldE1hcHBpbmcoKSA8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZXN1bHRTZXRNYXBwaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzdWx0U2V0TWFwcGluZygpIDxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlc3VsdFNldE1hcHBpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZyA9IFJFU1VMVF9TRVRfTUFQUElOR19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9jZWR1cmVOYW1lKCkgPGVtPlByb2NlZHVyZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcm9jZWR1cmVOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRURVUkVfTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9jZWR1cmVOYW1lKCkgPGVtPlByb2NlZHVyZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcm9jZWR1cmVOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHByb2NlZHVyZU5hbWUgPSBQUk9DRURVUkVfTkFNRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXR1cm5zUmVzdWx0U2V0KCkgPGVtPlJldHVybnMgUmVzdWx0IFNldDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmV0dXJuc1Jlc3VsdFNldCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFJFVFVSTlNfUkVTVUxUX1NFVF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXR1cm5zUmVzdWx0U2V0KCkgPGVtPlJldHVybnMgUmVzdWx0IFNldDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmV0dXJuc1Jlc3VsdFNldCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJvb2xlYW4gcmV0dXJuc1Jlc3VsdFNldCA9IFJFVFVSTlNfUkVTVUxUX1NFVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhpbnRzKCkgPGVtPkhpbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEhpbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sUXVlcnlIaW50PiBoaW50czsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtZXRlcnMoKSA8ZW0+UGFyYW1ldGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQYXJhbWV0ZXJzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyPiBwYXJhbWV0ZXJzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfTmFtZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCisJeworCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7CisJCW5hbWUgPSBuZXdOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN1bHQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc3VsdCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bHQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFJlc3VsdENsYXNzKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXN1bHRDbGFzcygpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdENsYXNzKCkKKwl7CisJCXJldHVybiByZXN1bHRDbGFzczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXN1bHRDbGFzcyA8ZW0+UmVzdWx0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bHQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFJlc3VsdENsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVzdWx0Q2xhc3MoU3RyaW5nIG5ld1Jlc3VsdENsYXNzKQorCXsKKwkJU3RyaW5nIG9sZFJlc3VsdENsYXNzID0gcmVzdWx0Q2xhc3M7CisJCXJlc3VsdENsYXNzID0gbmV3UmVzdWx0Q2xhc3M7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTLCBvbGRSZXN1bHRDbGFzcywgcmVzdWx0Q2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN1bHQgU2V0IE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFJlc3VsdFNldE1hcHBpbmcoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Jlc3VsdFNldE1hcHBpbmcoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRSZXN1bHRTZXRNYXBwaW5nKCkKKwl7CisJCXJldHVybiByZXN1bHRTZXRNYXBwaW5nOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJlc3VsdFNldE1hcHBpbmcgPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSZXN1bHRTZXRNYXBwaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcgbmV3UmVzdWx0U2V0TWFwcGluZykKKwl7CisJCVN0cmluZyBvbGRSZXN1bHRTZXRNYXBwaW5nID0gcmVzdWx0U2V0TWFwcGluZzsKKwkJcmVzdWx0U2V0TWFwcGluZyA9IG5ld1Jlc3VsdFNldE1hcHBpbmc7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HLCBvbGRSZXN1bHRTZXRNYXBwaW5nLCByZXN1bHRTZXRNYXBwaW5nKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvY2VkdXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2NlZHVyZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2NlZHVyZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRQcm9jZWR1cmVOYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9Qcm9jZWR1cmVOYW1lKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvY2VkdXJlTmFtZSgpCisJeworCQlyZXR1cm4gcHJvY2VkdXJlTmFtZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRQcm9jZWR1cmVOYW1lIDxlbT5Qcm9jZWR1cmUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VkdXJlIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFByb2NlZHVyZU5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm9jZWR1cmVOYW1lKFN0cmluZyBuZXdQcm9jZWR1cmVOYW1lKQorCXsKKwkJU3RyaW5nIG9sZFByb2NlZHVyZU5hbWUgPSBwcm9jZWR1cmVOYW1lOworCQlwcm9jZWR1cmVOYW1lID0gbmV3UHJvY2VkdXJlTmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QUk9DRURVUkVfTkFNRSwgb2xkUHJvY2VkdXJlTmFtZSwgcHJvY2VkdXJlTmFtZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldHVybnMgUmVzdWx0IFNldDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmV0dXJucyBSZXN1bHQgU2V0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybnMgUmVzdWx0IFNldDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0UmV0dXJuc1Jlc3VsdFNldChCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1JldHVybnNSZXN1bHRTZXQoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCb29sZWFuIGdldFJldHVybnNSZXN1bHRTZXQoKQorCXsKKwkJcmV0dXJuIHJldHVybnNSZXN1bHRTZXQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UmV0dXJuc1Jlc3VsdFNldCA8ZW0+UmV0dXJucyBSZXN1bHQgU2V0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXR1cm5zIFJlc3VsdCBTZXQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFJldHVybnNSZXN1bHRTZXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXR1cm5zUmVzdWx0U2V0KEJvb2xlYW4gbmV3UmV0dXJuc1Jlc3VsdFNldCkKKwl7CisJCUJvb2xlYW4gb2xkUmV0dXJuc1Jlc3VsdFNldCA9IHJldHVybnNSZXN1bHRTZXQ7CisJCXJldHVybnNSZXN1bHRTZXQgPSBuZXdSZXR1cm5zUmVzdWx0U2V0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVCwgb2xkUmV0dXJuc1Jlc3VsdFNldCwgcmV0dXJuc1Jlc3VsdFNldCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X0hpbnRzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxRdWVyeUhpbnQ+IGdldEhpbnRzKCkKKwl7CisJCWlmIChoaW50cyA9PSBudWxsKQorCQl7CisJCQloaW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxRdWVyeUhpbnQ+KFhtbFF1ZXJ5SGludC5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19ISU5UUyk7CisJCX0KKwkJcmV0dXJuIGhpbnRzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcmFtZXRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbWV0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1BhcmFtZXRlcnMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpCisJeworCQlpZiAocGFyYW1ldGVycyA9PSBudWxsKQorCQl7CisJCQlwYXJhbWV0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcj4oWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlMpOworCQl9CisJCXJldHVybiBwYXJhbWV0ZXJzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlRTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SGludHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQYXJhbWV0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRToKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9DTEFTUzoKKwkJCQlyZXR1cm4gZ2V0UmVzdWx0Q2xhc3MoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkc6CisJCQkJcmV0dXJuIGdldFJlc3VsdFNldE1hcHBpbmcoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QUk9DRURVUkVfTkFNRToKKwkJCQlyZXR1cm4gZ2V0UHJvY2VkdXJlTmFtZSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVDoKKwkJCQlyZXR1cm4gZ2V0UmV0dXJuc1Jlc3VsdFNldCgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlRTOgorCQkJCXJldHVybiBnZXRIaW50cygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlM6CisJCQkJcmV0dXJuIGdldFBhcmFtZXRlcnMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRToKKwkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfQ0xBU1M6CisJCQkJc2V0UmVzdWx0Q2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORzoKKwkJCQlzZXRSZXN1bHRTZXRNYXBwaW5nKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QUk9DRURVUkVfTkFNRToKKwkJCQlzZXRQcm9jZWR1cmVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVRVUk5TX1JFU1VMVF9TRVQ6CisJCQkJc2V0UmV0dXJuc1Jlc3VsdFNldCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlRTOgorCQkJCWdldEhpbnRzKCkuY2xlYXIoKTsKKwkJCQlnZXRIaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUXVlcnlIaW50PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlM6CisJCQkJZ2V0UGFyYW1ldGVycygpLmNsZWFyKCk7CisJCQkJZ2V0UGFyYW1ldGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX05BTUU6CisJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTOgorCQkJCXNldFJlc3VsdENsYXNzKFJFU1VMVF9DTEFTU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORzoKKwkJCQlzZXRSZXN1bHRTZXRNYXBwaW5nKFJFU1VMVF9TRVRfTUFQUElOR19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FOgorCQkJCXNldFByb2NlZHVyZU5hbWUoUFJPQ0VEVVJFX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVRVUk5TX1JFU1VMVF9TRVQ6CisJCQkJc2V0UmV0dXJuc1Jlc3VsdFNldChSRVRVUk5TX1JFU1VMVF9TRVRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19ISU5UUzoKKwkJCQlnZXRIaW50cygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlM6CisJCQkJZ2V0UGFyYW1ldGVycygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19OQU1FOgorCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTOgorCQkJCXJldHVybiBSRVNVTFRfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3VsdENsYXNzICE9IG51bGwgOiAhUkVTVUxUX0NMQVNTX0VERUZBVUxULmVxdWFscyhyZXN1bHRDbGFzcyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HOgorCQkJCXJldHVybiBSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3VsdFNldE1hcHBpbmcgIT0gbnVsbCA6ICFSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQuZXF1YWxzKHJlc3VsdFNldE1hcHBpbmcpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FOgorCQkJCXJldHVybiBQUk9DRURVUkVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcHJvY2VkdXJlTmFtZSAhPSBudWxsIDogIVBST0NFRFVSRV9OQU1FX0VERUZBVUxULmVxdWFscyhwcm9jZWR1cmVOYW1lKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVRVUk5TX1JFU1VMVF9TRVQ6CisJCQkJcmV0dXJuIFJFVFVSTlNfUkVTVUxUX1NFVF9FREVGQVVMVCA9PSBudWxsID8gcmV0dXJuc1Jlc3VsdFNldCAhPSBudWxsIDogIVJFVFVSTlNfUkVTVUxUX1NFVF9FREVGQVVMVC5lcXVhbHMocmV0dXJuc1Jlc3VsdFNldCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVFM6CisJCQkJcmV0dXJuIGhpbnRzICE9IG51bGwgJiYgIWhpbnRzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QQVJBTUVURVJTOgorCQkJCXJldHVybiBwYXJhbWV0ZXJzICE9IG51bGwgJiYgIXBhcmFtZXRlcnMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChuYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByZXN1bHRDbGFzczogIik7CisJCXJlc3VsdC5hcHBlbmQocmVzdWx0Q2xhc3MpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3VsdFNldE1hcHBpbmc6ICIpOworCQlyZXN1bHQuYXBwZW5kKHJlc3VsdFNldE1hcHBpbmcpOworCQlyZXN1bHQuYXBwZW5kKCIsIHByb2NlZHVyZU5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHByb2NlZHVyZU5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJldHVybnNSZXN1bHRTZXQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKHJldHVybnNSZXN1bHRTZXQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZFJlc3VsdENsYXNzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQcm9jZWR1cmVOYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRSZXR1cm5SZXN1bHRTZXRUcmFuc2xhdG9yKCksCisJCQlidWlsZEhpbnRUcmFuc2xhdG9yKCksCisJCQlidWlsZFBhcmFtZXRlclRyYW5zbGF0b3IoKSwKKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX05BTUUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJlc3VsdENsYXNzVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9DTEFTUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Jlc3VsdENsYXNzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmVzdWx0U2V0TWFwcGluZygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9jZWR1cmVOYW1lVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUHJvY2VkdXJlTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSZXR1cm5SZXN1bHRTZXRUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1JldHVybnNSZXN1bHRTZXQoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSGludFRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxRdWVyeUhpbnQuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9IaW50cygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUGFyYW1ldGVyVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUGFyYW1ldGVycygpKTsKKwl9Cit9IC8vIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPYmplY3RUeXBlQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkNGU4NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsNDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiAKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPYmplY3QgVHlwZSBDdXN0b21Db252ZXJ0ZXI8L2I+PC9lbT4nLgorICogIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXREYXRhVHlwZSA8ZW0+RGF0YSBUeXBlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlIDxlbT5PYmplY3QgVHlwZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0Q29udmVyc2lvblZhbHVlcyA8ZW0+Q29udmVyc2lvbiBWYWx1ZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldERlZmF1bHRPYmplY3RWYWx1ZSA8ZW0+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxPYmplY3RUeXBlQ29udmVydGVyIGV4dGVuZHMgWG1sTmFtZWRDb252ZXJ0ZXIKK3sKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YVR5cGUoKSA8ZW0+RGF0YSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREYXRhVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9UWVBFX0VERUZBVUxUID0gbnVsbDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhVHlwZSgpIDxlbT5EYXRhIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERhdGFUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFUeXBlID0gREFUQV9UWVBFX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlKCkgPGVtPk9iamVjdCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPYmplY3RUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfVFlQRV9FREVGQVVMVCA9IG51bGw7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZSgpIDxlbT5PYmplY3QgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T2JqZWN0VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBvYmplY3RUeXBlID0gT0JKRUNUX1RZUEVfRURFRkFVTFQ7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVyc2lvblZhbHVlcygpIDxlbT5Db252ZXJzaW9uIFZhbHVlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb252ZXJzaW9uVmFsdWVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29udmVyc2lvblZhbHVlPiBjb252ZXJzaW9uVmFsdWVzOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0T2JqZWN0VmFsdWUoKSA8ZW0+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlZmF1bHRPYmplY3RWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9PQkpFQ1RfVkFMVUVfRURFRkFVTFQgPSBudWxsOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRPYmplY3RWYWx1ZSgpIDxlbT5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSA9IERFRkFVTFRfT0JKRUNUX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVI7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF0YSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EYXRhIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREYXRhVHlwZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfRGF0YVR5cGUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlKCkKKwl7CisJCXJldHVybiBkYXRhVHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXREYXRhVHlwZSA8ZW0+RGF0YSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIFR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERhdGFUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIG5ld0RhdGFUeXBlKQorCXsKKwkJU3RyaW5nIG9sZERhdGFUeXBlID0gZGF0YVR5cGU7CisJCWRhdGFUeXBlID0gbmV3RGF0YVR5cGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUsIG9sZERhdGFUeXBlLCBkYXRhVHlwZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0T2JqZWN0VHlwZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpCisJeworCQlyZXR1cm4gb2JqZWN0VHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlIDxlbT5PYmplY3QgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE9iamVjdFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBuZXdPYmplY3RUeXBlKQorCXsKKwkJU3RyaW5nIG9sZE9iamVjdFR5cGUgPSBvYmplY3RUeXBlOworCQlvYmplY3RUeXBlID0gbmV3T2JqZWN0VHlwZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFLCBvbGRPYmplY3RUeXBlLCBvYmplY3RUeXBlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVyc2lvbiBWYWx1ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnNpb24gVmFsdWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVyc2lvbiBWYWx1ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfQ29udmVyc2lvblZhbHVlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sQ29udmVyc2lvblZhbHVlPiBnZXRDb252ZXJzaW9uVmFsdWVzKCkKKwl7CisJCWlmIChjb252ZXJzaW9uVmFsdWVzID09IG51bGwpCisJCXsKKwkJCWNvbnZlcnNpb25WYWx1ZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQ29udmVyc2lvblZhbHVlPihYbWxDb252ZXJzaW9uVmFsdWUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUyk7CisJCX0KKwkJcmV0dXJuIGNvbnZlcnNpb25WYWx1ZXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlZmF1bHQgT2JqZWN0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgT2JqZWN0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZWZhdWx0T2JqZWN0VmFsdWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0RlZmF1bHRPYmplY3RWYWx1ZSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkKKwl7CisJCXJldHVybiBkZWZhdWx0T2JqZWN0VmFsdWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0RGVmYXVsdE9iamVjdFZhbHVlIDxlbT5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERlZmF1bHRPYmplY3RWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcgbmV3RGVmYXVsdE9iamVjdFZhbHVlKQorCXsKKwkJU3RyaW5nIG9sZERlZmF1bHRPYmplY3RWYWx1ZSA9IGRlZmF1bHRPYmplY3RWYWx1ZTsKKwkJZGVmYXVsdE9iamVjdFZhbHVlID0gbmV3RGVmYXVsdE9iamVjdFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUUsIG9sZERlZmF1bHRPYmplY3RWYWx1ZSwgZGVmYXVsdE9iamVjdFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnNpb25WYWx1ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRToKKwkJCQlyZXR1cm4gZ2V0RGF0YVR5cGUoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOgorCQkJCXJldHVybiBnZXRPYmplY3RUeXBlKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUzoKKwkJCQlyZXR1cm4gZ2V0Q29udmVyc2lvblZhbHVlcygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUU6CisJCQkJcmV0dXJuIGdldERlZmF1bHRPYmplY3RWYWx1ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRToKKwkJCQlzZXREYXRhVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRToKKwkJCQlzZXRPYmplY3RUeXBlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTOgorCQkJCWdldENvbnZlcnNpb25WYWx1ZXMoKS5jbGVhcigpOworCQkJCWdldENvbnZlcnNpb25WYWx1ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbENvbnZlcnNpb25WYWx1ZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFOgorCQkJCXNldERlZmF1bHRPYmplY3RWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEU6CisJCQkJc2V0RGF0YVR5cGUoREFUQV9UWVBFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRToKKwkJCQlzZXRPYmplY3RUeXBlKE9CSkVDVF9UWVBFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUzoKKwkJCQlnZXRDb252ZXJzaW9uVmFsdWVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRToKKwkJCQlzZXREZWZhdWx0T2JqZWN0VmFsdWUoREVGQVVMVF9PQkpFQ1RfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEU6CisJCQkJcmV0dXJuIERBVEFfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZGF0YVR5cGUgIT0gbnVsbCA6ICFEQVRBX1RZUEVfRURFRkFVTFQuZXF1YWxzKGRhdGFUeXBlKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOgorCQkJCXJldHVybiBPQkpFQ1RfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gb2JqZWN0VHlwZSAhPSBudWxsIDogIU9CSkVDVF9UWVBFX0VERUZBVUxULmVxdWFscyhvYmplY3RUeXBlKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTOgorCQkJCXJldHVybiBjb252ZXJzaW9uVmFsdWVzICE9IG51bGwgJiYgIWNvbnZlcnNpb25WYWx1ZXMuaXNFbXB0eSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUU6CisJCQkJcmV0dXJuIERFRkFVTFRfT0JKRUNUX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0T2JqZWN0VmFsdWUgIT0gbnVsbCA6ICFERUZBVUxUX09CSkVDVF9WQUxVRV9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdE9iamVjdFZhbHVlKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGF0YVR5cGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGRhdGFUeXBlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBvYmplY3RUeXBlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChvYmplY3RUeXBlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0T2JqZWN0VmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRPYmplY3RWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZENvbnZlcnNpb25WYWx1ZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlVHJhbnNsYXRvcigpLAorCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGREYXRhVHlwZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkT2JqZWN0VHlwZVRyYW5zbGF0b3IoKSwKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVyc2lvblZhbHVlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbENvbnZlcnNpb25WYWx1ZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0NvbnZlcnNpb25WYWx1ZXMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERlZmF1bHRPYmplY3RWYWx1ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfRGVmYXVsdE9iamVjdFZhbHVlKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREYXRhVHlwZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0RhdGFUeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFR5cGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX09iamVjdFR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCit9IC8vIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9NYW55LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvTWFueS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOTNjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvTWFueS5qYXZhCkBAIC0wLDAgKzEsNzQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT25lIFRvIE1hbnk8L2I+PC9lbT4nLgorICogIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueSgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxPbmVUb01hbnkgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55IGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sUHJpdmF0ZU93bmVkLCBYbWxKb2luRmV0Y2gsIFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMAoreworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJpdmF0ZU93bmVkKCkgPGVtPlByaXZhdGUgT3duZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzUHJpdmF0ZU93bmVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJJVkFURV9PV05FRF9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcml2YXRlT3duZWQoKSA8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNQcml2YXRlT3duZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHByaXZhdGVPd25lZCA9IFBSSVZBVEVfT1dORURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxKb2luRmV0Y2hUeXBlIEpPSU5fRkVUQ0hfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkZldGNoKCkgPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbEpvaW5GZXRjaFR5cGUgam9pbkZldGNoID0gSk9JTl9GRVRDSF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlDb252ZXJ0KCkgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFwS2V5Q29udmVydCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUNvbnZlcnQoKSA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG1hcEtleUNvbnZlcnQgPSBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpIDxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbE9uZVRvTWFueSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX09ORV9UT19NQU5ZOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByaXZhdGUgT3duZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByaXZhdGUgT3duZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaXZhdGVPd25lZF9Qcml2YXRlT3duZWQoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZU93bmVkKCkKKwl7CisJCXJldHVybiBwcml2YXRlT3duZWQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNpc1ByaXZhdGVPd25lZCA8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNQcml2YXRlT3duZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcml2YXRlT3duZWQoYm9vbGVhbiBuZXdQcml2YXRlT3duZWQpCisJeworCQlib29sZWFuIG9sZFByaXZhdGVPd25lZCA9IHByaXZhdGVPd25lZDsKKwkJcHJpdmF0ZU93bmVkID0gbmV3UHJpdmF0ZU93bmVkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUklWQVRFX09XTkVELCBvbGRQcml2YXRlT3duZWQsIHByaXZhdGVPd25lZCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKKwkgKiBAc2VlICNzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpCisJeworCQlyZXR1cm4gam9pbkZldGNoOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0Sm9pbkZldGNoIDxlbT5Kb2luIEZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCisJICogQHNlZSAjZ2V0Sm9pbkZldGNoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgbmV3Sm9pbkZldGNoKQorCXsKKwkJWG1sSm9pbkZldGNoVHlwZSBvbGRKb2luRmV0Y2ggPSBqb2luRmV0Y2g7CisJCWpvaW5GZXRjaCA9IG5ld0pvaW5GZXRjaCA9PSBudWxsID8gSk9JTl9GRVRDSF9FREVGQVVMVCA6IG5ld0pvaW5GZXRjaDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9GRVRDSCwgb2xkSm9pbkZldGNoLCBqb2luRmV0Y2gpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1hcEtleUNvbnZlcnQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5Q29udmVydCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TWFwS2V5Q29udmVydCgpCisJeworCQlyZXR1cm4gbWFwS2V5Q29udmVydDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldE1hcEtleUNvbnZlcnQgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFwS2V5Q29udmVydChTdHJpbmcgbmV3TWFwS2V5Q29udmVydCkKKwl7CisJCVN0cmluZyBvbGRNYXBLZXlDb252ZXJ0ID0gbWFwS2V5Q29udmVydDsKKwkJbWFwS2V5Q29udmVydCA9IG5ld01hcEtleUNvbnZlcnQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVCwgb2xkTWFwS2V5Q29udmVydCwgbWFwS2V5Q29udmVydCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCisJeworCQlpZiAobWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPT0gbnVsbCkKKwkJeworCQkJbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4oWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQl9CisJCXJldHVybiBtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQorCXsKKwkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOworCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCisJeworCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQorCXsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKKwkJeworCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVMpOworCQl9CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6CisJCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUklWQVRFX09XTkVEOgorCQkJCXJldHVybiBpc1ByaXZhdGVPd25lZCgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19KT0lOX0ZFVENIOgorCQkJCXJldHVybiBnZXRKb2luRmV0Y2goKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgorCQkJCXJldHVybiBnZXRNYXBLZXlDb252ZXJ0KCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgorCQkJCXJldHVybiBnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6CisJCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUk9QRVJUSUVTOgorCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOworCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUklWQVRFX09XTkVEOgorCQkJCXNldFByaXZhdGVPd25lZCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19KT0lOX0ZFVENIOgorCQkJCXNldEpvaW5GZXRjaCgoWG1sSm9pbkZldGNoVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQ6CisJCQkJc2V0TWFwS2V5Q29udmVydCgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgorCQkJCWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKKwkJCQlnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXNzb2NpYXRpb25PdmVycmlkZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6CisJCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUklWQVRFX09XTkVEOgorCQkJCXNldFByaXZhdGVPd25lZChQUklWQVRFX09XTkVEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fRkVUQ0g6CisJCQkJc2V0Sm9pbkZldGNoKEpPSU5fRkVUQ0hfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgorCQkJCXNldE1hcEtleUNvbnZlcnQoTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgorCQkJCWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUklWQVRFX09XTkVEOgorCQkJCXJldHVybiBwcml2YXRlT3duZWQgIT0gUFJJVkFURV9PV05FRF9FREVGQVVMVDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9GRVRDSDoKKwkJCQlyZXR1cm4gam9pbkZldGNoICE9IEpPSU5fRkVUQ0hfRURFRkFVTFQ7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDoKKwkJCQlyZXR1cm4gTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUID09IG51bGwgPyBtYXBLZXlDb252ZXJ0ICE9IG51bGwgOiAhTUFQX0tFWV9DT05WRVJUX0VERUZBVUxULmVxdWFscyhtYXBLZXlDb252ZXJ0KTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6CisJCQkJcmV0dXJuIG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzICE9IG51bGwgJiYgIW1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJpdmF0ZU93bmVkLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUklWQVRFX09XTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklWQVRFX09XTkVEX19QUklWQVRFX09XTkVEOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5GZXRjaC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9DT05WRVJUOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUFJPUEVSVElFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJpdmF0ZU93bmVkLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSVZBVEVfT1dORURfX1BSSVZBVEVfT1dORUQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUklWQVRFX09XTkVEOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5GZXRjaC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9GRVRDSDsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAocHJpdmF0ZU93bmVkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChwcml2YXRlT3duZWQpOworCQlyZXN1bHQuYXBwZW5kKCIsIGpvaW5GZXRjaDogIik7CisJCXJlc3VsdC5hcHBlbmQoam9pbkZldGNoKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtYXBLZXlDb252ZXJ0OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXBLZXlDb252ZXJ0KTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJpdmF0ZU93bmVkVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZShFY2xpcHNlTGluay5QUklWQVRFX09XTkVEKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKwkKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKKwkJCWVsZW1lbnROYW1lLCAKKwkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKKwkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55KCksIAorCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcHBlZEJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRPcnBoYW5SZW1vdmFsVHJhbnNsYXRvcigpLAorCQkJYnVpbGRPcmRlckJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRPcmRlckNvbHVtblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTWFwS2V5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRNYXBLZXlDbGFzc1RyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTWFwS2V5VGVtcG9yYWxUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcEtleUVudW1lcmF0ZWRUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcEtleUNvbnZlcnRUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNYXBLZXlDb2x1bW5UcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcEtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCisJCQlidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpLAorCQkJYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCksCisJCQlidWlsZEpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCisJCQlidWlsZENhc2NhZGVUcmFuc2xhdG9yKCksCisJCQlidWlsZFByaXZhdGVPd25lZFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlDb252ZXJ0VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk1BUF9LRVlfQ09OVkVSVCwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUNvbnZlcnQoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQXNzb2NpYXRpb25PdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERSwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxPYmplY3RUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX1N0cnVjdENvbnZlcnRlcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJpdmF0ZU93bmVkVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJpdmF0ZU93bmVkX1ByaXZhdGVPd25lZCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9PbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9PbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGE4NGM3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb09uZS5qYXZhCkBAIC0wLDAgKzEsNTc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT25lIFRvIE9uZTwvYj48L2VtPicuCisgKiAgCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKiAKKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT25lVG9PbmUoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgWG1sT25lVG9PbmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUgaW1wbGVtZW50cyBYbWxBdHRyaWJ1dGVNYXBwaW5nLCBYbWxQcml2YXRlT3duZWQsIFhtbEpvaW5GZXRjaAoreworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJpdmF0ZU93bmVkKCkgPGVtPlByaXZhdGUgT3duZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzUHJpdmF0ZU93bmVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJJVkFURV9PV05FRF9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcml2YXRlT3duZWQoKSA8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNQcml2YXRlT3duZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHByaXZhdGVPd25lZCA9IFBSSVZBVEVfT1dORURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxKb2luRmV0Y2hUeXBlIEpPSU5fRkVUQ0hfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkZldGNoKCkgPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbEpvaW5GZXRjaFR5cGUgam9pbkZldGNoID0gSk9JTl9GRVRDSF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxPbmVUb09uZSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX09ORV9UT19PTkU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpdmF0ZSBPd25lZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcml2YXRlIE93bmVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRQcml2YXRlT3duZWQoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpdmF0ZU93bmVkX1ByaXZhdGVPd25lZCgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNQcml2YXRlT3duZWQoKQorCXsKKwkJcmV0dXJuIHByaXZhdGVPd25lZDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjaXNQcml2YXRlT3duZWQgPGVtPlByaXZhdGUgT3duZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaXZhdGUgT3duZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzUHJpdmF0ZU93bmVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4gbmV3UHJpdmF0ZU93bmVkKQorCXsKKwkJYm9vbGVhbiBvbGRQcml2YXRlT3duZWQgPSBwcml2YXRlT3duZWQ7CisJCXByaXZhdGVPd25lZCA9IG5ld1ByaXZhdGVPd25lZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklWQVRFX09XTkVELCBvbGRQcml2YXRlT3duZWQsIHByaXZhdGVPd25lZCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKKwkgKiBAc2VlICNzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpCisJeworCQlyZXR1cm4gam9pbkZldGNoOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRKb2luRmV0Y2ggPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKKwkgKiBAc2VlICNnZXRKb2luRmV0Y2goKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSBuZXdKb2luRmV0Y2gpCisJeworCQlYbWxKb2luRmV0Y2hUeXBlIG9sZEpvaW5GZXRjaCA9IGpvaW5GZXRjaDsKKwkJam9pbkZldGNoID0gbmV3Sm9pbkZldGNoID09IG51bGwgPyBKT0lOX0ZFVENIX0VERUZBVUxUIDogbmV3Sm9pbkZldGNoOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0pPSU5fRkVUQ0gsIG9sZEpvaW5GZXRjaCwgam9pbkZldGNoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKKwl7CisJCXJldHVybiBhY2Nlc3NNZXRob2RzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKKwkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKKwl7CisJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCisJeworCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQorCQl7CisJCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUk9QRVJUSUVTKTsKKwkJfQorCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6CisJCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJVkFURV9PV05FRDoKKwkJCQlyZXR1cm4gaXNQcml2YXRlT3duZWQoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENIOgorCQkJCXJldHVybiBnZXRKb2luRmV0Y2goKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6CisJCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJVkFURV9PV05FRDoKKwkJCQlzZXRQcml2YXRlT3duZWQoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENIOgorCQkJCXNldEpvaW5GZXRjaCgoWG1sSm9pbkZldGNoVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSVZBVEVfT1dORUQ6CisJCQkJc2V0UHJpdmF0ZU93bmVkKFBSSVZBVEVfT1dORURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENIOgorCQkJCXNldEpvaW5GZXRjaChKT0lOX0ZFVENIX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklWQVRFX09XTkVEOgorCQkJCXJldHVybiBwcml2YXRlT3duZWQgIT0gUFJJVkFURV9PV05FRF9FREVGQVVMVDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENIOgorCQkJCXJldHVybiBqb2luRmV0Y2ggIT0gSk9JTl9GRVRDSF9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFByaXZhdGVPd25lZC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklWQVRFX09XTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklWQVRFX09XTkVEX19QUklWQVRFX09XTkVEOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5GZXRjaC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKKwl7CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFByaXZhdGVPd25lZC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklWQVRFX09XTkVEX19QUklWQVRFX09XTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklWQVRFX09XTkVEOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5GZXRjaC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENIOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAocHJpdmF0ZU93bmVkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChwcml2YXRlT3duZWQpOworCQlyZXN1bHQuYXBwZW5kKCIsIGpvaW5GZXRjaDogIik7CisJCXJlc3VsdC5hcHBlbmQoam9pbkZldGNoKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJpdmF0ZU93bmVkVGV4dFJhbmdlKCkgeworCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZShFY2xpcHNlTGluay5QUklWQVRFX09XTkVEKTsKKwl9CisJCisJcHVibGljIFRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKwkKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKKwkJCWVsZW1lbnROYW1lLCAKKwkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKKwkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT25lVG9PbmUoKSwgCisJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZFRhcmdldEVudGl0eVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRmV0Y2hUcmFuc2xhdG9yKCksCisJCQlidWlsZE9wdGlvbmFsVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCisJCQlidWlsZE1hcHBlZEJ5VHJhbnNsYXRvcigpLAorCQkJYnVpbGRPcnBoYW5SZW1vdmFsVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNYXBzSWRUcmFuc2xhdG9yKCksCisJCQlidWlsZElkVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSm9pblRhYmxlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDYXNjYWRlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRQcml2YXRlT3duZWRUcmFuc2xhdG9yKCksCisJCQlidWlsZEpvaW5GZXRjaFRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJpdmF0ZU93bmVkVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJpdmF0ZU93bmVkX1ByaXZhdGVPd25lZCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3B0aW1pc3RpY0xvY2tpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3B0aW1pc3RpY0xvY2tpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGMzNmMxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPcHRpbWlzdGljTG9ja2luZy5qYXZhCkBAIC0wLDAgKzEsMzczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuQm9vbGVhblRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT3B0aW1pc3RpYyBMb2NraW5nPC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjIKKyAqIAorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRDYXNjYWRlIDxlbT5DYXNjYWRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcjZ2V0U2VsZWN0ZWRDb2x1bW5zIDxlbT5TZWxlY3RlZCBDb2x1bW5zPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9wdGltaXN0aWNMb2NraW5nKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbE9wdGltaXN0aWNMb2NraW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAorCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBUWVBFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSB0eXBlID0gVFlQRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlKCkgPGVtPkNhc2NhZGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENhc2NhZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBDQVNDQURFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGUoKSA8ZW0+Q2FzY2FkZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2FzY2FkZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJvb2xlYW4gY2FzY2FkZSA9IENBU0NBREVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWxlY3RlZENvbHVtbnMoKSA8ZW0+U2VsZWN0ZWQgQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTZWxlY3RlZENvbHVtbnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxYbWxDb2x1bW4+IHNlbGVjdGVkQ29sdW1uczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxPcHRpbWlzdGljTG9ja2luZygpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX09QVElNSVNUSUNfTE9DS0lORzsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZQorCSAqIEBzZWUgI3NldFR5cGUoWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcHRpbWlzdGljTG9ja2luZ19UeXBlKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBnZXRUeXBlKCkKKwl7CisJCXJldHVybiB0eXBlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUKKwkgKiBAc2VlICNnZXRUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VHlwZShYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgbmV3VHlwZSkKKwl7CisJCVhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBvbGRUeXBlID0gdHlwZTsKKwkJdHlwZSA9IG5ld1R5cGUgPT0gbnVsbCA/IFRZUEVfRURFRkFVTFQgOiBuZXdUeXBlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Q2FzY2FkZShCb29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcHRpbWlzdGljTG9ja2luZ19DYXNjYWRlKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBnZXRDYXNjYWRlKCkKKwl7CisJCXJldHVybiBjYXNjYWRlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRDYXNjYWRlIDxlbT5DYXNjYWRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDYXNjYWRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q2FzY2FkZShCb29sZWFuIG5ld0Nhc2NhZGUpCisJeworCQlCb29sZWFuIG9sZENhc2NhZGUgPSBjYXNjYWRlOworCQljYXNjYWRlID0gbmV3Q2FzY2FkZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREUsIG9sZENhc2NhZGUsIGNhc2NhZGUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWxlY3RlZCBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWxlY3RlZCBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VsZWN0ZWQgQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfU2VsZWN0ZWRDb2x1bW5zKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxDb2x1bW4+IGdldFNlbGVjdGVkQ29sdW1ucygpCisJeworCQlpZiAoc2VsZWN0ZWRDb2x1bW5zID09IG51bGwpCisJCXsKKwkJCXNlbGVjdGVkQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb2x1bW4+KFhtbENvbHVtbi5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1NFTEVDVEVEX0NPTFVNTlMpOworCQl9CisJCXJldHVybiBzZWxlY3RlZENvbHVtbnM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU5TOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2VsZWN0ZWRDb2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFOgorCQkJCXJldHVybiBnZXRUeXBlKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19DQVNDQURFOgorCQkJCXJldHVybiBnZXRDYXNjYWRlKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU5TOgorCQkJCXJldHVybiBnZXRTZWxlY3RlZENvbHVtbnMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFOgorCQkJCXNldFR5cGUoKFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERToKKwkJCQlzZXRDYXNjYWRlKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU5TOgorCQkJCWdldFNlbGVjdGVkQ29sdW1ucygpLmNsZWFyKCk7CisJCQkJZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxDb2x1bW4+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFOgorCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERToKKwkJCQlzZXRDYXNjYWRlKENBU0NBREVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1NFTEVDVEVEX0NPTFVNTlM6CisJCQkJZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fVFlQRToKKwkJCQlyZXR1cm4gdHlwZSAhPSBUWVBFX0VERUZBVUxUOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERToKKwkJCQlyZXR1cm4gQ0FTQ0FERV9FREVGQVVMVCA9PSBudWxsID8gY2FzY2FkZSAhPSBudWxsIDogIUNBU0NBREVfRURFRkFVTFQuZXF1YWxzKGNhc2NhZGUpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fU0VMRUNURURfQ09MVU1OUzoKKwkJCQlyZXR1cm4gc2VsZWN0ZWRDb2x1bW5zICE9IG51bGwgJiYgIXNlbGVjdGVkQ29sdW1ucy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHR5cGUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisJCisJLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGRUeXBlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDYXNjYWRlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRTZWxlY3RlZENvbHVtblRyYW5zbGF0b3IoKSwKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHlwZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5PUFRJTUlTVElDX0xPQ0tJTkdfX1RZUEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYXNjYWRlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihFY2xpcHNlTGluay5PUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfQ2FzY2FkZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTZWxlY3RlZENvbHVtblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9QVElNSVNUSUNfTE9DS0lOR19fU0VMRUNURURfQ09MVU1OLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9wdGltaXN0aWNMb2NraW5nX1NlbGVjdGVkQ29sdW1ucygpKTsKKwl9CisKK30gLy8gWG1sT3B0aW1pc3RpY0xvY2tpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9wdGltaXN0aWNMb2NraW5nVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNWYwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9wdGltaXN0aWNMb2NraW5nVHlwZS5qYXZhCkBAIC0wLDAgKzEsMjk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlhtbCBPcHRpbWlzdGljIExvY2tpbmcgVHlwZTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjIKKyAqIAorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCit7CisJLyoqCisJICogVGhlICc8ZW0+PGI+QUxMIENPTFVNTlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQUxMX0NPTFVNTlNfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlBTExfQ09MVU1OUygwLCAiQUxMX0NPTFVNTlMiLCAiQUxMX0NPTFVNTlMiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNIQU5HRUQgQ09MVU1OUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDSEFOR0VEX0NPTFVNTlNfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDSEFOR0VEX0NPTFVNTlMoMSwgIkNIQU5HRURfQ09MVU1OUyIsICJDSEFOR0VEX0NPTFVNTlMiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNFTEVDVEVEIENPTFVNTlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU0VMRUNURURfQ09MVU1OU19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVNFTEVDVEVEX0NPTFVNTlMoMiwgIlNFTEVDVEVEX0NPTFVNTlMiLCAiU0VMRUNURURfQ09MVU1OUyIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+VkVSU0lPTiBDT0xVTU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjVkVSU0lPTl9DT0xVTU5fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlWRVJTSU9OX0NPTFVNTigzLCAiVkVSU0lPTl9DT0xVTU4iLCAiVkVSU0lPTl9DT0xVTU4iKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFMTCBDT0xVTU5TPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BTEwgQ09MVU1OUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNBTExfQ09MVU1OUworCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9DT0xVTU5TX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNIQU5HRUQgQ09MVU1OUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0hBTkdFRCBDT0xVTU5TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NIQU5HRURfQ09MVU1OUworCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRURfQ09MVU1OU19WQUxVRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TRUxFQ1RFRCBDT0xVTU5TPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TRUxFQ1RFRCBDT0xVTU5TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NFTEVDVEVEX0NPTFVNTlMKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RFRF9DT0xVTU5TX1ZBTFVFID0gMjsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlZFUlNJT04gQ09MVU1OPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5WRVJTSU9OIENPTFVNTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNWRVJTSU9OX0NPTFVNTgorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fQ09MVU1OX1ZBTFVFID0gMzsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5YbWwgT3B0aW1pc3RpYyBMb2NraW5nIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGVbXQorCQl7CisJCQlBTExfQ09MVU1OUywKKwkJCUNIQU5HRURfQ09MVU1OUywKKwkJCVNFTEVDVEVEX0NPTFVNTlMsCisJCQlWRVJTSU9OX0NPTFVNTiwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5YbWwgT3B0aW1pc3RpYyBMb2NraW5nIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkKKwl7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQorCQl7CisJCQlYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKKwkJCXsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKKwl7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQorCQl7CisJCQlYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQorCQkJeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgT3B0aW1pc3RpYyBMb2NraW5nIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgZ2V0KGludCB2YWx1ZSkKKwl7CisJCXN3aXRjaCAodmFsdWUpCisJCXsKKwkJCWNhc2UgQUxMX0NPTFVNTlNfVkFMVUU6IHJldHVybiBBTExfQ09MVU1OUzsKKwkJCWNhc2UgQ0hBTkdFRF9DT0xVTU5TX1ZBTFVFOiByZXR1cm4gQ0hBTkdFRF9DT0xVTU5TOworCQkJY2FzZSBTRUxFQ1RFRF9DT0xVTU5TX1ZBTFVFOiByZXR1cm4gU0VMRUNURURfQ09MVU1OUzsKKwkJCWNhc2UgVkVSU0lPTl9DT0xVTU5fVkFMVUU6IHJldHVybiBWRVJTSU9OX0NPTFVNTjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQorCXsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQorCXsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCisJeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3JkZXJDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3JkZXJDb2x1bW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjIwMzkzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPcmRlckNvbHVtbi5qYXZhCkBAIC0wLDAgKzEsMjU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT3JkZXIgQ29sdW1uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW4oKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgWG1sT3JkZXJDb2x1bW4gZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4gaW1wbGVtZW50cyBYbWxPcmRlckNvbHVtbl8yXzAKK3sKKwkvKioKKwkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKKwkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0CisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgVkFMSURBVElPTl9NT0RFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbGlkYXRpb25Nb2RlKCkgPGVtPlZhbGlkYXRpb24gTW9kZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmFsaWRhdGlvbk1vZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBPcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgdmFsaWRhdGlvbk1vZGUgPSBWQUxJREFUSU9OX01PREVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sT3JkZXJDb2x1bW4oKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9PUkRFUl9DT0xVTU47CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbiBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbGlkYXRpb24gTW9kZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZGF0aW9uIE1vZGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wCisJICogQHNlZSAjc2V0VmFsaWRhdGlvbk1vZGUoT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzBfVmFsaWRhdGlvbk1vZGUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wIGdldFZhbGlkYXRpb25Nb2RlKCkKKwl7CisJCXJldHVybiB2YWxpZGF0aW9uTW9kZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4jZ2V0VmFsaWRhdGlvbk1vZGUgPGVtPlZhbGlkYXRpb24gTW9kZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbiBNb2RlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMAorCSAqIEBzZWUgI2dldFZhbGlkYXRpb25Nb2RlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbk1vZGUoT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wIG5ld1ZhbGlkYXRpb25Nb2RlKQorCXsKKwkJT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wIG9sZFZhbGlkYXRpb25Nb2RlID0gdmFsaWRhdGlvbk1vZGU7CisJCXZhbGlkYXRpb25Nb2RlID0gbmV3VmFsaWRhdGlvbk1vZGUgPT0gbnVsbCA/IFZBTElEQVRJT05fTU9ERV9FREVGQVVMVCA6IG5ld1ZhbGlkYXRpb25Nb2RlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fVkFMSURBVElPTl9NT0RFLCBvbGRWYWxpZGF0aW9uTW9kZSwgdmFsaWRhdGlvbk1vZGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX1ZBTElEQVRJT05fTU9ERToKKwkJCQlyZXR1cm4gZ2V0VmFsaWRhdGlvbk1vZGUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19WQUxJREFUSU9OX01PREU6CisJCQkJc2V0VmFsaWRhdGlvbk1vZGUoKE9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMCluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fVkFMSURBVElPTl9NT0RFOgorCQkJCXNldFZhbGlkYXRpb25Nb2RlKFZBTElEQVRJT05fTU9ERV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX1ZBTElEQVRJT05fTU9ERToKKwkJCQlyZXR1cm4gdmFsaWRhdGlvbk1vZGUgIT0gVkFMSURBVElPTl9NT0RFX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPcmRlckNvbHVtbl8yXzAuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19WQUxJREFUSU9OX01PREU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fMjBfX1ZBTElEQVRJT05fTU9ERTsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbE9yZGVyQ29sdW1uXzJfMC5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OXzIwX19WQUxJREFUSU9OX01PREU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fVkFMSURBVElPTl9NT0RFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAodmFsaWRhdGlvbk1vZGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHZhbGlkYXRpb25Nb2RlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJZWxlbWVudE5hbWUsCisJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKKwkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCisJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCisJCSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGROdWxsYWJsZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkSW5zZXJ0YWJsZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkVXBkYXRhYmxlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDb2x1bW5EZWZpbml0aW9uVHJhbnNsYXRvcigpLAorCQkJYnVpbGRWYWxpZGF0aW9uTW9kZVRyYW5zbGF0b3IoKSwKKwkJfTsKKwl9CisJCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFZhbGlkYXRpb25Nb2RlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlZBTElEQVRJT05fTU9ERSwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX1ZhbGlkYXRpb25Nb2RlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNTJmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSwyMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2I+PC9lbT4nLgorICogIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMgorICogQHNpbmNlIDIuMgorICoKKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSNpc0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQoreworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCisJeworCQlyZXR1cm4gZXhjbHVkZURlZmF1bHRNYXBwaW5nczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhib29sZWFuIG5ld0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpCisJeworCQlib29sZWFuIG9sZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOworCQlleGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gbmV3RXhjbHVkZURlZmF1bHRNYXBwaW5nczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MsIG9sZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MsIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6CisJCQkJcmV0dXJuIGlzRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6CisJCQkJc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKKwkJCQlzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6CisJCQkJcmV0dXJuIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgIT0gRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChleGNsdWRlRGVmYXVsdE1hcHBpbmdzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChleGNsdWRlRGVmYXVsdE1hcHBpbmdzKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJZWxlbWVudE5hbWUsIAorCQkJc3RydWN0dXJhbEZlYXR1cmUsIAorCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLCAKKwkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCisJCQlidWlsZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpLAorCQkJYnVpbGRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1RyYW5zbGF0b3IoKSwKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhjbHVkZURlZmF1bHRNYXBwaW5nc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWENMVURFX0RFRkFVTFRfTUFQUElOR1MsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaW1hcnlLZXkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJpbWFyeUtleS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODQxMDYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaW1hcnlLZXkuamF2YQpAQCAtMCwwICsxLDI4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQcmltYXJ5IEtleTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaW1hcnlLZXkoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgWG1sUHJpbWFyeUtleSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFByaW1hcnlLZXlfMV8xCit7CisJLyoqCisJICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0CisJICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSWRWYWxpZGF0aW9uVHlwZV8xXzEgVkFMSURBVElPTl9FREVGQVVMVCA9IG51bGw7CisJCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsaWRhdGlvbigpIDxlbT5WYWxpZGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRWYWxpZGF0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSWRWYWxpZGF0aW9uVHlwZV8xXzEgdmFsaWRhdGlvbiA9IFZBTElEQVRJT05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW5zKCkgPGVtPkNvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29sdW1ucygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbENvbHVtbj4gY29sdW1uczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBYbWxQcmltYXJ5S2V5KCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUFJJTUFSWV9LRVk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbGlkYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMQorCSAqIEBzZWUgI3NldFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uVHlwZV8xXzEpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMV8xX1ZhbGlkYXRpb24oKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSWRWYWxpZGF0aW9uVHlwZV8xXzEgZ2V0VmFsaWRhdGlvbigpCisJeworCQlyZXR1cm4gdmFsaWRhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleSNnZXRWYWxpZGF0aW9uIDxlbT5WYWxpZGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xCisJICogQHNlZSAjZ2V0VmFsaWRhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uVHlwZV8xXzEgbmV3VmFsaWRhdGlvbikKKwl7CisJCUlkVmFsaWRhdGlvblR5cGVfMV8xIG9sZFZhbGlkYXRpb24gPSB2YWxpZGF0aW9uOworCQl2YWxpZGF0aW9uID0gbmV3VmFsaWRhdGlvbiA9PSBudWxsID8gVkFMSURBVElPTl9FREVGQVVMVCA6IG5ld1ZhbGlkYXRpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX1ZBTElEQVRJT04sIG9sZFZhbGlkYXRpb24sIHZhbGlkYXRpb24pKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleV8xXzFfQ29sdW1ucygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sQ29sdW1uPiBnZXRDb2x1bW5zKCkKKwl7CisJCWlmIChjb2x1bW5zID09IG51bGwpCisJCXsKKwkJCWNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQ29sdW1uPihYbWxDb2x1bW4uY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NPTFVNTlMpOworCQl9CisJCXJldHVybiBjb2x1bW5zOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DT0xVTU5TOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19WQUxJREFUSU9OOgorCQkJCXJldHVybiBnZXRWYWxpZGF0aW9uKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NPTFVNTlM6CisJCQkJcmV0dXJuIGdldENvbHVtbnMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX1ZBTElEQVRJT046CisJCQkJc2V0VmFsaWRhdGlvbigoSWRWYWxpZGF0aW9uVHlwZV8xXzEpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fQ09MVU1OUzoKKwkJCQlnZXRDb2x1bW5zKCkuY2xlYXIoKTsKKwkJCQlnZXRDb2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxDb2x1bW4+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX1ZBTElEQVRJT046CisJCQkJc2V0VmFsaWRhdGlvbihWQUxJREFUSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NPTFVNTlM6CisJCQkJZ2V0Q29sdW1ucygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fVkFMSURBVElPTjoKKwkJCQlyZXR1cm4gdmFsaWRhdGlvbiAhPSBWQUxJREFUSU9OX0VERUZBVUxUOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DT0xVTU5TOgorCQkJCXJldHVybiBjb2x1bW5zICE9IG51bGwgJiYgIWNvbHVtbnMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiICh2YWxpZGF0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh2YWxpZGF0aW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCisJCQllbGVtZW50TmFtZSwgCisJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKKwkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJpbWFyeUtleSgpLAorCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZFZhbGlkYXRpb25UcmFuc2xhdG9yKCksCisJCQlidWlsZENvbHVtblRyYW5zbGF0b3IoKQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRWYWxpZGF0aW9uVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMV8xLlBSSU1BUllfS0VZX19WQUxJREFUSU9OLCBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5XzFfMV9WYWxpZGF0aW9uKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMV8xLlBSSU1BUllfS0VZX19DT0xVTU4sIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlfMV8xX0NvbHVtbnMoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQcml2YXRlT3duZWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJpdmF0ZU93bmVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllZGI4MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJpdmF0ZU93bmVkLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiAKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQcml2YXRlIE93bmVkPC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqIAorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZCNpc1ByaXZhdGVPd25lZCA8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcml2YXRlT3duZWQoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbFByaXZhdGVPd25lZCBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcml2YXRlIE93bmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcml2YXRlIE93bmVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaXZhdGUgT3duZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFByaXZhdGVPd25lZChib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcml2YXRlT3duZWRfUHJpdmF0ZU93bmVkKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzUHJpdmF0ZU93bmVkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpdmF0ZU93bmVkI2lzUHJpdmF0ZU93bmVkIDxlbT5Qcml2YXRlIE93bmVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcml2YXRlIE93bmVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1ByaXZhdGVPd25lZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4gdmFsdWUpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBwcml2YXRlLW93bmVkIGF0dGlidXRlLgorCSAqLworCVRleHRSYW5nZSBnZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByb3BlcnR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxOTJjNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDM2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFByb3BlcnR5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWVUeXBlIDxlbT5WYWx1ZSBUeXBlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5KCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbFByb3BlcnR5IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVUeXBlKCkgPGVtPlZhbHVlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfVFlQRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZVR5cGUoKSA8ZW0+VmFsdWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmFsdWVUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlVHlwZSA9IFZBTFVFX1RZUEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sUHJvcGVydHkoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9QUk9QRVJUWTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eV9OYW1lKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCisJeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCisJeworCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7CisJCW5hbWUgPSBuZXdOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5X1ZhbHVlKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQorCXsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkKKwl7CisJCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOworCQl2YWx1ZSA9IG5ld1ZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRWYWx1ZVR5cGUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eV9WYWx1ZVR5cGUoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZVR5cGUoKQorCXsKKwkJcmV0dXJuIHZhbHVlVHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWVUeXBlIDxlbT5WYWx1ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRWYWx1ZVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZVR5cGUoU3RyaW5nIG5ld1ZhbHVlVHlwZSkKKwl7CisJCVN0cmluZyBvbGRWYWx1ZVR5cGUgPSB2YWx1ZVR5cGU7CisJCXZhbHVlVHlwZSA9IG5ld1ZhbHVlVHlwZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUVfVFlQRSwgb2xkVmFsdWVUeXBlLCB2YWx1ZVR5cGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fTkFNRToKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRToKKwkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUVfVFlQRToKKwkJCQlyZXR1cm4gZ2V0VmFsdWVUeXBlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19OQU1FOgorCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRToKKwkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEU6CisJCQkJc2V0VmFsdWVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fTkFNRToKKwkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUU6CisJCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUVfVFlQRToKKwkJCQlzZXRWYWx1ZVR5cGUoVkFMVUVfVFlQRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fTkFNRToKKwkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRToKKwkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUVfVFlQRToKKwkJCQlyZXR1cm4gVkFMVUVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVUeXBlICE9IG51bGwgOiAhVkFMVUVfVFlQRV9FREVGQVVMVC5lcXVhbHModmFsdWVUeXBlKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQobmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZVR5cGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHZhbHVlVHlwZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCisJCQlidWlsZFZhbHVlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRWYWx1ZVR5cGVUcmFuc2xhdG9yKCksCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFlfX05BTUUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRWYWx1ZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWV9fVkFMVUUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlfVmFsdWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVmFsdWVUeXBlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZX19WQUxVRV9UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5X1ZhbHVlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKK30gLy8gWG1sUHJvcGVydHkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJvcGVydHlDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJvcGVydHlDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmNjZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQcm9wZXJ0eUNvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQcm9wZXJ0eSBDb250YWluZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Q29udGFpbmVyI2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbFByb3BlcnR5Q29udGFpbmVyIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKTsKKworfSAvLyBYbWxQcm9wZXJ0eUNvbnRhaW5lcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeUNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeUNvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMWRjZjkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5Q29udGFpbmVyLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFF1ZXJ5IENvbnRhaW5lcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIjZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzIDxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXIoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbFF1ZXJ5Q29udGFpbmVyIGV4dGVuZHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+IGdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpOworCit9IC8vIFhtbFF1ZXJ5Q29udGFpbmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJlYWRPbmx5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJlYWRPbmx5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwNDIyYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUmVhZE9ubHkuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFJlYWQgT25seTwvYj48L2VtPicuCisgKiAgCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKiAKKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSNnZXRSZWFkT25seSA8ZW0+UmVhZCBPbmx5PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJlYWRPbmx5KCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxSZWFkT25seSBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFJlYWRPbmx5KEJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJlYWRPbmx5X1JlYWRPbmx5KCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlCb29sZWFuIGdldFJlYWRPbmx5KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHkjZ2V0UmVhZE9ubHkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSZWFkT25seSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVhZE9ubHkoQm9vbGVhbiB2YWx1ZSk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHJlYWQtb25seSBhdHRpYnV0ZS4KKwkgKi8KKwlUZXh0UmFuZ2UgZ2V0UmVhZE9ubHlUZXh0UmFuZ2UoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjAzOWNmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDU5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFN0b3JlZCBQcm9jZWR1cmUgUGFyYW1ldGVyPC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjIKKyAqCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldERpcmVjdGlvbiA8ZW0+RGlyZWN0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0UXVlcnlQYXJhbWV0ZXIgPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldEpkYmNUeXBlIDxlbT5KZGJjIFR5cGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0SmRiY1R5cGVOYW1lIDxlbT5KZGJjIFR5cGUgTmFtZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAoreworCS8qKgorCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAorCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhtbERpcmVjdGlvbiBESVJFQ1RJT05fRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlyZWN0aW9uKCkgPGVtPkRpcmVjdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGlyZWN0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sRGlyZWN0aW9uIGRpcmVjdGlvbiA9IERJUkVDVElPTl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFF1ZXJ5UGFyYW1ldGVyKCkgPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UXVlcnlQYXJhbWV0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1BBUkFNRVRFUl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRdWVyeVBhcmFtZXRlcigpIDxlbT5RdWVyeSBQYXJhbWV0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFF1ZXJ5UGFyYW1ldGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5UGFyYW1ldGVyID0gUVVFUllfUEFSQU1FVEVSX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmRiY1R5cGUoKSA8ZW0+SmRiYyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRKZGJjVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEpEQkNfVFlQRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKZGJjVHlwZSgpIDxlbT5KZGJjIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEpkYmNUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSW50ZWdlciBqZGJjVHlwZSA9IEpEQkNfVFlQRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKZGJjVHlwZU5hbWUoKSA8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEpkYmNUeXBlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkRCQ19UWVBFX05BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmRiY1R5cGVOYW1lKCkgPGVtPkpkYmMgVHlwZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRKZGJjVHlwZU5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgamRiY1R5cGVOYW1lID0gSkRCQ19UWVBFX05BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVI7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlyZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbERpcmVjdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXJlY3Rpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlyZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXJlY3Rpb24KKwkgKiBAc2VlICNzZXREaXJlY3Rpb24oWG1sRGlyZWN0aW9uKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfRGlyZWN0aW9uKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbERpcmVjdGlvbiBnZXREaXJlY3Rpb24oKQorCXsKKwkJcmV0dXJuIGRpcmVjdGlvbjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldERpcmVjdGlvbiA8ZW0+RGlyZWN0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXJlY3Rpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbERpcmVjdGlvbgorCSAqIEBzZWUgI2dldERpcmVjdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERpcmVjdGlvbihYbWxEaXJlY3Rpb24gbmV3RGlyZWN0aW9uKQorCXsKKwkJWG1sRGlyZWN0aW9uIG9sZERpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKwkJZGlyZWN0aW9uID0gbmV3RGlyZWN0aW9uID09IG51bGwgPyBESVJFQ1RJT05fRURFRkFVTFQgOiBuZXdEaXJlY3Rpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0RJUkVDVElPTiwgb2xkRGlyZWN0aW9uLCBkaXJlY3Rpb24pKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfTmFtZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKKwl7CisJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKKwkJbmFtZSA9IG5ld05hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RdWVyeSBQYXJhbWV0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeSBQYXJhbWV0ZXI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFF1ZXJ5UGFyYW1ldGVyKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX1F1ZXJ5UGFyYW1ldGVyKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlQYXJhbWV0ZXIoKQorCXsKKwkJcmV0dXJuIHF1ZXJ5UGFyYW1ldGVyOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0UXVlcnlQYXJhbWV0ZXIgPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnkgUGFyYW1ldGVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRRdWVyeVBhcmFtZXRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFF1ZXJ5UGFyYW1ldGVyKFN0cmluZyBuZXdRdWVyeVBhcmFtZXRlcikKKwl7CisJCVN0cmluZyBvbGRRdWVyeVBhcmFtZXRlciA9IHF1ZXJ5UGFyYW1ldGVyOworCQlxdWVyeVBhcmFtZXRlciA9IG5ld1F1ZXJ5UGFyYW1ldGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19RVUVSWV9QQVJBTUVURVIsIG9sZFF1ZXJ5UGFyYW1ldGVyLCBxdWVyeVBhcmFtZXRlcikpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VHlwZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9UeXBlKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCisJeworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKQorCXsKKwkJU3RyaW5nIG9sZFR5cGUgPSB0eXBlOworCQl0eXBlID0gbmV3VHlwZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpkYmMgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SmRiYyBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpkYmMgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SmRiY1R5cGUoSW50ZWdlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldEpkYmNUeXBlKCkKKwl7CisJCXJldHVybiBqZGJjVHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldEpkYmNUeXBlIDxlbT5KZGJjIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpkYmMgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SmRiY1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRKZGJjVHlwZShJbnRlZ2VyIG5ld0pkYmNUeXBlKQorCXsKKwkJSW50ZWdlciBvbGRKZGJjVHlwZSA9IGpkYmNUeXBlOworCQlqZGJjVHlwZSA9IG5ld0pkYmNUeXBlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEUsIG9sZEpkYmNUeXBlLCBqZGJjVHlwZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpkYmMgVHlwZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KZGJjIFR5cGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5KZGJjIFR5cGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SmRiY1R5cGVOYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlTmFtZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEpkYmNUeXBlTmFtZSgpCisJeworCQlyZXR1cm4gamRiY1R5cGVOYW1lOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0SmRiY1R5cGVOYW1lIDxlbT5KZGJjIFR5cGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEpkYmNUeXBlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEpkYmNUeXBlTmFtZShTdHJpbmcgbmV3SmRiY1R5cGVOYW1lKQorCXsKKwkJU3RyaW5nIG9sZEpkYmNUeXBlTmFtZSA9IGpkYmNUeXBlTmFtZTsKKwkJamRiY1R5cGVOYW1lID0gbmV3SmRiY1R5cGVOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRSwgb2xkSmRiY1R5cGVOYW1lLCBqZGJjVHlwZU5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fRElSRUNUSU9OOgorCQkJCXJldHVybiBnZXREaXJlY3Rpb24oKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fTkFNRToKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19RVUVSWV9QQVJBTUVURVI6CisJCQkJcmV0dXJuIGdldFF1ZXJ5UGFyYW1ldGVyKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1RZUEU6CisJCQkJcmV0dXJuIGdldFR5cGUoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFOgorCQkJCXJldHVybiBnZXRKZGJjVHlwZSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRToKKwkJCQlyZXR1cm4gZ2V0SmRiY1R5cGVOYW1lKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19ESVJFQ1RJT046CisJCQkJc2V0RGlyZWN0aW9uKChYbWxEaXJlY3Rpb24pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fTkFNRToKKwkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSOgorCQkJCXNldFF1ZXJ5UGFyYW1ldGVyKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRToKKwkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFOgorCQkJCXNldEpkYmNUeXBlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRV9OQU1FOgorCQkJCXNldEpkYmNUeXBlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0RJUkVDVElPTjoKKwkJCQlzZXREaXJlY3Rpb24oRElSRUNUSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX05BTUU6CisJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1FVRVJZX1BBUkFNRVRFUjoKKwkJCQlzZXRRdWVyeVBhcmFtZXRlcihRVUVSWV9QQVJBTUVURVJfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRToKKwkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFOgorCQkJCXNldEpkYmNUeXBlKEpEQkNfVFlQRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRToKKwkJCQlzZXRKZGJjVHlwZU5hbWUoSkRCQ19UWVBFX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0RJUkVDVElPTjoKKwkJCQlyZXR1cm4gZGlyZWN0aW9uICE9IERJUkVDVElPTl9FREVGQVVMVDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fTkFNRToKKwkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19RVUVSWV9QQVJBTUVURVI6CisJCQkJcmV0dXJuIFFVRVJZX1BBUkFNRVRFUl9FREVGQVVMVCA9PSBudWxsID8gcXVlcnlQYXJhbWV0ZXIgIT0gbnVsbCA6ICFRVUVSWV9QQVJBTUVURVJfRURFRkFVTFQuZXF1YWxzKHF1ZXJ5UGFyYW1ldGVyKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRToKKwkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEU6CisJCQkJcmV0dXJuIEpEQkNfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gamRiY1R5cGUgIT0gbnVsbCA6ICFKREJDX1RZUEVfRURFRkFVTFQuZXF1YWxzKGpkYmNUeXBlKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFX05BTUU6CisJCQkJcmV0dXJuIEpEQkNfVFlQRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBqZGJjVHlwZU5hbWUgIT0gbnVsbCA6ICFKREJDX1RZUEVfTkFNRV9FREVGQVVMVC5lcXVhbHMoamRiY1R5cGVOYW1lKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGlyZWN0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChkaXJlY3Rpb24pOworCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKG5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIHF1ZXJ5UGFyYW1ldGVyOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChxdWVyeVBhcmFtZXRlcik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7CisJCXJlc3VsdC5hcHBlbmQodHlwZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgamRiY1R5cGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGpkYmNUeXBlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBqZGJjVHlwZU5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGpkYmNUeXBlTmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZERpcmVjdGlvblRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUXVlcnlQYXJhbWV0ZXJUcmFuc2xhdG9yKCksCisJCQlidWlsZFR5cGVUcmFuc2xhdG9yKCksCisJCQlidWlsZEpkYmNUeXBlVHJhbnNsYXRvcigpLAorCQkJYnVpbGRKZGJjVHlwZU5hbWVUcmFuc2xhdG9yKCksCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERpcmVjdGlvblRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QQVJBTUVURVJfX0RJUkVDVElPTiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfRGlyZWN0aW9uKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QQVJBTUVURVJfX05BTUUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRRdWVyeVBhcmFtZXRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QQVJBTUVURVJfX1FVRVJZX1BBUkFNRVRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfUXVlcnlQYXJhbWV0ZXIoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBBUkFNRVRFUl9fVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpkYmNUeXBlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBBUkFNRVRFUl9fSkRCQ19UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpkYmNUeXBlTmFtZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QQVJBTUVURVJfX0pEQkNfVFlQRV9OQU1FLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZU5hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCit9IC8vIFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxTdHJ1Y3RDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sU3RydWN0Q29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2NWRkMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sU3RydWN0Q29udmVydGVyLmphdmEKQEAgLTAsMCArMSwyMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiAKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBTdHJ1Y3QgQ3VzdG9tQ29udmVydGVyPC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqIAorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlciNnZXRDb252ZXJ0ZXIgPGVtPkNvbnZlcnRlcjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdHJ1Y3RDb252ZXJ0ZXIoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgWG1sU3RydWN0Q29udmVydGVyIGV4dGVuZHMgWG1sTmFtZWRDb252ZXJ0ZXIKK3sKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVyKCkgPGVtPkNvbnZlcnRlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJURVJfRURFRkFVTFQgPSBudWxsOworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcigpIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbnZlcnRlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0ZXIgPSBDT05WRVJURVJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sU3RydWN0Q29udmVydGVyKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfU1RSVUNUX0NPTlZFUlRFUjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbUNvbnZlcnRlcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENvbnZlcnRlcihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0cnVjdENvbnZlcnRlcl9Db252ZXJ0ZXIoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlcigpCisJeworCQlyZXR1cm4gY29udmVydGVyOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXIjZ2V0Q29udmVydGVyIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Q29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFN0cmluZyBuZXdDb252ZXJ0ZXIpCisJeworCQlTdHJpbmcgb2xkQ29udmVydGVyID0gY29udmVydGVyOworCQljb252ZXJ0ZXIgPSBuZXdDb252ZXJ0ZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSLCBvbGRDb252ZXJ0ZXIsIGNvbnZlcnRlcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gZ2V0Q29udmVydGVyKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUjoKKwkJCQlzZXRDb252ZXJ0ZXIoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUjoKKwkJCQlzZXRDb252ZXJ0ZXIoQ09OVkVSVEVSX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gQ09OVkVSVEVSX0VERUZBVUxUID09IG51bGwgPyBjb252ZXJ0ZXIgIT0gbnVsbCA6ICFDT05WRVJURVJfRURFRkFVTFQuZXF1YWxzKGNvbnZlcnRlcik7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGNvbnZlcnRlcjogIik7CisJCXJlc3VsdC5hcHBlbmQoY29udmVydGVyKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCisJCQllbGVtZW50TmFtZSwKKwkJCXN0cnVjdHVyYWxGZWF0dXJlLAorCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKKwkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKKwkJKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSX19DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU3RydWN0Q29udmVydGVyX0NvbnZlcnRlcigpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKworfSAvLyBYbWxTdHJ1Y3RDb252ZXJ0ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGltZU9mRGF5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRpbWVPZkRheS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MmI3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRpbWVPZkRheS5qYXZhCkBAIC0wLDAgKzEsNDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiAKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBUaW1lIE9mIERheTwvYj48L2VtPicuCisgKiAgCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKiAKKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0SG91ciA8ZW0+SG91cjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRNaW51dGUgPGVtPk1pbnV0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRTZWNvbmQgPGVtPlNlY29uZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRNaWxsaXNlY29uZCA8ZW0+TWlsbGlzZWNvbmQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGltZU9mRGF5KCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbFRpbWVPZkRheSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG91cigpIDxlbT5Ib3VyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRIb3VyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgSE9VUl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb3VyKCkgPGVtPkhvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEhvdXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyIGhvdXIgPSBIT1VSX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZSgpIDxlbT5NaW51dGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1pbnV0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIE1JTlVURV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW51dGUoKSA8ZW0+TWludXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNaW51dGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyIG1pbnV0ZSA9IE1JTlVURV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWNvbmQoKSA8ZW0+U2Vjb25kPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTZWNvbmQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBTRUNPTkRfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vjb25kKCkgPGVtPlNlY29uZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2Vjb25kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSW50ZWdlciBzZWNvbmQgPSBTRUNPTkRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWlsbGlzZWNvbmQoKSA8ZW0+TWlsbGlzZWNvbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1pbGxpc2Vjb25kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgTUlMTElTRUNPTkRfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWlsbGlzZWNvbmQoKSA8ZW0+TWlsbGlzZWNvbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1pbGxpc2Vjb25kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgSW50ZWdlciBtaWxsaXNlY29uZCA9IE1JTExJU0VDT05EX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbFRpbWVPZkRheSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RJTUVfT0ZfREFZOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhvdXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhvdXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SG91cjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SG91cihJbnRlZ2VyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUaW1lT2ZEYXlfSG91cigpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXRIb3VyKCkKKwl7CisJCXJldHVybiBob3VyOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0SG91ciA8ZW0+SG91cjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SG91cjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SG91cigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEhvdXIoSW50ZWdlciBuZXdIb3VyKQorCXsKKwkJSW50ZWdlciBvbGRIb3VyID0gaG91cjsKKwkJaG91ciA9IG5ld0hvdXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX0hPVVIsIG9sZEhvdXIsIGhvdXIpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaW51dGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1pbnV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1pbnV0ZShJbnRlZ2VyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUaW1lT2ZEYXlfTWludXRlKCkKKwkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldE1pbnV0ZSgpCisJeworCQlyZXR1cm4gbWludXRlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0TWludXRlIDxlbT5NaW51dGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbnV0ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TWludXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWludXRlKEludGVnZXIgbmV3TWludXRlKQorCXsKKwkJSW50ZWdlciBvbGRNaW51dGUgPSBtaW51dGU7CisJCW1pbnV0ZSA9IG5ld01pbnV0ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fTUlOVVRFLCBvbGRNaW51dGUsIG1pbnV0ZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY29uZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2Vjb25kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY29uZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U2Vjb25kKEludGVnZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRpbWVPZkRheV9TZWNvbmQoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEludGVnZXIgZ2V0U2Vjb25kKCkKKwl7CisJCXJldHVybiBzZWNvbmQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRTZWNvbmQgPGVtPlNlY29uZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2Vjb25kPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTZWNvbmQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTZWNvbmQoSW50ZWdlciBuZXdTZWNvbmQpCisJeworCQlJbnRlZ2VyIG9sZFNlY29uZCA9IHNlY29uZDsKKwkJc2Vjb25kID0gbmV3U2Vjb25kOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19TRUNPTkQsIG9sZFNlY29uZCwgc2Vjb25kKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWlsbGlzZWNvbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1pbGxpc2Vjb25kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbGxpc2Vjb25kPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNaWxsaXNlY29uZChJbnRlZ2VyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUaW1lT2ZEYXlfTWlsbGlzZWNvbmQoKQorCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEludGVnZXIgZ2V0TWlsbGlzZWNvbmQoKQorCXsKKwkJcmV0dXJuIG1pbGxpc2Vjb25kOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0TWlsbGlzZWNvbmQgPGVtPk1pbGxpc2Vjb25kPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaWxsaXNlY29uZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TWlsbGlzZWNvbmQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNaWxsaXNlY29uZChJbnRlZ2VyIG5ld01pbGxpc2Vjb25kKQorCXsKKwkJSW50ZWdlciBvbGRNaWxsaXNlY29uZCA9IG1pbGxpc2Vjb25kOworCQltaWxsaXNlY29uZCA9IG5ld01pbGxpc2Vjb25kOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19NSUxMSVNFQ09ORCwgb2xkTWlsbGlzZWNvbmQsIG1pbGxpc2Vjb25kKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX0hPVVI6CisJCQkJcmV0dXJuIGdldEhvdXIoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fTUlOVVRFOgorCQkJCXJldHVybiBnZXRNaW51dGUoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fU0VDT05EOgorCQkJCXJldHVybiBnZXRTZWNvbmQoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQ6CisJCQkJcmV0dXJuIGdldE1pbGxpc2Vjb25kKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19IT1VSOgorCQkJCXNldEhvdXIoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fTUlOVVRFOgorCQkJCXNldE1pbnV0ZSgoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19TRUNPTkQ6CisJCQkJc2V0U2Vjb25kKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX01JTExJU0VDT05EOgorCQkJCXNldE1pbGxpc2Vjb25kKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX0hPVVI6CisJCQkJc2V0SG91cihIT1VSX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX01JTlVURToKKwkJCQlzZXRNaW51dGUoTUlOVVRFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX1NFQ09ORDoKKwkJCQlzZXRTZWNvbmQoU0VDT05EX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX01JTExJU0VDT05EOgorCQkJCXNldE1pbGxpc2Vjb25kKE1JTExJU0VDT05EX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19IT1VSOgorCQkJCXJldHVybiBIT1VSX0VERUZBVUxUID09IG51bGwgPyBob3VyICE9IG51bGwgOiAhSE9VUl9FREVGQVVMVC5lcXVhbHMoaG91cik7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX01JTlVURToKKwkJCQlyZXR1cm4gTUlOVVRFX0VERUZBVUxUID09IG51bGwgPyBtaW51dGUgIT0gbnVsbCA6ICFNSU5VVEVfRURFRkFVTFQuZXF1YWxzKG1pbnV0ZSk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX1NFQ09ORDoKKwkJCQlyZXR1cm4gU0VDT05EX0VERUZBVUxUID09IG51bGwgPyBzZWNvbmQgIT0gbnVsbCA6ICFTRUNPTkRfRURFRkFVTFQuZXF1YWxzKHNlY29uZCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX01JTExJU0VDT05EOgorCQkJCXJldHVybiBNSUxMSVNFQ09ORF9FREVGQVVMVCA9PSBudWxsID8gbWlsbGlzZWNvbmQgIT0gbnVsbCA6ICFNSUxMSVNFQ09ORF9FREVGQVVMVC5lcXVhbHMobWlsbGlzZWNvbmQpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChob3VyOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChob3VyKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtaW51dGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKG1pbnV0ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgc2Vjb25kOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChzZWNvbmQpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1pbGxpc2Vjb25kOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtaWxsaXNlY29uZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZEhvdXJUcmFuc2xhdG9yKCksCisJCQlidWlsZE1pbnV0ZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkU2Vjb25kVHJhbnNsYXRvcigpLAorCQkJYnVpbGRNaWxsaXNlY29uZFRyYW5zbGF0b3IoKSwKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSG91clRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWFBJUllfVElNRV9PRl9EQVlfX0hPVVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGltZU9mRGF5X0hvdXIoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWludXRlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYUElSWV9USU1FX09GX0RBWV9fTUlOVVRFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRpbWVPZkRheV9NaW51dGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2Vjb25kVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYUElSWV9USU1FX09GX0RBWV9fU0VDT05ELCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRpbWVPZkRheV9TZWNvbmQoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWlsbGlzZWNvbmRUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuRVhQSVJZX1RJTUVfT0ZfREFZX19NSUxMSVNFQ09ORCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUaW1lT2ZEYXlfTWlsbGlzZWNvbmQoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9CisJCit9IC8vIFhtbFRpbWVPZkRheQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2Zvcm1hdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2Zvcm1hdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMTU4OTAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRyYW5zZm9ybWF0aW9uLmphdmEKQEAgLTAsMCArMSwzNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVHJhbnNmb3JtYXRpb24gSW1wbDwvYj48L2VtPicuCisgKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuICoKKyAqCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRyYW5zZm9ybWF0aW9uKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFhtbFRyYW5zZm9ybWF0aW9uIGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZworeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbFRyYW5zZm9ybWF0aW9uKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfVFJBTlNGT1JNQVRJT047CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCisJeworCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7CisJCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQorCXsKKwkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKKwl7CisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCisJCXsKKwkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19QUk9QRVJUSUVTKTsKKwkJfQorCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFM6CisJCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFM6CisJCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFM6CisJCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19QUk9QRVJUSUVTOgorCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOworCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUzoKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX1BST1BFUlRJRVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorLy8JCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAorLy8JCQlidWlsZE9wdGlvbmFsVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCisvLwkJCWJ1aWxkTXV0YWJsZVRyYW5zbGF0b3IoKSwKKy8vCQkJYnVpbGRSZWFkVHJhbnNmb3JtZXJUcmFuc2xhdG9yKCksCisvLwkJCWJ1aWxkV3JpdGVUcmFuc2Zvcm1lclRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHJhbnNpZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRyYW5zaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDQ2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRyYW5zaWVudC5qYXZhCkBAIC0wLDAgKzEsMzQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFRyYW5zaWVudDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRyYW5zaWVudCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxUcmFuc2llbnQgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZworeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbFRyYW5zaWVudCgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RSQU5TSUVOVDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQorCXsKKwkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOworCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50I2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQorCXsKKwkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKKwl7CisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCisJCXsKKwkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fUFJPUEVSVElFUyk7CisJCX0KKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFM6CisJCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fUFJPUEVSVElFUzoKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fUFJPUEVSVElFUzoKKwkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFM6CisJCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX1BST1BFUlRJRVM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJZWxlbWVudE5hbWUsIAorCQkJc3RydWN0dXJhbEZlYXR1cmUsIAorCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKKwkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVHJhbnNpZW50KCksIAorCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQorCQkJKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCkKKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFR5cGVDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHlwZUNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ODdiNDEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFR5cGVDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDI5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFR5cGUgQ3VzdG9tQ29udmVydGVyPC9iPjwvZW0+Jy4KKyAqICAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqIAorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0RGF0YVR5cGUgPGVtPkRhdGEgVHlwZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0T2JqZWN0VHlwZSA8ZW0+T2JqZWN0IFR5cGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHlwZUNvbnZlcnRlcigpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxUeXBlQ29udmVydGVyIGV4dGVuZHMgWG1sTmFtZWRDb252ZXJ0ZXIKK3sKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YVR5cGUoKSA8ZW0+RGF0YSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREYXRhVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9UWVBFX0VERUZBVUxUID0gbnVsbDsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhVHlwZSgpIDxlbT5EYXRhIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERhdGFUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFUeXBlID0gREFUQV9UWVBFX0VERUZBVUxUOworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlKCkgPGVtPk9iamVjdCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPYmplY3RUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfVFlQRV9FREVGQVVMVCA9IG51bGw7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZSgpIDxlbT5PYmplY3QgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T2JqZWN0VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBvYmplY3RUeXBlID0gT0JKRUNUX1RZUEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sVHlwZUNvbnZlcnRlcigpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RZUEVfQ09OVkVSVEVSOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGEgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGEgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGF0YVR5cGUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUeXBlQ29udmVydGVyX0RhdGFUeXBlKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXREYXRhVHlwZSgpCisJeworCQlyZXR1cm4gZGF0YVR5cGU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0RGF0YVR5cGUgPGVtPkRhdGEgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXREYXRhVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERhdGFUeXBlKFN0cmluZyBuZXdEYXRhVHlwZSkKKwl7CisJCVN0cmluZyBvbGREYXRhVHlwZSA9IGRhdGFUeXBlOworCQlkYXRhVHlwZSA9IG5ld0RhdGFUeXBlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUsIG9sZERhdGFUeXBlLCBkYXRhVHlwZSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0T2JqZWN0VHlwZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpCisJeworCQlyZXR1cm4gb2JqZWN0VHlwZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlIDxlbT5PYmplY3QgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE9iamVjdFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBuZXdPYmplY3RUeXBlKQorCXsKKwkJU3RyaW5nIG9sZE9iamVjdFR5cGUgPSBvYmplY3RUeXBlOworCQlvYmplY3RUeXBlID0gbmV3T2JqZWN0VHlwZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUsIG9sZE9iamVjdFR5cGUsIG9iamVjdFR5cGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOgorCQkJCXJldHVybiBnZXREYXRhVHlwZSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRToKKwkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOgorCQkJCXNldERhdGFUeXBlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEU6CisJCQkJc2V0T2JqZWN0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRToKKwkJCQlzZXREYXRhVHlwZShEQVRBX1RZUEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEU6CisJCQkJc2V0T2JqZWN0VHlwZShPQkpFQ1RfVFlQRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOgorCQkJCXJldHVybiBEQVRBX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGRhdGFUeXBlICE9IG51bGwgOiAhREFUQV9UWVBFX0VERUZBVUxULmVxdWFscyhkYXRhVHlwZSk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOgorCQkJCXJldHVybiBPQkpFQ1RfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gb2JqZWN0VHlwZSAhPSBudWxsIDogIU9CSkVDVF9UWVBFX0VERUZBVUxULmVxdWFscyhvYmplY3RUeXBlKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGF0YVR5cGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGRhdGFUeXBlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBvYmplY3RUeXBlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChvYmplY3RUeXBlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCisJCQllbGVtZW50TmFtZSwKKwkJCXN0cnVjdHVyYWxGZWF0dXJlLAorCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKKwkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKKwkJKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkRGF0YVR5cGVUcmFuc2xhdG9yKCksCisJCQlidWlsZE9iamVjdFR5cGVUcmFuc2xhdG9yKCksCisJCX07CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERhdGFUeXBlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVHlwZUNvbnZlcnRlcl9EYXRhVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RUeXBlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUeXBlQ29udmVydGVyX09iamVjdFR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKKwl9Cit9IC8vIFhtbFR5cGVDb252ZXJ0ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmFyaWFibGVPbmVUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxWYXJpYWJsZU9uZVRvT25lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5ZGRkMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmFyaWFibGVPbmVUb09uZS5qYXZhCkBAIC0wLDAgKzEsMzU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFZhcmlhYmxlIE9uZSBUbyBPbmUgSW1wbDwvYj48L2VtPicuCisgKiAgCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqIAorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4yCisgKiAKKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmFyaWFibGVPbmVUb09uZSgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxWYXJpYWJsZU9uZVRvT25lIGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZworeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFhtbFZhcmlhYmxlT25lVG9PbmUoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCisJeworCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7CisJCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZSNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKKwl7CisJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCisJeworCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQorCQl7CisJCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QUk9QRVJUSUVTKTsKKwkJfQorCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6CisJCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QUk9QRVJUSUVTOgorCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOworCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKKwkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BST1BFUlRJRVM6CisJCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QUk9QRVJUSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVkFSSUFCTEVfT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxWZXJzaW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFZlcnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDc1Mzg0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxWZXJzaW9uLmphdmEKQEAgLTAsMCArMSw5MzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIAorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFZlcnNpb248L2I+PC9lbT4nLgorICogIAorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICogCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZlcnNpb24oKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgWG1sVmVyc2lvbiBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uIGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sTXV0YWJsZSwgWG1sQ29udmVydGlibGVNYXBwaW5nCit7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXV0YWJsZSgpIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNdXRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gTVVUQUJMRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNdXRhYmxlKCkgPGVtPk11dGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE11dGFibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCb29sZWFuIG11dGFibGUgPSBNVVRBQkxFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVyKCkgPGVtPkNvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sQ29udmVydGVyIGNvbnZlcnRlcjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXIoKSA8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxUeXBlQ29udmVydGVyIHR5cGVDb252ZXJ0ZXI7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlcjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdENvbnZlcnRlcigpIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYbWxTdHJ1Y3RDb252ZXJ0ZXIgc3RydWN0Q29udmVydGVyOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnQoKSA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29udmVydCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0KCkgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbnZlcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgY29udmVydCA9IENPTlZFUlRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWG1sVmVyc2lvbigpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1ZFUlNJT047CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXV0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNdXRhYmxlKEJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE11dGFibGVfTXV0YWJsZSgpCisJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJvb2xlYW4gZ2V0TXV0YWJsZSgpCisJeworCQlyZXR1cm4gbXV0YWJsZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiNnZXRNdXRhYmxlIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNdXRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TXV0YWJsZShCb29sZWFuIG5ld011dGFibGUpCisJeworCQlCb29sZWFuIG9sZE11dGFibGUgPSBtdXRhYmxlOworCQltdXRhYmxlID0gbmV3TXV0YWJsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19NVVRBQkxFLCBvbGRNdXRhYmxlLCBtdXRhYmxlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRDb252ZXJ0KFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnQoKQorCXsKKwkJcmV0dXJuIGNvbnZlcnQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0Q29udmVydCA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Q29udmVydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbnZlcnQoU3RyaW5nIG5ld0NvbnZlcnQpCisJeworCQlTdHJpbmcgb2xkQ29udmVydCA9IGNvbnZlcnQ7CisJCWNvbnZlcnQgPSBuZXdDb252ZXJ0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlQsIG9sZENvbnZlcnQsIGNvbnZlcnQpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQorCXsKKwkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOworCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCisJeworCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQorCXsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKKwkJeworCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fUFJPUEVSVElFUyk7CisJCX0KKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBYbWxDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkKKwl7CisJCXJldHVybiBjb252ZXJ0ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udmVydGVyKFhtbENvbnZlcnRlciBuZXdDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlYbWxDb252ZXJ0ZXIgb2xkQ29udmVydGVyID0gY29udmVydGVyOworCQljb252ZXJ0ZXIgPSBuZXdDb252ZXJ0ZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVEVSLCBvbGRDb252ZXJ0ZXIsIG5ld0NvbnZlcnRlcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0Q29udmVydGVyIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Q29udmVydGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFhtbENvbnZlcnRlciBuZXdDb252ZXJ0ZXIpCisJeworCQlpZiAobmV3Q29udmVydGVyICE9IGNvbnZlcnRlcikKKwkJeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoY29udmVydGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJURVIsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Q29udmVydGVyKG5ld0NvbnZlcnRlciwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlRFUiwgbmV3Q29udmVydGVyLCBuZXdDb252ZXJ0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX1R5cGVDb252ZXJ0ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpCisJeworCQlyZXR1cm4gdHlwZUNvbnZlcnRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgbmV3VHlwZUNvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbFR5cGVDb252ZXJ0ZXIgb2xkVHlwZUNvbnZlcnRlciA9IHR5cGVDb252ZXJ0ZXI7CisJCXR5cGVDb252ZXJ0ZXIgPSBuZXdUeXBlQ29udmVydGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RZUEVfQ09OVkVSVEVSLCBvbGRUeXBlQ29udmVydGVyLCBuZXdUeXBlQ29udmVydGVyKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiNnZXRUeXBlQ29udmVydGVyIDxlbT5UeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgbmV3VHlwZUNvbnZlcnRlcikKKwl7CisJCWlmIChuZXdUeXBlQ29udmVydGVyICE9IHR5cGVDb252ZXJ0ZXIpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKHR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdHlwZUNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1R5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VHlwZUNvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0VHlwZUNvbnZlcnRlcihuZXdUeXBlQ29udmVydGVyLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVIsIG5ld1R5cGVDb252ZXJ0ZXIsIG5ld1R5cGVDb252ZXJ0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIEN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCisJeworCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgbmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgb2xkT2JqZWN0VHlwZUNvbnZlcnRlciA9IG9iamVjdFR5cGVDb252ZXJ0ZXI7CisJCW9iamVjdFR5cGVDb252ZXJ0ZXIgPSBuZXdPYmplY3RUeXBlQ29udmVydGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgb2xkT2JqZWN0VHlwZUNvbnZlcnRlciwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0T2JqZWN0VHlwZUNvbnZlcnRlciA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikKKwl7CisJCWlmIChuZXdPYmplY3RUeXBlQ29udmVydGVyICE9IG9iamVjdFR5cGVDb252ZXJ0ZXIpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpb2JqZWN0VHlwZUNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdPYmplY3RUeXBlQ29udmVydGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld09iamVjdFR5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhtbFN0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQorCXsKKwkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIG5ld1N0cnVjdENvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVhtbFN0cnVjdENvbnZlcnRlciBvbGRTdHJ1Y3RDb252ZXJ0ZXIgPSBzdHJ1Y3RDb252ZXJ0ZXI7CisJCXN0cnVjdENvbnZlcnRlciA9IG5ld1N0cnVjdENvbnZlcnRlcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQl7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSLCBvbGRTdHJ1Y3RDb252ZXJ0ZXIsIG5ld1N0cnVjdENvbnZlcnRlcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0U3RydWN0Q29udmVydGVyIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIG5ld1N0cnVjdENvbnZlcnRlcikKKwl7CisJCWlmIChuZXdTdHJ1Y3RDb252ZXJ0ZXIgIT0gc3RydWN0Q29udmVydGVyKQorCQl7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChzdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc3RydWN0Q29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdTdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U3RydWN0Q29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihuZXdTdHJ1Y3RDb252ZXJ0ZXIsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIsIG5ld1N0cnVjdENvbnZlcnRlcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTOgorCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRDb252ZXJ0ZXIobnVsbCwgbXNncyk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVI6CisJCQkJcmV0dXJuIGJhc2ljU2V0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6CisJCQkJcmV0dXJuIGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSOgorCQkJCXJldHVybiBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFM6CisJCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTVVUQUJMRToKKwkJCQlyZXR1cm4gZ2V0TXV0YWJsZSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gZ2V0Q29udmVydGVyKCk7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVI6CisJCQkJcmV0dXJuIGdldFR5cGVDb252ZXJ0ZXIoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6CisJCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSOgorCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJUOgorCQkJCXJldHVybiBnZXRDb252ZXJ0KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19QUk9QRVJUSUVTOgorCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOworCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX01VVEFCTEU6CisJCQkJc2V0TXV0YWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlRFUjoKKwkJCQlzZXRDb252ZXJ0ZXIoKFhtbENvbnZlcnRlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RZUEVfQ09OVkVSVEVSOgorCQkJCXNldFR5cGVDb252ZXJ0ZXIoKFhtbFR5cGVDb252ZXJ0ZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6CisJCQkJc2V0T2JqZWN0VHlwZUNvbnZlcnRlcigoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1NUUlVDVF9DT05WRVJURVI6CisJCQkJc2V0U3RydWN0Q29udmVydGVyKChYbWxTdHJ1Y3RDb252ZXJ0ZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJUOgorCQkJCXNldENvbnZlcnQoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTOgorCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX01VVEFCTEU6CisJCQkJc2V0TXV0YWJsZShNVVRBQkxFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVEVSOgorCQkJCXNldENvbnZlcnRlcigoWG1sQ29udmVydGVyKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUjoKKwkJCQlzZXRUeXBlQ29udmVydGVyKChYbWxUeXBlQ29udmVydGVyKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6CisJCQkJc2V0T2JqZWN0VHlwZUNvbnZlcnRlcigoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fU1RSVUNUX0NPTlZFUlRFUjoKKwkJCQlzZXRTdHJ1Y3RDb252ZXJ0ZXIoKFhtbFN0cnVjdENvbnZlcnRlciludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVDoKKwkJCQlzZXRDb252ZXJ0KENPTlZFUlRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFM6CisJCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX01VVEFCTEU6CisJCQkJcmV0dXJuIE1VVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IG11dGFibGUgIT0gbnVsbCA6ICFNVVRBQkxFX0VERUZBVUxULmVxdWFscyhtdXRhYmxlKTsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJURVI6CisJCQkJcmV0dXJuIGNvbnZlcnRlciAhPSBudWxsOworCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RZUEVfQ09OVkVSVEVSOgorCQkJCXJldHVybiB0eXBlQ29udmVydGVyICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgorCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fU1RSVUNUX0NPTlZFUlRFUjoKKwkJCQlyZXR1cm4gc3RydWN0Q29udmVydGVyICE9IG51bGw7CisJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVDoKKwkJCQlyZXR1cm4gQ09OVkVSVF9FREVGQVVMVCA9PSBudWxsID8gY29udmVydCAhPSBudWxsIDogIUNPTlZFUlRfRURFRkFVTFQuZXF1YWxzKGNvbnZlcnQpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQorCXsKKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCisJCQl7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sTXV0YWJsZS5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19NVVRBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVVRBQkxFX19NVVRBQkxFOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckhvbGRlci5jbGFzcykKKwkJeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX1RZUEVfQ09OVkVSVEVSOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fQ09OVkVSVDsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCisJeworCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFM7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19QUk9QRVJUSUVTOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCisJCXsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKKwkJCXsKKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNdXRhYmxlLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VVEFCTEVfX01VVEFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX01VVEFCTEU7CisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVySG9sZGVyLmNsYXNzKQorCQl7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCisJCQl7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVEVSOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVI7CisJCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcykKKwkJeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQorCQkJeworCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJUOworCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobXV0YWJsZTogIik7CisJCXJlc3VsdC5hcHBlbmQobXV0YWJsZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgY29udmVydDogIik7CisJCXJlc3VsdC5hcHBlbmQoY29udmVydCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwlwdWJsaWMgVGV4dFJhbmdlIGdldE11dGFibGVUZXh0UmFuZ2UoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuTVVUQUJMRSk7CisJfQorCQorCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydFRleHRSYW5nZSgpIHsKKwkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuQ09OVkVSVCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAorCQkJZWxlbWVudE5hbWUsIAorCQkJc3RydWN0dXJhbEZlYXR1cmUsIAorCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxWZXJzaW9uKCksIAorCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAorCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCisJCQlidWlsZE11dGFibGVUcmFuc2xhdG9yKCksCisJCQlidWlsZENvbHVtblRyYW5zbGF0b3IoKSwgCisJCQlidWlsZFRlbXBvcmFsVHJhbnNsYXRvcigpLAorCQkJYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpLAorCQkJYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCisJCQlidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCisJCQlidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCisJCQlidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSwKKwkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCisJCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTXV0YWJsZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5NVVRBQkxFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE11dGFibGVfTXV0YWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFhtbFN0cnVjdENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7CisJCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0VjbGlwc2VMaW5rMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvRWNsaXBzZUxpbmsxXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjE5NWRjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0VjbGlwc2VMaW5rMV8xLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGluazFfMQorCWV4dGVuZHMgRWNsaXBzZUxpbmsKK3sKKwlTdHJpbmcgU0NIRU1BX05BTUVTUEFDRSA9IEVjbGlwc2VMaW5rLlNDSEVNQV9OQU1FU1BBQ0U7CisJU3RyaW5nIFNDSEVNQV9MT0NBVElPTiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzFfMS54c2QiOworCVN0cmluZyBTQ0hFTUFfVkVSU0lPTgk9ICIxLjEiOworCQorCS8vIEVjbGlwc2VMaW5rIDEuMSBzcGVjaWZpYyBub2RlcworCQorCVN0cmluZyBQUklNQVJZX0tFWSA9ICJwcmltYXJ5LWtleSI7ICAvLyROT04tTkxTLTEkCisJU3RyaW5nIFBSSU1BUllfS0VZX19WQUxJREFUSU9OID0gInZhbGlkYXRpb24iOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBQUklNQVJZX0tFWV9fQ09MVU1OID0gImNvbHVtbiI7ICAvLyROT04tTkxTLTEkCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0VjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWJhYTJhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0VjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5SW1wbAoreworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5IGVJTlNUQU5DRSA9IGluaXQoKTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkgaW5pdCgpCisJeworCQl0cnkKKwkJeworCQkJRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSB0aGVFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5ID0gKEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImpwdC5lY2xpcHNlbGluay5vcm0udjFfMS54bWkiKTsgCisJCQlpZiAodGhlRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSAhPSBudWxsKQorCQkJeworCQkJCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQorCQl7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5KCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCisJeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKKwkJeworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCisJeworCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLklEX1ZBTElEQVRJT05fVFlQRV8xMToKKwkJCQlyZXR1cm4gY3JlYXRlSWRWYWxpZGF0aW9uVHlwZV8xXzFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQorCXsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5JRF9WQUxJREFUSU9OX1RZUEVfMTE6CisJCQkJcmV0dXJuIGNvbnZlcnRJZFZhbGlkYXRpb25UeXBlXzFfMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSWRWYWxpZGF0aW9uVHlwZV8xXzEgY3JlYXRlSWRWYWxpZGF0aW9uVHlwZV8xXzFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCisJeworCQlJZFZhbGlkYXRpb25UeXBlXzFfMSByZXN1bHQgPSBJZFZhbGlkYXRpb25UeXBlXzFfMS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0SWRWYWxpZGF0aW9uVHlwZV8xXzFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKKwl7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIGdldEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UoKQorCXsKKwkJcmV0dXJuIChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKWdldEVQYWNrYWdlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlARGVwcmVjYXRlZAorCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSBnZXRQYWNrYWdlKCkKKwl7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRTsKKwl9CisKK30gLy9FY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0VjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTNkOWRlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0VjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuamF2YQpAQCAtMCwwICsxLDY4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkKKyAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlSW1wbAoreworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5BTUUgPSAidjFfMSI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19VUkkgPSAianB0LmVjbGlwc2VsaW5rLm9ybS52MV8xLnhtaSI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xIjsKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuaW5pdCgpOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEgPGVtPlhtbCBCYXNpYyAxMTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEJhc2ljXzFfMQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxCYXNpY18xXzEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfMTEgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDXzExX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19TRVFVRU5DRV9HRU5FUkFUT1I7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfMTFfX1RBQkxFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18xMV9fR0VORVJBVEVEX1ZBTFVFID0gT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmFzaWMgMTE8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfMTFfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEVudGl0eV8xXzEgPGVtPlhtbCBFbnRpdHkgMTE8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbEVudGl0eV8xXzEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzExID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8xMV9fUFJJTUFSWV9LRVkgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgMTE8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzExX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDExPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTEgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTFfX1BSSU1BUllfS0VZID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMTE8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTFfRkVBVFVSRV9DT1VOVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xIDxlbT5YbWwgUHJpbWFyeSBLZXkgMTE8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzFfMSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV8xMSA9IDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZXzExX19WQUxJREFUSU9OID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV8xMV9fQ09MVU1OUyA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFByaW1hcnkgS2V5IDExPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZXzExX0ZFQVRVUkVfQ09VTlQgPSAyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMSA8ZW0+SWQgVmFsaWRhdGlvbiBUeXBlIDExPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRJZFZhbGlkYXRpb25UeXBlXzFfMSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1ZBTElEQVRJT05fVFlQRV8xMSA9IDQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxCYXNpY18xXzFFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sRW50aXR5XzFfMUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxNYXBwZWRTdXBlcmNsYXNzXzFfMUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxQcmltYXJ5S2V5XzFfMUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVFbnVtIGlkVmFsaWRhdGlvblR5cGVfMV8xRUVudW0gPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNlTlNfVVJJCisJICogQHNlZSAjaW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSgpCisJeworCQlzdXBlcihlTlNfVVJJLCBFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5LmVJTlNUQU5DRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgorCSAqIAorCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZU5TX1VSSQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSBpbml0KCkKKwl7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQorCQlFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCisJCUVjbGlwc2VMaW5rT3JtUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFKTsKKworCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cworCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAorCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmZyZWV6ZSgpOworCisgIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZU5TX1VSSSwgdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSk7CisJCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sQmFzaWNfMV8xIDxlbT5YbWwgQmFzaWMgMTE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEJhc2ljIDExPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sQmFzaWNfMV8xCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQmFzaWNfMV8xKCkKKwl7CisJCXJldHVybiB4bWxCYXNpY18xXzFFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEJhc2ljXzFfMSNnZXRHZW5lcmF0ZWRWYWx1ZSgpCisJICogQHNlZSAjZ2V0WG1sQmFzaWNfMV8xKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQmFzaWNfMV8xX0dlbmVyYXRlZFZhbHVlKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxCYXNpY18xXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xIDxlbT5YbWwgRW50aXR5IDExPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgMTE8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW50aXR5XzFfMSgpCisJeworCQlyZXR1cm4geG1sRW50aXR5XzFfMUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEVudGl0eV8xXzEjZ2V0UHJpbWFyeUtleSA8ZW0+UHJpbWFyeSBLZXk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QcmltYXJ5IEtleTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEVudGl0eV8xXzEjZ2V0UHJpbWFyeUtleSgpCisJICogQHNlZSAjZ2V0WG1sRW50aXR5XzFfMSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV8xXzFfUHJpbWFyeUtleSgpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5XzFfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMTE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDExPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSgpCisJeworCQlyZXR1cm4geG1sTWFwcGVkU3VwZXJjbGFzc18xXzFFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSNnZXRQcmltYXJ5S2V5IDxlbT5QcmltYXJ5IEtleTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEjZ2V0UHJpbWFyeUtleSgpCisJICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMV9QcmltYXJ5S2V5KCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzXzFfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xIDxlbT5YbWwgUHJpbWFyeSBLZXkgMTE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFByaW1hcnkgS2V5IDExPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxQcmltYXJ5S2V5XzFfMSgpCisJeworCQlyZXR1cm4geG1sUHJpbWFyeUtleV8xXzFFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSNnZXRWYWxpZGF0aW9uIDxlbT5WYWxpZGF0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsaWRhdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xI2dldFZhbGlkYXRpb24oKQorCSAqIEBzZWUgI2dldFhtbFByaW1hcnlLZXlfMV8xKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUHJpbWFyeUtleV8xXzFfVmFsaWRhdGlvbigpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUHJpbWFyeUtleV8xXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEjZ2V0Q29sdW1ucyA8ZW0+Q29sdW1uczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29sdW1uczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xI2dldENvbHVtbnMoKQorCSAqIEBzZWUgI2dldFhtbFByaW1hcnlLZXlfMV8xKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUHJpbWFyeUtleV8xXzFfQ29sdW1ucygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUHJpbWFyeUtleV8xXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xIDxlbT5JZCBWYWxpZGF0aW9uIFR5cGUgMTE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5JZCBWYWxpZGF0aW9uIFR5cGUgMTE8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0SWRWYWxpZGF0aW9uVHlwZV8xXzEoKQorCXsKKwkJcmV0dXJuIGlkVmFsaWRhdGlvblR5cGVfMV8xRUVudW07CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkgZ2V0RWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSgpCisJeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCXsKKwkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOworCQlpc0NyZWF0ZWQgPSB0cnVlOworCisJCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworCQl4bWxCYXNpY18xXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0JBU0lDXzExKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh4bWxCYXNpY18xXzFFQ2xhc3MsIFhNTF9CQVNJQ18xMV9fR0VORVJBVEVEX1ZBTFVFKTsKKworCQl4bWxFbnRpdHlfMV8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTlRJVFlfMTEpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eV8xXzFFQ2xhc3MsIFhNTF9FTlRJVFlfMTFfX1BSSU1BUllfS0VZKTsKKworCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzFfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTEpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTFfX1BSSU1BUllfS0VZKTsKKworCQl4bWxQcmltYXJ5S2V5XzFfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUFJJTUFSWV9LRVlfMTEpOworCQljcmVhdGVFQXR0cmlidXRlKHhtbFByaW1hcnlLZXlfMV8xRUNsYXNzLCBYTUxfUFJJTUFSWV9LRVlfMTFfX1ZBTElEQVRJT04pOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbFByaW1hcnlLZXlfMV8xRUNsYXNzLCBYTUxfUFJJTUFSWV9LRVlfMTFfX0NPTFVNTlMpOworCisJCS8vIENyZWF0ZSBlbnVtcworCQlpZFZhbGlkYXRpb25UeXBlXzFfMUVFbnVtID0gY3JlYXRlRUVudW0oSURfVkFMSURBVElPTl9UWVBFXzExKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOworCisJLyoqCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKKwkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCXsKKwkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKKwkJaXNJbml0aWFsaXplZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCisJCXNldE5hbWUoZU5BTUUpOworCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKKwkJc2V0TnNVUkkoZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcworCQlPcm1QYWNrYWdlIHRoZU9ybVBhY2thZ2UgPSAoT3JtUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1QYWNrYWdlLmVOU19VUkkpOworCQlFY2xpcHNlTGlua09ybVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycworCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycworCisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJeG1sQmFzaWNfMV8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyKCkpOworCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCWluaXRFQ2xhc3MoeG1sQmFzaWNfMV8xRUNsYXNzLCBYbWxCYXNpY18xXzEuY2xhc3MsICJYbWxCYXNpY18xXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRYbWxCYXNpY18xXzFfR2VuZXJhdGVkVmFsdWUoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxHZW5lcmF0ZWRWYWx1ZSgpLCBudWxsLCAiZ2VuZXJhdGVkVmFsdWUiLCBudWxsLCAwLCAxLCBYbWxCYXNpY18xXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyh4bWxFbnRpdHlfMV8xRUNsYXNzLCBYbWxFbnRpdHlfMV8xLmNsYXNzLCAiWG1sRW50aXR5XzFfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV8xXzFfUHJpbWFyeUtleSgpLCB0aGlzLmdldFhtbFByaW1hcnlLZXlfMV8xKCksIG51bGwsICJwcmltYXJ5S2V5IiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5XzFfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xRUNsYXNzLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMS5jbGFzcywgIlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzFfUHJpbWFyeUtleSgpLCB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sUHJpbWFyeUtleSgpLCBudWxsLCAicHJpbWFyeUtleSIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sUHJpbWFyeUtleV8xXzFFQ2xhc3MsIFhtbFByaW1hcnlLZXlfMV8xLmNsYXNzLCAiWG1sUHJpbWFyeUtleV8xXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQcmltYXJ5S2V5XzFfMV9WYWxpZGF0aW9uKCksIHRoaXMuZ2V0SWRWYWxpZGF0aW9uVHlwZV8xXzEoKSwgInZhbGlkYXRpb24iLCBudWxsLCAwLCAxLCBYbWxQcmltYXJ5S2V5XzFfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUHJpbWFyeUtleV8xXzFfQ29sdW1ucygpLCB0aGVPcm1QYWNrYWdlLmdldFhtbENvbHVtbigpLCBudWxsLCAiY29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxQcmltYXJ5S2V5XzFfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscworCQlpbml0RUVudW0oaWRWYWxpZGF0aW9uVHlwZV8xXzFFRW51bSwgSWRWYWxpZGF0aW9uVHlwZV8xXzEuY2xhc3MsICJJZFZhbGlkYXRpb25UeXBlXzFfMSIpOworCQlhZGRFRW51bUxpdGVyYWwoaWRWYWxpZGF0aW9uVHlwZV8xXzFFRW51bSwgSWRWYWxpZGF0aW9uVHlwZV8xXzEuTlVMTCk7CisJCWFkZEVFbnVtTGl0ZXJhbChpZFZhbGlkYXRpb25UeXBlXzFfMUVFbnVtLCBJZFZhbGlkYXRpb25UeXBlXzFfMS5aRVJPKTsKKwkJYWRkRUVudW1MaXRlcmFsKGlkVmFsaWRhdGlvblR5cGVfMV8xRUVudW0sIElkVmFsaWRhdGlvblR5cGVfMV8xLk5PTkUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKKwl7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sQmFzaWNfMV8xIDxlbT5YbWwgQmFzaWMgMTE8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbEJhc2ljXzFfMSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVNJQ18xMSA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY18xXzEoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0JBU0lDXzExX19HRU5FUkFURURfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfMV8xX0dlbmVyYXRlZFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xIDxlbT5YbWwgRW50aXR5IDExPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sRW50aXR5XzFfMQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sRW50aXR5XzFfMSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTlRJVFlfMTEgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzFfMSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfMTFfX1BSSU1BUllfS0VZID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8xXzFfUHJpbWFyeUtleSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAxMTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQVBQRURfU1VQRVJDTEFTU18xMSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU18xMV9fUFJJTUFSWV9LRVkgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzFfUHJpbWFyeUtleSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEgPGVtPlhtbCBQcmltYXJ5IEtleSAxMTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzFfMSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QUklNQVJZX0tFWV8xMSA9IGVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5XzFfMSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BSSU1BUllfS0VZXzExX19WQUxJREFUSU9OID0gZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlfMV8xX1ZhbGlkYXRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1BSSU1BUllfS0VZXzExX19DT0xVTU5TID0gZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlfMV8xX0NvbHVtbnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xIDxlbT5JZCBWYWxpZGF0aW9uIFR5cGUgMTE8L2VtPn0nIGVudW0uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRJZFZhbGlkYXRpb25UeXBlXzFfMSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gSURfVkFMSURBVElPTl9UWVBFXzExID0gZUlOU1RBTkNFLmdldElkVmFsaWRhdGlvblR5cGVfMV8xKCk7CisKKwl9CisKK30gLy9FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvSWRWYWxpZGF0aW9uVHlwZV8xXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9JZFZhbGlkYXRpb25UeXBlXzFfMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMmY5MWEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvSWRWYWxpZGF0aW9uVHlwZV8xXzEuamF2YQpAQCAtMCwwICsxLDI1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5JZCBWYWxpZGF0aW9uIFR5cGUgMTE8L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRJZFZhbGlkYXRpb25UeXBlXzFfMSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gSWRWYWxpZGF0aW9uVHlwZV8xXzEgaW1wbGVtZW50cyBFbnVtZXJhdG9yCit7CisJLyoqCisJICogVGhlICc8ZW0+PGI+TlVMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOVUxMX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTlVMTCgwLCAiTlVMTCIsICJOVUxMIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5aRVJPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1pFUk9fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlaRVJPKDIsICJaRVJPIiwgIlpFUk8iKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTk9ORV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU5PTkUoMiwgIk5PTkUiLCAiTk9ORSIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+TlVMTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TlVMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOVUxMCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVMTF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5aRVJPPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5aRVJPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1pFUk8KKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBaRVJPX1ZBTFVFID0gMjsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTk9ORQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkVfVkFMVUUgPSAyOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSWRWYWxpZGF0aW9uVHlwZV8xXzFbXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgSWRWYWxpZGF0aW9uVHlwZV8xXzFbXQorCQl7CisJCQlOVUxMLAorCQkJWkVSTywKKwkJCU5PTkUsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+SWQgVmFsaWRhdGlvbiBUeXBlIDExPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8SWRWYWxpZGF0aW9uVHlwZV8xXzE+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SWQgVmFsaWRhdGlvbiBUeXBlIDExPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSWRWYWxpZGF0aW9uVHlwZV8xXzEgZ2V0KFN0cmluZyBsaXRlcmFsKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCisJCXsKKwkJCUlkVmFsaWRhdGlvblR5cGVfMV8xIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCisJCQl7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElkVmFsaWRhdGlvblR5cGVfMV8xIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKKwl7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQorCQl7CisJCQlJZFZhbGlkYXRpb25UeXBlXzFfMSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCisJCQl7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElkVmFsaWRhdGlvblR5cGVfMV8xIGdldChpbnQgdmFsdWUpCisJeworCQlzd2l0Y2ggKHZhbHVlKQorCQl7CisJCQljYXNlIE5VTExfVkFMVUU6IHJldHVybiBOVUxMOworCQkJY2FzZSBaRVJPX1ZBTFVFOiByZXR1cm4gWkVSTzsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgSWRWYWxpZGF0aW9uVHlwZV8xXzEoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCisJeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpCisJeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCisJeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKKwl7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL0lkVmFsaWRhdGlvblR5cGVfMV8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sQmFzaWNfMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sQmFzaWNfMV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2NTBiZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9YbWxCYXNpY18xXzEuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3JDb250YWluZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBCYXNpYyAxMTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxCYXNpY18xXzEoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbEJhc2ljXzFfMSBleHRlbmRzIFhtbEdlbmVyYXRvckNvbnRhaW5lcgoreworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0R2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbEJhc2ljXzFfMV9HZW5lcmF0ZWRWYWx1ZSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxHZW5lcmF0ZWRWYWx1ZSBnZXRHZW5lcmF0ZWRWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sQmFzaWNfMV8xI2dldEdlbmVyYXRlZFZhbHVlIDxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0R2VuZXJhdGVkVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlIHZhbHVlKTsKKworfSAvLyBYbWxCYXNpY18xXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9YbWxFbnRpdHlfMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sRW50aXR5XzFfMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMzVmOGIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sRW50aXR5XzFfMS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVudGl0eSAxMTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbEVudGl0eV8xXzEoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbEVudGl0eV8xXzEgZXh0ZW5kcyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRQcmltYXJ5S2V5KFhtbFByaW1hcnlLZXlfMV8xKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxFbnRpdHlfMV8xX1ByaW1hcnlLZXkoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJWG1sUHJpbWFyeUtleV8xXzEgZ2V0UHJpbWFyeUtleSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sRW50aXR5XzFfMSNnZXRQcmltYXJ5S2V5IDxlbT5QcmltYXJ5IEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFByaW1hcnlLZXkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleV8xXzEgdmFsdWUpOworCit9IC8vIFhtbEVudGl0eV8xXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbE1hcHBlZFN1cGVyY2xhc3NfMV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlMzZhZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDExPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzFfUHJpbWFyeUtleSgpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlYbWxQcmltYXJ5S2V5IGdldFByaW1hcnlLZXkoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UHJpbWFyeUtleSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UHJpbWFyeUtleShYbWxQcmltYXJ5S2V5IHZhbHVlKTsKKworfSAvLyBYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbFByaW1hcnlLZXlfMV8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sUHJpbWFyeUtleV8xXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjE3NDU4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbFByaW1hcnlLZXlfMV8xLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUHJpbWFyeSBLZXkgMTE8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEjZ2V0VmFsaWRhdGlvbiA8ZW0+VmFsaWRhdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEjZ2V0Q29sdW1ucyA8ZW0+Q29sdW1uczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzFfMSgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZXh0ZW5kcyBKcGFFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sUHJpbWFyeUtleV8xXzEgZXh0ZW5kcyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbGlkYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMQorCSAqIEBzZWUgI3NldFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uVHlwZV8xXzEpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMV8xX1ZhbGlkYXRpb24oKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJZFZhbGlkYXRpb25UeXBlXzFfMSBnZXRWYWxpZGF0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSNnZXRWYWxpZGF0aW9uIDxlbT5WYWxpZGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xCisJICogQHNlZSAjZ2V0VmFsaWRhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VmFsaWRhdGlvbihJZFZhbGlkYXRpb25UeXBlXzFfMSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleV8xXzFfQ29sdW1ucygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxYbWxDb2x1bW4+IGdldENvbHVtbnMoKTsKKworfSAvLyBYbWxQcmltYXJ5S2V5XzFfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL0VjbGlwc2VMaW5rMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvRWNsaXBzZUxpbmsyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDc2ZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL0VjbGlwc2VMaW5rMl8wLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmsyXzAKKwlleHRlbmRzIEVjbGlwc2VMaW5rMV8xLCBKUEEyXzAKK3sKKwlTdHJpbmcgU0NIRU1BX05BTUVTUEFDRSA9IEVjbGlwc2VMaW5rLlNDSEVNQV9OQU1FU1BBQ0U7CisJU3RyaW5nIFNDSEVNQV9MT0NBVElPTiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QiOworCVN0cmluZyBTQ0hFTUFfVkVSU0lPTgk9ICIyLjAiOworCQorCS8vIEVjbGlwc2VMaW5rIDIuMCBzcGVjaWZpYyBub2RlcworCQorCVN0cmluZyBNQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFID0gIm1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL0VjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9FY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzNzM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9FY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeUltcGwKK3sKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSBlSU5TVEFOQ0UgPSBpbml0KCk7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5IGluaXQoKQorCXsKKwkJdHJ5CisJCXsKKwkJCUVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkgdGhlRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSA9IChFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqcHQuZWNsaXBzZWxpbmsub3JtLnYyXzAueG1pIik7IAorCQkJaWYgKHRoZUVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkgIT0gbnVsbCkKKwkJCXsKKwkJCQlyZXR1cm4gdGhlRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKKwkJeworCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5KCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKQorCXsKKwkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCisJCXsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQorCXsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCisJCXsKKwkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5PUkRFUl9DT0xVTU5fVkFMSURBVElPTl9NT0RFX1RZUEVfMjA6CisJCQkJcmV0dXJuIGNyZWF0ZU9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCisJeworCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKKwkJeworCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLk9SREVSX0NPTFVNTl9WQUxJREFUSU9OX01PREVfVFlQRV8yMDoKKwkJCQlyZXR1cm4gY29udmVydE9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wIGNyZWF0ZU9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKKwl7CisJCU9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMCByZXN1bHQgPSBPcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzAuZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydE9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQorCXsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgZ2V0RWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSgpCisJeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIGdldFBhY2thZ2UoKQorCXsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFOworCX0KKworfSAvL0VjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OGExZmUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsOTkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkKKyAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlSW1wbAoreworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5BTUUgPSAidjJfMCI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19VUkkgPSAianB0LmVjbGlwc2VsaW5rLm9ybS52Ml8wLnhtaSI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wIjsKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuaW5pdCgpOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAgPGVtPlhtbCBDb2xsZWN0aW9uIE1hcHBpbmcgMjA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMCA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0NPTlZFUlQgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29sbGVjdGlvbiBNYXBwaW5nIDIwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9GRUFUVVJFX0NPVU5UID0gMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjAgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQUNDRVNTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX05BTUUgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19BQ0NFU1NfTUVUSE9EUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTU19NRVRIT0RTOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fUFJPUEVSVElFUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX1BST1BFUlRJRVM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19MT0IgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19URU1QT1JBTCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fRU5VTUVSQVRFRCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19DT05WRVJURVIgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19UWVBFX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19PQkpFQ1RfVFlQRV9DT05WRVJURVIgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX1NUUlVDVF9DT05WRVJURVIgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0NPTlZFUlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQ09OVkVSVEVSUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX1RZUEVfQ09OVkVSVEVSUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fU1RSVUNUX0NPTlZFUlRFUlMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfQ09OVkVSVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE0OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCA8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMCA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX19DT05WRVJURVIgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMF9fVFlQRV9DT05WRVJURVIgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX1RZUEVfQ09OVkVSVEVSOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMF9fU1RSVUNUX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfQ09OVkVSVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFueSBUbyBNYW55IDIwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMF9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIwPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjAgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIwX19DQUNIRUFCTEUgPSBPcm1WMl8wUGFja2FnZS5YTUxfQ0FDSEVBQkxFMl8wX19DQUNIRUFCTEU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIwX0ZFQVRVUkVfQ09VTlQgPSBPcm1WMl8wUGFja2FnZS5YTUxfQ0FDSEVBQkxFMl8wX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wIDxlbT5YbWwgT25lIFRvIE1hbnkgMjA8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjAgPSA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX19DT05WRVJURVIgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX19UWVBFX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fVFlQRV9DT05WRVJURVI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjBfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fU1RSVUNUX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9DT05WRVJUID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9uZSBUbyBNYW55IDIwPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCA8ZW0+WG1sIE9yZGVyIENvbHVtbiAyMDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OXzIwID0gNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0aW9uIE1vZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fMjBfX1ZBTElEQVRJT05fTU9ERSA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9yZGVyIENvbHVtbiAyMDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fMjBfRkVBVFVSRV9DT1VOVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMCA8ZW0+T3JkZXIgQ29sdW1uIFZhbGlkYXRpb24gTW9kZSBUeXBlIDIwPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5PcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0T3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1JERVJfQ09MVU1OX1ZBTElEQVRJT05fTU9ERV9UWVBFXzIwID0gNjsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwcGVkU3VwZXJjbGFzc18yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9NYW55XzJfMEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB4bWxPcmRlckNvbHVtbl8yXzBFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBvcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzBFRW51bSA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKCkKKwl7CisJCXN1cGVyKGVOU19VUkksIEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkuZUlOU1RBTkNFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCisJICogCisJICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgorCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNlTlNfVVJJCisJICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIGluaXQoKQorCXsKKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UoKSk7CisKKwkJaXNJbml0ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcworCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKKwkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UpOworCQlFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lSU5TVEFOQ0UpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCisJCXRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCisJCXRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZnJlZXplKCk7CisKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJLCB0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKTsKKwkJcmV0dXJuIHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAgPGVtPlhtbCBDb2xsZWN0aW9uIE1hcHBpbmcgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENvbGxlY3Rpb24gTWFwcGluZyAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCgpCisJeworCQlyZXR1cm4geG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wI2dldE1hcEtleUNvbnZlcnQgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCNnZXRNYXBLZXlDb252ZXJ0KCkKKwkgKiBAc2VlICNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5Q29udmVydCgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyA8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wI2dldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKKwkgKiBAc2VlICNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKQorCXsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKKwl7CisJCXJldHVybiB4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAgPGVtPlhtbCBNYW55IFRvIE1hbnkgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFueVRvTWFueV8yXzAoKQorCXsKKwkJcmV0dXJuIHhtbE1hbnlUb01hbnlfMl8wRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCgpCisJeworCQlyZXR1cm4geG1sTWFwcGVkU3VwZXJjbGFzc18yXzBFQ2xhc3M7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wIDxlbT5YbWwgT25lIFRvIE1hbnkgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9uZSBUbyBNYW55IDIwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFhtbE9uZVRvTWFueV8yXzAoKQorCXsKKwkJcmV0dXJuIHhtbE9uZVRvTWFueV8yXzBFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wIDxlbT5YbWwgT3JkZXIgQ29sdW1uIDIwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPcmRlciBDb2x1bW4gMjA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQorCXsKKwkJcmV0dXJuIHhtbE9yZGVyQ29sdW1uXzJfMEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXRWYWxpZGF0aW9uTW9kZSA8ZW0+VmFsaWRhdGlvbiBNb2RlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsaWRhdGlvbiBNb2RlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wI2dldFZhbGlkYXRpb25Nb2RlKCkKKwkgKiBAc2VlICNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPcmRlckNvbHVtbl8yXzBfVmFsaWRhdGlvbk1vZGUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9yZGVyQ29sdW1uXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wIDxlbT5PcmRlciBDb2x1bW4gVmFsaWRhdGlvbiBNb2RlIFR5cGUgMjA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5PcmRlciBDb2x1bW4gVmFsaWRhdGlvbiBNb2RlIFR5cGUgMjA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5PcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzAKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVFbnVtIGdldE9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMCgpCisJeworCQlyZXR1cm4gb3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wRUVudW07CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkgZ2V0RWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSgpCisJeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCXsKKwkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOworCQlpc0NyZWF0ZWQgPSB0cnVlOworCisJCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworCQl4bWxDb2xsZWN0aW9uTWFwcGluZ18yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wRUNsYXNzLCBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0NPTlZFUlQpOworCQljcmVhdGVFUmVmZXJlbmNlKHhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMEVDbGFzcywgWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCisJCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwKTsKKworCQl4bWxNYW55VG9NYW55XzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFOWV9UT19NQU5ZXzIwKTsKKworCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjApOworCisJCXhtbE9uZVRvTWFueV8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09ORV9UT19NQU5ZXzIwKTsKKworCQl4bWxPcmRlckNvbHVtbl8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09SREVSX0NPTFVNTl8yMCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzLCBYTUxfT1JERVJfQ09MVU1OXzIwX19WQUxJREFUSU9OX01PREUpOworCisJCS8vIENyZWF0ZSBlbnVtcworCQlvcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzBFRW51bSA9IGNyZWF0ZUVFbnVtKE9SREVSX0NPTFVNTl9WQUxJREFUSU9OX01PREVfVFlQRV8yMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwl7CisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47CisJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgcGFja2FnZQorCQlzZXROYW1lKGVOQU1FKTsKKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7CisJCXNldE5zVVJJKGVOU19VUkkpOworCisJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKKwkJT3JtUGFja2FnZSB0aGVPcm1QYWNrYWdlID0gKE9ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKTsKKwkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpOworCQlPcm1WMl8wUGFja2FnZSB0aGVPcm1WMl8wUGFja2FnZSA9IChPcm1WMl8wUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1WMl8wUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7CisJCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkpOworCQl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbENvbnZlcnRlcnNIb2xkZXIoKSk7CisJCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCgpKTsKKwkJeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbENvbnZlcnRlckhvbGRlcigpKTsKKwkJeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAoKSk7CisJCXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbENhY2hlYWJsZTJfMCgpKTsKKwkJeG1sT25lVG9NYW55XzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQ29udmVydGVySG9sZGVyKCkpOworCQl4bWxPbmVUb01hbnlfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wKCkpOworCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCWluaXRFQ2xhc3MoeG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wRUNsYXNzLCBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuY2xhc3MsICJYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5Q29udmVydCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWFwS2V5Q29udmVydCIsIG51bGwsIDAsIDEsIFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZSgpLCBudWxsLCAibWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMiLCBudWxsLCAwLCAtMSwgWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MsICJYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MsIFhtbE1hbnlUb01hbnlfMl8wLmNsYXNzLCAiWG1sTWFueVRvTWFueV8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoeG1sTWFwcGVkU3VwZXJjbGFzc18yXzBFQ2xhc3MsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wLmNsYXNzLCAiWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoeG1sT25lVG9NYW55XzJfMEVDbGFzcywgWG1sT25lVG9NYW55XzJfMC5jbGFzcywgIlhtbE9uZVRvTWFueV8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzLCBYbWxPcmRlckNvbHVtbl8yXzAuY2xhc3MsICJYbWxPcmRlckNvbHVtbl8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPcmRlckNvbHVtbl8yXzBfVmFsaWRhdGlvbk1vZGUoKSwgdGhpcy5nZXRPcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzAoKSwgInZhbGlkYXRpb25Nb2RlIiwgbnVsbCwgMCwgMSwgWG1sT3JkZXJDb2x1bW5fMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCisJCWluaXRFRW51bShvcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzBFRW51bSwgT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wLmNsYXNzLCAiT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wIik7CisJCWFkZEVFbnVtTGl0ZXJhbChvcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzBFRW51bSwgT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wLk5PTkUpOworCQlhZGRFRW51bUxpdGVyYWwob3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wRUVudW0sIE9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMC5DT1JSRUNUSU9OKTsKKwkJYWRkRUVudW1MaXRlcmFsKG9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMEVFbnVtLCBPcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzAuRVhDRVBUSU9OKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKwkgKiA8dWw+CisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKwkgKiA8L3VsPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIExpdGVyYWxzCisJeworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCA8ZW0+WG1sIENvbGxlY3Rpb24gTWFwcGluZyAyMDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMCA9IGVJTlNUQU5DRS5nZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9DT05WRVJUID0gZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IGVJTlNUQU5DRS5nZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMCA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wIDxlbT5YbWwgTWFueSBUbyBNYW55IDIwPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8wKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BTllfVE9fTUFOWV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55XzJfMCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMCA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCA8ZW0+WG1sIE9uZSBUbyBNYW55IDIwPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fTUFOWV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAgPGVtPlhtbCBPcmRlciBDb2x1bW4gMjA8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uXzJfMCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PUkRFUl9DT0xVTU5fMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0aW9uIE1vZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PUkRFUl9DT0xVTU5fMjBfX1ZBTElEQVRJT05fTU9ERSA9IGVJTlNUQU5DRS5nZXRYbWxPcmRlckNvbHVtbl8yXzBfVmFsaWRhdGlvbk1vZGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMCA8ZW0+T3JkZXIgQ29sdW1uIFZhbGlkYXRpb24gTW9kZSBUeXBlIDIwPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5PcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldE9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gT1JERVJfQ09MVU1OX1ZBTElEQVRJT05fTU9ERV9UWVBFXzIwID0gZUlOU1RBTkNFLmdldE9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMCgpOworCisJfQorCit9IC8vRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL09yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL09yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYjg4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wLmphdmEKQEAgLTAsMCArMSwyNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+T3JkZXIgQ29sdW1uIFZhbGlkYXRpb24gTW9kZSBUeXBlIDIwPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0T3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBPcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgaW1wbGVtZW50cyBFbnVtZXJhdG9yCit7CisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOT05FX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTk9ORSgwLCAiTk9ORSIsICJOT05FIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DT1JSRUNUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NPUlJFQ1RJT05fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDT1JSRUNUSU9OKDEsICJDT1JSRUNUSU9OIiwgIkNPUlJFQ1RJT04iKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkVYQ0VQVElPTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNFWENFUFRJT05fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlFWENFUFRJT04oMiwgIkVYQ0VQVElPTiIsICJFWENFUFRJT04iKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTk9ORQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkVfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q09SUkVDVElPTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q09SUkVDVElPTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDT1JSRUNUSU9OCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09SUkVDVElPTl9WQUxVRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5FWENFUFRJT048L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVYQ0VQVElPTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNFWENFUFRJT04KKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWENFUFRJT05fVkFMVUUgPSAyOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbiBWYWxpZGF0aW9uIE1vZGUgVHlwZSAyMDwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IE9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMFtdCisJCXsKKwkJCU5PTkUsCisJCQlDT1JSRUNUSU9OLAorCQkJRVhDRVBUSU9OLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbiBWYWxpZGF0aW9uIE1vZGUgVHlwZSAyMDwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PE9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMD4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW4gVmFsaWRhdGlvbiBNb2RlIFR5cGUgMjA8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBPcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgZ2V0KFN0cmluZyBsaXRlcmFsKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCisJCXsKKwkJCU9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQorCQkJeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW4gVmFsaWRhdGlvbiBNb2RlIFR5cGUgMjA8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBPcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCisJCXsKKwkJCU9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCisJCQl7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbiBWYWxpZGF0aW9uIE1vZGUgVHlwZSAyMDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMCBnZXQoaW50IHZhbHVlKQorCXsKKwkJc3dpdGNoICh2YWx1ZSkKKwkJeworCQkJY2FzZSBOT05FX1ZBTFVFOiByZXR1cm4gTk9ORTsKKwkJCWNhc2UgQ09SUkVDVElPTl9WQUxVRTogcmV0dXJuIENPUlJFQ1RJT047CisJCQljYXNlIEVYQ0VQVElPTl9WQUxVRTogcmV0dXJuIEVYQ0VQVElPTjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQorCXsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQorCXsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCisJeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9PcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODIyY2IzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDb2xsZWN0aW9uIE1hcHBpbmcgMjA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wI2dldE1hcEtleUNvbnZlcnQgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wI2dldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzIDxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGV4dGVuZHMgSnBhRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKK3sKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1hcEtleUNvbnZlcnQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5Q29udmVydCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRNYXBLZXlDb252ZXJ0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAjZ2V0TWFwS2V5Q29udmVydCA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1hcEtleUNvbnZlcnQoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisKK30gLy8gWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlMzI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZzsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGV4dGVuZHMgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sQ29udmVydGlibGVNYXBwaW5nLCBYbWxDb252ZXJ0ZXJzSG9sZGVyLCBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAKK3sKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYW55VG9NYW55XzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hbnlUb01hbnlfMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcxYzg1NQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYW55VG9NYW55XzJfMC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFueSBUbyBNYW55IDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzAoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFhtbE1hbnlUb01hbnlfMl8wIGV4dGVuZHMgWG1sQ29udmVydGVySG9sZGVyLCBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAKK3sKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlYjIxMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGUyXzA7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCBleHRlbmRzIFhtbENhY2hlYWJsZTJfMAoreworCit9IC8vIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT25lVG9NYW55XzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9uZVRvTWFueV8yXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzc2ZjliCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9uZVRvTWFueV8yXzAuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9uZSBUbyBNYW55IDIwPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sT25lVG9NYW55XzJfMCBleHRlbmRzIFhtbENvbnZlcnRlckhvbGRlciwgWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCit7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhOGZkNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPcmRlckNvbHVtbl8yXzAuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPcmRlciBDb2x1bW4gMjA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wI2dldFZhbGlkYXRpb25Nb2RlIDxlbT5WYWxpZGF0aW9uIE1vZGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBleHRlbmRzIEpwYUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBYbWxPcmRlckNvbHVtbl8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Cit7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbiBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbGlkYXRpb24gTW9kZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZGF0aW9uIE1vZGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wCisJICogQHNlZSAjc2V0VmFsaWRhdGlvbk1vZGUoT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzBfVmFsaWRhdGlvbk1vZGUoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlPcmRlckNvbHVtblZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgZ2V0VmFsaWRhdGlvbk1vZGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXRWYWxpZGF0aW9uTW9kZSA8ZW0+VmFsaWRhdGlvbiBNb2RlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZGF0aW9uIE1vZGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZVR5cGVfMl8wCisJICogQHNlZSAjZ2V0VmFsaWRhdGlvbk1vZGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFZhbGlkYXRpb25Nb2RlKE9yZGVyQ29sdW1uVmFsaWRhdGlvbk1vZGVUeXBlXzJfMCB2YWx1ZSk7CisKK30gLy8gWG1sT3JkZXJDb2x1bW5fMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2YzY2NiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzAuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMCAKKwlleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZywgT25lVG9NYW55TWFwcGluZzJfMAore30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjk0NzEwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7CisKKy8qKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKiAKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wCisJZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZywgT25lVG9PbmVNYXBwaW5nMl8wCit7fQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb24yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9Db25uZWN0aW9uMl8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRjMGFmYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9Db25uZWN0aW9uMl8wLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKKworLyoqCisgKiAgQ29ubmVjdGlvbjJfMAorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb24yXzAgZXh0ZW5kcyBDb25uZWN0aW9uLCBKcGFDb25uZWN0aW9uMl8wCit7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvT3B0aW9uczJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL09wdGlvbnMyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDJmN2MyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL09wdGlvbnMyXzAuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5KcGFPcHRpb25zMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOworCisvKioKKyAqICBPcHRpb25zMl8wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3B0aW9uczJfMCBleHRlbmRzIE9wdGlvbnMsIEpwYU9wdGlvbnMyXzAKK3sKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5jbGFzc3BhdGggYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aAppbmRleCBjYTBhMjMxLi5mY2YwNzk4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aApAQCAtNyw2ICs3LDcgQEAKIAkJPGFjY2Vzc3J1bGVzPgogCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvKioiLz4KIAkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb3JlLyoqIi8+CisJCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS8qKiIvPgogCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L3VpLyoqIi8+CiAJCTwvYWNjZXNzcnVsZXM+CiAJPC9jbGFzc3BhdGhlbnRyeT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAyZGM0MWM3Li4zZjlhMzJlIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDMwICszLDQ3IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua1VpUGx1Z2luCitCdW5kbGUtVmVyc2lvbjogMS4zLjAucXVhbGlmaWVyCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuSnB0RWNsaXBzZUxpbmtVaVBsdWdpbgorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1DbGFzc1BhdGg6IC4KIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuZGI7YnVuZGxlLXZlcnNpb249IlsxLjEuMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQudWk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jYWNoaW5nLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jdXN0b21pemF0aW9uLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5sb2dnaW5nLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5vcHRpb25zLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZXhtbC5kZXRhaWxzLAotIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybSwKLSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc2NoZW1hLmdlbmVyYXRpb24KKyBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKKyBvcmcuZWNsaXBzZS5qcHQuZGI7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS5qcHQudWk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAorIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UudWkuZm9ybXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWksCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRkbGdlbjt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW4ud2l6YXJkczt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5nZW5lcmFsO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZXhtbC5kZXRhaWxzO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnN0cnVjdHVyZTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMuamF2YTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEucGxhdGZvcm07eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5zdHJ1Y3R1cmU7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBsYXRmb3JtLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzO3gtaW50ZXJuYWw6PXRydWUKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQorSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnRleHQ7dmVyc2lvbj0iNC4wLjEiCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMKaW5kZXggNThiMmFlNC4uMTc1OWU5NSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9wbHVnaW4ucHJvcGVydGllcwpAQCAtMTksNSArMTksMTIgQEAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1wbHVnaW5OYW1lPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgLSBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCitwbHVnaW5OYW1lPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IC0gVUkKK3Byb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQorCitlY2xpcHNlTGlua1dpemFyZENhdGVnb3J5TmFtZT1FY2xpcHNlTGluaworbmV3RWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZE5hbWU9RWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlCituZXdFY2xpcHNlTGlua0pwYU1hcHBpbmdGaWxlV2l6YXJkRGVzYz1DcmVhdGUgYW4gRWNsaXBzZUxpbmsgc3BlY2lmaWMgbWFwcGluZyBmaWxlCisKK25ld0VjbGlwc2VMaW5rMV8xTWFwcGluZ0ZpbGVXaXphcmROYW1lPUVjbGlwc2VMaW5rIDEuMSBNYXBwaW5nIEZpbGUKK25ld0VjbGlwc2VMaW5rMV8xSnBhTWFwcGluZ0ZpbGVXaXphcmREZXNjPUNyZWF0ZSBhbiBFY2xpcHNlTGluayAxLjEgc3BlY2lmaWMgbWFwcGluZyBmaWxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3BsdWdpbi54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnhtbAppbmRleCBkZTJkOTRjLi40MGVlYmUzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnhtbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnhtbApAQCAtMiwxMiArMiwxMDMgQEAKIDw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KIDxwbHVnaW4+CiAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qcHQudWkuanBhUGxhdGZvcm0iPgotICAgICAgPGpwYVBsYXRmb3JtCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm1VSSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lY2xpcHNlbGluay5wbGF0Zm9ybSI+Ci0gICAgICA8L2pwYVBsYXRmb3JtPgotICAgPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVBsYXRmb3JtVWlzIj4KKwkJIAorCQk8anBhUGxhdGZvcm1VaQorCQkJaWQ9Im9yZy5lY2xpcHNlLmVjbGlwc2VsaW5rLnBsYXRmb3JtLnVpIgorCQkJanBhUGxhdGZvcm09Im9yZy5lY2xpcHNlLmVjbGlwc2VsaW5rLnBsYXRmb3JtIgorCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm0uRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpRmFjdG9yeSIvPgorCQkJCisJCTxqcGFQbGF0Zm9ybVVpCisJCQlpZD0iZWNsaXBzZWxpbmsxXzEudWkiCisJCQlqcGFQbGF0Zm9ybT0iZWNsaXBzZWxpbmsxXzEiCisJCQlmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLnBsYXRmb3JtLkVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaUZhY3RvcnkiLz4KIAorCQk8anBhUGxhdGZvcm1VaQorCQkJaWQ9ImVjbGlwc2VsaW5rMl8wLnVpIgorCQkJanBhUGxhdGZvcm09ImVjbGlwc2VsaW5rMl8wIgorCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wbGF0Zm9ybS5FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5Ii8+CisJCQorCTwvZXh0ZW5zaW9uPgorCQorCQorCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgorCQkKKwkJPGNhdGVnb3J5CisJCQlpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rIgorCQkJbmFtZT0iJWVjbGlwc2VMaW5rV2l6YXJkQ2F0ZWdvcnlOYW1lIgorCQkJcGFyZW50Q2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdCIvPgorCQkKKwkJPHdpemFyZAorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS53aXphcmQubmV3RWNsaXBzZUxpbmtNYXBwaW5nRmlsZSIKKwkJCW5hbWU9IiVuZXdFY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkTmFtZSIKKwkJCWljb249InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfanBhX2ZpbGVfd2l6LmdpZiIKKwkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qcHQvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rIj4KKwkJCTxkZXNjcmlwdGlvbj4lbmV3RWNsaXBzZUxpbmtKcGFNYXBwaW5nRmlsZVdpemFyZERlc2M8L2Rlc2NyaXB0aW9uPgorCQkJPGNsYXNzIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5FY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkIj4gCisJCQkJPHBhcmFtZXRlciBuYW1lPSJqYXZhZWVhcnRpZmFjdCIgdmFsdWU9InRydWUiLz4gCisJCQkJPHBhcmFtZXRlciBuYW1lPSJtZW51SW5kZXgiIHZhbHVlPSI0MCIgLz4gCisJCQkJPHBhcmFtZXRlciBuYW1lPSJqcHRhcnRpZmFjdCIgdmFsdWU9InRydWUiLz4gCisJCQk8L2NsYXNzPiAKKwkJPC93aXphcmQ+CisJCSAgICAKKwk8L2V4dGVuc2lvbj4KKworCisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQiPgorCQkKKwkJPGNvbW1vbldpemFyZAorCQkJbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpwdC51aSIKKwkJCXR5cGU9Im5ldyIKKwkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkud2l6YXJkLm5ld0VjbGlwc2VMaW5rTWFwcGluZ0ZpbGUiPgorCQkJPGVuYWJsZW1lbnQ+CisJCQkJPGFuZD4KKwkJCQkJPG9yPgorCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+CisgICAgICAgICAgICAgICAgICAgIAk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlciIvPgorCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ii8+CisJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgorCQkJCQk8L29yPgorCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KKwkJCQkJCTx0ZXN0IAorCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKKwkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgorCQkJCQkJCXZhbHVlPSJqcHQuanBhIiAvPgorCQkJCQk8L2FkYXB0PgorCQkJCQk8b3I+CisJCQkJCQk8dGVzdAorCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGFQbGF0Zm9ybSIKKwkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuZWNsaXBzZWxpbmsucGxhdGZvcm0iPgorCQkJCQkJPC90ZXN0PgorCQkJCQkJPHRlc3QKKwkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuanBhUGxhdGZvcm0iCisJCQkJCQkJdmFsdWU9ImVjbGlwc2VsaW5rMV8xIj4KKwkJCQkJCTwvdGVzdD4KKwkJCQkJCTx0ZXN0CisJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYVBsYXRmb3JtIgorCQkJCQkJCXZhbHVlPSJlY2xpcHNlbGluazJfMCI+CisJCQkJCQk8L3Rlc3Q+CisJCQkJCTwvb3I+CisJCQkJPC9hbmQ+CisJCQk8L2VuYWJsZW1lbnQ+CisJCTwvY29tbW9uV2l6YXJkPgorCQkKKwk8L2V4dGVuc2lvbj4KKwkKKwkKKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZUV4dGVuc2lvbnMiPgorCQkKKwkJPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCisJCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVBlcnNwZWN0aXZlIj4KKwkJCTxuZXdXaXphcmRTaG9ydGN1dAorCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkud2l6YXJkLm5ld0VjbGlwc2VMaW5rTWFwcGluZ0ZpbGUiPgorCQkJPC9uZXdXaXphcmRTaG9ydGN1dD4KKwkJPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KKwkJCisJPC9leHRlbnNpb24+CisJCiA8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua191aS5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3Byb3BlcnR5X2ZpbGVzL2VjbGlwc2VsaW5rX3VpLnByb3BlcnRpZXMKaW5kZXggZDQyMzM4YS4uZmM1ZTUwZSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3Byb3BlcnR5X2ZpbGVzL2VjbGlwc2VsaW5rX3VpLnByb3BlcnRpZXMKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3Byb3BlcnR5X2ZpbGVzL2VjbGlwc2VsaW5rX3VpLnByb3BlcnRpZXMKQEAgLTEsNiArMSwyMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisjIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK01hcHBpbmdGaWxlV2l6YXJkX3RpdGxlPU5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUKK01hcHBpbmdGaWxlV2l6YXJkUGFnZV90aXRsZT1FY2xpcHNlTGluayBtYXBwaW5nIGZpbGUKK01hcHBpbmdGaWxlV2l6YXJkUGFnZV9kZXNjPVNwZWNpZnkgRWNsaXBzZUxpbmsgbWFwcGluZyBmaWxlIGxvY2F0aW9uIGFuZCBwcm9wZXJ0aWVzCisKK0VjbGlwc2VMaW5rMV8xTWFwcGluZ0ZpbGVXaXphcmRfdGl0bGU9TmV3IEVjbGlwc2VMaW5rIDEuMSBNYXBwaW5nIEZpbGUKK0VjbGlwc2VMaW5rMV8xTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3RpdGxlPUVjbGlwc2VMaW5rIDEuMSBtYXBwaW5nIGZpbGUKK0VjbGlwc2VMaW5rMV8xTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2Rlc2M9U3BlY2lmeSBFY2xpcHNlTGluayAxLjEgbWFwcGluZyBmaWxlIGxvY2F0aW9uIGFuZCBwcm9wZXJ0aWVzCiAKIEJvb2xlYW5fVHJ1ZSA9IFRydWUKIEJvb2xlYW5fRmFsc2UgPSBGYWxzZQpAQCAtMTYsMTQgKzMwLDM3IEBACiBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfYnJvd3NlID0gQnJvd3NlLi4uCiBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZGVzY3JpcHRpb24gPSBEZXNjcmlwdGlvbjoKIAorIyBHZW5lcmFsCitQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfdGl0bGUgPSBHZW5lcmFsCitQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZ2VuZXJhbFNlY3Rpb25UaXRsZSA9IEdlbmVyYWwKK1BlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9tYXBwZWRDbGFzc2VzU2VjdGlvblRpdGxlID0gTWFuYWdlZCBDbGFzc2VzCitQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbWFwcGVkQ2xhc3Nlc1NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBsaXN0IG9mIGNsYXNzZXMgdG8gYmUgbWFuYWdlZCBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCitQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfeG1sTWFwcGluZ0ZpbGVzU2VjdGlvblRpdGxlID0gWE1MIE1hcHBpbmcgRmlsZXMKK1BlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl94bWxNYXBwaW5nRmlsZXNTZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KKworUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX25hbWVMYWJlbCA9IE5hbWU6CitQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfcGVyc2lzdGVuY2VQcm92aWRlckxhYmVsID0gUGVyc2lzdGVuY2UgUHJvdmlkZXI6CitQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZGVzY3JpcHRpb25MYWJlbCA9IERlc2NyaXB0aW9uOgorCitQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlcz1FeGNsdWRlIHVubGlzdGVkIGNsYXNzZXMKK1BlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzV2l0aERlZmF1bHQ9RXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzICh7MH0pCitQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbWFwcGVkQ2xhc3Nlc05vTmFtZT08bmFtZSBub3Qgc2V0PgorUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX29wZW49T3BlbgorCitQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfeG1sTWFwcGluZ0ZpbGVzRGlhbG9nX3RpdGxlPUpQQSBYTUwgTWFwcGluZyBGaWxlIFNlbGVjdGlvbgorUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3htbE1hcHBpbmdGaWxlc0RpYWxvZ19tZXNzYWdlPUNob29zZSB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgdG8gYmUgYWRkZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCitQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfb3JtTm9OYW1lPTxuYW1lIG5vdCBzZXQ+CitQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZUVjbGlwc2VsaW5rT3JtPUV4Y2x1ZGUgdW5saXN0ZWQgRWNsaXBzZUxpbmsgWE1MIG1hcHBpbmcgZmlsZQorUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2V4Y2x1ZGVFY2xpcHNlbGlua09ybVdpdGhEZWZhdWx0PUV4Y2x1ZGUgdW5saXN0ZWQgRWNsaXBzZUxpbmsgWE1MIG1hcHBpbmcgZmlsZSAoezB9KQorCiAjIENvbm5lY3Rpb24KIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl90aXRsZSA9IENvbm5lY3Rpb24KIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9zZWN0aW9uVGl0bGUgPSBQZXJzaXN0ZW5jZSBVbml0IENvbm5lY3Rpb24KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIERhdGEgU291cmNlIG9yIEpEQkMgQ29ubmVjdGlvbiBwcm9wZXJ0aWVzLgorUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3NlY3Rpb25EZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSB0aGUgZGF0YSBzb3VyY2Ugb3IgSkRCQyBjb25uZWN0aW9uIHByb3BlcnRpZXMuCiBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSA9IERlZmF1bHQgKHswfSkKIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9kZWZhdWx0RW1wdHkgPSBEZWZhdWx0ICgpCiAKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl90cmFuc2FjdGlvblR5cGVMYWJlbCA9IFRyYW5zYWN0aW9uIFR5cGU6CitQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdHJhbnNhY3Rpb25UeXBlTGFiZWwgPSBUcmFuc2FjdGlvbiB0eXBlOgogCiBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfanRhID0gSlRBCiBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfcmVzb3VyY2VfbG9jYWwgPSBSZXNvdXJjZSBMb2NhbApAQCAtMzEsMjQgKzY4LDI0IEBACiBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWwgPSBOYXRpdmUgU1FMCiBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWxEZWZhdWx0ID0gTmF0aXZlIFNRTCAoezB9KQogCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmF0Y2hXcml0aW5nTGFiZWwgPSBCYXRjaCBXcml0aW5nOgorUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JhdGNoV3JpdGluZ0xhYmVsID0gQmF0Y2ggd3JpdGluZzoKIAogQmF0Y2hXcml0aW5nQ29tcG9zaXRlX25vbmUgPSBOb25lCiBCYXRjaFdyaXRpbmdDb21wb3NpdGVfamRiYyA9IEpEQkMKIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9idWZmZXJlZCA9IEJ1ZmZlcmVkCiBCYXRjaFdyaXRpbmdDb21wb3NpdGVfb3JhY2xlX2pkYmMgPSBPcmFjbGUgSkRCQwogCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfY2FjaGVTdGF0ZW1lbnRzTGFiZWwgPSBTdGF0ZW1lbnQgQ2FjaGluZzoKK1BlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9jYWNoZVN0YXRlbWVudHNMYWJlbCA9IFN0YXRlbWVudCBjYWNoaW5nOgogCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfanRhRGF0YVNvdXJjZUxhYmVsID0gSlRBIERhdGEgU291cmNlOgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25vbkp0YURhdGFTb3VyY2VMYWJlbCA9IE5vbi1KVEEgRGF0YSBTb3VyY2U6CitQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfanRhRGF0YVNvdXJjZUxhYmVsID0gSlRBIGRhdGEgc291cmNlOgorUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25vbkp0YURhdGFTb3VyY2VMYWJlbCA9IE5vbi1KVEEgZGF0YSBzb3VyY2U6CiAKIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9kcml2ZXJMYWJlbCA9IERyaXZlcjoKIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91cmxMYWJlbCA9IFVSTDoKIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91c2VyTGFiZWwgPSBVc2VyOgogUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3Bhc3N3b3JkTGFiZWwgPSBQYXNzd29yZDoKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iaW5kUGFyYW1ldGVyc0xhYmVsID0gQmluZCBQYXJhbWV0ZXJzCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmluZFBhcmFtZXRlcnNMYWJlbERlZmF1bHQgPSBCaW5kIFBhcmFtZXRlcnMgKHswfSkKK1BlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iaW5kUGFyYW1ldGVyc0xhYmVsID0gQmluZCBwYXJhbWV0ZXJzCitQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmluZFBhcmFtZXRlcnNMYWJlbERlZmF1bHQgPSBCaW5kIHBhcmFtZXRlcnMgKHswfSkKIAogUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NoYXJlZExhYmVsID0gU2hhcmVkCiBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2hhcmVkTGFiZWxEZWZhdWx0ID0gU2hhcmVkICh7MH0pCkBAIC02OSwxNCArMTA2LDE0IEBACiAjIFNjaGVtYUdlbmVyYXRpb24KIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl90aXRsZSA9IFNjaGVtYSBHZW5lcmF0aW9uCiBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvblRpdGxlID0gUGVyc2lzdGVuY2UgVW5pdCBTY2hlbWEgR2VuZXJhdGlvbgotUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX3NlY3Rpb25EZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSB0aGUgRWNsaXBzZUxpbmsgU2NoZW1hIEdlbmVyYXRpb24gcHJvcGVydGllcy4KK1BlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIEVjbGlwc2VMaW5rIHNjaGVtYSBnZW5lcmF0aW9uIHByb3BlcnRpZXMuCiBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSA9IERlZmF1bHQgKHswfSkKIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZWZhdWx0RW1wdHkgPSBEZWZhdWx0ICgpCiAKLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZGxHZW5lcmF0aW9uVHlwZUxhYmVsID0gRERMIEdlbmVyYXRpb24gVHlwZToKLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9vdXRwdXRNb2RlTGFiZWwgPSBPdXRwdXQgTW9kZToKLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9jcmVhdGVEZGxGaWxlTmFtZUxhYmVsID0gQ3JlYXRlIERETCBGaWxlIE5hbWU6Ci1QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZHJvcERkbEZpbGVOYW1lTGFiZWwgPSBEcm9wIERETCBGaWxlIE5hbWU6CitQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGRsR2VuZXJhdGlvblR5cGVMYWJlbCA9IERETCBnZW5lcmF0aW9uIHR5cGU6CitQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfb3V0cHV0TW9kZUxhYmVsID0gT3V0cHV0IG1vZGU6CitQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfY3JlYXRlRGRsRmlsZU5hbWVMYWJlbCA9IENyZWF0ZSBEREwgZmlsZSBuYW1lOgorUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2Ryb3BEZGxGaWxlTmFtZUxhYmVsID0gRHJvcCBEREwgZmlsZSBuYW1lOgogCiBPdXRwdXRNb2RlQ29tcG9zaXRlX2JvdGggPSBCb3RoCiBPdXRwdXRNb2RlQ29tcG9zaXRlX3NxbF9zY3JpcHQgPSBTcWwtc2NyaXB0CkBAIC04Niw3ICsxMjMsNyBAQAogRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGVfY3JlYXRlX3RhYmxlcyA9IENyZWF0ZSBUYWJsZXMKIERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlX2Ryb3BfYW5kX2NyZWF0ZV90YWJsZXMgPSBEcm9wIGFuZCBDcmVhdGUgVGFibGVzCiAKLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZGxHZW5lcmF0aW9uTG9jYXRpb25MYWJlbCA9IERETCBHZW5lcmF0aW9uIExvY2F0aW9uOgorUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RkbEdlbmVyYXRpb25Mb2NhdGlvbkxhYmVsID0gRERMIGdlbmVyYXRpb24gbG9jYXRpb246CiAJCiBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nVGl0bGUgPSBHZW5lcmF0aW9uIExvY2F0aW9uCiBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nTWVzc2FnZSA9IENob29zZSBhIGZvbGRlciBmb3IgdGhlIGdlbmVyYXRlZCBEREwgZmlsZXM6CkBAIC05NiwyNSArMTMzLDI3IEBACiBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2VjdGlvblRpdGxlID0gUGVyc2lzdGVuY2UgVW5pdCBDYWNoaW5nCiBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uID0gQ29uZmlndXJlIHRoZSBzZXNzaW9uIG9yIGVudGl0eSBzcGVjaWZpYyBFY2xpcHNlTGluayBjYWNoaW5nIHByb3BlcnRpZXMuCiAKLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0Q2FjaGVUeXBlTGFiZWwgPSBEZWZhdWx0IENhY2hlIFR5cGU6Ci1QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfY2FjaGVUeXBlTGFiZWwgPSBDYWNoZSBUeXBlOgorQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZV9ncm91cFRpdGxlID0gRGVmYXVsdHMKIAotUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRTaGFyZWRDYWNoZUxhYmVsID0gU2hhcmVkIENhY2hlICh7MH0pCi1QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVMYWJlbCA9IFNoYXJlZCBDYWNoZQorUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRDYWNoZVR5cGVMYWJlbCA9IERlZmF1bHQgY2FjaGUgdHlwZToKK1BlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9jYWNoZVR5cGVMYWJlbCA9IENhY2hlIHR5cGU6CiAKLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWwgPSBEZWZhdWx0IFNoYXJlZCBDYWNoZSAoezB9KQotUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NoYXJlZENhY2hlRGVmYXVsdExhYmVsID0gRGVmYXVsdCBTaGFyZWQgQ2FjaGUKK1BlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0U2hhcmVkQ2FjaGVMYWJlbCA9IFNoYXJlZCBjYWNoZSAoezB9KQorUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NoYXJlZENhY2hlTGFiZWwgPSBTaGFyZWQgY2FjaGUKIAotQ2FjaGVTaXplQ29tcG9zaXRlX2NhY2hlU2l6ZT1DYWNoZSBTaXplOgorUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHRMYWJlbCA9IERlZmF1bHQgc2hhcmVkIGNhY2hlICh7MH0pCitQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWwgPSBEZWZhdWx0IHNoYXJlZCBjYWNoZQorCitDYWNoZVNpemVDb21wb3NpdGVfY2FjaGVTaXplPUNhY2hlIHNpemU6CiAKIENhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsID0gRnVsbAotQ2FjaGVUeXBlQ29tcG9zaXRlX2hhcmRfd2VhayA9IFdlYWsgV2l0aCBIYXJkIFN1YmNhY2hlCitDYWNoZVR5cGVDb21wb3NpdGVfaGFyZF93ZWFrID0gV2VhayB3aXRoIEhhcmQgU3ViY2FjaGUKIENhY2hlVHlwZUNvbXBvc2l0ZV9ub25lID0gTm9uZQogQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnQgPSBTb2Z0CiBDYWNoZVR5cGVDb21wb3NpdGVfc29mdF93ZWFrID0gV2VhayB3aXRoIFNvZnQgU3ViY2FjaGUKIENhY2hlVHlwZUNvbXBvc2l0ZV93ZWFrID0gV2VhawogCi1EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlX2RlZmF1bHRDYWNoZVNpemU9RGVmYXVsdCBDYWNoZSBTaXplOgorRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZV9kZWZhdWx0Q2FjaGVTaXplPURlZmF1bHQgY2FjaGUgc2l6ZToKIAogRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsID0gRnVsbAogRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9oYXJkX3dlYWsgPSBXZWFrIFdpdGggSGFyZCBTdWJjYWNoZQpAQCAtMTI2LDUyICsxNjUsODAgQEAKIEVudGl0eURpYWxvZ19zZWxlY3RFbnRpdHkgPSBTZWxlY3QgYW4gRW50aXR5CiBFbnRpdHlEaWFsb2dfbmFtZSA9IE5hbWU6CiAKLUNhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2dyb3VwVGl0bGUgPSBFbnRpdHkgQ2FjaGluZworQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZ3JvdXBUaXRsZSA9IEVudGl0eSBjYWNoaW5nCiBDYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9lZGl0QnV0dG9uID0gRWRpdC4uLgogCiBDYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlPSZFbnRlciB0eXBlIG5hbWUgcHJlZml4IG9yIHBhdHRlcm4gKCosID8sIG9yIGNhbWVsIGNhc2UpOgogQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nVGl0bGU9RW50aXR5IFNlbGVjdGlvbgotCQorCitQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfRmx1c2hDbGVhckNhY2hlTGFiZWwgPSBGbHVzaCBjbGVhciBjYWNoZToKKworRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlX2Ryb3AgPSBEcm9wCitGbHVzaENsZWFyQ2FjaGVDb21wb3NpdGVfZHJvcF9pbnZhbGlkYXRlID0gRHJvcCBJbnZhbGlkYXRlCitGbHVzaENsZWFyQ2FjaGVDb21wb3NpdGVfbWVyZ2UgPSBNZXJnZQorCiAjIEN1c3RvbWl6YXRpb24KIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aXRsZSA9IEN1c3RvbWl6YXRpb24KIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9zZWN0aW9uVGl0bGUgPSBQZXJzaXN0ZW5jZSBVbml0IEN1c3RvbWl6YXRpb24KIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24gPSBTZXQgZGVmYXVsdCBvciBlbnRpdHkgc3BlY2lmaWMgRWNsaXBzZUxpbmsgY3VzdG9taXphdGlvbiBhbmQgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzLgotCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGhyb3dFeGNlcHRpb25zTGFiZWxEZWZhdWx0ID0gVGhyb3cgRXhjZXB0aW9ucyAoezB9KQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsID0gVGhyb3cgRXhjZXB0aW9ucworUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0gPSBEZWZhdWx0ICh7MH0pCitQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfZGVmYXVsdEVtcHR5ID0gRGVmYXVsdCAoKQogCiBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhYmVsID0gV2VhdmluZzoKIAotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdMYXp5TGFiZWxEZWZhdWx0ID0gV2VhdmluZyBMYXp5ICh7MH0pCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbCA9IFdlYXZpbmcgTGF6eQorUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdMYXp5TGFiZWxEZWZhdWx0ID0gV2VhdmluZyBsYXp5ICh7MH0pCitQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbCA9IFdlYXZpbmcgbGF6eQogCQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdDaGFuZ2VUcmFja2luZ0xhYmVsRGVmYXVsdCA9IFdlYXZpbmcgQ2hhbmdlIFRyYWNraW5nICh7MH0pCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0NoYW5nZVRyYWNraW5nTGFiZWwgPSBXZWF2aW5nIENoYW5nZSBUcmFja2luZworUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdDaGFuZ2VUcmFja2luZ0xhYmVsRGVmYXVsdCA9IFdlYXZpbmcgY2hhbmdlIHRyYWNraW5nICh7MH0pCitQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0NoYW5nZVRyYWNraW5nTGFiZWwgPSBXZWF2aW5nIGNoYW5nZSB0cmFja2luZwogCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ZldGNoR3JvdXBzTGFiZWxEZWZhdWx0ID0gV2VhdmluZyBGZXRjaCBHcm91cHMgKHswfSkKLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRmV0Y2hHcm91cHNMYWJlbCA9IFdlYXZpbmcgRmV0Y2ggR3JvdXBzCi0JCitQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ZldGNoR3JvdXBzTGFiZWxEZWZhdWx0ID0gV2VhdmluZyBmZXRjaCBncm91cHMgKHswfSkKK1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRmV0Y2hHcm91cHNMYWJlbCA9IFdlYXZpbmcgZmV0Y2ggZ3JvdXBzCisKK1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nSW50ZXJuYWxMYWJlbCA9IFdlYXZpbmcgaW50ZXJuYWwKK1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nSW50ZXJuYWxMYWJlbERlZmF1bHQgPSBXZWF2aW5nIGludGVybmFsICh7MH0pCisKK1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRWFnZXJMYWJlbCA9IFdlYXZpbmcgZWFnZXIKK1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRWFnZXJMYWJlbERlZmF1bHQgPSBXZWF2aW5nIGVhZ2VyICh7MH0pCisKK1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbERlZmF1bHQgPSBUaHJvdyBleGNlcHRpb25zICh7MH0pCitQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGhyb3dFeGNlcHRpb25zTGFiZWwgPSBUaHJvdyBleGNlcHRpb25zCisKK1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9leGNlcHRpb25IYW5kbGVyTGFiZWwgPSBFeGNlcHRpb24gaGFuZGxlcjoKKwogV2VhdmluZ0NvbXBvc2l0ZV90cnVlXyA9IFdlYXZlIER5bmFtaWNhbGx5CiBXZWF2aW5nQ29tcG9zaXRlX2ZhbHNlXyA9IE5vIFdlYXZpbmcKIFdlYXZpbmdDb21wb3NpdGVfc3RhdGljXyA9IFdlYXZlIFN0YXRpY2FsbHkKIAotQ3VzdG9taXphdGlvbkVudGl0eUxpc3RDb21wb3NpdGVfZ3JvdXBUaXRsZSA9IERlc2NyaXB0b3IgQ3VzdG9taXplcgorQ3VzdG9taXphdGlvbkVudGl0eUxpc3RDb21wb3NpdGVfZ3JvdXBUaXRsZSA9IERlc2NyaXB0b3IgY3VzdG9taXplcnMKIEN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2VkaXRCdXR0b24gPSBFZGl0Li4uCiAKIEN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U9JkVudGVyIHR5cGUgbmFtZSBwcmVmaXggb3IgcGF0dGVybiAoKiwgPywgb3IgY2FtZWwgY2FzZSk6CiBDdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dUaXRsZT1FbnRpdHkgU2VsZWN0aW9uCiAKIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9jdXN0b21pemVyTGFiZWwgPSBDdXN0b21pemVyOgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Nlc3Npb25DdXN0b21pemVyTGFiZWwgPSBTZXNzaW9uIEN1c3RvbWl6ZXI6CitQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfc2Vzc2lvbkN1c3RvbWl6ZXJMYWJlbCA9IFNlc3Npb24gY3VzdG9taXplcnMKKworUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX25vTmFtZT08bmFtZSBub3Qgc2V0PgorCitQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdmFsaWRhdGlvbk9ubHlMYWJlbCA9IFZhbGlkYXRpb24gb25seQorUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3ZhbGlkYXRpb25Pbmx5TGFiZWxEZWZhdWx0ID0gVmFsaWRhdGlvbiBvbmx5ICh7MH0pCisKK1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9wcm9maWxlckxhYmVsID0gUHJvZmlsZXI6CitQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfYnJvd3NlID0gQnJvd3NlLi4uCisKK1Byb2ZpbGVyQ29tcG9zaXRlX3BlcmZvcm1hbmNlX3Byb2ZpbGVyID0gUGVyZm9ybWFuY2UgUHJvZmlsZXIKK1Byb2ZpbGVyQ29tcG9zaXRlX3F1ZXJ5X21vbml0b3IgPSBRdWVyeSBNb25pdG9yIAorUHJvZmlsZXJDb21wb3NpdGVfbm9fcHJvZmlsZXIgPSBObyBQcm9maWxlcgogCiAjIExvZ2dpbmcKIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aXRsZSA9IExvZ2dpbmcKIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZWN0aW9uVGl0bGUgPSBQZXJzaXN0ZW5jZSBVbml0IExvZ2dpbmcKLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIEVjbGlwc2VMaW5rIExvZ2dpbmcgcHJvcGVydGllcy4KK1BlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIEVjbGlwc2VMaW5rIGxvZ2dpbmcgcHJvcGVydGllcy4KIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9kZWZhdWx0V2l0aE9uZVBhcmFtID0gRGVmYXVsdCAoezB9KQogUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2RlZmF1bHRFbXB0eSA9IERlZmF1bHQgKCkKIAotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ2dpbmdMZXZlbExhYmVsID0gTG9nZ2luZyBMZXZlbDoKK1BlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnaW5nTGV2ZWxMYWJlbCA9IExvZ2dpbmcgbGV2ZWw6CiAKIExvZ2dpbmdMZXZlbENvbXBvc2l0ZV9vZmYgPSBPZmYKIExvZ2dpbmdMZXZlbENvbXBvc2l0ZV9zZXZlcmUgPSBTZXZlcmUKQEAgLTE4MSw5ICsyNDgsMTAgQEAKIExvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lID0gRmluZQogTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmVyID0gRmluZXIKIExvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lc3QgPSBGaW5lc3QKK0xvZ2dpbmdMZXZlbENvbXBvc2l0ZV9hbGwgPSBBbGwKIAogUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ2dlckxhYmVsID0gTG9nZ2VyOgotCitQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfYnJvd3NlID0gQnJvd3NlLi4uCiBMb2dnZXJDb21wb3NpdGVfZGVmYXVsdF9sb2dnZXIgPSBEZWZhdWx0IExvZ2dlcgogTG9nZ2VyQ29tcG9zaXRlX2phdmFfbG9nZ2VyID0gSmF2YSBMb2dnZXIKIExvZ2dlckNvbXBvc2l0ZV9zZXJ2ZXJfbG9nZ2VyID0gU2VydmVyIExvZ2dlcgpAQCAtMTk2LDI1ICsyNjQsMzUgQEAKIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWxEZWZhdWx0ID0gU2Vzc2lvbiAoezB9KQogUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V4Y2VwdGlvbnNMYWJlbCA9IEV4Y2VwdGlvbnMKIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9leGNlcHRpb25zTGFiZWxEZWZhdWx0ID0gRXhjZXB0aW9ucyAoezB9KQotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ0ZpbGVMYWJlbCA9IExvZyBGaWxlCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nRmlsZUxhYmVsRGVmYXVsdCA9IExvZyBGaWxlICh7MH0pCisKIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnZXJzTGFiZWwgPSBMb2dnZXJzOgogCitQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0ZpbGVMYWJlbCA9IExvZyBmaWxlOgorCitMb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ1RpdGxlID0gTG9nIEZpbGUgTG9jYXRpb24KK0xvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nTWVzc2FnZSA9IENob29zZSBhIGZvbGRlciBmb3IgdGhlIGxvZyBmaWxlOgorCiAjIE9wdGlvbnMKIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90aXRsZSA9IE9wdGlvbnMKLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZWN0aW9uVGl0bGUgPSBFY2xpcHNlTGluayBTZXNzaW9uIE9wdGlvbnMKLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIEVjbGlwc2VMaW5rIFNlc3Npb24gT3B0aW9ucy4KK1BlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uU2VjdGlvblRpdGxlID0gRWNsaXBzZUxpbmsgU2Vzc2lvbiBPcHRpb25zCitQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSB0aGUgRWNsaXBzZUxpbmsgc2Vzc2lvbiBvcHRpb25zLgogUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0gPSBEZWZhdWx0ICh7MH0pCiBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdEVtcHR5ID0gRGVmYXVsdCAoKQogCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvbk5hbWUgPSBTZXNzaW9uIE5hbWU6Ci1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvbnNYbWwgPSBTZXNzaW9ucyBYbWw6CitQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvbk5hbWUgPSBTZXNzaW9uIG5hbWU6CitQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvbnNYbWwgPSBTZXNzaW9ucyBYTUw6CiAKLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMYWJlbCA9IEluY2x1ZGUgRGVzY3JpcHRvciBRdWVyaWVzCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGFiZWxEZWZhdWx0ID0gSW5jbHVkZSBEZXNjcmlwdG9yIFF1ZXJpZXMgKHswfSkKK1BlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMYWJlbCA9IEluY2x1ZGUgZGVzY3JpcHRvciBxdWVyaWVzCitQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGFiZWxEZWZhdWx0ID0gSW5jbHVkZSBkZXNjcmlwdG9yIHF1ZXJpZXMgKHswfSkKIAotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2V2ZW50TGlzdGVuZXJMYWJlbCA9IEV2ZW50IExpc3RlbmVyOgotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RhcmdldERhdGFiYXNlTGFiZWwgPSBUYXJnZXQgRGF0YWJhc2U6CitQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZXZlbnRMaXN0ZW5lckxhYmVsID0gRXZlbnQgbGlzdGVuZXI6CitQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGFyZ2V0RGF0YWJhc2VMYWJlbCA9IFRhcmdldCBkYXRhYmFzZToKKworUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX21pc2NlbGxhbmVvdXNTZWN0aW9uVGl0bGUgPSBNaXNjZWxsYW5lb3VzIE9wdGlvbnMKK1BlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9taXNjZWxsYW5lb3VzU2VjdGlvbkRlc2NyaXB0aW9uID0gQ29uZmlndXJlIHRoZSBtaXNjZWxsYW5lb3VzIG9wdGlvbnMuCisKK1BlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90ZW1wb3JhbE11dGFibGVMYWJlbCA9IFRlbXBvcmFsIG11dGFibGUKK1BlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90ZW1wb3JhbE11dGFibGVMYWJlbERlZmF1bHQgPSBUZW1wb3JhbCBtdXRhYmxlICh7MH0pCiAKIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2F0dHVuaXR5ID0gQXR0dW5pdHkKIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2F1dG8gPSBBdXRvCkBAIC0yMjcsMTUgKzMwNSwzMiBAQAogVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfaHNxbCA9IEhTUUwKIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2luZm9ybWl4ID0gSW5mb3JtaXgKIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2phdmFkYiA9IEphdmFEQgotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfbXlzcWw0ID0gTXlTUUw0CitUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9teXNxbCA9IE15U1FMCiBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGUgPSBPcmFjbGUKK1RhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTExID0gT3JhY2xlMTEKK1RhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTEwID0gT3JhY2xlMTBnCitUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGU5ID0gT3JhY2xlOWkKK1RhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTggPSBPcmFjbGU4aQogVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfcG9pbnRiYXNlID0gUG9pbnRCYXNlCiBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9wb3N0Z3Jlc3FsID0gUG9zdGdyZVNRTAotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3FsYW55d2hlcmUgPSBTUUxBbnlXaGVyZQorVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3FsYW55d2hlcmUgPSBTUUxBbnl3aGVyZQogVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3Fsc2VydmVyID0gU1FMU2VydmVyCiBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9zeWJhc2UgPSBTeWJhc2UKIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3RpbWVzdGVuID0gVGltZXNUZW4KIAorUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RhcmdldFNlcnZlckxhYmVsID0gVGFyZ2V0IHNlcnZlcjoKKworVGFyZ2V0U2VydmVyQ29tcG9zaXRlX25vbmUgPSBOb25lCitUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfb2M0aiA9IE9DNEoKK1RhcmdldFNlcnZlckNvbXBvc2l0ZV9zdW5hczkgPSBTdW5BUzkKK1RhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJzcGhlcmUgPSBXZWJTcGhlcmUKK1RhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJzcGhlcmVfNl8xID0gV2ViU3BoZXJlIDYuMQorVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljID0gV2ViTG9naWMKK1RhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJsb2dpY185ID0gV2ViTG9naWMgOQorVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljXzEwID0gV2ViTG9naWMgMTAKK1RhcmdldFNlcnZlckNvbXBvc2l0ZV9qYm9zcyA9IEpCb3NzCisKICMgRERMR2VuZXJhdGlvbgogRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaV9nZW5lcmF0aW5nRERMV2FybmluZ1RpdGxlID0gR2VuZXJhdGluZyBEREwKIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0RETFdhcm5pbmdNZXNzYWdlID0gV2FybmluZzogIEdlbmVyYXRpbmcgRERMIHdpbGwgRFJPUCBleGlzdGluZyB0YWJsZXMgYW5kezB9Q1JFQVRFIG5ldyB0YWJsZXMgYmFzZWQgb24gdGhlIEVudGl0aWVzIGluIHlvdXIgcHJvamVjdC57MX1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/CitFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2Vycm9yID0gRXJyb3IKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua191aV9kZXRhaWxzLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWlfZGV0YWlscy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MmFmNmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWlfZGV0YWlscy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTUzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlQcm92aWRlcl9sYWJlbCA9IEJhc2ljIENvbGxlY3Rpb24KK0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsID0gYmFzaWMgY29sbGVjdGlvbgorCitFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWwgPSBCYXNpYyBNYXAKK0VjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWwgPSBiYXNpYyBtYXAKKworRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsID0gVHJhbnNmb3JtYXRpb24KK0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWwgPSB0cmFuc2Zvcm1hdGlvbgorCitFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbCA9IFZhcmlhYmxlIE9uZSB0byBPbmUKK0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbCA9IHZhcmlhYmxlIG9uZSB0byBvbmUKKworRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfbGFiZWwgPSBUeXBlOgkKK0VjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2Z1bGwgPSBGdWxsCitFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV93ZWFrID0gV2VhaworRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfc29mdCA9IFNvZnQKK0VjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnRfd2VhayA9IFdlYWsgd2l0aCBTb2Z0IFN1YmNhY2hlCitFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9oYXJkX3dlYWsgPSBXZWFrIHdpdGggSGFyZCBTdWJjYWNoZQorRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfY2FjaGUgPSBDYWNoZQorRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfbm9uZSA9ICBOb25lCisKK0VjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlX3NpemUgPSBTaXplOgorCitFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9sYWJlbCA9IENvb3JkaW5hdGlvbiB0eXBlOgorRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfc2VuZF9vYmplY3RfY2hhbmdlcyA9IFNlbmQgT2JqZWN0IENoYW5nZXMKK0VjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX2ludmFsaWRhdGVfY2hhbmdlZF9vYmplY3RzID0gSW52YWxpZGF0ZSBDaGFuZ2VkIE9iamVjdHMKK0VjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX3NlbmRfbmV3X29iamVjdHNfd2l0aF9jaGFuZ2VzID0gU2VuZCBOZXcgT2JqZWN0cyB3aXRoIENoYW5nZXMKK0VjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX25vbmUgPSBOb25lCisKK0VjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZV9zaGFyZWRMYWJlbERlZmF1bHQgPSBTaGFyZWQgKHswfSkKK0VjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZV9zaGFyZWRMYWJlbCA9IFNoYXJlZAorRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlX2FkdmFuY2VkID0gQWR2YW5jZWQKKworRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9sYWJlbCA9IENoYW5nZSB0cmFja2luZzoKK0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfYXR0cmlidXRlID0gQXR0cmlidXRlCitFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlX29iamVjdCA9IE9iamVjdAorRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9kZWZlcnJlZCA9IERlZmVycmVkCitFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlX2F1dG8gPSBBdXRvCisKK0VjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9jb252ZXJ0ZXJOYW1lTGFiZWwgPSBDb252ZXJ0ZXIgbmFtZToKK0VjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9kZWZpbmVDb252ZXJ0ZXJTZWN0aW9uID0gRGVmaW5lIENvbnZlcnRlcgorRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2RlZmF1bHQgPSBEZWZhdWx0CitFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfY3VzdG9tID0gQ3VzdG9tCitFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfdHlwZSA9IFR5cGUKK0VjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9vYmplY3RUeXBlID0gT2JqZWN0IHR5cGUKK0VjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9zdHJ1Y3QgPSBTdHJ1Y3QKKworRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb21wb3NpdGVfbmFtZVRleHRMYWJlbCA9IE5hbWU6CitFY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9jbGFzc0xhYmVsID0gQ2xhc3M6CisKK0VjbGlwc2VMaW5rQ3VzdG9taXplckNvbXBvc2l0ZV9jbGFzc0xhYmVsID0gQ3VzdG9taXplciBjbGFzczoKKworRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX2N1c3RvbUNvbnZlcnRlciA9IEN1c3RvbQorRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX29iamVjdFR5cGVDb252ZXJ0ZXIgPSBPYmplY3QgdHlwZQorRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX3N0cnVjdENvbnZlcnRlciA9IFN0cnVjdAorRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX3R5cGVDb252ZXJ0ZXIgPSBUeXBlCisKK0VjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZV9hbHdheXNSZWZyZXNoRGVmYXVsdCA9IEFsd2F5cyByZWZyZXNoICh7MH0pCitFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGVfYWx3YXlzUmVmcmVzaExhYmVsID0gQWx3YXlzIHJlZnJlc2gKK0VjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlX3JlZnJlc2hPbmx5SWZOZXdlckRlZmF1bHQgPSBSZWZyZXNoIG9ubHkgaWYgbmV3ZXIgKHswfSkKK0VjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlX3JlZnJlc2hPbmx5SWZOZXdlckxhYmVsID0gUmVmcmVzaCBvbmx5IGlmIG5ld2VyCitFY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlX2Rpc2FibGVIaXRzRGVmYXVsdCA9IERpc2FibGUgaGl0cyAoezB9KQorRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZV9kaXNhYmxlSGl0c0xhYmVsID0gRGlzYWJsZSBoaXRzCisKK1R5cGVTZWN0aW9uX2NvbnZlcnRlZCA9IENvbnZlcnRlZAorCitFY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2FkdmFuY2VkID0gQWR2YW5jZWQKK0VjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY2FjaGluZyA9IENhY2hpbmcKK0VjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY29udmVydGVycyA9IENvbnZlcnRlcnMKKworRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9sYWJlbCA9IEV4aXN0ZW5jZSBjaGVja2luZzoKK0phdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2NoZWNrX2NhY2hlID0gQ2hlY2sgQ2FjaGUKK0phdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2NoZWNrX2RhdGFiYXNlID0gQ2hlY2sgQ2FjaGUgdGhlbiBEYXRhYmFzZQorSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfYXNzdW1lX2V4aXN0ZW5jZSA9IEFzc3VtZSBFeGlzdGVuY2UKK0phdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2Fzc3VtZV9ub25fZXhpc3RlbmNlID0gQXNzdW1lIE5vbi1FeGlzdGVuY2UKK09ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfY2hlY2tfY2FjaGUgPSBDaGVjayBDYWNoZQorT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9jaGVja19kYXRhYmFzZSA9IENoZWNrIENhY2hlIHRoZW4gRGF0YWJhc2UKK09ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfYXNzdW1lX2V4aXN0ZW5jZSA9IEFzc3VtZSBFeGlzdGVuY2UKK09ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfYXNzdW1lX25vbl9leGlzdGVuY2UgPSBBc3N1bWUgTm9uLUV4aXN0ZW5jZQorCitFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV9leHBpcnlTZWN0aW9uID0gRXhwaXJ5CisKK0VjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX25vRXhwaXJ5ID0gTm8gZXhwaXJ5CitFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lVG9MaXZlRXhwaXJ5ID0gVGltZSB0byBsaXZlIGV4cGlyeQorRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZVRvTGl2ZUV4cGlyeUV4cGlyZUFmdGVyID0gRXhwaXJlIGFmdGVyCitFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lVG9MaXZlRXhwaXJ5TWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzCitFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV9kYWlseUV4cGlyeSA9IERhaWx5IGV4cGlyeQorRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZU9mRGF5RXhwaXJ5RXhwaXJlQXQgPSBFeHBpcmUgYXQKKworCitFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZV9sYWJlbCA9IEpvaW4gZmV0Y2g6CitFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZV9pbm5lciA9IElubmVyCitFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZV9vdXRlciA9IE91dGVyCisKK0VjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZV9tdXRhYmxlTGFiZWw9TXV0YWJsZQorRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlX211dGFibGVMYWJlbERlZmF1bHQ9TXV0YWJsZSAoezB9KQorRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlX3RydWU9VHJ1ZQorRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlX2ZhbHNlPUZhbHNlCisKK0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9kYXRhVHlwZUxhYmVsID0gRGF0YSB0eXBlOgorRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX29iamVjdFR5cGVMYWJlbCA9IE9iamVjdCB0eXBlOgorRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2NvbnZlcnNpb25WYWx1ZUVkaXQgPSBFZGl0Li4uCitFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlc0RhdGFWYWx1ZUNvbHVtbiA9IERhdGEgVmFsdWUKK0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVzT2JqZWN0VmFsdWVDb2x1bW4gPSBPYmplY3QgVmFsdWUKK0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9kZWZhdWx0T2JqZWN0VmFsdWVMYWJlbCA9IERlZmF1bHQgb2JqZWN0IHZhbHVlOgorRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2NvbnZlcnNpb25WYWx1ZXNHcm91cFRpdGxlID0gQ29udmVyc2lvbiB2YWx1ZXMKK0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2FkZENvbnZlcnNpb25WYWx1ZSA9IEFkZCBDb252ZXJzaW9uIFZhbHVlCitFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19lZGl0Q29udmVyc2lvblZhbHVlID0gRWRpdCBDb252ZXJzaW9uIFZhbHVlCitFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19hZGRDb252ZXJzaW9uVmFsdWVEZXNjcmlwdGlvblRpdGxlID0gQ3JlYXRlIG5ldyBjb252ZXJzaW9uIHZhbHVlCitFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19hZGRDb252ZXJzaW9uVmFsdWVEZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBjb252ZXJzaW9uIHZhbHVlIHNldHRpbmcgYm90aCB0aGUgJ2RhdGEgdmFsdWUnIGFuZCB0aGUgJ29iamVjdCB2YWx1ZScKK0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2VkaXRDb252ZXJzaW9uVmFsdWVEZXNjcmlwdGlvblRpdGxlID0gRWRpdCBjb252ZXJzaW9uIHZhbHVlCitFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19lZGl0Q29udmVyc2lvblZhbHVlRGVzY3JpcHRpb24gPSBFZGl0IHRoZSBjb252ZXJzaW9uIHZhbHVlLCBjaGFuZ2luZyB0aGUgJ2RhdGEgdmFsdWUnIG9yICdvYmplY3QgdmFsdWUnCisKK0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2RhdGFWYWx1ZSA9IERhdGEgdmFsdWU6CitFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19vYmplY3RWYWx1ZSA9IE9iamVjdCB2YWx1ZToKK0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3RfZGF0YVZhbHVlTXVzdEJlU3BlY2lmaWVkID0gQSBkYXRhIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkLgorRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdF9vYmplY3RWYWx1ZU11c3RCZVNwZWNpZmllZCA9IEFuIG9iamVjdCB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC4KK0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3RfZGF0YVZhbHVlQWxyZWFkeUV4aXN0cyA9IFRoaXMgZGF0YSB2YWx1ZSBpcyBhbHJlYWR5IHNwZWNpZmllZCwgY2Fubm90IG1hcCBtdWx0aXBsZSBvYmplY3QgdmFsdWVzIHRvIHRoZSBzYW1lIGRhdGEgdmFsdWUuCisKKworRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGVfcHJpdmF0ZU93bmVkTGFiZWwgPSBQcml2YXRlIG93bmVkCitFY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlX3JlYWRPbmx5TGFiZWwgPSBSZWFkLW9ubHkKK0VjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGVfcmVhZE9ubHlXaXRoRGVmYXVsdCA9IFJlYWQtb25seSAoezB9KQorRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlX2RhdGFUeXBlTGFiZWwgPSBEYXRhIHR5cGU6CitFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGVfb2JqZWN0VHlwZUxhYmVsID0gT2JqZWN0IHR5cGU6CisKK0RlZmF1bHRFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9RGVmYXVsdCAoT25lIHRvIE9uZSkKK0RlZmF1bHRFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1EZWZhdWx0IChWYXJpYWJsZSBPbmUgdG8gT25lKQorRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9RGVmYXVsdCAoT25lIHRvIE1hbnkpCitEZWZhdWx0RWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1kZWZhdWx0IChvbmUgdG8gb25lKQorRGVmYXVsdEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1kZWZhdWx0ICh2YXJpYWJsZSBvbmUgdG8gb25lKQorRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPWRlZmF1bHQgKG9uZSB0byBtYW55KQorCitFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfTGFiZWw9Q29udmVydGVycworCQorRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfbmFtZT1OYW1lOgorRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfY29udmVydGVyVHlwZT1UeXBlOgorRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfYWRkQ29udmVydGVyPUFkZCBDb252ZXJ0ZXIKK0VjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX2FkZENvbnZlcnRlckRlc2NyaXB0aW9uVGl0bGU9Q3JlYXRlIG5ldyBjb252ZXJ0ZXIKK0VjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX2FkZENvbnZlcnRlckRlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBjb252ZXJ0ZXIgc2V0dGluZyBib3RoIHRoZSAnbmFtZScgYW5kIHRoZSAndHlwZScKK0VjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZCA9IEEgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4KK0VjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3RfdHlwZU11c3RCZVNwZWNpZmllZCA9IEEgY29udmVydGVyIHR5cGUgbXVzdCBiZSBzcGVjaWZpZWQuCisKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL0pwdEVjbGlwc2VMaW5rVWlQbHVnaW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL0pwdEVjbGlwc2VMaW5rVWlQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWI0ODAyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvSnB0RWNsaXBzZUxpbmtVaVBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKKyAqIAorICogCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rVWlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCit7CisKKwkvLyBUaGUgcGx1Zy1pbiBJRAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkiOyAvLyROT04tTkxTLTEkCisKKwkKKwkvLyAqKioqKioqKioqIHNpbmdsZXRvbiAqKioqKioqKioqCisJcHJpdmF0ZSBzdGF0aWMgSnB0RWNsaXBzZUxpbmtVaVBsdWdpbiBJTlNUQU5DRTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBQbHVnaW4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpwdEVjbGlwc2VMaW5rVWlQbHVnaW4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7CisgICAgICAgIElOU1RBTkNFLmdldExvZygpLmxvZyhzdGF0dXMpOworICAgIH0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgeworICAgICAgICBsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOworICAgIH0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgeworCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSkpOworCX0KKworCS8vICoqKioqKioqKiogSW1hZ2UgQVBJICoqKioqKioqKioKKwkvKioKKwkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgeworCQlpZiAoISBrZXkuc3RhcnRzV2l0aCgiaWNvbnMvIikpIHsKKwkJCWtleSA9ICJpY29ucy8iICsga2V5OworCQl9CisJCWlmICghIGtleS5lbmRzV2l0aCgiLmdpZiIpKSB7CisJCQlrZXkgPSBrZXkgKyAiLmdpZiI7CisJCX0KKwkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBrZXkpOworCX0KKworCS8qKgorCSAqIFRoaXMgcmV0dXJucyBhbiBpbWFnZSBmb3IgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgeworCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihrZXkpOworCQlyZXR1cm4gKGRlc2MgPT0gbnVsbCkgPyBudWxsIDogZGVzYy5jcmVhdGVJbWFnZSgpOworCX0KKworCisJCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgorCXB1YmxpYyBKcHRFY2xpcHNlTGlua1VpUGx1Z2luKCkgeworCQlzdXBlcigpOworCQlJTlNUQU5DRSA9IHRoaXM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJCUlOU1RBTkNFID0gdGhpczsKKwl9CisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlJTlNUQU5DRSA9IG51bGw7CisJCXN1cGVyLnN0b3AoY29udGV4dCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MzJjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKKworLyoqCisgKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgRGFsaSBFY2xpcHNlTGluayBVSS4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQorICogaW1wbGVtZW50ZWQuCisgKiA8L3A+CisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzIHsKKworCS8vQ29udGV4dElEIHByZWZpeAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IEpwdFVpUGx1Z2luLlBMVUdJTl9JRCArICIuIjsKKworCS8vUGVyc2lzdGVudCBUeXBlIGNvbXBvc2l0ZXMKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNISU5HX0FMV0FZU19SRUZSRVNIID0gUFJFRklYICsgImNhY2hpbmdfYWx3YXlzUmVmcmVzaCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19DQUNIRV9DT09SRElOQVRJT05fVFlQRSA9IFBSRUZJWCArICJjYWNoaW5nX2NhY2hlQ29vcmRpbmF0aW9uVHlwZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19DQUNIRV9UWVBFID0gUFJFRklYICsgImNhY2hpbmdfY2FjaGVUeXBlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNISU5HX0RJU0FCTEVfSElUUyA9IFBSRUZJWCArICJjYWNoaW5nX2Rpc2FibGVIaXRzIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNISU5HX1JFRlJFU0hfT05MWV9JRl9ORVdFUiA9IFBSRUZJWCArICJjYWNoaW5nX3JlZnJlc2hPbmx5SWZOZXdlciI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19TSEFSRUQgPSBQUkVGSVggKyAiY2FjaGluZ19zaGFyZWQiOworCisJLy9QZXJzaXN0ZW5jZSBYbWwgRWRpdG9yCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfQ0FDSElORyA9IFBSRUZJWCArICJwZXJzaXN0ZW5jZV9jYWNoaW5nIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9DVVNUT01JWkFUSU9OID0gUFJFRklYICsgInBlcnNpc3RlbmNlX2N1c3RvbWl6YXRpb24iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX0xPR0dJTkcgPSBQUkVGSVggKyAicGVyc2lzdGVuY2VfbG9nZ2luZyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfT1BUSU9OUyA9IFBSRUZJWCArICJwZXJzaXN0ZW5jZV9vcHRpb25zIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9TQ0hFTUFfR0VORVJBVElPTiA9IFBSRUZJWCArICJwZXJzaXN0ZW5jZV9zY2hlbWFHZW5lcmF0aW9uIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX0NBQ0hJTkdfREVGQVVMVF9TSEFSRUQgPSBQUkVGSVggKyAiY2FjaGluZ19kZWZhdWx0U2hhcmVkIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9DQUNISU5HX0RFRkFVTFRfU0laRSA9IFBSRUZJWCArICJjYWNoaW5nX2RlZmF1bHRTaXplIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9DQUNISU5HX0RFRkFVTFRfVFlQRSA9IFBSRUZJWCArICJjYWNoaW5nX2RlZmF1bHRUeXBlIjsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9MT0dHSU5HX0VYQ0VQVElPTlMgPSBQUkVGSVggKyAibG9nZ2luZ19leGNlcHRpb25zIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9MT0dHSU5HX0xFVkVMID0gUFJFRklYICsgImxvZ2dpbmdfbGV2ZWwiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX0xPR0dJTkdfU0VTU0lPTiA9IFBSRUZJWCArICJsb2dnaW5nX3Nlc3Npb24iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX0xPR0dJTkdfVEhSRUFEID0gUFJFRklYICsgImxvZ2dpbmdfdGhyZWFkIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9MT0dHSU5HX1RJTUVTVEFNUCA9IFBSRUZJWCArICJsb2dnaW5nX3RpbWVTdGFtcCI7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfT1BUSU9OU19TRVNTSU9OX05BTUUgPSBQUkVGSVggKyAib3B0aW9uc19zZXNzaW9uTmFtZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfT1BUSU9OU19TRVNTSU9OU19YTUwgPSBQUkVGSVggKyAib3B0aW9uc19zZXNzaW9uc1htbCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfT1BUSU9OU19UQVJHRVRfREFUQUJBU0UgPSBQUkVGSVggKyAib3B0aW9uc190YXJnZXREYXRhYmFzZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfT1BUSU9OU19UQVJHRVRfU0VSVkVSID0gUFJFRklYICsgIm9wdGlvbnNfdGFyZ2V0U2VydmVyIjsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FY2xpcHNlTGlua1VpTWVzc2FnZXMuamF2YQppbmRleCA3MjU1YzUzLi4xMTVmOGFmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FY2xpcHNlTGlua1VpTWVzc2FnZXMuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FY2xpcHNlTGlua1VpTWVzc2FnZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwxOSArOSwyMCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsOwogCi0vKioKLSAqICBFY2xpcHNlTGlua1VpTWVzc2FnZXMKLSAqLwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CiAKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1VpTWVzc2FnZXMgZXh0ZW5kcyBOTFMKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiZWNsaXBzZWxpbmtfdWkiOyAvLyROT04tTkxTLTEkCisvKioKKyAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IEVsaXBzZUxpbmsgVUkuCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1VpTWVzc2FnZXMgewogCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzKTsKLQl9CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9kZXNjOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rMV8xTWFwcGluZ0ZpbGVXaXphcmRfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmsxXzFNYXBwaW5nRmlsZVdpemFyZFBhZ2VfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmsxXzFNYXBwaW5nRmlsZVdpemFyZFBhZ2VfZGVzYzsKIAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJvb2xlYW5fVHJ1ZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX0ZhbHNlOwpAQCAtMzcsNiArMzgsMjkgQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfYnJvd3NlOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9kZXNjcmlwdGlvbjsKIAorCS8vIEdlbmVyYWwKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2dlbmVyYWxTZWN0aW9uVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX21hcHBlZENsYXNzZXNTZWN0aW9uVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX21hcHBlZENsYXNzZXNTZWN0aW9uRGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3htbE1hcHBpbmdGaWxlc1NlY3Rpb25UaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfeG1sTWFwcGluZ0ZpbGVzU2VjdGlvbkRlc2NyaXB0aW9uOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9uYW1lTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3BlcnNpc3RlbmNlUHJvdmlkZXJMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZGVzY3JpcHRpb25MYWJlbDsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3NlczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlc1dpdGhEZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9tYXBwZWRDbGFzc2VzTm9OYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9vcGVuOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl94bWxNYXBwaW5nRmlsZXNEaWFsb2dfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3htbE1hcHBpbmdGaWxlc0RpYWxvZ19tZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9vcm1Ob05hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2V4Y2x1ZGVFY2xpcHNlbGlua09ybTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZUVjbGlwc2VsaW5rT3JtV2l0aERlZmF1bHQ7CisKIAkvLyBDb25uZWN0aW9uCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3RpdGxlOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9zZWN0aW9uVGl0bGU7CkBAIC0xMTcsNiArMTQxLDggQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfdGl0bGU7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NlY3Rpb25UaXRsZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hlRGVmYXVsdHNDb21wb3NpdGVfZ3JvdXBUaXRsZTsKIAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0Q2FjaGVUeXBlTGFiZWw7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2NhY2hlVHlwZUxhYmVsOwpAQCAtMTU0LDEzICsxODAsMTcgQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ1RpdGxlOwogCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX0ZsdXNoQ2xlYXJDYWNoZUxhYmVsOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZV9kcm9wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZV9kcm9wX2ludmFsaWRhdGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlX21lcmdlOworCQogCS8vIEN1c3RvbWl6YXRpb24KIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGl0bGU7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3NlY3Rpb25UaXRsZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGhyb3dFeGNlcHRpb25zTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW07CiAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhYmVsOwogCkBAIC0xNzMsNiArMjAzLDE4IEBACiAJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsRGVmYXVsdDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ZldGNoR3JvdXBzTGFiZWw7CiAKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ludGVybmFsTGFiZWxEZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nSW50ZXJuYWxMYWJlbDsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRWFnZXJMYWJlbERlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdFYWdlckxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9kZWZhdWx0RW1wdHk7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsRGVmYXVsdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGhyb3dFeGNlcHRpb25zTGFiZWw7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2V4Y2VwdGlvbkhhbmRsZXJMYWJlbDsKKwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYXZpbmdDb21wb3NpdGVfdHJ1ZV87CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgV2VhdmluZ0NvbXBvc2l0ZV9mYWxzZV87CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgV2VhdmluZ0NvbXBvc2l0ZV9zdGF0aWNfOwpAQCAtMTg1LDYgKzIyNywxNyBAQAogCQogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9jdXN0b21pemVyTGFiZWw7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Nlc3Npb25DdXN0b21pemVyTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX25vTmFtZTsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0aW9uT25seUxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0aW9uT25seUxhYmVsRGVmYXVsdDsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfcHJvZmlsZXJMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfYnJvd3NlOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2ZpbGVyQ29tcG9zaXRlX3BlcmZvcm1hbmNlX3Byb2ZpbGVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2ZpbGVyQ29tcG9zaXRlX3F1ZXJ5X21vbml0b3I7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZmlsZXJDb21wb3NpdGVfbm9fcHJvZmlsZXI7CiAKIAkvLyBMb2dnaW5nCiAJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpdGxlOwpAQCAtMjAzLDggKzI1NiwxMCBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lcjsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZXN0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dpbmdMZXZlbENvbXBvc2l0ZV9hbGw7CiAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2VyTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Jyb3dzZTsKIAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dlckNvbXBvc2l0ZV9kZWZhdWx0X2xvZ2dlcjsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnZXJDb21wb3NpdGVfamF2YV9sb2dnZXI7CkBAIC0yMTgsMTQgKzI3MywxNyBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWxEZWZhdWx0OwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9leGNlcHRpb25zTGFiZWw7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V4Y2VwdGlvbnNMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ0ZpbGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nRmlsZUxhYmVsRGVmYXVsdDsKKwkKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2Vyc0xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnaW5nRmlsZUxhYmVsOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZV9kaWFsb2dUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U7CiAKIAkvLyBTZXNzaW9uIE9wdGlvbnMKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2VjdGlvbkRlc2NyaXB0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uU2VjdGlvblRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uU2VjdGlvbkRlc2NyaXB0aW9uOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9kZWZhdWx0V2l0aE9uZVBhcmFtOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9kZWZhdWx0RW1wdHk7CiAKQEAgLTIzNyw2ICsyOTUsMTIgQEAKIAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9ldmVudExpc3RlbmVyTGFiZWw7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RhcmdldERhdGFiYXNlTGFiZWw7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX21pc2NlbGxhbmVvdXNTZWN0aW9uVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX21pc2NlbGxhbmVvdXNTZWN0aW9uRGVzY3JpcHRpb247CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RlbXBvcmFsTXV0YWJsZUxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90ZW1wb3JhbE11dGFibGVMYWJlbERlZmF1bHQ7CiAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9hdHR1bml0eTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9hdXRvOwpAQCAtMjQ5LDIwICszMTMsNDQgQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9oc3FsOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2luZm9ybWl4OwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2phdmFkYjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9teXNxbDQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfbXlzcWw7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfb3JhY2xlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTExOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTEwOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfb3JhY2xlODsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9wb2ludGJhc2U7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfcG9zdGdyZXNxbDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9zcWxhbnl3aGVyZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9zcWxzZXJ2ZXI7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3liYXNlOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3RpbWVzdGVuOworCSAgIAorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90YXJnZXRTZXJ2ZXJMYWJlbDsKIAotCS8vIERETEdlbmVyYXRpb24KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfbm9uZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfb2M0ajsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfc3VuYXM5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJzcGhlcmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYnNwaGVyZV82XzE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJsb2dpY185OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJsb2dpY18xMDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfamJvc3M7CisKKwkvLyBEREwgR2VuZXJhdGlvbgogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0RETFdhcm5pbmdUaXRsZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2dlbmVyYXRpbmdERExXYXJuaW5nTWVzc2FnZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2Vycm9yOwogCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImVjbGlwc2VsaW5rX3VpIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzczsKKwlzdGF0aWMgeworCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOworCX0KKwkKIAlwcml2YXRlIEVjbGlwc2VMaW5rVWlNZXNzYWdlcygpIHsKIAkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRW50aXR5RGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FbnRpdHlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IwYTY0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FbnRpdHlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBFbnRpdHlEaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eURpYWxvZyBleHRlbmRzIERpYWxvZwotewotCXByaXZhdGUgRW50aXR5IGVudGl0eTsKLQotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCi0JcHJvdGVjdGVkIENvbWJvIG5hbWVDb21ibzsKLQotCXByaXZhdGUgU3RyaW5nIHNlbGVjdGVkTmFtZTsKLQotCXB1YmxpYyBFbnRpdHlEaWFsb2coU2hlbGwgcGFyZW50LCBKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5RGlhbG9nKFNoZWxsIHBhcmVudCwgRW50aXR5IGVudGl0eSwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuZW50aXR5ID0gZW50aXR5OwotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRUaXRsZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVudGl0eURpYWxvZ19zZWxlY3RFbnRpdHk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0KLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQluYW1lTGFiZWwuc2V0VGV4dChFY2xpcHNlTGlua1VpTWVzc2FnZXMuRW50aXR5RGlhbG9nX25hbWUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy5uYW1lQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMubmFtZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXBvcHVsYXRlTmFtZUNvbWJvKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVOYW1lQ29tYm8oKSB7Ci0JCWlmIChzZWxlY3RlZE5hbWUgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lQ29tYm8uc2V0VGV4dChzZWxlY3RlZE5hbWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbWJvIGdldE5hbWVDb21ibygpIHsKLQkJcmV0dXJuIHRoaXMubmFtZUNvbWJvOwotCX0KLQotCXByb3RlY3RlZCBFbnRpdHkgZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZE5hbWUoU3RyaW5nIHNlbGVjdGVkTmFtZSkgewotCQl0aGlzLnNlbGVjdGVkTmFtZSA9IHNlbGVjdGVkTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJdGhpcy5zZWxlY3RlZE5hbWUgPSB0aGlzLm5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rVWlQbHVnaW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rVWlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4MDQ2ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9KcHRFY2xpcHNlTGlua1VpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtVaVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLQlwcml2YXRlIHN0YXRpYyBKcHRFY2xpcHNlTGlua1VpUGx1Z2luIElOU1RBTkNFOwotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKcHRFY2xpcHNlTGlua1VpUGx1Z2luIHBsdWdpbjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgSnB0RWNsaXBzZUxpbmtVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdEVjbGlwc2VMaW5rVWlQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBJTlNUQU5DRS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwpKTsKLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCB0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCB0aHJvd2FibGUpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEltYWdlIEFQSSAqKioqKioqKioqCi0JLyoqCi0JICogVGhpcyBnZXRzIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJaWYgKCEga2V5LnN0YXJ0c1dpdGgoImljb25zLyIpKSB7Ci0JCQlrZXkgPSAiaWNvbnMvIiArIGtleTsKLQkJfQotCQlpZiAoISBrZXkuZW5kc1dpdGgoIi5naWYiKSkgewotCQkJa2V5ID0ga2V5ICsgIi5naWYiOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwga2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgYW4gaW1hZ2UgZm9yIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBnZXRJbWFnZURlc2NyaXB0b3Ioa2V5KTsKLQkJcmV0dXJuIChkZXNjID09IG51bGwpID8gbnVsbCA6IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdEVjbGlwc2VMaW5rVWlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0NhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9DYWNoZVNpemVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzYTg3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0NhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRDb250cm9sVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci0KLS8qKgotICogQ2FjaGVTaXplQ29tcG9zaXRlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENhY2hlU2l6ZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxFbnRpdHlDYWNoZVByb3BlcnRpZXM+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYWNoZVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2FjaGVTaXplQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxFbnRpdHlDYWNoZVByb3BlcnRpZXM+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZENhY2hlU2l6ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5Q2FjaGVQcm9wZXJ0aWVzLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eUNhY2hlUHJvcGVydGllcy5DQUNIRV9TSVpFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCUludGVnZXIgdmFsdWUgPSBzdWJqZWN0LmdldENhY2hlU2l6ZSgpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gLTE7Ci0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0Q2FjaGVTaXplKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBidWlsZENhY2hpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5Q2FjaGVQcm9wZXJ0aWVzLCBDYWNoaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hpbmcgdHJhbnNmb3JtXyhFbnRpdHlDYWNoZVByb3BlcnRpZXMgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q2FjaGluZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdENhY2hlU2l6ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgSW50ZWdlcj4oYnVpbGRDYWNoaW5nSG9sZGVyKCksIENhY2hpbmcuQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCUludGVnZXIgdmFsdWUgPSBzdWJqZWN0LmdldENhY2hlU2l6ZURlZmF1bHQoKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdENhY2hlU2l6ZURlZmF1bHQoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZERlZmF1bHRDYWNoZVNpemVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBidWlsZExhYmVsKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRlZmF1bHRXaXRob3V0VmFsdWUKLQkJKTsKLQotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKAotCQkJbmV3IExhYmVsZWRMYWJlbChsYWJlbCksCi0JCQlidWlsZERlZmF1bHRDYWNoZVNpemVMYWJlbEhvbGRlcigpCi0JCSk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0Q2FjaGVTaXplTGFiZWxIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdENhY2hlU2l6ZUhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSW50ZWdlciB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZWZhdWx0V2l0aFZhbHVlLCB2YWx1ZSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuICIiOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IHRoaXMuYnVpbGRMYWJlbGVkU3Bpbm5lcigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoZVNpemVDb21wb3NpdGVfY2FjaGVTaXplLAotCQkJdGhpcy5idWlsZENhY2hlU2l6ZUhvbGRlcigpLAotCQkJLTEsCi0JCQktMSwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJdGhpcy5idWlsZERlZmF1bHRDYWNoZVNpemVMYWJlbChjb250YWluZXIpCi0JCSk7Ci0KLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyLCBzcGlubmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBsYXlvdXQgb2YgdGhlIGdpdmVuIGNvbnRhaW5lciBieSBjaGFuZ2luZyB3aGljaCB3aWRnZXQgd2lsbAotCSAqIGdyYWIgdGhlIGV4Y2VzcyBvZiBob3Jpem9udGFsIHNwYWNlLiBCeSBkZWZhdWx0LCB0aGUgY2VudGVyIGNvbnRyb2wgZ3JhYnMKLQkgKiB0aGUgZXhjZXNzIHNwYWNlLCB3ZSBjaGFuZ2UgaXQgdG8gYmUgdGhlIHJpZ2h0IGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgY29udGFpbmluZyB0aGUgY29udHJvbHMgbmVlZGluZyB0aGVpcgotCSAqIDxjb2RlPkdyaWREYXRhPC9jb2RlPiB0byBiZSBtb2RpZmllZCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlcwotCSAqIEBwYXJhbSBzcGlubmVyIFRoZSBzcGlubmVyIHRoYXQgZ290IGNyZWF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3Bpbm5lciBzcGlubmVyKSB7Ci0KLQkJLy8gSXQgaXMgcG9zc2libGUgdGhlIHNwaW5uZXIncyBwYXJlbnQgaXMgbm90IHRoZSBjb250YWluZXIgb2YgdGhlCi0JCS8vIGxhYmVsLCBzcGlubmVyIGFuZCByaWdodCBjb250cm9sIChhIHBhbmUgaXMgc29tZXRpbWVzIHJlcXVpcmVkIGZvcgotCQkvLyBwYWludGluZyB0aGUgc3Bpbm5lcidzIGJvcmRlcikKLQkJQ29tcG9zaXRlIHBhbmVDb250YWluZXIgPSBzcGlubmVyLmdldFBhcmVudCgpOwotCi0JCXdoaWxlIChjb250YWluZXIgIT0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKSkgewotCQkJcGFuZUNvbnRhaW5lciA9IHBhbmVDb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlDb250cm9sW10gY29udHJvbHMgPSBwYW5lQ29udGFpbmVyLmdldENoaWxkcmVuKCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQljb250cm9sc1sxXS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljb250cm9sc1syXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmVtb3ZlQWxpZ25SaWdodChjb250cm9sc1syXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0NhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWRkZWZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY2FjaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBDYWNoZVR5cGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIENhY2hlVHlwZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxFbnRpdHlDYWNoZVByb3BlcnRpZXM+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYWNoZVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2FjaGVUeXBlQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxFbnRpdHlDYWNoZVByb3BlcnRpZXM+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2NhY2hlVHlwZUxhYmVsLAotCQkJbmV3IENhY2hlVHlwZUNvbWJvKGNvbnRhaW5lciksCi0JCQludWxsCQkvLyBUT0RPIElKcGFIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIENhY2hlVHlwZUNvbWJvIGV4dGVuZHMgRW51bUZvcm1Db21ib1ZpZXdlcjxFbnRpdHlDYWNoZVByb3BlcnRpZXMsIENhY2hlVHlwZT4gewotCi0JCXByaXZhdGUgQ2FjaGVUeXBlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoQ2FjaGVUeXBlQ29tcG9zaXRlLnRoaXMsIHBhcmVudCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eUNhY2hlUHJvcGVydGllcy5DQUNIRV9UWVBFX1BST1BFUlRZKTsKLQkJfQotCi0JCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5Q2FjaGVQcm9wZXJ0aWVzLCBDYWNoaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgQ2FjaGluZyB0cmFuc2Zvcm1fKEVudGl0eUNhY2hlUHJvcGVydGllcyB2YWx1ZSkgewotCQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q2FjaGluZygpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZVR5cGU+IGJ1aWxkRGVmYXVsdENhY2hlVHlwZUhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIENhY2hlVHlwZT4oYnVpbGRDYWNoaW5nSG9sZGVyKCksIENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIENhY2hlVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQkJQ2FjaGVUeXBlIGNhY2hlVHlwZSA9IHN1YmplY3QuZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCQkJCQlpZiAoY2FjaGVUeXBlID09IG51bGwpIHsKLQkJCQkJCWNhY2hlVHlwZSA9IHN1YmplY3QuZ2V0RGVmYXVsdENhY2hlVHlwZURlZmF1bHQoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gY2FjaGVUeXBlOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREZWZhdWx0Q2FjaGluZ1R5cGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKLQkJCQlidWlsZERlZmF1bHRDYWNoaW5nVHlwZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkKLQkJCSk7Ci0JCX0KLQotCQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREZWZhdWx0Q2FjaGluZ1R5cGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJCWlmICgoZS5nZXROZXdWYWx1ZSgpICE9IG51bGwpICYmICFnZXRDb21ibygpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJQ2FjaGVUeXBlQ29tYm8udGhpcy5kb1BvcHVsYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDYWNoZVR5cGVbXSBjaG9pY2VzKCkgewotCQkJcmV0dXJuIENhY2hlVHlwZS52YWx1ZXMoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QoKS5nZXREZWZhdWx0Q2FjaGVUeXBlKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKENhY2hlVHlwZSB2YWx1ZSkgewotCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3MsCi0JCQkJQ2FjaGVUeXBlQ29tcG9zaXRlLnRoaXMsCi0JCQkJdmFsdWUKLQkJCSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJCS8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gYWxsb3cgdGhlIGNsYXNzIGxvYWRlciB0byBsZXQgdGhlIGxpc3RlbmVyCi0JCQkvLyB3cml0dGVuIGFib3ZlIHRvIGFjY2VzcyB0aGlzIG1ldGhvZAotCQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDYWNoZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWJqZWN0KCkuZ2V0Q2FjaGVUeXBlKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gZGVmYXVsdENhY2hlVHlwZUhvbGRlciA9Ci0JCQkJYnVpbGREZWZhdWx0Q2FjaGVUeXBlSG9sZGVyKCk7Ci0KLQkJCWRlZmF1bHRDYWNoZVR5cGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJYnVpbGREZWZhdWx0Q2FjaGluZ1R5cGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkKLQkJCSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQ2FjaGVUeXBlIHZhbHVlKSB7Ci0JCQl0aGlzLnN1YmplY3QoKS5zZXRDYWNoZVR5cGUodmFsdWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMzg3OTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZENvbnRyb2xVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLQotLyoqCi0gKiBDYWNoZVNpemVDb21wb3NpdGUKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxDYWNoaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2FjaGVUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIERlZmF1bHRDYWNoZVNpemVDb21wb3NpdGUoQWJzdHJhY3RQYW5lPENhY2hpbmc+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRDYWNoZVNpemVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ2FjaGluZy5DQUNIRV9TSVpFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCUludGVnZXIgdmFsdWUgPSBzdWJqZWN0LmdldENhY2hlU2l6ZURlZmF1bHQoKTsKLQotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gLTE7Ci0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0Q2FjaGVTaXplRGVmYXVsdCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0Q2FjaGVTaXplSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksICIiKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldERlZmF1bHRDYWNoZVNpemVEZWZhdWx0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEludGVnZXIuTUlOX1ZBTFVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZERlZmF1bHRDYWNoZVNpemVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBidWlsZExhYmVsKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRlZmF1bHRXaXRob3V0VmFsdWUKLQkJKTsKLQotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKAotCQkJbmV3IExhYmVsZWRMYWJlbChsYWJlbCksCi0JCQlidWlsZERlZmF1bHRDYWNoZVNpemVMYWJlbEhvbGRlcigpCi0JCSk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0Q2FjaGVTaXplTGFiZWxIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdENhY2hlU2l6ZUhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSW50ZWdlciB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZWZhdWx0V2l0aFZhbHVlLCB2YWx1ZSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuICIiOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IHRoaXMuYnVpbGRMYWJlbGVkU3Bpbm5lcigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlX2RlZmF1bHRDYWNoZVNpemUsCi0JCQl0aGlzLmJ1aWxkQ2FjaGVTaXplSG9sZGVyKCksCi0JCQktMSwKLQkJCS0xLAotCQkJSW50ZWdlci5NQVhfVkFMVUUsCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdENhY2hlU2l6ZUxhYmVsKGNvbnRhaW5lcikKLQkJKTsKLQotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIsIHNwaW5uZXIpOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGxheW91dCBvZiB0aGUgZ2l2ZW4gY29udGFpbmVyIGJ5IGNoYW5naW5nIHdoaWNoIHdpZGdldCB3aWxsCi0JICogZ3JhYiB0aGUgZXhjZXNzIG9mIGhvcml6b250YWwgc3BhY2UuIEJ5IGRlZmF1bHQsIHRoZSBjZW50ZXIgY29udHJvbCBncmFicwotCSAqIHRoZSBleGNlc3Mgc3BhY2UsIHdlIGNoYW5nZSBpdCB0byBiZSB0aGUgcmlnaHQgY29udHJvbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBjb250YWluaW5nIHRoZSBjb250cm9scyBuZWVkaW5nIHRoZWlyCi0JICogPGNvZGU+R3JpZERhdGE8L2NvZGU+IHRvIGJlIG1vZGlmaWVkIGZyb20gdGhlIGRlZmF1bHQgdmFsdWVzCi0JICogQHBhcmFtIHNwaW5uZXIgVGhlIHNwaW5uZXIgdGhhdCBnb3QgY3JlYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyLCBTcGlubmVyIHNwaW5uZXIpIHsKLQotCQkvLyBJdCBpcyBwb3NzaWJsZSB0aGUgc3Bpbm5lcidzIHBhcmVudCBpcyBub3QgdGhlIGNvbnRhaW5lciBvZiB0aGUKLQkJLy8gbGFiZWwsIHNwaW5uZXIgYW5kIHJpZ2h0IGNvbnRyb2wgKGEgcGFuZSBpcyBzb21ldGltZXMgcmVxdWlyZWQgZm9yCi0JCS8vIHBhaW50aW5nIHRoZSBzcGlubmVyJ3MgYm9yZGVyKQotCQlDb21wb3NpdGUgcGFuZUNvbnRhaW5lciA9IHNwaW5uZXIuZ2V0UGFyZW50KCk7Ci0KLQkJd2hpbGUgKGNvbnRhaW5lciAhPSBwYW5lQ29udGFpbmVyLmdldFBhcmVudCgpKSB7Ci0JCQlwYW5lQ29udGFpbmVyID0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKTsKLQkJfQotCi0JCUNvbnRyb2xbXSBjb250cm9scyA9IHBhbmVDb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWNvbnRyb2xzWzFdLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWNvbnRyb2xzWzJdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmVBbGlnblJpZ2h0KGNvbnRyb2xzWzJdKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9EZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0RlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiYThkNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0RlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jYWNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNhY2hpbmcuQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxDYWNoaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgQ2FjaGluZz4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKCBwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPENhY2hpbmcsIENhY2hlVHlwZT4gYnVpbGREZWZhdWx0Q2FjaGVUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoQ2FjaGluZy5DQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoZVR5cGVbXSBjaG9pY2VzKCkgewotCQkJCXJldHVybiBDYWNoZVR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoZVR5cGUgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdENhY2hlVHlwZURlZmF1bHQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoQ2FjaGVUeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZyhFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3MsIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUudGhpcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRDYWNoZVR5cGVEZWZhdWx0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQ2FjaGVUeXBlIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldENhY2hlVHlwZURlZmF1bHQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRDYWNoZVR5cGVMYWJlbCwKLQkJCXRoaXMuYnVpbGREZWZhdWx0Q2FjaGVUeXBlQ29tYm8oIGNvbnRhaW5lciksCi0JCQludWxsCQkvLyBUT0RPIElKcGFIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0RlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9EZWZhdWx0U2hhcmVkQ2FjaGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiZTc1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0RlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIERlZmF1bHRTaGFyZUNhY2hlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U2hhcmVkQ2FjaGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPENhY2hpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EZWZhdWx0U2hhcmVDYWNoZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBEZWZhdWx0U2hhcmVkQ2FjaGVDb21wb3NpdGUoCi0JCQkJCUFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIENhY2hpbmc+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFNoYXJlZENhY2hlRGVmYXVsdCh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0JCQkJCUJvb2xlYW4gZGVmYXVsdFZhbHVlID0gc3ViamVjdCgpLmdldERlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHQoKTsKLQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfZGVmYXVsdFNoYXJlZENhY2hlRGVmYXVsdExhYmVsLCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NoYXJlZENhY2hlRGVmYXVsdExhYmVsOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NoYXJlZENhY2hlRGVmYXVsdExhYmVsLAotCQkJdGhpcy5idWlsZERlZmF1bHRTaGFyZWRDYWNoZUhvbGRlcigpLAotCQkJdGhpcy5idWlsZERlZmF1bHRTaGFyZWRDYWNoZVN0cmluZ0hvbGRlcigpLAotCQkJbnVsbAotLy8JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkNBQ0hJTkdfU0hBUkVEX0NBQ0hFX0RFRkFVTFQKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0VjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNmY4OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0VjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8Q2FjaGluZz4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8Q2FjaGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBidWlsZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NlY3Rpb25UaXRsZSwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uCi0JCSk7Ci0KLQkJLy8gRGVmYXVsdCBwYW5lCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdyb3VwQm94TWFyZ2luKCk7Ci0KLQkJQ29tcG9zaXRlIGRlZmF1bHRQYW5lID0gYnVpbGRTdWJQYW5lKAotCQkJY29udGFpbmVyLAotCQkJMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luCi0JCSk7Ci0KLQkJLy8gRGVmYXVsdCBDYWNoZSBUeXBlCi0JCW5ldyBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKLQotCQkvLyBEZWZhdWx0IENhY2hlIFNpemUKLQkJbmV3IERlZmF1bHRDYWNoZVNpemVDb21wb3NpdGUodGhpcywgZGVmYXVsdFBhbmUpOwotCi0JCS8vIERlZmF1bHQgU2hhcmVkIENhY2hlCi0JCW5ldyBEZWZhdWx0U2hhcmVkQ2FjaGVDb21wb3NpdGUodGhpcywgZGVmYXVsdFBhbmUpOwotCi0JCS8vIEVudGl0aWVzTGlzdAotCQluZXcgRW50aXR5TGlzdENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0VudGl0eUNhY2hlUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9FbnRpdHlDYWNoZVByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjNTIxNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0VudGl0eUNhY2hlUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRW50aXR5Q2FjaGVQcm9wZXJ0aWVzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVudGl0eUNhY2hlUHJvcGVydGllcyBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JcHJpdmF0ZSBDYWNoaW5nIGNhY2hpbmc7Ci0JcHJpdmF0ZSBTdHJpbmcgZW50aXR5TmFtZTsKLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZVR5cGU+IGNhY2hlVHlwZUhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY2FjaGVUeXBlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gY2FjaGVTaXplSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjYWNoZVNpemVMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBzaGFyZWRDYWNoZUhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2hhcmVkQ2FjaGVMaXN0ZW5lcjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVFlQRV9QUk9QRVJUWSA9IENhY2hpbmcuQ0FDSEVfVFlQRV9QUk9QRVJUWTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX1BST1BFUlRZID0gQ2FjaGluZy5DQUNIRV9TSVpFX1BST1BFUlRZOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJFRF9DQUNIRV9QUk9QRVJUWSA9IENhY2hpbmcuU0hBUkVEX0NBQ0hFX1BST1BFUlRZOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFbnRpdHlDYWNoZVByb3BlcnRpZXMoQ2FjaGluZyBjYWNoaW5nLCBTdHJpbmcgZW50aXR5TmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmNhY2hpbmcgICAgPSBjYWNoaW5nOwotCQl0aGlzLmVudGl0eU5hbWUgPSBlbnRpdHlOYW1lOwotCQkKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IGNhY2hpbmdIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+KHRoaXMuY2FjaGluZyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShjYWNoaW5nSG9sZGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gY2FjaGluZ0hvbGRlcikgewotCQl0aGlzLmNhY2hlVHlwZUhvbGRlciA9IHRoaXMuYnVpbGRDYWNoZVR5cGVBQShjYWNoaW5nSG9sZGVyKTsKLQkJdGhpcy5jYWNoZVR5cGVMaXN0ZW5lciA9IHRoaXMuYnVpbGRDYWNoZVR5cGVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmNhY2hlVHlwZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYWNoZVR5cGVMaXN0ZW5lcik7Ci0KLQkJdGhpcy5jYWNoZVNpemVIb2xkZXIgPSB0aGlzLmJ1aWxkQ2FjaGVTaXplQUEoY2FjaGluZ0hvbGRlcik7Ci0JCXRoaXMuY2FjaGVTaXplTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2FjaGVTaXplQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5jYWNoZVNpemVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2FjaGVTaXplTGlzdGVuZXIpOwotCi0JCXRoaXMuc2hhcmVkQ2FjaGVIb2xkZXIgPSB0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVBQShjYWNoaW5nSG9sZGVyKTsKLQkJdGhpcy5zaGFyZWRDYWNoZUxpc3RlbmVyID0gdGhpcy5idWlsZFNoYXJlZENhY2hlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zaGFyZWRDYWNoZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zaGFyZWRDYWNoZUxpc3RlbmVyKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JcHVibGljIGJvb2xlYW4gZW50aXR5TmFtZUlzVmFsaWQoKSB7Ci0JCXJldHVybiAhU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmVudGl0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldENhY2hlU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZy5nZXRDYWNoZVNpemUodGhpcy5lbnRpdHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ2FjaGVUeXBlIGdldENhY2hlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGUodGhpcy5lbnRpdHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ2FjaGluZyBnZXRDYWNoaW5nKCkgewotCQlyZXR1cm4gY2FjaGluZzsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nLmdldERlZmF1bHRDYWNoZVNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgQ2FjaGVUeXBlIGdldERlZmF1bHRDYWNoZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hpbmcuZ2V0RGVmYXVsdENhY2hlVHlwZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5TmFtZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTaGFyZWRDYWNoZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZSh0aGlzLmVudGl0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRTaGFyZWRDYWNoZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZy5nZXREZWZhdWx0U2hhcmVkQ2FjaGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVNpemUoSW50ZWdlciBjYWNoZVNpemUpIHsKLQkJSW50ZWdlciBvbGRDYWNoZVNpemUgPSB0aGlzLmdldENhY2hlU2l6ZSgpOwotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQob2xkQ2FjaGVTaXplLCBjYWNoZVNpemUpKSB7Ci0JCQl0aGlzLmNhY2hpbmcuc2V0Q2FjaGVTaXplKGNhY2hlU2l6ZSwgdGhpcy5lbnRpdHlOYW1lKTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TSVpFX1BST1BFUlRZLCBvbGRDYWNoZVNpemUsIGNhY2hlU2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVR5cGUoQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotCQlDYWNoZVR5cGUgb2xkQ2FjaGVUeXBlID0gdGhpcy5nZXRDYWNoZVR5cGUoKTsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKG9sZENhY2hlVHlwZSwgY2FjaGVUeXBlKSkgewotCQkJdGhpcy5jYWNoaW5nLnNldENhY2hlVHlwZShjYWNoZVR5cGUsIHRoaXMuZW50aXR5TmFtZSk7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfVFlQRV9QUk9QRVJUWSwgb2xkQ2FjaGVUeXBlLCBjYWNoZVR5cGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hhcmVkQ2FjaGUoQm9vbGVhbiBzaGFyZWRDYWNoZSkgewotCQlCb29sZWFuIG9sZFNoYXJlZENhY2hlID0gdGhpcy5nZXRTaGFyZWRDYWNoZSgpOwotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQob2xkU2hhcmVkQ2FjaGUsIHNoYXJlZENhY2hlKSkgewotCQkJdGhpcy5jYWNoaW5nLnNldFNoYXJlZENhY2hlKHNoYXJlZENhY2hlLCB0aGlzLmVudGl0eU5hbWUpOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNIQVJFRF9DQUNIRV9QUk9QRVJUWSwgb2xkU2hhcmVkQ2FjaGUsIHNoYXJlZENhY2hlKTsKLQkJfQotCX0KLQkKLQkvLyAqKioqKioqKioqIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgKioqKioqKioqKgotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gYnVpbGRDYWNoZVR5cGVBQShQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBDYWNoZVR5cGU+KAotCQkJCQkJCQlzdWJqZWN0SG9sZGVyLCBDQUNIRV9UWVBFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoZVR5cGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDYWNoZVR5cGUoRW50aXR5Q2FjaGVQcm9wZXJ0aWVzLnRoaXMuZW50aXR5TmFtZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENhY2hlVHlwZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRW50aXR5Q2FjaGVQcm9wZXJ0aWVzLnRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9UWVBFX1BST1BFUlRZLCBlLmdldE9sZFZhbHVlKCksIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkQ2FjaGVTaXplQUEoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgSW50ZWdlcj4oCi0JCQkJCQkJCXN1YmplY3RIb2xkZXIsIENBQ0hFX1NJWkVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDYWNoZVNpemUoRW50aXR5Q2FjaGVQcm9wZXJ0aWVzLnRoaXMuZW50aXR5TmFtZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENhY2hlU2l6ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRW50aXR5Q2FjaGVQcm9wZXJ0aWVzLnRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TSVpFX1BST1BFUlRZLCBlLmdldE9sZFZhbHVlKCksIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2hhcmVkQ2FjaGVBQShQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPigKLQkJCQkJCQkJc3ViamVjdEhvbGRlciwgU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2hhcmVkQ2FjaGUoRW50aXR5Q2FjaGVQcm9wZXJ0aWVzLnRoaXMuZW50aXR5TmFtZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNoYXJlZENhY2hlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlFbnRpdHlDYWNoZVByb3BlcnRpZXMudGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNIQVJFRF9DQUNIRV9QUk9QRVJUWSwgZS5nZXRPbGRWYWx1ZSgpLCBlLmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5idWlsZFNpbXBsZVRvU3RyaW5nT24odGhpcywgc2IpOwotCQlzYi5hcHBlbmQoIiAoIik7Ci0JCXRoaXMudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoIm5hbWU6ICIpOwotCQlzYi5hcHBlbmQodGhpcy5lbnRpdHlOYW1lKTsKLQkJc2IuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlzYi5hcHBlbmQodGhpcy5nZXRDYWNoZVR5cGUoKSk7Ci0JCXNiLmFwcGVuZCgiLCBzaXplOiAiKTsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0Q2FjaGVTaXplKCkpOwotCQlzYi5hcHBlbmQoIiwgaXNTaGFyZWQ6ICIpOwotCQlzYi5hcHBlbmQodGhpcy5nZXRTaGFyZWRDYWNoZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0VudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9FbnRpdHlDYWNoaW5nUHJvcGVydHlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJlOGE2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0VudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlDYWNoaW5nUHJvcGVydHlDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8RW50aXR5Q2FjaGVQcm9wZXJ0aWVzPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlKEFic3RyYWN0UGFuZTxDYWNoaW5nPiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5Q2FjaGVQcm9wZXJ0aWVzPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBDYWNoZSBUeXBlCi0JCW5ldyBDYWNoZVR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBDYWNoZSBTaXplCi0JCW5ldyBDYWNoZVNpemVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBTaGFyZSBDYWNoZQotCQluZXcgU2hhcmVkQ2FjaGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL0VudGl0eUxpc3RDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRW50aXR5TGlzdENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjM5OGI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvRW50aXR5TGlzdENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jYWNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkpwdEVjbGlwc2VMaW5rVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci0KLS8qKgotICogIEVudGl0eUxpc3RDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eUxpc3RDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8Q2FjaGluZz4KLXsKLQlwdWJsaWMgRW50aXR5TGlzdENvbXBvc2l0ZShBYnN0cmFjdFBhbmU8Q2FjaGluZz4gcGFyZW50Q29tcG9zaXRlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IHRoaXMuYnVpbGRUaXRsZWRQYW5lKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkNhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2dyb3VwVGl0bGUKLQkJKTsKLQotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlDYWNoZVByb3BlcnRpZXM+IGVudGl0eUhvbGRlciA9IHRoaXMuYnVpbGRFbnRpdHlIb2xkZXIoKTsKLQotCQkvLyBFbnRpdGllcyBhZGQvcmVtb3ZlIGxpc3QgcGFuZQotCQluZXcgQWRkUmVtb3ZlTGlzdFBhbmU8Q2FjaGluZz4oCi0JCQl0aGlzLAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5idWlsZEVudGl0aWVzQWRhcHRlcigpLAotCQkJdGhpcy5idWlsZEVudGl0eUNhY2hpbmdMaXN0SG9sZGVyKCksCi0JCQllbnRpdHlIb2xkZXIsCi0JCQl0aGlzLmJ1aWxkRW50aXR5TGFiZWxQcm92aWRlcigpLAotCQkJbnVsbAkJCS8vCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkNBQ0hJTkdfRU5USVRJRVMKLQkJKTsKLQotCQkvLyBFbnRpdHkgQ2FjaGluZyBwcm9wZXJ0eSBwYW5lCi0JCUVudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZSBwYW5lID0gbmV3IEVudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQllbnRpdHlIb2xkZXIsCi0JCQljb250YWluZXIKLQkJKTsKLQkJdGhpcy5pbnN0YWxsUGFuZUVuYWJsZXIoZW50aXR5SG9sZGVyLCBwYW5lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZS5BZGFwdGVyIGJ1aWxkRW50aXRpZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZEVudGl0aWVzKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCUNhY2hpbmcgY2FjaGluZyA9IHN1YmplY3QoKTsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJRW50aXR5Q2FjaGVQcm9wZXJ0aWVzIGVudGl0eUNhY2hpbmcgPSAoRW50aXR5Q2FjaGVQcm9wZXJ0aWVzKSBpdGVtOwotCQkJCQljYWNoaW5nLnJlbW92ZUVudGl0eShlbnRpdHlDYWNoaW5nLmdldEVudGl0eU5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkRW50aXRpZXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCUlUeXBlIHR5cGUgPSB0aGlzLmNob29zZUVudGl0eSgpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5nZXRFbnRpdHlOYW1lKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQkJaWYgKGVudGl0eU5hbWUgPT0gbnVsbCkgewotCQkJCWVudGl0eU5hbWUgPSB0eXBlLmdldEVsZW1lbnROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCWlmKCAhIHRoaXMuc3ViamVjdCgpLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgewotCQkJCVN0cmluZyBlbnRpdHkgPSB0aGlzLnN1YmplY3QoKS5hZGRFbnRpdHkoZW50aXR5TmFtZSk7Ci0JCi0JCQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoZW50aXR5KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRFbnRpdHlOYW1lKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7Ci0KLQkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBzdWJqZWN0KCkucGVyc2lzdGVuY2VVbml0KCkuZ2V0UGVyc2lzdGVudFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0KLQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IG51bGwgJiYgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKSB7Ci0JCQlUeXBlTWFwcGluZyBtYXBwaW5nID0gcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkJaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlyZXR1cm4gKChFbnRpdHkpbWFwcGluZykuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElUeXBlIGNob29zZUVudGl0eSgpIHsKLQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcGFja2FnZUZyYWdtZW50Um9vdCgpOwotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IHJvb3QuZ2V0SmF2YVByb2plY3QoKSB9OwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShlbGVtZW50cyk7Ci0JCUlQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCVNlbGVjdGlvbkRpYWxvZyB0eXBlU2VsZWN0aW9uRGlhbG9nOwotCi0JCXRyeSB7Ci0JCQl0eXBlU2VsZWN0aW9uRGlhbG9nID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coCi0JCQkJc2hlbGwoKSwKLQkJCQlzZXJ2aWNlLAotCQkJCXNjb3BlLAotCQkJCUlKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9DTEFTU0VTLAotCQkJCWZhbHNlLAotCQkJCSIiCi0JCQkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0RWNsaXBzZUxpbmtVaVBsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dUaXRsZSk7Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nTWVzc2FnZSk7Ci0KLQkJaWYgKHR5cGVTZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJVHlwZSkgdHlwZVNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJSUphdmFQcm9qZWN0IHJvb3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiByb290LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkRW50aXR5TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlFbnRpdHlDYWNoZVByb3BlcnRpZXMgZW50aXR5Q2FjaGluZyA9IChFbnRpdHlDYWNoZVByb3BlcnRpZXMpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIGVudGl0eUNhY2hpbmcuZ2V0RW50aXR5TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5Q2FjaGVQcm9wZXJ0aWVzPiBidWlsZEVudGl0eUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5Q2FjaGVQcm9wZXJ0aWVzPigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RW50aXR5Q2FjaGVQcm9wZXJ0aWVzPiBidWlsZEVudGl0eUNhY2hpbmdMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZywgRW50aXR5Q2FjaGVQcm9wZXJ0aWVzPihidWlsZEVudGl0aWVzTGlzdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFbnRpdHlDYWNoZVByb3BlcnRpZXMgdHJhbnNmb3JtSXRlbShTdHJpbmcgaXRlbSkgewotCQkJCXJldHVybiBuZXcgRW50aXR5Q2FjaGVQcm9wZXJ0aWVzKHN1YmplY3QoKSwgaXRlbSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRW50aXRpZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPENhY2hpbmcsIFN0cmluZz4oCi0JCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDYWNoaW5nLkVOVElUSUVTX0xJU1RfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5lbnRpdGllcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZW50aXRpZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lRW5hYmxlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlDYWNoZVByb3BlcnRpZXM+IGVudGl0eUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZSBwYW5lKSB7Ci0KLQkJbmV3IFBhbmVFbmFibGVyKAotCQkJdGhpcy5idWlsZFBhbmVFbmFibGVySG9sZGVyKGVudGl0eUhvbGRlciksCi0JCQlwYW5lCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlDYWNoZVByb3BlcnRpZXM+IGVudGl0eUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eUNhY2hlUHJvcGVydGllcywgQm9vbGVhbj4oZW50aXR5SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oRW50aXR5Q2FjaGVQcm9wZXJ0aWVzIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmVudGl0eU5hbWVJc1ZhbGlkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2NhY2hpbmcvUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Y2RiYTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiIAotCQkJCQkJCQlleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8Q2FjaGluZz4KLQkJCQkJCQkJaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlPFBlcnNpc3RlbmNlVW5pdD4KLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQluZXcgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldFBhZ2VJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3RpdGxlOwotCX0KLQotCS8vICoqKioqKioqKiogTGF5b3V0ICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7Ci0JCQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gYnVpbGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL1NoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jYWNoaW5nL1NoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNmZlYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY2FjaGluZy9TaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jYWNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlRyaVN0YXRlQ2hlY2tCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgU2hhcmVkQ2FjaGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFNoYXJlZENhY2hlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPEVudGl0eUNhY2hlUHJvcGVydGllcz4KLXsKLQlwcml2YXRlIFRyaVN0YXRlQ2hlY2tCb3ggc2hhcmVkQ2FjaGVDaGVja0JveDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2hhcmVDYWNoZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlciBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgU2hhcmVkQ2FjaGVDb21wb3NpdGUoQWJzdHJhY3RQYW5lPEVudGl0eUNhY2hlUHJvcGVydGllcz4gcGFyZW50Q29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gYnVpbGRDYWNoaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eUNhY2hlUHJvcGVydGllcywgQ2FjaGluZz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoaW5nIHRyYW5zZm9ybV8oRW50aXR5Q2FjaGVQcm9wZXJ0aWVzIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENhY2hpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRBbmROb25EZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4oCi0JCQlidWlsZERlZmF1bHRBbmROb25EZWZhdWx0U2hhcmVkQ2FjaGVMaXN0SG9sZGVyKCkKLQkJKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQkJLy8gSWYgdGhlIG51bWJlciBvZiBMaXN0VmFsdWVNb2RlbCBlcXVhbHMgMSwgdGhhdCBtZWFucyB0aGUgc2hhcmVkCi0JCQkJLy8gQ2FjaGUgcHJvcGVydGllcyBpcyBub3Qgc2V0IChwYXJ0aWFsbHkgc2VsZWN0ZWQpLCB3aGljaCBtZWFucyB3ZQotCQkJCS8vIHdhbnQgdG8gc2VlIHRoZSBkZWZhdWx0IHZhbHVlIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKGxpc3RIb2xkZXIuc2l6ZSgpID09IDEpIHsKLQkJCQkJcmV0dXJuIChCb29sZWFuKSBsaXN0SG9sZGVyLmxpc3RJdGVyYXRvcigpLm5leHQoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfTsKLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0QW5kTm9uRGVmYXVsdFNoYXJlZENhY2hlTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPEJvb2xlYW4+PiBob2xkZXJzID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxCb29sZWFuPj4oMik7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkU2hhcmVkQ2FjaGVMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRTaGFyZWRDYWNoZUxpc3RIb2xkZXIoKSk7Ci0KLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxCb29sZWFuPiwgQm9vbGVhbj4oCi0JCQlob2xkZXJzCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KGJ1aWxkQ2FjaGluZ0hvbGRlcigpLCBDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCUJvb2xlYW4gdmFsdWUgPSBzdWJqZWN0LmdldFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0KCk7Ci0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPigKLQkJCWJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2hhcmVkQ2FjaGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eUNhY2hlUHJvcGVydGllcywgQm9vbGVhbj4oCi0JCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5Q2FjaGVQcm9wZXJ0aWVzLlNIQVJFRF9DQUNIRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNoYXJlZENhY2hlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U2hhcmVkQ2FjaGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTaGFyZWRDYWNoZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4oCi0JCQlidWlsZFNoYXJlZENhY2hlSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2hhcmVkQ2FjaGVTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRBbmROb25EZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0U2hhcmVkQ2FjaGVMYWJlbCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCQl0aGlzLnNoYXJlZENhY2hlQ2hlY2tCb3guc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLnNoYXJlZENhY2hlQ2hlY2tCb3ggPSB0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZUxhYmVsLAotCQkJdGhpcy5idWlsZFNoYXJlZENhY2hlSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLS8vCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DQUNISU5HX1NIQVJFRF9DQUNIRQotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0JhdGNoV3JpdGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9CYXRjaFdyaXRpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwMTUyMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0JhdGNoV3JpdGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5CYXRjaFdyaXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQmF0Y2hXcml0aW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxDb25uZWN0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmF0Y2hXcml0aW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBCYXRjaFdyaXRpbmdDb21wb3NpdGUoCi0JCQkJCUFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIENvbm5lY3Rpb24+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlciggcGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxDb25uZWN0aW9uLCBCYXRjaFdyaXRpbmc+IGJ1aWxkQmF0Y2hXcml0aW5nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q29ubmVjdGlvbiwgQmF0Y2hXcml0aW5nPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoQ29ubmVjdGlvbi5CQVRDSF9XUklUSU5HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQmF0Y2hXcml0aW5nW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gQmF0Y2hXcml0aW5nLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCYXRjaFdyaXRpbmcgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdEJhdGNoV3JpdGluZygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhCYXRjaFdyaXRpbmcgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgQmF0Y2hXcml0aW5nQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQmF0Y2hXcml0aW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0QmF0Y2hXcml0aW5nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQmF0Y2hXcml0aW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldEJhdGNoV3JpdGluZyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmF0Y2hXcml0aW5nTGFiZWwsCi0JCQl0aGlzLmJ1aWxkQmF0Y2hXcml0aW5nQ29tYm8oIGNvbnRhaW5lciksCi0JCQludWxsCQkvLyBUT0RPIElKcGFIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0NhY2hlU3RhdGVtZW50c1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjcwMjU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5UcmlTdGF0ZUNoZWNrQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci0KLS8qKgotICogIENhY2hlU3RhdGVtZW50c1Byb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPgotewotCXB1YmxpYyBDYWNoZVN0YXRlbWVudHNQcm9wZXJ0aWVzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhY2hlU3RhdGVtZW50c0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLkNBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0Q2FjaGVTdGF0ZW1lbnRzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldENhY2hlU3RhdGVtZW50cyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkQ2FjaGVTdGF0ZW1lbnRzU2l6ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLkNBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlJbnRlZ2VyIHZhbHVlID0gc3ViamVjdC5nZXRDYWNoZVN0YXRlbWVudHNTaXplKCk7Ci0KLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IC0xOwotCQkJCX0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gLTEpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldENhY2hlU3RhdGVtZW50c1NpemUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdENhY2hlU3RhdGVtZW50c1NpemVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgIiIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdENhY2hlU3RhdGVtZW50c1NpemUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoSW50ZWdlci5NSU5fVkFMVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBidWlsZERlZmF1bHRDYWNoZVN0YXRlbWVudHNTaXplTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUxhYmVsIGxhYmVsID0gYnVpbGRMYWJlbCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZWZhdWx0V2l0aG91dFZhbHVlCi0JCSk7Ci0KLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcigKLQkJCW5ldyBMYWJlbGVkTGFiZWwobGFiZWwpLAotCQkJYnVpbGREZWZhdWx0Q2FjaGVTdGF0ZW1lbnRzU2l6ZUxhYmVsSG9sZGVyKCkKLQkJKTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRDYWNoZVN0YXRlbWVudHNTaXplTGFiZWxIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdENhY2hlU3RhdGVtZW50c1NpemVIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEludGVnZXIgdmFsdWUpIHsKLQotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGVmYXVsdFdpdGhWYWx1ZSwgdmFsdWUpOwotCQkJCX0KLQotCQkJCXJldHVybiAiIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBjYWNoZVN0YXRlbWVudHNIb2xkZXIgPSBidWlsZENhY2hlU3RhdGVtZW50c0hvbGRlcigpOwotCi0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSB0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfY2FjaGVTdGF0ZW1lbnRzTGFiZWwsCi0JCQljYWNoZVN0YXRlbWVudHNIb2xkZXIsCi0JCQludWxsCi0JCSk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gdGhpcy5idWlsZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQl0aGlzLmJ1aWxkQ2FjaGVTdGF0ZW1lbnRzU2l6ZUhvbGRlcigpLAotCQkJLTEsCi0JCQktMSwKLQkJCUludGVnZXIuTUFYX1ZBTFVFCi0JCSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSB0aGlzLmJ1aWxkRGVmYXVsdENhY2hlU3RhdGVtZW50c1NpemVMYWJlbChjb250YWluZXIpOwotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJY2hlY2tCb3guZ2V0Q2hlY2tCb3goKSwKLQkJCShzcGlubmVyLmdldFBhcmVudCgpID09IGNvbnRhaW5lcikgPyBzcGlubmVyIDogc3Bpbm5lci5nZXRQYXJlbnQoKSwKLQkJCWxhYmVsLAotCQkJbnVsbAotLy8JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLgotCQkpOwotCi0JCXRoaXMuaW5zdGFsbENvbnRyb2xFbmFibGVyKGNhY2hlU3RhdGVtZW50c0hvbGRlciwgbGFiZWwsIHNwaW5uZXIpOwotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lciwgc3Bpbm5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxDb250cm9sRW5hYmxlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBjYWNoZVN0YXRlbWVudHNIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCBsYWJlbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwaW5uZXIgc3Bpbm5lcikgewotCi0JCW5ldyBDb250cm9sRW5hYmxlcihjYWNoZVN0YXRlbWVudHNIb2xkZXIsIGxhYmVsLCBzcGlubmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBsYXlvdXQgb2YgdGhlIGdpdmVuIGNvbnRhaW5lciBieSBjaGFuZ2luZyB3aGljaCB3aWRnZXQgd2lsbAotCSAqIGdyYWIgdGhlIGV4Y2VzcyBvZiBob3Jpem9udGFsIHNwYWNlLiBCeSBkZWZhdWx0LCB0aGUgY2VudGVyIGNvbnRyb2wgZ3JhYnMKLQkgKiB0aGUgZXhjZXNzIHNwYWNlLCB3ZSBjaGFuZ2UgaXQgdG8gYmUgdGhlIHJpZ2h0IGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgY29udGFpbmluZyB0aGUgY29udHJvbHMgbmVlZGluZyB0aGVpcgotCSAqIDxjb2RlPkdyaWREYXRhPC9jb2RlPiB0byBiZSBtb2RpZmllZCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlcwotCSAqIEBwYXJhbSBzcGlubmVyIFRoZSBzcGlubmVyIHRoYXQgZ290IGNyZWF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3Bpbm5lciBzcGlubmVyKSB7Ci0KLQkJLy8gSXQgaXMgcG9zc2libGUgdGhlIHNwaW5uZXIncyBwYXJlbnQgaXMgbm90IHRoZSBjb250YWluZXIgb2YgdGhlCi0JCS8vIGxhYmVsLCBzcGlubmVyIGFuZCByaWdodCBjb250cm9sIChhIHBhbmUgaXMgc29tZXRpbWVzIHJlcXVpcmVkIGZvcgotCQkvLyBwYWludGluZyB0aGUgc3Bpbm5lcidzIGJvcmRlcikKLQkJQ29tcG9zaXRlIHBhbmVDb250YWluZXIgPSBzcGlubmVyLmdldFBhcmVudCgpOwotCi0JCXdoaWxlIChjb250YWluZXIgIT0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKSkgewotCQkJcGFuZUNvbnRhaW5lciA9IHBhbmVDb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlDb250cm9sW10gY29udHJvbHMgPSBwYW5lQ29udGFpbmVyLmdldENoaWxkcmVuKCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQljb250cm9sc1sxXS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljb250cm9sc1syXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmVtb3ZlQWxpZ25SaWdodChjb250cm9sc1syXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYTQwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+Ci17Ci0JcHVibGljIENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRUaXRsZWRQYW5lKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0RhdGFiYXNlX0dyb3VwQm94Ci0JCSk7Ci0KLQkJbmV3IERhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0RhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0RhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYTI1MzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9EYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbEVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBEYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8Q29ubmVjdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRKdGFEYXRhU291cmNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRKdGFEYXRhU291cmNlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRKdGFEYXRhU291cmNlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEpUQURhdGFTb3VyY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLCBCb29sZWFuPihidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5vbkp0YURhdGFTb3VyY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLk5PTl9KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXROb25KdGFEYXRhU291cmNlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXROb25KdGFEYXRhU291cmNlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vbkpUQURhdGFTb3VyY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLCBCb29sZWFuPihidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUgPT0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4gYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCi0JCWNvbnRhaW5lciA9IGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7Ci0KLQkJLy8gSlRBIERhdGEgU291cmNlCi0JCVRleHQgdGV4dCA9IHRoaXMuYnVpbGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfanRhRGF0YVNvdXJjZUxhYmVsLAotCQkJYnVpbGRKdGFEYXRhU291cmNlSG9sZGVyKCkKLQkJKTsKLQotCQl0aGlzLmluc3RhbGxKVEFEYXRhU291cmNlQ29udHJvbEVuYWJsZXIodGV4dCk7Ci0KLQkJLy8gTm9uLUpUQSBEYXRhIFNvdXJjZQotCQl0ZXh0ID0gdGhpcy5idWlsZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9ub25KdGFEYXRhU291cmNlTGFiZWwsCi0JCQlidWlsZE5vbkp0YURhdGFTb3VyY2VIb2xkZXIoKQotCQkpOwotCi0JCXRoaXMuaW5zdGFsbE5vbkpUQURhdGFTb3VyY2VDb250cm9sRW5hYmxlcih0ZXh0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbEpUQURhdGFTb3VyY2VDb250cm9sRW5hYmxlcihUZXh0IHRleHQpIHsKLQkJbmV3IENvbnRyb2xFbmFibGVyKGJ1aWxkSlRBRGF0YVNvdXJjZUhvbGRlcigpLCB0ZXh0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbE5vbkpUQURhdGFTb3VyY2VDb250cm9sRW5hYmxlcihUZXh0IHRleHQpIHsKLQkJbmV3IENvbnRyb2xFbmFibGVyKGJ1aWxkTm9uSlRBRGF0YVNvdXJjZUhvbGRlcigpLCB0ZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNjdhMjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rQ29ubmVjdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb25uZWN0aW9uQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPENvbm5lY3Rpb24+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rQ29ubmVjdGlvbkNvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RGb3JtUGFuZTxDb25uZWN0aW9uPiBzdWJqZWN0SG9sZGVyLAotCQkJCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdyb3VwQm94TWFyZ2luKCkgKiAyOwotCi0JCWNvbnRhaW5lciA9IGJ1aWxkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfc2VjdGlvblRpdGxlLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24KLQkJKTsKLQotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGJ1aWxkU3ViUGFuZSgKLQkJCWNvbnRhaW5lciwKLQkJCTAsIGdyb3VwQm94TWFyZ2luLCAxMCwgZ3JvdXBCb3hNYXJnaW4KLQkJKTsKLQotCQluZXcgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlKHRoaXMsIHN1YlBhbmUpOwotCi0JCW5ldyBCYXRjaFdyaXRpbmdDb21wb3NpdGUodGhpcywgc3ViUGFuZSk7Ci0KLQkJbmV3IENhY2hlU3RhdGVtZW50c1Byb3BlcnRpZXNDb21wb3NpdGUodGhpcywgc3ViUGFuZSk7Ci0KLQkJbmV3IE5hdGl2ZVNxbENvbXBvc2l0ZSh0aGlzLCBzdWJQYW5lKTsKLQotCQluZXcgQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZjgwNzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEpkYmNCaW5kUGFyYW1ldGVyc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdFBhbmU8PyBleHRlbmRzIENvbm5lY3Rpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQmluZFBhcmFtZXRlcnNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5CSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0QmluZFBhcmFtZXRlcnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0QmluZFBhcmFtZXRlcnModmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEJpbmRQYXJhbWV0ZXJzU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRCaW5kUGFyYW1ldGVyc0hvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdEJpbmRQYXJhbWV0ZXJzKCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5idWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmluZFBhcmFtZXRlcnNMYWJlbCwKLQkJCXRoaXMuYnVpbGRCaW5kUGFyYW1ldGVyc0hvbGRlcigpLAotCQkJdGhpcy5idWlsZEJpbmRQYXJhbWV0ZXJzU3RyaW5nSG9sZGVyKCksCi0JCQludWxsCi0vLwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYmU2YzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsdGVyZWRJdGVtc1NlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiAgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPgotewotCS8qKgotCSAqIFRoZSBjb25zdGFudCBJRCB1c2VkIHRvIHJldHJpZXZlIHRoZSBkaWFsb2cgc2V0dGluZ3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19TRVRUSU5HUyA9ICJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuZGlhbG9ncy5Db25uZWN0aW9uRGlhbG9nIjsKLQotCXB1YmxpYyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+IHBhcmVudENvbXBvc2l0ZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQYXNzd29yZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQYXNzd29yZCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0UGFzc3dvcmQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRQb3B1bGF0ZUZyb21Db25uZWN0aW9uQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXByb21wdENvbm5lY3Rpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVcmxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFVybCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0VXJsKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVc2VySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5VU0VSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VXNlcigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0VXNlcih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gUG9wdWxhdGUgZnJvbSBDb25uZWN0aW9uIGh5cGVybGluawotCQl0aGlzLmJ1aWxkSHlwZXJMaW5rKAotCQkJY29udGFpbmVyLAotCQkJIlBvcHVsYXRlIGZyb20gQ29ubmVjdGlvbi4uLiIsCi0JCQlidWlsZFBvcHVsYXRlRnJvbUNvbm5lY3Rpb25BY3Rpb24oKQotCQkpOwotCi0JCS8vIERyaXZlcgotCQluZXcgSmRiY0RyaXZlckNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCi0JCS8vIFVybAotCQl0aGlzLmJ1aWxkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3VybExhYmVsLAotCQkJYnVpbGRVcmxIb2xkZXIoKQotCQkpOwotCi0JCS8vIFVzZXIKLQkJdGhpcy5idWlsZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91c2VyTGFiZWwsCi0JCQlidWlsZFVzZXJIb2xkZXIoKQotCQkpOwotCi0JCS8vIFBhc3N3b3JkCi0JCXRoaXMuYnVpbGRMYWJlbGVkUGFzc3dvcmRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9wYXNzd29yZExhYmVsLAotCQkJYnVpbGRQYXNzd29yZEhvbGRlcigpCi0JCSk7Ci0KLQkJLy8gQmluZCBQYXJhbWV0ZXJzCi0JCW5ldyBKZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvbXB0Q29ubmVjdGlvbigpIHsKLQotCQlDb25uZWNpb25TZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IENvbm5lY2lvblNlbGVjdGlvbkRpYWxvZygpOwotCi0JCWlmIChkaWFsb2cub3BlbigpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBkaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCQlDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlID0gSnB0RGJQbHVnaW4uaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkoKS5jb25uZWN0aW9uUHJvZmlsZU5hbWVkKG5hbWUpOwotCi0JCQlDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBzdWJqZWN0KCk7Ci0JCQljb25uZWN0aW9uLnNldFVybChwcm9maWxlLmdldFVybCgpKTsKLQkJCWNvbm5lY3Rpb24uc2V0VXNlcihwcm9maWxlLmdldFVzZXJOYW1lKCkpOwotCQkJY29ubmVjdGlvbi5zZXRQYXNzd29yZChwcm9maWxlLmdldFVzZXJQYXNzd29yZCgpKTsKLQkJCWNvbm5lY3Rpb24uc2V0RHJpdmVyKHByb2ZpbGUuZ2V0RHJpdmVyQ2xhc3NOYW1lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkaWFsb2cgc2hvd3MgdGhlIGxpc3Qgb2YgcG9zc2libGUgY29ubmVjdGlvbiBuYW1lcyBhbmQgbGV0cyB0aGUgdXNlcgotCSAqIHRoZSBvcHRpb24gdG8gZmlsdGVyIHRoZW0gdXNpbmcgYSBzZWFyY2ggZmllbGQuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIENvbm5lY2lvblNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIEZpbHRlcmVkSXRlbXNTZWxlY3Rpb25EaWFsb2cgewotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBpbmdTZWxlY3Rpb25EaWFsb2c8L2NvZGU+LgotCQkgKi8KLQkJcHJpdmF0ZSBDb25uZWNpb25TZWxlY3Rpb25EaWFsb2coKSB7Ci0JCQlzdXBlcihKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUudGhpcy5zaGVsbCgpLCBmYWxzZSk7Ci0JCQlzZXRNZXNzYWdlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19NZXNzYWdlKTsKLQkJCXNldFRpdGxlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19UaXRsZSk7Ci0JCQlzZXRMaXN0TGFiZWxQcm92aWRlcihidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCQlzZXREZXRhaWxzTGFiZWxQcm92aWRlcihidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoZWxlbWVudCA9PSBudWxsKSA/ICIiIDogZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRXh0ZW5kZWRDb250ZW50QXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlbXNGaWx0ZXIgY3JlYXRlRmlsdGVyKCkgewotCQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uSXRlbXNGaWx0ZXIoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGVudFByb3ZpZGVyKEFic3RyYWN0Q29udGVudFByb3ZpZGVyIHByb3ZpZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1zRmlsdGVyIGl0ZW1zRmlsdGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCQltb25pdG9yLmJlZ2luVGFzayhudWxsLCAtMSk7Ci0KLQkJCXRyeSB7Ci0JCQkJLy8gQWRkIHRoZSBjb25uZWN0aW9uIG5hbWVzIHRvIHRoZSBkaWFsb2cKLQkJCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gbmFtZXMgPSBKcHREYlBsdWdpbi5pbnN0YW5jZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSgpLmNvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKTsgbmFtZXMuaGFzTmV4dCgpOyApIHsKLQkJCQkJcHJvdmlkZXIuYWRkKG5hbWVzLm5leHQoKSwgaXRlbXNGaWx0ZXIpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0KLQkJCUlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IEpwdFVpUGx1Z2luLmdldFBsdWdpbigpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19TRVRUSU5HUyk7Ci0KLQkJCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncy5hZGROZXdTZWN0aW9uKERJQUxPR19TRVRUSU5HUyk7Ci0JCQl9Ci0KLQkJCXJldHVybiBzZXR0aW5nczsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxTdHJpbmc+IGdldEl0ZW1zQ29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgaXRlbTEsIFN0cmluZyBpdGVtMikgewotCQkJCQlyZXR1cm4gaXRlbTEuY29tcGFyZVRvKGl0ZW0yKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlSXRlbShPYmplY3QgaXRlbSkgewotCi0JCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0VWlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiIiwgbnVsbCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSB0aGUgZmlsdGVyIHJlc3BvbnNpYmxlIHRvIHJlbW92ZSBhbnkgY29ubmVjdGlvbiBuYW1lIGJhc2VkIG9uCi0JCSAqIHRoZSBwYXR0ZXJuIGVudGVyZWQgaW4gdGhlIHRleHQgZmllbGQuCi0JCSAqLwotCQlwcml2YXRlIGNsYXNzIENvbm5lY3Rpb25JdGVtc0ZpbHRlciBleHRlbmRzIEl0ZW1zRmlsdGVyIHsKLQotCQkJLyoqCi0JCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbm5lY3Rpb25JdGVtc0ZpbHRlcjwvY29kZT4uCi0JCQkgKi8KLQkJCUNvbm5lY3Rpb25JdGVtc0ZpbHRlcigpIHsKLQotCQkJCXN1cGVyKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgcGF0dGVybiBpcyBlbXB0eSwgd2Ugc3BlY2lmeSAqIGluIG9yZGVyCi0JCQkJLy8gdG8gc2hvdyBhbGwgdGhlIG1hcHBpbmcgdHlwZXMKLQkJCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRQYXR0ZXJuKCkpKSB7Ci0JCQkJCXBhdHRlcm5NYXRjaGVyLnNldFBhdHRlcm4oIioiKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKi8KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaXNDb25zaXN0ZW50SXRlbShPYmplY3QgaXRlbSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICovCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIG1hdGNoSXRlbShPYmplY3QgaXRlbSkgewotCQkJCXJldHVybiBtYXRjaGVzKGl0ZW0udG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjRHJpdmVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNEcml2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0MjI3Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNEcml2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkpwdEVjbGlwc2VMaW5rVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgSmRiY0RyaXZlckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY0RyaXZlckNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RXZlbnRMaXN0ZW5lckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEpkYmNEcml2ZXJDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBDb25uZWN0aW9uPiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPENvbm5lY3Rpb24+IGluaXRpYWxpemVDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxDb25uZWN0aW9uPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgU3RyaW5nPigKLQkJCQkJCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERyaXZlcigpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQl0aGlzLnN1YmplY3Quc2V0RHJpdmVyKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdCgpLmdldERyaXZlcigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgbGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2RyaXZlckxhYmVsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLnN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQkJCUlKYXZhUHJvamVjdCByb290ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHJvb3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpwdEVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRUeXBlKCkgewotCQkJCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0KLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpOwotCQkJCQl0aGlzLnN1YmplY3QoKS5zZXREcml2ZXIoY2xhc3NOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YTA3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+Ci17Ci0JcHVibGljIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUsIEJvb2xlYW4+KGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPiBidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGJ1aWxkVGl0bGVkUGFuZSgKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDEwKSwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5KZGJjUHJvcGVydGllc0NvbXBvc2l0ZV9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Qb29sX0dyb3VwQm94Ci0JCSk7Ci0KLQkJbmV3IEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCi0JCWNvbnRhaW5lciA9IGJ1aWxkUGFuZShjb250YWluZXIsIG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQotCQluZXcgSmRiY1JlYWRDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgSmRiY1dyaXRlQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQotCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZUVuYWJsZXIoKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcihidWlsZFBhbmVFbmFibGVySG9sZGVyKCksIHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGZlNDE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBKZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+Ci17Ci0JcHVibGljIEpkYmNSZWFkQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+IHBhcmVudENvbXBvc2l0ZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5idWlsZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NlY3Rpb25UaXRsZQotCQkpOwotCi0JCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCi0JCWRhdGEgPSAoR3JpZERhdGEpIGdldENvbnRyb2woKS5nZXRMYXlvdXREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCi0JCS8vIFJlYWQgQ29ubmVjdGlvbnMgU2hhcmVkCi0JCW5ldyBKZGJjUmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gUmVhZCBDb25uZWN0aW9ucyBNaW5pbXVtCi0JCW5ldyBKZGJjUmVhZENvbm5lY3Rpb25zTWluQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gUmVhZCBDb25uZWN0aW9ucyBNYXhpbXVtCi0JCW5ldyBKZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uc01heENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2E5M2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZENvbnRyb2xVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLQotLyoqCi0gKiBKZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8Q29ubmVjdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY1JlYWRDb25uZWN0aW9uc01heENvbXBvc2l0ZShBYnN0cmFjdFBhbmU8Q29ubmVjdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFJlYWRDb25uZWN0aW9uc01heEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCUludGVnZXIgdmFsdWUgPSBzdWJqZWN0LmdldFJlYWRDb25uZWN0aW9uc01heCgpOwotCi0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSAtMTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlID09IC0xKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRSZWFkQ29ubmVjdGlvbnNNYXgodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdFJlYWRDb25uZWN0aW9uc01heEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCAiIikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWF4KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEludGVnZXIuTUlOX1ZBTFVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNYXhMYWJlbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBidWlsZExhYmVsKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRlZmF1bHRXaXRob3V0VmFsdWUKLQkJKTsKLQotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKAotCQkJbmV3IExhYmVsZWRMYWJlbChsYWJlbCksCi0JCQlidWlsZERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNYXhMYWJlbEhvbGRlcigpCi0JCSk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWF4TGFiZWxIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFJlYWRDb25uZWN0aW9uc01heEhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSW50ZWdlciB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZWZhdWx0V2l0aFZhbHVlLCB2YWx1ZSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuICIiOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IHRoaXMuYnVpbGRMYWJlbGVkU3Bpbm5lcigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zTWF4TGFiZWwsCi0JCQl0aGlzLmJ1aWxkUmVhZENvbm5lY3Rpb25zTWF4SG9sZGVyKCksCi0JCQktMSwKLQkJCS0xLAotCQkJSW50ZWdlci5NQVhfVkFMVUUsCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFJlYWRDb25uZWN0aW9uc01heExhYmVsKGNvbnRhaW5lcikKLQkJKTsKLQotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIsIHNwaW5uZXIpOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGxheW91dCBvZiB0aGUgZ2l2ZW4gY29udGFpbmVyIGJ5IGNoYW5naW5nIHdoaWNoIHdpZGdldCB3aWxsCi0JICogZ3JhYiB0aGUgZXhjZXNzIG9mIGhvcml6b250YWwgc3BhY2UuIEJ5IGRlZmF1bHQsIHRoZSBjZW50ZXIgY29udHJvbCBncmFicwotCSAqIHRoZSBleGNlc3Mgc3BhY2UsIHdlIGNoYW5nZSBpdCB0byBiZSB0aGUgcmlnaHQgY29udHJvbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBjb250YWluaW5nIHRoZSBjb250cm9scyBuZWVkaW5nIHRoZWlyCi0JICogPGNvZGU+R3JpZERhdGE8L2NvZGU+IHRvIGJlIG1vZGlmaWVkIGZyb20gdGhlIGRlZmF1bHQgdmFsdWVzCi0JICogQHBhcmFtIHNwaW5uZXIgVGhlIHNwaW5uZXIgdGhhdCBnb3QgY3JlYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyLCBTcGlubmVyIHNwaW5uZXIpIHsKLQotCQkvLyBJdCBpcyBwb3NzaWJsZSB0aGUgc3Bpbm5lcidzIHBhcmVudCBpcyBub3QgdGhlIGNvbnRhaW5lciBvZiB0aGUKLQkJLy8gbGFiZWwsIHNwaW5uZXIgYW5kIHJpZ2h0IGNvbnRyb2wgKGEgcGFuZSBpcyBzb21ldGltZXMgcmVxdWlyZWQgZm9yCi0JCS8vIHBhaW50aW5nIHRoZSBzcGlubmVyJ3MgYm9yZGVyKQotCQlDb21wb3NpdGUgcGFuZUNvbnRhaW5lciA9IHNwaW5uZXIuZ2V0UGFyZW50KCk7Ci0KLQkJd2hpbGUgKGNvbnRhaW5lciAhPSBwYW5lQ29udGFpbmVyLmdldFBhcmVudCgpKSB7Ci0JCQlwYW5lQ29udGFpbmVyID0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKTsKLQkJfQotCi0JCUNvbnRyb2xbXSBjb250cm9scyA9IHBhbmVDb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWNvbnRyb2xzWzFdLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWNvbnRyb2xzWzJdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmVBbGlnblJpZ2h0KGNvbnRyb2xzWzJdKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zTWluQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjNWY4OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotCi0vKioKLSAqIEpkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmRiY1JlYWRDb25uZWN0aW9uc01pbkNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmRiY1JlYWRDb25uZWN0aW9uc01pbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjUmVhZENvbm5lY3Rpb25zTWluQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkUmVhZENvbm5lY3Rpb25zTWluSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJSW50ZWdlciB2YWx1ZSA9IHN1YmplY3QuZ2V0UmVhZENvbm5lY3Rpb25zTWluKCk7Ci0KLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IC0xOwotCQkJCX0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gLTEpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFJlYWRDb25uZWN0aW9uc01pbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWluSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksICIiKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNaW4oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoSW50ZWdlci5NSU5fVkFMVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkRGVmYXVsdFJlYWRDb25uZWN0aW9uc01pbkxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlMYWJlbCBsYWJlbCA9IGJ1aWxkTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGVmYXVsdFdpdGhvdXRWYWx1ZQotCQkpOwotCi0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIoCi0JCQluZXcgTGFiZWxlZExhYmVsKGxhYmVsKSwKLQkJCWJ1aWxkRGVmYXVsdFJlYWRDb25uZWN0aW9uc01pbkxhYmVsSG9sZGVyKCkKLQkJKTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRSZWFkQ29ubmVjdGlvbnNNaW5MYWJlbEhvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXIsIFN0cmluZz4oYnVpbGREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWluSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJbnRlZ2VyIHZhbHVlKSB7Ci0KLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRlZmF1bHRXaXRoVmFsdWUsIHZhbHVlKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gIiI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gdGhpcy5idWlsZExhYmVsZWRTcGlubmVyKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNNaW5MYWJlbCwKLQkJCXRoaXMuYnVpbGRSZWFkQ29ubmVjdGlvbnNNaW5Ib2xkZXIoKSwKLQkJCS0xLAotCQkJLTEsCi0JCQlJbnRlZ2VyLk1BWF9WQUxVRSwKLQkJCXRoaXMuYnVpbGREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWluTGFiZWwoY29udGFpbmVyKQotCQkpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lciwgc3Bpbm5lcik7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgbGF5b3V0IG9mIHRoZSBnaXZlbiBjb250YWluZXIgYnkgY2hhbmdpbmcgd2hpY2ggd2lkZ2V0IHdpbGwKLQkgKiBncmFiIHRoZSBleGNlc3Mgb2YgaG9yaXpvbnRhbCBzcGFjZS4gQnkgZGVmYXVsdCwgdGhlIGNlbnRlciBjb250cm9sIGdyYWJzCi0JICogdGhlIGV4Y2VzcyBzcGFjZSwgd2UgY2hhbmdlIGl0IHRvIGJlIHRoZSByaWdodCBjb250cm9sLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIGNvbnRhaW5pbmcgdGhlIGNvbnRyb2xzIG5lZWRpbmcgdGhlaXIKLQkgKiA8Y29kZT5HcmlkRGF0YTwvY29kZT4gdG8gYmUgbW9kaWZpZWQgZnJvbSB0aGUgZGVmYXVsdCB2YWx1ZXMKLQkgKiBAcGFyYW0gc3Bpbm5lciBUaGUgc3Bpbm5lciB0aGF0IGdvdCBjcmVhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIsIFNwaW5uZXIgc3Bpbm5lcikgewotCi0JCS8vIEl0IGlzIHBvc3NpYmxlIHRoZSBzcGlubmVyJ3MgcGFyZW50IGlzIG5vdCB0aGUgY29udGFpbmVyIG9mIHRoZQotCQkvLyBsYWJlbCwgc3Bpbm5lciBhbmQgcmlnaHQgY29udHJvbCAoYSBwYW5lIGlzIHNvbWV0aW1lcyByZXF1aXJlZCBmb3IKLQkJLy8gcGFpbnRpbmcgdGhlIHNwaW5uZXIncyBib3JkZXIpCi0JCUNvbXBvc2l0ZSBwYW5lQ29udGFpbmVyID0gc3Bpbm5lci5nZXRQYXJlbnQoKTsKLQotCQl3aGlsZSAoY29udGFpbmVyICE9IHBhbmVDb250YWluZXIuZ2V0UGFyZW50KCkpIHsKLQkJCXBhbmVDb250YWluZXIgPSBwYW5lQ29udGFpbmVyLmdldFBhcmVudCgpOwotCQl9Ci0KLQkJQ29udHJvbFtdIGNvbnRyb2xzID0gcGFuZUNvbnRhaW5lci5nZXRDaGlsZHJlbigpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJY29udHJvbHNbMV0uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJY29udHJvbHNbMl0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJlbW92ZUFsaWduUmlnaHQoY29udHJvbHNbMl0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdiNjU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjUmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5SZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY1JlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFJlYWRDb25uZWN0aW9uc1NoYXJlZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFJlYWRDb25uZWN0aW9uc1NoYXJlZFN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkUmVhZENvbm5lY3Rpb25zU2hhcmVkSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NoYXJlZExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTaGFyZWRMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTaGFyZWRMYWJlbCwKLQkJCXRoaXMuYnVpbGRSZWFkQ29ubmVjdGlvbnNTaGFyZWRIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRSZWFkQ29ubmVjdGlvbnNTaGFyZWRTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLS8vCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MmM3NDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEpkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+Ci17Ci0JcHVibGljIEpkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IHRoaXMuYnVpbGRTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zU2VjdGlvblRpdGxlCi0JCSk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29udGFpbmVyLmdldExheW91dERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0KLQkJZGF0YSA9IChHcmlkRGF0YSkgZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0KLQkJLy8gVGhpcyB3aWxsIGFkZCBzcGFjZSB0byBoYXZlIHRoZSBzYW1lIGxheW91dCB0aGFuIHJlYWQgY29ubmVjdGlvbiBwb29sCi0JCUJ1dHRvbiBzcGFjZSA9IHRoaXMuZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNoZWNrQm94KGNvbnRhaW5lciwgIm0iKTsKLQkJUG9pbnQgc2l6ZSA9IHNwYWNlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWNvbnRhaW5lciA9IHRoaXMuYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgc2l6ZS55ICsgNSk7Ci0JCXNwYWNlLmRpc3Bvc2UoKTsKLQotCQkvLyBXcml0ZSBDb25uZWN0aW9ucyBNaW5pbXVtCi0JCW5ldyBKZGJjV3JpdGVDb25uZWN0aW9uc01pbkNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCi0JCS8vIFdyaXRlIENvbm5lY3Rpb25zIE1heGltdW0KLQkJbmV3IEpkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTMzNmFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotCi0vKioKLSAqIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZShBYnN0cmFjdFBhbmU8Q29ubmVjdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFdyaXRlQ29ubmVjdGlvbnNNYXhIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJSW50ZWdlciB2YWx1ZSA9IHN1YmplY3QuZ2V0V3JpdGVDb25uZWN0aW9uc01heCgpOwotCi0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSAtMTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlID09IC0xKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRXcml0ZUNvbm5lY3Rpb25zTWF4KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWF4SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksICIiKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWF4KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEludGVnZXIuTUlOX1ZBTFVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWF4TGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUxhYmVsIGxhYmVsID0gYnVpbGRMYWJlbCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZWZhdWx0V2l0aG91dFZhbHVlCi0JCSk7Ci0KLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcigKLQkJCW5ldyBMYWJlbGVkTGFiZWwobGFiZWwpLAotCQkJYnVpbGREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01heExhYmVsSG9sZGVyKCkKLQkJKTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWF4TGFiZWxIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNYXhIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEludGVnZXIgdmFsdWUpIHsKLQotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGVmYXVsdFdpdGhWYWx1ZSwgdmFsdWUpOwotCQkJCX0KLQotCQkJCXJldHVybiAiIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSB0aGlzLmJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3dyaXRlQ29ubmVjdGlvbnNNYXhMYWJlbCwKLQkJCXRoaXMuYnVpbGRXcml0ZUNvbm5lY3Rpb25zTWF4SG9sZGVyKCksCi0JCQktMSwKLQkJCS0xLAotCQkJSW50ZWdlci5NQVhfVkFMVUUsCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNYXhMYWJlbChjb250YWluZXIpCi0JCSk7Ci0KLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyLCBzcGlubmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBsYXlvdXQgb2YgdGhlIGdpdmVuIGNvbnRhaW5lciBieSBjaGFuZ2luZyB3aGljaCB3aWRnZXQgd2lsbAotCSAqIGdyYWIgdGhlIGV4Y2VzcyBvZiBob3Jpem9udGFsIHNwYWNlLiBCeSBkZWZhdWx0LCB0aGUgY2VudGVyIGNvbnRyb2wgZ3JhYnMKLQkgKiB0aGUgZXhjZXNzIHNwYWNlLCB3ZSBjaGFuZ2UgaXQgdG8gYmUgdGhlIHJpZ2h0IGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgY29udGFpbmluZyB0aGUgY29udHJvbHMgbmVlZGluZyB0aGVpcgotCSAqIDxjb2RlPkdyaWREYXRhPC9jb2RlPiB0byBiZSBtb2RpZmllZCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlcwotCSAqIEBwYXJhbSBzcGlubmVyIFRoZSBzcGlubmVyIHRoYXQgZ290IGNyZWF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3Bpbm5lciBzcGlubmVyKSB7Ci0KLQkJLy8gSXQgaXMgcG9zc2libGUgdGhlIHNwaW5uZXIncyBwYXJlbnQgaXMgbm90IHRoZSBjb250YWluZXIgb2YgdGhlCi0JCS8vIGxhYmVsLCBzcGlubmVyIGFuZCByaWdodCBjb250cm9sIChhIHBhbmUgaXMgc29tZXRpbWVzIHJlcXVpcmVkIGZvcgotCQkvLyBwYWludGluZyB0aGUgc3Bpbm5lcidzIGJvcmRlcikKLQkJQ29tcG9zaXRlIHBhbmVDb250YWluZXIgPSBzcGlubmVyLmdldFBhcmVudCgpOwotCi0JCXdoaWxlIChjb250YWluZXIgIT0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKSkgewotCQkJcGFuZUNvbnRhaW5lciA9IHBhbmVDb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlDb250cm9sW10gY29udHJvbHMgPSBwYW5lQ29udGFpbmVyLmdldENoaWxkcmVuKCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQljb250cm9sc1sxXS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljb250cm9sc1syXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmVtb3ZlQWxpZ25SaWdodChjb250cm9sc1syXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzOTAzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZENvbnRyb2xVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLQotLyoqCi0gKiBKZGJjV3JpdGVDb25uZWN0aW9uc01pbkNvbXBvc2l0ZQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKZGJjV3JpdGVDb25uZWN0aW9uc01pbkNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxDb25uZWN0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUoQWJzdHJhY3RQYW5lPENvbm5lY3Rpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRXcml0ZUNvbm5lY3Rpb25zTWluSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCUludGVnZXIgdmFsdWUgPSBzdWJqZWN0LmdldFdyaXRlQ29ubmVjdGlvbnNNaW4oKTsKLQotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gLTE7Ci0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0V3JpdGVDb25uZWN0aW9uc01pbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCAiIikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShJbnRlZ2VyLk1JTl9WQUxVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbkxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlMYWJlbCBsYWJlbCA9IGJ1aWxkTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGVmYXVsdFdpdGhvdXRWYWx1ZQotCQkpOwotCi0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIoCi0JCQluZXcgTGFiZWxlZExhYmVsKGxhYmVsKSwKLQkJCWJ1aWxkRGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNaW5MYWJlbEhvbGRlcigpCi0JCSk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbkxhYmVsSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlciwgU3RyaW5nPihidWlsZERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWluSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJbnRlZ2VyIHZhbHVlKSB7Ci0KLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRlZmF1bHRXaXRoVmFsdWUsIHZhbHVlKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gIiI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gdGhpcy5idWlsZExhYmVsZWRTcGlubmVyKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zTWluTGFiZWwsCi0JCQl0aGlzLmJ1aWxkV3JpdGVDb25uZWN0aW9uc01pbkhvbGRlcigpLAotCQkJLTEsCi0JCQktMSwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJdGhpcy5idWlsZERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWluTGFiZWwoY29udGFpbmVyKQotCQkpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lciwgc3Bpbm5lcik7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgbGF5b3V0IG9mIHRoZSBnaXZlbiBjb250YWluZXIgYnkgY2hhbmdpbmcgd2hpY2ggd2lkZ2V0IHdpbGwKLQkgKiBncmFiIHRoZSBleGNlc3Mgb2YgaG9yaXpvbnRhbCBzcGFjZS4gQnkgZGVmYXVsdCwgdGhlIGNlbnRlciBjb250cm9sIGdyYWJzCi0JICogdGhlIGV4Y2VzcyBzcGFjZSwgd2UgY2hhbmdlIGl0IHRvIGJlIHRoZSByaWdodCBjb250cm9sLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIGNvbnRhaW5pbmcgdGhlIGNvbnRyb2xzIG5lZWRpbmcgdGhlaXIKLQkgKiA8Y29kZT5HcmlkRGF0YTwvY29kZT4gdG8gYmUgbW9kaWZpZWQgZnJvbSB0aGUgZGVmYXVsdCB2YWx1ZXMKLQkgKiBAcGFyYW0gc3Bpbm5lciBUaGUgc3Bpbm5lciB0aGF0IGdvdCBjcmVhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIsIFNwaW5uZXIgc3Bpbm5lcikgewotCi0JCS8vIEl0IGlzIHBvc3NpYmxlIHRoZSBzcGlubmVyJ3MgcGFyZW50IGlzIG5vdCB0aGUgY29udGFpbmVyIG9mIHRoZQotCQkvLyBsYWJlbCwgc3Bpbm5lciBhbmQgcmlnaHQgY29udHJvbCAoYSBwYW5lIGlzIHNvbWV0aW1lcyByZXF1aXJlZCBmb3IKLQkJLy8gcGFpbnRpbmcgdGhlIHNwaW5uZXIncyBib3JkZXIpCi0JCUNvbXBvc2l0ZSBwYW5lQ29udGFpbmVyID0gc3Bpbm5lci5nZXRQYXJlbnQoKTsKLQotCQl3aGlsZSAoY29udGFpbmVyICE9IHBhbmVDb250YWluZXIuZ2V0UGFyZW50KCkpIHsKLQkJCXBhbmVDb250YWluZXIgPSBwYW5lQ29udGFpbmVyLmdldFBhcmVudCgpOwotCQl9Ci0KLQkJQ29udHJvbFtdIGNvbnRyb2xzID0gcGFuZUNvbnRhaW5lci5nZXRDaGlsZHJlbigpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJY29udHJvbHNbMV0uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJY29udHJvbHNbMl0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJlbW92ZUFsaWduUmlnaHQoY29udHJvbHNbMl0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL05hdGl2ZVNxbENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9OYXRpdmVTcWxDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4OTFjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL05hdGl2ZVNxbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogTmF0aXZlU3FsQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXRpdmVTcWxDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8Q29ubmVjdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5hdGl2ZVNxbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBOYXRpdmVTcWxDb21wb3NpdGUoCi0JCQkJCUFic3RyYWN0UGFuZTw/IGV4dGVuZHMgQ29ubmVjdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROYXRpdmVTcWxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5OQVRJVkVfU1FMX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldE5hdGl2ZVNxbCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXROYXRpdmVTcWwodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hdGl2ZVNxbFN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkTmF0aXZlU3FsSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0TmF0aXZlU3FsKCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25hdGl2ZVNxbExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9uYXRpdmVTcWxMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9uYXRpdmVTcWxMYWJlbCwKLQkJCXRoaXMuYnVpbGROYXRpdmVTcWxIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGROYXRpdmVTcWxTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLS8vCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL1BlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY29ubmVjdGlvbi9QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlMGY3NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL1BlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiCi0JZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPENvbm5lY3Rpb24+Ci0JaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlPFBlcnNpc3RlbmNlVW5pdD4KLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvbj4gc3ViamVjdEhvbGRlciwgCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtDb25uZWN0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldFBhZ2VJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlVGV4dCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdGl0bGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBMYXlvdXQgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgYnVpbGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYnVpbGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jb25uZWN0aW9uL1RyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQzMjc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2Nvbm5lY3Rpb24vVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8Q29ubmVjdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGUoCi0JCQkJCUFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIENvbm5lY3Rpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKCBwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPENvbm5lY3Rpb24sIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4gYnVpbGRUcmFuc2FjdGlvblR5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxDb25uZWN0aW9uLCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVbXSBjaG9pY2VzKCkgewotCQkJCXJldHVybiBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGUudGhpcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0VHJhbnNhY3Rpb25UeXBlKHZhbHVlKTsKLQotCQkJCWlmICh2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUwpIHsKLQkJCQkJY2xlYXJKVEFQcm9wZXJ0aWVzKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljbGVhclJlc291cmNlTG9jYWxQcm9wZXJ0aWVzKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckpUQVByb3BlcnRpZXMoKSB7Ci0JCXN1YmplY3QoKS5zZXRKdGFEYXRhU291cmNlKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhclJlc291cmNlTG9jYWxQcm9wZXJ0aWVzKCkgewotCQlDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBzdWJqZWN0KCk7Ci0JCWNvbm5lY3Rpb24uc2V0Tm9uSnRhRGF0YVNvdXJjZShudWxsKTsKLQkJY29ubmVjdGlvbi5zZXREcml2ZXIobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0VXJsKG51bGwpOwotCQljb25uZWN0aW9uLnNldFVzZXIobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0UGFzc3dvcmQobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0QmluZFBhcmFtZXRlcnMobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0V3JpdGVDb25uZWN0aW9uc01heChudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRXcml0ZUNvbm5lY3Rpb25zTWluKG51bGwpOwotCQljb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc01heChudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRSZWFkQ29ubmVjdGlvbnNNaW4obnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdHJhbnNhY3Rpb25UeXBlTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVHJhbnNhY3Rpb25UeXBlQ29tYm8oIGNvbnRhaW5lciksCi0JCQludWxsCQkvLyBUT0RPIElKcGFIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL0N1c3RvbWl6ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vQ3VzdG9taXplckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzdiYzYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vQ3VzdG9taXplckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBDdXN0b21pemVyQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21pemVyQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q3VzdG9taXplckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEN1c3RvbWl6ZXJDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcz4gcGFyZW50UGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcz4gaW5pdGlhbGl6ZUNsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5Q3VzdG9taXplclByb3BlcnRpZXMsIFN0cmluZz4oCi0JCQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXIoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCQkJCQkJdGhpcy5zdWJqZWN0LnNldERlc2NyaXB0b3JDdXN0b21pemVyKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZXNjcmlwdG9yQ3VzdG9taXplcigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgbGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2N1c3RvbWl6ZXJMYWJlbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCgpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gc3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCQkJSUphdmFQcm9qZWN0IHJvb3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0KLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gcm9vdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpWzBdOwotCQkJCX0KLQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJSnB0RWNsaXBzZUxpbmtVaVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByb21wdFR5cGUoKSB7Ci0JCQkJSVR5cGUgdHlwZSA9IGNob29zZVR5cGUoKTsKLQotCQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJyk7Ci0JCQkJCXN1YmplY3QoKS5zZXREZXNjcmlwdG9yQ3VzdG9taXplcihjbGFzc05hbWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5pbml0aWFsaXplQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OGI3ZmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLQotLyoqCi0gKiAgUGVyc2lzdGVuY2VVbml0Q3VzdG9taXphdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxDdXN0b21pemF0aW9uPgotewotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTxDdXN0b21pemF0aW9uPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTZWN0aW9uIHNlY3Rpb24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlU2VjdGlvbihwYXJlbnQsIFNXVC5GTEFUIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBTZWN0aW9uLkRFU0NSSVBUSU9OKTsKLQkJc2VjdGlvbi5zZXRUZXh0KEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfc2VjdGlvblRpdGxlKTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3NlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRoaXMuYnVpbGRTdWJQYW5lKHNlY3Rpb24pOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCi0JCS8vIERlZmF1bHQgcGFuZQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSB0aGlzLmdyb3VwQm94TWFyZ2luKCk7Ci0KLQkJQ29tcG9zaXRlIGRlZmF1bHRQYW5lID0gdGhpcy5idWlsZFN1YlBhbmUoCi0JCQljb21wb3NpdGUsCi0JCQkwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4KLQkJKTsKLQotCQkvLyBXZWF2aW5nCi0JCW5ldyBXZWF2aW5nQ29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKLQotCQkvLyBXZWF2aW5nIExhenkKLQkJbmV3IFdlYXZpbmdMYXp5Q29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKLQotCQkvLyBXZWF2aW5nIEZldGNoIEdyb3VwcwotCQluZXcgV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKLQotCQkvLyBXZWF2aW5nIENoYW5nZSBUcmFja2luZwotCQluZXcgV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKLQotCQkvLyBUaHJvdyBFeGNlcHRpb25zCi0JCW5ldyBUaHJvd0V4Y2VwdGlvbnNDb21wb3NpdGUodGhpcywgZGVmYXVsdFBhbmUpOwotCi0JCS8vIFNlc3Npb24gQ3VzdG9taXplcgotCQluZXcgU2Vzc2lvbkN1c3RvbWl6ZXJDb21wb3NpdGUodGhpcywgZGVmYXVsdFBhbmUpOwotCi0JCS8vIEVudGl0aWVzTGlzdAotCQluZXcgRW50aXR5TGlzdENvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL0VudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9FbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiZmNiNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL0VudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8RW50aXR5Q3VzdG9taXplclByb3BlcnRpZXM+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUoQWJzdHJhY3RQYW5lPEN1c3RvbWl6YXRpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gQ3VzdG9taXplcgotCQluZXcgQ3VzdG9taXplckNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL0VudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL0VudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNjE5YjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9FbnRpdHlDdXN0b21pemVyUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRW50aXR5Q3VzdG9taXplclByb3BlcnRpZXMKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQlwcml2YXRlIEN1c3RvbWl6YXRpb24gY3VzdG9taXphdGlvbjsKLQkKLQlwcml2YXRlIFN0cmluZyBlbnRpdHlOYW1lOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZID0gQ3VzdG9taXphdGlvbi5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFk7Ci0JCi0JU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+IGN1c3RvbWl6YXRpb25Ib2xkZXI7Ci0JUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVzY3JpcHRvckN1c3RvbWl6ZXJIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBkZXNjcmlwdG9yQ3VzdG9taXplckxpc3RlbmVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzKEN1c3RvbWl6YXRpb24gY3VzdG9taXphdGlvbiwgU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uID0gY3VzdG9taXphdGlvbjsKLQkJdGhpcy5lbnRpdHlOYW1lID0gZW50aXR5TmFtZTsKLQkJdGhpcy5jdXN0b21pemF0aW9uSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPih0aGlzLmN1c3RvbWl6YXRpb24pOwotCi0JCXRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXJIb2xkZXIgPSB0aGlzLmJ1aWxkRGVzY3JpcHRvckN1c3RvbWl6ZXJBQSh0aGlzLmN1c3RvbWl6YXRpb25Ib2xkZXIpOwotCQl0aGlzLmRlc2NyaXB0b3JDdXN0b21pemVyTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRGVzY3JpcHRvckN1c3RvbWl6ZXJDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmRlc2NyaXB0b3JDdXN0b21pemVySG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmRlc2NyaXB0b3JDdXN0b21pemVyTGlzdGVuZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCXB1YmxpYyBib29sZWFuIGVudGl0eU5hbWVJc1ZhbGlkKCkgewotCQlyZXR1cm4gIVN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5lbnRpdHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudGl0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdG9yQ3VzdG9taXplcigpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXphdGlvbi5nZXREZXNjcmlwdG9yQ3VzdG9taXplcih0aGlzLmVudGl0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdERlc2NyaXB0b3JDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemF0aW9uLmdldERlZmF1bHREZXNjcmlwdG9yQ3VzdG9taXplcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0b3JDdXN0b21pemVyKFN0cmluZyBkZXNjcmlwdG9yQ3VzdG9taXplcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5nZXREZXNjcmlwdG9yQ3VzdG9taXplcigpOwotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQob2xkLCBkZXNjcmlwdG9yQ3VzdG9taXplcikpIHsKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXREZXNjcmlwdG9yQ3VzdG9taXplcihkZXNjcmlwdG9yQ3VzdG9taXplciwgdGhpcy5lbnRpdHlOYW1lKTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFksIG9sZCwgZGVzY3JpcHRvckN1c3RvbWl6ZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXphdGlvbi5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyICoqKioqKioqKioKLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVzY3JpcHRvckN1c3RvbWl6ZXJBQShQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbj4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBTdHJpbmc+KAotCQkJCQkJCQlzdWJqZWN0SG9sZGVyLCBERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlc2NyaXB0b3JDdXN0b21pemVyKEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzLnRoaXMuZW50aXR5TmFtZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERlc2NyaXB0b3JDdXN0b21pemVyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcy50aGlzLmRlc2NyaXB0b3JDdXN0b21pemVyQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZXNjcmlwdG9yQ3VzdG9taXplckNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCVN0cmluZyBvbGQgPSAoU3RyaW5nKSBlLmdldE9sZFZhbHVlKCk7Ci0JCVN0cmluZyBuZXdEZXNjcmlwdG9yQ3VzdG9taXplciA9IChTdHJpbmcpIGUuZ2V0TmV3VmFsdWUoKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSwgb2xkLCBuZXdEZXNjcmlwdG9yQ3VzdG9taXplcik7Ci0JCXJldHVybjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuYnVpbGRTaW1wbGVUb1N0cmluZ09uKHRoaXMsIHNiKTsKLQkJc2IuYXBwZW5kKCIgKCIpOwotCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKCJuYW1lOiAiKTsKLQkJc2IuYXBwZW5kKHRoaXMuZW50aXR5TmFtZSk7Ci0JCXNiLmFwcGVuZCgiLCBkZXNjcmlwdG9yQ3VzdG9taXplcjogIik7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldERlc2NyaXB0b3JDdXN0b21pemVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vRW50aXR5TGlzdENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9FbnRpdHlMaXN0Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NTZkNTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9FbnRpdHlMaXN0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci0KLS8qKgotICogIEVudGl0eUxpc3RDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eUxpc3RDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8Q3VzdG9taXphdGlvbj4KLXsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzPiBlbnRpdHlIb2xkZXI7Ci0KLQlwdWJsaWMgRW50aXR5TGlzdENvbXBvc2l0ZShBYnN0cmFjdFBhbmU8Q3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJZW50aXR5SG9sZGVyID0gdGhpcy5idWlsZEVudGl0eUhvbGRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IHRoaXMuYnVpbGRUaXRsZWRQYW5lKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2dyb3VwVGl0bGUKLQkJKTsKLQotCQkvLyBFbnRpdGllcyBhZGQvcmVtb3ZlIGxpc3QgcGFuZQotCQluZXcgQWRkUmVtb3ZlTGlzdFBhbmU8Q3VzdG9taXphdGlvbj4oCi0JCQl0aGlzLAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5idWlsZEVudGl0aWVzQWRhcHRlcigpLAotCQkJdGhpcy5idWlsZEVudGl0eUN1c3RvbWl6YXRpb25MaXN0SG9sZGVyKCksCi0JCQllbnRpdHlIb2xkZXIsCi0JCQl0aGlzLmJ1aWxkRW50aXR5TGFiZWxQcm92aWRlcigpLAotCQkJbnVsbAkJCS8vCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkNVU1RPTUlaQVRJT05fRU5USVRJRVMKLQkJKTsKLQotCQkvLyBFbnRpdHkgQ3VzdG9taXphdGlvbiBwcm9wZXJ0eSBwYW5lCi0JCUVudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZSBwYW5lID0gbmV3IEVudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQllbnRpdHlIb2xkZXIsCi0JCQljb250YWluZXIKLQkJKTsKLQkJdGhpcy5pbnN0YWxsUGFuZUVuYWJsZXIoZW50aXR5SG9sZGVyLCBwYW5lKTsKLQl9Ci0KLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lLkFkYXB0ZXIgYnVpbGRFbnRpdGllc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkRW50aXRpZXMobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJQ3VzdG9taXphdGlvbiBjdXN0b21pemF0aW9uID0gc3ViamVjdCgpOwotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcyBlbnRpdHlDdXN0b21pemF0aW9uID0gKEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzKSBpdGVtOwotCQkJCQljdXN0b21pemF0aW9uLnJlbW92ZUVudGl0eShlbnRpdHlDdXN0b21pemF0aW9uLmdldEVudGl0eU5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkRW50aXRpZXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCUlUeXBlIHR5cGUgPSB0aGlzLmNob29zZUVudGl0eSgpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5nZXRFbnRpdHlOYW1lKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQkJaWYgKGVudGl0eU5hbWUgPT0gbnVsbCkgewotCQkJCWVudGl0eU5hbWUgPSB0eXBlLmdldEVsZW1lbnROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCWlmKCAhIHRoaXMuc3ViamVjdCgpLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgewotCQkJCVN0cmluZyBlbnRpdHkgPSB0aGlzLnN1YmplY3QoKS5hZGRFbnRpdHkoZW50aXR5TmFtZSk7Ci0KLQkJCQlpbnQgaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZih0aGlzLnN1YmplY3QoKS5lbnRpdGllcygpLCBlbnRpdHlOYW1lKTsKLQkJCQlFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcyBpdGVtID0gKEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzKSBsaXN0U2VsZWN0aW9uTW9kZWwuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQkJCQllbnRpdHlIb2xkZXIuc2V0VmFsdWUoaXRlbSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RW50aXR5TmFtZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCi0JCVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gc3ViamVjdCgpLnBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwotCi0JCWlmIChwZXJzaXN0ZW50VHlwZSAhPSBudWxsICYmIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSkgewotCQkJVHlwZU1hcHBpbmcgbWFwcGluZyA9IHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCWlmIChtYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJcmV0dXJuICgoRW50aXR5KW1hcHBpbmcpLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJVHlwZSBjaG9vc2VFbnRpdHkoKSB7Ci0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W10geyByb290LmdldEphdmFQcm9qZWN0KCkgfTsKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwotCQlTZWxlY3Rpb25EaWFsb2cgdHlwZVNlbGVjdGlvbkRpYWxvZzsKLQotCQl0cnkgewotCQkJdHlwZVNlbGVjdGlvbkRpYWxvZyA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKAotCQkJCXNoZWxsKCksCi0JCQkJc2VydmljZSwKLQkJCQlzY29wZSwKLQkJCQlJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywKLQkJCQlmYWxzZSwKLQkJCQkiIgotCQkJKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRUaXRsZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ3VzdG9taXphdGlvbkVudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nVGl0bGUpOwotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ01lc3NhZ2UpOwotCi0JCWlmICh0eXBlU2VsZWN0aW9uRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiAoSVR5cGUpIHR5cGVTZWxlY3Rpb25EaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gc3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCUlKYXZhUHJvamVjdCByb290ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gcm9vdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpWzBdOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0RWNsaXBzZUxpbmtVaVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZEVudGl0eUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJRW50aXR5Q3VzdG9taXplclByb3BlcnRpZXMgZW50aXR5Q3VzdG9taXphdGlvbiA9IChFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcykgZWxlbWVudDsKLQkJCQlyZXR1cm4gZW50aXR5Q3VzdG9taXphdGlvbi5nZXRFbnRpdHlOYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcz4gYnVpbGRFbnRpdHlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzPigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RW50aXR5Q3VzdG9taXplclByb3BlcnRpZXM+IGJ1aWxkRW50aXR5Q3VzdG9taXphdGlvbkxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nLCBFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcz4oYnVpbGRFbnRpdGllc0xpc3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRW50aXR5Q3VzdG9taXplclByb3BlcnRpZXMgdHJhbnNmb3JtSXRlbShTdHJpbmcgaXRlbSkgewotCQkJCXJldHVybiBuZXcgRW50aXR5Q3VzdG9taXplclByb3BlcnRpZXMoc3ViamVjdCgpLCBpdGVtKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRFbnRpdGllc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgU3RyaW5nPigKLQkJCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5FTlRJVElFU19MSVNUX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZW50aXRpZXMoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmVudGl0aWVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZUVuYWJsZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5Q3VzdG9taXplclByb3BlcnRpZXM+IGVudGl0eUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZSBwYW5lKSB7Ci0KLQkJbmV3IFBhbmVFbmFibGVyKAotCQkJdGhpcy5idWlsZFBhbmVFbmFibGVySG9sZGVyKGVudGl0eUhvbGRlciksCi0JCQlwYW5lCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlDdXN0b21pemVyUHJvcGVydGllcz4gZW50aXR5SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5Q3VzdG9taXplclByb3BlcnRpZXMsIEJvb2xlYW4+KGVudGl0eUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKEVudGl0eUN1c3RvbWl6ZXJQcm9wZXJ0aWVzIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmVudGl0eU5hbWVJc1ZhbGlkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNzJmMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYkl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYiAKLQkJCQkJCQkJZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPEN1c3RvbWl6YXRpb24+Ci0JCQkJCQkJCWltcGxlbWVudHMgSnBhUGFnZUNvbXBvc2l0ZTxQZXJzaXN0ZW5jZVVuaXQ+Ci17Ci0JcHVibGljIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJbmV3IEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRQYWdlSW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aXRsZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBidWlsZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luVG9wID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJbGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE1OwotCQkKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGJ1aWxkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0JCQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9TZXNzaW9uQ3VzdG9taXplckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9TZXNzaW9uQ3VzdG9taXplckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzUzN2E0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vU2Vzc2lvbkN1c3RvbWl6ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkpwdEVjbGlwc2VMaW5rVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgU2Vzc2lvbkN1c3RvbWl6ZXJDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25DdXN0b21pemVyQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZXNzaW9uQ3VzdG9taXplckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFNlc3Npb25DdXN0b21pemVyQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50UGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxDdXN0b21pemF0aW9uPiBpbml0aWFsaXplQ2xhc3NDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8Q3VzdG9taXphdGlvbj4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLlNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmdldFNlc3Npb25DdXN0b21pemVyKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQotCQkJCQkJc3ViamVjdC5zZXRTZXNzaW9uQ3VzdG9taXplcih2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U2Vzc2lvbkN1c3RvbWl6ZXIoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9zZXNzaW9uQ3VzdG9taXplckxhYmVsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJCQlJSmF2YVByb2plY3Qgcm9vdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiByb290LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlKcHRFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvbXB0VHlwZSgpIHsKLQkJCQlJVHlwZSB0eXBlID0gY2hvb3NlVHlwZSgpOwotCi0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKTsKLQkJCQkJc3ViamVjdCgpLnNldFNlc3Npb25DdXN0b21pemVyKGNsYXNzTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1Rocm93RXhjZXB0aW9uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9UaHJvd0V4Y2VwdGlvbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1N2ExYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1Rocm93RXhjZXB0aW9uc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRocm93RXhjZXB0aW9uc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRocm93RXhjZXB0aW9uc0NvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUaHJvd0V4Y2VwdGlvbnNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFRocm93RXhjZXB0aW9ucygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRUaHJvd0V4Y2VwdGlvbnModmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRocm93RXhjZXB0aW9uc1N0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkVGhyb3dFeGNlcHRpb25zSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0VGhyb3dFeGNlcHRpb25zKCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbCwKLQkJCXRoaXMuYnVpbGRUaHJvd0V4Y2VwdGlvbnNIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRUaHJvd0V4Y2VwdGlvbnNTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLS8vCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DVVNUT01JWkFUSU9OX1RIUk9XX0VYQ0VQVElPTlMKLQkJKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1dlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9XZWF2aW5nQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyYjBkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1dlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFdlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+V2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFdlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5XRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZFdlYXZpbmdDaGFuZ2VUcmFja2luZ0hvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdFdlYXZpbmdDaGFuZ2VUcmFja2luZygpOwotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSBkZWZhdWx0VmFsdWUgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nQ2hhbmdlVHJhY2tpbmdMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0NoYW5nZVRyYWNraW5nTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5idWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0NoYW5nZVRyYWNraW5nTGFiZWwsCi0JCQl0aGlzLmJ1aWxkV2VhdmluZ0NoYW5nZVRyYWNraW5nSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkV2VhdmluZ0NoYW5nZVRyYWNraW5nU3RyaW5nSG9sZGVyKCksCi0JCQludWxsCi0vLwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ1VTVE9NSVpBVElPTl9XRUFWSU5HX0NIQU5HRV9UUkFDS0lORwotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vV2VhdmluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9XZWF2aW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYjA3OGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9XZWF2aW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLldlYXZpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFdlYXZpbmdDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFdlYXZpbmdDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBXZWF2aW5nQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoIHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q3VzdG9taXphdGlvbiwgV2VhdmluZz4gYnVpbGRXZWF2aW5nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q3VzdG9taXphdGlvbiwgV2VhdmluZz4odGhpcywgY29udGFpbmVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEN1c3RvbWl6YXRpb24uV0VBVklOR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdlYXZpbmdbXSBjaG9pY2VzKCkgewotCQkJCXJldHVybiBXZWF2aW5nLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXZWF2aW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRXZWF2aW5nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKFdlYXZpbmcgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgV2VhdmluZ0NvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdlYXZpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRXZWF2aW5nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoV2VhdmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRXZWF2aW5nKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dCggQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGFiZWwsCi0JCQl0aGlzLmJ1aWxkV2VhdmluZ0NvbWJvKCBjb250YWluZXIpLAotCQkJbnVsbAkJLy8gVE9ETyBJSnBhSGVscENvbnRleHRJZHMuCi0JCSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1dlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9XZWF2aW5nRmV0Y2hHcm91cHNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxZjE4Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1dlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFdlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+V2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFdlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRXZWF2aW5nTGF6eUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLldFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFdlYXZpbmdGZXRjaEdyb3VwcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRXZWF2aW5nRmV0Y2hHcm91cHModmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFdlYXZpbmdMYXp5U3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRXZWF2aW5nTGF6eUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdFdlYXZpbmdMYXp5KCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRmV0Y2hHcm91cHNMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRmV0Y2hHcm91cHNMYWJlbCwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nTGF6eUhvbGRlcigpLAotCQkJdGhpcy5idWlsZFdlYXZpbmdMYXp5U3RyaW5nSG9sZGVyKCksCi0JCQludWxsCi0vLwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ1VTVE9NSVpBVElPTl9XRUFWSU5HX0ZFVENIX0dST1VQUwotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vV2VhdmluZ0xhenlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2N1c3RvbWl6YXRpb24vV2VhdmluZ0xhenlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkNGFkZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9jdXN0b21pemF0aW9uL1dlYXZpbmdMYXp5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogV2VhdmluZ0xhenlDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFdlYXZpbmdMYXp5Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+V2VhdmluZ0xhenlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgV2VhdmluZ0xhenlDb21wb3NpdGUoCi0JCQkJCUFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkV2VhdmluZ0xhenlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5XRUFWSU5HX0xBWllfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0V2VhdmluZ0xhenkoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0V2VhdmluZ0xhenkodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFdlYXZpbmdMYXp5U3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRXZWF2aW5nTGF6eUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdFdlYXZpbmdMYXp5KCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdMYXp5TGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdMYXp5TGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5idWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbCwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nTGF6eUhvbGRlcigpLAotCQkJdGhpcy5idWlsZFdlYXZpbmdMYXp5U3RyaW5nSG9sZGVyKCksCi0JCQludWxsCi0vLwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ1VTVE9NSVpBVElPTl9XRUFWSU5HX0xBWlkKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGRsZ2VuL0VjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWkuamF2YQppbmRleCAxZGRmNzQ0Li4xYTIzYjA3IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RkbGdlbi9FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpLmphdmEKQEAgLTksNyArOSw2IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGRsZ2VuOwogCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwpAQCAtMTksNyArMTgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07CkBAIC0yOSw2ICsyNyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuZGRsZ2VuLkVjbGlwc2VMaW5rRERMR2VuZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRkbGdlbi53aXphcmRzLkdlbmVyYXRlRERMV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CiAKQEAgLTM4LDI4ICszNywyMSBAQAogICovCiBwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaQogewotCXByaXZhdGUgSnBhUHJvamVjdCBwcm9qZWN0OwotCXByaXZhdGUgU3RyaW5nIHByb2plY3RMb2NhdGlvbjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkKKwlwcml2YXRlIGZpbmFsIEpwYVByb2plY3QgcHJvamVjdDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTdHJpbmdUb29scy5DUjsKKwogCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKIAkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGUoSnBhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcHJvamVjdExvY2F0aW9uLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGUoSnBhUHJvamVjdCBwcm9qZWN0KSB7CisJCW5ldyBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpKHByb2plY3QpLmdlbmVyYXRlKCk7CisJfQorCisJcHJpdmF0ZSBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpKEpwYVByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcigpOwogCQlpZiAocHJvamVjdCA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKIAkJfQotCQluZXcgRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaShwcm9qZWN0LCBwcm9qZWN0TG9jYXRpb24sIHNlbGVjdGlvbikuZ2VuZXJhdGUoKTsKLQl9Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpKEpwYVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByb2plY3RMb2NhdGlvbiwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7CiAJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQl0aGlzLnByb2plY3RMb2NhdGlvbiA9IHByb2plY3RMb2NhdGlvbjsKIAl9CiAKIAkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKQEAgLTcyLDcgKzY0LDcgQEAKIAkJCXJldHVybjsKIAkJfQogCQkKLQkJR2VuZXJhdGVERExXaXphcmQgd2l6YXJkID0gbmV3IEdlbmVyYXRlRERMV2l6YXJkKHRoaXMucHJvamVjdCwgdGhpcy5zZWxlY3Rpb24pOworCQlHZW5lcmF0ZURETFdpemFyZCB3aXphcmQgPSBuZXcgR2VuZXJhdGVERExXaXphcmQodGhpcy5wcm9qZWN0KTsKIAkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2codGhpcy5nZXRDdXJyZW50U2hlbGwoKSwgd2l6YXJkKTsKIAkJZGlhbG9nLmNyZWF0ZSgpOwogCQlpZih3aXphcmQuZ2V0UGFnZUNvdW50KCkgPiAwKSB7CkBAIC04MSw3ICs3Myw3IEBACiAJCQkJcmV0dXJuOwogCQkJfQogCQl9Ci0JCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBHZW5lcmF0ZURETFJ1bm5hYmxlKHB1TmFtZSwgdGhpcy5wcm9qZWN0LCBwcm9qZWN0TG9jYXRpb24pOworCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgR2VuZXJhdGVERExSdW5uYWJsZShwdU5hbWUsIHRoaXMucHJvamVjdCk7CiAJCXRyeSB7CiAJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKIAkJfSAKQEAgLTkzLDEyICs4NSwxMSBAQAogCXByaXZhdGUgU2hlbGwgZ2V0Q3VycmVudFNoZWxsKCkgewogCSAgICByZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKIAl9Ci0JCisKIAlwcml2YXRlIGJvb2xlYW4gZGlzcGxheUdlbmVyYXRpbmdERExXYXJuaW5nKCkgewogCQlTdHJpbmcgbWVzc2FnZSA9IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFMuYmluZCgKIAkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2dlbmVyYXRpbmdERExXYXJuaW5nTWVzc2FnZSwKLQkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSwgIAotCQkJU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpICsgIFN5c3RlbS5nZXRQcm9wZXJ0eSggImxpbmUuc2VwYXJhdG9yIikpOworCQkJQ1IsICBDUiArIENSKTsKIAkJCQogCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oCiAJCQl0aGlzLmdldEN1cnJlbnRTaGVsbCgpLCAKQEAgLTExNyw3ICsxMDgsNyBAQAogCX0KIAogCXByb3RlY3RlZCBQZXJzaXN0ZW5jZSBnZXRQZXJzaXN0ZW5jZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdC5nZXRSb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKTsKKwkJcmV0dXJuIHRoaXMucHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCk7CiAJfQogCiAJLy8gKioqKioqKioqKiBydW5uYWJsZSAqKioqKioqKioqCkBAIC0xMjUsMTggKzExNiwxNyBAQAogCXN0YXRpYyBjbGFzcyBHZW5lcmF0ZURETFJ1bm5hYmxlIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKIAkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHVOYW1lOwogCQlwcml2YXRlIGZpbmFsIEpwYVByb2plY3QgcHJvamVjdDsKLQkJcHJpdmF0ZSAgU3RyaW5nIHByb2plY3RMb2NhdGlvbjsKIAotCQlHZW5lcmF0ZURETFJ1bm5hYmxlKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByb2plY3RMb2NhdGlvbikgeworCQlHZW5lcmF0ZURETFJ1bm5hYmxlKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QgcHJvamVjdCkgewogCQkJc3VwZXIoKTsKIAkJCXRoaXMucHVOYW1lID0gcHVOYW1lOwogCQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJCXRoaXMucHJvamVjdExvY2F0aW9uID0gcHJvamVjdExvY2F0aW9uOwogCQl9CiAKLQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQlTdHJpbmcgcHJvamVjdExvY2F0aW9uID0gdGhpcy5wcm9qZWN0LmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7CiAJCQl0cnkgewotCQkJCUVjbGlwc2VMaW5rRERMR2VuZXJhdG9yLmdlbmVyYXRlKHRoaXMucHVOYW1lLCB0aGlzLnByb2plY3QsIHRoaXMucHJvamVjdExvY2F0aW9uLCBtb25pdG9yKTsKKwkJCQlFY2xpcHNlTGlua0RETEdlbmVyYXRvci5nZW5lcmF0ZSh0aGlzLnB1TmFtZSwgdGhpcy5wcm9qZWN0LCBwcm9qZWN0TG9jYXRpb24sIG1vbml0b3IpOwogCQkJfSAKIAkJCWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CiAJCQkJcmV0dXJuOwpAQCAtMTU2LDkgKzE0NiwxMSBAQAogCQl9CiAJCQogCQlwcml2YXRlIHZvaWQgZGlzcGxheUVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQkKLQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChtZXNzYWdlLCBuZXcgU3RyaW5nIFtdIHttZXNzYWdlfSk7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCAiRXJyb3IiLCBtc2cpOworCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoCisJCQkJCWdldFNoZWxsKCksCisJCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2Vycm9yLAorCQkJCQltZXNzYWdlCisJCQkJKTsKIAkJfQogCiAJCXByaXZhdGUgU2hlbGwgZ2V0U2hlbGwoKSB7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vd2l6YXJkcy9HZW5lcmF0ZURETFdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGRsZ2VuL3dpemFyZHMvR2VuZXJhdGVERExXaXphcmQuamF2YQppbmRleCA4NDk2M2VhLi4zNjRlNWIyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vd2l6YXJkcy9HZW5lcmF0ZURETFdpemFyZC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RkbGdlbi93aXphcmRzL0dlbmVyYXRlRERMV2l6YXJkLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMTMgKzksMTEgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW4ud2l6YXJkczsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5KcHREYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlOwogCiAvKioKICAqICBHZW5lcmF0ZURETFdpemFyZApAQCAtMjQsNjAgKzIyLDM1IEBACiAKIAlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKIAotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOworCXByaXZhdGUgRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlIGRiU2V0dGluZ3NQYWdlOwogCi0JcHJpdmF0ZSBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UgZGJTZXR0aW5nc1BhZ2U7Ci0KLQlwdWJsaWMgR2VuZXJhdGVERExXaXphcmQoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwlwdWJsaWMgR2VuZXJhdGVERExXaXphcmQoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7CiAJCXN1cGVyKCk7CiAJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQl0aGlzLnNldFdpbmRvd1RpdGxlKCJEREwgR2VuZXJhdGlvbiIpOworCQl0aGlzLnNldFdpbmRvd1RpdGxlKEpwdFVpTWVzc2FnZXMuR2VuZXJhdGVERExXaXphcmRfdGl0bGUpOyAKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7CiAJCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JCWlmICggISB0aGlzLmpwYVByb2plY3RIYXNDb25uZWN0aW9uKCkpIHsKLQkJCXRoaXMuZGJTZXR0aW5nc1BhZ2UgPSBuZXcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlKHRoaXMuanBhUHJvamVjdCk7CisJCWlmICh0aGlzLmdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpID09IG51bGwpIHsKKwkJCXRoaXMuZGJTZXR0aW5nc1BhZ2UgPSBuZXcgRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlKHRoaXMuanBhUHJvamVjdCk7CiAJCQl0aGlzLmFkZFBhZ2UodGhpcy5kYlNldHRpbmdzUGFnZSk7CiAJCX0KIAl9CiAJCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotICAgICAgICBTdHJpbmcgbmFtZSA9IGdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpLmdldE5hbWUoKTsKLQkJaWYgKCAhIHRoaXMuanBhUHJvamVjdEhhc0Nvbm5lY3Rpb24oKSkgewotCi0JCQlTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lID0gdGhpcy5kYlNldHRpbmdzUGFnZS5nZXRTZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOwotCQkJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSA9IEpwdERiUGx1Z2luLmluc3RhbmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5KCkuY29ubmVjdGlvblByb2ZpbGVOYW1lZCggY29ubmVjdGlvblByb2ZpbGVOYW1lKTsKLQkJCWlmKCBwcm9maWxlLmlzTnVsbCgpKSB7Ci0JCQkJdGhpcy5kYlNldHRpbmdzUGFnZS5jbGVhckNvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXRoaXMuc2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlTmFtZShjb25uZWN0aW9uUHJvZmlsZU5hbWUpOwotCQl9Ci0JCXJldHVybiB0cnVlOworCQlyZXR1cm4gKHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgIT0gbnVsbCk7CiAJfQogICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLSAgICAgICAgYm9vbGVhbiBjYW5GaW5pc2ggPSB0cnVlOwotICAgICAgICBpZiAoICEgdGhpcy5kYlNldHRpbmdzUGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0gICAgICAgIAljYW5GaW5pc2ggPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FuRmluaXNoOworICAgIEBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGJTZXR0aW5nc1BhZ2UuaXNQYWdlQ29tcGxldGUoKTsKICAgICB9CiAgICAgCi0JcHJpdmF0ZSBib29sZWFuIGpwYVByb2plY3RIYXNDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gISB0aGlzLmdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpLmlzTnVsbCgpOwotCX0KLQkKLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpIHsKKwlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpIHsKIAkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwogCX0KIAotCXByaXZhdGUgdm9pZCBzZXRQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGVOYW1lKFN0cmluZyBjb25uZWN0aW9uUHJvZmlsZU5hbWUpIHsKLQkJdGhpcy5qcGFQcm9qZWN0LmdldERhdGFTb3VyY2UoKS5zZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoY29ubmVjdGlvblByb2ZpbGVOYW1lKTsKLQkJSnB0Q29yZVBsdWdpbi5zZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUodGhpcy5qcGFQcm9qZWN0LmdldFByb2plY3QoKSwgY29ubmVjdGlvblByb2ZpbGVOYW1lKTsKLQl9Ci0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MzY3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisKKy8qKgorICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIGEgdHJpLXN0YXRlIGNoZWNrIGJveCBmb3IgdGhlIEFsd2F5cyBSZWZyZXNoIG9wdGlvbi4KKyAqIAorICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKKyAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKKyAqCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9wdGlvbmFsQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUoRm9ybVBhbmU8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkKKwl7CisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlX2Fsd2F5c1JlZnJlc2hMYWJlbCwKKwkJCWJ1aWxkQWx3YXlzUmVmcmVzaEhvbGRlcigpLAorCQkJYnVpbGRBbHdheXNSZWZyZXNoU3RyaW5nSG9sZGVyKCksCisJCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkNBQ0hJTkdfQUxXQVlTX1JFRlJFU0gKKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEFsd2F5c1JlZnJlc2hIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX0FMV0FZU19SRUZSRVNIX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2godmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRBbHdheXNSZWZyZXNoU3RyaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0QWx3YXlzUmVmcmVzaEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGVfYWx3YXlzUmVmcmVzaERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZV9hbHdheXNSZWZyZXNoTGFiZWw7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdEFsd2F5c1JlZnJlc2hIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX0FMV0FZU19SRUZSRVNIX1BST1BFUlRZLAorCQkJRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiM2NmYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9PbmVNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2I1Zjg4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPgorCWltcGxlbWVudHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxUPgoreworCQkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkJCisJcHVibGljIEltYWdlIGdldEltYWdlKCkgeworCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfQ09OVEVOVCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OWEyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9PbmVNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NzkxODcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4KKwlpbXBsZW1lbnRzIE1hcHBpbmdVaURlZmluaXRpb248VD4KK3sKKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuSlBBX0NPTlRFTlQpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTRiZTVjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMjgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRpYmxlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRW51bVR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRlbXBvcmFsVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBFbnVtVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgTXV0YWJsZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBMb2JDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBCYXNpY01hcHBpbmcKKyAqIEBzZWUgQ29sdW1uQ29tcG9zaXRlCisgKiBAc2VlIEVudW1UeXBlQ29tcG9zaXRlCisgKiBAc2VlIEZldGNoVHlwZUNvbXBvc2l0ZQorICogQHNlZSBMb2JDb21wb3NpdGUKKyAqIEBzZWUgT3B0aW9uYWxDb21wb3NpdGUKKyAqIEBzZWUgVGVtcG9yYWxUeXBlQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEJhc2ljTWFwcGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklCYXNpY01hcHBpbmc8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKGNvbnRhaW5lcik7CisJCWluaXRpYWxpemVUeXBlUGFuZShjb250YWluZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCisJCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKKworCQkvLyBBbGlnbiB0aGUgd2lkZ2V0cyB1bmRlciB0aGUgQ29sdW1uQ29tcG9zaXRlCisJCWNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pOworCisJCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGFkZFN1YlBhbmUoY29udGFpbmVyLCA0KSk7CisJCQorCQkvLyBNdXRhYmxlIHdpZGdldHMKKwkJbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZE11dGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVR5cGVQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQljb250YWluZXIgPSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90eXBlCisJCSk7CisJCSgoR3JpZExheW91dCkgY29udGFpbmVyLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gMjsKKworCQkvLyBObyBjb252ZXJ0ZXIKKwkJQnV0dG9uIG5vQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCisJCQljb250YWluZXIsIAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fZGVmYXVsdCwgCisJCQlidWlsZE5vQ29udmVydGVySG9sZGVyKCksIAorCQkJbnVsbCk7CisJCSgoR3JpZERhdGEpIG5vQ29udmVydGVyQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOworCQkKKwkJLy8gTG9iCisJCUJ1dHRvbiBsb2JCdXR0b24gPSBhZGRSYWRpb0J1dHRvbigKKwkJCWNvbnRhaW5lciwgCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9sb2IsIAorCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKENvbnZlcnRlci5MT0JfQ09OVkVSVEVSKSwgCisJCQludWxsKTsKKwkJKChHcmlkRGF0YSkgbG9iQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOworCQkKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gc3BlY2lmaWVkQ29udmVydGVySG9sZGVyID0gYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJLy8gVGVtcG9yYWwKKwkJYWRkUmFkaW9CdXR0b24oCisJCQljb250YWluZXIsIAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fdGVtcG9yYWwsIAorCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpLCAKKwkJCW51bGwpOworCQlyZWdpc3RlclN1YlBhbmUobmV3IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZShidWlsZFRlbXBvcmFsQ29udmVydGVySG9sZGVyKHNwZWNpZmllZENvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKSk7CisJCQorCQkKKwkJLy8gRW51bWVyYXRlZAorCQlhZGRSYWRpb0J1dHRvbigKKwkJCWNvbnRhaW5lciwgCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9lbnVtZXJhdGVkLCAKKwkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihDb252ZXJ0ZXIuRU5VTUVSQVRFRF9DT05WRVJURVIpLCAKKwkJCW51bGwpOworCQlyZWdpc3RlclN1YlBhbmUobmV3IEVudW1UeXBlQ29tcG9zaXRlKGJ1aWxkRW51bWVyYXRlZENvbnZlcnRlckhvbGRlcihzcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSkpOworCisJCS8vIEVjbGlwc2VMaW5rIENvbnZlcnRlcgorCQlCdXR0b24gZWxDb252ZXJ0ZXJCdXR0b24gPSBhZGRSYWRpb0J1dHRvbigKKwkJCWNvbnRhaW5lciwgCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2NvbnZlcnRlZCwgCisJCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpLCAKKwkJCW51bGwpOworCQkoKEdyaWREYXRhKSBlbENvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKKworCQlQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4gY29udmVydENvbXBvc2l0ZSA9IGJ1aWxkQ29udmVydENvbXBvc2l0ZShidWlsZEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKHNwZWNpZmllZENvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lcik7CisJCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBjb252ZXJ0Q29tcG9zaXRlLmdldENvbnRyb2woKS5nZXRMYXlvdXREYXRhKCk7CisJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOworCQlyZWdpc3RlclN1YlBhbmUoY29udmVydENvbXBvc2l0ZSk7CisJfQorCisJcHJvdGVjdGVkIFBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0PiBidWlsZENvbnZlcnRDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydD4gY29udmVydEhvbGRlciwgQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZShjb252ZXJ0SG9sZGVyLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSk7CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29sdW1uPiBidWlsZENvbHVtbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCYXNpY01hcHBpbmcsIENvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBDb2x1bW4gdHJhbnNmb3JtXyhCYXNpY01hcHBpbmcgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0Q29sdW1uKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtNdXRhYmxlPiBidWlsZE11dGFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2ljTWFwcGluZywgRWNsaXBzZUxpbmtNdXRhYmxlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rTXV0YWJsZSBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgdGhpcy5zdWJqZWN0KS5nZXRNdXRhYmxlKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBidWlsZFNwZWNpZmllZENvbnZlcnRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzaWNNYXBwaW5nLCBDb252ZXJ0ZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLlNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIENvbnZlcnRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENvbnZlcnRlcigpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFRlbXBvcmFsQ29udmVydGVyPiBidWlsZFRlbXBvcmFsQ29udmVydGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlciwgVGVtcG9yYWxDb252ZXJ0ZXI+KGNvbnZlcnRlckhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgVGVtcG9yYWxDb252ZXJ0ZXIgdHJhbnNmb3JtXyhDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCQkJcmV0dXJuIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpID8gKFRlbXBvcmFsQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVudW1lcmF0ZWRDb252ZXJ0ZXI+IGJ1aWxkRW51bWVyYXRlZENvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXIsIEVudW1lcmF0ZWRDb252ZXJ0ZXI+KGNvbnZlcnRlckhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRW51bWVyYXRlZENvbnZlcnRlciB0cmFuc2Zvcm1fKENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKwkJCQlyZXR1cm4gKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gQ29udmVydGVyLkVOVU1FUkFURURfQ09OVkVSVEVSKSA/IChFbnVtZXJhdGVkQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydD4gYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rQ29udmVydD4oY29udmVydGVySG9sZGVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnQgdHJhbnNmb3JtXyhDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCQkJcmV0dXJuIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSA/IChFY2xpcHNlTGlua0NvbnZlcnQpIGNvbnZlcnRlciA6IG51bGw7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vQ29udmVydGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxCYXNpY01hcHBpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLlNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkgPT0gbnVsbCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKKwkJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoZmluYWwgU3RyaW5nIGNvbnZlcnRlclR5cGUpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzaWNNYXBwaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbnZlcnRpYmxlTWFwcGluZy5TUEVDSUZJRURfQ09OVkVSVEVSX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCUNvbnZlcnRlciBjb252ZXJ0ZXIgPSB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCk7CisJCQkJaWYgKGNvbnZlcnRlciA9PSBudWxsKSB7CisJCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQkJCX0KKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gY29udmVydGVyVHlwZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKKwkJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWI5MzJlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgQ29vcmRpbmF0aW9uIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKKyAqIHwgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZworICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAorICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxFY2xpcHNlTGlua0NhY2hpbmc+IHsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2FjaGVUeXBlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZShGb3JtUGFuZTw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCisJcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEVjbGlwc2VMaW5rQ2FjaGluZywgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU+IGFkZENhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZT4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfQ09PUkRJTkFUSU9OX1RZUEVfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfQ09PUkRJTkFUSU9OX1RZUEVfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZVtdIGdldENob2ljZXMoKSB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLnZhbHVlcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSB2YWx1ZSkgeworCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCisJCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuY2xhc3MsCisJCQkJCUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlLnRoaXMsCisJCQkJCXZhbHVlCisJCQkJKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgdmFsdWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSh2YWx1ZSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9OworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX2xhYmVsLAorCQkJYWRkQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tYm8oY29udGFpbmVyKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19DQUNIRV9DT09SRElOQVRJT05fVFlQRQorCQkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGMzZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5JbnRlZ2VyQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgIFNpemU6ICAgICAgICAgICAgICB8IEkgICAgICAgICB8SXwgIERlZmF1bHQgKFhYWCkgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKKyAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKKyAqCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8RWNsaXBzZUxpbmtDYWNoaW5nPiB7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhY2hlU2l6ZUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUoRm9ybVBhbmU8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlhZGRTaXplQ29tYm8oY29udGFpbmVyKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZFNpemVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBJbnRlZ2VyQ29tYm88RWNsaXBzZUxpbmtDYWNoaW5nPih0aGlzLCBjb250YWluZXIpIHsKKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZV9zaXplOworCQkJfQorCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7CisJCQkJcmV0dXJuIG51bGw7Ly9KcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9MRU5HVEg7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7CisJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1NJWkVfUFJPUEVSVFkpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFNpemUoKSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9TSVpFX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkU2l6ZSgpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7CisJCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkU2l6ZSh2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQl9OworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNWQxMzcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBUeXBlOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAorICogfCAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCisgKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0CisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4geworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYWNoZVR5cGVDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlKEZvcm1QYW5lPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisKKwlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBFY2xpcHNlTGlua0NhY2hlVHlwZT4gYWRkQ2FjaGVUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rQ2FjaGVUeXBlPih0aGlzLCBjb250YWluZXIpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9UWVBFX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlVHlwZVtdIGdldENob2ljZXMoKSB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGVUeXBlLnZhbHVlcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0VHlwZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhFY2xpcHNlTGlua0NhY2hlVHlwZSB2YWx1ZSkgeworCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCisJCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuY2xhc3MsCisJCQkJCUVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlLnRoaXMsCisJCQkJCXZhbHVlCisJCQkJKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRUeXBlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRWNsaXBzZUxpbmtDYWNoZVR5cGUgdmFsdWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkVHlwZSh2YWx1ZSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9OworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2xhYmVsLAorCQkJYWRkQ2FjaGVUeXBlQ29tYm8oY29udGFpbmVyKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19DQUNIRV9UWVBFCisJCSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyMjllNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgcGFuZSBzaG93cyB0aGUgY2FjaGluZyBvcHRpb25zLgorICogPHA+CisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IHggU2hhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICBDYWNoZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgQ2FjaGVTaXplQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgID4gQWR2YW5jZWQgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgCUV4cGlyeUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgIAlBbHdheXNSZWZyZXNoQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgIAkJUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgCURpc2FibGVIaXRzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgIAlDYWNoZUNvb3JkaW5hdGlvbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCBFeGlzdGVuY2VUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFbnRpdHkKKyAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCisgKiBAc2VlIEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCisgKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlCisgKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlCisgKiBAc2VlIEVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZQorICogQHNlZSBFY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZQorICogQHNlZSBFY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU8VCBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gZXh0ZW5kcyBGb3JtUGFuZTxUPgoreworCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZShGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAorICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwKKyAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCS8vU2hhcmVkIENoZWNrIGJveCwgdW5jaGVjayB0aGlzIGFuZCB0aGUgcmVzdCBvZiB0aGUgcGFuZWwgaXMgZGlzYWJsZWQKKwkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDgpLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWwsCisJCQlidWlsZFNwZWNpZmllZFNoYXJlZEhvbGRlcigpLAorCQkJYnVpbGRTaGFyZWRTdHJpbmdIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19TSEFSRUQKKwkJKTsKKworCQlDb21wb3NpdGUgc3ViUGFuZSA9IGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCAxNik7CisKKwkJQ29sbGVjdGlvbjxQYW5lPD8+PiBwYW5lcyA9IG5ldyBBcnJheUxpc3Q8UGFuZTw/Pj4oKTsKKwkJCisJCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUodGhpcywgc3ViUGFuZSkpOworCQlwYW5lcy5hZGQobmV3IEVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlKHRoaXMsIHN1YlBhbmUpKTsKKwkJCisJCS8vIEFkdmFuY2VkIHN1Yi1wYW5lCisJCUNvbXBvc2l0ZSBhZHZhbmNlZFNlY3Rpb24gPSBhZGRDb2xsYXBzYWJsZVN1YlNlY3Rpb24oCisJCQlzdWJQYW5lLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfYWR2YW5jZWQsCisJCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpCisJCSk7CisKKwkJaW5pdGlhbGl6ZUFkdmFuY2VkUGFuZShhZGRTdWJQYW5lKGFkdmFuY2VkU2VjdGlvbiwgMCwgMTYpLCBwYW5lcyk7CisJCQkKKwkJbmV3IFBhbmVFbmFibGVyKGJ1aWxkU2hhcmVkQ2FjaGVFbmFibGVyKCksIHBhbmVzKTsKKwkJCisJCWluaXRpYWxpemVFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShhZGRTdWJQYW5lKGNvbnRhaW5lciwgOCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWR2YW5jZWRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIENvbGxlY3Rpb248UGFuZTw/Pj4gcGFuZXMpIHsKKwkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKKwkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7CisJCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7CisJCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKKwkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZUV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpOworCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2hhcmVkQ2FjaGVFbmFibGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KAorCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgCisJCQkJRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9TSEFSRURfUFJPUEVSVFksIAorCQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1NIQVJFRF9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc1NoYXJlZCgpKTsKKwkJCX0KKwkJfTsKKwl9CQorCQorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTcGVjaWZpZWRTaGFyZWRIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1NIQVJFRF9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFNoYXJlZCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZFNoYXJlZCh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNoYXJlZFN0cmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFNoYXJlZEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOworCQkJCX0KKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWw7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFNoYXJlZEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfU0hBUkVEX1BST1BFUlRZLAorCQkJRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfU0hBUkVEX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkU2hhcmVkKCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0U2hhcmVkKCkpOworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDUwNWEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgCQkJICAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBDaGFuZ2UgVHJhY2tpbmcgOiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAorICogfCAgICAgICAJCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZworICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc+IHsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2hhbmdlVHJhY2tpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUoRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwgCisJCQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZz4gc3ViamVjdEhvbGRlciwKKwkJCQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJYWRkTGFiZWxlZENvbXBvc2l0ZSggCisgICAgICAgICAgICBjb250YWluZXIsCisgICAgICAgICAgICBhZGRMYWJlbCggCisgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgCisgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9sYWJlbCksIAorICAgICAgICAgICAgYWRkQ2hhbmdlVHJhY2tpbmdUeXBlQ29tYm8oY29udGFpbmVyKS5nZXRDb250cm9sKCksIAorICAgICAgICAgICAgbnVsbCAKKyAgICAgICApOworCX0KKworCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZT4gYWRkQ2hhbmdlVHJhY2tpbmdUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZT4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5ERUZBVUxUX1RZUEVfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcuU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZVtdIGdldENob2ljZXMoKSB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLnZhbHVlcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0VHlwZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSkgeworCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCisJCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuY2xhc3MsCisJCQkJCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUudGhpcywKKwkJCQkJdmFsdWUKKwkJCQkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFR5cGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSkgeworCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRUeXBlKHZhbHVlKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYjk1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nLmphdmEKQEAgLTAsMCArMSwyMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlZhbGlkYXRpbmdEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworLyoqCisgKiBDbGllbnRzIGNhbiB1c2UgdGhpcyBkaWFsb2cgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciBTZWNvbmRhcnlUYWJsZSBzZXR0aW5ncy4KKyAqIFVzZSB0aGUgZm9sbG93aW5nIG9uY2UgdGhlIGRpYWxvZyBpcyBjbG9zZWQ6CisgKiAgICAgQHNlZSAjZ2V0U2VsZWN0ZWRUYWJsZSgpCisgKiAgICAgQHNlZSAjZ2V0U2VsZWN0ZWRDYXRhbG9nKCkKKyAqICAgICBAc2VlICNnZXRTZWxlY3RlZFNjaGVtYSgpCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nIGV4dGVuZHMgVmFsaWRhdGluZ0RpYWxvZzxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0PiB7CisKKwkvKioKKwkgKiB3aGVuIGNyZWF0aW5nIGEgbmV3IEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLCAnY29udmVyc2lvblZhbHVlJyB3aWxsIGJlIG51bGwKKwkgKi8KKwlwcml2YXRlIGZpbmFsIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZTsKKworCXByaXZhdGUgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9iamVjdFR5cGVDb252ZXJ0ZXI7CisJCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgorCisJLyoqCisJICogVXNlIHRoaXMgY29uc3RydWN0b3IgdG8gY3JlYXRlIGEgbmV3IGNvbnZlcnNpb24gdmFsdWUKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2coU2hlbGwgcGFyZW50LCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlcikgeworCQl0aGlzKHBhcmVudCxvYmplY3RUeXBlQ29udmVydGVyLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBlZGl0IGFuIGV4aXN0aW5nIGNvbnZlcnNpb24gdmFsdWUKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2coU2hlbGwgcGFyZW50LCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlciwgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlciA9IG9iamVjdFR5cGVDb252ZXJ0ZXI7CisJCXRoaXMuY29udmVyc2lvblZhbHVlID0gY29udmVyc2lvblZhbHVlOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0IGJ1aWxkU3RhdGVPYmplY3QoKSB7CisJCVN0cmluZyBkYXRhVmFsdWUgPSBudWxsOworCQlTdHJpbmcgb2JqZWN0VmFsdWUgPSBudWxsOworCQlTZXQ8U3RyaW5nPiBkYXRhVmFsdWVzID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIuZGF0YVZhbHVlcygpKTsKKwkJaWYgKGlzRWRpdERpYWxvZygpKSB7CisJCQlkYXRhVmFsdWUgPSB0aGlzLmNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKTsKKwkJCW9iamVjdFZhbHVlID0gdGhpcy5jb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKTsKKwkJCS8vcmVtb3ZlICp0aGlzKiBkYXRhVmFsdWUsIGRvbid0IHdhbnQgYSBkdXBsaWNhdGUgZGF0YSB2YWx1ZSBlcnJvcgorCQkJZGF0YVZhbHVlcy5yZW1vdmUoZGF0YVZhbHVlKTsKKwkJfQorCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QoCisJCQlkYXRhVmFsdWUsIAorCQkJb2JqZWN0VmFsdWUsIAorCQkJZGF0YVZhbHVlcyk7CisJfQorCisJLy8gKioqKioqKioqKiBvcGVuICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7CisJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKKwkJc2hlbGwuc2V0VGV4dCh0aGlzLmdldFRpdGxlKCkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGUoKSB7CisJCXJldHVybiAodGhpcy5pc0FkZERpYWxvZygpKSA/CisJCQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2FkZENvbnZlcnNpb25WYWx1ZQorCQkJCQk6CisJCQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2VkaXRDb252ZXJzaW9uVmFsdWU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvblRpdGxlKCkgeworCQlyZXR1cm4gKHRoaXMuaXNBZGREaWFsb2coKSkgPworCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19hZGRDb252ZXJzaW9uVmFsdWVEZXNjcmlwdGlvblRpdGxlCisJCToKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZWRpdENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uVGl0bGU7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiAodGhpcy5pc0FkZERpYWxvZygpKSA/CisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2FkZENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uCisJCToKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZWRpdENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRGlhbG9nUGFuZTxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0PiBidWlsZExheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCXJldHVybiBuZXcgQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZShjb250YWluZXIpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7CisJCXN1cGVyLmNyZWF0ZSgpOworCisJCUNvbnZlcnNpb25WYWx1ZURpYWxvZ1BhbmUgcGFuZSA9IChDb252ZXJzaW9uVmFsdWVEaWFsb2dQYW5lKSBnZXRQYW5lKCk7CisJCXBhbmUuc2VsZWN0QWxsKCk7CisKKwkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKGZhbHNlKTsKKwl9CisKKworCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FkZERpYWxvZygpIHsKKwkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlID09IG51bGw7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0RGlhbG9nKCkgeworCQlyZXR1cm4gISB0aGlzLmlzQWRkRGlhbG9nKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIHRoZSBkYXRhIHZhbHVlIHNldCBpbiB0aGUgdGV4dCB3aWRnZXQuCisJICovCisJcHVibGljIFN0cmluZyBnZXREYXRhVmFsdWUoKSB7CisJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGF0YVZhbHVlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBvYmplY3QgdmFsdWUgc2V0IGluIHRoZSB0ZXh0IHdpZGdldC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFZhbHVlKCkgeworCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldE9iamVjdFZhbHVlKCk7CisJfQorCQorCXByaXZhdGUgY2xhc3MgQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZSBleHRlbmRzIERpYWxvZ1BhbmU8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdD4geworCisJCXByaXZhdGUgVGV4dCBkYXRhVmFsdWVUZXh0OworCQlwcml2YXRlIFRleHQgb2JqZWN0VmFsdWVUZXh0OworCisJCUNvbnZlcnNpb25WYWx1ZURpYWxvZ1BhbmUoQ29tcG9zaXRlIHBhcmVudCkgeworCQkJc3VwZXIoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2cudGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIHBhcmVudCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCQl0aGlzLmRhdGFWYWx1ZVRleHQgPSBhZGRMYWJlbGVkVGV4dCgKKwkJCQljb250YWluZXIsCisJCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19kYXRhVmFsdWUsCisJCQkJYnVpbGREYXRhVmFsdWVIb2xkZXIoKQorCQkJKTsKKwkJCQorCQkJdGhpcy5vYmplY3RWYWx1ZVRleHQgPSBhZGRMYWJlbGVkVGV4dCgKKwkJCQljb250YWluZXIsCisJCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19vYmplY3RWYWx1ZSwKKwkJCQlidWlsZE9iamVjdFZhbHVlSG9sZGVyKCkKKwkJCSk7CisJCX0KKworCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREYXRhVmFsdWVIb2xkZXIoKSB7CisJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdC5EQVRBX1ZBTFVFX1BST1BFUlRZKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREYXRhVmFsdWUoKTsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJCXRoaXMuc3ViamVjdC5zZXREYXRhVmFsdWUodmFsdWUpOworCQkJCX0KKwkJCX07CisJCX0KKworCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRPYmplY3RWYWx1ZUhvbGRlcigpIHsKKwkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0Lk9CSkVDVF9WQUxVRV9QUk9QRVJUWSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0T2JqZWN0VmFsdWUoKTsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJCXRoaXMuc3ViamVjdC5zZXRPYmplY3RWYWx1ZSh2YWx1ZSk7CisJCQkJfQorCQkJfTsKKwkJfQorCisJCXZvaWQgc2VsZWN0QWxsKCkgeworCQkJdGhpcy5kYXRhVmFsdWVUZXh0LnNlbGVjdEFsbCgpOworCQkJdGhpcy5vYmplY3RWYWx1ZVRleHQuc2VsZWN0QWxsKCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTNlNDAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5BYnN0cmFjdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuUHJvYmxlbTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBzdGF0ZSBvYmplY3QgdXNlZCBieSB0aGUgPGNvZGU+TmV3TmFtZURpYWxvZzwvY29kZT4sIHdoaWNoIHN0b3JlcworICogdGhlIGN1cnJlbnQgbmFtZSBhbmQgdmFsaWRhdGVzIGl0IHdoZW4gaXQgaXMgbW9kaWZpZWQuCisgKgorICogQHNlZSBOZXdOYW1lRGlhbG9nCisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorZmluYWwgY2xhc3MgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdCBleHRlbmRzIEFic3RyYWN0Tm9kZQoreworCS8qKgorCSAqIFRoZSBpbml0aWFsIGRhdGFWYWx1ZSBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXByaXZhdGUgU3RyaW5nIGRhdGFWYWx1ZTsKKwkKKwkvKioKKwkgKiBUaGUgY29sbGVjdGlvbiBvZiBkYXRhIHZhbHVlcyB0aGF0IGNhbid0IGJlIHVzZWQgb3IgYW4gZW1wdHkgY29sbGVjdGlvbgorCSAqLworCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGRhdGFWYWx1ZXM7CisKKwkvKioKKwkgKiBUaGUgaW5pdGlhbCBvYmplY3RWYWx1ZSBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXByaXZhdGUgU3RyaW5nIG9iamVjdFZhbHVlOworCisJLyoqCisJICogVGhlIDxjb2RlPlZhbGlkYXRvcjwvY29kZT4gdXNlZCB0byB2YWxpZGF0ZSB0aGlzIHN0YXRlIG9iamVjdC4KKwkgKi8KKwlwcml2YXRlIFZhbGlkYXRvciB2YWxpZGF0b3I7CisKKwkvKioKKwkgKiBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgZGF0YSB2YWx1ZSBwcm9wZXJ0eS4KKwkgKi8KKwlzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfVkFMVUVfUFJPUEVSVFkgPSAiZGF0YVZhbHVlIjsKKwkKKwkvKioKKwkgKiBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgb2JqZWN0IHZhbHVlIHByb3BlcnR5LgorCSAqLworCXN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX1ZBTFVFX1BST1BFUlRZID0gIm9iamVjdFZhbHVlIjsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TmV3TmFtZVN0YXRlT2JqZWN0PC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBpbml0aWFsIGlucHV0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGluaXRpYWwgdmFsdWUgY2FuCisJICogYmUgc3BlY2lmaWVkCisJICogQHBhcmFtIG5hbWVzIFRoZSBjb2xsZWN0aW9uIG9mIG5hbWVzIHRoYXQgY2FuJ3QgYmUgdXNlZCBvciBhbiBlbXB0eQorCSAqIGNvbGxlY3Rpb24gaWYgbm9uZSBhcmUgYXZhaWxhYmxlCisJICovCisJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdChTdHJpbmcgZGF0YVZhbHVlLCBTdHJpbmcgb2JqZWN0VmFsdWUsIENvbGxlY3Rpb248U3RyaW5nPiBkYXRhVmFsdWVzKSB7CisJCXN1cGVyKG51bGwpOworCisJCXRoaXMuZGF0YVZhbHVlICA9IGRhdGFWYWx1ZTsKKwkJdGhpcy5vYmplY3RWYWx1ZSA9IG9iamVjdFZhbHVlOworCQl0aGlzLmRhdGFWYWx1ZXMgPSBkYXRhVmFsdWVzOworCX0KKworCXByaXZhdGUgdm9pZCBhZGREYXRhVmFsdWVQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7CisJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZGF0YVZhbHVlKSkgeworCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0X2RhdGFWYWx1ZU11c3RCZVNwZWNpZmllZCkpOworCQl9CisJCWVsc2UgaWYgKHRoaXMuZGF0YVZhbHVlcy5jb250YWlucyh0aGlzLmRhdGFWYWx1ZSkpIHsKKwkJCWN1cnJlbnRQcm9ibGVtcy5hZGQoYnVpbGRQcm9ibGVtKEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdF9kYXRhVmFsdWVBbHJlYWR5RXhpc3RzKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkT2JqZWN0VmFsdWVQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7CisJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMub2JqZWN0VmFsdWUpKSB7CisJCQljdXJyZW50UHJvYmxlbXMuYWRkKGJ1aWxkUHJvYmxlbShFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3Rfb2JqZWN0VmFsdWVNdXN0QmVTcGVjaWZpZWQpKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKKwkJc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOworCQlhZGREYXRhVmFsdWVQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7CisJCWFkZE9iamVjdFZhbHVlUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyZW50KE5vZGUgcGFyZW50Tm9kZSkgeworCQkvL25vdCBwYXJlbnQKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCVN0cmluZyBnZXREYXRhVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmRhdGFWYWx1ZTsKKwl9CisKKwlTdHJpbmcgZ2V0T2JqZWN0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLm9iamVjdFZhbHVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldERhdGFWYWx1ZShTdHJpbmcgZGF0YVZhbHVlKSB7CisJCVN0cmluZyBvbGREYXRhVmFsdWUgPSB0aGlzLmRhdGFWYWx1ZTsKKwkJdGhpcy5kYXRhVmFsdWUgPSBkYXRhVmFsdWU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREFUQV9WQUxVRV9QUk9QRVJUWSwgb2xkRGF0YVZhbHVlLCBkYXRhVmFsdWUpOworCX0KKworCXB1YmxpYyB2b2lkIHNldE9iamVjdFZhbHVlKFN0cmluZyBvYmplY3RWYWx1ZSkgeworCQlTdHJpbmcgb2xkT2JqZWN0VmFsdWUgPSB0aGlzLm9iamVjdFZhbHVlOworCQl0aGlzLm9iamVjdFZhbHVlID0gb2JqZWN0VmFsdWU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1ZBTFVFX1BST1BFUlRZLCBvbGRPYmplY3RWYWx1ZSwgb2JqZWN0VmFsdWUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKSB7CisJCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgeworCQlyZXR1cm4gdGhpcy52YWxpZGF0b3I7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhNWJhYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwzNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgRW51bSBUeXBlOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydAorICogQHNlZSBFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0CisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+Cit7CisKKwkvKioKKwkgKiBBIGtleSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhpcyBpcyByZXF1aXJlZCB0byBjb252ZXJ0CisJICogdGhlIHNlbGVjdGVkIGl0ZW0gZnJvbSBhIGNvbWJvIHRvIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzIGtleSBpcyBtb3N0CisJICogbGlrZWx5IG5ldmVyIHR5cGVkIHRoZSB1c2VyIGFuZCBpdCB3aWxsIGhlbHAgdG8gY29udmVydCB0aGUgdmFsdWUgdG8KKwkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIGl0J3MgdGltZSB0byBzZXQgdGhlIG5ldyBzZWxlY3RlZCB2YWx1ZSBpbnRvIHRoZQorCSAqIG1vZGVsLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfS0VZID0gIj8hIyE/Iz8jP2RlZmF1bHQ/Iz8hIz8hIz8iOyAvLyROT04tTkxTLTEkCisJCisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtVHlwZUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0PiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCUNDb21ibyBjb21ibyA9IGFkZExhYmVsZWRFZGl0YWJsZUNDb21ibygKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2NvbnZlcnRlck5hbWVMYWJlbCwKKwkJCWJ1aWxkQ29udmVydE5hbWVMaXN0SG9sZGVyKCksCisJCQlidWlsZENvbnZlcnROYW1lSG9sZGVyKCksCisJCQlidWlsZE5hbWVDb252ZXJ0ZXIoKSwKKwkJCW51bGwKKwkJKTsKKwkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKKwkJCisJCUNvbXBvc2l0ZSBzdWJTZWN0aW9uID0gYWRkQ29sbGFwc2FibGVTdWJTZWN0aW9uKAorCQkJY29udGFpbmVyLCAKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2RlZmluZUNvbnZlcnRlclNlY3Rpb24sIAorCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKSk7CisJCQorCQkvLyBObyBDb252ZXJ0ZXIKKwkJYWRkUmFkaW9CdXR0b24oCisJCQlzdWJTZWN0aW9uLCAKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2RlZmF1bHQsIAorCQkJYnVpbGROb0NvbnZlcnRlckhvbGRlcigpLCAKKwkJCW51bGwpOworCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlciA9IGJ1aWxkQ29udmVydGVySG9sZGVyKCk7CisJCS8vIEN1c3RvbUNvbnZlcnRlcgorCQlhZGRSYWRpb0J1dHRvbigKKwkJCXN1YlNlY3Rpb24sIAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfY3VzdG9tLCAKKwkJCWJ1aWxkQ29udmVydGVySG9sZGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLkNVU1RPTV9DT05WRVJURVIpLCAKKwkJCW51bGwpOworCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZSBjb252ZXJ0ZXJDb21wb3NpdGUgPSBuZXcgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUoYnVpbGRDdXN0b21Db252ZXJ0ZXJIb2xkZXIoY29udmVydGVySG9sZGVyKSwgc3ViU2VjdGlvbiwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbnZlcnRlckNvbXBvc2l0ZS5nZXRDb250cm9sKCkuZ2V0TGF5b3V0RGF0YSgpOworCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7CisJCXJlZ2lzdGVyU3ViUGFuZShjb252ZXJ0ZXJDb21wb3NpdGUpOworCQkKKwkJLy8gVHlwZSBDb252ZXJ0ZXIKKwkJYWRkUmFkaW9CdXR0b24oCisJCQlzdWJTZWN0aW9uLCAKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX3R5cGUsIAorCQkJYnVpbGRDb252ZXJ0ZXJIb2xkZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpLCAKKwkJCW51bGwpOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGUgdHlwZUNvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGUoYnVpbGRUeXBlQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIHN1YlNlY3Rpb24sIGdldFdpZGdldEZhY3RvcnkoKSk7CisJCWdyaWREYXRhID0gKEdyaWREYXRhKSB0eXBlQ29udmVydGVyQ29tcG9zaXRlLmdldENvbnRyb2woKS5nZXRMYXlvdXREYXRhKCk7CisJCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKKwkJcmVnaXN0ZXJTdWJQYW5lKHR5cGVDb252ZXJ0ZXJDb21wb3NpdGUpOworCisJCS8vIE9iamVjdCBUeXBlIENvbnZlcnRlcgorCQlhZGRSYWRpb0J1dHRvbigKKwkJCXN1YlNlY3Rpb24sIAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfb2JqZWN0VHlwZSwgCisJCQlidWlsZENvbnZlcnRlckhvbGRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVIpLCAKKwkJCW51bGwpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUgb2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUoYnVpbGRPYmplY3RUeXBlQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIHN1YlNlY3Rpb24sIGdldFdpZGdldEZhY3RvcnkoKSk7CisJCWdyaWREYXRhID0gKEdyaWREYXRhKSBvYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlLmdldENvbnRyb2woKS5nZXRMYXlvdXREYXRhKCk7CisJCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKKwkJcmVnaXN0ZXJTdWJQYW5lKG9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUpOworCisJCS8vIFN0cnVjdCBDb252ZXJ0ZXIKKwkJYWRkUmFkaW9CdXR0b24oCisJCQlzdWJTZWN0aW9uLCAKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX3N0cnVjdCwgCisJCQlidWlsZENvbnZlcnRlckhvbGRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKSwgCisJCQludWxsKTsKKwkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUgc3RydWN0Q29udmVydGVyQ29tcG9zaXRlID0gbmV3IEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQ29tcG9zaXRlKGJ1aWxkU3RydWN0Q29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIHN1YlNlY3Rpb24sIGdldFdpZGdldEZhY3RvcnkoKSk7CisJCWdyaWREYXRhID0gKEdyaWREYXRhKSBzdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUuZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOworCQlyZWdpc3RlclN1YlBhbmUoc3RydWN0Q29udmVydGVyQ29tcG9zaXRlKTsKKwkJCisJCW5ldyBQYW5lRW5hYmxlcihidWlsZEJvb2xlYW5Ib2xkZXIoKSwgdGhpcyk7CisJfQorCQorCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29udmVydE5hbWVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydC5TUEVDSUZJRURfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJLy8gQ29udmVydCB0aGUgZGVmYXVsdCB2YWx1ZSBvciBhbiBlbXB0eSBzdHJpbmcgdG8gbnVsbAorCQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYKKwkJCQkgICAoKHZhbHVlLmxlbmd0aCgpID09IDApIHx8IHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSkgeworCisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUodmFsdWUpOworCQkJfQorCQl9OworCX0KKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb252ZXJ0TmFtZUxpc3RIb2xkZXIoKSB7CisJCWphdmEudXRpbC5MaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7CisJCWxpc3QuYWRkKGJ1aWxkRGVmYXVsdE5hbWVMaXN0SG9sZGVyKCkpOworCQlsaXN0LmFkZChidWlsZFJlc2VydmVkQ29udmVydGVyTmFtZUxpc3RIb2xkZXIoKSk7CisJCWxpc3QuYWRkKGJ1aWxkQ29udmVydGVyTmFtZUxpc3RIb2xkZXIoKSk7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihsaXN0KTsKKwl9CisJCisJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TmFtZUxpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKKwkJCWJ1aWxkRGVmYXVsdE5hbWVIb2xkZXIoKQorCQkpOworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHROYW1lSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnQsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnQuREVGQVVMVF9DT05WRVJURVJfTkFNRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCVN0cmluZyBuYW1lID0gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRDb252ZXJ0ZXJOYW1lKCk7CisKKwkJCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQkJCW5hbWUgPSBERUZBVUxUX0tFWTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCW5hbWUgPSBERUZBVUxUX0tFWSArIG5hbWU7CisJCQkJfQorCisJCQkJcmV0dXJuIG5hbWU7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZE5hbWVDb252ZXJ0ZXIoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7CisJCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKKworCQkJCWlmIChnZXRTdWJqZWN0KCkgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gdmFsdWU7CisJCQkJfQorCisJCQkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCQkJdmFsdWUgPSBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdENvbnZlcnRlck5hbWUoKTsKKworCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQkJdmFsdWUgPSBERUZBVUxUX0tFWSArIHZhbHVlOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJdmFsdWUgPSBERUZBVUxUX0tFWTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICh2YWx1ZS5zdGFydHNXaXRoKERFRkFVTFRfS0VZKSkgeworCQkJCQlTdHJpbmcgZGVmYXVsdE5hbWUgPSB2YWx1ZS5zdWJzdHJpbmcoREVGQVVMVF9LRVkubGVuZ3RoKCkpOworCisJCQkJCWlmIChkZWZhdWx0TmFtZS5sZW5ndGgoKSA+IDApIHsKKwkJCQkJCXZhbHVlID0gTkxTLmJpbmQoCisJCQkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKKwkJCQkJCQlkZWZhdWx0TmFtZQorCQkJCQkJKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCXZhbHVlID0gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdEVtcHR5OworCQkJCQl9CisJCQkJfQorCisJCQkJcmV0dXJuIHZhbHVlOworCQkJfQorCQl9OworCX0KKworCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUmVzZXJ2ZWRDb252ZXJ0ZXJOYW1lTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KEVjbGlwc2VMaW5rQ29udmVydC5SRVNFUlZFRF9DT05WRVJURVJfTkFNRVMpOworCX0KKwkKKwlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbnZlcnRlck5hbWVMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KAorCQkJYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LkNPTlZFUlRFUlNfTElTVCkvL1RPRE8gbmVlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBpbnRlcmZhY2UKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKKwkJCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3RJdGVyYXRvcihBcnJheVRvb2xzLnNvcnQodGhpcy5zdWJqZWN0LnVuaXF1ZUNvbnZlcnRlck5hbWVzKCkpKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydCwgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgZ2V0U3ViamVjdCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTm9Db252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnQuQ09OVkVSVEVSX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcigpID09IG51bGwpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSB7CisJCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoZmluYWwgU3RyaW5nIGNvbnZlcnRlclR5cGUpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0LCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydC5DT05WRVJURVJfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcigpOworCQkJCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGNvbnZlcnRlclR5cGUpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSB7CisJCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXIoY29udmVydGVyVHlwZSk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDb252ZXJ0LkNPTlZFUlRFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0ZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXIoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGJ1aWxkQ3VzdG9tQ29udmVydGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPihjb252ZXJ0ZXJIb2xkZXIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCQkJcmV0dXJuIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLkNVU1RPTV9DT05WRVJURVIpID8gKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IGJ1aWxkVHlwZUNvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+KGNvbnZlcnRlckhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCQkJcmV0dXJuIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKSA/IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpIGNvbnZlcnRlciA6IG51bGw7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gYnVpbGRPYmplY3RUeXBlQ29udmVydGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4oY29udmVydGVySG9sZGVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgdHJhbnNmb3JtXyhFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKwkJCQlyZXR1cm4gKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSA/IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGNvbnZlcnRlciA6IG51bGw7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBidWlsZFN0cnVjdENvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyLCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4oY29udmVydGVySG9sZGVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcikgeworCQkJCXJldHVybiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKSA/IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgY29udmVydGVyIDogbnVsbDsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtDb252ZXJ0IHZhbHVlKSB7CisJCQkJaWYgKGdldFN1YmplY3QoKSAhPSBudWxsICYmIGdldFN1YmplY3QoKS5nZXRQYXJlbnQoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKKwkJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCQkJfQorCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUgIT0gbnVsbCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMTc0ODkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IE5hbWU6ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRlcgorICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAorICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4KK3sKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udmVydGVyQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCQorCQlhZGRMYWJlbGVkVGV4dCgKKwkJCWNvbnRhaW5lciwgCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyQ29tcG9zaXRlX25hbWVUZXh0TGFiZWwsIAorCQkJYnVpbGROYW1lVGV4dEhvbGRlcigpKTsKKwkJCisJCWFkZENsYXNzQ2hvb3Nlcihjb250YWluZXIpOworCQkKKwkJbmV3IFBhbmVFbmFibGVyKGJ1aWxkQm9vbGVhbkhvbGRlcigpLCB0aGlzKTsKKwl9CisJCisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lVGV4dEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIsIFN0cmluZz4oCisJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnRlci5OQU1FX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7CisJCQl9CisJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKwkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJCisJcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBhZGRDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXJDbGFzcygpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKworCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJCQl9CisKKwkJCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXJDbGFzcyh2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0Q29udmVydGVyQ2xhc3MoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9jbGFzc0xhYmVsOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0Q29udmVydGVyQ2xhc3MoY2xhc3NOYW1lKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1cGVySW50ZXJmYWNlTmFtZSgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuRUNMSVBTRUxJTktfQ09OVkVSVEVSX0NMQVNTX05BTUU7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKKwkJCX0KKwkJfTsKKwl9CisKKworCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRCb29sZWFuSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIHZhbHVlKSB7CisvLwkJCQlpZiAoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldFBhcmVudCgpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgeworLy8JCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOworLy8JCQkJfQorCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUgIT0gbnVsbCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2YTFjYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICoKKyAqIEBzZWUgRWNsaXBzZUxpbmtDdXN0b21pemVyCisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxFY2xpcHNlTGlua0N1c3RvbWl6ZXI+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DdXN0b21pemVyQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGUoRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwgCisJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDdXN0b21pemVyPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWFkZEN1c3RvbWl6ZXJDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKKwl9CisJCisJcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rQ3VzdG9taXplcj4gYWRkQ3VzdG9taXplckNsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rQ3VzdG9taXplcj4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ3VzdG9taXplciwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ3VzdG9taXplci5TUEVDSUZJRURfQ1VTVE9NSVpFUl9DTEFTU19QUk9QRVJUWSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCisJCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgeworCQkJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQkJCX0KKworCQkJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyh2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlX2NsYXNzTGFiZWw7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoY2xhc3NOYW1lKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1cGVySW50ZXJmYWNlTmFtZSgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtDdXN0b21pemVyLkVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OQU1FOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBjaGFyIGdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRDdXN0b21pemVyQ2xhc3NFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7CisJCQl9CisJCX07CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMzYwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIGNvbXBvc2l0ZSBzaW1wbHkgc2hvd3MgYSB0cmktc3RhdGUgY2hlY2sgYm94IGZvciB0aGUgRGlzYWJsZSBIaXRzIG9wdGlvbi4KKyAqIAorICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKKyAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKKyAqCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxFY2xpcHNlTGlua0NhY2hpbmc+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcHRpb25hbENvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZShGb3JtUGFuZTw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KQorCXsKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlX2Rpc2FibGVIaXRzTGFiZWwsCisJCQlidWlsZERpc2FibGVIaXRzSG9sZGVyKCksCisJCQlidWlsZERpc2FibGVIaXRzU3RyaW5nSG9sZGVyKCksCisJCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkNBQ0hJTkdfRElTQUJMRV9ISVRTCisJCSk7CisJfQorCQorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREaXNhYmxlSGl0c0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfRElTQUJMRV9ISVRTX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERpc2FibGVIaXRzU3RyaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0RGlzYWJsZUhpdHNIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKKwkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZV9kaXNhYmxlSGl0c0RlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNMYWJlbDsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0RGlzYWJsZUhpdHNIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX0RJU0FCTEVfSElUU19QUk9QRVJUWSwKKwkJCUVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX0RJU0FCTEVfSElUU19QUk9QRVJUWSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZThhZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0VtYmVkZGFibGVBZHZhbmNlZENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0VtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VtYmVkZGFibGVBZHZhbmNlZENvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVtYmVkZGFibGU+IHsKKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGUoCisJCQlGb3JtUGFuZTw/IGV4dGVuZHMgRW1iZWRkYWJsZT4gcGFyZW50UGFuZSwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWNvbnRhaW5lciA9IGFkZENvbGxhcHNhYmxlU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9hZHZhbmNlZAorCQkpOworCQkKKwkJbmV3IEVjbGlwc2VMaW5rQ3VzdG9taXplckNvbXBvc2l0ZSh0aGlzLCBidWlsZEN1c3RvbWl6ZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKKwkJbmV3IEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUodGhpcywgYnVpbGRDaGFuZ2VUcmFja2luZ0hvbGRlcigpLCBjb250YWluZXIpOworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0N1c3RvbWl6ZXI+IGJ1aWxkQ3VzdG9taXplckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1iZWRkYWJsZSwgRWNsaXBzZUxpbmtDdXN0b21pemVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ3VzdG9taXplciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0VtYmVkZGFibGUpIHRoaXMuc3ViamVjdCkuZ2V0Q3VzdG9taXplcigpOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nPiBidWlsZENoYW5nZVRyYWNraW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbWJlZGRhYmxlLCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSB0aGlzLnN1YmplY3QpLmdldENoYW5nZVRyYWNraW5nKCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0VudGl0eUFkdmFuY2VkQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Y3MDY4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0VudGl0eUFkdmFuY2VkQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtFbnRpdHlBZHZhbmNlZENvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVudGl0eT4geworCQorCXB1YmxpYyBFY2xpcHNlTGlua0VudGl0eUFkdmFuY2VkQ29tcG9zaXRlKAorCQkJRm9ybVBhbmU8PyBleHRlbmRzIEVudGl0eT4gcGFyZW50UGFuZSwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWNvbnRhaW5lciA9IGFkZENvbGxhcHNhYmxlU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9hZHZhbmNlZAorCQkpOworCQkKKwkJbmV3IEVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGUodGhpcywgYnVpbGRSZWFkT25seUhvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ3VzdG9taXplckhvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSh0aGlzLCBidWlsZENoYW5nZVRyYWNraW5nSG9sZGVyKCksIGNvbnRhaW5lcik7CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUmVhZE9ubHk+IGJ1aWxkUmVhZE9ubHlIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgRWNsaXBzZUxpbmtSZWFkT25seT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1JlYWRPbmx5IGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rRW50aXR5KSB0aGlzLnN1YmplY3QpLmdldFJlYWRPbmx5KCk7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ3VzdG9taXplcj4gYnVpbGRDdXN0b21pemVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIEVjbGlwc2VMaW5rQ3VzdG9taXplcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtFbnRpdHkpIHRoaXMuc3ViamVjdCkuZ2V0Q3VzdG9taXplcigpOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nPiBidWlsZENoYW5nZVRyYWNraW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0VudGl0eSkgdGhpcy5zdWJqZWN0KS5nZXRDaGFuZ2VUcmFja2luZygpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJmNDkyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMzI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRhdGVUaW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOworCisvKioKKyAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLSBFeHBpcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IG8gTm8gZXhwaXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgIAkJCQkJLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgbyBUaW1lIHRvIGxpdmUgZXhwaXJ5ICAgRXhwaXJlIGFmdGVyIHwgSSAgICAgICAgICB8SXwgbWlsbGlzZWNvbmRzICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgIAkJCQkgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgfCB8CisgKiB8IHwgbyBEYWlseSBleHBpcnkgICAgICAgICAgRXhwaXJlIGF0ICAgIHwgSEg6TU06U1M6QU0vUE0gfEl8ICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCisgKiBAc2VlIEVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5CisgKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0CisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4geworCisJcHVibGljIEVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlKEZvcm1QYW5lPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJLy8gRXhwaXJ5IGdyb3VwIHBhbmUKKwkJR3JvdXAgZXhwaXJ5R3JvdXBQYW5lID0gYWRkVGl0bGVkR3JvdXAoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX2V4cGlyeVNlY3Rpb24sCisJCQkyLAorCQkJbnVsbAorCQkpOworCQkJCQorCQkvLyBObyBFeHBpcnkgcmFkaW8gYnV0dG9uCisJCUJ1dHRvbiBidXR0b24gPSBhZGRSYWRpb0J1dHRvbigKKwkJCWV4cGlyeUdyb3VwUGFuZSwKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfbm9FeHBpcnksCisJCQlidWlsZE5vRXhwaXJ5SG9sZGVyKCksCisJCQludWxsCisJCSk7CisJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCisJCQorCQkvLyBUaW1lIFRvIExpdmUgRXhwaXJ5IHJhZGlvIGJ1dHRvbgorCQlhZGRSYWRpb0J1dHRvbigKKwkJCWV4cGlyeUdyb3VwUGFuZSwKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZVRvTGl2ZUV4cGlyeSwKKwkJCWJ1aWxkRXhwaXJ5SG9sZGVyKCksCisJCQludWxsCisJCSk7CisJCQorCQlhZGRUaW1lVG9MaXZlQ29tcG9zaXRlKGV4cGlyeUdyb3VwUGFuZSk7CisJCQorCQkvLyBEYWlseSBFeHBpcnkgcmFkaW8gYnV0dG9uCisJCWFkZFJhZGlvQnV0dG9uKAorCQkJZXhwaXJ5R3JvdXBQYW5lLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV9kYWlseUV4cGlyeSwKKwkJCWJ1aWxkVGltZU9mRGF5RXhwaXJ5Qm9vbGVhbkhvbGRlcigpLAorCQkJbnVsbAorCQkpOworCQkKKwkJYWRkVGltZU9mRGF5Q29tcG9zaXRlKGV4cGlyeUdyb3VwUGFuZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFRpbWVUb0xpdmVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGhpcy5hZGRTdWJQYW5lKHBhcmVudCwgMywgMCwgMTAsIDAsIDApOworCisKKwkJQ29udHJvbCBleHBpcmVBZnRlckxhYmVsID0gYWRkVW5tYW5hZ2VkTGFiZWwoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVUb0xpdmVFeHBpcnlFeHBpcmVBZnRlcgorCQkpOworCQorCQlJbnRlZ2VyQ29tYm88Pz4gY29tYm8gPSBhZGRUaW1lVG9MaXZlRXhwaXJ5Q29tYm8oY29udGFpbmVyKTsKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOworCQljb21iby5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisJCQorCQlDb250cm9sIG1pbGxpc2Vjb25kc0xhYmVsID0JYWRkVW5tYW5hZ2VkTGFiZWwoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVUb0xpdmVFeHBpcnlNaWxsaXNlY29uZHMKKwkJKTsKKwkJCisJCVNXVFRvb2xzLmNvbnRyb2xFbmFibGVkU3RhdGUoYnVpbGRUaW1lVG9MaXZlRXhwaXJ5RW5hYmxlcigpLCBleHBpcmVBZnRlckxhYmVsLCBjb21iby5nZXRDb21ibygpLCBtaWxsaXNlY29uZHNMYWJlbCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFRpbWVPZkRheUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0aGlzLmFkZFN1YlBhbmUocGFyZW50LCAyLCAwLCAxMCwgMCwgMCk7CisKKworCQlDb250cm9sIGV4cGlyZUF0TGFiZWwgPSBhZGRVbm1hbmFnZWRMYWJlbCgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZU9mRGF5RXhwaXJ5RXhwaXJlQXQKKwkJKTsKKwkJCisJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheT4gdGltZU9mRGF5RXhwaXJ5SG9sZGVyID0gYnVpbGRUaW1lT2ZEYXlFeHBpcnlIb2xkZXIoKTsKKwkJRGF0ZVRpbWUgZGF0ZVRpbWUgPSBhZGRVbm1hbmFnZWREYXRlVGltZSgKKwkJCWNvbnRhaW5lciwgCisJCQlidWlsZFRpbWVPZkRheUV4cGlyeUhvdXJIb2xkZXIodGltZU9mRGF5RXhwaXJ5SG9sZGVyKSwgCisJCQlidWlsZFRpbWVPZkRheUV4cGlyeU1pbnV0ZUhvbGRlcih0aW1lT2ZEYXlFeHBpcnlIb2xkZXIpLAorCQkJYnVpbGRUaW1lT2ZEYXlFeHBpcnlTZWNvbmRIb2xkZXIodGltZU9mRGF5RXhwaXJ5SG9sZGVyKSwKKwkJCW51bGwpOworCisJCVNXVFRvb2xzLmNvbnRyb2xFbmFibGVkU3RhdGUoYnVpbGRUaW1lT2ZEYXlFeHBpcnlFbmFibGVyKCksIGV4cGlyZUF0TGFiZWwsIGRhdGVUaW1lKTsKKwl9CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vRXhwaXJ5SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KAorCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIAorCQkJCQlFY2xpcHNlTGlua0NhY2hpbmcuRVhQSVJZX1BST1BFUlRZLCAKKwkJCQkJRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRFeHBpcnkoKSA9PSBudWxsICYmIHRoaXMuc3ViamVjdC5nZXRFeHBpcnlUaW1lT2ZEYXkoKSA9PSBudWxsKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRFeHBpcnkobnVsbCk7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRFeHBpcnlUaW1lT2ZEYXkoKSAhPSBudWxsKSB7CisJCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEV4cGlyeUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPigKKwkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCAKKwkJCQkJRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRFeHBpcnkoKSAhPSBudWxsKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZSA9PSBCb29sZWFuLlRSVUUpIHsKKwkJCQkJdGhpcy5zdWJqZWN0LnNldEV4cGlyeSgwKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUaW1lT2ZEYXlFeHBpcnlCb29sZWFuSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KAorCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIAorCQkJCQlFY2xpcHNlTGlua0NhY2hpbmcuRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldEV4cGlyeVRpbWVPZkRheSgpICE9IG51bGwpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlID09IEJvb2xlYW4uVFJVRSkgeworCQkJCQl0aGlzLnN1YmplY3QuYWRkRXhwaXJ5VGltZU9mRGF5KCk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIEludGVnZXJDb21ibzxFY2xpcHNlTGlua0NhY2hpbmc+IGFkZFRpbWVUb0xpdmVFeHBpcnlDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCXJldHVybiBuZXcgSW50ZWdlckNvbWJvPEVjbGlwc2VMaW5rQ2FjaGluZz4odGhpcywgY29udGFpbmVyKSB7CisJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ0NvbWJvIGFkZEludGVnZXJDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCQkJcmV0dXJuIHRoaXMuYWRkVW5tYW5hZ2VkRWRpdGFibGVDQ29tYm8oCisJCQkJCQljb250YWluZXIsCisJCQkJCQlidWlsZERlZmF1bHRMaXN0SG9sZGVyKCksCisJCQkJCQlidWlsZFNlbGVjdGVkSXRlbVN0cmluZ0hvbGRlcigpLAorCQkJCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFN0cmluZz5pbnN0YW5jZSgpKTsKKwkJCX0KKwkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgeworCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQkJfQorCQkKKwkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoMCk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9QUk9QRVJUWSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV4cGlyeSgpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7CisJCQkJCQl0aGlzLnN1YmplY3Quc2V0RXhwaXJ5KHZhbHVlKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGltZVRvTGl2ZUV4cGlyeUVuYWJsZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuRVhQSVJZX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldEV4cGlyeSgpICE9IG51bGwpOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRpbWVPZkRheUV4cGlyeUVuYWJsZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldEV4cGlyeVRpbWVPZkRheSgpICE9IG51bGwpOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheT4gYnVpbGRUaW1lT2ZEYXlFeHBpcnlIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXk+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkVGltZU9mRGF5RXhwaXJ5SG91ckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXk+IHRpbWVPZkRheUV4cGlyeUhvbGRlcikgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSwgSW50ZWdlcj4oCisJCQkJCXRpbWVPZkRheUV4cGlyeUhvbGRlciwgCisJCQkJCUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5LkhPVVJfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRIb3VyKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgaG91cikgeworCQkJCXRoaXMuc3ViamVjdC5zZXRIb3VyKGhvdXIpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRUaW1lT2ZEYXlFeHBpcnlNaW51dGVIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5PiB0aW1lT2ZEYXlFeHBpcnlIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXksIEludGVnZXI+KAorCQkJCQl0aW1lT2ZEYXlFeHBpcnlIb2xkZXIsIAorCQkJCQlFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheS5NSU5VVEVfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRNaW51dGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciBtaW51dGUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0TWludXRlKG1pbnV0ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFRpbWVPZkRheUV4cGlyeVNlY29uZEhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXk+IHRpbWVPZkRheUV4cGlyeUhvbGRlcikgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSwgSW50ZWdlcj4oCisJCQkJCXRpbWVPZkRheUV4cGlyeUhvbGRlciwgCisJCQkJCUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5LlNFQ09ORF9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNlY29uZCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHNlY29uZCkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRTZWNvbmQoc2Vjb25kKTsKKwkJCX0KKwkJfTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGJmNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRpYmxlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdElkTWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRNYXBwaW5nR2VuZXJhdGlvbkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UZW1wb3JhbFR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBUZW1wb3JhbFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEdlbmVyYXRpb25Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIElkTWFwcGluZworICogQHNlZSBDb2x1bW5Db21wb3NpdGUKKyAqIEBzZWUgVGVtcG9yYWxUeXBlQ29tcG9zaXRlCisgKiBAc2VlIElkTWFwcGluZ0dlbmVyYXRpb25Db21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGU8SWRNYXBwaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SWRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUlkTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbml0aWFsaXplR2VuZXJhbFBhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZVR5cGVQYW5lKGNvbnRhaW5lcik7CisKKwkJLy8gR2VuZXJhdGlvbiBwYW5lCisJCW5ldyBJZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmFsUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7CisJCQorCQkvLyBDb2x1bW4gd2lkZ2V0cworCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCQorCQkvLyBBbGlnbiB0aGUgd2lkZ2V0cyB1bmRlciB0aGUgQ29sdW1uQ29tcG9zaXRlCisJCWNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pOworCisJCS8vIE11dGFibGUgd2lkZ2V0cworCQluZXcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkTXV0YWJsZUhvbGRlcigpLCBjb250YWluZXIpOworCX0JCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVR5cGVQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQljb250YWluZXIgPSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oCisJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90eXBlCisJCSk7CisJCSgoR3JpZExheW91dCkgY29udGFpbmVyLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gMjsKKworCQkvLyBObyBjb252ZXJ0ZXIKKwkJQnV0dG9uIG5vQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCisJCQljb250YWluZXIsIAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fZGVmYXVsdCwgCisJCQlidWlsZE5vQ29udmVydGVySG9sZGVyKCksIAorCQkJbnVsbCk7CisJCSgoR3JpZERhdGEpIG5vQ29udmVydGVyQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOworCQkJCQorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBzcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIgPSBidWlsZFNwZWNpZmllZENvbnZlcnRlckhvbGRlcigpOworCQkvLyBUZW1wb3JhbAorCQlhZGRSYWRpb0J1dHRvbigKKwkJCWNvbnRhaW5lciwgCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90ZW1wb3JhbCwgCisJCQlidWlsZFRlbXBvcmFsQm9vbGVhbkhvbGRlcigpLCAKKwkJCW51bGwpOworCQlyZWdpc3RlclN1YlBhbmUobmV3IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZShidWlsZFRlbXBvcmFsQ29udmVydGVySG9sZGVyKHNwZWNpZmllZENvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKSk7CisKKwkJLy8gRWNsaXBzZUxpbmsgQ29udmVydGVyCisJCUJ1dHRvbiBlbENvbnZlcnRlckJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAorCQkJY29udGFpbmVyLCAKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fY29udmVydGVkLCAKKwkJCWJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKCksIAorCQkJbnVsbCk7CisJCSgoR3JpZERhdGEpIGVsQ29udmVydGVyQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOworCisJCVBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0Q29tcG9zaXRlID0gYnVpbGRDb252ZXJ0Q29tcG9zaXRlKGJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIoc3BlY2lmaWVkQ29udmVydGVySG9sZGVyKSwgY29udGFpbmVyKTsKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbnZlcnRDb21wb3NpdGUuZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOworCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7CisJCXJlZ2lzdGVyU3ViUGFuZShjb252ZXJ0Q29tcG9zaXRlKTsKKwl9CisJCisJcHJvdGVjdGVkIFBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0PiBidWlsZENvbnZlcnRDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydD4gY29udmVydEhvbGRlciwgQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZShjb252ZXJ0SG9sZGVyLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSk7CisJfQorCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBFY2xpcHNlTGlua0NvbnZlcnQ+KGNvbnZlcnRlckhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0IHRyYW5zZm9ybV8oQ29udmVydGVyIGNvbnZlcnRlcikgeworCQkJCXJldHVybiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUikgPyAoRWNsaXBzZUxpbmtDb252ZXJ0KSBjb252ZXJ0ZXIgOiBudWxsOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlckJvb2xlYW5Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPElkTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuU1BFQ0lGSUVEX0NPTlZFUlRFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENvbnZlcnRlcigpOworCQkJCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgeworCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQ29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtNdXRhYmxlPiBidWlsZE11dGFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPElkTWFwcGluZywgRWNsaXBzZUxpbmtNdXRhYmxlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rTXV0YWJsZSBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0lkTWFwcGluZykgdGhpcy5zdWJqZWN0KS5nZXRNdXRhYmxlKCk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmQ4MzUwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnB0Q29yZU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IEpvaW4gRmV0Y2g6ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAorICogfCAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBGZXRjaGFibGUKKyAqIEBzZWUgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKKyAqIEBzZWUgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAorICogQHNlZSBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKKyAqIEBzZWUgT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0CisgKiBAc2VlIE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0CisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVjbGlwc2VMaW5rSm9pbkZldGNoPiB7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5GZXRjaENvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUoRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwgCisJCQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtKb2luRmV0Y2g+IHN1YmplY3RIb2xkZXIsCisJCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKCAKKyAgICAgICAgICAgIGNvbnRhaW5lciwgCisgICAgICAgICAgICBhZGRMYWJlbCggCisgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgCisgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGVfbGFiZWwpLCAKKyAgICAgICAgICAgIGFkZEpvaW5GZXRjaFR5cGVDb21ibyhjb250YWluZXIpLmdldENvbnRyb2woKSwKKyAgICAgICAgICAgIG51bGwgCisgICAgICAgKTsKKwl9CisJCisKKwlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtKb2luRmV0Y2gsIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZT4gYWRkSm9pbkZldGNoVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtKb2luRmV0Y2gsIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZT4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtKb2luRmV0Y2guVkFMVUVfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGVbXSBnZXRDaG9pY2VzKCkgeworCQkJCXJldHVybiBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUudmFsdWVzKCk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSB2YWx1ZSkgeworCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCisJCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuY2xhc3MsCisJCQkJCUVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlLnRoaXMsCisJCQkJCXZhbHVlCisJCQkJKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIG51bGxEaXNwbGF5U3RyaW5nKCkgeworCQkJCXJldHVybiBKcHRDb3JlTWVzc2FnZXMuTk9ORTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGdldFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0VmFsdWUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgdmFsdWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0VmFsdWUodmFsdWUpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjYzllOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3JkZXJpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3JkZXJpbmdDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlNYXBwaW5nfQorICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmV9CisgKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBDYXNjYWRlQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgT3JkZXJpbmdDb21wb3NpdGV9CisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIAorCWV4dGVuZHMgRm9ybVBhbmU8TWFueVRvTWFueU1hcHBpbmc+CisJaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb01hbnlNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKwkJCisJCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBNYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBidWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKKwkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7CisJCW5ldyBPcmRlcmluZ0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KKworCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgZ3JvdXBCb3hNYXJnaW4pIHsKKwkJcmV0dXJuIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pOworCX0KKworCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8TWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gYnVpbGRKb2luaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPE1hbnlUb01hbnlNYXBwaW5nLCBNYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlPigKKwkJCQlnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIE1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgdHJhbnNmb3JtXyhNYW55VG9NYW55TWFwcGluZyB2YWx1ZSkgeworCQkJCXJldHVybiB2YWx1ZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDYXNjYWRlPiBidWlsZENhc2NhZGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8TWFueVRvTWFueU1hcHBpbmcsIENhc2NhZGU+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ2FzY2FkZSB0cmFuc2Zvcm1fKE1hbnlUb01hbnlNYXBwaW5nIHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlLmdldENhc2NhZGUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rSm9pbkZldGNoPiBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hbnlUb01hbnlNYXBwaW5nLCBFY2xpcHNlTGlua0pvaW5GZXRjaD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaCBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0Sm9pbkZldGNoKCk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MzljOWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUge0BsaW5rIE1hbnlUb09uZU1hcHBpbmd9CisgKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lfQorICogQHNlZSB7QGxpbmsgRmV0Y2hUeXBlQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgT3B0aW9uYWxDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBDYXNjYWRlQ29tcG9zaXRlfQorICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8TWFueVRvT25lTWFwcGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5NYW55VG9PbmVNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCQkKKwkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7CisJfQorCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBncm91cEJveE1hcmdpbikgeworCQlyZXR1cm4gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8TWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlPiBidWlsZEpvaW5pbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8TWFueVRvT25lTWFwcGluZywgTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlPigKKwkJCQlnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIE1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSB0cmFuc2Zvcm1fKE1hbnlUb09uZU1hcHBpbmcgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtKb2luRmV0Y2g+IGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFueVRvT25lTWFwcGluZywgRWNsaXBzZUxpbmtKb2luRmV0Y2g+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2ggYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOworCQkJfQorCQl9OworCX0KKworCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FzY2FkZT4gYnVpbGRDYXNjYWRlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPE1hbnlUb09uZU1hcHBpbmcsIENhc2NhZGU+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ2FzY2FkZSB0cmFuc2Zvcm1fKE1hbnlUb09uZU1hcHBpbmcgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0Q2FzY2FkZSgpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQWR2YW5jZWRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQWR2YW5jZWRDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmM3ZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NBZHZhbmNlZENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQWR2YW5jZWRDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxNYXBwZWRTdXBlcmNsYXNzPiB7CisJCisJcHVibGljIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0FkdmFuY2VkQ29tcG9zaXRlKAorCQkJRm9ybVBhbmU8PyBleHRlbmRzIE1hcHBlZFN1cGVyY2xhc3M+IHBhcmVudFBhbmUsCisJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQljb250YWluZXIgPSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfYWR2YW5jZWQKKwkJKTsKKwkJCisJCW5ldyBFY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlKHRoaXMsIGJ1aWxkUmVhZE9ubHlIb2xkZXIoKSwgY29udGFpbmVyKTsKKwkJbmV3IEVjbGlwc2VMaW5rQ3VzdG9taXplckNvbXBvc2l0ZSh0aGlzLCBidWlsZEN1c3RvbWl6ZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKKwkJbmV3IEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUodGhpcywgYnVpbGRDaGFuZ2VUcmFja2luZ0hvbGRlcigpLCBjb250YWluZXIpOworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1JlYWRPbmx5PiBidWlsZFJlYWRPbmx5SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYXBwZWRTdXBlcmNsYXNzLCBFY2xpcHNlTGlua1JlYWRPbmx5PihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUmVhZE9ubHkgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSB0aGlzLnN1YmplY3QpLmdldFJlYWRPbmx5KCk7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ3VzdG9taXplcj4gYnVpbGRDdXN0b21pemVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYXBwZWRTdXBlcmNsYXNzLCBFY2xpcHNlTGlua0N1c3RvbWl6ZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDdXN0b21pemVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgdGhpcy5zdWJqZWN0KS5nZXRDdXN0b21pemVyKCk7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc+IGJ1aWxkQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hcHBlZFN1cGVyY2xhc3MsIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHRoaXMuc3ViamVjdCkuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWJlNWZmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIGNvbXBvc2l0ZSBzaW1wbHkgc2hvd3MgYSB0cmktc3RhdGUgY2hlY2sgYm94IGZvciB0aGUgTXV0YWJsZSBvcHRpb24uCisgKgorICogQHNlZSBFY2xpcHNlTGlua011dGFibGUKKyAqIEBzZWUgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKKyAqCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVjbGlwc2VMaW5rTXV0YWJsZT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk11dGFibGVDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZShGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLCAKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua011dGFibGU+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfbXV0YWJsZUxhYmVsLAorCQkJYnVpbGRNdXRhYmxlSG9sZGVyKCksCisJCQlidWlsZE11dGFibGVTdHJpbmdIb2xkZXIoKSwKKwkJCW51bGwKKwkJKTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTXV0YWJsZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtNdXRhYmxlLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rTXV0YWJsZS5TUEVDSUZJRURfTVVUQUJMRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE11dGFibGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRNdXRhYmxlKHZhbHVlKTsKKwkJCX0KKworCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRNdXRhYmxlU3RyaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0TXV0YWJsZUhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfbXV0YWJsZUxhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlX211dGFibGVMYWJlbDsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0TXV0YWJsZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtNdXRhYmxlLCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rTXV0YWJsZS5TUEVDSUZJRURfTVVUQUJMRV9QUk9QRVJUWSwKKwkJCUVjbGlwc2VMaW5rTXV0YWJsZS5ERUZBVUxUX01VVEFCTEVfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRNdXRhYmxlKCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjZTBkZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw0ODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQ29sdW1uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVUYWJsZVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IE5hbWU6ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRlcgorICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAorICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPgoreworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJCisJCWFkZExhYmVsZWRUZXh0KAorCQkJY29udGFpbmVyLCAKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb21wb3NpdGVfbmFtZVRleHRMYWJlbCwgCisJCQlidWlsZE5hbWVUZXh0SG9sZGVyKCkpOworCQkKKwkJYWRkRGF0YVR5cGVDaG9vc2VyKGNvbnRhaW5lcik7CisJCWFkZE9iamVjdFR5cGVDaG9vc2VyKGNvbnRhaW5lcik7CisJCQorCQlhZGRDb252ZXJzaW9uVmFsdWVzVGFibGUoY29udGFpbmVyKTsKKworCQlhZGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9kZWZhdWx0T2JqZWN0VmFsdWVMYWJlbCwKKwkJCWJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlTGlzdEhvbGRlcigpLAorCQkJYnVpbGREZWZhdWx0T2JqZWN0VmFsdWVIb2xkZXIoKSwKKwkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCksCisJCQludWxsCisJCSk7CisKKwkJbmV3IFBhbmVFbmFibGVyKGJ1aWxkQm9vbGVhbkhvbGRlcigpLCB0aGlzKTsKKwl9CisJCisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lVGV4dEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLCBTdHJpbmc+KAorCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDb252ZXJ0ZXIuTkFNRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOworCQkJfQorCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBhZGREYXRhVHlwZUNob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+KHRoaXMsIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuREFUQV9UWVBFX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREYXRhVHlwZSgpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKworCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJCQl9CisKKwkJCQkJCXRoaXMuc3ViamVjdC5zZXREYXRhVHlwZSh2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGF0YVR5cGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfZGF0YVR5cGVMYWJlbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisJCQkJZ2V0U3ViamVjdCgpLnNldERhdGFUeXBlKGNsYXNzTmFtZSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBhZGRPYmplY3RUeXBlQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5PQkpFQ1RfVFlQRV9QUk9QRVJUWSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0T2JqZWN0VHlwZSgpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKworCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJCQl9CisKKwkJCQkJCXRoaXMuc3ViamVjdC5zZXRPYmplY3RUeXBlKHZhbHVlKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRPYmplY3RUeXBlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX29iamVjdFR5cGVMYWJlbDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisJCQkJZ2V0U3ViamVjdCgpLnNldE9iamVjdFR5cGUoY2xhc3NOYW1lKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgaW50IGdldFR5cGVEaWFsb2dTdHlsZSgpIHsKKwkJCQlyZXR1cm4gSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVNfQU5EX0VOVU1TOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBjaGFyIGdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZENvbnZlcnNpb25WYWx1ZXNUYWJsZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCQorCQkvLyBKb2luIENvbHVtbnMgZ3JvdXAgcGFuZQorCQlHcm91cCBjb252ZXJzaW9uVmFsdWVzR3JvdXBQYW5lID0gYWRkVGl0bGVkR3JvdXAoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVzR3JvdXBUaXRsZQorCQkpOworCisJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBjb252ZXJzaW9uVmFsdWVIb2xkZXIgPQorCQkJYnVpbGRDb252ZXJzaW9uVmFsdWVIb2xkZXIoKTsKKwkJLy8gQ29udmVyc2lvbiBWYWx1ZXMgYWRkL3JlbW92ZSBsaXN0IHBhbmUKKwkJbmV3IEFkZFJlbW92ZVRhYmxlUGFuZTxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+KAorCQkJdGhpcywKKwkJCWNvbnZlcnNpb25WYWx1ZXNHcm91cFBhbmUsCisJCQlidWlsZENvbnZlcnNpb25WYWx1ZXNBZGFwdGVyKCksCisJCQlidWlsZENvbnZlcnNpb25WYWx1ZXNMaXN0TW9kZWwoKSwKKwkJCWNvbnZlcnNpb25WYWx1ZUhvbGRlciwKKwkJCWJ1aWxkQ29udmVyc2lvblZhbHVlc0xhYmVsUHJvdmlkZXIoKSwKKwkJCW51bGwvL1RPRE8gbmVlZCBhIGhlbHAgY29udGV4dCBpZCBmb3IgdGhpcworCQkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIENvbHVtbkFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IENvbnZlcnNpb25WYWx1ZUNvbHVtbkFkYXB0ZXIoKTsKKwkJCX0KKwkJfTsKKworCX0KKworCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gYnVpbGRDb252ZXJzaW9uVmFsdWVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPigpOworCX0KKworCXByb3RlY3RlZCBBZGRSZW1vdmVMaXN0UGFuZS5BZGFwdGVyIGJ1aWxkQ29udmVyc2lvblZhbHVlc0FkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgeworCisJCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKKwkJCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZyBkaWFsb2cgPSBidWlsZENvbnZlcnNpb25WYWx1ZURpYWxvZ0ZvckFkZCgpOworCQkJCWFkZENvbnZlcnNpb25WYWx1ZUZyb21EaWFsb2coZGlhbG9nLCBsaXN0U2VsZWN0aW9uTW9kZWwpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCkgeworCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVFZGl0OworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIG9wdGlvbk9uU2VsZWN0aW9uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKKwkJCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUgPSAoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUpIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7CisJCQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2cgZGlhbG9nID0gbmV3IEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nKGdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBnZXRTdWJqZWN0KCksIGNvbnZlcnNpb25WYWx1ZSk7CisJCQkJZWRpdENvbnZlcnNpb25WYWx1ZUZyb21EaWFsb2coZGlhbG9nLCBjb252ZXJzaW9uVmFsdWUpOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKKwkJCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gZ2V0U3ViamVjdCgpOworCQkJCWludFtdIHNlbGVjdGVkSW5kaWNlcyA9IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKTsKKworCQkJCWZvciAoaW50IGluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKKwkJCQkJY29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZShzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCisKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2cgYnVpbGRDb252ZXJzaW9uVmFsdWVEaWFsb2dGb3JBZGQoKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2coZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIGdldFN1YmplY3QoKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkQ29udmVyc2lvblZhbHVlRnJvbURpYWxvZyhFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZyBkaWFsb2csIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKKwkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRDb252ZXJzaW9uVmFsdWUoKTsKKwkJY29udmVyc2lvblZhbHVlLnNldERhdGFWYWx1ZShkaWFsb2cuZ2V0RGF0YVZhbHVlKCkpOworCQljb252ZXJzaW9uVmFsdWUuc2V0T2JqZWN0VmFsdWUoZGlhbG9nLmdldE9iamVjdFZhbHVlKCkpOworCisJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGNvbnZlcnNpb25WYWx1ZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZWRpdENvbnZlcnNpb25WYWx1ZUZyb21EaWFsb2coRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2cgZGlhbG9nLCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKKwkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKSB7CisJCQlyZXR1cm47CisJCX0KKworCQljb252ZXJzaW9uVmFsdWUuc2V0RGF0YVZhbHVlKGRpYWxvZy5nZXREYXRhVmFsdWUoKSk7CisJCWNvbnZlcnNpb25WYWx1ZS5zZXRPYmplY3RWYWx1ZShkaWFsb2cuZ2V0T2JqZWN0VmFsdWUoKSk7CisJfQorCQorCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGJ1aWxkQ29udmVyc2lvblZhbHVlc0xpc3RNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+KGJ1aWxkQ29udmVyc2lvblZhbHVlc0xpc3RIb2xkZXIoKSwgCisJCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5EQVRBX1ZBTFVFX1BST1BFUlRZLAorCQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUuT0JKRUNUX1ZBTFVFX1BST1BFUlRZKTsKKwl9CQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gYnVpbGRDb252ZXJzaW9uVmFsdWVzTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5DT05WRVJTSU9OX1ZBTFVFU19MSVNUKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5jb252ZXJzaW9uVmFsdWVzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmNvbnZlcnNpb25WYWx1ZXNTaXplKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBJVGFibGVMYWJlbFByb3ZpZGVyIGJ1aWxkQ29udmVyc2lvblZhbHVlc0xhYmVsUHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgVGFibGVMYWJlbFByb3ZpZGVyKCk7CisJfQorCQorCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgU3RyaW5nPihidWlsZENvbnZlcnNpb25WYWx1ZXNMaXN0TW9kZWwoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybUl0ZW0oRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlKSB7CisJCQkJcmV0dXJuIGNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRPYmplY3RWYWx1ZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLCBTdHJpbmc+KAorCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLkRFRkFVTFRfT0JKRUNUX1ZBTFVFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKTsKKwkJCX0KKwkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5zdWJqZWN0LnNldERlZmF1bHRPYmplY3RWYWx1ZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFN0cmluZ0NvbnZlcnRlcigpIHsKKwkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKKwkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgeworCQkJCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEJvb2xlYW5Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciB2YWx1ZSkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUgIT0gbnVsbCk7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgY2xhc3MgVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgorCQlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgeworCisJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKwkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJCisJCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUgPSAoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUpIGVsZW1lbnQ7CisJCQlTdHJpbmcgdmFsdWUgPSBudWxsOworCQkJCisJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7CisJCQkJY2FzZSBDb252ZXJzaW9uVmFsdWVDb2x1bW5BZGFwdGVyLkRBVEFfVkFMVUVfQ09MVU1OOiB7CisJCQkJCXZhbHVlID0gY29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkKKwkJCQljYXNlIENvbnZlcnNpb25WYWx1ZUNvbHVtbkFkYXB0ZXIuT0JKRUNUX1ZBTFVFX0NPTFVNTjogeworCQkJCQl2YWx1ZSA9IGNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbnZlcnNpb25WYWx1ZUNvbHVtbkFkYXB0ZXIgaW1wbGVtZW50cyBDb2x1bW5BZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiB7CisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gMjsKKwkJLy9wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT05fQ09MVU1OID0gMDsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFUQV9WQUxVRV9DT0xVTU4gPSAwOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfVkFMVUVfQ09MVU1OID0gMTsKKworCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREYXRhVmFsdWVIb2xkZXIoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgc3ViamVjdCkgeworCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUsIFN0cmluZz4oRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUuREFUQV9WQUxVRV9QUk9QRVJUWSwgc3ViamVjdCkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGF0YVZhbHVlKCk7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCQl0aGlzLnN1YmplY3Quc2V0RGF0YVZhbHVlKHZhbHVlKTsKKwkJCQl9CisJCQl9OworCQl9CisKKwkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkT2JqZWN0VmFsdWVIb2xkZXIoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgc3ViamVjdCkgeworCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUsIFN0cmluZz4oRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUuT0JKRUNUX1ZBTFVFX1BST1BFUlRZLCBzdWJqZWN0KSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRPYmplY3RWYWx1ZSgpOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJCQkJdGhpcy5zdWJqZWN0LnNldE9iamVjdFZhbHVlKHZhbHVlKTsKKwkJCQl9CisJCQl9OworCQl9CisKKwkJcHVibGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gY2VsbE1vZGVscyhFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBzdWJqZWN0KSB7CisJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGhvbGRlcnMgPSBuZXcgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bQ09MVU1OX0NPVU5UXTsKKwkJCS8vaG9sZGVyc1tTRUxFQ1RJT05fQ09MVU1OXSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PigpOworCQkJaG9sZGVyc1tEQVRBX1ZBTFVFX0NPTFVNTl0gICAgICA9IGJ1aWxkRGF0YVZhbHVlSG9sZGVyKHN1YmplY3QpOworCQkJaG9sZGVyc1tPQkpFQ1RfVkFMVUVfQ09MVU1OXSAgICAgPSBidWlsZE9iamVjdFZhbHVlSG9sZGVyKHN1YmplY3QpOworCQkJcmV0dXJuIGhvbGRlcnM7CisJCX0KKworCQlwdWJsaWMgaW50IGNvbHVtbkNvdW50KCkgeworCQkJcmV0dXJuIENPTFVNTl9DT1VOVDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgY29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKKworCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgeworCQkJCWNhc2UgQ29udmVyc2lvblZhbHVlQ29sdW1uQWRhcHRlci5EQVRBX1ZBTFVFX0NPTFVNTjogeworCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlc0RhdGFWYWx1ZUNvbHVtbjsKKwkJCQl9CisKKwkJCQljYXNlIENvbnZlcnNpb25WYWx1ZUNvbHVtbkFkYXB0ZXIuT0JKRUNUX1ZBTFVFX0NPTFVNTjogeworCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlc09iamVjdFZhbHVlQ29sdW1uOworCQkJCX0KKworCQkJCWRlZmF1bHQ6IHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5YjIyYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUgCisJZXh0ZW5kcyBGb3JtUGFuZTxFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4KK3sKKwlwdWJsaWMgRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lKAorCQkJRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwgCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U+IHN1YmplY3RIb2xkZXIsIAorCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJLy8gam9pbmluZyBzdHJhdGVneSBncm91cCBwYW5lCisJCUdyb3VwIGdyb3VwUGFuZSA9IGFkZFRpdGxlZEdyb3VwKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ190aXRsZQorCQkpOworCQkKKwkJbmV3IE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBncm91cFBhbmUpOworCQkKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuCisJCQlidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lV2l0aEluY2x1ZGVPdmVycmlkZUNoZWNrQm94KAorCQkJCXRoaXMsIAorCQkJCWdyb3VwUGFuZSk7CisJCQorCQluZXcgSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBncm91cFBhbmUpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MDQ0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9yZGVyaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEVjbGlwc2VMaW5rT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEVjbGlwc2VMaW5rdmF0ZU93bmVkQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBPbmVUb09uZU1hcHBpbmcKKyAqIEBzZWUgQ2FzY2FkZUNvbXBvc2l0ZQorICogQHNlZSBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZQorICogQHNlZSBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZQorICogQHNlZSBFY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUKKyAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCisgKiBAc2VlIE9yZGVyaW5nQ29tcG9zaXRlCisgKiBAc2VlIFRhcmdldEVudGl0eUNvbXBvc2l0ZQorICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc+IAorCWV4dGVuZHMgRm9ybVBhbmU8VD4KKyAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZWxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU9uZVRvTWFueU1hcHBpbmc8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7CisJCQorCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUodGhpcywgYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7CisJCW5ldyBPcmRlcmluZ0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IGdyb3VwQm94TWFyZ2luKSB7CisJCXJldHVybiBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlPiBidWlsZEpvaW5pbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgdHJhbnNmb3JtXyhUIHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPiBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFByaXZhdGVPd25lZCgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rSm9pbkZldGNoPiBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rSm9pbkZldGNoPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Sm9pbkZldGNoKCk7CisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDYXNjYWRlPiBidWlsZENhc2NhZGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgQ2FzY2FkZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBDYXNjYWRlIHRyYW5zZm9ybV8oVCB2YWx1ZSkgeworCQkJCXJldHVybiB2YWx1ZS5nZXRDYXNjYWRlKCk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODliNWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nPgorCWV4dGVuZHMgRm9ybVBhbmU8VD4KKwlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZWxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9PbmVNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCisJCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSwgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOworCX0KKwkKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IGdyb3VwQm94TWFyZ2luKSB7CisJCXJldHVybiBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gYnVpbGRKb2luaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIE9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlPigKKwkJCQlnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIE9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlIHRyYW5zZm9ybV8oVCB2YWx1ZSkgeworCQkJCXJldHVybiB2YWx1ZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0pvaW5GZXRjaD4gYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBFY2xpcHNlTGlua0pvaW5GZXRjaD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaCBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEpvaW5GZXRjaCgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPiBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFByaXZhdGVPd25lZCgpOworCQkJfQorCQl9OworCX0KKworCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FzY2FkZT4gYnVpbGRDYXNjYWRlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIENhc2NhZGU+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIENhc2NhZGUgdHJhbnNmb3JtXyhUIHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlLmdldENhc2NhZGUoKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTY3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIHRoZSBMb2IgY2hlY2sgYm94LgorICoKKyAqIEBzZWUgQmFzaWNNYXBwaW5nCisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJpdmF0ZU93bmVkQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZShGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLCAKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZD4gc3ViamVjdEhvbGRlciwKKwkJQ29tcG9zaXRlIHBhcmVudCkgeworCisJCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1ByaXZhdGVPd25lZCwgQm9vbGVhbj4gYnVpbGRQcml2YXRlT3duZWRIb2xkZXIoKSB7CisKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtQcml2YXRlT3duZWQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQuUFJJVkFURV9PV05FRF9QUk9QRVJUWSkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzUHJpdmF0ZU93bmVkKCkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldFByaXZhdGVPd25lZCh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7CisJCQl9CisJCX07CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWFkZENoZWNrQm94KAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZV9wcml2YXRlT3duZWRMYWJlbCwKKwkJCWJ1aWxkUHJpdmF0ZU93bmVkSG9sZGVyKCksCisJCQludWxsCisJCSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2E1MTY5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVhZE9ubHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIGNvbXBvc2l0ZSBzaW1wbHkgc2hvd3MgdGhlIFJlYWQgT25seSBjaGVjayBib3guCisgKgorICogQHNlZSBFY2xpcHNlTGlua1JlYWRPbmx5CisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8RWNsaXBzZUxpbmtSZWFkT25seT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlJlYWRPbmx5Q29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlKEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsIAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rUmVhZE9ubHk+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJLy8gVW5pcXVlIHRyaS1zdGF0ZSBjaGVjayBib3gKKwkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlX3JlYWRPbmx5TGFiZWwsCisJCQlidWlsZFNwZWNpZmllZFJlYWRPbmx5SG9sZGVyKCksCisJCQlidWlsZFJlYWRPbmx5U3RyaW5nSG9sZGVyKCksCisJCQludWxsCisJCSk7CisJfQorCQorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTcGVjaWZpZWRSZWFkT25seUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtSZWFkT25seSwgQm9vbGVhbj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlFY2xpcHNlTGlua1JlYWRPbmx5LlNQRUNJRklFRF9SRUFEX09OTFlfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRSZWFkT25seSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZFJlYWRPbmx5KHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlTdHJpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRSZWFkT25seUhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlX3JlYWRPbmx5V2l0aERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGVfcmVhZE9ubHlMYWJlbDsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0UmVhZE9ubHlIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rUmVhZE9ubHksIEJvb2xlYW4+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJRWNsaXBzZUxpbmtSZWFkT25seS5TUEVDSUZJRURfUkVBRF9PTkxZX1BST1BFUlRZLAorCQkJRWNsaXBzZUxpbmtSZWFkT25seS5ERUZBVUxUX1JFQURfT05MWV9QUk9QRVJUWSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFJlYWRPbmx5KCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzhmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIGEgdHJpLXN0YXRlIGNoZWNrIGJveCBmb3IgdGhlIFJlZnJlc2ggT25seSBJZiBOZXdlciBvcHRpb24uCisgKiAKKyAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCisgKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0CisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9wdGlvbmFsQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZShGb3JtUGFuZTw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KQorCXsKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJMYWJlbCwKKwkJCWJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VySG9sZGVyKCksCisJCQlidWlsZFJlZnJlc2hPbmx5SWZOZXdlclN0cmluZ0hvbGRlcigpLAorCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DQUNISU5HX1JFRlJFU0hfT05MWV9JRl9ORVdFUgorCQkpOworCX0KKwkKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZyZXNoT25seUlmTmV3ZXJTdHJpbmdIb2xkZXIoKSB7CisKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlckhvbGRlcigpKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7CisJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlX3JlZnJlc2hPbmx5SWZOZXdlckRlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlX3JlZnJlc2hPbmx5SWZOZXdlckxhYmVsOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1JFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSwKKwkJCUVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1JFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjJkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IE5hbWU6ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRlcgorICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAorICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4KK3sKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RydWN0Q29udmVydGVyQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCQorCQlhZGRMYWJlbGVkVGV4dCgKKwkJCWNvbnRhaW5lciwgCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyQ29tcG9zaXRlX25hbWVUZXh0TGFiZWwsIAorCQkJYnVpbGROYW1lVGV4dEhvbGRlcigpKTsKKwkJCisJCWFkZENsYXNzQ2hvb3Nlcihjb250YWluZXIpOworCQkKKwkJbmV3IFBhbmVFbmFibGVyKGJ1aWxkQm9vbGVhbkhvbGRlcigpLCB0aGlzKTsKKwl9CisJCisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lVGV4dEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIsIFN0cmluZz4oCisJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnRlci5OQU1FX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7CisJCQl9CisJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKwkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJCisJcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBhZGRDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXJDbGFzcygpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKworCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJCQl9CisKKwkJCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXJDbGFzcyh2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0Q29udmVydGVyQ2xhc3MoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9jbGFzc0xhYmVsOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0Q29udmVydGVyQ2xhc3MoY2xhc3NOYW1lKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1cGVySW50ZXJmYWNlTmFtZSgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuRUNMSVBTRUxJTktfU1RSVUNUX0NPTlZFUlRFUl9DTEFTU19OQU1FOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBjaGFyIGdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7CisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEJvb2xlYW5Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgdmFsdWUpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlICE9IG51bGwpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGIwNGVmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvT25lTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODhhZTIwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc+CisJaW1wbGVtZW50cyBNYXBwaW5nVWlEZWZpbml0aW9uPFQ+Cit7CisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7CisJCXJldHVybiBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9DT05URU5UKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlRSQU5TRk9STUFUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDMwNWZmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IE5hbWU6ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRlcgorICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAorICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPgoreworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UeXBlQ29udmVydGVyQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJCisJCWFkZExhYmVsZWRUZXh0KAorCQkJY29udGFpbmVyLCAKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb21wb3NpdGVfbmFtZVRleHRMYWJlbCwgCisJCQlidWlsZE5hbWVUZXh0SG9sZGVyKCkpOworCQkKKwkJYWRkRGF0YVR5cGVDaG9vc2VyKGNvbnRhaW5lcik7CisJCWFkZE9iamVjdFR5cGVDaG9vc2VyKGNvbnRhaW5lcik7CisJCQorCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRCb29sZWFuSG9sZGVyKCksIHRoaXMpOworCX0KKwkKKwlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVUZXh0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIsIFN0cmluZz4oCisJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnRlci5OQU1FX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7CisJCQl9CisJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKwkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJCisJcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gYWRkRGF0YVR5cGVDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPih0aGlzLCBjb250YWluZXIpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7CisJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLkRBVEFfVFlQRV9QUk9QRVJUWSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGF0YVR5cGUoKTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisKKwkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCQkJdmFsdWUgPSBudWxsOworCQkJCQkJfQorCisJCQkJCQl0aGlzLnN1YmplY3Quc2V0RGF0YVR5cGUodmFsdWUpOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERhdGFUeXBlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlX2RhdGFUeXBlTGFiZWw7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworCQkJCWdldFN1YmplY3QoKS5zZXREYXRhVHlwZShjbGFzc05hbWUpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBjaGFyIGdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gYWRkT2JqZWN0VHlwZUNob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+KHRoaXMsIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfUFJPUEVSVFkpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE9iamVjdFR5cGUoKTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisKKwkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCQkJdmFsdWUgPSBudWxsOworCQkJCQkJfQorCisJCQkJCQl0aGlzLnN1YmplY3Quc2V0T2JqZWN0VHlwZSh2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0T2JqZWN0VHlwZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgeworCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9vYmplY3RUeXBlTGFiZWw7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworCQkJCWdldFN1YmplY3QoKS5zZXRPYmplY3RUeXBlKGNsYXNzTmFtZSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIHZhbHVlKSB7CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YmVhNjkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworLyoqCisgKiBUaGUgbG9jYWxpemVkIHN0cmluZ3MgdXNlZCBieSB0aGUgbWFwcGluZyBwYW5lcy4KKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAxLjAKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfZnVsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV93ZWFrOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfc29mdF93ZWFrOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2hhcmRfd2VhazsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9jYWNoZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9ub25lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfYWR2YW5jZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jYWNoaW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY29udmVydGVyczsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZV9zaXplOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX3NlbmRfb2JqZWN0X2NoYW5nZXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfaW52YWxpZGF0ZV9jaGFuZ2VkX29iamVjdHM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfc2VuZF9uZXdfb2JqZWN0c193aXRoX2NoYW5nZXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfbm9uZTsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZV9zaGFyZWRMYWJlbERlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlX3NoYXJlZExhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZV9hZHZhbmNlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGVfYWx3YXlzUmVmcmVzaERlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlX2Fsd2F5c1JlZnJlc2hMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJEZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlX3JlZnJlc2hPbmx5SWZOZXdlckxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNEZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNMYWJlbDsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfYXR0cmlidXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfb2JqZWN0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfZGVmZXJyZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9hdXRvOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9jb252ZXJ0ZXJOYW1lTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2RlZmluZUNvbnZlcnRlclNlY3Rpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2RlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2N1c3RvbTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfdHlwZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfb2JqZWN0VHlwZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfc3RydWN0OworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyQ29tcG9zaXRlX25hbWVUZXh0TGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb21wb3NpdGVfY2xhc3NMYWJlbDsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9jdXN0b21Db252ZXJ0ZXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX29iamVjdFR5cGVDb252ZXJ0ZXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX3N0cnVjdENvbnZlcnRlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfdHlwZUNvbnZlcnRlcjsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGVfY2xhc3NMYWJlbDsKKwkJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZVNlY3Rpb25fY29udmVydGVkOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfY2hlY2tfY2FjaGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfY2hlY2tfZGF0YWJhc2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfYXNzdW1lX2V4aXN0ZW5jZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9hc3N1bWVfbm9uX2V4aXN0ZW5jZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2NoZWNrX2NhY2hlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfY2hlY2tfZGF0YWJhc2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9hc3N1bWVfZXhpc3RlbmNlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfYXNzdW1lX25vbl9leGlzdGVuY2U7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfZXhwaXJ5U2VjdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV9ub0V4cGlyeTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lVG9MaXZlRXhwaXJ5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVUb0xpdmVFeHBpcnlFeHBpcmVBZnRlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV90aW1lVG9MaXZlRXhwaXJ5TWlsbGlzZWNvbmRzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX2RhaWx5RXhwaXJ5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVPZkRheUV4cGlyeUV4cGlyZUF0OworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlX2lubmVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlX291dGVyOwkKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfbXV0YWJsZUxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZV9tdXRhYmxlTGFiZWxEZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZV90cnVlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZV9mYWxzZTsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfZGF0YVR5cGVMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfb2JqZWN0VHlwZUxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVFZGl0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVzRGF0YVZhbHVlQ29sdW1uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVzT2JqZWN0VmFsdWVDb2x1bW47CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2RlZmF1bHRPYmplY3RWYWx1ZUxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVzR3JvdXBUaXRsZTsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19hZGRDb252ZXJzaW9uVmFsdWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZWRpdENvbnZlcnNpb25WYWx1ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19hZGRDb252ZXJzaW9uVmFsdWVEZXNjcmlwdGlvblRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2VkaXRDb252ZXJzaW9uVmFsdWVEZXNjcmlwdGlvblRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2FkZENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2VkaXRDb252ZXJzaW9uVmFsdWVEZXNjcmlwdGlvbjsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19kYXRhVmFsdWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfb2JqZWN0VmFsdWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdF9kYXRhVmFsdWVNdXN0QmVTcGVjaWZpZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdF9vYmplY3RWYWx1ZU11c3RCZVNwZWNpZmllZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0X2RhdGFWYWx1ZUFscmVhZHlFeGlzdHM7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGVfcHJpdmF0ZU93bmVkTGFiZWw7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZV9yZWFkT25seUxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGVfcmVhZE9ubHlXaXRoRGVmYXVsdDsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGVfZGF0YVR5cGVMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGVfb2JqZWN0VHlwZUxhYmVsOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX0xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX25hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfY29udmVydGVyVHlwZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfYWRkQ29udmVydGVyRGVzY3JpcHRpb25UaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXJEZXNjcmlwdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdF90eXBlTXVzdEJlU3BlY2lmaWVkOworCQorCXN0YXRpYyB7CisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoImVjbGlwc2VsaW5rX3VpX2RldGFpbHMiLCBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLmNsYXNzKTsKKwl9CisKKwlwcml2YXRlIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2ZhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICoKKyAqIEB2ZXJzaW9uIDIuMgorICogQHNpbmNlIDIuMgorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb09uZU1hcHBpbmc8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjhmYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4KKwlpbXBsZW1lbnRzIE1hcHBpbmdVaURlZmluaXRpb248VD4KK3sJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQkKKwlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7CisJCXJldHVybiBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9DT05URU5UKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5WQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyN2FjMjAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDI0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0aWJsZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRlbXBvcmFsVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE11dGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgVmVyc2lvbk1hcHBpbmcKKyAqIEBzZWUgQ29sdW1uQ29tcG9zaXRlCisgKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQorICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPFZlcnNpb25NYXBwaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklWZXJzaW9uTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDb2x1bW4+IGJ1aWxkQ29sdW1uSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFZlcnNpb25NYXBwaW5nLCBDb2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ29sdW1uIHRyYW5zZm9ybV8oVmVyc2lvbk1hcHBpbmcgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0Q29sdW1uKCk7CisJCQl9CisJCX07CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWluaXRpYWxpemVHZW5lcmFsUGFuZShjb250YWluZXIpOworCQlpbml0aWFsaXplVHlwZVBhbmUoY29udGFpbmVyKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKworCQkvLyBDb2x1bW4gd2lkZ2V0cworCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCQorCQkvLyBBbGlnbiB0aGUgd2lkZ2V0cyB1bmRlciB0aGUgQ29sdW1uQ29tcG9zaXRlCisJCWNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pOworCQkKKwkJLy8gTXV0YWJsZSB3aWRnZXRzCisJCW5ldyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUodGhpcywgYnVpbGRNdXRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUeXBlUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fdHlwZQorCQkpOworCQkoKEdyaWRMYXlvdXQpIGNvbnRhaW5lci5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7CisKKwkJLy8gTm8gY29udmVydGVyCisJCUJ1dHRvbiBub0NvbnZlcnRlckJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAorCQkJY29udGFpbmVyLCAKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2RlZmF1bHQsIAorCQkJYnVpbGROb0NvbnZlcnRlckhvbGRlcigpLCAKKwkJCW51bGwpOworCQkoKEdyaWREYXRhKSBub0NvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKKwkJCQkKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gc3BlY2lmaWVkQ29udmVydGVySG9sZGVyID0gYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJLy8gVGVtcG9yYWwKKwkJYWRkUmFkaW9CdXR0b24oCisJCQljb250YWluZXIsIAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fdGVtcG9yYWwsIAorCQkJYnVpbGRUZW1wb3JhbEJvb2xlYW5Ib2xkZXIoKSwgCisJCQludWxsKTsKKwkJcmVnaXN0ZXJTdWJQYW5lKG5ldyBUZW1wb3JhbFR5cGVDb21wb3NpdGUoYnVpbGRUZW1wb3JhbENvbnZlcnRlckhvbGRlcihzcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSkpOworCisJCS8vIEVjbGlwc2VMaW5rIENvbnZlcnRlcgorCQlCdXR0b24gZWxDb252ZXJ0ZXJCdXR0b24gPSBhZGRSYWRpb0J1dHRvbigKKwkJCWNvbnRhaW5lciwgCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2NvbnZlcnRlZCwgCisJCQlidWlsZEVjbGlwc2VMaW5rQ29udmVydGVyQm9vbGVhbkhvbGRlcigpLCAKKwkJCW51bGwpOworCQkoKEdyaWREYXRhKSBlbENvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKKworCQlQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4gY29udmVydENvbXBvc2l0ZSA9IGJ1aWxkQ29udmVydENvbXBvc2l0ZShidWlsZEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKHNwZWNpZmllZENvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lcik7CisJCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBjb252ZXJ0Q29tcG9zaXRlLmdldENvbnRyb2woKS5nZXRMYXlvdXREYXRhKCk7CisJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOworCQlyZWdpc3RlclN1YlBhbmUoY29udmVydENvbXBvc2l0ZSk7CisJfQorCQorCXByb3RlY3RlZCBQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4gYnVpbGRDb252ZXJ0Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQ+IGNvbnZlcnRIb2xkZXIsIENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUoY29udmVydEhvbGRlciwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpOworCX0KKworCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vQ29udmVydGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxWZXJzaW9uTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuU1BFQ0lGSUVEX0NPTlZFUlRFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSA9PSBudWxsKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgeworCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5OT19DT05WRVJURVIpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydD4gYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rQ29udmVydD4oY29udmVydGVySG9sZGVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnQgdHJhbnNmb3JtXyhDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCQkJcmV0dXJuIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKSA/IChFY2xpcHNlTGlua0NvbnZlcnQpIGNvbnZlcnRlciA6IG51bGw7CisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGVtcG9yYWxCb29sZWFuSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxWZXJzaW9uTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuU1BFQ0lGSUVEX0NPTlZFUlRFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENvbnZlcnRlcigpOworCQkJCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSB7CisJCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCQkJfQorCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlckJvb2xlYW5Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFZlcnNpb25NYXBwaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbnZlcnRpYmxlTWFwcGluZy5TUEVDSUZJRURfQ09OVkVSVEVSX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCUNvbnZlcnRlciBjb252ZXJ0ZXIgPSB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCk7CisJCQkJaWYgKGNvbnZlcnRlciA9PSBudWxsKSB7CisJCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQkJCX0KKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSB7CisJCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFZlcnNpb25NYXBwaW5nLCBDb252ZXJ0ZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLlNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIENvbnZlcnRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENvbnZlcnRlcigpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFRlbXBvcmFsQ29udmVydGVyPiBidWlsZFRlbXBvcmFsQ29udmVydGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlciwgVGVtcG9yYWxDb252ZXJ0ZXI+KGNvbnZlcnRlckhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgVGVtcG9yYWxDb252ZXJ0ZXIgdHJhbnNmb3JtXyhDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCQkJcmV0dXJuIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpID8gKFRlbXBvcmFsQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rTXV0YWJsZT4gYnVpbGRNdXRhYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxWZXJzaW9uTWFwcGluZywgRWNsaXBzZUxpbmtNdXRhYmxlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rTXV0YWJsZSBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldE11dGFibGUoKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjAzODc0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gRWNsaXBzZUxpbmsgSmF2YSBlbnRpdHkuCisgKgorICogQHNlZSBKYXZhRWNsaXBzZUxpbmtFbnRpdHkKKyAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKKyAqCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlPFQgZXh0ZW5kcyBKYXZhRW50aXR5PiBleHRlbmRzIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlPFQ+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0phdmFFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5KYXZhRW50aXR5PC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWluaXRpYWxpemVHZW5lcmFsUGFuZShjb250YWluZXIpOworCQlpbml0aWFsaXplQ2FjaGluZ1BhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZVF1ZXJpZXNQYW5lKGNvbnRhaW5lcik7CisJCWluaXRpYWxpemVJbmhlcml0YW5jZVBhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlc1BhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZUdlbmVyYXRvcnNQYW5lKGNvbnRhaW5lcik7CisJCWluaXRpYWxpemVDb252ZXJ0ZXJzUGFuZShjb250YWluZXIpOworCQlpbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzUGFuZShjb250YWluZXIpOworCQlpbml0aWFsaXplQWR2YW5jZWRQYW5lKGNvbnRhaW5lcik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQljb250YWluZXIgPSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oCisJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY2FjaGluZworCQkpOworCisJCWFkZENhY2hpbmdDb21wb3NpdGUoY29udGFpbmVyLCBidWlsZENhY2hpbmdIb2xkZXIoKSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZENhY2hpbmdDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NhY2hpbmc+IGNhY2hpbmdIb2xkZXIpIHsKKwkJbmV3IEphdmFFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUodGhpcywgY2FjaGluZ0hvbGRlciwgY29udGFpbmVyKTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW50aXR5LCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPiBidWlsZENhY2hpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbnRpdHksIEphdmFFY2xpcHNlTGlua0NhY2hpbmc+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgdGhpcy5zdWJqZWN0KS5nZXRDYWNoaW5nKCk7CisJCQl9CisJCX07CisJCQorCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NvbnZlcnRlcnMKKwkJKTsKKworCQluZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSh0aGlzLCBidWlsZENvbnZlcnRlckhvbGRlclZhbHVlTW9kZWwoKSwgY29udGFpbmVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXJWYWx1ZU1vZGVsKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW50aXR5LCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgdGhpcy5zdWJqZWN0KS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJCX0JCisJCX07CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZEluaGVyaXRhbmNlQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJbmV3IEphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWR2YW5jZWRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJbmV3IEVjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MTE5NmMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQWR2YW5jZWRDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluayBKYXZhIE1hcHBlZCBTdXBlcmNsYXNzLgorICoKKyAqIEBzZWUgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzCisgKiBAc2VlIEVjbGlwc2VsaW5rSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCisgKgorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxKYXZhTWFwcGVkU3VwZXJjbGFzcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKGNvbnRhaW5lcik7CQkKKwkJaW5pdGlhbGl6ZUNhY2hpbmdQYW5lKGNvbnRhaW5lcik7CisJCWluaXRpYWxpemVDb252ZXJ0ZXJzUGFuZShjb250YWluZXIpOworCQlpbml0aWFsaXplQWR2YW5jZWRQYW5lKGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmFsUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoaW5nUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDUpLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NhY2hpbmcKKwkJKTsKKwkJYWRkQ2FjaGluZ0NvbXBvc2l0ZShjb250YWluZXIsIGJ1aWxkQ2FjaGluZ0hvbGRlcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2FjaGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gY2FjaGluZ0hvbGRlcikgeworCQluZXcgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSh0aGlzLCBjYWNoaW5nSG9sZGVyLCBjb250YWluZXIpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFNYXBwZWRTdXBlcmNsYXNzLCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPiBidWlsZENhY2hpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFNYXBwZWRTdXBlcmNsYXNzLCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSB0aGlzLnN1YmplY3QpLmdldENhY2hpbmcoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NvbnZlcnRlcnMKKwkJKTsKKworCQluZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSh0aGlzLCBidWlsZENvbnZlcnRlckhvbGRlclZhbHVlTW9kZWwoKSwgY29udGFpbmVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXJWYWx1ZU1vZGVsKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFwcGVkU3VwZXJjbGFzcywgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSB0aGlzLnN1YmplY3QpLmdldENvbnZlcnRlckhvbGRlcigpOworCQkJfQkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFkdmFuY2VkUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NBZHZhbmNlZENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmN2UzMjQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFPbmVUb01hbnlNYXBwaW5nPgorCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFPbmVUb01hbnlNYXBwaW5nPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCW5ldyBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFPbmVUb01hbnlNYXBwaW5nPiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0RGVmYXVsdEtleSgpKTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0YjE4NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIERlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0T25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFPbmVUb09uZU1hcHBpbmc+CisJaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU9uZVRvT25lTWFwcGluZz4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCW5ldyBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU9uZVRvT25lTWFwcGluZz4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIERlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0RGVmYXVsdEtleSgpKTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlSmF2YU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDZiZTJjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgRGVmYXVsdEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uCisJaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+Cit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCW5ldyBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIERlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLZXkoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0JCisJCisJcHVibGljIEltYWdlIGdldEltYWdlKCkgeworCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfQ09OVEVOVCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0JCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGlua0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1Nzk4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW50aXR5VWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLk51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCisJICovCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSmF2YVVpRmFjdG9yeSBidWlsZEphdmFVaUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKYXZhVWlGYWN0b3J5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7CisJCWRlZmluaXRpb25zLmFkZChKYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+PiBkZWZpbml0aW9ucykgeworCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChOdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmtKYXZhVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmtKYXZhVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhNzI4NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGlua0phdmFVaUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5CYXNlSmF2YVVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhVWlGYWN0b3J5IGV4dGVuZHMgQmFzZUphdmFVaUZhY3RvcnkKK3sKKwlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhVWlGYWN0b3J5KCkgeworCQlzdXBlcigpOworCX0KKwkKKwkvLyAqKioqKioqKioqKioqKioqIGphdmEgdHlwZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRW50aXR5Q29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRW1iZWRkYWJsZUNvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUlkTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUJhc2ljTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFWZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsIAorCQkJQ29tcG9zaXRlIHBhcmVudCwgCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwgCisJCQlDb21wb3NpdGUgcGFyZW50LCAKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwgCisJCQlDb21wb3NpdGUgcGFyZW50LCAKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwgCisJCQlDb21wb3NpdGUgcGFyZW50LCAKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTY3NDk0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uCisJZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPgorCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1MzBmZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24KKwlleHRlbmRzIEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPgorCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+Cit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCW5ldyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDgyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCisgKiA8cD4KKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVudGl0eQorICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcyXzAKKyAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKKyAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKKyAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCisgKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCisgKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4KK3sKKworCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlKEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCisgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPiBzdWJqZWN0SG9sZGVyLAorICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgeworCQluZXcgSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUodGhpcywgcGFyZW50KTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzMzE3MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwyNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgWCBDdXN0b21Db252ZXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgfCBDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCBYIFR5cGUgQ29udmVydGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICB8IFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IFggT2plY3QgVHlwZSBDb252ZXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgIHwgT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgWCBTdHJ1Y3QgQ29udmVydGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgfCBTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4KK3sKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udmVyc2lvbkNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCisJCQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPiBzdWJqZWN0SG9sZGVyLAorCQkJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWluaXRpYWxpemVDb252ZXJ0ZXJQYW5lKGNvbnRhaW5lcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ29udmVydGVyUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCS8vIEN1c3RvbSBDb252ZXJ0ZXIgY2hlY2sgYm94CisJCUJ1dHRvbiBjdXN0b21Db252ZXJ0ZXJDaGVja0JveCA9IGFkZENoZWNrQm94KAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDUpLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfY3VzdG9tQ29udmVydGVyLAorCQkJYnVpbGRDdXN0b21Db252ZXJ0ZXJCb29sZWFuSG9sZGVyKCksCisJCQludWxsCisJCSk7CisKKwkJLy8gQ3VzdG9tIENvbnZlcnRlciBwYW5lCisJCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyQ29tcG9zaXRlIGN1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZSgKKwkJCWJ1aWxkQ3VzdG9tQ29udmVydGVySG9sZGVyKCksCisJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgY3VzdG9tQ29udmVydGVyQ2hlY2tCb3guZ2V0Qm9yZGVyV2lkdGgoKSArIDE2KSwKKwkJCWdldFdpZGdldEZhY3RvcnkoKQorCQkpOworCQlyZWdpc3RlclN1YlBhbmUoY3VzdG9tQ29udmVydGVyQ29tcG9zaXRlKTsKKwkKKwkJCisJCS8vIFR5cGUgQ29udmVydGVyIGNoZWNrIGJveAorCQlCdXR0b24gdHlwZUNvbnZlcnRlckNoZWNrQm94ID0gYWRkQ2hlY2tCb3goCisJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV90eXBlQ29udmVydGVyLAorCQkJYnVpbGRUeXBlQ29udmVydGVyQm9vbGVhbkhvbGRlcigpLAorCQkJbnVsbAorCQkpOworCisJCS8vIFR5cGUgQ29udmVydGVyIHBhbmUKKwkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlIHR5cGVDb252ZXJ0ZXJDb21wb3NpdGUgPSBuZXcgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlKAorCQkJYnVpbGRUeXBlQ29udmVydGVySG9sZGVyKCksCisJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgdHlwZUNvbnZlcnRlckNoZWNrQm94LmdldEJvcmRlcldpZHRoKCkgKyAxNiksCisJCQlnZXRXaWRnZXRGYWN0b3J5KCkKKwkJKTsKKwkJcmVnaXN0ZXJTdWJQYW5lKHR5cGVDb252ZXJ0ZXJDb21wb3NpdGUpOworCQkKKwkJLy8gT2JqZWN0IFR5cGUgQ29udmVydGVyIGNoZWNrIGJveAorCQlCdXR0b24gb2JqZWN0VHlwZUNvbnZlcnRlckNoZWNrQm94ID0gYWRkQ2hlY2tCb3goCisJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9vYmplY3RUeXBlQ29udmVydGVyLAorCQkJYnVpbGRPYmplY3RUeXBlQ29udmVydGVyQm9vbGVhbkhvbGRlcigpLAorCQkJbnVsbAorCQkpOworCisJCS8vIE9iamVjdCBUeXBlIENvbnZlcnRlciBwYW5lCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSBvYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlID0gbmV3IEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSgKKwkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckhvbGRlcigpLAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDAsIG9iamVjdFR5cGVDb252ZXJ0ZXJDaGVja0JveC5nZXRCb3JkZXJXaWR0aCgpICsgMTYpLAorCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpCisJCSk7CisJCXJlZ2lzdGVyU3ViUGFuZShvYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlKTsKKwkJCisJCS8vIFN0cnVjdCBDb252ZXJ0ZXIgY2hlY2sgYm94CisJCUJ1dHRvbiBzdHJ1Y3RDb252ZXJ0ZXJDaGVja0JveCA9IGFkZENoZWNrQm94KAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDUpLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfc3RydWN0Q29udmVydGVyLAorCQkJYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKCksCisJCQludWxsCisJCSk7CisKKwkJLy8gU3RydWN0IENvbnZlcnRlciBwYW5lCisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQ29tcG9zaXRlIHN0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSgKKwkJCWJ1aWxkU3RydWN0Q29udmVydGVySG9sZGVyKCksCisJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgc3RydWN0Q29udmVydGVyQ2hlY2tCb3guZ2V0Qm9yZGVyV2lkdGgoKSArIDE2KSwKKwkJCWdldFdpZGdldEZhY3RvcnkoKQorCQkpOworCQlyZWdpc3RlclN1YlBhbmUoc3RydWN0Q29udmVydGVyQ29tcG9zaXRlKTsKKwl9CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEN1c3RvbUNvbnZlcnRlckJvb2xlYW5Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuQ1VTVE9NX0NPTlZFUlRFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRDdXN0b21Db252ZXJ0ZXIoKSAhPSBudWxsKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldEN1c3RvbUNvbnZlcnRlcigpID09IG51bGwpKSB7CisJCQkJCXRoaXMuc3ViamVjdC5hZGRDdXN0b21Db252ZXJ0ZXIoKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIXZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0Q3VzdG9tQ29udmVydGVyKCkgIT0gbnVsbCkpIHsKKwkJCQkJdGhpcy5zdWJqZWN0LnJlbW92ZUN1c3RvbUNvbnZlcnRlcigpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGJ1aWxkQ3VzdG9tQ29udmVydGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIsIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPihnZXRTdWJqZWN0SG9sZGVyKCksIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlci5DVVNUT01fQ09OVkVSVEVSX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEN1c3RvbUNvbnZlcnRlcigpOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVHlwZUNvbnZlcnRlckJvb2xlYW5Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuVFlQRV9DT05WRVJURVJfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0VHlwZUNvbnZlcnRlcigpICE9IG51bGwpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0VHlwZUNvbnZlcnRlcigpID09IG51bGwpKSB7CisJCQkJCXRoaXMuc3ViamVjdC5hZGRUeXBlQ29udmVydGVyKCk7CisJCQkJfQorCQkJCWVsc2UgaWYgKCF2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldFR5cGVDb252ZXJ0ZXIoKSAhPSBudWxsKSkgeworCQkJCQl0aGlzLnN1YmplY3QucmVtb3ZlVHlwZUNvbnZlcnRlcigpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBidWlsZFR5cGVDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPihnZXRTdWJqZWN0SG9sZGVyKCksIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlci5UWVBFX0NPTlZFUlRFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VHlwZUNvbnZlcnRlcigpOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckJvb2xlYW5Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSAhPSBudWxsKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSA9PSBudWxsKSkgeworCQkJCQl0aGlzLnN1YmplY3QuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQkJCX0KKwkJCQllbHNlIGlmICghdmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRPYmplY3RUeXBlQ29udmVydGVyKCkgIT0gbnVsbCkpIHsKKwkJCQkJdGhpcy5zdWJqZWN0LnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gYnVpbGRPYmplY3RUeXBlQ29udmVydGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRPYmplY3RUeXBlQ29udmVydGVyKCk7CisJCQl9CisJCX07CisJfQorCQorCQorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLlNUUlVDVF9DT05WRVJURVJfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0U3RydWN0Q29udmVydGVyKCkgIT0gbnVsbCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKSA9PSBudWxsKSkgeworCQkJCQl0aGlzLnN1YmplY3QuYWRkU3RydWN0Q29udmVydGVyKCk7CisJCQkJfQorCQkJCWVsc2UgaWYgKCF2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldFN0cnVjdENvbnZlcnRlcigpICE9IG51bGwpKSB7CisJCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBidWlsZFN0cnVjdENvbnZlcnRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuU1RSVUNUX0NPTlZFUlRFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjBhNjk5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rRW1iZWRkYWJsZUFkdmFuY2VkQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgcGFuZSBkb2VzIG5vdCBoYXZlIGFueSB3aWRnZXRzLgorICoKKyAqIEBzZWUgRW1iZWRkYWJsZQorICogQHNlZSBKYXZhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCisgKiBAc2VlIEVtYmVkZGFibGVVaVByb3ZpZGVyCisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8SmF2YUVtYmVkZGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW1iZWRkYWJsZUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbml0aWFsaXplQ29udmVydGVyc1BhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZUFkdmFuY2VkUGFuZShjb250YWluZXIpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDUpLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NvbnZlcnRlcnMKKwkJKTsKKworCQluZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSh0aGlzLCBidWlsZENvbnZlcnRlckhvbGRlclZhbHVlTW9kZWwoKSwgY29udGFpbmVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXJWYWx1ZU1vZGVsKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW1iZWRkYWJsZSwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSB0aGlzLnN1YmplY3QpLmdldENvbnZlcnRlckhvbGRlcigpOworCQkJfQkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFkdmFuY2VkUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBFY2xpcHNlTGlua0VtYmVkZGFibGVBZHZhbmNlZENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0MzRjMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluayBKYXZhIGVudGl0eS4KKyAqCisgKiBAc2VlIEphdmFFY2xpcHNlTGlua0VudGl0eQorICogQHNlZSBFY2xpcHNlbGlua0pwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQorICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGU8SmF2YUVudGl0eT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rSmF2YUVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkphdmFFbnRpdHk8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWY1MzBjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAJCQkgIAkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHggRXhpc3RlbmNlIENoZWNraW5nOiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgIAkJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKKyAqIEBzZWUgQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0CisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEphdmFFY2xpcHNlTGlua0NhY2hpbmc+IHsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEphdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlKEZvcm1QYW5lPD8gZXh0ZW5kcyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWFkZExhYmVsZWRDb21wb3NpdGUoIAorICAgICAgICAgICAgY29udGFpbmVyLCAKKyAgICAgICAgICAgIGFkZENoZWNrQm94KCAKKyAgICAgICAgICAgICAgICAgY29udGFpbmVyLCAKKyAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2xhYmVsLCAKKyAgICAgICAgICAgICAgICAgYnVpbGRFeGlzdGVuY2VDaGVja2luZ0hvbGRlcigpLCAKKyAgICAgICAgICAgICAgICAgbnVsbCAKKyAgICAgICAgICAgICksIAorICAgICAgICAgICAgYWRkRXhpc3RlbmNlQ2hlY2tpbmdUeXBlQ29tYm8oY29udGFpbmVyKS5nZXRDb250cm9sKCksIAorICAgICAgICAgICAgbnVsbCAKKyAgICAgICApOworCX0KKworCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZT4gYWRkRXhpc3RlbmNlQ2hlY2tpbmdUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZT4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfRVhJU1RFTkNFX1RZUEVfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfRVhJU1RFTkNFX1RZUEVfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGVbXSBnZXRDaG9pY2VzKCkgeworCQkJCXJldHVybiBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUudmFsdWVzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKKwkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAorCQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLmNsYXNzLAorCQkJCQlKYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZS50aGlzLAorCQkJCQl2YWx1ZQorCQkJCSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSh2YWx1ZSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRXhpc3RlbmNlQ2hlY2tpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZy5FWElTVEVOQ0VfQ0hFQ0tJTkdfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaGFzRXhpc3RlbmNlQ2hlY2tpbmcoKSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0RXhpc3RlbmNlQ2hlY2tpbmcodmFsdWUuYm9vbGVhblZhbHVlKCkpOworCQkJfQorCQl9OworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5OWI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluayBKYXZhIE1hcHBlZCBTdXBlcmNsYXNzLgorICoKKyAqIEBzZWUgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzCisgKiBAc2VlIEVjbGlwc2VsaW5rSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZTUwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uCisJZXh0ZW5kcyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4KKwlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJCisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YThiMzgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbgorCWV4dGVuZHMgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPgorCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjZlNWEwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLlNjaGVtYUNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBhY2thZ2VDaG9vc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1RdWVyaWVzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFhtbFBhY2thZ2VDaG9vc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgU2NoZW1hOiAgICAgIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgQ2F0YWxvZzogICAgIHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgQWNjZXNzIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcm1RdWVyaWVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENvbnZlcnRlcnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVudGl0eU1hcHBpbmdzCisgKiBAc2VlIEFic3RyYWN0RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqIEBzZWUgQ2F0YWxvZ0NvbWJvCisgKiBAc2VlIEVudW1Gb3JtQ29tYm9WaWV3ZXIKKyAqIEBzZWUgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlCisgKiBAc2VlIE9ybVBhY2thZ2VDaG9vc2VyCisgKiBAc2VlIE9ybVF1ZXJpZXNDb21wb3NpdGUKKyAqIEBzZWUgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUKKyAqIEBzZWUgU2NoZW1hQ29tYm8KKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwcm90ZWN0ZWQgQWJzdHJhY3RFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCS8vIFBhY2thZ2Ugd2lkZ2V0cworCQluZXcgT3JtUGFja2FnZUNob29zZXIodGhpcywgY29udGFpbmVyKTsKKworCQkvLyBTY2hlbWEgd2lkZ2V0cworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9zY2hlbWEsCisJCQl0aGlzLmFkZFNjaGVtYUNvbWJvKGNvbnRhaW5lciksCisJCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX1NDSEVNQQorCQkpOworCisJCS8vIENhdGFsb2cgd2lkZ2V0cworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9jYXRhbG9nLAorCQkJdGhpcy5hZGRDYXRhbG9nQ29tYm8oY29udGFpbmVyKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fQ0FUQUxPRworCQkpOworCisJCS8vIEFjY2VzcyBUeXBlIHdpZGdldHMKKwkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLkVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfYWNjZXNzLAorCQkJdGhpcy5hZGRBY2Nlc3NUeXBlQ29tYm8oY29udGFpbmVyKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fQUNDRVNTCisJCSk7CisKKwkJLy8gUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YSB3aWRnZXRzCisJCW5ldyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZSgKKwkJCXRoaXMsCisJCQl0aGlzLmJ1aWxkUGVyc2lzdGVudFVuaXRNZXRhZGF0YUhvbGRlcigpLAorCQkJdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkKKwkJKTsKKworCQkvLyBHZW5lcmF0b3JzIHBhbmUKKwkJdGhpcy5idWlsZEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZShjb250YWluZXIpOworCisJCS8vIFF1ZXJpZXMgcGFuZQorCQluZXcgT3JtUXVlcmllc0NvbXBvc2l0ZSgKKwkJCXRoaXMsCisJCQljb250YWluZXIKKwkJKTsKKwkJCisJCS8vIENvbnZlcnRlcnMgc2VjdGlvbgorCQljb250YWluZXIgPSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9MYWJlbAorCQkpOworCQkKKwkJbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSgKKwkJCXRoaXMsCisJCQl0aGlzLmJ1aWxkQ29udmVydGVySG9sZGVyKCksCisJCQljb250YWluZXIKKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHlNYXBwaW5ncywgRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgdGhpcy5zdWJqZWN0KS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJCX0KKwkJfTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2N2ViOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0T3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtFbnRpdHlBZHZhbmNlZENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdE9ybUVudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdE9ybUVudGl0eUNvbXBvc2l0ZQoreworCXByb3RlY3RlZCBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKGNvbnRhaW5lcik7CisJCWluaXRpYWxpemVDYWNoaW5nUGFuZShjb250YWluZXIpOworCQlpbml0aWFsaXplUXVlcmllc1BhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZUluaGVyaXRhbmNlUGFuZShjb250YWluZXIpOworCQlpbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVzUGFuZShjb250YWluZXIpOworCQlpbml0aWFsaXplR2VuZXJhdG9yc1BhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZUNvbnZlcnRlcnNQYW5lKGNvbnRhaW5lcik7CisJCWluaXRpYWxpemVTZWNvbmRhcnlUYWJsZXNQYW5lKGNvbnRhaW5lcik7CisJCWluaXRpYWxpemVBZHZhbmNlZFBhbmUoY29udGFpbmVyKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDUpLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NhY2hpbmcpOworCQlhZGRDYWNoaW5nQ29tcG9zaXRlKGNvbnRhaW5lciwgYnVpbGRDYWNoaW5nSG9sZGVyKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRDYWNoaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua0NhY2hpbmc+IGNhY2hpbmdIb2xkZXIpIHsKKwkJbmV3IE9ybUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSh0aGlzLCBjYWNoaW5nSG9sZGVyLCBjb250YWluZXIpOworCX0KKworCQorCXByaXZhdGUgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybUVudGl0eSwgT3JtRWNsaXBzZUxpbmtDYWNoaW5nPiBidWlsZENhY2hpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybUVudGl0eSwgT3JtRWNsaXBzZUxpbmtDYWNoaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ2FjaGluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChPcm1FY2xpcHNlTGlua0VudGl0eSkgdGhpcy5zdWJqZWN0KS5nZXRDYWNoaW5nKCk7CisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQljb250YWluZXIgPSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9MYWJlbAorCQkpOworCisJCW5ldyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUodGhpcywgYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1FbnRpdHksIEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiAoKE9ybUVjbGlwc2VMaW5rRW50aXR5KSB0aGlzLnN1YmplY3QpLmdldENvbnZlcnRlckhvbGRlcigpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWR2YW5jZWRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJbmV3IEVjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmVjYzU1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0FkdmFuY2VkQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtSmF2YUNsYXNzQ2hvb3NlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlPFQgZXh0ZW5kcyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M+IAorCWV4dGVuZHMgRm9ybVBhbmU8VD4gCisJaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWluaXRpYWxpemVHZW5lcmFsUGFuZShjb250YWluZXIpOworCQlpbml0aWFsaXplQ2FjaGluZ1BhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZUNvbnZlcnRlcnNQYW5lKGNvbnRhaW5lcik7CisJCWluaXRpYWxpemVBZHZhbmNlZFBhbmUoY29udGFpbmVyKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJbmV3IE9ybUphdmFDbGFzc0Nob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgSWRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCQluZXcgTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQWNjZXNzSG9sZGVyPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGUoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDUpLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NhY2hpbmcKKwkJKTsKKwkJCisJCWFkZENhY2hpbmdDb21wb3NpdGUoY29udGFpbmVyLCBidWlsZENhY2hpbmdIb2xkZXIoKSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZENhY2hpbmdDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4gY2FjaGluZ0hvbGRlcikgeworCQluZXcgT3JtRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlKHRoaXMsIGNhY2hpbmdIb2xkZXIsIGNvbnRhaW5lcik7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgT3JtRWNsaXBzZUxpbmtDYWNoaW5nPiBidWlsZENhY2hpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ2FjaGluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENhY2hpbmcoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWNvbnRhaW5lciA9IGFkZENvbGxhcHNhYmxlU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX0xhYmVsCisJCSk7CisKKwkJbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSh0aGlzLCBidWlsZENvbnZlcnRlckhvbGRlcigpLCBjb250YWluZXIpOworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVySG9sZGVyKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBZHZhbmNlZFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQWR2YW5jZWRDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9CYXNlRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Jhc2VFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjBkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9CYXNlRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5CYXNlT3JtWG1sVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkgZXh0ZW5kcyBCYXNlT3JtWG1sVWlGYWN0b3J5Cit7CisJLy8gKioqKioqKioqKioqKioqKiBvcm0gdHlwZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVudGl0eUNvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRhYmxlQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogb3JtIGF0dHJpYnV0ZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUlkTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1JZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1PbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1PbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1UcmFuc2llbnRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IFRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTJjZTFiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2cuamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuVmFsaWRhdGluZ0RpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0xpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCisvKioKKyAqIENsaWVudHMgY2FuIHVzZSB0aGlzIGRpYWxvZyB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIFNlY29uZGFyeVRhYmxlIHNldHRpbmdzLgorICogVXNlIHRoZSBmb2xsb3dpbmcgb25jZSB0aGUgZGlhbG9nIGlzIGNsb3NlZDoKKyAqICAgICBAc2VlICNnZXRTZWxlY3RlZFRhYmxlKCkKKyAqICAgICBAc2VlICNnZXRTZWxlY3RlZENhdGFsb2coKQorICogICAgIEBzZWUgI2dldFNlbGVjdGVkU2NoZW1hKCkKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2cgZXh0ZW5kcyBWYWxpZGF0aW5nRGlhbG9nPEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3Q+IHsKKworCQorCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKKworCS8qKgorCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHRvIGVkaXQgYW4gZXhpc3RpbmcgY29udmVyc2lvbiB2YWx1ZQorCSAqLworCXB1YmxpYyBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZyhTaGVsbCBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QoKTsKKwl9CisKKwkvLyAqKioqKioqKioqIG9wZW4gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKKwkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOworCQlzaGVsbC5zZXRUZXh0KHRoaXMuZ2V0VGl0bGUoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfYWRkQ29udmVydGVyOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25UaXRsZSgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfYWRkQ29udmVydGVyRGVzY3JpcHRpb25UaXRsZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfYWRkQ29udmVydGVyRGVzY3JpcHRpb247CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBEaWFsb2dQYW5lPEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3Q+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uVmFsdWVEaWFsb2dQYW5lKGNvbnRhaW5lcik7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKKwkJc3VwZXIuY3JlYXRlKCk7CisKKwkJQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZSBwYW5lID0gKENvbnZlcnNpb25WYWx1ZURpYWxvZ1BhbmUpIGdldFBhbmUoKTsKKwkJcGFuZS5zZWxlY3RBbGwoKTsKKworCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOworCX0KKworCisJLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgZGF0YSB2YWx1ZSBzZXQgaW4gdGhlIHRleHQgd2lkZ2V0LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXROYW1lKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBvYmplY3QgdmFsdWUgc2V0IGluIHRoZSB0ZXh0IHdpZGdldC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlclR5cGUoKSB7CisJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0Q29udmVydGVyVHlwZSgpOworCX0KKwkKKwlwcml2YXRlIGNsYXNzIENvbnZlcnNpb25WYWx1ZURpYWxvZ1BhbmUgZXh0ZW5kcyBEaWFsb2dQYW5lPEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3Q+IHsKKworCQlwcml2YXRlIFRleHQgbmFtZVRleHQ7CisKKwkJQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZShDb21wb3NpdGUgcGFyZW50KSB7CisJCQlzdXBlcihFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZy50aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJCXRoaXMubmFtZVRleHQgPSBhZGRMYWJlbGVkVGV4dCgKKwkJCQljb250YWluZXIsCisJCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19uYW1lLAorCQkJCWJ1aWxkTmFtZUhvbGRlcigpCisJCQkpOworCQkJCisJCQlhZGRMYWJlbGVkQ29tYm8oCisJCQkJY29udGFpbmVyLCAKKwkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX2NvbnZlcnRlclR5cGUsIAorCQkJCWJ1aWxkQ29udmVydGVyVHlwZUxpc3RIb2xkZXIoKSwgCisJCQkJYnVpbGRDb252ZXJ0ZXJUeXBlSG9sZGVyKCksIAorCQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCksCisJCQkJbnVsbCk7CisJCX0KKworCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbnZlcnRlclR5cGVMaXN0SG9sZGVyKCkgeworCQkJTGlzdDxTdHJpbmc+IGNvbnZlcnRlclR5cGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQljb252ZXJ0ZXJUeXBlcy5hZGQoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUik7CisJCQljb252ZXJ0ZXJUeXBlcy5hZGQoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJCWNvbnZlcnRlclR5cGVzLmFkZChFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKTsKKwkJCWNvbnZlcnRlclR5cGVzLmFkZChFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUik7CisJCQkKKwkJCXJldHVybiBuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8U3RyaW5nPihjb252ZXJ0ZXJUeXBlcyk7CisJCX0KKwkJCisJCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKSB7CisJCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+KCkgeworCQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgeworCQkJCQlpZiAodmFsdWUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUikgeworCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX2N1c3RvbUNvbnZlcnRlcjsKKwkJCQkJfQorCQkJCQlpZiAodmFsdWUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSB7CisJCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfb2JqZWN0VHlwZUNvbnZlcnRlcjsKKwkJCQkJfQorCQkJCQlpZiAodmFsdWUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUikgeworCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX3N0cnVjdENvbnZlcnRlcjsKKwkJCQkJfQorCQkJCQlpZiAodmFsdWUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpIHsKKwkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV90eXBlQ29udmVydGVyOworCQkJCQl9CisJCQkJCXJldHVybiB2YWx1ZTsKKwkJCQl9CisJCQl9OworCQl9CisJCQorCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKCkgeworCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QuTkFNRV9QUk9QRVJUWSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOworCQkJCX0KKwkJCX07CisJCX0KKworCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb252ZXJ0ZXJUeXBlSG9sZGVyKCkgeworCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QuQ09OVkVSVEVSX1RZUEVfUFJPUEVSVFkpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlclR5cGUoKTsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXJUeXBlKHZhbHVlKTsKKwkJCQl9CisJCQl9OworCQl9CisKKwkJdm9pZCBzZWxlY3RBbGwoKSB7CisJCQl0aGlzLm5hbWVUZXh0LnNlbGVjdEFsbCgpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NjMyMDMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0LmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuQWJzdHJhY3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLlByb2JsZW07CisKKy8qKgorICogVGhpcyBpcyB0aGUgc3RhdGUgb2JqZWN0IHVzZWQgYnkgdGhlIDxjb2RlPkVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nPC9jb2RlPiwgd2hpY2ggc3RvcmVzCisgKiB0aGUgY3VycmVudCBuYW1lIGFuZCB2YWxpZGF0ZXMgaXQgd2hlbiBpdCBpcyBtb2RpZmllZC4KKyAqCisgKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nCisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK2ZpbmFsIGNsYXNzIEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QgZXh0ZW5kcyBBYnN0cmFjdE5vZGUKK3sKKwkvKioKKwkgKiBUaGUgaW5pdGlhbCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIFRoZSBpbml0aWFsIGNvbnZlcnRlclR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBjb252ZXJ0ZXJUeXBlOworCisJLyoqCisJICogVGhlIDxjb2RlPlZhbGlkYXRvcjwvY29kZT4gdXNlZCB0byB2YWxpZGF0ZSB0aGlzIHN0YXRlIG9iamVjdC4KKwkgKi8KKwlwcml2YXRlIFZhbGlkYXRvciB2YWxpZGF0b3I7CisKKwkvKioKKwkgKiBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgZGF0YSB2YWx1ZSBwcm9wZXJ0eS4KKwkgKi8KKwlzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgb2JqZWN0IHZhbHVlIHByb3BlcnR5LgorCSAqLworCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVEVSX1RZUEVfUFJPUEVSVFkgPSAiY29udmVydGVyVHlwZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TmV3TmFtZVN0YXRlT2JqZWN0PC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBpbml0aWFsIGlucHV0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGluaXRpYWwgdmFsdWUgY2FuCisJICogYmUgc3BlY2lmaWVkCisJICogQHBhcmFtIG5hbWVzIFRoZSBjb2xsZWN0aW9uIG9mIG5hbWVzIHRoYXQgY2FuJ3QgYmUgdXNlZCBvciBhbiBlbXB0eQorCSAqIGNvbGxlY3Rpb24gaWYgbm9uZSBhcmUgYXZhaWxhYmxlCisJICovCisJRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdCgpIHsKKwkJc3VwZXIobnVsbCk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkTmFtZVByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKKwkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKSkgeworCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBhZGRDb252ZXJ0ZXJUeXBlUHJvYmxlbXNUbyhMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgeworCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmNvbnZlcnRlclR5cGUpKSB7CisJCQljdXJyZW50UHJvYmxlbXMuYWRkKGJ1aWxkUHJvYmxlbShFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3RfdHlwZU11c3RCZVNwZWNpZmllZCkpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkUHJvYmxlbXNUbyhMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgeworCQlzdXBlci5hZGRQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7CisJCWFkZE5hbWVQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7CisJCWFkZENvbnZlcnRlclR5cGVQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tQYXJlbnQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE5vZGUgcGFyZW50Tm9kZSkgeworCQkvL25vIHBhcmVudAorCX0KKworCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLm5hbWU7CisJfQorCisJU3RyaW5nIGdldENvbnZlcnRlclR5cGUoKSB7CisJCXJldHVybiB0aGlzLmNvbnZlcnRlclR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKKwkJdGhpcy5uYW1lID0gbmV3TmFtZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJUeXBlKFN0cmluZyBuZXdDb252ZXJ0ZXJUeXBlKSB7CisJCVN0cmluZyBvbGRDb252ZXJ0ZXJUeXBlID0gdGhpcy5jb252ZXJ0ZXJUeXBlOworCQl0aGlzLmNvbnZlcnRlclR5cGUgPSBuZXdDb252ZXJ0ZXJUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9UWVBFX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXJUeXBlLCBuZXdDb252ZXJ0ZXJUeXBlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoVmFsaWRhdG9yIHZhbGlkYXRvcikgeworCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKKwkJcmV0dXJuIHRoaXMudmFsaWRhdG9yOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExNjJkMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5DYXRhbG9nQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuU2NoZW1hQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGFja2FnZUNob29zZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVF1ZXJpZXNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFhtbFBhY2thZ2VDaG9vc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgU2NoZW1hOiAgICAgIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgQ2F0YWxvZzogICAgIHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgQWNjZXNzIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcm1RdWVyaWVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENvbnZlcnRlcnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVudGl0eU1hcHBpbmdzCisgKiBAc2VlIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCisgKiBAc2VlIENhdGFsb2dDb21ibworICogQHNlZSBFbnVtRm9ybUNvbWJvVmlld2VyCisgKiBAc2VlIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZQorICogQHNlZSBPcm1QYWNrYWdlQ2hvb3NlcgorICogQHNlZSBPcm1RdWVyaWVzQ29tcG9zaXRlCisgKiBAc2VlIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlCisgKiBAc2VlIFNjaGVtYUNvbWJvCisgKgorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZDE3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHtAbGluayBKcGFEZXRhaWxzUGFnZX0KKyAqIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIFhNTCBmaWxlIChlaXRoZXIgZnJvbSB0aGUgcGVyc2lzdGVuY2UKKyAqIGNvbmZpZ3VyYXRpb24gb3IgZnJvbSB0aGUgTWFwcGluZ3MgRGVzY3JpcHRvcikuCisgKgorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4yCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyCisJZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhRGV0YWlsc1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIoKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnBhRGV0YWlsc1Byb3ZpZGVyIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBwcm92aWRlc0RldGFpbHMoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgeworCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRSkKKwkJCQl8fCByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFKTsKKwl9CisJCisJcHVibGljIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBidWlsZERldGFpbHNQYWdlKAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQkKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWMzMTQyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlLkVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbnRpdHlVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9ybVhtbFVpRmFjdG9yeSBidWlsZE9ybVhtbFVpRmFjdG9yeSgpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKKwkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8wX1JFU09VUkNFX1RZUEUpOworCX0KKwkKKwlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5pbnN0YW5jZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7CisJCWRlZmluaXRpb25zLmFkZChPcm1JZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCQorCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgeworCQlkZWZpbml0aW9ucy5hZGQoT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5YWU1YgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5IGV4dGVuZHMgQmFzZUVjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5Cit7CisJLy9ub3RoaW5nCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NTlkYWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbgorCWV4dGVuZHMgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4KKwlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxNWFjNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbgorCWV4dGVuZHMgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb248T3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+CisJaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCW5ldyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmNzRkYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLy9SZW1vdmUgdGhlIENvbnZlcnRlcnMgc2VjdGlvbiBmcm9tIDEuMCBvcm0gYmFzaWMgbWFwcGluZ3MuCisvL1RoaXMgaXMgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIGluIHZlcnNpb24gMS4xLCBidXQgbm90IDEuMAorcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QmFzaWNNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCS8vZXZlcnl0aGluZyBidXQgdGhlICdEZWZhaW5lIENvbnZlcnRlcicgc2VjdGlvbi4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBpbiBlY2xpcHNlbGluayAxLjAsIGJ1dCBpcyBpbiAxLjEKKwlwcm90ZWN0ZWQgUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkQ29udmVydENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0SG9sZGVyLCBDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0MV8wQ29tcG9zaXRlKGNvbnZlcnRIb2xkZXIsIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZWQzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgcGFuZSBzaG93cyB0aGUgY2FjaGluZyBvcHRpb25zLgorICogPHA+CisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IHggU2hhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICBDYWNoZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgQ2FjaGVTaXplQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgID4gQWR2YW5jZWQgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgCUV4cGlyeUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgIAlBbHdheXNSZWZyZXNoQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgIAkJUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgCURpc2FibGVIaXRzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgIAlDYWNoZUNvb3JkaW5hdGlvbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCBFeGlzdGVuY2VUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFbnRpdHkKKyAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCisgKiBAc2VlIEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCisgKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlCisgKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlCisgKiBAc2VlIEVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZQorICogQHNlZSBFY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZQorICogQHNlZSBFY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU8T3JtRWNsaXBzZUxpbmtDYWNoaW5nPgoreworCisJcHVibGljIE9ybUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZShGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAorICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtDYWNoaW5nPiBzdWJqZWN0SG9sZGVyLAorICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgeworCQluZXcgT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnQxXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydDFfMENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMjc1YWEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnQxXzBDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDIyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0xpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBDb252ZXJ0ZXI6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKKyAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgRWNsaXBzZUxpbmtDb252ZXJ0CisgKiBAc2VlIEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKKyAqCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworCisvL1JlbW92ZXMgdGhlIERlZmluZSBDb252ZXJ0ZXJzIHNlY3Rpb24gZnJvbSBvcm0gYmFzaWMsIGlkLCB2ZXJzaW9uIG1hcHBpbmcuCisvL1RoaXMgaXMgc3VwcG9ydGVkIGluIEVjbGlwc2VMaW5rIGluIHZlcnNpb24gMS4xLCBidXQgbm90IDEuMAorcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQ29udmVydDFfMENvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVjbGlwc2VMaW5rQ29udmVydD4KK3sKKworCS8qKgorCSAqIEEga2V5IHVzZWQgdG8gcmVwcmVzZW50IHRoZSBkZWZhdWx0IHZhbHVlLCB0aGlzIGlzIHJlcXVpcmVkIHRvIGNvbnZlcnQKKwkgKiB0aGUgc2VsZWN0ZWQgaXRlbSBmcm9tIGEgY29tYm8gdG8gPGNvZGU+bnVsbDwvY29kZT4uIFRoaXMga2V5IGlzIG1vc3QKKwkgKiBsaWtlbHkgbmV2ZXIgdHlwZWQgdGhlIHVzZXIgYW5kIGl0IHdpbGwgaGVscCB0byBjb252ZXJ0IHRoZSB2YWx1ZSB0bworCSAqIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gaXQncyB0aW1lIHRvIHNldCB0aGUgbmV3IHNlbGVjdGVkIHZhbHVlIGludG8gdGhlCisJICogbW9kZWwuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9LRVkgPSAiPyEjIT8jPyM/ZGVmYXVsdD8jPyEjPyEjPyI7IC8vJE5PTi1OTFMtMSQKKwkKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudW1UeXBlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnQxXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnQ+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJQ0NvbWJvIGNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfY29udmVydGVyTmFtZUxhYmVsLAorCQkJYnVpbGRDb252ZXJ0TmFtZUxpc3RIb2xkZXIoKSwKKwkJCWJ1aWxkQ29udmVydE5hbWVIb2xkZXIoKSwKKwkJCWJ1aWxkTmFtZUNvbnZlcnRlcigpLAorCQkJbnVsbAorCQkpOworCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoY29tYm8pOworCQkJCQorCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRCb29sZWFuSG9sZGVyKCksIHRoaXMpOworCX0KKwkKKwlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbnZlcnROYW1lSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnQsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnQuU1BFQ0lGSUVEX0NPTlZFUlRFUl9OQU1FX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCS8vIENvbnZlcnQgdGhlIGRlZmF1bHQgdmFsdWUgb3IgYW4gZW1wdHkgc3RyaW5nIHRvIG51bGwKKwkJCQlpZiAoKHZhbHVlICE9IG51bGwpICYmCisJCQkJICAgKCh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB8fCB2YWx1ZS5zdGFydHNXaXRoKERFRkFVTFRfS0VZKSkpIHsKKworCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJfQorCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29udmVydE5hbWVMaXN0SG9sZGVyKCkgeworCQlqYXZhLnV0aWwuTGlzdDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOworCQlsaXN0LmFkZChidWlsZERlZmF1bHROYW1lTGlzdEhvbGRlcigpKTsKKwkJbGlzdC5hZGQoYnVpbGRSZXNlcnZlZENvbnZlcnRlck5hbWVMaXN0SG9sZGVyKCkpOworCQlsaXN0LmFkZChidWlsZENvbnZlcnRlck5hbWVMaXN0SG9sZGVyKCkpOworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4obGlzdCk7CisJfQorCQorCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdE5hbWVMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCisJCQlidWlsZERlZmF1bHROYW1lSG9sZGVyKCkKKwkJKTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TmFtZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDb252ZXJ0LkRFRkFVTFRfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlTdHJpbmcgbmFtZSA9IHRoaXMuc3ViamVjdC5nZXREZWZhdWx0Q29udmVydGVyTmFtZSgpOworCisJCQkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJCQluYW1lID0gREVGQVVMVF9LRVk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQluYW1lID0gREVGQVVMVF9LRVkgKyBuYW1lOworCQkJCX0KKworCQkJCXJldHVybiBuYW1lOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGROYW1lQ29udmVydGVyKCkgeworCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+KCkgeworCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIHZhbHVlKSB7CisKKwkJCQlpZiAoZ2V0U3ViamVjdCgpID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIHZhbHVlOworCQkJCX0KKworCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQkJCXZhbHVlID0gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRDb252ZXJ0ZXJOYW1lKCk7CisKKwkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJCXZhbHVlID0gREVGQVVMVF9LRVkgKyB2YWx1ZTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCXZhbHVlID0gREVGQVVMVF9LRVk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAodmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkpIHsKKwkJCQkJU3RyaW5nIGRlZmF1bHROYW1lID0gdmFsdWUuc3Vic3RyaW5nKERFRkFVTFRfS0VZLmxlbmd0aCgpKTsKKworCQkJCQlpZiAoZGVmYXVsdE5hbWUubGVuZ3RoKCkgPiAwKSB7CisJCQkJCQl2YWx1ZSA9IE5MUy5iaW5kKAorCQkJCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCisJCQkJCQkJZGVmYXVsdE5hbWUKKwkJCQkJCSk7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQl2YWx1ZSA9IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFbXB0eTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiB2YWx1ZTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFJlc2VydmVkQ29udmVydGVyTmFtZUxpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8U3RyaW5nPihFY2xpcHNlTGlua0NvbnZlcnQuUkVTRVJWRURfQ09OVkVSVEVSX05BTUVTKTsKKwl9CisJCisJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb252ZXJ0ZXJOYW1lTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPigKKwkJCWJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCksCisJCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdC5DT05WRVJURVJTX0xJU1QpLy9UT0RPIG5lZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgaW50ZXJmYWNlCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5saXN0SXRlcmF0b3IoQXJyYXlUb29scy5zb3J0KHRoaXMuc3ViamVjdC51bmlxdWVDb252ZXJ0ZXJOYW1lcygpKSk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnQsIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIGdldFN1YmplY3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtDb252ZXJ0IHZhbHVlKSB7CisJCQkJaWYgKGdldFN1YmplY3QoKSAhPSBudWxsICYmIGdldFN1YmplY3QoKS5nZXRQYXJlbnQoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKKwkJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCQkJfQorCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUgIT0gbnVsbCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YThkZGNhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw0MTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKKworLyoqCisgKiBUaGlzIHBhbmUgc2hvd3MgdGhlIGxpc3Qgb2YgbmFtZWQgcXVlcmllcyBhbmQgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuCisgKiA8cD4KKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQ29udmVydGVyQ29tcG9zaXRlIG9yIE9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IG9yIFN0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSBvciBUeXBlQ29udmVydGVyQ29tcG9zaXRlICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVudGl0eQorICogQHNlZSBRdWVyeQorICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJ5CisgKiBAc2VlIE5hbWVkUXVlcnkKKyAqIEBzZWUgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUKKyAqIEBzZWUgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPgoreworCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+IGxpc3RQYW5lOworCXByaXZhdGUgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUgY29udmVydGVyQ29tcG9zaXRlOworCXByaXZhdGUgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlIG9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGU7CisJcHJpdmF0ZSBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSBzdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGU7CisJcHJpdmF0ZSBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGUgdHlwZUNvbnZlcnRlckNvbXBvc2l0ZTsKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPiBzZWxlY3RlZENvbnZlcnRlckhvbGRlcjsKKworCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUoCisJCUZvcm1QYW5lPD8+IHBhcmVudFBhbmUsIAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCXN1cGVyLmluaXRpYWxpemUoKTsKKwkJdGhpcy5zZWxlY3RlZENvbnZlcnRlckhvbGRlciA9IGJ1aWxkU2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIoKTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPiBidWlsZFNlbGVjdGVkQ29udmVydGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlcj4oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQkvLyBMaXN0IHBhbmUKKwkJdGhpcy5saXN0UGFuZSA9IGFkZExpc3RQYW5lKGNvbnRhaW5lcik7CisKKwkJLy8gUHJvcGVydHkgcGFuZQorCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKKwkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisKKwkJdGhpcy5jb252ZXJ0ZXJDb21wb3NpdGUgPSBuZXcgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUoCisJCQlidWlsZEN1c3RvbUNvbnZlcnRlckhvbGRlcigpLAorCQkJcGFnZUJvb2ssCisJCQlnZXRXaWRnZXRGYWN0b3J5KCkKKwkJKTsKKwkJcmVnaXN0ZXJTdWJQYW5lKHRoaXMuY29udmVydGVyQ29tcG9zaXRlKTsKKwkJCisJCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUoCisJCQlidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJIb2xkZXIoKSwKKwkJCXBhZ2VCb29rLAorCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpCisJCSk7CisJCXJlZ2lzdGVyU3ViUGFuZSh0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUpOworCQkKKwkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUgPSBuZXcgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUoCisJCQlidWlsZFN0cnVjdENvbnZlcnRlckhvbGRlcigpLAorCQkJcGFnZUJvb2ssCisJCQlnZXRXaWRnZXRGYWN0b3J5KCkKKwkJKTsKKwkJcmVnaXN0ZXJTdWJQYW5lKHRoaXMuc3RydWN0Q29udmVydGVyQ29tcG9zaXRlKTsKKwkJCisJCXRoaXMudHlwZUNvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGUoCisJCQlidWlsZFR5cGVDb252ZXJ0ZXJIb2xkZXIoKSwKKwkJCXBhZ2VCb29rLAorCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpCisJCSk7CisJCXJlZ2lzdGVyU3ViUGFuZSh0aGlzLnR5cGVDb252ZXJ0ZXJDb21wb3NpdGUpOworCisJCWluc3RhbGxQYW5lU3dpdGNoZXIocGFnZUJvb2spOworCX0KKworCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+IGFkZExpc3RQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPigKKwkJCXRoaXMsCisJCQljb250YWluZXIsCisJCQlidWlsZENvbnZlcnRlcnNBZGFwdGVyKCksCisJCQlidWlsZERpc3BsYXlhYmxlQ29udmVydGVyc0xpc3RIb2xkZXIoKSwKKwkJCXRoaXMuc2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIsCisJCQlidWlsZENvbnZlcnRlcnNMaXN0TGFiZWxQcm92aWRlcigpLAorCQkJbnVsbC8vSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19OQU1FRF9RVUVSSUVTCisJCSkgeworCQkJLy9UT0RPIHllYWgsIHRoaXMgaXMgd2VpcmQsIGJ1dCBpIGRvbid0IHdhbnQgdGhpcyB0byBiZSBkaXNhYmxlZCBqdXN0CisJCQkvL2JlY2F1c2UgdGhlIHN1YmplY3QgaXMgbnVsbC4gaSBoYXZlIG5vIG5lZWQgZm9yIHRoYXQgYW5kIHRoYXQgaXMKKwkJCS8vY3VycmVudGx5IGhvdyBBZGRSZW1vdmVQYW5lIHdvcmtzLiAgU2VlIE9ybVF1ZXJpZXNDb21wb3NpdGUgd2hlcmUKKwkJCS8vdGhlIHdvcmsgYXJvdW5kIHRoZXJlIGlzIHlldCBhbm90aGVyIHBhbmUgZW5hYmxlci4gIEkgd2FudCB0byBjaGFuZ2UKKwkJCS8vaG93IHRoaXMgd29ya3MgaW4gMi4yCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7CisJCQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyh0cnVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVTd2l0Y2hlcihQYWdlQm9vayBwYWdlQm9vaykgeworCQluZXcgQ29udHJvbFN3aXRjaGVyKHRoaXMuc2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIsIGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCksIHBhZ2VCb29rKTsKKwl9CisJCisJcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkQ29udmVydGVyc0FkYXB0ZXIoKSB7CisKKwkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7CisKKwkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCQkJCWFkZENvbnZlcnRlcigpOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKKwkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKKwkJCQkJaWYgKCgoRWNsaXBzZUxpbmtDb252ZXJ0ZXIpIGl0ZW0pLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSKSB7CisJCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlQ3VzdG9tQ29udmVydGVyKChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgaXRlbSk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoKChFY2xpcHNlTGlua0NvbnZlcnRlcikgaXRlbSkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikgeworCQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgaXRlbSk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoKChFY2xpcHNlTGlua0NvbnZlcnRlcikgaXRlbSkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVIpIHsKKwkJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSBpdGVtKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmICgoKEVjbGlwc2VMaW5rQ29udmVydGVyKSBpdGVtKS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpIHsKKwkJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVUeXBlQ29udmVydGVyKChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpIGl0ZW0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgdm9pZCBhZGRDb252ZXJ0ZXIoKSB7CisJCWFkZEVjbGlwc2VMaW5rQ29udmVydGVyRnJvbURpYWxvZyhidWlsZEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2cgYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZygpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZyhnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkRWNsaXBzZUxpbmtDb252ZXJ0ZXJGcm9tRGlhbG9nKEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nIGRpYWxvZykgeworCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgY29udmVydGVyVHlwZSA9IGRpYWxvZy5nZXRDb252ZXJ0ZXJUeXBlKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcjsKKwkJaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUikgeworCQkJY29udmVydGVyID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkQ3VzdG9tQ29udmVydGVyKGdldFN1YmplY3QoKS5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJfQorCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikgeworCQkJY29udmVydGVyID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcihnZXRTdWJqZWN0KCkub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQl9CisJCWVsc2UgaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUikgeworCQkJY29udmVydGVyID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkU3RydWN0Q29udmVydGVyKGdldFN1YmplY3QoKS5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJfQorCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKSB7CisJCQljb252ZXJ0ZXIgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRUeXBlQ29udmVydGVyKGdldFN1YmplY3QoKS50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCX0KKwkJZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJY29udmVydGVyLnNldE5hbWUoZGlhbG9nLmdldE5hbWUoKSk7CisJCXRoaXMuc2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIuc2V0VmFsdWUoY29udmVydGVyKTsvL3NvIHRoYXQgaXQgZ2V0cyBzZWxlY3RlZCBpbiB0aGUgTGlzdCBmb3IgdGhlIHVzZXIgdG8gZWRpdAorCX0KKworCXByaXZhdGUgVHJhbnNmb3JtZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXIsIENvbnRyb2w+IGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPEVjbGlwc2VMaW5rQ29udmVydGVyLCBDb250cm9sPigpIHsKKwkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKwkJCQlpZiAoY29udmVydGVyID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCisJCQkJaWYgKGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUikgeworCQkJCQlyZXR1cm4gT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlLnRoaXMuY29udmVydGVyQ29tcG9zaXRlLmdldENvbnRyb2woKTsKKwkJCQl9CisJCQkJaWYgKGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSB7CisJCQkJCXJldHVybiBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUudGhpcy5vYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlLmdldENvbnRyb2woKTsKKwkJCQl9CisJCQkJaWYgKGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUikgeworCQkJCQlyZXR1cm4gT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlLnRoaXMuc3RydWN0Q29udmVydGVyQ29tcG9zaXRlLmdldENvbnRyb2woKTsKKwkJCQl9CisJCQkJaWYgKGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpIHsKKwkJCQkJcmV0dXJuIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZS50aGlzLnR5cGVDb252ZXJ0ZXJDb21wb3NpdGUuZ2V0Q29udHJvbCgpOworCQkJCX0KKworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGJ1aWxkRGlzcGxheWFibGVDb252ZXJ0ZXJzTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+KAorCQkJYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlcnNIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rQ29udmVydGVyLk5BTUVfUFJPUEVSVFkKKwkJKTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPiBidWlsZEVjbGlwc2VMaW5rQ29udmVydGVyc0hvbGRlcigpIHsKKwkJTGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+PigpOworCQlsaXN0LmFkZChidWlsZEN1c3RvbUNvbnZlcnRlcnNMaXN0SG9sZGVyKCkpOworCQlsaXN0LmFkZChidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJzTGlzdEhvbGRlcigpKTsKKwkJbGlzdC5hZGQoYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJzTGlzdEhvbGRlcigpKTsKKwkJbGlzdC5hZGQoYnVpbGRUeXBlQ29udmVydGVyc0xpc3RIb2xkZXIoKSk7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPiwgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+KGxpc3QpOworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGJ1aWxkQ3VzdG9tQ29udmVydGVyc0xpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIsIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLkNVU1RPTV9DT05WRVJURVJTX0xJU1QpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gbGlzdEl0ZXJhdG9yXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuY3VzdG9tQ29udmVydGVyc1NpemUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gYnVpbGRPYmplY3RUeXBlQ29udmVydGVyc0xpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVJTX0xJU1QpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5vYmplY3RUeXBlQ29udmVydGVycygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBidWlsZFN0cnVjdENvbnZlcnRlcnNMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlci5TVFJVQ1RfQ09OVkVSVEVSU19MSVNUKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnN0cnVjdENvbnZlcnRlcnNTaXplKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IGJ1aWxkVHlwZUNvbnZlcnRlcnNMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIuVFlQRV9DT05WRVJURVJTX0xJU1QpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50eXBlQ29udmVydGVycygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50eXBlQ29udmVydGVyc1NpemUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gYnVpbGRDdXN0b21Db252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPih0aGlzLnNlbGVjdGVkQ29udmVydGVySG9sZGVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rQ29udmVydGVyIHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSID8gKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSB2YWx1ZSA6IG51bGw7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4odGhpcy5zZWxlY3RlZENvbnZlcnRlckhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiA/IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIHZhbHVlIDogbnVsbDsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPih0aGlzLnNlbGVjdGVkQ29udmVydGVySG9sZGVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rQ29udmVydGVyIHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSID8gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSB2YWx1ZSA6IG51bGw7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBidWlsZFR5cGVDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4odGhpcy5zZWxlY3RlZENvbnZlcnRlckhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSID8gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgdmFsdWUgOiBudWxsOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRDb252ZXJ0ZXJzTGlzdExhYmVsUHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CisJCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtDb252ZXJ0ZXIpIGVsZW1lbnQpLmdldE5hbWUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgeworCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOworCQl0aGlzLmxpc3RQYW5lLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7CisJfQorCisJLy9UT0RPIG5lZWQgdG8gY2hlY2sgdGhlIGNvbnZlcnRlciByZXBvc2l0b3J5IGZvciB0aGlzLCBzaG91bGQgY2hlY2sgYWxsIGNvbnZlcnRlcnMsIGV4Y2VwdCBmb3IgdGhlIG92ZXJyaWRlIGNhc2UsIGhtbQorCS8vd2UgYXQgbGVhc3QgbmVlZCB0byBjaGVjayB0eXBlY29udmVydGVycywgY29udmVydGVycywgc3RydWN0Y29udmVydGVycywgYW5kIG9iamVjdHlwZWNvbnZlcnRlcnMsIG9uIHRoaXMgcGFydGljdWxhcgorCS8vb2JqZWN0LiAgb3Igd2UgbmVlZCB0byBnaXZlIGEgd2FybmluZyBhYm91dCB0aGUgY2FzZSB3aGVyZSB5b3UgYXJlIG92ZXJyaWRpbmcgb3IgYW4gZXJyb3IgaWYgaXQncyBub3QgYW4gb3ZlcnJpZGU/CisJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNvbnZlcnRlck5hbWVzKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIsIFN0cmluZz4oZ2V0U3ViamVjdCgpLmN1c3RvbUNvbnZlcnRlcnMoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBuZXh0KSB7CisJCQkJcmV0dXJuIG5leHQuZ2V0TmFtZSgpOworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MTI4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtSmF2YUNsYXNzQ2hvb3NlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIHBhbmUgZG9lcyBub3QgaGF2ZSBhbnkgd2lkZ2V0cy4KKyAqCisgKiBAc2VlIEVtYmVkZGFibGUKKyAqIEBzZWUgRW1iZWRkYWJsZVVpUHJvdmlkZXIKKyAqCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZTxUIGV4dGVuZHMgT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlPiAKKwlleHRlbmRzIEZvcm1QYW5lPFQ+CisJaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGFibGVDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWluaXRpYWxpemVHZW5lcmFsUGFuZShjb250YWluZXIpOworCQlpbml0aWFsaXplQ29udmVydGVyc1BhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZUFkdmFuY2VkUGFuZShjb250YWluZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgT3JtSmF2YUNsYXNzQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBNZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBBY2Nlc3NIb2xkZXI+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZSgpOworCQkJfQorCQl9OworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDUpLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfTGFiZWwKKwkJKTsKKworCQluZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29udmVydGVySG9sZGVyKCksIGNvbnRhaW5lcik7CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyPiBidWlsZENvbnZlcnRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFkdmFuY2VkUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBFY2xpcHNlTGlua0VtYmVkZGFibGVBZHZhbmNlZENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGU4ZDBkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlCit7CisJcHVibGljIE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjRiMzdhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgIAkJCSAgCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgeCBFeGlzdGVuY2UgQ2hlY2tpbmc6ICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKKyAqIHwgICAgICAgCQkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZworICogQHNlZSBDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKKyAqCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxFY2xpcHNlTGlua0NhY2hpbmc+IHsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIE9ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUoRm9ybVBhbmU8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKCAKKyAgICAgICAgICAgIGNvbnRhaW5lciwgCisgICAgICAgICAgICBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfbGFiZWwsCisgICAgICAgICAgICBhZGRFeGlzdGVuY2VDaGVja2luZ1R5cGVDb21ibyhjb250YWluZXIpLmdldENvbnRyb2woKSwgCisgICAgICAgICAgICBudWxsIAorICAgICAgICk7CisJfQorCisJcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEVjbGlwc2VMaW5rQ2FjaGluZywgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlPiBhZGRFeGlzdGVuY2VDaGVja2luZ1R5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEVjbGlwc2VMaW5rQ2FjaGluZywgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlPih0aGlzLCBjb250YWluZXIpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZVtdIGdldENob2ljZXMoKSB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS52YWx1ZXMoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSB2YWx1ZSkgeworCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCisJCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuY2xhc3MsCisJCQkJCU9ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUudGhpcywKKwkJCQkJdmFsdWUKKwkJCQkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIHZhbHVlKSB7CisJCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUodmFsdWUpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MzMwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8vUmVtb3ZlIHRoZSBDb252ZXJ0ZXJzIHNlY3Rpb24gZnJvbSAxLjAgb3JtIGlkIG1hcHBpbmdzLgorLy9UaGlzIGlzIHN1cHBvcnRlZCBpbiBFY2xpcHNlTGluayBpbiB2ZXJzaW9uIDEuMSwgYnV0IG5vdCAxLjAKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua09ybUlkTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklkTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwkvL2V2ZXJ5dGhpbmcgYnV0IHRoZSAnRGVmaW5lIENvbnZlcnRlcicgc2VjdGlvbi4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBpbiBlY2xpcHNlbGluayAxLjAsIGJ1dCBpcyBpbiAxLjEKKwlwcm90ZWN0ZWQgUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkQ29udmVydENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0SG9sZGVyLCBDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0MV8wQ29tcG9zaXRlKGNvbnZlcnRIb2xkZXIsIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjgzODVmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTxUIGV4dGVuZHMgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzPiBleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlPFQ+Cit7CisJcHVibGljIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlOGM5OQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbgorCWV4dGVuZHMgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb248T3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc+CisJaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCW5ldyBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQkKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmRkMmRkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbgorCWV4dGVuZHMgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPgorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YzdhNWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvL1JlbW92ZSB0aGUgQ29udmVydGVycyBzZWN0aW9uIGZyb20gMS4wIG9ybSB2ZXJzaW9uIG1hcHBpbmdzLgorLy9UaGlzIGlzIHN1cHBvcnRlZCBpbiBFY2xpcHNlTGluayBpbiB2ZXJzaW9uIDEuMSwgYnV0IG5vdCAxLjAKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPlZlcnNpb25NYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBWZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKworCUBPdmVycmlkZQorCS8vZXZlcnl0aGluZyBidXQgdGhlICdEZWZhaW5lIENvbnZlcnRlcicgc2VjdGlvbi4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBpbiBlY2xpcHNlbGluayAxLjAsIGJ1dCBpcyBpbiAxLjEKKwlwcm90ZWN0ZWQgUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkQ29udmVydENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0SG9sZGVyLCBDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0MV8wQ29tcG9zaXRlKGNvbnZlcnRIb2xkZXIsIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYWJmMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLS8qKgotICogRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8TG9nZ2luZz4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdEZvcm1QYW5lPExvZ2dpbmc+IHN1YmplY3RIb2xkZXIsIAotCQkJCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTZWN0aW9uIHNlY3Rpb24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlU2VjdGlvbihwYXJlbnQsIFNXVC5GTEFUIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBTZWN0aW9uLkRFU0NSSVBUSU9OKTsKLQkJc2VjdGlvbi5zZXRUZXh0KEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VjdGlvblRpdGxlKTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29tcG9zaXRlKTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUuZ2V0UGFyZW50KCkpOwotCQkKLQkJLy8gTG9nZ2luZ0xldmVsOgotCQluZXcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0KLQkJLy8gVGltZXN0YW1wOgotCQluZXcgVGltZXN0YW1wQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0KLQkJLy8gVGhyZWFkOgotCQluZXcgVGhyZWFkQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0KLQkJLy8gU2Vzc2lvbjoKLQkJbmV3IFNlc3Npb25Db21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQotCQkvLyBFeGNlcHRpb25zOgotCQluZXcgRXhjZXB0aW9uc0NvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJLy8gTG9nZ2VyOgotCQluZXcgTG9nZ2VyQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlyZXR1cm47Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9FeGNlcHRpb25zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL0V4Y2VwdGlvbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlNmRiYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL0V4Y2VwdGlvbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBFeGNlcHRpb25zQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25zQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxMb2dnaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RXhjZXB0aW9uc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFeGNlcHRpb25zQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEV4Y2VwdGlvbnNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgTG9nZ2luZy5FWENFUFRJT05TX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldEV4Y2VwdGlvbnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0RXhjZXB0aW9ucyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRXhjZXB0aW9uc1N0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRXhjZXB0aW9uc0hvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdEV4Y2VwdGlvbnMoKTsKLQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZXhjZXB0aW9uc0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9leGNlcHRpb25zTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5idWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZXhjZXB0aW9uc0xhYmVsLAotCQkJdGhpcy5idWlsZEV4Y2VwdGlvbnNIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRFeGNlcHRpb25zU3RyaW5nSG9sZGVyKCksCi0JCQludWxsCi0vLwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuTE9HR0lOR18KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL0xvZ2dlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9Mb2dnZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkNjBiZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL0xvZ2dlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5sb2dnaW5nOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIExvZ2dlckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPExvZ2dpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Mb2dnZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIExvZ2dlckNvbXBvc2l0ZSgKLQkJCQkJCQkJQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TG9nZ2VySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLkRFRkFVTFRfTE9HR0VSKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIExvZ2dlckNvbXBvc2l0ZS50aGlzLmRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TG9nZ2VyTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJdGhpcy5idWlsZERlZmF1bHRMb2dnZXJIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhTdHJpbmcgbG9nZ2VyTmFtZSkgewotCi0JCXN3aXRjaCAoTG9nZ2VyLnZhbHVlT2YobG9nZ2VyTmFtZSkpIHsKLQkJCWNhc2UgZGVmYXVsdF9sb2dnZXI6IHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dlckNvbXBvc2l0ZV9kZWZhdWx0X2xvZ2dlcjsKLQkJCX0KLQkJCWNhc2UgamF2YV9sb2dnZXI6IHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dlckNvbXBvc2l0ZV9qYXZhX2xvZ2dlcjsKLQkJCX0KLQkJCWNhc2Ugc2VydmVyX2xvZ2dlcjogewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuTG9nZ2VyQ29tcG9zaXRlX3NlcnZlcl9sb2dnZXI7Ci0JCQl9Ci0JCQlkZWZhdWx0OiB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZExvZ2dlckNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBsb2dnZXIxLCBTdHJpbmcgbG9nZ2VyMikgewotCQkJCWxvZ2dlcjEgPSBidWlsZERpc3BsYXlTdHJpbmcobG9nZ2VyMSk7Ci0JCQkJbG9nZ2VyMiA9IGJ1aWxkRGlzcGxheVN0cmluZyhsb2dnZXIyKTsKLQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGxvZ2dlcjEsIGxvZ2dlcjIpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGRMb2dnZXJDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0cnkgewotCQkJCQlMb2dnZXIudmFsdWVPZih2YWx1ZSk7Ci0JCQkJCXZhbHVlID0gYnVpbGREaXNwbGF5U3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIElnbm9yZSBzaW5jZSB0aGUgdmFsdWUgaXMgbm90IGEgTG9nZ2VyCi0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMb2dnZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIExvZ2dpbmcuTE9HR0VSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0TG9nZ2VyKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gTG9nZ2VyQ29tcG9zaXRlLnRoaXMuZGVmYXVsdFZhbHVlKHN1YmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoZGVmYXVsdFZhbHVlKHN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldExvZ2dlcih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTG9nZ2VyTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRMb2dnZXJMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZChidWlsZExvZ2dlcnNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTG9nZ2VycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPExvZ2dlciwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoTG9nZ2VyLnZhbHVlcygpKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShMb2dnZXIgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMb2dnZXJzQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYnVpbGRMb2dnZXJzKCkpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTG9nZ2Vyc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZExvZ2dlcnNDb2xsZWN0aW9uSG9sZGVyKCksCi0JCQlidWlsZExvZ2dlckNvbXBhcmF0b3IoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZShMb2dnaW5nIHN1YmplY3QpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdExvZ2dlcigpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9kZWZhdWx0RW1wdHk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDQ29tYm8gY29tYm8gPSBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2VyTGFiZWwsCi0JCQl0aGlzLmJ1aWxkTG9nZ2VyTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZExvZ2dlckhvbGRlcigpLAotCQkJdGhpcy5idWlsZExvZ2dlckNvbnZlcnRlcigpLAotCQkJbnVsbAkJLy8gRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5MT0dHRVJfTkFNRQotCQkpOwotCi0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvTG9nZ2luZ0xldmVsQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL0xvZ2dpbmdMZXZlbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjg2MmY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvTG9nZ2luZ0xldmVsQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwubG9nZ2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZy5Mb2dnaW5nTGV2ZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIExvZ2dpbmdMZXZlbENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2luZ0xldmVsQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxMb2dnaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TG9nZ2luZ0xldmVsQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBMb2dnaW5nTGV2ZWxDb21wb3NpdGUoCi0JCQkJQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPExvZ2dpbmcsIExvZ2dpbmdMZXZlbD4gYnVpbGRMb2dnaW5nTGV2ZWxDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxMb2dnaW5nLCBMb2dnaW5nTGV2ZWw+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nLkxFVkVMX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTG9nZ2luZ0xldmVsW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gTG9nZ2luZ0xldmVsLnZhbHVlcygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTG9nZ2luZ0xldmVsIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0KCkuZ2V0RGVmYXVsdExldmVsKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKExvZ2dpbmdMZXZlbCB2YWx1ZSkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkRGlzcGxheVN0cmluZyhFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3MsIExvZ2dpbmdMZXZlbENvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExvZ2dpbmdMZXZlbCBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0KCkuZ2V0TGV2ZWwoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShMb2dnaW5nTGV2ZWwgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3QoKS5zZXRMZXZlbCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJCWNvbnRhaW5lciwKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ2dpbmdMZXZlbExhYmVsLAotCQkJCXRoaXMuYnVpbGRMb2dnaW5nTGV2ZWxDb21ibyhjb250YWluZXIpLAotCQkJCW51bGwgLy8gVE9ETyBJSnBhSGVscENvbnRleHRJZHMuCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzE0NzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWIKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYgotCWV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxMb2dnaW5nPgotCWltcGxlbWVudHMgSnBhUGFnZUNvbXBvc2l0ZTxQZXJzaXN0ZW5jZVVuaXQ+Ci17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+IHN1YmplY3RIb2xkZXIsIAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rTG9nZ2luZ0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRQYWdlSW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpdGxlOwotCX0KLQotCS8vICoqKioqKioqKiogTGF5b3V0ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0aGlzLmJ1aWxkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL1Nlc3Npb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvU2Vzc2lvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWMyMjNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvU2Vzc2lvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFNlc3Npb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25Db21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPExvZ2dpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZXNzaW9uQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFNlc3Npb25Db21wb3NpdGUoCi0JCQkJCUFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIExvZ2dpbmc+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2Vzc2lvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLlNFU1NJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U2Vzc2lvbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRTZXNzaW9uKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTZXNzaW9uU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRTZXNzaW9uSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0U2Vzc2lvbigpOwotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSBkZWZhdWx0VmFsdWUgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Nlc3Npb25MYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWwsCi0JCQl0aGlzLmJ1aWxkU2Vzc2lvbkhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNlc3Npb25TdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLS8vCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5MT0dHSU5HXwotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvVGhyZWFkQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL1RocmVhZENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODdjNTMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2xvZ2dpbmcvVGhyZWFkQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhyZWFkQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJlYWRDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPExvZ2dpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UaHJlYWRDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGhyZWFkQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRocmVhZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLlRIUkVBRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRUaHJlYWQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0VGhyZWFkKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUaHJlYWRTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZFRocmVhZEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdFRocmVhZCgpOwotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSBkZWZhdWx0VmFsdWUgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aHJlYWRMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5idWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVGhyZWFkSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVGhyZWFkU3RyaW5nSG9sZGVyKCksCi0JCQludWxsCi0vLwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuTE9HR0lOR18KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL1RpbWVzdGFtcENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvbG9nZ2luZy9UaW1lc3RhbXBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA0Zjg3My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9sb2dnaW5nL1RpbWVzdGFtcENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRpbWVzdGFtcENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGltZXN0YW1wQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxMb2dnaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGltZXN0YW1wQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRpbWVzdGFtcENvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUaW1lc3RhbXBIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VGltZXN0YW1wKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFRpbWVzdGFtcCh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGltZXN0YW1wU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRUaW1lc3RhbXBIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0JCQkJCUJvb2xlYW4gZGVmYXVsdFZhbHVlID0gc3ViamVjdCgpLmdldERlZmF1bHRUaW1lc3RhbXAoKTsKLQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGltZXN0YW1wTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpbWVzdGFtcExhYmVsOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpbWVzdGFtcExhYmVsLAotCQkJdGhpcy5idWlsZFRpbWVzdGFtcEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFRpbWVzdGFtcFN0cmluZ0hvbGRlcigpLAotCQkJbnVsbAotLy8JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkxPR0dJTkdfCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL29wdGlvbnMvRWNsaXBzZUxpbmtPcHRpb25zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZmQyNDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLS8qKgotICogRWNsaXBzZUxpbmtPcHRpb25zQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09wdGlvbnNDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8T3B0aW9ucz4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcHRpb25zQ29tcG9zaXRlKAotCQkJCQlBYnN0cmFjdEZvcm1QYW5lPE9wdGlvbnM+IHN1YmplY3RIb2xkZXIsIAotCQkJCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTZWN0aW9uIHNlY3Rpb24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlU2VjdGlvbihwYXJlbnQsIFNXVC5GTEFUIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBTZWN0aW9uLkRFU0NSSVBUSU9OKTsKLQkJc2VjdGlvbi5zZXRUZXh0KEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2VjdGlvblRpdGxlKTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3NlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29tcG9zaXRlKTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUuZ2V0UGFyZW50KCkpOwotCi0JCW5ldyBTZXNzaW9uTmFtZUNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCi0JCW5ldyBTZXNzaW9uc1htbENvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJbmV3IFRhcmdldERhdGFiYXNlQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQluZXcgRXZlbnRMaXN0ZW5lckNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJbmV3IEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJcmV0dXJuOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL29wdGlvbnMvRXZlbnRMaXN0ZW5lckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvb3B0aW9ucy9FdmVudExpc3RlbmVyQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzU3NzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvb3B0aW9ucy9FdmVudExpc3RlbmVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEV2ZW50TGlzdGVuZXJDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEV2ZW50TGlzdGVuZXJDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8T3B0aW9ucz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkV2ZW50TGlzdGVuZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFdmVudExpc3RlbmVyQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgT3B0aW9ucz4gcGFyZW50UGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxPcHRpb25zPiBpbml0aWFsaXplQ2xhc3NDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8T3B0aW9ucz4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4oCi0JCQkJCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXZlbnRMaXN0ZW5lcigpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQl0aGlzLnN1YmplY3Quc2V0RXZlbnRMaXN0ZW5lcih2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QoKS5nZXRFdmVudExpc3RlbmVyKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBsYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZXZlbnRMaXN0ZW5lckxhYmVsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLnN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQkJCUlKYXZhUHJvamVjdCByb290ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHJvb3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpwdEVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRUeXBlKCkgewotCQkJCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0KLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpOwotCQkJCQl0aGlzLnN1YmplY3QoKS5zZXRFdmVudExpc3RlbmVyKGNsYXNzTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvb3B0aW9ucy9JbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzNzI1NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxPcHRpb25zPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgT3B0aW9ucz4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXModmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc1N0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMYWJlbCwKLQkJCXRoaXMuYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLS8vCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL1BlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvb3B0aW9ucy9QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlOTJiNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL1BlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiCi0JZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPE9wdGlvbnM+Ci0JaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlPFBlcnNpc3RlbmNlVW5pdD4KLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gc3ViamVjdEhvbGRlciwgCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtPcHRpb25zQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldFBhZ2VJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlVGV4dCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGl0bGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBMYXlvdXQgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgYnVpbGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYnVpbGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL29wdGlvbnMvU2Vzc2lvbk5hbWVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL29wdGlvbnMvU2Vzc2lvbk5hbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExNDhiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL1Nlc3Npb25OYW1lQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBTZXNzaW9uTmFtZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbk5hbWVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8T3B0aW9ucz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlc3Npb25OYW1lQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBTZXNzaW9uTmFtZUNvbXBvc2l0ZSgKLQkJCQkJCQkJQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2Vzc2lvbk5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuREVGQVVMVF9TRVNTSU9OX05BTUUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gU2Vzc2lvbk5hbWVDb21wb3NpdGUudGhpcy5kZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNlc3Npb25OYW1lTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJdGhpcy5idWlsZERlZmF1bHRTZXNzaW9uTmFtZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2Vzc2lvbk5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0U2Vzc2lvbk5hbWUoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBTZXNzaW9uTmFtZUNvbXBvc2l0ZS50aGlzLmRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRTZXNzaW9uTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlKE9wdGlvbnMgc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0U2Vzc2lvbk5hbWUoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdEVtcHR5OwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJQ0NvbWJvIGNvbWJvID0gYnVpbGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25OYW1lLAotCQkJdGhpcy5idWlsZERlZmF1bHRTZXNzaW9uTmFtZUxpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRTZXNzaW9uTmFtZUhvbGRlcigpLAotCQkJbnVsbAkJLy8gRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy4KLQkJKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL1Nlc3Npb25zWG1sQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9vcHRpb25zL1Nlc3Npb25zWG1sQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NTk2YzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvb3B0aW9ucy9TZXNzaW9uc1htbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgU2Vzc2lvbnNYbWxDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25zWG1sQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPE9wdGlvbnM+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZXNzaW9uc1htbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgU2Vzc2lvbnNYbWxDb21wb3NpdGUoCi0JCQkJCQkJCUFic3RyYWN0UGFuZTw/IGV4dGVuZHMgT3B0aW9ucz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuREVGQVVMVF9TRVNTSU9OU19YTUwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gU2Vzc2lvbnNYbWxDb21wb3NpdGUudGhpcy5kZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNlc3Npb25zWG1sRmlsZU5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuU0VTU0lPTlNfWE1MX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0U2Vzc2lvbnNYbWwoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBTZXNzaW9uc1htbENvbXBvc2l0ZS50aGlzLmRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRTZXNzaW9uc1htbCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlKE9wdGlvbnMgc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0U2Vzc2lvbnNYbWwoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdEVtcHR5OwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJQ0NvbWJvIGNvbWJvID0gYnVpbGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25zWG1sLAotCQkJdGhpcy5idWlsZERlZmF1bHRTZXNzaW9uc1htbEZpbGVOYW1lTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKSwKLQkJCW51bGwJCS8vIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuCi0JCSk7Ci0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvb3B0aW9ucy9UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvb3B0aW9ucy9UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzM0NmM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL29wdGlvbnMvVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5vcHRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnMuVGFyZ2V0RGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8T3B0aW9ucz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhcmdldERhdGFiYXNlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZSgKLQkJCQlBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8T3B0aW9ucywgVGFyZ2V0RGF0YWJhc2U+IGJ1aWxkVGFyZ2V0RGF0YWJhc2VDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxPcHRpb25zLCBUYXJnZXREYXRhYmFzZT4odGhpcywgY29udGFpbmVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFyZ2V0RGF0YWJhc2VbXSBjaG9pY2VzKCkgewotCQkJCXJldHVybiBUYXJnZXREYXRhYmFzZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFyZ2V0RGF0YWJhc2UgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QoKS5nZXREZWZhdWx0VGFyZ2V0RGF0YWJhc2UoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoVGFyZ2V0RGF0YWJhc2UgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhcmdldERhdGFiYXNlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QoKS5nZXRUYXJnZXREYXRhYmFzZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFRhcmdldERhdGFiYXNlIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0KCkuc2V0VGFyZ2V0RGF0YWJhc2UodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90YXJnZXREYXRhYmFzZUxhYmVsLAotCQkJCXRoaXMuYnVpbGRUYXJnZXREYXRhYmFzZUNvbWJvKGNvbnRhaW5lciksCi0JCQkJbnVsbCAvLyBUT0RPIElKcGFIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1M2U3MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLlJlc291cmNlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLkFic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBidWlsZFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7CisJCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzFfMF9SRVNPVVJDRV9UWVBFKTsKKwl9CisJCisJcHVibGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5pbnN0YW5jZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTgzNWM1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZ2VuZXJhbC5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmcuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5Cit7CisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCkgeworCQlzdXBlcigpOworCX0KKworCS8vICoqKioqKioqKioqKioqKiogcGVyc2lzdGVuY2UgdW5pdCBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpwYVBhZ2VDb21wb3NpdGU+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZXMoCisJCQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAorCQkJCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCUFycmF5TGlzdDxKcGFQYWdlQ29tcG9zaXRlPiBwYWdlcyA9IG5ldyBBcnJheUxpc3Q8SnBhUGFnZUNvbXBvc2l0ZT4oOCk7CisKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBlY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlciA9IAorCQkJdGhpcy5idWlsZEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyKHN1YmplY3RIb2xkZXIpOworCisJCXBhZ2VzLmFkZCh0aGlzLmJ1aWxkR2VuZXJhbFRhYihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKKwkJcGFnZXMuYWRkKHRoaXMuYnVpbGRDb25uZWN0aW9uVGFiKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOworCQlwYWdlcy5hZGQodGhpcy5idWlsZEN1c3RvbWl6YXRpb25UYWIoZWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOworCQlwYWdlcy5hZGQodGhpcy5idWlsZENhY2hpbmdUYWIoZWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOworCQlwYWdlcy5hZGQodGhpcy5idWlsZExvZ2dpbmdUYWIoZWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOworCQlwYWdlcy5hZGQodGhpcy5idWlsZE9wdGlvbnNUYWIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7CisJCXBhZ2VzLmFkZCh0aGlzLmJ1aWxkU2NoZW1hR2VuZXJhdGlvblRhYihlY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7CisJCXBhZ2VzLmFkZCh0aGlzLmJ1aWxkUHJvcGVydGllc1RhYihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKKworCQlyZXR1cm4gcGFnZXMubGlzdEl0ZXJhdG9yKCk7CisJfQorCisJLy8gKioqKioqKioqKiBwZXJzaXN0ZW5jZSB1bml0IHRhYnMgKioqKioqKioqKgorCQorCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUgYnVpbGRHZW5lcmFsVGFiKAorCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCisJCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiPD8gZXh0ZW5kcyBDb25uZWN0aW9uPiBidWlsZENvbm5lY3Rpb25UYWIoCisJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKKwkJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvbj4gY29ubmVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb25uZWN0aW9uSG9sZGVyKHN1YmplY3RIb2xkZXIpOworCisJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiPENvbm5lY3Rpb24+KGNvbm5lY3Rpb25Ib2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWIgYnVpbGRDdXN0b21pemF0aW9uVGFiKAorCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKKwkJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbj4gY3VzdG9taXphdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDdXN0b21pemF0aW9uSG9sZGVyKHN1YmplY3RIb2xkZXIpOworCisJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiKGN1c3RvbWl6YXRpb25Ib2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWI8PyBleHRlbmRzIENhY2hpbmc+IGJ1aWxkQ2FjaGluZ1RhYigKKwkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCisJCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IGNhY2hpbmdIb2xkZXIgPSB0aGlzLmJ1aWxkQ2FjaGluZ0hvbGRlcihzdWJqZWN0SG9sZGVyKTsKKworCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYjxDYWNoaW5nPihjYWNoaW5nSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiIGJ1aWxkTG9nZ2luZ1RhYigKKwkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCisJCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+IGxvZ2dpbmdIb2xkZXIgPSB0aGlzLmJ1aWxkTG9nZ2luZ0hvbGRlcihzdWJqZWN0SG9sZGVyKTsKKworCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYihsb2dnaW5nSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiPD8gZXh0ZW5kcyBPcHRpb25zPiBidWlsZE9wdGlvbnNUYWIoCisJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKKwkJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gb3B0aW9uc0hvbGRlciA9IHRoaXMuYnVpbGRPcHRpb25zSG9sZGVyKHN1YmplY3RIb2xkZXIpOworCisJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiPE9wdGlvbnM+KG9wdGlvbnNIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIgYnVpbGRTY2hlbWFHZW5lcmF0aW9uVGFiKAorCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKKwkJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gc2NoZW1hR2VuSG9sZGVyID0gdGhpcy5idWlsZFNjaGVtYUdlbmVyYXRpb25Ib2xkZXIoc3ViamVjdEhvbGRlcik7CisKKwkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIoc2NoZW1hR2VuSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZSBidWlsZFByb3BlcnRpZXNUYWIoCisJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKKwkJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gYnVpbGRFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlcigKKwkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4oc3ViamVjdEhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdHJhbnNmb3JtXyhQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKKwkJCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSB2YWx1ZTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvbj4gYnVpbGRDb25uZWN0aW9uSG9sZGVyKAorCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQsIENvbm5lY3Rpb24+KHN1YmplY3RIb2xkZXIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIENvbm5lY3Rpb24gdHJhbnNmb3JtXyhQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKKworCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KXZhbHVlKS5nZXRDb25uZWN0aW9uKCk7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+IGJ1aWxkQ3VzdG9taXphdGlvbkhvbGRlcigKKwkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgQ3VzdG9taXphdGlvbj4oc3ViamVjdEhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ3VzdG9taXphdGlvbiB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlLmdldEN1c3RvbWl6YXRpb24oKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBidWlsZENhY2hpbmdIb2xkZXIoCisJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQsIENhY2hpbmc+KHN1YmplY3RIb2xkZXIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIENhY2hpbmcgdHJhbnNmb3JtXyhFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCB2YWx1ZSkgeworCQkJCXJldHVybiB2YWx1ZS5nZXRDYWNoaW5nKCk7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+IGJ1aWxkTG9nZ2luZ0hvbGRlcigKKwkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgTG9nZ2luZz4oc3ViamVjdEhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgTG9nZ2luZyB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlLmdldExvZ2dpbmcoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gYnVpbGRPcHRpb25zSG9sZGVyKAorCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQsIE9wdGlvbnM+KHN1YmplY3RIb2xkZXIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIE9wdGlvbnMgdHJhbnNmb3JtXyhQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKKworCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KXZhbHVlKS5nZXRPcHRpb25zKCk7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+IGJ1aWxkU2NoZW1hR2VuZXJhdGlvbkhvbGRlcigKKwkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgU2NoZW1hR2VuZXJhdGlvbj4oc3ViamVjdEhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU2NoZW1hR2VuZXJhdGlvbiB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlLmdldFNjaGVtYUdlbmVyYXRpb24oKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZURlZmF1bHRzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlRGVmYXVsdHNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDE2Yjc1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZURlZmF1bHRzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIENhY2hlRGVmYXVsdHNDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIENhY2hlRGVmYXVsdHNDb21wb3NpdGU8VCBleHRlbmRzIENhY2hpbmc+IGV4dGVuZHMgRm9ybVBhbmU8VD4KK3sKKwlwdWJsaWMgQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZShGb3JtUGFuZTxUPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgeworCQkKKwkJdGhpcy5pbml0aWFsaXplQ2FjaGVEZWZhdWx0c1BhbmUocGFyZW50KTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hlRGVmYXVsdHNQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlDb21wb3NpdGUgZGVmYXVsdFBhbmUgPSB0aGlzLmFkZFRpdGxlZEdyb3VwKAorCQkJcGFyZW50LAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkNhY2hlRGVmYXVsdHNDb21wb3NpdGVfZ3JvdXBUaXRsZQorCQkpOworCisJCXRoaXMuaW5pdGlhbGl6ZUNhY2hlRGVmYXVsdHNDb21wb3NpdGVzKGRlZmF1bHRQYW5lKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hlRGVmYXVsdHNDb21wb3NpdGVzKENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQkvLyBEZWZhdWx0IENhY2hlIFR5cGUKKwkJbmV3IERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUodGhpcywgcGFyZW50KTsKKworCQkvLyBEZWZhdWx0IENhY2hlIFNpemUKKwkJbmV3IERlZmF1bHRDYWNoZVNpemVDb21wb3NpdGU8VD4odGhpcywgcGFyZW50KTsKKworCQkvLyBEZWZhdWx0IFNoYXJlZCBDYWNoZQorCQluZXcgRGVmYXVsdFNoYXJlZENhY2hlQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZVNpemVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVTaXplQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2ZGUzYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVTaXplQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogQ2FjaGVTaXplQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBDYWNoZVNpemVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVudGl0eT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhY2hlVHlwZUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBDYWNoZVNpemVDb21wb3NpdGUoUGFuZTxFbnRpdHk+IHBhcmVudENvbXBvc2l0ZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCXRoaXMuYWRkQ2FjaGVTaXplQ29tYm8oY29udGFpbmVyKTsKKwl9CQorCQorCXByaXZhdGUgdm9pZCBhZGRDYWNoZVNpemVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBJbnRlZ2VyQ29tYm88RW50aXR5Pih0aGlzLCBjb250YWluZXIpIHsKKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkNhY2hlU2l6ZUNvbXBvc2l0ZV9jYWNoZVNpemU7CisJCQl9CisJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DQUNISU5HOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEludGVnZXI+KGJ1aWxkQ2FjaGluZ0hvbGRlcigpLCBDYWNoaW5nLkNBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQlJbnRlZ2VyIHZhbHVlID0gdGhpcy5zdWJqZWN0LmdldENhY2hlU2l6ZURlZmF1bHQoKTsKKwkJCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQkJCQkJdmFsdWUgPSB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdENhY2hlU2l6ZURlZmF1bHQoKTsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiB2YWx1ZTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7CisJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBJbnRlZ2VyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFkpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIGdldFN1YmplY3RQYXJlbnQoKS5nZXRDYWNoZVNpemVPZihnZXRTdWJqZWN0TmFtZSgpKTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgeworCQkJCQkJZ2V0U3ViamVjdFBhcmVudCgpLnNldENhY2hlU2l6ZU9mKGdldFN1YmplY3ROYW1lKCksIHZhbHVlKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGdldFN1YmplY3ROYW1lKCkgeworCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuZ2V0VmFsdWUoKS5nZXROYW1lKCk7CisJfQorCQorCXByaXZhdGUgQ2FjaGluZyBnZXRTdWJqZWN0UGFyZW50KCkgeworCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuZ2V0VmFsdWUoKS5nZXRQYXJlbnQoKTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gYnVpbGRDYWNoaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eSwgQ2FjaGluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIENhY2hpbmcgdHJhbnNmb3JtXyhFbnRpdHkgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0UGFyZW50KCk7CisJCQl9CisJCX07CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZVR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViZmM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBDYWNoZVR5cGVDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIENhY2hlVHlwZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RW50aXR5PgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2FjaGVUeXBlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIENhY2hlVHlwZUNvbXBvc2l0ZShQYW5lPEVudGl0eT4gcGFyZW50Q29tcG9zaXRlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2NhY2hlVHlwZUxhYmVsLAorCQkJbmV3IENhY2hlVHlwZUNvbWJvKGNvbnRhaW5lciksCisJCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NBQ0hJTkcKKwkJKTsKKwl9CisKKwlwcml2YXRlIGNsYXNzIENhY2hlVHlwZUNvbWJvIGV4dGVuZHMgRW51bUZvcm1Db21ib1ZpZXdlcjxFbnRpdHksIENhY2hlVHlwZT4geworCisJCXByaXZhdGUgQ2FjaGVUeXBlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgeworCQkJc3VwZXIoQ2FjaGVUeXBlQ29tcG9zaXRlLnRoaXMsIHBhcmVudCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eS5DQUNIRV9UWVBFX1BST1BFUlRZKTsKKwkJfQorCisJCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigpIHsKKwkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5LCBDYWNoaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgQ2FjaGluZyB0cmFuc2Zvcm1fKEVudGl0eSB2YWx1ZSkgeworCQkJCQlyZXR1cm4gdmFsdWUuZ2V0UGFyZW50KCk7CisJCQkJfQorCQkJfTsKKwkJfQorCisJCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gYnVpbGREZWZhdWx0Q2FjaGVUeXBlSG9sZGVyKCkgeworCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPihidWlsZENhY2hpbmdIb2xkZXIoKSwgQ2FjaGluZy5DQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGJ1aWxkVmFsdWVfKCkgeworCQkJCQlDYWNoZVR5cGUgY2FjaGVUeXBlID0gc3ViamVjdC5nZXRDYWNoZVR5cGVEZWZhdWx0KCk7CisJCQkJCWlmIChjYWNoZVR5cGUgPT0gbnVsbCkgeworCQkJCQkJY2FjaGVUeXBlID0gc3ViamVjdC5nZXREZWZhdWx0Q2FjaGVUeXBlRGVmYXVsdCgpOworCQkJCQl9CisJCQkJCXJldHVybiBjYWNoZVR5cGU7CisJCQkJfQorCQkJfTsKKwkJfQorCisJCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERlZmF1bHRDYWNoaW5nVHlwZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKAorCQkJCWJ1aWxkRGVmYXVsdENhY2hpbmdUeXBlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKQorCQkJKTsKKwkJfQorCisJCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERlZmF1bHRDYWNoaW5nVHlwZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgeworCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKKwkJCQkJaWYgKChlLmdldE5ld1ZhbHVlKCkgIT0gbnVsbCkgJiYgIWdldENvbWJvKCkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQlDYWNoZVR5cGVDb21iby50aGlzLmRvUG9wdWxhdGUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX07CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIENhY2hlVHlwZVtdIGdldENob2ljZXMoKSB7CisJCQlyZXR1cm4gQ2FjaGVUeXBlLnZhbHVlcygpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBDYWNoZVR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJcmV0dXJuIGdldFN1YmplY3RQYXJlbnQoKS5nZXREZWZhdWx0Q2FjaGVUeXBlKCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKENhY2hlVHlwZSB2YWx1ZSkgeworCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKKwkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3MsCisJCQkJQ2FjaGVUeXBlQ29tcG9zaXRlLnRoaXMsCisJCQkJdmFsdWUKKwkJCSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKKwkJCS8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gYWxsb3cgdGhlIGNsYXNzIGxvYWRlciB0byBsZXQgdGhlIGxpc3RlbmVyCisJCQkvLyB3cml0dGVuIGFib3ZlIHRvIGFjY2VzcyB0aGlzIG1ldGhvZAorCQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBDYWNoZVR5cGUgZ2V0VmFsdWUoKSB7CisJCQlyZXR1cm4gZ2V0U3ViamVjdFBhcmVudCgpLmdldENhY2hlVHlwZU9mKGdldFN1YmplY3ROYW1lKCkpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCQlzdXBlci5pbml0aWFsaXplKCk7CisKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZVR5cGU+IGRlZmF1bHRDYWNoZVR5cGVIb2xkZXIgPQorCQkJCWJ1aWxkRGVmYXVsdENhY2hlVHlwZUhvbGRlcigpOworCisJCQlkZWZhdWx0Q2FjaGVUeXBlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCisJCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAorCQkJCWJ1aWxkRGVmYXVsdENhY2hpbmdUeXBlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpCisJCQkpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKENhY2hlVHlwZSB2YWx1ZSkgeworCQkJZ2V0U3ViamVjdFBhcmVudCgpLnNldENhY2hlVHlwZU9mKGdldFN1YmplY3ROYW1lKCksIHZhbHVlKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIFN0cmluZyBnZXRTdWJqZWN0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLmdldFZhbHVlKCkuZ2V0TmFtZSgpOworCX0KKworCXByaXZhdGUgQ2FjaGluZyBnZXRTdWJqZWN0UGFyZW50KCkgeworCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuZ2V0VmFsdWUoKS5nZXRQYXJlbnQoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0RlZmF1bHRDYWNoZVNpemVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDc0NWE2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogQ2FjaGVTaXplQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlPFQgZXh0ZW5kcyBDYWNoaW5nPiBleHRlbmRzIFBhbmU8VD4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhY2hlVHlwZUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBEZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlKFBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7CisJfQorCisKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlhZGREZWZhdWx0Q2FjaGVTaXplQ29tYm8oY29udGFpbmVyKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZERlZmF1bHRDYWNoZVNpemVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBJbnRlZ2VyQ29tYm88Q2FjaGluZz4odGhpcywgY29udGFpbmVyKSB7CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlX2RlZmF1bHRDYWNoZVNpemU7CisJCQl9CisJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DQUNISU5HX0RFRkFVTFRfU0laRTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0Q2FjaGVTaXplRGVmYXVsdCgpOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7CisJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYWNoaW5nLkNBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENhY2hlU2l6ZURlZmF1bHQoKTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgeworCQkJCQkJdGhpcy5zdWJqZWN0LnNldENhY2hlU2l6ZURlZmF1bHQodmFsdWUpOworCQkJCQl9CisJCQkJfTsJCQkKKwkJCX0KKwkJfTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0RlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZjdiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0RlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxDYWNoaW5nPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZTwvY29kZT4uCisJICogCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZSgKKwkJCQkJRm9ybVBhbmU8PyBleHRlbmRzIENhY2hpbmc+IHBhcmVudENvbXBvc2l0ZSwgCisJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlciggcGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxDYWNoaW5nLCBDYWNoZVR5cGU+IGJ1aWxkRGVmYXVsdENhY2hlVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPENhY2hpbmcsIENhY2hlVHlwZT4odGhpcywgY29udGFpbmVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlW10gZ2V0Q2hvaWNlcygpIHsKKwkJCQlyZXR1cm4gQ2FjaGVUeXBlLnZhbHVlcygpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRDYWNoZVR5cGVEZWZhdWx0KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKENhY2hlVHlwZSB2YWx1ZSkgeworCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGdldFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKENhY2hlVHlwZSB2YWx1ZSkgeworCQkJCWdldFN1YmplY3QoKS5zZXRDYWNoZVR5cGVEZWZhdWx0KHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dCggQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfZGVmYXVsdENhY2hlVHlwZUxhYmVsLAorCQkJdGhpcy5idWlsZERlZmF1bHRDYWNoZVR5cGVDb21ibyggY29udGFpbmVyKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElOR19ERUZBVUxUX1RZUEUJCisJCSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9EZWZhdWx0U2hhcmVkQ2FjaGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdFNoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0Yjk4NQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdFNoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBEZWZhdWx0U2hhcmVDYWNoZUNvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdFNoYXJlZENhY2hlQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8Q2FjaGluZz4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRlZmF1bHRTaGFyZUNhY2hlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIERlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZSgKKwkJCQkJRm9ybVBhbmU8PyBleHRlbmRzIENhY2hpbmc+IHBhcmVudENvbXBvc2l0ZSwKKwkJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWwsCisJCQl0aGlzLmJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlSG9sZGVyKCksCisJCQl0aGlzLmJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlU3RyaW5nSG9sZGVyKCksCisJCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NBQ0hJTkdfREVGQVVMVF9TSEFSRUQKKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRTaGFyZWRDYWNoZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0U2hhcmVkQ2FjaGVEZWZhdWx0KHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlU3RyaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0RGVmYXVsdFNoYXJlZENhY2hlSG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKKwkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfZGVmYXVsdFNoYXJlZENhY2hlRGVmYXVsdExhYmVsLCBkZWZhdWx0U3RyaW5nVmFsdWUpOworCQkJCX0KKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZURlZmF1bHRMYWJlbDsKKwkJCX0KKwkJfTsKKwl9CisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0RGVmYXVsdFNoYXJlZENhY2hlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCUNhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHQoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjA4MTU2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyoKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqICBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ2FjaGluZz4gZXh0ZW5kcyBGb3JtUGFuZTxUPgoreworCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUoRm9ybVBhbmU8VD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGhpcy5hZGRTZWN0aW9uKAorCQkJcGFyZW50LAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zZWN0aW9uVGl0bGUsCisJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NlY3Rpb25EZXNjcmlwdGlvbgorCQkpOworCisJCS8vIERlZmF1bHRzCisJCW5ldyBDYWNoZURlZmF1bHRzQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7CisJCS8vIEVudGl0aWVzTGlzdAorCQluZXcgRW50aXR5TGlzdENvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOworCQkvLyBGbHVzaCBDbGVhciBDYWNoZQorCQluZXcgRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NThmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHk+IHsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBFbnRpdHlDYWNoaW5nUHJvcGVydHlDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgQ2FjaGluZz4gcGFyZW50Q29tcG9zaXRlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eT4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJLy8gQ2FjaGUgVHlwZQorCQluZXcgQ2FjaGVUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisKKwkJLy8gQ2FjaGUgU2l6ZQorCQluZXcgQ2FjaGVTaXplQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisKKwkJLy8gU2hhcmUgQ2FjaGUKKwkJbmV3IFNoYXJlZENhY2hlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9FbnRpdHlMaXN0Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VudGl0eUxpc3RDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODViZjU1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9FbnRpdHlMaXN0Q29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwyMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKgorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLkpwdEVjbGlwc2VMaW5rVWlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7CisKKy8qKgorICogIEVudGl0eUxpc3RDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEVudGl0eUxpc3RDb21wb3NpdGU8VCBleHRlbmRzIENhY2hpbmc+IGV4dGVuZHMgUGFuZTxUPgoreworCXB1YmxpYyBFbnRpdHlMaXN0Q29tcG9zaXRlKFBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLCBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWNvbnRhaW5lciA9IHRoaXMuYWRkVGl0bGVkR3JvdXAoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZ3JvdXBUaXRsZQorCQkpOworCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+IGVudGl0eUhvbGRlciA9IHRoaXMuYnVpbGRFbnRpdHlIb2xkZXIoKTsKKworCQkvLyBFbnRpdGllcyBhZGQvcmVtb3ZlIGxpc3QgcGFuZQorCQluZXcgQWRkUmVtb3ZlTGlzdFBhbmU8Q2FjaGluZz4oCisJCQl0aGlzLAorCQkJY29udGFpbmVyLAorCQkJdGhpcy5idWlsZEVudGl0aWVzQWRhcHRlcigpLAorCQkJdGhpcy5idWlsZEVudGl0aWVzTGlzdEhvbGRlcigpLAorCQkJZW50aXR5SG9sZGVyLAorCQkJdGhpcy5idWlsZEVudGl0eUxhYmVsUHJvdmlkZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORworCQkpOworCisJCS8vIEVudGl0eSBDYWNoaW5nIHByb3BlcnR5IHBhbmUKKwkJRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlIHBhbmUgPSBuZXcgRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlKAorCQkJdGhpcywKKwkJCWVudGl0eUhvbGRlciwKKwkJCWNvbnRhaW5lcgorCQkpOworCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcihlbnRpdHlIb2xkZXIsIHBhbmUpOworCX0KKwkKKwlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lLkFkYXB0ZXIgYnVpbGRFbnRpdGllc0FkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7CisJCQkJRW50aXR5TGlzdENvbXBvc2l0ZS50aGlzLmFkZEVudGl0aWVzKGxpc3RTZWxlY3Rpb25Nb2RlbCk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCQkJCUNhY2hpbmcgY2FjaGluZyA9IGdldFN1YmplY3QoKTsKKwkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKKwkJCQkJRW50aXR5IGVudGl0eUNhY2hpbmcgPSAoRW50aXR5KSBpdGVtOworCQkJCQljYWNoaW5nLnJlbW92ZUVudGl0eShlbnRpdHlDYWNoaW5nLmdldE5hbWUoKSk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIHZvaWQgYWRkRW50aXRpZXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCisJCUlUeXBlIHR5cGUgPSB0aGlzLmNob29zZUVudGl0eSgpOworCisJCWlmICh0eXBlICE9IG51bGwpIHsKKwkJCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5nZXRFbnRpdHlOYW1lKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOworCQkJaWYgKGVudGl0eU5hbWUgPT0gbnVsbCkgeworCQkJCWVudGl0eU5hbWUgPSB0eXBlLmdldEVsZW1lbnROYW1lKCk7CisJCQl9CisJCQkKKwkJCWlmKCAhIHRoaXMuZ2V0U3ViamVjdCgpLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgeworCQkJCXRoaXMuZ2V0U3ViamVjdCgpLmFkZEVudGl0eShlbnRpdHlOYW1lKTsKKworCQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGVudGl0eU5hbWUpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0RW50aXR5TmFtZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgeworCisJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5IGVudGl0eSA9IGdldFN1YmplY3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7CisJCXJldHVybiAoZW50aXR5ICE9IG51bGwpID8gZW50aXR5LmdldE5hbWUoKSA6IG51bGw7CisJfQorCQorCXByaXZhdGUgSVR5cGUgY2hvb3NlRW50aXR5KCkgeworCisJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7CisJCWlmIChyb290ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtdIHsgcm9vdC5nZXRKYXZhUHJvamVjdCgpIH07CisJCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKKwkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKKwkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7CisKKwkJdHJ5IHsKKwkJCXR5cGVTZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKKwkJCQlnZXRTaGVsbCgpLAorCQkJCXNlcnZpY2UsCisJCQkJc2NvcGUsCisJCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsCisJCQkJZmFsc2UsCisJCQkJIiIKKwkJCSk7CisJCX0KKwkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlKcHRFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkNhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ1RpdGxlKTsKKwkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlKTsKKworCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7CisJCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpIHsKKwkJSVByb2plY3QgcHJvamVjdCA9IGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOworCQlJSmF2YVByb2plY3Qgcm9vdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKKworCQl0cnkgeworCQkJcmV0dXJuIHJvb3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKKwkJfQorCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCUpwdEVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRFbnRpdHlMYWJlbFByb3ZpZGVyKCkgeworCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJCUVudGl0eSBlbnRpdHlDYWNoaW5nID0gKEVudGl0eSkgZWxlbWVudDsKKwkJCQlyZXR1cm4gZW50aXR5Q2FjaGluZy5nZXROYW1lKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+IGJ1aWxkRW50aXR5SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+KCk7CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFbnRpdHk+IGJ1aWxkRW50aXRpZXNMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEVudGl0eT4oCisJCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDYWNoaW5nLkVOVElUSUVTX0xJU1QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFbnRpdHk+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5lbnRpdGllcygpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZW50aXRpZXNTaXplKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lRW5hYmxlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+IGVudGl0eUhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZSBwYW5lKSB7CisKKwkJbmV3IFBhbmVFbmFibGVyKAorCQkJdGhpcy5idWlsZFBhbmVFbmFibGVySG9sZGVyKGVudGl0eUhvbGRlciksCisJCQlwYW5lCisJCSk7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+IGVudGl0eUhvbGRlcikgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eSwgQm9vbGVhbj4oZW50aXR5SG9sZGVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oRW50aXR5IHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlLmVudGl0eU5hbWVJc1ZhbGlkKCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9GbHVzaENsZWFyQ2FjaGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlMjc1NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5GbHVzaENsZWFyQ2FjaGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBGbHVzaENsZWFyQ2FjaGVDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPENhY2hpbmc+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5GbHVzaENsZWFyQ2FjaGVDb21wb3NpdGU8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZSgKKwkJCQlGb3JtUGFuZTw/IGV4dGVuZHMgQ2FjaGluZz4gcGFyZW50Q29tcG9zaXRlLCAKKwkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisJCQorCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7CisJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCQlwYXJlbnQsCisJCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9GbHVzaENsZWFyQ2FjaGVMYWJlbCwKKwkJCQl0aGlzLmFkZEZsdXNoQ2xlYXJDYWNoZUNvbWJvKHBhcmVudCksCisJCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DQUNISU5HCisJCSk7CisJfQorCisJcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPENhY2hpbmcsIEZsdXNoQ2xlYXJDYWNoZT4gYWRkRmx1c2hDbGVhckNhY2hlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q2FjaGluZywgRmx1c2hDbGVhckNhY2hlPih0aGlzLCBjb250YWluZXIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoQ2FjaGluZy5GTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEZsdXNoQ2xlYXJDYWNoZVtdIGdldENob2ljZXMoKSB7CisJCQkJcmV0dXJuIEZsdXNoQ2xlYXJDYWNoZS52YWx1ZXMoKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEZsdXNoQ2xlYXJDYWNoZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRGbHVzaENsZWFyQ2FjaGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRmx1c2hDbGVhckNhY2hlIHZhbHVlKSB7CisJCQkJcmV0dXJuIHRoaXMuYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlLmNsYXNzLCB2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEZsdXNoQ2xlYXJDYWNoZSBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0Rmx1c2hDbGVhckNhY2hlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRmx1c2hDbGVhckNhY2hlIHZhbHVlKSB7CisJCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0Rmx1c2hDbGVhckNhY2hlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL1BlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWQzMjVlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWIuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWI8VCBleHRlbmRzIENhY2hpbmc+CisJCQkJCQkJCWV4dGVuZHMgRm9ybVBhbmU8VD4KKwkJCQkJCQkJaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCit7CisJcHVibGljIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYigKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKyAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQkKKwkJbmV3IEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOworCX0KKworCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORzsKKwl9CisKKwlwdWJsaWMgSW1hZ2UgZ2V0UGFnZUltYWdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJcHVibGljIFN0cmluZyBnZXRQYWdlVGV4dCgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfdGl0bGU7CisJfQorCisJLy8gKioqKioqKioqKiBMYXlvdXQgKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCWxheW91dC5tYXJnaW5Ub3AgPSAwOworCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7CisJCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOworCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7CisJCQorCQlDb21wb3NpdGUgY29udGFpbmVyID0gYWRkUGFuZShwYXJlbnQsIGxheW91dCk7CisJCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7CisJCQorCQlyZXR1cm4gY29udGFpbmVyOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7CisJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9TaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9TaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NDBiZDcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL1NoYXJlZENhY2hlQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKgorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlRyaVN0YXRlQ2hlY2tCb3g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgU2hhcmVkQ2FjaGVDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFNoYXJlZENhY2hlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHk+Cit7CisJcHJpdmF0ZSBUcmlTdGF0ZUNoZWNrQm94IHNoYXJlZENhY2hlQ2hlY2tCb3g7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNoYXJlQ2FjaGVDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIFNoYXJlZENhY2hlQ29tcG9zaXRlKFBhbmU8RW50aXR5PiBwYXJlbnRDb21wb3NpdGUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBidWlsZENhY2hpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5LCBDYWNoaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ2FjaGluZyB0cmFuc2Zvcm1fKEVudGl0eSB2YWx1ZSkgeworCQkJCXJldHVybiB2YWx1ZS5nZXRQYXJlbnQoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRBbmROb25EZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4oCisJCQlidWlsZERlZmF1bHRBbmROb25EZWZhdWx0U2hhcmVkQ2FjaGVMaXN0SG9sZGVyKCkKKwkJKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7CisJCQkJLy8gSWYgdGhlIG51bWJlciBvZiBMaXN0VmFsdWVNb2RlbCBlcXVhbHMgMSwgdGhhdCBtZWFucyB0aGUgc2hhcmVkCisJCQkJLy8gQ2FjaGUgcHJvcGVydGllcyBpcyBub3Qgc2V0IChwYXJ0aWFsbHkgc2VsZWN0ZWQpLCB3aGljaCBtZWFucyB3ZQorCQkJCS8vIHdhbnQgdG8gc2VlIHRoZSBkZWZhdWx0IHZhbHVlIGFwcGVuZGVkIHRvIHRoZSB0ZXh0CisJCQkJaWYgKHRoaXMubGlzdEhvbGRlci5zaXplKCkgPT0gMSkgeworCQkJCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKS5uZXh0KCk7CisJCQkJfQorCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0QW5kTm9uRGVmYXVsdFNoYXJlZENhY2hlTGlzdEhvbGRlcigpIHsKKwkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPEJvb2xlYW4+PiBob2xkZXJzID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxCb29sZWFuPj4oMik7CisJCWhvbGRlcnMuYWRkKGJ1aWxkU2hhcmVkQ2FjaGVMaXN0SG9sZGVyKCkpOworCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRTaGFyZWRDYWNoZUxpc3RIb2xkZXIoKSk7CisKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxCb29sZWFuPiwgQm9vbGVhbj4oCisJCQlob2xkZXJzCisJCSk7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KGJ1aWxkQ2FjaGluZ0hvbGRlcigpLCBDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCUJvb2xlYW4gdmFsdWUgPSB0aGlzLnN1YmplY3QuZ2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCk7CisJCQkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCQkJdmFsdWUgPSB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFNoYXJlZENhY2hlRGVmYXVsdCgpOworCQkJCX0KKwkJCQlyZXR1cm4gdmFsdWU7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRTaGFyZWRDYWNoZUxpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4oCisJCQlidWlsZERlZmF1bHRTaGFyZWRDYWNoZUhvbGRlcigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNoYXJlZENhY2hlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIEJvb2xlYW4+KAorCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5TSEFSRURfQ0FDSEVfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3RQYXJlbnQoKS5nZXRTaGFyZWRDYWNoZU9mKGdldFN1YmplY3ROYW1lKCkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJZ2V0U3ViamVjdFBhcmVudCgpLnNldFNoYXJlZENhY2hlT2YoZ2V0U3ViamVjdE5hbWUoKSwgdmFsdWUpOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFN0cmluZyBnZXRTdWJqZWN0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLmdldFZhbHVlKCkuZ2V0TmFtZSgpOworCX0KKwkKKwlwcml2YXRlIENhY2hpbmcgZ2V0U3ViamVjdFBhcmVudCgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLmdldFZhbHVlKCkuZ2V0UGFyZW50KCk7CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNoYXJlZENhY2hlTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPigKKwkJCWJ1aWxkU2hhcmVkQ2FjaGVIb2xkZXIoKQorCQkpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTaGFyZWRDYWNoZVN0cmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEFuZE5vbkRlZmF1bHRTaGFyZWRDYWNoZUhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7CisJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRTaGFyZWRDYWNoZUxhYmVsLCBkZWZhdWx0U3RyaW5nVmFsdWUpOworCQkJCX0KKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZUxhYmVsOworCQkJfQorCQl9OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7CisJCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7CisJCXRoaXMuc2hhcmVkQ2FjaGVDaGVja0JveC5zZXRFbmFibGVkKGVuYWJsZWQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXRoaXMuc2hhcmVkQ2FjaGVDaGVja0JveCA9IHRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZUxhYmVsLAorCQkJdGhpcy5idWlsZFNoYXJlZENhY2hlSG9sZGVyKCksCisJCQl0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVTdHJpbmdIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORworCQkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0JhdGNoV3JpdGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9CYXRjaFdyaXRpbmdDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGI1NjJkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9CYXRjaFdyaXRpbmdDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkJhdGNoV3JpdGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBCYXRjaFdyaXRpbmdDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4KKwkJZXh0ZW5kcyBGb3JtUGFuZTxUPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmF0Y2hXcml0aW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBCYXRjaFdyaXRpbmdDb21wb3NpdGUoCisJCQkJCUZvcm1QYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgCisJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlciggcGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxDb25uZWN0aW9uLCBCYXRjaFdyaXRpbmc+IGFkZEJhdGNoV3JpdGluZ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPENvbm5lY3Rpb24sIEJhdGNoV3JpdGluZz4odGhpcywgY29udGFpbmVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKENvbm5lY3Rpb24uQkFUQ0hfV1JJVElOR19QUk9QRVJUWSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJhdGNoV3JpdGluZ1tdIGdldENob2ljZXMoKSB7CisJCQkJcmV0dXJuIEJhdGNoV3JpdGluZy52YWx1ZXMoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQmF0Y2hXcml0aW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRCYXRjaFdyaXRpbmcoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoQmF0Y2hXcml0aW5nIHZhbHVlKSB7CisJCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZyhFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3MsIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJhdGNoV3JpdGluZyBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEJhdGNoV3JpdGluZygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEJhdGNoV3JpdGluZyB2YWx1ZSkgeworCQkJCWdldFN1YmplY3QoKS5zZXRCYXRjaFdyaXRpbmcodmFsdWUpOworCQkJfQorCQl9OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KCBDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iYXRjaFdyaXRpbmdMYWJlbCwKKwkJCXRoaXMuYWRkQmF0Y2hXcml0aW5nQ29tYm8oIGNvbnRhaW5lciksCisJCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgorCQkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9DYWNoZVN0YXRlbWVudHNQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0ZTBlNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyoKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCisJZXh0ZW5kcyBQYW5lPFQ+Cit7CisJcHVibGljIENhY2hlU3RhdGVtZW50c1Byb3BlcnRpZXNDb21wb3NpdGUoCisJCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgCisJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGNhY2hlU3RhdGVtZW50c0hvbGRlciA9IGJ1aWxkQ2FjaGVTdGF0ZW1lbnRzSG9sZGVyKCk7CisKKwkJY29udGFpbmVyID0gdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgMywgNSwgMCwgMCwgMCk7CisJCQorCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3goCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2NhY2hlU3RhdGVtZW50c0xhYmVsLAorCQkJY2FjaGVTdGF0ZW1lbnRzSG9sZGVyLAorCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04KKwkJKTsKKwkJSW50ZWdlckNvbWJvPD8+IGNvbWJvID0gYWRkQ2FjaGVTdGF0ZW1lbnRzU2l6ZUNvbWJvKGNvbnRhaW5lcik7CisKKwkJdGhpcy5pbnN0YWxsQ29udHJvbEVuYWJsZXIoY2FjaGVTdGF0ZW1lbnRzSG9sZGVyLCBjb21ibyk7CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhY2hlU3RhdGVtZW50c0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLkNBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDYWNoZVN0YXRlbWVudHMoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRDYWNoZVN0YXRlbWVudHModmFsdWUpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgeworCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKKwkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOworCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKKworCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAorCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7CisJCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZWQoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIEludGVnZXJDb21ibzxDb25uZWN0aW9uPiBhZGRDYWNoZVN0YXRlbWVudHNTaXplQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IEludGVnZXJDb21ibzxDb25uZWN0aW9uPih0aGlzLCBjb250YWluZXIpIHsKKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ0NvbWJvIGFkZEludGVnZXJDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCQkJcmV0dXJuIHRoaXMuYWRkRWRpdGFibGVDQ29tYm8oCisJCQkJCQljb250YWluZXIsCisJCQkJCQlidWlsZERlZmF1bHRMaXN0SG9sZGVyKCksCisJCQkJCQlidWlsZFNlbGVjdGVkSXRlbVN0cmluZ0hvbGRlcigpLAorCQkJCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFN0cmluZz5pbnN0YW5jZSgpKTsKKwkJCX0KKwkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgeworCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQkJfQorCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7CisJCQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRDYWNoZVN0YXRlbWVudHNTaXplKCk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7CisJCQkJCQl0aGlzLnN1YmplY3Quc2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSh2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgdm9pZCBpbnN0YWxsQ29udHJvbEVuYWJsZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gY2FjaGVTdGF0ZW1lbnRzSG9sZGVyLCBJbnRlZ2VyQ29tYm88Pz4gY29tYm8pIHsKKworCQluZXcgUGFuZUVuYWJsZXIoY2FjaGVTdGF0ZW1lbnRzSG9sZGVyLCBjb21ibyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM0ZTgwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9Db25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKgorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKKwlleHRlbmRzIFBhbmU8VD4KK3sKKwlwdWJsaWMgQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUoCisJCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLCAKKwkJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQljb250YWluZXIgPSBhZGRUaXRsZWRHcm91cCgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Db25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9EYXRhYmFzZV9Hcm91cEJveAorCQkpOworCisJCW5ldyBEYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOworCQluZXcgSmRiY1Byb3BlcnRpZXNDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9EYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9EYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Mjg2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0RhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKKy8qKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCisJZXh0ZW5kcyBQYW5lPFQ+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUoCisJCQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsCisJCQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRKdGFEYXRhU291cmNlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFN0cmluZz4oYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0LkpUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0SnRhRGF0YVNvdXJjZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgeworCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJfQorCQkJCXRoaXMuc3ViamVjdC5zZXRKdGFEYXRhU291cmNlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEpUQURhdGFTb3VyY2VIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLCBCb29sZWFuPihidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5vbkp0YURhdGFTb3VyY2VIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPihidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuTk9OX0pUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgeworCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJfQorCQkJCXRoaXMuc3ViamVjdC5zZXROb25KdGFEYXRhU291cmNlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vbkpUQURhdGFTb3VyY2VIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLCBCb29sZWFuPihidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlID09IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPiBidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+KAorCQkJCWJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCksIAorCQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwgCisJCQkJUGVyc2lzdGVuY2VVbml0LkRFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VHJhbnNhY3Rpb25UeXBlKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgUGVyc2lzdGVuY2VVbml0PihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpOworCQkJfQorCQl9OworCQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKworCQljb250YWluZXIgPSBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKTsKKworCQkvLyBKVEEgRGF0YSBTb3VyY2UKKwkJTGFiZWwganRhTGFiZWwgPSBhZGRVbm1hbmFnZWRMYWJlbChjb250YWluZXIsIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfanRhRGF0YVNvdXJjZUxhYmVsKTsKKwkJVGV4dCB0ZXh0ID0gYWRkVW5tYW5hZ2VkVGV4dChjb250YWluZXIsIHRoaXMuYnVpbGRKdGFEYXRhU291cmNlSG9sZGVyKCksIHRoaXMuZ2V0SGVscElEKCkpOworCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoY29udGFpbmVyLCBqdGFMYWJlbCwgdGV4dCwgdGhpcy5nZXRIZWxwSUQoKSk7CisKKwkJdGhpcy5pbnN0YWxsSlRBRGF0YVNvdXJjZUNvbnRyb2xFbmFibGVyKHRleHQsIGp0YUxhYmVsKTsKKworCQkvLyBOb24tSlRBIERhdGEgU291cmNlCisJCUxhYmVsIG5vbkp0YUxhYmVsID0gYWRkVW5tYW5hZ2VkTGFiZWwoY29udGFpbmVyLCBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25vbkp0YURhdGFTb3VyY2VMYWJlbCk7CisJCVRleHQgbm9uSnRhVGV4dCA9IGFkZFVubWFuYWdlZFRleHQoY29udGFpbmVyLCBidWlsZE5vbkp0YURhdGFTb3VyY2VIb2xkZXIoKSwgdGhpcy5nZXRIZWxwSUQoKSk7CisJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShjb250YWluZXIsIG5vbkp0YUxhYmVsLCBub25KdGFUZXh0LCB0aGlzLmdldEhlbHBJRCgpKTsKKworCQl0aGlzLmluc3RhbGxOb25KVEFEYXRhU291cmNlQ29udHJvbEVuYWJsZXIobm9uSnRhVGV4dCwgbm9uSnRhTGFiZWwpOworCX0KKworCXByaXZhdGUgdm9pZCBpbnN0YWxsSlRBRGF0YVNvdXJjZUNvbnRyb2xFbmFibGVyKFRleHQgdGV4dCwgTGFiZWwgbGFiZWwpIHsKKwkJU1dUVG9vbHMuY29udHJvbEVuYWJsZWRTdGF0ZShidWlsZEpUQURhdGFTb3VyY2VIb2xkZXIoKSwgdGV4dCwgbGFiZWwpOworCX0KKworCXByaXZhdGUgdm9pZCBpbnN0YWxsTm9uSlRBRGF0YVNvdXJjZUNvbnRyb2xFbmFibGVyKFRleHQgdGV4dCwgTGFiZWwgbGFiZWwpIHsKKwkJU1dUVG9vbHMuY29udHJvbEVuYWJsZWRTdGF0ZShidWlsZE5vbkpUQURhdGFTb3VyY2VIb2xkZXIoKSwgdGV4dCwgbGFiZWwpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKKwkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0VjbGlwc2VMaW5rQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjIzMGJiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogRWNsaXBzZUxpbmtDb25uZWN0aW9uQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+CisJZXh0ZW5kcyBGb3JtUGFuZTxUPgoreworCXB1YmxpYyBFY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGUoCisJCQkJCUZvcm1QYW5lPFQ+IHN1YmplY3RIb2xkZXIsCisJCQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKSAqIDI7CisKKwkJY29udGFpbmVyID0gYWRkU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfc2VjdGlvblRpdGxlLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24KKwkJKTsKKworCQlDb21wb3NpdGUgc3ViUGFuZSA9IGFkZFN1YlBhbmUoCisJCQljb250YWluZXIsCisJCQkwLCBncm91cEJveE1hcmdpbiwgMTAsIGdyb3VwQm94TWFyZ2luCisJCSk7CisKKwkJbmV3IFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZTxUPih0aGlzLCBzdWJQYW5lKTsKKworCQluZXcgQmF0Y2hXcml0aW5nQ29tcG9zaXRlPFQ+KHRoaXMsIHN1YlBhbmUpOworCisJCW5ldyBDYWNoZVN0YXRlbWVudHNQcm9wZXJ0aWVzQ29tcG9zaXRlPFQ+KHRoaXMsIHN1YlBhbmUpOworCisJCW5ldyBOYXRpdmVTcWxDb21wb3NpdGU8VD4odGhpcywgc3ViUGFuZSk7CisKKwkJbmV3IENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNCaW5kUGFyYW1ldGVyc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjJlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNCaW5kUGFyYW1ldGVyc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBKZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPENvbm5lY3Rpb24+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlKAorCQkJCQlQYW5lPD8gZXh0ZW5kcyBDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsCisJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWwsCisJCQl0aGlzLmJ1aWxkQmluZFBhcmFtZXRlcnNIb2xkZXIoKSwKKwkJCXRoaXMuYnVpbGRCaW5kUGFyYW1ldGVyc1N0cmluZ0hvbGRlcigpLAorCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04KKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEJpbmRQYXJhbWV0ZXJzSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uQklORF9QQVJBTUVURVJTX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QmluZFBhcmFtZXRlcnMoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRCaW5kUGFyYW1ldGVycyh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEJpbmRQYXJhbWV0ZXJzU3RyaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0QmluZFBhcmFtZXRlcnNIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iaW5kUGFyYW1ldGVyc0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmluZFBhcmFtZXRlcnNMYWJlbDsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0QmluZFBhcmFtZXRlcnNIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEJvb2xlYW4+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJQ29ubmVjdGlvbi5CSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRCaW5kUGFyYW1ldGVycygpICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdEJpbmRQYXJhbWV0ZXJzKCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmViNWUzNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwzNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKgorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5KcHREYlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5GaWx0ZXJlZEl0ZW1zU2VsZWN0aW9uRGlhbG9nOworCisvKioKKyAqICBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKKwlleHRlbmRzIFBhbmU8VD4KK3sKKwkvKioKKwkgKiBUaGUgY29uc3RhbnQgSUQgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGlhbG9nIHNldHRpbmdzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfU0VUVElOR1MgPSAib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmRpYWxvZ3MuQ29ubmVjdGlvbkRpYWxvZyI7CisKKwlwdWJsaWMgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKAorCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgCisJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUGFzc3dvcmRIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlBBU1NXT1JEX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3QuZ2V0UGFzc3dvcmQoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKwkJCQlzdWJqZWN0LnNldFBhc3N3b3JkKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUG9wdWxhdGVGcm9tQ29ubmVjdGlvbkFjdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlwcm9tcHRDb25uZWN0aW9uKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXJsSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5VUkxfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gc3ViamVjdC5nZXRVcmwoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKwkJCQlzdWJqZWN0LnNldFVybCh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXNlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LmdldFVzZXIoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKwkJCQlzdWJqZWN0LnNldFVzZXIodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCS8vIFBvcHVsYXRlIGZyb20gQ29ubmVjdGlvbiBoeXBlcmxpbmsKKwkJdGhpcy5hZGRIeXBlcmxpbmsoCisJCQljb250YWluZXIsCisJCQkiUG9wdWxhdGUgZnJvbSBDb25uZWN0aW9uLi4uIiwKKwkJCWJ1aWxkUG9wdWxhdGVGcm9tQ29ubmVjdGlvbkFjdGlvbigpCisJCSk7CisKKwkJLy8gRHJpdmVyCisJCW5ldyBKZGJjRHJpdmVyQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisKKwkJLy8gVXJsCisJCXRoaXMuYWRkTGFiZWxlZFRleHQoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3VybExhYmVsLAorCQkJYnVpbGRVcmxIb2xkZXIoKQorCQkpOworCisJCS8vIFVzZXIKKwkJdGhpcy5hZGRMYWJlbGVkVGV4dCgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdXNlckxhYmVsLAorCQkJYnVpbGRVc2VySG9sZGVyKCkKKwkJKTsKKworCQkvLyBQYXNzd29yZAorCQl0aGlzLmFkZExhYmVsZWRQYXNzd29yZFRleHQoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3Bhc3N3b3JkTGFiZWwsCisJCQlidWlsZFBhc3N3b3JkSG9sZGVyKCkKKwkJKTsKKworCQkvLyBCaW5kIFBhcmFtZXRlcnMKKwkJbmV3IEpkYmNCaW5kUGFyYW1ldGVyc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KKworCXZvaWQgcHJvbXB0Q29ubmVjdGlvbigpIHsKKworCQlDb25uZWN0aW9uU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBDb25uZWN0aW9uU2VsZWN0aW9uRGlhbG9nKCk7CisKKwkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBkaWFsb2cuZ2V0UmVzdWx0KClbMF07CisJCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKG5hbWUpOworCisJCUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldFN1YmplY3QoKTsKKwkJY29ubmVjdGlvbi5zZXRVcmwoKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVUkwoKSk7CisJCWNvbm5lY3Rpb24uc2V0VXNlcigoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVzZXJOYW1lKCkpOworCQljb25uZWN0aW9uLnNldFBhc3N3b3JkKChjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VXNlclBhc3N3b3JkKCkpOworCQljb25uZWN0aW9uLnNldERyaXZlcigoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldERyaXZlckNsYXNzTmFtZSgpKTsKKwl9CisKKwlDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgeworCQkvLyB3ZSBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgYW55IGNvbm5lY3Rpb24gcHJvZmlsZSBhbmQgc2ltcGx5CisJCS8vIHRha2UgdGhlIHNldHRpbmdzIGZyb20gaXQgKHVzZXIsIHBhc3N3b3JkLCBldGMuKSBhbmQgZ2l2ZSB0aGVtCisJCS8vIHRvIHRoZSBFY2xpcHNlTGluayBjb25uZWN0aW9uLCBzbyB3ZSBnbworCQkvLyB0byB0aGUgZGIgcGx1Zy1pbiBkaXJlY3RseSB0byBnZXQgdGhlIGZhY3RvcnkKKwkJcmV0dXJuIEpwdERiUGx1Z2luLmluc3RhbmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7CisJfQorCisJLy8gYnJvYWRlbiBhY2Nlc3MgYSBiaXQKKwlTaGVsbCBnZXRTaGVsbF8oKSB7CisJCXJldHVybiB0aGlzLmdldFNoZWxsKCk7CisJfQorCisJLyoqCisJICogVGhpcyBkaWFsb2cgc2hvd3MgdGhlIGxpc3Qgb2YgcG9zc2libGUgY29ubmVjdGlvbiBuYW1lcyBhbmQgbGV0cyB0aGUgdXNlcgorCSAqIHRoZSBvcHRpb24gdG8gZmlsdGVyIHRoZW0gdXNpbmcgYSBzZWFyY2ggZmllbGQuCisJICovCisJcHJvdGVjdGVkIGNsYXNzIENvbm5lY3Rpb25TZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBGaWx0ZXJlZEl0ZW1zU2VsZWN0aW9uRGlhbG9nIHsKKworCQkvKioKKwkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwaW5nU2VsZWN0aW9uRGlhbG9nPC9jb2RlPi4KKwkJICovCisJCXByb3RlY3RlZCBDb25uZWN0aW9uU2VsZWN0aW9uRGlhbG9nKCkgeworCQkJc3VwZXIoSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLnRoaXMuZ2V0U2hlbGxfKCksIGZhbHNlKTsKKwkJCXNldE1lc3NhZ2UoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX01lc3NhZ2UpOworCQkJc2V0VGl0bGUoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX1RpdGxlKTsKKwkJCXNldExpc3RMYWJlbFByb3ZpZGVyKGJ1aWxkTGFiZWxQcm92aWRlcigpKTsKKwkJCXNldERldGFpbHNMYWJlbFByb3ZpZGVyKGJ1aWxkTGFiZWxQcm92aWRlcigpKTsKKwkJfQorCisJCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7CisJCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJCQlyZXR1cm4gKGVsZW1lbnQgPT0gbnVsbCkgPyAiIiA6IGVsZW1lbnQudG9TdHJpbmcoKTsKKwkJCQl9CisJCQl9OworCQl9CisKKwkJLyoKKwkJICogKG5vbi1KYXZhZG9jKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUV4dGVuZGVkQ29udGVudEFyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQkvKgorCQkgKiAobm9uLUphdmFkb2MpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEl0ZW1zRmlsdGVyIGNyZWF0ZUZpbHRlcigpIHsKKwkJCXJldHVybiBuZXcgQ29ubmVjdGlvbkl0ZW1zRmlsdGVyKCk7CisJCX0KKworCQkvKgorCQkgKiAobm9uLUphdmFkb2MpCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRlbnRQcm92aWRlcihBYnN0cmFjdENvbnRlbnRQcm92aWRlciBwcm92aWRlciwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVtc0ZpbHRlciBpdGVtc0ZpbHRlciwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQkJbW9uaXRvci5iZWdpblRhc2sobnVsbCwgLTEpOworCisJCQl0cnkgeworCQkJCS8vIEFkZCB0aGUgY29ubmVjdGlvbiBuYW1lcyB0byB0aGUgZGlhbG9nCisJCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCQkJcHJvdmlkZXIuYWRkKHN0cmVhbS5uZXh0KCksIGl0ZW1zRmlsdGVyKTsKKwkJCQl9CisJCQl9CisJCQlmaW5hbGx5IHsKKwkJCQltb25pdG9yLmRvbmUoKTsKKwkJCX0KKwkJfQorCisJCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjb25uZWN0aW9uUHJvZmlsZU5hbWVzKCkgeworCQkJcmV0dXJuIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS50aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmNvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKTsKKwkJfQorCisJCS8qCisJCSAqIChub24tSmF2YWRvYykKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgeworCisJCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBKcHRVaVBsdWdpbi5pbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7CisJCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19TRVRUSU5HUyk7CisKKwkJCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7CisJCQkJc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncy5hZGROZXdTZWN0aW9uKERJQUxPR19TRVRUSU5HUyk7CisJCQl9CisKKwkJCXJldHVybiBzZXR0aW5nczsKKwkJfQorCisJCS8qCisJCSAqIChub24tSmF2YWRvYykKKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKKwkJfQorCisJCS8qCisJCSAqIChub24tSmF2YWRvYykKKwkJICovCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxTdHJpbmc+IGdldEl0ZW1zQ29tcGFyYXRvcigpIHsKKwkJCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgeworCQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgaXRlbTEsIFN0cmluZyBpdGVtMikgeworCQkJCQlyZXR1cm4gaXRlbTEuY29tcGFyZVRvKGl0ZW0yKTsKKwkJCQl9CisJCQl9OworCQl9CisKKwkJLyoKKwkJICogKG5vbi1KYXZhZG9jKQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlSXRlbShPYmplY3QgaXRlbSkgeworCisJCQlpZiAoaXRlbSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0VWlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiIiwgbnVsbCk7CisJCQl9CisKKwkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQl9CisKKwkJLyoqCisJCSAqIENyZWF0ZSB0aGUgZmlsdGVyIHJlc3BvbnNpYmxlIHRvIHJlbW92ZSBhbnkgY29ubmVjdGlvbiBuYW1lIGJhc2VkIG9uCisJCSAqIHRoZSBwYXR0ZXJuIGVudGVyZWQgaW4gdGhlIHRleHQgZmllbGQuCisJCSAqLworCQlwcml2YXRlIGNsYXNzIENvbm5lY3Rpb25JdGVtc0ZpbHRlciBleHRlbmRzIEl0ZW1zRmlsdGVyIHsKKworCQkJLyoqCisJCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbm5lY3Rpb25JdGVtc0ZpbHRlcjwvY29kZT4uCisJCQkgKi8KKwkJCUNvbm5lY3Rpb25JdGVtc0ZpbHRlcigpIHsKKworCQkJCXN1cGVyKCk7CisKKwkJCQkvLyBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgcGF0dGVybiBpcyBlbXB0eSwgd2Ugc3BlY2lmeSAqIGluIG9yZGVyCisJCQkJLy8gdG8gc2hvdyBhbGwgdGhlIG1hcHBpbmcgdHlwZXMKKwkJCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRQYXR0ZXJuKCkpKSB7CisJCQkJCXBhdHRlcm5NYXRjaGVyLnNldFBhdHRlcm4oIioiKTsKKwkJCQl9CisJCQl9CisKKwkJCS8qCisJCQkgKiAobm9uLUphdmFkb2MpCisJCQkgKi8KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gaXNDb25zaXN0ZW50SXRlbShPYmplY3QgaXRlbSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCisJCQkvKgorCQkJICogKG5vbi1KYXZhZG9jKQorCQkJICovCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIG1hdGNoSXRlbShPYmplY3QgaXRlbSkgeworCQkJCXJldHVybiBtYXRjaGVzKGl0ZW0udG9TdHJpbmcoKSk7CisJCQl9CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjRHJpdmVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNEcml2ZXJDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjExOTE4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjRHJpdmVyQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqICBKZGJjRHJpdmVyQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBKZGJjRHJpdmVyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDb25uZWN0aW9uPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RXZlbnRMaXN0ZW5lckNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEpkYmNEcml2ZXJDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgQ29ubmVjdGlvbj4gcGFyZW50UGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxDb25uZWN0aW9uPiBpbml0aWFsaXplQ2xhc3NDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8Q29ubmVjdGlvbj4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFN0cmluZz4oCisJCQkJCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uRFJJVkVSX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREcml2ZXIoKTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisKKwkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCQkJdmFsdWUgPSBudWxsOworCQkJCQkJfQorCQkJCQkJdGhpcy5zdWJqZWN0LnNldERyaXZlcih2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREcml2ZXIoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9kcml2ZXJMYWJlbDsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldERyaXZlcihjbGFzc05hbWUpOwkJCQkKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd1R5cGVDcmVhdGlvbigpIHsKKwkJCQkvL0RvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gYWxsb3cgdGhlIHVzZXIgdG8gY3JlYXRlIGEgbmV3IERyaXZlciBjbGFzcworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJdGhpcy5pbml0aWFsaXplQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYmU4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqICBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgSmRiY1Byb3BlcnRpZXNDb21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAorCWV4dGVuZHMgUGFuZTxUPgoreworCXB1YmxpYyBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZShQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSwgQm9vbGVhbj4oYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlID09IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTDsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4oCisJCQlidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLCAKKwkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwgCisJCQlQZXJzaXN0ZW5jZVVuaXQuREVGQVVMVF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUcmFuc2FjdGlvblR5cGUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBQZXJzaXN0ZW5jZVVuaXQ+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCQl9CisJCX07CisJCQorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWNvbnRhaW5lciA9IGFkZFRpdGxlZEdyb3VwKAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDEwKSwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5KZGJjUHJvcGVydGllc0NvbXBvc2l0ZV9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Qb29sX0dyb3VwQm94CisJCSk7CisKKwkJbmV3IEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOworCisJCWNvbnRhaW5lciA9IGFkZFBhbmUoY29udGFpbmVyLCBuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7CisKKwkJbmV3IEpkYmNSZWFkQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKKwkJbmV3IEpkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7CisKKwkJdGhpcy5pbnN0YWxsUGFuZUVuYWJsZXIoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKCkgeworCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpLCB0aGlzKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2M1ZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgSmRiY1JlYWRDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgSmRiY1JlYWRDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCisJZXh0ZW5kcyBQYW5lPFQ+Cit7CisJcHVibGljIEpkYmNSZWFkQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUoCisJCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLCAKKwkJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50LCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gdGhpcy5hZGRTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTZWN0aW9uVGl0bGUKKwkJKTsKKworCQlHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKSBjb250YWluZXIuZ2V0TGF5b3V0RGF0YSgpOworCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKKworCQlkYXRhID0gKEdyaWREYXRhKSBnZXRDb250cm9sKCkuZ2V0TGF5b3V0RGF0YSgpOworCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKKworCQkvLyBSZWFkIENvbm5lY3Rpb25zIFNoYXJlZAorCQluZXcgSmRiY1JlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOworCisJCS8vIFJlYWQgQ29ubmVjdGlvbnMgTWluaW11bQorCQluZXcgSmRiY1JlYWRDb25uZWN0aW9uc01pbkNvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOworCisJCS8vIFJlYWQgQ29ubmVjdGlvbnMgTWF4aW11bQorCQluZXcgSmRiY1JlYWRDb25uZWN0aW9uc01heENvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uc01heENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NjcwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSmRiY1JlYWRDb25uZWN0aW9uc01heENvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgSmRiY1JlYWRDb25uZWN0aW9uc01heENvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCisJZXh0ZW5kcyBQYW5lPFQ+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEpkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUoCisJCQkJCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLAorCQkJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWFkZFJlYWRDb25uZWN0aW9uc01heENvbWJvKGNvbnRhaW5lcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBhZGRSZWFkQ29ubmVjdGlvbnNNYXhDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBJbnRlZ2VyQ29tYm88Q29ubmVjdGlvbj4odGhpcywgY29udGFpbmVyKSB7CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zTWF4TGFiZWw7CisJCQl9CisJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKKwkJCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7CisJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc01heCgpOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7CisJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UmVhZENvbm5lY3Rpb25zTWF4KCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKKwkJCQkJCXRoaXMuc3ViamVjdC5zZXRSZWFkQ29ubmVjdGlvbnNNYXgodmFsdWUpOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zTWluQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjQzMzM2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zTWluQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEpkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEpkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAorCWV4dGVuZHMgUGFuZTxUPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmRiY1JlYWRDb25uZWN0aW9uc01pbkNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBKZGJjUmVhZENvbm5lY3Rpb25zTWluQ29tcG9zaXRlKAorCQkJCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLAorCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWFkZFJlYWRDb25uZWN0aW9uc01pbkNvbWJvKGNvbnRhaW5lcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBhZGRSZWFkQ29ubmVjdGlvbnNNaW5Db21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBJbnRlZ2VyQ29tYm88Q29ubmVjdGlvbj4odGhpcywgY29udGFpbmVyKSB7CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zTWluTGFiZWw7CisJCQl9CisJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKKwkJCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7CisJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc01pbigpOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7CisJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UmVhZENvbm5lY3Rpb25zTWluKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKKwkJCQkJCXRoaXMuc3ViamVjdC5zZXRSZWFkQ29ubmVjdGlvbnNNaW4odmFsdWUpOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmQ4YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBSZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEpkYmNSZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAorCWV4dGVuZHMgUGFuZTxUPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEpkYmNSZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGUoCisJCQkJCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLAorCQkJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2hhcmVkTGFiZWwsCisJCQl0aGlzLmJ1aWxkUmVhZENvbm5lY3Rpb25zU2hhcmVkSG9sZGVyKCksCisJCQl0aGlzLmJ1aWxkUmVhZENvbm5lY3Rpb25zU2hhcmVkU3RyaW5nSG9sZGVyKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgorCQkpOworCX0KKwkKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUmVhZENvbm5lY3Rpb25zU2hhcmVkSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWFkQ29ubmVjdGlvbnNTaGFyZWRTdHJpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRSZWFkQ29ubmVjdGlvbnNTaGFyZWRIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKKwkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2hhcmVkTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOworCQkJCX0KKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTaGFyZWRMYWJlbDsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0UmVhZENvbm5lY3Rpb25zU2hhcmVkSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCUNvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEwNjI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyoKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIEpkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEpkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKKwlleHRlbmRzIFBhbmU8VD4KK3sKKwlwdWJsaWMgSmRiY1dyaXRlQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUoCisJCQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsIAorCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWNvbnRhaW5lciA9IHRoaXMuYWRkU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfd3JpdGVDb25uZWN0aW9uc1NlY3Rpb25UaXRsZQorCQkpOworCisJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7CisJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOworCisJCWRhdGEgPSAoR3JpZERhdGEpIGdldENvbnRyb2woKS5nZXRMYXlvdXREYXRhKCk7CisJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOworCisJCS8vIFRoaXMgd2lsbCBhZGQgc3BhY2UgdG8gaGF2ZSB0aGUgc2FtZSBsYXlvdXQgdGhhbiByZWFkIGNvbm5lY3Rpb24gcG9vbAorCQlCdXR0b24gc3BhY2UgPSB0aGlzLmdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDaGVja0JveChjb250YWluZXIsICJtIik7CisJCVBvaW50IHNpemUgPSBzcGFjZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOworCQljb250YWluZXIgPSB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCBzaXplLnkgKyA1KTsKKwkJc3BhY2UuZGlzcG9zZSgpOworCisJCS8vIFdyaXRlIENvbm5lY3Rpb25zIE1pbmltdW0KKwkJbmV3IEpkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7CisKKwkJLy8gV3JpdGUgQ29ubmVjdGlvbnMgTWF4aW11bQorCQluZXcgSmRiY1dyaXRlQ29ubmVjdGlvbnNNYXhDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlYzczYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSmRiY1dyaXRlQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKKwlleHRlbmRzIFBhbmU8VD4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlKAorCQkJCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWFkZFdyaXRlQ29ubmVjdGlvbnNNYXhDb21ibyhjb250YWluZXIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgYWRkV3JpdGVDb25uZWN0aW9uc01heENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJbmV3IEludGVnZXJDb21ibzxDb25uZWN0aW9uPih0aGlzLCBjb250YWluZXIpIHsKKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zTWF4TGFiZWw7CisJCQl9CisJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKKwkJCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7CisJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNYXgoKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRXcml0ZUNvbm5lY3Rpb25zTWF4KCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKKwkJCQkJCXRoaXMuc3ViamVjdC5zZXRXcml0ZUNvbm5lY3Rpb25zTWF4KHZhbHVlKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjNjZTJkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uc01pbkNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5JbnRlZ2VyQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBKZGJjV3JpdGVDb25uZWN0aW9uc01pbkNvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAorCWV4dGVuZHMgUGFuZTxUPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUoCisJCQkJCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlhZGRXcml0ZUNvbm5lY3Rpb25zTWluQ29tYm8oY29udGFpbmVyKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZFdyaXRlQ29ubmVjdGlvbnNNaW5Db21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBJbnRlZ2VyQ29tYm88Q29ubmVjdGlvbj4odGhpcywgY29udGFpbmVyKSB7CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfd3JpdGVDb25uZWN0aW9uc01pbkxhYmVsOworCQkJfQorCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7CisJCQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWluKCk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0V3JpdGVDb25uZWN0aW9uc01pbigpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7CisJCQkJCQl0aGlzLnN1YmplY3Quc2V0V3JpdGVDb25uZWN0aW9uc01pbih2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL05hdGl2ZVNxbENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9OYXRpdmVTcWxDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2M3Mzk2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9OYXRpdmVTcWxDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIE5hdGl2ZVNxbENvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgTmF0aXZlU3FsQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKKwlleHRlbmRzIFBhbmU8VD4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5hdGl2ZVNxbENvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBOYXRpdmVTcWxDb21wb3NpdGUoCisJCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLAorCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25hdGl2ZVNxbExhYmVsLAorCQkJdGhpcy5idWlsZE5hdGl2ZVNxbEhvbGRlcigpLAorCQkJdGhpcy5idWlsZE5hdGl2ZVNxbFN0cmluZ0hvbGRlcigpLAorCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04KKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5hdGl2ZVNxbEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLk5BVElWRV9TUUxfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYXRpdmVTcWwoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXROYXRpdmVTcWwodmFsdWUpOworCQkJfQorCisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hdGl2ZVNxbFN0cmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdE5hdGl2ZVNxbEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9uYXRpdmVTcWxMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25hdGl2ZVNxbExhYmVsOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHROYXRpdmVTcWxIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEJvb2xlYW4+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJQ29ubmVjdGlvbi5OQVRJVkVfU1FMX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0TmF0aXZlU3FsKCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0TmF0aXZlU3FsKCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlNmZkYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWI8VCBleHRlbmRzIENvbm5lY3Rpb24+CisJZXh0ZW5kcyBGb3JtUGFuZTxUPgorCWltcGxlbWVudHMgSnBhUGFnZUNvbXBvc2l0ZQoreworCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKKwlwdWJsaWMgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiKAorCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLCAKKwkJCQlDb21wb3NpdGUgcGFyZW50LCAKKwkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBFY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKKwl9CisKKwkvLyAqKioqKioqKioqIEpwYVBhZ2VDb21wb3NpdGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7CisJCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTjsKKwl9CisKKwlwdWJsaWMgSW1hZ2UgZ2V0UGFnZUltYWdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl90aXRsZTsKKwl9CisKKwkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7CisJCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7CisJCWxheW91dC5tYXJnaW5SaWdodCA9IDA7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKKwkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYWRkUGFuZShwYXJlbnQsIGxheW91dCk7CisJCXRoaXMudXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKKwkJcmV0dXJuIGNvbnRhaW5lcjsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOworCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL1RyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9UcmFuc2FjdGlvblR5cGVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzE1ZTFiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9UcmFuc2FjdGlvblR5cGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4KKwlleHRlbmRzIEZvcm1QYW5lPFQ+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UcmFuc2FjdGlvblR5cGVDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlKAorCQkJCQlGb3JtUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsCisJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlciggcGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4gYWRkVHJhbnNhY3Rpb25UeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+KHRoaXMsIGJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCksIGNvbnRhaW5lcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbmNlVW5pdC5ERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVbXSBnZXRDaG9pY2VzKCkgeworCQkJCXJldHVybiBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUudmFsdWVzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0VHJhbnNhY3Rpb25UeXBlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgeworCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGUudGhpcywgdmFsdWUpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKHZhbHVlKTsKKworCQkJCWlmICh2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUwpIHsKKwkJCQkJY2xlYXJKVEFQcm9wZXJ0aWVzKCk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQljbGVhclJlc291cmNlTG9jYWxQcm9wZXJ0aWVzKCk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFBlcnNpc3RlbmNlVW5pdD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJCX0KKwkJfTsKKwkJCisJfQorCisJcHJpdmF0ZSB2b2lkIGNsZWFySlRBUHJvcGVydGllcygpIHsKKwkJZ2V0U3ViamVjdCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLnNldEp0YURhdGFTb3VyY2UobnVsbCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNsZWFyUmVzb3VyY2VMb2NhbFByb3BlcnRpZXMoKSB7CisJCUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldFN1YmplY3QoKTsKKwkJY29ubmVjdGlvbi5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXROb25KdGFEYXRhU291cmNlKG51bGwpOworCQljb25uZWN0aW9uLnNldERyaXZlcihudWxsKTsKKwkJY29ubmVjdGlvbi5zZXRVcmwobnVsbCk7CisJCWNvbm5lY3Rpb24uc2V0VXNlcihudWxsKTsKKwkJY29ubmVjdGlvbi5zZXRQYXNzd29yZChudWxsKTsKKwkJY29ubmVjdGlvbi5zZXRCaW5kUGFyYW1ldGVycyhudWxsKTsKKwkJY29ubmVjdGlvbi5zZXRXcml0ZUNvbm5lY3Rpb25zTWF4KG51bGwpOworCQljb25uZWN0aW9uLnNldFdyaXRlQ29ubmVjdGlvbnNNaW4obnVsbCk7CisJCWNvbm5lY3Rpb24uc2V0UmVhZENvbm5lY3Rpb25zTWF4KG51bGwpOworCQljb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc01pbihudWxsKTsKKwkJY29ubmVjdGlvbi5zZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQobnVsbCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dCggQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdHJhbnNhY3Rpb25UeXBlTGFiZWwsCisJCQl0aGlzLmFkZFRyYW5zYWN0aW9uVHlwZUNvbWJvKCBjb250YWluZXIpLAorCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04KKwkJKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0N1c3RvbWl6ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vQ3VzdG9taXplckNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzQ1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0N1c3RvbWl6ZXJDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIEN1c3RvbWl6ZXJDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbWl6ZXJDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVudGl0eT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkN1c3RvbWl6ZXJDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBDdXN0b21pemVyQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEVudGl0eT4gcGFyZW50UGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxFbnRpdHk+IGluaXRpYWxpemVDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxFbnRpdHk+KHRoaXMsIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIFN0cmluZz4oCisJCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIGdldFN1YmplY3RQYXJlbnQoKS5nZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGdldFN1YmplY3ROYW1lKCkpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKworCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJCQl9CisJCQkJCQlnZXRTdWJqZWN0UGFyZW50KCkuc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihnZXRTdWJqZWN0TmFtZSgpLCB2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0UGFyZW50KCkuZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihnZXRTdWJqZWN0TmFtZSgpKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9jdXN0b21pemVyTGFiZWw7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdFBhcmVudCgpLmdldEpwYVByb2plY3QoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworCQkJCWdldFN1YmplY3RQYXJlbnQoKS5zZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGdldFN1YmplY3ROYW1lKCksIGNsYXNzTmFtZSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlckludGVyZmFjZU5hbWUoKSB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ3VzdG9taXplci5FQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U3ViamVjdE5hbWUoKSB7CisJCXJldHVybiB0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5nZXRWYWx1ZSgpLmdldE5hbWUoKTsKKwl9CisJCisJcHJpdmF0ZSBDdXN0b21pemF0aW9uIGdldFN1YmplY3RQYXJlbnQoKSB7CisJCXJldHVybiB0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5nZXRWYWx1ZSgpLmdldFBhcmVudCgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQl0aGlzLmluaXRpYWxpemVDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWFlYTM4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyoKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOworCisvKioKKyAqICBQZXJzaXN0ZW5jZVVuaXRDdXN0b21pemF0aW9uQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxDdXN0b21pemF0aW9uPgoreworCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGUoRm9ybVBhbmU8Q3VzdG9taXphdGlvbj4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJU2VjdGlvbiBzZWN0aW9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTV1QuRkxBVCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTik7CisJCXNlY3Rpb24uc2V0VGV4dChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3NlY3Rpb25UaXRsZSk7CisJCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24pOworCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0aGlzLmFkZFN1YlBhbmUoc2VjdGlvbik7CisJCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7CisKKwkJLy8gRGVmYXVsdCBwYW5lCisJCWludCBncm91cEJveE1hcmdpbiA9IHRoaXMuZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKworCQlDb21wb3NpdGUgZGVmYXVsdFBhbmUgPSB0aGlzLmFkZFN1YlBhbmUoCisJCQljb21wb3NpdGUsCisJCQkwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4KKwkJKTsKKworCQkvLyBXZWF2aW5nCisJCW5ldyBXZWF2aW5nQ29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKKworCQkvLyBXZWF2aW5nIExhenkKKwkJbmV3IFdlYXZpbmdMYXp5Q29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKKworCQkvLyBXZWF2aW5nIEZldGNoIEdyb3VwcworCQluZXcgV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKKworCQkvLyBXZWF2aW5nIEludGVybmFsCisJCW5ldyBXZWF2aW5nSW50ZXJuYWxDb21wb3NpdGUodGhpcywgZGVmYXVsdFBhbmUpOworCisJCS8vIFdlYXZpbmcgRWFnZXIKKwkJbmV3IFdlYXZpbmdFYWdlckNvbXBvc2l0ZSh0aGlzLCBkZWZhdWx0UGFuZSk7CisKKwkJLy8gV2VhdmluZyBDaGFuZ2UgVHJhY2tpbmcKKwkJbmV3IFdlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSh0aGlzLCBkZWZhdWx0UGFuZSk7CisKKwkJLy8gVGhyb3cgRXhjZXB0aW9ucworCQluZXcgVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKKworCQkvLyBFeGNlcHRpb24gSGFuZGxlcgorCQluZXcgRXhjZXB0aW9uSGFuZGxlckNvbXBvc2l0ZSh0aGlzLCBkZWZhdWx0UGFuZSk7CisKKwkJLy8gU2Vzc2lvbiBDdXN0b21pemVyCisJCW5ldyBTZXNzaW9uQ3VzdG9taXplcnNDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKKworCQkvLyBFbnRpdGllc0xpc3QKKwkJbmV3IEVudGl0eUxpc3RDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKKworCQkvLyBWYWxpZGF0aW9uIE9ubHkKKwkJbmV3IFZhbGlkYXRpb25Pbmx5Q29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7CisKKwkJLy8gUHJvZmlsZXI6CisJCW5ldyBQcm9maWxlckNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGI5NDRmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBFbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEVudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RW50aXR5PiB7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlKFBhbmU8Q3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eT4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJLy8gQ3VzdG9taXplcgorCQluZXcgQ3VzdG9taXplckNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCQkKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VudGl0eUxpc3RDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRW50aXR5TGlzdENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MzljZWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VudGl0eUxpc3RDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDIyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuSnB0RWNsaXBzZUxpbmtVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7CisKKy8qKgorICogIEVudGl0eUxpc3RDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEVudGl0eUxpc3RDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Cit7CisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+IGVudGl0eUhvbGRlcjsKKworCXB1YmxpYyBFbnRpdHlMaXN0Q29tcG9zaXRlKFBhbmU8Q3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLCBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCXN1cGVyLmluaXRpYWxpemUoKTsKKwkJdGhpcy5lbnRpdHlIb2xkZXIgPSB0aGlzLmJ1aWxkRW50aXR5SG9sZGVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gdGhpcy5hZGRUaXRsZWRHcm91cCgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9ncm91cFRpdGxlCisJCSk7CisKKwkJLy8gRW50aXRpZXMgYWRkL3JlbW92ZSBsaXN0IHBhbmUKKwkJbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEN1c3RvbWl6YXRpb24+KAorCQkJdGhpcywKKwkJCWNvbnRhaW5lciwKKwkJCXRoaXMuYnVpbGRFbnRpdGllc0FkYXB0ZXIoKSwKKwkJCXRoaXMuYnVpbGRFbnRpdGllc0xpc3RIb2xkZXIoKSwKKwkJCXRoaXMuZW50aXR5SG9sZGVyLAorCQkJdGhpcy5idWlsZEVudGl0eUxhYmVsUHJvdmlkZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgorCQkpOworCisJCS8vIEVudGl0eSBDdXN0b21pemF0aW9uIHByb3BlcnR5IHBhbmUKKwkJRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlIHBhbmUgPSBuZXcgRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlKAorCQkJdGhpcywKKwkJCXRoaXMuZW50aXR5SG9sZGVyLAorCQkJY29udGFpbmVyCisJCSk7CisJCXRoaXMuaW5zdGFsbFBhbmVFbmFibGVyKHRoaXMuZW50aXR5SG9sZGVyLCBwYW5lKTsKKwl9CisKKwlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lLkFkYXB0ZXIgYnVpbGRFbnRpdGllc0FkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7CisJCQkJRW50aXR5TGlzdENvbXBvc2l0ZS50aGlzLmFkZEVudGl0aWVzKGxpc3RTZWxlY3Rpb25Nb2RlbCk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCQkJCUN1c3RvbWl6YXRpb24gY3VzdG9taXphdGlvbiA9IGdldFN1YmplY3QoKTsKKwkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKKwkJCQkJRW50aXR5IGVudGl0eUN1c3RvbWl6YXRpb24gPSAoRW50aXR5KSBpdGVtOworCQkJCQljdXN0b21pemF0aW9uLnJlbW92ZUVudGl0eShlbnRpdHlDdXN0b21pemF0aW9uLmdldE5hbWUoKSk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIHZvaWQgYWRkRW50aXRpZXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCisJCUlUeXBlIHR5cGUgPSB0aGlzLmNob29zZUVudGl0eSgpOworCisJCWlmICh0eXBlICE9IG51bGwpIHsKKwkJCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5nZXRFbnRpdHlOYW1lKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOworCQkJaWYgKGVudGl0eU5hbWUgPT0gbnVsbCkgeworCQkJCWVudGl0eU5hbWUgPSB0eXBlLmdldEVsZW1lbnROYW1lKCk7CisJCQl9CisJCQkKKwkJCWlmKCAhIHRoaXMuZ2V0U3ViamVjdCgpLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgeworCQkJCXRoaXMuZ2V0U3ViamVjdCgpLmFkZEVudGl0eShlbnRpdHlOYW1lKTsKKwkJCQlpbnQgaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZih0aGlzLmdldFN1YmplY3QoKS5lbnRpdGllcygpLCBlbnRpdHlOYW1lKTsKKwkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgbGlzdFNlbGVjdGlvbk1vZGVsLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpbmRleCk7CisJCQkJdGhpcy5lbnRpdHlIb2xkZXIuc2V0VmFsdWUoZW50aXR5KTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIFN0cmluZyBnZXRFbnRpdHlOYW1lKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7CisKKwkJb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHkgZW50aXR5ID0gZ2V0U3ViamVjdCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKKwkJcmV0dXJuIGVudGl0eSAhPSBudWxsID8gZW50aXR5LmdldE5hbWUoKSA6IG51bGw7CisJfQorCQorCXByaXZhdGUgSVR5cGUgY2hvb3NlRW50aXR5KCkgeworCisJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7CisJCWlmIChyb290ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtdIHsgcm9vdC5nZXRKYXZhUHJvamVjdCgpIH07CisJCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKKwkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKKwkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7CisKKwkJdHJ5IHsKKwkJCXR5cGVTZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKKwkJCQlnZXRTaGVsbCgpLAorCQkJCXNlcnZpY2UsCisJCQkJc2NvcGUsCisJCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsCisJCQkJZmFsc2UsCisJCQkJIiIKKwkJCSk7CisJCX0KKwkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlKcHRFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ1RpdGxlKTsKKwkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlKTsKKworCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7CisJCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpIHsKKwkJSVByb2plY3QgcHJvamVjdCA9IGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOworCQlJSmF2YVByb2plY3Qgcm9vdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKKworCQl0cnkgeworCQkJcmV0dXJuIHJvb3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKKwkJfQorCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCUpwdEVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRFbnRpdHlMYWJlbFByb3ZpZGVyKCkgeworCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJCUVudGl0eSBlbnRpdHlDdXN0b21pemF0aW9uID0gKEVudGl0eSkgZWxlbWVudDsKKwkJCQlyZXR1cm4gZW50aXR5Q3VzdG9taXphdGlvbi5nZXROYW1lKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+IGJ1aWxkRW50aXR5SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+KCk7CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFbnRpdHk+IGJ1aWxkRW50aXRpZXNMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEVudGl0eT4oCisJCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uRU5USVRJRVNfTElTVCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEVudGl0eT4gbGlzdEl0ZXJhdG9yXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmVudGl0aWVzKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5lbnRpdGllc1NpemUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eT4gZW50aXR5SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlIHBhbmUpIHsKKworCQluZXcgUGFuZUVuYWJsZXIoCisJCQl0aGlzLmJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoZW50aXR5SG9sZGVyKSwKKwkJCXBhbmUKKwkJKTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eT4gZW50aXR5SG9sZGVyKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5LCBCb29sZWFuPihlbnRpdHlIb2xkZXIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhFbnRpdHkgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZW50aXR5TmFtZUlzVmFsaWQoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0V4Y2VwdGlvbkhhbmRsZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRXhjZXB0aW9uSGFuZGxlckNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MGQ5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0V4Y2VwdGlvbkhhbmRsZXJDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIEV4Y2VwdGlvbkhhbmRsZXJDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEV4Y2VwdGlvbkhhbmRsZXJDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FeGNlcHRpb25IYW5kbGVyQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRXhjZXB0aW9uSGFuZGxlckNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRQYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCisJcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEN1c3RvbWl6YXRpb24+IGluaXRpYWxpemVDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxDdXN0b21pemF0aW9uPih0aGlzLCBjb250YWluZXIpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7CisJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgU3RyaW5nPigKKwkJCQkJCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5FWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXhjZXB0aW9uSGFuZGxlcigpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKworCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJCQl9CisJCQkJCQl0aGlzLnN1YmplY3Quc2V0RXhjZXB0aW9uSGFuZGxlcih2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRFeGNlcHRpb25IYW5kbGVyKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfZXhjZXB0aW9uSGFuZGxlckxhYmVsOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRFeGNlcHRpb25IYW5kbGVyKGNsYXNzTmFtZSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlckludGVyZmFjZU5hbWUoKSB7CisJCQkJcmV0dXJuIEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVJfQ0xBU1NfTkFNRTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJdGhpcy5pbml0aWFsaXplQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M3OTkxYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYkl0ZW0KKyAqLworcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYiAKKwkJCQkJCQkJZXh0ZW5kcyBGb3JtUGFuZTxDdXN0b21pemF0aW9uPgorCQkJCQkJCQlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKK3sKKwlwdWJsaWMgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCQorCQluZXcgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCisJLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DVVNUT01JWkFUSU9OOworCX0KKworCXB1YmxpYyBJbWFnZSBnZXRQYWdlSW1hZ2UoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aXRsZTsKKwl9CisKKwkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7CisJCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7CisJCWxheW91dC5tYXJnaW5SaWdodCA9IDA7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKKwkJCisJCUNvbXBvc2l0ZSBjb250YWluZXIgPSBhZGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKKwkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKKwkJCisJCXJldHVybiBjb250YWluZXI7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Byb2ZpbGVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Byb2ZpbGVyQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0ZGQxZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUHJvZmlsZXJDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOworCitpbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLlByb2ZpbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyQ29tYm9QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgUHJvZmlsZXJDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFByb2ZpbGVyQ29tcG9zaXRlIGV4dGVuZHMgQ2xhc3NDaG9vc2VyQ29tYm9QYW5lPEN1c3RvbWl6YXRpb24+Cit7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByb2ZpbGVyQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBQcm9maWxlckNvbXBvc2l0ZSgKKwkJCQkJCQkJUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKwkJcmV0dXJuIFByb2ZpbGVyLmdldFByb2ZpbGVyQ2xhc3NOYW1lKHRoaXMuZ2V0U3ViamVjdCgpLmdldFByb2ZpbGVyKCkpOworCX0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgeworICAgIAlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9wcm9maWxlckxhYmVsOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgeworICAgIAlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLlBST0ZJTEVSX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisKKwkJCQlTdHJpbmcgbmFtZSA9IHRoaXMuc3ViamVjdC5nZXRQcm9maWxlcigpOworCQkJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCQkJbmFtZSA9IFByb2ZpbGVyQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCk7CisJCQkJfQorCQkJCXJldHVybiBuYW1lOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKworCQkJCWlmIChnZXREZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5zdWJqZWN0LnNldFByb2ZpbGVyKHZhbHVlKTsKKwkJCX0KKwkJfTsKKyAgICB9CisgICAgCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRQcm9maWxlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5ERUZBVUxUX1BST0ZJTEVSKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIFByb2ZpbGVyQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFByb2ZpbGVyTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAorCQkJdGhpcy5idWlsZERlZmF1bHRQcm9maWxlckhvbGRlcigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGREaXNwbGF5U3RyaW5nKFN0cmluZyBwcm9maWxlck5hbWUpIHsKKworCQlzd2l0Y2ggKFByb2ZpbGVyLnZhbHVlT2YocHJvZmlsZXJOYW1lKSkgeworCQkJY2FzZSBub19wcm9maWxlcjogeworCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUHJvZmlsZXJDb21wb3NpdGVfbm9fcHJvZmlsZXI7CisJCQl9CisJCQljYXNlIHBlcmZvcm1hbmNlX3Byb2ZpbGVyOiB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Qcm9maWxlckNvbXBvc2l0ZV9wZXJmb3JtYW5jZV9wcm9maWxlcjsKKwkJCX0KKwkJCWNhc2UgcXVlcnlfbW9uaXRvcjogeworCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUHJvZmlsZXJDb21wb3NpdGVfcXVlcnlfbW9uaXRvcjsKKwkJCX0KKwkJCWRlZmF1bHQ6IHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkUHJvZmlsZXJDb21wYXJhdG9yKCkgeworCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgcHJvZmlsZXIxLCBTdHJpbmcgcHJvZmlsZXIyKSB7CisJCQkJcHJvZmlsZXIxID0gYnVpbGREaXNwbGF5U3RyaW5nKHByb2ZpbGVyMSk7CisJCQkJcHJvZmlsZXIyID0gYnVpbGREaXNwbGF5U3RyaW5nKHByb2ZpbGVyMik7CisJCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShwcm9maWxlcjEsIHByb2ZpbGVyMik7CisJCQl9CisJCX07CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkQ2xhc3NDb252ZXJ0ZXIoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7CisJCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKKwkJCQl0cnkgeworCQkJCQlQcm9maWxlci52YWx1ZU9mKHZhbHVlKTsKKwkJCQkJdmFsdWUgPSBidWlsZERpc3BsYXlTdHJpbmcodmFsdWUpOworCQkJCX0KKwkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gSWdub3JlIHNpbmNlIHRoZSB2YWx1ZSBpcyBub3QgYSBQcm9maWxlcgorCQkJCX0KKwkJCQlyZXR1cm4gdmFsdWU7CisJCQl9CisJCX07CisJfQorCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENsYXNzTGlzdEhvbGRlcigpIHsKKwkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOworCQlob2xkZXJzLmFkZCh0aGlzLmJ1aWxkRGVmYXVsdFByb2ZpbGVyTGlzdEhvbGRlcigpKTsKKwkJaG9sZGVycy5hZGQodGhpcy5idWlsZFByb2ZpbGVyc0xpc3RIb2xkZXIoKSk7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihob2xkZXJzKTsKKwl9CisKKwlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRQcm9maWxlcnMoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxQcm9maWxlciwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoUHJvZmlsZXIudmFsdWVzKCkpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFByb2ZpbGVyIG5leHQpIHsKKwkJCQlyZXR1cm4gbmV4dC5uYW1lKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJvZmlsZXJzQ29sbGVjdGlvbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAorCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFByb2ZpbGVycygpKQorCQkpOworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByb2ZpbGVyc0xpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCisJCQl0aGlzLmJ1aWxkUHJvZmlsZXJzQ29sbGVjdGlvbkhvbGRlcigpLAorCQkJdGhpcy5idWlsZFByb2ZpbGVyQ29tcGFyYXRvcigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKEN1c3RvbWl6YXRpb24gc3ViamVjdCkgeworCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0UHJvZmlsZXIoKTsKKworCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKKwkJCXJldHVybiBOTFMuYmluZCgKKwkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCisJCQkJZGVmYXVsdFZhbHVlCisJCQkpOworCQl9CisJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2RlZmF1bHRFbXB0eTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0UHJvZmlsZXIoY2xhc3NOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlckludGVyZmFjZU5hbWUoKSB7CisJCXJldHVybiBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1NFU1NJT05fUFJPRklMRVJfQ0xBU1NfTkFNRTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9TZXNzaW9uQ3VzdG9taXplcnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vU2Vzc2lvbkN1c3RvbWl6ZXJzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlMzkwMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vU2Vzc2lvbkN1c3RvbWl6ZXJzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5KcHRFY2xpcHNlTGlua1VpUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7CisKKy8qKgorICogIFNlc3Npb25DdXN0b21pemVyc0NvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgU2Vzc2lvbkN1c3RvbWl6ZXJzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vzc2lvbkN1c3RvbWl6ZXJDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBTZXNzaW9uQ3VzdG9taXplcnNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50UGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCisJcHJpdmF0ZSB2b2lkIGFkZFNlc3Npb25DdXN0b21pemVyQ2xhc3MoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCisJCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7CisKKwkJaWYgKHR5cGUgIT0gbnVsbCkgeworCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJyk7CisJCQlpZiggISB0aGlzLmdldFN1YmplY3QoKS5zZXNzaW9uQ3VzdG9taXplckV4aXN0cyhjbGFzc05hbWUpKSB7CisJCQkJCisJCQkJU3RyaW5nIGNsYXNzUmVmID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkU2Vzc2lvbkN1c3RvbWl6ZXIoY2xhc3NOYW1lKTsKKwkJCQlsaXN0U2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShjbGFzc1JlZik7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIEFkYXB0ZXIgYnVpbGRBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCQkJCWFkZFNlc3Npb25DdXN0b21pemVyQ2xhc3MobGlzdFNlbGVjdGlvbk1vZGVsKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7CisJCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7CisJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVTZXNzaW9uQ3VzdG9taXplcigoU3RyaW5nKSBpdGVtKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVsZW1lbnQ7CisKKwkJCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQkJCW5hbWUgPSBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX25vTmFtZTsKKwkJCQl9CisJCQkJcmV0dXJuIG5hbWU7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfTElTVCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKKwkJCQlyZXR1cm4gc3ViamVjdC5zZXNzaW9uQ3VzdG9taXplcnMoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LnNlc3Npb25DdXN0b21pemVyc1NpemUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKKwl9CisKKwkvKioKKwkgKiBQcm9tcHRzIHRoZSB1c2VyIHRoZSBPcGVuIFR5cGUgZGlhbG9nLgorCSAqCisJICogQHJldHVybiBFaXRoZXIgdGhlIHNlbGVjdGVkIHR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHVzZXIKKwkgKiBjYW5jZWxsZWQgdGhlIGRpYWxvZworCSAqLworCXByaXZhdGUgSVR5cGUgY2hvb3NlVHlwZSgpIHsKKworCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcGFja2FnZUZyYWdtZW50Um9vdCgpOworCisJCWlmIChyb290ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W10geyByb290LmdldEphdmFQcm9qZWN0KCkgfTsKKwkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOworCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOworCQlTZWxlY3Rpb25EaWFsb2cgdHlwZVNlbGVjdGlvbkRpYWxvZzsKKworCQl0cnkgeworCQkJdHlwZVNlbGVjdGlvbkRpYWxvZyA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKAorCQkJCWdldFNoZWxsKCksCisJCQkJc2VydmljZSwKKwkJCQlzY29wZSwKKwkJCQlJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywKKwkJCQlmYWxzZSwKKwkJCQkiIgorCQkJKTsKKwkJfQorCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCUpwdEVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGUpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEpwdFVpTWVzc2FnZXMuQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZSk7CisJCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShKcHRVaU1lc3NhZ2VzLkNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZSk7CisKKwkJaWYgKHR5cGVTZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgeworCQkJcmV0dXJuIChJVHlwZSkgdHlwZVNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXTsKKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQkvLyBEZXNjcmlwdGlvbgorCQljb250YWluZXIgPSBhZGRUaXRsZWRHcm91cCgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfc2Vzc2lvbkN1c3RvbWl6ZXJMYWJlbAorCQkpOworCisJCS8vIExpc3QgcGFuZQorCQluZXcgQWRkUmVtb3ZlTGlzdFBhbmU8Q3VzdG9taXphdGlvbj4oCisJCQl0aGlzLAorCQkJY29udGFpbmVyLAorCQkJYnVpbGRBZGFwdGVyKCksCisJCQlidWlsZExpc3RIb2xkZXIoKSwKKwkJCWJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCksCisJCQlidWlsZExhYmVsUHJvdmlkZXIoKQorCQkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlKFRhYmxlIHRhYmxlKSB7CisJCQkJc3VwZXIuaW5pdGlhbGl6ZVRhYmxlKHRhYmxlKTsKKworCQkJCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0YWJsZS5nZXRQYXJlbnQoKTsKKwkJCQlHcmlkRGF0YSBncmlkRGF0YSAgID0gKEdyaWREYXRhKSBjb250YWluZXIuZ2V0TGF5b3V0RGF0YSgpOworCQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA3NTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QoKSB7CisJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKKwkJSUphdmFQcm9qZWN0IHJvb3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CisKKwkJdHJ5IHsKKwkJCXJldHVybiByb290LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07CisJCX0KKwkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlKcHRFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhlKTsKKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9UaHJvd0V4Y2VwdGlvbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwMzNjOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaHJvd0V4Y2VwdGlvbnNDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFRocm93RXhjZXB0aW9uc0NvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEN1c3RvbWl6YXRpb24+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UaHJvd0V4Y2VwdGlvbnNDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlKAorCQkJCQlGb3JtUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAorCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbCwKKwkJCXRoaXMuYnVpbGRUaHJvd0V4Y2VwdGlvbnNIb2xkZXIoKSwKKwkJCXRoaXMuYnVpbGRUaHJvd0V4Y2VwdGlvbnNTdHJpbmdIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgorCQkpOworCX0KKwkKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGhyb3dFeGNlcHRpb25zSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFRocm93RXhjZXB0aW9ucygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldFRocm93RXhjZXB0aW9ucyh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRocm93RXhjZXB0aW9uc1N0cmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFRocm93RXhjZXB0aW9uc0hvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7CisJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGhyb3dFeGNlcHRpb25zTGFiZWw7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFRocm93RXhjZXB0aW9uc0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlDdXN0b21pemF0aW9uLlRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRUaHJvd0V4Y2VwdGlvbnMoKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRUaHJvd0V4Y2VwdGlvbnMoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1ZhbGlkYXRpb25Pbmx5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1ZhbGlkYXRpb25Pbmx5Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkNWRkZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vVmFsaWRhdGlvbk9ubHlDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFZhbGlkYXRpb25Pbmx5Q29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBWYWxpZGF0aW9uT25seUNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEN1c3RvbWl6YXRpb24+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW9uT25seUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBWYWxpZGF0aW9uT25seUNvbXBvc2l0ZSgKKwkJCQkJRm9ybVBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudENvbXBvc2l0ZSwKKwkJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdmFsaWRhdGlvbk9ubHlMYWJlbCwKKwkJCXRoaXMuYnVpbGRWYWxpZGF0aW9uT25seUhvbGRlcigpLAorCQkJdGhpcy5idWlsZFZhbGlkYXRpb25Pbmx5U3RyaW5nSG9sZGVyKCksCisJCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NVU1RPTUlaQVRJT04KKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFZhbGlkYXRpb25Pbmx5SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uVkFMSURBVElPTl9PTkxZX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VmFsaWRhdGlvbk9ubHkoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRWYWxpZGF0aW9uT25seSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFZhbGlkYXRpb25Pbmx5U3RyaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0VmFsaWRhdGlvbk9ubHlIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0aW9uT25seUxhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdmFsaWRhdGlvbk9ubHlMYWJlbDsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0VmFsaWRhdGlvbk9ubHlIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJQ3VzdG9taXphdGlvbi5WQUxJREFUSU9OX09OTFlfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRWYWxpZGF0aW9uT25seSgpICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFZhbGlkYXRpb25Pbmx5KCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRlNGFjZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBXZWF2aW5nQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFdlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEN1c3RvbWl6YXRpb24+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlKAorCQkJCQlGb3JtUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAorCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nQ2hhbmdlVHJhY2tpbmdMYWJlbCwKKwkJCXRoaXMuYnVpbGRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSwKKwkJCXRoaXMuYnVpbGRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdTdHJpbmdIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgorCQkpOworCX0KKwkKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkV2VhdmluZ0NoYW5nZVRyYWNraW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdTdHJpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nQ2hhbmdlVHJhY2tpbmdMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdDaGFuZ2VUcmFja2luZ0xhYmVsOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJQ3VzdG9taXphdGlvbi5XRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFdlYXZpbmdDaGFuZ2VUcmFja2luZygpICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFdlYXZpbmdDaGFuZ2VUcmFja2luZygpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxNDA2ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uV2VhdmluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFdlYXZpbmdDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFdlYXZpbmdDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxDdXN0b21pemF0aW9uPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+V2VhdmluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICogCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgV2VhdmluZ0NvbXBvc2l0ZSgKKwkJCQkJRm9ybVBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudENvbXBvc2l0ZSwgCisJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlciggcGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxDdXN0b21pemF0aW9uLCBXZWF2aW5nPiBhZGRXZWF2aW5nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q3VzdG9taXphdGlvbiwgV2VhdmluZz4odGhpcywgY29udGFpbmVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKEN1c3RvbWl6YXRpb24uV0VBVklOR19QUk9QRVJUWSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdlYXZpbmdbXSBnZXRDaG9pY2VzKCkgeworCQkJCXJldHVybiBXZWF2aW5nLnZhbHVlcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBXZWF2aW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRXZWF2aW5nKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKFdlYXZpbmcgdmFsdWUpIHsKKwkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgV2VhdmluZ0NvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdlYXZpbmcgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRXZWF2aW5nKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoV2VhdmluZyB2YWx1ZSkgeworCQkJCWdldFN1YmplY3QoKS5zZXRXZWF2aW5nKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dCggQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhYmVsLAorCQkJdGhpcy5hZGRXZWF2aW5nQ29tYm8oIGNvbnRhaW5lciksCisJCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NVU1RPTUlaQVRJT04KKwkJKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0VhZ2VyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdFYWdlckNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOGMxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdFYWdlckNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogV2VhdmluZ0VhZ2VyQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBXZWF2aW5nRWFnZXJDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxDdXN0b21pemF0aW9uPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+V2VhdmluZ0VhZ2VyQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIFdlYXZpbmdFYWdlckNvbXBvc2l0ZSgKKwkJCQkJRm9ybVBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudENvbXBvc2l0ZSwKKwkJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0VhZ2VyTGFiZWwsCisJCQl0aGlzLmJ1aWxkV2VhdmluZ0VhZ2VySG9sZGVyKCksCisJCQl0aGlzLmJ1aWxkV2VhdmluZ0VhZ2VyU3RyaW5nSG9sZGVyKCksCisJCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NVU1RPTUlaQVRJT04KKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFdlYXZpbmdFYWdlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLldFQVZJTkdfRUFHRVJfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nRWFnZXIoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRXZWF2aW5nRWFnZXIodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRXZWF2aW5nRWFnZXJTdHJpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRXZWF2aW5nRWFnZXJIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRWFnZXJMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdFYWdlckxhYmVsOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRXZWF2aW5nRWFnZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJQ3VzdG9taXphdGlvbi5XRUFWSU5HX0VBR0VSX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0V2VhdmluZ0VhZ2VyKCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0V2VhdmluZ0VhZ2VyKCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nRmV0Y2hHcm91cHNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkMjExYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBXZWF2aW5nRmV0Y2hHcm91cHNDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFdlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEN1c3RvbWl6YXRpb24+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nRmV0Y2hHcm91cHNDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlKAorCQkJCQlGb3JtUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAorCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRmV0Y2hHcm91cHNMYWJlbCwKKwkJCXRoaXMuYnVpbGRXZWF2aW5nRmV0Y2hHcm91cHNIb2xkZXIoKSwKKwkJCXRoaXMuYnVpbGRXZWF2aW5nRmV0Y2hHcm91cHNTdHJpbmdIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgorCQkpOworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRXZWF2aW5nRmV0Y2hHcm91cHNIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5XRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFdlYXZpbmdGZXRjaEdyb3VwcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldFdlYXZpbmdGZXRjaEdyb3Vwcyh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFdlYXZpbmdGZXRjaEdyb3Vwc1N0cmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFdlYXZpbmdGZXRjaEdyb3Vwc0hvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7CisJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ZldGNoR3JvdXBzTGFiZWw7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFdlYXZpbmdGZXRjaEdyb3Vwc0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlDdXN0b21pemF0aW9uLldFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0V2VhdmluZ0ZldGNoR3JvdXBzKCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0V2VhdmluZ0ZldGNoR3JvdXBzKCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nSW50ZXJuYWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0ludGVybmFsQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjM2Q3MQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0ludGVybmFsQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBXZWF2aW5nSW50ZXJuYWxDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFdlYXZpbmdJbnRlcm5hbENvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEN1c3RvbWl6YXRpb24+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nSW50ZXJuYWxDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgV2VhdmluZ0ludGVybmFsQ29tcG9zaXRlKAorCQkJCQlGb3JtUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAorCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nSW50ZXJuYWxMYWJlbCwKKwkJCXRoaXMuYnVpbGRXZWF2aW5nSW50ZXJuYWxIb2xkZXIoKSwKKwkJCXRoaXMuYnVpbGRXZWF2aW5nSW50ZXJuYWxTdHJpbmdIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgorCQkpOworCX0KKwkKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkV2VhdmluZ0ludGVybmFsSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFdlYXZpbmdJbnRlcm5hbCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldFdlYXZpbmdJbnRlcm5hbCh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFdlYXZpbmdJbnRlcm5hbFN0cmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFdlYXZpbmdJbnRlcm5hbEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7CisJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdJbnRlcm5hbExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ludGVybmFsTGFiZWw7CisJCQl9CisJCX07CisJfQorCQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFdlYXZpbmdJbnRlcm5hbEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlDdXN0b21pemF0aW9uLldFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nSW50ZXJuYWwoKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRXZWF2aW5nSW50ZXJuYWwoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdMYXp5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdMYXp5Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5ZGIyOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0xhenlDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFdlYXZpbmdMYXp5Q29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBXZWF2aW5nTGF6eUNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEN1c3RvbWl6YXRpb24+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nTGF6eUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBXZWF2aW5nTGF6eUNvbXBvc2l0ZSgKKwkJCQkJRm9ybVBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudENvbXBvc2l0ZSwKKwkJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbCwKKwkJCXRoaXMuYnVpbGRXZWF2aW5nTGF6eUhvbGRlcigpLAorCQkJdGhpcy5idWlsZFdlYXZpbmdMYXp5U3RyaW5nSG9sZGVyKCksCisJCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NVU1RPTUlaQVRJT04KKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFdlYXZpbmdMYXp5SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uV0VBVklOR19MQVpZX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0V2VhdmluZ0xhenkoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRXZWF2aW5nTGF6eSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFdlYXZpbmdMYXp5U3RyaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0V2VhdmluZ0xhenlIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbDsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0V2VhdmluZ0xhenlIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJQ3VzdG9taXphdGlvbi5XRUFWSU5HX0xBWllfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nTGF6eSgpICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFdlYXZpbmdMYXp5KCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5MWNhMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZ2VuZXJhbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlCisJZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlCit7CisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgorCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCisJCQkJCUNvbXBvc2l0ZSBjb250YWluZXIsCisJCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIsIHdpZGdldEZhY3RvcnkpOworCX0KKworCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQl0aGlzLmluaXRpYWxpemVHZW5lcmFsUGFuZShjb250YWluZXIpOworCQl0aGlzLmluaXRpYWxpemVNYXBwZWRDbGFzc2VzUGFuZShjb250YWluZXIpOworCQl0aGlzLmluaXRpYWxpemVKUEFNYXBwaW5nRGVzY3JpcHRvcnNQYW5lKGNvbnRhaW5lcik7CisJCXRoaXMuaW5pdGlhbGl6ZUphckZpbGVzUGFuZShjb250YWluZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSlBBTWFwcGluZ0Rlc2NyaXB0b3JzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfanBhTWFwcGluZ0Rlc2NyaXB0b3JzLAorCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfanBhTWFwcGluZ0Rlc2NyaXB0b3JzX2Rlc2NyaXB0aW9uCisJCSk7CisKKwkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKKwkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyLmdldFBhcmVudCgpKTsKKworCQluZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUphckZpbGVzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfamFyRmlsZXMKKwkJKTsKKwkJCisJCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7CisJCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lci5nZXRQYXJlbnQoKSk7CisJCQorCQluZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDk2NzgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZ2VuZXJhbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2cuRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZQorCWV4dGVuZHMgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUKK3sKKwlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZSgKKwkJCVBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yIGJ1aWxkSmFyRmlsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0RlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcigpOworCX0KKwkKKwkKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBFY2xpcHNlTGlua0RlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcgorCQlleHRlbmRzIEFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nLk1vZHVsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcgorCXsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlRGVwbG95bWVudFBhdGgoSUZpbGUgZmlsZSkgeworCQkJU3RyaW5nIGJhc2VEZXBsb3ltZW50UGF0aCA9IHN1cGVyLmNhbGN1bGF0ZURlcGxveW1lbnRQYXRoKGZpbGUpOworCQkJaWYgKEpwdENvcmVQbHVnaW4ucHJvamVjdEhhc1dlYkZhY2V0KGZpbGUuZ2V0UHJvamVjdCgpKSkgeworCQkJCXJldHVybiAiLi4vIiArIGJhc2VEZXBsb3ltZW50UGF0aDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJldHVybiBiYXNlRGVwbG95bWVudFBhdGg7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwMjhkMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5nZW5lcmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsLkdlbmVyYWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBQZXJzaXN0ZW5jZVVuaXQKKyAqIEBzZWUgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCisgKiBAc2VlIEFkZFJlbW92ZUxpc3RQYW5lCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZSBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0PiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCXRoaXMuYWRkTWFwcGluZ0ZpbGVzTGlzdChjb250YWluZXIpOworCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZUVjbGlwc2VsaW5rT3JtLAorCQkJdGhpcy5idWlsZEV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlcigpLAorCQkJdGhpcy5idWlsZEV4Y2x1ZGVFY2xpcHNlbGlua09ybVN0cmluZ0hvbGRlcigpLAorCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0dFTkVSQUwKKwkJKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmFsUHJvcGVydGllcz4gYnVpbGRHZW5lcmFsUHJvcGVydGllc0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQsIEdlbmVyYWxQcm9wZXJ0aWVzPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEdlbmVyYWxQcm9wZXJ0aWVzIHRyYW5zZm9ybV8oUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCkgeworCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBwZXJzaXN0ZW5jZVVuaXQpLmdldEdlbmVyYWxQcm9wZXJ0aWVzKCk7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFeGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYWxQcm9wZXJ0aWVzLCBCb29sZWFuPigKKwkJCWJ1aWxkR2VuZXJhbFByb3BlcnRpZXNIb2xkZXIoKSwKKwkJCUdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRXhjbHVkZUVjbGlwc2VsaW5rT3JtU3RyaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0RXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKKwkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZUVjbGlwc2VsaW5rT3JtV2l0aERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2V4Y2x1ZGVFY2xpcHNlbGlua09ybTsKKwkJCX0KKwkJfTsKKwl9CQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdEV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhbFByb3BlcnRpZXMsIEJvb2xlYW4+KAorCQkJYnVpbGRHZW5lcmFsUHJvcGVydGllc0hvbGRlcigpLAorCQkJR2VuZXJhbFByb3BlcnRpZXMuRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiZWJmNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247CisKKy8qKgorICogRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGUKKwlleHRlbmRzIEZvcm1QYW5lPExvZ2dpbmc+Cit7CisJcHVibGljIEVjbGlwc2VMaW5rTG9nZ2luZ0NvbXBvc2l0ZSgKKwkJCQkJRm9ybVBhbmU8TG9nZ2luZz4gc3ViamVjdEhvbGRlciwgCisJCQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7CisJCVNlY3Rpb24gc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04pOworCQlzZWN0aW9uLnNldFRleHQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZWN0aW9uVGl0bGUpOworCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uKTsKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKKwkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKKwkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUpOworCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSk7CisJCQorCQkvLyBMb2dnaW5nTGV2ZWw6CisJCW5ldyBMb2dnaW5nTGV2ZWxDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKKworCQkvLyBUaW1lc3RhbXA6CisJCW5ldyBUaW1lc3RhbXBDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKKworCQkvLyBUaHJlYWQ6CisJCW5ldyBUaHJlYWRDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKKworCQkvLyBTZXNzaW9uOgorCQluZXcgU2Vzc2lvbkNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOworCisJCS8vIEV4Y2VwdGlvbnM6CisJCW5ldyBFeGNlcHRpb25zQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7CisKKwkJLy8gTG9nZ2luZ0ZpbGU6CisJCW5ldyBMb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7CisJCQorCQkvLyBMb2dnZXI6CisJCW5ldyBMb2dnZXJDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKKwkJCisJCXJldHVybjsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOworCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0V4Y2VwdGlvbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRXhjZXB0aW9uc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YTQ4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0V4Y2VwdGlvbnNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEV4Y2VwdGlvbnNDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEV4Y2VwdGlvbnNDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxMb2dnaW5nPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RXhjZXB0aW9uc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBFeGNlcHRpb25zQ29tcG9zaXRlKAorCQkJCQlGb3JtUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50Q29tcG9zaXRlLAorCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9leGNlcHRpb25zTGFiZWwsCisJCQl0aGlzLmJ1aWxkRXhjZXB0aW9uc0hvbGRlcigpLAorCQkJdGhpcy5idWlsZEV4Y2VwdGlvbnNTdHJpbmdIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfTE9HR0lOR19FWENFUFRJT05TCisJCSk7CisJfQorCQorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFeGNlcHRpb25zSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIExvZ2dpbmcuRVhDRVBUSU9OU19QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV4Y2VwdGlvbnMoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRFeGNlcHRpb25zKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRXhjZXB0aW9uc1N0cmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEV4Y2VwdGlvbnNIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9leGNlcHRpb25zTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOworCQkJCX0KKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9leGNlcHRpb25zTGFiZWw7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdEV4Y2VwdGlvbnNIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJTG9nZ2luZy5FWENFUFRJT05TX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0RXhjZXB0aW9ucygpICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdEV4Y2VwdGlvbnMoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnZXJDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmViOWYyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnZXJDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmc7CisKK2ltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlckNvbWJvUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIExvZ2dlckNvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgTG9nZ2VyQ29tcG9zaXRlIGV4dGVuZHMgQ2xhc3NDaG9vc2VyQ29tYm9QYW5lPExvZ2dpbmc+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Mb2dnZXJDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIExvZ2dlckNvbXBvc2l0ZSgKKwkJCQkJCQkJUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisJCWlmICh0aGlzLmdldFN1YmplY3QoKS5nZXRMb2dnZXIoKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gTG9nZ2VyLkRFRkFVTFRfTE9HR0VSX0NMQVNTX05BTUU7CisJCX0KKwkJcmV0dXJuIExvZ2dlci5nZXRMb2dnZXJDbGFzc05hbWUodGhpcy5nZXRTdWJqZWN0KCkuZ2V0TG9nZ2VyKCkpOworCX0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgeworICAgIAlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnZXJMYWJlbDsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKKyAgICAJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgeworICAgIAlyZXR1cm4gTG9nZ2luZy5FQ0xJUFNFTElOS19MT0dHRVJfQ0xBU1NfTkFNRTsKKyAgICB9CisgICAgCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLkxPR0dFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCisJCQkJU3RyaW5nIG5hbWUgPSB0aGlzLnN1YmplY3QuZ2V0TG9nZ2VyKCk7CisJCQkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJCQluYW1lID0gTG9nZ2VyQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCk7CisJCQkJfQorCQkJCXJldHVybiBuYW1lOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKworCQkJCWlmIChnZXREZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5zdWJqZWN0LnNldExvZ2dlcih2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRMb2dnZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIExvZ2dpbmcuREVGQVVMVF9MT0dHRVIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gTG9nZ2VyQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdExvZ2dlckxpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKKwkJCXRoaXMuYnVpbGREZWZhdWx0TG9nZ2VySG9sZGVyKCkKKwkJKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoU3RyaW5nIGxvZ2dlck5hbWUpIHsKKworCQlzd2l0Y2ggKExvZ2dlci52YWx1ZU9mKGxvZ2dlck5hbWUpKSB7CisJCQljYXNlIGRlZmF1bHRfbG9nZ2VyOiB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Mb2dnZXJDb21wb3NpdGVfZGVmYXVsdF9sb2dnZXI7CisJCQl9CisJCQljYXNlIGphdmFfbG9nZ2VyOiB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Mb2dnZXJDb21wb3NpdGVfamF2YV9sb2dnZXI7CisJCQl9CisJCQljYXNlIHNlcnZlcl9sb2dnZXI6IHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dlckNvbXBvc2l0ZV9zZXJ2ZXJfbG9nZ2VyOworCQkJfQorCQkJZGVmYXVsdDogeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gYnVpbGRMb2dnZXJDb21wYXJhdG9yKCkgeworCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgbG9nZ2VyMSwgU3RyaW5nIGxvZ2dlcjIpIHsKKwkJCQlsb2dnZXIxID0gYnVpbGREaXNwbGF5U3RyaW5nKGxvZ2dlcjEpOworCQkJCWxvZ2dlcjIgPSBidWlsZERpc3BsYXlTdHJpbmcobG9nZ2VyMik7CisJCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShsb2dnZXIxLCBsb2dnZXIyKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGRDbGFzc0NvbnZlcnRlcigpIHsKKwkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKKwkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgeworCQkJCXRyeSB7CisJCQkJCUxvZ2dlci52YWx1ZU9mKHZhbHVlKTsKKwkJCQkJdmFsdWUgPSBidWlsZERpc3BsYXlTdHJpbmcodmFsdWUpOworCQkJCX0KKwkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gSWdub3JlIHNpbmNlIHRoZSB2YWx1ZSBpcyBub3QgYSBMb2dnZXIKKwkJCQl9CisJCQkJcmV0dXJuIHZhbHVlOworCQkJfQorCQl9OworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ2xhc3NMaXN0SG9sZGVyKCkgeworCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oMik7CisJCWhvbGRlcnMuYWRkKHRoaXMuYnVpbGREZWZhdWx0TG9nZ2VyTGlzdEhvbGRlcigpKTsKKwkJaG9sZGVycy5hZGQodGhpcy5idWlsZExvZ2dlcnNMaXN0SG9sZGVyKCkpOworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7CisJfQorCisJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTG9nZ2VycygpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPExvZ2dlciwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoTG9nZ2VyLnZhbHVlcygpKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShMb2dnZXIgbmV4dCkgeworCQkJCXJldHVybiBuZXh0Lm5hbWUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMb2dnZXJzQ29sbGVjdGlvbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAorCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZExvZ2dlcnMoKSkKKwkJKTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMb2dnZXJzTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKKwkJCXRoaXMuYnVpbGRMb2dnZXJzQ29sbGVjdGlvbkhvbGRlcigpLAorCQkJdGhpcy5idWlsZExvZ2dlckNvbXBhcmF0b3IoKQorCQkpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRWYWx1ZShMb2dnaW5nIHN1YmplY3QpIHsKKwkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdExvZ2dlcigpOworCisJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgeworCQkJcmV0dXJuIE5MUy5iaW5kKAorCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSwKKwkJCQlkZWZhdWx0VmFsdWUKKwkJCSk7CisJCX0KKwkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZGVmYXVsdEVtcHR5OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworCQl0aGlzLmdldFN1YmplY3QoKS5zZXRMb2dnZXIoY2xhc3NOYW1lKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjUwYjM0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb2xkZXJDaG9vc2VyUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZSAKKyAqLworcHVibGljIGNsYXNzIExvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGUgZXh0ZW5kcyBQYW5lPExvZ2dpbmc+Cit7CisJcHVibGljIExvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQkKKwkJbmV3IEZvbGRlckNob29zZXJQYW5lPExvZ2dpbmc+KHRoaXMsIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBTdHJpbmc+KAorCQkJCQkJCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgTG9nZ2luZy5MT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKworCQkJCQkJU3RyaW5nIG5hbWUgPSBzdWJqZWN0LmdldExvZ0ZpbGVMb2NhdGlvbigpOworCQkJCQkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJCQkJCW5hbWUgPSBkZWZhdWx0VmFsdWUoc3ViamVjdCk7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gbmFtZTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisKKwkJCQkJCWlmIChkZWZhdWx0VmFsdWUoc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgeworCQkJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQkJCX0KKwkJCQkJCXN1YmplY3Quc2V0TG9nRmlsZUxvY2F0aW9uKHZhbHVlKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisKKwkJCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZShMb2dnaW5nIHN1YmplY3QpIHsKKwkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0TG9nRmlsZUxvY2F0aW9uKCk7CisKKwkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIE5MUy5iaW5kKAorCQkJCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9kZWZhdWx0V2l0aE9uZVBhcmFtLAorCQkJCQkJZGVmYXVsdFZhbHVlCisJCQkJCSk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9kZWZhdWx0RW1wdHk7CisJCQkJfQorCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhbG9nTWVzc2FnZSgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nTWVzc2FnZTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWxvZ1RpdGxlKCkgeworCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZV9kaWFsb2dUaXRsZTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnaW5nRmlsZUxhYmVsOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ0xldmVsQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdMZXZlbENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMDhkNjMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdMZXZlbENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZ0xldmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogTG9nZ2luZ0xldmVsQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBMb2dnaW5nTGV2ZWxDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxMb2dnaW5nPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TG9nZ2luZ0xldmVsQ29tcG9zaXRlPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBMb2dnaW5nTGV2ZWxDb21wb3NpdGUoCisJCQkJRm9ybVBhbmU8PyBleHRlbmRzIExvZ2dpbmc+IHBhcmVudENvbXBvc2l0ZSwgCisJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCQkKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxMb2dnaW5nLCBMb2dnaW5nTGV2ZWw+IGFkZExvZ2dpbmdMZXZlbENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPExvZ2dpbmcsIExvZ2dpbmdMZXZlbD4odGhpcywgY29udGFpbmVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKExvZ2dpbmcuTEVWRUxfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBMb2dnaW5nTGV2ZWxbXSBnZXRDaG9pY2VzKCkgeworCQkJCXJldHVybiBMb2dnaW5nTGV2ZWwudmFsdWVzKCk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBMb2dnaW5nTGV2ZWwgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0TGV2ZWwoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoTG9nZ2luZ0xldmVsIHZhbHVlKSB7CisJCQkJcmV0dXJuIHRoaXMuYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgTG9nZ2luZ0xldmVsQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgTG9nZ2luZ0xldmVsIGdldFZhbHVlKCkgeworCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRMZXZlbCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKExvZ2dpbmdMZXZlbCB2YWx1ZSkgeworCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldExldmVsKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJCWNvbnRhaW5lciwKKwkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ2dpbmdMZXZlbExhYmVsLAorCQkJCXRoaXMuYWRkTG9nZ2luZ0xldmVsQ29tYm8oY29udGFpbmVyKSwKKwkJCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0xPR0dJTkdfTEVWRUwKKwkJKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL1BlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWM3NWYwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWIuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYgorICovCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiCisJZXh0ZW5kcyBGb3JtUGFuZTxMb2dnaW5nPgorCWltcGxlbWVudHMgSnBhUGFnZUNvbXBvc2l0ZQoreworCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKKwlwdWJsaWMgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiKAorCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxMb2dnaW5nPiBzdWJqZWN0SG9sZGVyLCAKKwkJCQlDb21wb3NpdGUgcGFyZW50LCAKKwkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBFY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisKKwkvLyAqKioqKioqKioqIEpwYVBhZ2VDb21wb3NpdGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0xPR0dJTkc7CisJfQorCisJcHVibGljIEltYWdlIGdldFBhZ2VJbWFnZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQYWdlVGV4dCgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGl0bGU7CisJfQorCisJLy8gKioqKioqKioqKiBMYXlvdXQgKioqKioqKioqKgorCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCWxheW91dC5tYXJnaW5Ub3AgPSAwOworCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7CisJCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOworCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7CisJCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0aGlzLmFkZFBhbmUocGFyZW50LCBsYXlvdXQpOworCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7CisJCXJldHVybiBjb250YWluZXI7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9TZXNzaW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL1Nlc3Npb25Db21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjM2OTgwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9TZXNzaW9uQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBTZXNzaW9uQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBTZXNzaW9uQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8TG9nZ2luZz4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlc3Npb25Db21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgU2Vzc2lvbkNvbXBvc2l0ZSgKKwkJCQkJRm9ybVBhbmU8PyBleHRlbmRzIExvZ2dpbmc+IHBhcmVudENvbXBvc2l0ZSwKKwkJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2Vzc2lvbkxhYmVsLAorCQkJdGhpcy5idWlsZFNlc3Npb25Ib2xkZXIoKSwKKwkJCXRoaXMuYnVpbGRTZXNzaW9uU3RyaW5nSG9sZGVyKCksCisJCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0xPR0dJTkdfU0VTU0lPTgorCQkpOworCX0KKwkKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2Vzc2lvbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLlNFU1NJT05fUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTZXNzaW9uKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0U2Vzc2lvbih2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNlc3Npb25TdHJpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRTZXNzaW9uSG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKKwkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2Vzc2lvbkxhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2Vzc2lvbkxhYmVsOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRTZXNzaW9uSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCUxvZ2dpbmcuU0VTU0lPTl9QUk9QRVJUWSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNlc3Npb24oKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRTZXNzaW9uKCk7CisJCQl9CisJCX07CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL1RocmVhZENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9UaHJlYWRDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGU1OGI0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9UaHJlYWRDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRocmVhZENvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgVGhyZWFkQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8TG9nZ2luZz4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRocmVhZENvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBUaHJlYWRDb21wb3NpdGUoCisJCQkJCUZvcm1QYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRDb21wb3NpdGUsCisJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RocmVhZExhYmVsLAorCQkJdGhpcy5idWlsZFRocmVhZEhvbGRlcigpLAorCQkJdGhpcy5idWlsZFRocmVhZFN0cmluZ0hvbGRlcigpLAorCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9MT0dHSU5HX1RIUkVBRAorCQkpOworCX0KKwkKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGhyZWFkSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIExvZ2dpbmcuVEhSRUFEX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGhyZWFkKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0VGhyZWFkKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGhyZWFkU3RyaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0VGhyZWFkSG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKKwkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOworCQkJCX0KKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aHJlYWRMYWJlbDsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0VGhyZWFkSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCUxvZ2dpbmcuVEhSRUFEX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0VGhyZWFkKCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0VGhyZWFkKCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9UaW1lc3RhbXBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvVGltZXN0YW1wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5Y2FkYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvVGltZXN0YW1wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaW1lc3RhbXBDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFRpbWVzdGFtcENvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPExvZ2dpbmc+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UaW1lc3RhbXBDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgVGltZXN0YW1wQ29tcG9zaXRlKAorCQkJCQlGb3JtUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50Q29tcG9zaXRlLAorCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aW1lc3RhbXBMYWJlbCwKKwkJCXRoaXMuYnVpbGRUaW1lc3RhbXBIb2xkZXIoKSwKKwkJCXRoaXMuYnVpbGRUaW1lc3RhbXBTdHJpbmdIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfTE9HR0lOR19USU1FU1RBTVAKKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRpbWVzdGFtcEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLlRJTUVTVEFNUF9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFRpbWVzdGFtcCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldFRpbWVzdGFtcCh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRpbWVzdGFtcFN0cmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFRpbWVzdGFtcEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7CisJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpbWVzdGFtcExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGltZXN0YW1wTGFiZWw7CisJCQl9CisJCX07CisJfQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFRpbWVzdGFtcEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlMb2dnaW5nLlRJTUVTVEFNUF9QUk9QRVJUWSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFRpbWVzdGFtcCgpICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFRpbWVzdGFtcCgpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvRWNsaXBzZUxpbmtPcHRpb25zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4N2FlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcHRpb25zQ29tcG9zaXRlPFQgZXh0ZW5kcyBPcHRpb25zPiBleHRlbmRzIEZvcm1QYW5lPFQ+Cit7CisJcHVibGljIEVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZSgKKwkJCQkJRm9ybVBhbmU8VD4gc3ViamVjdEhvbGRlciwgCisJCQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIsIGZhbHNlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJdGhpcy5pbml0aWFsaXplU2Vzc2lvbk9wdGlvbnNQYW5lKHBhcmVudCk7CisJCXRoaXMuaW5pdGlhbGl6ZU1pc2NlbGxhbmVvdXNQYW5lKHBhcmVudCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU2Vzc2lvbk9wdGlvbnNQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRoaXMuYWRkU2VjdGlvbihwYXJlbnQsIAorCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvblNlY3Rpb25UaXRsZSwKKwkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25TZWN0aW9uRGVzY3JpcHRpb24pOworCQkKKwkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUpOworCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSk7CisKKwkJbmV3IFNlc3Npb25OYW1lQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7CisKKwkJbmV3IFNlc3Npb25zWG1sQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7CisJCQorCQluZXcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKKwkJCisJCW5ldyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKKwkJCisJCW5ldyBFdmVudExpc3RlbmVyQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7CisJCQorCQluZXcgSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7CisJCQorCQlyZXR1cm47CisJfQorCQorCXByb3RlY3RlZCBDb21wb3NpdGUgaW5pdGlhbGl6ZU1pc2NlbGxhbmVvdXNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsJCisJCQorCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7CisJCXRoaXMudXBkYXRlR3JpZERhdGEoY29udGFpbmVyLmdldFBhcmVudCgpKTsKKwkJCisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0aGlzLmFkZFNlY3Rpb24oY29udGFpbmVyLCAKKwkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX21pc2NlbGxhbmVvdXNTZWN0aW9uVGl0bGUsCisJCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9taXNjZWxsYW5lb3VzU2VjdGlvbkRlc2NyaXB0aW9uKTsKKwkJCisJCXRoaXMudXBkYXRlR3JpZERhdGEoY29tcG9zaXRlKTsKKwkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUuZ2V0UGFyZW50KCkpOworCisJCW5ldyBUZW1wb3JhbE11dGFibGVDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKKwkJCisJCXJldHVybiBjb21wb3NpdGU7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FdmVudExpc3RlbmVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL0V2ZW50TGlzdGVuZXJDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQ0Nzg2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FdmVudExpc3RlbmVyQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqICBFdmVudExpc3RlbmVyQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBFdmVudExpc3RlbmVyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RXZlbnRMaXN0ZW5lckNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEV2ZW50TGlzdGVuZXJDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgT3B0aW9ucz4gcGFyZW50UGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxPcHRpb25zPiBpbml0aWFsaXplQ2xhc3NDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8T3B0aW9ucz4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4oCisJCQkJCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXZlbnRMaXN0ZW5lcigpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKworCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJCQl9CisJCQkJCQl0aGlzLnN1YmplY3Quc2V0RXZlbnRMaXN0ZW5lcih2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRFdmVudExpc3RlbmVyKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZXZlbnRMaXN0ZW5lckxhYmVsOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRFdmVudExpc3RlbmVyKGNsYXNzTmFtZSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlckludGVyZmFjZU5hbWUoKSB7CisJCQkJcmV0dXJuIE9wdGlvbnMuRUNMSVBTRUxJTktfRVZFTlRfTElTVEVORVJfQ0xBU1NfTkFNRTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJdGhpcy5pbml0aWFsaXplQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9JbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5ZjI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPE9wdGlvbnM+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5JbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlKAorCQkJCQlGb3JtUGFuZTw/IGV4dGVuZHMgT3B0aW9ucz4gcGFyZW50Q29tcG9zaXRlLAorCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMYWJlbCwKKwkJCXRoaXMuYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIoKSwKKwkJCXRoaXMuYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNTdHJpbmdIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfT1BUSU9OUworCQkpOworCX0KKwkKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc1N0cmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7CisJCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKwkJCQl9CisJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGFiZWw7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgQm9vbGVhbj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1BlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjI3N2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWIuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYgorICovCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiPFQgZXh0ZW5kcyBPcHRpb25zPgorCWV4dGVuZHMgRm9ybVBhbmU8VD4KKwlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKK3sKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCisJcHVibGljIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYigKKwkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwgCisJCQkJQ29tcG9zaXRlIHBhcmVudCwgCisJCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJbmV3IEVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOworCX0KKworCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfT1BUSU9OUzsKKwl9CisKKwlwdWJsaWMgSW1hZ2UgZ2V0UGFnZUltYWdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgeworCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90aXRsZTsKKwl9CisKKwkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7CisJCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7CisJCWxheW91dC5tYXJnaW5SaWdodCA9IDA7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKKwkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYWRkUGFuZShwYXJlbnQsIGxheW91dCk7CisJCXRoaXMudXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKKwkJcmV0dXJuIGNvbnRhaW5lcjsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOworCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1Nlc3Npb25OYW1lQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1Nlc3Npb25OYW1lQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmOTljZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvU2Vzc2lvbk5hbWVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgU2Vzc2lvbk5hbWVDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFNlc3Npb25OYW1lQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vzc2lvbk5hbWVDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIFNlc3Npb25OYW1lQ29tcG9zaXRlKAorCQkJCQkJCQlQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2Vzc2lvbk5hbWVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuREVGQVVMVF9TRVNTSU9OX05BTUUpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gU2Vzc2lvbk5hbWVDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNlc3Npb25OYW1lTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAorCQkJdGhpcy5idWlsZERlZmF1bHRTZXNzaW9uTmFtZUhvbGRlcigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2Vzc2lvbk5hbWVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisKKwkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0U2Vzc2lvbk5hbWUoKTsKKwkJCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQkJCW5hbWUgPSBTZXNzaW9uTmFtZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKKwkJCQl9CisJCQkJcmV0dXJuIG5hbWU7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCisJCQkJaWYgKGdldERlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJc3ViamVjdC5zZXRTZXNzaW9uTmFtZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKE9wdGlvbnMgc3ViamVjdCkgeworCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0U2Vzc2lvbk5hbWUoKTsKKworCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKKwkJCXJldHVybiBOTFMuYmluZCgKKwkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCisJCQkJZGVmYXVsdFZhbHVlCisJCQkpOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdEVtcHR5OworCQl9CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJQ0NvbWJvIGNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uTmFtZSwKKwkJCXRoaXMuYnVpbGREZWZhdWx0U2Vzc2lvbk5hbWVMaXN0SG9sZGVyKCksCisJCQl0aGlzLmJ1aWxkU2Vzc2lvbk5hbWVIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfT1BUSU9OU19TRVNTSU9OX05BTUUKKwkJKTsKKwkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1Nlc3Npb25zWG1sQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1Nlc3Npb25zWG1sQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkNWVmYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvU2Vzc2lvbnNYbWxDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgU2Vzc2lvbnNYbWxDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFNlc3Npb25zWG1sQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vzc2lvbnNYbWxDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIFNlc3Npb25zWG1sQ29tcG9zaXRlKAorCQkJCQkJCQlQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2Vzc2lvbnNYbWxGaWxlTmFtZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5ERUZBVUxUX1NFU1NJT05TX1hNTCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBTZXNzaW9uc1htbENvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2Vzc2lvbnNYbWxGaWxlTmFtZUxpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKKwkJCXRoaXMuYnVpbGREZWZhdWx0U2Vzc2lvbnNYbWxGaWxlTmFtZUhvbGRlcigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2Vzc2lvbnNYbWxGaWxlTmFtZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5TRVNTSU9OU19YTUxfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKworCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXRTZXNzaW9uc1htbCgpOworCQkJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCQkJbmFtZSA9IFNlc3Npb25zWG1sQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpOworCQkJCX0KKwkJCQlyZXR1cm4gbmFtZTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisKKwkJCQlpZiAoZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKwkJCQlzdWJqZWN0LnNldFNlc3Npb25zWG1sKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoT3B0aW9ucyBzdWJqZWN0KSB7CisJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHRTZXNzaW9uc1htbCgpOworCisJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgeworCQkJcmV0dXJuIE5MUy5iaW5kKAorCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSwKKwkJCQlkZWZhdWx0VmFsdWUKKwkJCSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9kZWZhdWx0RW1wdHk7CisJCX0KKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlDQ29tYm8gY29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25zWG1sLAorCQkJdGhpcy5idWlsZERlZmF1bHRTZXNzaW9uc1htbEZpbGVOYW1lTGlzdEhvbGRlcigpLAorCQkJdGhpcy5idWlsZFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfT1BUSU9OU19TRVNTSU9OU19YTUwKKwkJKTsKKwkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldERhdGFiYXNlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldERhdGFiYXNlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3ZDEyZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDE4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnM7CisKK2ltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlRhcmdldERhdGFiYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFyZ2V0RGF0YWJhc2VDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlKAorCQkJCQkJCQlQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0VGFyZ2V0RGF0YWJhc2VIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuREVGQVVMVF9UQVJHRVRfREFUQUJBU0UpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFRhcmdldERhdGFiYXNlTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAorCQkJdGhpcy5idWlsZERlZmF1bHRUYXJnZXREYXRhYmFzZUhvbGRlcigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGREaXNwbGF5U3RyaW5nKFN0cmluZyB0YXJnZXREYXRhYmFzZU5hbWUpIHsKKwkJCisJCXJldHVybiBTV1RVdGlsLmJ1aWxkRGlzcGxheVN0cmluZygKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgCisJCQl0aGlzLmdldENsYXNzKCksIAorCQkJVGFyZ2V0RGF0YWJhc2UudmFsdWVPZih0YXJnZXREYXRhYmFzZU5hbWUpKTsKKwl9CisKKwlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZFRhcmdldERhdGFiYXNlQ29tcGFyYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7CisJCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHRhcmdldERhdGFiYXNlMSwgU3RyaW5nIHRhcmdldERhdGFiYXNlMikgeworCQkJCXRhcmdldERhdGFiYXNlMSA9IGJ1aWxkRGlzcGxheVN0cmluZyh0YXJnZXREYXRhYmFzZTEpOworCQkJCXRhcmdldERhdGFiYXNlMiA9IGJ1aWxkRGlzcGxheVN0cmluZyh0YXJnZXREYXRhYmFzZTIpOworCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGFyZ2V0RGF0YWJhc2UxLCB0YXJnZXREYXRhYmFzZTIpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGRUYXJnZXREYXRhYmFzZUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKKwkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgeworCQkJCXRyeSB7CisJCQkJCVRhcmdldERhdGFiYXNlLnZhbHVlT2YodmFsdWUpOworCQkJCQl2YWx1ZSA9IGJ1aWxkRGlzcGxheVN0cmluZyh2YWx1ZSk7CisJCQkJfQorCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkvLyBJZ25vcmUgc2luY2UgdGhlIHZhbHVlIGlzIG5vdCBhIFRhcmdldERhdGFiYXNlCisJCQkJfQorCQkJCXJldHVybiB2YWx1ZTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUYXJnZXREYXRhYmFzZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5UQVJHRVRfREFUQUJBU0VfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKworCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXRUYXJnZXREYXRhYmFzZSgpOworCQkJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCQkJbmFtZSA9IFRhcmdldERhdGFiYXNlQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpOworCQkJCX0KKwkJCQlyZXR1cm4gbmFtZTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisKKwkJCQlpZiAoZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKwkJCQlzdWJqZWN0LnNldFRhcmdldERhdGFiYXNlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUYXJnZXREYXRhYmFzZUxpc3RIb2xkZXIoKSB7CisJCUFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBob2xkZXJzID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigyKTsKKwkJaG9sZGVycy5hZGQoYnVpbGREZWZhdWx0VGFyZ2V0RGF0YWJhc2VMaXN0SG9sZGVyKCkpOworCQlob2xkZXJzLmFkZChidWlsZFRhcmdldERhdGFiYXNlc0xpc3RIb2xkZXIoKSk7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihob2xkZXJzKTsKKwl9CisKKwlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRUYXJnZXREYXRhYmFzZXMoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUYXJnZXREYXRhYmFzZSwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoVGFyZ2V0RGF0YWJhc2UudmFsdWVzKCkpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFRhcmdldERhdGFiYXNlIG5leHQpIHsKKwkJCQlyZXR1cm4gbmV4dC5uYW1lKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0RGF0YWJhc2VzQ29sbGVjdGlvbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAorCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYnVpbGRUYXJnZXREYXRhYmFzZXMoKSkKKwkJKTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUYXJnZXREYXRhYmFzZXNMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAorCQkJYnVpbGRUYXJnZXREYXRhYmFzZXNDb2xsZWN0aW9uSG9sZGVyKCksCisJCQlidWlsZFRhcmdldERhdGFiYXNlQ29tcGFyYXRvcigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKE9wdGlvbnMgc3ViamVjdCkgeworCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0VGFyZ2V0RGF0YWJhc2UoKTsKKworCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKKwkJCXJldHVybiBOTFMuYmluZCgKKwkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCisJCQkJZGVmYXVsdFZhbHVlCisJCQkpOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdEVtcHR5OworCQl9CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJQ0NvbWJvIGNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90YXJnZXREYXRhYmFzZUxhYmVsLAorCQkJdGhpcy5idWlsZFRhcmdldERhdGFiYXNlTGlzdEhvbGRlcigpLAorCQkJdGhpcy5idWlsZFRhcmdldERhdGFiYXNlSG9sZGVyKCksCisJCQl0aGlzLmJ1aWxkVGFyZ2V0RGF0YWJhc2VDb252ZXJ0ZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfT1BUSU9OU19UQVJHRVRfREFUQUJBU0UKKwkJKTsKKworCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoY29tYm8pOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0U2VydmVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldFNlcnZlckNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NzdiNzcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldFNlcnZlckNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnM7CisKK2ltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlRhcmdldFNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqICBUYXJnZXRTZXJ2ZXJDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFRhcmdldFNlcnZlckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8T3B0aW9ucz4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhcmdldFNlcnZlckNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgVGFyZ2V0U2VydmVyQ29tcG9zaXRlKAorCQkJCQkJCQlQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0VGFyZ2V0U2VydmVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zLkRFRkFVTFRfVEFSR0VUX1NFUlZFUikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBUYXJnZXRTZXJ2ZXJDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFRhcmdldFNlcnZlckxpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKKwkJCXRoaXMuYnVpbGREZWZhdWx0VGFyZ2V0U2VydmVySG9sZGVyKCkKKwkJKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoU3RyaW5nIHRhcmdldFNlcnZlck5hbWUpIHsKKwkJCisJCXJldHVybiBTV1RVdGlsLmJ1aWxkRGlzcGxheVN0cmluZygKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgCisJCQl0aGlzLmdldENsYXNzKCksIAorCQkJVGFyZ2V0U2VydmVyLnZhbHVlT2YodGFyZ2V0U2VydmVyTmFtZSkpOworCX0KKworCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVyQ29tcGFyYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7CisJCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHRhcmdldFNlcnZlcjEsIFN0cmluZyB0YXJnZXRTZXJ2ZXIyKSB7CisJCQkJdGFyZ2V0U2VydmVyMSA9IGJ1aWxkRGlzcGxheVN0cmluZyh0YXJnZXRTZXJ2ZXIxKTsKKwkJCQl0YXJnZXRTZXJ2ZXIyID0gYnVpbGREaXNwbGF5U3RyaW5nKHRhcmdldFNlcnZlcjIpOworCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGFyZ2V0U2VydmVyMSwgdGFyZ2V0U2VydmVyMik7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFRhcmdldFNlcnZlckNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKKwkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgeworCQkJCXRyeSB7CisJCQkJCVRhcmdldFNlcnZlci52YWx1ZU9mKHZhbHVlKTsKKwkJCQkJdmFsdWUgPSBidWlsZERpc3BsYXlTdHJpbmcodmFsdWUpOworCQkJCX0KKwkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gSWdub3JlIHNpbmNlIHRoZSB2YWx1ZSBpcyBub3QgYSBUYXJnZXRTZXJ2ZXIKKwkJCQl9CisJCQkJcmV0dXJuIHZhbHVlOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhcmdldFNlcnZlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5UQVJHRVRfU0VSVkVSX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisKKwkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0VGFyZ2V0U2VydmVyKCk7CisJCQkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJCQluYW1lID0gVGFyZ2V0U2VydmVyQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpOworCQkJCX0KKwkJCQlyZXR1cm4gbmFtZTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisKKwkJCQlpZiAoZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKwkJCQlzdWJqZWN0LnNldFRhcmdldFNlcnZlcih2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVyTGlzdEhvbGRlcigpIHsKKwkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOworCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRUYXJnZXRTZXJ2ZXJMaXN0SG9sZGVyKCkpOworCQlob2xkZXJzLmFkZChidWlsZFRhcmdldFNlcnZlcnNMaXN0SG9sZGVyKCkpOworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7CisJfQorCisJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVycygpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFRhcmdldFNlcnZlciwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoVGFyZ2V0U2VydmVyLnZhbHVlcygpKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShUYXJnZXRTZXJ2ZXIgbmV4dCkgeworCQkJCXJldHVybiBuZXh0Lm5hbWUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUYXJnZXRTZXJ2ZXJzQ29sbGVjdGlvbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAorCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYnVpbGRUYXJnZXRTZXJ2ZXJzKCkpCisJCSk7CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVyc0xpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCisJCQlidWlsZFRhcmdldFNlcnZlcnNDb2xsZWN0aW9uSG9sZGVyKCksCisJCQlidWlsZFRhcmdldFNlcnZlckNvbXBhcmF0b3IoKQorCQkpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRWYWx1ZShPcHRpb25zIHN1YmplY3QpIHsKKwkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdFRhcmdldFNlcnZlcigpOworCisJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgeworCQkJcmV0dXJuIE5MUy5iaW5kKAorCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSwKKwkJCQlkZWZhdWx0VmFsdWUKKwkJCSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9kZWZhdWx0RW1wdHk7CisJCX0KKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlDQ29tYm8gY29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RhcmdldFNlcnZlckxhYmVsLAorCQkJdGhpcy5idWlsZFRhcmdldFNlcnZlckxpc3RIb2xkZXIoKSwKKwkJCXRoaXMuYnVpbGRUYXJnZXRTZXJ2ZXJIb2xkZXIoKSwKKwkJCXRoaXMuYnVpbGRUYXJnZXRTZXJ2ZXJDb252ZXJ0ZXIoKSwKKwkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfT1BUSU9OU19UQVJHRVRfU0VSVkVSCisJCSk7CisKKwkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RlbXBvcmFsTXV0YWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UZW1wb3JhbE11dGFibGVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzc1ZmE2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UZW1wb3JhbE11dGFibGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIFRlbXBvcmFsTXV0YWJsZUNvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgVGVtcG9yYWxNdXRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8T3B0aW9ucz4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRlbXBvcmFsTXV0YWJsZUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBUZW1wb3JhbE11dGFibGVDb21wb3NpdGUoCisJCQkJCUZvcm1QYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRDb21wb3NpdGUsCisJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RlbXBvcmFsTXV0YWJsZUxhYmVsLAorCQkJdGhpcy5idWlsZFRlbXBvcmFsTXV0YWJsZUhvbGRlcigpLAorCQkJdGhpcy5idWlsZFRlbXBvcmFsTXV0YWJsZVN0cmluZ0hvbGRlcigpLAorCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9PUFRJT05TCisJCSk7CisJfQorCQorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUZW1wb3JhbE11dGFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5URU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGVtcG9yYWxNdXRhYmxlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0VGVtcG9yYWxNdXRhYmxlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGVtcG9yYWxNdXRhYmxlU3RyaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0VGVtcG9yYWxNdXRhYmxlSG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKKwkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGVtcG9yYWxNdXRhYmxlTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOworCQkJCX0KKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90ZW1wb3JhbE11dGFibGVMYWJlbDsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0VGVtcG9yYWxNdXRhYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCU9wdGlvbnMuVEVNUE9SQUxfTVVUQUJMRV9QUk9QRVJUWSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFRlbXBvcmFsTXV0YWJsZSgpICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFRlbXBvcmFsTXV0YWJsZSgpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0NyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9DcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNGU5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9DcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIENyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8U2NoZW1hR2VuZXJhdGlvbj4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZSgKKwkJCQkJCQkJUGFuZTw/IGV4dGVuZHMgU2NoZW1hR2VuZXJhdGlvbj4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdENyZWF0ZURkbEZpbGVOYW1lSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQ1JFQVRFX0ZJTEVfTkFNRSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0Q3JlYXRlRGRsRmlsZU5hbWVMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCisJCQl0aGlzLmJ1aWxkRGVmYXVsdENyZWF0ZURkbEZpbGVOYW1lSG9sZGVyKCkKKwkJKTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDcmVhdGVEZGxGaWxlTmFtZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8U2NoZW1hR2VuZXJhdGlvbiwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgU2NoZW1hR2VuZXJhdGlvbi5DUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisKKwkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0Q3JlYXRlRmlsZU5hbWUoKTsKKwkJCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQkJCW5hbWUgPSBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKKwkJCQl9CisJCQkJcmV0dXJuIG5hbWU7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCisJCQkJaWYgKGdldERlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJc3ViamVjdC5zZXRDcmVhdGVGaWxlTmFtZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKFNjaGVtYUdlbmVyYXRpb24gc3ViamVjdCkgeworCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0Q3JlYXRlRmlsZU5hbWUoKTsKKworCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKKwkJCXJldHVybiBOTFMuYmluZCgKKwkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCisJCQkJZGVmYXVsdFZhbHVlCisJCQkpOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdEVtcHR5OworCQl9CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJQ0NvbWJvIGNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9jcmVhdGVEZGxGaWxlTmFtZUxhYmVsLAorCQkJdGhpcy5idWlsZERlZmF1bHRDcmVhdGVEZGxGaWxlTmFtZUxpc3RIb2xkZXIoKSwKKwkJCXRoaXMuYnVpbGRDcmVhdGVEZGxGaWxlTmFtZUhvbGRlcigpLAorCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9TQ0hFTUFfR0VORVJBVElPTgorCQkpOworCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoY29tYm8pOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyZjM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb2xkZXJDaG9vc2VyUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUgZXh0ZW5kcyBQYW5lPFNjaGVtYUdlbmVyYXRpb24+Cit7CisJcHVibGljIERkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBTY2hlbWFHZW5lcmF0aW9uPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCQorCQluZXcgRm9sZGVyQ2hvb3NlclBhbmU8U2NoZW1hR2VuZXJhdGlvbj4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIFN0cmluZz4oCisJCQkJCQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBTY2hlbWFHZW5lcmF0aW9uLkFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCisJCQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0QXBwbGljYXRpb25Mb2NhdGlvbigpOworCQkJCQkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJCQkJCW5hbWUgPSBkZWZhdWx0VmFsdWUoc3ViamVjdCk7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gbmFtZTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisKKwkJCQkJCWlmIChkZWZhdWx0VmFsdWUoc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgeworCQkJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQkJCX0KKwkJCQkJCXN1YmplY3Quc2V0QXBwbGljYXRpb25Mb2NhdGlvbih2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCisJCQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWUoU2NoZW1hR2VuZXJhdGlvbiBzdWJqZWN0KSB7CisJCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdEFwcGxpY2F0aW9uTG9jYXRpb24oKTsKKworCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gTkxTLmJpbmQoCisJCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCisJCQkJCQlkZWZhdWx0VmFsdWUKKwkJCQkJKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRFbXB0eTsKKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dNZXNzYWdlKCkgeworCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dUaXRsZSgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkRkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZV9kaWFsb2dUaXRsZTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZGxHZW5lcmF0aW9uTG9jYXRpb25MYWJlbDsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTU0MWVlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uRGRsR2VuZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlCisJZXh0ZW5kcyBGb3JtUGFuZTxTY2hlbWFHZW5lcmF0aW9uPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGU8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlKAorCQkJCQlGb3JtUGFuZTw/IGV4dGVuZHMgU2NoZW1hR2VuZXJhdGlvbj4gcGFyZW50Q29tcG9zaXRlLCAKKwkJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCQkKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxTY2hlbWFHZW5lcmF0aW9uLCBEZGxHZW5lcmF0aW9uVHlwZT4gYWRkRGRsR2VuZXJhdGlvblR5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxTY2hlbWFHZW5lcmF0aW9uLCBEZGxHZW5lcmF0aW9uVHlwZT4odGhpcywgY29udGFpbmVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFNjaGVtYUdlbmVyYXRpb24uRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIERkbEdlbmVyYXRpb25UeXBlW10gZ2V0Q2hvaWNlcygpIHsKKwkJCQlyZXR1cm4gRGRsR2VuZXJhdGlvblR5cGUudmFsdWVzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIERkbEdlbmVyYXRpb25UeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdERkbEdlbmVyYXRpb25UeXBlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKERkbEdlbmVyYXRpb25UeXBlIHZhbHVlKSB7CisJCQkJcmV0dXJuIHRoaXMuYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUudGhpcywgdmFsdWUpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBEZGxHZW5lcmF0aW9uVHlwZSBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGRsR2VuZXJhdGlvblR5cGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShEZGxHZW5lcmF0aW9uVHlwZSB2YWx1ZSkgeworCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldERkbEdlbmVyYXRpb25UeXBlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RkbEdlbmVyYXRpb25UeXBlTGFiZWwsCisJCQlhZGREZGxHZW5lcmF0aW9uVHlwZUNvbWJvKCBjb250YWluZXIpLAorCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9TQ0hFTUFfR0VORVJBVElPTgorCQkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0Ryb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5Mjc5MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0Ryb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIERyb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxTY2hlbWFHZW5lcmF0aW9uPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUoCisJCQkJCQkJCVBhbmU8PyBleHRlbmRzIFNjaGVtYUdlbmVyYXRpb24+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHREcm9wRGRsRmlsZU5hbWVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIFNjaGVtYUdlbmVyYXRpb24uREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9EUk9QX0ZJTEVfTkFNRSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdERyb3BEZGxGaWxlTmFtZUxpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKKwkJCXRoaXMuYnVpbGREZWZhdWx0RHJvcERkbEZpbGVOYW1lSG9sZGVyKCkKKwkJKTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREcm9wRGRsRmlsZU5hbWVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIFNjaGVtYUdlbmVyYXRpb24uRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKworCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXREcm9wRmlsZU5hbWUoKTsKKwkJCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQkJCW5hbWUgPSBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7CisJCQkJfQorCQkJCXJldHVybiBuYW1lOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKworCQkJCWlmIChEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgeworCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJfQorCQkJCXN1YmplY3Quc2V0RHJvcEZpbGVOYW1lKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoU2NoZW1hR2VuZXJhdGlvbiBzdWJqZWN0KSB7CisJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHREcm9wRmlsZU5hbWUoKTsKKworCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKKwkJCXJldHVybiBOTFMuYmluZCgKKwkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCisJCQkJZGVmYXVsdFZhbHVlCisJCQkpOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdEVtcHR5OworCQl9CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJQ0NvbWJvIGNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKAorCQkJY29udGFpbmVyLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kcm9wRGRsRmlsZU5hbWVMYWJlbCwKKwkJCXRoaXMuYnVpbGREZWZhdWx0RHJvcERkbEZpbGVOYW1lTGlzdEhvbGRlcigpLAorCQkJdGhpcy5idWlsZERyb3BEZGxGaWxlTmFtZUhvbGRlcigpLAorCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9TQ0hFTUFfR0VORVJBVElPTgorCQkpOworCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoY29tYm8pOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1ZDg0ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlCisJZXh0ZW5kcyBGb3JtUGFuZTxTY2hlbWFHZW5lcmF0aW9uPgoreworCXB1YmxpYyBFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb25Db21wb3NpdGUoCisJCQkJCUZvcm1QYW5lPFNjaGVtYUdlbmVyYXRpb24+IHN1YmplY3RIb2xkZXIsCisJCQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gYWRkU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvblRpdGxlLAorCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24KKwkJKTsKKworCQkvLyBEREwgR2VuZXJhdGlvbiBUeXBlOgorCQluZXcgRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwkJLy8gT3V0cHV0IE1vZGU6CisJCW5ldyBPdXRwdXRNb2RlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJCS8vIERETCBHZW5lcmF0aW9uIExvY2F0aW9uCisJCW5ldyBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwkJLy8gQ3JlYXRlIERETCBGaWxlIE5hbWU6CisJCW5ldyBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCQkvLyBEcm9wIERETCBGaWxlIE5hbWU6CisJCW5ldyBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vT3V0cHV0TW9kZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vT3V0cHV0TW9kZUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZjIyMzMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9PdXRwdXRNb2RlQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLk91dHB1dE1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogT3V0cHV0TW9kZUNvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgT3V0cHV0TW9kZUNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPFNjaGVtYUdlbmVyYXRpb24+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PdXRwdXRNb2RlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBPdXRwdXRNb2RlQ29tcG9zaXRlKAorCQkJCUZvcm1QYW5lPD8gZXh0ZW5kcyBTY2hlbWFHZW5lcmF0aW9uPiBwYXJlbnRDb21wb3NpdGUsIAorCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8U2NoZW1hR2VuZXJhdGlvbiwgT3V0cHV0TW9kZT4gYWRkQnVpbGRPdXRwdXRNb2RlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8U2NoZW1hR2VuZXJhdGlvbiwgT3V0cHV0TW9kZT4odGhpcywgY29udGFpbmVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBPdXRwdXRNb2RlW10gZ2V0Q2hvaWNlcygpIHsKKwkJCQlyZXR1cm4gT3V0cHV0TW9kZS52YWx1ZXMoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgT3V0cHV0TW9kZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRPdXRwdXRNb2RlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKE91dHB1dE1vZGUgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBPdXRwdXRNb2RlQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgT3V0cHV0TW9kZSBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0T3V0cHV0TW9kZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE91dHB1dE1vZGUgdmFsdWUpIHsKKwkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRPdXRwdXRNb2RlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJCWNvbnRhaW5lciwKKwkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX291dHB1dE1vZGVMYWJlbCwKKwkJCQl0aGlzLmFkZEJ1aWxkT3V0cHV0TW9kZUNvbWJvKGNvbnRhaW5lciksCisJCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9TQ0hFTUFfR0VORVJBVElPTgorCQkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL1BlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0Mjc1ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL1BlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYi5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIKKyAqLworcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYgorCWV4dGVuZHMgRm9ybVBhbmU8U2NoZW1hR2VuZXJhdGlvbj4KKwlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKK3sKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCisJcHVibGljIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYigKKwkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gc3ViamVjdEhvbGRlciwKKwkJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb25Db21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisKKwkvLyAqKioqKioqKioqIEpwYVBhZ2VDb21wb3NpdGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1NDSEVNQV9HRU5FUkFUSU9OOworCX0KKworCXB1YmxpYyBJbWFnZSBnZXRQYWdlSW1hZ2UoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX3RpdGxlOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZXhtbC9kZXRhaWxzL0VjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmluZGV4IDY2MDFlZGQuLmY5MjFkM2IgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksOCArOSwyMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZXhtbC5kZXRhaWxzOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKIAogLyoqCiAgKiBFY2xpcHNlTGlua05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5CkBAIC0xOSw1ICszMiw2MyBAQAogCWV4dGVuZHMgR2VuZXJpY05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5CiAJaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKIHsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKAorCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgeworCQlEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciA9IAorCQkJKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOworCQkKKwkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgeworCQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIoCisJCQkJKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBpdGVtLCB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKKwkJfQorCQkKKwkJcmV0dXJuIHN1cGVyLmJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7CisJfQogCQorCQorCXB1YmxpYyBzdGF0aWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyIAorCQlleHRlbmRzIFBlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIKKwl7CisJCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIoCisJCQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0LCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgeworCQkJc3VwZXIocGVyc2lzdGVuY2VVbml0LCBjb250ZW50UHJvdmlkZXIpOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldE1vZGVsKCkgeworCQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0TW9kZWwoKTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKcGFDb250ZXh0Tm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgeworCQkJTGlzdDxDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+PigpOworCQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRPcm1YbWxDdm0oKSk7CisJCQlsaXN0LmFkZChidWlsZEltcGxpZWRNYXBwaW5nRmlsZUN2bSgpKTsKKwkJCWxpc3QuYWRkKGJ1aWxkSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVDdm0oKSk7CisJCQlsaXN0LmFkZChidWlsZFBlcnNpc3RlbnRUeXBlQ3ZtKCkpOworCQkJbGlzdC5hZGQoYnVpbGRKYXJGaWxlQ3ZtKCkpOworCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+LCBKcGFDb250ZXh0Tm9kZT4obGlzdCk7CisJCX0KKwkJCisJCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWFwcGluZ0ZpbGU+IGJ1aWxkSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVDdm0oKSB7CisJCQlyZXR1cm4gbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPE1hcHBpbmdGaWxlPigKKwkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hcHBpbmdGaWxlUmVmLCBNYXBwaW5nRmlsZT4oCisJCQkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBNYXBwaW5nRmlsZVJlZj4oCisJCQkJCQkJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LklNUExJRURfRUNMSVBTRUxJTktfTUFQUElOR19GSUxFX1JFRl9QUk9QRVJUWSwKKwkJCQkJCQkJZ2V0TW9kZWwoKSkgeworCQkJCQkJCUBPdmVycmlkZQorCQkJCQkJCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBidWlsZFZhbHVlXygpIHsKKwkJCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKTsKKwkJCQkJCQl9CisJCQkJCQl9LAorCQkJCQkJTWFwcGluZ0ZpbGVSZWYuTUFQUElOR19GSUxFX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGUgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRNYXBwaW5nRmlsZSgpOworCQkJCQl9CisJCQkJfQorCQkJKTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvUGVyc2lzdGVuY2VEZXRhaWxzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvUGVyc2lzdGVuY2VEZXRhaWxzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjMGI4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZXhtbC9kZXRhaWxzL1BlcnNpc3RlbmNlRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNleG1sLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUGVyc2lzdGVuY2VEZXRhaWxzUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlRGV0YWlsc1Byb3ZpZGVyIGltcGxlbWVudHMgSnBhRGV0YWlsc1Byb3ZpZGVyCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlRGV0YWlsc1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkRGV0YWlsc1BhZ2UoCi0JCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJCQkJCU9iamVjdCBjb250ZW50Tm9kZUlkLAotCQkJCQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCWlmIChjb250ZW50Tm9kZUlkID09IFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOQ0VfSUQpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxEZXRhaWxzUGFnZShwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnROb2RlSWQgPT0gUGVyc2lzdGVuY2VTdHJ1Y3R1cmVOb2Rlcy5QRVJTSVNURU5DRV9VTklUX0lEKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sRGV0YWlsc1BhZ2UocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGZpbGVDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZXhtbC9kZXRhaWxzL1BlcnNpc3RlbmNlWG1sRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvUGVyc2lzdGVuY2VYbWxEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzRjNmViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvUGVyc2lzdGVuY2VYbWxEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZXhtbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RKcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFBlcnNpc3RlbmNlWG1sRGV0YWlsc1BhZ2UKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sRGV0YWlsc1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdEpwYURldGFpbHNQYWdlPFBlcnNpc3RlbmNlVW5pdD4KLXsKLQotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbERldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNTc1N2YKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWkuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRkbGdlbi5FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmJhc2UuQmFzZUpwYVBsYXRmb3JtVWk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLm5hdmlnYXRvci5KcGFOYXZpZ2F0b3JQcm92aWRlcjsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaQorCWV4dGVuZHMgQmFzZUpwYVBsYXRmb3JtVWkKK3sKKwlwdWJsaWMgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpKAorCQlKcGFOYXZpZ2F0b3JQcm92aWRlciBuYXZpZ2F0b3JQcm92aWRlciwKKwkJSnBhUGxhdGZvcm1VaVByb3ZpZGVyIHBsYXRmb3JtVWlQcm92aWRlcikgCisJeworCQlzdXBlcihuYXZpZ2F0b3JQcm92aWRlciwgcGxhdGZvcm1VaVByb3ZpZGVyKTsKKwl9CisKKwkvLyAqKioqKioqKioqIERETCBnZW5lcmF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyB2b2lkIGdlbmVyYXRlRERMKEpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWkuZ2VuZXJhdGUocHJvamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiZDZlOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWlGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpRmFjdG9yeSBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWlGYWN0b3J5Cit7CisKKwkvKioKKwkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50CisJICovCisJcHVibGljIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaSgKKwkJCW5ldyBFY2xpcHNlTGlua05hdmlnYXRvclByb3ZpZGVyKCksCisJCQlFY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlQcm92aWRlci5pbnN0YW5jZSgpCisJCSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmMTU4MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkVjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcgoreworCisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogZGV0YWlscyBwcm92aWRlcnMgKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZERldGFpbHNQcm92aWRlcnNUbyhMaXN0PEpwYURldGFpbHNQcm92aWRlcj4gcHJvdmlkZXJzKSB7CisJCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oTGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rUGxhdGZvcm1VSS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtQbGF0Zm9ybVVJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjN2Y3NTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtQbGF0Zm9ybVVJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRkbGdlbi5FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZXhtbC5kZXRhaWxzLlBlcnNpc3RlbmNlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLlR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uYmFzZS5CYXNlSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtQbGF0Zm9ybVVJCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BsYXRmb3JtVUkgZXh0ZW5kcyBCYXNlSnBhUGxhdGZvcm1VaQotewotCXB1YmxpYyBFY2xpcHNlTGlua1BsYXRmb3JtVUkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8gKioqKioqKioqIG5hdmlnYXRvciBjb250ZW50ICoqKioqKioqKgotCXB1YmxpYyBKcGFOYXZpZ2F0b3JQcm92aWRlciBidWlsZE5hdmlnYXRvclByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhVWlGYWN0b3J5IGNyZWF0ZUpwYVVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1VpRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlRERMKEpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0KLQkJU3RyaW5nIHByb2plY3RMb2NhdGlvbiA9IHByb2plY3QuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCi0JCUVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWkuZ2VuZXJhdGUocHJvamVjdCwgcHJvamVjdExvY2F0aW9uLCBzZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc3BsYXlOb3RTdXBwb3J0ZWRNZXNzYWdlKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3RyaW5nIGZvcm1hdHRlZE1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChtZXNzYWdlLCBtZXNzYWdlKTsKLQkJU2hlbGwgY3VycmVudFNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oY3VycmVudFNoZWxsLCB0aXRsZSwgZm9ybWF0dGVkTWVzc2FnZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGV0YWlsc1Byb3ZpZGVyc1RvKENvbGxlY3Rpb248SnBhRGV0YWlsc1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJc3VwZXIuYWRkRGV0YWlsc1Byb3ZpZGVyc1RvKHByb3ZpZGVycyk7Ci0JCXByb3ZpZGVycy5hZGQobmV3IFBlcnNpc3RlbmNlRGV0YWlsc1Byb3ZpZGVyKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnNUbygKLQkJCQkJCQlMaXN0PEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gcHJvdmlkZXJzKSB7Ci0JCXN1cGVyLmFkZEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnNUbyhwcm92aWRlcnMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFUeXBlTWFwcGluZ1VpUHJvdmlkZXJzVG8oCi0JCQkJCQkJTGlzdDxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gcHJvdmlkZXJzKSB7Ci0JCXN1cGVyLmFkZEphdmFUeXBlTWFwcGluZ1VpUHJvdmlkZXJzVG8ocHJvdmlkZXJzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua1VpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczMmZiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua1VpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5jYWNoaW5nLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuY29ubmVjdGlvbi5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmN1c3RvbWl6YXRpb24uUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5sb2dnaW5nLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwub3B0aW9ucy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnNjaGVtYS5nZW5lcmF0aW9uLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5CYXNlSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rVWlGYWN0b3J5Ci0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1VpRmFjdG9yeSBleHRlbmRzIEJhc2VKcGFVaUZhY3RvcnkKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtVaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SnBhUGFnZUNvbXBvc2l0ZTxQZXJzaXN0ZW5jZVVuaXQ+PiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGVzKAotCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gZWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIgPSAKLQkJCXRoaXMuYnVpbGRFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQkJQXJyYXlMaXN0PEpwYVBhZ2VDb21wb3NpdGU8UGVyc2lzdGVuY2VVbml0Pj4gcGFnZXMgPSAKLQkJCW5ldyBBcnJheUxpc3Q8SnBhUGFnZUNvbXBvc2l0ZTxQZXJzaXN0ZW5jZVVuaXQ+Pig4KTsKLQotCQlwYWdlcy5hZGQobmV3IFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvbj4gY29ubmVjdGlvbkhvbGRlciA9IAotCQkJdGhpcy5idWlsZENvbm5lY3Rpb25Ib2xkZXIoZWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIpOwotCQlwYWdlcy5hZGQobmV3IFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYihjb25uZWN0aW9uSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPiBjdXN0b21pemF0aW9uSG9sZGVyID0gCi0JCQl0aGlzLmJ1aWxkQ3VzdG9taXphdGlvbkhvbGRlcihlY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlcik7Ci0JCXBhZ2VzLmFkZChuZXcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiKGN1c3RvbWl6YXRpb25Ib2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOwotCQkKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IGNhY2hpbmdIb2xkZXIgPSAKLQkJCXRoaXMuYnVpbGRDYWNoaW5nSG9sZGVyKGVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyKTsKLQkJcGFnZXMuYWRkKG5ldyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWIoY2FjaGluZ0hvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8TG9nZ2luZz4gbG9nZ2luZ0hvbGRlciA9IAotCQkJdGhpcy5idWlsZExvZ2dpbmdIb2xkZXIoZWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIpOwotCQlwYWdlcy5hZGQobmV3IFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYihsb2dnaW5nSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gb3B0aW9uc0hvbGRlciA9IAotCQkJdGhpcy5idWlsZE9wdGlvbnNIb2xkZXIoZWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIpOwotCQlwYWdlcy5hZGQobmV3IFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYihvcHRpb25zSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxTY2hlbWFHZW5lcmF0aW9uPiBzY2hlbWFHZW5Ib2xkZXIgPSAKLQkJCXRoaXMuYnVpbGRTY2hlbWFHZW5lcmF0aW9uSG9sZGVyKGVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyKTsKLQkJcGFnZXMuYWRkKG5ldyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIoc2NoZW1hR2VuSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJCi0JCXBhZ2VzLmFkZChuZXcgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJCi0JCXJldHVybiBwYWdlcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDb25uZWN0aW9uPiBidWlsZENvbm5lY3Rpb25Ib2xkZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQsIENvbm5lY3Rpb24+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbm5lY3Rpb24gdHJhbnNmb3JtXyhFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDb25uZWN0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gYnVpbGRPcHRpb25zSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBPcHRpb25zPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcHRpb25zIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0T3B0aW9ucygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+IGJ1aWxkTG9nZ2luZ0hvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgTG9nZ2luZz4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTG9nZ2luZyB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldExvZ2dpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPiBidWlsZEN1c3RvbWl6YXRpb25Ib2xkZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQsIEN1c3RvbWl6YXRpb24+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEN1c3RvbWl6YXRpb24gdHJhbnNmb3JtXyhFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDdXN0b21pemF0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gYnVpbGRDYWNoaW5nSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBDYWNoaW5nPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoaW5nIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q2FjaGluZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+IGJ1aWxkU2NoZW1hR2VuZXJhdGlvbkhvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgU2NoZW1hR2VuZXJhdGlvbj4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2NoZW1hR2VuZXJhdGlvbiB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFNjaGVtYUdlbmVyYXRpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gYnVpbGRFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdHJhbnNmb3JtXyhQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9DcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vQ3JlYXRlRGRsRmlsZU5hbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJmMTU5Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9DcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRGRsRmlsZU5hbWVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8U2NoZW1hR2VuZXJhdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZSgKLQkJCQkJCQkJQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBTY2hlbWFHZW5lcmF0aW9uPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0Q3JlYXRlRGRsRmlsZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIFNjaGVtYUdlbmVyYXRpb24uREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9DUkVBVEVfRklMRV9OQU1FKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIENyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlLnRoaXMuZGVmYXVsdFZhbHVlKHN1YmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRDcmVhdGVEZGxGaWxlTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0Q3JlYXRlRGRsRmlsZU5hbWVIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENyZWF0ZURkbEZpbGVOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBTY2hlbWFHZW5lcmF0aW9uLkNSRUFURV9GSUxFX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQotCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXRDcmVhdGVGaWxlTmFtZSgpOwotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IENyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlLnRoaXMuZGVmYXVsdFZhbHVlKHN1YmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoZGVmYXVsdFZhbHVlKHN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldENyZWF0ZUZpbGVOYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWUoU2NoZW1hR2VuZXJhdGlvbiBzdWJqZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHRDcmVhdGVGaWxlTmFtZSgpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZWZhdWx0RW1wdHk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDQ29tYm8gY29tYm8gPSBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfY3JlYXRlRGRsRmlsZU5hbWVMYWJlbCwKLQkJCXRoaXMuYnVpbGREZWZhdWx0Q3JlYXRlRGRsRmlsZU5hbWVMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkQ3JlYXRlRGRsRmlsZU5hbWVIb2xkZXIoKSwKLQkJCW51bGwJCS8vIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ1JFQVRFX0RETF9GSUxFX05BTUUKLQkJKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2MzNzAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb2xkZXJDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIERkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPFNjaGVtYUdlbmVyYXRpb24+Ci17Ci0JcHVibGljIERkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFNjaGVtYUdlbmVyYXRpb24+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCW5ldyBGb2xkZXJDaG9vc2VyUGFuZTxTY2hlbWFHZW5lcmF0aW9uPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8U2NoZW1hR2VuZXJhdGlvbiwgU3RyaW5nPigKLQkJCQkJCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIFNjaGVtYUdlbmVyYXRpb24uQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXRBcHBsaWNhdGlvbkxvY2F0aW9uKCk7Ci0JCQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCQkJbmFtZSA9IGRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuYW1lOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCQkJCQkJc3ViamVjdC5zZXRBcHBsaWNhdGlvbkxvY2F0aW9uKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZShTY2hlbWFHZW5lcmF0aW9uIHN1YmplY3QpIHsKLQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0QXBwbGljYXRpb25Mb2NhdGlvbigpOwotCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQkJCWRlZmF1bHRWYWx1ZQotCQkJCQkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdEVtcHR5OwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpYWxvZ01lc3NhZ2UoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nTWVzc2FnZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpYWxvZ1RpdGxlKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ1RpdGxlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgbGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RkbEdlbmVyYXRpb25Mb2NhdGlvbkxhYmVsOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmE1ZTU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uRGRsR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBEZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8U2NoZW1hR2VuZXJhdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBEZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgU2NoZW1hR2VuZXJhdGlvbj4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxTY2hlbWFHZW5lcmF0aW9uLCBEZGxHZW5lcmF0aW9uVHlwZT4gYnVpbGREZGxHZW5lcmF0aW9uVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPFNjaGVtYUdlbmVyYXRpb24sIERkbEdlbmVyYXRpb25UeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoU2NoZW1hR2VuZXJhdGlvbi5ERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGRsR2VuZXJhdGlvblR5cGVbXSBjaG9pY2VzKCkgewotCQkJCXJldHVybiBEZGxHZW5lcmF0aW9uVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGRsR2VuZXJhdGlvblR5cGUgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QoKS5nZXREZWZhdWx0RGRsR2VuZXJhdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRGRsR2VuZXJhdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBEZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERkbEdlbmVyYXRpb25UeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QoKS5nZXREZGxHZW5lcmF0aW9uVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKERkbEdlbmVyYXRpb25UeXBlIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0KCkuc2V0RGRsR2VuZXJhdGlvblR5cGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZGxHZW5lcmF0aW9uVHlwZUxhYmVsLAotCQkJYnVpbGREZGxHZW5lcmF0aW9uVHlwZUNvbWJvKCBjb250YWluZXIpLAotCQkJbnVsbAkJLy8gVE9ETyBJSnBhSGVscENvbnRleHRJZHMuCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9Ecm9wRGRsRmlsZU5hbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2Y2UzNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9Ecm9wRGRsRmlsZU5hbWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8U2NoZW1hR2VuZXJhdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRyb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlKAotCQkJCQkJCQlBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFNjaGVtYUdlbmVyYXRpb24+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHREcm9wRGRsRmlsZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIFNjaGVtYUdlbmVyYXRpb24uREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9EUk9QX0ZJTEVfTkFNRSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUudGhpcy5kZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdERyb3BEZGxGaWxlTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0RHJvcERkbEZpbGVOYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREcm9wRGRsRmlsZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIFNjaGVtYUdlbmVyYXRpb24uRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQotCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXREcm9wRmlsZU5hbWUoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUudGhpcy5kZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUudGhpcy5kZWZhdWx0VmFsdWUoc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0RHJvcEZpbGVOYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWUoU2NoZW1hR2VuZXJhdGlvbiBzdWJqZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHREcm9wRmlsZU5hbWUoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdEVtcHR5OwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJQ0NvbWJvIGNvbWJvID0gYnVpbGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2Ryb3BEZGxGaWxlTmFtZUxhYmVsLAotCQkJdGhpcy5idWlsZERlZmF1bHREcm9wRGRsRmlsZU5hbWVMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkRHJvcERkbEZpbGVOYW1lSG9sZGVyKCksCi0JCQludWxsCQkvLyBFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLkRST1BfRERMX0ZJTEVfTkFNRQotCQkpOwotCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoY29tYm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MzQ4M2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPFNjaGVtYUdlbmVyYXRpb24+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZSgKLQkJCQkJQWJzdHJhY3RGb3JtUGFuZTxTY2hlbWFHZW5lcmF0aW9uPiBzdWJqZWN0SG9sZGVyLAotCQkJCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGJ1aWxkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvblRpdGxlLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24KLQkJKTsKLQotCQkvLyBEREwgR2VuZXJhdGlvbiBUeXBlOgotCQluZXcgRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJLy8gT3V0cHV0IE1vZGU6Ci0JCW5ldyBPdXRwdXRNb2RlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCS8vIERETCBHZW5lcmF0aW9uIExvY2F0aW9uCi0JCW5ldyBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJLy8gQ3JlYXRlIERETCBGaWxlIE5hbWU6Ci0JCW5ldyBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQkvLyBEcm9wIERETCBGaWxlIE5hbWU6Ci0JCW5ldyBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vT3V0cHV0TW9kZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vT3V0cHV0TW9kZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmZhYzI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL091dHB1dE1vZGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbi5PdXRwdXRNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogT3V0cHV0TW9kZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgT3V0cHV0TW9kZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8U2NoZW1hR2VuZXJhdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk91dHB1dE1vZGVDb21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE91dHB1dE1vZGVDb21wb3NpdGUoCi0JCQkJQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgU2NoZW1hR2VuZXJhdGlvbj4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPFNjaGVtYUdlbmVyYXRpb24sIE91dHB1dE1vZGU+IGJ1aWxkT3V0cHV0TW9kZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPFNjaGVtYUdlbmVyYXRpb24sIE91dHB1dE1vZGU+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3V0cHV0TW9kZVtdIGNob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIE91dHB1dE1vZGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE91dHB1dE1vZGUgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QoKS5nZXREZWZhdWx0T3V0cHV0TW9kZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhPdXRwdXRNb2RlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgT3V0cHV0TW9kZUNvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE91dHB1dE1vZGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdCgpLmdldE91dHB1dE1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShPdXRwdXRNb2RlIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0KCkuc2V0T3V0cHV0TW9kZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJCWNvbnRhaW5lciwKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX291dHB1dE1vZGVMYWJlbCwKLQkJCQl0aGlzLmJ1aWxkT3V0cHV0TW9kZUNvbWJvKGNvbnRhaW5lciksCi0JCQkJbnVsbCAvLyBUT0RPIElKcGFIZWxwQ29udGV4dElkcy4KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL1BlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDY5MDQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL1BlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIKLQlleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8U2NoZW1hR2VuZXJhdGlvbj4KLQlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGU8UGVyc2lzdGVuY2VVbml0PgotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxTY2hlbWFHZW5lcmF0aW9uPiBzdWJqZWN0SG9sZGVyLAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRQYWdlSW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX3RpdGxlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3N0cnVjdHVyZS9FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkM2UwOGQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnN0cnVjdHVyZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuT3JtSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZS5Pcm1JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcgorCWltcGxlbWVudHMgSnBhU3RydWN0dXJlUHJvdmlkZXIKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFTdHJ1Y3R1cmVQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCisJICovCisJcHVibGljIHN0YXRpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gbmV3IE9ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7CisJfQorCQorCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gbmV3IE9ybUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3N0cnVjdHVyZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3N0cnVjdHVyZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTg5ZjdmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZS5QZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5CisJZXh0ZW5kcyBQZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Cit7CisJQE92ZXJyaWRlCisJcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcigKKwkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKKwkJRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyID0gKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOworCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSB7CisJCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlcigoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwkKKwkJfQorCQlyZXR1cm4gc3VwZXIuYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKKwl9CisJCisJCisJcHVibGljIHN0YXRpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIgCisJCWV4dGVuZHMgUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlcgorCXsKKwkJcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlcigKKwkJCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7CisJCQlzdXBlcihwZXJzaXN0ZW5jZVVuaXQsIGNvbnRlbnRQcm92aWRlcik7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgZ2V0TW9kZWwoKSB7CisJCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBzdXBlci5nZXRNb2RlbCgpOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKKwkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiBzcGVjaWZpZWRNYXBwaW5nRmlsZUN2bSA9IAorCQkJCW5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPE1hcHBpbmdGaWxlUmVmPigKKwkJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBNYXBwaW5nRmlsZVJlZj4oCisJCQkJCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX01BUFBJTkdfRklMRV9SRUZTX0xJU1QsCisJCQkJCQlnZXRNb2RlbCgpKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPiBsaXN0SXRlcmF0b3JfKCkgeworCQkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCk7CisJCQkJCX0KKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7CisJCQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCQorCQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8TWFwcGluZ0ZpbGVSZWY+IGltcGxpZWRNYXBwaW5nRmlsZUN2bSA9IAorCQkJCW5ldyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxNYXBwaW5nRmlsZVJlZj4oCisJCQkJCW5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBNYXBwaW5nRmlsZVJlZj4oCisJCQkJCQkJUGVyc2lzdGVuY2VVbml0LklNUExJRURfTUFQUElOR19GSUxFX1JFRl9QUk9QRVJUWSwKKwkJCQkJCQlnZXRNb2RlbCgpKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBidWlsZFZhbHVlXygpIHsKKwkJCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCSk7CisJCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxNYXBwaW5nRmlsZVJlZj4gaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVDdm0gPSAKKwkJCQluZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8TWFwcGluZ0ZpbGVSZWY+KAorCQkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBNYXBwaW5nRmlsZVJlZj4oCisJCQkJCQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQuSU1QTElFRF9FQ0xJUFNFTElOS19NQVBQSU5HX0ZJTEVfUkVGX1BST1BFUlRZLAorCQkJCQkJCWdldE1vZGVsKCkpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJCXJldHVybiBzdWJqZWN0LmdldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkpOworCQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzQ3ZtID0gCisJCQkJbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8Q2xhc3NSZWY+KAorCQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIENsYXNzUmVmPigKKwkJCQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfQ0xBU1NfUkVGU19MSVNULAorCQkJCQkJZ2V0TW9kZWwoKSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxDbGFzc1JlZj4gbGlzdEl0ZXJhdG9yXygpIHsKKwkJCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZENsYXNzUmVmcygpOworCQkJCQl9CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgeworCQkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpOworCQkJCQl9CisJCQkJfSk7CisJCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxDbGFzc1JlZj4gaW1wbGllZENsYXNzQ3ZtID0gCisJCQkJbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgQ2xhc3NSZWY+KAorCQkJCQkJUGVyc2lzdGVuY2VVbml0LklNUExJRURfQ0xBU1NfUkVGU19DT0xMRUNUSU9OLAorCQkJCQkJZ2V0TW9kZWwoKSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPENsYXNzUmVmPiBpdGVyYXRvcl8oKSB7CisJCQkJCQlyZXR1cm4gc3ViamVjdC5pbXBsaWVkQ2xhc3NSZWZzKCk7CisJCQkJCX0KKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7CisJCQkJCQlyZXR1cm4gc3ViamVjdC5pbXBsaWVkQ2xhc3NSZWZzU2l6ZSgpOworCQkJCQl9CisJCQkJfTsKKwkJCUxpc3Q8Q29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4+KDQpOworCQkJbGlzdC5hZGQoc3BlY2lmaWVkTWFwcGluZ0ZpbGVDdm0pOworCQkJbGlzdC5hZGQoaW1wbGllZE1hcHBpbmdGaWxlQ3ZtKTsKKwkJCWxpc3QuYWRkKGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlQ3ZtKTsKKwkJCWxpc3QuYWRkKHNwZWNpZmllZENsYXNzQ3ZtKTsKKwkJCWxpc3QuYWRkKGltcGxpZWRDbGFzc0N2bSk7CisJCQkKKwkJCXJldHVybiBuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+LCBKcGFTdHJ1Y3R1cmVOb2RlPihsaXN0KTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3N0cnVjdHVyZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjM2I1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZS5QZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIKKwlpbXBsZW1lbnRzIEpwYVN0cnVjdHVyZVByb3ZpZGVyCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhU3RydWN0dXJlUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCisJICovCisJcHVibGljIHN0YXRpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBnZXRUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7CisJfQorCQorCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsxXzFKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMV8xSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlZTkxNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMV8xSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLlJlc291cmNlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5EZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbnRpdHlVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFKYXZhUmVzb3VyY2VVaURlZmluaXRpb24gZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMV8xSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsxXzFKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKYXZhVWlGYWN0b3J5IGJ1aWxkSmF2YVVpRmFjdG9yeSgpIHsKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGluazFfMUphdmFVaUZhY3RvcnkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248Pz4+IGRlZmluaXRpb25zKSB7CisJCWRlZmluaXRpb25zLmFkZChEZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbnRpdHlVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMV8xSmF2YVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsxXzFKYXZhVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0NDFiZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMV8xSmF2YVVpRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5FY2xpcHNlTGlua0phdmFVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUxXzFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTFfMUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczFfMUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8xSmF2YVVpRmFjdG9yeSBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVVpRmFjdG9yeQoreworCXB1YmxpYyBFY2xpcHNlTGluazFfMUphdmFVaUZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbnRpdHlDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VudGl0eTFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbWJlZGRhYmxlQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZTFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlMV8xQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlMV8xQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiOGYyMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGUxXzFDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBwYW5lIGRvZXMgbm90IGhhdmUgYW55IHdpZGdldHMuCisgKgorICogQHNlZSBFbWJlZGRhYmxlCisgKiBAc2VlIEphdmFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKKyAqIEBzZWUgRW1iZWRkYWJsZVVpUHJvdmlkZXIKKyAqCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUxXzFDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxKYXZhRW1iZWRkYWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUxXzFDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWluaXRpYWxpemVHZW5lcmFsUGFuZShjb250YWluZXIpOworCQlpbml0aWFsaXplQ29udmVydGVyc1BhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZUFkdmFuY2VkUGFuZShjb250YWluZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOwkKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW1iZWRkYWJsZSwgQWNjZXNzSG9sZGVyPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWNvbnRhaW5lciA9IGFkZENvbGxhcHNhYmxlU2VjdGlvbigKKwkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSwKKwkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jb252ZXJ0ZXJzCisJCSk7CisKKwkJbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUodGhpcywgYnVpbGRDb252ZXJ0ZXJIb2xkZXJWYWx1ZU1vZGVsKCksIGNvbnRhaW5lcik7CisJfQorCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyVmFsdWVNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVtYmVkZGFibGUsIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuICgoSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgdGhpcy5zdWJqZWN0KS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJCX0JCisJCX07CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBZHZhbmNlZFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5MV8xQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHkxXzFDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGFjOTdmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5MV8xQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5BYnN0cmFjdEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkVudGl0eU5hbWVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYWJsZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluazEuMSBKYXZhIGVudGl0eS4KKyAqCisgKiBAc2VlIEphdmFFY2xpcHNlTGlua0VudGl0eQorICogQHNlZSBFY2xpcHNlbGlua0pwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQorICoKKyAqIEB2ZXJzaW9uIDIuMgorICogQHNpbmNlIDIuMgorICovCitwdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rRW50aXR5MV8xQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGU8SmF2YUVudGl0eT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rSmF2YUVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkphdmFFbnRpdHk8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRW50aXR5MV8xQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmFsUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7CisKKwkJbmV3IFRhYmxlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJCW5ldyBFbnRpdHlOYW1lQ29tcG9zaXRlKHRoaXMsIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pKTsJCisJCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pKTsJCisJCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pLCBmYWxzZSk7CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVudGl0eSwgQWNjZXNzSG9sZGVyPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGUoKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczFfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczFfMUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNmRmMDQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMV8xQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkFic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklkQ2xhc3NDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gRWNsaXBzZUxpbmsgSmF2YSBNYXBwZWQgU3VwZXJjbGFzcy4KKyAqCisgKiBAc2VlIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcworICogQHNlZSBFY2xpcHNlbGlua0pwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQorICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczFfMUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMV8xQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOwkKKwkJbmV3IElkQ2xhc3NDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFwcGVkU3VwZXJjbGFzcywgQWNjZXNzSG9sZGVyPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGUoKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MmIyN2IKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5zdHJ1Y3R1cmUuRWNsaXBzZUxpbmsxXzFPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLlJlc291cmNlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGFibGVVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVudGl0eVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwxXzFVaURlZmluaXRpb24gZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtPcm1YbWwxXzFVaURlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT3JtWG1sVWlGYWN0b3J5IGJ1aWxkT3JtWG1sVWlGYWN0b3J5KCkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMV8xVWlGYWN0b3J5KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzVWkoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgeworCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzFfUkVTT1VSQ0VfVFlQRSk7CisJfQorCQorCXB1YmxpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcigpIHsKKwkJcmV0dXJuIEVjbGlwc2VMaW5rMV8xT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmluc3RhbmNlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJCisJCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgeworCQlkZWZpbml0aW9ucy5hZGQoT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMVVpRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGVlMmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8xVWlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkJhc2VFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMV8xVWlGYWN0b3J5IGV4dGVuZHMgQmFzZUVjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5Cit7CisJLy8gKioqKioqKioqKioqKioqKiBvcm0gYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtSWRNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZzFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGVkSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1CYXNpY01hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5MTgzMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICoKKyAqIEB2ZXJzaW9uIDIuMgorICogQHNpbmNlIDIuMgorICovCitwdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nMV8xQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9PbmVNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7CisJfQkKKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2YzZjMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjIKKyAqLworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nMV8xQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb09uZU1hcHBpbmc8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcxXzFDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7CisJfQkKKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDQ0YWE2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzFfMUNvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGluazFfMU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkJhc2ljTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCisJCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKKworCQkvLyBBbGlnbiB0aGUgd2lkZ2V0cyB1bmRlciB0aGUgQ29sdW1uQ29tcG9zaXRlCisJCWNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pOworCQkKKwkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKKwkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgYWRkU3ViUGFuZShjb250YWluZXIsIDQpKTsKKwkJCisJCS8vIE11dGFibGUgd2lkZ2V0cworCQluZXcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkTXV0YWJsZUhvbGRlcigpLCBjb250YWluZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2ljTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwkJCX0KKwkJfTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTUxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlJ3MgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVtYmVkZGVkSWRNYXBwaW5nCisgKgorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4yCisgKi8KK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMV8xQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8RW1iZWRkZWRJZE1hcHBpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rMV8xT3JtRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5FbWJlZGRlZElkTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBPcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMV8xQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOworCisJCW5ldyBFbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUoCisJCQl0aGlzLAorCQkJY29udGFpbmVyCisJCSk7CisJfQkKKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtYmVkZGVkSWRNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3NWFkNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRlZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgRW1iZWRkZWRNYXBwaW5nCisgKgorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4yCisgKi8KK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0VtYmVkZGVkTWFwcGluZzFfMUNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVtYmVkZGVkTWFwcGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkVtYmVkZGVkTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBPcm1FY2xpcHNlTGlua0VtYmVkZGVkTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGVkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKKworCQluZXcgRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlKAorCQkJdGhpcywKKwkJCWNvbnRhaW5lcgorCQkpOworCX0JCisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbWJlZGRlZE1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDEwYzE1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMV8xQ29tcG9zaXRlIGV4dGVuZHMgRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPgorcHVibGljPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SWRNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMV8xQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmFsUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7CisJCQorCQkvLyBDb2x1bW4gd2lkZ2V0cworCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCQorCQkvLyBBbGlnbiB0aGUgd2lkZ2V0cyB1bmRlciB0aGUgQ29sdW1uQ29tcG9zaXRlCisJCWNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pOworCisJCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUodGhpcywgYnVpbGRNdXRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SWRNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NTgyNDkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3JkZXJpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3JkZXJpbmdDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlNYXBwaW5nfQorICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmV9CisgKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBDYXNjYWRlQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgT3JkZXJpbmdDb21wb3NpdGV9CisgKgorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4yCisgKi8KK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlIGV4dGVuZHMgRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvTWFueU1hcHBpbmc8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKwkJCisJCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBNYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBidWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKKwkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOworCQluZXcgT3JkZXJpbmdDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYW55VG9NYW55TWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5MzVjYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIHtAbGluayBNYW55VG9PbmVNYXBwaW5nfQorICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZX0KKyAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIE9wdGlvbmFsQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjIKKyAqLworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmsxXzFNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+TWFueVRvT25lTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKwkJCisJCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsJCQorCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hbnlUb09uZU1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCQl9CisJCX07CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTZmOWMxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3JkZXJpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisKK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGU8VCBleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZz4gCisJZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8VD4KK3sKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKwkJCisJCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBFY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUodGhpcywgYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7CisJCW5ldyBPcmRlcmluZ0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWJjN2MzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEFjY2Vzc1R5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIE9uZVRvT25lTWFwcGluZworICogQHNlZSBBY2Nlc3NUeXBlQ29tcG9zaXRlCisgKiBAc2VlIENhc2NhZGVDb21wb3NpdGUKKyAqIEBzZWUgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUKKyAqIEBzZWUgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUKKyAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCisgKiBAc2VlIE1hcHBlZEJ5UGFuZQorICogQHNlZSBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUKKyAqIEBzZWUgT3B0aW9uYWxDb21wb3NpdGUKKyAqIEBzZWUgVGFyZ2V0RW50aXR5Q29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4yCisgKi8KK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZTxUIGV4dGVuZHMgRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc+CitleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPFQ+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlbGluazFfMU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklPbmVUb09uZU1hcHBpbmc8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCisJCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSh0aGlzLCBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCksIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKKwl9CisJCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T25lVG9PbmVNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTI3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzFfMUNvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5WZXJzaW9uTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nMV8xQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKwkJCisJCS8vIENvbHVtbiB3aWRnZXRzCisJCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKKwkJCisJCS8vIEFsaWduIHRoZSB3aWRnZXRzIHVuZGVyIHRoZSBDb2x1bW5Db21wb3NpdGUKKwkJY29udGFpbmVyID0gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7CisKKwkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKKwkJbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZE11dGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxWZXJzaW9uTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL3BsYXRmb3JtL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGI2ZGQwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLnBsYXRmb3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm0uRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaUZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlGYWN0b3J5IGltcGxlbWVudHMgSnBhUGxhdGZvcm1VaUZhY3RvcnkKK3sKKworCS8qKgorCSAqIFplcm8gYXJnIGNvbnN0cnVjdG9yIGZvciBleHRlbnNpb24gcG9pbnQKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVVpRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgSnBhUGxhdGZvcm1VaSBidWlsZEpwYVBsYXRmb3JtVWkoKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpKAorCQkJbmV3IEVjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXIoKSwKKwkJCUVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmluc3RhbmNlKCkKKwkJKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL3BsYXRmb3JtL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL3BsYXRmb3JtL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlMDIyZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvcGxhdGZvcm0vRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLnBsYXRmb3JtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMuamF2YS5FY2xpcHNlTGluazFfMUphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcgoreworCisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogZGV0YWlscyBwcm92aWRlcnMgKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZERldGFpbHNQcm92aWRlcnNUbyhMaXN0PEpwYURldGFpbHNQcm92aWRlcj4gcHJvdmlkZXJzKSB7CisJCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oTGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rMV8xSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9zdHJ1Y3R1cmUvRWNsaXBzZUxpbmsxXzFPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvc3RydWN0dXJlL0VjbGlwc2VMaW5rMV8xT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2NGI1NQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvc3RydWN0dXJlL0VjbGlwc2VMaW5rMV8xT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLnN0cnVjdHVyZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuT3JtSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZS5Pcm1JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMU9ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcgorCWltcGxlbWVudHMgSnBhU3RydWN0dXJlUHJvdmlkZXIKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFTdHJ1Y3R1cmVQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazFfMU9ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCisJICovCisJcHVibGljIHN0YXRpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmsxXzFPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gbmV3IE9ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7CisJfQorCQorCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gbmV3IE9ybUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWFiNWFmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIHBhbmUgc2hvd3MgdGhlIGNhY2hpbmcgb3B0aW9ucy4KKyAqIDxwPgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCB4IFNoYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgQ2FjaGVUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgIENhY2hlU2l6ZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICA+IEFkdmFuY2VkICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgIAlFeHBpcnlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAJQWx3YXlzUmVmcmVzaENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAJCVJlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgIAlEaXNhYmxlSGl0c0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAJQ2FjaGVDb29yZGluYXRpb25Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgRXhpc3RlbmNlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgRW50aXR5CisgKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZworICogQHNlZSBKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZQorICogQHNlZSBFY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZQorICogQHNlZSBFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUKKyAqIEBzZWUgRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUKKyAqIEBzZWUgRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZQorICoKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlPFQgZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IGV4dGVuZHMgRm9ybVBhbmU8VD4KK3sKKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCisgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAorICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVhYmxlMl8wPiBjYWNoZWFibGVIb2xkZXIgPSBidWlsZENhY2hlYWJsZUhvbGRlcigpOworCQkKKwkJLy9TaGFyZWQgQ2hlY2sgYm94LCB1bmNoZWNrIHRoaXMgYW5kIHRoZSByZXN0IG9mIHRoZSBwYW5lbCBpcyBkaXNhYmxlZAorCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCisJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgOCksCisJCQlKcHRVaURldGFpbHNNZXNzYWdlczJfMC5FbnRpdHlfY2FjaGVhYmxlTGFiZWwsCisJCQlidWlsZFNwZWNpZmllZENhY2hlYWJsZUhvbGRlcihjYWNoZWFibGVIb2xkZXIpLAorCQkJYnVpbGRDYWNoZWFibGVTdHJpbmdIb2xkZXIoY2FjaGVhYmxlSG9sZGVyKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9DQUNIRUFCTEUKKwkJKTsKKworCQlDb21wb3NpdGUgc3ViUGFuZSA9IGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCAxNik7CisKKwkJQ29sbGVjdGlvbjxQYW5lPD8+PiBwYW5lcyA9IG5ldyBBcnJheUxpc3Q8UGFuZTw/Pj4oKTsKKwkJCisJCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUodGhpcywgc3ViUGFuZSkpOworCQlwYW5lcy5hZGQobmV3IEVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlKHRoaXMsIHN1YlBhbmUpKTsKKwkJCisJCS8vIEFkdmFuY2VkIHN1Yi1wYW5lCisJCUNvbXBvc2l0ZSBhZHZhbmNlZFNlY3Rpb24gPSBhZGRDb2xsYXBzYWJsZVN1YlNlY3Rpb24oCisJCQlzdWJQYW5lLAorCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfYWR2YW5jZWQsCisJCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpCisJCSk7CisKKwkJaW5pdGlhbGl6ZUFkdmFuY2VkUGFuZShhZGRTdWJQYW5lKGFkdmFuY2VkU2VjdGlvbiwgMCwgMTYpLCBwYW5lcyk7CisJCQkKKwkJbmV3IFBhbmVFbmFibGVyKGJ1aWxkQ2FjaGVhYmxlRW5hYmxlcihjYWNoZWFibGVIb2xkZXIpLCBwYW5lcyk7CisJCQorCQlpbml0aWFsaXplRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUoYWRkU3ViUGFuZShjb250YWluZXIsIDgpKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZWFibGUyXzA+IGJ1aWxkQ2FjaGVhYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIENhY2hlYWJsZTJfMD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBDYWNoZWFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldENhY2hlYWJsZSgpOworCQkJfQorCQl9OworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBZHZhbmNlZFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgQ29sbGVjdGlvbjxQYW5lPD8+PiBwYW5lcykgeworCQlwYW5lcy5hZGQobmV3IEVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcikpOworCQlwYW5lcy5hZGQobmV3IEVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKKwkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKKwkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcikpOworCQlwYW5lcy5hZGQobmV3IEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcikpOworCX0KKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCk7CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDYWNoZWFibGVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZWFibGUyXzA+IGNhY2hlYWJsZUhvbGRlcikgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoZWFibGUyXzAsIEJvb2xlYW4+KAorCQkJCWNhY2hlYWJsZUhvbGRlciwKKwkJCQlDYWNoZWFibGUyXzAuU1BFQ0lGSUVEX0NBQ0hFQUJMRV9QUk9QRVJUWSwgCisJCQkJQ2FjaGVhYmxlMl8wLkRFRkFVTFRfQ0FDSEVBQkxFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzQ2FjaGVhYmxlKCkpOworCQkJfQorCQl9OworCX0JCisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNwZWNpZmllZENhY2hlYWJsZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVhYmxlMl8wPiBjYWNoZWFibGVIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGVhYmxlMl8wLCBCb29sZWFuPihjYWNoZWFibGVIb2xkZXIsIENhY2hlYWJsZTJfMC5TUEVDSUZJRURfQ0FDSEVBQkxFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ2FjaGVhYmxlU3RyaW5nSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZWFibGUyXzA+IGNhY2hlYWJsZUhvbGRlcikgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0Q2FjaGVhYmxlSG9sZGVyKGNhY2hlYWJsZUhvbGRlcikpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7CisJCQkJCXJldHVybiBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlczJfMC5FbnRpdHlfY2FjaGVhYmxlV2l0aERlZmF1bHRMYWJlbCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKwkJCQl9CisJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVudGl0eV9jYWNoZWFibGVMYWJlbDsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0Q2FjaGVhYmxlSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZWFibGUyXzA+IGNhY2hlYWJsZUhvbGRlcikgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoZWFibGUyXzAsIEJvb2xlYW4+KAorCQkJY2FjaGVhYmxlSG9sZGVyLAorCQkJQ2FjaGVhYmxlMl8wLlNQRUNJRklFRF9DQUNIRUFCTEVfUFJPUEVSVFksCisJCQlDYWNoZWFibGUyXzAuREVGQVVMVF9DQUNIRUFCTEVfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazJfMEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjRhYmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazJfMEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW50aXR5VWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLk51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazJfMEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCisJICovCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSmF2YVVpRmFjdG9yeSBidWlsZEphdmFVaUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmsyXzBKYXZhVWlGYWN0b3J5KCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7CisJCWRlZmluaXRpb25zLmFkZChKYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKworCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248Pz4+IGRlZmluaXRpb25zKSB7CisJCWRlZmluaXRpb25zLmFkZChEZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbnRpdHlVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2YTg3NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YVVpRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMuamF2YS5FY2xpcHNlTGluazFfMUphdmFVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qcGEyLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIEVjbGlwc2VMaW5rMl8wSnBhVWlGYWN0b3J5CisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFVaUZhY3RvcnkKKwlleHRlbmRzIEVjbGlwc2VMaW5rMV8xSmF2YVVpRmFjdG9yeQorCWltcGxlbWVudHMgSmF2YVVpRmFjdG9yeTJfMAoreworCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFVaUZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfQorCisJCisJLy8gKioqKioqKioqKioqKioqKiBqYXZhIHR5cGUgbWFwcGluZyBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVudGl0eUNvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rRW50aXR5Ml8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUlkTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwgCisJCQlDb21wb3NpdGUgcGFyZW50LCAKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJQ29tcG9zaXRlIHBhcmVudCwKKwkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJQ29tcG9zaXRlIHBhcmVudCwKKwkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmNkOGUyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCisgKiA8cD4KKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVudGl0eQorICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKKyAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKKyAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKKyAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCisgKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCisgKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGU8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4KK3sKKworCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCisgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPiBzdWJqZWN0SG9sZGVyLAorICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgeworCQluZXcgSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUodGhpcywgcGFyZW50KTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHkyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmNhMTFiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5BYnN0cmFjdEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkVudGl0eU5hbWVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYWJsZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkdlbmVyYXRpb24yXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gRWNsaXBzZUxpbmsxLjEgSmF2YSBlbnRpdHkuCisgKgorICogQHNlZSBKYXZhRWNsaXBzZUxpbmtFbnRpdHkKKyAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjIKKyAqLworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlPEphdmFFbnRpdHk+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0phdmFFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5KYXZhRW50aXR5PC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEphdmFFY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCisJCW5ldyBUYWJsZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCQluZXcgRW50aXR5TmFtZUNvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKSk7CQorCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKSk7CQorCQluZXcgSWRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKSwgZmFsc2UpOworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbnRpdHksIEFjY2Vzc0hvbGRlcj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7CisJCQl9CisJCX07CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBFbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmF0b3JzQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGdlbmVyYXRvckNvbnRhaW5lckhvbGRlcikgeworCQluZXcgR2VuZXJhdGlvbjJfMENvbXBvc2l0ZSh0aGlzLCBnZW5lcmF0b3JDb250YWluZXJIb2xkZXIsIGNvbnRhaW5lcik7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZENhY2hpbmdDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NhY2hpbmc+IGNhY2hpbmdIb2xkZXIpIHsKKwkJbmV3IEphdmFFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUodGhpcywgY2FjaGluZ0hvbGRlciwgY29udGFpbmVyKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNTIwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRlbXBvcmFsVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLklkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgR2VuZXJhdGlvbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgSWRNYXBwaW5nCisgKiBAc2VlIEphdmFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKKyAqIEBzZWUgQ29sdW1uQ29tcG9zaXRlCisgKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQorICogQHNlZSBJZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SWRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUlkTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKGNvbnRhaW5lcik7CisJCWluaXRpYWxpemVUeXBlUGFuZShjb250YWluZXIpOworCisJCS8vIEdlbmVyYXRpb24gcGFuZQorCQluZXcgSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KKwkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3ZGFjNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5EZXJpdmVkSWQyXzBQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBEZXJpdmVkSWQyXzBQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIHtAbGluayBKYXZhTWFueVRvT25lTWFwcGluZzJfMH0KKyAqIEBzZWUge0BsaW5rIFRhcmdldEVudGl0eUNvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIERlcml2ZWRJZDJfMFBhbmV9CisgKiBAc2VlIHtAbGluayBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lfQorICogQHNlZSB7QGxpbmsgRmV0Y2hUeXBlQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgT3B0aW9uYWxDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBDYXNjYWRlQ29tcG9zaXRlfQorICovCitwdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA+CisJZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8VD4KK3sKKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQkKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7CisJCQorCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRGVyaXZlZElkMl8wUGFuZSh0aGlzLCBidWlsZERlcml2ZWRJZEhvbGRlcigpLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksICBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmVhNmFmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5BYnN0cmFjdEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoZSBwYW5lIHVzZWQgZm9yIGFuIEVjbGlwc2VMaW5rIEphdmEgTWFwcGVkIFN1cGVyY2xhc3MuCisgKgorICogQHNlZSBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MKKyAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKKyAqCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsJCisJCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YU1hcHBlZFN1cGVyY2xhc3MsIEFjY2Vzc0hvbGRlcj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7CisJCQl9CisJCX07CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2FjaGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gY2FjaGluZ0hvbGRlcikgeworCQluZXcgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZSh0aGlzLCBjYWNoaW5nSG9sZGVyLCBjb250YWluZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1MzQyNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWxIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9yZGVyaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9ycGhhblJlbW92YWwyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBFY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSB7QGxpbmsgSmF2YU9uZVRvTWFueU1hcHBpbmcyXzB9CisgKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBFY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmV9CisgKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBPcmRlcmluZ0NvbXBvc2l0ZX0KKyAqLworcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGU8VCBleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMD4KKwlleHRlbmRzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxUPgoreworCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQkKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gdGhpcy5nZXRHcm91cEJveE1hcmdpbigpOworCQkKKwkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIHRoaXMuYnVpbGRFY2xpcHNlTGlua0pvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKKwkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgdGhpcy5hZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCksIHRoaXMuYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRDYXNjYWRlSG9sZGVyKCksIHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKKwkJbmV3IE9yZGVyaW5nQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gYnVpbGRFY2xpcHNlTGlua0pvaW5pbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSB0cmFuc2Zvcm1fKFQgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtKb2luRmV0Y2g+IGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgRWNsaXBzZUxpbmtKb2luRmV0Y2g+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaCBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEpvaW5GZXRjaCgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPiBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UHJpdmF0ZU93bmVkKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JwaGFuUmVtb3ZhYmxlMl8wPiBidWlsZE9ycGhhblJlbW92YWJsZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wLCBPcnBoYW5SZW1vdmFibGUyXzA+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBPcnBoYW5SZW1vdmFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuICgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgdGhpcy5zdWJqZWN0KS5nZXRPcnBoYW5SZW1vdmFsKCk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjN2U4MAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkRlcml2ZWRJZDJfMFBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRGVyaXZlZElkMl8wUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIHtAbGluayBKYXZhT25lVG9PbmVNYXBwaW5nMl8wfQorICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgRGVyaXZlZElkMl8wUGFuZX0KKyAqIEBzZWUge0BsaW5rIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZX0KKyAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIE9wdGlvbmFsQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGV9CisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8VCBleHRlbmRzIEphdmFPbmVUb09uZU1hcHBpbmcyXzA+CisJZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxUPgoreworCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCQorCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gdGhpcy5nZXRHcm91cEJveE1hcmdpbigpOworCQkKKwkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRGVyaXZlZElkMl8wUGFuZSh0aGlzLCB0aGlzLmJ1aWxkRGVyaXZlZElkSG9sZGVyKCksIHRoaXMuYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgdGhpcy5idWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKKwkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgdGhpcy5hZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIHRoaXMuYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSwgdGhpcy5hZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZE9ycGhhblJlbW92YWJsZUhvbGRlcigpLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOworCX0KKwkKKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rSm9pbkZldGNoPiBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rSm9pbkZldGNoPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2ggYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0Sm9pbkZldGNoKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQcml2YXRlT3duZWQ+IGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0UHJpdmF0ZU93bmVkKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JwaGFuUmVtb3ZhYmxlMl8wPiBidWlsZE9ycGhhblJlbW92YWJsZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YU9uZVRvT25lTWFwcGluZzJfMCwgT3JwaGFuUmVtb3ZhYmxlMl8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiAoKE9ycGhhblJlbW92YWxIb2xkZXIyXzApIHRoaXMuc3ViamVjdCkuZ2V0T3JwaGFuUmVtb3ZhbCgpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOGQ5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZS5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLlNjaGVtYUNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBhY2thZ2VDaG9vc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1RdWVyaWVzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnMyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgWG1sUGFja2FnZUNob29zZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBTY2hlbWE6ICAgICAgfCBTY2hlbWFDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBDYXRhbG9nOiAgICAgfCBDYXRhbG9nQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBBY2Nlc3MgVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKKyAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9ybVF1ZXJpZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQ29udmVydGVyc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgRW50aXR5TWFwcGluZ3MKKyAqIEBzZWUgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqIEBzZWUgQ2F0YWxvZ0NvbWJvCisgKiBAc2VlIEVudW1Gb3JtQ29tYm9WaWV3ZXIKKyAqIEBzZWUgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlCisgKiBAc2VlIE9ybVBhY2thZ2VDaG9vc2VyCisgKiBAc2VlIE9ybVF1ZXJpZXNDb21wb3NpdGUKKyAqIEBzZWUgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUKKyAqIEBzZWUgU2NoZW1hQ29tYm8KKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZSBleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYnVpbGRFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzMl8wQ29tcG9zaXRlKAorCQkJdGhpcywKKwkJCWNvbnRhaW5lcgorCQkpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzYzQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHtAbGluayBKcGFEZXRhaWxzUGFnZX0KKyAqIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIFhNTCBmaWxlIChlaXRoZXIgZnJvbSB0aGUgcGVyc2lzdGVuY2UKKyAqIGNvbmZpZ3VyYXRpb24gb3IgZnJvbSB0aGUgTWFwcGluZ3MgRGVzY3JpcHRvcikuCisgKgorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4yCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyCisJZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhRGV0YWlsc1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIoKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnBhRGV0YWlsc1Byb3ZpZGVyIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBwcm92aWRlc0RldGFpbHMoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgeworCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRSk7CisJfQorCQorCXB1YmxpYyBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gYnVpbGREZXRhaWxzUGFnZSgKKwkJQ29tcG9zaXRlIHBhcmVudCwKKwkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkNmQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzBVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLnN0cnVjdHVyZS5FY2xpcHNlTGluazFfMU9ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW50aXR5VWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1JZE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwyXzBVaURlZmluaXRpb24gZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzBVaURlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEVjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT3JtWG1sVWlGYWN0b3J5IGJ1aWxkT3JtWG1sVWlGYWN0b3J5KCkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMl8wVWlGYWN0b3J5KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzVWkoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgeworCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRSk7CisJfQorCQorCXB1YmxpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcigpIHsKKwkJLy9UT0RPIG5lZWQgYSAyXzAgc3RydWN0dXJlIHByb3ZpZGVyCisJCXJldHVybiBFY2xpcHNlTGluazFfMU9ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5pbnN0YW5jZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7CisJCWRlZmluaXRpb25zLmFkZChPcm1JZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCQorCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCQorCQlkZWZpbml0aW9ucy5hZGQoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7CisJCWRlZmluaXRpb25zLmFkZChPcm1FbnRpdHlVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzYmNiNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzBVaUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQmFzZUVjbGlwc2VMaW5rT3JtWG1sVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nMV8xQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcxXzFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nMV8xQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qcGEyLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwyXzBVaUZhY3RvcnkgCisJZXh0ZW5kcyBCYXNlRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkKKwlpbXBsZW1lbnRzIE9ybVhtbFVpRmFjdG9yeTJfMAoreworCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW50aXR5Q29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJLy8gKioqKioqKioqKioqKioqKiBvcm0gYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtSWRNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1CYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1WZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlNjNjYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCisgKiA8cD4KKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVudGl0eQorICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKKyAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKKyAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKKyAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCisgKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCisgKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZTxPcm1FY2xpcHNlTGlua0NhY2hpbmc+Cit7CisKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCisgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua0NhY2hpbmc+IHN1YmplY3RIb2xkZXIsCisgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7CisJCW5ldyBPcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHkyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHkyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjk5ZTE4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuRW50aXR5Ml8wT3ZlcnJpZGVzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuR2VuZXJhdGlvbjJfMENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtFbnRpdHkyXzBDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlCit7CisJcHVibGljIE9ybUVjbGlwc2VMaW5rRW50aXR5Ml8wQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJbmV3IEVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZEdlbmVyYXRvcnNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9yQ29udGFpbmVySG9sZGVyKSB7CisJCW5ldyBHZW5lcmF0aW9uMl8wQ29tcG9zaXRlKHRoaXMsIGdlbmVyYXRvckNvbnRhaW5lckhvbGRlciwgY29udGFpbmVyKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2FjaGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWNsaXBzZUxpbmtDYWNoaW5nPiBjYWNoaW5nSG9sZGVyKSB7CisJCW5ldyBPcm1FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUodGhpcywgY2FjaGluZ0hvbGRlciwgY29udGFpbmVyKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzBlMzUzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMV8xQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZzFfMUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+CitwdWJsaWM8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JZE1hcHBpbmc8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQkKKwkJLy8gQ29sdW1uIHdpZGdldHMKKwkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOworCisJCWluaXRpYWxpemVUeXBlUGFuZShjb250YWluZXIpOworCisJCS8vIEdlbmVyYXRpb24gcGFuZQorCQluZXcgSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMTApKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTdkZTA2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5EZXJpdmVkSWQyXzBQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRGVyaXZlZElkMl8wUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSB7QGxpbmsgSmF2YU1hbnlUb09uZU1hcHBpbmcyXzB9CisgKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBEZXJpdmVkSWQyXzBQYW5lfQorICogQHNlZSB7QGxpbmsgTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZX0KKyAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIE9wdGlvbmFsQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KKyAqLworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgT3JtTWFueVRvT25lTWFwcGluZzJfMD4KKwlleHRlbmRzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxUPgoreworCXB1YmxpYyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCQkKKwkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IERlcml2ZWRJZDJfMFBhbmUodGhpcywgYnVpbGREZXJpdmVkSWRIb2xkZXIoKSwgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtTWFueVRvT25lTWFwcGluZzJfMCwgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwkJCX0KKwkJfTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MWNlZjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlPFQgZXh0ZW5kcyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgPiBleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlPFQ+Cit7CisJcHVibGljIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRDYWNoaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua0NhY2hpbmc+IGNhY2hpbmdIb2xkZXIpIHsKKwkJbmV3IE9ybUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZSh0aGlzLCBjYWNoaW5nSG9sZGVyLCBjb250YWluZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNTUzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcmRlcmluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBFY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBBY2Nlc3NUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBPbmVUb01hbnlNYXBwaW5nCisgKiBAc2VlIFRhcmdldEVudGl0eUNvbXBvc2l0ZQorICogQHNlZSBFY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUKKyAqIEBzZWUgQWNjZXNzVHlwZUNvbXBvc2l0ZQorICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKKyAqIEBzZWUgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUKKyAqIEBzZWUgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUKKyAqIEBzZWUgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZQorICogQHNlZSBDYXNjYWRlQ29tcG9zaXRlCisgKiBAc2VlIE9yZGVyaW5nQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGU8VCBleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMD4gCisJZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8VD4KK3sKKwlwdWJsaWMgT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gdGhpcy5nZXRHcm91cEJveE1hcmdpbigpOworCQkKKwkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIHRoaXMuYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgdGhpcy5hZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgdGhpcy5hZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCksIHRoaXMuYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRDYXNjYWRlSG9sZGVyKCksIHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKKwkJbmV3IE9yZGVyaW5nQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T25lVG9NYW55TWFwcGluZywgQWNjZXNzSG9sZGVyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9ycGhhblJlbW92YWJsZTJfMD4gYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIE9ycGhhblJlbW92YWJsZTJfMD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIE9ycGhhblJlbW92YWJsZTJfMCBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldE9ycGhhblJlbW92YWwoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1MzBlMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkFic3RyYWN0T25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuRGVyaXZlZElkMl8wUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9ycGhhblJlbW92YWwyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBEZXJpdmVkSWQyXzBQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIHtAbGluayBKYXZhT25lVG9PbmVNYXBwaW5nMl8wfQorICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgRGVyaXZlZElkMl8wUGFuZX0KKyAqIEBzZWUge0BsaW5rIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZX0KKyAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIE9wdGlvbmFsQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KKyAqLworcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlPFQgZXh0ZW5kcyBPcm1PbmVUb09uZU1hcHBpbmcyXzA+CisJZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxUPgoreworCXB1YmxpYyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCQkKKworCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRGVyaXZlZElkMl8wUGFuZSh0aGlzLCBidWlsZERlcml2ZWRJZEhvbGRlcigpLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBidWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKKwkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSwgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSwgdGhpcy5hZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7CisJfQorCQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T25lVG9PbmVNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rSm9pbkZldGNoPiBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rSm9pbkZldGNoPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPiBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgdGhpcy5zdWJqZWN0KS5nZXRQcml2YXRlT3duZWQoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxPcnBoYW5SZW1vdmFibGUyXzA+IGJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBPcnBoYW5SZW1vdmFibGUyXzA+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBPcnBoYW5SZW1vdmFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuICgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgdGhpcy5zdWJqZWN0KS5nZXRPcnBoYW5SZW1vdmFsKCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWZlYzBmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnMyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmcuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5jYWNoaW5nLlBlcnNpc3RlbmNlWG1sQ2FjaGluZzJfMFRhYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zLlBlcnNpc3RlbmNlWG1sT3B0aW9uczJfMFRhYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkKK3sKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCisJCisJcHVibGljIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLy8gKioqKioqKioqKiBwZXJzaXN0ZW5jZSB1bml0IHRhYnMgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYjxDYWNoaW5nPiBidWlsZENhY2hpbmdUYWIoCisJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAorCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBjYWNoaW5nSG9sZGVyID0gdGhpcy5idWlsZENhY2hpbmdIb2xkZXIoc3ViamVjdEhvbGRlcik7CisKKwkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVhtbENhY2hpbmcyXzBUYWIoY2FjaGluZ0hvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYjxPcHRpb25zMl8wPiBidWlsZE9wdGlvbnNUYWIoCisJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKKwkJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9uczJfMD4gb3B0aW9uczJfMEhvbGRlciA9IHRoaXMuYnVpbGRPcHRpb25zMl8wSG9sZGVyKHN1YmplY3RIb2xkZXIpOworCisJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxPcHRpb25zMl8wVGFiKG9wdGlvbnMyXzBIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJLy8gKioqKioqKioqKiBwcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9uczJfMD4gYnVpbGRPcHRpb25zMl8wSG9sZGVyKAorCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQsIE9wdGlvbnMyXzA+KHN1YmplY3RIb2xkZXIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIE9wdGlvbnMyXzAgdHJhbnNmb3JtXyhQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKKworCQkJCXJldHVybiAoT3B0aW9uczJfMCkgKChQZXJzaXN0ZW5jZVVuaXQyXzApdmFsdWUpLmdldE9wdGlvbnMoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOWMzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uIGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCisJICovCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5IGJ1aWxkUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKKwkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMl8wX1JFU09VUkNFX1RZUEUpOworCX0KKwkKKwlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKSB7CisJCXJldHVybiBFY2xpcHNlTGlua1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmluc3RhbmNlKCk7CisJCS8vVE9ETyBkbyB3ZSBuZWVkIGFuIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2UyXzBSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI/PworLy8JCXJldHVybiBQZXJzaXN0ZW5jZTJfMFJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5pbnN0YW5jZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZURlZmF1bHRzMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVEZWZhdWx0czJfMENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOTU0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVEZWZhdWx0czJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5jYWNoaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZy5EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkRlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIENhY2hlRGVmYXVsdHMyXzBDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIENhY2hlRGVmYXVsdHMyXzBDb21wb3NpdGUgZXh0ZW5kcyBDYWNoZURlZmF1bHRzQ29tcG9zaXRlPENhY2hpbmc+Cit7CisJcHVibGljIENhY2hlRGVmYXVsdHMyXzBDb21wb3NpdGUoRm9ybVBhbmU8Q2FjaGluZz4gc3ViamVjdEhvbGRlciwKKyAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcik7CisJfQorCQkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCXN1cGVyLmluaXRpYWxpemVMYXlvdXQocGFyZW50KTsKKworCQkJdGhpcy5pbnN0YWxsUGFuZUVuYWJsZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZXMoQ29tcG9zaXRlIHBhcmVudCkgeworCisJCS8vIERlZmF1bHQgQ2FjaGUgVHlwZQorCQluZXcgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOworCisJCS8vIERlZmF1bHQgQ2FjaGUgU2l6ZQorCQluZXcgRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZTxDYWNoaW5nPih0aGlzLCBwYXJlbnQpOworCisJfQorCisJLy8gKioqKioqKioqKiBwcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgorCisJcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lRW5hYmxlcigpIHsKKwkJbmV3IFBhbmVFbmFibGVyKHRoaXMuYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpLCB0aGlzKTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxTaGFyZWRDYWNoZU1vZGUsIEJvb2xlYW4+KHRoaXMuYnVpbGRTaGFyZWRDYWNoZU1vZGVIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oU2hhcmVkQ2FjaGVNb2RlIHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlICE9IFNoYXJlZENhY2hlTW9kZS5OT05FOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFNoYXJlZENhY2hlTW9kZT4gYnVpbGRTaGFyZWRDYWNoZU1vZGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdDJfMCwgU2hhcmVkQ2FjaGVNb2RlPigKKwkJCQkJCQkJdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpLCAKKwkJCQkJCQkJUGVyc2lzdGVuY2VVbml0Ml8wLlNQRUNJRklFRF9TSEFSRURfQ0FDSEVfTU9ERV9QUk9QRVJUWSwgCisJCQkJCQkJCVBlcnNpc3RlbmNlVW5pdDJfMC5ERUZBVUxUX1NIQVJFRF9DQUNIRV9NT0RFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTaGFyZWRDYWNoZU1vZGUgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTaGFyZWRDYWNoZU1vZGUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQyXzA+IGJ1aWxkUGVyc2lzdGVuY2VVbml0Ml8wSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBQZXJzaXN0ZW5jZVVuaXQyXzA+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQyXzAgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIChQZXJzaXN0ZW5jZVVuaXQyXzApIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2NhY2hpbmcvRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2NhY2hpbmcvRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4N2ZhYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UuY2FjaGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIEVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlIGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlPENhY2hpbmc+Cit7CisJcHVibGljIEVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZSgKKwkJCUZvcm1QYW5lPENhY2hpbmc+IHN1YmplY3RIb2xkZXIsIAorCQkJQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgeworCisJCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0aGlzLmFkZFNlY3Rpb24oCisJCQlwYXJlbnQsCisJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NlY3Rpb25UaXRsZSwKKwkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uCisJCSk7CisKKwkJLy8gU2hhcmVkQ2FjaGVNb2RlCisJCW5ldyBTaGFyZWRDYWNoZU1vZGVDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpLCBjb250YWluZXIpOworCQkvLyBEZWZhdWx0cworCQluZXcgQ2FjaGVEZWZhdWx0czJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCQkvLyBGbHVzaCBDbGVhciBDYWNoZQorCQluZXcgRmx1c2hDbGVhckNhY2hlMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0Ml8wPiBidWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgUGVyc2lzdGVuY2VVbml0Ml8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0Ml8wIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0Ml8wKSB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCQl9CisJCX07CisJfQorCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9GbHVzaENsZWFyQ2FjaGUyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9GbHVzaENsZWFyQ2FjaGUyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzQ4ZjhmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0ZsdXNoQ2xlYXJDYWNoZTJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5jYWNoaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmcuRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqICBGbHVzaENsZWFyQ2FjaGUyXzBDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEZsdXNoQ2xlYXJDYWNoZTJfMENvbXBvc2l0ZSBleHRlbmRzIEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Rmx1c2hDbGVhckNhY2hlMl8wQ29tcG9zaXRlPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBGbHVzaENsZWFyQ2FjaGUyXzBDb21wb3NpdGUoCisJCQkJRm9ybVBhbmU8PyBleHRlbmRzIENhY2hpbmc+IHBhcmVudENvbXBvc2l0ZSwgCisJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCQkKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgeworCQlzdXBlci5pbml0aWFsaXplTGF5b3V0KHBhcmVudCk7CisKKwkJdGhpcy5pbnN0YWxsUGFuZUVuYWJsZXIoKTsKKwl9CisKKwkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCisKKwlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKCkgeworCQluZXcgUGFuZUVuYWJsZXIodGhpcy5idWlsZFBhbmVFbmFibGVySG9sZGVyKCksIHRoaXMpOworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFNoYXJlZENhY2hlTW9kZSwgQm9vbGVhbj4odGhpcy5idWlsZFNoYXJlZENhY2hlTW9kZUhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShTaGFyZWRDYWNoZU1vZGUgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUgIT0gU2hhcmVkQ2FjaGVNb2RlLk5PTkU7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U2hhcmVkQ2FjaGVNb2RlPiBidWlsZFNoYXJlZENhY2hlTW9kZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0Ml8wLCBTaGFyZWRDYWNoZU1vZGU+KAorCQkJCQkJCQl0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0Ml8wSG9sZGVyKCksIAorCQkJCQkJCQlQZXJzaXN0ZW5jZVVuaXQyXzAuU1BFQ0lGSUVEX1NIQVJFRF9DQUNIRV9NT0RFX1BST1BFUlRZLCAKKwkJCQkJCQkJUGVyc2lzdGVuY2VVbml0Ml8wLkRFRkFVTFRfU0hBUkVEX0NBQ0hFX01PREVfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFNoYXJlZENhY2hlTW9kZSBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNoYXJlZENhY2hlTW9kZSgpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdDJfMD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXQyXzBIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIFBlcnNpc3RlbmNlVW5pdDJfMD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdDJfMCBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdDJfMCkgdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmcyXzBUYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmcyXzBUYWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDI0NDdiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL1BlcnNpc3RlbmNlWG1sQ2FjaGluZzJfMFRhYi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5jYWNoaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmcuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIFBlcnNpc3RlbmNlWG1sQ2FjaGluZzJfMFRhYgorICovCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxDYWNoaW5nMl8wVGFiIGV4dGVuZHMgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiPENhY2hpbmc+Cit7CisJcHVibGljIFBlcnNpc3RlbmNlWG1sQ2FjaGluZzJfMFRhYigKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKyAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQkKKwkJbmV3IEVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjUwOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uczJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9ucy5FY2xpcHNlTGlua09wdGlvbnNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqICBFY2xpcHNlTGlua09wdGlvbnMyXzBDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3B0aW9uczJfMENvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZTxPcHRpb25zMl8wPgoreworCXB1YmxpYyBFY2xpcHNlTGlua09wdGlvbnMyXzBDb21wb3NpdGUoCisJCQlGb3JtUGFuZTxPcHRpb25zMl8wPiBzdWJqZWN0SG9sZGVyLCAKKwkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGluaXRpYWxpemVNaXNjZWxsYW5lb3VzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CQorCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuaW5pdGlhbGl6ZU1pc2NlbGxhbmVvdXNQYW5lKGNvbnRhaW5lcik7CisKKwkJbmV3IExvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7CisJCW5ldyBRdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKKwkJbmV3IFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7CisJCXJldHVybiBjb21wb3NpdGU7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTY1OGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2Uub3B0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnMyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuSnB0Ml8wVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5JbnRlZ2VyQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIExvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPE9wdGlvbnMyXzA+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBMb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZSgKKwkJCQkJRm9ybVBhbmU8T3B0aW9uczJfMD4gcGFyZW50Q29tcG9zaXRlLCAKKwkJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJYWRkTG9ja1RpbWVvdXRDb21ibyhjb250YWluZXIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgYWRkTG9ja1RpbWVvdXRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBJbnRlZ2VyQ29tYm88T3B0aW9uczJfMD4odGhpcywgY29udGFpbmVyKSB7CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJcmV0dXJuIEpwdDJfMFVpTWVzc2FnZXMuTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGVfbG9ja1RpbWVvdXRMYWJlbDsKKwkJCX0KKwkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgeworCQkJCXJldHVybiBudWxsOwkJLy8gVE9ETworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMyXzAsIEludGVnZXI+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdExvY2tUaW1lb3V0KCk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zMl8wLCBJbnRlZ2VyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9uczJfMC5MT0NLX1RJTUVPVVRfUFJPUEVSVFkpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRMb2NrVGltZW91dCgpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7CisJCQkJCQl0aGlzLnN1YmplY3Quc2V0TG9ja1RpbWVvdXQodmFsdWUpOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1BlcnNpc3RlbmNlWG1sT3B0aW9uczJfMFRhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1BlcnNpc3RlbmNlWG1sT3B0aW9uczJfMFRhYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjM3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvUGVyc2lzdGVuY2VYbWxPcHRpb25zMl8wVGFiLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLm9wdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqICBQZXJzaXN0ZW5jZVhtbE9wdGlvbnMyXzBUYWIKKyAqLworcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sT3B0aW9uczJfMFRhYiBleHRlbmRzIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYjxPcHRpb25zMl8wPgoreworCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKKwlwdWJsaWMgUGVyc2lzdGVuY2VYbWxPcHRpb25zMl8wVGFiKAorCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zMl8wPiBzdWJqZWN0SG9sZGVyLCAKKwkJCQlDb21wb3NpdGUgcGFyZW50LCAKKwkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBFY2xpcHNlTGlua09wdGlvbnMyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9RdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9RdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmIzYmIxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1F1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5KcHQyXzBVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBRdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxPcHRpb25zMl8wPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIFF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZSgKKwkJCQkJRm9ybVBhbmU8T3B0aW9uczJfMD4gcGFyZW50Q29tcG9zaXRlLAorCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQl0aGlzLmFkZFF1ZXJ5VGltZW91dENvbWJvKGNvbnRhaW5lcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBhZGRRdWVyeVRpbWVvdXRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBJbnRlZ2VyQ29tYm88T3B0aW9uczJfMD4odGhpcywgY29udGFpbmVyKSB7CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJcmV0dXJuIEpwdDJfMFVpTWVzc2FnZXMuUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlX3F1ZXJ5VGltZW91dExhYmVsOworCQkJfQorCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7CisJCQkJcmV0dXJuIG51bGw7CQkvLyBUT0RPCisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7CisJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9uczJfMCwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0UXVlcnlUaW1lb3V0KCk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zMl8wLCBJbnRlZ2VyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9uczJfMC5RVUVSWV9USU1FT1VUX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnlUaW1lb3V0KCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKKwkJCQkJCXRoaXMuc3ViamVjdC5zZXRRdWVyeVRpbWVvdXQodmFsdWUpOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDViZjlhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLkpwdDJfMFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPE9wdGlvbnMyXzA+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW9uR3JvdXBDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUoCisJCQkJCUZvcm1QYW5lPE9wdGlvbnMyXzA+IHBhcmVudENvbXBvc2l0ZSwKKwkJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQkvLyBWYWxpZGF0aW9uTW9kZQorCQluZXcgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpLCBwYXJlbnQpOworCisJCS8vIEdyb3VwUHJlUGVyc2lzdAorCQl0aGlzLmFkZExhYmVsZWRUZXh0KAorCQkJcGFyZW50LAorCQkJSnB0Ml8wVWlNZXNzYWdlcy5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9ncm91cFByZVBlcnNpc3RMYWJlbCwKKwkJCXRoaXMuYnVpbGRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0SG9sZGVyKCkKKwkJKTsKKworCQkvLyBWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUKKwkJdGhpcy5hZGRMYWJlbGVkVGV4dCgKKwkJCXBhcmVudCwKKwkJCUpwdDJfMFVpTWVzc2FnZXMuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGVfZ3JvdXBQcmVVcGRhdGVMYWJlbCwKKwkJCXRoaXMuYnVpbGRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVIb2xkZXIoKQorCQkpOworCisJCS8vIFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZQorCQl0aGlzLmFkZExhYmVsZWRUZXh0KAorCQkJcGFyZW50LAorCQkJSnB0Ml8wVWlNZXNzYWdlcy5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9ncm91cFByZVJlbW92ZUxhYmVsLAorCQkJdGhpcy5idWlsZFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUhvbGRlcigpCisJCSk7CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdDJfMD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXQyXzBIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9uczJfMCwgUGVyc2lzdGVuY2VVbml0Ml8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0Ml8wIHRyYW5zZm9ybV8oT3B0aW9uczJfMCB2YWx1ZSkgeworCQkJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0Ml8wKSB2YWx1ZS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zMl8wLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKwkJCQl0aGlzLnN1YmplY3Quc2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zMl8wLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5zdWJqZWN0LnNldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zMl8wLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5zdWJqZWN0LnNldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhZWM0YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlZhbGlkYXRpb25Nb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLkpwdDJfMFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqICBWYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxQZXJzaXN0ZW5jZVVuaXQyXzA+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZTwvY29kZT4uCisJICogCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUoCisJCQkJRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwKKwkJICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdDJfMD4gc3ViamVjdEhvbGRlciwKKwkJICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwkJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7CisJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCXBhcmVudCwKKwkJCQlKcHQyXzBVaU1lc3NhZ2VzLlZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlX3ZhbGlkYXRpb25Nb2RlTGFiZWwsCisJCQkJdGhpcy5hZGRWYWxpZGF0aW9uTW9kZUNvbWJvKHBhcmVudCksCisJCQkJbnVsbAkJCS8vIFRPRE8KKwkJKTsKKwl9CisKKwlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0Ml8wLCBWYWxpZGF0aW9uTW9kZT4gYWRkVmFsaWRhdGlvbk1vZGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7CisJCQorCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0Ml8wLCBWYWxpZGF0aW9uTW9kZT4odGhpcywgdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIHBhcmVudCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXQyXzAuU1BFQ0lGSUVEX1ZBTElEQVRJT05fTU9ERV9QUk9QRVJUWSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFZhbGlkYXRpb25Nb2RlW10gZ2V0Q2hvaWNlcygpIHsKKwkJCQlyZXR1cm4gVmFsaWRhdGlvbk1vZGUudmFsdWVzKCk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBWYWxpZGF0aW9uTW9kZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRWYWxpZGF0aW9uTW9kZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhWYWxpZGF0aW9uTW9kZSB2YWx1ZSkgeworCQkJCXJldHVybiB0aGlzLmJ1aWxkRGlzcGxheVN0cmluZyhKcHQyXzBVaU1lc3NhZ2VzLmNsYXNzLCBWYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFZhbGlkYXRpb25Nb2RlIGdldFZhbHVlKCkgeworCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFZhbGlkYXRpb25Nb2RlIHZhbHVlKSB7CisJCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUodmFsdWUpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3MGMyYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wbGF0Zm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybS5FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtLkVjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWlGYWN0b3J5OworCisvKioKKyAqICBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5CisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5IGltcGxlbWVudHMgSnBhUGxhdGZvcm1VaUZhY3RvcnkKK3sKKworCS8qKgorCSAqIFplcm8gYXJnIGNvbnN0cnVjdG9yIGZvciBleHRlbnNpb24gcG9pbnQKKwkgKi8KKwlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgSnBhUGxhdGZvcm1VaSBidWlsZEpwYVBsYXRmb3JtVWkoKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpKAorCQkJbmV3IEVjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXIoKSwKKwkJCUVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmluc3RhbmNlKCkKKwkJKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjNWFkYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGxhdGZvcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzFVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhLkVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzBVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybVhtbDJfMFVpRGVmaW5pdGlvbjsKKworLyoqCisgKiAgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKKyAqLworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKK3sKKworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlQcm92aWRlcigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIGRldGFpbHMgcHJvdmlkZXJzICoqKioqKioqKioKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhaWxzUHJvdmlkZXJzVG8oTGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycykgeworCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKKwkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKKwkJcHJvdmlkZXJzLmFkZChFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKKwkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKKwkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKKwl9CisJCisJLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oTGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtWG1sMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9FY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5ZTExNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMub3JtLk1hcHBpbmdGaWxlV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLm9ybS5NYXBwaW5nRmlsZVdpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7CisKKy8qKgorICogVGhpcyBpcyByZWZlcmVuY2VkIGluIHRoZSBwbHVnaW4ueG1sIGFzIGFuIG9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMgZXh0ZW5zaW9uCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkIGV4dGVuZHMgTWFwcGluZ0ZpbGVXaXphcmQgCisJaW1wbGVtZW50cyBJTmV3V2l6YXJkIAoreworCXB1YmxpYyBFY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkKCkgeworCQl0aGlzKG51bGwpOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgeworCQlzdXBlcihkYXRhTW9kZWwpOworCQlzZXRXaW5kb3dUaXRsZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRfdGl0bGUpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVXaXphcmRQYWdlIGJ1aWxkTWFwcGluZ0ZpbGVXaXphcmRQYWdlKCkgeworCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVXaXphcmRQYWdlKGdldERhdGFNb2RlbCgpLCAiUGFnZV8xIiwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV90aXRsZSwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9kZXNjKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZFBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjE2OGNkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9FY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkUGFnZS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMub3JtLk1hcHBpbmdGaWxlV2l6YXJkUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkUGFnZSBleHRlbmRzIE1hcHBpbmdGaWxlV2l6YXJkUGFnZQoreworCXB1YmxpYyBFY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkUGFnZShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjKSB7CisJCXN1cGVyKGRhdGFNb2RlbCwgcGFnZU5hbWUpOworCQlzZXRUaXRsZSh0aXRsZSk7CisJCXNldERlc2NyaXB0aW9uKGRlc2MpOworCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk2ZGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1qYXZhQ29tcGlsZXIuLi5hcmdzLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyZDUwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmdlbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjE1ZmYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEphbiAxNSAxMToxMjowNyBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTFkNTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDoyODo1NCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0NDc5OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5nZW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7IHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmRiO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxODM3ZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9jb21wb25lbnQueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTRlMDRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmdlbiI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NzVhOGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotIyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0jICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAKLSMgIENvbnRyaWJ1dG9yczogCi0jICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIEVudGl0eSBHZW4KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0VudGl0eUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9FbnRpdHlHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3MjQ5Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0VudGl0eUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkluZGVudGluZ1ByaW50V3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLQotLy8gVE9ETyBoYW5kbGUgdGFibGUgbmFtZXMgdGhhdCBhcmUgaWxsZWdhbCBjbGFzcyBuYW1lcwotLy8gVE9ETyBoYW5kbGUgdGFibGUgbmFtZXMgdGhhdCBhcmUgaWxsZWdhbCBmaWxlIG5hbWVzCi0vLyBUT0RPIGhhbmRsZSBjb2x1bW4gbmFtZXMgdGhhdCBhcmUgaWxsZWdhbCBmaWVsZC9tZXRob2QgbmFtZXMKLS8vIFRPRE8gZm9ybWF0IGNvZGUgcGVyIHByZWZlcmVuY2VzCi0vLyBUT0RPIG9yZ2FuaXplIGltcG9ydHMgcGVyIHByZWZlcmVuY2VzCi0vLyBUT0RPIHByb21wdCB1c2VyIHRvIG92ZXJ3cml0ZSBleGlzdGluZyBjbGFzc2VzCi0vKioKLSAqIFRoaXMgZ2VuZXJhdG9yIHdpbGwgZ2VuZXJhdGUgYW4gZW50aXR5IGZvciBhIHRhYmxlLgotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5R2VuZXJhdG9yIHsKLQlmaW5hbCBDb25maWcgY29uZmlnOwotCXByaXZhdGUgZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQ7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5UYWJsZSBnZW5UYWJsZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBlbnRpdHlDbGFzc05hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBPdmVyd3JpdGVDb25maXJtZXIgb3ZlcndyaXRlQ29uZmlybWVyOwotCXByaXZhdGUgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHBrQ2xhc3NOYW1lOwotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0Jc3RhdGljIHZvaWQgZ2VuZXJhdGVFbnRpdHkoQ29uZmlnIGNvbmZpZywgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQsIEdlblRhYmxlIGdlblRhYmxlLCBPdmVyd3JpdGVDb25maXJtZXIgb3ZlcndyaXRlQ29uZmlybWVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKChjb25maWcgPT0gbnVsbCkgfHwgKHBhY2thZ2VGcmFnbWVudCA9PSBudWxsKSB8fCAoZ2VuVGFibGUgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCW5ldyBFbnRpdHlHZW5lcmF0b3IoY29uZmlnLCBwYWNrYWdlRnJhZ21lbnQsIGdlblRhYmxlLCBvdmVyd3JpdGVDb25maXJtZXIsIG1vbml0b3IpLmdlbmVyYXRlRW50aXR5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgRW50aXR5R2VuZXJhdG9yKENvbmZpZyBjb25maWcsIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50LCBHZW5UYWJsZSBnZW5UYWJsZSwgT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLnBhY2thZ2VGcmFnbWVudCA9IHBhY2thZ2VGcmFnbWVudDsKLQkJdGhpcy5nZW5UYWJsZSA9IGdlblRhYmxlOwotCQl0aGlzLmVudGl0eUNsYXNzTmFtZSA9IHRoaXMuZnVsbHlRdWFsaWZ5KHRoaXMuZW50aXR5TmFtZSgpKTsKLQkJdGhpcy5vdmVyd3JpdGVDb25maXJtZXIgPSBvdmVyd3JpdGVDb25maXJtZXI7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCXRoaXMucGtDbGFzc05hbWUgPSB0aGlzLmVudGl0eUNsYXNzTmFtZSArICJQSyI7ICAvLyBoYWNrCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvZGUgZ2VuICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUVudGl0eSgpIHsKLQkJaW50IHRvdGFsV29yayA9IHBrQ2xhc3NJc0dlbmVyYXRlZCgpID8gNDAgOiAyMDsKLQkJdHJ5IHsKLQkJCXRoaXMubW9uaXRvci5iZWdpblRhc2soIiIsIHRvdGFsV29yayk7Ci0JCQl0aGlzLmdlbmVyYXRlRW50aXR5XygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRoaXMubW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVFbnRpdHlfKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCS8vIGJ1aWxkIHRoZSBib2R5IHNvdXJjZSBmaXJzdCBzbyB3ZSBjYW4gZ2F0aGVyIHVwIHRoZSBpbXBvcnQgc3RhdGVtZW50cwotCQl0aGlzLmdlbmVyYXRlU291cmNlRmlsZSh0aGlzLmVudGl0eUNsYXNzTmFtZSwgdGhpcy5lbnRpdHlOYW1lKCkgKyAiLmphdmEiLCB0aGlzLmJ1aWxkU291cmNlKHRoaXMuYnVpbGRCb2R5U291cmNlKCkpKTsKLQkJaWYgKHRoaXMucGtDbGFzc0lzR2VuZXJhdGVkKCkpIHsKLQkJCXRoaXMuZ2VuZXJhdGVTb3VyY2VGaWxlKHRoaXMucGtDbGFzc05hbWUsIHRoaXMucGtOYW1lKCkgKyAiLmphdmEiLCB0aGlzLmJ1aWxkU291cmNlKHRoaXMuYnVpbGRQS0JvZHlTb3VyY2UoKSkpOwotCQl9Ci0JCQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVNvdXJjZUZpbGUoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgc291cmNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXRoaXMucGFja2FnZUZyYWdtZW50LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmaWxlTmFtZSwgc291cmNlLCBmYWxzZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcih0aGlzLm1vbml0b3IsIDEwKSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldEphdmFNb2RlbFN0YXR1cygpLmdldENvZGUoKSA9PSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OKSB7Ci0JCQkJaWYgKHRoaXMub3ZlcndyaXRlQ29uZmlybWVyLm92ZXJ3cml0ZShjbGFzc05hbWUpKSB7Ci0JCQkJCXRoaXMucGFja2FnZUZyYWdtZW50LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmaWxlTmFtZSwgc291cmNlLCB0cnVlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHRoaXMubW9uaXRvciwgMCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBidWlsZCB0aGUgImJvZHkiIHNvdXJjZSBmaXJzdDsgdGhlbiBidWlsZCB0aGUgInBhY2thZ2UiIGFuZCAiaW1wb3J0cyIgc291cmNlCi0JICogYW5kIGNvbmNhdGVuYXRlIHRoZSAiYm9keSIgc291cmNlIHRvIGl0Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTb3VyY2UoQm9keVNvdXJjZSBib2R5U291cmNlKSB7Ci0JCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoYm9keVNvdXJjZS5sZW5ndGgoKSArIDEwMDApOwotCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0JCXRoaXMucHJpbnRQYWNrYWdlQW5kSW1wb3J0c09uKHB3LCBib2R5U291cmNlKTsKLQkJcHcucHJpbnQoYm9keVNvdXJjZS5zb3VyY2UoKSk7Ci0JCXRoaXMubW9uaXRvci53b3JrZWQoMTApOwotCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIEJvZHlTb3VyY2UgYnVpbGRCb2R5U291cmNlKCkgewotCQlFbnRpdHlTb3VyY2VXcml0ZXIgcHcgPSBuZXcgRW50aXR5U291cmNlV3JpdGVyKHRoaXMucGFja2FnZU5hbWUoKSwgdGhpcy5lbnRpdHlDbGFzc05hbWUpOwotCQl0aGlzLnByaW50Qm9keVNvdXJjZU9uKHB3KTsKLQkJcmV0dXJuIHB3OwotCX0KLQotCXByaXZhdGUgQm9keVNvdXJjZSBidWlsZFBLQm9keVNvdXJjZSgpIHsKLQkJRW50aXR5U291cmNlV3JpdGVyIHB3ID0gbmV3IEVudGl0eVNvdXJjZVdyaXRlcih0aGlzLnBhY2thZ2VOYW1lKCksIHRoaXMucGtDbGFzc05hbWUpOwotCQl0aGlzLnByaW50UHJpbWFyeUtleUNsYXNzT24ocHcpOwotCQlyZXR1cm4gcHc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Qm9keVNvdXJjZU9uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50Q2xhc3NEZWNsYXJhdGlvbk9uKHB3KTsKLQotCQlwdy5pbmRlbnQoKTsKLQkJCXRoaXMucHJpbnRFbnRpdHlQcmltYXJ5S2V5RmllbGRzT24ocHcpOwotCQkJdGhpcy5wcmludEVudGl0eU5vblByaW1hcnlLZXlCYXNpY0ZpZWxkc09uKHB3KTsKLQkJCXRoaXMucHJpbnRFbnRpdHlNYW55VG9PbmVGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50RW50aXR5T25lVG9NYW55RmllbGRzT24ocHcpOwotCQkJdGhpcy5wcmludEVudGl0eU93bmVkTWFueVRvTWFueUZpZWxkc09uKHB3KTsKLQkJCXRoaXMucHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50U2VyaWFsVmVyc2lvblVJRChwdyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0KLQkJCXRoaXMucHJpbnRaZXJvQXJndW1lbnRDb25zdHJ1Y3Rvck9uKHRoaXMuZW50aXR5TmFtZSgpLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCksIHB3KTsKLQkJCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSB8fCB0aGlzLmNvbmZpZy5nZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKCkpIHsKLQkJCQl0aGlzLnByaW50RW50aXR5UHJpbWFyeUtleUdldHRlcnNBbmRTZXR0ZXJzT24ocHcpOwotCQkJCXRoaXMucHJpbnRFbnRpdHlOb25QcmltYXJ5S2V5QmFzaWNHZXR0ZXJzQW5kU2V0dGVyc09uKHB3KTsKLQkJCQl0aGlzLnByaW50RW50aXR5TWFueVRvT25lR2V0dGVyc0FuZFNldHRlcnNPbihwdyk7Ci0JCQkJdGhpcy5wcmludEVudGl0eU9uZVRvTWFueUdldHRlcnNBbmRTZXR0ZXJzT24ocHcpOwotCQkJCXRoaXMucHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlHZXR0ZXJzQW5kU2V0dGVyc09uKHB3KTsKLQkJCQl0aGlzLnByaW50RW50aXR5Tm9uT3duZWRNYW55VG9NYW55R2V0dGVyc0FuZFNldHRlcnNPbihwdyk7Ci0JCQl9Ci0JCXB3LnVuZGVudCgpOwotCi0JCXB3LnByaW50KCd9Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRDbGFzc0RlY2xhcmF0aW9uT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRFbnRpdHlBbm5vdGF0aW9uT24ocHcpOwotCQl0aGlzLnByaW50VGFibGVBbm5vdGF0aW9uT24ocHcpOwotCQl0aGlzLnByaW50SWRDbGFzc0Fubm90YXRpb25Pbihwdyk7Ci0KLQkJcHcucHJpbnQoInB1YmxpYyBjbGFzcyAiKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24odGhpcy5lbnRpdHlDbGFzc05hbWUpOwotCQlpZiAoY29uZmlnLnNlcmlhbGl6YWJsZSgpKSB7Ci0JCQlwdy5wcmludCgiIGltcGxlbWVudHMgIik7Ci0JCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbihTZXJpYWxpemFibGUuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJfQotCQlwdy5wcmludCgiIHsiKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eUFubm90YXRpb25PbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50VGFibGVBbm5vdGF0aW9uT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICggISB0aGlzLnRhYmxlKCkubWF0Y2hlc1Nob3J0SmF2YUNsYXNzTmFtZSh0aGlzLmVudGl0eU5hbWUoKSkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkJcHcucHJpbnQoIihuYW1lPVwiIik7Ci0JCQlwdy5wcmludCh0aGlzLnRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkJCXB3LnByaW50KCJcIikiKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludElkQ2xhc3NBbm5vdGF0aW9uT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICh0aGlzLnBrQ2xhc3NJc0dlbmVyYXRlZCgpICYmIHRoaXMuY29uZmlnLmdlbmVyYXRlSWRDbGFzc0ZvckNvbXBvdW5kUEsoKSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5JRF9DTEFTUyk7Ci0JCQlwdy5wcmludCgnKCcpOwotCQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24ocGtDbGFzc05hbWUpOwotCQkJcHcucHJpbnQoIi5jbGFzcykiKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eVByaW1hcnlLZXlGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKHRoaXMucGtDbGFzc0lzR2VuZXJhdGVkKCkgJiYgdGhpcy5jb25maWcuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5RW1iZWRkZWRJZFByaW1hcnlLZXlGaWVsZE9uKHB3KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlSZWFkT25seVByaW1hcnlLZXlGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50RW50aXR5V3JpdGFibGVQcmltYXJ5S2V5RmllbGRzT24ocHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5RW1iZWRkZWRJZFByaW1hcnlLZXlGaWVsZE9uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlpZiAodGhpcy5jb25maWcuZmllbGRBY2Nlc3NUeXBlKCkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuRU1CRURERURfSUQpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JCXB3LnByaW50VmlzaWJpbGl0eSh0aGlzLmNvbmZpZy5maWVsZFZpc2liaWxpdHkoKSk7Ci0JCXB3LnByaW50VHlwZURlY2xhcmF0aW9uKHRoaXMucGtDbGFzc05hbWUpOwotCQlwdy5wcmludCgnICcpOwotCQlwdy5wcmludCh0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvckVtYmVkZGVkSWQoKSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eVJlYWRPbmx5UHJpbWFyeUtleUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50UmVhZE9ubHlQcmltYXJ5S2V5RmllbGRzT24ocHcsIHRydWUpOyAgLy8gdHJ1ZT1wcmludCBJRCBhbm5vdGF0aW9uIG9uIGZpZWxkcwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlYWRPbmx5UHJpbWFyeUtleUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdywgYm9vbGVhbiBwcmludElkQW5ub3RhdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5yZWFkT25seVByaW1hcnlLZXlDb2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludFJlYWRPbmx5UHJpbWFyeUtleUZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcsIHByaW50SWRBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotCS8vIFRPRE8gaWYgdGhlIGZpZWxkJ3MgdHlwZSBpcyBqYXZhLnV0aWwuRGF0ZSwgaXQgbmVlZHMgQFRlbXBvcmFsKERBVEUpCi0JLy8gVE9ETyBpZiB0aGUgcHJpbWFyeSBrZXkgaXMgYXV0by1nZW5lcmF0ZWQsIHRoZSBmaWVsZCBtdXN0IGJlIGFuIGludGVncmFsIHR5cGUKLQlwcml2YXRlIHZvaWQgcHJpbnRSZWFkT25seVByaW1hcnlLZXlGaWVsZE9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdywgYm9vbGVhbiBwcmludElkQW5ub3RhdGlvbikgewotCQlTdHJpbmcgZmllbGROYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IoY29sdW1uKTsKLQkJaWYgKHRoaXMuY29uZmlnLmZpZWxkQWNjZXNzVHlwZSgpKSB7Ci0JCQlpZiAocHJpbnRJZEFubm90YXRpb24pIHsKLQkJCQlwdy5wcmludEFubm90YXRpb24oSlBBLklEKTsKLQkJCQlwdy5wcmludGxuKCk7Ci0JCQl9Ci0JCQlpZiAoY29sdW1uLm1hdGNoZXNKYXZhRmllbGROYW1lKGZpZWxkTmFtZSkpIHsKLQkJCQl0aGlzLnByaW50UmVhZE9ubHlDb2x1bW5Bbm5vdGF0aW9uT24ocHcpOyAgLy8gbm8gQ29sdW1uIG5hbWUgbmVlZGVkCi0JCQl9IGVsc2UgewotCQkJCXRoaXMucHJpbnRSZWFkT25seUNvbHVtbkFubm90YXRpb25Pbihjb2x1bW4uZ2V0TmFtZSgpLCBwdyk7Ci0JCQl9Ci0JCX0KLQkJcHcucHJpbnRWaXNpYmlsaXR5KHRoaXMuY29uZmlnLmZpZWxkVmlzaWJpbGl0eSgpKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oY29sdW1uLmdldFByaW1hcnlLZXlKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlwdy5wcmludCgnICcpOwotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgnOycpOwotCQlwdy5wcmludGxuKCk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRSZWFkT25seUNvbHVtbkFubm90YXRpb25PbihTdHJpbmcgY29sdW1uTmFtZSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJcHcucHJpbnQoIihuYW1lPVwiIik7Ci0JCXB3LnByaW50KGNvbHVtbk5hbWUpOwotCQlwdy5wcmludCgiXCIsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSkiKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlYWRPbmx5Q29sdW1uQW5ub3RhdGlvbk9uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCXB3LnByaW50KCIoaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlKSIpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5V3JpdGFibGVQcmltYXJ5S2V5RmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRXcml0YWJsZVByaW1hcnlLZXlGaWVsZHNPbihwdywgdHJ1ZSk7ICAvLyB0cnVlPXByaW50IElEIGFubm90YXRpb24gb24gZmllbGRzCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50V3JpdGFibGVQcmltYXJ5S2V5RmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3LCBib29sZWFuIHByaW50SWRBbm5vdGF0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLndyaXRhYmxlUHJpbWFyeUtleUNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50V3JpdGFibGVQcmltYXJ5S2V5RmllbGRPbihzdHJlYW0ubmV4dCgpLCBwdywgcHJpbnRJZEFubm90YXRpb24pOwotCQl9Ci0JfQotCi0JLy8gVE9ETyBpZiB0aGUgZmllbGQncyB0eXBlIGlzIGphdmEudXRpbC5EYXRlLCBpdCBuZWVkcyBAVGVtcG9yYWwoREFURSkKLQkvLyBUT0RPIGlmIHRoZSBwcmltYXJ5IGtleSBpcyBhdXRvLWdlbmVyYXRlZCwgdGhlIGZpZWxkIG11c3QgYmUgYW4gaW50ZWdyYWwgdHlwZQotCXByaXZhdGUgdm9pZCBwcmludFdyaXRhYmxlUHJpbWFyeUtleUZpZWxkT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3LCBib29sZWFuIHByaW50SWRBbm5vdGF0aW9uKSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihjb2x1bW4pOwotCQlpZiAodGhpcy5jb25maWcuZmllbGRBY2Nlc3NUeXBlKCkpIHsKLQkJCWlmIChwcmludElkQW5ub3RhdGlvbikgewotCQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSUQpOwotCQkJCXB3LnByaW50bG4oKTsKLQkJCX0KLQkJCWlmICggISBjb2x1bW4ubWF0Y2hlc0phdmFGaWVsZE5hbWUoZmllbGROYW1lKSkgewotCQkJCXRoaXMucHJpbnRDb2x1bW5Bbm5vdGF0aW9uT24oY29sdW1uLmdldE5hbWUoKSwgcHcpOwotCQkJfQotCQl9Ci0JCXB3LnByaW50VmlzaWJpbGl0eSh0aGlzLmNvbmZpZy5maWVsZFZpc2liaWxpdHkoKSk7Ci0JCXB3LnByaW50VHlwZURlY2xhcmF0aW9uKGNvbHVtbi5nZXRQcmltYXJ5S2V5SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQkJcHcucHJpbnQoJyAnKTsKLQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJcHcucHJpbnQoJzsnKTsKLQkJcHcucHJpbnRsbigpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljRmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm5vblByaW1hcnlLZXlCYXNpY0NvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljRmllbGRPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlOb25QcmltYXJ5S2V5QmFzaWNGaWVsZE9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgZmllbGROYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IoY29sdW1uKTsKLQkJaWYgKHRoaXMuY29uZmlnLmZpZWxkQWNjZXNzVHlwZSgpKSB7Ci0JCQlpZiAoICEgY29sdW1uLm1hdGNoZXNKYXZhRmllbGROYW1lKGZpZWxkTmFtZSkpIHsKLQkJCQl0aGlzLnByaW50Q29sdW1uQW5ub3RhdGlvbk9uKGNvbHVtbi5nZXROYW1lKCksIHB3KTsKLQkJCX0KLQkJfQotCQlpZiAoY29sdW1uLmRhdGFUeXBlSXNMT0IoKSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5MT0IpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JCXB3LnByaW50VmlzaWJpbGl0eSh0aGlzLmNvbmZpZy5maWVsZFZpc2liaWxpdHkoKSk7Ci0JCXB3LnByaW50VHlwZURlY2xhcmF0aW9uKGNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlwdy5wcmludCgnICcpOwotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgnOycpOwotCQlwdy5wcmludGxuKCk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRDb2x1bW5Bbm5vdGF0aW9uT24oU3RyaW5nIGNvbHVtbk5hbWUsIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCXB3LnByaW50KCIobmFtZT1cIiIpOwotCQlwdy5wcmludChjb2x1bW5OYW1lKTsKLQkJcHcucHJpbnQoIlwiKSIpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5TWFueVRvT25lRmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8TWFueVRvT25lUmVsYXRpb24+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUubWFueVRvT25lUmVsYXRpb25zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU1hbnlUb09uZUZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5TWFueVRvT25lRmllbGRPbihNYW55VG9PbmVSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE1hbnlUb09uZUFubm90YXRpb25PbihmaWVsZE5hbWUsIHJlbGF0aW9uLCBwdyk7Ci0JCX0KLQkJcHcucHJpbnRWaXNpYmlsaXR5KHRoaXMuY29uZmlnLmZpZWxkVmlzaWJpbGl0eSgpKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24odGhpcy5mdWxseVF1YWxpZnkocmVsYXRpb24ucmVmZXJlbmNlZEVudGl0eU5hbWUoKSkpOwotCQlwdy5wcmludCgnICcpOwotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgnOycpOwotCQlwdy5wcmludGxuKCk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRNYW55VG9PbmVBbm5vdGF0aW9uT24oU3RyaW5nIGZpZWxkTmFtZSwgTWFueVRvT25lUmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJcHcucHJpbnRsbigpOwotCQlGb3JlaWduS2V5IGZrID0gcmVsYXRpb24uZ2V0Rm9yZWlnbktleSgpOwotCQlpZiAoZmsuZGVmYXVsdE1hdGNoZXNKYXZhRmllbGROYW1lKGZpZWxkTmFtZSkpIHsKLQkJCXJldHVybjsgIC8vIG5vIEpvaW5Db2x1bW4gYW5ub3RhdGlvbiBuZWVkZWQKLQkJfQotCQlpZiAoZmsucmVmZXJlbmNlc1NpbmdsZUNvbHVtblByaW1hcnlLZXkoKSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTik7Ci0JCQlwdy5wcmludCgiKG5hbWU9XCIiKTsKLQkJCXB3LnByaW50KGZrLmNvbHVtblBhaXIoKS5iYXNlQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCXB3LnByaW50KCJcIikiKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmay5jb2x1bW5QYWlyc1NpemUoKSA+IDEpIHsKLQkJCQlwdy5wcmludEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCQkJcHcucHJpbnQoIih7Iik7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJCXB3LmluZGVudCgpOwotCQkJfQotCQkJdGhpcy5wcmludEpvaW5Db2x1bW5Bbm5vdGF0aW9uc09uKGZrLCBwdyk7Ci0JCQlpZiAoZmsuY29sdW1uUGFpcnNTaXplKCkgPiAxKSB7Ci0JCQkJcHcudW5kZW50KCk7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJCXB3LnByaW50KCJ9KSIpOwotCQkJfQotCQl9Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbnNPbihGb3JlaWduS2V5IGZvcmVpZ25LZXksIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPEZvcmVpZ25LZXkuQ29sdW1uUGFpcj4gc3RyZWFtID0gZm9yZWlnbktleS5jb2x1bW5QYWlycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJcHcucHJpbnRsbignLCcpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Sm9pbkNvbHVtbkFubm90YXRpb25PbihGb3JlaWduS2V5LkNvbHVtblBhaXIgY29sdW1uUGFpciwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKGNvbHVtblBhaXIuYmFzZUNvbHVtbigpLmdldE5hbWUoKSwgY29sdW1uUGFpci5yZWZlcmVuY2VkQ29sdW1uKCkuZ2V0TmFtZSgpLCBwdyk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoYXQgYXQgbGVhc3Qgb25lIG9mIHRoZSB0d28gbmFtZXMgaXMgbm90IG51bGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKFN0cmluZyBiYXNlQ29sdW1uTmFtZSwgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTik7Ci0JCXB3LnByaW50KCcoJyk7Ci0JCWlmIChiYXNlQ29sdW1uTmFtZSAhPSBudWxsKSB7Ci0JCQlwdy5wcmludCgibmFtZT1cIiIpOwotCQkJcHcucHJpbnQoYmFzZUNvbHVtbk5hbWUpOwotCQl9Ci0JCWlmIChyZWZlcmVuY2VkQ29sdW1uTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoYmFzZUNvbHVtbk5hbWUgIT0gbnVsbCkgewotCQkJCXB3LnByaW50KCJcIiwgIik7Ci0JCQl9Ci0JCQlwdy5wcmludCgicmVmZXJlbmNlZENvbHVtbk5hbWU9XCIiKTsKLQkJCXB3LnByaW50KHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCQlwdy5wcmludCgiXCIpIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T25lVG9NYW55RmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8T25lVG9NYW55UmVsYXRpb24+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUub25lVG9NYW55UmVsYXRpb25zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU9uZVRvTWFueUZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T25lVG9NYW55RmllbGRPbihPbmVUb01hbnlSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE9uZVRvTWFueUFubm90YXRpb25PbihmaWVsZE5hbWUsIHJlbGF0aW9uLCBwdyk7Ci0JCX0KLQkJcHcucHJpbnRWaXNpYmlsaXR5KHRoaXMuY29uZmlnLmZpZWxkVmlzaWJpbGl0eSgpKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24odGhpcy5jb25maWcuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkpOwotCQlwdy5wcmludCgnPCcpOwotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5yZWZlcmVuY2VkRW50aXR5TmFtZSgpKSk7Ci0JCXB3LnByaW50KCc+Jyk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludE9uZVRvTWFueUFubm90YXRpb25PbihTdHJpbmcgZmllbGROYW1lLCBPbmVUb01hbnlSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlwdy5wcmludCgiKG1hcHBlZEJ5PVwiIik7Ci0JCXB3LnByaW50KHJlbGF0aW9uLm1hcHBlZEJ5KCkpOwotCQlwdy5wcmludCgiXCIpIik7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxNYW55VG9NYW55UmVsYXRpb24+ICBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm93bmVkTWFueVRvTWFueVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlGaWVsZE9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU93bmVkTWFueVRvTWFueUZpZWxkT24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLmZpZWxkQWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50T3duZWRNYW55VG9NYW55QW5ub3RhdGlvbk9uKGZpZWxkTmFtZSwgcmVsYXRpb24sIHB3KTsKLQkJfQotCQlwdy5wcmludFZpc2liaWxpdHkodGhpcy5jb25maWcuZmllbGRWaXNpYmlsaXR5KCkpOwotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbmZpZy5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSk7Ci0JCXB3LnByaW50KCc8Jyk7Ci0JCXB3LnByaW50VHlwZURlY2xhcmF0aW9uKHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLm5vbk93bmluZ0VudGl0eU5hbWUoKSkpOwotCQlwdy5wcmludCgnPicpOwotCQlwdy5wcmludCgnICcpOwotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgnOycpOwotCQlwdy5wcmludGxuKCk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQkvKioKLQkgKiBJIGd1ZXNzIHlvdSBjb3VsZCBidWlsZCBhIHN0YXRlIG1hY2hpbmUgZm9yIGFsbCB0aGlzIGNyYXAsCi0JICogYnV0IHRoYXQgc2VlbXMgbGlrZSBvdmVya2lsbC4uLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludE93bmVkTWFueVRvTWFueUFubm90YXRpb25PbihTdHJpbmcgZmllbGROYW1lLCBNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCXB3LnByaW50bG4oKTsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWJvb2xlYW4gY29tbWEgPSBmYWxzZTsKLQkJaWYgKCAhIHJlbGF0aW9uLmpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSkgewotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlwdy5wcmludEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkJCXB3LnByaW50KCcoJyk7Ci0JCQl9Ci0JCQlwdy5wcmludCgibmFtZT1cIiIpOwotCQkJcHcucHJpbnQocmVsYXRpb24uZ2V0Sm9pblRhYmxlKCkubmFtZSgpKTsKLQkJCXB3LnByaW50KCdcIicpOwotCQkJY29tbWEgPSB0cnVlOwotCQl9Ci0JCWlmICggISByZWxhdGlvbi5qb2luQ29sdW1uc0lzRGVmYXVsdEZvcihmaWVsZE5hbWUpKSB7Ci0JCQlpZiAoZmlyc3QpIHsKLQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQkJcHcucHJpbnQoJygnKTsKLQkJCX0gZWxzZSBpZiAoY29tbWEpIHsKLQkJCQlwdy5wcmludCgnLCcpOwotCQkJfQotCQkJcHcucHJpbnRsbigpOwotCQkJcHcuaW5kZW50KCk7Ci0JCQl0aGlzLnByaW50Sm9pblRhYmxlSm9pbkNvbHVtbnNPbigiam9pbkNvbHVtbnMiLCBmaWVsZE5hbWUsIHJlbGF0aW9uLmdldE93bmluZ0ZvcmVpZ25LZXkoKSwgcHcpOwotCQkJcHcudW5kZW50KCk7Ci0JCQljb21tYSA9IHRydWU7Ci0JCX0KLQkJU3RyaW5nIGludmVyc2VGaWVsZE5hbWUgPSByZWxhdGlvbi5nZXROb25Pd25pbmdUYWJsZSgpLmZpZWxkTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICggISByZWxhdGlvbi5pbnZlcnNlSm9pbkNvbHVtbnNJc0RlZmF1bHRGb3IoaW52ZXJzZUZpZWxkTmFtZSkpIHsKLQkJCWlmIChmaXJzdCkgewotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCQlwdy5wcmludCgnKCcpOwotCQkJfSBlbHNlIGlmIChjb21tYSkgewotCQkJCXB3LnByaW50KCcsJyk7Ci0JCQl9Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCXRoaXMucHJpbnRKb2luVGFibGVKb2luQ29sdW1uc09uKCJpbnZlcnNlSm9pbkNvbHVtbnMiLCBpbnZlcnNlRmllbGROYW1lLCByZWxhdGlvbi5nZXROb25Pd25pbmdGb3JlaWduS2V5KCksIHB3KTsKLQkJCXB3LnVuZGVudCgpOwotCQkJY29tbWEgPSB0cnVlOwotCQl9Ci0JCWlmICggISBmaXJzdCkgewotCQkJcHcucHJpbnQoJyknKTsKLQkJfQotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Sm9pblRhYmxlSm9pbkNvbHVtbnNPbihTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBmaWVsZE5hbWUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmIChmb3JlaWduS2V5LmNvbHVtblBhaXJzU2l6ZSgpICE9IDEpIHsKLQkJCXRoaXMucHJpbnRKb2luVGFibGVKb2luQ29sdW1uc09uKGVsZW1lbnROYW1lLCBmb3JlaWduS2V5LCBwdyk7Ci0JCX0gZWxzZSBpZiAoZm9yZWlnbktleS5nZXRSZWZlcmVuY2VkVGFibGUoKS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSAhPSAxKSB7Ci0JCQkvLyBpZiB0aGUgcmVmZXJlbmNlZCB0YWJsZSBoYXMgYSBjb21wb3NpdGUgcHJpbWFyeSBrZXksIG5laXRoZXIgb2YgdGhlIGNvbHVtbnMgY2FuIGJlIGEgZGVmYXVsdAotCQkJLy8gc2luY2UgYm90aCBvZiB0aGUgZGVmYXVsdHMgcmVxdWlyZSBhIHNpbmdsZS1jb2x1bW4gcHJpbWFyeSBrZXkKLQkJCXRoaXMucHJpbnRKb2luVGFibGVKb2luQ29sdW1uc09uKGVsZW1lbnROYW1lLCBmb3JlaWduS2V5LCBwdyk7Ci0JCX0gZWxzZSB7Ci0JCQlGb3JlaWduS2V5LkNvbHVtblBhaXIgY29sdW1uUGFpciA9IGZvcmVpZ25LZXkuY29sdW1uUGFpcigpOwotCQkJQ29sdW1uIHBrQ29sdW1uID0gZm9yZWlnbktleS5nZXRSZWZlcmVuY2VkVGFibGUoKS5wcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCQlpZiAoY29sdW1uUGFpci5iYXNlQ29sdW1uKCkubWF0Y2hlc0phdmFGaWVsZE5hbWUoZmllbGROYW1lICsgIl8iICsgcGtDb2x1bW4uZ2V0TmFtZSgpKSkgewotCQkJCWlmIChjb2x1bW5QYWlyLnJlZmVyZW5jZWRDb2x1bW4oKSA9PSBwa0NvbHVtbikgewotCQkJCQkvLyB3ZSBzaG91bGRuJ3QgZ2V0IGhlcmUuLi4KLQkJCQl9IGVsc2UgewotCQkJCQlwdy5wcmludChlbGVtZW50TmFtZSk7Ci0JCQkJCXB3LnByaW50KCc9Jyk7Ci0JCQkJCXRoaXMucHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKG51bGwsIGNvbHVtblBhaXIucmVmZXJlbmNlZENvbHVtbigpLmdldE5hbWUoKSwgcHcpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNvbHVtblBhaXIucmVmZXJlbmNlZENvbHVtbigpID09IHBrQ29sdW1uKSB7Ci0JCQkJCXB3LnByaW50KGVsZW1lbnROYW1lKTsKLQkJCQkJcHcucHJpbnQoJz0nKTsKLQkJCQkJdGhpcy5wcmludEpvaW5Db2x1bW5Bbm5vdGF0aW9uT24oY29sdW1uUGFpci5iYXNlQ29sdW1uKCkuZ2V0TmFtZSgpLCBudWxsLCBwdyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5wcmludEpvaW5UYWJsZUpvaW5Db2x1bW5zT24oZWxlbWVudE5hbWUsIGZvcmVpZ25LZXksIHB3KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRKb2luVGFibGVKb2luQ29sdW1uc09uKFN0cmluZyBlbGVtZW50TmFtZSwgRm9yZWlnbktleSBmb3JlaWduS2V5LCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQoZWxlbWVudE5hbWUpOwotCQlwdy5wcmludCgnPScpOwotCQlpZiAoZm9yZWlnbktleS5jb2x1bW5QYWlyc1NpemUoKSA+IDEpIHsKLQkJCXB3LnByaW50KCd7Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJfQotCQl0aGlzLnByaW50Sm9pbkNvbHVtbkFubm90YXRpb25zT24oZm9yZWlnbktleSwgcHcpOwotCQlpZiAoZm9yZWlnbktleS5jb2x1bW5QYWlyc1NpemUoKSA+IDEpIHsKLQkJCXB3LnVuZGVudCgpOwotCQkJcHcucHJpbnRsbigpOwotCQkJcHcucHJpbnQoJ30nKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU5vbk93bmVkTWFueVRvTWFueUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPE1hbnlUb01hbnlSZWxhdGlvbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5ub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5Tm9uT3duZWRNYW55VG9NYW55RmllbGRPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlGaWVsZE9uKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE5vbk93bmVkTWFueVRvTWFueUFubm90YXRpb25PbihmaWVsZE5hbWUsIHJlbGF0aW9uLCBwdyk7Ci0JCX0KLQkJcHcucHJpbnRWaXNpYmlsaXR5KHRoaXMuY29uZmlnLmZpZWxkVmlzaWJpbGl0eSgpKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24odGhpcy5jb25maWcuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkpOwotCQlwdy5wcmludCgnPCcpOwotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5vd25pbmdFbnRpdHlOYW1lKCkpKTsKLQkJcHcucHJpbnQoJz4nKTsKLQkJcHcucHJpbnQoJyAnKTsKLQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJcHcucHJpbnQoJzsnKTsKLQkJcHcucHJpbnRsbigpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Tm9uT3duZWRNYW55VG9NYW55QW5ub3RhdGlvbk9uKFN0cmluZyBmaWVsZE5hbWUsIE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJcHcucHJpbnQoIihtYXBwZWRCeT1cIiIpOwotCQlwdy5wcmludChyZWxhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJcHcucHJpbnQoIlwiKSIpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZ5KFN0cmluZyBzaG9ydENsYXNzTmFtZSkgewotCQlTdHJpbmcgcGtnID0gdGhpcy5wYWNrYWdlTmFtZSgpOwotCQlyZXR1cm4gKHBrZy5sZW5ndGgoKSA9PSAwKSA/IHNob3J0Q2xhc3NOYW1lIDogcGtnICsgJy4nICsgc2hvcnRDbGFzc05hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50U2VyaWFsVmVyc2lvblVJRChFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKHRoaXMuY29uZmlnLmdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCgpKSB7Ci0JCQlwdy5wcmludCgicHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Iik7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRaZXJvQXJndW1lbnRDb25zdHJ1Y3Rvck9uKFN0cmluZyBjdG9yTmFtZSwgU3RyaW5nIHZpc2liaWxpdHksIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlpZiAodGhpcy5jb25maWcuZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IoKSkgewotCQkJcHcucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCQkJcHcucHJpbnQoY3Rvck5hbWUpOwotCQkJcHcucHJpbnQoIigpIHsiKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJCXB3LmluZGVudCgpOwotCQkJCXB3LnByaW50bG4oInN1cGVyKCk7Iik7Ci0JCQlwdy51bmRlbnQoKTsKLQkJCXB3LnByaW50KCd9Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlQcmltYXJ5S2V5R2V0dGVyc0FuZFNldHRlcnNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKHRoaXMucGtDbGFzc0lzR2VuZXJhdGVkKCkgJiYgdGhpcy5jb25maWcuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5RW1iZWRkZWRJZFByaW1hcnlLZXlHZXR0ZXJBbmRTZXR0ZXJPbihwdyk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnByaW50RW50aXR5UmVhZE9ubHlQcmltYXJ5S2V5R2V0dGVyc0FuZFNldHRlcnNPbihwdyk7Ci0JCQl0aGlzLnByaW50RW50aXR5V3JpdGFibGVQcmltYXJ5S2V5R2V0dGVyc0FuZFNldHRlcnNPbihwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlFbWJlZGRlZElkUHJpbWFyeUtleUdldHRlckFuZFNldHRlck9uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuRU1CRURERURfSUQpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JCXB3LnByaW50R2V0dGVyQW5kU2V0dGVyKHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yRW1iZWRkZWRJZCgpLCB0aGlzLnBrQ2xhc3NOYW1lLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eVJlYWRPbmx5UHJpbWFyeUtleUdldHRlcnNBbmRTZXR0ZXJzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRSZWFkT25seVByaW1hcnlLZXlHZXR0ZXJzQW5kU2V0dGVyc09uKHB3LCB0cnVlKTsgIC8vIHRydWU9cHJpbnQgSUQgYW5ub3RhdGlvbiBvbiBmaWVsZHMKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRSZWFkT25seVByaW1hcnlLZXlHZXR0ZXJzQW5kU2V0dGVyc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdywgYm9vbGVhbiBwcmludElkQW5ub3RhdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5yZWFkT25seVByaW1hcnlLZXlDb2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludFJlYWRPbmx5UHJpbWFyeUtleUdldHRlckFuZFNldHRlck9uKHN0cmVhbS5uZXh0KCksIHB3LCBwcmludElkQW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvLyBUT0RPIGlmIHRoZSBwcm9wZXJ0eSdzIHR5cGUgaXMgamF2YS51dGlsLkRhdGUsIGl0IG5lZWRzIEBUZW1wb3JhbChEQVRFKQotCS8vIFRPRE8gaWYgdGhlIHByaW1hcnkga2V5IGlzIGF1dG8tZ2VuZXJhdGVkLCB0aGUgcHJvcGVydHkgbXVzdCBiZSBhbiBpbnRlZ3JhbCB0eXBlCi0JcHJpdmF0ZSB2b2lkIHByaW50UmVhZE9ubHlQcmltYXJ5S2V5R2V0dGVyQW5kU2V0dGVyT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3LCBib29sZWFuIHByaW50SWRBbm5vdGF0aW9uKSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihjb2x1bW4pOwotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCWlmIChwcmludElkQW5ub3RhdGlvbikgewotCQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSUQpOwotCQkJCXB3LnByaW50bG4oKTsKLQkJCX0KLQkJCWlmIChjb2x1bW4ubWF0Y2hlc0phdmFGaWVsZE5hbWUocHJvcGVydHlOYW1lKSkgewotCQkJCXRoaXMucHJpbnRSZWFkT25seUNvbHVtbkFubm90YXRpb25Pbihwdyk7ICAvLyBubyBDb2x1bW4gbmFtZSBuZWVkZWQKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5wcmludFJlYWRPbmx5Q29sdW1uQW5ub3RhdGlvbk9uKGNvbHVtbi5nZXROYW1lKCksIHB3KTsKLQkJCX0KLQkJfQotCi0JCXB3LnByaW50R2V0dGVyQW5kU2V0dGVyKHByb3BlcnR5TmFtZSwgY29sdW1uLmdldFByaW1hcnlLZXlKYXZhVHlwZURlY2xhcmF0aW9uKCksIHRoaXMuY29uZmlnLm1ldGhvZFZpc2liaWxpdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5V3JpdGFibGVQcmltYXJ5S2V5R2V0dGVyc0FuZFNldHRlcnNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJdGhpcy5wcmludFdyaXRhYmxlUHJpbWFyeUtleUdldHRlcnNBbmRTZXR0ZXJzT24ocHcsIHRydWUpOyAgLy8gdHJ1ZT1wcmludCBJRCBhbm5vdGF0aW9uIG9uIGZpZWxkcwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFdyaXRhYmxlUHJpbWFyeUtleUdldHRlcnNBbmRTZXR0ZXJzT24oRW50aXR5U291cmNlV3JpdGVyIHB3LCBib29sZWFuIHByaW50SWRBbm5vdGF0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLndyaXRhYmxlUHJpbWFyeUtleUNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50V3JpdGFibGVQcmltYXJ5S2V5R2V0dGVyQW5kU2V0dGVyT24oc3RyZWFtLm5leHQoKSwgcHcsIHByaW50SWRBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotCS8vIFRPRE8gaWYgdGhlIHByb3BlcnR5J3MgdHlwZSBpcyBqYXZhLnV0aWwuRGF0ZSwgaXQgbmVlZHMgQFRlbXBvcmFsKERBVEUpCi0JLy8gVE9ETyBpZiB0aGUgcHJpbWFyeSBrZXkgaXMgYXV0by1nZW5lcmF0ZWQsIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIGFuIGludGVncmFsIHR5cGUKLQlwcml2YXRlIHZvaWQgcHJpbnRXcml0YWJsZVByaW1hcnlLZXlHZXR0ZXJBbmRTZXR0ZXJPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcsIGJvb2xlYW4gcHJpbnRJZEFubm90YXRpb24pIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKGNvbHVtbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSkgewotCQkJaWYgKHByaW50SWRBbm5vdGF0aW9uKSB7Ci0JCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5JRCk7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJfQotCQkJaWYgKCAhIGNvbHVtbi5tYXRjaGVzSmF2YUZpZWxkTmFtZShwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJdGhpcy5wcmludENvbHVtbkFubm90YXRpb25Pbihjb2x1bW4uZ2V0TmFtZSgpLCBwdyk7Ci0JCQl9Ci0JCX0KLQotCQlwdy5wcmludEdldHRlckFuZFNldHRlcihwcm9wZXJ0eU5hbWUsIGNvbHVtbi5nZXRQcmltYXJ5S2V5SmF2YVR5cGVEZWNsYXJhdGlvbigpLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU5vblByaW1hcnlLZXlCYXNpY0dldHRlcnNBbmRTZXR0ZXJzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm5vblByaW1hcnlLZXlCYXNpY0NvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljR2V0dGVyQW5kU2V0dGVyT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljR2V0dGVyQW5kU2V0dGVyT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihjb2x1bW4pOwotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCWlmICggISBjb2x1bW4ubWF0Y2hlc0phdmFGaWVsZE5hbWUocHJvcGVydHlOYW1lKSkgewotCQkJCXRoaXMucHJpbnRDb2x1bW5Bbm5vdGF0aW9uT24oY29sdW1uLmdldE5hbWUoKSwgcHcpOwotCQkJfQotCQl9Ci0KLQkJcHcucHJpbnRHZXR0ZXJBbmRTZXR0ZXIocHJvcGVydHlOYW1lLCBjb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU1hbnlUb09uZUdldHRlcnNBbmRTZXR0ZXJzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8TWFueVRvT25lUmVsYXRpb24+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUubWFueVRvT25lUmVsYXRpb25zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU1hbnlUb09uZUdldHRlckFuZFNldHRlck9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU1hbnlUb09uZUdldHRlckFuZFNldHRlck9uKE1hbnlUb09uZVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50TWFueVRvT25lQW5ub3RhdGlvbk9uKHByb3BlcnR5TmFtZSwgcmVsYXRpb24sIHB3KTsKLQkJfQotCi0JCVN0cmluZyB0eXBlRGVjbGFyYXRpb24gPSB0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5yZWZlcmVuY2VkRW50aXR5TmFtZSgpKTsKLQkJcHcucHJpbnRHZXR0ZXJBbmRTZXR0ZXIocHJvcGVydHlOYW1lLCB0eXBlRGVjbGFyYXRpb24sIHRoaXMuY29uZmlnLm1ldGhvZFZpc2liaWxpdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T25lVG9NYW55R2V0dGVyc0FuZFNldHRlcnNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxPbmVUb01hbnlSZWxhdGlvbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5vbmVUb01hbnlSZWxhdGlvbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5T25lVG9NYW55R2V0dGVyQW5kU2V0dGVyT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T25lVG9NYW55R2V0dGVyQW5kU2V0dGVyT24oT25lVG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IocmVsYXRpb24pOwotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCXRoaXMucHJpbnRPbmVUb01hbnlBbm5vdGF0aW9uT24ocHJvcGVydHlOYW1lLCByZWxhdGlvbiwgcHcpOwotCQl9Ci0KLQkJU3RyaW5nIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24gPSB0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5yZWZlcmVuY2VkRW50aXR5TmFtZSgpKTsKLQkJcHcucHJpbnRDb2xsZWN0aW9uR2V0dGVyQW5kU2V0dGVyKHByb3BlcnR5TmFtZSwgdGhpcy5jb25maWcuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCksIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24sIHRoaXMuY29uZmlnLm1ldGhvZFZpc2liaWxpdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T3duZWRNYW55VG9NYW55R2V0dGVyc0FuZFNldHRlcnNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxNYW55VG9NYW55UmVsYXRpb24+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUub3duZWRNYW55VG9NYW55UmVsYXRpb25zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU93bmVkTWFueVRvTWFueUdldHRlckFuZFNldHRlck9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU93bmVkTWFueVRvTWFueUdldHRlckFuZFNldHRlck9uKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE93bmVkTWFueVRvTWFueUFubm90YXRpb25Pbihwcm9wZXJ0eU5hbWUsIHJlbGF0aW9uLCBwdyk7Ci0JCX0KLQotCQlTdHJpbmcgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiA9IHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLm5vbk93bmluZ0VudGl0eU5hbWUoKSk7Ci0JCXB3LnByaW50Q29sbGVjdGlvbkdldHRlckFuZFNldHRlcihwcm9wZXJ0eU5hbWUsIHRoaXMuY29uZmlnLmdldENvbGxlY3Rpb25UeXBlTmFtZSgpLCBlbGVtZW50VHlwZURlY2xhcmF0aW9uLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU5vbk93bmVkTWFueVRvTWFueUdldHRlcnNBbmRTZXR0ZXJzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8TWFueVRvTWFueVJlbGF0aW9uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm5vbk93bmVkTWFueVRvTWFueVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlHZXR0ZXJBbmRTZXR0ZXJPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlHZXR0ZXJBbmRTZXR0ZXJPbihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IocmVsYXRpb24pOwotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCXRoaXMucHJpbnROb25Pd25lZE1hbnlUb01hbnlBbm5vdGF0aW9uT24ocHJvcGVydHlOYW1lLCByZWxhdGlvbiwgcHcpOwotCQl9Ci0KLQkJU3RyaW5nIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24gPSB0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5vd25pbmdFbnRpdHlOYW1lKCkpOwotCQlwdy5wcmludENvbGxlY3Rpb25HZXR0ZXJBbmRTZXR0ZXIocHJvcGVydHlOYW1lLCB0aGlzLmNvbmZpZy5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSwgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgdGhpcy5jb25maWcubWV0aG9kVmlzaWJpbGl0eSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5Q2xhc3NPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKHRoaXMuY29uZmlnLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoKSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5FTUJFRERBQkxFKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCQlwdy5wcmludCgicHVibGljIGNsYXNzICIpOwotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLnBrQ2xhc3NOYW1lKTsKLQkJcHcucHJpbnQoIiBpbXBsZW1lbnRzICIpOwotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbihTZXJpYWxpemFibGUuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcHcucHJpbnQoIiB7Iik7Ci0JCXB3LnByaW50bG4oKTsKLQotCQlwdy5pbmRlbnQoKTsKLQkJCWlmICh0aGlzLmNvbmZpZy5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkpIHsKLQkJCQl0aGlzLnByaW50RW1iZWRkYWJsZVJlYWRPbmx5UHJpbWFyeUtleUZpZWxkc09uKHB3KTsKLQkJCQl0aGlzLnByaW50RW1iZWRkYWJsZVdyaXRhYmxlUHJpbWFyeUtleUZpZWxkc09uKHB3KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5wcmludElkRmllbGRzT24ocHcpOwotCQkJfQotCQkJdGhpcy5wcmludFNlcmlhbFZlcnNpb25VSUQocHcpOwotCQkJcHcucHJpbnRsbigpOwotCQkJdGhpcy5wcmludFplcm9Bcmd1bWVudENvbnN0cnVjdG9yT24odGhpcy5wa05hbWUoKSwgInB1YmxpYyIsIHB3KTsKLQotCQkJaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzVHlwZSgpIHx8IHRoaXMuY29uZmlnLmdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMoKSkgewotCQkJCWlmICh0aGlzLmNvbmZpZy5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkpIHsKLQkJCQkJdGhpcy5wcmludEVtYmVkZGFibGVSZWFkT25seVByaW1hcnlLZXlHZXR0ZXJzQW5kU2V0dGVyc09uKHB3KTsKLQkJCQkJdGhpcy5wcmludEVtYmVkZGFibGVXcml0YWJsZVByaW1hcnlLZXlHZXR0ZXJzQW5kU2V0dGVyc09uKHB3KTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aGlzLnByaW50SWRHZXR0ZXJzQW5kU2V0dGVyc09uKHB3KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMucHJpbnRQcmltYXJ5S2V5RXF1YWxzTWV0aG9kT24odGhpcy5wa05hbWUoKSwgdGhpcy50YWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zKCksIHB3KTsKLQkJCXRoaXMucHJpbnRQcmltYXJ5S2V5SGFzaENvZGVNZXRob2RPbih0aGlzLnRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnMoKSwgcHcpOwotCQlwdy51bmRlbnQoKTsKLQotCQlwdy5wcmludCgnfScpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW1iZWRkYWJsZVJlYWRPbmx5UHJpbWFyeUtleUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50UmVhZE9ubHlQcmltYXJ5S2V5RmllbGRzT24ocHcsIGZhbHNlKTsgIC8vIGZhbHNlPWRvIG5vdCBwcmludCBJRCBhbm5vdGF0aW9uIG9uIGZpZWxkcwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVtYmVkZGFibGVXcml0YWJsZVByaW1hcnlLZXlGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJdGhpcy5wcmludFdyaXRhYmxlUHJpbWFyeUtleUZpZWxkc09uKHB3LCBmYWxzZSk7ICAvLyBmYWxzZT1kbyBub3QgcHJpbnQgSUQgYW5ub3RhdGlvbiBvbiBmaWVsZHMKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRJZEZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy50YWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludElkRmllbGRPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRJZEZpZWxkT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihjb2x1bW4pOwotCQlwdy5wcmludFZpc2liaWxpdHkodGhpcy5jb25maWcuZmllbGRWaXNpYmlsaXR5KCkpOwotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbihjb2x1bW4uZ2V0UHJpbWFyeUtleUphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbWJlZGRhYmxlUmVhZE9ubHlQcmltYXJ5S2V5R2V0dGVyc0FuZFNldHRlcnNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJdGhpcy5wcmludFJlYWRPbmx5UHJpbWFyeUtleUdldHRlcnNBbmRTZXR0ZXJzT24ocHcsIGZhbHNlKTsgIC8vIGZhbHNlPWRvIG5vdCBwcmludCBJRCBhbm5vdGF0aW9uIG9uIGZpZWxkcwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVtYmVkZGFibGVXcml0YWJsZVByaW1hcnlLZXlHZXR0ZXJzQW5kU2V0dGVyc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50V3JpdGFibGVQcmltYXJ5S2V5R2V0dGVyc0FuZFNldHRlcnNPbihwdywgZmFsc2UpOyAgLy8gZmFsc2U9ZG8gbm90IHByaW50IElEIGFubm90YXRpb24gb24gZmllbGRzCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50SWRHZXR0ZXJzQW5kU2V0dGVyc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy50YWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludElkR2V0dGVyQW5kU2V0dGVyT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50SWRHZXR0ZXJBbmRTZXR0ZXJPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKGNvbHVtbik7Ci0JCXB3LnByaW50R2V0dGVyQW5kU2V0dGVyKHByb3BlcnR5TmFtZSwgY29sdW1uLmdldFByaW1hcnlLZXlKYXZhVHlwZURlY2xhcmF0aW9uKCksIHRoaXMuY29uZmlnLm1ldGhvZFZpc2liaWxpdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUVxdWFsc01ldGhvZE9uKFN0cmluZyBjbGFzc05hbWUsIEl0ZXJhdG9yPENvbHVtbj4gY29sdW1ucywgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbigiamF2YS5sYW5nLk92ZXJyaWRlIik7Ci0JCXB3LnByaW50bG4oKTsKLQotCQlwdy5wcmludGxuKCJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsiKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQlwdy5wcmludGxuKCJpZiAobyA9PSB0aGlzKSB7Iik7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQlwdy5wcmludGxuKCJyZXR1cm4gdHJ1ZTsiKTsKLQkJCXB3LnVuZGVudCgpOwotCQkJcHcucHJpbnQoJ30nKTsKLQkJCXB3LnByaW50bG4oKTsKLQotCQkJcHcucHJpbnQoImlmICggISAobyBpbnN0YW5jZW9mICIpOwotCQkJcHcucHJpbnQoY2xhc3NOYW1lKTsKLQkJCXB3LnByaW50KCIpKSB7Iik7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQlwdy5wcmludGxuKCJyZXR1cm4gZmFsc2U7Iik7Ci0JCQlwdy51bmRlbnQoKTsKLQkJCXB3LnByaW50KCd9Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0KLQkJCXB3LnByaW50KGNsYXNzTmFtZSk7Ci0JCQlwdy5wcmludCgiIG90aGVyID0gKCIpOwotCQkJcHcucHJpbnQoY2xhc3NOYW1lKTsKLQkJCXB3LnByaW50KCIpIG87Iik7Ci0JCQlwdy5wcmludGxuKCk7Ci0KLQkJCXB3LnByaW50KCJyZXR1cm4gIik7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQl3aGlsZSAoY29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQkJdGhpcy5wcmludFByaW1hcnlLZXlFcXVhbHNDbGF1c2VPbihjb2x1bW5zLm5leHQoKSwgcHcpOwotCQkJCQlpZiAoY29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQkJCXB3LnByaW50bG4oKTsKLQkJCQkJCXB3LnByaW50KCImJiAiKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlwdy5wcmludCgnOycpOwotCQkJCXB3LnByaW50bG4oKTsKLQkJCXB3LnVuZGVudCgpOwotCQlwdy51bmRlbnQoKTsKLQkJcHcucHJpbnQoJ30nKTsKLQkJcHcucHJpbnRsbigpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUVxdWFsc0NsYXVzZU9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgZmllbGROYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IoY29sdW1uKTsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBjb2x1bW4uZ2V0UHJpbWFyeUtleUphdmFUeXBlKCk7Ci0JCWlmIChqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQl0aGlzLnByaW50UHJpbWl0aXZlRXF1YWxzQ2xhdXNlT24oZmllbGROYW1lLCBwdyk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnByaW50UmVmZXJlbmNlRXF1YWxzQ2xhdXNlT24oZmllbGROYW1lLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltaXRpdmVFcXVhbHNDbGF1c2VPbihTdHJpbmcgZmllbGROYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQoIih0aGlzLiIpOwotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgiID09IG90aGVyLiIpOwotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgnKScpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlZmVyZW5jZUVxdWFsc0NsYXVzZU9uKFN0cmluZyBmaWVsZE5hbWUsIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludCgidGhpcy4iKTsKLQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJcHcucHJpbnQoIi5lcXVhbHMob3RoZXIuIik7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCcpJyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUhhc2hDb2RlTWV0aG9kT24oSXRlcmF0b3I8Q29sdW1uPiBjb2x1bW5zLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKCJqYXZhLmxhbmcuT3ZlcnJpZGUiKTsKLQkJcHcucHJpbnRsbigpOwotCi0JCXB3LnByaW50bG4oInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Iik7Ci0JCXB3LmluZGVudCgpOwotCQkJcHcucHJpbnRsbigiZmluYWwgaW50IHByaW1lID0gMzE7Iik7Ci0JCQlwdy5wcmludGxuKCJpbnQgaGFzaCA9IDE3OyIpOwotCQkJd2hpbGUgKGNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJcHcucHJpbnQoImhhc2ggPSBoYXNoICogcHJpbWUgKyAiKTsKLQkJCQl0aGlzLnByaW50UHJpbWFyeUtleUhhc2hDb2RlQ2xhdXNlT24oY29sdW1ucy5uZXh0KCksIHB3KTsKLQkJCQlwdy5wcmludCgnOycpOwotCQkJCXB3LnByaW50bG4oKTsKLQkJCX0KLQkJCXB3LnByaW50bG4oInJldHVybiBoYXNoOyIpOwotCQlwdy51bmRlbnQoKTsKLQkJcHcucHJpbnQoJ30nKTsKLQkJcHcucHJpbnRsbigpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUhhc2hDb2RlQ2xhdXNlT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihjb2x1bW4pOwotCQlKYXZhVHlwZSBqYXZhVHlwZSA9IGNvbHVtbi5nZXRQcmltYXJ5S2V5SmF2YVR5cGUoKTsKLQkJaWYgKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXRoaXMucHJpbnRQcmltaXRpdmVIYXNoQ29kZUNsYXVzZU9uKGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpLCBmaWVsZE5hbWUsIHB3KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucHJpbnRSZWZlcmVuY2VIYXNoQ29kZUNsYXVzZU9uKGZpZWxkTmFtZSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWl0aXZlSGFzaENvZGVDbGF1c2VPbihTdHJpbmcgcHJpbWl0aXZlTmFtZSwgU3RyaW5nIGZpZWxkTmFtZSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmIChwcmltaXRpdmVOYW1lLmVxdWFscygiaW50IikpIHsKLQkJCS8vIHRoaXMudmFsdWUKLQkJCXB3LnByaW50KCJ0aGlzLiIpOwotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJfSBlbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygic2hvcnQiKSB8fCBwcmltaXRpdmVOYW1lLmVxdWFscygiYnl0ZSIpIHx8IHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJjaGFyIikpIHsgIC8vIGV4cGxpY2l0IGNhc3QKLQkJCS8vICgoaW50KSB0aGlzLnZhbHVlKQotCQkJcHcucHJpbnQoIigoaW50KSB0aGlzLiIpOwotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCcpJyk7Ci0JCX0gZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImxvbmciKSkgeyAgLy8gY3JpYmJlZCBmcm9tIExvbmcjaGFzaENvZGUoKQotCQkJLy8gKChpbnQpICh0aGlzLnZhbHVlIF4gKHRoaXMudmFsdWUgPj4+IDMyKSkpCi0JCQlwdy5wcmludCgiKChpbnQpICh0aGlzLiIpOwotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCIgXiAodGhpcy4iKTsKLQkJCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCQlwdy5wcmludCgiID4+PiAzMikpKSIpOwotCQl9IGVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJmbG9hdCIpKSB7ICAvLyBjcmliYmVkIGZyb20gRmxvYXQjaGFzaENvZGUoKQotCQkJLy8gamF2YS5sYW5nLkZsb2F0LmZsb2F0VG9JbnRCaXRzKHRoaXMudmFsdWUpCi0JCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLkZsb2F0Iik7Ci0JCQlwdy5wcmludCgiLmZsb2F0VG9JbnRCaXRzKHRoaXMuIik7Ci0JCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQkJcHcucHJpbnQoJyknKTsKLQkJfSBlbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygiZG91YmxlIikpIHsgIC8vIGNyaWJiZWQgZnJvbSBEb3VibGUjaGFzaENvZGUoKQotCQkJLy8JKChpbnQpIChqYXZhLmxhbmcuRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHModGhpcy52YWx1ZSkgXiAoamF2YS5sYW5nLkRvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHRoaXMudmFsdWUpID4+PiAzMikpKQotCQkJcHcucHJpbnQoIigoaW50KSAoIik7Ci0JCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLkRvdWJsZSIpOwotCQkJcHcucHJpbnQoIi5kb3VibGVUb0xvbmdCaXRzKHRoaXMuIik7Ci0JCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQkJcHcucHJpbnQoIikgXiAoIik7Ci0JCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLkRvdWJsZSIpOwotCQkJcHcucHJpbnQoIi5kb3VibGVUb0xvbmdCaXRzKHRoaXMuIik7Ci0JCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQkJcHcucHJpbnQoIikgPj4+IDMyKSkpIik7Ci0JCX0gZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImJvb2xlYW4iKSkgewotCQkJLy8gKHRoaXMudmFsdWUgPyAxIDogMCkKLQkJCXB3LnByaW50KCIodGhpcy4iKTsKLQkJCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCQlwdy5wcmludCgiID8gMSA6IDApIik7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHByaW1pdGl2ZU5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UmVmZXJlbmNlSGFzaENvZGVDbGF1c2VPbihTdHJpbmcgZmllbGROYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQoInRoaXMuIik7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCIuaGFzaENvZGUoKSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFBhY2thZ2VBbmRJbXBvcnRzT24oUHJpbnRXcml0ZXIgcHcsIEJvZHlTb3VyY2UgYm9keVNvdXJjZSkgewotCQlpZiAodGhpcy5wYWNrYWdlTmFtZSgpLmxlbmd0aCgpICE9IDApIHsKLQkJCXB3LnByaW50KCJwYWNrYWdlICIpOwotCQkJcHcucHJpbnQodGhpcy5wYWNrYWdlTmFtZSgpKTsKLQkJCXB3LnByaW50KCc7Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IHN0cmVhbSA9IGJvZHlTb3VyY2UuaW1wb3J0RW50cmllcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgPSBzdHJlYW0ubmV4dCgpOwotCQkJcHcucHJpbnQoImltcG9ydCAiKTsKLQkJCXB3LnByaW50KGVudHJ5LmdldFZhbHVlKCkpOyAgLy8gcGFja2FnZQotCQkJcHcucHJpbnQoJy4nKTsKLQkJCXB3LnByaW50KGVudHJ5LmdldEtleSgpKTsgIC8vIHNob3J0IGNsYXNzIG5hbWUKLQkJCXB3LnByaW50KCc7Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQkJcHcucHJpbnRsbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5wYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZW5UYWJsZS5nZXRUYWJsZSgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGVudGl0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdlblRhYmxlLmdldEVudGl0eU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBwa05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eU5hbWUoKSArICJQSyI7ICAvLyBoYWNrCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHBrQ2xhc3NJc0dlbmVyYXRlZCgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGUoKS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA+IDE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHdyaXRlciAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBCb2R5U291cmNlIHsKLQotCQkvKioKLQkJICogcmV0dXJuIGEgc29ydGVkIHNldCBvZiBtYXAgZW50cmllczsgdGhlIGtleSBpcyB0aGUgc2hvcnQgY2xhc3MgbmFtZSwKLQkJICogdGhlIHZhbHVlIGlzIHRoZSBwYWNrYWdlIG5hbWUKLQkJICovCi0JCUl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGltcG9ydEVudHJpZXMoKTsKLQotCQkvKioKLQkJICogcmV0dXJuIHRoZSBib2R5IHNvdXJjZSBjb2RlCi0JCSAqLwotCQlTdHJpbmcgc291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBib2R5IHNvdXJjZSBjb2RlCi0JCSAqLwotCQlpbnQgbGVuZ3RoKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgSW5kZW50aW5nUHJpbnRXcml0ZXIgd2l0aCBzb21lIG1ldGhvZHMgdGhhdCBmYWNpbGl0YXRlIGJ1aWxkaW5nCi0JICogY2xhc3Mgc291cmNlIGNvZGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50aXR5U291cmNlV3JpdGVyIGV4dGVuZHMgSW5kZW50aW5nUHJpbnRXcml0ZXIgaW1wbGVtZW50cyBCb2R5U291cmNlIHsKLQkJZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lOwotCQlmaW5hbCBTdHJpbmcgY2xhc3NOYW1lOwotCQkvLyBrZXkgPSBzaG9ydCBjbGFzcyBuYW1lOyB2YWx1ZSA9IHBhY2thZ2UgbmFtZQotCQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gaW1wb3J0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JCUVudGl0eVNvdXJjZVdyaXRlcihTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCXN1cGVyKG5ldyBTdHJpbmdXcml0ZXIoMjAwMDApKTsKLQkJCXRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQl9Ci0KLQkJdm9pZCBwcmludFZpc2liaWxpdHkoU3RyaW5nIHZpc2liaWxpdHlNb2RpZmllcikgewotCQkJaWYgKHZpc2liaWxpdHlNb2RpZmllci5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJdGhpcy5wcmludCh2aXNpYmlsaXR5TW9kaWZpZXIpOwotCQkJCXRoaXMucHJpbnQoJyAnKTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgcHJpbnRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQkJdGhpcy5wcmludCgnQCcpOwotCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JCX0KLQotCQl2b2lkIHByaW50VHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJCXRoaXMucHJpbnQodGhpcy5pbXBvcnRlZFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcydzICJpbXBvcnRlZCIgbmFtZS4KLQkJICogVGhlIGNsYXNzIGRlY2xhcmF0aW9uIG11c3QgYmUgb2YgdGhlIGZvcm06Ci0JCSAqICAgICAiaW50IgotCQkgKiAgICAgImludFtdIiAobm90ICJbSSIpCi0JCSAqICAgICAiamF2YS5sYW5nLk9iamVjdCIKLQkJICogICAgICJqYXZhLmxhbmcuT2JqZWN0W10iIChub3QgIltMamF2YS5sYW5nLk9iamVjdDsiKQotCQkgKiAgICAgImphdmEudXRpbC5NYXAuRW50cnkiIChub3QgImphdmEudXRpbC5NYXAkRW50cnkiKQotCQkgKiAgICAgImphdmEudXRpbC5NYXAuRW50cnlbXVtdIiAobm90ICJbW0xqYXZhLnV0aWwuTWFwJEVudHJ5OyIpCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBpbXBvcnRlZFR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCQlpZiAodGhpcy50eXBlRGVjbGFyYXRpb25Jc01lbWJlckNsYXNzKHR5cGVEZWNsYXJhdGlvbikpIHsKLQkJCQkvLyBubyBuZWVkIGZvciBhbiBpbXBvcnQsIGp1c3QgcmV0dXJuIHRoZSBwYXJ0aWFsbHktcXVhbGlmaWVkIG5hbWUKLQkJCQlyZXR1cm4gdGhpcy5tZW1iZXJDbGFzc1R5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQkJfQotCQkJaW50IGxhc3QgPSB0eXBlRGVjbGFyYXRpb24ubGFzdEluZGV4T2YoJy4nKTsKLQkJCVN0cmluZyBwa2cgPSAobGFzdCA9PSAtMSkgPyAiIiA6IHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcoMCwgbGFzdCk7Ci0JCQlTdHJpbmcgc2hvcnRUeXBlRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKGxhc3QgKyAxKTsKLQkJCVN0cmluZyBzaG9ydEVsZW1lbnRUeXBlTmFtZSA9IHNob3J0VHlwZURlY2xhcmF0aW9uOwotCQkJd2hpbGUgKHNob3J0RWxlbWVudFR5cGVOYW1lLmVuZHNXaXRoKCJbXSIpKSB7Ci0JCQkJc2hvcnRFbGVtZW50VHlwZU5hbWUgPSBzaG9ydEVsZW1lbnRUeXBlTmFtZS5zdWJzdHJpbmcoMCwgc2hvcnRFbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgLSAyKTsKLQkJCX0KLQkJCVN0cmluZyBwcmV2ID0gdGhpcy5pbXBvcnRzLmdldChzaG9ydEVsZW1lbnRUeXBlTmFtZSk7Ci0JCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJLy8gdGhpcyBpcyB0aGUgZmlyc3QgY2xhc3Mgd2l0aCB0aGlzIHNob3J0IGVsZW1lbnQgdHlwZSBuYW1lCi0JCQkJdGhpcy5pbXBvcnRzLnB1dChzaG9ydEVsZW1lbnRUeXBlTmFtZSwgcGtnKTsKLQkJCQlyZXR1cm4gc2hvcnRUeXBlRGVjbGFyYXRpb247Ci0JCQl9Ci0JCQlpZiAocHJldi5lcXVhbHMocGtnKSkgewotCQkJCS8vIHRoaXMgZWxlbWVudCB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gaW1wb3J0ZWQKLQkJCQlyZXR1cm4gc2hvcnRUeXBlRGVjbGFyYXRpb247Ci0JCQl9Ci0JCQkvLyBhbm90aGVyIGNsYXNzIHdpdGggdGhlIHNhbWUgc2hvcnQgZWxlbWVudCB0eXBlIG5hbWUgaGFzIGJlZW4KLQkJCS8vIHByZXZpb3VzbHkgaW1wb3J0ZWQsIHNvIHRoaXMgb25lIG11c3QgYmUgdXNlZCBmdWxseS1xdWFsaWZpZWQKLQkJCXJldHVybiB0eXBlRGVjbGFyYXRpb247Ci0JCX0KLQotCQkvKioKLQkJICogZS5nLiAiZm9vLmJhci5FbXBsb3llZS5QSyIgd2lsbCByZXR1cm4gdHJ1ZQotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIHR5cGVEZWNsYXJhdGlvbklzTWVtYmVyQ2xhc3MoU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQkJcmV0dXJuICh0eXBlRGVjbGFyYXRpb24ubGVuZ3RoKCkgPiB0aGlzLmNsYXNzTmFtZS5sZW5ndGgoKSkKLQkJCQkJJiYgdHlwZURlY2xhcmF0aW9uLnN0YXJ0c1dpdGgodGhpcy5jbGFzc05hbWUpCi0JCQkJCSYmICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KHRoaXMuY2xhc3NOYW1lLmxlbmd0aCgpKSA9PSAnLicpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGUuZy4gImZvby5iYXIuRW1wbG95ZWUuUEsiIHdpbGwgcmV0dXJuICJFbXBsb3llZS5QSyIKLQkJICogdGhpcyBwcmV2ZW50cyBjb2xsaXNpb25zIHdpdGggb3RoZXIgaW1wb3J0ZWQgY2xhc3NlcyAoZS5nLiAiam9vLmphci5QSyIpCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBtZW1iZXJDbGFzc1R5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLnBhY2thZ2VOYW1lLmxlbmd0aCgpOwotCQkJaWYgKGluZGV4ICE9IDApIHsKLQkJCQlpbmRleCsrOyAgLy8gYnVtcCBwYXN0IHRoZSAnLicKLQkJCX0KLQkJCXJldHVybiB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKGluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBpbXBvcnRFbnRyaWVzKCkgewotCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+LCBNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+Pih0aGlzLnNvcnRlZEltcG9ydEVudHJpZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IG5leHQpIHsKLQkJCQkJU3RyaW5nIHBrZyA9IG5leHQuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKHBrZy5lcXVhbHMoIiIpCi0JCQkJCQkJfHwgcGtnLmVxdWFscygiamF2YS5sYW5nIikKLQkJCQkJCQl8fCBwa2cuZXF1YWxzKEVudGl0eVNvdXJjZVdyaXRlci50aGlzLnBhY2thZ2VOYW1lKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IHNvcnRlZEltcG9ydEVudHJpZXMoKSB7Ci0JCQlUcmVlU2V0PE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IHNvcnRlZEltcG9ydHMgPSBuZXcgVHJlZVNldDxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+Pih0aGlzLmJ1aWxkSW1wb3J0RW50cmllc0NvbXBhcmF0b3IoKSk7Ci0JCQlzb3J0ZWRJbXBvcnRzLmFkZEFsbCh0aGlzLmltcG9ydHMuZW50cnlTZXQoKSk7Ci0JCQlyZXR1cm4gc29ydGVkSW1wb3J0cy5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHJpdmF0ZSBDb21wYXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGJ1aWxkSW1wb3J0RW50cmllc0NvbXBhcmF0b3IoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4oKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZTEsIE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZTIpIHsKLQkJCQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJCQlpbnQgcGtnID0gY29sbGF0b3IuY29tcGFyZShlMS5nZXRWYWx1ZSgpLCBlMi5nZXRWYWx1ZSgpKTsKLQkJCQkJcmV0dXJuIChwa2cgPT0gMCkgPyBjb2xsYXRvci5jb21wYXJlKGUxLmdldEtleSgpLCBlMi5nZXRLZXkoKSkgOiBwa2c7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXZvaWQgcHJpbnRHZXR0ZXJBbmRTZXR0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHZpc2liaWxpdHkpIHsKLQkJCXRoaXMucHJpbnRHZXR0ZXIocHJvcGVydHlOYW1lLCB0eXBlRGVjbGFyYXRpb24sIHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQotCQkJdGhpcy5wcmludFNldHRlcihwcm9wZXJ0eU5hbWUsIHR5cGVEZWNsYXJhdGlvbiwgdmlzaWJpbGl0eSk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQkJCXRoaXMucHJpbnRsbigpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByaW50R2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCQl0aGlzLnByaW50VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJCXRoaXMucHJpbnQoJyAnKTsKLQkJCXRoaXMucHJpbnQodHlwZURlY2xhcmF0aW9uLmVxdWFscygiYm9vbGVhbiIpID8gImlzIiA6ICJnZXQiKTsKLQkJCXRoaXMucHJpbnQoU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShwcm9wZXJ0eU5hbWUpKTsKLQkJCXRoaXMucHJpbnQoIigpIHsiKTsKLQkJCXRoaXMucHJpbnRsbigpOwotCi0JCQl0aGlzLmluZGVudCgpOwotCQkJCXRoaXMucHJpbnQoInJldHVybiB0aGlzLiIpOwotCQkJCXRoaXMucHJpbnQocHJvcGVydHlOYW1lKTsKLQkJCQl0aGlzLnByaW50KCc7Jyk7Ci0JCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnVuZGVudCgpOwotCi0JCQl0aGlzLnByaW50KCd9Jyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJpbnRTZXR0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHZpc2liaWxpdHkpIHsKLQkJCXRoaXMucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludCgidm9pZCBzZXQiKTsKLQkJCXRoaXMucHJpbnQoU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShwcm9wZXJ0eU5hbWUpKTsKLQkJCXRoaXMucHJpbnQoJygnKTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJCXRoaXMucHJpbnQoJyAnKTsKLQkJCXRoaXMucHJpbnQocHJvcGVydHlOYW1lKTsKLQkJCXRoaXMucHJpbnQoIikgeyIpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0KLQkJCXRoaXMuaW5kZW50KCk7Ci0JCQkJdGhpcy5wcmludCgidGhpcy4iKTsKLQkJCQl0aGlzLnByaW50KHByb3BlcnR5TmFtZSk7Ci0JCQkJdGhpcy5wcmludCgiID0gIik7Ci0JCQkJdGhpcy5wcmludChwcm9wZXJ0eU5hbWUpOwotCQkJCXRoaXMucHJpbnQoJzsnKTsKLQkJCQl0aGlzLnByaW50bG4oKTsKLQkJCXRoaXMudW5kZW50KCk7Ci0KLQkJCXRoaXMucHJpbnQoJ30nKTsKLQkJfQotCi0JCXZvaWQgcHJpbnRDb2xsZWN0aW9uR2V0dGVyQW5kU2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBjb2xsZWN0aW9uVHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHZpc2liaWxpdHkpIHsKLQkJCXRoaXMucHJpbnRDb2xsZWN0aW9uR2V0dGVyKHByb3BlcnR5TmFtZSwgY29sbGVjdGlvblR5cGVEZWNsYXJhdGlvbiwgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgdmlzaWJpbGl0eSk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQkJCXRoaXMucHJpbnRsbigpOwotCi0JCQl0aGlzLnByaW50Q29sbGVjdGlvblNldHRlcihwcm9wZXJ0eU5hbWUsIGNvbGxlY3Rpb25UeXBlRGVjbGFyYXRpb24sIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24sIHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcmludENvbGxlY3Rpb25HZXR0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGNvbGxlY3Rpb25UeXBlRGVjbGFyYXRpb24sIFN0cmluZyBlbGVtZW50VHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgdmlzaWJpbGl0eSkgewotCQkJdGhpcy5wcmludFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0JCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKGNvbGxlY3Rpb25UeXBlRGVjbGFyYXRpb24pOwotCQkJdGhpcy5wcmludCgnPCcpOwotCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbihlbGVtZW50VHlwZURlY2xhcmF0aW9uKTsKLQkJCXRoaXMucHJpbnQoIj4gZ2V0Iik7Ci0JCQl0aGlzLnByaW50KFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUocHJvcGVydHlOYW1lKSk7Ci0JCQl0aGlzLnByaW50KCIoKSB7Iik7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQotCQkJdGhpcy5pbmRlbnQoKTsKLQkJCQl0aGlzLnByaW50KCJyZXR1cm4gdGhpcy4iKTsKLQkJCQl0aGlzLnByaW50KHByb3BlcnR5TmFtZSk7Ci0JCQkJdGhpcy5wcmludCgnOycpOwotCQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy51bmRlbnQoKTsKLQotCQkJdGhpcy5wcmludCgnfScpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByaW50Q29sbGVjdGlvblNldHRlcihTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgY29sbGVjdGlvblR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCQl0aGlzLnByaW50VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnQoInZvaWQgc2V0Iik7Ci0JCQl0aGlzLnByaW50KFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUocHJvcGVydHlOYW1lKSk7Ci0JCQl0aGlzLnByaW50KCcoJyk7Ci0JCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKGNvbGxlY3Rpb25UeXBlRGVjbGFyYXRpb24pOwotCQkJdGhpcy5wcmludCgnPCcpOwotCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbihlbGVtZW50VHlwZURlY2xhcmF0aW9uKTsKLQkJCXRoaXMucHJpbnQoJz4nKTsKLQkJCXRoaXMucHJpbnQoJyAnKTsKLQkJCXRoaXMucHJpbnQocHJvcGVydHlOYW1lKTsKLQkJCXRoaXMucHJpbnQoIikgeyIpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0KLQkJCXRoaXMuaW5kZW50KCk7Ci0JCQkJdGhpcy5wcmludCgidGhpcy4iKTsKLQkJCQl0aGlzLnByaW50KHByb3BlcnR5TmFtZSk7Ci0JCQkJdGhpcy5wcmludCgiID0gIik7Ci0JCQkJdGhpcy5wcmludChwcm9wZXJ0eU5hbWUpOwotCQkJCXRoaXMucHJpbnQoJzsnKTsKLQkJCQl0aGlzLnByaW50bG4oKTsKLQkJCXRoaXMudW5kZW50KCk7Ci0KLQkJCXRoaXMucHJpbnQoJ30nKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgc291cmNlKCkgewotCQkJcmV0dXJuIHRoaXMub3V0LnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGxlbmd0aCgpIHsKLQkJCXJldHVybiAoKFN0cmluZ1dyaXRlcikgdGhpcy5vdXQpLmdldEJ1ZmZlcigpLmxlbmd0aCgpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uZmlnICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uZmlnIHsKLQkJcHJpdmF0ZSBib29sZWFuIGNvbnZlcnRUb0NhbWVsQ2FzZSA9IHRydWU7Ci0JCXByaXZhdGUgYm9vbGVhbiBwcm9wZXJ0eUFjY2Vzc1R5cGUgPSBmYWxzZTsgIC8vIGFzIG9wcG9zZWQgdG8gImZpZWxkIgotCQlwcml2YXRlIFN0cmluZyBjb2xsZWN0aW9uVHlwZU5hbWUgPSBTZXQuY2xhc3MuZ2V0TmFtZSgpOwotCQlwcml2YXRlIGludCBmaWVsZFZpc2liaWxpdHkgPSBNb2RpZmllci5QUklWQVRFOwotCQlwcml2YXRlIGludCBtZXRob2RWaXNpYmlsaXR5ID0gTW9kaWZpZXIuUFVCTElDOwotCQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycyA9IHRydWU7Ci0JCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciA9IHRydWU7Ci0JCXByaXZhdGUgYm9vbGVhbiBzZXJpYWxpemFibGUgPSB0cnVlOwotCQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEID0gdHJ1ZTsKLQkJcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsgPSB0cnVlOyAgLy8gYXMgb3Bwb3NlZCB0byBJZENsYXNzCi0JCXByaXZhdGUgTWFwPFRhYmxlLCBTdHJpbmc+IG92ZXJyaWRlRW50aXR5TmFtZXMgPSBuZXcgSGFzaE1hcDxUYWJsZSwgU3RyaW5nPigpOwotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEUgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVEVEID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElDID0gMzsKLQotCi0JCXB1YmxpYyBib29sZWFuIGNvbnZlcnRUb0NhbWVsQ2FzZSgpIHsKLQkJCXJldHVybiB0aGlzLmNvbnZlcnRUb0NhbWVsQ2FzZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0VG9DYW1lbENhc2UoYm9vbGVhbiBjb252ZXJ0VG9DYW1lbENhc2UpIHsKLQkJCXRoaXMuY29udmVydFRvQ2FtZWxDYXNlID0gY29udmVydFRvQ2FtZWxDYXNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcHJvcGVydHlBY2Nlc3NUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMucHJvcGVydHlBY2Nlc3NUeXBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5QWNjZXNzVHlwZShib29sZWFuIHByb3BlcnR5QWNjZXNzVHlwZSkgewotCQkJdGhpcy5wcm9wZXJ0eUFjY2Vzc1R5cGUgPSBwcm9wZXJ0eUFjY2Vzc1R5cGU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBmaWVsZEFjY2Vzc1R5cGUoKSB7Ci0JCQlyZXR1cm4gISB0aGlzLnByb3BlcnR5QWNjZXNzVHlwZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGaWVsZEFjY2Vzc1R5cGUoYm9vbGVhbiBmaWVsZEFjY2Vzc1R5cGUpIHsKLQkJCXRoaXMucHJvcGVydHlBY2Nlc3NUeXBlID0gISBmaWVsZEFjY2Vzc1R5cGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbGxlY3Rpb25UeXBlTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLmNvbGxlY3Rpb25UeXBlTmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDb2xsZWN0aW9uVHlwZU5hbWUoU3RyaW5nIGNvbGxlY3Rpb25UeXBlTmFtZSkgewotCQkJdGhpcy5jb2xsZWN0aW9uVHlwZU5hbWUgPSBjb2xsZWN0aW9uVHlwZU5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEZpZWxkVmlzaWJpbGl0eSgpIHsKLQkJCXJldHVybiB0aGlzLmZpZWxkVmlzaWJpbGl0eTsKLQkJfQotCQkvKiogZW50aXR5IGZpZWxkcyBjYW5ub3QgYmUgJ3B1YmxpYycgKi8KLQkJcHVibGljIHZvaWQgc2V0RmllbGRWaXNpYmlsaXR5KGludCBmaWVsZFZpc2liaWxpdHkpIHsKLQkJCXN3aXRjaCAoZmllbGRWaXNpYmlsaXR5KSB7Ci0JCQkJY2FzZSBQUklWQVRFOgotCQkJCWNhc2UgUEFDS0FHRToKLQkJCQljYXNlIFBST1RFQ1RFRDoKLQkJCQkJdGhpcy5maWVsZFZpc2liaWxpdHkgPSBmaWVsZFZpc2liaWxpdHk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgZmllbGQgdmlzaWJpbGl0eTogIiArIGZpZWxkVmlzaWJpbGl0eSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGZpZWxkVmlzaWJpbGl0eSgpIHsKLQkJCXN3aXRjaCAodGhpcy5maWVsZFZpc2liaWxpdHkpIHsKLQkJCQljYXNlIFBSSVZBVEU6Ci0JCQkJCXJldHVybiAicHJpdmF0ZSI7Ci0JCQkJY2FzZSBQQUNLQUdFOgotCQkJCQlyZXR1cm4gIiI7Ci0JCQkJY2FzZSBQUk9URUNURUQ6Ci0JCQkJCXJldHVybiAicHJvdGVjdGVkIjsKLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGZpZWxkIHZpc2liaWxpdHk6ICIgKyB0aGlzLmZpZWxkVmlzaWJpbGl0eSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1ldGhvZFZpc2liaWxpdHkoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZXRob2RWaXNpYmlsaXR5OwotCQl9Ci0JCS8qKiBlbnRpdHkgcHJvcGVydGllcyBtdXN0IGJlICdwdWJsaWMnIG9yICdwcm90ZWN0ZWQnICovCi0JCXB1YmxpYyB2b2lkIHNldE1ldGhvZFZpc2liaWxpdHkoaW50IG1ldGhvZFZpc2liaWxpdHkpIHsKLQkJCXN3aXRjaCAobWV0aG9kVmlzaWJpbGl0eSkgewotCQkJCWNhc2UgUFJPVEVDVEVEOgotCQkJCWNhc2UgUFVCTElDOgotCQkJCQl0aGlzLm1ldGhvZFZpc2liaWxpdHkgPSBtZXRob2RWaXNpYmlsaXR5OwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIG1ldGhvZCB2aXNpYmlsaXR5OiAiICsgbWV0aG9kVmlzaWJpbGl0eSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIG1ldGhvZFZpc2liaWxpdHkoKSB7Ci0JCQlzd2l0Y2ggKHRoaXMubWV0aG9kVmlzaWJpbGl0eSkgewotCQkJCWNhc2UgUFJPVEVDVEVEOgotCQkJCQlyZXR1cm4gInByb3RlY3RlZCI7Ci0JCQkJY2FzZSBQVUJMSUM6Ci0JCQkJCXJldHVybiAicHVibGljIjsKLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIG1ldGhvZCB2aXNpYmlsaXR5OiAiICsgdGhpcy5tZXRob2RWaXNpYmlsaXR5KTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMoYm9vbGVhbiBnZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKSB7Ci0JCQl0aGlzLmdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMgPSBnZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3Rvcihib29sZWFuIGdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yKSB7Ci0JCQl0aGlzLmdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yID0gZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3I7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzZXJpYWxpemFibGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXJpYWxpemFibGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0U2VyaWFsaXphYmxlKGJvb2xlYW4gc2VyaWFsaXphYmxlKSB7Ci0JCQl0aGlzLnNlcmlhbGl6YWJsZSA9IHNlcmlhbGl6YWJsZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCgpIHsKLQkJCXJldHVybiB0aGlzLmdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQoYm9vbGVhbiBnZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQpIHsKLQkJCXRoaXMuZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEID0gZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpIHsKLQkJCXJldHVybiB0aGlzLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEs7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0R2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSyhib29sZWFuIGdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEspIHsKLQkJCXRoaXMuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSyA9IGdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEs7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZUlkQ2xhc3NGb3JDb21wb3VuZFBLKCkgewotCQkJcmV0dXJuICEgdGhpcy5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlSWRDbGFzc0ZvckNvbXBvdW5kUEsoYm9vbGVhbiBnZW5lcmF0ZUlkQ2xhc3NGb3JDb21wb3VuZFBLKSB7Ci0JCQl0aGlzLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsgPSAhIGdlbmVyYXRlSWRDbGFzc0ZvckNvbXBvdW5kUEs7Ci0JCX0KLQotCQkvKioKLQkJICoga2V5ID0gdGFibGUKLQkJICogdmFsdWUgPSB1c2VyLXN1cHBsaWVkIG92ZXJyaWRlIGVudGl0eSBuYW1lCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldE92ZXJyaWRlRW50aXR5TmFtZShUYWJsZSB0YWJsZSkgewotCQkJcmV0dXJuIHRoaXMub3ZlcnJpZGVFbnRpdHlOYW1lcy5nZXQodGFibGUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE92ZXJyaWRlRW50aXR5TmFtZShUYWJsZSB0YWJsZSwgU3RyaW5nIG92ZXJyaWRlRW50aXR5TmFtZSkgewotCQkJdGhpcy5vdmVycmlkZUVudGl0eU5hbWVzLnB1dCh0YWJsZSwgb3ZlcnJpZGVFbnRpdHlOYW1lKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjbGVhck92ZXJyaWRlRW50aXR5TmFtZXMoKSB7Ci0JCQl0aGlzLm92ZXJyaWRlRW50aXR5TmFtZXMuY2xlYXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRPdmVycmlkZUVudGl0eU5hbWVzKE1hcDxUYWJsZSwgU3RyaW5nPiBvdmVycmlkZUVudGl0eU5hbWVzKSB7Ci0JCQl0aGlzLmNsZWFyT3ZlcnJpZGVFbnRpdHlOYW1lcygpOwotCQkJZm9yIChNYXAuRW50cnk8VGFibGUsIFN0cmluZz4gZW50cnkgOiBvdmVycmlkZUVudGl0eU5hbWVzLmVudHJ5U2V0KCkpIHsKLQkJCQl0aGlzLnNldE92ZXJyaWRlRW50aXR5TmFtZShlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25maWcgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgT3ZlcndyaXRlQ29uZmlybWVyIHsKLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRpdHkgZ2VuZXJhdG9yIHNob3VsZCBvdmVyd3JpdGUgdGhlIHNwZWNpZmllZAotCQkgKiBmaWxlLgotCQkgKi8KLQkJYm9vbGVhbiBvdmVyd3JpdGUoU3RyaW5nIGNsYXNzTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0dlblNjb3BlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0dlblNjb3BlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYmI3OTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9HZW5TY29wZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi1jbGFzcyBHZW5TY29wZSB7Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8VGFibGUsIEdlblRhYmxlPiBnZW5UYWJsZXMgPSBuZXcgSGFzaE1hcDxUYWJsZSwgR2VuVGFibGU+KCk7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCUdlblNjb3BlKENvbGxlY3Rpb248VGFibGU+IHRhYmxlcywgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWcsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZSh0YWJsZXMsIGVudGl0eUNvbmZpZywgcHJvZ3Jlc3NNb25pdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tDYW5jZWxlZCgpIHsKLQkJaWYgKHRoaXMucHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShDb2xsZWN0aW9uPFRhYmxlPiB0YWJsZXMsIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy5wcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCQl0aGlzLmJ1aWxkR2VuVGFibGVzKHRhYmxlcywgZW50aXR5Q29uZmlnKTsKLQkJY2hlY2tDYW5jZWxlZCgpOwotCQl0aGlzLmNvbmZpZ3VyZU1hbnlUb01hbnlSZWxhdGlvbnMoKTsKLQkJY2hlY2tDYW5jZWxlZCgpOwotCQl0aGlzLmNvbmZpZ3VyZU1hbnlUb09uZVJlbGF0aW9ucygpOwotCQljaGVja0NhbmNlbGVkKCk7Ci0JCXRoaXMuY29uZmlndXJlRmllbGROYW1lcygpOwotCQljaGVja0NhbmNlbGVkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkR2VuVGFibGVzKENvbGxlY3Rpb248VGFibGU+IHRhYmxlcywgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWcpIHsKLQkJaW50IHNpemUgPSB0YWJsZXMuc2l6ZSgpOwotCQkvLyBwYXNzIGFyb3VuZCBhIGdyb3dpbmcgbGlzdCBvZiB0aGUgZW50aXR5IG5hbWVzIHNvIHdlIGNhbiBhdm9pZCBkdXBsaWNhdGVzCi0JCVNldDxTdHJpbmc+IGVudGl0eU5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihzaXplKTsKLQkJZm9yIChUYWJsZSB0YWJsZSA6IHRhYmxlcykgewotCQkJdGhpcy5idWlsZEdlblRhYmxlKHRhYmxlLCBlbnRpdHlDb25maWcsIGVudGl0eU5hbWVzKTsKLQkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLndvcmtlZCg0MC9zaXplKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEdlblRhYmxlKFRhYmxlIHRhYmxlLCBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGVudGl0eUNvbmZpZywgQ29sbGVjdGlvbjxTdHJpbmc+IGVudGl0eU5hbWVzKSB7Ci0JCXRoaXMuZ2VuVGFibGVzLnB1dCh0YWJsZSwgbmV3IEdlblRhYmxlKHRoaXMsIHRhYmxlLCBlbnRpdHlDb25maWcsIGVudGl0eU5hbWVzKSk7Ci0JfQotCi0JLyoqCi0JICogZmluZCBhbGwgdGhlICJqb2luIiB0YWJsZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlTWFueVRvTWFueVJlbGF0aW9ucygpIHsKLQkJaW50IHRhYmxlc1NpemUgPSBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnRhYmxlcygpKTsKLQotCQkvL2ZpcnN0IHRpbWUgdGFrZXMgdGhlIGxvbmdlc3QsIHNob3VsZCB3ZSB0YWtlIHRoYXQgaW50byBhY2NvdW50PwotCQlmb3IgKEl0ZXJhdG9yPEdlblRhYmxlPiBzdHJlYW0gPSB0aGlzLnRhYmxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWNoZWNrQ2FuY2VsZWQoKTsKLQkJCXN0cmVhbS5uZXh0KCkuY29uZmlndXJlTWFueVRvTWFueVJlbGF0aW9ucygpOwotCQkJdGhpcy5wcm9ncmVzc01vbml0b3Iud29ya2VkKDczMC90YWJsZXNTaXplKTsKLQkJfQotCQkvLyByZXZlcnQgYW55ICJqb2luIiB0YWJsZSB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgYW5vdGhlciB0YWJsZSBiYWNrIHRvIGFuICJlbnRpdHkiIHRhYmxlCi0JCVNldDxHZW5UYWJsZT4gcmVmZXJlbmNlZFRhYmxlcyA9IHRoaXMuYnVpbGRSZWZlcmVuY2VkVGFibGVzKCk7Ci0JCXRhYmxlc1NpemUgPSBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmpvaW5UYWJsZXMoKSk7Ci0JCWZvciAoSXRlcmF0b3I8R2VuVGFibGU+IHN0cmVhbSA9IHRoaXMuam9pblRhYmxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUdlblRhYmxlIGpvaW5HZW5UYWJsZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAocmVmZXJlbmNlZFRhYmxlcy5jb250YWlucyhqb2luR2VuVGFibGUpKSB7Ci0JCQkJam9pbkdlblRhYmxlLmNsZWFySm9pblRhYmxlUmVsYXRpb24oKTsKLQkJCX0KLQkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLndvcmtlZCg0MC90YWJsZXNTaXplKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGZpbmQgYWxsIHRoZSBtYW55LXRvLW9uZSBhbmQgb25lLXRvLW1hbnkgcmVsYXRpb25zCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZU1hbnlUb09uZVJlbGF0aW9ucygpIHsKLQkJaW50IHRhYmxlc1NpemUgPSBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmVudGl0eVRhYmxlcygpKTsKLQkJZm9yIChJdGVyYXRvcjxHZW5UYWJsZT4gc3RyZWFtID0gdGhpcy5lbnRpdHlUYWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpLmNvbmZpZ3VyZU1hbnlUb09uZVJlbGF0aW9ucygpOwotCQkJdGhpcy5wcm9ncmVzc01vbml0b3Iud29ya2VkKDUwL3RhYmxlc1NpemUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZGV0ZXJtaW5lIGFsbCB0aGUgSmF2YSBmaWVsZCBuYW1lcyB1cC1mcm9udCBiZWNhdXNlIHdlIHdpbGwKLQkgKiBuZWVkIHRoZW0gZm9yIHRoaW5ncyBsaWtlICdtYXBwZWRCeScgYW5ub3RhdGlvbiBlbGVtZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVGaWVsZE5hbWVzKCkgewotCQlpbnQgdGFibGVzU2l6ZSA9IENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuZW50aXR5VGFibGVzKCkpOwotCQlmb3IgKEl0ZXJhdG9yPEdlblRhYmxlPiBzdHJlYW0gPSB0aGlzLmVudGl0eVRhYmxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXN0cmVhbS5uZXh0KCkuY29uZmlndXJlRmllbGROYW1lcygpOwotCQkJdGhpcy5wcm9ncmVzc01vbml0b3Iud29ya2VkKDUwL3RhYmxlc1NpemUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBhY2thZ2UgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIHJldHVybiBvbmx5IHRoZSBnZW4gdGFibGVzIHRoYXQgYXJlIHN1aXRhYmxlIGZvciBnZW5lcmF0aW5nCi0JICogZW50aXRpZXMgKGkuZS4gZXhjbHVkZSB0aGUgImpvaW4iIHRhYmxlcykKLQkgKi8KLQlJdGVyYXRvcjxHZW5UYWJsZT4gZW50aXR5VGFibGVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEdlblRhYmxlLCBHZW5UYWJsZT4odGhpcy50YWJsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoR2VuVGFibGUgbmV4dCkgewotCQkJCXJldHVybiAhIG5leHQuaXNKb2luVGFibGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlpbnQgbnVtRW50aXR5VGFibGVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5VGFibGVzKCkpOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gdGhlIGdlbiB0YWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgdGFibGUKLQkgKi8KLQlHZW5UYWJsZSBnZW5UYWJsZShUYWJsZSB0YWJsZSkgewotCQlyZXR1cm4gdGhpcy5nZW5UYWJsZXMuZ2V0KHRhYmxlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgQVBJICoqKioqKioqKioKLQotCXByaXZhdGUgSXRlcmF0b3I8R2VuVGFibGU+IHRhYmxlcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuVGFibGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIG9ubHkgdGhlICJqb2luIiBnZW4gdGFibGVzCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxHZW5UYWJsZT4gam9pblRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxHZW5UYWJsZSwgR2VuVGFibGU+KHRoaXMudGFibGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEdlblRhYmxlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5pc0pvaW5UYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgc2V0IG9mIHRoZSB0YWJsZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSBvdGhlciB0YWJsZXMKLQkgKiBpbiB0aGUgc2NvcGUKLQkgKi8KLQlwcml2YXRlIFNldDxHZW5UYWJsZT4gYnVpbGRSZWZlcmVuY2VkVGFibGVzKCkgewotCQlpbnQgc2l6ZSA9IENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMudGFibGVzKCkpOwotCQlTZXQ8R2VuVGFibGU+IHJlZmVyZW5jZWRUYWJsZXMgPSBuZXcgSGFzaFNldDxHZW5UYWJsZT4odGhpcy5nZW5UYWJsZXMuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvcjxHZW5UYWJsZT4gc3RyZWFtID0gdGhpcy50YWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpLmFkZFJlZmVyZW5jZWRUYWJsZXNUbyhyZWZlcmVuY2VkVGFibGVzKTsKLQkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgyMC9zaXplKTsKLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlZFRhYmxlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvR2VuVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvR2VuVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1YTUxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0dlblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLk5hbWVUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci0KLS8qKgotICogYXNzb2NpYXRlIGEgdGFibGUgd2l0aCB0aGUgdmFyaW91cyByZWxhdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbgotICogZ2VuZXJhdGluZyB0aGUgZW50aXR5Ci0gKi8KLWNsYXNzIEdlblRhYmxlIHsKLQlwcml2YXRlIGZpbmFsIEdlblNjb3BlIHNjb3BlOwotCXByaXZhdGUgZmluYWwgVGFibGUgdGFibGU7Ci0JcHJpdmF0ZSBmaW5hbCBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGVudGl0eUNvbmZpZzsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBlbnRpdHlOYW1lOwotCXByaXZhdGUgTWFueVRvTWFueVJlbGF0aW9uIGpvaW5UYWJsZVJlbGF0aW9uOwotCXByaXZhdGUgQ29sbGVjdGlvbjxNYW55VG9NYW55UmVsYXRpb24+IG93bmVkTWFueVRvTWFueVJlbGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8TWFueVRvTWFueVJlbGF0aW9uPigpOwotCXByaXZhdGUgQ29sbGVjdGlvbjxNYW55VG9NYW55UmVsYXRpb24+IG5vbk93bmVkTWFueVRvTWFueVJlbGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8TWFueVRvTWFueVJlbGF0aW9uPigpOwotCXByaXZhdGUgQ29sbGVjdGlvbjxNYW55VG9PbmVSZWxhdGlvbj4gbWFueVRvT25lUmVsYXRpb25zID0gbmV3IEFycmF5TGlzdDxNYW55VG9PbmVSZWxhdGlvbj4oKTsKLQlwcml2YXRlIENvbGxlY3Rpb248T25lVG9NYW55UmVsYXRpb24+IG9uZVRvTWFueVJlbGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8T25lVG9NYW55UmVsYXRpb24+KCk7Ci0JcHJpdmF0ZSBTZXQ8Q29sdW1uPiBmb3JlaWduS2V5Q29sdW1ucyA9IG5ldyBIYXNoU2V0PENvbHVtbj4oKTsKLQotCS8vIGtleT1jb2x1bW4vcmVsYXRpb247IHZhbHVlPW5hbWUKLQlwcml2YXRlIGZpbmFsIE1hcDxPYmplY3QsIFN0cmluZz4gZmllbGROYW1lcyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgU3RyaW5nPigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEVNQkVEREVEX0lEX1ZJUlRVQUxfQ09MVU1OID0gbmV3IE9iamVjdCgpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlHZW5UYWJsZShHZW5TY29wZSBzY29wZSwgVGFibGUgdGFibGUsIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnLCBDb2xsZWN0aW9uPFN0cmluZz4gZW50aXR5TmFtZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCQl0aGlzLnRhYmxlID0gdGFibGU7Ci0JCXRoaXMuZW50aXR5Q29uZmlnID0gZW50aXR5Q29uZmlnOwotCQl0aGlzLmVudGl0eU5hbWUgPSB0aGlzLmJ1aWxkRW50aXR5TmFtZShlbnRpdHlOYW1lcyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRFbnRpdHlOYW1lKENvbGxlY3Rpb248U3RyaW5nPiBlbnRpdHlOYW1lcykgewotCQlTdHJpbmcgbmFtZSA9IHRoaXMudGFibGUuZ2V0U2hvcnRKYXZhQ2xhc3NOYW1lKCk7Ci0JCVN0cmluZyBvdmVycmlkZUVudGl0eU5hbWUgPSB0aGlzLmVudGl0eUNvbmZpZy5nZXRPdmVycmlkZUVudGl0eU5hbWUodGhpcy50YWJsZSk7Ci0JCWlmIChvdmVycmlkZUVudGl0eU5hbWUgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZW50aXR5Q29uZmlnLmNvbnZlcnRUb0NhbWVsQ2FzZSgpKSB7Ci0JCQkJLy8gY2FtZWwtY2FzaW5nIGNhbiBjb252ZXJ0IGEgbmFtZSBiYWNrIHRvIGEgcmVzZXJ2ZWQgd29yZCAoZS5nLiAicGFja2FnZV8iIC0+ICJwYWNrYWdlIikKLQkJCQluYW1lID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG5hbWUpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW5hbWUgPSBvdmVycmlkZUVudGl0eU5hbWU7Ci0JCX0KLQkJbmFtZSA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZShuYW1lLCBlbnRpdHlOYW1lcyk7Ci0JCWVudGl0eU5hbWVzLmFkZChuYW1lKTsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBhY2thZ2UgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIGRldGVybWluZSB3aGV0aGVyIHRoZSB0YWJsZSBpcyBhICJqb2luIiB0YWJsZSB3aXRoaW4gdGhlIHRhYmxlJ3Mgc2NvcGUKLQkgKi8KLQl2b2lkIGNvbmZpZ3VyZU1hbnlUb01hbnlSZWxhdGlvbnMoKSB7Ci0JCWlmICh0aGlzLnRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpICE9IDIpIHsKLQkJCS8vIHRoZSB0YWJsZSBtdXN0IGhhdmUgZXhhY3RseSAyIGZvcmVpZ24ga2V5cwotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLnRhYmxlLmNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoICEgdGhpcy50YWJsZS5mb3JlaWduS2V5QmFzZUNvbHVtbnNDb250YWlucyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCS8vIGFsbCB0aGUgdGFibGUncyBjb2x1bW5zIG11c3QgYmVsb25nIHRvIG9uZSAob3IgYm90aCkgb2YgdGhlIDIgZm9yZWlnbiBrZXlzCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCUl0ZXJhdG9yPEZvcmVpZ25LZXk+IGZLZXlzID0gdGhpcy50YWJsZS5mb3JlaWduS2V5cygpOwotCQlGb3JlaWduS2V5IG93bmluZ0ZLID0gZktleXMubmV4dCgpOwotCQlGb3JlaWduS2V5IG5vbk93bmluZ0ZLID0gZktleXMubmV4dCgpOwotCQlHZW5UYWJsZSBvd25pbmdUYWJsZSA9IHRoaXMuc2NvcGUuZ2VuVGFibGUob3duaW5nRksuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCQlHZW5UYWJsZSBub25Pd25pbmdUYWJsZSA9IHRoaXMuc2NvcGUuZ2VuVGFibGUobm9uT3duaW5nRksuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCQlpZiAoKG93bmluZ1RhYmxlID09IG51bGwpIHx8IChub25Pd25pbmdUYWJsZSA9PSBudWxsKSkgewotCQkJLy8gYm90aCB0YWJsZXMgbXVzdCBiZSBpbiB0aGUgc2NvcGUKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmpvaW5UYWJsZVJlbGF0aW9uID0gbmV3IE1hbnlUb01hbnlSZWxhdGlvbih0aGlzLCBvd25pbmdGSywgb3duaW5nVGFibGUsIG5vbk93bmluZ0ZLLCBub25Pd25pbmdUYWJsZSk7Ci0JfQotCi0Jdm9pZCBhZGRSZWZlcmVuY2VkVGFibGVzVG8oU2V0PEdlblRhYmxlPiByZWZlcmVuY2VkVGFibGVzKSB7Ci0JCWZvciAoSXRlcmF0b3I8Rm9yZWlnbktleT4gc3RyZWFtID0gdGhpcy50YWJsZS5mb3JlaWduS2V5cygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUZvcmVpZ25LZXkgZmsgPSBzdHJlYW0ubmV4dCgpOwotCQkJR2VuVGFibGUgZ2VuVGFibGUgPSB0aGlzLnNjb3BlLmdlblRhYmxlKGZrLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQkJCWlmIChnZW5UYWJsZSAhPSBudWxsKSB7Ci0JCQkJcmVmZXJlbmNlZFRhYmxlcy5hZGQoZ2VuVGFibGUpOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhckpvaW5UYWJsZVJlbGF0aW9uKCkgewotCQl0aGlzLmpvaW5UYWJsZVJlbGF0aW9uLmNsZWFyKCk7Ci0JCXRoaXMuam9pblRhYmxlUmVsYXRpb24gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIGZpbmQgImluLXNjb3BlIiBmb3JlaWduIGtleXMKLQkgKi8KLQl2b2lkIGNvbmZpZ3VyZU1hbnlUb09uZVJlbGF0aW9ucygpIHsKLQkJZm9yIChJdGVyYXRvcjxGb3JlaWduS2V5PiBzdHJlYW0gPSB0aGlzLnRhYmxlLmZvcmVpZ25LZXlzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJRm9yZWlnbktleSBmayA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlHZW5UYWJsZSByZWZlcmVuY2VkdGFibGUgPSB0aGlzLnNjb3BlLmdlblRhYmxlKGZrLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQkJCWlmIChyZWZlcmVuY2VkdGFibGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOyAgLy8gc2tpcCB0byBuZXh0IEZLCi0JCQl9Ci0JCQl0aGlzLm1hbnlUb09uZVJlbGF0aW9ucy5hZGQobmV3IE1hbnlUb09uZVJlbGF0aW9uKHRoaXMsIGZrLCByZWZlcmVuY2VkdGFibGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIG5vdyB0aGF0IGFsbCB0aGUgcmVsYXRpb25zIGFyZSBpbiBwbGFjZSwgd2UgY2FuIGNvbmZpZ3VyZSB0aGUgSmF2YQotCSAqIGZpZWxkIG5hbWVzCi0JICovCi0Jdm9pZCBjb25maWd1cmVGaWVsZE5hbWVzKCkgewotCQlTZXQ8Q29sdW1uPiBjb2x1bW5zID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLnRhYmxlLmNvbHVtbnMoKSk7Ci0JCWlmICgodGhpcy50YWJsZS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA+IDEpICYmIHRoaXMuZW50aXR5Q29uZmlnLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoKSkgewotCQkJLy8gaWYgd2UgYXJlIGdvaW5nIHRvIGdlbmVyYXRlIGFuIEVtYmVkZGVkSWQgZmllbGQsIGFkZCBpdCB0bwotCQkJLy8gJ2ZpZWxkTmFtZXMnIHNvIHdlIGRvbid0IGNvbGxpZGUgd2l0aCBpdCBsYXRlciwgd2hlbiBnZW5lcmF0aW5nCi0JCQkvLyBmaWVsZCBuYW1lcyBmb3IgdGhlIGNvbHVtbnMgZXRjLgotCQkJdGhpcy5jb25maWd1cmVGaWVsZE5hbWUoRU1CRURERURfSURfVklSVFVBTF9DT0xVTU4sICJwayIpOwotCQl9Ci0JCXRoaXMuY29uZmlndXJlTWFueVRvT25lRmllbGROYW1lcyhjb2x1bW5zKTsKLQkJdGhpcy5jb25maWd1cmVCYXNpY0ZpZWxkTmFtZXMoY29sdW1ucyk7Ci0JCXRoaXMuY29uZmlndXJlT25lVG9NYW55RmllbGROYW1lcygpOwotCQl0aGlzLmNvbmZpZ3VyZU93bmVkTWFueVRvTWFueUZpZWxkTmFtZXMoKTsKLQkJdGhpcy5jb25maWd1cmVOb25Pd25lZE1hbnlUb01hbnlGaWVsZE5hbWVzKCk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBjb2x1bW5zIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHRhYmxlJ3MgcHJpbWFyeSBrZXkKLQkgKiBidXQgYXJlIGFsc28gcGFydCBvZiBhbiAiaW4tc2NvcGUiIGZvcmVpZ24ga2V5Ci0JICovCi0JSXRlcmF0b3I8Q29sdW1uPiByZWFkT25seVByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPENvbHVtbiwgQ29sdW1uPih0aGlzLnRhYmxlLnByaW1hcnlLZXlDb2x1bW5zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KENvbHVtbiBjb2x1bW4pIHsKLQkJCQlyZXR1cm4gR2VuVGFibGUudGhpcy5mb3JlaWduS2V5Q29sdW1uc0NvbnRhaW5zKGNvbHVtbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBjb2x1bW5zIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHRhYmxlJ3MgcHJpbWFyeSBrZXkKLQkgKiBidXQgYXJlIE5PVCBwYXJ0IG9mIGFueSAiaW4tc2NvcGUiIGZvcmVpZ24ga2V5Ci0JICovCi0JSXRlcmF0b3I8Q29sdW1uPiB3cml0YWJsZVByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPENvbHVtbiwgQ29sdW1uPih0aGlzLnRhYmxlLnByaW1hcnlLZXlDb2x1bW5zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KENvbHVtbiBjb2x1bW4pIHsKLQkJCQlyZXR1cm4gISBHZW5UYWJsZS50aGlzLmZvcmVpZ25LZXlDb2x1bW5zQ29udGFpbnMoY29sdW1uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGNvbHVtbnMgdGhhdCBORUlUSEVSIHBhcnQgb2YgdGhlIHRhYmxlJ3MgcHJpbWFyeSBrZXkKLQkgKiBOT1IgcGFydCBvZiBhbnkgZm9yZWlnbiBrZXkKLQkgKi8KLQlJdGVyYXRvcjxDb2x1bW4+IG5vblByaW1hcnlLZXlCYXNpY0NvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8Q29sdW1uLCBDb2x1bW4+KHRoaXMudGFibGUuY29sdW1ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChDb2x1bW4gY29sdW1uKSB7Ci0JCQkJcmV0dXJuICEgKEdlblRhYmxlLnRoaXMucHJpbWFyeUtleUNvbHVtbnNDb250YWlucyhjb2x1bW4pCi0JCQkJCQl8fCBHZW5UYWJsZS50aGlzLmZvcmVpZ25LZXlDb2x1bW5zQ29udGFpbnMoY29sdW1uKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JVGFibGUgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlOwotCX0KLQotCVN0cmluZyBnZXRFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHlOYW1lOwotCX0KLQotCWJvb2xlYW4gaXNKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5UYWJsZVJlbGF0aW9uICE9IG51bGw7Ci0JfQotCi0Jdm9pZCBhZGRPd25lZE1hbnlUb01hbnlSZWxhdGlvbihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24pIHsKLQkJdGhpcy5vd25lZE1hbnlUb01hbnlSZWxhdGlvbnMuYWRkKHJlbGF0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlbW92ZU93bmVkTWFueVRvTWFueVJlbGF0aW9uKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbikgewotCQl0aGlzLm93bmVkTWFueVRvTWFueVJlbGF0aW9ucy5yZW1vdmUocmVsYXRpb24pOwotCX0KLQotCXZvaWQgYWRkTm9uT3duZWRNYW55VG9NYW55UmVsYXRpb24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXRoaXMubm9uT3duZWRNYW55VG9NYW55UmVsYXRpb25zLmFkZChyZWxhdGlvbik7Ci0JfQotCi0Jdm9pZCByZW1vdmVOb25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24pIHsKLQkJdGhpcy5ub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMucmVtb3ZlKHJlbGF0aW9uKTsKLQl9Ci0KLQl2b2lkIGFkZE9uZVRvTWFueVJlbGF0aW9uKE9uZVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXRoaXMub25lVG9NYW55UmVsYXRpb25zLmFkZChyZWxhdGlvbik7Ci0JfQotCi0JU3RyaW5nIGphdmFGaWVsZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlLmdldEphdmFGaWVsZE5hbWUoKTsKLQl9Ci0KLQlJdGVyYXRvcjxNYW55VG9PbmVSZWxhdGlvbj4gbWFueVRvT25lUmVsYXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5tYW55VG9PbmVSZWxhdGlvbnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlJdGVyYXRvcjxPbmVUb01hbnlSZWxhdGlvbj4gb25lVG9NYW55UmVsYXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5vbmVUb01hbnlSZWxhdGlvbnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlJdGVyYXRvcjxNYW55VG9NYW55UmVsYXRpb24+IG93bmVkTWFueVRvTWFueVJlbGF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMub3duZWRNYW55VG9NYW55UmVsYXRpb25zLml0ZXJhdG9yKCk7Ci0JfQotCi0JSXRlcmF0b3I8TWFueVRvTWFueVJlbGF0aW9uPiBub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLm5vbk93bmVkTWFueVRvTWFueVJlbGF0aW9ucy5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIHRoZSBrZXkgY2FuIGJlIGEgY29sdW1uIG9yIHJlbGF0aW9uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZmllbGROYW1lRm9ySW50ZXJuYWwoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuZmllbGROYW1lcy5nZXQobyk7Ci0JfQotCi0JLyoqCi0JICogdGhpcyB3aWxsIHJldHVybiBudWxsIGlmIHdlIGRvbid0IHdhbnQgYW4gZW1iZWRkZWQgaWQgZmllbGQKLQkgKi8KLQlTdHJpbmcgZmllbGROYW1lRm9yRW1iZWRkZWRJZCgpIHsKLQkJcmV0dXJuIHRoaXMuZmllbGROYW1lRm9ySW50ZXJuYWwoRU1CRURERURfSURfVklSVFVBTF9DT0xVTU4pOwotCX0KLQotCVN0cmluZyBmaWVsZE5hbWVGb3IoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5maWVsZE5hbWVGb3JJbnRlcm5hbChjb2x1bW4pOwotCX0KLQotCVN0cmluZyBmaWVsZE5hbWVGb3IoTWFueVRvT25lUmVsYXRpb24gcmVsYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZmllbGROYW1lRm9ySW50ZXJuYWwocmVsYXRpb24pOwotCX0KLQotCVN0cmluZyBmaWVsZE5hbWVGb3IoT25lVG9NYW55UmVsYXRpb24gcmVsYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZmllbGROYW1lRm9ySW50ZXJuYWwocmVsYXRpb24pOwotCX0KLQotCVN0cmluZyBmaWVsZE5hbWVGb3IoTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmZpZWxkTmFtZUZvckludGVybmFsKHJlbGF0aW9uKTsKLQl9Ci0KLQlTdHJpbmcgbmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGUuZ2V0TmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogd2hpbGUgd2UgYXJlIGZpZ3VyaW5nIG91dCB0aGUgbmFtZXMgZm9yIHRoZSBtOjEgZmllbGRzLCByZW1vdmUgZnJvbSB0aGUKLQkgKiBzcGVjaWZpZWQgc2V0IG9mIGNvbHVtbnMgdGhlIGNvbHVtbnMgdGhhdCBhcmUgb25seSBwYXJ0IG9mIHRoZSBmb3JlaWduIGtleXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlTWFueVRvT25lRmllbGROYW1lcyhTZXQ8Q29sdW1uPiBjb2x1bW5zKSB7Ci0JCWZvciAoTWFueVRvT25lUmVsYXRpb24gcmVsYXRpb24gOiB0aGlzLm1hbnlUb09uZVJlbGF0aW9ucykgewotCQkJQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjb2x1bW5zLCByZWxhdGlvbi5nZXRGb3JlaWduS2V5KCkubm9uUHJpbWFyeUtleUJhc2VDb2x1bW5zKCkpOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmZvcmVpZ25LZXlDb2x1bW5zLCByZWxhdGlvbi5nZXRGb3JlaWduS2V5KCkuYmFzZUNvbHVtbnMoKSk7Ci0JCQlyZWxhdGlvbi5zZXRNYXBwZWRCeSh0aGlzLmNvbmZpZ3VyZUZpZWxkTmFtZShyZWxhdGlvbiwgcmVsYXRpb24uamF2YUZpZWxkTmFtZSgpKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjb25maWd1cmVGaWVsZE5hbWUoT2JqZWN0IG8sIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJZmllbGROYW1lID0gdGhpcy5jYW1lbENhc2VGaWVsZE5hbWUoZmllbGROYW1lKTsKLQkJZmllbGROYW1lID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoZmllbGROYW1lLCB0aGlzLmZpZWxkTmFtZXMudmFsdWVzKCkpOwotCQl0aGlzLmZpZWxkTmFtZXMucHV0KG8sIGZpZWxkTmFtZSk7Ci0JCXJldHVybiBmaWVsZE5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY2FtZWxDYXNlRmllbGROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eUNvbmZpZy5jb252ZXJ0VG9DYW1lbENhc2UoKSA/Ci0JCQkvLyBjYW1lbC1jYXNpbmcgY2FuIGNvbnZlcnQgYSBuYW1lIGJhY2sgdG8gYSByZXNlcnZlZCB3b3JkIChlLmcuICJwYWNrYWdlXyIgLT4gInBhY2thZ2UiKQotCQkJTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG5hbWUsIGZhbHNlKSkgIC8vIGZhbHNlID0gZG9uJ3QgY2FwaXRhbGl6ZSBmaXJzdCBsZXR0ZXIKLQkJOgotCQkJbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCBhIHVuaXF1ZSBmaWVsZCBuYW1lIGZvciB0aGUgc3BlY2lmaWVkICJiYXNpYyIgY29sdW1ucywKLQkgKiBjaGVja2luZyBmb3IgbmFtZSBjb2xsaXNpb25zCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUJhc2ljRmllbGROYW1lcyhTZXQ8Q29sdW1uPiBjb2x1bW5zKSB7Ci0JCWZvciAoQ29sdW1uIGNvbHVtbiA6IGNvbHVtbnMpIHsKLQkJCXRoaXMuY29uZmlndXJlRmllbGROYW1lKGNvbHVtbiwgY29sdW1uLmdldEphdmFGaWVsZE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlT25lVG9NYW55RmllbGROYW1lcygpIHsKLQkJZm9yIChPbmVUb01hbnlSZWxhdGlvbiByZWxhdGlvbiA6IHRoaXMub25lVG9NYW55UmVsYXRpb25zKSB7Ci0JCQl0aGlzLmNvbmZpZ3VyZUZpZWxkTmFtZShyZWxhdGlvbiwgcmVsYXRpb24uamF2YUZpZWxkTmFtZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjb25maWd1cmVPd25lZE1hbnlUb01hbnlGaWVsZE5hbWVzKCkgewotCQlmb3IgKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbiA6IHRoaXMub3duZWRNYW55VG9NYW55UmVsYXRpb25zKSB7Ci0JCQlyZWxhdGlvbi5zZXRNYXBwZWRCeSh0aGlzLmNvbmZpZ3VyZUZpZWxkTmFtZShyZWxhdGlvbiwgcmVsYXRpb24uamF2YUZpZWxkTmFtZUZvcih0aGlzKSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZU5vbk93bmVkTWFueVRvTWFueUZpZWxkTmFtZXMoKSB7Ci0JCWZvciAoTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uIDogdGhpcy5ub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMpIHsKLQkJCXRoaXMuY29uZmlndXJlRmllbGROYW1lKHJlbGF0aW9uLCByZWxhdGlvbi5qYXZhRmllbGROYW1lRm9yKHRoaXMpKTsKLQkJfQotCX0KLQotCWJvb2xlYW4gZm9yZWlnbktleUNvbHVtbnNDb250YWlucyhDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmZvcmVpZ25LZXlDb2x1bW5zLmNvbnRhaW5zKGNvbHVtbik7Ci0JfQotCi0JYm9vbGVhbiBwcmltYXJ5S2V5Q29sdW1uc0NvbnRhaW5zKENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMudGFibGUucHJpbWFyeUtleUNvbHVtbnNDb250YWlucyhjb2x1bW4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9NYW55VG9NYW55UmVsYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvTWFueVRvTWFueVJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNmMyMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9NYW55VG9NYW55UmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLQotLyoqCi0gKiBUaGlzIG9iamVjdCBpcyBzaGFyZWQgYnkgdGhlIHR3byBnZW4gdGFibGVzIHRoYXQgbWFrZSB1cCB0aGUgcmVsYXRpb24uCi0gKiBVcG9uIGNvbnN0cnVjdGlvbiwgJ21hcHBlZEJ5JyB3aWxsIGJlICdudWxsJy4gVGhlIGZpcnN0IGdlbiB0YWJsZSB0byBiZQotICogdXNlZCB0byBnZW5lcmF0ZSBhbiBlbnRpdHkgd2lsbCBmaWxsIGluICdtYXBwZWRCeScgd2l0aCB0aGUgYXBwcm9wcmlhdGUKLSAqIGZpZWxkL3Byb3BlcnR5IG5hbWUuCi0gKi8KLWNsYXNzIE1hbnlUb01hbnlSZWxhdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5UYWJsZSBqb2luVGFibGU7Ci0JcHJpdmF0ZSBmaW5hbCBGb3JlaWduS2V5IG93bmluZ0ZvcmVpZ25LZXk7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5UYWJsZSBvd25pbmdUYWJsZTsKLQlwcml2YXRlIGZpbmFsIEZvcmVpZ25LZXkgbm9uT3duaW5nRm9yZWlnbktleTsKLQlwcml2YXRlIGZpbmFsIEdlblRhYmxlIG5vbk93bmluZ1RhYmxlOwotCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OwotCi0KLQlNYW55VG9NYW55UmVsYXRpb24oR2VuVGFibGUgam9pblRhYmxlLCBGb3JlaWduS2V5IG93bmluZ0ZvcmVpZ25LZXksIEdlblRhYmxlIG93bmluZ1RhYmxlLCBGb3JlaWduS2V5IG5vbk93bmluZ0ZvcmVpZ25LZXksIEdlblRhYmxlIG5vbk93bmluZ1RhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuam9pblRhYmxlID0gam9pblRhYmxlOwotCi0JCXRoaXMub3duaW5nRm9yZWlnbktleSA9IG93bmluZ0ZvcmVpZ25LZXk7Ci0JCXRoaXMub3duaW5nVGFibGUgPSBvd25pbmdUYWJsZTsKLQkJb3duaW5nVGFibGUuYWRkT3duZWRNYW55VG9NYW55UmVsYXRpb24odGhpcyk7Ci0KLQkJdGhpcy5ub25Pd25pbmdGb3JlaWduS2V5ID0gbm9uT3duaW5nRm9yZWlnbktleTsKLQkJdGhpcy5ub25Pd25pbmdUYWJsZSA9IG5vbk93bmluZ1RhYmxlOwotCQlub25Pd25pbmdUYWJsZS5hZGROb25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbih0aGlzKTsKLQl9Ci0KLQlHZW5UYWJsZSBnZXRKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5UYWJsZTsKLQl9Ci0KLQlGb3JlaWduS2V5IGdldE93bmluZ0ZvcmVpZ25LZXkoKSB7Ci0JCXJldHVybiB0aGlzLm93bmluZ0ZvcmVpZ25LZXk7Ci0JfQotCi0JR2VuVGFibGUgZ2V0T3duaW5nVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmluZ1RhYmxlOwotCX0KLQotCUZvcmVpZ25LZXkgZ2V0Tm9uT3duaW5nRm9yZWlnbktleSgpIHsKLQkJcmV0dXJuIHRoaXMubm9uT3duaW5nRm9yZWlnbktleTsKLQl9Ci0KLQlHZW5UYWJsZSBnZXROb25Pd25pbmdUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMubm9uT3duaW5nVGFibGU7Ci0JfQotCi0JcHJpdmF0ZSBHZW5UYWJsZSBvdGhlclRhYmxlKEdlblRhYmxlIHRhYmxlKSB7Ci0JCXJldHVybiAodGFibGUgPT0gdGhpcy5vd25pbmdUYWJsZSkgPyB0aGlzLm5vbk93bmluZ1RhYmxlIDogdGhpcy5vd25pbmdUYWJsZTsKLQl9Ci0KLQlTdHJpbmcgamF2YUZpZWxkTmFtZUZvcihHZW5UYWJsZSB0YWJsZSkgewotCQkvLyBUT0RPIGkxOG4/Ci0JCXJldHVybiB0aGlzLm90aGVyVGFibGUodGFibGUpLmphdmFGaWVsZE5hbWUoKSArICJfY29sbGVjdGlvbiI7Ci0JfQotCi0Jdm9pZCBjbGVhcigpIHsKLQkJdGhpcy5vd25pbmdUYWJsZS5yZW1vdmVPd25lZE1hbnlUb01hbnlSZWxhdGlvbih0aGlzKTsKLQkJdGhpcy5ub25Pd25pbmdUYWJsZS5yZW1vdmVOb25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbih0aGlzKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5OwotCX0KLQotCXZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG1hcHBlZEJ5KSB7Ci0JCXRoaXMubWFwcGVkQnkgPSBtYXBwZWRCeTsKLQl9Ci0KLQlTdHJpbmcgb3duaW5nRW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duaW5nVGFibGUuZ2V0RW50aXR5TmFtZSgpOwotCX0KLQotCVN0cmluZyBub25Pd25pbmdFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5ub25Pd25pbmdUYWJsZS5nZXRFbnRpdHlOYW1lKCk7Ci0JfQotCi0JYm9vbGVhbiBqb2luVGFibGVOYW1lSXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGUubmFtZSgpLmVxdWFscyh0aGlzLmdldE93bmluZ1RhYmxlKCkubmFtZSgpICsgIl8iICsgdGhpcy5nZXROb25Pd25pbmdUYWJsZSgpLm5hbWUoKSk7Ci0JfQotCi0JYm9vbGVhbiBqb2luQ29sdW1uc0lzRGVmYXVsdEZvcihTdHJpbmcgamF2YUZpZWxkTmFtZSkgewotCQlyZXR1cm4gdGhpcy5vd25pbmdGb3JlaWduS2V5LmlzRGVmYXVsdEZvcihqYXZhRmllbGROYW1lKTsKLQl9Ci0KLQlib29sZWFuIGludmVyc2VKb2luQ29sdW1uc0lzRGVmYXVsdEZvcihTdHJpbmcgamF2YUZpZWxkTmFtZSkgewotCQlyZXR1cm4gdGhpcy5ub25Pd25pbmdGb3JlaWduS2V5LmlzRGVmYXVsdEZvcihqYXZhRmllbGROYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvTWFueVRvT25lUmVsYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvTWFueVRvT25lUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxMmY0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL01hbnlUb09uZVJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKLQotY2xhc3MgTWFueVRvT25lUmVsYXRpb24gewotCXByaXZhdGUgZmluYWwgR2VuVGFibGUgYmFzZVRhYmxlOyAgLy8gdGhlICJtYW55IiBzaWRlCi0JcHJpdmF0ZSBmaW5hbCBGb3JlaWduS2V5IGZvcmVpZ25LZXk7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5UYWJsZSByZWZlcmVuY2VkVGFibGU7ICAvLyB0aGUgIm9uZSIgc2lkZQotCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OwotCi0KLQlNYW55VG9PbmVSZWxhdGlvbihHZW5UYWJsZSBiYXNlVGFibGUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSwgR2VuVGFibGUgcmVmZXJlbmNlZFRhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYmFzZVRhYmxlID0gYmFzZVRhYmxlOwotCQl0aGlzLmZvcmVpZ25LZXkgPSBmb3JlaWduS2V5OwotCQl0aGlzLnJlZmVyZW5jZWRUYWJsZSA9IHJlZmVyZW5jZWRUYWJsZTsKLQkJcmVmZXJlbmNlZFRhYmxlLmFkZE9uZVRvTWFueVJlbGF0aW9uKG5ldyBPbmVUb01hbnlSZWxhdGlvbih0aGlzKSk7Ci0JfQotCi0JR2VuVGFibGUgZ2V0QmFzZVRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5iYXNlVGFibGU7Ci0JfQotCi0JRm9yZWlnbktleSBnZXRGb3JlaWduS2V5KCkgewotCQlyZXR1cm4gdGhpcy5mb3JlaWduS2V5OwotCX0KLQotCUdlblRhYmxlIGdldFJlZmVyZW5jZWRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZFRhYmxlOwotCX0KLQotCVN0cmluZyBqYXZhRmllbGROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5mb3JlaWduS2V5LmdldEphdmFGaWVsZE5hbWUoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5OwotCX0KLQotCXZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG1hcHBlZEJ5KSB7Ci0JCXRoaXMubWFwcGVkQnkgPSBtYXBwZWRCeTsKLQl9Ci0KLQlTdHJpbmcgYmFzZUVudGl0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmJhc2VUYWJsZS5nZXRFbnRpdHlOYW1lKCk7Ci0JfQotCi0JU3RyaW5nIHJlZmVyZW5jZWRFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkVGFibGUuZ2V0RW50aXR5TmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9PbmVUb01hbnlSZWxhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9PbmVUb01hbnlSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjU2ZDAwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT25lVG9NYW55UmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotY2xhc3MgT25lVG9NYW55UmVsYXRpb24gewotCXByaXZhdGUgZmluYWwgTWFueVRvT25lUmVsYXRpb24gbWFueVRvT25lUmVsYXRpb247Ci0KLQlPbmVUb01hbnlSZWxhdGlvbihNYW55VG9PbmVSZWxhdGlvbiBtYW55VG9PbmVSZWxhdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLm1hbnlUb09uZVJlbGF0aW9uID0gbWFueVRvT25lUmVsYXRpb247Ci0JfQotCi0JTWFueVRvT25lUmVsYXRpb24gZ2V0TWFueVRvT25lUmVsYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLm1hbnlUb09uZVJlbGF0aW9uOwotCX0KLQotCVN0cmluZyBqYXZhRmllbGROYW1lKCkgewotCQkvLyBUT0RPIGkxOG4/Ci0JCXJldHVybiB0aGlzLm1hbnlUb09uZVJlbGF0aW9uLmdldEJhc2VUYWJsZSgpLmphdmFGaWVsZE5hbWUoKSArICJfY29sbGVjdGlvbiI7Ci0JfQotCi0JU3RyaW5nIG1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYW55VG9PbmVSZWxhdGlvbi5nZXRNYXBwZWRCeSgpOwotCX0KLQotCVN0cmluZyByZWZlcmVuY2VkRW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFueVRvT25lUmVsYXRpb24uYmFzZUVudGl0eU5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvUGFja2FnZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9QYWNrYWdlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMjVhMGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9QYWNrYWdlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuRW50aXR5R2VuZXJhdG9yLk92ZXJ3cml0ZUNvbmZpcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLS8qKgotICogVGhpcyBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZSBhIHBhY2thZ2Ugb2YgZW50aXRpZXMgZm9yIGEgc2V0IG9mIHRhYmxlcy4KLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VHZW5lcmF0b3IgewotCXByaXZhdGUgZmluYWwgQ29uZmlnIGNvbmZpZzsKLQlwcml2YXRlIGZpbmFsIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnOwotCXByaXZhdGUgZmluYWwgR2VuU2NvcGUgc2NvcGU7Ci0JcHJpdmF0ZSBmaW5hbCBPdmVyd3JpdGVDb25maXJtZXIgb3ZlcndyaXRlQ29uZmlybWVyOwotCXByaXZhdGUgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlRW50aXRpZXMoQ29uZmlnIGNvbmZpZywgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWcsIENvbGxlY3Rpb248VGFibGU+IHRhYmxlcywgT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmICgoY29uZmlnID09IG51bGwpIHx8IChlbnRpdHlDb25maWcgPT0gbnVsbCkgfHwgKHRhYmxlcyA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJbmV3IFBhY2thZ2VHZW5lcmF0b3IoY29uZmlnLCBlbnRpdHlDb25maWcsIHRhYmxlcywgb3ZlcndyaXRlQ29uZmlybWVyLCBtb25pdG9yKS5nZW5lcmF0ZUVudGl0aWVzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIFBhY2thZ2VHZW5lcmF0b3IoQ29uZmlnIGNvbmZpZywgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWcsIENvbGxlY3Rpb248VGFibGU+IHRhYmxlcywgT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLmVudGl0eUNvbmZpZyA9IGVudGl0eUNvbmZpZzsKLQkJdGhpcy5zY29wZSA9IG5ldyBHZW5TY29wZSh0YWJsZXMsIGVudGl0eUNvbmZpZywgbW9uaXRvcik7Ci0JCXRoaXMub3ZlcndyaXRlQ29uZmlybWVyID0gb3ZlcndyaXRlQ29uZmlybWVyOwotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnZW5lcmF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUVudGl0aWVzKCkgewotCQlpbnQgc2l6ZSA9IENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuc2NvcGUuZW50aXR5VGFibGVzKCkpOwotCQlmb3IgKEl0ZXJhdG9yPEdlblRhYmxlPiBzdHJlYW0gPSB0aGlzLnNjb3BlLmVudGl0eVRhYmxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWNoZWNrQ2FuY2VsZWQoKTsKLQkJCXRoaXMuYnVpbGRFbnRpdHkoc3RyZWFtLm5leHQoKSk7Ci0JCQl0aGlzLm1vbml0b3Iud29ya2VkKDUwL3NpemUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2FuY2VsZWQoKSB7Ci0JCWlmICh0aGlzLm1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQkJCi0JfQotCQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRW50aXR5KEdlblRhYmxlIGdlblRhYmxlKSB7Ci0JCUVudGl0eUdlbmVyYXRvci5nZW5lcmF0ZUVudGl0eSh0aGlzLmVudGl0eUNvbmZpZywgdGhpcy5jb25maWcuZ2V0UGFja2FnZUZyYWdtZW50KCksIGdlblRhYmxlLCBvdmVyd3JpdGVDb25maXJtZXIsIHRoaXMubW9uaXRvcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbmZpZyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENvbmZpZyB7Ci0JCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQ7Ci0KLQkJcHVibGljIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KCkgewotCQkJcmV0dXJuIHRoaXMucGFja2FnZUZyYWdtZW50OwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQkJdGhpcy5wYWNrYWdlRnJhZ21lbnQgPSBwYWNrYWdlRnJhZ21lbnQ7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5qZXRwcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5qZXRwcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDdjODMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLmpldHByb3BlcnRpZXMKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxqZXQtc2V0dGluZ3M+CisJPHRlbXBsYXRlLWNvbnRhaW5lcj50ZW1wbGF0ZXM8L3RlbXBsYXRlLWNvbnRhaW5lcj4JPHNvdXJjZS1jb250YWluZXI+c3JjPC9zb3VyY2UtY29udGFpbmVyPgorPC9qZXQtc2V0dGluZ3M+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnByb2plY3QKaW5kZXggNTBlZjllMy4uZjFiMTQ3ZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5wcm9qZWN0CisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8ucHJvamVjdApAQCAtNiw2ICs2LDExIEBACiAJPC9wcm9qZWN0cz4KIAk8YnVpbGRTcGVjPgogCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uSkVUQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CiAJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KIAkJCTxhcmd1bWVudHM+CiAJCQk8L2FyZ3VtZW50cz4KQEAgLTIyLDYgKzI3LDcgQEAKIAkJPC9idWlsZENvbW1hbmQ+CiAJPC9idWlsZFNwZWM+CiAJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uamV0LklKRVROYXR1cmU8L25hdHVyZT4KIAkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CiAJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgogCTwvbmF0dXJlcz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA2MjE2OTQxLi4zNzI1YjI1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDcyICszLDgwIEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMTAxLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDIuMy4wLnF1YWxpZmllcgogQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQogQnVuZGxlLUNsYXNzUGF0aDogLgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2UuZHJhdzJkO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKICBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbjtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi41LjAsMy4wLjApIiwKKyBvcmcuZWNsaXBzZS5oZWxwO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIiwKICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKICBvcmcuZWNsaXBzZS5qcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmRiO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS5qcHQuZGI7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpwdC5kYi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuanB0LmdlbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDAsMS4yLjApIiwKKyBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4xMDAsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMTAwLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCiAgb3JnLmVjbGlwc2UuanN0LmoyZWUudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKICBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IjMuMy4xMDAiLAorIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMy4wKSIsCiAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKICBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKICBvcmcuZWNsaXBzZS53c3Qud2ViLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQogRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC51aSwKICBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscywKKyBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLAorIG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybSwKICBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kcywKKyBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuY29tbWFuZHM7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kaWFsb2dzO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmVkaXRvcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5vcHRpb25zO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGxhdGZvcm0uZ2VuZXJpYzt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnN0cnVjdHVyZTt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tZW51czt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5kZXRhaWxzO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMsCisgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc3BlY3RpdmU7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm07eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uYmFzZTt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByZWZzO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByb3BlcnRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZTt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5O3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0O3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzLnN0cnVjdHVyZTt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzO3gtaW50ZXJuYWw6PXRydWUsCkBAIC03Niw3ICs4NCwxMiBAQAogIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eTt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEub3BlcmF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMub3JtO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLAorIG9yZy5lY2xpcHNlLmpwdC51aS5qcGEyLmRldGFpbHMuamF2YSwKKyBvcmcuZWNsaXBzZS5qcHQudWkuanBhMi5kZXRhaWxzLm9ybSwKICBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLAogIG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQorSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnRleHQ7dmVyc2lvbj0iNC4wLjEiCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9idWlsZC5wcm9wZXJ0aWVzCmluZGV4IGJiYmEwZjMuLjViMzRkZDMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0xOCw3ICsxOCw4IEBACiAgICAgICAgICAgICAgICBpY29ucy8sXAogICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCiAgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvCisgICAgICAgICAgICAgICB0ZW1wbGF0ZXMvLFwKKyAgICAgICAgICAgICAgIGltYWdlcy8KIGphcnMuY29tcGlsZS5vcmRlciA9IC4KIHNyYy5pbmNsdWRlcyA9IHRlbXBsYXRlcy8sXAogICAgICAgICAgICAgICAgc2NoZW1hLwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvanBhLWphci1maWxlLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2pwYS1qYXItZmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyODI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2pwYS1qYXItZmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2FkZC1jb25uZWN0aW9uLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9hZGQtY29ubmVjdGlvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0MDM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9hZGQtY29ubmVjdGlvbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2FkZC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvYWRkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQzNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2FkZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2Jyb3dzZS1taW5pLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9icm93c2UtbWluaS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2NGYyNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9icm93c2UtbWluaS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2Jyb3dzZS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvYnJvd3NlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDgxZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2Jyb3dzZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2NvbGxhcHNlLWFsbC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvY29sbGFwc2UtYWxsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTgyZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2NvbGxhcHNlLWFsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2RlbGV0ZS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvZGVsZXRlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmJhOGI0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2RlbGV0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2Rlc2VsZWN0LWFsbC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvZGVzZWxlY3QtYWxsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTU0NGY1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2Rlc2VsZWN0LWFsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2RvdC5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvZG90LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2E1MTRkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2RvdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2VkaXQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2VkaXQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNmQ2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvZWRpdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2V4cGFuZC1hbGwucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2V4cGFuZC1hbGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNzI5YTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvZXhwYW5kLWFsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL2xpc3Qtb2YtdmFsdWVzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9saXN0LW9mLXZhbHVlcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4MWZkOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvYnV0dG9ucy9saXN0LW9mLXZhbHVlcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL21vdmUtZG93bi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvbW92ZS1kb3duLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmU1MjgxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL21vdmUtZG93bi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL21vdmUtdXAucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL21vdmUtdXAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOGIxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvbW92ZS11cC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL3JlY29ubmVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvcmVjb25uZWN0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjAwOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL3JlY29ubmVjdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL3Jlc3RvcmUtZGVmYXVsdHMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL3Jlc3RvcmUtZGVmYXVsdHMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzRhZTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvcmVzdG9yZS1kZWZhdWx0cy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL3NlbGVjdC1hbGwucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL3NlbGVjdC1hbGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYWZmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvc2VsZWN0LWFsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL3dhcm5pbmdzdGQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9idXR0b25zL3dhcm5pbmdzdGQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YjQ3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2J1dHRvbnMvd2FybmluZ3N0ZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL2V4cG9ydC1hcy1pbWctaG92ZXIucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL2V4cG9ydC1hcy1pbWctaG92ZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NTFiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vZXhwb3J0LWFzLWltZy1ob3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL2V4cG9ydC1hcy1pbWcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL2V4cG9ydC1hcy1pbWcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYjRkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vZXhwb3J0LWFzLWltZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL2hlYWRlcl9sZWZ0X2JnLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9oZWFkZXJfbGVmdF9iZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmZmZlNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9oZWFkZXJfbGVmdF9iZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL2hlYWRlcl9taWRfYmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL2hlYWRlcl9taWRfYmcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYTgyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vaGVhZGVyX21pZF9iZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL2hlYWRlcl9yaWdodF9iZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vaGVhZGVyX3JpZ2h0X2JnLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDc0MTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL2hlYWRlcl9yaWdodF9iZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3ByaW50LWhvdmVyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9wcmludC1ob3Zlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4YTA5YgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9wcmludC1ob3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3ByaW50LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9wcmludC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUxNWJhMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9wcmludC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy1ib3R0b20ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy1ib3R0b20ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NGIzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vc2hhZG93LWJvdHRvbS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy1sb3dlci1sZWZ0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctbG93ZXItbGVmdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEyNWRmMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctbG93ZXItbGVmdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy1sb3dlci1yaWdodC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vc2hhZG93LWxvd2VyLXJpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNThjOTUzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy1sb3dlci1yaWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy1zaWRlLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctc2lkZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg1ZWQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctc2lkZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy11cHBlci1yaWdodC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vc2hhZG93LXVwcGVyLXJpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2FiYjk2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy11cHBlci1yaWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3Rvb2xiYXJfYmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9kaWFncmFtL3Rvb2xiYXJfYmcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ODNhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL2RpYWdyYW0vdG9vbGJhcl9iZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2NvbHVtbi5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvY29sdW1uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjE1NTFiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2NvbHVtbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2NvbHVtbktleS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvY29sdW1uS2V5LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjM4NTE1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2NvbHVtbktleS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2ZpbGUucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2ZpbGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YzE4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvZmlsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2ZvbGRlci5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvZm9sZGVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzU5ZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2ZvbGRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2ZvcndhcmQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL2ZvcndhcmQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MmJkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvZm9yd2FyZC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL21vdmVSaWdodC5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvbW92ZVJpZ2h0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTE1MTFkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL21vdmVSaWdodC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL3BhY2thZ2UucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL3BhY2thZ2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MWNjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvcGFja2FnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL3RhYmxlLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb2JqZWN0cy90YWJsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5Mzg4YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb2JqZWN0cy90YWJsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL3RhYmxlX29iai5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL29iamVjdHMvdGFibGVfb2JqLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmNjYWJiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vYmplY3RzL3RhYmxlX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vdmVybGF5cy9lcnJvci5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaW1hZ2VzL292ZXJsYXlzL2Vycm9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTlkY2NjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vdmVybGF5cy9lcnJvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9vdmVybGF5cy93YXJuaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb3ZlcmxheXMvd2FybmluZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxZTg2YwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvb3ZlcmxheXMvd2FybmluZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ltYWdlcy9zYXZlLWltYWdlLTE2LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvc2F2ZS1pbWFnZS0xNi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhNDc3NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pbWFnZXMvc2F2ZS1pbWFnZS0xNi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmluZGV4IDY4OGMxODAuLmM1ODA4NmEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wbHVnaW4ucHJvcGVydGllcworKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTE5LDEwICsxOSwxMCBAQAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWU9IEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZworcGx1Z2luTmFtZT0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gVUkKK3Byb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQogCi1KUEFfUExBVEZPUk09IkpQQSBQbGF0Zm9ybSBVSSIKK0pQQV9QTEFURk9STV9VST0iSlBBIFBsYXRmb3JtIFVJIgogCiBqcGFOYXZpZ2F0b3JDb250ZW50PUpQQSBDb250ZW50CiAKQEAgLTMzLDcgKzMzLDEwIEBACiBuZXdKcGFFbnRpdHlXaXphcmREZXNjID0gQ3JlYXRlIGEgSlBBIEVudGl0eSAKIG5ld0pwYU1hcHBpbmdGaWxlV2l6YXJkTmFtZSA9IE1hcHBpbmcgRmlsZQogbmV3SnBhTWFwcGluZ0ZpbGVXaXphcmREZXNjID0gQ3JlYXRlIGEgSlBBIE1hcHBpbmcgRmlsZQorbmV3SnBhRW50aXR5RnJvbVRhYmxlV2l6YXJkTmFtZSA9IEVudGl0aWVzIEZyb20gVGFibGVzCituZXdKcGFFbnRpdHlGcm9tVGFibGVXaXphcmREZXNjID0gQ3JlYXRlIEpQQSBFbnRpdGllcyBmcm9tIGRhdGFiYXNlIHRhYmxlcyAKIAordXBncmFkZVRvTGF0ZXN0VmVyc2lvbiA9IFVwZ3JhZGUgRG9jdW1lbnQgVmVyc2lvbgoganBhU3RydWN0dXJlVmlld0NvbW1hbmRDYXRlZ29yeSA9IEpQQSBTdHJ1Y3R1cmUgVmlldwogYWRkUGVyc2lzdGVudENsYXNzID0gQWRkIENsYXNzIC4uLgogcmVtb3ZlUGVyc2lzdGVudENsYXNzID0gUmVtb3ZlIENsYXNzCkBAIC00MiwyMiArNDUsMjkgQEAKIHJlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVGcm9tWG1sID0gUmVtb3ZlIEF0dHJpYnV0ZSBmcm9tIFhNTAogbWFwQXM9TWFwIEFzCiBtYXBBc01uZW1vbmljPU0KLW1hcEFzUGFyYW1ldGVyTmFtZT1tYXBwaW5nIGtleQorbWFwQXNTcGVjaWZpZWRNYXBwaW5nUGFyYW1ldGVyTmFtZT1zcGVjaWZpZWQgbWFwcGluZyBrZXkKK21hcEFzRGVmYXVsdE1hcHBpbmdQYXJhbWV0ZXJOYW1lPWRlZmF1bHQgbWFwcGluZyBrZXkKIAoganBhTWVudU5hbWUgPSBKUEEgVG9vbHMKLWdlbmVyYXRlRW50aXRpZXMgPSBHZW5lcmF0ZSBFbnRpdGllcy4uLgotZ2VuZXJhdGVEREwgPSBHZW5lcmF0ZSBEREwuLi4KLW1pZ3JhdGVKYXZhUHJvamVjdCA9IENvbnZlcnQgdG8gSlBBIFByb2plY3QgLi4uCi1zeW5jaHJvbml6ZUNsYXNzZXMgPSBTeW5jaHJvbml6ZSBDbGFzc2VzCitnZW5lcmF0ZUVudGl0aWVzID0gR2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMuLi4KK2dlbmVyYXRlRERMID0gR2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXMuLi4KK2NvbnZlcnRUb0pQQVByb2plY3QgPSBDb252ZXJ0IHRvIEpQQSBQcm9qZWN0IC4uLgorc3luY2hyb25pemVDbGFzc2VzID0gU3luY2hyb25pemUgQ2xhc3MgTGlzdAogCiBwZXJzaXN0ZW5jZUVkaXRvcj1QZXJzaXN0ZW5jZSBYTUwgRWRpdG9yCiAKLWpwYVByZWZlcmVuY2VQYWdlID0gSlBBCitqcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VOYW1lPUVycm9ycy9XYXJuaW5ncworanBhUHJlZmVyZW5jZVBhZ2UgPSBKYXZhIFBlcnNpc3RlbmNlCiAKLWpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZSA9IEpQQQoranBhUHJvamVjdFByb3BlcnRpZXNQYWdlID0gSmF2YSBQZXJzaXN0ZW5jZQogCiBqcGFQZXJzcGVjdGl2ZSA9IEpQQQoranBhUGVyc3BlY3RpdmVEZXNjcmlwdGlvbiA9IFRoaXMgcGVyc3BlY3RpdmUgaXMgZGVzaWduZWQgdG8gc3VwcG9ydCBKYXZhIFBlcnNpc3RlbmNlIChKUEEpIGRldmVsb3BtZW50LiBJdCBvZmZlcnMgYSBQcm9qZWN0IEV4cGxvcmVyLCBKUEEgRGV0YWlscywgSlBBIFN0cnVjdHVyZSBhbmQgYSBEYXRhIFNvdXJjZSBFeHBsb3Jlci4KIGpwYURldGFpbHMgPSBKUEEgRGV0YWlscwoganBhU3RydWN0dXJlID0gSlBBIFN0cnVjdHVyZQotCiBKcGFQcm9wb3NhbENhdGVnb3J5ID0gSlBBIFByb3Bvc2FscworCitKcHRDcmVhdGlvbkFjdGlvblNldC5sYWJlbCA9IEpwdCBDcmVhdGlvbgorSnB0Q3JlYXRpb25BY3Rpb25TZXQuZGVzY3JpcHRpb24gPSBKcHQgQ3JlYXRpb24gQWN0aW9uIFNldAorCitOZXdFbnRpdHlBY3Rpb24ubGFiZWwgPSBOZXcgRW50aXR5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcGx1Z2luLnhtbAppbmRleCBiZWQ4YzI5Li45NzlkMGEzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcGx1Z2luLnhtbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcGx1Z2luLnhtbApAQCAtMyw5ICszLDkgQEAKIDxwbHVnaW4+CiAJCiAJPGV4dGVuc2lvbi1wb2ludCAKLQkJaWQ9ImpwYVBsYXRmb3JtIiAKLQkJbmFtZT0iJUpQQV9QTEFURk9STSIgCi0JCXNjaGVtYT0ic2NoZW1hL2pwYVBsYXRmb3JtLmV4c2QiLz4KKwkJaWQ9ImpwYVBsYXRmb3JtVWlzIiAKKwkJbmFtZT0iJUpQQV9QTEFURk9STV9VSSIgCisJCXNjaGVtYT0ic2NoZW1hL2pwYVBsYXRmb3JtVWlzLmV4c2QiLz4KIAkKIAkKIAk8ZXh0ZW5zaW9uCkBAIC0zMiwxMyArMzIsMTMgQEAKIAkJCiAJCTxmYWN0b3J5CiAJCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvblBhcnRpY2lwYW50RmFjdG9yeSI+CisJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5Xb3JrYmVuY2hQYXJ0QWRhcHRlckZhY3RvcnkiPgogCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCIvPgogCQk8L2ZhY3Rvcnk+CiAJCQogCQk8ZmFjdG9yeQogCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUZpbGVBZGFwdGVyRmFjdG9yeSI+CisJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkVkaXRvclBhcnRBZGFwdGVyRmFjdG9yeSI+CiAJCQk8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlIi8+CiAJCTwvZmFjdG9yeT4KIAkJCkBAIC01MiwxMiArNTIsMTQgQEAKIAk8ZXh0ZW5zaW9uCiAJCXBvaW50PSJvcmcuZWNsaXBzZS5qZHQudWkuamF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIgogCQlpZD0iSnBhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiPgorCQkKIAkJPGphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciAKIAkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIgogCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVByb3Bvc2FsQ2F0ZWdvcnkiPgogCQkJPHBhcnRpdGlvbiB0eXBlPSJfX2RmdGxfcGFydGl0aW9uX2NvbnRlbnRfdHlwZSIvPgogCQkJPHBhcnRpdGlvbiB0eXBlPSJfX2phdmFfc3RyaW5nIi8+CiAJCTwvamF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyPgorCQkKIAk8L2V4dGVuc2lvbj4KIAkKIAkKQEAgLTcxLDExICs3MywzOCBAQAogCQogCQogCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFQbGF0Zm9ybSI+CisJCXBvaW50PSJvcmcuZWNsaXBzZS5qcHQudWkuanBhUGxhdGZvcm1VaXMiPgogCQkKLQkJPGpwYVBsYXRmb3JtCi0JCQlpZD0iZ2VuZXJpYyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljUGxhdGZvcm1VaSIvPgorCQk8anBhUGxhdGZvcm1VaQorCQkJaWQ9ImdlbmVyaWMudWkiCisJCQlqcGFQbGF0Zm9ybT0iZ2VuZXJpYyIKKwkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuR2VuZXJpY0pwYVBsYXRmb3JtVWlGYWN0b3J5Ii8+CisJCQorCQk8anBhUGxhdGZvcm1VaQorCQkJaWQ9ImdlbmVyaWMyXzAudWkiCisJCQlqcGFQbGF0Zm9ybT0iZ2VuZXJpYzJfMCIKKwkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkiLz4KKwkJCisJPC9leHRlbnNpb24+CisJCisJCisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+CisJCQorCQk8YWN0aW9uU2V0CisJCQlkZXNjcmlwdGlvbj0iJUpwdENyZWF0aW9uQWN0aW9uU2V0LmRlc2NyaXB0aW9uIgorCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5KcHRDcmVhdGlvbkFjdGlvblNldCIKKwkJCWxhYmVsPSIlSnB0Q3JlYXRpb25BY3Rpb25TZXQubGFiZWwiPgorCQkJPGFjdGlvbgorCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdFbnRpdHlEcm9wRG93bkFjdGlvbiIKKwkJCQlkaXNhYmxlZEljb249Imljb25zL2Z1bGwvZXRvb2wxNi9uZXdfZW50aXR5X3dpei5naWYiCisJCQkJaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld19lbnRpdHlfd2l6LmdpZiIKKwkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLk5ld0VudGl0eUFjdGlvbiIKKwkJCQlsYWJlbD0iJU5ld0VudGl0eUFjdGlvbi5sYWJlbCIKKwkJCQlwdWxsZG93bj0idHJ1ZSIKKwkJCQl0b29sYmFyUGF0aD0iTm9ybWFsL0pwdFdpemFyZHMiPgorCQkJPC9hY3Rpb24+CisJCTwvYWN0aW9uU2V0PgogCQkKIAk8L2V4dGVuc2lvbj4KIAkKQEAgLTgzLDYgKzExMiwxMCBAQAogCTxleHRlbnNpb24KIAkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KIAkJCisJCTxjb21tYW5kCisJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnhtbEZpbGVVcGdyYWRlVG9MYXRlc3RWZXJzaW9uIgorCQkJbmFtZT0iJXVwZ3JhZGVUb0xhdGVzdFZlcnNpb24iLz4KKwkJCiAJCTxjYXRlZ29yeQogCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Q29tbWFuZHMiCiAJCQluYW1lPSIlanBhU3RydWN0dXJlVmlld0NvbW1hbmRDYXRlZ29yeSI+CkBAIC0xMzQsOCArMTY3LDEzIEBACiAJCQluYW1lPSIlbWFwQXMiCiAJCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhU3RydWN0dXJlVmlld0NvbW1hbmRzIj4KIAkJCTxjb21tYW5kUGFyYW1ldGVyCi0JCQkJaWQ9InBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBwaW5nS2V5IgotCQkJCW5hbWU9IiVtYXBBc1BhcmFtZXRlck5hbWUiCisJCQkJaWQ9InNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBwaW5nS2V5IgorCQkJCW5hbWU9IiVtYXBBc1NwZWNpZmllZE1hcHBpbmdQYXJhbWV0ZXJOYW1lIgorCQkJCW9wdGlvbmFsPSJmYWxzZSI+CisJCQk8L2NvbW1hbmRQYXJhbWV0ZXI+CisJCQk8Y29tbWFuZFBhcmFtZXRlcgorCQkJCWlkPSJkZWZhdWx0UGVyc2lzdGVudEF0dHJpYnV0ZU1hcHBpbmdLZXkiCisJCQkJbmFtZT0iJW1hcEFzRGVmYXVsdE1hcHBpbmdQYXJhbWV0ZXJOYW1lIgogCQkJCW9wdGlvbmFsPSJmYWxzZSI+CiAJCQk8L2NvbW1hbmRQYXJhbWV0ZXI+CiAJCTwvY29tbWFuZD4KQEAgLTE2Nyw2ICsyMDUsMzIgQEAKIAkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KIAkJCiAJCTxoYW5kbGVyCisJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS54bWxGaWxlVXBncmFkZVRvTGF0ZXN0VmVyc2lvbiIKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuY29tbWFuZHMuVXBncmFkZVhtbEZpbGVWZXJzaW9uSGFuZGxlciI+CisJCQk8ZW5hYmxlZFdoZW4+CisJCQkJPGFuZD4KKwkJCQkJPGNvdW50IHZhbHVlPSIxIi8+CisJCQkJCTxpdGVyYXRlPgorCQkJCQkJPG9yPgorCQkJCQkJCTxhZGFwdAorCQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbEZpbGUiPgorCQkJCQkJCQk8dGVzdAorCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmlzTGF0ZXN0U3VwcG9ydGVkVmVyc2lvbiIKKwkJCQkJCQkJCXZhbHVlPSJmYWxzZSIvPgorCQkJCQkJCTwvYWRhcHQ+CisJCQkJCQkJPGFkYXB0CisJCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZSI+CisJCQkJCQkJCTx0ZXN0CisJCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaXNMYXRlc3RTdXBwb3J0ZWRWZXJzaW9uIgorCQkJCQkJCQkJdmFsdWU9ImZhbHNlIi8+CisJCQkJCQkJPC9hZGFwdD4KKwkJCQkJCTwvb3I+CisJCQkJCTwvaXRlcmF0ZT4KKwkJCQk8L2FuZD4KKwkJCTwvZW5hYmxlZFdoZW4+CisJCTwvaGFuZGxlcj4KKwkJCisJCTxoYW5kbGVyCiAJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5lbnRpdHlNYXBwaW5nc0FkZFBlcnNpc3RlbnRDbGFzcyIKIAkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkUGVyc2lzdGVudENsYXNzSGFuZGxlciI+CiAJCQk8YWN0aXZlV2hlbj4KQEAgLTI5MSw2ICszNTUsNzYgQEAKICAJPGV4dGVuc2lvbgogCQlwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgogCQkKKwkJPCEtLSBjb250cmlidXRpb25zIGZvciBhbnkgcG9wdXAgLS0+CisJCTxtZW51Q29udHJpYnV0aW9uCisJCQlsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2UudWkucG9wdXAuYW55Ij4KKwkJCQorCQkJPCEtLSAiSlBBIFRvb2xzIiBzdWJtZW51IGZvciAKKwkJCQktIGFueXRoaW5nIHRoYXQgYWRhcHRzIHRvIEpwYVhtbFJlc291cmNlIChJRmlsZSBvYmplY3RzLCBtb3N0bHkpCisJCQkJLSBhbnl0aGluZyB0aGF0IGFkYXB0cyB0byBJUHJvamVjdCBhbmQgaGFzIGEgSlBBIGZhY2V0IC0tPgorCQkJPG1lbnUKKwkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLm1lbnUuSnBhVG9vbHMiCisJCQkJbGFiZWw9IiVqcGFNZW51TmFtZSI+CisJCQkJPHZpc2libGVXaGVuPgorCQkJCQk8d2l0aAorCQkJCQkJdmFyaWFibGU9InNlbGVjdGlvbiI+CisJCQkJCQk8aXRlcmF0ZSBpZkVtcHR5PSJmYWxzZSI+CisJCQkJCQkJPG9yPgorCQkJCQkJCQk8YWRhcHQKKwkJCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZSIvPgorCQkJCQkJCQk8YWRhcHQKKwkJCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KKwkJCQkJCQkJCTx0ZXN0CisJCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgCisJCQkJCQkJCQkJdmFsdWU9ImpwdC5qcGEiLz4KKwkJCQkJCQkJPC9hZGFwdD4KKwkJCQkJCQk8L29yPgorCQkJCQkJPC9pdGVyYXRlPgorCQkJCQk8L3dpdGg+CisJCQkJPC92aXNpYmxlV2hlbj4KKwkJCTwvbWVudT4KKwkJCQorCQkJPCEtLSBjb21tYW5kcyBmb3Igb2JqZWN0cyB0aGF0IGRvbid0IG5lZWQgIkpQQSBUb29scyIgc3VibWVudSAtLT4KKwkJCTxjb21tYW5kCisJCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQudWkueG1sRmlsZVVwZ3JhZGVUb0xhdGVzdFZlcnNpb24iPgorCQkJCTx2aXNpYmxlV2hlbj4KKwkJCQkJPHdpdGgKKwkJCQkJCXZhcmlhYmxlPSJzZWxlY3Rpb24iPgorCQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgorCQkJCQkJCTxhZGFwdAorCQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbEZpbGUiPgorCQkJCQkJCQk8dGVzdAorCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmlzTGF0ZXN0U3VwcG9ydGVkVmVyc2lvbiIKKwkJCQkJCQkJCXZhbHVlPSJmYWxzZSIvPgorCQkJCQkJCTwvYWRhcHQ+CisJCQkJCQk8L2l0ZXJhdGU+CisJCQkJCTwvd2l0aD4KKwkJCQk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgkKKwkJPC9tZW51Q29udHJpYnV0aW9uPgorCQkKKwkJPCEtLSBjb250cmlidXRpb25zIHRvIHRoZSAiSlBBIFRvb2xzIiBzdWJtZW51IC0tPgorCQk8bWVudUNvbnRyaWJ1dGlvbgorCQkJbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLmpwdC51aS5tZW51LkpwYVRvb2xzIj4KKwkJCTxjb21tYW5kCisJCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQudWkueG1sRmlsZVVwZ3JhZGVUb0xhdGVzdFZlcnNpb24iPgorCQkJCTx2aXNpYmxlV2hlbj4KKwkJCQkJPHdpdGgKKwkJCQkJCXZhcmlhYmxlPSJzZWxlY3Rpb24iPgorCQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgorCQkJCQkJCTxhZGFwdAorCQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2UiPgorCQkJCQkJCQk8dGVzdAorCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmlzTGF0ZXN0U3VwcG9ydGVkVmVyc2lvbiIKKwkJCQkJCQkJCXZhbHVlPSJmYWxzZSIvPgorCQkJCQkJCTwvYWRhcHQ+CisJCQkJCQk8L2l0ZXJhdGU+CisJCQkJCTwvd2l0aD4KKwkJCQk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJCQorCQk8IS0tIGNvbnRyaWJ1dGlvbnMgdG8gb2JqZWN0cyBpbiB0aGUgSlBBIHN0cnVjdHVyZSB2aWV3IC0tPgogCQk8bWVudUNvbnRyaWJ1dGlvbgogCQkJbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Ij4KIAkJCTxjb21tYW5kCkBAIC0yOTgsNyArNDMyLDcgQEAKIAkJCQk8dmlzaWJsZVdoZW4+CiAJCQkJCTx3aXRoCiAJCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlPgorCQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgogCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5ncyIvPgogCQkJCQkJPC9pdGVyYXRlPgogCQkJCQk8L3dpdGg+CkBAIC0zMDksNyArNDQzLDcgQEAKIAkJCQk8dmlzaWJsZVdoZW4+CiAJCQkJCTx3aXRoCiAJCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlPgorCQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgogCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZSIvPgogCQkJCQkJPC9pdGVyYXRlPgogCQkJCQk8L3dpdGg+CkBAIC0zMjAsNyArNDU0LDcgQEAKIAkJCQk8dmlzaWJsZVdoZW4+CiAJCQkJCTx3aXRoCiAJCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlPgorCQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgogCQkJCQkJCTxhbmQ+CiAJCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlIi8+CiAJCQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pc1ZpcnR1YWwiIHZhbHVlPSJ0cnVlIi8+CkBAIC0zMzQsNyArNDY4LDcgQEAKIAkJCQk8dmlzaWJsZVdoZW4+CiAJCQkJCTx3aXRoCiAJCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlPgorCQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgogCQkJCQkJCTxhbmQ+CiAJCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlIi8+CiAJCQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pc1ZpcnR1YWwiIHZhbHVlPSJ0cnVlIi8+CkBAIC0zNDgsNyArNDgyLDcgQEAKIAkJCQk8dmlzaWJsZVdoZW4+CiAJCQkJCTx3aXRoCiAJCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlPgorCQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgogCQkJCQkJCTxhbmQ+CiAJCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlIi8+CiAJCQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pc1ZpcnR1YWwiIHZhbHVlPSJmYWxzZSIvPgpAQCAtMzY1LDcgKzQ5OSw3IEBACiAJCQkJPHZpc2libGVXaGVuPgogCQkJCQk8d2l0aAogCQkJCQkJdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0JCQkJCQk8aXRlcmF0ZT4KKwkJCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KIAkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZSIvPgogCQkJCQkJPC9pdGVyYXRlPgogCQkJCQk8L3dpdGg+CkBAIC0zNzUsNyArNTA5LDcgQEAKIAkJCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tZW51cy5QZXJzaXN0ZW50VHlwZU1hcEFzQ29udHJpYnV0aW9uIj4KIAkJCQk8L2R5bmFtaWM+CiAJCQk8L21lbnU+Ci0KKwkJCQogCQkJPG1lbnUKIAkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBcyIKIAkJCQlsYWJlbD0iJW1hcEFzIgpAQCAtMzgzLDcgKzUxNyw3IEBACiAJCQkJPHZpc2libGVXaGVuPgogCQkJCQk8d2l0aAogCQkJCQkJdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0JCQkJCQk8aXRlcmF0ZT4KKwkJCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KIAkJCQkJCQk8YW5kPgogCQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlIi8+CiAJCQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pc1ZpcnR1YWwiIHZhbHVlPSJmYWxzZSIvPgpAQCAtNDI4LDEzICs1NjIsMTggQEAKIAkJCWxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSnBhTmF2aWdhdG9yTGFiZWxQcm92aWRlciI+CiAJCQkKIAkJCTx0cmlnZ2VyUG9pbnRzPgotCQkJCTxhbmQ+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+IAotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpwdC5qcGEiIC8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9hbmQ+CisJCQkJPG9yPgorCQkJCQk8aW5zdGFuY2VvZgorCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGUiLz4KKwkJCQkJPGFuZD4KKwkJCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+IAorCQkJCQkJCTx0ZXN0IAorCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCisJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCisJCQkJCQkJCXZhbHVlPSJqcHQuanBhIiAvPgorCQkJCQkJPC9hZGFwdD4KKwkJCQkJPC9hbmQ+CisJCQkJPC9vcj4KIAkJCTwvdHJpZ2dlclBvaW50cz4KIAkJCQogCQkJPHBvc3NpYmxlQ2hpbGRyZW4+CkBAIC00NTMsNiArNTkyLDUyIEBACiAJCQkJPC9lbmFibGVtZW50PgogCQkJPC9hY3Rpb25Qcm92aWRlcj4KIAkJCQorCQkJPGNvbW1vbldpemFyZAorCQkJCW1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qcHQudWkiCisJCQkJdHlwZT0ibmV3IgorCQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qcHQudWkud2l6YXJkLm5ld0VudGl0eSI+CisJCQkJPGVuYWJsZW1lbnQ+CisJCQkJCTxhbmQ+CisJCQkJCQk8b3I+CisJCQkJCQkJPGluc3RhbmNlb2YKKwkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+CisJCQkJCQkJPGluc3RhbmNlb2YKKwkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQiLz4KKwkJCQkJCQk8aW5zdGFuY2VvZgorCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3QiLz4KKwkJCQkJCTwvb3I+CisJCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KKwkJCQkJCQk8dGVzdCAKKwkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgorCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgorCQkJCQkJCQl2YWx1ZT0ianB0LmpwYSIgLz4KKwkJCQkJCTwvYWRhcHQ+CisJCQkJCTwvYW5kPgorCQkJCTwvZW5hYmxlbWVudD4KKwkJCTwvY29tbW9uV2l6YXJkPgorCQkJCisJCQk8Y29tbW9uV2l6YXJkCisJCQkJbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpwdC51aSIKKwkJCQl0eXBlPSJuZXciCisJCQkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3TWFwcGluZ0ZpbGUiPgorCQkJCTxlbmFibGVtZW50PgorCQkJCQk8YW5kPgorCQkJCQkJPG9yPgorCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgorCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyIi8+CisJCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ii8+CisJCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQiLz4KKwkJCQkJCTwvb3I+CisJCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KKwkJCQkJCQk8dGVzdCAKKwkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgorCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgorCQkJCQkJCQl2YWx1ZT0ianB0LmpwYSIgLz4KKwkJCQkJCTwvYWRhcHQ+CisJCQkJCTwvYW5kPgorCQkJCTwvZW5hYmxlbWVudD4KKwkJCTwvY29tbW9uV2l6YXJkPgorCQkJCiAJCQk8IS0tCiAJCQkKIAkJCTxjb21tb25Tb3J0ZXIKQEAgLTQ2MSw2ICs2NDYsMzAgQEAKIAkJCQogCQkJLS0+CiAJCQkKKwkJCTxjb21tb25XaXphcmQKKwkJCQltZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanB0LnVpIgorCQkJCXR5cGU9Im5ldyIKKwkJCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanB0LnVpLndpemFyZC5uZXdFbnRpdGllc0Zyb21UYWJsZXMiPgorCQkJCTxlbmFibGVtZW50PgorCQkJCQk8YW5kPgorCQkJCQkJPG9yPgorCQkJCQkJCTxpbnN0YW5jZW9mCisJCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgorCQkJCQkJCTxpbnN0YW5jZW9mCisJCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ii8+CisJCQkJCQkJPGluc3RhbmNlb2YKKwkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ii8+CisJCQkJCQk8L29yPgorCQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+CisJCQkJCQkJPHRlc3QgCisJCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKKwkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKKwkJCQkJCQkJdmFsdWU9ImpwdC5qcGEiIC8+CisJCQkJCQk8L2FkYXB0PgorCQkJCQk8L2FuZD4KKwkJCQk8L2VuYWJsZW1lbnQ+CisJCQk8L2NvbW1vbldpemFyZD4JCQkKKwkJCQogCQk8L25hdmlnYXRvckNvbnRlbnQ+CiAJCQogCTwvZXh0ZW5zaW9uPgpAQCAtNDk2LDIwICs3MDUsMTA2IEBACiAJCQk8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5FbnRpdHlXaXphcmQiPiAKIAkJCQk8cGFyYW1ldGVyIG5hbWU9ImphdmFlZWFydGlmYWN0IiB2YWx1ZT0idHJ1ZSIvPiAKIAkJCQk8cGFyYW1ldGVyIG5hbWU9Im1lbnVJbmRleCIgdmFsdWU9IjM4IiAvPiAKKwkJCQk8cGFyYW1ldGVyIG5hbWU9ImpwdGFydGlmYWN0IiB2YWx1ZT0idHJ1ZSIvPiAKIAkJCTwvY2xhc3M+IAogCQk8L3dpemFyZD4KIAkJCiAJCTx3aXphcmQKKwkgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qcHQiCisJICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuLkdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIgorCSAgICAgICAgaWNvbj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19lbnRpdHlfd2l6LmdpZiIKKwkgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudWkud2l6YXJkLm5ld0VudGl0aWVzRnJvbVRhYmxlcyIKKwkgICAgICAgIG5hbWU9IiVuZXdKcGFFbnRpdHlGcm9tVGFibGVXaXphcmROYW1lIj4KKwkgCQkJPGRlc2NyaXB0aW9uPiVuZXdKcGFFbnRpdHlGcm9tVGFibGVXaXphcmREZXNjPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgICAgPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+IAorICAgICAgICA8L3dpemFyZD4JCQorCQkKKwkJPHdpemFyZAogICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3TWFwcGluZ0ZpbGUiCiAJCQluYW1lPSIlbmV3SnBhTWFwcGluZ0ZpbGVXaXphcmROYW1lIgogCQkJaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld19qcGFfZmlsZV93aXouZ2lmIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5vcm0uTWFwcGluZ0ZpbGVXaXphcmQiPgorCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdCI+CiAJCQk8ZGVzY3JpcHRpb24+JW5ld0pwYU1hcHBpbmdGaWxlV2l6YXJkRGVzYzwvZGVzY3JpcHRpb24+CisJCQk8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLm9ybS5NYXBwaW5nRmlsZVdpemFyZCI+IAorCQkJCTxwYXJhbWV0ZXIgbmFtZT0iamF2YWVlYXJ0aWZhY3QiIHZhbHVlPSJ0cnVlIi8+IAorCQkJCTxwYXJhbWV0ZXIgbmFtZT0ibWVudUluZGV4IiB2YWx1ZT0iMzkiIC8+IAorCQkJCTxwYXJhbWV0ZXIgbmFtZT0ianB0YXJ0aWZhY3QiIHZhbHVlPSJ0cnVlIi8+IAorCQkJPC9jbGFzcz4gCiAJCTwvd2l6YXJkPgogICAgICAgCiAJPC9leHRlbnNpb24+CiAJCisJCQorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gRXh0ZW5zaW9uOiBQZXJzaXN0ZW5jZSBQZXJzcGVjdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCQorCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyI+CisJCQorCQk8cGVyc3BlY3RpdmUKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc3BlY3RpdmUuSnBhUGVyc3BlY3RpdmVGYWN0b3J5IgorCQkJaWNvbj0iaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9wZXJzcGVjdGl2ZS5naWYiCisJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVBlcnNwZWN0aXZlIgorCQkJbmFtZT0iJWpwYVBlcnNwZWN0aXZlIj4KKwkJCTxkZXNjcmlwdGlvbj4lanBhUGVyc3BlY3RpdmVEZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+CisJCTwvcGVyc3BlY3RpdmU+CisJPC9leHRlbnNpb24+CisJCisJCisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KKwkJCisJCTxwZXJzcGVjdGl2ZUV4dGVuc2lvbgorCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFQZXJzcGVjdGl2ZSI+CisJCQkKKwkJCTxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuanB0LnVpLndpemFyZC5uZXdKcGFQcm9qZWN0Ii8+CisJCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3RW50aXR5Ii8+CisJCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3TWFwcGluZ0ZpbGUiLz4KKwkJCTxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3UGFja2FnZUNyZWF0aW9uV2l6YXJkIi8+CisJCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0NsYXNzQ3JlYXRpb25XaXphcmQiLz4KKwkJCTxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3SW50ZXJmYWNlQ3JlYXRpb25XaXphcmQiLz4KKwkJCTxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3RW51bUNyZWF0aW9uV2l6YXJkIi8+CisJCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0Fubm90YXRpb25DcmVhdGlvbldpemFyZCIvPgorCQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdTb3VyY2VGb2xkZXJDcmVhdGlvbldpemFyZCIvPgorCQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdKYXZhV29ya2luZ1NldFdpemFyZCIvPgorCQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ldy5maWxlIi8+CisJCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZvbGRlciIvPgorCQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLndpemFyZHMuVW50aXRsZWRUZXh0RmlsZVdpemFyZCIvPgorCQkJCisJCQk8cGVyc3BlY3RpdmVTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLkphdmFQZXJzcGVjdGl2ZSIvPgorCQkJPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnUGVyc3BlY3RpdmUiLz4KKwkJCTxwZXJzcGVjdGl2ZVNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFUGVyc3BlY3RpdmUiLz4KKwkJCTxwZXJzcGVjdGl2ZVNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUJyb3dzaW5nUGVyc3BlY3RpdmUiLz4KKwkJCQorCQkJPGFjdGlvblNldCBpZD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQWN0aW9uU2V0Ii8+CisJCQk8YWN0aW9uU2V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUFjdGlvblNldCIvPgorCQkJPGFjdGlvblNldCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50Q3JlYXRpb25BY3Rpb25TZXQiLz4KKwkJCTxhY3Rpb25TZXQgaWQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ii8+CisJCQk8YWN0aW9uU2V0IGlkPSJvcmcuZWNsaXBzZS5qcHQudWkuSnB0Q3JlYXRpb25BY3Rpb25TZXQiLz4KKwkJCQorCQkJPHZpZXdTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLlBhY2thZ2VFeHBsb3JlciIvPgorCQkJPHZpZXdTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLlR5cGVIaWVyYXJjaHkiLz4KKwkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5Tb3VyY2VWaWV3Ii8+CisJCQk8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YWRvY1ZpZXciLz4KKwkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiLz4KKwkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLkNvbnRlbnRPdXRsaW5lIi8+CisJCQk8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ibGVtVmlldyIvPgorCQkJPHZpZXdTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MuUmVzb3VyY2VOYXZpZ2F0b3IiLz4KKwkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Ii8+CisJCQk8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhRGV0YWlsc1ZpZXciLz4KKwkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuRGF0YVNvdXJjZUV4cGxvcmVyTmF2aWdhdG9yIi8+CisJCQkKKwkJPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KKyAgICAJCisJCTxwZXJzcGVjdGl2ZUV4dGVuc2lvbgorCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSI+CisJCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3SnBhUHJvamVjdCIvPgorCQkJPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFQZXJzcGVjdGl2ZSIvPgorCQk8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgorCQkKKwk8L2V4dGVuc2lvbj4KKwkKIAkKIAk8ZXh0ZW5zaW9uCiAJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KQEAgLTUxOCwxMiArODEzLDkgQEAKIAkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucHJvamVjdC5KUEFUb29scyIKIAkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKIAkJCWFkYXB0YWJsZT0idHJ1ZSI+Ci0JCQk8bWVudQotCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucHJvamVjdC5KUEFUb29scyIKLQkJCQlsYWJlbD0iJWpwYU1lbnVOYW1lIi8+CiAKIAkJCTxlbmFibGVtZW50PgotCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiB2YWx1ZT0ianB0LmpwYSIvPgorCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIHZhbHVlPSJqcHQuanBhIi8+CiAJCQk8L2VuYWJsZW1lbnQ+CiAKIAkJCTxhY3Rpb24KQEAgLTUzMSwyNSArODIzLDIxIEBACiAJCQkJbGFiZWw9IiVnZW5lcmF0ZUVudGl0aWVzIgogCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9ucy5HZW5lcmF0ZUVudGl0aWVzQWN0aW9uIgogCQkJCWVuYWJsZXNGb3I9IjEiCi0JCQkJbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpwdC51aS5wcm9qZWN0LkpQQVRvb2xzL2NvbnRlbnQiLz4KKwkJCQltZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanB0LnVpLm1lbnUuSnBhVG9vbHMvY29udGVudCIvPgogCQkJCiAJCQk8YWN0aW9uCiAJCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5nZW5lcmF0ZURETCIKIAkJCQlsYWJlbD0iJWdlbmVyYXRlRERMIgogCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9ucy5HZW5lcmF0ZURETEFjdGlvbiIKIAkJCQllbmFibGVzRm9yPSIxIgotCQkJCW1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qcHQudWkucHJvamVjdC5KUEFUb29scy9jb250ZW50Ii8+CisJCQkJbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpwdC51aS5tZW51LkpwYVRvb2xzL2NvbnRlbnQiLz4KIAkJCQkKIAkJPC9vYmplY3RDb250cmlidXRpb24+CiAJCQogCQk8b2JqZWN0Q29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnByb2plY3QuSlBBVG9vbHMiCisJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnByb2plY3QuY29uZmlndXJlIgogCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgogCQkJYWRhcHRhYmxlPSJ0cnVlIj4KLQkJCTxtZW51Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wcm9qZWN0LkpQQVRvb2xzIgotCQkJCWxhYmVsPSIlanBhTWVudU5hbWUiLz4KLQkJCQogCQkJPHZpc2liaWxpdHk+CiAJCQkJPGFuZD4KIAkJCQkJPG9iamVjdFN0YXRlIApAQCAtNTY0LDExICs4NTIsMTEgQEAKIAkJCTwvdmlzaWJpbGl0eT4KIAkJCQogCQkJPGFjdGlvbgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuZ2VuZXJhdGVEREwiCi0JCQkJbGFiZWw9IiVtaWdyYXRlSmF2YVByb2plY3QiCisJCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5jb252ZXJ0VG9KcGFQcm9qZWN0IgorCQkJCWxhYmVsPSIlY29udmVydFRvSlBBUHJvamVjdCIKIAkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnMuTWlncmF0ZUphdmFQcm9qZWN0QWN0aW9uIgogCQkJCWVuYWJsZXNGb3I9IjEiCi0JCQkJbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpwdC51aS5wcm9qZWN0LkpQQVRvb2xzL2NvbnRlbnQiLz4KKwkJCQltZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UudWkucHJvamVjdENvbmZpZ3VyZS9hZGRpdGlvbnMiLz4KIAkJCQkKIAkJPC9vYmplY3RDb250cmlidXRpb24+CiAJCQpAQCAtNTc2LDE1ICs4NjQsMTQgQEAKIAkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkucGVyc2lzdGVuY2VYbWxGaWxlQWN0aW9ucyIKIAkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKIAkJCW5hbWVGaWx0ZXI9InBlcnNpc3RlbmNlLnhtbCI+Ci0JCQk8bWVudQotCQkJCWlkPSJwZXJzaXN0ZW5jZVhtbEpQQVRvb2xzIgotCQkJCWxhYmVsPSIlanBhTWVudU5hbWUiLz4KKwkJCQogCQkJPGFjdGlvbgogCQkJCWlkPSJzeW5jaENsYXNzZXNBY3Rpb24iCiAJCQkJbGFiZWw9IiVzeW5jaHJvbml6ZUNsYXNzZXMiCi0JCQkJbWVudWJhclBhdGg9InBlcnNpc3RlbmNlWG1sSlBBVG9vbHMvY29udGVudCIKKwkJCQltZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanB0LnVpLm1lbnUuSnBhVG9vbHMvY29udGVudCIKIAkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnMuU3luY2hyb25pemVDbGFzc2VzQWN0aW9uIgogCQkJCWVuYWJsZXNGb3I9IjEiLz4KKwkJCQogCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KIAkJCiAJCTxvYmplY3RDb250cmlidXRpb24KQEAgLTYwNSwxMiArODkyLDIxIEBACiAJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgogCQkKIAkJPHBhZ2UKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhUHJlZmVyZW5jZVBhZ2UiCi0JCQluYW1lPSIlanBhUHJlZmVyZW5jZVBhZ2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByZWZzLkpwYVByZWZlcmVuY2VQYWdlIi8+CisJCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnByZWZlcmVuY2VzIgorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KcGFQcmVmZXJlbmNlc1BhZ2UiCisJCQluYW1lPSIlanBhUHJlZmVyZW5jZVBhZ2UiPgorCQk8L3BhZ2U+CisJCQorCQk8cGFnZQorCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdC51aS5wcmVmZXJlbmNlcyIKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlIgorCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wcmVmZXJlbmNlcy5wcm9ibGVtU2V2ZXJpdGllcyIKKwkJCW5hbWU9IiVqcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VOYW1lIj4KKwkJPC9wYWdlPgogCQkKIAk8L2V4dGVuc2lvbj4KIAkKKwkKIAk8ZXh0ZW5zaW9uCiAJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KIAkJCkBAIC02MTksMTYgKzkxNSwzMSBAQAogCQkJbmFtZT0iJWpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZSIKIAkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJvcGVydGllcy5KcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UiPgogCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxhZGFwdCAKLQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQk8dGVzdCAKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQl2YWx1ZT0ianB0LmpwYSIvPgotCQkJCTwvYWRhcHQ+CisJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KKwkJCSAgICAgICAgPHRlc3QgCisJCQkgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCisJCQkgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgorCQkJICAgICAgICAgICAgdmFsdWU9ImpwdC5qcGEiLz4KKwkJICAgICAgICA8L2FkYXB0PgorCQkJPC9lbmFibGVkV2hlbj4KKwkJPC9wYWdlPgorCQk8cGFnZQorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5wcm9wZXJ0eVBhZ2VzLnByb2JsZW1TZXZlcml0aWVzIgorICAgICAgICAgbmFtZT0iJWpwYVByb2JsZW1TZXZlcml0aWVzUGFnZU5hbWUiCisgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZSIKKyAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlIj4KKwkJCTxlbmFibGVkV2hlbj4KKwkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgorCQkJICAgICAgICA8dGVzdCAKKwkJCSAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKKwkJCSAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCisJCQkgICAgICAgICAgICB2YWx1ZT0ianB0LmpwYSIvPgorCQkgICAgICAgIDwvYWRhcHQ+CiAJCQk8L2VuYWJsZWRXaGVuPgogCQk8L3BhZ2U+CiAJPC9leHRlbnNpb24+Ci0JCQorCQorCSAgCQkKIAk8ZXh0ZW5zaW9uCiAJCXBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+CiAJCQpAQCAtNjUwLDIyICs5NjEsNyBAQAogCSAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9kZXRhaWxzLmdpZiIKIAkJCW5hbWU9IiVqcGFEZXRhaWxzIi8+CiAJCQotCTwvZXh0ZW5zaW9uPgotCQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRXh0ZW5zaW9uOiBQZXJzaXN0ZW5jZSBQZXJzcGVjdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyI+Ci0JCQotCQk8cGVyc3BlY3RpdmUKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhUGVyc3BlY3RpdmUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNwZWN0aXZlLkpwYVBlcnNwZWN0aXZlRmFjdG9yeSIKLQkJCW5hbWU9IiVqcGFQZXJzcGVjdGl2ZSIKLQkJCWljb249Imljb25zL2Z1bGwvZXZpZXcxNi9qcGFfcGVyc3BlY3RpdmUuZ2lmIi8+Ci0JCQotCTwvZXh0ZW5zaW9uPgorCTwvZXh0ZW5zaW9uPgkKIAkKIAkKIAk8ZXh0ZW5zaW9uCkBAIC02ODAsNyArOTc2LDExIEBACiAJCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkUGFnZXMiPgogCQkKIAkJPHdpemFyZC1wYWdlcyBhY3Rpb249ImpwdC5qcGEuaW5zdGFsbCI+Ci0JCQk8cGFnZSBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuSnBhRmFjZXRXaXphcmRQYWdlIi8+CisJCQk8cGFnZSBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuSnBhRmFjZXRJbnN0YWxsUGFnZSIvPgorCQk8L3dpemFyZC1wYWdlcz4KKwkJCisJCTx3aXphcmQtcGFnZXMgYWN0aW9uPSJqcHQuanBhLnZlcnNpb24tY2hhbmdlIj4KKwkJCTxwYWdlIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5KcGFGYWNldFZlcnNpb25DaGFuZ2VQYWdlIi8+CiAJCTwvd2l6YXJkLXBhZ2VzPgogCQkKIAk8L2V4dGVuc2lvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWkucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWkucHJvcGVydGllcwppbmRleCA2MjRiZDYwLi5hMGY4YjNjIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpLnByb3BlcnRpZXMKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aS5wcm9wZXJ0aWVzCkBAIC0xLDIxICsxLDI1IEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotIyB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisjIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAjIAogIyBDb250cmlidXRvcnM6CiAjICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1BYnN0cmFjdENob29zZXJQYW5lX2Jyb3dzZUJ1dHRvbj1Ccm93c2UuLi4KK0Nob29zZXJQYW5lX2Jyb3dzZUJ1dHRvbj1Ccm93c2UuLi4KIAotQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ190aXRsZT1BZGQgUGVyc2lzdGVudCBBdHRyaWJ1dGUKK0FjY2Vzc1R5cGVDb21wb3NpdGVfYWNjZXNzPUFjY2VzczoKK0FjY2Vzc1R5cGVDb21wb3NpdGVfZmllbGQ9RmllbGQKK0FjY2Vzc1R5cGVDb21wb3NpdGVfcHJvcGVydHk9UHJvcGVydHkKKworQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ190aXRsZT1BZGQgQXR0cmlidXRlCiBBZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX2F0dHJpYnV0ZUxhYmVsPUF0dHJpYnV0ZToKIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfbWFwcGluZ0xhYmVsPU1hcCBhczoKIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfbm9NYXBwaW5nS2V5RXJyb3I9WW91IG11c3Qgc3BlY2lmeSBhIG1hcHBpbmcgdHlwZQogCi1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfdGl0bGU9QWRkIFBlcnNpc3RlbnQgQ2xhc3MKK0FkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ190aXRsZT1BZGQgQ2xhc3MKIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0xhYmVsPUNsYXNzOgogQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzRGlhbG9nX3RpdGxlPVBlcnNpc3RlbnQgQ2xhc3MgU2VsZWN0aW9uCiBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NEaWFsb2dfbWVzc2FnZT1DaG9vc2UgYSBjbGFzczoKQEAgLTMxLDE0ICszNSwxNCBAQAogQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlPSZFbnRlciB0eXBlIG5hbWUgcHJlZml4IG9yIHBhdHRlcm4gKCosID8sIG9yIGNhbWVsIGNhc2UpOgogQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZT1DbGFzcyBTZWxlY3Rpb24KIAotRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2RhdGFiYXNlPURhdGFiYXNlIFNldHRpbmdzCi1EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfZGF0YWJhc2VDb25uZWN0aW9uPURhdGFiYXNlIENvbm5lY3Rpb24KLURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9yZWNvbm5lY3RUb0RhdGFiYXNlPVJlY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi1EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfY29ubmVjdGlvbj1Db25uZWN0aW9uOgotRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3NjaGVtYT1TY2hlbWE6Ci1EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2Vfc2NoZW1hSW5mbz0oTm90ZTogIE11c3QgaGF2ZSBhY3RpdmUgY29ubmVjdGlvbiB0byBzZWxlY3Qgc2NoZW1hKQotRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2FkZENvbm5lY3Rpb25MaW5rPTxhPkFkZCBjb25uZWN0aW9ucy4uLjwvYT4KLURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9yZWNvbm5lY3RMaW5rPTxhPlJlY29ubmVjdC4uLjwvYT4KK0RhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV90aXRsZT1EYXRhYmFzZSBTY2hlbWEKK0RhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9kZXNjPVNlbGVjdCBhIGRhdGFiYXNlIHNjaGVtYQorRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3NjaGVtYVNldHRpbmdzPVNjaGVtYSBzZXR0aW5ncworRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2FkZENvbm5lY3Rpb25Ub1Byb2plY3Q9PGE+QWRkIGEgY29ubmVjdGlvbiB0byBKUEEgcHJvamVjdC4uLjwvYT4KK0RhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9jb25uZWN0TGluaz08YT5Db25uZWN0PC9hPgorRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3NjaGVtYT1TY2hlbWE6CitEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2VfY29ubmVjdGlvbkluZm89KE5vdGU6IEpQQSBwcm9qZWN0IG11c3QgaGF2ZSBhIGNvbm5lY3Rpb24gYW5kIGl0IG11c3QgYmUgYWN0aXZlIHRvIHNlbGVjdCBhIHNjaGVtYSkKK0RhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9zY2hlbWFJbmZvPShOb3RlOiBNdXN0IGhhdmUgYWN0aXZlIGNvbm5lY3Rpb24gdG8gc2VsZWN0IHNjaGVtYSkKIAogRW51bUNvbWJvVmlld2VyX2RlZmF1bHQ9RGVmYXVsdCAoKQogRW51bUNvbWJvVmlld2VyX2RlZmF1bHRXaXRoRGVmYXVsdD1EZWZhdWx0ICh7MH0pCkBAIC00NiwzMCArNTAsMzIgQEAKIEVycm9yX29wZW5pbmdFZGl0b3I9RXJyb3IgT3BlbmluZyBFZGl0b3IKIAogR2VuZXJhbF9icm93c2U9QnJvd3NlLi4uCitHZW5lcmFsX3JldmVydD1SZXZlcnQKIEdlbmVyYWxfZGVzZWxlY3RBbGw9RGVzZWxlY3QgQWxsCiBHZW5lcmFsX3NlbGVjdEFsbD1TZWxlY3QgQWxsCiAKK0dlbmVyYXRlRERMV2l6YXJkX3RpdGxlPURETCBHZW5lcmF0aW9uCisKIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfZ2VuZXJhdGVFbnRpdGllcz1HZW5lcmF0ZSBFbnRpdGllcwogR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfY2hvb3NlRW50aXR5VGFibGU9Q2hvb3NlIHRhYmxlcyB0byBnZW5lcmF0ZSBlbnRpdGllcyBmcm9tLgogR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfZ2VuZXJhdGVFbnRpdGllcz1HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcwotR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2Vfc3luY2hyb25pemVDbGFzc2VzPVN5bmNocm9uaXplIENsYXNzZXMgaW4gcGVyc2lzdGVuY2UueG1sCitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9zeW5jaHJvbml6ZUNsYXNzZXM9U3luY2hyb25pemUgY2xhc3NlcyBpbiBwZXJzaXN0ZW5jZS54bWwKIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3RhYmxlcz1UYWJsZXM6CiBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV90YWJsZUNvbHVtbj1UYWJsZQogR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfZW50aXR5TmFtZUNvbHVtbj1FbnRpdHkgTmFtZQogCitFbnRpdGllc0dlbmVyYXRvcl9qb2JOYW1lPUdlbmVyYXRpbmcgRW50aXRpZXMKKwogR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRpdGxlPURETCBHZW5lcmF0aW9uCiBHZW5lcmljUGxhdGZvcm1VaURpYWxvZ19ub3RTdXBwb3J0ZWRNZXNzYWdlVGV4dD1EREwgR2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBHZW5lcmljIFBsYXRmb3JtLgogCiBKcGFDb250ZW50X2xhYmVsPUpQQSBDb250ZW50CiAKLUpwYVByZWZlcmVuY2VQYWdlX2RlZmF1bHRKcGFMaWI9RGVmYXVsdCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeToKLUpwYVByZWZlcmVuY2VQYWdlX3VzZXJMaWJzTGluaz08YT5Db25maWd1cmUgdXNlciBsaWJyYXJpZXMgLi4uPC9hPgotSnBhUHJlZmVyZW5jZVBhZ2VfaW52YWxpZEpwYUxpYj1JbnZhbGlkIExpYnJhcnk6ICBNdXN0IGNvbnRhaW4gamF2YXgucGVyc2lzdGVuY2UgY2xhc3Nlcy4KLQogSnBhU3RydWN0dXJlVmlld19zdHJ1Y3R1cmVOb3RBdmFpbGFibGU9SlBBIHN0cnVjdHVyZSBpcyBub3QgYXZhaWxhYmxlLgogSnBhU3RydWN0dXJlVmlld19saW5rV2l0aEVkaXRvclRleHQ9TGluayB3aXRoIEVkaXRvcgogSnBhU3RydWN0dXJlVmlld19saW5rV2l0aEVkaXRvckRlc2M9TGluayB3aXRoIEFjdGl2ZSBFZGl0b3IKIEpwYVN0cnVjdHVyZVZpZXdfbGlua1dpdGhFZGl0b3JUb29sdGlwPUxpbmsgd2l0aCBFZGl0b3IKK0pwYVN0cnVjdHVyZVZpZXdfbnVtSXRlbXNTZWxlY3RlZD17MH0gaXRlbXMgc2VsZWN0ZWQKIAogSnBhRGV0YWlsc1ZpZXdfdmlld05vdEF2YWlsYWJsZT1EZXRhaWxzIGFyZSBub3QgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24uCiAKQEAgLTc5LDQ1ICs4NSwzMyBAQAogSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MYWJlbD1Db25uZWN0aW9uCiBKcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxpbms9PGE+QWRkIGNvbm5lY3Rpb24gLi4uPC9hPgogSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3RMaW5rPTxhPkNvbm5lY3Q8L2E+CitKcGFGYWNldFdpemFyZFBhZ2VfYWRkRHJpdmVyTGlicmFyeUxhYmVsPUFkZCBkcml2ZXIgbGlicmFyeSB0byBidWlsZCBwYXRoCitKcGFGYWNldFdpemFyZFBhZ2VfZHJpdmVyTGlicmFyeUxhYmVsPURyaXZlcjoKK0pwYUZhY2V0V2l6YXJkUGFnZV9vdmVycmlkZURlZmF1bHRDYXRhbG9nTGFiZWw9T3ZlcnJpZGUgZGVmYXVsdCBjYXRhbG9nIGZyb20gY29ubmVjdGlvbgorSnBhRmFjZXRXaXphcmRQYWdlX2RlZmF1bHRDYXRhbG9nTGFiZWw9Q2F0YWxvZzoKIEpwYUZhY2V0V2l6YXJkUGFnZV9vdmVycmlkZURlZmF1bHRTY2hlbWFMYWJlbD1PdmVycmlkZSBkZWZhdWx0IHNjaGVtYSBmcm9tIGNvbm5lY3Rpb24KIEpwYUZhY2V0V2l6YXJkUGFnZV9kZWZhdWx0U2NoZW1hTGFiZWw9U2NoZW1hOgogSnBhRmFjZXRXaXphcmRQYWdlX2pwYUltcGxlbWVudGF0aW9uTGFiZWw9SlBBIGltcGxlbWVudGF0aW9uCi1KcGFGYWNldFdpemFyZFBhZ2VfdXNlclNlcnZlckxpYkxhYmVsPVVzZSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBzZXJ2ZXIgcnVudGltZQotSnBhRmFjZXRXaXphcmRQYWdlX3NwZWNpZnlMaWJMYWJlbD1Vc2UgaW1wbGVtZW50YXRpb24gbGlicmFyeToKK0pwYUZhY2V0V2l6YXJkUGFnZV91c2VyU2VydmVyTGliTGFiZWw9SW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgc2VydmVyIHJ1bnRpbWUKK0pwYUZhY2V0V2l6YXJkUGFnZV9zcGVjaWZ5TGliTGFiZWw9SW1wbGVtZW50YXRpb24gbGlicmFyeToKIEpwYUZhY2V0V2l6YXJkUGFnZV9qcGFQcmVmc0xpbms9PGE+Q29uZmlndXJlIGRlZmF1bHQgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkgLi4uPC9hPgogSnBhRmFjZXRXaXphcmRQYWdlX3VzZXJMaWJzTGluaz08YT5Db25maWd1cmUgdXNlciBsaWJyYXJpZXMgLi4uPC9hPgogSnBhRmFjZXRXaXphcmRQYWdlX3BlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRMYWJlbD1QZXJzaXN0ZW50IGNsYXNzIG1hbmFnZW1lbnQKIEpwYUZhY2V0V2l6YXJkUGFnZV9kaXNjb3ZlckNsYXNzZXNCdXR0b249RGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgYXV0b21hdGljYWxseQogSnBhRmFjZXRXaXphcmRQYWdlX2xpc3RDbGFzc2VzQnV0dG9uPUFubm90YXRlZCBjbGFzc2VzIG11c3QgYmUgbGlzdGVkIGluIHBlcnNpc3RlbmNlLnhtbAogSnBhRmFjZXRXaXphcmRQYWdlX2NyZWF0ZU9ybVhtbEJ1dHRvbj1DcmVhdGUgb3JtLnhtbAorSnBhRmFjZXRXaXphcmRQYWdlX21ldGFtb2RlbExhYmVsPUNhbm9uaWNhbCBNZXRhbW9kZWwgKEpQQSAyLjApCitKcGFGYWNldFdpemFyZFBhZ2VfbWV0YW1vZGVsU291cmNlRm9sZGVyTGFiZWw9U291cmNlIEZvbGRlcgogSnBhRmFjZXRXaXphcmRQYWdlX25vbmU9PE5vbmU+CiAKLU1hcEFzQ29tcG9zaXRlX2Jhc2ljPWJhc2ljCi1NYXBBc0NvbXBvc2l0ZV9iYXNpY19kZWZhdWx0PWJhc2ljIChkZWZhdWx0KQotTWFwQXNDb21wb3NpdGVfYmFzaWNfZGVmYXVsdDI9QmFzaWMgKERlZmF1bHQpCi1NYXBBc0NvbXBvc2l0ZV9jaGFuZ2VNYXBwaW5nVHlwZT1oZXJlCi1NYXBBc0NvbXBvc2l0ZV9kZWZhdWx0PURlZmF1bHQKLU1hcEFzQ29tcG9zaXRlX2RpYWxvZ1RpdGxlPU1hcHBpbmcgVHlwZSBTZWxlY3Rpb24KLU1hcEFzQ29tcG9zaXRlX2VtYmVkZGVkPWVtYmVkZGVkCi1NYXBBc0NvbXBvc2l0ZV9lbWJlZGRlZF9kZWZhdWx0PWVtYmVkZGVkIChkZWZhdWx0KQotTWFwQXNDb21wb3NpdGVfZW1iZWRkZWRfZGVmYXVsdDI9RW1iZWRkZWQgKERlZmF1bHQpCi1NYXBBc0NvbXBvc2l0ZV9lbWJlZGRlZGlkPWVtYmVkZGVkIGlkCi1NYXBBc0NvbXBvc2l0ZV9lbWJlZGRhYmxlPWVtYmVkZGFibGUKLU1hcEFzQ29tcG9zaXRlX2VudGl0eT1lbnRpdHkKLU1hcEFzQ29tcG9zaXRlX2lkPWlkCi1NYXBBc0NvbXBvc2l0ZV9sYWJlbFRleHQ9JkVudGVyIG1hcHBpbmcgdHlwZSBvciBwYXR0ZXJuICgqLCA/LCBvciBjYW1lbCBjYXNlKToKLU1hcEFzQ29tcG9zaXRlX21hbnl0b21hbnk9bWFueSB0byBtYW55Ci1NYXBBc0NvbXBvc2l0ZV9tYW55dG9vbmU9bWFueSB0byBvbmUKLU1hcEFzQ29tcG9zaXRlX21hcHBlZHN1cGVyY2xhc3M9bWFwcGVkIHN1cGVyY2xhc3MKLU1hcEFzQ29tcG9zaXRlX21hcHBlZEF0dHJpYnV0ZVRleHQ9QXR0cmlidXRlICcnezB9JycgaXMgbWFwcGVkIGFzIHsxfS4KLU1hcEFzQ29tcG9zaXRlX21hcHBlZFR5cGVUZXh0PVR5cGUgJyd7MH0nJyBpcyBtYXBwZWQgYXMgezF9LgotTWFwQXNDb21wb3NpdGVfb25ldG9tYW55PW9uZSB0byBtYW55Ci1NYXBBc0NvbXBvc2l0ZV9vbmV0b29uZT1vbmUgdG8gb25lCi1NYXBBc0NvbXBvc2l0ZV90cmFuc2llbnQ9dHJhbnNpZW50Ci1NYXBBc0NvbXBvc2l0ZV91bm1hcHBlZEF0dHJpYnV0ZVRleHQ9QXR0cmlidXRlICcnezB9JycgaXMgbm90IG1hcHBlZCwgY2xpY2sgaGVyZSB0byBjaGFuZ2UgdGhlIG1hcHBpbmcgdHlwZS4KLU1hcEFzQ29tcG9zaXRlX3VubWFwcGVkVHlwZVRleHQ9VHlwZSAnJ3swfScnIGlzIG5vdCBtYXBwZWQsIGNsaWNrIGhlcmUgdG8gY2hhbmdlIHRoZSBtYXBwaW5nIHR5cGUuCi1NYXBBc0NvbXBvc2l0ZV92ZXJzaW9uPXZlcnNpb24KLU1hcEFzQ29tcG9zaXRlX3ZpcnR1YWxBdHRyaWJ1dGVUZXh0PUF0dHJpYnV0ZSAnJ3swfScnIGlzIG5vdCBtYXBwZWQuCitKcGFQcmVmZXJlbmNlc1BhZ2VfRGVzY3JpcHRpb249RXhwYW5kIHRoZSB0cmVlIHRvIGVkaXQgcHJlZmVyZW5jZXMgZm9yIGEgc3BlY2lmaWMgZmVhdHVyZS4KKworSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX0RlZmF1bHQ9RGVmYXVsdAorSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX0Rlc2NyaXB0aW9uPVNlbGVjdCB0aGUgc2V2ZXJpdHkgbGV2ZWwgZm9yIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgSmF2YSBQZXJzaXN0ZW5jZSB2YWxpZGF0aW9uIHByb2JsZW1zOgorSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX0Vycm9yPUVycm9yCitKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfSWdub3JlPUlnbm9yZQorSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX0luZm89SW5mbworSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX1dhcm5pbmc9V2FybmluZwogCiBNYXBwaW5nRmlsZVdpemFyZF90aXRsZT1OZXcgTWFwcGluZyBGaWxlCiBNYXBwaW5nRmlsZVdpemFyZFBhZ2VfdGl0bGU9TWFwcGluZyBmaWxlCkBAIC0xNDIsOSArMTM2LDYgQEAKIFBhY2thZ2VDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlPUNob29zZSBhIGZvbGRlcjogCiAKIFBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5X3BlcnNpc3RlbmNlTGFiZWw9UGVyc2lzdGVuY2UKLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX21hcEFzPU1hcCBBczoKLQotUGVyc2lzdGVudFR5cGVQYWdlX21hcEFzPU1hcCBBczoKIAogT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RpdGxlPU92ZXJ3cml0ZSBFeGlzdGluZyBDbGFzcwogT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RleHQ9T3ZlcndyaXRlIHNvdXJjZSBjb2RlIGZvciB0aGUgY2xhc3MgJyd7MH0nJz8KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfZGV0YWlscy5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9kZXRhaWxzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwMDI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfZGV0YWlscy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzE4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQm9vbGVhbl9UcnVlPVRydWUKK0Jvb2xlYW5fRmFsc2U9RmFsc2UKK05vbmVTZWxlY3RlZD08Tm9uZT4KK0RlZmF1bHRFbXB0eT1EZWZhdWx0CitEZWZhdWx0V2l0aE9uZVBhcmFtPURlZmF1bHQgKHswfSkKK1Byb3ZpZGVyRGVmYXVsdD1EZWZhdWx0ICg8UHJvdmlkZXItU3BlY2lmaWM+KQorTm9OYW1lU2V0PTxObyBuYW1lIHNldD4KKworTWFwQXNDb21wb3NpdGVfY2hhbmdlTWFwcGluZ1R5cGU9aGVyZQorTWFwQXNDb21wb3NpdGVfZGVmYXVsdD1EZWZhdWx0CitNYXBBc0NvbXBvc2l0ZV9kaWFsb2dUaXRsZT1NYXBwaW5nIFR5cGUgU2VsZWN0aW9uCitNYXBBc0NvbXBvc2l0ZV9sYWJlbFRleHQ9JkVudGVyIG1hcHBpbmcgdHlwZSBvciBwYXR0ZXJuICgqLCA/LCBvciBjYW1lbCBjYXNlKToKK01hcEFzQ29tcG9zaXRlX21hcHBlZEF0dHJpYnV0ZVRleHQ9QXR0cmlidXRlICcnezB9JycgaXMgbWFwcGVkIGFzIHsxfS4KK01hcEFzQ29tcG9zaXRlX21hcHBlZFR5cGVUZXh0PVR5cGUgJyd7MH0nJyBpcyBtYXBwZWQgYXMgezF9LgorTWFwQXNDb21wb3NpdGVfdW5tYXBwZWRBdHRyaWJ1dGVUZXh0PUF0dHJpYnV0ZSAnJ3swfScnIGlzIG5vdCBtYXBwZWQsIGNsaWNrIGhlcmUgdG8gY2hhbmdlIHRoZSBtYXBwaW5nIHR5cGUuCitNYXBBc0NvbXBvc2l0ZV91bm1hcHBlZFR5cGVUZXh0PVR5cGUgJyd7MH0nJyBpcyBub3QgbWFwcGVkLCBjbGljayBoZXJlIHRvIGNoYW5nZSB0aGUgbWFwcGluZyB0eXBlLgorTWFwQXNDb21wb3NpdGVfdmlydHVhbEF0dHJpYnV0ZVRleHQ9QXR0cmlidXRlICcnezB9JycgaXMgbm90IG1hcHBlZC4KKworQmFzaWNNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1CYXNpYworRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1FbWJlZGRlZAorRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPUVtYmVkZGVkIElkCitJZE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPUlkCitPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1PbmUgdG8gTWFueQorT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1PbmUgdG8gT25lCitNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9TWFueSB0byBNYW55CitNYW55VG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1NYW55IHRvIE9uZQorVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9VHJhbnNpZW50CitWZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9VmVyc2lvbgorQmFzaWNNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw9YmFzaWMKK0VtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPWVtYmVkZGVkCitFbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPWVtYmVkZGVkIGlkCitJZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1pZAorT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPW9uZSB0byBtYW55CitPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1vbmUgdG8gb25lCitNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPW1hbnkgdG8gbWFueQorTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPW1hbnkgdG8gb25lCitUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw9dHJhbnNpZW50CitWZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPXZlcnNpb24KKworRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9RGVmYXVsdCAoQmFzaWMpCitEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1EZWZhdWx0IChFbWJlZGRlZCkKK0RlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1kZWZhdWx0IChiYXNpYykKK0RlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1kZWZhdWx0IChlbWJlZGRlZCkKKworRW1iZWRkYWJsZVVpUHJvdmlkZXJfbGFiZWw9RW1iZWRkYWJsZQorRW50aXR5VWlQcm92aWRlcl9sYWJlbD1FbnRpdHkKK01hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyX2xhYmVsPU1hcHBlZCBTdXBlcmNsYXNzCitOdWxsVHlwZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPVVubWFwcGVkCisKK0VtYmVkZGFibGVVaVByb3ZpZGVyX2xpbmtMYWJlbD1lbWJlZGRhYmxlCitFbnRpdHlVaVByb3ZpZGVyX2xpbmtMYWJlbD1lbnRpdHkKK01hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyX2xpbmtMYWJlbD1tYXBwZWQgc3VwZXJjbGFzcworCisKK0FkZFF1ZXJ5RGlhbG9nX3RpdGxlPUFkZCBRdWVyeQorQWRkUXVlcnlEaWFsb2dfZGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgbmV3IHF1ZXJ5CitBZGRRdWVyeURpYWxvZ19uYW1lZFF1ZXJ5PU5hbWVkIFF1ZXJ5CitBZGRRdWVyeURpYWxvZ19uYW1lZE5hdGl2ZVF1ZXJ5PSBOYW1lZCBOYXRpdmUgUXVlcnkKK0FkZFF1ZXJ5RGlhbG9nX2Rlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBxdWVyeSBzZXR0aW5nIGJvdGggdGhlICduYW1lJyBhbmQgdGhlICd0eXBlJyAKK1F1ZXJ5U3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZD1BIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuCitRdWVyeVN0YXRlT2JqZWN0X3R5cGVNdXN0QmVTcGVjaWZpZWQ9QSBxdWVyeSB0eXBlIG11c3QgYmUgc3BlY2lmaWVkCitBZGRRdWVyeURpYWxvZ19uYW1lPU5hbWU6CitBZGRRdWVyeURpYWxvZ19xdWVyeVR5cGU9VHlwZToKK05hbWVkUXVlcnlDb21wb3NpdGVfbmFtZVRleHRMYWJlbD1OYW1lOgorCitFbnRpdHlDb21wb3NpdGVfaW5oZXJpdGFuY2U9SW5oZXJpdGFuY2UKK0VudGl0eUNvbXBvc2l0ZV9xdWVyaWVzPVF1ZXJpZXMKK0VudGl0eUNvbXBvc2l0ZV90YWJsZURlZmF1bHQ9RGVmYXVsdCAoezB9KQorRW50aXR5Q29tcG9zaXRlX3RhYmxlTm9EZWZhdWx0U3BlY2lmaWVkPURlZmF1bHQgKCkKKworRW50aXR5R2VuZXJhbFNlY3Rpb25fbmFtZT1OYW1lOgorCitFbnRpdHlOYW1lQ29tcG9zaXRlX25hbWU9TmFtZToKKworQmFzaWNHZW5lcmFsU2VjdGlvbl9uYW1lPU5hbWU6CitCYXNpY0dlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0PURlZmF1bHQgKHswfSkKK0Jhc2ljR2VuZXJhbFNlY3Rpb25fZmV0Y2hMYWJlbD1GZXRjaDoKK0Jhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbD1PcHRpb25hbAorQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsRGVmYXVsdD1PcHRpb25hbCAoezB9KQorQmFzaWNHZW5lcmFsU2VjdGlvbl9sb2JMYWJlbD1Mb2IKK0Jhc2ljR2VuZXJhbFNlY3Rpb25fdGVtcG9yYWxMYWJlbD1UZW1wb3JhbDoKK0Jhc2ljR2VuZXJhbFNlY3Rpb25fZW51bWVyYXRlZExhYmVsPUVudW1lcmF0ZWQ6CitUeXBlU2VjdGlvbl90eXBlPVR5cGUKK1R5cGVTZWN0aW9uX2RlZmF1bHQ9RGVmYXVsdAorVHlwZVNlY3Rpb25fbG9iPUxvYgorVHlwZVNlY3Rpb25fdGVtcG9yYWw9VGVtcG9yYWwKK1R5cGVTZWN0aW9uX2VudW1lcmF0ZWQ9RW51bWVyYXRlZAorCitUYWJsZUNob29zZXJfbGFiZWw9TmFtZToKK0NhdGFsb2dDaG9vc2VyX2xhYmVsPUNhdGFsb2c6CitTY2hlbWFDaG9vc2VyX2xhYmVsPVNjaGVtYToKK1RhYmxlQ29tcG9zaXRlX3RhYmxlU2VjdGlvbj1UYWJsZQorCitUYXJnZXRFbnRpdHlDaG9vc2VyX2xhYmVsPVRhcmdldCBlbnRpdHk6CitUYXJnZXRFbnRpdHlDaG9vc2VyX2Jyb3dzZT1Ccm93c2UuLi4KK1RhcmdldEVudGl0eUNob29zZXJfc2VsZWN0VHlwZVRpdGxlPVNlbGVjdCBUeXBlCisKK0lkQ2xhc3NDb21wb3NpdGVfbGFiZWw9UHJpbWFyeSBrZXkgY2xhc3M6CisKK0pvaW5pbmdfdGl0bGU9Sm9pbmluZyBTdHJhdGVneQorSm9pbmluZ19tYXBwZWRCeUxhYmVsPU1hcHBlZCBieQorSm9pbmluZ19tYXBwZWRCeUF0dHJpYnV0ZUxhYmVsPUF0dHJpYnV0ZToKK0pvaW5pbmdfam9pbkNvbHVtbkpvaW5pbmdMYWJlbD1Kb2luIGNvbHVtbnMKK0pvaW5pbmdfcHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nTGFiZWw9UHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zCitKb2luaW5nX2pvaW5UYWJsZUpvaW5pbmdMYWJlbD1Kb2luIHRhYmxlCisKK0pvaW5UYWJsZUNvbXBvc2l0ZV9pbnZlcnNlSm9pbkNvbHVtbj1JbnZlcnNlIGpvaW4gY29sdW1ucworSm9pblRhYmxlQ29tcG9zaXRlX2pvaW5Db2x1bW49Sm9pbiBjb2x1bW5zCitKb2luVGFibGVDb21wb3NpdGVfbmFtZT1OYW1lOgorSm9pblRhYmxlQ29tcG9zaXRlX3NjaGVtYT1TY2hlbWE6CitKb2luVGFibGVDb21wb3NpdGVfY2F0YWxvZz1DYXRhbG9nOgorSm9pblRhYmxlQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zPU92ZXJyaWRlIGRlZmF1bHQKK0pvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnM9T3ZlcnJpZGUgZGVmYXVsdAorCitNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfZ2VuZXJhbD1HZW5lcmFsCitNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfam9pblRhYmxlPUpvaW4gVGFibGUKK011bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV90YXJnZXRFbnRpdHk9VGFyZ2V0IGVudGl0eToKK011bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9jYXNjYWRlVHlwZT1DYXNjYWRlIHR5cGU6CitNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfZmV0Y2hUeXBlPUZldGNoIHR5cGU6CitNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfbWFwcGVkQnk9TWFwcGVkIGJ5OgorCitDb2x1bW5Db21wb3NpdGVfY29sdW1uRGVmaW5pdGlvbj1Db2x1bW4gZGVmaW5pdGlvbjoKK0NvbHVtbkNvbXBvc2l0ZV9jb2x1bW5TZWN0aW9uPUNvbHVtbgorQ29sdW1uQ29tcG9zaXRlX2RldGFpbHM9RGV0YWlscworQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGU9SW5zZXJ0YWJsZQorQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGVXaXRoRGVmYXVsdD1JbnNlcnRhYmxlICh7MH0pCitDb2x1bW5Db21wb3NpdGVfbGVuZ3RoPUxlbmd0aDoKK0NvbHVtbkNvbXBvc2l0ZV9uYW1lPU5hbWU6CitDb2x1bW5Db21wb3NpdGVfbnVsbGFibGU9TnVsbGFibGUKK0NvbHVtbkNvbXBvc2l0ZV9udWxsYWJsZVdpdGhEZWZhdWx0PU51bGxhYmxlICh7MH0pCitDb2x1bW5Db21wb3NpdGVfcHJlY2lzaW9uPVByZWNpc2lvbjoKK0NvbHVtbkNvbXBvc2l0ZV9zY2FsZT1TY2FsZToKK0NvbHVtbkNvbXBvc2l0ZV90YWJsZT1UYWJsZToKK0NvbHVtbkNvbXBvc2l0ZV91bmlxdWU9VW5pcXVlCitDb2x1bW5Db21wb3NpdGVfdW5pcXVlV2l0aERlZmF1bHQ9VW5pcXVlICh7MH0pCitDb2x1bW5Db21wb3NpdGVfdXBkYXRhYmxlPVVwZGF0YWJsZQorQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZVdpdGhEZWZhdWx0PVVwZGF0YWJsZSAoezB9KQorCitKb2luQ29sdW1uc0NvbXBvc2l0ZV9lZGl0PUVkaXQuLi4KK0pvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zPXswfSAtPiB7MX0KK0pvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdD1EZWZhdWx0ICh7MH0gLT4gezF9KQorSm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdD1EZWZhdWx0ICh7MH0pIC0+IERlZmF1bHQgKHsxfSkKK0pvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0PURlZmF1bHQgKHswfSkgLT4gezF9CitKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQ9ezB9IC0+IERlZmF1bHQgKHsxfSkKK0pvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zPU92ZXJyaWRlIGRlZmF1bHQKKworUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucz1PdmVycmlkZSBkZWZhdWx0CitQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZWRpdD1FZGl0Li4uCitQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcHJpbWFyeUtleUpvaW5Db2x1bW49UHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zCitQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXM9ezB9IC0+IHsxfQorUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdD1EZWZhdWx0ICh7MH0gLT4gezF9KQorUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiBEZWZhdWx0ICh7MX0pCitQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiB7MX0KK1ByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQ9ezB9IC0+IERlZmF1bHQgKHsxfSkKKworSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uRGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgTmV3IEpvaW4gQ29sdW1uCitKb2luQ29sdW1uRGlhbG9nX2FkZEpvaW5Db2x1bW5UaXRsZT1BZGQgSm9pbiBDb2x1bW4KK0pvaW5Db2x1bW5EaWFsb2dfZGVzY3JpcHRpb249U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLgorSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtbkRlc2NyaXB0aW9uVGl0bGU9RWRpdCBKb2luIENvbHVtbgorSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtblRpdGxlPUVkaXQgSm9pbiBDb2x1bW4KK0pvaW5Db2x1bW5EaWFsb2dfbmFtZT0mTmFtZToKK0pvaW5Db2x1bW5EaWFsb2dfcmVmZXJlbmNlZENvbHVtbk5hbWU9JlJlZmVyZW5jZWQgY29sdW1uIG5hbWU6CisKK0pvaW5Db2x1bW5EaWFsb2dQYW5lX2NvbHVtbkRlZmluaXRpb249JkNvbHVtbiBkZWZpbml0aW9uOgorSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZT0mSW5zZXJ0YWJsZQorSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZVdpdGhEZWZhdWx0PSZJbnNlcnRhYmxlICh7MH0pCitKb2luQ29sdW1uRGlhbG9nUGFuZV9udWxsYWJsZT0mTnVsbGFibGUKK0pvaW5Db2x1bW5EaWFsb2dQYW5lX251bGxhYmxlV2l0aERlZmF1bHQ9Jk51bGxhYmxlICh7MH0pCitKb2luQ29sdW1uRGlhbG9nUGFuZV90YWJsZT0mVGFibGU6CitKb2luQ29sdW1uRGlhbG9nUGFuZV91bmlxdWU9JlVuaXF1ZQorSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdW5pcXVlV2l0aERlZmF1bHQ9JlVuaXF1ZSAoezB9KQorSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdXBkYXRhYmxlPSZVcGRhdGFibGUKK0pvaW5Db2x1bW5EaWFsb2dQYW5lX3VwZGF0YWJsZVdpdGhEZWZhdWx0PSZVcGRhdGFibGUgKHswfSkKKworSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2dfZWRpdEludmVyc2VKb2luQ29sdW1uVGl0bGU9RWRpdCBJbnZlcnNlIEpvaW4gQ29sdW1uCisKK1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGREZXNjcmlwdGlvblRpdGxlPUNyZWF0ZSBOZXcgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KK1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGRUaXRsZT1BZGQgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KK1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZT1FZGl0IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCitQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdFRpdGxlPUVkaXQgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KKworUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfYWRkRGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgTmV3IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCitQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19hZGRUaXRsZT1BZGQgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KK1ByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2VkaXREZXNjcmlwdGlvblRpdGxlPUVkaXQgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4KK1ByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2VkaXRUaXRsZT1FZGl0IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCisKK092ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGVPdmVycmlkZXNTZWN0aW9uPUF0dHJpYnV0ZSBPdmVycmlkZXMKK092ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGVPdmVycmlkZXNHcm91cD1BdHRyaWJ1dGUgb3ZlcnJpZGVzCitPdmVycmlkZXNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0PU92ZXJyaWRlIGRlZmF1bHQKKworT3ZlcnJpZGVzQ29tcG9zaXRlX2Fzc29jaWF0aW9uPUFzc29jaWF0aW9uIE92ZXJyaWRlCitPdmVycmlkZXNDb21wb3NpdGVfYXR0cmlidXRlPUF0dHJpYnV0ZSBPdmVycmlkZQorT3ZlcnJpZGVzQ29tcG9zaXRlX25vTmFtZT08TmFtZSBub3Qgc2V0PgorQXNzb2NpYXRpb25PdmVycmlkZXNDb21wb3NpdGVfam9pbkNvbHVtbj1Kb2luIGNvbHVtbnMKKworSW5oZXJpdGFuY2VDb21wb3NpdGVfZGV0YWlsc0dyb3VwQm94PURldGFpbHMKK0luaGVyaXRhbmNlQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JDb2x1bW5Hcm91cEJveD1EaXNjcmltaW5hdG9yIGNvbHVtbgorSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlPURpc2NyaW1pbmF0b3IgdmFsdWU6CitBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX2pvaW5lZD1Kb2luZWQKK0Fic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGVfc2luZ2xlX3RhYmxlPVNpbmdsZSBUYWJsZQorSW5oZXJpdGFuY2VDb21wb3NpdGVfc3RyYXRlZ3k9U3RyYXRlZ3k6CitBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX3RhYmxlX3Blcl9jbGFzcz1UYWJsZSBwZXIgQ2xhc3MKKworRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yVHlwZT1UeXBlOgorRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9uYW1lPU5hbWU6CitEaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2NoYXI9Q2hhcmFjdGVyCitEaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2ludGVnZXI9SW50ZWdlcgorRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9zdHJpbmc9U3RyaW5nCisKK0dlbmVyYXRvcnNDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveD1TZXF1ZW5jZSBnZW5lcmF0b3IKK0dlbmVyYXRvcnNDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3JTZWN0aW9uPVNlcXVlbmNlIEdlbmVyYXRvcgorR2VuZXJhdG9yc0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvckNoZWNrQm94PVRhYmxlIGdlbmVyYXRvcgorR2VuZXJhdG9yc0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvclNlY3Rpb249VGFibGUgR2VuZXJhdG9yCisKK0lkTWFwcGluZ0NvbXBvc2l0ZV9wa19nZW5lcmF0aW9uPVBLIEdlbmVyYXRpb24KK0lkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94PVByaW1hcnkga2V5IGdlbmVyYXRpb24KK0lkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvblNlY3Rpb249UHJpbWFyeSBLZXkgR2VuZXJhdGlvbgorSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yQ2hlY2tCb3g9VGFibGUgZ2VuZXJhdG9yCitJZE1hcHBpbmdDb21wb3NpdGVfdGFibGVHZW5lcmF0b3JTZWN0aW9uPVRhYmxlIEdlbmVyYXRvcgorSWRNYXBwaW5nQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3g9U2VxdWVuY2UgZ2VuZXJhdG9yCitJZE1hcHBpbmdDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3JTZWN0aW9uPVNlcXVlbmNlIEdlbmVyYXRvcgorCitHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0ZWRWYWx1ZT1HZW5lcmF0ZWQgVmFsdWUKK0dlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2dlbmVyYXRvck5hbWU9R2VuZXJhdG9yIG5hbWU6CitHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9zdHJhdGVneT1TdHJhdGVneToKK0dlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2F1dG89QXV0bworR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfaWRlbnRpdHk9SWRlbnRpdHkKK0dlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX3NlcXVlbmNlPVNlcXVlbmNlCitHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV90YWJsZT1UYWJsZQorCitTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9jYXRhbG9nPUNhdGFsb2c6CitTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0PURlZmF1bHQKK1NlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU9TmFtZToKK1NlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NjaGVtYT1TY2hlbWE6CitTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zZXF1ZW5jZT1TZXF1ZW5jZToKK1NlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yPVNlcXVlbmNlIEdlbmVyYXRvcgorCitUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9jYXRhbG9nPUNhdGFsb2c6CitUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0PURlZmF1bHQKK1RhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU9TmFtZToKK1RhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uPVByaW1hcnkga2V5IGNvbHVtbjoKK1RhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uVmFsdWU9UHJpbWFyeSBrZXkgY29sdW1uIHZhbHVlOgorVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfc2NoZW1hPVNjaGVtYToKK1RhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlPVRhYmxlOgorVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdGFibGVHZW5lcmF0b3I9VGFibGUgR2VuZXJhdG9yCitUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV92YWx1ZUNvbHVtbj1WYWx1ZSBjb2x1bW46CisKK0dlbmVyYXRvckNvbXBvc2l0ZV9hbGxvY2F0aW9uU2l6ZT1BbGxvY2F0aW9uIHNpemU6CitHZW5lcmF0b3JDb21wb3NpdGVfaW5pdGlhbFZhbHVlPUluaXRpYWwgdmFsdWU6CisKK09yZGVyQnlDb21wb3NpdGVfb3JkZXJCeUdyb3VwPU9yZGVyIGJ5CitPcmRlckJ5Q29tcG9zaXRlX29yZGVyQnlMYWJlbD1PcmRlciBieToKK09yZGVyQnlDb21wb3NpdGVfbm9PcmRlcmluZz1ObyBvcmRlcmluZworT3JkZXJCeUNvbXBvc2l0ZV9wcmltYXJ5S2V5T3JkZXJpbmc9UHJpbWFyeSBrZXkgb3JkZXJpbmcKK09yZGVyQnlDb21wb3NpdGVfY3VzdG9tT3JkZXJpbmc9Q3VzdG9tIG9yZGVyaW5nCisKK1NlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9zZWNvbmRhcnlUYWJsZXM9U2Vjb25kYXJ5IFRhYmxlcworU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX2VkaXQ9RWRpdC4uLgorCitTZWNvbmRhcnlUYWJsZURpYWxvZ19hZGRTZWNvbmRhcnlUYWJsZT1BZGQgU2Vjb25kYXJ5IFRhYmxlCitTZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0U2Vjb25kYXJ5VGFibGU9RWRpdCBTZWNvbmRhcnkgVGFibGUKK1NlY29uZGFyeVRhYmxlRGlhbG9nX25hbWU9TmFtZToKK1NlY29uZGFyeVRhYmxlRGlhbG9nX2NhdGFsb2c9Q2F0YWxvZzoKK1NlY29uZGFyeVRhYmxlRGlhbG9nX3NjaGVtYT1TY2hlbWE6CitTZWNvbmRhcnlUYWJsZURpYWxvZ19kZWZhdWx0U2NoZW1hPURlZmF1bHQgKHswfSkKK1NlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRDYXRhbG9nPURlZmF1bHQgKHswfSkKKworQWNjZXNzVHlwZUNvbWJvX2RlZmF1bHQ9RGVmYXVsdAorTWV0YURhdGFDb21wbGV0ZUNvbWJvX0RlZmF1bHQ9RGVmYXVsdCAoezB9KQorCitPcHRpb25hbENvbXBvc2l0ZV9mYWxzZT1GYWxzZQorT3B0aW9uYWxDb21wb3NpdGVfdHJ1ZT1UcnVlCisKK0VudW1UeXBlQ29tcG9zaXRlX29yZGluYWw9T3JkaW5hbAorRW51bVR5cGVDb21wb3NpdGVfc3RyaW5nPVN0cmluZworCitGZXRjaFR5cGVDb21wb3NpdGVfZWFnZXI9RWFnZXIKK0ZldGNoVHlwZUNvbXBvc2l0ZV9sYXp5PUxhenkKKworVGVtcG9yYWxUeXBlQ29tcG9zaXRlX2RhdGU9RGF0ZQorVGVtcG9yYWxUeXBlQ29tcG9zaXRlX3RpbWU9VGltZQorVGVtcG9yYWxUeXBlQ29tcG9zaXRlX3RpbWVzdGFtcD1UaW1lc3RhbXAKKworQ2FzY2FkZUNvbXBvc2l0ZV9hbGw9QWxsCitDYXNjYWRlQ29tcG9zaXRlX2Nhc2NhZGVUaXRsZT1DYXNjYWRlCitDYXNjYWRlQ29tcG9zaXRlX21lcmdlPU1lcmdlCitDYXNjYWRlQ29tcG9zaXRlX3BlcnNpc3Q9UGVyc2lzdAorQ2FzY2FkZUNvbXBvc2l0ZV9yZWZyZXNoPVJlZnJlc2gKK0Nhc2NhZGVDb21wb3NpdGVfcmVtb3ZlPVJlbW92ZQorCitRdWVyaWVzQ29tcG9zaXRlX2Rpc3BsYXlTdHJpbmc9PE5hbWUgbm90IHNldD4gezB9CisKK05hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeT1RdWVyeToKK05hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeUhpbnRzR3JvdXBCb3g9UXVlcnkgaGludHMKK05hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9yZXN1bHRDbGFzcz1SZXN1bHQgY2xhc3M6CisKK05hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeT1RdWVyeToKK05hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeUhpbnRzR3JvdXBCb3g9UXVlcnkgaGludHMKKworTmV3TmFtZVN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQ9QSBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLgorTmV3TmFtZVN0YXRlT2JqZWN0X25hbWVBbHJlYWR5RXhpc3RzPUEgcXVlcnkgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMuCisKK1F1ZXJ5SGludHNDb21wb3NpdGVfbmFtZUNvbHVtbj1OYW1lCitRdWVyeUhpbnRzQ29tcG9zaXRlX3ZhbHVlQ29sdW1uPVZhbHVlCisKK09ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9kZWZpbmVJblhtbD1EZWZpbmUgaW4gWE1MCisKK051bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1Vbm1hcHBlZApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9kZXRhaWxzMl8wLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2RldGFpbHMyXzAucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjU2Nzg0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9kZXRhaWxzMl8wLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisjIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworRGVyaXZlZElkUGFuZV9kZXJpdmVkSWRDaGVja2JveExhYmVsPUlkCisKK0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMF9sYWJlbD1FbGVtZW50IENvbGxlY3Rpb24KK0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMF9saW5rTGFiZWw9ZWxlbWVudCBjb2xsZWN0aW9uCisKK0VudGl0eV9jYWNoZWFibGVMYWJlbD1DYWNoZWFibGUKK0VudGl0eV9jYWNoZWFibGVXaXRoRGVmYXVsdExhYmVsPUNhY2hlYWJsZSAoezB9KQorCitPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlX29ycGhhblJlbW92YWxMYWJlbD1PcnBoYW4gcmVtb3ZhbAorT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZV9vcnBoYW5SZW1vdmFsTGFiZWxEZWZhdWx0PU9ycGhhbiByZW1vdmFsICh7MH0pCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2RldGFpbHNfb3JtLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2RldGFpbHNfb3JtLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1ZjUwMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfZGV0YWlsc19vcm0ucHJvcGVydGllcwpAQCAtMCwwICsxLDU0IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQm9vbGVhbl9GYWxzZT1GYWxzZQorQm9vbGVhbl9UcnVlPVRydWUKK0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfYWNjZXNzPUFjY2VzczoKK0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfY2F0YWxvZz1DYXRhbG9nOgorRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9maWVsZD1GaWVsZAorRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9wYWNrYWdlPVBhY2thZ2U6CitFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX3Byb3BlcnR5PVByb3BlcnR5CitFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX3NjaGVtYT1TY2hlbWE6CitFbnRpdHlNYXBwaW5nc1BhZ2VfY2F0YWxvZ0RlZmF1bHQ9RGVmYXVsdCAoezB9CitFbnRpdHlNYXBwaW5nc1BhZ2VfY2F0YWxvZ05vRGVmYXVsdFNwZWNpZmllZD1EZWZhdWx0CitFbnRpdHlNYXBwaW5nc1BhZ2Vfc2NoZW1hRGVmYXVsdD1EZWZhdWx0ICh7MH0pCitFbnRpdHlNYXBwaW5nc1BhZ2Vfc2NoZW1hTm9EZWZhdWx0U3BlY2lmaWVkPURlZmF1bHQKK01ldGFkYXRhQ29tcGxldGVDb21wb3NpdGVfbWV0YWRhdGFDb21wbGV0ZT1NZXRhZGF0YSBjb21wbGV0ZQorTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZV9tZXRhZGF0YUNvbXBsZXRlV2l0aERlZmF1bHQ9TWV0YWRhdGEgY29tcGxldGUgKHswfSkKK09ybUdlbmVyYXRvcnNDb21wb3NpdGVfZGlzcGxheVN0cmluZz08TmFtZSBub3Qgc2V0PiB7MH0KK09ybUdlbmVyYXRvcnNDb21wb3NpdGVfZ3JvdXBCb3g9R2VuZXJhdG9ycworT3JtSmF2YUF0dHJpYnV0ZUNob29zZXJfamF2YUF0dHJpYnV0ZT1KYXZhIGF0dHJpYnV0ZToKK09ybUphdmFDbGFzc0Nob29zZXJfamF2YUNsYXNzPUphdmEgY2xhc3M6CitPcm1RdWVyaWVzQ29tcG9zaXRlX2dyb3VwQm94PVF1ZXJpZXMKK1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2FjY2Vzcz1BY2Nlc3M6CitQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9jYXNjYWRlUGVyc2lzdENoZWNrQm94PUNhc2NhZGUgcGVyc2lzdAorUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfY2F0YWxvZz1DYXRhbG9nOgorUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfZmllbGQ9RmllbGQKK1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3BlcnNpc3RlbmNlVW5pdFNlY3Rpb249UGVyc2lzdGVuY2UgVW5pdAorUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfcHJvcGVydHk9UHJvcGVydHkKK1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3NjaGVtYT1TY2hlbWE6CitQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV94bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94PVhNTCBtYXBwaW5nIG1ldGFkYXRhIGNvbXBsZXRlCitQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb25fY2F0YWxvZ0RlZmF1bHQ9RGVmYXVsdCAoezB9KQorUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uX3NjaGVtYURlZmF1bHQ9RGVmYXVsdCAoezB9KQorCitBZGRHZW5lcmF0b3JEaWFsb2dfbmFtZT1OYW1lOgorQWRkR2VuZXJhdG9yRGlhbG9nX2dlbmVyYXRvclR5cGU9VHlwZToKK0FkZEdlbmVyYXRvckRpYWxvZ190aXRsZT1BZGQgR2VuZXJhdG9yCitBZGRHZW5lcmF0b3JEaWFsb2dfZGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgbmV3IGdlbmVyYXRvcgorQWRkR2VuZXJhdG9yRGlhbG9nX2Rlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBnZW5lcmF0b3Igc2V0dGluZyBib3RoIHRoZSAnbmFtZScgYW5kIHRoZSAndHlwZScKK0FkZEdlbmVyYXRvckRpYWxvZ190YWJsZUdlbmVyYXRvcj1UYWJsZSBHZW5lcmF0b3IKK0FkZEdlbmVyYXRvckRpYWxvZ19zZXF1ZW5jZUdlbmVyYXRvcj1TZXF1ZW5jZSBHZW5lcmF0b3IKK0dlbmVyYXRvclN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQ9QSBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLgorR2VuZXJhdG9yU3RhdGVPYmplY3RfdHlwZU11c3RCZVNwZWNpZmllZD1BIGdlbmVyYXRvciB0eXBlIG11c3QgYmUgc3BlY2lmaWVkLgorCisKK1Vuc3VwcG9ydGVkT3JtTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9VW5zdXBwb3J0ZWQKKworVW5zdXBwb3J0ZWRPcm1NYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw9dW5zdXBwb3J0ZWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2VudGl0eV9nZW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfZW50aXR5X2dlbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMDUzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2VudGl0eV9nZW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDExMSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKKworY2FyZGluYWxpdHk9Q2FyJmRpbmFsaXR5OgorcHJvcGVydHk9UCZyb3BlcnR5OgorY2FzY2FkZT0mQ2FzY2FkZToKK2Nvbm5lY3Rpb249JkNvbm5lY3Rpb246CitzY2hlbWE9JlNjaGVtYToKK3NjaGVtYUluZm89KE5vdGU6IFlvdSBtdXN0IGhhdmUgYW4gYWN0aXZlIGNvbm5lY3Rpb24gdG8gc2VsZWN0IHNjaGVtYS4pCithZGRDb25uZWN0aW9uTGluaz1BZGQgY29ubmVjdGlvbnMuLi4KK2Nvbm5lY3RMaW5rPUNvbm5lY3QKK2Nvbm5lY3RpbmdUb0RhdGFiYXNlPUNvbm5lY3RpbmcgdG8gZGF0YWJhc2UKK21hbnlUb09uZT0mTWFueSB0byBvbmUKK21hbnlUb01hbnk9TWFuJnkgdG8gbWFueQorb25lVG9NYW55PSZPbmUgdG8gbWFueQorb25lVG9PbmU9Jk9uZSB0byBvbmUKK21hbnlUb09uZURlc2M9RWFjaCAlcyBoYXMgbWFueSAlcy4KK29uZVRvT25lRGVzYz1UaGVyZSBpcyBvbmUgJXMgcGVyICVzLgorbWFueVRvTWFueURlc2M9RWFjaCAlcyBoYXMgbWFueSAlcywgYW5kIGVhY2ggJXMgaGFzIG1hbnkgJXMuCisKK2FkZD0mQWRkCityZW1vdmU9JlJlbW92ZQorCitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2dlbmVyYXRlRW50aXRpZXM9R2VuZXJhdGUgQ3VzdG9tIEVudGl0aWVzCisKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfc2VsZWN0SlBBUHJvamVjdD1KUEEgUHJvamVjdCBTZWxlY3Rpb24KK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfc2VsZWN0SlBBUHJvamVjdF9tc2c9U2VsZWN0IGEgSlBBIHByb2plY3QuCisKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX3NlbGVjdFRhYmxlPVNlbGVjdCBUYWJsZXMKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX2Nob29zZUVudGl0eVRhYmxlPVNlbGVjdCB0YWJsZXMgdG8gZ2VuZXJhdGUgZW50aXRpZXMgZnJvbS4KK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX3N5bmNocm9uaXplQ2xhc3Nlcz1TeW5jaHJvbml6ZSBjbGFzc2VzIGxpc3RlZCBpbiBwZXJzaXN0ZW5jZS54bWwKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX3RhYmxlcz0mVGFibGVzOgorR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfdGFibGVDb2x1bW49VGFibGUKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX1Jlc3RvcmVfRGVmYXVsdHM9UmVzdG9yZSBEZWZhdWx0cworCitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV90aXRsZT1UYWJsZSBBc3NvY2lhdGlvbnMKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX2xhYmVsPVRhYmxlICZhc3NvY2lhdGlvbnMKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX2Rlc2M9RWRpdCBhIHRhYmxlIGFzc29jaWF0aW9uIGJ5IHNlbGVjdGluZyBpdCBhbmQgbW9kaWZ5aW5nIHRoZSBjb250cm9scyBpbiB0aGUgZWRpdGluZyBwYW5lbC4KK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX25ld0Fzc29jPU5ldyBBc3NvY2lhdGlvbgorR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY1BhZ2VfZGVsQXNzb2M9RGVsZXRlIFNlbGVjdGVkIEFzc29jaWF0aW9uCisKKworR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3RpdGxlPUN1c3RvbWl6ZSBEZWZhdWx0IEVudGl0eSBHZW5lcmF0aW9uCitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfdGFibGVNYXBwaW5nPVRhYmxlIE1hcHBpbmcKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9kb21haW5KYXZhQ2xhc3M9RG9tYWluIEphdmEgQ2xhc3MKKworR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2Rlc2M9T3B0aW9uYWxseSBjdXN0b21pemUgYXNwZWN0cyBvZiBlbnRpdGllcyB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgZnJvbSBkYXRhYmFzZSB0YWJsZXMuIEEgSmF2YSBwYWNrYWdlIHNob3VsZCBiZSBzcGVjaWZpZWQuCitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfYWNjZXNzPUVudGl0eSAmYWNjZXNzOgorR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2ZldGNoPUFzc29jaWF0aW9ucyAmZmV0Y2g6CitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfY29sbFR5cGU9Q29sbGVjdGlvbiBwcm9wZXJ0aWVzICZ0eXBlOgorR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2dlbk9wdGlvbmFsQW5ub3RhdGlvbnMgPSBBbHdheXMgZ2VuZXJhdGUgb3B0aW9uYWwgSlBBIGFubm90YXRpb25zIGFuZCBEREwgcGFyYW1ldGVycworR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2dlbk9wdGlvbmFsQW5ub3RhdGlvbnNfZGVzYyA9ICBHZW5lcmF0ZSBvcHRpb25hbCBKUEEgYW5ub3RhdGlvbnMgYW5kIERETCBwYXJhbWV0ZXJzIGxpa2UgJ3VuaXF1ZScsICdudWxsYWJsZScsICdsZW5ndGgnLCAncHJlY2lzaW9uJyBhbmQgJ3NjYWxlJywgd2hpY2ggYXJlIG9wdGlvbmFsIGFuZCBvbmx5IHVzZWQgYnkgYXV0b21hdGljIHRhYmxlIGNyZWF0aW9uIHRvIHNwZWNpZnkgdGFibGUgY3JlYXRpb24gZGF0YS4KK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9rZXlHZW49S2V5ICZnZW5lcmF0b3I6CitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2Vfc2VxdWVuY2U9U2VxdWVuY2UgJm5hbWU6CitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2Vfc2VxdWVuY2VOb3RlPVlvdSBjYW4gdXNlIHRoZSBwYXR0ZXJucyAlcyBhbmQvb3IgJXMgaW4gdGhlIHNlcXVlbmNlIG5hbWUuXG5cCisJCQlUaGVzZSBwYXR0ZXJucyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB0YWJsZSBuYW1lIGFuZCB0aGUgcHJpbWFyeSBrZXkgXG5cCisJCQljb2x1bW4gbmFtZSB3aGVuIGEgdGFibGUgbWFwcGluZyBpcyBnZW5lcmF0ZWQuCisKKworR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZXNBbmRDb2x1bW5zUGFnZV90aXRsZT1DdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllcworR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZXNBbmRDb2x1bW5zUGFnZV9kZXNjPUN1c3RvbWl6ZSBkZXRhaWwgb2YgaW5kaXZpZHVhbCBlbnRpdGllcyBieSBzZWxlY3RpbmcgdGhlIGFzc29jaWF0ZWQgdGFibGVzIG9yIGNvbHVtbnMgYW5kIGNoYW5naW5nIHZhbHVlcyBpbiB0aGUgZWRpdGluZyBwYW5lbC4KK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVzQW5kQ29sdW1uc1BhZ2VfbGFiZWxUYWJsZUFuZENvbHVtbnM9JlRhYmxlcyBhbmQgY29sdW1ucworCitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlUGFuZWxfY2xhc3NOYW1lPSZDbGFzcyBuYW1lOgorR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9nZW5Qcm9wPUdlbmVyYXRlIHRoaXMgcHJvcGVydHkKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfY29sTWFwcGluZz1Db2x1bW4gbWFwcGluZworR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9wcm9wTmFtZT1Qcm9wZXJ0eSAmbmFtZToKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfcHJvcFR5cGU9TWFwcGluZyB0JnlwZToKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfbWFwS2luZD1NYXBwaW5nICZraW5kOgorR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9iZWFuUHJvcD1Eb21haW4gSmF2YSBDbGFzcworR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9nZXR0ZXJTY29wZT1HZXR0ZXIgU2NvcGU6CitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX3NldHRlclNjb3BlPVNldHRlciBTY29wZToKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfY29sVXBkYXRlYWJsZT1Db2x1bW4gaXMgJnVwZGF0YWJsZQorR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9jb2xJbnNlcnRhYmxlPUNvbHVtbiBpcyAmaW5zZXJ0YWJsZQorCitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RpdGxlPUNyZWF0ZSBOZXcgQXNzb2NpYXRpb24KKworR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX3RpdGxlPUFzc29jaWF0aW9uIFRhYmxlcworR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2Rlc2M9U3BlY2lmeSB0aGUgYXNzb2NpYXRpb24gdGFibGVzLgorR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2Fzc29jS2luZD1Bc3NvY2lhdGlvbiBLaW5kCitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfYXNzb2NUYWJsZXM9QXNzb2NpYXRpb24gJnRhYmxlczoKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV90YWJsZTE9VGFibGUgJjE6CitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfdGFibGUyPVRhYmxlICYyOgorR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2ludGVybWVkaWF0ZVRhYmxlPUpvaW4gVGFibGU6CitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2Vfc2ltcGxlQXNzb2M9JlNpbXBsZSBhc3NvY2lhdGlvbgorR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX20ybUFzc29jPSZNYW55IHRvIG1hbnkgYXNzb2NpYXRpb24KKworR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jYXJkaW5hbGl0eVBhZ2VfdGl0bGU9QXNzb2NpYXRpb24gQ2FyZGluYWxpdHkKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY2FyZGluYWxpdHlQYWdlX2Rlc2M9U3BlY2lmeSB0aGUgYXNzb2NpYXRpb24gY2FyZGluYWxpdHkuCisKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfdGl0bGU9Sm9pbiBDb2x1bW5zCitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX2NvbHNQYWdlX2Rlc2M9U3BlY2lmeSB0aGUgam9pbiBjb2x1bW5zLgorR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9sYWJlbD1TcGVjaWZ5IHRoZSBqb2luIGNvbHVtbnMgYmV0d2VlbiB0aGUgJXMgYW5kICVzIHRhYmxlczoKKworR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9lbnRpdHlSZWY9R2VuZXJhdGUgYSByZWZlcmVuY2UgdG8gJXMgaW4gJXMKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3Jfc2V0UmVmPUdlbmVyYXRlIGEgcmVmZXJlbmNlIHRvIGEgY29sbGVjdGlvbiBvZiAlcyBpbiAlcworR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl90YWJsZUpvaW49VGFibGUgJmpvaW46CitHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2pvaW5lZFdoZW49VGhlIHRhYmxlIHJvd3MgYXJlIGpvaW5lZCB3aGVuOlxuJXMKK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3JfZ2VuQXNzb2M9R2VuZXJhdGUgJnRoaXMgYXNzb2NpYXRpb24KK0dlbmVyYXRlRW50aXRpZXNXaXphcmRfZG9Ob3RTaG93V2FybmluZyA9IERvbid0IHNob3cgbWUgdGhpcyB3YXJuaW5nIGFnYWluCisKK3NlbGVjdENhc2NhZGVEbGdUaXRsZT1TZWxlY3QgQ2FzY2FkZQorc2VsZWN0VGFibGVEbGdUaXRsZT1UYWJsZSBTZWxlY3Rpb24KK3NlbGVjdFRhYmxlRGxnRGVzYz0mU2VsZWN0IGEgdGFibGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfZW50aXR5X3dpemFyZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9lbnRpdHlfd2l6YXJkLnByb3BlcnRpZXMKaW5kZXggNzMyYWYxOS4uOWQzMTYzMyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9lbnRpdHlfd2l6YXJkLnByb3BlcnRpZXMKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9lbnRpdHlfd2l6YXJkLnByb3BlcnRpZXMKQEAgLTE3LDIzICsxNywyNCBAQAogRU5USVRZX1BST1BFUlRJRVNfVElUTEU9RW50aXR5IFByb3BlcnRpZXMKIEVOVElUWV9QUk9QRVJUSUVTX0RFU0NSSVBUSU9OPVNldCBlbnRpdHkgbmFtZSwgdGFibGUgbmFtZSwgZmllbGRzLCBhbmQgYWNjZXNzIHR5cGUuCiBFTlRJVFk9RW50aXR5Ci1NQVBQRURfQVNfU1VQRVJDTEFTUz1NYXBwZWQgU3VwZXJjbGFzcworTUFQUEVEX0FTX1NVUEVSQ0xBU1M9TWFwcGVkIHN1cGVyY2xhc3MKIElOSEVSSVRBTkNFX0dST1VQPUluaGVyaXRhbmNlCiBJTkhFUklUQU5DRV9DSEVDS19CT1g9SW5oZXJpdGFuY2U6Ci1YTUxfU1RPUkFHRV9HUk9VUD1YTUwgRW50aXR5IE1hcHBpbmdzCitYTUxfU1RPUkFHRV9HUk9VUD1YTUwgZW50aXR5IG1hcHBpbmdzCiBYTUxfU1VQUE9SVD1BZGQgdG8gZW50aXR5IG1hcHBpbmdzIGluIFhNTAotQ0hPT1NFX1hNTD1DaG9vc2UgWE1MOgotTUFQUElOR19YTUxfVElUTEU9TWFwcGluZyBYTUwKK0NIT09TRV9YTUw9TWFwcGluZyBmaWxlOgorTUFQUElOR19YTUxfVElUTEU9TWFwcGluZyBGaWxlCiBYTUxfTkFNRV9USVRMRT1YTUwgbmFtZToKLUNIT09TRV9NQVBQSU5HX1hNTF9NRVNTQUdFPUNob29zZSBtYXBwaW5nIFhNTCBvciBjcmVhdGUgbmV3IG9uZQotSU5DT1JSRUNUX1hNTF9OQU1FPUluY29ycmVjdCBYTUwgbmFtZQorQ0hPT1NFX01BUFBJTkdfWE1MX01FU1NBR0U9Q2hvb3NlIG1hcHBpbmcgWE1MCitJTlZBTElEX1hNTF9OQU1FPVRoZSBtYXBwaW5nIGZpbGUgZG9lcyBub3QgZXhpc3QKIFRZUEVfRElBTE9HX1RJVExFPUNob29zZSBUeXBlCiBUWVBFX0RJQUxPR19ERVNDUklQVElPTj1DaG9vc2UgdGhlIHR5cGUgb2YgdGhlIGVudGl0eSBmaWVsZC4KLUVOVElUWV9OQU1FPUVudGl0eSBOYW1lOgotVEFCTEVfTkFNRV9HUk9VUD1UYWJsZSBOYW1lCi1UQUJMRV9OQU1FPVRhYmxlIE5hbWU6CitFTlRJVFlfTkFNRT1FbnRpdHkgbmFtZToKK1RBQkxFX05BTUVfR1JPVVA9VGFibGUgbmFtZQorVEFCTEVfTkFNRT1UYWJsZSBuYW1lOgogVVNFX0RFRkFVTFQ9VXNlIGRlZmF1bHQKLUVOVElUWV9GSUVMRFM9RW50aXR5IEZpZWxkcworRU5USVRZX0ZJRUxEU19HUk9VUD1FbnRpdHkgZmllbGRzCitFTlRJVFlfRklFTERTX0RJQUxPR19USVRMRT1FbnRpdHkgRmllbGRzCiBLRVk9S2V5CiBOQU1FX0NPTFVNTj1OYW1lCiBUWVBFX0NPTFVNTj1UeXBlCkBAIC00NCwxMCArNDUsMTMgQEAKIEVESVRfQlVUVE9OX0xBQkVMPUVkaXQuLi4KIFJFTU9WRV9CVVRUT05fTEFCRUw9UmVtb3ZlCiBEVVBMSUNBVEVEX0VOVElUWV9OQU1FU19NRVNTQUdFPVRoZXJlIGFyZSBkdXBsaWNhdGUgbmFtZXMgb24gY3JlYXRlZCBlbnRpdHkgZmllbGRzLiBQbGVhc2UgcmVzb2x2ZSB0aGUgZHVwbGljYXRpb24uCi1BQ0NFU1NfVFlQRT1BY2Nlc3MgVHlwZQotRklFTERfQkFTRUQ9RmllbGQtYmFzZWQKLVBST1BFUlRZX0JBU0VEPVByb3BlcnR5LWJhc2VkCitBQ0NFU1NfVFlQRT1BY2Nlc3MgdHlwZQorRklFTERfQkFTRUQ9RmllbGQKK1BST1BFUlRZX0JBU0VEPVByb3BlcnR5CiBOT19KUEFfUFJPSkVDVFM9Tm8gSlBBIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UKIEFQUExZX0NIQU5HRVNfVE9fUEVSU0lTVEVOQ0VfWE1MPUFwcGx5IGNoYW5nZXMgdG8gcGVyc2lzdGVuY2UgWE1MCiBBRERfTUFQUEVEX1NVUEVSQ0xBU1NfVE9fWE1MPUFkZCBtYXBwZWQgc3VwZXJjbGFzcyB0byBYTUwKIEFERF9FTlRJVFlfVE9fWE1MPUFkZCBlbnRpdHkgdG8gWE1MCitFbnRpdHlEYXRhTW9kZWxQcm92aWRlcl90eXBlTm90SW5Qcm9qZWN0Q2xhc3NwYXRoPScnezB9JycgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoCitFbnRpdHlEYXRhTW9kZWxQcm92aWRlcl9pbnZhbGlkUEtUeXBlPScnezB9JycgaXMgbm90IGEgdmFsaWQgc2ltcGxlIHByaW1hcnkga2V5IHR5cGUKK0VudGl0eURhdGFNb2RlbFByb3ZpZGVyX2ludmFsaWRBcmd1bWVudD1JbnZhbGlkIGFyZ3VtZW50ICcnezB9JycKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfbWFwcGluZ3MucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfbWFwcGluZ3MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcwM2YzNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX21hcHBpbmdzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSMgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKLQotQm9vbGVhbl9UcnVlPVRydWUKLUJvb2xlYW5fRmFsc2U9RmFsc2UKLU5vbmVTZWxlY3RlZD1EZWZhdWx0ICgpCi1EZWZhdWx0V2l0aG91dFZhbHVlPURlZmF1bHQgKCkKLURlZmF1bHRXaXRoVmFsdWU9RGVmYXVsdCAoezB9KQotTm9OYW1lU2V0PTxObyBuYW1lIHNldD4KLQotUGVyc2lzdGVudFR5cGVQYWdlX1VubWFwcGVkTGFiZWw9VW5tYXBwZWQKLVBlcnNpc3RlbnRUeXBlUGFnZV9FbnRpdHlMYWJlbD1FbnRpdHkKLVBlcnNpc3RlbnRUeXBlUGFnZV9FbWJlZGRhYmxlTGFiZWw9RW1iZWRkYWJsZQotUGVyc2lzdGVudFR5cGVQYWdlX01hcHBlZFN1cGVyY2xhc3NMYWJlbD1NYXBwZWQgU3VwZXJjbGFzcwotCi1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9CYXNpY0xhYmVsPUJhc2ljCi1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9JZExhYmVsPUlkCi1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9PbmVUb01hbnlMYWJlbD1PbmUgdG8gTWFueQotUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfTWFueVRvT25lTGFiZWw9TWFueSB0byBPbmUKLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX01hbnlUb01hbnlMYWJlbD1NYW55IHRvIE1hbnkKLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX1RyYW5zaWVudExhYmVsPVRyYW5zaWVudAotUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfVmVyc2lvbkxhYmVsPVZlcnNpb24KLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0VtYmVkZGVkTGFiZWw9RW1iZWRkZWQKLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0VtYmVkZGVkSWRMYWJlbD1FbWJlZGRlZCBJZAotUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfT25lVG9PbmVMYWJlbD1PbmUgdG8gT25lCi0KLUVudGl0eUNvbXBvc2l0ZV9pbmhlcml0YW5jZT1Jbmhlcml0YW5jZQotRW50aXR5Q29tcG9zaXRlX3F1ZXJpZXM9UXVlcmllcwotRW50aXR5Q29tcG9zaXRlX3RhYmxlRGVmYXVsdD1EZWZhdWx0ICh7MH0pCi1FbnRpdHlDb21wb3NpdGVfdGFibGVOb0RlZmF1bHRTcGVjaWZpZWQ9RGVmYXVsdCAoKQotCi1FbnRpdHlHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi1FbnRpdHlHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdEVtcHR5PURlZmF1bHQgKCkKLUVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWU9TmFtZToKLQotRW50aXR5TmFtZUNvbXBvc2l0ZV9uYW1lPU5hbWU6Ci0KLUJhc2ljR2VuZXJhbFNlY3Rpb25fbmFtZT1OYW1lOgotQmFzaWNHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdD1EZWZhdWx0ICh7MH0pCi1CYXNpY0dlbmVyYWxTZWN0aW9uX2ZldGNoTGFiZWw9RmV0Y2g6Ci1CYXNpY0dlbmVyYWxTZWN0aW9uX29wdGlvbmFsTGFiZWw9T3B0aW9uYWwKLUJhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbERlZmF1bHQ9T3B0aW9uYWwgKHswfSkKLUJhc2ljR2VuZXJhbFNlY3Rpb25fbG9iTGFiZWw9TG9iCi1CYXNpY0dlbmVyYWxTZWN0aW9uX3RlbXBvcmFsTGFiZWw9VGVtcG9yYWw6Ci1CYXNpY0dlbmVyYWxTZWN0aW9uX2VudW1lcmF0ZWRMYWJlbD1FbnVtZXJhdGVkOgotCi1EZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlcl9EZWZhdWx0PURlZmF1bHQgKHswfSkKLURlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX0RlZmF1bHQ9RGVmYXVsdCAoezB9KQotCi1UYWJsZUNob29zZXJfbGFiZWw9TmFtZToKLUNhdGFsb2dDaG9vc2VyX2xhYmVsPUNhdGFsb2c6Ci1TY2hlbWFDaG9vc2VyX2xhYmVsPVNjaGVtYToKLVRhYmxlQ29tcG9zaXRlX3RhYmxlU2VjdGlvbj1UYWJsZQotVGFibGVDb21wb3NpdGVfZGVmYXVsdEVtcHR5PURlZmF1bHQgKCkKLVRhYmxlQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW09RGVmYXVsdCAoezB9KQotCi1UYXJnZXRFbnRpdHlDaG9vc2VyX2xhYmVsPVRhcmdldCBFbnRpdHk6Ci1UYXJnZXRFbnRpdHlDaG9vc2VyX2RlZmF1bHRFbXB0eT1EZWZhdWx0ICgpCi1UYXJnZXRFbnRpdHlDaG9vc2VyX2RlZmF1bHRXaXRoT25lUGFyYW09RGVmYXVsdCAoezB9KQotVGFyZ2V0RW50aXR5Q2hvb3Nlcl9icm93c2U9QnJvd3NlLi4uCi1UYXJnZXRFbnRpdHlDaG9vc2VyX3NlbGVjdFR5cGVUaXRsZT1TZWxlY3QgVHlwZQotCi1Ob25Pd25pbmdNYXBwaW5nX21hcHBlZEJ5TGFiZWw9TWFwcGVkIEJ5OgotCi1JZENsYXNzQ29tcG9zaXRlX2xhYmVsPVByaW1hcnkgS2V5IENsYXNzOgotCi1Kb2luVGFibGVDb21wb3NpdGVfYWRkPUFkZC4uLgotSm9pblRhYmxlQ29tcG9zaXRlX2RlZmF1bHRFbXB0eT1EZWZhdWx0ICgpCi1Kb2luVGFibGVDb21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi1Kb2luVGFibGVDb21wb3NpdGVfZWRpdD1FZGl0Li4uCi1Kb2luVGFibGVDb21wb3NpdGVfaW52ZXJzZUpvaW5Db2x1bW49SW52ZXJzZSBKb2luIENvbHVtbnMKLQotSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdD1EZWZhdWx0ICh7MH0gLT4gezF9KQotSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0PURlZmF1bHQgKHswfSkgLT4gezF9Ci1Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0PXswfSAtPiBEZWZhdWx0ICh7MX0pCi1Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdD1EZWZhdWx0ICh7MH0pIC0+IERlZmF1bHQgKHsxfSkKLUpvaW5UYWJsZUNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtcz17MH0gLT4gezF9Ci1Kb2luVGFibGVDb21wb3NpdGVfam9pbkNvbHVtbj1Kb2luIENvbHVtbnMKLUpvaW5UYWJsZUNvbXBvc2l0ZV9uYW1lPU5hbWU6Ci1Kb2luVGFibGVDb21wb3NpdGVfcmVtb3ZlPVJlbW92ZQotSm9pblRhYmxlQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zPU92ZXJyaWRlIERlZmF1bHQKLUpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnM9T3ZlcnJpZGUgRGVmYXVsdAotCi1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfZ2VuZXJhbD1HZW5lcmFsCi1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfam9pblRhYmxlPUpvaW4gVGFibGUKLU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV90YXJnZXRFbnRpdHk9VGFyZ2V0IEVudGl0eToKLU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9jYXNjYWRlVHlwZT1DYXNjYWRlIFR5cGU6Ci1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfZmV0Y2hUeXBlPUZldGNoIFR5cGU6Ci1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfbWFwcGVkQnk9TWFwcGVkIEJ5OgotCi1Db2x1bW5Db21wb3NpdGVfY29sdW1uRGVmaW5pdGlvbj1Db2x1bW4gRGVmaW5pdGlvbjoKLUNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5TZWN0aW9uPUNvbHVtbgotQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW09RGVmYXVsdCAoezB9KQotQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eT1EZWZhdWx0KCkKLUNvbHVtbkNvbXBvc2l0ZV9kZXRhaWxzPURldGFpbHMKLUNvbHVtbkNvbXBvc2l0ZV9pbnNlcnRhYmxlPUluc2VydGFibGUKLUNvbHVtbkNvbXBvc2l0ZV9pbnNlcnRhYmxlV2l0aERlZmF1bHQ9SW5zZXJ0YWJsZSAoezB9KQotQ29sdW1uQ29tcG9zaXRlX2xlbmd0aD1MZW5ndGg6Ci1Db2x1bW5Db21wb3NpdGVfbmFtZT1OYW1lOgotQ29sdW1uQ29tcG9zaXRlX251bGxhYmxlPU51bGxhYmxlCi1Db2x1bW5Db21wb3NpdGVfbnVsbGFibGVXaXRoRGVmYXVsdD1OdWxsYWJsZSAoezB9KQotQ29sdW1uQ29tcG9zaXRlX3ByZWNpc2lvbj1QcmVjaXNpb246Ci1Db2x1bW5Db21wb3NpdGVfc2NhbGU9U2NhbGU6Ci1Db2x1bW5Db21wb3NpdGVfdGFibGU9VGFibGU6Ci1Db2x1bW5Db21wb3NpdGVfdW5pcXVlPVVuaXF1ZQotQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZVdpdGhEZWZhdWx0PVVuaXF1ZSAoezB9KQotQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZT1VcGRhdGFibGUKLUNvbHVtbkNvbXBvc2l0ZV91cGRhdGFibGVXaXRoRGVmYXVsdD1VcGRhdGFibGUgKHswfSkKLQotSm9pbkNvbHVtbkNvbXBvc2l0ZV9qb2luQ29sdW1uPUpvaW4gQ29sdW1ucwotSm9pbkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk9RGVmYXVsdCgpCi1Kb2luQ29sdW1uQ29tcG9zaXRlX25hbWU9TmFtZToKLUpvaW5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi1Kb2luQ29sdW1uQ29tcG9zaXRlX2FkZD1BZGQuLi4KLUpvaW5Db2x1bW5Db21wb3NpdGVfZWRpdD1FZGl0Li4uCi1Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zPXswfSAtPiB7MX0KLUpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0PURlZmF1bHQgKHswfSAtPiB7MX0pCi1Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiBEZWZhdWx0ICh7MX0pCi1Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0PURlZmF1bHQgKHswfSkgLT4gezF9Ci1Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdD17MH0gLT4gRGVmYXVsdCAoezF9KQotSm9pbkNvbHVtbkNvbXBvc2l0ZV9yZW1vdmU9UmVtb3ZlCi1Kb2luQ29sdW1uQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zPU92ZXJyaWRlIERlZmF1bHQKLQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucz1PdmVycmlkZSBEZWZhdWx0Ci1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZWRpdD1FZGl0Li4uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZGVmYXVsdEVtcHR5PURlZmF1bHQoKQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW09RGVmYXVsdCAoezB9KQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX3ByaW1hcnlLZXlKb2luQ29sdW1uPVByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucwotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zPXswfSAtPiB7MX0KLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQ9RGVmYXVsdCAoezB9IC0+IHsxfSkKLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0PURlZmF1bHQgKHswfSkgLT4gRGVmYXVsdCAoezF9KQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0PURlZmF1bHQgKHswfSkgLT4gezF9Ci1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0PXswfSAtPiBEZWZhdWx0ICh7MX0pCi0KLUpvaW5Db2x1bW5EaWFsb2dfYWRkSm9pbkNvbHVtbkRlc2NyaXB0aW9uVGl0bGU9Q3JlYXRlIE5ldyBKb2luIENvbHVtbgotSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uVGl0bGU9QWRkIEpvaW4gQ29sdW1uCi1Kb2luQ29sdW1uRGlhbG9nX2Rlc2NyaXB0aW9uPVNwZWNpZnkgYSBtYXBwZWQgY29sdW1uIGZvciBqb2luaW5nIGFuIGVudGl0eSBhc3NvY2lhdGlvbi4KLUpvaW5Db2x1bW5EaWFsb2dfZWRpdEpvaW5Db2x1bW5EZXNjcmlwdGlvblRpdGxlPUVkaXQgSm9pbiBDb2x1bW4KLUpvaW5Db2x1bW5EaWFsb2dfZWRpdEpvaW5Db2x1bW5UaXRsZT1FZGl0IEpvaW4gQ29sdW1uCi1Kb2luQ29sdW1uRGlhbG9nX25hbWU9Jk5hbWU6Ci1Kb2luQ29sdW1uRGlhbG9nX3JlZmVyZW5jZWRDb2x1bW5OYW1lPSZSZWZlcmVuY2VkIENvbHVtbiBOYW1lOgotCi1Kb2luQ29sdW1uRGlhbG9nUGFuZV9jb2x1bW5EZWZpbml0aW9uPSZDb2x1bW4gRGVmaW5pdGlvbjoKLUpvaW5Db2x1bW5EaWFsb2dQYW5lX2RlZmF1bHRFbXB0eT1EZWZhdWx0ICgpCi1Kb2luQ29sdW1uRGlhbG9nUGFuZV9kZWZhdWx0V2l0aE9uZVBhcmFtPURlZmF1bHQgKHswfSkKLUpvaW5Db2x1bW5EaWFsb2dQYW5lX2luc2VydGFibGU9Jkluc2VydGFibGUKLUpvaW5Db2x1bW5EaWFsb2dQYW5lX2luc2VydGFibGVXaXRoRGVmYXVsdD0mSW5zZXJ0YWJsZSAoezB9KQotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfbnVsbGFibGU9Jk51bGxhYmxlCi1Kb2luQ29sdW1uRGlhbG9nUGFuZV9udWxsYWJsZVdpdGhEZWZhdWx0PSZOdWxsYWJsZSAoezB9KQotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdGFibGU9JlRhYmxlOgotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdW5pcXVlPSZVbmlxdWUKLUpvaW5Db2x1bW5EaWFsb2dQYW5lX3VuaXF1ZVdpdGhEZWZhdWx0PSZVbmlxdWUgKHswfSkKLUpvaW5Db2x1bW5EaWFsb2dQYW5lX3VwZGF0YWJsZT0mVXBkYXRhYmxlCi1Kb2luQ29sdW1uRGlhbG9nUGFuZV91cGRhdGFibGVXaXRoRGVmYXVsdD0mVXBkYXRhYmxlICh7MH0pCi0KLUludmVyc2VKb2luQ29sdW1uRGlhbG9nX2VkaXRJbnZlcnNlSm9pbkNvbHVtblRpdGxlPUVkaXQgSW52ZXJzZSBKb2luIENvbHVtbgotCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfYWRkRGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgTmV3IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfYWRkVGl0bGU9QWRkIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdERlc2NyaXB0aW9uVGl0bGU9RWRpdCBQcmltYXJ5IEtleSBKb2luIENvbHVtbgotUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2VkaXRUaXRsZT1FZGl0IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi0KLVByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2FkZERlc2NyaXB0aW9uVGl0bGU9Q3JlYXRlIE5ldyBQcmltYXJ5IEtleSBKb2luIENvbHVtbgotUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfYWRkVGl0bGU9QWRkIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZT1FZGl0IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19lZGl0VGl0bGU9RWRpdCBQcmltYXJ5IEtleSBKb2luIENvbHVtbgotCi1BdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGVfYXR0cmlidXRlT3ZlcnJpZGVzPUF0dHJpYnV0ZSBPdmVycmlkZXMKLUF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHQ9T3ZlcnJpZGUgRGVmYXVsdAotCi1PdmVycmlkZXNDb21wb3NpdGVfYXNzb2NpYXRpb249QXNzb2NpYXRpb24gT3ZlcnJpZGUKLU92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGU9QXR0cmlidXRlIE92ZXJyaWRlCi1PdmVycmlkZXNDb21wb3NpdGVfbm9OYW1lPTxOYW1lIG5vdCBzZXQ+Ci1PdmVycmlkZXNDb21wb3NpdGVfam9pbkNvbHVtbj1Kb2luIENvbHVtbnMKLQotQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZV9jaGFyPUNoYXJhY3RlcgotSW5oZXJpdGFuY2VDb21wb3NpdGVfZGV0YWlsc0dyb3VwQm94PURldGFpbHMKLUluaGVyaXRhbmNlQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JDb2x1bW5Hcm91cEJveD1EaXNjcmltaW5hdG9yIENvbHVtbgotSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlPURpc2NyaW1pbmF0b3IgVmFsdWU6Ci1BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX2ludGVnZXI9SW50ZWdlcgotQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZV9qb2luZWQ9Sm9pbmVkCi1BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX3NpbmdsZV90YWJsZT1TaW5nbGUgVGFibGUKLUluaGVyaXRhbmNlQ29tcG9zaXRlX3N0cmF0ZWd5PVN0cmF0ZWd5OgotQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZV9zdHJpbmc9U3RyaW5nCi1BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX3RhYmxlX3Blcl9jbGFzcz1UYWJsZSBQZXIgQ2xhc3MKLQotRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk9RGVmYXVsdCg8cHJvdmlkZXItc3BlY2lmaWM+KQotRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yVHlwZT1UeXBlOgotRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9uYW1lPU5hbWU6Ci0KLUlkTWFwcGluZ0NvbXBvc2l0ZV9wa19nZW5lcmF0aW9uPVBLIEdlbmVyYXRpb24KLUlkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvbj1QcmltYXJ5IEtleSBHZW5lcmF0aW9uCi1JZE1hcHBpbmdDb21wb3NpdGVfdGFibGVHZW5lcmF0b3I9VGFibGUgR2VuZXJhdG9yCi1JZE1hcHBpbmdDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3I9U2VxdWVuY2UgR2VuZXJhdG9yCi0KLUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2dlbmVyYXRlZFZhbHVlPUdlbmVyYXRlZCBWYWx1ZQotR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfZ2VuZXJhdG9yTmFtZT1HZW5lcmF0b3IgTmFtZToKLUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX3N0cmF0ZWd5PVN0cmF0ZWd5OgotR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfYXV0bz1BdXRvCi1HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9pZGVudGl0eT1JZGVudGl0eQotR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfc2VxdWVuY2U9U2VxdWVuY2UKLUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX3RhYmxlPVRhYmxlCi0KLVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yPVNlcXVlbmNlIEdlbmVyYXRvcgotU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfbmFtZT1OYW1lOgotU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2U9U2VxdWVuY2U6Ci1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0PURlZmF1bHQKLQotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfY2F0YWxvZz1DYXRhbG9nOgotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfZGVmYXVsdD1EZWZhdWx0Ci1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9uYW1lPU5hbWU6Ci1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtbj1QcmltYXJ5IEtleSBDb2x1bW46Ci1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlPVByaW1hcnkgS2V5IENvbHVtbiBWYWx1ZToKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3NjaGVtYT1TY2hlbWE6Ci1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV90YWJsZT1UYWJsZToKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yPVRhYmxlIEdlbmVyYXRvcgotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdmFsdWVDb2x1bW49VmFsdWUgQ29sdW1uOgotCi1HZW5lcmF0b3JDb21wb3NpdGVfYWxsb2NhdGlvblNpemU9QWxsb2NhdGlvbiBTaXplOgotR2VuZXJhdG9yQ29tcG9zaXRlX2luaXRpYWxWYWx1ZT1Jbml0aWFsIFZhbHVlOgotCi1PcmRlckJ5Q29tcG9zaXRlX29yZGVyQnlHcm91cD1PcmRlciBCeQotT3JkZXJCeUNvbXBvc2l0ZV9vcmRlckJ5TGFiZWw9T3JkZXIgQnk6Ci1PcmRlckJ5Q29tcG9zaXRlX25vT3JkZXJpbmc9Tm8gT3JkZXJpbmcKLU9yZGVyQnlDb21wb3NpdGVfcHJpbWFyeUtleU9yZGVyaW5nPVByaW1hcnkgS2V5IE9yZGVyaW5nCi1PcmRlckJ5Q29tcG9zaXRlX2N1c3RvbU9yZGVyaW5nPUN1c3RvbSBPcmRlcmluZwotCi1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfc2Vjb25kYXJ5VGFibGVzPVNlY29uZGFyeSBUYWJsZXMKLVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9lZGl0PUVkaXQuLi4KLQotU2Vjb25kYXJ5VGFibGVEaWFsb2dfYWRkU2Vjb25kYXJ5VGFibGU9QWRkIFNlY29uZGFyeSBUYWJsZQotU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdFNlY29uZGFyeVRhYmxlPUVkaXQgU2Vjb25kYXJ5IFRhYmxlCi1TZWNvbmRhcnlUYWJsZURpYWxvZ19uYW1lPU5hbWU6Ci1TZWNvbmRhcnlUYWJsZURpYWxvZ19jYXRhbG9nPUNhdGFsb2c6Ci1TZWNvbmRhcnlUYWJsZURpYWxvZ19zY2hlbWE9U2NoZW1hOgotU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdFNjaGVtYT1EZWZhdWx0ICh7MH0pCi1TZWNvbmRhcnlUYWJsZURpYWxvZ19kZWZhdWx0Q2F0YWxvZz1EZWZhdWx0ICh7MH0pCi0KLUFjY2Vzc1R5cGVDb21ib19kZWZhdWx0PURlZmF1bHQKLU1ldGFEYXRhQ29tcGxldGVDb21ib19EZWZhdWx0PURlZmF1bHQgKHswfSkKLQotT3B0aW9uYWxDb21wb3NpdGVfZmFsc2U9RmFsc2UKLU9wdGlvbmFsQ29tcG9zaXRlX3RydWU9VHJ1ZQotCi1FbnVtVHlwZUNvbXBvc2l0ZV9vcmRpbmFsPU9yZGluYWwKLUVudW1UeXBlQ29tcG9zaXRlX3N0cmluZz1TdHJpbmcKLQotRmV0Y2hUeXBlQ29tcG9zaXRlX2VhZ2VyPUVhZ2VyCi1GZXRjaFR5cGVDb21wb3NpdGVfbGF6eT1MYXp5Ci0KLVRlbXBvcmFsVHlwZUNvbXBvc2l0ZV9kYXRlPURhdGUKLVRlbXBvcmFsVHlwZUNvbXBvc2l0ZV90aW1lPVRpbWUKLVRlbXBvcmFsVHlwZUNvbXBvc2l0ZV90aW1lc3RhbXA9VGltZXN0YW1wCi0KLUNhc2NhZGVDb21wb3NpdGVfYWxsPUFsbAotQ2FzY2FkZUNvbXBvc2l0ZV9jYXNjYWRlVGl0bGU9Q2FzY2FkZQotQ2FzY2FkZUNvbXBvc2l0ZV9tZXJnZT1NZXJnZQotQ2FzY2FkZUNvbXBvc2l0ZV9wZXJzaXN0PVBlcnNpc3QKLUNhc2NhZGVDb21wb3NpdGVfcmVmcmVzaD1SZWZyZXNoCi1DYXNjYWRlQ29tcG9zaXRlX3JlbW92ZT1SZW1vdmUKLQotUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZFF1ZXJ5PUFkZC4uLgotUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZFF1ZXJ5RGVzY3JpcHRpb249Q3JlYXRlIGEgbmV3IHF1ZXJ5LCB3aGljaCBzZWFyY2hlcyBhZ2FpbnN0IHBlcnNpc3RlbnQgZW50aXRpZXMgaW5kZXBlbmRlbnQgb2YgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIHN0b3JlIHRob3NlIGVudGl0aWVzLgotUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZFF1ZXJ5RGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgbmV3IG5hbWVkIHF1ZXJ5Ci1RdWVyaWVzQ29tcG9zaXRlX2FkZE5hbWVkUXVlcnlUaXRsZT1OZXcgTmFtZWQgUXVlcnkKLVF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWROYXRpdmVRdWVyeT1BZGQgTmF0aXZlLi4uCi1RdWVyaWVzQ29tcG9zaXRlX2FkZE5hbWVkTmF0aXZlUXVlcnlEZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgbmF0aXZlIHF1ZXJ5LCB0aGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byB1dGlsaXplIGRhdGFiYXNlIHNwZWNpZmljIGZlYXR1cmVzLgotUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZE5hdGl2ZVF1ZXJ5RGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgbmV3IG5hbWVkIG5hdGl2ZSBxdWVyeQotUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZE5hdGl2ZVF1ZXJ5VGl0bGU9TmV3IE5hbWVkIE5hdGl2ZSBRdWVyeQotUXVlcmllc0NvbXBvc2l0ZV9kaXNwbGF5U3RyaW5nPTxOYW1lIG5vdCBzZXQ+IHswfQotUXVlcmllc0NvbXBvc2l0ZV9lZGl0PUVkaXQuLi4KLVF1ZXJpZXNDb21wb3NpdGVfZWRpdE5hbWVkTmF0aXZlUXVlcnlUaXRsZT1FZGl0IE5hbWVkIE5hdGl2ZSBRdWVyeQotUXVlcmllc0NvbXBvc2l0ZV9lZGl0TmFtZWROYXRpdmVRdWVyeURlc2NyaXB0aW9uPUVkaXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIG5hdGl2ZSBxdWVyeS4KLVF1ZXJpZXNDb21wb3NpdGVfZWRpdE5hbWVkTmF0aXZlUXVlcnlEZXNjcmlwdGlvblRpdGxlPUVkaXQgbmFtZWQgbmF0aXZlIHF1ZXJ5Ci1RdWVyaWVzQ29tcG9zaXRlX2VkaXROYW1lZFF1ZXJ5VGl0bGU9RWRpdCBOYW1lZCBRdWVyeQotUXVlcmllc0NvbXBvc2l0ZV9lZGl0TmFtZWRRdWVyeURlc2NyaXB0aW9uPUVkaXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIHF1ZXJ5LgotUXVlcmllc0NvbXBvc2l0ZV9lZGl0TmFtZWRRdWVyeURlc2NyaXB0aW9uVGl0bGU9RWRpdCBuYW1lZCBxdWVyeQotUXVlcmllc0NvbXBvc2l0ZV9sYWJlbD0mTmFtZToKLQotTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5PVF1ZXJ5OgotTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5SGludHNHcm91cEJveD1RdWVyeSBIaW50cwotTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3Jlc3VsdENsYXNzPVJlc3VsdCBDbGFzczoKLQotTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5PVF1ZXJ5OgotTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5SGludHNHcm91cEJveD1RdWVyeSBIaW50cwotCi1OZXdOYW1lU3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZD1BIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuCi1OZXdOYW1lU3RhdGVPYmplY3RfbmFtZUFscmVhZHlFeGlzdHM9QSBxdWVyeSB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLQotUXVlcnlIaW50c0NvbXBvc2l0ZV9uYW1lQ29sdW1uPU5hbWUKLVF1ZXJ5SGludHNDb21wb3NpdGVfdmFsdWVDb2x1bW49VmFsdWUKLQotT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX2RlZmluZUluWG1sPURlZmluZSBpbiBYTUwKLQotTnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPVVubWFwcGVkCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX29ybS5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9vcm0ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmNDFlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX29ybS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSMgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKLQotQWNjZXNzVHlwZUNvbXBvc2l0ZV9hY2Nlc3M9QWNjZXNzOgotQWNjZXNzVHlwZUNvbXBvc2l0ZV9maWVsZD1GaWVsZAotQWNjZXNzVHlwZUNvbXBvc2l0ZV9wcm9wZXJ0eT1Qcm9wZXJ0eQotQm9vbGVhbl9GYWxzZT1GYWxzZQotQm9vbGVhbl9UcnVlPVRydWUKLUVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfYWNjZXNzPUFjY2VzczoKLUVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfY2F0YWxvZz1DYXRhbG9nOgotRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9maWVsZD1GaWVsZAotRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9wYWNrYWdlPVBhY2thZ2UKLUVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfcHJvcGVydHk9UHJvcGVydHkKLUVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2Vfc2NoZW1hPVNjaGVtYToKLUVudGl0eU1hcHBpbmdzUGFnZV9jYXRhbG9nRGVmYXVsdD1EZWZhdWx0ICh7MH0KLUVudGl0eU1hcHBpbmdzUGFnZV9jYXRhbG9nTm9EZWZhdWx0U3BlY2lmaWVkPURlZmF1bHQKLUVudGl0eU1hcHBpbmdzUGFnZV9zY2hlbWFEZWZhdWx0PURlZmF1bHQgKHswfSkKLUVudGl0eU1hcHBpbmdzUGFnZV9zY2hlbWFOb0RlZmF1bHRTcGVjaWZpZWQ9RGVmYXVsdAotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRUYWJsZUdlbmVyYXRvcj1BZGQgVGFibGUuLi4KLU9ybUdlbmVyYXRvcnNDb21wb3NpdGVfYWRkVGFibGVHZW5lcmF0b3JEZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgdGFibGUgZ2VuZXJhdG9yLCBhIHRhYmxlIGdlbmVyYXRvciBkZWZpbmVzIGEgcHJpbWFyeSBrZXkgZ2VuZXJhdG9yIHRoYXQgbWF5IGJlIHJlZmVyZW5jZWQgYnkgbmFtZSB3aGVuIGEgZ2VuZXJhdG9yIGVsZW1lbnQgaXMgc3BlY2lmaWVkLgotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRUYWJsZUdlbmVyYXRvckRlc2NyaXB0aW9uVGl0bGU9Q3JlYXRlIG5ldyB0YWJsZSBnZW5lcmF0b3IKLU9ybUdlbmVyYXRvcnNDb21wb3NpdGVfYWRkVGFibGVHZW5lcmF0b3JUaXRsZT1OZXcgVGFibGUgR2VuZXJhdG9yCi1Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2FkZFNlcXVlbmNlR2VuZXJhdG9yPUFkZCBTZXF1ZW5jZS4uLgotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRTZXF1ZW5jZUdlbmVyYXRvckRlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBzZXF1ZW5jZSBnZW5lcmF0b3IsIGEgc2VxdWVuY2UgZ2VuZXJhdG9yIGRlZmluZXMgYSBwcmltYXJ5IGtleSBnZW5lcmF0b3IgdGhhdCBtYXkgYmUgcmVmZXJlbmNlZCBieSBuYW1lIHdoZW4gYSBnZW5lcmF0b3IgZWxlbWVudCBpcyBzcGVjaWZpZWQuCi1Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2FkZFNlcXVlbmNlR2VuZXJhdG9yRGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgbmV3IHNlcXVlbmNlIGdlbmVyYXRvcgotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRTZXF1ZW5jZUdlbmVyYXRvclRpdGxlPU5ldyBTZXF1ZW5jZSBHZW5lcmF0b3IKLU9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZGlzcGxheVN0cmluZz08TmFtZSBub3Qgc2V0PiB7MH0KLU9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZWRpdD1FZGl0Li4uCi1Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXRTZXF1ZW5jZUdlbmVyYXRvclRpdGxlPUVkaXQgU2VxdWVuY2UgR2VuZXJhdG9yCi1Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXRTZXF1ZW5jZUdlbmVyYXRvckRlc2NyaXB0aW9uPUVkaXQgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGdlbmVyYXRvci4KLU9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZWRpdFNlcXVlbmNlR2VuZXJhdG9yRGVzY3JpcHRpb25UaXRsZT1FZGl0IHNlcXVlbmNlIGdlbmVyYXRvcgotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0VGFibGVHZW5lcmF0b3JUaXRsZT1FZGl0IFRhYmxlIEdlbmVyYXRvcgotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0VGFibGVHZW5lcmF0b3JEZXNjcmlwdGlvbj1FZGl0IHRoZSBuYW1lIG9mIHRoZSB0YWJsZSBnZW5lcmF0b3IuCi1Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXRUYWJsZUdlbmVyYXRvckRlc2NyaXB0aW9uVGl0bGU9RWRpdCBuYW1lZCB0YWJsZSBnZW5lcmF0b3IKLU9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZ3JvdXBCb3g9R2VuZXJhdG9ycwotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9sYWJlbD0mTmFtZToKLU9ybUphdmFBdHRyaWJ1dGVDaG9vc2VyX2phdmFBdHRyaWJ1dGU9SmF2YSBBdHRyaWJ1dGU6Ci1Pcm1KYXZhQ2xhc3NDaG9vc2VyX2phdmFDbGFzcz1KYXZhIENsYXNzOgotT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZV9tZXRhZGF0YUNvbXBsZXRlPU1ldGFkYXRhIENvbXBsZXRlCi1Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlX21ldGFkYXRhQ29tcGxldGVXaXRoRGVmYXVsdD1NZXRhZGF0YSBDb21wbGV0ZSAoezB9KQotT3JtUXVlcmllc0NvbXBvc2l0ZV9ncm91cEJveD1RdWVyaWVzCi1Pcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zZXF1ZW5jZT1TZXF1ZW5jZToKLU9ybVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU9TmFtZToKLU9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU9TmFtZToKLU9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlPVRhYmxlOgotT3JtVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdGFibGVHZW5lcmF0b3I9VGFibGUgR2VuZXJhdG9yCi1Pcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtbj1QcmltYXJ5IEtleSBDb2x1bW46Ci1Pcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV92YWx1ZUNvbHVtbj1WYWx1ZSBDb2x1bW46Ci1Pcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlPVByaW1hcnkgS2V5IENvbHVtbiBWYWx1ZToKLU9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQ9RGVmYXVsdAotUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfYWNjZXNzPUFjY2VzczoKLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2Nhc2NhZGVQZXJzaXN0Q2hlY2tCb3g9Q2FzY2FkZSBQZXJzaXN0Ci1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9jYXRhbG9nPUNhdGFsb2c6Ci1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9maWVsZD1GaWVsZAotUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfcGVyc2lzdGVuY2VVbml0U2VjdGlvbj1QZXJzaXN0ZW5jZSBVbml0Ci1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9wcm9wZXJ0eT1Qcm9wZXJ0eQotUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfc2NoZW1hPVNjaGVtYToKLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3g9WE1MIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGUKLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbl9jYXRhbG9nRGVmYXVsdD1EZWZhdWx0ICh7MH0pCi1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb25fc2NoZW1hRGVmYXVsdD1EZWZhdWx0ICh7MH0pCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX3BlcnNpc3RlbmNlLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX3BlcnNpc3RlbmNlLnByb3BlcnRpZXMKaW5kZXggYTRkY2IxYy4uYTU0YWI2ZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9wZXJzaXN0ZW5jZS5wcm9wZXJ0aWVzCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfcGVyc2lzdGVuY2UucHJvcGVydGllcwpAQCAtMSwyMiArMSwyNSBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSMgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgogIyAKICMgQ29udHJpYnV0b3JzOgogIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogQm9vbGVhbl9GYWxzZT1GYWxzZQogQm9vbGVhbl9UcnVlPVRydWUKIAorQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2dfamFyUGF0aEhlbHBMYWJlbD1UaGUgY29ycmVjdCBwYXRoIHRvIHRoZSBKQVIgZmlsZSBzZWxlY3RlZCB3aWxsIHZhcnkgb24geW91ciBkZXBsb3ltZW50IGVudmlyb25tZW50LiAgWW91IG1heSBhbHRlciBpdCBoZXJlIHRvIGNvcnJlY3RseSByZWZsZWN0IHlvdXIgcGFydGljdWxhciBlbnZpcm9ubWVudC4KK0FyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nX2phclBhdGhMYWJlbD1KQVIgZmlsZSBwYXRoOgorCiBQZXJzaXN0ZW5jZUVkaXRvcl9wYWdlX2hlbHA9SGVscAogUGVyc2lzdGVuY2VFZGl0b3Jfc291cmNlVGFiPVNvdXJjZQogCiBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX2Rlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIGxpc3Qgb2YgY2xhc3NlcyB0byBiZSBtYW5hZ2VkIGluIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KLVBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlcz1FeGNsdWRlIFVubGlzdGVkIENsYXNzZXMKLVBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlc1dpdGhEZWZhdWx0PUV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlcyAoezB9KQorUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzPUV4Y2x1ZGUgdW5saXN0ZWQgY2xhc3NlcworUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzV2l0aERlZmF1bHQ9RXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzICh7MH0pCiBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX21hcHBlZENsYXNzZXNOb05hbWU9PG5hbWUgbm90IHNldD4KIFBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfb3Blbj1PcGVuCiAKQEAgLTI4LDIwICszMSwyNCBAQAogUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZV9kYXRhYmFzZT1EYXRhYmFzZQogUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZV9nZW5lcmFsPUdlbmVyYWwKIAotUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlX2p0YURhdGFzb3VyY2VOYW1lPUpUQSBEYXRhIFNvdXJjZSBOYW1lOgotUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlX25vbkp0YURhdGFzb3VyY2VOYW1lPU5vbi1KVEEgRGF0YSBTb3VyY2UgTmFtZToKK1BlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZV9qdGFEYXRhc291cmNlTmFtZT1KVEEgZGF0YSBzb3VyY2UgbmFtZToKK1BlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZV9ub25KdGFEYXRhc291cmNlTmFtZT1Ob24tSlRBIGRhdGEgc291cmNlIG5hbWU6CiAKLVBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX3RyYW5zYWN0aW9uVHlwZT1UcmFuc2FjdGlvbiBUeXBlOgorUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGVfdHJhbnNhY3Rpb25UeXBlPVRyYW5zYWN0aW9uIHR5cGU6CiAKIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfZ2VuZXJhbD1HZW5lcmFsCi1QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2phdmFBcmNoaXZlcz1KYXZhIEFyY2hpdmVzCitQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2phckZpbGVzPUpBUiBGaWxlcwogUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qcGFNYXBwaW5nRGVzY3JpcHRvcnM9WE1MIE1hcHBpbmcgRmlsZXMKIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfanBhTWFwcGluZ0Rlc2NyaXB0b3JzX2Rlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIFhNTCBtYXBwaW5nIGZpbGVzIGZvciB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCiBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX21hcHBlZENsYXNzZXM9TWFuYWdlZCBDbGFzc2VzCiBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX25hbWU9TmFtZToKLVBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfcGVyc2lzdGVuY2VQcm92aWRlcj1QZXJzaXN0ZW5jZSBQcm92aWRlcjoKK1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfcGVyc2lzdGVuY2VQcm92aWRlcj1QZXJzaXN0ZW5jZSBwcm92aWRlcjoKIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfZGVzY3JpcHRpb249RGVzY3JpcHRpb246CiAKK1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlX25vRmlsZU5hbWU9PEZpbGUgbmFtZSBub3Qgc2V0PgorUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX2phckZpbGVEaWFsb2dfdGl0bGU9SkFSIEZpbGUgU2VsZWN0aW9uCitQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfamFyRmlsZURpYWxvZ19tZXNzYWdlPUNob29zZSBhIEpBUiBmaWxlIHRvIGJlIGFkZGVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgorCiBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfbWFwcGluZ0ZpbGVEaWFsb2dfbWVzc2FnZT1DaG9vc2UgdGhlIFhNTCBtYXBwaW5nIGZpbGVzIHRvIGJlIGFkZGVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgogUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX21hcHBpbmdGaWxlRGlhbG9nX3RpdGxlPUpQQSBYTUwgTWFwcGluZyBGaWxlIFNlbGVjdGlvbgogUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX29ybU5vTmFtZT08bmFtZSBub3Qgc2V0PgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9wZXJzaXN0ZW5jZTJfMC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9wZXJzaXN0ZW5jZTJfMC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzZjYzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX3BlcnNpc3RlbmNlMl8wLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1OCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisjIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0RhdGFiYXNlX0dyb3VwQm94ID0gRGF0YWJhc2UKKworRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGVfanRhRGF0YVNvdXJjZUxhYmVsID0gSlRBIGRhdGEgc291cmNlOgorRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGVfbm9uSnRhRGF0YVNvdXJjZUxhYmVsID0gTm9uLUpUQSBkYXRhIHNvdXJjZToKKworR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGVfc2VjdGlvblRpdGxlID0gUGVyc2lzdGVuY2UgVW5pdCBDb25uZWN0aW9uCitHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvbkNvbXBvc2l0ZV9zZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIGRhdGEgc291cmNlIG9yIEpEQkMgY29ubmVjdGlvbiBwcm9wZXJ0aWVzLgorCitKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19NZXNzYWdlID0gJkVudGVyIGNvbm5lY3Rpb24gbmFtZSBvciBwYXR0ZXJuICgqLCA/LCBvciBjYW1lbCBjYXNlKToKK0pkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX1RpdGxlID0gQ29ubmVjdGlvbiBTZWxlY3Rpb24KK0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uVGFiX3RpdGxlID0gQ29ubmVjdGlvbgorCitHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc0NvbXBvc2l0ZV9taXNjZWxsYW5lb3VzU2VjdGlvblRpdGxlID0gTWlzY2VsbGFuZW91cyBPcHRpb25zCitHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc0NvbXBvc2l0ZV9taXNjZWxsYW5lb3VzU2VjdGlvbkRlc2NyaXB0aW9uID0gQ29uZmlndXJlIHRoZSBtaXNjZWxsYW5lb3VzIG9wdGlvbnMuCitHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYl90aXRsZSA9IE9wdGlvbnMKKworSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX2RyaXZlckxhYmVsID0gRHJpdmVyOgorSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3VybExhYmVsID0gVVJMOgorSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3VzZXJMYWJlbCA9IFVzZXI6CitKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfcGFzc3dvcmRMYWJlbCA9IFBhc3N3b3JkOgorCitKZGJjUHJvcGVydGllc0NvbXBvc2l0ZV9KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNfR3JvdXBCb3ggPSBKREJDIGNvbm5lY3Rpb24gcHJvcGVydGllcworCitMb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9sb2NrVGltZW91dExhYmVsID0gTG9jayB0aW1lb3V0OgorUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlX3F1ZXJ5VGltZW91dExhYmVsID0gUXVlcnkgdGltZW91dDoKKworVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX3RyYW5zYWN0aW9uVHlwZUxhYmVsID0gVHJhbnNhY3Rpb24gdHlwZToKKworVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX2p0YSA9IEpUQQorVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX3Jlc291cmNlX2xvY2FsID0gUmVzb3VyY2UgTG9jYWwKKworU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX3NoYXJlZENhY2hlTW9kZUxhYmVsID0gU2hhcmVkIGNhY2hlIG1vZGU6CisKK1NoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZV9hbGwgPSBBbGwKK1NoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZV9ub25lID0gTm9uZQorU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX2VuYWJsZV9zZWxlY3RpdmUgPSBFbmFibGUgU2VsZWN0aXZlCitTaGFyZWRDYWNoZU1vZGVDb21wb3NpdGVfZGlzYWJsZV9zZWxlY3RpdmUgPSBEaXNhYmxlIFNlbGVjdGl2ZQorU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX3Vuc3BlY2lmaWVkID0gVW5zcGVjaWZpZWQKKworVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfdmFsaWRhdGlvbk1vZGVMYWJlbCA9IFZhbGlkYXRpb24gbW9kZToKKworVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfYXV0byA9IEF1dG8KK1ZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlX2NhbGxiYWNrID0gQ2FsbGJhY2sKK1ZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlX25vbmUgPSBOb25lCisKK1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlUGVyc2lzdExhYmVsID0gVmFsaWRhdGUgcHJlLXBlcnNpc3QgZ3JvdXA6CitWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9ncm91cFByZVVwZGF0ZUxhYmVsID0gVmFsaWRhdGUgcHJlLXVwZGF0ZSBncm91cDoKK1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlUmVtb3ZlTGFiZWwgPSBWYWxpZGF0ZSBwcmUtcmVtb3ZlIGdyb3VwOgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV92YWxpZGF0aW9uX3ByZWZlcmVuY2VzLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX3ZhbGlkYXRpb25fcHJlZmVyZW5jZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjdiOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV92YWxpZGF0aW9uX3ByZWZlcmVuY2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMTkgQEAKK1BST0pFQ1RfTEVWRUxfQ0FURUdPUlk9UHJvamVjdAorCitOT19KUEFfUFJPSkVDVD1Qcm9qZWN0IGhhcyBKUEEgZmFjZXQsIGJ1dCBKUEEgcHJvamVjdCBjb3VsZG4ndCBiZSBjcmVhdGVkOgorUFJPSkVDVF9OT19DT05ORUNUSU9OPU5vIGNvbm5lY3Rpb24gc3BlY2lmaWVkIGZvciBwcm9qZWN0OgorUFJPSkVDVF9JTlZBTElEX0NPTk5FQ1RJT049Q29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdDoKK1BST0pFQ1RfSU5BQ1RJVkVfQ09OTkVDVElPTj1Db25uZWN0aW9uIGlzIG5vdCBhY3RpdmU6CitQUk9KRUNUX05PX1BFUlNJU1RFTkNFX1hNTD1ObyBwZXJzaXN0ZW5jZS54bWwgZmlsZSBmb3VuZCBpbiBwcm9qZWN0OgorUFJPSkVDVF9NVUxUSVBMRV9QRVJTSVNURU5DRV9YTUw9TXVsdGlwbGUgcGVyc2lzdGVuY2UueG1sIGZpbGVzIGluIHByb2plY3Q6CisKK1hNTF9WRVJTSU9OX05PVF9MQVRFU1Q9WE1MIGRvY3VtZW50IHZlcnNpb24gbm90IG1vc3QgcmVjZW50OgorCitQRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklUPU5vIHBlcnNpc3RlbmNlIHVuaXQgZGVmaW5lZDoKK1BFUlNJU1RFTkNFX01VTFRJUExFX1BFUlNJU1RFTkNFX1VOSVRTPU11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzIGRlZmluZWQ6CitQRVJTSVNURU5DRV9YTUxfSU5WQUxJRF9DT05URU5UPUludmFsaWQgY29udGVudCAobm8gcm9vdCBub2RlKToKKworUEVSU0lTVEVOQ0VfVU5JVF9MRVZFTF9DQVRFR09SWT1QZXJzaXN0ZW5jZSB1bml0CisKK1BFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfTUFQUElOR19GSUxFPVVuc3BlY2lmaWVkIG1hcHBpbmcgZmlsZToKK1BFUlNJU1RFTkNFX1VOSVRfVU5TVVBQT1JURURfTUFQUElOR19GSUxFX0NPTlRFTlQ9TWFwcGluZyBmaWxlIGRvZXMgbm90IGhhdmUgc3VwcG9ydGVkIGNvbnRlbnQ6CitQRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX01BUFBJTkdfRklMRT1NYXBwaW5nIGZpbGUgY2Fubm90IGJlIHJlc29sdmVkOgorUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX01BUFBJTkdfRklMRT1NYXBwaW5nIGZpbGUgZG9lcyBub3QgaGF2ZSBPUk0gY29udGVudDoKK1BFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX01BUFBJTkdfRklMRT1EdXBsaWNhdGUgbWFwcGluZyBmaWxlOgorUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9DTEFTUz1VbnNwZWNpZmllZCBjbGFzczoKK1BFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfQ0xBU1M9Q2xhc3MgY2Fubm90IGJlIHJlc29sdmVkOgorUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX0NMQVNTPUNsYXNzIGlzIGluY2x1ZGVkIGluIGEgcGVyc2lzdGVuY2UgdW5pdCBidXQgaXMgbm90IG1hcHBlZDoKK1BFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0NMQVNTPUR1cGxpY2F0ZSBjbGFzczoKK1BFUlNJU1RFTkNFX1VOSVRfUkVEVU5EQU5UX0NMQVNTPUNsYXNzIGlzIGFscmVhZHkgc3BlY2lmaWVkIGluIG1hcHBpbmcgZmlsZToKK1BFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0pBUl9GSUxFPUR1cGxpY2F0ZSBKQVIgZmlsZToKK1BFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfSkFSX0ZJTEU9VW5zcGVjaWZpZWQgSkFSIGZpbGU6CitQRVJTSVNURU5DRV9VTklUX0pBUl9GSUxFX0RFUExPWU1FTlRfUEFUSF9XQVJOSU5HPVRoZSBwYXRoIHRvIHRoZSBKQVIgZmlsZSB3aWxsIHZhcnk6CitQRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX0pBUl9GSUxFPUpBUiBmaWxlIGNhbm5vdCBiZSByZXNvbHZlZDoKK01BUFBJTkdfRklMRV9FWFRSQU5FT1VTX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM9RXh0cmFuZW91cyBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzIGZvdW5kOgorUEVSU0lTVEVOVF9UWVBFX01BUFBFRF9CVVRfTk9UX0lOQ0xVREVEX0lOX1BFUlNJU1RFTkNFX1VOSVQ9Q2xhc3MgaXMgbWFwcGVkLCBidXQgaXMgbm90IGluIGEgcGVyc2lzdGVuY2UgdW5pdDoKK1BFUlNJU1RFTlRfVFlQRV9BTk5PVEFURURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklUPUNsYXNzIGlzIGFubm90YXRlZCwgYnV0IGlzIG5vdCBpbiBhIHBlcnNpc3RlbmNlIHVuaXQ6CitQRVJTSVNURU5UX1RZUEVfVU5TUEVDSUZJRURfQ0xBU1M9VW5zcGVjaWZpZWQgY2xhc3M6CitQRVJTSVNURU5UX1RZUEVfVU5SRVNPTFZFRF9DTEFTUz1DbGFzcyBjYW5ub3QgYmUgcmVzb2x2ZWQ6CisKK1RZUEVfTEVWRUxfQ0FURUdPUlk9VHlwZQorCitFTlRJVFlfTk9fSUQ9RW50aXR5IGhhcyBubyBwcmltYXJ5IGtleToKK0VOVElUWV9TSU5HTEVfVEFCTEVfREVTQ0VOREFOVF9ERUZJTkVTX1RBQkxFPU5vIHRhYmxlIHNob3VsZCBiZSBkZWZpbmVkIGZvciBub24tcm9vdCBlbnRpdHkgdXNpbmcgc2luZ2xlLXRhYmxlIGluaGVyaXRhbmNlOgorRU5USVRZX0FCU1RSQUNUX1RBQkxFX1BFUl9DTEFTU19ERUZJTkVTX1RBQkxFPU5vIHRhYmxlIHNob3VsZCBiZSBkZWZpbmVkIGZvciBhYnN0cmFjdCBlbnRpdHkgdXNpbmcgdGFibGUtcGVyLWNvbmNyZXRlLWNsYXNzIGluaGVyaXRhbmNlOgorRU5USVRZX0FCU1RSQUNUX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRCA9IE5vIGRpc2NyaW1pbmF0b3IgdmFsdWUgc2hvdWxkIGJlIGRlZmluZWQgZm9yIGFic3RyYWN0IGVudGl0eToKK0VOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVEID0gTm8gZGlzY3JpbWluYXRvciB2YWx1ZSBzaG91bGQgYmUgZGVmaW5lZCBmb3IgZW50aXR5IHVzaW5nIHRhYmxlLXBlci1jb25jcmV0ZS1jbGFzcyBpbmhlcml0YW5jZToKK0VOVElUWV9OT05fUk9PVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVEID1ObyBkaXNjcmltaW5hdG9yIGNvbHVtbiBzaG91bGQgYmUgZGVmaW5lZCBmb3Igbm9uLXJvb3QgZW50aXR5OgorRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVEID0gTm8gZGlzY3JpbWluYXRvciBjb2x1bW4gc2hvdWxkIGJlIGRlZmluZWQgZm9yIGVudGl0eSB1c2luZyB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2U6CitQRVJTSVNURU5UX0FUVFJJQlVURV9VTlNQRUNJRklFRF9OQU1FPVVuc3BlY2lmaWVkIG5hbWU6CitQRVJTSVNURU5UX0FUVFJJQlVURV9VTlJFU09MVkVEX05BTUU9QXR0cmlidXRlIGluIGNsYXNzIGNhbm5vdCBiZSByZXNvbHZlZDoKK1BFUlNJU1RFTlRfQVRUUklCVVRFX0lOSEVSSVRFRF9BVFRSSUJVVEVTX05PVF9TVVBQT1JURUQ9UmVmZXJlbmNlZCBpbmhlcml0ZWQgYXR0cmlidXRlIG1heSBub3QgYmUgc3VwcG9ydGVkOgorUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9NQVBQSU5HPUF0dHJpYnV0ZSBoYXMgaW52YWxpZCBtYXBwaW5nIHR5cGU6CitQRVJTSVNURU5UX0FUVFJJQlVURV9GSU5BTF9GSUVMRD1UaGUgamF2YSBmaWVsZCBmb3IgYXR0cmlidXRlIGlzIGZpbmFsOgorUEVSU0lTVEVOVF9BVFRSSUJVVEVfUFVCTElDX0ZJRUxEPVRoZSBqYXZhIGZpZWxkIGZvciBhdHRyaWJ1dGUgaXMgcHVibGljOgorCitBVFRSSUJVVEVfTEVWRUxfQ0FURUdPUlk9QXR0cmlidXRlCisKK01BUFBJTkdfVU5SRVNPTFZFRF9NQVBQRURfQlk9Q2Fubm90IHJlc29sdmUgYXR0cmlidXRlIG5hbWU6CitNQVBQSU5HX0lOVkFMSURfTUFQUEVEX0JZPUF0dHJpYnV0ZSBoYXMgaW52YWxpZCBtYXBwaW5nIGZvciB0aGlzIHJlbGF0aW9uc2hpcAorTUFQUElOR19NQVBQRURfQllfV0lUSF9KT0lOX1RBQkxFPUNhbm5vdCBzcGVjaWZ5IGpvaW4gdGFibGUgaWYgYXR0cmlidXRlIGlzIG1hcHBlZCBieSBhbm90aGVyIGF0dHJpYnV0ZToKK01BUFBJTkdfTUFQUEVEX0JZX09OX0JPVEhfU0lERVM9UmVsYXRpb25zaGlwIG11c3QgaGF2ZSBhbiBvd25lcjoKK1RBUkdFVF9FTlRJVFlfTk9UX0RFRklORUQ9VGFyZ2V0IGVudGl0eSBpcyBub3QgZGVmaW5lZDoKKworVEFSR0VUX0VOVElUWV9JU19OT1RfQU5fRU5USVRZPVRhcmdldCBlbnRpdHkgaXMgbm90IGFuIEVudGl0eToKKworUEhZU0lDQUxfTUFQUElOR19DQVRFR09SWT1EYXRhYmFzZQorCitUQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c9Q2F0YWxvZyBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIHRhYmxlOgorVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE9U2NoZW1hIGNhbm5vdCBiZSByZXNvbHZlZCBmb3IgdGFibGU6CitUQUJMRV9VTlJFU09MVkVEX05BTUU9VGFibGUgY2Fubm90IGJlIHJlc29sdmVkOgorU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRz1DYXRhbG9nIGNhbm5vdCBiZSByZXNvbHZlZCBmb3Igc2Vjb25kYXJ5IHRhYmxlOgorU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BPVNjaGVtYSBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIHNlY29uZGFyeSB0YWJsZToKK1NFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX05BTUU9U2Vjb25kYXJ5IHRhYmxlIGNhbm5vdCBiZSByZXNvbHZlZDoKK0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HPUNhdGFsb2cgY2Fubm90IGJlIHJlc29sdmVkIGZvciBqb2luIHRhYmxlOgorSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQT1TY2hlbWEgY2Fubm90IGJlIHJlc29sdmVkIGZvciBqb2luIHRhYmxlOgorSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUU9Sm9pbiB0YWJsZSBjYW5ub3QgYmUgcmVzb2x2ZWQ6CitDT0xVTU5fVU5SRVNPTFZFRF9UQUJMRT1UYWJsZSBmb3IgY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKK0NPTFVNTl9VTlJFU09MVkVEX05BTUU9Q29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZAorSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRT1UYWJsZSBmb3Igam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgorSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUpvaW4gY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKK0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRV9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9Sm9pbiBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6CitKT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9UmVmZXJlbmNlZCBjb2x1bW4gaW4gam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgorSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUz0gSm9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6CitQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9UHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgorUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FPVJlZmVyZW5jZWQgQ29sdW1uIGluIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKKworSU1QTElFRF9BVFRSSUJVVEVfQ0FURUdPUlk9SW1wbGllZCBBdHRyaWJ1dGVzCisKK1ZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HPUNhdGFsb2cgY2Fubm90IGJlIHJlc29sdmVkIGZvciBqb2luIHRhYmxlOgorVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQT1TY2hlbWEgY2Fubm90IGJlIHJlc29sdmVkIGZvciBqb2luIHRhYmxlOgorVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUU9Sm9pbiB0YWJsZSBjYW5ub3QgYmUgcmVzb2x2ZWQ6CitWSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRT1UYWJsZSBmb3IgY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKK1ZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFPVRhYmxlIGZvciBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgorVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1Db2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgorVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1Db2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgorVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRT1UYWJsZSBmb3Igam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgorVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUpvaW4gY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZAorVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUz1Kb2luIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKK1ZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1SZWZlcmVuY2VkIGNvbHVtbiBpbiBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQKK1ZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRV9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9Sm9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6CitWSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFk9VGFyZ2V0IGVudGl0eSBpcyBub3QgYW4gRW50aXR5OgorVklSVFVBTF9BVFRSSUJVVEVfVEFSR0VUX0VOVElUWV9OT1RfREVGSU5FRD1JbiBpbXBsaWVkIGF0dHJpYnV0ZSwgdGFyZ2V0IGVudGl0eSBpcyBub3QgZGVmaW5lZDoKKworSU1QTElFRF9BU1NPQ0lBVElPTl9DQVRFR09SWT1JbXBsaWVkIEFzc29jaWF0aW9ucworCitWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEU9VGFibGUgZm9yIGpvaW4gY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKK1ZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUpvaW4gY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKK1ZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPVJlZmVyZW5jZWQgY29sdW1uIGluIGpvaW4gY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKKworSU5IRVJJVEFOQ0VfQ0FURUdPUlk9SW5oZXJpdGFuY2UKKworRElTQ1JJTUlOQVRPUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPURpc2NyaW1pbmF0b3IgY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKK0VOVElUWV9UQUJMRV9QRVJfQ0xBU1NfTk9UX1NVUFBPUlRFRF9PTl9QTEFURk9STT1FbnRpdHkgY2Fubm90IHVzZSB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2U6CitFTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9QT1JUQUJMRV9PTl9QTEFURk9STT1FbnRpdHkgdXNlcyB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2Ugd2hpY2ggaXMgbm90IHBvcnRhYmxlOgorCitRVUVSSUVTX0dFTkVSQVRPUlNfQ0FURUdPUlk9UXVlcmllcyBhbmQgR2VuZXJhdG9ycworCitHRU5FUkFUT1JfRFVQTElDQVRFX05BTUU9RHVwbGljYXRlIGdlbmVyYXRvciBkZWZpbmVkOgorSURfTUFQUElOR19VTlJFU09MVkVEX0dFTkVSQVRPUl9OQU1FPVVucmVzb2x2ZWQgZ2VuZXJhdG9yIG5hbWU6CitHRU5FUkFURURfVkFMVUVfVU5SRVNPTFZFRF9HRU5FUkFUT1I9R2VuZXJhdG9yIG5hbWUgaXMgZGVmaW5lZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdDoKK1FVRVJZX0RVUExJQ0FURV9OQU1FPUR1cGxpY2F0ZSBxdWVyeSBkZWZpbmVkOgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NjaGVtYS9qcGFQbGF0Zm9ybS5leHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NjaGVtYS9qcGFQbGF0Zm9ybS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWI2ZTQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zY2hlbWEvanBhUGxhdGZvcm0uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQudWkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LnVpIiBpZD0ianBhUGxhdGZvcm0iIG5hbWU9IkpQQSBQbGF0Zm9ybSBVSSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJqcGFQbGF0Zm9ybSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJqcGFQbGF0Zm9ybSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRXh0ZW5kIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFuZCB5b3UgbXVzdCBhbHNvIGV4dGVuZCB0aGUgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhUGxhdGZvcm0gCi0gICAgICAgICAgICBleHRlbnNpb24gcG9pbnQuICBUaGUgaWRzIG11c3QgbWF0Y2guICBPbmUganBhUGxhdGZvcm0gd2lsbCBiZSBjaG9zZW4gcGVyIEpwYVByb2plY3QuICBUaGUgCi0gICAgICAgICAgICBwb3NzaWJsZSBqcGFQbGF0Zm9ybXMgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYXMgYSBwcm9qZWN0IHByb3BlcnR5LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgbXVzdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGFQbGF0Zm9ybSBleHRlbnNpb24gaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaSZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zY2hlbWEvanBhUGxhdGZvcm1VaXMuZXhzZCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zY2hlbWEvanBhUGxhdGZvcm1VaXMuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjM0ZWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NjaGVtYS9qcGFQbGF0Zm9ybVVpcy5leHNkCkBAIC0wLDAgKzEsMTM5IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQudWkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Cis8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LnVpIiBpZD0ianBhUGxhdGZvcm1zIiBuYW1lPSJKUEEgUGxhdGZvcm0gVUlzIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgIDxhcHBpbmZvPgorICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgorICAgICAgICAgPC9hcHBpbmZvPgorICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJqcGFQbGF0Zm9ybVVpIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcGluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9ImpwYVBsYXRmb3JtVWkiPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIEV4dGVuZCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhbmQgeW91IG11c3QgYWxzbyBleHRlbmQgdGhlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYVBsYXRmb3JtcyBleHRlbnNpb24gcG9pbnQuICBUaGUganBhUGxhdGZvcm1JZCBtdXN0IG1hdGNoIHRoZSBpZCBvZiBhIGNvcmUuanBhUGxhdGZvcm0gZXh0ZW5zaW9uLiAgT25lIGpwYVBsYXRmb3JtIHdpbGwgYmUgY2hvc2VuIHBlciBKcGFQcm9qZWN0LiAgVGhlIHBvc3NpYmxlIGpwYVBsYXRmb3JtcyB3aWxsIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBhcyBhIHByb2plY3QgcHJvcGVydHkuCisgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImpwYVBsYXRmb3JtIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIFRoZSBqcGFQbGF0Zm9ybUlkIG11c3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhUGxhdGZvcm0gZXh0ZW5zaW9uIGlkLgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY3RvcnlDbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeSZsdDsvc2FtcCZndDsuCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwaW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWlGYWN0b3J5Ii8+CisgICAgICAgICAgICAgICA8L2FwcGluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIDIuMgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBpbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KKyAgICAgIDwvYXBwaW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKK3VuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKK3N0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCitwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCit3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+CisgICAgICA8L2FwcGluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcGluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgorICAgICAgPC9hcHBpbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCit0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAKK0NvbnRyaWJ1dG9yczoKK09yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwYVBsYXRmb3JtVWkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwYVBsYXRmb3JtVWkuamF2YQppbmRleCA3YTk5ZWEzLi5lNWFiOWM4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9KcGFQbGF0Zm9ybVVpLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvSnBhUGxhdGZvcm1VaS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEyLDE1ICsxMiwyMCBAQAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuVHlwZU1hcHBpbmdVaVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkRlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5uYXZpZ2F0b3IuSnBhTmF2aWdhdG9yUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwogCiAvKioKICAqIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgSlBBIHZlbmRvciB0byBwcm92aWRlIGV4dGVuc2lvbnMgdG8KQEAgLTMyLDcgKzM3LDcgQEAKICAqIFRoZSAiZ2VuZXJpYyIgZXh0ZW5zaW9uIHN1cHBsaWVzIFVJIGZvciB0aGUgY29yZSBwbGF0Zm9ybSBleHRlbnNpb24gd2l0aCB0aGUgc2FtZQogICogSUQuCiAgKgotICogQHNlZSB0aGUgb3JnLmVjbGlwc2UuanB0LnVpLmpwYVBsYXRmb3JtIGV4dGVuc2lvbiBwb2ludAorICogU2VlIHRoZSBleHRlbnNpb24gcG9pbnQ6IG9yZy5lY2xpcHNlLmpwdC51aS5qcGFQbGF0Zm9ybQogICoKICAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCiAgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCkBAIC00MiwzNSArNDcsNzcgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBKcGFQbGF0Zm9ybVVpCiB7CisJLy8gKioqKioqKioqKiBuYXZpZ2F0b3IgcHJvdmlkZXIgKioqKioqKioqKgorCQogCS8qKgotCSAqIFJldHVybiBhICpuZXcqIHtAbGluayBKcGFOYXZpZ2F0b3JQcm92aWRlcn0sIHdoaWNoIGRldGVybWluZXMKLQkgKiBQcm9qZWN0IEV4cGxvcmVyIGNvbnRlbnQgYW5kIGxvb2sKKwkgKiBSZXR1cm4gdGhlIHtAbGluayBKcGFOYXZpZ2F0b3JQcm92aWRlcn0gZm9yIHRoaXMgcGxhdGZvcm0sIAorCSAqIHdoaWNoIGRldGVybWluZXMgUHJvamVjdCBFeHBsb3JlciBjb250ZW50IGFuZCBsb29rCiAJICovCi0JSnBhTmF2aWdhdG9yUHJvdmlkZXIgYnVpbGROYXZpZ2F0b3JQcm92aWRlcigpOwotCisJSnBhTmF2aWdhdG9yUHJvdmlkZXIgZ2V0TmF2aWdhdG9yUHJvdmlkZXIoKTsKKwkKKwkKKwkvLyAqKioqKioqKioqIHN0cnVjdHVyZSBwcm92aWRlcnMgKioqKioqKioqKgorCQogCS8qKgotCSAqIFJldHVybiBhICpuZXcqIHN0cnVjdHVyZSBwcm92aWRlciBmb3IgdGhlIGdpdmVuIEpQQSBmaWxlCisJICogUmV0dXJuIGEgc3RydWN0dXJlIHByb3ZpZGVyIGZvciB0aGUgc3BlY2lmaWVkIEpQQSBmaWxlLgogCSAqLwotCS8vIFRPRE8gLSBiaW5hcnkgamF2YSB0eXBlIHN1cHBvcnQKLQlKcGFTdHJ1Y3R1cmVQcm92aWRlciBidWlsZFN0cnVjdHVyZVByb3ZpZGVyKEpwYUZpbGUganBhRmlsZSk7Ci0KLQlJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0KLQlJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmF1bHRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQotCUpwYURldGFpbHNQcm92aWRlciBkZXRhaWxzUHJvdmlkZXIoSnBhU3RydWN0dXJlTm9kZSBjb250ZXh0Tm9kZSk7Ci0KLQl2b2lkIGdlbmVyYXRlRERMKEpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKTsKLQorCUpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKEpwYUZpbGUganBhRmlsZSk7CisJCisJCisJLy8gKioqKioqKioqKiBkZXRhaWxzIHByb3ZpZGVycyAqKioqKioqKioqCisJCisJSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkSnBhRGV0YWlsc1BhZ2UoCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJSnBhU3RydWN0dXJlTm9kZSBzdHJ1Y3R1cmVOb2RlLAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKKwkKKwkKKwkvLyAqKioqKioqKioqIGZpbGUgdWkgZGVmaW5pdGlvbnMgKioqKioqKioqKgorCQorCS8qKgorCSAqIFJldHVybiBhIHJlc291cmNlIHVpIGRlZmluaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS4KKwkgKi8KKwlSZXNvdXJjZVVpRGVmaW5pdGlvbiBnZXRSZXNvdXJjZVVpRGVmaW5pdGlvbihKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKKwkKKwkKKwkvLyAqKioqKioqKioqIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgorCQorCUpwYUNvbXBvc2l0ZSBidWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSwgCisJCQlTdHJpbmcgbWFwcGluZ0tleSwgCisJCQlDb21wb3NpdGUgcGFyZW50LCAKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4gbWFwcGluZ0hvbGRlciwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisJCisJRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPiBnZXREZWZhdWx0VHlwZU1hcHBpbmdVaURlZmluaXRpb24oCisJCQlKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKKwkKKwlJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiB0eXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoCisJCQlKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKKwkKKwkKKwkvLyAqKioqKioqKioqIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCisJCisJSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCUpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUsIAorCQkJU3RyaW5nIG1hcHBpbmdLZXksIAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nSG9sZGVyLAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKKwkKKwlEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gZ2V0RGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oCisJCQlKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlLCBTdHJpbmcgbWFwcGluZ0tleSk7CisJCisJSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBhdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygKKwkJCUpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpOworCQorCQorCS8vICoqKioqKioqKiogZW50aXR5IGdlbmVyYXRpb24gKioqKioqKioqKgorCQogCXZvaWQgZ2VuZXJhdGVFbnRpdGllcyhKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbik7Ci0KLQlKcGFVaUZhY3RvcnkgZ2V0SnBhVWlGYWN0b3J5KCk7Ci0KLQlJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQotCUl0ZXJhdG9yPFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBqYXZhVHlwZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCi0JSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBvcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQotCUl0ZXJhdG9yPFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBvcm1UeXBlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCQorCQorCS8vICoqKioqKioqKiogRERMIGdlbmVyYXRpb24gKioqKioqKioqKgorCQorCXZvaWQgZ2VuZXJhdGVEREwoSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdjMDVmZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIEpQQSB2ZW5kb3IgdG8gYnVpbGQgYSBKcGFQbGF0Zm9ybVVpLgorICoKKyAqIFNlZSB0aGUgZXh0ZW5zaW9uIHBvaW50OiBvcmcuZWNsaXBzZS5qcHQudWkuanBhUGxhdGZvcm0KKyAqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBKcGFQbGF0Zm9ybVVpRmFjdG9yeQoreworCUpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9KcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NTNkODgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9KcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBKUEEgdmVuZG9yIHRvIHByb3ZpZGUgZXh0ZW5zaW9ucyB0bworICogSlBBIFVJIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGlzIGludGVuZGVkIHRvIHdvcmsgaW4gY29uanVuY3Rpb24gd2l0aCBhIGNvcmUKKyAqIEpQQSBwbGF0Zm9ybSAoe0BsaW5rIEpwYVBsYXRmb3JtfSkgaW1wbGVtZW50YXRpb24gd2l0aCB0aGUgc2FtZSBJRC4KKyAqIDxwPgorICogQW55IGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSA8aT5zdGF0ZWxlc3M8L2k+IGluIG5hdHVyZS4KKyAqIDxwPgorICogVGhlICJnZW5lcmljIiBleHRlbnNpb24gc3VwcGxpZXMgVUkgZm9yIHRoZSBjb3JlIHBsYXRmb3JtIGV4dGVuc2lvbiB3aXRoIHRoZSBzYW1lCisgKiBJRC4KKyAqCisgKiBTZWUgdGhlIGV4dGVuc2lvbiBwb2ludDogb3JnLmVjbGlwc2UuanB0LnVpLmpwYVBsYXRmb3JtVWlzCisgKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSnBhUGxhdGZvcm1VaVByb3ZpZGVyCit7CisJLyoqCisJICogUmV0dXJuIHRoZSBkZXRhaWxzIHByb3ZpZGVycyB0aGF0IGFwcGx5IHRvIHRoaXMgcGxhdGZvcm0uCisJICovCisJTGlzdEl0ZXJhdG9yPEpwYURldGFpbHNQcm92aWRlcj4gZGV0YWlsc1Byb3ZpZGVycygpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgdWkgZGVmaW5pdGlvbnMgdGhhdCBhcHBseSB0byB0aGlzIHBsYXRmb3JtLgorCSAqLworCUxpc3RJdGVyYXRvcjxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gcmVzb3VyY2VVaURlZmluaXRpb25zKCk7CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9KcGFVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwYVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODg0OTFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwYVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVXNlIHtAbGluayBKcGFGYWN0b3J5fSB0byBjcmVhdGUgYW55IHtAbGluayBKYXZhVHlwZU1hcHBpbmd9IG9yCi0gKiB7QGxpbmsgSmF2YUF0dHJpYnV0ZU1hcHBpbmd9cy4gVGhpcyBpcyBuZWNlc3Nhcnkgc28gdGhhdCBwbGF0Zm9ybXMgY2FuCi0gKiBleHRlbmQgdGhlIGphdmEgbW9kZWwgd2l0aCB0aGVpciBvd24gYW5ub3RhdGlvbnMuCi0gKiB7QGxpbmsgSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXJ9IGFuZCB7QGxpbmsgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcn0gdXNlCi0gKiB0aGlzIGZhY3RvcnkuIFNlZSB7QGxpbmsgSnBhUGxhdGZvcm0jamF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzKCl9IGFuZAotICoge0BsaW5rIEpwYVBsYXRmb3JtI2phdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKCkgZm9yIGNyZWF0aW5nIG5ldyBtYXBwaW5ncwotICogdHlwZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4KLSAqIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nCi0gKiBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdAotICogY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkJhc2VKcGFVaUZhY3RvcnkKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFVaUZhY3RvcnkKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGEgPGNvZGU+QmFzaWNNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJhc2ljIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGU8QmFzaWNNYXBwaW5nPiBjcmVhdGVCYXNpY01hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPkVtYmVkZGFibGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYmFzaWMgbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZTxFbWJlZGRhYmxlPiBjcmVhdGVFbWJlZGRhYmxlQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+RW1iZWRkZWRJZE1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgZW1iZWRkZWQgSUQgbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZTxFbWJlZGRlZElkTWFwcGluZz4gY3JlYXRlRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+RW1iZWRkZWRNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGVtYmVkZGVkIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGU8RW1iZWRkZWRNYXBwaW5nPiBjcmVhdGVFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPkphdmFFbnRpdHk8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgamF2YSBlbnRpdHkKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGU8SmF2YUVudGl0eT4gY3JlYXRlSmF2YUVudGl0eUNvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGEgPGNvZGU+T3JtRW50aXR5PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG9ybSBlbnRpdHkKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGU8T3JtRW50aXR5PiBjcmVhdGVPcm1FbnRpdHlDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPklkTWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBJRCBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlPElkTWFwcGluZz4gY3JlYXRlSWRNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPk1hbnlUb01hbnlNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG1hbnkgdG8gbWFueSBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlPE1hbnlUb01hbnlNYXBwaW5nPiBjcmVhdGVNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPk1hbnlUb09uZU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWFueSB0byBvbmUgbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZTxNYW55VG9PbmVNYXBwaW5nPiBjcmVhdGVNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8TWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5NYXBwZWRTdXBlcmNsYXNzPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG1hcHBlZCBzdXBlcmNsYXNzCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlPE1hcHBlZFN1cGVyY2xhc3M+IGNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPk9uZVRvTWFueU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgb25lIHRvIG1hbnkgbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZTxPbmVUb01hbnlNYXBwaW5nPiBjcmVhdGVPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5PbmVUb09uZU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgb25lIHRvIG9uZSBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlPE9uZVRvT25lTWFwcGluZz4gY3JlYXRlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCBvZiA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+cyB1c2VkIHRvIGVkaXQgYQotCSAqIDxjb2RlPlBlcnNpc3RlbmNlVW5pdDwvY29kZT4uIFRoZSBwcm9wZXJ0aWVzIGNhbiBiZSByZWdyb3VwZWQgaW50bwotCSAqIHNlY3Rpb25zIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZWRpdG9yIGFzIHBhZ2VzLgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgcGVydGlzdGVuY2UgdW5pdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUxpc3RJdGVyYXRvcjxKcGFQYWdlQ29tcG9zaXRlPFBlcnNpc3RlbmNlVW5pdD4+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZXMoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGEgPGNvZGU+VHJhbnNpZW50TWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0cmFuc2llbnQgbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZTxUcmFuc2llbnRNYXBwaW5nPiBjcmVhdGVUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VHJhbnNpZW50TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5WZXJzaW9uTWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB2ZXJzaW9uIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGU8VmVyc2lvbk1hcHBpbmc+IGNyZWF0ZVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvSnB0VWlQbHVnaW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL0pwdFVpUGx1Z2luLmphdmEKaW5kZXggNjU3MjY1Yi4uNGE2ODZiOCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvSnB0VWlQbHVnaW4uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9KcHRVaVBsdWdpbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEzLDEzICsxMywyMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtVWlSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKIAogLyoqCi0gKgotICoKKyAqIERhbGkgVUkgcGx1Zy1pbi4KKyAqIDxwPgogICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKICAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKICAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCkBAIC0yNywyMyArMzUsMzggQEAKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwogQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnB0VWlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCitwdWJsaWMgY2xhc3MgSnB0VWlQbHVnaW4KKwlleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KIHsKKwlwcml2YXRlIGZpbmFsIExpc3RlbmVyIGZvY3VzTGlzdGVuZXI7CisKKworCS8vICoqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioKKworCS8qKgorCSAqIFRoZSBwbHVnLWluIGlkZW50aWZpZXIgb2YgSlBBIFVJIHN1cHBvcnQgKHZhbHVlIHtAdmFsdWV9KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LnVpIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSURfID0gUExVR0lOX0lEICsgJy4nOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPQ1VTX0RBVEFfS0VZID0gUExVR0lOX0lEXyArICJmb2N1cyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEZPQ1VTX0RBVEEgPSBuZXcgT2JqZWN0KCk7CisKKworCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKKwogCXByaXZhdGUgc3RhdGljIEpwdFVpUGx1Z2luIElOU1RBTkNFOwogCiAJLyoqCi0JICogVGhlIHBsdWctaW4gaWRlbnRpZmllciBvZiBKUEEgVUkgc3VwcG9ydAotCSAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LnVpIjwvY29kZT4pLgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBKUFQgVUkgcGx1Zy1pbi4KIAkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LnVpIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdFVpUGx1Z2luIGdldFBsdWdpbigpIHsKKwlwdWJsaWMgc3RhdGljIEpwdFVpUGx1Z2luIGluc3RhbmNlKCkgewogCQlyZXR1cm4gSU5TVEFOQ0U7CiAJfQogCisKKwkvLyAqKioqKioqKioqIGxvZ2dpbmcgKioqKioqKioqKgorCiAJcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewogICAgICAgICBJTlNUQU5DRS5nZXRMb2coKS5sb2coc3RhdHVzKTsKICAgICB9CkBAIC01Nyw0MiArODAsMTQ3IEBACiAJfQogCiAKLQkvLyAqKioqKioqKioqKioqKioqIEltYWdlIEFQSSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy8gKioqKioqKioqKiBpbWFnZXMgKioqKioqKioqKgogCiAJLyoqCi0JICogVGhpcyBnZXRzIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIuCisJICogUmV0dXJuIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgPGNvZGU+LmdpZjxjb2RlPgorCSAqIGZpbGUgaW4gdGhlIGljb25zIGZvbGRlci4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQlpZiAoISBrZXkuc3RhcnRzV2l0aCgiaWNvbnMvIikpIHsKKwkJaWYgKCAhIGtleS5zdGFydHNXaXRoKCJpY29ucy8iKSkgewogCQkJa2V5ID0gImljb25zLyIgKyBrZXk7CiAJCX0KLQkJaWYgKCEga2V5LmVuZHNXaXRoKCIuZ2lmIikpIHsKKwkJaWYgKCAhIGtleS5lbmRzV2l0aCgiLmdpZiIpKSB7CiAJCQlrZXkgPSBrZXkgKyAiLmdpZiI7CiAJCX0KIAkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBrZXkpOwogCX0KIAogCS8qKgotCSAqIFRoaXMgcmV0dXJucyBhbiBpbWFnZSBmb3IgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlcgorCSAqIFJldHVybiBhbiBpbWFnZSBmb3IgdGhlIHNwZWNpZmllZCA8Y29kZT4uZ2lmPGNvZGU+CisJICogZmlsZSBpbiB0aGUgaWNvbnMgZm9sZGVyLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihrZXkpOwotCQlyZXR1cm4gKGRlc2MgPT0gbnVsbCkgPyBudWxsIDogZGVzYy5jcmVhdGVJbWFnZSgpOworCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihrZXkpOworCQlyZXR1cm4gKGRlc2NyaXB0b3IgPT0gbnVsbCkgPyBudWxsIDogZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwogCX0KIAogCi0JLy8gKioqKioqKioqKioqKioqKiBDb25zdHJ1Y3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKIAogCXB1YmxpYyBKcHRVaVBsdWdpbigpIHsKIAkJc3VwZXIoKTsKKwkJdGhpcy5mb2N1c0xpc3RlbmVyID0gdGhpcy5idWlsZEZvY3VzTGlzdGVuZXIoKTsKKwkJaWYgKElOU1RBTkNFICE9IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKwkJfQogCQlJTlNUQU5DRSA9IHRoaXM7CiAJfQogCisJLyoqCisJICogV2UgYXJlIHJlZ2lzdGVyZWQgdG8gcmVjZWl2ZSBvbmx5IHtAbGluayBTV1QjRm9jdXNJbn0gZXZlbnRzCisJICovCisJcHJpdmF0ZSBMaXN0ZW5lciBidWlsZEZvY3VzTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJCUpwdFVpUGx1Z2luLnRoaXMuZm9jdXNJbigoQ29udHJvbCkgZXZlbnQud2lkZ2V0KTsKKwkJCX0KKwkJfTsKKwl9CisKKworCS8vICoqKioqKioqKiogZm9jdXMgaGFuZGxpbmcgKioqKioqKioqKgogCiAJLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcGxhdGZvcm0gVUkgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gSlBBIHBsYXRmb3JtCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIGEgImZvY3VzIGluIiBldmVudCBpcyBnZW5lcmF0ZWQuCisJICogSWYgdGhlIGNvbnRyb2wgZ2FpbmluZyBmb2N1cyBpcyBwYXJ0IG9mIG9uZSBvZiBvdXIgY29tcG9zaXRlcyAodHlwaWNhbGx5CisJICogYSBKUEEgRGV0YWlscyBWaWV3KSwgd2Ugc3RvcCBsaXN0ZW5pbmcgdG8gSmF2YSBjaGFuZ2UgZXZlbnRzCisJICogKGFuZCBhc3N1bWUgYWxsIGNoYW5nZXMgdG8gdGhlIEphdmEgbW9kZWwgYXJlIGdlbmVyYXRlZCBieSB1cykuCisJICogSWYgdGhlIGNvbnRyb2wgZ2FpbmluZyBmb2N1cyBpcyAqbm90KiBwYXJ0IG9mIG9uZSBvZiBvdXIgY29tcG9zaXRlcywKKwkgKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIEphdmEgY2hhbmdlIGV2ZW50cyBhZ2Fpbi4KIAkgKi8KLQlwdWJsaWMgSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpKEpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtKSB7Ci0JCXJldHVybiBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkuaW5zdGFuY2UoKS5qcGFQbGF0Zm9ybShqcGFQbGF0Zm9ybS5nZXRJZCgpKTsKKwl2b2lkIGZvY3VzSW4oQ29udHJvbCBjb250cm9sKSB7CisJCXdoaWxlIChjb250cm9sICE9IG51bGwpIHsKKwkJCWlmIChjb250cm9sLmdldERhdGEoRk9DVVNfREFUQV9LRVkpID09IEZPQ1VTX0RBVEEpIHsKKwkJCQl0aGlzLmZvY3VzSW4oKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQljb250cm9sID0gY29udHJvbC5nZXRQYXJlbnQoKTsKKwkJfQorCQl0aGlzLmZvY3VzT3V0KCk7CiAJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIGEgRGFsaSBVSSBjb250cm9sIHRoYXQgYWZmZWN0cyBKYXZhCisJICogc291cmNlIGNvZGUgZ2FpbnMgdGhlIFVJIGZvY3VzLiBXaGVuIHRoaXMgaGFwcGVucyB3ZSBkZWFjdGl2YXRlCisJICogdGhlIERhbGkgSmF2YSBjaGFuZ2UgbGlzdGVuZXIgc28gd2UgaWdub3JlIGFueSBjaGFuZ2VzIHRvIHRoZSBKYXZhCisJICogc291cmNlIGNvZGUgdGhhdCBwcm9iYWJseSBvcmlnaW5hdGVkIGZyb20gRGFsaS4gVGhpcyBtZWFucyB3ZSB3aWxsIG1pc3MKKwkgKiBhbnkgY2hhbmdlcyB0byB0aGUgSmF2YSBzb3VyY2UgY29kZSB0aGF0IGlzIGNhdXNlZCBieSBub24tVUkgYWN0aXZpdHk7CisJICogYnV0LCB3ZSBob3BlLCB0aGVzZSBjaGFuZ2VzIGFyZSB1bnJlbGF0ZWQgdG8gSlBBIGFubm90YXRpb25zIGV0Yy4KKwkgKiBAc2VlICNmb2N1c091dCgpCisJICovCisJcHJpdmF0ZSB2b2lkIGZvY3VzSW4oKSB7CisJCUpwdENvcmVQbHVnaW4uc2V0SmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcklzQWN0aXZlKGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBub24tRGFsaSBVSSBjb250cm9sIGdhaW5zIHRoZSBVSSBmb2N1cy4KKwkgKiBXaGVuIHRoaXMgaGFwcGVucyB3ZSBhY3RpdmF0ZSB0aGUgRGFsaSBKYXZhIGNoYW5nZSBsaXN0ZW5lciBzbyB0aGF0IHdlCisJICogYmVnaW4gdG8ga2VlcCB0aGUgRGFsaSBtb2RlbCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgSmF2YSBzb3VyY2UgY29kZS4KKwkgKiBAc2VlICNmb2N1c0luKCkKKwkgKi8KKwlwcml2YXRlIHZvaWQgZm9jdXNPdXQoKSB7CisJCUpwdENvcmVQbHVnaW4uc2V0SmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcklzQWN0aXZlKHRydWUpOworCX0KKworCS8qKgorCSAqIFRhZyB0aGUgc3BlY2lmaWVkIGNvbnRyb2wgc28gdGhhdCB3aGVuZXZlciBpdCAob3IgYW55IG9mIGl0cyBjaGlsZHJlbiwKKwkgKiBncmFuZGNoaWxkcmVuLCBldGMuKSBoYXMgdGhlIGZvY3VzLCB0aGUgRGFsaSBtb2RlbCBpZ25vcmVzIGFueSBKYXZhCisJICogY2hhbmdlIGV2ZW50cy4gVGhpcyBtZXRob2QgaXMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgZmlyc3QKKwkgKiBjb25zdHJ1Y3RlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjb250cm9sQWZmZWN0c0phdmFTb3VyY2UoQ29udHJvbCBjb250cm9sKSB7CisJCWNvbnRyb2wuc2V0RGF0YShGT0NVU19EQVRBX0tFWSwgRk9DVVNfREFUQSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHBsYXRmb3JtICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgSlBBIHBsYXRmb3JtIFVJIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKUEEgcGxhdGZvcm0uCisJICovCisJcHVibGljIEpwYVBsYXRmb3JtVWkgZ2V0SnBhUGxhdGZvcm1VaShKcGFQbGF0Zm9ybSBqcGFQbGF0Zm9ybSkgeworCQlyZXR1cm4gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1VaShqcGFQbGF0Zm9ybS5nZXRJZCgpKTsKKwl9CisKKwlwdWJsaWMgSnBhTmF2aWdhdG9yUHJvdmlkZXIgZ2V0SnBhTmF2aWdhdG9yUHJvdmlkZXIoSnBhUGxhdGZvcm0ganBhUGxhdGZvcm0pIHsKKwkJSnBhUGxhdGZvcm1VaSBwbGF0Zm9ybSA9IHRoaXMuZ2V0SnBhUGxhdGZvcm1VaShqcGFQbGF0Zm9ybSk7CisJCXJldHVybiAocGxhdGZvcm0gPT0gbnVsbCkgPyBudWxsIDogcGxhdGZvcm0uZ2V0TmF2aWdhdG9yUHJvdmlkZXIoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZWdpc3RlciBvdXIgU1dUIGxpc3RlbmVyIHdpdGggdGhlIGRpc3BsYXkgc28gd2UgcmVjZWl2ZSBub3RpZmljYXRpb24KKwkgKiBvZiBldmVyeSAiZm9jdXMgaW4iIGV2ZW50LgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hZGRGaWx0ZXIoU1dULkZvY3VzSW4sIHRoaXMuZm9jdXNMaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogVW5yZWdpc3RlciBvdXIgU1dUIGxpc3RlbmVyIHdpdGggdGhlIGRpc3BsYXkuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJRGlzcGxheS5nZXREZWZhdWx0KCkucmVtb3ZlRmlsdGVyKFNXVC5Gb2N1c0luLCB0aGlzLmZvY3VzTGlzdGVuZXIpOworCQl9IGZpbmFsbHkgeworCQkJc3VwZXIuc3RvcChjb250ZXh0KTsKKwkJfQorCX0KKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvTWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9NYXBwaW5nUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWI2NGI3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvTWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uIGV4dGVuZHMgUmVzb3VyY2VVaURlZmluaXRpb24KK3sKKwkKKwkvKioKKwkgKiAKKwkgKi8KKwlKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKFN0cmluZyBrZXksIFByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nSG9sZGVyLCBDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOworCisJLyoqCisJICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9mIGF0dHJpYnV0ZSBtYXBwaW5nIHVpIGRlZmluaXRpb25zIGFwcHJvcHJpYXRlIGZvciB0aGlzIGZpbGUgdHlwZQorCSAqLworCUl0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBhdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpOworCQorCisJLyoqCisJICogUmV0dXJuIGEgZGVmYXVsdCBhdHRyaWJ1dGUgbWFwcGluZyB1aSBkZWZpbml0aW9uIGZvciB0aGUgZ2l2ZW4ga2V5IG9yIG51bGwKKwkgKi8KKwlEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gZ2V0RGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oU3RyaW5nIGtleSk7CisKKwkKKwkvKioKKwkgKiAKKwkgKi8KKwlKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZShTdHJpbmcga2V5LCBQcm9wZXJ0eVZhbHVlTW9kZWw8VHlwZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXIsIENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IHR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpOworCisJLyoqCisJICogUmV0dXJuIGEgZGVmYXVsdCB0eXBlIG1hcHBpbmcgdWkgcHJvdmlkZXIgb3IgbnVsbAorCSAqLworCURlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4gZ2V0RGVmYXVsdFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKCk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL1BlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL1BlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTAwNzBlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICoKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24gZXh0ZW5kcyBSZXNvdXJjZVVpRGVmaW5pdGlvbgoreworCUxpc3RJdGVyYXRvcjxKcGFQYWdlQ29tcG9zaXRlPiBidWlsZFBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZXMoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL1Jlc291cmNlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9SZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTQyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9SZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7CisKKy8qKgorICoKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlVWlEZWZpbml0aW9uCit7CisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhpcyBkZWZpbml0aW9uIHByb3ZpZGVzIFVJIGZvciByZXNvdXJjZSBvZiB0aGUgZ2l2ZW4gdHlwZQorCSAqLworCWJvb2xlYW4gcHJvdmlkZXNVaShKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHN0cnVjdHVyZSBwcm92aWRlciBhc3NvY2lhdGlvbiB3aXRoIHRoaXMgbWFwcGluZyBmaWxlIHR5cGUuCisJICovCisJSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL1dpZGdldEZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL1dpZGdldEZhY3RvcnkuamF2YQppbmRleCAwYTk1N2RhLi4yMmUwZGQyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9XaWRnZXRGYWN0b3J5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvV2lkZ2V0RmFjdG9yeS5qYXZhCkBAIC0xMyw2ICsxMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EYXRlVGltZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwpAQCAtODIsNiArODMsMTYgQEAKIAlDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpOwogCiAJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBEYXRlVGltZS4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIGlzIHRvIHRlbGwgdGhlIHR5cGUgb2Ygd2lkZ2V0CisJICogKDxjb2RlPlNXVC5EQVRFPC9jb2RlPiBvciA8Y29kZT5TV1QuVElNRTwvY29kZT4gb3IgPGNvZGU+U1dULkNBTEVOREFSPC9jb2RlPikKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkRhdGVUaW1lPC9jb2RlPgorCSAqLworCURhdGVUaW1lIGNyZWF0ZURhdGVUaW1lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSk7CisJCisJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSBjdXN0b20gPGNvZGU+Q0NvbWJvPC9jb2RlPi4KIAkgKgogCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczZGQyYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0F0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8VCBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IGV4dGVuZHMgTWFwcGluZ1VpUHJvdmlkZXI8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdGhhdCBjb3JyZXBvbmRzIHRvIHRoaXMgbWFwcGluZyB0eXBlLgotCSAqIFRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgYnkgdGhlIDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZTwvY29kZT4KLQkgKiB3aGVuIHRoZSBtYXBwaW5nIGtleSBtYXRjaGVzIHRoZSBrZXkgZ2l2ZW4gYnkgdGhpcyBwcm92aWRlci4gVGhlCi0JICogY29tcG9zaXRlcyB3aWxsIGJlIHN0b3JlZCBpbiBhIE1hcCB3aXRoIHRoZSBtYXBwaW5nIGtleSBhcyB0aGUga2V5LgotCSAqCi0JICogQHBhcmFtIGZhY3RvcnkgVGhlIFVJIGZhY3RvcnkgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSByaWdodCBjb21wb3NpdGUKLQkgKiBmb3IgYW55IG1hcHBpbmcgdHlwZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgYmVpbmcgZGlzcGxheWVkCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB2YXJpb3VzIHdpZGdldHMKLQkgKiBAcmV0dXJuIFRoZSBjb21wb3NpdGUgZGlzcGxheWluZyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgY2VydGFpbiBtYXBwaW5nCi0JICovCi0JSnBhQ29tcG9zaXRlPFQ+IGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTZkYjk0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9EZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlsczsKKworLyoqCisgKgorICoKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFQ+IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxUPgoreworCisJLyoqCisJICogUmV0dXJucyBhIHVuaXF1ZSBzdHJpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUga2V5IG9mIHRoZSBtYXBwaW5nIGluIHRoZQorCSAqIGNvcmUuICBGb3IgYSBkZWZhdWx0IG1hcHBpbmcgdGhlIG1ldGhvZCBnZXRLZXkoKSB3aWxsIHJldHVybiBudWxsIHNpbmNlCisJICogdGhhdCBpcyBmb3IgdGhlIHNwZWNpZmllZCBtYXBwaW5nLiAgVGhpcyB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCBtYXBwaW5nIGtleSwgbm90IG51bGwKKwkgKi8KKwlTdHJpbmcgZ2V0RGVmYXVsdEtleSgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvSnBhQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0pwYUNvbXBvc2l0ZS5qYXZhCmluZGV4IDQyNWFmZjIuLjMwNzkzZGQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvSnBhQ29tcG9zaXRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9KcGFDb21wb3NpdGUuamF2YQpAQCAtMjEsMTUgKzIxLDcgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBKcGFDb21wb3NpdGU8VD4gewotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBjb21wb3NpdGUgaXQgc2hvdWxkIHBvcHVsYXRlcyBpdHMgd2lkZ2V0cyB1c2luZyB0aGUgZ2l2ZW4KLQkgKiBtb2RlbCBvYmplY3QuCi0JICoKLQkgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHVzZWQgdG8gcmV0cmlldmUgdGhlIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZAotCSAqLwotCXZvaWQgcG9wdWxhdGUoKTsKK3B1YmxpYyBpbnRlcmZhY2UgSnBhQ29tcG9zaXRlIHsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIGFjdHVhbCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9KcGFEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9KcGFEZXRhaWxzUGFnZS5qYXZhCmluZGV4IDUyYTc5ZWQuLjUxZjhkNzcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvSnBhRGV0YWlsc1BhZ2UuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0pwYURldGFpbHNQYWdlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTMsNyArMTMsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CiAKIC8qKgotICogQSBkZXRhaWxzIHBhZ2UgaXMgdXNlZCB0byBzaG93IHRoZSBwcm9wZXJ5IHBhbmUgZm9yIGEgZ2l2ZW4gY29udGV4dCBub2RlLiBUaGUKKyAqIEEgZGV0YWlscyBwYWdlIGlzIHVzZWQgdG8gc2hvdyB0aGUgcHJvcGVydHkgcGFuZSBmb3IgYSBnaXZlbiBjb250ZXh0IG5vZGUuIFRoZQogICoge0BsaW5rIEpwYURldGFpbHNQcm92aWRlcn0gaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBwYW5lLgogICoKICAqIEBzZWUgSnBhRGV0YWlsc1Byb3ZpZGVyCkBAIC00Myw0ICs0Myw5IEBACiAJICogbmVlZHMgdG8gYmUgcmVtb3ZlZAogCSAqLwogCXZvaWQgc2V0U3ViamVjdChUIHN1YmplY3QpOworCQorCS8qKgorCSAqIERpc3Bvc2UgdGhlIGRldGFpbHMgcGFnZSBhbmQgYW55IHJlc291cmNlcyBpdCBob2xkcy4KKwkgKi8KKwl2b2lkIGRpc3Bvc2UoKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0pwYURldGFpbHNQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9KcGFEZXRhaWxzUHJvdmlkZXIuamF2YQppbmRleCBiNWJkZmE3Li41NWMzMGY1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL0pwYURldGFpbHNQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvSnBhRGV0YWlsc1Byb3ZpZGVyLmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKICAqCiAgKiBAc2VlIEpwYURldGFpbHNQYWdlCiAgKgotICogQHZlcnNpb24gMi4wCisgKiBAdmVyc2lvbiAzLjAKICAqIEBzaW5jZSAyLjAKICAqCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbApAQCAtMzEsNiArMzEsMTEgQEAKIHB1YmxpYyBpbnRlcmZhY2UgSnBhRGV0YWlsc1Byb3ZpZGVyCiB7CiAJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhpcyBwcm92aWRlciByZXR1cm5zIGEgZGV0YWlscyBwYWdlIGZvciB0aGUgZ2l2ZW4gc3RydWN0dXJlIG5vZGUKKwkgKi8KKwlib29sZWFuIHByb3ZpZGVzRGV0YWlscyhKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUpOworCQorCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgZGV0YWlscyBwYWdlIGJhc2VkIG9uIHRoZSBnaXZlbiBjb250ZW50IG5vZGUgaWQuCiAJICoKIAkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCkBAIC0zOCw4ICs0Myw4IEBACiAJICogcGFnZSB0byBjcmVhdGUKIAkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKIAkgKi8KKwkvL1RPRE8gU2hvdWxkIHdlIHBhc3MgaW4gSnBhVWlGYWN0b3J5IHNvIHRoZXNlIHBhZ2VzIGNhbiBiZSBidWlsdCB1c2luZyB0aGUgZmFjdG9yeSBhbmQgb3ZlcnJpZGVuPwogCUpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBidWlsZERldGFpbHNQYWdlKAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlPYmplY3QgY29udGVudE5vZGVJZCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvSnBhUGFnZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9KcGFQYWdlQ29tcG9zaXRlLmphdmEKaW5kZXggYWRkYTEwZi4uZWUxZjMxYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9KcGFQYWdlQ29tcG9zaXRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9KcGFQYWdlQ29tcG9zaXRlLmphdmEKQEAgLTIxLDcgKzIxLDcgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBKcGFQYWdlQ29tcG9zaXRlPFQ+IGV4dGVuZHMgSnBhQ29tcG9zaXRlPFQ+IHsKK3B1YmxpYyBpbnRlcmZhY2UgSnBhUGFnZUNvbXBvc2l0ZSBleHRlbmRzIEpwYUNvbXBvc2l0ZSB7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBoZWxwIElELiBUaGlzIElEIHdpbGwgYmUgdXNlZCBpZiB0aGUgaGVscCBidXR0b24gaXMgaW52b2tlZC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGExOWRjMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCisvKioKKyAqIEEgVUkgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgdG8gcHJvdmlkZSB0aGUgc3VwcG9ydCBmb3IgZGlzcGxheWluZyB0aGUKKyAqIGluZm9ybWF0aW9uIGZvciBhIGNlcnRhaW4gbWFwcGluZyB0eXBlLgorICoKKyAqIEBzZWUgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24KKyAqIEBzZWUgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uCisgKgorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMi4wCisgKiAKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdVaURlZmluaXRpb248VD4geworCisJLyoqCisJICogUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIHRleHQgb2YgdGhlIG1hcHBpbmcgdHlwZS4KKwkgKgorCSAqIEByZXR1cm4gQSBkaXNwbGF5IHN0cmluZyBmb3IgdGhlIG1hcHBpbmcgdHlwZQorCSAqLworCVN0cmluZyBnZXRMYWJlbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIHRleHQgb2YgdGhlIG1hcHBpbmcgdHlwZSB0byBiZSB1c2VkIGluIHRoZSBtYXBwaW5nIGNoYW5nZSBsaW5rIGxhYmVsCisJICovCisJU3RyaW5nIGdldExpbmtMYWJlbCgpOworCQorCS8qKgorCSAqIFJldHVybnMgYW4gaW1hZ2UgdGhhdCByZXByZXNlbnRzIHRoZSBtYXBwaW5nIHR5cGUgZGVmaW5lZCBieSB0aGlzIHByb3ZpZGVyLgorCSAqCisJICogQHJldHVybiBBbiBpbWFnZSByZXByZXNlbnRpbmcgYSBtYXBwaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGltYWdlCisJICogaXMgcmVxdWlyZWQKKwkgKi8KKwlJbWFnZSBnZXRJbWFnZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIHVuaXF1ZSBzdHJpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUga2V5IG9mIHRoZSBtYXBwaW5nIGluIHRoZQorCSAqIGNvcmUgKEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBhbmQvb3IgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGtleSByZXByZXNlbnRpbmcgdGhlIG1hcHBpbmcKKwkgKi8KKwlTdHJpbmcgZ2V0S2V5KCk7Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL01hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL01hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYjVhZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9NYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEEgVUkgcHJvdmlkZXIgaXMgcmVwb25zaWJsZSB0byBwcm92aWRlIHRoZSBzdXBwb3J0IGZvciBkaXNwbGF5aW5nIHRoZQotICogaW5mb3JtYXRpb24gZm9yIGEgY2VydGFpbiBtYXBwaW5nIHR5cGUuCi0gKgotICogQHNlZSBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcgotICogQHNlZSBUeXBlTWFwcGluZ1VpUHJvdmlkZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFwcGluZ1VpUHJvdmlkZXI8VD4gewotCi0JLyoqCi0JICogUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIHRleHQgb2YgdGhlIG1hcHBpbmcgdHlwZS4KLQkgKgotCSAqIEByZXR1cm4gQSBkaXNwbGF5IHN0cmluZyBmb3IgdGhlIG1hcHBpbmcgdHlwZQotCSAqLwotCVN0cmluZyBnZXRMYWJlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIG1hcHBpbmcgdHlwZSBkZWZpbmVkIGJ5IHRoaXMgcHJvdmlkZXIuCi0JICoKLQkgKiBAcmV0dXJuIEFuIGltYWdlIHJlcHJlc2VudGluZyBhIG1hcHBpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaW1hZ2UKLQkgKiBpcyByZXF1aXJlZAotCSAqLwotCUltYWdlIGdldEltYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdW5pcXVlIHN0cmluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgb2YgdGhlIG1hcHBpbmcgaW4gdGhlCi0JICogY29yZSAoSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBhbmQvb3IgT3JtQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGtleSByZXByZXNlbnRpbmcgdGhlIG1hcHBpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGluZ0tleSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9UeXBlTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvVHlwZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDZlZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9UeXBlTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZU1hcHBpbmdVaVByb3ZpZGVyPFQgZXh0ZW5kcyBUeXBlTWFwcGluZz4gZXh0ZW5kcyBNYXBwaW5nVWlQcm92aWRlcjxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB0aGF0IGNvcnJlcG9uZHMgdG8gdGhpcyBtYXBwaW5nIHR5cGUuCi0JICogVGhpcyB3aWxsIGJlIGRpc3BsYXllZCBieSB0aGUgPGNvZGU+UGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZTwvY29kZT4gd2hlbgotCSAqIHRoZSBtYXBwaW5nIGtleSBtYXRjaGVzIHRoZSBrZXkgZ2l2ZW4gYnkgdGhpcyBwcm92aWRlci4gVGhlIGNvbXBvc2l0ZXMKLQkgKiB3aWxsIGJlIHN0b3JlZCBpbiBhIE1hcCB3aXRoIHRoZSBtYXBwaW5nIGtleSBhcyB0aGUga2V5LgotCSAqCi0JICogQHBhcmFtIGZhY3RvcnkgVGhlIFVJIGZhY3RvcnkgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSByaWdodCBjb21wb3NpdGUKLQkgKiBmb3IgYW55IG1hcHBpbmcgdHlwZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgYmVpbmcgZGlzcGxheWVkCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB2YXJpb3VzIHdpZGdldHMKLQkgKiBAcmV0dXJuIFRoZSBjb21wb3NpdGUgZGlzcGxheWluZyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgY2VydGFpbiBtYXBwaW5nCi0JICovCi0JSnBhQ29tcG9zaXRlPFQ+IGJ1aWxkUGVyc2lzdGVudFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQlKcGFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjZjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL2phdmEvRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb247CisKKy8qKgorICoKKyAqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248VCBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IAorCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248VD4sIERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFQ+Cit7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlMjNhOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkRlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uOworCisvKioKKyAqCisgKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGVmYXVsdEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgVHlwZU1hcHBpbmc+IGV4dGVuZHMgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPFQ+LCBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjxUPgoreworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9qYXZhL0phdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA3NmYyYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICoKKyAqCisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KKyAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKKyAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPFQ+Cit7CisJLyoqCisJICogQ3JlYXRlcyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBtYXBwaW5nIHR5cGUuCisJICogVGhpcyB3aWxsIGJlIGRpc3BsYXllZCBieSB0aGUgPGNvZGU+UGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlPC9jb2RlPgorCSAqIHdoZW4gdGhlIG1hcHBpbmcga2V5IG1hdGNoZXMgdGhlIGtleSBnaXZlbiBieSB0aGlzIHByb3ZpZGVyLiBUaGUKKwkgKiBjb21wb3NpdGVzIHdpbGwgYmUgc3RvcmVkIGluIGEgTWFwIHdpdGggdGhlIG1hcHBpbmcga2V5IGFzIHRoZSBrZXkuCisJICoKKwkgKiBAcGFyYW0gZmFjdG9yeSBUaGUgVUkgZmFjdG9yeSByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIHJpZ2h0IGNvbXBvc2l0ZQorCSAqIGZvciBhbnkgbWFwcGluZyB0eXBlCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCBiZWluZyBkaXNwbGF5ZWQKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHZhcmlvdXMgd2lkZ2V0cworCSAqIEByZXR1cm4gVGhlIGNvbXBvc2l0ZSBkaXNwbGF5aW5nIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBjZXJ0YWluIG1hcHBpbmcKKwkgKi8KKwlKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCisJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvamF2YS9KYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvamF2YS9KYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzcwYTA1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9qYXZhL0phdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqCisgKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBUeXBlTWFwcGluZz4gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPFQ+Cit7CisJLyoqCisJICogQ3JlYXRlcyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBtYXBwaW5nIHR5cGUuCisJICogVGhpcyB3aWxsIGJlIGRpc3BsYXllZCBieSB0aGUgPGNvZGU+UGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZTwvY29kZT4gd2hlbgorCSAqIHRoZSBtYXBwaW5nIGtleSBtYXRjaGVzIHRoZSBrZXkgZ2l2ZW4gYnkgdGhpcyBwcm92aWRlci4gVGhlIGNvbXBvc2l0ZXMKKwkgKiB3aWxsIGJlIHN0b3JlZCBpbiBhIE1hcCB3aXRoIHRoZSBtYXBwaW5nIGtleSBhcyB0aGUga2V5LgorCSAqCisJICogQHBhcmFtIGZhY3RvcnkgVGhlIFVJIGZhY3RvcnkgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSByaWdodCBjb21wb3NpdGUKKwkgKiBmb3IgYW55IG1hcHBpbmcgdHlwZQorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgYmVpbmcgZGlzcGxheWVkCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB2YXJpb3VzIHdpZGdldHMKKwkgKiBAcmV0dXJuIFRoZSBjb21wb3NpdGUgZGlzcGxheWluZyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgY2VydGFpbiBtYXBwaW5nCisJICovCisJSnBhQ29tcG9zaXRlIGJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCisJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9qYXZhL0phdmFVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvamF2YS9KYXZhVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmOWJkYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvamF2YS9KYXZhVWlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFVzZSB7QGxpbmsgSmF2YVVpRmFjdG9yeX0gdG8gY3JlYXRlIGFueSBqYXZhIEpQQSBjb21wb3NpdGVzCisgKiA8cD4KKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCisgKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4KKyAqIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nCisgKiBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdAorICogY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICoKKyAqCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGludGVyZmFjZSBKYXZhVWlGYWN0b3J5Cit7CQorCQorCS8vICoqKioqKioqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGEgPGNvZGU+SmF2YU1hcHBlZFN1cGVyY2xhc3M8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWFwcGVkIHN1cGVyY2xhc3MKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KKwkgKi8KKwlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKKwkJQ29tcG9zaXRlIHBhcmVudCwKKwkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPkphdmFFbnRpdHk8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgamF2YSBlbnRpdHkKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KKwkgKi8KKwlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVudGl0eUNvbXBvc2l0ZSgKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkphdmFFbWJlZGRhYmxlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGVtYmVkZGFibGUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KKwkgKi8KKwlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGFibGVDb21wb3NpdGUoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKKwkJQ29tcG9zaXRlIHBhcmVudCwKKwkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIG9ybSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1NYXBwZWRTdXBlcmNsYXNzPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG1hcHBlZCBzdXBlcmNsYXNzCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCisJICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+CisJICovCisJSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtRW50aXR5PC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG9ybSBlbnRpdHkKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KKwkgKi8KKwlKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW50aXR5Q29tcG9zaXRlKAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1FbWJlZGRhYmxlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGVtYmVkZGFibGUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KKwkgKi8KKwlKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZSgKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisJCisJCisJLy8gKioqKioqKioqKioqKioqKiBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKgorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhSWRNYXBwaW5nPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIElEIG1hcHBpbmcKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KKwkgKi8KKwlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUlkTWFwcGluZ0NvbXBvc2l0ZSgKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkphdmFFbWJlZGRlZElkTWFwcGluZzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBlbWJlZGRlZCBJRCBtYXBwaW5nCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCisJICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+CisJICovCisJSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZSgKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJQ29tcG9zaXRlIHBhcmVudCwKKwkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGEgPGNvZGU+SmF2YUJhc2ljTWFwcGluZzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBiYXNpYyBtYXBwaW5nCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCisJICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+CisJICovCisJSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFCYXNpY01hcHBpbmdDb21wb3NpdGUoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhVmVyc2lvbk1hcHBpbmc8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdmVyc2lvbiBtYXBwaW5nCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCisJICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+CisJICovCisJSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSgKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFWZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJQ29tcG9zaXRlIHBhcmVudCwKKwkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGEgPGNvZGU+SmF2YU1hbnlUb09uZU1hcHBpbmc8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWFueSB0byBvbmUgbWFwcGluZworCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cworCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgorCSAqLworCUpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhT25lVG9NYW55TWFwcGluZzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBvbmUgdG8gbWFueSBtYXBwaW5nCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCisJICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+CisJICovCisJSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkphdmFPbmVUb09uZU1hcHBpbmc8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgb25lIHRvIG9uZSBtYXBwaW5nCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCisJICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+CisJICovCisJSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhTWFueVRvTWFueU1hcHBpbmc8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWFueSB0byBtYW55IG1hcHBpbmcKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KKwkgKi8KKwlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhRW1iZWRkZWRNYXBwaW5nPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGVtYmVkZGVkIG1hcHBpbmcKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KKwkgKi8KKwlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkphdmFUcmFuc2llbnRNYXBwaW5nPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRyYW5zaWVudCBtYXBwaW5nCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCisJICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+CisJICovCisJSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YVRyYW5zaWVudE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisJCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9vcm0vT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9vcm0vT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMjEyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9kZXRhaWxzL29ybS9Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqCisgKgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKKyAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKKyAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCisgKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCisgKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPFQ+Cit7CisJCisJLyoqCisJICogQ3JlYXRlcyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBtYXBwaW5nIHR5cGUuCisJICogVGhpcyB3aWxsIGJlIGRpc3BsYXllZCBieSB0aGUgPGNvZGU+UGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlPC9jb2RlPgorCSAqIHdoZW4gdGhlIG1hcHBpbmcga2V5IG1hdGNoZXMgdGhlIGtleSBnaXZlbiBieSB0aGlzIHByb3ZpZGVyLiBUaGUKKwkgKiBjb21wb3NpdGVzIHdpbGwgYmUgc3RvcmVkIGluIGEgTWFwIHdpdGggdGhlIG1hcHBpbmcga2V5IGFzIHRoZSBrZXkuCisJICoKKwkgKiBAcGFyYW0gZmFjdG9yeSBUaGUgVUkgZmFjdG9yeSByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIHJpZ2h0IGNvbXBvc2l0ZQorCSAqIGZvciBhbnkgbWFwcGluZyB0eXBlCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCBiZWluZyBkaXNwbGF5ZWQKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHZhcmlvdXMgd2lkZ2V0cworCSAqIEByZXR1cm4gVGhlIGNvbXBvc2l0ZSBkaXNwbGF5aW5nIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBjZXJ0YWluIG1hcHBpbmcKKwkgKi8KKwlKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9vcm0vT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvb3JtL09ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjZmY1NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvb3JtL09ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKgorICoKKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCisgKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCisgKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQorICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQorICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBUeXBlTWFwcGluZz4gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPFQ+Cit7CisJLyoqCisJICogQ3JlYXRlcyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHRoYXQgY29ycmVwb25kcyB0byB0aGlzIG1hcHBpbmcgdHlwZS4KKwkgKiBUaGlzIHdpbGwgYmUgZGlzcGxheWVkIGJ5IHRoZSA8Y29kZT5QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlPC9jb2RlPiB3aGVuCisJICogdGhlIG1hcHBpbmcga2V5IG1hdGNoZXMgdGhlIGtleSBnaXZlbiBieSB0aGlzIHByb3ZpZGVyLiBUaGUgY29tcG9zaXRlcworCSAqIHdpbGwgYmUgc3RvcmVkIGluIGEgTWFwIHdpdGggdGhlIG1hcHBpbmcga2V5IGFzIHRoZSBrZXkuCisJICoKKwkgKiBAcGFyYW0gZmFjdG9yeSBUaGUgVUkgZmFjdG9yeSByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIHJpZ2h0IGNvbXBvc2l0ZQorCSAqIGZvciBhbnkgbWFwcGluZyB0eXBlCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCBiZWluZyBkaXNwbGF5ZWQKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHZhcmlvdXMgd2lkZ2V0cworCSAqIEByZXR1cm4gVGhlIGNvbXBvc2l0ZSBkaXNwbGF5aW5nIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBjZXJ0YWluIG1hcHBpbmcKKwkgKi8KKwlKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCisJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvb3JtL09ybVhtbFVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvZGV0YWlscy9vcm0vT3JtWG1sVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVlYjdjNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2RldGFpbHMvb3JtL09ybVhtbFVpRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVXNlIHtAbGluayBPcm1YbWxVaUZhY3Rvcnl9IHRvIGNyZWF0ZSBhbnkgT1JNIEpQQSBjb21wb3NpdGVzCisgKiA8cD4KKyAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCisgKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4KKyAqIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nCisgKiBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdAorICogY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkJhc2VKcGFVaUZhY3RvcnkKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGludGVyZmFjZSBPcm1YbWxVaUZhY3RvcnkKK3sKKwkKKwkvLyAqKioqKioqKioqKioqKioqIG9ybSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1NYXBwZWRTdXBlcmNsYXNzPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG1hcHBlZCBzdXBlcmNsYXNzCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCisJICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+CisJICovCisJSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtRW50aXR5PC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG9ybSBlbnRpdHkKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KKwkgKi8KKwlKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW50aXR5Q29tcG9zaXRlKAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1FbWJlZGRhYmxlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGVtYmVkZGFibGUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KKwkgKi8KKwlKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZSgKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisJCisKKwkvLyAqKioqKioqKioqKioqKioqIG9ybSBhdHRyaWJ1dGUgbWFwcGluZyBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqCisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1JZE1hcHBpbmc8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgSUQgbWFwcGluZworCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cworCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgorCSAqLworCUpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1JZE1hcHBpbmdDb21wb3NpdGUoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1JZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1FbWJlZGRlZElkTWFwcGluZzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBlbWJlZGRlZCBJRCBtYXBwaW5nCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCisJICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+CisJICovCisJSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1CYXNpY01hcHBpbmc8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYmFzaWMgbWFwcGluZworCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cworCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgorCSAqLworCUpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1CYXNpY01hcHBpbmdDb21wb3NpdGUoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1CYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1WZXJzaW9uTWFwcGluZzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB2ZXJzaW9uIG1hcHBpbmcKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KKwkgKi8KKwlKcGFDb21wb3NpdGUgY3JlYXRlT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1WZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJQ29tcG9zaXRlIHBhcmVudCwKKwkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPk9ybU1hbnlUb09uZU1hcHBpbmc8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWFueSB0byBvbmUgbWFwcGluZworCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cworCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgorCSAqLworCUpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJQ29tcG9zaXRlIHBhcmVudCwKKwkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPk9ybU9uZVRvTWFueU1hcHBpbmc8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgb25lIHRvIG1hbnkgbWFwcGluZworCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cworCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgorCSAqLworCUpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJQ29tcG9zaXRlIHBhcmVudCwKKwkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPk9ybU9uZVRvT25lTWFwcGluZzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBvbmUgdG8gb25lIG1hcHBpbmcKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KKwkgKi8KKwlKcGFDb21wb3NpdGUgY3JlYXRlT3JtT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtTWFueVRvTWFueU1hcHBpbmc8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWFueSB0byBtYW55IG1hcHBpbmcKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KKwkgKi8KKwlKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJQ29tcG9zaXRlIHBhcmVudCwKKwkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKKwkJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1FbWJlZGRlZE1hcHBpbmc8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgZW1iZWRkZWQgbWFwcGluZworCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cworCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgorCSAqLworCUpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1UcmFuc2llbnRNYXBwaW5nPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRyYW5zaWVudCBtYXBwaW5nCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCisJICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+CisJICovCisJSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybVRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1UcmFuc2llbnRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0Fic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9BYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTFmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9BYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLlJlc291cmNlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlMaXN0SXRlcmF0b3I7CisKKy8qKgorICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHVpIHByb3ZpZGVyIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKKyAqIGl0IGlzIGluaXRpYWxpemVkKS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyIGltcGxlbWVudHMgSnBhUGxhdGZvcm1VaVByb3ZpZGVyCit7CisJcHJpdmF0ZSBKcGFEZXRhaWxzUHJvdmlkZXJbXSBkZXRhaWxzUHJvdmlkZXJzOworCisJcHJpdmF0ZSBSZXNvdXJjZVVpRGVmaW5pdGlvbltdIHJlc291cmNlVWlEZWZpbml0aW9uczsKKwkKKwkvKioKKwkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyKCkgeworCQlzdXBlcigpOworCX0KKworCisJLy8gKioqKioqKioqKiBkZXRhaWxzIHByb3ZpZGVycyAqKioqKioqKioqCisKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpwYURldGFpbHNQcm92aWRlcj4gZGV0YWlsc1Byb3ZpZGVycygpIHsKKwkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxKcGFEZXRhaWxzUHJvdmlkZXI+KGdldERldGFpbHNQcm92aWRlcnMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgSnBhRGV0YWlsc1Byb3ZpZGVyW10gZ2V0RGV0YWlsc1Byb3ZpZGVycygpIHsKKwkJaWYgKHRoaXMuZGV0YWlsc1Byb3ZpZGVycyA9PSBudWxsKSB7CisJCQl0aGlzLmRldGFpbHNQcm92aWRlcnMgPSB0aGlzLmJ1aWxkRGV0YWlsc1Byb3ZpZGVycygpOworCQl9CisJCXJldHVybiB0aGlzLmRldGFpbHNQcm92aWRlcnM7CisJfQorCisJcHJvdGVjdGVkIEpwYURldGFpbHNQcm92aWRlcltdIGJ1aWxkRGV0YWlsc1Byb3ZpZGVycygpIHsKKwkJQXJyYXlMaXN0PEpwYURldGFpbHNQcm92aWRlcj4gcHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+KCk7CisJCXRoaXMuYWRkRGV0YWlsc1Byb3ZpZGVyc1RvKHByb3ZpZGVycyk7CisJCXJldHVybiBwcm92aWRlcnMudG9BcnJheShuZXcgSnBhRGV0YWlsc1Byb3ZpZGVyW3Byb3ZpZGVycy5zaXplKCldKTsKKwl9CisKKwkvKioKKwkgKiBJbXBsZW1lbnQgdGhpcyB0byBzcGVjaWZ5IEpQQSBkZXRhaWxzIHByb3ZpZGVycy4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGREZXRhaWxzUHJvdmlkZXJzVG8oTGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycyk7CisJCisJCisJCisJLy8gKioqKioqKioqKiBzdHJ1Y3R1cmUgcHJvdmlkZXJzICoqKioqKioqKioKKworCXB1YmxpYyBMaXN0SXRlcmF0b3I8UmVzb3VyY2VVaURlZmluaXRpb24+IHJlc291cmNlVWlEZWZpbml0aW9ucygpIHsKKwkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxSZXNvdXJjZVVpRGVmaW5pdGlvbj4oZ2V0UmVzb3VyY2VVaURlZmluaXRpb25zKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFJlc291cmNlVWlEZWZpbml0aW9uW10gZ2V0UmVzb3VyY2VVaURlZmluaXRpb25zKCkgeworCQlpZiAodGhpcy5yZXNvdXJjZVVpRGVmaW5pdGlvbnMgPT0gbnVsbCkgeworCQkJdGhpcy5yZXNvdXJjZVVpRGVmaW5pdGlvbnMgPSB0aGlzLmJ1aWxkUmVzb3VyY2VVaURlZmluaXRpb25zKCk7CisJCX0KKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VVaURlZmluaXRpb25zOworCX0KKworCXByb3RlY3RlZCBSZXNvdXJjZVVpRGVmaW5pdGlvbltdIGJ1aWxkUmVzb3VyY2VVaURlZmluaXRpb25zKCkgeworCQlBcnJheUxpc3Q8UmVzb3VyY2VVaURlZmluaXRpb24+IGRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4oKTsKKwkJdGhpcy5hZGRSZXNvdXJjZVVpRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7CisJCXJldHVybiBkZWZpbml0aW9ucy50b0FycmF5KG5ldyBSZXNvdXJjZVVpRGVmaW5pdGlvbltkZWZpbml0aW9ucy5zaXplKCldKTsKKwl9CisKKwkvKioKKwkgKiBJbXBsZW1lbnQgdGhpcyB0byBzcGVjaWZ5IEpQQSBtYXBwaW5nIGZpbGUgdWkgZGVmaW5pdGlvbnMuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oTGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpOworCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0FzeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Y2Y0NzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIENvbW1hbmRFeGVjdXRvciBjYW4gYmUgdXNlZCBieSBhIG5vbi1VSQotICogdGhyZWFkIHRvIGFzeW5jaHJvbm91c2x5IG1vZGlmeSBhIEpQQSBwcm9qZWN0IHdpdGggYW55IG9iamVjdHMgYXNzb2NpYXRlZAotICogd2l0aCBkb2N1bWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXllZCBpbiB0aGUgVUkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvcgotCWltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kRXhlY3V0b3IgSU5TVEFOQ0UgPSBuZXcgQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IoKTsKLQotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZEV4ZWN1dG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCXByaXZhdGUgQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJdGhpcy5kaXNwbGF5KCkuYXN5bmNFeGVjKHRoaXMuYnVpbGRSdW5uYWJsZShjb21tYW5kKSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRGlzcGxheSBkaXNwbGF5KCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJcmV0dXJuIChkaXNwbGF5ICE9IG51bGwpID8gZGlzcGxheSA6IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvQmFzZUpwYVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvQmFzZUpwYVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWFkMzdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0Jhc2VKcGFVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5KYXZhRW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkJhc2ljTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5FbWJlZGRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5JZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLk9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLlRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuVmVyc2lvbk1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5kZXRhaWxzLk9ybUVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBVSSBmYWN0b3J5IHJlcXVpcmVkIHRvIHNob3cgdGhlIGluZm9ybWF0aW9uCi0gKiByZWxhdGVkIHRvIGEgSlBBIG1hcHBpbmcgKHR5cGUgb3IgYXR0cmlidXRlKS4KLSAqCi0gKiBAc2VlIEpwYVVpRmFjdG9yeQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUpwYVVpRmFjdG9yeSBpbXBsZW1lbnRzIEpwYVVpRmFjdG9yeQotewotCXB1YmxpYyBKcGFDb21wb3NpdGU8QmFzaWNNYXBwaW5nPiBjcmVhdGVCYXNpY01hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBuZXcgQmFzaWNNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZTxFbWJlZGRhYmxlPiBjcmVhdGVFbWJlZGRhYmxlQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBFbWJlZGRhYmxlQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZTxFbWJlZGRlZElkTWFwcGluZz4gY3JlYXRlRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGU8RW1iZWRkZWRNYXBwaW5nPiBjcmVhdGVFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBuZXcgRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZTxKYXZhRW50aXR5PiBjcmVhdGVKYXZhRW50aXR5Q29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBKYXZhRW50aXR5Q29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZTxPcm1FbnRpdHk+IGNyZWF0ZU9ybUVudGl0eUNvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBPcm1FbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlPElkTWFwcGluZz4gY3JlYXRlSWRNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gbmV3IElkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGU8TWFueVRvTWFueU1hcHBpbmc+IGNyZWF0ZU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8TWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBuZXcgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlPE1hbnlUb09uZU1hcHBpbmc+IGNyZWF0ZU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gbmV3IE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlPE1hcHBlZFN1cGVyY2xhc3M+IGNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gbmV3IE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlPE9uZVRvTWFueU1hcHBpbmc+IGNyZWF0ZU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gbmV3IE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlPE9uZVRvT25lTWFwcGluZz4gY3JlYXRlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gbmV3IE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SnBhUGFnZUNvbXBvc2l0ZTxQZXJzaXN0ZW5jZVVuaXQ+PiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGVzKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlBcnJheUxpc3Q8SnBhUGFnZUNvbXBvc2l0ZTxQZXJzaXN0ZW5jZVVuaXQ+PiBwYWdlcyA9Ci0JCQluZXcgQXJyYXlMaXN0PEpwYVBhZ2VDb21wb3NpdGU8UGVyc2lzdGVuY2VVbml0Pj4oMSk7Ci0KLQkJcGFnZXMuYWRkKG5ldyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOwotCQlwYWdlcy5hZGQobmV3IFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCXBhZ2VzLmFkZChuZXcgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQotCQlyZXR1cm4gcGFnZXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZTxUcmFuc2llbnRNYXBwaW5nPiBjcmVhdGVUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VHJhbnNpZW50TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZTxWZXJzaW9uTWFwcGluZz4gY3JlYXRlVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxWZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9FZGl0b3JQYXJ0QWRhcHRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0VkaXRvclBhcnRBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NzY4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9FZGl0b3JQYXJ0QWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OworCisvKioKKyAqIEZhY3RvcnkgdG8gYnVpbGQgYWRhcHRlcnMgZm9yIGEgZWRpdG9yIHBhcnQ6CisgKiAgIC0gSlBBIGZpbGUgKGlmIHRoZSBlZGl0b3IgcGFydCBpcyBhIGZpbGUgZWRpdG9yIGV0Yy4pCisgKiAKKyAqIFNlZSBvcmcuZWNsaXBzZS5qcHQudWkgcGx1Z2luLnhtbC4KKyAqLworcHVibGljIGNsYXNzIEVkaXRvclBhcnRBZGFwdGVyRmFjdG9yeQorCWltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Cit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBBREFQVEVSX0xJU1QgPSBuZXcgQ2xhc3NbXSB7IEpwYUZpbGUuY2xhc3MgfTsKKworCXB1YmxpYyBDbGFzczw/PltdIGdldEFkYXB0ZXJMaXN0KCkgeworCQlyZXR1cm4gQURBUFRFUl9MSVNUOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgQ2xhc3MgYWRhcHRlclR5cGUpIHsKKwkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7CisJCQlyZXR1cm4gdGhpcy5nZXRBZGFwdGVyKChJRWRpdG9yUGFydCkgYWRhcHRhYmxlT2JqZWN0LCBhZGFwdGVyVHlwZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBPYmplY3QgZ2V0QWRhcHRlcihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBDbGFzczw/PiBhZGFwdGVyVHlwZSkgeworCQlpZiAoYWRhcHRlclR5cGUgPT0gSnBhRmlsZS5jbGFzcykgeworCQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmlsZShlZGl0b3JQYXJ0KTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIEpwYUZpbGUgZ2V0SnBhRmlsZShJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KSB7CisJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKKwkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgeworCQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmlsZSgoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgSnBhRmlsZSBnZXRKcGFGaWxlKElGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0KSB7CisJCXJldHVybiB0aGlzLmdldEpwYUZpbGUoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSk7CisJfQorCisJcHJpdmF0ZSBKcGFGaWxlIGdldEpwYUZpbGUoSUZpbGUgZmlsZSkgeworCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvR2VuZXJpY0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvR2VuZXJpY0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZDc2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9HZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5HZW5lcmljSmF2YVJlc291cmNlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1YbWxVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOworCisvKioKKyAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpQQSBwbGF0Zm9ybSBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlCisgKiBpdCBpcyBpbml0aWFsaXplZCkuCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKK3sKKworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBHZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBHZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCkgeworCQlzdXBlcigpOworCX0KKworCisJLy8gKioqKioqKioqKiBkZXRhaWxzIHByb3ZpZGVycyAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkRGV0YWlsc1Byb3ZpZGVyc1RvKExpc3Q8SnBhRGV0YWlsc1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKKwkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oTGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW50aW9ucykgeworCQlkZWZpbnRpb25zLmFkZChHZW5lcmljSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbnRpb25zLmFkZChPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmludGlvbnMuYWRkKFBlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0dlbmVyaWNKcGFVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0dlbmVyaWNKcGFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3YmZjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9HZW5lcmljSnBhVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBVSSBmYWN0b3J5IHJlcXVpcmVkIHRvIHNob3cgdGhlIGluZm9ybWF0aW9uCi0gKiByZWxhdGVkIHRvIGEgSlBBIG1hcHBpbmcgKHR5cGUgb3IgYXR0cmlidXRlKS4KLSAqCi0gKiBAc2VlIEpwYVVpRmFjdG9yeQotICoKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYVVpRmFjdG9yeSBleHRlbmRzIEJhc2VKcGFVaUZhY3RvcnkKLXsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0ltYWdlUmVwb3NpdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSW1hZ2VSZXBvc2l0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkYmU4NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0ltYWdlUmVwb3NpdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGZpbmFsIGNsYXNzIEltYWdlUmVwb3NpdG9yeSB7CisKKwkvLyAqKioqKiBvdmVybGF5cyAqKioqKgorCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RXJyb3JPdmVybGF5SW1hZ2UoKSB7CisJCXJldHVybiBnZXRJbWFnZShFUlJPUl9PVkVSTEFZX0RFU0NSSVBUT1IpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRVJST1JfT1ZFUkxBWV9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoIm92ZXJsYXlzL2Vycm9yLmdpZiIpOworCisJcHVibGljIHN0YXRpYyBJbWFnZSBnZXRXYXJuaW5nT3ZlcmxheUltYWdlKCkgeworCQlyZXR1cm4gZ2V0SW1hZ2UoV0FSTklOR19PVkVSTEFZX0RFU0NSSVBUT1IpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgV0FSTklOR19PVkVSTEFZX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigib3ZlcmxheXMvd2FybmluZy5wbmciKTsKKworCS8vICoqKioqIGJ1dHRvbnMgKioqKioKKwlwdWJsaWMgc3RhdGljIEltYWdlIGdldEFkZEJ1dHRvbkltYWdlKCkgeworCQlyZXR1cm4gZ2V0SW1hZ2UoQUREX0JVVFRPTl9ERVNDUklQVE9SKTsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIEFERF9CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL2FkZC5wbmciKTsKKworCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RWRpdEJ1dHRvbkltYWdlKCkgeworCQlyZXR1cm4gZ2V0SW1hZ2UoRURJVF9CVVRUT05fREVTQ1JJUFRPUik7CisJfQorCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBFRElUX0JVVFRPTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoImJ1dHRvbnMvZWRpdC5wbmciKTsKKworCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RGVsZXRlQnV0dG9uSW1hZ2UoKSB7CisJCXJldHVybiBnZXRJbWFnZShERUxFVEVfQlVUVE9OX0RFU0NSSVBUT1IpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVMRVRFX0JVVFRPTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoImJ1dHRvbnMvZGVsZXRlLnBuZyIpOworCisJcHVibGljIHN0YXRpYyBJbWFnZSBnZXRNb3ZlVXBCdXR0b25JbWFnZSgpIHsKKwkJcmV0dXJuIGdldEltYWdlKE1PVkVfVVBfQlVUVE9OX0RFU0NSSVBUT1IpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgTU9WRV9VUF9CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL21vdmUtdXAucG5nIik7CisKKwlwdWJsaWMgc3RhdGljIEltYWdlIGdldE1vdmVEb3duQnV0dG9uSW1hZ2UoKSB7CisJCXJldHVybiBnZXRJbWFnZShNT1ZFX0RPV05fQlVUVE9OX0RFU0NSSVBUT1IpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgTU9WRV9ET1dOX0JVVFRPTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoImJ1dHRvbnMvbW92ZS1kb3duLnBuZyIpOworCisJcHVibGljIHN0YXRpYyBJbWFnZSBnZXRFeHBhbmRBbGxCdXR0b25JbWFnZSgpIHsKKwkJcmV0dXJuIGdldEltYWdlKEVYUEFORF9BTExfQlVUVE9OX0RFU0NSSVBUT1IpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRVhQQU5EX0FMTF9CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL2V4cGFuZC1hbGwucG5nIik7CisKKwlwdWJsaWMgc3RhdGljIEltYWdlIGdldENvbGxhcHNlQWxsQnV0dG9uSW1hZ2UoKSB7CisJCXJldHVybiBnZXRJbWFnZShDT0xMQVBTRV9BTExfQlVUVE9OX0RFU0NSSVBUT1IpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgQ09MTEFQU0VfQUxMX0JVVFRPTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoImJ1dHRvbnMvY29sbGFwc2UtYWxsLnBuZyIpOworCisJcHVibGljIHN0YXRpYyBJbWFnZSBnZXRSZXN0b3JlRGVmYXVsdHNCdXR0b25JbWFnZSgpIHsKKwkJcmV0dXJuIGdldEltYWdlKFJFU1RPUkVfREVGQVVMVFNfQlVUVE9OX0RFU0NSSVBUT1IpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgUkVTVE9SRV9ERUZBVUxUU19CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL3Jlc3RvcmUtZGVmYXVsdHMucG5nIik7CisKKwlwdWJsaWMgc3RhdGljIEltYWdlIGdldEJyb3dzZUJ1dHRvbkltYWdlKCkgeworCQlyZXR1cm4gZ2V0SW1hZ2UoQlJPV1NFX0JVVFRPTl9ERVNDUklQVE9SKTsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIEJST1dTRV9CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL2Jyb3dzZS5wbmciKTsKKworCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0TWluaUJyb3dzZUJ1dHRvbkltYWdlKCkgeworCQlyZXR1cm4gZ2V0SW1hZ2UoTUlOSV9CUk9XU0VfQlVUVE9OX0RFU0NSSVBUT1IpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgTUlOSV9CUk9XU0VfQlVUVE9OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigiYnV0dG9ucy9icm93c2UtbWluaS5wbmciKTsKKworCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0U2VsZWN0QWxsQnV0dG9uSW1hZ2UoKSB7CisJCXJldHVybiBnZXRJbWFnZShTRUxFQ1RfQUxMX0JVVFRPTl9ERVNDUklQVE9SKTsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIFNFTEVDVF9BTExfQlVUVE9OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigiYnV0dG9ucy9zZWxlY3QtYWxsLnBuZyIpOworCisJcHVibGljIHN0YXRpYyBJbWFnZSBnZXREZXNlbGVjdEFsbEJ1dHRvbkltYWdlKCkgeworCQlyZXR1cm4gZ2V0SW1hZ2UoREVTRUxFQ1RfQUxMX0JVVFRPTl9ERVNDUklQVE9SKTsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0VMRUNUX0FMTF9CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL2Rlc2VsZWN0LWFsbC5wbmciKTsKKworCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0QWRkQ29ubmVjdGlvbkJ1dHRvbkltYWdlKCkgeworCQlyZXR1cm4gZ2V0SW1hZ2UoQUREX0NPTk5FQ1RJT05fQlVUVE9OX0RFU0NSSVBUT1IpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgQUREX0NPTk5FQ1RJT05fQlVUVE9OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigiYnV0dG9ucy9hZGQtY29ubmVjdGlvbi5naWYiKTsKKworCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0UmVjb25uZWN0QnV0dG9uSW1hZ2UoKSB7CisJCXJldHVybiBnZXRJbWFnZShSRUNPTk5FQ1RfQlVUVE9OX0RFU0NSSVBUT1IpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgUkVDT05ORUNUX0JVVFRPTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoImJ1dHRvbnMvcmVjb25uZWN0LnBuZyIpOworCisJLy8gKioqKiogb2JqZWN0cyAqKioqKgorCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RmlsZUltYWdlKCkgeworCQlyZXR1cm4gZ2V0SW1hZ2UoRklMRV9ERVNDUklQVE9SKTsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIEZJTEVfREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJvYmplY3RzL2ZpbGUucG5nIik7CisKKwlwdWJsaWMgc3RhdGljIEltYWdlIGdldEZvbGRlckltYWdlKCkgeworCQlyZXR1cm4gZ2V0SW1hZ2UoRk9MREVSX0RFU0NSSVBUT1IpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRk9MREVSX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigib2JqZWN0cy9mb2xkZXIucG5nIik7CisKKwlwdWJsaWMgc3RhdGljIEltYWdlIGdldFBhY2thZ2VJbWFnZSgpIHsKKwkJcmV0dXJuIGdldEltYWdlKFBBQ0tBR0VfREVTQ1JJUFRPUik7CisJfQorCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBQQUNLQUdFX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigib2JqZWN0cy9wYWNrYWdlLnBuZyIpOworCisJcHVibGljIHN0YXRpYyBJbWFnZSBnZXRUYWJsZUltYWdlKCkgeworCQlyZXR1cm4gZ2V0SW1hZ2UoVEFCTEVfREVTQ1JJUFRPUik7CisJfQorCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBUQUJMRV9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoIm9iamVjdHMvdGFibGUuZ2lmIik7CisKKwlwdWJsaWMgc3RhdGljIEltYWdlIGdldFRhYmxlT2JqSW1hZ2UoKSB7CisJCXJldHVybiBnZXRJbWFnZShUQUJMRV9PQkpfREVTQ1JJUFRPUik7CisJfQorCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBUQUJMRV9PQkpfREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJvYmplY3RzL3RhYmxlX29iai5naWYiKTsKKworCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoKSB7CisJCXJldHVybiBnZXRJbWFnZShDT0xVTU5fREVTQ1JJUFRPUik7CisJfQorCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBDT0xVTU5fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJvYmplY3RzL2NvbHVtbi5naWYiKTsKKworCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0S2V5Q29sdW1uSW1hZ2UoKSB7CisJCXJldHVybiBnZXRJbWFnZShLRVlfQ09MVU1OX0RFU0NSSVBUT1IpOworCX0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgS0VZX0NPTFVNTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoIm9iamVjdHMvY29sdW1uS2V5LmdpZiIpOworCisKKwlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgYnVpbGRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGZpbGVOYW1lKSB7CisJCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oSnB0VWlQbHVnaW4uUExVR0lOX0lELCAiaW1hZ2VzLyIgKyBmaWxlTmFtZSk7CisJfQorCisJLy8gKioqKiogY2FjaGUgKioqKioKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPEltYWdlRGVzY3JpcHRvciwgSW1hZ2U+IENBQ0hFID0gbmV3IEhhc2hNYXA8SW1hZ2VEZXNjcmlwdG9yLCBJbWFnZT4oKTsKKworCXByaXZhdGUgc3RhdGljIEltYWdlIGdldEltYWdlKEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisJCXN5bmNocm9uaXplZCAoQ0FDSEUpIHsKKwkJCUltYWdlIGltYWdlID0gQ0FDSEUuZ2V0KGRlc2NyaXB0b3IpOworCQkJaWYgKGltYWdlID09IG51bGwpIHsKKwkJCQlpbWFnZSA9IGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKKwkJCQlDQUNIRS5wdXQoZGVzY3JpcHRvciwgaW1hZ2UpOworCQkJfQorCQkJcmV0dXJuIGltYWdlOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcGFGaWxlQWRhcHRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYUZpbGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWYwODU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYUZpbGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotCi1wdWJsaWMgY2xhc3MgSnBhRmlsZUFkYXB0ZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLXsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfTElTVCA9IAotCQkJbmV3IENsYXNzW10geyBKcGFGaWxlLmNsYXNzIH07Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBBREFQVEVSX0xJU1Q7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoISAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKChJRWRpdG9yUGFydCkgYWRhcHRhYmxlT2JqZWN0KS5nZXRFZGl0b3JJbnB1dCgpOwotCQkKLQkJaWYgKCEgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlJRmlsZSBmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkuZ2V0RmlsZSgpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQkKLQkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBqcGFQcm9qZWN0LmdldEpwYUZpbGUoZmlsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnBhSGVscENvbnRleHRJZHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYUhlbHBDb250ZXh0SWRzLmphdmEKaW5kZXggODVmNzkxZi4uYTcyNDI4YiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnBhSGVscENvbnRleHRJZHMuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcGFIZWxwQ29udGV4dElkcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCiAgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTQyLDYgKzQyLDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfT1JNX1hNTCA9IFBSRUZJWCArICJvcm1feG1sIjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfU0NIRU1BID0gUFJFRklYICsgImVudGl0eV9zY2hlbWEiOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9UQUJMRSA9IFBSRUZJWCArICJlbnRpdHlfdGFibGUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9DQUNIRUFCTEUgPSBQUkVGSVggKyAiZW50aXR5X2NhY2hlYWJsZSI7CiAKIAkvL1BlcnNpc3RlbnQgQXR0cmlidXRlIGNvbXBvc2l0ZXMKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0NBU0NBREVfVFlQRSA9IFBSRUZJWCArICJtYXBwaW5nX2Nhc2NhZGVUeXBlIjsKQEAgLTYzLDYgKzY0LDggQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0pPSU5fQ09MVU1OX05BTUUgPSBQUkVGSVggKyAibWFwcGluZ19qb2luQ29sdW1uTmFtZSI7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX1JFRkVSRU5DRURfQ09MVU1OID0gUFJFRklYICsgIm1hcHBpbmdfam9pblJlZmVyZW5jZWRDb2x1bW4iOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfSk9JTl9UQUJMRV9OQU1FID0gUFJFRklYICsgIm1hcHBpbmdfam9pblRhYmxlTmFtZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX1RBQkxFX1NDSEVNQSA9IFBSRUZJWCArICJtYXBwaW5nX2pvaW5UYWJsZVNjaGVtYSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX1RBQkxFX0NBVEFMT0cgPSBQUkVGSVggKyAibWFwcGluZ19qb2luVGFibGVDYXRhbG9nIjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0pPSU5fVEFCTEVfQ09MVU1OUyA9IFBSRUZJWCArICJtYXBwaW5nX2pvaW5UYWJsZUpvaW5Db2x1bW5zIjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0pPSU5fVEFCTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMgPSBQUkVGSVggKyAibWFwcGluZ19qb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtbnMiOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfTE9CID0gUFJFRklYICsgIm1hcHBpbmdfbG9iIjsKQEAgLTEwNCwxNyArMTA3LDM2IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0dFTkVSQVRFX0VOVElUSUVTX1RBQkxFUyA9IFBSRUZJWCArICJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllc190YWJsZXMiOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19KUEFfRkFDRVQgPSBQUkVGSVggKyAiZGlhbG9nX0pQQUZhY2V0IjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfSlBBX1BMQVRGT1JNID0gUFJFRklYICsgImRpYWxvZ19KUEFQbGF0Zm9ybSI7CisJCisJLy9OZXcgSlBBIFByb2plY3Qgd2l6YXJkOgogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KUEFfUFJPSkVDVCA9IFBSRUZJWCArICJkaWFsb2dfbmV3SlBBUHJvamVjdCI7CiAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfQ0xBU1NQQVRIID0gUFJFRklYICsgImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2VfY2xhc3NwYXRoIjsKICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9EQVRBQkFTRSA9IFBSRUZJWCArICJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX2RhdGFiYXNlIjsKICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9QQUNLQUdJTkcgPSBQUkVGSVggKyAiZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9wYWNrYWdpbmciOwogIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfSlBBX1BST0pFQ1RfQ1JFQVRJT05fUEFHRSA9IFBSRUZJWCArICJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfSlBBX1BST0pFQ1RfSlBBX0ZBQ0VUID0gUFJFRklYICsgImRpYWxvZ19uZXdKUEFQcm9qZWN0RmFjZXQiOwogCiAJLy9PdGhlcgogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09VVExJTkUgPSBQUkVGSVggKyAicGVyc2lzdGVuY2VPdXRsaW5lIjsKIAotCS8vUGVyc2lzdGVuY2VVbml0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9DT05ORUNUSU9OID0gUFJFRklYICsgInBlcnNpc3RlbmNlVW5pdF9jb25uZWN0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX0dFTkVSQUwgICAgPSBQUkVGSVggKyAicGVyc2lzdGVuY2VVbml0X2dlbmVyYWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfUFJPUEVSVElFUyA9IFBSRUZJWCArICJwZXJzaXN0ZW5jZVVuaXRfcHJvcGVydGllcyI7CisJLy9QZXJzaXN0ZW5jZSBYbWwgRWRpdG9yCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04gPSBQUkVGSVggKyAicGVyc2lzdGVuY2VfY29ubmVjdGlvbiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX0dFTkVSQUwgPSBQUkVGSVggKyAicGVyc2lzdGVuY2VfZ2VuZXJhbCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX1BST1BFUlRJRVMgID0gUFJFRklYICsgInBlcnNpc3RlbmNlX3Byb3BlcnRpZXMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1hNTF9TT1VSQ0UgID0gUFJFRklYICsgInBlcnNpc3RlbmNlX3NvdXJjZSI7CisKKwkvL05ldyBKUEEgRW50aXR5IHdpemFyZAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KUEFfRU5USVRZX0VOVElUWV9DTEFTUyAgPSBQUkVGSVggKyAiZGlhbG9nX2VudGl0eUNsYXNzUGFnZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9FTlRJVFlfRU5USVRZX1BST1BFUlRJRVMgID0gUFJFRklYICsgImRpYWxvZ19lbnRpdHlQcm9wZXJ0aWVzUGFnZSI7CisJCisJLy9HZW5lcmF0ZSBFbnRpdGllcyBXaXphcmQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9FTlRJVElFU19XSVpBUkRfQVNTT0NJQVRJT05fQ0FSRElOQUxJVFkgPSBQUkVGSVggKyAiZGlhbG9nX2Fzc29jaWF0aW9uQ2FyZGluYWxpdHlQYWdlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9FTlRJVElFU19XSVpBUkRfQVNTT0NJQVRJT05fVEFCTEVTID0gUFJFRklYICsgImRpYWxvZ19hc3NvY2lhdGlvblRhYmxlc1BhZ2UiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9DVVNUT01JWkVfREVGQVVMVF9FTlRJVFlfR0VORVJBVElPTiA9IFBSRUZJWCArICJkaWFsb2dfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9DVVNUT01JWkVfSU5ESVZJRFVBTF9FTlRJVElFUyA9IFBSRUZJWCArICJkaWFsb2dfY3VzdG9taXplSW5kaXZpZHVhbEVudGl0aWVzIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9FTlRJVElFU19XSVpBUkRfSk9JTl9DT0xVTU5TID0gUFJFRklYICsgImRpYWxvZ19qb2luQ29sdW1uc1BhZ2UiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9TRUxFQ1RfQ0FTQ0FERSA9IFBSRUZJWCArICJkaWFsb2dfc2VsZWN0Q2FzY2FkZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX1NFTEVDVF9UQUJMRVMgPSBQUkVGSVggKyAiZGlhbG9nX3NlbGVjdFRhYmxlc1BhZ2UiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9UQUJMRV9BU1NPQ0lBVElPTlMgPSBQUkVGSVggKyAiZGlhbG9nX3RhYmxlQXNzb2NpYXRpb25zUGFnZSI7CisKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYUphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnBhSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKaW5kZXggYWQ2YmJiZi4uZGIyOGM1MiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnBhSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnBhSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtNTUsMjEgKzU1LDU2IEBACiAJCQkJCUNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogCX0KIAorCS8qKgorCSAqIFdlIGZhaWwgc2lsZW50bHkgaGVyZSBiZWNhdXNlIChpdCBzZWVtcykgImV4cGVjdGVkIiBleGNlcHRpb25zIG9jY3VyCisJICogbW9yZSBmcmVxdWVudGx5IHRoYW4gaW50ZXJtaXR0ZW50ICJ1bmV4cGVjdGVkIiBleGNlcHRpb25zIHRoYXQgbWlnaHQKKwkgKiBtZXJpdCBpbnZlc3RpZ2F0aW9uIChhbmQgYSBsb2dnZWQgc3RhY2t0cmFjZSBtaWdodCBiZSB0aGUgb25seSBoaW50IGFzCisJICogdG8gd2hhdCBoYXBwZW5lZCkuCisJICogCisJICogV2Ugd2lsbCBnZXQgYW4gImV4cGVjdGVkIiBleGNlcHRpb24gKHR5cGljYWxseSBhIE5QRSkgaGVyZSBpZiB0aGUgdXNlcjoKKwkgKiAgIDEuIG1vZGlmaWVzIHRoZSBKYXZhIHNvdXJjZSBmaWxlIGluIGEgd2F5IHRoYXQgcHV0cyBpdCBkcmFzdGljYWxseSBvdXQKKwkgKiAgICAgb2Ygc3luY2ggd2l0aCB0aGUgRGFsaSBjb250ZXh0IG1vZGVsIChlLmcuIGRlbGV0aW5nIGEgZmllbGQgb3IKKwkgKiAgICAgYW5ub3RhdGlvbikKKwkgKiAgIDIuIGltbWVkaWF0ZWx5IGludm9rZXMgQ29udGVudCBBc3Npc3QgKEN0cmwrU3BhY2UpCisJICogVGhlIEFTVCB3ZSBidWlsZCBoZXJlIHdpbGwgYmUgYmFzZWQgb24gdGhlIGp1c3QtbW9kaWZpZWQgSmF2YSBzb3VyY2U7IGJ1dCwKKwkgKiBzaW5jZSB0aGUgdXNlciBtb3ZlZCBxdWlja2x5IGFuZCB3ZSB3aWxsIG5vdCBoYXZlIHlldCByZWNlaXZlZCBhbnkgSmF2YQorCSAqIGNoYW5nZSBub3RpZmljYXRpb24gKHNpbmNlIHdlIG9ubHkgZ2V0IGEgSmF2YSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHdoZW4KKwkgKiB0aGUgdXNlciBoYXMgcGF1c2VkIHR5cGluZyBmb3IgYXQgbGVhc3QgMC41IHNlY29uZHMpLCB0aGUgY29udGV4dCBtb2RlbAorCSAqIHdpbGwgc3RpbGwgYmUgYmFzZWQgb24gdGhlIHVubW9kaWZpZWQgSmF2YSBzb3VyY2UuIEFzIHRoZSBuZXcgQVNUIGlzCisJICogcGFzc2VkIGRvd24gdGhyb3VnaCB0aGUgY29udGV4dCBtb2RlbCB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYWxsIHRoZSBjb2RlCisJICogZXhwZWN0cyB0byBmaW5kIHRoZSBBU1QgaW4gc3luY2ggd2l0aCB0aGUgbW9kZWwuIFdoZW4gdGhpcyBpcyBub3QgdGhlCisJICogY2FzZSAoZS5nLiBhIGZpZWxkIGluIHRoZSByZXNvdXJjZSBtb2RlbCBpcyBubyBsb25nZXIgcHJlc2VudCBpbiB0aGUgQVNUCisJICogYmVjYXVzZSB0aGUgdXNlciBoYXMgZGVsZXRlZCBpdCBvciBtb2RpZmllZCB0aGUgY29kZSBpbiBzdWNoIGEgd2F5IHRoYXQKKwkgKiB0aGUgcGFyc2VyIGNhbiBubyBsb25nZXIgZGV0ZWN0IHRoZSBmaWVsZCkgdGhlIG1vZGVsIHdpbGwgcHJvYmFibHkgY2hva2UKKwkgKiB3aGVuIGl0IGNhbm5vdCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIEFTVCBub2RlLgorCSAqIAorCSAqIEl0IHNlZW1zIHJlYXNvbmFibGUsIGluIHRoZXNlIHNpdHVhdGlvbnMsIHRvIHNpbXBseSByZXR1cm4gbm8gY29tcGxldGlvbgorCSAqIHByb3Bvc2Fscy4gSWYgdGhlIHVzZXIgc2ltcGx5IHdhaXRzIGEgbW9tZW50IGFuZCB0cmllcyBhZ2Fpbiwgd2Ugd2lsbCBiZQorCSAqIGFibGUgdG8gc3VjY2Vzc2Z1bGx5IGNhbGN1bGF0ZSBzb21lIHByb3Bvc2Fscy4KKwkgKiAKKwkgKiB+Ymp2CisJICovCiAJcHJpdmF0ZSBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewogCQl0cnkgewogCQkJcmV0dXJuIHRoaXMuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHNfKGNvbnRleHQpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkvLyBKcHRDb3JlUGx1Z2luLmxvZyhleCk7ICAvLyBkb24ndCBsb2cgImV4cGVjdGVkIiBleGNlcHRpb25zICg/KQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogCQl9CiAJfQogCi0JcHJpdmF0ZSBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzXyhKYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCXByaXZhdGUgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBjb21wdXRlQ29tcGxldGlvblByb3Bvc2Fsc18oSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjb250ZXh0LmdldENvbXBpbGF0aW9uVW5pdCgpOwogCQlpZiAoY3UgPT0gbnVsbCkgewogCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogCQl9CiAKLQkJSnBhRmlsZSBqcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkpOworCQlJRmlsZSBmaWxlID0gdGhpcy5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoY3UpOworCQlpZiAoZmlsZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJCX0KKworCQlKcGFGaWxlIGpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoZmlsZSk7CiAJCWlmIChqcGFGaWxlID09IG51bGwpIHsKIAkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKIAkJfQpAQCAtMTEzLDYgKzE0OCwxNSBAQAogCQlyZXR1cm4gcHJvcG9zYWxzOwogCX0KIAorCXByaXZhdGUgSUZpbGUgZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKElDb21waWxhdGlvblVuaXQgY3UpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiAoSUZpbGUpIGN1LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKKwkJCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJcHVibGljIExpc3QgY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKQEAgLTEzMyw3ICsxNzcsNyBAQAogCQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7CiAJCX0KIAkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2Uocy50b0NoYXJBcnJheSgpLCBwcmVmaXgpOworCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKHMudG9DaGFyQXJyYXkoKSwgdGhpcy5wcmVmaXgpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcGFNYXBwaW5nSW1hZ2VIZWxwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYU1hcHBpbmdJbWFnZUhlbHBlci5qYXZhCmluZGV4IDRhZDQwYWQuLjVhMmU5Y2EgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYU1hcHBpbmdJbWFnZUhlbHBlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYU1hcHBpbmdJbWFnZUhlbHBlci5qYXZhCkBAIC02Niw2ICs2Niw3IEBACiAJCWVsc2UgaWYgKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7CiAJCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5UUkFOU0lFTlQpOwogCQl9Ci0JCXJldHVybiBudWxsOworCQkvL3JldHVybiB0aGUgSlBBX0NPTlRFTlQgaWNvbiBpbnN0ZWFkIG9mIG51bGwsIG1pZ2h0IGFzIHdlbGwgaGF2ZSBhbiBpY29uIGlmIG9uZSBpcyBub3QgZGVmaW5lZAorCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfQ09OVEVOVCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnB0VWlJY29ucy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnB0VWlJY29ucy5qYXZhCmluZGV4IGViNWZlNjkuLmYxMTMxNTkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwdFVpSWNvbnMuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaUljb25zLmphdmEKQEAgLTMxLDYgKzMxLDggQEAKIAkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfRklMRSA9ICJmdWxsL29iajE2L2pwYS1maWxlIjsgIC8vJE5PTi1OTFMtMSQKIAkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfRklMRSA9ICJmdWxsL29iajE2L2pwYS1qYXItZmlsZSI7ICAvLyROT04tTkxTLTEkCisJCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTklORyA9ICJmdWxsL29iajE2L3dhcm5pbmciOyAgLy8kTk9OLU5MUy0xJAogCQogCQpAQCAtNTIsNiArNTQsOCBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfRklMRV9SRUYgPSAiZnVsbC9vYmoxNi9qcGEtZmlsZSI7ICAvLyROT04tTkxTLTEkCiAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19SRUYgPSAiZnVsbC9vYmoxNi9udWxsLXR5cGUtbWFwcGluZyI7ICAvLyROT04tTkxTLTEkCisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0ZJTEVfUkVGID0gImZ1bGwvb2JqMTYvanBhLWphci1maWxlIjsgIC8vJE5PTi1OTFMtMSQKIAogCiAJLy8gKioqKioqKioqKioqKioqKiBPcm0gaWNvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnB0VWlNZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnB0VWlNZXNzYWdlcy5qYXZhCmluZGV4IDRiYzMzNDQuLmU4NjU0NjAgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwdFVpTWVzc2FnZXMuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaU1lc3NhZ2VzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTIsMTUgKzEyLDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKIAogLyoqCi0gKiBUaGUgcmVzb3VyY2Ugc3RyaW5ncyB1c2VkIGJ5IHRoZSBKUFQgVUkgY2xhc3Nlcy4KKyAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgVUkuCiAgKgogICogQHZlcnNpb24gMi4wCiAgKiBAc2luY2UgMS4wCiAgKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwdFVpTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworcHVibGljIGNsYXNzIEpwdFVpTWVzc2FnZXMgewogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RDaG9vc2VyUGFuZV9icm93c2VCdXR0b247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hvb3NlclBhbmVfYnJvd3NlQnV0dG9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjY2Vzc1R5cGVDb21wb3NpdGVfYWNjZXNzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjY2Vzc1R5cGVDb21wb3NpdGVfZmllbGQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWNjZXNzVHlwZUNvbXBvc2l0ZV9wcm9wZXJ0eTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX2F0dHJpYnV0ZUxhYmVsOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfbWFwcGluZ0xhYmVsOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfbm9NYXBwaW5nS2V5RXJyb3I7CkBAIC0zOCwyMCArNDAsMjIgQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRSZW1vdmVQYW5lX1JlbW92ZUJ1dHRvblRleHQ7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzQ2hvb3NlclBhbmVfZGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2FkZENvbm5lY3Rpb25MaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9jb25uZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9kYXRhYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfZGF0YWJhc2VDb25uZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9yZWNvbm5lY3RMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9yZWNvbm5lY3RUb0RhdGFiYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9zY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3NjaGVtYUluZm87CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9kZXNjOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9zY2hlbWFTZXR0aW5nczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2VfYWRkQ29ubmVjdGlvblRvUHJvamVjdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2VfY29ubmVjdExpbms7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3NjaGVtYTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2VfY29ubmVjdGlvbkluZm87CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3NjaGVtYUluZm87CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgRW51bUNvbWJvVmlld2VyX2RlZmF1bHQ7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgRW51bUNvbWJvVmlld2VyX2RlZmF1bHRXaXRoRGVmYXVsdDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcl9vcGVuaW5nRWRpdG9yOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYWxfYnJvd3NlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYWxfcmV2ZXJ0OwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYWxfZGVzZWxlY3RBbGw7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhbF9zZWxlY3RBbGw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVERExXaXphcmRfdGl0bGU7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9nZW5lcmF0ZUVudGl0aWVzOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2Nob29zZUVudGl0eVRhYmxlOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2VudGl0eU5hbWVDb2x1bW47CkBAIC02MywxNyArNjcsMjMgQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmljUGxhdGZvcm1VaURpYWxvZ19ub3RTdXBwb3J0ZWRNZXNzYWdlVGl0bGU7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhQ29udGVudF9sYWJlbDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFEZXRhaWxzVmlld192aWV3Tm90QXZhaWxhYmxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9hZGREcml2ZXJMaWJyYXJ5TGFiZWw7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MYWJlbDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxpbms7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3RMaW5rOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9jcmVhdGVPcm1YbWxCdXR0b247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2RlZmF1bHRDYXRhbG9nTGFiZWw7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2RlZmF1bHRTY2hlbWFMYWJlbDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfZGVzY3JpcHRpb247CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2Rpc2NvdmVyQ2xhc3Nlc0J1dHRvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfZHJpdmVyTGlicmFyeUxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9tZXRhbW9kZWxTb3VyY2VGb2xkZXJMYWJlbDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfanBhSW1wbGVtZW50YXRpb25MYWJlbDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfanBhUHJlZnNMaW5rOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9saXN0Q2xhc3Nlc0J1dHRvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfbWV0YW1vZGVsTGFiZWw7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX25vbmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX292ZXJyaWRlRGVmYXVsdENhdGFsb2dMYWJlbDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2Vfb3ZlcnJpZGVEZWZhdWx0U2NoZW1hTGFiZWw7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX3BlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRMYWJlbDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfcGxhdGZvcm1MYWJlbDsKQEAgLTgxLDM5ICs5MSwxMSBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV90aXRsZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfdXNlckxpYnNMaW5rOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV91c2VyU2VydmVyTGliTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhUHJlZmVyZW5jZVBhZ2VfZGVmYXVsdEpwYUxpYjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcmVmZXJlbmNlUGFnZV9pbnZhbGlkSnBhTGliOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVByZWZlcmVuY2VQYWdlX3VzZXJMaWJzTGluazsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFTdHJ1Y3R1cmVWaWV3X2xpbmtXaXRoRWRpdG9yRGVzYzsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFTdHJ1Y3R1cmVWaWV3X2xpbmtXaXRoRWRpdG9yVGV4dDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFTdHJ1Y3R1cmVWaWV3X2xpbmtXaXRoRWRpdG9yVG9vbHRpcDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFTdHJ1Y3R1cmVWaWV3X3N0cnVjdHVyZU5vdEF2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9iYXNpYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9iYXNpY19kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2Jhc2ljX2RlZmF1bHQyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2NoYW5nZU1hcHBpbmdUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfZGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfZW1iZWRkYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9lbWJlZGRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9lbWJlZGRlZF9kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2VtYmVkZGVkX2RlZmF1bHQyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2VtYmVkZGVkaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfZW50aXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2lkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2xhYmVsVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9tYW55dG9tYW55OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX21hbnl0b29uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9tYXBwZWRBdHRyaWJ1dGVUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX21hcHBlZHN1cGVyY2xhc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfbWFwcGVkVHlwZVRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfb25ldG9tYW55OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX29uZXRvb25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX3RyYW5zaWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV91bm1hcHBlZEF0dHJpYnV0ZVRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfdW5tYXBwZWRUeXBlVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV92ZXJzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX3ZpcnR1YWxBdHRyaWJ1dGVUZXh0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVN0cnVjdHVyZVZpZXdfbnVtSXRlbXNTZWxlY3RlZDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZF90aXRsZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2VfdGl0bGU7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2Rlc2M7CkBAIC0xMzUsMTQgKzExNywyMyBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhY2thZ2VDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhY2thZ2VDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeV9wZXJzaXN0ZW5jZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX21hcEFzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRUeXBlUGFnZV9tYXBBczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdGllc0dlbmVyYXRvcl9qb2JOYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVByZWZlcmVuY2VzUGFnZV9EZXNjcmlwdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfRGVmYXVsdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfRGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX0Vycm9yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVByb2JsZW1TZXZlcml0aWVzUGFnZV9JZ25vcmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX0luZm87CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX1dhcm5pbmc7CiAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X3VpIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdFVpTWVzc2FnZXMuY2xhc3M7CiAJc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcygianB0X3VpIiwgSnB0VWlNZXNzYWdlcy5jbGFzcyk7CisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7CiAJfQogCiAJcHJpdmF0ZSBKcHRVaU1lc3NhZ2VzKCkgewogCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZDA5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgY2xhc3MgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzIHsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfTEVWRUxfQ0FURUdPUlk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTk9fSlBBX1BST0pFQ1Q7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9OT19DT05ORUNUSU9OOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfSU5WQUxJRF9DT05ORUNUSU9OOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfSU5BQ1RJVkVfQ09OTkVDVElPTjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9KRUNUX05PX1BFUlNJU1RFTkNFX1hNTDsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfVkVSU0lPTl9OT1RfTEFURVNUOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfTVVMVElQTEVfUEVSU0lTVEVOQ0VfWE1MOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX05PX1BFUlNJU1RFTkNFX1VOSVQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfTVVMVElQTEVfUEVSU0lTVEVOQ0VfVU5JVFM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX0lOVkFMSURfQ09OVEVOVDsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfTEVWRUxfQ0FURUdPUlk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9NQVBQSU5HX0ZJTEU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9VTlNVUFBPUlRFRF9NQVBQSU5HX0ZJTEVfQ09OVEVOVDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX01BUFBJTkdfRklMRTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX0lOVkFMSURfTUFQUElOR19GSUxFOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX01BUFBJTkdfRklMRTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0NMQVNTOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfQ0xBU1M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX0NMQVNTOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0NMQVNTOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfUkVEVU5EQU5UX0NMQVNTOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0pBUl9GSUxFOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfSkFSX0ZJTEU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9KQVJfRklMRV9ERVBMT1lNRU5UX1BBVEhfV0FSTklORzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX0pBUl9GSUxFOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUFBJTkdfRklMRV9FWFRSQU5FT1VTX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOVF9UWVBFX01BUFBFRF9CVVRfTk9UX0lOQ0xVREVEX0lOX1BFUlNJU1RFTkNFX1VOSVQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOVF9UWVBFX0FOTk9UQVRFRF9CVVRfTk9UX0lOQ0xVREVEX0lOX1BFUlNJU1RFTkNFX1VOSVQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOVF9UWVBFX1VOU1BFQ0lGSUVEX0NMQVNTOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfVFlQRV9VTlJFU09MVkVEX0NMQVNTOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9MRVZFTF9DQVRFR09SWTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfTk9fSUQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX1NJTkdMRV9UQUJMRV9ERVNDRU5EQU5UX0RFRklORVNfVEFCTEU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX0FCU1RSQUNUX1RBQkxFX1BFUl9DTEFTU19ERUZJTkVTX1RBQkxFOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9BQlNUUkFDVF9ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX05PTl9ST09UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0RFRklORUQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVEOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX1VOU1BFQ0lGSUVEX05BTUU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5SRVNPTFZFRF9OQU1FOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0lOSEVSSVRFRF9BVFRSSUJVVEVTX05PVF9TVVBQT1JURUQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9NQVBQSU5HOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0ZJTkFMX0ZJRUxEOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX1BVQkxJQ19GSUVMRDsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFUVFJJQlVURV9MRVZFTF9DQVRFR09SWTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNQVBQSU5HX1VOUkVTT0xWRURfTUFQUEVEX0JZOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUFBJTkdfSU5WQUxJRF9NQVBQRURfQlk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUElOR19NQVBQRURfQllfV0lUSF9KT0lOX1RBQkxFOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUFBJTkdfTUFQUEVEX0JZX09OX0JPVEhfU0lERVM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVEFSR0VUX0VOVElUWV9OT1RfREVGSU5FRDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFk7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQSFlTSUNBTF9NQVBQSU5HX0NBVEVHT1JZOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUQUJMRV9VTlJFU09MVkVEX1NDSEVNQTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUQUJMRV9VTlJFU09MVkVEX05BTUU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfTkFNRTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKT0lOX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTFVNTl9VTlJFU09MVkVEX1RBQkxFOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTFVNTl9VTlJFU09MVkVEX05BTUU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgSU1QTElFRF9BVFRSSUJVVEVfQ0FURUdPUlk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfVEFSR0VUX0VOVElUWV9OT1RfREVGSU5FRDsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElNUExJRURfQVNTT0NJQVRJT05fQ0FURUdPUlk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgSU5IRVJJVEFOQ0VfQ0FURUdPUlk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRElTQ1JJTUlOQVRPUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfTk9UX1NVUFBPUlRFRF9PTl9QTEFURk9STTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9QT1JUQUJMRV9PTl9QTEFURk9STTsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFFVRVJJRVNfR0VORVJBVE9SU19DQVRFR09SWTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHRU5FUkFUT1JfRFVQTElDQVRFX05BTUU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSURfTUFQUElOR19VTlJFU09MVkVEX0dFTkVSQVRPUl9OQU1FOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdFTkVSQVRFRF9WQUxVRV9VTlJFU09MVkVEX0dFTkVSQVRPUjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBRVUVSWV9EVVBMSUNBVEVfTkFNRTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfdWlfdmFsaWRhdGlvbl9wcmVmZXJlbmNlcyI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuY2xhc3M7CisJc3RhdGljIHsKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKKwl9CisKKwlwcml2YXRlIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcygpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL1N5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL1N5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5M2QyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9TeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBDb21tYW5kRXhlY3V0b3IgY2FuIGJlIHVzZWQgYnkgYSBub24tVUkKLSAqIHRocmVhZCB0byBzeW5jaHJvbm91c2x5IG1vZGlmeSBhIEpQQSBwcm9qZWN0IHdpdGggYW55IG9iamVjdHMgYXNzb2NpYXRlZAotICogd2l0aCBkb2N1bWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXllZCBpbiB0aGUgVUkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yCi0JaW1wbGVtZW50cyBDb21tYW5kRXhlY3V0b3IKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmRFeGVjdXRvciBJTlNUQU5DRSA9IG5ldyBTeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yKCk7Ci0KLQlwdWJsaWMgc3RhdGljIENvbW1hbmRFeGVjdXRvciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQlwcml2YXRlIFN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJdGhpcy5kaXNwbGF5KCkuc3luY0V4ZWModGhpcy5idWlsZFJ1bm5hYmxlKGNvbW1hbmQpKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoZmluYWwgQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBEaXNwbGF5IGRpc3BsYXkoKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlyZXR1cm4gKGRpc3BsYXkgIT0gbnVsbCkgPyBkaXNwbGF5IDogRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9UcmFjaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9UcmFjaW5nLmphdmEKaW5kZXggM2QxMzg2My4uZDI2MjA4NSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvVHJhY2luZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL1RyYWNpbmcuamF2YQpAQCAtMSwxMSArMSwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAgKgotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CkBAIC04MywxNCArODQsOCBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBib29sZWFuRGVidWdPcHRpb24oU3RyaW5nIGZsYWcsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKQogCXsKLQkJU3RyaW5nIHJlc3VsdCA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEpwdFVpUGx1Z2luLlBMVUdJTl9JRCArIGZsYWcpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJfQotCi0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YocmVzdWx0LnRyaW0oKSk7CisJCVN0cmluZyBzdHJpbmcgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKcHRVaVBsdWdpbi5QTFVHSU5fSUQgKyBmbGFnKTsKKwkJcmV0dXJuIChzdHJpbmcgPT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiBCb29sZWFuLnBhcnNlQm9vbGVhbihzdHJpbmcudHJpbSgpKTsKIAl9CiAKIAkvKioKQEAgLTExOSwxNCArMTE0LDggQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGludCBpbnREZWJ1Z09wdGlvbihTdHJpbmcgZmxhZywgaW50IGRlZmF1bHRWYWx1ZSkKIAl7Ci0JCVN0cmluZyByZXN1bHQgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKcHRVaVBsdWdpbi5QTFVHSU5fSUQgKyBmbGFnKTsKLQotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCXsKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCX0KLQotCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHJlc3VsdCk7CisJCVN0cmluZyBzdHJpbmcgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKcHRVaVBsdWdpbi5QTFVHSU5fSUQgKyBmbGFnKTsKKwkJcmV0dXJuIChzdHJpbmcgPT0gbnVsbCkgPyAgZGVmYXVsdFZhbHVlIDogSW50ZWdlci5wYXJzZUludChzdHJpbmcpOwogCX0KIAogCS8qKgpAQCAtMTY2LDEzICsxNTUsNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ0RlYnVnT3B0aW9uKFN0cmluZyBmbGFnLCBTdHJpbmcgZGVmYXVsdFZhbHVlKQogCXsKLQkJU3RyaW5nIHJlc3VsdCA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEpwdFVpUGx1Z2luLlBMVUdJTl9JRCArIGZsYWcpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJewotCQkJcmVzdWx0ID0gZGVmYXVsdFZhbHVlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKKwkJU3RyaW5nIHN0cmluZyA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEpwdFVpUGx1Z2luLlBMVUdJTl9JRCArIGZsYWcpOworCQlyZXR1cm4gKHN0cmluZyAhPSBudWxsKSA/IHN0cmluZyA6IGRlZmF1bHRWYWx1ZTsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRERMQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRERMQWN0aW9uLmphdmEKaW5kZXggNDliY2UzNS4uZTE0OWZlNCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9HZW5lcmF0ZURETEFjdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVERExBY3Rpb24uamF2YQpAQCAtMjIsNiArMjIsNiBAQAogCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShKcGFQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgdGhpcy5qcGFQbGF0Zm9ybVVpKHByb2plY3QpLmdlbmVyYXRlRERMKHByb2plY3QsIHRoaXMuZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKKyAgICAgICAgdGhpcy5nZXRKcGFQbGF0Zm9ybVVpKHByb2plY3QpLmdlbmVyYXRlRERMKHByb2plY3QsIHRoaXMuZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRW50aXRpZXNBY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVFbnRpdGllc0FjdGlvbi5qYXZhCmluZGV4IDVlNzQ1NzkuLjZiNTgyNjcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVFbnRpdGllc0FjdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVFbnRpdGllc0FjdGlvbi5qYXZhCkBAIC0yMSw2ICsyMSw2IEBACiAKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKEpwYVByb2plY3QgcHJvamVjdCkgewotICAgICAgICB0aGlzLmpwYVBsYXRmb3JtVWkocHJvamVjdCkuZ2VuZXJhdGVFbnRpdGllcyhwcm9qZWN0LCB0aGlzLmdldEN1cnJlbnRTZWxlY3Rpb24oKSk7CisgICAgICAgIHRoaXMuZ2V0SnBhUGxhdGZvcm1VaShwcm9qZWN0KS5nZW5lcmF0ZUVudGl0aWVzKHByb2plY3QsIHRoaXMuZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL09wZW5KcGFSZXNvdXJjZUFjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcGVuSnBhUmVzb3VyY2VBY3Rpb24uamF2YQppbmRleCAyYjkwZjNmLi41MGE3YzIxIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL09wZW5KcGFSZXNvdXJjZUFjdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvT3BlbkpwYVJlc291cmNlQWN0aW9uLmphdmEKQEAgLTg1LDYgKzg1LDkgQEAKIAkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpOwogCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBJREUuZ2V0Q29udGVudFR5cGUoZmlsZSk7CiAJCUlFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TmFtZSgpLCBjb250ZW50VHlwZSk7CisJCWlmIChlZGl0b3JEZXNjcmlwdG9yID09IG51bGwpIHsKKwkJCXJldHVybjsgIC8vIG5vIGVkaXRvciBhc3NvY2lhdGVkLi4uCisJCX0KIAkJCiAJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKIAkJCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1Byb2plY3RBY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvUHJvamVjdEFjdGlvbi5qYXZhCmluZGV4IDY0NzM5ZWQuLmM2MWMwNzEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvUHJvamVjdEFjdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvUHJvamVjdEFjdGlvbi5qYXZhCkBAIC03NCw5ICs3NCw5IEBACiAJCXJldHVybiBudWxsOwogCX0KIAotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVVpIGpwYVBsYXRmb3JtVWkoSnBhUHJvamVjdCBwcm9qZWN0KSB7CisJcHJvdGVjdGVkIEpwYVBsYXRmb3JtVWkgZ2V0SnBhUGxhdGZvcm1VaShKcGFQcm9qZWN0IHByb2plY3QpIHsKIAkJU3RyaW5nIGNvcmVKcGFQbGF0Zm9ybUlkID0gcHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpLmdldElkKCk7Ci0gICAgICAgIHJldHVybiBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkuaW5zdGFuY2UoKS5qcGFQbGF0Zm9ybShjb3JlSnBhUGxhdGZvcm1JZCk7IAorICAgICAgICByZXR1cm4gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1VaShjb3JlSnBhUGxhdGZvcm1JZCk7IAogCX0KIAkKIAlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QpIHsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcEhhbmRsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcEhhbmRsZXIuamF2YQppbmRleCA2MGIzNzg0Li5lNmFhOGUzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBIYW5kbGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwSGFuZGxlci5qYXZhCkBAIC00MCw3ICs0MCw3IEBACiAJCQogCQkvLyBvbmx5IGFwcGxpZXMgZm9yIG11bHRpcGx5IHNlbGVjdGVkIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb2JqZWN0cyBpbiBhIHRyZWUKIAkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IChJdGVyYWJsZTxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPikgQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHNlbGVjdGlvbi5pdGVyYXRvcigpKSkgewotCQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGF0dHJpYnV0ZS5nZXRPcm1QZXJzaXN0ZW50VHlwZSgpOworCQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGF0dHJpYnV0ZS5nZXRQZXJzaXN0ZW50VHlwZSgpOwogCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwogCQkJCiAJCQlBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2cgZGlhbG9nID0gbmV3IEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcERpYWxvZyh3aW5kb3cuZ2V0U2hlbGwoKSwgYXR0cmlidXRlKTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEhhbmRsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEhhbmRsZXIuamF2YQppbmRleCA3MTBlODc5Li4wYjljZmZhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxIYW5kbGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sSGFuZGxlci5qYXZhCkBAIC0zOCw3ICszOCw3IEBACiAJCQogCQkvLyBvbmx5IGFwcGxpZXMgZm9yIG11bHRpcGx5IHNlbGVjdGVkIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb2JqZWN0cyBpbiBhIHRyZWUKIAkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IChJdGVyYWJsZTxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPikgQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHNlbGVjdGlvbi5pdGVyYXRvcigpKSkgewotCQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGF0dHJpYnV0ZS5nZXRPcm1QZXJzaXN0ZW50VHlwZSgpOworCQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGF0dHJpYnV0ZS5nZXRQZXJzaXN0ZW50VHlwZSgpOwogCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwogCQkJYXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKIAkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QXR0cmlidXRlID0gdHlwZS5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1BlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1BlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXIuamF2YQppbmRleCBjZWZiYmNkLi4wYjgyOWU3IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzSGFuZGxlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMTQgKzksMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kczsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1lbnVzLlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5JU291cmNlczsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuSUVsZW1lbnRVcGRhdGVyOwpAQCAtNTEsOCArNDksOSBAQAogCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgTWFwIEFzIGNvbW1hbmQgcGFyYW1ldGVyIHVzZWQgZm9yIDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGU8L2NvZGU+CiAJICogZGVmaW5lZCBpbiB0aGUgPGNvZGU+SnB0VWlQbHVnaW48L2NvZGU+IHBsdWdpbi54bWwuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9QQVJBTUVURVJfSUQgPSAicGVyc2lzdGVudEF0dHJpYnV0ZU1hcHBpbmdLZXkiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQRUNJRklFRF9NQVBQSU5HX0NPTU1BTkRfUEFSQU1FVEVSX0lEID0gInNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBwaW5nS2V5IjsKIAkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX01BUFBJTkdfQ09NTUFORF9QQVJBTUVURVJfSUQgPSAiZGVmYXVsdFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBwaW5nS2V5IjsKIAkKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXI8L2NvZGU+LgpAQCAtNjgsNyArNjcsNyBAQAogCQkJSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXZlbnQpOwogCiAJCS8vIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgdW5pcXVlIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNvbW1hbmQKLQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBldmVudC5nZXRQYXJhbWV0ZXIoQ09NTUFORF9QQVJBTUVURVJfSUQpOworCQlTdHJpbmcgbWFwcGluZ0tleSA9IGV2ZW50LmdldFBhcmFtZXRlcihTUEVDSUZJRURfTUFQUElOR19DT01NQU5EX1BBUkFNRVRFUl9JRCk7CiAKIAkJLy8gQ2hhbmdlIHRoZSBtYXBwaW5nIGtleSBmb3IgYWxsIHRoZSBzZWxlY3RlZCBpdGVtcwogCQlmb3IgKE9iamVjdCBpdGVtIDogc2VsZWN0aW9uLnRvQXJyYXkoKSkgewpAQCAtNzksOCArNzgsNyBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAJCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudChVSUVsZW1lbnQgZWxlbWVudCwgTWFwIHBhcmFtZXRlcnMpIHsKKwlwdWJsaWMgdm9pZCB1cGRhdGVFbGVtZW50KFVJRWxlbWVudCBlbGVtZW50LCBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgTWFwIHBhcmFtZXRlcnMpIHsKIAkJLy8gUmV0cmlldmUgdGhlIHNlbGVjdGlvbiBmb3IgdGhlIFVJRWxlbWVudAogCQkKIAkJLy8gRHVlIHRvIEJ1ZyAyMjY3NDYsIHdlIGhhdmUgdG8gdXNlIEFQSSB3b3JrYXJvdW5kIHRvIHJldHJpZXZlIGN1cnJlbnQgCkBAIC05MiwzMyArOTAsNTQgQEAKIAkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uIAogCQkJPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7CiAJCQotCQlTdHJpbmcgY29tbW9uTWFwcGluZ0tleSA9IGNvbW1vbk1hcHBpbmdLZXkoc2VsZWN0aW9uKTsKLQkJCi0JCVN0cmluZyBoYW5kbGVyTWFwcGluZ0tleSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KENPTU1BTkRfUEFSQU1FVEVSX0lEKTsKLQkJaWYgKGhhbmRsZXJNYXBwaW5nS2V5ICE9IG51bGwpIHsKLQkJCWVsZW1lbnQuc2V0Q2hlY2tlZChoYW5kbGVyTWFwcGluZ0tleS5lcXVhbHMoY29tbW9uTWFwcGluZ0tleSkpOwotCQl9CisJCWVsZW1lbnQuc2V0Q2hlY2tlZChzZWxlY3RlZEVsZW1lbnRzTWFwcGluZ0tleXNNYXRjaChzZWxlY3Rpb24sIHBhcmFtZXRlcnMpKTsKIAl9CiAJCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFN0cmluZyBjb21tb25NYXBwaW5nS2V5KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlTdHJpbmcgY29tbW9uS2V5ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBzdHJlYW0gPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3Qgb2JqID0gc3RyZWFtLm5leHQoKTsKLQkJCQorCS8vQ2hlY2sgYWxsIHRoZSBzZWxlY3RlZCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBhbmQgdmVyaWZ5IHRoYXQgdGhleSBoYXZlIHRoZSBzYW1lIG1hcHBpbmcgdHlwZS4KKwkvL1RoZXkgbXVzdCBhbGwgYmUgZWl0aGVyIGRlZmF1bHQgbWFwcGluZ3Mgb3Igc3BlY2lmaWVkIG1hcHBpbmdzIGFzIHdlbGwuCisJcHJvdGVjdGVkIGJvb2xlYW4gc2VsZWN0ZWRFbGVtZW50c01hcHBpbmdLZXlzTWF0Y2goSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgTWFwIHBhcmFtZXRlcnMpIHsKKwkJU3RyaW5nIGhhbmRsZXJTcGVjaWZpZWRNYXBwaW5nS2V5ID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoU1BFQ0lGSUVEX01BUFBJTkdfQ09NTUFORF9QQVJBTUVURVJfSUQpOworCQlTdHJpbmcgaGFuZGxlckRlZmF1bHRNYXBwaW5nS2V5ID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoREVGQVVMVF9NQVBQSU5HX0NPTU1BTkRfUEFSQU1FVEVSX0lEKTsKKwkJCisJCVN0cmluZyBjb21tb25EZWZhdWx0S2V5ID0gbnVsbDsKKwkJU3RyaW5nIGNvbW1vblNwZWNpZmllZEtleSA9IG51bGw7CisJCWZvciAoT2JqZWN0IG9iaiA6IHNlbGVjdGlvbi50b0FycmF5KCkpIHsKIAkJCWlmICghIChvYmogaW5zdGFuY2VvZiBQZXJzaXN0ZW50QXR0cmlidXRlKSkgewotCQkJCXJldHVybiBudWxsOworCQkJCS8vb2RkbHkgZW5vdWdoLCB5b3UgaGF2ZSB0byBjaGVjayBpbnN0YW5jZW9mIGhlcmUsIHNlZW1zIGxpa2UgYSBidWcgaW4gdGhlIGZyYW1ld29yaworCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAkJCQogCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIG9iajsKLQkJCQotCQkJaWYgKGNvbW1vbktleSA9PSBudWxsKSB7Ci0JCQkJY29tbW9uS2V5ID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCk7CisJCQlpZiAocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkgPT0gbnVsbCkgeworCQkJCWlmIChjb21tb25TcGVjaWZpZWRLZXkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWlmIChjb21tb25EZWZhdWx0S2V5ID09IG51bGwpIHsKKwkJCQkJY29tbW9uRGVmYXVsdEtleSA9IHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpOwkJCQkJCisJCQkJfQorCQkJCWVsc2UgaWYgKCFjb21tb25EZWZhdWx0S2V5LmVxdWFscyhwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSkpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KIAkJCX0KLQkJCWVsc2UgaWYgKCEgY29tbW9uS2V5LmVxdWFscyhwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKKwkJCWVsc2UgeworCQkJCWlmIChjb21tb25EZWZhdWx0S2V5ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlpZiAoY29tbW9uU3BlY2lmaWVkS2V5ID09IG51bGwpIHsKKwkJCQkJY29tbW9uU3BlY2lmaWVkS2V5ID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCk7CisJCQkJfQorCQkJCWVsc2UgaWYgKCFjb21tb25TcGVjaWZpZWRLZXkuZXF1YWxzKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQogCQkJfQogCQl9Ci0JCXJldHVybiBjb21tb25LZXk7CisJCWlmIChoYW5kbGVyU3BlY2lmaWVkTWFwcGluZ0tleSAhPSBudWxsKSB7CisJCQlyZXR1cm4gaGFuZGxlclNwZWNpZmllZE1hcHBpbmdLZXkuZXF1YWxzKGNvbW1vblNwZWNpZmllZEtleSk7CisJCX0KKwkJZWxzZSBpZiAoaGFuZGxlckRlZmF1bHRNYXBwaW5nS2V5ICE9IG51bGwpIHsKKwkJCXJldHVybiBoYW5kbGVyRGVmYXVsdE1hcHBpbmdLZXkuZXF1YWxzKGNvbW1vbkRlZmF1bHRLZXkpOworCQl9CisJCXJldHVybiBmYWxzZTsKIAl9CisJCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9SZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlRnJvbVhtbEhhbmRsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1JlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVGcm9tWG1sSGFuZGxlci5qYXZhCmluZGV4IDllYmQzOGQuLjU0YzU2N2EgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1JlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVGcm9tWG1sSGFuZGxlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1JlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVGcm9tWG1sSGFuZGxlci5qYXZhCkBAIC0zOCw3ICszOCw3IEBACiAJCQogCQkvLyBvbmx5IGFwcGxpZXMgZm9yIG11bHRpcGx5IHNlbGVjdGVkIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb2JqZWN0cyBpbiBhIHRyZWUKIAkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IChJdGVyYWJsZTxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPikgQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHNlbGVjdGlvbi5pdGVyYXRvcigpKSkgewotCQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGF0dHJpYnV0ZS5nZXRPcm1QZXJzaXN0ZW50VHlwZSgpOworCQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGF0dHJpYnV0ZS5nZXRQZXJzaXN0ZW50VHlwZSgpOwogCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwogCQkJYXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7CiAJCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0dHJpYnV0ZSA9IHR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoYXR0cmlidXRlTmFtZSk7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9SZW1vdmVQZXJzaXN0ZW50Q2xhc3NIYW5kbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9SZW1vdmVQZXJzaXN0ZW50Q2xhc3NIYW5kbGVyLmphdmEKaW5kZXggMmI2MDE5My4uNzdjYjhkZSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvY29tbWFuZHMvUmVtb3ZlUGVyc2lzdGVudENsYXNzSGFuZGxlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1JlbW92ZVBlcnNpc3RlbnRDbGFzc0hhbmRsZXIuamF2YQpAQCAtMTUsNiArMTUsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKIApAQCAtMjgsNyArMjksNyBAQAogCQkvLyBvbmx5IGFwcGxpZXMgZm9yIG11bHRpcGx5IHNlbGVjdGVkIE9ybVBlcnNpc3RlbnRUeXBlIG9iamVjdHMgaW4gYSB0cmVlCiAJCWZvciAoSXRlcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IHN0cmVhbSA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKIAkJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gc3RyZWFtLm5leHQoKTsKLQkJCXBlcnNpc3RlbnRUeXBlLmdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlT3JtUGVyc2lzdGVudFR5cGUocGVyc2lzdGVudFR5cGUpOworCQkJKChFbnRpdHlNYXBwaW5ncykgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZ0ZpbGVSb290KCkpLnJlbW92ZVBlcnNpc3RlbnRUeXBlKHBlcnNpc3RlbnRUeXBlKTsKIAkJfQogCQkKIAkJcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9VcGdyYWRlWG1sRmlsZVZlcnNpb25IYW5kbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9jb21tYW5kcy9VcGdyYWRlWG1sRmlsZVZlcnNpb25IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhMDE2OQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2NvbW1hbmRzL1VwZ3JhZGVYbWxGaWxlVmVyc2lvbkhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuY29tbWFuZHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlhtbEZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVJvb3RFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKKworcHVibGljIGNsYXNzIFVwZ3JhZGVYbWxGaWxlVmVyc2lvbkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKK3sKKwlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gCisJCQk9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXZlbnQpOworCQkKKwkJLy8gb25seSBhcHBsaWVzIGZvciBhIHNpbmdseSBzZWxlY3RlZCBvYmplY3RzIHRoYXQgYWRhcHQgdG8gSnBhWG1sUmVzb3VyY2Ugb3IgWG1sRmlsZQorCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7CisJCUpwYVhtbFJlc291cmNlIHhtbFJlc291cmNlID0gCisJCQkJKEpwYVhtbFJlc291cmNlKSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIoc2VsZWN0ZWRPYmplY3QsIEpwYVhtbFJlc291cmNlLmNsYXNzKTsKKwkJaWYgKHhtbFJlc291cmNlID09IG51bGwpIHsKKwkJCVhtbEZpbGUgeG1sRmlsZSA9IAorCQkJCShYbWxGaWxlKSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIoc2VsZWN0ZWRPYmplY3QsIFhtbEZpbGUuY2xhc3MpOworCQkJaWYgKHhtbEZpbGUgIT0gbnVsbCkgeworCQkJCXhtbFJlc291cmNlID0geG1sRmlsZS5nZXRYbWxSZXNvdXJjZSgpOworCQkJfQorCQl9CisJCWlmICh4bWxSZXNvdXJjZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKwkJZmluYWwgSnBhUm9vdEVPYmplY3Qgcm9vdCA9IHhtbFJlc291cmNlLmdldFJvb3RPYmplY3QoKTsKKwkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0geG1sUmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKTsKKwkJZmluYWwgU3RyaW5nIG5ld1ZlcnNpb24gPSAKKwkJCQl4bWxSZXNvdXJjZS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKGNvbnRlbnRUeXBlKS5nZXRWZXJzaW9uKCk7CisJCQorCQl4bWxSZXNvdXJjZS5tb2RpZnkoCisJCQluZXcgUnVubmFibGUoKSB7CisJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQlyb290LnNldFZlcnNpb24obmV3VmVyc2lvbik7CisJCQkJfQorCQkJfSk7CisJCQorCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0QmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0QmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5ZTYxZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RCYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDI2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0aWJsZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnVtZXJhdGVkQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBFbnVtVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgTG9iQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgQmFzaWNNYXBwaW5nCisgKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQorICogQHNlZSBFbnVtVHlwZUNvbXBvc2l0ZQorICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKKyAqIEBzZWUgTG9iQ29tcG9zaXRlCisgKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCisgKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCYXNpY01hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIEJhc2ljTWFwcGluZz4gCisJZXh0ZW5kcyBGb3JtUGFuZTxUPgorCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNpY01hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JQmFzaWNNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0QmFzaWNNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbml0aWFsaXplR2VuZXJhbFBhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZVR5cGVQYW5lKGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmFsUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7CisKKwkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOworCisJCS8vIEFsaWduIHRoZSB3aWRnZXRzIHVuZGVyIHRoZSBDb2x1bW5Db21wb3NpdGUKKwkJY29udGFpbmVyID0gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7CisKKwkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgYWRkU3ViUGFuZShjb250YWluZXIsIDQpKTsKKworCX0KKwkKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVR5cGVQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQljb250YWluZXIgPSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90eXBlCisJCSk7CisJCSgoR3JpZExheW91dCkgY29udGFpbmVyLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gMjsKKworCQkvLyBObyBjb252ZXJ0ZXIKKwkJQnV0dG9uIG5vQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCisJCQljb250YWluZXIsIAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fZGVmYXVsdCwgCisJCQlidWlsZE5vQ29udmVydGVySG9sZGVyKCksIAorCQkJbnVsbCk7CisJCSgoR3JpZERhdGEpIG5vQ29udmVydGVyQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOworCQkKKwkJLy8gTG9iCisJCUJ1dHRvbiBsb2JCdXR0b24gPSBhZGRSYWRpb0J1dHRvbigKKwkJCWNvbnRhaW5lciwgCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9sb2IsIAorCQkJYnVpbGRMb2JDb252ZXJ0ZXJIb2xkZXIoKSwgCisJCQludWxsKTsKKwkJKChHcmlkRGF0YSkgbG9iQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOworCQkKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gc3BlY2lmaWVkQ29udmVydGVySG9sZGVyID0gYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJLy8gVGVtcG9yYWwKKwkJYWRkUmFkaW9CdXR0b24oCisJCQljb250YWluZXIsIAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fdGVtcG9yYWwsIAorCQkJYnVpbGRUZW1wb3JhbEJvb2xlYW5Ib2xkZXIoKSwgCisJCQludWxsKTsKKwkJcmVnaXN0ZXJTdWJQYW5lKG5ldyBUZW1wb3JhbFR5cGVDb21wb3NpdGUoYnVpbGRUZW1wb3JhbENvbnZlcnRlckhvbGRlcihzcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSkpOworCQkKKwkJCisJCS8vIEVudW1lcmF0ZWQKKwkJYWRkUmFkaW9CdXR0b24oCisJCQljb250YWluZXIsIAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fZW51bWVyYXRlZCwgCisJCQlidWlsZEVudW1lcmF0ZWRCb29sZWFuSG9sZGVyKCksIAorCQkJbnVsbCk7CisJCXJlZ2lzdGVyU3ViUGFuZShuZXcgRW51bVR5cGVDb21wb3NpdGUoYnVpbGRFbnVtZXJhdGVkQ29udmVydGVySG9sZGVyKHNwZWNpZmllZENvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKSk7CisJfQorCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDb2x1bW4+IGJ1aWxkQ29sdW1uSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIENvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBDb2x1bW4gdHJhbnNmb3JtXyhUIHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlLmdldENvbHVtbigpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb0NvbnZlcnRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuU1BFQ0lGSUVEX0NPTlZFUlRFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSA9PSBudWxsKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgeworCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5OT19DT05WRVJURVIpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZExvYkNvbnZlcnRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuU1BFQ0lGSUVEX0NPTlZFUlRFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENvbnZlcnRlcigpOworCQkJCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5MT0JfQ09OVkVSVEVSKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgeworCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5MT0JfQ09OVkVSVEVSKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIENvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuU1BFQ0lGSUVEX0NPTlZFUlRFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ29udmVydGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCk7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFRlbXBvcmFsQ29udmVydGVyPiBidWlsZFRlbXBvcmFsQ29udmVydGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlciwgVGVtcG9yYWxDb252ZXJ0ZXI+KGNvbnZlcnRlckhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgVGVtcG9yYWxDb252ZXJ0ZXIgdHJhbnNmb3JtXyhDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCQkJcmV0dXJuIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpID8gKFRlbXBvcmFsQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFbnVtZXJhdGVkQ29udmVydGVyPiBidWlsZEVudW1lcmF0ZWRDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBFbnVtZXJhdGVkQ29udmVydGVyPihjb252ZXJ0ZXJIb2xkZXIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEVudW1lcmF0ZWRDb252ZXJ0ZXIgdHJhbnNmb3JtXyhDb252ZXJ0ZXIgY29udmVydGVyKSB7CisJCQkJcmV0dXJuIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5FTlVNRVJBVEVEX0NPTlZFUlRFUikgPyAoRW51bWVyYXRlZENvbnZlcnRlcikgY29udmVydGVyIDogbnVsbDsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGVtcG9yYWxCb29sZWFuSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbnZlcnRpYmxlTWFwcGluZy5TUEVDSUZJRURfQ09OVkVSVEVSX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCUNvbnZlcnRlciBjb252ZXJ0ZXIgPSB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCk7CisJCQkJaWYgKGNvbnZlcnRlciA9PSBudWxsKSB7CisJCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOworCQkJCX0KKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKKwkJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFbnVtZXJhdGVkQm9vbGVhbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuU1BFQ0lGSUVEX0NPTlZFUlRFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENvbnZlcnRlcigpOworCQkJCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5FTlVNRVJBVEVEX0NPTlZFUlRFUik7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKKwkJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuRU5VTUVSQVRFRF9DT05WRVJURVIpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNmU3OTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgQmFzaWNNYXBwaW5nPgorCWltcGxlbWVudHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxUPgoreworCXByb3RlY3RlZCBBYnN0cmFjdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIEltYWdlIGdldEltYWdlKCkgeworCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRLZXkoKSk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5CYXNpY01hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJhc2ljTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGFibGVVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmNlMjU5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGFibGVVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbWJlZGRhYmxlVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBFbWJlZGRhYmxlPiAKKwlpbXBsZW1lbnRzIE1hcHBpbmdVaURlZmluaXRpb248VD4KK3sKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbWJlZGRhYmxlVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkVtYmVkZGFibGVVaVByb3ZpZGVyX2xhYmVsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkVtYmVkZGFibGVVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKwl9CisJCisJcHVibGljIEltYWdlIGdldEltYWdlKCkgeworCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yVHlwZU1hcHBpbmcoZ2V0S2V5KCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyYWZiNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBFbWJlZGRlZElkTWFwcGluZz4KKwlpbXBsZW1lbnRzIE1hcHBpbmdVaURlZmluaXRpb248VD4KK3sKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7CisJfQorCisJcHVibGljIEltYWdlIGdldEltYWdlKCkgeworCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRLZXkoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MWRmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VFbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPdmVycmlkZXNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQmFzZUVtYmVkZGVkTWFwcGluZz4gZXh0ZW5kcyBBYnN0cmFjdE92ZXJyaWRlc0NvbXBvc2l0ZTxUPgoreworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlKEZvcm1QYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisJCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCX0KKwkJfTsKKwl9CisKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjcwYTMzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBFbWJlZGRlZE1hcHBpbmc+CisJaW1wbGVtZW50cyBNYXBwaW5nVWlEZWZpbml0aW9uPFQ+Cit7CisJcHJvdGVjdGVkIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCX0KKworCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTYxMGZjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBFbnRpdHlOYW1lQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRhYmxlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgSWRDbGFzc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAtIHYgQXR0cmlidXRlIE92ZXJyaWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE92ZXJyaWRlc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgLSB2IFNlY29uZGFyeSBUYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IC0gdiBJbmhlcml0YW5jZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgSW5oZXJpdGFuY2VDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAtIHYgUXVlcmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFF1ZXJpZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgLSB2IEdlbmVyYXRvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBHZW5lcmF0b3JzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFbnRpdHkKKyAqIEBzZWUgRW50aXR5TmFtZUNvbXBvc2l0ZQorICogQHNlZSBJbmhlcml0YW5jZUNvbXBvc2l0ZQorICogQHNlZSBJZENsYXNzQ29tcG9zaXRlCisgKiBAc2VlIEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZQorICogQHNlZSBUYWJsZUNvbXBvc2l0ZQorICogQHNlZSBHZW5lcmF0aW9uQ29tcG9zaXRlCisgKgorICogVE9ETyB0YWxrIHRvIEphdmFFZGl0b3IgcGVvcGxlIGFib3V0IHdoYXQgd2UgY2FuIGRvIHRvIGhvb2sgaW4gVGFiYmVkUHJvcGVydGllcyBmb3IgdGhlIEphdmFFZGl0b3IKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlPFQgZXh0ZW5kcyBFbnRpdHk+IGV4dGVuZHMgRm9ybVBhbmU8VD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JRW50aXR5PC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcik7CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkSW5oZXJpdGFuY2VDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcik7CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlpbml0aWFsaXplR2VuZXJhbFBhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZVF1ZXJpZXNQYW5lKGNvbnRhaW5lcik7CisJCWluaXRpYWxpemVJbmhlcml0YW5jZVBhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlc1BhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZUdlbmVyYXRvcnNQYW5lKGNvbnRhaW5lcik7CisJCWluaXRpYWxpemVTZWNvbmRhcnlUYWJsZXNQYW5lKGNvbnRhaW5lcik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKworCQluZXcgVGFibGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwkJbmV3IEVudGl0eU5hbWVDb21wb3NpdGUodGhpcywgYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbikpOworCQluZXcgSWRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKSwgZmFsc2UpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVRdWVyaWVzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuRW50aXR5Q29tcG9zaXRlX3F1ZXJpZXMKKwkJKTsKKworCQlhZGRRdWVyaWVzQ29tcG9zaXRlKGNvbnRhaW5lciwgYnVpbGRRdWVyeUNvbnRhaW5lckhvbGRlcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkUXVlcmllc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnlDb250YWluZXI+IHF1ZXJ5Q29udGFpbmVySG9sZGVyKSB7CisJCW5ldyBRdWVyaWVzQ29tcG9zaXRlKHRoaXMsIHF1ZXJ5Q29udGFpbmVySG9sZGVyLCBjb250YWluZXIpOworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUNvbnRhaW5lcj4gYnVpbGRRdWVyeUNvbnRhaW5lckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBRdWVyeUNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBRdWVyeUNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFF1ZXJ5Q29udGFpbmVyKCk7CisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlc1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWNvbnRhaW5lciA9IGFkZENvbGxhcHNhYmxlU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGVPdmVycmlkZXNTZWN0aW9uCisJCSk7CisKKwkJYWRkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlKGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSW5oZXJpdGFuY2VQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQljb250YWluZXIgPSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5FbnRpdHlDb21wb3NpdGVfaW5oZXJpdGFuY2UKKwkJKTsKKworCQlhZGRJbmhlcml0YW5jZUNvbXBvc2l0ZShjb250YWluZXIpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0b3JzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3ByaW1hcnlLZXlHZW5lcmF0aW9uU2VjdGlvbgorCQkpOworCisJCWFkZEdlbmVyYXRvcnNDb21wb3NpdGUoY29udGFpbmVyLCBidWlsZEdlbmVyYXRvckNvbnRhaW5lcigpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkR2VuZXJhdG9yc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdG9yQ29udGFpbmVyPiBnZW5lcmF0b3JDb250YWluZXJIb2xkZXIpIHsKKwkJbmV3IEdlbmVyYXRpb25Db21wb3NpdGUodGhpcywgZ2VuZXJhdG9yQ29udGFpbmVySG9sZGVyLCBjb250YWluZXIpOworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGJ1aWxkR2VuZXJhdG9yQ29udGFpbmVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIEdlbmVyYXRvckNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBHZW5lcmF0b3JDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRHZW5lcmF0b3JDb250YWluZXIoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX3NlY29uZGFyeVRhYmxlcworCQkpOworCisJCWFkZFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShjb250YWluZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMjU0MzMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TdHJ1Y3R1cmVOb2RlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyCisJaW1wbGVtZW50cyBKcGFEZXRhaWxzUHJvdmlkZXIKK3sKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIGZpbmFsIGJvb2xlYW4gcHJvdmlkZXNEZXRhaWxzKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgeworCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHN0cnVjdHVyZU5vZGUuZ2V0SWQoKSwgT3JtU3RydWN0dXJlTm9kZXMuRU5USVRZX01BUFBJTkdTX0lEKQorCQkJCSYmIHByb3ZpZGVzRGV0YWlscyhzdHJ1Y3R1cmVOb2RlLmdldFJlc291cmNlVHlwZSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcHJvdmlkZXNEZXRhaWxzKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YjI1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW50aXR5T3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IC0gQXR0cmlidXRlIE92ZXJyaWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCB8IFBhZ2VCb29rIChBdHRyaWJ1dGVPdmVycmlkZUNvbXBvc2l0ZS9Bc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlKXwgfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgRW50aXR5CisgKiBAc2VlIEVudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCisgKiBAc2VlIEF0dHJpYnV0ZU92ZXJyaWRlQ29tcG9zaXRlCisgKiBAc2VlIEFzc29jaWF0aW9uT3ZlcnJpZGVDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RW50aXR5T3ZlcnJpZGVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RPdmVycmlkZXNDb21wb3NpdGU8RW50aXR5PgoreworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PdmVycmlkZXNDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXByb3RlY3RlZCBBYnN0cmFjdEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZShGb3JtUGFuZTw/IGV4dGVuZHMgRW50aXR5PiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzQXNzb2NpYXRpb25PdmVycmlkZXMoKSB7CisJCXJldHVybiB0cnVlOworCX0JCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQl9CisJCX07CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyPiBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQkJfQorCQl9OworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWIwMmNkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eVVpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RW50aXR5VWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBFbnRpdHk+IAorCWltcGxlbWVudHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxUPgoreworCXByb3RlY3RlZCBBYnN0cmFjdEVudGl0eVVpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkVudGl0eVVpUHJvdmlkZXJfbGFiZWw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgeworCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRW50aXR5VWlQcm92aWRlcl9saW5rTGFiZWw7CisJfQorCQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvclR5cGVNYXBwaW5nKGdldEtleSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNmNWFmNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0aWJsZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENvbHVtbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBHZW5lcmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBJZE1hcHBpbmcKKyAqIEBzZWUgQ29sdW1uQ29tcG9zaXRlCisgKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQorICogQHNlZSBJZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdElkTWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgSWRNYXBwaW5nPgorCWV4dGVuZHMgRm9ybVBhbmU8VD4KKyAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SWRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUlkTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBBYnN0cmFjdElkTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb2x1bW4+IGJ1aWxkQ29sdW1uSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIENvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpKSAgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ29sdW1uIHRyYW5zZm9ybV8oVCB2YWx1ZSkgeworCQkJCXJldHVybiB2YWx1ZS5nZXRDb2x1bW4oKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVHlwZVBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWNvbnRhaW5lciA9IGFkZENvbGxhcHNhYmxlU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX3R5cGUKKwkJKTsKKwkJKChHcmlkTGF5b3V0KSBjb250YWluZXIuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSAyOworCisJCS8vIE5vIGNvbnZlcnRlcgorCQlCdXR0b24gbm9Db252ZXJ0ZXJCdXR0b24gPSBhZGRSYWRpb0J1dHRvbigKKwkJCWNvbnRhaW5lciwgCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9kZWZhdWx0LCAKKwkJCWJ1aWxkTm9Db252ZXJ0ZXJIb2xkZXIoKSwgCisJCQludWxsKTsKKwkJKChHcmlkRGF0YSkgbm9Db252ZXJ0ZXJCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQkJCisJCVByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IHNwZWNpZmllZENvbnZlcnRlckhvbGRlciA9IGJ1aWxkU3BlY2lmaWVkQ29udmVydGVySG9sZGVyKCk7CisJCS8vIFRlbXBvcmFsCisJCWFkZFJhZGlvQnV0dG9uKAorCQkJY29udGFpbmVyLCAKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX3RlbXBvcmFsLCAKKwkJCWJ1aWxkVGVtcG9yYWxCb29sZWFuSG9sZGVyKCksIAorCQkJbnVsbCk7CisJCXJlZ2lzdGVyU3ViUGFuZShuZXcgVGVtcG9yYWxUeXBlQ29tcG9zaXRlKGJ1aWxkVGVtcG9yYWxDb252ZXJ0ZXJIb2xkZXIoc3BlY2lmaWVkQ29udmVydGVySG9sZGVyKSwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpKTsKKwl9CisKKwlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb0NvbnZlcnRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuU1BFQ0lGSUVEX0NPTlZFUlRFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSA9PSBudWxsKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgeworCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5OT19DT05WRVJURVIpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUZW1wb3JhbEJvb2xlYW5Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLlNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKTsKKwkJCQlpZiAoY29udmVydGVyID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCQkJfQorCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoY29udmVydGVyLmdldFR5cGUoKSA9PSBDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgeworCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIENvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuU1BFQ0lGSUVEX0NPTlZFUlRFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ29udmVydGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8VGVtcG9yYWxDb252ZXJ0ZXI+IGJ1aWxkVGVtcG9yYWxDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBUZW1wb3JhbENvbnZlcnRlcj4oY29udmVydGVySG9sZGVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBUZW1wb3JhbENvbnZlcnRlciB0cmFuc2Zvcm1fKENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKKwkJCQlyZXR1cm4gKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUikgPyAoVGVtcG9yYWxDb252ZXJ0ZXIpIGNvbnZlcnRlciA6IG51bGw7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RJZE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RJZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTQ5MGRhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdElkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJZE1hcHBpbmdVaURlZmluaXRpb248VCBleHRlbmRzIElkTWFwcGluZz4KKwlpbXBsZW1lbnRzIE1hcHBpbmdVaURlZmluaXRpb248VD4KK3sKKwlwcm90ZWN0ZWQgQWJzdHJhY3RJZE1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7CisJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5JZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTkwMDc1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwyODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5Db2x1bW5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IFN0cmF0ZWd5OiAgICAgICAgICAgIHwgRW51bUNvbWJvVmlld2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IFZhbHVlOiAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ID4gRGlzY3JpbWluYXRvciBDb2x1bW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IE5hbWU6ICAgICAgICAgICAgICAgIHwgQ29sdW1uQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IFR5cGU6ICAgICAgICAgICAgICAgIHwgRW51bUNvbWJvVmlld2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IENvbHVtbiBEZWZpbml0aW9uOiAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IExlbmd0aDogICAgICAgICAgICAgIHwgSSAgICAgICB8SXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVudGl0eQorICogQHNlZSBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCisgKiBAc2VlIENvbHVtbkNvbWJvCisgKiBAc2VlIEVudW1Db21ib1ZpZXdlcgorICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAyLjAKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZTxUIGV4dGVuZHMgRW50aXR5PiBleHRlbmRzIEZvcm1QYW5lPFQ+IHsKKworCS8qKgorCSAqIEEga2V5IHVzZWQgdG8gcmVwcmVzZW50IHRoZSBkZWZhdWx0IHZhbHVlLCB0aGlzIGlzIHJlcXVpcmVkIHRvIGNvbnZlcnQKKwkgKiB0aGUgc2VsZWN0ZWQgaXRlbSBmcm9tIGEgY29tYm8gdG8gPGNvZGU+bnVsbDwvY29kZT4uIFRoaXMga2V5IGlzIG1vc3QKKwkgKiBsaWtlbHkgbmV2ZXIgdHlwZWQgdGhlIHVzZXIgYW5kIGl0IHdpbGwgaGVscCB0byBjb252ZXJ0IHRoZSB2YWx1ZSB0bworCSAqIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gaXQncyB0aW1lIHRvIHNldCB0aGUgbmV3IHNlbGVjdGVkIHZhbHVlIGludG8gdGhlCisJICogbW9kZWwuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9LRVkgPSAiPyEjIT8jPyM/ZGVmYXVsdD8jPyEjPyEjPyI7CisJCisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgTk9ORV9LRVkgPSAiPyEjIT8jPyM/bm9uZT8jPyEjPyEjPyI7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkluaGVyaXRhbmNlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlKEZvcm1QYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKworCQlDb21wb3NpdGUgc3ViUGFuZSA9IGFkZFN1YlBhbmUoCisJCQljb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbgorCQkpOworCisJCS8vIFN0cmF0ZWd5IHdpZGdldHMKKwkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCXN1YlBhbmUsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Jbmhlcml0YW5jZUNvbXBvc2l0ZV9zdHJhdGVneSwKKwkJCWFkZFN0cmF0ZWd5Q29tYm8oc3ViUGFuZSksCisJCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfSU5IRVJJVEFOQ0VfU1RSQVRFR1kKKwkJKTsKKworCQkvLyBEaXNjcmluYXRvciBWYWx1ZSB3aWRnZXRzCisJCUNDb21ibyBkaXNjcmltaW5hdG9yVmFsdWVDb21ibyA9IGFkZEVkaXRhYmxlQ0NvbWJvKAorCQkJc3ViUGFuZSwKKwkJCWJ1aWxkRGlzY3JpbWluYXRvclZhbHVlTGlzdEhvbGRlcigpLAorCQkJYnVpbGREaXNjcmltaW5hdG9yVmFsdWVIb2xkZXIoKSwKKwkJCWJ1aWxkRGlzY3JpbWluYXRvclZhbHVlQ29udmVydGVyKCkKKwkJKTsKKwkJTGFiZWwgZGlzY3JpbWluYXRvclZhbHVlTGFiZWwgPSBhZGRMYWJlbCgKKwkJCXN1YlBhbmUsIAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlCisJCSk7CisJCWFkZExhYmVsZWRDb21wb3NpdGUoCisJCQlzdWJQYW5lLAorCQkJZGlzY3JpbWluYXRvclZhbHVlTGFiZWwsCisJCQlkaXNjcmltaW5hdG9yVmFsdWVDb21iby5nZXRQYXJlbnQoKSwKKwkJCW51bGwsCisJCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfSU5IRVJJVEFOQ0VfRElTQ1JJTUlOQVRPUl9WQUxVRQorCQkpOworCQorCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKGJ1aWxkRGlzY3JpbWluYXRvclZhbHVlRW5hYmxlZEhvbGRlcigpLCBkaXNjcmltaW5hdG9yVmFsdWVDb21ibywgZGlzY3JpbWluYXRvclZhbHVlTGFiZWwpOworCQkKKwkJbmV3IERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGU8RW50aXR5Pih0aGlzLCBjb250YWluZXIpOworCisJCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyB3aWRnZXRzCisJCWFkZFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOworCX0KKwkKKwlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREaXNjcmltaW5hdG9yVmFsdWVFbmFibGVkSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlNQRUNJRklFRF9ESVNDUklNSU5BVE9SX1ZBTFVFX0lTX0FMTE9XRURfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3Quc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkKCkpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHREaXNjcmltaW5hdG9yTGlzdFZhbHVlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCisJCQlidWlsZERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWVIb2xkZXIoKQorCQkpOworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFksIEVudGl0eS5ESVNDUklNSU5BVE9SX1ZBTFVFX0lTX1VOREVGSU5FRF9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCVN0cmluZyB2YWx1ZSA9IHRoaXMuc3ViamVjdC5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCk7CisJCQkJaWYgKHZhbHVlID09IG51bGwgJiYgdGhpcy5zdWJqZWN0LmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpIHsKKwkJCQkJcmV0dXJuIE5PTkVfS0VZOworCQkJCX0KKworCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQkJCXZhbHVlID0gREVGQVVMVF9LRVk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQl2YWx1ZSA9IERFRkFVTFRfS0VZICsgdmFsdWU7CisJCQkJfQorCisJCQkJcmV0dXJuIHZhbHVlOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGREaXNjcmltaW5hdG9yVmFsdWVDb252ZXJ0ZXIoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7CisJCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKKworCQkJCWlmIChnZXRTdWJqZWN0KCkgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisKKwkJCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJCQl2YWx1ZSA9IGdldFN1YmplY3QoKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCk7CisJCQkJCWlmICh2YWx1ZSA9PSBudWxsICYmIGdldFN1YmplY3QoKS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKSB7CisJCQkJCQl2YWx1ZSA9IE5PTkVfS0VZOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJdmFsdWUgPSAodmFsdWUgIT0gbnVsbCkgPyAKKwkJCQkJCQkJREVGQVVMVF9LRVkgKyB2YWx1ZQorCQkJCQkJCTogCisJCQkJCQkJCURFRkFVTFRfS0VZOworCQkJCQl9CisJCQkJfQorCQkJCWlmICh2YWx1ZS5zdGFydHNXaXRoKERFRkFVTFRfS0VZKSkgeworCQkJCQlTdHJpbmcgZGVmYXVsdE5hbWUgPSB2YWx1ZS5zdWJzdHJpbmcoREVGQVVMVF9LRVkubGVuZ3RoKCkpOworCisJCQkJCWlmIChkZWZhdWx0TmFtZS5sZW5ndGgoKSA+IDApIHsKKwkJCQkJCXZhbHVlID0gTkxTLmJpbmQoCisJCQkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKKwkJCQkJCQlkZWZhdWx0TmFtZQorCQkJCQkJKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCXZhbHVlID0gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJvdmlkZXJEZWZhdWx0OworCQkJCQl9CisJCQkJfQorCQkJCWlmICh2YWx1ZS5zdGFydHNXaXRoKE5PTkVfS0VZKSkgeworCQkJCQl2YWx1ZSA9IEpwdFVpRGV0YWlsc01lc3NhZ2VzLk5vbmVTZWxlY3RlZDsKKwkJCQl9CisJCQkJcmV0dXJuIHZhbHVlOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERpc2NyaW1pbmF0b3JWYWx1ZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlNQRUNJRklFRF9ESVNDUklNSU5BVE9SX1ZBTFVFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisKKwkJCQkvLyBDb252ZXJ0IHRoZSBkZWZhdWx0IHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZyB0byBudWxsCisJCQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJgorCQkJCSAgICgodmFsdWUubGVuZ3RoKCkgPT0gMCkgfHwgdmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkgfHwgdmFsdWUuc3RhcnRzV2l0aChOT05FX0tFWSkpKSB7CisKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKworCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERpc2NyaW1pbmF0b3JWYWx1ZUxpc3RIb2xkZXIoKSB7CisJCXJldHVybiBidWlsZERlZmF1bHREaXNjcmltaW5hdG9yTGlzdFZhbHVlSG9sZGVyKCk7CisJfQorCisJcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEVudGl0eSwgSW5oZXJpdGFuY2VUeXBlPiBhZGRTdHJhdGVneUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RW50aXR5LCBJbmhlcml0YW5jZVR5cGU+KHRoaXMsIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eS5ERUZBVUxUX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnRpdHkuU1BFQ0lGSUVEX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlW10gZ2V0Q2hvaWNlcygpIHsKKwkJCQlyZXR1cm4gSW5oZXJpdGFuY2VUeXBlLnZhbHVlcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoSW5oZXJpdGFuY2VUeXBlIHZhbHVlKSB7CisJCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKKwkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuY2xhc3MsCisJCQkJCUFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGUuY2xhc3MsCisJCQkJCXZhbHVlCisJCQkJKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIGdldFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEluaGVyaXRhbmNlVHlwZSB2YWx1ZSkgeworCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcik7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0Sm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDQ4NzUzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sU3dpdGNoZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOworCisvKioKKyAqIEFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGpvaW5pbmcgc3RyYXRlZ3kgZm9ybSBwYW5lcworICogCisgKiBIZXJlIGlzIHRoZSBiYXNpYyBsYXlvdXQgb2YgdGhpcyBwYW5lOiAgCisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgbyA8bGFiZWw+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgIChqb2luaW5nIHN0cmF0ZWd5IGRldGFpbHMgY29tcG9zaXRlKSAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIHtAbGluayBPd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlfQorICogQHNlZSB7QGxpbmsgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3l9CisgKiBAc2VlIHtAbGluayBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9CisgKgorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpvaW5pbmdTdHJhdGVneVBhbmUKKwkJPFIgZXh0ZW5kcyBSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIFMgZXh0ZW5kcyBKb2luaW5nU3RyYXRlZ3k+IAorCWV4dGVuZHMgRm9ybVBhbmU8Uj4KK3sKKwlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdXNlc1N0cmF0ZWd5SG9sZGVyOworCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4gam9pbmluZ1N0cmF0ZWd5SG9sZGVyOworCQorCXByb3RlY3RlZCBDb21wb3NpdGUgc3RyYXRlZ3lEZXRhaWxzQ29tcG9zaXRlOworCQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RKb2luaW5nU3RyYXRlZ3lQYW5lPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgZm9ybSBwYW5lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXByb3RlY3RlZCBBYnN0cmFjdEpvaW5pbmdTdHJhdGVneVBhbmUoCisJCQlGb3JtUGFuZTw/IGV4dGVuZHMgUj4gcGFyZW50UGFuZSwgCisJCQlDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCQorCXByb3RlY3RlZCBBYnN0cmFjdEpvaW5pbmdTdHJhdGVneVBhbmUoRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwgCisJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUj4gc3ViamVjdEhvbGRlciwKKyAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCXN1cGVyLmluaXRpYWxpemUoKTsKKwkJdGhpcy51c2VzU3RyYXRlZ3lIb2xkZXIgPSBidWlsZFVzZXNTdHJhdGVneUhvbGRlcigpOworCQl0aGlzLmpvaW5pbmdTdHJhdGVneUhvbGRlciA9IGJ1aWxkSm9pbmluZ1N0cmF0ZWd5SG9sZGVyKCk7CisJfQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNTdHJhdGVneUhvbGRlcigpOworCQorCXByb3RlY3RlZCBhYnN0cmFjdCBQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4gYnVpbGRKb2luaW5nU3RyYXRlZ3lIb2xkZXIoKTsKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJYWRkUmFkaW9CdXR0b24oCisJCQljb250YWluZXIsCisJCQlnZXRTdHJhdGVneUxhYmVsS2V5KCksCisJCQl0aGlzLnVzZXNTdHJhdGVneUhvbGRlciwKKwkJCW51bGwpOworCQkKKwkJUGFnZUJvb2sgcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soY29udGFpbmVyLCBTV1QuTlVMTCk7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWdkLmhvcml6b250YWxJbmRlbnQgPSA1OworCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKGdkKTsKKwkJCisJCXRoaXMuc3RyYXRlZ3lEZXRhaWxzQ29tcG9zaXRlID0gYnVpbGRTdHJhdGVneURldGFpbHNDb21wb3NpdGUocGFnZUJvb2spOworCQkKKwkJbmV3IENvbnRyb2xTd2l0Y2hlcih0aGlzLnVzZXNTdHJhdGVneUhvbGRlciwgYnVpbGRQYWdlQm9va1RyYW5zZm9ybWVyKCksIHBhZ2VCb29rKTsKKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRTdHJhdGVneUxhYmVsS2V5KCk7CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IENvbXBvc2l0ZSBidWlsZFN0cmF0ZWd5RGV0YWlsc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KTsKKwkKKwlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQ29udHJvbD4gYnVpbGRQYWdlQm9va1RyYW5zZm9ybWVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPEJvb2xlYW4sIENvbnRyb2w+KCkgeworCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKEJvb2xlYW4gdXNlc1N0cmF0ZWd5KSB7CisJCQkJcmV0dXJuICh1c2VzU3RyYXRlZ3kuYm9vbGVhblZhbHVlKCkpID8gCisJCQkJCUFic3RyYWN0Sm9pbmluZ1N0cmF0ZWd5UGFuZS50aGlzLnN0cmF0ZWd5RGV0YWlsc0NvbXBvc2l0ZSA6CisJCQkJCW51bGw7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEpwYURldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SnBhRGV0YWlsc1BhZ2UuamF2YQppbmRleCA4ZGFiNDM4Li45M2Y5YzQzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SnBhRGV0YWlsc1BhZ2UuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SnBhRGV0YWlsc1BhZ2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMSwyNSArMTEsMjQgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKIAogLyoqCiAgKiBUaGUgYmFzZSBjbGFzcyBmb3IgdGhlIGRldGFpbHMgdmlldy4KICAqCi0gKiBAc2VlIEpwYUNvbnRleHROb2RlCisgKiBAc2VlIEpwYVN0cnVjdHVyZU5vZGUKICAqCi0gKiBAdmVyc2lvbiAyLjAKKyAqIEB2ZXJzaW9uIDMuMAogICogQHNpbmNlIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFEZXRhaWxzUGFnZTxUIGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4KLQlleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8VD4KKwlleHRlbmRzIEZvcm1QYW5lPFQ+CiAJaW1wbGVtZW50cyBKcGFEZXRhaWxzUGFnZTxUPgogewogCS8qKgpAQCAtMzgsNTggKzM3LDE3IEBACiAJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgogCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKIAkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKcGFEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCisJcHJvdGVjdGVkIEFic3RyYWN0SnBhRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CiAJCXN1cGVyKG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4oKSwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKIAl9CiAKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpKCkgewotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOwotCQlyZXR1cm4gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuanBhUGxhdGZvcm0ocGxhdGZvcm1JZCk7CisJcHJvdGVjdGVkIEpwYVBsYXRmb3JtVWkgZ2V0SnBhUGxhdGZvcm1VaSgpIHsKKwkJU3RyaW5nIHBsYXRmb3JtSWQgPSBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKKwkJcmV0dXJuIEpwYVBsYXRmb3JtVWlSZWdpc3RyeS5pbnN0YW5jZSgpLmdldEpwYVBsYXRmb3JtVWkocGxhdGZvcm1JZCk7CiAJfQogCi0JcHJvdGVjdGVkIEpwYVVpRmFjdG9yeSBqcGFVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBqcGFQbGF0Zm9ybVVpKCkuZ2V0SnBhVWlGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogVGhlcmUgaXMgYW4gaXNzdWUgd2l0aCA8Y29kZT5TY3JvbGxlZEZvcm08L2NvZGU+LCBpdCBkb2Vzbid0IHJlcGFpbnQgdGhlCi0JICogZW50aXJlIGNvbnRlbnQsIHRoaXMgd2lsbCByZXRyaWV2ZSBpdCBieSBnb2luZyB1cCB0aGUgaGllcmFyY2h5IG9mIHRoZQotCSAqIGdpdmVuIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gYW5kIGZvcmNlIGEgcmVmbG93IG9uIGl0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIHVzZWQgdG8gZmluZCB0aGUgPGNvZGU+U2Nyb2xsZWRGb3JtPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlcGFpbnREZXRhaWxzVmlldyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsICYmCi0JCSAgICAgIShjb250YWluZXIgaW5zdGFuY2VvZiBTY3JvbGxlZEZvcm0pKQotCQl7Ci0JCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCVNjcm9sbGVkRm9ybSBzY3JvbGxlZEZvcm0gPSAoU2Nyb2xsZWRGb3JtKSBjb250YWluZXI7Ci0JCQlzY3JvbGxlZEZvcm0ucmVmbG93KHRydWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCiAJcHVibGljIGZpbmFsIHZvaWQgc2V0U3ViamVjdChUIHN1YmplY3QpIHsKLQotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4pIGdldFN1YmplY3RIb2xkZXIoKTsKLQotCQkvLyBQb3B1bGF0ZSB0aGlzIHBhZ2Ugd2l0aCB0aGUgbmV3IHN1YmplY3QKLQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShzdWJqZWN0KTsKLQkJCXBvcHVsYXRlKCk7Ci0JCX0KLQkJLy8gRGlzcG9zZSB0aGlzIHBhZ2UKLQkJZWxzZSB7Ci0JCQlkaXNlbmdhZ2VMaXN0ZW5lcnMoKTsKLQkJCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCX0KKwkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciA9IChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPikgZ2V0U3ViamVjdEhvbGRlcigpOworCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKHN1YmplY3QpOwogCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwN2NkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5DYXNjYWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3JkZXJpbmdDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlNYXBwaW5nfQorICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmV9CisgKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBDYXNjYWRlQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgT3JkZXJpbmdDb21wb3NpdGV9CisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBNYW55VG9NYW55TWFwcGluZz4gCisJZXh0ZW5kcyBGb3JtUGFuZTxUPgorICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9NYW55TWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXByb3RlY3RlZCBBYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBncm91cEJveE1hcmdpbikgeworCQlyZXR1cm4gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8TWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gYnVpbGRKb2luaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIE1hbnlUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U+KAorCQkJCWdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgTWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZSB0cmFuc2Zvcm1fKFQgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FzY2FkZT4gYnVpbGRDYXNjYWRlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIENhc2NhZGU+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ2FzY2FkZSB0cmFuc2Zvcm1fKFQgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0Q2FzY2FkZSgpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4YjNhYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgTWFueVRvTWFueU1hcHBpbmc+CisJaW1wbGVtZW50cyBNYXBwaW5nVWlEZWZpbml0aW9uPFQ+Cit7CisJcHJvdGVjdGVkIEFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTU1NDU5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBNYW55VG9PbmVNYXBwaW5nPiAKKwlleHRlbmRzIEZvcm1QYW5lPFQ+CisJaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwlwcm90ZWN0ZWQgQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8TWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlPiBidWlsZEpvaW5pbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlPigKKwkJCQlnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIE1hbnlUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSB0cmFuc2Zvcm1fKFQgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FzY2FkZT4gYnVpbGRDYXNjYWRlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIENhc2NhZGU+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ2FzY2FkZSB0cmFuc2Zvcm1fKFQgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0Q2FzY2FkZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IGdyb3VwQm94TWFyZ2luKSB7CisJCXJldHVybiBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmZlNWViCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBNYW55VG9PbmVNYXBwaW5nPgorCWltcGxlbWVudHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxUPgoreworCXByb3RlY3RlZCBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgeworCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDUyNzhhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBNYXBwZWRTdXBlcmNsYXNzPgorCWltcGxlbWVudHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxUPgoreworCXByb3RlY3RlZCBBYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyX2xhYmVsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKwl9CisJCisJcHVibGljIEltYWdlIGdldEltYWdlKCkgeworCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yVHlwZU1hcHBpbmcoZ2V0S2V5KCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOGJlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3JkZXJpbmdDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgT25lVG9NYW55TWFwcGluZworICogQHNlZSBDYXNjYWRlQ29tcG9zaXRlCisgKiBAc2VlIEZldGNoVHlwZUNvbXBvc2l0ZQorICogQHNlZSBKb2luVGFibGVDb21wb3NpdGUKKyAqIEBzZWUgT3JkZXJpbmdDb21wb3NpdGUKKyAqIEBzZWUgVGFyZ2V0RW50aXR5Q29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIE9uZVRvTWFueU1hcHBpbmc+IAorCWV4dGVuZHMgRm9ybVBhbmU8VD4KKwlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklPbmVUb01hbnlNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gYnVpbGRKb2luaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIE9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2UgdHJhbnNmb3JtXyhUIHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENhc2NhZGU+IGJ1aWxkQ2FzY2FkZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxULCBDYXNjYWRlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIENhc2NhZGUgdHJhbnNmb3JtXyhUIHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlLmdldENhc2NhZGUoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBncm91cEJveE1hcmdpbikgeworCQlyZXR1cm4gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwZTQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgT25lVG9NYW55TWFwcGluZz4KKwlpbXBsZW1lbnRzIE1hcHBpbmdVaURlZmluaXRpb248VD4KK3sKKwlwcm90ZWN0ZWQgQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7CisJCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldEtleSgpKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZjQwYzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5DYXNjYWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgT25lVG9PbmVNYXBwaW5nPiAKKwlleHRlbmRzIEZvcm1QYW5lPFQ+CisJaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwlwcm90ZWN0ZWQgQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CQorCQorCQorCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgZ3JvdXBCb3hNYXJnaW4pIHsKKwkJcmV0dXJuIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pOworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlPiBidWlsZEpvaW5pbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2U+KAorCQkJCWdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgT25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2UgdHJhbnNmb3JtXyhUIHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENhc2NhZGU+IGJ1aWxkQ2FzY2FkZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxULCBDYXNjYWRlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIENhc2NhZGUgdHJhbnNmb3JtXyhUIHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlLmdldENhc2NhZGUoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjNzU4MAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgT25lVG9PbmVNYXBwaW5nPgorCWltcGxlbWVudHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxUPgoreworCXByb3RlY3RlZCBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIEltYWdlIGdldEltYWdlKCkgeworCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRLZXkoKSk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5PbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPdmVycmlkZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPdmVycmlkZXNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWJkNGJhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IC0gQXR0cmlidXRlIE92ZXJyaWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCB8IFBhZ2VCb29rIChhdHRyaWJ1dGUvYXNzb2NpYXRpb24gb3ZlcnJpZGUgY29tcG9zaXRlKSAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDEuMAorICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE92ZXJyaWRlc0NvbXBvc2l0ZTxUIGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+IGV4dGVuZHMgRm9ybVBhbmU8VD4KK3sKKwlwcml2YXRlIFBhbmU8QXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlUGFuZTsKKwlwcml2YXRlIFBhbmU8QXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZVBhbmU7CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGU+IHNlbGVjdGVkT3ZlcnJpZGVIb2xkZXI7CisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBvdmVycmlkZVZpcnR1YWxPdmVycmlkZUhvbGRlcjsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3ZlcnJpZGVzQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwcm90ZWN0ZWQgQWJzdHJhY3RPdmVycmlkZXNDb21wb3NpdGUoRm9ybVBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZSgpOworCQl0aGlzLnNlbGVjdGVkT3ZlcnJpZGVIb2xkZXIgPSBidWlsZFNlbGVjdGVkT3ZlcnJpZGVIb2xkZXIoKTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2VPdmVycmlkZT4gYnVpbGRTZWxlY3RlZE92ZXJyaWRlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGU+KCk7CisJfQorCisJcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJLy8gT3ZlcnJpZGVzIGdyb3VwIHBhbmUKKwkJY29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5PdmVycmlkZXNDb21wb3NpdGVfYXR0cmlidXRlT3ZlcnJpZGVzR3JvdXAKKwkJKTsKKworCQkvLyBPdmVycmlkZXMgbGlzdCBwYW5lCisJCWluaXRpYWxpemVPdmVycmlkZXNMaXN0KGNvbnRhaW5lcik7CisKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKwkJCisJCS8vIE92ZXJyaWRlIERlZmF1bHQgY2hlY2sgYm94CisJCUJ1dHRvbiBvdmVycmlkZUNoZWNrQm94ID0gYWRkQ2hlY2tCb3goCisJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKSwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk92ZXJyaWRlc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHQsCisJCQlnZXRPdmVycmlkZVZpcnR1YWxPdmVycmlkZUhvbGRlcigpLAorCQkJbnVsbAorCQkpOworCQlTV1RUb29scy5jb250cm9sVmlzaWJsZVN0YXRlKGJ1aWxkU2VsZWN0ZWRPdmVycmlkZUJvb2xlYW5Ib2xkZXIoKSwgb3ZlcnJpZGVDaGVja0JveCk7CisJCQorCQkvLyBQcm9wZXJ0eSBwYW5lCisJCVBhZ2VCb29rIHBhZ2VCb29rID0gYWRkUGFnZUJvb2soY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZU92ZXJyaWRlUGFuZXMocGFnZUJvb2spOworCQlpbnN0YWxsT3ZlcnJpZGVDb250cm9sU3dpdGNoZXIodGhpcy5zZWxlY3RlZE92ZXJyaWRlSG9sZGVyLCBwYWdlQm9vayk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPdmVycmlkZVBhbmVzKFBhZ2VCb29rIHBhZ2VCb29rKSB7CisJCWluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZVBhbmUocGFnZUJvb2spOworCQlpZiAoc3VwcG9ydHNBc3NvY2lhdGlvbk92ZXJyaWRlcygpKSB7CisJCQlpbml0aWFsaXplQXNzb2NpYXRpb25PdmVycmlkZVBhbmUocGFnZUJvb2spOworCQl9CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2VsZWN0ZWRPdmVycmlkZUJvb2xlYW5Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8QmFzZU92ZXJyaWRlLCBCb29sZWFuPih0aGlzLnNlbGVjdGVkT3ZlcnJpZGVIb2xkZXIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEJhc2VPdmVycmlkZSB2YWx1ZSkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUgIT0gbnVsbCk7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgdm9pZCBpbml0aWFsaXplT3ZlcnJpZGVzTGlzdChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJbmV3IEFkZFJlbW92ZUxpc3RQYW5lPFQ+KAorCQkJdGhpcywKKwkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA4KSwKKwkJCWJ1aWxkT3ZlcnJpZGVzQWRhcHRlcigpLAorCQkJYnVpbGRPdmVycmlkZXNMaXN0TW9kZWwoKSwKKwkJCXRoaXMuc2VsZWN0ZWRPdmVycmlkZUhvbGRlciwKKwkJCWJ1aWxkT3ZlcnJpZGVMYWJlbFByb3ZpZGVyKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfQVRUUklCVVRFX09WRVJSSURFUworCQkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJ1dHRvblBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGhlbHBJZCkgeworCQkJCS8vbm8gYnV0dG9uczogbm8gd2F5IHRvIGFkZC9yZW1vdmUvZWRpdCBvdmVycmlkZXMsIHRoZXkgYXJlIGFsbCBkZWZhdWx0ZWQgaW4KKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgeworCQkJCS8vbm8gYnV0dG9uczogbm8gd2F5IHRvIGFkZC9yZW1vdmUvZWRpdCBvdmVycmlkZXMsIHRoZXkgYXJlIGFsbCBkZWZhdWx0ZWQgaW4KKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlUGFuZShQYWdlQm9vayBwYWdlQm9vaykgeworCQlQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+ICBhdHRyaWJ1dGVPdmVycmlkZUhvbGRlciA9IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIoKTsKKwkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZVBhbmUgPSBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlUGFuZShwYWdlQm9vaywgYXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIpOworCQlpbnN0YWxsQXR0cmlidXRlT3ZlcnJpZGVQYW5lRW5hYmxlcih0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlUGFuZSwgYXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIpOworCX0KKworCXByb3RlY3RlZCBQYW5lPEF0dHJpYnV0ZU92ZXJyaWRlPiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlUGFuZShQYWdlQm9vayBwYWdlQm9vaywgUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZUhvbGRlcikgeworCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlQ29tcG9zaXRlKHRoaXMsIGF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyLCBwYWdlQm9vayk7CisJfQorCQorCXByaXZhdGUgdm9pZCBpbnN0YWxsQXR0cmlidXRlT3ZlcnJpZGVQYW5lRW5hYmxlcihQYW5lPEF0dHJpYnV0ZU92ZXJyaWRlPiBwYW5lLCBQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+IG92ZXJyaWRlSG9sZGVyKSB7CisJCW5ldyBQYW5lRW5hYmxlcigKKwkJCWJ1aWxkT3ZlcnJpZGVCb29sZWFuSG9sZGVyKG92ZXJyaWRlSG9sZGVyKSwKKwkJCXBhbmUKKwkJKTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE92ZXJyaWRlQm9vbGVhbkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEJhc2VPdmVycmlkZT4gb3ZlcnJpZGVIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8QmFzZU92ZXJyaWRlLCBCb29sZWFuPihvdmVycmlkZUhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKEJhc2VPdmVycmlkZSB2YWx1ZSkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoIXZhbHVlLmlzVmlydHVhbCgpKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFzc29jaWF0aW9uT3ZlcnJpZGVQYW5lKFBhZ2VCb29rIHBhZ2VCb29rKSB7CisJCVByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlPiAgYXNzb2NpYXRpb25PdmVycmlkZUhvbGRlciA9IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUhvbGRlcigpOworCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVQYW5lID0gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlUGFuZShwYWdlQm9vaywgYXNzb2NpYXRpb25PdmVycmlkZUhvbGRlcik7CisJCWluc3RhbGxBc3NvY2lhdGlvbk92ZXJyaWRlUGFuZUVuYWJsZXIodGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlUGFuZSwgYXNzb2NpYXRpb25PdmVycmlkZUhvbGRlcik7CisJfQorCisJcHJvdGVjdGVkIFBhbmU8QXNzb2NpYXRpb25PdmVycmlkZT4gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlUGFuZShQYWdlQm9vayBwYWdlQm9vaywgUHJvcGVydHlWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlKHRoaXMsIGFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIsIHBhZ2VCb29rKTsJCQorCX0KKworCXByaXZhdGUgdm9pZCBpbnN0YWxsQXNzb2NpYXRpb25PdmVycmlkZVBhbmVFbmFibGVyKFBhbmU8QXNzb2NpYXRpb25PdmVycmlkZT4gcGFuZSwgUHJvcGVydHlWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGU+IG92ZXJyaWRlSG9sZGVyKSB7CisJCW5ldyBQYW5lRW5hYmxlcigKKwkJCWJ1aWxkT3ZlcnJpZGVCb29sZWFuSG9sZGVyKG92ZXJyaWRlSG9sZGVyKSwKKwkJCXBhbmUKKwkJKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5zdGFsbE92ZXJyaWRlQ29udHJvbFN3aXRjaGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGU+IG92ZXJyaWRlSG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFnZUJvb2sgcGFnZUJvb2spIHsKKworCQluZXcgQ29udHJvbFN3aXRjaGVyKAorCQkJb3ZlcnJpZGVIb2xkZXIsCisJCQlidWlsZFBhbmVUcmFuc2Zvcm1lcigpLAorCQkJcGFnZUJvb2sKKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlPiBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGUsIEFzc29jaWF0aW9uT3ZlcnJpZGU+KHRoaXMuc2VsZWN0ZWRPdmVycmlkZUhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQXNzb2NpYXRpb25PdmVycmlkZSB0cmFuc2Zvcm1fKEJhc2VPdmVycmlkZSB2YWx1ZSkgeworCQkJCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBBc3NvY2lhdGlvbk92ZXJyaWRlKSA/IChBc3NvY2lhdGlvbk92ZXJyaWRlKSB2YWx1ZSA6IG51bGw7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGUsIEF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnNlbGVjdGVkT3ZlcnJpZGVIb2xkZXIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlIHRyYW5zZm9ybV8oQmFzZU92ZXJyaWRlIHZhbHVlKSB7CisJCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZU92ZXJyaWRlKSA/IChBdHRyaWJ1dGVPdmVycmlkZSkgdmFsdWUgOiBudWxsOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGJ1aWxkRGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzTGlzdEhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcj4gY29udGFpbmVySG9sZGVyKSB7CisJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciwgQXNzb2NpYXRpb25PdmVycmlkZT4oY29udGFpbmVySG9sZGVyLCBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxBc3NvY2lhdGlvbk92ZXJyaWRlPiBsaXN0SXRlcmF0b3JfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlPiBidWlsZERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0SG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4gY29udGFpbmVySG9sZGVyKSB7CisJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIsIEF0dHJpYnV0ZU92ZXJyaWRlPihjb250YWluZXJIb2xkZXIsIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7CisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGdldE92ZXJyaWRlVmlydHVhbE92ZXJyaWRlSG9sZGVyKCkgeworCQlpZiAodGhpcy5vdmVycmlkZVZpcnR1YWxPdmVycmlkZUhvbGRlciA9PSBudWxsKSB7CisJCQl0aGlzLm92ZXJyaWRlVmlydHVhbE92ZXJyaWRlSG9sZGVyID0gYnVpbGRPdmVycmlkZVZpcnR1YWxPdmVycmlkZUhvbGRlcigpOworCQl9CisJCXJldHVybiB0aGlzLm92ZXJyaWRlVmlydHVhbE92ZXJyaWRlSG9sZGVyOworCX0KKworCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE92ZXJyaWRlVmlydHVhbE92ZXJyaWRlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IENhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2VPdmVycmlkZSwgQm9vbGVhbj4odGhpcy5zZWxlY3RlZE92ZXJyaWRlSG9sZGVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQl1cGRhdGVPdmVycmlkZSh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhCYXNlT3ZlcnJpZGUgdmFsdWUpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCF2YWx1ZS5pc1ZpcnR1YWwoKSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRPdmVycmlkZURpc3BsYXlTdHJpbmcoQmFzZU92ZXJyaWRlIG92ZXJyaWRlKSB7CisJCVN0cmluZyBvdmVycmlkZVR5cGU7CisKKwkJLy8gUmV0cmlldmUgdGhlIHR5cGUKKwkJaWYgKG92ZXJyaWRlIGluc3RhbmNlb2YgQXNzb2NpYXRpb25PdmVycmlkZSkgeworCQkJb3ZlcnJpZGVUeXBlID0gSnB0VWlEZXRhaWxzTWVzc2FnZXMuT3ZlcnJpZGVzQ29tcG9zaXRlX2Fzc29jaWF0aW9uOworCQl9CisJCWVsc2UgeworCQkJb3ZlcnJpZGVUeXBlID0gSnB0VWlEZXRhaWxzTWVzc2FnZXMuT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZTsKKwkJfQorCisJCS8vIEZvcm1hdCB0aGUgbmFtZQorCQlTdHJpbmcgbmFtZSA9IG92ZXJyaWRlLmdldE5hbWUoKTsKKworCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lKSkgeworCQkJbmFtZSA9IEpwdFVpRGV0YWlsc01lc3NhZ2VzLk92ZXJyaWRlc0NvbXBvc2l0ZV9ub05hbWU7CisJCX0KKworCQkvLyBGb3JtYXQ6IDxuYW1lPiAoQXR0cmlidXRlL0Fzc29jaWF0aW9uIE92ZXJyaWRlKQorCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJc2IuYXBwZW5kKG5hbWUpOworCQlzYi5hcHBlbmQoIiAoIik7CisJCXNiLmFwcGVuZChvdmVycmlkZVR5cGUpOworCQlzYi5hcHBlbmQoIikgIik7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBidWlsZE92ZXJyaWRlTGFiZWxQcm92aWRlcigpIHsKKwkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCQlyZXR1cm4gYnVpbGRPdmVycmlkZURpc3BsYXlTdHJpbmcoKEJhc2VPdmVycmlkZSkgZWxlbWVudCk7CisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIEFkYXB0ZXIgYnVpbGRPdmVycmlkZXNBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKKworCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7CisJCQkJLy9ubyB3YXkgdG8gYWRkL3JlbW92ZS9lZGl0IG92ZXJyaWRlcywgdGhleSBhcmUgYWxsIGRlZmF1bHRlZCBpbgorCQkJfQorCisJCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKKwkJCQkvL25vIHdheSB0byBhZGQvcmVtb3ZlL2VkaXQgb3ZlcnJpZGVzLCB0aGV5IGFyZSBhbGwgZGVmYXVsdGVkIGluCisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEJhc2VPdmVycmlkZT4gYnVpbGRPdmVycmlkZXNMaXN0SG9sZGVyKCkgeworCQlQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVySG9sZGVyID0gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lckhvbGRlcigpOworCQlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBCYXNlT3ZlcnJpZGU+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgQmFzZU92ZXJyaWRlPj4oKTsKKwkJCisJCWxpc3QuYWRkKGJ1aWxkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzTGlzdEhvbGRlcihhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lckhvbGRlcikpOworCQlsaXN0LmFkZChidWlsZERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0SG9sZGVyKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVySG9sZGVyKSk7CisJCQorCQlpZiAoc3VwcG9ydHNBc3NvY2lhdGlvbk92ZXJyaWRlcygpKSB7CisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcj4gYXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lckhvbGRlciA9IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lckhvbGRlcigpOworCQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc0xpc3RIb2xkZXIoYXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lckhvbGRlcikpOworCQkJbGlzdC5hZGQoYnVpbGREZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXNMaXN0SG9sZGVyKGFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJIb2xkZXIpKTsKKwkJfQorCQkKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgQmFzZU92ZXJyaWRlPiwgQmFzZU92ZXJyaWRlPihsaXN0KTsKKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyPiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVySG9sZGVyKCk7CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgUHJvcGVydHlWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI+IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lckhvbGRlcigpOworCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGU+IGJ1aWxkT3ZlcnJpZGVzTGlzdE1vZGVsKCkgeworCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxCYXNlT3ZlcnJpZGU+KAorCQkJYnVpbGRPdmVycmlkZXNMaXN0SG9sZGVyKCksCisJCQlCYXNlT3ZlcnJpZGUuTkFNRV9QUk9QRVJUWQorCQkpOworCX0KKworCXByaXZhdGUgVHJhbnNmb3JtZXI8QmFzZU92ZXJyaWRlLCBDb250cm9sPiBidWlsZFBhbmVUcmFuc2Zvcm1lcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxCYXNlT3ZlcnJpZGUsIENvbnRyb2w+KCkgeworCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKEJhc2VPdmVycmlkZSBvdmVycmlkZSkgeworCQkJCXJldHVybiBBYnN0cmFjdE92ZXJyaWRlc0NvbXBvc2l0ZS50aGlzLnRyYW5zZm9ybVNlbGVjdGVkT3ZlcnJpZGUob3ZlcnJpZGUpOworCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIEdpdmVuIHRoZSBzZWxlY3RlZCBvdmVycmlkZSwgcmV0dXJuIHRoZSBjb250cm9sIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29udHJvbCB0cmFuc2Zvcm1TZWxlY3RlZE92ZXJyaWRlKEJhc2VPdmVycmlkZSBzZWxlY3RlZE92ZXJyaWRlKSB7CisJCWlmIChzZWxlY3RlZE92ZXJyaWRlIGluc3RhbmNlb2YgQXR0cmlidXRlT3ZlcnJpZGUpIHsKKwkJCXJldHVybiBBYnN0cmFjdE92ZXJyaWRlc0NvbXBvc2l0ZS50aGlzLmF0dHJpYnV0ZU92ZXJyaWRlUGFuZS5nZXRDb250cm9sKCk7CisJCX0KKworCQlpZiAoc2VsZWN0ZWRPdmVycmlkZSBpbnN0YW5jZW9mIEFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKKwkJCXJldHVybiBBYnN0cmFjdE92ZXJyaWRlc0NvbXBvc2l0ZS50aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVQYW5lLmdldENvbnRyb2woKTsKKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGJ1aWxkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNMaXN0SG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyPiBjb250YWluZXJIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLCBBc3NvY2lhdGlvbk92ZXJyaWRlPihjb250YWluZXJIb2xkZXIsIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuU1BFQ0lGSUVEX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNUKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8QXNzb2NpYXRpb25PdmVycmlkZT4gbGlzdEl0ZXJhdG9yXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+IGJ1aWxkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzTGlzdEhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+IGNvbnRhaW5lckhvbGRlcikgeworCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLCBBdHRyaWJ1dGVPdmVycmlkZT4oY29udGFpbmVySG9sZGVyLCBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVPdmVycmlkZShib29sZWFuIHNlbGVjdGVkKSB7CisKKwkJaWYgKGlzUG9wdWxhdGluZygpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlzZXRQb3B1bGF0aW5nKHRydWUpOworCisJCXRyeSB7CisJCQlCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUgPSB0aGlzLnNlbGVjdGVkT3ZlcnJpZGVIb2xkZXIuZ2V0VmFsdWUoKTsKKworCQkJQmFzZU92ZXJyaWRlIG5ld092ZXJyaWRlID0gb3ZlcnJpZGUuc2V0VmlydHVhbCghc2VsZWN0ZWQpOworCQkJdGhpcy5zZWxlY3RlZE92ZXJyaWRlSG9sZGVyLnNldFZhbHVlKG5ld092ZXJyaWRlKTsKKwkJfQorCQlmaW5hbGx5IHsKKwkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODM2N2M5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMzUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFic3RyYWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtIEpvaW4gQ29sdW1ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFbnRpdHkKKyAqIEBzZWUgSW5oZXJpdGFuY2VDb21wb3NpdGUgLSBUaGUgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU8VCBleHRlbmRzIEVudGl0eT4gZXh0ZW5kcyBQYW5lPFQ+Cit7CisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBqb2luQ29sdW1uSG9sZGVyOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBBYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKKworCQlFbnRpdHkgc3ViamVjdCA9IGdldFN1YmplY3QoKTsKKwkJaW50IGluZGV4ID0gc3ViamVjdC5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7CisKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHN1YmplY3QuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgpOworCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKGpvaW5Db2x1bW4pOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKKworCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyBkaWFsb2cgPSBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2coCisJCQlnZXRTaGVsbCgpLAorCQkJZ2V0U3ViamVjdCgpLAorCQkJbnVsbAorCQkpOworCisJCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkQWRkUHJpbWFyeUtleUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkpOworCX0KKworCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZz4gYnVpbGRBZGRQcmltYXJ5S2V5Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSB7CisJCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZz4oKSB7CisJCQlwdWJsaWMgdm9pZCBleGVjdXRlKFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nIGRpYWxvZykgeworCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKKwkJCQkJYWRkSm9pbkNvbHVtbihkaWFsb2cuZ2V0U3ViamVjdCgpKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIGFic3RyYWN0IExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbnNMaXN0SG9sZGVyKCk7CisKKwlwcml2YXRlIFBvc3RFeGVjdXRpb248UHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2c+IGJ1aWxkRWRpdFByaW1hcnlLZXlKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpIHsKKwkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nPigpIHsKKwkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cgZGlhbG9nKSB7CisJCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgeworCQkJCQllZGl0Sm9pbkNvbHVtbihkaWFsb2cuZ2V0U3ViamVjdCgpKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGRKb2luQ29sdW1uSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBidWlsZEpvaW5Db2x1bW5MYWJlbChQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCWlmIChqb2luQ29sdW1uLmlzVmlydHVhbCgpKSB7CisJCQlyZXR1cm4gTkxTLmJpbmQoCisJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdCwKKwkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKKwkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKKwkJCSk7CisJCX0KKworCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgeworCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIE5MUy5iaW5kKAorCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdCwKKwkJCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCisJCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQorCQkJCSk7CisJCQl9CisKKwkJCXJldHVybiBOTFMuYmluZCgKKwkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQsCisJCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCisJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCisJCQkpOworCQl9CisKKwkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gTkxTLmJpbmQoCisJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdCwKKwkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKKwkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKKwkJCSk7CisJCX0KKworCQlyZXR1cm4gTkxTLmJpbmQoCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXMsCisJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKKwkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQorCQkpOworCX0KKworCXByaXZhdGUgQWRhcHRlciBidWlsZEpvaW5Db2x1bW5zQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBBYnN0cmFjdEFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKKwkJCQlhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCkgeworCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZWRpdDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBvcHRpb25PblNlbGVjdGlvbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7CisJCQkJZWRpdFByaW1hcnlLZXlKb2luQ29sdW1uKGxpc3RTZWxlY3Rpb25Nb2RlbCk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCisJCQkJaW50W10gc2VsZWN0ZWRJbmRpY2VzID0gbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkSW5kaWNlcygpOworCQkJCUVudGl0eSBlbnRpdHkgPSBnZXRTdWJqZWN0KCk7CisKKwkJCQlmb3IgKGludCBpbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7IC0taW5kZXggPj0gMDsgKSB7CisJCQkJCWVudGl0eS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CisJCQkJcmV0dXJuIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgZWxlbWVudCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpOworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKKwkJTGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW4+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW4+PigpOworCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKKwkJbGlzdC5hZGQoYnVpbGREZWZhdWx0Sm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkpOworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4sIFByaW1hcnlLZXlKb2luQ29sdW1uPihsaXN0KTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0xpc3RNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UHJpbWFyeUtleUpvaW5Db2x1bW4+KAorCQkJYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0SG9sZGVyKCksCisJCQlOYW1lZENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwKKwkJCU5hbWVkQ29sdW1uLkRFRkFVTFRfTkFNRV9QUk9QRVJUWSwKKwkJCUJhc2VKb2luQ29sdW1uLlNQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLAorCQkJQmFzZUpvaW5Db2x1bW4uREVGQVVMVF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZCisJCSk7CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8RW50aXR5LCBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKwkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSB2b2lkIGVkaXRKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKKwkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihzdGF0ZU9iamVjdC5nZXRKb2luQ29sdW1uKCkpOworCX0KKworCXByaXZhdGUgdm9pZCBlZGl0UHJpbWFyeUtleUpvaW5Db2x1bW4oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCisJCVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW4pIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7CisKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cgZGlhbG9nID0gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nKAorCQkJZ2V0U2hlbGwoKSwKKwkJCWdldFN1YmplY3QoKSwKKwkJCWpvaW5Db2x1bW4KKwkJKTsKKworCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZSgpOworCQlqb2luQ29sdW1uSG9sZGVyID0gYnVpbGRKb2luQ29sdW1uSG9sZGVyKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJLy8gUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zIGdyb3VwIHBhbmUKKwkJR3JvdXAgZ3JvdXBQYW5lID0gYWRkVGl0bGVkR3JvdXAoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcHJpbWFyeUtleUpvaW5Db2x1bW4KKwkJKTsKKworCQkvLyBPdmVycmlkZSBEZWZhdWx0IEpvaW4gQ29sdW1ucyBjaGVjayBib3gKKwkJYWRkQ2hlY2tCb3goCisJCQlhZGRTdWJQYW5lKGdyb3VwUGFuZSwgOCksCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLAorCQkJYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCksCisJCQludWxsCisJCSk7CisKKwkJLy8gUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zIGxpc3QgcGFuZQorCQlBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHk+IGpvaW5Db2x1bW5zTGlzdFBhbmUgPSBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PigKKwkJCXRoaXMsCisJCQlncm91cFBhbmUsCisJCQlidWlsZEpvaW5Db2x1bW5zQWRhcHRlcigpLAorCQkJYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0TW9kZWwoKSwKKwkJCWpvaW5Db2x1bW5Ib2xkZXIsCisJCQlidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9DT0xVTU5TCisJCSk7CisKKwkJaW5zdGFsbEpvaW5Db2x1bW5zTGlzdFBhbmVFbmFibGVyKGpvaW5Db2x1bW5zTGlzdFBhbmUpOworCX0KKworCXByaXZhdGUgdm9pZCBpbnN0YWxsSm9pbkNvbHVtbnNMaXN0UGFuZUVuYWJsZXIoQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PiBwYW5lKSB7CisJCW5ldyBQYW5lRW5hYmxlcigKKwkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpLAorCQkJcGFuZQorCQkpOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luQ29sdW1ucyhib29sZWFuIHNlbGVjdGVkKSB7CisKKwkJaWYgKGlzUG9wdWxhdGluZygpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlzZXRQb3B1bGF0aW5nKHRydWUpOworCisJCXRyeSB7CisJCQkvLyBBZGQgYSBqb2luIGNvbHVtbiBieSBjcmVhdGluZyBhIHNwZWNpZmllZCBvbmUgdXNpbmcgdGhlIGRlZmF1bHQKKwkJCS8vIG9uZSBpZiBpdCBleGlzdHMKKwkJCWlmIChzZWxlY3RlZCkgeworCisJCQkJc3dpdGNoRGVmYXVsdFRvU3BlY2lmaWVkKCk7CisJCQl9CisJCQkvLyBSZW1vdmUgYWxsIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW5zCisJCQllbHNlIHsKKwkJCQlmb3IgKGludCBpbmRleCA9IGdldFN1YmplY3QoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7IC0taW5kZXggPj0gMDsgKSB7CisJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbmRleCk7CisJCQkJfQorCQkJfQorCQl9CisJCWZpbmFsbHkgeworCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzd2l0Y2hEZWZhdWx0VG9TcGVjaWZpZWQoKTsKKwkKKwlwcml2YXRlIGNsYXNzIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIgZXh0ZW5kcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHsKKworCQlwdWJsaWMgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpIHsKKwkJCXN1cGVyKGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7CisJCQlyZXR1cm4gbGlzdEhvbGRlci5zaXplKCkgPiAwOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgeworCQkJdXBkYXRlSm9pbkNvbHVtbnModmFsdWUpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWQzNTM0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbnRpdHlDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgT3JtRW50aXR5CisgKiBAc2VlIE9ybUVudGl0eUNvbXBvc2l0ZSAtIFRoZSBjb250YWluZXIgb2YgdGhpcyBwYW5lCisgKiBAc2VlIEFkZFJlbW92ZUxpc3RQYW5lCisgKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPFQgZXh0ZW5kcyBFbnRpdHk+IGV4dGVuZHMgRm9ybVBhbmU8VD4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUoRm9ybVBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JRW50aXR5PC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEFic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZFNlY29uZGFyeVRhYmxlRnJvbURpYWxvZyhTZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2csIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKKwkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCk7CisJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUoZGlhbG9nLmdldFNlbGVjdGVkVGFibGUoKSk7CisJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coZGlhbG9nLmdldFNlbGVjdGVkQ2F0YWxvZygpKTsKKwkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKGRpYWxvZy5nZXRTZWxlY3RlZFNjaGVtYSgpKTsKKworCQlsaXN0U2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShzZWNvbmRhcnlUYWJsZSk7CisJfQorCisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlPiBidWlsZFNlY29uZGFyeVRhYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTZWNvbmRhcnlUYWJsZT4oKTsKKwl9CisKKwlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgYnVpbGRTZWNvbmRhcnlUYWJsZUxhYmVsUHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CisJCQkJLy8gVE9ETyBkaXNwbGF5IGEgcXVhbGlmaWVkIG5hbWUgaW5zdGVhZAorCQkJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlKSBlbGVtZW50OworCQkJCWlmIChzZWNvbmRhcnlUYWJsZS5nZXROYW1lKCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpOworCQkJCX0KKwkJCQlyZXR1cm4gIiI7Ly9UT0RPCisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIFNlY29uZGFyeVRhYmxlRGlhbG9nIGJ1aWxkU2Vjb25kYXJ5VGFibGVEaWFsb2dGb3JBZGQoKSB7CisJCXJldHVybiBuZXcgU2Vjb25kYXJ5VGFibGVEaWFsb2coZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCksIGdldFN1YmplY3QoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCksIGdldFN1YmplY3QoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7CisJfQorCQorCXByb3RlY3RlZCBBZGRSZW1vdmVMaXN0UGFuZS5BZGFwdGVyIGJ1aWxkU2Vjb25kYXJ5VGFibGVzQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7CisKKwkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCQkJCVNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZyA9IGJ1aWxkU2Vjb25kYXJ5VGFibGVEaWFsb2dGb3JBZGQoKTsKKwkJCQlhZGRTZWNvbmRhcnlUYWJsZUZyb21EaWFsb2coZGlhbG9nLCBsaXN0U2VsZWN0aW9uTW9kZWwpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCkgeworCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfZWRpdDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBvcHRpb25PblNlbGVjdGlvbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7CisJCQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGUpIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7CisJCQkJU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nID0gbmV3IFNlY29uZGFyeVRhYmxlRGlhbG9nKGdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLCBzZWNvbmRhcnlUYWJsZSk7CisJCQkJZWRpdFNlY29uZGFyeVRhYmxlRnJvbURpYWxvZyhkaWFsb2csIHNlY29uZGFyeVRhYmxlKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7CisJCQkJRW50aXR5IGVudGl0eSA9IGdldFN1YmplY3QoKTsKKwkJCQlpbnRbXSBzZWxlY3RlZEluZGljZXMgPSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRJbmRpY2VzKCk7CisKKwkJCQlmb3IgKGludCBpbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7IC0taW5kZXggPj0gMDsgKSB7CisJCQkJCWVudGl0eS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gZW5hYmxlT3B0aW9uT25TZWxlY3Rpb25DaGFuZ2UoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCQkJCWlmIChsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXNTaXplKCkgIT0gMSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOworCQkJCXJldHVybiAhc2Vjb25kYXJ5VGFibGUuaXNWaXJ0dWFsKCk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gZW5hYmxlUmVtb3ZlT25TZWxlY3Rpb25DaGFuZ2UoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCQkJCWlmIChsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZSkgbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKKwkJCQlyZXR1cm4gIXNlY29uZGFyeVRhYmxlLmlzVmlydHVhbCgpOwkJCQkKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBlZGl0U2Vjb25kYXJ5VGFibGVGcm9tRGlhbG9nKFNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZywgU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKKwkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKGRpYWxvZy5nZXRTZWxlY3RlZFRhYmxlKCkpOworCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKGRpYWxvZy5nZXRTZWxlY3RlZENhdGFsb2coKSk7CisJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYShkaWFsb2cuZ2V0U2VsZWN0ZWRTY2hlbWEoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDA1ZGQzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBUcmFuc2llbnRNYXBwaW5nPgorCWltcGxlbWVudHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxUPgoreworCXByb3RlY3RlZCBBYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgeworCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQkJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGQwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0aWJsZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBUZW1wb3JhbFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBWZXJzaW9uTWFwcGluZworICogQHNlZSBDb2x1bW5Db21wb3NpdGUKKyAqIEBzZWUgVGVtcG9yYWxUeXBlQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBWZXJzaW9uTWFwcGluZz4gCisJZXh0ZW5kcyBGb3JtUGFuZTxUPgorCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklWZXJzaW9uTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXByb3RlY3RlZCBBYnN0cmFjdFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENvbHVtbj4gYnVpbGRDb2x1bW5Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIENvbHVtbiB0cmFuc2Zvcm1fKFQgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0Q29sdW1uKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJzaW9uUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fdHlwZQorCQkpOworCQkoKEdyaWRMYXlvdXQpIGNvbnRhaW5lci5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7CisKKwkJLy8gTm8gY29udmVydGVyCisJCUJ1dHRvbiBub0NvbnZlcnRlckJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAorCQkJY29udGFpbmVyLCAKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2RlZmF1bHQsIAorCQkJYnVpbGROb0NvbnZlcnRlckhvbGRlcigpLCAKKwkJCW51bGwpOworCQkoKEdyaWREYXRhKSBub0NvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKKwkJCQkKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gc3BlY2lmaWVkQ29udmVydGVySG9sZGVyID0gYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJLy8gVGVtcG9yYWwKKwkJYWRkUmFkaW9CdXR0b24oCisJCQljb250YWluZXIsIAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fdGVtcG9yYWwsIAorCQkJYnVpbGRUZW1wb3JhbEJvb2xlYW5Ib2xkZXIoKSwgCisJCQludWxsKTsKKwkJcmVnaXN0ZXJTdWJQYW5lKG5ldyBUZW1wb3JhbFR5cGVDb21wb3NpdGUoYnVpbGRUZW1wb3JhbENvbnZlcnRlckhvbGRlcihzcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSkpOworCX0KKwkKKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb0NvbnZlcnRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VmVyc2lvbk1hcHBpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLlNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkgPT0gbnVsbCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKKwkJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGVtcG9yYWxCb29sZWFuSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxWZXJzaW9uTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuU1BFQ0lGSUVEX0NPTlZFUlRFUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENvbnZlcnRlcigpOworCQkJCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSB7CisJCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFZlcnNpb25NYXBwaW5nLCBDb252ZXJ0ZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLlNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIENvbnZlcnRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENvbnZlcnRlcigpOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxUZW1wb3JhbENvbnZlcnRlcj4gYnVpbGRUZW1wb3JhbENvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXIsIFRlbXBvcmFsQ29udmVydGVyPihjb252ZXJ0ZXJIb2xkZXIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFRlbXBvcmFsQ29udmVydGVyIHRyYW5zZm9ybV8oQ29udmVydGVyIGNvbnZlcnRlcikgeworCQkJCXJldHVybiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyLmdldFR5cGUoKSA9PSBDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKSA/IChUZW1wb3JhbENvbnZlcnRlcikgY29udmVydGVyIDogbnVsbDsKKwkJCX0KKwkJfTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYmIxM2QKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb248VCBleHRlbmRzIFZlcnNpb25NYXBwaW5nPgorCWltcGxlbWVudHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxUPgoreworCXByb3RlY3RlZCBBYnN0cmFjdFZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7CisJCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldEtleSgpKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlZlcnNpb25NYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7CisJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5WZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWNjZXNzVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BY2Nlc3NUeXBlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxZmI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWNjZXNzVHlwZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGFibGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgQWNjZXNzIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEFjY2Vzc0hvbGRlcgorICogQHNlZSBPcm1FbnRpdHlDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKKyAqIEBzZWUgT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICogQHNlZSBPcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCisgKgorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBBY2Nlc3NUeXBlQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8QWNjZXNzSG9sZGVyPiB7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFjY2Vzc1R5cGVDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEFjY2Vzc1R5cGVDb21wb3NpdGUoRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEFjY2Vzc0hvbGRlcj4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisJCisJcHVibGljIEFjY2Vzc1R5cGVDb21wb3NpdGUoRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwKKyAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBBY2Nlc3NIb2xkZXI+IHN1YmplY3RIb2xkZXIsCisgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJRW51bUZvcm1Db21ib1ZpZXdlcjxBY2Nlc3NIb2xkZXIsIEFjY2Vzc1R5cGU+IGNvbWJvVmlld2VyID0KKwkJCWFkZEFjY2Vzc1R5cGVDb21ib1ZpZXdlcihjb250YWluZXIpOworCisJCWFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlKcHRVaU1lc3NhZ2VzLkFjY2Vzc1R5cGVDb21wb3NpdGVfYWNjZXNzLAorCQkJY29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpCisJCSk7CisJfQorCQorCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxBY2Nlc3NIb2xkZXIsIEFjY2Vzc1R5cGU+IGFkZEFjY2Vzc1R5cGVDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEFjY2Vzc0hvbGRlciwgQWNjZXNzVHlwZT4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoQWNjZXNzSG9sZGVyLkRFRkFVTFRfQUNDRVNTX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChBY2Nlc3NIb2xkZXIuU1BFQ0lGSUVEX0FDQ0VTU19QUk9QRVJUWSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEFjY2Vzc1R5cGVbXSBnZXRDaG9pY2VzKCkgeworCQkJCXJldHVybiBBY2Nlc3NUeXBlLnZhbHVlcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRBY2Nlc3MoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoQWNjZXNzVHlwZSB2YWx1ZSkgeworCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCisJCQkJCUpwdFVpTWVzc2FnZXMuY2xhc3MsCisJCQkJCUFjY2Vzc1R5cGVDb21wb3NpdGUudGhpcywKKwkJCQkJdmFsdWUKKwkJCQkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGdldFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQWNjZXNzVHlwZSB2YWx1ZSkgeworCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRBY2Nlc3ModmFsdWUpOworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0FkZFF1ZXJ5RGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0FkZFF1ZXJ5RGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY5YmE5MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQWRkUXVlcnlEaWFsb2cuamF2YQpAQCAtMCwwICsxLDE4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuVmFsaWRhdGluZ0RpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0xpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCisvKioKKyAqIENsaWVudHMgY2FuIHVzZSB0aGlzIGRpYWxvZyB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIFNlY29uZGFyeVRhYmxlIHNldHRpbmdzLgorICogVXNlIHRoZSBmb2xsb3dpbmcgb25jZSB0aGUgZGlhbG9nIGlzIGNsb3NlZDoKKyAqICAgICBAc2VlICNnZXRTZWxlY3RlZFRhYmxlKCkKKyAqICAgICBAc2VlICNnZXRTZWxlY3RlZENhdGFsb2coKQorICogICAgIEBzZWUgI2dldFNlbGVjdGVkU2NoZW1hKCkKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgQWRkUXVlcnlEaWFsb2cgZXh0ZW5kcyBWYWxpZGF0aW5nRGlhbG9nPEFkZFF1ZXJ5U3RhdGVPYmplY3Q+IHsKKworCQorCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKKworCS8qKgorCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHRvIGVkaXQgYW4gZXhpc3RpbmcgY29udmVyc2lvbiB2YWx1ZQorCSAqLworCXB1YmxpYyBBZGRRdWVyeURpYWxvZyhTaGVsbCBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQWRkUXVlcnlTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgeworCQlyZXR1cm4gbmV3IEFkZFF1ZXJ5U3RhdGVPYmplY3QoKTsKKwl9CisKKwkvLyAqKioqKioqKioqIG9wZW4gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKKwkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOworCQlzaGVsbC5zZXRUZXh0KHRoaXMuZ2V0VGl0bGUoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkFkZFF1ZXJ5RGlhbG9nX3RpdGxlOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25UaXRsZSgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkFkZFF1ZXJ5RGlhbG9nX2Rlc2NyaXB0aW9uVGl0bGU7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5BZGRRdWVyeURpYWxvZ19kZXNjcmlwdGlvbjsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERpYWxvZ1BhbmU8QWRkUXVlcnlTdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IFF1ZXJ5RGlhbG9nUGFuZShjb250YWluZXIpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7CisJCXN1cGVyLmNyZWF0ZSgpOworCisJCVF1ZXJ5RGlhbG9nUGFuZSBwYW5lID0gKFF1ZXJ5RGlhbG9nUGFuZSkgZ2V0UGFuZSgpOworCQlwYW5lLnNlbGVjdEFsbCgpOworCisJCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgorCisJLyoqCisJICogUmV0dXJuIHRoZSBkYXRhIHZhbHVlIHNldCBpbiB0aGUgdGV4dCB3aWRnZXQuCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldE5hbWUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG9iamVjdCB2YWx1ZSBzZXQgaW4gdGhlIHRleHQgd2lkZ2V0LgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlUeXBlKCkgeworCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFF1ZXJ5VHlwZSgpOworCX0KKwkKKwlwcml2YXRlIGNsYXNzIFF1ZXJ5RGlhbG9nUGFuZSBleHRlbmRzIERpYWxvZ1BhbmU8QWRkUXVlcnlTdGF0ZU9iamVjdD4geworCisJCXByaXZhdGUgVGV4dCBuYW1lVGV4dDsKKworCQlRdWVyeURpYWxvZ1BhbmUoQ29tcG9zaXRlIHBhcmVudCkgeworCQkJc3VwZXIoQWRkUXVlcnlEaWFsb2cudGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIHBhcmVudCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCQl0aGlzLm5hbWVUZXh0ID0gYWRkTGFiZWxlZFRleHQoCisJCQkJY29udGFpbmVyLAorCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkFkZFF1ZXJ5RGlhbG9nX25hbWUsCisJCQkJYnVpbGROYW1lSG9sZGVyKCkKKwkJCSk7CisJCQkKKwkJCWFkZExhYmVsZWRDb21ibygKKwkJCQljb250YWluZXIsIAorCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkFkZFF1ZXJ5RGlhbG9nX3F1ZXJ5VHlwZSwgCisJCQkJYnVpbGRRdWVyeVR5cGVMaXN0SG9sZGVyKCksIAorCQkJCWJ1aWxkUXVlcnlUeXBlSG9sZGVyKCksIAorCQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCksCisJCQkJbnVsbCk7CisJCX0KKworCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFF1ZXJ5VHlwZUxpc3RIb2xkZXIoKSB7CisJCQlMaXN0PFN0cmluZz4gcXVlcnlUeXBlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJcXVlcnlUeXBlcy5hZGQoUXVlcnkuTkFNRURfUVVFUlkpOworCQkJcXVlcnlUeXBlcy5hZGQoUXVlcnkuTkFNRURfTkFUSVZFX1FVRVJZKTsKKwkJCQorCQkJcmV0dXJuIG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHF1ZXJ5VHlwZXMpOworCQl9CisJCQorCQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkU3RyaW5nQ29udmVydGVyKCkgeworCQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKKwkJCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKKwkJCQkJaWYgKHZhbHVlID09IFF1ZXJ5Lk5BTUVEX1FVRVJZKSB7CisJCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQWRkUXVlcnlEaWFsb2dfbmFtZWRRdWVyeTsKKwkJCQkJfQorCQkJCQlpZiAodmFsdWUgPT0gUXVlcnkuTkFNRURfTkFUSVZFX1FVRVJZKSB7CisJCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQWRkUXVlcnlEaWFsb2dfbmFtZWROYXRpdmVRdWVyeTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdmFsdWU7CisJCQkJfQorCQkJfTsKKwkJfQorCQkKKwkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcigpIHsKKwkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEFkZFF1ZXJ5U3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBBZGRRdWVyeVN0YXRlT2JqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKKwkJCQl9CisJCQl9OworCQl9CisKKwkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUXVlcnlUeXBlSG9sZGVyKCkgeworCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QWRkUXVlcnlTdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEFkZFF1ZXJ5U3RhdGVPYmplY3QuUVVFUllfVFlQRV9QUk9QRVJUWSkgeworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnlUeXBlKCk7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCQl0aGlzLnN1YmplY3Quc2V0UXVlcnlUeXBlKHZhbHVlKTsKKwkJCQl9CisJCQl9OworCQl9CisKKwkJdm9pZCBzZWxlY3RBbGwoKSB7CisJCQl0aGlzLm5hbWVUZXh0LnNlbGVjdEFsbCgpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BZGRRdWVyeVN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0FkZFF1ZXJ5U3RhdGVPYmplY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQ4NjJjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9BZGRRdWVyeVN0YXRlT2JqZWN0LmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuQWJzdHJhY3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLlByb2JsZW07CisKKy8qKgorICogVGhpcyBpcyB0aGUgc3RhdGUgb2JqZWN0IHVzZWQgYnkgdGhlIDxjb2RlPkFkZFF1ZXJ5RGlhbG9nPC9jb2RlPiwgd2hpY2ggc3RvcmVzCisgKiB0aGUgY3VycmVudCBuYW1lIGFuZCB2YWxpZGF0ZXMgaXQgd2hlbiBpdCBpcyBtb2RpZmllZC4KKyAqCisgKiBAc2VlIEFkZFF1ZXJ5RGlhbG9nCisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK2ZpbmFsIGNsYXNzIEFkZFF1ZXJ5U3RhdGVPYmplY3QgZXh0ZW5kcyBBYnN0cmFjdE5vZGUKK3sKKwkvKioKKwkgKiBUaGUgaW5pdGlhbCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIFRoZSBpbml0aWFsIHF1ZXJ5VHlwZSBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXByaXZhdGUgU3RyaW5nIHF1ZXJ5VHlwZTsKKworCS8qKgorCSAqIFRoZSA8Y29kZT5WYWxpZGF0b3I8L2NvZGU+IHVzZWQgdG8gdmFsaWRhdGUgdGhpcyBzdGF0ZSBvYmplY3QuCisJICovCisJcHJpdmF0ZSBWYWxpZGF0b3IgdmFsaWRhdG9yOworCisJLyoqCisJICogTm90aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIGRhdGEgdmFsdWUgcHJvcGVydHkuCisJICovCisJc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWVQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgcXVlcnkgdHlwZSBwcm9wZXJ0eS4KKwkgKi8KKwlzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1RZUEVfUFJPUEVSVFkgPSAicXVlcnlUeXBlUHJvcGVydHkiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5ld05hbWVTdGF0ZU9iamVjdDwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gbmFtZSBUaGUgaW5pdGlhbCBpbnB1dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbml0aWFsIHZhbHVlIGNhbgorCSAqIGJlIHNwZWNpZmllZAorCSAqIEBwYXJhbSBuYW1lcyBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyB0aGF0IGNhbid0IGJlIHVzZWQgb3IgYW4gZW1wdHkKKwkgKiBjb2xsZWN0aW9uIGlmIG5vbmUgYXJlIGF2YWlsYWJsZQorCSAqLworCUFkZFF1ZXJ5U3RhdGVPYmplY3QoKSB7CisJCXN1cGVyKG51bGwpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZE5hbWVQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7CisJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMubmFtZSkpIHsKKwkJCWN1cnJlbnRQcm9ibGVtcy5hZGQoYnVpbGRQcm9ibGVtKEpwdFVpRGV0YWlsc01lc3NhZ2VzLlF1ZXJ5U3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZCkpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFF1ZXJ5VHlwZVByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKKwkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5xdWVyeVR5cGUpKSB7CisJCQljdXJyZW50UHJvYmxlbXMuYWRkKGJ1aWxkUHJvYmxlbShKcHRVaURldGFpbHNNZXNzYWdlcy5RdWVyeVN0YXRlT2JqZWN0X3R5cGVNdXN0QmVTcGVjaWZpZWQpKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKKwkJc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOworCQlhZGROYW1lUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOworCQlhZGRRdWVyeVR5cGVQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tQYXJlbnQoTm9kZSBwYXJlbnROb2RlKSB7CisJCS8vbm8gcGFyZW50CisJfQorCisJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwlTdHJpbmcgZ2V0UXVlcnlUeXBlKCkgeworCQlyZXR1cm4gdGhpcy5xdWVyeVR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKKwkJdGhpcy5uYW1lID0gbmV3TmFtZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRRdWVyeVR5cGUoU3RyaW5nIG5ld1F1ZXJ5VHlwZSkgeworCQlTdHJpbmcgb2xkID0gdGhpcy5xdWVyeVR5cGU7CisJCXRoaXMucXVlcnlUeXBlID0gbmV3UXVlcnlUeXBlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFFVRVJZX1RZUEVfUFJPUEVSVFksIG9sZCwgbmV3UXVlcnlUeXBlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoVmFsaWRhdG9yIHZhbGlkYXRvcikgeworCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKKwkJcmV0dXJuIHRoaXMudmFsaWRhdG9yOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQXNzb2NpYXRpb25PdmVycmlkZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Bc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZlNjFiZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQXNzb2NpYXRpb25PdmVycmlkZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgSm9pbkNvbHVtbnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEFzc29jaWF0aW9uT3ZlcnJpZGUKKyAqIEBzZWUgRW50aXR5T3ZlcnJpZGVzQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqIEBzZWUgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUKKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGVDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxBc3NvY2lhdGlvbk92ZXJyaWRlPgoreworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QXNzb2NpYXRpb25PdmVycmlkZTwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlKEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsIAorCQkJCQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGU+IHN1YmplY3RIb2xkZXIsCisJCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQkvLyBqb2luaW5nIHN0cmF0ZWd5IGdyb3VwIHBhbmUKKwkJR3JvdXAgZ3JvdXBQYW5lID0gYWRkVGl0bGVkR3JvdXAoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX3RpdGxlCisJCSk7CisJCQorCQlhZGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZShncm91cFBhbmUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuCisJCQlidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lV2l0aG91dEluY2x1ZGVPdmVycmlkZUNoZWNrQm94KAorCQkJCXRoaXMsIAorCQkJCWJ1aWxkUmVsYXRpb25zaGlwUmVmZXJlbmNlSG9sZGVyKCksIAorCQkJCWNvbnRhaW5lcik7CQkKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gYnVpbGRSZWxhdGlvbnNoaXBSZWZlcmVuY2VIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZSwgQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlIHRyYW5zZm9ybV8oQXNzb2NpYXRpb25PdmVycmlkZSB2YWx1ZSkgeworCQkJCXJldHVybiB2YWx1ZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwkJCX0KKwkJfTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0F0dHJpYnV0ZU92ZXJyaWRlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0F0dHJpYnV0ZU92ZXJyaWRlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk4YjUzMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQXR0cmlidXRlT3ZlcnJpZGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IENvbHVtbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBBdHRyaWJ1dGVPdmVycmlkZQorICogQHNlZSBFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBDb2x1bW5Db21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIEF0dHJpYnV0ZU92ZXJyaWRlQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8QXR0cmlidXRlT3ZlcnJpZGU+Cit7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkF0dHJpYnV0ZU92ZXJyaWRlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QXR0cmlidXRlT3ZlcnJpZGU8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgQXR0cmlidXRlT3ZlcnJpZGVDb21wb3NpdGUoRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwgCisJCQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQXR0cmlidXRlT3ZlcnJpZGU+IHN1YmplY3RIb2xkZXIsCisJCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgQ29sdW1uQ29tcG9zaXRlKAorCQkJdGhpcywKKwkJCWJ1aWxkQ29sdW1uSG9sZGVyKCksCisJCQljb250YWluZXIsCisJCQlmYWxzZQorCQkpOworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDb2x1bW4+IGJ1aWxkQ29sdW1uSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlLCBDb2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ29sdW1uIHRyYW5zZm9ybV8oQXR0cmlidXRlT3ZlcnJpZGUgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0Q29sdW1uKCk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQmFzZUpvaW5Db2x1bW5EaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQmFzZUpvaW5Db2x1bW5EaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTVlOTIxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSm9pbkNvbHVtbkRpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlZhbGlkYXRpbmdEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CisKKy8qKgorICogVGhlIGFic3RyYWN0IGRlZmluaXRpb24gdGhlIGRpYWxvZyBzaG93aW5nIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBqb2luIGNvbHVtbgorICogdG8gZWRpdCBvciB0byBjcmVhdGUuCisgKgorICogQHNlZSBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0CisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSm9pbkNvbHVtbkRpYWxvZzxUIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdD4gZXh0ZW5kcyBWYWxpZGF0aW5nRGlhbG9nPFQ+IHsKKworCS8qKgorCSAqIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHN0YXRlIG9iamVjdAorCSAqIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZS4KKwkgKi8KKwlwcml2YXRlIEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW47CisKKwkvKioKKwkgKiBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcyBsb2NhdGVkLgorCSAqLworCXByaXZhdGUgT2JqZWN0IG93bmVyOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSm9pbkNvbHVtbkRpYWxvZzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKKwkgKiBAcGFyYW0gb3duZXIgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMgbG9jYXRlZAorCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQorCSAqLworCXB1YmxpYyBCYXNlSm9pbkNvbHVtbkRpYWxvZyhTaGVsbCBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvd25lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCisJCXN1cGVyKHBhcmVudCk7CisKKwkJdGhpcy5vd25lciAgICAgID0gb3duZXI7CisJCXRoaXMuam9pbkNvbHVtbiA9IGpvaW5Db2x1bW47CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfZGVzY3JpcHRpb247CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvblRpdGxlKCkgeworCisJCWlmIChqb2luQ29sdW1uID09IG51bGwpIHsKKwkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX2FkZEpvaW5Db2x1bW5EZXNjcmlwdGlvblRpdGxlOworCQl9CisKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfZWRpdEpvaW5Db2x1bW5EZXNjcmlwdGlvblRpdGxlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGpvaW4gY29sdW1uIHVzZWQgYnkgdGhpcyBzdGF0ZSBvYmplY3QgZm9yIGVkaXRpbmcgb3IKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUuCisJICoKKwkgKiBAcmV0dXJuIEVpdGhlciB0aGUgZWRpdGVkIGpvaW4gY29sdW1uIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIEJhc2VKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7CisJCXJldHVybiBqb2luQ29sdW1uOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG93bmVyIHdoZXJlIHRoZSBqb2luIGNvbHVtbiBpcyBsb2NhdGVkIG9yIHdoZXJlIGEgbmV3IG9uZSBjYW4KKwkgKiBiZSBhZGRlZC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHBhcmVudCBvZiB0aGUgam9pbiBjb2x1bW4KKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0IGdldE93bmVyKCkgeworCQlyZXR1cm4gb3duZXI7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKKworCQlpZiAoam9pbkNvbHVtbiA9PSBudWxsKSB7CisJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uVGl0bGU7CisJCX0KKworCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtblRpdGxlOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uRGlhbG9nUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGY3NjhhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUuamF2YQpAQCAtMCwwICsxLDQ0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgTmFtZTogICAgICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgUmVmZXJlbmNlZCBDb2x1bW4gTmFtZTogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgVGFibGU6ICAgICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgQ29sdW1uIERlZmluaXRpb246ICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QKKyAqIEBzZWUgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICogQHNlZSBKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKKyAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKKyAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZTxUIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdD4gZXh0ZW5kcyBEaWFsb2dQYW5lPFQ+Cit7CisJLyoqCisJICogQSBrZXkgdXNlZCB0byByZXByZXNlbnQgdGhlIGRlZmF1bHQgdmFsdWUsIHRoaXMgaXMgcmVxdWlyZWQgdG8gY29udmVydAorCSAqIHRoZSBzZWxlY3RlZCBpdGVtIGZyb20gYSBjb21ibyB0byA8Y29kZT5udWxsPC9jb2RlPi4gVGhpcyBrZXkgaXMgbW9zdAorCSAqIGxpa2VseSBuZXZlciB0eXBlZCB0aGUgdXNlciBhbmQgaXQgd2lsbCBoZWxwIHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvCisJICogPGNvZGU+bnVsbDwvY29kZT4gd2hlbiBpdCdzIHRpbWUgdG8gc2V0IHRoZSBuZXcgc2VsZWN0ZWQgdmFsdWUgaW50byB0aGUKKwkgKiBtb2RlbC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBERUZBVUxUX0tFWSA9ICI/ISMhPyM/Iz9kZWZhdWx0PyM/ISM/ISM/IjsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbHVtbkRlZmluaXRpb25Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LkNPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3QuZ2V0Q29sdW1uRGVmaW5pdGlvbigpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgeworCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJfQorCQkJCXN1YmplY3Quc2V0Q29sdW1uRGVmaW5pdGlvbih2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQlyZXR1cm4gYWRkU3ViUGFuZShwYXJlbnQsIDAsIDcsIDAsIDUpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TmFtZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybV8oQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCB2YWx1ZSkgeworCQkJCVN0cmluZyBuYW1lID0gdmFsdWUuZ2V0RGVmYXVsdE5hbWUoKTsKKworCQkJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCQkJbmFtZSA9IERFRkFVTFRfS0VZOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJbmFtZSA9IERFRkFVTFRfS0VZICsgbmFtZTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gbmFtZTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TmFtZUxpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKKwkJCWJ1aWxkRGVmYXVsdE5hbWVIb2xkZXIoKQorCQkpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm1fKEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QgdmFsdWUpIHsKKwkJCQlTdHJpbmcgbmFtZSA9IHZhbHVlLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOworCisJCQkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJCQluYW1lID0gREVGQVVMVF9LRVk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQluYW1lID0gREVGQVVMVF9LRVkgKyBuYW1lOworCQkJCX0KKworCQkJCXJldHVybiBuYW1lOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZUxpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKKwkJCWJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lSG9sZGVyKCkKKwkJKTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFRhYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtXyhCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0IHZhbHVlKSB7CisJCQkJU3RyaW5nIG5hbWUgPSB2YWx1ZS5nZXREZWZhdWx0VGFibGUoKTsKKworCQkJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCQkJbmFtZSA9IERFRkFVTFRfS0VZOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJbmFtZSA9IERFRkFVTFRfS0VZICsgbmFtZTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gbmFtZTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0VGFibGVMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCisJCQlidWlsZERlZmF1bHRUYWJsZUhvbGRlcigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZERpc3BsYXlhYmxlU3RyaW5nQ29udmVydGVyKGZpbmFsIERlZmF1bHRWYWx1ZUhhbmRsZXIgaGFuZGxlcikgeworCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+KCkgeworCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIHZhbHVlKSB7CisKKwkJCQlpZiAoZ2V0U3ViamVjdCgpID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCisJCQkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCQkJdmFsdWUgPSBoYW5kbGVyLmdldERlZmF1bHRWYWx1ZSgpOworCisJCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCQl2YWx1ZSA9IERFRkFVTFRfS0VZICsgdmFsdWU7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQl2YWx1ZSA9IERFRkFVTFRfS0VZOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSB7CisJCQkJCVN0cmluZyBkZWZhdWx0TmFtZSA9IHZhbHVlLnN1YnN0cmluZyhERUZBVUxUX0tFWS5sZW5ndGgoKSk7CisKKwkJCQkJaWYgKGRlZmF1bHROYW1lLmxlbmd0aCgpID4gMCkgeworCQkJCQkJdmFsdWUgPSBOTFMuYmluZCgKKwkJCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAorCQkJCQkJCWRlZmF1bHROYW1lCisJCQkJCQkpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJdmFsdWUgPSBKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RW1wdHk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4gdmFsdWU7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuTkFNRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LmdldE5hbWUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisKKwkJCQkvLyBDb252ZXJ0IHRoZSBkZWZhdWx0IHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZyB0byBudWxsCisJCQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJgorCQkJCSAgICgodmFsdWUubGVuZ3RoKCkgPT0gMCkgfHwgdmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkpKSB7CisKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKworCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUxpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuTkFNRVNfTElTVCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKKwkJCQlyZXR1cm4gc3ViamVjdC5uYW1lcygpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LmNvbHVtbnNTaXplKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZXNMaXN0SG9sZGVyKCkgeworCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oMik7CisJCWhvbGRlcnMuYWRkKGJ1aWxkRGVmYXVsdE5hbWVMaXN0SG9sZGVyKCkpOworCQlob2xkZXJzLmFkZChidWlsZE5hbWVMaXN0SG9sZGVyKCkpOworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZE5hbWVTdHJpbmdDb252ZXJ0ZXIoKSB7CisJCXJldHVybiBidWlsZERpc3BsYXlhYmxlU3RyaW5nQ29udmVydGVyKG5ldyBEZWZhdWx0VmFsdWVIYW5kbGVyKCkgeworCQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0TmFtZSgpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCisJCQkJLy8gQ29udmVydCB0aGUgZGVmYXVsdCB2YWx1ZSBvciBhbiBlbXB0eSBzdHJpbmcgdG8gbnVsbAorCQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYKKwkJCQkgICAoKHZhbHVlLmxlbmd0aCgpID09IDApIHx8IHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSkgeworCisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisKKwkJCQlzdWJqZWN0LnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZUxpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuUkVGRVJFTkNFX0NPTFVNTl9OQU1FU19MSVNUKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LnJlZmVyZW5jZUNvbHVtbk5hbWVzKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3QucmVmZXJlbmNlQ29sdW1uc1NpemUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZXNMaXN0SG9sZGVyKCkgeworCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oMik7CisJCWhvbGRlcnMuYWRkKGJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lTGlzdEhvbGRlcigpKTsKKwkJaG9sZGVycy5hZGQoYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZUxpc3RIb2xkZXIoKSk7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihob2xkZXJzKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVTdHJpbmdDb252ZXJ0ZXIoKSB7CisJCXJldHVybiBidWlsZERpc3BsYXlhYmxlU3RyaW5nQ29udmVydGVyKG5ldyBEZWZhdWx0VmFsdWVIYW5kbGVyKCkgeworCQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LlRBQkxFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3QuZ2V0VGFibGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisKKwkJCQkvLyBDb252ZXJ0IHRoZSBkZWZhdWx0IHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZyB0byBudWxsCisJCQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJgorCQkJCSAgICgodmFsdWUubGVuZ3RoKCkgPT0gMCkgfHwgdmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkpKSB7CisKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKworCQkJCXN1YmplY3Quc2V0VGFibGUodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhYmxlTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgIiIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3QudGFibGVzKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFibGVzTGlzdEhvbGRlcigpIHsKKwkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOworCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRUYWJsZUxpc3RIb2xkZXIoKSk7CisJCWhvbGRlcnMuYWRkKGJ1aWxkVGFibGVMaXN0SG9sZGVyKCkpOworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFRhYmxlU3RyaW5nQ29udmVydGVyKCkgeworCQlyZXR1cm4gYnVpbGREaXNwbGF5YWJsZVN0cmluZ0NvbnZlcnRlcihuZXcgRGVmYXVsdFZhbHVlSGFuZGxlcigpIHsKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFRhYmxlKCk7CisJCQl9CisJCX0pOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCS8vIE5hbWUgd2lkZ2V0cworCQlDb21ibyBuYW1lQ29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfbmFtZSwKKwkJCWJ1aWxkTmFtZXNMaXN0SG9sZGVyKCksCisJCQlidWlsZE5hbWVIb2xkZXIoKSwKKwkJCWJ1aWxkTmFtZVN0cmluZ0NvbnZlcnRlcigpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX0NPTFVNTl9OQU1FCisJCSk7CisKKwkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKG5hbWVDb21ibyk7CisKKwkJLy8gUmVmZXJlbmNlZCBDb2x1bW4gTmFtZSB3aWRnZXRzCisJCUNvbWJvIHJlZmVyZW5jZWRDb2x1bW5OYW1lQ29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfcmVmZXJlbmNlZENvbHVtbk5hbWUsCisJCQlidWlsZFJlZmVyZW5jZWRDb2x1bW5OYW1lc0xpc3RIb2xkZXIoKSwKKwkJCWJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVIb2xkZXIoKSwKKwkJCWJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVTdHJpbmdDb252ZXJ0ZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9SRUZFUkVOQ0VEX0NPTFVNTgorCQkpOworCisJCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihyZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvKTsKKworCQkvLyBUYWJsZSB3aWRnZXRzCisJCWlmIChpc1RhYmxlRWRpdGFibGUoKSkgeworCisJCQlDb21ibyB0YWJsZUNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCisJCQkJY29udGFpbmVyLAorCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX3RhYmxlLAorCQkJCWJ1aWxkVGFibGVzTGlzdEhvbGRlcigpLAorCQkJCWJ1aWxkVGFibGVIb2xkZXIoKSwKKwkJCQlidWlsZFRhYmxlU3RyaW5nQ29udmVydGVyKCksCisJCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1JFRkVSRU5DRURfQ09MVU1OCisJCQkpOworCisJCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIodGFibGVDb21ibyk7CisJCX0KKwkJZWxzZSB7CisJCQlDb21ibyB0YWJsZUNvbWJvID0gYWRkTGFiZWxlZENvbWJvKAorCQkJCWNvbnRhaW5lciwKKwkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV90YWJsZSwKKwkJCQlidWlsZFRhYmxlc0xpc3RIb2xkZXIoKSwKKwkJCQlidWlsZFRhYmxlSG9sZGVyKCksCisJCQkJYnVpbGRUYWJsZVN0cmluZ0NvbnZlcnRlcigpLAorCQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9SRUZFUkVOQ0VEX0NPTFVNTgorCQkJKTsKKworCQkJdGFibGVDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKKwkJfQorCisJCS8vIENvbHVtbiBEZWZpbml0aW9uIHdpZGdldHMKKwkJYWRkTGFiZWxlZFRleHQoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV9jb2x1bW5EZWZpbml0aW9uLAorCQkJYnVpbGRDb2x1bW5EZWZpbml0aW9uSG9sZGVyKCkKKwkJKTsKKwl9CisKKwkvKioKKwkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRhYmxlIGNvbWJvIHNob3VsZCBiZSBlZGl0YWJsZSBvciBub3QuIFRoZSBkZWZhdWx0CisJICogaXMgdG8ga2VlcCB0aGUgY29tYm8gcmVhZC1vbmx5LgorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byBzdXBwb3J0IHRoZSBlZGl0aW5nIG9mIHRoZSBzZWxlY3RlZCB0YWJsZTsKKwkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWJsZUVkaXRhYmxlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBpbnRlcmZhY2UgRGVmYXVsdFZhbHVlSGFuZGxlciB7CisJCVN0cmluZyBnZXREZWZhdWx0VmFsdWUoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzBmYjk2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEKQEAgLTAsMCArMSwzOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5BYnN0cmFjdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOworCisvKioKKyAqIFRoZSBhYnN0cmFjdCBkZWZpbml0aW9uIG9mIGEgc3RhdGUgb2JqZWN0IHVzZWQgdG8gZWRpdCBvciBjcmVhdGUgYSBuZXcKKyAqIGpvaW4gY29sdW1uLgorICoKKyAqIEBzZWUgQWJzdHJhY3RKb2luQ29sdW1uCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QgZXh0ZW5kcyBBYnN0cmFjdE5vZGUKK3sKKwkvKioKKwkgKiBUaGUgU1FMIGZyYWdtZW50IHRoYXQgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIERETCBmb3IgdGhlIGNvbHVtbi4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uOworCisJLyoqCisJICogRWl0aGVyIHRoZSBqb2luIGNvbHVtbiBpcyBiZWluZyBlZGl0ZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4gdGhlIHN0YXRlCisJICogb2JqZWN0IGlzIGJlaW5nIGNyZWF0ZWQuCisJICovCisJcHJpdmF0ZSBCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uOworCisJLyoqCisJICogVGhlIGpvaW4gY29sdW1uJ3MgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZGVmaW5lZC4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBuYW1lOworCisJLyoqCisJICogVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMgbG9jYXRlZC4KKwkgKi8KKwlwcml2YXRlIE9iamVjdCBvd25lcjsKKworCS8qKgorCSAqIFRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBkZWZpbmVkLgorCSAqLworCXByaXZhdGUgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lOworCisJLyoqCisJICogVGhlIHRhYmxlCisJICovCisJcHJpdmF0ZSBTdHJpbmcgdGFibGU7CisKKwkvKioKKwkgKiBLZWVwcyB0cmFjayBvZiB0aGUgPGNvZGU+VmFsaWRhdG9yPC9jb2RlPiBzaW5jZSB0aGlzIGlzIHRoZSByb290IG9iamVjdC4KKwkgKi8KKwlwcml2YXRlIFZhbGlkYXRvciB2YWxpZGF0b3I7CisKKwkvKioKKwkgKiBJZGVudGlmaWVzIGEgY2hhbmdlIGluIHRoZSBjb2x1bW4gZGVmaW5pdGlvbiBwcm9wZXJ0eS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSA9ICJjb2x1bW5EZWZpbml0aW9uIjsKKworCS8qKgorCSAqIElkZW50aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIG5hbWUgcHJvcGVydHkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKKworCS8qKgorCSAqIElkZW50aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIGxpc3Qgb2YgbmFtZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNfTElTVCA9ICJuYW1lcyI7CisKKwkvKioKKwkgKiBJZGVudGlmaWVzIGEgY2hhbmdlIGluIHRoZSBsaXN0IG9mIHJlZmVyZW5jZSBjb2x1bW4gbmFtZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFX0NPTFVNTl9OQU1FU19MSVNUID0gInJlZmVyZW5jZUNvbHVtbk5hbWVzIjsKKworCS8qKgorCSAqIElkZW50aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgcHJvcGVydHkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSA9ICJyZWZlcmVuY2VkQ29sdW1uTmFtZSI7CisKKwkvKioKKwkgKiBJZGVudGlmaWVzIGEgY2hhbmdlIGluIHRoZSB0YWJsZSBwcm9wZXJ0eS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9QUk9QRVJUWSA9ICJ0YWJsZSI7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0Sm9pbkNvbHVtblN0YXRlT2JqZWN0PC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBvd25lciBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcyBsb2NhdGVkCisJICogQHBhcmFtIGpvaW5Db2x1bW4gRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisJICogdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCisJICovCisJcHVibGljIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QoT2JqZWN0IG93bmVyLCBCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCXN1cGVyKG51bGwpOworCQlpbml0aWFsaXplKG93bmVyLCBqb2luQ29sdW1uKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjaGVja1BhcmVudChOb2RlIHBhcmVudE5vZGUpIHsKKwkJLy8gVGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgSm9pbiBDb2x1bW4gc3RhdGUgb2JqZWN0CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMoVGFibGUgdGFibGUpIHsKKwkJaWYgKHRhYmxlID09IG51bGwpIHsKKwkJCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOworCQl9CisJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdCh0YWJsZS5zb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpKS5saXN0SXRlcmF0b3IoKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgaW50IGNvbHVtbnNTaXplKFRhYmxlIHRhYmxlKSB7CisJCWlmICh0YWJsZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gdGFibGUuY29sdW1uc1NpemUoKTsKKwl9CisJCisJcHVibGljIGZpbmFsIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgeworCQlyZXR1cm4gIiI7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgU1FMIGZyYWdtZW50IHRoYXQgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIERETCBmb3IgdGhlCisJICogY29sdW1uLgorCSAqCisJICogQHJldHVybiBUaGUgZWRpdGVkIGNvbHVtbiBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCB1c2VkCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uKCkgeworCQlyZXR1cm4gY29sdW1uRGVmaW5pdGlvbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IG5hbWUgaWYgdGhlIGpvaW4gY29sdW1uIGlzIGJlaW5nIGVkaXRlZCBvdGhlcndpc2UKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KKwkgKgorCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBkZWZhdWx0IG5hbWUgZGVmaW5lZCBieSB0aGUgam9pbiBjb2x1bW4gb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkgeworCQlpZiAodGhpcy5qb2luQ29sdW1uID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBpZiB0aGUgam9pbiBjb2x1bW4gaXMgYmVpbmcKKwkgKiBlZGl0ZWQgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgorCSAqCisJICogQHJldHVybiBFaXRoZXIgdGhlIGRlZmF1bHQgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBkZWZpbmVkIGJ5IHRoZSBqb2luCisJICogY29sdW1uIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7CisJCWlmICh0aGlzLmpvaW5Db2x1bW4gPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMKKwkgKgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZWRpdGVkIGpvaW4gY29sdW1uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgc3RhdGUgb2JqZWN0CisJICogaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lLgorCSAqCisJICogQHJldHVybiBUaGUgZWRpdGVkIGpvaW4gY29sdW1uIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIEJhc2VKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7CisJCXJldHVybiB0aGlzLmpvaW5Db2x1bW47CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgam9pbiBjb2x1bW4uCisJICoKKwkgKiBAcmV0dXJuIEVpdGhlciBqb2luIGNvbHVtbidzIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gdXNlIHRoZSBkZWZhdWx0CisJICogbmFtZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMubmFtZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkYXRhYmFzZSB0YWJsZSBpZiBvbmUgY2FuIGJlIGZvdW5kLgorCSAqCisJICogQHJldHVybiBUaGUgZGF0YWJhc2UgdGFibGUKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgVGFibGUgZ2V0TmFtZVRhYmxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvd25lciB3aGVyZSB0aGUgam9pbiBjb2x1bW4gaXMgbG9jYXRlZCBvciB3aGVyZSBhIG5ldyBvbmUgY2FuCisJICogYmUgYWRkZWQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBwYXJlbnQgb2YgdGhlIGpvaW4gY29sdW1uCisJICovCisJcHVibGljIE9iamVjdCBnZXRPd25lcigpIHsKKwkJcmV0dXJuIG93bmVyOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgb2YgdGhlIGpvaW4gY29sdW1uLgorCSAqCisJICogQHJldHVybiBFaXRoZXIgam9pbiBjb2x1bW4ncyByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogdG8gdXNlIHRoZSBkZWZhdWx0IG5hbWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zCisJICoKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIGFic3RyYWN0IFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKTsKKworCS8qKgorCSAqIFJldHVybnMKKwkgKgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgeworCQlyZXR1cm4gdGFibGU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7CisJCXJldHVybiB0aGlzLnZhbGlkYXRvcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisJCXZhbGlkYXRvciA9IE5VTExfVkFMSURBVE9SOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIHRoaXMgc3RhdGUgb2JqZWN0LgorCSAqCisJICogQHBhcmFtIG93bmVyIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzIGxvY2F0ZWQKKwkgKiBAcGFyYW0gam9pbkNvbHVtbiBFaXRoZXIgdGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKwkgKiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE9iamVjdCBvLCBCYXNlSm9pbkNvbHVtbiBqYykgeworCisJCXRoaXMub3duZXIgICAgICA9IG87CisJCXRoaXMuam9pbkNvbHVtbiA9IGpjOworCQl0aGlzLnRhYmxlICAgICAgPSB0aGlzLmdldEluaXRpYWxUYWJsZSgpOworCisJCWlmIChqYyAhPSBudWxsKSB7CisJCQl0aGlzLm5hbWUgICAgICAgICAgICAgICAgID0gamMuZ2V0U3BlY2lmaWVkTmFtZSgpOworCQkJdGhpcy5jb2x1bW5EZWZpbml0aW9uICAgICA9IGpjLmdldENvbHVtbkRlZmluaXRpb24oKTsKKwkJCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUgPSBqYy5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucworCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0SW5pdGlhbFRhYmxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb2x1bW4gbmFtZXMgaWYgdGhlIGRhdGFiYXNlIHRhYmxlIGNhbiBiZSByZXNvbHZlZC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG5hbWVzIG9mIHRoZSB0YWJsZSdzIGNvbHVtbnMgb3IgYW4gZW1wdHkgaXRlcmF0b3IgaWYgdGhlIHRhYmxlCisJICogY2FuJ3QgYmUgcmVzb2x2ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmFtZXMoKSB7CisJCXJldHVybiBjb2x1bW5OYW1lcyhnZXROYW1lVGFibGUoKSk7CisJfQorCisJcHVibGljIGludCBjb2x1bW5zU2l6ZSgpIHsKKwkJcmV0dXJuIGNvbHVtbnNTaXplKGdldE5hbWVUYWJsZSgpKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvbHVtbiBuYW1lcyBpZiB0aGUgZGF0YWJhc2UgdGFibGUgY2FuIGJlIHJlc29sdmVkLgorCSAqCisJICogQHJldHVybiBUaGUgbmFtZXMgb2YgdGhlIHRhYmxlJ3MgY29sdW1ucyBvciBhbiBlbXB0eSBpdGVyYXRvciBpZiB0aGUgdGFibGUKKwkgKiBjYW4ndCBiZSByZXNvbHZlZAorCSAqLworCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiByZWZlcmVuY2VDb2x1bW5OYW1lcygpIHsKKwkJcmV0dXJuIGNvbHVtbk5hbWVzKGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSk7CisJfQorCQorCXB1YmxpYyBpbnQgcmVmZXJlbmNlQ29sdW1uc1NpemUoKSB7CisJCXJldHVybiBjb2x1bW5zU2l6ZShnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIFNRTCBmcmFnbWVudCB0aGF0IGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBEREwgZm9yIHRoZSBjb2x1bW4uCisJICoKKwkgKiBAcGFyYW0gY29sdW1uRGVmaW5pdGlvbiBUaGUgbmV3IGpvaW4gY29sdW1uJ3MgY29sdW1uIGRlZmluaXRpb24gb3IKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiB0byBjbGVhciB0aGUgdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uKFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKSB7CisJCVN0cmluZyBvbGRDb2x1bW5EZWZpbml0aW9uID0gdGhpcy5jb2x1bW5EZWZpbml0aW9uOworCQl0aGlzLmNvbHVtbkRlZmluaXRpb24gPSBjb2x1bW5EZWZpbml0aW9uOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZLCBvbGRDb2x1bW5EZWZpbml0aW9uLCBjb2x1bW5EZWZpbml0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBqb2luIGNvbHVtbi4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgam9pbiBjb2x1bW4ncyBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUKKwkgKiBkZWZhdWx0IG5hbWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5hbWUpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgb2YgdGhlIGpvaW4gY29sdW1uLgorCSAqCisJICogQHBhcmFtIHJlZmVyZW5jZWRDb2x1bW5OYW1lIFRoZSBuZXcgam9pbiBjb2x1bW4ncyByZWZlcmVuY2VkIGNvbHVtbiBuYW1lCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gdXNlIHRoZSBkZWZhdWx0IHJlZmVyZW5jZWQgY29sdW1uIG5hbWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKKwkJU3RyaW5nIG9sZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZTsKKwkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHJlZmVyZW5jZWRDb2x1bW5OYW1lOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFJFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCByZWZlcmVuY2VkQ29sdW1uTmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGFibGUoU3RyaW5nIHRhYmxlKSB7CisJCVN0cmluZyBvbGRUYWJsZSA9IHRoaXMudGFibGU7CisJCXRoaXMudGFibGUgPSB0YWJsZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChUQUJMRV9QUk9QRVJUWSwgb2xkVGFibGUsIHRhYmxlKTsKKwkJdGFibGVDaGFuZ2VkKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIHZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKKwkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7CisJfQorCisJLyoqCisJICogVGhlIHRhYmxlIGZyb20gd2hpY2ggdGhlIGNvbHVtbiBuYW1lcyBhcmUgdXNlZCBoYXMgY2hhbmdlZCwgbm90aWZpZXMgdGhlCisJICogbGlzdGVuZXJzIHRoZSBsaXN0IG9mIG5hbWVzIGFuZCByZWZlcmVuY2UgY29sdW1uIG5hbWVzIHNob3VsZCBiZSB1cGRhdGVkLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHRhYmxlQ2hhbmdlZCgpIHsKKwkJZmlyZUxpc3RDaGFuZ2VkKE5BTUVTX0xJU1QsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubmFtZXMoKSkpOworCQlmaXJlTGlzdENoYW5nZWQoUkVGRVJFTkNFX0NPTFVNTl9OQU1FU19MSVNULCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnJlZmVyZW5jZUNvbHVtbk5hbWVzKCkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgYWxsIHRoZSB0YWJsZSBuYW1lcyBjb250YWlucyBpbiB0aGUgYXNzb2NpYXRlZAorCSAqIHNjaGVtYS4gVGhlIGRlZmF1bHQgcmV0dXJucyBhbiBlbXB0eSBpdGVyYXRvci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG5hbWVzIG9mIHRoZSB0YWJsZXMKKwkgKi8KKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFibGVzKCkgeworCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBnaXZlbiBqb2luIGNvbHVtbiB3aXRoIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgc3RhdGUKKwkgKiBvYmplY3QuCisJICoKKwkgKiBAcGFyYW0gam9pbkNvbHVtbiBUaGUgam9pbiBjb2x1bW4gdG8gdXBkYXRlCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlSm9pbkNvbHVtbihCYXNlSm9pbkNvbHVtbiBqYykgeworCisJCS8vIE5hbWUKKwkJaWYgKHZhbHVlc0FyZURpZmZlcmVudChuYW1lLCBqYy5nZXRTcGVjaWZpZWROYW1lKCkpKSB7CisJCQlqYy5zZXRTcGVjaWZpZWROYW1lKG5hbWUpOworCQl9CisKKwkJLy8gUmVmZXJlbmNlZCBDb2x1bW4gTmFtZQorCQlpZiAodmFsdWVzQXJlRGlmZmVyZW50KHJlZmVyZW5jZWRDb2x1bW5OYW1lLCBqYy5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKSkgeworCQkJamMuc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOworCQl9CisKKwkJLy8gQ29sdW1uIERlZmluaXRpb24KKwkJaWYgKHZhbHVlc0FyZURpZmZlcmVudChjb2x1bW5EZWZpbml0aW9uLCBqYy5nZXRDb2x1bW5EZWZpbml0aW9uKCkpKSB7CisJCQlqYy5zZXRDb2x1bW5EZWZpbml0aW9uKGNvbHVtbkRlZmluaXRpb24pOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YTk3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRW51bVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IExvYkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEJhc2ljTWFwcGluZworICogQHNlZSBDb2x1bW5Db21wb3NpdGUKKyAqIEBzZWUgRW51bVR5cGVDb21wb3NpdGUKKyAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCisgKiBAc2VlIExvYkNvbXBvc2l0ZQorICogQHNlZSBPcHRpb25hbENvbXBvc2l0ZQorICogQHNlZSBUZW1wb3JhbFR5cGVDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIEJhc2ljTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0QmFzaWNNYXBwaW5nQ29tcG9zaXRlPEJhc2ljTWFwcGluZz4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklCYXNpY01hcHBpbmc8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgQmFzaWNNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNpY01hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2ljTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmYTMxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2ljTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPEJhc2ljTWFwcGluZz4KLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgQmFzaWNNYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBCYXNpY01hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8QmFzaWNNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGU8QmFzaWNNYXBwaW5nPiBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCUpwYVVpRmFjdG9yeSBmYWN0b3J5LAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8QmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVCYXNpY01hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9CYXNpY0xhYmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9DYXNjYWRlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Nhc2NhZGVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjY4MDBkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9DYXNjYWRlQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLSBDYXNjYWRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IHggQWxsICAgICAgIHggUGVyc2lzdCAgIHggTWVyZ2UgICAgIHggUmVtb3ZlICAgIHggUmVmcmVzaCAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIENhc2NhZGUKKyAqIEBzZWUgUmVsYXRpb25zaGlwTWFwcGluZworICogQHNlZSBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICogQHNlZSBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCisgKiBAc2VlIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKKyAqIEBzZWUgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBDYXNjYWRlQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8Q2FzY2FkZT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhc2NhZGVDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklDYXNjYWRlPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgQ2FzY2FkZUNvbXBvc2l0ZShGb3JtUGFuZTw/IGV4dGVuZHMgUmVsYXRpb25zaGlwTWFwcGluZz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIENhc2NhZGU+IHN1YmplY3RIb2xkZXIsCisJCSAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbHVtbkNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklDYXNjYWRlPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIENhc2NhZGVDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDYXNjYWRlPiBzdWJqZWN0SG9sZGVyLAorCQkgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCQkgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDYXNjYWRlVHlwZUFsbEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FzY2FkZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYXNjYWRlLkFMTF9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gc3ViamVjdC5pc0FsbCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJc3ViamVjdC5zZXRBbGwodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDYXNjYWRlVHlwZU1lcmdlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYXNjYWRlLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENhc2NhZGUuTUVSR0VfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3QuaXNNZXJnZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJc3ViamVjdC5zZXRNZXJnZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhc2NhZGVUeXBlUGVyc2lzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FzY2FkZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYXNjYWRlLlBFUlNJU1RfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3QuaXNQZXJzaXN0KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlzdWJqZWN0LnNldFBlcnNpc3QodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDYXNjYWRlVHlwZVJlZnJlc2hIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhc2NhZGUsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ2FzY2FkZS5SRUZSRVNIX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LmlzUmVmcmVzaCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJc3ViamVjdC5zZXRSZWZyZXNoKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ2FzY2FkZVR5cGVSZW1vdmVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhc2NhZGUsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ2FzY2FkZS5SRU1PVkVfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3QuaXNSZW1vdmUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXN1YmplY3Quc2V0UmVtb3ZlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQkvLyBDYXNjYWRlIGdyb3VwCisJCUdyb3VwIGNhc2NhZGVHcm91cCA9IGFkZFRpdGxlZEdyb3VwKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ2FzY2FkZUNvbXBvc2l0ZV9jYXNjYWRlVGl0bGUKKwkJKTsKKworCQkvLyBDb250YWluZXIgb2YgdGhlIGNoZWNrIGJveGVzCisJCWNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY2FzY2FkZUdyb3VwLCA1LCA4LCAwLCAwLCAwKTsKKworCQkvLyBBbGwgY2hlY2sgYm94CisJCWFkZENoZWNrQm94KAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ2FzY2FkZUNvbXBvc2l0ZV9hbGwsCisJCQlidWlsZENhc2NhZGVUeXBlQWxsSG9sZGVyKCksCisJCQludWxsCisJCSk7CisKKwkJLy8gUGVyc2lzdCBjaGVjayBib3gKKwkJYWRkQ2hlY2tCb3goCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5DYXNjYWRlQ29tcG9zaXRlX3BlcnNpc3QsCisJCQlidWlsZENhc2NhZGVUeXBlUGVyc2lzdEhvbGRlcigpLAorCQkJbnVsbAorCQkpOworCisJCS8vIE1lcmdlIGNoZWNrIGJveAorCQlhZGRDaGVja0JveCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNhc2NhZGVDb21wb3NpdGVfbWVyZ2UsCisJCQlidWlsZENhc2NhZGVUeXBlTWVyZ2VIb2xkZXIoKSwKKwkJCW51bGwKKwkJKTsKKworCQkvLyBSZW1vdmUgY2hlY2sgYm94CisJCWFkZENoZWNrQm94KAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ2FzY2FkZUNvbXBvc2l0ZV9yZW1vdmUsCisJCQlidWlsZENhc2NhZGVUeXBlUmVtb3ZlSG9sZGVyKCksCisJCQludWxsCisJCSk7CisKKwkJLy8gUmVmcmVzaCBjaGVjayBib3gKKwkJYWRkQ2hlY2tCb3goCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5DYXNjYWRlQ29tcG9zaXRlX3JlZnJlc2gsCisJCQlidWlsZENhc2NhZGVUeXBlUmVmcmVzaEhvbGRlcigpLAorCQkJbnVsbAorCQkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0NvbHVtbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Db2x1bW5Db21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTRkYTFkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Db2x1bW5Db21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDY0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuQ29sdW1uQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuRGF0YWJhc2VPYmplY3RDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5UYWJsZUNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENvbHVtbkNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVGFibGVDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCA+IERldGFpbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgeCBJbnNlcnRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICB4IFVwZGF0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgIHggVW5pcXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgeCBOdWxsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgTGVuZ3RoOiAgICAgICAgICAgIHwgSSAgICAgICAgIHxJfCAgRGVmYXVsdCAoWFhYKSAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgUHJlY2lzaW9uOiAgICAgICAgIHwgSSAgICAgICAgIHxJfCAgRGVmYXVsdCAoWFhYKSAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgU2NhbGU6ICAgICAgICAgICAgIHwgSSAgICAgICAgIHxJfCAgRGVmYXVsdCAoWFhYKSAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgQ29sdW1uIERlZmluaXRpb246IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBDb2x1bW4KKyAqIEBzZWUgQ29sdW1uQ29tYm8KKyAqIEBzZWUgVGFibGVDb21ibworICogQHNlZSBCYXNpY01hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKKyAqIEBzZWUgRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCisgKiBAc2VlIElkTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICogQHNlZSBWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgQ29sdW1uQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8Q29sdW1uPiB7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbHVtbkNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUNvbHVtbjwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIENvbHVtbkNvbXBvc2l0ZShGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb2x1bW4+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db2x1bW5Db21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklDb2x1bW48L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKKwkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgY29udHJvbGxlcjsKKwkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KKwkgKi8KKwlwdWJsaWMgQ29sdW1uQ29tcG9zaXRlKEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIENvbHVtbj4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbHVtbkNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUNvbHVtbjwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cworCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBjb250cm9sbGVyOworCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQorCSAqLworCXB1YmxpYyBDb2x1bW5Db21wb3NpdGUoRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29sdW1uPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywKKwkgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcGFyZW50TWFuYWdlUGFuZSkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywgcGFyZW50TWFuYWdlUGFuZSk7CisJfQorCisJcHJpdmF0ZSBDb2x1bW5Db21ibzxDb2x1bW4+IGFkZENvbHVtbkNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IENvbHVtbkNvbWJvPENvbHVtbj4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoTmFtZWRDb2x1bW4uREVGQVVMVF9OQU1FX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChOYW1lZENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoQmFzZUNvbHVtbi5ERUZBVUxUX1RBQkxFX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChCYXNlQ29sdW1uLlNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJCQlpZiAocHJvcGVydHlOYW1lID09IEJhc2VDb2x1bW4uREVGQVVMVF9UQUJMRV9QUk9QRVJUWSB8fAorCQkJCSAgICBwcm9wZXJ0eU5hbWUgPT0gQmFzZUNvbHVtbi5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkpIHsKKwkJCQkJdGhpcy5kb1BvcHVsYXRlKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7CisJCQkJfQorCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdE5hbWUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkTmFtZSh2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFRhYmxlIGdldERiVGFibGVfKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGJUYWJsZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWROYW1lKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJDb2x1bW5Db21wb3NpdGUuY29sdW1uQ29tYm8iOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29sdW1uRGVmaW5pdGlvbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgTmFtZWRDb2x1bW4uQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbHVtbkRlZmluaXRpb24oKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKwkJCQl0aGlzLnN1YmplY3Quc2V0Q29sdW1uRGVmaW5pdGlvbih2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRJbnNlcnRhYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQmFzZUNvbHVtbi5TUEVDSUZJRURfSU5TRVJUQUJMRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEluc2VydGFibGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkSW5zZXJ0YWJsZVN0cmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEluc2VydGFibGVIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKKwkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9pbnNlcnRhYmxlV2l0aERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfaW5zZXJ0YWJsZTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0SW5zZXJ0YWJsZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uLCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCUJhc2VDb2x1bW4uU1BFQ0lGSUVEX0lOU0VSVEFCTEVfUFJPUEVSVFksCisJCQlCYXNlQ29sdW1uLkRFRkFVTFRfSU5TRVJUQUJMRV9QUk9QRVJUWSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEluc2VydGFibGUoKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROdWxsYWJsZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uLCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCUJhc2VDb2x1bW4uU1BFQ0lGSUVEX05VTExBQkxFX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWROdWxsYWJsZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE51bGxhYmxlU3RyaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0TnVsbGFibGVIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKKwkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9udWxsYWJsZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOworCQkJCX0KKwkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX251bGxhYmxlOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHROdWxsYWJsZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uLCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCUJhc2VDb2x1bW4uU1BFQ0lGSUVEX05VTExBQkxFX1BST1BFUlRZLAorCQkJQmFzZUNvbHVtbi5ERUZBVUxUX05VTExBQkxFX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHROdWxsYWJsZSgpKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFBhbmU8Q29sdW1uPiBhZGRUYWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IERhdGFiYXNlT2JqZWN0Q29tYm88Q29sdW1uPih0aGlzLCBjb250YWluZXIpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChCYXNlQ29sdW1uLkRFRkFVTFRfVEFCTEVfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKEJhc2VDb2x1bW4uU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFRhYmxlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkVGFibGUodmFsdWUpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFRhYmxlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdmFsdWVzKCkgeworCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkuYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gIkNvbHVtbkNvbXBvc2l0ZS50YWJsZUNvbWJvIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVbmlxdWVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgQm9vbGVhbj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlCYXNlQ29sdW1uLlNQRUNJRklFRF9VTklRVUVfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRVbmlxdWUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRVbmlxdWUodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVbmlxdWVTdHJpbmdIb2xkZXIoKSB7CisKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFVuaXF1ZUhvbGRlcigpKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7CisJCQkJCXJldHVybiBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfdW5pcXVlV2l0aERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfdW5pcXVlOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRVbmlxdWVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgQm9vbGVhbj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlCYXNlQ29sdW1uLlNQRUNJRklFRF9VTklRVUVfUFJPUEVSVFksCisJCQlCYXNlQ29sdW1uLkRFRkFVTFRfVU5JUVVFX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkVW5pcXVlKCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0VW5pcXVlKCkpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVcGRhdGFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgQm9vbGVhbj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlCYXNlQ29sdW1uLkRFRkFVTFRfVVBEQVRBQkxFX1BST1BFUlRZLAorCQkJQmFzZUNvbHVtbi5TUEVDSUZJRURfVVBEQVRBQkxFX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkVXBkYXRhYmxlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXBkYXRhYmxlU3RyaW5nSG9sZGVyKCkgeworCisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRVcGRhdGFibGVIb2xkZXIoKSkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOworCQkJCX0KKwkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0VXBkYXRhYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEJvb2xlYW4+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJQmFzZUNvbHVtbi5TUEVDSUZJRURfVVBEQVRBQkxFX1BST1BFUlRZLAorCQkJQmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRV9QUk9QRVJUWSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFVwZGF0YWJsZSgpICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQkvLyBDb2x1bW4gZ3JvdXAgcGFuZQorCQljb250YWluZXIgPSBhZGRUaXRsZWRHcm91cCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5TZWN0aW9uCisJCSk7CisKKwkJLy8gQ29sdW1uIHdpZGdldHMKKwkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9uYW1lLAorCQkJYWRkQ29sdW1uQ29tYm8oY29udGFpbmVyKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OCisJCSk7CisKKwkJLy8gVGFibGUgd2lkZ2V0cworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3RhYmxlLAorCQkJYWRkVGFibGVDb21ibyhjb250YWluZXIpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVEFCTEUKKwkJKTsKKworCQkvLyBEZXRhaWxzIHN1Yi1wYW5lCisJCWNvbnRhaW5lciA9IGFkZENvbGxhcHNhYmxlU3ViU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9kZXRhaWxzLAorCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKQorCQkpOworCisJCW5ldyBEZXRhaWxzQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDAsIDE2KSk7CisJfQorCQorCXByb3RlY3RlZCBjbGFzcyBEZXRhaWxzQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8Q29sdW1uPiB7CisJCQkJCisJCXB1YmxpYyBEZXRhaWxzQ29tcG9zaXRlKEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIENvbHVtbj4gc3ViamVjdEhvbGRlciwKKyAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJCS8vIEluc2VydGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAorCQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA0KSwKKwkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfaW5zZXJ0YWJsZSwKKwkJCQlidWlsZEluc2VydGFibGVIb2xkZXIoKSwKKwkJCQlidWlsZEluc2VydGFibGVTdHJpbmdIb2xkZXIoKSwKKwkJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9JTlNFUlRBQkxFCisJCQkpOworCisJCQkvLyBVcGRhdGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAorCQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJCWNvbnRhaW5lciwKKwkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfdXBkYXRhYmxlLAorCQkJCWJ1aWxkVXBkYXRhYmxlSG9sZGVyKCksCisJCQkJYnVpbGRVcGRhdGFibGVTdHJpbmdIb2xkZXIoKSwKKwkJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9VUERBVEFCTEUKKwkJCSk7CisKKwkJCS8vIFVuaXF1ZSB0cmktc3RhdGUgY2hlY2sgYm94CisJCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCisJCQkJY29udGFpbmVyLAorCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV91bmlxdWUsCisJCQkJYnVpbGRVbmlxdWVIb2xkZXIoKSwKKwkJCQlidWlsZFVuaXF1ZVN0cmluZ0hvbGRlcigpLAorCQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX1VOSVFVRQorCQkJKTsKKworCQkJLy8gTnVsbGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAorCQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJCWNvbnRhaW5lciwKKwkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbnVsbGFibGUsCisJCQkJYnVpbGROdWxsYWJsZUhvbGRlcigpLAorCQkJCWJ1aWxkTnVsbGFibGVTdHJpbmdIb2xkZXIoKSwKKwkJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9OVUxMQUJMRQorCQkJKTsKKworCQkJYWRkTGVuZ3RoQ29tYm8oY29udGFpbmVyKTsKKwkJCWFkZFByZWNpc2lvbkNvbWJvKGNvbnRhaW5lcik7CisJCQlhZGRTY2FsZUNvbWJvKGNvbnRhaW5lcik7CisKKwkJCS8vIENvbHVtbiBEZWZpbml0aW9uIHdpZGdldHMKKwkJCWFkZExhYmVsZWRUZXh0KAorCQkJCWNvbnRhaW5lciwKKwkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfY29sdW1uRGVmaW5pdGlvbiwKKwkJCQlidWlsZENvbHVtbkRlZmluaXRpb25Ib2xkZXIoKQorCQkJKTsKKwkJfQorCisJCXByaXZhdGUgdm9pZCBhZGRMZW5ndGhDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCQluZXcgSW50ZWdlckNvbWJvPENvbHVtbj4odGhpcywgY29udGFpbmVyKSB7CisJCQkJCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbGVuZ3RoOworCQkJCX0KKwkJCQorCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgeworCQkJCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fTEVOR1RIOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgeworCQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29sdW1uLkRFRkFVTFRfTEVOR1RIX1BST1BFUlRZKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldERlZmF1bHRMZW5ndGgoKSk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJfQorCQkJCQorCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKKwkJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbHVtbi5TUEVDSUZJRURfTEVOR1RIX1BST1BFUlRZKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7CisJCQkJCQl9CisKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKKwkJCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkTGVuZ3RoKHZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCQl9CisJCQl9OworCQl9CisKKwkJcHJpdmF0ZSB2b2lkIGFkZFByZWNpc2lvbkNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJCW5ldyBJbnRlZ2VyQ29tYm88Q29sdW1uPih0aGlzLCBjb250YWluZXIpIHsKKwkJCQkKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9wcmVjaXNpb247CisJCQkJfQorCQkJCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7CisJCQkJCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9QUkVDSVNJT047CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7CisJCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb2x1bW4uREVGQVVMVF9QUkVDSVNJT05fUFJPUEVSVFkpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCQl9CisJCQkJCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgeworCQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29sdW1uLlNQRUNJRklFRF9QUkVDSVNJT05fUFJPUEVSVFkpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKTsKKwkJCQkJCX0KKworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgeworCQkJCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRQcmVjaXNpb24odmFsdWUpOworCQkJCQkJfQorCQkJCQl9OworCQkJCX0KKwkJCX07CisJCX0KKworCQlwcml2YXRlIHZvaWQgYWRkU2NhbGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCQluZXcgSW50ZWdlckNvbWJvPENvbHVtbj4odGhpcywgY29udGFpbmVyKSB7CisJCQkJCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfc2NhbGU7CisJCQkJfQorCQkJCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7CisJCQkJCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9TQ0FMRTsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKKwkJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbHVtbi5ERUZBVUxUX1NDQUxFX1BST1BFUlRZKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldERlZmF1bHRTY2FsZSgpKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCQl9CisJCQkJCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgeworCQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29sdW1uLlNQRUNJRklFRF9TQ0FMRV9QUk9QRVJUWSkgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFNjYWxlKCk7CisJCQkJCQl9CisKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKKwkJCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkU2NhbGUodmFsdWUpOworCQkJCQkJfQorCQkJCQl9OworCQkJCX0KKwkJCX07CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Rpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDVjYzg5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwzMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5Db2x1bW5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgPiBEaXNjcmltaW5hdG9yIENvbHVtbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgTmFtZTogICAgICAgICAgICAgICAgfCBDb2x1bW5Db21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgVHlwZTogICAgICAgICAgICAgICAgfCBFbnVtQ29tYm9WaWV3ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCA+IERldGFpbHMJCQkJCQkJCQkJCQkJCQkJICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IENvbHVtbiBEZWZpbml0aW9uOiAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IExlbmd0aDogICAgICAgICAgICAgIHwgSSAgICAgICB8SXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFbnRpdHkKKyAqIEBzZWUgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBDb2x1bW5Db21ibworICogQHNlZSBFbnVtQ29tYm9WaWV3ZXIKKyAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBEaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlPFQgZXh0ZW5kcyBFbnRpdHk+IGV4dGVuZHMgRm9ybVBhbmU8VD4geworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Jbmhlcml0YW5jZUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZShGb3JtUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQkvLyBEaXNjcmltaW5hdG9yIENvbHVtbiBzdWItcGFuZQorCQlDb21wb3NpdGUgZGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lciA9IGFkZFRpdGxlZEdyb3VwKAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDEwKSwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkluaGVyaXRhbmNlQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JDb2x1bW5Hcm91cEJveAorCQkpOworCisJCVByb3BlcnR5VmFsdWVNb2RlbDxEaXNjcmltaW5hdG9yQ29sdW1uPiBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyID0KKwkJCWJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpOworCisJCS8vIE5hbWUgd2lkZ2V0cworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJZGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkRpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfbmFtZSwKKwkJCWFkZERpc2NyaW1pbmF0b3JDb2x1bW5Db21ibyhjb250YWluZXIsIGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIpLAorCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0lOSEVSSVRBTkNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OCisJCSk7CisKKwkJLy8gRGlzY3JpbWluYXRvciBUeXBlIHdpZGdldHMKKwkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWRpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JUeXBlLAorCQkJYWRkRGlzY3JpbWluYXRvclR5cGVDb21ibyhjb250YWluZXIsIGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIpLAorCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0lOSEVSSVRBTkNFX0RJU0NSSU1JTkFUT1JfVFlQRQorCQkpOworCisJCWNvbnRhaW5lciA9IGFkZENvbGxhcHNhYmxlU3ViU2VjdGlvbigKKwkJCWRpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Jbmhlcml0YW5jZUNvbXBvc2l0ZV9kZXRhaWxzR3JvdXBCb3gsCisJCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpCisJCSk7CisJCQorCQluZXcgRGV0YWlsc0NvbXBvc2l0ZSh0aGlzLCBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMTYpKTsKKwkJCisJCW5ldyBQYW5lRW5hYmxlcihidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5FbmFibGVkSG9sZGVyKCksIHRoaXMpOworCX0KKworCXByaXZhdGUgQ29sdW1uQ29tYm88RGlzY3JpbWluYXRvckNvbHVtbj4gYWRkRGlzY3JpbWluYXRvckNvbHVtbkNvbWJvKAorCQlDb21wb3NpdGUgY29udGFpbmVyLAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RGlzY3JpbWluYXRvckNvbHVtbj4gZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcikgeworCisJCXJldHVybiBuZXcgQ29sdW1uQ29tYm88RGlzY3JpbWluYXRvckNvbHVtbj4oCisJCQl0aGlzLAorCQkJZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlciwKKwkJCWNvbnRhaW5lcikKKwkJeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKE5hbWVkQ29sdW1uLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChOYW1lZENvbHVtbi5ERUZBVUxUX05BTUVfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdE5hbWUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkTmFtZSh2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFRhYmxlIGdldERiVGFibGVfKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGJUYWJsZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWROYW1lKCk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZE51bGxEZWZhdWx0VmFsdWVFbnRyeSgpIHsKKwkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTm9uZVNlbGVjdGVkOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPERpc2NyaW1pbmF0b3JDb2x1bW4+IGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBEaXNjcmltaW5hdG9yQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JDb2x1bW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPERpc2NyaW1pbmF0b3JDb2x1bW4sIERpc2NyaW1pbmF0b3JUeXBlPiBhZGREaXNjcmltaW5hdG9yVHlwZUNvbWJvKAorCQlDb21wb3NpdGUgY29udGFpbmVyLAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RGlzY3JpbWluYXRvckNvbHVtbj4gZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcikgeworCisJCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxEaXNjcmltaW5hdG9yQ29sdW1uLCBEaXNjcmltaW5hdG9yVHlwZT4oCisJCQl0aGlzLAorCQkJZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlciwKKwkJCWNvbnRhaW5lcikKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChEaXNjcmltaW5hdG9yQ29sdW1uLlNQRUNJRklFRF9ESVNDUklNSU5BVE9SX1RZUEVfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZVtdIGdldENob2ljZXMoKSB7CisJCQkJcmV0dXJuIERpc2NyaW1pbmF0b3JUeXBlLnZhbHVlcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRGlzY3JpbWluYXRvclR5cGUgdmFsdWUpIHsKKwkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAorCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5jbGFzcywKKwkJCQkJRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZS5jbGFzcywKKwkJCQkJdmFsdWUKKwkJCQkpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgbnVsbERpc3BsYXlTdHJpbmcoKSB7CisJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk5vbmVTZWxlY3RlZDsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKERpc2NyaW1pbmF0b3JUeXBlIHZhbHVlKSB7CisJCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbkVuYWJsZWRIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0lTX0FMTE9XRURfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3Quc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIGNsYXNzIERldGFpbHNDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxEaXNjcmltaW5hdG9yQ29sdW1uPiB7CisJCXB1YmxpYyBEZXRhaWxzQ29tcG9zaXRlKEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIERpc2NyaW1pbmF0b3JDb2x1bW4+IHN1YmplY3RIb2xkZXIsCisgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQkJLy8gTGVuZ3RoIHdpZGdldHMKKwkJCWFkZExlbmd0aENvbWJvKGNvbnRhaW5lcik7CisKKwkJCS8vIENvbHVtbiBEZWZpbml0aW9uIHdpZGdldHMKKwkJCWFkZExhYmVsZWRUZXh0KAorCQkJCWNvbnRhaW5lciwKKwkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfY29sdW1uRGVmaW5pdGlvbiwKKwkJCQlidWlsZENvbHVtbkRlZmluaXRpb25Ib2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKQorCQkJKTsKKwkJfQorCQkKKwkJcHJpdmF0ZSB2b2lkIGFkZExlbmd0aENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJCW5ldyBJbnRlZ2VyQ29tYm88RGlzY3JpbWluYXRvckNvbHVtbj4odGhpcywgY29udGFpbmVyKSB7CisJCQkJCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbGVuZ3RoOworCQkJCX0KKwkJCQorCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgeworCQkJCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fTEVOR1RIOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgeworCQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxEaXNjcmltaW5hdG9yQ29sdW1uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEhfUFJPUEVSVFkpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdExlbmd0aCgpKTsKKwkJCQkJCX0KKwkJCQkJfTsKKwkJCQl9CisJCQkJCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgeworCQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxEaXNjcmltaW5hdG9yQ29sdW1uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIERpc2NyaW1pbmF0b3JDb2x1bW4uU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSkgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZExlbmd0aCgpOworCQkJCQkJfQorCisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7CisJCQkJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZExlbmd0aCh2YWx1ZSk7CisJCQkJCQl9CisJCQkJCX07CisJCQkJfQorCQkJfTsKKwkJfQorCQkKKwkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29sdW1uRGVmaW5pdGlvbkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RGlzY3JpbWluYXRvckNvbHVtbj4gZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcikgeworCisJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxEaXNjcmltaW5hdG9yQ29sdW1uLCBTdHJpbmc+KGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIsIE5hbWVkQ29sdW1uLkNPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb2x1bW5EZWZpbml0aW9uKCk7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgeworCQkJCQkJdmFsdWUgPSBudWxsOworCQkJCQl9CisJCQkJCXRoaXMuc3ViamVjdC5zZXRDb2x1bW5EZWZpbml0aW9uKHZhbHVlKTsKKwkJCQl9CisJCQl9OworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdkYjU2MwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIHBhbmUgZG9lcyBub3QgaGF2ZSBhbnkgd2lkZ2V0cy4KKyAqCisgKiBAc2VlIEVtYmVkZGFibGUKKyAqIEBzZWUgRW1iZWRkYWJsZVVpUHJvdmlkZXIKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEVtYmVkZGFibGVDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxFbWJlZGRhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGFibGVDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgRW1iZWRkYWJsZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGFibGVVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGFibGVVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGJjNDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbWJlZGRhYmxlVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLlR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRhYmxlVWlQcm92aWRlciBpbXBsZW1lbnRzIFR5cGVNYXBwaW5nVWlQcm92aWRlcjxFbWJlZGRhYmxlPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVtYmVkZGFibGVVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVtYmVkZGFibGVVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFR5cGVNYXBwaW5nVWlQcm92aWRlcjxFbWJlZGRhYmxlPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgRW1iZWRkYWJsZVVpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudFR5cGVQYWdlX0VtYmVkZGFibGVMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JUeXBlTWFwcGluZyhnZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGU8RW1iZWRkYWJsZT4gYnVpbGRQZXJzaXN0ZW50VHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCUpwYVVpRmFjdG9yeSBmYWN0b3J5LAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlRW1iZWRkYWJsZUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4M2NiZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUncyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgRW1iZWRkZWRJZE1hcHBpbmcKKyAqCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIEVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8RW1iZWRkZWRJZE1hcHBpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+RW1iZWRkZWRJZE1hcHBpbmc8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJbmV3IEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZSgKKwkJCXRoaXMsCisJCQljb250YWluZXIKKwkJKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Nzk4ZmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxFbWJlZGRlZElkTWFwcGluZz4KLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8RW1iZWRkZWRJZE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfRW1iZWRkZWRJZExhYmVsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlPEVtYmVkZGVkSWRNYXBwaW5nPiBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCUpwYVVpRmFjdG9yeSBmYWN0b3J5LAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwN2NjYzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVtYmVkZGVkTWFwcGluZworICoKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8RW1iZWRkZWRNYXBwaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+RW1iZWRkZWRNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGVkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCW5ldyBFbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUoCisJCQl0aGlzLAorCQkJY29udGFpbmVyCisJCSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZmIwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENvbHVtbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVtYmVkZGVkTWFwcGluZworICogQHNlZSBFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBDb2x1bW5Db21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlPEJhc2VFbWJlZGRlZE1hcHBpbmc+Cit7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlKEZvcm1QYW5lPD8gZXh0ZW5kcyBCYXNlRW1iZWRkZWRNYXBwaW5nPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0JCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzZUVtYmVkZGVkTWFwcGluZywgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkJfQorCQl9OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI+IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lckhvbGRlcigpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyMWM4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPEVtYmVkZGVkTWFwcGluZz4KLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxFbWJlZGRlZE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0VtYmVkZGVkTGFiZWw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGU8RW1iZWRkZWRNYXBwaW5nPiBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCUpwYVVpRmFjdG9yeSBmYWN0b3J5LAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbnRpdHlOYW1lQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VudGl0eU5hbWVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzNjNTFlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbnRpdHlOYW1lQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBFbnRpdHkgTmFtZTogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKKyAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgRW50aXR5CisgKiBAc2VlIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIEVudGl0eU5hbWVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVudGl0eT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudGl0eU5hbWVDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEVudGl0eU5hbWVDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgRW50aXR5PiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCUNDb21ibyBjb21ibyA9IGFkZExhYmVsZWRFZGl0YWJsZUNDb21ibygKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkVudGl0eU5hbWVDb21wb3NpdGVfbmFtZSwKKwkJCWJ1aWxkRGVmYXVsdEVudGl0eU5hbWVMaXN0SG9sZGVyKCksCisJCQlidWlsZEVudGl0eU5hbWVIb2xkZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9OQU1FCisJCSk7CisKKwkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0RW50aXR5TmFtZUxpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKKwkJCWJ1aWxkRGVmYXVsdEVudGl0eU5hbWVIb2xkZXIoKQorCQkpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0RW50aXR5TmFtZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LkRFRkFVTFRfTkFNRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBkZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRFbnRpdHlOYW1lSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIEVudGl0eS5ERUZBVUxUX05BTUVfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKworCQkJCVN0cmluZyBuYW1lID0gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE5hbWUoKTsKKworCQkJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCQkJbmFtZSA9IGRlZmF1bHRWYWx1ZSh0aGlzLnN1YmplY3QpOworCQkJCX0KKworCQkJCXJldHVybiBuYW1lOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKworCQkJCWlmIChkZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisKKwkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkTmFtZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlKEVudGl0eSBzdWJqZWN0KSB7CisJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHROYW1lKCk7CisKKwkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CisJCQlyZXR1cm4gTkxTLmJpbmQoCisJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKKwkJCQlkZWZhdWx0VmFsdWUKKwkJCSk7CisJCX0KKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFbXB0eTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbnRpdHlPdmVycmlkZXNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDA5ODNmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbnRpdHlPdmVycmlkZXNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IC0gQXR0cmlidXRlIE92ZXJyaWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCB8IFBhZ2VCb29rIChBdHRyaWJ1dGVPdmVycmlkZUNvbXBvc2l0ZS9Bc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlKXwgfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgRW50aXR5CisgKiBAc2VlIEVudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCisgKiBAc2VlIEF0dHJpYnV0ZU92ZXJyaWRlQ29tcG9zaXRlCisgKiBAc2VlIEFzc29jaWF0aW9uT3ZlcnJpZGVDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAzLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RW50aXR5T3ZlcnJpZGVzQ29tcG9zaXRlCit7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk92ZXJyaWRlc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZShGb3JtUGFuZTw/IGV4dGVuZHMgRW50aXR5PiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbnVtVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9FbnVtVHlwZUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMGI5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0VudW1UeXBlQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudW1UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW51bWVyYXRlZENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgRW51bSBUeXBlOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEJhc2ljTWFwcGluZworICogQHNlZSBCYXNpY01hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgRW51bVR5cGVDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxFbnVtZXJhdGVkQ29udmVydGVyPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bVR5cGVDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEVudW1UeXBlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRW51bWVyYXRlZENvbnZlcnRlcj4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxFbnVtZXJhdGVkQ29udmVydGVyLCBFbnVtVHlwZT4gYWRkRW51bVR5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEVudW1lcmF0ZWRDb252ZXJ0ZXIsIEVudW1UeXBlPih0aGlzLCBjb250YWluZXIpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnVtZXJhdGVkQ29udmVydGVyLlNQRUNJRklFRF9FTlVNX1RZUEVfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFbnVtVHlwZVtdIGdldENob2ljZXMoKSB7CisJCQkJcmV0dXJuIEVudW1UeXBlLnZhbHVlcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFbnVtVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0RW51bVR5cGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRW51bVR5cGUgdmFsdWUpIHsKKwkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAorCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5jbGFzcywKKwkJCQkJRW51bVR5cGVDb21wb3NpdGUudGhpcywKKwkJCQkJdmFsdWUKKwkJCQkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBFbnVtVHlwZSBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZEVudW1UeXBlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRW51bVR5cGUgdmFsdWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkRW51bVR5cGUodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQkvL0pwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfRU5VTUVSQVRFRAorCQlhZGRFbnVtVHlwZUNvbWJvKGNvbnRhaW5lcik7CisJCQorCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRCb29sZWFuSG9sZGVyKCksIHRoaXMpOworCX0KKwkKKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFbnVtZXJhdGVkQ29udmVydGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVudW1lcmF0ZWRDb252ZXJ0ZXIgdmFsdWUpIHsKKwkJCQlpZiAoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldFBhcmVudCgpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgeworCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0ZldGNoVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9GZXRjaFR5cGVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTZhZDFkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9GZXRjaFR5cGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBGZXRjaDogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKKyAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgRmV0Y2hhYmxlCisgKiBAc2VlIEJhc2ljTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0CisgKiBAc2VlIE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKKyAqIEBzZWUgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0CisgKiBAc2VlIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAorICogQHNlZSBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgRmV0Y2hUeXBlQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8RmV0Y2hhYmxlPiB7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZldGNoVHlwZUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRmV0Y2hUeXBlQ29tcG9zaXRlKEZvcm1QYW5lPD8gZXh0ZW5kcyBGZXRjaGFibGU+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisKKwlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RmV0Y2hhYmxlLCBGZXRjaFR5cGU+IGFkZEZldGNoVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RmV0Y2hhYmxlLCBGZXRjaFR5cGU+KHRoaXMsIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKEZldGNoYWJsZS5ERUZBVUxUX0ZFVENIX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChGZXRjaGFibGUuU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRmV0Y2hUeXBlW10gZ2V0Q2hvaWNlcygpIHsKKwkJCQlyZXR1cm4gRmV0Y2hUeXBlLnZhbHVlcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBGZXRjaFR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdEZldGNoKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEZldGNoVHlwZSB2YWx1ZSkgeworCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCisJCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLmNsYXNzLAorCQkJCQlGZXRjaFR5cGVDb21wb3NpdGUudGhpcywKKwkJCQkJdmFsdWUKKwkJCQkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBGZXRjaFR5cGUgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRGZXRjaCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEZldGNoVHlwZSB2YWx1ZSkgeworCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRGZXRjaCh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkJhc2ljR2VuZXJhbFNlY3Rpb25fZmV0Y2hMYWJlbCwKKwkJCWFkZEZldGNoVHlwZUNvbWJvKGNvbnRhaW5lciksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0ZFVENIX1RZUEUKKwkJKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0dlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0dlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkNDNmYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDM2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRlZFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgU3RyYXRlZ3k6ICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgR2VuZXJhdG9yIE5hbWU6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIElkTWFwcGluZworICogQHNlZSBHZW5lcmF0ZWRWYWx1ZQorICogQHNlZSBJZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAxLjAKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxJZE1hcHBpbmc+Cit7CisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGdlbmVyYXRlZFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKKwlwcml2YXRlIENDb21ibyBnZW5lcmF0b3JOYW1lQ29tYm87CisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGdlbmVyYXRvck5hbWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGdlbmVyYXRvcnNMaXN0Q2hhbmdlTGlzdGVuZXI7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZShGb3JtUGFuZTw/IGV4dGVuZHMgSWRNYXBwaW5nPiBwYXJlbnRQYW5lLAorCSAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEdlbmVyYXRlZFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKKwkJCWJ1aWxkR2VuZXJhdGVkVmFsdWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpCisJCSk7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkR2VuZXJhdGVkVmFsdWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgeworCQkJCWRpc2VuZ2FnZUxpc3RlbmVycygoR2VuZXJhdGVkVmFsdWUpIGUuZ2V0T2xkVmFsdWUoKSk7CisJCQkJZW5nYWdlTGlzdGVuZXJzKChHZW5lcmF0ZWRWYWx1ZSkgZS5nZXROZXdWYWx1ZSgpKTsKKworCQkJCWlmICghaXNQb3B1bGF0aW5nKCkpIHsKKwkJCQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKKworCQkJCQl0cnkgeworCQkJCQkJcG9wdWxhdGVHZW5lcmF0b3JOYW1lQ29tYm8oKTsKKwkJCQkJfQorCQkJCQlmaW5hbGx5IHsKKwkJCQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgYnVpbGRHZW5lcmF0b3JOYW1lTW9kaWZ5TGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCVN0cmluZyBnZW5lcmF0b3JOYW1lID0gKChDQ29tYm8pIGUuZ2V0U291cmNlKCkpLmdldFRleHQoKTsKKwkJCQlHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSA9IGdldFN1YmplY3QoKS5nZXRHZW5lcmF0ZWRWYWx1ZSgpOworCisJCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2VuZXJhdG9yTmFtZSkpIHsKKworCQkJCQlpZiAoKGdlbmVyYXRlZFZhbHVlID09IG51bGwpIHx8CisJCQkJCSAgICBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpKSkKKwkJCQkJeworCQkJCQkJcmV0dXJuOworCQkJCQl9CisKKwkJCQkJZ2VuZXJhdG9yTmFtZSA9IG51bGw7CisJCQkJfQorCisJCQkJcmV0cmlldmVHZW5lcmF0ZWRWYWx1ZSgpLnNldFNwZWNpZmllZEdlbmVyYXRvcihnZW5lcmF0b3JOYW1lKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRHZW5lcmF0b3JOYW1lUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKKwkJCWJ1aWxkR2VuZXJhdG9yTmFtZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkKKwkJKTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRHZW5lcmF0b3JOYW1lUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKKwkJCQlpZiAoIWlzUG9wdWxhdGluZygpKSB7CisJCQkJCXNldFBvcHVsYXRpbmcodHJ1ZSk7CisKKwkJCQkJdHJ5IHsKKwkJCQkJCXBvcHVsYXRlR2VuZXJhdG9yTmFtZSgpOworCQkJCQl9CisJCQkJCWZpbmFsbHkgeworCQkJCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRHZW5lcmF0b3JzTGlzdENoYW5nZUxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IFNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoCisJCQlidWlsZEdlbmVyYXRvcnNMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOworCX0KKworCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkR2VuZXJhdG9yc0xpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7CisJCXJldHVybiBuZXcgTGlzdENoYW5nZUFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCS8vIHNob3VsZCBvbmx5IGhhdmUgdG8gbGlzdGVuIHRvIHRoaXMgZXZlbnQgLSBvdGhlcnMgYXJlbid0IGNyZWF0ZWQKKwkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCWlmICghIGlzUG9wdWxhdGluZygpKSB7CisJCQkJCXNldFBvcHVsYXRpbmcodHJ1ZSk7CisKKwkJCQkJdHJ5IHsKKwkJCQkJCXBvcHVsYXRlR2VuZXJhdG9yQ2hvaWNlcygpOworCQkJCQl9CisJCQkJCWZpbmFsbHkgeworCQkJCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0ZWRWYWx1ZT4gYnVpbGRHZW5lcmF0b3JWYWx1ZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SWRNYXBwaW5nLCBHZW5lcmF0ZWRWYWx1ZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBJZE1hcHBpbmcuR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBHZW5lcmF0ZWRWYWx1ZSBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEdlbmVyYXRlZFZhbHVlKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEdlbmVyYXRlZFZhbHVlLCBHZW5lcmF0aW9uVHlwZT4gYWRkU3RyYXRlZ3lDb21ib1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEdlbmVyYXRlZFZhbHVlLCBHZW5lcmF0aW9uVHlwZT4odGhpcywgYnVpbGRHZW5lcmF0b3JWYWx1ZUhvbGRlcigpLCBwYXJlbnQpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChHZW5lcmF0ZWRWYWx1ZS5ERUZBVUxUX1NUUkFURUdZX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChHZW5lcmF0ZWRWYWx1ZS5TUEVDSUZJRURfU1RSQVRFR1lfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZVtdIGdldENob2ljZXMoKSB7CisJCQkJcmV0dXJuIEdlbmVyYXRpb25UeXBlLnZhbHVlcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0U3RyYXRlZ3koKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoR2VuZXJhdGlvblR5cGUgdmFsdWUpIHsKKwkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAorCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5jbGFzcywKKwkJCQkJR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUudGhpcywKKwkJCQkJdmFsdWUKKwkJCQkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFN0cmF0ZWd5KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoR2VuZXJhdGlvblR5cGUgdmFsdWUpIHsKKwkJCQlyZXRyaWV2ZUdlbmVyYXRlZFZhbHVlKCkuc2V0U3BlY2lmaWVkU3RyYXRlZ3kodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7CisJCXN1cGVyLmRvUG9wdWxhdGUoKTsKKwkJcG9wdWxhdGVHZW5lcmF0b3JOYW1lQ29tYm8oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnNfKElkTWFwcGluZyBzdWJqZWN0KSB7CisJCXN1cGVyLmVuZ2FnZUxpc3RlbmVyc18oc3ViamVjdCk7CisJCXN1YmplY3QuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJZE1hcHBpbmcuR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZLCB0aGlzLmdlbmVyYXRlZFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuZW5nYWdlTGlzdGVuZXJzKHN1YmplY3QuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGVuZ2FnZUxpc3RlbmVycyhHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSkgeworCQlpZiAoZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgeworCQkJdGhpcy5lbmdhZ2VMaXN0ZW5lcnNfKGdlbmVyYXRlZFZhbHVlKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBlbmdhZ2VMaXN0ZW5lcnNfKEdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlKSB7CisJCWdlbmVyYXRlZFZhbHVlLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihQZXJzaXN0ZW5jZVVuaXQuR0VORVJBVE9SU19MSVNULCB0aGlzLmdlbmVyYXRvcnNMaXN0Q2hhbmdlTGlzdGVuZXIpOworCQlnZW5lcmF0ZWRWYWx1ZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEdlbmVyYXRlZFZhbHVlLkRFRkFVTFRfR0VORVJBVE9SX1BST1BFUlRZLCB0aGlzLmdlbmVyYXRvck5hbWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJZ2VuZXJhdGVkVmFsdWUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihHZW5lcmF0ZWRWYWx1ZS5TUEVDSUZJRURfR0VORVJBVE9SX1BST1BFUlRZLCB0aGlzLmdlbmVyYXRvck5hbWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnNfKElkTWFwcGluZyBzdWJqZWN0KSB7CisJCXRoaXMuZGlzZW5nYWdlTGlzdGVuZXJzKHN1YmplY3QuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7CisJCXN1YmplY3QucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJZE1hcHBpbmcuR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZLCB0aGlzLmdlbmVyYXRlZFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXN1cGVyLmRpc2VuZ2FnZUxpc3RlbmVyc18oc3ViamVjdCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycyhHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSkgeworCQlpZiAoZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgeworCQkJdGhpcy5kaXNlbmdhZ2VMaXN0ZW5lcnNfKGdlbmVyYXRlZFZhbHVlKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnNfKEdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlKSB7CisJCWdlbmVyYXRlZFZhbHVlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoR2VuZXJhdGVkVmFsdWUuU1BFQ0lGSUVEX0dFTkVSQVRPUl9QUk9QRVJUWSwgdGhpcy5nZW5lcmF0b3JOYW1lUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCWdlbmVyYXRlZFZhbHVlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoR2VuZXJhdGVkVmFsdWUuREVGQVVMVF9HRU5FUkFUT1JfUFJPUEVSVFksIHRoaXMuZ2VuZXJhdG9yTmFtZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQlnZW5lcmF0ZWRWYWx1ZS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoUGVyc2lzdGVuY2VVbml0LkdFTkVSQVRPUlNfTElTVCwgdGhpcy5nZW5lcmF0b3JzTGlzdENoYW5nZUxpc3RlbmVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisKKwkJdGhpcy5nZW5lcmF0ZWRWYWx1ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSBidWlsZEdlbmVyYXRlZFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOworCQl0aGlzLmdlbmVyYXRvck5hbWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyICA9IGJ1aWxkR2VuZXJhdG9yTmFtZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKKwkJdGhpcy5nZW5lcmF0b3JzTGlzdENoYW5nZUxpc3RlbmVyID0gYnVpbGRHZW5lcmF0b3JzTGlzdENoYW5nZUxpc3RlbmVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJLy8gU3RyYXRlZ3kgd2lkZ2V0cworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfc3RyYXRlZ3ksCisJCQlhZGRTdHJhdGVneUNvbWJvVmlld2VyKGNvbnRhaW5lciksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0dFTkVSQVRFRF9WQUxVRV9TVFJBVEVHWQorCQkpOworCisJCS8vIEdlbmVyYXRvciBOYW1lIHdpZGdldHMKKwkJdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0b3JOYW1lLAorCQkJYnVpbGRHZW5lcmF0b3JOYW1lTW9kaWZ5TGlzdGVuZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfR0VORVJBVEVEX1ZBTFVFX1NUUkFURUdZCisJCSk7CisKKwkJdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8uYWRkKEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFbXB0eSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBvcHVsYXRlR2VuZXJhdG9yQ2hvaWNlcygpIHsKKwkJaWYgKHRoaXMuZ2VuZXJhdG9yTmFtZUNvbWJvLmlzRGlzcG9zZWQoKSkgeworCQkJcmV0dXJuOworCQl9CisJCWlmIChnZXRTdWJqZWN0KCkgPT0gbnVsbCkgeworCQkJdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1swXSk7CisJCX0KKwkJZWxzZSB7CisJCQl0aGlzLmdlbmVyYXRvck5hbWVDb21iby5zZXRJdGVtcyh0aGlzLnNvcnRlZFVuaXF1ZUdlbmVyYXRvck5hbWVzKCkpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHBvcHVsYXRlR2VuZXJhdG9yTmFtZSgpIHsKKwkJaWYgKHRoaXMuZ2VuZXJhdG9yTmFtZUNvbWJvLmlzRGlzcG9zZWQoKSkgeworCQkJcmV0dXJuOworCQl9CisJCWlmIChnZXRTdWJqZWN0KCkgPT0gbnVsbCkgeworCQkJdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8uc2V0VGV4dCgiIik7CisJCX0KKwkJZWxzZSB7CisJCQlHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSA9IGdldFN1YmplY3QoKS5nZXRHZW5lcmF0ZWRWYWx1ZSgpOworCisJCQlpZiAoZ2VuZXJhdGVkVmFsdWUgPT0gbnVsbCkgeworCQkJCXRoaXMuZ2VuZXJhdG9yTmFtZUNvbWJvLnNldFRleHQoIiIpOworCQkJfQorCQkJZWxzZSB7CisJCQkJU3RyaW5nIGdlbmVyYXRvck5hbWUgPSBnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKTsKKworCQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdlbmVyYXRvck5hbWUpKSB7CisJCQkJCXRoaXMuZ2VuZXJhdG9yTmFtZUNvbWJvLnNldFRleHQoIiIpOworCQkJCX0KKwkJCQllbHNlIGlmICghdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhnZW5lcmF0b3JOYW1lKSkgeworCQkJCQl0aGlzLmdlbmVyYXRvck5hbWVDb21iby5zZXRUZXh0KGdlbmVyYXRvck5hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUdlbmVyYXRvck5hbWVDb21ibygpIHsKKwkJcG9wdWxhdGVHZW5lcmF0b3JOYW1lKCk7CisJCXBvcHVsYXRlR2VuZXJhdG9yQ2hvaWNlcygpOworCX0KKworCXByaXZhdGUgR2VuZXJhdGVkVmFsdWUgcmV0cmlldmVHZW5lcmF0ZWRWYWx1ZSgpIHsKKwkJR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSBnZXRTdWJqZWN0KCkuZ2V0R2VuZXJhdGVkVmFsdWUoKTsKKworCQlpZiAoZ2VuZXJhdGVkVmFsdWUgPT0gbnVsbCkgeworCQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKKworCQkJdHJ5IHsKKwkJCQlnZW5lcmF0ZWRWYWx1ZSA9IGdldFN1YmplY3QoKS5hZGRHZW5lcmF0ZWRWYWx1ZSgpOworCQkJfQorCQkJZmluYWxseSB7CisJCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZ2VuZXJhdGVkVmFsdWU7CisJfQorCisJcHJpdmF0ZSBTdHJpbmdbXSBzb3J0ZWRVbmlxdWVHZW5lcmF0b3JOYW1lcygpIHsKKwkJcmV0dXJuIEFycmF5VG9vbHMuc29ydCh0aGlzLmdldFN1YmplY3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS51bmlxdWVHZW5lcmF0b3JOYW1lcygpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9HZW5lcmF0aW9uQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY3MjExOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkdlbmVyYXRvckNvbXBvc2l0ZS5HZW5lcmF0b3JCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IHYgVGFibGUgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICB4IFRhYmxlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICB8IFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IHYgU2VxdWVuY2UgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICB4IFNlcXVlbmNlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICB8IFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBHZW5lcmF0b3JDb250YWluZXIKKyAqIEBzZWUgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUKKyAqIEBzZWUgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUKKyAqIEBzZWUgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICoKKyAqIEB2ZXJzaW9uIDIuMgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgR2VuZXJhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8R2VuZXJhdG9yQ29udGFpbmVyPgoreworCisJLy9UaGVzZSBhcmUgYnVpbHQgdG8gc3RhbmQgYWxvbmUgYmVjYXVzZSB3ZSBkbyBub3Qgd2FudCB0aGUgcGFuZWxzIHRvIGNvbGxhcHNlIGp1c3QKKwkvL2JlY2F1c2UgdGhlIGdlbmVyYXRvciBpcyByZW1vdmVkIGVpdGhlciBpbiB0aGUgc291cmNlIG9yIHVzaW5nIHRoZSBjaGVjayBib3ggaW4gdGhlIFVJLiAgCisJLy9XZSBkb24ndCB3YW50IHRoZXNlIHRvIGJlIGJ1aWx0IG9uIHRoZSBtb2RlbCBnZW5lcmF0b3IgcHJvcGVydGllcy4KKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHNlcXVlbmNlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXI7CisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB0YWJsZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyOworCisJCisJcHVibGljIEdlbmVyYXRpb25Db21wb3NpdGUoCisJCVBhbmU8Pz4gcGFyZW50UGFuZSwgCisJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgR2VuZXJhdG9yQ29udGFpbmVyPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCXN1cGVyLmluaXRpYWxpemUoKTsKKwkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKTsKKwkJdGhpcy50YWJsZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyICAgID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgeworCQlzdXBlci5kb1BvcHVsYXRlKCk7CisJCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlci5zZXRWYWx1ZShCb29sZWFuLnZhbHVlT2YoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCkpOworCQl0aGlzLnRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIgICAuc2V0VmFsdWUoQm9vbGVhbi52YWx1ZU9mKGdldFN1YmplY3QoKSAhPSBudWxsICYmIGdldFN1YmplY3QoKS5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQl0aGlzLmluaXRpYWxpemVUYWJsZUdlbmVyYXRvclBhbmUoY29udGFpbmVyKTsKKwkJdGhpcy5pbml0aWFsaXplU2VxdWVuY2VHZW5lcmF0b3JQYW5lKGNvbnRhaW5lcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvclBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBzdWItc2VjdGlvbgorCQljb250YWluZXIgPSB0aGlzLmFkZENvbGxhcHNhYmxlU3ViU2VjdGlvbigKKwkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDEwKSwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkdlbmVyYXRvcnNDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3JTZWN0aW9uLAorCQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyCisJCSk7CisKKwkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIGNoZWNrIGJveAorCQlCdXR0b24gc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveCA9IGFkZENoZWNrQm94KAorCQkJdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5HZW5lcmF0b3JzQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3gsCisJCQl0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JCb29sZWFuSG9sZGVyKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUgorCQkpOworCisJCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBwYW5lCisJCXRoaXMuYWRkU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoY29udGFpbmVyLCAwLCBzZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94LmdldEJvcmRlcldpZHRoKCkgKyAxNik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsIGludCB0b3BNYXJnaW4sIGludCBsZWZ0TWFyZ2luKSB7CisJCW5ldyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKKwkJCXRoaXMsCisJCQl0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIoKSwKKwkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIHRvcE1hcmdpbiwgbGVmdE1hcmdpbiksCisJCQl0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JCdWlsZGVyKCkKKwkJKTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3JDb250YWluZXIsIFNlcXVlbmNlR2VuZXJhdG9yPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvckNvbnRhaW5lci5TRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgR2VuZXJhdG9yQnVpbGRlcjxTZXF1ZW5jZUdlbmVyYXRvcj4gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckJ1aWxkZXIoKSB7CisJCXJldHVybiBuZXcgR2VuZXJhdG9yQnVpbGRlcjxTZXF1ZW5jZUdlbmVyYXRvcj4oKSB7CisJCQlwdWJsaWMgU2VxdWVuY2VHZW5lcmF0b3IgYWRkR2VuZXJhdG9yKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9yQ29udGFpbmVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvckNvbnRhaW5lci5TRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCisJCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSkgeworCQkJCQl0aGlzLnN1YmplY3QuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIXZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSkgeworCQkJCQl0aGlzLnN1YmplY3QucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCisgCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGFibGVHZW5lcmF0b3JQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQkvLyBUYWJsZSBHZW5lcmF0b3Igc3ViLXNlY3Rpb24KKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTdWJTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuR2VuZXJhdG9yc0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvclNlY3Rpb24sCisJCQl0aGlzLnRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIKKwkJKTsKKworCQlCdXR0b24gdGFibGVHZW5lcmF0b3JDaGVja0JveCA9IGFkZENoZWNrQm94KAorCQkJdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5HZW5lcmF0b3JzQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yQ2hlY2tCb3gsCisJCQl0aGlzLmJ1aWxkVGFibGVHZW5lcmF0b3JCb29sZWFuSG9sZGVyKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUgorCQkpOworCisKKwkJLy8gVGFibGUgR2VuZXJhdG9yIHBhbmUKKwkJbmV3IFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlKAorCQkJdGhpcywKKwkJCXRoaXMuYnVpbGRUYWJsZUdlbmVyYXRvckhvbGRlcigpLAorCQkJdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgdGFibGVHZW5lcmF0b3JDaGVja0JveC5nZXRCb3JkZXJXaWR0aCgpICsgMTYpLAorCQkJdGhpcy5idWlsZFRhYmxlR2VuZXJhdG9yQnVpbGRlcigpCisJCSk7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvckNvbnRhaW5lciwgVGFibGVHZW5lcmF0b3I+KGdldFN1YmplY3RIb2xkZXIoKSwgR2VuZXJhdG9yQ29udGFpbmVyLlRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgVGFibGVHZW5lcmF0b3IgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgR2VuZXJhdG9yQnVpbGRlcjxUYWJsZUdlbmVyYXRvcj4gYnVpbGRUYWJsZUdlbmVyYXRvckJ1aWxkZXIoKSB7CisJCXJldHVybiBuZXcgR2VuZXJhdG9yQnVpbGRlcjxUYWJsZUdlbmVyYXRvcj4oKSB7CisJCQlwdWJsaWMgVGFibGVHZW5lcmF0b3IgYWRkR2VuZXJhdG9yKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGFibGVHZW5lcmF0b3JFeHBhbnN0aW9uU3RhdGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvckNvbnRhaW5lciwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBHZW5lcmF0b3JDb250YWluZXIuVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCk7CisJCQl9CQkKKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGFibGVHZW5lcmF0b3JCb29sZWFuSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3JDb250YWluZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgR2VuZXJhdG9yQ29udGFpbmVyLlRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisKKwkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpKSB7CisJCQkJCXRoaXMuc3ViamVjdC5hZGRUYWJsZUdlbmVyYXRvcigpOworCQkJCX0KKwkJCQllbHNlIGlmICghdmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpKSB7CisJCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0dlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NzFmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0dlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGdlbmVyaWMgcGFuZSBmb3IgYSBnZW5lcmF0b3IuCisgKgorICogQHNlZSBJZE1hcHBpbmcKKyAqIEBzZWUgR2VuZXJhdG9yCisgKiBAc2VlIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlIC0gQSBzdWItcGFuZQorICogQHNlZSBUYWxiZUdlbmVyYXRvckNvbXBvc2l0ZSAtIEEgc3ViLXBhbmUKKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyYXRvckNvbXBvc2l0ZTxUIGV4dGVuZHMgR2VuZXJhdG9yPiBleHRlbmRzIFBhbmU8VD4KK3sKKworCXByb3RlY3RlZCBHZW5lcmF0b3JCdWlsZGVyPFQ+IGdlbmVyYXRvckJ1aWxkZXI7CisKKwlwcm90ZWN0ZWQgR2VuZXJhdG9yQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKKyAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCisgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisgICAgICAgIEdlbmVyYXRvckJ1aWxkZXI8VD4gZ2VuZXJhdG9yQnVpbGRlcikgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOworCQl0aGlzLmdlbmVyYXRvckJ1aWxkZXIgPSBnZW5lcmF0b3JCdWlsZGVyOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgR2VuZXJhdG9yLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdGhlIHVzZXIKKwkgKiB0byBzZXQgdmFsdWVzIG9uIGEgR2VuZXJhdG9yIGJlZm9yZSB0aGUgbW9kZWwgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQuCisJICogQWxsb3dzIHRoZW0gbm90IHRvIGZpcnN0IGhhdmUgdG8gY2hlY2sgdGhlIGNoZWNrIGJveCB0byBlbmFibGUgdGhlIHBhbmVsLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBUIGJ1aWxkR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3JCdWlsZGVyLmFkZEdlbmVyYXRvcigpOworCX0KKworCS8qKgorCSAqIFJldHJpZXZlcyB0aGUgPGNvZGU+R2VuZXJhdG9yPC9jb2RlPiBhbmQgaWYgaXQgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4KKwkgKiBjcmVhdGUgaXQuCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdCBUaGUgc3ViamVjdCB1c2VkIHRvIHJldHJpZXZlIHRoZSBnZW5lcmF0b3IKKwkgKiBAcmV0dXJuIFRoZSA8Y29kZT5HZW5lcmF0b3I8L2NvZGU+IHdoaWNoIHNob3VsZCBuZXZlciBiZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBUIHJldHJpZXZlR2VuZXJhdG9yKCkgeworCQlUIGdlbmVyYXRvciA9IGdldFN1YmplY3QoKTsKKworCQlpZiAoZ2VuZXJhdG9yID09IG51bGwpIHsKKwkJCWdlbmVyYXRvciA9IHRoaXMuYnVpbGRHZW5lcmF0b3IoKTsKKwkJfQorCisJCXJldHVybiBnZW5lcmF0b3I7CisJfQorCisJcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRHZW5lcmF0b3JOYW1lSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3IsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBHZW5lcmF0b3IuTkFNRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQkJCWlmICh0aGlzLnN1YmplY3QgIT0gbnVsbCkgeworCQkJCQlzZXRWYWx1ZV8odmFsdWUpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJcmV0cmlldmVHZW5lcmF0b3IoKS5zZXROYW1lKHZhbHVlKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKwkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkQWxsb2NhdGlvblNpemVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBJbnRlZ2VyQ29tYm88R2VuZXJhdG9yPih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcikgeworCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgeworCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5HZW5lcmF0b3JDb21wb3NpdGVfYWxsb2NhdGlvblNpemU7CisJCQl9CisJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKKwkJCQlyZXR1cm4gbnVsbDsvL0pwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX0xFTkdUSDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3IsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgR2VuZXJhdG9yLkRFRkFVTFRfQUxMT0NBVElPTl9TSVpFX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvciwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBHZW5lcmF0b3IuU1BFQ0lGSUVEX0FMTE9DQVRJT05fU0laRV9QUk9QRVJUWSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0VmFsdWUoSW50ZWdlciB2YWx1ZSkgeworCQkJCQkJcmV0cmlldmVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSh2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQl9OwkKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkSW5pdGlhbFZhbHVlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgSW50ZWdlckNvbWJvPEdlbmVyYXRvcj4odGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpIHsKKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuR2VuZXJhdG9yQ29tcG9zaXRlX2luaXRpYWxWYWx1ZTsKKwkJCX0KKwkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgeworCQkJCXJldHVybiBudWxsOy8vSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fTEVOR1RIOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvciwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldERlZmF1bHRJbml0aWFsVmFsdWUoKSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3IsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgR2VuZXJhdG9yLlNQRUNJRklFRF9JTklUSUFMX1ZBTFVFX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgc2V0VmFsdWUoSW50ZWdlciB2YWx1ZSkgeworCQkJCQkJcmV0cmlldmVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUodmFsdWUpOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKwkJfTsJCisJfQorCisJLyoqCisJICogUmV0cmlldmVzIHRoZSBKUEEgcHJvamVjdC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIEpQQSBwcm9qZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzdWJqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHJvdGVjdGVkIGZpbmFsIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpID09IG51bGwgPyBudWxsIDogdGhpcy5nZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgdXNlZCB0byBsaXN0ZW4gdG8gdGhlIElEIG1hcHBpbmcgd2hlbiB0aGUKKwkgKiBnZW5lcmF0b3IgY2hhbmdlcy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHByb3BlcnR5IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnZW5lcmF0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpOworCisKKwlwdWJsaWMgaW50ZXJmYWNlIEdlbmVyYXRvckJ1aWxkZXI8VD4geworCQkvKioKKwkJICogQWRkIGEgZ2VuZXJhdG9yIHRvIHRoZSBtb2RlbCBhbmQgcmV0dXJuIGl0CisJCSAqLworCQlUIGFkZEdlbmVyYXRvcigpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lkQ2xhc3NDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSWRDbGFzc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzdmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lkQ2xhc3NDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkQ2xhc3NIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgQ2xhc3NDaG9vc2VyUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIElkQ2xhc3MKKyAqIEBzZWUgQ2xhc3NDaG9vc2VyUGFuZQorICogQHNlZSBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZSAtIEEgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlIC0gQSBwYXJlbnQgY29udGFpbmVyCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBJZENsYXNzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxJZENsYXNzSG9sZGVyPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SWRDbGFzc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIElkQ2xhc3NDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgSWRDbGFzc0hvbGRlcj4gcGFyZW50UGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKwkKKwlwdWJsaWMgSWRDbGFzc0NvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBJZENsYXNzSG9sZGVyPiBwYXJlbnRQYW5lLAorICAgICAgICAJCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCisgICAgICAgIAkJCQkJYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKKwl9CisKKwlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8SWRDbGFzc0hvbGRlcj4gYWRkQ2xhc3NDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8SWRDbGFzc0hvbGRlcj4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPElkQ2xhc3NIb2xkZXIsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBJZENsYXNzSG9sZGVyLklEX0NMQVNTX1BST1BFUlRZKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRJZENsYXNzKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCisJCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgeworCQkJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQkJCX0KKworCQkJCQkJdGhpcy5zdWJqZWN0LnNldElkQ2xhc3ModmFsdWUpOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldElkQ2xhc3MoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSWRDbGFzc0NvbXBvc2l0ZV9sYWJlbDsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisJCQkJZ2V0U3ViamVjdCgpLnNldElkQ2xhc3MoY2xhc3NOYW1lKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SWRDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJYWRkQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2NGI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgR2VuZXJhdGlvbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgSWRNYXBwaW5nCisgKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQorICogQHNlZSBUZW1wb3JhbFR5cGVDb21wb3NpdGUKKyAqIEBzZWUgSWRNYXBwaW5nR2VuZXJhdGlvbkNvbXBvc2l0ZQorICoKKyAqIEB2ZXJzaW9uIDIuMgorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgSWRNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGU8SWRNYXBwaW5nPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SWRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUlkTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBJZE1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJCisJCS8vIENvbHVtbiB3aWRnZXRzCisJCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKKworCQlpbml0aWFsaXplVHlwZVBhbmUoY29udGFpbmVyKTsKKworCQkvLyBHZW5lcmF0aW9uIHBhbmUKKwkJbmV3IElkTWFwcGluZ0dlbmVyYXRpb25Db21wb3NpdGUodGhpcywgYWRkU3ViUGFuZShjb250YWluZXIsIDEwKSk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lkTWFwcGluZ0dlbmVyYXRpb25Db21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdiMzljCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwzNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdGVkVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3JDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5HZW5lcmF0b3JDb21wb3NpdGUuR2VuZXJhdG9yQnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBwYW5lbCBpcyBwYXJ0aWFsbHkgYSBjb3B5IG9mIHRoZSBHZW5lcmF0aW9uQ29tcG9zaXRlIHBhbmVsLiBUaGUgZGlmZmVyZW5jZQorICogaXMgdGhhdCB0aGlzIHBhbmVsIGluY2x1ZGVzIHRoZSBHZW5lcmF0ZWQgVmFsdWUgY29tcG9zaXRlLiAgV2hlbiBhIHRhYmxlCisgKiBvciBzZXF1ZW5jZSBnZW5lcmF0b3IgaXMgYWRkZWQsIHdlIHNldCB0aGUgIm5hbWUiIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSAKKyAqIGdlbmVyYXRlZCB2YWx1ZSAiZ2VuZXJhdG9yIiBpZiBpdCBhbHJlYWR5IGV4aXN0cworICogCisgKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IHYgUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICB4IFByaW1hcnkgS2V5IEdlbmVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgIHwgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgdiBUYWJsZSBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgIHggVGFibGUgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgIHwgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgdiBTZXF1ZW5jZSBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgIHggU2VxdWVuY2UgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgIHwgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBJZE1hcHBpbmcKKyAqIEBzZWUgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUKKyAqIEBzZWUgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUKKyAqIEBzZWUgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUKKyAqIEBzZWUgSWRNYXBwaW5nQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIElkTWFwcGluZ0dlbmVyYXRpb25Db21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxJZE1hcHBpbmc+Cit7CisKKwkvL1RoZXNlIGFyZSBidWlsdCB0byBzdGFuZCBhbG9uZSBiZWNhdXNlIHdlIGRvIG5vdCB3YW50IHRoZSBwYW5lbHMgdG8gY29sbGFwc2UganVzdAorCS8vYmVjYXVzZSB0aGUgZ2VuZXJhdG9yIGlzIHJlbW92ZWQgZWl0aGVyIGluIHRoZSBzb3VyY2Ugb3IgdXNpbmcgdGhlIGNoZWNrIGJveCBpbiB0aGUgVUkuICAKKwkvL1dlIGRvbid0IHdhbnQgdGhlc2UgdG8gYmUgYnVpbHQgb24gdGhlIG1vZGVsIGdlbmVyYXRvciBwcm9wZXJ0aWVzLgorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gc2VxdWVuY2VHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlcjsKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXI7CisKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+R2VuZXJhdGlvbkNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgSWRNYXBwaW5nR2VuZXJhdGlvbkNvbXBvc2l0ZShGb3JtUGFuZTw/IGV4dGVuZHMgSWRNYXBwaW5nPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCisJeworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZSgpOworCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpOworCQl0aGlzLnRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIgICAgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7CisJCXN1cGVyLmRvUG9wdWxhdGUoKTsKKwkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyLnNldFZhbHVlKEJvb2xlYW4udmFsdWVPZihnZXRTdWJqZWN0KCkgIT0gbnVsbCAmJiBnZXRTdWJqZWN0KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSk7CisJCXRoaXMudGFibGVHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlciAgIC5zZXRWYWx1ZShCb29sZWFuLnZhbHVlT2YoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCS8vIFByaW1hcnkgS2V5IEdlbmVyYXRpb24gc2VjdGlvbgorCQljb250YWluZXIgPSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfcHJpbWFyeUtleUdlbmVyYXRpb25TZWN0aW9uLAorCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpCisJCSk7CisKKwkJLy8gUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBjaGVjayBib3gKKwkJQnV0dG9uIHByaW1hcnlLZXlHZW5lcmF0aW9uQ2hlY2tCb3ggPSBhZGRDaGVja0JveCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94LAorCQkJYnVpbGRQcmltYXJ5S2V5R2VuZXJhdGlvbkhvbGRlcigpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19QUklNQVJZX0tFWV9HRU5FUkFUSU9OCisJCSk7CisKKwkJLy8gR2VuZXJhdGVkIFZhbHVlIHdpZGdldHMKKwkJR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUgZ2VuZXJhdGVkVmFsdWVDb21wb3NpdGUgPSBuZXcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUoCisJCQl0aGlzLAorCQkJY29udGFpbmVyCisJCSk7CisKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7CisJCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ICAgICAgICAgID0gcHJpbWFyeUtleUdlbmVyYXRpb25DaGVja0JveC5nZXRCb3JkZXJXaWR0aCgpICsgMTY7CisKKwkJZ2VuZXJhdGVkVmFsdWVDb21wb3NpdGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCisJCVByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGdlbmVyYXRvckhvbGRlciA9IGJ1aWxkR2VuZXJhdG9yQ29udGFpbmVyKCk7CisJCS8vIFRhYmxlIEdlbmVyYXRvciBwYW5lCisJCWluaXRpYWxpemVUYWJsZUdlbmVyYXRvclBhbmUoYWRkU3ViUGFuZShjb250YWluZXIsIDEwKSwgZ2VuZXJhdG9ySG9sZGVyKTsKKworCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3IgcGFuZQorCQlpbml0aWFsaXplU2VxdWVuY2VHZW5lcmF0b3JQYW5lKGFkZFN1YlBhbmUoY29udGFpbmVyLCAxMCksIGdlbmVyYXRvckhvbGRlcik7CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFByaW1hcnlLZXlHZW5lcmF0aW9uSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxJZE1hcHBpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgSWRNYXBwaW5nLkdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRHZW5lcmF0ZWRWYWx1ZSgpICE9IG51bGwpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisKKwkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRHZW5lcmF0ZWRWYWx1ZSgpID09IG51bGwpKSB7CisJCQkJCXRoaXMuc3ViamVjdC5hZGRHZW5lcmF0ZWRWYWx1ZSgpOworCQkJCX0KKwkJCQllbHNlIGlmICghdmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRHZW5lcmF0ZWRWYWx1ZSgpICE9IG51bGwpKSB7CisJCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVHZW5lcmF0ZWRWYWx1ZSgpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdG9yQ29udGFpbmVyPiBidWlsZEdlbmVyYXRvckNvbnRhaW5lcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SWRNYXBwaW5nLCBHZW5lcmF0b3JDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgR2VuZXJhdG9yQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvclBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9ySG9sZGVyKSB7CisKKwkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIHN1Yi1zZWN0aW9uCisJCWNvbnRhaW5lciA9IGFkZENvbGxhcHNhYmxlU3ViU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvclNlY3Rpb24sCisJCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIKKwkJKTsKKworCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3IgY2hlY2sgYm94CisJCUJ1dHRvbiBzZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94ID0gYWRkQ2hlY2tCb3goCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveCwKKwkJCWJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JCb29sZWFuSG9sZGVyKGdlbmVyYXRvckhvbGRlciksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUgorCQkpOworCisJCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBwYW5lCisJCXRoaXMuYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwgCisJCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyKGdlbmVyYXRvckhvbGRlciksCisJCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9yQnVpbGRlcihnZW5lcmF0b3JIb2xkZXIpLAorCQkJMCwgCisJCQlzZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94LmdldEJvcmRlcldpZHRoKCkgKyAxNik7CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdG9yQ29udGFpbmVyPiBnZW5lcmF0b3JIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9yQ29udGFpbmVyLCBCb29sZWFuPihnZW5lcmF0b3JIb2xkZXIsIEdlbmVyYXRvckNvbnRhaW5lci5TRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCisJCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSkgeworCisJCQkJCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gdGhpcy5zdWJqZWN0LmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCQkJCUdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlID0gZ2V0U3ViamVjdCgpLmdldEdlbmVyYXRlZFZhbHVlKCk7CisKKwkJCQkJaWYgKChnZW5lcmF0ZWRWYWx1ZSAhPSBudWxsKSAmJgorCQkJCQkgICAgKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpICE9IG51bGwpKQorCQkJCQl7CisJCQkJCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXROYW1lKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmICghdmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpKSB7CisJCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCisJCQlDb21wb3NpdGUgY29udGFpbmVyLCAKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxTZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIsCisJCQlHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPiBnZW5lcmF0b3JCdWlsZGVyLAorCQkJaW50IHRvcE1hcmdpbiwKKwkJCWludCBsZWZ0TWFyZ2luKSB7CisKKwkJcmV0dXJuIG5ldyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKKwkJCXRoaXMsCisJCQlzZXF1ZW5jZUdlbmVyYXRvckhvbGRlciwKKwkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIHRvcE1hcmdpbiwgbGVmdE1hcmdpbiksCisJCQlnZW5lcmF0b3JCdWlsZGVyCisJCSk7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9ySG9sZGVyKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvckNvbnRhaW5lciwgU2VxdWVuY2VHZW5lcmF0b3I+KGdlbmVyYXRvckhvbGRlciwgR2VuZXJhdG9yQ29udGFpbmVyLlNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpOworCQkJfQorCQl9OworCX0KKwlwcml2YXRlIEdlbmVyYXRvckJ1aWxkZXI8U2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JCdWlsZGVyKGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGdlbmVyYXRvckhvbGRlcikgeworCQlyZXR1cm4gbmV3IEdlbmVyYXRvckJ1aWxkZXI8U2VxdWVuY2VHZW5lcmF0b3I+KCkgeworCQkJcHVibGljIFNlcXVlbmNlR2VuZXJhdG9yIGFkZEdlbmVyYXRvcigpIHsKKwkJCQlyZXR1cm4gZ2VuZXJhdG9ySG9sZGVyLmdldFZhbHVlKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUYWJsZUdlbmVyYXRvclBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9ySG9sZGVyKSB7CisKKwkJLy8gVGFibGUgR2VuZXJhdG9yIHN1Yi1zZWN0aW9uCisJCWNvbnRhaW5lciA9IGFkZENvbGxhcHNhYmxlU3ViU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvclNlY3Rpb24sCisJCQl0aGlzLnRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIKKwkJKTsKKworCQlCdXR0b24gdGFibGVHZW5lcmF0b3JDaGVja0JveCA9IGFkZENoZWNrQm94KAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yQ2hlY2tCb3gsCisJCQlidWlsZFRhYmxlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcihnZW5lcmF0b3JIb2xkZXIpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1IKKwkJKTsKKworCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3IgcGFuZQorCQl0aGlzLmJ1aWxkVGFibGVHZW5lcmF0b3JDb21wb3NpdGUoCisJCQljb250YWluZXIsIAorCQkJYnVpbGRUYWJsZUdlbmVyYXRvckhvbGRlcihnZW5lcmF0b3JIb2xkZXIpLAorCQkJYnVpbGRUYWJsZUdlbmVyYXRvckJ1aWxkZXIoZ2VuZXJhdG9ySG9sZGVyKSwKKwkJCTAsIAorCQkJdGFibGVHZW5lcmF0b3JDaGVja0JveC5nZXRCb3JkZXJXaWR0aCgpICsgMTYpOworCX0JCisJCisJcHJvdGVjdGVkIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlIGJ1aWxkVGFibGVHZW5lcmF0b3JDb21wb3NpdGUoCisJCQlDb21wb3NpdGUgY29udGFpbmVyLCAKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxUYWJsZUdlbmVyYXRvcj4gdGFibGVHZW5lcmF0b3JIb2xkZXIsCisJCQlHZW5lcmF0b3JCdWlsZGVyPFRhYmxlR2VuZXJhdG9yPiBnZW5lcmF0b3JCdWlsZGVyLAorCQkJaW50IHRvcE1hcmdpbiwKKwkJCWludCBsZWZ0TWFyZ2luKSB7CisKKwkJcmV0dXJuIG5ldyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSgKKwkJCXRoaXMsCisJCQl0YWJsZUdlbmVyYXRvckhvbGRlciwKKwkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIHRvcE1hcmdpbiwgbGVmdE1hcmdpbiksCisJCQlnZW5lcmF0b3JCdWlsZGVyCisJCSk7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9ySG9sZGVyKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvckNvbnRhaW5lciwgVGFibGVHZW5lcmF0b3I+KGdlbmVyYXRvckhvbGRlciwgR2VuZXJhdG9yQ29udGFpbmVyLlRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgVGFibGVHZW5lcmF0b3IgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgR2VuZXJhdG9yQnVpbGRlcjxUYWJsZUdlbmVyYXRvcj4gYnVpbGRUYWJsZUdlbmVyYXRvckJ1aWxkZXIoZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9ySG9sZGVyKSB7CisJCXJldHVybiBuZXcgR2VuZXJhdG9yQnVpbGRlcjxUYWJsZUdlbmVyYXRvcj4oKSB7CisJCQlwdWJsaWMgVGFibGVHZW5lcmF0b3IgYWRkR2VuZXJhdG9yKCkgeworCQkJCXJldHVybiBnZW5lcmF0b3JIb2xkZXIuZ2V0VmFsdWUoKS5hZGRUYWJsZUdlbmVyYXRvcigpOworCQkJfQorCQl9OworCX0KKworIAlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGFibGVHZW5lcmF0b3JCb29sZWFuSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGdlbmVyYXRvckhvbGRlcikgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3JDb250YWluZXIsIEJvb2xlYW4+KGdlbmVyYXRvckhvbGRlciwgR2VuZXJhdG9yQ29udGFpbmVyLlRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisKKwkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpKSB7CisKKwkJCQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSB0aGlzLnN1YmplY3QuYWRkVGFibGVHZW5lcmF0b3IoKTsKKwkJCQkJR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSBnZXRTdWJqZWN0KCkuZ2V0R2VuZXJhdGVkVmFsdWUoKTsKKworCQkJCQlpZiAoKGdlbmVyYXRlZFZhbHVlICE9IG51bGwpICYmCisJCQkJCSAgICAoZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCkgIT0gbnVsbCkpCisJCQkJCXsKKwkJCQkJCXRhYmxlR2VuZXJhdG9yLnNldE5hbWUoZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCkpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKCF2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCkpIHsKKwkJCQkJdGhpcy5zdWJqZWN0LnJlbW92ZVRhYmxlR2VuZXJhdG9yKCk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSWRNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MGU4YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBJZE1hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxJZE1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSWRNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBJZE1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPElkTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIElkTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfSWRMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZTxJZE1hcHBpbmc+IGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUlkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUzYmMzMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZy5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKKworLyoqCisgKgorICogQHNlZSBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QKKyAqIEBzZWUgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5EaWFsb2c8SW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0PiB7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKKwkgKiBAcGFyYW0gam9pblRhYmxlIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzCisJICogbG9jYXRlZAorCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQorCSAqLworCXB1YmxpYyBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nKFNoZWxsIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luVGFibGUgam9pblRhYmxlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCisJCXN1cGVyKHBhcmVudCwgam9pblRhYmxlLCBqb2luQ29sdW1uKTsKKwl9CisKKwkvKgorCSAqIG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBEaWFsb2dQYW5lPEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5EaWFsb2dQYW5lPEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdD4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQljb250YWluZXIKKwkJKQorCQkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhYmxlRWRpdGFibGUoKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9OworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QgYnVpbGRTdGF0ZU9iamVjdCgpIHsKKwkJcmV0dXJuIG5ldyBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QoCisJCQlnZXRPd25lcigpLAorCQkJZ2V0Sm9pbkNvbHVtbigpCisJCSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKKwkJcmV0dXJuIChKb2luQ29sdW1uKSBzdXBlci5nZXRKb2luQ29sdW1uKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpvaW5UYWJsZSBnZXRPd25lcigpIHsKKwkJcmV0dXJuIChKb2luVGFibGUpIHN1cGVyLmdldE93bmVyKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0ludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzIwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0ludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7CisKKy8qKgorICogVGhlIHN0YXRlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSBvciBlZGl0IGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gb24gYSBqb2luCisgKiB0YWJsZS4KKyAqCisgKiBAc2VlIEpvaW5Db2x1bW4KKyAqIEBzZWUgSm9pblRhYmxlCisgKiBAc2VlIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCAKKwlleHRlbmRzIEpvaW5Db2x1bW5TdGF0ZU9iamVjdAoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Q8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIGpvaW5UYWJsZQorCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQorCSAqLworCXB1YmxpYyBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QoCisJCQlKb2luVGFibGUgam9pblRhYmxlLAorCSAgICAgICAgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCXN1cGVyKGpvaW5UYWJsZSwgam9pbkNvbHVtbik7CisJfQorCQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKb2luVGFibGUgZ2V0T3duZXIoKSB7CisJCXJldHVybiAoSm9pblRhYmxlKSBzdXBlci5nZXRPd25lcigpOworCX0KKwkKKwlwcml2YXRlIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKKwkJcmV0dXJuIGdldE93bmVyKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBUYWJsZSBnZXROYW1lVGFibGUoKSB7CisJCXJldHVybiBnZXRPd25lcigpLmdldERiVGFibGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7CisJCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKwkJaWYgKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJRW50aXR5IHRhcmdldEVudGl0eSA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKKwkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gdGFyZ2V0RW50aXR5LmdldFByaW1hcnlEYlRhYmxlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEluaXRpYWxUYWJsZSgpIHsKKwkJcmV0dXJuIGdldE93bmVyKCkuZ2V0TmFtZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhYmxlRWRpdGFibGUoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhYmxlcygpIHsKKwkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFN0cmluZz4oZ2V0SW5pdGlhbFRhYmxlKCkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5EaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkRpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MGI4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5EaWFsb2cuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRGlhbG9nUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CisKKy8qKgorICogVGhlIGFic3RyYWN0IGRlZmluaXRpb24gb2YgdGhlIGRpYWxvZyB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+SUpvaW5Db2x1bW48L2NvZGU+LgorICoKKyAqIEBzZWUgSm9pbkNvbHVtbgorICogQHNlZSBKb2luQ29sdW1uU3RhdGVPYmplY3QKKyAqIEBzZWUgSm9pbkNvbHVtbkRpYWxvZ1BhbmUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEpvaW5Db2x1bW5EaWFsb2c8VCBleHRlbmRzIEpvaW5Db2x1bW5TdGF0ZU9iamVjdD4gZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbkRpYWxvZzxUPiB7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0Sm9pbkNvbHVtbkRpYWxvZzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKKwkgKiBAcGFyYW0gb3duZXIgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMgbG9jYXRlZAorCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQorCSAqLworCXB1YmxpYyBKb2luQ29sdW1uRGlhbG9nKFNoZWxsIHBhcmVudCwgT2JqZWN0IG93bmVyLCBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJc3VwZXIocGFyZW50LCBvd25lciwgam9pbkNvbHVtbik7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERpYWxvZ1BhbmU8Pz4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5EaWFsb2dQYW5lPFQ+KGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSm9pbkNvbHVtbiBnZXRKb2luQ29sdW1uKCkgeworCQlyZXR1cm4gKEpvaW5Db2x1bW4pIHN1cGVyLmdldEpvaW5Db2x1bW4oKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uRGlhbG9nUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uRGlhbG9nUGFuZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNmFkMzIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5EaWFsb2dQYW5lLmphdmEKQEAgLTAsMCArMSwyODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgeCBJbnNlcnRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCB4IE51bGxhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IHggVW5pcXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgeCBVcGRhdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEpvaW5Db2x1bW5TdGF0ZU9iamVjdAorICogQHNlZSBKb2luQ29sdW1uRGlhbG9nIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIEpvaW5Db2x1bW5EaWFsb2dQYW5lPFQgZXh0ZW5kcyBKb2luQ29sdW1uU3RhdGVPYmplY3Q+IGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lPFQ+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uRGlhbG9nUGFuZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEpvaW5Db2x1bW5EaWFsb2dQYW5lKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkKKwl7CisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEluc2VydGFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgSm9pbkNvbHVtblN0YXRlT2JqZWN0LklOU0VSVEFCTEVfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRJbnNlcnRhYmxlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0SW5zZXJ0YWJsZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEluc2VydGFibGVTdHJpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRJbnNlcnRhYmxlSG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7CisJCQkJCXJldHVybiBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV9pbnNlcnRhYmxlV2l0aERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV9pbnNlcnRhYmxlOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdEluc2VydGFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJSm9pbkNvbHVtblN0YXRlT2JqZWN0LklOU0VSVEFCTEVfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRJbnNlcnRhYmxlKCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTnVsbGFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJSm9pbkNvbHVtblN0YXRlT2JqZWN0Lk5VTExBQkxFX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TnVsbGFibGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXROdWxsYWJsZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE51bGxhYmxlU3RyaW5nSG9sZGVyKCkgeworCisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHROdWxsYWJsZUhvbGRlcigpKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7CisJCQkJCXJldHVybiBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV9udWxsYWJsZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOworCQkJCX0KKwkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfbnVsbGFibGU7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0TnVsbGFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJSm9pbkNvbHVtblN0YXRlT2JqZWN0Lk5VTExBQkxFX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0TnVsbGFibGUoKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHROdWxsYWJsZSgpKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVW5pcXVlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCUpvaW5Db2x1bW5TdGF0ZU9iamVjdC5VTklRVUVfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRVbmlxdWUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRVbmlxdWUodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVbmlxdWVTdHJpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRVbmlxdWVIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKKwkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX3VuaXF1ZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOworCQkJCX0KKwkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdW5pcXVlOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFVuaXF1ZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlKb2luQ29sdW1uU3RhdGVPYmplY3QuVU5JUVVFX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0VW5pcXVlKCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0VW5pcXVlKCkpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVcGRhdGFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgSm9pbkNvbHVtblN0YXRlT2JqZWN0LlVQREFUQUJMRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFVwZGF0YWJsZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldFVwZGF0YWJsZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFVwZGF0YWJsZVN0cmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFVwZGF0YWJsZUhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdXBkYXRhYmxlV2l0aERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV91cGRhdGFibGU7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0VXBkYXRhYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCUpvaW5Db2x1bW5TdGF0ZU9iamVjdC5VUERBVEFCTEVfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRVcGRhdGFibGUoKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRVcGRhdGFibGUoKSk7CisJCQl9CisJCX07CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJc3VwZXIuaW5pdGlhbGl6ZUxheW91dChjb250YWluZXIpOworCisJCS8vIEluc2VydGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAorCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCisJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgNCksCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV9pbnNlcnRhYmxlLAorCQkJYnVpbGRJbnNlcnRhYmxlSG9sZGVyKCksCisJCQlidWlsZEluc2VydGFibGVTdHJpbmdIb2xkZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX0lOU0VSVEFCTEUKKwkJKTsKKworCQkvLyBVcGRhdGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAorCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV91cGRhdGFibGUsCisJCQlidWlsZFVwZGF0YWJsZUhvbGRlcigpLAorCQkJYnVpbGRVcGRhdGFibGVTdHJpbmdIb2xkZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX1VQREFUQUJMRQorCQkpOworCisJCS8vIFVuaXF1ZSB0cmktc3RhdGUgY2hlY2sgYm94CisJCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV91bmlxdWUsCisJCQlidWlsZFVuaXF1ZUhvbGRlcigpLAorCQkJYnVpbGRVbmlxdWVTdHJpbmdIb2xkZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX1VOSVFVRQorCQkpOworCisJCS8vIE51bGxhYmxlIHRyaS1zdGF0ZSBjaGVjayBib3gKKwkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX251bGxhYmxlLAorCQkJYnVpbGROdWxsYWJsZUhvbGRlcigpLAorCQkJYnVpbGROdWxsYWJsZVN0cmluZ0hvbGRlcigpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fTlVMTEFCTEUKKwkJKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhYmxlRWRpdGFibGUoKSB7CisJCXJldHVybiB0cnVlOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjU2ZWFkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRGlhbG9nUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CisKKy8qKgorICogVGhpcyBkaWFsb2cgaXMgdXNlZCB0byBlaXRoZXIgY3JlYXRlIG9yIGVkaXQgYSBqb2luZyBjb2x1bW4gdGhhdCBpcyBsb2NhdGVkCisgKiBvbiBhIGpvaW4gdGFibGUuCisgKgorICogQHNlZSBKb2luQ29sdW1uCisgKiBAc2VlIEpvaW5UYWJsZQorICogQHNlZSBKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdAorICogQHNlZSBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBleHRlbmRzIEJhc2VKb2luQ29sdW1uRGlhbG9nPEpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0PiB7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKKwkgKiBAcGFyYW0gam9pblRhYmxlIFRoZSBwYXJlbnQgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgdG8gY3JlYXRlCisJICogQHBhcmFtIGpvaW5Db2x1bW4gRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisJICogdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCisJICovCisJcHVibGljIEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luVGFibGUgam9pblRhYmxlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisKKwkJc3VwZXIocGFyZW50LCBqb2luVGFibGUsIGpvaW5Db2x1bW4pOworCX0KKworCS8qCisJICogbm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERpYWxvZ1BhbmU8Sm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Q+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJcmV0dXJuIG5ldyBKb2luQ29sdW1uRGlhbG9nUGFuZTxKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdD4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQljb250YWluZXIKKwkJKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVFZGl0YWJsZSgpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX07CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0IGJ1aWxkU3RhdGVPYmplY3QoKSB7CisJCXJldHVybiBuZXcgSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QoCisJCQlnZXRPd25lcigpLAorCQkJZ2V0Sm9pbkNvbHVtbigpCisJCSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKKwkJcmV0dXJuIChKb2luQ29sdW1uKSBzdXBlci5nZXRKb2luQ29sdW1uKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpvaW5UYWJsZSBnZXRPd25lcigpIHsKKwkJcmV0dXJuIChKb2luVGFibGUpIHN1cGVyLmdldE93bmVyKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjc5ODZjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdC5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKKworLyoqCisgKiBUaGUgc3RhdGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIG9yIGVkaXQgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBvbiBhCisgKiBqb2ludCB0YWJsZS4KKyAqCisgKiBAc2VlIEpvaW5Db2x1bW4KKyAqIEBzZWUgSm9pblRhYmxlCisgKiBAc2VlIEludmVyc2VKb2luQ29sdW1uRGlhbG9nCisgKiBAc2VlIEludmVyc2VKb2luQ29sdW1uRGlhbG9nUGFuZQorICogQHNlZSBKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0IAorCWV4dGVuZHMgSm9pbkNvbHVtblN0YXRlT2JqZWN0Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdDwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gam9pblRhYmxlIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHRvIGVkaXQKKwkgKiBAcGFyYW0gam9pbkNvbHVtbiBUaGUgam9pbiBjb2x1bW4gdG8gZWRpdAorCSAqLworCXB1YmxpYyBKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCgKKwkJCUpvaW5UYWJsZSBqb2luVGFibGUsCisJICAgICAgICBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJc3VwZXIoam9pblRhYmxlLCBqb2luQ29sdW1uKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHVibGljIEpvaW5UYWJsZSBnZXRPd25lcigpIHsKKwkJcmV0dXJuIChKb2luVGFibGUpIHN1cGVyLmdldE93bmVyKCk7CisJfQorCQorCXByaXZhdGUgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgeworCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRhYmxlIGdldE5hbWVUYWJsZSgpIHsKKwkJcmV0dXJuIGdldE93bmVyKCkuZ2V0RGJUYWJsZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpIHsKKwkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOworCQlyZXR1cm4gcmVsYXRpb25zaGlwTWFwcGluZyA9PSBudWxsID8gbnVsbCA6CisJCQlyZWxhdGlvbnNoaXBNYXBwaW5nLmdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeURiVGFibGUoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbFRhYmxlKCkgeworCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXROYW1lKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVFZGl0YWJsZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFibGVzKCkgeworCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8U3RyaW5nPihnZXRJbml0aWFsVGFibGUoKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZjZkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZy5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CisKKy8qKgorICogVGhpcyBkaWFsb2cgaXMgdXNlZCB0byBlaXRoZXIgY3JlYXRlIG9yIGVkaXQgYSBqb2luZyBjb2x1bW4gdGhhdCBpcyBsb2NhdGVkCisgKiBvbiBhIHJlbGF0aW9uYWwgbWFwcGluZy4KKyAqCisgKiBAc2VlIEpvaW5Db2x1bW4KKyAqIEBzZWUgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneQorICogQHNlZSBKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdAorICogQHNlZSBKb2luQ29sdW1uRGlhbG9nUGFuZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nIAorCWV4dGVuZHMgSm9pbkNvbHVtbkRpYWxvZzxKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdD4gCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2c8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCisJICogQHBhcmFtIHJlbGF0aW9uc2hpcE1hcHBpbmcgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIHRvCisJICogY3JlYXRlCisJICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcworCSAqIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQorCSAqLworCUpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZygKKwkJU2hlbGwgcGFyZW50LAorCSAgICBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5Pd25lciwKKwkgICAgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisKKwkJc3VwZXIocGFyZW50LCBqb2luQ29sdW1uT3duZXIsIGpvaW5Db2x1bW4pOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgeworCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneVN0YXRlT2JqZWN0KAorCQkJZ2V0T3duZXIoKSwKKwkJCWdldEpvaW5Db2x1bW4oKQorCQkpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGdldE93bmVyKCkgeworCQlyZXR1cm4gKEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kpIHN1cGVyLmdldE93bmVyKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5U3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5U3RhdGVPYmplY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDgzY2FjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdC5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOworCisvKioKKyAqIFRoZSBzdGF0ZSBvYmplY3QgdXNlZCB0byBjcmVhdGUgb3IgZWRpdCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG9uIGEKKyAqIHJlbGF0aW9uc2hpcCBtYXBwaW5nLgorICoKKyAqIEBzZWUgSm9pbkNvbHVtbgorICogQHNlZSBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5CisgKiBAc2VlIEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZworICoKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5U3RhdGVPYmplY3QgCisJZXh0ZW5kcyBKb2luQ29sdW1uU3RhdGVPYmplY3QKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneVN0YXRlT2JqZWN0PC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBqb2luaW5nU3RyYXRlZ3kgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUKKwkgKiBAcGFyYW0gam9pbkNvbHVtbiBUaGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlzCisJICogdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCisJICovCisJcHVibGljIEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneVN0YXRlT2JqZWN0KAorCQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3ksCisJCSAgICBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJc3VwZXIoam9pbmluZ1N0cmF0ZWd5LCBqb2luQ29sdW1uKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHVibGljIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgZ2V0T3duZXIoKSB7CisJCXJldHVybiAoSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSkgc3VwZXIuZ2V0T3duZXIoKTsKKwl9CisJCisJcHJpdmF0ZSBSZWxhdGlvbnNoaXBSZWZlcmVuY2UgZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwl9CisJCisJcHJpdmF0ZSBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7CisJfQorCQorCXByaXZhdGUgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7CisJCXJldHVybiBnZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgeworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKb2luQ29sdW1uKCk7CisJCQorCQlpZiAoam9pbkNvbHVtbiAhPSBudWxsKSB7CisJCQlyZXR1cm4gam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKTsKKwkJfQorCQkKKwkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGFibGUgZ2V0TmFtZVRhYmxlKCkgeworCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYlNjaGVtYSgpOworCQlpZiAoc2NoZW1hID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJU3RyaW5nIHRhYmxlSWRlbnRpZmllciA9IHRoaXMuZ2V0VGFibGUoKTsKKwkJaWYgKHRhYmxlSWRlbnRpZmllciA9PSBudWxsKSB7CisJCQl0YWJsZUlkZW50aWZpZXIgPSB0aGlzLmdldERlZmF1bHRUYWJsZSgpOworCQl9CisKKwkJcmV0dXJuIHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIodGFibGVJZGVudGlmaWVyKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7CisJCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKKworCQlpZiAocmVsYXRpb25zaGlwTWFwcGluZyA9PSBudWxsKXsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSByZWxhdGlvbnNoaXBNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7CisKKwkJaWYgKHRhcmdldEVudGl0eSAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGFyZ2V0RW50aXR5LmdldFByaW1hcnlEYlRhYmxlKCk7CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKKwkJcmV0dXJuIGdldFR5cGVNYXBwaW5nKCkuZ2V0RGJTY2hlbWEoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliOWNiMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOiAgCisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgbyBKb2luIGNvbHVtbnMgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8CisgKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCB8ICBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUge0BsaW5rIEpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlfQorICogQHNlZSB7QGxpbmsgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneX0KKyAqIEBzZWUge0BsaW5rIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZX0KKyAqIEBzZWUge0BsaW5rIE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9CisgKgorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZQorCWV4dGVuZHMgQWJzdHJhY3RKb2luaW5nU3RyYXRlZ3lQYW5lCisJCTxKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneT4KK3sKKworCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpbmNsdWRlT3ZlcnJpZGVDaGVja0JveDsKKworCXB1YmxpYyBzdGF0aWMgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUgYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZVdpdGhJbmNsdWRlT3ZlcnJpZGVDaGVja0JveCgKKwkJRm9ybVBhbmU8PyBleHRlbmRzIEpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlPiBwYXJlbnRQYW5lLCAKKwkJQ29tcG9zaXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKHBhcmVudFBhbmUsIHBhcmVudCwgdHJ1ZSk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUgYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZVdpdGhvdXRJbmNsdWRlT3ZlcnJpZGVDaGVja0JveCgKKwkJRm9ybVBhbmU8PyBleHRlbmRzIEpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlPiBwYXJlbnRQYW5lLCAKKwkJQ29tcG9zaXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lIGJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmVXaXRoSW5jbHVkZU92ZXJyaWRlQ2hlY2tCb3goCisJCUZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCisJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U+IHN1YmplY3RIb2xkZXIsCisgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZShwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHRydWUpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lIGJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmVXaXRob3V0SW5jbHVkZU92ZXJyaWRlQ2hlY2tCb3goCisJCUZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCisJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U+IHN1YmplY3RIb2xkZXIsCisgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZShwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKKwl9CisKKwlwcml2YXRlIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKAorCQkJRm9ybVBhbmU8PyBleHRlbmRzIEpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlPiBwYXJlbnRQYW5lLCAKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICBib29sZWFuIGluY2x1ZGVPdmVycmlkZUNoZWNrQm94KSB7CisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJCXRoaXMuaW5jbHVkZU92ZXJyaWRlQ2hlY2tCb3ggPSBpbmNsdWRlT3ZlcnJpZGVDaGVja0JveDsKKwkJaW5pdGlhbGl6ZUxheW91dDIoZ2V0Q29udHJvbCgpKTsKKwl9CisJCisJcHJpdmF0ZSBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZShGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlPiBzdWJqZWN0SG9sZGVyLAorICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorICAgICAgICBib29sZWFuIGluY2x1ZGVPdmVycmlkZUNoZWNrQm94KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwkJdGhpcy5pbmNsdWRlT3ZlcnJpZGVDaGVja0JveCA9IGluY2x1ZGVPdmVycmlkZUNoZWNrQm94OworCQlpbml0aWFsaXplTGF5b3V0MihnZXRDb250cm9sKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJLy9zZWUgaW5pdGlhbGl6ZUxheW91dDIKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dDIoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlzdXBlci5pbml0aWFsaXplTGF5b3V0KGNvbnRhaW5lcik7IAorCQkvL2p1c3QgY2FsbCBzdXBlciwgd2UgYXJlIGRlbGF5aW5nIHRoZSBpbml0aWFsaXplTGF5b3V0IGJlY2F1c2Ugb2YgdGhlIGluY2x1ZGVPdmVycmlkZUNoZWNrQm94IGJvb2xlYW4KKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXNlc1N0cmF0ZWd5SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgQm9vbGVhbj4oCisJCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5QUkVET01JTkFOVF9KT0lOSU5HX1NUUkFURUdZX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7CisJCQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyBCb29sZWFuLkZBTFNFIDoKKwkJCQkJQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC51c2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZSA9PSBCb29sZWFuLlRSVUUpIHsKKwkJCQkJdGhpcy5zdWJqZWN0LnNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXRoaXMuc3ViamVjdC51bnNldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneT4gYnVpbGRKb2luaW5nU3RyYXRlZ3lIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyCisJCQkJPEpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlLCBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5PigKKwkJCQkJZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQkJfQorCQl9OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmF0ZWd5TGFiZWxLZXkoKSB7CisJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX2pvaW5Db2x1bW5Kb2luaW5nTGFiZWw7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21wb3NpdGUgYnVpbGRTdHJhdGVneURldGFpbHNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgeworCQlpZiAodGhpcy5pbmNsdWRlT3ZlcnJpZGVDaGVja0JveCkgeworCQkJcmV0dXJuIG5ldyBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc1dpdGhPdmVycmlkZU9wdGlvbkNvbXBvc2l0ZSh0aGlzLCB0aGlzLmpvaW5pbmdTdHJhdGVneUhvbGRlciwgcGFyZW50KS5nZXRDb250cm9sKCk7CisJCX0KKwkJcmV0dXJuIG5ldyBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZSh0aGlzLCB0aGlzLmpvaW5pbmdTdHJhdGVneUhvbGRlciwgcGFyZW50KS5nZXRDb250cm9sKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0MzAyMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBUaGUgc3RhdGUgb2JqZWN0IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkpvaW5Db2x1bW48L2NvZGU+LgorICoKKyAqIEBzZWUgSm9pbkNvbHVtbgorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKb2luQ29sdW1uU3RhdGVPYmplY3QgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Cit7CisJcHJpdmF0ZSBCb29sZWFuIGluc2VydGFibGU7CisJcHJpdmF0ZSBCb29sZWFuIG51bGxhYmxlOworCXByaXZhdGUgQm9vbGVhbiB1bmlxdWU7CisJcHJpdmF0ZSBCb29sZWFuIHVwZGF0YWJsZTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVEFCTEVfUFJPUEVSVFkgPSAiaW5zZXJ0YWJsZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTEFCTEVfUFJPUEVSVFkgPSAibnVsbGFibGUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSVFVRV9QUk9QRVJUWSA9ICJ1bmlxdWUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFUQUJMRV9QUk9QRVJUWSA9ICJ1cGRhdGFibGUiOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uU3RhdGVPYmplY3Q8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIG93bmVyIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzIGxvY2F0ZWQKKwkgKiBAcGFyYW0gam9pbkNvbHVtbiBUaGUgam9pbiBjb2x1bW4gdG8gZWRpdAorCSAqLworCXB1YmxpYyBKb2luQ29sdW1uU3RhdGVPYmplY3QoT2JqZWN0IG93bmVyLCBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJc3VwZXIob3duZXIsIGpvaW5Db2x1bW4pOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdEluc2VydGFibGUoKSB7CisKKwkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0Sm9pbkNvbHVtbigpOworCisJCWlmIChqb2luQ29sdW1uICE9IG51bGwpIHsKKwkJCXJldHVybiBqb2luQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKTsKKwkJfQorCisJCXJldHVybiBCYXNlQ29sdW1uLkRFRkFVTFRfSU5TRVJUQUJMRTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROdWxsYWJsZSgpIHsKKworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKb2luQ29sdW1uKCk7CisKKwkJaWYgKGpvaW5Db2x1bW4gIT0gbnVsbCkgeworCQkJcmV0dXJuIGpvaW5Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKTsKKwkJfQorCisJCXJldHVybiBCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEU7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VW5pcXVlKCkgeworCisJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpvaW5Db2x1bW4oKTsKKworCQlpZiAoam9pbkNvbHVtbiAhPSBudWxsKSB7CisJCQlyZXR1cm4gam9pbkNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKTsKKwkJfQorCisJCXJldHVybiBCYXNlQ29sdW1uLkRFRkFVTFRfVU5JUVVFOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFVwZGF0YWJsZSgpIHsKKworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKb2luQ29sdW1uKCk7CisKKwkJaWYgKGpvaW5Db2x1bW4gIT0gbnVsbCkgeworCQkJcmV0dXJuIGpvaW5Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCk7CisJCX0KKworCQlyZXR1cm4gQmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5pbnNlcnRhYmxlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7CisJCXJldHVybiAoSm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOworCX0KKworCXB1YmxpYyBCb29sZWFuIGdldE51bGxhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5udWxsYWJsZTsKKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU2NoZW1hIGdldERiU2NoZW1hKCk7CisKKwlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKSB7CisJCXJldHVybiB0aGlzLnVuaXF1ZTsKKwl9CisKKwlwdWJsaWMgQm9vbGVhbiBnZXRVcGRhdGFibGUoKSB7CisJCXJldHVybiB0aGlzLnVwZGF0YWJsZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE9iamVjdCBvd25lciwgQmFzZUpvaW5Db2x1bW4gYmFzZUpvaW5Db2x1bW4pIHsKKworCQlzdXBlci5pbml0aWFsaXplKG93bmVyLCBiYXNlSm9pbkNvbHVtbik7CisKKwkJaWYgKGJhc2VKb2luQ29sdW1uICE9IG51bGwpIHsKKwkJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uKSBiYXNlSm9pbkNvbHVtbjsKKworCQkJdGhpcy5pbnNlcnRhYmxlICAgICAgID0gam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCk7CisJCQl0aGlzLm51bGxhYmxlICAgICAgICAgPSBqb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCk7CisJCQl0aGlzLnVuaXF1ZSAgICAgICAgICAgPSBqb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpOworCQkJdGhpcy51cGRhdGFibGUgICAgICAgID0gam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbFRhYmxlKCkgeworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKb2luQ29sdW1uKCk7CisKKwkJaWYgKGpvaW5Db2x1bW4gPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlyZXR1cm4gam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVFZGl0YWJsZSgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW5zZXJ0YWJsZShCb29sZWFuIGluc2VydGFibGUpIHsKKwkJQm9vbGVhbiBvbGRJbnNlcnRhYmxlID0gdGhpcy5pbnNlcnRhYmxlOworCQl0aGlzLmluc2VydGFibGUgPSBpbnNlcnRhYmxlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElOU0VSVEFCTEVfUFJPUEVSVFksIG9sZEluc2VydGFibGUsIGluc2VydGFibGUpOworCX0KKworCXB1YmxpYyB2b2lkIHNldE51bGxhYmxlKEJvb2xlYW4gbnVsbGFibGUpIHsKKwkJQm9vbGVhbiBvbGROdWxsYWJsZSA9IHRoaXMubnVsbGFibGU7CisJCXRoaXMubnVsbGFibGUgPSBudWxsYWJsZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChOVUxMQUJMRV9QUk9QRVJUWSwgb2xkTnVsbGFibGUsIG51bGxhYmxlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiB1bmlxdWUpIHsKKwkJQm9vbGVhbiBvbGRVbmlxdWUgPSB0aGlzLnVuaXF1ZTsKKwkJdGhpcy51bmlxdWUgPSB1bmlxdWU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVU5JUVVFX1BST1BFUlRZLCBvbGRVbmlxdWUsIHVuaXF1ZSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gdXBkYXRhYmxlKSB7CisJCUJvb2xlYW4gb2xkVXBkYXRhYmxlID0gdGhpcy51cGRhdGFibGU7CisJCXRoaXMudXBkYXRhYmxlID0gdXBkYXRhYmxlOworCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFVQREFUQUJMRV9QUk9QRVJUWSwgb2xkVXBkYXRhYmxlLCB1cGRhdGFibGUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YWJsZXMoKSB7CisJCVNjaGVtYSBzY2hlbWEgPSBnZXREYlNjaGVtYSgpOworCQlpZiAoc2NoZW1hID09IG51bGwpIHsKKwkJCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOworCQl9CisJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdChzY2hlbWEuc29ydGVkVGFibGVJZGVudGlmaWVycygpKS5saXN0SXRlcmF0b3IoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB1cGRhdGVKb2luQ29sdW1uKEJhc2VKb2luQ29sdW1uIGFic3RyYWN0Sm9pbkNvbHVtbikgeworCisJCXN1cGVyLnVwZGF0ZUpvaW5Db2x1bW4oYWJzdHJhY3RKb2luQ29sdW1uKTsKKworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbikgYWJzdHJhY3RKb2luQ29sdW1uOworCisJCS8vIFRhYmxlCisJCWlmIChpc1RhYmxlRWRpdGFibGUoKSkgeworCQkJU3RyaW5nIHRhYmxlID0gZ2V0VGFibGUoKTsKKworCQkJaWYgKHZhbHVlc0FyZURpZmZlcmVudCh0YWJsZSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKSkgeworCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUodGFibGUpOworCQkJfQorCQl9CisKKwkJLy8gSW5zZXJ0YWJsZQorCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkgIT0gdGhpcy5pbnNlcnRhYmxlKXsKKwkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSh0aGlzLmluc2VydGFibGUpOworCQl9CisKKwkJLy8gVXBkYXRhYmxlCisJCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpICE9IHRoaXMudXBkYXRhYmxlKXsKKwkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKHRoaXMudXBkYXRhYmxlKTsKKwkJfQorCisJCS8vIFVuaXF1ZQorCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSAhPSB0aGlzLnVuaXF1ZSl7CisJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZSh0aGlzLnVuaXF1ZSk7CisJCX0KKworCQkvLyBOdWxsYWJsZQorCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpICE9IHRoaXMubnVsbGFibGUpeworCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZSh0aGlzLm51bGxhYmxlKTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjczNWM2NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDMzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZENvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BYnN0cmFjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKKyAqIEBzZWUgSm9pblRhYmxlQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCisgKiBAc2VlIEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICoKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgSm9pbkNvbHVtbnNDb21wb3NpdGU8VCBleHRlbmRzIEpwYU5vZGU+IGV4dGVuZHMgRm9ybVBhbmU8VD4KK3sKKwkvKioKKwkgKiBUaGUgZWRpdG9yIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tbW9uIGJlaGF2aW9ycyBkZWZpbmVkIGluIHRoZSBsaXN0IHBhbmUuCisJICovCisJcHJpdmF0ZSBKb2luQ29sdW1uc0VkaXRvcjxUPiBqb2luQ29sdW1uc0VkaXRvcjsKKworCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8VD4gbGlzdFBhbmU7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqIEBwYXJhbSBqb2luQ29sdW1uc0VkaXRvciBUaGUgZWRpdG9yIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tbW9uIGJlaGF2aW9ycworCSAqIGRlZmluZWQgaW4gdGhlIGxpc3QgcGFuZQorCSAqLworCXB1YmxpYyBKb2luQ29sdW1uc0NvbXBvc2l0ZShGb3JtUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbkNvbHVtbnNFZGl0b3I8VD4gam9pbkNvbHVtbnNFZGl0b3IpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCQl0aGlzLmpvaW5Db2x1bW5zRWRpdG9yID0gam9pbkNvbHVtbnNFZGl0b3I7CisJCWluaXRpYWxpemVMYXlvdXQyKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqIEBwYXJhbSBqb2luQ29sdW1uc0VkaXRvciBUaGUgZWRpdG9yIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tbW9uIGJlaGF2aW9ycworCSAqIGRlZmluZWQgaW4gdGhlIGxpc3QgcGFuZQorCSAqLworCXB1YmxpYyBKb2luQ29sdW1uc0NvbXBvc2l0ZShGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5Db2x1bW5zRWRpdG9yPFQ+IGpvaW5Db2x1bW5zRWRpdG9yLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOworCQl0aGlzLmpvaW5Db2x1bW5zRWRpdG9yID0gam9pbkNvbHVtbnNFZGl0b3I7CisJCWluaXRpYWxpemVMYXlvdXQyKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBKb2luQ29sdW1uc0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbkNvbHVtbnNFZGl0b3I8VD4gam9pbkNvbHVtbnNFZGl0b3IpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCQl0aGlzLmpvaW5Db2x1bW5zRWRpdG9yID0gam9pbkNvbHVtbnNFZGl0b3I7CisJCWluaXRpYWxpemVMYXlvdXQyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCS8vc2VlIGludGlhaWxpemVMYXlvdXQyKCkKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUxheW91dDIoKSB7CisJCXRoaXMubGlzdFBhbmUgPSBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8VD4oCisJCQl0aGlzLAorCQkJZ2V0Q29udHJvbCgpLAorCQkJYnVpbGRKb2luQ29sdW1uc0FkYXB0ZXIoKSwKKwkJCWJ1aWxkSm9pbkNvbHVtbnNMaXN0TW9kZWwoKSwKKwkJCWJ1aWxkU2VsZWN0ZWRKb2luQ29sdW1uSG9sZGVyKCksCisJCQlidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9DT0xVTU5TLAorCQkJZmFsc2UKKwkJKTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+IGJ1aWxkU2VsZWN0ZWRKb2luQ29sdW1uSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKb2luQ29sdW1uPigpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCisJCWlmIChqb2luQ29sdW1uLmlzVmlydHVhbCgpKSB7CisJCQlyZXR1cm4gTkxTLmJpbmQoCisJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0LAorCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAorCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQorCQkJKTsKKwkJfQorCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgeworCisJCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKKwkJCQlyZXR1cm4gTkxTLmJpbmQoCisJCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQsCisJCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAorCQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKKwkJCQkpOworCQkJfQorCisJCQlyZXR1cm4gTkxTLmJpbmQoCisJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQsCisJCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCisJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCisJCQkpOworCQl9CisKKwkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gTkxTLmJpbmQoCisJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0LAorCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAorCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQorCQkJKTsKKwkJfQorCisJCXJldHVybiBOTFMuYmluZCgKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zLAorCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCisJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKKwkJKTsKKwl9CisKKwlwcml2YXRlIEFkYXB0ZXIgYnVpbGRKb2luQ29sdW1uc0FkYXB0ZXIoKSB7CisJCXJldHVybiBuZXcgQWJzdHJhY3RBZGFwdGVyKCkgeworCisJCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKKwkJCQlKb2luQ29sdW1uc0NvbXBvc2l0ZS50aGlzLmpvaW5Db2x1bW5zRWRpdG9yLmFkZEpvaW5Db2x1bW4oZ2V0U3ViamVjdCgpKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpIHsKKwkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbnNDb21wb3NpdGVfZWRpdDsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBvcHRpb25PblNlbGVjdGlvbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7CisJCQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKEpvaW5Db2x1bW4pIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7CisJCQkJSm9pbkNvbHVtbnNDb21wb3NpdGUudGhpcy5qb2luQ29sdW1uc0VkaXRvci5lZGl0Sm9pbkNvbHVtbihnZXRTdWJqZWN0KCksIGpvaW5Db2x1bW4pOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKKwkJCQlKb2luQ29sdW1uc0NvbXBvc2l0ZS50aGlzLmpvaW5Db2x1bW5zRWRpdG9yLnJlbW92ZUpvaW5Db2x1bW5zKGdldFN1YmplY3QoKSwgbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkSW5kaWNlcygpKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+IGJ1aWxkSm9pbkNvbHVtbnNMaXN0TW9kZWwoKSB7CisJCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEpvaW5Db2x1bW4+KGJ1aWxkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCksCisJCQlOYW1lZENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwKKwkJCU5hbWVkQ29sdW1uLkRFRkFVTFRfTkFNRV9QUk9QRVJUWSwKKwkJCUJhc2VKb2luQ29sdW1uLlNQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLAorCQkJQmFzZUpvaW5Db2x1bW4uREVGQVVMVF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZKTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+IGJ1aWxkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgeworCQlqYXZhLnV0aWwuTGlzdDxMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4+KCk7CisJCWxpc3QuYWRkKGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkpOworCQlsaXN0LmFkZChidWlsZERlZmF1bHRKb2luQ29sdW1uTGlzdEhvbGRlcigpKTsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiwgSm9pbkNvbHVtbj4obGlzdCk7CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxULCBKb2luQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCksIHRoaXMuam9pbkNvbHVtbnNFZGl0b3IuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0UHJvcGVydHlOYW1lKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiBsaXN0SXRlcmF0b3JfKCkgeworCQkJCXJldHVybiBKb2luQ29sdW1uc0NvbXBvc2l0ZS50aGlzLmpvaW5Db2x1bW5zRWRpdG9yLnNwZWNpZmllZEpvaW5Db2x1bW5zKHRoaXMuc3ViamVjdCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKwkJCQlyZXR1cm4gSm9pbkNvbHVtbnNDb21wb3NpdGUudGhpcy5qb2luQ29sdW1uc0VkaXRvci5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUodGhpcy5zdWJqZWN0KTsKKwkJCX0KKwkJfTsKKwl9CisKKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkxpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Sm9pbkNvbHVtbj4oYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpKTsKKworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+IGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEpvaW5Db2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSwgdGhpcy5qb2luQ29sdW1uc0VkaXRvci5nZXREZWZhdWx0UHJvcGVydHlOYW1lKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEpvaW5Db2x1bW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIEpvaW5Db2x1bW5zQ29tcG9zaXRlLnRoaXMuam9pbkNvbHVtbnNFZGl0b3IuZ2V0RGVmYXVsdEpvaW5Db2x1bW4odGhpcy5zdWJqZWN0KTsKKwkJCX0KKwkJfTsKKwl9CisKKworCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCkgeworCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uKSBlbGVtZW50OworCisJCQkJcmV0dXJuIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKGpvaW5Db2x1bW4pOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsSm9pbkNvbHVtbnNQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gam9pbkNvbHVtbnNQYW5lRW5hYmxlckhvbGRlcikgeworCQluZXcgUGFuZUVuYWJsZXIoam9pbkNvbHVtbnNQYW5lRW5hYmxlckhvbGRlciwgdGhpcy5saXN0UGFuZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJdGhpcy5saXN0UGFuZS5zZXRTZWxlY3RlZEl0ZW0oam9pbkNvbHVtbik7CisJfQorCQorCS8qKgorCSAqIFRoZSBlZGl0b3IgaXMgdXNlZCB0byBjb21wbGV0ZSB0aGUgYmVoYXZpb3Igb2YgdGhpcyBwYW5lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEpvaW5Db2x1bW5zRWRpdG9yPFQ+IHsKKworCQkvKioKKwkJICogQWRkIGEgam9pbiBjb2x1bW4gdG8gdGhlIGdpdmVuIHN1YmplY3QgYW5kIHJldHVybiBpdAorCQkgKi8KKwkJdm9pZCBhZGRKb2luQ29sdW1uKFQgc3ViamVjdCk7CisJCQorCQkvKioKKwkJICogRWRpdCB0aGUgZ2l2ZW4gam9pbiBjb2x1bW4sIHRoZSBFZGl0IGJ1dHRvbiB3YXMgcHJlc3NlZAorCQkgKiB3aGlsZSB0aGlzIGpvaW4gY29sdW1uIHdhcyBzZWxlY3RlZC4KKwkJICovCisJCXZvaWQgZWRpdEpvaW5Db2x1bW4oVCBzdWJqZWN0LCBKb2luQ29sdW1uIGpvaW5Db2x1bW4pOworCQkKKwkJLyoqCisJCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzdWJqZWN0IGhhcyBzcGVjaWZpZWQgam9pbiBjb2x1bW5zCisJCSAqLworCQlib29sZWFuIGhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKFQgc3ViamVjdCk7CisJCQorCQkvKioKKwkJICogUmV0dXJuIHRoZSBzcGNpZmllZCBqb2luIGNvbHVtbnMgZnJvbSB0aGUgZ2l2ZW4gc3ViamVjdAorCQkgKi8KKwkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKFQgc3ViamVjdCk7CisJCQorCQkvKioKKwkJICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWVkIGpvaW4gY29sdW1ucyBvbiB0aGUgZ2l2ZW4gc3ViamVjdAorCQkgKi8KKwkJaW50IHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZShUIHN1YmplY3QpOworCQkKKwkJLyoqCisJCSAqIFJldHVybiB0aGUgZGVmYXVsdCBqb2luIGNvbHVtbiBmcm9tIHRoZSBnaXZlbiBzdWJqZWN0IG9yIG51bGwuCisJCSAqLworCQlKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKFQgc3ViamVjdCk7CisJCQorCQkvKioKKwkJICogUmV0dXJuIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW5zIGxpc3QKKwkJICovCisJCVN0cmluZyBnZXRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RQcm9wZXJ0eU5hbWUoKTsKKwkJCisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbnMgbGlzdAorCQkgKi8KKwkJU3RyaW5nIGdldERlZmF1bHRQcm9wZXJ0eU5hbWUoKTsKKwkJCisJCS8qKgorCQkgKiBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucyBhdCB0aGUgc3BlY2lmaWVkIGluZGljZXMgZnJvbSB0aGUgc3ViamVjdAorCQkgKi8KKwkJdm9pZCByZW1vdmVKb2luQ29sdW1ucyhUIHN1YmplY3QsIGludFtdIHNlbGVjdGVkSW5kaWNlcyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pblRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5UYWJsZUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNDM0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5UYWJsZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNzYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSm9pbkNvbHVtbnNDb21wb3NpdGUuSm9pbkNvbHVtbnNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLlNjaGVtYUNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLlRhYmxlQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVMaXN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIHwKKyAqIHwgICBOYW1lOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgICB8CisgKiB8ICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgLSBKb2luIENvbHVtbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCB8IEpvaW5Db2x1bW5zQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAtIEludmVyc2UgSm9pbiBDb2x1bW5zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IHwgSm9pbkNvbHVtbnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSB7QGxpbmsgSm9pblRhYmxlfQorICogQHNlZSB7QGxpbmsgSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZX0KKyAqIEBzZWUge0BsaW5rIEpvaW5Db2x1bW5zQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBKb2luVGFibGVDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxKb2luVGFibGU+Cit7CisJcHJpdmF0ZSBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zQ2hlY2tCb3g7CisJcHJpdmF0ZSBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveDsKKworCXByaXZhdGUgSm9pbkNvbHVtbnNDb21wb3NpdGU8Sm9pblRhYmxlPiBqb2luQ29sdW1uc0NvbXBvc2l0ZTsKKwlwcml2YXRlIEpvaW5Db2x1bW5zQ29tcG9zaXRlPEpvaW5UYWJsZT4gaW52ZXJzZUpvaW5Db2x1bW5zQ29tcG9zaXRlOworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pblRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBKb2luVGFibGVDb21wb3NpdGUoCisJCQlGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKb2luVGFibGU+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luVGFibGVDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JSm9pblRhYmxlPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEpvaW5UYWJsZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEpvaW5UYWJsZT4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7CisKKwkJLy8gTmFtZSB3aWRnZXRzCisJCVRhYmxlQ29tYm88Sm9pblRhYmxlPiB0YWJsZUNvbWJvID0gYWRkVGFibGVDb21ibyhjb250YWluZXIpOworCQlDb21wb3NpdGUgdGFibGVQYW5lID0gYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKTsKKwkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCQl0YWJsZVBhbmUsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfbmFtZSwKKwkJCXRhYmxlQ29tYm8uZ2V0Q29udHJvbCgpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX05BTUUKKwkJKTsKKwkJCisJCS8vIHNjaGVtYSB3aWRnZXRzCisJCVNjaGVtYUNvbWJvPEpvaW5UYWJsZT4gc2NoZW1hQ29tYm8gPSBhZGRTY2hlbWFDb21ibyhjb250YWluZXIpOworCisJCWFkZExhYmVsZWRDb21wb3NpdGUoCisJCQl0YWJsZVBhbmUsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfc2NoZW1hLAorCQkJc2NoZW1hQ29tYm8uZ2V0Q29udHJvbCgpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX1NDSEVNQQorCQkpOworCQkKKwkJLy8gY2F0YWxvZyB3aWRnZXRzCisJCUNhdGFsb2dDb21ibzxKb2luVGFibGU+IGNhdGFsb2dDb21ibyA9IGFkZENhdGFsb2dDb21ibyhjb250YWluZXIpOworCisJCWFkZExhYmVsZWRDb21wb3NpdGUoCisJCQl0YWJsZVBhbmUsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfY2F0YWxvZywKKwkJCWNhdGFsb2dDb21iby5nZXRDb250cm9sKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fVEFCTEVfQ0FUQUxPRworCQkpOworCisJCS8vIEpvaW4gQ29sdW1ucyBncm91cCBwYW5lCisJCUdyb3VwIGpvaW5Db2x1bW5Hcm91cFBhbmUgPSBhZGRUaXRsZWRHcm91cCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9qb2luQ29sdW1uCisJCSk7CisKKwkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBKb2luIENvbHVtbnMgY2hlY2sgYm94CisJCXRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveCA9IGFkZENoZWNrQm94KAorCQkJYWRkU3ViUGFuZShqb2luQ29sdW1uR3JvdXBQYW5lLCA4KSwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1ucywKKwkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpLAorCQkJbnVsbAorCQkpOworCisJCXRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUgPSBuZXcgSm9pbkNvbHVtbnNDb21wb3NpdGU8Sm9pblRhYmxlPigKKwkJCXRoaXMsCisJCQlqb2luQ29sdW1uR3JvdXBQYW5lLAorCQkJYnVpbGRKb2luQ29sdW1uc0VkaXRvcigpCisJCSk7CisKKwkJaW5zdGFsbEpvaW5Db2x1bW5zUGFuZUVuYWJsZXIodGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZSk7CisKKwkJLy8gSW52ZXJzZSBKb2luIENvbHVtbnMgZ3JvdXAgcGFuZQorCQlHcm91cCBpbnZlcnNlSm9pbkNvbHVtbkdyb3VwUGFuZSA9IGFkZFRpdGxlZEdyb3VwKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX2ludmVyc2VKb2luQ29sdW1uCisJCSk7CisKKwkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBJbnZlcnNlIEpvaW4gQ29sdW1ucyBjaGVjayBib3gKKwkJdGhpcy5vdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNDaGVja0JveCA9IGFkZENoZWNrQm94KAorCQkJYWRkU3ViUGFuZShpbnZlcnNlSm9pbkNvbHVtbkdyb3VwUGFuZSwgOCksCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zLAorCQkJYnVpbGRPdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbkhvbGRlcigpLAorCQkJbnVsbAorCQkpOworCisJCXRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29tcG9zaXRlID0gbmV3IEpvaW5Db2x1bW5zQ29tcG9zaXRlPEpvaW5UYWJsZT4oCisJCQl0aGlzLAorCQkJaW52ZXJzZUpvaW5Db2x1bW5Hcm91cFBhbmUsCisJCQlidWlsZEludmVyc2VKb2luQ29sdW1uc0VkaXRvcigpCisJCSk7CisKKwkJaW5zdGFsbEludmVyc2VKb2luQ29sdW1uc1BhbmVFbmFibGVyKHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29tcG9zaXRlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5zdGFsbEludmVyc2VKb2luQ29sdW1uc1BhbmVFbmFibGVyKEpvaW5Db2x1bW5zQ29tcG9zaXRlPEpvaW5UYWJsZT4gcGFuZSkgeworCQlwYW5lLmluc3RhbGxKb2luQ29sdW1uc1BhbmVFbmFibGVyKG5ldyBJbnZlcnNlSm9pbkNvbHVtblBhbmVFbmFibGVySG9sZGVyKCkpOworCX0KKworCXByaXZhdGUgdm9pZCBpbnN0YWxsSm9pbkNvbHVtbnNQYW5lRW5hYmxlcihKb2luQ29sdW1uc0NvbXBvc2l0ZTxKb2luVGFibGU+IHBhbmUpIHsKKwkJcGFuZS5pbnN0YWxsSm9pbkNvbHVtbnNQYW5lRW5hYmxlcihuZXcgSm9pbkNvbHVtblBhbmVFbmFibGVySG9sZGVyKCkpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRJbnZlcnNlSm9pbkNvbHVtbihKb2luVGFibGUgam9pblRhYmxlKSB7CisKKwkJSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBkaWFsb2cgPQorCQkJbmV3IEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2coZ2V0U2hlbGwoKSwgam9pblRhYmxlLCBudWxsKTsKKworCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEFkZEludmVyc2VKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkSW52ZXJzZUpvaW5Db2x1bW5Gcm9tRGlhbG9nKEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgeworCisJCUpvaW5UYWJsZSBzdWJqZWN0ID0gZ2V0U3ViamVjdCgpOworCQlpbnQgaW5kZXggPSBzdWJqZWN0LnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKTsKKworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBzdWJqZWN0LmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGluZGV4KTsKKwkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKKwkJdGhpcy5zZXRTZWxlY3RlZEludmVyc2VKb2luQ29sdW1uKGpvaW5Db2x1bW4pOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZEludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQl0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbXBvc2l0ZS5zZXRTZWxlY3RlZEpvaW5Db2x1bW4oam9pbkNvbHVtbik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZEpvaW5Db2x1bW4oSm9pblRhYmxlIGpvaW5UYWJsZSkgeworCisJCUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBkaWFsb2cgPQorCQkJbmV3IEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyhnZXRTaGVsbCgpLCBqb2luVGFibGUsIG51bGwpOworCisJCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkQWRkSm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZEpvaW5Db2x1bW5Gcm9tRGlhbG9nKEpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7CisKKwkJSm9pblRhYmxlIHN1YmplY3QgPSBnZXRTdWJqZWN0KCk7CisJCWludCBpbmRleCA9IHN1YmplY3Quc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7CisKKwkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0U3ViamVjdCgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW5kZXgpOworCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKGpvaW5Db2x1bW4pOworCQl0aGlzLnNldFNlbGVjdGVkSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLnNldFNlbGVjdGVkSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKKwl9CisKKwlwcml2YXRlIFBvc3RFeGVjdXRpb248SW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZz4gYnVpbGRBZGRJbnZlcnNlSm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSB7CisJCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nPigpIHsKKwkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBkaWFsb2cpIHsKKwkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7CisJCQkJCWFkZEludmVyc2VKb2luQ29sdW1uRnJvbURpYWxvZyhkaWFsb2cuZ2V0U3ViamVjdCgpKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZz4gYnVpbGRBZGRKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpIHsKKwkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZz4oKSB7CisJCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBkaWFsb2cpIHsKKwkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7CisJCQkJCWFkZEpvaW5Db2x1bW5Gcm9tRGlhbG9nKGRpYWxvZy5nZXRTdWJqZWN0KCkpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFBvc3RFeGVjdXRpb248SW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZz4gYnVpbGRFZGl0SW52ZXJzZUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgeworCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248SW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZz4oKSB7CisJCQlwdWJsaWMgdm9pZCBleGVjdXRlKEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZGlhbG9nKSB7CisJCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgeworCQkJCQllZGl0SW52ZXJzZUpvaW5Db2x1bW4oZGlhbG9nLmdldFN1YmplY3QoKSk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2c+IGJ1aWxkRWRpdEpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgeworCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248Sm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nPigpIHsKKwkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGRpYWxvZykgeworCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKKwkJCQkJZWRpdEpvaW5Db2x1bW4oZGlhbG9nLmdldFN1YmplY3QoKSk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgSW52ZXJzZUpvaW5Db2x1bW5zUHJvdmlkZXIgYnVpbGRJbnZlcnNlSm9pbkNvbHVtbnNFZGl0b3IoKSB7CisJCXJldHVybiBuZXcgSW52ZXJzZUpvaW5Db2x1bW5zUHJvdmlkZXIoKTsKKwl9CisKKwlwcml2YXRlIEpvaW5Db2x1bW5zUHJvdmlkZXIgYnVpbGRKb2luQ29sdW1uc0VkaXRvcigpIHsKKwkJcmV0dXJuIG5ldyBKb2luQ29sdW1uc1Byb3ZpZGVyKCk7CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7CisJCXJldHVybiBuZXcgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpOworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBPdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbkhvbGRlcigpOworCX0KKwkJCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxKb2luVGFibGUsIEpvaW5Db2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSwgSm9pblRhYmxlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8Sm9pblRhYmxlLCBKb2luQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCksIEpvaW5UYWJsZS5TUEVDSUZJRURfSU5WRVJTRV9KT0lOX0NPTFVNTlNfTElTVCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgQ29tcG9zaXRlIGFkZFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IGdyb3VwQm94TWFyZ2luKSB7CisJCXJldHVybiBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDEwLCBncm91cEJveE1hcmdpbik7CisJfQorCisJcHJpdmF0ZSBUYWJsZUNvbWJvPEpvaW5UYWJsZT4gYWRkVGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJcmV0dXJuIG5ldyBUYWJsZUNvbWJvPEpvaW5UYWJsZT4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuREVGQVVMVF9OQU1FX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7CisJCQkJaWYgKHByb3BlcnR5TmFtZSA9PSBUYWJsZS5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSAKKwkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkKKwkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWQorCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGUuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgKSB7CisJCQkJCXJlcG9wdWxhdGUoKTsKKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHROYW1lKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkTmFtZSh2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTY2hlbWEgZ2V0RGJTY2hlbWFfKCkgeworCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREYlNjaGVtYSgpOworCQkJfQorCisJCX07CisJfQorCQorCXByaXZhdGUgU2NoZW1hQ29tYm88Sm9pblRhYmxlPiBhZGRTY2hlbWFDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJcmV0dXJuIG5ldyBTY2hlbWFDb21ibzxKb2luVGFibGU+KHRoaXMsIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQkJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOworCQkJCWlmIChwcm9wZXJ0eU5hbWUgPT0gVGFibGUuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZCisJCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSApIHsKKwkJCQkJcmVwb3B1bGF0ZSgpOworCQkJCX0KKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFNjaGVtYSh2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcl8oKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERiU2NoZW1hQ29udGFpbmVyKCk7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgQ2F0YWxvZ0NvbWJvPEpvaW5UYWJsZT4gYWRkQ2F0YWxvZ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IENhdGFsb2dDb21ibzxKb2luVGFibGU+KHRoaXMsIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0Q2F0YWxvZygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZENhdGFsb2codmFsdWUpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZENhdGFsb2coKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZWRpdEludmVyc2VKb2luQ29sdW1uKEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgeworCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKHN0YXRlT2JqZWN0LmdldEpvaW5Db2x1bW4oKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGVkaXRJbnZlcnNlSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKworCQlJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGRpYWxvZyA9CisJCQluZXcgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyhnZXRTaGVsbCgpLCBnZXRTdWJqZWN0KCksIGpvaW5Db2x1bW4pOworCisJCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkRWRpdEludmVyc2VKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZWRpdEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisKKwkJSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGRpYWxvZyA9CisJCQluZXcgSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nKGdldFNoZWxsKCksIGdldFN1YmplY3QoKSwgam9pbkNvbHVtbik7CisKKwkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRFZGl0Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGVkaXRKb2luQ29sdW1uKEpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7CisJCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oc3RhdGVPYmplY3QuZ2V0Sm9pbkNvbHVtbigpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlSW52ZXJzZUpvaW5Db2x1bW5zKCkgeworCQlpZiAodGhpcy5pc1BvcHVsYXRpbmcoKSkgeworCQkJcmV0dXJuOworCQl9CisJCQorCQlKb2luVGFibGUgam9pblRhYmxlID0gdGhpcy5nZXRTdWJqZWN0KCk7CisJCWlmIChqb2luVGFibGUgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCQorCQlib29sZWFuIHNlbGVjdGVkID0gdGhpcy5vdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNDaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKKwkJdGhpcy5zZXRQb3B1bGF0aW5nKHRydWUpOworCisJCXRyeSB7CisJCQlpZiAoc2VsZWN0ZWQpIHsKKwkJCQlqb2luVGFibGUuY29udmVydERlZmF1bHRUb1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCk7CisJCQkJc2V0U2VsZWN0ZWRJbnZlcnNlSm9pbkNvbHVtbihqb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpKTsKKwkJCX0gZWxzZSB7CisJCQkJam9pblRhYmxlLmNsZWFyU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQl0aGlzLnNldFBvcHVsYXRpbmcoZmFsc2UpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUpvaW5Db2x1bW5zKCkgeworCQlpZiAodGhpcy5pc1BvcHVsYXRpbmcoKSkgeworCQkJcmV0dXJuOworCQl9CisJCQorCQlKb2luVGFibGUgam9pblRhYmxlID0gdGhpcy5nZXRTdWJqZWN0KCk7CisJCWlmIChqb2luVGFibGUgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCQorCQlib29sZWFuIHNlbGVjdGVkID0gdGhpcy5vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94LmdldFNlbGVjdGlvbigpOworCQl0aGlzLnNldFBvcHVsYXRpbmcodHJ1ZSk7CisKKwkJdHJ5IHsKKwkJCWlmIChzZWxlY3RlZCkgeworCQkJCWpvaW5UYWJsZS5jb252ZXJ0RGVmYXVsdFRvU3BlY2lmaWVkSm9pbkNvbHVtbigpOworCQkJCXNldFNlbGVjdGVkSm9pbkNvbHVtbihqb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCkpOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKGludCBpbmRleCA9IGpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsgLS1pbmRleCA+PSAwOyApIHsKKwkJCQkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW5kZXgpOworCQkJCX0KKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXRoaXMuc2V0UG9wdWxhdGluZyhmYWxzZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIGNsYXNzIEludmVyc2VKb2luQ29sdW1uc1Byb3ZpZGVyIGltcGxlbWVudHMgSm9pbkNvbHVtbnNFZGl0b3I8Sm9pblRhYmxlPiB7CisKKwkJcHVibGljIHZvaWQgYWRkSm9pbkNvbHVtbihKb2luVGFibGUgc3ViamVjdCkgeworCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuYWRkSW52ZXJzZUpvaW5Db2x1bW4oc3ViamVjdCk7CisJCX0KKworCQlwdWJsaWMgSm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbihKb2luVGFibGUgc3ViamVjdCkgeworCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQcm9wZXJ0eU5hbWUoKSB7CisJCQlyZXR1cm4gSm9pblRhYmxlLkRFRkFVTFRfSU5WRVJTRV9KT0lOX0NPTFVNTjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGVkaXRKb2luQ29sdW1uKEpvaW5UYWJsZSBzdWJqZWN0LCBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJCUpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmVkaXRJbnZlcnNlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKEpvaW5UYWJsZSBzdWJqZWN0KSB7CisJCQlyZXR1cm4gc3ViamVjdC5oYXNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHJlbW92ZUpvaW5Db2x1bW5zKEpvaW5UYWJsZSBzdWJqZWN0LCBpbnRbXSBzZWxlY3RlZEluZGljZXMpIHsKKwkJCWZvciAoaW50IGluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKKwkJCQlzdWJqZWN0LnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKHNlbGVjdGVkSW5kaWNlc1tpbmRleF0pOworCQkJfQorCQl9CisKKwkJcHVibGljIExpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucyhKb2luVGFibGUgc3ViamVjdCkgeworCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7CisJCX0KKworCQlwdWJsaWMgaW50IHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZShKb2luVGFibGUgc3ViamVjdCkgeworCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RQcm9wZXJ0eU5hbWUoKSB7CisJCQlyZXR1cm4gSm9pblRhYmxlLlNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUOworCQl9CisJfQorCisJcHJpdmF0ZSBjbGFzcyBKb2luQ29sdW1uc1Byb3ZpZGVyIGltcGxlbWVudHMgSm9pbkNvbHVtbnNFZGl0b3I8Sm9pblRhYmxlPiB7CisKKwkJcHVibGljIHZvaWQgYWRkSm9pbkNvbHVtbihKb2luVGFibGUgc3ViamVjdCkgeworCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuYWRkSm9pbkNvbHVtbihzdWJqZWN0KTsKKwkJfQorCisJCXB1YmxpYyBKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKEpvaW5UYWJsZSBzdWJqZWN0KSB7CisJCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0UHJvcGVydHlOYW1lKCkgeworCQkJcmV0dXJuIEpvaW5UYWJsZS5ERUZBVUxUX0pPSU5fQ09MVU1OOworCQl9CisKKwkJcHVibGljIHZvaWQgZWRpdEpvaW5Db2x1bW4oSm9pblRhYmxlIHN1YmplY3QsIEpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuZWRpdEpvaW5Db2x1bW4oam9pbkNvbHVtbik7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucyhKb2luVGFibGUgc3ViamVjdCkgeworCQkJcmV0dXJuIHN1YmplY3QuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHJlbW92ZUpvaW5Db2x1bW5zKEpvaW5UYWJsZSBzdWJqZWN0LCBpbnRbXSBzZWxlY3RlZEluZGljZXMpIHsKKwkJCWZvciAoaW50IGluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKKwkJCQlzdWJqZWN0LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7CisJCQl9CisJCX0KKworCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKEpvaW5UYWJsZSBzdWJqZWN0KSB7CisJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQl9CisKKwkJcHVibGljIGludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoSm9pblRhYmxlIHN1YmplY3QpIHsKKwkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RQcm9wZXJ0eU5hbWUoKSB7CisJCQlyZXR1cm4gSm9pblRhYmxlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVDsKKwkJfQorCX0KKwkKKwkKKwlwcml2YXRlIGNsYXNzIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIgZXh0ZW5kcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgorCSAgICBpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHsKKwkKKwkJcHVibGljIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7CisJCQlzdXBlcihidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKKwkJfQorCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKKwkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5saXN0SG9sZGVyLnNpemUoKSA+IDApOworCQl9CisJCisJCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKKwkJCXVwZGF0ZUpvaW5Db2x1bW5zKCk7CisJCX0KKwl9CisKKwkKKwlwcml2YXRlIGNsYXNzIE92ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uSG9sZGVyIGV4dGVuZHMgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4KKwkgICAgaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB7CisJCisJCXB1YmxpYyBPdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbkhvbGRlcigpIHsKKwkJCXN1cGVyKGJ1aWxkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKKwkJfQorCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKKwkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5saXN0SG9sZGVyLnNpemUoKSA+IDApOworCQl9CisJCisJCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKKwkJCXVwZGF0ZUludmVyc2VKb2luQ29sdW1ucygpOworCQl9CisJfQorCisJCisJcHJpdmF0ZSBjbGFzcyBKb2luQ29sdW1uUGFuZUVuYWJsZXJIb2xkZXIgCisJCWV4dGVuZHMgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5UYWJsZSwgQm9vbGVhbj4gCisJeworCQlwcml2YXRlIFN0YXRlQ2hhbmdlTGlzdGVuZXIgc3RhdGVDaGFuZ2VMaXN0ZW5lcjsKKwkJCisJCQorCQlwdWJsaWMgSm9pbkNvbHVtblBhbmVFbmFibGVySG9sZGVyKCkgeworCQkJc3VwZXIoCisJCQkJbmV3IFZhbHVlTGlzdEFkYXB0ZXI8Sm9pblRhYmxlPigKKwkJCQkJbmV3IFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyKGdldFN1YmplY3RIb2xkZXIoKSksIAorCQkJCQlKb2luVGFibGUuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKSk7CisJCQl0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIgPSBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKTsKKwkJfQorCQkKKwkJCisJCXByaXZhdGUgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQkJdmFsdWVTdGF0ZUNoYW5nZWQoZXZlbnQpOworCQkJCX0KKwkJCX07CisJCX0KKwkJCisJCXByaXZhdGUgdm9pZCB2YWx1ZVN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNhY2hlZFZhbHVlOworCQkJT2JqZWN0IG5ld1ZhbHVlID0gdHJhbnNmb3JtTmV3KHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7CisJCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEpvaW5UYWJsZSB2YWx1ZSkgeworCQkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gc3VwZXIudHJhbnNmb3JtKHZhbHVlKTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oSm9pblRhYmxlIHZhbHVlKSB7CisJCQlib29sZWFuIHZpcnR1YWwgPSB2YWx1ZS5nZXRQYXJlbnQoKS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5pc1BhcmVudFZpcnR1YWwoKTsKKwkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoISB2aXJ0dWFsICYmIHZhbHVlLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpID4gMCk7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKKwkJCXN1cGVyLmVuZ2FnZU1vZGVsKCk7CisJCQl0aGlzLnZhbHVlSG9sZGVyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgeworCQkJdGhpcy52YWx1ZUhvbGRlci5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7CisJCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOworCQl9CisKKwl9CisJCisJcHJpdmF0ZSBjbGFzcyBJbnZlcnNlSm9pbkNvbHVtblBhbmVFbmFibGVySG9sZGVyIAorCQlleHRlbmRzIENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxKb2luVGFibGUsIEJvb2xlYW4+CisJeworCQlwcml2YXRlIFN0YXRlQ2hhbmdlTGlzdGVuZXIgc3RhdGVDaGFuZ2VMaXN0ZW5lcjsKKwkJCisJCQorCQlwdWJsaWMgSW52ZXJzZUpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlcigpIHsKKwkJCXN1cGVyKAorCQkJCW5ldyBWYWx1ZUxpc3RBZGFwdGVyPEpvaW5UYWJsZT4oCisJCQkJCW5ldyBSZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcihnZXRTdWJqZWN0SG9sZGVyKCkpLCAKKwkJCQkJSm9pblRhYmxlLlNQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OU19MSVNUKSk7CisJCQl0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIgPSBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKTsKKwkJfQorCQkKKwkJCisJCXByaXZhdGUgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQkJdmFsdWVTdGF0ZUNoYW5nZWQoZXZlbnQpOworCQkJCX0KKwkJCX07CisJCX0KKwkJCisJCXByaXZhdGUgdm9pZCB2YWx1ZVN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNhY2hlZFZhbHVlOworCQkJT2JqZWN0IG5ld1ZhbHVlID0gdHJhbnNmb3JtTmV3KHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7CisJCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEpvaW5UYWJsZSB2YWx1ZSkgeworCQkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gc3VwZXIudHJhbnNmb3JtKHZhbHVlKTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oSm9pblRhYmxlIHZhbHVlKSB7CisJCQlib29sZWFuIHZpcnR1YWwgPSB2YWx1ZS5nZXRQYXJlbnQoKS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5pc1BhcmVudFZpcnR1YWwoKTsKKwkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoISB2aXJ0dWFsICYmIHZhbHVlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSA+IDApOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7CisJCQlzdXBlci5lbmdhZ2VNb2RlbCgpOworCQkJdGhpcy52YWx1ZUhvbGRlci5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKKwkJCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOworCQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzNjMWMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZUVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZTogIAorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IG8gSm9pbiB0YWJsZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfAorICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgfCAgSm9pblRhYmxlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIHtAbGluayBKb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlfQorICogQHNlZSB7QGxpbmsgSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5fQorICogQHNlZSB7QGxpbmsgTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZX0KKyAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lfQorICoKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZQorCWV4dGVuZHMgQWJzdHJhY3RKb2luaW5nU3RyYXRlZ3lQYW5lCisJCTxKb2luVGFibGVFbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlLCBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3k+Cit7CisJcHVibGljIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUoCisJCQlGb3JtUGFuZTw/IGV4dGVuZHMgSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gcGFyZW50UGFuZSwgCisJCQlDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCQorCQorCXB1YmxpYyBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lKEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCisJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZT4gc3ViamVjdEhvbGRlciwKKyAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNTdHJhdGVneUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Sm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgQm9vbGVhbj4oCisJCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIFJlbGF0aW9uc2hpcFJlZmVyZW5jZS5QUkVET01JTkFOVF9KT0lOSU5HX1NUUkFURUdZX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7CisJCQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyBCb29sZWFuLkZBTFNFIDoKKwkJCQkJQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC51c2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlID09IEJvb2xlYW4uVFJVRSkgeworCQkJCQl0aGlzLnN1YmplY3Quc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQl0aGlzLnN1YmplY3QudW5zZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5PiBidWlsZEpvaW5pbmdTdHJhdGVneUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIKKwkJCQk8Sm9pblRhYmxlRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5PigKKwkJCQkJZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJhdGVneUxhYmVsS2V5KCkgeworCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19qb2luVGFibGVKb2luaW5nTGFiZWw7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21wb3NpdGUgYnVpbGRTdHJhdGVneURldGFpbHNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgeworCQlyZXR1cm4gbmV3IEpvaW5UYWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5UYWJsZUhvbGRlcigpLCBwYXJlbnQpLmdldENvbnRyb2woKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxKb2luVGFibGU+IGJ1aWxkSm9pblRhYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKb2luVGFibGVKb2luaW5nU3RyYXRlZ3ksIEpvaW5UYWJsZT4oCisJCQkJdGhpcy5qb2luaW5nU3RyYXRlZ3lIb2xkZXIsIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneS5KT0lOX1RBQkxFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKb2luVGFibGUgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRKb2luVGFibGUoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThiYTcxZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDIzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSm9pbkNvbHVtbnNDb21wb3NpdGUuSm9pbkNvbHVtbnNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVMaXN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgSm9pbkNvbHVtbnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCisgKiBAc2VlIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kKKyAqIEBzZWUgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUKKyAqIEBzZWUgSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nCisgKgorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZSAKKwlleHRlbmRzIEZvcm1QYW5lPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+Cit7CisJCisJcHJpdmF0ZSBKb2luQ29sdW1uc0NvbXBvc2l0ZTxKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5PiBqb2luQ29sdW1uc0NvbXBvc2l0ZTsKKwkKKwlwdWJsaWMgSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNDb21wb3NpdGUoCisJCQlGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CisJfQorCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsJCQorCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlID0gbmV3IEpvaW5Db2x1bW5zQ29tcG9zaXRlPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+KHRoaXMsIGNvbnRhaW5lciwgYnVpbGRKb2luQ29sdW1uc1Byb3ZpZGVyKCkpOworCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLmluc3RhbGxKb2luQ29sdW1uc1BhbmVFbmFibGVyKG5ldyBKb2luQ29sdW1uUGFuZUVuYWJsZXJIb2xkZXIoKSk7CisJfQorCQorCXByaXZhdGUgSm9pbkNvbHVtbnNFZGl0b3I8Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneT4gYnVpbGRKb2luQ29sdW1uc1Byb3ZpZGVyKCkgeworCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5zRWRpdG9yPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+KCkgeworCisJCQlwdWJsaWMgdm9pZCBhZGRKb2luQ29sdW1uKEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgc3ViamVjdCkgeworCQkJCUpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlLnRoaXMuYWRkSm9pbkNvbHVtbihzdWJqZWN0KTsKKwkJCX0KKworCQkJcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBzdWJqZWN0KSB7CisJCQkJcmV0dXJuIHN1YmplY3QuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgZWRpdEpvaW5Db2x1bW4oSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBzdWJqZWN0LCBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJCQlKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZS50aGlzLmVkaXRKb2luQ29sdW1uKHN1YmplY3QsIGpvaW5Db2x1bW4pOworCQkJfQorCisJCQlwdWJsaWMgSm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbihKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IHN1YmplY3QpIHsKKwkJCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOworCQkJfQorCisJCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQcm9wZXJ0eU5hbWUoKSB7CisJCQkJcmV0dXJuIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuREVGQVVMVF9KT0lOX0NPTFVNTl9QUk9QRVJUWTsKKwkJCX0KKworCQkJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RQcm9wZXJ0eU5hbWUoKSB7CisJCQkJcmV0dXJuIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1ucyhKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IHN1YmplY3QsIGludFtdIHNlbGVjdGVkSW5kaWNlcykgeworCQkJCWZvciAoaW50IGluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKKwkJCQkJc3ViamVjdC5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKHNlbGVjdGVkSW5kaWNlc1tpbmRleF0pOworCQkJCX0JCQkJCisJCQl9CisKKwkJCXB1YmxpYyBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBzdWJqZWN0KSB7CisJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJCX0KKworCQkJcHVibGljIGludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBzdWJqZWN0KSB7CisJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgdm9pZCBhZGRKb2luQ29sdW1uKEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5KSB7CisJCUpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZyBkaWFsb2cgPQorCQkJbmV3IEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZyhnZXRTaGVsbCgpLCBqb2luaW5nU3RyYXRlZ3ksIG51bGwpOworCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEFkZEpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkpOworCX0KKwkKKwlwcml2YXRlIFBvc3RFeGVjdXRpb248Sm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nPiBidWlsZEFkZEpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgeworCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248Sm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nPigpIHsKKwkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nIGRpYWxvZykgeworCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKKwkJCQkJYWRkSm9pbkNvbHVtbihkaWFsb2cuZ2V0U3ViamVjdCgpKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgdm9pZCBhZGRKb2luQ29sdW1uKEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneVN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgc3ViamVjdCA9IGdldFN1YmplY3QoKTsKKwkJaW50IGluZGV4ID0gc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKKwkJCisJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHN1YmplY3QuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbmRleCk7CisJCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oam9pbkNvbHVtbik7CisJCXRoaXMuc2V0U2VsZWN0ZWRKb2luQ29sdW1uKGpvaW5Db2x1bW4pOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZS5zZXRTZWxlY3RlZEpvaW5Db2x1bW4oam9pbkNvbHVtbik7CisJfQorCQorCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbihKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSwgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisJCUpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZyBkaWFsb2cgPQorCQkJbmV3IEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZyhnZXRTaGVsbCgpLCBqb2luaW5nU3RyYXRlZ3ksIGpvaW5Db2x1bW4pOworCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEVkaXRKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKKwl9CisJCisJcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZz4gYnVpbGRFZGl0Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSB7CisJCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lEaWFsb2c+KCkgeworCQkJcHVibGljIHZvaWQgZXhlY3V0ZShKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lEaWFsb2cgZGlhbG9nKSB7CisJCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgeworCQkJCQl1cGRhdGVKb2luQ29sdW1uKGRpYWxvZy5nZXRTdWJqZWN0KCkpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUpvaW5Db2x1bW4oSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5U3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKKwkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihzdGF0ZU9iamVjdC5nZXRKb2luQ29sdW1uKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3ksIEJvb2xlYW4+IGJ1aWxkSm9pbkNvbHVtbnNQYW5lRW5hYmxlZEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSwgQm9vbGVhbj4oCisJCQluZXcgVmFsdWVMaXN0QWRhcHRlcjxKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5PigKKwkJCQluZXcgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneT4oZ2V0U3ViamVjdEhvbGRlcigpKSwgCisJCQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpKSB7CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJCQl9CisJCQkJcmV0dXJuIHN1cGVyLnRyYW5zZm9ybSh2YWx1ZSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IHZhbHVlKSB7CisJCQkJYm9vbGVhbiB2aXJ0dWFsID0gdmFsdWUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKTsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCEgdmlydHVhbCAmJiB2YWx1ZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSA+IDApOworCQkJfQorCQl9OworCisJfQorCQorCQorCXByaXZhdGUgY2xhc3MgSm9pbkNvbHVtblBhbmVFbmFibGVySG9sZGVyIAorCQlleHRlbmRzIENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LCBCb29sZWFuPgorCXsKKwkJcHJpdmF0ZSBTdGF0ZUNoYW5nZUxpc3RlbmVyIHN0YXRlQ2hhbmdlTGlzdGVuZXI7CisJCQorCQkKKwkJcHVibGljIEpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlcigpIHsKKwkJCXN1cGVyKAorCQkJCW5ldyBWYWx1ZUxpc3RBZGFwdGVyPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+KAorCQkJCQluZXcgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneT4oZ2V0U3ViamVjdEhvbGRlcigpKSwgCisJCQkJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKSk7CisJCQl0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIgPSBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKTsKKwkJfQorCQkKKwkJCisJCXByaXZhdGUgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQkJdmFsdWVTdGF0ZUNoYW5nZWQoZXZlbnQpOworCQkJCX0KKwkJCX07CisJCX0KKwkJCisJCXByaXZhdGUgdm9pZCB2YWx1ZVN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNhY2hlZFZhbHVlOworCQkJT2JqZWN0IG5ld1ZhbHVlID0gdHJhbnNmb3JtTmV3KHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7CisJCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgdmFsdWUpIHsKKwkJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCQl9CisJCQlyZXR1cm4gc3VwZXIudHJhbnNmb3JtKHZhbHVlKTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSB2YWx1ZSkgeworCQkJYm9vbGVhbiB2aXJ0dWFsID0gdmFsdWUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuaXNQYXJlbnRWaXJ0dWFsKCk7CisJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCEgdmlydHVhbCAmJiB2YWx1ZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSA+IDApOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7CisJCQlzdXBlci5lbmdhZ2VNb2RlbCgpOworCQkJdGhpcy52YWx1ZUhvbGRlci5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKKwkJCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOworCQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNXaXRoT3ZlcnJpZGVPcHRpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNXaXRoT3ZlcnJpZGVPcHRpb25Db21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjk1ZDkxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc1dpdGhPdmVycmlkZU9wdGlvbkNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlCisgKiBAc2VlIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kKKyAqIEBzZWUgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUKKyAqIEBzZWUgSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nCisgKgorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc1dpdGhPdmVycmlkZU9wdGlvbkNvbXBvc2l0ZSAKKwlleHRlbmRzIEZvcm1QYW5lPEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k+Cit7CisJCisJcHJpdmF0ZSBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZSBqb2luaW5nU3RyYXRlZ3lDb21wb3NpdGU7CisJCisJcHVibGljIEpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zV2l0aE92ZXJyaWRlT3B0aW9uQ29tcG9zaXRlKAorCQkJRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5PiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCS8vIE92ZXJyaWRlIERlZmF1bHQgSm9pbiBDb2x1bW5zIGNoZWNrIGJveAorCQlhZGRDaGVja0JveCgKKwkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA4KSwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zLAorCQkJYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCksCisJCQludWxsCisJCSk7CisJCQorCQl0aGlzLmpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZSA9IG5ldyBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKwkJdGhpcy5qb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUuc2V0U2VsZWN0ZWRKb2luQ29sdW1uKGpvaW5Db2x1bW4pOworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKTsKKwl9CisJCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5LCBKb2luQ29sdW1uPigKKwkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gbGlzdEl0ZXJhdG9yXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIGNsYXNzIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIgCisJCWV4dGVuZHMgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4KKwkJaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiAKKwl7CisJCXB1YmxpYyBPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgeworCQkJc3VwZXIoYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgeworCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpID4gMCk7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKKwkJCXVwZGF0ZUpvaW5Db2x1bW5zKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKKwkJfQorCQkKKwkJcHJpdmF0ZSB2b2lkIHVwZGF0ZUpvaW5Db2x1bW5zKGJvb2xlYW4gc2VsZWN0ZWQpIHsKKwkJCWlmIChpc1BvcHVsYXRpbmcoKSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKKwkJCQorCQkJdHJ5IHsKKwkJCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IHN1YmplY3QgPSBnZXRTdWJqZWN0KCk7CisJCisJCQkJLy8gQWRkIGEgam9pbiBjb2x1bW4gYnkgY3JlYXRpbmcgYSBzcGVjaWZpZWQgb25lIHVzaW5nIHRoZSBkZWZhdWx0CisJCQkJLy8gb25lIGlmIGl0IGV4aXN0cworCQkJCWlmIChzZWxlY3RlZCkgeworCQkJCQlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gc3ViamVjdC5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOy8vVE9ETyBjb3VsZCBiZSBudWxsLCBkaXNhYmxlIG92ZXJyaWRlIGRlZmF1bHQgY2hlY2sgYm94PworCQkJCQkKKwkJCQkJaWYgKGRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKKwkJCQkJCVN0cmluZyBjb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKTsKKwkJCQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOworCQkJCQkJCisJCQkJCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBzdWJqZWN0LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoY29sdW1uTmFtZSk7CisJCQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKKwkJCQkJCQorCQkJCQkJSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNXaXRoT3ZlcnJpZGVPcHRpb25Db21wb3NpdGUudGhpcy5zZXRTZWxlY3RlZEpvaW5Db2x1bW4oam9pbkNvbHVtbik7CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gUmVtb3ZlIGFsbCB0aGUgc3BlY2lmaWVkIGpvaW4gY29sdW1ucworCQkJCWVsc2UgeworCQkJCQlmb3IgKGludCBpbmRleCA9IHN1YmplY3Quc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7IC0taW5kZXggPj0gMDsgKSB7CisJCQkJCQlzdWJqZWN0LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW5kZXgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZmluYWxseSB7CisJCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pwdFVpRGV0YWlsc01lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0pwdFVpRGV0YWlsc01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFmODNjNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSnB0VWlEZXRhaWxzTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDI5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKKy8qKgorICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBtYXBwaW5nIHBhbmVzLgorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgSnB0VWlEZXRhaWxzTWVzc2FnZXMgeworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWNjZXNzVHlwZUNvbWJvX2RlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUXVlcnlEaWFsb2dfbmFtZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRRdWVyeURpYWxvZ19xdWVyeVR5cGU7CisgCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFF1ZXJ5RGlhbG9nX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFF1ZXJ5RGlhbG9nX2Rlc2NyaXB0aW9uVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUXVlcnlEaWFsb2dfZGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUXVlcnlEaWFsb2dfbmFtZWRRdWVyeTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRRdWVyeURpYWxvZ19uYW1lZE5hdGl2ZVF1ZXJ5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJ5U3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWVyeVN0YXRlT2JqZWN0X3R5cGVNdXN0QmVTcGVjaWZpZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmFtZWRRdWVyeUNvbXBvc2l0ZV9uYW1lVGV4dExhYmVsOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZU92ZXJyaWRlc0dyb3VwOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGVPdmVycmlkZXNTZWN0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE92ZXJyaWRlc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9lbnVtZXJhdGVkTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9mZXRjaExhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fbG9iTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9uYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fbmFtZURlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbERlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl90ZW1wb3JhbExhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFR5cGVTZWN0aW9uX3R5cGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZVNlY3Rpb25fZGVmYXVsdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUeXBlU2VjdGlvbl9sb2I7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZVNlY3Rpb25fdGVtcG9yYWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZVNlY3Rpb25fZW51bWVyYXRlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX0ZhbHNlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJvb2xlYW5fVHJ1ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXNjYWRlQ29tcG9zaXRlX2FsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXNjYWRlQ29tcG9zaXRlX2Nhc2NhZGVUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXNjYWRlQ29tcG9zaXRlX21lcmdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhc2NhZGVDb21wb3NpdGVfcGVyc2lzdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXNjYWRlQ29tcG9zaXRlX3JlZnJlc2g7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZUNvbXBvc2l0ZV9yZW1vdmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ0Nob29zZXJfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2NvbHVtbkRlZmluaXRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2NvbHVtblNlY3Rpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2RldGFpbHM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGVXaXRoRGVmYXVsdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfbGVuZ3RoOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9uYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9udWxsYWJsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfbnVsbGFibGVXaXRoRGVmYXVsdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfcHJlY2lzaW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9zY2FsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfdGFibGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfdW5pcXVlV2l0aERlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfdXBkYXRhYmxlV2l0aERlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEVtcHR5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRXaXRoT25lUGFyYW07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvdmlkZXJEZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfZGlzY3JpbWluYXRvclR5cGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9uYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfY2hhcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2ludGVnZXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9zdHJpbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5Q29tcG9zaXRlX2luaGVyaXRhbmNlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUNvbXBvc2l0ZV9xdWVyaWVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUNvbXBvc2l0ZV90YWJsZURlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5Q29tcG9zaXRlX3RhYmxlTm9EZWZhdWx0U3BlY2lmaWVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TmFtZUNvbXBvc2l0ZV9uYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudW1UeXBlQ29tcG9zaXRlX29yZGluYWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW51bVR5cGVDb21wb3NpdGVfc3RyaW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZldGNoVHlwZUNvbXBvc2l0ZV9lYWdlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZXRjaFR5cGVDb21wb3NpdGVfbGF6eTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9hdXRvOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2dlbmVyYXRlZFZhbHVlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2dlbmVyYXRvck5hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfaWRlbnRpdHk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfc2VxdWVuY2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfc3RyYXRlZ3k7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfdGFibGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdG9yQ29tcG9zaXRlX2FsbG9jYXRpb25TaXplOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRvckNvbXBvc2l0ZV9pbml0aWFsVmFsdWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdG9yc0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRvcnNDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3JTZWN0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRvcnNDb21wb3NpdGVfdGFibGVHZW5lcmF0b3JDaGVja0JveDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0b3JzQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yU2VjdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJZENsYXNzQ29tcG9zaXRlX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ0NvbXBvc2l0ZV9wa19nZW5lcmF0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvblNlY3Rpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3g7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yU2VjdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJZE1hcHBpbmdDb21wb3NpdGVfdGFibGVHZW5lcmF0b3JDaGVja0JveDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJZE1hcHBpbmdDb21wb3NpdGVfdGFibGVHZW5lcmF0b3JTZWN0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluaGVyaXRhbmNlQ29tcG9zaXRlX2RldGFpbHNHcm91cEJveDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmhlcml0YW5jZUNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yQ29sdW1uR3JvdXBCb3g7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGVfam9pbmVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGVfc2luZ2xlX3RhYmxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluaGVyaXRhbmNlQ29tcG9zaXRlX3N0cmF0ZWd5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGVfdGFibGVfcGVyX2NsYXNzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmVyc2VKb2luQ29sdW1uRGlhbG9nX2VkaXRJbnZlcnNlSm9pbkNvbHVtblRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5pbmdfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbmluZ19tYXBwZWRCeUxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5pbmdfbWFwcGVkQnlBdHRyaWJ1dGVMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luaW5nX2pvaW5Db2x1bW5Kb2luaW5nTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbmluZ19wcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luaW5nX2pvaW5UYWJsZUpvaW5pbmdMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uc0NvbXBvc2l0ZV9lZGl0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX2FkZEpvaW5Db2x1bW5EZXNjcmlwdGlvblRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfYWRkSm9pbkNvbHVtblRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfZGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtbkRlc2NyaXB0aW9uVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtblRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfbmFtZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX3JlZmVyZW5jZWRDb2x1bW5OYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX2NvbHVtbkRlZmluaXRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV9pbnNlcnRhYmxlV2l0aERlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfbnVsbGFibGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfbnVsbGFibGVXaXRoRGVmYXVsdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV90YWJsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV91bmlxdWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdW5pcXVlV2l0aERlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdXBkYXRhYmxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX3VwZGF0YWJsZVdpdGhEZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9pbnZlcnNlSm9pbkNvbHVtbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfam9pbkNvbHVtbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbmFtZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfc2NoZW1hOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9jYXRhbG9nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2NoYW5nZU1hcHBpbmdUeXBlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2RlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfZGlhbG9nVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfbGFiZWxUZXh0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX21hcHBlZEF0dHJpYnV0ZVRleHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfbWFwcGVkVHlwZVRleHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfdW5tYXBwZWRBdHRyaWJ1dGVUZXh0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX3VubWFwcGVkVHlwZVRleHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwQXNDb21wb3NpdGVfdmlydHVhbEF0dHJpYnV0ZVRleHQ7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW1iZWRkYWJsZVVpUHJvdmlkZXJfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5VWlQcm92aWRlcl9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlcl9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFbWJlZGRhYmxlVWlQcm92aWRlcl9saW5rTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5VWlQcm92aWRlcl9saW5rTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGVkU3VwZXJjbGFzc1VpUHJvdmlkZXJfbGlua0xhYmVsOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTnVsbFR5cGVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRhRGF0YUNvbXBsZXRlQ29tYm9fRGVmYXVsdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfY2FzY2FkZVR5cGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2ZldGNoVHlwZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfZ2VuZXJhbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfam9pblRhYmxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9tYXBwZWRCeTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfdGFyZ2V0RW50aXR5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnlIaW50c0dyb3VwQm94OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9yZXN1bHRDbGFzczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5SGludHNHcm91cEJveDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdOYW1lU3RhdGVPYmplY3RfbmFtZUFscmVhZHlFeGlzdHM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3TmFtZVN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTm9OYW1lU2V0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vbmVTZWxlY3RlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgT3B0aW9uYWxDb21wb3NpdGVfZmFsc2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgT3B0aW9uYWxDb21wb3NpdGVfdHJ1ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX2N1c3RvbU9yZGVyaW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yZGVyQnlDb21wb3NpdGVfbm9PcmRlcmluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX29yZGVyQnlHcm91cDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX29yZGVyQnlMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX3ByaW1hcnlLZXlPcmRlcmluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfZGVmaW5lSW5YbWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX2Fzc29jaWF0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQXNzb2NpYXRpb25PdmVycmlkZXNDb21wb3NpdGVfam9pbkNvbHVtbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBPdmVycmlkZXNDb21wb3NpdGVfbm9OYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2FkZERlc2NyaXB0aW9uVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfYWRkVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfZWRpdERlc2NyaXB0aW9uVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfZWRpdFRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGREZXNjcmlwdGlvblRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGRUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdERlc2NyaXB0aW9uVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2VkaXRUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZWRpdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9wcmltYXJ5S2V5Sm9pbkNvbHVtbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWVyaWVzQ29tcG9zaXRlX2Rpc3BsYXlTdHJpbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcnlIaW50c0NvbXBvc2l0ZV9uYW1lQ29sdW1uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJ5SGludHNDb21wb3NpdGVfdmFsdWVDb2x1bW47CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hQ2hvb3Nlcl9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19hZGRTZWNvbmRhcnlUYWJsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19jYXRhbG9nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRDYXRhbG9nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRTY2hlbWE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdFNlY29uZGFyeVRhYmxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX25hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfc2NoZW1hOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9lZGl0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9zZWNvbmRhcnlUYWJsZXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfY2F0YWxvZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2NoZW1hOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NlcXVlbmNlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlQ2hvb3Nlcl9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUNvbXBvc2l0ZV90YWJsZVNlY3Rpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfY2F0YWxvZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfcGtDb2x1bW47CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfcGtDb2x1bW5WYWx1ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9zY2hlbWE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdGFibGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdGFibGVHZW5lcmF0b3I7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdmFsdWVDb2x1bW47CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RW50aXR5Q2hvb3Nlcl9icm93c2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RW50aXR5Q2hvb3Nlcl9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRFbnRpdHlDaG9vc2VyX3NlbGVjdFR5cGVUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUZW1wb3JhbFR5cGVDb21wb3NpdGVfZGF0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUZW1wb3JhbFR5cGVDb21wb3NpdGVfdGltZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUZW1wb3JhbFR5cGVDb21wb3NpdGVfdGltZXN0YW1wOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF91aV9kZXRhaWxzIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdFVpRGV0YWlsc01lc3NhZ2VzLmNsYXNzOworCXN0YXRpYyB7CisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7CisJfQorCisJcHJpdmF0ZSBKcHRVaURldGFpbHNNZXNzYWdlcygpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4NWIzMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CisKKy8qKgorICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZTogIAorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0gSm9pbmluZyBTdHJhdGVneSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBvIE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IHwgbyBKb2luVGFibGVTdHJhdGVneVBhbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSB7QGxpbmsgTWFueVRvTWFueU1hcHBpbmd9CisgKiBAc2VlIHtAbGluayBNYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlfQorICogQHNlZSB7QGxpbmsgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBNYXBwZWRCeVN0cmF0ZWd5UGFuZX0KKyAqIEBzZWUge0BsaW5rIEpvaW5UYWJsZVN0cmF0ZWd5UGFuZX0KKyAqCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIE1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lIAorCWV4dGVuZHMgRm9ybVBhbmU8TWFueVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZT4KK3sKKwlwdWJsaWMgTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUoCisJCQlGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLCAKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxNYW55VG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlPiBzdWJqZWN0SG9sZGVyLCAKKwkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCS8vIGpvaW5pbmcgc3RyYXRlZ3kgZ3JvdXAgcGFuZQorCQlHcm91cCBncm91cFBhbmUgPSBhZGRUaXRsZWRHcm91cCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfdGl0bGUKKwkJKTsKKwkJCisJCW5ldyBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgZ3JvdXBQYW5lKTsKKwkJCisJCW5ldyBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGdyb3VwUGFuZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMzBmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3JkZXJpbmdDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlNYXBwaW5nfQorICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmV9CisgKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBDYXNjYWRlQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgT3JkZXJpbmdDb21wb3NpdGV9CisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAKKwlleHRlbmRzIEFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8TWFueVRvTWFueU1hcHBpbmc+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9NYW55TWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCQkKKwkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IE1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKKwkJbmV3IE9yZGVyaW5nQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1MTViNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPE1hbnlUb01hbnlNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8TWFueVRvTWFueU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX01hbnlUb01hbnlMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZTxNYW55VG9NYW55TWFwcGluZz4gYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQlKcGFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5Y2M5ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CisKKy8qKgorICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZTogIAorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0gSm9pbmluZyBTdHJhdGVneSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBvIEpvaW5Db2x1bW5TdHJhdGVneVBhbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIHtAbGluayBNYW55VG9PbmVNYXBwaW5nfQorICogQHNlZSB7QGxpbmsgTWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlfQorICogQHNlZSB7QGxpbmsgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIEpvaW5Db2x1bW5TdHJhdGVneVBhbmV9CisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lIGV4dGVuZHMgRm9ybVBhbmU8TWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlPgoreworCXB1YmxpYyBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lKAorCQkJRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwgCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8TWFueVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlPiBzdWJqZWN0SG9sZGVyLCAKKwkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCS8vIGpvaW5pbmcgc3RyYXRlZ3kgZ3JvdXAgcGFuZQorCQlHcm91cCBncm91cFBhbmUgPSBhZGRUaXRsZWRHcm91cCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfdGl0bGUKKwkJKTsKKwkJCisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lLgorCQkJYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZVdpdGhJbmNsdWRlT3ZlcnJpZGVDaGVja0JveCgKKwkJCQl0aGlzLCAKKwkJCQlncm91cFBhbmUpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3Y2QxNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUge0BsaW5rIE1hbnlUb09uZU1hcHBpbmd9CisgKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lfQorICogQHNlZSB7QGxpbmsgRmV0Y2hUeXBlQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgT3B0aW9uYWxDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBDYXNjYWRlQ29tcG9zaXRlfQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAKKwlleHRlbmRzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxNYW55VG9PbmVNYXBwaW5nPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9PbmVNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKwkJCisJCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0MGNjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPE1hbnlUb09uZU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8TWFueVRvT25lTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX01hbnlUb09uZUxhYmVsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlPE1hbnlUb09uZU1hcHBpbmc+IGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYXBBc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYXBBc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NDIxYTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hcEFzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw2MzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZUNvbG9yczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5EZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybVVpUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBvc3RFeGVjdXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5GaWx0ZXJlZEl0ZW1zU2VsZWN0aW9uRGlhbG9nOworaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7CisKKy8qKgorICogVGhpcyBtYXAgYXMgY29tcG9zaXRlIHNpbXBseSBzaG93cyBhIHN0eWxlZCB0ZXh0IHdoZXJlIHRoZSBuYW1lIG9mIHRoZQorICogbWFwcGluZyBhbmQgaXRzIHR5cGUgYXJlIGRpc3BsYXllZC4gVGhlIG1hcHBpbmcgdHlwZSBjYW4gYmUgY2xpY2tlZCBvbiB0bworICogaW52b2tlIGEgZGlhbG9nIGluIG9yZGVyIHRvIGNoYW5nZSB0aGUgdHlwZS4KKyAqIDxwPgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgQXR0cmlidXRlICduYW1lJyBpcyBtYXBwZWQgYXMgb25lIHRvIG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMKvwq/Cr8Kvwq/Cr8Kvwq/Cr8KvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGFic3RyYWN0IGNsYXNzIE1hcEFzQ29tcG9zaXRlPFQgZXh0ZW5kcyBKcGFOb2RlPiBleHRlbmRzIFBhbmU8VD4geworCisJcHJvdGVjdGVkIGJvb2xlYW4gZHJhZ0V2ZW50OworCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQ7CisJcHJvdGVjdGVkIEN1cnNvciBoYW5kQ3Vyc29yOworCXByb3RlY3RlZCBNYXBwaW5nQ2hhbmdlSGFuZGxlciBtYXBwaW5nQ2hhbmdlSGFuZGxlcjsKKwlwcm90ZWN0ZWQgaW50IG1hcHBpbmdUeXBlTGVuZ3RoOworCXByb3RlY3RlZCBpbnQgbWFwcGluZ1R5cGVTdGFydDsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBtb3VzZURvd247CisJcHJvdGVjdGVkIGludCBuYW1lTGVuZ3RoOworCXByb3RlY3RlZCBpbnQgbmFtZVN0YXJ0OworCXByb3RlY3RlZCBTdHlsZWRUZXh0IHN0eWxlZFRleHQ7CisKKwkvKioKKwkgKiBUaGUgY29uc3RhbnQgSUQgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGlhbG9nIHNldHRpbmdzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfU0VUVElOR1MgPSAib3JnLmVjbGlwc2UuanB0LnVpLmRpYWxvZ3MuTWFwQXNEaWFsb2ciOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBBc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIE1hcEFzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBKUFQgcGxhdGZvcm0gcmVzcG9uc2JsZSB0byBtYW5hZ2UgdGhlIHVzZXIgaW50ZXJmYWNlIHBhcnQgb2YKKwkgKiB0aGUgSlBUIHBsdWctaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBVSSBwbGF0Zm9ybSBvZiB0aGUgSlBUIHBsdWctaW4KKwkgKi8KKwlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1VaSBnZXRKcGFQbGF0Zm9ybVVpKCkgeworCQlTdHJpbmcgcGxhdGZvcm1JZCA9IGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOworCQlyZXR1cm4gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1VaShwbGF0Zm9ybUlkKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IHByb3ZpZGVyIHJlc3BvbnNpYmxlIGZvciBjbGVhcmluZyB0aGUgbWFwcGluZyB0eXBlLgorCSAqIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vdCBhIGRlZmF1bHQgcHJvdmlkZXIKKwkgKiBAcmV0dXJuIEEgcHJvdmlkZXIgdGhhdCBhY3RzIGFzIGEgZGVmYXVsdCBtYXBwaW5nIHByb3ZpZGVyCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPD8+IGdldERlZmF1bHREZWZpbml0aW9uKCk7CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248Pz4gZ2V0RGVmYXVsdERlZmluaXRpb24oU3RyaW5nIG1hcHBpbmdLZXkpOworCQorCXByb3RlY3RlZCBNYXBwaW5nVWlEZWZpbml0aW9uPD8+IGdldE1hcHBpbmdVaURlZmluaXRpb24oU3RyaW5nIG1hcHBpbmdLZXkpIHsKKwkJZm9yIChNYXBwaW5nVWlEZWZpbml0aW9uPD8+IHByb3ZpZGVyIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMubWFwcGluZ0NoYW5nZUhhbmRsZXIubWFwcGluZ1VpRGVmaW5pdGlvbnMoKSkpIHsKKwkJCWlmIChwcm92aWRlci5nZXRLZXkoKSA9PSBtYXBwaW5nS2V5KSB7CisJCQkJcmV0dXJuIHByb3ZpZGVyOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOwkJCisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgaGFuZGxlciByZXNwb25zaWJsZSB0byBnaXZlIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IKKwkgKiBjb21wbGV0aW5nIHRoZSBiZWhhdmlvciBvZiB0aGlzIHBhbmUuCisJICoKKwkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPk1hcHBpbmdDaGFuZ2VIYW5kbGVyPC9jb2RlPgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBNYXBwaW5nQ2hhbmdlSGFuZGxlciBidWlsZE1hcHBpbmdDaGFuZ2VIYW5kbGVyKCk7CisKKwlwcml2YXRlIE1vdXNlTGlzdGVuZXIgYnVpbGRNb3VzZUxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IE1vdXNlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgeworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7CisJCQkJaWYgKGUuYnV0dG9uID09IDEpIHsKKwkJCQkJbW91c2VEb3duID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7CisJCQkJbW91c2VEb3duID0gZmFsc2U7CisJCQkJU3R5bGVkVGV4dCB0ZXh0ID0gKFN0eWxlZFRleHQpIGUud2lkZ2V0OworCQkJCWludCBvZmZzZXQgPSB0ZXh0LmdldENhcmV0T2Zmc2V0KCk7CisKKwkJCQlpZiAoZHJhZ0V2ZW50KSB7CisJCQkJCWRyYWdFdmVudCA9IGZhbHNlOworCisJCQkJCWlmIChpc092ZXJMaW5rKG9mZnNldCkpIHsKKwkJCQkJCXRleHQuc2V0Q3Vyc29yKGhhbmRDdXJzb3IpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKGlzT3Zlckxpbmsob2Zmc2V0KSkgeworCQkJCQl0ZXh0LnNldEN1cnNvcihoYW5kQ3Vyc29yKTsKKwkJCQkJb3Blbk1hcHBpbmdTZWxlY3Rpb25EaWFsb2coKTsKKwkJCQkJdGV4dC5zZXRDdXJzb3IobnVsbCk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgTW91c2VNb3ZlTGlzdGVuZXIgYnVpbGRNb3VzZU1vdmVMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKKwkJCQlTdHlsZWRUZXh0IHRleHQgPSAoU3R5bGVkVGV4dCkgZS53aWRnZXQ7CisKKwkJCQlpZiAobW91c2VEb3duKSB7CisJCQkJCWlmICghZHJhZ0V2ZW50KSB7CisJCQkJCQl0ZXh0LnNldEN1cnNvcihudWxsKTsKKwkJCQkJfQorCisJCQkJCWRyYWdFdmVudCA9IHRydWU7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQlpbnQgb2Zmc2V0ID0gLTE7CisKKwkJCQl0cnkgeworCQkJCQlvZmZzZXQgPSB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KGUueCwgZS55KSk7CisJCQkJfQorCQkJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKwkJCQl9CisKKwkJCQlpZiAoaXNPdmVyTGluayhvZmZzZXQpKSB7CisJCQkJCXRleHQuc2V0Q3Vyc29yKGhhbmRDdXJzb3IpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJdGV4dC5zZXRDdXJzb3IobnVsbCk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxNYXBwaW5nU2VsZWN0aW9uRGlhbG9nPiBidWlsZFBvc3RFeGVjdXRpb24oKSB7CisKKwkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPE1hcHBpbmdTZWxlY3Rpb25EaWFsb2c+KCkgeworCQkJcHVibGljIHZvaWQgZXhlY3V0ZShNYXBwaW5nU2VsZWN0aW9uRGlhbG9nIGRpYWxvZykgeworCisJCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgeworCQkJCQlNYXBwaW5nVWlEZWZpbml0aW9uPD8+IGRlZmluaXRpb24gPSAoTWFwcGluZ1VpRGVmaW5pdGlvbjw/PikgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7CisJCQkJCW1vcnBoTWFwcGluZyhkZWZpbml0aW9uKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgZnVsbCBsb2NhbGl6ZWQgc3RyaW5nIGJ5IGZvcm1hdHRpbmcgdGhlIGxhYmVsIHRleHQgcmV0dXJuZWQKKwkgKiBieSB0aGUgPGNvZGU+TWFwcGluZ0NoYW5nZUhhbmRsZXI8L2NvZGU+IHdpdGggdGhlIG1hcHBpbmcgbmFtZSBhbmQgdGhlCisJICogbWFwcGluZyB0eXBlLgorCSAqCisJICogQHBhcmFtIG5hbWUgVGhlIGRpc3BsYXkgc3RyaW5nIG9mIHRoZSBtYXBwaW5nIGJlaW5nIGVkaXRlZAorCSAqIEBwYXJhbSBtYXBwaW5nVHlwZSBUaGUgbG9jYWxpemVkIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgbWFwcGluZyB0eXBlCisJICogQHJldHVybiBUaGUgbG9jYWxpemVkIHN0cmluZyBkZXNjcmliaW5nIHRoZSBtYXBwaW5nCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoU3RyaW5nIG5hbWUsIFN0cmluZyBtYXBwaW5nVHlwZSkgeworCQlyZXR1cm4gTkxTLmJpbmQoCisJCQltYXBwaW5nQ2hhbmdlSGFuZGxlci5nZXRMYWJlbFRleHQoKSwKKwkJCW5hbWUsCisJCQltYXBwaW5nVHlwZQorCQkpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgYW55IHN0eWxlIGFwcGxpZWQgdG8gdGhlIHN0eWxlZCB0ZXh0LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNsZWFyU3R5bGVSYW5nZSgpIHsKKwkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKG51bGwpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7CisJCXN1cGVyLmRvUG9wdWxhdGUoKTsKKwkJdXBkYXRlRGVzY3JpcHRpb24oKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgeworCQl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOworCisJCWlmICghc3R5bGVkVGV4dC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXN0eWxlZFRleHQuc2V0RW5hYmxlZChlbmFibGVkKTsKKworCQkJaWYgKGVuYWJsZWQpIHsKKwkJCQl1cGRhdGVMaW5rUmFuZ2UoKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWNsZWFyU3R5bGVSYW5nZSgpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKworCQlzdXBlci5pbml0aWFsaXplKCk7CisKKwkJdGhpcy5lbmFibGVkID0gdHJ1ZTsKKwkJdGhpcy5tYXBwaW5nQ2hhbmdlSGFuZGxlciA9IGJ1aWxkTWFwcGluZ0NoYW5nZUhhbmRsZXIoKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQloYW5kQ3Vyc29yID0gZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ3Vyc29yKFNXVC5DVVJTT1JfSEFORCk7CisKKwkJc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KGNvbnRhaW5lciwgU1dULldSQVAgfCBTV1QuUkVBRF9PTkxZKTsKKwkJc3R5bGVkVGV4dC5hZGRNb3VzZUxpc3RlbmVyKGJ1aWxkTW91c2VMaXN0ZW5lcigpKTsKKwkJc3R5bGVkVGV4dC5hZGRNb3VzZU1vdmVMaXN0ZW5lcihidWlsZE1vdXNlTW92ZUxpc3RlbmVyKCkpOworCQlzdHlsZWRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCX0KKworCS8qKgorCSAqIFJldHJlaXZlIHRoZSA8Y29kZT5NYXBwaW5nVWlEZWZpbml0aW9uPC9jb2RlPiB0aGF0IHByb3ZpZGVzIHRoZSBVSSBmb3IgdGhlCisJICogY3VycmVudCBtYXBwaW5nLgorCSAqCisJICogQHJldHVybiBUaGUgPGNvZGU+TWFwcGluZ1VpUHJvdmlkZXI8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiB0aGUKKwkgKiBtYXBwaW5nIGJlaW5nIGVkaXRlZAorCSAqLworCXByb3RlY3RlZCBNYXBwaW5nVWlEZWZpbml0aW9uPD8+IGluaXRpYWxTZWxlY3Rpb24oKSB7CisKKwkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjw/Pj4gaXRlciA9IHRoaXMubWFwcGluZ0NoYW5nZUhhbmRsZXIubWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsgaXRlci5oYXNOZXh0KCk7ICkgeworCQkJTWFwcGluZ1VpRGVmaW5pdGlvbjw/PiBkZWZpbml0aW9uID0gaXRlci5uZXh0KCk7CisKKwkJCWlmIChnZXRNYXBwaW5nS2V5KCkgPT0gZGVmaW5pdGlvbi5nZXRLZXkoKSkgeworCQkJCXJldHVybiBkZWZpbml0aW9uOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBsb2NhdGlvbiBpcyB3aXRoaW4gdGhlIG1hcHBpbmcgdHlwZSByYW5nZS4KKwkgKgorCSAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbW91c2UgbG9jYXRpb24gaW4gY2hhcmFjdGVyIGNvb3JkaW5hdGUKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb3VzZSBpcyBvdmVyIHRoZSBtYXBwaW5nIHR5cGUgdGV4dDsKKwkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPdmVyTGluayhpbnQgbG9jYXRpb24pIHsKKworCQlyZXR1cm4gKGxvY2F0aW9uID49IG1hcHBpbmdUeXBlU3RhcnQgJiYKKwkJICAgICAgICBsb2NhdGlvbiA8PSBtYXBwaW5nVHlwZVN0YXJ0ICsgbWFwcGluZ1R5cGVMZW5ndGgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1hcHBpbmcga2V5IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBtYXBwaW5nIG9iamVjdC4KKwkgKgorCSAqIEByZXR1cm4gQSBub24tPGNvZGU+bnVsbDwvY29kZT4gdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHRoZSB0eXBlCisJICogb2YgdGhlIG1hcHBpbmcgYmVpbmcgZWRpdGVkCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRNYXBwaW5nS2V5KCk7CisKKwkvKioKKwkgKiBBa3MgdGhlIDxjb2RlPk1hcHBpbmdDaGFuZ2VIYW5kbGVyPC9jb2RlPiB0byBjaGFuZ2UgdGhlIG1hcHBpbmcgdHlwZSB1c2luZworCSAqIHRoZSBnaXZlbiA8Y29kZT5NYXBwaW5nVWlEZWZpbml0aW9uPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG1hcHBpbmcgdHlwZSB1c2VkIGZvcgorCSAqIG1vcnBoaW5nIHRoZSBtYXBwaW5nIGJlaW5nIGVkaXRlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIG1vcnBoTWFwcGluZyhNYXBwaW5nVWlEZWZpbml0aW9uPD8+IGRlZmluaXRpb24pIHsKKwkJbWFwcGluZ0NoYW5nZUhhbmRsZXIubW9ycGhNYXBwaW5nKGRlZmluaXRpb24pOworCX0KKworCS8qKgorCSAqIE9wZW5zIHRoZSBkaWFsb2cgdGhhdCBzaG93cyB0aGUgcmVnaXN0ZXJlZCBtYXBwaW5nIHR5cGVzIGluIG9yZGVyIGZvciB0aGUKKwkgKiB1c2VyIHRvIHNlbGVjdCBhIHByb3ZpZGVyIGluIG9yZGVyIHRvIGNoYW5nZSB0aGUgbWFwcGluZyB0eXBlIG9mIHRoZQorCSAqIG1hcHBpbmcgYmVpbmcgZWRpdGVkLgorCSAqLworCXByb3RlY3RlZCB2b2lkIG9wZW5NYXBwaW5nU2VsZWN0aW9uRGlhbG9nKCkgeworCisJCU1hcHBpbmdTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IE1hcHBpbmdTZWxlY3Rpb25EaWFsb2coKTsKKwkJU1dUVXRpbC5zaG93KGRpYWxvZywgYnVpbGRQb3N0RXhlY3V0aW9uKCkpOworCX0KKworCS8qKgorCSAqIFVwZGF0ZXMgdGhlIGRlc2NyaXB0aW9uIGJ5IHJlY3JlYXRpbmcgdGhlIGxhYmVsLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlc2NyaXB0aW9uKCkgeworCQlpZiAoZ2V0U3ViamVjdCgpID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCWNsZWFyU3R5bGVSYW5nZSgpOworCQl1cGRhdGVUZXh0KCk7CisKKwkJaWYgKGVuYWJsZWQpIHsKKwkJCXVwZGF0ZUxpbmtSYW5nZSgpOworCQl9CisJfQorCisJLyoqCisJICogVXBkYXRlcyB0aGUgY29sb3JzIG9mIHRoZSB0ZXh0OiAoMSkgdGhlIG5hbWUgaXMgc2hvd24gaW4gYm9sZCBhbmQgKDIpIHRoZQorCSAqIG1hcHBpbmcgdHlwZSBpcyBzaG93biBpbiBib2xkIGFuZCBpbiBoeXBlcmxpbmsgY29sb3IuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGlua1JhbmdlKCkgeworCisJCUNvbG9yIGxpbmtDb2xvciA9IEpGYWNlQ29sb3JzLmdldEh5cGVybGlua1RleHQoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkpOworCisJCS8vIE1ha2UgdGhlIG5hbWUgYm9sZAorCQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSgKKwkJCW5hbWVTdGFydCwgbmFtZUxlbmd0aCwKKwkJCW51bGwsIG51bGwsCisJCQlTV1QuQk9MRAorCQkpOworCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGVSYW5nZSk7CisKKwkJLy8gTWFrZSB0aGUgbWFwcGluZyB0eXBlIHNob3duIGFzIGEgaHlwZXJsaW5rCisJCWlmIChtYXBwaW5nVHlwZVN0YXJ0ID4gLTEpIHsKKwkJCXN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSgKKwkJCQltYXBwaW5nVHlwZVN0YXJ0LCBtYXBwaW5nVHlwZUxlbmd0aCwKKwkJCQlsaW5rQ29sb3IsIG51bGwKKwkJCSk7CisKKwkJCXN0eWxlUmFuZ2UudW5kZXJsaW5lICAgICAgPSB0cnVlOworCQkJc3R5bGVSYW5nZS51bmRlcmxpbmVDb2xvciA9IGxpbmtDb2xvcjsKKwkJCXN0eWxlUmFuZ2UudW5kZXJsaW5lU3R5bGUgPSBTV1QuVU5ERVJMSU5FX1NJTkdMRTsKKwkJCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZShzdHlsZVJhbmdlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFVwZGF0ZXMgdGhlIHN0eWxlcyB0ZXh0J3MgaW5wdXQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGV4dCgpIHsKKworCQlTdHJpbmcgbmFtZSA9IG1hcHBpbmdDaGFuZ2VIYW5kbGVyLmdldE5hbWUoKTsKKworCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQluYW1lID0gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTm9OYW1lU2V0OworCQl9CisKKwkJU3RyaW5nIG1hcHBpbmdUeXBlID0gbWFwcGluZ0NoYW5nZUhhbmRsZXIuZ2V0TWFwcGluZ1RleHQoKTsKKwkJU3RyaW5nIHRleHQgPSBidWlsZFRleHQobmFtZSwgbWFwcGluZ1R5cGUpOworCisJCW1hcHBpbmdUeXBlU3RhcnQgID0gdGV4dC5sYXN0SW5kZXhPZihtYXBwaW5nVHlwZSk7CisJCW1hcHBpbmdUeXBlTGVuZ3RoID0gbWFwcGluZ1R5cGUubGVuZ3RoKCk7CisKKwkJbmFtZVN0YXJ0ICA9IHRleHQuaW5kZXhPZihuYW1lKTsKKwkJbmFtZUxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7CisKKwkJc3R5bGVkVGV4dC5zZXRUZXh0KHRleHQpOworCX0KKworCS8qKgorCSAqIFRoaXMgaGFuZGxlciBpcyByZXNwb25zaWJsZSB0byBnaXZlIHRoZSB0ZXh0IGluZm9ybWF0aW9uIGFuZCB0byBvcGVuIHRoZQorCSAqIG1hcHBpbmcgZGlhbG9nIGlmIHRoZSB1c2VyIGNsaWNrZWQgb24gdGhlIG1hcHBpbmcgdHlwZS4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50ZXJmYWNlIE1hcHBpbmdDaGFuZ2VIYW5kbGVyIHsKKworCQkvKioKKwkJICogUmV0dXJucyB0aGUgZW50aXJlIHRleHQgZGVzY3JpYmluZyB0aGUgbWFwcGluZyAoZW50aXR5IG9yIG1hcHBpbmcpIGFuZAorCQkgKiBpdHMgdHlwZS4KKwkJICoKKwkJICogQHJldHVybiBBIGxvY2FsaXplZCB0ZXh0IHdpdGggdHdvIGFyZ3VtZW50cyB3aGVyZSB0aGUgZmlyc3Qgb25lIHNob3VsZAorCQkgKiBiZSByZXBsYWNlZCBieSB0aGUgbmFtZSBhbmQgdGhlIHNlY29uZCBiZSByZXBsYWNlZCBieSB0aGUgbWFwcGluZyB0eXBlCisJCSAqLworCQlTdHJpbmcgZ2V0TGFiZWxUZXh0KCk7CisKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIHRleHQgcmVwcmVzZW50aW5nIHRoZSBtYXBwaW5nIHR5cGUuCisJCSAqCisJCSAqIEByZXR1cm4gQSBodW1hbiByZWFkYWJsZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIG1hcHBpbmcgdHlwZQorCQkgKi8KKwkJU3RyaW5nIGdldE1hcHBpbmdUZXh0KCk7CisKKwkJLyoqCisJCSAqIE1vcnBoZXMgdGhlIGN1cnJlbnQgbWFwcGluZyBpbnRvIGEgbmV3IHR5cGUgYnkgdXNpbmcgdGhlIGdpdmVuIHByb3ZpZGVyLgorCQkgKgorCQkgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIGRlZmluaXRpb24gdGhhdCB3YXMgc2VsZWN0ZWQgZm9yIGNoYW5naW5nIHRoZSBtYXBwaW5nCisJCSAqLworCQl2b2lkIG1vcnBoTWFwcGluZyhNYXBwaW5nVWlEZWZpbml0aW9uPD8+IGRlZmluaXRpb24pOworCisJCS8qKgorCQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IG1hcHBpbmcuCisJCSAqCisJCSAqIEByZXR1cm4gVGhlIGRpc3BsYXlhYmxlIG5hbWUgb2YgdGhlIG1hcHBpbmcKKwkJICovCisJCVN0cmluZyBnZXROYW1lKCk7CisKKwkJLyoqCisJCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgbWFwcGluZyBVSSBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIEpQVCBwbHVnaW4uCisJCSAqCisJCSAqIEByZXR1cm4gVGhlIHN1cHBvcnRlZCB0eXBlcyBvZiBtYXBwaW5nCisJCSAqLworCQlJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjw/Pj4gbWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGRpYWxvZyBzaG93cyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBtYXBwaW5nIHR5cGVzIGFuZCBsZXRzIHRoZSB1c2VyCisJICogdGhlIG9wdGlvbiB0byBmaWx0ZXIgdGhlbSB1c2luZyBhIHNlYXJjaCBmaWVsZC4KKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgTWFwcGluZ1NlbGVjdGlvbkRpYWxvZyBleHRlbmRzIEZpbHRlcmVkSXRlbXNTZWxlY3Rpb25EaWFsb2cgeworCisJCXByaXZhdGUgTWFwcGluZ1VpRGVmaW5pdGlvbjw/PiBkZWZhdWx0RGVmaW5pdGlvbjsKKworCQkvKioKKwkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwaW5nU2VsZWN0aW9uRGlhbG9nPC9jb2RlPi4KKwkJICovCisJCXByaXZhdGUgTWFwcGluZ1NlbGVjdGlvbkRpYWxvZygpIHsKKwkJCXN1cGVyKE1hcEFzQ29tcG9zaXRlLnRoaXMuZ2V0U2hlbGwoKSwgZmFsc2UpOworCQkJc2V0TWVzc2FnZShKcHRVaURldGFpbHNNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV9sYWJlbFRleHQpOworCQkJc2V0VGl0bGUoSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfZGlhbG9nVGl0bGUpOworCQkJc2V0TGlzdExhYmVsUHJvdmlkZXIoYnVpbGRMYWJlbFByb3ZpZGVyKCkpOworCQkJc2V0RGV0YWlsc0xhYmVsUHJvdmlkZXIoYnVpbGRMYWJlbFByb3ZpZGVyKCkpOworCQl9CisKKwkJcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7CisJCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKworCQkJCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCisJCQkJCU1hcHBpbmdVaURlZmluaXRpb248Pz4gZGVmaW5pdGlvbiA9IChNYXBwaW5nVWlEZWZpbml0aW9uPD8+KSBlbGVtZW50OworCQkJCQlyZXR1cm4gZGVmaW5pdGlvbi5nZXRJbWFnZSgpOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCisJCQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKKwkJCQkJCXJldHVybiAiIjsKKwkJCQkJfQorCisJCQkJCU1hcHBpbmdVaURlZmluaXRpb248Pz4gZGVmaW5pdGlvbiA9IChNYXBwaW5nVWlEZWZpbml0aW9uPD8+KSBlbGVtZW50OworCQkJCQlyZXR1cm4gZGVmaW5pdGlvbi5nZXRMYWJlbCgpOworCQkJCX0KKwkJCX07CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRXh0ZW5kZWRDb250ZW50QXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgSXRlbXNGaWx0ZXIgY3JlYXRlRmlsdGVyKCkgeworCQkJcmV0dXJuIG5ldyBNYXBwaW5nVHlwZUl0ZW1zRmlsdGVyKCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRlbnRQcm92aWRlcihBYnN0cmFjdENvbnRlbnRQcm92aWRlciBwcm92aWRlciwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVtc0ZpbHRlciBpdGVtc0ZpbHRlciwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQkJbW9uaXRvci5iZWdpblRhc2sobnVsbCwgLTEpOworCisJCQl0cnkgeworCQkJCS8vIEFkZCB0aGUgZGVmYXVsdCBwcm92aWRlcgorCQkJCWRlZmF1bHREZWZpbml0aW9uID0gZ2V0RGVmYXVsdERlZmluaXRpb24oKTsKKworCQkJCWlmIChkZWZhdWx0RGVmaW5pdGlvbiAhPSBudWxsKSB7CisJCQkJCXByb3ZpZGVyLmFkZChkZWZhdWx0RGVmaW5pdGlvbiwgaXRlbXNGaWx0ZXIpOworCQkJCX0KKworCQkJCS8vIEFkZCB0aGUgcmVnaXN0ZXJlZCBtYXBwaW5nIHByb3ZpZGVycyB0byB0aGUgZGlhbG9nCisJCQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjw/Pj4gaXRlciA9IG1hcHBpbmdDaGFuZ2VIYW5kbGVyLm1hcHBpbmdVaURlZmluaXRpb25zKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKKwkJCQkJTWFwcGluZ1VpRGVmaW5pdGlvbjw/PiBtYXBwaW5nRGVmaW5pdGlvbiA9IGl0ZXIubmV4dCgpOworCQkJCQlwcm92aWRlci5hZGQobWFwcGluZ0RlZmluaXRpb24sIGl0ZW1zRmlsdGVyKTsKKwkJCQl9CisJCQl9CisJCQlmaW5hbGx5IHsKKwkJCQltb25pdG9yLmRvbmUoKTsKKwkJCX0KKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgeworCisJCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBKcHRVaVBsdWdpbi5pbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7CisJCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19TRVRUSU5HUyk7CisKKwkJCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7CisJCQkJc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncy5hZGROZXdTZWN0aW9uKERJQUxPR19TRVRUSU5HUyk7CisJCQl9CisKKwkJCXJldHVybiBzZXR0aW5nczsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKE9iamVjdCBvYmplY3QpIHsKKwkJCU1hcHBpbmdVaURlZmluaXRpb248Pz4gZGVmaW5pdGlvbiA9IChNYXBwaW5nVWlEZWZpbml0aW9uPD8+KSBvYmplY3Q7CisJCQlyZXR1cm4gZGVmaW5pdGlvbi5nZXRMYWJlbCgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBDb21wYXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248Pz4+IGdldEl0ZW1zQ29tcGFyYXRvcigpIHsKKwkJCXJldHVybiBuZXcgQ29tcGFyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPD8+PigpIHsKKwkJCQlwdWJsaWMgaW50IGNvbXBhcmUoTWFwcGluZ1VpRGVmaW5pdGlvbjw/PiBpdGVtMSwgTWFwcGluZ1VpRGVmaW5pdGlvbjw/PiBpdGVtMikgeworCisJCQkJCWlmIChpdGVtMSA9PSBkZWZhdWx0RGVmaW5pdGlvbikgeworCQkJCQkJcmV0dXJuIC0xOworCQkJCQl9CisKKwkJCQkJaWYgKGl0ZW0yID09IGRlZmF1bHREZWZpbml0aW9uKSB7CisJCQkJCQlyZXR1cm4gMTsKKwkJCQkJfQorCisJCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMSA9IGl0ZW0xLmdldExhYmVsKCk7CisJCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMiA9IGl0ZW0yLmdldExhYmVsKCk7CisJCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGlzcGxheVN0cmluZzEsIGRpc3BsYXlTdHJpbmcyKTsKKwkJCQl9CisJCQl9OworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlSXRlbShPYmplY3QgaXRlbSkgeworCisJCQlpZiAoaXRlbSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0VWlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiIiwgbnVsbCk7CisJCQl9CisKKwkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQl9CisKKwkJLyoqCisJCSAqIENyZWF0ZSB0aGUgZmlsdGVyIHJlc3BvbnNpYmxlIHRvIHJlbW92ZSBhbnkgbWFwcGluZyB0eXBlIGJhc2VkIG9uIHRoZQorCQkgKiBwYXR0ZXJuIGVudGVyZWQgaW4gdGhlIHRleHQgZmllbGQuCisJCSAqLworCQlwcml2YXRlIGNsYXNzIE1hcHBpbmdUeXBlSXRlbXNGaWx0ZXIgZXh0ZW5kcyBJdGVtc0ZpbHRlciB7CisKKwkJCS8qKgorCQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwaW5nVHlwZUl0ZW1zRmlsdGVyPC9jb2RlPi4KKwkJCSAqLworCQkJTWFwcGluZ1R5cGVJdGVtc0ZpbHRlcigpIHsKKworCQkJCXN1cGVyKCk7CisKKwkJCQkvLyBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgcGF0dGVybiBpcyBlbXB0eSwgd2Ugc3BlY2lmeSAqIGluIG9yZGVyCisJCQkJLy8gdG8gc2hvdyBhbGwgdGhlIG1hcHBpbmcgdHlwZXMKKwkJCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRQYXR0ZXJuKCkpKSB7CisJCQkJCXBhdHRlcm5NYXRjaGVyLnNldFBhdHRlcm4oIioiKTsKKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gaXNDb25zaXN0ZW50SXRlbShPYmplY3QgaXRlbSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIG1hdGNoSXRlbShPYmplY3QgaXRlbSkgeworCQkJCU1hcHBpbmdVaURlZmluaXRpb248Pz4gZGVmaW5pdGlvbiA9IChNYXBwaW5nVWlEZWZpbml0aW9uPD8+KSBpdGVtOworCQkJCXJldHVybiBtYXRjaGVzKGRlZmluaXRpb24uZ2V0TGFiZWwoKSk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2Y3ZTdjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOiAgCisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgbyBNYXBwZWQgYnkgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8CisgKiB8IHwgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tIHwgfAorICogfCB8ICBBdHRyaWJ1dGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgfEJyb3dzZS4ufCB8IHwKKyAqIHwgfCAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0gfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIHtAbGluayBPd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlfQorICogQHNlZSB7QGxpbmsgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3l9CisgKiBAc2VlIHtAbGluayBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9CisgKiBAc2VlIHtAbGluayBPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lfQorICogQHNlZSB7QGxpbmsgTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmV9CisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUgCisJZXh0ZW5kcyBBYnN0cmFjdEpvaW5pbmdTdHJhdGVneVBhbmU8T3duYWJsZVJlbGF0aW9uc2hpcFJlZmVyZW5jZSwgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBmb3JtIHBhbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZSgKKwkJCUZvcm1QYW5lPD8gZXh0ZW5kcyBPd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlPiBwYXJlbnRQYW5lLCAKKwkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXNlc1N0cmF0ZWd5SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPd25hYmxlUmVsYXRpb25zaGlwUmVmZXJlbmNlLCBCb29sZWFuPigKKwkJCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgUmVsYXRpb25zaGlwUmVmZXJlbmNlLlBSRURPTUlOQU5UX0pPSU5JTkdfU1RSQVRFR1lfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEJvb2xlYW4uRkFMU0UgOgorCQkJCQlCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LnVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZSA9PSBCb29sZWFuLlRSVUUpIHsKKwkJCQkJdGhpcy5zdWJqZWN0LnNldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQl0aGlzLnN1YmplY3QudW5zZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxNYXBwZWRCeUpvaW5pbmdTdHJhdGVneT4gYnVpbGRKb2luaW5nU3RyYXRlZ3lIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE93bmFibGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5PigKKwkJCQlnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJhdGVneUxhYmVsS2V5KCkgeworCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19tYXBwZWRCeUxhYmVsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkU3RyYXRlZ3lEZXRhaWxzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBNYXBwZWRCeVBhbmUodGhpcywgdGhpcy5qb2luaW5nU3RyYXRlZ3lIb2xkZXIsIHBhcmVudCkuZ2V0Q29udHJvbCgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFwcGVkQnlQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hcHBlZEJ5UGFuZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYTUzMmQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL01hcHBlZEJ5UGFuZS5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgTWFwcGVkIEJ5OiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIE5vbk93bmluZ01hcHBpbmcKKyAqIEBzZWUgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKKyAqIEBzZWUgT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICogQHNlZSBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIE1hcHBlZEJ5UGFuZSAKKwlleHRlbmRzIEZvcm1QYW5lPE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5PgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGVkQnlQYW5lPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgZm9ybSBwYW5lCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIFBWTSBmb3IgdGhlIHtAbGluayBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneX0KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIE1hcHBlZEJ5UGFuZSgKKwkJCUZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3k+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfbWFwcGVkQnlBdHRyaWJ1dGVMYWJlbCwKKwkJCWJ1aWxkQ2FuZGlkYXRlQXR0cmlidXRlc0xpc3RWYWx1ZU1vZGVsKCksCisJCQlidWlsZEF0dHJpYnV0ZVByb3BlcnR5VmFsdWVNb2RlbCgpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19NQVBQRURfQlkpOworCX0KKwkKKwlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENhbmRpZGF0ZUF0dHJpYnV0ZXNMaXN0VmFsdWVNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKKwkJCW5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSwgU3RyaW5nPigKKwkJCQkJZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3JfKCkgeworCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkJCQl9CisJCQl9KTsKKwl9CisJCisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRBdHRyaWJ1dGVQcm9wZXJ0eVZhbHVlTW9kZWwoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5LCBTdHJpbmc+KAorCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kuTUFQUEVEX0JZX0FUVFJJQlVURV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldE1hcHBlZEJ5QXR0cmlidXRlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9NYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGMzMjQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTWFwcGVkU3VwZXJjbGFzc1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5UeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgTWFwcGVkU3VwZXJjbGFzc1VpUHJvdmlkZXIgaW1wbGVtZW50cyBUeXBlTWFwcGluZ1VpUHJvdmlkZXI8TWFwcGVkU3VwZXJjbGFzcz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBNYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBUeXBlTWFwcGluZ1VpUHJvdmlkZXI8TWFwcGVkU3VwZXJjbGFzcz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50VHlwZVBhZ2VfTWFwcGVkU3VwZXJjbGFzc0xhYmVsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvclR5cGVNYXBwaW5nKGdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZTxNYXBwZWRTdXBlcmNsYXNzPiBidWlsZFBlcnNpc3RlbnRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5ODk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8CisgKiB8IFJlc3VsdCBDbGFzczogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQnJvd3NlLi4uIHwgfAorICogfCAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICB8CisgKiB8IFF1ZXJ5OiAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IC0gUXVlcnkgSGludHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgfCBRdWVyeUhpbnRzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIE5hbWVkTmF0aXZlUXVlcnkKKyAqIEBzZWUgTmFtZWROYXRpdmVRdWVyaWVzQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqIEBzZWUgQ2xhc3NDaG9vc2VyUGFuZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlIGV4dGVuZHMgUGFuZTxOYW1lZE5hdGl2ZVF1ZXJ5PgoreworCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxOYW1lZE5hdGl2ZVF1ZXJ5PiByZXN1bHRDbGFzc0Nob29zZXJQYW5lOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIE5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE5hbWVkTmF0aXZlUXVlcnk+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisKKwlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8TmFtZWROYXRpdmVRdWVyeT4gYWRkQ2xhc3NDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8TmFtZWROYXRpdmVRdWVyeT4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE5hbWVkTmF0aXZlUXVlcnksIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBOYW1lZE5hdGl2ZVF1ZXJ5LlJFU1VMVF9DTEFTU19QUk9QRVJUWSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UmVzdWx0Q2xhc3MoKTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJCQl0aGlzLnN1YmplY3Quc2V0UmVzdWx0Q2xhc3ModmFsdWUpOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFJlc3VsdENsYXNzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9yZXN1bHRDbGFzczsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisJCQkJZ2V0U3ViamVjdCgpLnNldFJlc3VsdENsYXNzKGNsYXNzTmFtZSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFJlc3VsdENsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFF1ZXJ5SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxOYW1lZE5hdGl2ZVF1ZXJ5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgUXVlcnkuUVVFUllfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFF1ZXJ5KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRRdWVyeSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKKwkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKKwkJdGhpcy5yZXN1bHRDbGFzc0Nob29zZXJQYW5lLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCQorCQlhZGRMYWJlbGVkVGV4dCgKKwkJCWNvbnRhaW5lciwgCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5OYW1lZFF1ZXJ5Q29tcG9zaXRlX25hbWVUZXh0TGFiZWwsIAorCQkJYnVpbGROYW1lVGV4dEhvbGRlcigpKTsKKworCQkvLyBSZXN1bHQgY2xhc3MgY2hvb3NlcgorCQl0aGlzLnJlc3VsdENsYXNzQ2hvb3NlclBhbmUgPSBhZGRDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKKworCQkvLyBRdWVyeSB0ZXh0IGFyZWEKKwkJYWRkTGFiZWxlZE11bHRpTGluZVRleHQoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnksCisJCQlidWlsZFF1ZXJ5SG9sZGVyKCksCisJCQk0LAorCQkJbnVsbAorCQkpOworCisJCS8vIFF1ZXJ5IEhpbnRzIHBhbmUKKwkJY29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCisJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnlIaW50c0dyb3VwQm94CisJCSk7CisKKwkJbmV3IFF1ZXJ5SGludHNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisJCisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lVGV4dEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TmFtZWROYXRpdmVRdWVyeSwgU3RyaW5nPigKKwkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIFF1ZXJ5Lk5BTUVfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKKwkJCX0KKwkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgeworCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJfQorCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3YTI2YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgUXVlcnk6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAtIFF1ZXJ5IEhpbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IHwgUXVlcnlIaW50c0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBOYW1lZFF1ZXJ5CisgKiBAc2VlIE5hbWVkUXVlcmllc0NvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCisgKiBAc2VlIFF1ZXJ5SGludHNDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8TmFtZWRRdWVyeT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTmFtZWRRdWVyeT4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFF1ZXJ5SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxOYW1lZFF1ZXJ5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgUXVlcnkuUVVFUllfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFF1ZXJ5KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRRdWVyeSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCQorCQlhZGRMYWJlbGVkVGV4dCgKKwkJCWNvbnRhaW5lciwgCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5OYW1lZFF1ZXJ5Q29tcG9zaXRlX25hbWVUZXh0TGFiZWwsIAorCQkJYnVpbGROYW1lVGV4dEhvbGRlcigpKTsKKworCQkvLyBRdWVyeSB0ZXh0IGFyZWEKKwkJYWRkTGFiZWxlZE11bHRpTGluZVRleHQoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnksCisJCQlidWlsZFF1ZXJ5SG9sZGVyKCksCisJCQk0LAorCQkJbnVsbAorCQkpOworCisJCS8vIFF1ZXJ5IEhpbnRzIHBhbmUKKwkJY29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCisJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnlIaW50c0dyb3VwQm94CisJCSk7CisKKwkJbmV3IFF1ZXJ5SGludHNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisJCQorCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZVRleHRIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE5hbWVkUXVlcnksIFN0cmluZz4oCisJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBRdWVyeS5OQU1FX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7CisJCQl9CisJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKwkJCQkJdmFsdWUgPSBudWxsOworCQkJCX0KKwkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9PbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3MzIyYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55UmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CisKKy8qKgorICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZTogIAorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0gSm9pbmluZyBTdHJhdGVneSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBvIE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IHwgbyBKb2luVGFibGVTdHJhdGVneVBhbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSB7QGxpbmsgT25lVG9NYW55TWFwcGluZ30KKyAqIEBzZWUge0BsaW5rIE9uZVRvTWFueVJlbGF0aW9uc2hpcFJlZmVyZW5jZX0KKyAqIEBzZWUge0BsaW5rIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBNYXBwZWRCeVN0cmF0ZWd5UGFuZX0KKyAqIEBzZWUge0BsaW5rIEpvaW5UYWJsZVN0cmF0ZWd5UGFuZX0KKyAqCisgKiBAdmVyc2lvbiAyLjEKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGNsYXNzIE9uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUgCisJZXh0ZW5kcyBGb3JtUGFuZTxPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U+Cit7CisJcHVibGljIE9uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUoCisJCQlGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLCAKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPbmVUb01hbnlSZWxhdGlvbnNoaXBSZWZlcmVuY2U+IHN1YmplY3RIb2xkZXIsIAorCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJLy8gam9pbmluZyBzdHJhdGVneSBncm91cCBwYW5lCisJCUdyb3VwIGdyb3VwUGFuZSA9IGFkZFRpdGxlZEdyb3VwKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ190aXRsZQorCQkpOworCQkKKwkJbmV3IE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBncm91cFBhbmUpOworCQkKKwkJbmV3IEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgZ3JvdXBQYW5lKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMWU0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9yZGVyaW5nQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIE9uZVRvTWFueU1hcHBpbmcKKyAqIEBzZWUgQ2FzY2FkZUNvbXBvc2l0ZQorICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKKyAqIEBzZWUgSm9pblRhYmxlQ29tcG9zaXRlCisgKiBAc2VlIE9yZGVyaW5nQ29tcG9zaXRlCisgKiBAc2VlIFRhcmdldEVudGl0eUNvbXBvc2l0ZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAKKwlleHRlbmRzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxPbmVUb01hbnlNYXBwaW5nPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklPbmVUb01hbnlNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7CisKKwkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IE9uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOworCQluZXcgT3JkZXJpbmdDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxN2ZlNmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9PbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxPbmVUb01hbnlNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IE9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPE9uZVRvTWFueU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9PbmVUb01hbnlMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZTxPbmVUb01hbnlNYXBwaW5nPiBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCUpwYVVpRmFjdG9yeSBmYWN0b3J5LAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NmYwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOworCisvKioKKyAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6ICAKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtIEpvaW5pbmcgU3RyYXRlZ3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgbyBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCB8IG8gSm9pbkNvbHVtblN0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgfCBvIFByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3lQYW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIHtAbGluayBPbmVUb09uZU1hcHBpbmd9CisgKiBAc2VlIHtAbGluayBPbmVUb09uZVJlbGF0aW9uc2hpcFJlZmVyZW5jZX0KKyAqIEBzZWUge0BsaW5rIE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIE1hcHBlZEJ5U3RyYXRlZ3lQYW5lfQorICogQHNlZSB7QGxpbmsgSm9pbkNvbHVtblN0cmF0ZWd5UGFuZX0KKyAqIEBzZWUge0BsaW5rIFByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3lQYW5lfQorICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lIAorCWV4dGVuZHMgRm9ybVBhbmU8T25lVG9PbmVSZWxhdGlvbnNoaXBSZWZlcmVuY2U+Cit7CisJcHVibGljIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZSgKKwkJCUZvcm1QYW5lPD8+IHBhcmVudFBhbmUsIAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9uZVRvT25lUmVsYXRpb25zaGlwUmVmZXJlbmNlPiBzdWJqZWN0SG9sZGVyLCAKKwkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCS8vIGpvaW5pbmcgc3RyYXRlZ3kgZ3JvdXAgcGFuZQorCQlHcm91cCBncm91cFBhbmUgPSBhZGRUaXRsZWRHcm91cCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfdGl0bGUKKwkJKTsKKwkJCisJCW5ldyBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgZ3JvdXBQYW5lKTsKKwkJCisJCW5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgZ3JvdXBQYW5lKTsKKwkJCisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lLgorCQkJYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZVdpdGhJbmNsdWRlT3ZlcnJpZGVDaGVja0JveCgKKwkJCQl0aGlzLCAKKwkJCQlncm91cFBhbmUpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZThhM2MKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBPbmVUb09uZU1hcHBpbmcKKyAqIEBzZWUgVGFyZ2V0RW50aXR5Q29tcG9zaXRlCisgKiBAc2VlIEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZQorICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKKyAqIEBzZWUgT3B0aW9uYWxDb21wb3NpdGUKKyAqIEBzZWUgQ2FzY2FkZUNvbXBvc2l0ZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIAorCWV4dGVuZHMgQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU8T25lVG9PbmVNYXBwaW5nPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU9uZVRvT25lTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7CisJCQorCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKKwl9CQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9PbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkwNGEzZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPE9uZVRvT25lTWFwcGluZz4KLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxPbmVUb09uZU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfT25lVG9PbmVMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZTxPbmVUb09uZU1hcHBpbmc+IGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09wdGlvbmFsQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09wdGlvbmFsQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJmNzhkYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT3B0aW9uYWxDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OdWxsYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIGNvbXBvc2l0ZSBzaW1wbHkgc2hvd3MgYSB0cmktc3RhdGUgY2hlY2sgYm94IGZvciB0aGUgT3B0aW9uYWwgb3B0aW9uLgorICoKKyAqIEBzZWUgQmFzaWNNYXBwaW5nCisgKiBAc2VlIEJhc2ljTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICogQHNlZSBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCisgKiBAc2VlIE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICoKKyAqIEB2ZXJzaW9uIDEuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgT3B0aW9uYWxDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxOdWxsYWJsZT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9wdGlvbmFsQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBPcHRpb25hbENvbXBvc2l0ZShGb3JtUGFuZTw/IGV4dGVuZHMgTnVsbGFibGU+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCisJeworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKKwkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA0KSwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkJhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbCwKKwkJCWJ1aWxkT3B0aW9uYWxIb2xkZXIoKSwKKwkJCWJ1aWxkT3B0aW9uYWxTdHJpbmdIb2xkZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1BUSU9OQUwKKwkJKTsKKwl9CisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE9wdGlvbmFsSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxOdWxsYWJsZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBOdWxsYWJsZS5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRPcHRpb25hbCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZE9wdGlvbmFsKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkT3B0aW9uYWxTdHJpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRPcHRpb25hbEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKwkJCQl9CisJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbDsKKwkJCX0KKwkJfTsKKwl9CisJCisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0T3B0aW9uYWxIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE51bGxhYmxlLCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCU51bGxhYmxlLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwKKwkJCU51bGxhYmxlLkRFRkFVTFRfT1BUSU9OQUxfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRPcHRpb25hbCgpICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdE9wdGlvbmFsKCkpOworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09yZGVyaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL09yZGVyaW5nQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyODg0ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvT3JkZXJpbmdDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDIzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0gT3JkZXIgQnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBvIE5vIE9yZGVyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IG8gUHJpbWFyeSBLZXkgT3JkZXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgbyBDdXN0b20gT3JkZXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgfCAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKKyAqIEBzZWUgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKKyAqIEBzZWUgT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBPcmRlcmluZ0NvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPE11bHRpUmVsYXRpb25zaGlwTWFwcGluZz4KK3sKKwlwcml2YXRlIFRleHQgY3VzdG9tT3JkZXJpbmdUZXh0OworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcmRlcmluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgT3JkZXJpbmdDb21wb3NpdGUoRm9ybVBhbmU8PyBleHRlbmRzIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcmRlcmluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgT3JkZXJpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQlwcm9wZXJ0eU5hbWVzLmFkZChNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuU1BFQ0lGSUVEX09SREVSX0JZX1BST1BFUlRZKTsKKwl9CisKKwlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGJ1aWxkQ3VzdG9tVGV4dE1vZGlmeUxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJaWYgKCFpc1BvcHVsYXRpbmcoKSkgeworCQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgZS53aWRnZXQ7CisJCQkJCXZhbHVlQ2hhbmdlZCh0ZXh0LmdldFRleHQoKSk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7CisJCXN1cGVyLmRvUG9wdWxhdGUoKTsKKwkJcG9wdWxhdGVDdXN0b21PcmRlcmluZygpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCS8vIE9yZGVyIEJ5IGdyb3VwCisJCUdyb3VwIG9yZGVyQnlHcm91cCA9IGFkZFRpdGxlZEdyb3VwKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuT3JkZXJCeUNvbXBvc2l0ZV9vcmRlckJ5R3JvdXAsCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZKTsKKworCQkvLyBObyBPcmRlcmluZyByYWRpbyBidXR0b24KKwkJYWRkUmFkaW9CdXR0b24oCisJCQlhZGRTdWJQYW5lKG9yZGVyQnlHcm91cCwgOCksCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5PcmRlckJ5Q29tcG9zaXRlX25vT3JkZXJpbmcsCisJCQlidWlsZE5vT3JkZXJpbmdIb2xkZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQllfTk9fT1JERVJJTkcKKwkJKTsKKworCQkvLyBPcmRlciBieSBQcmltYXJ5IEtleSByYWRpbyBidXR0b24KKwkJYWRkUmFkaW9CdXR0b24oCisJCQlvcmRlckJ5R3JvdXAsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5PcmRlckJ5Q29tcG9zaXRlX3ByaW1hcnlLZXlPcmRlcmluZywKKwkJCWJ1aWxkUHJpbWFyeUtleU9yZGVyaW5nSG9sZGVyKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZX1BSSU1BUllfS0VZX09SREVSSU5HCisJCSk7CisKKwkJLy8gQ3VzdG9tIE9yZGVyaW5nIHJhZGlvIGJ1dHRvbgorCQlhZGRSYWRpb0J1dHRvbigKKwkJCW9yZGVyQnlHcm91cCwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk9yZGVyQnlDb21wb3NpdGVfY3VzdG9tT3JkZXJpbmcsCisJCQlidWlsZEN1c3RvbU9yZGVyaW5nSG9sZGVyKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZX0NVU1RPTV9PUkRFUklORworCQkpOworCisJCS8vIEN1c3RvbSBPcmRlcmluZyB0ZXh0IGZpZWxkCisJCWN1c3RvbU9yZGVyaW5nVGV4dCA9IGFkZFVubWFuYWdlZFRleHQoCisJCQlhZGRTdWJQYW5lKG9yZGVyQnlHcm91cCwgMCwgMTYpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUkRFUl9CWQorCQkpOworCisJCWN1c3RvbU9yZGVyaW5nVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihidWlsZEN1c3RvbVRleHRNb2RpZnlMaXN0ZW5lcigpKTsKKwkJaW5zdGFsbEN1c3RvbVRleHRFbmFibGVyKGN1c3RvbU9yZGVyaW5nVGV4dCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluc3RhbGxDdXN0b21UZXh0RW5hYmxlcihUZXh0IHRleHQpIHsKKwkJU1dUVG9vbHMuY29udHJvbEVuYWJsZWRTdGF0ZShidWlsZEN1c3RvbU9yZGVyaW5nSG9sZGVyKCksIHRleHQpOworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDdXN0b21PcmRlcmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5DVVNUT01fT1JERVJJTkdfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihzdWJqZWN0LmlzQ3VzdG9tT3JkZXJpbmcoKSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlzdWJqZWN0LnNldEN1c3RvbU9yZGVyaW5nKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTm9PcmRlcmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5OT19PUkRFUklOR19QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHN1YmplY3QuaXNOb09yZGVyaW5nKCkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJc3ViamVjdC5zZXROb09yZGVyaW5nKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUHJpbWFyeUtleU9yZGVyaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLlBLX09SREVSSU5HX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2Yoc3ViamVjdC5pc1BrT3JkZXJpbmcoKSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlzdWJqZWN0LnNldFBrT3JkZXJpbmcodmFsdWUuYm9vbGVhblZhbHVlKCkpOworCQkJfQorCQl9OworCX0KKwlwcml2YXRlIHZvaWQgcG9wdWxhdGVDdXN0b21PcmRlcmluZygpIHsKKworCQlpZiAoKGdldFN1YmplY3QoKSAhPSBudWxsKSAmJiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpICE9IG51bGwpIHsKKwkJCWN1c3RvbU9yZGVyaW5nVGV4dC5zZXRUZXh0KGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOworCQl9CisJCWVsc2UgIHsKKwkJCWN1c3RvbU9yZGVyaW5nVGV4dC5zZXRUZXh0KCIiKTsKKwkJfQorCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOworCisJCWlmIChwcm9wZXJ0eU5hbWUgPT0gTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLlNQRUNJRklFRF9PUkRFUl9CWV9QUk9QRVJUWSkgeworCQkJcG9wdWxhdGVDdXN0b21PcmRlcmluZygpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHZhbHVlQ2hhbmdlZChTdHJpbmcgdmFsdWUpIHsKKworCQlzZXRQb3B1bGF0aW5nKHRydWUpOworCisJCXRyeSB7CisJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkT3JkZXJCeSh2YWx1ZSk7CisJCX0KKwkJZmluYWxseSB7CisJCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YQppbmRleCAxZGFkYjMxLi5mNGI5NTNjIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwyNSArOSwyNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CiAKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLlRyYWNpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKIAogLyoqCkBAIC0zNiwxNjAgKzM1LDY3IEBACiAgKgogICogQHNlZSBQZXJzaXN0ZW50QXR0cmlidXRlCiAgKgotICogQHZlcnNpb24gMi4wCisgKiBAdmVyc2lvbiAyLjIKICAqIEBzaW5jZSAxLjAKICAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlPFQgZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlPiBleHRlbmRzIEFic3RyYWN0SnBhRGV0YWlsc1BhZ2U8VD4KIHsKLQlwcml2YXRlIEpwYUNvbXBvc2l0ZTxBdHRyaWJ1dGVNYXBwaW5nPiBjdXJyZW50TWFwcGluZ0NvbXBvc2l0ZTsKLQlwcml2YXRlIFN0cmluZyBjdXJyZW50TWFwcGluZ0tleTsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIEpwYUNvbXBvc2l0ZTxBdHRyaWJ1dGVNYXBwaW5nPj4gbWFwcGluZ0NvbXBvc2l0ZXM7CisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBKcGFDb21wb3NpdGU+IG1hcHBpbmdDb21wb3NpdGVzOwogCXByaXZhdGUgUGFnZUJvb2sgbWFwcGluZ1BhZ2VCb29rOwogCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlTWFwcGluZz4gbWFwcGluZ0hvbGRlcjsKKwkKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZTwvY29kZT4uCiAJICoKIAkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCiAJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwogCSAqLwotCXByb3RlY3RlZCBQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KKwlwcm90ZWN0ZWQgUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlKAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQkKIAkJc3VwZXIocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKIAl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KKwkKKwkKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbnRBdHRyaWJ1dGUuREVGQVVMVF9NQVBQSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVudEF0dHJpYnV0ZS5TUEVDSUZJRURfTUFQUElOR19QUk9QRVJUWSk7Ci0JfQotCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcihTdHJpbmcga2V5KSB7Ci0JCWZvciAoSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBpID0gYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBwcm92aWRlciA9IGkubmV4dCgpOwotCQkJaWYgKHByb3ZpZGVyLmdldE1hcHBpbmdLZXkoKSA9PSBrZXkpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgYXR0cmlidXRlIG1hcHBpbmcgVUkgcHJvdmlkZXIga2V5OiAiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PgotCQlhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXQotCQlhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnNGb3IoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQotCXByaXZhdGUgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIEF0dHJpYnV0ZU1hcHBpbmc+IGJ1aWxkR2VuZXJpY01hcHBpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIEF0dHJpYnV0ZU1hcHBpbmc+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZS5ERUZBVUxUX01BUFBJTkdfUFJPUEVSVFksCi0JCQlQZXJzaXN0ZW50QXR0cmlidXRlLlNQRUNJRklFRF9NQVBQSU5HX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldE1hcHBpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSnBhQ29tcG9zaXRlPEF0dHJpYnV0ZU1hcHBpbmc+IGJ1aWxkTWFwcGluZ0NvbXBvc2l0ZShQYWdlQm9vayBwYWdlQm9vaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWFwcGluZ0tleSkgewotCi0JCUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPEF0dHJpYnV0ZU1hcHBpbmc+IHVpUHJvdmlkZXIgPQotCQkJKEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPEF0dHJpYnV0ZU1hcHBpbmc+KSBtYXBwaW5nVUlQcm92aWRlcihtYXBwaW5nS2V5KTsKLQotCQlyZXR1cm4gdWlQcm92aWRlci5idWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlqcGFVaUZhY3RvcnkoKSwKLQkJCWJ1aWxkTWFwcGluZ0hvbGRlcihtYXBwaW5nS2V5KSwKLQkJCXBhZ2VCb29rLAotCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXI8QXR0cmlidXRlTWFwcGluZz4gYnVpbGRNYXBwaW5nRmlsdGVyKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCXJldHVybiBuZXcgTWFwcGluZ0ZpbHRlcihtYXBwaW5nS2V5KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVNYXBwaW5nPiBidWlsZE1hcHBpbmdIb2xkZXIoZmluYWwgU3RyaW5nIGtleSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVNYXBwaW5nPigKLQkJCWJ1aWxkR2VuZXJpY01hcHBpbmdIb2xkZXIoKSwKLQkJCWJ1aWxkTWFwcGluZ0ZpbHRlcihrZXkpCi0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGJ1aWxkTWFwcGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGJ1aWxkTGFiZWwocGFyZW50LCBKcHRVaU1lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX21hcEFzKTsKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisJCXRoaXMubWFwcGluZ0NvbXBvc2l0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpwYUNvbXBvc2l0ZT4oKTsKIAl9CiAKIAlwcm90ZWN0ZWQgUGFnZUJvb2sgYnVpbGRNYXBwaW5nUGFnZUJvb2soQ29tcG9zaXRlIHBhcmVudCkgewogCQl0aGlzLm1hcHBpbmdQYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy5tYXBwaW5nUGFnZUJvb2suc2hvd1BhZ2UodGhpcy5idWlsZExhYmVsKHRoaXMubWFwcGluZ1BhZ2VCb29rLCAiIikpOworCQl0aGlzLm1hcHBpbmdQYWdlQm9vay5zaG93UGFnZSh0aGlzLmFkZExhYmVsKHRoaXMubWFwcGluZ1BhZ2VCb29rLCAiIikpOyAvLyROT04tTkxTLTEkCisKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IFNXVC5GSUxMOworCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCAgICAgICAgID0gU1dULlRPUDsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlICAgPSB0cnVlOworCisJCXRoaXMubWFwcGluZ1BhZ2VCb29rLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCQkKKwkJdGhpcy5tYXBwaW5nSG9sZGVyID0gdGhpcy5idWlsZE1hcHBpbmdIb2xkZXIoKTsKKwkJbmV3IENvbnRyb2xTd2l0Y2hlcih0aGlzLm1hcHBpbmdIb2xkZXIsIHRoaXMuYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSwgdGhpcy5tYXBwaW5nUGFnZUJvb2spOworCiAJCXJldHVybiB0aGlzLm1hcHBpbmdQYWdlQm9vazsKIAl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+Ci0JCWRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcihTdHJpbmcga2V5KTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+Ci0JCWRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvRGlzcG9zZSgpIHsKLQkJbG9nKFRyYWNpbmcuVUlfREVUQUlMU19WSUVXLCAiUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmRvRGlzcG9zZSgpIik7Ci0KLQkJaWYgKHRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJdGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCQl0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlID0gbnVsbDsKLQkJfQotCi0JCXRoaXMubWFwcGluZ0NvbXBvc2l0ZXMuY2xlYXIoKTsKLQkJc3VwZXIuZG9EaXNwb3NlKCk7CisJCisJcHJpdmF0ZSBUcmFuc2Zvcm1lcjxBdHRyaWJ1dGVNYXBwaW5nLCBDb250cm9sPiBidWlsZFBhbmVUcmFuc2Zvcm1lcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxBdHRyaWJ1dGVNYXBwaW5nLCBDb250cm9sPigpIHsKKwkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcpIHsKKwkJCQlpZiAoYXR0cmlidXRlTWFwcGluZyA9PSBudWxsKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gZ2V0TWFwcGluZ0NvbXBvc2l0ZShhdHRyaWJ1dGVNYXBwaW5nLmdldEtleSgpKS5nZXRDb250cm9sKCk7CisJCQl9CisJCX07CiAJfQogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCQl1cGRhdGVNYXBwaW5nUGFnZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5tYXBwaW5nQ29tcG9zaXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSnBhQ29tcG9zaXRlPEF0dHJpYnV0ZU1hcHBpbmc+PigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgZmxhZywgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIubG9nKGZsYWcsIG1lc3NhZ2UpOwotCi0JCWlmIChUcmFjaW5nLlVJX0RFVEFJTFNfVklFVy5lcXVhbHMoZmxhZykgJiYKLQkJICAgIFRyYWNpbmcuYm9vbGVhbkRlYnVnT3B0aW9uKFRyYWNpbmcuVUlfREVUQUlMU19WSUVXKSkKLQkJewotCQkJVHJhY2luZy5sb2cobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEpwYUNvbXBvc2l0ZTxBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nQ29tcG9zaXRlRm9yKFN0cmluZyBrZXkpIHsKLQkJSnBhQ29tcG9zaXRlPEF0dHJpYnV0ZU1hcHBpbmc+IGNvbXBvc2l0ZSA9IHRoaXMubWFwcGluZ0NvbXBvc2l0ZXMuZ2V0KGtleSk7CisJcHJvdGVjdGVkIEpwYUNvbXBvc2l0ZSBnZXRNYXBwaW5nQ29tcG9zaXRlKFN0cmluZyBrZXkpIHsKKwkJSnBhQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRoaXMubWFwcGluZ0NvbXBvc2l0ZXMuZ2V0KGtleSk7CiAJCWlmIChjb21wb3NpdGUgIT0gbnVsbCkgewogCQkJcmV0dXJuIGNvbXBvc2l0ZTsKIAkJfQpAQCAtMjAyLDEyMCArMTA4LDYxIEBACiAKIAkJcmV0dXJuIGNvbXBvc2l0ZTsKIAl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtYXBwaW5nUGFnZUNoYW5nZWQoSnBhQ29tcG9zaXRlPEF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdDb21wb3NpdGUpIHsKKwkKKwlwcm90ZWN0ZWQgSnBhQ29tcG9zaXRlIGJ1aWxkTWFwcGluZ0NvbXBvc2l0ZShQYWdlQm9vayBwYWdlQm9vaywgU3RyaW5nIGtleSkgeworCQlyZXR1cm4gZ2V0SnBhUGxhdGZvcm1VaSgpLmJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCQlnZXRTdWJqZWN0KCkuZ2V0UmVzb3VyY2VUeXBlKCksCisJCQkJa2V5LAorCQkJCXBhZ2VCb29rLAorCQkJCWJ1aWxkTWFwcGluZ0hvbGRlcihrZXkpLAorCQkJCWdldFdpZGdldEZhY3RvcnkoKSk7CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU1hcHBpbmc+IGJ1aWxkTWFwcGluZ0hvbGRlcihmaW5hbCBTdHJpbmcga2V5KSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU1hcHBpbmc+KAorCQkJdGhpcy5tYXBwaW5nSG9sZGVyLAorCQkJYnVpbGRNYXBwaW5nRmlsdGVyKGtleSkKKwkJKTsKIAl9CiAKLQlwcml2YXRlIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nVUlQcm92aWRlcihTdHJpbmcga2V5KSB7Ci0KLQkJaWYgKHRoaXMuc3ViamVjdCgpLmdldE1hcHBpbmcoKSA9PSBudWxsIHx8Ci0JCSAgICB0aGlzLnN1YmplY3QoKS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpIHsKLQotCQkJcmV0dXJuIGRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcihrZXkpOwotCQl9Ci0KLQkJcmV0dXJuIGF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyKGtleSk7CisJcHJpdmF0ZSBGaWx0ZXI8QXR0cmlidXRlTWFwcGluZz4gYnVpbGRNYXBwaW5nRmlsdGVyKFN0cmluZyBtYXBwaW5nS2V5KSB7CisJCXJldHVybiBuZXcgTWFwcGluZ0ZpbHRlcihtYXBwaW5nS2V5KTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVNYXBwaW5nUGFnZShTdHJpbmcgbWFwcGluZ0tleSkgewogCi0JCS8vIE5vdGhpbmcgdG8gdXBkYXRlCi0JCWlmICh0aGlzLmN1cnJlbnRNYXBwaW5nS2V5ID09IG1hcHBpbmdLZXkpIHsKLQkJCXRoaXMubWFwcGluZ1BhZ2VDaGFuZ2VkKHRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIERpc3Bvc2UgdGhlIGV4aXN0aW5nIG1hcHBpbmcgcGFuZQotCQllbHNlIGlmICh0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCXRoaXMubG9nKAotCQkJCVRyYWNpbmcuVUlfREVUQUlMU19WSUVXLAotCQkJCSJQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UucG9wdWxhdGVNYXBwaW5nUGFnZSgpIGRpc3Bvc2luZyBvZiBjdXJyZW50IHBhZ2U6ICIgKyB0aGlzLmN1cnJlbnRNYXBwaW5nS2V5Ci0JCQkpOwotCi0JCQl0cnkgewotCQkJCXRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUuZGlzcG9zZSgpOwotCQkJCXRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUgPSBudWxsOworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlTWFwcGluZz4gYnVpbGRNYXBwaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBBdHRyaWJ1dGVNYXBwaW5nPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCVBlcnNpc3RlbnRBdHRyaWJ1dGUuREVGQVVMVF9NQVBQSU5HX1BST1BFUlRZLAorCQkJUGVyc2lzdGVudEF0dHJpYnV0ZS5TUEVDSUZJRURfTUFQUElOR19QUk9QRVJUWSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQXR0cmlidXRlTWFwcGluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE1hcHBpbmcoKTsKIAkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuY3VycmVudE1hcHBpbmdLZXkgPSBtYXBwaW5nS2V5OwotCi0JCS8vIENoYW5nZSB0aGUgY3VycmVudCBtYXBwaW5nIHBhbmUgd2l0aCB0aGUgbmV3IG9uZQotCQlpZiAodGhpcy5jdXJyZW50TWFwcGluZ0tleSAhPSBudWxsKSB7Ci0JCQl0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlID0gbWFwcGluZ0NvbXBvc2l0ZUZvcihtYXBwaW5nS2V5KTsKLQotCQkJdHJ5IHsKLQkJCQl0aGlzLmxvZygKLQkJCQkJVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsCi0JCQkJCSJQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UucG9wdWxhdGVNYXBwaW5nUGFnZSgpIHBvcHVsYXRpbmcgbmV3IHBhZ2U6ICIgKyB0aGlzLmN1cnJlbnRNYXBwaW5nS2V5Ci0JCQkJKTsKLQotCQkJCXRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUucG9wdWxhdGUoKTsKLQkJCQl0aGlzLm1hcHBpbmdQYWdlQm9vay5zaG93UGFnZSh0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlLmdldENvbnRyb2woKSk7Ci0JCQkJdGhpcy5tYXBwaW5nUGFnZUNoYW5nZWQodGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0KLQkJCQl0aGlzLmxvZygKLQkJCQkJVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsCi0JCQkJCSJQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UucG9wdWxhdGVNYXBwaW5nUGFnZSgpIGVycm9yIGVuY291bnRlcmVkIgotCQkJCSk7Ci0KLQkJCQkvLyBBbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgZWl0aGVyIGR1cmluZyB0aGUgcG9wdWxhdGlvbiwgZGlzcG9zZSBpdAotCQkJCXRyeSB7Ci0JCQkJCXRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCi0JCQkJdGhpcy5tYXBwaW5nQ29tcG9zaXRlcy5yZW1vdmUodGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSk7Ci0JCQkJdGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSA9IG51bGw7Ci0KLQkJCQkvLyBTaG93IGFuIGVycm9yIG1lc3NhZ2UKLQkJCQkvLyBUT0RPOiBSZXBsYWNlIHRoZSBibGFuayBsYWJlbCB3aXRoIHRoZSBlcnJvciBwYWdlCi0JCQkJdGhpcy5tYXBwaW5nUGFnZUJvb2suc2hvd1BhZ2UodGhpcy5idWlsZExhYmVsKHRoaXMubWFwcGluZ1BhZ2VCb29rLCAiIikpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5sb2coCi0JCQkJVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsCi0JCQkJIlBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5wb3B1bGF0ZU1hcHBpbmdQYWdlKCkgbm8gcGFnZSB0byBzaG93IgotCQkJKTsKLQotCQkJdGhpcy5tYXBwaW5nUGFnZUJvb2suc2hvd1BhZ2UodGhpcy5idWlsZExhYmVsKHRoaXMubWFwcGluZ1BhZ2VCb29rLCAiIikpOwotCQl9Ci0JCXRoaXMucmVwYWludERldGFpbHNWaWV3KHRoaXMubWFwcGluZ1BhZ2VCb29rKTsKKwkJfTsKIAl9CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlsb2coVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsICJQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuZGlzcG9zZSgpIik7IC8vJE5PTi1OTFMtMSQKIAotCQlpZiAocHJvcGVydHlOYW1lID09IFBlcnNpc3RlbnRBdHRyaWJ1dGUuREVGQVVMVF9NQVBQSU5HX1BST1BFUlRZIHx8Ci0JCSAgICBwcm9wZXJ0eU5hbWUgPT0gUGVyc2lzdGVudEF0dHJpYnV0ZS5TUEVDSUZJRURfTUFQUElOR19QUk9QRVJUWSkgewotCi0JCQl1cGRhdGVNYXBwaW5nUGFnZSgpOworCQlmb3IgKEpwYUNvbXBvc2l0ZSBtYXBwaW5nQ29tcG9zaXRlIDogdGhpcy5tYXBwaW5nQ29tcG9zaXRlcy52YWx1ZXMoKSkgeworCQkJbWFwcGluZ0NvbXBvc2l0ZS5kaXNwb3NlKCk7CiAJCX0KKwkJdGhpcy5tYXBwaW5nQ29tcG9zaXRlcy5jbGVhcigpOworCQlzdXBlci5kaXNwb3NlKCk7CiAJfQogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVwb3B1bGF0ZVdpdGhOdWxsU3ViamVjdCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KKwlwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIGZsYWcsIFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyLmxvZyhmbGFnLCBtZXNzYWdlKTsKIAotCXByaXZhdGUgdm9pZCB1cGRhdGVNYXBwaW5nUGFnZSgpIHsKLQkJQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gKHRoaXMuc3ViamVjdCgpICE9IG51bGwpID8gdGhpcy5zdWJqZWN0KCkuZ2V0TWFwcGluZygpIDogbnVsbDsKLQkJcG9wdWxhdGVNYXBwaW5nUGFnZShtYXBwaW5nID09IG51bGwgPyBudWxsIDogbWFwcGluZy5nZXRLZXkoKSk7CisJCWlmIChUcmFjaW5nLlVJX0RFVEFJTFNfVklFVy5lcXVhbHMoZmxhZykgJiYKKwkJICAgIFRyYWNpbmcuYm9vbGVhbkRlYnVnT3B0aW9uKFRyYWNpbmcuVUlfREVUQUlMU19WSUVXKSkKKwkJeworCQkJVHJhY2luZy5sb2cobWVzc2FnZSk7CisJCX0KIAl9CiAKIAlwcml2YXRlIGNsYXNzIE1hcHBpbmdGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXI8QXR0cmlidXRlTWFwcGluZz4gewpAQCAtMzI3LDcgKzE3NCw3IEBACiAJCX0KIAogCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQlyZXR1cm4gKG1hcHBpbmcgPT0gbnVsbCkgfHwgbWFwcGluZ0tleS5lcXVhbHMobWFwcGluZy5nZXRLZXkoKSk7CisJCQlyZXR1cm4gKG1hcHBpbmcgPT0gbnVsbCB8fCB0aGlzLm1hcHBpbmdLZXkgPT0gbnVsbCkgfHwgdGhpcy5tYXBwaW5nS2V5LmVxdWFscyhtYXBwaW5nLmdldEtleSgpKTsKIAkJfQogCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWM0YmMyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uVW5zdXBwb3J0ZWRPcm1NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgIk1hcCBBcyIgY29tcG9zaXRlIGlzIHJlc3BvbnNpYmxlIGZvciBzaG93aW5nIHRoZSBtYXBwaW5nIG5hbWUgYW5kCisgKiBtYXBwaW5nIHR5cGUgZm9yIGFuIGF0dHJpYnV0ZS4KKyAqCisgKiBAc2VlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUKKyAqIEBzZWUgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUgCisJZXh0ZW5kcyBNYXBBc0NvbXBvc2l0ZTxQZXJzaXN0ZW50QXR0cmlidXRlPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlKAorCQkJUGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZT4gcGFyZW50UGFuZSwKKyAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKKwkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRNYXBwaW5nS2V5KCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE1hcHBpbmdDaGFuZ2VIYW5kbGVyIGJ1aWxkTWFwcGluZ0NoYW5nZUhhbmRsZXIoKSB7CisJCXJldHVybiBuZXcgTWFwcGluZ0NoYW5nZUhhbmRsZXIoKSB7CisKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgeworCQkJCVN0cmluZyBtYXBwaW5nS2V5ID0gZ2V0TWFwcGluZ0tleSgpOworCisJCQkJaWYgKG1hcHBpbmdLZXkgIT0gTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKKwkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX21hcHBlZEF0dHJpYnV0ZVRleHQ7CisJCQkJfQorCQkJCWlmIChnZXRTdWJqZWN0KCkuaXNWaXJ0dWFsKCkpIHsKKwkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX3ZpcnR1YWxBdHRyaWJ1dGVUZXh0OworCQkJCX0KKworCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV91bm1hcHBlZEF0dHJpYnV0ZVRleHQ7CisJCQl9CisKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ1RleHQoKSB7CisJCQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBnZXRNYXBwaW5nS2V5KCk7CisKKwkJCQlpZiAobWFwcGluZ0tleSA9PSBudWxsKSB7CisJCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV9jaGFuZ2VNYXBwaW5nVHlwZTsKKwkJCQl9CisKKwkJCQlpZiAoZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZE1hcHBpbmcoKSA9PSBudWxsKSB7CisJCQkJCXJldHVybiBnZXREZWZhdWx0RGVmaW5pdGlvbihnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSkuZ2V0TGlua0xhYmVsKCk7CisJCQkJfQorCisJCQkJcmV0dXJuIGdldE1hcHBpbmdVaURlZmluaXRpb24obWFwcGluZ0tleSkuZ2V0TGlua0xhYmVsKCk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIG1vcnBoTWFwcGluZyhNYXBwaW5nVWlEZWZpbml0aW9uPD8+IGRlZmluaXRpb24pIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShkZWZpbml0aW9uLmdldEtleSgpKTsKKwkJCX0KKworCQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0TmFtZSgpOworCQkJfQorCisJCQlwdWJsaWMgSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248Pz4+IG1hcHBpbmdVaURlZmluaXRpb25zKCkgeworCQkJCXJldHVybiBhdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBhdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKKwkJcmV0dXJuIGdldEpwYVBsYXRmb3JtVWkoKS5hdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucyhnZXRTdWJqZWN0KCkuZ2V0UmVzb3VyY2VUeXBlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248Pz4gZ2V0RGVmYXVsdERlZmluaXRpb24oKSB7CisJCXJldHVybiBnZXREZWZhdWx0RGVmaW5pdGlvbihnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjw/PiBnZXREZWZhdWx0RGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSkgeworCQlyZXR1cm4gZ2V0SnBhUGxhdGZvcm1VaSgpLmdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKGdldFN1YmplY3QoKS5nZXRSZXNvdXJjZVR5cGUoKSwgbWFwcGluZ0tleSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE1hcHBpbmdVaURlZmluaXRpb248Pz4gZ2V0TWFwcGluZ1VpRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSkgeworCQlNYXBwaW5nVWlEZWZpbml0aW9uPD8+IGRlZmluaXRpb24gPSBzdXBlci5nZXRNYXBwaW5nVWlEZWZpbml0aW9uKG1hcHBpbmdLZXkpOworCQlpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7CisJCQlyZXR1cm4gZGVmaW5pdGlvbjsKKwkJfQorCQlyZXR1cm4gVW5zdXBwb3J0ZWRPcm1NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVudEF0dHJpYnV0ZS5ERUZBVUxUX01BUFBJTkdfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW50QXR0cmlidXRlLlNQRUNJRklFRF9NQVBQSU5HX1BST1BFUlRZKTsKKwkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVudEF0dHJpYnV0ZS5OQU1FX1BST1BFUlRZKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKKworCQlpZiAocHJvcGVydHlOYW1lID09IFBlcnNpc3RlbnRBdHRyaWJ1dGUuU1BFQ0lGSUVEX01BUFBJTkdfUFJPUEVSVFkgfHwKKwkJICAgIHByb3BlcnR5TmFtZSA9PSBQZXJzaXN0ZW50QXR0cmlidXRlLkRFRkFVTFRfTUFQUElOR19QUk9QRVJUWSAgIHx8CisJCSAgICBwcm9wZXJ0eU5hbWUgPT0gUGVyc2lzdGVudEF0dHJpYnV0ZS5OQU1FX1BST1BFUlRZKSB7CisKKwkJCXVwZGF0ZURlc2NyaXB0aW9uKCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5qYXZhCmluZGV4IGU1OTc2ZmUuLjliZDZiOTggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMjQgKzksMjMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwogCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5UcmFjaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7CiAKIC8qKgpAQCAtMzUsMTYgKzM0LDE1IEBACiAgKgogICogQHNlZSBQZXJzaXN0ZW50VHlwZQogICoKLSAqIEB2ZXJzaW9uIDIuMAorICogQHZlcnNpb24gMi4yCiAgKiBAc2luY2UgMS4wCiAgKi8KIEBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2U8VCBleHRlbmRzIFBlcnNpc3RlbnRUeXBlPiBleHRlbmRzIEFic3RyYWN0SnBhRGV0YWlsc1BhZ2U8VD4KK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlIGV4dGVuZHMgQWJzdHJhY3RKcGFEZXRhaWxzUGFnZTxQZXJzaXN0ZW50VHlwZT4KIHsKLQlwcml2YXRlIEpwYUNvbXBvc2l0ZTw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+IGN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlOwotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRNYXBwaW5nS2V5OwotCXByaXZhdGUgTWFwPFN0cmluZywgSnBhQ29tcG9zaXRlPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IG1hcHBpbmdDb21wb3NpdGVzOwotCXByaXZhdGUgUGFnZUJvb2sgdHlwZU1hcHBpbmdQYWdlQm9vazsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIEpwYUNvbXBvc2l0ZT4gbWFwcGluZ0NvbXBvc2l0ZXM7CisJcHJpdmF0ZSBQYWdlQm9vayBtYXBwaW5nUGFnZUJvb2s7CisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VHlwZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXI7CiAKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2U8L2NvZGU+LgpAQCAtNTgsNTggKzU2LDI5IEBACiAJCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CiAJfQogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW50VHlwZS5NQVBQSU5HX1BST1BFUlRZKTsKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisJCXRoaXMubWFwcGluZ0NvbXBvc2l0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpwYUNvbXBvc2l0ZT4oKTsKIAl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CiAKLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW50VHlwZSwgVHlwZU1hcHBpbmc+IGJ1aWxkR2VuZXJpY01hcHBpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbnRUeXBlLCBUeXBlTWFwcGluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBQZXJzaXN0ZW50VHlwZS5NQVBQSU5HX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUeXBlTWFwcGluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRNYXBwaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEpwYUNvbXBvc2l0ZTxUeXBlTWFwcGluZz4gYnVpbGRNYXBwaW5nQ29tcG9zaXRlKFBhZ2VCb29rIHBhZ2VCb29rLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkpICB7Ci0KLQkJVHlwZU1hcHBpbmdVaVByb3ZpZGVyPFR5cGVNYXBwaW5nPiB1aVByb3ZpZGVyID0KLQkJCShUeXBlTWFwcGluZ1VpUHJvdmlkZXI8VHlwZU1hcHBpbmc+KSB0eXBlTWFwcGluZ1VpUHJvdmlkZXIoa2V5KTsKLQotCQlyZXR1cm4gdWlQcm92aWRlci5idWlsZFBlcnNpc3RlbnRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCWpwYVVpRmFjdG9yeSgpLAotCQkJYnVpbGRNYXBwaW5nSG9sZGVyKGtleSksCi0JCQlwYWdlQm9vaywKLQkJCWdldFdpZGdldEZhY3RvcnkoKQorCQkvLyBNYXAgQXMgY29tcG9zaXRlCisJCW5ldyBQZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlKAorCQkJdGhpcywKKwkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCAwLCA1LCAwKQogCQkpOworCisJCS8vIFR5cGUgcHJvcGVydGllcyBwYWdlCisJCWJ1aWxkTWFwcGluZ1BhZ2VCb29rKGNvbnRhaW5lcik7CiAJfQogCi0JcHJpdmF0ZSBGaWx0ZXI8VHlwZU1hcHBpbmc+IGJ1aWxkTWFwcGluZ0ZpbHRlcihmaW5hbCBTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyPFR5cGVNYXBwaW5nPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChUeXBlTWFwcGluZyB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgPT0gbnVsbCkgfHwga2V5LmVxdWFscyh2YWx1ZS5nZXRLZXkoKSk7Ci0JCQl9Ci0JCX07Ci0JfQorCXByb3RlY3RlZCBQYWdlQm9vayBidWlsZE1hcHBpbmdQYWdlQm9vayhDb21wb3NpdGUgcGFyZW50KSB7CiAKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4gYnVpbGRNYXBwaW5nSG9sZGVyKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWw8VHlwZU1hcHBpbmc+KAotCQkJYnVpbGRHZW5lcmljTWFwcGluZ0hvbGRlcigpLAotCQkJYnVpbGRNYXBwaW5nRmlsdGVyKGtleSkKLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFnZUJvb2sgYnVpbGRUeXBlTWFwcGluZ1BhZ2VCb29rKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQl0aGlzLnR5cGVNYXBwaW5nUGFnZUJvb2sgPSBuZXcgUGFnZUJvb2socGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRoaXMudHlwZU1hcHBpbmdQYWdlQm9vay5zaG93UGFnZSh0aGlzLmJ1aWxkTGFiZWwodGhpcy50eXBlTWFwcGluZ1BhZ2VCb29rLCAiIikpOworCQl0aGlzLm1hcHBpbmdQYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIFNXVC5OT05FKTsKKwkJdGhpcy5tYXBwaW5nUGFnZUJvb2suc2hvd1BhZ2UodGhpcy5hZGRMYWJlbCh0aGlzLm1hcHBpbmdQYWdlQm9vaywgIiIpKTsKIAogCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwogCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gU1dULkZJTEw7CkBAIC0xMTcsNTIgKzg2LDU3IEBACiAJCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwogCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSAgID0gdHJ1ZTsKIAotCQl0aGlzLnR5cGVNYXBwaW5nUGFnZUJvb2suc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisJCXRoaXMubWFwcGluZ1BhZ2VCb29rLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCQkKKwkJdGhpcy5tYXBwaW5nSG9sZGVyID0gdGhpcy5idWlsZE1hcHBpbmdIb2xkZXIoKTsKKwkJbmV3IENvbnRyb2xTd2l0Y2hlcih0aGlzLm1hcHBpbmdIb2xkZXIsIHRoaXMuYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSwgdGhpcy5tYXBwaW5nUGFnZUJvb2spOwogCi0JCXJldHVybiB0aGlzLnR5cGVNYXBwaW5nUGFnZUJvb2s7CisJCXJldHVybiB0aGlzLm1hcHBpbmdQYWdlQm9vazsKKwl9CisJCisJcHJpdmF0ZSBUcmFuc2Zvcm1lcjxUeXBlTWFwcGluZywgQ29udHJvbD4gYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8VHlwZU1hcHBpbmcsIENvbnRyb2w+KCkgeworCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7CisJCQkJaWYgKHR5cGVNYXBwaW5nID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXJldHVybiBnZXRNYXBwaW5nQ29tcG9zaXRlKHR5cGVNYXBwaW5nLmdldEtleSgpKS5nZXRDb250cm9sKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8VHlwZU1hcHBpbmc+IGJ1aWxkTWFwcGluZ0hvbGRlcihTdHJpbmcga2V5KSB7CisJCXJldHVybiBuZXcgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPFR5cGVNYXBwaW5nPigKKwkJCXRoaXMubWFwcGluZ0hvbGRlciwKKwkJCWJ1aWxkTWFwcGluZ0ZpbHRlcihrZXkpCisJCSk7CiAJfQogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9EaXNwb3NlKCkgewotCQlsb2coVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsICJQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmRvRGlzcG9zZSgpIik7Ci0KLQkJaWYgKHRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJdGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCQl0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlID0gbnVsbDsKLQkJfQotCi0JCXRoaXMubWFwcGluZ0NvbXBvc2l0ZXMuY2xlYXIoKTsKLQkJc3VwZXIuZG9EaXNwb3NlKCk7CisJcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVudFR5cGUsIFR5cGVNYXBwaW5nPiBidWlsZE1hcHBpbmdIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbnRUeXBlLCBUeXBlTWFwcGluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBQZXJzaXN0ZW50VHlwZS5NQVBQSU5HX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBUeXBlTWFwcGluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE1hcHBpbmcoKTsKKwkJCX0KKwkJfTsKIAl9CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXVwZGF0ZU1hcHBpbmdQYWdlKCk7CisJcHJpdmF0ZSBGaWx0ZXI8VHlwZU1hcHBpbmc+IGJ1aWxkTWFwcGluZ0ZpbHRlcihmaW5hbCBTdHJpbmcga2V5KSB7CisJCXJldHVybiBuZXcgRmlsdGVyPFR5cGVNYXBwaW5nPigpIHsKKwkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChUeXBlTWFwcGluZyBtYXBwaW5nKSB7CisJCQkJcmV0dXJuIChtYXBwaW5nID09IG51bGwgfHwga2V5ID09IG51bGwpIHx8IGtleS5lcXVhbHMobWFwcGluZy5nZXRLZXkoKSk7CisJCQl9CisJCX07CiAJfQogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLm1hcHBpbmdDb21wb3NpdGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKcGFDb21wb3NpdGU8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4oKTsKLQl9Ci0KLQlwcml2YXRlIEpwYUNvbXBvc2l0ZTw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+IG1hcHBpbmdDb21wb3NpdGVGb3IoU3RyaW5nIGtleSkgewotCQlKcGFDb21wb3NpdGU8PyBleHRlbmRzIFR5cGVNYXBwaW5nPiBtYXBwaW5nQ29tcG9zaXRlID0gdGhpcy5tYXBwaW5nQ29tcG9zaXRlcy5nZXQoa2V5KTsKKwkKKwlwcml2YXRlIEpwYUNvbXBvc2l0ZSBnZXRNYXBwaW5nQ29tcG9zaXRlKFN0cmluZyBrZXkpIHsKKwkJSnBhQ29tcG9zaXRlIG1hcHBpbmdDb21wb3NpdGUgPSB0aGlzLm1hcHBpbmdDb21wb3NpdGVzLmdldChrZXkpOwogCQlpZiAobWFwcGluZ0NvbXBvc2l0ZSAhPSBudWxsKSB7CiAJCQlyZXR1cm4gbWFwcGluZ0NvbXBvc2l0ZTsKIAkJfQogCi0JCW1hcHBpbmdDb21wb3NpdGUgPSBidWlsZE1hcHBpbmdDb21wb3NpdGUodGhpcy50eXBlTWFwcGluZ1BhZ2VCb29rLCBrZXkpOworCQltYXBwaW5nQ29tcG9zaXRlID0gYnVpbGRNYXBwaW5nQ29tcG9zaXRlKHRoaXMubWFwcGluZ1BhZ2VCb29rLCBrZXkpOwogCiAJCWlmIChtYXBwaW5nQ29tcG9zaXRlICE9IG51bGwpIHsKIAkJCXRoaXMubWFwcGluZ0NvbXBvc2l0ZXMucHV0KGtleSwgbWFwcGluZ0NvbXBvc2l0ZSk7CkBAIC0xNzAsMTA3ICsxNDQsMjYgQEAKIAogCQlyZXR1cm4gbWFwcGluZ0NvbXBvc2l0ZTsKIAl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVNYXBwaW5nUGFnZShTdHJpbmcgbWFwcGluZ0tleSkgewotCi0JCS8vIE5vdGhpbmcgdG8gdXBkYXRlCi0JCWlmICh0aGlzLmN1cnJlbnRNYXBwaW5nS2V5ID09IG1hcHBpbmdLZXkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBEaXNwb3NlIHRoZSBleGlzdGluZyBtYXBwaW5nIHBhbmUKLQkJZWxzZSBpZiAodGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmxvZygKLQkJCQlUcmFjaW5nLlVJX0RFVEFJTFNfVklFVywKLQkJCQkiUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5wb3B1bGF0ZU1hcHBpbmdQYWdlKCkgZGlzcG9zaW5nIG9mIGN1cnJlbnQgcGFnZTogIiArIHRoaXMuY3VycmVudE1hcHBpbmdLZXkKLQkJCSk7Ci0KLQkJCXRyeSB7Ci0JCQkJdGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCQkJdGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSA9IG51bGw7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLmN1cnJlbnRNYXBwaW5nS2V5ID0gbWFwcGluZ0tleTsKLQotCQkvLyBDaGFuZ2UgdGhlIGN1cnJlbnQgbWFwcGluZyBwYW5lIHdpdGggdGhlIG5ldyBvbmUKLQkJaWYgKHRoaXMuY3VycmVudE1hcHBpbmdLZXkgIT0gbnVsbCkgewotCQkJdGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSA9IG1hcHBpbmdDb21wb3NpdGVGb3IobWFwcGluZ0tleSk7Ci0KLQkJCS8vIFNob3cgdGhlIG5ldyBtYXBwaW5nIHBhbmUKLQkJCXRyeSB7Ci0JCQkJdGhpcy5sb2coCi0JCQkJCVRyYWNpbmcuVUlfREVUQUlMU19WSUVXLAotCQkJCQkiUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5wb3B1bGF0ZU1hcHBpbmdQYWdlKCkgcG9wdWxhdGluZyBuZXcgcGFnZTogIiArIHRoaXMuY3VycmVudE1hcHBpbmdLZXkKLQkJCQkpOwotCi0JCQkJdGhpcy5jdXJyZW50TWFwcGluZ0NvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCQkJCXRoaXMudHlwZU1hcHBpbmdQYWdlQm9vay5zaG93UGFnZSh0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlLmdldENvbnRyb2woKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0KLQkJCQl0aGlzLmxvZygKLQkJCQkJVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsCi0JCQkJCSJQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLnBvcHVsYXRlTWFwcGluZ1BhZ2UoKSBlcnJvciBlbmNvdW50ZXJlZCIKLQkJCQkpOwotCi0JCQkJLy8gQW4gZXJyb3Igd2FzIGVuY291bnRlcmVkIGVpdGhlciBkdXJpbmcgdGhlIHBvcHVsYXRpb24sIGRpc3Bvc2UgaXQKLQkJCQl0cnkgewotCQkJCQl0aGlzLmN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQotCQkJCXRoaXMubWFwcGluZ0NvbXBvc2l0ZXMucmVtb3ZlKHRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUpOwotCQkJCXRoaXMuY3VycmVudE1hcHBpbmdDb21wb3NpdGUgPSBudWxsOwotCi0JCQkJLy8gU2hvdyBhbiBlcnJvciBtZXNzYWdlCi0JCQkJLy8gVE9ETzogUmVwbGFjZSB0aGUgYmxhbmsgbGFiZWwgd2l0aCB0aGUgZXJyb3IgcGFnZQotCQkJCXRoaXMudHlwZU1hcHBpbmdQYWdlQm9vay5zaG93UGFnZSh0aGlzLmJ1aWxkTGFiZWwodGhpcy50eXBlTWFwcGluZ1BhZ2VCb29rLCAiIikpOwotCQkJfQotCQl9Ci0JCS8vIENsZWFyIHRoZSBtYXBwaW5nIHBhbmUgYW5kIHNob3cgYSBibGFuayBwYWdlCi0JCWVsc2UgewotCQkJdGhpcy5sb2coCi0JCQkJVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsCi0JCQkJIlBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UucG9wdWxhdGVNYXBwaW5nUGFnZSgpIG5vIHBhZ2UgdG8gc2hvdyIKLQkJCSk7Ci0KLQkJCXRoaXMudHlwZU1hcHBpbmdQYWdlQm9vay5zaG93UGFnZSh0aGlzLmJ1aWxkTGFiZWwodGhpcy50eXBlTWFwcGluZ1BhZ2VCb29rLCAiIikpOwotCQl9Ci0JCXRoaXMucmVwYWludERldGFpbHNWaWV3KHRoaXMudHlwZU1hcHBpbmdQYWdlQm9vayk7CisJCisJcHJvdGVjdGVkIEpwYUNvbXBvc2l0ZSBidWlsZE1hcHBpbmdDb21wb3NpdGUoUGFnZUJvb2sgcGFnZUJvb2ssIFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIGdldEpwYVBsYXRmb3JtVWkoKS4KKwkJCWJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCisJCQkJZ2V0U3ViamVjdCgpLmdldFJlc291cmNlVHlwZSgpLCAKKwkJCQlrZXksIAorCQkJCXBhZ2VCb29rLCAKKwkJCQlidWlsZE1hcHBpbmdIb2xkZXIoa2V5KSwgCisJCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKIAl9CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlsb2coVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsICJQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmRpc3Bvc2UoKSIpOwogCi0JCWlmIChwcm9wZXJ0eU5hbWUgPT0gUGVyc2lzdGVudFR5cGUuTUFQUElOR19QUk9QRVJUWSkgewotCQkJdXBkYXRlTWFwcGluZ1BhZ2UoKTsKKwkJZm9yIChKcGFDb21wb3NpdGUgbWFwcGluZ0NvbXBvc2l0ZSA6IHRoaXMubWFwcGluZ0NvbXBvc2l0ZXMudmFsdWVzKCkpIHsKKwkJCW1hcHBpbmdDb21wb3NpdGUuZGlzcG9zZSgpOwogCQl9CisJCXRoaXMubWFwcGluZ0NvbXBvc2l0ZXMuY2xlYXIoKTsKKwkJc3VwZXIuZGlzcG9zZSgpOwogCX0KIAotCXByaXZhdGUgVHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4gdHlwZU1hcHBpbmdVaVByb3ZpZGVyKFN0cmluZyBrZXkpIHsKLQkJZm9yIChJdGVyYXRvcjxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gaXRlciA9IHRoaXMudHlwZU1hcHBpbmdVaVByb3ZpZGVycygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+IHByb3ZpZGVyID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocHJvdmlkZXIuZ2V0TWFwcGluZ0tleSgpID09IGtleSkgewotCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCB0eXBlIG1hcHBpbmcgVUkgcHJvdmlkZXIga2V5OiAiICsga2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmF0b3I8VHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IHR5cGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQotCXByaXZhdGUgdm9pZCB1cGRhdGVNYXBwaW5nUGFnZSgpIHsKLQkJVHlwZU1hcHBpbmcgbWFwcGluZyA9ICh0aGlzLnN1YmplY3QoKSAhPSBudWxsKSA/IHRoaXMuc3ViamVjdCgpLmdldE1hcHBpbmcoKSA6IG51bGw7Ci0JCXBvcHVsYXRlTWFwcGluZ1BhZ2UobWFwcGluZyA9PSBudWxsID8gbnVsbCA6IG1hcHBpbmcuZ2V0S2V5KCkpOwotCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTNlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5EZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgIk1hcCBBcyIgY29tcG9zaXRlIGlzIHJlc3BvbnNpYmxlIGZvciBzaG93aW5nIHRoZSBtYXBwaW5nIG5hbWUgYW5kCisgKiBtYXBwaW5nIHR5cGUgZm9yIGEgdHlwZS4KKyAqCisgKiBAc2VlIEphdmFQZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlCisgKiBAc2VlIE9ybVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIFBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUgZXh0ZW5kcyBNYXBBc0NvbXBvc2l0ZTxQZXJzaXN0ZW50VHlwZT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBQZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlKAorCQkJUGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGU+IHBhcmVudFBhbmUsCisJICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisJCQorCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CisJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0TWFwcGluZ0tleSgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBNYXBwaW5nQ2hhbmdlSGFuZGxlciBidWlsZE1hcHBpbmdDaGFuZ2VIYW5kbGVyKCkgeworCQlyZXR1cm4gbmV3IE1hcHBpbmdDaGFuZ2VIYW5kbGVyKCkgeworCisJCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlTdHJpbmcgbWFwcGluZ0tleSA9IGdldE1hcHBpbmdLZXkoKTsKKworCQkJCWlmIChtYXBwaW5nS2V5ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX21hcHBlZFR5cGVUZXh0OworCQkJCX0KKworCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV91bm1hcHBlZFR5cGVUZXh0OworCQkJfQorCisJCQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdUZXh0KCkgeworCQkJCVN0cmluZyBtYXBwaW5nS2V5ID0gZ2V0TWFwcGluZ0tleSgpOworCisJCQkJaWYgKG1hcHBpbmdLZXkgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfY2hhbmdlTWFwcGluZ1R5cGU7CisJCQkJfQorCisJCQkJcmV0dXJuIGdldE1hcHBpbmdVaURlZmluaXRpb24obWFwcGluZ0tleSkuZ2V0TGlua0xhYmVsKCk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIG1vcnBoTWFwcGluZyhNYXBwaW5nVWlEZWZpbml0aW9uPD8+IGRlZmluaXRpb24pIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0TWFwcGluZ0tleShkZWZpbml0aW9uLmdldEtleSgpKTsKKwkJCX0KKworCQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U2hvcnROYW1lKCk7CisJCQl9CisKKwkJCXB1YmxpYyBJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjw/Pj4gbWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7CisJCQkJcmV0dXJuIHR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpOworCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIEpQVCBwbHVnaW4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzdXBwb3J0ZWQgdHlwZXMgb2YgbWFwcGluZworCSAqLworCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiB0eXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7CisJCXJldHVybiBnZXRKcGFQbGF0Zm9ybVVpKCkudHlwZU1hcHBpbmdVaURlZmluaXRpb25zKGdldFN1YmplY3QoKS5nZXRSZXNvdXJjZVR5cGUoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjw/PiBnZXREZWZhdWx0RGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIGdldEpwYVBsYXRmb3JtVWkoKS5nZXREZWZhdWx0VHlwZU1hcHBpbmdVaURlZmluaXRpb24oZ2V0U3ViamVjdCgpLmdldFJlc291cmNlVHlwZSgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPD8+IGdldERlZmF1bHREZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KSB7CisJCXJldHVybiBnZXREZWZhdWx0RGVmaW5pdGlvbigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7CisJCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbnRUeXBlLk1BUFBJTkdfUFJPUEVSVFkpOworCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW50VHlwZS5OQU1FX1BST1BFUlRZKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKKworCQlpZiAocHJvcGVydHlOYW1lID09IFBlcnNpc3RlbnRUeXBlLk1BUFBJTkdfUFJPUEVSVFkgfHwKKwkJICAgIHByb3BlcnR5TmFtZSA9PSBQZXJzaXN0ZW50VHlwZS5OQU1FX1BST1BFUlRZKSB7CisKKwkJCXVwZGF0ZURlc2NyaXB0aW9uKCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWFkNTMxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworCisvKioKKyAqIFRoaXMgZGlhbG9nIGlzIHVzZWQgdG8gZWl0aGVyIGNyZWF0ZSBvciBlZGl0IGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gdGhhdAorICogaXMgbG9jYXRlZCBvbiBhbiBlbnRpdHkuCisgKgorICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbgorICogQHNlZSBFbnRpdHkKKyAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdAorICogQHNlZSBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5EaWFsb2c8UHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdD4geworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKKwkgKiBAcGFyYW0gZW50aXR5IFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzCisJICogbG9jYXRlZAorCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQorCSAqLworCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyhTaGVsbCBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eSBlbnRpdHksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKKworCQlzdXBlcihwYXJlbnQsIGVudGl0eSwgam9pbkNvbHVtbik7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERpYWxvZ1BhbmU8UHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZTxQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0PigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCWNvbnRhaW5lcgorCQkpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0IGJ1aWxkU3RhdGVPYmplY3QoKSB7CisJCXJldHVybiBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdChnZXRPd25lcigpLCBnZXRKb2luQ29sdW1uKCkpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25UaXRsZSgpIHsKKworCQlpZiAoZ2V0Sm9pbkNvbHVtbigpID09IG51bGwpIHsKKwkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19hZGREZXNjcmlwdGlvblRpdGxlOworCQl9CisKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2VkaXREZXNjcmlwdGlvblRpdGxlOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRKb2luQ29sdW1uKCkgeworCQlyZXR1cm4gKFByaW1hcnlLZXlKb2luQ29sdW1uKSBzdXBlci5nZXRKb2luQ29sdW1uKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVudGl0eSBnZXRPd25lcigpIHsKKwkJcmV0dXJuIChFbnRpdHkpIHN1cGVyLmdldE93bmVyKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKKworCQlpZiAoZ2V0Sm9pbkNvbHVtbigpID09IG51bGwpIHsKKwkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19hZGRUaXRsZTsKKwkJfQorCisJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19lZGl0VGl0bGU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YjExNWUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRGlhbG9nUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CisKKy8qKgorICogVGhpcyBkaWFsb2cgaXMgdXNlZCB0byBlaXRoZXIgY3JlYXRlIG9yIGVkaXQgYSBwcmltYXJ5IGtleSBqb2luZyBjb2x1bW4gdGhhdAorICogaXMgd2l0aGluIGEgc2Vjb25kYXJ5IHRhYmxlLgorICoKKyAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW4KKyAqIEBzZWUgU2Vjb25kYXJ5VGFibGUKKyAqIEBzZWUgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lCisgKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0CisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbkRpYWxvZzxQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdD4geworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2c8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCisJICogQHBhcmFtIHNlY29uZGFyeVRhYmxlIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0CisJICogaXMgbG9jYXRlZAorCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQorCSAqLworCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2coU2hlbGwgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisKKwkJc3VwZXIocGFyZW50LCBzZWNvbmRhcnlUYWJsZSwgam9pbkNvbHVtbik7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIERpYWxvZ1BhbmU8UHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3Q+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJcmV0dXJuIG5ldyBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmU8UHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3Q+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJY29udGFpbmVyCisJCSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0IGJ1aWxkU3RhdGVPYmplY3QoKSB7CisJCXJldHVybiBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QoCisJCQlnZXRPd25lcigpLAorCQkJZ2V0Sm9pbkNvbHVtbigpCisJCSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvblRpdGxlKCkgeworCisJCWlmIChnZXRKb2luQ29sdW1uKCkgPT0gbnVsbCkgeworCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGREZXNjcmlwdGlvblRpdGxlOworCQl9CisKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKKwkJcmV0dXJuIChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTZWNvbmRhcnlUYWJsZSBnZXRPd25lcigpIHsKKwkJcmV0dXJuIChTZWNvbmRhcnlUYWJsZSkgc3VwZXIuZ2V0T3duZXIoKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlKCkgeworCisJCWlmIChnZXRKb2luQ29sdW1uKCkgPT0gbnVsbCkgeworCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGRUaXRsZTsKKwkJfQorCisJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdFRpdGxlOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3YmE3MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7CisKKy8qKgorICogVGhlIHN0YXRlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSBvciBlZGl0IGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gb24gYW4KKyAqIHNlY29uZGFyeSB0YWJsZS4KKyAqCisgKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uCisgKiBAc2VlIFNlY29uZGFyeVRhYmxlCisgKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZworICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdDwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc2Vjb25kYXJ5VGFibGUgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQKKwkgKiBpcyBsb2NhdGVkCisJICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgdG8KKwkgKiBjcmVhdGUgYSBuZXcgb25lCisJICovCisJcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0KFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7CisKKwkJc3VwZXIoc2Vjb25kYXJ5VGFibGUsIGpvaW5Db2x1bW4pOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKKwkJcmV0dXJuIChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBUYWJsZSBnZXROYW1lVGFibGUoKSB7CisJCXJldHVybiBnZXRPd25lcigpLmdldERiVGFibGUoKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU2Vjb25kYXJ5VGFibGUgZ2V0T3duZXIoKSB7CisJCXJldHVybiAoU2Vjb25kYXJ5VGFibGUpIHN1cGVyLmdldE93bmVyKCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkgeworCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRQYXJlbnQoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbFRhYmxlKCkgeworCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXROYW1lKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhYmxlcygpIHsKKwkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFN0cmluZz4oZ2V0SW5pdGlhbFRhYmxlKCkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGY1OTYwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZTogIAorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IG8gUHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfAorICogfCB8ICAgICAobm8gYWN0dWFsIGNvbnRlbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUge0BsaW5rIFByaW1hcnlLZXlKb2luQ29sdW1uRW5hYmxlZFJlbGF0aW9uc2hpcFJlZmVyZW5jZX0KKyAqIEBzZWUge0BsaW5rIFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5fQorICogQHNlZSB7QGxpbmsgT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lfQorICoKKyAqIEB2ZXJzaW9uIDIuMQorICogQHNpbmNlIDIuMQorICovCitwdWJsaWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lIAorCWV4dGVuZHMgQWJzdHJhY3RKb2luaW5nU3RyYXRlZ3lQYW5lCisJCTxQcmltYXJ5S2V5Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5PgoreworCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUoCisJCQlGb3JtUGFuZTw/IGV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlPiBwYXJlbnRQYW5lLCAKKwkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXNlc1N0cmF0ZWd5SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkVuYWJsZWRSZWxhdGlvbnNoaXBSZWZlcmVuY2UsIEJvb2xlYW4+KAorCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBSZWxhdGlvbnNoaXBSZWZlcmVuY2UuUFJFRE9NSU5BTlRfSk9JTklOR19TVFJBVEVHWV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgeworCQkJCXJldHVybiAodGhpcy5zdWJqZWN0ID09IG51bGwpID8gQm9vbGVhbi5GQUxTRSA6CisJCQkJCUJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QudXNlc1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlID09IEJvb2xlYW4uVFJVRSkgeworCQkJCQl0aGlzLnN1YmplY3Quc2V0UHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXRoaXMuc3ViamVjdC51bnNldFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5PiBidWlsZEpvaW5pbmdTdHJhdGVneUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIKKwkJCQk8UHJpbWFyeUtleUpvaW5Db2x1bW5FbmFibGVkUmVsYXRpb25zaGlwUmVmZXJlbmNlLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneT4oCisJCQkJCWdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQkJfQorCQl9OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmF0ZWd5TGFiZWxLZXkoKSB7CisJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX3ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ0xhYmVsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkU3RyYXRlZ3lEZXRhaWxzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTVjY2ZhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7CisKKy8qKgorICogVGhlIHN0YXRlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSBvciBlZGl0IGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gb24gYW4KKyAqIGVudGl0eS4KKyAqCisgKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uCisgKiBAc2VlIEVudGl0eQorICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZworICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ1BhbmUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0PC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMKKwkgKiBsb2NhdGVkCisJICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcworCSAqIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQorCSAqLworCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0KEVudGl0eSBlbnRpdHksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCQlzdXBlcihlbnRpdHksIGpvaW5Db2x1bW4pOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKKwkJcmV0dXJuIChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBUYWJsZSBnZXROYW1lVGFibGUoKSB7CisJCXJldHVybiBnZXRPd25lcigpLmdldFByaW1hcnlEYlRhYmxlKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVudGl0eSBnZXRPd25lcigpIHsKKwkJcmV0dXJuIChFbnRpdHkpIHN1cGVyLmdldE93bmVyKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7CisJCUVudGl0eSBwYXJlbnRFbnRpdHkgPSBnZXRPd25lcigpLmdldFBhcmVudEVudGl0eSgpOworCQlyZXR1cm4gKHBhcmVudEVudGl0eSA9PSBudWxsKSA/IGdldE93bmVyKCkuZ2V0UHJpbWFyeURiVGFibGUoKSA6IHBhcmVudEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbFRhYmxlKCkgeworCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhYmxlcygpIHsKKwkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFN0cmluZz4oZ2V0SW5pdGlhbFRhYmxlKCkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YmFiOGQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDQyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZENvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBvc3RFeGVjdXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtIEpvaW4gQ29sdW1ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBTZWNvbmRhcnlUYWJsZQorICogQHNlZSBFbnRpdHlDb21wb3NpdGUgLSBUaGUgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICogQHNlZSBBZGRSZW1vdmVMaXN0UGFuZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPFNlY29uZGFyeVRhYmxlPgoreworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5Ib2xkZXI7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUoRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFNlY29uZGFyeVRhYmxlPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklTZWNvbmRhcnlUYWJsZTwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgU2Vjb25kYXJ5VGFibGU+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7CisKKwkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBzdGF0ZU9iamVjdC5nZXRPd25lcigpOworCQlpbnQgaW5kZXggPSBzZWNvbmRhcnlUYWJsZS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7CisKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGluZGV4KTsKKwkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7CisKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZyA9CisJCQluZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nKGdldFNoZWxsKCksIGdldFN1YmplY3QoKSwgbnVsbCk7CisKKwkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRBZGRQcmltYXJ5S2V5Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7CisJfQorCisJcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZz4gYnVpbGRBZGRQcmltYXJ5S2V5Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSB7CisJCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2c+KCkgeworCQkJcHVibGljIHZvaWQgZXhlY3V0ZShQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nKSB7CisJCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgeworCQkJCQlhZGRKb2luQ29sdW1uKGRpYWxvZy5nZXRTdWJqZWN0KCkpOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENvbnRyb2xCb29sZWFuSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFNlY29uZGFyeVRhYmxlIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCQkJfQorCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoIXZhbHVlLmlzVmlydHVhbCgpKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8U2Vjb25kYXJ5VGFibGUsIFByaW1hcnlLZXlKb2luQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCksIFNlY29uZGFyeVRhYmxlLkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFByaW1hcnlLZXlKb2luQ29sdW1uPigKKwkJCWJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKQorCQkpOworCX0KKworCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2c+IGJ1aWxkRWRpdFByaW1hcnlLZXlKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpIHsKKwkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZz4oKSB7CisJCQlwdWJsaWMgdm9pZCBleGVjdXRlKFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2cpIHsKKwkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7CisJCQkJCWVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihkaWFsb2cuZ2V0U3ViamVjdCgpKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRKb2luQ29sdW1uTGFiZWwoUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgeworCisJCWlmIChqb2luQ29sdW1uLmlzVmlydHVhbCgpKSB7CisJCQlyZXR1cm4gTkxTLmJpbmQoCisJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdCwKKwkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKKwkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKKwkJCSk7CisJCX0KKworCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgeworCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIE5MUy5iaW5kKAorCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdCwKKwkJCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCisJCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQorCQkJCSk7CisJCQl9CisKKwkJCXJldHVybiBOTFMuYmluZCgKKwkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQsCisJCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCisJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCisJCQkpOworCQl9CisKKwkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gTkxTLmJpbmQoCisJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdCwKKwkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKKwkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKKwkJCSk7CisJCX0KKworCQlyZXR1cm4gTkxTLmJpbmQoCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXMsCisJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKKwkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQorCQkpOworCX0KKworCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCkgeworCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW4pIGVsZW1lbnQ7CisJCQkJcmV0dXJuIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKGpvaW5Db2x1bW4pOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKTsKKwl9CisKKwlwcml2YXRlIEFkZFJlbW92ZVBhbmUuQWRhcHRlciBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uQWRhcHRlcigpIHsKKwkJcmV0dXJuIG5ldyBBZGRSZW1vdmVQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCQkJCWFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b24oKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQoKSB7CisJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9lZGl0OworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIG9wdGlvbk9uU2VsZWN0aW9uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKKwkJCQllZGl0UHJpbWFyeUtleUpvaW5Db2x1bW4obGlzdFNlbGVjdGlvbk1vZGVsKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7CisJCQkJcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4obGlzdFNlbGVjdGlvbk1vZGVsKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oKTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7CisJCUxpc3Q8TGlzdFZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4+KCk7CisJCWxpc3QuYWRkKGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkpOworCQlsaXN0LmFkZChidWlsZERlZmF1bHRKb2luQ29sdW1uTGlzdEhvbGRlcigpKTsKKwkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4sIFByaW1hcnlLZXlKb2luQ29sdW1uPihsaXN0KTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0xpc3RNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UHJpbWFyeUtleUpvaW5Db2x1bW4+KAorCQkJYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0SG9sZGVyKCksCisJCQlOYW1lZENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwKKwkJCU5hbWVkQ29sdW1uLkRFRkFVTFRfTkFNRV9QUk9QRVJUWSwKKwkJCUJhc2VKb2luQ29sdW1uLlNQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLAorCQkJQmFzZUpvaW5Db2x1bW4uREVGQVVMVF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZCisJCSk7CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8U2Vjb25kYXJ5VGFibGUsIFByaW1hcnlLZXlKb2luQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCksIFNlY29uZGFyeVRhYmxlLlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uPiBsaXN0SXRlcmF0b3JfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgdm9pZCBlZGl0UHJpbWFyeUtleUpvaW5Db2x1bW4oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCisJCVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW4pIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7CisKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZyA9CisJCQluZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nKAorCQkJCWdldFNoZWxsKCksCisJCQkJZ2V0U3ViamVjdCgpLAorCQkJCWpvaW5Db2x1bW4KKwkJCSk7CisKKwkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRFZGl0UHJpbWFyeUtleUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkpOworCX0KKworCXByaXZhdGUgdm9pZCBlZGl0UHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKKwkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihzdGF0ZU9iamVjdC5nZXRKb2luQ29sdW1uKCkpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCXN1cGVyLmluaXRpYWxpemUoKTsKKwkJam9pbkNvbHVtbkhvbGRlciA9IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Ib2xkZXIoKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQkvLyBQcmltYXJ5IEtleSBKb2luIENvbHVtbnMgZ3JvdXAgcGFuZQorCQlHcm91cCBncm91cFBhbmUgPSBhZGRUaXRsZWRHcm91cCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9wcmltYXJ5S2V5Sm9pbkNvbHVtbgorCQkpOworCisJCS8vIE92ZXJyaWRlIERlZmF1bHQgY2hlY2sgYm94CisJCUJ1dHRvbiBidXR0b24gPSBhZGRDaGVja0JveCgKKwkJCWFkZFN1YlBhbmUoZ3JvdXBQYW5lLCA4KSwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsCisJCQlidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSwKKwkJCW51bGwKKwkJKTsKKworCQlpbnN0YWxsT3ZlcnJpZGVEZWZhdWx0QnV0dG9uRW5hYmxlcihidXR0b24pOworCisJCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBsaXN0IHBhbmUKKwkJQWRkUmVtb3ZlTGlzdFBhbmU8U2Vjb25kYXJ5VGFibGU+IGpvaW5Db2x1bW5zUGFuZSA9IG5ldyBBZGRSZW1vdmVMaXN0UGFuZTxTZWNvbmRhcnlUYWJsZT4oCisJCQl0aGlzLAorCQkJZ3JvdXBQYW5lLAorCQkJYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbkFkYXB0ZXIoKSwKKwkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdE1vZGVsKCksCisJCQlqb2luQ29sdW1uSG9sZGVyLAorCQkJYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fVEFCTEVfQ09MVU1OUworCQkpOworCisJCWluc3RhbGxQcmltYXJ5S2V5Sm9pbkNvbHVtbkxpc3RQYW5lRW5hYmxlcihqb2luQ29sdW1uc1BhbmUpOworCX0KKworCXByaXZhdGUgdm9pZCBpbnN0YWxsT3ZlcnJpZGVEZWZhdWx0QnV0dG9uRW5hYmxlcihCdXR0b24gb3ZlcnJpZGVEZWZhdWx0QnV0dG9uKSB7CisJCVNXVFRvb2xzLmNvbnRyb2xFbmFibGVkU3RhdGUoYnVpbGRDb250cm9sQm9vbGVhbkhvbGRlcigpLCBvdmVycmlkZURlZmF1bHRCdXR0b24pOworCX0KKworCXByaXZhdGUgdm9pZCBpbnN0YWxsUHJpbWFyeUtleUpvaW5Db2x1bW5MaXN0UGFuZUVuYWJsZXIoQWRkUmVtb3ZlTGlzdFBhbmU8U2Vjb25kYXJ5VGFibGU+IHBrSm9pbkNvbHVtbkxpc3RQYW5lKSB7CisKKwkJbmV3IFBhbmVFbmFibGVyKAorCQkJYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCksCisJCQlwa0pvaW5Db2x1bW5MaXN0UGFuZQorCQkpOworCX0KKworCXByaXZhdGUgdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7CisJCWludFtdIHNlbGVjdGVkSW5kaWNlcyA9IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKTsKKworCQlmb3IgKGludCBpbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7IC0taW5kZXggPj0gMDsgKSB7CisJCQlnZXRTdWJqZWN0KCkucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlSm9pbkNvbHVtbnMoYm9vbGVhbiBzZWxlY3RlZCkgeworCisJCWlmIChpc1BvcHVsYXRpbmcoKSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJc2V0UG9wdWxhdGluZyh0cnVlKTsKKworCQl0cnkgeworCQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRTdWJqZWN0KCk7CisKKwkJCS8vIEFkZCBhIGpvaW4gY29sdW1uIGJ5IGNyZWF0aW5nIGEgc3BlY2lmaWVkIG9uZSB1c2luZyB0aGUgZGVmYXVsdAorCQkJLy8gb25lIGlmIGl0IGV4aXN0cworCQkJaWYgKHNlbGVjdGVkKSB7CisKKwkJCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IHNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOworCisJCQkJaWYgKGRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOworCQkJCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKKworCQkJCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSBzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKKwkJCQkJcGtKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoY29sdW1uTmFtZSk7CisJCQkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7CisKKwkJCQkJam9pbkNvbHVtbkhvbGRlci5zZXRWYWx1ZShwa0pvaW5Db2x1bW4pOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCWZvciAoaW50IGluZGV4ID0gc2Vjb25kYXJ5VGFibGUuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOyAtLWluZGV4ID49IDA7ICkgeworCQkJCQlzZWNvbmRhcnlUYWJsZS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbmRleCk7CisJCQkJfQorCQkJfQorCQl9CisJCWZpbmFsbHkgeworCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIGNsYXNzIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIgZXh0ZW5kcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHsKKworCQlwdWJsaWMgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpIHsKKwkJCXN1cGVyKGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7CisJCQlpZiAoZ2V0U3ViamVjdCgpID09IG51bGwpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJCX0KKwkJCXJldHVybiAhZ2V0U3ViamVjdCgpLmlzVmlydHVhbCgpICYmIGxpc3RIb2xkZXIuc2l6ZSgpID4gMDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKKwkJCXVwZGF0ZUpvaW5Db2x1bW5zKHZhbHVlKTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1F1ZXJpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUXVlcmllc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMzYxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1F1ZXJpZXNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDMwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnlDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7CisKKy8qKgorICogVGhpcyBwYW5lIHNob3dzIHRoZSBsaXN0IG9mIG5hbWVkIHF1ZXJpZXMgYW5kIG5hbWVkIG5hdGl2ZSBxdWVyaWVzLgorICogPHA+CisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSBvciBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVudGl0eQorICogQHNlZSBRdWVyeQorICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJ5CisgKiBAc2VlIE5hbWVkUXVlcnkKKyAqIEBzZWUgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUKKyAqIEBzZWUgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBRdWVyaWVzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxRdWVyeUNvbnRhaW5lcj4KK3sKKwlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lPFF1ZXJ5Q29udGFpbmVyPiBsaXN0UGFuZTsKKwlwcml2YXRlIE5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSBuYW1lZE5hdGl2ZVF1ZXJ5UGFuZTsKKwlwcml2YXRlIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSBuYW1lZFF1ZXJ5UGFuZTsKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5PiBxdWVyeUhvbGRlcjsKKworCQorCXB1YmxpYyBRdWVyaWVzQ29tcG9zaXRlKAorCQlQYW5lPD8+IHBhcmVudFBhbmUsIAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFF1ZXJ5Q29udGFpbmVyPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgYWRkUXVlcnkoKSB7CisJCWFkZFF1ZXJ5RnJvbURpYWxvZyhidWlsZEFkZFF1ZXJ5RGlhbG9nKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgQWRkUXVlcnlEaWFsb2cgYnVpbGRBZGRRdWVyeURpYWxvZygpIHsKKwkJcmV0dXJuIG5ldyBBZGRRdWVyeURpYWxvZyhnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkUXVlcnlGcm9tRGlhbG9nKEFkZFF1ZXJ5RGlhbG9nIGRpYWxvZykgeworCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgcXVlcnlUeXBlID0gZGlhbG9nLmdldFF1ZXJ5VHlwZSgpOworCQlRdWVyeSBxdWVyeTsKKwkJaWYgKHF1ZXJ5VHlwZSA9PSBRdWVyeS5OQU1FRF9RVUVSWSkgeworCQkJcXVlcnkgPSB0aGlzLmdldFN1YmplY3QoKS5hZGROYW1lZFF1ZXJ5KGdldFN1YmplY3QoKS5uYW1lZFF1ZXJpZXNTaXplKCkpOworCQl9CisJCWVsc2UgaWYgKHF1ZXJ5VHlwZSA9PSBRdWVyeS5OQU1FRF9OQVRJVkVfUVVFUlkpIHsKKwkJCXF1ZXJ5ID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkTmFtZWROYXRpdmVRdWVyeShnZXRTdWJqZWN0KCkubmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpKTsKKwkJfQorCQllbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfQorCQlxdWVyeS5zZXROYW1lKGRpYWxvZy5nZXROYW1lKCkpOworCQl0aGlzLnF1ZXJ5SG9sZGVyLnNldFZhbHVlKHF1ZXJ5KTsvL3NvIHRoYXQgaXQgZ2V0cyBzZWxlY3RlZCBpbiB0aGUgTGlzdCBmb3IgdGhlIHVzZXIgdG8gZWRpdAorCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UXVlcnk+IGJ1aWxkRGlzcGxheWFibGVRdWVyaWVzTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UXVlcnk+KAorCQkJYnVpbGRRdWVyaWVzTGlzdEhvbGRlcigpLAorCQkJUXVlcnkuTkFNRV9QUk9QRVJUWQorCQkpOworCX0KKwkKKwlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lPFF1ZXJ5Q29udGFpbmVyPiBhZGRMaXN0UGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZTxRdWVyeUNvbnRhaW5lcj4oCisJCQl0aGlzLAorCQkJY29udGFpbmVyLAorCQkJYnVpbGRRdWVyaWVzQWRhcHRlcigpLAorCQkJYnVpbGREaXNwbGF5YWJsZVF1ZXJpZXNMaXN0SG9sZGVyKCksCisJCQl0aGlzLnF1ZXJ5SG9sZGVyLAorCQkJYnVpbGRRdWVyaWVzTGlzdExhYmVsUHJvdmlkZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfTkFNRURfUVVFUklFUworCQkpOworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8TmFtZWROYXRpdmVRdWVyeT4gYnVpbGROYW1lZE5hdGl2ZVF1ZXJpZXNMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFF1ZXJ5Q29udGFpbmVyLCBOYW1lZE5hdGl2ZVF1ZXJ5PigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCVF1ZXJ5Q29udGFpbmVyLk5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxOYW1lZE5hdGl2ZVF1ZXJ5PiBsaXN0SXRlcmF0b3JfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZWROYXRpdmVRdWVyaWVzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWVkTmF0aXZlUXVlcmllc1NpemUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxOYW1lZE5hdGl2ZVF1ZXJ5PiBidWlsZE5hbWVkTmF0aXZlUXVlcnlIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnksIE5hbWVkTmF0aXZlUXVlcnk+KHRoaXMucXVlcnlIb2xkZXIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIE5hbWVkTmF0aXZlUXVlcnkgdHJhbnNmb3JtXyhRdWVyeSB2YWx1ZSkgeworCQkJCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lZE5hdGl2ZVF1ZXJ5KSA/IChOYW1lZE5hdGl2ZVF1ZXJ5KSB2YWx1ZSA6IG51bGw7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxOYW1lZFF1ZXJ5PiBidWlsZE5hbWVkUXVlcmllc0xpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UXVlcnlDb250YWluZXIsIE5hbWVkUXVlcnk+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJUXVlcnlDb250YWluZXIuTkFNRURfUVVFUklFU19MSVNUKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8TmFtZWRRdWVyeT4gbGlzdEl0ZXJhdG9yXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWVkUXVlcmllcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lZFF1ZXJpZXNTaXplKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8TmFtZWRRdWVyeT4gYnVpbGROYW1lZFF1ZXJ5SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5LCBOYW1lZFF1ZXJ5Pih0aGlzLnF1ZXJ5SG9sZGVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBOYW1lZFF1ZXJ5IHRyYW5zZm9ybV8oUXVlcnkgdmFsdWUpIHsKKwkJCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgTmFtZWRRdWVyeSkgPyAoTmFtZWRRdWVyeSkgdmFsdWUgOiBudWxsOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgVHJhbnNmb3JtZXI8UXVlcnksIENvbnRyb2w+IGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPFF1ZXJ5LCBDb250cm9sPigpIHsKKwkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShRdWVyeSBxdWVyeSkgeworCisJCQkJaWYgKHF1ZXJ5ID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCisJCQkJaWYgKHF1ZXJ5IGluc3RhbmNlb2YgTmFtZWROYXRpdmVRdWVyeSkgeworCQkJCQlyZXR1cm4gUXVlcmllc0NvbXBvc2l0ZS50aGlzLm5hbWVkTmF0aXZlUXVlcnlQYW5lLmdldENvbnRyb2woKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gUXVlcmllc0NvbXBvc2l0ZS50aGlzLm5hbWVkUXVlcnlQYW5lLmdldENvbnRyb2woKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUXVlcmllc0FkYXB0ZXIoKSB7CisKKwkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7CisKKwkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCQkJCWFkZFF1ZXJ5KCk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgeworCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIE5hbWVkUXVlcnkpIHsKKwkJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVOYW1lZFF1ZXJ5KChOYW1lZFF1ZXJ5KSBpdGVtKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KChOYW1lZE5hdGl2ZVF1ZXJ5KSBpdGVtKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFF1ZXJ5PiBidWlsZFF1ZXJpZXNMaXN0SG9sZGVyKCkgeworCQlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBRdWVyeT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBRdWVyeT4+KCk7CisJCWxpc3QuYWRkKGJ1aWxkTmFtZWRRdWVyaWVzTGlzdEhvbGRlcigpKTsKKwkJbGlzdC5hZGQoYnVpbGROYW1lZE5hdGl2ZVF1ZXJpZXNMaXN0SG9sZGVyKCkpOworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBRdWVyeT4sIFF1ZXJ5PihsaXN0KTsKKwl9CisKKwlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkUXVlcmllc0xpc3RMYWJlbFByb3ZpZGVyKCkgeworCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJCVF1ZXJ5IHF1ZXJ5ID0gKFF1ZXJ5KSBlbGVtZW50OworCQkJCVN0cmluZyBuYW1lID0gcXVlcnkuZ2V0TmFtZSgpOworCisJCQkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJCQlpbnQgaW5kZXggPSAtMTsKKworCQkJCQlpZiAocXVlcnkgaW5zdGFuY2VvZiBOYW1lZFF1ZXJ5KSB7CisJCQkJCQlpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGdldFN1YmplY3QoKS5uYW1lZFF1ZXJpZXMoKSwgcXVlcnkpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihnZXRTdWJqZWN0KCkubmFtZWROYXRpdmVRdWVyaWVzKCksIHF1ZXJ5KTsKKwkJCQkJfQorCisJCQkJCW5hbWUgPSBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2Rpc3BsYXlTdHJpbmcsIGluZGV4KTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gbmFtZTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5PiBidWlsZFF1ZXJ5SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeT4oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgeworCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOworCQl0aGlzLmxpc3RQYW5lLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJc3VwZXIuaW5pdGlhbGl6ZSgpOworCQl0aGlzLnF1ZXJ5SG9sZGVyID0gYnVpbGRRdWVyeUhvbGRlcigpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCS8vIExpc3QgcGFuZQorCQl0aGlzLmxpc3RQYW5lID0gYWRkTGlzdFBhbmUoY29udGFpbmVyKTsKKworCQkvLyBQcm9wZXJ0eSBwYW5lCisJCVBhZ2VCb29rIHBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGNvbnRhaW5lciwgU1dULk5VTEwpOworCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKworCQkvLyBOYW1lZCBRdWVyeSBwcm9wZXJ0eSBwYW5lCisJCXRoaXMubmFtZWRRdWVyeVBhbmUgPSBuZXcgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlKAorCQkJdGhpcywKKwkJCWJ1aWxkTmFtZWRRdWVyeUhvbGRlcigpLAorCQkJcGFnZUJvb2sKKwkJKTsKKworCQkvLyBOYW1lZCBOYXRpdmUgUXVlcnkgcHJvcGVydHkgcGFuZQorCQl0aGlzLm5hbWVkTmF0aXZlUXVlcnlQYW5lID0gbmV3IE5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSgKKwkJCXRoaXMsCisJCQlidWlsZE5hbWVkTmF0aXZlUXVlcnlIb2xkZXIoKSwKKwkJCXBhZ2VCb29rCisJCSk7CisKKwkJaW5zdGFsbFBhbmVTd2l0Y2hlcihwYWdlQm9vayk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lU3dpdGNoZXIoUGFnZUJvb2sgcGFnZUJvb2spIHsKKwkJbmV3IENvbnRyb2xTd2l0Y2hlcih0aGlzLnF1ZXJ5SG9sZGVyLCBidWlsZFBhbmVUcmFuc2Zvcm1lcigpLCBwYWdlQm9vayk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUXVlcnlIaW50c0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9RdWVyeUhpbnRzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2NjhiYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUXVlcnlIaW50c0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMzM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZFF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeUhpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5Db2x1bW5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVRhYmxlUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgQWRkUmVtb3ZlVGFibGVQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIFF1ZXJ5CisgKiBAc2VlIFF1ZXJ5SGludAorICogQHNlZSBBZGRSZW1vdmVUYWJsZVBhbmUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAyLjAKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgUXVlcnlIaW50c0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8UXVlcnk+Cit7CisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUhpbnQ+IHF1ZXJ5SGludEhvbGRlcjsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UXVlcnlIaW50c0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIFF1ZXJ5SGludHNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgUXVlcnk+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIGNvbnRhaW5lcik7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5LCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFF1ZXJ5IHF1ZXJ5KSB7CisJCQkJcmV0dXJuIChxdWVyeSAhPSBudWxsKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIEFkYXB0ZXIgYnVpbGRRdWVyeUhpbnRBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IEFkZFJlbW92ZVRhYmxlUGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKKwkJCQlRdWVyeUhpbnQgcXVlcnlIaW50ID0gZ2V0U3ViamVjdCgpLmFkZEhpbnQoZ2V0U3ViamVjdCgpLmhpbnRzU2l6ZSgpKTsKKwkJCQlxdWVyeUhpbnRIb2xkZXIuc2V0VmFsdWUocXVlcnlIaW50KTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7CisJCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7CisJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVIaW50KChRdWVyeUhpbnQpIGl0ZW0pOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5SGludD4gYnVpbGRRdWVyeUhpbnRIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5SGludD4oKTsKKwl9OworCisJcHJpdmF0ZSBJVGFibGVMYWJlbFByb3ZpZGVyIGJ1aWxkUXVlcnlIaW50TGFiZWxQcm92aWRlcigpIHsKKwkJcmV0dXJuIG5ldyBUYWJsZUxhYmVsUHJvdmlkZXIoKTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFF1ZXJ5SGludD4gYnVpbGRRdWVyeUhpbnRMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFF1ZXJ5LCBRdWVyeUhpbnQ+KGdldFN1YmplY3RIb2xkZXIoKSwgTmFtZWRRdWVyeS5ISU5UU19MSVNUKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UXVlcnlIaW50PiBsaXN0SXRlcmF0b3JfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LmhpbnRzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKwkJCQlyZXR1cm4gc3ViamVjdC5oaW50c1NpemUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisJCXF1ZXJ5SGludEhvbGRlciA9IGJ1aWxkUXVlcnlIaW50SG9sZGVyKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJVGFibGVQYW5lIHRhYmxlUGFuZSA9IG5ldyBUYWJsZVBhbmUoY29udGFpbmVyKTsKKwkJaW5zdGFsbFBhbmVFbmFibGVyKHRhYmxlUGFuZSk7CisJfQorCisJcHJpdmF0ZSBQYW5lRW5hYmxlciBpbnN0YWxsUGFuZUVuYWJsZXIoVGFibGVQYW5lIHRhYmxlUGFuZSkgeworCQlyZXR1cm4gbmV3IFBhbmVFbmFibGVyKGJ1aWxkUGFuZUVuYWJsZUhvbGRlcigpLCB0YWJsZVBhbmUpOworCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIFF1ZXJ5SGludENvbHVtbkFkYXB0ZXIgaW1wbGVtZW50cyBDb2x1bW5BZGFwdGVyPFF1ZXJ5SGludD4geworCisJCXN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gMjsKKwkJc3RhdGljIGZpbmFsIGludCBOQU1FX0NPTFVNTl9JTkRFWCA9IDA7CisJCXN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfQ09MVU1OX0lOREVYID0gMTsKKworCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKFF1ZXJ5SGludCBzdWJqZWN0KSB7CisJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxRdWVyeUhpbnQsIFN0cmluZz4oUXVlcnlIaW50Lk5BTUVfUFJPUEVSVFksIHN1YmplY3QpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOworCQkJCX0KKwkJCX07CisJCX0KKworCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IGJ1aWxkVmFsdWVIb2xkZXIoUXVlcnlIaW50IHN1YmplY3QpIHsKKwkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFF1ZXJ5SGludCwgU3RyaW5nPihRdWVyeUhpbnQuVkFMVUVfUFJPUEVSVFksIHN1YmplY3QpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRWYWx1ZSgpOworCQkJCX0KKworCQkJCUBPdmVycmlkZQorCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJCQkJc3ViamVjdC5zZXRWYWx1ZSh2YWx1ZSk7CisJCQkJfQorCQkJfTsKKwkJfQorCisJCXB1YmxpYyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGNlbGxNb2RlbHMoUXVlcnlIaW50IHN1YmplY3QpIHsKKwkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gbW9kZWxzID0gbmV3IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W0NPTFVNTl9DT1VOVF07CisJCQltb2RlbHNbTkFNRV9DT0xVTU5fSU5ERVhdICA9IGJ1aWxkTmFtZUhvbGRlcihzdWJqZWN0KTsKKwkJCW1vZGVsc1tWQUxVRV9DT0xVTU5fSU5ERVhdID0gYnVpbGRWYWx1ZUhvbGRlcihzdWJqZWN0KTsKKwkJCXJldHVybiBtb2RlbHM7CisJCX0KKworCQlwdWJsaWMgaW50IGNvbHVtbkNvdW50KCkgeworCQkJcmV0dXJuIENPTFVNTl9DT1VOVDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgY29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKKworCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgeworCQkJCWNhc2UgUXVlcnlIaW50Q29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTl9JTkRFWDogeworCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUXVlcnlIaW50c0NvbXBvc2l0ZV9uYW1lQ29sdW1uOworCQkJCX0KKworCQkJCWNhc2UgUXVlcnlIaW50Q29sdW1uQWRhcHRlci5WQUxVRV9DT0xVTU5fSU5ERVg6IHsKKwkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlF1ZXJ5SGludHNDb21wb3NpdGVfdmFsdWVDb2x1bW47CisJCQkJfQorCisJCQkJZGVmYXVsdDogeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIGNsYXNzIFRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgeworCisJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CisKKwkJCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSAoUXVlcnlIaW50KSBlbGVtZW50OworCQkJU3RyaW5nIHZhbHVlID0gIiI7CisKKwkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKKwkJCQljYXNlIFF1ZXJ5SGludENvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU5fSU5ERVg6IHsKKwkJCQkJdmFsdWUgPSBxdWVyeUhpbnQuZ2V0TmFtZSgpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIFF1ZXJ5SGludENvbHVtbkFkYXB0ZXIuVkFMVUVfQ09MVU1OX0lOREVYOiB7CisJCQkJCXZhbHVlID0gcXVlcnlIaW50LmdldFZhbHVlKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCQl2YWx1ZSA9ICIiOworCQkJfQorCisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKwl9CisKKwlwcml2YXRlIGNsYXNzIFRhYmxlUGFuZSBleHRlbmRzIEFkZFJlbW92ZVRhYmxlUGFuZTxRdWVyeT4geworCisJCXByaXZhdGUgVGFibGVQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCXN1cGVyKFF1ZXJ5SGludHNDb21wb3NpdGUudGhpcywKKwkJCSAgICAgIHBhcmVudCwKKwkJCSAgICAgIGJ1aWxkUXVlcnlIaW50QWRhcHRlcigpLAorCQkJICAgICAgYnVpbGRRdWVyeUhpbnRMaXN0SG9sZGVyKCksCisJCQkgICAgICBxdWVyeUhpbnRIb2xkZXIsCisJCQkgICAgICBidWlsZFF1ZXJ5SGludExhYmVsUHJvdmlkZXIoKSk7CisJCX0KKworCQlwcml2YXRlIENlbGxFZGl0b3JbXSBidWlsZENlbGxFZGl0b3JzKFRhYmxlIHRhYmxlKSB7CisJCQlyZXR1cm4gbmV3IENlbGxFZGl0b3JbXSB7CisJCQkJbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKSwKKwkJCQluZXcgVGV4dENlbGxFZGl0b3IodGFibGUpCisJCQl9OworCQl9CisKKwkJcHJpdmF0ZSBJQ2VsbE1vZGlmaWVyIGJ1aWxkQ2VsbE1vZGlmaWVyKCkgeworCQkJcmV0dXJuIG5ldyBJQ2VsbE1vZGlmaWVyKCkgeworCisJCQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCisJCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7CisJCQkJCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSAoUXVlcnlIaW50KSBlbGVtZW50OworCQkJCQlTdHJpbmcgdmFsdWUgPSAiIjsKKworCQkJCQlpZiAocHJvcGVydHkgPT0gUXVlcnlIaW50Lk5BTUVfUFJPUEVSVFkpIHsKKwkJCQkJCXZhbHVlID0gcXVlcnlIaW50LmdldE5hbWUoKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwcm9wZXJ0eSA9PSBRdWVyeUhpbnQuVkFMVUVfUFJPUEVSVFkpIHsKKwkJCQkJCXZhbHVlID0gcXVlcnlIaW50LmdldFZhbHVlKCk7CisJCQkJCX0KKworCQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJCQkJdmFsdWUgPSAiIjsKKwkJCQkJfQorCisJCQkJCXJldHVybiB2YWx1ZTsKKwkJCQl9CisKKwkJCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7CisJCQkJCVF1ZXJ5SGludCBxdWVyeUhpbnQ7CisKKwkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKKwkJCQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSAoVGFibGVJdGVtKSBlbGVtZW50OworCQkJCQkJcXVlcnlIaW50ID0gKFF1ZXJ5SGludCkgdGFibGVJdGVtLmdldERhdGEoKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCXF1ZXJ5SGludCA9IChRdWVyeUhpbnQpIGVsZW1lbnQ7CisJCQkJCX0KKworCQkJCQlpZiAocHJvcGVydHkgPT0gUXVlcnlIaW50Lk5BTUVfUFJPUEVSVFkpIHsKKwkJCQkJCSBxdWVyeUhpbnQuc2V0TmFtZSh2YWx1ZS50b1N0cmluZygpKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwcm9wZXJ0eSA9PSBRdWVyeUhpbnQuVkFMVUVfUFJPUEVSVFkpIHsKKwkJCQkJCSBxdWVyeUhpbnQuc2V0VmFsdWUodmFsdWUudG9TdHJpbmcoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9OworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBDb2x1bW5BZGFwdGVyPD8+IGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKKwkJCXJldHVybiBuZXcgUXVlcnlIaW50Q29sdW1uQWRhcHRlcigpOworCQl9CisKKwkJcHJpdmF0ZSBTdHJpbmdbXSBidWlsZENvbHVtblByb3BlcnRpZXMoKSB7CisJCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKKwkJCQlRdWVyeUhpbnQuTkFNRV9QUk9QRVJUWSwKKwkJCQlRdWVyeUhpbnQuVkFMVUVfUFJPUEVSVFkKKwkJCX07CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJCXN1cGVyLmluaXRpYWxpemVNYWluQ29tcG9zaXRlKAorCQkJCWNvbnRhaW5lciwKKwkJCQlhZGFwdGVyLAorCQkJCWxpc3RIb2xkZXIsCisJCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAorCQkJCWxhYmVsUHJvdmlkZXIsCisJCQkJaGVscElkCisJCQkpOworCisJCQlUYWJsZSB0YWJsZSA9IGdldE1haW5Db250cm9sKCk7CisKKwkJCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKKwkJCXRhYmxlVmlld2VyLnNldENlbGxFZGl0b3JzKGJ1aWxkQ2VsbEVkaXRvcnModGFibGUpKTsKKwkJCXRhYmxlVmlld2VyLnNldENlbGxNb2RpZmllcihidWlsZENlbGxNb2RpZmllcigpKTsKKwkJCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMoYnVpbGRDb2x1bW5Qcm9wZXJ0aWVzKCkpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvU2Vjb25kYXJ5VGFibGVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvU2Vjb25kYXJ5VGFibGVEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDM5ZmEwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhCkBAIC0wLDAgKzEsNDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKKworLyoqCisgKiBDbGllbnRzIGNhbiB1c2UgdGhpcyBkaWFsb2cgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciBTZWNvbmRhcnlUYWJsZSBzZXR0aW5ncy4KKyAqIFVzZSB0aGUgZm9sbG93aW5nIG9uY2UgdGhlIGRpYWxvZyBpcyBjbG9zZWQ6CisgKiAgICAgQHNlZSAjZ2V0U2VsZWN0ZWRUYWJsZSgpCisgKiAgICAgQHNlZSAjZ2V0U2VsZWN0ZWRDYXRhbG9nKCkKKyAqICAgICBAc2VlICNnZXRTZWxlY3RlZFNjaGVtYSgpCisgKi8KK3B1YmxpYyBjbGFzcyBTZWNvbmRhcnlUYWJsZURpYWxvZyBleHRlbmRzIERpYWxvZyB7CisKKwlwcml2YXRlIGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdDsKKworCS8qKgorCSAqIHdoZW4gY3JlYXRpbmcgYSBuZXcgU2Vjb25kYXJ5VGFibGUsICdzZWNvbmRhcnlUYWJsZScgd2lsbCBiZSBudWxsCisJICovCisJcHJpdmF0ZSBmaW5hbCBTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0U2NoZW1hOworCQorCXByb3RlY3RlZCBDb21ibyB0YWJsZUNvbWJvOworCXByb3RlY3RlZCBDb21ibyBjYXRhbG9nQ29tYm87CisJcHJvdGVjdGVkIENvbWJvIHNjaGVtYUNvbWJvOworCisJLy8gdGhlc2UgdmFsdWVzIGFyZSBzZXQgdXBvbiBjbG9zZQorCXByaXZhdGUgU3RyaW5nIHNlbGVjdGVkVGFibGU7CisJcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWRTY2hlbWE7CisJcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWRDYXRhbG9nOworCisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCisKKwkvKioKKwkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBuZXcgc2Vjb25kYXJ5IHRhYmxlCisJICovCisJcHVibGljIFNlY29uZGFyeVRhYmxlRGlhbG9nKFNoZWxsIHBhcmVudCwgSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgZGVmYXVsdENhdGFsb2csIFN0cmluZyBkZWZhdWx0U2NoZW1hKSB7CisJCXRoaXMocGFyZW50LCBqcGFQcm9qZWN0LCBudWxsLCBkZWZhdWx0Q2F0YWxvZywgZGVmYXVsdFNjaGVtYSk7CisJfQorCisJLyoqCisJICogVXNlIHRoaXMgY29uc3RydWN0b3IgdG8gZWRpdCBhbiBleGlzdGluZyBzZWNvbmRhcnkgdGFibGUKKwkgKi8KKwlwdWJsaWMgU2Vjb25kYXJ5VGFibGVEaWFsb2coU2hlbGwgcGFyZW50LCBKcGFQcm9qZWN0IGpwYVByb2plY3QsIFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7CisJCXRoaXMocGFyZW50LCBqcGFQcm9qZWN0LCBzZWNvbmRhcnlUYWJsZSwgc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdENhdGFsb2coKSwgc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwl9CisKKwkvKioKKwkgKiBpbnRlcm5hbCBjb25zdHJ1Y3RvcgorCSAqLworCXByb3RlY3RlZCBTZWNvbmRhcnlUYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsIEpwYVByb2plY3QganBhUHJvamVjdCwgU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUsIFN0cmluZyBkZWZhdWx0Q2F0YWxvZywgU3RyaW5nIGRlZmF1bHRTY2hlbWEpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKKwkJdGhpcy5zZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlOworCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gZGVmYXVsdENhdGFsb2c7CisJCXRoaXMuZGVmYXVsdFNjaGVtYSA9IGRlZmF1bHRTY2hlbWE7CisJfQorCisKKwkvLyAqKioqKioqKioqIG9wZW4gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxTaXplKCkgeworCQlQb2ludCBzaXplID0gc3VwZXIuZ2V0SW5pdGlhbFNpemUoKTsKKwkJc2l6ZS54ID0gdGhpcy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNTApOyAgLy8gPz8/CisJCXJldHVybiBzaXplOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7CisJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKKwkJc2hlbGwuc2V0VGV4dCh0aGlzLmdldFRpdGxlKCkpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGUoKSB7CisJCXJldHVybiAodGhpcy5zZWNvbmRhcnlUYWJsZSA9PSBudWxsKSA/CisJCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGRTZWNvbmRhcnlUYWJsZQorCQkJCQk6CisJCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0U2Vjb25kYXJ5VGFibGU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7CisJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7CisJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7CisKKwkJLy8gdGFibGUKKwkJTGFiZWwgdGFibGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJdGFibGVMYWJlbC5zZXRUZXh0KEpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX25hbWUpOworCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQl0YWJsZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCisJCXRoaXMudGFibGVDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJdGhpcy50YWJsZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCisJCS8vIGNhdGFsb2cKKwkJTGFiZWwgY2F0YWxvZ0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOworCQljYXRhbG9nTGFiZWwuc2V0VGV4dChKcHRVaURldGFpbHNNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19jYXRhbG9nKTsKKwkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJY2F0YWxvZ0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCisJCXRoaXMuY2F0YWxvZ0NvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkxFRlQpOworCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQl0aGlzLmNhdGFsb2dDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKworCQkvLyBzY2hlbWEKKwkJTGFiZWwgc2NoZW1hTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7CisJCXNjaGVtYUxhYmVsLnNldFRleHQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVEaWFsb2dfc2NoZW1hKTsKKwkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJc2NoZW1hTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisKKwkJdGhpcy5zY2hlbWFDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJdGhpcy5zY2hlbWFDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKworCQl0aGlzLmluaXRpYWxpemVDYXRhbG9nQ29tYm8oKTsKKwkJdGhpcy5pbml0aWFsaXplU2NoZW1hQ29tYm8oKTsKKwkJdGhpcy5pbml0aWFsaXplVGFibGVDb21ibygpOworCisJCXJldHVybiBjb21wb3NpdGU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKKworCQl0aGlzLnRhYmxlQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoYnVpbGRUYWJsZU1vZGlmeUxpc3RlbmVyKCkpOworCQl0aGlzLmNhdGFsb2dDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkQ2F0YWxvZ1NlbGVjdGlvbkxpc3RlbmVyKCkpOworCQl0aGlzLnNjaGVtYUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRTY2hlbWFTZWxlY3Rpb25MaXN0ZW5lcigpKTsKKwkJdGhpcy5yZWZyZXNoQnV0dG9ucygpOworCQlyZXR1cm4gY29tcG9zaXRlOworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYXRhbG9nQ29tYm8oKSB7CisJCXRoaXMucG9wdWxhdGVDYXRhbG9nQ29tYm8oKTsKKworCQlpZiAodGhpcy5pc0FkZERpYWxvZygpKSB7CisJCQl0aGlzLmNhdGFsb2dDb21iby5zZWxlY3QoMCk7ICAvLyBvdXQtb2YtYm91bmRzIGluZGV4IGlzIGlnbm9yZWQKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBzcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7CisJCQlpZiAoc3BlY2lmaWVkQ2F0YWxvZyA9PSBudWxsKSB7CisJCQkJdGhpcy5jYXRhbG9nQ29tYm8uc2VsZWN0KDApOyAgLy8gb3V0LW9mLWJvdW5kcyBpbmRleCBpcyBpZ25vcmVkCisJCQl9IGVsc2UgeworCQkJCXRoaXMuY2F0YWxvZ0NvbWJvLnNldFRleHQoc3BlY2lmaWVkQ2F0YWxvZyk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUNhdGFsb2dDb21ibygpIHsKKwkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmdldERhdGFiYXNlKCk7CisJCWlmICgoZGF0YWJhc2UgIT0gbnVsbCkgJiYgISBkYXRhYmFzZS5zdXBwb3J0c0NhdGFsb2dzKCkpIHsKKwkJCXRoaXMuY2F0YWxvZ0NvbWJvLnNldEVuYWJsZWQoZmFsc2UpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gYWRkIHRoZSBkZWZhdWx0IGNhdGFsb2cgZmlyc3QKKwkJaWYgKHRoaXMuZGVmYXVsdENhdGFsb2cgIT0gbnVsbCkgeworCQkJdGhpcy5jYXRhbG9nQ29tYm8uYWRkKE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRDYXRhbG9nLCB0aGlzLmRlZmF1bHRDYXRhbG9nKSk7CisJCX0KKworCQlpZiAoZGF0YWJhc2UgIT0gbnVsbCkgeworCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGRhdGFiYXNlLnNvcnRlZENhdGFsb2dJZGVudGlmaWVycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKKwkJCQl0aGlzLmNhdGFsb2dDb21iby5hZGQoc3RyZWFtLm5leHQoKSk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU2NoZW1hQ29tYm8oKSB7CisJCXRoaXMucG9wdWxhdGVTY2hlbWFDb21ibygpOworCisJCWlmICh0aGlzLmlzQWRkRGlhbG9nKCkpIHsKKwkJCXRoaXMuc2NoZW1hQ29tYm8uc2VsZWN0KDApOyAgLy8gb3V0LW9mLWJvdW5kcyBpbmRleCBpcyBpZ25vcmVkCisJCX0gZWxzZSB7CisJCQlTdHJpbmcgc3BlY2lmaWVkU2NoZW1hID0gdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKTsKKwkJCWlmIChzcGVjaWZpZWRTY2hlbWEgPT0gbnVsbCkgeworCQkJCXRoaXMuc2NoZW1hQ29tYm8uc2VsZWN0KDApOyAgLy8gb3V0LW9mLWJvdW5kcyBpbmRleCBpcyBpZ25vcmVkCisJCQl9IGVsc2UgeworCQkJCXRoaXMuc2NoZW1hQ29tYm8uc2V0VGV4dChzcGVjaWZpZWRTY2hlbWEpOworCQkJfQorCQl9CisJfQorCisJLy8gYXNzdW1lIHRoZSBjYXRhbG9nIGNvbWJvIGhhcyBiZWVuIHBvcHVsYXRlZCBieSBub3cKKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVNjaGVtYUNvbWJvKCkgeworCQkvLyBhZGQgdGhlIGRlZmF1bHQgc2NoZW1hIGZpcnN0CisJCWlmICh0aGlzLmRlZmF1bHRTY2hlbWEgIT0gbnVsbCkgeworCQkJdGhpcy5zY2hlbWFDb21iby5hZGQoTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdFNjaGVtYSwgdGhpcy5kZWZhdWx0U2NoZW1hKSk7CisJCX0KKworCQlTY2hlbWFDb250YWluZXIgc2MgPSB0aGlzLmdldEN1cnJlbnREYlNjaGVtYUNvbnRhaW5lcigpOworCQlpZiAoc2MgIT0gbnVsbCkgeworCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHNjLnNvcnRlZFNjaGVtYUlkZW50aWZpZXJzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJCXRoaXMuc2NoZW1hQ29tYm8uYWRkKHN0cmVhbS5uZXh0KCkpOworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlQ29tYm8oKSB7CisJCXRoaXMucG9wdWxhdGVUYWJsZUNvbWJvKCk7CisKKwkJaWYgKHRoaXMuaXNFZGl0RGlhbG9nKCkpIHsKKwkJCVN0cmluZyBzcGVjaWZpZWROYW1lID0gdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCk7CisJCQlpZiAoc3BlY2lmaWVkTmFtZSAhPSBudWxsKSB7CisJCQkJdGhpcy50YWJsZUNvbWJvLnNldFRleHQoc3BlY2lmaWVkTmFtZSk7CisJCQl9CisJCX0KKwl9CisKKwkvLyBhc3N1bWUgdGhlIHNjaGVtYSBjb21ibyBoYXMgYmVlbiBwb3B1bGF0ZWQgYnkgbm93CisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVUYWJsZUNvbWJvKCkgeworCQkvLyB3ZSBkb24ndCBuZWVkIHRvIGFkZCBhICJkZWZhdWx0IiB0byB0aGUgdGFibGUgY29tYm8KKwkJU2NoZW1hIGRiU2NoZW1hID0gdGhpcy5nZXRDdXJyZW50RGJTY2hlbWEoKTsKKwkJaWYgKGRiU2NoZW1hICE9IG51bGwpIHsKKwkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBkYlNjaGVtYS5zb3J0ZWRUYWJsZUlkZW50aWZpZXJzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJCXRoaXMudGFibGVDb21iby5hZGQoc3RyZWFtLm5leHQoKSk7CisJCQl9CisJCX0KKwl9CisKKworCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKKworCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZENhdGFsb2dTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJU2Vjb25kYXJ5VGFibGVEaWFsb2cudGhpcy5zZWxlY3RlZENhdGFsb2dDaGFuZ2VkKCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCVNlY29uZGFyeVRhYmxlRGlhbG9nLnRoaXMuc2VsZWN0ZWRDYXRhbG9nQ2hhbmdlZCgpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiY2F0YWxvZyBzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2VsZWN0ZWRDYXRhbG9nQ2hhbmdlZCgpIHsKKwkJdGhpcy5yZWZyZXNoU2NoZW1hQ29tYm8oKTsKKwkJdGhpcy5yZWZyZXNoVGFibGVDb21ibygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTY2hlbWFDb21ibygpIHsKKwkJU3RyaW5nIHNjaGVtYSA9IHRoaXMuc2NoZW1hQ29tYm8uZ2V0VGV4dCgpOworCQl0aGlzLnNjaGVtYUNvbWJvLnJlbW92ZUFsbCgpOworCQl0aGlzLnBvcHVsYXRlU2NoZW1hQ29tYm8oKTsKKwkJdGhpcy5zY2hlbWFDb21iby5zZXRUZXh0KHNjaGVtYSk7CisJfQorCisJcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU2NoZW1hU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQkJCVNlY29uZGFyeVRhYmxlRGlhbG9nLnRoaXMuc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCVNlY29uZGFyeVRhYmxlRGlhbG9nLnRoaXMuc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJzY2hlbWEgc2VsZWN0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KKworCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkU2NoZW1hQ2hhbmdlZCgpIHsKKwkJdGhpcy5yZWZyZXNoVGFibGVDb21ibygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hUYWJsZUNvbWJvKCkgeworCQlTdHJpbmcgdGFibGUgPSB0aGlzLnRhYmxlQ29tYm8uZ2V0VGV4dCgpOworCQl0aGlzLnRhYmxlQ29tYm8ucmVtb3ZlQWxsKCk7CisJCXRoaXMucG9wdWxhdGVUYWJsZUNvbWJvKCk7CisJCXRoaXMudGFibGVDb21iby5zZXRUZXh0KHRhYmxlKTsKKwl9CisKKwlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgYnVpbGRUYWJsZU1vZGlmeUxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgeworCQkJCVNlY29uZGFyeVRhYmxlRGlhbG9nLnRoaXMudGFibGVDaGFuZ2VkKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJ0YWJsZSBtb2RpZnkgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdGFibGVDaGFuZ2VkKCkgeworCQl0aGlzLnJlZnJlc2hCdXR0b25zKCk7CisJfQorCisJLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKKworCXByb3RlY3RlZCBib29sZWFuIGlzQWRkRGlhbG9nKCkgeworCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZSA9PSBudWxsOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdERpYWxvZygpIHsKKwkJcmV0dXJuICEgdGhpcy5pc0FkZERpYWxvZygpOworCX0KKworCXByb3RlY3RlZCBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKKwkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXREYXRhU291cmNlKCkuZ2V0RGF0YWJhc2UoKTsKKwl9CisKKwlwcm90ZWN0ZWQgU2NoZW1hQ29udGFpbmVyIGdldEN1cnJlbnREYlNjaGVtYUNvbnRhaW5lcigpIHsKKwkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmdldERhdGFiYXNlKCk7CisJCWlmIChkYXRhYmFzZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoICEgZGF0YWJhc2Uuc3VwcG9ydHNDYXRhbG9ncygpKSB7CisJCQlyZXR1cm4gZGF0YWJhc2U7CisJCX0KKwkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldEN1cnJlbnRDYXRhbG9nKCk7CisJCXJldHVybiAoY2F0YWxvZyA9PSBudWxsKSA/IG51bGwgOiBkYXRhYmFzZS5nZXRDYXRhbG9nRm9ySWRlbnRpZmllcihjYXRhbG9nKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEN1cnJlbnRDYXRhbG9nKCkgeworCQlpZiAoKHRoaXMuZGVmYXVsdENhdGFsb2cgIT0gbnVsbCkgJiYgKHRoaXMuY2F0YWxvZ0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkpIHsKKwkJCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOworCQl9CisJCXJldHVybiBjb252ZXJ0VGV4dCh0aGlzLmNhdGFsb2dDb21ibyk7CisJfQorCisJcHJvdGVjdGVkIFNjaGVtYSBnZXRDdXJyZW50RGJTY2hlbWEoKSB7CisJCVN0cmluZyBzY2hlbWEgPSB0aGlzLmdldEN1cnJlbnRTY2hlbWEoKTsKKwkJaWYgKHNjaGVtYSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlTY2hlbWFDb250YWluZXIgc2MgPSB0aGlzLmdldEN1cnJlbnREYlNjaGVtYUNvbnRhaW5lcigpOworCQlyZXR1cm4gKHNjID09IG51bGwpID8gbnVsbCA6IHNjLmdldFNjaGVtYUZvcklkZW50aWZpZXIoc2NoZW1hKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEN1cnJlbnRTY2hlbWEoKSB7CisJCWlmICgodGhpcy5kZWZhdWx0U2NoZW1hICE9IG51bGwpICYmICh0aGlzLnNjaGVtYUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkpIHsKKwkJCXJldHVybiB0aGlzLmRlZmF1bHRTY2hlbWE7CisJCX0KKwkJcmV0dXJuIGNvbnZlcnRUZXh0KHRoaXMuc2NoZW1hQ29tYm8pOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQnV0dG9ucygpIHsKKwkJdGhpcy5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZCh0aGlzLnZhbGlkYXRlRW50cnlWYWx1ZXMoKSk7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVFbnRyeVZhbHVlcygpIHsKKwkJcmV0dXJuICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnRhYmxlQ29tYm8uZ2V0VGV4dCgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogY2xvc2UgKioqKioqKioqKgorCisJLyoqCisJICogc2V0IGFsbCB0aGUgdmFyaW91cyB2YWx1ZXMgcXVlcmllZCBieSBjbGllbnRzIG9uY2UgdGhlIGRpYWxvZyBpcyBjbG9zZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKKwkJdGhpcy5zZWxlY3RlZFRhYmxlID0gdGhpcy50YWJsZUNvbWJvLmdldFRleHQoKTsKKwkJdGhpcy5zZWxlY3RlZENhdGFsb2cgPSBjb252ZXJ0VGV4dCh0aGlzLmNhdGFsb2dDb21ibywgdGhpcy5kZWZhdWx0Q2F0YWxvZyk7CisJCXRoaXMuc2VsZWN0ZWRTY2hlbWEgPSBjb252ZXJ0VGV4dCh0aGlzLnNjaGVtYUNvbWJvLCB0aGlzLmRlZmF1bHRTY2hlbWEpOworCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKKwl9CisKKwkvKioKKwkgKiByZXR1cm4gbnVsbCBpZjoKKwkgKiAgIC0gdGhlIGRlZmF1bHQgdmFsdWUgaXMgc2VsZWN0ZWQKKwkgKiAgIC0gdGhlIGNvbWJvJ3MgdGV4dCBpcyBlbXB0eQorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUZXh0KENvbWJvIGNvbWJvLCBTdHJpbmcgZGVmYXVsdFRleHQpIHsKKwkJLy8gaWYgdGhlIGRlZmF1bHQgdGV4dCBpcyBwcmVzZW50LCB0aGVuIGl0IHdpbGwgYmUgdGhlIGNvbWJvJ3MgZmlyc3Qgc2VsZWN0aW9uCisJCWlmICgoZGVmYXVsdFRleHQgIT0gbnVsbCkgJiYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBjb252ZXJ0VGV4dChjb21ibyk7CisJfQorCisJLyoqCisJICogcmV0dXJuIG51bGwgaWYgdGhlIGNvbWJvJ3MgdGV4dCBpcyBlbXB0eQorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUZXh0KENvbWJvIGNvbWJvKSB7CisJCVN0cmluZyB0ZXh0ID0gY29tYm8uZ2V0VGV4dCgpOworCQlyZXR1cm4gKHRleHQubGVuZ3RoKCkgPT0gMCkgPyBudWxsIDogdGV4dDsKKwl9CisKKworCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNlbGVjdGVkIHRhYmxlLiBSZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGlmIG5vdGhpbmcKKwkgKiBpcyBzZWxlY3RlZCAoc2luY2UgdGhlcmUgaXMgbm8gZGVmYXVsdCkuCisJICovCisJcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZFRhYmxlKCkgeworCQlyZXR1cm4gdGhpcy5zZWxlY3RlZFRhYmxlOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgc2VsZWN0ZWQgY2F0YWxvZy4gUmV0dXJuIG51bGwgaWYgZWl0aGVyIG5vdGhpbmcgb3IKKwkgKiB0aGUgZGVmYXVsdCBjYXRhbG9nIGlzIHNlbGVjdGVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRDYXRhbG9nKCkgeworCQlyZXR1cm4gdGhpcy5zZWxlY3RlZENhdGFsb2c7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBzZWxlY3RlZCBzY2hlbWEuIFJldHVybiBudWxsIGlmIGVpdGhlciBub3RoaW5nIG9yCisJICogdGhlIGRlZmF1bHQgc2NoZW1hIGlzIHNlbGVjdGVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLnNlbGVjdGVkU2NoZW1hOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NzllOTcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1NlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3JDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TZXF1ZW5jZUNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBOYW1lOiAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBTZXF1ZW5jZSBHZW5lcmF0b3I6IHwgU2VxdWVuY2VDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCBBbGxvY2F0aW9uIFNpemU6ICAgIHwgSSAgICAgICB8SXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCBJbml0aWFsIFZhbHVlOiAgICAgIHwgICAgICAgICB8SXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgSWRNYXBwaW5nCisgKiBAc2VlIFNlcXVlbmNlR2VuZXJhdG9yCisgKiBAc2VlIElkTWFwcGluZ0dlbmVyYXRpb25Db21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBTZXF1ZW5jZUNvbWJvCisgKgorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSBleHRlbmRzIEdlbmVyYXRvckNvbXBvc2l0ZTxTZXF1ZW5jZUdlbmVyYXRvcj4KK3sKKwkKKwlwdWJsaWMgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAorICAgICAgICAJCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFNlcXVlbmNlR2VuZXJhdG9yPiBzdWJqZWN0SG9sZGVyLAorICAgICAgICAJCQkJCQkJQ29tcG9zaXRlIHBhcmVudCwKKyAgICAgICAgCQkJCQkJCUdlbmVyYXRvckJ1aWxkZXI8U2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkZXIpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGJ1aWxkZXIpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgeworCQlyZXR1cm4gR2VuZXJhdG9yQ29udGFpbmVyLlNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQkvLyBOYW1lIHdpZGdldHMKKwkJYWRkTGFiZWxlZFRleHQoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9uYW1lLAorCQkJYnVpbGRHZW5lcmF0b3JOYW1lSG9sZGVyKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9OQU1FCisJCSk7CisKKwkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIHdpZGdldHMKKwkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NlcXVlbmNlLAorCQkJYnVpbGRTZXF1ZW5jZU5hbWVDb21ibyhjb250YWluZXIpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1JfU0VRVUVOQ0UKKwkJKTsKKworCQlhZGRBbGxvY2F0aW9uU2l6ZUNvbWJvKGNvbnRhaW5lcik7CisJCWFkZEluaXRpYWxWYWx1ZUNvbWJvKGNvbnRhaW5lcik7CisJfQorCisJcHJvdGVjdGVkIFNlcXVlbmNlQ29tYm88U2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VOYW1lQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXJldHVybiBuZXcgU2VxdWVuY2VDb21ibzxTZXF1ZW5jZUdlbmVyYXRvcj4odGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBwYXJlbnQpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChTZXF1ZW5jZUdlbmVyYXRvci5ERUZBVUxUX1NFUVVFTkNFX05BTUVfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFNlcXVlbmNlR2VuZXJhdG9yLlNQRUNJRklFRF9TRVFVRU5DRV9OQU1FX1BST1BFUlRZKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFNlcXVlbmNlTmFtZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQkJCXJldHJpZXZlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKHZhbHVlKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgeworCQkJCXJldHVybiAoZ2V0U3ViamVjdCgpID09IG51bGwpID8gbnVsbCA6IGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBudWxsU3ViamVjdElzQWxsb3dlZCgpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKworCQkJLyoqCisJCQkgKiBzdWJqZWN0IG1heSBiZSBudWxsLCBzbyBkZWxlZ2F0ZSB0byB0aGUgY29tcG9zaXRlCisJCQkgKi8KKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKKwkJCQlyZXR1cm4gU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5nZXRKcGFQcm9qZWN0KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFNjaGVtYSBnZXREYlNjaGVtYV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERiU2NoZW1hKCk7CisJCQl9CisKKwkJfTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1RhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1RhYmxlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkOTgzZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVGFibGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDIzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWFDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNhdGFsb2dDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5UYWJsZUNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IC0gVGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgfCBUYWJsZTogICB8IFRhYmxlQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCB8ICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgfCBDYXRhbG9nOiB8IENhdGFsb2dDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCB8ICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgfCBTY2hlbWE6ICB8IFNjaGVtYUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBUYWJsZQorICogQHNlZSBFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBUYWJsZUNvbWJvCisgKiBAc2VlIENhdGFsb2dDb21ibworICogQHNlZSBTY2hlbWFDb21ibworICoKKyAqIEBUT0RPIHJlcG9wdWxhdGUgdGhpcyBwYW5lbCBiYXNlZCBvbiB0aGUgRW50aXR5IHRhYmxlIGNoYW5naW5nCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBUYWJsZUNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEVudGl0eT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgVGFibGVDb21wb3NpdGUoRm9ybVBhbmU8PyBleHRlbmRzIEVudGl0eT4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCS8vIFRhYmxlIGdyb3VwIHBhbmUKKwkJR3JvdXAgdGFibGVHcm91cFBhbmUgPSBhZGRUaXRsZWRHcm91cCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlRhYmxlQ29tcG9zaXRlX3RhYmxlU2VjdGlvbgorCQkpOworCisJCVByb3BlcnR5VmFsdWVNb2RlbDxUYWJsZT4gc3ViamVjdEhvbGRlciA9IGJ1aWxkVGFibGVIb2xkZXIoKTsKKwkJLy8gVGFibGUgd2lkZ2V0cworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJdGFibGVHcm91cFBhbmUsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UYWJsZUNob29zZXJfbGFiZWwsCisJCQlhZGRUYWJsZUNvbWJvKHN1YmplY3RIb2xkZXIsIHRhYmxlR3JvdXBQYW5lKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9UQUJMRQorCQkpOworCisJCS8vIENhdGFsb2cgd2lkZ2V0cworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJdGFibGVHcm91cFBhbmUsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5DYXRhbG9nQ2hvb3Nlcl9sYWJlbCwKKwkJCWFkZENhdGFsb2dDb21ibyhzdWJqZWN0SG9sZGVyLCB0YWJsZUdyb3VwUGFuZSksCisJCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfQ0FUQUxPRworCQkpOworCisJCS8vIFNjaGVtYSB3aWRnZXRzCisJCWFkZExhYmVsZWRDb21wb3NpdGUoCisJCQl0YWJsZUdyb3VwUGFuZSwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlNjaGVtYUNob29zZXJfbGFiZWwsCisJCQlhZGRTY2hlbWFDb21ibyhzdWJqZWN0SG9sZGVyLCB0YWJsZUdyb3VwUGFuZSksCisJCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfU0NIRU1BCisJCSk7CisJCQorCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRUYWJsZUVuYWJsZWRIb2xkZXIoKSwgdGhpcyk7CisJfQorCQorCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYWJsZT4gYnVpbGRUYWJsZUhvbGRlcigpIHsKKwkJCisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgVGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlRBQkxFX0lTX1VOREVGSU5FRF9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgVGFibGUgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YWJsZUlzVW5kZWZpbmVkKCkgPyBudWxsIDogdGhpcy5zdWJqZWN0LmdldFRhYmxlKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRhYmxlRW5hYmxlZEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5TUEVDSUZJRURfVEFCTEVfSVNfQUxMT1dFRF9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5zcGVjaWZpZWRUYWJsZUlzQWxsb3dlZCgpKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIENhdGFsb2dDb21ibzxUYWJsZT4gYWRkQ2F0YWxvZ0NvbWJvKFByb3BlcnR5VmFsdWVNb2RlbDxUYWJsZT4gdGFibGVIb2xkZXIsIENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IENhdGFsb2dDb21ibzxUYWJsZT4odGhpcywgdGFibGVIb2xkZXIsIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyh2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZENhdGFsb2coKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFNjaGVtYUNvbWJvPFRhYmxlPiBhZGRTY2hlbWFDb21ibyhQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGU+IHN1YmplY3RIb2xkZXIsIENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IFNjaGVtYUNvbWJvPFRhYmxlPih0aGlzLCBzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0U2NoZW1hKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFNjaGVtYSh2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFNjaGVtYSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXJfKCkgeworCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREYlNjaGVtYUNvbnRhaW5lcigpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgVGFibGVDb21ibzxUYWJsZT4gYWRkVGFibGVDb21ibyhQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGU+IHN1YmplY3RIb2xkZXIsIENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IFRhYmxlQ29tYm88VGFibGU+KHRoaXMsIHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfTkFNRV9QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQkJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOworCQkJCWlmIChwcm9wZXJ0eU5hbWUgPT0gVGFibGUuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkgCisJCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZS5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZCisJCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZS5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkKKwkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZICkgeworCQkJCQlyZXBvcHVsYXRlKCk7CisJCQkJfQorCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0TmFtZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZE5hbWUodmFsdWUpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZE5hbWUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU2NoZW1hIGdldERiU2NoZW1hXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGJTY2hlbWEoKTsKKwkJCX0KKwkJfTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1RhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1RhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzM2ViOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVGFibGVHZW5lcmF0b3JDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDQ5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNhdGFsb2dDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5Db2x1bW5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5UYWJsZUNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBOYW1lOiAgICAgICAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBUYWJsZTogICAgICAgICAgICAgICAgICAgIHwgVGFibGVDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBDYXRhbG9nOiAgICAgICAgICAgICAgICAgIHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBTY2hlbWE6ICAgICAgICAgICAgICAgICAgIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBQcmltYXJ5IEtleSBDb2x1bW46ICAgICAgIHwgQ29sdW1uQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBWYWx1ZSBDb2x1bW46ICAgICAgICAgICAgIHwgQ29sdW1uQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBQcmltYXJ5IEtleSBDb2x1bW4gVmFsdWU6IHwgQ29sdW1uQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCBBbGxvY2F0aW9uIFNpemU6ICAgICAgICAgIHwgSSAgICAgICB8SXwgIERlZmF1bHQgKFhYKSAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCBJbml0aWFsIFZhbHVlOiAgICAgICAgICAgIHwgSSAgICAgICB8SXwgIERlZmF1bHQgKFhYKSAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgSWRNYXBwaW5nCisgKiBAc2VlIFRhYmxlR2VuZXJhdG9yCisgKiBAc2VlIElkTWFwcGluZ0dlbmVyYXRpb25Db21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBDYXRhbG9nQ29tYm8KKyAqIEBzZWUgQ29sdW1uQ29tYm8KKyAqIEBzZWUgU2NoZW1hQ29tYm8KKyAqIEBzZWUgVGFibGVDb21ibworICoKKyAqIEB2ZXJzaW9uIDIuMgorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUgZXh0ZW5kcyBHZW5lcmF0b3JDb21wb3NpdGU8VGFibGVHZW5lcmF0b3I+Cit7CisKKwkKKwlwdWJsaWMgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAorICAgICAgICAJCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFRhYmxlR2VuZXJhdG9yPiBzdWJqZWN0SG9sZGVyLAorICAgICAgICAJCQkJCQkJQ29tcG9zaXRlIHBhcmVudCwKKyAgICAgICAgCQkJCQkJCUdlbmVyYXRvckJ1aWxkZXI8VGFibGVHZW5lcmF0b3I+IGJ1aWxkZXIpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGJ1aWxkZXIpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgeworCQlyZXR1cm4gR2VuZXJhdG9yQ29udGFpbmVyLlRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWTsKKwl9CisKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQkvLyBOYW1lIHdpZGdldHMKKwkJYWRkTGFiZWxlZFRleHQoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9uYW1lLAorCQkJYnVpbGRHZW5lcmF0b3JOYW1lSG9sZGVyKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9OQU1FCisJCSk7CisKKwkJLy8gVGFibGUgd2lkZ2V0cworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdGFibGUsCisJCQlhZGRUYWJsZU5hbWVDb21ibyhjb250YWluZXIpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfVEFCTEUKKwkJKTsKKworCQkvLyBTY2hlbWEgd2lkZ2V0cworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfc2NoZW1hLAorCQkJYWRkU2NoZW1hQ29tYm8oY29udGFpbmVyKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1NDSEVNQQorCQkpOworCisJCS8vIENhdGFsb2cgd2lkZ2V0cworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfY2F0YWxvZywKKwkJCWFkZENhdGFsb2dDb21ibyhjb250YWluZXIpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfQ0FUQUxPRworCQkpOworCisJCS8vIFByaW1hcnkgS2V5IENvbHVtbiB3aWRnZXRzCisJCWFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtbiwKKwkJCWFkZFBrQ29sdW1uTmFtZUNvbWJvKGNvbnRhaW5lciksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9QUklNQVJZX0tFWV9DT0xVTU4KKwkJKTsKKworCQkvLyBWYWx1ZSBDb2x1bW4gd2lkZ2V0cworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdmFsdWVDb2x1bW4sCisJCQlhZGRWYWx1ZUNvbHVtbkNvbWJvKGNvbnRhaW5lciksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9WQUxVRV9DT0xVTU4KKwkJKTsKKworCQkvLyBQcmltYXJ5IEtleSBDb2x1bW4gVmFsdWUgd2lkZ2V0cworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfcGtDb2x1bW5WYWx1ZSwKKwkJCWFkZFBrQ29sdW1uVmFsdWVDb21ibyhjb250YWluZXIpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfUFJJTUFSWV9LRVlfQ09MVU1OX1ZBTFVFCisJCSk7CisKKwkJYWRkQWxsb2NhdGlvblNpemVDb21ibyhjb250YWluZXIpOworCQlhZGRJbml0aWFsVmFsdWVDb21ibyhjb250YWluZXIpOworCX0JCisKKwlwcml2YXRlIENhdGFsb2dDb21ibzxUYWJsZUdlbmVyYXRvcj4gYWRkQ2F0YWxvZ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IENhdGFsb2dDb21ibzxUYWJsZUdlbmVyYXRvcj4odGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRDYXRhbG9nKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gbnVsbFN1YmplY3RJc0FsbG93ZWQoKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCS8qKgorCQkJICogc3ViamVjdCBtYXkgYmUgbnVsbCwgc28gZGVsZWdhdGUgdG8gdGhlIGNvbXBvc2l0ZQorCQkJICovCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7CisJCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuZ2V0SnBhUHJvamVjdCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQkJCXJldHJpZXZlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyh2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZENhdGFsb2coKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIENvbHVtbkNvbWJvPFRhYmxlR2VuZXJhdG9yPiBhZGRQa0NvbHVtbk5hbWVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJcmV0dXJuIG5ldyBDb2x1bW5Db21ibzxUYWJsZUdlbmVyYXRvcj4odGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBwYXJlbnQpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfUEtfQ09MVU1OX05BTUVfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfVEFCTEVfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJCQlpZiAocHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfVEFCTEVfUFJPUEVSVFkgfHwKKwkJCQkgICAgcHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSkgeworCQkJCQl0aGlzLnJlcG9wdWxhdGVDb21ib0JveCgpOworCQkJCX0gZWxzZSB7CisJCQkJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOworCQkJCX0KKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRQa0NvbHVtbk5hbWUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBudWxsU3ViamVjdElzQWxsb3dlZCgpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKworCQkJLyoqCisJCQkgKiBzdWJqZWN0IG1heSBiZSBudWxsLCBzbyBkZWxlZ2F0ZSB0byB0aGUgY29tcG9zaXRlCisJCQkgKi8KKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKKwkJCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5nZXRKcGFQcm9qZWN0KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCQkJcmV0cmlldmVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUodmFsdWUpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBUYWJsZSBnZXREYlRhYmxlXygpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERiVGFibGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBDb2x1bW5Db21ibzxUYWJsZUdlbmVyYXRvcj4gYWRkUGtDb2x1bW5WYWx1ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlyZXR1cm4gbmV3IENvbHVtbkNvbWJvPFRhYmxlR2VuZXJhdG9yPih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIHBhcmVudCkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRQa0NvbHVtblZhbHVlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gbnVsbFN1YmplY3RJc0FsbG93ZWQoKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCS8qKgorCQkJICogc3ViamVjdCBtYXkgYmUgbnVsbCwgc28gZGVsZWdhdGUgdG8gdGhlIGNvbXBvc2l0ZQorCQkJICovCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7CisJCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuZ2V0SnBhUHJvamVjdCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQkJCXJldHJpZXZlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSh2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFRhYmxlIGdldERiVGFibGVfKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGJUYWJsZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBTY2hlbWFDb21ibzxUYWJsZUdlbmVyYXRvcj4gYWRkU2NoZW1hQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgU2NoZW1hQ29tYm88VGFibGVHZW5lcmF0b3I+KHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCQkJaWYgKHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkKKwkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZICkgeworCQkJCQlyZXBvcHVsYXRlQ29tYm9Cb3goKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOworCQkJCX0KKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRTY2hlbWEoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBudWxsU3ViamVjdElzQWxsb3dlZCgpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKworCQkJLyoqCisJCQkgKiBzdWJqZWN0IG1heSBiZSBudWxsLCBzbyBkZWxlZ2F0ZSB0byB0aGUgY29tcG9zaXRlCisJCQkgKi8KKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKKwkJCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5nZXRKcGFQcm9qZWN0KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCQkJcmV0cmlldmVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRTY2hlbWEodmFsdWUpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyKCkgeworCQkJCVRhYmxlR2VuZXJhdG9yIHRnID0gdGhpcy5nZXRTdWJqZWN0KCk7CisJCQkJaWYgKHRnICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHRnLmdldERiU2NoZW1hQ29udGFpbmVyKCk7CisJCQkJfQorCQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmdldFN1YmplY3QoKS5nZXRDb250ZXh0RGVmYXVsdERiU2NoZW1hQ29udGFpbmVyKCk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcl8oKSB7CisJCQkJLy8gd2Ugb3ZlcnJvZGUgI2dldERiU2NoZW1hQ29udGFpbmVyKCkgaW5zdGVhZAorCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgVGFibGVDb21ibzxUYWJsZUdlbmVyYXRvcj4gYWRkVGFibGVOYW1lQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXJldHVybiBuZXcgVGFibGVDb21ibzxUYWJsZUdlbmVyYXRvcj4odGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBwYXJlbnQpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1RBQkxFX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQkJCWlmIChwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkgCisJCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZCisJCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkKKwkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZICkgeworCQkJCQlyZXBvcHVsYXRlQ29tYm9Cb3goKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOworCQkJCX0KKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFRhYmxlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gbnVsbFN1YmplY3RJc0FsbG93ZWQoKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCS8qKgorCQkJICogc3ViamVjdCBtYXkgYmUgbnVsbCwgc28gZGVsZWdhdGUgdG8gdGhlIGNvbXBvc2l0ZQorCQkJICovCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7CisJCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuZ2V0SnBhUHJvamVjdCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQkJCXJldHJpZXZlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkVGFibGUodmFsdWUpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFRhYmxlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKKwkJCQlUYWJsZUdlbmVyYXRvciB0ZyA9IHRoaXMuZ2V0U3ViamVjdCgpOworCQkJCWlmICh0ZyAhPSBudWxsKSB7CisJCQkJCXJldHVybiB0Zy5nZXREYlNjaGVtYSgpOworCQkJCX0KKwkJCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5nZXRTdWJqZWN0KCkuZ2V0Q29udGV4dERlZmF1bHREYlNjaGVtYSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTY2hlbWEgZ2V0RGJTY2hlbWFfKCkgeworCQkJCS8vIHdlIG92ZXJyb2RlICNnZXREYlNjaGVtYSgpIGluc3RlYWQKKwkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJCX0KKworCQl9OworCX0KKworCXByaXZhdGUgQ29sdW1uQ29tYm88VGFibGVHZW5lcmF0b3I+IGFkZFZhbHVlQ29sdW1uQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXJldHVybiBuZXcgQ29sdW1uQ29tYm88VGFibGVHZW5lcmF0b3I+KHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9WQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1ZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1RBQkxFX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCQkJaWYgKHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1RBQkxFX1BST1BFUlRZIHx8CisJCQkJICAgIHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkpIHsKKwkJCQkJdGhpcy5yZXBvcHVsYXRlQ29tYm9Cb3goKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKKwkJCQl9CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gbnVsbFN1YmplY3RJc0FsbG93ZWQoKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCS8qKgorCQkJICogc3ViamVjdCBtYXkgYmUgbnVsbCwgc28gZGVsZWdhdGUgdG8gdGhlIGNvbXBvc2l0ZQorCQkJICovCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7CisJCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuZ2V0SnBhUHJvamVjdCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQkJCXJldHJpZXZlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKHZhbHVlKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgVGFibGUgZ2V0RGJUYWJsZV8oKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREYlRhYmxlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpOworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1RhcmdldEVudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9UYXJnZXRFbnRpdHlDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODRjNjYwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9UYXJnZXRFbnRpdHlDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDM5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5Db250cm9sQ29udGVudEFzc2lzdEhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5KYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKKyAqIHwgVGFyZ2V0IEVudGl0eTogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfCBCcm93c2UuLi4gfCB8CisgKiB8ICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcKKyAqIEBzZWUgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKKyAqIEBzZWUgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICogQHNlZSBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCisgKiBAc2VlIE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBUYXJnZXRFbnRpdHlDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxSZWxhdGlvbnNoaXBNYXBwaW5nPgoreworCXByaXZhdGUgSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yIGphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcjsKKworCXByaXZhdGUgQ29tYm8gY29tYm87CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhcmdldEVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKEZvcm1QYW5lPD8gZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYXJnZXRFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JUmVsYXRpb25zaGlwTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBUYXJnZXRFbnRpdHlDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQlwcm9wZXJ0eU5hbWVzLmFkZChSZWxhdGlvbnNoaXBNYXBwaW5nLkRFRkFVTFRfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSk7CisJCXByb3BlcnR5TmFtZXMuYWRkKFJlbGF0aW9uc2hpcE1hcHBpbmcuU1BFQ0lGSUVEX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFkpOworCX0KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisKKwkJLy8gVE9ETyBidWcgMTU2MTg1IC0gd2hlbiB0aGlzIGlzIGZpeGVkIHRoZXJlIHNob3VsZCBiZSBhcGkgZm9yIHRoaXMKKwkJdGhpcy5qYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IgPSBuZXcgSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yKGZhbHNlLCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCUNvbXBvc2l0ZSBjb21ib1BhbmUgPSBhZGRTdWJQYW5lKGNvbnRhaW5lcik7CisJCXRoaXMuY29tYm8gPSBhZGRFZGl0YWJsZUNvbWJvKGNvbWJvUGFuZSk7CisJCXRoaXMuY29tYm8uYWRkKEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFbXB0eSk7CisJCXRoaXMuY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoYnVpbGRUYXJnZXRFbnRpdHlNb2RpZnlMaXN0ZW5lcigpKTsKKworCQlJbWFnZSBpbWFnZSA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRGaWVsZERlY29yYXRpb24oRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuREVDX0NPTlRFTlRfUFJPUE9TQUwpLmdldEltYWdlKCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gaW1hZ2UuZ2V0Qm91bmRzKCkud2lkdGg7CisJCXRoaXMuY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKKworCQlDb250cm9sQ29udGVudEFzc2lzdEhlbHBlci5jcmVhdGVDb21ib0NvbnRlbnRBc3Npc3RhbnQoCisJCQl0aGlzLmNvbWJvLAorCQkJamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yCisJCSk7CisKKwkJCisJCQorCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIodGhpcy5jb21ibyk7CisKKwkJSHlwZXJsaW5rIGxhYmVsTGluayA9IGFkZEh5cGVybGluayhjb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UYXJnZXRFbnRpdHlDaG9vc2VyX2xhYmVsLAorCQkJYnVpbGRPcGVuVGFyZ2V0RW50aXR5QWN0aW9uKCkKKwkJKTsKKworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJbGFiZWxMaW5rLAorCQkJY29tYm9QYW5lLAorCQkJYWRkVGFyZ2V0RW50aXR5U2VsZWN0aW9uQnV0dG9uKGNvbnRhaW5lciksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBUkdFVF9FTlRJVFkKKwkJKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcigpIHsKKworCQlTdHJpbmcgdGFyZ2V0RW50aXR5ID0gZ2V0U3ViamVjdCgpLmdldFRhcmdldEVudGl0eSgpOworCisJCWlmICh0YXJnZXRFbnRpdHkgIT0gbnVsbCkgeworCisJCQl0cnkgeworCQkJCUlUeXBlIHR5cGUgPSBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUodGFyZ2V0RW50aXR5LnJlcGxhY2UoJyQnLCAnLicpKTsKKworCQkJCWlmICh0eXBlICE9IG51bGwpIHsKKwkJCQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gdHlwZS5nZXRQYXJlbnQoKTsKKwkJCQkJSmF2YVVJLm9wZW5JbkVkaXRvcihqYXZhRWxlbWVudCwgdHJ1ZSwgdHJ1ZSk7CisJCQkJfQorCQkJfQorCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJSnB0VWlQbHVnaW4ubG9nKGUpOworCQkJfQorCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKKwkJCQlKcHRVaVBsdWdpbi5sb2coZSk7CisJCQl9CisJCX0KKwl9CisJcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE9wZW5UYXJnZXRFbnRpdHlBY3Rpb24oKSB7CisJCXJldHVybiBuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJVGFyZ2V0RW50aXR5Q29tcG9zaXRlLnRoaXMub3BlbkVkaXRvcigpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUnVubmFibGUgYnVpbGRPcGVuVHlwZUFjdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShjb21iby5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJZG9PcGVuU2VsZWN0aW9uRGlhbG9nKCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGJ1aWxkVGFyZ2V0RW50aXR5TW9kaWZ5TGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQlpZiAoIWlzUG9wdWxhdGluZygpKSB7CisJCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBlLndpZGdldDsKKwkJCQkJdmFsdWVDaGFuZ2VkKGNvbWJvLmdldFRleHQoKSk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgQnV0dG9uIGFkZFRhcmdldEVudGl0eVNlbGVjdGlvbkJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7CisJCXJldHVybiBhZGRQdXNoQnV0dG9uKAorCQkJcGFyZW50LAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVGFyZ2V0RW50aXR5Q2hvb3Nlcl9icm93c2UsCisJCQlidWlsZE9wZW5UeXBlQWN0aW9uKCkKKwkJKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZG9PcGVuU2VsZWN0aW9uRGlhbG9nKCkgeworCQlTZWxlY3Rpb25EaWFsb2cgZGlhbG9nOworCisJCXRyeSB7CisJCQlkaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKKwkJCQlnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwKKwkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLAorCQkJCVNlYXJjaEVuZ2luZS5jcmVhdGVXb3Jrc3BhY2VTY29wZSgpLAorCQkJCUlKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9BTExfVFlQRVMsCisJCQkJZmFsc2UKKwkJCSk7CisJCX0KKwkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlKcHRVaVBsdWdpbi5sb2coZSk7CisJCQlyZXR1cm47CisJCX0KKworCQlkaWFsb2cuc2V0VGl0bGUoSnB0VWlEZXRhaWxzTWVzc2FnZXMuVGFyZ2V0RW50aXR5Q2hvb3Nlcl9zZWxlY3RUeXBlVGl0bGUpOworCisJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgeworCQkJSVR5cGUgdHlwZSA9IChJVHlwZSkgZGlhbG9nLmdldFJlc3VsdCgpWzBdOworCQkJdGhpcy5jb21iby5zZXRUZXh0KHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGdldFN1YmplY3QoKS5nZXRUYXJnZXRFbnRpdHlFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkpKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7CisKKwkJc3VwZXIuZG9Qb3B1bGF0ZSgpOworCQlwb3B1bGF0ZUNvbWJvKCk7CisJCXVwZGF0ZVBhY2thZ2VGcmFnbWVudCgpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgdXBkYXRlUGFja2FnZUZyYWdtZW50KCkgeworCisJCWlmIChnZXRTdWJqZWN0KCkgIT0gbnVsbCkgeworCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKKworCQkJaWYgKHJvb3QgIT0gbnVsbCkgeworCQkJCWphdmFUeXBlQ29tcGxldGlvblByb2Nlc3Nvci5zZXRQYWNrYWdlRnJhZ21lbnQocm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3Iuc2V0UGFja2FnZUZyYWdtZW50KG51bGwpOworCX0KKwkKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlID8/CisJICoKKwkgKiBAcmV0dXJuIEVpdGhlciB0aGUgcm9vdCBvZiB0aGUgcGFja2FnZSBmcmFnbWVudCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdAorCSAqIGNhbid0IGJlIHJldHJpZXZlZAorCSAqLworCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkgeworCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7CisJCUlKYXZhUHJvamVjdCByb290ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOworCisJCXRyeSB7CisJCQlyZXR1cm4gcm9vdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpWzBdOworCQl9CisJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJSnB0VWlQbHVnaW4ubG9nKGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCisKKwlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb21ibygpIHsKKworCQljb21iby5yZW1vdmVBbGwoKTsKKwkJcG9wdWxhdGVEZWZhdWx0VmFsdWUoKTsKKwkJLy8gVE9ETyBBZGQgcG9zc2libGUgdGFyZ2V0IGVudGl0eSBuYW1lcworCQl1cGRhdGVTZWxlY3RlZEl0ZW0oKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHRoZSBjb21ibyBpZiBvbmUgZXhpc3RzLgorCSAqLworCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURlZmF1bHRWYWx1ZSgpIHsKKworCQlSZWxhdGlvbnNoaXBNYXBwaW5nIGVudGl0eSA9IGdldFN1YmplY3QoKTsKKwkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IChlbnRpdHkgIT0gbnVsbCkgPyBlbnRpdHkuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpIDogbnVsbDsKKworCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKKwkJCWNvbWJvLmFkZChOTFMuYmluZCgKKwkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAorCQkJCWRlZmF1bHRWYWx1ZQorCQkJKSk7CisJCX0KKwkJZWxzZSB7CisJCQljb21iby5hZGQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdEVtcHR5KTsKKwkJfQorCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOworCisJCWlmIChwcm9wZXJ0eU5hbWUgPT0gUmVsYXRpb25zaGlwTWFwcGluZy5ERUZBVUxUX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFkgfHwKKwkJICAgIHByb3BlcnR5TmFtZSA9PSBSZWxhdGlvbnNoaXBNYXBwaW5nLlNQRUNJRklFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZKSB7CisKKwkJCXBvcHVsYXRlQ29tYm8oKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFVwZGF0ZXMgdGhlIHNlbGVjdGVkIGl0ZW0gYnkgc2VsZWN0ZWQgdGhlIGN1cnJlbnQgdmFsdWUsIGlmIG5vdAorCSAqIDxjb2RlPm51bGw8L2NvZGU+LCBvciBzZWxlY3QgdGhlIGRlZmF1bHQgdmFsdWUgaWYgb25lIGlzIGF2YWlsYWJsZSwKKwkgKiBvdGhlcndpc2UgcmVtb3ZlIHRoZSBzZWxlY3Rpb24uCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IEl0IHNlZW1zIHRoZSB0ZXh0IGNhbiBiZSBzaG93biBhcyB0cnVuY2F0ZWQsIGNoYW5naW5nIHRoZQorCSAqIHNlbGVjdGlvbiB0byAoMCwgMCkgbWFrZXMgdGhlIGVudGlyZSB0ZXh0IHZpc2libGUuCisJICovCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlbGVjdGVkSXRlbSgpIHsKKwkJUmVsYXRpb25zaGlwTWFwcGluZyBzdWJqZWN0ID0gZ2V0U3ViamVjdCgpOworCQlTdHJpbmcgdmFsdWUgPSAoc3ViamVjdCAhPSBudWxsKSA/IHN1YmplY3QuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgOiBudWxsOworCisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQljb21iby5zZXRUZXh0KHZhbHVlKTsKKwkJCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgMCkpOworCQl9CisJCWVsc2UgeworCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IChzdWJqZWN0ICE9IG51bGwpID8gc3ViamVjdC5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkgOiBudWxsOworCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RW1wdHk7CisKKwkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgeworCQkJCWRpc3BsYXlTdHJpbmcgPSBOTFMuYmluZCgKKwkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKKwkJCQkJZGVmYXVsdFZhbHVlCisJCQkJKTsKKwkJCX0KKworCQkJLy8gU2VsZWN0ZWQgdGhlIGRlZmF1bHQgdmFsdWUKKwkJCWlmIChkaXNwbGF5U3RyaW5nICE9IG51bGwpIHsKKwkJCQljb21iby5zZWxlY3QoMCk7CisJCQkJY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCAwKSk7CisJCQl9CisJCQkvLyBSZW1vdmUgdGhlIHNlbGVjdGlvbgorCQkJZWxzZSB7CisJCQkJY29tYm8uc2VsZWN0KC0xKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB2YWx1ZUNoYW5nZWQoU3RyaW5nIHZhbHVlKSB7CisKKwkJUmVsYXRpb25zaGlwTWFwcGluZyBzdWJqZWN0ID0gZ2V0U3ViamVjdCgpOworCQlTdHJpbmcgb2xkVmFsdWUgPSAoc3ViamVjdCAhPSBudWxsKSA/IHN1YmplY3QuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgOiBudWxsOworCisJCS8vIENoZWNrIGZvciBudWxsIHZhbHVlCisJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHZhbHVlKSkgeworCQkJdmFsdWUgPSBudWxsOworCisJCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShvbGRWYWx1ZSkpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQkvLyBUaGUgZGVmYXVsdCB2YWx1ZQorCQlpZiAodmFsdWUgIT0gbnVsbCAmJgorCQkgICAgY29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwICYmCisJCSAgICB2YWx1ZS5lcXVhbHMoY29tYm8uZ2V0SXRlbSgwKSkpCisJCXsKKwkJCXZhbHVlID0gbnVsbDsKKwkJfQorCisJCS8vIE5vdGhpbmcgdG8gY2hhbmdlCisJCWlmICgob2xkVmFsdWUgPT0gdmFsdWUpICYmIHZhbHVlID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIFNldCB0aGUgbmV3IHZhbHVlCisJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKG9sZFZhbHVlID09IG51bGwpIHx8CisJCSAgICgob2xkVmFsdWUgIT0gbnVsbCkgJiYgIW9sZFZhbHVlLmVxdWFscyh2YWx1ZSkpKSB7CisKKwkJCXNldFBvcHVsYXRpbmcodHJ1ZSk7CisKKwkJCXRyeSB7CisJCQkJc3ViamVjdC5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkodmFsdWUpOworCQkJfQorCQkJZmluYWxseSB7CisJCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7CisJCQl9CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9UZW1wb3JhbFR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVGVtcG9yYWxUeXBlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0OThlNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVGVtcG9yYWxUeXBlQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBUZW1wb3JhbDogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKKyAqIHwgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgQ29sdW1uTWFwcGluZworICogQHNlZSBUZW1wb3JhbFR5cGUKKyAqIEBzZWUgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCisgKiBAc2VlIElkTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICogQHNlZSBWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgVGVtcG9yYWxUeXBlQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8VGVtcG9yYWxDb252ZXJ0ZXI+IHsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGVtcG9yYWxUeXBlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBUZW1wb3JhbFR5cGVDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUZW1wb3JhbENvbnZlcnRlcj4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCUNDb21ibyBjb21ibyA9IGFkZENDb21ibygKKwkJCWNvbnRhaW5lciwKKwkJCWJ1aWxkVGVtcG9yYWxUeXBlTGlzdEhvbGRlcigpLAorCQkJYnVpbGRUZW1wb3JhbFR5cGVIb2xkZXIoKSwKKwkJCWJ1aWxkVGVtcG9yYWxUeXBlQ29udmVydGVyKCkKKwkJKTsKKwkJCisJCVNXVFRvb2xzLmNvbnRyb2xFbmFibGVkU3RhdGUoYnVpbGRCb29sZWFuSG9sZGVyKCksIGNvbWJvKTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlbXBvcmFsVHlwZT4gYnVpbGRUZW1wb3JhbFR5cGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlbXBvcmFsQ29udmVydGVyLCBUZW1wb3JhbFR5cGU+KGdldFN1YmplY3RIb2xkZXIoKSwgVGVtcG9yYWxDb252ZXJ0ZXIuVEVNUE9SQUxfVFlQRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LmdldFRlbXBvcmFsVHlwZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhUZW1wb3JhbFR5cGUgdmFsdWUpIHsKKwkJCQlzdWJqZWN0LnNldFRlbXBvcmFsVHlwZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUZW1wb3JhbFR5cGU+IGJ1aWxkVGVtcG9yYWxUeXBlTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxUZW1wb3JhbFR5cGU+KAorCQkJYnVpbGRTb3J0ZWRUZW1wb3JhbFR5cGVMaXN0KCkKKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBMaXN0PFRlbXBvcmFsVHlwZT4gYnVpbGRTb3J0ZWRUZW1wb3JhbFR5cGVMaXN0KCkgeworCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNvcnQoQ29sbGVjdGlvblRvb2xzLmxpc3QoVGVtcG9yYWxUeXBlLnZhbHVlcygpKSwgdGhpcy5idWlsZFRlbXBvcmFsVHlwZUNvbXBhcmF0b3IoKSk7CisJfQorCisJcHJpdmF0ZSBDb21wYXJhdG9yPFRlbXBvcmFsVHlwZT4gYnVpbGRUZW1wb3JhbFR5cGVDb21wYXJhdG9yKCkgeworCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8VGVtcG9yYWxUeXBlPigpIHsKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShUZW1wb3JhbFR5cGUgdHlwZTEsIFRlbXBvcmFsVHlwZSB0eXBlMikgeworCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMSA9IGRpc3BsYXlTdHJpbmcodHlwZTEpOworCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMiA9IGRpc3BsYXlTdHJpbmcodHlwZTIpOworCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGlzcGxheVN0cmluZzEsIGRpc3BsYXlTdHJpbmcyKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxUZW1wb3JhbFR5cGU+IGJ1aWxkVGVtcG9yYWxUeXBlQ29udmVydGVyKCkgeworCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxUZW1wb3JhbFR5cGU+KCkgeworCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoVGVtcG9yYWxUeXBlIHZhbHVlKSB7CisJCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBkaXNwbGF5U3RyaW5nKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlTdHJpbmcgZGlzcGxheVN0cmluZyhUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlKSB7CisJCXJldHVybiBTV1RVdGlsLmJ1aWxkRGlzcGxheVN0cmluZygKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLmNsYXNzLAorCQkJVGVtcG9yYWxUeXBlQ29tcG9zaXRlLnRoaXMsCisJCQl0ZW1wb3JhbFR5cGUubmFtZSgpCisJCSk7CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRCb29sZWFuSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFRlbXBvcmFsQ29udmVydGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFRlbXBvcmFsQ29udmVydGVyIHZhbHVlKSB7CisJCQkJaWYgKGdldFN1YmplY3QoKSAhPSBudWxsICYmIGdldFN1YmplY3QoKS5nZXRQYXJlbnQoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKKwkJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisJCQkJfQorCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUgIT0gbnVsbCk7CisJCQl9CisJCX07CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1RyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTlkY2I0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgcGFuZSBkb2VzIG5vdCBoYXZlIGFueSB3aWRnZXRzLgorICoKKyAqIEBzZWUgVHJhbnNpZW50TWFwcGluZworICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPFRyYW5zaWVudE1hcHBpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklUcmFuc2llbnRNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIFRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUcmFuc2llbnRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9UcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9UcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjA5YTRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8VHJhbnNpZW50TWFwcGluZz4KLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IFRyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPFRyYW5zaWVudE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfVHJhbnNpZW50TGFiZWw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGU8VHJhbnNpZW50TWFwcGluZz4gYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQlKcGFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFRyYW5zaWVudE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZVRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOWJjMzAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENvbHVtbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgVmVyc2lvbk1hcHBpbmcKKyAqIEBzZWUgQ29sdW1uQ29tcG9zaXRlCisgKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUgCisJZXh0ZW5kcyBBYnN0cmFjdFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlPFZlcnNpb25NYXBwaW5nPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JVmVyc2lvbk1hcHBpbmc8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBWZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJLy8gQ29sdW1uIHdpZGdldHMKKwkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOworCisJCWluaXRpYWxpemVDb252ZXJzaW9uUGFuZShjb250YWluZXIpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1ZlcnNpb25NYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmM4NGFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIFZlcnNpb25NYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8VmVyc2lvbk1hcHBpbmc+Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPFZlcnNpb25NYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfVmVyc2lvbkxhYmVsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlPFZlcnNpb25NYXBwaW5nPiBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCUpwYVVpRmFjdG9yeSBmYWN0b3J5LAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvZGIvQ2F0YWxvZ0NvbWJvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL0NhdGFsb2dDb21iby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNmY0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL0NhdGFsb2dDb21iby5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYjsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBjb21iby1ib3ggZGlzcGxheXMgdGhlIGRhdGFiYXNlJ3MgY2F0YWxvZ3MuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDYXRhbG9nQ29tYm88VCBleHRlbmRzIEpwYU5vZGU+CisJZXh0ZW5kcyBEYXRhYmFzZU9iamVjdENvbWJvPFQ+Cit7CisJcHVibGljIENhdGFsb2dDb21ibyhQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLCBDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCisJcHVibGljIENhdGFsb2dDb21ibygKKwkJCQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKKwkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQKKwkpIHsKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgQ2F0YWxvZ0NvbWJvKAorCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCQkJCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeQorCSkgeworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHZhbHVlcygpIHsKKwkJRGF0YWJhc2UgZGIgPSB0aGlzLmdldERhdGFiYXNlKCk7CisJCXJldHVybiAoZGIgIT0gbnVsbCkgPyBkYi5zb3J0ZWRDYXRhbG9nSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9Db2x1bW5Db21iby5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9Db2x1bW5Db21iby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTEyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL0NvbHVtbkNvbWJvLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIGNvbWJvLWJveCBkaXNwbGF5cyBhIHRhYmxlJ3MgY29sdW1ucy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENvbHVtbkNvbWJvPFQgZXh0ZW5kcyBKcGFOb2RlPgorCWV4dGVuZHMgRGF0YWJhc2VPYmplY3RDb21ibzxUPgoreworCXB1YmxpYyBDb2x1bW5Db21ibyhQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLCBDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCisJcHVibGljIENvbHVtbkNvbWJvKAorCQkJCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAorCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCQkJCQkJQ29tcG9zaXRlIHBhcmVudAorCSkgeworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCXB1YmxpYyBDb2x1bW5Db21ibygKKwkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkKKwkpIHsKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB2YWx1ZXMoKSB7CisJCVRhYmxlIGRiVGFibGUgPSB0aGlzLmdldERiVGFibGUoKTsKKwkJcmV0dXJuIChkYlRhYmxlICE9IG51bGwpID8gZGJUYWJsZS5zb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpIDogRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCk7CisJfQorCisJcHJvdGVjdGVkIFRhYmxlIGdldERiVGFibGUoKSB7CisJCXJldHVybiAodGhpcy5nZXRTdWJqZWN0KCkgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXREYlRhYmxlXygpOworCX0KKworCS8qKgorCSAqIEFzc3VtZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgVGFibGUgZ2V0RGJUYWJsZV8oKTsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRhYmxlQ2hhbmdlZF8oVGFibGUgdGFibGUpIHsKKwkJc3VwZXIudGFibGVDaGFuZ2VkXyh0YWJsZSk7CisJCWlmICh0aGlzLmdldERiVGFibGUoKSA9PSB0YWJsZSkgeworCQkJdGhpcy5kb1BvcHVsYXRlKCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvZGIvRGF0YWJhc2VPYmplY3RDb21iby5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9EYXRhYmFzZU9iamVjdENvbWJvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2YWFkOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvZGIvRGF0YWJhc2VPYmplY3RDb21iby5qYXZhCkBAIC0wLDAgKzEsNTc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRGF0YVNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNhdGFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2VxdWVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5UcmFjaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGlzIGFic3RyYWN0IHBhbmUga2VlcHMgYSBjb21ibyBpbiBzeW5jIHdpdGggdGhlIGRhdGFiYXNlIG9iamVjdHMKKyAqIHdoZW4gYSBjb25uZWN0aW9uIGlzIGFjdGl2ZS4KKyAqCisgKiBAc2VlIENhdGFsb2dDb21ibworICogQHNlZSBDb2x1bW5Db21ibworICogQHNlZSBTY2hlbWFDb21ibworICogQHNlZSBTZXF1ZW5jZUNvbWJvCisgKiBAc2VlIFRhYmxlQ29tYm8KKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YWJhc2VPYmplY3RDb21ibzxUIGV4dGVuZHMgSnBhTm9kZT4KKwlleHRlbmRzIFBhbmU8VD4KK3sKKworCS8qKgorCSAqIFRoZSBtYWluIChvbmx5KSB3aWRnZXQgb2YgdGhpcyBwYW5lLgorCSAqLworCXByaXZhdGUgQ0NvbWJvIGNvbWJvQm94OworCisJLyoqCisJICogVGhlIGxpc3RlbmVyIGFkZGVkIHRvIHRoZSA8Y29kZT5Db25uZWN0aW9uUHJvZmlsZTwvY29kZT4uCisJICogSXQga2VlcHMgdGhlIGNvbWJvIGluIHN5bmMgd2l0aCB0aGUgZGF0YWJhc2UgbWV0YWRhdGEuCisJICovCisJcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOworCisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI7CisJCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgorCisJcHJvdGVjdGVkIERhdGFiYXNlT2JqZWN0Q29tYm8oCisJCQkJCQlQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAorCQkJCQkJQ29tcG9zaXRlIHBhcmVudAorCSkgeworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCXByb3RlY3RlZCBEYXRhYmFzZU9iamVjdENvbWJvKAorCQkJCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAorCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCQkJCQkJQ29tcG9zaXRlIHBhcmVudAorCSkgeworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCXByb3RlY3RlZCBEYXRhYmFzZU9iamVjdENvbWJvKAorCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCQkJCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeQorCSkgeworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCisJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisJCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpOworCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpOworCX0KKworCXByb3RlY3RlZCBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyXygpKTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyXygpIHsKKwkJcmV0dXJuIG5ldyBMb2NhbENvbm5lY3Rpb25MaXN0ZW5lcigpOworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXJfKCkpOworCX0KKworCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcl8oKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpeworCQkKKwkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJY29ubmVjdGlvblByb2ZpbGVDaGFuZ2VkKGV2ZW50KTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjb25uZWN0aW9uUHJvZmlsZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQlpZiAoZXZlbnQuZ2V0T2xkVmFsdWUoKSAhPSBudWxsKSB7CisJCQkoKENvbm5lY3Rpb25Qcm9maWxlKSBldmVudC5nZXRPbGRWYWx1ZSgpKS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOworCQl9CisJCWlmIChldmVudC5nZXROZXdWYWx1ZSgpICE9IG51bGwpIHsKKwkJCSgoQ29ubmVjdGlvblByb2ZpbGUpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7CQkJCisJCX0KKwkJdGhpcy5yZXBvcHVsYXRlQ29tYm9Cb3goKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCXRoaXMuY29tYm9Cb3ggPSB0aGlzLmFkZEVkaXRhYmxlQ0NvbWJvKGNvbnRhaW5lcik7CisJCXRoaXMuY29tYm9Cb3guYWRkTW9kaWZ5TGlzdGVuZXIodGhpcy5idWlsZE1vZGlmeUxpc3RlbmVyKCkpOworCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIodGhpcy5jb21ib0JveCk7CisJfQorCisJcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIGJ1aWxkTW9kaWZ5TGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQlEYXRhYmFzZU9iamVjdENvbWJvLnRoaXMuY29tYm9Cb3hNb2RpZmllZCgpOworCQkJfQorCQl9OworCX0KKworCisJLy8gKioqKioqKioqKiBhYnN0cmFjdCBtZXRob2RzICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgcG9zc2libGUgdmFsdWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBjb21ibyBkdXJpbmcKKwkgKiBwb3B1bGF0aW9uLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYXRvcjxTdHJpbmc+IHZhbHVlcygpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBkZWZhdWx0IGlzCisJICogc3BlY2lmaWVkLiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzdWJqZWN0IGlzIG5vbi1udWxsLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgc3ViamVjdC4KKwkgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzdWJqZWN0IGlzIG5vbi1udWxsLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsdWUoKTsKKworCS8qKgorCSAqIFNldCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFzIHRoZSBuZXcgdmFsdWUgb24gdGhlIHN1YmplY3QuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKKworCisJLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzXyhUIHN1YmplY3QpIHsKKwkJc3VwZXIuZW5nYWdlTGlzdGVuZXJzXyhzdWJqZWN0KTsKKworCQlzdWJqZWN0LmdldEpwYVByb2plY3QoKS5nZXREYXRhU291cmNlKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihKcGFEYXRhU291cmNlLkNPTk5FQ1RJT05fUFJPRklMRV9QUk9QRVJUWSwgdGhpcy5jb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKTsKKwkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSBzdWJqZWN0LmdldEpwYVByb2plY3QoKS5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOworCQlpZiAoY3AgIT0gbnVsbCkgeworCQkJY3AuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVyc18oVCBzdWJqZWN0KSB7CisJCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gc3ViamVjdC5nZXRKcGFQcm9qZWN0KCkuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKKwkJaWYgKGNwICE9IG51bGwpIHsKKwkJCWNwLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7CisJCX0KKwkJc3ViamVjdC5nZXRKcGFQcm9qZWN0KCkuZ2V0RGF0YVNvdXJjZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSnBhRGF0YVNvdXJjZS5DT05ORUNUSU9OX1BST0ZJTEVfUFJPUEVSVFksIHRoaXMuY29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcik7CisKKwkJc3VwZXIuZGlzZW5nYWdlTGlzdGVuZXJzXyhzdWJqZWN0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgeworCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOworCisJCWlmICggISB0aGlzLmNvbWJvQm94LmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5jb21ib0JveC5zZXRFbmFibGVkKGVuYWJsZWQpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7CisJCXRoaXMudXBkYXRlU2VsZWN0ZWRJdGVtKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKKwkJc3VwZXIuZG9Qb3B1bGF0ZSgpOworCQl0aGlzLnBvcHVsYXRlQ29tYm9Cb3goKTsKKwl9CisKKworCS8vICoqKioqKioqKiogcG9wdWxhdGluZyAqKioqKioqKioqCisKKwkvKioKKwkgKiBQb3B1bGF0ZSB0aGUgY29tYm8tYm94IGxpc3QgYnkgY2xlYXJpbmcgaXQsIHRoZW4gYWRkaW5nIGZpcnN0IHRoZSBkZWZhdWx0CisJICogdmFsdWUsIGlmIGF2YWlsYWJsZSwgYW5kIHRoZW4gdGhlIHBvc3NpYmxlIGNob2ljZXMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVDb21ib0JveCgpIHsKKwkJdGhpcy5jb21ib0JveC5yZW1vdmVBbGwoKTsKKworCQl0aGlzLmNvbWJvQm94LmFkZCh0aGlzLmJ1aWxkRGVmYXVsdFZhbHVlRW50cnkoKSk7CisKKwkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpKSB7CisJCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy52YWx1ZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQkJdGhpcy5jb21ib0JveC5hZGQoc3RyZWFtLm5leHQoKSk7CisJCQl9CisJCX0KKworCQl0aGlzLnVwZGF0ZVNlbGVjdGVkSXRlbV8oKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFZhbHVlRW50cnkoKSB7CisJCWlmIChnZXRTdWJqZWN0KCkgPT0gbnVsbCkgeworCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk5vbmVTZWxlY3RlZDsKKwkJfQorCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoKTsKKwkJcmV0dXJuIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgPyB0aGlzLmJ1aWxkTnVsbERlZmF1bHRWYWx1ZUVudHJ5KCkgOiB0aGlzLmJ1aWxkTm9uTnVsbERlZmF1bHRWYWx1ZUVudHJ5KGRlZmF1bHRWYWx1ZSk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBidWlsZE51bGxEZWZhdWx0VmFsdWVFbnRyeSgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFbXB0eTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTm9uTnVsbERlZmF1bHRWYWx1ZUVudHJ5KFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKwkJcmV0dXJuIE5MUy5iaW5kKAorCQkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKKwkJCQkJCWRlZmF1bHRWYWx1ZQorCQkJCQkpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGVkSXRlbSgpIHsKKwkJLy8gbWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIHVwIHRvIGRhdGUgKD8/PyB+Ymp2KQorCQlTdHJpbmcgZGVmYXVsdFZhbHVlRW50cnkgPSB0aGlzLmJ1aWxkRGVmYXVsdFZhbHVlRW50cnkoKTsKKwkJaWYgKCAhIHRoaXMuY29tYm9Cb3guZ2V0SXRlbSgwKS5lcXVhbHMoZGVmYXVsdFZhbHVlRW50cnkpKSB7CisJCQl0aGlzLmNvbWJvQm94LnJlbW92ZSgwKTsKKwkJCXRoaXMuY29tYm9Cb3guYWRkKGRlZmF1bHRWYWx1ZUVudHJ5LCAwKTsKKwkJfQorCisJCXRoaXMudXBkYXRlU2VsZWN0ZWRJdGVtXygpOworCX0KKworCS8qKgorCSAqIFVwZGF0ZXMgdGhlIHNlbGVjdGVkIGl0ZW0gYnkgc2VsZWN0aW5nIHRoZSBjdXJyZW50IHZhbHVlLCBpZiBub3QKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiwgb3Igc2VsZWN0IHRoZSBkZWZhdWx0IHZhbHVlIGlmIG9uZSBpcyBhdmFpbGFibGUsCisJICogb3RoZXJ3aXNlIHJlbW92ZSB0aGUgc2VsZWN0aW9uLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGVkSXRlbV8oKSB7CisJCVN0cmluZyB2YWx1ZSA9ICh0aGlzLmdldFN1YmplY3QoKSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldFZhbHVlKCk7CisJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQkvLyBzZWxlY3QgdGhlIGRlZmF1bHQgdmFsdWUKKwkJCXRoaXMuY29tYm9Cb3guc2VsZWN0KDApOworCQl9IGVsc2UgeworCQkJLy8gc2VsZWN0IHRoZSBuZXcgdmFsdWUKKwkJCWlmICggISB2YWx1ZS5lcXVhbHModGhpcy5jb21ib0JveC5nZXRUZXh0KCkpKSB7CisJCQkJLy8gVGhpcyBwcmV2ZW50cyB0aGUgY3Vyc29yIGZyb20gYmVpbmcgc2V0IGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAoYnVnIDIzNDQxOCkuCisJCQkJLy8gVGhlIHJlYXNvbiB3ZSBhcmUgaGl0dGluZyB0aGlzIG1ldGhvZCBhdCBhbGwgaXMgYmVjYXVzZSB0aGUKKwkJCQkvLyBjb250ZXh0IG1vZGVsIGlzIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsIGluIGEgd2F5CisJCQkJLy8gdGhhdCBjYXVzZXMgY2hhbmdlIG5vdGlmaWNhdGlvbnMgdG8gYmUgZmlyZWQgKHRoZSBhbm5vdGF0aW9uCisJCQkJLy8gaXMgYWRkZWQgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGFuZ2Ugbm90aWZpY2F0aW9uIG9jY3VycworCQkJCS8vIG9uIHRoZSB1cGRhdGUgdGhyZWFkLCBhbmQgdGhlbiB0aGUgbmFtZSBpcyBzZXQsIHRoZXNlIDIKKwkJCQkvLyB0aHJlYWRzIGNhbiBnZXQgaW4gdGhlIHdyb25nIG9yZGVyKS4KKwkJCQkvLyBUaGUgI3ZhbHVlQ2hhbmdlZCgpIG1ldGhvZCBzZXRzIHRoZSBwb3B1bGF0aW5nIGZsYWcgdG8gdHJ1ZSwKKwkJCQkvLyBidXQgaW4gdGhpcyBjYXNlIGl0IGlzIGFscmVhZHkgc2V0IGJhY2sgdG8gZmFsc2Ugd2hlbiB3ZQorCQkJCS8vIHJlY2VpdmUgbm90aWZpY2F0aW9uIGJhY2sgZnJvbSB0aGUgbW9kZWwgYmVjYXVzZSBpdCBoYXMKKwkJCQkvLyBtb3ZlZCB0byB0aGUgdXBkYXRlIHRocmVhZCBhbmQgdGhlbiBqdW1wcyBiYWNrIG9uIHRoZSBVSSB0aHJlYWQuCisJCQkJdGhpcy5jb21ib0JveC5zZXRUZXh0KHZhbHVlKTsKKwkJCX0KKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBjb21iby1ib3ggbGlzdGVuZXIgY2FsbGJhY2sgKioqKioqKioqKgorCisJcHJvdGVjdGVkIHZvaWQgY29tYm9Cb3hNb2RpZmllZCgpIHsKKwkJaWYgKCAhIHRoaXMuaXNQb3B1bGF0aW5nKCkpIHsKKwkJCXRoaXMudmFsdWVDaGFuZ2VkKHRoaXMuY29tYm9Cb3guZ2V0VGV4dCgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoZSBjb21iby1ib3ggc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLCB1cGRhdGUgdGhlIG1vZGVsIGlmIG5lY2Vzc2FyeS4KKwkgKiBJZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgYW5kIHRoZSBzdWJqZWN0IGlzIG51bGwsIHdlIGNhbiBidWlsZCBhIHN1YmplY3QKKwkgKiBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgeworCQlKcGFOb2RlIHN1YmplY3QgPSB0aGlzLmdldFN1YmplY3QoKTsKKwkJU3RyaW5nIG9sZFZhbHVlOworCQlpZiAoc3ViamVjdCA9PSBudWxsKSB7CisJCQlpZiAodGhpcy5udWxsU3ViamVjdElzTm90QWxsb3dlZCgpKSB7CisJCQkJcmV0dXJuOyAgLy8gbm8gc3ViamVjdCB0byBzZXQgdGhlIHZhbHVlIG9uCisJCQl9CisJCQlvbGRWYWx1ZSA9IG51bGw7CisJCX0gZWxzZSB7CisJCQlvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKKwkJfQorCisJCS8vIGNvbnZlcnQgZW1wdHkgc3RyaW5nIG9yIGRlZmF1bHQgdG8gbnVsbAorCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuZXdWYWx1ZSkgfHwgdGhpcy52YWx1ZUlzRGVmYXVsdChuZXdWYWx1ZSkpIHsKKwkJCW5ld1ZhbHVlID0gbnVsbDsKKwkJfQorCisJCS8vIHNldCB0aGUgbmV3IHZhbHVlIGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgdmFsdWUKKwkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHsKKwkJCXRoaXMuc2V0UG9wdWxhdGluZyh0cnVlKTsKKworCQkJdHJ5IHsKKwkJCQl0aGlzLnNldFZhbHVlKG5ld1ZhbHVlKTsKKwkJCX0gZmluYWxseSB7CisJCQkJdGhpcy5zZXRQb3B1bGF0aW5nKGZhbHNlKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHdlIGNhbiBzZXQgdGhlIHZhbHVlIHdoZW4gdGhlIHN1YmplY3QgaXMgbnVsbAorCSAqIChpLmUuICNzZXRWYWx1ZShTdHJpbmcpIHdpbGwgY29uc3RydWN0IHRoZSBzdWJqZWN0IGlmIG5lY2Vzc2FyeSkuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gbnVsbFN1YmplY3RJc0FsbG93ZWQoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBudWxsU3ViamVjdElzTm90QWxsb3dlZCgpIHsKKwkJcmV0dXJuICEgdGhpcy5udWxsU3ViamVjdElzQWxsb3dlZCgpOworCX0KKworCS8qKgorCSAqIHByZS1jb25kaXRpb246IHZhbHVlIGlzIG5vdCBudWxsCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdmFsdWVJc0RlZmF1bHQoU3RyaW5nIHZhbHVlKSB7CisJCXJldHVybiAodGhpcy5jb21ib0JveC5nZXRJdGVtQ291bnQoKSA+IDApCisJCQkJJiYgdmFsdWUuZXF1YWxzKHRoaXMuY29tYm9Cb3guZ2V0SXRlbSgwKSk7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gdmFsdWVzQXJlRXF1YWwoU3RyaW5nIHZhbHVlMSwgU3RyaW5nIHZhbHVlMikgeworCQlpZiAoKHZhbHVlMSA9PSBudWxsKSAmJiAodmFsdWUyID09IG51bGwpKSB7CisJCQlyZXR1cm4gdHJ1ZTsJLy8gYm90aCBhcmUgbnVsbAorCQl9CisJCWlmICgodmFsdWUxID09IG51bGwpIHx8ICh2YWx1ZTIgPT0gbnVsbCkpIHsKKwkJCXJldHVybiBmYWxzZTsJLy8gb25lIGlzIG51bGwgYnV0IHRoZSBvdGhlciBpcyBub3QKKwkJfQorCQlyZXR1cm4gdmFsdWUxLmVxdWFscyh2YWx1ZTIpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIHZhbHVlc0FyZURpZmZlcmVudChTdHJpbmcgdmFsdWUxLCBTdHJpbmcgdmFsdWUyKSB7CisJCXJldHVybiAhIHRoaXMudmFsdWVzQXJlRXF1YWwodmFsdWUxLCB2YWx1ZTIpOworCX0KKworCisJLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKKworCS8qKgorCSAqIFJldHVybiB0aGUgc3ViamVjdCdzIEpQQSBwcm9qZWN0LgorCSAqIEFsbG93IHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QsIHNvIHdlIGNhbiBzdGlsbCBnZXQgdGhlIEpQQQorCSAqIHByb2plY3QgZXZlbiB3aGVuIHRoZSBzdWJqZWN0IGlzIG51bGwuCisJICovCisJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKKwkJVCBzdWJqZWN0ID0gdGhpcy5nZXRTdWJqZWN0KCk7CisJCXJldHVybiAoc3ViamVjdCA9PSBudWxsKSA/IG51bGwgOiBzdWJqZWN0LmdldEpwYVByb2plY3QoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHN1YmplY3QncyBjb25uZWN0aW9uIHByb2ZpbGUuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgeworCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSB0aGlzLmdldEpwYVByb2plY3QoKTsKKwkJcmV0dXJuIChqcGFQcm9qZWN0ID09IG51bGwpID8gbnVsbCA6IGpwYVByb2plY3QuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3ViamVjdCdzIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyBhY3RpdmUuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpIHsKKwkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7CisJCXJldHVybiAoY3AgIT0gbnVsbCkgJiYgY3AuaXNBY3RpdmUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdWJqZWN0J3MgZGF0YWJhc2UuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIERhdGFiYXNlIGdldERhdGFiYXNlKCkgeworCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKKwkJcmV0dXJuIChjcCA9PSBudWxsKSA/IG51bGwgOiBjcC5nZXREYXRhYmFzZSgpOworCX0KKworCisJLy8gKioqKioqKioqKiBjb25uZWN0aW9uIGxpc3RlbmVyIGNhbGxiYWNrcyAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgdm9pZCByZXBvcHVsYXRlQ29tYm9Cb3goKSB7CisJCWlmICggISB0aGlzLmNvbWJvQm94LmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5yZXBvcHVsYXRlKCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBkYXRhYmFzZUNoYW5nZWQoRGF0YWJhc2UgZGF0YWJhc2UpIHsKKwkJaWYgKCAhIHRoaXMuY29tYm9Cb3guaXNEaXNwb3NlZCgpKSB7CisJCQl0aGlzLmRhdGFiYXNlQ2hhbmdlZF8oZGF0YWJhc2UpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZGF0YWJhc2VDaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRGF0YWJhc2UgZGF0YWJhc2UpIHsKKwkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0CisJfQorCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ2F0YWxvZyBjYXRhbG9nKSB7CisJCWlmICggISB0aGlzLmNvbWJvQm94LmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5jYXRhbG9nQ2hhbmdlZF8oY2F0YWxvZyk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjYXRhbG9nQ2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENhdGFsb2cgY2F0YWxvZykgeworCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKKwl9CisKKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzY2hlbWFDaGFuZ2VkKFNjaGVtYSBzY2hlbWEpIHsKKwkJaWYgKCAhIHRoaXMuY29tYm9Cb3guaXNEaXNwb3NlZCgpKSB7CisJCQl0aGlzLnNjaGVtYUNoYW5nZWRfKHNjaGVtYSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzY2hlbWFDaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2NoZW1hIHNjaGVtYSkgeworCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKKwl9CisKKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoU2VxdWVuY2Ugc2VxdWVuY2UpIHsKKwkJaWYgKCAhIHRoaXMuY29tYm9Cb3guaXNEaXNwb3NlZCgpKSB7CisJCQl0aGlzLnNlcXVlbmNlQ2hhbmdlZF8oc2VxdWVuY2UpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VDaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2VxdWVuY2Ugc2VxdWVuY2UpIHsKKwkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0CisJfQorCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgdGFibGVDaGFuZ2VkKFRhYmxlIHRhYmxlKSB7CisJCWlmICggISB0aGlzLmNvbWJvQm94LmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy50YWJsZUNoYW5nZWRfKHRhYmxlKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHRhYmxlQ2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRhYmxlIHRhYmxlKSB7CisJCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAorCX0KKworCXByb3RlY3RlZCBmaW5hbCB2b2lkIGNvbHVtbkNoYW5nZWQoQ29sdW1uIGNvbHVtbikgeworCQlpZiAoICEgdGhpcy5jb21ib0JveC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXRoaXMuY29sdW1uQ2hhbmdlZF8oY29sdW1uKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGNvbHVtbkNoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2x1bW4gY29sdW1uKSB7CisJCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAorCX0KKworCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKEZvcmVpZ25LZXkgZm9yZWlnbktleSkgeworCQlpZiAoICEgdGhpcy5jb21ib0JveC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXRoaXMuZm9yZWlnbktleUNoYW5nZWRfKGZvcmVpZ25LZXkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZm9yZWlnbktleUNoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKKwkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBmbGFnLCBTdHJpbmcgbWVzc2FnZSkgeworCQlpZiAoZmxhZy5lcXVhbHMoVHJhY2luZy5VSV9EQikgJiYgVHJhY2luZy5ib29sZWFuRGVidWdPcHRpb24oVHJhY2luZy5VSV9EQikpIHsKKwkJCXRoaXMubG9nKG1lc3NhZ2UpOworCQl9IGVsc2UgeworCQkJc3VwZXIubG9nKGZsYWcsIG1lc3NhZ2UpOworCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gbGlzdGVuZXIgKioqKioqKioqKgorCisJcHJvdGVjdGVkIGNsYXNzIExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgQ29ubmVjdGlvbkxpc3RlbmVyIHsKKworCQlwcm90ZWN0ZWQgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlzdXBlcigpOworCQl9CisKKwkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKKwkJCXRoaXMubG9nKCJvcGVuZWQ6ICIgKyBwcm9maWxlLmdldE5hbWUoKSk7CisJCQlEYXRhYmFzZU9iamVjdENvbWJvLnRoaXMucmVwb3B1bGF0ZUNvbWJvQm94KCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7CisJCQl0aGlzLmxvZygibW9kaWZpZWQ6ICIgKyBwcm9maWxlLmdldE5hbWUoKSk7CisJCQlEYXRhYmFzZU9iamVjdENvbWJvLnRoaXMucmVwb3B1bGF0ZUNvbWJvQm94KCk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgeworCQkJdGhpcy5sb2coIk9LIHRvIGNsb3NlOiAiICsgcHJvZmlsZS5nZXROYW1lKCkpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgeworCQkJdGhpcy5sb2coImFib3V0IHRvIGNsb3NlOiAiICsgcHJvZmlsZS5nZXROYW1lKCkpOworCQl9CisKKwkJcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKKwkJCXRoaXMubG9nKCJjbG9zZWQ6ICIgKyBwcm9maWxlLmdldE5hbWUoKSk7CisJCQlEYXRhYmFzZU9iamVjdENvbWJvLnRoaXMucmVwb3B1bGF0ZUNvbWJvQm94KCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKKwkJCXRoaXMubG9nKCJkYXRhYmFzZSBjaGFuZ2VkOiAiICsgZGF0YWJhc2UuZ2V0TmFtZSgpKTsKKwkJCURhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5kYXRhYmFzZUNoYW5nZWQoZGF0YWJhc2UpOworCQl9CisKKwkJcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ2F0YWxvZyBjYXRhbG9nKSB7CisJCQl0aGlzLmxvZygiY2F0YWxvZyBjaGFuZ2VkOiAiICsgY2F0YWxvZy5nZXROYW1lKCkpOworCQkJRGF0YWJhc2VPYmplY3RDb21iby50aGlzLmNhdGFsb2dDaGFuZ2VkKGNhdGFsb2cpOworCQl9CisKKwkJcHVibGljIHZvaWQgc2NoZW1hQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTY2hlbWEgc2NoZW1hKSB7CisJCQl0aGlzLmxvZygic2NoZW1hIGNoYW5nZWQ6ICIgKyBzY2hlbWEuZ2V0TmFtZSgpKTsKKwkJCURhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5zY2hlbWFDaGFuZ2VkKHNjaGVtYSk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2VxdWVuY2Ugc2VxdWVuY2UpIHsKKwkJCXRoaXMubG9nKCJzZXF1ZW5jZSBjaGFuZ2VkOiAiICsgc2VxdWVuY2UuZ2V0TmFtZSgpKTsKKwkJCURhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5zZXF1ZW5jZUNoYW5nZWQoc2VxdWVuY2UpOworCQl9CisKKwkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFRhYmxlIHRhYmxlKSB7CisJCQl0aGlzLmxvZygidGFibGUgY2hhbmdlZDogIiArIHRhYmxlLmdldE5hbWUoKSk7CisJCQlEYXRhYmFzZU9iamVjdENvbWJvLnRoaXMudGFibGVDaGFuZ2VkKHRhYmxlKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGNvbHVtbkNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ29sdW1uIGNvbHVtbikgeworCQkJdGhpcy5sb2coImNvbHVtbiBjaGFuZ2VkOiAiICsgY29sdW1uLmdldE5hbWUoKSk7CisJCQlEYXRhYmFzZU9iamVjdENvbWJvLnRoaXMuY29sdW1uQ2hhbmdlZChjb2x1bW4pOworCQl9CisKKwkJcHVibGljIHZvaWQgZm9yZWlnbktleUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7CisJCQl0aGlzLmxvZygiZm9yZWlnbiBrZXkgY2hhbmdlZDogIiArIGZvcmVpZ25LZXkuZ2V0TmFtZSgpKTsKKwkJCURhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5mb3JlaWduS2V5Q2hhbmdlZChmb3JlaWduS2V5KTsKKwkJfQorCisJCXByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgeworCQkJRGF0YWJhc2VPYmplY3RDb21iby50aGlzLmxvZyhUcmFjaW5nLlVJX0RCLCBtZXNzYWdlKTsKKwkJfQorCisJfQorCQkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvZGIvU2NoZW1hQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvZGIvU2NoZW1hQ29tYm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTFkYmNkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9TY2hlbWFDb21iby5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYjsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWFDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgY29tYm8tYm94IGRpc3BsYXlzIGEgc2NoZW1hIGNvbnRhaW5lcidzIHNjaGVtYXRhLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2NoZW1hQ29tYm88VCBleHRlbmRzIEpwYU5vZGU+CisJZXh0ZW5kcyBEYXRhYmFzZU9iamVjdENvbWJvPFQ+Cit7CisJcHVibGljIFNjaGVtYUNvbWJvKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgU2NoZW1hQ29tYm8oCisJCQkJCQlQYW5lPD8+IHBhcmVudFBhbmUsCisJCQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJCQkJCQlDb21wb3NpdGUgcGFyZW50CisJKSB7CisJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CisJfQorCisJcHVibGljIFNjaGVtYUNvbWJvKAorCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCQkJCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeQorCSkgeworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHZhbHVlcygpIHsKKwkJU2NoZW1hQ29udGFpbmVyIHNjID0gdGhpcy5nZXREYlNjaGVtYUNvbnRhaW5lcigpOworCQlyZXR1cm4gKHNjICE9IG51bGwpID8gc2Muc29ydGVkU2NoZW1hSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpOworCX0KKworCXByb3RlY3RlZCBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXIoKSB7CisJCXJldHVybiAodGhpcy5nZXRTdWJqZWN0KCkgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXREYlNjaGVtYUNvbnRhaW5lcl8oKTsKKwl9CisKKwkvKioKKwkgKiBBc3N1bWUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcl8oKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9TZXF1ZW5jZUNvbWJvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL1NlcXVlbmNlQ29tYm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGNlYWYxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9TZXF1ZW5jZUNvbWJvLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBjb21iby1ib3ggZGlzcGxheXMgYSBzY2hlbWEncyBzZXF1ZW5jZXMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXF1ZW5jZUNvbWJvPFQgZXh0ZW5kcyBKcGFOb2RlPgorCWV4dGVuZHMgRGF0YWJhc2VPYmplY3RDb21ibzxUPgoreworCXB1YmxpYyBTZXF1ZW5jZUNvbWJvKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgU2VxdWVuY2VDb21ibygKKwkJCQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKKwkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQKKwkpIHsKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgU2VxdWVuY2VDb21ibygKKwkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkKKwkpIHsKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB2YWx1ZXMoKSB7CisJCVNjaGVtYSBkYlNjaGVtYSA9IHRoaXMuZ2V0RGJTY2hlbWEoKTsKKwkJcmV0dXJuIChkYlNjaGVtYSAhPSBudWxsKSA/IGRiU2NoZW1hLnNvcnRlZFNlcXVlbmNlSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpOworCX0KKworCXByb3RlY3RlZCBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7CisJCXJldHVybiAodGhpcy5nZXRTdWJqZWN0KCkgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXREYlNjaGVtYV8oKTsKKwl9CisKKwkvKioKKwkgKiBBc3N1bWUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IFNjaGVtYSBnZXREYlNjaGVtYV8oKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9UYWJsZUNvbWJvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL1RhYmxlQ29tYm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDc1NDIxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9UYWJsZUNvbWJvLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBjb21iby1ib3ggZGlzcGxheXMgYSBzY2hlbWEncyB0YWJsZXMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUYWJsZUNvbWJvPFQgZXh0ZW5kcyBKcGFOb2RlPgorCWV4dGVuZHMgRGF0YWJhc2VPYmplY3RDb21ibzxUPgoreworCXB1YmxpYyBUYWJsZUNvbWJvKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgVGFibGVDb21ibygKKwkJCQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKKwkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQKKwkpIHsKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgVGFibGVDb21ibygKKwkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkKKwkpIHsKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB2YWx1ZXMoKSB7CisJCVNjaGVtYSBkYlNjaGVtYSA9IHRoaXMuZ2V0RGJTY2hlbWEoKTsKKwkJcmV0dXJuIChkYlNjaGVtYSAhPSBudWxsKSA/IGRiU2NoZW1hLnNvcnRlZFRhYmxlSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpOworCX0KKworCXByb3RlY3RlZCBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7CisJCXJldHVybiAodGhpcy5nZXRTdWJqZWN0KCkgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXREYlNjaGVtYV8oKTsKKwl9CisKKwkvKioKKwkgKiBBc3N1bWUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IFNjaGVtYSBnZXREYlNjaGVtYV8oKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjcwZDRlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSwyMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLk1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuSmF2YVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIGRlZmluaXRpb24gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZSBpdCBpcyBpbml0aWFsaXplZCkuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbgorCWltcGxlbWVudHMgUmVzb3VyY2VVaURlZmluaXRpb24sIE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbgoreworCXByaXZhdGUgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz5bXSBzcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnM7CisJCisJcHJpdmF0ZSBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBzcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uczsKKwkKKwlwcml2YXRlIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/PltdIGRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uczsKKwkKKwlwcml2YXRlIGZpbmFsIEphdmFVaUZhY3RvcnkgZmFjdG9yeTsKKwkKKwkKKwkvKioKKwkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCQl0aGlzLmZhY3RvcnkgPSBidWlsZEphdmFVaUZhY3RvcnkoKTsKKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IEphdmFVaUZhY3RvcnkgYnVpbGRKYXZhVWlGYWN0b3J5KCk7CisJCisJcHVibGljIEphdmFVaUZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKKwkJcmV0dXJuIHRoaXMuZmFjdG9yeTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7CisJCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJcHVibGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gSmF2YVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5pbnN0YW5jZSgpOworCX0KKwkKKwkKKwkKKwkvLyAqKioqKioqKioqIHR5cGUgbWFwcGluZyB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKFN0cmluZyBrZXksIFByb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4gbWFwcGluZ0hvbGRlciwgQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCUphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxUeXBlTWFwcGluZz4gbWFwcGluZ1VpRGVmaW5pdGlvbiA9IGdldEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbihtYXBwaW5nSG9sZGVyLmdldFZhbHVlKCkpOworCQlyZXR1cm4gbWFwcGluZ1VpRGVmaW5pdGlvbi5idWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJZ2V0RmFjdG9yeSgpLCAKKwkJCW1hcHBpbmdIb2xkZXIsCisJCQlwYXJlbnQsCisJCQl3aWRnZXRGYWN0b3J5CisJCSk7CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248VHlwZU1hcHBpbmc+IGdldEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbihUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgeworCQlpZiAodHlwZU1hcHBpbmcgPT0gbnVsbCB8fCB0eXBlTWFwcGluZy5nZXRLZXkoKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gKEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxUeXBlTWFwcGluZz4pIGdldERlZmF1bHRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbigpOworCQl9CisJCXJldHVybiAoSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPFR5cGVNYXBwaW5nPikgZ2V0U3BlY2lmaWVkSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKHR5cGVNYXBwaW5nLmdldEtleSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+IGdldFNwZWNpZmllZEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSkgeworCQlmb3IgKEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+IGRlZmluaXRpb24gOiBnZXRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW50aW9ucygpKSB7CisJCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwoZGVmaW5pdGlvbi5nZXRLZXkoKSwgbWFwcGluZ0tleSkpIHsKKwkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKKwkJCX0KKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHR5cGUgbWFwcGluZyBrZXk6ICIgKyBtYXBwaW5nS2V5KTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlwdWJsaWMgSXRlcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiB0eXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7CisJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+KGdldFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbnRpb25zKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+W10gZ2V0U3BlY2lmaWVkVHlwZU1hcHBpbmdVaURlZmludGlvbnMoKSB7CisJCWlmICh0aGlzLnNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucyA9PSBudWxsKSB7CisJCQl0aGlzLnNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucyA9IHRoaXMuYnVpbGRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW50aW9ucygpOworCQl9CisJCXJldHVybiB0aGlzLnNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uczsKKwl9CisJCisJCisJLyoqCisJICogUmV0dXJuIGFuIGFycmF5IG9mIG1hcHBpbmcgZGVmaW5pdGlvbnMgdG8gdXNlIGZvciB0eXBlcyBpbiBtYXBwaW5nIGZpbGVzIG9mIHRoaXMgdHlwZS4gIAorCSAqIFRoZSBvcmRlciBpcyB1bmltcG9ydGFudC4KKwkgKi8KKwlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz5bXSBidWlsZFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbnRpb25zKCkgeworCQlBcnJheUxpc3Q8SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4oKTsKKwkJdGhpcy5hZGRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPltdIGRlZmluaXRpb25BcnJheSA9IGRlZmluaXRpb25zLnRvQXJyYXkobmV3IEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbltkZWZpbml0aW9ucy5zaXplKCldKTsKKwkJcmV0dXJuIGRlZmluaXRpb25BcnJheTsKKwl9CisKKworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKTsKKwkKKwlwdWJsaWMgRGVmYXVsdEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+IGdldERlZmF1bHRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIE51bGxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKTsKKwl9CisJCisJLy8gKioqKioqKioqKiBhdHRyaWJ1dGVzIG1hcHBpbmcgVUkgZGVmaW5pdGlvbnMgKioqKioqKioqKgorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKFN0cmluZyBrZXksIFByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nSG9sZGVyLCBDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248QXR0cmlidXRlTWFwcGluZz4gbWFwcGluZ1VpRGVmaW5pdGlvbiA9IGdldEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24obWFwcGluZ0hvbGRlci5nZXRWYWx1ZSgpKTsKKwkJcmV0dXJuIG1hcHBpbmdVaURlZmluaXRpb24uYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJZ2V0RmFjdG9yeSgpLCAKKwkJCW1hcHBpbmdIb2xkZXIsCisJCQlwYXJlbnQsCisJCQl3aWRnZXRGYWN0b3J5CisJCSk7CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKEF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZykgeworCQlTdHJpbmcga2V5ID0gYXR0cmlidXRlTWFwcGluZyA9PSBudWxsID8gbnVsbCA6IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0S2V5KCk7CisJCWlmIChhdHRyaWJ1dGVNYXBwaW5nID09IG51bGwgfHwgYXR0cmlidXRlTWFwcGluZy5pc0RlZmF1bHQoKSkgeworCQkJcmV0dXJuIChKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxBdHRyaWJ1dGVNYXBwaW5nPikgZ2V0RGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oa2V5KTsKKwkJfQorCQlyZXR1cm4gKEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEF0dHJpYnV0ZU1hcHBpbmc+KSBnZXRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKGtleSk7CisJfQorCQorCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gZ2V0U3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSkgeworCQlmb3IgKEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBkZWZpbml0aW9uIDogZ2V0U3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSkgeworCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKGRlZmluaXRpb24uZ2V0S2V5KCksIG1hcHBpbmdLZXkpKSB7CisJCQkJcmV0dXJuIGRlZmluaXRpb247CisJCQl9CisJCX0KKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBhdHRyaWJ1dGUgbWFwcGluZyBrZXk6ICIgKyBtYXBwaW5nS2V5KTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBhdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKKwkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4oZ2V0U3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSk7CisJfQorCQorCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+W10gZ2V0U3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7CisJCWlmICh0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zID09IG51bGwpIHsKKwkJCXRoaXMuc3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uczsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIGFuIGFycmF5IG9mIG1hcHBpbmcgZGVmaW5pdGlvbnMgdG8gdXNlIGZvciBhdHRyaWJ1dGVzIGluIG1hcHBpbmcgZmlsZXMgb2YgdGhpcyB0eXBlLiAgCisJICogVGhlIG9yZGVyIGlzIHVuaW1wb3J0YW50LgorCSAqLworCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBidWlsZFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkgeworCQlBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PigpOworCQl0aGlzLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oZGVmaW5pdGlvbnMpOworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+W10gZGVmaW5pdGlvbkFycmF5ID0gZGVmaW5pdGlvbnMudG9BcnJheShuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25bZGVmaW5pdGlvbnMuc2l6ZSgpXSk7CisJCXJldHVybiBkZWZpbml0aW9uQXJyYXk7CisJfQorCisKKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucyk7CisKKwkvLyAqKioqKioqKioqIGRlZmF1bHQgSmF2YSBhdHRyaWJ1dGUgbWFwcGluZyBVSSBwcm92aWRlcnMgKioqKioqKioqKgorCQorCXB1YmxpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IGdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKFN0cmluZyBrZXkpIHsKKwkJZm9yIChEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IGRlZmluaXRpb24gOiBnZXREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSkgeworCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKGRlZmluaXRpb24uZ2V0RGVmYXVsdEtleSgpLCBrZXkpKSB7CisJCQkJcmV0dXJuIGRlZmluaXRpb247CisJCQl9CisJCX0KKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBhdHRyaWJ1dGUgbWFwcGluZyBrZXk6ICIgKyBrZXkpOyAvLyROT04tTkxTLTEkCisJfQorCQkKKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBnZXREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7CisJCWlmICh0aGlzLmRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucyA9PSBudWxsKSB7CisJCQl0aGlzLmRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucyA9IHRoaXMuYnVpbGREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5kZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnM7CisJfQorCisJcHJvdGVjdGVkIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/PltdIGJ1aWxkRGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkgeworCQlBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+PiBkZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+PigpOworCQl0aGlzLmFkZERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKKwkJRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+W10gZGVmaW5pdGlvbkFycmF5ID0gZGVmaW5pdGlvbnMudG9BcnJheShuZXcgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uW2RlZmluaXRpb25zLnNpemUoKV0pOworCQlyZXR1cm4gZGVmaW5pdGlvbkFycmF5OworCX0KKworCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkRGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248Pz4+IGRlZmluaXRpb25zKTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Jhc2VKYXZhVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQmFzZUphdmFVaUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWE5ZWUzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Jhc2VKYXZhVWlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzaWNNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkVtYmVkZGFibGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PbmVUb09uZU1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW50aXR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVJIGZhY3RvcnkgcmVxdWlyZWQgdG8gc2hvdyB0aGUgaW5mb3JtYXRpb24KKyAqIHJlbGF0ZWQgdG8gYSBKUEEgbWFwcGluZyAodHlwZSBvciBhdHRyaWJ1dGUpLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUphdmFVaUZhY3RvcnkgaW1wbGVtZW50cyBKYXZhVWlGYWN0b3J5Cit7CQorCQorCS8vICoqKioqKioqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVudGl0eUNvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEphdmFFbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRW1iZWRkYWJsZUNvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBFbWJlZGRhYmxlQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCQorCS8vICoqKioqKioqKioqKioqKiogb3JtIHR5cGUgbWFwcGluZyBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW50aXR5Q29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1FbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRhYmxlQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIGphdmEgYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhSWRNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFCYXNpY01hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBCYXNpY01hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YVZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEphdmFFbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhVHJhbnNpZW50TWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzNmQzZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RCYXNpY01hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBEZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhQmFzaWNNYXBwaW5nPgorCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFCYXNpY01hcHBpbmc+Cit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFCYXNpY01hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBEZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEtleSgpIHsKKwkJcmV0dXJuIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgeworCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0RGVmYXVsdEtleSgpKTsKKwl9CisKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhQmFzaWNNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM5NDJhYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhRW1iZWRkZWRNYXBwaW5nPgorCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbWJlZGRlZE1hcHBpbmc+Cit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbWJlZGRlZE1hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkJCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7CisJCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldERlZmF1bHRLZXkoKSk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvR2VuZXJpY0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0dlbmVyaWNKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWEwYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0dlbmVyaWNKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUmVzb3VyY2VVaURlZmluaXRpb24gZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEdlbmVyaWNKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgorCSAqLworCXByb3RlY3RlZCBHZW5lcmljSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSmF2YVVpRmFjdG9yeSBidWlsZEphdmFVaUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0phdmFVaUZhY3RvcnkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248Pz4+IGRlZmluaXRpb25zKSB7CisJCWRlZmluaXRpb25zLmFkZChEZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbnRpdHlVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9HZW5lcmljSmF2YVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0dlbmVyaWNKYXZhVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4M2NhNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9HZW5lcmljSmF2YVVpRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCisvKioKKyAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBKYXZhIFVJIGZhY3RvcnkgcmVxdWlyZWQgdG8gc2hvdyB0aGUgaW5mb3JtYXRpb24KKyAqIHJlbGF0ZWQgdG8gYSBKUEEgbWFwcGluZyAodHlwZSBvciBhdHRyaWJ1dGUpLgorICoKKyAqIEBzZWUgSmF2YVVpRmFjdG9yeQorICoKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFVaUZhY3RvcnkgZXh0ZW5kcyBCYXNlSmF2YVVpRmFjdG9yeQoreworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2ZWJiZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RCYXNpY01hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIEphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFCYXNpY01hcHBpbmc+CisJaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhQmFzaWNNYXBwaW5nPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IEphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFCYXNpY01hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBKYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFCYXNpY01hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZWE2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRhYmxlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBKYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbiAKKwlleHRlbmRzIEFic3RyYWN0RW1iZWRkYWJsZVVpRGVmaW5pdGlvbjxKYXZhRW1iZWRkYWJsZT4KKwlpbXBsZW1lbnRzIEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhRW1iZWRkYWJsZT4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbWJlZGRhYmxlPiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlSmF2YUVtYmVkZGFibGVDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMmU1MDEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIEphdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbWJlZGRlZElkTWFwcGluZz4KKwlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbWJlZGRlZElkTWFwcGluZz4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbWJlZGRlZElkTWFwcGluZz4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEphdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0JCisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVtYmVkZGVkSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDhmOTBiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb248SmF2YUVtYmVkZGVkTWFwcGluZz4KKwlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbWJlZGRlZE1hcHBpbmc+Cit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUVtYmVkZGVkTWFwcGluZz4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbnRpdHlDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWYyN2JhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbnRpdHlDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhlIHBhbmUgdXNlZCBmb3IgYSBKYXZhIGVudGl0eS4KKyAqCisgKiBAc2VlIEphdmFFbnRpdHkKKyAqIEBzZWUgSmF2YVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQorICogQHNlZSBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhRW50aXR5Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGU8SmF2YUVudGl0eT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkphdmFFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5KYXZhRW50aXR5PC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEphdmFFbnRpdHlDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRJbmhlcml0YW5jZUNvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBKYXZhSW5oZXJpdGFuY2VDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbnRpdHlVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRW50aXR5VWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0ZGU2YwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRW50aXR5VWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5VWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBKYXZhRW50aXR5VWlEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdEVudGl0eVVpRGVmaW5pdGlvbjxKYXZhRW50aXR5PgorCWltcGxlbWVudHMgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbnRpdHk+Cit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVudGl0eVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgSmF2YUVudGl0eVVpRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUVudGl0eT4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEphdmFFbnRpdHlVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhRW50aXR5Q29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFJZE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwNjY0OQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RJZE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIEphdmFJZE1hcHBpbmdVaURlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0SWRNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFJZE1hcHBpbmc+CisJaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhSWRNYXBwaW5nPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFJZE1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IEphdmFJZE1hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFJZE1hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBKYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFJbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFJbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MjFhZmUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGUgcGFuZSB1c2VkIGZvciBqYXZhIGluaGVyaXRhbmNlLgorICoKKyAqIEBzZWUgSmF2YUVudGl0eQorICogQHNlZSBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhSW5oZXJpdGFuY2VDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlPEphdmFFbnRpdHk+IHsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBKYXZhSW5oZXJpdGFuY2VDb21wb3NpdGUoRm9ybVBhbmU8PyBleHRlbmRzIEphdmFFbnRpdHk+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWNiMWZjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFNYW55VG9NYW55TWFwcGluZz4KKwlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFNYW55VG9NYW55TWFwcGluZz4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IEphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU1hbnlUb01hbnlNYXBwaW5nPiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4ZjY4MwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIEphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU1hbnlUb09uZU1hcHBpbmc+CisJaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhTWFueVRvT25lTWFwcGluZz4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFNYW55VG9PbmVNYXBwaW5nPiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxOWYyZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgSWRDbGFzc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIE1hcHBlZFN1cGVyY2xhc3MKKyAqIEBzZWUgSmF2YVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQorICogQHNlZSBJZENsYXNzQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEphdmFNYXBwZWRTdXBlcmNsYXNzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4NGRjYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBKYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uPEphdmFNYXBwZWRTdXBlcmNsYXNzPgorCWltcGxlbWVudHMgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFNYXBwZWRTdXBlcmNsYXNzPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCW5ldyBKYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFNYXBwZWRTdXBlcmNsYXNzPiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTI3MjhiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0T25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhT25lVG9NYW55TWFwcGluZz4KKwlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFPbmVUb01hbnlNYXBwaW5nPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCW5ldyBKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU9uZVRvTWFueU1hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhNDBhZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0T25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFPbmVUb09uZU1hcHBpbmc+CisJaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhT25lVG9PbmVNYXBwaW5nPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFPbmVUb09uZU1hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBKYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlYjI2YgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRldGFpbHMgcGFnZSB1c2VkIGZvciB0aGUgSmF2YSBwZXJzaXN0ZW50CisgKiBhdHRyaWJ1dGUuCisgKiA8cD4KKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVHlwZSBtYXBwaW5nIHBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUKKyAqIEBzZWUgSmF2YVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UgZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCS8vIE1hcCBhcyBjb21wb3NpdGUKKwkJbmV3IFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZSgKKwkJCXRoaXMsCisJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMCwgNSwgMCkKKwkJKTsKKworCQlidWlsZE1hcHBpbmdQYWdlQm9vayhjb250YWluZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYjVhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTdHJ1Y3R1cmVOb2RlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSA8Y29kZT5KcGFEZXRhaWxzUGFnZTwvY29kZT4KKyAqIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIEphdmEgc291cmNlIGZpbGUuCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcgorCWltcGxlbWVudHMgSnBhRGV0YWlsc1Byb3ZpZGVyCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhRGV0YWlsc1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpwYURldGFpbHNQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzRGV0YWlscyhKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUpIHsKKwkJCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoc3RydWN0dXJlTm9kZS5nZXRJZCgpLCBKYXZhU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSUQpCisJCQkJJiYgc3RydWN0dXJlTm9kZS5nZXRSZXNvdXJjZVR5cGUoKS5nZXRDb250ZW50VHlwZSgpLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSk7CisJfQorCQorCXB1YmxpYyBKcGFEZXRhaWxzUGFnZTxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGREZXRhaWxzUGFnZSgKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJCisJCXJldHVybiBuZXcgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZShwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjRiMTg4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTdHJ1Y3R1cmVOb2RlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIDxjb2RlPkpwYURldGFpbHNQYWdlPC9jb2RlPgorICogd2hlbiB0aGUgaW5mb3JtYXRpb24gY29tZXMgZnJvbSB0aGUgSmF2YSBzb3VyY2UgZmlsZS4KKyAqLworcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcgorCWltcGxlbWVudHMgSnBhRGV0YWlsc1Byb3ZpZGVyCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhRGV0YWlsc1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCisJICovCisJcHVibGljIHN0YXRpYyBKcGFEZXRhaWxzUHJvdmlkZXIgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIGJvb2xlYW4gcHJvdmlkZXNEZXRhaWxzKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgeworCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChzdHJ1Y3R1cmVOb2RlLmdldElkKCksIEphdmFTdHJ1Y3R1cmVOb2Rlcy5QRVJTSVNURU5UX1RZUEVfSUQpCisJCQkJJiYgc3RydWN0dXJlTm9kZS5nZXRSZXNvdXJjZVR5cGUoKS5nZXRDb250ZW50VHlwZSgpLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSk7CisJfQorCQorCXB1YmxpYyBKcGFEZXRhaWxzUGFnZTxQZXJzaXN0ZW50VHlwZT4gYnVpbGREZXRhaWxzUGFnZSgKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJCisJCXJldHVybiBuZXcgUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZShwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NjdhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEBzZWUgSmF2YUVudGl0eQorICogQHNlZSBKYXZhSW5oZXJpdGFuY2VDb21wb3NpdGUgLSBUaGUgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlPEphdmFFbnRpdHk+Cit7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UHJpbWFyeUtleUpvaW5Db2x1bW4+KGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSk7CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIFByaW1hcnlLZXlKb2luQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc3dpdGNoRGVmYXVsdFRvU3BlY2lmaWVkKCkgeworCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGdldFN1YmplY3QoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKKworCQlpZiAoZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgeworCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOworCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7CisKKwkJCVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IGdldFN1YmplY3QoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKKwkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtbk5hbWUpOworCQkJcGtKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKKworCQkJdGhpcy5qb2luQ29sdW1uSG9sZGVyLnNldFZhbHVlKHBrSm9pbkNvbHVtbik7CisJCX0KKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWNmNWMyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVudGl0eQorICogQHNlZSBFbnRpdHlDb21wb3NpdGUgLSBUaGUgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICogQHNlZSBBZGRSZW1vdmVMaXN0UGFuZQorICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU8SmF2YUVudGl0eT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShGb3JtUGFuZTw/IGV4dGVuZHMgSmF2YUVudGl0eT4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUVudGl0eTwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U2Vjb25kYXJ5VGFibGU+IGJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdE1vZGVsKCkgeworCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTZWNvbmRhcnlUYWJsZT4oYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCksIAorCQkJVGFibGUuU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFkpOworCX0JCisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlPiBidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8RW50aXR5LCBTZWNvbmRhcnlUYWJsZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFNlY29uZGFyeVRhYmxlPiBsaXN0SXRlcmF0b3JfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpOworCQkJfQorCQl9OworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7CisKKwkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlSG9sZGVyID0KKwkJCWJ1aWxkU2Vjb25kYXJ5VGFibGVIb2xkZXIoKTsKKworCQkvLyBTZWNvbmRhcnkgVGFibGVzIGFkZC9yZW1vdmUgbGlzdCBwYW5lCisJCW5ldyBBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHk+KAorCQkJdGhpcywKKwkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pLAorCQkJYnVpbGRTZWNvbmRhcnlUYWJsZXNBZGFwdGVyKCksCisJCQlidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RNb2RlbCgpLAorCQkJc2Vjb25kYXJ5VGFibGVIb2xkZXIsCisJCQlidWlsZFNlY29uZGFyeVRhYmxlTGFiZWxQcm92aWRlcigpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMvL1RPRE8gbmVlZCBhIGhlbHAgY29udGV4dCBpZCBmb3IgdGhpcworCQkpOworCisJCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBwYW5lCisJCW5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlKAorCQkJdGhpcywKKwkJCXNlY29uZGFyeVRhYmxlSG9sZGVyLAorCQkJY29udGFpbmVyCisJCSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlOTVhNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIEphdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb248SmF2YVRyYW5zaWVudE1hcHBpbmc+CisJaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhVHJhbnNpZW50TWFwcGluZz4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFUcmFuc2llbnRNYXBwaW5nPiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFUcmFuc2llbnRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzVkNGRjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdFZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uPEphdmFWZXJzaW9uTWFwcGluZz4KKwlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFWZXJzaW9uTWFwcGluZz4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IEphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YVZlcnNpb25NYXBwaW5nPiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9OdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9OdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjljZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL051bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIE51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbgorCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFBdHRyaWJ1dGVNYXBwaW5nPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUF0dHJpYnV0ZU1hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBOdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEltYWdlIGdldEltYWdlKCkgeworCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRLZXkoKSk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5OdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLZXkoKSB7CisJCXJldHVybiBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUF0dHJpYnV0ZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgTnVsbENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwkKKwlwdWJsaWMgc3RhdGljIGNsYXNzIE51bGxDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxKYXZhQXR0cmlidXRlTWFwcGluZz4KKwkJaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKKwl7CisJCU51bGxDb21wb3NpdGUoCisJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFBdHRyaWJ1dGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7fQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9OdWxsSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvTnVsbEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MDE5YzIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvTnVsbEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgTnVsbEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbiBpbXBsZW1lbnRzIERlZmF1bHRKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248VHlwZU1hcHBpbmc+Cit7CisKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBOdWxsSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE51bGxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248VHlwZU1hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBOdWxsSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvclR5cGVNYXBwaW5nKG51bGwpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5OdWxsVHlwZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEtleSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZShKYXZhVWlGYWN0b3J5IGZhY3RvcnksIFByb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4gc3ViamVjdEhvbGRlciwgQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgTnVsbENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwkKKwlwdWJsaWMgc3RhdGljIGNsYXNzIE51bGxDb21wb3NpdGUgCisJCWV4dGVuZHMgRm9ybVBhbmU8VHlwZU1hcHBpbmc+CisJCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlIAorCXsKKwkJTnVsbENvbXBvc2l0ZSgKKwkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VHlwZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCSAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7fQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmN2FjZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhCkBAIC0wLDAgKzEsMjU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RKcGFEZXRhaWxzUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5DYXRhbG9nQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuU2NoZW1hQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFhtbFBhY2thZ2VDaG9vc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgU2NoZW1hOiAgICAgIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgQ2F0YWxvZzogICAgIHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgQWNjZXNzIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcm1RdWVyaWVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFbnRpdHlNYXBwaW5ncworICogQHNlZSBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBDYXRhbG9nQ29tYm8KKyAqIEBzZWUgRW51bUZvcm1Db21ib1ZpZXdlcgorICogQHNlZSBFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUKKyAqIEBzZWUgT3JtUGFja2FnZUNob29zZXIKKyAqIEBzZWUgT3JtUXVlcmllc0NvbXBvc2l0ZQorICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZQorICogQHNlZSBTY2hlbWFDb21ibworICoKKyAqIEB2ZXJzaW9uIDIuMgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIGV4dGVuZHMgQWJzdHJhY3RKcGFEZXRhaWxzUGFnZTxFbnRpdHlNYXBwaW5ncz4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlwcm90ZWN0ZWQgRW51bUZvcm1Db21ib1ZpZXdlcjxFbnRpdHlNYXBwaW5ncywgQWNjZXNzVHlwZT4gYWRkQWNjZXNzVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RW50aXR5TWFwcGluZ3MsIEFjY2Vzc1R5cGU+KHRoaXMsIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eU1hcHBpbmdzLkRFRkFVTFRfQUNDRVNTX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnRpdHlNYXBwaW5ncy5TUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzVHlwZVtdIGdldENob2ljZXMoKSB7CisJCQkJcmV0dXJuIEFjY2Vzc1R5cGUudmFsdWVzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdEFjY2VzcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhBY2Nlc3NUeXBlIHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlID09IEFjY2Vzc1R5cGUuRklFTEQgPworCQkJCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9maWVsZCA6CisJCQkJCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX3Byb3BlcnR5OworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGdldFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0QWNjZXNzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQWNjZXNzVHlwZSB2YWx1ZSkgeworCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRBY2Nlc3ModmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByb3RlY3RlZCBDYXRhbG9nQ29tYm88RW50aXR5TWFwcGluZ3M+IGFkZENhdGFsb2dDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJcmV0dXJuIG5ldyBDYXRhbG9nQ29tYm88RW50aXR5TWFwcGluZ3M+KHRoaXMsIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eU1hcHBpbmdzLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5TWFwcGluZ3MuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyh2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZENhdGFsb2coKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhPiBidWlsZFBlcnNpc3RlbnRVbml0TWV0YWRhdGFIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5TWFwcGluZ3MsIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHRyYW5zZm9ybV8oRW50aXR5TWFwcGluZ3MgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgU2NoZW1hQ29tYm88RW50aXR5TWFwcGluZ3M+IGFkZFNjaGVtYUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IFNjaGVtYUNvbWJvPEVudGl0eU1hcHBpbmdzPih0aGlzLCBjb250YWluZXIpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnRpdHlNYXBwaW5ncy5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5TWFwcGluZ3MuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0U2NoZW1hKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFNjaGVtYSh2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFNjaGVtYSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXJfKCkgeworCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREYlNjaGVtYUNvbnRhaW5lcigpOworCQkJfQorCisJCX07CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJLy8gUGFja2FnZSB3aWRnZXRzCisJCW5ldyBPcm1QYWNrYWdlQ2hvb3Nlcih0aGlzLCBjb250YWluZXIpOworCisJCS8vIFNjaGVtYSB3aWRnZXRzCisJCWFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX3NjaGVtYSwKKwkJCWFkZFNjaGVtYUNvbWJvKGNvbnRhaW5lciksCisJCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX1NDSEVNQQorCQkpOworCisJCS8vIENhdGFsb2cgd2lkZ2V0cworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9jYXRhbG9nLAorCQkJYWRkQ2F0YWxvZ0NvbWJvKGNvbnRhaW5lciksCisJCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX0NBVEFMT0cKKwkJKTsKKworCQkvLyBBY2Nlc3MgVHlwZSB3aWRnZXRzCisJCWFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX2FjY2VzcywKKwkJCWFkZEFjY2Vzc1R5cGVDb21ibyhjb250YWluZXIpLAorCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9BQ0NFU1MKKwkJKTsKKworCQkvLyBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhIHdpZGdldHMKKwkJbmV3IFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlKAorCQkJdGhpcywKKwkJCWJ1aWxkUGVyc2lzdGVudFVuaXRNZXRhZGF0YUhvbGRlcigpLAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDUpCisJCSk7CisKKwkJLy8gR2VuZXJhdG9ycyBwYW5lCisJCXRoaXMuYnVpbGRFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUoY29udGFpbmVyKTsKKworCQkvLyBRdWVyaWVzIHBhbmUKKwkJbmV3IE9ybVF1ZXJpZXNDb21wb3NpdGUoCisJCQl0aGlzLAorCQkJY29udGFpbmVyCisJCSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYnVpbGRFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlKAorCQkJdGhpcywKKwkJCWNvbnRhaW5lcgorCQkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RPcm1FbnRpdHlDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzk5OTZkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RPcm1FbnRpdHlDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRW50aXR5TmFtZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhYmxlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoZSBwYW5lIHVzZWQgZm9yIGFuIE9STSBlbnRpdHkuCisgKgorICogQHNlZSBPcm1FbnRpdHkKKyAqIEBzZWUgQmFzZUphdmFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKKyAqCisgKiBAdmVyc2lvbiAyMy4wCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUVudGl0eUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlPE9ybUVudGl0eT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybUVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPk9ybUVudGl0eTwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXByb3RlY3RlZCBBYnN0cmFjdE9ybUVudGl0eUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKGNvbnRhaW5lcik7CisJCWluaXRpYWxpemVRdWVyaWVzUGFuZShjb250YWluZXIpOworCQlpbml0aWFsaXplSW5oZXJpdGFuY2VQYW5lKGNvbnRhaW5lcik7CisJCWluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNQYW5lKGNvbnRhaW5lcik7CisJCWluaXRpYWxpemVHZW5lcmF0b3JzUGFuZShjb250YWluZXIpOworCQlpbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzUGFuZShjb250YWluZXIpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCQkKKwkJbmV3IE9ybUphdmFDbGFzc0Nob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKSwgZmFsc2UpOworCQluZXcgVGFibGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwkJbmV3IEVudGl0eU5hbWVDb21wb3NpdGUodGhpcywgYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbikpOworCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pLCBmYWxzZSk7CisJCW5ldyBNZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbikpOworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybUVudGl0eSwgQWNjZXNzSG9sZGVyPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGUoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJbmV3IE9ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRJbmhlcml0YW5jZUNvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBPcm1Jbmhlcml0YW5jZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ3YjdiMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5NYXBwaW5nUmVzb3VyY2VVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5TGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgZGVmaW5pdGlvbiBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlIGl0IGlzIGluaXRpYWxpemVkKS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24KKwlpbXBsZW1lbnRzIE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbgoreworCQorCXByaXZhdGUgT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPltdIG9ybVR5cGVNYXBwaW5nVWlEZWZpbnRpb25zOworCisJcHJpdmF0ZSBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPltdIG9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmludGlvbnM7CisJCisJcHJpdmF0ZSBmaW5hbCBPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeTsKKwkKKwkKKwkvKioKKwkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZmFjdG9yeSA9IGJ1aWxkT3JtWG1sVWlGYWN0b3J5KCk7CisJfQorCQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBPcm1YbWxVaUZhY3RvcnkgYnVpbGRPcm1YbWxVaUZhY3RvcnkoKTsKKwkKKwlwdWJsaWMgT3JtWG1sVWlGYWN0b3J5IGdldEZhY3RvcnkoKSB7CisJCXJldHVybiB0aGlzLmZhY3Rvcnk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogT1JNIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZShTdHJpbmcga2V5LCBQcm9wZXJ0eVZhbHVlTW9kZWw8VHlwZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXIsIENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxUeXBlTWFwcGluZz4gbWFwcGluZ1VpRGVmaW5pdGlvbiA9IAorCQkJKE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPFR5cGVNYXBwaW5nPikgZ2V0T3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb24oa2V5KTsKKwkJcmV0dXJuIG1hcHBpbmdVaURlZmluaXRpb24uYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCWdldEZhY3RvcnkoKSwgCisJCQltYXBwaW5nSG9sZGVyLAorCQkJcGFyZW50LAorCQkJd2lkZ2V0RmFjdG9yeQorCQkpOworCX0KKwkKKwlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPiBnZXRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSkgeworCQlmb3IgKE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4gZGVmaW5pdGlvbiA6IGdldE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpKSB7CisJCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwoZGVmaW5pdGlvbi5nZXRLZXkoKSwgbWFwcGluZ0tleSkpIHsKKwkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKKwkJCX0KKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHR5cGUgbWFwcGluZyBrZXk6ICIgKyBtYXBwaW5nS2V5KTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlwdWJsaWMgSXRlcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiB0eXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7CisJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+KGdldE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHN5bmNocm9uaXplZCBPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+W10gZ2V0T3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zKCkgeworCQlpZiAodGhpcy5vcm1UeXBlTWFwcGluZ1VpRGVmaW50aW9ucyA9PSBudWxsKSB7CisJCQl0aGlzLm9ybVR5cGVNYXBwaW5nVWlEZWZpbnRpb25zID0gdGhpcy5idWlsZE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpOworCQl9CisJCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nVWlEZWZpbnRpb25zOworCX0KKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgbWFwcGluZyBkZWZpbml0aW9ucyB0byB1c2UgZm9yIHR5cGVzIGluIG1hcHBpbmcgZmlsZXMgb2YgdGhpcyB0eXBlLiAgCisJICogVGhlIG9yZGVyIGlzIHVuaW1wb3J0YW50LgorCSAqLworCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+W10gYnVpbGRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7CisJCUFycmF5TGlzdDxPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8T3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4oKTsKKwkJdGhpcy5hZGRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+W10gZGVmaW5pdGlvbkFycmF5ID0gZGVmaW5pdGlvbnMudG9BcnJheShuZXcgT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25bZGVmaW5pdGlvbnMuc2l6ZSgpXSk7CisJCXJldHVybiBkZWZpbml0aW9uQXJyYXk7CisJfQorCisKKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKTsKKwkKKwlwdWJsaWMgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPiBnZXREZWZhdWx0VHlwZU1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCS8vdGhlcmUgaXMgbm8gd2F5IHRvIGNob29zZSBhbiB0eXBlIGluIHRoZSBvcm0ueG1sIHRoYXQgZG9lc24ndCBoYXZlIGEgc3BlY2lmaWVkIG1hcHBpbmcgc28gd2UgY2FuIHJldHVybiBudWxsIGhlcmUKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8vICoqKioqKioqKiogT1JNIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoU3RyaW5nIGtleSwgUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXIsIENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCU9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248QXR0cmlidXRlTWFwcGluZz4gbWFwcGluZ1VpRGVmaW5pdGlvbiA9IAorCQkJKE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248QXR0cmlidXRlTWFwcGluZz4pIGdldE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oa2V5KTsKKwkJcmV0dXJuIG1hcHBpbmdVaURlZmluaXRpb24uYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJZ2V0RmFjdG9yeSgpLCAKKwkJCW1hcHBpbmdIb2xkZXIsCisJCQlwYXJlbnQsCisJCQl3aWRnZXRGYWN0b3J5CisJCSk7CisJfQorCQorCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBnZXRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KSB7CisJCWZvciAoT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gZGVmaW5pdGlvbiA6IGdldE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkpIHsKKwkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChkZWZpbml0aW9uLmdldEtleSgpLCBtYXBwaW5nS2V5KSkgeworCQkJCXJldHVybiBkZWZpbml0aW9uOworCQkJfQorCQl9CisJCXJldHVybiBVbnN1cHBvcnRlZE9ybU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKTsKKwl9CisJCisJcHVibGljIExpc3RJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gYXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7CisJCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+KGdldE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+W10gZ2V0T3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7CisJCWlmICh0aGlzLm9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmludGlvbnMgPT0gbnVsbCkgeworCQkJdGhpcy5vcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbnRpb25zID0gdGhpcy5idWlsZE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCk7CisJCX0KKwkJcmV0dXJuIHRoaXMub3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW50aW9uczsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIGFuIGFycmF5IG9mIG1hcHBpbmcgZGVmaW5pdGlvbnMgdG8gdXNlIGZvciBhdHRyaWJ1dGVzIGluIG1hcHBpbmcgZmlsZXMgb2YgdGhpcyB0eXBlLiAgCisJICogVGhlIG9yZGVyIGlzIHVuaW1wb3J0YW50LgorCSAqLworCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPltdIGJ1aWxkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7CisJCUFycmF5TGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PigpOworCQl0aGlzLmFkZE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oZGVmaW5pdGlvbnMpOworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBkZWZpbml0aW9uQXJyYXkgPSBkZWZpbml0aW9ucy50b0FycmF5KG5ldyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uW2RlZmluaXRpb25zLnNpemUoKV0pOworCQlyZXR1cm4gZGVmaW5pdGlvbkFycmF5OworCX0KKworCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucyk7CisKKwlwdWJsaWMgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IGdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWRkR2VuZXJhdG9yRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BZGRHZW5lcmF0b3JEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGM1NmQyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWRkR2VuZXJhdG9yRGlhbG9nLmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRGlhbG9nUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5WYWxpZGF0aW5nRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKKy8qKgorICogQ2xpZW50cyBjYW4gdXNlIHRoaXMgZGlhbG9nIHRvIHByb21wdCB0aGUgdXNlciBmb3IgU2Vjb25kYXJ5VGFibGUgc2V0dGluZ3MuCisgKiBVc2UgdGhlIGZvbGxvd2luZyBvbmNlIHRoZSBkaWFsb2cgaXMgY2xvc2VkOgorICogICAgIEBzZWUgI2dldFNlbGVjdGVkVGFibGUoKQorICogICAgIEBzZWUgI2dldFNlbGVjdGVkQ2F0YWxvZygpCisgKiAgICAgQHNlZSAjZ2V0U2VsZWN0ZWRTY2hlbWEoKQorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBBZGRHZW5lcmF0b3JEaWFsb2cgZXh0ZW5kcyBWYWxpZGF0aW5nRGlhbG9nPEFkZEdlbmVyYXRvclN0YXRlT2JqZWN0PiB7CisKKwkKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCisKKwkvKioKKwkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBlZGl0IGFuIGV4aXN0aW5nIGNvbnZlcnNpb24gdmFsdWUKKwkgKi8KKwlwdWJsaWMgQWRkR2VuZXJhdG9yRGlhbG9nKFNoZWxsIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBBZGRHZW5lcmF0b3JTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgeworCQlyZXR1cm4gbmV3IEFkZEdlbmVyYXRvclN0YXRlT2JqZWN0KCk7CisJfQorCisJLy8gKioqKioqKioqKiBvcGVuICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7CisJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKKwkJc2hlbGwuc2V0VGV4dCh0aGlzLmdldFRpdGxlKCkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGUoKSB7CisJCXJldHVybiBKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5BZGRHZW5lcmF0b3JEaWFsb2dfdGl0bGU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvblRpdGxlKCkgeworCQlyZXR1cm4gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuQWRkR2VuZXJhdG9yRGlhbG9nX2Rlc2NyaXB0aW9uVGl0bGU7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5BZGRHZW5lcmF0b3JEaWFsb2dfZGVzY3JpcHRpb247CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBEaWFsb2dQYW5lPEFkZEdlbmVyYXRvclN0YXRlT2JqZWN0PiBidWlsZExheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCXJldHVybiBuZXcgR2VuZXJhdG9yRGlhbG9nUGFuZShjb250YWluZXIpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7CisJCXN1cGVyLmNyZWF0ZSgpOworCisJCUdlbmVyYXRvckRpYWxvZ1BhbmUgcGFuZSA9IChHZW5lcmF0b3JEaWFsb2dQYW5lKSBnZXRQYW5lKCk7CisJCXBhbmUuc2VsZWN0QWxsKCk7CisKKwkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKGZhbHNlKTsKKwl9CisKKworCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGRhdGEgdmFsdWUgc2V0IGluIHRoZSB0ZXh0IHdpZGdldC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0TmFtZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgb2JqZWN0IHZhbHVlIHNldCBpbiB0aGUgdGV4dCB3aWRnZXQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRHZW5lcmF0b3JUeXBlKCkgeworCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEdlbmVyYXRvclR5cGUoKTsKKwl9CisJCisJcHJpdmF0ZSBjbGFzcyBHZW5lcmF0b3JEaWFsb2dQYW5lIGV4dGVuZHMgRGlhbG9nUGFuZTxBZGRHZW5lcmF0b3JTdGF0ZU9iamVjdD4geworCisJCXByaXZhdGUgVGV4dCBuYW1lVGV4dDsKKworCQlHZW5lcmF0b3JEaWFsb2dQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCXN1cGVyKEFkZEdlbmVyYXRvckRpYWxvZy50aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJCXRoaXMubmFtZVRleHQgPSBhZGRMYWJlbGVkVGV4dCgKKwkJCQljb250YWluZXIsCisJCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuQWRkR2VuZXJhdG9yRGlhbG9nX25hbWUsCisJCQkJYnVpbGROYW1lSG9sZGVyKCkKKwkJCSk7CisJCQkKKwkJCWFkZExhYmVsZWRDb21ibygKKwkJCQljb250YWluZXIsIAorCQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLkFkZEdlbmVyYXRvckRpYWxvZ19nZW5lcmF0b3JUeXBlLCAKKwkJCQlidWlsZEdlbmVyYXRvclR5cGVMaXN0SG9sZGVyKCksIAorCQkJCWJ1aWxkR2VuZXJhdG9yVHlwZUhvbGRlcigpLCAKKwkJCQlidWlsZFN0cmluZ0NvbnZlcnRlcigpLAorCQkJCW51bGwpOworCQl9CisKKwkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRHZW5lcmF0b3JUeXBlTGlzdEhvbGRlcigpIHsKKwkJCUxpc3Q8U3RyaW5nPiBnZW5lcmF0b3JUeXBlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkJZ2VuZXJhdG9yVHlwZXMuYWRkKEdlbmVyYXRvci5UQUJMRV9HRU5FUkFUT1IpOworCQkJZ2VuZXJhdG9yVHlwZXMuYWRkKEdlbmVyYXRvci5TRVFVRU5DRV9HRU5FUkFUT1IpOworCQkJCisJCQlyZXR1cm4gbmV3IFN0YXRpY0xpc3RWYWx1ZU1vZGVsPFN0cmluZz4oZ2VuZXJhdG9yVHlwZXMpOworCQl9CisJCQorCQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkU3RyaW5nQ29udmVydGVyKCkgeworCQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKKwkJCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKKwkJCQkJaWYgKHZhbHVlID09IEdlbmVyYXRvci5UQUJMRV9HRU5FUkFUT1IpIHsKKwkJCQkJCXJldHVybiBKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5BZGRHZW5lcmF0b3JEaWFsb2dfdGFibGVHZW5lcmF0b3I7CisJCQkJCX0KKwkJCQkJaWYgKHZhbHVlID09IEdlbmVyYXRvci5TRVFVRU5DRV9HRU5FUkFUT1IpIHsKKwkJCQkJCXJldHVybiBKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5BZGRHZW5lcmF0b3JEaWFsb2dfc2VxdWVuY2VHZW5lcmF0b3I7CisJCQkJCX0KKwkJCQkJcmV0dXJuIHZhbHVlOworCQkJCX0KKwkJCX07CisJCX0KKwkJCisJCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoKSB7CisJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxBZGRHZW5lcmF0b3JTdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEFkZEdlbmVyYXRvclN0YXRlT2JqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKKwkJCQl9CisJCQl9OworCQl9CisKKwkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkR2VuZXJhdG9yVHlwZUhvbGRlcigpIHsKKwkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEFkZEdlbmVyYXRvclN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQWRkR2VuZXJhdG9yU3RhdGVPYmplY3QuR0VORVJBVE9SX1RZUEVfUFJPUEVSVFkpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEdlbmVyYXRvclR5cGUoKTsKKwkJCQl9CisKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7CisJCQkJCXRoaXMuc3ViamVjdC5zZXRHZW5lcmF0b3JUeXBlKHZhbHVlKTsKKwkJCQl9CisJCQl9OworCQl9CisKKwkJdm9pZCBzZWxlY3RBbGwoKSB7CisJCQl0aGlzLm5hbWVUZXh0LnNlbGVjdEFsbCgpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWRkR2VuZXJhdG9yU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0FkZEdlbmVyYXRvclN0YXRlT2JqZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxMGY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0FkZEdlbmVyYXRvclN0YXRlT2JqZWN0LmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLkFic3RyYWN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Qcm9ibGVtOworCisvKioKKyAqIFRoaXMgaXMgdGhlIHN0YXRlIG9iamVjdCB1c2VkIGJ5IHRoZSA8Y29kZT5BZGRHZW5lcmF0b3JEaWFsb2c8L2NvZGU+LCB3aGljaCBzdG9yZXMKKyAqIHRoZSBjdXJyZW50IG5hbWUgYW5kIHZhbGlkYXRlcyBpdCB3aGVuIGl0IGlzIG1vZGlmaWVkLgorICoKKyAqIEBzZWUgQWRkR2VuZXJhdG9yRGlhbG9nCisgKgorICogQHZlcnNpb24gMi4xCisgKiBAc2luY2UgMi4xCisgKi8KK2ZpbmFsIGNsYXNzIEFkZEdlbmVyYXRvclN0YXRlT2JqZWN0IGV4dGVuZHMgQWJzdHJhY3ROb2RlCit7CisJLyoqCisJICogVGhlIGluaXRpYWwgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiBUaGUgaW5pdGlhbCBnZW5lcmF0b3JUeXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdG9yVHlwZTsKKworCS8qKgorCSAqIFRoZSA8Y29kZT5WYWxpZGF0b3I8L2NvZGU+IHVzZWQgdG8gdmFsaWRhdGUgdGhpcyBzdGF0ZSBvYmplY3QuCisJICovCisJcHJpdmF0ZSBWYWxpZGF0b3IgdmFsaWRhdG9yOworCisJLyoqCisJICogTm90aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIGRhdGEgdmFsdWUgcHJvcGVydHkuCisJICovCisJc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWVQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgZ2VuZXJhdG9yIHR5cGUgcHJvcGVydHkuCisJICovCisJc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfVFlQRV9QUk9QRVJUWSA9ICJnZW5lcmF0b3JUeXBlUHJvcGVydHkiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5ld05hbWVTdGF0ZU9iamVjdDwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gbmFtZSBUaGUgaW5pdGlhbCBpbnB1dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbml0aWFsIHZhbHVlIGNhbgorCSAqIGJlIHNwZWNpZmllZAorCSAqIEBwYXJhbSBuYW1lcyBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyB0aGF0IGNhbid0IGJlIHVzZWQgb3IgYW4gZW1wdHkKKwkgKiBjb2xsZWN0aW9uIGlmIG5vbmUgYXJlIGF2YWlsYWJsZQorCSAqLworCUFkZEdlbmVyYXRvclN0YXRlT2JqZWN0KCkgeworCQlzdXBlcihudWxsKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkTmFtZVByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKKwkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKSkgeworCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuR2VuZXJhdG9yU3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZCkpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZEdlbmVyYXRvclR5cGVQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7CisJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2VuZXJhdG9yVHlwZSkpIHsKKwkJCWN1cnJlbnRQcm9ibGVtcy5hZGQoYnVpbGRQcm9ibGVtKEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLkdlbmVyYXRvclN0YXRlT2JqZWN0X3R5cGVNdXN0QmVTcGVjaWZpZWQpKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKKwkJc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOworCQlhZGROYW1lUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOworCQlhZGRHZW5lcmF0b3JUeXBlUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyZW50KE5vZGUgcGFyZW50Tm9kZSkgeworCQkvL25vIHBhcmVudAorCX0KKworCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLm5hbWU7CisJfQorCisJU3RyaW5nIGdldEdlbmVyYXRvclR5cGUoKSB7CisJCXJldHVybiB0aGlzLmdlbmVyYXRvclR5cGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKKwkJdGhpcy5uYW1lID0gbmV3TmFtZTsKKwkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0b3JUeXBlKFN0cmluZyBuZXdHZW5lcmF0b3JUeXBlKSB7CisJCVN0cmluZyBvbGQgPSB0aGlzLmdlbmVyYXRvclR5cGU7CisJCXRoaXMuZ2VuZXJhdG9yVHlwZSA9IG5ld0dlbmVyYXRvclR5cGU7CisJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR0VORVJBVE9SX1RZUEVfUFJPUEVSVFksIG9sZCwgbmV3R2VuZXJhdG9yVHlwZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKKwkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7CisJCXJldHVybiB0aGlzLnZhbGlkYXRvcjsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9CYXNlT3JtWG1sVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9CYXNlT3JtWG1sVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0YzNkMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Jhc2VPcm1YbWxVaUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2ljTWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PbmVUb09uZU1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBPcm0gWG1sIFVJIGZhY3RvcnkgcmVxdWlyZWQgdG8gc2hvdyB0aGUgaW5mb3JtYXRpb24KKyAqIHJlbGF0ZWQgdG8gYSBKUEEgbWFwcGluZyAodHlwZSBvciBhdHRyaWJ1dGUpLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZU9ybVhtbFVpRmFjdG9yeSBpbXBsZW1lbnRzIE9ybVhtbFVpRmFjdG9yeQoreworCQorCS8vICoqKioqKioqKioqKioqKiogb3JtIHR5cGUgbWFwcGluZyBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW50aXR5Q29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1FbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRhYmxlQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqKioqKioqIG9ybSBhdHRyaWJ1dGUgbWFwcGluZyBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1JZE1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IElkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGVkSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBCYXNpY01hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1WZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1PbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGVkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVRyYW5zaWVudE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTgxYjMxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5DYXRhbG9nQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuU2NoZW1hQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgWG1sUGFja2FnZUNob29zZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBTY2hlbWE6ICAgICAgfCBTY2hlbWFDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBDYXRhbG9nOiAgICAgfCBDYXRhbG9nQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCBBY2Nlc3MgVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKKyAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9ybVF1ZXJpZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVudGl0eU1hcHBpbmdzCisgKiBAc2VlIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBDYXRhbG9nQ29tYm8KKyAqIEBzZWUgRW51bUZvcm1Db21ib1ZpZXdlcgorICogQHNlZSBFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUKKyAqIEBzZWUgT3JtUGFja2FnZUNob29zZXIKKyAqIEBzZWUgT3JtUXVlcmllc0NvbXBvc2l0ZQorICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZQorICogQHNlZSBTY2hlbWFDb21ibworICoKKyAqIEB2ZXJzaW9uIDIuMgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSBleHRlbmRzIEFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTk4NTVmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSB7QGxpbmsgSnBhRGV0YWlsc1BhZ2V9CisgKiB3aGVuIHRoZSBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIHRoZSBYTUwgZmlsZSAoZWl0aGVyIGZyb20gdGhlIHBlcnNpc3RlbmNlCisgKiBjb25maWd1cmF0aW9uIG9yIGZyb20gdGhlIE1hcHBpbmdzIERlc2NyaXB0b3IpLgorICovCitwdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIKKwlleHRlbmRzIEFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFEZXRhaWxzUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIoKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnBhRGV0YWlsc1Byb3ZpZGVyIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gcHJvdmlkZXNEZXRhaWxzKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKKwkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFKTsKKwl9CisJCisJcHVibGljIEpwYURldGFpbHNQYWdlPEVudGl0eU1hcHBpbmdzPiBidWlsZERldGFpbHNQYWdlKAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQkKKwkJcmV0dXJuIG5ldyBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWNmZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwzNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVGFibGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuR2VuZXJhdG9yQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkdlbmVyYXRvckNvbXBvc2l0ZS5HZW5lcmF0b3JCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7CisKKy8qKgorICogVGhpcyBwYW5lIHNob3dzIHRoZSBsaXN0IG9mIG5hbWVkIHF1ZXJpZXMgYW5kIG5hbWVkIG5hdGl2ZSBxdWVyaWVzLgorICogPHA+CisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9ybVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlIG9yIE9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVudGl0eU1hcHBpbmdzCisgKiBAc2VlIE9ybUdlbmVyYXRvcgorICogQHNlZSBPcm1TZXF1ZW5jZUdlbmVyYXRvcgorICogQHNlZSBPcm1UYWJsZUdlbmVyYXRvcgorICogQHNlZSBFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBPcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZQorICogQHNlZSBPcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZQorICoKKyAqIEB2ZXJzaW9uIDIuMgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHlNYXBwaW5ncz4KK3sKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUdlbmVyYXRvcj4gZ2VuZXJhdG9ySG9sZGVyOworCXByaXZhdGUgR2VuZXJhdG9yQ29tcG9zaXRlPFNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvclBhbmU7CisJcHJpdmF0ZSBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSB0YWJsZUdlbmVyYXRvclBhbmU7CisJcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHlNYXBwaW5ncz4gbGlzdFBhbmU7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlKAorCQkJCQkJUGFuZTw/IGV4dGVuZHMgRW50aXR5TWFwcGluZ3M+IHBhcmVudFBhbmUsCisJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBhZGRHZW5lcmF0b3IoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCQlhZGRHZW5lcmF0b3JGcm9tRGlhbG9nKGxpc3RTZWxlY3Rpb25Nb2RlbCwgYnVpbGRBZGRHZW5lcmF0b3JEaWFsb2coKSk7CisJfQorCQorCXByb3RlY3RlZCBBZGRHZW5lcmF0b3JEaWFsb2cgYnVpbGRBZGRHZW5lcmF0b3JEaWFsb2coKSB7CisJCXJldHVybiBuZXcgQWRkR2VuZXJhdG9yRGlhbG9nKGdldENvbnRyb2woKS5nZXRTaGVsbCgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmF0b3JGcm9tRGlhbG9nKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwsIEFkZEdlbmVyYXRvckRpYWxvZyBkaWFsb2cpIHsKKwkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIGdlbmVyYXRvclR5cGUgPSBkaWFsb2cuZ2V0R2VuZXJhdG9yVHlwZSgpOworCQlPcm1HZW5lcmF0b3IgZ2VuZXJhdG9yOworCQlpZiAoZ2VuZXJhdG9yVHlwZSA9PSBHZW5lcmF0b3IuVEFCTEVfR0VORVJBVE9SKSB7CisJCQlnZW5lcmF0b3IgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRUYWJsZUdlbmVyYXRvcihnZXRTdWJqZWN0KCkudGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKKwkJfQorCQllbHNlIGlmIChnZW5lcmF0b3JUeXBlID09IEdlbmVyYXRvci5TRVFVRU5DRV9HRU5FUkFUT1IpIHsKKwkJCWdlbmVyYXRvciA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKGdldFN1YmplY3QoKS5zZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkpOworCQl9CisJCWVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCWdlbmVyYXRvci5zZXROYW1lKGRpYWxvZy5nZXROYW1lKCkpOworCQl0aGlzLmdlbmVyYXRvckhvbGRlci5zZXRWYWx1ZShnZW5lcmF0b3IpOy8vc28gdGhhdCBpdCBnZXRzIHNlbGVjdGVkIGluIHRoZSBMaXN0IGZvciB0aGUgdXNlciB0byBlZGl0CisJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGdlbmVyYXRvcik7CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxPcm1HZW5lcmF0b3I+IGJ1aWxkRGlzcGxheWFibGVHZW5lcmF0b3JMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxPcm1HZW5lcmF0b3I+KAorCQkJYnVpbGRHZW5lcmF0b3JzTGlzdEhvbGRlcigpLAorCQkJR2VuZXJhdG9yLk5BTUVfUFJPUEVSVFkKKwkJKTsKKwl9CisKKwlwcml2YXRlIEFkYXB0ZXIgYnVpbGRHZW5lcmF0b3JBZGFwdGVyKCkgeworCisJCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgeworCisJCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKKwkJCQlhZGRHZW5lcmF0b3IobGlzdFNlbGVjdGlvbk1vZGVsKTsKKwkJCX0KKworCisJCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKKwkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKKwkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBPcm1TZXF1ZW5jZUdlbmVyYXRvcikgeworCQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKChPcm1TZXF1ZW5jZUdlbmVyYXRvcikgaXRlbSk7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoKE9ybVRhYmxlR2VuZXJhdG9yKSBpdGVtKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUdlbmVyYXRvcj4gYnVpbGRHZW5lcmF0b3JIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUdlbmVyYXRvcj4oKTsKKwl9CisKKwlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkR2VuZXJhdG9yTGFiZWxQcm92aWRlcigpIHsKKwkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCQlPcm1HZW5lcmF0b3IgZ2VuZXJhdG9yID0gKE9ybUdlbmVyYXRvcikgZWxlbWVudDsKKwkJCQlTdHJpbmcgbmFtZSA9IGdlbmVyYXRvci5nZXROYW1lKCk7CisKKwkJCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQkJCWludCBpbmRleCA9IC0xOworCisJCQkJCWlmIChnZW5lcmF0b3IgaW5zdGFuY2VvZiBPcm1TZXF1ZW5jZUdlbmVyYXRvcikgeworCQkJCQkJaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihnZXRTdWJqZWN0KCkuc2VxdWVuY2VHZW5lcmF0b3JzKCksIGdlbmVyYXRvcik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQlpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGdldFN1YmplY3QoKS50YWJsZUdlbmVyYXRvcnMoKSwgZ2VuZXJhdG9yKTsKKwkJCQkJfQorCisJCQkJCW5hbWUgPSBOTFMuYmluZChKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2Rpc3BsYXlTdHJpbmcsIEludGVnZXIudmFsdWVPZihpbmRleCkpOworCQkJCX0KKworCQkJCXJldHVybiBuYW1lOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yPiBidWlsZEdlbmVyYXRvcnNMaXN0SG9sZGVyKCkgeworCQlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1HZW5lcmF0b3I+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtR2VuZXJhdG9yPj4oKTsKKwkJbGlzdC5hZGQoYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckxpc3RIb2xkZXIoKSk7CisJCWxpc3QuYWRkKGJ1aWxkVGFibGVHZW5lcmF0b3JMaXN0SG9sZGVyKCkpOworCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1HZW5lcmF0b3I+LCBPcm1HZW5lcmF0b3I+KGxpc3QpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5TWFwcGluZ3MsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRW50aXR5TWFwcGluZ3MgdmFsdWUpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlICE9IG51bGwpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgVHJhbnNmb3JtZXI8T3JtR2VuZXJhdG9yLCBDb250cm9sPiBidWlsZFBhbmVUcmFuc2Zvcm1lcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxPcm1HZW5lcmF0b3IsIENvbnRyb2w+KCkgeworCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKE9ybUdlbmVyYXRvciBnZW5lcmF0b3IpIHsKKworCQkJCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisKKwkJCQlpZiAoZ2VuZXJhdG9yIGluc3RhbmNlb2YgT3JtU2VxdWVuY2VHZW5lcmF0b3IpIHsKKwkJCQkJcmV0dXJuIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZS50aGlzLnNlcXVlbmNlR2VuZXJhdG9yUGFuZS5nZXRDb250cm9sKCk7CisJCQkJfQorCisJCQkJcmV0dXJuIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZS50aGlzLnRhYmxlR2VuZXJhdG9yUGFuZS5nZXRDb250cm9sKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yLCBTZXF1ZW5jZUdlbmVyYXRvcj4odGhpcy5nZW5lcmF0b3JIb2xkZXIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFNlcXVlbmNlR2VuZXJhdG9yIHRyYW5zZm9ybV8oT3JtR2VuZXJhdG9yIHZhbHVlKSB7CisJCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIFNlcXVlbmNlR2VuZXJhdG9yKSA/IChTZXF1ZW5jZUdlbmVyYXRvcikgdmFsdWUgOiBudWxsOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBPcm1TZXF1ZW5jZUdlbmVyYXRvcj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlFbnRpdHlNYXBwaW5ncy5TRVFVRU5DRV9HRU5FUkFUT1JTX0xJU1QpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gbGlzdEl0ZXJhdG9yXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNlcXVlbmNlR2VuZXJhdG9ycygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yLCBUYWJsZUdlbmVyYXRvcj4odGhpcy5nZW5lcmF0b3JIb2xkZXIpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFRhYmxlR2VuZXJhdG9yIHRyYW5zZm9ybV8oT3JtR2VuZXJhdG9yIHZhbHVlKSB7CisJCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIFRhYmxlR2VuZXJhdG9yKSA/IChUYWJsZUdlbmVyYXRvcikgdmFsdWUgOiBudWxsOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtVGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBPcm1UYWJsZUdlbmVyYXRvcj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlFbnRpdHlNYXBwaW5ncy5UQUJMRV9HRU5FUkFUT1JTX0xJU1QpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1UYWJsZUdlbmVyYXRvcj4gbGlzdEl0ZXJhdG9yXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhYmxlR2VuZXJhdG9ycygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YWJsZUdlbmVyYXRvcnNTaXplKCk7CisJCQl9CisJCX07CisJfQorCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlzdXBlci5pbml0aWFsaXplKCk7CisJCXRoaXMuZ2VuZXJhdG9ySG9sZGVyID0gYnVpbGRHZW5lcmF0b3JIb2xkZXIoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQljb250YWluZXIgPSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2dyb3VwQm94CisJCSk7CisKKwkJLy8gTGlzdCBwYW5lCisJCXRoaXMubGlzdFBhbmUgPSBhZGRMaXN0UGFuZShjb250YWluZXIpOworCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcigpOworCisJCS8vIFByb3BlcnR5IHBhbmUKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPFNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvckhvbGRlciA9CisJCQl0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIoKTsKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPFRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvckhvbGRlciA9CisJCQl0aGlzLmJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoKTsKKworCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKKwkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisKKwkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIHByb3BlcnR5IHBhbmUKKwkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvclBhbmUgPSB0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCisJCQlwYWdlQm9vaywKKwkJCXNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyLAorCQkJdGhpcy5idWlsZFNlcXVlbmNlR2VuZXJhdG9yQnVpbGRlcigpCisJCSk7CisKKwkJLy8gVGFibGUgR2VuZXJhdG9yIHByb3BlcnR5IHBhbmUKKwkJdGhpcy50YWJsZUdlbmVyYXRvclBhbmUgPSBuZXcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUoCisJCQl0aGlzLAorCQkJdGFibGVHZW5lcmF0b3JIb2xkZXIsCisJCQlwYWdlQm9vaywKKwkJCXRoaXMuYnVpbGRUYWJsZUdlbmVyYXRvckJ1aWxkZXIoKQorCQkpOworCisJCXRoaXMuYWRkQWxpZ25SaWdodCh0aGlzLnNlcXVlbmNlR2VuZXJhdG9yUGFuZSk7CisJCXRoaXMuYWRkQWxpZ25SaWdodCh0aGlzLnRhYmxlR2VuZXJhdG9yUGFuZSk7CisJCXRoaXMuaW5zdGFsbFBhbmVTd2l0Y2hlcihwYWdlQm9vayk7CisJfQorCisJcHJvdGVjdGVkIEdlbmVyYXRvckNvbXBvc2l0ZTxTZXF1ZW5jZUdlbmVyYXRvcj4gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyLAorCQkJR2VuZXJhdG9yQnVpbGRlcjxTZXF1ZW5jZUdlbmVyYXRvcj4gZ2VuZXJhdG9yQnVpbGRlcikgeworCisJCXJldHVybiBuZXcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCisJCQl0aGlzLAorCQkJc2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIsCisJCQlwYXJlbnQsCisJCQlnZW5lcmF0b3JCdWlsZGVyCisJCSk7CisJfQorCisJcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHlNYXBwaW5ncz4gYWRkTGlzdFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5TWFwcGluZ3M+KAorCQkJdGhpcywKKwkJCWNvbnRhaW5lciwKKwkJCXRoaXMuYnVpbGRHZW5lcmF0b3JBZGFwdGVyKCksCisJCQl0aGlzLmJ1aWxkRGlzcGxheWFibGVHZW5lcmF0b3JMaXN0SG9sZGVyKCksCisJCQl0aGlzLmdlbmVyYXRvckhvbGRlciwKKwkJCXRoaXMuYnVpbGRHZW5lcmF0b3JMYWJlbFByb3ZpZGVyKCkKKwkJKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKCkgeworCQluZXcgUGFuZUVuYWJsZXIoCisJCQl0aGlzLmJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSwKKwkJCXRoaXMubGlzdFBhbmUKKwkJKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVTd2l0Y2hlcihQYWdlQm9vayBwYWdlQm9vaykgeworCQluZXcgQ29udHJvbFN3aXRjaGVyKHRoaXMuZ2VuZXJhdG9ySG9sZGVyLCB0aGlzLmJ1aWxkUGFuZVRyYW5zZm9ybWVyKCksIHBhZ2VCb29rKTsKKwl9CQorCisJcHJpdmF0ZSBHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQnVpbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPigpIHsKKwkJCXB1YmxpYyBTZXF1ZW5jZUdlbmVyYXRvciBhZGRHZW5lcmF0b3IoKSB7CisJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgc2VxdWVuY2UgZ2VuZXJhdG9yIHdpbGwgbmV2ZXIgYmUgbnVsbCBzbyB3ZSBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBHZW5lcmF0b3JCdWlsZGVyPFRhYmxlR2VuZXJhdG9yPiBidWlsZFRhYmxlR2VuZXJhdG9yQnVpbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmF0b3JCdWlsZGVyPFRhYmxlR2VuZXJhdG9yPigpIHsKKwkJCXB1YmxpYyBUYWJsZUdlbmVyYXRvciBhZGRHZW5lcmF0b3IoKSB7CisJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgdGFibGUgZ2VuZXJhdG9yIHdpbGwgbmV2ZXIgYmUgbnVsbCBzbyB3ZSBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9HZW5lcmljT3JtWG1sVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9HZW5lcmljT3JtWG1sVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhNzI5MwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0dlbmVyaWNPcm1YbWxVaUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOworCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybVhtbFVpRmFjdG9yeSBleHRlbmRzIEJhc2VPcm1YbWxVaUZhY3RvcnkKK3sKKwkvL25vdGhpbmcKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0pwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9KcHRVaURldGFpbHNPcm1NZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZDkyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9KcHRVaURldGFpbHNPcm1NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworLyoqCisgKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIE9STSB3aWRnZXRzLgorICoKKyAqIEB2ZXJzaW9uIDIuMgorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMgeworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQm9vbGVhbl9GYWxzZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX1RydWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9hY2Nlc3M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9jYXRhbG9nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfZmllbGQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9wYWNrYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfcHJvcGVydHk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9zY2hlbWE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NQYWdlX2NhdGFsb2dEZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzUGFnZV9jYXRhbG9nTm9EZWZhdWx0U3BlY2lmaWVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzUGFnZV9zY2hlbWFEZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzUGFnZV9zY2hlbWFOb0RlZmF1bHRTcGVjaWZpZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZV9tZXRhZGF0YUNvbXBsZXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGVfbWV0YWRhdGFDb21wbGV0ZVdpdGhEZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZGlzcGxheVN0cmluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2dyb3VwQm94OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUphdmFBdHRyaWJ1dGVDaG9vc2VyX2phdmFBdHRyaWJ1dGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtSmF2YUNsYXNzQ2hvb3Nlcl9qYXZhQ2xhc3M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtUXVlcmllc0NvbXBvc2l0ZV9ncm91cEJveDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9hY2Nlc3M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfY2FzY2FkZVBlcnNpc3RDaGVja0JveDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9jYXRhbG9nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2ZpZWxkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3BlcnNpc3RlbmNlVW5pdFNlY3Rpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfcHJvcGVydHk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfc2NoZW1hOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3g7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uX2NhdGFsb2dEZWZhdWx0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbl9zY2hlbWFEZWZhdWx0OworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkR2VuZXJhdG9yRGlhbG9nX25hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkR2VuZXJhdG9yRGlhbG9nX2dlbmVyYXRvclR5cGU7CisgCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEdlbmVyYXRvckRpYWxvZ190aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRHZW5lcmF0b3JEaWFsb2dfZGVzY3JpcHRpb25UaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRHZW5lcmF0b3JEaWFsb2dfZGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkR2VuZXJhdG9yRGlhbG9nX3RhYmxlR2VuZXJhdG9yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEdlbmVyYXRvckRpYWxvZ19zZXF1ZW5jZUdlbmVyYXRvcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0b3JTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRvclN0YXRlT2JqZWN0X3R5cGVNdXN0QmVTcGVjaWZpZWQ7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgVW5zdXBwb3J0ZWRPcm1NYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVbnN1cHBvcnRlZE9ybU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfdWlfZGV0YWlsc19vcm0iOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuY2xhc3M7CisJc3RhdGljIHsKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKKwl9CisKKwlwcml2YXRlIEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL01ldGFkYXRhQ29tcGxldGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL01ldGFkYXRhQ29tcGxldGVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQwZmZmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPE9ybVR5cGVNYXBwaW5nPiB7CisKKwlwdWJsaWMgTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZShGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtVHlwZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZV9tZXRhZGF0YUNvbXBsZXRlLAorCQkJYnVpbGRNZXRhZGF0YUNvbXBsZXRlSG9sZGVyKCksCisJCQlidWlsZE1ldGFkYXRhQ29tcGxldGVTdHJpbmdIb2xkZXIoKSwKKwkJCW51bGwKKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE1ldGFkYXRhQ29tcGxldGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybVR5cGVNYXBwaW5nLCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCU9ybVR5cGVNYXBwaW5nLlNQRUNJRklFRF9NRVRBREFUQV9DT01QTEVURV9QUk9QRVJUWSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTWV0YWRhdGFDb21wbGV0ZVN0cmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdE1ldGFkYXRhQ29tcGxldGVIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7CisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKKwkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLk1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGVfbWV0YWRhdGFDb21wbGV0ZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOworCQkJCX0KKwkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZV9tZXRhZGF0YUNvbXBsZXRlOworCQkJfQorCQl9OworCX0KKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRNZXRhZGF0YUNvbXBsZXRlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1UeXBlTWFwcGluZywgQm9vbGVhbj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCksCisJCQlPcm1UeXBlTWFwcGluZy5TUEVDSUZJRURfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFksCisJCQlPcm1UeXBlTWFwcGluZy5ERUZBVUxUX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2ZDhiNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1CYXNpY01hcHBpbmc+CisJaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUJhc2ljTWFwcGluZz4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IE9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1CYXNpY01hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksIAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwgCisJCQlDb21wb3NpdGUgcGFyZW50LCAKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVPcm1CYXNpY01hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmNTA1ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGFibGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIE9ybUVtYmVkZGFibGVDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxPcm1FbWJlZGRhYmxlPiBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCXB1YmxpYyBPcm1FbWJlZGRhYmxlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJbmV3IE9ybUphdmFDbGFzc0Nob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtRW1iZWRkYWJsZSwgQWNjZXNzSG9sZGVyPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSkKKwkJeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGUoKTsKKwkJCX0KKwkJfTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmYTg4MAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGFibGVVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRhYmxlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBPcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uIAorCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRhYmxlVWlEZWZpbml0aW9uPE9ybUVtYmVkZGFibGU+CisJaW1wbGVtZW50cyBPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FbWJlZGRhYmxlPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248T3JtRW1iZWRkYWJsZT4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZU9ybUVtYmVkZGFibGVDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTNlYTVjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBPcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FbWJlZGRlZElkTWFwcGluZz4KKwlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtRW1iZWRkZWRJZE1hcHBpbmc+Cit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IE9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVtYmVkZGVkSWRNYXBwaW5nPiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQkKKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGVkSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVPcm1FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlYzJiMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FbWJlZGRlZE1hcHBpbmc+CisJaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVtYmVkZGVkTWFwcGluZz4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IE9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FbWJlZGRlZE1hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVPcm1FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbnRpdHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVudGl0eUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjA2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbnRpdHlDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gT1JNIGVudGl0eS4KKyAqCisgKiBAc2VlIE9ybUVudGl0eQorICogQHNlZSBCYXNlSmF2YVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQorICogQHNlZSBPcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIE9ybUVudGl0eUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0T3JtRW50aXR5Q29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1FbnRpdHlDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5Pcm1FbnRpdHk8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgT3JtRW50aXR5Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVudGl0eVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW50aXR5VWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlOWIzNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVudGl0eVVpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5VWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBPcm1FbnRpdHlVaURlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0RW50aXR5VWlEZWZpbml0aW9uPE9ybUVudGl0eT4KKwlpbXBsZW1lbnRzIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVudGl0eT4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FbnRpdHlVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IE9ybUVudGl0eVVpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248T3JtRW50aXR5PiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgT3JtRW50aXR5VWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCisJCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZU9ybUVudGl0eUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0MWM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uIAorCWV4dGVuZHMgQWJzdHJhY3RJZE1hcHBpbmdVaURlZmluaXRpb248T3JtSWRNYXBwaW5nPgorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1JZE1hcHBpbmc+Cit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCW5ldyBPcm1JZE1hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtSWRNYXBwaW5nPiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSW5oZXJpdGFuY2VDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2NjcxZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGUgcGFuZSB1c2VkIGZvciBqYXZhIGluaGVyaXRhbmNlLgorICoKKyAqIEBzZWUgT3JtRW50aXR5CisgKiBAc2VlIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgT3JtSW5oZXJpdGFuY2VDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlPE9ybUVudGl0eT4geworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1Jbmhlcml0YW5jZUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgT3JtSW5oZXJpdGFuY2VDb21wb3NpdGUoRm9ybVBhbmU8PyBleHRlbmRzIE9ybUVudGl0eT4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJbmV3IE9ybVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1KYXZhQXR0cmlidXRlQ2hvb3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSmF2YUF0dHJpYnV0ZUNob29zZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDc4ZGFhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSmF2YUF0dHJpYnV0ZUNob29zZXIuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCisvKioKKyAqIEBzZWUgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIE9ybUphdmFBdHRyaWJ1dGVDaG9vc2VyIGV4dGVuZHMgRm9ybVBhbmU8T3JtQXR0cmlidXRlTWFwcGluZz4KK3sKKwlwcml2YXRlIFRleHQgdGV4dDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+WG1sSmF2YUF0dHJpYnV0ZUNob29zZXI8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIE9ybUphdmFBdHRyaWJ1dGVDaG9vc2VyKEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1BdHRyaWJ1dGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1BdHRyaWJ1dGVNYXBwaW5nLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgT3JtQXR0cmlidXRlTWFwcGluZy5OQU1FX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJCQlpZiAoc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgeworCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJfQorCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKKwkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKKworCQlpZiAoIXRleHQuaXNEaXNwb3NlZCgpKSB7CisJCQl0ZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7CisJCX0KKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQl0ZXh0ID0gYWRkTGFiZWxlZFRleHQoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5Pcm1KYXZhQXR0cmlidXRlQ2hvb3Nlcl9qYXZhQXR0cmlidXRlLAorCQkJYnVpbGROYW1lSG9sZGVyKCkKKwkJKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSmF2YUNsYXNzQ2hvb3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSmF2YUNsYXNzQ2hvb3Nlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOGNhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1KYXZhQ2xhc3NDaG9vc2VyLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgQ2xhc3NDaG9vc2VyUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBUT0RPIHBvc3NpYmx5IGhlbHAgdGhlIHVzZXIgYW5kIGlmIHRoZXkgaGF2ZSBjaG9zZW4gYSBwYWNrYWdlIGF0IHRoZQorICogZW50aXR5LW1hcHBpbmdzIGxldmVsIG9ubHkgaW5zZXJ0IHRoZSBjbGFzcyBuYW1lIGluIHRoZSB4bWwgZmlsZSBpZiB0aGV5CisgKiBjaG9vc2UgYSBjbGFzcyBmcm9tIHRoZSBwYWNrYWdlLgorICogTm90IHN1cmUgaWYgdGhpcyBzaG91bGQgYmUgZHJpdmVuIGJ5IHRoZSBVSSBvciBieSB1aSBhcGkgaW4gdGhlIG1vZGVsCisgKgorICogQHNlZSBPcm1UeXBlTWFwcGluZworICogQHNlZSBPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqIEBzZWUgQ2xhc3NDaG9vc2VyUGFuZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgT3JtSmF2YUNsYXNzQ2hvb3NlciBleHRlbmRzIEZvcm1QYW5lPE9ybVR5cGVNYXBwaW5nPiB7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlhtbEphdmFDbGFzc0Nob29zZXI8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBPcm1KYXZhQ2xhc3NDaG9vc2VyKEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1UeXBlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgT3JtSmF2YUNsYXNzQ2hvb3NlcihGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAorICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybVR5cGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOworCX0KKworCisJcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPE9ybVR5cGVNYXBwaW5nPiBhZGRDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxPcm1UeXBlTWFwcGluZz4odGhpcywgY29udGFpbmVyKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybVR5cGVNYXBwaW5nLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgT3JtVHlwZU1hcHBpbmcuQ0xBU1NfUFJPUEVSVFkpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENsYXNzXygpOworCQkJCQl9CisKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJCQkJCXRoaXMuc3ViamVjdC5zZXRDbGFzcyh2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0Q2xhc3NfKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLk9ybUphdmFDbGFzc0Nob29zZXJfamF2YUNsYXNzOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0Q2xhc3MoY2xhc3NOYW1lKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJYWRkQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOWNkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIE9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU1hbnlUb01hbnlNYXBwaW5nPgorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1NYW55VG9NYW55TWFwcGluZz4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtTWFueVRvTWFueU1hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBPcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZiMGRlYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU1hbnlUb09uZU1hcHBpbmc+CisJaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU1hbnlUb09uZU1hcHBpbmc+Cit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1NYW55VG9PbmVNYXBwaW5nPiBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgorCSAqLworCXByaXZhdGUgT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVPcm1NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZTYyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIE9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxPcm1NYXBwZWRTdXBlcmNsYXNzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKworCXB1YmxpYyBPcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBPcm1KYXZhQ2xhc3NDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKKwkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsKKwkJbmV3IElkQ2xhc3NDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwkJbmV3IE1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybU1hcHBlZFN1cGVyY2xhc3MsIEFjY2Vzc0hvbGRlcj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2Y3ODEzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIE9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24gCisJZXh0ZW5kcyBBYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb248T3JtTWFwcGVkU3VwZXJjbGFzcz4KKwlpbXBsZW1lbnRzIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU1hcHBlZFN1cGVyY2xhc3M+Cit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQkJbmV3IE9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU1hcHBlZFN1cGVyY2xhc3M+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBPcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCisJCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVPcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYTNjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1PbmVUb01hbnlNYXBwaW5nPgorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1PbmVUb01hbnlNYXBwaW5nPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtT25lVG9NYW55TWFwcGluZz4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1NWMzYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1PbmVUb09uZU1hcHBpbmc+CisJaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU9uZVRvT25lTWFwcGluZz4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKKwkJbmV3IE9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1PbmVUb09uZU1hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBPcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVPcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QYWNrYWdlQ2hvb3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUGFja2FnZUNob29zZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTI1MGExCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUGFja2FnZUNob29zZXIuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFja2FnZUNob29zZXJQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgUGFja2FnZUNob29zZXJQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVudGl0eU1hcHBpbmdzCisgKiBAc2VlIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBQYWNrYWdlQ2hvb3NlclBhbmUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIE9ybVBhY2thZ2VDaG9vc2VyIGV4dGVuZHMgRm9ybVBhbmU8RW50aXR5TWFwcGluZ3M+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5YbWxQYWNrYWdlQ2hvb3NlcjwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIE9ybVBhY2thZ2VDaG9vc2VyKEZvcm1QYW5lPD8gZXh0ZW5kcyBFbnRpdHlNYXBwaW5ncz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJYWRkUGFja2FnZUNob29zZXJQYW5lKGNvbnRhaW5lcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFBhY2thZ2VDaG9vc2VyUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJbmV3IFBhY2thZ2VDaG9vc2VyUGFuZTxFbnRpdHlNYXBwaW5ncz4odGhpcywgY29udGFpbmVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHlNYXBwaW5ncywgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eU1hcHBpbmdzLlBBQ0tBR0VfUFJPUEVSVFkpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQYWNrYWdlKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCQkJc3ViamVjdC5zZXRQYWNrYWdlKHZhbHVlID09ICIiID8gbnVsbCA6IHZhbHVlKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9wYWNrYWdlOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkgeworCQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKKwkJCQlJSmF2YVByb2plY3Qgcm9vdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKKworCQkJCXRyeSB7CisJCQkJCXJldHVybiByb290LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07CisJCQkJfQorCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7CisJCQkJfQorCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFBhY2thZ2UoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRQYWNrYWdlKCkgeworCQkJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gY2hvb3NlUGFja2FnZSgpOworCisJCQkJaWYgKHBhY2thZ2VGcmFnbWVudCAhPSBudWxsKSB7CisJCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpOworCQkJCQlnZXRTdWJqZWN0KCkuc2V0UGFja2FnZShwYWNrYWdlTmFtZSk7CisJCQkJfQorCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZTVkYWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRldGFpbHMgcGFnZSB1c2VkIGZvciB0aGUgWE1MIHBlcnNpc3RlbnQKKyAqIGF0dHJpYnV0ZS4KKyAqIDxwPgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBBdHRyaWJ1dGUgbWFwcGluZyBwYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBPcm1QZXJzaXN0ZW50QXR0cmlidXRlCisgKiBAc2VlIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlIGV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlBcnJheUxpc3Q8UGFuZTw/Pj4gcGFuZXMgPSBuZXcgQXJyYXlMaXN0PFBhbmU8Pz4+KDIpOworCisJCS8vIE1hcCBBcyBjb21wb3NpdGUKKwkJUGFuZTw/PiBtYXBBc1BhbmUgPSBidWlsZE1hcEFzUGFuZShhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMCwgNSwgMCkpOworCQlwYW5lcy5hZGQobWFwQXNQYW5lKTsKKworCQkvLyBFbnRpdHkgdHlwZSB3aWRnZXRzCisJCU9ybUphdmFBdHRyaWJ1dGVDaG9vc2VyIGphdmFBdHRyaWJ1dGVQYW5lID0KKwkJCW5ldyBPcm1KYXZhQXR0cmlidXRlQ2hvb3Nlcih0aGlzLCBnZXRNYXBwaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7CisKKwkJcGFuZXMuYWRkKGphdmFBdHRyaWJ1dGVQYW5lKTsKKworCQlidWlsZE1hcHBpbmdQYWdlQm9vayhjb250YWluZXIpOworCisJCWluc3RhbGxQYW5lRW5hYmxlcihwYW5lcyk7CisJfQorCQorCXByb3RlY3RlZCBQYW5lPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGJ1aWxkTWFwQXNQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUodGhpcywgcGFyZW50KTsJCQorCX0KKwkKKwlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKEFycmF5TGlzdDxQYW5lPD8+PiBwYW5lcykgeworCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpLCBwYW5lcyk7CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSB2YWx1ZSkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoIXZhbHVlLmlzVmlydHVhbCgpKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1BdHRyaWJ1dGVNYXBwaW5nPiBnZXRNYXBwaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybUF0dHJpYnV0ZU1hcHBpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZyB0cmFuc2Zvcm1fKFBlcnNpc3RlbnRBdHRyaWJ1dGUgdmFsdWUpIHsKKwkJCQlyZXR1cm4gKE9ybUF0dHJpYnV0ZU1hcHBpbmcpIHZhbHVlLmdldE1hcHBpbmcoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJLy9UT0RPIHRoaXMgcHJvYmFibHkgbmVlZHMgdG8gY2hhbmdlIGFuZCB1c2UgYSBQYW5lRW5hYmxlciBpbnN0ZWFkLgorCUBPdmVycmlkZQorCXByb3RlY3RlZCBKcGFDb21wb3NpdGUgZ2V0TWFwcGluZ0NvbXBvc2l0ZShTdHJpbmcga2V5KSB7CisJCUpwYUNvbXBvc2l0ZSBtYXBwaW5nQ29tcG9zaXRlID0gc3VwZXIuZ2V0TWFwcGluZ0NvbXBvc2l0ZShrZXkpOworCQlpZiAobWFwcGluZ0NvbXBvc2l0ZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKKworCQlpZiAoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldFBhcmVudCgpICE9IG51bGwpIHsKKwkJCWVuYWJsZWQgPSAhZ2V0U3ViamVjdCgpLmlzVmlydHVhbCgpOworCQl9CisKKwkJbWFwcGluZ0NvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOworCQlyZXR1cm4gbWFwcGluZ0NvbXBvc2l0ZTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NDhjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVN0cnVjdHVyZU5vZGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHtAbGluayBKcGFEZXRhaWxzUGFnZX0KKyAqIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIFhNTCBmaWxlIChlaXRoZXIgZnJvbSB0aGUgcGVyc2lzdGVuY2UKKyAqIGNvbmZpZ3VyYXRpb24gb3IgZnJvbSB0aGUgTWFwcGluZ3MgRGVzY3JpcHRvcikuCisgKi8KK3B1YmxpYyBjbGFzcyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyCisJaW1wbGVtZW50cyBKcGFEZXRhaWxzUHJvdmlkZXIKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFEZXRhaWxzUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcigpOworCQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCisJICovCisJcHVibGljIHN0YXRpYyBKcGFEZXRhaWxzUHJvdmlkZXIgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzRGV0YWlscyhKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUpIHsKKwkJCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoc3RydWN0dXJlTm9kZS5nZXRJZCgpLCBPcm1TdHJ1Y3R1cmVOb2Rlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JRCkKKwkJCQkmJiBzdHJ1Y3R1cmVOb2RlLmdldFJlc291cmNlVHlwZSgpLmdldENvbnRlbnRUeXBlKCkuaXNLaW5kT2YoSnB0Q29yZVBsdWdpbi5NQVBQSU5HX0ZJTEVfQ09OVEVOVF9UWVBFKTsKKwl9CisJCisJcHVibGljIEpwYURldGFpbHNQYWdlPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGJ1aWxkRGV0YWlsc1BhZ2UoCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCQorCQlyZXR1cm4gbmV3IE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZShwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OGZkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TdHJ1Y3R1cmVOb2RlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHtAbGluayBKcGFEZXRhaWxzUGFnZX0KKyAqIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIFhNTCBmaWxlIChlaXRoZXIgZnJvbSB0aGUgcGVyc2lzdGVuY2UKKyAqIGNvbmZpZ3VyYXRpb24gb3IgZnJvbSB0aGUgTWFwcGluZ3MgRGVzY3JpcHRvcikuCisgKi8KK3B1YmxpYyBjbGFzcyBPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcgorCWltcGxlbWVudHMgSnBhRGV0YWlsc1Byb3ZpZGVyCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhRGV0YWlsc1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpwYURldGFpbHNQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkKKwkvKioKKwkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQorCSAqLworCXByaXZhdGUgT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzRGV0YWlscyhKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUpIHsKKwkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChzdHJ1Y3R1cmVOb2RlLmdldElkKCksIE9ybVN0cnVjdHVyZU5vZGVzLlBFUlNJU1RFTlRfVFlQRV9JRCkKKwkJCQkmJiBzdHJ1Y3R1cmVOb2RlLmdldFJlc291cmNlVHlwZSgpLmdldENvbnRlbnRUeXBlKCkuaXNLaW5kT2YoSnB0Q29yZVBsdWdpbi5NQVBQSU5HX0ZJTEVfQ09OVEVOVF9UWVBFKTsKKwl9CisJCisJcHVibGljIEpwYURldGFpbHNQYWdlPFBlcnNpc3RlbnRUeXBlPiBidWlsZERldGFpbHNQYWdlKAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQkKKwkJcmV0dXJuIG5ldyBQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzUxOGFlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogQHNlZSBPcm1FbnRpdHkKKyAqIEBzZWUgT3JtSW5oZXJpdGFuY2VDb21wb3NpdGUgLSBUaGUgY29udGFpbmVyIG9mIHRoaXMgcGFuZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU8T3JtRW50aXR5PgoreworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgT3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9ybUVudGl0eSwgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJT3JtRW50aXR5LkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gbGlzdEl0ZXJhdG9yXygpIHsKKwkJCQlyZXR1cm4gc3ViamVjdC5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCQl9CisvL1RPRE8gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUgd2hlbiBJIGNhbiBjaGFuZ2UgdGhlIEFQSQorLy8JCQlAT3ZlcnJpZGUKKy8vCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKy8vCQkJCXJldHVybiBzdWJqZWN0LmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7CisvLwkJCX0KKwkJfTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc3dpdGNoRGVmYXVsdFRvU3BlY2lmaWVkKCkgeworCQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGRlZmF1bHRKb2luQ29sdW1ucyA9IGdldFN1YmplY3QoKS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisKKwkJaW50IGluZGV4ID0gMDsKKwkJd2hpbGUgKGRlZmF1bHRKb2luQ29sdW1ucy5oYXNOZXh0KCkpIHsKKwkJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gZGVmYXVsdEpvaW5Db2x1bW5zLm5leHQoKTsKKwkJCVN0cmluZyBjb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0TmFtZSgpOworCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKKworCQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gZ2V0U3ViamVjdCgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGluZGV4KyspOworCQkJcGtKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoY29sdW1uTmFtZSk7CisJCQlwa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOworCQl9CisJfQorCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVF1ZXJpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVF1ZXJpZXNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzZiYjA3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUXVlcmllc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5Q29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlF1ZXJpZXNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBRdWVyaWVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFbnRpdHlNYXBwaW5ncworICogQHNlZSBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqIEBzZWUgUXVlcmllc0NvbXBvc2l0ZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgT3JtUXVlcmllc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RW50aXR5TWFwcGluZ3M+IHsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtUXVlcmllc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgT3JtUXVlcmllc0NvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBFbnRpdHlNYXBwaW5ncz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlNYXBwaW5ncywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShFbnRpdHlNYXBwaW5ncyB2YWx1ZSkgeworCQkJCXJldHVybiAodmFsdWUgIT0gbnVsbCk7CisJCQl9CisJCX07CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuT3JtUXVlcmllc0NvbXBvc2l0ZV9ncm91cEJveAorCQkpOworCisJCVF1ZXJpZXNDb21wb3NpdGUgcXVlcmllc0NvbXBvc2l0ZSA9IG5ldyBRdWVyaWVzQ29tcG9zaXRlKHRoaXMsIGJ1aWxkUXVlcnlDb250YWluZXIoKSwgY29udGFpbmVyKTsKKworCQlpbnN0YWxsUGFuZUVuYWJsZXIocXVlcmllc0NvbXBvc2l0ZSk7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnlDb250YWluZXI+IGJ1aWxkUXVlcnlDb250YWluZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBRdWVyeUNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBRdWVyeUNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFF1ZXJ5Q29udGFpbmVyKCk7CisJCQl9CisJCX07CisJfQorCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZUVuYWJsZXIoUXVlcmllc0NvbXBvc2l0ZSBxdWVyaWVzQ29tcG9zaXRlKSB7CisJCW5ldyBQYW5lRW5hYmxlcigKKwkJCWJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSwKKwkJCXF1ZXJpZXNDb21wb3NpdGUKKwkJKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4M2Q1MDkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNlY29uZGFyeVRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlY29uZGFyeVRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlNlY29uZGFyeVRhYmxlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgT3JtRW50aXR5CisgKiBAc2VlIE9ybUVudGl0eUNvbXBvc2l0ZSAtIFRoZSBjb250YWluZXIgb2YgdGhpcyBwYW5lCisgKiBAc2VlIEFkZFJlbW92ZUxpc3RQYW5lCisgKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIE9ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPE9ybUVudGl0eT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKEZvcm1QYW5lPD8gZXh0ZW5kcyBPcm1FbnRpdHk+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklFbnRpdHk8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmluZUluWG1sSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IERlZmluZUluWG1sSG9sZGVyKCk7CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxPcm1TZWNvbmRhcnlUYWJsZT4gYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkgeworCQlMaXN0PExpc3RWYWx1ZU1vZGVsPE9ybVNlY29uZGFyeVRhYmxlPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8T3JtU2Vjb25kYXJ5VGFibGU+PigpOworCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSk7CisJCWxpc3QuYWRkKGJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSk7CisJCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8T3JtU2Vjb25kYXJ5VGFibGU+LCBPcm1TZWNvbmRhcnlUYWJsZT4obGlzdCk7CisJfQorCisJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxPcm1TZWNvbmRhcnlUYWJsZT4gYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0TW9kZWwoKSB7CisJCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPE9ybVNlY29uZGFyeVRhYmxlPihidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSwKKwkJCVRhYmxlLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZKTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE9ybVNlY29uZGFyeVRhYmxlPiBidWlsZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8T3JtRW50aXR5LCBPcm1TZWNvbmRhcnlUYWJsZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPE9ybVNlY29uZGFyeVRhYmxlPiBsaXN0SXRlcmF0b3JfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtU2Vjb25kYXJ5VGFibGU+IGJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8T3JtRW50aXR5LCBPcm1TZWNvbmRhcnlUYWJsZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBPcm1FbnRpdHkuVklSVFVBTF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gbGlzdEl0ZXJhdG9yXygpIHsKKwkJCQlyZXR1cm4gc3ViamVjdC52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKwkJCQlyZXR1cm4gc3ViamVjdC52aXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpOworCQkJfQorCQl9OworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7CisKKwkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlSG9sZGVyID0KKwkJCWJ1aWxkU2Vjb25kYXJ5VGFibGVIb2xkZXIoKTsKKworCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBkZWZpbmVJblhtbEhvbGRlciA9CisJCQlidWlsZERlZmluZUluWG1sSG9sZGVyKCk7CisKKwkJLy8gT3ZlcnJpZGUgRGVmaW5lIEluIFhNTCBjaGVjayBib3gKKwkJYWRkQ2hlY2tCb3goCisJCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4pLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX2RlZmluZUluWG1sLAorCQkJZGVmaW5lSW5YbWxIb2xkZXIsCisJCQludWxsCisJCSk7CisKKwkJLy8gU2Vjb25kYXJ5IFRhYmxlcyBhZGQvcmVtb3ZlIGxpc3QgcGFuZQorCQlBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHk+IGxpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eT4oCisJCQl0aGlzLAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbiksCisJCQlidWlsZFNlY29uZGFyeVRhYmxlc0FkYXB0ZXIoKSwKKwkJCWJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdE1vZGVsKCksCisJCQlzZWNvbmRhcnlUYWJsZUhvbGRlciwKKwkJCWJ1aWxkU2Vjb25kYXJ5VGFibGVMYWJlbFByb3ZpZGVyKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fVEFCTEVfQ09MVU1OUy8vVE9ETyBuZWVkIGEgaGVscCBjb250ZXh0IGlkIGZvciB0aGlzCisJCSk7CisKKwkJaW5zdGFsbExpc3RQYW5lRW5hYmxlcihkZWZpbmVJblhtbEhvbGRlciwgbGlzdFBhbmUpOworCisJCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBwYW5lCisJCW5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlKAorCQkJdGhpcywKKwkJCXNlY29uZGFyeVRhYmxlSG9sZGVyLAorCQkJY29udGFpbmVyCisJCSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBpbnN0YWxsTGlzdFBhbmVFbmFibGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGRlZmluZUluWG1sSG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eT4gbGlzdFBhbmUpIHsKKworCQluZXcgUGFuZUVuYWJsZXIoZGVmaW5lSW5YbWxIb2xkZXIsIGxpc3RQYW5lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFNlY29uZGFyeVRhYmxlRGlhbG9nIGJ1aWxkU2Vjb25kYXJ5VGFibGVEaWFsb2dGb3JBZGQoKSB7CisJCS8vIGRlZmF1bHRTY2hlbWEgYW5kIGRlZmF1bHRDYXRhbG9nIHNob3VsZCBub3QgYmUgdGFrZW4gZnJvbSB0aGUgVGFibGUgaW4gdGhpcyBjYXNlLiAgCisJCS8vIFRoZSB0YWJsZSBkZWZhdWx0IHNjaGVtYSBjb3VsZCBiZSB3aGF0IGlzIHRoZSBzcGVjaWZpZWQgc2NoZW1hIG9uIHRoZSBqYXZhIHRhYmxlLgorCQlyZXR1cm4gbmV3IFNlY29uZGFyeVRhYmxlRGlhbG9nKAorCQkJZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCksIAorCQkJZ2V0U3ViamVjdCgpLmdldE1hcHBpbmdGaWxlUm9vdCgpLmdldENhdGFsb2coKSwgCisJCQlnZXRTdWJqZWN0KCkuZ2V0TWFwcGluZ0ZpbGVSb290KCkuZ2V0U2NoZW1hKCkpOworCX0KKworCXByaXZhdGUgY2xhc3MgRGVmaW5lSW5YbWxIb2xkZXIgZXh0ZW5kcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgorCQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHsKKworCQlwdWJsaWMgRGVmaW5lSW5YbWxIb2xkZXIoKSB7CisJCQlzdXBlcihidWlsZFZpcnR1YWxTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7CisJCQlpZiAoZ2V0U3ViamVjdCgpID09IG51bGwpIHsKKwkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKKwkJCX0KKwkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoZ2V0U3ViamVjdCgpLnNlY29uZGFyeVRhYmxlc0RlZmluZWRJblhtbCgpKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKKwkJCWdldFN1YmplY3QoKS5zZXRTZWNvbmRhcnlUYWJsZXNEZWZpbmVkSW5YbWwodmFsdWUuYm9vbGVhblZhbHVlKCkpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTE3NGJiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb248T3JtVHJhbnNpZW50TWFwcGluZz4KKwlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtVHJhbnNpZW50TWFwcGluZz4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCisJCW5ldyBPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybVRyYW5zaWVudE1hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVHJhbnNpZW50TWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTNkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0VmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIE9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uCisJZXh0ZW5kcyBBYnN0cmFjdFZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uPE9ybVZlcnNpb25NYXBwaW5nPgorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1WZXJzaW9uTWFwcGluZz4KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtVmVyc2lvbk1hcHBpbmc+IGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1WZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1YbWxVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVhtbFVpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOGEzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1YbWxVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZS5Pcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKKworcHVibGljIGNsYXNzIE9ybVhtbFVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24KK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBPcm1YbWxVaURlZmluaXRpb24oKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIE9ybVhtbFVpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9ybVhtbFVpRmFjdG9yeSBidWlsZE9ybVhtbFVpRmFjdG9yeSgpIHsKKwkJcmV0dXJuIG5ldyBHZW5lcmljT3JtWG1sVWlGYWN0b3J5KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzVWkoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgeworCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfMV8wX1JFU09VUkNFX1RZUEUpOworCX0KKwkKKwlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKSB7CisJCXJldHVybiBPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuaW5zdGFuY2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgeworCQlkZWZpbml0aW9ucy5hZGQoT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7CisJCWRlZmluaXRpb25zLmFkZChPcm1FbnRpdHlVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2ZkY2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDI2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5DYXRhbG9nQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuZGIuU2NoZW1hQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAtIFBlcnNpc3RlbmNlIFVuaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IHggWE1MIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgeCBDYXNjYWRlIFBlcnNpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgU2NoZW1hOiAgICAgIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgQ2F0YWxvZzogICAgIHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgQWNjZXNzIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8CisgKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCisgKiBAc2VlIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzCisgKiBAc2VlIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBDYXRhbG9nQ29tYm8KKyAqIEBzZWUgU2NoZW1hQ29tYm8KKyAqIEBzZWUgRW51bUZvcm1Db21ib1ZpZXdlcgorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YT4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZShGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7CisJfQorCisJcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLCBBY2Nlc3NUeXBlPiBhZGRBY2Nlc3NUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cywgQWNjZXNzVHlwZT4odGhpcywgYnVpbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlcigpLCBjb250YWluZXIpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5BQ0NFU1NfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NUeXBlW10gZ2V0Q2hvaWNlcygpIHsKKwkJCQlyZXR1cm4gQWNjZXNzVHlwZS52YWx1ZXMoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEFjY2Vzc1R5cGUgdmFsdWUpIHsKKwkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAorCQkJCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5jbGFzcywKKwkJCQkJUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUudGhpcywKKwkJCQkJdmFsdWUKKwkJCQkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGdldFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0QWNjZXNzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQWNjZXNzVHlwZSB2YWx1ZSkgeworCQkJCWdldFN1YmplY3QoKS5zZXRBY2Nlc3ModmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDYXNjYWRlUGVyc2lzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMsIEJvb2xlYW4+KGJ1aWxkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNIb2xkZXIoKSwgT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuQ0FTQ0FERV9QRVJTSVNUX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LmlzQ2FzY2FkZVBlcnNpc3QoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXN1YmplY3Quc2V0Q2FzY2FkZVBlcnNpc3QodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgQ2F0YWxvZ0NvbWJvPE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPiBhZGRDYXRhbG9nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgQ2F0YWxvZ0NvbWJvPE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPih0aGlzLCBidWlsZFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzSG9sZGVyKCksIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyh2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZENhdGFsb2coKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cz4gYnVpbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSwgT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgdHJhbnNmb3JtXyhQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSB2YWx1ZSkgeworCQkJCXJldHVybiB2YWx1ZS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgU2NoZW1hQ29tYm88T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+IGFkZFNjaGVtYUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlyZXR1cm4gbmV3IFNjaGVtYUNvbWJvPE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPih0aGlzLCBidWlsZFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzSG9sZGVyKCksIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRTY2hlbWEoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkU2NoZW1hKHZhbHVlKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgeworCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcl8oKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERiU2NoZW1hQ29udGFpbmVyKCk7CisJCQl9CisKKwkJfTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLlhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJCXN1YmplY3Quc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCS8vIFNlY3Rpb24KKwkJY29udGFpbmVyID0gYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfcGVyc2lzdGVuY2VVbml0U2VjdGlvbgorCQkpOworCisJCS8vIFhNTCBtYXBwaW5nIG1ldGFkYXRhIGNvbXBsZXRlIGNoZWNrIGJveAorCQlhZGRDaGVja0JveCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3gsCisJCQlidWlsZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlSG9sZGVyKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX1hNTAorCQkpOworCisJCS8vIENhc2NhZGUgUGVyc2lzdCB3aWRnZXRzCisJCWFkZENoZWNrQm94KAorCQkJY29udGFpbmVyLAorCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfY2FzY2FkZVBlcnNpc3RDaGVja0JveCwKKwkJCWJ1aWxkQ2FzY2FkZVBlcnNpc3RIb2xkZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fQ0FTQ0FERQorCQkpOworCisJCS8vIFNjaGVtYSB3aWRnZXRzCisJCWFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9zY2hlbWEsCisJCQlhZGRTY2hlbWFDb21ibyhjb250YWluZXIpLAorCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9TQ0hFTUEKKwkJKTsKKworCQkvLyBDYXRhbG9nIHdpZGdldHMKKwkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2NhdGFsb2csCisJCQlhZGRDYXRhbG9nQ29tYm8oY29udGFpbmVyKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fQ0FUQUxPRworCQkpOworCisJCS8vIEFjY2VzcyBUeXBlIHdpZGdldHMKKwkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2FjY2VzcywKKwkJCWFkZEFjY2Vzc1R5cGVDb21ibyhjb250YWluZXIpLAorCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9BQ0NFU1MKKwkJKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9VbnN1cHBvcnRlZE9ybU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvb3JtL1Vuc3VwcG9ydGVkT3JtTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMzg3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9VbnN1cHBvcnRlZE9ybU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIFVuc3VwcG9ydGVkT3JtTWFwcGluZ1VpRGVmaW5pdGlvbgorCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFVuc3VwcG9ydGVkT3JtTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgVW5zdXBwb3J0ZWRPcm1NYXBwaW5nVWlEZWZpbml0aW9uKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlyZXR1cm4gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuVW5zdXBwb3J0ZWRPcm1NYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7CisJCXJldHVybiBKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5VbnN1cHBvcnRlZE9ybU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJCXJldHVybiBudWxsOworCX0JCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIFVuc3VwcG9ydGVkT3JtTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbCBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IE51bGxDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBjbGFzcyBOdWxsQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8SmF2YUF0dHJpYnV0ZU1hcHBpbmc+CisJCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCisJeworCQlOdWxsQ29tcG9zaXRlKAorCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhQXR0cmlidXRlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikge30KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcERpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGlhbG9ncy9BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2cuamF2YQppbmRleCBiNjM5ZDM4Li5iMGVjZDExIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcERpYWxvZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RpYWxvZ3MvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw2ICs5LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kaWFsb2dzOwogCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlN0YXR1c0RpYWxvZzsKQEAgLTIwLDE5ICsyMSwxMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2ljTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5WZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKQEAgLTQyLDYgKzM2LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7CiAKIHB1YmxpYyBjbGFzcyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2cgZXh0ZW5kcyBTdGF0dXNEaWFsb2cKIHsKQEAgLTg1LDI3ICs4MCwxOSBAQAogCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQogCiAJCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQlCYXNpY01hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlFbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCQkJCUlkTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCQkJCU1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJCQkJTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCQkJCU9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJCQkJVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkKLQkJCQkJfTsKKwkJCQkJcmV0dXJuIEFycmF5VG9vbHMuYXJyYXkoCisJCQkJCQlDb2xsZWN0aW9uVG9vbHMuc29ydCgKKwkJCQkJCQkoKEpwYVBsYXRmb3JtVWkpIGlucHV0RWxlbWVudCkuYXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnModW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlVHlwZSgpKSwKKwkJCQkJCQlnZXRQcm92aWRlcnNDb21wYXJhdG9yKCkpKTsKIAkJCQl9Ci0KKwkJCQkKIAkJCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHt9CiAJCQl9KTsKIAkJbWFwcGluZ0NvbWJvLnNldExhYmVsUHJvdmlkZXIoCiAJCQluZXcgTGFiZWxQcm92aWRlcigpIHsKIAkJCQlAT3ZlcnJpZGUKIAkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuICgoQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIpIGVsZW1lbnQpLmdldExhYmVsKCk7CisJCQkJCXJldHVybiAoKE1hcHBpbmdVaURlZmluaXRpb248Pz4pIGVsZW1lbnQpLmdldExhYmVsKCk7CiAJCQkJfQogCQkJfSk7CiAJCW1hcHBpbmdDb21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CkBAIC0xMTMsNyArMTAwLDggQEAKIAkJCQl2YWxpZGF0ZSgpOwogCQkJfQogCQl9KTsKLQkJbWFwcGluZ0NvbWJvLnNldElucHV0KCJGT08iKTsKKwkJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpID0gSnB0VWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybVVpKHRoaXMudW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpKTsKKwkJbWFwcGluZ0NvbWJvLnNldElucHV0KGpwYVBsYXRmb3JtVWkpOwogCQltYXBwaW5nQ29tYm8uZ2V0Q29tYm8oKS5zZWxlY3QoMCk7ICAvLyBzZWxlY3QgQmFzaWMgdG8gYmVnaW4KIAogCQkvLyBUT0RPIC0gRjEgSGVscApAQCAtMTI2LDYgKzExNCwxNiBAQAogCiAJCXJldHVybiBkaWFsb2dBcmVhOwogCX0KKwkKKwlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPD8+PiBnZXRQcm92aWRlcnNDb21wYXJhdG9yKCkgeworCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbjw/Pj4oKSB7CisJCQlwdWJsaWMgaW50IGNvbXBhcmUoTWFwcGluZ1VpRGVmaW5pdGlvbjw/PiBpdGVtMSwgTWFwcGluZ1VpRGVmaW5pdGlvbjw/PiBpdGVtMikgeworCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMSA9IGl0ZW0xLmdldExhYmVsKCk7CisJCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcyID0gaXRlbTIuZ2V0TGFiZWwoKTsKKwkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGRpc3BsYXlTdHJpbmcxLCBkaXNwbGF5U3RyaW5nMik7CisJCQl9CisJCX07CisJfQogCiAJcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKIAkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7CkBAIC0xNTksNyArMTU3LDcgQEAKIAogCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKIAkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgbWFwcGluZ0NvbWJvLmdldFNlbGVjdGlvbigpOwotCQlyZXR1cm4gKHNlbGVjdGlvbi5pc0VtcHR5KCkpID8gbnVsbCA6ICgoQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0TWFwcGluZ0tleSgpOworCQlyZXR1cm4gKHNlbGVjdGlvbi5pc0VtcHR5KCkpID8gbnVsbCA6ICgoTWFwcGluZ1VpRGVmaW5pdGlvbjw/Pikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKS5nZXRLZXkoKTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGlhbG9ncy9BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2cuamF2YQppbmRleCBjMjIwZjNhLi44NzMyMjRiIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RpYWxvZ3MvQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwxMyArOSwxOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRpYWxvZ3M7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlN0YXR1c0RpYWxvZzsKQEAgLTMxLDExICszNywxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5UeXBlTWFwcGluZ1VpUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRhYmxlVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5NYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLmRldGFpbHMuT3JtRW50aXR5VWlQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW50aXR5VWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKQEAgLTk4LDcgKzEwNCw3IEBACiAJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CiAJCQkJSVR5cGUgdHlwZSA9IGNob29zZVR5cGUoKTsKIAkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCWNsYXNzVGV4dC5zZXRUZXh0KHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpOworCQkJCQljbGFzc1RleHQuc2V0VGV4dCh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnJCcpKTsKIAkJCQl9CiAJCQl9CiAJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewpAQCAtMTE1LDkgKzEyMSw5IEBACiAJCQkJCiAJCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKIAkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQlNYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlci5pbnN0YW5jZSgpLCAKLQkJCQkJCU9ybUVudGl0eVVpUHJvdmlkZXIuaW5zdGFuY2UoKSwgCi0JCQkJCQlFbWJlZGRhYmxlVWlQcm92aWRlci5pbnN0YW5jZSgpCisJCQkJCQlPcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmluc3RhbmNlKCksIAorCQkJCQkJT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCksIAorCQkJCQkJT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpCiAJCQkJCX07CiAJCQkJfQogCQkJCQpAQCAtMTI3LDcgKzEzMyw3IEBACiAJCQluZXcgTGFiZWxQcm92aWRlcigpIHsKIAkJCQlAT3ZlcnJpZGUKIAkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuICgoVHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8+KSBlbGVtZW50KS5nZXRMYWJlbCgpOworCQkJCQlyZXR1cm4gKChNYXBwaW5nVWlEZWZpbml0aW9uPD8+KSBlbGVtZW50KS5nZXRMYWJlbCgpOwogCQkJCX0KIAkJCX0pOwogCQl0aGlzLm1hcHBpbmdDb21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CkBAIC0xNTksMTMgKzE2NSwzNiBAQAogCX0KIAkKIAlwcml2YXRlIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbikgeworCQkvLyBUT0RPIGJ1ZyAxNTYxODUgLSB3aGVuIHRoaXMgaXMgZml4ZWQgdGhlcmUgc2hvdWxkIGJlIGFwaSBmb3IgdGhpcworCQlKYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IgamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yID0gbmV3IEphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcihmYWxzZSwgZmFsc2UpOworCQlqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3Iuc2V0UGFja2FnZUZyYWdtZW50KGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKS5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpKTsKKwkJCiAJCVRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCisJCUNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyLmNyZWF0ZVRleHRDb250ZW50QXNzaXN0YW50KAorCQkJdGV4dCwKKwkJCWphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcgorCQkpOworCQkKKwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKIAkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwogCQlnZC53aWR0aEhpbnQgPSAyNTA7CiAJCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7CiAJCXJldHVybiB0ZXh0OwogCX0KKwlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpIHsKKwkJSVByb2plY3QgcHJvamVjdCA9IGdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7CisJCUlKYXZhUHJvamVjdCByb290ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOworCisJCXRyeSB7CisJCQlyZXR1cm4gcm9vdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpWzBdOworCQl9CisJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJSnB0VWlQbHVnaW4ubG9nKGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwogCQogCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKIAkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuTk9ORSk7CkBAIC0xOTQsNyArMjIzLDcgQEAKIAkKIAlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7CiAJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMubWFwcGluZ0NvbWJvLmdldFNlbGVjdGlvbigpOwotCQlyZXR1cm4gKHNlbGVjdGlvbi5pc0VtcHR5KCkpID8gbnVsbCA6ICgoVHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8+KSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpLmdldE1hcHBpbmdLZXkoKTsKKwkJcmV0dXJuIChzZWxlY3Rpb24uaXNFbXB0eSgpKSA/IG51bGwgOiAoKE1hcHBpbmdVaURlZmluaXRpb248Pz4pIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0S2V5KCk7CiAJfQogCQogCXByb3RlY3RlZCBJVHlwZSBjaG9vc2VUeXBlKCkgewpAQCAtMjM2LDcgKzI2NSw3IEBACiAJCQogCQlJVHlwZSB0eXBlOwogCQl0cnkgewotCQkJdHlwZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGNsYXNzTmFtZSk7CisJCQl0eXBlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoY2xhc3NOYW1lLnJlcGxhY2UoJyQnLCAnLicpKTsKIAkJfQogCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewogCQkJdHlwZSA9IG51bGw7CkBAIC0yNzIsNyArMzAxLDcgQEAKIAkKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXRoaXMuYWRkZWRUeXBlID0gdGhpcy5lbnRpdHlNYXBwaW5ncy5hZGRPcm1QZXJzaXN0ZW50VHlwZShnZXRNYXBwaW5nS2V5KCksIGdldENsYXNzTmFtZSgpKTsKKwkJdGhpcy5hZGRlZFR5cGUgPSB0aGlzLmVudGl0eU1hcHBpbmdzLmFkZFBlcnNpc3RlbnRUeXBlKGdldE1hcHBpbmdLZXkoKSwgZ2V0Q2xhc3NOYW1lKCkpOwogCQlzdXBlci5va1ByZXNzZWQoKTsKIAl9CiAJCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9lZGl0b3JzL1BlcnNpc3RlbmNlRWRpdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9lZGl0b3JzL1BlcnNpc3RlbmNlRWRpdG9yLmphdmEKaW5kZXggYjkzNjg0Zi4uMGY1NDMyYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZWRpdG9ycy9QZXJzaXN0ZW5jZUVkaXRvci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2VkaXRvcnMvUGVyc2lzdGVuY2VFZGl0b3IuamF2YQpAQCAtMjMsNyArMjMsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7CkBAIC0xMTYsNyArMTE2LDcgQEAKIAkgKi8KIAlwcml2YXRlIHZvaWQgYWRkUGVyc2lzdGVuY2VVbml0UGFnZXMoKSB7CiAKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0ganBhUHJvamVjdCgpOworCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBnZXRKcGFQcm9qZWN0KCk7CiAKIAkJLy8gVGhlIHByb2plY3QgZG9lc24ndCBoYXZlIEpQQQogCQlpZiAoanBhUHJvamVjdCA9PSBudWxsKSB7CkBAIC0xMjQsMTcgKzEyNCwxOCBAQAogCQl9CiAKIAkJU3RyaW5nIHBsYXRmb3JtSWQgPSBqcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVJID0gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuanBhUGxhdGZvcm0ocGxhdGZvcm1JZCk7Ci0JCUpwYVVpRmFjdG9yeSB1aUZhY3RvcnkgPSBqcGFQbGF0Zm9ybVVJLmdldEpwYVVpRmFjdG9yeSgpOworCQlKcGFQbGF0Zm9ybVVpIGpwYVBsYXRmb3JtVUkgPSBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkuaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybVVpKHBsYXRmb3JtSWQpOworCQlQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAKKwkJCShQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uKSBqcGFQbGF0Zm9ybVVJLmdldFJlc291cmNlVWlEZWZpbml0aW9uKGpwYVByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRSZXNvdXJjZVR5cGUoKSk7CiAKLQkJTGlzdEl0ZXJhdG9yPEpwYVBhZ2VDb21wb3NpdGU8UGVyc2lzdGVuY2VVbml0Pj4gcGFnZXMgPSB1aUZhY3RvcnkuY3JlYXRlUGVyc2lzdGVuY2VVbml0Q29tcG9zaXRlcygKKwkJTGlzdEl0ZXJhdG9yPEpwYVBhZ2VDb21wb3NpdGU+IHBhZ2VzID0gZGVmaW5pdGlvbi5idWlsZFBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZXMoCiAJCQlidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLAogCQkJZ2V0Q29udGFpbmVyKCksCiAJCQl3aWRnZXRGYWN0b3J5CiAJCSk7CiAKIAkJd2hpbGUgKHBhZ2VzLmhhc05leHQoKSkgewotCQkJSnBhUGFnZUNvbXBvc2l0ZTxQZXJzaXN0ZW5jZVVuaXQ+IHBhZ2UgPSBwYWdlcy5uZXh0KCk7CisJCQlKcGFQYWdlQ29tcG9zaXRlIHBhZ2UgPSBwYWdlcy5uZXh0KCk7CiAKIAkJCXRyeSB7CiAJCQkJRm9ybVBhZ2UgZm9ybVBhZ2UgPSBuZXcgUGFnZShwYWdlKTsKQEAgLTIxOSw3ICsyMjAsNyBAQAogCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEpwYVByb2plY3QsIEpwYVJvb3RDb250ZXh0Tm9kZT4oYnVpbGRKcGFQcm9qZWN0SG9sZGVyKCkpIHsKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIEpwYVJvb3RDb250ZXh0Tm9kZSB0cmFuc2Zvcm1fKEpwYVByb2plY3QgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Um9vdENvbnRleHQoKTsKKwkJCQlyZXR1cm4gdmFsdWUuZ2V0Um9vdENvbnRleHROb2RlKCk7CiAJCQl9CiAJCX07CiAJfQpAQCAtMjk5LDcgKzMwMCw3IEBACiAJICoKIAkgKiBAcmV0dXJuIFRoZSBKUEEgcHJvamVjdAogCSAqLwotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGpwYVByb2plY3QoKSB7CisJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKIAkJcmV0dXJuIEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChnZXRFZGl0b3JJbnB1dCgpLmdldEZpbGUoKS5nZXRQcm9qZWN0KCkpOwogCX0KIApAQCAtMzEzLDE0ICszMTQsMTQgQEAKIAkJICogVGhlIHdyYXBwZWQgcGFnZSB0aGF0IGFjdHVhbGx5IGNvbnRhaW5zIHRoZSB3aWRnZXRzIHRvIHNob3cgd2l0aCB0aGlzCiAJCSAqIGZvcm0gcGFnZS4KIAkJICovCi0JCXByaXZhdGUgZmluYWwgSnBhUGFnZUNvbXBvc2l0ZTxQZXJzaXN0ZW5jZVVuaXQ+IHBhZ2U7CisJCXByaXZhdGUgZmluYWwgSnBhUGFnZUNvbXBvc2l0ZSBwYWdlOwogCiAJCS8qKgogCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhZ2U8L2NvZGU+LgogCQkgKgogCQkgKiBAcGFyYW0gcGFnZSBUaGUgd3JhcHBlZCA8Y29kZT5KcGFQYWdlQ29tcG9zaXRlPC9jb2RlPgogCQkgKi8KLQkJcHJpdmF0ZSBQYWdlKEpwYVBhZ2VDb21wb3NpdGU8UGVyc2lzdGVuY2VVbml0PiBwYWdlKSB7CisJCXByaXZhdGUgUGFnZShKcGFQYWdlQ29tcG9zaXRlIHBhZ2UpIHsKIAogCQkJc3VwZXIoUGVyc2lzdGVuY2VFZGl0b3IudGhpcywKIAkJCSAgICAgIHBhZ2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCkBAIC0zNDcsOSArMzQ4LDYgQEAKIAkJCS8vIFRoaXMgd2lsbCBmaW5pc2ggdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBidXR0b25zCiAJCQl1cGRhdGVIZWxwQnV0dG9uKCk7CiAJCQlmb3JtLnVwZGF0ZVRvb2xCYXIoKTsKLQotCQkJLy8gUG9wdWxhdGUgdGhlIHBhZ2UKLQkJCXBhZ2UucG9wdWxhdGUoKTsKIAkJfQogCiAJCS8qKgpAQCAtNDM4LDcgKzQzNiw3IEBACiAJCQlwdWJsaWMgdm9pZCBydW4oKSB7CiAJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0TWFuYWdlZEZvcm0oKS5nZXRGb3JtKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7CiAJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLmRpc3BsYXlIZWxwUmVzb3VyY2UoaGVscElEKTsKKwkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLmRpc3BsYXlIZWxwKGhlbHBJRCk7CiAJCQkJCX0KIAkJCQl9KTsKIAkJCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9EZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0RlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMzMxZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0RlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPEJhc2ljTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxCYXNpY01hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBEZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyX0RlZmF1bHQsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfQmFzaWNMYWJlbAotCQkpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlPEJhc2ljTWFwcGluZz4gYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKEpwYVVpRmFjdG9yeSBmYWN0b3J5LAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8QmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVCYXNpY01hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjMyZjY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxFbWJlZGRlZE1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8RW1iZWRkZWRNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBOTFMuYmluZCgKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9EZWZhdWx0LAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0VtYmVkZGVkTGFiZWwKLQkJKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZTxFbWJlZGRlZE1hcHBpbmc+IGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YURldGFpbHNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjdmMzZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFTdHJ1Y3R1cmVOb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSA8Y29kZT5JSnBhRGV0YWlsc1BhZ2U8L2NvZGU+Ci0gKiB3aGVuIHRoZSBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIHRoZSBKYXZhIHNvdXJjZSBmaWxlLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YURldGFpbHNQcm92aWRlcgotCWltcGxlbWVudHMgSnBhRGV0YWlsc1Byb3ZpZGVyCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhRGV0YWlsc1Byb3ZpZGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSmF2YURldGFpbHNQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkRGV0YWlsc1BhZ2UoCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCU9iamVjdCBjb250ZW50Tm9kZUlkLAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlpZiAoY29udGVudE5vZGVJZCA9PSBKYXZhU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9UWVBFX0lEKSB7Ci0JCQlyZXR1cm4gbmV3IEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JCX0KLQotCQlpZiAoY29udGVudE5vZGVJZCA9PSBKYXZhU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSUQpIHsKLQkJCXJldHVybiBuZXcgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZShwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhRW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YUVudGl0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzIzN2NhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhRW50aXR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkFic3RyYWN0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgYSBKYXZhIGVudGl0eS4KLSAqCi0gKiBAc2VlIEphdmFFbnRpdHkKLSAqIEBzZWUgQmFzZUpwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICogQHNlZSBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRW50aXR5Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGU8SmF2YUVudGl0eT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkphdmFFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5KYXZhRW50aXR5PC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFFbnRpdHlDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkSW5oZXJpdGFuY2VDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhRW50aXR5VWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFFbnRpdHlVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYTM2YzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFFbnRpdHlVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLlR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRW50aXR5VWlQcm92aWRlciBpbXBsZW1lbnRzIFR5cGVNYXBwaW5nVWlQcm92aWRlcjxKYXZhRW50aXR5PgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFbnRpdHlVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFFbnRpdHlVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFR5cGVNYXBwaW5nVWlQcm92aWRlcjxKYXZhRW50aXR5PiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSmF2YUVudGl0eVVpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50VHlwZVBhZ2VfRW50aXR5TGFiZWw7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yVHlwZU1hcHBpbmcoZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlPEphdmFFbnRpdHk+IGJ1aWxkUGVyc2lzdGVudFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQlKcGFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFFbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOTcxNjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFJbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBwYW5lIHVzZWQgZm9yIGphdmEgaW5oZXJpdGFuY2UuCi0gKgotICogQHNlZSBKYXZhRW50aXR5Ci0gKiBAc2VlIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGU8SmF2YUVudGl0eT4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhSW5oZXJpdGFuY2VDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZShBYnN0cmFjdFBhbmU8SmF2YUVudGl0eT4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhSW5oZXJpdGFuY2VDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5KYXZhRW50aXR5PC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNmNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRldGFpbHMgcGFnZSB1c2VkIGZvciB0aGUgSmF2YSBwZXJzaXN0ZW50Ci0gKiBhdHRyaWJ1dGUuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVHlwZSBtYXBwaW5nIHBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UgZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpIHsKLQkJcmV0dXJuIGpwYVBsYXRmb3JtVWkoKS5qYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlc2UgSUF0dHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMgd2lsbCBiZSB1c2VkIGFzIGVsZW1lbnRzIGluIHRoZSBhdHRyaWJ1dGVNYXBwaW5nIGNvbWJvCi0JICogVGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGNvbWJvIHdpbGwgYmUgb25lIG9mIHRoZSBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzIG9yCi0JICogaWYgbm9uZSBvZiB0aG9zZSBhcHBseSB0aGUgbnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIHdpbGwgYmUgdXNlZC4gVGhlIHJlc3Qgb2YgdGhlIGVsZW1lbnRzCi0JICogd2lsbCBiZSB0aGUgYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzLiAgVGhlIGRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBpcwotCSAqIGRldGVybWluZWQgYnkgbWF0Y2hpbmcgaXRzIGtleSB3aXRoIHRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgYXR0cmlidXRlTWFwcGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+W10gYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzRm9yKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBwcm92aWRlcnMgPSBuZXcgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8Pz5bQ29sbGVjdGlvblRvb2xzLnNpemUoYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkpICsgMV07Ci0JCXByb3ZpZGVyc1swXSA9ICBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJaW50IGkgPSAxOwotCQlmb3IgKEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gaXRlcmF0b3IgPSBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCXByb3ZpZGVyc1tpKytdID0gaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIoU3RyaW5nIGtleSkgewotCQlmb3IgKEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gaSA9IGRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IHByb3ZpZGVyID0gaS5uZXh0KCk7Ci0KLQkJCWlmIChwcm92aWRlci5nZXRNYXBwaW5nS2V5KCkgPT0ga2V5KSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRoaXMubnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpIHsKLQkJcmV0dXJuIGpwYVBsYXRmb3JtVWkoKS5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE1hcCBhcyBjb21wb3NpdGUKLQkJbmV3IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMCwgNSwgMCkKLQkJKTsKLQotCQkvLyBNYXBwaW5nIHByb3BlcnRpZXMgcGFnZQotCQlQYWdlQm9vayBtYXBwaW5nUGFuZSA9IGJ1aWxkTWFwcGluZ1BhZ2VCb29rKGNvbnRhaW5lcik7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCAgICAgICAgID0gU1dULlRPUDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlICAgPSB0cnVlOwotCi0JCW1hcHBpbmdQYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCXByb3RlY3RlZCBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxBdHRyaWJ1dGVNYXBwaW5nPiBudWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBOdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMWUwNDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyAiTWFwIEFzIiBjb21wb3NpdGUgaXMgcmVzcG9uc2libGUgZm9yIHNob3dpbmcgdGhlIG1hcHBpbmcgbmFtZSBhbmQKLSAqIG1hcHBpbmcgdHlwZSBmb3IgYW4gYXR0cmlidXRlIGRlY2xhcmVkIGluIGEgSmF2YSB0eXBlLgotICoKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlIGV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkphdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlyZXR1cm4ganBhUGxhdGZvcm1VaSgpLmphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlyZXR1cm4ganBhUGxhdGZvcm1VaSgpLmRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzMTFiOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5UeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5KYXZhUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRldGFpbHMgcGFnZSB1c2VkIGZvciB0aGUgSmF2YSBwZXJzaXN0ZW50Ci0gKiB0eXBlLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKYXZhUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFR5cGUgbWFwcGluZyBwYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEphdmFQZXJzaXN0ZW50VHlwZQotICogQHNlZSBKYXZhUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UgZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlPEphdmFQZXJzaXN0ZW50VHlwZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiB0eXBlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlyZXR1cm4ganBhUGxhdGZvcm1VaSgpLmphdmFUeXBlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gTWFwIEFzIGNvbXBvc2l0ZQotCQluZXcgSmF2YVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMCwgNSwgMCkKLQkJKTsKLQotCQkvLyBUeXBlIHByb3BlcnRpZXMgcGFnZQotCQlidWlsZFR5cGVNYXBwaW5nUGFnZUJvb2soY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NGRhNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5BYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQHNlZSBKYXZhRW50aXR5Ci0gKiBAc2VlIEphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZSAtIFRoZSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU8SmF2YUVudGl0eT4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFByaW1hcnlLZXlKb2luQ29sdW1uPihidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN3aXRjaERlZmF1bHRUb1NwZWNpZmllZCgpIHsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0KLQkJaWYgKGRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCVN0cmluZyBjb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCi0JCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSBzdWJqZWN0KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCQlwa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShjb2x1bW5OYW1lKTsKLQkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0KLQkJCXRoaXMuam9pbkNvbHVtbkhvbGRlci5zZXRWYWx1ZShwa0pvaW5Db2x1bW4pOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMDUxYmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5BYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHkKLSAqIEBzZWUgRW50aXR5Q29tcG9zaXRlIC0gVGhlIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgQWRkUmVtb3ZlTGlzdFBhbmUKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPEphdmFFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgSmF2YUVudGl0eT4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlPiBidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U2Vjb25kYXJ5VGFibGU+KGJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdEhvbGRlcigpLCAKLQkJCVRhYmxlLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZKTsKLQl9CQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTZWNvbmRhcnlUYWJsZT4gYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eSwgU2Vjb25kYXJ5VGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTZWNvbmRhcnlUYWJsZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCi0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZUhvbGRlciA9Ci0JCQlidWlsZFNlY29uZGFyeVRhYmxlSG9sZGVyKCk7Ci0KLQkJLy8gU2Vjb25kYXJ5IFRhYmxlcyBhZGQvcmVtb3ZlIGxpc3QgcGFuZQotCQluZXcgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PigKLQkJCXRoaXMsCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pLAotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZXNBZGFwdGVyKCksCi0JCQlidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RNb2RlbCgpLAotCQkJc2Vjb25kYXJ5VGFibGVIb2xkZXIsCi0JCQlidWlsZFNlY29uZGFyeVRhYmxlTGFiZWxQcm92aWRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMvL1RPRE8gbmVlZCBhIGhlbHAgY29udGV4dCBpZCBmb3IgdGhpcwotCQkpOwotCi0JCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBwYW5lCi0JCW5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCXNlY29uZGFyeVRhYmxlSG9sZGVyLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9OdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9OdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4ZDAzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvTnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8QXR0cmlidXRlTWFwcGluZz4KLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8QXR0cmlidXRlTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIEpwYUNvbXBvc2l0ZTxBdHRyaWJ1dGVNYXBwaW5nPiBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCUpwYVVpRmFjdG9yeSBmYWN0b3J5LAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBOdWxsQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBOdWxsQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxBdHRyaWJ1dGVNYXBwaW5nPgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZTxBdHRyaWJ1dGVNYXBwaW5nPnsKLQotCQlOdWxsQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JCSAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL051bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9OdWxsVHlwZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNjBhYmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL051bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5UeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE51bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXIgaW1wbGVtZW50cyBUeXBlTWFwcGluZ1VpUHJvdmlkZXI8VHlwZU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVsbFR5cGVNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsVHlwZU1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFR5cGVNYXBwaW5nVWlQcm92aWRlcjxUeXBlTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE51bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRUeXBlUGFnZV9Vbm1hcHBlZExhYmVsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvclR5cGVNYXBwaW5nKAotCQkJTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZCi0JCSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZTxUeXBlTWFwcGluZz4gYnVpbGRQZXJzaXN0ZW50VHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCUpwYVVpRmFjdG9yeSBqcGFVaUZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBOdWxsQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE51bGxDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPFR5cGVNYXBwaW5nPgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZTxUeXBlTWFwcGluZz4KLQl7Ci0JCU51bGxDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPFR5cGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JCSAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlci5qYXZhCmluZGV4IGE0ODc0Y2YuLjZkODdiMzMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL0Fic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKQEAgLTIyLDEyICsyMiwxNSBAQAogICogbGFiZWwgaW5mb3JtYXRpb24gZm9yIGEgTW9kZWwgb2JqZWN0LgogICogCiAgKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqICNidWlsZFRleHRNb2RlbCgpCi0gKiAgICAgcmV0dXJuIGEge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gdGhhdCByZXByZXNlbnRzIHRoZSB0ZXh0IGZvciB0aGUgcmVwcmVzZW50ZWQKLSAqICAgICBtb2RlbCBvYmplY3QuCiAgKiAjYnVpbGRJbWFnZU1vZGVsKCkKLSAqIAkgICByZXR1cm4gYSB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IHJlcHJlc2VudHMgdGhlIGltYWdlIGZvciB0aGUgcmVwcmVzZW50ZWQKLSAqIAkgICBtb2RlbCBvYmplY3QKKyAqIAkgICByZXR1cm4gYSB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IHJlcHJlc2VudHMgdGhlIGltYWdlIGZvciB0aGUgCisgKiAgICAgcmVwcmVzZW50ZWQgbW9kZWwgb2JqZWN0CisgKiAjYnVpbGRUZXh0TW9kZWwoKQorICogICAgIHJldHVybiBhIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IHRoYXQgcmVwcmVzZW50cyB0aGUgdGV4dCBmb3IgdGhlIAorICogICAgIHJlcHJlc2VudGVkIG1vZGVsIG9iamVjdC4KKyAqICNidWlsZERlc2NyaXB0aW9uTW9kZWwoKQorICogCSAgIHJldHVybiBhIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IHRoYXQgcmVwcmVzZW50cyB0aGUgZGVzY3JpcHRpb24gZm9yIAorICogICAgIHRoZSByZXByZXNlbnRlZCBtb2RlbCBvYmplY3QKICAqIAogICogT3RoZXIgbWV0aG9kcyBtYXkgYmUgb3ZlcnJpZGRlbiwgYnV0IHRha2UgY2FyZSB0byBwcmVzZXJ2ZSB0aGUgbG9naWMgcHJvdmlkZWQgCiAgKiBieSB0aGlzIGNsYXNzLgpAQCAtMzgsOSArNDEsMTEgQEAKIAkKIAlwcml2YXRlIE1vZGVsIG1vZGVsOwogCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZU1vZGVsOworCQogCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dE1vZGVsOwogCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZU1vZGVsOworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVzY3JpcHRpb25Nb2RlbDsKIAkKIAlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGFiZWxDaGFuZ2VMaXN0ZW5lcjsKIAkKQEAgLTY2LDQ1ICs3MSwxMCBAQAogCX0KIAkKIAkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgdmFsdWUgbW9kZWwKLQkgKiAobGF6eSBhbmQganVzdC1pbi10aW1lIGluaXRpYWxpemVkKQotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0TW9kZWwoKSB7Ci0JCWlmICh0ZXh0TW9kZWwgPT0gbnVsbCkgewotCQkJdGV4dE1vZGVsID0gYnVpbGRUZXh0TW9kZWwoKTsKLQkJCWVuZ2FnZVRleHRNb2RlbCgpOwotCQl9Ci0JCXJldHVybiB0ZXh0TW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRleHQgdmFsdWUgbW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKTsKLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5lbmdhZ2VUZXh0TW9kZWwoKSBiZWZvcmUgCi0JICogc3ViY2xhc3MgbG9naWMgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVGV4dE1vZGVsKCkgewotCQl0ZXh0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxhYmVsQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5kaXNlbmdhZ2VUZXh0TW9kZWwoKSBhZnRlciAKLQkgKiBzdWJjbGFzcyBsb2dpYyAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VUZXh0TW9kZWwoKSB7Ci0JCWlmICh0ZXh0TW9kZWwgIT0gbnVsbCkgewotCQkJdGV4dE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsYWJlbENoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQkvKioKIAkgKiBSZXR1cm4gdGhlIGltYWdlIHZhbHVlIG1vZGVsCiAJICogKGxhenkgYW5kIGp1c3QtaW4tdGltZSBpbml0aWFsaXplZCkKIAkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZU1vZGVsKCkgeworCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZU1vZGVsKCkgewogCQlpZiAoaW1hZ2VNb2RlbCA9PSBudWxsKSB7CiAJCQlpbWFnZU1vZGVsID0gYnVpbGRJbWFnZU1vZGVsKCk7CiAJCQllbmdhZ2VJbWFnZU1vZGVsKCk7CkBAIC0xMzAsOSArMTAwLDczIEBACiAJICogc3ViY2xhc3MgbG9naWMgCiAJICovCiAJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSW1hZ2VNb2RlbCgpIHsKLQkJaWYgKGltYWdlTW9kZWwgIT0gbnVsbCkgewotCQkJaW1hZ2VNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGFiZWxDaGFuZ2VMaXN0ZW5lcik7CisJCWltYWdlTW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxhYmVsQ2hhbmdlTGlzdGVuZXIpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHRleHQgdmFsdWUgbW9kZWwKKwkgKiAobGF6eSBhbmQganVzdC1pbi10aW1lIGluaXRpYWxpemVkKQorCSAqLworCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dE1vZGVsKCkgeworCQlpZiAodGV4dE1vZGVsID09IG51bGwpIHsKKwkJCXRleHRNb2RlbCA9IGJ1aWxkVGV4dE1vZGVsKCk7CisJCQllbmdhZ2VUZXh0TW9kZWwoKTsKIAkJfQorCQlyZXR1cm4gdGV4dE1vZGVsOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSB0ZXh0IHZhbHVlIG1vZGVsCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCk7CisJCisJLyoqIAorCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZW5nYWdlVGV4dE1vZGVsKCkgYmVmb3JlIAorCSAqIHN1YmNsYXNzIGxvZ2ljIAorCSAqLworCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVRleHRNb2RlbCgpIHsKKwkJdGV4dE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsYWJlbENoYW5nZUxpc3RlbmVyKTsKKwl9CisJCisJLyoqIAorCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZGlzZW5nYWdlVGV4dE1vZGVsKCkgYWZ0ZXIgCisJICogc3ViY2xhc3MgbG9naWMgCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVGV4dE1vZGVsKCkgeworCQl0ZXh0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxhYmVsQ2hhbmdlTGlzdGVuZXIpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGRlc2NyaXB0aW9uIHZhbHVlIG1vZGVsCisJICogKGxhenkgYW5kIGp1c3QtaW4tdGltZSBpbml0aWFsaXplZCkKKwkgKi8KKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGRlc2NyaXB0aW9uTW9kZWwoKSB7CisJCWlmIChkZXNjcmlwdGlvbk1vZGVsID09IG51bGwpIHsKKwkJCWRlc2NyaXB0aW9uTW9kZWwgPSBidWlsZERlc2NyaXB0aW9uTW9kZWwoKTsKKwkJCWVuZ2FnZURlc2NyaXB0aW9uTW9kZWwoKTsKKwkJfQorCQlyZXR1cm4gZGVzY3JpcHRpb25Nb2RlbDsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGEgZGVzY3JpcHRpb24gdmFsdWUgbW9kZWwKKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCk7CisJCisJLyoqIAorCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZW5nYWdlRGVzY3JpcHRpb25Nb2RlbCgpIGJlZm9yZSAKKwkgKiBzdWJjbGFzcyBsb2dpYyAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VEZXNjcmlwdGlvbk1vZGVsKCkgeworCQlkZXNjcmlwdGlvbk1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsYWJlbENoYW5nZUxpc3RlbmVyKTsKKwl9CisJCisJLyoqIAorCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZGlzZW5nYWdlRGVzY3JpcHRpb25Nb2RlbCgpIGFmdGVyIAorCSAqIHN1YmNsYXNzIGxvZ2ljIAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZURlc2NyaXB0aW9uTW9kZWwoKSB7CisJCWRlc2NyaXB0aW9uTW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxhYmVsQ2hhbmdlTGlzdGVuZXIpOwogCX0KIAkKIAkvKioKQEAgLTE0OSwxNiArMTgzLDQyIEBACiAJCXJldHVybiBsYWJlbFByb3ZpZGVyOwogCX0KIAkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0TW9kZWwoKS5nZXRWYWx1ZSgpOwotCX0KLQkKIAlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7CiAJCXJldHVybiBpbWFnZU1vZGVsKCkuZ2V0VmFsdWUoKTsKIAl9CiAJCisJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCQlyZXR1cm4gdGV4dE1vZGVsKCkuZ2V0VmFsdWUoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uTW9kZWwoKS5nZXRWYWx1ZSgpOworCX0KKwkKIAlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlkaXNlbmdhZ2VUZXh0TW9kZWwoKTsKLQkJZGlzZW5nYWdlSW1hZ2VNb2RlbCgpOworCQlkaXNwb3NlVGV4dE1vZGVsKCk7CisJCWRpc3Bvc2VJbWFnZU1vZGVsKCk7CisJCWRpc3Bvc2VEZXNjcmlwdGlvbk1vZGVsKCk7CQorCX0KKwkKKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZGlzcG9zZVRleHRNb2RlbCgpIHsKKwkJaWYgKHRoaXMudGV4dE1vZGVsICE9IG51bGwpIHsKKwkJCWRpc2VuZ2FnZVRleHRNb2RlbCgpOworCQkJdGhpcy50ZXh0TW9kZWwgPSBudWxsOworCQl9CisJfQorCQorCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlSW1hZ2VNb2RlbCgpIHsKKwkJaWYgKHRoaXMuaW1hZ2VNb2RlbCAhPSBudWxsKSB7CisJCQlkaXNlbmdhZ2VJbWFnZU1vZGVsKCk7CisJCQl0aGlzLmltYWdlTW9kZWwgPSBudWxsOworCQl9CisJfQorCQorCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlRGVzY3JpcHRpb25Nb2RlbCgpIHsKKwkJaWYgKHRoaXMuZGVzY3JpcHRpb25Nb2RlbCAhPSBudWxsKSB7CisJCQlkaXNlbmdhZ2VEZXNjcmlwdGlvbk1vZGVsKCk7CisJCQl0aGlzLmRlc2NyaXB0aW9uTW9kZWwgPSBudWxsOworCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDJhNDg3ZTIuLmY5NzViOGMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL0Fic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTIsMTMgKzEyLDE2IEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLk51bGxMaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKQEAgLTQ5LDkgKzUyLDkgQEAKIAkKIAlwcml2YXRlIE1vZGVsIG1vZGVsOwogCQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RT4gY2hpbGRyZW5Nb2RlbDsKKwlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNoaWxkcmVuTW9kZWw7CiAJCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgY2hpbGRyZW5MaXN0ZW5lcjsKKwlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBjaGlsZHJlbkxpc3RlbmVyOwogCQogCQogCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyKApAQCAtNjUsMzkgKzY4LDI5IEBACiAJICogQ29uc3RydWN0IGEgbGlzdGVuZXIgdG8gcmVmcmVzaCB0aGUgdHJlZSAodGhyb3VnaCB0aGUgdHJlZSBjb250ZW50IHByb3ZpZGVyKQogCSAqIGlmIHRoZSBjaGlsZHJlbiBjaGFuZ2UKIAkgKi8KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXRyZWVDb250ZW50UHJvdmlkZXIoKS51cGRhdGVDb250ZW50KG1vZGVsKCkpOworCXByb3RlY3RlZCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDaGlsZHJlbkxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCQorCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKKwkJCQlnZXRUcmVlQ29udGVudFByb3ZpZGVyKCkudXBkYXRlQ29udGVudChnZXRNb2RlbCgpKTsKIAkJCX0KIAkJCQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQl0cmVlQ29udGVudFByb3ZpZGVyKCkudXBkYXRlQ29udGVudChtb2RlbCgpKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXRyZWVDb250ZW50UHJvdmlkZXIoKS51cGRhdGVDb250ZW50KG1vZGVsKCkpOwotCQkJCWZvciAoSXRlcmF0b3I8Pz4gc3RyZWFtID0gZXZlbnQuaXRlbXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJCXRyZWVDb250ZW50UHJvdmlkZXIoKS5kaXNwb3NlKHN0cmVhbS5uZXh0KCkpOworCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgeworCQkJCWdldFRyZWVDb250ZW50UHJvdmlkZXIoKS51cGRhdGVDb250ZW50KGdldE1vZGVsKCkpOworCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBldmVudC5nZXRJdGVtcygpKSB7CisJCQkJCWdldFRyZWVDb250ZW50UHJvdmlkZXIoKS5kaXNwb3NlKGl0ZW0pOwogCQkJCX0KIAkJCX0KIAkJCQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQl0cmVlQ29udGVudFByb3ZpZGVyKCkudXBkYXRlQ29udGVudChtb2RlbCgpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IHN0cmVhbSA9IGV2ZW50LnJlcGxhY2VkSXRlbXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJCXRyZWVDb250ZW50UHJvdmlkZXIoKS5kaXNwb3NlKHN0cmVhbS5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJlZUNvbnRlbnRQcm92aWRlcigpLnVwZGF0ZUNvbnRlbnQobW9kZWwoKSk7CisJCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQlnZXRUcmVlQ29udGVudFByb3ZpZGVyKCkudXBkYXRlQ29udGVudChnZXRNb2RlbCgpKTsKIAkJCQkvLyBpbiB0aGUgY2FzZSBvZiBhIGxpc3QgY2hhbmdlZCBldmVudCwgd2UgZG9uJ3QgaGF2ZSAKIAkJCQkvLyBhY2Nlc3MgdG8gdGhlIHJlbW92ZWQgb2JqZWN0cywgc28gd2UgY2FuJ3QgZGlzcG9zZSB0aGVtLgogCQkJCS8vIGtlZXAgYSB3YXRjaCBvbiB0aGlzIHRvIHNlZSBpZiB0aGlzIGJlY29tZXMgYSBwcm9ibGVtLgogCQkJfQogCQkJCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQl0cmVlQ29udGVudFByb3ZpZGVyKCkudXBkYXRlQ29udGVudChtb2RlbCgpKTsKKwkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7CisJCQkJZ2V0VHJlZUNvbnRlbnRQcm92aWRlcigpLnVwZGF0ZUNvbnRlbnQoZ2V0TW9kZWwoKSk7CiAJCQkJLy8gaW4gdGhlIGNhc2Ugb2YgYSBsaXN0IGNsZWFyZWQgZXZlbnQsIHdlIGRvbid0IGhhdmUgCiAJCQkJLy8gYWNjZXNzIHRvIHRoZSByZW1vdmVkIG9iamVjdHMsIHNvIHdlIGNhbid0IGRpc3Bvc2UgdGhlbS4KIAkJCQkvLyBrZWVwIGEgd2F0Y2ggb24gdGhpcyB0byBzZWUgaWYgdGhpcyBiZWNvbWVzIGEgcHJvYmxlbS4KQEAgLTEwOSwyMCArMTAyLDE5IEBACiAJICogUmV0dXJuIHRoZSBjaGlsZHJlbiBtb2RlbAogCSAqIChsYXp5IGFuZCBqdXN0LWluLXRpbWUgaW5pdGlhbGl6ZWQpCiAJICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEU+IGNoaWxkcmVuTW9kZWwoKSB7Ci0JCWlmIChjaGlsZHJlbk1vZGVsID09IG51bGwpIHsKLQkJCWNoaWxkcmVuTW9kZWwgPSBidWlsZENoaWxkcmVuTW9kZWwoKTsKKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEl0ZXJhdG9yPEU+IGNoaWxkcmVuTW9kZWwoKSB7CisJCWlmICh0aGlzLmNoaWxkcmVuTW9kZWwgPT0gbnVsbCkgeworCQkJdGhpcy5jaGlsZHJlbk1vZGVsID0gYnVpbGRDaGlsZHJlbk1vZGVsKCk7CiAJCQllbmdhZ2VDaGlsZHJlbigpOwogCQl9Ci0JCXJldHVybiBjaGlsZHJlbk1vZGVsOworCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsLml0ZXJhdG9yKCk7CiAJfQogCQogCS8qKgogCSAqIENvbnN0cnVjdCBhIGNoaWxkcmVuIG1vZGVsCiAJICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBOdWxsTGlzdFZhbHVlTW9kZWwoKTsKKwlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgeworCQlyZXR1cm4gbmV3IE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPigpOwogCX0KIAkKIAkvKioKQEAgLTEzMSw4ICsxMjMsOCBAQAogCSAqIFRoaXMgd3JhcHMgdGhlIGNoaWxkcmVuIGNvbGxlY3Rpb24gbW9kZWwgYW5kIHVzZXMgaXQgaW50ZXJuYWxseSBhcyBhIGxpc3QKIAkgKiBtb2RlbC4KIAkgKi8KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8RT4gYnVpbGRDaGlsZHJlbk1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNoaWxkcmVuTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNoaWxkcmVuTW9kZWwpOworCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBidWlsZENoaWxkcmVuTW9kZWwoTGlzdFZhbHVlTW9kZWw8RT4gbHZtKSB7CisJCXJldHVybiBuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFPihsdm0pOwogCX0KIAkKIAkvKioKQEAgLTE0MSwyMiArMTMzLDIyIEBACiAJICogVGhpcyB3cmFwcyB0aGUgY2hpbGRyZW4gKGNoaWxkKSBwcm9wZXJ0eSBtb2RlbCBhbmQgdXNlcyBpdCBpbnRlcm5hbGx5IGFzIGEgbGlzdAogCSAqIG1vZGVsLgogCSAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxFPiBidWlsZENoaWxkcmVuTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEU+IGNoaWxkcmVuTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjaGlsZHJlbk1vZGVsKTsKKwlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8RT4gYnVpbGRDaGlsZHJlbk1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxFPiBsdm0pIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihsdm0pOwogCX0KIAkKIAkvKioKIAkgKiBSZXR1cm4gdGhlIG1vZGVsIG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIG5vZGUKIAkgKi8KLQlwdWJsaWMgTW9kZWwgbW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKKwlwdWJsaWMgTW9kZWwgZ2V0TW9kZWwoKSB7CisJCXJldHVybiB0aGlzLm1vZGVsOwogCX0KIAkKIAkvKioKIAkgKiBSZXR1cm4gdGhlIHRyZWUgY29udGVudCBwcm92aWRlciB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIG5vZGUKIAkgKi8KLQlwdWJsaWMgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gdHJlZUNvbnRlbnRQcm92aWRlcjsKKwlwdWJsaWMgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBnZXRUcmVlQ29udGVudFByb3ZpZGVyKCkgeworCQlyZXR1cm4gdGhpcy50cmVlQ29udGVudFByb3ZpZGVyOwogCX0KIAkKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKQEAgLTE2OCwxNCArMTYwLDE0IEBACiAJfQogCQogCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5hcnJheShjaGlsZHJlbk1vZGVsKCkubGlzdEl0ZXJhdG9yKCkpOworCQlyZXR1cm4gQXJyYXlUb29scy5hcnJheSh0aGlzLmNoaWxkcmVuTW9kZWwoKSk7CiAJfQogCQogCS8qKgogCSAqIE92ZXJyaWRlIHdpdGggcG90ZW50aWFsbHkgbW9yZSBlZmZpY2llbnQgbG9naWMKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuTW9kZWwoKS5saXN0SXRlcmF0b3IoKS5oYXNOZXh0KCk7CisJCXJldHVybiB0aGlzLmNoaWxkcmVuTW9kZWwoKS5oYXNOZXh0KCk7CiAJfQogCQogCS8qKgpAQCAtMTgzLDkgKzE3NSw5IEBACiAJICovCiAJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKIAkJZm9yIChPYmplY3QgY2hpbGQgOiBnZXRDaGlsZHJlbigpKSB7Ci0JCQl0cmVlQ29udGVudFByb3ZpZGVyKCkuZGlzcG9zZShjaGlsZCk7CisJCQlnZXRUcmVlQ29udGVudFByb3ZpZGVyKCkuZGlzcG9zZShjaGlsZCk7CiAJCX0KLQkJZGlzZW5nYWdlQ2hpbGRyZW4oKTsKKwkJZGlzcG9zZUNoaWxkcmVuTW9kZWwoKTsKIAl9CiAJCiAJLyoqIApAQCAtMTkzLDE2ICsxODUsMjAgQEAKIAkgKiBzdWJjbGFzcyBsb2dpYyAKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VDaGlsZHJlbigpIHsKLQkJY2hpbGRyZW5Nb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGNoaWxkcmVuTGlzdGVuZXIpOworCQl0aGlzLmNoaWxkcmVuTW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jaGlsZHJlbkxpc3RlbmVyKTsKIAl9CiAJCisJcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRpc3Bvc2VDaGlsZHJlbk1vZGVsKCkgeworCQlpZiAodGhpcy5jaGlsZHJlbk1vZGVsICE9IG51bGwpIHsKKwkJCXRoaXMuZGlzZW5nYWdlQ2hpbGRyZW5Nb2RlbCgpOworCQkJdGhpcy5jaGlsZHJlbk1vZGVsID0gbnVsbDsKKwkJfQorCX0KIAkvKiogCiAJICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5kaXNlbmdhZ2VDaGlsZHJlbigpIGFmdGVyIAogCSAqIHN1YmNsYXNzIGxvZ2ljIAogCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUNoaWxkcmVuKCkgewotCQlpZiAoY2hpbGRyZW5Nb2RlbCAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbk1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgY2hpbGRyZW5MaXN0ZW5lcik7Ci0JCX0KKwlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VDaGlsZHJlbk1vZGVsKCkgeworCQl0aGlzLmNoaWxkcmVuTW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jaGlsZHJlbkxpc3RlbmVyKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9BcmNoaXZlRmlsZVZpZXdlckZpbHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvQXJjaGl2ZUZpbGVWaWV3ZXJGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjY2YjY3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvQXJjaGl2ZUZpbGVWaWV3ZXJGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOworCisvKioKKyAqIFRoaXMgZmlsdGVyIHdpbGwgZGVueSBzaG93aW5nIGFueSBmaWxlIHRoYXQgYXJlIG5vdCBKQVIgZmlsZXMgb3IgZm9sZGVycworICogdGhhdCBkb24ndCBjb250YWluIGFueSBKQVIgZmlsZXMgaW4gaXRzIHN1Yi1oaWVyYXJjaHkuIAorICovCitwdWJsaWMgY2xhc3MgQXJjaGl2ZUZpbGVWaWV3ZXJGaWx0ZXIgCisJZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gYXJjaGl2ZUV4dGVuc2lvbnM9IHsgImphciIsICJ6aXAiIH07IC8vJE5PTi1OTFMtMSQgCisJCisJCisJcHVibGljIEFyY2hpdmVGaWxlVmlld2VyRmlsdGVyKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoCisJCQlWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJcmV0dXJuIGlzQXJjaGl2ZVBhdGgoKChJRmlsZSllbGVtZW50KS5nZXRGdWxsUGF0aCgpKTsKKwkJfQorCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZvbGRlcikgeworCQkJSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcikgZWxlbWVudDsKKwkJCXRyeSB7CisJCQkJZm9yIChJUmVzb3VyY2UgZWFjaCA6IGZvbGRlci5tZW1iZXJzKCkpIHsKKwkJCQkJaWYgKHNlbGVjdCh2aWV3ZXIsIGZvbGRlciwgZWFjaCkpIHsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQkvLyBqdXN0IHNraXAgdGhpcyBvbmUsIHRoZW4KKwkJCQlKcHRVaVBsdWdpbi5sb2coY2UpOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXJjaGl2ZVBhdGgoSVBhdGggcGF0aCkgeworCQlTdHJpbmcgZXh0PSBwYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKKwkJaWYgKGV4dCAhPSBudWxsICYmIGV4dC5sZW5ndGgoKSAhPSAwKSB7CisJCQlmb3IgKGludCBpPSAwOyBpIDwgYXJjaGl2ZUV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoZXh0LmVxdWFsc0lnbm9yZUNhc2UoYXJjaGl2ZUV4dGVuc2lvbnNbaV0pKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQkJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKaW5kZXggOGI3NDkwMS4uOThlNzA5NCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIuamF2YQpAQCAtMjAsNyArMjAsOCBAQAogICogRXh0ZW5zaW9uIG9mIHtAbGluayBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXJ9IHRoYXQgcHJvdmlkZXMgYW4gZXh0ZW5zaW9uCiAgKiB0byBwcm92aWRlIHRyZWUgY29udGVudAogICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBleHRlbmRzIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcgorcHVibGljIGNsYXNzIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgCisJZXh0ZW5kcyBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIKIAlpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyCiB7CiAJcHVibGljIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIoCkBAIC0zNSw2ICszNiw3IEBACiAJfQogCQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtQ29udGVudFByb3ZpZGVyKE9iamVjdCBpdGVtKSB7CiAJCXJldHVybiAoVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHN1cGVyLml0ZW1Db250ZW50UHJvdmlkZXIoaXRlbSk7CiAJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvSW1hZ2VJbWFnZURlc2NyaXB0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEKaW5kZXggNzg4NjQ3NS4uNGI2OWZkMiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvSW1hZ2VJbWFnZURlc2NyaXB0b3IuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9JbWFnZUltYWdlRGVzY3JpcHRvci5qYXZhCkBAIC0yNywzMyArMjcsMjEgQEAKIAkgKi8KIAlwdWJsaWMgSW1hZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2UgaW1hZ2UpIHsKIAkJc3VwZXIoKTsKLQkJZkltYWdlID0gaW1hZ2U7CisJCXRoaXMuZkltYWdlID0gaW1hZ2U7CiAJfQogCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIChvYmogIT0gbnVsbCkgJiYgZ2V0Q2xhc3MoKS5lcXVhbHMob2JqLmdldENsYXNzKCkpICYmIGZJbWFnZS5lcXVhbHMoKChJbWFnZUltYWdlRGVzY3JpcHRvcikgb2JqKS5mSW1hZ2UpOworCQlyZXR1cm4gKG9iaiAhPSBudWxsKSAmJiBnZXRDbGFzcygpLmVxdWFscyhvYmouZ2V0Q2xhc3MoKSkgJiYgdGhpcy5mSW1hZ2UuZXF1YWxzKCgoSW1hZ2VJbWFnZURlc2NyaXB0b3IpIG9iaikuZkltYWdlKTsKIAl9CiAJCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBJbWFnZURlc2NyaXB0b3IjZ2V0SW1hZ2VEYXRhKCkKLQkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSW1hZ2VEYXRhIGdldEltYWdlRGF0YSgpIHsKLQkJcmV0dXJuIGZJbWFnZS5nZXRJbWFnZURhdGEoKTsKKwkJcmV0dXJuIHRoaXMuZkltYWdlLmdldEltYWdlRGF0YSgpOwogCX0KIAkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIE9iamVjdCNoYXNoQ29kZSgpCi0JICovCisJQE92ZXJyaWRlCiAJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZJbWFnZS5oYXNoQ29kZSgpOworCQlyZXR1cm4gdGhpcy5mSW1hZ2UuaGFzaENvZGUoKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9KYXJGaWxlSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL0phckZpbGVJdGVtTGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOGY5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9KYXJGaWxlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmFyRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworcHVibGljIGNsYXNzIEphckZpbGVJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKK3sKKwlwdWJsaWMgSmFyRmlsZUl0ZW1MYWJlbFByb3ZpZGVyKAorCQkJSmFyRmlsZSBqYXJGaWxlLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgeworCQlzdXBlcihqYXJGaWxlLCBsYWJlbFByb3ZpZGVyKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgeworCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KQVJfRklMRSkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7CisJCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKChKYXJGaWxlKSBtb2RlbCgpKS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7CisJCUphckZpbGUgamFyRmlsZSA9IChKYXJGaWxlKSBtb2RlbCgpOworCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KAorCQkJamFyRmlsZS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKQorCQkJKyAiIC0gIiArIGphckZpbGUuZ2V0UmVzb3VyY2UoKS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL1N0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9TdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlci5qYXZhCmluZGV4IDEyYWI1NjcuLmExMGNjMmYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL1N0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDE1ICs5LDE5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2U7CiAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RMaXN0Vmlld2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKQEAgLTkxLDE5ICs5NSwxOSBAQAogCiAJcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7CiAJCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZSkgeworCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewogCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChlKTsKIAkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgeworCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7CiAJCQkJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZSk7CiAJCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7CisJCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewogCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChlKTsKIAkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKKwkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7CiAJCQkJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIudGhpcy5pdGVtc01vdmVkKGUpOwogCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKKwkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKIAkJCQlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKCk7CiAJCQl9CiAJCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewpAQCAtMTg4LDEwICsxOTIsMTAgQEAKIAkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCiAJICogU3luY2hyb25pemUgdGhlIGxpc3Qgdmlld2VyLgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKKwlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7CiAJCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBMaXN0SXRlcmF0b3Igc3RyZWFtID0gZS5pdGVtcygpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCXRoaXMubGlzdFZpZXdlci5pbnNlcnQoc3RyZWFtLm5leHQoKSwgaSk7CisJCWZvciAoT2JqZWN0IGl0ZW0gOiBlLmdldEl0ZW1zKCkpIHsKKwkJCXRoaXMubGlzdFZpZXdlci5pbnNlcnQoaXRlbSwgaSsrKTsKIAkJfQogCX0KIApAQCAtMTk5LDE5ICsyMDMsMTkgQEAKIAkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgogCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0Vmlld2VyLnJlbW92ZShDb2xsZWN0aW9uVG9vbHMuYXJyYXkoZS5pdGVtcygpLCBlLml0ZW1zU2l6ZSgpKSk7CisJcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7CisJCXRoaXMubGlzdFZpZXdlci5yZW1vdmUoQXJyYXlUb29scy5hcnJheShlLmdldEl0ZW1zKCksIGUuZ2V0SXRlbXNTaXplKCkpKTsKIAl9CiAKIAkvKioKIAkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCiAJICogU3luY2hyb25pemUgdGhlIGxpc3Qgdmlld2VyLgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0Vmlld2VyLnJlbW92ZShDb2xsZWN0aW9uVG9vbHMuYXJyYXkoZS5yZXBsYWNlZEl0ZW1zKCksIGUuaXRlbXNTaXplKCkpKTsKKwlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgeworCQl0aGlzLmxpc3RWaWV3ZXIucmVtb3ZlKEFycmF5VG9vbHMuYXJyYXkoZS5nZXRPbGRJdGVtcygpLCBlLmdldEl0ZW1zU2l6ZSgpKSk7CiAJCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBMaXN0SXRlcmF0b3Igc3RyZWFtID0gZS5pdGVtcygpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCXRoaXMubGlzdFZpZXdlci5pbnNlcnQoc3RyZWFtLm5leHQoKSwgaSk7CisJCWZvciAoT2JqZWN0IGl0ZW0gOiBlLmdldE5ld0l0ZW1zKCkpIHsKKwkJCXRoaXMubGlzdFZpZXdlci5pbnNlcnQoaXRlbSwgaSsrKTsKIAkJfQogCX0KIApAQCAtMjE5LDggKzIyMyw4IEBACiAJICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgogCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCWludCBsZW4gPSBlLmdldE1vdmVMZW5ndGgoKTsKKwlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgeworCQlpbnQgbGVuID0gZS5nZXRMZW5ndGgoKTsKIAkJT2JqZWN0W10gaXRlbXMgPSBuZXcgT2JqZWN0W2xlbl07CiAJCWludCBvZmZzZXQgPSBlLmdldFNvdXJjZUluZGV4KCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL1htbE1hcHBpbmdGaWxlVmlld2VyRmlsdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9YbWxNYXBwaW5nRmlsZVZpZXdlckZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZGY0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9YbWxNYXBwaW5nRmlsZVZpZXdlckZpbHRlci5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKKworLyoqCisgKiBUaGlzIGZpbHRlciB3aWxsIGRlbnkgc2hvd2luZyBhbnkgZmlsZSB0aGF0IGFyZSBub3QgWE1MIG1hcHBpbmcgZmlsZXMgb3IgZm9sZGVycworICogdGhhdCBkb24ndCBjb250YWluIGFueSBYTUwgbWFwcGluZyBmaWxlcyBpbiBpdHMgc3ViLWhpZXJhcmNoeS4gQW4gWE1MIG1hcHBpbmcKKyAqIGZpbGUgaXMgb25lIHRoYXQgaGFzIGEgY29ycmVzcG9uZGluZyBKcGFGaWxlIGluIHRoZSBwcm9qZWN0IHdpdGggYSBtYXBwaW5nIGZpbGUKKyAqIGNvbnRlbnQgdHlwZS4KKyAqIEBzZWUgSnB0Q29yZVBsdWdpbi5NQVBQSU5HX0ZJTEVfQ09OVEVOVF9UWVBFCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxNYXBwaW5nRmlsZVZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7CisKKwlwcml2YXRlIGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKKworCXByaXZhdGUgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OworCQorCXB1YmxpYyBYbWxNYXBwaW5nRmlsZVZpZXdlckZpbHRlcihKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKKwkJdGhpcy5qYXZhUHJvamVjdCA9IGpwYVByb2plY3QuZ2V0SmF2YVByb2plY3QoKTsKKwl9CisKKwkvKioKKwkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgKGFuIFhNTCBmaWxlKSBpcyBhIEpQQSBtYXBwaW5nCisJICogZGVzY3JpcHRvciBmaWxlLiAKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNNYXBwaW5nRmlsZShJRmlsZSBmaWxlKSB7CisJCUpwYUZpbGUganBhRmlsZSA9IHRoaXMuanBhUHJvamVjdC5nZXRKcGFGaWxlKGZpbGUpOworCQlyZXR1cm4ganBhRmlsZSAhPSBudWxsID8ganBhRmlsZS5nZXRDb250ZW50VHlwZSgpLmlzS2luZE9mKEpwdENvcmVQbHVnaW4uTUFQUElOR19GSUxFX0NPTlRFTlRfVFlQRSk6IGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLAorCSAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcGFyZW50RWxlbWVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQpIHsKKworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQlyZXR1cm4gaXNNYXBwaW5nRmlsZSgoSUZpbGUpIGVsZW1lbnQpOworCQl9CisJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRm9sZGVyKSB7CisJCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBlbGVtZW50OworCisJCQl0cnkgeworCQkJCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogdGhpcy5qYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSkgeworCQkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKKwkJCQkJCWlmIChlbnRyeS5nZXRQYXRoKCkuaXNQcmVmaXhPZihmb2xkZXIuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKSkpIHsKKwkJCQkJCQlmb3IgKElSZXNvdXJjZSByZXNvdXJjZSA6IGZvbGRlci5tZW1iZXJzKCkpIHsKKwkJCQkJCQkJaWYgKHNlbGVjdCh2aWV3ZXIsIGZvbGRlciwgcmVzb3VyY2UpKSB7CisJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCUpwdFVpUGx1Z2luLmxvZyhlLmdldFN0YXR1cygpKTsKKwkJCX0KKwkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlKcHRVaVBsdWdpbi5sb2coZS5nZXRTdGF0dXMoKSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9HZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL0dlbmVyaWMyXzBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTkyYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9HZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLlJlc291cmNlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVhtbFVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5qYXZhLkdlbmVyaWMyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtWG1sMl8wVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOworCisvKioKKyAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpQQSBwbGF0Zm9ybSBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlCisgKiBpdCBpcyBpbml0aWFsaXplZCkuCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKK3sKKworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBHZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBHZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCkgeworCQlzdXBlcigpOworCX0KKworCisJLy8gKioqKioqKioqKiBkZXRhaWxzIHByb3ZpZGVycyAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkRGV0YWlsc1Byb3ZpZGVyc1RvKExpc3Q8SnBhRGV0YWlsc1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKKwkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKKwkJcHJvdmlkZXJzLmFkZChFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oTGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKKwkJZGVmaW5pdGlvbnMuYWRkKEdlbmVyaWMyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1YbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKFBlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL0dlbmVyaWNPcm1YbWwyXzBVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvR2VuZXJpY09ybVhtbDJfMFVpRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZDJlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL0dlbmVyaWNPcm1YbWwyXzBVaUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHJhbnNpZW50TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQmFzZU9ybVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1CYXNpY01hcHBpbmcyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1FbnRpdHkyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtSWRNYXBwaW5nMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1PbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtVmVyc2lvbk1hcHBpbmcyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpwYTIuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtWG1sMl8wVWlGYWN0b3J5IAorCWV4dGVuZHMgQmFzZU9ybVhtbFVpRmFjdG9yeQorCWltcGxlbWVudHMgT3JtWG1sVWlGYWN0b3J5Ml8wCit7CisJLy8gKioqKioqKioqKioqKioqKiBvcm0gdHlwZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVudGl0eUNvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtRW50aXR5Ml8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJCisJLy8gKioqKioqKioqKioqKioqKiBvcm0gYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKgorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtSWRNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1JZE1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1FbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1CYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtQmFzaWNNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtVmVyc2lvbk1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1PbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1PbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBPcm1NYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgT3JtRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1UcmFuc2llbnRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IFRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9KcHQyXzBVaU1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL0pwdDJfMFVpTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjA2YTUwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9KcHQyXzBVaU1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworLyoqCisgKiAgSnB0Ml8wVWlNZXNzYWdlcworICovCitwdWJsaWMgY2xhc3MgSnB0Ml8wVWlNZXNzYWdlcworeworCS8vIENvbm5lY3Rpb24KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9EYXRhYmFzZV9Hcm91cEJveDsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlX2p0YURhdGFTb3VyY2VMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZV9ub25KdGFEYXRhU291cmNlTGFiZWw7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGVfc2VjdGlvblRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uQ29tcG9zaXRlX3NlY3Rpb25EZXNjcmlwdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvblRhYl90aXRsZTsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc0NvbXBvc2l0ZV9taXNjZWxsYW5lb3VzU2VjdGlvblRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zQ29tcG9zaXRlX21pc2NlbGxhbmVvdXNTZWN0aW9uRGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWJfdGl0bGU7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19NZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX1RpdGxlOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX2RyaXZlckxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV91cmxMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfdXNlckxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9wYXNzd29yZExhYmVsOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY1Byb3BlcnRpZXNDb21wb3NpdGVfSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzX0dyb3VwQm94OworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGVfbG9ja1RpbWVvdXRMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGVfcXVlcnlUaW1lb3V0TGFiZWw7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX3RyYW5zYWN0aW9uVHlwZUxhYmVsOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX2p0YTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfcmVzb3VyY2VfbG9jYWw7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX3NoYXJlZENhY2hlTW9kZUxhYmVsOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX2FsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaGFyZWRDYWNoZU1vZGVDb21wb3NpdGVfbm9uZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaGFyZWRDYWNoZU1vZGVDb21wb3NpdGVfZW5hYmxlX3NlbGVjdGl2ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaGFyZWRDYWNoZU1vZGVDb21wb3NpdGVfZGlzYWJsZV9zZWxlY3RpdmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX3Vuc3BlY2lmaWVkOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlX3ZhbGlkYXRpb25Nb2RlTGFiZWw7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfYXV0bzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZV9jYWxsYmFjazsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZV9ub25lOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGVfZ3JvdXBQcmVQZXJzaXN0TGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGVfZ3JvdXBQcmVVcGRhdGVMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9ncm91cFByZVJlbW92ZUxhYmVsOworCisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF91aV9wZXJzaXN0ZW5jZTJfMCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHQyXzBVaU1lc3NhZ2VzLmNsYXNzOworCXN0YXRpYyB7CisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7CisJfQorCisJcHJpdmF0ZSBKcHQyXzBVaU1lc3NhZ2VzKCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9BYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5N2RlMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9BYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMjUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENvbHVtbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBUZW1wb3JhbFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEVudW1UeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBMb2JDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBCYXNpY01hcHBpbmcKKyAqIEBzZWUgQ29sdW1uQ29tcG9zaXRlCisgKiBAc2VlIEVudW1UeXBlQ29tcG9zaXRlCisgKiBAc2VlIEZldGNoVHlwZUNvbXBvc2l0ZQorICogQHNlZSBMb2JDb21wb3NpdGUKKyAqIEBzZWUgT3B0aW9uYWxDb21wb3NpdGUKKyAqIEBzZWUgVGVtcG9yYWxUeXBlQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiAKKwlleHRlbmRzIEZvcm1QYW5lPFQ+CisJaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklCYXNpY01hcHBpbmc8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWluaXRpYWxpemVHZW5lcmFsUGFuZShjb250YWluZXIpOworLy8JCWluaXRpYWxpemVUeXBlUGFuZShjb250YWluZXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCQorLy8JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUeXBlUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisvLworLy8JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNhYmxlU2VjdGlvbigKKy8vCQkJY29udGFpbmVyLAorLy8JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90eXBlCisvLwkJKTsKKy8vCQkoKEdyaWRMYXlvdXQpIGNvbnRhaW5lci5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7CisvLworLy8JCS8vIE5vIGNvbnZlcnRlcgorLy8JCUJ1dHRvbiBub0NvbnZlcnRlckJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAorLy8JCQljb250YWluZXIsIAorLy8JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9kZWZhdWx0LCAKKy8vCQkJYnVpbGROb0NvbnZlcnRlckhvbGRlcigpLCAKKy8vCQkJbnVsbCk7CisvLwkJKChHcmlkRGF0YSkgbm9Db252ZXJ0ZXJCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7CisvLwkJCisvLwkJLy8gTG9iCisvLwkJQnV0dG9uIGxvYkJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAorLy8JCQljb250YWluZXIsIAorLy8JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9sb2IsIAorLy8JCQlidWlsZExvYkNvbnZlcnRlckhvbGRlcigpLCAKKy8vCQkJbnVsbCk7CisvLwkJKChHcmlkRGF0YSkgbG9iQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOworLy8JCQorLy8JCVByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IHNwZWNpZmllZENvbnZlcnRlckhvbGRlciA9IGJ1aWxkU3BlY2lmaWVkQ29udmVydGVySG9sZGVyKCk7CisvLwkJLy8gVGVtcG9yYWwKKy8vCQlhZGRSYWRpb0J1dHRvbigKKy8vCQkJY29udGFpbmVyLCAKKy8vCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fdGVtcG9yYWwsIAorLy8JCQlidWlsZFRlbXBvcmFsQm9vbGVhbkhvbGRlcigpLCAKKy8vCQkJbnVsbCk7CisvLwkJcmVnaXN0ZXJTdWJQYW5lKG5ldyBUZW1wb3JhbFR5cGVDb21wb3NpdGUoYnVpbGRUZW1wb3JhbENvbnZlcnRlckhvbGRlcihzcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSkpOworLy8JCQorLy8JCQorLy8JCS8vIEVudW1lcmF0ZWQKKy8vCQlhZGRSYWRpb0J1dHRvbigKKy8vCQkJY29udGFpbmVyLCAKKy8vCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fZW51bWVyYXRlZCwgCisvLwkJCWJ1aWxkRW51bWVyYXRlZEJvb2xlYW5Ib2xkZXIoKSwgCisvLwkJCW51bGwpOworLy8JCXJlZ2lzdGVyU3ViUGFuZShuZXcgRW51bVR5cGVDb21wb3NpdGUoYnVpbGRFbnVtZXJhdGVkQ29udmVydGVySG9sZGVyKHNwZWNpZmllZENvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKSk7CisvLwl9CisvLworLy8JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDb2x1bW4+IGJ1aWxkQ29sdW1uSG9sZGVyKCkgeworLy8JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKy8vCQkJQE92ZXJyaWRlCisvLwkJCXByb3RlY3RlZCBDb2x1bW4gdHJhbnNmb3JtXyhUIHZhbHVlKSB7CisvLwkJCQlyZXR1cm4gdmFsdWUuZ2V0Q29sdW1uKCk7CisvLwkJCX0KKy8vCQl9OworLy8JfQorLy8KKy8vCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb0NvbnZlcnRlckhvbGRlcigpIHsKKy8vCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbnZlcnRpYmxlTWFwcGluZy5TUEVDSUZJRURfQ09OVkVSVEVSX1BST1BFUlRZKSB7CisvLwkJCUBPdmVycmlkZQorLy8JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKy8vCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENvbnZlcnRlcigpID09IG51bGwpOworLy8JCQl9CisvLworLy8JCQlAT3ZlcnJpZGUKKy8vCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKy8vCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgeworLy8JCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLk5PX0NPTlZFUlRFUik7CisvLwkJCQl9CisvLwkJCX0KKy8vCQl9OworLy8JfQorLy8JCisvLwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTG9iQ29udmVydGVySG9sZGVyKCkgeworLy8JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLlNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFkpIHsKKy8vCQkJQE92ZXJyaWRlCisvLwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworLy8JCQkJQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKTsKKy8vCQkJCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgeworLy8JCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOworLy8JCQkJfQorLy8JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5MT0JfQ09OVkVSVEVSKTsKKy8vCQkJfQorLy8KKy8vCQkJQE92ZXJyaWRlCisvLwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisvLwkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKKy8vCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5MT0JfQ09OVkVSVEVSKTsKKy8vCQkJCX0KKy8vCQkJfQorLy8JCX07CisvLwl9CisvLwkKKy8vCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gYnVpbGRTcGVjaWZpZWRDb252ZXJ0ZXJIb2xkZXIoKSB7CisvLwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQ29udmVydGVyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbnZlcnRpYmxlTWFwcGluZy5TUEVDSUZJRURfQ09OVkVSVEVSX1BST1BFUlRZKSB7CisvLwkJCUBPdmVycmlkZQorLy8JCQlwcm90ZWN0ZWQgQ29udmVydGVyIGJ1aWxkVmFsdWVfKCkgeworLy8JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKTsKKy8vCQkJfQorLy8JCX07CisvLwl9CisvLwkKKy8vCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFRlbXBvcmFsQ29udmVydGVyPiBidWlsZFRlbXBvcmFsQ29udmVydGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgeworLy8JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBUZW1wb3JhbENvbnZlcnRlcj4oY29udmVydGVySG9sZGVyKSB7CisvLwkJCUBPdmVycmlkZQorLy8JCQlwcm90ZWN0ZWQgVGVtcG9yYWxDb252ZXJ0ZXIgdHJhbnNmb3JtXyhDb252ZXJ0ZXIgY29udmVydGVyKSB7CisvLwkJCQlyZXR1cm4gKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUikgPyAoVGVtcG9yYWxDb252ZXJ0ZXIpIGNvbnZlcnRlciA6IG51bGw7CisvLwkJCX0KKy8vCQl9OworLy8JfQorLy8JCisvLwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFbnVtZXJhdGVkQ29udmVydGVyPiBidWlsZEVudW1lcmF0ZWRDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7CisvLwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXIsIEVudW1lcmF0ZWRDb252ZXJ0ZXI+KGNvbnZlcnRlckhvbGRlcikgeworLy8JCQlAT3ZlcnJpZGUKKy8vCQkJcHJvdGVjdGVkIEVudW1lcmF0ZWRDb252ZXJ0ZXIgdHJhbnNmb3JtXyhDb252ZXJ0ZXIgY29udmVydGVyKSB7CisvLwkJCQlyZXR1cm4gKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gQ29udmVydGVyLkVOVU1FUkFURURfQ09OVkVSVEVSKSA/IChFbnVtZXJhdGVkQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOworLy8JCQl9CisvLwkJfTsKKy8vCX0KKy8vCisvLwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGVtcG9yYWxCb29sZWFuSG9sZGVyKCkgeworLy8JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLlNQRUNJRklFRF9DT05WRVJURVJfUFJPUEVSVFkpIHsKKy8vCQkJQE92ZXJyaWRlCisvLwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworLy8JCQkJQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKTsKKy8vCQkJCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgeworLy8JCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOworLy8JCQkJfQorLy8JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworLy8JCQl9CisvLworLy8JCQlAT3ZlcnJpZGUKKy8vCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKy8vCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgeworLy8JCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisvLwkJCQl9CisvLwkJCX0KKy8vCQl9OworLy8JfQorLy8JCisvLwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRW51bWVyYXRlZEJvb2xlYW5Ib2xkZXIoKSB7CisvLwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuU1BFQ0lGSUVEX0NPTlZFUlRFUl9QUk9QRVJUWSkgeworLy8JCQlAT3ZlcnJpZGUKKy8vCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisvLwkJCQlDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENvbnZlcnRlcigpOworLy8JCQkJaWYgKGNvbnZlcnRlciA9PSBudWxsKSB7CisvLwkJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisvLwkJCQl9CisvLwkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gQ29udmVydGVyLkVOVU1FUkFURURfQ09OVkVSVEVSKTsKKy8vCQkJfQorLy8KKy8vCQkJQE92ZXJyaWRlCisvLwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisvLwkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKKy8vCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5FTlVNRVJBVEVEX0NPTlZFUlRFUik7CisvLwkJCQl9CisvLwkJCX0KKy8vCQl9OworLy8JfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9BYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkNGY2NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9BYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+CisJaW1wbGVtZW50cyBNYXBwaW5nVWlEZWZpbml0aW9uPFQ+Cit7CisKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wX2xhYmVsOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKKwkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMF9saW5rTGFiZWw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworCQlyZXR1cm4gTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlM2Q4YwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuRGVyaXZlZElkMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgTWFueVRvT25lTWFwcGluZzJfMD4KKwlleHRlbmRzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxUPgoreworCXByb3RlY3RlZCBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJCisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxEZXJpdmVkSWQyXzA+IGJ1aWxkRGVyaXZlZElkSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBEZXJpdmVkSWQyXzA+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgRGVyaXZlZElkMl8wIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVyaXZlZElkKCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fic3RyYWN0T25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQWJzdHJhY3RPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjc4ZmUxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fic3RyYWN0T25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkRlcml2ZWRJZDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0T25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8VCBleHRlbmRzIE9uZVRvT25lTWFwcGluZzJfMD4KKwlleHRlbmRzIEFic3RyYWN0T25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPFQ+Cit7CisJcHJvdGVjdGVkIEFic3RyYWN0T25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RGVyaXZlZElkMl8wPiBidWlsZERlcml2ZWRJZEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgRGVyaXZlZElkMl8wPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIERlcml2ZWRJZDJfMCBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlcml2ZWRJZCgpOworCQkJfQorCQl9OworCX0JCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQXNzb2NpYXRpb25PdmVycmlkZTJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fzc29jaWF0aW9uT3ZlcnJpZGUyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWM4MDBjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fzc29jaWF0aW9uT3ZlcnJpZGUyXzBDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQXNzb2NpYXRpb25PdmVycmlkZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgSm9pbkNvbHVtbnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEFzc29jaWF0aW9uT3ZlcnJpZGUKKyAqIEBzZWUgRW50aXR5T3ZlcnJpZGVzQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqIEBzZWUgSm9pbkNvbHVtbnNDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBDb21wb3NpdGUgZXh0ZW5kcyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QXNzb2NpYXRpb25PdmVycmlkZTwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQ29tcG9zaXRlKEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsIAorCQkJCQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGU+IHN1YmplY3RIb2xkZXIsCisJCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQkvLyBqb2luaW5nIHN0cmF0ZWd5IGdyb3VwIHBhbmUKKwkJR3JvdXAgZ3JvdXBQYW5lID0gYWRkVGl0bGVkR3JvdXAoCisJCQljb250YWluZXIsCisJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX3RpdGxlCisJCSk7CisJCQorCQlhZGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZShncm91cFBhbmUpOworCQlhZGRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lKGdyb3VwUGFuZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGJ1aWxkUmVsYXRpb25zaGlwUmVmZXJlbmNlSG9sZGVyKCksIGNvbnRhaW5lcik7CQkKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wPiBidWlsZFJlbGF0aW9uc2hpcFJlZmVyZW5jZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlLCBBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAgdHJhbnNmb3JtXyhBc3NvY2lhdGlvbk92ZXJyaWRlIHZhbHVlKSB7CisJCQkJcmV0dXJuIChBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wKSB2YWx1ZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKKwkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKKy8vCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0NhY2hlYWJsZTJfMFBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9DYWNoZWFibGUyXzBQYW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiMjczMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9DYWNoZWFibGUyXzBQYW5lLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5EZXJpdmVkSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCBbWF0gIENhY2hlYWJsZSAodHJ1ZS9mYWxzZSkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBDYWNoZWFibGUyXzAKKyAqIEBzZWUgSmF2YUVudGl0eTJfMENvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0CisgKiBAc2VlIE9ybUVudGl0eTJfMENvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0CisgKi8KK3B1YmxpYyBjbGFzcyBDYWNoZWFibGUyXzBQYW5lIAorCWV4dGVuZHMgRm9ybVBhbmU8Q2FjaGVhYmxlMl8wPgoreworCXB1YmxpYyBDYWNoZWFibGUyXzBQYW5lKAorCQkJRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQ2FjaGVhYmxlMl8wPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCQkKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVudGl0eV9jYWNoZWFibGVMYWJlbCwKKwkJCWJ1aWxkQ2FjaGVhYmxlQm9vbGVhbkhvbGRlcigpLAorCQkJYnVpbGRDYWNoZWFibGVTdHJpbmdIb2xkZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9DQUNIRUFCTEUKKwkJKTsKKwl9CisJCisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ2FjaGVhYmxlQm9vbGVhbkhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGVhYmxlMl8wLCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCUNhY2hlYWJsZTJfMC5ERUZBVUxUX0NBQ0hFQUJMRV9QUk9QRVJUWSwKKwkJCUNhY2hlYWJsZTJfMC5TUEVDSUZJRURfQ0FDSEVBQkxFX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ2FjaGVhYmxlU3RyaW5nSG9sZGVyKCkgeworCisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRDYWNoZWFibGVIb2xkZXIoKSkgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRVaURldGFpbHNNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOworCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuRW50aXR5X2NhY2hlYWJsZVdpdGhEZWZhdWx0TGFiZWwsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlczJfMC5FbnRpdHlfY2FjaGVhYmxlTGFiZWw7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdENhY2hlYWJsZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGVhYmxlMl8wLCBCb29sZWFuPigKKwkJCWdldFN1YmplY3RIb2xkZXIoKSwKKwkJCUNhY2hlYWJsZTJfMC5TUEVDSUZJRURfQ0FDSEVBQkxFX1BST1BFUlRZLAorCQkJQ2FjaGVhYmxlMl8wLkRFRkFVTFRfQ0FDSEVBQkxFX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQkJfQorCQl9OworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Rlcml2ZWRJZDJfMFBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9EZXJpdmVkSWQyXzBQYW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkZGZmMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9EZXJpdmVkSWQyXzBQYW5lLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5EZXJpdmVkSWQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1PbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCBbIF0gIERlcml2ZWQgaWQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBEZXJpdmVkSWQyXzAKKyAqIEBzZWUgSmF2YU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0CisgKiBAc2VlIEphdmFNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKKyAqIEBzZWUgT3JtT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKKyAqIEBzZWUgT3JtTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0CisgKi8KK3B1YmxpYyBjbGFzcyBEZXJpdmVkSWQyXzBQYW5lIAorCWV4dGVuZHMgRm9ybVBhbmU8RGVyaXZlZElkMl8wPgoreworCXB1YmxpYyBEZXJpdmVkSWQyXzBQYW5lKAorCQkJRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRGVyaXZlZElkMl8wPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCQkKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWFkZENoZWNrQm94KAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDQsIDAsIDQsIDApLCAKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkRlcml2ZWRJZFBhbmVfZGVyaXZlZElkQ2hlY2tib3hMYWJlbCwKKwkJCWJ1aWxkRGVyaXZlZElkVmFsdWVIb2xkZXIoKSwKKwkJCW51bGwpOworCX0KKwkKKwlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZXJpdmVkSWRWYWx1ZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RGVyaXZlZElkMl8wLCBCb29sZWFuPigKKwkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIERlcml2ZWRJZDJfMC5WQUxVRV9QUk9QRVJUWSkgeworCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldFZhbHVlKCkpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldFZhbHVlKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxMzZlZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBFbnVtVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgTG9iQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgQmFzaWNNYXBwaW5nCisgKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQorICogQHNlZSBFbnVtVHlwZUNvbXBvc2l0ZQorICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKKyAqIEBzZWUgTG9iQ29tcG9zaXRlCisgKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCisgKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGU8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUJhc2ljTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRW1iZWRkZWRNYXBwaW5nMl8wT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRW1iZWRkZWRNYXBwaW5nMl8wT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlODU3NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9FbWJlZGRlZE1hcHBpbmcyXzBPdmVycmlkZXNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgIHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFbWJlZGRlZE1hcHBpbmcKKyAqIEBzZWUgQ29sdW1uQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBjbGFzcyBFbWJlZGRlZE1hcHBpbmcyXzBPdmVycmlkZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZTxFbWJlZGRlZE1hcHBpbmc+Cit7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRW1iZWRkZWRNYXBwaW5nMl8wT3ZlcnJpZGVzQ29tcG9zaXRlKEZvcm1QYW5lPD8gZXh0ZW5kcyBFbWJlZGRlZE1hcHBpbmc+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtYmVkZGVkTWFwcGluZywgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkJfQorCQl9OworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBQYW5lPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZVBhbmUoUGFnZUJvb2sgcGFnZUJvb2ssIFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyKSB7CisJCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZTJfMENvbXBvc2l0ZSh0aGlzLCBhc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyLCBwYWdlQm9vayk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcj4gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbWJlZGRlZE1hcHBpbmcsIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChFbWJlZGRlZE1hcHBpbmcyXzApIHRoaXMuc3ViamVjdCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQkJfQorCQl9OworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9FbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9FbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTFmYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0VudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BdHRyaWJ1dGVPdmVycmlkZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAtIEF0dHJpYnV0ZSBPdmVycmlkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgIHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKKyAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisgKiB8IHwgfCBQYWdlQm9vayAoQXR0cmlidXRlT3ZlcnJpZGVDb21wb3NpdGUvQXNzb2NpYXRpb25PdmVycmlkZUNvbXBvc2l0ZSl8IHwgfAorICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIEVudGl0eQorICogQHNlZSBFbnRpdHkyXzBDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgorICogQHNlZSBBdHRyaWJ1dGVPdmVycmlkZUNvbXBvc2l0ZQorICogQHNlZSBBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQ29tcG9zaXRlCisgKgorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMi4yCisgKi8KK3B1YmxpYyBjbGFzcyBFbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZQoreworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PdmVycmlkZXNDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBFbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUoRm9ybVBhbmU8PyBleHRlbmRzIEVudGl0eT4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBQYW5lPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZVBhbmUoUGFnZUJvb2sgcGFnZUJvb2ssIFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyKSB7CisJCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZTJfMENvbXBvc2l0ZSh0aGlzLCBhc3NvY2lhdGlvbk92ZXJyaWRlSG9sZGVyLCBwYWdlQm9vayk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0dlbmVyYXRpb24yXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9HZW5lcmF0aW9uMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyZTFiYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9HZW5lcmF0aW9uMl8wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5HZW5lcmF0aW9uQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgR2VuZXJhdGlvbjJfMENvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgR2VuZXJhdGlvbjJfMENvbXBvc2l0ZSBleHRlbmRzIEdlbmVyYXRpb25Db21wb3NpdGUKK3sKKwkKKwlwdWJsaWMgR2VuZXJhdGlvbjJfMENvbXBvc2l0ZSgKKwkJUGFuZTw/PiBwYXJlbnRQYW5lLCAKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBHZW5lcmF0b3JDb250YWluZXI+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgdG9wTWFyZ2luLCBpbnQgbGVmdE1hcmdpbikgeworCQluZXcgU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUoCisJCQl0aGlzLAorCQkJdGhpcy5idWlsZFNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyKCksCisJCQl0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCB0b3BNYXJnaW4sIGxlZnRNYXJnaW4pLAorCQkJdGhpcy5idWlsZFNlcXVlbmNlR2VuZXJhdG9yQnVpbGRlcigpCisJCSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0lkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGZmMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0lkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRNYXBwaW5nR2VuZXJhdGlvbkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5HZW5lcmF0b3JDb21wb3NpdGUuR2VuZXJhdG9yQnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqICBJZE1hcHBpbmdHZW5lcmF0aW9uMl8wQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBJZE1hcHBpbmdHZW5lcmF0aW9uMl8wQ29tcG9zaXRlIGV4dGVuZHMgSWRNYXBwaW5nR2VuZXJhdGlvbkNvbXBvc2l0ZQoreworCisJcHVibGljIElkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGUoRm9ybVBhbmU8PyBleHRlbmRzIElkTWFwcGluZz4gcGFyZW50UGFuZSwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlKAorCQlDb21wb3NpdGUgY29udGFpbmVyLCAKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPFNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvckhvbGRlciwKKwkJR2VuZXJhdG9yQnVpbGRlcjxTZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JCdWlsZGVyLAorCQlpbnQgdG9wTWFyZ2luLAorCQlpbnQgbGVmdE1hcmdpbikgeworCisJCXJldHVybiBuZXcgU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUoCisJCQl0aGlzLAorCQkJc2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIsCisJCQl0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCB0b3BNYXJnaW4sIGxlZnRNYXJnaW4pLAorCQkJc2VxdWVuY2VHZW5lcmF0b3JCdWlsZGVyCisJCSk7CisJfQorCQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0pwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDQ0NzY5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0pwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworLyoqCisgKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIG1hcHBpbmcgcGFuZXMuCisgKgorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBjbGFzcyBKcHRVaURldGFpbHNNZXNzYWdlczJfMCB7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXJpdmVkSWRQYW5lX2Rlcml2ZWRJZENoZWNrYm94TGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMF9saW5rTGFiZWw7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5X2NhY2hlYWJsZUxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eV9jYWNoZWFibGVXaXRoRGVmYXVsdExhYmVsOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZV9vcnBoYW5SZW1vdmFsTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZV9vcnBoYW5SZW1vdmFsTGFiZWxEZWZhdWx0OworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfdWlfZGV0YWlsczJfMCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRVaURldGFpbHNNZXNzYWdlczJfMC5jbGFzczsKKwlzdGF0aWMgeworCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOworCX0KKworCXByaXZhdGUgSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL09ycGhhblJlbW92YWwyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmMGM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgW1hdICBPcnBoYW4gcmVtb3ZhbCAodHJ1ZS9mYWxzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIHtAbGluayBPcnBoYW5SZW1vdmFibGUyXzB9CisgKiBAc2VlIHtAbGluayBKYXZhT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlfSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0CisgKiBAc2VlIHtAbGluayBPcm1PbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGV9IC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKKyAqLworcHVibGljIGNsYXNzIE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxPcnBoYW5SZW1vdmFibGUyXzA+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlKAorCQkJCQkJCUZvcm1QYW5lPD8gZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nPiBwYXJlbnRQYW5lLAorCQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JwaGFuUmVtb3ZhYmxlMl8wPiBzdWJqZWN0SG9sZGVyLAorCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKKwkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDQpLAorCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZV9vcnBoYW5SZW1vdmFsTGFiZWwsCisJCQl0aGlzLmJ1aWxkT3JwaGFuUmVtb3ZhbEhvbGRlcigpLAorCQkJdGhpcy5idWlsZE9ycGhhblJlbW92YWxTdHJpbmdIb2xkZXIoKSwKKwkJCW51bGwJCS8vIFRPRE8KKwkJKTsKKwl9CisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE9ycGhhblJlbW92YWxIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ycGhhblJlbW92YWJsZTJfMCwgQm9vbGVhbj4oCisJCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIAorCQkJCU9ycGhhblJlbW92YWJsZTJfMC5ERUZBVUxUX09SUEhBTl9SRU1PVkFMX1BST1BFUlRZLAorCQkJCU9ycGhhblJlbW92YWJsZTJfMC5TUEVDSUZJRURfT1JQSEFOX1JFTU9WQUxfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE9ycGhhblJlbW92YWxTdHJpbmdIb2xkZXIoKSB7CisJCQorCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4odGhpcy5idWlsZERlZmF1bHRPcnBoYW5SZW1vdmFsSG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7CisJCQkJCXJldHVybiBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlczJfMC5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlX29ycGhhblJlbW92YWxMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisJCQkJfQorCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlczJfMC5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlX29ycGhhblJlbW92YWxMYWJlbDsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0T3JwaGFuUmVtb3ZhbEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JwaGFuUmVtb3ZhYmxlMl8wLCBCb29sZWFuPigKKwkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJT3JwaGFuUmVtb3ZhYmxlMl8wLlNQRUNJRklFRF9PUlBIQU5fUkVNT1ZBTF9QUk9QRVJUWSwKKwkJCU9ycGhhblJlbW92YWJsZTJfMC5ERUZBVUxUX09SUEhBTl9SRU1PVkFMX1BST1BFUlRZKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSk7CisJCQl9CisJCX07CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL1NlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjFiMmZlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL1NlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWFDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNhdGFsb2dDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIEphdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMENvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUgZXh0ZW5kcyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZQoreworCisJcHVibGljIFNlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPFNlcXVlbmNlR2VuZXJhdG9yPiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZGVyKSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBidWlsZGVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQkvLyBOYW1lIHdpZGdldHMKKwkJdGhpcy5hZGRMYWJlbGVkVGV4dCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWUsCisJCQl0aGlzLmJ1aWxkR2VuZXJhdG9yTmFtZUhvbGRlcigpLAorCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1JfTkFNRQorCQkpOworCisJCS8vIFNlcXVlbmNlIEdlbmVyYXRvciB3aWRnZXRzCisJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NlcXVlbmNlLAorCQkJdGhpcy5idWlsZFNlcXVlbmNlTmFtZUNvbWJvKGNvbnRhaW5lciksCisJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9TRVFVRU5DRQorCQkpOworCisJCS8vIFNjaGVtYSB3aWRnZXRzCisJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NjaGVtYSwKKwkJCXRoaXMuYWRkU2NoZW1hQ29tYm8oY29udGFpbmVyKSwKKwkJCW51bGwJLy8gSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1JfU0NIRU1BCisJCSk7CisKKwkJLy8gQ2F0YWxvZyB3aWRnZXRzCisJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX2NhdGFsb2csCisJCQl0aGlzLmFkZENhdGFsb2dDb21ibyhjb250YWluZXIpLAorCQkJbnVsbAkvLyBKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9DQVRBTE9HCisJCSk7CisKKwkJdGhpcy5hZGRBbGxvY2F0aW9uU2l6ZUNvbWJvKGNvbnRhaW5lcik7CisJCXRoaXMuYWRkSW5pdGlhbFZhbHVlQ29tYm8oY29udGFpbmVyKTsKKwl9CisKKwlwcml2YXRlIFNjaGVtYUNvbWJvPFNlcXVlbmNlR2VuZXJhdG9yPiBhZGRTY2hlbWFDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJcmV0dXJuIG5ldyBTY2hlbWFDb21ibzxTZXF1ZW5jZUdlbmVyYXRvcj4odGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChTZXF1ZW5jZUdlbmVyYXRvcjJfMC5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoU2VxdWVuY2VHZW5lcmF0b3IyXzAuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoU2VxdWVuY2VHZW5lcmF0b3IyXzAuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChTZXF1ZW5jZUdlbmVyYXRvcjJfMC5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJCQlpZiAocHJvcGVydHlOYW1lID09IFNlcXVlbmNlR2VuZXJhdG9yMl8wLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWQorCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gU2VxdWVuY2VHZW5lcmF0b3IyXzAuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgKSB7CisJCQkJCXJlcG9wdWxhdGVDb21ib0JveCgpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7CisJCQkJfQorCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiAoKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBnZXRTdWJqZWN0KCkpLmdldERlZmF1bHRTY2hlbWEoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgYm9vbGVhbiBudWxsU3ViamVjdElzQWxsb3dlZCgpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKworCQkJLyoqCisJCQkgKiBzdWJqZWN0IG1heSBiZSBudWxsLCBzbyBkZWxlZ2F0ZSB0byB0aGUgY29tcG9zaXRlCisJCQkgKi8KKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKKwkJCQlyZXR1cm4gU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUudGhpcy5nZXRKcGFQcm9qZWN0KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCQkJKChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUudGhpcy5yZXRyaWV2ZUdlbmVyYXRvcigpKS5zZXRTcGVjaWZpZWRTY2hlbWEodmFsdWUpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCQkJcmV0dXJuICgoU2VxdWVuY2VHZW5lcmF0b3IyXzApIGdldFN1YmplY3QoKSkuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcigpIHsKKwkJCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCB0ZyA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgdGhpcy5nZXRTdWJqZWN0KCk7CisJCQkJaWYgKHRnICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIHRnLmdldERiU2NoZW1hQ29udGFpbmVyKCk7CisJCQkJfQorCQkJCXJldHVybiBTZXF1ZW5jZUdlbmVyYXRvcjJfMENvbXBvc2l0ZS50aGlzLmdldFN1YmplY3QoKS5nZXRDb250ZXh0RGVmYXVsdERiU2NoZW1hQ29udGFpbmVyKCk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcl8oKSB7CisJCQkJLy8gd2Ugb3ZlcnJvZGUgI2dldERiU2NoZW1hQ29udGFpbmVyKCkgaW5zdGVhZAorCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgQ2F0YWxvZ0NvbWJvPFNlcXVlbmNlR2VuZXJhdG9yPiBhZGRDYXRhbG9nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgQ2F0YWxvZ0NvbWJvPFNlcXVlbmNlR2VuZXJhdG9yPih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFNlcXVlbmNlR2VuZXJhdG9yMl8wLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoU2VxdWVuY2VHZW5lcmF0b3IyXzAuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiAoKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBnZXRTdWJqZWN0KCkpLmdldERlZmF1bHRDYXRhbG9nKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gbnVsbFN1YmplY3RJc0FsbG93ZWQoKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCS8qKgorCQkJICogc3ViamVjdCBtYXkgYmUgbnVsbCwgc28gZGVsZWdhdGUgdG8gdGhlIGNvbXBvc2l0ZQorCQkJICovCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7CisJCQkJcmV0dXJuIFNlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlLnRoaXMuZ2V0SnBhUHJvamVjdCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQkJCSgoU2VxdWVuY2VHZW5lcmF0b3IyXzApIFNlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlLnRoaXMucmV0cmlldmVHZW5lcmF0b3IoKSkuc2V0U3BlY2lmaWVkQ2F0YWxvZyh2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gKChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgZ2V0U3ViamVjdCgpKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7CisJCQl9CisJCX07CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvR2VuZXJpYzJfMEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvR2VuZXJpYzJfMEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYzllN2UKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9HZW5lcmljMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW50aXR5VWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLk51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKKworcHVibGljIGNsYXNzIEdlbmVyaWMyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24gZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEdlbmVyaWMyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgorCSAqLworCXByb3RlY3RlZCBHZW5lcmljMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSmF2YVVpRmFjdG9yeSBidWlsZEphdmFVaUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpYzJfMEphdmFVaUZhY3RvcnkoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+PiBkZWZpbml0aW9ucykgeworCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChOdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9HZW5lcmljMl8wSmF2YVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvR2VuZXJpYzJfMEphdmFVaUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWVmMzNhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvR2VuZXJpYzJfMEphdmFVaUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkJhc2VKYXZhVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLkdlbmVyaWNQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuanBhMi5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBVSSBmYWN0b3J5IHJlcXVpcmVkIHRvIHNob3cgdGhlIGluZm9ybWF0aW9uCisgKiByZWxhdGVkIHRvIGEgSlBBIG1hcHBpbmcgKHR5cGUgb3IgYXR0cmlidXRlKS4KKyAqCisgKiBAc2VlIEdlbmVyaWNQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeQorICoKKyAqIEB2ZXJzaW9uIDEuMAorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpYzJfMEphdmFVaUZhY3RvcnkKKwlleHRlbmRzIEJhc2VKYXZhVWlGYWN0b3J5CisJaW1wbGVtZW50cyBKYXZhVWlGYWN0b3J5Ml8wCit7CisJCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEphdmFNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVudGl0eUNvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgSmF2YUVudGl0eTJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbWJlZGRhYmxlQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgSmF2YUVtYmVkZGFibGUyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFJZE1hcHBpbmdDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBKYXZhSWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgSmF2YUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsIAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gbmV3IEphdmFPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsIAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiBuZXcgSmF2YU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuIG5ldyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzZmY1NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuanBhMi5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCitwdWJsaWMgY2xhc3MgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbgorCWV4dGVuZHMgQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb248SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4KKwlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+Cit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbigpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJcmV0dXJuICgoSmF2YVVpRmFjdG9yeTJfMCkgZmFjdG9yeSkuY3JlYXRlSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRhYmxlMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkYWJsZTJfMENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1M2Q1MzUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkYWJsZTJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgcGFuZSBkb2VzIG5vdCBoYXZlIGFueSB3aWRnZXRzLgorICoKKyAqIEBzZWUgRW1iZWRkYWJsZQorICogQHNlZSBFbWJlZGRhYmxlVWlQcm92aWRlcgorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGFibGUyXzBDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxKYXZhRW1iZWRkYWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEphdmFFbWJlZGRhYmxlMl8wQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOwkKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbWJlZGRhYmxlLCBBY2Nlc3NIb2xkZXI+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZSgpOworCQkJfQorCQl9OworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmIxZWRkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmcyXzBPdmVycmlkZXNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFbWJlZGRlZE1hcHBpbmcKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIEphdmFFbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxKYXZhRW1iZWRkZWRNYXBwaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+RW1iZWRkZWRNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEphdmFFbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgRW1iZWRkZWRNYXBwaW5nMl8wT3ZlcnJpZGVzQ29tcG9zaXRlKAorCQkJdGhpcywKKwkJCWNvbnRhaW5lcgorCQkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjOWE1MwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFFbnRpdHkyXzBDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkVudGl0eU5hbWVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYWJsZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5DYWNoZWFibGUyXzBQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuRW50aXR5Ml8wT3ZlcnJpZGVzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoZSBwYW5lIHVzZWQgZm9yIGEgSmF2YSBlbnRpdHkuCisgKgorICogQHNlZSBKYXZhRW50aXR5CisgKiBAc2VlIEphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGNsYXNzIEphdmFFbnRpdHkyXzBDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTxKYXZhRW50aXR5PgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmF2YUVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkphdmFFbnRpdHk8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgSmF2YUVudGl0eTJfMENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCisJCW5ldyBUYWJsZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCQluZXcgRW50aXR5TmFtZUNvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pKTsJCisJCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pLCBmYWxzZSk7CisJCW5ldyBDYWNoZWFibGUyXzBQYW5lKHRoaXMsIGJ1aWxkQ2FjaGVhYmxlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW50aXR5LCBBY2Nlc3NIb2xkZXI+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlYWJsZTJfMD4gYnVpbGRDYWNoZWFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbnRpdHksIENhY2hlYWJsZTJfMD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBDYWNoZWFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldENhY2hlYWJsZSgpOworCQkJfQorCQl9OworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZEluaGVyaXRhbmNlQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJbmV3IEphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgRW50aXR5Ml8wT3ZlcnJpZGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWUwYTNmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YUlkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdElkTWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5JZE1hcHBpbmdHZW5lcmF0aW9uMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIEphdmFJZE1hcHBpbmcyXzBDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEphdmFJZE1hcHBpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdElkTWFwcGluZ0NvbXBvc2l0ZTxJZE1hcHBpbmc+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5JZE1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JSWRNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIEphdmFJZE1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJCisJCS8vIENvbHVtbiB3aWRnZXRzCisJCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKKworCQlpbml0aWFsaXplVHlwZVBhbmUoY29udGFpbmVyKTsKKworCQkvLyBHZW5lcmF0aW9uIHBhbmUKKwkJbmV3IElkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGUodGhpcywgYWRkU3ViUGFuZShjb250YWluZXIsIDEwKSk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmMzYyOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw4MiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkFic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkRlcml2ZWRJZDJfMFBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IERlcml2ZWRJZDJfMFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUge0BsaW5rIEphdmFNYW55VG9PbmVNYXBwaW5nMl8wfQorICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgRGVyaXZlZElkMl8wUGFuZX0KKyAqIEBzZWUge0BsaW5rIE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9CisgKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBPcHRpb25hbENvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9CisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA+CisJZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8VD4KK3sKKwlwdWJsaWMgSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCQkKKwkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IERlcml2ZWRJZDJfMFBhbmUodGhpcywgYnVpbGREZXJpdmVkSWRIb2xkZXIoKSwgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZzJfMFBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nMl8wUGFuZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNTQ0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZzJfMFBhbmUuamF2YQpAQCAtMCwwICsxLDQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5qYXZhOworCitwdWJsaWMgY2xhc3MgSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBQYW5lCit7fQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE3NjQwZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IElkQ2xhc3NDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBNYXBwZWRTdXBlcmNsYXNzCisgKiBAc2VlIEJhc2VKYXZhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCisgKiBAc2VlIElkQ2xhc3NDb21wb3NpdGUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEphdmFNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8SmF2YU1hcHBlZFN1cGVyY2xhc3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBKYXZhTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsJCisJCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YU1hcHBlZFN1cGVyY2xhc3MsIEFjY2Vzc0hvbGRlcj4oCisJCQlnZXRTdWJqZWN0SG9sZGVyKCkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZWJkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcmRlcmluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3JkZXJpbmdDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUge0BsaW5rIEphdmFPbmVUb01hbnlNYXBwaW5nMl8wfQorICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZX0KKyAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgT3JkZXJpbmdDb21wb3NpdGV9CisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgSmF2YU9uZVRvTWFueU1hcHBpbmcyXzA+CisJZXh0ZW5kcyBBYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8VD4KK3sKKwlwdWJsaWMgSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCQkKKwkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCB0aGlzLmJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIHRoaXMuYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSwgdGhpcy5hZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZENhc2NhZGVIb2xkZXIoKSwgdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOworCQluZXcgT3JkZXJpbmdDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxPcnBoYW5SZW1vdmFibGUyXzA+IGJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhT25lVG9NYW55TWFwcGluZzJfMCwgT3JwaGFuUmVtb3ZhYmxlMl8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiAoKE9ycGhhblJlbW92YWxIb2xkZXIyXzApIHRoaXMuc3ViamVjdCkuZ2V0T3JwaGFuUmVtb3ZhbCgpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWIyMjhmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWxIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQWJzdHJhY3RPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5EZXJpdmVkSWQyXzBQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IERlcml2ZWRJZDJfMFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSB7QGxpbmsgSmF2YU9uZVRvT25lTWFwcGluZzJfMH0KKyAqIEBzZWUge0BsaW5rIFRhcmdldEVudGl0eUNvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIERlcml2ZWRJZDJfMFBhbmV9CisgKiBAc2VlIHtAbGluayBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9CisgKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBPcHRpb25hbENvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlfQorICovCitwdWJsaWMgY2xhc3MgSmF2YU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgSmF2YU9uZVRvT25lTWFwcGluZzJfMD4KKwlleHRlbmRzIEFic3RyYWN0T25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlPFQ+Cit7CisJcHVibGljIEphdmFPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCQorCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKwkJCisJCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgdGhpcy5hZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IERlcml2ZWRJZDJfMFBhbmUodGhpcywgdGhpcy5idWlsZERlcml2ZWRJZEhvbGRlcigpLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIHRoaXMuYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgdGhpcy5hZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIHRoaXMuYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSwgdGhpcy5hZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZENhc2NhZGVIb2xkZXIoKSwgIHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxPcnBoYW5SZW1vdmFibGUyXzA+IGJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhT25lVG9PbmVNYXBwaW5nMl8wLCBPcnBoYW5SZW1vdmFibGUyXzA+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBPcnBoYW5SZW1vdmFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuICgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgdGhpcy5zdWJqZWN0KS5nZXRPcnBoYW5SZW1vdmFsKCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nczJfMERldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2UyNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nczJfMERldGFpbHNQYWdlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIEVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UKKyAqLworcHVibGljIGNsYXNzIEVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2U8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYnVpbGRFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzMl8wQ29tcG9zaXRlKAorCQkJdGhpcywKKwkJCWNvbnRhaW5lcgorCQkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YjlkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqICBFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcgorICovCitwdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIKKwlleHRlbmRzIEFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFEZXRhaWxzUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIoKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnBhRGV0YWlsc1Byb3ZpZGVyIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gcHJvdmlkZXNEZXRhaWxzKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKKwkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5PUk1fWE1MXzJfMF9SRVNPVVJDRV9UWVBFKTsKKwl9CisJCisJcHVibGljIEpwYURldGFpbHNQYWdlPEVudGl0eU1hcHBpbmdzPiBidWlsZERldGFpbHNQYWdlKAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQkKKwkJcmV0dXJuIG5ldyBFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnMyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmODliNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzMl8wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5HZW5lcmF0b3JDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuR2VuZXJhdG9yQ29tcG9zaXRlLkdlbmVyYXRvckJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLlNlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzMl8wQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnMyXzBDb21wb3NpdGUgZXh0ZW5kcyBFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yczJfMENvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzMl8wQ29tcG9zaXRlKAorCQkJCQkJUGFuZTw/IGV4dGVuZHMgRW50aXR5TWFwcGluZ3M+IHBhcmVudFBhbmUsCisJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisJCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEdlbmVyYXRvckNvbXBvc2l0ZTxTZXF1ZW5jZUdlbmVyYXRvcj4gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyLAorCQkJR2VuZXJhdG9yQnVpbGRlcjxTZXF1ZW5jZUdlbmVyYXRvcj4gZ2VuZXJhdG9yQnVpbGRlcikgeworCisJCXJldHVybiBuZXcgU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUoCisJCQl0aGlzLAorCQkJc2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIsCisJCQlwYXJlbnQsCisJCQlnZW5lcmF0b3JCdWlsZGVyCisJCSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtQmFzaWNNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUJhc2ljTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZDhhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUJhc2ljTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEJhc2ljTWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBPcm1CYXNpY01hcHBpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEJhc2ljTWFwcGluZ0NvbXBvc2l0ZTxPcm1CYXNpY01hcHBpbmc+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGluazFfMU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkJhc2ljTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBPcm1CYXNpY01hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1CYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKworCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7CisKKwkJLy8gQWxpZ24gdGhlIHdpZGdldHMgdW5kZXIgdGhlIENvbHVtbkNvbXBvc2l0ZQorCQljb250YWluZXIgPSBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKTsKKworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybUJhc2ljTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhYjdlNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlPE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rMV8xT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QmFzaWNNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjFiOGJlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpwYTIuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24KKwlleHRlbmRzIEFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uPE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4KKwlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAorCQluZXcgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwgCisJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLCAKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsIAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXJldHVybiAoKE9ybVhtbFVpRmFjdG9yeTJfMCkgZmFjdG9yeSkuY3JlYXRlT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YTE5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSdzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBFbWJlZGRlZElkTWFwcGluZworICogQHNlZSBCYXNlSmF2YVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQorICoKKyAqIEB2ZXJzaW9uIDIuMgorICogQHNpbmNlIDIuMgorICovCitwdWJsaWMgY2xhc3MgT3JtRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxPcm1FbWJlZGRlZElkTWFwcGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmsxXzFPcm1FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkVtYmVkZGVkSWRNYXBwaW5nPC9jb2RlPgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCisJICovCisJcHVibGljIE9ybUVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOworCisJCW5ldyBFbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUoCisJCQl0aGlzLAorCQkJY29udGFpbmVyCisJCSk7CisJfQkKKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybUVtYmVkZGVkSWRNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDNlMDc3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmcyXzBPdmVycmlkZXNDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUgRW1iZWRkZWRNYXBwaW5nCisgKiBAc2VlIEJhc2VKYXZhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCisgKgorICogQHZlcnNpb24gMi4yCisgKiBAc2luY2UgMi4yCisgKi8KK3B1YmxpYyBjbGFzcyBPcm1FbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxPcm1FbWJlZGRlZE1hcHBpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5FbWJlZGRlZE1hcHBpbmc8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgT3JtRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOworCisJCW5ldyBFbWJlZGRlZE1hcHBpbmcyXzBPdmVycmlkZXNDb21wb3NpdGUoCisJCQl0aGlzLAorCQkJY29udGFpbmVyCisJCSk7CisJfQkKKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybUVtYmVkZGVkTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwkJCX0KKwkJfTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbnRpdHkyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3MDg4ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3JDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkVudGl0eU5hbWVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYWJsZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RPcm1FbnRpdHlDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUphdmFDbGFzc0Nob29zZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5DYWNoZWFibGUyXzBQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuR2VuZXJhdGlvbjJfMENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBPUk0gZW50aXR5IDIuMC4KKyAqCisgKiBAc2VlIE9ybUVudGl0eQorICogQHNlZSBFbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIE9ybUVudGl0eTJfMENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0T3JtRW50aXR5Q29tcG9zaXRlCit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1FbnRpdHlDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5Pcm1FbnRpdHk8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgT3JtRW50aXR5Ml8wQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmFsUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7CisJCQorCQluZXcgT3JtSmF2YUNsYXNzQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pLCBmYWxzZSk7CisJCW5ldyBUYWJsZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCQluZXcgRW50aXR5TmFtZUNvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IElkQ2xhc3NDb21wb3NpdGUodGhpcywgYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbiksIGZhbHNlKTsKKwkJbmV3IENhY2hlYWJsZTJfMFBhbmUodGhpcywgYnVpbGRDYWNoZWFibGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbikpOworCQluZXcgTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZWFibGUyXzA+IGJ1aWxkQ2FjaGVhYmxlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1FbnRpdHksIENhY2hlYWJsZTJfMD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBDYWNoZWFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldENhY2hlYWJsZSgpOworCQkJfQorCQl9OworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCW5ldyBFbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRHZW5lcmF0b3JzQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGdlbmVyYXRvckNvbnRhaW5lckhvbGRlcikgeworCQluZXcgR2VuZXJhdGlvbjJfMENvbXBvc2l0ZSh0aGlzLCBnZW5lcmF0b3JDb250YWluZXJIb2xkZXIsIGNvbnRhaW5lcik7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1JZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjZWI1NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIE9ybUlkTWFwcGluZzJfMENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlPE9ybUlkTWFwcGluZz4KK3sKKwlwdWJsaWMgT3JtSWRNYXBwaW5nMl8wQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQkKKwkJLy8gQ29sdW1uIHdpZGdldHMKKwkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOworCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOworCisJCWluaXRpYWxpemVUeXBlUGFuZShjb250YWluZXIpOworCisJCS8vIEdlbmVyYXRpb24gcGFuZQorCQluZXcgSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMTApKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1JZE1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmU1YmUzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1NYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcmRlcmluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSB7QGxpbmsgTWFueVRvTWFueU1hcHBpbmd9CisgKiBAc2VlIHtAbGluayBCYXNlSmF2YVVpRmFjdG9yeX0gLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKKyAqIEBzZWUge0BsaW5rIFRhcmdldEVudGl0eUNvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lfQorICogQHNlZSB7QGxpbmsgRmV0Y2hUeXBlQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIE9yZGVyaW5nQ29tcG9zaXRlfQorICoKKyAqIEB2ZXJzaW9uIDIuMgorICogQHNpbmNlIDIuMgorICovCitwdWJsaWMgY2xhc3MgT3JtTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPE9ybU1hbnlUb01hbnlNYXBwaW5nPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvTWFueU1hcHBpbmc8L2NvZGU+CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgT3JtTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1NYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7CisJCQorCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKKwkJbmV3IE9yZGVyaW5nQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtTWFueVRvTWFueU1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjYmU0MAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuRGVyaXZlZElkMl8wUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IERlcml2ZWRJZDJfMFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBBY2Nlc3NUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSB7QGxpbmsgT3JtTWFueVRvT25lTWFwcGluZzJfMH0KKyAqIEBzZWUge0BsaW5rIE9ybU1hbnlUb09uZU1hcHBpbmcyXzBVaVByb3ZpZGVyfQorICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgRGVyaXZlZElkMl8wUGFuZX0KKyAqIEBzZWUge0BsaW5rIE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9CisgKiBAc2VlIHtAbGluayBBY2Nlc3NUeXBlQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgRmV0Y2hUeXBlQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgT3B0aW9uYWxDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBDYXNjYWRlQ29tcG9zaXRlfQorICovCitwdWJsaWMgY2xhc3MgT3JtTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgT3JtTWFueVRvT25lTWFwcGluZzJfMD4KKwlleHRlbmRzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxUPgoreworCXB1YmxpYyBPcm1NYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCQkJQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQkKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7CisJCQorCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRGVyaXZlZElkMl8wUGFuZSh0aGlzLCBidWlsZERlcml2ZWRJZEhvbGRlcigpLCBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1NYW55VG9PbmVNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5ZjAwNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9yZGVyaW5nQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9ycGhhblJlbW92YWwyXzBDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgQWNjZXNzVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHNlZSBPbmVUb01hbnlNYXBwaW5nCisgKiBAc2VlIFRhcmdldEVudGl0eUNvbXBvc2l0ZQorICogQHNlZSBPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lCisgKiBAc2VlIEFjY2Vzc1R5cGVDb21wb3NpdGUKKyAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCisgKiBAc2VlIENhc2NhZGVDb21wb3NpdGUKKyAqIEBzZWUgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZQorICogQHNlZSBPcmRlcmluZ0NvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgT3JtT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgT3JtT25lVG9NYW55TWFwcGluZzJfMD4KKwlleHRlbmRzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxUPgoreworCXB1YmxpYyBPcm1PbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCisJCQlDb21wb3NpdGUgcGFyZW50LAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCisJCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgdGhpcy5hZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IE9uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgdGhpcy5idWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKKwkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIHRoaXMuYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSwgdGhpcy5hZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKKwkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZENhc2NhZGVIb2xkZXIoKSwgdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOworCQluZXcgT3JkZXJpbmdDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1PbmVUb01hbnlNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JwaGFuUmVtb3ZhYmxlMl8wPiBidWlsZE9ycGhhblJlbW92YWJsZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgT3JwaGFuUmVtb3ZhYmxlMl8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiAoKE9ycGhhblJlbW92YWxIb2xkZXIyXzApIHRoaXMuc3ViamVjdCkuZ2V0T3JwaGFuUmVtb3ZhbCgpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOWI1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWJsZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkRlcml2ZWRJZDJfMFBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRGVyaXZlZElkMl8wUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEFjY2Vzc1R5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IHwgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEBzZWUge0BsaW5rIE9ybU9uZVRvT25lTWFwcGluZzJfMH0KKyAqIEBzZWUge0BsaW5rIE9ybU9uZVRvT25lTWFwcGluZzJfMFVpUHJvdmlkZXJ9CisgKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9CisgKiBAc2VlIHtAbGluayBEZXJpdmVkSWQyXzBQYW5lfQorICogQHNlZSB7QGxpbmsgT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lfQorICogQHNlZSB7QGxpbmsgQWNjZXNzVHlwZUNvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIE9wdGlvbmFsQ29tcG9zaXRlfQorICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KKyAqIEBzZWUge0BsaW5rIE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGV9CisgKi8KK3B1YmxpYyBjbGFzcyBPcm1PbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8VCBleHRlbmRzIE9ybU9uZVRvT25lTWFwcGluZzJfMD4KKwlleHRlbmRzIEFic3RyYWN0T25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlPFQ+Cit7CisJcHVibGljIE9ybU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSgKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKwkJCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOworCQkKKwkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRGVyaXZlZElkMl8wUGFuZSh0aGlzLCB0aGlzLmJ1aWxkRGVyaXZlZElkSG9sZGVyKCksIHRoaXMuYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgdGhpcy5idWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKKwkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIHRoaXMuYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOworCQluZXcgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCksIHRoaXMuYWRkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSk7CisJCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRDYXNjYWRlSG9sZGVyKCksICB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7CisJfQorCQkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybU9uZVRvT25lTWFwcGluZywgQWNjZXNzSG9sZGVyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9ycGhhblJlbW92YWJsZTJfMD4gYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIE9ycGhhblJlbW92YWJsZTJfMD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIE9ycGhhblJlbW92YWJsZTJfMCBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldE9ycGhhblJlbW92YWwoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybVZlcnNpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybVZlcnNpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmYjg3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybVZlcnNpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIE9ybVZlcnNpb25NYXBwaW5nMl8wQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTxPcm1WZXJzaW9uTWFwcGluZz4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5WZXJzaW9uTWFwcGluZzwvY29kZT4KKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBPcm1WZXJzaW9uTWFwcGluZzJfMENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybVZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQkvLyBDb2x1bW4gd2lkZ2V0cworCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7CisJCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7CisKKwkJaW5pdGlhbGl6ZUNvbnZlcnNpb25QYW5lKGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtVmVyc2lvbk1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCQl9CisJCX07CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtWG1sMl8wVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybVhtbDJfMFVpRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NmY2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybVhtbDJfMFVpRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5vcm0uT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbnRpdHlVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuR2VuZXJpY09ybVhtbDJfMFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5zdHJ1Y3R1cmUuT3JtMl8wUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBPcm1YbWwyXzBVaURlZmluaXRpb24gZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgT3JtWG1sMl8wVWlEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBPcm1YbWwyXzBVaURlZmluaXRpb24oKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBPcm1YbWxVaUZhY3RvcnkgYnVpbGRPcm1YbWxVaUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY09ybVhtbDJfMFVpRmFjdG9yeSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwYVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKKwkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5PUk1fWE1MXzJfMF9SRVNPVVJDRV9UWVBFKTsKKwl9CisJCisJcHVibGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gT3JtMl8wUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmluc3RhbmNlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCQlkZWZpbml0aW9ucy5hZGQoT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJCisJCWRlZmluaXRpb25zLmFkZChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGFkZE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8T3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybUVudGl0eVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKKwkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CisJCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNjk1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuSnBhT3B0aW9uczJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9ucy5HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5HZW5lcmljUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVJIGZhY3RvcnkgcmVxdWlyZWQgdG8gc2hvdyB0aGUgaW5mb3JtYXRpb24KKyAqIHJlbGF0ZWQgdG8gYSBKUEEgbWFwcGluZyAodHlwZSBvciBhdHRyaWJ1dGUpLgorICoKKyAqIEBzZWUgR2VuZXJpY1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5CisgKgorICogQHZlcnNpb24gMS4wCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkgaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeQoreworCQorCS8vICoqKioqKioqKioqKioqKiogcGVyc2lzdGVuY2UgdW5pdCBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpwYVBhZ2VDb21wb3NpdGU+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZXMoCisJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCUFycmF5TGlzdDxKcGFQYWdlQ29tcG9zaXRlPiBwYWdlcyA9IG5ldyBBcnJheUxpc3Q8SnBhUGFnZUNvbXBvc2l0ZT4oNCk7CisJCQorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhQ29ubmVjdGlvbjJfMD4gY29ubmVjdGlvbjJfMEhvbGRlciA9IAorCQkJdGhpcy5idWlsZEpwYUNvbm5lY3Rpb24yXzBIb2xkZXIoc3ViamVjdEhvbGRlcik7CisJCVByb3BlcnR5VmFsdWVNb2RlbDxKcGFPcHRpb25zMl8wPiBvcHRpb25zMl8wSG9sZGVyID0gCisJCQl0aGlzLmJ1aWxkSnBhT3B0aW9uczJfMEhvbGRlcihzdWJqZWN0SG9sZGVyKTsKKwkJCisJCXBhZ2VzLmFkZChuZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7CisJCXBhZ2VzLmFkZChuZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWIoY29ubmVjdGlvbjJfMEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7CisJCXBhZ2VzLmFkZChuZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWIob3B0aW9uczJfMEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7CisJCXBhZ2VzLmFkZChuZXcgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKKworCQlyZXR1cm4gcGFnZXMubGlzdEl0ZXJhdG9yKCk7CisJfQorCisJLy8gKioqKioqKioqKiBwcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEpwYUNvbm5lY3Rpb24yXzA+IGJ1aWxkSnBhQ29ubmVjdGlvbjJfMEhvbGRlcigKKwkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyKSB7CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LCBKcGFDb25uZWN0aW9uMl8wPihzdWJqZWN0SG9sZGVyKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKcGFDb25uZWN0aW9uMl8wIHRyYW5zZm9ybV8oUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7CisJCQkJcmV0dXJuICgoUGVyc2lzdGVuY2VVbml0Ml8wKSB2YWx1ZSkuZ2V0Q29ubmVjdGlvbigpOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxKcGFPcHRpb25zMl8wPiBidWlsZEpwYU9wdGlvbnMyXzBIb2xkZXIoCisJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdCwgSnBhT3B0aW9uczJfMD4oc3ViamVjdEhvbGRlcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSnBhT3B0aW9uczJfMCB0cmFuc2Zvcm1fKFBlcnNpc3RlbmNlVW5pdCB2YWx1ZSkgeworCQkJCXJldHVybiAoKFBlcnNpc3RlbmNlVW5pdDJfMCkgdmFsdWUpLmdldE9wdGlvbnMoKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiMjQwYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5zdHJ1Y3R1cmUuUGVyc2lzdGVuY2UyXzBSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFBlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5IGJ1aWxkUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpYzJfMFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzVWkoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgeworCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRSk7CisJfQorCQorCXB1YmxpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcigpIHsKKwkJcmV0dXJuIFBlcnNpc3RlbmNlMl8wUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmluc3RhbmNlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWI4MTZiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcGFDb25uZWN0aW9uMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLkpwdDJfMFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SnBhQ29ubmVjdGlvbjJfMD4KK3sKKwlwdWJsaWMgQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUoUGFuZTxKcGFDb25uZWN0aW9uMl8wPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJY29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCisJCQljb250YWluZXIsCisJCQlKcHQyXzBVaU1lc3NhZ2VzLkNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0RhdGFiYXNlX0dyb3VwQm94CisJCSk7CisKKwkJbmV3IERhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJCW5ldyBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9EYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0RhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4ZDAzZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9EYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLkpwdDJfMFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworLyoqCisgKiAgRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIERhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxKcGFDb25uZWN0aW9uMl8wPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIERhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlKFBhbmU8SnBhQ29ubmVjdGlvbjJfMD4gcGFyZW50Q29tcG9zaXRlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRKdGFEYXRhU291cmNlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFN0cmluZz4odGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRKdGFEYXRhU291cmNlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5zdWJqZWN0LnNldEp0YURhdGFTb3VyY2UodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkSlRBRGF0YVNvdXJjZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUsIEJvb2xlYW4+KGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgeworCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5KVEE7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTm9uSnRhRGF0YVNvdXJjZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KGJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdC5OT05fSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROb25KdGFEYXRhU291cmNlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5zdWJqZWN0LnNldE5vbkp0YURhdGFTb3VyY2UodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTm9uSlRBRGF0YVNvdXJjZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUsIEJvb2xlYW4+KGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUgPT0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4oCisJCQkJYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgCisJCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZLCAKKwkJCQlQZXJzaXN0ZW5jZVVuaXQuREVGQVVMVF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUcmFuc2FjdGlvblR5cGUoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKcGFDb25uZWN0aW9uMl8wLCBQZXJzaXN0ZW5jZVVuaXQ+KGdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCQl9CisJCX07CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWludCBncm91cEJveE1hcmdpbiA9IHRoaXMuZ2V0R3JvdXBCb3hNYXJnaW4oKTsKKworCQljb250YWluZXIgPSB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pOworCisJCS8vIEpUQSBEYXRhIFNvdXJjZQorCQlMYWJlbCBqdGFMYWJlbCA9IHRoaXMuYWRkVW5tYW5hZ2VkTGFiZWwoY29udGFpbmVyLCBKcHQyXzBVaU1lc3NhZ2VzLkRhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlX2p0YURhdGFTb3VyY2VMYWJlbCk7CisJCVRleHQgdGV4dCA9IHRoaXMuYWRkVW5tYW5hZ2VkVGV4dChjb250YWluZXIsIHRoaXMuYnVpbGRKdGFEYXRhU291cmNlSG9sZGVyKCksIHRoaXMuZ2V0SGVscElEKCkpOworCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoY29udGFpbmVyLCBqdGFMYWJlbCwgdGV4dCwgdGhpcy5nZXRIZWxwSUQoKSk7CisKKwkJdGhpcy5pbnN0YWxsSlRBRGF0YVNvdXJjZUNvbnRyb2xFbmFibGVyKHRleHQsIGp0YUxhYmVsKTsKKworCQkvLyBOb24tSlRBIERhdGEgU291cmNlCisJCUxhYmVsIG5vbkp0YUxhYmVsID0gdGhpcy5hZGRVbm1hbmFnZWRMYWJlbChjb250YWluZXIsIEpwdDJfMFVpTWVzc2FnZXMuRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGVfbm9uSnRhRGF0YVNvdXJjZUxhYmVsKTsKKwkJVGV4dCBub25KdGFUZXh0ID0gdGhpcy5hZGRVbm1hbmFnZWRUZXh0KGNvbnRhaW5lciwgdGhpcy5idWlsZE5vbkp0YURhdGFTb3VyY2VIb2xkZXIoKSwgdGhpcy5nZXRIZWxwSUQoKSk7CisJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShjb250YWluZXIsIG5vbkp0YUxhYmVsLCBub25KdGFUZXh0LCB0aGlzLmdldEhlbHBJRCgpKTsKKworCQl0aGlzLmluc3RhbGxOb25KVEFEYXRhU291cmNlQ29udHJvbEVuYWJsZXIobm9uSnRhVGV4dCwgbm9uSnRhTGFiZWwpOworCX0KKworCXByaXZhdGUgdm9pZCBpbnN0YWxsSlRBRGF0YVNvdXJjZUNvbnRyb2xFbmFibGVyKFRleHQgdGV4dCwgTGFiZWwgbGFiZWwpIHsKKwkJU1dUVG9vbHMuY29udHJvbEVuYWJsZWRTdGF0ZSh0aGlzLmJ1aWxkSlRBRGF0YVNvdXJjZUhvbGRlcigpLCB0ZXh0LCBsYWJlbCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluc3RhbGxOb25KVEFEYXRhU291cmNlQ29udHJvbEVuYWJsZXIoVGV4dCB0ZXh0LCBMYWJlbCBsYWJlbCkgeworCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKHRoaXMuYnVpbGROb25KVEFEYXRhU291cmNlSG9sZGVyKCksIHRleHQsIGxhYmVsKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7CisJCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTjsJLy8gVE9ETyAtIFJldmlldyBmb3IgSlBBIDIuMAorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxOTZjMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5KcHQyXzBVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8SnBhQ29ubmVjdGlvbjJfMD4KK3sKKwlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGUoCisJCQkJCQkJCQkJCQkJCQlGb3JtUGFuZTxKcGFDb25uZWN0aW9uMl8wPiBzdWJqZWN0SG9sZGVyLAorCQkJCQkJCQkJCQkJCQkJQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIsIGZhbHNlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSB0aGlzLmdldEdyb3VwQm94TWFyZ2luKCkgKiAyOworCisJCWNvbnRhaW5lciA9IHRoaXMuYWRkU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCUpwdDJfMFVpTWVzc2FnZXMuR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGVfc2VjdGlvblRpdGxlLAorCQkJSnB0Ml8wVWlNZXNzYWdlcy5HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvbkNvbXBvc2l0ZV9zZWN0aW9uRGVzY3JpcHRpb24KKwkJKTsKKworCQlDb21wb3NpdGUgc3ViUGFuZSA9IHRoaXMuYWRkU3ViUGFuZSgKKwkJCWNvbnRhaW5lciwKKwkJCTAsIGdyb3VwQm94TWFyZ2luLCAxMCwgZ3JvdXBCb3hNYXJnaW4KKwkJKTsKKworCQluZXcgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlKHRoaXMsIHN1YlBhbmUpOworCisJCW5ldyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvblRhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uVGFiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyNDg0YwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvblRhYi5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5KcHQyXzBVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uVGFiCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvblRhYiBleHRlbmRzIEZvcm1QYW5lPEpwYUNvbm5lY3Rpb24yXzA+CisJaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCit7CisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+R2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWI8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWIoCisJCQkJCQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKcGFDb25uZWN0aW9uMl8wPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQluZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKwl9CisKKwkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7CisJCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7CisJCWxheW91dC5tYXJnaW5SaWdodCA9IDA7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKKwkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYWRkUGFuZShwYXJlbnQsIGxheW91dCk7CisJCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7CisJCXJldHVybiBjb250YWluZXI7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisJfQorCisJLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKKworCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgeworCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047CS8vIFRPRE8gLSBSZXZpZXcgZm9yIEpQQSAyLjAKKwl9CisJCisJcHVibGljIEltYWdlIGdldFBhZ2VJbWFnZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQYWdlVGV4dCgpIHsKKwkJcmV0dXJuIEpwdDJfMFVpTWVzc2FnZXMuR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWJfdGl0bGU7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTMwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwzMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuSnB0RGJQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLkpwdDJfMFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsdGVyZWRJdGVtc1NlbGVjdGlvbkRpYWxvZzsKKworLyoqCisgKiAgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SnBhQ29ubmVjdGlvbjJfMD4KK3sKKwkvKioKKwkgKiBUaGUgY29uc3RhbnQgSUQgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGlhbG9nIHNldHRpbmdzLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfU0VUVElOR1MgPSAib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuZGlhbG9ncy5Db25uZWN0aW9uRGlhbG9nIjsKKworCXB1YmxpYyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUoUGFuZTxKcGFDb25uZWN0aW9uMl8wPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUGFzc3dvcmRIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYUNvbm5lY3Rpb24yXzAsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEpwYUNvbm5lY3Rpb24yXzAuUEFTU1dPUkRfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBhc3N3b3JkKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5zdWJqZWN0LnNldFBhc3N3b3JkKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUG9wdWxhdGVGcm9tQ29ubmVjdGlvbkFjdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlwcm9tcHRDb25uZWN0aW9uKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXJsSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKcGFDb25uZWN0aW9uMl8wLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBKcGFDb25uZWN0aW9uMl8wLlVSTF9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VXJsKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5zdWJqZWN0LnNldFVybCh2YWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXNlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhQ29ubmVjdGlvbjJfMCwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgSnBhQ29ubmVjdGlvbjJfMC5VU0VSX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRVc2VyKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5zdWJqZWN0LnNldFVzZXIodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCS8vIFBvcHVsYXRlIGZyb20gQ29ubmVjdGlvbiBoeXBlcmxpbmsKKwkJdGhpcy5hZGRIeXBlcmxpbmsoCisJCQljb250YWluZXIsCisJCQkiUG9wdWxhdGUgZnJvbSBDb25uZWN0aW9uLi4uIiwKKwkJCXRoaXMuYnVpbGRQb3B1bGF0ZUZyb21Db25uZWN0aW9uQWN0aW9uKCkKKwkJKTsKKworCQkvLyBEcml2ZXIKKwkJbmV3IEpkYmNEcml2ZXJDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKKworCQkvLyBVcmwKKwkJdGhpcy5hZGRMYWJlbGVkVGV4dCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdDJfMFVpTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3VybExhYmVsLAorCQkJdGhpcy5idWlsZFVybEhvbGRlcigpCisJCSk7CisKKwkJLy8gVXNlcgorCQl0aGlzLmFkZExhYmVsZWRUZXh0KAorCQkJY29udGFpbmVyLAorCQkJSnB0Ml8wVWlNZXNzYWdlcy5KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfdXNlckxhYmVsLAorCQkJdGhpcy5idWlsZFVzZXJIb2xkZXIoKQorCQkpOworCisJCS8vIFBhc3N3b3JkCisJCXRoaXMuYWRkTGFiZWxlZFBhc3N3b3JkVGV4dCgKKwkJCWNvbnRhaW5lciwKKwkJCUpwdDJfMFVpTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3Bhc3N3b3JkTGFiZWwsCisJCQl0aGlzLmJ1aWxkUGFzc3dvcmRIb2xkZXIoKQorCQkpOworCX0KKworCXZvaWQgcHJvbXB0Q29ubmVjdGlvbigpIHsKKworCQlDb25uZWN0aW9uU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBDb25uZWN0aW9uU2VsZWN0aW9uRGlhbG9nKCk7CisKKwkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBkaWFsb2cuZ2V0UmVzdWx0KClbMF07CisJCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKG5hbWUpOworCisJCUpwYUNvbm5lY3Rpb24yXzAgY29ubmVjdGlvbiA9IGdldFN1YmplY3QoKTsKKwkJY29ubmVjdGlvbi5zZXRVcmwoKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVUkwoKSk7CisJCWNvbm5lY3Rpb24uc2V0VXNlcigoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVzZXJOYW1lKCkpOworCQljb25uZWN0aW9uLnNldFBhc3N3b3JkKChjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VXNlclBhc3N3b3JkKCkpOworCQljb25uZWN0aW9uLnNldERyaXZlcigoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldERyaXZlckNsYXNzTmFtZSgpKTsKKwl9CisKKwlDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgeworCQkvLyB3ZSBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgYW55IGNvbm5lY3Rpb24gcHJvZmlsZSBhbmQgc2ltcGx5CisJCS8vIHRha2UgdGhlIHNldHRpbmdzIGZyb20gaXQgKHVzZXIsIHBhc3N3b3JkLCBldGMuKSBhbmQgZ2l2ZSB0aGVtCisJCS8vIHRvIHRoZSBwZXJzaXN0ZW5jZSBjb25uZWN0aW9uLCBzbyB3ZSBnbworCQkvLyB0byB0aGUgZGIgcGx1Zy1pbiBkaXJlY3RseSB0byBnZXQgdGhlIGZhY3RvcnkKKwkJcmV0dXJuIEpwdERiUGx1Z2luLmluc3RhbmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7CisJfQorCisJLy8gYnJvYWRlbiBhY2Nlc3MgYSBiaXQKKwlTaGVsbCBnZXRTaGVsbF8oKSB7CisJCXJldHVybiB0aGlzLmdldFNoZWxsKCk7CisJfQorCisJLyoqCisJICogVGhpcyBkaWFsb2cgc2hvd3MgdGhlIGxpc3Qgb2YgcG9zc2libGUgY29ubmVjdGlvbiBuYW1lcyBhbmQgbGV0cyB0aGUgdXNlcgorCSAqIHRoZSBvcHRpb24gdG8gZmlsdGVyIHRoZW0gdXNpbmcgYSBzZWFyY2ggZmllbGQuCisJICovCisJcHJvdGVjdGVkIGNsYXNzIENvbm5lY3Rpb25TZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBGaWx0ZXJlZEl0ZW1zU2VsZWN0aW9uRGlhbG9nIHsKKworCQkvKioKKwkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwaW5nU2VsZWN0aW9uRGlhbG9nPC9jb2RlPi4KKwkJICovCisJCXByb3RlY3RlZCBDb25uZWN0aW9uU2VsZWN0aW9uRGlhbG9nKCkgeworCQkJc3VwZXIoSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLnRoaXMuZ2V0U2hlbGxfKCksIGZhbHNlKTsKKwkJCXRoaXMuc2V0TWVzc2FnZShKcHQyXzBVaU1lc3NhZ2VzLkpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX01lc3NhZ2UpOworCQkJdGhpcy5zZXRUaXRsZShKcHQyXzBVaU1lc3NhZ2VzLkpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX1RpdGxlKTsKKwkJCXRoaXMuc2V0TGlzdExhYmVsUHJvdmlkZXIodGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKSk7CisJCQl0aGlzLnNldERldGFpbHNMYWJlbFByb3ZpZGVyKHRoaXMuYnVpbGRMYWJlbFByb3ZpZGVyKCkpOworCQl9CisKKwkJcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKKwkJCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CisJCQkJCXJldHVybiAoZWxlbWVudCA9PSBudWxsKSA/ICIiIDogZWxlbWVudC50b1N0cmluZygpOworCQkJCX0KKwkJCX07CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRXh0ZW5kZWRDb250ZW50QXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgSXRlbXNGaWx0ZXIgY3JlYXRlRmlsdGVyKCkgeworCQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uSXRlbXNGaWx0ZXIoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGVudFByb3ZpZGVyKEFic3RyYWN0Q29udGVudFByb3ZpZGVyIHByb3ZpZGVyLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1zRmlsdGVyIGl0ZW1zRmlsdGVyLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCQltb25pdG9yLmJlZ2luVGFzayhudWxsLCAtMSk7CisKKwkJCXRyeSB7CisJCQkJLy8gQWRkIHRoZSBjb25uZWN0aW9uIG5hbWVzIHRvIHRoZSBkaWFsb2cKKwkJCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZU5hbWVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJCQlwcm92aWRlci5hZGQoc3RyZWFtLm5leHQoKSwgaXRlbXNGaWx0ZXIpOworCQkJCX0KKwkJCX0KKwkJCWZpbmFsbHkgeworCQkJCW1vbml0b3IuZG9uZSgpOworCQkJfQorCQl9CisKKwkJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKSB7CisJCQlyZXR1cm4gSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLnRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuY29ubmVjdGlvblByb2ZpbGVOYW1lcygpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7CisKKwkJCUlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IEpwdFVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKKwkJCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGRpYWxvZ1NldHRpbmdzLmdldFNlY3Rpb24oRElBTE9HX1NFVFRJTkdTKTsKKworCQkJaWYgKHNldHRpbmdzID09IG51bGwpIHsKKwkJCQlzZXR0aW5ncyA9IGRpYWxvZ1NldHRpbmdzLmFkZE5ld1NlY3Rpb24oRElBTE9HX1NFVFRJTkdTKTsKKwkJCX0KKwkJCXJldHVybiBzZXR0aW5nczsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKE9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxTdHJpbmc+IGdldEl0ZW1zQ29tcGFyYXRvcigpIHsKKwkJCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgeworCQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgaXRlbTEsIFN0cmluZyBpdGVtMikgeworCQkJCQlyZXR1cm4gaXRlbTEuY29tcGFyZVRvKGl0ZW0yKTsKKwkJCQl9CisJCQl9OworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlSXRlbShPYmplY3QgaXRlbSkgeworCisJCQlpZiAoaXRlbSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0VWlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiIiwgbnVsbCk7CisJCQl9CisJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJfQorCisJCS8qKgorCQkgKiBDcmVhdGUgdGhlIGZpbHRlciByZXNwb25zaWJsZSB0byByZW1vdmUgYW55IGNvbm5lY3Rpb24gbmFtZSBiYXNlZCBvbgorCQkgKiB0aGUgcGF0dGVybiBlbnRlcmVkIGluIHRoZSB0ZXh0IGZpZWxkLgorCQkgKi8KKwkJcHJpdmF0ZSBjbGFzcyBDb25uZWN0aW9uSXRlbXNGaWx0ZXIgZXh0ZW5kcyBJdGVtc0ZpbHRlciB7CisKKwkJCS8qKgorCQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db25uZWN0aW9uSXRlbXNGaWx0ZXI8L2NvZGU+LgorCQkJICovCisJCQlDb25uZWN0aW9uSXRlbXNGaWx0ZXIoKSB7CisKKwkJCQlzdXBlcigpOworCisJCQkJLy8gTWFrZSBzdXJlIHRoYXQgaWYgdGhlIHBhdHRlcm4gaXMgZW1wdHksIHdlIHNwZWNpZnkgKiBpbiBvcmRlcgorCQkJCS8vIHRvIHNob3cgYWxsIHRoZSBtYXBwaW5nIHR5cGVzCisJCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0UGF0dGVybigpKSkgeworCQkJCQlwYXR0ZXJuTWF0Y2hlci5zZXRQYXR0ZXJuKCIqIik7CisJCQkJfQorCQkJfQorCisJCQkvKgorCQkJICogKG5vbi1KYXZhZG9jKQorCQkJICovCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGlzQ29uc2lzdGVudEl0ZW0oT2JqZWN0IGl0ZW0pIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIChub24tSmF2YWRvYykKKwkJCSAqLworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBtYXRjaEl0ZW0oT2JqZWN0IGl0ZW0pIHsKKwkJCQlyZXR1cm4gbWF0Y2hlcyhpdGVtLnRvU3RyaW5nKCkpOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNEcml2ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjRHJpdmVyQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTllZDI3OAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjRHJpdmVyQ29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuSnB0Ml8wVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgSmRiY0RyaXZlckNvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgSmRiY0RyaXZlckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SnBhQ29ubmVjdGlvbjJfMD4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNEcml2ZXJDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBKZGJjRHJpdmVyQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEpwYUNvbm5lY3Rpb24yXzA+IHBhcmVudFBhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisKKwlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8SnBhQ29ubmVjdGlvbjJfMD4gaW5pdGlhbGl6ZUNsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPEpwYUNvbm5lY3Rpb24yXzA+KHRoaXMsIGNvbnRhaW5lcikgeworCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKcGFDb25uZWN0aW9uMl8wLCBTdHJpbmc+KAorCQkJCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBKcGFDb25uZWN0aW9uMl8wLkRSSVZFUl9QUk9QRVJUWSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RHJpdmVyKCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCisJCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgeworCQkJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQkJCX0KKwkJCQkJCXRoaXMuc3ViamVjdC5zZXREcml2ZXIodmFsdWUpOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RHJpdmVyKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7CisJCQkJcmV0dXJuIEpwdDJfMFVpTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX2RyaXZlckxhYmVsOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXREcml2ZXIoY2xhc3NOYW1lKTsJCQkJCisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dUeXBlQ3JlYXRpb24oKSB7CisJCQkJLy9Eb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGFsbG93IHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBEcml2ZXIgY2xhc3MKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX07CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCXRoaXMuaW5pdGlhbGl6ZUNsYXNzQ2hvb3Nlcihjb250YWluZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjMzBiYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5KcHQyXzBVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SnBhQ29ubmVjdGlvbjJfMD4KK3sKKwlwdWJsaWMgSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUoUGFuZTxKcGFDb25uZWN0aW9uMl8wPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUsIEJvb2xlYW4+KGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgeworCQkJCXJldHVybiB2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUw7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPiBidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+KAorCQkJYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgCisJCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFksIAorCQkJUGVyc2lzdGVuY2VVbml0LkRFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VHJhbnNhY3Rpb25UeXBlKCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhQ29ubmVjdGlvbjJfMCwgUGVyc2lzdGVuY2VVbml0PihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpOworCQkJfQorCQl9OworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWNvbnRhaW5lciA9IGFkZFRpdGxlZEdyb3VwKAorCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDEwKSwKKwkJCUpwdDJfMFVpTWVzc2FnZXMuSmRiY1Byb3BlcnRpZXNDb21wb3NpdGVfSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzX0dyb3VwQm94CisJCSk7CisKKwkJbmV3IEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCisJCXRoaXMuaW5zdGFsbFBhbmVFbmFibGVyKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lRW5hYmxlcigpIHsKKwkJbmV3IFBhbmVFbmFibGVyKGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSwgdGhpcyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9UcmFuc2FjdGlvblR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9UcmFuc2FjdGlvblR5cGVDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzNmMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL1RyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuSnB0Ml8wVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqICBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEpwYUNvbm5lY3Rpb24yXzA+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UcmFuc2FjdGlvblR5cGVDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudAorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlKAorCQkJCQlGb3JtUGFuZTw/IGV4dGVuZHMgSnBhQ29ubmVjdGlvbjJfMD4gcGFyZW50Q29tcG9zaXRlLAorCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIoIHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IGJ1aWxkVHJhbnNhY3Rpb25UeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4odGhpcywgCisJCQkJCQkJCQkJCXRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgCisJCQkJCQkJCQkJCWNvbnRhaW5lcikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpOworCQkJCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbmNlVW5pdC5ERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVbXSBnZXRDaG9pY2VzKCkgeworCQkJCXJldHVybiBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUudmFsdWVzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7CisJCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRUcmFuc2FjdGlvblR5cGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7CisJCQkJcmV0dXJuIHRoaXMuYnVpbGREaXNwbGF5U3RyaW5nKEpwdDJfMFVpTWVzc2FnZXMuY2xhc3MsIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7CisJCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKHZhbHVlKTsKKworCQkJCWlmICh2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUwpIHsKKwkJCQkJY2xlYXJKVEFQcm9wZXJ0aWVzKCk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQljbGVhclJlc291cmNlTG9jYWxQcm9wZXJ0aWVzKCk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYUNvbm5lY3Rpb24yXzAsIFBlcnNpc3RlbmNlVW5pdD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgdm9pZCBjbGVhckpUQVByb3BlcnRpZXMoKSB7CisJCXRoaXMuZ2V0U3ViamVjdCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLnNldEp0YURhdGFTb3VyY2UobnVsbCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNsZWFyUmVzb3VyY2VMb2NhbFByb3BlcnRpZXMoKSB7CisJCUpwYUNvbm5lY3Rpb24yXzAgY29ubmVjdGlvbiA9IHRoaXMuZ2V0U3ViamVjdCgpOworCQljb25uZWN0aW9uLmdldFBlcnNpc3RlbmNlVW5pdCgpLnNldE5vbkp0YURhdGFTb3VyY2UobnVsbCk7CisJCWNvbm5lY3Rpb24uc2V0RHJpdmVyKG51bGwpOworCQljb25uZWN0aW9uLnNldFVybChudWxsKTsKKwkJY29ubmVjdGlvbi5zZXRVc2VyKG51bGwpOworCQljb25uZWN0aW9uLnNldFBhc3N3b3JkKG51bGwpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoIENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlKcHQyXzBVaU1lc3NhZ2VzLlRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZV90cmFuc2FjdGlvblR5cGVMYWJlbCwKKwkJCXRoaXMuYnVpbGRUcmFuc2FjdGlvblR5cGVDb21ibyggY29udGFpbmVyKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OCS8vIFRPRE8gLSBSZXZpZXcgZm9yIEpQQSAyLjAKKwkJKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMmMyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkpwYU9wdGlvbnMyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuSnB0Ml8wVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqICBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc0NvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxKcGFPcHRpb25zMl8wPgoreworCXB1YmxpYyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc0NvbXBvc2l0ZSgKKwkJCQkJRm9ybVBhbmU8SnBhT3B0aW9uczJfMD4gc3ViamVjdEhvbGRlciwKKwkJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCQkJCQkKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7CisJCXRoaXMuaW5pdGlhbGl6ZU1pc2NlbGxhbmVvdXNQYW5lKHBhcmVudCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVNaXNjZWxsYW5lb3VzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CQorCQkKKwkJdGhpcy51cGRhdGVHcmlkRGF0YShjb250YWluZXIpOworCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lci5nZXRQYXJlbnQoKSk7CisJCQorCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdGhpcy5hZGRTZWN0aW9uKGNvbnRhaW5lciwgCisJCQlKcHQyXzBVaU1lc3NhZ2VzLkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zQ29tcG9zaXRlX21pc2NlbGxhbmVvdXNTZWN0aW9uVGl0bGUsCisJCQlKcHQyXzBVaU1lc3NhZ2VzLkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zQ29tcG9zaXRlX21pc2NlbGxhbmVvdXNTZWN0aW9uRGVzY3JpcHRpb24pOworCQkKKwkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUpOworCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSk7CisKKwkJbmV3IExvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7CisJCW5ldyBRdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKKwkJbmV3IFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7CisKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOworCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zVGFiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkZThjZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYi5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5vcHRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuSnBhT3B0aW9uczJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLkpwdDJfMFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWIKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zVGFiIGV4dGVuZHMgRm9ybVBhbmU8SnBhT3B0aW9uczJfMD4KKwlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKK3sKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYjwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cworCSAqLworCXB1YmxpYyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYigKKwkJCQkJCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEpwYU9wdGlvbnMyXzA+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7CisJCW5ldyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc0NvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOworCisJfQorCisJLy8gKioqKioqKioqKiBMYXlvdXQgKioqKioqKioqKgorCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCWxheW91dC5tYXJnaW5Ub3AgPSAwOworCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7CisJCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOworCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7CisJCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0aGlzLmFkZFBhbmUocGFyZW50LCBsYXlvdXQpOworCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIpOworCQlyZXR1cm4gY29udGFpbmVyOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7CisJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCX0KKworCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKKwkJcmV0dXJuIG51bGw7CQkJCQkJLy8gVE9ETyAtIFJldmlldyBmb3IgSlBBIDIuMAorCX0KKwkKKwlwdWJsaWMgSW1hZ2UgZ2V0UGFnZUltYWdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgeworCQlyZXR1cm4gSnB0Ml8wVWlNZXNzYWdlcy5HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYl90aXRsZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NTljMjQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkpwYU9wdGlvbnMyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuSnB0Ml8wVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5JbnRlZ2VyQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIExvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPEpwYU9wdGlvbnMyXzA+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBMb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZSgKKwkJCQkJRm9ybVBhbmU8PyBleHRlbmRzIEpwYU9wdGlvbnMyXzA+IHBhcmVudENvbXBvc2l0ZSwKKwkJCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJdGhpcy5hZGRMb2NrVGltZW91dENvbWJvKHBhcmVudCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBhZGRMb2NrVGltZW91dENvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJbmV3IEludGVnZXJDb21ibzxKcGFPcHRpb25zMl8wPih0aGlzLCBwYXJlbnQpIHsKKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gSnB0Ml8wVWlNZXNzYWdlcy5Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9sb2NrVGltZW91dExhYmVsOworCQkJfQorCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7CisJCQkJcmV0dXJuIG51bGw7CQkvLyBUT0RPCisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7CisJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhT3B0aW9uczJfMCwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0TG9ja1RpbWVvdXQoKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYU9wdGlvbnMyXzAsIEludGVnZXI+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBKcGFPcHRpb25zMl8wLkxPQ0tfVElNRU9VVF9QUk9QRVJUWSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldExvY2tUaW1lb3V0KCk7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKKwkJCQkJCXRoaXMuc3ViamVjdC5zZXRMb2NrVGltZW91dCh2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2MjkyZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9RdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkpwYU9wdGlvbnMyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuSnB0Ml8wVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5JbnRlZ2VyQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIFF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8SnBhT3B0aW9uczJfMD4KK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBRdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUoCisJCQkJCUZvcm1QYW5lPD8gZXh0ZW5kcyBKcGFPcHRpb25zMl8wPiBwYXJlbnRDb21wb3NpdGUsCisJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7CisJCXRoaXMuYWRkUXVlcnlUaW1lb3V0Q29tYm8ocGFyZW50KTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZFF1ZXJ5VGltZW91dENvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJbmV3IEludGVnZXJDb21ibzxKcGFPcHRpb25zMl8wPih0aGlzLCBwYXJlbnQpIHsKKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKKwkJCQlyZXR1cm4gSnB0Ml8wVWlNZXNzYWdlcy5RdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGVfcXVlcnlUaW1lb3V0TGFiZWw7CisJCQl9CisJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKKwkJCQlyZXR1cm4gbnVsbDsJCS8vIFRPRE8KKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKcGFPcHRpb25zMl8wLCBJbnRlZ2VyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7CisJCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRRdWVyeVRpbWVvdXQoKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgeworCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYU9wdGlvbnMyXzAsIEludGVnZXI+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBKcGFPcHRpb25zMl8wLlFVRVJZX1RJTUVPVVRfUFJPUEVSVFkpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRRdWVyeVRpbWVvdXQoKTsKKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgeworCQkJCQkJdGhpcy5zdWJqZWN0LnNldFF1ZXJ5VGltZW91dCh2YWx1ZSk7CisJCQkJCX0KKwkJCQl9OworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjMjlmMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuSnB0Ml8wVWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogIFNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8UGVyc2lzdGVuY2VVbml0Ml8wPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgorCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBTaGFyZWRDYWNoZU1vZGVDb21wb3NpdGUoCisJCQkJCUZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCisJCQkgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0Ml8wPiBzdWJqZWN0SG9sZGVyLAorCQkJICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgeworCQkKKwkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJcGFyZW50LAorCQkJSnB0Ml8wVWlNZXNzYWdlcy5TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGVfc2hhcmVkQ2FjaGVNb2RlTGFiZWwsCisJCQl0aGlzLmFkZFNoYXJlZENhY2hlTW9kZUNvbWJvKHBhcmVudCksCisJCQludWxsCQkJLy8gVE9ETworCQkpOworCX0KKwkKKwlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0Ml8wLCBTaGFyZWRDYWNoZU1vZGU+IGFkZFNoYXJlZENhY2hlTW9kZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCisJCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQyXzAsIFNoYXJlZENhY2hlTW9kZT4odGhpcywgdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIHBhcmVudCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisJCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKKwkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXQyXzAuU1BFQ0lGSUVEX1NIQVJFRF9DQUNIRV9NT0RFX1BST1BFUlRZKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU2hhcmVkQ2FjaGVNb2RlW10gZ2V0Q2hvaWNlcygpIHsKKwkJCQlyZXR1cm4gU2hhcmVkQ2FjaGVNb2RlLnZhbHVlcygpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU2hhcmVkQ2FjaGVNb2RlIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFNoYXJlZENhY2hlTW9kZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhTaGFyZWRDYWNoZU1vZGUgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoSnB0Ml8wVWlNZXNzYWdlcy5jbGFzcywgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU2hhcmVkQ2FjaGVNb2RlIGdldFZhbHVlKCkgeworCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTaGFyZWRDYWNoZU1vZGUgdmFsdWUpIHsKKwkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUodmFsdWUpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3NDBkZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuSnBhT3B0aW9uczJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5KcHQyXzBVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkZvcm1QYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqICBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZQorICovCitwdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxKcGFPcHRpb25zMl8wPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmFsaWRhdGlvbkdyb3VwQ29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlKAorCQkJCQlGb3JtUGFuZTw/IGV4dGVuZHMgSnBhT3B0aW9uczJfMD4gcGFyZW50Q29tcG9zaXRlLAorCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgeworCisJCS8vIFNoYXJlZENhY2hlTW9kZQorCQluZXcgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXQyXzBIb2xkZXIoKSwgcGFyZW50KTsKKworCQkvLyBWYWxpZGF0aW9uTW9kZQorCQluZXcgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpLCBwYXJlbnQpOworCQkKKwkJLy8gR3JvdXBQcmVQZXJzaXN0CisJCXRoaXMuYWRkTGFiZWxlZFRleHQoCisJCQlwYXJlbnQsCisJCQlKcHQyXzBVaU1lc3NhZ2VzLlZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlUGVyc2lzdExhYmVsLAorCQkJdGhpcy5idWlsZFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RIb2xkZXIoKQorCQkpOworCisJCS8vIFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZQorCQl0aGlzLmFkZExhYmVsZWRUZXh0KAorCQkJcGFyZW50LAorCQkJSnB0Ml8wVWlNZXNzYWdlcy5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9ncm91cFByZVVwZGF0ZUxhYmVsLAorCQkJdGhpcy5idWlsZFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUhvbGRlcigpCisJCSk7CisKKwkJLy8gVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlCisJCXRoaXMuYWRkTGFiZWxlZFRleHQoCisJCQlwYXJlbnQsCisJCQlKcHQyXzBVaU1lc3NhZ2VzLlZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlUmVtb3ZlTGFiZWwsCisJCQl0aGlzLmJ1aWxkVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlSG9sZGVyKCkKKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0Ml8wPiBidWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhT3B0aW9uczJfMCwgUGVyc2lzdGVuY2VVbml0Ml8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0Ml8wIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0Ml8wKSB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhT3B0aW9uczJfMCwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgeworCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQl9CisJCQkJdGhpcy5zdWJqZWN0LnNldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhT3B0aW9uczJfMCwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgeworCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJfQorCQkJCXRoaXMuc3ViamVjdC5zZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUodmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhT3B0aW9uczJfMCwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgeworCQkJCQl2YWx1ZSA9IG51bGw7CisJCQkJfQorCQkJCXRoaXMuc3ViamVjdC5zZXRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUodmFsdWUpOworCQkJfQorCQl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZWUzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5WYWxpZGF0aW9uTW9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5KcHQyXzBVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiAgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUKKyAqLworcHVibGljIGNsYXNzIFZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlIGV4dGVuZHMgRm9ybVBhbmU8UGVyc2lzdGVuY2VVbml0Ml8wPgoreworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmFsaWRhdGlvbk1vZGVDb21wb3NpdGU8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCisJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIFZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlKAorCQkJCQlGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAorCQkJICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdDJfMD4gc3ViamVjdEhvbGRlciwKKwkJCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCisJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCXBhcmVudCwKKwkJCUpwdDJfMFVpTWVzc2FnZXMuVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfdmFsaWRhdGlvbk1vZGVMYWJlbCwKKwkJCXRoaXMuYWRkVmFsaWRhdGlvbk1vZGVDb21ibyhwYXJlbnQpLAorCQkJbnVsbAkJCS8vIFRPRE8KKwkJKTsKKwl9CisJCisJcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPFBlcnNpc3RlbmNlVW5pdDJfMCwgVmFsaWRhdGlvbk1vZGU+IGFkZFZhbGlkYXRpb25Nb2RlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgeworCQkKKwkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPFBlcnNpc3RlbmNlVW5pdDJfMCwgVmFsaWRhdGlvbk1vZGU+KHRoaXMsIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBwYXJlbnQpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgeworCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7CisJCQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVuY2VVbml0Ml8wLlNQRUNJRklFRF9WQUxJREFUSU9OX01PREVfUFJPUEVSVFkpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBWYWxpZGF0aW9uTW9kZVtdIGdldENob2ljZXMoKSB7CisJCQkJcmV0dXJuIFZhbGlkYXRpb25Nb2RlLnZhbHVlcygpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgVmFsaWRhdGlvbk1vZGUgZ2V0RGVmYXVsdFZhbHVlKCkgeworCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0VmFsaWRhdGlvbk1vZGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoVmFsaWRhdGlvbk1vZGUgdmFsdWUpIHsKKwkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoSnB0Ml8wVWlNZXNzYWdlcy5jbGFzcywgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUudGhpcywgdmFsdWUpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBWYWxpZGF0aW9uTW9kZSBnZXRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShWYWxpZGF0aW9uTW9kZSB2YWx1ZSkgeworCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFZhbGlkYXRpb25Nb2RlKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpYzJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpYzJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyNWNlMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIucGxhdGZvcm0uZ2VuZXJpYzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuanBhMi5HZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNKcGFQbGF0Zm9ybVVpOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNOYXZpZ2F0b3JQcm92aWRlcjsKKworcHVibGljIGNsYXNzIEdlbmVyaWMyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeSBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWlGYWN0b3J5Cit7CisKKwkvKioKKwkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50CisJICovCisJcHVibGljIEdlbmVyaWMyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgSnBhUGxhdGZvcm1VaSBidWlsZEpwYVBsYXRmb3JtVWkoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0pwYVBsYXRmb3JtVWkoCisJCQluZXcgR2VuZXJpY05hdmlnYXRvclByb3ZpZGVyKCksCisJCQlHZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmluc3RhbmNlKCkKKwkJKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3N0cnVjdHVyZS9Pcm0yXzBSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvc3RydWN0dXJlL09ybTJfMFJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5M2IxMGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qcGEyL3N0cnVjdHVyZS9Pcm0yXzBSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpwYTIuc3RydWN0dXJlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZS5Pcm1JdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlLk9ybUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKKworcHVibGljIGNsYXNzIE9ybTJfMFJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcgorCWltcGxlbWVudHMgSnBhU3RydWN0dXJlUHJvdmlkZXIKK3sKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFTdHJ1Y3R1cmVQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBPcm0yXzBSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIE9ybTJfMFJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBnZXRUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgT3JtSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsKKwl9CisJCisJcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBnZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvanBhMi9zdHJ1Y3R1cmUvUGVyc2lzdGVuY2UyXzBSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvc3RydWN0dXJlL1BlcnNpc3RlbmNlMl8wUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyM2I1ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pwYTIvc3RydWN0dXJlL1BlcnNpc3RlbmNlMl8wUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qcGEyLnN0cnVjdHVyZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlLlBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2UyXzBSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIKKwlpbXBsZW1lbnRzIEpwYVN0cnVjdHVyZVByb3ZpZGVyCit7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhU3RydWN0dXJlUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgUGVyc2lzdGVuY2UyXzBSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKTsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJCisJLyoqCisJICogRW5mb3JjZSBzaW5nZWx0b24gdXNhZ2UKKwkgKi8KKwlwcml2YXRlIFBlcnNpc3RlbmNlMl8wUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkKKwlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpIHsKKwkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7CisJfQorCQorCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKaW5kZXggZDgzZTc4YS4uMzBhMWU0NCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMTMgKzksMTggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnM7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKIAogLyoqCiAgKiBXcmFwIGFub3RoZXIgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBTV1QKICAqIFVJIHRocmVhZC4KKyAqIEZvcndhcmQgKmV2ZXJ5KiBldmVudCBhc3luY2hyb25vdXNseSB2aWEgdGhlIFVJIHRocmVhZCBzbyB0aGUgbGlzdGVuZXIKKyAqIHJlY2VpdmVzIGluIHRoZSBzYW1lIG9yZGVyIHRoZXkgd2VyZSBnZW5lcmF0ZWQuCiAgKi8KIHB1YmxpYyBjbGFzcyBTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyCiAJaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIKQEAgLTMwLDcwICszNSw1NCBAQAogCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7CiAJfQogCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdVSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwotCQl9CisJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKKwkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGV2ZW50KSk7CiAJfQogCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ1VJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9CisJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgeworCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShldmVudCkpOwogCX0KIAotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ1VJVGhyZWFkKCkpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQorCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7CisJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdVSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KKwkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShldmVudCkpOwogCX0KIAotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKIAkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJCQlTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQiOworCQkJCXJldHVybiAiaXRlbXMgYWRkZWQiOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX07CiAJfQogCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgeworCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKIAkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJCQlTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7CiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZW1vdmVkIjsKKwkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQiOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX07CiAJfQogCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKIAkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJCQlTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWRfKGV2ZW50KTsKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2xlYXJlZCI7CisJCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNsZWFyZWQiOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX07CiAJfQpAQCAtMTA1LDE1ICs5NCwxMSBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjaGFuZ2VkIjsKKwkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfTsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdVSVRocmVhZCgpIHsKLQkJcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGw7Ci0JfQotCiAJLyoqCiAJICogRGlzcGxheSNhc3luY0V4ZWMoUnVubmFibGUpIHNlZW1zIHRvIHdvcmsgT0s7CiAJICogYnV0IHVzaW5nICNzeW5jRXhlYyhSdW5uYWJsZSkgY2FuIHNvbXRpbWVzIG1ha2UgdGhpbmdzCkBAIC0xMjQsMTUgKzEwOSwxNSBAQAogLy8JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKHIpOwogCX0KIAotCXZvaWQgaXRlbXNBZGRlZF8oQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJdm9pZCBpdGVtc0FkZGVkXyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKIAkJdGhpcy5saXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKIAl9CiAKLQl2b2lkIGl0ZW1zUmVtb3ZlZF8oQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJdm9pZCBpdGVtc1JlbW92ZWRfKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewogCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7CiAJfQogCi0Jdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZF8oQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZF8oQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKIAkJdGhpcy5saXN0ZW5lci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7CiAJfQogCkBAIC0xNDIsNyArMTI3LDcgQEAKIAogCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU1dUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAiKSI7CisJCXJldHVybiAiU1dUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjFiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMjk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ2F0YWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5EYXRhYmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRm9yZWlnbktleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TZXF1ZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKKworLyoqCisgKiBXcmFwIGFub3RoZXIgY29ubmVjdGlvbiBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIFNXVAorICogVUkgdGhyZWFkLgorICogRm9yd2FyZCAqZXZlcnkqIGV2ZW50IGFzeW5jaHJvbm91c2x5IHZpYSB0aGUgVUkgdGhyZWFkIHNvIHRoZSBsaXN0ZW5lcgorICogcmVjZWl2ZXMgaW4gdGhlIHNhbWUgb3JkZXIgdGhleSB3ZXJlIGdlbmVyYXRlZC4KKyAqLworcHVibGljIGNsYXNzIFNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIKKwlpbXBsZW1lbnRzIENvbm5lY3Rpb25MaXN0ZW5lcgoreworCisJcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7CisKKwlwdWJsaWMgU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc3VwZXIoKTsKKwkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgeworCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRPcGVuZWRSdW5uYWJsZShwcm9maWxlKSk7CisJfQorCisJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgeworCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRNb2RpZmllZFJ1bm5hYmxlKHByb2ZpbGUpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgeworCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRPa1RvQ2xvc2VSdW5uYWJsZShwcm9maWxlKSk7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7CisJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEFib3V0VG9DbG9zZVJ1bm5hYmxlKHByb2ZpbGUpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgeworCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRDbG9zZWRSdW5uYWJsZShwcm9maWxlKSk7CisJfQorCisJcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIERhdGFiYXNlIGRhdGFiYXNlKSB7CisJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZERhdGFiYXNlQ2hhbmdlZFJ1bm5hYmxlKHByb2ZpbGUsIGRhdGFiYXNlKSk7CisJfQorCisJcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ2F0YWxvZyBjYXRhbG9nKSB7CisJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZENhdGFsb2dDaGFuZ2VkUnVubmFibGUocHJvZmlsZSwgY2F0YWxvZykpOworCX0KKworCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2NoZW1hIHNjaGVtYSkgeworCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRTY2hlbWFDaGFuZ2VkUnVubmFibGUocHJvZmlsZSwgc2NoZW1hKSk7CisJfQorCisJcHVibGljIHZvaWQgc2VxdWVuY2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNlcXVlbmNlIHNlcXVlbmNlKSB7CisJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFNlcXVlbmNlQ2hhbmdlZFJ1bm5hYmxlKHByb2ZpbGUsIHNlcXVlbmNlKSk7CisJfQorCisJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFRhYmxlIHRhYmxlKSB7CisJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFRhYmxlQ2hhbmdlZFJ1bm5hYmxlKHByb2ZpbGUsIHRhYmxlKSk7CisJfQorCisJcHVibGljIHZvaWQgY29sdW1uQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDb2x1bW4gY29sdW1uKSB7CisJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZENvbHVtbkNoYW5nZWRSdW5uYWJsZShwcm9maWxlLCBjb2x1bW4pKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBmb3JlaWduS2V5Q2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKKwkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkRm9yZWlnbktleUNoYW5nZWRSdW5uYWJsZShwcm9maWxlLCBmb3JlaWduS2V5KSk7CisJfQorCisJcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE9wZW5lZFJ1bm5hYmxlKGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKKwkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlTV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLnRoaXMub3BlbmVkXyhwcm9maWxlKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gIm9wZW5lZCI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTW9kaWZpZWRSdW5uYWJsZShmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7CisJCXJldHVybiBuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci50aGlzLm1vZGlmaWVkXyhwcm9maWxlKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gIm1vZGlmaWVkIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUnVubmFibGUgYnVpbGRPa1RvQ2xvc2VSdW5uYWJsZShmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7CisJCXJldHVybiBuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci50aGlzLm9rVG9DbG9zZV8ocHJvZmlsZSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJPSyB0byBjbG9zZSI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQWJvdXRUb0Nsb3NlUnVubmFibGUoZmluYWwgQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgeworCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCVNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIudGhpcy5hYm91dFRvQ2xvc2VfKHByb2ZpbGUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiYWJvdXQgdG8gY2xvc2UiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENsb3NlZFJ1bm5hYmxlKGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKKwkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlTV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLnRoaXMuY2xvc2VkXyhwcm9maWxlKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gImNsb3NlZCI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkRGF0YWJhc2VDaGFuZ2VkUnVubmFibGUoZmluYWwgQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgZmluYWwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKKwkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlTV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLnRoaXMuZGF0YWJhc2VDaGFuZ2VkXyhwcm9maWxlLCBkYXRhYmFzZSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJkYXRhYmFzZSBjaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUnVubmFibGUgYnVpbGRDYXRhbG9nQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIGZpbmFsIENhdGFsb2cgY2F0YWxvZykgeworCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCVNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIudGhpcy5jYXRhbG9nQ2hhbmdlZF8ocHJvZmlsZSwgY2F0YWxvZyk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJjYXRhbG9nIGNoYW5nZWQiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFNjaGVtYUNoYW5nZWRSdW5uYWJsZShmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBmaW5hbCBTY2hlbWEgc2NoZW1hKSB7CisJCXJldHVybiBuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci50aGlzLnNjaGVtYUNoYW5nZWRfKHByb2ZpbGUsIHNjaGVtYSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJzY2hlbWEgY2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkU2VxdWVuY2VDaGFuZ2VkUnVubmFibGUoZmluYWwgQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgZmluYWwgU2VxdWVuY2Ugc2VxdWVuY2UpIHsKKwkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlTV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLnRoaXMuc2VxdWVuY2VDaGFuZ2VkXyhwcm9maWxlLCBzZXF1ZW5jZSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJzZXF1ZW5jZSBjaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUnVubmFibGUgYnVpbGRUYWJsZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBmaW5hbCBUYWJsZSB0YWJsZSkgeworCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCVNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIudGhpcy50YWJsZUNoYW5nZWRfKHByb2ZpbGUsIHRhYmxlKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gInRhYmxlIGNoYW5nZWQiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbHVtbkNoYW5nZWRSdW5uYWJsZShmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBmaW5hbCBDb2x1bW4gY29sdW1uKSB7CisJCXJldHVybiBuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci50aGlzLmNvbHVtbkNoYW5nZWRfKHByb2ZpbGUsIGNvbHVtbik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJjb2x1bW4gY2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkRm9yZWlnbktleUNoYW5nZWRSdW5uYWJsZShmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBmaW5hbCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKKwkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlTV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLnRoaXMuZm9yZWlnbktleUNoYW5nZWRfKHByb2ZpbGUsIGZvcmVpZ25LZXkpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiZm9yZWlnbiBrZXkgY2hhbmdlZCI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBEaXNwbGF5I2FzeW5jRXhlYyhSdW5uYWJsZSkgc2VlbXMgdG8gd29yayBPSzsKKwkgKiBidXQgdXNpbmcgI3N5bmNFeGVjKFJ1bm5hYmxlKSBjYW4gc29tdGltZXMgbWFrZSB0aGluZ3MKKwkgKiBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCisJICovCisJcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPblVJVGhyZWFkKFJ1bm5hYmxlIHIpIHsKKwkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHIpOworLy8JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKHIpOworCX0KKworCXZvaWQgb3BlbmVkXyhDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7CisJCXRoaXMubGlzdGVuZXIub3BlbmVkKHByb2ZpbGUpOworCX0KKworCXZvaWQgbW9kaWZpZWRfKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKKwkJdGhpcy5saXN0ZW5lci5tb2RpZmllZChwcm9maWxlKTsKKwl9CisKKwl2b2lkIG9rVG9DbG9zZV8oQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgeworCQl0aGlzLmxpc3RlbmVyLm9rVG9DbG9zZShwcm9maWxlKTsKKwl9CisKKwl2b2lkIGFib3V0VG9DbG9zZV8oQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgeworCQl0aGlzLmxpc3RlbmVyLmFib3V0VG9DbG9zZShwcm9maWxlKTsKKwl9CisKKwl2b2lkIGNsb3NlZF8oQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgeworCQl0aGlzLmxpc3RlbmVyLmNsb3NlZChwcm9maWxlKTsKKwl9CisKKwl2b2lkIGRhdGFiYXNlQ2hhbmdlZF8oQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKKwkJdGhpcy5saXN0ZW5lci5kYXRhYmFzZUNoYW5nZWQocHJvZmlsZSwgZGF0YWJhc2UpOworCX0KKworCXZvaWQgY2F0YWxvZ0NoYW5nZWRfKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENhdGFsb2cgY2F0YWxvZykgeworCQl0aGlzLmxpc3RlbmVyLmNhdGFsb2dDaGFuZ2VkKHByb2ZpbGUsIGNhdGFsb2cpOworCX0KKworCXZvaWQgc2NoZW1hQ2hhbmdlZF8oQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2NoZW1hIHNjaGVtYSkgeworCQl0aGlzLmxpc3RlbmVyLnNjaGVtYUNoYW5nZWQocHJvZmlsZSwgc2NoZW1hKTsKKwl9CisKKwl2b2lkIHNlcXVlbmNlQ2hhbmdlZF8oQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2VxdWVuY2Ugc2VxdWVuY2UpIHsKKwkJdGhpcy5saXN0ZW5lci5zZXF1ZW5jZUNoYW5nZWQocHJvZmlsZSwgc2VxdWVuY2UpOworCX0KKworCXZvaWQgdGFibGVDaGFuZ2VkXyhDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBUYWJsZSB0YWJsZSkgeworCQl0aGlzLmxpc3RlbmVyLnRhYmxlQ2hhbmdlZChwcm9maWxlLCB0YWJsZSk7CisJfQorCisJdm9pZCBjb2x1bW5DaGFuZ2VkXyhDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDb2x1bW4gY29sdW1uKSB7CisJCXRoaXMubGlzdGVuZXIuY29sdW1uQ2hhbmdlZChwcm9maWxlLCBjb2x1bW4pOworCX0KKworCXZvaWQgZm9yZWlnbktleUNoYW5nZWRfKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSkgeworCQl0aGlzLmxpc3RlbmVyLmZvcmVpZ25LZXlDaGFuZ2VkKHByb2ZpbGUsIGZvcmVpZ25LZXkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiU1dUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmluZGV4IDIzNDNjNjIuLjliMWI3ODkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDEzICs5LDIwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwogCiAvKioKICAqIFdyYXAgYW5vdGhlciBsaXN0IGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIFNXVAogICogVUkgdGhyZWFkLgorICogRm9yd2FyZCAqZXZlcnkqIGV2ZW50IGFzeW5jaHJvbm91c2x5IHZpYSB0aGUgVUkgdGhyZWFkIHNvIHRoZSBsaXN0ZW5lcgorICogcmVjZWl2ZXMgaW4gdGhlIHNhbWUgb3JkZXIgdGhleSB3ZXJlIGdlbmVyYXRlZC4KICAqLwogcHVibGljIGNsYXNzIFNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKIAlpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lcgpAQCAtMzAsMTMwICszNywxMDIgQEAKIAkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwogCX0KIAotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQorCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7CisJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwogCX0KIAotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdVSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQorCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKKwkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKIAl9CiAKLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ1VJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNNb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkSXRlbXNNb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KKwlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKKwkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkSXRlbXNNb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7CiAJfQogCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdVSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEl0ZW1zUmVwbGFjZWRSdW5uYWJsZShldmVudCkpOwotCQl9CisJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7CisJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEl0ZW1zUmVwbGFjZWRSdW5uYWJsZShldmVudCkpOwogCX0KIAotCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ1VJVGhyZWFkKCkpIHsKLQkJCXRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQorCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7CisJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZExpc3RDbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdVSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmxpc3RDaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KKwkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkTGlzdENoYW5nZWRSdW5uYWJsZShldmVudCkpOwogCX0KIAotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CisJcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBMaXN0QWRkRXZlbnQgZXZlbnQpIHsKIAkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJCQlTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQiOworCQkJCXJldHVybiAiaXRlbXMgYWRkZWQiOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX07CiAJfQogCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIExpc3RDaGFuZ2VFdmVudCBldmVudCkgeworCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKIAkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJCQlTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7CiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZW1vdmVkIjsKKwkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQiOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX07CiAJfQogCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNNb3ZlZFJ1bm5hYmxlKGZpbmFsIExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKIAkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJCQlTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNNb3ZlZF8oZXZlbnQpOwogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgbW92ZWQiOworCQkJCXJldHVybiAiaXRlbXMgbW92ZWQiOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX07CiAJfQogCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVwbGFjZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNSZXBsYWNlZFJ1bm5hYmxlKGZpbmFsIExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKIAkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJCQlTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNSZXBsYWNlZF8oZXZlbnQpOwogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgcmVwbGFjZWQiOworCQkJCXJldHVybiAiaXRlbXMgcmVwbGFjZWQiOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX07CiAJfQogCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CisJcHJpdmF0ZSBSdW5uYWJsZSBidWlsZExpc3RDbGVhcmVkUnVubmFibGUoZmluYWwgTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKIAkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJCQlTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgY2xlYXJlZCI7CisJCQkJcmV0dXJuICJsaXN0IGNsZWFyZWQiOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX07CiAJfQogCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DaGFuZ2VkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CisJcHJpdmF0ZSBSdW5uYWJsZSBidWlsZExpc3RDaGFuZ2VkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CiAJCXJldHVybiBuZXcgUnVubmFibGUoKSB7CiAJCQlwdWJsaWMgdm9pZCBydW4oKSB7CiAJCQkJU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmxpc3RDaGFuZ2VkXyhldmVudCk7CiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNoYW5nZWQiOworCQkJCXJldHVybiAibGlzdCBjaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9OwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ1VJVGhyZWFkKCkgewotCQlyZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbDsKLQl9Ci0KIAkvKioKIAkgKiBEaXNwbGF5I2FzeW5jRXhlYyhSdW5uYWJsZSkgc2VlbXMgdG8gd29yayBPSzsKIAkgKiBidXQgdXNpbmcgI3N5bmNFeGVjKFJ1bm5hYmxlKSBjYW4gc29tdGltZXMgbWFrZSB0aGluZ3MKQEAgLTE2NCwyMyArMTQzLDIzIEBACiAvLwkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMocik7CiAJfQogCi0Jdm9pZCBpdGVtc0FkZGVkXyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwl2b2lkIGl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewogCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwogCX0KIAotCXZvaWQgaXRlbXNSZW1vdmVkXyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwl2b2lkIGl0ZW1zUmVtb3ZlZF8oTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7CiAJCXRoaXMubGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKIAl9CiAKLQl2b2lkIGl0ZW1zTW92ZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgeworCXZvaWQgaXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewogCQl0aGlzLmxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwogCX0KIAotCXZvaWQgaXRlbXNSZXBsYWNlZF8oTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CisJdm9pZCBpdGVtc1JlcGxhY2VkXyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7CiAJCXRoaXMubGlzdGVuZXIuaXRlbXNSZXBsYWNlZChldmVudCk7CiAJfQogCi0Jdm9pZCBsaXN0Q2xlYXJlZF8oTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CisJdm9pZCBsaXN0Q2xlYXJlZF8oTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKIAkJdGhpcy5saXN0ZW5lci5saXN0Q2xlYXJlZChldmVudCk7CiAJfQogCkBAIC0xOTAsNyArMTY5LDcgQEAKIAogCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU1dUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAiKSI7CisJCXJldHVybiAiU1dUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKaW5kZXggOTlmMGE2Zi4uZjE5YWM5ZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTYsNiArMTYsOCBAQAogLyoqCiAgKiBXcmFwIGFub3RoZXIgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgU1dUCiAgKiBVSSB0aHJlYWQuCisgKiBGb3J3YXJkICpldmVyeSogZXZlbnQgYXN5bmNocm9ub3VzbHkgdmlhIHRoZSBVSSB0aHJlYWQgc28gdGhlIGxpc3RlbmVyCisgKiByZWNlaXZlcyBpbiB0aGUgc2FtZSBvcmRlciB0aGV5IHdlcmUgZ2VuZXJhdGVkLgogICovCiBwdWJsaWMgY2xhc3MgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKIAlpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKQEAgLTMxLDExICszMyw3IEBACiAJfQogCiAJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdVSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkUnVubmFibGUoZXZlbnQpKTsKLQkJfQorCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRSdW5uYWJsZShldmVudCkpOwogCX0KIAogCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CkBAIC00NiwxMCArNDQsNiBAQAogCQl9OwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ1VJVGhyZWFkKCkgewotCQlyZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbDsKLQl9Ci0KIAkvKioKIAkgKiBEaXNwbGF5I2FzeW5jRXhlYyhSdW5uYWJsZSkgc2VlbXMgdG8gd29yayBPSzsKIAkgKiBidXQgdXNpbmcgI3N5bmNFeGVjKFJ1bm5hYmxlKSBjYW4gc29tdGltZXMgbWFrZSB0aGluZ3MKQEAgLTY2LDcgKzYwLDcgQEAKIAogCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU1dUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAiKSI7CisJCXJldHVybiAiU1dUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKaW5kZXggNGE5NDEzMy4uZTk4NjMxZSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTYsNiArMTYsOCBAQAogLyoqCiAgKiBXcmFwIGFub3RoZXIgc3RhdGUgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgU1dUCiAgKiBVSSB0aHJlYWQuCisgKiBGb3J3YXJkICpldmVyeSogZXZlbnQgYXN5bmNocm9ub3VzbHkgdmlhIHRoZSBVSSB0aHJlYWQgc28gdGhlIGxpc3RlbmVyCisgKiByZWNlaXZlcyBpbiB0aGUgc2FtZSBvcmRlciB0aGV5IHdlcmUgZ2VuZXJhdGVkLgogICovCiBwdWJsaWMgY2xhc3MgU1dUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKIAlpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIKQEAgLTMxLDExICszMyw3IEBACiAJfQogCiAJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdVSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnN0YXRlQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkUnVubmFibGUoZXZlbnQpKTsKLQkJfQorCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRSdW5uYWJsZShldmVudCkpOwogCX0KIAogCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7CkBAIC00NiwxMCArNDQsNiBAQAogCQl9OwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ1VJVGhyZWFkKCkgewotCQlyZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbDsKLQl9Ci0KIAkvKioKIAkgKiBEaXNwbGF5I2FzeW5jRXhlYyhSdW5uYWJsZSkgc2VlbXMgdG8gd29yayBPSzsKIAkgKiBidXQgdXNpbmcgI3N5bmNFeGVjKFJ1bm5hYmxlKSBjYW4gc29tdGltZXMgbWFrZSB0aGluZ3MKQEAgLTY2LDcgKzYwLDcgQEAKIAogCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU1dUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAiKSI7CisJCXJldHVybiAiU1dUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmluZGV4IDcxZThjZDAuLmUxN2JmMjMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDEzICs5LDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CiAKIC8qKgogICogV3JhcCBhbm90aGVyIHRyZWUgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgU1dUCiAgKiBVSSB0aHJlYWQuCisgKiBGb3J3YXJkICpldmVyeSogZXZlbnQgYXN5bmNocm9ub3VzbHkgdmlhIHRoZSBVSSB0aHJlYWQgc28gdGhlIGxpc3RlbmVyCisgKiByZWNlaXZlcyBpbiB0aGUgc2FtZSBvcmRlciB0aGV5IHdlcmUgZ2VuZXJhdGVkLgogICovCiBwdWJsaWMgY2xhc3MgU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlcgogCWltcGxlbWVudHMgVHJlZUNoYW5nZUxpc3RlbmVyCkBAIC0zMCw3MCArMzUsNTQgQEAKIAkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwogCX0KIAotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdVSVRocmVhZCgpKSB7Ci0JCQl0aGlzLm5vZGVBZGRlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQorCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKKwkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZXZlbnQpKTsKIAl9CiAKLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdVSVRocmVhZCgpKSB7Ci0JCQl0aGlzLm5vZGVSZW1vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGROb2RlUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KKwlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKKwkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkTm9kZVJlbW92ZWRSdW5uYWJsZShldmVudCkpOwogCX0KIAotCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ1VJVGhyZWFkKCkpIHsKLQkJCXRoaXMudHJlZUNsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQorCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7CisJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdVSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnRyZWVDaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRUcmVlQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KKwkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwogCX0KIAotCXByaXZhdGUgUnVubmFibGUgYnVpbGROb2RlQWRkZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZmluYWwgVHJlZUFkZEV2ZW50IGV2ZW50KSB7CiAJCXJldHVybiBuZXcgUnVubmFibGUoKSB7CiAJCQlwdWJsaWMgdm9pZCBydW4oKSB7CiAJCQkJU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLm5vZGVBZGRlZF8oZXZlbnQpOwogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibm9kZSBhZGRlZCI7CisJCQkJcmV0dXJuICJub2RlIGFkZGVkIjsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9OwogCX0KIAotCXByaXZhdGUgUnVubmFibGUgYnVpbGROb2RlUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIFRyZWVDaGFuZ2VFdmVudCBldmVudCkgeworCXByaXZhdGUgUnVubmFibGUgYnVpbGROb2RlUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIFRyZWVSZW1vdmVFdmVudCBldmVudCkgewogCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewogCQkJcHVibGljIHZvaWQgcnVuKCkgewogCQkJCVNXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5ub2RlUmVtb3ZlZF8oZXZlbnQpOwogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibm9kZSByZW1vdmVkIjsKKwkJCQlyZXR1cm4gIm5vZGUgcmVtb3ZlZCI7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfTsKIAl9CiAKLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVHJlZUNsZWFyZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVHJlZUNsZWFyZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2xlYXJFdmVudCBldmVudCkgewogCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewogCQkJcHVibGljIHZvaWQgcnVuKCkgewogCQkJCVNXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy50cmVlQ2xlYXJlZF8oZXZlbnQpOwogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJlZSBjbGVhcmVkIjsKKwkJCQlyZXR1cm4gInRyZWUgY2xlYXJlZCI7IC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfTsKIAl9CkBAIC0xMDUsMTUgKzk0LDExIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNoYW5nZWQiOworCQkJCXJldHVybiAidHJlZSBjaGFuZ2VkIjsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9OwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ1VJVGhyZWFkKCkgewotCQlyZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbDsKLQl9Ci0KIAkvKioKIAkgKiBEaXNwbGF5I2FzeW5jRXhlYyhSdW5uYWJsZSkgc2VlbXMgdG8gd29yayBPSzsKIAkgKiBidXQgdXNpbmcgI3N5bmNFeGVjKFJ1bm5hYmxlKSBjYW4gc29tdGltZXMgbWFrZSB0aGluZ3MKQEAgLTEyNCwxNSArMTA5LDE1IEBACiAvLwkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMocik7CiAJfQogCi0Jdm9pZCBub2RlQWRkZWRfKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgeworCXZvaWQgbm9kZUFkZGVkXyhUcmVlQWRkRXZlbnQgZXZlbnQpIHsKIAkJdGhpcy5saXN0ZW5lci5ub2RlQWRkZWQoZXZlbnQpOwogCX0KIAotCXZvaWQgbm9kZVJlbW92ZWRfKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgeworCXZvaWQgbm9kZVJlbW92ZWRfKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewogCQl0aGlzLmxpc3RlbmVyLm5vZGVSZW1vdmVkKGV2ZW50KTsKIAl9CiAKLQl2b2lkIHRyZWVDbGVhcmVkXyhUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwl2b2lkIHRyZWVDbGVhcmVkXyhUcmVlQ2xlYXJFdmVudCBldmVudCkgewogCQl0aGlzLmxpc3RlbmVyLnRyZWVDbGVhcmVkKGV2ZW50KTsKIAl9CiAKQEAgLTE0Miw3ICsxMjcsNyBAQAogCiAJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICIpIjsKKwkJcmV0dXJuICJTV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAogCX0KIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvSnB0VWlNYXBwaW5nc01lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9KcHRVaU1hcHBpbmdzTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjNDVhZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9KcHRVaU1hcHBpbmdzTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgbG9jYWxpemVkIHN0cmluZ3MgdXNlZCBieSB0aGUgbWFwcGluZyBwYW5lcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnB0VWlNYXBwaW5nc01lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjY2Vzc1R5cGVDb21ib19kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGVPdmVycmlkZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX2VudW1lcmF0ZWRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX2ZldGNoTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9sb2JMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX29wdGlvbmFsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX3RlbXBvcmFsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm9vbGVhbl9GYWxzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX1RydWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZUNvbXBvc2l0ZV9hbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZUNvbXBvc2l0ZV9jYXNjYWRlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZUNvbXBvc2l0ZV9tZXJnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXNjYWRlQ29tcG9zaXRlX3BlcnNpc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZUNvbXBvc2l0ZV9yZWZyZXNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhc2NhZGVDb21wb3NpdGVfcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dDaG9vc2VyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9jb2x1bW5EZWZpbml0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9jb2x1bW5TZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2RldGFpbHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGVXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfbGVuZ3RoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9udWxsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfbnVsbGFibGVXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfcHJlY2lzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9zY2FsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfdW5pcXVlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfdXBkYXRhYmxlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXJfRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9EZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRXaXRob3V0VmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFdpdGhWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlDb21wb3NpdGVfaW5oZXJpdGFuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5Q29tcG9zaXRlX3F1ZXJpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5Q29tcG9zaXRlX3RhYmxlRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlDb21wb3NpdGVfdGFibGVOb0RlZmF1bHRTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5R2VuZXJhbFNlY3Rpb25fbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdEVtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU5hbWVDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnVtVHlwZUNvbXBvc2l0ZV9vcmRpbmFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudW1UeXBlQ29tcG9zaXRlX3N0cmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZXRjaFR5cGVDb21wb3NpdGVfZWFnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmV0Y2hUeXBlQ29tcG9zaXRlX2xhenk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfYXV0bzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0ZWRWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0b3JOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2lkZW50aXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX3NlcXVlbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX3N0cmF0ZWd5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX3RhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRvckNvbXBvc2l0ZV9hbGxvY2F0aW9uU2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0b3JDb21wb3NpdGVfaW5pdGlhbFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkQ2xhc3NDb21wb3NpdGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nQ29tcG9zaXRlX3BrX2dlbmVyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nQ29tcG9zaXRlX3ByaW1hcnlLZXlHZW5lcmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJZE1hcHBpbmdDb21wb3NpdGVfdGFibGVHZW5lcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZV9jaGFyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluaGVyaXRhbmNlQ29tcG9zaXRlX2RldGFpbHNHcm91cEJveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmhlcml0YW5jZUNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yQ29sdW1uR3JvdXBCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGVfaW50ZWdlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX2pvaW5lZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX3NpbmdsZV90YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmhlcml0YW5jZUNvbXBvc2l0ZV9zdHJhdGVneTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX3N0cmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX3RhYmxlX3Blcl9jbGFzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZlcnNlSm9pbkNvbHVtbkRpYWxvZ19lZGl0SW52ZXJzZUpvaW5Db2x1bW5UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX2FkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkNvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5Db21wb3NpdGVfam9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5Db21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5Db21wb3NpdGVfcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfYWRkSm9pbkNvbHVtbkRlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX2VkaXRKb2luQ29sdW1uRGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX2VkaXRKb2luQ29sdW1uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfcmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfY29sdW1uRGVmaW5pdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV9kZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfZGVmYXVsdFdpdGhPbmVQYXJhbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV9pbnNlcnRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX2luc2VydGFibGVXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV9udWxsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV9udWxsYWJsZVdpdGhEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX3RhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX3VuaXF1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV91bmlxdWVXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV91cGRhdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdXBkYXRhYmxlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX2FkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfZGVmYXVsdEVtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9pbnZlcnNlSm9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfam9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGFEYXRhQ29tcGxldGVDb21ib19EZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9jYXNjYWRlVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfZmV0Y2hUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9nZW5lcmFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9qb2luVGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX21hcHBlZEJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV90YXJnZXRFbnRpdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeUhpbnRzR3JvdXBCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3Jlc3VsdENsYXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnlIaW50c0dyb3VwQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld05hbWVTdGF0ZU9iamVjdF9uYW1lQWxyZWFkeUV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdOYW1lU3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb05hbWVTZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9uZVNlbGVjdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vbk93bmluZ01hcHBpbmdfbWFwcGVkQnlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3B0aW9uYWxDb21wb3NpdGVfZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3B0aW9uYWxDb21wb3NpdGVfdHJ1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX2N1c3RvbU9yZGVyaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yZGVyQnlDb21wb3NpdGVfbm9PcmRlcmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX29yZGVyQnlHcm91cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX29yZGVyQnlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX3ByaW1hcnlLZXlPcmRlcmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfZGVmaW5lSW5YbWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX2Fzc29jaWF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX2pvaW5Db2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX25vTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9CYXNpY0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0VtYmVkZGVkSWRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9FbWJlZGRlZExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0lkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfTWFueVRvTWFueUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX01hbnlUb09uZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX09uZVRvTWFueUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX09uZVRvT25lTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfVHJhbnNpZW50TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfVmVyc2lvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRUeXBlUGFnZV9FbWJlZGRhYmxlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudFR5cGVQYWdlX0VudGl0eUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRUeXBlUGFnZV9NYXBwZWRTdXBlcmNsYXNzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudFR5cGVQYWdlX1VubWFwcGVkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfYWRkRGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19hZGRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19lZGl0VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZERlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9kZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2VkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZE5hdGl2ZVF1ZXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWROYXRpdmVRdWVyeURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWROYXRpdmVRdWVyeURlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZE5hdGl2ZVF1ZXJ5VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZFF1ZXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWRRdWVyeURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWRRdWVyeURlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZFF1ZXJ5VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9kaXNwbGF5U3RyaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJpZXNDb21wb3NpdGVfZWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWVyaWVzQ29tcG9zaXRlX2VkaXROYW1lZE5hdGl2ZVF1ZXJ5RGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9lZGl0TmFtZWROYXRpdmVRdWVyeURlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9lZGl0TmFtZWROYXRpdmVRdWVyeVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJpZXNDb21wb3NpdGVfZWRpdE5hbWVkUXVlcnlEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWVyaWVzQ29tcG9zaXRlX2VkaXROYW1lZFF1ZXJ5RGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWVyaWVzQ29tcG9zaXRlX2VkaXROYW1lZFF1ZXJ5VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcmllc0NvbXBvc2l0ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWVyeUhpbnRzQ29tcG9zaXRlX25hbWVDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcnlIaW50c0NvbXBvc2l0ZV92YWx1ZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFDaG9vc2VyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZFNlY29uZGFyeVRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX2NhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdENhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdFNjaGVtYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0U2Vjb25kYXJ5VGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19zY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX2VkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX3NlY29uZGFyeVRhYmxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVDaG9vc2VyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlQ29tcG9zaXRlX2RlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlQ29tcG9zaXRlX3RhYmxlU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3NjaGVtYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV90YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV90YWJsZUdlbmVyYXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV92YWx1ZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRFbnRpdHlDaG9vc2VyX2Jyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRFbnRpdHlDaG9vc2VyX2RlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRFbnRpdHlDaG9vc2VyX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RW50aXR5Q2hvb3Nlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRFbnRpdHlDaG9vc2VyX3NlbGVjdFR5cGVUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZW1wb3JhbFR5cGVDb21wb3NpdGVfZGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZW1wb3JhbFR5cGVDb21wb3NpdGVfdGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZW1wb3JhbFR5cGVDb21wb3NpdGVfdGltZXN0YW1wOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcygianB0X3VpX21hcHBpbmdzIiwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIEpwdFVpTWFwcGluZ3NNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RiL0Fic3RyYWN0RGF0YWJhc2VPYmplY3RDb21iby5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGIvQWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzgxYTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGIvQWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBrZWVwcyBhIGNvbWJvIGluIHN5bmMgd2l0aCB0aGUgZGF0YWJhc2Ugb2JqZWN0cwotICogd2hlbiBhIGNvbm5lY3Rpb24gaXMgYWN0aXZlLgotICoKLSAqIEBzZWUgQ2F0YWxvZ0NvbWJvCi0gKiBAc2VlIENvbHVtbkNvbWJvCi0gKiBAc2VlIFNjaGVtYUNvbWJvCi0gKiBAc2VlIFRhYmxlQ29tYm8KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvPFQgZXh0ZW5kcyBKcGFOb2RlPiBleHRlbmRzIEFic3RyYWN0UGFuZTxUPgotewotCS8qKgotCSAqIFRoZSBtYWluIHdpZGdldCBvZiB0aGlzIHBhbmUuCi0JICovCi0JcHJpdmF0ZSBDQ29tYm8gY29tYm87Ci0KLQkvKioKLQkgKiBUaGUgbGlzdGVuZXIgYWRkZWQgdG8gdGhlIDxjb2RlPkNvbm5lY3Rpb25Qcm9maWxlPC9jb2RlPiByZXNwb25zaWJsZSB0bwotCSAqIGtlZXAgdGhlIGNvbWJvIGluIHN5bmMgd2l0aCB0aGUgZGF0YWJhc2UgbWV0YWRhdGEuCi0JICovCi0JcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0RGF0YWJhc2VPYmplY3RDb21ibyhBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0RGF0YWJhc2VPYmplY3RDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0RGF0YWJhc2VPYmplY3RDb21ibyhQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KQotCXsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQotCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgYWJvdXRUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCQlsb2coVHJhY2luZy5VSV9EQiwgImFib3V0VG9DbG9zZSIpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjYXRhbG9nQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDYXRhbG9nIGNhdGFsb2cpIHsKLQotCQkJCVNXVFV0aWwuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbG9nKFRyYWNpbmcuVUlfREIsICJjYXRhbG9nQ2hhbmdlZDogIiArIGNhdGFsb2cuZ2V0TmFtZSgpKTsKLQotCQkJCQkJaWYgKCFnZXRDb21ibygpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCUFic3RyYWN0RGF0YWJhc2VPYmplY3RDb21iby50aGlzLmNhdGFsb2dDaGFuZ2VkKGNhdGFsb2cpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0KLQkJCQlTV1RVdGlsLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxvZyhUcmFjaW5nLlVJX0RCLCAiY2xvc2VkIik7Ci0KLQkJCQkJCWlmICghZ2V0Q29tYm8oKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlBYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5yZXBvcHVsYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY29sdW1uQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbHVtbiBjb2x1bW4pIHsKLQotCQkJCVNXVFV0aWwuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbG9nKFRyYWNpbmcuVUlfREIsICJjb2x1bW5DaGFuZ2VkOiAiICsgY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJCQkJCWlmICghZ2V0Q29tYm8oKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlBYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5jb2x1bW5DaGFuZ2VkKGNvbHVtbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQotCQkJCWxvZyhUcmFjaW5nLlVJX0RCLCAiZGF0YWJhc2VDaGFuZ2VkIik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0KLQkJCQlTV1RVdGlsLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxvZyhUcmFjaW5nLlVJX0RCLCAiZm9yZWlnbktleUNoYW5nZWQ6ICIgKyBmb3JlaWduS2V5LmdldE5hbWUoKSk7Ci0KLQkJCQkJCWlmICghZ2V0Q29tYm8oKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlBYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5mb3JlaWduS2V5Q2hhbmdlZChmb3JlaWduS2V5KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQkJU1dUVXRpbC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsb2coVHJhY2luZy5VSV9EQiwgIm1vZGlmaWVkIik7Ci0KLQkJCQkJCWlmICghZ2V0Q29tYm8oKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlBYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5yZXBvcHVsYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCQlsb2coVHJhY2luZy5VSV9EQiwgIm9rVG9DbG9zZSIpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCi0JCQkJU1dUVXRpbC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsb2coVHJhY2luZy5VSV9EQiwgIm9wZW5lZCIpOwotCi0JCQkJCQlpZiAoIWdldENvbWJvKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJQWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvLnRoaXMucmVwb3B1bGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2NoZW1hIHNjaGVtYSkgewotCi0JCQkJU1dUVXRpbC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsb2coVHJhY2luZy5VSV9EQiwgInNjaGVtYUNoYW5nZWQ6ICIgKyBzY2hlbWEuZ2V0TmFtZSgpKTsKLQotCQkJCQkJaWYgKCFnZXRDb21ibygpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCUFic3RyYWN0RGF0YWJhc2VPYmplY3RDb21iby50aGlzLnNjaGVtYUNoYW5nZWQoc2NoZW1hKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQotCQkJCVNXVFV0aWwuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbG9nKFRyYWNpbmcuVUlfREIsICJzZXF1ZW5jZUNoYW5nZWQ6ICIgKyBzZXF1ZW5jZS5nZXROYW1lKCkpOwotCi0JCQkJCQlpZiAoIWdldENvbWJvKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJQWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvLnRoaXMuc2VxdWVuY2VDaGFuZ2VkKHNlcXVlbmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUYWJsZSB0YWJsZSkgewotCi0JCQkJU1dUVXRpbC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsb2coVHJhY2luZy5VSV9EQiwgInRhYmxlQ2hhbmdlZDogIiArIHRhYmxlLmdldE5hbWUoKSk7Ci0KLQkJCQkJCWlmICghZ2V0Q29tYm8oKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlBYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy50YWJsZUNoYW5nZWQodGFibGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBidWlsZE1vZGlmeUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKCFpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlDQ29tYm8gY29tYm8gPSAoQ0NvbWJvKSBlLndpZGdldDsKLQkJCQkJaWYgKGNvbWJvLmdldERhdGEoInBvcHVsYXRpbmciKSAhPSBCb29sZWFuLlRSVUUpIHsvL2NoZWNrICFUUlVFIGJlY2F1c2UgbnVsbCBpcyBhIHBvc3NpYmlsaXR5IGFzIHdlbGwKLQkJCQkJCXZhbHVlQ2hhbmdlZChjb21iby5nZXRUZXh0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIElmIHRoZSB2YWx1ZSBjaGFuZ2VzIGJ1dCB0aGUgc3ViamVjdCBpcyBudWxsLCB0aGVuIGlzIGludm9rZWQgaW4gb3JkZXIgdG8KLQkgKiBjcmVhdGUgdGhlIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRTdWJqZWN0KCkgewotCX0KLQotCS8qKgotCSAqIFRoZQotCSAqCi0JICogQHBhcmFtIGNhdGFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjYXRhbG9nQ2hhbmdlZChDYXRhbG9nIGNhdGFsb2cpIHsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlcyBzdXJlIHRoZSBjb21ibyBzaG93cyBub3RoaW5nIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgdmFsdWUgYmVjYXVzZQotCSAqIHRoZSBmb2N1cyBpcyBzdGlsbCBvbiB0aGUgY29tYm8uIFRoZSB1c2VyIGNhbiBzdGFydCB0eXBpbmcgc29tZXRoaW5nIGFuZAotCSAqIHdlIGRvbid0IHdhbnQgdG8gc3RhcnQgdGhlIHR5cGluZyBhZnRlciB0aGUgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJEZWZhdWx0VmFsdWUoKSB7Ci0KLQkJaWYgKHRoaXMuY29tYm8uaXNGb2N1c0NvbnRyb2woKSkgewotCi0JCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCQl0cnkgewotCQkJCWNvbWJvLnNldFRleHQoIiIpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUKLQkgKgotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2x1bW5DaGFuZ2VkKENvbHVtbiBjb2x1bW4pIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKUEEgcHJvamVjdCdzIGNvbm5lY3Rpb24gcHJvZmlsZSwgd2hpY2ggaXMgbmV2ZXIKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGNvbm5lY3Rpb24gc2V0IGluIHRoZSBwcm9qZWN0J3MgcHJvcGVydGllcyBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIGl0IGNvdWxkIG5vdCBiZWluZyByZXRyaWV2ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IGpwYVByb2plY3QoKTsKLQotCQlpZiAoanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4ganBhUHJvamVjdC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGF0YWJhc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY3RpdmUgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqCi0JICogQHJldHVybiBUaGUgb25saW5lIGRhdGFiYXNlIG9yIGEgPGNvZGU+bnVsbDwvY29kZT4gaW5zdGFuY2UgaWYgbm8KLQkgKiBjb25uZWN0aW9uIHByb2ZpbGUgd2FzIHNldCBvciB0aGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGF0YWJhc2UgZGF0YWJhc2UoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uUHJvZmlsZSgpLmdldERhdGFiYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZGVmYXVsdCBpcwotCSAqIHNwZWNpZmllZC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgZGVmYXVsdCB3aGVuIG5vIHZhbHVlIHdhcyBzcGVjaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKFQgc3ViamVjdCkgewotCQlzdXBlci5kaXNlbmdhZ2VMaXN0ZW5lcnMoc3ViamVjdCk7Ci0KLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0ganBhUHJvamVjdCgpOwotCi0JCWlmIChqcGFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCWpwYVByb2plY3QuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCi0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0KLQkJaWYgKCF0aGlzLmNvbWJvLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5jb21iby5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKFQgc3ViamVjdCkgewotCQlzdXBlci5lbmdhZ2VMaXN0ZW5lcnMoc3ViamVjdCk7Ci0KLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0ganBhUHJvamVjdCgpOwotCi0JCWlmIChqcGFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCWpwYVByb2plY3QuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlCi0JICoKLQkgKiBAcGFyYW0gZm9yZWlnbktleQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCX0KLQotCXB1YmxpYyBmaW5hbCBDQ29tYm8gZ2V0Q29tYm8oKSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSBidWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuY29tYm8gPSBidWlsZEVkaXRhYmxlQ0NvbWJvKGNvbnRhaW5lcik7Ci0JCXRoaXMuY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoYnVpbGRNb2RpZnlMaXN0ZW5lcigpKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKHRoaXMuY29tYm8pOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIHN1YmplY3Qgc2hvdWxkIGJlIGNyZWF0ZWQgd2hlbiB0aGUgdmFsdWUgY2hhbmdlcy4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNCdWlsZFN1YmplY3RBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cml2ZXMgdGhlIDxjb2RlPklKcGFQcm9qZWN0PC9jb2RlPiB0aGF0IGlzIHJlcXVpcmVkIHRvIHJlZ2lzdGVyIGEKLQkgKiA8Y29kZT5Db25uZWN0aW9uTGlzdGVuZXI8L2NvZGU+IGluIG9yZGVyIHRvIGtlZXAgdGhlIGNvbWJvIGluIHN5bmMgd2l0aAotCSAqIHRoZSBhc3NvY2lhdGVkIG9ubGluZSBkYXRhYmFzZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIEpQQSBwcm9qZWN0Ci0JICovCi0JcHJvdGVjdGVkIEpwYVByb2plY3QganBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHN1YmplY3QoKSA9PSBudWxsID8gbnVsbCA6IHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBmbGFnLCBTdHJpbmcgbWVzc2FnZSkgewotCi0JCXN1cGVyLmxvZyhmbGFnLCBtZXNzYWdlKTsKLQotCQlpZiAoVHJhY2luZy5VSV9EQi5lcXVhbHMoZmxhZykgJiYKLQkJICAgIFRyYWNpbmcuYm9vbGVhbkRlYnVnT3B0aW9uKFRyYWNpbmcuVUlfREIpKQotCQl7Ci0JCQlDbGFzczw/PiB0aGlzQ2xhc3MgPSBnZXRDbGFzcygpOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IENsYXNzVG9vbHMuc2hvcnROYW1lRm9yKHRoaXNDbGFzcyk7Ci0KLQkJCWlmICh0aGlzQ2xhc3MuaXNBbm9ueW1vdXNDbGFzcygpKSB7Ci0JCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWUuaW5kZXhPZignJCcpKTsKLQkJCQljbGFzc05hbWUgKz0gIi0+IiArIENsYXNzVG9vbHMuc2hvcnROYW1lRm9yKHRoaXNDbGFzcy5nZXRTdXBlcmNsYXNzKCkpOwotCQkJfQotCi0JCQlUcmFjaW5nLmxvZyhjbGFzc05hbWUgKyAiOiAiICsgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIGNvbWJvJ3MgbGlzdCBieSBhZGRpbmcgZmlyc3QgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXZhaWxhYmxlCi0JICogYW5kIHRoZW4gdGhlIHBvc3NpYmxlIGNob2ljZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7Ci0KLQkJY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCXBvcHVsYXRlRGVmYXVsdFZhbHVlKCk7Ci0KLQkJQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGUgPSBjb25uZWN0aW9uUHJvZmlsZSgpOwotCi0JCWlmICgoY29ubmVjdGlvblByb2ZpbGUgIT0gbnVsbCkgJiYgY29ubmVjdGlvblByb2ZpbGUuaXNBY3RpdmUoKSkgewotCi0JCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IENvbGxlY3Rpb25Ub29scy5zb3J0KHZhbHVlcygpKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJCWNvbWJvLmFkZChpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQl1cGRhdGVTZWxlY3RlZEl0ZW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHRoZSBjb21ibyBpZiBvbmUgZXhpc3RzLgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURlZmF1bHRWYWx1ZSgpIHsKLQotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gKHN1YmplY3QoKSAhPSBudWxsKSA/IGRlZmF1bHRWYWx1ZSgpIDogbnVsbDsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCWNvbWJvLmFkZChOTFMuYmluZCgKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpKTsKLQkJfQotCQllbHNlIHsKLQkJCWNvbWJvLmFkZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJdXBkYXRlU2VsZWN0ZWRJdGVtKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlCi0JICoKLQkgKiBAcGFyYW0gc2NoZW1hCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2NoZW1hQ2hhbmdlZChTY2hlbWEgc2NoZW1hKSB7Ci0JfQotCi0JLyoqCi0JICogVGhlCi0JICoKLQkgKiBAcGFyYW0gc2VxdWVuY2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBnaXZlbiB2YWx1ZSBhcyB0aGUgbmV3IHZhbHVlLgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgdG8gc2VuZCB0byB0aGUgbW9kZWwgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFRoZQotCSAqCi0JICogQHBhcmFtIHRhYmxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGFibGVDaGFuZ2VkKFRhYmxlIHRhYmxlKSB7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc2VsZWN0ZWQgaXRlbSBieSBzZWxlY3RlZCB0aGUgY3VycmVudCB2YWx1ZSwgaWYgbm90Ci0JICogPGNvZGU+bnVsbDwvY29kZT4sIG9yIHNlbGVjdCB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBvbmUgaXMgYXZhaWxhYmxlLAotCSAqIG90aGVyd2lzZSByZW1vdmUgdGhlIHNlbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gSXQgc2VlbXMgdGhlIHRleHQgY2FuIGJlIHNob3duIGFzIHRydW5jYXRlZCwgY2hhbmdpbmcgdGhlCi0JICogc2VsZWN0aW9uIHRvICgwLCAwKSBtYWtlcyB0aGUgZW50aXJlIHRleHQgdmlzaWJsZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0ZWRJdGVtKCkgewotCi0JCVQgc3ViamVjdCA9IHN1YmplY3QoKTsKLQotCQlTdHJpbmcgdmFsdWUgICAgICAgICA9IChzdWJqZWN0ICE9IG51bGwpID8gdmFsdWUoKSAgICAgICAgOiBudWxsOwotCQlTdHJpbmcgZGVmYXVsdFZhbHVlICA9IChzdWJqZWN0ICE9IG51bGwpID8gZGVmYXVsdFZhbHVlKCkgOiBudWxsOwotCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdEVtcHR5OwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJZGlzcGxheVN0cmluZyA9IE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQotCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgdXAgdG8gZGF0ZQotCQlpZiAoIWNvbWJvLmdldEl0ZW0oMCkuZXF1YWxzKGRpc3BsYXlTdHJpbmcpKSB7Ci0JCQljb21iby5yZW1vdmUoMCk7Ci0JCQljb21iby5hZGQoZGlzcGxheVN0cmluZywgMCk7Ci0JCX0KLQotCQkvLyBTZWxlY3QgdGhlIG5ldyB2YWx1ZQotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKCF2YWx1ZS5lcXVhbHMoY29tYm8uZ2V0VGV4dCgpKSkgewotCQkJCS8vdGhpcyBwcmV2ZW50cyB0aGUgY3Vyc29yIGZyb20gYmVpbmcgc2V0IGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAoYnVnIDIzNDQxOCkuCi0JCQkJLy9UaGUgcmVhc29uIHdlIGFyZSBoaXR0aW5nIHRoaXMgdXBkYXRlU2VsZWN0ZWRJdGVtKCkgY29kZSBhdCBhbGwKLQkJCQkvL2lzIGJlY2F1c2UgdGhlIGNvbnRleHQgbW9kZWwgaXMgIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsCi0JCQkJLy9pbiBhIHdheSB0aGF0IGNhdXNlcyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBiZSBmaXJlZCAodGhlIGFubm90YXRpb24gaXMgYWRkZWQgCi0JCQkJLy90byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoYW5nZSBub3RpZmljYXRpb24gb2NjdXJzIG9uIHRoZSB1cGRhdGUgdGhyZWFkLCAKLQkJCQkvL2FuZCB0aGVuIHRoZSBuYW1lIGlzIHNldCwgdGhlc2UgMiB0aHJlYWRzIGNhbiBnZXQgaW4gdGhlIHdyb25nIG9yZGVyKS4KLQkJCQkvL1RoZSB2YWx1ZUNoYW5nZWQoKSBtZXRob2Qgc2V0cyB0aGUgcG9wdWxhdGluZyBmbGFnIHRvIHRydWUsIGJ1dCBpbiB0aGlzIGNhc2UKLQkJCQkvL2l0IGlzIGFscmVhZHkgc2V0IGJhY2sgdG8gZmFsc2Ugd2hlbiB3ZSByZWNlaXZlIG5vdGlmaWNhdGlvbiBiYWNrIGZyb20gdGhlIG1vZGVsCi0JCQkJLy9iZWNhdXNlIGl0IGhhcyBtb3ZlZCB0byB0aGUgdXBkYXRlIHRocmVhZCBhbmQgdGhlbiBqdW1wcyBiYWNrIG9uIHRoZSBVSSB0aHJlYWQuCi0JCQkJY29tYm8uc2V0VGV4dCh2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gU2VsZWN0IHRoZSBkZWZhdWx0IHZhbHVlCi0JCWVsc2UgewotCQkJY29tYm8uc2VsZWN0KDApOwotCQkJCi0JCQkvL2kgdGhpbmsgd2UgY2FuIHJlbW92ZSB0aGlzLCBJIGRvbid0IGJlbGlldmUgdGhlIHByb2JsZW0gZXhwbGFpbmVkCi0JCQkvL2luIHRoZSBjb21tZW50cyBvZiB0aGlzIG1ldGhvZCBpcyBoYXBwZW5pbmcgYW55bW9yZS4gTm90IHJlbW92aW5nIGl0IG5vdyBiZWNhdXNlIHdlIGFyZSB3b3JraW5nIG9uIDIuMFJDMwotCQkJY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCAwKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZSBtb2RlbCBvYmplY3QuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyB2YWx1ZSgpOwotCi0JLyoqCi0JICogVGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCwgdXBkYXRlIHRoZSBtb2RlbCBpZiByZXF1aXJlZC4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFN0cmluZyB2YWx1ZSkgewotCi0JCUpwYU5vZGUgc3ViamVjdCA9IHN1YmplY3QoKTsKLQotCQlpZiAoKHN1YmplY3QgPT0gbnVsbCkgJiYgIWlzQnVpbGRTdWJqZWN0QWxsb3dlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgb2xkVmFsdWUgPSAoc3ViamVjdCAhPSBudWxsKSA/IHZhbHVlKCkgOiBudWxsOwotCi0JCS8vIENoZWNrIGZvciBudWxsIHZhbHVlCi0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHZhbHVlKSkgewotCQkJdmFsdWUgPSBudWxsOwotCi0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShvbGRWYWx1ZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBDb252ZXJ0IHRoZSBkZWZhdWx0IHZhbHVlIHRvIG51bGwKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYKLQkJICAgIGdldENvbWJvKCkuZ2V0SXRlbUNvdW50KCkgPiAwICYmCi0JCSAgICB2YWx1ZS5lcXVhbHMoZ2V0Q29tYm8oKS5nZXRJdGVtKDApKSkKLQkJewotCQkJdmFsdWUgPSBudWxsOwotCQl9Ci0KLQkJLy8gTm90aGluZyB0byBjaGFuZ2UKLQkJaWYgKChvbGRWYWx1ZSA9PSB2YWx1ZSkgJiYgdmFsdWUgPT0gbnVsbCkgewotCQkJY2xlYXJEZWZhdWx0VmFsdWUoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEJ1aWxkIHRoZSBzdWJqZWN0IGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZQotCQlpZiAoc3ViamVjdCA9PSBudWxsKSB7Ci0JCQlidWlsZFN1YmplY3QoKTsKLQkJfQotCi0JCS8vIFNldCB0aGUgbmV3IHZhbHVlCi0JCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKG9sZFZhbHVlID09IG51bGwpIHx8Ci0JCSAgICgob2xkVmFsdWUgIT0gbnVsbCkgJiYgIW9sZFZhbHVlLmVxdWFscyh2YWx1ZSkpKSB7Ci0KLQkJCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0JCQljb21iby5zZXREYXRhKCJwb3B1bGF0aW5nIiwgQm9vbGVhbi5UUlVFKTsKLQotCQkJdHJ5IHsKLQkJCQlzZXRWYWx1ZSh2YWx1ZSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJCQljb21iby5zZXREYXRhKCJwb3B1bGF0aW5nIiwgQm9vbGVhbi5GQUxTRSk7Ci0JCQl9Ci0KLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJY2xlYXJEZWZhdWx0VmFsdWUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgcG9zc2libGUgdmFsdWVzLCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21ibyBkdXJpbmcKLQkgKiBwb3B1bGF0aW9uLgotCSAqCi0JICogQHJldHVybiBBIG5vbi08Y29kZT5udWxsPC9jb2RlPiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gb2YgdGhlIHBvc3NpYmxlCi0JICogY2hvaWNlcyB0byBiZSBhZGRlZCB0byB0aGUgY29tYm8KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmF0b3I8U3RyaW5nPiB2YWx1ZXMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kYi9DYXRhbG9nQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RiL0NhdGFsb2dDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTE0NGExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RiL0NhdGFsb2dDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgZGF0YWJhc2Ugb2JqZWN0IGNvbWJvIGhhbmRsZXMgc2hvd2luZyB0aGUgZGF0YWJhc2UncyBjYXRhbG9ncy4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENhdGFsb2dDb21ibzxUIGV4dGVuZHMgSnBhTm9kZT4gZXh0ZW5kcyBBYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm88VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhdGFsb2dDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2F0YWxvZ0NvbWJvKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2F0YWxvZ0NvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDYXRhbG9nQ29tYm8oQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhdGFsb2dDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgQ2F0YWxvZ0NvbWJvKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHZhbHVlcygpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2UoKS5jYXRhbG9nTmFtZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kYi9Db2x1bW5Db21iby5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGIvQ29sdW1uQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlMWY0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kYi9Db2x1bW5Db21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBkYXRhYmFzZSBvYmplY3QgY29tYm8gaGFuZGxlcyBzaG93aW5nIGEgc2luZ2xlIG9yIG11bHRpcGxlIHRhYmxlcycKLSAqIGNvbHVtbnMuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb2x1bW5Db21ibzxUIGV4dGVuZHMgSnBhTm9kZT4gZXh0ZW5kcyBBYnN0cmFjdERhdGFiYXNlT2JqZWN0Q29tYm88VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbHVtbkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDb2x1bW5Db21ibyhBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29sdW1uQ29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENvbHVtbkNvbWJvKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29sdW1uQ29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIENvbHVtbkNvbWJvKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkYXRhYmFzIHRhYmxlcyB0aGF0IGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGNvbHVtbiBuYW1lcy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHRhYmxlIG9mIHdoaWNoIGl0cyBjb2x1bW5zIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIGNvbWJvCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFRhYmxlIHRhYmxlKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZUNoYW5nZWQoVGFibGUgdGFibGUpIHsKLQkJc3VwZXIudGFibGVDaGFuZ2VkKHRhYmxlKTsKLQotCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodGFibGUoKSA9PSB0YWJsZSkpIHsKLQkJCWRvUG9wdWxhdGUoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHZhbHVlcygpIHsKLQotCQlpZiAoc3ViamVjdCgpID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCX0KLQotCQlUYWJsZSB0YWJsZSA9IHRhYmxlKCk7Ci0KLQkJaWYgKHRhYmxlICE9IG51bGwpIHsKLQkJCXJldHVybiB0YWJsZS5jb2x1bW5OYW1lcygpOwotCQl9Ci0KLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kYi9TY2hlbWFDb21iby5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGIvU2NoZW1hQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmNGE2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kYi9TY2hlbWFDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgZGF0YWJhc2Ugb2JqZWN0IGNvbWJvIGhhbmRsZXMgc2hvd2luZyB0aGUgZGF0YWJhc2UncyBzY2hlbWFzLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2NoZW1hQ29tYm88VCBleHRlbmRzIEpwYU5vZGU+IGV4dGVuZHMgQWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TY2hlbWFDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgU2NoZW1hQ29tYm8oQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNjaGVtYUNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBTY2hlbWFDb21ibyhBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNjaGVtYUNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBTY2hlbWFDb21ibyhQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkKLQl7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdmFsdWVzKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZSgpLnNjaGVtYU5hbWVzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kYi9TZXF1ZW5jZUNvbWJvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kYi9TZXF1ZW5jZUNvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Yjk5M2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGIvU2VxdWVuY2VDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBkYXRhYmFzZSBvYmplY3QgY29tYm8gaGFuZGxlcyBzaG93aW5nIHRoZSBkYXRhYmFzZSdzIHNlcXVlbmNlcyBmb3IgYQotICogZ2l2ZW4gPGNvZGU+U2NoZW1hPC9jb2RlPi4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcXVlbmNlQ29tYm88VCBleHRlbmRzIEpwYU5vZGU+IGV4dGVuZHMgQWJzdHJhY3REYXRhYmFzZU9iamVjdENvbWJvPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZXF1ZW5jZUNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBTZXF1ZW5jZUNvbWJvKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwgQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZXF1ZW5jZUNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBTZXF1ZW5jZUNvbWJvKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlcXVlbmNlQ29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFNlcXVlbmNlQ29tYm8oUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KQotCXsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU2NoZW1hIHNjaGVtYSgpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdmFsdWVzKCkgewotCQlTY2hlbWEgc2NoZW1hID0gc2NoZW1hKCk7Ci0KLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc2NoZW1hLnNlcXVlbmNlTmFtZXMoKTsKLQkJfQotCi0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGIvVGFibGVDb21iby5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGIvVGFibGVDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjQ4Y2Y5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RiL1RhYmxlQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRiOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgZGF0YWJhc2Ugb2JqZWN0IGNvbWJvIGhhbmRsZXMgc2hvd2luZyB0aGUgZGF0YWJhc2UncyB0YWJsZXMuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUYWJsZUNvbWJvPFQgZXh0ZW5kcyBKcGFOb2RlPiBleHRlbmRzIEFic3RyYWN0RGF0YWJhc2VPYmplY3RDb21ibzxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFibGVDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGFibGVDb21ibyhBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYWJsZUNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUYWJsZUNvbWJvKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhYmxlQ29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFRhYmxlQ29tYm8oUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KQotCXsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhlIHNjaGVtYSBmcm9tIHdoZXJlIHRoZSB0YWJsZSBpcyBsb2NhdGVkLgotCSAqCi0JICogQHJldHVybiBUaGUgdGFibGUncyBzY2hlbWEgbmFtZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgc2NoZW1hTmFtZSgpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGFibGVDaGFuZ2VkKFRhYmxlIHRhYmxlKSB7Ci0JCXN1cGVyLnRhYmxlQ2hhbmdlZCh0YWJsZSk7Ci0KLQkJaWYgKHRhYmxlID09IHRhYmxlKCkpIHsKLQkJCXRoaXMuZG9Qb3B1bGF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgZGF0YWJhc2UgdGFibGUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzZWxlY3RlZCB0YWJsZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBUYWJsZSB0YWJsZSgpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gdmFsdWVzKCkgewotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IGRhdGFiYXNlKCk7Ci0JCVN0cmluZyBzY2hlbWFOYW1lID0gc2NoZW1hTmFtZSgpOwotCi0JCWlmICgoc2NoZW1hTmFtZSAhPSBudWxsKSAmJiAoZGF0YWJhc2UgIT0gbnVsbCkpIHsKLQkJCVNjaGVtYSBzY2hlbWEgPSBkYXRhYmFzZS5zY2hlbWFOYW1lZChzY2hlbWFOYW1lKTsKLQotCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHNjaGVtYS50YWJsZU5hbWVzKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZDkzMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQmFzZUVtYmVkZGVkTWFwcGluZwotICogQHNlZSBCYXNlSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIEVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgQmFzZUVtYmVkZGVkTWFwcGluZz4gZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPFQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkJhc2VFbWJlZGRlZE1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJbmV3IEVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Fic3RyYWN0RW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Fic3RyYWN0RW50aXR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDJlNjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdEVudGl0eUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVudGl0eU5hbWVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBJZENsYXNzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gdiBBdHRyaWJ1dGUgT3ZlcnJpZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3ZlcnJpZGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIHYgU2Vjb25kYXJ5IFRhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSB2IEluaGVyaXRhbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBJbmhlcml0YW5jZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gdiBRdWVyaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUXVlcmllc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIHYgR2VuZXJhdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEdlbmVyYXRvcnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFbnRpdHlOYW1lQ29tcG9zaXRlCi0gKiBAc2VlIEluaGVyaXRhbmNlQ29tcG9zaXRlCi0gKiBAc2VlIElkQ2xhc3NDb21wb3NpdGUKLSAqIEBzZWUgT3ZlcnJpZGVzQ29tcG9zaXRlCi0gKiBAc2VlIFRhYmxlQ29tcG9zaXRlCi0gKiBAc2VlIEdlbmVyYXRvcnNDb21wb3NpdGUKLSAqCi0gKiBUT0RPIHRhbGsgdG8gSmF2YUVkaXRvciBwZW9wbGUgYWJvdXQgd2hhdCB3ZSBjYW4gZG8gdG8gaG9vayBpbiBUYWJiZWRQcm9wZXJ0aWVzIGZvciB0aGUgSmF2YUVkaXRvcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGU8VCBleHRlbmRzIEVudGl0eT4gZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPFQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0RW50aXR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYnVpbGRTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYnVpbGRJbmhlcml0YW5jZUNvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFRhYmxlPiBidWlsZFRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eSwgVGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGUgdHJhbnNmb3JtXyhFbnRpdHkgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0VGFibGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlc1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGJ1aWxkQ29sbGFwc2FibGVTZWN0aW9uKAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZU92ZXJyaWRlcwotCQkpOwotCi0JCW5ldyBPdmVycmlkZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCi0JCS8vIEVudGl0eSBOYW1lIHdpZGdldHMKLQkJbmV3IEVudGl0eU5hbWVDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKQotCQkpOwotCi0JCS8vIFRhYmxlIHdpZGdldHMKLQkJbmV3IFRhYmxlQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWJ1aWxkVGFibGVIb2xkZXIoKSwKLQkJCWNvbnRhaW5lcgotCQkpOwotCi0JCS8vIFByaW1hcnkgS2V5IENsYXNzIHdpZGdldHMKLQkJbmV3IElkQ2xhc3NDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKQotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplR2VuZXJhdG9yc1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGJ1aWxkQ29sbGFwc2FibGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvbgotCQkpOwotCi0JCW5ldyBHZW5lcmF0b3JzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVJbmhlcml0YW5jZVBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGJ1aWxkQ29sbGFwc2FibGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkVudGl0eUNvbXBvc2l0ZV9pbmhlcml0YW5jZQotCQkpOwotCi0JCWJ1aWxkSW5oZXJpdGFuY2VDb21wb3NpdGUoY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbml0aWFsaXplR2VuZXJhbFBhbmUoY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlc1BhbmUoY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZVNlY29uZGFyeVRhYmxlc1BhbmUoY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUluaGVyaXRhbmNlUGFuZShjb250YWluZXIpOwotCQlpbml0aWFsaXplUXVlcmllc1BhbmUoY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUdlbmVyYXRvcnNQYW5lKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVRdWVyaWVzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRW50aXR5Q29tcG9zaXRlX3F1ZXJpZXMKLQkJKTsKLQotCQluZXcgUXVlcmllc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX3NlY29uZGFyeVRhYmxlcwotCQkpOwotCi0JCWJ1aWxkU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTE3NTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRiLkNvbHVtbkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRDb250cm9sVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFN0cmF0ZWd5OiAgICAgICAgICAgIHwgRW51bUNvbWJvVmlld2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFZhbHVlOiAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ID4gRGlzY3JpbWluYXRvciBDb2x1bW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgICAgICAgICAgIHwgQ29sdW1uQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFR5cGU6ICAgICAgICAgICAgICAgIHwgRW51bUNvbWJvVmlld2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENvbHVtbiBEZWZpbml0aW9uOiAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IExlbmd0aDogICAgICAgICAgICAgIHwgSSAgICAgICB8SXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENvbHVtbkNvbWJvCi0gKiBAc2VlIEVudW1Db21ib1ZpZXdlcgotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZTxUIGV4dGVuZHMgRW50aXR5PiBleHRlbmRzIEFic3RyYWN0UGFuZTxUPiB7Ci0KLQkvKioKLQkgKiBBIGtleSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhpcyBpcyByZXF1aXJlZCB0byBjb252ZXJ0Ci0JICogdGhlIHNlbGVjdGVkIGl0ZW0gZnJvbSBhIGNvbWJvIHRvIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzIGtleSBpcyBtb3N0Ci0JICogbGlrZWx5IG5ldmVyIHR5cGVkIHRoZSB1c2VyIGFuZCBpdCB3aWxsIGhlbHAgdG8gY29udmVydCB0aGUgdmFsdWUgdG8KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIGl0J3MgdGltZSB0byBzZXQgdGhlIG5ldyBzZWxlY3RlZCB2YWx1ZSBpbnRvIHRoZQotCSAqIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfS0VZID0gIj8hIyE/Iz8jP2RlZmF1bHQ/Iz8hIz8hIz8iOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Jbmhlcml0YW5jZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkluaGVyaXRhbmNlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb2x1bW5EZWZpbml0aW9uSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxEaXNjcmltaW5hdG9yQ29sdW1uPiBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RGlzY3JpbWluYXRvckNvbHVtbiwgU3RyaW5nPihkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyLCBEaXNjcmltaW5hdG9yQ29sdW1uLkNPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0Q29sdW1uRGVmaW5pdGlvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JMaXN0VmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCWJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBERUZBVUxUX0tFWTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5hbWUgPSBERUZBVUxUX0tFWSArIG5hbWU7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRMZW5ndGhIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPERpc2NyaW1pbmF0b3JDb2x1bW4sIEludGVnZXI+KGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpLCBEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RIX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldERlZmF1bHRMZW5ndGgoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoSW50ZWdlci5NSU5fVkFMVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkRGVmYXVsdExlbmd0aExhYmVsKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlMYWJlbCBsYWJlbCA9IGJ1aWxkTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRGVmYXVsdFdpdGhvdXRWYWx1ZQotCQkpOwotCi0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIoCi0JCQluZXcgTGFiZWxlZExhYmVsKGxhYmVsKSwKLQkJCWJ1aWxkRGVmYXVsdExlbmd0aExhYmVsSG9sZGVyKCkKLQkJKTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRMZW5ndGhMYWJlbEhvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXIsIFN0cmluZz4oYnVpbGREZWZhdWx0TGVuZ3RoSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJbnRlZ2VyIHZhbHVlKSB7Ci0KLQkJCQlJbnRlZ2VyIGRlZmF1bHRWYWx1ZSA9IChzdWJqZWN0KCkgIT0gbnVsbCkgPyBzdWJqZWN0KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSA6Ci0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSDsKLQotCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRXaXRoVmFsdWUsCi0JCQkJCWRlZmF1bHRWYWx1ZQotCQkJCSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5Db21ibzxEaXNjcmltaW5hdG9yQ29sdW1uPiBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5Db21ibygKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPERpc2NyaW1pbmF0b3JDb2x1bW4+IGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIpIHsKLQotCQlyZXR1cm4gbmV3IENvbHVtbkNvbWJvPERpc2NyaW1pbmF0b3JDb2x1bW4+KAotCQkJdGhpcywKLQkJCWRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIsCi0JCQljb250YWluZXIpCi0JCXsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChOYW1lZENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoTmFtZWRDb2x1bW4uREVGQVVMVF9OQU1FX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZE5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZSB0YWJsZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERiVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPERpc2NyaW1pbmF0b3JDb2x1bW4+IGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHksIERpc2NyaW1pbmF0b3JDb2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvckNvbHVtbiB0cmFuc2Zvcm1fKEVudGl0eSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPERpc2NyaW1pbmF0b3JDb2x1bW4sIERpc2NyaW1pbmF0b3JUeXBlPiBidWlsZERpc2NyaW1pbmF0b3JUeXBlQ29tYm8oCi0JCUNvbXBvc2l0ZSBjb250YWluZXIsCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxEaXNjcmltaW5hdG9yQ29sdW1uPiBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPERpc2NyaW1pbmF0b3JDb2x1bW4sIERpc2NyaW1pbmF0b3JUeXBlPigKLQkJCXRoaXMsCi0JCQlkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyLAotCQkJY29udGFpbmVyKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKERpc2NyaW1pbmF0b3JDb2x1bW4uU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRGlzY3JpbWluYXRvclR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhEaXNjcmltaW5hdG9yVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5jbGFzcywKLQkJCQkJQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZS5jbGFzcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRGlzY3JpbWluYXRvclR5cGUgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGREaXNjcmltaW5hdG9yVmFsdWVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChzdWJqZWN0KCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCk7Ci0KLQkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gREVGQVVMVF9LRVkgKyB2YWx1ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZhbHVlID0gREVGQVVMVF9LRVk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAodmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHROYW1lID0gdmFsdWUuc3Vic3RyaW5nKERFRkFVTFRfS0VZLmxlbmd0aCgpKTsKLQotCQkJCQlpZiAoZGVmYXVsdE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQl2YWx1ZSA9IE5MUy5iaW5kKAotCQkJCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0V2l0aFZhbHVlLAotCQkJCQkJCWRlZmF1bHROYW1lCi0JCQkJCQkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdmFsdWUgPSBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRGVmYXVsdFdpdGhvdXRWYWx1ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREaXNjcmltaW5hdG9yVmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5TUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCS8vIENvbnZlcnQgdGhlIGRlZmF1bHQgdmFsdWUgb3IgYW4gZW1wdHkgc3RyaW5nIHRvIG51bGwKLQkJCQlpZiAoKHZhbHVlICE9IG51bGwpICYmCi0JCQkJICAgKCh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB8fCB2YWx1ZS5zdGFydHNXaXRoKERFRkFVTFRfS0VZKSkpIHsKLQotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCi0JCQkJc3ViamVjdC5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERpc2NyaW1pbmF0b3JWYWx1ZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBidWlsZERlZmF1bHREaXNjcmltaW5hdG9yTGlzdFZhbHVlSG9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZExlbmd0aEhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RGlzY3JpbWluYXRvckNvbHVtbj4gZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcikgewotCi0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPERpc2NyaW1pbmF0b3JDb2x1bW4sIEludGVnZXI+KGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIsIERpc2NyaW1pbmF0b3JDb2x1bW4uU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRTcGVjaWZpZWRMZW5ndGgoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0U3BlY2lmaWVkTGVuZ3RoKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RW50aXR5LCBJbmhlcml0YW5jZVR5cGU+IGJ1aWxkU3RyYXRlZ3lDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEVudGl0eSwgSW5oZXJpdGFuY2VUeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnRpdHkuREVGQVVMVF9JTkhFUklUQU5DRV9TVFJBVEVHWV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5LlNQRUNJRklFRF9JTkhFUklUQU5DRV9TVFJBVEVHWV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZVtdIGNob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEluaGVyaXRhbmNlVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEluaGVyaXRhbmNlVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5jbGFzcywKLQkJCQkJQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZS5jbGFzcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoSW5oZXJpdGFuY2VUeXBlIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRGlzY3JpbWluYXRvckNvbHVtblBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxEaXNjcmltaW5hdG9yQ29sdW1uPiBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyID0KLQkJCWJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpOwotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9uYW1lLAotCQkJYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uQ29tYm8oY29udGFpbmVyLCBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9JTkhFUklUQU5DRV9ESVNDUklNSU5BVE9SX0NPTFVNTgotCQkpOwotCi0JCS8vIERpc2NyaW1pbmF0b3IgVHlwZSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JUeXBlLAotCQkJYnVpbGREaXNjcmltaW5hdG9yVHlwZUNvbWJvKGNvbnRhaW5lciwgZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfSU5IRVJJVEFOQ0VfRElTQ1JJTUlOQVRPUl9UWVBFCi0JCSk7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVN1YlNlY3Rpb24oCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAxMCksCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfZGV0YWlsc0dyb3VwQm94LAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKQotCQkpOwotCi0JCS8vIExlbmd0aCB3aWRnZXRzCi0JCVNwaW5uZXIgbGVuZ3RoU3Bpbm5lciA9IGJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2xlbmd0aCwKLQkJCWJ1aWxkTGVuZ3RoSG9sZGVyKGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIpLAotCQkJLTEsCi0JCQktMSwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJYnVpbGREZWZhdWx0TGVuZ3RoTGFiZWwoY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX0xFTkdUSAotCQkpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lciwgbGVuZ3RoU3Bpbm5lcik7Ci0KLQkJLy8gQ29sdW1uIERlZmluaXRpb24gd2lkZ2V0cwotCQlidWlsZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5EZWZpbml0aW9uLAotCQkJYnVpbGRDb2x1bW5EZWZpbml0aW9uSG9sZGVyKGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIpCi0JCSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gZ3JvdXBCb3hNYXJnaW4oKTsKLQotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGJ1aWxkU3ViUGFuZSgKLQkJCWNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luCi0JCSk7Ci0KLQkJLy8gU3RyYXRlZ3kgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQlzdWJQYW5lLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkluaGVyaXRhbmNlQ29tcG9zaXRlX3N0cmF0ZWd5LAotCQkJYnVpbGRTdHJhdGVneUNvbWJvKHN1YlBhbmUpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0lOSEVSSVRBTkNFX1NUUkFURUdZCi0JCSk7Ci0KLQkJLy8gRGlzY3JpbmF0b3IgVmFsdWUgd2lkZ2V0cwotCQlDQ29tYm8gZGlzY3JpbWluYXRvclZhbHVlQ29tYm8gPSBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibygKLQkJCXN1YlBhbmUsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlLAotCQkJYnVpbGREaXNjcmltaW5hdG9yVmFsdWVMaXN0SG9sZGVyKCksCi0JCQlidWlsZERpc2NyaW1pbmF0b3JWYWx1ZUhvbGRlcigpLAotCQkJYnVpbGREaXNjcmltaW5hdG9yVmFsdWVDb252ZXJ0ZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9JTkhFUklUQU5DRV9ESVNDUklNSU5BVE9SX1ZBTFVFCi0JCSk7Ci0KLQkJLy8gRGlzY3JpbWluYXRvciBDb2x1bW4gc3ViLXBhbmUKLQkJQ29tcG9zaXRlIGRpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIgPSBidWlsZFRpdGxlZFBhbmUoCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAxMCksCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvckNvbHVtbkdyb3VwQm94Ci0JCSk7Ci0KLQkJaW5pdGlhbGl6ZURpc2NyaW1pbmF0b3JDb2x1bW5QYW5lKGRpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIpOwotCi0JCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyB3aWRnZXRzCi0JCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGxheW91dCBvZiB0aGUgZ2l2ZW4gY29udGFpbmVyIGJ5IGNoYW5naW5nIHdoaWNoIHdpZGdldCB3aWxsCi0JICogZ3JhYiB0aGUgZXhjZXNzIG9mIGhvcml6b250YWwgc3BhY2UuIEJ5IGRlZmF1bHQsIHRoZSBjZW50ZXIgY29udHJvbCBncmFicwotCSAqIHRoZSBleGNlc3Mgc3BhY2UsIHdlIGNoYW5nZSBpdCB0byBiZSB0aGUgcmlnaHQgY29udHJvbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBjb250YWluaW5nIHRoZSBjb250cm9scyBuZWVkaW5nIHRoZWlyCi0JICogPGNvZGU+R3JpZERhdGE8L2NvZGU+IHRvIGJlIG1vZGlmaWVkIGZyb20gdGhlIGRlZmF1bHQgdmFsdWVzCi0JICogQHBhcmFtIHNwaW5uZXIgVGhlIHNwaW5uZXIgdGhhdCBnb3QgY3JlYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyLCBTcGlubmVyIHNwaW5uZXIpIHsKLQotCQkvLyBJdCBpcyBwb3NzaWJsZSB0aGUgc3Bpbm5lcidzIHBhcmVudCBpcyBub3QgdGhlIGNvbnRhaW5lciBvZiB0aGUKLQkJLy8gbGFiZWwsIHNwaW5uZXIgYW5kIHJpZ2h0IGNvbnRyb2wgKGEgcGFuZSBpcyBzb21ldGltZXMgcmVxdWlyZWQgZm9yCi0JCS8vIHBhaW50aW5nIHRoZSBzcGlubmVyJ3MgYm9yZGVyKQotCQlDb21wb3NpdGUgcGFuZUNvbnRhaW5lciA9IHNwaW5uZXIuZ2V0UGFyZW50KCk7Ci0KLQkJd2hpbGUgKGNvbnRhaW5lciAhPSBwYW5lQ29udGFpbmVyLmdldFBhcmVudCgpKSB7Ci0JCQlwYW5lQ29udGFpbmVyID0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKTsKLQkJfQotCi0JCUNvbnRyb2xbXSBjb250cm9scyA9IHBhbmVDb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWNvbnRyb2xzWzFdLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWNvbnRyb2xzWzJdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmVBbGlnblJpZ2h0KGNvbnRyb2xzWzJdKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2NlYTA2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBvc3RFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BYnN0cmFjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gSm9pbiBDb2x1bW5zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCB4IE92ZXJyaWRlIERlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBJbmhlcml0YW5jZUNvbXBvc2l0ZSAtIFRoZSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZTxUIGV4dGVuZHMgRW50aXR5PiBleHRlbmRzIEFic3RyYWN0UGFuZTxUPgotewotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gam9pbkNvbHVtbkhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCi0JCUVudGl0eSBzdWJqZWN0ID0gc3ViamVjdCgpOwotCQlpbnQgaW5kZXggPSBzdWJqZWN0LnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc3ViamVjdC5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbmRleCk7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nIGRpYWxvZyA9IG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZygKLQkJCXNoZWxsKCksCi0JCQlzdWJqZWN0KCksCi0JCQludWxsCi0JCSk7Ci0KLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRBZGRQcmltYXJ5S2V5Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nPiBidWlsZEFkZFByaW1hcnlLZXlKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cgZGlhbG9nKSB7Ci0JCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJCQlhZGRKb2luQ29sdW1uKGRpYWxvZy5zdWJqZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKTsKLQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZz4gYnVpbGRFZGl0UHJpbWFyeUtleUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248UHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyBkaWFsb2cpIHsKLQkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQkJCWVkaXRKb2luQ29sdW1uKGRpYWxvZy5zdWJqZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPigpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKFByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJaWYgKGpvaW5Db2x1bW4uaXNWaXJ0dWFsKCkpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQotCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQsCi0JCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCQkpOwotCQkJfQotCi0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQotCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQotCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zLAotCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRKb2luQ29sdW1uc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9lZGl0OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG9wdGlvbk9uU2VsZWN0aW9uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQllZGl0UHJpbWFyeUtleUpvaW5Db2x1bW4obGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJCQlpbnRbXSBzZWxlY3RlZEluZGljZXMgPSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRJbmRpY2VzKCk7Ci0JCQkJRW50aXR5IGVudGl0eSA9IHN1YmplY3QoKTsKLQotCQkJCWZvciAoaW50IGluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJZW50aXR5LnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHNlbGVjdGVkSW5kaWNlc1tpbmRleF0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gYnVpbGRKb2luQ29sdW1uTGFiZWwoKFByaW1hcnlLZXlKb2luQ29sdW1uKSBlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4+KCk7Ci0JCWxpc3QuYWRkKGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZERlZmF1bHRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiwgUHJpbWFyeUtleUpvaW5Db2x1bW4+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oCi0JCQlidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSwKLQkJCU5hbWVkQ29sdW1uLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZLAotCQkJTmFtZWRDb2x1bW4uREVGQVVMVF9OQU1FX1BST1BFUlRZLAotCQkJQmFzZUpvaW5Db2x1bW4uU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksCi0JCQlCYXNlSm9pbkNvbHVtbi5ERUZBVUxUX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFbnRpdHksIFByaW1hcnlLZXlKb2luQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWRpdEpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKHN0YXRlT2JqZWN0LmdldEpvaW5Db2x1bW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyBkaWFsb2cgPSBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2coCi0JCQlzaGVsbCgpLAotCQkJc3ViamVjdCgpLAotCQkJam9pbkNvbHVtbgotCQkpOwotCi0JCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkRWRpdFByaW1hcnlLZXlKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCWpvaW5Db2x1bW5Ib2xkZXIgPSBidWlsZEpvaW5Db2x1bW5Ib2xkZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBQcmltYXJ5IEtleSBKb2luIENvbHVtbnMgZ3JvdXAgcGFuZQotCQlHcm91cCBncm91cFBhbmUgPSBidWlsZFRpdGxlZFBhbmUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX3ByaW1hcnlLZXlKb2luQ29sdW1uCi0JCSk7Ci0KLQkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBKb2luIENvbHVtbnMgY2hlY2sgYm94Ci0JCWJ1aWxkQ2hlY2tCb3goCi0JCQlidWlsZFN1YlBhbmUoZ3JvdXBQYW5lLCA4KSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkKLQkJKTsKLQotCQkvLyBQcmltYXJ5IEtleSBKb2luIENvbHVtbnMgbGlzdCBwYW5lCi0JCUFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eT4gam9pbkNvbHVtbnNMaXN0UGFuZSA9IG5ldyBBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHk+KAotCQkJdGhpcywKLQkJCWdyb3VwUGFuZSwKLQkJCWJ1aWxkSm9pbkNvbHVtbnNBZGFwdGVyKCksCi0JCQlidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0xpc3RNb2RlbCgpLAotCQkJam9pbkNvbHVtbkhvbGRlciwKLQkJCWJ1aWxkSm9pbkNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMKLQkJKTsKLQotCQlpbnN0YWxsSm9pbkNvbHVtbnNMaXN0UGFuZUVuYWJsZXIoam9pbkNvbHVtbnNMaXN0UGFuZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxKb2luQ29sdW1uc0xpc3RQYW5lRW5hYmxlcihBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHk+IHBhbmUpIHsKLQkJbmV3IFBhbmVFbmFibGVyKAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCksCi0JCQlwYW5lCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUpvaW5Db2x1bW5zKGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQotCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0KLQkJdHJ5IHsKLQkJCS8vIEFkZCBhIGpvaW4gY29sdW1uIGJ5IGNyZWF0aW5nIGEgc3BlY2lmaWVkIG9uZSB1c2luZyB0aGUgZGVmYXVsdAotCQkJLy8gb25lIGlmIGl0IGV4aXN0cwotCQkJaWYgKHNlbGVjdGVkKSB7Ci0KLQkJCQlzd2l0Y2hEZWZhdWx0VG9TcGVjaWZpZWQoKTsKLQkJCX0KLQkJCS8vIFJlbW92ZSBhbGwgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbnMKLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGluZGV4ID0gc3ViamVjdCgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJc3ViamVjdCgpLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHN3aXRjaERlZmF1bHRUb1NwZWNpZmllZCgpOwotCQotCXByaXZhdGUgY2xhc3MgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlciBleHRlbmRzIExpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEJvb2xlYW4+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gewotCi0JCXB1YmxpYyBPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQkJc3VwZXIoYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCXJldHVybiBsaXN0SG9sZGVyLnNpemUoKSA+IDA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQl1cGRhdGVKb2luQ29sdW1ucyh2YWx1ZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2NjY2ZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE9ybUVudGl0eQotICogQHNlZSBPcm1FbnRpdHlDb21wb3NpdGUgLSBUaGUgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBBZGRSZW1vdmVMaXN0UGFuZQotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTxUIGV4dGVuZHMgRW50aXR5PiBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRTZWNvbmRhcnlUYWJsZUZyb21EaWFsb2coU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCWludCBpbmRleCA9IHRoaXMuc3ViamVjdCgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkJCVN0cmluZyBuYW1lID0gZGlhbG9nLmdldFNlbGVjdGVkTmFtZSgpOwotCQkJU3RyaW5nIGNhdGFsb2cgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDYXRhbG9nKCk7Ci0JCQlTdHJpbmcgc2NoZW1hID0gZGlhbG9nLmdldFNlbGVjdGVkU2NoZW1hKCk7Ci0JCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IHRoaXMuc3ViamVjdCgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGluZGV4KTsKLQkJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUobmFtZSk7Ci0JCQlpZiAoIWRpYWxvZy5pc0RlZmF1bHRDYXRhbG9nU2VsZWN0ZWQoKSkgewotCQkJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coY2F0YWxvZyk7Ci0JCQl9Ci0JCQlpZiAoIWRpYWxvZy5pc0RlZmF1bHRTY2hlbWFTZWxlY3RlZCgpKSB7Ci0JCQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKHNjaGVtYSk7Ci0JCQl9Ci0KLQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKHNlY29uZGFyeVRhYmxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTZWNvbmRhcnlUYWJsZT4gYnVpbGRTZWNvbmRhcnlUYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U2Vjb25kYXJ5VGFibGU+KCk7Ci0JfQotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGJ1aWxkU2Vjb25kYXJ5VGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCS8vIFRPRE8gZGlzcGxheSBhIHF1YWxpZmllZCBuYW1lIGluc3RlYWQKLQkJCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZSkgZWxlbWVudDsKLQkJCQlpZiAoc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuICIiOy8vVE9ETwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTZWNvbmRhcnlUYWJsZURpYWxvZyBidWlsZFNlY29uZGFyeVRhYmxlRGlhbG9nRm9yQWRkKCkgewotCQlyZXR1cm4gbmV3IFNlY29uZGFyeVRhYmxlRGlhbG9nKGdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLCBzdWJqZWN0KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCksIHN1YmplY3QoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQWRkUmVtb3ZlTGlzdFBhbmUuQWRhcHRlciBidWlsZFNlY29uZGFyeVRhYmxlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlTZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2cgPSBidWlsZFNlY29uZGFyeVRhYmxlRGlhbG9nRm9yQWRkKCk7Ci0JCQkJYWRkU2Vjb25kYXJ5VGFibGVGcm9tRGlhbG9nKGRpYWxvZywgbGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9lZGl0OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG9wdGlvbk9uU2VsZWN0aW9uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZSkgbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKLQkJCQlTZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2cgPSBuZXcgU2Vjb25kYXJ5VGFibGVEaWFsb2coZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIHNlY29uZGFyeVRhYmxlLCBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpKTsKLQkJCQllZGl0U2Vjb25kYXJ5VGFibGVGcm9tRGlhbG9nKGRpYWxvZywgc2Vjb25kYXJ5VGFibGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gc3ViamVjdCgpOwotCQkJCWludFtdIHNlbGVjdGVkSW5kaWNlcyA9IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKTsKLQotCQkJCWZvciAoaW50IGluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJZW50aXR5LnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKHNlbGVjdGVkSW5kaWNlc1tpbmRleF0pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBlbmFibGVPcHRpb25PblNlbGVjdGlvbkNoYW5nZShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJaWYgKGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlc1NpemUoKSAhPSAxKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGUpIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7Ci0JCQkJcmV0dXJuICFzZWNvbmRhcnlUYWJsZS5pc1ZpcnR1YWwoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBlbmFibGVSZW1vdmVPblNlbGVjdGlvbkNoYW5nZShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJaWYgKGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCQkJCXJldHVybiAhc2Vjb25kYXJ5VGFibGUuaXNWaXJ0dWFsKCk7CQkJCQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0U2Vjb25kYXJ5VGFibGVEaWFsb2dPa2QoU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nLCBTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgewotCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5nZXRTZWxlY3RlZE5hbWUoKTsKLQkJU3RyaW5nIGNhdGFsb2cgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDYXRhbG9nKCk7Ci0JCVN0cmluZyBzY2hlbWEgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRTY2hlbWEoKTsKLQotCQlpZiAoc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwgfHwgIXNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKS5lcXVhbHMobmFtZSkpewotCQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZShuYW1lKTsKLQkJfQotCi0JCWlmIChkaWFsb2cuaXNEZWZhdWx0Q2F0YWxvZ1NlbGVjdGVkKCkpIHsKLQkJCWlmIChzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkgIT0gbnVsbCkgewotCQkJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpID09IG51bGwgfHwgIXNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKS5lcXVhbHMoY2F0YWxvZykpewotCQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZyhjYXRhbG9nKTsKLQkJfQotCi0JCWlmIChkaWFsb2cuaXNEZWZhdWx0U2NoZW1hU2VsZWN0ZWQoKSkgewotCQkJaWYgKHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpICE9IG51bGwpIHsKLQkJCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkgPT0gbnVsbCB8fCAhc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkuZXF1YWxzKHNjaGVtYSkpewotCQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKHNjaGVtYSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWRpdFNlY29uZGFyeVRhYmxlRnJvbURpYWxvZyhTZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2csIFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJZWRpdFNlY29uZGFyeVRhYmxlRGlhbG9nT2tkKGRpYWxvZywgc2Vjb25kYXJ5VGFibGUpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9CYXNlSm9pbkNvbHVtbkRpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9CYXNlSm9pbkNvbHVtbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDA4ODNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQmFzZUpvaW5Db2x1bW5EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RWYWxpZGF0aW5nRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBkZWZpbml0aW9uIHRoZSBkaWFsb2cgc2hvd2luZyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgam9pbiBjb2x1bW4KLSAqIHRvIGVkaXQgb3IgdG8gY3JlYXRlLgotICoKLSAqIEBzZWUgQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdAotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUpvaW5Db2x1bW5EaWFsb2c8VCBleHRlbmRzIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3Q+IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW5nRGlhbG9nPFQ+IHsKLQotCS8qKgotCSAqIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHN0YXRlIG9iamVjdAotCSAqIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZS4KLQkgKi8KLQlwcml2YXRlIEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW47Ci0KLQkvKioKLQkgKiBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcyBsb2NhdGVkLgotCSAqLwotCXByaXZhdGUgT2JqZWN0IG93bmVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSm9pbkNvbHVtbkRpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gb3duZXIgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMgbG9jYXRlZAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBCYXNlSm9pbkNvbHVtbkRpYWxvZyhTaGVsbCBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvd25lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCi0JCXN1cGVyKHBhcmVudCk7Ci0KLQkJdGhpcy5vd25lciAgICAgID0gb3duZXI7Ci0JCXRoaXMuam9pbkNvbHVtbiA9IGpvaW5Db2x1bW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX2Rlc2NyaXB0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb25UaXRsZSgpIHsKLQotCQlpZiAoam9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfYWRkSm9pbkNvbHVtbkRlc2NyaXB0aW9uVGl0bGU7Ci0JCX0KLQotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfZWRpdEpvaW5Db2x1bW5EZXNjcmlwdGlvblRpdGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGpvaW4gY29sdW1uIHVzZWQgYnkgdGhpcyBzdGF0ZSBvYmplY3QgZm9yIGVkaXRpbmcgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUuCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciB0aGUgZWRpdGVkIGpvaW4gY29sdW1uIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIEJhc2VKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG93bmVyIHdoZXJlIHRoZSBqb2luIGNvbHVtbiBpcyBsb2NhdGVkIG9yIHdoZXJlIGEgbmV3IG9uZSBjYW4KLQkgKiBiZSBhZGRlZC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBhcmVudCBvZiB0aGUgam9pbiBjb2x1bW4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZSgpIHsKLQotCQlpZiAoam9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfYWRkSm9pbkNvbHVtblRpdGxlOwotCQl9Ci0KLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX2VkaXRKb2luQ29sdW1uVGl0bGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uRGlhbG9nUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGE1YmI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3REaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFJlZmVyZW5jZWQgQ29sdW1uIE5hbWU6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFRhYmxlOiAgICAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENvbHVtbiBEZWZpbml0aW9uOiAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Ci0gKiBAc2VlIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmU8VCBleHRlbmRzIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3Q+IGV4dGVuZHMgQWJzdHJhY3REaWFsb2dQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQSBrZXkgdXNlZCB0byByZXByZXNlbnQgdGhlIGRlZmF1bHQgdmFsdWUsIHRoaXMgaXMgcmVxdWlyZWQgdG8gY29udmVydAotCSAqIHRoZSBzZWxlY3RlZCBpdGVtIGZyb20gYSBjb21ibyB0byA8Y29kZT5udWxsPC9jb2RlPi4gVGhpcyBrZXkgaXMgbW9zdAotCSAqIGxpa2VseSBuZXZlciB0eXBlZCB0aGUgdXNlciBhbmQgaXQgd2lsbCBoZWxwIHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvCi0JICogPGNvZGU+bnVsbDwvY29kZT4gd2hlbiBpdCdzIHRpbWUgdG8gc2V0IHRoZSBuZXcgc2VsZWN0ZWQgdmFsdWUgaW50byB0aGUKLQkgKiBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBERUZBVUxUX0tFWSA9ICI/ISMhPyM/Iz9kZWZhdWx0PyM/ISM/ISM/IjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbHVtbkRlZmluaXRpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LkNPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0Q29sdW1uRGVmaW5pdGlvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBidWlsZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBidWlsZFN1YlBhbmUocGFyZW50LCAwLCA3LCAwLCA1KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdE5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm1fKEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QgdmFsdWUpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHZhbHVlLmdldERlZmF1bHROYW1lKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBERUZBVUxUX0tFWTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5hbWUgPSBERUZBVUxUX0tFWSArIG5hbWU7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdE5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZERlZmF1bHROYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtXyhCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0IHZhbHVlKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSB2YWx1ZS5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IERFRkFVTFRfS0VZOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmFtZSA9IERFRkFVTFRfS0VZICsgbmFtZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRUYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybV8oQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCB2YWx1ZSkgewotCQkJCVN0cmluZyBuYW1lID0gdmFsdWUuZ2V0RGVmYXVsdFRhYmxlKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBERUZBVUxUX0tFWTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5hbWUgPSBERUZBVUxUX0tFWSArIG5hbWU7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFRhYmxlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJYnVpbGREZWZhdWx0VGFibGVIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGREaXNwbGF5YWJsZVN0cmluZ0NvbnZlcnRlcihmaW5hbCBEZWZhdWx0VmFsdWVIYW5kbGVyIGhhbmRsZXIpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKHN1YmplY3QoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gaGFuZGxlci5nZXREZWZhdWx0VmFsdWUoKTsKLQotCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQkJdmFsdWUgPSBERUZBVUxUX0tFWSArIHZhbHVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdmFsdWUgPSBERUZBVUxUX0tFWTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICh2YWx1ZS5zdGFydHNXaXRoKERFRkFVTFRfS0VZKSkgewotCQkJCQlTdHJpbmcgZGVmYXVsdE5hbWUgPSB2YWx1ZS5zdWJzdHJpbmcoREVGQVVMVF9LRVkubGVuZ3RoKCkpOwotCi0JCQkJCWlmIChkZWZhdWx0TmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCXZhbHVlID0gTkxTLmJpbmQoCi0JCQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRXaXRoVmFsdWUsCi0JCQkJCQkJZGVmYXVsdE5hbWUKLQkJCQkJCSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0V2l0aG91dFZhbHVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJLy8gQ29udmVydCB0aGUgZGVmYXVsdCB2YWx1ZSBvciBhbiBlbXB0eSBzdHJpbmcgdG8gbnVsbAotCQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYKLQkJCQkgICAoKHZhbHVlLmxlbmd0aCgpID09IDApIHx8IHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSkgewotCi0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Lk5BTUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QubmFtZXMoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5jb2x1bW5zU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVzTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHROYW1lTGlzdEhvbGRlcigpKTsKLQkJaG9sZGVycy5hZGQoYnVpbGROYW1lTGlzdEhvbGRlcigpKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KGhvbGRlcnMpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGROYW1lU3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gYnVpbGREaXNwbGF5YWJsZVN0cmluZ0NvbnZlcnRlcihuZXcgRGVmYXVsdFZhbHVlSGFuZGxlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LlJFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCS8vIENvbnZlcnQgdGhlIGRlZmF1bHQgdmFsdWUgb3IgYW4gZW1wdHkgc3RyaW5nIHRvIG51bGwKLQkJCQlpZiAoKHZhbHVlICE9IG51bGwpICYmCi0JCQkJICAgKCh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB8fCB2YWx1ZS5zdGFydHNXaXRoKERFRkFVTFRfS0VZKSkpIHsKLQotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCi0JCQkJc3ViamVjdC5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LlJFRkVSRU5DRV9DT0xVTU5fTkFNRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5yZWZlcmVuY2VDb2x1bW5OYW1lcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnJlZmVyZW5jZUNvbHVtbnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVzTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZUxpc3RIb2xkZXIoKSk7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFJlZmVyZW5jZWRDb2x1bW5OYW1lU3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gYnVpbGREaXNwbGF5YWJsZVN0cmluZ0NvbnZlcnRlcihuZXcgRGVmYXVsdFZhbHVlSGFuZGxlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdC5UQUJMRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJLy8gQ29udmVydCB0aGUgZGVmYXVsdCB2YWx1ZSBvciBhbiBlbXB0eSBzdHJpbmcgdG8gbnVsbAotCQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYKLQkJCQkgICAoKHZhbHVlLmxlbmd0aCgpID09IDApIHx8IHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSkgewotCi0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlzdWJqZWN0LnNldFRhYmxlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUYWJsZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksICIiKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnRhYmxlcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhYmxlc0xpc3RIb2xkZXIoKSB7Ci0JCUFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBob2xkZXJzID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigyKTsKLQkJaG9sZGVycy5hZGQoYnVpbGREZWZhdWx0VGFibGVMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZChidWlsZFRhYmxlTGlzdEhvbGRlcigpKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KGhvbGRlcnMpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGRUYWJsZVN0cmluZ0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRGlzcGxheWFibGVTdHJpbmdDb252ZXJ0ZXIobmV3IERlZmF1bHRWYWx1ZUhhbmRsZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRUYWJsZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBOYW1lIHdpZGdldHMKLQkJQ29tYm8gbmFtZUNvbWJvID0gYnVpbGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX25hbWUsCi0JCQlidWlsZE5hbWVzTGlzdEhvbGRlcigpLAotCQkJYnVpbGROYW1lSG9sZGVyKCksCi0JCQlidWlsZE5hbWVTdHJpbmdDb252ZXJ0ZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9DT0xVTU5fTkFNRQotCQkpOwotCi0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihuYW1lQ29tYm8pOwotCi0JCS8vIFJlZmVyZW5jZWQgQ29sdW1uIE5hbWUgd2lkZ2V0cwotCQlDb21ibyByZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvID0gYnVpbGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX3JlZmVyZW5jZWRDb2x1bW5OYW1lLAotCQkJYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZXNMaXN0SG9sZGVyKCksCi0JCQlidWlsZFJlZmVyZW5jZWRDb2x1bW5OYW1lSG9sZGVyKCksCi0JCQlidWlsZFJlZmVyZW5jZWRDb2x1bW5OYW1lU3RyaW5nQ29udmVydGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fUkVGRVJFTkNFRF9DT0xVTU4KLQkJKTsKLQotCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIocmVmZXJlbmNlZENvbHVtbk5hbWVDb21ibyk7Ci0KLQkJLy8gVGFibGUgd2lkZ2V0cwotCQlpZiAoaXNUYWJsZUVkaXRhYmxlKCkpIHsKLQotCQkJQ29tYm8gdGFibGVDb21ibyA9IGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV90YWJsZSwKLQkJCQlidWlsZFRhYmxlc0xpc3RIb2xkZXIoKSwKLQkJCQlidWlsZFRhYmxlSG9sZGVyKCksCi0JCQkJYnVpbGRUYWJsZVN0cmluZ0NvbnZlcnRlcigpLAotCQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9SRUZFUkVOQ0VEX0NPTFVNTgotCQkJKTsKLQotCQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKHRhYmxlQ29tYm8pOwotCQl9Ci0JCWVsc2UgewotCQkJQ29tYm8gdGFibGVDb21ibyA9IGJ1aWxkTGFiZWxlZENvbWJvKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdGFibGUsCi0JCQkJYnVpbGRUYWJsZXNMaXN0SG9sZGVyKCksCi0JCQkJYnVpbGRUYWJsZUhvbGRlcigpLAotCQkJCWJ1aWxkVGFibGVTdHJpbmdDb252ZXJ0ZXIoKSwKLQkJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fUkVGRVJFTkNFRF9DT0xVTU4KLQkJCSk7Ci0KLQkJCXRhYmxlQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQkvLyBDb2x1bW4gRGVmaW5pdGlvbiB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfY29sdW1uRGVmaW5pdGlvbiwKLQkJCWJ1aWxkQ29sdW1uRGVmaW5pdGlvbkhvbGRlcigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0YWJsZSBjb21ibyBzaG91bGQgYmUgZWRpdGFibGUgb3Igbm90LiBUaGUgZGVmYXVsdAotCSAqIGlzIHRvIGtlZXAgdGhlIGNvbWJvIHJlYWQtb25seS4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc3VwcG9ydCB0aGUgZWRpdGluZyBvZiB0aGUgc2VsZWN0ZWQgdGFibGU7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgaW50ZXJmYWNlIERlZmF1bHRWYWx1ZUhhbmRsZXIgewotCQlTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9CYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNjJmMzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9CYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLkFic3RyYWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGRlZmluaXRpb24gb2YgYSBzdGF0ZSBvYmplY3QgdXNlZCB0byBlZGl0IG9yIGNyZWF0ZSBhIG5ldwotICogam9pbiBjb2x1bW4uCi0gKgotICogQHNlZSBBYnN0cmFjdEpvaW5Db2x1bW4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCBleHRlbmRzIEFic3RyYWN0Tm9kZQotewotCS8qKgotCSAqIFRoZSBTUUwgZnJhZ21lbnQgdGhhdCBpcyB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgRERMIGZvciB0aGUgY29sdW1uLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNvbHVtbkRlZmluaXRpb247Ci0KLQkvKioKLQkgKiBFaXRoZXIgdGhlIGpvaW4gY29sdW1uIGlzIGJlaW5nIGVkaXRlZCBvciA8Y29kZT5udWxsPC9jb2RlPiB0aGUgc3RhdGUKLQkgKiBvYmplY3QgaXMgYmVpbmcgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW47Ci0KLQkvKioKLQkgKiBUaGUgam9pbiBjb2x1bW4ncyBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBkZWZpbmVkLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcyBsb2NhdGVkLgotCSAqLwotCXByaXZhdGUgT2JqZWN0IG93bmVyOwotCi0JLyoqCi0JICogVGhlIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGRlZmluZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgdGFibGUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyB0YWJsZTsKLQotCS8qKgotCSAqIEtlZXBzIHRyYWNrIG9mIHRoZSA8Y29kZT5WYWxpZGF0b3I8L2NvZGU+IHNpbmNlIHRoaXMgaXMgdGhlIHJvb3Qgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCS8qKgotCSAqIElkZW50aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIGNvbHVtbiBkZWZpbml0aW9uIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZID0gImNvbHVtbkRlZmluaXRpb24iOwotCi0JLyoqCi0JICogSWRlbnRpZmllcyBhIGNoYW5nZSBpbiB0aGUgbmFtZSBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCi0JLyoqCi0JICogSWRlbnRpZmllcyBhIGNoYW5nZSBpbiB0aGUgbGlzdCBvZiBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU19MSVNUID0gIm5hbWVzIjsKLQotCS8qKgotCSAqIElkZW50aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIGxpc3Qgb2YgcmVmZXJlbmNlIGNvbHVtbiBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VfQ09MVU1OX05BTUVTX0xJU1QgPSAicmVmZXJlbmNlQ29sdW1uTmFtZXMiOwotCi0JLyoqCi0JICogSWRlbnRpZmllcyBhIGNoYW5nZSBpbiB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gInJlZmVyZW5jZWRDb2x1bW5OYW1lIjsKLQotCS8qKgotCSAqIElkZW50aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIHRhYmxlIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX1BST1BFUlRZID0gInRhYmxlIjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RKb2luQ29sdW1uU3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIG93bmVyIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzIGxvY2F0ZWQKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBFaXRoZXIgdGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlwdWJsaWMgQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdChPYmplY3Qgb3duZXIsIEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJc3VwZXIobnVsbCk7Ci0JCWluaXRpYWxpemUob3duZXIsIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGNoZWNrUGFyZW50KE5vZGUgcGFyZW50Tm9kZSkgewotCQkvLyBUaGlzIGlzIHRoZSByb290IG9mIHRoZSBKb2luIENvbHVtbiBzdGF0ZSBvYmplY3QKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGNvbHVtbk5hbWVzKFRhYmxlIHRhYmxlKSB7Ci0KLQkJaWYgKHRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJTGlzdDxTdHJpbmc+IG5hbWVzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGFibGUuY29sdW1uTmFtZXMoKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobmFtZXMpOwotCQlyZXR1cm4gbmFtZXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCQotCXByaXZhdGUgaW50IGNvbHVtbnNTaXplKFRhYmxlIHRhYmxlKSB7Ci0JCWlmICh0YWJsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gdGFibGUuY29sdW1uc1NpemUoKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU1FMIGZyYWdtZW50IHRoYXQgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIERETCBmb3IgdGhlCi0JICogY29sdW1uLgotCSAqCi0JICogQHJldHVybiBUaGUgZWRpdGVkIGNvbHVtbiBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCB1c2VkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uKCkgewotCQlyZXR1cm4gY29sdW1uRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IG5hbWUgaWYgdGhlIGpvaW4gY29sdW1uIGlzIGJlaW5nIGVkaXRlZCBvdGhlcndpc2UKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBkZWZhdWx0IG5hbWUgZGVmaW5lZCBieSB0aGUgam9pbiBjb2x1bW4gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkgewotCQlpZiAodGhpcy5qb2luQ29sdW1uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBpZiB0aGUgam9pbiBjb2x1bW4gaXMgYmVpbmcKLQkgKiBlZGl0ZWQgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgdGhlIGRlZmF1bHQgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBkZWZpbmVkIGJ5IHRoZSBqb2luCi0JICogY29sdW1uIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCWlmICh0aGlzLmpvaW5Db2x1bW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMKLQkgKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdGVkIGpvaW4gY29sdW1uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgc3RhdGUgb2JqZWN0Ci0JICogaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lLgotCSAqCi0JICogQHJldHVybiBUaGUgZWRpdGVkIGpvaW4gY29sdW1uIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIEJhc2VKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgam9pbiBjb2x1bW4uCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciBqb2luIGNvbHVtbidzIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gdXNlIHRoZSBkZWZhdWx0Ci0JICogbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkYXRhYmFzZSB0YWJsZSBpZiBvbmUgY2FuIGJlIGZvdW5kLgotCSAqCi0JICogQHJldHVybiBUaGUgZGF0YWJhc2UgdGFibGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgVGFibGUgZ2V0TmFtZVRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvd25lciB3aGVyZSB0aGUgam9pbiBjb2x1bW4gaXMgbG9jYXRlZCBvciB3aGVyZSBhIG5ldyBvbmUgY2FuCi0JICogYmUgYWRkZWQuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwYXJlbnQgb2YgdGhlIGpvaW4gY29sdW1uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPd25lcigpIHsKLQkJcmV0dXJuIG93bmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgb2YgdGhlIGpvaW4gY29sdW1uLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgam9pbiBjb2x1bW4ncyByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogdG8gdXNlIHRoZSBkZWZhdWx0IG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zCi0JICoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMKLQkgKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXZhbGlkYXRvciA9IE5VTExfVkFMSURBVE9SOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgc3RhdGUgb2JqZWN0LgotCSAqCi0JICogQHBhcmFtIG93bmVyIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzIGxvY2F0ZWQKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBFaXRoZXIgdGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE9iamVjdCBvd25lciwgQmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCi0JCXRoaXMub3duZXIgICAgICA9IG93bmVyOwotCQl0aGlzLmpvaW5Db2x1bW4gPSBqb2luQ29sdW1uOwotCQl0aGlzLnRhYmxlICAgICAgPSB0aGlzLmluaXRpYWxUYWJsZSgpOwotCi0JCWlmIChqb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZSAgICAgICAgICAgICAgICAgPSBqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJCXRoaXMuY29sdW1uRGVmaW5pdGlvbiAgICAgPSBqb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKTsKLQkJCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUgPSBqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBpbml0aWFsVGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbHVtbiBuYW1lcyBpZiB0aGUgZGF0YWJhc2UgdGFibGUgY2FuIGJlIHJlc29sdmVkLgotCSAqCi0JICogQHJldHVybiBUaGUgbmFtZXMgb2YgdGhlIHRhYmxlJ3MgY29sdW1ucyBvciBhbiBlbXB0eSBpdGVyYXRvciBpZiB0aGUgdGFibGUKLQkgKiBjYW4ndCBiZSByZXNvbHZlZAotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBuYW1lcygpIHsKLQkJcmV0dXJuIGNvbHVtbk5hbWVzKGdldE5hbWVUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gY29sdW1uc1NpemUoZ2V0TmFtZVRhYmxlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgY29sdW1uIG5hbWVzIGlmIHRoZSBkYXRhYmFzZSB0YWJsZSBjYW4gYmUgcmVzb2x2ZWQuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBuYW1lcyBvZiB0aGUgdGFibGUncyBjb2x1bW5zIG9yIGFuIGVtcHR5IGl0ZXJhdG9yIGlmIHRoZSB0YWJsZQotCSAqIGNhbid0IGJlIHJlc29sdmVkCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHJlZmVyZW5jZUNvbHVtbk5hbWVzKCkgewotCQlyZXR1cm4gY29sdW1uTmFtZXMoZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIGludCByZWZlcmVuY2VDb2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIGNvbHVtbnNTaXplKGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgU1FMIGZyYWdtZW50IHRoYXQgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIERETCBmb3IgdGhlIGNvbHVtbi4KLQkgKgotCSAqIEBwYXJhbSBjb2x1bW5EZWZpbml0aW9uIFRoZSBuZXcgam9pbiBjb2x1bW4ncyBjb2x1bW4gZGVmaW5pdGlvbiBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNsZWFyIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIGNvbHVtbkRlZmluaXRpb24pIHsKLQkJU3RyaW5nIG9sZENvbHVtbkRlZmluaXRpb24gPSB0aGlzLmNvbHVtbkRlZmluaXRpb247Ci0JCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IGNvbHVtbkRlZmluaXRpb247Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFksIG9sZENvbHVtbkRlZmluaXRpb24sIGNvbHVtbkRlZmluaXRpb24pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGpvaW4gY29sdW1uLgotCSAqCi0JICogQHBhcmFtIG5hbWUgVGhlIG5ldyBqb2luIGNvbHVtbidzIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gdXNlIHRoZQotCSAqIGRlZmF1bHQgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBvZiB0aGUgam9pbiBjb2x1bW4uCi0JICoKLQkgKiBAcGFyYW0gcmVmZXJlbmNlZENvbHVtbk5hbWUgVGhlIG5ldyBqb2luIGNvbHVtbidzIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlIGRlZmF1bHQgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lID0gcmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkUmVmZXJlbmNlZENvbHVtbk5hbWUsIHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZShTdHJpbmcgdGFibGUpIHsKLQkJU3RyaW5nIG9sZFRhYmxlID0gdGhpcy50YWJsZTsKLQkJdGhpcy50YWJsZSA9IHRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX1BST1BFUlRZLCBvbGRUYWJsZSwgdGFibGUpOwotCQl0YWJsZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRWYWxpZGF0b3IoVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdGFibGUgZnJvbSB3aGljaCB0aGUgY29sdW1uIG5hbWVzIGFyZSB1c2VkIGhhcyBjaGFuZ2VkLCBub3RpZmllcyB0aGUKLQkgKiBsaXN0ZW5lcnMgdGhlIGxpc3Qgb2YgbmFtZXMgYW5kIHJlZmVyZW5jZSBjb2x1bW4gbmFtZXMgc2hvdWxkIGJlIHVwZGF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGFibGVDaGFuZ2VkKCkgewotCQlmaXJlTGlzdENoYW5nZWQoTkFNRVNfTElTVCk7Ci0JCWZpcmVMaXN0Q2hhbmdlZChSRUZFUkVOQ0VfQ09MVU1OX05BTUVTX0xJU1QpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBhbGwgdGhlIHRhYmxlIG5hbWVzIGNvbnRhaW5zIGluIHRoZSBhc3NvY2lhdGVkCi0JICogc2NoZW1hLiBUaGUgZGVmYXVsdCByZXR1cm5zIGFuIGVtcHR5IGl0ZXJhdG9yLgotCSAqCi0JICogQHJldHVybiBUaGUgbmFtZXMgb2YgdGhlIHRhYmxlcwotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YWJsZXMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGdpdmVuIGpvaW4gY29sdW1uIHdpdGggdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBzdGF0ZQotCSAqIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBqb2luQ29sdW1uIFRoZSBqb2luIGNvbHVtbiB0byB1cGRhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVKb2luQ29sdW1uKEJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQkvLyBOYW1lCi0JCWlmICh2YWx1ZXNBcmVEaWZmZXJlbnQobmFtZSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpKSB7Ci0JCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobmFtZSk7Ci0JCX0KLQotCQkvLyBSZWZlcmVuY2VkIENvbHVtbiBOYW1lCi0JCWlmICh2YWx1ZXNBcmVEaWZmZXJlbnQocmVmZXJlbmNlZENvbHVtbk5hbWUsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSkpIHsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQl9Ci0KLQkJLy8gQ29sdW1uIERlZmluaXRpb24KLQkJaWYgKHZhbHVlc0FyZURpZmZlcmVudChjb2x1bW5EZWZpbml0aW9uLCBqb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSkpIHsKLQkJCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihjb2x1bW5EZWZpbml0aW9uKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9CYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRlZTk0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW51bVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IExvYkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEJhc2ljTWFwcGluZwotICogQHNlZSBCYXNlSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICogQHNlZSBFbnVtVHlwZUNvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgTG9iQ29tcG9zaXRlCi0gKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCi0gKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxCYXNpY01hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlPEJhc2ljTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklCYXNpY01hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgQmFzaWNNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDb2x1bW4+IGJ1aWxkQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2ljTWFwcGluZywgQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbHVtbiB0cmFuc2Zvcm1fKEJhc2ljTWFwcGluZyB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCi0JCS8vIENvbHVtbiB3aWRnZXRzCi0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQkvLyBBbGlnbiB0aGUgd2lkZ2V0cyB1bmRlciB0aGUgQ29sdW1uQ29tcG9zaXRlCi0JCWNvbnRhaW5lciA9IGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7Ci0KLQkJLy8gRmV0Y2ggVHlwZSB3aWRnZXRzCi0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBUZW1wb3JhbCBUeXBlIHdpZGdldHMKLQkJbmV3IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCi0JCS8vIEVudW1lcmF0ZWQgd2lkZ2V0cwotCQluZXcgRW51bVR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBPcHRpb25hbCB3aWRnZXRzCi0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBidWlsZFN1YlBhbmUoY29udGFpbmVyLCA0KSk7Ci0KLQkJLy8gTG9iIGNoZWNrIGJveAotCQluZXcgTG9iQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ2FzY2FkZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9DYXNjYWRlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMDFmZjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9DYXNjYWRlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLSBDYXNjYWRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IHggQWxsICAgICAgIHggUGVyc2lzdCAgIHggTWVyZ2UgICAgIHggUmVtb3ZlICAgIHggUmVmcmVzaCAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIENhc2NhZGUKLSAqIEBzZWUgUmVsYXRpb25zaGlwTWFwcGluZwotICogQHNlZSBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXNjYWRlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxDYXNjYWRlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2FzY2FkZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUNhc2NhZGU8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDYXNjYWRlQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDYXNjYWRlPiBzdWJqZWN0SG9sZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db2x1bW5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JQ2FzY2FkZTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBDYXNjYWRlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQ2FzY2FkZT4gc3ViamVjdEhvbGRlciwKLQkJICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkJICAgICAgICAgICAgICAgICAgICAgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhc2NhZGVUeXBlQWxsSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYXNjYWRlLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENhc2NhZGUuQUxMX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmlzQWxsKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldEFsbCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhc2NhZGVUeXBlTWVyZ2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhc2NhZGUsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ2FzY2FkZS5NRVJHRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pc01lcmdlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldE1lcmdlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ2FzY2FkZVR5cGVQZXJzaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYXNjYWRlLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENhc2NhZGUuUEVSU0lTVF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pc1BlcnNpc3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0UGVyc2lzdCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhc2NhZGVUeXBlUmVmcmVzaEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FzY2FkZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYXNjYWRlLlJFRlJFU0hfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaXNSZWZyZXNoKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFJlZnJlc2godmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDYXNjYWRlVHlwZVJlbW92ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FzY2FkZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYXNjYWRlLlJFTU9WRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pc1JlbW92ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRSZW1vdmUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIENhc2NhZGUgZ3JvdXAKLQkJR3JvdXAgY2FzY2FkZUdyb3VwID0gYnVpbGRUaXRsZWRQYW5lKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNhc2NhZGVDb21wb3NpdGVfY2FzY2FkZVRpdGxlCi0JCSk7Ci0KLQkJLy8gQ29udGFpbmVyIG9mIHRoZSBjaGVjayBib3hlcwotCQljb250YWluZXIgPSBidWlsZFN1YlBhbmUoY2FzY2FkZUdyb3VwLCA1LCA4LCAwLCAwLCAwKTsKLQotCQkvLyBBbGwgY2hlY2sgYm94Ci0JCWJ1aWxkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ2FzY2FkZUNvbXBvc2l0ZV9hbGwsCi0JCQlidWlsZENhc2NhZGVUeXBlQWxsSG9sZGVyKCkKLQkJKTsKLQotCQkvLyBQZXJzaXN0IGNoZWNrIGJveAotCQlidWlsZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNhc2NhZGVDb21wb3NpdGVfcGVyc2lzdCwKLQkJCWJ1aWxkQ2FzY2FkZVR5cGVQZXJzaXN0SG9sZGVyKCkKLQkJKTsKLQotCQkvLyBNZXJnZSBjaGVjayBib3gKLQkJYnVpbGRDaGVja0JveCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5DYXNjYWRlQ29tcG9zaXRlX21lcmdlLAotCQkJYnVpbGRDYXNjYWRlVHlwZU1lcmdlSG9sZGVyKCkKLQkJKTsKLQotCQkvLyBSZW1vdmUgY2hlY2sgYm94Ci0JCWJ1aWxkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ2FzY2FkZUNvbXBvc2l0ZV9yZW1vdmUsCi0JCQlidWlsZENhc2NhZGVUeXBlUmVtb3ZlSG9sZGVyKCkKLQkJKTsKLQotCQkvLyBSZWZyZXNoIGNoZWNrIGJveAotCQlidWlsZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNhc2NhZGVDb21wb3NpdGVfcmVmcmVzaCwKLQkJCWJ1aWxkQ2FzY2FkZVR5cGVSZWZyZXNoSG9sZGVyKCkKLQkJKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Db2x1bW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ29sdW1uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDQzNDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Db2x1bW5Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYi5Db2x1bW5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuVGFibGVDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29sdW1uQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYWJsZUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ID4gRGV0YWlscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IEluc2VydGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIHggVXBkYXRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgeCBVbmlxdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IE51bGxhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICBMZW5ndGg6ICAgICAgICAgICAgfCBJICAgICAgICAgfEl8ICBEZWZhdWx0IChYWFgpICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICBQcmVjaXNpb246ICAgICAgICAgfCBJICAgICAgICAgfEl8ICBEZWZhdWx0IChYWFgpICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICBTY2FsZTogICAgICAgICAgICAgfCBJICAgICAgICAgfEl8ICBEZWZhdWx0IChYWFgpICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICBDb2x1bW4gRGVmaW5pdGlvbjogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIENvbHVtbgotICogQHNlZSBDb2x1bW5Db21ibwotICogQHNlZSBUYWJsZUNvbWJvCi0gKiBAc2VlIEJhc2ljTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBJZE1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbHVtbkNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8Q29sdW1uPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbHVtbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUNvbHVtbjwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENvbHVtbkNvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIENvbHVtbj4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29sdW1uQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JQ29sdW1uPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCi0JICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IGNvbnRyb2xsZXI7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCi0JICovCi0JcHVibGljIENvbHVtbkNvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIENvbHVtbj4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29sdW1uQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUNvbHVtbjwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBDb2x1bW5Db21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb2x1bW4+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkNvbWJvPENvbHVtbj4gYnVpbGRDb2x1bW5Db21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDb2x1bW5Db21ibzxDb2x1bW4+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKENvbHVtbi5ERUZBVUxUX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoQ29sdW1uLkRFRkFVTFRfVEFCTEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKENvbHVtbi5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0KLQkJCQlpZiAocHJvcGVydHlOYW1lID09IENvbHVtbi5ERUZBVUxUX1RBQkxFX1BST1BFUlRZIHx8Ci0JCQkJICAgIHByb3BlcnR5TmFtZSA9PSBDb2x1bW4uU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZKSB7Ci0KLQkJCQkJZG9Qb3B1bGF0ZSgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlIHRhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGJUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29sdW1uRGVmaW5pdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29sdW1uLkNPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0Q29sdW1uRGVmaW5pdGlvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRMZW5ndGhIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb2x1bW4uREVGQVVMVF9MRU5HVEhfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdExlbmd0aCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShJbnRlZ2VyLk1JTl9WQUxVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGREZWZhdWx0TGVuZ3RoTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUxhYmVsIGxhYmVsID0gYnVpbGRMYWJlbCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0V2l0aG91dFZhbHVlCi0JCSk7Ci0KLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcigKLQkJCW5ldyBMYWJlbGVkTGFiZWwobGFiZWwpLAotCQkJYnVpbGREZWZhdWx0TGVuZ3RoTGFiZWxIb2xkZXIoKQotCQkpOwotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdExlbmd0aExhYmVsSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlciwgU3RyaW5nPihidWlsZERlZmF1bHRMZW5ndGhIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEludGVnZXIgdmFsdWUpIHsKLQotCQkJCUludGVnZXIgZGVmYXVsdFZhbHVlID0gKHN1YmplY3QoKSAhPSBudWxsKSA/IHN1YmplY3QoKS5nZXREZWZhdWx0TGVuZ3RoKCkgOgotCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbi5ERUZBVUxUX0xFTkdUSDsKLQotCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRXaXRoVmFsdWUsCi0JCQkJCWRlZmF1bHRWYWx1ZQotCQkJCSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRQcmVjaXNpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb2x1bW4uREVGQVVMVF9QUkVDSVNJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdFByZWNpc2lvbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShJbnRlZ2VyLk1JTl9WQUxVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGREZWZhdWx0UHJlY2lzaW9uTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUxhYmVsIGxhYmVsID0gYnVpbGRMYWJlbCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0V2l0aG91dFZhbHVlCi0JCSk7Ci0KLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcigKLQkJCW5ldyBMYWJlbGVkTGFiZWwobGFiZWwpLAotCQkJYnVpbGREZWZhdWx0UHJlY2lzaW9uTGFiZWxIb2xkZXIoKQotCQkpOwotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFByZWNpc2lvbkxhYmVsSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlciwgU3RyaW5nPihidWlsZERlZmF1bHRQcmVjaXNpb25Ib2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEludGVnZXIgdmFsdWUpIHsKLQotCQkJCUludGVnZXIgZGVmYXVsdFZhbHVlID0gKHN1YmplY3QoKSAhPSBudWxsKSA/IHN1YmplY3QoKS5nZXREZWZhdWx0UHJlY2lzaW9uKCkgOgotCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTjsKLQotCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRXaXRoVmFsdWUsCi0JCQkJCWRlZmF1bHRWYWx1ZQotCQkJCSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRTY2FsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbHVtbi5ERUZBVUxUX1NDQUxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldERlZmF1bHRTY2FsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkRGVmYXVsdFNjYWxlTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUxhYmVsIGxhYmVsID0gYnVpbGRMYWJlbCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0V2l0aG91dFZhbHVlCi0JCSk7Ci0KLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcigKLQkJCW5ldyBMYWJlbGVkTGFiZWwobGFiZWwpLAotCQkJYnVpbGREZWZhdWx0U2NhbGVMYWJlbEhvbGRlcigpCi0JCSk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2NhbGVMYWJlbEhvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXIsIFN0cmluZz4oYnVpbGREZWZhdWx0U2NhbGVIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEludGVnZXIgdmFsdWUpIHsKLQotCQkJCUludGVnZXIgZGVmYXVsdFZhbHVlID0gKHN1YmplY3QoKSAhPSBudWxsKSA/IHN1YmplY3QoKS5nZXREZWZhdWx0U2NhbGUoKSA6Ci0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uLkRFRkFVTFRfU0NBTEU7Ci0KLQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0V2l0aFZhbHVlLAotCQkJCQlkZWZhdWx0VmFsdWUKLQkJCQkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRJbnNlcnRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29sdW1uLlNQRUNJRklFRF9JTlNFUlRBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZEluc2VydGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEluc2VydGFibGVTdHJpbmdIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkSW5zZXJ0YWJsZUhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0KLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdEluc2VydGFibGUoKTsKLQotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX1RydWUgOgotCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCi0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9pbnNlcnRhYmxlV2l0aERlZmF1bHQsCi0JCQkJCQkJZGVmYXVsdFN0cmluZ1ZhbHVlCi0JCQkJCQkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfaW5zZXJ0YWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkTGVuZ3RoSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29sdW1uLlNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gLTEpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFNwZWNpZmllZExlbmd0aCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE51bGxhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEVfUFJPUEVSVFksCi0JCQlDb2x1bW4uU1BFQ0lGSUVEX05VTExBQkxFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZE51bGxhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFNwZWNpZmllZE51bGxhYmxlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROdWxsYWJsZVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkTnVsbGFibGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0TnVsbGFibGUoKTsKLQotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX1RydWUgOgotCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCi0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9udWxsYWJsZVdpdGhEZWZhdWx0LAotCQkJCQkJCWRlZmF1bHRTdHJpbmdWYWx1ZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX251bGxhYmxlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRQcmVjaXNpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb2x1bW4uU1BFQ0lGSUVEX1BSRUNJU0lPTl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0U3BlY2lmaWVkUHJlY2lzaW9uKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2NhbGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbHVtbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb2x1bW4uU1BFQ0lGSUVEX1NDQUxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZFNjYWxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gLTEpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFNwZWNpZmllZFNjYWxlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlQ29tYm88Q29sdW1uPiBidWlsZFRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgVGFibGVDb21ibzxDb2x1bW4+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKENvbHVtbi5ERUZBVUxUX1RBQkxFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChDb2x1bW4uU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hTmFtZSgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkVGFibGUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZSB0YWJsZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERiVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB2YWx1ZXMoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRPd25lcigpLmdldFR5cGVNYXBwaW5nKCkuYXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVW5pcXVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ29sdW1uLkRFRkFVTFRfVU5JUVVFX1BST1BFUlRZLAotCQkJQ29sdW1uLlNQRUNJRklFRF9VTklRVUVfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkVW5pcXVlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFNwZWNpZmllZFVuaXF1ZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVW5pcXVlU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZFVuaXF1ZUhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0KLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdFVuaXF1ZSgpOwotCi0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6Ci0JCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0KLQkJCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZVdpdGhEZWZhdWx0LAotCQkJCQkJCWRlZmF1bHRTdHJpbmdWYWx1ZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXBkYXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2x1bW4sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ29sdW1uLkRFRkFVTFRfVVBEQVRBQkxFX1BST1BFUlRZLAotCQkJQ29sdW1uLlNQRUNJRklFRF9VUERBVEFCTEVfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFNwZWNpZmllZFVwZGF0YWJsZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXBkYXRhYmxlU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZFVwZGF0YWJsZUhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0KLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdFVwZGF0YWJsZSgpOwotCi0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6Ci0JCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0KLQkJCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZVdpdGhEZWZhdWx0LAotCQkJCQkJCWRlZmF1bHRTdHJpbmdWYWx1ZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURldGFpbHNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBJbnNlcnRhYmxlIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkJYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCA0KSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfaW5zZXJ0YWJsZSwKLQkJCWJ1aWxkSW5zZXJ0YWJsZUhvbGRlcigpLAotCQkJYnVpbGRJbnNlcnRhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9JTlNFUlRBQkxFCi0JCSk7Ci0KLQkJLy8gVXBkYXRhYmxlIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkJYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZSwKLQkJCWJ1aWxkVXBkYXRhYmxlSG9sZGVyKCksCi0JCQlidWlsZFVwZGF0YWJsZVN0cmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVVBEQVRBQkxFCi0JCSk7Ci0KLQkJLy8gVW5pcXVlIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkJYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZSwKLQkJCWJ1aWxkVW5pcXVlSG9sZGVyKCksCi0JCQlidWlsZFVuaXF1ZVN0cmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVU5JUVVFCi0JCSk7Ci0KLQkJLy8gTnVsbGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAotCQlidWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbnVsbGFibGUsCi0JCQlidWlsZE51bGxhYmxlSG9sZGVyKCksCi0JCQlidWlsZE51bGxhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9OVUxMQUJMRQotCQkpOwotCi0JCS8vIExlbmd0aCB3aWRnZXRzCi0JCVNwaW5uZXIgbGVuZ3RoU3Bpbm5lciA9IGJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2xlbmd0aCwKLQkJCWJ1aWxkTGVuZ3RoSG9sZGVyKCksCi0JCQktMSwKLQkJCS0xLAotCQkJSW50ZWdlci5NQVhfVkFMVUUsCi0JCQlidWlsZERlZmF1bHRMZW5ndGhMYWJlbChjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fTEVOR1RICi0JCSk7Ci0KLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyLCBsZW5ndGhTcGlubmVyKTsKLQotCQkvLyBQcmVjaXNpb24gd2lkZ2V0cwotCQlTcGlubmVyIHByZWNpc2lvblNwaW5uZXIgPSBidWlsZExhYmVsZWRTcGlubmVyKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9wcmVjaXNpb24sCi0JCQlidWlsZFByZWNpc2lvbkhvbGRlcigpLAotCQkJLTEsCi0JCQktMSwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJYnVpbGREZWZhdWx0UHJlY2lzaW9uTGFiZWwoY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX1BSRUNJU0lPTgotCQkpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lciwgcHJlY2lzaW9uU3Bpbm5lcik7Ci0KLQkJLy8gU2NhbGUgd2lkZ2V0cwotCQlTcGlubmVyIHNjYWxlU3Bpbm5lciA9IGJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3NjYWxlLAotCQkJYnVpbGRTY2FsZUhvbGRlcigpLAotCQkJLTEsCi0JCQktMSwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJYnVpbGREZWZhdWx0U2NhbGVMYWJlbChjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fU0NBTEUKLQkJKTsKLQotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIsIHNjYWxlU3Bpbm5lcik7Ci0KLQkJLy8gQ29sdW1uIERlZmluaXRpb24gd2lkZ2V0cwotCQlidWlsZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5EZWZpbml0aW9uLAotCQkJYnVpbGRDb2x1bW5EZWZpbml0aW9uSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBDb2x1bW4gZ3JvdXAgcGFuZQotCQljb250YWluZXIgPSBidWlsZFRpdGxlZFBhbmUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2NvbHVtblNlY3Rpb24KLQkJKTsKLQotCQkvLyBDb2x1bW4gd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX25hbWUsCi0JCQlidWlsZENvbHVtbkNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTgotCQkpOwotCi0JCS8vIFRhYmxlIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV90YWJsZSwKLQkJCWJ1aWxkVGFibGVDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVEFCTEUKLQkJKTsKLQotCQkvLyBEZXRhaWxzIHN1Yi1wYW5lCi0JCWNvbnRhaW5lciA9IGJ1aWxkQ29sbGFwc2FibGVTdWJTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9kZXRhaWxzLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKQotCQkpOwotCi0JCWluaXRpYWxpemVEZXRhaWxzUGFuZShidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCAxNikpOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGxheW91dCBvZiB0aGUgZ2l2ZW4gY29udGFpbmVyIGJ5IGNoYW5naW5nIHdoaWNoIHdpZGdldCB3aWxsCi0JICogZ3JhYiB0aGUgZXhjZXNzIG9mIGhvcml6b250YWwgc3BhY2UuIEJ5IGRlZmF1bHQsIHRoZSBjZW50ZXIgY29udHJvbCBncmFicwotCSAqIHRoZSBleGNlc3Mgc3BhY2UsIHdlIGNoYW5nZSBpdCB0byBiZSB0aGUgcmlnaHQgY29udHJvbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBjb250YWluaW5nIHRoZSBjb250cm9scyBuZWVkaW5nIHRoZWlyCi0JICogPGNvZGU+R3JpZERhdGE8L2NvZGU+IHRvIGJlIG1vZGlmaWVkIGZyb20gdGhlIGRlZmF1bHQgdmFsdWVzCi0JICogQHBhcmFtIHNwaW5uZXIgVGhlIHNwaW5uZXIgdGhhdCBnb3QgY3JlYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyLCBTcGlubmVyIHNwaW5uZXIpIHsKLQotCQkvLyBJdCBpcyBwb3NzaWJsZSB0aGUgc3Bpbm5lcidzIHBhcmVudCBpcyBub3QgdGhlIGNvbnRhaW5lciBvZiB0aGUKLQkJLy8gbGFiZWwsIHNwaW5uZXIgYW5kIHJpZ2h0IGNvbnRyb2wgKGEgcGFuZSBpcyBzb21ldGltZXMgcmVxdWlyZWQgZm9yCi0JCS8vIHBhaW50aW5nIHRoZSBzcGlubmVyJ3MgYm9yZGVyKQotCQlDb21wb3NpdGUgcGFuZUNvbnRhaW5lciA9IHNwaW5uZXIuZ2V0UGFyZW50KCk7Ci0KLQkJd2hpbGUgKGNvbnRhaW5lciAhPSBwYW5lQ29udGFpbmVyLmdldFBhcmVudCgpKSB7Ci0JCQlwYW5lQ29udGFpbmVyID0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKTsKLQkJfQotCi0JCUNvbnRyb2xbXSBjb250cm9scyA9IHBhbmVDb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWNvbnRyb2xzWzFdLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWNvbnRyb2xzWzJdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmVBbGlnblJpZ2h0KGNvbnRyb2xzWzJdKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkMDFlNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcGFuZSBkb2VzIG5vdCBoYXZlIGFueSB3aWRnZXRzLgotICoKLSAqIEBzZWUgRW1iZWRkYWJsZQotICogQHNlZSBCYXNlSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIEVtYmVkZGFibGVVaVByb3ZpZGVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbWJlZGRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxFbWJlZGRhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGU8RW1iZWRkYWJsZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRW1iZWRkYWJsZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MzRjYjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IE92ZXJyaWRlIERlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW1iZWRkZWRNYXBwaW5nCi0gKiBAc2VlIEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPEJhc2VFbWJlZGRlZE1hcHBpbmc+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVIb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBCYXNlRW1iZWRkZWRNYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUVtYmVkZGVkTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEJhc2VFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+KCk7Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gYnVpbGRPdmVycmlkZURpc3BsYXlTdHJpbmcoKEF0dHJpYnV0ZU92ZXJyaWRlKSBlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVzTGlzdEhvbGRlcigpIHsKLQkJTGlzdDxMaXN0VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlPiwgQXR0cmlidXRlT3ZlcnJpZGU+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVzTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxBdHRyaWJ1dGVPdmVycmlkZT4oCi0JCQlidWlsZEF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RIb2xkZXIoKSwKLQkJCUJhc2VPdmVycmlkZS5OQU1FX1BST1BFUlRZCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29sdW1uPiBidWlsZENvbHVtbkhvbGRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZSwgQ29sdW1uPihhdHRyaWJ1dGVPdmVycmlkZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sdW1uIHRyYW5zZm9ybV8oQXR0cmlidXRlT3ZlcnJpZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4gYnVpbGREZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxCYXNlRW1iZWRkZWRNYXBwaW5nLCBBdHRyaWJ1dGVPdmVycmlkZT4oCi0JCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUJhc2VFbWJlZGRlZE1hcHBpbmcuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT3ZlcnJpZGVEZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVFbmFibGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlLCBCb29sZWFuPihhdHRyaWJ1dGVPdmVycmlkZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oQXR0cmlidXRlT3ZlcnJpZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlICE9IG51bGwpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZURlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlLCBCb29sZWFuPihhdHRyaWJ1dGVPdmVycmlkZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdXBkYXRlQXNzb2NpYXRpb25PdmVycmlkZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhBdHRyaWJ1dGVPdmVycmlkZSB2YWx1ZSkgewotCQkJCXJldHVybiAhdmFsdWUuaXNWaXJ0dWFsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRPdmVycmlkZURpc3BsYXlTdHJpbmcoQXR0cmlidXRlT3ZlcnJpZGUgb3ZlcnJpZGUpIHsKLQotCQlTdHJpbmcgbmFtZSA9IG92ZXJyaWRlLmdldE5hbWUoKTsKLQotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lKSkgewotCQkJbmFtZSA9IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5PdmVycmlkZXNDb21wb3NpdGVfbm9OYW1lOwotCQl9Ci0JCWVsc2UgewotCQkJbmFtZSA9IG5hbWUudHJpbSgpOwotCQl9Ci0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4gYnVpbGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEJhc2VFbWJlZGRlZE1hcHBpbmcsIEF0dHJpYnV0ZU92ZXJyaWRlPigKLQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQmFzZUVtYmVkZGVkTWFwcGluZy5TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFU19MSVNUKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyID0gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUhvbGRlcigpOwotCX0KLQotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8QmFzZUVtYmVkZGVkTWFwcGluZz4gaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlc0xpc3QoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8QmFzZUVtYmVkZGVkTWFwcGluZz4oCi0JCQl0aGlzLAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgOCksCi0JCQlidWlsZEF0dHJpYnV0ZU92ZXJyaWRlc0FkYXB0ZXIoKSwKLQkJCWJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVzTGlzdE1vZGVsKCksCi0JCQlhdHRyaWJ1dGVPdmVycmlkZUhvbGRlciwKLQkJCWJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVMYWJlbFByb3ZpZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0VNQkVEREVEX0FUVFJJQlVURV9PVkVSUklERVMKLQkJKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCdXR0b25QYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIEF0dHJpYnV0ZSBPdmVycmlkZXMgZ3JvdXAgYm94Ci0JCWNvbnRhaW5lciA9IGJ1aWxkVGl0bGVkUGFuZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5BdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGVfYXR0cmlidXRlT3ZlcnJpZGVzCi0JCSk7Ci0KLQkJLy8gQXR0cmlidXRlIE92ZXJyaWRlcyBsaXN0Ci0JCWluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNMaXN0KGNvbnRhaW5lcik7Ci0KLQkJLy8gUHJvcGVydHkgcGFuZQotCQlpbml0aWFsaXplUHJvcGVydHlQYW5lKGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDUsIDApKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnR5UGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBjaGVjayBib3gKLQkJQnV0dG9uIG92ZXJyaWRlRGVmYXVsdEJ1dHRvbiA9IGJ1aWxkQ2hlY2tCb3goCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbigpKSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5BdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0LAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZUhvbGRlcigpCi0JCSk7Ci0KLQkJcmVtb3ZlRnJvbUVuYWJsZW1lbnRDb250cm9sKG92ZXJyaWRlRGVmYXVsdEJ1dHRvbik7Ci0JCWluc3RhbGxPdmVycmlkZURlZmF1bHRCdXR0b25FbmFibGVyKG92ZXJyaWRlRGVmYXVsdEJ1dHRvbik7Ci0KLQkJLy8gQ29sdW1uIHdpZGdldHMKLQkJQ29sdW1uQ29tcG9zaXRlIGNvbHVtbkNvbXBvc2l0ZSA9IG5ldyBDb2x1bW5Db21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRDb2x1bW5Ib2xkZXIoYXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIpLAotCQkJY29udGFpbmVyCi0JCSk7Ci0KLQkJaW5zdGFsbENvbHVtbkNvbXBvc2l0ZUVuYWJsZXIoY29sdW1uQ29tcG9zaXRlKTsKLQkJcmVtb3ZlRnJvbUVuYWJsZW1lbnRDb250cm9sKGNvbHVtbkNvbXBvc2l0ZS5nZXRDb250cm9sKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsQ29sdW1uQ29tcG9zaXRlRW5hYmxlcihDb2x1bW5Db21wb3NpdGUgY29sdW1uQ29tcG9zaXRlKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcigKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIoKSwKLQkJCWNvbHVtbkNvbXBvc2l0ZQotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsT3ZlcnJpZGVEZWZhdWx0QnV0dG9uRW5hYmxlcihCdXR0b24gb3ZlcnJpZGVEZWZhdWx0QnV0dG9uKSB7Ci0JCW5ldyBDb250cm9sRW5hYmxlcigKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVFbmFibGVySG9sZGVyKCksCi0JCQlvdmVycmlkZURlZmF1bHRCdXR0b24KLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQXNzb2NpYXRpb25PdmVycmlkZShib29sZWFuIHNlbGVjdGVkKSB7Ci0KLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCXRyeSB7Ci0JCQlBdHRyaWJ1dGVPdmVycmlkZSBvdmVycmlkZSA9IHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIuZ2V0VmFsdWUoKTsKLQotCQkJQXR0cmlidXRlT3ZlcnJpZGUgbmV3T3ZlcnJpZGUgPSBvdmVycmlkZS5zZXRWaXJ0dWFsKCFzZWxlY3RlZCk7Ci0JCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyLnNldFZhbHVlKG5ld092ZXJyaWRlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxODUxMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUncyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW1iZWRkZWRJZE1hcHBpbmcKLSAqIEBzZWUgQmFzZUpwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTxFbWJlZGRlZElkTWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZTxFbWJlZGRlZElkTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+RW1iZWRkZWRJZE1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0M2RlZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVtYmVkZGVkTWFwcGluZwotICogQHNlZSBCYXNlSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTxFbWJlZGRlZE1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlPEVtYmVkZGVkTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkVtYmVkZGVkTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbnRpdHlOYW1lQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VudGl0eU5hbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyMDA1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VudGl0eU5hbWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEVudGl0eSBOYW1lOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHkKLSAqIEBzZWUgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5TmFtZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnRpdHlOYW1lQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFbnRpdHlOYW1lQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgRW50aXR5PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0RW50aXR5TmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LkRFRkFVTFRfTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBkZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdEVudGl0eU5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZERlZmF1bHRFbnRpdHlOYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRFbnRpdHlOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIEVudGl0eS5ERUZBVUxUX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQotCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXRTcGVjaWZpZWROYW1lKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBkZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlzdWJqZWN0LnNldFNwZWNpZmllZE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZShFbnRpdHkgc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0TmFtZSgpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnRpdHlHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0RW1wdHk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDQ29tYm8gY29tYm8gPSBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnRpdHlOYW1lQ29tcG9zaXRlX25hbWUsCi0JCQlidWlsZERlZmF1bHRFbnRpdHlOYW1lTGlzdEhvbGRlcigpLAotCQkJYnVpbGRFbnRpdHlOYW1lSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfTkFNRQotCQkpOwotCi0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbnVtVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbnVtVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhhNzQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW51bVR5cGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEVudW0gVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBCYXNpY01hcHBpbmcKLSAqIEBzZWUgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVudW1UeXBlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxCYXNpY01hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5GZXRjaFR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVudW1UeXBlQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIEJhc2ljTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEJhc2ljTWFwcGluZywgRW51bVR5cGU+IGJ1aWxkRW51bVR5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEJhc2ljTWFwcGluZywgRW51bVR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEJhc2ljTWFwcGluZy5ERUZBVUxUX0VOVU1FUkFURURfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEJhc2ljTWFwcGluZy5TUEVDSUZJRURfRU5VTUVSQVRFRF9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVudW1UeXBlW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRW51bVR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVudW1UeXBlIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRFbnVtZXJhdGVkKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEVudW1UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLmNsYXNzLAotCQkJCQlFbnVtVHlwZUNvbXBvc2l0ZS50aGlzLAotCQkJCQl2YWx1ZQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVudW1UeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEVudW1UeXBlIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZEVudW1lcmF0ZWQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5CYXNpY0dlbmVyYWxTZWN0aW9uX2VudW1lcmF0ZWRMYWJlbCwKLQkJCWJ1aWxkRW51bVR5cGVDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19FTlVNRVJBVEVECi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9GZXRjaFR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRmV0Y2hUeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNzUyNDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9GZXRjaFR5cGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBGZXRjaDogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRmV0Y2hhYmxlCi0gKiBAc2VlIEJhc2ljTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKiBAc2VlIE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqIEBzZWUgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKiBAc2VlIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICogQHNlZSBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmV0Y2hUeXBlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxGZXRjaGFibGU+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RmV0Y2hUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBGZXRjaFR5cGVDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgRmV0Y2hhYmxlPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEZldGNoYWJsZSwgRmV0Y2hUeXBlPiBidWlsZEZldGNoVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RmV0Y2hhYmxlLCBGZXRjaFR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEZldGNoYWJsZS5ERUZBVUxUX0ZFVENIX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChGZXRjaGFibGUuU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRmV0Y2hUeXBlW10gY2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRmV0Y2hUeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBGZXRjaFR5cGUgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdEZldGNoKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEZldGNoVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5jbGFzcywKLQkJCQkJRmV0Y2hUeXBlQ29tcG9zaXRlLnRoaXMsCi0JCQkJCXZhbHVlCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkRmV0Y2goKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShGZXRjaFR5cGUgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkRmV0Y2godmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5CYXNpY0dlbmVyYWxTZWN0aW9uX2ZldGNoTGFiZWwsCi0JCQlidWlsZEZldGNoVHlwZUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0ZFVENIX1RZUEUKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNDk5ZTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgU3RyYXRlZ3k6ICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgR2VuZXJhdG9yIE5hbWU6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIElkTWFwcGluZwotICogQHNlZSBHZW5lcmF0ZWRWYWx1ZQotICogQHNlZSBHZW5lcmF0aW9uQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPElkTWFwcGluZz4KLXsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZ2VuZXJhdGVkVmFsdWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCXByaXZhdGUgQ0NvbWJvIGdlbmVyYXRvck5hbWVDb21ibzsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZ2VuZXJhdG9yTmFtZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgZ2VuZXJhdG9yc0xpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+R2VuZXJhdGVkVmFsdWVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIElkTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRHZW5lcmF0ZWRWYWx1ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoCi0JCQlidWlsZEdlbmVyYXRlZFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEdlbmVyYXRlZFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlkaXNlbmdhZ2VMaXN0ZW5lcnMoKEdlbmVyYXRlZFZhbHVlKSBlLmdldE9sZFZhbHVlKCkpOwotCQkJCWVuZ2FnZUxpc3RlbmVycygoR2VuZXJhdGVkVmFsdWUpIGUuZ2V0TmV3VmFsdWUoKSk7Ci0KLQkJCQlpZiAoIWlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0KLQkJCQkJdHJ5IHsKLQkJCQkJCXBvcHVsYXRlR2VuZXJhdG9yTmFtZUNvbWJvKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGJ1aWxkR2VuZXJhdG9yTmFtZU1vZGlmeUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgZ2VuZXJhdG9yTmFtZSA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCQkJR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSBzdWJqZWN0KCkuZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQotCQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdlbmVyYXRvck5hbWUpKSB7Ci0KLQkJCQkJaWYgKChnZW5lcmF0ZWRWYWx1ZSA9PSBudWxsKSB8fAotCQkJCQkgICAgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSkpCi0JCQkJCXsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCWdlbmVyYXRvck5hbWUgPSBudWxsOwotCQkJCX0KLQotCQkJCXJldHJpZXZlR2VuZXJhdGVkVmFsdWUoKS5zZXRTcGVjaWZpZWRHZW5lcmF0b3IoZ2VuZXJhdG9yTmFtZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkR2VuZXJhdG9yTmFtZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoCi0JCQlidWlsZEdlbmVyYXRvck5hbWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkR2VuZXJhdG9yTmFtZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKCFpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCQkJCXRyeSB7Ci0JCQkJCQlwb3B1bGF0ZUdlbmVyYXRvck5hbWUoKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkR2VuZXJhdG9yc0xpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKAotCQkJYnVpbGRHZW5lcmF0b3JzTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZEdlbmVyYXRvcnNMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQkvLyBzaG91bGQgb25seSBoYXZlIHRvIGxpc3RlbiB0byB0aGlzIGV2ZW50IC0gb3RoZXJzIGFyZW4ndCBjcmVhdGVkCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoISBpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCQkJCXRyeSB7Ci0JCQkJCQlwb3B1bGF0ZUdlbmVyYXRvckNob2ljZXMoKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdGVkVmFsdWU+IGJ1aWxkR2VuZXJhdG9yVmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPElkTWFwcGluZywgR2VuZXJhdGVkVmFsdWU+KGdldFN1YmplY3RIb2xkZXIoKSwgSWRNYXBwaW5nLkdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgR2VuZXJhdGVkVmFsdWUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxHZW5lcmF0ZWRWYWx1ZSwgR2VuZXJhdGlvblR5cGU+IGJ1aWxkU3RyYXRlZ3lDb21ib1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEdlbmVyYXRlZFZhbHVlLCBHZW5lcmF0aW9uVHlwZT4odGhpcywgYnVpbGRHZW5lcmF0b3JWYWx1ZUhvbGRlcigpLCBwYXJlbnQpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChHZW5lcmF0ZWRWYWx1ZS5ERUZBVUxUX1NUUkFURUdZX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChHZW5lcmF0ZWRWYWx1ZS5TUEVDSUZJRURfU1RSQVRFR1lfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZVtdIGNob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEdlbmVyYXRpb25UeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0U3RyYXRlZ3koKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoR2VuZXJhdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuY2xhc3MsCi0JCQkJCUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLnRoaXMsCi0JCQkJCXZhbHVlCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgR2VuZXJhdGlvblR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRTdHJhdGVneSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEdlbmVyYXRpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0cmlldmVHZW5lcmF0ZWRWYWx1ZSgpLnNldFNwZWNpZmllZFN0cmF0ZWd5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKEdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlKSB7Ci0KLQkJaWYgKGdlbmVyYXRlZFZhbHVlICE9IG51bGwpIHsKLQotCQkJZ2VuZXJhdGVkVmFsdWUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlHZW5lcmF0ZWRWYWx1ZS5ERUZBVUxUX0dFTkVSQVRPUl9QUk9QRVJUWSwKLQkJCQlnZW5lcmF0b3JOYW1lUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCQkJKTsKLQotCQkJZ2VuZXJhdGVkVmFsdWUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlHZW5lcmF0ZWRWYWx1ZS5TUEVDSUZJRURfR0VORVJBVE9SX1BST1BFUlRZLAotCQkJCWdlbmVyYXRvck5hbWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JCQkpOwotCi0JCQlnZW5lcmF0ZWRWYWx1ZS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUGVyc2lzdGVuY2VVbml0LkdFTkVSQVRPUlNfTElTVCwKLQkJCQlnZW5lcmF0b3JzTGlzdENoYW5nZUxpc3RlbmVyCi0JCQkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKElkTWFwcGluZyBzdWJqZWN0KSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZUxpc3RlbmVycyhzdWJqZWN0KTsKLQotCQlpZiAoc3ViamVjdCAhPSBudWxsKSB7Ci0JCQlzdWJqZWN0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJSWRNYXBwaW5nLkdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSwKLQkJCQlnZW5lcmF0ZWRWYWx1ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLQkJCSk7Ci0JCQlkaXNlbmdhZ2VMaXN0ZW5lcnMoc3ViamVjdC5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJcG9wdWxhdGVHZW5lcmF0b3JOYW1lQ29tYm8oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5nYWdlTGlzdGVuZXJzKEdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlKSB7Ci0KLQkJaWYgKGdlbmVyYXRlZFZhbHVlICE9IG51bGwpIHsKLQotCQkJZ2VuZXJhdGVkVmFsdWUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlHZW5lcmF0ZWRWYWx1ZS5ERUZBVUxUX0dFTkVSQVRPUl9QUk9QRVJUWSwKLQkJCQlnZW5lcmF0b3JOYW1lUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCQkJKTsKLQotCQkJZ2VuZXJhdGVkVmFsdWUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlHZW5lcmF0ZWRWYWx1ZS5TUEVDSUZJRURfR0VORVJBVE9SX1BST1BFUlRZLAotCQkJCWdlbmVyYXRvck5hbWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JCQkpOwotCi0JCQlnZW5lcmF0ZWRWYWx1ZS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUGVyc2lzdGVuY2VVbml0LkdFTkVSQVRPUlNfTElTVCwKLQkJCQlnZW5lcmF0b3JzTGlzdENoYW5nZUxpc3RlbmVyCi0JCQkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKElkTWFwcGluZyBzdWJqZWN0KSB7Ci0JCXN1cGVyLmVuZ2FnZUxpc3RlbmVycyhzdWJqZWN0KTsKLQotCQlpZiAoc3ViamVjdCAhPSBudWxsKSB7Ci0JCQllbmdhZ2VMaXN0ZW5lcnMoc3ViamVjdC5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJCXN1YmplY3QuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlJZE1hcHBpbmcuR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZLAotCQkJCWdlbmVyYXRlZFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCQkJKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQlnZW5lcmF0ZWRWYWx1ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSBidWlsZEdlbmVyYXRlZFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQlnZW5lcmF0b3JOYW1lUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciAgPSBidWlsZEdlbmVyYXRvck5hbWVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCWdlbmVyYXRvcnNMaXN0Q2hhbmdlTGlzdGVuZXIgPSBidWlsZEdlbmVyYXRvcnNMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBTdHJhdGVneSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9zdHJhdGVneSwKLQkJCWJ1aWxkU3RyYXRlZ3lDb21ib1ZpZXdlcihjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19HRU5FUkFURURfVkFMVUVfU1RSQVRFR1kKLQkJKTsKLQotCQkvLyBHZW5lcmF0b3IgTmFtZSB3aWRnZXRzCi0JCWdlbmVyYXRvck5hbWVDb21ibyA9IGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2dlbmVyYXRvck5hbWUsCi0JCQlidWlsZEdlbmVyYXRvck5hbWVNb2RpZnlMaXN0ZW5lcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19HRU5FUkFURURfVkFMVUVfU1RSQVRFR1kKLQkJKTsKLQotCQlnZW5lcmF0b3JOYW1lQ29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUNvbXBvc2l0ZV9kZWZhdWx0RW1wdHkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUdlbmVyYXRvckNob2ljZXMoKSB7Ci0JCWlmIChzdWJqZWN0KCkgPT0gbnVsbCkgewotCQkJdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1swXSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmdlbmVyYXRvck5hbWVDb21iby5zZXRJdGVtcyh0aGlzLnNvcnRlZFVuaXF1ZUdlbmVyYXRvck5hbWVzKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlR2VuZXJhdG9yTmFtZSgpIHsKLQkJaWYgKHN1YmplY3QoKSA9PSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRvck5hbWVDb21iby5zZXRUZXh0KCIiKTsKLQkJfQotCQllbHNlIHsKLQkJCUdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlID0gc3ViamVjdCgpLmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0KLQkJCWlmIChnZW5lcmF0ZWRWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8uc2V0VGV4dCgiIik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgZ2VuZXJhdG9yTmFtZSA9IGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpOwotCi0JCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2VuZXJhdG9yTmFtZSkpIHsKLQkJCQkJdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8uc2V0VGV4dCgiIik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCF0aGlzLmdlbmVyYXRvck5hbWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKGdlbmVyYXRvck5hbWUpKSB7Ci0JCQkJCXRoaXMuZ2VuZXJhdG9yTmFtZUNvbWJvLnNldFRleHQoZ2VuZXJhdG9yTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlR2VuZXJhdG9yTmFtZUNvbWJvKCkgewotCQlwb3B1bGF0ZUdlbmVyYXRvck5hbWUoKTsKLQkJcG9wdWxhdGVHZW5lcmF0b3JDaG9pY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmF0ZWRWYWx1ZSByZXRyaWV2ZUdlbmVyYXRlZFZhbHVlKCkgewotCQlHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSA9IHN1YmplY3QoKS5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCi0JCWlmIChnZW5lcmF0ZWRWYWx1ZSA9PSBudWxsKSB7Ci0JCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCQl0cnkgewotCQkJCWdlbmVyYXRlZFZhbHVlID0gc3ViamVjdCgpLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBnZW5lcmF0ZWRWYWx1ZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIHNvcnRlZFVuaXF1ZUdlbmVyYXRvck5hbWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmFycmF5KAotCQkJQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCgKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxHZW5lcmF0b3IsIFN0cmluZz4oCi0JCQkJCQluZXcgRmlsdGVyaW5nSXRlcmF0b3I8R2VuZXJhdG9yLCBHZW5lcmF0b3I+KHN1YmplY3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpIAotCQkJCQkJewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChHZW5lcmF0b3IgbykgewotCQkJCQkJCQlyZXR1cm4gby5nZXROYW1lKCkgIT0gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQl9KQotCQkJCQl7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShHZW5lcmF0b3IgbmV4dCkgewotCQkJCQkJcmV0dXJuIG5leHQuZ2V0TmFtZSgpOwotCQkJCQl9Ci0JCQkJfSksCi0JCQluZXcgU3RyaW5nWzBdKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiYzFhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9ySG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgdiBQcmltYXJ5IEtleSBHZW5lcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIHggUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgfCBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB2IFRhYmxlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgeCBUYWJsZSBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgfCBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB2IFNlcXVlbmNlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgeCBTZXF1ZW5jZSBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgfCBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIElkTWFwcGluZwotICogQHNlZSBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZQotICogQHNlZSBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZQotICogQHNlZSBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZQotICogQHNlZSBJZE1hcHBpbmdDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8SWRNYXBwaW5nPgotewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gc2VxdWVuY2VHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkdlbmVyYXRpb25Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEdlbmVyYXRpb25Db21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgSWRNYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUHJpbWFyeUtleUdlbmVyYXRpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPElkTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBJZE1hcHBpbmcuR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldEdlbmVyYXRlZFZhbHVlKCkgIT0gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlICYmIChzdWJqZWN0LmdldEdlbmVyYXRlZFZhbHVlKCkgPT0gbnVsbCkpIHsKLQkJCQkJc3ViamVjdC5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQkJCX0KLQkJCQllbHNlIGlmICghdmFsdWUgJiYgKHN1YmplY3QuZ2V0R2VuZXJhdGVkVmFsdWUoKSAhPSBudWxsKSkgewotCQkJCQlzdWJqZWN0LnJlbW92ZUdlbmVyYXRlZFZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPElkTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBHZW5lcmF0b3JIb2xkZXIuU0VRVUVOQ0VfR0VORVJBVE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlICYmIChzdWJqZWN0LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgPT0gbnVsbCkpIHsKLQotCQkJCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IHN1YmplY3QuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCQkJR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSBzdWJqZWN0LmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0KLQkJCQkJaWYgKChnZW5lcmF0ZWRWYWx1ZSAhPSBudWxsKSAmJgotCQkJCQkgICAgKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpICE9IG51bGwpKQotCQkJCQl7Ci0JCQkJCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXROYW1lKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICghdmFsdWUgJiYgKHN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSkgewotCQkJCQlzdWJqZWN0LnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotIAlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGFibGVHZW5lcmF0b3JCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxJZE1hcHBpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgR2VuZXJhdG9ySG9sZGVyLlRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQotCQkJCWlmICh2YWx1ZSAmJiAoc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpKSB7Ci0KLQkJCQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBzdWJqZWN0LmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQkJCUdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlID0gc3ViamVjdC5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCi0JCQkJCWlmICgoZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgJiYKLQkJCQkJICAgIChnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSAhPSBudWxsKSkKLQkJCQkJewotCQkJCQkJdGFibGVHZW5lcmF0b3Iuc2V0TmFtZShnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIXZhbHVlICYmIChzdWJqZWN0LmdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCkpIHsKLQkJCQkJc3ViamVjdC5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkKLQl7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQotCQlzZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyLnNldFZhbHVlKHN1YmplY3QoKSAhPSBudWxsICYmIHN1YmplY3QoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpOwotCQl0YWJsZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyICAgLnNldFZhbHVlKHN1YmplY3QoKSAhPSBudWxsICYmIHN1YmplY3QoKS5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQlzZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihmYWxzZSk7Ci0JCXRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIgICAgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBQcmltYXJ5IEtleSBHZW5lcmF0aW9uIHNlY3Rpb24KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3ByaW1hcnlLZXlHZW5lcmF0aW9uLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpCi0JCSk7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBjaGVjayBib3gKLQkJQnV0dG9uIHByaW1hcnlLZXlHZW5lcmF0aW9uQ2hlY2tCb3ggPSBidWlsZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvbiwKLQkJCWJ1aWxkUHJpbWFyeUtleUdlbmVyYXRpb25Ib2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfUFJJTUFSWV9LRVlfR0VORVJBVElPTgotCQkpOwotCi0JCS8vIEdlbmVyYXRlZCBWYWx1ZSB3aWRnZXRzCi0JCUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlIGdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlID0gbmV3IEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWNvbnRhaW5lcgotCQkpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCAgICAgICAgICA9IHByaW1hcnlLZXlHZW5lcmF0aW9uQ2hlY2tCb3guZ2V0Qm9yZGVyV2lkdGgoKSArIDE2OwotCi0JCWdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBUYWJsZSBHZW5lcmF0b3IgcGFuZQotCQlpbml0aWFsaXplVGFibGVHZW5lcmF0b3JQYW5lKGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDEwKSk7Ci0KLQkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIHBhbmUKLQkJaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9yUGFuZShidWlsZFN1YlBhbmUoY29udGFpbmVyLCAxMCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU2VxdWVuY2VHZW5lcmF0b3JQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3Igc3ViLXNlY3Rpb24KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVN1YlNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yLAotCQkJc2VxdWVuY2VHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlcgotCQkpOwotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBjaGVjayBib3gKLQkJQnV0dG9uIHNlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3ggPSBidWlsZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvciwKLQkJCWJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JCb29sZWFuSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUgotCQkpOwotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBwYW5lCi0JCW5ldyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCBzZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94LmdldEJvcmRlcldpZHRoKCkgKyAxNikKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRhYmxlR2VuZXJhdG9yUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gVGFibGUgR2VuZXJhdG9yIHN1Yi1zZWN0aW9uCi0JCWNvbnRhaW5lciA9IGJ1aWxkQ29sbGFwc2FibGVTdWJTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvciwKLQkJCXRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIKLQkJKTsKLQotCQlCdXR0b24gdGFibGVHZW5lcmF0b3JDaGVja0JveCA9IGJ1aWxkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yLAotCQkJYnVpbGRUYWJsZUdlbmVyYXRvckJvb2xlYW5Ib2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SCi0JCSk7Ci0KLQkJbmV3IFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDAsIHRhYmxlR2VuZXJhdG9yQ2hlY2tCb3guZ2V0Qm9yZGVyV2lkdGgoKSArIDE2KQotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRvckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0b3JDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3MDA0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3JIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGdlbmVyaWMgcGFuZSBmb3IgYSBnZW5lcmF0b3IuCi0gKgotICogQHNlZSBJZE1hcHBpbmcKLSAqIEBzZWUgR2VuZXJhdG9yCi0gKiBAc2VlIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlIC0gQSBzdWItcGFuZQotICogQHNlZSBUYWxiZUdlbmVyYXRvckNvbXBvc2l0ZSAtIEEgc3ViLXBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJhdG9yQ29tcG9zaXRlPFQgZXh0ZW5kcyBHZW5lcmF0b3I+IGV4dGVuZHMgQWJzdHJhY3RQYW5lPEdlbmVyYXRvckhvbGRlcj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkdlbmVyYXRvckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgR2VuZXJhdG9yQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgR2VuZXJhdG9ySG9sZGVyPiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkQWxsb2NhdGlvblNpemVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvciwgSW50ZWdlcj4oYnVpbGRHZW5lcmF0b3JIb2xkZXIoKSwgR2VuZXJhdG9yLlNQRUNJRklFRF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJSW50ZWdlciB2YWx1ZSA9IHN1YmplY3QuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJCQlzZXRWYWx1ZV8odmFsdWUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXJldHJpZXZlR2VuZXJhdG9yKHN1YmplY3QoKSkuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlID09IC0xKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRBbGxvY2F0aW9uU2l6ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9yLCBJbnRlZ2VyPihidWlsZEdlbmVyYXRvckhvbGRlcigpLCBHZW5lcmF0b3IuREVGQVVMVF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEludGVnZXIuTUlOX1ZBTFVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZERlZmF1bHRBbGxvY2F0aW9uU2l6ZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlMYWJlbCBsYWJlbCA9IGJ1aWxkTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRGVmYXVsdFdpdGhvdXRWYWx1ZQotCQkpOwotCi0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIoCi0JCQluZXcgTGFiZWxlZExhYmVsKGxhYmVsKSwKLQkJCWJ1aWxkRGVmYXVsdEFsbG9jYXRpb25TaXplTGFiZWxIb2xkZXIoKQotCQkpOwotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdEFsbG9jYXRpb25TaXplTGFiZWxIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEFsbG9jYXRpb25TaXplSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJbnRlZ2VyIHZhbHVlKSB7Ci0KLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRXaXRoVmFsdWUsIHZhbHVlKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gIiI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRJbml0aWFsVmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvciwgSW50ZWdlcj4oYnVpbGRHZW5lcmF0b3JIb2xkZXIoKSwgR2VuZXJhdG9yLkRFRkFVTFRfSU5JVElBTF9WQUxVRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0SW5pdGlhbFZhbHVlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEludGVnZXIuTUlOX1ZBTFVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZERlZmF1bHRJbml0aWFsVmFsdWVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBidWlsZExhYmVsKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRlZmF1bHRXaXRob3V0VmFsdWUKLQkJKTsKLQotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKAotCQkJbmV3IExhYmVsZWRMYWJlbChsYWJlbCksCi0JCQlidWlsZERlZmF1bHRJbml0aWFsVmFsdWVMYWJlbEhvbGRlcigpCi0JCSk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0SW5pdGlhbFZhbHVlTGFiZWxIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEluaXRpYWxWYWx1ZUhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSW50ZWdlciB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EZWZhdWx0V2l0aFZhbHVlLCB2YWx1ZSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuICIiOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG5ldyA8Y29kZT5JR2VuZXJhdG9yPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0IFRoZSBzdWJqZWN0IHVzZWQgdG8gcmV0cmlldmUgdGhlIGdlbmVyYXRvcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+SUdlbmVyYXRvcjwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVCBidWlsZEdlbmVyYXRvcihHZW5lcmF0b3JIb2xkZXIgc3ViamVjdCk7Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3I+IGJ1aWxkR2VuZXJhdG9ySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3JIb2xkZXIsIEdlbmVyYXRvcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBwcm9wZXJ0eU5hbWUoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgR2VuZXJhdG9yIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5nZW5lcmF0b3Ioc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRHZW5lcmF0b3JOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3IsIFN0cmluZz4oYnVpbGRHZW5lcmF0b3JIb2xkZXIoKSwgR2VuZXJhdG9yLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJCQlzZXRWYWx1ZV8odmFsdWUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJcmV0cmlldmVHZW5lcmF0b3Ioc3ViamVjdCgpKS5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRJbml0aWFsVmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvciwgSW50ZWdlcj4oYnVpbGRHZW5lcmF0b3JIb2xkZXIoKSwgR2VuZXJhdG9yLlNQRUNJRklFRF9JTklUSUFMX1ZBTFVFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCUludGVnZXIgdmFsdWUgPSBzdWJqZWN0LmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpOwotCi0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJCQlzZXRWYWx1ZV8odmFsdWUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXJldHJpZXZlR2VuZXJhdG9yKHN1YmplY3QoKSkuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSAtMSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgd2l0aG91dCBjcmVhdGluZyB0aGUgPGNvZGU+R2VuZXJhdG9yPC9jb2RlPiBmcm9tIHRoZSBzdWJqZWN0LgotCSAqCi0JICogQHJldHVybiBUaGUgPGNvZGU+R2VuZXJhdG9yPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2Vzbid0Ci0JICogZXhpc3RzCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFQgZ2VuZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCgpID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2VuZXJhdG9yKHRoaXMuc3ViamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgd2l0aG91dCBjcmVhdGluZyB0aGUgPGNvZGU+R2VuZXJhdG9yPC9jb2RlPiBmcm9tIHRoZSBzdWJqZWN0LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3QgVGhlIHN1YmplY3QgdXNlZCB0byByZXRyaWV2ZSB0aGUgZ2VuZXJhdG9yCi0JICogQHJldHVybiBUaGUgPGNvZGU+R2VuZXJhdG9yPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2Vzbid0Ci0JICogZXhpc3RzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFQgZ2VuZXJhdG9yKEdlbmVyYXRvckhvbGRlciBzdWJqZWN0KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxhYmVsZWQgc3Bpbm5lciByZXNwb25zaWJsZSB0byBlZGl0IHRoZSBhbGxvY2F0aW9uIHNpemUuIFRoZQotCSAqIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBzaG93biBhZnRlciB0aGUgc3Bpbm5lci4gQSB2YWx1ZSBvZiAtMSBtZWFucyB0aGUKLQkgKiBkZWZhdWx0IHZhbHVlIGFuZCB0aGUgbW9kZWwgaGFzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBbGxvY2F0aW9uU2l6ZVdpZGdldHMoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IGJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuR2VuZXJhdG9yQ29tcG9zaXRlX2FsbG9jYXRpb25TaXplLAotCQkJYnVpbGRBbGxvY2F0aW9uU2l6ZUhvbGRlcigpLAotCQkJLTEsCi0JCQktMSwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJYnVpbGREZWZhdWx0QWxsb2NhdGlvblNpemVMYWJlbChjb250YWluZXIpCi0JCSk7Ci0KLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyLCBzcGlubmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsYWJlbGVkIHNwaW5uZXIgcmVzcG9uc2libGUgdG8gZWRpdCB0aGUgaW5pdGlhbCB2YWx1ZS4gVGhlCi0JICogZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHNob3duIGFmdGVyIHRoZSBzcGlubmVyLiBBIHZhbHVlIG9mIC0xIG1lYW5zIHRoZQotCSAqIGRlZmF1bHQgdmFsdWUgYW5kIHRoZSBtb2RlbCBoYXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUluaXRpYWxWYWx1ZVdpZGdldHMoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IGJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuR2VuZXJhdG9yQ29tcG9zaXRlX2luaXRpYWxWYWx1ZSwKLQkJCWJ1aWxkSW5pdGlhbFZhbHVlSG9sZGVyKCksCi0JCQktMSwKLQkJCS0xLAotCQkJSW50ZWdlci5NQVhfVkFMVUUsCi0JCQlidWlsZERlZmF1bHRJbml0aWFsVmFsdWVMYWJlbChjb250YWluZXIpCi0JCSk7Ci0KLQotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIsIHNwaW5uZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgSlBBIHByb2plY3QuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBKUEEgcHJvamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3ViamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLnN1YmplY3QoKSA9PSBudWxsID8gbnVsbCA6IHRoaXMuc3ViamVjdCgpLmdldEpwYVByb2plY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lIHVzZWQgdG8gbGlzdGVuIHRvIHRoZSBJRCBtYXBwaW5nIHdoZW4gdGhlCi0JICogZ2VuZXJhdG9yIGNoYW5nZXMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0eSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2VuZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBwcm9wZXJ0eU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgPGNvZGU+R2VuZXJhdG9yPC9jb2RlPiBhbmQgaWYgaXQgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4KLQkgKiBjcmVhdGUgaXQuCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdCBUaGUgc3ViamVjdCB1c2VkIHRvIHJldHJpZXZlIHRoZSBnZW5lcmF0b3IKLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5HZW5lcmF0b3I8L2NvZGU+IHdoaWNoIHNob3VsZCBuZXZlciBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUIHJldHJpZXZlR2VuZXJhdG9yKEdlbmVyYXRvckhvbGRlciBzdWJqZWN0KSB7Ci0JCVQgZ2VuZXJhdG9yID0gdGhpcy5nZW5lcmF0b3Ioc3ViamVjdCk7Ci0KLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQlnZW5lcmF0b3IgPSB0aGlzLmJ1aWxkR2VuZXJhdG9yKHN1YmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIGdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBsYXlvdXQgb2YgdGhlIGdpdmVuIGNvbnRhaW5lciBieSBjaGFuZ2luZyB3aGljaCB3aWRnZXQgd2lsbAotCSAqIGdyYWIgdGhlIGV4Y2VzcyBvZiBob3Jpem9udGFsIHNwYWNlLiBCeSBkZWZhdWx0LCB0aGUgY2VudGVyIGNvbnRyb2wgZ3JhYnMKLQkgKiB0aGUgZXhjZXNzIHNwYWNlLCB3ZSBjaGFuZ2UgaXQgdG8gYmUgdGhlIHJpZ2h0IGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgY29udGFpbmluZyB0aGUgY29udHJvbHMgbmVlZGluZyB0aGVpcgotCSAqIDxjb2RlPkdyaWREYXRhPC9jb2RlPiB0byBiZSBtb2RpZmllZCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlcwotCSAqIEBwYXJhbSBzcGlubmVyIFRoZSBzcGlubmVyIHRoYXQgZ290IGNyZWF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3Bpbm5lciBzcGlubmVyKSB7Ci0KLQkJLy8gSXQgaXMgcG9zc2libGUgdGhlIHNwaW5uZXIncyBwYXJlbnQgaXMgbm90IHRoZSBjb250YWluZXIgb2YgdGhlCi0JCS8vIGxhYmVsLCBzcGlubmVyIGFuZCByaWdodCBjb250cm9sIChhIHBhbmUgaXMgc29tZXRpbWVzIHJlcXVpcmVkIGZvcgotCQkvLyBwYWludGluZyB0aGUgc3Bpbm5lcidzIGJvcmRlcikKLQkJQ29tcG9zaXRlIHBhbmVDb250YWluZXIgPSBzcGlubmVyLmdldFBhcmVudCgpOwotCi0JCXdoaWxlIChjb250YWluZXIgIT0gcGFuZUNvbnRhaW5lci5nZXRQYXJlbnQoKSkgewotCQkJcGFuZUNvbnRhaW5lciA9IHBhbmVDb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlDb250cm9sW10gY29udHJvbHMgPSBwYW5lQ29udGFpbmVyLmdldENoaWxkcmVuKCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQljb250cm9sc1sxXS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQljb250cm9sc1syXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmVtb3ZlQWxpZ25SaWdodChjb250cm9sc1syXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvR2VuZXJhdG9yc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0b3JzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmN2JkYjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0b3JzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3JIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IHYgVGFibGUgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IFRhYmxlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8IFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHYgU2VxdWVuY2UgR2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IFNlcXVlbmNlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8IFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBHZW5lcmF0b3JIb2xkZXIKLSAqIEBzZWUgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUKLSAqIEBzZWUgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUKLSAqIEBzZWUgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdG9yc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxHZW5lcmF0b3JIb2xkZXI+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBzZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdGFibGVHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+R2VuZXJhdG9yc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgR2VuZXJhdG9yc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIEdlbmVyYXRvckhvbGRlcj4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9ySG9sZGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvckhvbGRlci5TRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAodmFsdWUgJiYgKHN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSkgewotCQkJCQlzdWJqZWN0LmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCF2YWx1ZSAmJiAoc3ViamVjdC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpKSB7Ci0JCQkJCXN1YmplY3QucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRhYmxlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9ySG9sZGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvckhvbGRlci5UQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAodmFsdWUgJiYgKHN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSkgewotCQkJCQlzdWJqZWN0LmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCF2YWx1ZSAmJiAoc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpKSB7Ci0JCQkJCXN1YmplY3QucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCi0JCXNlcXVlbmNlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIuc2V0VmFsdWUoc3ViamVjdCgpICE9IG51bGwgJiYgc3ViamVjdCgpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCk7Ci0JCXRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIgICAuc2V0VmFsdWUoc3ViamVjdCgpICE9IG51bGwgJiYgc3ViamVjdCgpLmdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCk7Ci0JfQotCi0gCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQlzZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihmYWxzZSk7Ci0JCXRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIgICAgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KGZhbHNlKTsKLQl9Ci0KLSAJLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW5pdGlhbGl6ZVRhYmxlR2VuZXJhdG9yUGFuZShjb250YWluZXIpOwotCQlpbml0aWFsaXplU2VxdWVuY2VHZW5lcmF0b3JQYW5lKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvclBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBzdWItc2VjdGlvbgotCQljb250YWluZXIgPSBidWlsZENvbGxhcHNhYmxlU3ViU2VjdGlvbigKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDEwKSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3IsCi0JCQlzZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyCi0JCSk7Ci0KLQkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIGNoZWNrIGJveAotCQlCdXR0b24gc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveCA9IGJ1aWxkQ2hlY2tCb3goCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCA1KSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3IsCi0JCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1IKLQkJKTsKLQotCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3IgcGFuZQotCQluZXcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveC5nZXRCb3JkZXJXaWR0aCgpICsgMTYpCi0JCSk7Ci0JfQotCi0gCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGFibGVHZW5lcmF0b3JQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBUYWJsZSBHZW5lcmF0b3Igc3ViLXNlY3Rpb24KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVN1YlNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yLAotCQkJdGFibGVHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlcgotCQkpOwotCi0JCUJ1dHRvbiB0YWJsZUdlbmVyYXRvckNoZWNrQm94ID0gYnVpbGRDaGVja0JveCgKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDUpLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvciwKLQkJCWJ1aWxkVGFibGVHZW5lcmF0b3JCb29sZWFuSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUgotCQkpOwotCi0JCW5ldyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCB0YWJsZUdlbmVyYXRvckNoZWNrQm94LmdldEJvcmRlcldpZHRoKCkgKyAxNikKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0lkQ2xhc3NDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSWRDbGFzc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTcyNTI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSWRDbGFzc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZENsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgQ2xhc3NDaG9vc2VyUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIElkQ2xhc3MKLSAqIEBzZWUgQ2xhc3NDaG9vc2VyUGFuZQotICogQHNlZSBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZSAtIEEgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlIC0gQSBwYXJlbnQgY29udGFpbmVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJZENsYXNzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPElkQ2xhc3M+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5JZENsYXNzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSWRDbGFzc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIElkQ2xhc3M+IHBhcmVudFBhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8SWRDbGFzcz4gaW5pdGlhbGl6ZUNsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPElkQ2xhc3M+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxJZENsYXNzLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgSWRDbGFzcy5JRF9DTEFTU19QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmdldElkQ2xhc3MoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCi0JCQkJCQlzdWJqZWN0LnNldElkQ2xhc3ModmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldElkQ2xhc3MoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkQ2xhc3NDb21wb3NpdGVfbGFiZWw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQkJCUlKYXZhUHJvamVjdCByb290ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHJvb3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRUeXBlKCkgewotCQkJCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0KLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpOwotCQkJCQlzdWJqZWN0KCkuc2V0SWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZUNsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRjYTE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENvbHVtbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBHZW5lcmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBJZE1hcHBpbmcKLSAqIEBzZWUgQmFzZUpwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICogQHNlZSBDb2x1bW5Db21wb3NpdGUKLSAqIEBzZWUgVGVtcG9yYWxUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIEdlbmVyYXRpb25Db21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIElkTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8SWRNYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZTxJZE1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5JZE1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JSWRNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIElkTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb2x1bW4+IGJ1aWxkQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPElkTWFwcGluZywgQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCkpICB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2x1bW4gdHJhbnNmb3JtXyhJZE1hcHBpbmcgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYnVpbGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBncm91cEJveE1hcmdpbikgewotCQlyZXR1cm4gYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCi0JCS8vIENvbHVtbiB3aWRnZXRzCi0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQkvLyBUZW1wb3JhbCBUeXBlIHdpZGdldHMKLQkJbmV3IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOwotCi0JCS8vIEdlbmVyYXRpb24gcGFuZQotCQluZXcgR2VuZXJhdGlvbkNvbXBvc2l0ZSh0aGlzLCBidWlsZFN1YlBhbmUoY29udGFpbmVyLCAxMCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0ludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWJiOTI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0RGlhbG9nUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICoKLSAqIEBzZWUgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0Ci0gKiBAc2VlIEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBleHRlbmRzIEJhc2VKb2luQ29sdW1uRGlhbG9nPEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIGpvaW5UYWJsZSBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcwotCSAqIGxvY2F0ZWQKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBFaXRoZXIgdGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlwdWJsaWMgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pblRhYmxlIGpvaW5UYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlzdXBlcihwYXJlbnQsIGpvaW5UYWJsZSwgam9pbkNvbHVtbik7Ci0JfQotCi0JLyoKLQkgKiBub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3REaWFsb2dQYW5lPEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5EaWFsb2dQYW5lPEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdD4oCi0JCQlzdWJqZWN0SG9sZGVyKCksCi0JCQljb250YWluZXIKLQkJKQotCQkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhYmxlRWRpdGFibGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QgYnVpbGRTdGF0ZU9iamVjdCgpIHsKLQkJcmV0dXJuIG5ldyBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QoCi0JCQlnZXRPd25lcigpLAotCQkJZ2V0Sm9pbkNvbHVtbigpCi0JCSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChKb2luQ29sdW1uKSBzdXBlci5nZXRKb2luQ29sdW1uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpvaW5UYWJsZSBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChKb2luVGFibGUpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0ludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmUyMjFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIFRoZSBzdGF0ZSBvYmplY3QgdXNlZCB0byBjcmVhdGUgb3IgZWRpdCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG9uIGEgam9pbgotICogdGFibGUuCi0gKgotICogQHNlZSBKb2luQ29sdW1uCi0gKiBAc2VlIEpvaW5UYWJsZQotICogQHNlZSBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QgZXh0ZW5kcyBKb2luQ29sdW1uU3RhdGVPYmplY3QKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBqb2luVGFibGUKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBFaXRoZXIgdGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlwdWJsaWMgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0KEpvaW5UYWJsZSBqb2luVGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlzdXBlcihqb2luVGFibGUsIGpvaW5Db2x1bW4pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0TmFtZVRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXREYlRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpvaW5UYWJsZSBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChKb2luVGFibGUpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7Ci0JCUVudGl0eSB0YXJnZXRFbnRpdHkgPSByZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQotCQlpZiAodGFyZ2V0RW50aXR5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTY2hlbWEgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxUYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcHBpbmcgd2hlcmUgdGhlIGpvaW4gY29sdW1uIGlzIGxvY2F0ZWQuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHRvIGVkaXQKLQkgKi8KLQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFibGVzKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8U3RyaW5nPihpbml0aWFsVGFibGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSmF2YVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSmF2YVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyN2QzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0phdmFQZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLlR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuTnVsbFR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyAiTWFwIEFzIiBjb21wb3NpdGUgaXMgcmVzcG9uc2libGUgZm9yIHNob3dpbmcgdGhlIG1hcHBpbmcgbmFtZSBhbmQKLSAqIG1hcHBpbmcgdHlwZSBmb3IgYSB0eXBlIGRlY2xhcmVkIGluIGEgSmF2YSB0eXBlLgotICoKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRUeXBlCi0gKiBAc2VlIEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlIGV4dGVuZHMgUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZTxKYXZhUGVyc2lzdGVudFR5cGU+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgSmF2YVBlcnNpc3RlbnRUeXBlPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwcGluZ1VpUHJvdmlkZXI8SmF2YVBlcnNpc3RlbnRUeXBlPiBidWlsZERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBwaW5nVWlQcm92aWRlcjxKYXZhUGVyc2lzdGVudFR5cGU+KCkgewotCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvclR5cGVNYXBwaW5nKG51bGwpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJCXJldHVybiBKcHRVaU1lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX2RlZmF1bHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8VHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IHR5cGVNYXBwaW5nVWlQcm92aWRlcnMoKSB7Ci0KLQkJQ29sbGVjdGlvbjxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gcHJvdmlkZXJzID0KLQkJCUNvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGpwYVBsYXRmb3JtVWkoKS5qYXZhVHlwZU1hcHBpbmdVaVByb3ZpZGVycygpKTsKLQotCQlwcm92aWRlcnMucmVtb3ZlKE51bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXJldHVybiBwcm92aWRlcnMuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWI5ZDBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gSm9pbiBDb2x1bW5zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCB4IE92ZXJyaWRlIERlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKLSAqIEBzZWUgSm9pbkNvbHVtbgotICogQHNlZSBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nPgotewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4gam9pbkNvbHVtbkhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtbkNvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEpvaW5Db2x1bW5Db21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbigpIHsKLQotCQlKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZyhzaGVsbCgpLCBzdWJqZWN0KCksIG51bGwpOwotCi0JCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkQWRkSm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEpvaW5Db2x1bW4oSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ1N0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0KLQkJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBzdWJqZWN0ID0gc3ViamVjdCgpOwotCQlpbnQgaW5kZXggPSBzdWJqZWN0LnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpOwotCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHN1YmplY3QuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbmRleCk7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JfQotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPEpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdEaWFsb2c+IGJ1aWxkQWRkSm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZyBkaWFsb2cpIHsKLQkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQkJCWFkZEpvaW5Db2x1bW4oZGlhbG9nLnN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+IGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcsIEpvaW5Db2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSwgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5ERUZBVUxUX0pPSU5fQ09MVU1OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKb2luQ29sdW1uIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKb2luQ29sdW1uPihidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkpOwotCX0KLQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nPiBidWlsZEVkaXRKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPEpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdEaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJdXBkYXRlSm9pbkNvbHVtbihkaWFsb2cuc3ViamVjdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+KCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRKb2luQ29sdW1uTGFiZWwoSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWlmIChqb2luQ29sdW1uLmlzVmlydHVhbCgpKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0LAotCQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkJKTsKLQkJCX0KLQotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXMsCi0JCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRKb2luQ29sdW1uUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpOwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZEpvaW5Db2x1bW5zQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkSm9pbkNvbHVtbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCkgewotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkNvbXBvc2l0ZV9lZGl0OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG9wdGlvbk9uU2VsZWN0aW9uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQllZGl0Sm9pbkNvbHVtbihsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlyZW1vdmVKb2luQ29sdW1uKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJamF2YS51dGlsLkxpc3Q8TGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+PigpOwotCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkxpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4sIEpvaW5Db2x1bW4+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uKSBlbGVtZW50OwotCQkJCXJldHVybiBidWlsZEpvaW5Db2x1bW5MYWJlbChqb2luQ29sdW1uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+IGJ1aWxkSm9pbkNvbHVtbnNMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEpvaW5Db2x1bW4+KGJ1aWxkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCksCi0JCQlOYW1lZENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwKLQkJCU5hbWVkQ29sdW1uLkRFRkFVTFRfTkFNRV9QUk9QRVJUWSwKLQkJCUJhc2VKb2luQ29sdW1uLlNQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLAotCQkJQmFzZUpvaW5Db2x1bW4uREVGQVVMVF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLCBKb2luQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCksIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCQl1cGRhdGVKb2luQ29sdW1uUGFuZUVuYWJsZW1lbnQodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRKb2luQ29sdW1uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbikgbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKLQotCQlKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZyhzaGVsbCgpLCBzdWJqZWN0KCksIGpvaW5Db2x1bW4pOwotCi0JCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkRWRpdEpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JCXVwZGF0ZUpvaW5Db2x1bW5QYW5lRW5hYmxlbWVudChlbmFibGVkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0KLQkJam9pbkNvbHVtbkhvbGRlciAgICAgICAgICAgID0gYnVpbGRKb2luQ29sdW1uSG9sZGVyKCk7Ci0JCWpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlciA9IGJ1aWxkSm9pbkNvbHVtblBhbmVFbmFibGVySG9sZGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gSm9pbiBDb2x1bW5zIGdyb3VwCi0JCUdyb3VwIGdyb3VwUGFuZSA9IGJ1aWxkVGl0bGVkUGFuZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX2pvaW5Db2x1bW4KLQkJKTsKLQotCQkvLyBPdmVycmlkZSBEZWZhdWx0IEpvaW4gQ29sdW1ucyBjaGVjayBib3gKLQkJYnVpbGRDaGVja0JveCgKLQkJCWJ1aWxkU3ViUGFuZShncm91cFBhbmUsIDgpLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5Db21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnMsCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKQotCQkpOwotCi0JCS8vIEpvaW4gQ29sdW1ucyBsaXN0IHBhbmUKLQkJQWRkUmVtb3ZlTGlzdFBhbmU8U2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZz4gam9pbkNvbHVtbnNMaXN0UGFuZSA9Ci0JCQluZXcgQWRkUmVtb3ZlTGlzdFBhbmU8U2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZz4oCi0JCQkJdGhpcywKLQkJCQlncm91cFBhbmUsCi0JCQkJYnVpbGRKb2luQ29sdW1uc0FkYXB0ZXIoKSwKLQkJCQlidWlsZEpvaW5Db2x1bW5zTGlzdE1vZGVsKCksCi0JCQkJam9pbkNvbHVtbkhvbGRlciwKLQkJCQlidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSwKLQkJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fVEFCTEVfQ09MVU1OUwotCQkJKTsKLQotCQlpbnN0YWxsSm9pbkNvbHVtbnNMaXN0UGFuZUVuYWJsZXIoam9pbkNvbHVtbnNMaXN0UGFuZSk7Ci0JCXJlbW92ZUZyb21FbmFibGVtZW50Q29udHJvbChqb2luQ29sdW1uc0xpc3RQYW5lLmdldENvbnRyb2woKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxKb2luQ29sdW1uc0xpc3RQYW5lRW5hYmxlcihBZGRSZW1vdmVMaXN0UGFuZTxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nPiBwYW5lKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcihqb2luQ29sdW1uUGFuZUVuYWJsZXJIb2xkZXIsIHBhbmUpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVKb2luQ29sdW1uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlpbnRbXSBzZWxlY3RlZEluZGljZXMgPSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRJbmRpY2VzKCk7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJc3ViamVjdCgpLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSm9pbkNvbHVtbihKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKLQkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihzdGF0ZU9iamVjdC5nZXRKb2luQ29sdW1uKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luQ29sdW1uUGFuZUVuYWJsZW1lbnQoYm9vbGVhbiBlbmFibGVkKSB7Ci0KLQkJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBzdWJqZWN0ID0gc3ViamVjdCgpOwotCQllbmFibGVkICY9IChzdWJqZWN0ICE9IG51bGwpICYmIHN1YmplY3QuY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlqb2luQ29sdW1uUGFuZUVuYWJsZXJIb2xkZXIuc2V0VmFsdWUoZW5hYmxlZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUpvaW5Db2x1bW5zKGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQotCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0KLQkJdHJ5IHsKLQkJCVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgc3ViamVjdCA9IHN1YmplY3QoKTsKLQotCQkJLy8gQWRkIGEgam9pbiBjb2x1bW4gYnkgY3JlYXRpbmcgYSBzcGVjaWZpZWQgb25lIHVzaW5nIHRoZSBkZWZhdWx0Ci0JCQkvLyBvbmUgaWYgaXQgZXhpc3RzCi0JCQlpZiAoc2VsZWN0ZWQpIHsKLQotCQkJCUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBzdWJqZWN0LmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ly9UT0RPIGNvdWxkIGJlIG51bGwsIGRpc2FibGUgb3ZlcnJpZGUgZGVmYXVsdCBjaGVjayBib3g/Ci0KLQkJCQlpZiAoZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCk7Ci0JCQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCi0JCQkJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHN1YmplY3QuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtbk5hbWUpOwotCQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQotCQkJCQlqb2luQ29sdW1uSG9sZGVyLnNldFZhbHVlKGpvaW5Db2x1bW4pOwotCQkJCX0KLQkJCX0KLQkJCS8vIFJlbW92ZSBhbGwgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbnMKLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGluZGV4ID0gc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJc3ViamVjdC5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXVwZGF0ZUpvaW5Db2x1bW5QYW5lRW5hYmxlbWVudChzZWxlY3RlZCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlciBleHRlbmRzIExpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEJvb2xlYW4+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gewotCi0JCXB1YmxpYyBPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQkJc3VwZXIoYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCXJldHVybiBsaXN0SG9sZGVyLnNpemUoKSA+IDA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQl1cGRhdGVKb2luQ29sdW1ucyh2YWx1ZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5YjFhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdERpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBkZWZpbml0aW9uIG9mIHRoZSBkaWFsb2cgdXNlZCB0byBlZGl0IGFuIDxjb2RlPklKb2luQ29sdW1uPC9jb2RlPi4KLSAqCi0gKiBAc2VlIEpvaW5Db2x1bW4KLSAqIEBzZWUgSm9pbkNvbHVtblN0YXRlT2JqZWN0Ci0gKiBAc2VlIEpvaW5Db2x1bW5EaWFsb2dQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKb2luQ29sdW1uRGlhbG9nPFQgZXh0ZW5kcyBKb2luQ29sdW1uU3RhdGVPYmplY3Q+IGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5EaWFsb2c8VD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIG93bmVyIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzIGxvY2F0ZWQKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBFaXRoZXIgdGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtbkRpYWxvZyhTaGVsbCBwYXJlbnQsIE9iamVjdCBvd25lciwgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIsIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdERpYWxvZ1BhbmU8Pz4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5EaWFsb2dQYW5lPFQ+KHN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSm9pbkNvbHVtbiBnZXRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gKEpvaW5Db2x1bW4pIHN1cGVyLmdldEpvaW5Db2x1bW4oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uRGlhbG9nUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uRGlhbG9nUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjU1ODlmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkRpYWxvZ1BhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgeCBJbnNlcnRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCB4IE51bGxhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHggVW5pcXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgeCBVcGRhdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEpvaW5Db2x1bW5TdGF0ZU9iamVjdAotICogQHNlZSBKb2luQ29sdW1uRGlhbG9nIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Db2x1bW5EaWFsb2dQYW5lPFQgZXh0ZW5kcyBKb2luQ29sdW1uU3RhdGVPYmplY3Q+IGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uRGlhbG9nUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEpvaW5Db2x1bW5EaWFsb2dQYW5lKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEluc2VydGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgSm9pbkNvbHVtblN0YXRlT2JqZWN0LklOU0VSVEFCTEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0SW5zZXJ0YWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRJbnNlcnRhYmxlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRJbnNlcnRhYmxlU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZEluc2VydGFibGVIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCi0JCQkJCUJvb2xlYW4gZGVmYXVsdFZhbHVlID0gc3ViamVjdCgpLmdldERlZmF1bHRJbnNlcnRhYmxlKCk7Ci0KLQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0KLQkJCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSBkZWZhdWx0VmFsdWUgPyBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDoKLQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV9pbnNlcnRhYmxlV2l0aERlZmF1bHQsCi0JCQkJCQkJZGVmYXVsdFN0cmluZ1ZhbHVlCi0JCQkJCQkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV9pbnNlcnRhYmxlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROdWxsYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlKb2luQ29sdW1uU3RhdGVPYmplY3QuTlVMTEFCTEVfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0TnVsbGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0TnVsbGFibGUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE51bGxhYmxlU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZE51bGxhYmxlSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0TnVsbGFibGUoKTsKLQotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX1RydWUgOgotCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCi0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX251bGxhYmxlV2l0aERlZmF1bHQsCi0JCQkJCQkJZGVmYXVsdFN0cmluZ1ZhbHVlCi0JCQkJCQkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV9udWxsYWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVW5pcXVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUpvaW5Db2x1bW5TdGF0ZU9iamVjdC5VTklRVUVfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VW5pcXVlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFVuaXF1ZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVW5pcXVlU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZFVuaXF1ZUhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKChzdWJqZWN0KCkgIT0gbnVsbCkgJiYgKHZhbHVlID09IG51bGwpKSB7Ci0KLQkJCQkJQm9vbGVhbiBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0KCkuZ2V0RGVmYXVsdFVuaXF1ZSgpOwotCi0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6Ci0JCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0KLQkJCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdW5pcXVlV2l0aERlZmF1bHQsCi0JCQkJCQkJZGVmYXVsdFN0cmluZ1ZhbHVlCi0JCQkJCQkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV91bmlxdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVwZGF0YWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKb2luQ29sdW1uU3RhdGVPYmplY3QuVVBEQVRBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFVwZGF0YWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRVcGRhdGFibGUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFVwZGF0YWJsZVN0cmluZ0hvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRVcGRhdGFibGVIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCi0JCQkJCUJvb2xlYW4gZGVmYXVsdFZhbHVlID0gc3ViamVjdCgpLmdldERlZmF1bHRVcGRhdGFibGUoKTsKLQotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX1RydWUgOgotCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCi0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX3VwZGF0YWJsZVdpdGhEZWZhdWx0LAotCQkJCQkJCWRlZmF1bHRTdHJpbmdWYWx1ZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdXBkYXRhYmxlOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXN1cGVyLmluaXRpYWxpemVMYXlvdXQoY29udGFpbmVyKTsKLQotCQkvLyBJbnNlcnRhYmxlIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkJYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCA0KSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV9pbnNlcnRhYmxlLAotCQkJYnVpbGRJbnNlcnRhYmxlSG9sZGVyKCksCi0JCQlidWlsZEluc2VydGFibGVTdHJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX0lOU0VSVEFCTEUKLQkJKTsKLQotCQkvLyBVcGRhdGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAotCQlidWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV91cGRhdGFibGUsCi0JCQlidWlsZFVwZGF0YWJsZUhvbGRlcigpLAotCQkJYnVpbGRVcGRhdGFibGVTdHJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX1VQREFUQUJMRQotCQkpOwotCi0JCS8vIFVuaXF1ZSB0cmktc3RhdGUgY2hlY2sgYm94Ci0JCWJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV91bmlxdWUsCi0JCQlidWlsZFVuaXF1ZUhvbGRlcigpLAotCQkJYnVpbGRVbmlxdWVTdHJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX1VOSVFVRQotCQkpOwotCi0JCS8vIE51bGxhYmxlIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkJYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX251bGxhYmxlLAotCQkJYnVpbGROdWxsYWJsZUhvbGRlcigpLAotCQkJYnVpbGROdWxsYWJsZVN0cmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fTlVMTEFCTEUKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhYmxlRWRpdGFibGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWVjM2U0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBpcyB1c2VkIHRvIGVpdGhlciBjcmVhdGUgb3IgZWRpdCBhIGpvaW5nIGNvbHVtbiB0aGF0IGlzIGxvY2F0ZWQKLSAqIG9uIGFuIGFzc29jaWF0aW9uIG92ZXJyaWRlLgotICoKLSAqIEBzZWUgSm9pbkNvbHVtbgotICogQHNlZSBBc3NvY2lhdGlvbk92ZXJyaWRlCi0gKiBAc2VlIEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVTdGF0ZU9iamVjdAotICogQHNlZSBKb2luQ29sdW1uRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZyBleHRlbmRzIEpvaW5Db2x1bW5EaWFsb2c8Sm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZVN0YXRlT2JqZWN0PiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIGFzc29jaWF0aW9uT3ZlcnJpZGUgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBUaGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlzCi0JICogdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2coU2hlbGwgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlzdXBlcihwYXJlbnQsIGFzc29jaWF0aW9uT3ZlcnJpZGUsIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlU3RhdGVPYmplY3QgYnVpbGRTdGF0ZU9iamVjdCgpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlU3RhdGVPYmplY3QoCi0JCQlnZXRPd25lcigpLAotCQkJZ2V0Sm9pbkNvbHVtbigpCi0JCSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFzc29jaWF0aW9uT3ZlcnJpZGUgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoQXNzb2NpYXRpb25PdmVycmlkZSkgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZVN0YXRlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZTg2YzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlU3RhdGVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotCi0vKioKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZVN0YXRlT2JqZWN0IGV4dGVuZHMgSm9pbkNvbHVtblN0YXRlT2JqZWN0Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlU3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGFzc29jaWF0aW9uT3ZlcnJpZGUgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBUaGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlzCi0JICogdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVTdGF0ZU9iamVjdChBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJc3VwZXIoYXNzb2NpYXRpb25PdmVycmlkZSwgam9pbkNvbHVtbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGUoKSB7Ci0KLQkJaWYgKGdldEpvaW5Db2x1bW4oKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0Sm9pbkNvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHR5cGVNYXBwaW5nKCkuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldE5hbWVUYWJsZSgpIHsKLQkJcmV0dXJuIHR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQXNzb2NpYXRpb25PdmVycmlkZSBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChBc3NvY2lhdGlvbk92ZXJyaWRlKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkgewotCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IGdldE93bmVyKCk7Ci0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0T3duZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQotCQlpZiAocmVsYXRpb25zaGlwTWFwcGluZyA9PSBudWxsKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJRW50aXR5IHRhcmdldEVudGl0eSA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQotCQlpZiAodGFyZ2V0RW50aXR5ICE9IG51bGwpIHsKLQkJCXJldHVybiB0YXJnZXRFbnRpdHkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTY2hlbWEgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gdHlwZU1hcHBpbmcoKS5nZXREYlNjaGVtYSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcHBpbmcgd2hlcmUgdGhlIGpvaW4gY29sdW1uIGlzIGxvY2F0ZWQuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHRvIGVkaXQKLQkgKi8KLQlwdWJsaWMgVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MTRjNmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdERpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoaXMgZGlhbG9nIGlzIHVzZWQgdG8gZWl0aGVyIGNyZWF0ZSBvciBlZGl0IGEgam9pbmcgY29sdW1uIHRoYXQgaXMgbG9jYXRlZAotICogb24gYSBqb2luIHRhYmxlLgotICoKLSAqIEBzZWUgSm9pbkNvbHVtbgotICogQHNlZSBKb2luVGFibGUKLSAqIEBzZWUgSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QKLSAqIEBzZWUgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbkRpYWxvZzxKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIGpvaW5UYWJsZSBUaGUgcGFyZW50IG9mIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIHRvIGNyZWF0ZQotCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2coU2hlbGwgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pblRhYmxlIGpvaW5UYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCi0JCXN1cGVyKHBhcmVudCwgam9pblRhYmxlLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQkvKgotCSAqIG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdERpYWxvZ1BhbmU8Sm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Q+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uRGlhbG9nUGFuZTxKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdD4oCi0JCQlzdWJqZWN0SG9sZGVyKCksCi0JCQljb250YWluZXIKLQkJKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVFZGl0YWJsZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0IGJ1aWxkU3RhdGVPYmplY3QoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QoCi0JCQlnZXRPd25lcigpLAotCQkJZ2V0Sm9pbkNvbHVtbigpCi0JCSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChKb2luQ29sdW1uKSBzdXBlci5nZXRKb2luQ29sdW1uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpvaW5UYWJsZSBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChKb2luVGFibGUpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmNWVkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogVGhlIHN0YXRlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSBvciBlZGl0IGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gb24gYQotICogam9pbnQgdGFibGUuCi0gKgotICogQHNlZSBKb2luQ29sdW1uCi0gKiBAc2VlIEpvaW5UYWJsZQotICogQHNlZSBJbnZlcnNlSm9pbkNvbHVtbkRpYWxvZwotICogQHNlZSBJbnZlcnNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUKLSAqIEBzZWUgSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCBleHRlbmRzIEpvaW5Db2x1bW5TdGF0ZU9iamVjdAotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGpvaW5UYWJsZSBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB0byBlZGl0Ci0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QoSm9pblRhYmxlIGpvaW5UYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKGpvaW5UYWJsZSwgam9pbkNvbHVtbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXROYW1lVGFibGUoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldERiVGFibGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSm9pblRhYmxlIGdldE93bmVyKCkgewotCQlyZXR1cm4gKEpvaW5UYWJsZSkgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpIHsKLQkJcmV0dXJuIHJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFNjaGVtYSBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgaW5pdGlhbFRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWJsZUVkaXRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFwcGluZyBvd25pbmcgdGhlIGpvaW4gdGFibGUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwYXJlbnQgb2YgdGhlIGpvaW4gdGFibGUKLQkgKi8KLQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFibGVzKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8U3RyaW5nPihpbml0aWFsVGFibGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODRkOGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoaXMgZGlhbG9nIGlzIHVzZWQgdG8gZWl0aGVyIGNyZWF0ZSBvciBlZGl0IGEgam9pbmcgY29sdW1uIHRoYXQgaXMgbG9jYXRlZAotICogb24gYSByZWxhdGlvbmFsIG1hcHBpbmcuCi0gKgotICogQHNlZSBKb2luQ29sdW1uCi0gKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcKLSAqIEBzZWUgSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ1N0YXRlT2JqZWN0Ci0gKiBAc2VlIEpvaW5Db2x1bW5EaWFsb2dQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nIGV4dGVuZHMgSm9pbkNvbHVtbkRpYWxvZzxKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nU3RhdGVPYmplY3Q+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RKb2luQ29sdW1uRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSByZWxhdGlvbnNoaXBNYXBwaW5nIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciB0bwotCSAqIGNyZWF0ZQotCSAqIEBwYXJhbSBqb2luQ29sdW1uIFRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgaXMKLQkgKiB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nKFNoZWxsIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCi0JCXN1cGVyKHBhcmVudCwgcmVsYXRpb25zaGlwTWFwcGluZywgam9pbkNvbHVtbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdTdGF0ZU9iamVjdCgKLQkJCWdldE93bmVyKCksCi0JCQlnZXRKb2luQ29sdW1uKCkKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChSZWxhdGlvbnNoaXBNYXBwaW5nKSBzdXBlci5nZXRPd25lcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdTdGF0ZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyMDVhNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdTdGF0ZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci0KLS8qKgotICogVGhlIHN0YXRlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSBvciBlZGl0IGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gb24gYQotICogcmVsYXRpb25zaGlwIG1hcHBpbmcuCi0gKgotICogQHNlZSBKb2luQ29sdW1uCi0gKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcKLSAqIEBzZWUgSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ1N0YXRlT2JqZWN0IGV4dGVuZHMgSm9pbkNvbHVtblN0YXRlT2JqZWN0Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nU3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHJlbGF0aW9uc2hpcE1hcHBpbmcgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBUaGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlzCi0JICogdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIEpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdTdGF0ZU9iamVjdChSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJc3VwZXIocmVsYXRpb25zaGlwTWFwcGluZywgam9pbkNvbHVtbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGUoKSB7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0Sm9pbkNvbHVtbigpOwotCi0JCWlmIChqb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKS5nZXRUYWJsZU5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0TmFtZVRhYmxlKCkgewotCQlTY2hlbWEgc2NoZW1hID0gZ2V0U2NoZW1hKCk7Ci0KLQkJaWYgKHNjaGVtYSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyB0YWJsZSA9IGdldFRhYmxlKCk7Ci0KLQkJaWYgKHRhYmxlID09IG51bGwpIHsKLQkJCXRhYmxlID0gZ2V0RGVmYXVsdFRhYmxlKCk7Ci0JCX0KLQotCQlyZXR1cm4gc2NoZW1hLnRhYmxlTmFtZWQodGFibGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldE93bmVyKCkgewotCQlyZXR1cm4gKFJlbGF0aW9uc2hpcE1hcHBpbmcpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7Ci0JCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBnZXRPd25lcigpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0KLQkJaWYgKHRhcmdldEVudGl0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGFyZ2V0RW50aXR5LmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKS5nZXREYlNjaGVtYSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5TdGF0ZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3ZjM1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5TdGF0ZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogVGhlIHN0YXRlIG9iamVjdCB1c2VkIHRvIGVkaXQgYSA8Y29kZT5Kb2luQ29sdW1uPC9jb2RlPi4KLSAqCi0gKiBAc2VlIEpvaW5Db2x1bW4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSm9pbkNvbHVtblN0YXRlT2JqZWN0IGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdAotewotCXByaXZhdGUgQm9vbGVhbiBpbnNlcnRhYmxlOwotCXByaXZhdGUgQm9vbGVhbiBudWxsYWJsZTsKLQlwcml2YXRlIEJvb2xlYW4gdW5pcXVlOwotCXByaXZhdGUgQm9vbGVhbiB1cGRhdGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNFUlRBQkxFX1BST1BFUlRZID0gImluc2VydGFibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExBQkxFX1BST1BFUlRZID0gIm51bGxhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTklRVUVfUFJPUEVSVFkgPSAidW5pcXVlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUERBVEFCTEVfUFJPUEVSVFkgPSAidXBkYXRhYmxlIjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtblN0YXRlT2JqZWN0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBvd25lciBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcyBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtblN0YXRlT2JqZWN0KE9iamVjdCBvd25lciwgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKG93bmVyLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0SW5zZXJ0YWJsZSgpIHsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKb2luQ29sdW1uKCk7Ci0KLQkJaWYgKGpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdEluc2VydGFibGUoKTsKLQkJfQotCi0JCXJldHVybiBCYXNlQ29sdW1uLkRFRkFVTFRfSU5TRVJUQUJMRTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0TnVsbGFibGUoKSB7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0Sm9pbkNvbHVtbigpOwotCi0JCWlmIChqb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiBqb2luQ29sdW1uLmdldERlZmF1bHROdWxsYWJsZSgpOwotCQl9Ci0KLQkJcmV0dXJuIEJhc2VDb2x1bW4uREVGQVVMVF9OVUxMQUJMRTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VW5pcXVlKCkgewotCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpvaW5Db2x1bW4oKTsKLQotCQlpZiAoam9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbi5nZXREZWZhdWx0VW5pcXVlKCk7Ci0JCX0KLQotCQlyZXR1cm4gQmFzZUNvbHVtbi5ERUZBVUxUX1VOSVFVRTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VXBkYXRhYmxlKCkgewotCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpvaW5Db2x1bW4oKTsKLQotCQlpZiAoam9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbi5nZXREZWZhdWx0VXBkYXRhYmxlKCk7Ci0JCX0KLQotCQlyZXR1cm4gQmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gaW5zZXJ0YWJsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSm9pbkNvbHVtbiBnZXRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gKEpvaW5Db2x1bW4pIHN1cGVyLmdldEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpIHsKLQkJcmV0dXJuIG51bGxhYmxlOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTY2hlbWEgZ2V0U2NoZW1hKCk7Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKSB7Ci0JCXJldHVybiB1bmlxdWU7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0VXBkYXRhYmxlKCkgewotCQlyZXR1cm4gdXBkYXRhYmxlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoT2JqZWN0IG93bmVyLCBCYXNlSm9pbkNvbHVtbiBiYXNlSm9pbkNvbHVtbikgewotCi0JCXN1cGVyLmluaXRpYWxpemUob3duZXIsIGJhc2VKb2luQ29sdW1uKTsKLQotCQlpZiAoYmFzZUpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKEpvaW5Db2x1bW4pIGJhc2VKb2luQ29sdW1uOwotCi0JCQlpbnNlcnRhYmxlICAgICAgID0gam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCk7Ci0JCQludWxsYWJsZSAgICAgICAgID0gam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpOwotCQkJdW5pcXVlICAgICAgICAgICA9IGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCk7Ci0JCQl1cGRhdGFibGUgICAgICAgID0gam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgaW5pdGlhbFRhYmxlKCkgewotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKb2luQ29sdW1uKCk7Ci0KLQkJaWYgKGpvaW5Db2x1bW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0YWJsZShCb29sZWFuIGluc2VydGFibGUpIHsKLQkJQm9vbGVhbiBvbGRJbnNlcnRhYmxlID0gdGhpcy5pbnNlcnRhYmxlOwotCQl0aGlzLmluc2VydGFibGUgPSBpbnNlcnRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElOU0VSVEFCTEVfUFJPUEVSVFksIG9sZEluc2VydGFibGUsIGluc2VydGFibGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE51bGxhYmxlKEJvb2xlYW4gbnVsbGFibGUpIHsKLQkJQm9vbGVhbiBvbGROdWxsYWJsZSA9IHRoaXMubnVsbGFibGU7Ci0JCXRoaXMubnVsbGFibGUgPSBudWxsYWJsZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOVUxMQUJMRV9QUk9QRVJUWSwgb2xkTnVsbGFibGUsIG51bGxhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiB1bmlxdWUpIHsKLQkJQm9vbGVhbiBvbGRVbmlxdWUgPSB0aGlzLnVuaXF1ZTsKLQkJdGhpcy51bmlxdWUgPSB1bmlxdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVU5JUVVFX1BST1BFUlRZLCBvbGRVbmlxdWUsIHVuaXF1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gdXBkYXRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkVXBkYXRhYmxlID0gdGhpcy51cGRhdGFibGU7Ci0JCXRoaXMudXBkYXRhYmxlID0gdXBkYXRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFVQREFUQUJMRV9QUk9QRVJUWSwgb2xkVXBkYXRhYmxlLCB1cGRhdGFibGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YWJsZXMoKSB7Ci0JCVNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKLQotCQlpZiAoc2NoZW1hID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJTGlzdDxTdHJpbmc+IG5hbWVzID0gQ29sbGVjdGlvblRvb2xzLmxpc3Qoc2NoZW1hLnRhYmxlTmFtZXMoKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobmFtZXMpOwotCQlyZXR1cm4gbmFtZXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlSm9pbkNvbHVtbihCYXNlSm9pbkNvbHVtbiBhYnN0cmFjdEpvaW5Db2x1bW4pIHsKLQotCQlzdXBlci51cGRhdGVKb2luQ29sdW1uKGFic3RyYWN0Sm9pbkNvbHVtbik7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKEpvaW5Db2x1bW4pIGFic3RyYWN0Sm9pbkNvbHVtbjsKLQotCQkvLyBUYWJsZQotCQlpZiAoaXNUYWJsZUVkaXRhYmxlKCkpIHsKLQkJCVN0cmluZyB0YWJsZSA9IGdldFRhYmxlKCk7Ci0KLQkJCWlmICh2YWx1ZXNBcmVEaWZmZXJlbnQodGFibGUsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSkpIHsKLQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKHRhYmxlKTsKLQkJCX0KLQkJfQotCi0JCS8vIEluc2VydGFibGUKLQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpICE9IGluc2VydGFibGUpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKGluc2VydGFibGUpOwotCQl9Ci0KLQkJLy8gVXBkYXRhYmxlCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpICE9IHVwZGF0YWJsZSl7Ci0JCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZSh1cGRhdGFibGUpOwotCQl9Ci0KLQkJLy8gVW5pcXVlCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpICE9IHVuaXF1ZSl7Ci0JCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZSh1bmlxdWUpOwotCQl9Ci0KLQkJLy8gTnVsbGFibGUKLQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSAhPSBudWxsYWJsZSl7Ci0JCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGxhYmxlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMGQ5NzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFic3RyYWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBKb2luVGFibGVDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgT3ZlcnJpZGVzQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uc0NvbXBvc2l0ZTxUIGV4dGVuZHMgSnBhTm9kZT4gZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPFQ+Ci17Ci0JLyoqCi0JICogVGhlIGVkaXRvciB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbW1vbiBiZWhhdmlvcnMgZGVmaW5lZCBpbiB0aGUgbGlzdCBwYW5lLgotCSAqLwotCXByaXZhdGUgSUpvaW5Db2x1bW5zRWRpdG9yPFQ+IGpvaW5Db2x1bW5zRWRpdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqIEBwYXJhbSBqb2luQ29sdW1uc0VkaXRvciBUaGUgZWRpdG9yIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tbW9uIGJlaGF2aW9ycwotCSAqIGRlZmluZWQgaW4gdGhlIGxpc3QgcGFuZQotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uc0NvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSm9pbkNvbHVtbnNFZGl0b3I8VD4gam9pbkNvbHVtbnNFZGl0b3IpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCQl0aGlzLmpvaW5Db2x1bW5zRWRpdG9yID0gam9pbkNvbHVtbnNFZGl0b3I7Ci0JCWluaXRpYWxpemVMYXlvdXQyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqIEBwYXJhbSBqb2luQ29sdW1uc0VkaXRvciBUaGUgZWRpdG9yIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tbW9uIGJlaGF2aW9ycwotCSAqIGRlZmluZWQgaW4gdGhlIGxpc3QgcGFuZQotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uc0NvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUpvaW5Db2x1bW5zRWRpdG9yPFQ+IGpvaW5Db2x1bW5zRWRpdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOwotCQl0aGlzLmpvaW5Db2x1bW5zRWRpdG9yID0gam9pbkNvbHVtbnNFZGl0b3I7Ci0JCWluaXRpYWxpemVMYXlvdXQyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uc0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUpvaW5Db2x1bW5zRWRpdG9yPFQ+IGpvaW5Db2x1bW5zRWRpdG9yKSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5qb2luQ29sdW1uc0VkaXRvciA9IGpvaW5Db2x1bW5zRWRpdG9yOwotCQlpbml0aWFsaXplTGF5b3V0MigpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4gYnVpbGRKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKb2luQ29sdW1uPigpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCi0JCWlmIChqb2luQ29sdW1uLmlzVmlydHVhbCgpKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQsCi0JCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkpOwotCQl9Ci0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsKSB7Ci0KLQkJCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0LAotCQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkJKTsKLQkJCX0KLQotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQsCi0JCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkpOwotCQl9Ci0KLQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQsCi0JCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkpOwotCQl9Ci0KLQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtcywKLQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkSm9pbkNvbHVtbnNBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFic3RyYWN0QWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJam9pbkNvbHVtbnNFZGl0b3IuYWRkSm9pbkNvbHVtbihzdWJqZWN0KCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCkgewotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkNvbXBvc2l0ZV9lZGl0OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG9wdGlvbk9uU2VsZWN0aW9uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbikgbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKLQkJCQlqb2luQ29sdW1uc0VkaXRvci5lZGl0Sm9pbkNvbHVtbihzdWJqZWN0KCksIGpvaW5Db2x1bW4pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlqb2luQ29sdW1uc0VkaXRvci5yZW1vdmVKb2luQ29sdW1ucyhzdWJqZWN0KCksIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZEpvaW5Db2x1bW5zTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKb2luQ29sdW1uPihidWlsZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpLAotCQkJTmFtZWRDb2x1bW4uU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksCi0JCQlOYW1lZENvbHVtbi5ERUZBVUxUX05BTUVfUFJPUEVSVFksCi0JCQlCYXNlSm9pbkNvbHVtbi5TUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwKLQkJCUJhc2VKb2luQ29sdW1uLkRFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJamF2YS51dGlsLkxpc3Q8TGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+PigpOwotCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkxpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4sIEpvaW5Db2x1bW4+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4gYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VCwgSm9pbkNvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBqb2luQ29sdW1uc0VkaXRvci5zcGVjaWZpZWRMaXN0UHJvcGVydHlOYW1lKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBqb2luQ29sdW1uc0VkaXRvci5zcGVjaWZpZWRKb2luQ29sdW1ucyhzdWJqZWN0KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBqb2luQ29sdW1uc0VkaXRvci5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEpvaW5Db2x1bW4+IGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEpvaW5Db2x1bW4+KGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBKb2luQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCksIGpvaW5Db2x1bW5zRWRpdG9yLmRlZmF1bHRQcm9wZXJ0eU5hbWUoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gam9pbkNvbHVtbnNFZGl0b3IuZGVmYXVsdEpvaW5Db2x1bW4oc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbikgZWxlbWVudDsKLQotCQkJCXJldHVybiBidWlsZEpvaW5Db2x1bW5MYWJlbChqb2luQ29sdW1uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUxheW91dDIoKSB7Ci0KLQkJLy8gSm9pbiBDb2x1bW5zIGxpc3QgcGFuZQotCQlBZGRSZW1vdmVMaXN0UGFuZTxUPiBsaXN0UGFuZSA9IG5ldyBBZGRSZW1vdmVMaXN0UGFuZTxUPigKLQkJCXRoaXMsCi0JCQlnZXRDb250cm9sKCksCi0JCQlidWlsZEpvaW5Db2x1bW5zQWRhcHRlcigpLAotCQkJYnVpbGRKb2luQ29sdW1uc0xpc3RNb2RlbCgpLAotCQkJYnVpbGRKb2luQ29sdW1uSG9sZGVyKCksCi0JCQlidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9DT0xVTU5TCi0JCSk7Ci0KLQkJLy8gUmVtb3ZlIHRoZSBsaXN0IHBhbmUgZnJvbSB0aGlzIHBhbmUncyBlbmFibGVtZW50IGNvbnRyb2wgYmVjYXVzZSBpdHMKLQkJLy8gZW5hYmxlbWVudCBpcyBtYW5hZ2VkIGJ5IGEgUGFuZUVuYWJsZXIgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQotCQlyZW1vdmVGcm9tRW5hYmxlbWVudENvbnRyb2wobGlzdFBhbmUuZ2V0TWFpbkNvbnRyb2woKSk7Ci0JCXJlbW92ZUZyb21FbmFibGVtZW50Q29udHJvbChsaXN0UGFuZSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGVkaXRvciBpcyB1c2VkIHRvIGNvbXBsZXRlIHRoZSBiZWhhdmlvciBvZiB0aGlzIHBhbmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSUpvaW5Db2x1bW5zRWRpdG9yPFQ+IHsKLQotCQl2b2lkIGFkZEpvaW5Db2x1bW4oVCBzdWJqZWN0KTsKLQkJdm9pZCBlZGl0Sm9pbkNvbHVtbihUIHN1YmplY3QsIEpvaW5Db2x1bW4gam9pbkNvbHVtbik7Ci0JCWJvb2xlYW4gaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoVCBzdWJqZWN0KTsKLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKFQgc3ViamVjdCk7Ci0JCWludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoVCBzdWJqZWN0KTsKLQkJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbihUIHN1YmplY3QpOwotCQlTdHJpbmcgc3BlY2lmaWVkTGlzdFByb3BlcnR5TmFtZSgpOwotCQlTdHJpbmcgZGVmYXVsdFByb3BlcnR5TmFtZSgpOwotCQl2b2lkIHJlbW92ZUpvaW5Db2x1bW5zKFQgc3ViamVjdCwgaW50W10gc2VsZWN0ZWRJbmRpY2VzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luVGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pblRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODZjODguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luVGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYi5UYWJsZUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkpvaW5Db2x1bW5zQ29tcG9zaXRlLklKb2luQ29sdW1uc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBvc3RFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIHwKLSAqIHwgICBOYW1lOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgICB8Ci0gKiB8ICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBKb2luIENvbHVtbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8IEpvaW5Db2x1bW5zQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIEludmVyc2UgSm9pbiBDb2x1bW5zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgSm9pbkNvbHVtbnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBKb2luVGFibGUKLSAqIEBzZWUgT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBKb2luQ29sdW1uc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pblRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxKb2luVGFibGU+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBpbnZlcnNlSm9pbkNvbHVtbnNQYW5lRW5hYmxlckhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGpvaW5Db2x1bW5zUGFuZUVuYWJsZXJIb2xkZXI7Ci0JcHJpdmF0ZSBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pblRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKb2luVGFibGVDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKb2luVGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luVGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JSm9pblRhYmxlPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEpvaW5UYWJsZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEpvaW5UYWJsZT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJbnZlcnNlSm9pbkNvbHVtbihKb2luVGFibGUgam9pblRhYmxlKSB7Ci0KLQkJSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBkaWFsb2cgPQotCQkJbmV3IEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2coc2hlbGwoKSwgam9pblRhYmxlLCBudWxsKTsKLQotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEFkZEludmVyc2VKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSW52ZXJzZUpvaW5Db2x1bW5Gcm9tRGlhbG9nKEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCi0JCUpvaW5UYWJsZSBzdWJqZWN0ID0gc3ViamVjdCgpOwotCQlpbnQgaW5kZXggPSBzdWJqZWN0LnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKTsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBzdWJqZWN0LmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGluZGV4KTsKLQkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbihKb2luVGFibGUgam9pblRhYmxlKSB7Ci0KLQkJSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nKHNoZWxsKCksIGpvaW5UYWJsZSwgbnVsbCk7Ci0KLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRBZGRKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbkZyb21EaWFsb2coSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKLQotCQlKb2luVGFibGUgc3ViamVjdCA9IHN1YmplY3QoKTsKLQkJaW50IGluZGV4ID0gc3ViamVjdC5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBzdWJqZWN0KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbmRleCk7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JfQotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2c+IGJ1aWxkQWRkSW52ZXJzZUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248SW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZGlhbG9nKSB7Ci0JCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJCQlhZGRJbnZlcnNlSm9pbkNvbHVtbkZyb21EaWFsb2coZGlhbG9nLnN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2c+IGJ1aWxkQWRkSm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZGlhbG9nKSB7Ci0JCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJCQlhZGRKb2luQ29sdW1uRnJvbURpYWxvZyhkaWFsb2cuc3ViamVjdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2c+IGJ1aWxkRWRpdEludmVyc2VKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJZWRpdEludmVyc2VKb2luQ29sdW1uKGRpYWxvZy5zdWJqZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248Sm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nPiBidWlsZEVkaXRKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBkaWFsb2cpIHsKLQkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQkJCWVkaXRKb2luQ29sdW1uKGRpYWxvZy5zdWJqZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEludmVyc2VKb2luQ29sdW1uc1Byb3ZpZGVyIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5zRWRpdG9yKCkgewotCQlyZXR1cm4gbmV3IEludmVyc2VKb2luQ29sdW1uc1Byb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBKb2luQ29sdW1uc1Byb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNFZGl0b3IoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbnNQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkSm9pbkNvbHVtbnNQYW5lRW5hYmxlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE92ZXJyaWRlRGVmYXVsdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oKTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkT3ZlcnJpZGVEZWZhdWx0SW52ZXJzZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1cGRhdGVJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkT3ZlcnJpZGVEZWZhdWx0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXVwZGF0ZUpvaW5Db2x1bW5zKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYnVpbGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBncm91cEJveE1hcmdpbikgewotCQlyZXR1cm4gYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDEwLCBncm91cEJveE1hcmdpbik7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZUNvbWJvPEpvaW5UYWJsZT4gYnVpbGRUYWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IFRhYmxlQ29tYm88Sm9pblRhYmxlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5ERUZBVUxUX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJCQlpZiAocHJvcGVydHlOYW1lID09IFRhYmxlLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZIAotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGUuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWQotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGUuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSApIHsKLQkJCQkJcmVwb3B1bGF0ZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBzY2hlbWFOYW1lKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZE5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgdGFibGUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXVwZGF0ZUpvaW5Db2x1bW5QYW5lc0VuYWJsZW1lbnQodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRJbnZlcnNlSm9pbkNvbHVtbihJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKLQkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihzdGF0ZU9iamVjdC5nZXRKb2luQ29sdW1uKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0SW52ZXJzZUpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBkaWFsb2cgPQotCQkJbmV3IEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2coc2hlbGwoKSwgc3ViamVjdCgpLCBqb2luQ29sdW1uKTsKLQotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEVkaXRJbnZlcnNlSm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCi0JCUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBkaWFsb2cgPQotCQkJbmV3IEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyhzaGVsbCgpLCBzdWJqZWN0KCksIGpvaW5Db2x1bW4pOwotCi0JCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkRWRpdEpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbihKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKHN0YXRlT2JqZWN0LmdldEpvaW5Db2x1bW4oKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKLQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQkJdXBkYXRlSm9pbkNvbHVtblBhbmVzRW5hYmxlbWVudChlbmFibGVkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0KLQkJam9pbkNvbHVtbnNQYW5lRW5hYmxlckhvbGRlciAgICAgICAgPSBidWlsZEpvaW5Db2x1bW5zUGFuZUVuYWJsZXJIb2xkZXIoKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zUGFuZUVuYWJsZXJIb2xkZXIgPSBidWlsZEpvaW5Db2x1bW5zUGFuZUVuYWJsZXJIb2xkZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlUYWJsZUNvbWJvPEpvaW5UYWJsZT4gdGFibGVDb21ibyA9IGJ1aWxkVGFibGVDb21ibyhjb250YWluZXIpOwotCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWJ1aWxkUGFuZShjb250YWluZXIsIGdyb3VwQm94TWFyZ2luKSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfbmFtZSwKLQkJCXRhYmxlQ29tYm8uZ2V0Q29udHJvbCgpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX05BTUUKLQkJKTsKLQotCQkvLyBKb2luIENvbHVtbnMgZ3JvdXAgcGFuZQotCQlHcm91cCBqb2luQ29sdW1uR3JvdXBQYW5lID0gYnVpbGRUaXRsZWRQYW5lKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9qb2luQ29sdW1uCi0JCSk7Ci0KLQkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBKb2luIENvbHVtbnMgY2hlY2sgYm94Ci0JCW92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3ggPSBidWlsZENoZWNrQm94KAotCQkJYnVpbGRTdWJQYW5lKGpvaW5Db2x1bW5Hcm91cFBhbmUsIDgpLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1ucywKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0SG9sZGVyKCkKLQkJKTsKLQotCQlvdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRTZWxlY3Rpb25MaXN0ZW5lcigpCi0JCSk7Ci0KLQkJSm9pbkNvbHVtbnNDb21wb3NpdGU8Sm9pblRhYmxlPiBqb2luQ29sdW1uc0NvbXBvc2l0ZSA9IG5ldyBKb2luQ29sdW1uc0NvbXBvc2l0ZTxKb2luVGFibGU+KAotCQkJdGhpcywKLQkJCWpvaW5Db2x1bW5Hcm91cFBhbmUsCi0JCQlidWlsZEpvaW5Db2x1bW5zRWRpdG9yKCkKLQkJKTsKLQotCQlpbnN0YWxsSm9pbkNvbHVtbnNQYW5lRW5hYmxlcihqb2luQ29sdW1uc0NvbXBvc2l0ZSk7Ci0JCXJlbW92ZUZyb21FbmFibGVtZW50Q29udHJvbChqb2luQ29sdW1uc0NvbXBvc2l0ZS5nZXRDb250cm9sKCkpOwotCi0JCS8vIEludmVyc2UgSm9pbiBDb2x1bW5zIGdyb3VwIHBhbmUKLQkJR3JvdXAgaW52ZXJzZUpvaW5Db2x1bW5Hcm91cFBhbmUgPSBidWlsZFRpdGxlZFBhbmUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX2ludmVyc2VKb2luQ29sdW1uCi0JCSk7Ci0KLQkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBJbnZlcnNlIEpvaW4gQ29sdW1ucyBjaGVjayBib3gKLQkJb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zQ2hlY2tCb3ggPSBidWlsZENoZWNrQm94KAotCQkJYnVpbGRTdWJQYW5lKGludmVyc2VKb2luQ29sdW1uR3JvdXBQYW5lLCA4KSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zLAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRIb2xkZXIoKQotCQkpOwotCi0JCW92ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uc0NoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRJbnZlcnNlU2VsZWN0aW9uTGlzdGVuZXIoKQotCQkpOwotCi0JCUpvaW5Db2x1bW5zQ29tcG9zaXRlPEpvaW5UYWJsZT4gaW52ZXJzZUpvaW5Db2x1bW5zQ29tcG9zaXRlID0gbmV3IEpvaW5Db2x1bW5zQ29tcG9zaXRlPEpvaW5UYWJsZT4oCi0JCQl0aGlzLAotCQkJaW52ZXJzZUpvaW5Db2x1bW5Hcm91cFBhbmUsCi0JCQlidWlsZEludmVyc2VKb2luQ29sdW1uc0VkaXRvcigpCi0JCSk7Ci0KLQkJaW5zdGFsbEludmVyc2VKb2luQ29sdW1uc1BhbmVFbmFibGVyKGludmVyc2VKb2luQ29sdW1uc0NvbXBvc2l0ZSk7Ci0JCXJlbW92ZUZyb21FbmFibGVtZW50Q29udHJvbChpbnZlcnNlSm9pbkNvbHVtbnNDb21wb3NpdGUuZ2V0Q29udHJvbCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbEludmVyc2VKb2luQ29sdW1uc1BhbmVFbmFibGVyKEpvaW5Db2x1bW5zQ29tcG9zaXRlPEpvaW5UYWJsZT4gcGFuZSkgewotCQluZXcgUGFuZUVuYWJsZXIoaW52ZXJzZUpvaW5Db2x1bW5zUGFuZUVuYWJsZXJIb2xkZXIsIHBhbmUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsSm9pbkNvbHVtbnNQYW5lRW5hYmxlcihKb2luQ29sdW1uc0NvbXBvc2l0ZTxKb2luVGFibGU+IHBhbmUpIHsKLQkJbmV3IFBhbmVFbmFibGVyKGpvaW5Db2x1bW5zUGFuZUVuYWJsZXJIb2xkZXIsIHBhbmUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0KLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlKb2luVGFibGUgam9pblRhYmxlID0gc3ViamVjdCgpOwotCQlib29sZWFuIHNlbGVjdGVkID0gb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0KLQkJdHJ5IHsKLQkJCS8vIEFkZCBhIGpvaW4gY29sdW1uIGJ5IGNyZWF0aW5nIGEgc3BlY2lmaWVkIG9uZSB1c2luZyB0aGUgZGVmYXVsdAotCQkJLy8gb25lIGlmIGl0IGV4aXN0cwotCQkJaWYgKHNlbGVjdGVkKSB7Ci0KLQkJCQlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gam9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpOyAvL1RPRE8gbnVsbCBjaGVjaywgb3ZlcnJpZGUgZGVmYXVsdCBidXR0b24gZGlzYWJsZWQKLQotCQkJCWlmIChkZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBjb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0KLQkJCQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoY29sdW1uTmFtZSk7Ci0JCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGluZGV4ID0gam9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKTsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWludmVyc2VKb2luQ29sdW1uc1BhbmVFbmFibGVySG9sZGVyLnNldFZhbHVlKHNlbGVjdGVkKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUpvaW5Db2x1bW5QYW5lc0VuYWJsZW1lbnQoYm9vbGVhbiBnbG9iYWxFbmFibGVtZW50KSB7Ci0KLQkJSm9pblRhYmxlIHN1YmplY3QgICAgICA9IHN1YmplY3QoKTsKLQkJYm9vbGVhbiBlbmFibGVkICAgICAgICA9IGdsb2JhbEVuYWJsZW1lbnQgJiYgKHN1YmplY3QgIT0gbnVsbCkgJiYgc3ViamVjdC5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWJvb2xlYW4gaW52ZXJzZUVuYWJsZWQgPSBnbG9iYWxFbmFibGVtZW50ICYmIChzdWJqZWN0ICE9IG51bGwpICYmIHN1YmplY3QuY29udGFpbnNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQotCQlvdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94ICAgICAgIC5zZXRTZWxlY3Rpb24oZW5hYmxlZCk7Ci0JCW92ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uc0NoZWNrQm94LnNldFNlbGVjdGlvbihpbnZlcnNlRW5hYmxlZCk7Ci0KLQkJam9pbkNvbHVtbnNQYW5lRW5hYmxlckhvbGRlciAgICAgICAuc2V0VmFsdWUoZW5hYmxlZCk7Ci0JCWludmVyc2VKb2luQ29sdW1uc1BhbmVFbmFibGVySG9sZGVyLnNldFZhbHVlKGludmVyc2VFbmFibGVkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSm9pbkNvbHVtbnMoKSB7Ci0KLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlKb2luVGFibGUgam9pblRhYmxlID0gc3ViamVjdCgpOwotCQlib29sZWFuIHNlbGVjdGVkID0gb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKLQotCQl0cnkgewotCQkJLy8gQWRkIGEgam9pbiBjb2x1bW4gYnkgY3JlYXRpbmcgYSBzcGVjaWZpZWQgb25lIHVzaW5nIHRoZSBkZWZhdWx0Ci0JCQkvLyBvbmUgaWYgaXQgZXhpc3RzCi0JCQlpZiAoc2VsZWN0ZWQpIHsKLQotCQkJCUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsgLy9UT0RPIG51bGwgY2hlY2ssIG92ZXJyaWRlIGRlZmF1bHQgYnV0dG9uIGRpc2FibGVkCi0KLQkJCQlpZiAoZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCk7Ci0JCQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCi0JCQkJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoY29sdW1uTmFtZSk7Ci0JCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGluZGV4ID0gam9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpOyAtLWluZGV4ID49IDA7ICkgewotCQkJCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbmRleCk7Ci0JCQkJfQotCQkJfQotCi0JCQlqb2luQ29sdW1uc1BhbmVFbmFibGVySG9sZGVyLnNldFZhbHVlKHNlbGVjdGVkKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBJbnZlcnNlSm9pbkNvbHVtbnNQcm92aWRlciBpbXBsZW1lbnRzIElKb2luQ29sdW1uc0VkaXRvcjxKb2luVGFibGU+IHsKLQotCQlwdWJsaWMgdm9pZCBhZGRKb2luQ29sdW1uKEpvaW5UYWJsZSBzdWJqZWN0KSB7Ci0JCQlKb2luVGFibGVDb21wb3NpdGUudGhpcy5hZGRJbnZlcnNlSm9pbkNvbHVtbihzdWJqZWN0KTsKLQkJfQotCi0JCXB1YmxpYyBKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uKEpvaW5UYWJsZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFByb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBKb2luVGFibGUuREVGQVVMVF9JTlZFUlNFX0pPSU5fQ09MVU1OOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWRpdEpvaW5Db2x1bW4oSm9pblRhYmxlIHN1YmplY3QsIEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuZWRpdEludmVyc2VKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoSm9pblRhYmxlIHN1YmplY3QpIHsKLQkJCXJldHVybiBzdWJqZWN0LmNvbnRhaW5zU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1ucyhKb2luVGFibGUgc3ViamVjdCwgaW50W10gc2VsZWN0ZWRJbmRpY2VzKSB7Ci0JCQlmb3IgKGludCBpbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQkJc3ViamVjdC5yZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoSm9pblRhYmxlIHN1YmplY3QpIHsKLQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQl9Ci0KLQkJcHVibGljIGludCBzcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoSm9pblRhYmxlIHN1YmplY3QpIHsKLQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgc3BlY2lmaWVkTGlzdFByb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBKb2luVGFibGUuU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEpvaW5Db2x1bW5zUHJvdmlkZXIgaW1wbGVtZW50cyBJSm9pbkNvbHVtbnNFZGl0b3I8Sm9pblRhYmxlPiB7Ci0KLQkJcHVibGljIHZvaWQgYWRkSm9pbkNvbHVtbihKb2luVGFibGUgc3ViamVjdCkgewotCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuYWRkSm9pbkNvbHVtbihzdWJqZWN0KTsKLQkJfQotCi0JCXB1YmxpYyBKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uKEpvaW5UYWJsZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBkZWZhdWx0UHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIEpvaW5UYWJsZS5ERUZBVUxUX0pPSU5fQ09MVU1OOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWRpdEpvaW5Db2x1bW4oSm9pblRhYmxlIHN1YmplY3QsIEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuZWRpdEpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucyhKb2luVGFibGUgc3ViamVjdCkgewotCQkJcmV0dXJuIHN1YmplY3QuY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlSm9pbkNvbHVtbnMoSm9pblRhYmxlIHN1YmplY3QsIGludFtdIHNlbGVjdGVkSW5kaWNlcykgewotCQkJZm9yIChpbnQgaW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJCXN1YmplY3QucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMoSm9pblRhYmxlIHN1YmplY3QpIHsKLQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IHNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZShKb2luVGFibGUgc3ViamVjdCkgewotCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHNwZWNpZmllZExpc3RQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gSm9pblRhYmxlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0xvYkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Mb2JDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljMDRiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0xvYkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIHRoZSBMb2IgY2hlY2sgYm94LgotICoKLSAqIEBzZWUgQmFzaWNNYXBwaW5nCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2JDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPEJhc2ljTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkxvYkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgTG9iQ29tcG9zaXRlKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIEJhc2ljTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TG9iQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBMb2JDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxCYXNpY01hcHBpbmcsIEJvb2xlYW4+IGJ1aWxkTG9iSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2ljTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBCYXNpY01hcHBpbmcuTE9CX1BST1BFUlRZKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaXNMb2IoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0TG9iKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlidWlsZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJhc2ljR2VuZXJhbFNlY3Rpb25fbG9iTGFiZWwsCi0JCQlidWlsZExvYkhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19MT0IKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNDczNmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gSm9pbiBUYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luVGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBNYW55VG9NYW55TWFwcGluZwotICogQHNlZSBCYXNlSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIENhc2NhZGVDb21wb3NpdGUKLSAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIEpvaW5UYWJsZUNvbXBvc2l0ZQotICogQHNlZSBPcmRlcmluZ0NvbXBvc2l0ZQotICogQHNlZSBUYXJnZXRFbnRpdHlDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxNYW55VG9NYW55TWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZTxNYW55VG9NYW55TWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb01hbnlNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FzY2FkZT4gYnVpbGRDYXNjYWRlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPE1hbnlUb01hbnlNYXBwaW5nLCBDYXNjYWRlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhc2NhZGUgdHJhbnNmb3JtXyhNYW55VG9NYW55TWFwcGluZyB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDYXNjYWRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Sm9pblRhYmxlPiBidWlsZEpvaW50VGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8TWFueVRvTWFueU1hcHBpbmcsIEpvaW5UYWJsZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKb2luVGFibGUgdHJhbnNmb3JtXyhNYW55VG9NYW55TWFwcGluZyB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRKb2luVGFibGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IGdyb3VwQm94TWFyZ2luKSB7Ci0JCXJldHVybiBidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdyb3VwQm94TWFyZ2luKCk7Ci0KLQkJLy8gVGFyZ2V0IEVudGl0eSB3aWRnZXRzCi0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgYnVpbGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pKTsKLQotCQkvLyBGZXRjaCBUeXBlIHdpZGdldHMKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOwotCi0JCS8vIE1hcHBlZCBCeSB3aWRnZXRzCi0JCW5ldyBNYXBwZWRCeUNvbXBvc2l0ZSh0aGlzLCBidWlsZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbikpOwotCi0JCS8vIENhc2NhZGUgd2lkZ2V0cwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCi0JCS8vIE9yZGVyaW5nIHdpZGdldHMKLQkJbmV3IE9yZGVyaW5nQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVKb2luVGFibGVQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBidWlsZENvbGxhcHNhYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfam9pblRhYmxlCi0JCSk7Ci0KLQkJbmV3IEpvaW5UYWJsZUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZEpvaW50VGFibGVIb2xkZXIoKSwKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIEdlbmVyYWwgc3ViIHBhbmUKLQkJaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKGNvbnRhaW5lcik7Ci0KLQkJLy8gSm9pbiBUYWJsZSBzdWIgcGFuZQotCQlpbml0aWFsaXplSm9pblRhYmxlUGFuZShjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjhjY2Y1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5Db2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE1hbnlUb09uZU1hcHBpbmcKLSAqIEBzZWUgQmFzZUpwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICogQHNlZSBDYXNjYWRlQ29tcG9zaXRlCi0gKiBAc2VlIEZldGNoVHlwZUNvbXBvc2l0ZQotICogQHNlZSBKb2luQ29sdW1uQ29tcG9zaXRlCi0gKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCi0gKiBAc2VlIFRhcmdldEVudGl0eUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8TWFueVRvT25lTWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlPE1hbnlUb09uZU1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb09uZU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhc2NhZGU+IGJ1aWxkQ2FzY2FkZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxNYW55VG9PbmVNYXBwaW5nLCBDYXNjYWRlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhc2NhZGUgdHJhbnNmb3JtXyhNYW55VG9PbmVNYXBwaW5nIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENhc2NhZGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IGdyb3VwQm94TWFyZ2luKSB7Ci0JCXJldHVybiBidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdyb3VwQm94TWFyZ2luKCk7Ci0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gYnVpbGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pOwotCi0JCS8vIFRhcmdldCBFbnRpdHkgd2lkZ2V0cwotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIHN1YlBhbmUpOwotCi0JCS8vIEZldGNoIFR5cGUgd2lkZ2V0cwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIHN1YlBhbmUpOwotCi0JCS8vIE9wdGlvbmFsIGNoZWNrIGJveAotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgYnVpbGRTdWJQYW5lKHN1YlBhbmUsIDQpKTsKLQotCQkvLyBDYXNjYWRlIHdpZGdldHMKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0KLQkJLy8gSm9pbiBDb2x1bW4gd2lkZ2V0cwotCQluZXcgSm9pbkNvbHVtbkNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFwQXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFwQXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxYjg5MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hcEFzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Qb3N0RXhlY3V0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5GaWx0ZXJlZEl0ZW1zU2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIFRoaXMgbWFwIGFzIGNvbXBvc2l0ZSBzaW1wbHkgc2hvd3MgYSBzdHlsZWQgdGV4dCB3aGVyZSB0aGUgbmFtZSBvZiB0aGUKLSAqIG1hcHBpbmcgYW5kIGl0cyB0eXBlIGFyZSBkaXNwbGF5ZWQuIFRoZSBtYXBwaW5nIHR5cGUgY2FuIGJlIGNsaWNrZWQgb24gdG8KLSAqIGludm9rZSBhIGRpYWxvZyBpbiBvcmRlciB0byBjaGFuZ2UgdGhlIHR5cGUuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEF0dHJpYnV0ZSAnbmFtZScgaXMgbWFwcGVkIGFzIG9uZSB0byBvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDCr8Kvwq/Cr8Kvwq/Cr8Kvwq/CryAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNYXBBc0NvbXBvc2l0ZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQWJzdHJhY3RQYW5lPFQ+IHsKLQotCXByaXZhdGUgYm9vbGVhbiBkcmFnRXZlbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQ7Ci0JcHJpdmF0ZSBDdXJzb3IgaGFuZEN1cnNvcjsKLQlwcml2YXRlIE1hcHBpbmdDaGFuZ2VIYW5kbGVyIG1hcHBpbmdDaGFuZ2VIYW5kbGVyOwotCXByaXZhdGUgaW50IG1hcHBpbmdUeXBlTGVuZ3RoOwotCXByaXZhdGUgaW50IG1hcHBpbmdUeXBlU3RhcnQ7Ci0JcHJpdmF0ZSBib29sZWFuIG1vdXNlRG93bjsKLQlwcml2YXRlIGludCBuYW1lTGVuZ3RoOwotCXByaXZhdGUgaW50IG5hbWVTdGFydDsKLQlwcml2YXRlIFN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQotCS8qKgotCSAqIFRoZSBjb25zdGFudCBJRCB1c2VkIHRvIHJldHJpZXZlIHRoZSBkaWFsb2cgc2V0dGluZ3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19TRVRUSU5HUyA9ICJvcmcuZWNsaXBzZS5qcHQudWkuZGlhbG9ncy5NYXBBc0RpYWxvZyI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcEFzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgTWFwQXNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IHByb3ZpZGVyIHJlc3BvbnNpYmxlIGZvciBjbGVhcmluZyB0aGUgbWFwcGluZyB0eXBlLgotCSAqCi0JICogQHJldHVybiBBIHByb3ZpZGVyIHRoYXQgYWN0cyBhcyBhIGRlZmF1bHQgbWFwcGluZyBwcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBNYXBwaW5nVWlQcm92aWRlcjw/PiBidWlsZERlZmF1bHRQcm92aWRlcigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgaGFuZGxlciByZXNwb25zaWJsZSB0byBnaXZlIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IKLQkgKiBjb21wbGV0aW5nIHRoZSBiZWhhdmlvciBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPk1hcHBpbmdDaGFuZ2VIYW5kbGVyPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBNYXBwaW5nQ2hhbmdlSGFuZGxlciBidWlsZE1hcHBpbmdDaGFuZ2VIYW5kbGVyKCk7Ci0KLQlwcml2YXRlIE1vdXNlTGlzdGVuZXIgYnVpbGRNb3VzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUuYnV0dG9uID09IDEpIHsKLQkJCQkJbW91c2VEb3duID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkJbW91c2VEb3duID0gZmFsc2U7Ci0JCQkJU3R5bGVkVGV4dCB0ZXh0ID0gKFN0eWxlZFRleHQpIGUud2lkZ2V0OwotCQkJCWludCBvZmZzZXQgPSB0ZXh0LmdldENhcmV0T2Zmc2V0KCk7Ci0KLQkJCQlpZiAoZHJhZ0V2ZW50KSB7Ci0JCQkJCWRyYWdFdmVudCA9IGZhbHNlOwotCi0JCQkJCWlmIChpc092ZXJMaW5rKG9mZnNldCkpIHsKLQkJCQkJCXRleHQuc2V0Q3Vyc29yKGhhbmRDdXJzb3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGlzT3Zlckxpbmsob2Zmc2V0KSkgewotCQkJCQl0ZXh0LnNldEN1cnNvcihoYW5kQ3Vyc29yKTsKLQkJCQkJb3Blbk1hcHBpbmdTZWxlY3Rpb25EaWFsb2coKTsKLQkJCQkJdGV4dC5zZXRDdXJzb3IobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW91c2VNb3ZlTGlzdGVuZXIgYnVpbGRNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKLQkJCQlTdHlsZWRUZXh0IHRleHQgPSAoU3R5bGVkVGV4dCkgZS53aWRnZXQ7Ci0KLQkJCQlpZiAobW91c2VEb3duKSB7Ci0JCQkJCWlmICghZHJhZ0V2ZW50KSB7Ci0JCQkJCQl0ZXh0LnNldEN1cnNvcihudWxsKTsKLQkJCQkJfQotCi0JCQkJCWRyYWdFdmVudCA9IHRydWU7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpbnQgb2Zmc2V0ID0gLTE7Ci0KLQkJCQl0cnkgewotCQkJCQlvZmZzZXQgPSB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KGUueCwgZS55KSk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCQl9Ci0KLQkJCQlpZiAoaXNPdmVyTGluayhvZmZzZXQpKSB7Ci0JCQkJCXRleHQuc2V0Q3Vyc29yKGhhbmRDdXJzb3IpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGV4dC5zZXRDdXJzb3IobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxNYXBwaW5nU2VsZWN0aW9uRGlhbG9nPiBidWlsZFBvc3RFeGVjdXRpb24oKSB7Ci0KLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPE1hcHBpbmdTZWxlY3Rpb25EaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShNYXBwaW5nU2VsZWN0aW9uRGlhbG9nIGRpYWxvZykgewotCi0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJCQlNYXBwaW5nVWlQcm92aWRlcjw/PiBwcm92aWRlciA9IChNYXBwaW5nVWlQcm92aWRlcjw/PikgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0JCQkJCW1vcnBoTWFwcGluZyhwcm92aWRlcik7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGZ1bGwgbG9jYWxpemVkIHN0cmluZyBieSBmb3JtYXR0aW5nIHRoZSBsYWJlbCB0ZXh0IHJldHVybmVkCi0JICogYnkgdGhlIDxjb2RlPk1hcHBpbmdDaGFuZ2VIYW5kbGVyPC9jb2RlPiB3aXRoIHRoZSBtYXBwaW5nIG5hbWUgYW5kIHRoZQotCSAqIG1hcHBpbmcgdHlwZS4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIFRoZSBkaXNwbGF5IHN0cmluZyBvZiB0aGUgbWFwcGluZyBiZWluZyBlZGl0ZWQKLQkgKiBAcGFyYW0gbWFwcGluZ1R5cGUgVGhlIGxvY2FsaXplZCBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIG1hcHBpbmcgdHlwZQotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbWFwcGluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KFN0cmluZyBuYW1lLCBTdHJpbmcgbWFwcGluZ1R5cGUpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJbWFwcGluZ0NoYW5nZUhhbmRsZXIubGFiZWxUZXh0KCksCi0JCQluYW1lLAotCQkJbWFwcGluZ1R5cGUKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFueSBzdHlsZSBhcHBsaWVkIHRvIHRoZSBzdHlsZWQgdGV4dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclN0eWxlUmFuZ2UoKSB7Ci0JCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZShudWxsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXVwZGF0ZURlc2NyaXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQotCQlpZiAoIXN0eWxlZFRleHQuaXNEaXNwb3NlZCgpKSB7Ci0JCQlzdHlsZWRUZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJCWlmIChlbmFibGVkKSB7Ci0JCQkJdXBkYXRlTGlua1JhbmdlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljbGVhclN0eWxlUmFuZ2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0KLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCi0JCXRoaXMuZW5hYmxlZCA9IHRydWU7Ci0JCXRoaXMubWFwcGluZ0NoYW5nZUhhbmRsZXIgPSBidWlsZE1hcHBpbmdDaGFuZ2VIYW5kbGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaGFuZEN1cnNvciA9IHNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcihTV1QuQ1VSU09SX0hBTkQpOwotCi0JCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChjb250YWluZXIsIFNXVC5XUkFQIHwgU1dULlJFQURfT05MWSk7Ci0JCXN0eWxlZFRleHQuYWRkTW91c2VMaXN0ZW5lcihidWlsZE1vdXNlTGlzdGVuZXIoKSk7Ci0JCXN0eWxlZFRleHQuYWRkTW91c2VNb3ZlTGlzdGVuZXIoYnVpbGRNb3VzZU1vdmVMaXN0ZW5lcigpKTsKLQkJc3R5bGVkVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZSB0aGUgPGNvZGU+TWFwcGluZ1VpUHJvdmlkZXI8L2NvZGU+IHRoYXQgcHJvdmlkZXMgdGhlIFVJIGZvciB0aGUKLQkgKiBjdXJyZW50IG1hcHBpbmcuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5NYXBwaW5nVWlQcm92aWRlcjwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIHRoZQotCSAqIG1hcHBpbmcgYmVpbmcgZWRpdGVkCi0JICovCi0JcHJvdGVjdGVkIE1hcHBpbmdVaVByb3ZpZGVyPD8+IGluaXRpYWxTZWxlY3Rpb24oKSB7Ci0KLQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpUHJvdmlkZXI8Pz4+IGl0ZXIgPSBtYXBwaW5nQ2hhbmdlSGFuZGxlci5wcm92aWRlcnMoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJTWFwcGluZ1VpUHJvdmlkZXI8Pz4gcHJvdmlkZXIgPSBpdGVyLm5leHQoKTsKLQotCQkJaWYgKG1hcHBpbmdLZXkoKSA9PSBwcm92aWRlci5nZXRNYXBwaW5nS2V5KCkpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGxvY2F0aW9uIGlzIHdpdGhpbiB0aGUgbWFwcGluZyB0eXBlIHJhbmdlLgotCSAqCi0JICogQHBhcmFtIGxvY2F0aW9uIFRoZSBtb3VzZSBsb2NhdGlvbiBpbiBjaGFyYWN0ZXIgY29vcmRpbmF0ZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vdXNlIGlzIG92ZXIgdGhlIG1hcHBpbmcgdHlwZSB0ZXh0OwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc092ZXJMaW5rKGludCBsb2NhdGlvbikgewotCi0JCXJldHVybiAobG9jYXRpb24gPj0gbWFwcGluZ1R5cGVTdGFydCAmJgotCQkgICAgICAgIGxvY2F0aW9uIDw9IG1hcHBpbmdUeXBlU3RhcnQgKyBtYXBwaW5nVHlwZUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFwcGluZyBrZXkgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IG1hcHBpbmcgb2JqZWN0LgotCSAqCi0JICogQHJldHVybiBBIG5vbi08Y29kZT5udWxsPC9jb2RlPiB1bmlxdWUgaWRlbnRpZmllciByZXByZXNlbnRpbmcgdGhlIHR5cGUKLQkgKiBvZiB0aGUgbWFwcGluZyBiZWluZyBlZGl0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIG1hcHBpbmdLZXkoKTsKLQotCS8qKgotCSAqIEFrcyB0aGUgPGNvZGU+TWFwcGluZ0NoYW5nZUhhbmRsZXI8L2NvZGU+IHRvIGNoYW5nZSB0aGUgbWFwcGluZyB0eXBlIHVzaW5nCi0JICogdGhlIGdpdmVuIDxjb2RlPk1hcHBpbmdVaVByb3ZpZGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG1hcHBpbmcgdHlwZSB1c2VkIGZvcgotCSAqIG1vcnBoaW5nIHRoZSBtYXBwaW5nIGJlaW5nIGVkaXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vcnBoTWFwcGluZyhNYXBwaW5nVWlQcm92aWRlcjw/PiBwcm92aWRlcikgewotCQltYXBwaW5nQ2hhbmdlSGFuZGxlci5tb3JwaE1hcHBpbmcocHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBkaWFsb2cgdGhhdCBzaG93cyB0aGUgcmVnaXN0ZXJlZCBtYXBwaW5nIHR5cGVzIGluIG9yZGVyIGZvciB0aGUKLQkgKiB1c2VyIHRvIHNlbGVjdCBhIHByb3ZpZGVyIGluIG9yZGVyIHRvIGNoYW5nZSB0aGUgbWFwcGluZyB0eXBlIG9mIHRoZQotCSAqIG1hcHBpbmcgYmVpbmcgZWRpdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5NYXBwaW5nU2VsZWN0aW9uRGlhbG9nKCkgewotCi0JCU1hcHBpbmdTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IE1hcHBpbmdTZWxlY3Rpb25EaWFsb2coKTsKLQkJU1dUVXRpbC5zaG93KGRpYWxvZywgYnVpbGRQb3N0RXhlY3V0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGRlc2NyaXB0aW9uIGJ5IHJlY3JlYXRpbmcgdGhlIGxhYmVsLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlc2NyaXB0aW9uKCkgewotCi0JCWNsZWFyU3R5bGVSYW5nZSgpOwotCQl1cGRhdGVUZXh0KCk7Ci0KLQkJaWYgKGVuYWJsZWQpIHsKLQkJCXVwZGF0ZUxpbmtSYW5nZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgY29sb3JzIG9mIHRoZSB0ZXh0OiAoMSkgdGhlIG5hbWUgaXMgc2hvd24gaW4gYm9sZCBhbmQgKDIpIHRoZQotCSAqIG1hcHBpbmcgdHlwZSBpcyBzaG93biBpbiBib2xkIGFuZCBpbiBoeXBlcmxpbmsgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGlua1JhbmdlKCkgewotCi0JCUNvbG9yIGxpbmtDb2xvciA9IEpGYWNlQ29sb3JzLmdldEh5cGVybGlua1RleHQoc2hlbGwoKS5nZXREaXNwbGF5KCkpOwotCi0JCS8vIE1ha2UgdGhlIG5hbWUgYm9sZAotCQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSgKLQkJCW5hbWVTdGFydCwgbmFtZUxlbmd0aCwKLQkJCW51bGwsIG51bGwsCi0JCQlTV1QuQk9MRAotCQkpOwotCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGVSYW5nZSk7Ci0KLQkJLy8gTWFrZSB0aGUgbWFwcGluZyB0eXBlIHNob3duIGFzIGEgaHlwZXJsaW5rCi0JCWlmIChtYXBwaW5nVHlwZVN0YXJ0ID4gLTEpIHsKLQkJCXN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSgKLQkJCQltYXBwaW5nVHlwZVN0YXJ0LCBtYXBwaW5nVHlwZUxlbmd0aCwKLQkJCQlsaW5rQ29sb3IsIG51bGwKLQkJCSk7Ci0KLQkJCXN0eWxlUmFuZ2UudW5kZXJsaW5lICAgICAgPSB0cnVlOwotCQkJc3R5bGVSYW5nZS51bmRlcmxpbmVDb2xvciA9IGxpbmtDb2xvcjsKLQkJCXN0eWxlUmFuZ2UudW5kZXJsaW5lU3R5bGUgPSBTV1QuVU5ERVJMSU5FX1NJTkdMRTsKLQkJCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZShzdHlsZVJhbmdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHN0eWxlcyB0ZXh0J3MgaW5wdXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGV4dCgpIHsKLQotCQlTdHJpbmcgbmFtZSA9IG1hcHBpbmdDaGFuZ2VIYW5kbGVyLm5hbWUoKTsKLQotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQluYW1lID0gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk5vTmFtZVNldDsKLQkJfQotCi0JCVN0cmluZyBtYXBwaW5nVHlwZSA9IG1hcHBpbmdDaGFuZ2VIYW5kbGVyLm1hcHBpbmdUeXBlKCk7Ci0JCVN0cmluZyB0ZXh0ID0gYnVpbGRUZXh0KG5hbWUsIG1hcHBpbmdUeXBlKTsKLQotCQltYXBwaW5nVHlwZVN0YXJ0ICA9IHRleHQubGFzdEluZGV4T2YobWFwcGluZ1R5cGUpOwotCQltYXBwaW5nVHlwZUxlbmd0aCA9IG1hcHBpbmdUeXBlLmxlbmd0aCgpOwotCi0JCW5hbWVTdGFydCAgPSB0ZXh0LmluZGV4T2YobmFtZSk7Ci0JCW5hbWVMZW5ndGggPSBuYW1lLmxlbmd0aCgpOwotCi0JCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgdG8gZ2l2ZSB0aGUgdGV4dCBpbmZvcm1hdGlvbiBhbmQgdG8gb3BlbiB0aGUKLQkgKiBtYXBwaW5nIGRpYWxvZyBpZiB0aGUgdXNlciBjbGlja2VkIG9uIHRoZSBtYXBwaW5nIHR5cGUuCi0JICovCi0JcHJvdGVjdGVkIGludGVyZmFjZSBNYXBwaW5nQ2hhbmdlSGFuZGxlciB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIGVudGlyZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIG1hcHBpbmcgKGVudGl0eSBvciBtYXBwaW5nKSBhbmQKLQkJICogaXRzIHR5cGUuCi0JCSAqCi0JCSAqIEByZXR1cm4gQSBsb2NhbGl6ZWQgdGV4dCB3aXRoIHR3byBhcmd1bWVudHMgd2hlcmUgdGhlIGZpcnN0IG9uZSBzaG91bGQKLQkJICogYmUgcmVwbGFjZWQgYnkgdGhlIG5hbWUgYW5kIHRoZSBzZWNvbmQgYmUgcmVwbGFjZWQgYnkgdGhlIG1hcHBpbmcgdHlwZQotCQkgKi8KLQkJU3RyaW5nIGxhYmVsVGV4dCgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSB0ZXh0IHJlcHJlc2VudGluZyB0aGUgbWFwcGluZyB0eXBlLgotCQkgKgotCQkgKiBAcmV0dXJuIEEgaHVtYW4gcmVhZGFibGUgdGV4dCBkZXNjcmliaW5nIHRoZSBtYXBwaW5nIHR5cGUKLQkJICovCi0JCVN0cmluZyBtYXBwaW5nVHlwZSgpOwotCi0JCS8qKgotCQkgKiBNb3JwaGVzIHRoZSBjdXJyZW50IG1hcHBpbmcgaW50byBhIG5ldyB0eXBlIGJ5IHVzaW5nIHRoZSBnaXZlbiBwcm92aWRlci4KLQkJICoKLQkJICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IHdhcyBzZWxlY3RlZCBmb3IgY2hhbmdpbmcgdGhlIG1hcHBpbmcKLQkJICovCi0JCXZvaWQgbW9ycGhNYXBwaW5nKE1hcHBpbmdVaVByb3ZpZGVyPD8+IHByb3ZpZGVyKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBtYXBwaW5nLgotCQkgKgotCQkgKiBAcmV0dXJuIFRoZSBkaXNwbGF5YWJsZSBuYW1lIG9mIHRoZSBtYXBwaW5nCi0JCSAqLwotCQlTdHJpbmcgbmFtZSgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIEpQVCBwbHVnaW4uCi0JCSAqCi0JCSAqIEByZXR1cm4gVGhlIHN1cHBvcnRlZCB0eXBlcyBvZiBtYXBwaW5nCi0JCSAqLwotCQlJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpUHJvdmlkZXI8Pz4+IHByb3ZpZGVycygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGlhbG9nIHNob3dzIHRoZSBsaXN0IG9mIHBvc3NpYmxlIG1hcHBpbmcgdHlwZXMgYW5kIGxldHMgdGhlIHVzZXIKLQkgKiB0aGUgb3B0aW9uIHRvIGZpbHRlciB0aGVtIHVzaW5nIGEgc2VhcmNoIGZpZWxkLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBNYXBwaW5nU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgRmlsdGVyZWRJdGVtc1NlbGVjdGlvbkRpYWxvZyB7Ci0KLQkJcHJpdmF0ZSBNYXBwaW5nVWlQcm92aWRlcjw/PiBkZWZhdWx0UHJvdmlkZXI7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGluZ1NlbGVjdGlvbkRpYWxvZzwvY29kZT4uCi0JCSAqLwotCQlwcml2YXRlIE1hcHBpbmdTZWxlY3Rpb25EaWFsb2coKSB7Ci0JCQlzdXBlcihNYXBBc0NvbXBvc2l0ZS50aGlzLnNoZWxsKCksIGZhbHNlKTsKLQkJCXNldE1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV9sYWJlbFRleHQpOwotCQkJc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV9kaWFsb2dUaXRsZSk7Ci0JCQlzZXRMaXN0TGFiZWxQcm92aWRlcihidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCQlzZXREZXRhaWxzTGFiZWxQcm92aWRlcihidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCi0JCQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJTWFwcGluZ1VpUHJvdmlkZXI8Pz4gcHJvdmlkZXIgPSAoTWFwcGluZ1VpUHJvdmlkZXI8Pz4pIGVsZW1lbnQ7Ci0JCQkJCXJldHVybiBwcm92aWRlci5nZXRJbWFnZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCi0JCQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQkJCXJldHVybiAiIjsKLQkJCQkJfQotCi0JCQkJCU1hcHBpbmdVaVByb3ZpZGVyPD8+IHByb3ZpZGVyID0gKE1hcHBpbmdVaVByb3ZpZGVyPD8+KSBlbGVtZW50OwotCQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0TGFiZWwoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUV4dGVuZGVkQ29udGVudEFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZW1zRmlsdGVyIGNyZWF0ZUZpbHRlcigpIHsKLQkJCXJldHVybiBuZXcgTWFwcGluZ1R5cGVJdGVtc0ZpbHRlcigpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZW50UHJvdmlkZXIoQWJzdHJhY3RDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlbXNGaWx0ZXIgaXRlbXNGaWx0ZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJCW1vbml0b3IuYmVnaW5UYXNrKG51bGwsIC0xKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyBBZGQgdGhlIGRlZmF1bHQgcHJvdmlkZXIKLQkJCQlkZWZhdWx0UHJvdmlkZXIgPSBidWlsZERlZmF1bHRQcm92aWRlcigpOwotCi0JCQkJaWYgKGRlZmF1bHRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCXByb3ZpZGVyLmFkZChkZWZhdWx0UHJvdmlkZXIsIGl0ZW1zRmlsdGVyKTsKLQkJCQl9Ci0KLQkJCQkvLyBBZGQgdGhlIHJlZ2lzdGVyZWQgbWFwcGluZyBwcm92aWRlcnMgdG8gdGhlIGRpYWxvZwotCQkJCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaVByb3ZpZGVyPD8+PiBpdGVyID0gbWFwcGluZ0NoYW5nZUhhbmRsZXIucHJvdmlkZXJzKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCQkJTWFwcGluZ1VpUHJvdmlkZXI8Pz4gbWFwcGluZ1Byb3ZpZGVyID0gaXRlci5uZXh0KCk7Ci0JCQkJCXByb3ZpZGVyLmFkZChtYXBwaW5nUHJvdmlkZXIsIGl0ZW1zRmlsdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCi0JCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBKcHRVaVBsdWdpbi5nZXRQbHVnaW4oKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZGlhbG9nU2V0dGluZ3MuZ2V0U2VjdGlvbihESUFMT0dfU0VUVElOR1MpOwotCi0JCQlpZiAoc2V0dGluZ3MgPT0gbnVsbCkgewotCQkJCXNldHRpbmdzID0gZGlhbG9nU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihESUFMT0dfU0VUVElOR1MpOwotCQkJfQotCi0JCQlyZXR1cm4gc2V0dGluZ3M7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlNYXBwaW5nVWlQcm92aWRlcjw/PiBwcm92aWRlciA9IChNYXBwaW5nVWlQcm92aWRlcjw/Pikgb2JqZWN0OwotCQkJcmV0dXJuIHByb3ZpZGVyLmdldExhYmVsKCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbXBhcmF0b3I8TWFwcGluZ1VpUHJvdmlkZXI8Pz4+IGdldEl0ZW1zQ29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgQ29tcGFyYXRvcjxNYXBwaW5nVWlQcm92aWRlcjw/Pj4oKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKE1hcHBpbmdVaVByb3ZpZGVyPD8+IGl0ZW0xLCBNYXBwaW5nVWlQcm92aWRlcjw/PiBpdGVtMikgewotCi0JCQkJCWlmIChpdGVtMSA9PSBkZWZhdWx0UHJvdmlkZXIpIHsKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJfQotCi0JCQkJCWlmIChpdGVtMiA9PSBkZWZhdWx0UHJvdmlkZXIpIHsKLQkJCQkJCXJldHVybiAxOwotCQkJCQl9Ci0KLQkJCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcxID0gaXRlbTEuZ2V0TGFiZWwoKTsKLQkJCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcyID0gaXRlbTIuZ2V0TGFiZWwoKTsKLQkJCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShkaXNwbGF5U3RyaW5nMSwgZGlzcGxheVN0cmluZzIpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVJdGVtKE9iamVjdCBpdGVtKSB7Ci0KLQkJCWlmIChpdGVtID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsICIiLCBudWxsKTsKLQkJCX0KLQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlIHRoZSBmaWx0ZXIgcmVzcG9uc2libGUgdG8gcmVtb3ZlIGFueSBtYXBwaW5nIHR5cGUgYmFzZWQgb24gdGhlCi0JCSAqIHBhdHRlcm4gZW50ZXJlZCBpbiB0aGUgdGV4dCBmaWVsZC4KLQkJICovCi0JCXByaXZhdGUgY2xhc3MgTWFwcGluZ1R5cGVJdGVtc0ZpbHRlciBleHRlbmRzIEl0ZW1zRmlsdGVyIHsKLQotCQkJLyoqCi0JCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBpbmdUeXBlSXRlbXNGaWx0ZXI8L2NvZGU+LgotCQkJICovCi0JCQlNYXBwaW5nVHlwZUl0ZW1zRmlsdGVyKCkgewotCi0JCQkJc3VwZXIoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IGlmIHRoZSBwYXR0ZXJuIGlzIGVtcHR5LCB3ZSBzcGVjaWZ5ICogaW4gb3JkZXIKLQkJCQkvLyB0byBzaG93IGFsbCB0aGUgbWFwcGluZyB0eXBlcwotCQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldFBhdHRlcm4oKSkpIHsKLQkJCQkJcGF0dGVybk1hdGNoZXIuc2V0UGF0dGVybigiKiIpOwotCQkJCX0KLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqLwotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnNpc3RlbnRJdGVtKE9iamVjdCBpdGVtKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKi8KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gbWF0Y2hJdGVtKE9iamVjdCBpdGVtKSB7Ci0JCQkJTWFwcGluZ1VpUHJvdmlkZXI8Pz4gcHJvdmlkZXIgPSAoTWFwcGluZ1VpUHJvdmlkZXI8Pz4pIGl0ZW07Ci0JCQkJcmV0dXJuIG1hdGNoZXMocHJvdmlkZXIuZ2V0TGFiZWwoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hcHBlZEJ5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hcHBlZEJ5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NDNhZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYXBwZWRCeUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5vbk93bmluZ01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE1hcHBlZCBCeTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBOb25Pd25pbmdNYXBwaW5nCi0gKiBAc2VlIE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE1hcHBlZEJ5Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxOb25Pd25pbmdNYXBwaW5nPgotewotCXByaXZhdGUgQ0NvbWJvIGNvbWJvOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwZWRCeUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgTWFwcGVkQnlDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgTm9uT3duaW5nTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwZWRCeUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklOb25Pd25pbmdNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE1hcHBlZEJ5Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTm9uT3duaW5nTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0KLQkJcHJvcGVydHlOYW1lcy5hZGQoUmVsYXRpb25zaGlwTWFwcGluZy5SRVNPTFZFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZKTsKLQotCQlwcm9wZXJ0eU5hbWVzLmFkZChOb25Pd25pbmdNYXBwaW5nLk1BUFBFRF9CWV9QUk9QRVJUWSk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBidWlsZENvbWJvTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoIWlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCUNDb21ibyBjb21ibyA9IChDQ29tYm8pIGUud2lkZ2V0OwotCQkJCQlpZiAoY29tYm8uZ2V0RGF0YSgicG9wdWxhdGluZyIpICE9IEJvb2xlYW4uVFJVRSkgey8vY2hlY2sgIVRSVUUgYmVjYXVzZSBudWxsIGlzIGEgcG9zc2liaWxpdHkgYXMgd2VsbAotCQkJCQkJdmFsdWVDaGFuZ2VkKGNvbWJvLmdldFRleHQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb21ibyA9IGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk5vbk93bmluZ01hcHBpbmdfbWFwcGVkQnlMYWJlbCwKLQkJCWJ1aWxkQ29tYm9Nb2RpZnlMaXN0ZW5lcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19NQVBQRURfQlkKLQkJKTsKLQotCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoY29tYm8pOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbWJvKCkgewotCi0JCWNvbWJvLnJlbW92ZUFsbCgpOwotCQljb21iby5hZGQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk5vbmVTZWxlY3RlZCk7Ci0KLQkJTm9uT3duaW5nTWFwcGluZyBzdWJqZWN0ID0gc3ViamVjdCgpOwotCi0JCWlmIChzdWJqZWN0ICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IHN1YmplY3QuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCi0JCQlmb3IgKGl0ZXIgPSBDb2xsZWN0aW9uVG9vbHMuc29ydChpdGVyKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJCWNvbWJvLmFkZChpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQl1cGRhdGVTZWxlY3RlZEl0ZW0oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQotCQlpZiAocHJvcGVydHlOYW1lID09IE5vbk93bmluZ01hcHBpbmcuTUFQUEVEX0JZX1BST1BFUlRZIHx8Ci0JCSAgICBwcm9wZXJ0eU5hbWUgPT0gUmVsYXRpb25zaGlwTWFwcGluZy5SRVNPTFZFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZKSB7Ci0KLQkJCXBvcHVsYXRlQ29tYm8oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHNlbGVjdGVkIGl0ZW0gYnkgc2VsZWN0ZWQgdGhlIGN1cnJlbnQgdmFsdWUsIGlmIG5vdAotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCBvciBzZWxlY3QgdGhlIGRlZmF1bHQgdmFsdWUgaWYgb25lIGlzIGF2YWlsYWJsZSwKLQkgKiBvdGhlcndpc2UgcmVtb3ZlIHRoZSBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IEl0IHNlZW1zIHRoZSB0ZXh0IGNhbiBiZSBzaG93biBhcyB0cnVuY2F0ZWQsIGNoYW5naW5nIHRoZQotCSAqIHNlbGVjdGlvbiB0byAoMCwgMCkgbWFrZXMgdGhlIGVudGlyZSB0ZXh0IHZpc2libGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlbGVjdGVkSXRlbSgpIHsKLQotCQlOb25Pd25pbmdNYXBwaW5nIHN1YmplY3QgPSBzdWJqZWN0KCk7Ci0JCVN0cmluZyB2YWx1ZSA9IChzdWJqZWN0ICE9IG51bGwpID8gc3ViamVjdC5nZXRNYXBwZWRCeSgpIDogbnVsbDsKLQotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJY29tYm8uc2V0VGV4dCh2YWx1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljb21iby5zZWxlY3QoMCk7Ci0JCX0KLQotCQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIDApKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsdWVDaGFuZ2VkKFN0cmluZyB2YWx1ZSkgewotCi0JCU5vbk93bmluZ01hcHBpbmcgc3ViamVjdCA9IHN1YmplY3QoKTsKLQkJU3RyaW5nIG9sZFZhbHVlID0gKHN1YmplY3QgIT0gbnVsbCkgPyBzdWJqZWN0LmdldE1hcHBlZEJ5KCkgOiBudWxsOwotCi0JCS8vIENoZWNrIGZvciBudWxsIHZhbHVlCi0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHZhbHVlKSkgewotCQkJdmFsdWUgPSBudWxsOwotCi0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShvbGRWYWx1ZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBUaGUgZGVmYXVsdCB2YWx1ZQotCQlpZiAoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk5vbmVTZWxlY3RlZC5lcXVhbHModmFsdWUpKSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0KLQotCQkvLyBOb3RoaW5nIHRvIGNoYW5nZQotCQlpZiAoKG9sZFZhbHVlID09IHZhbHVlKSAmJiB2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBTZXQgdGhlIG5ldyB2YWx1ZQotCQlpZiAoKHZhbHVlICE9IG51bGwpICYmIChvbGRWYWx1ZSA9PSBudWxsKSB8fAotCQkgICAoKG9sZFZhbHVlICE9IG51bGwpICYmICFvbGRWYWx1ZS5lcXVhbHModmFsdWUpKSkgewotCi0JCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCQl0cnkgewotCQkJCXN1YmplY3Quc2V0TWFwcGVkQnkodmFsdWUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ3M2U5NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IElkQ2xhc3NDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBNYXBwZWRTdXBlcmNsYXNzCi0gKiBAc2VlIEJhc2VKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqIEBzZWUgSWRDbGFzc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8TWFwcGVkU3VwZXJjbGFzcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlPE1hcHBlZFN1cGVyY2xhc3M+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBQcmltYXJ5IEtleSBDbGFzcyB3aWRnZXRzCi0JCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL05hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTIyMzg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCBSZXN1bHQgQ2xhc3M6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJyb3dzZS4uLiB8IHwKLSAqIHwgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogfCBRdWVyeTogICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIFF1ZXJ5IEhpbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgUXVlcnlIaW50c0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJ5Ci0gKiBAc2VlIE5hbWVkTmF0aXZlUXVlcmllc0NvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENsYXNzQ2hvb3NlclBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxOYW1lZE5hdGl2ZVF1ZXJ5PgotewotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxOYW1lZE5hdGl2ZVF1ZXJ5PiByZXN1bHRDbGFzc0Nob29zZXJQYW5lOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZShBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTmFtZWROYXRpdmVRdWVyeT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxOYW1lZE5hdGl2ZVF1ZXJ5PiBidWlsZENsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPE5hbWVkTmF0aXZlUXVlcnk+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxOYW1lZE5hdGl2ZVF1ZXJ5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgTmFtZWROYXRpdmVRdWVyeS5SRVNVTFRfQ0xBU1NfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRSZXN1bHRDbGFzcygpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJCXN1YmplY3Quc2V0UmVzdWx0Q2xhc3ModmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFJlc3VsdENsYXNzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBsYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcmVzdWx0Q2xhc3M7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQkJCUlKYXZhUHJvamVjdCByb290ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHJvb3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRUeXBlKCkgewotCQkJCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0KLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpOwotCQkJCQlzdWJqZWN0KCkuc2V0UmVzdWx0Q2xhc3MoY2xhc3NOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUXVlcnlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE5hbWVkTmF0aXZlUXVlcnksIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBRdWVyeS5RVUVSWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFF1ZXJ5KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0UXVlcnkodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JCXJlc3VsdENsYXNzQ2hvb3NlclBhbmUuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBSZXN1bHQgY2xhc3MgY2hvb3NlcgotCQlyZXN1bHRDbGFzc0Nob29zZXJQYW5lID0gYnVpbGRDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKLQotCQkvLyBRdWVyeSB0ZXh0IGFyZWEKLQkJYnVpbGRMYWJlbGVkTXVsdGlMaW5lVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnksCi0JCQlidWlsZFF1ZXJ5SG9sZGVyKCksCi0JCQk0Ci0JCSk7Ci0KLQkJLy8gUXVlcnkgSGludHMgcGFuZQotCQljb250YWluZXIgPSBidWlsZFRpdGxlZFBhbmUoCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCA1KSwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnlIaW50c0dyb3VwQm94Ci0JCSk7Ci0KLQkJbmV3IFF1ZXJ5SGludHNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZGJmMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBRdWVyeTogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gUXVlcnkgSGludHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCBRdWVyeUhpbnRzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE5hbWVkUXVlcnkKLSAqIEBzZWUgTmFtZWRRdWVyaWVzQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgUXVlcnlIaW50c0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPE5hbWVkUXVlcnk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZShBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTmFtZWRRdWVyeT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFF1ZXJ5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxOYW1lZFF1ZXJ5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgTmFtZWRRdWVyeS5RVUVSWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFF1ZXJ5KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0UXVlcnkodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFF1ZXJ5IHRleHQgYXJlYQotCQlidWlsZExhYmVsZWRNdWx0aUxpbmVUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeSwKLQkJCWJ1aWxkUXVlcnlIb2xkZXIoKSwKLQkJCTQKLQkJKTsKLQotCQkvLyBRdWVyeSBIaW50cyBwYW5lCi0JCWNvbnRhaW5lciA9IGJ1aWxkVGl0bGVkUGFuZSgKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDUpLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeUhpbnRzR3JvdXBCb3gKLQkJKTsKLQotCQluZXcgUXVlcnlIaW50c0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzA1OTA5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9yZGVyaW5nQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBKb2luIFRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5UYWJsZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE9uZVRvTWFueU1hcHBpbmcKLSAqIEBzZWUgQmFzZUpwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICogQHNlZSBDYXNjYWRlQ29tcG9zaXRlCi0gKiBAc2VlIEZldGNoVHlwZUNvbXBvc2l0ZQotICogQHNlZSBKb2luVGFibGVDb21wb3NpdGUKLSAqIEBzZWUgT3JkZXJpbmdDb21wb3NpdGUKLSAqIEBzZWUgVGFyZ2V0RW50aXR5Q29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxPbmVUb01hbnlNYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGU8T25lVG9NYW55TWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9NYW55TWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FzY2FkZT4gYnVpbGRDYXNjYWRlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPE9uZVRvTWFueU1hcHBpbmcsIENhc2NhZGU+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FzY2FkZSB0cmFuc2Zvcm1fKE9uZVRvTWFueU1hcHBpbmcgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q2FzY2FkZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEpvaW5UYWJsZT4gYnVpbGRKb2ludFRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPE9uZVRvTWFueU1hcHBpbmcsIEpvaW5UYWJsZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKb2luVGFibGUgdHJhbnNmb3JtXyhPbmVUb01hbnlNYXBwaW5nIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldEpvaW5UYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdyb3VwQm94TWFyZ2luKCk7Ci0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKTsKLQotCQkvLyBUYXJnZXQgRW50aXR5IHdpZGdldHMKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBzdWJQYW5lKTsKLQotCQkvLyBGZXRjaCBUeXBlIHdpZGdldHMKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBzdWJQYW5lKTsKLQotCQkvLyBNYXBwZWQgQnkgd2lkZ2V0cwotCQluZXcgTWFwcGVkQnlDb21wb3NpdGUodGhpcywgc3ViUGFuZSk7Ci0KLQkJLy8gQ2FzY2FkZSB3aWRnZXRzCi0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBidWlsZFN1YlBhbmUoY29udGFpbmVyLCA0KSk7Ci0KLQkJLy8gT3JkZXJpbmcgd2lkZ2V0cwotCQluZXcgT3JkZXJpbmdDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUpvaW5UYWJsZVBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGJ1aWxkQ29sbGFwc2FibGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9qb2luVGFibGUKLQkJKTsKLQotCQluZXcgSm9pblRhYmxlQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWJ1aWxkSm9pbnRUYWJsZUhvbGRlcigpLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gR2VuZXJhbCBzdWIgcGFuZQotCQlpbml0aWFsaXplR2VuZXJhbFBhbmUoY29udGFpbmVyKTsKLQotCQkvLyBKb2luIFRhYmxlIHN1YiBwYW5lCi0JCWluaXRpYWxpemVKb2luVGFibGVQYW5lKGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTEzYTJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5DYXNjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE1hcHBlZEJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5Db2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE9uZVRvT25lTWFwcGluZwotICogQHNlZSBCYXNlSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIENhc2NhZGVDb21wb3NpdGUKLSAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIEpvaW5Db2x1bW5Db21wb3NpdGUKLSAqIEBzZWUgTWFwcGVkQnlDb21wb3NpdGUKLSAqIEBzZWUgT3B0aW9uYWxDb21wb3NpdGUKLSAqIEBzZWUgVGFyZ2V0RW50aXR5Q29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPE9uZVRvT25lTWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGU8T25lVG9PbmVNYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU9uZVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDYXNjYWRlPiBidWlsZENhc2NhZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T25lVG9PbmVNYXBwaW5nLCBDYXNjYWRlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhc2NhZGUgdHJhbnNmb3JtXyhPbmVUb09uZU1hcHBpbmcgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q2FzY2FkZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdyb3VwQm94TWFyZ2luKCk7Ci0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKTsKLQotCQkvLyBUYXJnZXQgRW50aXR5IHdpZGdldHMKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBzdWJQYW5lKTsKLQotCQkvLyBGZXRjaCBUeXBlIHdpZGdldHMKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBzdWJQYW5lKTsKLQotCQkvLyBNYXBwZWQgQnkgd2lkZ2V0cwotCQluZXcgTWFwcGVkQnlDb21wb3NpdGUodGhpcywgc3ViUGFuZSk7Ci0KLQkJLy8gT3B0aW9uYWwgY2hlY2sgYm94Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBidWlsZFN1YlBhbmUoc3ViUGFuZSwgNCkpOwotCi0JCS8vIENhc2NhZGUgd2lkZ2V0cwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQkvLyBKb2luIENvbHVtbiB3aWRnZXRzCi0JCW5ldyBKb2luQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT3B0aW9uYWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT3B0aW9uYWxDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0ZTc5MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09wdGlvbmFsQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OdWxsYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIGEgdHJpLXN0YXRlIGNoZWNrIGJveCBmb3IgdGhlIE9wdGlvbmFsIG9wdGlvbi4KLSAqCi0gKiBAc2VlIEJhc2ljTWFwcGluZwotICogQHNlZSBCYXNpY01hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE9wdGlvbmFsQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxOdWxsYWJsZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9wdGlvbmFsQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcHRpb25hbENvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBOdWxsYWJsZT4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE9wdGlvbmFsSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxOdWxsYWJsZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBOdWxsYWJsZS5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0U3BlY2lmaWVkT3B0aW9uYWwodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJCQlzdXBlci5zdWJqZWN0Q2hhbmdlZCgpOwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dAotCQkJCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuZmlyZUFzcGVjdENoYW5nZShCb29sZWFuLlRSVUUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE9wdGlvbmFsU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZE9wdGlvbmFsSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0T3B0aW9uYWwoKTsKLQotCQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQotCQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX1RydWUgOgotCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCi0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbERlZmF1bHQsCi0JCQkJCQkJZGVmYXVsdFN0cmluZ1ZhbHVlCi0JCQkJCQkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5CYXNpY0dlbmVyYWxTZWN0aW9uX29wdGlvbmFsTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJYnVpbGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsLAotCQkJYnVpbGRPcHRpb25hbEhvbGRlcigpLAotCQkJYnVpbGRPcHRpb25hbFN0cmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUFRJT05BTAotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09yZGVyaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09yZGVyaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3N2M3MjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PcmRlcmluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtIE9yZGVyIEJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgbyBObyBPcmRlcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIFByaW1hcnkgS2V5IE9yZGVyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gQ3VzdG9tIE9yZGVyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgICB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi0gKiBAc2VlIE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JkZXJpbmdDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPE11bHRpUmVsYXRpb25zaGlwTWFwcGluZz4KLXsKLQlwcml2YXRlIFRleHQgY3VzdG9tT3JkZXJpbmdUZXh0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcmRlcmluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JkZXJpbmdDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9yZGVyaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcmRlcmluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5PUkRFUl9CWV9QUk9QRVJUWSk7Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBidWlsZEN1c3RvbVRleHRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmICghaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGUud2lkZ2V0OwotCQkJCQl2YWx1ZUNoYW5nZWQodGV4dC5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXBvcHVsYXRlQ3VzdG9tT3JkZXJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBPcmRlciBCeSBncm91cAotCQlHcm91cCBvcmRlckJ5R3JvdXAgPSBidWlsZFRpdGxlZFBhbmUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuT3JkZXJCeUNvbXBvc2l0ZV9vcmRlckJ5R3JvdXAsCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZKTsKLQotCQkvLyBObyBPcmRlcmluZyByYWRpbyBidXR0b24KLQkJYnVpbGRSYWRpb0J1dHRvbigKLQkJCWJ1aWxkU3ViUGFuZShvcmRlckJ5R3JvdXAsIDgpLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk9yZGVyQnlDb21wb3NpdGVfbm9PcmRlcmluZywKLQkJCWJ1aWxkTm9PcmRlcmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUkRFUl9CWV9OT19PUkRFUklORwotCQkpOwotCi0JCS8vIE9yZGVyIGJ5IFByaW1hcnkgS2V5IHJhZGlvIGJ1dHRvbgotCQlidWlsZFJhZGlvQnV0dG9uKAotCQkJb3JkZXJCeUdyb3VwLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk9yZGVyQnlDb21wb3NpdGVfcHJpbWFyeUtleU9yZGVyaW5nLAotCQkJYnVpbGRQcmltYXJ5S2V5T3JkZXJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQllfUFJJTUFSWV9LRVlfT1JERVJJTkcKLQkJKTsKLQotCQkvLyBDdXN0b20gT3JkZXJpbmcgcmFkaW8gYnV0dG9uCi0JCWJ1aWxkUmFkaW9CdXR0b24oCi0JCQlvcmRlckJ5R3JvdXAsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuT3JkZXJCeUNvbXBvc2l0ZV9jdXN0b21PcmRlcmluZywKLQkJCWJ1aWxkQ3VzdG9tT3JkZXJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQllfQ1VTVE9NX09SREVSSU5HCi0JCSk7Ci0KLQkJLy8gQ3VzdG9tIE9yZGVyaW5nIHRleHQgZmllbGQKLQkJY3VzdG9tT3JkZXJpbmdUZXh0ID0gYnVpbGRUZXh0KAotCQkJYnVpbGRTdWJQYW5lKG9yZGVyQnlHcm91cCwgMCwgMTYpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUkRFUl9CWQotCQkpOwotCi0JCWN1c3RvbU9yZGVyaW5nVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihidWlsZEN1c3RvbVRleHRNb2RpZnlMaXN0ZW5lcigpKTsKLQkJaW5zdGFsbEN1c3RvbVRleHRFbmFibGVyKGN1c3RvbU9yZGVyaW5nVGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxDdXN0b21UZXh0RW5hYmxlcihUZXh0IHRleHQpIHsKLQkJbmV3IENvbnRyb2xFbmFibGVyKGJ1aWxkQ3VzdG9tT3JkZXJpbmdIb2xkZXIoKSwgdGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEN1c3RvbU9yZGVyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLkNVU1RPTV9PUkRFUklOR19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHN1YmplY3QuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0Q3VzdG9tT3JkZXJpbmcodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb09yZGVyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLk5PX09SREVSSU5HX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2Yoc3ViamVjdC5pc05vT3JkZXJpbmcoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldE5vT3JkZXJpbmcodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQcmltYXJ5S2V5T3JkZXJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE11bHRpUmVsYXRpb25zaGlwTWFwcGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuUEtfT1JERVJJTkdfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihzdWJqZWN0LmlzUGtPcmRlcmluZygpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0UGtPcmRlcmluZyh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUN1c3RvbU9yZGVyaW5nKCkgewotCi0JCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmIHN1YmplY3QoKS5nZXRPcmRlckJ5KCkgIT0gbnVsbCkgewotCQkJY3VzdG9tT3JkZXJpbmdUZXh0LnNldFRleHQoc3ViamVjdCgpLmdldE9yZGVyQnkoKSk7Ci0JCX0KLQkJZWxzZSAgewotCQkJY3VzdG9tT3JkZXJpbmdUZXh0LnNldFRleHQoIiIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0KLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuT1JERVJfQllfUFJPUEVSVFkpIHsKLQkJCXBvcHVsYXRlQ3VzdG9tT3JkZXJpbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2YWx1ZUNoYW5nZWQoU3RyaW5nIHZhbHVlKSB7Ci0KLQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKLQotCQl0cnkgewotCQkJc3ViamVjdCgpLnNldE9yZGVyQnkodmFsdWUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT3JtUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MmM2YjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgIk1hcCBBcyIgY29tcG9zaXRlIGlzIHJlc3BvbnNpYmxlIGZvciBzaG93aW5nIHRoZSBtYXBwaW5nIG5hbWUgYW5kCi0gKiBtYXBwaW5nIHR5cGUgZm9yIGFuIGF0dHJpYnV0ZSBkZWNsYXJlZCB3aXRoaW4gYSBKUEEgbWFwcGluZyBkZXNjcmlwdG9yIGZpbGUuCi0gKgotICogQHNlZSBPcm1QZXJzaXN0ZW50QXR0cmlidXRlCi0gKiBAc2VlIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUgZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGU8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKSB7Ci0JCXJldHVybiBqcGFQbGF0Zm9ybVVpKCkub3JtQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpIHsKLQkJcmV0dXJuIGpwYVBsYXRmb3JtVWkoKS5kZWZhdWx0T3JtQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Pcm1QZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09ybVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhNjkyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09ybVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLk1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLlR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgIk1hcCBBcyIgY29tcG9zaXRlIGlzIHJlc3BvbnNpYmxlIGZvciBzaG93aW5nIHRoZSBtYXBwaW5nIG5hbWUgYW5kCi0gKiBtYXBwaW5nIHR5cGUgZm9yIGEgdHlwZSBkZWNsYXJlZCB3aXRoaW4gYSBKUEEgbWFwcGluZyBkZXNjcmlwdG9yIGZpbGUuCi0gKgotICogQHNlZSBPcm1QZXJzaXN0ZW50VHlwZQotICogQHNlZSBPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUgZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlPE9ybVBlcnNpc3RlbnRUeXBlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBPcm1QZXJzaXN0ZW50VHlwZT4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwcGluZ1VpUHJvdmlkZXI8Pz4gYnVpbGREZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gdHlwZU1hcHBpbmdVaVByb3ZpZGVycygpIHsKLQkJcmV0dXJuIGpwYVBsYXRmb3JtVWkoKS5vcm1UeXBlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PdmVycmlkZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYmM2MjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PdmVycmlkZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5Kb2luQ29sdW1uc0NvbXBvc2l0ZS5JSm9pbkNvbHVtbnNFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIEF0dHJpYnV0ZSBPdmVycmlkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgIHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCBQYWdlQm9vayAoSm9pbkNvbHVtbnNDb21wb3NpdGUgb3IgQ29sdW1uQ29tcG9zaXRlKSAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBDb2x1bW5Db21wb3NpdGUKLSAqIEBzZWUgSm9pbkNvbHVtbnNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3ZlcnJpZGVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxFbnRpdHk+Ci17Ci0JcHJpdmF0ZSBDb21wb3NpdGUgY29sdW1uUGFuZTsKLQlwcml2YXRlIENvbXBvc2l0ZSBqb2luQ29sdW1uc1BhbmU7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGU+IG92ZXJyaWRlSG9sZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PdmVycmlkZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPdmVycmlkZXNDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgRW50aXR5PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3ZlcnJpZGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPdmVycmlkZXNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbihBc3NvY2lhdGlvbk92ZXJyaWRlIHN1YmplY3QpIHsKLQotCQlKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZyhzaGVsbCgpLCBzdWJqZWN0LCBudWxsKTsKLQotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEFkZEpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRKb2luQ29sdW1uKEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IHN0YXRlT2JqZWN0LmdldE93bmVyKCk7Ci0JCWludCBpbmRleCA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKGluZGV4KTsKLQkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248Sm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZz4gYnVpbGRBZGRKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJYWRkSm9pbkNvbHVtbihkaWFsb2cuc3ViamVjdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlPiBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGUsIEFzc29jaWF0aW9uT3ZlcnJpZGU+KG92ZXJyaWRlSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBc3NvY2lhdGlvbk92ZXJyaWRlIHRyYW5zZm9ybV8oQmFzZU92ZXJyaWRlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIEFzc29jaWF0aW9uT3ZlcnJpZGUpID8gKEFzc29jaWF0aW9uT3ZlcnJpZGUpIHZhbHVlIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlPiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8QmFzZU92ZXJyaWRlLCBBdHRyaWJ1dGVPdmVycmlkZT4ob3ZlcnJpZGVIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlIHRyYW5zZm9ybV8oQmFzZU92ZXJyaWRlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZU92ZXJyaWRlKSA/IChBdHRyaWJ1dGVPdmVycmlkZSkgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENvbHVtbj4gYnVpbGRDb2x1bW5Ib2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlLCBDb2x1bW4+KGF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2x1bW4gdHJhbnNmb3JtXyhBdHRyaWJ1dGVPdmVycmlkZSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGJ1aWxkRGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFbnRpdHksIEFzc29jaWF0aW9uT3ZlcnJpZGU+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxBc3NvY2lhdGlvbk92ZXJyaWRlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+IGJ1aWxkRGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8RW50aXR5LCBBdHRyaWJ1dGVPdmVycmlkZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nPiBidWlsZEVkaXRKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJZWRpdEpvaW5Db2x1bW4oZGlhbG9nLnN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSm9pbkNvbHVtbnNQcm92aWRlciBidWlsZEpvaW5Db2x1bW5zRWRpdG9yKCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5zUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT3ZlcnJpZGVEZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGUsIEJvb2xlYW4+KGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl1cGRhdGVPdmVycmlkZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhBc3NvY2lhdGlvbk92ZXJyaWRlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICF2YWx1ZS5pc1ZpcnR1YWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT3ZlcnJpZGVEZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZSwgQm9vbGVhbj4oYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl1cGRhdGVPdmVycmlkZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhBdHRyaWJ1dGVPdmVycmlkZSB2YWx1ZSkgewotCQkJCXJldHVybiAhdmFsdWUuaXNWaXJ0dWFsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRPdmVycmlkZURpc3BsYXlTdHJpbmcoQmFzZU92ZXJyaWRlIG92ZXJyaWRlKSB7Ci0JCVN0cmluZyBvdmVycmlkZVR5cGU7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIHR5cGUKLQkJaWYgKG92ZXJyaWRlIGluc3RhbmNlb2YgQXNzb2NpYXRpb25PdmVycmlkZSkgewotCQkJb3ZlcnJpZGVUeXBlID0gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk92ZXJyaWRlc0NvbXBvc2l0ZV9hc3NvY2lhdGlvbjsKLQkJfQotCQllbHNlIHsKLQkJCW92ZXJyaWRlVHlwZSA9IEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5PdmVycmlkZXNDb21wb3NpdGVfYXR0cmlidXRlOwotCQl9Ci0KLQkJLy8gRm9ybWF0IHRoZSBuYW1lCi0JCVN0cmluZyBuYW1lID0gb3ZlcnJpZGUuZ2V0TmFtZSgpOwotCi0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KG5hbWUpKSB7Ci0JCQluYW1lID0gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk92ZXJyaWRlc0NvbXBvc2l0ZV9ub05hbWU7Ci0JCX0KLQotCQkvLyBGb3JtYXQ6IDxuYW1lPiAoQXR0cmlidXRlL0Fzc29jaWF0aW9uIE92ZXJyaWRlKQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKG5hbWUpOwotCQlzYi5hcHBlbmQoIiAoIik7Ci0JCXNiLmFwcGVuZChvdmVycmlkZVR5cGUpOwotCQlzYi5hcHBlbmQoIikgIik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8QmFzZU92ZXJyaWRlPiBidWlsZE92ZXJyaWRlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCYXNlT3ZlcnJpZGU+KCk7Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZE92ZXJyaWRlTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gYnVpbGRPdmVycmlkZURpc3BsYXlTdHJpbmcoKEJhc2VPdmVycmlkZSkgZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkT3ZlcnJpZGVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEJhc2VPdmVycmlkZT4gYnVpbGRPdmVycmlkZXNMaXN0SG9sZGVyKCkgewotCQlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBCYXNlT3ZlcnJpZGU+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgQmFzZU92ZXJyaWRlPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGREZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBCYXNlT3ZlcnJpZGU+LCBCYXNlT3ZlcnJpZGU+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8QmFzZU92ZXJyaWRlPiBidWlsZE92ZXJyaWRlc0xpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8QmFzZU92ZXJyaWRlPigKLQkJCWJ1aWxkT3ZlcnJpZGVzTGlzdEhvbGRlcigpLAotCQkJQmFzZU92ZXJyaWRlLk5BTUVfUFJPUEVSVFkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPEJhc2VPdmVycmlkZSwgQ29udHJvbD4gYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8QmFzZU92ZXJyaWRlLCBDb250cm9sPigpIHsKLQkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUpIHsKLQotCQkJCWlmIChvdmVycmlkZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCQkJCXJldHVybiBjb2x1bW5QYW5lOwotCQkJCX0KLQotCQkJCWlmIChvdmVycmlkZSBpbnN0YW5jZW9mIEFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJCQkJcmV0dXJuIGpvaW5Db2x1bW5zUGFuZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGJ1aWxkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eSwgQXNzb2NpYXRpb25PdmVycmlkZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX0FTU09DSUFUSU9OX09WRVJSSURFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8QXNzb2NpYXRpb25PdmVycmlkZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZT4gYnVpbGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eSwgQXR0cmlidXRlT3ZlcnJpZGU+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlNQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZWRpdEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZyBkaWFsb2cgPQotCQkJbmV3IEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2coCi0JCQkJc2hlbGwoKSwKLQkJCQkoQXNzb2NpYXRpb25PdmVycmlkZSkgb3ZlcnJpZGVIb2xkZXIuZ2V0VmFsdWUoKSwKLQkJCQlqb2luQ29sdW1uCi0JCQkpOwotCi0JCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkRWRpdEpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbihKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKLQkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihzdGF0ZU9iamVjdC5nZXRKb2luQ29sdW1uKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJb3ZlcnJpZGVIb2xkZXIgPSBidWlsZE92ZXJyaWRlSG9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDb2x1bW5QYW5lKFBhZ2VCb29rIHBhZ2VCb29rKSB7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gZ3JvdXBCb3hNYXJnaW4oKTsKLQkJY29sdW1uUGFuZSA9IGJ1aWxkU3ViUGFuZShwYWdlQm9vaywgNSk7Ci0KLQkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBjaGVjayBib3gKLQkJYnVpbGRDaGVja0JveCgKLQkJCWJ1aWxkU3ViUGFuZShjb2x1bW5QYW5lLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHQsCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyKCkKLQkJKTsKLQotCQkvLyBDb2x1bW4gd2lkZ2V0cyAoZm9yIElPdmVycmlkZUF0dHJpYnV0ZSkKLQkJQ29sdW1uQ29tcG9zaXRlIGNvbHVtbkNvbXBvc2l0ZSA9IG5ldyBDb2x1bW5Db21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRDb2x1bW5Ib2xkZXIoYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUhvbGRlcigpKSwKLQkJCWNvbHVtblBhbmUsCi0JCQlmYWxzZQotCQkpOwotCi0JCWNvbHVtblBhbmUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWluc3RhbGxDb2x1bW5zUGFuZUVuYWJsZXIoY29sdW1uQ29tcG9zaXRlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUpvaW5Db2x1bW5zUGFuZShQYWdlQm9vayBwYWdlQm9vaykgewotCi0JCWpvaW5Db2x1bW5zUGFuZSA9IGJ1aWxkU3ViUGFuZShwYWdlQm9vayk7Ci0KLQkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBjaGVjayBib3gKLQkJYnVpbGRDaGVja0JveCgKLQkJCWJ1aWxkU3ViUGFuZShqb2luQ29sdW1uc1BhbmUsIDUsIGdyb3VwQm94TWFyZ2luKCkpLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHQsCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIoKQotCQkpOwotCi0JCUdyb3VwIGpvaW5Db2x1bW5zR3JvdXBQYW5lID0gYnVpbGRUaXRsZWRQYW5lKAotCQkJam9pbkNvbHVtbnNQYW5lLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk92ZXJyaWRlc0NvbXBvc2l0ZV9qb2luQ29sdW1uCi0JCSk7Ci0KLQkJLy8gSm9pbiBDb2x1bW5zIGxpc3QgcGFuZSAoZm9yIElPdmVycmlkZUFzc29jaWF0aW9uKQotCQlKb2luQ29sdW1uc0NvbXBvc2l0ZTxBc3NvY2lhdGlvbk92ZXJyaWRlPiBqb2luQ29sdW1uc0NvbXBvc2l0ZSA9Ci0JCQluZXcgSm9pbkNvbHVtbnNDb21wb3NpdGU8QXNzb2NpYXRpb25PdmVycmlkZT4oCi0JCQkJdGhpcywKLQkJCQlidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIoKSwKLQkJCQlqb2luQ29sdW1uc0dyb3VwUGFuZSwKLQkJCQlidWlsZEpvaW5Db2x1bW5zRWRpdG9yKCksCi0JCQkJZmFsc2UKLQkJCSk7Ci0KLQkJam9pbkNvbHVtbnNQYW5lLnNldFZpc2libGUoZmFsc2UpOwotCQlpbnN0YWxsSm9pbkNvbHVtbnNQYW5lRW5hYmxlcihqb2luQ29sdW1uc0NvbXBvc2l0ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gT3ZlcnJpZGVzIGdyb3VwIHBhbmUKLQkJY29udGFpbmVyID0gYnVpbGRUaXRsZWRQYW5lKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGVPdmVycmlkZXMKLQkJKTsKLQotCQkvLyBPdmVycmlkZXMgbGlzdCBwYW5lCi0JCWluaXRpYWxpemVPdmVycmlkZXNMaXN0KGNvbnRhaW5lcik7Ci0KLQkJLy8gUHJvcGVydHkgcGFuZQotCQlQYWdlQm9vayBwYWdlQm9vayA9IGJ1aWxkUGFnZUJvb2soY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUpvaW5Db2x1bW5zUGFuZShwYWdlQm9vayk7Ci0JCWluaXRpYWxpemVDb2x1bW5QYW5lKHBhZ2VCb29rKTsKLQkJaW5zdGFsbE92ZXJyaWRlQ29udHJvbFN3aXRjaGVyKG92ZXJyaWRlSG9sZGVyLCBwYWdlQm9vayk7Ci0JfQotCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHk+IGluaXRpYWxpemVPdmVycmlkZXNMaXN0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eT4oCi0JCQl0aGlzLAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgOCksCi0JCQlidWlsZE92ZXJyaWRlc0FkYXB0ZXIoKSwKLQkJCWJ1aWxkT3ZlcnJpZGVzTGlzdE1vZGVsKCksCi0JCQlvdmVycmlkZUhvbGRlciwKLQkJCWJ1aWxkT3ZlcnJpZGVMYWJlbFByb3ZpZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfQVRUUklCVVRFX09WRVJSSURFUwotCQkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJ1dHRvblBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGhlbHBJZCkgewotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbnMoKSB7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxDb2x1bW5zUGFuZUVuYWJsZXIoQ29sdW1uQ29tcG9zaXRlIHBhbmUpIHsKLQkJbmV3IFBhbmVFbmFibGVyKAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZUhvbGRlcigpLAotCQkJcGFuZQotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsSm9pbkNvbHVtbnNQYW5lRW5hYmxlcihKb2luQ29sdW1uc0NvbXBvc2l0ZTxBc3NvY2lhdGlvbk92ZXJyaWRlPiBwYW5lKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcigKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZUhvbGRlcigpLAotCQkJcGFuZQotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsT3ZlcnJpZGVDb250cm9sU3dpdGNoZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2VPdmVycmlkZT4gb3ZlcnJpZGVIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlQm9vayBwYWdlQm9vaykgewotCi0JCW5ldyBDb250cm9sU3dpdGNoZXIoCi0JCQlvdmVycmlkZUhvbGRlciwKLQkJCWJ1aWxkUGFuZVRyYW5zZm9ybWVyKCksCi0JCQlwYWdlQm9vawotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVPdmVycmlkZShib29sZWFuIHNlbGVjdGVkKSB7Ci0KLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCXRyeSB7Ci0JCQlCYXNlT3ZlcnJpZGUgb3ZlcnJpZGUgPSBvdmVycmlkZUhvbGRlci5nZXRWYWx1ZSgpOwotCi0JCQlCYXNlT3ZlcnJpZGUgbmV3T3ZlcnJpZGUgPSBvdmVycmlkZS5zZXRWaXJ0dWFsKCFzZWxlY3RlZCk7Ci0JCQlvdmVycmlkZUhvbGRlci5zZXRWYWx1ZShuZXdPdmVycmlkZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgSm9pbkNvbHVtbnNQcm92aWRlciBpbXBsZW1lbnRzIElKb2luQ29sdW1uc0VkaXRvcjxBc3NvY2lhdGlvbk92ZXJyaWRlPiB7Ci0KLQkJcHVibGljIHZvaWQgYWRkSm9pbkNvbHVtbihBc3NvY2lhdGlvbk92ZXJyaWRlIHN1YmplY3QpIHsKLQkJCU92ZXJyaWRlc0NvbXBvc2l0ZS50aGlzLmFkZEpvaW5Db2x1bW4oc3ViamVjdCk7Ci0JCX0KLQotCQlwdWJsaWMgSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbihBc3NvY2lhdGlvbk92ZXJyaWRlIHN1YmplY3QpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBkZWZhdWx0UHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIEFzc29jaWF0aW9uT3ZlcnJpZGUuREVGQVVMVF9KT0lOX0NPTFVNTlNfTElTVDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVkaXRKb2luQ29sdW1uKEFzc29jaWF0aW9uT3ZlcnJpZGUgc3ViamVjdCwgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlPdmVycmlkZXNDb21wb3NpdGUudGhpcy5lZGl0Sm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKEFzc29jaWF0aW9uT3ZlcnJpZGUgc3ViamVjdCkgewotCQkJcmV0dXJuIHN1YmplY3QuY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlSm9pbkNvbHVtbnMoQXNzb2NpYXRpb25PdmVycmlkZSBzdWJqZWN0LCBpbnRbXSBzZWxlY3RlZEluZGljZXMpIHsKLQkJCWZvciAoaW50IGluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQlzdWJqZWN0LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zKEFzc29jaWF0aW9uT3ZlcnJpZGUgc3ViamVjdCkgewotCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGUgc3ViamVjdCkgewotCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHNwZWNpZmllZExpc3RQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gQXNzb2NpYXRpb25PdmVycmlkZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMGIwZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybVVpUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzICJNYXAgQXMiIGNvbXBvc2l0ZSBpcyByZXNwb25zaWJsZSBmb3Igc2hvd2luZyB0aGUgbWFwcGluZyBuYW1lIGFuZAotICogbWFwcGluZyB0eXBlIGZvciBhbiBhdHRyaWJ1dGUuCi0gKgotICogQHNlZSBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlCi0gKiBAc2VlIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGU8VCBleHRlbmRzIFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGV4dGVuZHMgTWFwQXNDb21wb3NpdGU8VD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbnRBdHRyaWJ1dGUuREVGQVVMVF9NQVBQSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVudEF0dHJpYnV0ZS5TUEVDSUZJRURfTUFQUElOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbnRBdHRyaWJ1dGUuTkFNRV9QUk9QRVJUWSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIEpQVCBwbHVnaW4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdXBwb3J0ZWQgdHlwZXMgb2YgbWFwcGluZwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE1hcHBpbmdVaVByb3ZpZGVyPFQ+IGJ1aWxkRGVmYXVsdFByb3ZpZGVyKCkgewotCi0JCWlmIChzdWJqZWN0KCkuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiBuZXcgTWFwcGluZ1VpUHJvdmlkZXI8VD4oKSB7Ci0KLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJCQlTdHJpbmcgbWFwcGluZ0tleSA9IHN1YmplY3QoKS5nZXREZWZhdWx0TWFwcGluZ0tleSgpOwotCQkJCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKG1hcHBpbmdLZXkpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJCVN0cmluZyBtYXBwaW5nS2V5ID0gc3ViamVjdCgpLmdldERlZmF1bHRNYXBwaW5nS2V5KCk7Ci0KLQkJCQlyZXR1cm4gU1dUVXRpbC5idWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUpwdFVpTWVzc2FnZXMuY2xhc3MsCi0JCQkJCU1hcEFzQ29tcG9zaXRlLmNsYXNzLAotCQkJCQltYXBwaW5nS2V5ICsgIl9kZWZhdWx0MiIKLQkJCQkpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE1hcHBpbmdDaGFuZ2VIYW5kbGVyIGJ1aWxkTWFwcGluZ0NoYW5nZUhhbmRsZXIoKSB7Ci0JCXJldHVybiBuZXcgTWFwcGluZ0NoYW5nZUhhbmRsZXIoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgbGFiZWxUZXh0KCkgewotCQkJCVN0cmluZyBtYXBwaW5nS2V5ID0gc3ViamVjdCgpLmdldE1hcHBpbmdLZXkoKTsKLQotCQkJCWlmIChtYXBwaW5nS2V5ICE9IE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQkJCXJldHVybiBKcHRVaU1lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX21hcHBlZEF0dHJpYnV0ZVRleHQ7Ci0JCQkJfQotCQkJCWlmIChzdWJqZWN0KCkuaXNWaXJ0dWFsKCkpIHsKLQkJCQkJcmV0dXJuIEpwdFVpTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfdmlydHVhbEF0dHJpYnV0ZVRleHQ7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIEpwdFVpTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfdW5tYXBwZWRBdHRyaWJ1dGVUZXh0OwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIG1hcHBpbmdUeXBlKCkgewotCQkJCVN0cmluZyBtYXBwaW5nS2V5ID0gc3ViamVjdCgpLmdldE1hcHBpbmdLZXkoKTsKLQotCQkJCWlmIChtYXBwaW5nS2V5ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIEpwdFVpTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfY2hhbmdlTWFwcGluZ1R5cGU7Ci0JCQkJfQotCi0JCQkJaWYgKHN1YmplY3QoKS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gU1dUVXRpbC5idWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCQlKcHRVaU1lc3NhZ2VzLmNsYXNzLAotCQkJCQkJTWFwQXNDb21wb3NpdGUuY2xhc3MsCi0JCQkJCQltYXBwaW5nS2V5ICsgIl9kZWZhdWx0IgotCQkJCQkpOwotCQkJCX0KLQotCQkJCXJldHVybiBTV1RVdGlsLmJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJSnB0VWlNZXNzYWdlcy5jbGFzcywKLQkJCQkJTWFwQXNDb21wb3NpdGUuY2xhc3MsCi0JCQkJCW1hcHBpbmdLZXkKLQkJCQkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3JwaE1hcHBpbmcoTWFwcGluZ1VpUHJvdmlkZXI8Pz4gcHJvdmlkZXIpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShwcm92aWRlci5nZXRNYXBwaW5nS2V5KCkpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIG5hbWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpUHJvdmlkZXI8Pz4+IHByb3ZpZGVycygpIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBwcm92aWRlcnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBKUFQgcGx1Z2luLgotCSAqCi0JICogQHJldHVybiBUaGUgc3VwcG9ydGVkIGRlZmF1bHQgdHlwZXMgb2YgbWFwcGluZwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+Ci0JCWRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpQVCBwbGF0Zm9ybSByZXNwb25zYmxlIHRvIG1hbmFnZSB0aGUgdXNlciBpbnRlcmZhY2UgcGFydCBvZgotCSAqIHRoZSBKUFQgcGx1Zy1pbi4KLQkgKgotCSAqIEByZXR1cm4gVGhlIFVJIHBsYXRmb3JtIG9mIHRoZSBKUFQgcGx1Zy1pbgotCSAqLwotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVVpIGpwYVBsYXRmb3JtVWkoKSB7Ci0JCVN0cmluZyBwbGF0Zm9ybUlkID0gc3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpLmdldElkKCk7Ci0JCXJldHVybiBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkuaW5zdGFuY2UoKS5qcGFQbGF0Zm9ybShwbGF0Zm9ybUlkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBzdWJqZWN0KCkuZ2V0TWFwcGluZ0tleSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCi0JCWlmIChwcm9wZXJ0eU5hbWUgPT0gUGVyc2lzdGVudEF0dHJpYnV0ZS5TUEVDSUZJRURfTUFQUElOR19QUk9QRVJUWSB8fAotCQkgICAgcHJvcGVydHlOYW1lID09IFBlcnNpc3RlbnRBdHRyaWJ1dGUuREVGQVVMVF9NQVBQSU5HX1BST1BFUlRZICAgfHwKLQkJICAgIHByb3BlcnR5TmFtZSA9PSBQZXJzaXN0ZW50QXR0cmlidXRlLk5BTUVfUFJPUEVSVFkpIHsKLQotCQkJdXBkYXRlRGVzY3JpcHRpb24oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDlmM2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5UeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtVWlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyAiTWFwIEFzIiBjb21wb3NpdGUgaXMgcmVzcG9uc2libGUgZm9yIHNob3dpbmcgdGhlIG1hcHBpbmcgbmFtZSBhbmQKLSAqIG1hcHBpbmcgdHlwZSBmb3IgYSB0eXBlLgotICoKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUKLSAqIEBzZWUgT3JtUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZTxUIGV4dGVuZHMgUGVyc2lzdGVudFR5cGU+IGV4dGVuZHMgTWFwQXNDb21wb3NpdGU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbnRUeXBlLk1BUFBJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW50VHlwZS5OQU1FX1BST1BFUlRZKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwcGluZ0NoYW5nZUhhbmRsZXIgYnVpbGRNYXBwaW5nQ2hhbmdlSGFuZGxlcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBwaW5nQ2hhbmdlSGFuZGxlcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBsYWJlbFRleHQoKSB7Ci0JCQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBzdWJqZWN0KCkuZ2V0TWFwcGluZ0tleSgpOwotCi0JCQkJaWYgKG1hcHBpbmdLZXkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gSnB0VWlNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV9tYXBwZWRUeXBlVGV4dDsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gSnB0VWlNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV91bm1hcHBlZFR5cGVUZXh0OwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIG1hcHBpbmdUeXBlKCkgewotCQkJCVN0cmluZyBtYXBwaW5nS2V5ID0gc3ViamVjdCgpLmdldE1hcHBpbmdLZXkoKTsKLQotCQkJCWlmIChtYXBwaW5nS2V5ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIEpwdFVpTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfY2hhbmdlTWFwcGluZ1R5cGU7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIFNXVFV0aWwuYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlKcHRVaU1lc3NhZ2VzLmNsYXNzLAotCQkJCQlNYXBBc0NvbXBvc2l0ZS5jbGFzcywKLQkJCQkJbWFwcGluZ0tleQotCQkJCSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vcnBoTWFwcGluZyhNYXBwaW5nVWlQcm92aWRlcjw/PiBwcm92aWRlcikgewotCQkJCXN1YmplY3QoKS5zZXRNYXBwaW5nS2V5KHByb3ZpZGVyLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldE5hbWUoKTsKLQkJCX0KLQotCQkJcHVibGljIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlQcm92aWRlcjw/Pj4gcHJvdmlkZXJzKCkgewotCQkJCXJldHVybiB0eXBlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSlBUIHBsYXRmb3JtIHJlc3BvbnNibGUgdG8gbWFuYWdlIHRoZSB1c2VyIGludGVyZmFjZSBwYXJ0IG9mCi0JICogdGhlIEpQVCBwbHVnLWluLgotCSAqCi0JICogQHJldHVybiBUaGUgVUkgcGxhdGZvcm0gb2YgdGhlIEpQVCBwbHVnLWluCi0JICovCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSgpIHsKLQkJU3RyaW5nIHBsYXRmb3JtSWQgPSBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJcmV0dXJuIEpwYVBsYXRmb3JtVWlSZWdpc3RyeS5pbnN0YW5jZSgpLmpwYVBsYXRmb3JtKHBsYXRmb3JtSWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHN1YmplY3QoKS5nZXRNYXBwaW5nS2V5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0KLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBQZXJzaXN0ZW50VHlwZS5NQVBQSU5HX1BST1BFUlRZIHx8Ci0JCSAgICBwcm9wZXJ0eU5hbWUgPT0gUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSkgewotCi0JCQl1cGRhdGVEZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIEpQVCBwbHVnaW4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdXBwb3J0ZWQgdHlwZXMgb2YgbWFwcGluZwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYXRvcjxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gdHlwZU1hcHBpbmdVaVByb3ZpZGVycygpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzY0ZTI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3REaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBpcyB1c2VkIHRvIGVpdGhlciBjcmVhdGUgb3IgZWRpdCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIHRoYXQKLSAqIGlzIGxvY2F0ZWQgb24gYW4gZW50aXR5LgotICoKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW4KLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QKLSAqIEBzZWUgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyBleHRlbmRzIEJhc2VKb2luQ29sdW1uRGlhbG9nPFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3Q+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIGVudGl0eSBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcwotCSAqIGxvY2F0ZWQKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBFaXRoZXIgdGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2coU2hlbGwgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHkgZW50aXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIocGFyZW50LCBlbnRpdHksIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdERpYWxvZ1BhbmU8UHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZTxQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0PigKLQkJCXN1YmplY3RIb2xkZXIoKSwKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0IGJ1aWxkU3RhdGVPYmplY3QoKSB7Ci0JCXJldHVybiBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdChnZXRPd25lcigpLCBnZXRKb2luQ29sdW1uKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb25UaXRsZSgpIHsKLQotCQlpZiAoZ2V0Sm9pbkNvbHVtbigpID09IG51bGwpIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfYWRkRGVzY3JpcHRpb25UaXRsZTsKLQkJfQotCi0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfZWRpdERlc2NyaXB0aW9uVGl0bGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAoUHJpbWFyeUtleUpvaW5Db2x1bW4pIHN1cGVyLmdldEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRW50aXR5IGdldE93bmVyKCkgewotCQlyZXR1cm4gKEVudGl0eSkgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlKCkgewotCi0JCWlmIChnZXRKb2luQ29sdW1uKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19hZGRUaXRsZTsKLQkJfQotCi0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfZWRpdFRpdGxlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE1MjkxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0RGlhbG9nUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhpcyBkaWFsb2cgaXMgdXNlZCB0byBlaXRoZXIgY3JlYXRlIG9yIGVkaXQgYSBwcmltYXJ5IGtleSBqb2luZyBjb2x1bW4gdGhhdAotICogaXMgd2l0aGluIGEgc2Vjb25kYXJ5IHRhYmxlLgotICoKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW4KLSAqIEBzZWUgU2Vjb25kYXJ5VGFibGUKLSAqIEBzZWUgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbkRpYWxvZzxQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIHNlY29uZGFyeVRhYmxlIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0Ci0JICogaXMgbG9jYXRlZAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2coU2hlbGwgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIocGFyZW50LCBzZWNvbmRhcnlUYWJsZSwgam9pbkNvbHVtbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0RGlhbG9nUGFuZTxQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZTxQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdD4oCi0JCQlzdWJqZWN0SG9sZGVyKCksCi0JCQljb250YWluZXIKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QgYnVpbGRTdGF0ZU9iamVjdCgpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdCgKLQkJCWdldE93bmVyKCksCi0JCQlnZXRKb2luQ29sdW1uKCkKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uVGl0bGUoKSB7Ci0KLQkJaWYgKGdldEpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGREZXNjcmlwdGlvblRpdGxlOwotCQl9Ci0KLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdERlc2NyaXB0aW9uVGl0bGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAoUHJpbWFyeUtleUpvaW5Db2x1bW4pIHN1cGVyLmdldEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU2Vjb25kYXJ5VGFibGUgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoU2Vjb25kYXJ5VGFibGUpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZSgpIHsKLQotCQlpZiAoZ2V0Sm9pbkNvbHVtbigpID09IG51bGwpIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZFRpdGxlOwotCQl9Ci0KLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdFRpdGxlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTk1MTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIFRoZSBzdGF0ZSBvYmplY3QgdXNlZCB0byBjcmVhdGUgb3IgZWRpdCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG9uIGFuCi0gKiBzZWNvbmRhcnkgdGFibGUuCi0gKgotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbgotICogQHNlZSBTZWNvbmRhcnlUYWJsZQotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0IGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdAotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHNlY29uZGFyeVRhYmxlIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0Ci0JICogaXMgbG9jYXRlZAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIFRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzIHRvCi0JICogY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdChTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCi0JCXN1cGVyKHNlY29uZGFyeVRhYmxlLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAoUHJpbWFyeUtleUpvaW5Db2x1bW4pIHN1cGVyLmdldEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0TmFtZVRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXREYlRhYmxlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFNlY29uZGFyeVRhYmxlIGdldE93bmVyKCkgewotCQlyZXR1cm4gKFNlY29uZGFyeVRhYmxlKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0UGFyZW50KCkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxUYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YWJsZXMoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxTdHJpbmc+KGluaXRpYWxUYWJsZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzMTlhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIFRoZSBzdGF0ZSBvYmplY3QgdXNlZCB0byBjcmVhdGUgb3IgZWRpdCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG9uIGFuCi0gKiBlbnRpdHkuCi0gKgotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbgotICogQHNlZSBFbnRpdHkKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0IGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdAotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gZW50aXR5IFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzCi0JICogbG9jYXRlZAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIFRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgaXMKLQkgKiB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5TdGF0ZU9iamVjdChFbnRpdHkgZW50aXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJc3VwZXIoZW50aXR5LCBqb2luQ29sdW1uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAoUHJpbWFyeUtleUpvaW5Db2x1bW4pIHN1cGVyLmdldEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0TmFtZVRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFbnRpdHkgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoRW50aXR5KSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRQYXJlbnRFbnRpdHkoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgaW5pdGlhbFRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRUYWJsZU5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFibGVzKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8U3RyaW5nPihpbml0aWFsVGFibGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTMzMTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbEVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBvc3RFeGVjdXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtIEpvaW4gQ29sdW1ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBTZWNvbmRhcnlUYWJsZQotICogQHNlZSBFbnRpdHlDb21wb3NpdGUgLSBUaGUgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBBZGRSZW1vdmVMaXN0UGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8U2Vjb25kYXJ5VGFibGU+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gam9pbkNvbHVtbkhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTZWNvbmRhcnlUYWJsZT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JU2Vjb25kYXJ5VGFibGU8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFNlY29uZGFyeVRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKLQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IHN0YXRlT2JqZWN0LmdldE93bmVyKCk7Ci0JCWludCBpbmRleCA9IHNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgpOwotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2coc2hlbGwoKSwgc3ViamVjdCgpLCBudWxsKTsKLQotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEFkZFByaW1hcnlLZXlKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248UHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nPiBidWlsZEFkZFByaW1hcnlLZXlKb2luQ29sdW1uUG9zdEV4ZWN1dGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2cpIHsKLQkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQkJCWFkZEpvaW5Db2x1bW4oZGlhbG9nLnN1YmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ29udHJvbEJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8U2Vjb25kYXJ5VGFibGUsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oU2Vjb25kYXJ5VGFibGUgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZighdmFsdWUuaXNWaXJ0dWFsKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTZWNvbmRhcnlUYWJsZSwgUHJpbWFyeUtleUpvaW5Db2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSwgU2Vjb25kYXJ5VGFibGUuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UHJpbWFyeUtleUpvaW5Db2x1bW4+KAotCQkJYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZz4gYnVpbGRFZGl0UHJpbWFyeUtleUpvaW5Db2x1bW5Qb3N0RXhlY3V0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248UHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJZWRpdFByaW1hcnlLZXlKb2luQ29sdW1uKGRpYWxvZy5zdWJqZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEpvaW5Db2x1bW5MYWJlbChQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJaWYgKGpvaW5Db2x1bW4uaXNWaXJ0dWFsKCkpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQotCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQsCi0JCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCQkpOwotCQkJfQotCi0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQotCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQotCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zLAotCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uKSBlbGVtZW50OwotCQkJCXJldHVybiBidWlsZEpvaW5Db2x1bW5MYWJlbChqb2luQ29sdW1uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBBZGRSZW1vdmVQYW5lLkFkYXB0ZXIgYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlUGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCkgewotCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2VkaXQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlyZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJTGlzdDxMaXN0VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiwgUHJpbWFyeUtleUpvaW5Db2x1bW4+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oCi0JCQlidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSwKLQkJCU5hbWVkQ29sdW1uLlNQRUNJRklFRF9OQU1FX1BST1BFUlRZLAotCQkJTmFtZWRDb2x1bW4uREVGQVVMVF9OQU1FX1BST1BFUlRZLAotCQkJQmFzZUpvaW5Db2x1bW4uU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksCi0JCQlCYXNlSm9pbkNvbHVtbi5ERUZBVUxUX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxTZWNvbmRhcnlUYWJsZSwgUHJpbWFyeUtleUpvaW5Db2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSwgU2Vjb25kYXJ5VGFibGUuU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2coCi0JCQkJc2hlbGwoKSwKLQkJCQlzdWJqZWN0KCksCi0JCQkJam9pbkNvbHVtbgotCQkJKTsKLQotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtblBvc3RFeGVjdXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKHN0YXRlT2JqZWN0LmdldEpvaW5Db2x1bW4oKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQlqb2luQ29sdW1uSG9sZGVyID0gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbkhvbGRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBncm91cCBwYW5lCi0JCUdyb3VwIGdyb3VwUGFuZSA9IGJ1aWxkVGl0bGVkUGFuZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcHJpbWFyeUtleUpvaW5Db2x1bW4KLQkJKTsKLQotCQkvLyBPdmVycmlkZSBEZWZhdWx0IGNoZWNrIGJveAotCQlCdXR0b24gYnV0dG9uID0gYnVpbGRDaGVja0JveCgKLQkJCWJ1aWxkU3ViUGFuZShncm91cFBhbmUsIDgpLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKQotCQkpOwotCi0JCWluc3RhbGxPdmVycmlkZURlZmF1bHRCdXR0b25FbmFibGVyKGJ1dHRvbik7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zIGxpc3QgcGFuZQotCQlBZGRSZW1vdmVMaXN0UGFuZTxTZWNvbmRhcnlUYWJsZT4gam9pbkNvbHVtbnNQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPFNlY29uZGFyeVRhYmxlPigKLQkJCXRoaXMsCi0JCQlncm91cFBhbmUsCi0JCQlidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0TW9kZWwoKSwKLQkJCWpvaW5Db2x1bW5Ib2xkZXIsCi0JCQlidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9DT0xVTU5TCi0JCSk7Ci0KLQkJaW5zdGFsbFByaW1hcnlLZXlKb2luQ29sdW1uTGlzdFBhbmVFbmFibGVyKGpvaW5Db2x1bW5zUGFuZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxPdmVycmlkZURlZmF1bHRCdXR0b25FbmFibGVyKEJ1dHRvbiBvdmVycmlkZURlZmF1bHRCdXR0b24pIHsKLQotCQluZXcgQ29udHJvbEVuYWJsZXIoCi0JCQlidWlsZENvbnRyb2xCb29sZWFuSG9sZGVyKCksCi0JCQlvdmVycmlkZURlZmF1bHRCdXR0b24KLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFByaW1hcnlLZXlKb2luQ29sdW1uTGlzdFBhbmVFbmFibGVyKEFkZFJlbW92ZUxpc3RQYW5lPFNlY29uZGFyeVRhYmxlPiBwa0pvaW5Db2x1bW5MaXN0UGFuZSkgewotCi0JCW5ldyBQYW5lRW5hYmxlcigKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpLAotCQkJcGtKb2luQ29sdW1uTGlzdFBhbmUKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQlpbnRbXSBzZWxlY3RlZEluZGljZXMgPSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRJbmRpY2VzKCk7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJc3ViamVjdCgpLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHNlbGVjdGVkSW5kaWNlc1tpbmRleF0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUpvaW5Db2x1bW5zKGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQotCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0KLQkJdHJ5IHsKLQkJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gc3ViamVjdCgpOwotCi0JCQkvLyBBZGQgYSBqb2luIGNvbHVtbiBieSBjcmVhdGluZyBhIHNwZWNpZmllZCBvbmUgdXNpbmcgdGhlIGRlZmF1bHQKLQkJCS8vIG9uZSBpZiBpdCBleGlzdHMKLQkJCWlmIChzZWxlY3RlZCkgewotCi0JCQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQotCQkJCWlmIChkZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBjb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0KLQkJCQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCQkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtbk5hbWUpOwotCQkJCQlwa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCi0JCQkJCWpvaW5Db2x1bW5Ib2xkZXIuc2V0VmFsdWUocGtKb2luQ29sdW1uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmb3IgKGludCBpbmRleCA9IHNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJc2Vjb25kYXJ5VGFibGUucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyIGV4dGVuZHMgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB7Ci0KLQkJcHVibGljIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCQlzdXBlcihidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQkJaWYgKHN1YmplY3QoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQl9Ci0JCQlyZXR1cm4gIXN1YmplY3QoKS5pc1ZpcnR1YWwoKSAmJiBsaXN0SG9sZGVyLnNpemUoKSA+IDA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQl1cGRhdGVKb2luQ29sdW1ucyh2YWx1ZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9RdWVyaWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1F1ZXJpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwY2IyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1F1ZXJpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5SG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuTmV3TmFtZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5OZXdOYW1lRGlhbG9nQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Qb3N0RXhlY3V0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIFRoaXMgcGFuZSBzaG93cyB0aGUgbGlzdCBvZiBuYW1lZCBxdWVyaWVzIGFuZCBuYW1lZCBuYXRpdmUgcXVlcmllcy4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBOYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGUgb3IgTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHkKLSAqIEBzZWUgUXVlcnkKLSAqIEBzZWUgTmFtZWROYXRpdmVRdWVyeQotICogQHNlZSBOYW1lZFF1ZXJ5Ci0gKiBAc2VlIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlCi0gKiBAc2VlIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUXVlcmllc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxRdWVyeUhvbGRlcj4KLXsKLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lPFF1ZXJ5SG9sZGVyPiBsaXN0UGFuZTsKLQlwcml2YXRlIE5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSBuYW1lZE5hdGl2ZVF1ZXJ5UGFuZTsKLQlwcml2YXRlIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSBuYW1lZFF1ZXJ5UGFuZTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5PiBxdWVyeUhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UXVlcmllc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFF1ZXJpZXNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBRdWVyeUhvbGRlcj4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTmFtZWROYXRpdmVRdWVyeShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJTmV3TmFtZURpYWxvZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBOZXdOYW1lRGlhbG9nQnVpbGRlcihzaGVsbCgpKTsKLQkJYnVpbGRlci5zZXREaWFsb2dUaXRsZShKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZE5hdGl2ZVF1ZXJ5VGl0bGUpOwotCQlidWlsZGVyLnNldERlc2NyaXB0aW9uKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2FkZE5hbWVkTmF0aXZlUXVlcnlEZXNjcmlwdGlvbik7Ci0JCWJ1aWxkZXIuc2V0RGVzY3JpcHRpb25UaXRsZShKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZE5hdGl2ZVF1ZXJ5RGVzY3JpcHRpb25UaXRsZSk7Ci0JCWJ1aWxkZXIuc2V0TGFiZWxUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2xhYmVsKTsKLQkJYnVpbGRlci5zZXRFeGlzdGluZ05hbWVzKG5hbWVkTmF0aXZlUXVlcnlOYW1lcygpKTsKLQotCQlOZXdOYW1lRGlhbG9nIGRpYWxvZyA9IGJ1aWxkZXIuYnVpbGREaWFsb2coKTsKLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGROZXdOYW1lZE5hdGl2ZVF1ZXJ5UG9zdEV4ZWN1dGlvbihsaXN0U2VsZWN0aW9uTW9kZWwpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTmFtZWRRdWVyeShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJTmV3TmFtZURpYWxvZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBOZXdOYW1lRGlhbG9nQnVpbGRlcihzaGVsbCgpKTsKLQkJYnVpbGRlci5zZXREaWFsb2dUaXRsZShKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZFF1ZXJ5VGl0bGUpOwotCQlidWlsZGVyLnNldERlc2NyaXB0aW9uKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2FkZE5hbWVkUXVlcnlEZXNjcmlwdGlvbik7Ci0JCWJ1aWxkZXIuc2V0RGVzY3JpcHRpb25UaXRsZShKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUXVlcmllc0NvbXBvc2l0ZV9hZGROYW1lZFF1ZXJ5RGVzY3JpcHRpb25UaXRsZSk7Ci0JCWJ1aWxkZXIuc2V0TGFiZWxUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2xhYmVsKTsKLQkJYnVpbGRlci5zZXRFeGlzdGluZ05hbWVzKG5hbWVkUXVlcnlOYW1lcygpKTsKLQotCQlOZXdOYW1lRGlhbG9nIGRpYWxvZyA9IGJ1aWxkZXIuYnVpbGREaWFsb2coKTsKLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGROZXdOYW1lZFF1ZXJ5UG9zdEV4ZWN1dGlvbihsaXN0U2VsZWN0aW9uTW9kZWwpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFF1ZXJ5PiBidWlsZERpc3BsYXlhYmxlUXVlcmllc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFF1ZXJ5PigKLQkJCWJ1aWxkUXVlcmllc0xpc3RIb2xkZXIoKSwKLQkJCVF1ZXJ5Lk5BTUVfUFJPUEVSVFkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFBvc3RFeGVjdXRpb248TmV3TmFtZURpYWxvZz4gYnVpbGRFZGl0TmFtZWRRdWVyeVBvc3RFeGVjdXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxOZXdOYW1lRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoTmV3TmFtZURpYWxvZyBkaWFsb2cpIHsKLQkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQkJCVF1ZXJ5IHF1ZXJ5ID0gcXVlcnlIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJCQkJcXVlcnkuc2V0TmFtZShkaWFsb2cuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxRdWVyeUhvbGRlcj4gYnVpbGRMaXN0UGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZTxRdWVyeUhvbGRlcj4oCi0JCQl0aGlzLAotCQkJY29udGFpbmVyLAotCQkJYnVpbGRRdWVyaWVzQWRhcHRlcigpLAotCQkJYnVpbGREaXNwbGF5YWJsZVF1ZXJpZXNMaXN0SG9sZGVyKCksCi0JCQlxdWVyeUhvbGRlciwKLQkJCWJ1aWxkUXVlcmllc0xpc3RMYWJlbFByb3ZpZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX05BTUVEX1FVRVJJRVMKLQkJKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZEN1c3RvbUJ1dHRvbkFmdGVyQWRkQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJCQlCdXR0b24gYnV0dG9uID0gYnVpbGRCdXR0b24oCi0JCQkJCWNvbnRhaW5lciwKLQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlF1ZXJpZXNDb21wb3NpdGVfYWRkTmFtZWROYXRpdmVRdWVyeSwKLQkJCQkJaGVscElkLAotCQkJCQlidWlsZE5ld05hbWVkTmF0aXZlUXVlcnlBY3Rpb24oZ2V0U2VsZWN0aW9uTW9kZWwoKSkKLQkJCQkpOwotCi0JCQkJYWRkQWxpZ25SaWdodChidXR0b24pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8TmFtZWROYXRpdmVRdWVyeT4gYnVpbGROYW1lZE5hdGl2ZVF1ZXJpZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFF1ZXJ5SG9sZGVyLCBOYW1lZE5hdGl2ZVF1ZXJ5PigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCVF1ZXJ5SG9sZGVyLk5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxOYW1lZE5hdGl2ZVF1ZXJ5PiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0Lm5hbWVkTmF0aXZlUXVlcmllcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QubmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPE5hbWVkTmF0aXZlUXVlcnk+IGJ1aWxkTmFtZWROYXRpdmVRdWVyeUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeSwgTmFtZWROYXRpdmVRdWVyeT4ocXVlcnlIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE5hbWVkTmF0aXZlUXVlcnkgdHJhbnNmb3JtXyhRdWVyeSB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lZE5hdGl2ZVF1ZXJ5KSA/IChOYW1lZE5hdGl2ZVF1ZXJ5KSB2YWx1ZSA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxOYW1lZFF1ZXJ5PiBidWlsZE5hbWVkUXVlcmllc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UXVlcnlIb2xkZXIsIE5hbWVkUXVlcnk+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJUXVlcnlIb2xkZXIuTkFNRURfUVVFUklFU19MSVNUKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8TmFtZWRRdWVyeT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5uYW1lZFF1ZXJpZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0Lm5hbWVkUXVlcmllc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxOYW1lZFF1ZXJ5PiBidWlsZE5hbWVkUXVlcnlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnksIE5hbWVkUXVlcnk+KHF1ZXJ5SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBOYW1lZFF1ZXJ5IHRyYW5zZm9ybV8oUXVlcnkgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgTmFtZWRRdWVyeSkgPyAoTmFtZWRRdWVyeSkgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBSdW5uYWJsZSBidWlsZE5ld05hbWVkTmF0aXZlUXVlcnlBY3Rpb24oZmluYWwgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHNlbGVjdGlvbk1vZGVsKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYWRkTmFtZWROYXRpdmVRdWVyeShzZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPE5ld05hbWVEaWFsb2c+IGJ1aWxkTmV3TmFtZWROYXRpdmVRdWVyeVBvc3RFeGVjdXRpb24oZmluYWwgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248TmV3TmFtZURpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKE5ld05hbWVEaWFsb2cgZGlhbG9nKSB7Ci0JCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBzdWJqZWN0KCkuYWRkTmFtZWROYXRpdmVRdWVyeShzdWJqZWN0KCkubmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpKTsKLQkJCQkJbmFtZWROYXRpdmVRdWVyeS5zZXROYW1lKGRpYWxvZy5nZXROYW1lKCkpOwotCQkJCQlxdWVyeUhvbGRlci5zZXRWYWx1ZShuYW1lZE5hdGl2ZVF1ZXJ5KTsKLQkJCQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUobmFtZWROYXRpdmVRdWVyeSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUG9zdEV4ZWN1dGlvbjxOZXdOYW1lRGlhbG9nPiBidWlsZE5ld05hbWVkUXVlcnlQb3N0RXhlY3V0aW9uKGZpbmFsIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBzZWxlY3Rpb25Nb2RlbCkgewotCQlyZXR1cm4gbmV3IFBvc3RFeGVjdXRpb248TmV3TmFtZURpYWxvZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKE5ld05hbWVEaWFsb2cgZGlhbG9nKSB7Ci0JCQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJCQlRdWVyeSBxdWVyeSA9IHN1YmplY3QoKS5hZGROYW1lZFF1ZXJ5KHN1YmplY3QoKS5uYW1lZFF1ZXJpZXNTaXplKCkpOwotCQkJCQlxdWVyeS5zZXROYW1lKGRpYWxvZy5nZXROYW1lKCkpOwotCQkJCQlxdWVyeUhvbGRlci5zZXRWYWx1ZShxdWVyeSk7Ci0JCQkJCXNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUocXVlcnkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPFF1ZXJ5LCBDb250cm9sPiBidWlsZFBhbmVUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxRdWVyeSwgQ29udHJvbD4oKSB7Ci0JCQlwdWJsaWMgQ29udHJvbCB0cmFuc2Zvcm0oUXVlcnkgcXVlcnkpIHsKLQotCQkJCWlmIChxdWVyeSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCWlmIChxdWVyeSBpbnN0YW5jZW9mIE5hbWVkTmF0aXZlUXVlcnkpIHsKLQkJCQkJcmV0dXJuIG5hbWVkTmF0aXZlUXVlcnlQYW5lLmdldENvbnRyb2woKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmFtZWRRdWVyeVBhbmUuZ2V0Q29udHJvbCgpOwotCQkJfQotCQl9OwotCX0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRRdWVyaWVzQWRhcHRlcigpIHsKLQotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGFkZEJ1dHRvblRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2FkZE5hbWVkUXVlcnk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZE5hbWVkUXVlcnkobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlF1ZXJpZXNDb21wb3NpdGVfZWRpdDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBvcHRpb25PblNlbGVjdGlvbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZWRpdFF1ZXJ5KGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIE5hbWVkUXVlcnkpIHsKLQkJCQkJCXN1YmplY3QoKS5yZW1vdmVOYW1lZFF1ZXJ5KChOYW1lZFF1ZXJ5KSBpdGVtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXN1YmplY3QoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KChOYW1lZE5hdGl2ZVF1ZXJ5KSBpdGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFF1ZXJ5PiBidWlsZFF1ZXJpZXNMaXN0SG9sZGVyKCkgewotCQlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBRdWVyeT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBRdWVyeT4+KCk7Ci0JCWxpc3QuYWRkKGJ1aWxkTmFtZWRRdWVyaWVzTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGROYW1lZE5hdGl2ZVF1ZXJpZXNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBRdWVyeT4sIFF1ZXJ5PihsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkUXVlcmllc0xpc3RMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCVF1ZXJ5IHF1ZXJ5ID0gKFF1ZXJ5KSBlbGVtZW50OwotCQkJCVN0cmluZyBuYW1lID0gcXVlcnkuZ2V0TmFtZSgpOwotCi0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQlpbnQgaW5kZXggPSAtMTsKLQotCQkJCQlpZiAocXVlcnkgaW5zdGFuY2VvZiBOYW1lZFF1ZXJ5KSB7Ci0JCQkJCQlpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKHN1YmplY3QoKS5uYW1lZFF1ZXJpZXMoKSwgcXVlcnkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihzdWJqZWN0KCkubmFtZWROYXRpdmVRdWVyaWVzKCksIHF1ZXJ5KTsKLQkJCQkJfQotCi0JCQkJCW5hbWUgPSBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUXVlcmllc0NvbXBvc2l0ZV9kaXNwbGF5U3RyaW5nLCBpbmRleCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeT4gYnVpbGRRdWVyeUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnk+KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRRdWVyeShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJUXVlcnkgcXVlcnkgPSBxdWVyeUhvbGRlci5nZXRWYWx1ZSgpOwotCi0JCU5ld05hbWVEaWFsb2dCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTmV3TmFtZURpYWxvZ0J1aWxkZXIoc2hlbGwoKSk7Ci0JCWJ1aWxkZXIuc2V0TGFiZWxUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2xhYmVsKTsKLQkJYnVpbGRlci5zZXROYW1lKHF1ZXJ5LmdldE5hbWUoKSk7Ci0KLQkJaWYgKHF1ZXJ5IGluc3RhbmNlb2YgTmFtZWROYXRpdmVRdWVyeSkgewotCQkJYnVpbGRlci5zZXREaWFsb2dUaXRsZShKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUXVlcmllc0NvbXBvc2l0ZV9lZGl0TmFtZWROYXRpdmVRdWVyeVRpdGxlKTsKLQkJCWJ1aWxkZXIuc2V0RGVzY3JpcHRpb24oSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlF1ZXJpZXNDb21wb3NpdGVfZWRpdE5hbWVkTmF0aXZlUXVlcnlEZXNjcmlwdGlvbik7Ci0JCQlidWlsZGVyLnNldERlc2NyaXB0aW9uVGl0bGUoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlF1ZXJpZXNDb21wb3NpdGVfZWRpdE5hbWVkTmF0aXZlUXVlcnlEZXNjcmlwdGlvblRpdGxlKTsKLQkJCWJ1aWxkZXIuc2V0RXhpc3RpbmdOYW1lcyhuYW1lZE5hdGl2ZVF1ZXJ5TmFtZXMoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlidWlsZGVyLnNldERpYWxvZ1RpdGxlKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2VkaXROYW1lZFF1ZXJ5VGl0bGUpOwotCQkJYnVpbGRlci5zZXREZXNjcmlwdGlvbihKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUXVlcmllc0NvbXBvc2l0ZV9lZGl0TmFtZWRRdWVyeURlc2NyaXB0aW9uKTsKLQkJCWJ1aWxkZXIuc2V0RGVzY3JpcHRpb25UaXRsZShKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUXVlcmllc0NvbXBvc2l0ZV9lZGl0TmFtZWRRdWVyeURlc2NyaXB0aW9uVGl0bGUpOwotCQkJYnVpbGRlci5zZXRFeGlzdGluZ05hbWVzKG5hbWVkUXVlcnlOYW1lcygpKTsKLQkJfQotCi0JCU5ld05hbWVEaWFsb2cgZGlhbG9nID0gYnVpbGRlci5idWlsZERpYWxvZygpOwotCQlkaWFsb2cub3BlbkRpYWxvZyhidWlsZEVkaXROYW1lZFF1ZXJ5UG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCQlsaXN0UGFuZS5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJcXVlcnlIb2xkZXIgPSBidWlsZFF1ZXJ5SG9sZGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCWxpc3RQYW5lID0gYnVpbGRMaXN0UGFuZShjb250YWluZXIpOwotCi0JCS8vIFByb3BlcnR5IHBhbmUKLQkJUGFnZUJvb2sgcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCXBhZ2VCb29rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIE5hbWVkIFF1ZXJ5IHByb3BlcnR5IHBhbmUKLQkJbmFtZWRRdWVyeVBhbmUgPSBuZXcgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWJ1aWxkTmFtZWRRdWVyeUhvbGRlcigpLAotCQkJcGFnZUJvb2sKLQkJKTsKLQotCQkvLyBOYW1lZCBOYXRpdmUgUXVlcnkgcHJvcGVydHkgcGFuZQotCQluYW1lZE5hdGl2ZVF1ZXJ5UGFuZSA9IG5ldyBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5SG9sZGVyKCksCi0JCQlwYWdlQm9vawotCQkpOwotCi0JCWluc3RhbGxQYW5lU3dpdGNoZXIocGFnZUJvb2spOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZVN3aXRjaGVyKFBhZ2VCb29rIHBhZ2VCb29rKSB7Ci0JCW5ldyBDb250cm9sU3dpdGNoZXIocXVlcnlIb2xkZXIsIGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCksIHBhZ2VCb29rKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gbmFtZWROYXRpdmVRdWVyeU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UXVlcnksIFN0cmluZz4oc3ViamVjdCgpLm5hbWVkTmF0aXZlUXVlcmllcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFF1ZXJ5IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IG5hbWVkUXVlcnlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFF1ZXJ5LCBTdHJpbmc+KHN1YmplY3QoKS5uYW1lZFF1ZXJpZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShRdWVyeSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1F1ZXJ5SGludHNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUXVlcnlIaW50c0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2IzNDZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUXVlcnlIaW50c0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlVGFibGVQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgQWRkUmVtb3ZlVGFibGVQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFF1ZXJ5Ci0gKiBAc2VlIFF1ZXJ5SGludAotICogQHNlZSBBZGRSZW1vdmVUYWJsZVBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUXVlcnlIaW50c0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxRdWVyeT4KLXsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5SGludD4gcXVlcnlIaW50SG9sZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5RdWVyeUhpbnRzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUXVlcnlIaW50c0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFF1ZXJ5PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBjb250YWluZXIpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShRdWVyeSBxdWVyeSkgewotCQkJCXJldHVybiAocXVlcnkgIT0gbnVsbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUXVlcnlIaW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVUYWJsZVBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJUXVlcnlIaW50IHF1ZXJ5SGludCA9IHN1YmplY3QoKS5hZGRIaW50KHN1YmplY3QoKS5oaW50c1NpemUoKSk7Ci0JCQkJcXVlcnlIaW50SG9sZGVyLnNldFZhbHVlKHF1ZXJ5SGludCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlzdWJqZWN0KCkucmVtb3ZlSGludCgoUXVlcnlIaW50KSBpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUhpbnQ+IGJ1aWxkUXVlcnlIaW50SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUhpbnQ+KCk7Ci0JfTsKLQotCXByaXZhdGUgSVRhYmxlTGFiZWxQcm92aWRlciBidWlsZFF1ZXJ5SGludExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxRdWVyeUhpbnQ+IGJ1aWxkUXVlcnlIaW50TGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxRdWVyeSwgUXVlcnlIaW50PihnZXRTdWJqZWN0SG9sZGVyKCksIE5hbWVkUXVlcnkuSElOVFNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFF1ZXJ5SGludD4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5oaW50cygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaGludHNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQlxdWVyeUhpbnRIb2xkZXIgPSBidWlsZFF1ZXJ5SGludEhvbGRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVRhYmxlUGFuZSB0YWJsZVBhbmUgPSBuZXcgVGFibGVQYW5lKGNvbnRhaW5lcik7Ci0JCWluc3RhbGxQYW5lRW5hYmxlcih0YWJsZVBhbmUpOwotCX0KLQotCXByaXZhdGUgUGFuZUVuYWJsZXIgaW5zdGFsbFBhbmVFbmFibGVyKFRhYmxlUGFuZSB0YWJsZVBhbmUpIHsKLQkJcmV0dXJuIG5ldyBQYW5lRW5hYmxlcihidWlsZFBhbmVFbmFibGVIb2xkZXIoKSwgdGFibGVQYW5lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBRdWVyeUhpbnRDb2x1bW5BZGFwdGVyIGltcGxlbWVudHMgQ29sdW1uQWRhcHRlcjxRdWVyeUhpbnQ+IHsKLQotCQlzdGF0aWMgZmluYWwgaW50IENPTFVNTl9DT1VOVCA9IDI7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DT0xVTU5fSU5ERVggPSAwOwotCQlzdGF0aWMgZmluYWwgaW50IFZBTFVFX0NPTFVNTl9JTkRFWCA9IDE7Ci0KLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcihRdWVyeUhpbnQgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UXVlcnlIaW50LCBTdHJpbmc+KFF1ZXJ5SGludC5OQU1FX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBidWlsZFZhbHVlSG9sZGVyKFF1ZXJ5SGludCBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxRdWVyeUhpbnQsIFN0cmluZz4oUXVlcnlIaW50LlZBTFVFX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0VmFsdWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0VmFsdWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBjZWxsTW9kZWxzKFF1ZXJ5SGludCBzdWJqZWN0KSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIG1vZGVscyA9IG5ldyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltDT0xVTU5fQ09VTlRdOwotCQkJbW9kZWxzW05BTUVfQ09MVU1OX0lOREVYXSAgPSBidWlsZE5hbWVIb2xkZXIoc3ViamVjdCk7Ci0JCQltb2RlbHNbVkFMVUVfQ09MVU1OX0lOREVYXSA9IGJ1aWxkVmFsdWVIb2xkZXIoc3ViamVjdCk7Ci0JCQlyZXR1cm4gbW9kZWxzOwotCQl9Ci0KLQkJcHVibGljIGludCBjb2x1bW5Db3VudCgpIHsKLQkJCXJldHVybiBDT0xVTU5fQ09VTlQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGNvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIFF1ZXJ5SGludENvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU5fSU5ERVg6IHsKLQkJCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5RdWVyeUhpbnRzQ29tcG9zaXRlX25hbWVDb2x1bW47Ci0JCQkJfQotCi0JCQkJY2FzZSBRdWVyeUhpbnRDb2x1bW5BZGFwdGVyLlZBTFVFX0NPTFVNTl9JTkRFWDogewotCQkJCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlF1ZXJ5SGludHNDb21wb3NpdGVfdmFsdWVDb2x1bW47Ci0JCQkJfQotCi0JCQkJZGVmYXVsdDogewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0KLQkJCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSAoUXVlcnlIaW50KSBlbGVtZW50OwotCQkJU3RyaW5nIHZhbHVlID0gIiI7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIFF1ZXJ5SGludENvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU5fSU5ERVg6IHsKLQkJCQkJdmFsdWUgPSBxdWVyeUhpbnQuZ2V0TmFtZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQljYXNlIFF1ZXJ5SGludENvbHVtbkFkYXB0ZXIuVkFMVUVfQ09MVU1OX0lOREVYOiB7Ci0JCQkJCXZhbHVlID0gcXVlcnlIaW50LmdldFZhbHVlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQl2YWx1ZSA9ICIiOwotCQkJfQotCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhYmxlUGFuZSBleHRlbmRzIEFkZFJlbW92ZVRhYmxlUGFuZTxRdWVyeT4gewotCi0JCXByaXZhdGUgVGFibGVQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKFF1ZXJ5SGludHNDb21wb3NpdGUudGhpcywKLQkJCSAgICAgIHBhcmVudCwKLQkJCSAgICAgIGJ1aWxkUXVlcnlIaW50QWRhcHRlcigpLAotCQkJICAgICAgYnVpbGRRdWVyeUhpbnRMaXN0SG9sZGVyKCksCi0JCQkgICAgICBxdWVyeUhpbnRIb2xkZXIsCi0JCQkgICAgICBidWlsZFF1ZXJ5SGludExhYmVsUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwcml2YXRlIENlbGxFZGl0b3JbXSBidWlsZENlbGxFZGl0b3JzKFRhYmxlIHRhYmxlKSB7Ci0JCQlyZXR1cm4gbmV3IENlbGxFZGl0b3JbXSB7Ci0JCQkJbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKSwKLQkJCQluZXcgVGV4dENlbGxFZGl0b3IodGFibGUpCi0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBJQ2VsbE1vZGlmaWVyIGJ1aWxkQ2VsbE1vZGlmaWVyKCkgewotCQkJcmV0dXJuIG5ldyBJQ2VsbE1vZGlmaWVyKCkgewotCi0JCQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSAoUXVlcnlIaW50KSBlbGVtZW50OwotCQkJCQlTdHJpbmcgdmFsdWUgPSAiIjsKLQotCQkJCQlpZiAocHJvcGVydHkgPT0gUXVlcnlIaW50Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQkJCXZhbHVlID0gcXVlcnlIaW50LmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChwcm9wZXJ0eSA9PSBRdWVyeUhpbnQuVkFMVUVfUFJPUEVSVFkpIHsKLQkJCQkJCXZhbHVlID0gcXVlcnlIaW50LmdldFZhbHVlKCk7Ci0JCQkJCX0KLQotCQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQkJdmFsdWUgPSAiIjsKLQkJCQkJfQotCi0JCQkJCXJldHVybiB2YWx1ZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCVF1ZXJ5SGludCBxdWVyeUhpbnQ7Ci0KLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLQkJCQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSAoVGFibGVJdGVtKSBlbGVtZW50OwotCQkJCQkJcXVlcnlIaW50ID0gKFF1ZXJ5SGludCkgdGFibGVJdGVtLmdldERhdGEoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXF1ZXJ5SGludCA9IChRdWVyeUhpbnQpIGVsZW1lbnQ7Ci0JCQkJCX0KLQotCQkJCQlpZiAocHJvcGVydHkgPT0gUXVlcnlIaW50Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQkJCSBxdWVyeUhpbnQuc2V0TmFtZSh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChwcm9wZXJ0eSA9PSBRdWVyeUhpbnQuVkFMVUVfUFJPUEVSVFkpIHsKLQkJCQkJCSBxdWVyeUhpbnQuc2V0VmFsdWUodmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2x1bW5BZGFwdGVyPD8+IGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJCXJldHVybiBuZXcgUXVlcnlIaW50Q29sdW1uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmdbXSBidWlsZENvbHVtblByb3BlcnRpZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKLQkJCQlRdWVyeUhpbnQuTkFNRV9QUk9QRVJUWSwKLQkJCQlRdWVyeUhpbnQuVkFMVUVfUFJPUEVSVFkKLQkJCX07Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJCXN1cGVyLmluaXRpYWxpemVNYWluQ29tcG9zaXRlKAotCQkJCWNvbnRhaW5lciwKLQkJCQlhZGFwdGVyLAotCQkJCWxpc3RIb2xkZXIsCi0JCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJCWxhYmVsUHJvdmlkZXIsCi0JCQkJaGVscElkCi0JCQkpOwotCi0JCQlUYWJsZSB0YWJsZSA9IGdldE1haW5Db250cm9sKCk7Ci0KLQkJCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJCXRhYmxlVmlld2VyLnNldENlbGxFZGl0b3JzKGJ1aWxkQ2VsbEVkaXRvcnModGFibGUpKTsKLQkJCXRhYmxlVmlld2VyLnNldENlbGxNb2RpZmllcihidWlsZENlbGxNb2RpZmllcigpKTsKLQkJCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMoYnVpbGRDb2x1bW5Qcm9wZXJ0aWVzKCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU2Vjb25kYXJ5VGFibGVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU2Vjb25kYXJ5VGFibGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIwZDI4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1NlY29uZGFyeVRhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBTZWNvbmRhcnlUYWJsZURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQkvL2lmIGNyZWF0aW5nIGEgbmV3IFNlY29uZGFyeVRhYmxlLCB0aGlzIHdpbGwgYmUgbnVsbCwKLQkvL3NwZWNpZnkgdGhlIGRlZmF1bHRTY2hlbWEgYW5kIGRlZmF1bHRDYXRhbG9nIGluc3RlYWQgaW4gdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnV0b3IKLQlwcml2YXRlIFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlOwotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRTY2hlbWE7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdENhdGFsb2c7Ci0JCi0JcHJvdGVjdGVkIENvbWJvIG5hbWVDb21ibzsKLQlwcm90ZWN0ZWQgQ29tYm8gY2F0YWxvZ0NvbWJvOwotCXByb3RlY3RlZCBDb21ibyBzY2hlbWFDb21ibzsKLQotCXByaXZhdGUgU3RyaW5nIHNlbGVjdGVkTmFtZTsKLQlwcml2YXRlIFN0cmluZyBzZWxlY3RlZFNjaGVtYTsKLQlwcml2YXRlIFN0cmluZyBzZWxlY3RlZENhdGFsb2c7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdFNjaGVtYVNlbGVjdGVkOwotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0Q2F0YWxvZ1NlbGVjdGVkOwotCi0JcHVibGljIFNlY29uZGFyeVRhYmxlRGlhbG9nKFNoZWxsIHBhcmVudCwgSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgZGVmYXVsdFNjaGVtYSwgU3RyaW5nIGRlZmF1bHRDYXRhbG9nKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYSA9IGRlZmF1bHRTY2hlbWE7Ci0JCXRoaXMuZGVmYXVsdENhdGFsb2cgPSBkZWZhdWx0Q2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgU2Vjb25kYXJ5VGFibGVEaWFsb2coU2hlbGwgcGFyZW50LCBTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0JCVBvaW50IHNpemUgPSBzdXBlci5nZXRJbml0aWFsU2l6ZSgpOwotCQlzaXplLnggPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNTApOwotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQoZ2V0VGl0bGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJaWYgKHRoaXMuc2Vjb25kYXJ5VGFibGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0U2Vjb25kYXJ5VGFibGU7Ci0JCX0KLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGRTZWNvbmRhcnlUYWJsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQotCQlMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCW5hbWVMYWJlbC5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19uYW1lKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMubmFtZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQl0aGlzLm5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcG9wdWxhdGVOYW1lQ29tYm8oKTsKLQotCQlMYWJlbCBjYXRhbG9nTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWNhdGFsb2dMYWJlbC5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19jYXRhbG9nKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJY2F0YWxvZ0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMuY2F0YWxvZ0NvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQl0aGlzLmNhdGFsb2dDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcG9wdWxhdGVDYXRhbG9nQ29tYm8oKTsKLQotCQlMYWJlbCBzY2hlbWFMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJc2NoZW1hTGFiZWwuc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVEaWFsb2dfc2NoZW1hKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJc2NoZW1hTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy5zY2hlbWFDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJdGhpcy5zY2hlbWFDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcG9wdWxhdGVTY2hlbWFDb21ibygpOwotCi0JCQotCQl0aGlzLnNjaGVtYUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlcG9wdWxhdGVOYW1lQ29tYm8oKTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlcG9wdWxhdGVOYW1lQ29tYm8oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFNjaGVtYSBnZXREZWZhdWx0VGFibGVTY2hlbWEoKSB7Ci0JCWlmICh0aGlzLnNlY29uZGFyeVRhYmxlICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRUYWJsZVNjaGVtYSh0aGlzLnNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldFRhYmxlU2NoZW1hKHRoaXMuZGVmYXVsdFNjaGVtYSk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIFNjaGVtYSBnZXRUYWJsZVNjaGVtYSgpIHsKLQkJaWYgKHRoaXMuc2Vjb25kYXJ5VGFibGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFRhYmxlU2NoZW1hKHRoaXMuc2Vjb25kYXJ5VGFibGUuZ2V0U2NoZW1hKCkpOwotCQl9Ci0JCXJldHVybiBnZXRUYWJsZVNjaGVtYSh0aGlzLmRlZmF1bHRTY2hlbWEpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU2NoZW1hIGdldFRhYmxlU2NoZW1hKFN0cmluZyBzY2hlbWFOYW1lKSB7Ci0JCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5nZXREYXRhYmFzZSgpOwotCQlpZiAoZGF0YWJhc2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRhdGFiYXNlLnNjaGVtYU5hbWVkKHNjaGVtYU5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTmFtZUNvbWJvKCkgewotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRUYWJsZVNjaGVtYSgpOwotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yPFN0cmluZz4gdGFibGVzID0gc2NoZW1hLnRhYmxlTmFtZXMoKTsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc29ydCggdGFibGVzKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5uYW1lQ29tYm8uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGdldFNlY29uZGFyeVRhYmxlKCkgIT0gbnVsbCkgewotCQkJaWYgKGdldFNlY29uZGFyeVRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLm5hbWVDb21iby5zZXRUZXh0KGdldFNlY29uZGFyeVRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlcG9wdWxhdGVOYW1lQ29tYm8oKSB7Ci0JCVN0cmluZyBuYW1lVGV4dCA9IHRoaXMubmFtZUNvbWJvLmdldFRleHQoKTsKLQkJdGhpcy5uYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQotCQlTY2hlbWEgc2NoZW1hID0gbnVsbDsKLQkJaWYgKHRoaXMuc2NoZW1hQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwKSB7Ci0JCQlzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRUYWJsZVNjaGVtYSgpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuc2NoZW1hQ29tYm8uZ2V0VGV4dCgpICE9IG51bGwpIHsKLQkJCXNjaGVtYSA9IHRoaXMuZ2V0VGFibGVTY2hlbWEodGhpcy5zY2hlbWFDb21iby5nZXRUZXh0KCkpOwotCQl9Ci0JCWVsc2UgewotCQkJc2NoZW1hID0gdGhpcy5nZXRUYWJsZVNjaGVtYSgpOwotCQl9Ci0JCQotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yPFN0cmluZz4gdGFibGVzID0gc2NoZW1hLnRhYmxlTmFtZXMoKTsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc29ydCggdGFibGVzKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5uYW1lQ29tYm8uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCQotCQl0aGlzLm5hbWVDb21iby5zZXRUZXh0KG5hbWVUZXh0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVTY2hlbWFDb21ibygpIHsKLQkJU3RyaW5nIGRlZmF1bHRTY2hlbWE7Ci0JCWlmIChnZXRTZWNvbmRhcnlUYWJsZSgpICE9IG51bGwpIHsKLQkJCWRlZmF1bHRTY2hlbWEgPSBnZXRTZWNvbmRhcnlUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJfQotCQllbHNlIHsKLQkJCWRlZmF1bHRTY2hlbWEgPSB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JCX0KLQkJaWYgKGRlZmF1bHRTY2hlbWEgIT0gbnVsbCkgewotCQkJdGhpcy5zY2hlbWFDb21iby5hZGQoTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRTY2hlbWEsIGRlZmF1bHRTY2hlbWEpKTsKLQkJfQotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQotCQlpZiAoZGF0YWJhc2UgIT0gbnVsbCkgewotCQkJSXRlcmF0b3I8U3RyaW5nPiBzY2hlbWF0YSA9IGRhdGFiYXNlLnNjaGVtYU5hbWVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNvcnQoc2NoZW1hdGEpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLnNjaGVtYUNvbWJvLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCWlmIChnZXRTZWNvbmRhcnlUYWJsZSgpICE9IG51bGwpIHsKLQkJCWlmIChnZXRTZWNvbmRhcnlUYWJsZSgpLmdldFNwZWNpZmllZFNjaGVtYSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLnNjaGVtYUNvbWJvLnNldFRleHQoZ2V0U2Vjb25kYXJ5VGFibGUoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLnNjaGVtYUNvbWJvLnNlbGVjdCgwKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc2NoZW1hQ29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVDYXRhbG9nQ29tYm8oKSB7Ci0JCVN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKLQkJaWYgKGdldFNlY29uZGFyeVRhYmxlKCkgIT0gbnVsbCkgewotCQkJZGVmYXVsdENhdGFsb2cgPSBnZXRTZWNvbmRhcnlUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkZWZhdWx0Q2F0YWxvZyA9IHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JCX0KLQkJaWYgKGRlZmF1bHRDYXRhbG9nICE9IG51bGwpIHsKLQkJCXRoaXMuY2F0YWxvZ0NvbWJvLmFkZChOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdENhdGFsb2csIGRlZmF1bHRDYXRhbG9nKSk7Ci0JCX0KLQotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQotCQlpZiAoZGF0YWJhc2UgIT0gbnVsbCkgewotCQkJSXRlcmF0b3I8U3RyaW5nPiBjYXRhbG9ncyA9IGRhdGFiYXNlLmNhdGFsb2dOYW1lcygpOwotCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5zb3J0KGNhdGFsb2dzKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5jYXRhbG9nQ29tYm8uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGdldFNlY29uZGFyeVRhYmxlKCkgIT0gbnVsbCkgewotCQkJaWYgKGdldFNlY29uZGFyeVRhYmxlKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpICE9IG51bGwpIHsKLQkJCQl0aGlzLmNhdGFsb2dDb21iby5zZXRUZXh0KGdldFNlY29uZGFyeVRhYmxlKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuY2F0YWxvZ0NvbWJvLnNlbGVjdCgwKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY2F0YWxvZ0NvbWJvLnNlbGVjdCgwKTsJCQkKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb21ibyBnZXROYW1lQ29tYm8oKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVDb21ibzsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gZ2V0U2NoZW1hQ29tYm8oKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYUNvbWJvOwotCX0KLQotCXByb3RlY3RlZCBDb21ibyBnZXRDYXRhbG9nQ29tYm8oKSB7Ci0JCXJldHVybiB0aGlzLmNhdGFsb2dDb21ibzsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2Vjb25kYXJ5VGFibGUgZ2V0U2Vjb25kYXJ5VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZGFyeVRhYmxlOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkQ2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWRDYXRhbG9nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkU2NoZW1hOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFNjaGVtYVNlbGVjdGVkKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NoZW1hU2VsZWN0ZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Q2F0YWxvZ1NlbGVjdGVkKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2F0YWxvZ1NlbGVjdGVkOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQl0aGlzLnNlbGVjdGVkTmFtZSA9IHRoaXMubmFtZUNvbWJvLmdldFRleHQoKTsKLQkJdGhpcy5zZWxlY3RlZFNjaGVtYSA9IHRoaXMuc2NoZW1hQ29tYm8uZ2V0VGV4dCgpOwotCQlpZiAodGhpcy5zZWxlY3RlZFNjaGVtYS5lcXVhbHMoIiIpKSB7Ci0JCQl0aGlzLnNlbGVjdGVkU2NoZW1hID0gbnVsbDsKLQkJfQotCQl0aGlzLnNlbGVjdGVkQ2F0YWxvZyA9IHRoaXMuY2F0YWxvZ0NvbWJvLmdldFRleHQoKTsKLQkJaWYgKHRoaXMuc2VsZWN0ZWRDYXRhbG9nLmVxdWFscygiIikpIHsKLQkJCXRoaXMuc2VsZWN0ZWRDYXRhbG9nID0gbnVsbDsKLQkJfQotCQl0aGlzLmRlZmF1bHRTY2hlbWFTZWxlY3RlZCA9IHRoaXMuc2NoZW1hQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nU2VsZWN0ZWQgPSB0aGlzLmNhdGFsb2dDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDA7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhMDMzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1NlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRvckhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRiLlNlcXVlbmNlQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFNlcXVlbmNlIEdlbmVyYXRvcjogfCBTZXF1ZW5jZUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEFsbG9jYXRpb24gU2l6ZTogICAgfCBJICAgICAgIHxJfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEluaXRpYWwgVmFsdWU6ICAgICAgfCAgICAgICAgIHxJfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBJZE1hcHBpbmcKLSAqIEBzZWUgU2VxdWVuY2VHZW5lcmF0b3IKLSAqIEBzZWUgR2VuZXJhdGlvbkNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIFNlcXVlbmNlQ29tYm8KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlIGV4dGVuZHMgR2VuZXJhdG9yQ29tcG9zaXRlPFNlcXVlbmNlR2VuZXJhdG9yPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgR2VuZXJhdG9ySG9sZGVyPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRHZW5lcmF0b3IoR2VuZXJhdG9ySG9sZGVyIHN1YmplY3QpIHsKLQkJcmV0dXJuIHN1YmplY3QuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTZXF1ZW5jZUdlbmVyYXRvcj4gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9ySG9sZGVyLCBTZXF1ZW5jZUdlbmVyYXRvcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBHZW5lcmF0b3JIb2xkZXIuU0VRVUVOQ0VfR0VORVJBVE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTZXF1ZW5jZUdlbmVyYXRvciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VxdWVuY2VDb21ibzxTZXF1ZW5jZUdlbmVyYXRvcj4gYnVpbGRTZXF1ZW5jZU5hbWVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBTZXF1ZW5jZUNvbWJvPFNlcXVlbmNlR2VuZXJhdG9yPih0aGlzLCBidWlsZFNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyKCksIHBhcmVudCkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFNlcXVlbmNlR2VuZXJhdG9yLkRFRkFVTFRfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoU2VxdWVuY2VHZW5lcmF0b3IuU1BFQ0lGSUVEX1NFUVVFTkNFX05BTUVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGJ1aWxkU3ViamVjdCgpIHsKLQkJCQlTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmJ1aWxkR2VuZXJhdG9yKAotCQkJCQlTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLnN1YmplY3QoKQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0U2VxdWVuY2VOYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNCdWlsZFN1YmplY3RBbGxvd2VkKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGpwYVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuanBhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTY2hlbWEgc2NoZW1hKCkgewotCQkJCS8vIFRPRE8KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCVNlcXVlbmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IGdlbmVyYXRvcigpOwotCi0JCQkJaWYgKGdlbmVyYXRvciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBnZW5lcmF0b3IuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFNlcXVlbmNlR2VuZXJhdG9yIGdlbmVyYXRvcihHZW5lcmF0b3JIb2xkZXIgc3ViamVjdCkgewotCQlyZXR1cm4gc3ViamVjdC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWUsCi0JCQlidWlsZEdlbmVyYXRvck5hbWVIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfU0VRVUVOQ0VfR0VORVJBVE9SX05BTUUKLQkJKTsKLQotCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3Igd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2UsCi0JCQlidWlsZFNlcXVlbmNlTmFtZUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9TRVFVRU5DRQotCQkpOwotCi0JCS8vIEFsbG9jYXRpb24gU2l6ZSB3aWRnZXRzCi0JCWluaXRpYWxpemVBbGxvY2F0aW9uU2l6ZVdpZGdldHMoY29udGFpbmVyKTsKLQotCQkvLyBJbml0aWFsIFZhbHVlIHdpZGdldHMKLQkJaW5pdGlhbGl6ZUluaXRpYWxWYWx1ZVdpZGdldHMoY29udGFpbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHByb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuIEdlbmVyYXRvckhvbGRlci5TRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiZGNhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhYmxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuVGFibGVDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBUYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IFRhYmxlOiAgIHwgVGFibGVDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IENhdGFsb2c6IHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IFNjaGVtYTogIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFRhYmxlCi0gKiBAc2VlIEVudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIFRhYmxlQ29tYm8KLSAqIEBzZWUgQ2F0YWxvZ0NvbWJvCi0gKiBAc2VlIFNjaGVtYUNvbWJvCi0gKgotICogQFRPRE8gcmVwb3B1bGF0ZSB0aGlzIHBhbmVsIGJhc2VkIG9uIHRoZSBFbnRpdHkgdGFibGUgY2hhbmdpbmcKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxUYWJsZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGFibGVDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SVRhYmxlPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFRhYmxlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBDYXRhbG9nQ29tYm88VGFibGU+IGJ1aWxkQ2F0YWxvZ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENhdGFsb2dDb21ibzxUYWJsZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2NoZW1hQ29tYm88VGFibGU+IGJ1aWxkU2NoZW1hQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgU2NoZW1hQ29tYm88VGFibGU+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkU2NoZW1hKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZUNvbWJvPFRhYmxlPiBidWlsZFRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgVGFibGVDb21ibzxUYWJsZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuREVGQVVMVF9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHByb3BlcnR5TmFtZSA9PSBUYWJsZS5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSAKLQkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkKLQkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWQotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGUuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgKSB7Ci0JCQkJCXJlcG9wdWxhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0TmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hTmFtZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWROYW1lKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlIHRhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGJUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gVGFibGUgZ3JvdXAgcGFuZQotCQlHcm91cCB0YWJsZUdyb3VwUGFuZSA9IGJ1aWxkVGl0bGVkUGFuZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUNvbXBvc2l0ZV90YWJsZVNlY3Rpb24KLQkJKTsKLQotCQkvLyBUYWJsZSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCXRhYmxlR3JvdXBQYW5lLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlQ2hvb3Nlcl9sYWJlbCwKLQkJCWJ1aWxkVGFibGVDb21ibyh0YWJsZUdyb3VwUGFuZSksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfVEFCTEUKLQkJKTsKLQotCQkvLyBDYXRhbG9nIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJdGFibGVHcm91cFBhbmUsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ2F0YWxvZ0Nob29zZXJfbGFiZWwsCi0JCQlidWlsZENhdGFsb2dDb21ibyh0YWJsZUdyb3VwUGFuZSksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfQ0FUQUxPRwotCQkpOwotCi0JCS8vIFNjaGVtYSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCXRhYmxlR3JvdXBQYW5lLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNjaGVtYUNob29zZXJfbGFiZWwsCi0JCQlidWlsZFNjaGVtYUNvbWJvKHRhYmxlR3JvdXBQYW5lKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9TQ0hFTUEKLQkJKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzMyMjQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVGFibGVHZW5lcmF0b3JDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9ySG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYi5DYXRhbG9nQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRiLkNvbHVtbkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuVGFibGVDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTmFtZTogICAgICAgICAgICAgICAgICAgICB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgVGFibGU6ICAgICAgICAgICAgICAgICAgICB8IFRhYmxlQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ2F0YWxvZzogICAgICAgICAgICAgICAgICB8IENhdGFsb2dDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgU2NoZW1hOiAgICAgICAgICAgICAgICAgICB8IFNjaGVtYUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgUHJpbWFyeSBLZXkgQ29sdW1uOiAgICAgICB8IENvbHVtbkNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgVmFsdWUgQ29sdW1uOiAgICAgICAgICAgICB8IENvbHVtbkNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgUHJpbWFyeSBLZXkgQ29sdW1uIFZhbHVlOiB8IENvbHVtbkNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgQWxsb2NhdGlvbiBTaXplOiAgICAgICAgICB8IEkgICAgICAgfEl8ICBEZWZhdWx0IChYWFgpICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgSW5pdGlhbCBWYWx1ZTogICAgICAgICAgICB8IEkgICAgICAgfEl8ICBEZWZhdWx0IChYWFgpICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIElkTWFwcGluZwotICogQHNlZSBUYWJsZUdlbmVyYXRvcgotICogQHNlZSBHZW5lcmF0aW9uQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQ2F0YWxvZ0NvbWJvCi0gKiBAc2VlIENvbHVtbkNvbWJvCi0gKiBAc2VlIFNjaGVtYUNvbWJvCi0gKiBAc2VlIFRhYmxlQ29tYm8KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlIGV4dGVuZHMgR2VuZXJhdG9yQ29tcG9zaXRlPFRhYmxlR2VuZXJhdG9yPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFibGVHZW5lcmF0b3JDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgR2VuZXJhdG9ySG9sZGVyPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIENhdGFsb2dDb21ibzxUYWJsZUdlbmVyYXRvcj4gYnVpbGRDYXRhbG9nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2F0YWxvZ0NvbWJvPFRhYmxlR2VuZXJhdG9yPih0aGlzLCBidWlsZFRhYmxlR2VuZXJhdG9ySG9sZGVyKCksIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGJ1aWxkU3ViamVjdCgpIHsKLQkJCQlUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmJ1aWxkR2VuZXJhdG9yKAotCQkJCQlUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLnN1YmplY3QoKQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGlzQnVpbGRTdWJqZWN0QWxsb3dlZCgpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBqcGFQcm9qZWN0KCkgewotCQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmpwYVByb2plY3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZENhdGFsb2coKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGFibGVHZW5lcmF0b3IgYnVpbGRHZW5lcmF0b3IoR2VuZXJhdG9ySG9sZGVyIHN1YmplY3QpIHsKLQkJcmV0dXJuIHN1YmplY3QuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkNvbWJvPFRhYmxlR2VuZXJhdG9yPiBidWlsZFBrQ29sdW1uTmFtZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlyZXR1cm4gbmV3IENvbHVtbkNvbWJvPFRhYmxlR2VuZXJhdG9yPih0aGlzLCBidWlsZFRhYmxlR2VuZXJhdG9ySG9sZGVyKCksIHBhcmVudCkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfUEtfQ09MVU1OX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9QS19DT0xVTU5fTkFNRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYnVpbGRTdWJqZWN0KCkgewotCQkJCVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuYnVpbGRHZW5lcmF0b3IoCi0JCQkJCVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuc3ViamVjdCgpCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRQa0NvbHVtbk5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0J1aWxkU3ViamVjdEFsbG93ZWQoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QganBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5qcGFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZFBrQ29sdW1uTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlIHRhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGJUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkNvbWJvPFRhYmxlR2VuZXJhdG9yPiBidWlsZFBrQ29sdW1uVmFsdWVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBDb2x1bW5Db21ibzxUYWJsZUdlbmVyYXRvcj4odGhpcywgYnVpbGRUYWJsZUdlbmVyYXRvckhvbGRlcigpLCBwYXJlbnQpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1BLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1BLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYnVpbGRTdWJqZWN0KCkgewotCQkJCVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuYnVpbGRHZW5lcmF0b3IoCi0JCQkJCVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuc3ViamVjdCgpCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRQa0NvbHVtblZhbHVlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNCdWlsZFN1YmplY3RBbGxvd2VkKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGpwYVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuanBhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGUgdGFibGUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNjaGVtYUNvbWJvPFRhYmxlR2VuZXJhdG9yPiBidWlsZFNjaGVtYUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IFNjaGVtYUNvbWJvPFRhYmxlR2VuZXJhdG9yPih0aGlzLCBidWlsZFRhYmxlR2VuZXJhdG9ySG9sZGVyKCksIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBidWlsZFN1YmplY3QoKSB7Ci0JCQkJVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5idWlsZEdlbmVyYXRvcigKLQkJCQkJVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5zdWJqZWN0KCkKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGlzQnVpbGRTdWJqZWN0QWxsb3dlZCgpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBqcGFQcm9qZWN0KCkgewotCQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmpwYVByb2plY3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkU2NoZW1hKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvckhvbGRlciwgVGFibGVHZW5lcmF0b3I+KGdldFN1YmplY3RIb2xkZXIoKSwgR2VuZXJhdG9ySG9sZGVyLlRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGVHZW5lcmF0b3IgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlQ29tYm88VGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVOYW1lQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXJldHVybiBuZXcgVGFibGVDb21ibzxUYWJsZUdlbmVyYXRvcj4odGhpcywgYnVpbGRUYWJsZUdlbmVyYXRvckhvbGRlcigpLCBwYXJlbnQpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1RBQkxFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCQkJCWlmIChwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkgCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkKLQkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZICkgewotCQkJCQlyZXBvcHVsYXRlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGJ1aWxkU3ViamVjdCgpIHsKLQkJCQlUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmJ1aWxkR2VuZXJhdG9yKAotCQkJCQlUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLnN1YmplY3QoKQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0VGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0J1aWxkU3ViamVjdEFsbG93ZWQoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QganBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5qcGFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBzY2hlbWFOYW1lKCkgewotCQkJCWlmIChzdWJqZWN0KCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNjaGVtYSgpOwotCQkJCX0KLQkJCQlpZiAoVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5zdWJqZWN0KCkuZ2V0RW50aXR5TWFwcGluZ3MoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLnN1YmplY3QoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5zdWJqZWN0KCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRUYWJsZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlIHRhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGJUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRUYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sdW1uQ29tYm88VGFibGVHZW5lcmF0b3I+IGJ1aWxkVmFsdWVDb2x1bW5Db21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBDb2x1bW5Db21ibzxUYWJsZUdlbmVyYXRvcj4odGhpcywgYnVpbGRUYWJsZUdlbmVyYXRvckhvbGRlcigpLCBwYXJlbnQpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1ZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGJ1aWxkU3ViamVjdCgpIHsKLQkJCQlUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmJ1aWxkR2VuZXJhdG9yKAotCQkJCQlUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLnN1YmplY3QoKQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNCdWlsZFN1YmplY3RBbGxvd2VkKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGpwYVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuanBhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZSB0YWJsZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERiVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRhYmxlR2VuZXJhdG9yIGdlbmVyYXRvcihHZW5lcmF0b3JIb2xkZXIgc3ViamVjdCkgewotCQlyZXR1cm4gKHN1YmplY3QgIT0gbnVsbCkgPyBzdWJqZWN0LmdldFRhYmxlR2VuZXJhdG9yKCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWUsCi0JCQlidWlsZEdlbmVyYXRvck5hbWVIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX05BTUUKLQkJKTsKLQotCQkvLyBUYWJsZSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV90YWJsZSwKLQkJCWJ1aWxkVGFibGVOYW1lQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1RBQkxFCi0JCSk7Ci0KLQkJLy8gU2NoZW1hIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3NjaGVtYSwKLQkJCWJ1aWxkU2NoZW1hQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1NDSEVNQQotCQkpOwotCi0JCS8vIENhdGFsb2cgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfY2F0YWxvZywKLQkJCWJ1aWxkQ2F0YWxvZ0NvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9DQVRBTE9HCi0JCSk7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgQ29sdW1uIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uLAotCQkJYnVpbGRQa0NvbHVtbk5hbWVDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfUFJJTUFSWV9LRVlfQ09MVU1OCi0JCSk7Ci0KLQkJLy8gVmFsdWUgQ29sdW1uIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3ZhbHVlQ29sdW1uLAotCQkJYnVpbGRWYWx1ZUNvbHVtbkNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9WQUxVRV9DT0xVTU4KLQkJKTsKLQotCQkvLyBQcmltYXJ5IEtleSBDb2x1bW4gVmFsdWUgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfcGtDb2x1bW5WYWx1ZSwKLQkJCWJ1aWxkUGtDb2x1bW5WYWx1ZUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9QUklNQVJZX0tFWV9DT0xVTU5fVkFMVUUKLQkJKTsKLQotCQkvLyBBbGxvY2F0aW9uIFNpemUgd2lkZ2V0cwotCQlpbml0aWFsaXplQWxsb2NhdGlvblNpemVXaWRnZXRzKGNvbnRhaW5lcik7Ci0KLQkJLy8gSW5pdGlhbCBWYWx1ZSB3aWRnZXRzCi0JCWluaXRpYWxpemVJbml0aWFsVmFsdWVXaWRnZXRzKGNvbnRhaW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9wZXJ0eU5hbWUoKSB7Ci0JCXJldHVybiBHZW5lcmF0b3JIb2xkZXIuVEFCTEVfR0VORVJBVE9SX1BST1BFUlRZOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhcmdldEVudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UYXJnZXRFbnRpdHlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRmMDNkOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhcmdldEVudGl0eUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIHwgVGFyZ2V0IEVudGl0eTogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfCBCcm93c2UuLi4gfCB8Ci0gKiB8IMKvwq/Cr8Kvwq/Cr8Kvwq/Cr8Kvwq/Cr8Kvwq8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgUmVsYXRpb25zaGlwTWFwcGluZwotICogQHNlZSBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRhcmdldEVudGl0eUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8UmVsYXRpb25zaGlwTWFwcGluZz4KLXsKLQlwcml2YXRlIENDb21ibyBjb21ibzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFyZ2V0RW50aXR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUYXJnZXRFbnRpdHlDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgUmVsYXRpb25zaGlwTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFyZ2V0RW50aXR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SVJlbGF0aW9uc2hpcE1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUmVsYXRpb25zaGlwTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUmVsYXRpb25zaGlwTWFwcGluZy5ERUZBVUxUX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChSZWxhdGlvbnNoaXBNYXBwaW5nLlNQRUNJRklFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkT3BlblRhcmdldEVudGl0eUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUYXJnZXRFbnRpdHlDb21wb3NpdGUudGhpcy5vcGVuRWRpdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE9wZW5UeXBlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGNvbWJvLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlkb09wZW5TZWxlY3Rpb25EaWFsb2coKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgYnVpbGRUYXJnZXRFbnRpdHlNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmICghaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJQ0NvbWJvIGNvbWJvID0gKENDb21ibykgZS53aWRnZXQ7Ci0JCQkJCWlmIChjb21iby5nZXREYXRhKCJwb3B1bGF0aW5nIikgIT0gQm9vbGVhbi5UUlVFKSB7Ly9jaGVjayAhVFJVRSBiZWNhdXNlIG51bGwgaXMgYSBwb3NzaWJpbGl0eSBhcyB3ZWxsCi0JCQkJCQl2YWx1ZUNoYW5nZWQoY29tYm8uZ2V0VGV4dCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBidWlsZFRhcmdldEVudGl0eVNlbGVjdGlvbkJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBidWlsZFB1c2hCdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFyZ2V0RW50aXR5Q2hvb3Nlcl9icm93c2UsCi0JCQlidWlsZE9wZW5UeXBlQWN0aW9uKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9PcGVuU2VsZWN0aW9uRGlhbG9nKCkgewotCQlTZWxlY3Rpb25EaWFsb2cgZGlhbG9nOwotCi0JCXRyeSB7Ci0JCQlkaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKLQkJCQlnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLAotCQkJCVNlYXJjaEVuZ2luZS5jcmVhdGVXb3Jrc3BhY2VTY29wZSgpLAotCQkJCUlKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9BTExfVFlQRVMsCi0JCQkJZmFsc2UKLQkJCSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlkaWFsb2cuc2V0VGl0bGUoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhcmdldEVudGl0eUNob29zZXJfc2VsZWN0VHlwZVRpdGxlKTsKLQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJCXRoaXMuY29tYm8uc2V0VGV4dCh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0KLQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29tYm8gPSBidWlsZEVkaXRhYmxlQ0NvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLmFkZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFyZ2V0RW50aXR5Q2hvb3Nlcl9kZWZhdWx0RW1wdHkpOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihidWlsZFRhcmdldEVudGl0eU1vZGlmeUxpc3RlbmVyKCkpOwotCi0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0KLQkJSHlwZXJsaW5rIGxhYmVsTGluayA9IGJ1aWxkSHlwZXJMaW5rKGNvbnRhaW5lciwKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYXJnZXRFbnRpdHlDaG9vc2VyX2xhYmVsLAotCQkJYnVpbGRPcGVuVGFyZ2V0RW50aXR5QWN0aW9uKCkKLQkJKTsKLQotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbExpbmssCi0JCQljb21ibywKLQkJCWJ1aWxkVGFyZ2V0RW50aXR5U2VsZWN0aW9uQnV0dG9uKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBUkdFVF9FTlRJVFkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcigpIHsKLQotCQlTdHJpbmcgdGFyZ2V0RW50aXR5ID0gc3ViamVjdCgpLmdldFRhcmdldEVudGl0eSgpOwotCi0JCWlmICh0YXJnZXRFbnRpdHkgIT0gbnVsbCkgewotCi0JCQl0cnkgewotCQkJCUlUeXBlIHR5cGUgPSBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUodGFyZ2V0RW50aXR5KTsKLQotCQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gdHlwZS5nZXRQYXJlbnQoKTsKLQkJCQkJSmF2YVVJLm9wZW5JbkVkaXRvcihqYXZhRWxlbWVudCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb21ibygpIHsKLQotCQljb21iby5yZW1vdmVBbGwoKTsKLQkJcG9wdWxhdGVEZWZhdWx0VmFsdWUoKTsKLQkJLy8gVE9ETyBBZGQgcG9zc2libGUgdGFyZ2V0IGVudGl0eSBuYW1lcwotCQl1cGRhdGVTZWxlY3RlZEl0ZW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHRoZSBjb21ibyBpZiBvbmUgZXhpc3RzLgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURlZmF1bHRWYWx1ZSgpIHsKLQotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIGVudGl0eSA9IHN1YmplY3QoKTsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IChlbnRpdHkgIT0gbnVsbCkgPyBlbnRpdHkuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpIDogbnVsbDsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCWNvbWJvLmFkZChOTFMuYmluZCgKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFyZ2V0RW50aXR5Q2hvb3Nlcl9kZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCWRlZmF1bHRWYWx1ZQotCQkJKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljb21iby5hZGQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhcmdldEVudGl0eUNob29zZXJfZGVmYXVsdEVtcHR5KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCi0JCWlmIChwcm9wZXJ0eU5hbWUgPT0gUmVsYXRpb25zaGlwTWFwcGluZy5ERUZBVUxUX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFkgfHwKLQkJICAgIHByb3BlcnR5TmFtZSA9PSBSZWxhdGlvbnNoaXBNYXBwaW5nLlNQRUNJRklFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZKSB7Ci0KLQkJCXBvcHVsYXRlQ29tYm8oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHNlbGVjdGVkIGl0ZW0gYnkgc2VsZWN0ZWQgdGhlIGN1cnJlbnQgdmFsdWUsIGlmIG5vdAotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCBvciBzZWxlY3QgdGhlIGRlZmF1bHQgdmFsdWUgaWYgb25lIGlzIGF2YWlsYWJsZSwKLQkgKiBvdGhlcndpc2UgcmVtb3ZlIHRoZSBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IEl0IHNlZW1zIHRoZSB0ZXh0IGNhbiBiZSBzaG93biBhcyB0cnVuY2F0ZWQsIGNoYW5naW5nIHRoZQotCSAqIHNlbGVjdGlvbiB0byAoMCwgMCkgbWFrZXMgdGhlIGVudGlyZSB0ZXh0IHZpc2libGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlbGVjdGVkSXRlbSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyBzdWJqZWN0ID0gc3ViamVjdCgpOwotCQlTdHJpbmcgdmFsdWUgPSAoc3ViamVjdCAhPSBudWxsKSA/IHN1YmplY3QuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgOiBudWxsOwotCi0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQljb21iby5zZXRUZXh0KHZhbHVlKTsKLQkJCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgMCkpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IChzdWJqZWN0ICE9IG51bGwpID8gc3ViamVjdC5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkgOiBudWxsOwotCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFyZ2V0RW50aXR5Q2hvb3Nlcl9kZWZhdWx0RW1wdHk7Ci0KLQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCWRpc3BsYXlTdHJpbmcgPSBOTFMuYmluZCgKLQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCQlkZWZhdWx0VmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQkvLyBTZWxlY3RlZCB0aGUgZGVmYXVsdCB2YWx1ZQotCQkJaWYgKGRpc3BsYXlTdHJpbmcgIT0gbnVsbCkgewotCQkJCWNvbWJvLnNlbGVjdCgwKTsKLQkJCQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIDApKTsKLQkJCX0KLQkJCS8vIFJlbW92ZSB0aGUgc2VsZWN0aW9uCi0JCQllbHNlIHsKLQkJCQljb21iby5zZWxlY3QoLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbHVlQ2hhbmdlZChTdHJpbmcgdmFsdWUpIHsKLQotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIHN1YmplY3QgPSBzdWJqZWN0KCk7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IChzdWJqZWN0ICE9IG51bGwpID8gc3ViamVjdC5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSA6IG51bGw7Ci0KLQkJLy8gQ2hlY2sgZm9yIG51bGwgdmFsdWUKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodmFsdWUpKSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0KLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KG9sZFZhbHVlKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIFRoZSBkZWZhdWx0IHZhbHVlCi0JCWlmICh2YWx1ZSAhPSBudWxsICYmCi0JCSAgICBjb21iby5nZXRJdGVtQ291bnQoKSA+IDAgJiYKLQkJICAgIHZhbHVlLmVxdWFscyhjb21iby5nZXRJdGVtKDApKSkKLQkJewotCQkJdmFsdWUgPSBudWxsOwotCQl9Ci0KLQkJLy8gTm90aGluZyB0byBjaGFuZ2UKLQkJaWYgKChvbGRWYWx1ZSA9PSB2YWx1ZSkgJiYgdmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gU2V0IHRoZSBuZXcgdmFsdWUKLQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJiAob2xkVmFsdWUgPT0gbnVsbCkgfHwKLQkJICAgKChvbGRWYWx1ZSAhPSBudWxsKSAmJiAhb2xkVmFsdWUuZXF1YWxzKHZhbHVlKSkpIHsKLQotCQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKLQotCQkJdHJ5IHsKLQkJCQlzdWJqZWN0LnNldFNwZWNpZmllZFRhcmdldEVudGl0eSh2YWx1ZSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RlbXBvcmFsVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UZW1wb3JhbFR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmM2UwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RlbXBvcmFsVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFRlbXBvcmFsOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBDb2x1bW5NYXBwaW5nCi0gKiBAc2VlIFRlbXBvcmFsVHlwZQotICogQHNlZSBCYXNpY01hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgSWRNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wb3JhbFR5cGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPENvbHVtbk1hcHBpbmc+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGVtcG9yYWxUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUZW1wb3JhbFR5cGVDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgQ29sdW1uTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGVtcG9yYWxUeXBlPiBidWlsZFNvcnRlZFRlbXBvcmFsVHlwZUxpc3RIb2xkZXIoKSB7Ci0JCUxpc3Q8VGVtcG9yYWxUeXBlPiB0eXBlcyA9IENvbGxlY3Rpb25Ub29scy5saXN0KFRlbXBvcmFsVHlwZS52YWx1ZXMoKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQodHlwZXMsIGJ1aWxkVGVtcG9yYWxUeXBlQ29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxUZW1wb3JhbFR5cGU+KHR5cGVzKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8VGVtcG9yYWxUeXBlPiBidWlsZFRlbXBvcmFsVHlwZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxUZW1wb3JhbFR5cGU+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFRlbXBvcmFsVHlwZSB0eXBlMSwgVGVtcG9yYWxUeXBlIHR5cGUyKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcxID0gZGlzcGxheVN0cmluZyh0eXBlMSk7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcyID0gZGlzcGxheVN0cmluZyh0eXBlMik7Ci0JCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShkaXNwbGF5U3RyaW5nMSwgZGlzcGxheVN0cmluZzIpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFRlbXBvcmFsVHlwZT4gYnVpbGRUZW1wb3JhbFR5cGVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFRlbXBvcmFsVHlwZT4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhUZW1wb3JhbFR5cGUgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gSnB0VWlNZXNzYWdlcy5FbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdDsKLQkJCQl9Ci0JCQkJcmV0dXJuIGRpc3BsYXlTdHJpbmcodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVtcG9yYWxUeXBlPiBidWlsZFRlbXBvcmFsVHlwZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29sdW1uTWFwcGluZywgVGVtcG9yYWxUeXBlPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbHVtbk1hcHBpbmcuVEVNUE9SQUxfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRUZW1wb3JhbCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhUZW1wb3JhbFR5cGUgdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFRlbXBvcmFsKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRlbXBvcmFsVHlwZT4gYnVpbGRUZW1wb3JhbFR5cGVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFRlbXBvcmFsVHlwZT4oCi0JCQkoVGVtcG9yYWxUeXBlKSBudWxsLAotCQkJYnVpbGRTb3J0ZWRUZW1wb3JhbFR5cGVMaXN0SG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBkaXNwbGF5U3RyaW5nKFRlbXBvcmFsVHlwZSB0ZW1wb3JhbFR5cGUpIHsKLQkJcmV0dXJuIFNXVFV0aWwuYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLmNsYXNzLAotCQkJVGVtcG9yYWxUeXBlQ29tcG9zaXRlLnRoaXMsCi0JCQl0ZW1wb3JhbFR5cGUubmFtZSgpCi0JCSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJYnVpbGRMYWJlbGVkQ0NvbWJvKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJhc2ljR2VuZXJhbFNlY3Rpb25fdGVtcG9yYWxMYWJlbCwKLQkJCWJ1aWxkVGVtcG9yYWxUeXBlTGlzdEhvbGRlcigpLAotCQkJYnVpbGRUZW1wb3JhbFR5cGVIb2xkZXIoKSwKLQkJCWJ1aWxkVGVtcG9yYWxUeXBlQ29udmVydGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RFTVBPUkFMCi0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4OTc5NTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhbmUgZG9lcyBub3QgaGF2ZSBhbnkgd2lkZ2V0cy4KLSAqCi0gKiBAc2VlIFRyYW5zaWVudE1hcHBpbmcKLSAqIEBzZWUgQmFzZUpwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8VHJhbnNpZW50TWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlPFRyYW5zaWVudE1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SVRyYW5zaWVudE1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFRyYW5zaWVudE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZmE0NmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENvbHVtbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgVmVyc2lvbk1hcHBpbmcKLSAqIEBzZWUgQmFzZUpwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICogQHNlZSBDb2x1bW5Db21wb3NpdGUKLSAqIEBzZWUgVGVtcG9yYWxUeXBlQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8VmVyc2lvbk1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGU8VmVyc2lvbk1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklWZXJzaW9uTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENvbHVtbj4gYnVpbGRDb2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VmVyc2lvbk1hcHBpbmcsIENvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2x1bW4gdHJhbnNmb3JtXyhWZXJzaW9uTWFwcGluZyB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCi0JCS8vIENvbHVtbiB3aWRnZXRzCi0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQkvLyBUZW1wb3JhbCBUeXBlIHdpZGdldHMKLQkJbmV3IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pCi0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21lbnVzL01hcEFzQ29udHJpYnV0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tZW51cy9NYXBBc0NvbnRyaWJ1dGlvbi5qYXZhCmluZGV4IGU2NTRkMTMuLmE0ODBmNTEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21lbnVzL01hcEFzQ29udHJpYnV0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWVudXMvTWFwQXNDb250cmlidXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDE4ICs5LDIzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWVudXM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuSW1hZ2VJbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTb3VyY2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQ29tcG91bmRDb250cmlidXRpb25JdGVtOwpAQCAtMjksNiArMzQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1lbnVzLkNvbW1hbmRDb250cmlidXRpb25JdGVtUGFyYW1ldGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1lbnVzLklXb3JrYmVuY2hDb250cmlidXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuc2VydmljZXMuSVNlcnZpY2VMb2NhdG9yOworaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7CiAKIC8qKgogICogVGhpcyBtZW51IGNvbnRyaWJ1dGlvbiBpcyByZXNwb25zaWJsZSB0byBwb3B1bGF0ZSB0aGUgTWFwIEFzIG1lbnUgd2l0aCB0aGUKQEAgLTY4LDcgKzc0LDcgQEAKIAkJLy8gUmV0cmlldmUgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZSBoYW5kbGVyIHNlcnZpY2UKIAkJLy8gd2hpY2ggc2hvdWxkIGJlIGFuIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9mIEpwYVN0cnVjdHVyZU5vZGVzCiAJCUlIYW5kbGVyU2VydmljZSBoYW5kbGVyU2VydmljZSA9IAotCQkJKElIYW5kbGVyU2VydmljZSkgc2VydmljZUxvY2F0b3IuZ2V0U2VydmljZShJSGFuZGxlclNlcnZpY2UuY2xhc3MpOworCQkJKElIYW5kbGVyU2VydmljZSkgdGhpcy5zZXJ2aWNlTG9jYXRvci5nZXRTZXJ2aWNlKElIYW5kbGVyU2VydmljZS5jbGFzcyk7CiAJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSAKIAkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgaGFuZGxlclNlcnZpY2UuZ2V0Q3VycmVudFN0YXRlKCkuZ2V0VmFyaWFibGUoSVNvdXJjZXMuQUNUSVZFX0NVUlJFTlRfU0VMRUNUSU9OX05BTUUpOwogCQkKQEAgLTc2LDYyICs4Miw4OSBAQAogCQkvLyBhbmQgcmV0cmlldmUgdGhlIG1hcHBpbmcgVUkgcHJvdmlkZXJzIGp1c3QgZnJvbSB0aGUgZmlyc3QgaXRlbQogCQlKcGFTdHJ1Y3R1cmVOb2RlIG5vZGUgPSAoSnBhU3RydWN0dXJlTm9kZSkgY3VycmVudFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKIAkJCi0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuYXJyYXkoCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxNYXBwaW5nVWlQcm92aWRlcjw/PiwgSUNvbnRyaWJ1dGlvbkl0ZW0+KG1hcHBpbmdVaVByb3ZpZGVycyhub2RlKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbSB0cmFuc2Zvcm0oTWFwcGluZ1VpUHJvdmlkZXI8Pz4gbmV4dCkgewotCQkJCQlyZXR1cm4gY29udHJpYnV0aW9uSXRlbShuZXh0KTsKLQkJCQl9Ci0JCQl9LAotCQkJbmV3IElDb250cmlidXRpb25JdGVtWzBdKTsKKwkJcmV0dXJuIAorCQkJQXJyYXlUb29scy5hcnJheSgKKwkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPD8+LCBJQ29udHJpYnV0aW9uSXRlbT4obWFwcGluZ1VpRGVmaW5pdGlvbnMobm9kZSkpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbSB0cmFuc2Zvcm0oTWFwcGluZ1VpRGVmaW5pdGlvbjw/PiBuZXh0KSB7CisJCQkJCQlyZXR1cm4gY3JlYXRlQ29udHJpYnV0aW9uSXRlbShuZXh0KTsKKwkJCQkJfQorCQkJCX0sCisJCQkJbmV3IElDb250cmlidXRpb25JdGVtWzBdKTsKIAl9CiAJCisKKwlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPD8+PiBnZXREZWZpbml0aW9uc0NvbXBhcmF0b3IoKSB7CisJCXJldHVybiBuZXcgQ29tcGFyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPD8+PigpIHsKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShNYXBwaW5nVWlEZWZpbml0aW9uPD8+IGl0ZW0xLCBNYXBwaW5nVWlEZWZpbml0aW9uPD8+IGl0ZW0yKSB7CisJCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcxID0gaXRlbTEuZ2V0TGFiZWwoKTsKKwkJCQlTdHJpbmcgZGlzcGxheVN0cmluZzIgPSBpdGVtMi5nZXRMYWJlbCgpOworCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGlzcGxheVN0cmluZzEsIGRpc3BsYXlTdHJpbmcyKTsKKwkJCX0KKwkJfTsKKwl9CisKIAkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHJlZ2lzdGVyZWQge0BsaW5rIE1hcHBpbmdVaVByb3ZpZGVyfXMgZnJvbSB0aGUgZ2l2ZW4gbm9kZSwgCisJICogUmV0cmlldmVzIHRoZSByZWdpc3RlcmVkIHtAbGluayBNYXBwaW5nVWlEZWZpbml0aW9ufXMgZnJvbSB0aGUgZ2l2ZW4gbm9kZSwgCiAJICogdXNpbmcgaXRzIHtAbGluayBKcGFQbGF0Zm9ybVVpfS4KIAkgKgogCSAqIEBwYXJhbSBub2RlIEEgdGVzdCBub2RlIHRvIGRldGVybWluZSB0aGUge0BsaW5rIEpwYVBsYXRmb3JtVWl9IGFuZCB0eXBlIAogCSAqIG9mIHByb3ZpZGVycyB0byByZXR1cm4KLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQge0BsaW5rIE1hcHBpbmdVaVByb3ZpZGVyfXMKKwkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQge0BsaW5rIE1hcHBpbmdVaURlZmluaXRpb259cwogCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpUHJvdmlkZXI8Pz4+IAotCQkJbWFwcGluZ1VpUHJvdmlkZXJzKEpwYVN0cnVjdHVyZU5vZGUgbm9kZSkgeworCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjw/Pj4gbWFwcGluZ1VpRGVmaW5pdGlvbnMoSnBhU3RydWN0dXJlTm9kZSBub2RlKSB7CiAJCUpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtID0gbm9kZS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKTsKLQkJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpID0gSnB0VWlQbHVnaW4uZ2V0UGx1Z2luKCkuanBhUGxhdGZvcm1VaShqcGFQbGF0Zm9ybSk7Ci0JCXJldHVybiBtYXBwaW5nVWlQcm92aWRlcnMoanBhUGxhdGZvcm1VaSwgbm9kZSk7CisJCUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSA9IEpwdFVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1VaShqcGFQbGF0Zm9ybSk7CisJCQorCQlJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjw/Pj4gc29ydGVkTWFwcGluZ1VpRGVmaW5pdGlvbnMgPSAKKwkJCUNvbGxlY3Rpb25Ub29scy5zb3J0KAorCQkJCW1hcHBpbmdVaURlZmluaXRpb25zKGpwYVBsYXRmb3JtVWksIG5vZGUuZ2V0UmVzb3VyY2VUeXBlKCkpLCAKKwkJCQlnZXREZWZpbml0aW9uc0NvbXBhcmF0b3IoKSk7CisJCQorCQlEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjw/PiBkZWZhdWx0RGVmaW5pdGlvbiA9IGdldERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uKGpwYVBsYXRmb3JtVWksIG5vZGUpOworCQlpZiAoZGVmYXVsdERlZmluaXRpb24gIT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPD8+PihkZWZhdWx0RGVmaW5pdGlvbiwgc29ydGVkTWFwcGluZ1VpRGVmaW5pdGlvbnMpOworCQl9CisJCXJldHVybiBzb3J0ZWRNYXBwaW5nVWlEZWZpbml0aW9uczsKIAl9CisKKwkvKioKKwkqIFJldHJpZXZlcyB0aGUgcmVnaXN0ZXJlZCB7QGxpbmsgTWFwcGluZ1VpRGVmaW5pdGlvbn1zIGZyb20gdGhlIGdpdmVuIAorCSoge0BsaW5rIEpwYVBsYXRmb3JtVWl9IGFuZCB7QGxpbmsgSnBhU3RydWN0dXJlTm9kZX0gKHRvIGRldGVybWluZSB0eXBlIG9mIAorCSogbWFwcGluZyBwcm92aWRlcnMgdG8gcmV0cmlldmUpLgorCSoKKwkqIEBwYXJhbSBqcGFQbGF0Zm9ybVVpIFRoZSBhY3RpdmUge0BsaW5rIEpwYVBsYXRmb3JtVWl9IGZyb20gd2hlcmUgdGhlCisJKiBwcm92aWRlciBjYW4gYmUgcmV0cmlldmVkCisJKiBAcGFyYW0gbm9kZSBBIHRlc3Qgbm9kZSB0byBkZXRlcm1pbmUgdHlwZSBvZiBwcm92aWRlcnMgdG8gcmV0dXJuCisJKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQge0BsaW5rIE1hcHBpbmdVaURlZmluaXRpb259cworCSovCisJcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPD8+PiAKKwkJbWFwcGluZ1VpRGVmaW5pdGlvbnMoSnBhUGxhdGZvcm1VaSBwbGF0Zm9ybVVpLCBKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKIAkKIAkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHJlZ2lzdGVyZWQge0BsaW5rIE1hcHBpbmdVaVByb3ZpZGVyfXMgZnJvbSB0aGUgZ2l2ZW4gCi0JICoge0BsaW5rIEpwYVBsYXRmb3JtVWl9IGFuZCB7QGxpbmsgSnBhU3RydWN0dXJlTm9kZX0gKHRvIGRldGVybWluZSB0eXBlIG9mIAotCSAqIG1hcHBpbmcgcHJvdmlkZXJzIHRvIHJldHJpZXZlKS4KLQkgKgotCSAqIEBwYXJhbSBqcGFQbGF0Zm9ybVVpIFRoZSBhY3RpdmUge0BsaW5rIEpwYVBsYXRmb3JtVWl9IGZyb20gd2hlcmUgdGhlCi0JICogcHJvdmlkZXIgY2FuIGJlIHJldHJpZXZlZAotCSAqIEBwYXJhbSBub2RlIEEgdGVzdCBub2RlIHRvIGRldGVybWluZSB0eXBlIG9mIHByb3ZpZGVycyB0byByZXR1cm4KLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQge0BsaW5rIE1hcHBpbmdVaVByb3ZpZGVyfXMKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaVByb3ZpZGVyPD8+PiAKLQkJCW1hcHBpbmdVaVByb3ZpZGVycyhKcGFQbGF0Zm9ybVVpIHBsYXRmb3JtVWksIEpwYVN0cnVjdHVyZU5vZGUgbm9kZSk7Ci0JCi0JcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtIGNvbnRyaWJ1dGlvbkl0ZW0oTWFwcGluZ1VpUHJvdmlkZXI8Pz4gbWFwcGluZ1VpUHJvdmlkZXIpIHsKLQkJQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IAotCQkJbmV3IENvbW1hbmRDb250cmlidXRpb25JdGVtKHBhcmFtZXRlcihtYXBwaW5nVWlQcm92aWRlcikpOwotCQlyZXR1cm4gaXRlbTsKKwkqIENyZWF0ZXMgdGhlIGRlZmF1bHQgcHJvdmlkZXIgcmVzcG9uc2libGUgZm9yIGNsZWFyaW5nIHRoZSBtYXBwaW5nIHR5cGUuCisJKiBJZiBub3QgZGVmYXVsdCBwcm92aWRlciwgdGhlbiByZXR1cm4gbnVsbAorCSoKKwkqIEByZXR1cm4gQSBwcm92aWRlciB0aGF0IGFjdHMgYXMgYSBkZWZhdWx0IG1hcHBpbmcgcHJvdmlkZXIKKwkqLworCXByb3RlY3RlZCBhYnN0cmFjdCBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjw/PiBnZXREZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbihKcGFQbGF0Zm9ybVVpIHBsYXRmb3JtVWksIEpwYVN0cnVjdHVyZU5vZGUgbm9kZSk7CisJCQkKKwlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW0gY3JlYXRlQ29udHJpYnV0aW9uSXRlbShNYXBwaW5nVWlEZWZpbml0aW9uPD8+IG1hcHBpbmdVaVByb3ZpZGVyKSB7CisJCXJldHVybiBuZXcgQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW0oY3JlYXRlUGFyYW1ldGVyKG1hcHBpbmdVaVByb3ZpZGVyKSk7CiAJfQogCQotCXByb3RlY3RlZCBDb21tYW5kQ29udHJpYnV0aW9uSXRlbVBhcmFtZXRlciBwYXJhbWV0ZXIoTWFwcGluZ1VpUHJvdmlkZXI8Pz4gbWFwcGluZ1VpUHJvdmlkZXIpIHsKKwlwcm90ZWN0ZWQgQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW1QYXJhbWV0ZXIgY3JlYXRlUGFyYW1ldGVyKE1hcHBpbmdVaURlZmluaXRpb248Pz4gbWFwcGluZ1VpRGVmaW5pdGlvbikgewogCQlDb21tYW5kQ29udHJpYnV0aW9uSXRlbVBhcmFtZXRlciBwYXJhbWV0ZXIgPQogCQkJbmV3IENvbW1hbmRDb250cmlidXRpb25JdGVtUGFyYW1ldGVyKAotCQkJCQlzZXJ2aWNlTG9jYXRvciwgCi0JCQkJCWNyZWF0ZUNvbW1hbmRDb250cmlidXRpb25JdGVtSWQobWFwcGluZ1VpUHJvdmlkZXIpLAotCQkJCQljb21tYW5kSWQoKSwKKwkJCQkJdGhpcy5zZXJ2aWNlTG9jYXRvciwgCisJCQkJCWNyZWF0ZUNvbW1hbmRDb250cmlidXRpb25JdGVtSWQobWFwcGluZ1VpRGVmaW5pdGlvbiksCisJCQkJCWdldENvbW1hbmRJZCgpLAogCQkJCQlDb21tYW5kQ29udHJpYnV0aW9uSXRlbS5TVFlMRV9DSEVDSyk7Ci0JCXBhcmFtZXRlci5sYWJlbCA9IG1hcHBpbmdVaVByb3ZpZGVyLmdldExhYmVsKCk7CisJCXBhcmFtZXRlci5sYWJlbCA9IG1hcHBpbmdVaURlZmluaXRpb24uZ2V0TGFiZWwoKTsKIAkJTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCXBhcmFtZXRlcnMucHV0KGNvbW1hbmRQYXJhbWV0ZXJJZCgpLCBtYXBwaW5nVWlQcm92aWRlci5nZXRNYXBwaW5nS2V5KCkpOworCQlwYXJhbWV0ZXJzLnB1dChnZXRDb21tYW5kUGFyYW1ldGVySWQoKSwgbWFwcGluZ1VpRGVmaW5pdGlvbi5nZXRLZXkoKSk7CiAJCXBhcmFtZXRlci5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLQkJcGFyYW1ldGVyLmljb24gPSBuZXcgSW1hZ2VJbWFnZURlc2NyaXB0b3IobWFwcGluZ1VpUHJvdmlkZXIuZ2V0SW1hZ2UoKSk7CisJCXBhcmFtZXRlci5pY29uID0gbmV3IEltYWdlSW1hZ2VEZXNjcmlwdG9yKG1hcHBpbmdVaURlZmluaXRpb24uZ2V0SW1hZ2UoKSk7CiAJCXBhcmFtZXRlci52aXNpYmxlRW5hYmxlZCA9IHRydWU7CiAJCXJldHVybiBwYXJhbWV0ZXI7CiAJfQpAQCAtMTQyLDcgKzE3NSw3IEBACiAJICoKIAkgKiBAcmV0dXJuIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgIm1hcCBhcyIgY29tbWFuZAogCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgY29tbWFuZElkKCk7CisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb21tYW5kSWQoKTsKIAkKIAkvKioKIAkgKiBSZXRyaWV2ZXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBtYXBwaW5nIGtleSBjb21tYW5kIHBhcmFtZXRlciB0aGF0IApAQCAtMTUwLDE0ICsxODMsMTQgQEAKIAkgKgogCSAqIEByZXR1cm4gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSAibWFwIGFzIiBjb21tYW5kIHBhcmFtZXRlcgogCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgY29tbWFuZFBhcmFtZXRlcklkKCk7CisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb21tYW5kUGFyYW1ldGVySWQoKTsKIAkKIAkvKioKIAkgKiBSZXR1cm5zIGFuIGlkIGZvciBhIHtAbGluayBDb21tYW5kQ29udHJpYnV0aW9uSXRlbX0gaW4gdGhlIGZvcm0gb2YgCiAJICogIjxjb21tYW5kSWQ+LjxtYXBwaW5nS2V5PiIgIAogCSAqIChmb3IgZXhhbXBsZSAib3JnLmVjbGlwc2UuanB0LmNvcmUudWkucGVyc2lzdGVudFR5cGVNYXBBcy5lbnRpdHkiKQogCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRlQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW1JZChNYXBwaW5nVWlQcm92aWRlcjw/PiBtYXBwaW5nVWlQcm92aWRlcikgewotCQlyZXR1cm4gY29tbWFuZElkKCkgKyAiLiIgKyBtYXBwaW5nVWlQcm92aWRlci5nZXRNYXBwaW5nS2V5KCk7CisJcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVDb21tYW5kQ29udHJpYnV0aW9uSXRlbUlkKE1hcHBpbmdVaURlZmluaXRpb248Pz4gbWFwcGluZ1VpRGVmaW5pdGlvbikgeworCQlyZXR1cm4gZ2V0Q29tbWFuZElkKCkgKyAiLiIgKyBtYXBwaW5nVWlEZWZpbml0aW9uLmdldEtleSgpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21lbnVzL1BlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWVudXMvUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29udHJpYnV0aW9uLmphdmEKaW5kZXggODk0N2Y5Yi4uNDVkMGJjMSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWVudXMvUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29udHJpYnV0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWVudXMvUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29udHJpYnV0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsMjIgKzEwLDI0IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tZW51czsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuY29tbWFuZHMuUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5tZW51cy5Db21tYW5kQ29udHJpYnV0aW9uSXRlbVBhcmFtZXRlcjsKIAogLyoqCiAgKiBUaGlzIG1lbnUgY29udHJpYnV0aW9uIGlzIHJlc3BvbnNpYmxlIHRvIHBvcHVsYXRlIHRoZSBNYXAgQXMgbWVudSB3aXRoIHRoZQogICogcmVnaXN0ZXJlZCBhdHRyaWJ1dGUgbWFwcGluZyB0eXBlcyBkZWZpbmVkIGluIHRoZSA8Y29kZT5KcHRQbGF0Zm9ybVVpPC9jb2RlPgogICogZm9yIDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGU8L2NvZGU+IG9iamVjdHMuCiAgKgorICogQHNlZSBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyCiAgKiBAc2VlIFBlcnNpc3RlbnRBdHRyaWJ1dGUKICAqCi0gKiBAdmVyc2lvbiAyLjAKKyAqIEB2ZXJzaW9uIDIuMgogICogQHNpbmNlIDIuMAogICovCiBwdWJsaWMgY2xhc3MgUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29udHJpYnV0aW9uIGV4dGVuZHMgTWFwQXNDb250cmlidXRpb24KQEAgLTM3LDMzICszOSw0NyBAQAogCQlzdXBlcigpOwogCX0KIAotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgY29tbWFuZElkKCkgeworCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tbWFuZElkKCkgewogCQlyZXR1cm4gUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzSGFuZGxlci5DT01NQU5EX0lEOwogCX0KIAkKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1hbmRQYXJhbWV0ZXJJZCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXIuQ09NTUFORF9QQVJBTUVURVJfSUQ7CisJcHJvdGVjdGVkIFN0cmluZyBnZXRDb21tYW5kUGFyYW1ldGVySWQoKSB7CisJCXJldHVybiBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyLlNQRUNJRklFRF9NQVBQSU5HX0NPTU1BTkRfUEFSQU1FVEVSX0lEOwogCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLworCQogCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpUHJvdmlkZXI8Pz4+IAotCQkJbWFwcGluZ1VpUHJvdmlkZXJzKEpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSwgSnBhU3RydWN0dXJlTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiBqcGFQbGF0Zm9ybVVpLmphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKKwlwcm90ZWN0ZWQgQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW1QYXJhbWV0ZXIgY3JlYXRlUGFyYW1ldGVyKE1hcHBpbmdVaURlZmluaXRpb248Pz4gbWFwcGluZ1VpUHJvdmlkZXIpIHsKKwkJQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW1QYXJhbWV0ZXIgcGFyYW1ldGVyID0gc3VwZXIuY3JlYXRlUGFyYW1ldGVyKG1hcHBpbmdVaVByb3ZpZGVyKTsKKwkJU3RyaW5nIGRlZmF1bHRLZXkgPSBudWxsOworCQlpZiAobWFwcGluZ1VpUHJvdmlkZXIgaW5zdGFuY2VvZiBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjw/PikgeworCQkJZGVmYXVsdEtleSA9ICgoRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248Pz4pIG1hcHBpbmdVaVByb3ZpZGVyKS5nZXREZWZhdWx0S2V5KCk7CiAJCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiBqcGFQbGF0Zm9ybVVpLm9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQorCQlwYXJhbWV0ZXIucGFyYW1ldGVycy5wdXQoUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzSGFuZGxlci5ERUZBVUxUX01BUFBJTkdfQ09NTUFORF9QQVJBTUVURVJfSUQsIGRlZmF1bHRLZXkpOworCQlyZXR1cm4gcGFyYW1ldGVyOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248Pz4+IG1hcHBpbmdVaURlZmluaXRpb25zKAorCQkJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpLCBKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7CisJCQorCQlyZXR1cm4ganBhUGxhdGZvcm1VaS5hdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucyhyZXNvdXJjZVR5cGUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248Pz4gZ2V0RGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb24oCisJCQlKcGFQbGF0Zm9ybVVpIGpwYVBsYXRmb3JtVWksIEpwYVN0cnVjdHVyZU5vZGUgbm9kZSkgeworCQkKKwkJcmV0dXJuIGdldERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uKAorCQkJCWpwYVBsYXRmb3JtVWksIAorCQkJCSgoUGVyc2lzdGVudEF0dHJpYnV0ZSkgbm9kZSkuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSwgCisJCQkJbm9kZS5nZXRSZXNvdXJjZVR5cGUoKSk7CisJfQorCQorCXByb3RlY3RlZCBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjw/PiBnZXREZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbigKKwkJCUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSwgU3RyaW5nIGRlZmF1bHRNYXBwaW5nS2V5LCBKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7CisJCQorCQlyZXR1cm4ganBhUGxhdGZvcm1VaS5nZXREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbihyZXNvdXJjZVR5cGUsIGRlZmF1bHRNYXBwaW5nS2V5KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tZW51cy9QZXJzaXN0ZW50VHlwZU1hcEFzQ29udHJpYnV0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tZW51cy9QZXJzaXN0ZW50VHlwZU1hcEFzQ29udHJpYnV0aW9uLmphdmEKaW5kZXggMTgzYTlhMi4uODBmZTg2NCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWVudXMvUGVyc2lzdGVudFR5cGVNYXBBc0NvbnRyaWJ1dGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21lbnVzL1BlcnNpc3RlbnRUeXBlTWFwQXNDb250cmlidXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCwxMyArMTAsMTQgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1lbnVzOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5EZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5jb21tYW5kcy5QZXJzaXN0ZW50VHlwZU1hcEFzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKIAogLyoqCiAgKiBUaGlzIG1lbnUgY29udHJpYnV0aW9uIGlzIHJlc3BvbnNpYmxlIHRvIHBvcHVsYXRlIHRoZSBNYXAgQXMgbWVudSB3aXRoIHRoZQpAQCAtMjYsOSArMjcsNiBAQAogICogQHNlZSBKcGFQbGF0Zm9ybQogICogQHNlZSBKcGFQbGF0Zm9ybVVpCiAgKiBAc2VlIFBlcnNpc3RlbnRUeXBlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50VHlwZU1hcEFzQ29udHJpYnV0aW9uIGV4dGVuZHMgTWFwQXNDb250cmlidXRpb24KIHsKQEAgLTM5LDI3ICszNywyOCBAQAogCQlzdXBlcigpOwogCX0KIAkKKwkKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1hbmRJZCgpIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbW1hbmRJZCgpIHsKIAkJcmV0dXJuIFBlcnNpc3RlbnRUeXBlTWFwQXNIYW5kbGVyLkNPTU1BTkRfSUQ7CiAJfQogCQogCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgY29tbWFuZFBhcmFtZXRlcklkKCkgeworCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tbWFuZFBhcmFtZXRlcklkKCkgewogCQlyZXR1cm4gUGVyc2lzdGVudFR5cGVNYXBBc0hhbmRsZXIuQ09NTUFORF9QQVJBTUVURVJfSUQ7CiAJfQotCisJCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlQcm92aWRlcjw/Pj4gCi0JCQltYXBwaW5nVWlQcm92aWRlcnMoSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpLCBKcGFTdHJ1Y3R1cmVOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCXJldHVybiBqcGFQbGF0Zm9ybVVpLmphdmFUeXBlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE9ybVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlyZXR1cm4ganBhUGxhdGZvcm1VaS5vcm1UeXBlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9CisJcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPD8+PiBtYXBwaW5nVWlEZWZpbml0aW9ucygKKwkJCUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSwgSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgeworCQkKKwkJcmV0dXJuIGpwYVBsYXRmb3JtVWkudHlwZU1hcHBpbmdVaURlZmluaXRpb25zKHJlc291cmNlVHlwZSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjw/PiBnZXREZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbigKKwkJCUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSwgSnBhU3RydWN0dXJlTm9kZSBub2RlKSB7CisJCQorCQlyZXR1cm4ganBhUGxhdGZvcm1VaS5nZXREZWZhdWx0VHlwZU1hcHBpbmdVaURlZmluaXRpb24obm9kZS5nZXRSZXNvdXJjZVR5cGUoKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDdkODg3MzYuLjNjYWJhNGQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAorICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAogICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKQEAgLTEwOCw3ICsxMDgsNyBAQAogCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewogCQkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKIAkJCQlpZiAoanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCUpwYVBsYXRmb3JtVWkgcGxhdGZvcm1VaSA9IEpwdFVpUGx1Z2luLmdldFBsdWdpbigpLmpwYVBsYXRmb3JtVWkoanBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpKTsKKwkJCQkJSnBhUGxhdGZvcm1VaSBwbGF0Zm9ybVVpID0gSnB0VWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybVVpKGpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKSk7CiAJCQkJCQogCQkJCQlyZXR1cm4gcGxhdGZvcm1VaSAhPSBudWxsOwogCQkJCX0JCkBAIC0xMjksMTAgKzEyOSwxMCBAQAogCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewogCQkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKIAkJCQlpZiAoanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCUpwYVBsYXRmb3JtVWkgcGxhdGZvcm1VaSA9IEpwdFVpUGx1Z2luLmdldFBsdWdpbigpLmpwYVBsYXRmb3JtVWkoanBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpKTsKKwkJCQkJSnBhUGxhdGZvcm1VaSBwbGF0Zm9ybVVpID0gSnB0VWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybVVpKGpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKSk7CiAJCQkJCQogCQkJCQlpZiAocGxhdGZvcm1VaSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0KCl9OworCQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7anBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKX07CiAJCQkJCX0KIAkJCQl9CQogCQkJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmluZGV4IDZjZDFiMTguLjk1ZWZmMGUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTQsNiArMTQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7CkBAIC02Myw3ICs2NCw3IEBACiAJCWlmIChkZWxlZ2F0ZXMuY29udGFpbnNLZXkocGxhdGZvcm1JZCkpIHsKIAkJCXJldHVybiBkZWxlZ2F0ZXMuZ2V0KHBsYXRmb3JtSWQpOwogCQl9Ci0JCUpwYU5hdmlnYXRvclByb3ZpZGVyIG5hdmlnYXRvclByb3ZpZGVyID0gSnBhTmF2aWdhdG9yUHJvdmlkZXJMb29rdXAucHJvdmlkZXIocGxhdGZvcm0uZ2V0SWQoKSk7CisJCUpwYU5hdmlnYXRvclByb3ZpZGVyIG5hdmlnYXRvclByb3ZpZGVyID0gSnB0VWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRKcGFOYXZpZ2F0b3JQcm92aWRlcihwbGF0Zm9ybSk7CiAJCUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBkZWxlZ2F0ZSA9IG51bGw7CiAJCWlmIChuYXZpZ2F0b3JQcm92aWRlciAhPSBudWxsKSB7CiAJCQlkZWxlZ2F0ZSA9IG5hdmlnYXRvclByb3ZpZGVyLmdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JMYWJlbFByb3ZpZGVyLmphdmEKaW5kZXggNGQ5MmJhOS4uZDhmNDRlYSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yTGFiZWxQcm92aWRlci5qYXZhCkBAIC00NCw2ICs0NCw3IEBACiAJCiAJLy8gKioqKioqKioqKioqKioqKiBJQmFzZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKgogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKIAkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKIAkJCWRlbGVnYXRlLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKQEAgLTUxLDYgKzUyLDcgQEAKIAkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CiAJCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKIAkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKQEAgLTU4LDYgKzYwLDcgQEAKIAkJfQogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewogCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewogCQkJcmV0dXJuIGRlbGVnYXRlLmlzTGFiZWxQcm9wZXJ0eShlbGVtZW50LCBwcm9wZXJ0eSk7CkBAIC02Niw2ICs2OSw3IEBACiAJCXJldHVybiBzdXBlci5pc0xhYmVsUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewogCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewogCQkJZGVsZWdhdGUuZGlzcG9zZSgpOwpAQCAtNzYsNiArODAsNyBAQAogCQogCS8vICoqKioqKioqKioqKioqKiogSUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKIAkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKIAkJCXJldHVybiBkZWxlZ2F0ZS5nZXRJbWFnZShlbGVtZW50KTsKQEAgLTg0LDYgKzg5LDcgQEAKIAkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKIAkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKIAkJCXJldHVybiBkZWxlZ2F0ZS5nZXRUZXh0KGVsZW1lbnQpOwpAQCAtOTYsOCArMTAyLDExIEBACiAJLy8gKioqKioqKioqKioqKioqKiBJRGVzY3JpcHRpb25Qcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKgogCQogCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IGVsZW1lbnQpIHsKLQkJLy8gbm8gb3AgLSBkZWZlciB0byBnZXRUZXh0KGVsZW1lbnQpCi0JCXJldHVybiBnZXRUZXh0KGVsZW1lbnQpOworCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgeworCQkJcmV0dXJuIGRlbGVnYXRlLmdldERlc2NyaXB0aW9uKGVsZW1lbnQpOworCQl9CisJCQorCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKIAl9CiAJCiAJCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yUHJvdmlkZXJMb29rdXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JQcm92aWRlckxvb2t1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzlhMDI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JQcm92aWRlckxvb2t1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtVWlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgb25seSBwcm92aWRlZCB0byBtaW5pbWl6ZSBvYmplY3QgY29uc3RydWN0aW9uLiAgT25seSBvbmUKLSAqIHtAbGluayBKcGFOYXZpZ2F0b3JQcm92aWRlcn0gaXMgcmVxdWlyZWQgdG8gYmUgY29uc3RydWN0ZWQgZm9yIGVhY2ggcGxhdGZvcm0gVUkuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFOYXZpZ2F0b3JQcm92aWRlckxvb2t1cAotewotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEpwYU5hdmlnYXRvclByb3ZpZGVyPiBwcm92aWRlcnM7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBKcGFOYXZpZ2F0b3JQcm92aWRlciBwcm92aWRlcihTdHJpbmcgcGxhdGZvcm1JZCkgewotCQlpZiAocHJvdmlkZXJzID09IG51bGwpIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSnBhTmF2aWdhdG9yUHJvdmlkZXI+KCk7Ci0JCX0KLQkJaWYgKHByb3ZpZGVycy5jb250YWluc0tleShwbGF0Zm9ybUlkKSkgewotCQkJcmV0dXJuIHByb3ZpZGVycy5nZXQocGxhdGZvcm1JZCk7Ci0JCX0KLQkJSnBhUGxhdGZvcm1VaSBwbGF0Zm9ybSA9IEpwYVBsYXRmb3JtVWlSZWdpc3RyeS5pbnN0YW5jZSgpLmpwYVBsYXRmb3JtKHBsYXRmb3JtSWQpOwotCQlpZiAocGxhdGZvcm0gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSnBhTmF2aWdhdG9yUHJvdmlkZXIgcHJvdmlkZXIgPSBwbGF0Zm9ybS5idWlsZE5hdmlnYXRvclByb3ZpZGVyKCk7Ci0JCXByb3ZpZGVycy5wdXQocGxhdGZvcm1JZCwgcHJvdmlkZXIpOwotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCQotCS8vIHByZXZlbnQgY29uc3RydWN0aW9uCi0JcHJpdmF0ZSBKcGFOYXZpZ2F0b3JQcm92aWRlckxvb2t1cCgpIHsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvclRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvclRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmluZGV4IGQ0ODFiNTYuLjM4NTFmYzIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTQsNiArMTQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVBsYXRmb3JtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7CkBAIC02Myw3ICs2NCw3IEBACiAJCWlmIChkZWxlZ2F0ZXMuY29udGFpbnNLZXkocGxhdGZvcm1JZCkpIHsKIAkJCXJldHVybiBkZWxlZ2F0ZXMuZ2V0KHBsYXRmb3JtSWQpOwogCQl9Ci0JCUpwYU5hdmlnYXRvclByb3ZpZGVyIG5hdmlnYXRvclByb3ZpZGVyID0gSnBhTmF2aWdhdG9yUHJvdmlkZXJMb29rdXAucHJvdmlkZXIocGxhdGZvcm0uZ2V0SWQoKSk7CisJCUpwYU5hdmlnYXRvclByb3ZpZGVyIG5hdmlnYXRvclByb3ZpZGVyID0gSnB0VWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRKcGFOYXZpZ2F0b3JQcm92aWRlcihwbGF0Zm9ybSk7CiAJCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBkZWxlZ2F0ZSA9IG51bGw7CiAJCWlmIChuYXZpZ2F0b3JQcm92aWRlciAhPSBudWxsKSB7CiAJCQlkZWxlZ2F0ZSA9IG5hdmlnYXRvclByb3ZpZGVyLmdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL0pwdFVpT3JtTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9KcHRVaU9ybU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYzkxNDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL0pwdFVpT3JtTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIGxvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IHRoZSBPUk0gd2lkZ2V0cy4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnB0VWlPcm1NZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY2Nlc3NUeXBlQ29tcG9zaXRlX2FjY2VzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY2Nlc3NUeXBlQ29tcG9zaXRlX2ZpZWxkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjY2Vzc1R5cGVDb21wb3NpdGVfcHJvcGVydHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm9vbGVhbl9GYWxzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX1RydWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9hY2Nlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfZmllbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9wYWNrYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfcHJvcGVydHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9zY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NQYWdlX2NhdGFsb2dEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzUGFnZV9jYXRhbG9nTm9EZWZhdWx0U3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzUGFnZV9zY2hlbWFEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzUGFnZV9zY2hlbWFOb0RlZmF1bHRTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRTZXF1ZW5jZUdlbmVyYXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2FkZFNlcXVlbmNlR2VuZXJhdG9yRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRTZXF1ZW5jZUdlbmVyYXRvckRlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRTZXF1ZW5jZUdlbmVyYXRvclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUdlbmVyYXRvcnNDb21wb3NpdGVfYWRkVGFibGVHZW5lcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRUYWJsZUdlbmVyYXRvckRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUdlbmVyYXRvcnNDb21wb3NpdGVfYWRkVGFibGVHZW5lcmF0b3JEZXNjcmlwdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUdlbmVyYXRvcnNDb21wb3NpdGVfYWRkVGFibGVHZW5lcmF0b3JUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2Rpc3BsYXlTdHJpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZWRpdFNlcXVlbmNlR2VuZXJhdG9yRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0U2VxdWVuY2VHZW5lcmF0b3JEZXNjcmlwdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZWRpdFNlcXVlbmNlR2VuZXJhdG9yVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0VGFibGVHZW5lcmF0b3JEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXRUYWJsZUdlbmVyYXRvckRlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0VGFibGVHZW5lcmF0b3JUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2dyb3VwQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUdlbmVyYXRvcnNDb21wb3NpdGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtSmF2YUF0dHJpYnV0ZUNob29zZXJfamF2YUF0dHJpYnV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1KYXZhQ2xhc3NDaG9vc2VyX2phdmFDbGFzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlX21ldGFkYXRhQ29tcGxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZV9tZXRhZGF0YUNvbXBsZXRlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtUXVlcmllc0NvbXBvc2l0ZV9ncm91cEJveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NlcXVlbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3ZhbHVlQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2FjY2VzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9jYXNjYWRlUGVyc2lzdENoZWNrQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2NhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfZmllbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfcGVyc2lzdGVuY2VVbml0U2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9wcm9wZXJ0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9zY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb25fY2F0YWxvZ0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uX3NjaGVtYURlZmF1bHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKCJqcHRfdWlfb3JtIiwgSnB0VWlPcm1NZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVaU9ybU1lc3NhZ2VzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvQWNjZXNzVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvQWNjZXNzVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODQ0YmU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL0FjY2Vzc1R5cGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uSnB0VWlPcm1NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBBY2Nlc3MgVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgWG1sVHlwZU1hcHBpbmcKLSAqIEBzZWUgT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWNjZXNzVHlwZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8T3JtVHlwZU1hcHBpbmc+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWNjZXNzVHlwZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQWNjZXNzVHlwZUNvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1UeXBlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8T3JtVHlwZU1hcHBpbmcsIEFjY2Vzc1R5cGU+IGJ1aWxkQWNjZXNzVHlwZUNvbWJvVmlld2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8T3JtVHlwZU1hcHBpbmcsIEFjY2Vzc1R5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKE9ybVR5cGVNYXBwaW5nLkRFRkFVTFRfQUNDRVNTX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChPcm1UeXBlTWFwcGluZy5TUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzVHlwZVtdIGNob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEFjY2Vzc1R5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdEFjY2VzcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJSnB0VWlPcm1NZXNzYWdlcy5jbGFzcywKLQkJCQkJQWNjZXNzVHlwZUNvbXBvc2l0ZS50aGlzLAotCQkJCQl2YWx1ZQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZEFjY2Vzcyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJRW51bUZvcm1Db21ib1ZpZXdlcjxPcm1UeXBlTWFwcGluZywgQWNjZXNzVHlwZT4gY29tYm9WaWV3ZXIgPQotCQkJYnVpbGRBY2Nlc3NUeXBlQ29tYm9WaWV3ZXIoY29udGFpbmVyKTsKLQotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLkFjY2Vzc1R5cGVDb21wb3NpdGVfYWNjZXNzLAotCQkJY29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpCi0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY5MWNhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RKcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLkpwdFVpT3JtTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFhtbFBhY2thZ2VDaG9vc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgU2NoZW1hOiAgICAgIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ2F0YWxvZzogICAgIHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQWNjZXNzIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1RdWVyaWVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHlNYXBwaW5ncwotICogQHNlZSBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQ2F0YWxvZ0NvbWJvCi0gKiBAc2VlIEVudW1Gb3JtQ29tYm9WaWV3ZXIKLSAqIEBzZWUgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZQotICogQHNlZSBPcm1QYWNrYWdlQ2hvb3NlcgotICogQHNlZSBPcm1RdWVyaWVzQ29tcG9zaXRlCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlCi0gKiBAc2VlIFNjaGVtYUNvbWJvCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIGV4dGVuZHMgQWJzdHJhY3RKcGFEZXRhaWxzUGFnZTxFbnRpdHlNYXBwaW5ncz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlhtbEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEVudGl0eU1hcHBpbmdzLCBBY2Nlc3NUeXBlPiBidWlsZEFjY2Vzc1R5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEVudGl0eU1hcHBpbmdzLCBBY2Nlc3NUeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnRpdHlNYXBwaW5ncy5ERUZBVUxUX0FDQ0VTU19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5TWFwcGluZ3MuU1BFQ0lGSUVEX0FDQ0VTU19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc1R5cGVbXSBjaG9pY2VzKCkgewotCQkJCXJldHVybiBBY2Nlc3NUeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRBY2Nlc3MoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoQWNjZXNzVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUpwdFVpT3JtTWVzc2FnZXMuY2xhc3MsCi0JCQkJCUVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UudGhpcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0QWNjZXNzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQWNjZXNzVHlwZSB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRBY2Nlc3ModmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2F0YWxvZ0NvbWJvPEVudGl0eU1hcHBpbmdzPiBidWlsZENhdGFsb2dDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDYXRhbG9nQ29tYm88RW50aXR5TWFwcGluZ3M+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eU1hcHBpbmdzLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5TWFwcGluZ3MuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZENhdGFsb2coKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YT4gYnVpbGRQZXJzaXN0ZW50VW5pdE1ldGFkYUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlNYXBwaW5ncywgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgdHJhbnNmb3JtXyhFbnRpdHlNYXBwaW5ncyB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2NoZW1hQ29tYm88RW50aXR5TWFwcGluZ3M+IGJ1aWxkU2NoZW1hQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgU2NoZW1hQ29tYm88RW50aXR5TWFwcGluZ3M+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eU1hcHBpbmdzLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnRpdHlNYXBwaW5ncy5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkU2NoZW1hKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gUGFja2FnZSB3aWRnZXRzCi0JCW5ldyBPcm1QYWNrYWdlQ2hvb3Nlcih0aGlzLCBjb250YWluZXIpOwotCi0JCS8vIFNjaGVtYSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9zY2hlbWEsCi0JCQlidWlsZFNjaGVtYUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX1NDSEVNQQotCQkpOwotCi0JCS8vIENhdGFsb2cgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLkVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfY2F0YWxvZywKLQkJCWJ1aWxkQ2F0YWxvZ0NvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX0NBVEFMT0cKLQkJKTsKLQotCQkvLyBBY2Nlc3MgVHlwZSB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9hY2Nlc3MsCi0JCQlidWlsZEFjY2Vzc1R5cGVDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9BQ0NFU1MKLQkJKTsKLQotCQkvLyBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhIHdpZGdldHMKLQkJbmV3IFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWJ1aWxkUGVyc2lzdGVudFVuaXRNZXRhZGFIb2xkZXIoKSwKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDUpCi0JCSk7Ci0KLQkJLy8gR2VuZXJhdG9ycyBwYW5lCi0JCW5ldyBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDUpCi0JCSk7Ci0KLQkJLy8gUXVlcmllcyBwYW5lCi0JCW5ldyBPcm1RdWVyaWVzQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDUpCi0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybURldGFpbHNQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtRGV0YWlsc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NTZlN2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1TdHJ1Y3R1cmVOb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSB7QGxpbmsgSnBhRGV0YWlsc1BhZ2V9Ci0gKiB3aGVuIHRoZSBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIHRoZSBYTUwgZmlsZSAoZWl0aGVyIGZyb20gdGhlIHBlcnNpc3RlbmNlCi0gKiBjb25maWd1cmF0aW9uIG9yIGZyb20gdGhlIE1hcHBpbmdzIERlc2NyaXB0b3IpLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtRGV0YWlsc1Byb3ZpZGVyCi0JaW1wbGVtZW50cyBKcGFEZXRhaWxzUHJvdmlkZXIKLXsKLQlwdWJsaWMgT3JtRGV0YWlsc1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gYnVpbGREZXRhaWxzUGFnZSgKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJT2JqZWN0IGNvbnRlbnROb2RlSWQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCWlmIChjb250ZW50Tm9kZUlkID09IE9ybVN0cnVjdHVyZU5vZGVzLkVOVElUWV9NQVBQSU5HU19JRCkgewotCQkJcmV0dXJuIG5ldyBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JCX0KLQotCQlpZiAoY29udGVudE5vZGVJZCA9PSBPcm1TdHJ1Y3R1cmVOb2Rlcy5QRVJTSVNURU5UX1RZUEVfSUQpIHsKLQkJCXJldHVybiBuZXcgT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZShwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCQl9Ci0KLQkJaWYgKGNvbnRlbnROb2RlSWQgPT0gT3JtU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSUQpIHsKLQkJCXJldHVybiBuZXcgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtRW50aXR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1FbnRpdHlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0ZGYxOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1FbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBPUk0gZW50aXR5LgotICoKLSAqIEBzZWUgT3JtRW50aXR5Ci0gKiBAc2VlIEJhc2VKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqIEBzZWUgT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FbnRpdHlDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTxPcm1FbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1FbnRpdHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5Pcm1FbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRW50aXR5Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkSW5oZXJpdGFuY2VDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtSW5oZXJpdGFuY2VDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtRW50aXR5VWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtRW50aXR5VWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDZlOWVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUVudGl0eVVpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVudGl0eVVpUHJvdmlkZXIgaW1wbGVtZW50cyBUeXBlTWFwcGluZ1VpUHJvdmlkZXI8T3JtRW50aXR5PgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVudGl0eVVpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtRW50aXR5VWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBUeXBlTWFwcGluZ1VpUHJvdmlkZXI8T3JtRW50aXR5PiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgT3JtRW50aXR5VWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRUeXBlUGFnZV9FbnRpdHlMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JUeXBlTWFwcGluZyhnZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyBKcGFDb21wb3NpdGU8T3JtRW50aXR5PiBidWlsZFBlcnNpc3RlbnRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJSnBhVWlGYWN0b3J5IGZhY3RvcnksCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZU9ybUVudGl0eUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUdlbmVyYXRvcnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUdlbmVyYXRvcnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhYTQ0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uSnB0VWlPcm1NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sU3dpdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLk5ld05hbWVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuTmV3TmFtZURpYWxvZ0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBUaGlzIHBhbmUgc2hvd3MgdGhlIGxpc3Qgb2YgbmFtZWQgcXVlcmllcyBhbmQgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUgb3IgT3JtVGFibGVHZW5lcmF0b3JDb21wb3NpdGUgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3MKLSAqIEBzZWUgT3JtR2VuZXJhdG9yCi0gKiBAc2VlIE9ybVNlcXVlbmNlR2VuZXJhdG9yCi0gKiBAc2VlIE9ybVRhYmxlR2VuZXJhdG9yCi0gKiBAc2VlIEVudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIE9ybVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlCi0gKiBAc2VlIE9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPEVudGl0eU1hcHBpbmdzPgotewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yPiBnZW5lcmF0b3JIb2xkZXI7Ci0JcHJpdmF0ZSBPcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSBzZXF1ZW5jZUdlbmVyYXRvclBhbmU7Ci0JcHJpdmF0ZSBPcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSB0YWJsZUdlbmVyYXRvclBhbmU7Ci0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHlNYXBwaW5ncz4gbGlzdFBhbmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybUdlbmVyYXRvcnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybUdlbmVyYXRvcnNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBFbnRpdHlNYXBwaW5ncz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU2VxdWVuY2VHZW5lcmF0b3IoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCU5ld05hbWVEaWFsb2dCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTmV3TmFtZURpYWxvZ0J1aWxkZXIoc2hlbGwoKSk7Ci0JCWJ1aWxkZXIuc2V0RGlhbG9nVGl0bGUoSnB0VWlPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2FkZFNlcXVlbmNlR2VuZXJhdG9yVGl0bGUpOwotCQlidWlsZGVyLnNldERlc2NyaXB0aW9uKEpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRTZXF1ZW5jZUdlbmVyYXRvckRlc2NyaXB0aW9uKTsKLQkJYnVpbGRlci5zZXREZXNjcmlwdGlvblRpdGxlKEpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRTZXF1ZW5jZUdlbmVyYXRvckRlc2NyaXB0aW9uVGl0bGUpOwotCQlidWlsZGVyLnNldExhYmVsVGV4dChKcHRVaU9ybU1lc3NhZ2VzLk9ybUdlbmVyYXRvcnNDb21wb3NpdGVfbGFiZWwpOwotCQlidWlsZGVyLnNldEV4aXN0aW5nTmFtZXMoc2VxdWVuY2VHZW5lcmF0b3JOYW1lcygpKTsKLQotCQlOZXdOYW1lRGlhbG9nIGRpYWxvZyA9IGJ1aWxkZXIuYnVpbGREaWFsb2coKTsKLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGROZXdTZXF1ZW5jZUdlbmVyYXRvclBvc3RFeGVjdXRpb24obGlzdFNlbGVjdGlvbk1vZGVsKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRhYmxlR2VuZXJhdG9yKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlOZXdOYW1lRGlhbG9nQnVpbGRlciBidWlsZGVyID0gbmV3IE5ld05hbWVEaWFsb2dCdWlsZGVyKHNoZWxsKCkpOwotCQlidWlsZGVyLnNldERpYWxvZ1RpdGxlKEpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRUYWJsZUdlbmVyYXRvclRpdGxlKTsKLQkJYnVpbGRlci5zZXREZXNjcmlwdGlvbihKcHRVaU9ybU1lc3NhZ2VzLk9ybUdlbmVyYXRvcnNDb21wb3NpdGVfYWRkVGFibGVHZW5lcmF0b3JEZXNjcmlwdGlvbik7Ci0JCWJ1aWxkZXIuc2V0RGVzY3JpcHRpb25UaXRsZShKcHRVaU9ybU1lc3NhZ2VzLk9ybUdlbmVyYXRvcnNDb21wb3NpdGVfYWRkVGFibGVHZW5lcmF0b3JEZXNjcmlwdGlvblRpdGxlKTsKLQkJYnVpbGRlci5zZXRMYWJlbFRleHQoSnB0VWlPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2xhYmVsKTsKLQkJYnVpbGRlci5zZXRFeGlzdGluZ05hbWVzKHRhYmxlR2VuZXJhdG9yTmFtZXMoKSk7Ci0KLQkJTmV3TmFtZURpYWxvZyBkaWFsb2cgPSBidWlsZGVyLmJ1aWxkRGlhbG9nKCk7Ci0JCWRpYWxvZy5vcGVuRGlhbG9nKGJ1aWxkTmV3VGFibGVHZW5lcmF0b3JQb3N0RXhlY3V0aW9uKGxpc3RTZWxlY3Rpb25Nb2RlbCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yPiBidWlsZERpc3BsYXlhYmxlR2VuZXJhdG9yTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8T3JtR2VuZXJhdG9yPigKLQkJCWJ1aWxkR2VuZXJhdG9yc0xpc3RIb2xkZXIoKSwKLQkJCUdlbmVyYXRvci5OQU1FX1BST1BFUlRZCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPE5ld05hbWVEaWFsb2c+IGJ1aWxkRWRpdEdlbmVyYXRvclBvc3RFeGVjdXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxOZXdOYW1lRGlhbG9nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoTmV3TmFtZURpYWxvZyBkaWFsb2cpIHsKLQkJCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQkJCU9ybUdlbmVyYXRvciBnZW5lcmF0b3IgPSBnZW5lcmF0b3JIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJCQkJZ2VuZXJhdG9yLnNldE5hbWUoZGlhbG9nLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZEdlbmVyYXRvckFkYXB0ZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBhZGRCdXR0b25UZXh0KCkgewotCQkJCXJldHVybiBKcHRVaU9ybU1lc3NhZ2VzLk9ybUdlbmVyYXRvcnNDb21wb3NpdGVfYWRkU2VxdWVuY2VHZW5lcmF0b3I7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZFNlcXVlbmNlR2VuZXJhdG9yKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b24oKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG9wdGlvbk9uU2VsZWN0aW9uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQllZGl0R2VuZXJhdG9yKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIE9ybVNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCQkJCQlzdWJqZWN0KCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKE9ybVNlcXVlbmNlR2VuZXJhdG9yKSBpdGVtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXN1YmplY3QoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigoT3JtVGFibGVHZW5lcmF0b3IpIGl0ZW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yPiBidWlsZEdlbmVyYXRvckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yPigpOwotCX0KLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRHZW5lcmF0b3JMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCU9ybUdlbmVyYXRvciBnZW5lcmF0b3IgPSAoT3JtR2VuZXJhdG9yKSBlbGVtZW50OwotCQkJCVN0cmluZyBuYW1lID0gZ2VuZXJhdG9yLmdldE5hbWUoKTsKLQotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJaW50IGluZGV4ID0gLTE7Ci0KLQkJCQkJaWYgKGdlbmVyYXRvciBpbnN0YW5jZW9mIE9ybVNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCQkJCQlpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKHN1YmplY3QoKS5zZXF1ZW5jZUdlbmVyYXRvcnMoKSwgZ2VuZXJhdG9yKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2Yoc3ViamVjdCgpLnRhYmxlR2VuZXJhdG9ycygpLCBnZW5lcmF0b3IpOwotCQkJCQl9Ci0KLQkJCQkJbmFtZSA9IE5MUy5iaW5kKEpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9kaXNwbGF5U3RyaW5nLCBpbmRleCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxPcm1HZW5lcmF0b3I+IGJ1aWxkR2VuZXJhdG9yc0xpc3RIb2xkZXIoKSB7Ci0JCUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUdlbmVyYXRvcj4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1HZW5lcmF0b3I+PigpOwotCQlsaXN0LmFkZChidWlsZFNlcXVlbmNlR2VuZXJhdG9yTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGRUYWJsZUdlbmVyYXRvckxpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUdlbmVyYXRvcj4sIE9ybUdlbmVyYXRvcj4obGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPE5ld05hbWVEaWFsb2c+IGJ1aWxkTmV3U2VxdWVuY2VHZW5lcmF0b3JQb3N0RXhlY3V0aW9uKGZpbmFsIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPE5ld05hbWVEaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShOZXdOYW1lRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJT3JtU2VxdWVuY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gc3ViamVjdCgpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKHN1YmplY3QoKS5zZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkpOwotCQkJCQlnZW5lcmF0b3Iuc2V0TmFtZShkaWFsb2cuZ2V0TmFtZSgpKTsKLQkJCQkJZ2VuZXJhdG9ySG9sZGVyLnNldFZhbHVlKGdlbmVyYXRvcik7Ci0JCQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGdlbmVyYXRvcik7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGROZXdUYWJsZUdlbmVyYXRvckFjdGlvbihmaW5hbCBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgc2VsZWN0aW9uTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlhZGRUYWJsZUdlbmVyYXRvcihzZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPE5ld05hbWVEaWFsb2c+IGJ1aWxkTmV3VGFibGVHZW5lcmF0b3JQb3N0RXhlY3V0aW9uKGZpbmFsIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBQb3N0RXhlY3V0aW9uPE5ld05hbWVEaWFsb2c+KCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShOZXdOYW1lRGlhbG9nIGRpYWxvZykgewotCQkJCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCQkJT3JtVGFibGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gc3ViamVjdCgpLmFkZFRhYmxlR2VuZXJhdG9yKHN1YmplY3QoKS50YWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCQkJCQlnZW5lcmF0b3Iuc2V0TmFtZShkaWFsb2cuZ2V0TmFtZSgpKTsKLQkJCQkJZ2VuZXJhdG9ySG9sZGVyLnNldFZhbHVlKGdlbmVyYXRvcik7Ci0JCQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGdlbmVyYXRvcik7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5TWFwcGluZ3MsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRW50aXR5TWFwcGluZ3MgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlICE9IG51bGwpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8T3JtR2VuZXJhdG9yLCBDb250cm9sPiBidWlsZFBhbmVUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxPcm1HZW5lcmF0b3IsIENvbnRyb2w+KCkgewotCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKE9ybUdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQotCQkJCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAoZ2VuZXJhdG9yIGluc3RhbmNlb2YgT3JtU2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJCQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yUGFuZS5nZXRDb250cm9sKCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yUGFuZS5nZXRDb250cm9sKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yLCBPcm1TZXF1ZW5jZUdlbmVyYXRvcj4oZ2VuZXJhdG9ySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcm1TZXF1ZW5jZUdlbmVyYXRvciB0cmFuc2Zvcm1fKE9ybUdlbmVyYXRvciB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBPcm1TZXF1ZW5jZUdlbmVyYXRvcikgPyAoT3JtU2VxdWVuY2VHZW5lcmF0b3IpIHZhbHVlIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE9ybVNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9yTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFbnRpdHlNYXBwaW5ncywgT3JtU2VxdWVuY2VHZW5lcmF0b3I+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJRW50aXR5TWFwcGluZ3MuU0VRVUVOQ0VfR0VORVJBVE9SU19MSVNUKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc2VxdWVuY2VHZW5lcmF0b3JzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yLCBPcm1UYWJsZUdlbmVyYXRvcj4oZ2VuZXJhdG9ySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcm1UYWJsZUdlbmVyYXRvciB0cmFuc2Zvcm1fKE9ybUdlbmVyYXRvciB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBPcm1UYWJsZUdlbmVyYXRvcikgPyAoT3JtVGFibGVHZW5lcmF0b3IpIHZhbHVlIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE9ybVRhYmxlR2VuZXJhdG9yPiBidWlsZFRhYmxlR2VuZXJhdG9yTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFbnRpdHlNYXBwaW5ncywgT3JtVGFibGVHZW5lcmF0b3I+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJRW50aXR5TWFwcGluZ3MuVEFCTEVfR0VORVJBVE9SU19MSVNUKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtVGFibGVHZW5lcmF0b3I+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudGFibGVHZW5lcmF0b3JzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC50YWJsZUdlbmVyYXRvcnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRHZW5lcmF0b3IoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCU9ybUdlbmVyYXRvciBnZW5lcmF0b3IgPSBnZW5lcmF0b3JIb2xkZXIuZ2V0VmFsdWUoKTsKLQotCQlOZXdOYW1lRGlhbG9nQnVpbGRlciBidWlsZGVyID0gbmV3IE5ld05hbWVEaWFsb2dCdWlsZGVyKHNoZWxsKCkpOwotCQlidWlsZGVyLnNldExhYmVsVGV4dChKcHRVaU9ybU1lc3NhZ2VzLk9ybUdlbmVyYXRvcnNDb21wb3NpdGVfbGFiZWwpOwotCQlidWlsZGVyLnNldE5hbWUoZ2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0KLQkJaWYgKGdlbmVyYXRvciBpbnN0YW5jZW9mIE9ybVNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCQlidWlsZGVyLnNldERpYWxvZ1RpdGxlKEpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0U2VxdWVuY2VHZW5lcmF0b3JUaXRsZSk7Ci0JCQlidWlsZGVyLnNldERlc2NyaXB0aW9uKEpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0U2VxdWVuY2VHZW5lcmF0b3JEZXNjcmlwdGlvbik7Ci0JCQlidWlsZGVyLnNldERlc2NyaXB0aW9uVGl0bGUoSnB0VWlPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXRTZXF1ZW5jZUdlbmVyYXRvckRlc2NyaXB0aW9uVGl0bGUpOwotCQkJYnVpbGRlci5zZXRFeGlzdGluZ05hbWVzKHNlcXVlbmNlR2VuZXJhdG9yTmFtZXMoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlidWlsZGVyLnNldERpYWxvZ1RpdGxlKEpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0VGFibGVHZW5lcmF0b3JUaXRsZSk7Ci0JCQlidWlsZGVyLnNldERlc2NyaXB0aW9uKEpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9lZGl0VGFibGVHZW5lcmF0b3JEZXNjcmlwdGlvbik7Ci0JCQlidWlsZGVyLnNldERlc2NyaXB0aW9uVGl0bGUoSnB0VWlPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2VkaXRUYWJsZUdlbmVyYXRvckRlc2NyaXB0aW9uVGl0bGUpOwotCQkJYnVpbGRlci5zZXRFeGlzdGluZ05hbWVzKHRhYmxlR2VuZXJhdG9yTmFtZXMoKSk7Ci0JCX0KLQotCQlOZXdOYW1lRGlhbG9nIGRpYWxvZyA9IGJ1aWxkZXIuYnVpbGREaWFsb2coKTsKLQkJZGlhbG9nLm9wZW5EaWFsb2coYnVpbGRFZGl0R2VuZXJhdG9yUG9zdEV4ZWN1dGlvbigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCWdlbmVyYXRvckhvbGRlciA9IGJ1aWxkR2VuZXJhdG9ySG9sZGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLk9ybUdlbmVyYXRvcnNDb21wb3NpdGVfZ3JvdXBCb3gKLQkJKTsKLQotCQkvLyBMaXN0IHBhbmUKLQkJbGlzdFBhbmUgPSBidWlsZExpc3RQYW5lKGNvbnRhaW5lcik7Ci0JCWluc3RhbGxQYW5lRW5hYmxlcigpOwotCi0JCS8vIFByb3BlcnR5IHBhbmUKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvckhvbGRlciA9Ci0JCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyKCk7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1UYWJsZUdlbmVyYXRvcj4gdGFibGVHZW5lcmF0b3JIb2xkZXIgPQotCQkJYnVpbGRUYWJsZUdlbmVyYXRvckhvbGRlcigpOwotCi0JCVBhZ2VCb29rIHBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3IgcHJvcGVydHkgcGFuZQotCQlzZXF1ZW5jZUdlbmVyYXRvclBhbmUgPSBuZXcgT3JtU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJc2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIsCi0JCQlwYWdlQm9vawotCQkpOwotCi0JCS8vIFRhYmxlIEdlbmVyYXRvciBwcm9wZXJ0eSBwYW5lCi0JCXRhYmxlR2VuZXJhdG9yUGFuZSA9IG5ldyBPcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQl0YWJsZUdlbmVyYXRvckhvbGRlciwKLQkJCXBhZ2VCb29rCi0JCSk7Ci0KLQkJYWRkQWxpZ25SaWdodChzZXF1ZW5jZUdlbmVyYXRvclBhbmUpOwotCQlhZGRBbGlnblJpZ2h0KHRhYmxlR2VuZXJhdG9yUGFuZSk7Ci0JCWluc3RhbGxQYW5lU3dpdGNoZXIocGFnZUJvb2spOwotCX0KLQotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5TWFwcGluZ3M+IGJ1aWxkTGlzdFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5TWFwcGluZ3M+KAotCQkJdGhpcywKLQkJCWNvbnRhaW5lciwKLQkJCWJ1aWxkR2VuZXJhdG9yQWRhcHRlcigpLAotCQkJYnVpbGREaXNwbGF5YWJsZUdlbmVyYXRvckxpc3RIb2xkZXIoKSwKLQkJCWdlbmVyYXRvckhvbGRlciwKLQkJCWJ1aWxkR2VuZXJhdG9yTGFiZWxQcm92aWRlcigpCi0JCSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRDdXN0b21CdXR0b25BZnRlckFkZEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCQkJQnV0dG9uIGJ1dHRvbiA9IGJ1aWxkQnV0dG9uKAotCQkJCQljb250YWluZXIsCi0JCQkJCUpwdFVpT3JtTWVzc2FnZXMuT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9hZGRUYWJsZUdlbmVyYXRvciwKLQkJCQkJaGVscElkLAotCQkJCQlidWlsZE5ld1RhYmxlR2VuZXJhdG9yQWN0aW9uKGdldFNlbGVjdGlvbk1vZGVsKCkpCi0JCQkJKTsKLQotCQkJCWFkZEFsaWduUmlnaHQoYnV0dG9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKCkgewotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQlidWlsZFBhbmVFbmFibGVySG9sZGVyKCksCi0JCQlsaXN0UGFuZQotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZVN3aXRjaGVyKFBhZ2VCb29rIHBhZ2VCb29rKSB7Ci0JCW5ldyBDb250cm9sU3dpdGNoZXIoZ2VuZXJhdG9ySG9sZGVyLCBidWlsZFBhbmVUcmFuc2Zvcm1lcigpLCBwYWdlQm9vayk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IHNlcXVlbmNlR2VuZXJhdG9yTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxPcm1TZXF1ZW5jZUdlbmVyYXRvciwgU3RyaW5nPihzdWJqZWN0KCkuc2VxdWVuY2VHZW5lcmF0b3JzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oT3JtU2VxdWVuY2VHZW5lcmF0b3IgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gdGFibGVHZW5lcmF0b3JOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE9ybVRhYmxlR2VuZXJhdG9yLCBTdHJpbmc+KHN1YmplY3QoKS50YWJsZUdlbmVyYXRvcnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShPcm1UYWJsZUdlbmVyYXRvciBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1Jbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2FiZmFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgamF2YSBpbmhlcml0YW5jZS4KLSAqCi0gKiBAc2VlIE9ybUVudGl0eQotICogQHNlZSBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybUluaGVyaXRhbmNlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZTxPcm1FbnRpdHk+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtSW5oZXJpdGFuY2VDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybUluaGVyaXRhbmNlQ29tcG9zaXRlKEFic3RyYWN0UGFuZTxPcm1FbnRpdHk+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtSW5oZXJpdGFuY2VDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5Pcm1FbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtSW5oZXJpdGFuY2VDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtSmF2YUF0dHJpYnV0ZUNob29zZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUphdmFBdHRyaWJ1dGVDaG9vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNGIzMmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtSmF2YUF0dHJpYnV0ZUNob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uSnB0VWlPcm1NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQHNlZSBPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtSmF2YUF0dHJpYnV0ZUNob29zZXIgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPE9ybUF0dHJpYnV0ZU1hcHBpbmc+Ci17Ci0JcHJpdmF0ZSBUZXh0IHRleHQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlhtbEphdmFBdHRyaWJ1dGVDaG9vc2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcm1KYXZhQXR0cmlidXRlQ2hvb3NlcihBYnN0cmFjdEZvcm1QYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1BdHRyaWJ1dGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1BdHRyaWJ1dGVNYXBwaW5nLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgT3JtQXR0cmlidXRlTWFwcGluZy5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAoc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKLQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQotCQlpZiAoIXRleHQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0ZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0ZXh0ID0gYnVpbGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuT3JtSmF2YUF0dHJpYnV0ZUNob29zZXJfamF2YUF0dHJpYnV0ZSwKLQkJCWJ1aWxkTmFtZUhvbGRlcigpCi0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUphdmFDbGFzc0Nob29zZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybUphdmFDbGFzc0Nob29zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkZWM3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1KYXZhQ2xhc3NDaG9vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uSnB0VWlPcm1NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdEZvcm1QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgQ2xhc3NDaG9vc2VyUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBUT0RPIHBvc3NpYmx5IGhlbHAgdGhlIHVzZXIgYW5kIGlmIHRoZXkgaGF2ZSBjaG9zZW4gYSBwYWNrYWdlIGF0IHRoZQotICogZW50aXR5LW1hcHBpbmdzIGxldmVsIG9ubHkgaW5zZXJ0IHRoZSBjbGFzcyBuYW1lIGluIHRoZSB4bWwgZmlsZSBpZiB0aGV5Ci0gKiBjaG9vc2UgYSBjbGFzcyBmcm9tIHRoZSBwYWNrYWdlLgotICogTm90IHN1cmUgaWYgdGhpcyBzaG91bGQgYmUgZHJpdmVuIGJ5IHRoZSBVSSBvciBieSB1aSBhcGkgaW4gdGhlIG1vZGVsCi0gKgotICogQHNlZSBPcm1UeXBlTWFwcGluZwotICogQHNlZSBPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQ2xhc3NDaG9vc2VyUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtSmF2YUNsYXNzQ2hvb3NlciBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8T3JtVHlwZU1hcHBpbmc+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+WG1sSmF2YUNsYXNzQ2hvb3NlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybUphdmFDbGFzc0Nob29zZXIoQWJzdHJhY3RGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtVHlwZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5YbWxKYXZhQ2xhc3NDaG9vc2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUphdmFDbGFzc0Nob29zZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1UeXBlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxPcm1UeXBlTWFwcGluZz4gaW5pdGlhbGl6ZUNsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPE9ybVR5cGVNYXBwaW5nPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtVHlwZU1hcHBpbmcsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBPcm1UeXBlTWFwcGluZy5DTEFTU19QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmdldENsYXNzXygpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJCXN1YmplY3Quc2V0Q2xhc3ModmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldENsYXNzXygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgbGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBKcHRVaU9ybU1lc3NhZ2VzLk9ybUphdmFDbGFzc0Nob29zZXJfamF2YUNsYXNzOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJCQlJSmF2YVByb2plY3Qgcm9vdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiByb290LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvbXB0VHlwZSgpIHsKLQkJCQlJVHlwZSB0eXBlID0gY2hvb3NlVHlwZSgpOwotCi0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKTsKLQkJCQkJc3ViamVjdCgpLnNldENsYXNzKGNsYXNzTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVBhY2thZ2VDaG9vc2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1QYWNrYWdlQ2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWI1NTVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVBhY2thZ2VDaG9vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5KcHRVaU9ybU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFja2FnZUNob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgUGFja2FnZUNob29zZXJQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBQYWNrYWdlQ2hvb3NlclBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybVBhY2thZ2VDaG9vc2VyIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxFbnRpdHlNYXBwaW5ncz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlhtbFBhY2thZ2VDaG9vc2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtUGFja2FnZUNob29zZXIoQWJzdHJhY3RGb3JtUGFuZTw/IGV4dGVuZHMgRW50aXR5TWFwcGluZ3M+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWluaXRpYWxpemVQYWNrYWdlQ2hvb3NlclBhbmUoY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDaG9vc2VyUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJbmV3IFBhY2thZ2VDaG9vc2VyUGFuZTxFbnRpdHlNYXBwaW5ncz4odGhpcywgY29udGFpbmVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHlNYXBwaW5ncywgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eU1hcHBpbmdzLlBBQ0tBR0VfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQYWNrYWdlKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQkJc3ViamVjdC5zZXRQYWNrYWdlKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBsYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpT3JtTWVzc2FnZXMuRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9wYWNrYWdlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJCQlJSmF2YVByb2plY3Qgcm9vdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiByb290LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdlTmFtZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFBhY2thZ2UoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRQYWNrYWdlKCkgewotCQkJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gY2hvb3NlUGFja2FnZSgpOwotCi0JCQkJaWYgKHBhY2thZ2VGcmFnbWVudCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCQkJCQlzdWJqZWN0KCkuc2V0UGFja2FnZShwYWNrYWdlTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWJjOTA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRldGFpbHMgcGFnZSB1c2VkIGZvciB0aGUgWE1MIHBlcnNpc3RlbnQKLSAqIGF0dHJpYnV0ZS4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBdHRyaWJ1dGUgbWFwcGluZyBwYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPcm1QZXJzaXN0ZW50QXR0cmlidXRlCi0gKiBAc2VlIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UgZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlyZXR1cm4ganBhUGxhdGZvcm1VaSgpLm9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnNGb3IoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCS8vYnVnIDE5MjAzNSAtIG5vIGRlZmF1bHQgbWFwcGluZyBvcHRpb24gaW4geG1sCi0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuYXJyYXkoYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCksIG5ldyBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcltDb2xsZWN0aW9uVG9vbHMuc2l6ZShhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKSldKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gIXZhbHVlLmlzVmlydHVhbCgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjxBdHRyaWJ1dGVNYXBwaW5nPiBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIoU3RyaW5nIGtleSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlhtbCBhdHRyaWJ1dGVNYXBwaW5ncyBzaG91bGQgbm90IGJlIGRlZmF1bHQiKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlyZXR1cm4ganBhUGxhdGZvcm1VaSgpLmRlZmF1bHRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1BdHRyaWJ1dGVNYXBwaW5nPiBnZXRNYXBwaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybUF0dHJpYnV0ZU1hcHBpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZyB0cmFuc2Zvcm1fKFBlcnNpc3RlbnRBdHRyaWJ1dGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKE9ybUF0dHJpYnV0ZU1hcHBpbmcpIHZhbHVlLmdldE1hcHBpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlBcnJheUxpc3Q8QWJzdHJhY3RQYW5lPD8+PiBwYW5lcyA9IG5ldyBBcnJheUxpc3Q8QWJzdHJhY3RQYW5lPD8+PigyKTsKLQotCQkvLyBNYXAgQXMgY29tcG9zaXRlCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZSBtYXBBc1BhbmUgPSBuZXcgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWJ1aWxkU3ViUGFuZShjb250YWluZXIsIDAsIDAsIDUsIDApCi0JCSk7Ci0KLQkJcGFuZXMuYWRkKG1hcEFzUGFuZSk7Ci0KLQkJLy8gRW50aXR5IHR5cGUgd2lkZ2V0cwotCQlPcm1KYXZhQXR0cmlidXRlQ2hvb3NlciBqYXZhQXR0cmlidXRlUGFuZSA9Ci0JCQluZXcgT3JtSmF2YUF0dHJpYnV0ZUNob29zZXIodGhpcywgZ2V0TWFwcGluZ0hvbGRlcigpLCBjb250YWluZXIpOwotCi0JCXBhbmVzLmFkZChqYXZhQXR0cmlidXRlUGFuZSk7Ci0KLQkJLy8gTWFwcGluZyBwcm9wZXJ0aWVzIHBhbmUKLQkJUGFnZUJvb2sgYXR0cmlidXRlUGFuZSA9IGJ1aWxkTWFwcGluZ1BhZ2VCb29rKGNvbnRhaW5lcik7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCAgICAgICAgID0gU1dULlRPUDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlICAgPSB0cnVlOwotCi0JCWF0dHJpYnV0ZVBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJaW5zdGFsbFBhbmVFbmFibGVyKHBhbmVzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKEFycmF5TGlzdDxBYnN0cmFjdFBhbmU8Pz4+IHBhbmVzKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcihidWlsZFBhbmVFbmFibGVySG9sZGVyKCksIHBhbmVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBtYXBwaW5nUGFnZUNoYW5nZWQoSnBhQ29tcG9zaXRlPEF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdDb21wb3NpdGUpIHsKLQkJaWYgKG1hcHBpbmdDb21wb3NpdGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOwotCi0JCWlmIChzdWJqZWN0KCkgIT0gbnVsbCAmJiBzdWJqZWN0KCkuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotCQkJZW5hYmxlZCA9ICFzdWJqZWN0KCkuaXNWaXJ0dWFsKCk7Ci0JCX0KLQotCQltYXBwaW5nQ29tcG9zaXRlLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5ZmFmMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuT3JtUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLkpwdFVpT3JtTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGV0YWlscyBwYWdlIHVzZWQgZm9yIHRoZSBYTUwgcGVyc2lzdGVudAotICogYXR0cmlidXRlLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1KYXZhQ2xhc3NDaG9vc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9ybVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgWCBNZXRhZGF0YSBDb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtSmF2YUNsYXNzQ2hvb3NlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUeXBlIG1hcHBpbmcgcGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPcm1QZXJzaXN0ZW50VHlwZQotICogQHNlZSBPcm1KYXZhQ2xhc3NDaG9vc2VyCi0gKiBAc2VlIEFjY2Vzc1R5cGVDb21wb3NpdGUKLSAqIEBzZWUgT3JtUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZSBleHRlbmRzIFBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2U8T3JtUGVyc2lzdGVudFR5cGU+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVR5cGVNYXBwaW5nPiBidWlsZE1hcHBpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybVBlcnNpc3RlbnRUeXBlLCAgT3JtVHlwZU1hcHBpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVudFR5cGUuTUFQUElOR19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0TWFwcGluZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRNZXRhZGF0YUNvbXBsZXRlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1UeXBlTWFwcGluZywgQm9vbGVhbj4oCi0JCQlidWlsZE1hcHBpbmdIb2xkZXIoKSwKLQkJCU9ybVR5cGVNYXBwaW5nLkRFRkFVTFRfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFksCi0JCQlPcm1UeXBlTWFwcGluZy5TUEVDSUZJRURfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2UoQm9vbGVhbi5UUlVFLCBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRNZXRhZGF0YUNvbXBsZXRlU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZE1ldGFkYXRhQ29tcGxldGVIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQotCQkJCWlmICgoc3ViamVjdCgpICE9IG51bGwpICYmICh2YWx1ZSA9PSBudWxsKSkgewotCi0JCQkJCWJvb2xlYW4gZGVmYXVsdFZhbHVlID0gc3ViamVjdCgpLmdldE1hcHBpbmcoKS5pc0RlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSBkZWZhdWx0VmFsdWUgPyBKcHRVaU9ybU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6Ci0JCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnB0VWlPcm1NZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCi0JCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCUpwdFVpT3JtTWVzc2FnZXMuT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZV9tZXRhZGF0YUNvbXBsZXRlV2l0aERlZmF1bHQsCi0JCQkJCQlkZWZhdWx0U3RyaW5nVmFsdWUKLQkJCQkJKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gSnB0VWlPcm1NZXNzYWdlcy5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlX21ldGFkYXRhQ29tcGxldGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gVHlwZSBNYXBwaW5nIHdpZGdldHMKLQkJbmV3IE9ybVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMCwgNSwgMCkKLQkJKTsKLQotCQkvLyBKYXZhIGNsYXNzIHdpZGdldHMKLQkJbmV3IE9ybUphdmFDbGFzc0Nob29zZXIodGhpcywgYnVpbGRNYXBwaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0KLQkJLy8gQWNjZXNzIHdpZGdldHMKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRNYXBwaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0KLQkJLy8gTWV0YWRhdGEgY29tcGxldGUgd2lkZ2V0cwotCQlidWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZV9tZXRhZGF0YUNvbXBsZXRlLAotCQkJYnVpbGRNZXRhZGF0YUNvbXBsZXRlSG9sZGVyKCksCi0JCQlidWlsZE1ldGFkYXRhQ29tcGxldGVTdHJpbmdIb2xkZXIoKQotCQkpOwotCi0JCS8vIFR5cGUgbWFwcGluZyBwYW5lCi0JCVBhZ2VCb29rIHR5cGVNYXBwaW5nUGFnZUJvb2sgPSBidWlsZFR5cGVNYXBwaW5nUGFnZUJvb2soY29udGFpbmVyKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ICAgICAgICAgPSBTV1QuVE9QOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgICA9IHRydWU7Ci0KLQkJdHlwZU1hcHBpbmdQYWdlQm9vay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmF0b3I8VHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IHR5cGVNYXBwaW5nVWlQcm92aWRlcnMoKSB7Ci0JCXJldHVybiBqcGFQbGF0Zm9ybVVpKCkub3JtVHlwZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmU0OGMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQHNlZSBPcm1FbnRpdHkKLSAqIEBzZWUgT3JtSW5oZXJpdGFuY2VDb21wb3NpdGUgLSBUaGUgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU8T3JtRW50aXR5PgotewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8T3JtRW50aXR5LCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlPcm1FbnRpdHkuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJCX0KLS8vVE9ETyBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSB3aGVuIEkgY2FuIGNoYW5nZSB0aGUgQVBJCi0vLwkJCUBPdmVycmlkZQotLy8JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotLy8JCQkJcmV0dXJuIHN1YmplY3QuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLS8vCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzd2l0Y2hEZWZhdWx0VG9TcGVjaWZpZWQoKSB7Ci0JCUxpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZGVmYXVsdEpvaW5Db2x1bW5zID0gc3ViamVjdCgpLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQotCQlpbnQgaW5kZXggPSAwOwotCQl3aGlsZSAoZGVmYXVsdEpvaW5Db2x1bW5zLmhhc05leHQoKSkgewotCQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBkZWZhdWx0Sm9pbkNvbHVtbnMubmV4dCgpOwotCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCi0JCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSBzdWJqZWN0KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgrKyk7Ci0JCQlwa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShjb2x1bW5OYW1lKTsKLQkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCX0KLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtUXVlcmllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtUXVlcmllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTVlNjQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVF1ZXJpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwub3JtLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5RdWVyaWVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uSnB0VWlPcm1NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBRdWVyaWVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHlNYXBwaW5ncwotICogQHNlZSBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgUXVlcmllc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtUXVlcmllc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxFbnRpdHlNYXBwaW5ncz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1RdWVyaWVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcm1RdWVyaWVzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgRW50aXR5TWFwcGluZ3M+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlNYXBwaW5ncywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShFbnRpdHlNYXBwaW5ncyB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgIT0gbnVsbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRDb2xsYXBzYWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLk9ybVF1ZXJpZXNDb21wb3NpdGVfZ3JvdXBCb3gKLQkJKTsKLQotCQlRdWVyaWVzQ29tcG9zaXRlIHF1ZXJpZXNDb21wb3NpdGUgPSBuZXcgUXVlcmllc0NvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQljb250YWluZXIKLQkJKTsKLQotCQlpbnN0YWxsUGFuZUVuYWJsZXIocXVlcmllc0NvbXBvc2l0ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lRW5hYmxlcihRdWVyaWVzQ29tcG9zaXRlIHF1ZXJpZXNDb21wb3NpdGUpIHsKLQkJbmV3IFBhbmVFbmFibGVyKAotCQkJYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpLAotCQkJcXVlcmllc0NvbXBvc2l0ZQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNjlkNTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvb3JtL2RldGFpbHMvT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkFic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLlByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuU2Vjb25kYXJ5VGFibGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE9ybUVudGl0eQotICogQHNlZSBPcm1FbnRpdHlDb21wb3NpdGUgLSBUaGUgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBBZGRSZW1vdmVMaXN0UGFuZQotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTxPcm1FbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShBYnN0cmFjdEZvcm1QYW5lPD8gZXh0ZW5kcyBPcm1FbnRpdHk+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZpbmVJblhtbEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZpbmVJblhtbEhvbGRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtU2Vjb25kYXJ5VGFibGU+IGJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdEhvbGRlcigpIHsKLQkJTGlzdDxMaXN0VmFsdWVNb2RlbDxPcm1TZWNvbmRhcnlUYWJsZT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPE9ybVNlY29uZGFyeVRhYmxlPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZFZpcnR1YWxTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPE9ybVNlY29uZGFyeVRhYmxlPiwgT3JtU2Vjb25kYXJ5VGFibGU+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtU2Vjb25kYXJ5VGFibGU+IGJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxPcm1TZWNvbmRhcnlUYWJsZT4oYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCksCi0JCQlUYWJsZS5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxPcm1TZWNvbmRhcnlUYWJsZT4gYnVpbGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9ybUVudGl0eSwgT3JtU2Vjb25kYXJ5VGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE9ybVNlY29uZGFyeVRhYmxlPiBidWlsZFZpcnR1YWxTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9ybUVudGl0eSwgT3JtU2Vjb25kYXJ5VGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSwgT3JtRW50aXR5LlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudmlydHVhbFNlY29uZGFyeVRhYmxlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudmlydHVhbFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBncm91cEJveE1hcmdpbigpOwotCi0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZUhvbGRlciA9Ci0JCQlidWlsZFNlY29uZGFyeVRhYmxlSG9sZGVyKCk7Ci0KLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZGVmaW5lSW5YbWxIb2xkZXIgPQotCQkJYnVpbGREZWZpbmVJblhtbEhvbGRlcigpOwotCi0JCS8vIE92ZXJyaWRlIERlZmluZSBJbiBYTUwgY2hlY2sgYm94Ci0JCWJ1aWxkQ2hlY2tCb3goCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiksCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX2RlZmluZUluWG1sLAotCQkJZGVmaW5lSW5YbWxIb2xkZXIKLQkJKTsKLQotCQkvLyBTZWNvbmRhcnkgVGFibGVzIGFkZC9yZW1vdmUgbGlzdCBwYW5lCi0JCUFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eT4gbGlzdFBhbmUgPSBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PigKLQkJCXRoaXMsCi0JCQlidWlsZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4pLAotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZXNBZGFwdGVyKCksCi0JCQlidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RNb2RlbCgpLAotCQkJc2Vjb25kYXJ5VGFibGVIb2xkZXIsCi0JCQlidWlsZFNlY29uZGFyeVRhYmxlTGFiZWxQcm92aWRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMvL1RPRE8gbmVlZCBhIGhlbHAgY29udGV4dCBpZCBmb3IgdGhpcwotCQkpOwotCi0JCWluc3RhbGxMaXN0UGFuZUVuYWJsZXIoZGVmaW5lSW5YbWxIb2xkZXIsIGxpc3RQYW5lKTsKLQotCQkvLyBQcmltYXJ5IEtleSBKb2luIENvbHVtbnMgcGFuZQotCQluZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlzZWNvbmRhcnlUYWJsZUhvbGRlciwKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsTGlzdFBhbmVFbmFibGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGRlZmluZUluWG1sSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eT4gbGlzdFBhbmUpIHsKLQotCQluZXcgUGFuZUVuYWJsZXIoZGVmaW5lSW5YbWxIb2xkZXIsIGxpc3RQYW5lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU2Vjb25kYXJ5VGFibGVEaWFsb2cgYnVpbGRTZWNvbmRhcnlUYWJsZURpYWxvZ0ZvckFkZCgpIHsKLQkJLy9kZWZhdWx0U2NoZW1hIGFuZCBkZWZhdWx0Q2F0YWxvZyBzaG91bGQgbm90IGJlIHRha2VuIGZyb20gdGhlIFRhYmxlIGluIHRoaXMgY2FzZS4gIFRoZSB0YWJsZSBkZWZhdWx0IHNjaGVtYSBjb3VsZCBiZSB3aGF0IGlzIHRoZSBzcGVjaWZpZWQgc2NoZW1hIG9uIHRoZSBqYXZhIHRhYmxlLgotCQlyZXR1cm4gbmV3IFNlY29uZGFyeVRhYmxlRGlhbG9nKGdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLCBzdWJqZWN0KCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0U2NoZW1hKCksIHN1YmplY3QoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgRGVmaW5lSW5YbWxIb2xkZXIgZXh0ZW5kcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgotCQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHsKLQotCQlwdWJsaWMgRGVmaW5lSW5YbWxIb2xkZXIoKSB7Ci0JCQlzdXBlcihidWlsZFZpcnR1YWxTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQlpZiAoc3ViamVjdCgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCX0KLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2Yoc3ViamVjdCgpLnNlY29uZGFyeVRhYmxlc0RlZmluZWRJblhtbCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJCXN1YmplY3QoKS5zZXRTZWNvbmRhcnlUYWJsZXNEZWZpbmVkSW5YbWwodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGE4NDIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRiLlNlcXVlbmNlQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5KcHRVaU9ybU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBOYW1lOiAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBTZXF1ZW5jZSBHZW5lcmF0b3I6IHwgU2VxdWVuY2VDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgT3JtU2VxdWVuY2VHZW5lcmF0b3IKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3MKLSAqIEBzZWUgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIFNlcXVlbmNlQ29tYm8KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPE9ybVNlcXVlbmNlR2VuZXJhdG9yPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZShBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVNlcXVlbmNlR2VuZXJhdG9yPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkR2VuZXJhdG9yTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtU2VxdWVuY2VHZW5lcmF0b3IsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBPcm1TZXF1ZW5jZUdlbmVyYXRvci5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VxdWVuY2VDb21ibzxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gYnVpbGRTZXF1ZW5jZU5hbWVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBTZXF1ZW5jZUNvbWJvPE9ybVNlcXVlbmNlR2VuZXJhdG9yPih0aGlzLCBwYXJlbnQpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChPcm1TZXF1ZW5jZUdlbmVyYXRvci5ERUZBVUxUX1NFUVVFTkNFX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKE9ybVNlcXVlbmNlR2VuZXJhdG9yLlNQRUNJRklFRF9TRVFVRU5DRV9OQU1FX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNjaGVtYSBzY2hlbWEoKSB7Ci0JCQkJLy8gVE9ETwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBOYW1lIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuT3JtU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfbmFtZSwKLQkJCWJ1aWxkR2VuZXJhdG9yTmFtZUhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1JfTkFNRQotCQkpOwotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuT3JtU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2UsCi0JCQlidWlsZFNlcXVlbmNlTmFtZUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9TRVFVRU5DRQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9Pcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWVhMzAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL09ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuQ29sdW1uQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRiLlRhYmxlQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5KcHRVaU9ybU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBOYW1lOiAgICAgICAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBUYWJsZTogICAgICAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBQcmltYXJ5IEtleSBDb2x1bW46ICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBWYWx1ZSBDb2x1bW46ICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBQcmltYXJ5IEtleSBDb2x1bW4gVmFsdWU6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgT3JtVGFibGVHZW5lcmF0b3IKLSAqIEBzZWUgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxPcm1UYWJsZUdlbmVyYXRvcj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtVGFibGVHZW5lcmF0b3JDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1UYWJsZUdlbmVyYXRvcj4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEdlbmVyYXRvck5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybVRhYmxlR2VuZXJhdG9yLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgR2VuZXJhdG9yLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5Db21ibzxPcm1UYWJsZUdlbmVyYXRvcj4gYnVpbGRQa0NvbHVtbk5hbWVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBDb2x1bW5Db21ibzxPcm1UYWJsZUdlbmVyYXRvcj4odGhpcywgcGFyZW50KSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9QS19DT0xVTU5fTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRQa0NvbHVtbk5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGUgdGFibGUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sdW1uQ29tYm88T3JtVGFibGVHZW5lcmF0b3I+IGJ1aWxkUGtDb2x1bW5WYWx1ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlyZXR1cm4gbmV3IENvbHVtbkNvbWJvPE9ybVRhYmxlR2VuZXJhdG9yPih0aGlzLCBwYXJlbnQpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1BLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1BLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0UGtDb2x1bW5WYWx1ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGUgdGFibGUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlQ29tYm88T3JtVGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVOYW1lQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXJldHVybiBuZXcgVGFibGVDb21ibzxPcm1UYWJsZUdlbmVyYXRvcj4odGhpcywgcGFyZW50KSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9UQUJMRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJCQlpZiAocHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZIAotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWQotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSApIHsKLQkJCQkJcmVwb3B1bGF0ZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hTmFtZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRUYWJsZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlIHRhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0RGJUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXRTcGVjaWZpZWRUYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sdW1uQ29tYm88T3JtVGFibGVHZW5lcmF0b3I+IGJ1aWxkVmFsdWVDb2x1bW5Db21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBDb2x1bW5Db21ibzxPcm1UYWJsZUdlbmVyYXRvcj4odGhpcywgcGFyZW50KSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9WQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1ZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldERlZmF1bHRWYWx1ZUNvbHVtbk5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGUgdGFibGUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlPcm1NZXNzYWdlcy5Pcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9uYW1lLAotCQkJYnVpbGRHZW5lcmF0b3JOYW1lSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9OQU1FCi0JCSk7Ci0KLQkJLy8gVGFibGUgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLk9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlLAotCQkJYnVpbGRUYWJsZU5hbWVDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfVEFCTEUKLQkJKTsKLQotCQkvLyBQcmltYXJ5IEtleSBDb2x1bW4gd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLk9ybVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uLAotCQkJYnVpbGRQa0NvbHVtbk5hbWVDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfUFJJTUFSWV9LRVlfQ09MVU1OCi0JCSk7Ci0KLQkJLy8gVmFsdWUgQ29sdW1uIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlPcm1NZXNzYWdlcy5Pcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV92YWx1ZUNvbHVtbiwKLQkJCWJ1aWxkVmFsdWVDb2x1bW5Db21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfVkFMVUVfQ09MVU1OCi0JCSk7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgQ29sdW1uIFZhbHVlIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlPcm1NZXNzYWdlcy5Pcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlLAotCQkJYnVpbGRQa0NvbHVtblZhbHVlQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1BSSU1BUllfS0VZX0NPTFVNTl9WQUxVRQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9vcm0vZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmQzMzA2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL29ybS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRiLkNhdGFsb2dDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGIuU2NoZW1hQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5KcHRVaU9ybU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIFBlcnNpc3RlbmNlIFVuaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHggWE1MIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgeCBDYXNjYWRlIFBlcnNpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgU2NoZW1hOiAgICAgIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ2F0YWxvZzogICAgIHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQWNjZXNzIFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBDYXRhbG9nQ29tYm8KLSAqIEBzZWUgU2NoZW1hQ29tYm8KLSAqIEBzZWUgRW51bUZvcm1Db21ib1ZpZXdlcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0Rm9ybVBhbmU8UGVyc2lzdGVuY2VVbml0TWV0YWRhdGE+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUoQWJzdHJhY3RGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMsIEFjY2Vzc1R5cGU+IGJ1aWxkQWNjZXNzVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMsIEFjY2Vzc1R5cGU+KHRoaXMsIGJ1aWxkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNIb2xkZXIoKSwgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuQUNDRVNTX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzVHlwZVtdIGNob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEFjY2Vzc1R5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJSnB0VWlPcm1NZXNzYWdlcy5jbGFzcywKLQkJCQkJUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUudGhpcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0QWNjZXNzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQWNjZXNzVHlwZSB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRBY2Nlc3ModmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDYXNjYWRlUGVyc2lzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMsIEJvb2xlYW4+KGJ1aWxkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuQ0FTQ0FERV9QRVJTSVNUX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmlzQ2FzY2FkZVBlcnNpc3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0Q2FzY2FkZVBlcnNpc3QodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2F0YWxvZ0NvbWJvPFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPiBidWlsZENhdGFsb2dDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDYXRhbG9nQ29tYm88UGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+KHRoaXMsIGJ1aWxkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNIb2xkZXIoKSwgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3QoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPiBidWlsZFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLCBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyB0cmFuc2Zvcm1fKFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTY2hlbWFDb21ibzxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cz4gYnVpbGRTY2hlbWFDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBTY2hlbWFDb21ibzxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cz4odGhpcywgYnVpbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlcigpLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJc3ViamVjdCgpLnNldFNwZWNpZmllZFNjaGVtYSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdCgpLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gU2VjdGlvbgotCQljb250YWluZXIgPSBidWlsZENvbGxhcHNhYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpT3JtTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfcGVyc2lzdGVuY2VVbml0U2VjdGlvbgotCQkpOwotCi0JCS8vIFhNTCBtYXBwaW5nIG1ldGFkYXRhIGNvbXBsZXRlIGNoZWNrIGJveAotCQlidWlsZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlPcm1NZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV94bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94LAotCQkJYnVpbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9YTUwKLQkJKTsKLQotCQkvLyBDYXNjYWRlIFBlcnNpc3Qgd2lkZ2V0cwotCQlidWlsZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlPcm1NZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9jYXNjYWRlUGVyc2lzdENoZWNrQm94LAotCQkJYnVpbGRDYXNjYWRlUGVyc2lzdEhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9DQVNDQURFCi0JCSk7Ci0KLQkJLy8gU2NoZW1hIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlPcm1NZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9zY2hlbWEsCi0JCQlidWlsZFNjaGVtYUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX1NDSEVNQQotCQkpOwotCi0JCS8vIENhdGFsb2cgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2NhdGFsb2csCi0JCQlidWlsZENhdGFsb2dDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9DQVRBTE9HCi0JCSk7Ci0KLQkJLy8gQWNjZXNzIFR5cGUgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaU9ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2FjY2VzcywKLQkJCWJ1aWxkQWNjZXNzVHlwZUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX0FDQ0VTUwotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0pwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLmphdmEKaW5kZXggYzM4NmNmYi4uODY3NWIwNCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLmphdmEKQEAgLTEsMjYgKzEsMjkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2U7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwogCiAvKioKLSAqIFRoZSBsb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSB0aGUgcGVyc2lzdGVuY2UgZWRpdG9yLgorICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBwZXJzaXN0ZW5jZSBlZGl0b3IuCiAgKgogICogQHZlcnNpb24gMi4wCiAgKiBAc2luY2UgMi4wCiAgKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcwoteworcHVibGljIGNsYXNzIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcyB7CisKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX0ZhbHNlOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJvb2xlYW5fVHJ1ZTsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZ19qYXJQYXRoSGVscExhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nX2phclBhdGhMYWJlbDsKIAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlRWRpdG9yX3BhZ2VfaGVscDsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZUVkaXRvcl9zb3VyY2VUYWI7CkBAIC00NCwxNCArNDcsMTggQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZV90cmFuc2FjdGlvblR5cGU7CiAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2dlbmVyYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qYXZhQXJjaGl2ZXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qYXJGaWxlczsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9yczsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9yc19kZXNjcmlwdGlvbjsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX21hcHBlZENsYXNzZXM7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9uYW1lOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfcGVyc2lzdGVuY2VQcm92aWRlcjsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2Rlc2NyaXB0aW9uOwotCisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGVfbm9GaWxlTmFtZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfamFyRmlsZURpYWxvZ190aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfamFyRmlsZURpYWxvZ19tZXNzYWdlOworCQogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9tYXBwaW5nRmlsZURpYWxvZ19tZXNzYWdlOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9tYXBwaW5nRmlsZURpYWxvZ190aXRsZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfb3JtTm9OYW1lOwpAQCAtNjEsMTEgKzY4LDE0IEBACiAJcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZV9wcm9wZXJ0aWVzX2Rlc2NyaXB0aW9uOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGVfdmFsdWVDb2x1bW47CiAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X3VpX3BlcnNpc3RlbmNlIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5jbGFzczsKIAlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKCJqcHRfdWlfcGVyc2lzdGVuY2UiLCBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuY2xhc3MpOworCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOwogCX0KIAogCXByaXZhdGUgSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzKCkgewogCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0Fic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9BYnN0cmFjdFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2M4MGQzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9BYnN0cmFjdFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLlBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIGRlZmluaXRpb24gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZSBpdCBpcyBpbml0aWFsaXplZCkuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24KKwlpbXBsZW1lbnRzIFJlc291cmNlVWlEZWZpbml0aW9uLCBQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uCit7CisJCisJCisJcHJpdmF0ZSBmaW5hbCBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBmYWN0b3J5OworCQorCQorCS8qKgorCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uKCkgeworCQlzdXBlcigpOworCQl0aGlzLmZhY3RvcnkgPSBidWlsZFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCk7CisJfQorCQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBidWlsZFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCk7CisJCisJcHVibGljIFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5IGdldEZhY3RvcnkoKSB7CisJCXJldHVybiB0aGlzLmZhY3Rvcnk7CisJfQorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SnBhUGFnZUNvbXBvc2l0ZT4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGVzKFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsIENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQlyZXR1cm4gdGhpcy5mYWN0b3J5LmNyZWF0ZVBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZXMoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0FyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0FyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlOTFjZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YQpAQCAtMCwwICsxLDIyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdyYXBoLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQXJjaGl2ZUZpbGVWaWV3ZXJGaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRleHRGaWVsZE1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZUNvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOworCitwdWJsaWMgY2xhc3MgQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2cgCisJZXh0ZW5kcyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZworeworCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBqYXJQYXRoTW9kZWw7CisJCisJcHJpdmF0ZSBEZXBsb3ltZW50UGF0aENhbGN1bGF0b3IgcGF0aENhbGN1bGF0b3I7CisJCisJCisJcHVibGljIEFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudCkgeworCQl0aGlzKHBhcmVudCwgbmV3IFNpbXBsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcigpKTsKKwl9CisJCisJcHVibGljIEFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudCwgRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yIHBhdGhDYWxjdWxhdG9yKSB7CisJCXN1cGVyKHBhcmVudCwgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKKwkJdGhpcy5wYXRoQ2FsY3VsYXRvciA9IHBhdGhDYWxjdWxhdG9yOworCQlzZXRDb21wYXJhdG9yKG5ldyBSZXNvdXJjZUNvbXBhcmF0b3IoUmVzb3VyY2VDb21wYXJhdG9yLk5BTUUpKTsKKwkJYWRkRmlsdGVyKG5ldyBBcmNoaXZlRmlsZVZpZXdlckZpbHRlcigpKTsKKwkJc2V0VmFsaWRhdG9yKG5ldyBBcmNoaXZlRmlsZVNlbGVjdGlvblZhbGlkYXRvcigpKTsKKwkJdGhpcy5qYXJQYXRoTW9kZWwgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7CisJCQorCQlMYWJlbCBoZWxwTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7CisJCWhlbHBMYWJlbC5zZXRUZXh0KEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5BcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZ19qYXJQYXRoSGVscExhYmVsKTsKKwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZ2Qud2lkdGhIaW50ID0gNDAwOworCQloZWxwTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7CisJCQorCQlDb21wb3NpdGUgc3ViQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJc3ViQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOworCQlzdWJDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCQorCQlMYWJlbCBqYXJQYXRoTGFiZWwgPSBuZXcgTGFiZWwoc3ViQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWphclBhdGhMYWJlbC5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOworCQlqYXJQYXRoTGFiZWwuc2V0VGV4dChKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2dfamFyUGF0aExhYmVsKTsKKwkJCisJCVRleHQgamFyUGF0aFRleHQgPSBuZXcgVGV4dChzdWJDb21wb3NpdGUsIFNXVC5CT1JERVIpOworCQlqYXJQYXRoVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKwkJVGV4dEZpZWxkTW9kZWxBZGFwdGVyLmFkYXB0KGphclBhdGhNb2RlbCwgamFyUGF0aFRleHQpOworCQkKKwkJcmV0dXJuIGNvbXBvc2l0ZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgZG9DcmVhdGVUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgeworCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBzdXBlci5kb0NyZWF0ZVRyZWVWaWV3ZXIocGFyZW50LCBzdHlsZSk7CisJCQorCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKKwkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJCXVwZGF0ZUphclBhdGhNb2RlbChldmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJfQorCQkJfSk7CisJCQorCQlyZXR1cm4gdHJlZVZpZXdlcjsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlSmFyUGF0aE1vZGVsKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCU9iamVjdCBzZWxlY3RlZE9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCWlmIChzZWxlY3RlZE9iaiBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQl0aGlzLmphclBhdGhNb2RlbC5zZXRWYWx1ZShjYWxjdWxhdGVEZXBsb3lQYXRoKChJRmlsZSkgc2VsZWN0ZWRPYmopKTsKKwkJfQorCQllbHNlIHsKKwkJCXRoaXMuamFyUGF0aE1vZGVsLnNldFZhbHVlKCIiKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGNhbGN1bGF0ZURlcGxveVBhdGgoSUZpbGUgYXJjaGl2ZUZpbGUpIHsKKwkJcmV0dXJuIHRoaXMucGF0aENhbGN1bGF0b3IuY2FsY3VsYXRlRGVwbG95bWVudFBhdGgoYXJjaGl2ZUZpbGUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVzdWx0KCkgeworCQlzZXRSZXN1bHQoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh0aGlzLmphclBhdGhNb2RlbC5nZXRWYWx1ZSgpKSk7CisJfQorCQorCQorCXByaXZhdGUgc3RhdGljIGNsYXNzIEFyY2hpdmVGaWxlU2VsZWN0aW9uVmFsaWRhdG9yIAorCQlpbXBsZW1lbnRzIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgCisJeworCQlwdWJsaWMgQXJjaGl2ZUZpbGVTZWxlY3Rpb25WYWxpZGF0b3IoKSB7CisJCQlzdXBlcigpOworCQl9CisJCQorCQkKKwkJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKSB7CisJCQlpbnQgblNlbGVjdGVkPSBzZWxlY3Rpb24ubGVuZ3RoOworCQkJaWYgKG5TZWxlY3RlZCA9PSAwIHx8IChuU2VsZWN0ZWQgPiAxKSkgeworCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJZm9yIChpbnQgaT0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgeworCQkJCU9iamVjdCBjdXJyPSBzZWxlY3Rpb25baV07CisJCQkJaWYgKGN1cnIgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgIC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgIC8vJE5PTi1OTFMtMSQKKwkJfQorCX0JCisJCisJCisJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yCisJeworCQlTdHJpbmcgY2FsY3VsYXRlRGVwbG95bWVudFBhdGgoSUZpbGUgZmlsZSk7CisJfQorCQorCQorCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yCisJCWltcGxlbWVudHMgRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yCisJeworCQlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZURlcGxveW1lbnRQYXRoKElGaWxlIGZpbGUpIHsKKwkJCXJldHVybiBmaWxlLmdldE5hbWUoKTsKKwkJfQorCX0KKwkKKwkKKwlwdWJsaWMgc3RhdGljIGNsYXNzIE1vZHVsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcgorCQlleHRlbmRzIFNpbXBsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcgorCXsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlRGVwbG95bWVudFBhdGgoSUZpbGUgZmlsZSkgeworCQkJLy8gZmlyc3QgbG9vayBmb3IgdmlydHVhbCBjb21wb25lbnQgdGhhdCBtYXRjaGVzIHRoaXMgZmlsZSwgcmV0dXJuaW5nCisJCQkvLyB0aGUgcGF0aCB0byB0aGF0IHZpcnR1YWwgY29tcG9uZW50CisJCQlJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZmlsZS5nZXRQcm9qZWN0KCkpOworCQkJaWYgKHZDb21wb25lbnQgIT0gbnVsbCkgeworCQkJCUlWaXJ0dWFsRm9sZGVyIHZGb2xkZXIgPSB2Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKKwkJCQlJVmlydHVhbEZpbGUgdkZpbGUgPSBmaW5kVmlydHVhbEZpbGUodkZvbGRlciwgZmlsZSk7CisJCQkJaWYgKHZGaWxlICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIGNhbGN1bGF0ZVBlcnNpc3RlbmNlUm9vdFJlbGF0aXZlUGF0aCh2RmlsZSk7CisJCQkJfQorCQkJfQorCQkJCisJCQkvLyB0aGVuIGRlZmF1bHQgdG8gc2ltcGxlIGJlaGF2aW9yCisJCQlyZXR1cm4gc3VwZXIuY2FsY3VsYXRlRGVwbG95bWVudFBhdGgoZmlsZSk7CisJCX0KKwkJCisJCXByb3RlY3RlZCBJVmlydHVhbEZpbGUgZmluZFZpcnR1YWxGaWxlKElWaXJ0dWFsQ29udGFpbmVyIHZDb250YWluZXIsIElGaWxlIHJlYWxGaWxlKSB7CisJCQl0cnkgeyAKKwkJCQlmb3IgKElWaXJ0dWFsUmVzb3VyY2UgdlJlc291cmNlIDogdkNvbnRhaW5lci5tZW1iZXJzKCkpIHsKKwkJCQkJaWYgKHZSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVZpcnR1YWxSZXNvdXJjZS5GSUxFKSB7CisJCQkJCQlJVmlydHVhbEZpbGUgdkZpbGUgPSAoSVZpcnR1YWxGaWxlKSB2UmVzb3VyY2U7CisJCQkJCQlpZiAocmVhbEZpbGUuZXF1YWxzKHZGaWxlLmdldFVuZGVybHlpbmdGaWxlKCkpKSB7CisJCQkJCQkJcmV0dXJuIHZGaWxlOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gZmluZFZpcnR1YWxGaWxlKChJVmlydHVhbENvbnRhaW5lcikgdlJlc291cmNlLCByZWFsRmlsZSk7CisJCQkJCQlpZiAodkZpbGUgIT0gbnVsbCkgeworCQkJCQkJCXJldHVybiB2RmlsZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJSnB0VWlQbHVnaW4ubG9nKGNlKTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJCisJCXByb3RlY3RlZCBTdHJpbmcgY2FsY3VsYXRlUGVyc2lzdGVuY2VSb290UmVsYXRpdmVQYXRoKElWaXJ0dWFsRmlsZSB2RmlsZSkgeworCQkJSVByb2plY3QgcHJvamVjdCA9IHZGaWxlLmdldFByb2plY3QoKTsKKwkJCUlQYXRoIHB1Um9vdFBhdGggPSBKcHRDb3JlUGx1Z2luLmdldEphckRlcGxveW1lbnRSb290UGF0aChwcm9qZWN0KTsKKwkJCQorCQkJSVBhdGggcGF0aCA9IHZGaWxlLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlVG8ocHVSb290UGF0aCk7CisJCQkKKwkJCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxZmNiMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKKyAqIDxwcmU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgLSBHZW5lcmFsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgIE5hbWU6ICAgICAgICAgICAgICAgICB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgIFBlcnNpc3RlbmNlIFByb3ZpZGVyOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgLSBNYXBwZWQgQ2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICB8IFBlcnNpc3RlbmNlVW5pdE1hcHBlZENsYXNzZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAtIFhNTCBNYXBwaW5nIEZpbGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgIHwgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIFBlcnNpc3RlbmNlVW5pdAorICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZQorICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNYXBwZWRDbGFzc2VzQ29tcG9zaXRlCisgKiBAc2VlIFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZQorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKi8KKwlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWluaXRpYWxpemVHZW5lcmFsUGFuZShjb250YWluZXIpOworCQlpbml0aWFsaXplTWFwcGVkQ2xhc3Nlc1BhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZUpQQU1hcHBpbmdEZXNjcmlwdG9yc1BhbmUoY29udGFpbmVyKTsKKwkJaW5pdGlhbGl6ZUphckZpbGVzUGFuZShjb250YWluZXIpOworCX0KKwkKKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKUEFNYXBwaW5nRGVzY3JpcHRvcnNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQljb250YWluZXIgPSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oCisJCQljb250YWluZXIsCisJCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qcGFNYXBwaW5nRGVzY3JpcHRvcnMsCisJCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qcGFNYXBwaW5nRGVzY3JpcHRvcnNfZGVzY3JpcHRpb24KKwkJKTsKKworCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIpOworCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIuZ2V0UGFyZW50KCkpOworCisJCW5ldyBHZW5lcmljUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKYXJGaWxlc1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCWNvbnRhaW5lciA9IGFkZENvbGxhcHNhYmxlU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2phckZpbGVzCisJCSk7CisJCQorCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIpOworCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIuZ2V0UGFyZW50KCkpOworCQkKKwkJbmV3IEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OTU1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUKKwlleHRlbmRzIFBlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlCit7CisJcHVibGljIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZSgKKwkJCVBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwKKwkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9HZW5lcmljUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwYzEwMwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KKyAqCisgKiBAc2VlIFBlcnNpc3RlbmNlVW5pdAorICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKKyAqIEBzZWUgQWRkUmVtb3ZlTGlzdFBhbmUKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUKK3sKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0PiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCWFkZE1hcHBpbmdGaWxlc0xpc3QoY29udGFpbmVyKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9HZW5lcmljUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvR2VuZXJpY1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkMDNlOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvR2VuZXJpY1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5Cit7CisJLy8gKioqKioqKioqKioqKioqKiBwZXJzaXN0ZW5jZSB1bml0IGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQorCXB1YmxpYyBMaXN0SXRlcmF0b3I8SnBhUGFnZUNvbXBvc2l0ZT4gY3JlYXRlUGVyc2lzdGVuY2VVbml0Q29tcG9zaXRlcygKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKKwkJQ29tcG9zaXRlIHBhcmVudCwKKwkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJQXJyYXlMaXN0PEpwYVBhZ2VDb21wb3NpdGU+IHBhZ2VzID0gbmV3IEFycmF5TGlzdDxKcGFQYWdlQ29tcG9zaXRlPigzKTsKKworCQlwYWdlcy5hZGQobmV3IEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOworCQlwYWdlcy5hZGQobmV3IFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7CisJCXBhZ2VzLmFkZChuZXcgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKKworCQlyZXR1cm4gcGFnZXMubGlzdEl0ZXJhdG9yKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZS5qYXZhCmluZGV4IDFlMWU2MWUuLmI4NmFjZDkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTI4LDEyICsyOCwxNCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKQEAgLTc5LDcgKzgxLDcgQEAKICAqIEBzaW5jZSAyLjAKICAqLwogQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UGFuZTxQZXJzaXN0ZW5jZVVuaXQ+CitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8UGVyc2lzdGVuY2VVbml0PgogewogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0TWFwcGVkQ2xhc3Nlc0NvbXBvc2l0ZTwvY29kZT4uCkBAIC04Nyw3ICs4OSw3IEBACiAJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCiAJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgogCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0PiBwYXJlbnRQYW5lLAorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CiAKIAkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKQEAgLTk4LDExICsxMDAsMjUgQEAKIAkJSVR5cGUgdHlwZSA9IGNob29zZVR5cGUoKTsKIAogCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlDbGFzc1JlZiBjbGFzc1JlZiA9IHN1YmplY3QoKS5hZGRTcGVjaWZpZWRDbGFzc1JlZigpOwotCQkJY2xhc3NSZWYuc2V0Q2xhc3NOYW1lKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpOworCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7CisJCQlpZihjbGFzc1JlZkV4aXN0cyhjbGFzc05hbWUpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBnZXRTdWJqZWN0KCkuYWRkU3BlY2lmaWVkQ2xhc3NSZWYoKTsKKwkJCWNsYXNzUmVmLnNldENsYXNzTmFtZShjbGFzc05hbWUpOwogCQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoY2xhc3NSZWYpOwogCQl9CiAJfQorCQorCXByaXZhdGUgYm9vbGVhbiBjbGFzc1JlZkV4aXN0cyhTdHJpbmcgY2xhc3NOYW1lKSB7CisJCWZvciAoIExpc3RJdGVyYXRvcjxDbGFzc1JlZj4gaSA9IGdldFN1YmplY3QoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsgaS5oYXNOZXh0KCk7ICkgeworCQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBpLm5leHQoKTsKKwkJCWlmKCBjbGFzc1JlZi5nZXRDbGFzc05hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CiAKIAlwcml2YXRlIEFkYXB0ZXIgYnVpbGRBZGFwdGVyKCkgewogCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKQEAgLTEzNiw3ICsxNTIsNyBAQAogCiAJCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKIAkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJc3ViamVjdCgpLnJlbW92ZVNwZWNpZmllZENsYXNzUmVmKChDbGFzc1JlZikgaXRlbSk7CisJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVTcGVjaWZpZWRDbGFzc1JlZigoQ2xhc3NSZWYpIGl0ZW0pOwogCQkJCX0KIAkJCX0KIAkJfTsKQEAgLTE0NSw2MSArMTYxLDQ4IEBACiAJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEV4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXNIb2xkZXIoKSB7CiAJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgQm9vbGVhbj4oCiAJCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlQZXJzaXN0ZW5jZVVuaXQuREVGQVVMVF9FWENMVURFX1VOTElTVEVEX0NMQVNTRURfUFJPUEVSVFksCi0JCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX0VYQ0xVREVfVU5MSVNURURfQ0xBU1NFRF9QUk9QRVJUWSkKKwkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTX1BST1BFUlRZKQogCQl7CiAJCQlAT3ZlcnJpZGUKIAkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKTsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3Nlcyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQkJCXN1cGVyLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0Ci0JCQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlICYmIG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KKwkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3Nlcyh2YWx1ZSk7CiAJCQl9CiAJCX07CiAJfQogCiAJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEV4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXNTdHJpbmdIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlc0hvbGRlcigpKSB7Ci0KKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXNIb2xkZXIoKSkgewogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAoKHN1YmplY3QoKSAhPSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQotCQkJCQlCb29sZWFuIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QoKS5nZXREZWZhdWx0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpOwotCi0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFZhbHVlID8gSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6Ci0JCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0KLQkJCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzV2l0aERlZmF1bHQsCi0JCQkJCQkJZGVmYXVsdFN0cmluZ1ZhbHVlCi0JCQkJCQkpOwotCQkJCQl9CisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0VWlEZXRhaWxzTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKKwkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX2V4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXNXaXRoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKIAkJCQl9Ci0KIAkJCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3NlczsKIAkJCX0KIAkJfTsKIAl9Ci0KKwkKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRFeGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIEJvb2xlYW4+KAorCQkJZ2V0U3ViamVjdEhvbGRlcigpLAorCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9FWENMVURFX1VOTElTVEVEX0NMQVNTRVNfUFJPUEVSVFksCisJCQlQZXJzaXN0ZW5jZVVuaXQuREVGQVVMVF9FWENMVURFX1VOTElTVEVEX0NMQVNTRVNfUFJPUEVSVFkpCisJCXsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7CisJCQl9CisJCX07CisJfQogCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewogCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7CiAJCQlAT3ZlcnJpZGUKQEAgLTI0Miw3ICsyNDUsNyBAQAogCX0KIAogCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Q2xhc3NSZWY+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIENsYXNzUmVmPihnZXRTdWJqZWN0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfQ0xBU1NfUkVGX0xJU1QpIHsKKwkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIENsYXNzUmVmPihnZXRTdWJqZWN0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfQ0xBU1NfUkVGU19MSVNUKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGxpc3RJdGVyYXRvcl8oKSB7CiAJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CkBAIC0yODAsNyArMjgzLDcgQEAKIAogCQl0cnkgewogCQkJdHlwZVNlbGVjdGlvbkRpYWxvZyA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKAotCQkJCXNoZWxsKCksCisJCQkJZ2V0U2hlbGwoKSwKIAkJCQlzZXJ2aWNlLAogCQkJCXNjb3BlLAogCQkJCUlKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9DTEFTU0VTLApAQCAtMzA4LDcgKzMxMSw3IEBACiAKIAkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7CiAJCQl0cnkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoY2xhc3NOYW1lKTsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGNsYXNzTmFtZS5yZXBsYWNlKCckJywgJy4nKSk7CiAJCQl9CiAJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCQlKcHRVaVBsdWdpbi5sb2coZSk7CkBAIC0zMjUsNyArMzI4LDcgQEAKIAlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKIAogCQkvLyBEZXNjcmlwdGlvbgotCQlidWlsZE11bHRpTGluZUxhYmVsKAorCQlhZGRNdWx0aUxpbmVMYWJlbCgKIAkJCWNvbnRhaW5lciwKIAkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX2Rlc2NyaXB0aW9uCiAJCSk7CkBAIC0zMzQsMTAgKzMzNywxMSBAQAogCQluZXcgQWRkUmVtb3ZlTGlzdFBhbmU8UGVyc2lzdGVuY2VVbml0PigKIAkJCXRoaXMsCiAJCQljb250YWluZXIsCi0JCQlidWlsZEFkYXB0ZXIoKSwKLQkJCWJ1aWxkSXRlbUxpc3RIb2xkZXIoKSwKLQkJCWJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQorCQkJdGhpcy5idWlsZEFkYXB0ZXIoKSwKKwkJCXRoaXMuYnVpbGRJdGVtTGlzdEhvbGRlcigpLAorCQkJdGhpcy5idWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAorCQkJdGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9HRU5FUkFMCiAJCSkKIAkJewogCQkJQE92ZXJyaWRlCkBAIC0zNTAsMTEgKzM1NCwxMiBAQAogCQkJfQogCQl9OwogCi0JCWJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAorCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKIAkJCWNvbnRhaW5lciwKIAkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX2V4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXMsCiAJCQlidWlsZEV4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXNIb2xkZXIoKSwKLQkJCWJ1aWxkRXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlc1N0cmluZ0hvbGRlcigpCisJCQlidWlsZEV4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXNTdHJpbmdIb2xkZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9HRU5FUkFMCiAJCSk7CiAJfQogCkBAIC0zNzcsNyArMzgyLDcgQEAKIAl9CiAKIAlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKKwkJSVByb2plY3QgcHJvamVjdCA9IGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwogCQlJSmF2YVByb2plY3Qgcm9vdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKIAogCQl0cnkgewpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGUuamF2YQppbmRleCBhYjNkNzAzLi41YmRkNDU4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGUuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RGb3JtUGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtUGFuZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CkBAIC00OSw4ICs0OSw4IEBACiAgKiBAdmVyc2lvbiAyLjAKICAqIEBzaW5jZSAyLjAKICAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1QYW5lPFBlcnNpc3RlbmNlVW5pdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhUGFnZUNvbXBvc2l0ZTxQZXJzaXN0ZW5jZVVuaXQ+CitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZSBleHRlbmRzIEZvcm1QYW5lPFBlcnNpc3RlbmNlVW5pdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhUGFnZUNvbXBvc2l0ZQogewogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZTwvY29kZT4uCkBAIC03MCw3ICs3MCw3IEBACiAJICogKG5vbi1KYXZhZG9jKQogCSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgYnVpbGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgeworCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAogCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwogCQlsYXlvdXQubWFyZ2luSGVpZ2h0ICAgID0gMDsKQEAgLTgxLDcgKzgxLDcgQEAKIAkJbGF5b3V0Lm1hcmdpblJpZ2h0ICAgICA9IDA7CiAJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKIAotCQlDb21wb3NpdGUgY29udGFpbmVyID0gYnVpbGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKKwkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGFkZFBhbmUocGFyZW50LCBsYXlvdXQpOwogCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwogCiAJCXJldHVybiBjb250YWluZXI7CkBAIC05MSwxMiArOTEsMTIgQEAKIAkgKiAobm9uLUphdmFkb2MpCiAJICovCiAJcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9VTklUX0NPTk5FQ1RJT047CisJCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTjsKIAl9CiAKIAlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURhdGFiYXNlUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CiAKLQkJY29udGFpbmVyID0gYnVpbGRTZWN0aW9uKAorCQljb250YWluZXIgPSBhZGRTZWN0aW9uKAogCQkJY29udGFpbmVyLAogCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGVfZGF0YWJhc2UKIAkJKTsKQEAgLTEwNiw3ICsxMDYsNyBAQAogCiAJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVHZW5lcmFsUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CiAKLQkJY29udGFpbmVyID0gYnVpbGRTZWN0aW9uKAorCQljb250YWluZXIgPSBhZGRTZWN0aW9uKAogCQkJY29udGFpbmVyLAogCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGVfZ2VuZXJhbAogCQkpOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlLmphdmEKaW5kZXggM2MzYTNhYS4uZTA1ZDQ3MiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTExLDE0ICsxMSwxNiBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbEVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CiAKIC8qKgpAQCAtMzksNyArNDEsNyBAQAogICogQHZlcnNpb24gMi4wCiAgKiBAc2luY2UgMi4wCiAgKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8UGVyc2lzdGVuY2VVbml0PgorcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8UGVyc2lzdGVuY2VVbml0PgogewogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlPC9jb2RlPi4KQEAgLTQ3LDcgKzQ5LDcgQEAKIAkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKIAkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCiAJICovCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZShBYnN0cmFjdFBhbmU8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGUoUGFuZTxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyKSB7CiAKIAkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKQEAgLTEyNSwyOSArMTI3LDM4IEBACiAJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CiAKIAkJLy8gSlRBIERhdGFzb3VyY2UgTmFtZSB3aWRnZXRzCi0JCVRleHQgdGV4dCA9IGJ1aWxkTGFiZWxlZFRleHQoCisJCUxhYmVsIGxhYmVsID0gYWRkVW5tYW5hZ2VkTGFiZWwoCisJCQljb250YWluZXIsIAorCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZV9qdGFEYXRhc291cmNlTmFtZSk7CisJCVRleHQgdGV4dCA9IGFkZFVubWFuYWdlZFRleHQoCiAJCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlX2p0YURhdGFzb3VyY2VOYW1lLAotCQkJYnVpbGRKVEFEYXRhc291cmNlTmFtZUhvbGRlcigpCisJCQlidWlsZEpUQURhdGFzb3VyY2VOYW1lSG9sZGVyKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgogCQkpOwotCi0JCWluc3RhbGxKVEFEYXRhc291cmNlTmFtZUVuYWJsZXIodGV4dCk7Ci0KKwkJYWRkTGFiZWxlZENvbXBvc2l0ZShjb250YWluZXIsIGxhYmVsLCB0ZXh0LCBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTik7CisJCQorCQlpbnN0YWxsSlRBRGF0YXNvdXJjZU5hbWVFbmFibGVyKHRleHQsIGxhYmVsKTsKKwkJCisJCQogCQkvLyBOb24tSlRBIERhdGFzb3VyY2UgTmFtZSB3aWRnZXRzCi0JCXRleHQgPSBidWlsZExhYmVsZWRUZXh0KAorCQlsYWJlbCA9IGFkZFVubWFuYWdlZExhYmVsKAorCQkJY29udGFpbmVyLCAKKwkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGVfbm9uSnRhRGF0YXNvdXJjZU5hbWUpOworCQl0ZXh0ID0gYWRkVW5tYW5hZ2VkVGV4dCgKIAkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGVfbm9uSnRhRGF0YXNvdXJjZU5hbWUsCi0JCQlidWlsZE5vbkpUQURhdGFzb3VyY2VOYW1lSG9sZGVyKCkKKwkJCWJ1aWxkTm9uSlRBRGF0YXNvdXJjZU5hbWVIb2xkZXIoKSwKKwkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OCiAJCSk7CisJCWFkZExhYmVsZWRDb21wb3NpdGUoY29udGFpbmVyLCBsYWJlbCwgdGV4dCwgSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04pOwogCi0JCWluc3RhbGxOb25KVEFEYXRhc291cmNlTmFtZUVuYWJsZXIodGV4dCk7CisJCWluc3RhbGxOb25KVEFEYXRhc291cmNlTmFtZUVuYWJsZXIodGV4dCwgbGFiZWwpOwogCX0KIAotCXByaXZhdGUgdm9pZCBpbnN0YWxsSlRBRGF0YXNvdXJjZU5hbWVFbmFibGVyKFRleHQgdGV4dCkgewotCQluZXcgQ29udHJvbEVuYWJsZXIoYnVpbGRKVEFEYXRhc291cmNlTmFtZUJvb2xlYW5Ib2xkZXIoKSwgdGV4dCk7CisJcHJpdmF0ZSB2b2lkIGluc3RhbGxKVEFEYXRhc291cmNlTmFtZUVuYWJsZXIoVGV4dCB0ZXh0LCBMYWJlbCBsYWJlbCkgeworCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKGJ1aWxkSlRBRGF0YXNvdXJjZU5hbWVCb29sZWFuSG9sZGVyKCksIHRleHQsIGxhYmVsKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgaW5zdGFsbE5vbkpUQURhdGFzb3VyY2VOYW1lRW5hYmxlcihUZXh0IHRleHQpIHsKLQkJbmV3IENvbnRyb2xFbmFibGVyKGJ1aWxkTm9uSlRBRGF0YXNvdXJjZU5hbWVCb29sZWFuSG9sZGVyKCksIHRleHQpOworCXByaXZhdGUgdm9pZCBpbnN0YWxsTm9uSlRBRGF0YXNvdXJjZU5hbWVFbmFibGVyKFRleHQgdGV4dCwgTGFiZWwgbGFiZWwpIHsKKwkJU1dUVG9vbHMuY29udHJvbEVuYWJsZWRTdGF0ZShidWlsZE5vbkpUQURhdGFzb3VyY2VOYW1lQm9vbGVhbkhvbGRlcigpLCB0ZXh0LCBsYWJlbCk7CiAJfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGUuamF2YQppbmRleCA0MTQ5YWJjLi5iNzcyNTE4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZS5qYXZhCkBAIC0xMiw4ICsxMiw5IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CiAKQEAgLTMyLDcgKzMzLDcgQEAKICAqIEB2ZXJzaW9uIDIuMAogICogQHNpbmNlIDIuMAogICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8UGVyc2lzdGVuY2VVbml0PgorcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxQZXJzaXN0ZW5jZVVuaXQ+CiB7CiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZTwvY29kZT4uCkBAIC00MCw3ICs0MSw3IEBACiAJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCiAJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgogCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZShBYnN0cmFjdFBhbmU8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZShQYW5lPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lcikgewogCiAJCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcik7CkBAIC01OCwxMyArNTksMTMgQEAKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlW10gY2hvaWNlcygpIHsKKwkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVbXSBnZXRDaG9pY2VzKCkgewogCQkJCXJldHVybiBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUudmFsdWVzKCk7CiAJCQl9CiAKIAkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBkZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QoKS5nZXREZWZhdWx0VHJhbnNhY3Rpb25UeXBlKCk7CisJCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRUcmFuc2FjdGlvblR5cGUoKTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCkBAIC03OCwxMiArNzksMTIgQEAKIAogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBzdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCk7CisJCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlzdWJqZWN0KCkuc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKHZhbHVlKTsKKwkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKHZhbHVlKTsKIAkJCX0KIAkJfTsKIAl9CkBAIC05NSwxMCArOTYsMTEgQEAKIAlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKIAogCQkvLyBUcmFuc2FjdGlvbiBUeXBlIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAorCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAogCQkJY29udGFpbmVyLAogCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX3RyYW5zYWN0aW9uVHlwZSwKLQkJCWJ1aWxkVHJhbnNhY3Rpb25UeXBlQ29tYm8oY29udGFpbmVyKS5nZXRDb250cm9sKCkKKwkJCWJ1aWxkVHJhbnNhY3Rpb25UeXBlQ29tYm8oY29udGFpbmVyKS5nZXRDb250cm9sKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgogCQkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlLmphdmEKaW5kZXggZGI3Y2I0ZS4uMWJkMzU1NCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0Rm9ybVBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRm9ybVBhbmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKQEAgLTU4LDE4ICs1OCwyOSBAQAogICogfCAgIHwgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKICAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CiAgKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8IC0gSkFSIEZpbGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8CisgKiB8ICAgfCBQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKKyAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgogICoKICAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Ci0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlCiAgKiBAc2VlIFBlcnNpc3RlbmNlVW5pdE1hcHBlZENsYXNzZXNDb21wb3NpdGUKICAqIEBzZWUgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlCisgKiBAc2VlIFBlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlCiAgKgogICogQHZlcnNpb24gMi4wCiAgKiBAc2luY2UgMi4wCiAgKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RGb3JtUGFuZTxQZXJzaXN0ZW5jZVVuaXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGU8UGVyc2lzdGVuY2VVbml0PgorcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUgZXh0ZW5kcyBGb3JtUGFuZTxQZXJzaXN0ZW5jZVVuaXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKIHsKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGU8L2NvZGU+LgpAQCAtNzgsMjggKzg5LDE5IEBACiAJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgogCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKIAkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAorCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CiAKIAkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCB3aWRnZXRGYWN0b3J5KTsKIAl9Ci0KLS8vCXByaXZhdGUgdm9pZCBpbml0aWFsaXplSmF2YUFyY2hpdmVzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0vLwotLy8JCWNvbnRhaW5lciA9IGJ1aWxkU2VjdGlvbigKLS8vCQkJY29udGFpbmVyLAotLy8JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0Q29tcG9zaXRlX2phdmFBcmNoaXZlcwotLy8JCSk7Ci0vLwotLy8JCW5ldyBQZXJzaXN0ZW5jZVVuaXRKYXZhQXJjaGl2ZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLS8vCX0KKwkKIAogCS8qCiAJICogKG5vbi1KYXZhZG9jKQogCSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgYnVpbGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgeworCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAogCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwogCQlsYXlvdXQubWFyZ2luSGVpZ2h0ICAgID0gMDsKQEAgLTExMCw3ICsxMTIsNyBAQAogCQlsYXlvdXQubWFyZ2luUmlnaHQgICAgID0gMDsKIAkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE1OwogCi0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBidWlsZFBhbmUocGFyZW50LCBsYXlvdXQpOworCQlDb21wb3NpdGUgY29udGFpbmVyID0gYWRkUGFuZShwYXJlbnQsIGxheW91dCk7CiAJCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7CiAKIAkJcmV0dXJuIGNvbnRhaW5lcjsKQEAgLTE2OCw3ICsxNzAsNyBAQAogCSAqIChub24tSmF2YWRvYykKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1VOSVRfR0VORVJBTDsKKwkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9HRU5FUkFMOwogCX0KIAogCS8qCkBAIC0xODUsNjUgKzE4Nyw0MSBAQAogCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfZ2VuZXJhbDsKIAl9CiAKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhbFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewogCi0JCWNvbnRhaW5lciA9IGJ1aWxkU2VjdGlvbigKKwkJY29udGFpbmVyID0gdGhpcy5hZGRTZWN0aW9uKAogCQkJY29udGFpbmVyLAogCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfZ2VuZXJhbAogCQkpOwogCiAJCS8vIE5hbWUgd2lkZ2V0cwotCQlidWlsZExhYmVsZWRUZXh0KAorCQl0aGlzLmFkZExhYmVsZWRUZXh0KAogCQkJY29udGFpbmVyLAogCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfbmFtZSwKLQkJCWJ1aWxkUGVyc2lzdGVuY2VVbml0TmFtZUhvbGRlcigpCisJCQl0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0TmFtZUhvbGRlcigpLAorCQkJdGhpcy5nZXRIZWxwSUQoKQogCQkpOwogCiAJCS8vIFBlcnNpc3RlbmNlIFByb3ZpZGVyIHdpZGdldHMKLQkJYnVpbGRMYWJlbGVkVGV4dCgKKwkJdGhpcy5hZGRMYWJlbGVkVGV4dCgKIAkJCWNvbnRhaW5lciwKIAkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX3BlcnNpc3RlbmNlUHJvdmlkZXIsCi0JCQlidWlsZFBlcnNpc3RlbmNlUHJvdmlkZXJIb2xkZXIoKQorCQkJdGhpcy5idWlsZFBlcnNpc3RlbmNlUHJvdmlkZXJIb2xkZXIoKSwKKwkJCXRoaXMuZ2V0SGVscElEKCkKIAkJKTsKIAogCQkvLyBEZXNjcmlwdGlvbiB3aWRnZXRzCi0JCWJ1aWxkTGFiZWxlZFRleHQoCisJCXRoaXMuYWRkTGFiZWxlZFRleHQoCiAJCQljb250YWluZXIsCiAJCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9kZXNjcmlwdGlvbiwKLQkJCWJ1aWxkUGVyc2lzdGVuY2VVbml0RGVzY3JpcHRpb25Ib2xkZXIoKQorCQkJdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdERlc2NyaXB0aW9uSG9sZGVyKCksCisJCQl0aGlzLmdldEhlbHBJRCgpCiAJCSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVKUEFNYXBwaW5nRGVzY3JpcHRvcnNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFwcGVkQ2xhc3Nlc1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewogCi0JCWNvbnRhaW5lciA9IGJ1aWxkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9ycywKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9yc19kZXNjcmlwdGlvbgotCQkpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lci5nZXRQYXJlbnQoKSk7Ci0KLQkJbmV3IFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWluaXRpYWxpemVHZW5lcmFsUGFuZShjb250YWluZXIpOwotCQlpbml0aWFsaXplTWFwcGVkQ2xhc3Nlc1BhbmUoY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUpQQU1hcHBpbmdEZXNjcmlwdG9yc1BhbmUoY29udGFpbmVyKTsKLS8vCQlpbml0aWFsaXplSmF2YUFyY2hpdmVzUGFuZShjb250YWluZXIpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVNYXBwZWRDbGFzc2VzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYnVpbGRTZWN0aW9uKAorCQljb250YWluZXIgPSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oCiAJCQljb250YWluZXIsCiAJCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9tYXBwZWRDbGFzc2VzCiAJCSk7CkBAIC0yNTMsOCArMjMxLDggQEAKIAogCQluZXcgUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwogCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewogCiAJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CiAJCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZS5qYXZhCmluZGV4IGI5MjQ3MTAuLjA1YzBjOWEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlLmphdmEKQEAgLTksOSArOSwzNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkphckZpbGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUG9zdEV4ZWN1dGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7CiAKIC8qKgogICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKQEAgLTM0LDcgKzU5LDggQEAKICAqIEB2ZXJzaW9uIDIuMAogICogQHNpbmNlIDIuMAogICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFBhbmU8UGVyc2lzdGVuY2VVbml0PgorcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlIAorCWV4dGVuZHMgUGFuZTxQZXJzaXN0ZW5jZVVuaXQ+CiB7CiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZVVuaXRKUEFNYXBwaW5nRGVzY3JpcHRvcnNDb21wb3NpdGU8L2NvZGU+LgpAQCAtNDIsMTYgKzY4LDE2NCBAQAogCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQogCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKIAkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisJcHVibGljIFBlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlKAorCQkJUGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0PiBwYXJlbnRQYW5lLAorCQkJQ29tcG9zaXRlIHBhcmVudCkgewogCiAJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwogCX0KIAotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLworCQorCQogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlhZGRKYXJGaWxlc0xpc3QoY29udGFpbmVyKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkSmFyRmlsZXNMaXN0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJLy8gTGlzdCBwYW5lCisJCW5ldyBBZGRSZW1vdmVMaXN0UGFuZTxQZXJzaXN0ZW5jZVVuaXQ+KAorCQkJdGhpcywKKwkJCWNvbnRhaW5lciwKKwkJCXRoaXMuYnVpbGRBZGFwdGVyKCksCisJCQl0aGlzLmJ1aWxkSXRlbUxpc3RIb2xkZXIoKSwKKwkJCXRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKKwkJCXRoaXMuYnVpbGRMYWJlbFByb3ZpZGVyKCksCisJCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfR0VORVJBTAorCQkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQkJCXBhcmVudCA9IHN1cGVyLmFkZENvbnRhaW5lcihwYXJlbnQpOworCQkJCXVwZGF0ZUdyaWREYXRhKHBhcmVudCk7CisJCQkJcmV0dXJuIHBhcmVudDsKKwkJCX0KKwkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCQkJc3VwZXIuaW5pdGlhbGl6ZUxheW91dChjb250YWluZXIpOworCQkJCXVwZGF0ZUdyaWREYXRhKGdldENvbnRhaW5lcigpKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlICAgPSB0cnVlOworCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gU1dULkZJTEw7CisJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ICAgICAgICAgPSBTV1QuRklMTDsKKwkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCX0KKwkKKwlwcml2YXRlIEFkYXB0ZXIgYnVpbGRBZGFwdGVyKCkgeworCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCQkJCWFkZEphckZpbGVSZWYobGlzdFNlbGVjdGlvbk1vZGVsKTsKKwkJCX0KKwkJCQorCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7CisJCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7CisJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVKYXJGaWxlUmVmKChKYXJGaWxlUmVmKSBpdGVtKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8SmFyRmlsZVJlZj4gYnVpbGRJdGVtTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SmFyRmlsZVJlZj4oCisJCQlidWlsZExpc3RIb2xkZXIoKSwKKwkJCUphckZpbGVSZWYuRklMRV9OQU1FX1BST1BFUlRZCisJCSk7CisJfQorCQorCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8SmFyRmlsZVJlZj4gYnVpbGRMaXN0SG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgSmFyRmlsZVJlZj4oZ2V0U3ViamVjdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuSkFSX0ZJTEVfUkVGU19MSVNUKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8SmFyRmlsZVJlZj4gbGlzdEl0ZXJhdG9yXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmphckZpbGVSZWZzKCk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmphckZpbGVSZWZzU2l6ZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEphckZpbGVSZWY+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKYXJGaWxlUmVmPigpOworCX0KKwkKKwlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKKwkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KQVJfRklMRV9SRUYpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJCUphckZpbGVSZWYgamFyRmlsZVJlZiA9IChKYXJGaWxlUmVmKSBlbGVtZW50OworCQkJCVN0cmluZyBuYW1lID0gamFyRmlsZVJlZi5nZXRGaWxlTmFtZSgpOworCQkJCQorCQkJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCQkJbmFtZSA9IEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZV9ub0ZpbGVOYW1lOworCQkJCX0KKwkJCQkKKwkJCQlyZXR1cm4gbmFtZTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZEphckZpbGVSZWYoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgeworCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7CisKKwkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nKAorCQkJZ2V0U2hlbGwoKSwgYnVpbGRKYXJGaWxlRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yKCkpOworCQkKKwkJZGlhbG9nLnNldEhlbHBBdmFpbGFibGUoZmFsc2UpOworCQlkaWFsb2cuc2V0VGl0bGUoSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9qYXJGaWxlRGlhbG9nX3RpdGxlKTsKKwkJZGlhbG9nLnNldE1lc3NhZ2UoSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9qYXJGaWxlRGlhbG9nX21lc3NhZ2UpOworCQlkaWFsb2cuc2V0SW5wdXQocHJvamVjdCk7CisJCQorCQlTV1RVdGlsLnNob3coCisJCQlkaWFsb2csCisJCQlidWlsZFNlbGVjdGlvbkRpYWxvZ1Bvc3RFeGVjdXRpb24obGlzdFNlbGVjdGlvbk1vZGVsKQorCQkpOworCX0KKwkKKwlwcm90ZWN0ZWQgQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2cuRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yIGJ1aWxkSmFyRmlsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBBcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZy5Nb2R1bGVEZXBsb3ltZW50UGF0aENhbGN1bGF0b3IoKTsKKwl9CisJCisJcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nPiBidWlsZFNlbGVjdGlvbkRpYWxvZ1Bvc3RFeGVjdXRpb24oCisJCQlmaW5hbCBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7CisJCXJldHVybiBuZXcgUG9zdEV4ZWN1dGlvbjxFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZz4oKSB7CisJCQlwdWJsaWMgdm9pZCBleGVjdXRlKEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZykgeworCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJCisJCQkJZm9yIChPYmplY3QgcmVzdWx0IDogZGlhbG9nLmdldFJlc3VsdCgpKSB7CisJCQkJCVN0cmluZyBmaWxlUGF0aCA9IChTdHJpbmcpIHJlc3VsdDsKKwkJCQkJaWYgKGphckZpbGVSZWZFeGlzdHMoZmlsZVBhdGgpKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlKYXJGaWxlUmVmIGphckZpbGVSZWYgPSBnZXRTdWJqZWN0KCkuYWRkSmFyRmlsZVJlZigpOworCQkJCQlqYXJGaWxlUmVmLnNldEZpbGVOYW1lKGZpbGVQYXRoKTsKKworCQkJCQlsaXN0U2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRWYWx1ZShqYXJGaWxlUmVmKTsKKwkJCQl9CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBqYXJGaWxlUmVmRXhpc3RzKFN0cmluZyBmaWxlTmFtZSkgeworCQlmb3IgKEphckZpbGVSZWYgZWFjaCA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShnZXRTdWJqZWN0KCkuamFyRmlsZVJlZnMoKSkpIHsKKwkJCWlmIChlYWNoLmdldEZpbGVOYW1lKCkuZXF1YWxzKGZpbGVOYW1lKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUuamF2YQppbmRleCAyZDViMGIxLi40Njg4MTE4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTIsMTMgKzEyLDkgQEAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKQEAgLTI4LDE3ICsyNCwxNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS50cmFuc2xhdG9ycy5Pcm1YbWxNYXBwZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBvc3RFeGVjdXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKQEAgLTgxLDcgKzc2LDcgQEAKICAqIEBzaW5jZSAyLjAKICAqLwogQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPFBlcnNpc3RlbmNlVW5pdD4KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPFBlcnNpc3RlbmNlVW5pdD4KIHsKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZTwvY29kZT4uCkBAIC04OSwyNSArODQsNTEgQEAKIAkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKIAkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCiAJICovCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwKKwlwdWJsaWMgUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKIAogCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwogCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRNYXBwaW5nRmlsZXNMaXN0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJLy8gTGlzdCBwYW5lCisJCW5ldyBBZGRSZW1vdmVMaXN0UGFuZTxQZXJzaXN0ZW5jZVVuaXQ+KAorCQkJdGhpcywKKwkJCWNvbnRhaW5lciwKKwkJCWJ1aWxkQWRhcHRlcigpLAorCQkJYnVpbGRJdGVtTGlzdEhvbGRlcigpLAorCQkJYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKKwkJCWJ1aWxkTGFiZWxQcm92aWRlcigpLAorCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0dFTkVSQUwKKwkJKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCQlwYXJlbnQgPSBzdXBlci5hZGRDb250YWluZXIocGFyZW50KTsKKwkJCQl1cGRhdGVHcmlkRGF0YShwYXJlbnQpOworCQkJCXJldHVybiBwYXJlbnQ7CisJCQl9CisJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQkJCXN1cGVyLmluaXRpYWxpemVMYXlvdXQoY29udGFpbmVyKTsKKwkJCQl1cGRhdGVHcmlkRGF0YShnZXRDb250YWluZXIoKSk7CisJCQl9CisJCX07CisJfQogCiAJLyoqCiAJICogUHJvbXB0cyBhIGRpYWxvZyBzaG93aW5nIGEgdHJlZSBzdHJ1Y3R1cmUgb2YgdGhlIHNvdXJjZSBwYXRocyB3aGVyZSB0aGUKIAkgKiBvbmx5IGZpbGVzIHNob3duIGFyZSBKUEEgbWFwcGluZyBkZXNjcmlwdG9ycyBmaWxlLiBUaGUgWE1MIGZpbGUgaGFzIHRvIGJlCi0JICogYW4gWE1MIGZpbGUgd2l0aCB0aGUgcm9vdCB0YWc6ICZsdDtlbnRpdHktbWFwcGluZ3MmZ3Q7LgorCSAqIGFuIFhNTCBmaWxlIHdpdGggdGhlIHJvb3QgdGFnOiB7QGNvZGUgPGVudGl0eS1tYXBwaW5ncz59LgogCSAqCiAJICogQHBhcmFtIGxpc3RTZWxlY3Rpb25Nb2RlbCBUaGUgc2VsZWN0aW9uIG1vZGVsIHVzZWQgdG8gc2VsZWN0IHRoZSBuZXcgZmlsZXMKIAkgKi8KIAlwcml2YXRlIHZvaWQgYWRkSlBBTWFwcGluZ0Rlc2NyaXB0b3IoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewogCi0JCUlQcm9qZWN0IHByb2plY3QgPSBzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKKwkJSVByb2plY3QgcHJvamVjdCA9IGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwogCiAJCUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZygKLQkJCXNoZWxsKCksCisJCQlnZXRTaGVsbCgpLAogCQkJbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwKIAkJCW5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKQogCQkpOwpAQCAtMTE2LDcgKzEzNyw3IEBACiAJCWRpYWxvZy5zZXRWYWxpZGF0b3IoYnVpbGRWYWxpZGF0b3IoKSk7CiAJCWRpYWxvZy5zZXRUaXRsZShKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX21hcHBpbmdGaWxlRGlhbG9nX3RpdGxlKTsKIAkJZGlhbG9nLnNldE1lc3NhZ2UoSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9tYXBwaW5nRmlsZURpYWxvZ19tZXNzYWdlKTsKLQkJZGlhbG9nLmFkZEZpbHRlcihuZXcgWG1sRmlsZVZpZXdlckZpbHRlcihzdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkpKTsKKwkJZGlhbG9nLmFkZEZpbHRlcihuZXcgWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXIoZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKSkpOwogCQlkaWFsb2cuc2V0SW5wdXQocHJvamVjdCk7CiAJCWRpYWxvZy5zZXRDb21wYXJhdG9yKG5ldyBSZXNvdXJjZUNvbXBhcmF0b3IoUmVzb3VyY2VDb21wYXJhdG9yLk5BTUUpKTsKIApAQCAtMTM0LDcgKzE1NSw3IEBACiAKIAkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewogCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlzdWJqZWN0KCkucmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoKE1hcHBpbmdGaWxlUmVmKSBpdGVtKTsKKwkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKChNYXBwaW5nRmlsZVJlZikgaXRlbSk7CiAJCQkJfQogCQkJfQogCQl9OwpAQCAtMTQ0LDcgKzE2NSw3IEBACiAJICogKG5vbi1KYXZhZG9jKQogCSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgYnVpbGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgeworCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAogCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwogCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKQEAgLTE1NCw3ICsxNzUsNyBAQAogCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKIAkJbGF5b3V0Lm1hcmdpblJpZ2h0ICA9IDA7CiAKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGJ1aWxkUGFuZShwYXJlbnQsIGxheW91dCk7CisJCUNvbXBvc2l0ZSBjb250YWluZXIgPSBhZGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKIAkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKIAogCQlyZXR1cm4gY29udGFpbmVyOwpAQCAtMTg5LDE1ICsyMTAsMTUgQEAKIAl9CiAKIAlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBNYXBwaW5nRmlsZVJlZj4oZ2V0U3ViamVjdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX01BUFBJTkdfRklMRV9SRUZfTElTVCkgeworCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgTWFwcGluZ0ZpbGVSZWY+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9NQVBQSU5HX0ZJTEVfUkVGU19MSVNUKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCk7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKTsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKTsKIAkJCX0KIAkJfTsKIAl9CkBAIC0yMTQsMjAgKzIzNSwzMSBAQAogCQkJCQlyZXR1cm47CiAJCQkJfQogCi0JCQkJaW50IGluZGV4ID0gc3ViamVjdCgpLnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKTsKLQogCQkJCWZvciAoT2JqZWN0IHJlc3VsdCA6IGRpYWxvZy5nZXRSZXN1bHQoKSkgewogCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXN1bHQ7CiAJCQkJCUlQYXRoIGZpbGVQYXRoID0gcmVtb3ZlU291cmNlUGF0aChmaWxlKTsKLQotCQkJCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IHN1YmplY3QoKS5hZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZihpbmRleCsrKTsKLQkJCQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoZmlsZVBhdGgudG9Qb3J0YWJsZVN0cmluZygpKTsKKwkJCQkJU3RyaW5nIGZpbGVOYW1lID0gZmlsZVBhdGgudG9Qb3J0YWJsZVN0cmluZygpOworCQkJCQlpZihtYXBwaW5nRmlsZVJlZkV4aXN0cyhmaWxlTmFtZSkpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gZ2V0U3ViamVjdCgpLmFkZFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKCk7CisJCQkJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKIAogCQkJCQlsaXN0U2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRWYWx1ZShtYXBwaW5nRmlsZVJlZik7CiAJCQkJfQogCQkJfQogCQl9OwogCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gbWFwcGluZ0ZpbGVSZWZFeGlzdHMoU3RyaW5nIGZpbGVOYW1lKSB7CisJCWZvciAoIExpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gaSA9IGdldFN1YmplY3QoKS5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKTsgaS5oYXNOZXh0KCk7ICkgeworCQkJTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBpLm5leHQoKTsKKwkJCWlmKCBtYXBwaW5nRmlsZVJlZi5nZXRGaWxlTmFtZSgpLmVxdWFscyhmaWxlTmFtZSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQogCiAJcHJpdmF0ZSBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKCkgewogCQlyZXR1cm4gbmV3IElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKSB7CkBAIC0yNDgsMzYgKzI4MCw2IEBACiAJCX07CiAJfQogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCW5ldyBBZGRSZW1vdmVMaXN0UGFuZTxQZXJzaXN0ZW5jZVVuaXQ+KAotCQkJdGhpcywKLQkJCWNvbnRhaW5lciwKLQkJCWJ1aWxkQWRhcHRlcigpLAotCQkJYnVpbGRJdGVtTGlzdEhvbGRlcigpLAotCQkJYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQlwYXJlbnQgPSBzdXBlci5idWlsZENvbnRhaW5lcihwYXJlbnQpOwotCQkJCXVwZGF0ZUdyaWREYXRhKHBhcmVudCk7Ci0JCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplTGF5b3V0KGNvbnRhaW5lcik7Ci0JCQkJdXBkYXRlR3JpZERhdGEoZ2V0Q29udGFpbmVyKCkpOwotCQkJfQotCQl9OwotCX0KLQogCS8qKgogCSAqIFJldHVybnMgdGhlIHBhdGggb2YgdGhlIGdpdmVuIGZpbGUgZXhjbHVkaW5nIHRoZSBzb3VyY2UgZm9sZGVyLgogCSAqCkBAIC0yODYsNyArMjg4LDcgQEAKIAkgKiBzb3VyY2UgcGF0aAogCSAqLwogCXByaXZhdGUgSVBhdGggcmVtb3ZlU291cmNlUGF0aChJRmlsZSBmaWxlKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IHN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKKwkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwogCQlJUGF0aCBmaWxlUGF0aCA9IGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwogCiAJCXRyeSB7CkBAIC0zMzUsNyArMzM3LDcgQEAKIAkJcHJpdmF0ZSBTdHJpbmcgcm9vdFRhZ05hbWU7CiAKIAkJcHVibGljIFN0cmluZyBnZXRSb290VGFnTmFtZSgpIHsKLQkJCXJldHVybiByb290VGFnTmFtZTsKKwkJCXJldHVybiB0aGlzLnJvb3RUYWdOYW1lOwogCQl9CiAKIAkJQE92ZXJyaWRlCkBAIC0zNTcsOTAgKzM1OSw0IEBACiAJCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCk7CiAJCX0KIAl9Ci0KLQkvKioKLQkgKiBUaGlzIGZpbHRlciB3aWxsIGRlbnkgc2hvd2luZyBhbnkgZmlsZSB0aGF0IGFyZSBub3QgWE1MIGZpbGVzIG9yIGZvbGRlcnMKLQkgKiB0aGF0IGRvbid0IGNvbnRhaW4gYW55IFhNTCBmaWxlcyBpbiBpdHMgc3ViLWhpZXJhcmNoeS4gVGhlIFhNTCBmaWxlcyBhcmUKLQkgKiBwYXJ0aWFsbHkgcGFyc2VkIHRvIG9ubHkgYWNjZXB0IEpQQSBtYXBwaW5nIGRlc2NyaXB0b3JzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFhtbEZpbGVWaWV3ZXJGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCi0JCXByaXZhdGUgZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCi0JCVhtbEZpbGVWaWV3ZXJGaWx0ZXIoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSAoYW4gWE1MIGZpbGUpIGlzIGEgSlBBIG1hcHBpbmcKLQkJICogZGVzY3JpcHRvciBmaWxlLiBJdCBoYXMgdG8gYmUgYSB2YWxpZCBYTUwgZmlsZSB3aXRoIGEgcm9vdCBlbGVtZW50Ci0JCSAqIG5hbWVkICJlbnRpdHktbWFwcGluZ3MiLgotCQkgKgotCQkgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBwYXJzZSBhbmQgc2VlIGlmIGl0J3MgYSBtYXBwaW5nIGRlc2NyaXB0b3IgZmlsZQotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBmaWxlIGlzIGEgdmFsaWQgWE1MIGZpbGUgd2l0aCBhCi0JCSAqIHJvb3QgZWxlbWVudCBuYW1lZCAiZW50aXR5LW1hcHBpbmdzIjsgPGNvZGU+ZmFsc2U8L2NvZGU+IGluIGFueSBvdGhlcgotCQkgKiBjYXNlCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gaXNNYXBwaW5nRmlsZShJRmlsZSBmaWxlKSB7Ci0JCQl0cnkgewotCQkJCVNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCQlTQVhQYXJzZXIgc2F4UGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJCQlTQVhIYW5kbGVyIGhhbmRsZXIgPSBuZXcgU0FYSGFuZGxlcigpOwotCQkJCXRyeSB7Ci0JCQkJCXNheFBhcnNlci5wYXJzZShmaWxlLmdldFJhd0xvY2F0aW9uVVJJKCkudG9VUkwoKS5vcGVuU3RyZWFtKCksIGhhbmRsZXIpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWdub3JlIHNpbmNlIGl0J3MgY2F1c2VkIGJ5IFNBWEhhbmRsZXIgdG8gc3RvcCB0aGUgcGFyc2luZwotCQkJCQkvLyB0aGUgbW9tZW50IHRoZSBsb2NhbCBuYW1lIGlzIHJldHJpZXZlZAotCQkJCX0KLQkJCQlyZXR1cm4gT3JtWG1sTWFwcGVyLkVOVElUWV9NQVBQSU5HUy5lcXVhbHNJZ25vcmVDYXNlKGhhbmRsZXIuZ2V0Um9vdFRhZ05hbWUoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzWG1sRmlsZShJRmlsZSBmaWxlKSB7Ci0JCQlyZXR1cm4gInhtbCIuZXF1YWxzSWdub3JlQ2FzZShmaWxlLmdldEZpbGVFeHRlbnNpb24oKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcGFyZW50RWxlbWVudCwKLQkJICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50KSB7Ci0KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBlbGVtZW50OwotCQkJCXJldHVybiBpc1htbEZpbGUoZmlsZSkgJiYgaXNNYXBwaW5nRmlsZShmaWxlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcikgZWxlbWVudDsKLQotCQkJCXRyeSB7Ci0JCQkJCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkpIHsKLQkJCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCQkJCWlmICghZW50cnkuZ2V0UGF0aCgpLmlzUHJlZml4T2YoZm9sZGVyLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkpKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlmb3IgKElSZXNvdXJjZSByZXNvdXJjZSA6IGZvbGRlci5tZW1iZXJzKCkpIHsKLQkJCQkJCWlmIChzZWxlY3Qodmlld2VyLCBmb2xkZXIsIHJlc291cmNlKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlKcHRVaVBsdWdpbi5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJSnB0VWlQbHVnaW4ubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKaW5kZXggODI0OTI5Ni4uMWUyM2QxOSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNiArMTAsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlsczsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwpAQCAtMTgsMTggKzE5LDIxIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUHJvcGVydHk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3RQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlVGFibGVQYW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwpAQCAtNTYsMTcgKzYwLDE3IEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgogICoKICAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Ci0gKiBAc2VlIEJhc2VKcGFVaUZhY3RvcnkgLSBUaGUgaW52b2tlcgorICogQHNlZSBCYXNlSmF2YVVpRmFjdG9yeSAtIFRoZSBpbnZva2VyCiAgKiBAc2VlIEFkZFJlbW92ZVRhYmxlUGFuZQogICoKICAqIEB2ZXJzaW9uIDIuMAogICogQHNpbmNlIDIuMAogICovCiBAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RQYW5lPFBlcnNpc3RlbmNlVW5pdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhUGFnZUNvbXBvc2l0ZTxQZXJzaXN0ZW5jZVVuaXQ+CitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8UGVyc2lzdGVuY2VVbml0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCiB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlIb2xkZXI7CisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IHByb3BlcnR5SG9sZGVyOwogCXByaXZhdGUgVGFibGVQYW5lIHRhYmxlUGFuZTsKIAogCS8qKgpAQCAtODMsMTAgKzg3LDEwIEBACiAJCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgd2lkZ2V0RmFjdG9yeSk7CiAJfQogCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gYnVpbGRQcm9wZXJ0aWVzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFByb3BlcnR5PihnZXRTdWJqZWN0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdC5QUk9QRVJUSUVTX0xJU1QpIHsKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gYnVpbGRQcm9wZXJ0aWVzTGlzdEhvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4oZ2V0U3ViamVjdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuUFJPUEVSVElFU19MSVNUKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UHJvcGVydHk+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gbGlzdEl0ZXJhdG9yXygpIHsKIAkJCQlyZXR1cm4gc3ViamVjdC5wcm9wZXJ0aWVzKCk7CiAJCQl9CiAKQEAgLTEwNSwxMCArMTA5LDEwIEBACiAJCXJldHVybiBuZXcgQWRkUmVtb3ZlVGFibGVQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKIAkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewogCi0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBzdWJqZWN0KCkuYWRkUHJvcGVydHkoKTsKKwkJCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSBnZXRTdWJqZWN0KCkuYWRkUHJvcGVydHkoKTsKIAkJCQlwcm9wZXJ0eUhvbGRlci5zZXRWYWx1ZShwcm9wZXJ0eSk7CiAKLQkJCQlpbnQgaW5kZXggPSBzdWJqZWN0KCkucHJvcGVydGllc1NpemUoKSAtIDE7CisJCQkJaW50IGluZGV4ID0gZ2V0U3ViamVjdCgpLnByb3BlcnRpZXNTaXplKCkgLSAxOwogCQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZVBhbmUuZ2V0TWFpbkNvbnRyb2woKS5nZXRJdGVtKGluZGV4KTsKIAkJCQl0YWJsZVBhbmUuZ2V0TWFpbkNvbnRyb2woKS5zaG93SXRlbSh0YWJsZUl0ZW0pOwogCkBAIC0xMjAsNyArMTI0LDcgQEAKIAogCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7CiAJCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCXN1YmplY3QoKS5yZW1vdmVQcm9wZXJ0eSgoUHJvcGVydHkpIGl0ZW0pOworCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlUHJvcGVydHkoKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSkgaXRlbSk7CiAJCQkJfQogCQkJfQogCQl9OwpAQCAtMTMwLDcgKzEzNCw3IEBACiAJICoge0Bpbmhlcml0RG9jfQogCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgewotCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfVU5JVF9QUk9QRVJUSUVTOworCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX1BST1BFUlRJRVM7CiAJfQogCiAJLyoqCkBAIC0xNTMsNyArMTU3LDcgQEAKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewogCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXByb3BlcnR5SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQcm9wZXJ0eT4oKTsKKwkJcHJvcGVydHlIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4oKTsKIAl9CiAKIAkvKioKQEAgLTE2MiwyMyArMTY2LDI0IEBACiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CiAKLQkJYnVpbGRMYWJlbCgKKwkJYWRkTGFiZWwoCiAJCQljb250YWluZXIsCiAJCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZV9wcm9wZXJ0aWVzX2Rlc2NyaXB0aW9uCiAJCSk7CiAKIAkJdGFibGVQYW5lID0gbmV3IFRhYmxlUGFuZShjb250YWluZXIpOworCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvcGVydHlDb2x1bW5BZGFwdGVyIGltcGxlbWVudHMgQ29sdW1uQWRhcHRlcjxQcm9wZXJ0eT4geworCXByaXZhdGUgc3RhdGljIGNsYXNzIFByb3BlcnR5Q29sdW1uQWRhcHRlciBpbXBsZW1lbnRzIENvbHVtbkFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiB7CiAKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gMzsKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DT0xVTU4gPSAxOwogCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT05fQ09MVU1OID0gMDsKIAkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfQ09MVU1OID0gMjsKIAotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKFByb3BlcnR5IHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFByb3BlcnR5LCBTdHJpbmc+KFByb3BlcnR5Lk5BTUVfUFJPUEVSVFksIHN1YmplY3QpIHsKKwkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgc3ViamVjdCkgeworCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5LCBTdHJpbmc+KFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eS5OQU1FX1BST1BFUlRZLCBzdWJqZWN0KSB7CiAJCQkJQE92ZXJyaWRlCiAJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKIAkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwpAQCAtMTkxLDggKzE5Niw4IEBACiAJCQl9OwogCQl9CiAKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVmFsdWVIb2xkZXIoUHJvcGVydHkgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UHJvcGVydHksIFN0cmluZz4oUHJvcGVydHkuVkFMVUVfUFJPUEVSVFksIHN1YmplY3QpIHsKKwkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVmFsdWVIb2xkZXIoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHN1YmplY3QpIHsKKwkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSwgU3RyaW5nPihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkuVkFMVUVfUFJPUEVSVFksIHN1YmplY3QpIHsKIAkJCQlAT3ZlcnJpZGUKIAkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewogCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRWYWx1ZSgpOwpAQCAtMjA1LDcgKzIxMCw3IEBACiAJCQl9OwogCQl9CiAKLQkJcHVibGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gY2VsbE1vZGVscyhQcm9wZXJ0eSBzdWJqZWN0KSB7CisJCXB1YmxpYyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGNlbGxNb2RlbHMoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHN1YmplY3QpIHsKIAkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gaG9sZGVycyA9IG5ldyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltDT0xVTU5fQ09VTlRdOwogCQkJaG9sZGVyc1tTRUxFQ1RJT05fQ09MVU1OXSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PigpOwogCQkJaG9sZGVyc1tOQU1FX0NPTFVNTl0gICAgICA9IGJ1aWxkTmFtZUhvbGRlcihzdWJqZWN0KTsKQEAgLTI0NCw3ICsyNDksNyBAQAogCiAJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CiAKLQkJCVByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KSBlbGVtZW50OworCQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSkgZWxlbWVudDsKIAkJCVN0cmluZyB2YWx1ZSA9IG51bGw7CiAKIAkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKQEAgLTI4Miw2ICsyODcsMTMgQEAKIAkJCQkJYnVpbGRQcm9wZXJ0eUxhYmVsUHJvdmlkZXIoKSk7CiAJCX0KIAorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHN1cGVyLmFkZENvbnRhaW5lcihwYXJlbnQpOworCQkJY29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCQkJcmV0dXJuIGNvbnRhaW5lcjsKKwkJfQorCiAJCXByaXZhdGUgQ2VsbEVkaXRvcltdIGJ1aWxkQ2VsbEVkaXRvcnMoVGFibGUgdGFibGUpIHsKIAkJCXJldHVybiBuZXcgQ2VsbEVkaXRvcltdIHsKIAkJCQludWxsLApAQCAtMjk4LDEzICszMTAsMTMgQEAKIAkJCQl9CiAKIAkJCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkJUHJvcGVydHkgcHJvcGVydHlNb2RlbCA9IChQcm9wZXJ0eSkgZWxlbWVudDsKKwkJCQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5TW9kZWwgPSAoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5KSBlbGVtZW50OwogCQkJCQlTdHJpbmcgdmFsdWUgPSBudWxsOwogCi0JCQkJCWlmIChwcm9wZXJ0eSA9PSBQcm9wZXJ0eS5OQU1FX1BST1BFUlRZKSB7CisJCQkJCWlmIChwcm9wZXJ0eSA9PSBQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkuTkFNRV9QUk9QRVJUWSkgewogCQkJCQkJdmFsdWUgPSBwcm9wZXJ0eU1vZGVsLmdldE5hbWUoKTsKIAkJCQkJfQotCQkJCQllbHNlIGlmIChwcm9wZXJ0eSA9PSBQcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSkgeworCQkJCQllbHNlIGlmIChwcm9wZXJ0eSA9PSBQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkuVkFMVUVfUFJPUEVSVFkpIHsKIAkJCQkJCXZhbHVlID0gcHJvcGVydHlNb2RlbC5nZXRWYWx1ZSgpOwogCQkJCQl9CiAKQEAgLTMxNiwyMCArMzI4LDIwIEBACiAJCQkJfQogCiAJCQkJcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eU1vZGVsOworCQkJCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHlNb2RlbDsKIAogCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewogCQkJCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IChUYWJsZUl0ZW0pIGVsZW1lbnQ7Ci0JCQkJCQlwcm9wZXJ0eU1vZGVsID0gKFByb3BlcnR5KSB0YWJsZUl0ZW0uZ2V0RGF0YSgpOworCQkJCQkJcHJvcGVydHlNb2RlbCA9IChQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkpIHRhYmxlSXRlbS5nZXREYXRhKCk7CiAJCQkJCX0KIAkJCQkJZWxzZSB7Ci0JCQkJCQlwcm9wZXJ0eU1vZGVsID0gKFByb3BlcnR5KSBlbGVtZW50OworCQkJCQkJcHJvcGVydHlNb2RlbCA9IChQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkpIGVsZW1lbnQ7CiAJCQkJCX0KIAotCQkJCQlpZiAocHJvcGVydHkgPT0gUHJvcGVydHkuTkFNRV9QUk9QRVJUWSkgeworCQkJCQlpZiAocHJvcGVydHkgPT0gUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5Lk5BTUVfUFJPUEVSVFkpIHsKIAkJCQkJCXByb3BlcnR5TW9kZWwuc2V0TmFtZSh2YWx1ZS50b1N0cmluZygpKTsKIAkJCQkJfQotCQkJCQllbHNlIGlmIChwcm9wZXJ0eSA9PSBQcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSkgeworCQkJCQllbHNlIGlmIChwcm9wZXJ0eSA9PSBQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkuVkFMVUVfUFJPUEVSVFkpIHsKIAkJCQkJCXByb3BlcnR5TW9kZWwuc2V0VmFsdWUodmFsdWUudG9TdHJpbmcoKSk7CiAJCQkJCX0KIAkJCQl9CkBAIC0zNDQsMTggKzM1NiwxMSBAQAogCQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkQ29sdW1uUHJvcGVydGllcygpIHsKIAkJCXJldHVybiBuZXcgU3RyaW5nW10gewogCQkJCVNFTEVDVElPTl9DT0xVTU4sCi0JCQkJUHJvcGVydHkuTkFNRV9QUk9QRVJUWSwKLQkJCQlQcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWQorCQkJCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eS5OQU1FX1BST1BFUlRZLAorCQkJCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWQogCQkJfTsKIAkJfQogCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbXBvc2l0ZSBjb250YWluZXIgPSBzdXBlci5idWlsZENvbnRhaW5lcihwYXJlbnQpOwotCQkJY29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCiAJCVRhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCkgewogCQkJcmV0dXJuIHRhYmxlVmlld2VyOwogCQl9CkBAIC0zNzgsNiArMzgzLDcgQEAKIAkJCSk7CiAKIAkJCVRhYmxlIHRhYmxlID0gZ2V0TWFpbkNvbnRyb2woKTsKKwkJCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwogCiAJCQkvLyBNYWtlIHRoZSBzZWxlY3Rpb24gY29sdW1uIG5vbi1yZXNpemFibGUgc2luY2UgaXQncyBvbmx5IHVzZWQgdG8KIAkJCS8vIGVhc2UgdGhlIHNlbGVjdGlvbiBvZiByb3dzCkBAIC0zOTAsOSArMzk2LDQwIEBACiAJCQl0YWJsZVZpZXdlci5zZXRDZWxsRWRpdG9ycyhidWlsZENlbGxFZGl0b3JzKHRhYmxlKSk7CiAJCQl0YWJsZVZpZXdlci5zZXRDZWxsTW9kaWZpZXIoYnVpbGRDZWxsTW9kaWZpZXIoKSk7CiAJCQl0YWJsZVZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGJ1aWxkQ29sdW1uUHJvcGVydGllcygpKTsKKwkJfQogCi0JCQlnZXRDb250YWluZXIoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgeworCQkJc3VwZXIuaXRlbXNBZGRlZChlKTsKKwkJCXJldmFsaWRhdGVMYXlvdXQoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKKwkJCXN1cGVyLml0ZW1zUmVtb3ZlZChlKTsKKwkJCXJldmFsaWRhdGVMYXlvdXQoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgeworCQkJc3VwZXIubGlzdENoYW5nZWQoZSk7CisJCQlyZXZhbGlkYXRlTGF5b3V0KCk7CisJCX0KKworCQkvKioKKwkJICogUmV2YWxpZGF0ZXMgdGhlIHRhYmxlIGxheW91dCBhZnRlciB0aGUgbGlzdCBvZiBpdGVtcyBoYXMgY2hhbmdlZC4gVGhlCisJCSAqIGxheW91dCBoYXMgdG8gYmUgZG9uZSBpbiBhIG5ldyBVSSB0aHJlYWQgYmVjYXVzZSBvdXIgbGlzdGVuZXIgbWlnaHQgYmUKKwkJICogbm90aWZpZWQgYmVmb3JlIHRoZSB0YWJsZSBoYXMgYmVlbiB1cGRhdGVkICh0YWJsZSBjb2x1bW4gYWRkZWQgb3IgcmVtb3ZlZCkuCisJCSAqLworCQlwcml2YXRlIHZvaWQgcmV2YWxpZGF0ZUxheW91dCgpIHsKKwkJCVNXVFV0aWwuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCVRhYmxlIHRhYmxlID0gZ2V0TWFpbkNvbnRyb2woKTsKKwkJCQlpZiAoIXRhYmxlLmlzRGlzcG9zZWQoKSkgeworCQkJCQkvLyBXZSBoYXZlIHRvIGRvIGEgdG90YWwgcmVsYXlvdXQgb2YgdGhlIHRhYiBvdGhlcndpc2UgdGhlCisJCQkJCS8vIHRhYmxlIG1pZ2h0IGJlY29tZSBjdXQgb2ZmIGF0IHRoZSBib3R0b20KKwkJCQkJU1dUVXRpbC5yZWZsb3codGFibGUpOworCQkJCX0KKwkJCX19KTsKIAkJfQogCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxZjYzMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVJlc291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgoreworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFBlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5IGJ1aWxkUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzVWkoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgeworCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRSk7CisJfQorCQorCXB1YmxpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcigpIHsKKwkJcmV0dXJuIFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmluc3RhbmNlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZDAzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkKK3sKKwkvLyAqKioqKioqKioqKioqKioqIHBlcnNpc3RlbmNlIHVuaXQgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbGlzdCBvZiA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+cyB1c2VkIHRvIGVkaXQgYQorCSAqIDxjb2RlPlBlcnNpc3RlbmNlVW5pdDwvY29kZT4uIFRoZSBwcm9wZXJ0aWVzIGNhbiBiZSByZWdyb3VwZWQgaW50bworCSAqIHNlY3Rpb25zIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZWRpdG9yIGFzIHBhZ2VzLgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgcGVydGlzdGVuY2UgdW5pdAorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cworCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgorCSAqLworCUxpc3RJdGVyYXRvcjxKcGFQYWdlQ29tcG9zaXRlPiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGVzKAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAorCQlDb21wb3NpdGUgcGFyZW50LAorCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc3BlY3RpdmUvSnBhUGVyc3BlY3RpdmVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9KcGFQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YQppbmRleCBhOGM3NDZhLi4yNjNmOWVmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9KcGFQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9KcGFQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YQpAQCAtMzksNDIgKzM5LDEzIEBACiAJCW91dHB1dEZvbGRlci5hZGRQbGFjZWhvbGRlcihJUHJvZ3Jlc3NDb25zdGFudHMuUFJPR1JFU1NfVklFV19JRCk7CiAKIAkJLy9KUEEgRGV0YWlscyAoU3BsaXQgd2l0aCBQcm9ibGVtcy9Db25zb2xlIGFyZWEpCi0JCWxheW91dC5hZGRWaWV3KCJvcmcuZWNsaXBzZS5qcHQudWkuanBhRGV0YWlsc1ZpZXciLAotCQkJCUlQYWdlTGF5b3V0LlJJR0hULCAoZmxvYXQpIC42MCwgImJvdHRvbSIpOworCQlsYXlvdXQuYWRkVmlldygib3JnLmVjbGlwc2UuanB0LnVpLmpwYURldGFpbHNWaWV3IiwgLy8kTk9OLU5MUy0xJAorCQkJCUlQYWdlTGF5b3V0LlJJR0hULCAoZmxvYXQpIC42MCwgImJvdHRvbSIpOyAvLyROT04tTkxTLTEkCiAJCQogCQkvL0pQQSBTdHJ1Y3R1cmUgYXJlYQogCQlJRm9sZGVyTGF5b3V0IG91dGxpbmVGb2xkZXIgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKAogCQkJCSJyaWdodCIsIElQYWdlTGF5b3V0LlJJR0hULCAoZmxvYXQpIDAuNzUsIGVkaXRvckFyZWEpOyAvLyROT04tTkxTLTEkCi0JCW91dGxpbmVGb2xkZXIuYWRkVmlldygib3JnLmVjbGlwc2UuanB0LnVpLmpwYVN0cnVjdHVyZVZpZXciKTsKKwkJb3V0bGluZUZvbGRlci5hZGRWaWV3KCJvcmcuZWNsaXBzZS5qcHQudWkuanBhU3RydWN0dXJlVmlldyIpOyAvLyROT04tTkxTLTEkCiAJCW91dGxpbmVGb2xkZXIuYWRkVmlldyhJUGFnZUxheW91dC5JRF9PVVRMSU5FKTsKLQotCQlsYXlvdXQuYWRkQWN0aW9uU2V0KEphdmFVSS5JRF9BQ1RJT05fU0VUKTsKLQkJbGF5b3V0LmFkZEFjdGlvblNldChKYXZhVUkuSURfRUxFTUVOVF9DUkVBVElPTl9BQ1RJT05fU0VUKTsKLQkJbGF5b3V0LmFkZEFjdGlvblNldChJUGFnZUxheW91dC5JRF9OQVZJR0FURV9BQ1RJT05fU0VUKTsKLQotCQkvLyB2aWV3cyAtIGphdmEKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSmF2YVVJLklEX1BBQ0tBR0VTKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSmF2YVVJLklEX1RZUEVfSElFUkFSQ0hZKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSmF2YVVJLklEX1NPVVJDRV9WSUVXKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSmF2YVVJLklEX0pBVkFET0NfVklFVyk7Ci0KLQkJLy8gdmlld3MgLSBzdGFuZGFyZCB3b3JrYmVuY2gKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoUHJvamVjdEV4cGxvcmVyLlZJRVdfSUQpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9PVVRMSU5FKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfUkVTX05BVik7Ci0KLQkJLy8gbmV3IGFjdGlvbnMgLSBKYXZhIHByb2plY3QgY3JlYXRpb24gd2l6YXJkCi0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2UuanB0LnVpLndpemFyZC5uZXdKcGFQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdQYWNrYWdlQ3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0NsYXNzQ3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0ludGVyZmFjZUNyZWF0aW9uV2l6YXJkIik7IC8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdFbnVtQ3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0Fubm90YXRpb25DcmVhdGlvbldpemFyZCIpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3U291cmNlRm9sZGVyQ3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld1NuaXBwZXRGaWxlQ3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZvbGRlciIpOy8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ldy5maWxlIik7Ly8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLnVpLmVkaXRvcnMud2l6YXJkcy5VbnRpdGxlZFRleHRGaWxlV2l6YXJkIik7Ly8kTk9OLU5MUy0xJAogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVWlSZWdpc3RyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5LmphdmEKaW5kZXggMjY5NDM3My4uMjU1YWMyZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCiAgKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgogICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwogICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbApAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKQEAgLTM2LDc3ICszNywxMDAgQEAKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0lEID0gCi0JCSJqcGFQbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKKwkJImpwYVBsYXRmb3JtVWlzIjsgLy8kTk9OLU5MUy0xJAogCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9QTEFURk9STSA9Ci0JCSJqcGFQbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1BMQVRGT1JNX1VJID0KKwkJImpwYVBsYXRmb3JtVWkiOyAvLyROT04tTkxTLTEkCQogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUX0lEID0KIAkJImlkIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVF9DTEFTUyA9Ci0JCSJjbGFzcyI7IC8vJE5PTi1OTFMtMSQJCi0JCQotCS8vIGtleTogU3RyaW5nIGpwYVBsYXRmb3JtIGlkICB2YWx1ZTogSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNsYXNzIGRlc2NyaXB0b3IKLQlwcml2YXRlIE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4ganBhUGxhdGZvcm1zOwogCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVF9KUEFfUExBVEZPUk0gPQorCQkianBhUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUX0ZBQ1RPUllfQ0xBU1MgPQorCQkiZmFjdG9yeUNsYXNzIjsgLy8kTk9OLU5MUy0xJAkKKwkJCisJLy8ga2V5OiBTdHJpbmcgaWQgIHZhbHVlOiBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2xhc3MgZGVzY3JpcHRvcgorCXByaXZhdGUgTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb25FbGVtZW50PiBqcGFQbGF0Zm9ybVVpQ29uZmlnRWxlbWVudHM7CisJCisJLy9jYWNoZSB0aGUganBhUGxhdGZvcm1VaXMgd2hlbiB0aGV5IGFyZSBidWlsdAorCS8va2V5OiBqcGEgcGxhdGZvcm0gaWQgIHZhbHVlOiBKcGFQbGFmb3JtVWkKKwlwcml2YXRlIE1hcDxTdHJpbmcsIEpwYVBsYXRmb3JtVWk+IGpwYVBsYXRmb3JtVWlzOwogCQogCS8qIChub24gSmF2YSBkb2MpCiAJICogcmVzdHJpY3QgYWNjZXNzCiAJICovCiAJcHJpdmF0ZSBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkoKSB7Ci0JCWJ1aWxkSnBhUGxhdGZvcm1zKCk7CisJCWJ1aWxkSnBhUGxhdGZvcm1VaUNvbmZpZ0VsZW1lbnRzKCk7CisJCXRoaXMuanBhUGxhdGZvcm1VaXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpwYVBsYXRmb3JtVWk+KCk7CiAJfQogCQogCQotCXByaXZhdGUgdm9pZCBidWlsZEpwYVBsYXRmb3JtcygpIHsKLQkJdGhpcy5qcGFQbGF0Zm9ybXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKKwlwcml2YXRlIHZvaWQgYnVpbGRKcGFQbGF0Zm9ybVVpQ29uZmlnRWxlbWVudHMoKSB7CisJCXRoaXMuanBhUGxhdGZvcm1VaUNvbmZpZ0VsZW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7CiAJCQogCQlmb3IgKEl0ZXJhdG9yPElDb25maWd1cmF0aW9uRWxlbWVudD4gc3RyZWFtID0gYWxsQ29uZmlnRWxlbWVudHMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlidWlsZEpwYVBsYXRmb3JtKHN0cmVhbS5uZXh0KCkpOworCQkJYnVpbGRKcGFQbGF0Zm9ybVVpKHN0cmVhbS5uZXh0KCkpOwogCQl9CiAJfQogCQotCXByaXZhdGUgdm9pZCBidWlsZEpwYVBsYXRmb3JtKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCWlmICghIGNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFTF9QTEFURk9STSkpIHsKKwlwcml2YXRlIHZvaWQgYnVpbGRKcGFQbGF0Zm9ybVVpKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7CisJCWlmICghIGNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFTF9QTEFURk9STV9VSSkpIHsKIAkJCXJldHVybjsKIAkJfQogCQkKLQkJU3RyaW5nIHBsYXRmb3JtSWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVF9JRCk7Ci0JCVN0cmluZyBwbGF0Zm9ybUNsYXNzID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfQ0xBU1MpOworCQlTdHJpbmcgcGxhdGZvcm1VaUlkID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfSUQpOworCQlTdHJpbmcgcGxhdGZvcm0gPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVF9KUEFfUExBVEZPUk0pOworCQlTdHJpbmcgcGxhdGZvcm1VaUZhY3RvcnlDbGFzcyA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0ZBQ1RPUllfQ0xBU1MpOwogCQkKLQkJaWYgKChwbGF0Zm9ybUlkID09IG51bGwpIHx8IChwbGF0Zm9ybUNsYXNzID09IG51bGwpKSB7Ci0JCQlpZiAocGxhdGZvcm1JZCA9PSBudWxsKSB7CisJCWlmICgocGxhdGZvcm1VaUlkID09IG51bGwpIHx8IChwbGF0Zm9ybVVpRmFjdG9yeUNsYXNzID09IG51bGwpKSB7CisJCQlpZiAocGxhdGZvcm1VaUlkID09IG51bGwpIHsKIAkJCQlyZXBvcnRNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUX0lEKTsKIAkJCX0KLQkJCWlmIChwbGF0Zm9ybUNsYXNzID09IG51bGwpIHsKLQkJCQlyZXBvcnRNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUX0NMQVNTKTsKKwkJCWlmIChwbGF0Zm9ybSA9PSBudWxsKSB7CisJCQkJcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZShjb25maWdFbGVtZW50LCBBVF9KUEFfUExBVEZPUk0pOworCQkJfQorCQkJaWYgKHBsYXRmb3JtVWlGYWN0b3J5Q2xhc3MgPT0gbnVsbCkgeworCQkJCXJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoY29uZmlnRWxlbWVudCwgQVRfRkFDVE9SWV9DTEFTUyk7CiAJCQl9CiAJCQlyZXR1cm47CiAJCX0KIAkJCi0JCWlmICh0aGlzLmpwYVBsYXRmb3Jtcy5jb250YWluc0tleShwbGF0Zm9ybUlkKSkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IG90aGVyQ29uZmlnRWxlbWVudCA9IHRoaXMuanBhUGxhdGZvcm1zLmdldChwbGF0Zm9ybUlkKTsKLQkJCXJlcG9ydER1cGxpY2F0ZVBsYXRmb3JtKGNvbmZpZ0VsZW1lbnQsIG90aGVyQ29uZmlnRWxlbWVudCk7CisJCWlmICh0aGlzLmpwYVBsYXRmb3JtVWlDb25maWdFbGVtZW50cy5jb250YWluc0tleShwbGF0Zm9ybVVpSWQpKSB7CisJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgb3RoZXJDb25maWdFbGVtZW50ID0gdGhpcy5qcGFQbGF0Zm9ybVVpQ29uZmlnRWxlbWVudHMuZ2V0KHBsYXRmb3JtKTsKKwkJCXJlcG9ydER1cGxpY2F0ZVBsYXRmb3JtVWkoY29uZmlnRWxlbWVudCwgb3RoZXJDb25maWdFbGVtZW50KTsKIAkJfQogCQkKLQkJdGhpcy5qcGFQbGF0Zm9ybXMucHV0KHBsYXRmb3JtSWQsIGNvbmZpZ0VsZW1lbnQpOworCQl0aGlzLmpwYVBsYXRmb3JtVWlDb25maWdFbGVtZW50cy5wdXQocGxhdGZvcm1VaUlkLCBjb25maWdFbGVtZW50KTsKIAl9CiAJCi0JcHVibGljIEpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm0oU3RyaW5nIHBsYXRmb3JtSWQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IHJlZ2lzdGVyZWRDb25maWdFbGVtZW50ID0gdGhpcy5qcGFQbGF0Zm9ybXMuZ2V0KHBsYXRmb3JtSWQpOworCXB1YmxpYyBKcGFQbGF0Zm9ybVVpIGdldEpwYVBsYXRmb3JtVWkoU3RyaW5nIHBsYXRmb3JtSWQpIHsKKwkJaWYgKHRoaXMuanBhUGxhdGZvcm1VaXMuY29udGFpbnNLZXkocGxhdGZvcm1JZCkpIHsKKwkJCXJldHVybiB0aGlzLmpwYVBsYXRmb3JtVWlzLmdldChwbGF0Zm9ybUlkKTsKKwkJfQorCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgcmVnaXN0ZXJlZENvbmZpZ0VsZW1lbnQgPSBudWxsOworCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA6IHRoaXMuanBhUGxhdGZvcm1VaUNvbmZpZ0VsZW1lbnRzLnZhbHVlcygpKSB7CisJCQlpZiAoY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0pQQV9QTEFURk9STSkuZXF1YWxzKHBsYXRmb3JtSWQpKSB7CisJCQkJcmVnaXN0ZXJlZENvbmZpZ0VsZW1lbnQgPSBjb25maWd1cmF0aW9uRWxlbWVudDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQogCQkKIAkJaWYgKHJlZ2lzdGVyZWRDb25maWdFbGVtZW50ID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCQorCQlKcGFQbGF0Zm9ybVVpRmFjdG9yeSBqcGFQbGF0Zm9ybVVpRmFjdG9yeTsKIAkJdHJ5IHsKLQkJCXJldHVybiAoSnBhUGxhdGZvcm1VaSkgcmVnaXN0ZXJlZENvbmZpZ0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVF9DTEFTUyk7CisJCQlqcGFQbGF0Zm9ybVVpRmFjdG9yeSA9IChKcGFQbGF0Zm9ybVVpRmFjdG9yeSkgcmVnaXN0ZXJlZENvbmZpZ0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVF9GQUNUT1JZX0NMQVNTKTsKIAkJfQogCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewogCQkJcmVwb3J0RmFpbGVkSW5zdGFudGlhdGlvbihyZWdpc3RlcmVkQ29uZmlnRWxlbWVudCk7Ci0JCQlyZXR1cm4gbnVsbDsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocGxhdGZvcm1JZCk7CiAJCX0KKwkJSnBhUGxhdGZvcm1VaSBwbGF0Zm9ybVVpID0ganBhUGxhdGZvcm1VaUZhY3RvcnkuYnVpbGRKcGFQbGF0Zm9ybVVpKCk7CisJCXRoaXMuanBhUGxhdGZvcm1VaXMucHV0KHBsYXRmb3JtSWQsIHBsYXRmb3JtVWkpOworCQlyZXR1cm4gcGxhdGZvcm1VaTsKIAl9CiAJCiAJcHJpdmF0ZSBJdGVyYXRvcjxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGFsbENvbmZpZ0VsZW1lbnRzKCkgewpAQCAtMTM5LDcgKzE2Myw3IEBACiAJfQogCQogCS8vIFRPRE8gZXh0ZXJuYWxpemUgc3RyaW5ncwotCXByaXZhdGUgdm9pZCByZXBvcnREdXBsaWNhdGVQbGF0Zm9ybSgKKwlwcml2YXRlIHZvaWQgcmVwb3J0RHVwbGljYXRlUGxhdGZvcm1VaSgKIAkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBvbmVDb25maWdFbGVtZW50LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgb3RoZXJDb25maWdFbGVtZW50KSB7CiAJCVN0cmluZyBtZXNzYWdlID0KIAkJCSJUaGUgcGx1Z2lucyBcIiIKQEAgLTE0Nyw3ICsxNzEsNyBAQAogCQkJKyAiXCIgYW5kIFwiIgogCQkJKyBvdGhlckNvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkKIAkJCSsgIlwiIGhhdmUgcmVnaXN0ZXJlZCBhIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgXCJpZFwiICIKLQkJCSsgImZvciB0aGUgZXh0ZW5zaW9uIGVsZW1lbnQgXCJqcGFQbGF0Zm9ybVwiLiI7CisJCQkrICJmb3IgdGhlIGV4dGVuc2lvbiBlbGVtZW50IFwianBhUGxhdGZvcm1VaVwiLiI7CiAJCUpwdFVpUGx1Z2luLmxvZyhtZXNzYWdlKTsKIAl9CiAJCQpAQCAtMTU1LDcgKzE3OSw3IEBACiAJcHJpdmF0ZSB2b2lkIHJlcG9ydEZhaWxlZEluc3RhbnRpYXRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKIAkJU3RyaW5nIG1lc3NhZ2UgPQogCQkJIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSB0aGUgY2xhc3MgXCIiCi0JCQkrIGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0NMQVNTKQorCQkJKyBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVF9GQUNUT1JZX0NMQVNTKQogCQkJKyAiXCIgZm9yIHRoZSBleHRlbnNpb24gZWxlbWVudCBcIiIKIAkJCSsgY29uZmlnRWxlbWVudC5nZXROYW1lKCkKIAkJCSsgIlwiIGluIHRoZSBwbHVnaW4gXCIiCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9iYXNlL0Jhc2VKcGFQbGF0Zm9ybVVpLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9iYXNlL0Jhc2VKcGFQbGF0Zm9ybVVpLmphdmEKaW5kZXggM2ExMzUxMS4uN2EyYzk4MiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vYmFzZS9CYXNlSnBhUGxhdGZvcm1VaS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2Jhc2UvQmFzZUpwYVBsYXRmb3JtVWkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDI4NCArOSwxNzkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5iYXNlOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUmVzb3VyY2VUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVBsYXRmb3JtVWlQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLk1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuUmVzb3VyY2VVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5UeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzaWNNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRhYmxlVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JZE1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9PbmVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5NYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5PbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlRyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlZlcnNpb25NYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLkRlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5KYXZhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSmF2YUVudGl0eVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5OdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5OdWxsVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5vcm0uZGV0YWlscy5Pcm1EZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm9ybS5kZXRhaWxzLk9ybUVudGl0eVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZS5KYXZhUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSnBhUGxhdGZvcm1VaSBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWkKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSnBhUGxhdGZvcm1VaQorCWltcGxlbWVudHMgSnBhUGxhdGZvcm1VaQogewotCS8vIFRPRE86IFRyYW5zZm9ybWVkIGludG8gYSBMaXN0IGZvciB0ZXN0aW5nCi0JcHJpdmF0ZSBMaXN0PEpwYURldGFpbHNQcm92aWRlcj4gZGV0YWlsc1Byb3ZpZGVyczsKLQotCXByaXZhdGUgTGlzdDxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gamF2YVR5cGVNYXBwaW5nVWlQcm92aWRlcnM7Ci0JcHJpdmF0ZSBMaXN0PEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gamF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyczsKLQlwcml2YXRlIExpc3Q8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyczsKLQotCXByaXZhdGUgTGlzdDxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gb3JtVHlwZU1hcHBpbmdVaVByb3ZpZGVyczsKLQlwcml2YXRlIExpc3Q8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBvcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnM7Ci0JcHJpdmF0ZSBMaXN0PEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmYXVsdE9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyczsKLQotCXByaXZhdGUgSnBhVWlGYWN0b3J5IGpwYVVpRmFjdG9yeTsKLQotCi0JcHJvdGVjdGVkIEJhc2VKcGFQbGF0Zm9ybVVpKCkgeworCXByaXZhdGUgZmluYWwgSnBhTmF2aWdhdG9yUHJvdmlkZXIgbmF2aWdhdG9yUHJvdmlkZXI7CisJCisJcHJpdmF0ZSBmaW5hbCBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgcGxhdGZvcm1VaVByb3ZpZGVyOworCQorCQorCXByb3RlY3RlZCBCYXNlSnBhUGxhdGZvcm1VaSgKKwkJCUpwYU5hdmlnYXRvclByb3ZpZGVyIG5hdmlnYXRvclByb3ZpZGVyLCBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgcGxhdGZvcm1VaVByb3ZpZGVyKSB7CisJCQogCQlzdXBlcigpOwotCQl0aGlzLmpwYVVpRmFjdG9yeSA9IGNyZWF0ZUpwYVVpRmFjdG9yeSgpOworCQl0aGlzLm5hdmlnYXRvclByb3ZpZGVyID0gbmF2aWdhdG9yUHJvdmlkZXI7CisJCXRoaXMucGxhdGZvcm1VaVByb3ZpZGVyID0gcGxhdGZvcm1VaVByb3ZpZGVyOwogCX0KLQotCi0JLy8gKioqKioqKioqKioqKioqKiBzdHJ1Y3R1cmUgdmlldyBjb250ZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGJ1aWxkU3RydWN0dXJlUHJvdmlkZXIoSnBhRmlsZSBqcGFGaWxlKSB7Ci0JCVJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCA9IGpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpOwotCQlTdHJpbmcgcmVzb3VyY2VUeXBlID0gcmVzb3VyY2VNb2RlbC5nZXRSZXNvdXJjZVR5cGUoKTsKLQotCQlpZiAocmVzb3VyY2VUeXBlID09IFJlc291cmNlTW9kZWwuSkFWQV9SRVNPVVJDRV9UWVBFKSB7Ci0JCQlyZXR1cm4gbmV3IEphdmFSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKEphdmFSZXNvdXJjZU1vZGVsKSByZXNvdXJjZU1vZGVsKTsKKwkKKwkKKwkvLyAqKioqKioqKioqIG5hdmlnYXRvciBwcm92aWRlciAqKioqKioqKioqCisJCisJcHVibGljIEpwYU5hdmlnYXRvclByb3ZpZGVyIGdldE5hdmlnYXRvclByb3ZpZGVyKCkgeworCQlyZXR1cm4gdGhpcy5uYXZpZ2F0b3JQcm92aWRlcjsKKwl9CisJCisJCisJLy8gKioqKioqKioqKiBzdHJ1Y3R1cmUgcHJvdmlkZXJzICoqKioqKioqKioKKwkKKwlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoSnBhRmlsZSBqcGFGaWxlKSB7CisJCXJldHVybiBnZXRTdHJ1Y3R1cmVQcm92aWRlcihqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKS5nZXRSZXNvdXJjZVR5cGUoKSk7CisJfQorCQorCXByb3RlY3RlZCBKcGFTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcihKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7CisJCVJlc291cmNlVWlEZWZpbml0aW9uIHJlc291cmNlVWlEZWZpbml0aW9uOworCQl0cnkgeworCQkJcmVzb3VyY2VVaURlZmluaXRpb24gPSBnZXRSZXNvdXJjZVVpRGVmaW5pdGlvbihyZXNvdXJjZVR5cGUpOwogCQl9Ci0JCWVsc2UgaWYgKHJlc291cmNlVHlwZSA9PSBSZXNvdXJjZU1vZGVsLk9STV9SRVNPVVJDRV9UWVBFKSB7Ci0JCQlyZXR1cm4gbmV3IE9ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcigoT3JtUmVzb3VyY2VNb2RlbCkgcmVzb3VyY2VNb2RlbCk7CisJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisJCQlKcHRVaVBsdWdpbi5sb2coaWFlKTsKKwkJCXJldHVybiBudWxsOwogCQl9Ci0JCWVsc2UgaWYgKHJlc291cmNlVHlwZSA9PSBSZXNvdXJjZU1vZGVsLlBFUlNJU1RFTkNFX1JFU09VUkNFX1RZUEUpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbCkgcmVzb3VyY2VNb2RlbCk7CisJCXJldHVybiByZXNvdXJjZVVpRGVmaW5pdGlvbi5nZXRTdHJ1Y3R1cmVQcm92aWRlcigpOworCX0KKwkKKwkKKwkvLyAqKioqKioqKioqIGRldGFpbHMgcHJvdmlkZXJzICoqKioqKioqKioKKwkKKwlwdWJsaWMgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkSnBhRGV0YWlsc1BhZ2UoCisJCQlDb21wb3NpdGUgcGFyZW50LCBKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQkKKwkJSnBhRGV0YWlsc1Byb3ZpZGVyIGpwYURldGFpbHNQcm92aWRlciA9IGdldERldGFpbHNQcm92aWRlcihzdHJ1Y3R1cmVOb2RlKTsKKwkJcmV0dXJuIGpwYURldGFpbHNQcm92aWRlciA9PSBudWxsID8gbnVsbCA6IGpwYURldGFpbHNQcm92aWRlci5idWlsZERldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXByb3RlY3RlZCBKcGFEZXRhaWxzUHJvdmlkZXIgZ2V0RGV0YWlsc1Byb3ZpZGVyKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgeworCQlmb3IgKEpwYURldGFpbHNQcm92aWRlciBwcm92aWRlciA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmRldGFpbHNQcm92aWRlcnMoKSkpIHsKKwkJCWlmIChwcm92aWRlci5wcm92aWRlc0RldGFpbHMoc3RydWN0dXJlTm9kZSkpIHsKKwkJCQlyZXR1cm4gcHJvdmlkZXI7CisJCQl9CiAJCX0KLQotCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIG51bGw7Ly9yZXR1cm4gbnVsbCwgc29tZSBzdHJ1Y3R1cmUgbm9kZXMgZG8gbm90IGhhdmUgYSBkZXRhaWxzIHBhZ2UKIAl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEpwYVVpRmFjdG9yeSBjcmVhdGVKcGFVaUZhY3RvcnkoKTsKLQotCXB1YmxpYyBKcGFVaUZhY3RvcnkgZ2V0SnBhVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy5qcGFVaUZhY3Rvcnk7CisJCisJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKcGFEZXRhaWxzUHJvdmlkZXI+IGRldGFpbHNQcm92aWRlcnMoKSB7CisJCXJldHVybiB0aGlzLnBsYXRmb3JtVWlQcm92aWRlci5kZXRhaWxzUHJvdmlkZXJzKCk7CiAJfQotCi0JcHVibGljIEl0ZXJhdG9yPEpwYURldGFpbHNQcm92aWRlcj4gZGV0YWlsc1Byb3ZpZGVycygpIHsKLQkJaWYgKHRoaXMuZGV0YWlsc1Byb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQl0aGlzLmRldGFpbHNQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PEpwYURldGFpbHNQcm92aWRlcj4oKTsKLQkJCXRoaXMuYWRkRGV0YWlsc1Byb3ZpZGVyc1RvKHRoaXMuZGV0YWlsc1Byb3ZpZGVycyk7CisJCisJCisJLy8gKioqKioqKioqKiBtYXBwaW5nIHVpIGRlZmluaXRpb25zICoqKioqKioqKioKKwkKKwlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCisJCQlKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlLCAKKwkJCVN0cmluZyBtYXBwaW5nS2V5LCAKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsIAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFR5cGVNYXBwaW5nPiBtYXBwaW5nSG9sZGVyLCAKKwkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgeworCQkKKwkJcmV0dXJuIGdldE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbihyZXNvdXJjZVR5cGUpLmJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCisJCQkJbWFwcGluZ0tleSwgbWFwcGluZ0hvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisJCisJcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCisJCQlKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlLCAKKwkJCVN0cmluZyBtYXBwaW5nS2V5LCAKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsIAorCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXIsIAorCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisJCQorCQlyZXR1cm4gZ2V0TWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uKHJlc291cmNlVHlwZSkuYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAorCQkJCW1hcHBpbmdLZXksIG1hcHBpbmdIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7CisJfQorCQorCXB1YmxpYyBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gZ2V0RGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSwgU3RyaW5nIG1hcHBpbmdLZXkpIHsKKwkJcmV0dXJuIGdldE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbihyZXNvdXJjZVR5cGUpLmdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKG1hcHBpbmdLZXkpOworCX0KKwkKKwlwdWJsaWMgSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBhdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucyhKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7CisJCXJldHVybiBnZXRNYXBwaW5nUmVzb3VyY2VVaURlZmluaXRpb24ocmVzb3VyY2VUeXBlKS5hdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpOworCX0KKwkKKwlwdWJsaWMgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPiBnZXREZWZhdWx0VHlwZU1hcHBpbmdVaURlZmluaXRpb24oSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgeworCQlyZXR1cm4gZ2V0TWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uKHJlc291cmNlVHlwZSkuZ2V0RGVmYXVsdFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKCk7CisJfQorCQorCXB1YmxpYyBJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiB0eXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgeworCQlyZXR1cm4gZ2V0TWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uKHJlc291cmNlVHlwZSkudHlwZU1hcHBpbmdVaURlZmluaXRpb25zKCk7CisJfQorCQorCQorCS8vICoqKioqKioqKiogcmVzb3VyY2UgdWkgZGVmaW5pdGlvbnMgKioqKioqKioqKgorCQorCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UmVzb3VyY2VVaURlZmluaXRpb24+IHJlc291cmNlVWlEZWZpbml0aW9ucygpIHsKKwkJcmV0dXJuIHRoaXMucGxhdGZvcm1VaVByb3ZpZGVyLnJlc291cmNlVWlEZWZpbml0aW9ucygpOworCX0KKwkKKwlwdWJsaWMgUmVzb3VyY2VVaURlZmluaXRpb24gZ2V0UmVzb3VyY2VVaURlZmluaXRpb24oSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgeworCQlmb3IgKFJlc291cmNlVWlEZWZpbml0aW9uIGRlZmluaXRpb24gOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5yZXNvdXJjZVVpRGVmaW5pdGlvbnMoKSkpIHsKKwkJCWlmIChkZWZpbml0aW9uLnByb3ZpZGVzVWkocmVzb3VyY2VUeXBlKSkgeworCQkJCXJldHVybiBkZWZpbml0aW9uOworCQkJfQogCQl9Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxKcGFEZXRhaWxzUHJvdmlkZXI+KHRoaXMuZGV0YWlsc1Byb3ZpZGVycyk7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIHJlc291cmNlIHVpIGRlZmluaXRpb24gZm9yIHRoZSByZXNvdXJjZSB0eXBlOiAiICsgcmVzb3VyY2VUeXBlKTsgLy8kTk9OLU5MUy0xJAogCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc3BlY2lmeSBtb3JlIG9yIGRpZmZlcmVudCBkZXRhaWxzIHByb3ZpZGVycy4KLQkgKiBUaGUgZGVmYXVsdCBpbmNsdWRlcyB0aGUgSlBBIHNwZWMtZGVmaW5lZCBqYXZhIGFuZCBvcm0ueG1sCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGV0YWlsc1Byb3ZpZGVyc1RvKENvbGxlY3Rpb248SnBhRGV0YWlsc1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJcHJvdmlkZXJzLmFkZChuZXcgSmF2YURldGFpbHNQcm92aWRlcigpKTsKLQkJcHJvdmlkZXJzLmFkZChuZXcgT3JtRGV0YWlsc1Byb3ZpZGVyKCkpOwotCX0KLQotCXB1YmxpYyBKcGFEZXRhaWxzUHJvdmlkZXIgZGV0YWlsc1Byb3ZpZGVyKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgewotCQkvLyBUT0RPOiBUbyBpbXBsZW1lbnQsIHRoaXMgaXMgd3JpdHRlbiBvbmx5IGZvciB0ZXN0aW5nCi0JCWRldGFpbHNQcm92aWRlcnMoKTsKLQkJaWYgKHN0cnVjdHVyZU5vZGUgaW5zdGFuY2VvZiBKYXZhSnBhQ29udGV4dE5vZGUpIHsKLQkJCXJldHVybiBkZXRhaWxzUHJvdmlkZXJzLmdldCgwKTsKKwkKKwlwdWJsaWMgTWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uIGdldE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbihKcGFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gKE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbikgZ2V0UmVzb3VyY2VVaURlZmluaXRpb24ocmVzb3VyY2VUeXBlKTsKIAkJfQotCQllbHNlIHsKLQkJCXJldHVybiBkZXRhaWxzUHJvdmlkZXJzLmdldCgxKTsKKwkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIG1hcHBpbmcgcmVzb3VyY2UgdWkgZGVmaW5pdGlvbiBmb3IgdGhlIHJlc291cmNlIHR5cGU6ICIgKyByZXNvdXJjZVR5cGUsIGNjZSk7IC8vJE5PTi1OTFMtMSQKIAkJfQotLy8JCWZvciAoSXRlcmF0b3I8SUpwYURldGFpbHNQcm92aWRlcj4gaSA9IHRoaXMuZGV0YWlsc1Byb3ZpZGVycygpOyBpLmhhc05leHQoKTsgKSB7Ci0vLwkJCUlKcGFEZXRhaWxzUHJvdmlkZXIgcHJvdmlkZXIgPSBpLm5leHQoKTsKLS8vCQkJaWYgKHByb3ZpZGVyLmZpbGVDb250ZW50VHlwZSgpLmVxdWFscyhmaWxlQ29udGVudFR5cGUpKSB7Ci0vLwkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIG51bGw7CiAJfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gamF2YVR5cGVNYXBwaW5nVWlQcm92aWRlcnMoKSB7Ci0JCWlmICh0aGlzLmphdmFUeXBlTWFwcGluZ1VpUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCXRoaXMuamF2YVR5cGVNYXBwaW5nVWlQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PigpOwotCQkJdGhpcy5hZGRKYXZhVHlwZU1hcHBpbmdVaVByb3ZpZGVyc1RvKHRoaXMuamF2YVR5cGVNYXBwaW5nVWlQcm92aWRlcnMpOwotCQl9Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8VHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+KAotCQkJdGhpcy5qYXZhVHlwZU1hcHBpbmdVaVByb3ZpZGVycwotCQkpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc3BlY2lmeSBtb3JlIG9yIGRpZmZlcmVudCB0eXBlIG1hcHBpbmcgdWkgcHJvdmlkZXJzCi0JICogVGhlIGRlZmF1bHQgaW5jbHVkZXMgdGhlIEpQQSBzcGVjLWRlZmluZWQgZW50aXR5LCBtYXBwZWQgc3VwZXJjbGFzcywgZW1iZWRkYWJsZSwKLQkgKiBhbmQgbnVsbCAod2hlbiB0aGUgb3RoZXJzIGRvbid0IGFwcGx5KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFUeXBlTWFwcGluZ1VpUHJvdmlkZXJzVG8oTGlzdDxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gcHJvdmlkZXJzKSB7Ci0JCXByb3ZpZGVycy5hZGQoTnVsbFR5cGVNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhRW50aXR5VWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChNYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbWJlZGRhYmxlVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gamF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpIHsKLQkJaWYgKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4oKTsKLQkJCXRoaXMuYWRkSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyc1RvKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycyk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4oCi0JCQl0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgbW9yZSBvciBkaWZmZXJlbnQgamF2YSBhdHRyaWJ1dGUgbWFwcGluZyB1aSBwcm92aWRlcnMuCi0JICogVGhlIGRlZmF1bHQgaW5jbHVkZXMgdGhlIEpQQSBzcGVjLWRlZmluZWQgYmFzaWMsIGVtYmVkZGVkLCBlbWJlZGRlZElkLCBpZCwKLQkgKiBtYW55VG9NYW55LCBtYW55VG9PbmUsIG9uZVRvTWFueSwgb25lVG9PbmUsIHRyYW5zaWVudCwgYW5kIHZlcnNpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzVG8oTGlzdDxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSWRNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoTnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpIHsKLQkJaWYgKHRoaXMuZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJdGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PigpOwotCQkJdGhpcy5hZGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyc1RvKHRoaXMuZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+KAotCQkJdGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycwotCQkpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc3BlY2lmeSBtb3JlIG9yIGRpZmZlcmVudCBkZWZhdWx0IGphdmEgYXR0cmlidXRlIG1hcHBpbmcgdWkgcHJvdmlkZXJzLgotCSAqIFRoZSBkZWZhdWx0IGluY2x1ZGVzIHRoZSBKUEEgc3BlYy1kZWZpbmVkIGJhc2ljLCBlbWJlZGRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzVG8oTGlzdDxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKERlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQorCQorCQorCS8vICoqKioqKioqKiogZW50aXR5IGdlbmVyYXRpb24gKioqKioqKioqKgorCQogCXB1YmxpYyB2b2lkIGdlbmVyYXRlRW50aXRpZXMoSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJRW50aXRpZXNHZW5lcmF0b3IuZ2VuZXJhdGUocHJvamVjdCwgc2VsZWN0aW9uKTsKKwkJLy9FbnRpdGllc0dlbmVyYXRvci5nZW5lcmF0ZShwcm9qZWN0LCBzZWxlY3Rpb24pOworCQlFbnRpdGllc0dlbmVyYXRvcjIuZ2VuZXJhdGUocHJvamVjdCwgc2VsZWN0aW9uKTsKIAl9Ci0KLQkvLyAqKioqKioqKioqKioqKiogT1JNIG1hcHBpbmcgVUkgcHJvdmlkZXJzICoqKioqKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmYXVsdE9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpIHsKLQkJaWYgKHRoaXMuZGVmYXVsdE9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQl0aGlzLmRlZmF1bHRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4oKTsKLQkJCXRoaXMuYWRkRGVmYXVsdE9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyc1RvKHRoaXMuZGVmYXVsdE9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycyk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4oCi0JCQl0aGlzLmRlZmF1bHRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMKLQkJKTsKKwkKKwkKKwkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgorCQorCXByb3RlY3RlZCB2b2lkIGRpc3BsYXlNZXNzYWdlKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkgICAgU2hlbGwgY3VycmVudFNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKKwkgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oY3VycmVudFNoZWxsLCB0aXRsZSwgbWVzc2FnZSk7CiAJfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyB0byBzcGVjaWZ5IG1vcmUgb3IgZGlmZmVyZW50IGRlZmF1bHQgT1JNIGF0dHJpYnV0ZSBtYXBwaW5nCi0JICogdWkgcHJvdmlkZXJzLiBUaGUgZGVmYXVsdCBoYXMgbm8gc3BlY2lmaWMgbWFwcGluZ3MuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdE9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyc1RvKExpc3Q8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBwcm92aWRlcnMpIHsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBvcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKSB7Ci0JCWlmICh0aGlzLm9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQl0aGlzLm9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PigpOwotCQkJdGhpcy5hZGRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnNUbyh0aGlzLm9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycyk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4oCi0JCQl0aGlzLm9ybUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycwotCQkpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gc3BlY2lmeSBtb3JlIG9yIGRpZmZlcmVudCBPUk0gYXR0cmlidXRlIG1hcHBpbmcgdWkKLQkgKiBwcm92aWRlcnMuIFRoZSBkZWZhdWx0IGluY2x1ZGVzIHRoZSBKUEEgc3BlYy1kZWZpbmVkIGJhc2ljLCBlbWJlZGRlZCwKLQkgKiBlbWJlZGRlZElkLCBpZCwgbWFueVRvTWFueSwgbWFueVRvT25lLCBvbmVUb01hbnksIG9uZVRvT25lLCB0cmFuc2llbnQsCi0JICogYW5kIHZlcnNpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzVG8oTGlzdDxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSWRNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChWZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFR5cGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBvcm1UeXBlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlpZiAodGhpcy5vcm1UeXBlTWFwcGluZ1VpUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCXRoaXMub3JtVHlwZU1hcHBpbmdVaVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8VHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+KCk7Ci0JCQl0aGlzLmFkZE9ybVR5cGVNYXBwaW5nVWlQcm92aWRlcnNUbyh0aGlzLm9ybVR5cGVNYXBwaW5nVWlQcm92aWRlcnMpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4oCi0JCQl0aGlzLm9ybVR5cGVNYXBwaW5nVWlQcm92aWRlcnMKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgbW9yZSBvciBkaWZmZXJlbnQgT1JNIHR5cGUgbWFwcGluZyB1aSBwcm92aWRlcnMuCi0JICogVGhlIGRlZmF1bHQgaW5jbHVkZXMgdGhlIEpQQSBzcGVjLWRlZmluZWQgZW50aXR5LCBtYXBwZWQgc3VwZXJjbGFzcywKLQkgKiBlbWJlZGRhYmxlLCBhbmQgbnVsbCAod2hlbiB0aGUgb3RoZXJzIGRvbid0IGFwcGx5KS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1UeXBlTWFwcGluZ1VpUHJvdmlkZXJzVG8oTGlzdDxUeXBlTWFwcGluZ1VpUHJvdmlkZXI8PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gcHJvdmlkZXJzKSB7Ci0JCXByb3ZpZGVycy5hZGQoT3JtRW50aXR5VWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChNYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbWJlZGRhYmxlVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vYmFzZS9FbnRpdGllc0dlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vYmFzZS9FbnRpdGllc0dlbmVyYXRvci5qYXZhCmluZGV4IDZkMjdiZGQuLmM5NTg5MTUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2Jhc2UvRW50aXRpZXNHZW5lcmF0b3IuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9iYXNlL0VudGl0aWVzR2VuZXJhdG9yLmphdmEKQEAgLTEsMTUgKzEsMTQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5iYXNlOwogCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwpAQCAtMjUsOSArMjQsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5zeW5jaC5TeW5jaHJvbml6ZUNsYXNzZXNKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuRW50aXR5R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuUGFja2FnZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLm9sZC5FbnRpdHlHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5vbGQuUGFja2FnZUdlbmVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CkBAIC00Myw2MSArNDEsNjUgQEAKIC8qKgogICogIEVudGl0aWVzR2VuZXJhdG9yCiAgKi8KLXB1YmxpYyBjbGFzcyBFbnRpdGllc0dlbmVyYXRvcgoteworcHVibGljIGNsYXNzIEVudGl0aWVzR2VuZXJhdG9yIHsKIAlwcml2YXRlIEpwYVByb2plY3QgcHJvamVjdDsKIAlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKIAotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKIAotCXN0YXRpYyBwdWJsaWMgdm9pZCBnZW5lcmF0ZSggSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYocHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQluZXcgRW50aXRpZXNHZW5lcmF0b3IoIHByb2plY3QsIHNlbGVjdGlvbikuZ2VuZXJhdGUoKTsKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCisKKwlzdGF0aWMgcHVibGljIHZvaWQgZ2VuZXJhdGUoSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJbmV3IEVudGl0aWVzR2VuZXJhdG9yKHByb2plY3QsIHNlbGVjdGlvbikuZ2VuZXJhdGUoKTsKIAl9CiAJCi0JcHVibGljIEVudGl0aWVzR2VuZXJhdG9yKCkgeworCXByaXZhdGUgRW50aXRpZXNHZW5lcmF0b3IoSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKIAkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIEVudGl0aWVzR2VuZXJhdG9yKCBKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcigpOworCQlpZiAocHJvamVjdCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKwkJfQogCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwogCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKIAl9CiAKLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKIAorCS8vICoqKioqKioqKiogZ2VuZXJhdGUgKioqKioqKioqKgorCisJLyoqCisJICogcHJvbXB0IHRoZSB1c2VyIHdpdGggYSB3aXphcmQ7CisJICogc2NoZWR1bGUgYSBqb2IgdG8gZ2VuZXJhdGUgdGhlIGVudGl0aWVzOworCSAqIG9wdGlvbmFsbHkgc2NoZWR1bGUgYSBqb2IgdG8gc3luY2hyb25pemUgcGVyc2lzdGVuY2UueG1sIHRvCisJICogcnVuIGFmdGVyd2FyZHMKKwkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZSgpIHsKIAkJR2VuZXJhdGVFbnRpdGllc1dpemFyZCB3aXphcmQgPSBuZXcgR2VuZXJhdGVFbnRpdGllc1dpemFyZCh0aGlzLnByb2plY3QsIHRoaXMuc2VsZWN0aW9uKTsKIAkJCiAJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHRoaXMuZ2V0Q3VycmVudFNoZWxsKCksIHdpemFyZCk7CiAJCWRpYWxvZy5jcmVhdGUoKTsKIAkJaW50IHJldHVybkNvZGUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAocmV0dXJuQ29kZSA9PSBXaW5kb3cuT0spIHsKLQkJCVdvcmtzcGFjZUpvYiBnZW5FbnRpdGllc1J1bm5hYmxlID0gbmV3IEdlbmVyYXRlRW50aXRpZXNSdW5uYWJsZSgKLQkJCQkJd2l6YXJkLmdldFBhY2thZ2VHZW5lcmF0b3JDb25maWcoKSwKLQkJCQkJd2l6YXJkLmdldEVudGl0eUdlbmVyYXRvckNvbmZpZygpLAotCQkJCQl3aXphcmQuZ2V0U2VsZWN0ZWRUYWJsZXMoKSwKLQkJCQkJd2l6YXJkLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwoKSwKLQkJCQkJbmV3IE92ZXJ3cml0ZUNvbmZpcm1lcih0aGlzLmdldEN1cnJlbnRTaGVsbCgpKQotCQkJKTsKLQkJCQotCQkJV29ya3NwYWNlSm9iIHN5bmNoQ2xhc3Nlc1J1bm5hYmxlID0gbnVsbDsKLQkJCQotCQkJaWYgKHdpemFyZC5zeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKCkpIHsKLQkJCQkvLyB3ZSBjdXJyZW50bHkgb25seSBzdXBwb3J0ICpvbmUqIHBlcnNpc3RlbmNlLnhtbCBmaWxlIHBlciBwcm9qZWN0Ci0JCQkJUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwgPSB0aGlzLnByb2plY3QuZ2V0Um9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQkJCWlmIChwZXJzaXN0ZW5jZVhtbCAhPSBudWxsKSB7Ci0JCQkJCS8vVE9ETyBjYXN0aW5nIHRvIElGaWxlIC0ganVzdCB0cnlpbmcgdG8gZ2V0IHJpZCBvZiBhbGwgY29tcGlsZXIgZXJyb3JzIGZvciBub3cKLQkJCQkJc3luY2hDbGFzc2VzUnVubmFibGUgPSBuZXcgU3luY2hyb25pemVDbGFzc2VzSm9iKChJRmlsZSkgcGVyc2lzdGVuY2VYbWwuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJfQorCQlpZiAocmV0dXJuQ29kZSAhPSBXaW5kb3cuT0spIHsKKwkJCXJldHVybjsKKwkJfQorCisJCVBhY2thZ2VHZW5lcmF0b3IuQ29uZmlnIHBDb25maWcgPSB3aXphcmQuZ2V0UGFja2FnZUdlbmVyYXRvckNvbmZpZygpOworCQlFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGVDb25maWcgPSB3aXphcmQuZ2V0RW50aXR5R2VuZXJhdG9yQ29uZmlnKCk7CisJCWVDb25maWcuc2V0T3ZlcndyaXRlQ29uZmlybWVyKG5ldyBPdmVyd3JpdGVDb25maXJtZXIodGhpcy5nZXRDdXJyZW50U2hlbGwoKSkpOworCisJCVdvcmtzcGFjZUpvYiBnZW5FbnRpdGllc0pvYiA9IG5ldyBHZW5lcmF0ZUVudGl0aWVzSm9iKHBDb25maWcsIGVDb25maWcpOworCQkKKwkJV29ya3NwYWNlSm9iIHN5bmNoQ2xhc3Nlc0pvYiA9IG51bGw7CisJCQorCQlpZiAod2l6YXJkLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwoKSkgeworCQkJLy8gd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCAqb25lKiBwZXJzaXN0ZW5jZS54bWwgZmlsZSBwZXIgcHJvamVjdAorCQkJUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwgPSB0aGlzLnByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKKwkJCWlmIChwZXJzaXN0ZW5jZVhtbCAhPSBudWxsKSB7CisJCQkJLy8gVE9ETyBjYXN0aW5nIHRvIElGaWxlIC0ganVzdCB0cnlpbmcgdG8gZ2V0IHJpZCBvZiBhbGwgY29tcGlsZXIgZXJyb3JzIGZvciBub3cKKwkJCQlzeW5jaENsYXNzZXNKb2IgPSBuZXcgU3luY2hyb25pemVDbGFzc2VzSm9iKChJRmlsZSkgcGVyc2lzdGVuY2VYbWwuZ2V0UmVzb3VyY2UoKSk7CiAJCQl9Ci0JCQlnZW5FbnRpdGllc1J1bm5hYmxlLnNjaGVkdWxlKCk7Ci0JCQlpZiAoc3luY2hDbGFzc2VzUnVubmFibGUgIT0gbnVsbCkgewotCQkJCXN5bmNoQ2xhc3Nlc1J1bm5hYmxlLnNjaGVkdWxlKCk7Ci0JCQl9CisJCX0KKworCQlnZW5FbnRpdGllc0pvYi5zY2hlZHVsZSgpOworCQlpZiAoc3luY2hDbGFzc2VzSm9iICE9IG51bGwpIHsKKwkJCXN5bmNoQ2xhc3Nlc0pvYi5zY2hlZHVsZSgpOwogCQl9CiAJfQogCQpAQCAtMTA1LDM3ICsxMDcsMzIgQEAKIAkgICAgcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7CiAJfQogCSAgCi0JLy8gKioqKioqKioqKiBydW5uYWJsZSAqKioqKioqKioqCiAKLQlzdGF0aWMgY2xhc3MgR2VuZXJhdGVFbnRpdGllc1J1bm5hYmxlIGV4dGVuZHMgV29ya3NwYWNlSm9iIHsKKwkvLyAqKioqKioqKioqIGdlbmVyYXRlIGVudGl0aWVzIGpvYiAqKioqKioqKioqCisKKwlzdGF0aWMgY2xhc3MgR2VuZXJhdGVFbnRpdGllc0pvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiB7CiAJCXByaXZhdGUgZmluYWwgUGFja2FnZUdlbmVyYXRvci5Db25maWcgcGFja2FnZUNvbmZpZzsKIAkJcHJpdmF0ZSBmaW5hbCBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGVudGl0eUNvbmZpZzsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFRhYmxlPiBzZWxlY3RlZFRhYmxlczsKLQkJcHJpdmF0ZSBmaW5hbCBFbnRpdHlHZW5lcmF0b3IuT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lcjsKIAkJCi0JCUdlbmVyYXRlRW50aXRpZXNSdW5uYWJsZSgKKwkJR2VuZXJhdGVFbnRpdGllc0pvYigKIAkJCQlQYWNrYWdlR2VuZXJhdG9yLkNvbmZpZyBwYWNrYWdlQ29uZmlnLAotCQkJCUVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnLAotCQkJCUNvbGxlY3Rpb248VGFibGU+IHNlbGVjdGVkVGFibGVzLAotCQkJCWJvb2xlYW4gc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCwKLQkJCQlFbnRpdHlHZW5lcmF0b3IuT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lcgorCQkJCUVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnCiAJCSkgewotCQkJc3VwZXIoIkdlbmVyYXRpbmcgRW50aXRpZXMiKTsKKwkJCXN1cGVyKEpwdFVpTWVzc2FnZXMuRW50aXRpZXNHZW5lcmF0b3Jfam9iTmFtZSk7CiAJCQl0aGlzLnBhY2thZ2VDb25maWcgPSBwYWNrYWdlQ29uZmlnOwogCQkJdGhpcy5lbnRpdHlDb25maWcgPSBlbnRpdHlDb25maWc7Ci0JCQl0aGlzLnNlbGVjdGVkVGFibGVzID0gc2VsZWN0ZWRUYWJsZXM7Ci0JCQl0aGlzLm92ZXJ3cml0ZUNvbmZpcm1lciA9IG92ZXJ3cml0ZUNvbmZpcm1lcjsKLQkJCXNldFJ1bGUocGFja2FnZUNvbmZpZy5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7CisJCQl0aGlzLnNldFJ1bGUocGFja2FnZUNvbmZpZy5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKIAkJcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlQYWNrYWdlR2VuZXJhdG9yLmdlbmVyYXRlRW50aXRpZXModGhpcy5wYWNrYWdlQ29uZmlnLCB0aGlzLmVudGl0eUNvbmZpZywgdGhpcy5zZWxlY3RlZFRhYmxlcywgdGhpcy5vdmVyd3JpdGVDb25maXJtZXIsIG1vbml0b3IpOwkJCQorCQkJUGFja2FnZUdlbmVyYXRvci5nZW5lcmF0ZUVudGl0aWVzKHRoaXMucGFja2FnZUNvbmZpZywgdGhpcy5lbnRpdHlDb25maWcsIG1vbml0b3IpOwogCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CiAJCX0KIAogCX0KIAorCiAJLy8gKioqKioqKioqKiBvdmVyd3JpdGUgY29uZmlybWVyICoqKioqKioqKioKIAogCXN0YXRpYyBjbGFzcyBPdmVyd3JpdGVDb25maXJtZXIgaW1wbGVtZW50cyBFbnRpdHlHZW5lcmF0b3IuT3ZlcndyaXRlQ29uZmlybWVyIHsKQEAgLTE1OSw5ICsxNTYsOCBAQAogCQl9CiAKIAkJcHJpdmF0ZSBib29sZWFuIHByb21wdFVzZXIoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJCiAJCQlmaW5hbCBPdmVyd3JpdGVDb25maXJtZXJEaWFsb2cgZGlhbG9nID0gbmV3IE92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZyh0aGlzLnNoZWxsLCBjbGFzc05hbWUpOwotCQkJLy9nZXQgb24gdGhlIFVJIHRocmVhZCBzeW5jaHJvbm91c2x5LCBuZWVkIGZlZWRiYWNrIGJlZm9yZSBjb250aW51aW5nCisJCQkvLyBnZXQgb24gdGhlIFVJIHRocmVhZCBzeW5jaHJvbm91c2x5LCBuZWVkIGZlZWRiYWNrIGJlZm9yZSBjb250aW51aW5nCiAJCQl0aGlzLnNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CiAJCQkJcHVibGljIHZvaWQgcnVuKCkgewogCQkJCQlkaWFsb2cub3BlbigpOwpAQCAtMTcyLDEyICsxNjgsMTUgQEAKIAkJCX0KIAkJCWlmIChkaWFsb2cueWVzKCkpIHsKIAkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoZGlhbG9nLnllc1RvQWxsKCkpIHsKKwkJCX0KKwkJCWlmIChkaWFsb2cueWVzVG9BbGwoKSkgewogCQkJCXRoaXMub3ZlcndyaXRlQWxsID0gdHJ1ZTsKIAkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoZGlhbG9nLm5vKCkpIHsKKwkJCX0KKwkJCWlmIChkaWFsb2cubm8oKSkgewogCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoZGlhbG9nLm5vVG9BbGwoKSkgeworCQkJfQorCQkJaWYgKGRpYWxvZy5ub1RvQWxsKCkpIHsKIAkJCQl0aGlzLnNraXBBbGwgPSB0cnVlOwogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KQEAgLTE4Niw3ICsxODUsOCBAQAogCiAJfQogCi0JLy8gKioqKioqKioqKiBkaWFsb2cgKioqKioqKioqKgorCisJLy8gKioqKioqKioqKiBvdmVyd3JpdGUgZGlhbG9nICoqKioqKioqKioKIAogCXN0YXRpYyBjbGFzcyBPdmVyd3JpdGVDb25maXJtZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewogCQlwcml2YXRlIGZpbmFsIFN0cmluZyBjbGFzc05hbWU7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9iYXNlL0VudGl0aWVzR2VuZXJhdG9yMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vYmFzZS9FbnRpdGllc0dlbmVyYXRvcjIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWM0YTA4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vYmFzZS9FbnRpdGllc0dlbmVyYXRvcjIuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5iYXNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbi5HZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKKworLyoqCisgKiAgRW50aXRpZXNHZW5lcmF0b3IKKyAqLworcHVibGljIGNsYXNzIEVudGl0aWVzR2VuZXJhdG9yMiB7CisJcHJpdmF0ZSBKcGFQcm9qZWN0IHByb2plY3Q7CisJcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGUoSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJbmV3IEVudGl0aWVzR2VuZXJhdG9yMihwcm9qZWN0LCBzZWxlY3Rpb24pLmdlbmVyYXRlKCk7CisJfQorCQorCXByaXZhdGUgRW50aXRpZXNHZW5lcmF0b3IyKEpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCXN1cGVyKCk7CisJCWlmIChwcm9qZWN0ID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7CisJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOworCX0KKworCisJLy8gKioqKioqKioqKiBnZW5lcmF0ZSAqKioqKioqKioqCisKKwkvKioKKwkgKiBwcm9tcHQgdGhlIHVzZXIgd2l0aCBhIHdpemFyZDsKKwkgKiBzY2hlZHVsZSBhIGpvYiB0byBnZW5lcmF0ZSB0aGUgZW50aXRpZXM7CisJICogb3B0aW9uYWxseSBzY2hlZHVsZSBhIGpvYiB0byBzeW5jaHJvbml6ZSBwZXJzaXN0ZW5jZS54bWwgdG8KKwkgKiBydW4gYWZ0ZXJ3YXJkcworCSAqLworCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlKCkgeworCQlHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCB3aXphcmQgPSBuZXcgR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQodGhpcy5wcm9qZWN0LCB0aGlzLnNlbGVjdGlvbik7CisJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHRoaXMuZ2V0Q3VycmVudFNoZWxsKCksIHdpemFyZCk7CisJCWRpYWxvZy5jcmVhdGUoKTsKKwkJaW50IHJldHVybkNvZGUgPSBkaWFsb2cub3BlbigpOworCQlpZiAocmV0dXJuQ29kZSAhPSBXaW5kb3cuT0spIHsKKwkJCXJldHVybjsKKwkJfQorCQkvL0VudGl0aWVzIGdlbmVyYXRpb24gaGFwcGVucyBpbiB0aGUgR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQucGVyZm9ybUZpbmlzaCgpCisJCS8vbWV0aG9kCisJfQorCQorCXByaXZhdGUgU2hlbGwgZ2V0Q3VycmVudFNoZWxsKCkgeworCSAgICByZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKKwl9CisKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9DbGFzc1JlZkl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0NsYXNzUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YQppbmRleCBlMjYxYWVkLi44NWM5NTQ4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0NsYXNzUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0NsYXNzUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpAQCAtMjYsNiArMjYsMTYgQEAKIAkJc3VwZXIoY2xhc3NSZWYsIGxhYmVsUHJvdmlkZXIpOwogCX0KIAkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7CisJCUltYWdlIGltYWdlID0gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5DTEFTU19SRUYpOworCQlpZiAoKChDbGFzc1JlZikgbW9kZWwoKSkuaXNWaXJ0dWFsKCkpIHsKKwkJCWltYWdlID0gSnB0VWlJY29ucy5naG9zdChpbWFnZSk7CisJCX0KKwkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KGltYWdlKTsKKwl9CisJCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewogCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDbGFzc1JlZiwgU3RyaW5nPihDbGFzc1JlZi5DTEFTU19OQU1FX1BST1BFUlRZLCAoQ2xhc3NSZWYpIG1vZGVsKCkpIHsKQEAgLTM3LDExICs0NywxNSBAQAogCX0KIAkKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCUltYWdlIGltYWdlID0gSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5DTEFTU19SRUYpOwotCQlpZiAoKChDbGFzc1JlZikgbW9kZWwoKSkuaXNWaXJ0dWFsKCkpIHsKLQkJCWltYWdlID0gSnB0VWlJY29ucy5naG9zdChpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KGltYWdlKTsKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgeworCQkvL1RPRE8gYWxzbyBuZWVkIHRvIGxpc3RlbiB0byB0aGUgUGVyc2lzdGVuY2VVbml0IG5hbWUgcHJvcGVydHkgc2luY2UgdGhpcyB2YWx1ZSBkZXBlbmRzIG9uIGl0CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENsYXNzUmVmLCBTdHJpbmc+KENsYXNzUmVmLkNMQVNTX05BTUVfUFJPUEVSVFksIChDbGFzc1JlZikgbW9kZWwoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE5hbWUoKSAKKwkJCQkrICIvXCIiICsgc3ViamVjdC5nZXRDbGFzc05hbWUoKQorCQkJCSsgIlwiIC0gIiArIHN1YmplY3QuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpOworCQkJfQorCQl9OwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0VudGl0eU1hcHBpbmdzSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvRW50aXR5TWFwcGluZ3NJdGVtTGFiZWxQcm92aWRlci5qYXZhCmluZGV4IDY5NDVhOGQuLjAzM2ZlMzYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvRW50aXR5TWFwcGluZ3NJdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvRW50aXR5TWFwcGluZ3NJdGVtTGFiZWxQcm92aWRlci5qYXZhCkBAIC0yNiwxMyArMjYsMjMgQEAKIAkJc3VwZXIoZW50aXR5TWFwcGluZ3MsIGxhYmVsUHJvdmlkZXIpOwogCX0KIAkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oSnB0VWlNZXNzYWdlcy5Pcm1JdGVtTGFiZWxQcm92aWRlckZhY3RvcnlfZW50aXR5TWFwcGluZ3NMYWJlbCk7Ci0JfQogCQogCUBPdmVycmlkZQogCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KEpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuRU5USVRZX01BUFBJTkdTKSk7Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPigKKwkJCUpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuRU5USVRZX01BUFBJTkdTKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigKKwkJCUpwdFVpTWVzc2FnZXMuT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5X2VudGl0eU1hcHBpbmdzTGFiZWwpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgeworCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KAorCQkJSnB0VWlNZXNzYWdlcy5Pcm1JdGVtTGFiZWxQcm92aWRlckZhY3RvcnlfZW50aXR5TWFwcGluZ3NMYWJlbAorCQkJCSsgIiAtICIgKyAoKEVudGl0eU1hcHBpbmdzKSBtb2RlbCgpKS5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY0pwYVBsYXRmb3JtVWkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY0pwYVBsYXRmb3JtVWkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI1MDNhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljSnBhUGxhdGZvcm1VaS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5iYXNlLkJhc2VKcGFQbGF0Zm9ybVVpOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5uYXZpZ2F0b3IuSnBhTmF2aWdhdG9yUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljSnBhUGxhdGZvcm1VaQorCWV4dGVuZHMgQmFzZUpwYVBsYXRmb3JtVWkKK3sKKwlwdWJsaWMgR2VuZXJpY0pwYVBsYXRmb3JtVWkoCisJCQlKcGFOYXZpZ2F0b3JQcm92aWRlciBuYXZpZ2F0b3JQcm92aWRlciwgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIHBsYXRmb3JtVWlQcm92aWRlcikgeworCQkKKwkJc3VwZXIobmF2aWdhdG9yUHJvdmlkZXIsIHBsYXRmb3JtVWlQcm92aWRlcik7CisJfQorCQorCQorCS8vICoqKioqKioqKiogRERMIGdlbmVyYXRpb24gKioqKioqKioqKgorCQorCXB1YmxpYyB2b2lkIGdlbmVyYXRlRERMKEpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCXRoaXMuZGlzcGxheU1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5HZW5lcmljUGxhdGZvcm1VaURpYWxvZ19ub3RTdXBwb3J0ZWRNZXNzYWdlVGl0bGUsIEpwdFVpTWVzc2FnZXMuR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRleHQpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY0pwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODkwMWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtVWlQcm92aWRlcjsKKworcHVibGljIGNsYXNzIEdlbmVyaWNKcGFQbGF0Zm9ybVVpRmFjdG9yeSBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWlGYWN0b3J5Cit7CisKKwkvKioKKwkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50CisJICovCisJcHVibGljIEdlbmVyaWNKcGFQbGF0Zm9ybVVpRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgSnBhUGxhdGZvcm1VaSBidWlsZEpwYVBsYXRmb3JtVWkoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0pwYVBsYXRmb3JtVWkoCisJCQluZXcgR2VuZXJpY05hdmlnYXRvclByb3ZpZGVyKCksCisJCQlHZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmluc3RhbmNlKCkKKwkJKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQppbmRleCBmZmIzNmEzLi45MmY1YjQzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTMsMTQgKzEzLDE4IEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphckZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkphckZpbGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwpAQCAtMjksMTcgKzMzLDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwogCiBwdWJsaWMgY2xhc3MgR2VuZXJpY05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5CiAJaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKQEAgLTgwLDMzICs4NCwzMyBAQAogCQl9CiAJCQogCQlAT3ZlcnJpZGUKLQkJcHVibGljIFBlcnNpc3RlbmNlVW5pdCBtb2RlbCgpIHsKLQkJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0KSBzdXBlci5tb2RlbCgpOworCQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGdldE1vZGVsKCkgeworCQkJcmV0dXJuIChQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldE1vZGVsKCk7CiAJCX0KIAkJCiAJCUBPdmVycmlkZQogCQlwdWJsaWMgUGVyc2lzdGVuY2VYbWwgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIChQZXJzaXN0ZW5jZVhtbCkgbW9kZWwoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQYXJlbnQoKTsKKwkJCXJldHVybiBnZXRNb2RlbCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpOwogCQl9Ci0JCQorCQogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEpwYUNvbnRleHROb2RlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZT4+KCk7Ci0JCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZE9ybVhtbEx2bSgpKTsKLQkJCWxpc3QuYWRkKGJ1aWxkSW1wbGllZE9ybVhtbEx2bSgpKTsKLQkJCWxpc3QuYWRkKGJ1aWxkUGVyc2lzdGVudFR5cGVMdm0oKSk7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZT4sIEpwYUNvbnRleHROb2RlPihsaXN0KTsKKwkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEpwYUNvbnRleHROb2RlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7CisJCQlMaXN0PENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZT4+KCk7CisJCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZE9ybVhtbEN2bSgpKTsKKwkJCWxpc3QuYWRkKGJ1aWxkSW1wbGllZE1hcHBpbmdGaWxlQ3ZtKCkpOworCQkJbGlzdC5hZGQoYnVpbGRQZXJzaXN0ZW50VHlwZUN2bSgpKTsKKwkJCWxpc3QuYWRkKGJ1aWxkSmFyRmlsZUN2bSgpKTsKKwkJCXJldHVybiBuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYUNvbnRleHROb2RlPiwgSnBhQ29udGV4dE5vZGU+KGxpc3QpOwogCQl9CiAJCQotCQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEpwYUNvbnRleHROb2RlPiBidWlsZFNwZWNpZmllZE9ybVhtbEx2bSgpIHsKLQkJCXJldHVybiBuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKcGFDb250ZXh0Tm9kZT4oCi0JCQkJbmV3IEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPE9ybVhtbD4oCi0JCQkJCW5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPE9ybVhtbD4oCi0JCQkJCQluZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8TWFwcGluZ0ZpbGVSZWYsIE9ybVhtbD4oCisJCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKcGFDb250ZXh0Tm9kZT4gYnVpbGRTcGVjaWZpZWRPcm1YbWxDdm0oKSB7CisJCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEpwYUNvbnRleHROb2RlPigKKwkJCQkJbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8TWFwcGluZ0ZpbGU+KAorCQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPE1hcHBpbmdGaWxlUmVmLCBNYXBwaW5nRmlsZT4oCiAJCQkJCQkJbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxNYXBwaW5nRmlsZVJlZj4oCiAJCQkJCQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIE1hcHBpbmdGaWxlUmVmPigKLQkJCQkJCQkJCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX01BUFBJTkdfRklMRV9SRUZfTElTVCwKLQkJCQkJCQkJCQltb2RlbCgpKSB7CisJCQkJCQkJCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9NQVBQSU5HX0ZJTEVfUkVGU19MSVNULAorCQkJCQkJCQkJCWdldE1vZGVsKCkpIHsKIAkJCQkJCQkJCUBPdmVycmlkZQogCQkJCQkJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gbGlzdEl0ZXJhdG9yXygpIHsKIAkJCQkJCQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKTsKQEAgLTExNSw3NyArMTE5LDc3IEBACiAJCQkJCQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewogCQkJCQkJCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKTsKIAkJCQkJCQkJCX0KLQkJCQkJCQkJfSwgTWFwcGluZ0ZpbGVSZWYuT1JNX1hNTF9QUk9QRVJUWSkpIHsKKwkJCQkJCQkJfSwgTWFwcGluZ0ZpbGVSZWYuTUFQUElOR19GSUxFX1BST1BFUlRZKSkgewogCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBPcm1YbWwgdHJhbnNmb3JtSXRlbShNYXBwaW5nRmlsZVJlZiBpdGVtKSB7Ci0JCQkJCQkJCXJldHVybiBpdGVtLmdldE9ybVhtbCgpOworCQkJCQkJCXByb3RlY3RlZCBNYXBwaW5nRmlsZSB0cmFuc2Zvcm1JdGVtKE1hcHBpbmdGaWxlUmVmIGl0ZW0pIHsKKwkJCQkJCQkJcmV0dXJuIGl0ZW0uZ2V0TWFwcGluZ0ZpbGUoKTsKIAkJCQkJCQl9CiAJCQkJCQl9KSkgewogCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPE9ybVhtbD4gZmlsdGVyKEl0ZXJhdG9yPD8gZXh0ZW5kcyBPcm1YbWw+IGl0ZW1zKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPE9ybVhtbCwgT3JtWG1sPihpdGVtcykgeworCQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8SnBhQ29udGV4dE5vZGU+IGZpbHRlcihJdGVyYWJsZTw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+IGl0ZW1zKSB7CisJCQkJCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpwYUNvbnRleHROb2RlLCBKcGFDb250ZXh0Tm9kZT4oaXRlbXMpIHsKIAkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT3JtWG1sIG8pIHsKKwkJCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSnBhQ29udGV4dE5vZGUgbykgewogCQkJCQkJCQlyZXR1cm4gbyAhPSBudWxsOwogCQkJCQkJCX0KIAkJCQkJCX07CiAJCQkJCX0KLQkJCQl9KTsKKwkJCQl9OwogCQl9CiAJCQotCQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE9ybVhtbD4gYnVpbGRJbXBsaWVkT3JtWG1sTHZtKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxPcm1YbWw+KAotCQkJCW5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFwcGluZ0ZpbGVSZWYsIE9ybVhtbD4oCisJCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxNYXBwaW5nRmlsZT4gYnVpbGRJbXBsaWVkTWFwcGluZ0ZpbGVDdm0oKSB7CisJCQlyZXR1cm4gbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPE1hcHBpbmdGaWxlPigKKwkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hcHBpbmdGaWxlUmVmLCBNYXBwaW5nRmlsZT4oCiAJCQkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgTWFwcGluZ0ZpbGVSZWY+KAogCQkJCQkJCQlQZXJzaXN0ZW5jZVVuaXQuSU1QTElFRF9NQVBQSU5HX0ZJTEVfUkVGX1BST1BFUlRZLAotCQkJCQkJCQltb2RlbCgpKSB7CisJCQkJCQkJCWdldE1vZGVsKCkpIHsKIAkJCQkJCQlAT3ZlcnJpZGUKIAkJCQkJCQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSZWYgYnVpbGRWYWx1ZV8oKSB7CiAJCQkJCQkJCXJldHVybiBzdWJqZWN0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpOwogCQkJCQkJCX0KIAkJCQkJCX0sCi0JCQkJCQlNYXBwaW5nRmlsZVJlZi5PUk1fWE1MX1BST1BFUlRZKSB7CisJCQkJCQlNYXBwaW5nRmlsZVJlZi5NQVBQSU5HX0ZJTEVfUFJPUEVSVFkpIHsKIAkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBPcm1YbWwgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRPcm1YbWwoKTsKKwkJCQkJcHJvdGVjdGVkIE1hcHBpbmdGaWxlIGJ1aWxkVmFsdWVfKCkgeworCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0TWFwcGluZ0ZpbGUoKTsKIAkJCQkJfQogCQkJCX0KIAkJCSk7CiAJCX0KIAkJCi0JCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8SnBhQ29udGV4dE5vZGU+IGJ1aWxkUGVyc2lzdGVudFR5cGVMdm0oKSB7Ci0JCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnBhQ29udGV4dE5vZGU+KAotCQkJCW5ldyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbDxQZXJzaXN0ZW50VHlwZT4oCisJCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKcGFDb250ZXh0Tm9kZT4gYnVpbGRQZXJzaXN0ZW50VHlwZUN2bSgpIHsKKwkJCXJldHVybiBuZXcgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8SnBhQ29udGV4dE5vZGU+KAogCQkJCQluZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxQZXJzaXN0ZW50VHlwZT4oCiAJCQkJCQluZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Q2xhc3NSZWYsIFBlcnNpc3RlbnRUeXBlPigKLQkJCQkJCQluZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPENsYXNzUmVmPihidWlsZENsYXNzUmVmTHZtKCksIENsYXNzUmVmLkpBVkFfUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZKSkgeworCQkJCQkJCW5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Q2xhc3NSZWY+KGJ1aWxkQ2xhc3NSZWZDdm0oKSwgQ2xhc3NSZWYuSkFWQV9QRVJTSVNURU5UX1RZUEVfUFJPUEVSVFkpKSB7CiAJCQkJCQkJQE92ZXJyaWRlCiAJCQkJCQkJcHJvdGVjdGVkIFBlcnNpc3RlbnRUeXBlIHRyYW5zZm9ybUl0ZW0oQ2xhc3NSZWYgaXRlbSkgewogCQkJCQkJCQlyZXR1cm4gaXRlbS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKIAkJCQkJCQl9CiAJCQkJCQl9KSkgewogCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlPiBmaWx0ZXIoSXRlcmF0b3I8PyBleHRlbmRzIFBlcnNpc3RlbnRUeXBlPiBpdGVtcykgewotCQkJCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZSwgUGVyc2lzdGVudFR5cGU+KGl0ZW1zKSB7CisJCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxKcGFDb250ZXh0Tm9kZT4gZmlsdGVyKEl0ZXJhYmxlPD8gZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZT4gaXRlbXMpIHsKKwkJCQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SnBhQ29udGV4dE5vZGUsIEpwYUNvbnRleHROb2RlPihpdGVtcykgewogCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChQZXJzaXN0ZW50VHlwZSBvKSB7CisJCQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEpwYUNvbnRleHROb2RlIG8pIHsKIAkJCQkJCQkJcmV0dXJuIG8gIT0gbnVsbDsKIAkJCQkJCQl9CiAJCQkJCQl9OwogCQkJCQl9Ci0JCQkJfSk7CisJCQkJfTsKIAkJfQogCQkKLQkJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxDbGFzc1JlZj4gYnVpbGRDbGFzc1JlZkx2bSgpIHsKLQkJCUFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxDbGFzc1JlZj4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPENsYXNzUmVmPj4oMik7Ci0JCQlob2xkZXJzLmFkZChidWlsZFNwZWNpZmllZENsYXNzUmVmTHZtKCkpOwotCQkJaG9sZGVycy5hZGQoYnVpbGRJbXBsaWVkQ2xhc3NSZWZMdm0oKSk7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPENsYXNzUmVmPiwgQ2xhc3NSZWY+KGhvbGRlcnMpOworCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8Q2xhc3NSZWY+IGJ1aWxkQ2xhc3NSZWZDdm0oKSB7CisJCQlBcnJheUxpc3Q8Q29sbGVjdGlvblZhbHVlTW9kZWw8Q2xhc3NSZWY+PiBob2xkZXJzID0gbmV3IEFycmF5TGlzdDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxDbGFzc1JlZj4+KDIpOworCQkJaG9sZGVycy5hZGQoYnVpbGRTcGVjaWZpZWRDbGFzc1JlZkN2bSgpKTsKKwkJCWhvbGRlcnMuYWRkKGJ1aWxkSW1wbGllZENsYXNzUmVmQ3ZtKCkpOworCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxDbGFzc1JlZj4sIENsYXNzUmVmPihob2xkZXJzKTsKIAkJfQogCQkKLQkJcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxDbGFzc1JlZj4gYnVpbGRTcGVjaWZpZWRDbGFzc1JlZkx2bSgpIHsKLQkJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBDbGFzc1JlZj4oCi0JCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9DTEFTU19SRUZfTElTVCwgbW9kZWwoKSkgeworCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8Q2xhc3NSZWY+IGJ1aWxkU3BlY2lmaWVkQ2xhc3NSZWZDdm0oKSB7CisJCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8Q2xhc3NSZWY+KAorCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgQ2xhc3NSZWY+KAorCQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfQ0xBU1NfUkVGU19MSVNULCBnZXRNb2RlbCgpKSB7CiAJCQkJCUBPdmVycmlkZQogCQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBsaXN0SXRlcmF0b3JfKCkgewogCQkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CkBAIC0xOTQsMTQgKzE5OCwxNCBAQAogCQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewogCQkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpOwogCQkJCQl9Ci0JCQl9OworCQkJfSk7CiAJCX0KIAkJCi0JCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Q2xhc3NSZWY+IGJ1aWxkSW1wbGllZENsYXNzUmVmTHZtKCkgewotCQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIENsYXNzUmVmPigKLQkJCQlQZXJzaXN0ZW5jZVVuaXQuSU1QTElFRF9DTEFTU19SRUZfTElTVCwgbW9kZWwoKSkgeworCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8Q2xhc3NSZWY+IGJ1aWxkSW1wbGllZENsYXNzUmVmQ3ZtKCkgeworCQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIENsYXNzUmVmPigKKwkJCQlQZXJzaXN0ZW5jZVVuaXQuSU1QTElFRF9DTEFTU19SRUZTX0NPTExFQ1RJT04sIGdldE1vZGVsKCkpIHsKIAkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxDbGFzc1JlZj4gaXRlcmF0b3JfKCkgewogCQkJCQkJcmV0dXJuIHN1YmplY3QuaW1wbGllZENsYXNzUmVmcygpOwogCQkJCQl9CiAJCQkJCUBPdmVycmlkZQpAQCAtMjEwLDUgKzIxNCw0MiBAQAogCQkJCQl9CiAJCQl9OwogCQl9CisJCQorCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8SnBhQ29udGV4dE5vZGU+IGJ1aWxkSmFyRmlsZUN2bSgpIHsKKwkJCXJldHVybiBuZXcgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8SnBhQ29udGV4dE5vZGU+KAorCQkJCQluZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxKYXJGaWxlPigKKwkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKYXJGaWxlUmVmLCBKYXJGaWxlPigKKwkJCQkJCQluZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEphckZpbGVSZWY+KGJ1aWxkSmFyRmlsZVJlZkN2bSgpLCBKYXJGaWxlUmVmLkpBUl9GSUxFX1BST1BFUlRZKSkgeworCQkJCQkJCUBPdmVycmlkZQorCQkJCQkJCXByb3RlY3RlZCBKYXJGaWxlIHRyYW5zZm9ybUl0ZW0oSmFyRmlsZVJlZiBpdGVtKSB7CisJCQkJCQkJCXJldHVybiBpdGVtLmdldEphckZpbGUoKTsKKwkJCQkJCQl9CisJCQkJCQl9KSkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEpwYUNvbnRleHROb2RlPiBmaWx0ZXIoSXRlcmFibGU8PyBleHRlbmRzIEpwYUNvbnRleHROb2RlPiBpdGVtcykgeworCQkJCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKcGFDb250ZXh0Tm9kZSwgSnBhQ29udGV4dE5vZGU+KGl0ZW1zKSB7CisJCQkJCQkJQE92ZXJyaWRlCisJCQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEpwYUNvbnRleHROb2RlIG8pIHsKKwkJCQkJCQkJcmV0dXJuIG8gIT0gbnVsbDsKKwkJCQkJCQl9CisJCQkJCQl9OworCQkJCQl9CisJCQkJfTsKKwkJfQorCQkKKwkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEphckZpbGVSZWY+IGJ1aWxkSmFyRmlsZVJlZkN2bSgpIHsKKwkJCXJldHVybiBuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxKYXJGaWxlUmVmPigKKwkJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBKYXJGaWxlUmVmPigKKwkJCQkJUGVyc2lzdGVuY2VVbml0LkpBUl9GSUxFX1JFRlNfTElTVCwgZ2V0TW9kZWwoKSkgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEphckZpbGVSZWY+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJCQkJcmV0dXJuIHN1YmplY3QuamFyRmlsZVJlZnMoKTsKKwkJCQkJCX0KKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKwkJCQkJCQlyZXR1cm4gc3ViamVjdC5qYXJGaWxlUmVmc1NpemUoKTsKKwkJCQkJCX0KKwkJCQl9KTsKKwkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKaW5kZXggN2ZmOTc0Yy4uNjQ5NmI3ZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKQEAgLTEyLDkgKzEyLDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphckZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkphckZpbGVJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwpAQCAtNDEsNiArNDMsOSBAQAogCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVudEF0dHJpYnV0ZSkgewogCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIoKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCiAJCX0KKwkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEphckZpbGUpIHsKKwkJCXJldHVybiBuZXcgSmFyRmlsZUl0ZW1MYWJlbFByb3ZpZGVyKChKYXJGaWxlKSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7CisJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljUGxhdGZvcm1VaS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljUGxhdGZvcm1VaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzQwODJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY1BsYXRmb3JtVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuR2VuZXJpY0pwYVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uYmFzZS5CYXNlSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGxhdGZvcm1VaSBleHRlbmRzIEJhc2VKcGFQbGF0Zm9ybVVpCi17Ci0JcHVibGljIEdlbmVyaWNQbGF0Zm9ybVVpKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG5hdmlnYXRvciBjb250ZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEpwYU5hdmlnYXRvclByb3ZpZGVyIGJ1aWxkTmF2aWdhdG9yUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY05hdmlnYXRvclByb3ZpZGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFVaUZhY3RvcnkgY3JlYXRlSnBhVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFVaUZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZURETChKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLmRpc3BsYXlOb3RTdXBwb3J0ZWRNZXNzYWdlKEpwdFVpTWVzc2FnZXMuR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRpdGxlLCBKcHRVaU1lc3NhZ2VzLkdlbmVyaWNQbGF0Zm9ybVVpRGlhbG9nX25vdFN1cHBvcnRlZE1lc3NhZ2VUZXh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5Tm90U3VwcG9ydGVkTWVzc2FnZShTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JICAgIFNoZWxsIGN1cnJlbnRTaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGN1cnJlbnRTaGVsbCwgdGl0bGUsIG1lc3NhZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvSmFyRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0phckZpbGVSZWZJdGVtTGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTRmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0phckZpbGVSZWZJdGVtTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5KYXJGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworcHVibGljIGNsYXNzIEphckZpbGVSZWZJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKK3sKKwlwdWJsaWMgSmFyRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyKAorCQkJSmFyRmlsZVJlZiBqYXJGaWxlUmVmLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgeworCQlzdXBlcihqYXJGaWxlUmVmLCBsYWJlbFByb3ZpZGVyKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXJGaWxlUmVmLCBTdHJpbmc+KEphckZpbGVSZWYuRklMRV9OQU1FX1BST1BFUlRZLCAoSmFyRmlsZVJlZikgbW9kZWwoKSkgeworCQkJIEBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gc3ViamVjdC5nZXRGaWxlTmFtZSgpOworCQkJfQorCQl9OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7CisJCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPihKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpBUl9GSUxFX1JFRikpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXJGaWxlUmVmLCBTdHJpbmc+KEphckZpbGVSZWYuRklMRV9OQU1FX1BST1BFUlRZLCAoSmFyRmlsZVJlZikgbW9kZWwoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE5hbWUoKSAKKwkJCQkrICIvXCIiICsgc3ViamVjdC5nZXRGaWxlTmFtZSgpCisJCQkJKyAiXCIgLSAiICsgc3ViamVjdC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCk7CisJCQl9CisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9KYXZhUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0phdmFQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQppbmRleCA1ZjUxNWZiLi5kNWE2ZmU1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0phdmFQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0phdmFQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpAQCAtMSwyMyArMSwyNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKIAogcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPgogewpAQCAtMjcsMTcgKzI4LDE5IEBACiAJfQogCQogCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgbW9kZWwoKSB7Ci0JCXJldHVybiAoSmF2YVBlcnNpc3RlbnRUeXBlKSBzdXBlci5tb2RlbCgpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG1vZGVsKCkuZ2V0UGFyZW50KCk7CisJcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRNb2RlbCgpIHsKKwkJcmV0dXJuIChKYXZhUGVyc2lzdGVudFR5cGUpIHN1cGVyLmdldE1vZGVsKCk7CiAJfQogCQogCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEphdmFQZXJzaXN0ZW50VHlwZSwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KFBlcnNpc3RlbnRUeXBlLlNQRUNJRklFRF9BVFRSSUJVVEVTX0xJU1QsIG1vZGVsKCkpIHsKKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIGdldE1vZGVsKCkuZ2V0UGFyZW50KCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgeworCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KAorCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8SmF2YVBlcnNpc3RlbnRUeXBlLCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oUGVyc2lzdGVudFR5cGUuQVRUUklCVVRFU19MSVNULCBnZXRNb2RlbCgpKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGxpc3RJdGVyYXRvcl8oKSB7CiAJCQkJcmV0dXJuIHN1YmplY3QuYXR0cmlidXRlcygpOwpAQCAtNDcsNiArNTAsNiBAQAogCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKIAkJCQlyZXR1cm4gc3ViamVjdC5hdHRyaWJ1dGVzU2l6ZSgpOwogCQkJfQotCQl9OworCQl9KTsKIAl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9NYXBwaW5nRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL01hcHBpbmdGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YQppbmRleCA4NWMxOGM1Li5hMmRlOTEzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL01hcHBpbmdGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL01hcHBpbmdGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0yNiw2ICsyNiwxNiBAQAogCQlzdXBlcihtYXBwaW5nRmlsZVJlZiwgbGFiZWxQcm92aWRlcik7CiAJfQogCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKKwkJSW1hZ2UgaW1hZ2UgPSBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLk1BUFBJTkdfRklMRV9SRUYpOworCQlpZiAoKChNYXBwaW5nRmlsZVJlZikgbW9kZWwoKSkuaXNJbXBsaWVkKCkpIHsKKwkJCWltYWdlID0gSnB0VWlJY29ucy5naG9zdChpbWFnZSk7CisJCX0KKwkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KGltYWdlKTsKKwl9CisJCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewogCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYXBwaW5nRmlsZVJlZiwgU3RyaW5nPihNYXBwaW5nRmlsZVJlZi5GSUxFX05BTUVfUFJPUEVSVFksIChNYXBwaW5nRmlsZVJlZikgbW9kZWwoKSkgewpAQCAtMzcsMTEgKzQ3LDE0IEBACiAJfQogCQogCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLk1BUFBJTkdfRklMRV9SRUYpOwotCQlpZiAoKChNYXBwaW5nRmlsZVJlZikgbW9kZWwoKSkuaXNWaXJ0dWFsKCkpIHsKLQkJCWltYWdlID0gSnB0VWlJY29ucy5naG9zdChpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KGltYWdlKTsKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYXBwaW5nRmlsZVJlZiwgU3RyaW5nPihNYXBwaW5nRmlsZVJlZi5GSUxFX05BTUVfUFJPUEVSVFksIChNYXBwaW5nRmlsZVJlZikgbW9kZWwoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiBzdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE5hbWUoKSAKKwkJCQkrICIvXCIiICsgc3ViamVjdC5nZXRGaWxlTmFtZSgpICsgIlwiIgorCQkJCSsgIiAtICIgKyBzdWJqZWN0LmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKTsKKwkJCX0KKwkJfTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1QZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggMGMxNTc4OS4uNzVmYjkzMCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1QZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL09ybVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0xLDI2ICsxLDI3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKIAogcHVibGljIGNsYXNzIE9ybVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4KIAl7CkBAIC0zMCwyNiArMzEsMjcgQEAKIAkJfQogCQkKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBtb2RlbCgpIHsKLQkJCXJldHVybiAoT3JtUGVyc2lzdGVudFR5cGUpIHN1cGVyLm1vZGVsKCk7CisJCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRNb2RlbCgpIHsKKwkJCXJldHVybiAoT3JtUGVyc2lzdGVudFR5cGUpIHN1cGVyLmdldE1vZGVsKCk7CiAJCX0KIAkJCiAJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBtb2RlbCgpLmdldFBhcmVudCgpOworCQkJcmV0dXJuIGdldE1vZGVsKCkuZ2V0UGFyZW50KCk7CiAJCX0KIAkJCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJTGlzdDxMaXN0VmFsdWVNb2RlbDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4+KDIpOwotCQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlc0xpc3RIb2xkZXIoKSk7Ci0JCQlsaXN0LmFkZChidWlsZFZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlc0xpc3RIb2xkZXIoKSk7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+LCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlPihsaXN0KTsKKwkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKKwkJCUxpc3Q8Q29sbGVjdGlvblZhbHVlTW9kZWw8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbGxlY3Rpb25WYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+PigyKTsKKwkJCWxpc3QuYWRkKGJ1aWxkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXNDb2xsZWN0aW9uSG9sZGVyKCkpOworCQkJbGlzdC5hZGQoYnVpbGRWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXNDb2xsZWN0aW9uSG9sZGVyKCkpOworCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4obGlzdCk7CiAJCX0KIAkJCiAKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGJ1aWxkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXNMaXN0SG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxPcm1QZXJzaXN0ZW50VHlwZSwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oUGVyc2lzdGVudFR5cGUuU1BFQ0lGSUVEX0FUVFJJQlVURVNfTElTVCwgbW9kZWwoKSkgeworCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlc0NvbGxlY3Rpb25Ib2xkZXIoKSB7CisJCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4oCisJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8T3JtUGVyc2lzdGVudFR5cGUsIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KFBlcnNpc3RlbnRUeXBlLkFUVFJJQlVURVNfTElTVCwgZ2V0TW9kZWwoKSkgewogCQkJCUBPdmVycmlkZQogCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gbGlzdEl0ZXJhdG9yXygpIHsKIAkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQXR0cmlidXRlcygpOwpAQCAtNTgsMTEgKzYwLDEyIEBACiAJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKIAkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKTsKIAkJCQl9Ci0JCQl9OworCQkJfSk7CiAJCX0KIAkJCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBidWlsZFZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlc0xpc3RIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9ybVBlcnNpc3RlbnRUeXBlLCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlPihPcm1QZXJzaXN0ZW50VHlwZS5WSVJUVUFMX0FUVFJJQlVURVNfTElTVCwgbW9kZWwoKSkgeworCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGRWaXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXNDb2xsZWN0aW9uSG9sZGVyKCkgeworCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KAorCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9ybVBlcnNpc3RlbnRUeXBlLCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlPihPcm1QZXJzaXN0ZW50VHlwZS5WSVJUVUFMX0FUVFJJQlVURVNfTElTVCwgZ2V0TW9kZWwoKSkgewogCQkJCUBPdmVycmlkZQogCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gbGlzdEl0ZXJhdG9yXygpIHsKIAkJCQkJcmV0dXJuIHN1YmplY3QudmlydHVhbEF0dHJpYnV0ZXMoKTsKQEAgLTcxLDYgKzc0LDYgQEAKIAkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewogCQkJCQlyZXR1cm4gc3ViamVjdC52aXJ0dWFsQXR0cmlidXRlc1NpemUoKTsKIAkJCQl9Ci0JCQl9OworCQkJfSk7CiAJCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL09ybVhtbEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtWG1sSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDEwMTM0MDcuLjA5YzUzZjMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtWG1sSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtWG1sSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0xLDE2ICsxLDE2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwpAQCAtMTgsOCArMTgsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKIAogcHVibGljIGNsYXNzIE9ybVhtbEl0ZW1Db250ZW50UHJvdmlkZXIKQEAgLTMxLDM0ICszMiwzNSBAQAogCX0KIAkKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtWG1sIG1vZGVsKCkgewotCQlyZXR1cm4gKE9ybVhtbCkgc3VwZXIubW9kZWwoKTsKKwlwdWJsaWMgT3JtWG1sIGdldE1vZGVsKCkgeworCQlyZXR1cm4gKE9ybVhtbCkgc3VwZXIuZ2V0TW9kZWwoKTsKIAl9CiAJCiAJQE92ZXJyaWRlCiAJcHVibGljIFBlcnNpc3RlbmNlVW5pdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBtb2RlbCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlyZXR1cm4gZ2V0TW9kZWwoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAl9CiAJCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbnRUeXBlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8RW50aXR5TWFwcGluZ3MsIE9ybVBlcnNpc3RlbnRUeXBlPigKKwlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8T3JtUGVyc2lzdGVudFR5cGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPE9ybVBlcnNpc3RlbnRUeXBlPigKKwkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBPcm1QZXJzaXN0ZW50VHlwZT4oCiAJCQkJYnVpbGRFbnRpdHlNYXBwaW5nc0hvbGRlcigpLAogCQkJCUVudGl0eU1hcHBpbmdzLlBFUlNJU1RFTlRfVFlQRVNfTElTVCkgewogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0Lm9ybVBlcnNpc3RlbnRUeXBlcygpOworCQkJCXJldHVybiBzdWJqZWN0LnBlcnNpc3RlbnRUeXBlcygpOwogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0Lm9ybVBlcnNpc3RlbnRUeXBlc1NpemUoKTsKKwkJCQlyZXR1cm4gc3ViamVjdC5wZXJzaXN0ZW50VHlwZXNTaXplKCk7CiAJCQl9Ci0JCX07CisJCX0pOwogCX0KIAkKIAlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eU1hcHBpbmdzPiBidWlsZEVudGl0eU1hcHBpbmdzSG9sZGVyKCkgewogCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1YbWwsIEVudGl0eU1hcHBpbmdzPigKLQkJCQlPcm1YbWwuRU5USVRZX01BUFBJTkdTX1BST1BFUlRZLCBtb2RlbCgpKSB7CisJCQkJT3JtWG1sLkVOVElUWV9NQVBQSU5HU19QUk9QRVJUWSwgZ2V0TW9kZWwoKSkgewogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgRW50aXR5TWFwcGluZ3MgYnVpbGRWYWx1ZV8oKSB7CiAJCQkJcmV0dXJuIHN1YmplY3QuZ2V0RW50aXR5TWFwcGluZ3MoKTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtWG1sSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtWG1sSXRlbUxhYmVsUHJvdmlkZXIuamF2YQppbmRleCA4MzE1MWE5Li5lZWJlNzZmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL09ybVhtbEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1YbWxJdGVtTGFiZWxQcm92aWRlci5qYXZhCkBAIC0yNSwxMyArMjUsMjIgQEAKIAkJc3VwZXIob3JtWG1sLCBsYWJlbFByb3ZpZGVyKTsKIAl9CiAJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgeworCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfRklMRSkpOworCX0KKwkKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7CiAJCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKChPcm1YbWwpIG1vZGVsKCkpLmdldFJlc291cmNlKCkuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfRklMRSkpOworCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7CisJCU9ybVhtbCBvcm1YbWwgPSAoT3JtWG1sKSBtb2RlbCgpOworCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KAorCQkJb3JtWG1sLmdldFJlc291cmNlKCkuZ2V0TmFtZSgpCisJCQkrICIgLSAiICsgb3JtWG1sLmdldFJlc291cmNlKCkuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlci5qYXZhCmluZGV4IGJmOTEzYWEuLjU5MTQ3ODggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlci5qYXZhCkBAIC0yNiwxMyArMjYsMjIgQEAKIAkJc3VwZXIocGVyc2lzdGVuY2UsIGxhYmVsUHJvdmlkZXIpOwogCX0KIAkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oSnB0VWlNZXNzYWdlcy5QZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeV9wZXJzaXN0ZW5jZUxhYmVsKTsKLQl9CiAJCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewogCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5QRVJTSVNURU5DRSkpOwotCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7CisJCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oCisJCQlKcHRVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5X3BlcnNpc3RlbmNlTGFiZWwpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgeworCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KAorCQkJSnB0VWlNZXNzYWdlcy5QZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeV9wZXJzaXN0ZW5jZUxhYmVsCisJCQkJKyAiIC0gIiArICgoUGVyc2lzdGVuY2UpIG1vZGVsKCkpLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW5jZVVuaXRJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW5jZVVuaXRJdGVtTGFiZWxQcm92aWRlci5qYXZhCmluZGV4IDhjZWExMjUuLjcyMDlhZDEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVuY2VVbml0SXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlVW5pdEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKQEAgLTI2LDYgKzI2LDEyIEBACiAJCXN1cGVyKHBlcnNpc3RlbmNlVW5pdCwgbGFiZWxQcm92aWRlcik7CiAJfQogCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KEpwdFVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuUEVSU0lTVEVOQ0VfVU5JVCkpOworCX0KKwkKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7CiAJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPihQZXJzaXN0ZW5jZVVuaXQuTkFNRV9QUk9QRVJUWSwgKFBlcnNpc3RlbmNlVW5pdCkgbW9kZWwoKSkgewpAQCAtMzcsNyArNDMsMTMgQEAKIAl9CiAJCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5QRVJTSVNURU5DRV9VTklUKSk7CisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVzY3JpcHRpb25Nb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KFBlcnNpc3RlbmNlVW5pdC5OQU1FX1BST1BFUlRZLCAoUGVyc2lzdGVuY2VVbml0KSBtb2RlbCgpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpCisJCQkJKyAiIC0gIiArIHN1YmplY3QuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpOworCQkJfQorCQl9OwogCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW5jZVhtbEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQppbmRleCA3NDZiNzllLi5iZmU2M2E2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVuY2VYbWxJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTEsMTYgKzEsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwpAQCAtMTgsOCArMTgsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwogCiBwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxJdGVtQ29udGVudFByb3ZpZGVyCiAJZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPFBlcnNpc3RlbmNlVW5pdD4KQEAgLTI5LDE3ICszMCwyMiBAQAogCQlzdXBlcihwZXJzaXN0ZW5jZVhtbCwgY29udGVudFByb3ZpZGVyKTsKIAl9CiAJCi0JCiAJQE92ZXJyaWRlCi0JcHVibGljIEpwYVJvb3RDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSnBhUm9vdENvbnRleHROb2RlKSAoKFBlcnNpc3RlbmNlWG1sKSBtb2RlbCgpKS5nZXRQYXJlbnQoKTsKKwlwdWJsaWMgUGVyc2lzdGVuY2VYbWwgZ2V0TW9kZWwoKSB7CisJCXJldHVybiAoUGVyc2lzdGVuY2VYbWwpIHN1cGVyLmdldE1vZGVsKCk7CiAJfQogCQogCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZSwgUGVyc2lzdGVuY2VVbml0PigKKwlwdWJsaWMgSnBhUm9vdENvbnRleHROb2RlIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIChKcGFSb290Q29udGV4dE5vZGUpIGdldE1vZGVsKCkuZ2V0UGFyZW50KCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdD4oCisJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZSwgUGVyc2lzdGVuY2VVbml0PigKIAkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlWG1sLCBQZXJzaXN0ZW5jZT4oCi0JCQkJCQlQZXJzaXN0ZW5jZVhtbC5QRVJTSVNURU5DRV9QUk9QRVJUWSwgKFBlcnNpc3RlbmNlWG1sKSBtb2RlbCgpKSB7CisJCQkJCQlQZXJzaXN0ZW5jZVhtbC5QRVJTSVNURU5DRV9QUk9QRVJUWSwgZ2V0TW9kZWwoKSkgewogCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlIGJ1aWxkVmFsdWVfKCkgewogCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0UGVyc2lzdGVuY2UoKTsKQEAgLTUwLDYgKzU2LDYgQEAKIAkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBsaXN0SXRlcmF0b3JfKCkgewogCQkJCXJldHVybiBzdWJqZWN0LnBlcnNpc3RlbmNlVW5pdHMoKTsKIAkJCX0KLQkJfTsKKwkJfSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW5jZVhtbEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUxhYmVsUHJvdmlkZXIuamF2YQppbmRleCBjNDM3NGY4Li45MDJkMzFhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpAQCAtMjUsMTMgKzI1LDIyIEBACiAJCXN1cGVyKHBlcnNpc3RlbmNlWG1sLCBsYWJlbFByb3ZpZGVyKTsKIAl9CiAJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgeworCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfRklMRSkpOworCX0KKwkKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7CiAJCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKChQZXJzaXN0ZW5jZVhtbCkgbW9kZWwoKSkuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCkpOwogCX0KIAkKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPihKcHRVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9GSUxFKSk7Ci0JfQkKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgeworCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCA9IChQZXJzaXN0ZW5jZVhtbCkgbW9kZWwoKTsKKwkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigKKwkJCXBlcnNpc3RlbmNlWG1sLmdldFJlc291cmNlKCkuZ2V0TmFtZSgpCisJCQkrICIgLSAiICsgcGVyc2lzdGVuY2VYbWwuZ2V0UmVzb3VyY2UoKS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCkpOworCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQppbmRleCAxNzg3ODI4Li45Yzc3MTJmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW50QXR0cmlidXRlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0yMyw4ICsyMywxMyBAQAogCX0KIAkKIAlAT3ZlcnJpZGUKKwlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRNb2RlbCgpIHsKKwkJcmV0dXJuIChQZXJzaXN0ZW50QXR0cmlidXRlKSBzdXBlci5nZXRNb2RlbCgpOworCX0KKwkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuICgoUGVyc2lzdGVudEF0dHJpYnV0ZSkgbW9kZWwoKSkuZ2V0UGFyZW50KCk7CisJCXJldHVybiBnZXRNb2RlbCgpLmdldFBhcmVudCgpOwogCX0KIAkKIAlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtTGFiZWxQcm92aWRlci5qYXZhCmluZGV4IDRhZGI0MjEuLmY2M2M3MWQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpAQCAtOSw2ICs5LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwpAQCAtMjUsMTUgKzI2LDcgQEAKIAkJc3VwZXIocGVyc2lzdGVudEF0dHJpYnV0ZSwgbGFiZWxQcm92aWRlcik7CiAJfQogCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVudEF0dHJpYnV0ZSwgU3RyaW5nPihQZXJzaXN0ZW50QXR0cmlidXRlLk5BTUVfUFJPUEVSVFksIChQZXJzaXN0ZW50QXR0cmlidXRlKSBtb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KKwkKIAkKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7CkBAIC00OSw1ICs0MiwzNiBAQAogCQkJCXJldHVybiBpbWFnZTsKIAkJCX0KIAkJfTsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW50QXR0cmlidXRlLCBTdHJpbmc+KFBlcnNpc3RlbnRBdHRyaWJ1dGUuTkFNRV9QUk9QRVJUWSwgKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIG1vZGVsKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7CisJCQl9CisJCX07CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZz4oUGVyc2lzdGVudEF0dHJpYnV0ZS5OQU1FX1BST1BFUlRZLCAoUGVyc2lzdGVudEF0dHJpYnV0ZSkgbW9kZWwoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJCXNiLmFwcGVuZCh0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0TmFtZSgpKTsKKwkJCQlzYi5hcHBlbmQoJy8nKTsKKwkJCQlzYi5hcHBlbmQodGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpKTsKKwkJCQlzYi5hcHBlbmQoJy8nKTsKKwkJCQlzYi5hcHBlbmQodGhpcy5zdWJqZWN0LmdldE5hbWUoKSk7CisJCQkJSVJlc291cmNlIHJlc291cmNlID0gdGhpcy5zdWJqZWN0LmdldFJlc291cmNlKCk7CisJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJc2IuYXBwZW5kKCIgLSAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlzYi5hcHBlbmQocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKSk7CisJCQkJfQorCQkJCXJldHVybiBzYi50b1N0cmluZygpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudFR5cGVJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW50VHlwZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKaW5kZXggYmQ2YjQ1Ni4uMmFhYTg2MyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW50VHlwZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW50VHlwZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKQEAgLTksNiArOSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7CkBAIC0yNCwxNSArMjUsNiBAQAogCQlzdXBlcihwZXJzaXN0ZW50VHlwZSwgbGFiZWxQcm92aWRlcik7CiAJfQogCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVudFR5cGUsIFN0cmluZz4oUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSwgKFBlcnNpc3RlbnRUeXBlKSBtb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KIAkKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7CkBAIC00Miw1ICszNCwzNCBAQAogCQkJCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JUeXBlTWFwcGluZyhzdWJqZWN0LmdldE1hcHBpbmdLZXkoKSk7CiAJCQl9CiAJCX07Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVudFR5cGUsIFN0cmluZz4oUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSwgKFBlcnNpc3RlbnRUeXBlKSBtb2RlbCgpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHN1YmplY3QuZ2V0U2hvcnROYW1lKCk7CisJCQl9CisJCX07CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbnRUeXBlLCBTdHJpbmc+KFBlcnNpc3RlbnRUeXBlLk5BTUVfUFJPUEVSVFksIChQZXJzaXN0ZW50VHlwZSkgbW9kZWwoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJCXNiLmFwcGVuZCh0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0TmFtZSgpKTsKKwkJCQlzYi5hcHBlbmQoJy8nKTsKKwkJCQlzYi5hcHBlbmQodGhpcy5zdWJqZWN0LmdldE5hbWUoKSk7CisJCQkJSVJlc291cmNlIHJlc291cmNlID0gdGhpcy5zdWJqZWN0LmdldFJlc291cmNlKCk7CisJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJc2IuYXBwZW5kKCIgLSAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlzYi5hcHBlbmQocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKSk7CisJCQkJfQorCQkJCXJldHVybiBzYi50b1N0cmluZygpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUm9vdENvbnRleHRJdGVtQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1Jvb3RDb250ZXh0SXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IGM2ZTEzMTEuLmJiMTlmNTggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUm9vdENvbnRleHRJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Sb290Q29udGV4dEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpAQCAtMSwxMiArMSwxMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwogCkBAIC0xNiw4ICsxNSw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwogCiBwdWJsaWMgY2xhc3MgUm9vdENvbnRleHRJdGVtQ29udGVudFByb3ZpZGVyCiAJZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPFBlcnNpc3RlbmNlWG1sPgpAQCAtMjgsMjEgKzI3LDIxIEBACiAJfQogCQogCUBPdmVycmlkZQotCXB1YmxpYyBKcGFSb290Q29udGV4dE5vZGUgbW9kZWwoKSB7Ci0JCXJldHVybiAoSnBhUm9vdENvbnRleHROb2RlKSBzdXBlci5tb2RlbCgpOworCXB1YmxpYyBKcGFSb290Q29udGV4dE5vZGUgZ2V0TW9kZWwoKSB7CisJCXJldHVybiAoSnBhUm9vdENvbnRleHROb2RlKSBzdXBlci5nZXRNb2RlbCgpOwogCX0KIAkKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgSVByb2plY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbW9kZWwoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOworCQlyZXR1cm4gZ2V0TW9kZWwoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwogCX0KIAkKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8UGVyc2lzdGVuY2VYbWw+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxQZXJzaXN0ZW5jZVhtbD4oCisJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFBlcnNpc3RlbmNlWG1sPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8UGVyc2lzdGVuY2VYbWw+KAogCQkJCW5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhUm9vdENvbnRleHROb2RlLCBQZXJzaXN0ZW5jZVhtbD4oCiAJCQkJCQlKcGFSb290Q29udGV4dE5vZGUuUEVSU0lTVEVOQ0VfWE1MX1BST1BFUlRZLAotCQkJCQkJbW9kZWwoKSkgeworCQkJCQkJZ2V0TW9kZWwoKSkgewogCQkJCQkgQE92ZXJyaWRlCiAJCQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbCBidWlsZFZhbHVlXygpIHsKIAkJCQkJCXJldHVybiBzdWJqZWN0LmdldFBlcnNpc3RlbmNlWG1sKCk7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1Jvb3RDb250ZXh0SXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUm9vdENvbnRleHRJdGVtTGFiZWxQcm92aWRlci5qYXZhCmluZGV4IDc1YWRmNWIuLmI5ZDY3YjMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUm9vdENvbnRleHRJdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUm9vdENvbnRleHRJdGVtTGFiZWxQcm92aWRlci5qYXZhCkBAIC0yNiwxMyArMjYsMjEgQEAKIAkJc3VwZXIocm9vdENvbnRleHROb2RlLCBsYWJlbFByb3ZpZGVyKTsKIAl9CiAJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgeworCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfQ09OVEVOVCkpOworCX0KKwkKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7CiAJCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oSnB0VWlNZXNzYWdlcy5KcGFDb250ZW50X2xhYmVsKTsKIAl9CiAJCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0VWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfQ09OVEVOVCkpOwotCX0JCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVzY3JpcHRpb25Nb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigKKwkJCUpwdFVpTWVzc2FnZXMuSnBhQ29udGVudF9sYWJlbAorCQkJCSsgIiAtICIgKyAoKEpwYVJvb3RDb250ZXh0Tm9kZSkgbW9kZWwoKSkuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KcGFQcmVmZXJlbmNlc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pwYVByZWZlcmVuY2VzUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmJhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KcGFQcmVmZXJlbmNlc1BhZ2UuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByZWZlcmVuY2VzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSByb290IG9mIHRoZSBKYXZhIFBlcnNpc3RlbmNlIHByZWZlcmVuY2VzIGhpZXJhcmNoeSBpbiB0aGUgSURFCisgKiBwcmVmZXJlbmNlcyBkaWFsb2cuCisgKiA8cD4KKyAqIFN0cnVjdHVyZToKKyAqIDxwPgorICogSmF2YSBQZXJzaXN0ZW5jZTxicj4KKyAqICB8LSBFcnJvcnMvV2FybmluZ3MKKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjIKKyAqLworcHVibGljIGNsYXNzIEpwYVByZWZlcmVuY2VzUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhUHJlZmVyZW5jZXNQYWdlPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgSnBhUHJlZmVyZW5jZXNQYWdlKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7CisJCXBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKKworCQkvLyBNZXNzYWdlIGxhYmVsCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhUHJlZmVyZW5jZXNQYWdlX0Rlc2NyaXB0aW9uKTsKKwkJbGFiZWwuc2V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5CRUdJTk5JTkcsIHRydWUsIHRydWUpKTsKKworCQlyZXR1cm4gcGFyZW50OworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7CisJCXNldFByZWZlcmVuY2VTdG9yZShKcHRVaVBsdWdpbi5pbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjIxN2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlLmphdmEKQEAgLTAsMCArMSw2MTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5Qcm9wZXJ0eUFuZFByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5TY3JvbGxlZFBhZ2VDb250ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5QaXhlbENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5FeHBhbnNpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5FeHBhbnNpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7CisKKy8qKgorICogVGhpcyBwYWdlIHNob3dzIHRoZSBKYXZhIFBlcnNpc3RlbmNlIHZhbGlkYXRpb24gb3B0aW9ucy4gSXQgc3VwcG9ydHMKKyAqIHdvcmtzcGFjZSBhbmQgcHJvamVjdCBsZXZlbHMgc2V2ZXJpdGllcy4KKyAqCisgKiBAdmVyc2lvbiAyLjIKKyAqIEBzaW5jZSAyLjIKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJyZXN0cmljdGlvbiIsICJubHMifSkKK3B1YmxpYyBjbGFzcyBKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2UgZXh0ZW5kcyBQcm9wZXJ0eUFuZFByZWZlcmVuY2VQYWdlIHsKKworCS8qKgorCSAqIFRoZSBsaXN0IG9mIDxjb2RlPkNvbWJvPC9jb2RlPnMgaXMgY2FjaGVkIGluIG9yZGVyIHRvIHBlcmZvcm0gYSByZXZlcnQgb2YKKwkgKiB0aGUgcHJvcGVydGllcy4KKwkgKi8KKwlwcml2YXRlIExpc3Q8Q29tYm8+IGNvbWJvczsKKworCS8qKgorCSAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgIkVycm9yIiBjaG9pY2UgaW4gdGhlIGNvbWJvJ3MgbW9kZWwuCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgREVGQVVMVF9JTkRFWCA9IDA7CisKKwkvKioKKwkgKiBUaGUgcG9zaXRpb24gb2YgdGhlICJFcnJvciIgY2hvaWNlIGluIHRoZSBjb21ibydzIG1vZGVsLgorCSAqLworCXByaXZhdGUgZmluYWwgaW50IEVSUk9SX0lOREVYID0gMTsKKworCS8qKgorCSAqIFRoZSBsaXN0IG9mIDxjb2RlPkV4cGFuZGFibGVDb21wb3NpdGU8L2NvZGU+IGlzIGNhY2hlZCBpbiBvcmRlciB0byBzYXZlCisJICogYW5kIHJlc3RvcmUgdGhlIGV4cGFuc2lvbiBzdGF0ZS4KKwkgKi8KKwlwcml2YXRlIExpc3Q8RXhwYW5kYWJsZUNvbXBvc2l0ZT4gZXhwYW5kYWJsZVBhbmVzOworCisJLyoqCisJICogVGhlIHBvc2l0aW9uIG9mIHRoZSAiSWdub3JlIiBjaG9pY2UgaW4gdGhlIGNvbWJvJ3MgbW9kZWwuCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgSUdOT1JFX0lOREVYID0gMzsKKworCS8qKgorCSAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgIkluZm8iIGNob2ljZSBpbiB0aGUgY29tYm8ncyBtb2RlbC4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCBJTkZPX0lOREVYID0gNDsKKworCS8qKgorCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwYWdlIHdoZW4gaXQgaXMgc2hvd24gaW4gdGhlIElERQorCSAqIHByZWZlcmVuY2VzIGRpYWxvZy4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBKUFRfUFJFRkVSRU5DRVNfUFJPQkxFTV9TRVZFUklUSUVTX0lEID0gIm9yZy5lY2xpcHNlLmpwdC51aS5wcmVmZXJlbmNlcy5wcm9ibGVtU2V2ZXJpdGllcyI7CisKKwkvKioKKwkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcGFnZSB3aGVuIGl0IGlzIHNob3duIGluIHRoZSBwcm9qZWN0CisJICogcHJlZmVyZW5jZXMgZGlhbG9nLgorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIEpQVF9QUk9QRVJUWV9QQUdFU19QUk9CTEVNX1NFVkVSSVRJRVNfSUQgPSAib3JnLmVjbGlwc2UuanB0LnVpLnByb3BlcnR5UGFnZXMucHJvYmxlbVNldmVyaXRpZXMiOworCisJLyoqCisJICogQSBjb25zdGFudCB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSB0aGUgcHJlZmVyZW5jZSBrZXkgKG1lc3NhZ2UgSUQpIGZyb20KKwkgKiB0aGUgY29tYm8uCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9LRVkgPSAicHJlZmVyZW5jZUtleSI7CisKKwkvKioKKwkgKiBUaGUgc2Nyb2xsYWJsZSBwYW5lIHVzZWQgdG8gc2hvdyB0aGUgY29udGVudCBvZiB0aGlzIHBhZ2UuCisJICovCisJcHJpdmF0ZSBTY3JvbGxlZFBhZ2VDb250ZW50IHNjcm9sbGFibGU7CisKKwkvKioKKwkgKiBUaGUgcG9zc2libGUgY2hvaWNlcyB3aGljaCBkZXNjcmliZXMgdGhlIHNldmVyaXR5IG9mIGEgc2luZ2xlIHByb2JsZW0uCisJICovCisJcHJpdmF0ZSBTdHJpbmdbXSBzZXZlcml0eURpc3BsYXlTdHJpbmdzOworCisJLyoqCisJICogVGhlIHBvc2l0aW9uIG9mIHRoZSAiV2FybmluZyIgY2hvaWNlIGluIHRoZSBjb21ibydzIG1vZGVsLgorCSAqLworCXByaXZhdGUgZmluYWwgaW50IFdBUk5JTkdfSU5ERVggPSAyOworCisJLyoqCisJICogQ29uc3RhbnQgdXNlZCB0byBzdG9yZSB0aGUgZXhwYW5zaW9uIHN0YXRlIG9mIGVhY2ggZXhwYW5kYWJsZSBwYW5lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRJTkdTX0VYUEFOREVEID0gImV4cGFuZGVkIjsKKworCS8qKgorCSAqIFRoZSBwcmVmZXJlbmNlIGtleSB1c2VkIHRvIHJldHJpZXZlIHRoZSBkaWFsb2cgc2V0dGluZ3Mgd2hlcmUgdGhlIGV4cGFuc2lvbgorCSAqIHN0YXRlcyBoYXZlIGJlZW4gc3RvcmVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRJTkdTX1NFQ1RJT05fTkFNRSA9ICJKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2UiOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2U8L2NvZGU+LgorCSAqLworCXB1YmxpYyBKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2UoKSB7CisJCXN1cGVyKCk7CisJCWluaXRpYWxpemUoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkQXR0cmlidXRlTGV2ZWxDYXRlZ29yeShDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJcGFyZW50ID0gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuQVRUUklCVVRFX0xFVkVMX0NBVEVHT1JZKTsKKworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuTUFQUElOR19VTlJFU09MVkVEX01BUFBFRF9CWSwgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19VTlJFU09MVkVEX01BUFBFRF9CWSk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5NQVBQSU5HX0lOVkFMSURfTUFQUEVEX0JZLCAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX0lOVkFMSURfTUFQUEVEX0JZKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLk1BUFBJTkdfTUFQUEVEX0JZX1dJVEhfSk9JTl9UQUJMRSwgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfTUFQUEVEX0JZX1dJVEhfSk9JTl9UQUJMRSk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5NQVBQSU5HX01BUFBFRF9CWV9PTl9CT1RIX1NJREVTLCAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX01BUFBFRF9CWV9PTl9CT1RIX1NJREVTKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRBUkdFVF9FTlRJVFlfTk9UX0RFRklORUQsICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBUkdFVF9FTlRJVFlfTk9UX0RFRklORUQpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVEFSR0VUX0VOVElUWV9JU19OT1RfQU5fRU5USVRZLCAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFSR0VUX0VOVElUWV9JU19OT1RfQU5fRU5USVRZKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCBhZGRzIHRvIHRoZSBnaXZlbiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IGFuIGV4cGFuZGFibGUgcGFuZQorCSAqIHdoZXJlIGl0cyBjb250ZW50IGNhbiBiZSBzaG93biBvciBoaWRkZW4gZGVwZW5kaW5nIG9uIHRoZSBleHBhbnNpb24gc3RhdGUuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHRleHQgVGhlIHRpdGxlIG9mIHRoZSBleHBhbmRhYmxlIHNlY3Rpb24KKwkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgdG8gd2hpY2ggd2lkZ2V0cyBjYW4gYmUgYWRkZWQsIHdoaWNoIGlzIGEgY2hpbGQgb2YKKwkgKiB0aGUgZXhwYW5kYWJsZSBwYW5lCisJICovCisJcHJpdmF0ZSBDb21wb3NpdGUgYWRkRXhwYW5kYWJsZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKKworCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGV4cGFuZGFibGVQYW5lID0gbmV3IEV4cGFuZGFibGVDb21wb3NpdGUoCisJCQlwYXJlbnQsCisJCQlTV1QuTk9ORSwKKwkJCUV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuQ0xJRU5UX0lOREVOVAorCQkpOworCisJCWV4cGFuZGFibGVQYW5lLnNldFRleHQodGV4dCk7CisJCWV4cGFuZGFibGVQYW5lLnNldEV4cGFuZGVkKGZhbHNlKTsKKwkJZXhwYW5kYWJsZVBhbmUuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXRCb2xkKEpGYWNlUmVzb3VyY2VzLkRJQUxPR19GT05UKSk7CisJCWV4cGFuZGFibGVQYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKSk7CisJCWV4cGFuZGFibGVQYW5lLmFkZEV4cGFuc2lvbkxpc3RlbmVyKGJ1aWxkRXhwYW5zaW9uTGlzdGVuZXIoKSk7CisKKwkJc2Nyb2xsYWJsZS5hZGFwdENoaWxkKGV4cGFuZGFibGVQYW5lKTsKKwkJZXhwYW5kYWJsZVBhbmVzLmFkZChleHBhbmRhYmxlUGFuZSk7CisKKwkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShleHBhbmRhYmxlUGFuZSwgU1dULk5PTkUpOworCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7CisJCWV4cGFuZGFibGVQYW5lLnNldENsaWVudChwYXJlbnQpOworCisJCXJldHVybiBwYXJlbnQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZEltcGxpZWRBc3NvY2lhdGlvbkNhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlwYXJlbnQgPSBhZGRFeHBhbmRhYmxlU2VjdGlvbihwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5JTVBMSUVEX0FTU09DSUFUSU9OX0NBVEVHT1JZKTsKKworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFLCAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkSW1wbGllZEF0dHJpYnV0ZUNhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlwYXJlbnQgPSBhZGRFeHBhbmRhYmxlU2VjdGlvbihwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5JTVBMSUVEX0FUVFJJQlVURV9DQVRFR09SWSk7CisKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRyk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUUpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1RBQkxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRV9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUVfTVVMVElQTEVfSk9JTl9DT0xVTU5TKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUywgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRV9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfVEFSR0VUX0VOVElUWV9JU19OT1RfQU5fRU5USVRZLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX1RBUkdFVF9FTlRJVFlfSVNfTk9UX0FOX0VOVElUWSk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX05PVF9ERUZJTkVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfVEFSR0VUX0VOVElUWV9OT1RfREVGSU5FRCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZEluaGVyaXRhbmNlU3RyYXRlZ29yeUNhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlwYXJlbnQgPSBhZGRFeHBhbmRhYmxlU2VjdGlvbihwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5JTkhFUklUQU5DRV9DQVRFR09SWSk7CisKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkRJU0NSSU1JTkFUT1JfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkRJU0NSSU1JTkFUT1JfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9TVVBQT1JURURfT05fUExBVEZPUk0sIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9TVVBQT1JURURfT05fUExBVEZPUk0pOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfUE9SVEFCTEVfT05fUExBVEZPUk0sICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfUE9SVEFCTEVfT05fUExBVEZPUk0pOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW5kIGFkZHMgdG8gdGhlIGdpdmVuIHBhcmVudCBhIGxhYmVsZWQgY29tYm8gd2hlcmUgdGhlIHBvc3NpYmxlCisJICogY2hvaWNlcyBhcmUgIklnbm9yZSIsICJFcnJvciIgYW5kICJXYXJuaW5nIi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB0byB3aGljaCB0aGUgd2lkZ2V0cyBhcmUgYWRkZWQKKwkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGxhYmVsbGluZyB0aGUgY29tYm8KKwkgKiBAcGFyYW0gcHJlZmVyZW5jZUtleSBUaGUga2V5IHVzZWQgdG8gcmV0cmlldmUgYW5kIHRvIHN0b3JlIHRoZSB2YWx1ZQorCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsaWRhdGlvbiBwcm9ibGVtCisJICovCisJcHJpdmF0ZSB2b2lkIGFkZExhYmVsZWRDb21ibyhDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmZXJlbmNlS2V5KSB7CisKKworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCWxhYmVsLnNldFRleHQobGFiZWxUZXh0KTsKKworCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOworCQljb21iby5zZXRJdGVtcyhzZXZlcml0eURpc3BsYXlTdHJpbmdzKTsKKwkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7CisJCWNvbWJvLnNldERhdGEoUFJFRkVSRU5DRV9LRVksIHByZWZlcmVuY2VLZXkpOworCQljb21iby5zZWxlY3QoY29udmVydFByZWZlcmVuY2VWYWx1ZVRvSW5kZXgocHJlZmVyZW5jZUtleSkpOworCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidWlsZENvbWJvU2VsZWN0aW9uTGlzdGVuZXIoKSk7CisKKwkJc2Nyb2xsYWJsZS5hZGFwdENoaWxkKGNvbWJvKTsKKwkJY29tYm9zLmFkZChjb21ibyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFBlcnNpc3RlbmNlTGV2ZWxDYXRlZ29yeShDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJcGFyZW50ID0gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9MRVZFTF9DQVRFR09SWSk7CisKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfTUFQUElOR19GSUxFLCAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9NQVBQSU5HX0ZJTEUpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNVUFBPUlRFRF9NQVBQSU5HX0ZJTEVfQ09OVEVOVCwgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1VOU1VQUE9SVEVEX01BUFBJTkdfRklMRV9DT05URU5UKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfTUFQUElOR19GSUxFLCAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9NQVBQSU5HX0ZJTEUpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX01BUFBJTkdfRklMRSwgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0lOVkFMSURfTUFQUElOR19GSUxFKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX01BUFBJTkdfRklMRSwgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfTUFQUElOR19GSUxFKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfQ0xBU1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9DTEFTUyk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX0NMQVNTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfQ0xBU1MpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX0NMQVNTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0lOVkFMSURfQ0xBU1MpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfQ0xBU1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9DTEFTUyk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1JFRFVOREFOVF9DTEFTUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfUkVEVU5EQU5UX0NMQVNTKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0pBUl9GSUxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfSkFSX0ZJTEUpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9KQVJfRklMRSwgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0pBUl9GSUxFKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfSkFSX0ZJTEVfREVQTE9ZTUVOVF9QQVRIX1dBUk5JTkcsICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9KQVJfRklMRV9ERVBMT1lNRU5UX1BBVEhfV0FSTklORyk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX0pBUl9GSUxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfSkFSX0ZJTEUpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuTUFQUElOR19GSUxFX0VYVFJBTkVPVVNfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUywgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX0ZJTEVfRVhUUkFORU9VU19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9NQVBQRURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklULCAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9UWVBFX01BUFBFRF9CVVRfTk9UX0lOQ0xVREVEX0lOX1BFUlNJU1RFTkNFX1VOSVQpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9UWVBFX0FOTk9UQVRFRF9CVVRfTk9UX0lOQ0xVREVEX0lOX1BFUlNJU1RFTkNFX1VOSVQsIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfQU5OT1RBVEVEX0JVVF9OT1RfSU5DTFVERURfSU5fUEVSU0lTVEVOQ0VfVU5JVCk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfVU5TUEVDSUZJRURfQ0xBU1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DTEFTUyk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfVU5SRVNPTFZFRF9DTEFTUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9VTlJFU09MVkVEX0NMQVNTKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkUGh5c2ljYWxNYXBwaW5nQ2F0ZWdvcnkoQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXBhcmVudCA9IGFkZEV4cGFuZGFibGVTZWN0aW9uKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBIWVNJQ0FMX01BUFBJTkdfQ0FURUdPUlkpOworCisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRBQkxFX1VOUkVTT0xWRURfU0NIRU1BLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UQUJMRV9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9OQU1FKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5TRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5TRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX05BTUUpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkpPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkpPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX05BTUUpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUVfTVVMVElQTEVfSk9JTl9DT0xVTU5TLCAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRV9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUVfTVVMVElQTEVfSk9JTl9DT0xVTU5TKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFByb2plY3RMZXZlbENhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlwYXJlbnQgPSBhZGRFeHBhbmRhYmxlU2VjdGlvbihwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QUk9KRUNUX0xFVkVMX0NBVEVHT1JZKTsKKworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuTk9fSlBBX1BST0pFQ1QsICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5OT19KUEFfUFJPSkVDVCk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QUk9KRUNUX05PX0NPTk5FQ1RJT04sICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfTk9fQ09OTkVDVElPTik7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QUk9KRUNUX0lOVkFMSURfQ09OTkVDVElPTiwgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfSU5WQUxJRF9DT05ORUNUSU9OKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBST0pFQ1RfSU5BQ1RJVkVfQ09OTkVDVElPTiwgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUFJPSkVDVF9JTkFDVElWRV9DT05ORUNUSU9OKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlhNTF9WRVJTSU9OX05PVF9MQVRFU1QsICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1ZFUlNJT05fTk9UX0xBVEVTVCk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QUk9KRUNUX05PX1BFUlNJU1RFTkNFX1hNTCwgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfTk9fUEVSU0lTVEVOQ0VfWE1MKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBST0pFQ1RfTVVMVElQTEVfUEVSU0lTVEVOQ0VfWE1MLCAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUFJPSkVDVF9NVUxUSVBMRV9QRVJTSVNURU5DRV9YTUwpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfTk9fUEVSU0lTVEVOQ0VfVU5JVCwgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklUKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX01VTFRJUExFX1BFUlNJU1RFTkNFX1VOSVRTLCBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfTVVMVElQTEVfUEVSU0lTVEVOQ0VfVU5JVFMpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfWE1MX0lOVkFMSURfQ09OVEVOVCwgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9YTUxfSU5WQUxJRF9DT05URU5UKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkUXVlcmllc0dlbmVyYXRvcnNDYXRlZ29yeShDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJcGFyZW50ID0gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUVVFUklFU19HRU5FUkFUT1JTX0NBVEVHT1JZKTsKKworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FLCAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLklEX01BUFBJTkdfVU5SRVNPTFZFRF9HRU5FUkFUT1JfTkFNRSwgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLklEX01BUFBJTkdfVU5SRVNPTFZFRF9HRU5FUkFUT1JfTkFNRSk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5HRU5FUkFURURfVkFMVUVfVU5SRVNPTFZFRF9HRU5FUkFUT1IsIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5HRU5FUkFURURfVkFMVUVfVU5SRVNPTFZFRF9HRU5FUkFUT1IpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUVVFUllfRFVQTElDQVRFX05BTUUsICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUVVFUllfRFVQTElDQVRFX05BTUUpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRUeXBlTGV2ZWxDYXRlZ29yeShDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJcGFyZW50ID0gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVFlQRV9MRVZFTF9DQVRFR09SWSk7CisKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkVOVElUWV9OT19JRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTk9fSUQpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRU5USVRZX1NJTkdMRV9UQUJMRV9ERVNDRU5EQU5UX0RFRklORVNfVEFCTEUsICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9TSU5HTEVfVEFCTEVfREVTQ0VOREFOVF9ERUZJTkVTX1RBQkxFKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkVOVElUWV9BQlNUUkFDVF9UQUJMRV9QRVJfQ0xBU1NfREVGSU5FU19UQUJMRSwgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfQUJTVFJBQ1RfVEFCTEVfUEVSX0NMQVNTX0RFRklORVNfVEFCTEUpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRU5USVRZX0FCU1RSQUNUX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRCwgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9BQlNUUkFDVF9ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQsICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVEKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkVOVElUWV9OT05fUk9PVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVELCAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTk9OX1JPT1RfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRCk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0RFRklORUQsICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVEKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX1VOU1BFQ0lGSUVEX05BTUUsICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9VTlNQRUNJRklFRF9OQU1FKTsKKwkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9VTlJFU09MVkVEX05BTUUpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5IRVJJVEVEX0FUVFJJQlVURVNfTk9UX1NVUFBPUlRFRCwgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOSEVSSVRFRF9BVFRSSUJVVEVTX05PVF9TVVBQT1JURUQpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9NQVBQSU5HLCAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfTUFQUElORyk7CisJCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9GSU5BTF9GSUVMRCwgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfRklFTEQpOworCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfUFVCTElDX0ZJRUxELCAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX1BVQkxJQ19GSUVMRCk7CisJfQorCisJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZENvbWJvU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBlLndpZGdldDsKKwkJCQlTdHJpbmcgcHJlZmVyZW5jZUtleSA9IChTdHJpbmcpIGNvbWJvLmdldERhdGEoUFJFRkVSRU5DRV9LRVkpOworCQkJCVN0cmluZyB2YWx1ZSA9IGNvbnZlcnRUb1ByZWZlcmVuY2VWYWx1ZShjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKKwkJCQl1cGRhdGVQcmVmZXJlbmNlKHByZWZlcmVuY2VLZXksIHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIEV4cGFuc2lvbkFkYXB0ZXIgYnVpbGRFeHBhbnNpb25MaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBFeHBhbnNpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBleHBhbnNpb25TdGF0ZUNoYW5nZWQoRXhwYW5zaW9uRXZlbnQgZSkgeworCQkJCUpwYVByb2JsZW1TZXZlcml0aWVzUGFnZS50aGlzLmV4cGFuc2lvblN0YXRlQ2hhbmdlZCgpOworCQkJfQorCQl9OworCX0KKworCXByb3RlY3RlZCBTdHJpbmdbXSBidWlsZFNldmVyaXR5RGlzcGxheVN0cmluZ3MoKSB7CisJCVN0cmluZ1tdIHNldmVyaXRpZXMgPSBuZXcgU3RyaW5nWzVdOworCQlzZXZlcml0aWVzW0RFRkFVTFRfSU5ERVhdID0gSnB0VWlNZXNzYWdlcy5KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfRGVmYXVsdDsKKwkJc2V2ZXJpdGllc1tFUlJPUl9JTkRFWF0gICA9IEpwdFVpTWVzc2FnZXMuSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX0Vycm9yOworCQlzZXZlcml0aWVzW1dBUk5JTkdfSU5ERVhdID0gSnB0VWlNZXNzYWdlcy5KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfV2FybmluZzsKKwkJc2V2ZXJpdGllc1tJR05PUkVfSU5ERVhdICA9IEpwdFVpTWVzc2FnZXMuSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX0lnbm9yZTsKKwkJc2V2ZXJpdGllc1tJTkZPX0lOREVYXSAgICA9IEpwdFVpTWVzc2FnZXMuSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX0luZm87CisJCXJldHVybiBzZXZlcml0aWVzOworCX0KKworCXByb3RlY3RlZCBpbnQgY29udmVydFByZWZlcmVuY2VWYWx1ZVRvSW5kZXgoU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKKwkJU3RyaW5nIHNldmVyaXR5ID0gcHJlZmVyZW5jZVZhbHVlKHByZWZlcmVuY2VLZXkpOworCisJCWlmIChKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuSElHSF9TRVZFUklUWS5lcXVhbHMoc2V2ZXJpdHkpKSB7CisJCQlyZXR1cm4gRVJST1JfSU5ERVg7CisJCX0KKworCQlpZiAoSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLk5PUk1BTF9TRVZFUklUWS5lcXVhbHMoc2V2ZXJpdHkpKSB7CisJCQlyZXR1cm4gV0FSTklOR19JTkRFWDsKKwkJfQorCisJCWlmIChKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTE9XX1NFVkVSSVRZLmVxdWFscyhzZXZlcml0eSkpIHsKKwkJCXJldHVybiBJTkZPX0lOREVYOworCQl9CisKKwkJaWYgKEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5JR05PUkUuZXF1YWxzKHNldmVyaXR5KSkgeworCQkJcmV0dXJuIElHTk9SRV9JTkRFWDsKKwkJfQorCisJCXJldHVybiBERUZBVUxUX0lOREVYOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvUHJlZmVyZW5jZVZhbHVlKGludCBzZWxlY3Rpb25JbmRleCkgeworCQlzd2l0Y2ggKHNlbGVjdGlvbkluZGV4KSB7CisJCQljYXNlIEVSUk9SX0lOREVYOiAgIHJldHVybiBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuSElHSF9TRVZFUklUWTsKKwkJCWNhc2UgV0FSTklOR19JTkRFWDogcmV0dXJuIEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5OT1JNQUxfU0VWRVJJVFk7CisJCQljYXNlIElORk9fSU5ERVg6ICAgIHJldHVybiBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTE9XX1NFVkVSSVRZOworCQkJY2FzZSBJR05PUkVfSU5ERVg6ICByZXR1cm4gSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLklHTk9SRTsKKwkJCWRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlUHJlZmVyZW5jZUNvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkgeworCisJCVBpeGVsQ29udmVydGVyIHBpeGVsQ29udmVydGVyID0gbmV3IFBpeGVsQ29udmVydGVyKHBhcmVudCk7CisKKwkJLy8gQ3JlYXRlIGEgY29udGFpbmVyIGJlY2F1c2UgdGhlIGNhbGxlciB3aWxsIHNldCB0aGUgR3JpZERhdGEgYW5kIHdlIG5lZWQKKwkJLy8gdG8gY2hhbmdlIHRoZSBoZWlnaHRIaW50IG9mIHRoZSBmaXJzdCBjaGlsZCBhbmQgd2UgYWxzbyBuZWVkIHRvIHNldCB0aGUKKwkJLy8gZm9udCBvdGhlcndpc2UgdGhlIGxheW91dCB3b24ndCBiZSBjYWxjdWxhdGVkIGNvcnJlY3RseQorCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJY29udGFpbmVyLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoICA9IDA7CisJCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKKworCQkvLyBDcmVhdGUgdGhlIG1haW4gY29tcG9zaXRlIG9mIHRoaXMgcGFnZQorCQlzY3JvbGxhYmxlID0gbmV3IFNjcm9sbGVkUGFnZUNvbnRlbnQoY29udGFpbmVyKTsKKworCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCB0cnVlKTsKKwkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IHBpeGVsQ29udmVydGVyLmNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMjApOworCQlzY3JvbGxhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCisJCS8vIFVwZGF0ZSB0aGUgbGF5b3V0IG9mIHRoZSBTY3JvbGxlZFBhZ2VDb250ZW50J3MgYm9keQorCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlsYXlvdXQubWFyZ2luV2lkdGggID0gMDsKKworCQlwYXJlbnQgPSBzY3JvbGxhYmxlLmdldEJvZHkoKTsKKwkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUpKTsKKwkJcGFyZW50LnNldExheW91dChsYXlvdXQpOworCisJCS8vIEFkZCBlYWNoIGV4cGFuZGFibGUgY2F0ZWdvcnkKKwkJYWRkUHJvamVjdExldmVsQ2F0ZWdvcnkocGFyZW50KTsKKwkJYWRkUGVyc2lzdGVuY2VMZXZlbENhdGVnb3J5KHBhcmVudCk7CisJCWFkZFR5cGVMZXZlbENhdGVnb3J5KHBhcmVudCk7CisJCWFkZEF0dHJpYnV0ZUxldmVsQ2F0ZWdvcnkocGFyZW50KTsKKwkJYWRkUGh5c2ljYWxNYXBwaW5nQ2F0ZWdvcnkocGFyZW50KTsKKwkJYWRkSW1wbGllZEF0dHJpYnV0ZUNhdGVnb3J5KHBhcmVudCk7CisJCWFkZEltcGxpZWRBc3NvY2lhdGlvbkNhdGVnb3J5KHBhcmVudCk7CisJCWFkZEluaGVyaXRhbmNlU3RyYXRlZ29yeUNhdGVnb3J5KHBhcmVudCk7CisJCWFkZFF1ZXJpZXNHZW5lcmF0b3JzQ2F0ZWdvcnkocGFyZW50KTsKKworCQkvLyBSZXN0b3JlIHRoZSBleHBhbnNpb24gc3RhdGVzCisJCXJlc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKGRpYWxvZ1ByZWZlcmVuY2VzKCkpOworCisJCXJldHVybiBjb250YWluZXI7CisJfQorCisJcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBkaWFsb2dQcmVmZXJlbmNlcygpIHsKKwkJSURpYWxvZ1NldHRpbmdzIHJvb3RTZXR0aW5ncyA9IEpwdFVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKKwkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gcm9vdFNldHRpbmdzLmdldFNlY3Rpb24oU0VUVElOR1NfU0VDVElPTl9OQU1FKTsKKwkJaWYgKHNldHRpbmdzID09IG51bGwpIHsKKwkJCXNldHRpbmdzID0gcm9vdFNldHRpbmdzLmFkZE5ld1NlY3Rpb24oU0VUVElOR1NfU0VDVElPTl9OQU1FKTsKKwkJfQorCQlyZXR1cm4gc2V0dGluZ3M7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN0b3JlU2VjdGlvbkV4cGFuc2lvblN0YXRlcyhkaWFsb2dQcmVmZXJlbmNlcygpKTsKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCS8qKgorCSAqIFJldmFsaWRhdGVzIHRoZSBsYXlvdXQgaW4gb3JkZXIgdG8gc2hvdyBvciBoaWRlIHRoZSB2ZXJ0aWNhbCBzY3JvbGwgYmFyCisJICogYWZ0ZXIgYSBzZWN0aW9uIHdhcyBlaXRoZXIgZXhwYW5kZWQgb3IgY29sbGFwc2VkLiBUaGlzIHVuZm9ydHVuYXRlbHkgZG9lcworCSAqIG5vdCBoYXBwZW4gYXV0b21hdGljYWxseS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBleHBhbnNpb25TdGF0ZUNoYW5nZWQoKSB7CisJCXNjcm9sbGFibGUucmVmbG93KHRydWUpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSUQoKSB7CisJCXJldHVybiBKUFRfUFJFRkVSRU5DRVNfUFJPQkxFTV9TRVZFUklUSUVTX0lEOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5UGFnZUlEKCkgeworCQlyZXR1cm4gSlBUX1BST1BFUlRZX1BBR0VTX1BST0JMRU1fU0VWRVJJVElFU19JRDsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFzUHJvamVjdFNwZWNpZmljT3B0aW9ucyhJUHJvamVjdCBwcm9qZWN0KSB7CisJCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJvamVjdFByZWZlcmVuY2VzID0gSnB0Q29yZVBsdWdpbi5nZXRQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCk7CisKKwkJLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgbWVzc2FnZSBJRHMKKwkJZm9yIChGaWVsZCBmaWVsZCA6IEpwYVZhbGlkYXRpb25NZXNzYWdlcy5jbGFzcy5nZXRGaWVsZHMoKSkgeworCQkJdHJ5IHsKKwkJCQkvLyBSZXRyaWV2ZSB0aGUgdmFsdWUKKwkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBmaWVsZC5nZXQobnVsbCk7CisKKwkJCQkvLyBTa2lwIHRoaXMgb25lCisJCQkJaWYgKEpwYVZhbGlkYXRpb25NZXNzYWdlcy5CVU5ETEVfTkFNRS5lcXVhbHModmFsdWUpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZSBJRAorCQkJCWlmIChwcm9qZWN0UHJlZmVyZW5jZXMuZ2V0KHZhbHVlLCBudWxsKSAhPSBudWxsKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJLy8gSSB0aGluayB3ZSBjYW4gc2FmZWx5IGlnbm9yZSBhbnkgcHJvYmxlbQorCQkJfQorCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7CisJCXNldFByZWZlcmVuY2VTdG9yZShKcHRVaVBsdWdpbi5pbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKKwkJc2V0RGVzY3JpcHRpb24oSnB0VWlNZXNzYWdlcy5KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfRGVzY3JpcHRpb24pOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIHRoaXMgcGFnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQljb21ib3MgICAgICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxDb21ibz4oKTsKKwkJZXhwYW5kYWJsZVBhbmVzICAgICAgICA9IG5ldyBBcnJheUxpc3Q8RXhwYW5kYWJsZUNvbXBvc2l0ZT4oKTsKKwkJc2V2ZXJpdHlEaXNwbGF5U3RyaW5ncyA9IGJ1aWxkU2V2ZXJpdHlEaXNwbGF5U3RyaW5ncygpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKKwkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7CisJCS8vdGhpcyBjYWxsIHdvdWxkIGJlIHJlZHVuZGFudCBvbiBwcm9qZWN0IHByZWZlcmVuY2UgcGFnZQorCQlpZiAoIWlzUHJvamVjdFByZWZlcmVuY2VQYWdlKCkpIHsKKwkJCXJldmVydFRvRGVmYXVsdCgpOworCQl9CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGVuYWJsZVByb2plY3RTcGVjaWZpY1NldHRpbmdzKGJvb2xlYW4gdXNlUHJvamVjdFNwZWNpZmljU2V0dGluZ3MpIHsKKwkJc3VwZXIuZW5hYmxlUHJvamVjdFNwZWNpZmljU2V0dGluZ3ModXNlUHJvamVjdFNwZWNpZmljU2V0dGluZ3MpOworCQkKKwkJLy9yZW1vdmUgYW55IHByb2plY3Qgc3BlY2lmaWMgc2V0dGluZ3MgaWYgc2V0IHRvIGZhbHNlCisJCWlmICghdXNlUHJvamVjdFNwZWNpZmljU2V0dGluZ3MpeworCQkJcmV2ZXJ0VG9EZWZhdWx0KCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHByZWZlcmVuY2VWYWx1ZShTdHJpbmcgcHJlZmVyZW5jZUtleSkgeworCQlpZiAoaXNQcm9qZWN0UHJlZmVyZW5jZVBhZ2UoKSkgeworCQkJcmV0dXJuIEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5nZXRQcm9qZWN0TGV2ZWxQcm9ibGVtUHJlZmVyZW5jZShnZXRQcm9qZWN0KCksIHByZWZlcmVuY2VLZXkpOworCQl9CisJCXJldHVybiBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuZ2V0V29ya3NwYWNlTGV2ZWxQcm9ibGVtUHJlZmVyZW5jZShwcmVmZXJlbmNlS2V5KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlU2VjdGlvbkV4cGFuc2lvblN0YXRlcyhJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MpIHsKKworCQlmb3IgKGludCBpbmRleCA9IGV4cGFuZGFibGVQYW5lcy5zaXplKCk7IC0taW5kZXggPj0gMDsgKSB7CisKKwkJCUV4cGFuZGFibGVDb21wb3NpdGUgZXhwYW5kYWJsZVBhbmUgPSBleHBhbmRhYmxlUGFuZXMuZ2V0KGluZGV4KTsKKworCQkJaWYgKHNldHRpbmdzID09IG51bGwpIHsKKwkJCQkvLyBPbmx5IGV4cGFuZCB0aGUgZmlyc3Qgbm9kZSBieSBkZWZhdWx0CisJCQkJZXhwYW5kYWJsZVBhbmUuc2V0RXhwYW5kZWQoaW5kZXggPT0gMCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlleHBhbmRhYmxlUGFuZS5zZXRFeHBhbmRlZChzZXR0aW5ncy5nZXRCb29sZWFuKFNFVFRJTkdTX0VYUEFOREVEICsgaW5kZXgpKTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHJldmVydFRvRGVmYXVsdCgpIHsKKworCQlpbnQgZGVmYXVsdFZhbHVlID0gREVGQVVMVF9JTkRFWDsKKworCQlmb3IgKENvbWJvIGNvbWJvIDogY29tYm9zKSB7CisJCQlTdHJpbmcgcHJlZmVyZW5jZUtleSA9IChTdHJpbmcpIGNvbWJvLmdldERhdGEoUFJFRkVSRU5DRV9LRVkpOworCQkJU3RyaW5nIHZhbHVlID0gY29udmVydFRvUHJlZmVyZW5jZVZhbHVlKGRlZmF1bHRWYWx1ZSk7CisJCQl1cGRhdGVQcmVmZXJlbmNlKHByZWZlcmVuY2VLZXksIHZhbHVlKTsKKwkJCWNvbWJvLnNlbGVjdChkZWZhdWx0VmFsdWUpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncykgeworCisJCWZvciAoaW50IGluZGV4ID0gZXhwYW5kYWJsZVBhbmVzLnNpemUoKTsgLS1pbmRleCA+PSAwOyApIHsKKwkJCUV4cGFuZGFibGVDb21wb3NpdGUgZXhwYW5kYWJsZVBhbmUgPSBleHBhbmRhYmxlUGFuZXMuZ2V0KGluZGV4KTsKKwkJCXNldHRpbmdzLnB1dChTRVRUSU5HU19FWFBBTkRFRCArIGluZGV4LCBleHBhbmRhYmxlUGFuZS5pc0V4cGFuZGVkKCkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJlZmVyZW5jZShTdHJpbmcgcHJlZmVyZW5jZUtleSwgU3RyaW5nIHZhbHVlKSB7CisJCWlmIChpc1Byb2plY3RQcmVmZXJlbmNlUGFnZSgpKSB7CisJCQlKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuc2V0UHJvamVjdExldmVsUHJvYmxlbVByZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCBwcmVmZXJlbmNlS2V5LCB2YWx1ZSk7CisJCX0KKwkJZWxzZSB7CisJCQlKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuc2V0V29ya3NwYWNlTGV2ZWxQcm9ibGVtUHJlZmVyZW5jZShwcmVmZXJlbmNlS2V5LCB2YWx1ZSk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJlZnMvSnBhUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ByZWZzL0pwYVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMzYxZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJlZnMvSnBhUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wcmVmczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQZXJzaXN0ZW50UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucHJlZnMuSnBhUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLlNjb3BlZFByZWZlcmVuY2VTdG9yZTsKLQotcHVibGljIGNsYXNzIEpwYVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgCi0JaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qcHQudWkuanBhUHJlZmVyZW5jZVBhZ2UiOwotCQotCQotCXByaXZhdGUgSVBlcnNpc3RlbnRQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZXM7Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHVzZXJMaWJQcmVmZXJlbmNlczsKLQkKLQlwcml2YXRlIExhYmVsIGpwYUxpYkxhYmVsOwotCQkKLQlwcml2YXRlIENvbWJvIGpwYUxpYkNvbWJvOwotCQotCXByaXZhdGUgTGluayB1c2VyTGlic0xpbms7Ci0JCQotCQotCXB1YmxpYyBKcGFQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJcHJlZmVyZW5jZXMgPSAKLQkJCW5ldyBTY29wZWRQcmVmZXJlbmNlU3RvcmUoCi0JCQkJbmV3IEluc3RhbmNlU2NvcGUoKSwKLQkJCQlKcHRDb3JlUGx1Z2luLmluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQl1c2VyTGliUHJlZmVyZW5jZXMgPQotCQkJbmV3IFNjb3BlZFByZWZlcmVuY2VTdG9yZSgKLQkJCQluZXcgSW5zdGFuY2VTY29wZSgpLAotCQkJCUphdmFDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkge30KLQkKLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWpwYUxpYkxhYmVsID0gY3JlYXRlTGFiZWwoY29udGFpbmVyLCAxLCBKcHRVaU1lc3NhZ2VzLkpwYVByZWZlcmVuY2VQYWdlX2RlZmF1bHRKcGFMaWIpOwotCQkJCi0JCWpwYUxpYkNvbWJvID0gY3JlYXRlQ29tYm8oY29udGFpbmVyLCB0cnVlKTsKLQkJCi0JCXVzZXJMaWJzTGluayA9ICBuZXcgTGluayhjb250YWluZXIsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXVzZXJMaWJzTGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl1c2VyTGlic0xpbmsuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYVByZWZlcmVuY2VQYWdlX3VzZXJMaWJzTGluayk7Ci0JCXVzZXJMaWJzTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJKChJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcikgZ2V0Q29udGFpbmVyKCkpCi0JCQkJCQkub3BlblBhZ2UoSmF2YVVJLklEX1VTRVJfTElCUkFSWV9QUkVGRVJFTkNFX1BBR0UsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJCQotCQlwZXJmb3JtRGVmYXVsdHMoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JcHJpdmF0ZSBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBib29sZWFuIGZpbGxIb3Jpem9udGFsKSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJaWYgKGZpbGxIb3Jpem9udGFsKSB7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJfQotCQllbHNlIHsKLQkJCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQl9Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGxKcGFMaWJzKCkgewotCQlpbnQgaW5kZXggPSBqcGFMaWJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlTdHJpbmcgc2VsZWN0ZWRKcGFMaWIgPSBudWxsOwotCQlpZiAoaW5kZXggPj0gMCkgewotCQkJc2VsZWN0ZWRKcGFMaWIgPSBqcGFMaWJDb21iby5nZXRJdGVtKGpwYUxpYkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQl9Ci0JCQotCQlqcGFMaWJDb21iby5jbGVhclNlbGVjdGlvbigpOwotCQlqcGFMaWJDb21iby5zZXRJdGVtcyhKYXZhQ29yZS5nZXRVc2VyTGlicmFyeU5hbWVzKCkpOwotCQkKLQkJaWYgKHNlbGVjdGVkSnBhTGliICE9IG51bGwpIHsKLQkJCWludCBuZXdJbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGpwYUxpYkNvbWJvLmdldEl0ZW1zKCksIHNlbGVjdGVkSnBhTGliKTsKLQkJCWlmIChuZXdJbmRleCA+PSAwKSB7Ci0JCQkJanBhTGliQ29tYm8uc2VsZWN0KG5ld0luZGV4KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJZmlsbEpwYUxpYnMoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWZpbGxKcGFMaWJzKCk7Ci0JCVN0cmluZyBkZWZhdWx0TGliID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEpwYVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0pQQV9MSUIpOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShkZWZhdWx0TGliKSkgewotCQkJaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihqcGFMaWJDb21iby5nZXRJdGVtcygpLCBkZWZhdWx0TGliKTsKLQkJfQotCQlpZiAoaW5kZXggPj0gMCkgewotCQkJanBhTGliQ29tYm8uc2VsZWN0KGluZGV4KTsKLQkJfQotCQkKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlpbnQgaW5kZXggPSBqcGFMaWJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlTdHJpbmcgZGVmYXVsdExpYiA9IChpbmRleCA+PSAwKSA/IGpwYUxpYkNvbWJvLmdldEl0ZW0oaW5kZXgpIDogbnVsbDsKLQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShkZWZhdWx0TGliKSkgewotCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoSnBhUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfSlBBX0xJQiwgZGVmYXVsdExpYik7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWZlcmVuY2VzLnNhdmUoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQlKcHRDb3JlUGx1Z2luLmxvZyhpb2UpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsIHBvaW50ZXIgY2hlY2sgLSBidWcgMTY4MzM3Ci0JCWlmIChqcGFMaWJMYWJlbCAhPSBudWxsKSBqcGFMaWJMYWJlbC5kaXNwb3NlKCk7Ci0JCWlmIChqcGFMaWJDb21ibyAhPSBudWxsKSBqcGFMaWJDb21iby5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JCi0JCQotLy8JCXByaXZhdGUgYm9vbGVhbiBsaWJDb250YWluc0pwYUNsYXNzZXMoKSB7Ci0vLwkJCXJldHVybiB0cnVlOwotLy8JCQlTdHJpbmcgamFyTG9jYXRpb24gPSBnZXRTdHJpbmdWYWx1ZSgpOwotLy8JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gSnB0VWlNZXNzYWdlcy5KcGFQcmVmZXJlbmNlUGFnZV9pbnZhbGlkSnBhTGliOwotLy8JCQlib29sZWFuIGhhc0Vycm9yID0gZmFsc2U7Ci0vLwkJCQotLy8JCQl0cnkgewotLy8JCQkJSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUoamFyTG9jYXRpb24pOwotLy8JCQkJaGFzRXJyb3IgPSBqYXJGaWxlLmdldEVudHJ5KCJqYXZheC9wZXJzaXN0ZW5jZS9FbnRpdHlNYW5hZ2VyLmNsYXNzIikgPT0gbnVsbDsKLS8vCQkJfQotLy8JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0vLwkJCQloYXNFcnJvciA9IHRydWU7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCWlmIChoYXNFcnJvcikgewotLy8JCQkJc2hvd0Vycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotLy8JCQl9Ci0vLwkJCWVsc2UgewotLy8JCQkJY2xlYXJFcnJvck1lc3NhZ2UoKTsKLS8vCQkJfQotLy8JCQkKLS8vCQkJcmV0dXJuICEgaGFzRXJyb3I7Ci0vLwkJfQotLy8JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSnBhUHJvamVjdFByb3BlcnRpZXNQYWdlLmphdmEKaW5kZXggM2RjM2ZiNC4uOGFmMDY0ZSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDI3ICsxMCw5NSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJvcGVydGllczsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRGF0YVNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldERhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwYVBsYXRmb3JtUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnB0Q29yZU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUxpYnJhcnlQcm92aWRlckNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLkpwYVByb2plY3QyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNhdGFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkRhdGFiYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5KcHREYlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi51aS5pbnRlcm5hbC5EVFBVaVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQml0VG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQm9vbGVhblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Bc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNldENvbGxlY3Rpb25WYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU2ltcGxlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeUluc3RhbGxEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkubGlicHJvdi5MaWJyYXJ5RmFjZXRQcm9wZXJ0eVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CkBAIC00MSwzNDIgKzEwOSwxNjUxIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwogCisvKioKKyAqIFdheSBtb3JlIGNvbXBsaWNhdGVkIFVJIHRoYW4geW91IHdvdWxkIHRoaW5rLi4uLgorICovCiBwdWJsaWMgY2xhc3MgSnBhUHJvamVjdFByb3BlcnRpZXNQYWdlCi0JZXh0ZW5kcyBEYXRhTW9kZWxQcm9wZXJ0eVBhZ2UKLQlpbXBsZW1lbnRzIEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcworCWV4dGVuZHMgTGlicmFyeUZhY2V0UHJvcGVydHlQYWdlIAogewotCXByaXZhdGUgUGxhdGZvcm1Hcm91cCBwbGF0Zm9ybUdyb3VwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSUQgPSAib3JnLmVjbGlwc2UuanB0LnVpLmpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZSI7IC8vJE5PTi1OTFMtMSQKIAotCXByaXZhdGUgQ29ubmVjdGlvbkdyb3VwIGNvbm5lY3Rpb25Hcm91cDsKKwlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPElQcm9qZWN0PiBwcm9qZWN0TW9kZWw7CisJcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsOworCXByaXZhdGUgZmluYWwgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5UcmlnZ2VyIHRyaWdnZXI7CiAKLQlwcml2YXRlIFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cCBwZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXA7CisJcHJpdmF0ZSBmaW5hbCBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gcGxhdGZvcm1JZE1vZGVsOworCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwbGF0Zm9ybUlkTGlzdGVuZXI7CisKKwlwcml2YXRlIGZpbmFsIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBjb25uZWN0aW9uTW9kZWw7CisJcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvblByb2ZpbGU+IGNvbm5lY3Rpb25Qcm9maWxlTW9kZWw7CisJcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZGlzY29ubmVjdGVkTW9kZWw7CisJcHJpdmF0ZSBMaW5rIGNvbm5lY3RMaW5rOworCisJcHJpdmF0ZSBmaW5hbCBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nRmxhZ01vZGVsOworCXByaXZhdGUgZmluYWwgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nTW9kZWw7CisJcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGRlZmF1bHRDYXRhbG9nTW9kZWw7CisJcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGNhdGFsb2dDaG9pY2VzTW9kZWw7CisKKwlwcml2YXRlIGZpbmFsIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYUZsYWdNb2RlbDsKKwlwcml2YXRlIGZpbmFsIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTW9kZWw7CisJcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGRlZmF1bHRTY2hlbWFNb2RlbDsKKwlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gc2NoZW1hQ2hvaWNlc01vZGVsOworCisJcHJpdmF0ZSBmaW5hbCBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlc01vZGVsOworCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbGlzdEFubm90YXRlZENsYXNzZXNNb2RlbDsKKworCXByaXZhdGUgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGpwYTJfMFByb2plY3RGbGFnTW9kZWw7CisKKwlwcml2YXRlIGZpbmFsIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBtZXRhbW9kZWxTb3VyY2VGb2xkZXJNb2RlbDsKKwlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gamF2YVNvdXJjZUZvbGRlckNob2ljZXNNb2RlbDsKKworCXByaXZhdGUgZmluYWwgQ2hhbmdlTGlzdGVuZXIgdmFsaWRhdGlvbkxpc3RlbmVyOwogCiAKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2FtcGxlUHJvcGVydHlQYWdlLgotCSAqLworCS8vICoqKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKioqCisKIAlwdWJsaWMgSnBhUHJvamVjdFByb3BlcnRpZXNQYWdlKCkgewotCQlzdXBlcihEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSnBhRmFjZXREYXRhTW9kZWxQcm92aWRlcigpKSk7CisJCXN1cGVyKCk7CisKKwkJdGhpcy5wcm9qZWN0TW9kZWwgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPElQcm9qZWN0PigpOworCQl0aGlzLmpwYVByb2plY3RNb2RlbCA9IG5ldyBKcGFQcm9qZWN0TW9kZWwodGhpcy5wcm9qZWN0TW9kZWwpOworCQl0aGlzLnRyaWdnZXIgPSBuZXcgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5UcmlnZ2VyKCk7CisKKwkJdGhpcy5wbGF0Zm9ybUlkTW9kZWwgPSB0aGlzLmJ1aWxkUGxhdGZvcm1JZE1vZGVsKCk7CisJCXRoaXMucGxhdGZvcm1JZExpc3RlbmVyID0gdGhpcy5idWlsZFBsYXRmb3JtSWRMaXN0ZW5lcigpOworCQl0aGlzLnBsYXRmb3JtSWRNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wbGF0Zm9ybUlkTGlzdGVuZXIpOworCisJCXRoaXMuY29ubmVjdGlvbk1vZGVsID0gdGhpcy5idWlsZENvbm5lY3Rpb25Nb2RlbCgpOworCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTW9kZWwgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGVNb2RlbCgpOworCQl0aGlzLmRpc2Nvbm5lY3RlZE1vZGVsID0gdGhpcy5idWlsZERpc2Nvbm5lY3RlZE1vZGVsKCk7CisKKwkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0ZsYWdNb2RlbCA9IHRoaXMuYnVpbGRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0ZsYWdNb2RlbCgpOworCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nTW9kZWwgPSB0aGlzLmJ1aWxkVXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dNb2RlbCgpOworCQl0aGlzLmRlZmF1bHRDYXRhbG9nTW9kZWwgPSB0aGlzLmJ1aWxkRGVmYXVsdENhdGFsb2dNb2RlbCgpOworCQl0aGlzLmNhdGFsb2dDaG9pY2VzTW9kZWwgPSB0aGlzLmJ1aWxkQ2F0YWxvZ0Nob2ljZXNNb2RlbCgpOworCisJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYUZsYWdNb2RlbCA9IHRoaXMuYnVpbGRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hRmxhZ01vZGVsKCk7CisJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU1vZGVsID0gdGhpcy5idWlsZFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFNb2RlbCgpOworCQl0aGlzLmRlZmF1bHRTY2hlbWFNb2RlbCA9IHRoaXMuYnVpbGREZWZhdWx0U2NoZW1hTW9kZWwoKTsKKwkJdGhpcy5zY2hlbWFDaG9pY2VzTW9kZWwgPSB0aGlzLmJ1aWxkU2NoZW1hQ2hvaWNlc01vZGVsKCk7CisKKwkJdGhpcy5kaXNjb3ZlckFubm90YXRlZENsYXNzZXNNb2RlbCA9IHRoaXMuYnVpbGREaXNjb3ZlckFubm90YXRlZENsYXNzZXNNb2RlbCgpOworCQl0aGlzLmxpc3RBbm5vdGF0ZWRDbGFzc2VzTW9kZWwgPSB0aGlzLmJ1aWxkTGlzdEFubm90YXRlZENsYXNzZXNNb2RlbCgpOworCisJCXRoaXMuanBhMl8wUHJvamVjdEZsYWdNb2RlbCA9IHRoaXMuYnVpbGRKcGEyXzBQcm9qZWN0RmxhZ01vZGVsKCk7CisKKwkJdGhpcy5tZXRhbW9kZWxTb3VyY2VGb2xkZXJNb2RlbCA9IHRoaXMuYnVpbGRNZXRhbW9kZWxTb3VyY2VGb2xkZXJNb2RlbCgpOworCQl0aGlzLmphdmFTb3VyY2VGb2xkZXJDaG9pY2VzTW9kZWwgPSB0aGlzLmJ1aWxkSmF2YVNvdXJjZUZvbGRlckNob2ljZXNNb2RlbCgpOworCisJCXRoaXMudmFsaWRhdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFZhbGlkYXRpb25MaXN0ZW5lcigpOworCQl0aGlzLmVuZ2FnZVZhbGlkYXRpb25MaXN0ZW5lcigpOwogCX0KIAotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlwbGF0Zm9ybUdyb3VwID0gbmV3IFBsYXRmb3JtR3JvdXAoY29tcG9zaXRlKTsKLQkJY29ubmVjdGlvbkdyb3VwID0gbmV3IENvbm5lY3Rpb25Hcm91cChjb21wb3NpdGUpOwotCQlwZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAgPSBuZXcgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJc2V0UnVudGltZSgpOwotCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLlBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKKwkvLyAqKioqKiBwbGF0Zm9ybSBJRCBtb2RlbAorCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUGxhdGZvcm1JZE1vZGVsKCkgeworCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihuZXcgUGxhdGZvcm1JZE1vZGVsKHRoaXMuanBhUHJvamVjdE1vZGVsKSwgdGhpcy50cmlnZ2VyKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc2V0UnVudGltZSgpIHsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKGdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlKcHRVaVBsdWdpbi5sb2coY2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSBmYWNldGVkUHJvamVjdC5nZXRQcmltYXJ5UnVudGltZSgpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUlVOVElNRSwgcnVudGltZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKLQkJCUpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STV9JRCwKLQkJCUpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5DT05ORUNUSU9OLAotCQkJSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsCi0JCQlKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwKLQkJCUpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5ESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFBsYXRmb3JtSWRMaXN0ZW5lcigpeworCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCUpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS50aGlzLnBsYXRmb3JtSWRDaGFuZ2VkKChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOworCQkJfQogCQl9OwogCX0KIAotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiAoSnBhUHJvamVjdCkgdGhpcy5nZXRFbGVtZW50KCkuZ2V0QWRhcHRlcihKcGFQcm9qZWN0LmNsYXNzKTsKKwl2b2lkIHBsYXRmb3JtSWRDaGFuZ2VkKFN0cmluZyBuZXdQbGF0Zm9ybUlkKSB7CisJCWlmICggISB0aGlzLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXRoaXMuZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpLnNldEVuYWJsZW1lbnRDb250ZXh0VmFyaWFibGUoSnBhTGlicmFyeVByb3ZpZGVyQ29uc3RhbnRzLkVYUFJfVkFSX0pQQV9QTEFURk9STSwgbmV3UGxhdGZvcm1JZCk7CisJCX0KIAl9CiAKLQlDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgYm9vbGVhbiBmaWxsSG9yaXpvbnRhbCkgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkOwotCQlpZiAoZmlsbEhvcml6b250YWwpIHsKLQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQl9Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKKwkvLyAqKioqKiBjb25uZWN0aW9uIG1vZGVscworCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29ubmVjdGlvbk1vZGVsKCkgeworCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihuZXcgQ29ubmVjdGlvbk1vZGVsKHRoaXMuanBhUHJvamVjdE1vZGVsKSwgdGhpcy50cmlnZ2VyKTsKIAl9CiAKLQlCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuLCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULk5PTkUgfCBzdHlsZSk7CisJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvblByb2ZpbGU+IGJ1aWxkQ29ubmVjdGlvblByb2ZpbGVNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBDb25uZWN0aW9uUHJvZmlsZU1vZGVsKHRoaXMuY29ubmVjdGlvbk1vZGVsKTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERpc2Nvbm5lY3RlZE1vZGVsKCkgeworCQlyZXR1cm4gbmV3IERpc2Nvbm5lY3RlZE1vZGVsKHRoaXMuY29ubmVjdGlvblByb2ZpbGVNb2RlbCk7CisJfQorCisJLy8gKioqKiogY2F0YWxvZyBtb2RlbHMKKwlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0ZsYWdNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KG5ldyBVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0ZsYWdNb2RlbCh0aGlzLmpwYVByb2plY3RNb2RlbCksIHRoaXMudHJpZ2dlcik7CisJfQorCisJcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ01vZGVsKCkgeworCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihuZXcgVXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dNb2RlbCh0aGlzLmpwYVByb2plY3RNb2RlbCksIHRoaXMudHJpZ2dlcik7CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdENhdGFsb2dNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBEZWZhdWx0TW9kZWwoCisJCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwsCisJCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dNb2RlbCwKKwkJCQkJdGhpcy5idWlsZERhdGFiYXNlRGVmYXVsdENhdGFsb2dNb2RlbCgpCisJCQkJKTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGF0YWJhc2VEZWZhdWx0Q2F0YWxvZ01vZGVsKCkgeworCQlyZXR1cm4gbmV3IERhdGFiYXNlRGVmYXVsdENhdGFsb2dNb2RlbCh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpOworCX0KKworCS8qKgorCSAqIEFkZCB0aGUgZGVmYXVsdCBjYXRhbG9nIGlmIGl0IGlzIG5vdCBvbiB0aGUgbGlzdCBmcm9tIHRoZSBkYXRhYmFzZQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENhdGFsb2dDaG9pY2VzTW9kZWwoKSB7CisJCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCisJCQkJbmV3IFNldENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oCisJCQkJCQluZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPigKKwkJCQkJCQkJbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsKSwKKwkJCQkJCQkJdGhpcy5idWlsZERhdGFiYXNlQ2F0YWxvZ0Nob2ljZXNNb2RlbCgpCisJCQkJCQkpCisJCQkJKQorCQkJKTsKKwl9CisKKwlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREYXRhYmFzZUNhdGFsb2dDaG9pY2VzTW9kZWwoKSB7CisJCXJldHVybiBuZXcgRGF0YWJhc2VDYXRhbG9nQ2hvaWNlc01vZGVsKHRoaXMuY29ubmVjdGlvblByb2ZpbGVNb2RlbCk7CisJfQorCisJLy8gKioqKiogc2NoZW1hIG1vZGVscworCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnTW9kZWwoKSB7CisJCXJldHVybiBuZXcgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihuZXcgVXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYUZsYWdNb2RlbCh0aGlzLmpwYVByb2plY3RNb2RlbCksIHRoaXMudHJpZ2dlcik7CisJfQorCisJcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTW9kZWwoKSB7CisJCXJldHVybiBuZXcgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KG5ldyBVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTW9kZWwodGhpcy5qcGFQcm9qZWN0TW9kZWwpLCB0aGlzLnRyaWdnZXIpOworCX0KKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRTY2hlbWFNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBEZWZhdWx0TW9kZWwoCisJCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYUZsYWdNb2RlbCwKKwkJCQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTW9kZWwsCisJCQkJCXRoaXMuYnVpbGREYXRhYmFzZURlZmF1bHRTY2hlbWFNb2RlbCgpCisJCQkJKTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGF0YWJhc2VEZWZhdWx0U2NoZW1hTW9kZWwoKSB7CisJCXJldHVybiBuZXcgRGF0YWJhc2VEZWZhdWx0U2NoZW1hTW9kZWwodGhpcy5jb25uZWN0aW9uUHJvZmlsZU1vZGVsLCB0aGlzLmRlZmF1bHRDYXRhbG9nTW9kZWwpOworCX0KKworCS8qKgorCSAqIEFkZCB0aGUgZGVmYXVsdCBjYXRhbG9nIGlmIGl0IGlzIG5vdCBvbiB0aGUgbGlzdCBmcm9tIHRoZSBkYXRhYmFzZQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNjaGVtYUNob2ljZXNNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKKwkJCQluZXcgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigKKwkJCQkJCW5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KAorCQkJCQkJCQluZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLmRlZmF1bHRTY2hlbWFNb2RlbCksCisJCQkJCQkJCXRoaXMuYnVpbGREYXRhYmFzZVNjaGVtYUNob2ljZXNNb2RlbCgpCisJCQkJCQkpCisJCQkJKQorCQkJKTsKKwl9CisKKwlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREYXRhYmFzZVNjaGVtYUNob2ljZXNNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBEYXRhYmFzZVNjaGVtYUNob2ljZXNNb2RlbCh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTW9kZWwsIHRoaXMuZGVmYXVsdENhdGFsb2dNb2RlbCk7CisJfQorCisJLy8gKioqKiogZGlzY292ZXIvbGlzdCBhbm5vdGF0ZWQgY2xhc3NlcyBtb2RlbHMKKwlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREaXNjb3ZlckFubm90YXRlZENsYXNzZXNNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KG5ldyBEaXNjb3ZlckFubm90YXRlZENsYXNzZXNNb2RlbCh0aGlzLmpwYVByb2plY3RNb2RlbCksIHRoaXMudHJpZ2dlcik7CisJfQorCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZExpc3RBbm5vdGF0ZWRDbGFzc2VzTW9kZWwoKSB7CisJCXJldHVybiBuZXcgTGlzdEFubm90YXRlZENsYXNzZXNNb2RlbCh0aGlzLmRpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlc01vZGVsKTsKKwl9CisKKwkvLyAqKioqKiBKUEEgMi4wIHByb2plY3QgZmxhZworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkSnBhMl8wUHJvamVjdEZsYWdNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBKcGEyXzBQcm9qZWN0RmxhZ01vZGVsKHRoaXMuanBhUHJvamVjdE1vZGVsKTsKKwl9CisKKwkvLyAqKioqKiBtZXRhbW9kZWwgbW9kZWxzCisJcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRNZXRhbW9kZWxTb3VyY2VGb2xkZXJNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4obmV3IE1ldGFtb2RlbFNvdXJjZUZvbGRlck1vZGVsKHRoaXMuanBhUHJvamVjdE1vZGVsKSwgdGhpcy50cmlnZ2VyKTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRKYXZhU291cmNlRm9sZGVyQ2hvaWNlc01vZGVsKCkgeworCQkvLyBieSBkZWZhdWx0LCBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlciBwdXRzIGEgbnVsbCBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0CisJCXJldHVybiBuZXcgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPigKKwkJCQkJbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAorCQkJCQkJbmV3IEphdmFTb3VyY2VGb2xkZXJDaG9pY2VzTW9kZWwodGhpcy5qcGFQcm9qZWN0TW9kZWwpCisJCQkJCSkKKwkJCQkpOworCX0KKworCisJLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKKworCXByaXZhdGUgU3RyaW5nIGdldENvbm5lY3Rpb25OYW1lKCkgeworCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uTW9kZWwuZ2V0VmFsdWUoKTsKKwl9CisKKwlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgeworCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZU1vZGVsLmdldFZhbHVlKCk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nRmxhZ0lzU2V0KCkgeworCQlyZXR1cm4gZmxhZ0lzU2V0KHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwpOworCX0KKworCXN0YXRpYyBib29sZWFuIGZsYWdJc1NldChQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZmxhZ01vZGVsKSB7CisJCUJvb2xlYW4gZmxhZyA9IGZsYWdNb2RlbC5nZXRWYWx1ZSgpOworCQlyZXR1cm4gKGZsYWcgIT0gbnVsbCkgJiYgZmxhZy5ib29sZWFuVmFsdWUoKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpIHsKKwkJcmV0dXJuIHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dNb2RlbC5nZXRWYWx1ZSgpOworCX0KKworCXByaXZhdGUgYm9vbGVhbiB1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hRmxhZ0lzU2V0KCkgeworCQlyZXR1cm4gZmxhZ0lzU2V0KHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYUZsYWdNb2RlbCk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSgpIHsKKwkJcmV0dXJuIHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU1vZGVsLmdldFZhbHVlKCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIExpYnJhcnlGYWNldFByb3BlcnR5UGFnZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpIHsKKwkJSVByb2plY3RGYWNldCBqcGFGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChKcHRDb3JlUGx1Z2luLkZBQ0VUX0lEKTsKKwkJcmV0dXJuIHRoaXMuZ2V0RmFjZXRlZFByb2plY3QoKS5nZXRJbnN0YWxsZWRWZXJzaW9uKGpwYUZhY2V0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBjcmVhdGVMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKElGYWNldGVkUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdikgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGVuYWJsZW1lbnRWYXJpYWJsZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJZW5hYmxlbWVudFZhcmlhYmxlcy5wdXQoSnBhTGlicmFyeVByb3ZpZGVyQ29uc3RhbnRzLkVYUFJfVkFSX0pQQV9QTEFURk9STSwgIiIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBuZXcgTGlicmFyeUluc3RhbGxEZWxlZ2F0ZShwcm9qZWN0LCBmdiwgZW5hYmxlbWVudFZhcmlhYmxlcyk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHBhZ2UgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlUGFnZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJdGhpcy5wcm9qZWN0TW9kZWwuc2V0VmFsdWUodGhpcy5nZXRQcm9qZWN0KCkpOworCisJCVNjcm9sbGVkQ29tcG9zaXRlIHNjID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2MsIFNXVC5OVUxMKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCisJCXRoaXMuYnVpbGRQbGF0Zm9ybUdyb3VwKGNvbXBvc2l0ZSk7CisKKwkJQ29udHJvbCBsaWJyYXJ5UHJvdmlkZXJDb21wb3NpdGUgPSBzdXBlci5jcmVhdGVQYWdlQ29udGVudHMoY29tcG9zaXRlKTsKKwkJbGlicmFyeVByb3ZpZGVyQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCisJCXRoaXMuYnVpbGRDb25uZWN0aW9uR3JvdXAoY29tcG9zaXRlKTsKKwkJdGhpcy5idWlsZFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cChjb21wb3NpdGUpOworCQl0aGlzLmJ1aWxkTWV0YW1vZGVsR3JvdXAoY29tcG9zaXRlKTsKKworCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7CisJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5QUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0UpOworCisJCXRoaXMudXBkYXRlVmFsaWRhdGlvbigpOworCisJCXNjLnNldENvbnRlbnQoY29tcG9zaXRlKTsKKwkJc2Muc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKKwkJc2Muc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7CisJCXNjLnNldE1pblNpemUoY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOworCQlyZXR1cm4gc2M7CisJfQorCisKKwkvLyAqKioqKioqKioqIHBsYXRmb3JtIGdyb3VwICoqKioqKioqKioKKworCXByaXZhdGUgdm9pZCBidWlsZFBsYXRmb3JtR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsKTsKKwkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOworCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKworCQlDb21ibyBwbGF0Zm9ybURyb3BEb3duID0gdGhpcy5idWlsZERyb3BEb3duKGdyb3VwKTsKKwkJU1dUVG9vbHMuYmluZCgKKwkJCQl0aGlzLmJ1aWxkUGxhdGZvcm1DaG9pY2VzTW9kZWwoKSwKKwkJCQl0aGlzLnBsYXRmb3JtSWRNb2RlbCwKKwkJCQlwbGF0Zm9ybURyb3BEb3duLAorCQkJCUpQQV9QTEFURk9STV9MQUJFTF9DT05WRVJURVIKKwkJKTsKKwl9CisKKwlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQbGF0Zm9ybUNob2ljZXNNb2RlbCgpIHsKKwkJU3RyaW5nIGpwYUZhY2V0VmVyc2lvbiA9IHRoaXMuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLmdldFZlcnNpb25TdHJpbmcoKTsKKwkJSXRlcmFibGU8U3RyaW5nPiBlbmFibGVkUGxhdGZvcm1JZHMgPSBKcGFQbGF0Zm9ybVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1JZHNGb3JKcGFGYWNldFZlcnNpb24oanBhRmFjZXRWZXJzaW9uKTsKKwkJcmV0dXJuIG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KAorCQkJCUNvbGxlY3Rpb25Ub29scy5zb3J0KAorCQkJCQlDb2xsZWN0aW9uVG9vbHMubGlzdChlbmFibGVkUGxhdGZvcm1JZHMpLCBKUEFfUExBVEZPUk1fQ09NUEFSQVRPUikpOworCX0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8U3RyaW5nPiBKUEFfUExBVEZPUk1fQ09NUEFSQVRPUiA9CisJCQluZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgeworCQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgaWQxLCBTdHJpbmcgaWQyKSB7CisJCQkJCXJldHVybiBnZXRKcGFQbGF0Zm9ybUxhYmVsKGlkMSkuY29tcGFyZVRvKGdldEpwYVBsYXRmb3JtTGFiZWwoaWQyKSk7CisJCQkJfQorCQkJfTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IEpQQV9QTEFURk9STV9MQUJFTF9DT05WRVJURVIgPQorCQkJbmV3IFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+KCkgeworCQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyBpZCkgeworCQkJCQlyZXR1cm4gZ2V0SnBhUGxhdGZvcm1MYWJlbChpZCk7CisJCQkJfQorCQkJfTsKKworCXN0YXRpYyBTdHJpbmcgZ2V0SnBhUGxhdGZvcm1MYWJlbChTdHJpbmcgaWQpIHsKKwkJcmV0dXJuIEpwYVBsYXRmb3JtUmVnaXN0cnkuaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybUxhYmVsKGlkKTsKKwl9CisKKworCS8vICoqKioqKioqKiogY29ubmVjdGlvbiBncm91cCAqKioqKioqKioqCisKKwlwcml2YXRlIHZvaWQgYnVpbGRDb25uZWN0aW9uR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGFiZWwpOworCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKKwkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSnBhSGVscENvbnRleHRJZHMuUFJPUEVSVElFU19KQVZBX1BFUlNJU1RFTkNFX0NPTk5FQ1RJT04pOworCisJCUNvbWJvIGNvbm5lY3Rpb25Ecm9wRG93biA9IHRoaXMuYnVpbGREcm9wRG93bihncm91cCwgMyk7CisJCVNXVFRvb2xzLmJpbmQoCisJCQkJQ09OTkVDVElPTl9DSE9JQ0VTX01PREVMLAorCQkJCXRoaXMuY29ubmVjdGlvbk1vZGVsLAorCQkJCWNvbm5lY3Rpb25Ecm9wRG93biwKKwkJCQlTSU1QTEVfU1RSSU5HX0NPTlZFUlRFUgorCQkJKTsKKworCQlMaW5rIGFkZENvbm5lY3Rpb25MaW5rID0gdGhpcy5idWlsZExpbmsoZ3JvdXAsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MaW5rKTsKKwkJYWRkQ29ubmVjdGlvbkxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZEFkZENvbm5lY3Rpb25MaW5rTGlzdGVuZXIoKSk7ICAvLyB0aGUgbGluayB3aWxsIGJlIEdDZWQKKworCQl0aGlzLmNvbm5lY3RMaW5rID0gdGhpcy5idWlsZExpbmsoZ3JvdXAsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3RMaW5rKTsKKwkJU1dUVG9vbHMuY29udHJvbEVuYWJsZWRTdGF0ZSh0aGlzLmRpc2Nvbm5lY3RlZE1vZGVsLCB0aGlzLmNvbm5lY3RMaW5rKTsKKwkJdGhpcy5jb25uZWN0TGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkQ29ubmVjdExpbmtMaXN0ZW5lcigpKTsgIC8vIHRoZSBsaW5rIHdpbGwgYmUgR0NlZAorCisJCS8vIG92ZXJyaWRlIGRlZmF1bHQgY2F0YWxvZworCQlCdXR0b24gb3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0NoZWNrQm94ID0gdGhpcy5idWlsZENoZWNrQm94KGdyb3VwLCAzLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9vdmVycmlkZURlZmF1bHRDYXRhbG9nTGFiZWwpOworCQlTV1RUb29scy5iaW5kKHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwsIG92ZXJyaWRlRGVmYXVsdENhdGFsb2dDaGVja0JveCk7CisKKwkJTGFiZWwgZGVmYXVsdENhdGFsb2dMYWJlbCA9IHRoaXMuYnVpbGRMYWJlbChncm91cCwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZGVmYXVsdENhdGFsb2dMYWJlbCk7CisJCUNvbWJvIGRlZmF1bHRDYXRhbG9nRHJvcERvd24gPSB0aGlzLmJ1aWxkRHJvcERvd24oZ3JvdXApOworCQlTV1RUb29scy5iaW5kKHRoaXMuY2F0YWxvZ0Nob2ljZXNNb2RlbCwgdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsLCBkZWZhdWx0Q2F0YWxvZ0Ryb3BEb3duKTsKKworCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwsIGRlZmF1bHRDYXRhbG9nTGFiZWwsIGRlZmF1bHRDYXRhbG9nRHJvcERvd24pOworCisJCS8vIG92ZXJyaWRlIGRlZmF1bHQgc2NoZW1hCisJCUJ1dHRvbiBvdmVycmlkZURlZmF1bHRTY2hlbWFCdXR0b24gPSB0aGlzLmJ1aWxkQ2hlY2tCb3goZ3JvdXAsIDMsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX292ZXJyaWRlRGVmYXVsdFNjaGVtYUxhYmVsKTsKKwkJU1dUVG9vbHMuYmluZCh0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnTW9kZWwsIG92ZXJyaWRlRGVmYXVsdFNjaGVtYUJ1dHRvbik7CisKKwkJTGFiZWwgZGVmYXVsdFNjaGVtYUxhYmVsID0gdGhpcy5idWlsZExhYmVsKGdyb3VwLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kZWZhdWx0U2NoZW1hTGFiZWwpOworCQlDb21ibyBkZWZhdWx0U2NoZW1hRHJvcERvd24gPSB0aGlzLmJ1aWxkRHJvcERvd24oZ3JvdXApOworCQlTV1RUb29scy5iaW5kKHRoaXMuc2NoZW1hQ2hvaWNlc01vZGVsLCB0aGlzLmRlZmF1bHRTY2hlbWFNb2RlbCwgZGVmYXVsdFNjaGVtYURyb3BEb3duKTsKKworCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYUZsYWdNb2RlbCwgZGVmYXVsdFNjaGVtYUxhYmVsLCBkZWZhdWx0U2NoZW1hRHJvcERvd24pOworCX0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IFNJTVBMRV9TVFJJTkdfQ09OVkVSVEVSID0KKwkJCW5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKKwkJCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgc3RyaW5nKSB7CisJCQkJCXJldHVybiAoc3RyaW5nICE9IG51bGwpID8gc3RyaW5nIDogSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2Vfbm9uZTsKKwkJCQl9CisJCQl9OworCisJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZEFkZENvbm5lY3Rpb25MaW5rTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCUpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS50aGlzLm9wZW5OZXdDb25uZWN0aW9uV2l6YXJkKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJjb25uZWN0aW9uIGxpbmsgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJfQorCisJdm9pZCBvcGVuTmV3Q29ubmVjdGlvbldpemFyZCgpIHsKKwkJU3RyaW5nIGNvbm5lY3Rpb25OYW1lID0gRFRQVWlUb29scy5jcmVhdGVOZXdDb25uZWN0aW9uUHJvZmlsZSgpOworCQlpZiAoY29ubmVjdGlvbk5hbWUgIT0gbnVsbCkgeworCQkJdGhpcy5jb25uZWN0aW9uTW9kZWwuc2V0VmFsdWUoY29ubmVjdGlvbk5hbWUpOworCQl9CisJfQorCisJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3RMaW5rTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCUpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS50aGlzLm9wZW5Db25uZWN0aW9uUHJvZmlsZSgpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiY29ubmVjdCBsaW5rIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KKworCXZvaWQgb3BlbkNvbm5lY3Rpb25Qcm9maWxlKCkgeworCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKKwkJaWYgKGNwICE9IG51bGwpIHsKKwkJCWNwLmNvbm5lY3QoKTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBwZXJzaXN0ZW50IGNsYXNzIG1hbmFnZW1lbnQgZ3JvdXAgKioqKioqKioqKgorCisJcHJpdmF0ZSB2b2lkIGJ1aWxkUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudExhYmVsKTsKKwkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOworCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKworCQlCdXR0b24gZGlzY292ZXJDbGFzc2VzUmFkaW9CdXR0b24gPSB0aGlzLmJ1aWxkUmFkaW9CdXR0b24oZ3JvdXAsIDEsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Rpc2NvdmVyQ2xhc3Nlc0J1dHRvbik7CisJCVNXVFRvb2xzLmJpbmQodGhpcy5kaXNjb3ZlckFubm90YXRlZENsYXNzZXNNb2RlbCwgZGlzY292ZXJDbGFzc2VzUmFkaW9CdXR0b24pOworCisJCUJ1dHRvbiBsaXN0Q2xhc3Nlc1JhZGlvQnV0dG9uID0gdGhpcy5idWlsZFJhZGlvQnV0dG9uKGdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9saXN0Q2xhc3Nlc0J1dHRvbik7CisJCVNXVFRvb2xzLmJpbmQodGhpcy5saXN0QW5ub3RhdGVkQ2xhc3Nlc01vZGVsLCBsaXN0Q2xhc3Nlc1JhZGlvQnV0dG9uKTsKKwl9CisKKworCS8vICoqKioqKioqKiogbWV0YW1vZGVsIGdyb3VwICoqKioqKioqKioKKworCXByaXZhdGUgdm9pZCBidWlsZE1ldGFtb2RlbEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfbWV0YW1vZGVsTGFiZWwpOworCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKKwkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisKKwkJTGFiZWwgbWV0YW1vZGVsU291cmNlRm9sZGVyTGFiZWwgPSB0aGlzLmJ1aWxkTGFiZWwoZ3JvdXAsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX21ldGFtb2RlbFNvdXJjZUZvbGRlckxhYmVsKTsKKwkJQ29tYm8gbWV0YW1vZGVsU291cmNlRm9sZGVyRHJvcERvd24gPSB0aGlzLmJ1aWxkRHJvcERvd24oZ3JvdXApOworCQlTV1RUb29scy5iaW5kKAorCQkJCXRoaXMuamF2YVNvdXJjZUZvbGRlckNob2ljZXNNb2RlbCwKKwkJCQl0aGlzLm1ldGFtb2RlbFNvdXJjZUZvbGRlck1vZGVsLAorCQkJCW1ldGFtb2RlbFNvdXJjZUZvbGRlckRyb3BEb3duLAorCQkJCVNJTVBMRV9TVFJJTkdfQ09OVkVSVEVSCisJCSk7CisKKwkJU1dUVG9vbHMuY29udHJvbFZpc2libGVTdGF0ZSh0aGlzLmpwYTJfMFByb2plY3RGbGFnTW9kZWwsIG1ldGFtb2RlbFNvdXJjZUZvbGRlckxhYmVsLCBtZXRhbW9kZWxTb3VyY2VGb2xkZXJEcm9wRG93bik7CisJfQorCisKKwkvLyAqKioqKioqKioqIHdpZGdldHMgKioqKioqKioqKgorCisJcHJpdmF0ZSBCdXR0b24gYnVpbGRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4sIFN0cmluZyB0ZXh0KSB7CisJCXJldHVybiB0aGlzLmJ1aWxkQnV0dG9uKHBhcmVudCwgaG9yaXpvbnRhbFNwYW4sIHRleHQsIFNXVC5DSEVDSyk7CisJfQorCisJcHJpdmF0ZSBCdXR0b24gYnVpbGRSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4sIFN0cmluZyB0ZXh0KSB7CisJCXJldHVybiB0aGlzLmJ1aWxkQnV0dG9uKHBhcmVudCwgaG9yaXpvbnRhbFNwYW4sIHRleHQsIFNXVC5SQURJTyk7CisJfQorCisJcHJpdmF0ZSBCdXR0b24gYnVpbGRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgaW50IGhvcml6b250YWxTcGFuLCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlKSB7CisJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUgfCBzdHlsZSk7CiAJCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwogCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47CisJCWdkLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47CiAJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKIAkJcmV0dXJuIGJ1dHRvbjsKIAl9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXBsYXRmb3JtR3JvdXAucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWNvbm5lY3Rpb25Hcm91cC5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwLnBlcmZvcm1EZWZhdWx0cygpOworCXByaXZhdGUgQ29tYm8gYnVpbGREcm9wRG93bihDb21wb3NpdGUgcGFyZW50KSB7CisJCXJldHVybiB0aGlzLmJ1aWxkRHJvcERvd24ocGFyZW50LCAxKTsKIAl9CiAKKwlwcml2YXRlIENvbWJvIGJ1aWxkRHJvcERvd24oQ29tcG9zaXRlIHBhcmVudCwgaW50IGhvcml6b250YWxTcGFuKSB7CisJCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWdkLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47CisJCWNvbWJvLnNldExheW91dERhdGEoZ2QpOworCQlyZXR1cm4gY29tYm87CisJfQorCisJcHJpdmF0ZSBMYWJlbCBidWlsZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7CisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOworCQlsYWJlbC5zZXRUZXh0KHRleHQpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7CisJCWxhYmVsLnNldExheW91dERhdGEoZ2QpOworCQlyZXR1cm4gbGFiZWw7CisJfQorCisJcHJpdmF0ZSBMaW5rIGJ1aWxkTGluayhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgeworCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCWxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJbGluay5zZXRUZXh0KHRleHQpOworCQlyZXR1cm4gbGluazsKKwl9CisKKworCS8vICoqKioqKioqKiogT0svUmV2ZXJ0L0FwcGx5IGJlaGF2aW9yICoqKioqKioqKioKKwogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gdGhpcy5nZXRKcGFQcm9qZWN0KCk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOyAgLy8gdGhlIGZhY2V0IGhhcyBiZWVuIHVuaW5zdGFsbGVkIGR1cmluZyBvdXIgdHJpcCB0byB0aGUgcHJvcGVydGllcworCQlzdXBlci5wZXJmb3JtT2soKTsKKworCQl0cnkgeworCQkJLy8gdHJ1ZT1mb3JrOyBmYWxzZT11bmNhbmNlbGxhYmxlCisJCQl0aGlzLmJ1aWxkT2tQcm9ncmVzc01vbml0b3JEaWFsb2coKS5ydW4odHJ1ZSwgZmFsc2UsIHRoaXMuYnVpbGRPa1J1bm5hYmxlV2l0aFByb2dyZXNzKCkpOworCQl9CisJCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9IAorCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwogCQl9CiAKLQkJYm9vbGVhbiBjaGFuZ2UgPSBmYWxzZTsKLQkJYm9vbGVhbiBwbGF0Zm9ybUNoYW5nZSA9IGZhbHNlOwotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBqcGFQcm9qZWN0LmdldFByb2plY3QoKTsKLQotCQlTdHJpbmcgcGxhdGZvcm0gPSB0aGlzLm1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STV9JRCk7Ci0JCWlmICggISBwbGF0Zm9ybS5lcXVhbHMoanBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpLmdldElkKCkpKSB7Ci0JCQljaGFuZ2UgPSB0cnVlOwotCQkJcGxhdGZvcm1DaGFuZ2UgPSB0cnVlOwotCQkJSnB0Q29yZVBsdWdpbi5zZXRKcGFQbGF0Zm9ybUlkKHByb2plY3QsIHBsYXRmb3JtKTsKLQkJfQotCi0JCVN0cmluZyBjb25uZWN0aW9uID0gdGhpcy5tb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuQ09OTkVDVElPTik7Ci0JCWlmICggISBjb25uZWN0aW9uLmVxdWFscyhqcGFQcm9qZWN0LmdldERhdGFTb3VyY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKSkpIHsKLQkJCWNoYW5nZSA9IHRydWU7Ci0JCQlqcGFQcm9qZWN0LmdldERhdGFTb3VyY2UoKS5zZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoY29ubmVjdGlvbik7Ci0JCQlKcHRDb3JlUGx1Z2luLnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShwcm9qZWN0LCBjb25uZWN0aW9uKTsKLQkJfQotCQkKLQkJU3RyaW5nIHVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEgPSBudWxsOwotCQlpZiAodGhpcy5tb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKSB7Ci0JCQl1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hID0gdGhpcy5tb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSk7Ci0JCX0KLQkJU3RyaW5nIHByb2plY3RVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hID0ganBhUHJvamVjdC5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSgpOwotCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKHVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEsIHByb2plY3RVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKSkgewotCQkJY2hhbmdlID0gdHJ1ZTsKLQkJCWpwYVByb2plY3Quc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU5hbWUodXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSk7Ci0JCQlKcHRDb3JlUGx1Z2luLnNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lKHByb2plY3QsIHVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEpOwotCQl9Ci0KLQkJYm9vbGVhbiBkaXNjb3ZlciA9IHRoaXMubW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5ESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUyk7Ci0JCWlmIChkaXNjb3ZlciAhPSBqcGFQcm9qZWN0LmRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoKSkgewotCQkJY2hhbmdlID0gdHJ1ZTsKLQkJCWpwYVByb2plY3Quc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcyhkaXNjb3Zlcik7Ci0JCQlKcHRDb3JlUGx1Z2luLnNldERpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlcyhwcm9qZWN0LCBkaXNjb3Zlcik7Ci0JCX0KLQotCQlpZiAocGxhdGZvcm1DaGFuZ2UpIHsKLQkJCUpwYU1vZGVsTWFuYWdlci5pbnN0YW5jZSgpLnJlYnVpbGRKcGFQcm9qZWN0KHByb2plY3QpOwotCQl9Ci0JCWlmIChjaGFuZ2UpIHsKLQkJCWJ1aWxkUHJvamVjdChwcm9qZWN0KTsKLQkJfQogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGJ1aWxkUHJvamVjdChmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyByPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwlwcml2YXRlIElSdW5uYWJsZUNvbnRleHQgYnVpbGRPa1Byb2dyZXNzTW9uaXRvckRpYWxvZygpIHsKKwkJcmV0dXJuIG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2codGhpcy5nZXRTaGVsbCgpKTsKKwl9CisKKwlwcml2YXRlIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBidWlsZE9rUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7CisJCXJldHVybiBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJCQlJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwogCQkJCXRyeSB7Ci0JCQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBwbSk7CisJCQkJCS8vIHRoZSBidWlsZCB3ZSBleGVjdXRlIGluICNwZXJmb3JtT2tfKCkgbG9ja3MgdGhlIHdvcmtzcGFjZSByb290LAorCQkJCQkvLyBzbyB3ZSBuZWVkIHRvIHVzZSB0aGUgd29ya3NwYWNlIHJvb3QgYXMgb3VyIHNjaGVkdWxpbmcgcnVsZSBoZXJlCisJCQkJCXdzLnJ1bigKKwkJCQkJCQlKcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UudGhpcy5idWlsZE9rV29ya3NwYWNlUnVubmFibGUoKSwKKwkJCQkJCQl3cy5nZXRSb290KCksCisJCQkJCQkJSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsCisJCQkJCQkJbW9uaXRvcgorCQkJCQkpOwogCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlKcHRVaVBsdWdpbi5sb2coY2UpOworCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7CisJCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4KTsKIAkJCQl9CiAJCQl9CiAJCX07Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bih0cnVlLCBmYWxzZSwgcik7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7IC8qIG5vdGhpbmcgdG8gZG8gKi8gfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpZSkgeyAvKiBub3RoaW5nIHRvIGRvICovIH0KIAl9CiAKKwlJV29ya3NwYWNlUnVubmFibGUgYnVpbGRPa1dvcmtzcGFjZVJ1bm5hYmxlKCkgeworCQlyZXR1cm4gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCQlKcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UudGhpcy5wZXJmb3JtT2tfKG1vbml0b3IpOworCQkJfQorCQl9OworCX0KIAotCXByaXZhdGUgZmluYWwgY2xhc3MgUGxhdGZvcm1Hcm91cAotCXsKLQkJZmluYWwgQ29tYm8gcGxhdGZvcm1Db21ibzsKLQkJCi0JCQotCQlwdWJsaWMgUGxhdGZvcm1Hcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfcGxhdGZvcm1MYWJlbCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCS8vIFRPRE8KLQkJCS8vIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIElEYWxpSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9EQVRBQkFTRSk7Ci0JCQkKLQkJCXBsYXRmb3JtQ29tYm8gPSBjcmVhdGVDb21ibyhncm91cCwgMSwgdHJ1ZSk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKHBsYXRmb3JtQ29tYm8sIFBMQVRGT1JNX0lELCBudWxsKTsKLQkJCQotCQkJcGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQkJCi0JCXZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQkJU3RyaW5nIHBsYXRmb3JtSWQgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoUExBVEZPUk1fSUQsIHBsYXRmb3JtSWQpOworCXZvaWQgcGVyZm9ybU9rXyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKHRoaXMuaXNCdWZmZXJpbmcoKSkgeworCQkJYm9vbGVhbiBwbGF0Zm9ybUNoYW5nZWQgPSB0aGlzLnBsYXRmb3JtSWRNb2RlbC5pc0J1ZmZlcmluZygpOworCQkJdGhpcy50cmlnZ2VyLmFjY2VwdCgpOworCQkJaWYgKHBsYXRmb3JtQ2hhbmdlZCkgeworCQkJCS8vIGlmIHRoZSBKUEEgcGxhdGZvcm0gaXMgY2hhbmdlZCwgd2UgbmVlZCB0byBjb21wbGV0ZWx5IHJlYnVpbGQgdGhlIEpQQSBwcm9qZWN0CisJCQkJSnB0Q29yZVBsdWdpbi5yZWJ1aWxkSnBhUHJvamVjdCh0aGlzLmdldFByb2plY3QoKSk7CisJCQl9CisJCQl0aGlzLmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIG1vbml0b3IpOwogCQl9CiAJfQotCQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgQ29ubmVjdGlvbkdyb3VwCi0JewotCQlmaW5hbCBDb21ibyBjb25uZWN0aW9uQ29tYm87CiAKLQkJcHJpdmF0ZSBMaW5rIGNvbm5lY3Rpb25MaW5rOwotCQkKLQkJcHJpdmF0ZSBMaW5rIGNvbm5lY3RMaW5rOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0U2NoZW1hQnV0dG9uOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBMYWJlbCBkZWZhdWx0U2NoZW1hTGFiZWw7Ci0JCQotCQlwcml2YXRlIGZpbmFsIENvbWJvIGRlZmF1bHRTY2hlbWFDb21ibzsKLQkJCi0JCQotCQlwdWJsaWMgQ29ubmVjdGlvbkdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGFiZWwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJY29ubmVjdGlvbkNvbWJvID0gY3JlYXRlQ29tYm8oZ3JvdXAsIDMsIHRydWUpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSnBhSGVscENvbnRleHRJZHMuUFJPUEVSVElFU19KQVZBX1BFUlNJU1RFTkNFX0NPTk5FQ1RJT04pOwotCQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhjb25uZWN0aW9uQ29tYm8sIENPTk5FQ1RJT04sIG51bGwpOwotCQkJY29ubmVjdGlvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJdXBkYXRlQ29ubmVjdExpbmsoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCi0JCQljb25uZWN0aW9uTGluayA9IG5ldyBMaW5rKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQljb25uZWN0aW9uTGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJY29ubmVjdGlvbkxpbmsuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGluayk7Ci0JCQljb25uZWN0aW9uTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCW9wZW5OZXdDb25uZWN0aW9uV2l6YXJkKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQkJCi0JCQljb25uZWN0TGluayA9IG5ldyBMaW5rKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQljb25uZWN0TGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJY29ubmVjdExpbmsuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0TGluayk7Ci0JCQljb25uZWN0TGluay5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWNvbm5lY3RMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJb3BlbkNvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQotCQkJb3ZlcnJpZGVEZWZhdWx0U2NoZW1hQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAzLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9vdmVycmlkZURlZmF1bHRTY2hlbWFMYWJlbCwgU1dULkNIRUNLKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3gob3ZlcnJpZGVEZWZhdWx0U2NoZW1hQnV0dG9uLCBVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBuZXcgQ29udHJvbFswXSk7Ci0JCQkKLQkJCWRlZmF1bHRTY2hlbWFMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULkxFRlQpOwotCQkJZGVmYXVsdFNjaGVtYUxhYmVsLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZGVmYXVsdFNjaGVtYUxhYmVsKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlkZWZhdWx0U2NoZW1hTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkKLQkJCWRlZmF1bHRTY2hlbWFDb21ibyA9IGNyZWF0ZUNvbWJvKGdyb3VwLCAxLCB0cnVlKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oCi0JCQkJZGVmYXVsdFNjaGVtYUNvbWJvLCBVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCAKLQkJCQluZXcgQ29udHJvbFtdIHtkZWZhdWx0U2NoZW1hTGFiZWx9KTsKLQkJCQotCQkJcGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQkJCi0JCXZvaWQgb3Blbk5ld0Nvbm5lY3Rpb25XaXphcmQoKSB7Ci0JCQlTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSBEVFBVaVRvb2xzLmNyZWF0ZU5ld1Byb2ZpbGUoKTsKLQkJCWlmIChjb25uZWN0aW9uTmFtZSAhPSBudWxsKSB7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoQ09OTkVDVElPTiwgY29ubmVjdGlvbk5hbWUpOworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIGFueSBvZiB0aGUgbW9kZWxzIGFyZSBidWZmZXJpbmcgYSBjaGFuZ2UuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQnVmZmVyaW5nKCkgeworCQlmb3IgKEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gbW9kZWwgOiB0aGlzLmJ1aWxkQnVmZmVyZWRNb2RlbHMoKSkgeworCQkJaWYgKG1vZGVsLmlzQnVmZmVyaW5nKCkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KIAkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIG9wZW5Db25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCQkJY29ubmVjdGlvbi5jb25uZWN0KCk7Ci0JCQltb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoQ09OTkVDVElPTl9BQ1RJVkUsIGNvbm5lY3Rpb24uaXNBY3RpdmUoKSk7Ci0JCQl1cGRhdGVDb25uZWN0TGluaygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgdXBkYXRlQ29ubmVjdExpbmsoKSB7Ci0JCQlDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSA9IGdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCQljb25uZWN0TGluay5zZXRFbmFibGVkKCEgY29ubmVjdGlvblByb2ZpbGUuaXNOdWxsKCkgJiYgISBjb25uZWN0aW9uUHJvZmlsZS5pc0Nvbm5lY3RlZCgpKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJCXJldHVybiBKcHREYlBsdWdpbi5pbnN0YW5jZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSgpLmNvbm5lY3Rpb25Qcm9maWxlTmFtZWQobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoQ09OTkVDVElPTikpOwotCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CiAKLQkJdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCQlTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0RGF0YVNvdXJjZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoQ09OTkVDVElPTiwgY29ubmVjdGlvbk5hbWUpOwotCQkJCi0JCQlTdHJpbmcgZGVmYXVsdFNjaGVtYSA9IGdldEpwYVByb2plY3QoKS5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTmFtZSgpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgZGVmYXVsdFNjaGVtYSAhPSBudWxsKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIGRlZmF1bHRTY2hlbWEpOwotCQl9CisJcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gYnVpbGRCdWZmZXJlZE1vZGVscygpIHsKKwkJcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsW10geworCQkJCXRoaXMucGxhdGZvcm1JZE1vZGVsLAorCQkJCXRoaXMuY29ubmVjdGlvbk1vZGVsLAorCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwsCisJCQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ01vZGVsLAorCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYUZsYWdNb2RlbCwKKwkJCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFNb2RlbCwKKwkJCQl0aGlzLmRpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlc01vZGVsLAorCQkJCXRoaXMubWV0YW1vZGVsU291cmNlRm9sZGVyTW9kZWwKKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7CisJCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOworCQl0aGlzLnRyaWdnZXIucmVzZXQoKTsKIAl9CiAKIAotCXByaXZhdGUgZmluYWwgY2xhc3MgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwCisJLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXRoaXMuZGlzZW5nYWdlVmFsaWRhdGlvbkxpc3RlbmVyKCk7CisJCXRoaXMucGxhdGZvcm1JZE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnBsYXRmb3JtSWRMaXN0ZW5lcik7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCisKKwlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsaWRhdGlvbkxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IFNpbXBsZUNoYW5nZUxpc3RlbmVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoKSB7CisJCQkJSnBhUHJvamVjdFByb3BlcnRpZXNQYWdlLnRoaXMudmFsaWRhdGUoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gInZhbGlkYXRpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJfQorCisJdm9pZCB2YWxpZGF0ZSgpIHsKKwkJaWYgKCAhIHRoaXMuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy51cGRhdGVWYWxpZGF0aW9uKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgZW5nYWdlVmFsaWRhdGlvbkxpc3RlbmVyKCkgeworCQlmb3IgKE1vZGVsIG1vZGVsIDogdGhpcy5idWlsZFZhbGlkYXRpb25Nb2RlbHMoKSkgeworCQkJbW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy52YWxpZGF0aW9uTGlzdGVuZXIpOworCQl9CisJfQorCisJcHJpdmF0ZSBNb2RlbFtdIGJ1aWxkVmFsaWRhdGlvbk1vZGVscygpIHsKKwkJcmV0dXJuIG5ldyBNb2RlbFtdIHsKKwkJCQl0aGlzLnBsYXRmb3JtSWRNb2RlbCwKKwkJCQl0aGlzLmNvbm5lY3Rpb25Nb2RlbCwKKwkJCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nRmxhZ01vZGVsLAorCQkJCXRoaXMuZGVmYXVsdENhdGFsb2dNb2RlbCwKKwkJCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnTW9kZWwsCisJCQkJdGhpcy5kZWZhdWx0U2NoZW1hTW9kZWwsCisJCQkJdGhpcy5kaXNjb3ZlckFubm90YXRlZENsYXNzZXNNb2RlbAorCQl9OworCX0KKworCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VWYWxpZGF0aW9uTGlzdGVuZXIoKSB7CisJCWZvciAoTW9kZWwgbW9kZWwgOiB0aGlzLmJ1aWxkUmV2ZXJzZVZhbGlkYXRpb25Nb2RlbHMoKSkgeworCQkJbW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy52YWxpZGF0aW9uTGlzdGVuZXIpOworCQl9CisJfQorCisJcHJpdmF0ZSBNb2RlbFtdIGJ1aWxkUmV2ZXJzZVZhbGlkYXRpb25Nb2RlbHMoKSB7CisJCXJldHVybiBBcnJheVRvb2xzLnJldmVyc2UodGhpcy5idWlsZFZhbGlkYXRpb25Nb2RlbHMoKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBFUlJPUl9TVEFUVVMgPSBJbnRlZ2VyLnZhbHVlT2YoSVN0YXR1cy5FUlJPUik7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBXQVJOSU5HX1NUQVRVUyA9IEludGVnZXIudmFsdWVPZihJU3RhdHVzLldBUk5JTkcpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgSU5GT19TVEFUVVMgPSBJbnRlZ2VyLnZhbHVlT2YoSVN0YXR1cy5JTkZPKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIE9LX1NUQVRVUyA9IEludGVnZXIudmFsdWVPZihJU3RhdHVzLk9LKTsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJU3RhdHVzIHBlcmZvcm1WYWxpZGF0aW9uKCkgeworCQlIYXNoTWFwPEludGVnZXIsIEFycmF5TGlzdDxJU3RhdHVzPj4gc3RhdHVzZXMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBBcnJheUxpc3Q8SVN0YXR1cz4+KCk7CisJCXN0YXR1c2VzLnB1dChFUlJPUl9TVEFUVVMsIG5ldyBBcnJheUxpc3Q8SVN0YXR1cz4oKSk7CisJCXN0YXR1c2VzLnB1dChXQVJOSU5HX1NUQVRVUywgbmV3IEFycmF5TGlzdDxJU3RhdHVzPigpKTsKKwkJc3RhdHVzZXMucHV0KElORk9fU1RBVFVTLCBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KCkpOworCQlzdGF0dXNlcy5wdXQoT0tfU1RBVFVTLCBDb2xsZWN0aW9uVG9vbHMubGlzdChTdGF0dXMuT0tfU1RBVFVTKSk7CisKKwkJLyogcGxhdGZvcm0gKi8KKwkJLy8gdXNlciBpcyB1bmFibGUgdG8gdW5zZXQgdGhlIHBsYXRmb3JtLCBzbyBubyB2YWxpZGF0aW9uIG5lY2Vzc2FyeQorCisJCS8qIGxpYnJhcnkgcHJvdmlkZXIgKi8KKwkJSVN0YXR1cyBscFN0YXR1cyA9IHN1cGVyLnBlcmZvcm1WYWxpZGF0aW9uKCk7CisJCXN0YXR1c2VzLmdldChJbnRlZ2VyLnZhbHVlT2YobHBTdGF0dXMuZ2V0U2V2ZXJpdHkoKSkpLmFkZChscFN0YXR1cyk7CisKKwkJLyogY29ubmVjdGlvbiAqLworCQlDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKKwkJU3RyaW5nIGNvbm5lY3Rpb25OYW1lID0gdGhpcy5nZXRDb25uZWN0aW9uTmFtZSgpOworCQlpZiAoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShjb25uZWN0aW9uTmFtZSkpIHsKKwkJCWlmIChjb25uZWN0aW9uUHJvZmlsZSA9PSBudWxsKSB7CisJCQkJc3RhdHVzZXMuZ2V0KEVSUk9SX1NUQVRVUykuYWRkKHRoaXMuYnVpbGRFcnJvclN0YXR1cyhOTFMuYmluZCgKKwkJCQkJCUpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9DT05ORUNUSU9OX0lOVkFMSUQsCisJCQkJCQljb25uZWN0aW9uTmFtZQorCQkJCSkpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKCAhIGNvbm5lY3Rpb25Qcm9maWxlLmlzQWN0aXZlKCkpIHsKKwkJCQlzdGF0dXNlcy5nZXQoSU5GT19TVEFUVVMpLmFkZCh0aGlzLmJ1aWxkSW5mb1N0YXR1cyhKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfQ09OTkVDVElPTl9OT1RfQ09OTkVDVEVEKSk7CisJCQl9CisJCX0KKworCQkvKiBkZWZhdWx0IGNhdGFsb2cgKi8KKwkJaWYgKHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnSXNTZXQoKSkgeworCQkJU3RyaW5nIGRlZmF1bHRDYXRhbG9nID0gdGhpcy5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpOworCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZGVmYXVsdENhdGFsb2cpKSB7CisJCQkJc3RhdHVzZXMuZ2V0KEVSUk9SX1NUQVRVUykuYWRkKHRoaXMuYnVpbGRFcnJvclN0YXR1cyhKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfREVGQVVMVF9DQVRBTE9HX05PVF9TUEVDSUZJRUQpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKChjb25uZWN0aW9uUHJvZmlsZSAhPSBudWxsKQorCQkJCQkmJiBjb25uZWN0aW9uUHJvZmlsZS5pc0Nvbm5lY3RlZCgpCisJCQkJCSYmICEgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuY2F0YWxvZ0Nob2ljZXNNb2RlbC5pdGVyYXRvcigpLCBkZWZhdWx0Q2F0YWxvZykpIHsKKwkJCQlzdGF0dXNlcy5nZXQoV0FSTklOR19TVEFUVVMpLmFkZCh0aGlzLmJ1aWxkV2FybmluZ1N0YXR1cyhOTFMuYmluZCgKKwkJCQkJCUpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9DT05ORUNUSU9OX0RPRVNOVF9DT05UQUlOX0NBVEFMT0csCisJCQkJCQlkZWZhdWx0Q2F0YWxvZworCQkJCSkpKTsKKwkJCX0KKwkJfQorCisJCS8qIGRlZmF1bHQgc2NoZW1hICovCisJCWlmICh0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnSXNTZXQoKSkgeworCQkJU3RyaW5nIGRlZmF1bHRTY2hlbWEgPSB0aGlzLmdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKTsKKwkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGRlZmF1bHRTY2hlbWEpKSB7CisJCQkJc3RhdHVzZXMuZ2V0KEVSUk9SX1NUQVRVUykuYWRkKHRoaXMuYnVpbGRFcnJvclN0YXR1cyhKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfREVGQVVMVF9TQ0hFTUFfTk9UX1NQRUNJRklFRCkpOworCQkJfQorCQkJZWxzZSBpZiAoKGNvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpCisJCQkJCSYmIGNvbm5lY3Rpb25Qcm9maWxlLmlzQ29ubmVjdGVkKCkKKwkJCQkJJiYgISBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5zY2hlbWFDaG9pY2VzTW9kZWwuaXRlcmF0b3IoKSwgZGVmYXVsdFNjaGVtYSkpIHsKKwkJCQlzdGF0dXNlcy5nZXQoV0FSTklOR19TVEFUVVMpLmFkZCh0aGlzLmJ1aWxkV2FybmluZ1N0YXR1cyhOTFMuYmluZCgKKwkJCQkJCUpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9DT05ORUNUSU9OX0RPRVNOVF9DT05UQUlOX1NDSEVNQSwKKwkJCQkJCWRlZmF1bHRTY2hlbWEKKwkJCQkpKSk7CisJCQl9CisJCX0KKworCQlpZiAoICEgc3RhdHVzZXMuZ2V0KEVSUk9SX1NUQVRVUykuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gc3RhdHVzZXMuZ2V0KEVSUk9SX1NUQVRVUykuZ2V0KDApOworCQl9CisJCWVsc2UgaWYgKCAhIHN0YXR1c2VzLmdldChXQVJOSU5HX1NUQVRVUykuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gc3RhdHVzZXMuZ2V0KFdBUk5JTkdfU1RBVFVTKS5nZXQoMCk7CisJCX0KKwkJZWxzZSBpZiAoICEgc3RhdHVzZXMuZ2V0KElORk9fU1RBVFVTKS5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBzdGF0dXNlcy5nZXQoSU5GT19TVEFUVVMpLmdldCgwKTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBzdGF0dXNlcy5nZXQoT0tfU1RBVFVTKS5nZXQoMCk7CisJCX0KKwl9CisKKwlwcml2YXRlIElTdGF0dXMgYnVpbGRJbmZvU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7CisJCXJldHVybiB0aGlzLmJ1aWxkU3RhdHVzKElTdGF0dXMuSU5GTywgbWVzc2FnZSk7CisJfQorCisJcHJpdmF0ZSBJU3RhdHVzIGJ1aWxkV2FybmluZ1N0YXR1cyhTdHJpbmcgbWVzc2FnZSkgeworCQlyZXR1cm4gdGhpcy5idWlsZFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIG1lc3NhZ2UpOworCX0KKworCXByaXZhdGUgSVN0YXR1cyBidWlsZEVycm9yU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7CisJCXJldHVybiB0aGlzLmJ1aWxkU3RhdHVzKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpOworCX0KKworCXByaXZhdGUgSVN0YXR1cyBidWlsZFN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7CisJCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBKcHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIFVJIG1vZGVsIGFkYXB0ZXJzICoqKioqKioqKioKKworCS8qKgorCSAqIFRyZWF0IHRoZSBKUEEgcHJvamVjdCBhcyBhbiAiYXNwZWN0IiBvZiB0aGUgRWNsaXBzZSBwcm9qZWN0IChJUHJvamVjdCk7CisJICogYnV0IHRoZSBKUEEgcHJvamVjdCBpcyBzdG9yZWQgaW4gdGhlIEpQQSBtb2RlbCwgbm90IHRoZSBFY2xpcHNlIHByb2plY3QKKwkgKiBpdHNlbGYuLi4uCisJICogV2UgYWxzbyBuZWVkIHRvIGxpc3RlbiBmb3IgdGhlIEpQQSBwcm9qZWN0IHRvIGJlIHJlYnVpbHQgaWYgdGhlIHVzZXIKKwkgKiBjaGFuZ2VzIHRoZSBFY2xpcHNlIHByb2plY3QncyBKUEEgcGxhdGZvcm0gKHdoaWNoIGlzIHN0b3JlZCBpbiB0aGUKKwkgKiBFY2xpcHNlIHByb2plY3QncyBwcmVmZXJlbmNlcykuCisJICovCisJc3RhdGljIGNsYXNzIEpwYVByb2plY3RNb2RlbAorCQlleHRlbmRzIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8SVByb2plY3QsIEpwYVByb2plY3Q+CiAJewotCQlmaW5hbCBCdXR0b24gZGlzY292ZXJDbGFzc2VzQnV0dG9uOwotCi0JCWZpbmFsIEJ1dHRvbiBsaXN0Q2xhc3Nlc0J1dHRvbjsKKwkJLyoqCisJCSAqIFRoZSBKUEEgcHJvamVjdCdzIHBsYXRmb3JtIGlzIHN0b3JlZCBhcyBhIHByZWZlcmVuY2UuCisJCSAqIElmIGl0IGNoYW5nZXMsIGEgbmV3IEpQQSBwcm9qZWN0IGlzIGJ1aWx0LgorCQkgKi8KKwkJcHJpdmF0ZSBmaW5hbCBJUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIHByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKIAogCi0JCXB1YmxpYyBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3BlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRMYWJlbCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfQ0xBU1NQQVRIKTsKLQotCQkJZGlzY292ZXJDbGFzc2VzQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kaXNjb3ZlckNsYXNzZXNCdXR0b24sIFNXVC5SQURJTyk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGRpc2NvdmVyQ2xhc3Nlc0J1dHRvbiwgRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIG51bGwpOwotCQkJCi0JCQlsaXN0Q2xhc3Nlc0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfbGlzdENsYXNzZXNCdXR0b24sIFNXVC5SQURJTyk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGxpc3RDbGFzc2VzQnV0dG9uLCBMSVNUX0FOTk9UQVRFRF9DTEFTU0VTLCBudWxsKTsKLQkJCQotCQkJcGVyZm9ybURlZmF1bHRzKCk7CisJCUpwYVByb2plY3RNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SVByb2plY3Q+IHByb2plY3RNb2RlbCkgeworCQkJc3VwZXIocHJvamVjdE1vZGVsKTsKKwkJCXRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpOwogCQl9Ci0JCQotCQl2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJCWJvb2xlYW4gZGlzY292ZXJDbGFzc2VzID0gZ2V0SnBhUHJvamVjdCgpLmRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLCBCb29sZWFuLnZhbHVlT2YoZGlzY292ZXJDbGFzc2VzKSk7CisKKwkJcHJpdmF0ZSBJUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcmV0dXJuIG5ldyBJUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHByZWZlcmVuY2VDaGFuZ2UoUHJlZmVyZW5jZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJCWlmIChldmVudC5nZXRLZXkoKS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybUlkUHJlZktleSgpKSkgeworCQkJCQkJSnBhUHJvamVjdE1vZGVsLnRoaXMucGxhdGZvcm1DaGFuZ2VkKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQkJcmV0dXJuICJwcmVmZXJlbmNlIGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9OworCQl9CisKKwkJdm9pZCBwbGF0Zm9ybUNoYW5nZWQoKSB7CisJCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgeworCQkJdGhpcy5nZXRQcmVmZXJlbmNlcygpLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7CisJCQl0aGlzLmdldFByZWZlcmVuY2VzKCkucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBidWlsZFZhbHVlXygpIHsKKwkJCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGhpcy5zdWJqZWN0KTsKKwkJfQorCisJCXByaXZhdGUgSUVjbGlwc2VQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKKwkJCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldFByb2plY3RQcmVmZXJlbmNlcyh0aGlzLnN1YmplY3QpOwogCQl9CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKworCisJLyoqCisJICogVGhlIEpQQSBwcm9qZWN0J3MgZGF0YSBzb3VyY2UgaXMgYW4gYXV4aWxpYXJ5IG9iamVjdCB0aGF0IG5ldmVyIGNoYW5nZXM7CisJICogc28gaWYgd2UgaGF2ZSBhIEpQQSBwcm9qZWN0LCB3ZSBoYXZlIGEgSlBBIGRhdGEgc291cmNlIGFsc28uCisJICovCisJc3RhdGljIGNsYXNzIERhdGFTb3VyY2VNb2RlbAorCQlleHRlbmRzIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEpwYVByb2plY3QsIEpwYURhdGFTb3VyY2U+CisJeworCQlEYXRhU291cmNlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEpwYVByb2plY3Q+IGpwYVByb2plY3RNb2RlbCkgeworCQkJc3VwZXIoanBhUHJvamVjdE1vZGVsKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgSnBhRGF0YVNvdXJjZSB0cmFuc2Zvcm1fKEpwYVByb2plY3QgdmFsdWUpIHsKKwkJCXJldHVybiB2YWx1ZS5nZXREYXRhU291cmNlKCk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIFRoZSBEVFAgY29ubmVjdGlvbiBwcm9maWxlIG5hbWUgaXMgYW4gYXNwZWN0IG9mIHRoZSBKUEEgcHJvamVjdCdzCisJICogZGF0YSBzb3VyY2UKKwkgKi8KKwlzdGF0aWMgY2xhc3MgQ29ubmVjdGlvbk1vZGVsCisJCWV4dGVuZHMgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYURhdGFTb3VyY2UsIFN0cmluZz4KKwl7CisJCUNvbm5lY3Rpb25Nb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsKSB7CisJCQlzdXBlcihuZXcgRGF0YVNvdXJjZU1vZGVsKGpwYVByb2plY3RNb2RlbCksIEpwYURhdGFTb3VyY2UuQ09OTkVDVElPTl9QUk9GSUxFX05BTUVfUFJPUEVSVFkpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHNldFZhbHVlXyhTdHJpbmcgY29ubmVjdGlvbikgeworCQkJdGhpcy5zdWJqZWN0LnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShjb25uZWN0aW9uKTsKKwkJfQorCX0KKworCisJLyoqCisJICogQ29udmVydCB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIG5hbWUgdG8gYSBjb25uZWN0aW9uIHByb2ZpbGUKKwkgKi8KKwlzdGF0aWMgY2xhc3MgQ29ubmVjdGlvblByb2ZpbGVNb2RlbAorCQlleHRlbmRzIENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmcsIENvbm5lY3Rpb25Qcm9maWxlPgorCXsKKwkJQ29ubmVjdGlvblByb2ZpbGVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBjb25uZWN0aW9uTW9kZWwpIHsKKwkJCXN1cGVyKGNvbm5lY3Rpb25Nb2RlbCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlIHRyYW5zZm9ybV8oU3RyaW5nIGNvbm5lY3Rpb25OYW1lKSB7CisJCQlyZXR1cm4gSnB0RGJQbHVnaW4uaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKGNvbm5lY3Rpb25OYW1lKTsKKwkJfQorCX0KKworCisJLyoqCisJICogVHJlYXQgdGhlIEpQQSBwbGF0Zm9ybSBJRCBhcyBhbiAiYXNwZWN0IiBvZiB0aGUgSlBBIHByb2plY3QuCisJICogVGhlIHBsYXRmb3JtIElEIGlzIHN0b3JlZCBpbiB0aGUgcHJvamVjdCBwcmVmZXJlbmNlcy4KKwkgKiBUaGUgcGxhdGZvcm0gSUQgZG9lcyBub3QgY2hhbmdlIGZvciBhIEpQQSBwcm9qZWN0IC0gaWYgdGhlIHVzZXIgd2FudHMgYQorCSAqIGRpZmZlcmVudCBwbGF0Zm9ybSwgd2UgYnVpbGQgYW4gZW50aXJlbHkgbmV3IEpQQSBwcm9qZWN0LgorCSAqLworCXN0YXRpYyBjbGFzcyBQbGF0Zm9ybUlkTW9kZWwKKwkJZXh0ZW5kcyBBc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEpwYVByb2plY3QsIFN0cmluZz4KKwl7CisJCVBsYXRmb3JtSWRNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsKSB7CisJCQlzdXBlcihqcGFQcm9qZWN0TW9kZWwpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7CisJCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybUlkKHRoaXMuc3ViamVjdC5nZXRQcm9qZWN0KCkpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHNldFZhbHVlXyhTdHJpbmcgbmV3UGxhdGZvcm1JZCkgeworCQkJSnB0Q29yZVBsdWdpbi5zZXRKcGFQbGF0Zm9ybUlkKHRoaXMuc3ViamVjdC5nZXRQcm9qZWN0KCksIG5ld1BsYXRmb3JtSWQpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgeworCQkJLy8gdGhlIHBsYXRmb3JtIElEIGRvZXMgbm90IGNoYW5nZQorCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgeworCQkJLy8gdGhlIHBsYXRmb3JtIElEIGRvZXMgbm90IGNoYW5nZQorCQl9CisJfQorCisKKwkvKioKKwkgKiBUaGUgY29ubmVjdGlvbnMgYXJlIGhlbGQgYnkgYSBzaW5nbGV0b24sIHNvIHRoZSBtb2RlbCBjYW4gYmUgYSBzaW5nbGV0b24KKwkgKiBhbHNvLgorCSAqLworCS8vIGJ5IGRlZmF1bHQsIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyIHB1dHMgYSBudWxsIGF0IHRoZSB0b3Agb2YgdGhlIGxpc3QKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IENPTk5FQ1RJT05fQ0hPSUNFU19NT0RFTCA9CisJCQluZXcgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPigKKwkJCQkJbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAorCQkJCQkJCW5ldyBDb25uZWN0aW9uQ2hvaWNlc01vZGVsKCkKKwkJCQkJKQorCQkJKTsKKworCS8qKgorCSAqIFdyYXAgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBuYW1lcyBoZWxkIGJ5IHRoZSBjb25uZWN0aW9uIHByb2ZpbGUKKwkgKiBmYWN0b3J5IHNpbmdsZXRvbi4KKwkgKi8KKwlzdGF0aWMgY2xhc3MgQ29ubmVjdGlvbkNob2ljZXNNb2RlbAorCQlleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwKKwkJaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+CisJeworCQlwcml2YXRlIGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgY29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcjsKKworCQlDb25uZWN0aW9uQ2hvaWNlc01vZGVsKCkgeworCQkJc3VwZXIoKTsKKwkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCk7CisJCX0KKworCQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCkgeworCQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlQWRkZWQoU3RyaW5nIG5hbWUpIHsKKwkJCQkJQ29ubmVjdGlvbkNob2ljZXNNb2RlbC50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKCk7CisJCQkJfQorCQkJCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVtb3ZlZChTdHJpbmcgbmFtZSkgeworCQkJCQlDb25uZWN0aW9uQ2hvaWNlc01vZGVsLnRoaXMuY29sbGVjdGlvbkNoYW5nZWQoKTsKKwkJCQl9CisJCQkJcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW5hbWVkKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgeworCQkJCQkvLyBJZ25vcmUgdGhpcyBldmVudCBmb3Igbm93LiBDb25uZWN0aW5nIGEgcHJvZmlsZSBhY3R1YWxseQorCQkJCQkvLyB0aHJvd3MgYSBjb25uZWN0aW9uIHJlbmFtZWQgZXZlbnQsIHdoaWNoIG1lc3NlcyB1cCB0aGUgCisJCQkJCS8vIGxpc3Qgc2VsZWN0aW9uLiBUaGVyZSBzaG91bGRuJ3QgYmUgYSBjb25uZWN0aW9uIHJlbmFtZWQKKwkJCQkJLy8gd2l0aGluIHRoZSBzY29wZSBvZiB0aGlzIGRpYWxvZyBhbnlob3cuCisJCQkJCS8vIENvbm5lY3Rpb25DaG9pY2VzTW9kZWwudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZCgpOworCQkJCX0KKwkJCX07CisJCX0KKworCQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKCkgeworCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLml0ZXJhdG9yKCkpKTsKKwkJfQorCisJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKCkgeworCQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuY29ubmVjdGlvblByb2ZpbGVOYW1lcygpOworCQl9CisKKwkJcHVibGljIGludCBzaXplKCkgeworCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuaXRlcmF0b3IoKSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7CisJCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmFkZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKKwkJCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkucmVtb3ZlQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIpOworCQl9CisKKwkJcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgeworCQkJcmV0dXJuIEpwdERiUGx1Z2luLmluc3RhbmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIEFkYXB0IHdoZXRoZXIgdGhlIEpQQSBwcm9qZWN0IGhhcyBhIHVzZXIgb3ZlcnJpZGUgc3BlY2lmaWVkCisJICogKGVpdGhlciBjYXRhbG9nIG9yIHNjaGVtYSk7CisJICovCisJYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFVzZXJPdmVycmlkZURlZmF1bHRGbGFnTW9kZWwKKwkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhUHJvamVjdCwgQm9vbGVhbj4KKwl7CisJCVVzZXJPdmVycmlkZURlZmF1bHRGbGFnTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEpwYVByb2plY3Q+IGpwYVByb2plY3RNb2RlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQkJc3VwZXIoanBhUHJvamVjdE1vZGVsLCBwcm9wZXJ0eU5hbWUpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnNwZWNpZmllc1VzZXJPdmVycmlkZURlZmF1bHQoKSk7CisJCX0KKworCQlib29sZWFuIHNwZWNpZmllc1VzZXJPdmVycmlkZURlZmF1bHQoKSB7CisJCQlyZXR1cm4gISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdCgpKTsKKwkJfQorCisJCWFic3RyYWN0IFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0KCk7CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7CisJCQkvLyBpZ25vcmUKKwkJfQorCX0KKworCisJLyoqCisJICogV2hldGhlciB0aGUgSlBBIHByb2plY3QgaGFzIGEgdXNlciBvdmVycmlkZSBkZWZhdWx0IGNhdGFsb2cgc3BlY2lmaWVkLgorCSAqLworCXN0YXRpYyBjbGFzcyBVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0ZsYWdNb2RlbAorCQlleHRlbmRzIFVzZXJPdmVycmlkZURlZmF1bHRGbGFnTW9kZWwKKwl7CisJCVVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nRmxhZ01vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0TW9kZWwpIHsKKwkJCXN1cGVyKGpwYVByb2plY3RNb2RlbCwgSnBhUHJvamVjdC5VU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7CisJCX0KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0VXNlck92ZXJyaWRlRGVmYXVsdCgpIHsKKwkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coKTsKKwkJfQorCX0KKworCisJLyoqCisJICogV2hldGhlciB0aGUgSlBBIHByb2plY3QgaGFzIGEgdXNlciBvdmVycmlkZSBkZWZhdWx0IHNjaGVtYSBzcGVjaWZpZWQuCisJICovCisJc3RhdGljIGNsYXNzIFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnTW9kZWwKKwkJZXh0ZW5kcyBVc2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ01vZGVsCisJeworCQlVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hRmxhZ01vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0TW9kZWwpIHsKKwkJCXN1cGVyKGpwYVByb2plY3RNb2RlbCwgSnBhUHJvamVjdC5VU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKKwkJfQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0KCkgeworCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIFRoZSBKUEEgcHJvamVjdCdzIHVzZXIgb3ZlcnJpZGUgZGVmYXVsdCBjYXRhbG9nCisJICovCisJc3RhdGljIGNsYXNzIFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nTW9kZWwKKwkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhUHJvamVjdCwgU3RyaW5nPgorCXsKKwkJVXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsKSB7IAorCQkJc3VwZXIoanBhUHJvamVjdE1vZGVsLCBKcGFQcm9qZWN0LlVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHNldFZhbHVlXyhTdHJpbmcgY2F0YWxvZykgeworCQkJdGhpcy5zdWJqZWN0LnNldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKGNhdGFsb2cpOworCQl9CisJfQorCisKKwkvKioKKwkgKiBUaGUgSlBBIHByb2plY3QncyB1c2VyIG92ZXJyaWRlIGRlZmF1bHQgY2F0YWxvZworCSAqLworCXN0YXRpYyBjbGFzcyBVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTW9kZWwKKwkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhUHJvamVjdCwgU3RyaW5nPgorCXsKKwkJVXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0TW9kZWwpIHsgCisJCQlzdXBlcihqcGFQcm9qZWN0TW9kZWwsIEpwYVByb2plY3QuVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHNldFZhbHVlXyhTdHJpbmcgc2NoZW1hKSB7CisJCQl0aGlzLnN1YmplY3Quc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYShzY2hlbWEpOworCQl9CisJfQorCisKKwkvKioKKwkgKiBGbGFnIG9uIHRoZSBKUEEgcHJvamVjdCBpbmRpY2F0aW5nIHdoZXRoZXIgaXQgc2hvdWxkIGRpc2NvdmVyIGFubm90YXRlZAorCSAqIGNsYXNzZXMKKwkgKi8KKwlzdGF0aWMgY2xhc3MgRGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzTW9kZWwKKwkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhUHJvamVjdCwgQm9vbGVhbj4KKwl7CisJCURpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlc01vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0TW9kZWwpIHsgCisJCQlzdXBlcihqcGFQcm9qZWN0TW9kZWwsIEpwYVByb2plY3QuRElTQ09WRVJTX0FOTk9UQVRFRF9DTEFTU0VTX1BST1BFUlRZKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoKSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKKwkJCXRoaXMuc3ViamVjdC5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoZSBuZWdhdGl2ZSBvZiB0aGUgImRpc2NvdmVyIGFubm90YXRlZCBjbGFzc2VzIiBmbGFnLgorCSAqLworCXN0YXRpYyBjbGFzcyBMaXN0QW5ub3RhdGVkQ2xhc3Nlc01vZGVsCisJCWV4dGVuZHMgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBCb29sZWFuPgorCXsKKwkJTGlzdEFubm90YXRlZENsYXNzZXNNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBkaXNjb3ZlckFubm90YXRlZENsYXNzZXNNb2RlbCkgeworCQkJc3VwZXIoZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzTW9kZWwpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oQm9vbGVhbiB2YWx1ZSkgeworCQkJcmV0dXJuIEJvb2xlYW5Ub29scy5ub3QodmFsdWUpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBCb29sZWFuIHJldmVyc2VUcmFuc2Zvcm1fKEJvb2xlYW4gdmFsdWUpIHsKKwkJCXJldHVybiBCb29sZWFuVG9vbHMubm90KHZhbHVlKTsKKwkJfQorCX0KKworCisJLyoqCisJICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIEpQQSBwcm9qZWN0IHN1cHBvcnRzIEpQQSAyLjAuCisJICovCisJc3RhdGljIGNsYXNzIEpwYTJfMFByb2plY3RGbGFnTW9kZWwKKwkJZXh0ZW5kcyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0LCBCb29sZWFuPgorCXsKKwkJSnBhMl8wUHJvamVjdEZsYWdNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsKSB7IAorCQkJc3VwZXIoanBhUHJvamVjdE1vZGVsKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKEpwYVByb2plY3QgdmFsdWUpIHsKKwkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUuZ2V0SnBhUGxhdGZvcm0oKS5nZXRKcGFWZXJzaW9uKCkuaXNDb21wYXRpYmxlV2l0aEpwYVZlcnNpb24oSnB0Q29yZVBsdWdpbi5KUEFfRkFDRVRfVkVSU0lPTl8yXzApKTsKKwkJfQorCX0KKworCisJLyoqCisJICogVGhlIGZvbGRlciB3aGVyZSB0aGUgc291cmNlIGZvciB0aGUgZ2VuZXJhdGVkIENhbm9uaWNhbCBNZXRhbW9kZWwKKwkgKiBpcyB3cml0dGVuLgorCSAqLworCXN0YXRpYyBjbGFzcyBNZXRhbW9kZWxTb3VyY2VGb2xkZXJNb2RlbAorCQlleHRlbmRzIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKcGFQcm9qZWN0LCBTdHJpbmc+CisJeworCQlNZXRhbW9kZWxTb3VyY2VGb2xkZXJNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsKSB7CisJCQlzdXBlcihqcGFQcm9qZWN0TW9kZWwsIEpwYVByb2plY3QyXzAuTUVUQU1PREVMX1NPVVJDRV9GT0xERVJfTkFNRV9QUk9QRVJUWSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKKwkJCXJldHVybiBqcGFQcm9qZWN0SXNKcGEyXzAoKSA/ICgoSnBhUHJvamVjdDJfMCkgdGhpcy5zdWJqZWN0KS5nZXRNZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKCkgOiBudWxsOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKKwkJCWlmICh0aGlzLmpwYVByb2plY3RJc0pwYTJfMCgpKSB7CisJCQkJKChKcGFQcm9qZWN0Ml8wKSB0aGlzLnN1YmplY3QpLnNldE1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUodmFsdWUpOworCQkJfQorCQl9CisKKwkJcHJpdmF0ZSBib29sZWFuIGpwYVByb2plY3RJc0pwYTJfMCgpIHsKKwkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0SnBhUGxhdGZvcm0oKS5nZXRKcGFWZXJzaW9uKCkuaXNDb21wYXRpYmxlV2l0aEpwYVZlcnNpb24oSnB0Q29yZVBsdWdpbi5KUEFfRkFDRVRfVkVSU0lPTl8yXzApOworCQl9CisJfQorCisKKwkvKioKKwkgKiBKYXZhIHByb2plY3Qgc291cmNlIGZvbGRlcnMuCisJICogV2Uga2VlcCB0aGUgbWV0YW1vZGVsIHNvdXJjZSBmb2xkZXIgaW4gc3luY2ggd2l0aCB0aGUgSmF2YSBzb3VyY2UgZm9sZGVycworCSAqIChpLmUuIGlmIGEgSmF2YSBzb3VyY2UgZm9sZGVyIGlzIGRlbGV0ZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBidWlsZCBwYXRoLAorCSAqIHdlIHJlbW92ZSB0aGUgbWV0YW1vZGVsIHNvdXJjZSBmb2xkZXIpOyB0aGVyZWZvcmUgdGhlIGxpc3Qgb2YgZm9sZGVyCisJICogY2hvaWNlcyBkb2VzIG5vdCBuZWVkIHRvIGJlIGF1Z21lbnRlZCB3aXRoIHRoZSBjdXJyZW50IGZvbGRlciAoYXMgd2UgZG8KKwkgKiB3aGVuIHRoZSBjdXJyZW50IGZvbGRlciBpcyBub3QgaW4gdGhlIGxpc3Qgb2YgY2hvaWNlcykuCisJICovCisJc3RhdGljIGNsYXNzIEphdmFTb3VyY2VGb2xkZXJDaG9pY2VzTW9kZWwKKwkJZXh0ZW5kcyBBc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8SnBhUHJvamVjdCwgU3RyaW5nPgorCXsKKwkJcHJpdmF0ZSBmaW5hbCBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciBqYXZhRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKKworCQlKYXZhU291cmNlRm9sZGVyQ2hvaWNlc01vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0TW9kZWwpIHsgCisJCQlzdXBlcihqcGFQcm9qZWN0TW9kZWwpOworCQkJdGhpcy5qYXZhRWxlbWVudENoYW5nZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRKYXZhRWxlbWVudENoYW5nZWRMaXN0ZW5lcigpOworCQl9CisKKwkJcHJpdmF0ZSBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciBidWlsZEphdmFFbGVtZW50Q2hhbmdlZExpc3RlbmVyKCkgeworCQkJcmV0dXJuIG5ldyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJCUphdmFTb3VyY2VGb2xkZXJDaG9pY2VzTW9kZWwudGhpcy5wcm9jZXNzSmF2YURlbHRhKGV2ZW50LmdldERlbHRhKCkpOworCQkJCX0KKwkJCX07CisJCX0KKworCQl2b2lkIHByb2Nlc3NKYXZhRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKKwkJCXN3aXRjaCAoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkpIHsKKwkJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX01PREVMIDoKKwkJCQkJdGhpcy5wcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oZGVsdGEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgOgorCQkJCQl0aGlzLnByb2Nlc3NKYXZhUHJvamVjdERlbHRhKGRlbHRhKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdCA6CisJCQkJCWJyZWFrOyAvLyBpZ25vcmUgZXZlcnl0aGluZyBlbHNlCisJCQl9CisJCX0KKworCQlwcml2YXRlIHZvaWQgcHJvY2Vzc0phdmFEZWx0YUNoaWxkcmVuKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7CisJCQlmb3IgKElKYXZhRWxlbWVudERlbHRhIGNoaWxkIDogZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKSB7CisJCQkJdGhpcy5wcm9jZXNzSmF2YURlbHRhKGNoaWxkKTsgLy8gcmVjdXJzZQorCQkJfQorCQl9CisKKwkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NKYXZhUHJvamVjdERlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7CisJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBkZWx0YS5nZXRFbGVtZW50KCk7CisJCQlpZiAoamF2YVByb2plY3QuZXF1YWxzKHRoaXMuc3ViamVjdC5nZXRKYXZhUHJvamVjdCgpKSAmJiB0aGlzLmNsYXNzcGF0aEhhc0NoYW5nZWQoZGVsdGEpKSB7CisJCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLml0ZXJhdG9yKCkpKTsKKwkJCX0KKwkJfQorCisJCXByaXZhdGUgYm9vbGVhbiBjbGFzc3BhdGhIYXNDaGFuZ2VkKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7CisJCQlyZXR1cm4gdGhpcy5kZWx0YUZsYWdJc1NldChkZWx0YSwgSUphdmFFbGVtZW50RGVsdGEuRl9SRVNPTFZFRF9DTEFTU1BBVEhfQ0hBTkdFRCk7CisJCX0KKworCQlwcml2YXRlIGJvb2xlYW4gZGVsdGFGbGFnSXNTZXQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEsIGludCBmbGFnKSB7CisJCQlyZXR1cm4gKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEKSAmJgorCQkJCQlCaXRUb29scy5mbGFnSXNTZXQoZGVsdGEuZ2V0RmxhZ3MoKSwgZmxhZyk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SXRlcmFibGUoKSB7CisJCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0SXNKcGEyXzAoKSA/CisJCQkJCSgoSnBhUHJvamVjdDJfMCkgdGhpcy5zdWJqZWN0KS5nZXRTb3VyY2VGb2xkZXJOYW1lcygpIDoKKwkJCQkJRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7CisJCX0KKworCQlwcml2YXRlIGJvb2xlYW4ganBhUHJvamVjdElzSnBhMl8wKCkgeworCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRKcGFQbGF0Zm9ybSgpLmdldEpwYVZlcnNpb24oKS5pc0NvbXBhdGlibGVXaXRoSnBhVmVyc2lvbihKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzJfMCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7CisJCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMuamF2YUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgeworCQkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzLmphdmFFbGVtZW50Q2hhbmdlZExpc3RlbmVyKTsKKwkJfQorCX0KKworCisJLyoqCisJICogQWJzdHJhY3QgcHJvcGVydHkgYXNwZWN0IGFkYXB0ZXIgZm9yIERUUCBjb25uZWN0aW9uIHByb2ZpbGUgY29ubmVjdGlvbi9kYXRhYmFzZQorCSAqLworCWFic3RyYWN0IHN0YXRpYyBjbGFzcyBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnR5QXNwZWN0QWRhcHRlcjxWPgorCQlleHRlbmRzIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Q29ubmVjdGlvblByb2ZpbGUsIFY+CisJeworCQlwcml2YXRlIGZpbmFsIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXI7CisKKwkJQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbm5lY3Rpb25Qcm9maWxlPiBjb25uZWN0aW9uUHJvZmlsZU1vZGVsKSB7CisJCQlzdXBlcihjb25uZWN0aW9uUHJvZmlsZU1vZGVsKTsKKwkJCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpOworCQl9CisKKwkJLy8gdGhlIGNvbm5lY3Rpb24gb3BlbmluZyBpcyBwcm9iYWJseSB0aGUgb25seSB0aGluZyB0aGF0IHdpbGwgaGFwcGVuLi4uCisJCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgeworCQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgeworCQkJCQlDb25uZWN0aW9uUHJvZmlsZVByb3BlcnR5QXNwZWN0QWRhcHRlci50aGlzLmNvbm5lY3Rpb25PcGVuZWQocHJvZmlsZSk7CisJCQkJfQorCQkJfTsKKwkJfQorCisJCXZvaWQgY29ubmVjdGlvbk9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7CisJCQlpZiAocHJvZmlsZS5lcXVhbHModGhpcy5zdWJqZWN0KSkgeworCQkJCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7CisJCQl9CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7CisJCQl0aGlzLnN1YmplY3QuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKKwkJCXRoaXMuc3ViamVjdC5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOworCQl9CisJfQorCisKKwkvKioKKwkgKiBNb25pdG9yIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUncyBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZQorCSAqICh1c2VkIHRvIGVuYWJsZSB0aGUgIkNvbm5lY3QiIGxpbmspCisJICovCisJc3RhdGljIGNsYXNzIERpc2Nvbm5lY3RlZE1vZGVsCisJCWV4dGVuZHMgQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Qm9vbGVhbj4KKwl7CisJCURpc2Nvbm5lY3RlZE1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxDb25uZWN0aW9uUHJvZmlsZT4gY29ubmVjdGlvblByb2ZpbGVNb2RlbCkgeworCQkJc3VwZXIoY29ubmVjdGlvblByb2ZpbGVNb2RlbCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCh0aGlzLnN1YmplY3QgIT0gbnVsbCkgJiYgdGhpcy5zdWJqZWN0LmlzRGlzY29ubmVjdGVkKCkpOworCQl9CisJfQorCisKKwkvKioKKwkgKiBEYXRhYmFzZS1kZXRlcm1pbmVkIGRlZmF1bHQgY2F0YWxvZworCSAqLworCXN0YXRpYyBjbGFzcyBEYXRhYmFzZURlZmF1bHRDYXRhbG9nTW9kZWwKKwkJZXh0ZW5kcyBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnR5QXNwZWN0QWRhcHRlcjxTdHJpbmc+CisJeworCQlEYXRhYmFzZURlZmF1bHRDYXRhbG9nTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPENvbm5lY3Rpb25Qcm9maWxlPiBjb25uZWN0aW9uUHJvZmlsZU1vZGVsKSB7CisJCQlzdXBlcihjb25uZWN0aW9uUHJvZmlsZU1vZGVsKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJRGF0YWJhc2UgZGIgPSB0aGlzLnN1YmplY3QuZ2V0RGF0YWJhc2UoKTsKKwkJCXJldHVybiAoZGIgPT0gbnVsbCkgPyBudWxsIDogZGIuZ2V0RGVmYXVsdENhdGFsb2dJZGVudGlmaWVyKCk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHNjaGVtYSBpcyBub3QgZGVyaXZlZCBwdXJlbHkgZnJvbSB0aGUgZGF0YWJhc2U7IGl0IGlzIGFsc28gZGVwZW5kZW50CisJICogb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGRlZmF1bHQgY2F0YWxvZyAod2hpY2ggbWF5IGJlIG92ZXJyaWRkZW4KKwkgKiBieSB0aGUgdXNlcikuCisJICovCisJc3RhdGljIGNsYXNzIERhdGFiYXNlRGVmYXVsdFNjaGVtYU1vZGVsCisJCWV4dGVuZHMgQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8U3RyaW5nPgorCXsKKwkJcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBkZWZhdWx0Q2F0YWxvZ01vZGVsOworCQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY2F0YWxvZ0xpc3RlbmVyOworCisJCURhdGFiYXNlRGVmYXVsdFNjaGVtYU1vZGVsKAorCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxDb25uZWN0aW9uUHJvZmlsZT4gY29ubmVjdGlvblByb2ZpbGVNb2RlbCwKKwkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBkZWZhdWx0Q2F0YWxvZ01vZGVsCisJCSkgeworCQkJc3VwZXIoY29ubmVjdGlvblByb2ZpbGVNb2RlbCk7CisJCQl0aGlzLmRlZmF1bHRDYXRhbG9nTW9kZWwgPSBkZWZhdWx0Q2F0YWxvZ01vZGVsOworCQkJdGhpcy5jYXRhbG9nTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2F0YWxvZ0xpc3RlbmVyKCk7CisJCX0KKworCQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDYXRhbG9nTGlzdGVuZXIoKSB7CisJCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQkJRGF0YWJhc2VEZWZhdWx0U2NoZW1hTW9kZWwudGhpcy5jYXRhbG9nQ2hhbmdlZCgpOworCQkJCX0KKwkJCX07CisJCX0KKworCQl2b2lkIGNhdGFsb2dDaGFuZ2VkKCkgeworCQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKKwkJCXN1cGVyLmVuZ2FnZVN1YmplY3RfKCk7CisJCQl0aGlzLmRlZmF1bHRDYXRhbG9nTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2F0YWxvZ0xpc3RlbmVyKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKKwkJCXRoaXMuZGVmYXVsdENhdGFsb2dNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYXRhbG9nTGlzdGVuZXIpOworCQkJc3VwZXIuZGlzZW5nYWdlU3ViamVjdF8oKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgeworCQkJU2NoZW1hQ29udGFpbmVyIHNjID0gdGhpcy5nZXRTY2hlbWFDb250YWluZXIoKTsKKwkJCXJldHVybiAoc2MgPT0gbnVsbCkgPyBudWxsIDogc2MuZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKTsKKwkJfQorCisJCXByaXZhdGUgU2NoZW1hQ29udGFpbmVyIGdldFNjaGVtYUNvbnRhaW5lcigpIHsKKwkJCXJldHVybiB0aGlzLmRhdGFiYXNlU3VwcG9ydHNDYXRhbG9ncygpID8gdGhpcy5nZXRDYXRhbG9nKCkgOiB0aGlzLmdldERhdGFiYXNlKCk7CisJCX0KKworCQlwcml2YXRlIGJvb2xlYW4gZGF0YWJhc2VTdXBwb3J0c0NhdGFsb2dzKCkgeworCQkJRGF0YWJhc2UgZGIgPSB0aGlzLmdldERhdGFiYXNlKCk7CisJCQlyZXR1cm4gKGRiICE9IG51bGwpICYmIGRiLnN1cHBvcnRzQ2F0YWxvZ3MoKTsKKwkJfQorCisJCXByaXZhdGUgQ2F0YWxvZyBnZXRDYXRhbG9nKCkgeworCQkJU3RyaW5nIG5hbWUgPSB0aGlzLmRlZmF1bHRDYXRhbG9nTW9kZWwuZ2V0VmFsdWUoKTsKKwkJCS8vIGlmIHdlIGdldCBoZXJlIHdlIGtub3cgdGhlIGRhdGFiYXNlIGlzIG5vdCBudWxsCisJCQlyZXR1cm4gKG5hbWUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dGb3JJZGVudGlmaWVyKG5hbWUpOworCQl9CisKKwkJcHJpdmF0ZSBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKKwkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGF0YWJhc2UoKTsKKwkJfQorCX0KKworCisJLyoqCisJICogQWJzdHJhY3QgY29sbGVjdGlvbiBhc3BlY3QgYWRhcHRlciBmb3IgRFRQIGNvbm5lY3Rpb24gcHJvZmlsZSBjb25uZWN0aW9uL2RhdGFiYXNlCisJICovCisJYWJzdHJhY3Qgc3RhdGljIGNsYXNzIENvbm5lY3Rpb25Qcm9maWxlQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8RT4KKwkJZXh0ZW5kcyBBc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8Q29ubmVjdGlvblByb2ZpbGUsIEU+CisJeworCQlwcml2YXRlIGZpbmFsIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXI7CisKKwkJQ29ubmVjdGlvblByb2ZpbGVDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvblByb2ZpbGU+IGNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpIHsKKwkJCXN1cGVyKGNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpOworCQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7CisJCX0KKworCQkvLyB0aGUgY29ubmVjdGlvbiBvcGVuaW5nIGlzIHByb2JhYmx5IHRoZSBvbmx5IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4uLi4KKwkJcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25BZGFwdGVyKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7CisJCQkJCUNvbm5lY3Rpb25Qcm9maWxlQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5jb25uZWN0aW9uT3BlbmVkKHByb2ZpbGUpOworCQkJCX0KKwkJCX07CisJCX0KKworCQl2b2lkIGNvbm5lY3Rpb25PcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgeworCQkJaWYgKHByb2ZpbGUuZXF1YWxzKHRoaXMuc3ViamVjdCkpIHsKKwkJCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKCk7CisJCQl9CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7CisJCQl0aGlzLnN1YmplY3QuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKKwkJCXRoaXMuc3ViamVjdC5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOworCQl9CisJfQorCisKKwkvKioKKwkgKiBDYXRhbG9ncyBvbiB0aGUgZGF0YWJhc2UuCisJICovCisJc3RhdGljIGNsYXNzIERhdGFiYXNlQ2F0YWxvZ0Nob2ljZXNNb2RlbAorCQlleHRlbmRzIENvbm5lY3Rpb25Qcm9maWxlQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8U3RyaW5nPgorCXsKKwkJRGF0YWJhc2VDYXRhbG9nQ2hvaWNlc01vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxDb25uZWN0aW9uUHJvZmlsZT4gY29ubmVjdGlvblByb2ZpbGVNb2RlbCkgeworCQkJc3VwZXIoY29ubmVjdGlvblByb2ZpbGVNb2RlbCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3JfKCkgeworCQkJRGF0YWJhc2UgZGIgPSB0aGlzLnN1YmplY3QuZ2V0RGF0YWJhc2UoKTsKKwkJCS8vIHVzZSBjYXRhbG9nICppZGVudGlmaWVycyogc2luY2UgdGhlIHN0cmluZyBlbmRzIHVwIGJlaW5nIHRoZSAiZGVmYXVsdCIgZm9yIHZhcmlvdXMgdGV4dCBlbnRyaWVzCisJCQlyZXR1cm4gKGRiICE9IG51bGwpID8gZGIuc29ydGVkQ2F0YWxvZ0lkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKTsKKwkJfQorCX0KKworCisJLyoqCisJICogU2NoZW1hcyBvbiB0aGUgZGF0YWJhc2Ugb3IgY2F0YWxvZy4KKwkgKiBUaGlzIGxpc3QgaXMgbm90IGRlcml2ZWQgcHVyZWx5IGZyb20gdGhlIGRhdGFiYXNlOyBpdCBpcyBhbHNvIGRlcGVuZGVudAorCSAqIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkZWZhdWx0IGNhdGFsb2cgKHdoaWNoIG1heSBiZSBvdmVycmlkZGVuCisJICogYnkgdGhlIHVzZXIpLgorCSAqLworCXN0YXRpYyBjbGFzcyBEYXRhYmFzZVNjaGVtYUNob2ljZXNNb2RlbAorCQlleHRlbmRzIENvbm5lY3Rpb25Qcm9maWxlQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8U3RyaW5nPgorCXsKKwkJcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBkZWZhdWx0Q2F0YWxvZ01vZGVsOworCQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY2F0YWxvZ0xpc3RlbmVyOworCisJCURhdGFiYXNlU2NoZW1hQ2hvaWNlc01vZGVsKAorCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxDb25uZWN0aW9uUHJvZmlsZT4gY29ubmVjdGlvblByb2ZpbGVNb2RlbCwKKwkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBkZWZhdWx0Q2F0YWxvZ01vZGVsCisJCSkgeworCQkJc3VwZXIoY29ubmVjdGlvblByb2ZpbGVNb2RlbCk7CisJCQl0aGlzLmRlZmF1bHRDYXRhbG9nTW9kZWwgPSBkZWZhdWx0Q2F0YWxvZ01vZGVsOworCQkJdGhpcy5jYXRhbG9nTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2F0YWxvZ0xpc3RlbmVyKCk7CisJCX0KKworCQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDYXRhbG9nTGlzdGVuZXIoKSB7CisJCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQkJRGF0YWJhc2VTY2hlbWFDaG9pY2VzTW9kZWwudGhpcy5jYXRhbG9nQ2hhbmdlZCgpOworCQkJCX0KKwkJCX07CisJCX0KKworCQl2b2lkIGNhdGFsb2dDaGFuZ2VkKCkgeworCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZCgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgeworCQkJc3VwZXIuZW5nYWdlU3ViamVjdF8oKTsKKwkJCXRoaXMuZGVmYXVsdENhdGFsb2dNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYXRhbG9nTGlzdGVuZXIpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgeworCQkJdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNhdGFsb2dMaXN0ZW5lcik7CisJCQlzdXBlci5kaXNlbmdhZ2VTdWJqZWN0XygpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yXygpIHsKKwkJCVNjaGVtYUNvbnRhaW5lciBzYyA9IHRoaXMuZ2V0U2NoZW1hQ29udGFpbmVyKCk7CisJCQkvLyB1c2Ugc2NoZW1hICppZGVudGlmaWVycyogc2luY2UgdGhlIHN0cmluZyBlbmRzIHVwIGJlaW5nIHRoZSAiZGVmYXVsdCIgZm9yIHZhcmlvdXMgdGV4dCBlbnRyaWVzCisJCQlyZXR1cm4gKHNjICE9IG51bGwpID8gc2Muc29ydGVkU2NoZW1hSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpOworCQl9CisKKwkJcHJpdmF0ZSBTY2hlbWFDb250YWluZXIgZ2V0U2NoZW1hQ29udGFpbmVyKCkgeworCQkJcmV0dXJuIHRoaXMuZGF0YWJhc2VTdXBwb3J0c0NhdGFsb2dzKCkgPyB0aGlzLmdldENhdGFsb2coKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwkJfQorCisJCXByaXZhdGUgYm9vbGVhbiBkYXRhYmFzZVN1cHBvcnRzQ2F0YWxvZ3MoKSB7CisJCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKKwkJCXJldHVybiAoZGIgIT0gbnVsbCkgJiYgZGIuc3VwcG9ydHNDYXRhbG9ncygpOworCQl9CisKKwkJcHJpdmF0ZSBDYXRhbG9nIGdldENhdGFsb2coKSB7CisJCQlTdHJpbmcgbmFtZSA9IHRoaXMuZGVmYXVsdENhdGFsb2dNb2RlbC5nZXRWYWx1ZSgpOworCQkJLy8gaWYgd2UgZ2V0IGhlcmUgd2Uga25vdyB0aGUgZGF0YWJhc2UgaXMgbm90IG51bGwKKwkJCXJldHVybiAobmFtZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ0ZvcklkZW50aWZpZXIobmFtZSk7CisJCX0KKworCQlwcml2YXRlIERhdGFiYXNlIGdldERhdGFiYXNlKCkgeworCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREYXRhYmFzZSgpOworCQl9CisJfQorCisJLyoqCisJICogQ29tYmluZSB2YXJpb3VzIG1vZGVscyB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgY2F0YWxvZyBvciBzY2hlbWEuCisJICogSWYgdGhlIHVzZXIgaGFzIGNoZWNrZWQgdGhlICJPdmVycmlkZSBEZWZhdWx0IiBjaGVjay1ib3gsIHRoZSBkZWZhdWx0CisJICogaXMgdGhlIEpQQSBwcm9qZWN0J3MgdXNlciBvdmVycmlkZSBkZWZhdWx0LCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgaXMKKwkgKiBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhYmFzZS4KKwkgKi8KKwlzdGF0aWMgY2xhc3MgRGVmYXVsdE1vZGVsCisJCWV4dGVuZHMgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4KKwkJaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+CisJeworCQlwcml2YXRlIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB1c2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ01vZGVsOworCQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdXNlck92ZXJyaWRlRGVmYXVsdE1vZGVsOworCQlwcml2YXRlIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGRhdGFiYXNlRGVmYXVsdE1vZGVsOworCisJCURlZmF1bHRNb2RlbCgKKwkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdXNlck92ZXJyaWRlRGVmYXVsdEZsYWdNb2RlbCwKKwkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHVzZXJPdmVycmlkZURlZmF1bHRNb2RlbCwKKwkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBkYXRhYmFzZURlZmF1bHRNb2RlbAorCQkpIHsKKwkJCXN1cGVyKHVzZXJPdmVycmlkZURlZmF1bHRGbGFnTW9kZWwsIHVzZXJPdmVycmlkZURlZmF1bHRNb2RlbCwgZGF0YWJhc2VEZWZhdWx0TW9kZWwpOworCQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ01vZGVsID0gdXNlck92ZXJyaWRlRGVmYXVsdEZsYWdNb2RlbDsKKwkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdE1vZGVsID0gdXNlck92ZXJyaWRlRGVmYXVsdE1vZGVsOworCQkJdGhpcy5kYXRhYmFzZURlZmF1bHRNb2RlbCA9IGRhdGFiYXNlRGVmYXVsdE1vZGVsOworCQl9CisKKwkJLyoqCisJCSAqIElmIHRoZSBjaGVja2JveCBoYXMgYmVlbiB1bmNoZWNrZWQsIHdlIG5lZWQgdG8gY2xlYXIgb3V0IHRoZSBKUEEKKwkJICogcHJvamVjdCdzIHVzZXIgb3ZlcnJpZGUuCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7CisJCQlpZiAoZXZlbnQuZ2V0U291cmNlKCkgPT0gdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ01vZGVsKSB7CisJCQkJaWYgKCAhIHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdEZsYWdJc1NldCgpKSB7CisJCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdE1vZGVsLnNldFZhbHVlKG51bGwpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiBJZiB0aGUgY2hlY2tib3ggaXMgY2hlY2tlZCwgcmV0dXJuIHRoZSB1c2VyIG92ZXJyaWRlIGZyb20gdGhlIEpQQSBwcm9qZWN0OworCQkgKiBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0IGZyb20gdGhlIGRhdGFiYXNlCisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlKCkgeworCQkJcmV0dXJuIHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdEZsYWdJc1NldCgpID8KKwkJCQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0TW9kZWwuZ2V0VmFsdWUoKSA6CisJCQkJCXRoaXMuZGF0YWJhc2VEZWZhdWx0TW9kZWwuZ2V0VmFsdWUoKTsKKwkJfQorCisJCS8qKgorCQkgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVzZXIgbWFrZXMgYSBzZWxlY3Rpb24gZnJvbSB0aGUKKwkJICogZHJvcC1kb3duOyB3aGljaCBpcyBvbmx5IHBvc3NpYmxlIHdoZW4gdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQKKwkJICogKGFuZCB0aGUgZHJvcC1kb3duIGlzIGVuYWJsZWQpLgorCQkgKi8KKwkJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRNb2RlbC5zZXRWYWx1ZSh2YWx1ZSk7CisJCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOworCQl9CisKKwkJcHJpdmF0ZSBib29sZWFuIHVzZXJPdmVycmlkZURlZmF1bHRGbGFnSXNTZXQoKSB7CisJCQlyZXR1cm4gZmxhZ0lzU2V0KHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdEZsYWdNb2RlbCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgeworCQkJc2IuYXBwZW5kKHRoaXMuZ2V0VmFsdWUoKSk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9EZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0RlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyLmphdmEKaW5kZXggYjgzYmNhNi4uM2E5NDk2OCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0RlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0RlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyLmphdmEKQEAgLTE0Myw3ICsxNDMsNyBAQAogCXZvaWQgY2hlY2tGb3JOb0VkaXRvcnMoKSB7CiAJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwogCQlpZiAoKGFjdGl2ZVBhZ2UgPT0gbnVsbCkKLQkJCQl8fCAoYWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKSA9PSBudWxsKSkgeworCQkJCXx8IChhY3RpdmVQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKS5sZW5ndGggPT0gMCkpIHsKIAkJCXNlbGVjdChEZWZhdWx0SnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OLCBudWxsKTsKIAkJfQogCX0KQEAgLTI0MSw3ICsyNDEsMTAgQEAKIAkJfQogCQkKIAkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkvLyBub3AKKwkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBwYXJ0UmVmLmdldFBhcnQoZmFsc2UpOworCQkJaWYgKHBhcnQgIT0gbnVsbCkgeworCQkJCWluaXRQYXJ0KHBhcnQpOworCQkJfQogCQl9CiAJCQogCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmphdmEKaW5kZXggNjNjMGQ2Ni4uOTEyODNhYyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmphdmEKQEAgLTEsMTIgKzEsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgogICoKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTE4LDcgKzE4LDcgQEAKIAogcHVibGljIGNsYXNzIFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5CiB7Ci0JcHJpdmF0ZSBzdGF0aWMgU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkgSU5TVEFOQ0U7CisJcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkgSU5TVEFOQ0U7CiAKIAlwcml2YXRlIHN0YXRpYyBPYmplY3QgTVVURVggPSBuZXcgT2JqZWN0KCk7CiAKQEAgLTQ4LDcgKzQ4LDcgQEAKIAl9CiAKIAotCXByaXZhdGUgTWFwPElXb3JrYmVuY2hXaW5kb3csIERlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyPiBtYW5hZ2VyczsKKwlNYXA8SVdvcmtiZW5jaFdpbmRvdywgRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXI+IG1hbmFnZXJzOwogCiAJcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciB3aW5kb3dMaXN0ZW5lcjsKIApAQCAtNjcsOSArNjcsOSBAQAogCSAqIFJldHVybnMgdGhlIEpwYVNlbGVjdGlvbk1hbmFnZXIgZm9yIHRoZSBJV29ya2JlbmNoV2luZG93LgogCSAqIENyZWF0ZXMgYSBuZXcgb25lIGlmIG5vbmUgZXhpc3RzIHlldC4KIAkgKi8KLQlwcml2YXRlIERlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyIGludGVybmFsR2V0U2VsZWN0aW9uTWFuYWdlcihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgeworCURlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyIGludGVybmFsR2V0U2VsZWN0aW9uTWFuYWdlcihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewogCQlpZiAod2luZG93ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBJV29ya2JlbmNoV2luZG93IGNhbm5vdCBiZSBudWxsIik7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgSVdvcmtiZW5jaFdpbmRvdyBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCiAJCX0KIAogCQlpZiAoISBtYW5hZ2Vycy5jb250YWluc0tleSh3aW5kb3cpKSB7CkBAIC04Miw5ICs4MiwxMSBAQAogCX0KIAogCi0JcHJpdmF0ZSBjbGFzcyBXaW5kb3dMaXN0ZW5lciBpbXBsZW1lbnRzIElXaW5kb3dMaXN0ZW5lcgorCWNsYXNzIFdpbmRvd0xpc3RlbmVyIGltcGxlbWVudHMgSVdpbmRvd0xpc3RlbmVyCiAJewotCQlwdWJsaWMgdm9pZCB3aW5kb3dPcGVuZWQoSVdvcmtiZW5jaFdpbmRvdyBhV2luZG93KSB7fQorCQlwdWJsaWMgdm9pZCB3aW5kb3dPcGVuZWQoSVdvcmtiZW5jaFdpbmRvdyBhV2luZG93KSB7CisJCQkvLyBkbyBub3RoaW5nCisJCX0KIAogCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoSVdvcmtiZW5jaFdpbmRvdyBhV2luZG93KSB7CiAJCQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlciBtYW5hZ2VyID0gaW50ZXJuYWxHZXRTZWxlY3Rpb25NYW5hZ2VyKGFXaW5kb3cpOwpAQCAtOTIsOCArOTQsMTIgQEAKIAkJCW1hbmFnZXJzLnJlbW92ZShhV2luZG93KTsKIAkJfQogCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0FjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IGFXaW5kb3cpIHt9CisJCXB1YmxpYyB2b2lkIHdpbmRvd0FjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IGFXaW5kb3cpIHsKKwkJCS8vIGRvIG5vdGhpbmcKKwkJfQogCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0RlYWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgYVdpbmRvdykge30KKwkJcHVibGljIHZvaWQgd2luZG93RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyBhV2luZG93KSB7CisJCQkvLyBkbyBub3RoaW5nCisJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uUGFydGljaXBhbnRGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uUGFydGljaXBhbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOWNjNDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvblBhcnRpY2lwYW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3MuSnBhRGV0YWlsc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25QYXJ0aWNpcGFudEZhY3RvcnkgCi0JaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLXsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfTElTVCA9IG5ldyBDbGFzc1tdIHsgSnBhU2VsZWN0aW9uUGFydGljaXBhbnQuY2xhc3MgfTsKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIEFEQVBURVJfTElTVDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKCEgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElXb3JrYmVuY2hQYXJ0KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciA9IAotCQkJU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcigoKElXb3JrYmVuY2hQYXJ0KSBhZGFwdGFibGVPYmplY3QpLmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0JCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJcmV0dXJuIG5ldyBUZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQoc2VsZWN0aW9uTWFuYWdlciwgKElUZXh0RWRpdG9yKSBhZGFwdGFibGVPYmplY3QpOwotCQl9Ci0JCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBKcGFTdHJ1Y3R1cmVWaWV3KSB7Ci0JCQlyZXR1cm4gbmV3IEpwYVN0cnVjdHVyZVNlbGVjdGlvblBhcnRpY2lwYW50KHNlbGVjdGlvbk1hbmFnZXIsIChKcGFTdHJ1Y3R1cmVWaWV3KSBhZGFwdGFibGVPYmplY3QpOwotCQl9Ci0JCWVsc2UgaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIEpwYURldGFpbHNWaWV3KSB7Ci0JCQlyZXR1cm4gbmV3IEpwYURldGFpbHNTZWxlY3Rpb25QYXJ0aWNpcGFudCgoSnBhRGV0YWlsc1ZpZXcpIGFkYXB0YWJsZU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1dvcmtiZW5jaFBhcnRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1dvcmtiZW5jaFBhcnRBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYTlhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vV29ya2JlbmNoUGFydEFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3MuSnBhRGV0YWlsc1ZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVWaWV3OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7CisKKy8qKgorICogRmFjdG9yeSB0byBidWlsZCBhZGFwdGVycyBmb3IgYSB3b3JrYmVuY2ggcGFydDoKKyAqICAgLSBKUEEgc2VsZWN0aW9uIHBhcnRpY2lwYW50IChpZiB0aGUgZWRpdG9yIHBhcnQgaXMgYSB0ZXh0IGVkaXRvciBldGMuKQorICogCisgKiBTZWUgb3JnLmVjbGlwc2UuanB0LnVpIHBsdWdpbi54bWwuCisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrYmVuY2hQYXJ0QWRhcHRlckZhY3RvcnkgCisJaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIEFEQVBURVJfTElTVCA9IG5ldyBDbGFzc1tdIHsgSnBhU2VsZWN0aW9uUGFydGljaXBhbnQuY2xhc3MgfTsKKworCXB1YmxpYyBDbGFzczw/PltdIGdldEFkYXB0ZXJMaXN0KCkgeworCQlyZXR1cm4gQURBUFRFUl9MSVNUOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgQ2xhc3MgYWRhcHRlclR5cGUpIHsKKwkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElXb3JrYmVuY2hQYXJ0KSB7CisJCQlyZXR1cm4gdGhpcy5nZXRBZGFwdGVyKChJV29ya2JlbmNoUGFydCkgYWRhcHRhYmxlT2JqZWN0LCBhZGFwdGVyVHlwZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBPYmplY3QgZ2V0QWRhcHRlcihJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0LCBDbGFzczw/PiBhZGFwdGVyVHlwZSkgeworCQlpZiAoYWRhcHRlclR5cGUgPT0gSnBhU2VsZWN0aW9uUGFydGljaXBhbnQuY2xhc3MpIHsKKwkJCXJldHVybiB0aGlzLmJ1aWxkSnBhU2VsZWN0aW9uUGFydGljaXBhbnQod29ya2JlbmNoUGFydCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCBidWlsZEpwYVNlbGVjdGlvblBhcnRpY2lwYW50KElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQpIHsKKwkJSnBhU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyID0gU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcih3b3JrYmVuY2hQYXJ0LmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7CisJCWlmICh3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKKwkJCXJldHVybiBuZXcgVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50KHNlbGVjdGlvbk1hbmFnZXIsIChJVGV4dEVkaXRvcikgd29ya2JlbmNoUGFydCk7CisJCX0KKwkJaWYgKHdvcmtiZW5jaFBhcnQgaW5zdGFuY2VvZiBKcGFTdHJ1Y3R1cmVWaWV3KSB7CisJCQlyZXR1cm4gbmV3IEpwYVN0cnVjdHVyZVNlbGVjdGlvblBhcnRpY2lwYW50KHNlbGVjdGlvbk1hbmFnZXIsIChKcGFTdHJ1Y3R1cmVWaWV3KSB3b3JrYmVuY2hQYXJ0KTsKKwkJfQorCQlpZiAod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIEpwYURldGFpbHNWaWV3KSB7CisJCQlyZXR1cm4gbmV3IEpwYURldGFpbHNTZWxlY3Rpb25QYXJ0aWNpcGFudCgoSnBhRGV0YWlsc1ZpZXcpIHdvcmtiZW5jaFBhcnQpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0dlbmVyYWxKcGFNYXBwaW5nSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9HZW5lcmFsSnBhTWFwcGluZ0l0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjMxNjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0dlbmVyYWxKcGFNYXBwaW5nSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyYWxKcGFNYXBwaW5nSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQlpbXBsZW1lbnRzIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotewotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQlPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCURlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlciA9IChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBQZXJzaXN0ZW50VHlwZSkgewotCQkJcmV0dXJuIGJ1aWxkUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW50VHlwZSkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIoKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlcik7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvSmF2YUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvSmF2YUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKaW5kZXggNzc5ZjAzNC4uYWQ5NGIxOCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0phdmFJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDI5ICs5LDMxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuSmF2YVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5QZXJzaXN0ZW50QXR0cmlidXRlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwogCiAKLXB1YmxpYyBjbGFzcyBKYXZhSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZXh0ZW5kcyBHZW5lcmFsSnBhTWFwcGluZ0l0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5CitwdWJsaWMgY2xhc3MgSmF2YUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5CiB7Ci0JQE92ZXJyaWRlCiAJcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcigKIAkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7CiAJCURlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlciA9IChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXI7Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgSmF2YVJlc291cmNlTW9kZWwpIHsKLQkJCXJldHVybiBuZXcgUmVzb3VyY2VNb2RlbEl0ZW1Db250ZW50UHJvdmlkZXIoKEphdmFSZXNvdXJjZU1vZGVsKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKKwkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBKcGFGaWxlKSB7CisJCQlyZXR1cm4gbmV3IFJlc291cmNlTW9kZWxJdGVtQ29udGVudFByb3ZpZGVyKChKcGFGaWxlKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKIAkJfQotCQlyZXR1cm4gc3VwZXIuYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlcikgewotCQlyZXR1cm4gbmV3IEphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIoKEphdmFQZXJzaXN0ZW50VHlwZSkgcGVyc2lzdGVudFR5cGUsIHRyZWVDb250ZW50UHJvdmlkZXIpOworCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgeworCQkJcmV0dXJuIG5ldyBKYXZhUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyKChKYXZhUGVyc2lzdGVudFR5cGUpIGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOworCQl9CisJCWlmIChpdGVtIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKKwkJCXJldHVybiBuZXcgUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIoKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvSmF2YVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0phdmFSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YQppbmRleCBiYWJjZjhkLi5iMGI1Y2Q0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvSmF2YVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwxNSArOSwzMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7CiAKIHB1YmxpYyBjbGFzcyBKYXZhUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyCi0JZXh0ZW5kcyBSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIKKwlpbXBsZW1lbnRzIEpwYVN0cnVjdHVyZVByb3ZpZGVyCiB7Ci0JcHVibGljIEphdmFSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoSmF2YVJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCkgewotCQlzdXBlcihyZXNvdXJjZU1vZGVsKTsKKwkvLyBzaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFTdHJ1Y3R1cmVQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBKYXZhUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyKCkgeworCQlzdXBlcigpOwogCX0KIAkKIAlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpIHsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9Pcm1JdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL09ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKaW5kZXggMjlhNjRjYy4uYWU4M2YwNiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL09ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL09ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsMzYgKzEwLDQwIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuT3JtUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLlBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKIAotcHVibGljIGNsYXNzIE9ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGV4dGVuZHMgR2VuZXJhbEpwYU1hcHBpbmdJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQorcHVibGljIGNsYXNzIE9ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5CiB7Ci0JQE92ZXJyaWRlCiAJcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcigKIAkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7CiAJCURlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlciA9IChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXI7Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgT3JtUmVzb3VyY2VNb2RlbCkgewotCQkJcmV0dXJuIG5ldyBSZXNvdXJjZU1vZGVsSXRlbUNvbnRlbnRQcm92aWRlcigoT3JtUmVzb3VyY2VNb2RlbCkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7CisJCWlmIChpdGVtIGluc3RhbmNlb2YgSnBhRmlsZSkgeworCQkJcmV0dXJuIG5ldyBSZXNvdXJjZU1vZGVsSXRlbUNvbnRlbnRQcm92aWRlcigoSnBhRmlsZSkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7CiAJCX0KIAkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBFbnRpdHlNYXBwaW5ncykgewogCQkJcmV0dXJuIG5ldyBFbnRpdHlNYXBwaW5nc0l0ZW1Db250ZW50UHJvdmlkZXIoKEVudGl0eU1hcHBpbmdzKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKIAkJfQotCQlyZXR1cm4gc3VwZXIuYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlcikgewotCQlyZXR1cm4gbmV3IE9ybVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlcigoT3JtUGVyc2lzdGVudFR5cGUpIHBlcnNpc3RlbnRUeXBlLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKKwkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBPcm1QZXJzaXN0ZW50VHlwZSkgeworCQkJcmV0dXJuIG5ldyBPcm1QZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIoKE9ybVBlcnNpc3RlbnRUeXBlKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKKwkJfQorCQlpZiAoaXRlbSBpbnN0YW5jZW9mIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKKwkJCXJldHVybiBuZXcgUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOworCQl9CisJCXJldHVybiBudWxsOwogCX0KIAkKIAlwdWJsaWMgc3RhdGljIGNsYXNzIEVudGl0eU1hcHBpbmdzSXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8T3JtUGVyc2lzdGVudFR5cGU+CkBAIC00OSw2ICs1MywxMCBAQAogCQkJc3VwZXIoZW50aXR5TWFwcGluZ3MsIGNvbnRlbnRQcm92aWRlcik7CiAJCX0KIAkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgRW50aXR5TWFwcGluZ3MgZ2V0TW9kZWwoKSB7CisJCQlyZXR1cm4gKEVudGl0eU1hcHBpbmdzKSBzdXBlci5nZXRNb2RlbCgpOworCQl9CiAJCQogCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7CkBAIC01OCwxNCArNjYsMTUgQEAKIAkJfQogCQkKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxPcm1QZXJzaXN0ZW50VHlwZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFbnRpdHlNYXBwaW5ncywgT3JtUGVyc2lzdGVudFR5cGU+KAotCQkJCQlFbnRpdHlNYXBwaW5ncy5QRVJTSVNURU5UX1RZUEVTX0xJU1QsIChFbnRpdHlNYXBwaW5ncykgbW9kZWwoKSkgeworCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8T3JtUGVyc2lzdGVudFR5cGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKKwkJCXJldHVybiBuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxPcm1QZXJzaXN0ZW50VHlwZT4oCisJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8RW50aXR5TWFwcGluZ3MsIE9ybVBlcnNpc3RlbnRUeXBlPigKKwkJCQkJRW50aXR5TWFwcGluZ3MuUEVSU0lTVEVOVF9UWVBFU19MSVNULCBnZXRNb2RlbCgpKSB7CiAJCQkJQE92ZXJyaWRlCiAJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3Qub3JtUGVyc2lzdGVudFR5cGVzKCk7CisJCQkJCXJldHVybiBzdWJqZWN0LnBlcnNpc3RlbnRUeXBlcygpOwogCQkJCX0KLQkJCX07CisJCQl9KTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9Pcm1JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9Pcm1JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQppbmRleCA1MzFmNTE1Li44NDI3MjhkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL09ybUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCkBAIC0xNiwxMSArMTYsMTIgQEAKIAogcHVibGljIGNsYXNzIE9ybUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBleHRlbmRzIEdlbmVyYWxKcGFNYXBwaW5nSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5CiB7CisJQE92ZXJyaWRlCiAJcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoCiAJCQlPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKIAkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBFbnRpdHlNYXBwaW5ncykgewogCQkJcmV0dXJuIG5ldyBFbnRpdHlNYXBwaW5nc0l0ZW1MYWJlbFByb3ZpZGVyKChFbnRpdHlNYXBwaW5ncykgaXRlbSwgbGFiZWxQcm92aWRlcik7CiAJCX0KLQkJZWxzZSByZXR1cm4gc3VwZXIuYnVpbGRJdGVtTGFiZWxQcm92aWRlcihpdGVtLCBsYWJlbFByb3ZpZGVyKTsKKwkJcmV0dXJuIHN1cGVyLmJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoaXRlbSwgbGFiZWxQcm92aWRlcik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCmluZGV4IDZiNzVhNzkuLmMwYWEzNzMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9Pcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwxNyArOSwzMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1SZXNvdXJjZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOwogCiBwdWJsaWMgY2xhc3MgT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyCi0JZXh0ZW5kcyBSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIKKwlpbXBsZW1lbnRzIEpwYVN0cnVjdHVyZVByb3ZpZGVyCiB7Ci0JcHVibGljIE9ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcihPcm1SZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwpIHsKLQkJc3VwZXIocmVzb3VyY2VNb2RlbCk7CisJLy8gc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhU3RydWN0dXJlUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CiAJfQogCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCQogCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewogCQlyZXR1cm4gbmV3IE9ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7CiAJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1BlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9QZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKaW5kZXggYWJjMzExOC4uMmUwMTJmZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1BlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDIzICsxMCwyOSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkphckZpbGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CiAKIHB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5CkBAIC0zNSw4ICs0MSw4IEBACiAJcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcigKIAkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKIAkJRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyID0gKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbCkgewotCQkJcmV0dXJuIG5ldyBSZXNvdXJjZU1vZGVsSXRlbUNvbnRlbnRQcm92aWRlcigoUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKKwkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBKcGFGaWxlKSB7CisJCQlyZXR1cm4gbmV3IFJlc291cmNlTW9kZWxJdGVtQ29udGVudFByb3ZpZGVyKChKcGFGaWxlKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKIAkJfQogCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVuY2UpIHsKIAkJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW5jZSkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7CkBAIC01MCw2ICs1Niw5IEBACiAJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDbGFzc1JlZikgewogCQkJcmV0dXJuIG5ldyBDbGFzc1JlZkl0ZW1Db250ZW50UHJvdmlkZXIoKENsYXNzUmVmKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsJCiAJCX0KKwkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEphckZpbGVSZWYpIHsKKwkJCXJldHVybiBuZXcgSmFyRmlsZVJlZkl0ZW1Db250ZW50UHJvdmlkZXIoKEphckZpbGVSZWYpIGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOworCQl9CiAJCXJldHVybiBudWxsOwogCX0KIAkKQEAgLTYyLDggKzcxLDggQEAKIAkJfQogCQkJCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgUGVyc2lzdGVuY2UgbW9kZWwoKSB7Ci0JCQlyZXR1cm4gKFBlcnNpc3RlbmNlKSBzdXBlci5tb2RlbCgpOworCQlwdWJsaWMgUGVyc2lzdGVuY2UgZ2V0TW9kZWwoKSB7CisJCQlyZXR1cm4gKFBlcnNpc3RlbmNlKSBzdXBlci5nZXRNb2RlbCgpOwogCQl9CiAJCQogCQlAT3ZlcnJpZGUKQEAgLTc0LDkgKzgzLDkgQEAKIAkJfQogCQkKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2UsIFBlcnNpc3RlbmNlVW5pdD4oCi0JCQkJCVBlcnNpc3RlbmNlLlBFUlNJU1RFTkNFX1VOSVRTX0xJU1QsIG1vZGVsKCkpIHsKKwkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgeworCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdD4oCisJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2UsIFBlcnNpc3RlbmNlVW5pdD4oUGVyc2lzdGVuY2UuUEVSU0lTVEVOQ0VfVU5JVFNfTElTVCwgZ2V0TW9kZWwoKSkgewogCQkJCUBPdmVycmlkZQogCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBsaXN0SXRlcmF0b3JfKCkgewogCQkJCQlyZXR1cm4gc3ViamVjdC5wZXJzaXN0ZW5jZVVuaXRzKCk7CkBAIC04NSw3ICs5NCw3IEBACiAJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKIAkJCQkJcmV0dXJuIHN1YmplY3QucGVyc2lzdGVuY2VVbml0c1NpemUoKTsKIAkJCQl9Ci0JCQl9OworCQkJfSk7CiAJCX0KIAl9CiAJCkBAIC05OCwyMSArMTA3LDIxIEBACiAJCX0KIAkJCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IG1vZGVsKCkgewotCQkJcmV0dXJuIChQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLm1vZGVsKCk7CisJCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0TW9kZWwoKSB7CisJCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0TW9kZWwoKTsKIAkJfQogCQkKIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBQZXJzaXN0ZW5jZSBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gbW9kZWwoKS5nZXRQYXJlbnQoKTsKKwkJCXJldHVybiBnZXRNb2RlbCgpLmdldFBhcmVudCgpOwogCQl9CiAJCQogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKKwkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKIAkJCUxpc3RWYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiBzcGVjaWZpZWRNYXBwaW5nRmlsZUx2bSA9IAogCQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIE1hcHBpbmdGaWxlUmVmPigKLQkJCQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRl9MSVNULAotCQkJCQkJbW9kZWwoKSkgeworCQkJCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9NQVBQSU5HX0ZJTEVfUkVGU19MSVNULAorCQkJCQkJZ2V0TW9kZWwoKSkgewogCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gbGlzdEl0ZXJhdG9yXygpIHsKIAkJCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpOwpAQCAtMTIzLDIxICsxMzIsMjEgQEAKIAkJCQkJfQogCQkJCX07CiAJCQkKLQkJCUxpc3RWYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiBpbXBsaWVkTWFwcGluZ0ZpbGVMdm0gPSAKKwkJCUxpc3RWYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiBpbXBsaWVkTWFwcGluZ0ZpbGVDdm0gPSAKIAkJCQluZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8TWFwcGluZ0ZpbGVSZWY+KAogCQkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgTWFwcGluZ0ZpbGVSZWY+KAogCQkJCQkJCVBlcnNpc3RlbmNlVW5pdC5JTVBMSUVEX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksCi0JCQkJCQkJbW9kZWwoKSkgeworCQkJCQkJCWdldE1vZGVsKCkpIHsKIAkJCQkJCUBPdmVycmlkZQogCQkJCQkJcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmIGJ1aWxkVmFsdWVfKCkgewogCQkJCQkJCXJldHVybiBzdWJqZWN0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpOwogCQkJCQkJfQogCQkJCQl9CiAJCQkJKTsKLQkJCUxpc3RWYWx1ZU1vZGVsPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc0x2bSA9IAorCQkJTGlzdFZhbHVlTW9kZWw8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzQ3ZtID0gCiAJCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgQ2xhc3NSZWY+KAotCQkJCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9DTEFTU19SRUZfTElTVCwKLQkJCQkJCW1vZGVsKCkpIHsKKwkJCQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfQ0xBU1NfUkVGU19MSVNULAorCQkJCQkJZ2V0TW9kZWwoKSkgewogCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxDbGFzc1JlZj4gbGlzdEl0ZXJhdG9yXygpIHsKIAkJCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZENsYXNzUmVmcygpOwpAQCAtMTQ3LDI2ICsxNTYsNDQgQEAKIAkJCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZENsYXNzUmVmc1NpemUoKTsKIAkJCQkJfQogCQkJCX07Ci0JCQlMaXN0VmFsdWVNb2RlbDxDbGFzc1JlZj4gaW1wbGllZENsYXNzTHZtID0gCi0JCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgQ2xhc3NSZWY+KAotCQkJCQkJUGVyc2lzdGVuY2VVbml0LklNUExJRURfQ0xBU1NfUkVGX0xJU1QsCi0JCQkJCQltb2RlbCgpKSB7CisJCQlMaXN0VmFsdWVNb2RlbDxDbGFzc1JlZj4gaW1wbGllZENsYXNzQ3ZtID0gCisJCQkJbmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Q2xhc3NSZWY+KAorCQkJCQluZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBDbGFzc1JlZj4oCisJCQkJCQkJUGVyc2lzdGVuY2VVbml0LklNUExJRURfQ0xBU1NfUkVGU19DT0xMRUNUSU9OLAorCQkJCQkJCWdldE1vZGVsKCkpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPENsYXNzUmVmPiBpdGVyYXRvcl8oKSB7CisJCQkJCQkJcmV0dXJuIHN1YmplY3QuaW1wbGllZENsYXNzUmVmcygpOworCQkJCQkJfQorCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgeworCQkJCQkJCXJldHVybiBzdWJqZWN0LmltcGxpZWRDbGFzc1JlZnNTaXplKCk7CisJCQkJCQl9CisJCQkJCX0pOworCQkJTGlzdFZhbHVlTW9kZWw8SmFyRmlsZVJlZj4gamFyRmlsZUN2bSA9CisJCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgSmFyRmlsZVJlZj4oCisJCQkJCQlQZXJzaXN0ZW5jZVVuaXQuSkFSX0ZJTEVfUkVGU19MSVNULAorCQkJCQkJZ2V0TW9kZWwoKSkgewogCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxDbGFzc1JlZj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmltcGxpZWRDbGFzc1JlZnMoKTsKKwkJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKYXJGaWxlUmVmPiBsaXN0SXRlcmF0b3JfKCkgeworCQkJCQkJcmV0dXJuIHN1YmplY3QuamFyRmlsZVJlZnMoKTsKIAkJCQkJfQogCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmltcGxpZWRDbGFzc1JlZnNTaXplKCk7CisJCQkJCQlyZXR1cm4gc3ViamVjdC5qYXJGaWxlUmVmc1NpemUoKTsKIAkJCQkJfQogCQkJCX07CiAJCQlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+Pig0KTsKIAkJCWxpc3QuYWRkKHNwZWNpZmllZE1hcHBpbmdGaWxlTHZtKTsKLQkJCWxpc3QuYWRkKGltcGxpZWRNYXBwaW5nRmlsZUx2bSk7Ci0JCQlsaXN0LmFkZChzcGVjaWZpZWRDbGFzc0x2bSk7Ci0JCQlsaXN0LmFkZChpbXBsaWVkQ2xhc3NMdm0pOworCQkJbGlzdC5hZGQoaW1wbGllZE1hcHBpbmdGaWxlQ3ZtKTsKKwkJCWxpc3QuYWRkKHNwZWNpZmllZENsYXNzQ3ZtKTsKKwkJCWxpc3QuYWRkKGltcGxpZWRDbGFzc0N2bSk7CisJCQlsaXN0LmFkZChqYXJGaWxlQ3ZtKTsKIAkJCQotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4sIEpwYVN0cnVjdHVyZU5vZGU+KGxpc3QpOworCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEpwYVN0cnVjdHVyZU5vZGU+KAorCQkJCW5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbAorCQkJCQk8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+LCBKcGFTdHJ1Y3R1cmVOb2RlPgorCQkJCQkJKGxpc3QpKTsKIAkJfQogCX0KIAkKQEAgLTE3OSw4ICsyMDYsMTMgQEAKIAkJfQogCQkKIAkJQE92ZXJyaWRlCisJCXB1YmxpYyBNYXBwaW5nRmlsZVJlZiBnZXRNb2RlbCgpIHsKKwkJCXJldHVybiAoTWFwcGluZ0ZpbGVSZWYpIHN1cGVyLmdldE1vZGVsKCk7CisJCX0KKwkJCisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCXJldHVybiAoKE1hcHBpbmdGaWxlUmVmKSBtb2RlbCgpKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJCXJldHVybiBnZXRNb2RlbCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpOwogCQl9CiAJCQogCQlAT3ZlcnJpZGUKQEAgLTE5OCw4ICsyMzAsMzcgQEAKIAkJfQogCQkKIAkJQE92ZXJyaWRlCisJCXB1YmxpYyBDbGFzc1JlZiBnZXRNb2RlbCgpIHsKKwkJCXJldHVybiAoQ2xhc3NSZWYpIHN1cGVyLmdldE1vZGVsKCk7CisJCX0KKwkJCisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCXJldHVybiAoKENsYXNzUmVmKSBtb2RlbCgpKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJCXJldHVybiBnZXRNb2RlbCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJCisJCisJcHVibGljIHN0YXRpYyBjbGFzcyBKYXJGaWxlUmVmSXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8SmFyRmlsZVJlZj4KKwl7CisJCXB1YmxpYyBKYXJGaWxlUmVmSXRlbUNvbnRlbnRQcm92aWRlcigKKwkJCQlKYXJGaWxlUmVmIGphckZpbGVSZWYsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7CisJCQlzdXBlcihqYXJGaWxlUmVmLCBjb250ZW50UHJvdmlkZXIpOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIEphckZpbGVSZWYgZ2V0TW9kZWwoKSB7CisJCQlyZXR1cm4gKEphckZpbGVSZWYpIHN1cGVyLmdldE1vZGVsKCk7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKKwkJCXJldHVybiBnZXRNb2RlbCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpOwogCQl9CiAJCQogCQlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9QZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1BlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKaW5kZXggMDgxOTZjZi4uNmEzNDk2YSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1BlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1BlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKQEAgLTEwLDEwICsxMCwxMiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkphckZpbGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkNsYXNzUmVmSXRlbUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuSmFyRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLk1hcHBpbmdGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5QZXJzaXN0ZW5jZVVuaXRJdGVtTGFiZWxQcm92aWRlcjsKQEAgLTM4LDYgKzQwLDkgQEAKIAkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENsYXNzUmVmKSB7CiAJCQlyZXR1cm4gbmV3IENsYXNzUmVmSXRlbUxhYmVsUHJvdmlkZXIoKENsYXNzUmVmKSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQogCQl9CisJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBKYXJGaWxlUmVmKSB7CisJCQlyZXR1cm4gbmV3IEphckZpbGVSZWZJdGVtTGFiZWxQcm92aWRlcigoSmFyRmlsZVJlZikgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOworCQl9CiAJCXJldHVybiBudWxsOwogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKaW5kZXggNGM5MGUwZi4uZDlkMTk0NSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwxNyArOSwzMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKIAogcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyCi0JZXh0ZW5kcyBSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIKKwlpbXBsZW1lbnRzIEpwYVN0cnVjdHVyZVByb3ZpZGVyCiB7Ci0JcHVibGljIFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyKFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7Ci0JCXN1cGVyKHJlc291cmNlTW9kZWwpOworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVN0cnVjdHVyZVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyKCk7CisJCisJCisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CiAJfQogCQorCQorCS8qKgorCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCisJICovCisJcHJpdmF0ZSBQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJCiAJcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBnZXRUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSB7CiAJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwogCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9SZXNvdXJjZU1vZGVsSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1Jlc291cmNlTW9kZWxJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggODRiNDk5OC4uZTlkZDcyOCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1Jlc291cmNlTW9kZWxJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1Jlc291cmNlTW9kZWxJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsMjYgKzEwLDIyIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5SZXNvdXJjZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKIAogcHVibGljIGNsYXNzIFJlc291cmNlTW9kZWxJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxKcGFTdHJ1Y3R1cmVOb2RlPgogewogCXB1YmxpYyBSZXNvdXJjZU1vZGVsSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCVJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCwgCisJCQlKcGFGaWxlIGpwYUZpbGUsIAogCQkJRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJc3VwZXIocmVzb3VyY2VNb2RlbCwgY29udGVudFByb3ZpZGVyKTsKKwkJc3VwZXIoanBhRmlsZSwgY29udGVudFByb3ZpZGVyKTsKIAl9CiAJCiAJQE92ZXJyaWRlCkBAIC0zOCwxNiArMzQsMTIgQEAKIAl9CiAJCiAJQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTW9kZWwgbW9kZWwoKSB7Ci0JCXJldHVybiAoUmVzb3VyY2VNb2RlbCkgc3VwZXIubW9kZWwoKTsKKwlwdWJsaWMgSnBhRmlsZSBnZXRNb2RlbCgpIHsKKwkJcmV0dXJuIChKcGFGaWxlKSBzdXBlci5nZXRNb2RlbCgpOwogCX0KIAkKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8SnBhU3RydWN0dXJlTm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnBhU3RydWN0dXJlTm9kZT4oYnVpbGRDaGlsZHJlbkNvbGxlY3Rpb25Nb2RlbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8SnBhU3RydWN0dXJlTm9kZT4gYnVpbGRDaGlsZHJlbkNvbGxlY3Rpb25Nb2RlbCgpIHsKKwlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8SnBhU3RydWN0dXJlTm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewogCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPEpwYUZpbGUsIEpwYVN0cnVjdHVyZU5vZGU+KAogCQkJYnVpbGRKcGFGaWxlVmFsdWVNb2RlbCgpLCBKcGFGaWxlLlJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04pIHsKIAkJCUBPdmVycmlkZQpAQCAtNTgsMTIgKzUwLDYgQEAKIAl9CiAJCiAJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxKcGFGaWxlPiBidWlsZEpwYUZpbGVWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFJlc291cmNlTW9kZWwsIEpwYUZpbGU+KAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxSZXNvdXJjZU1vZGVsPihtb2RlbCgpKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBKcGFGaWxlIHRyYW5zZm9ybV8oUmVzb3VyY2VNb2RlbCB2YWx1ZSkgewotCQkJCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKHZhbHVlLmdldEZpbGUoKSk7Ci0JCQkJfQotCQl9OworCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKcGFGaWxlPih0aGlzLmdldE1vZGVsKCkpOwogCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYzJlNTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1Jlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyCi0JaW1wbGVtZW50cyBKcGFTdHJ1Y3R1cmVQcm92aWRlcgotewotCXByb3RlY3RlZCBSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWw7Ci0JCi0JCi0JcHVibGljIFJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcihSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwpIHsKLQkJdGhpcy5yZXNvdXJjZU1vZGVsID0gcmVzb3VyY2VNb2RlbDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRJbnB1dCgpIHsKLQkJcmV0dXJuIHJlc291cmNlTW9kZWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0Fic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLmphdmEKaW5kZXggY2VkOTg0Zi4uNmIwNTUwMSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0Fic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMTcgKzksMjIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3Q7CiAKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwpAQCAtMTAyLDEyICsxMDcsMTQgQEAKIAkvKioKIAkgKiBDbGllbnRzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gc2VsZWN0aW9uIGNoYW5nZSBldmVudHMuCiAJICovCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+W10gc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzOworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByb3RlY3RlZCBmaW5hbCBMaXN0ZW5lckxpc3Q8U2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdDsKIAogCS8qKgogCSAqIENsaWVudHMgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiBkb3VibGUgY2xpY2sgZXZlbnRzLgogCSAqLwotCXByb3RlY3RlZCBEb3VibGVDbGlja0xpc3RlbmVyPEU+W10gZG91YmxlQ2xpY2tMaXN0ZW5lcnM7CisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPiBkb3VibGVDbGlja0xpc3RlbmVyTGlzdDsKIAogCS8qKgogCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgY29tYm8KQEAgLTE1NSw4ICsxNjIsOCBAQAogCQkJdGhpcy5jb21ib0hvbGRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmNvbWJvU2VsZWN0aW9uTGlzdGVuZXIpOwogCQl9CiAKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lcnMgPSB0aGlzLmJ1aWxkRG91YmxlQ2xpY2tMaXN0ZW5lcnMoKTsKKwkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QgPSB0aGlzLmJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0KCk7CisJCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QgPSB0aGlzLmJ1aWxkRG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QoKTsKIAogCQl0aGlzLmNvbWJvRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZENvbWJvRGlzcG9zZUxpc3RlbmVyKCk7CiAJCXRoaXMuY29tYm9Ib2xkZXIuYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMuY29tYm9EaXNwb3NlTGlzdGVuZXIpOwpAQCAtMTczLDE5ICsxODAsMTkgQEAKIAogCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewogCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewogCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNBZGRlZChldmVudCk7CiAJCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7CiAJCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc1JlbW92ZWQoZXZlbnQpOwogCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewogCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNNb3ZlZChldmVudCk7CiAJCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgeworCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7CiAJCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc1JlcGxhY2VkKGV2ZW50KTsKIAkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgeworCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKIAkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwogCQkJfQogCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CkBAIC0yMzgsMTMgKzI0NSwxMyBAQAogCX0KIAogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBEb3VibGVDbGlja0xpc3RlbmVyPEU+W10gYnVpbGREb3VibGVDbGlja0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIG5ldyBEb3VibGVDbGlja0xpc3RlbmVyWzBdOworCXByb3RlY3RlZCBMaXN0ZW5lckxpc3Q8RG91YmxlQ2xpY2tMaXN0ZW5lcj4gYnVpbGREb3VibGVDbGlja0xpc3RlbmVyTGlzdCgpIHsKKwkJcmV0dXJuIG5ldyBMaXN0ZW5lckxpc3Q8RG91YmxlQ2xpY2tMaXN0ZW5lcj4oRG91YmxlQ2xpY2tMaXN0ZW5lci5jbGFzcyk7CiAJfQogCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+W10gYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJbMF07CisJcHJvdGVjdGVkIExpc3RlbmVyTGlzdDxTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QoKSB7CisJCXJldHVybiBuZXcgTGlzdGVuZXJMaXN0PFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPihTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzcyk7CiAJfQogCiAJcHJvdGVjdGVkIERpc3Bvc2VMaXN0ZW5lciBidWlsZENvbWJvRGlzcG9zZUxpc3RlbmVyKCkgewpAQCAtMzA5LDcgKzMxNiw3IEBACiAJLyoqCiAJICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGNvbWJvLgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgeworCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewogCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKIAkJCXJldHVybjsKIAkJfQpAQCAtMzE3LDQ0ICszMjQsNDIgQEAKIAkJaW50IGNvdW50ID0gdGhpcy5jb21ib0hvbGRlci5nZXRJdGVtQ291bnQoKTsKIAkJaW50IGluZGV4ID0gZXZlbnQuZ2V0SW5kZXgoKTsKIAotCQlmb3IgKExpc3RJdGVyYXRvcjxFPiBzdHJlYW0gPSB0aGlzLml0ZW1zKGV2ZW50KTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLmFkZCh0aGlzLmNvbnZlcnQoc3RyZWFtLm5leHQoKSksIGluZGV4KyspOworCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7CisJCQl0aGlzLmNvbWJvSG9sZGVyLmFkZCh0aGlzLmNvbnZlcnQoaXRlbSksIGluZGV4KyspOwogCQl9CiAKIAkJLy8gV2hlbiB0aGUgY29tYm8gaXMgcG9wdWxhdGVkLCBpdCdzIHBvc3NpYmxlIHRoZSBzZWxlY3Rpb24gd2FzIGFscmVhZHkKIAkJLy8gc2V0IGJ1dCBubyBpdGVtcyB3YXMgZm91bmQsIHJlc3luYyB0aGUgc2VsZWN0ZWQgaXRlbQotCQlpZiAoY291bnQgPT0gMCkgewotCQkJc3luY2hyb25pemVDb21ib1NlbGVjdGlvbigpOwotCQl9CisJCXN5bmNocm9uaXplQ29tYm9TZWxlY3Rpb24oKTsKIAl9CiAKIAkvKioKIAkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgY29tYm8uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewogCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKIAkJCXJldHVybjsKIAkJfQotCQl0aGlzLmNvbWJvSG9sZGVyLnJlbW92ZShldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJbmRleCgpICsgZXZlbnQuaXRlbXNTaXplKCkgLSAxKTsKKwkJdGhpcy5jb21ib0hvbGRlci5yZW1vdmUoZXZlbnQuZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0SW5kZXgoKSArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpIC0gMSk7CiAJCXRoaXMuc3luY2hyb25pemVDb21ib1NlbGVjdGlvbigpOwogCX0KIAogCS8qKgogCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb21iby4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7CiAJCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRGlzcG9zZWQoKSkgewogCQkJcmV0dXJuOwogCQl9CiAJCWludCB0YXJnZXQgPSBldmVudC5nZXRUYXJnZXRJbmRleCgpOwogCQlpbnQgc291cmNlID0gZXZlbnQuZ2V0U291cmNlSW5kZXgoKTsKLQkJaW50IGxlbiA9IGV2ZW50LmdldE1vdmVMZW5ndGgoKTsKKwkJaW50IGxlbiA9IGV2ZW50LmdldExlbmd0aCgpOwogCQlpbnQgbG9TdGFydCA9IE1hdGgubWluKHRhcmdldCwgc291cmNlKTsKIAkJaW50IGhpU3RhcnQgPSBNYXRoLm1heCh0YXJnZXQsIHNvdXJjZSk7CiAJCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBhZmZlY3RlZCBpdGVtcy4uLgotCQlTdHJpbmdbXSBzdWJBcnJheSA9IENvbGxlY3Rpb25Ub29scy5zdWJBcnJheSh0aGlzLmNvbWJvSG9sZGVyLmdldEl0ZW1zKCksIGxvU3RhcnQsIGhpU3RhcnQgKyBsZW4gLSBsb1N0YXJ0KTsKKwkJU3RyaW5nW10gc3ViQXJyYXkgPSBBcnJheVRvb2xzLnN1YkFycmF5KHRoaXMuY29tYm9Ib2xkZXIuZ2V0SXRlbXMoKSwgbG9TdGFydCwgaGlTdGFydCArIGxlbiAtIGxvU3RhcnQpOwogCQkvLyAuLi5tb3ZlIHRoZW0gYXJvdW5kLi4uCi0JCXN1YkFycmF5ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoc3ViQXJyYXksIHRhcmdldCAtIGxvU3RhcnQsIHNvdXJjZSAtIGxvU3RhcnQsIGxlbik7CisJCXN1YkFycmF5ID0gQXJyYXlUb29scy5tb3ZlKHN1YkFycmF5LCB0YXJnZXQgLSBsb1N0YXJ0LCBzb3VyY2UgLSBsb1N0YXJ0LCBsZW4pOwogCQkvLyAuLi5hbmQgdGhlbiBwdXQgdGhlbSBiYWNrCiAJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzdWJBcnJheS5sZW5ndGg7IGluZGV4KyspIHsKIAkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0SXRlbShsb1N0YXJ0ICsgaW5kZXgsIHN1YkFycmF5W2luZGV4XSk7CkBAIC0zNjQsMjAgKzM2OSwzMSBAQAogCS8qKgogCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb21iby4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7CiAJCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRGlzcG9zZWQoKSkgewogCQkJcmV0dXJuOwogCQl9CiAJCWludCBpbmRleCA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPEU+IHN0cmVhbSA9IHRoaXMuaXRlbXMoZXZlbnQpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0SXRlbShpbmRleCsrLCB0aGlzLmNvbnZlcnQoc3RyZWFtLm5leHQoKSkpOworCQlpbnQgc2VsZWN0aW9uSW5kZXggPSB0aGlzLmNvbWJvSG9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCk7CisJCWZvciAoRSBpdGVtIDogdGhpcy5nZXROZXdJdGVtcyhldmVudCkpIHsKKwkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0SXRlbShpbmRleCsrLCB0aGlzLmNvbnZlcnQoaXRlbSkpOworCQl9CisJCWlmIChzZWxlY3Rpb25JbmRleCA9PSAwKSB7CisJCQkvL2ZpeGluZyBidWcgMjY5MTAwIGJ5IHNldHRpbmcgdGhlIHBvcHVsYXRpbmcgZmxhZyB0byB0cnVlCisJCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcodHJ1ZSk7CisJCQl0cnkgeworCQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0VGV4dCh0aGlzLmNvbWJvSG9sZGVyLmdldEl0ZW1zKClbMF0pOworCQkJfQorCQkJZmluYWxseSB7CisJCQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKGZhbHNlKTsKKwkJCX0KIAkJfQogCX0KIAogCS8qKgogCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb21iby4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewogCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKIAkJCXJldHVybjsKIAkJfQpAQCAtMzkxLDEwICs0MDcsMTYgQEAKIAkJdGhpcy5zeW5jaHJvbml6ZUNvbWJvSXRlbXMoKTsKIAl9CiAKLQkvLyBtaW5pbWl6ZWQgdW5jaGVja2VkIGNvZGUKKwkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gaXRlbXMoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoKExpc3RJdGVyYXRvcjxFPikgZXZlbnQuaXRlbXMoKSk7CisJcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgeworCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOworCX0KKworCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldE5ld0l0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKKwkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0TmV3SXRlbXMoKTsKIAl9CiAKIApAQCAtNDE2LDggKzQzOCwxMSBAQAogCQl9CiAKIAkJRSBzZWxlY3RlZFZhbHVlID0gdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuZ2V0VmFsdWUoKTsKKwkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuZ2V0VGV4dCgpLmVxdWFscyhzZWxlY3RlZFZhbHVlKSkgeworCQkJLy9pZiB0aGUgc2VsZWN0aW9uIGlzIHN0aWxsIHRoZSBzYW1lLCBkb24ndCByZXNldCBpdAorCQkJcmV0dXJuOworCQl9CiAJCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyh0cnVlKTsKLQogCQl0cnkgewogCQkJdGhpcy5jb21ib0hvbGRlci5kZXNlbGVjdEFsbCgpOwogCQkJU3RyaW5nIHNlbGVjdGVkSXRlbSA9IHRoaXMuY29udmVydChzZWxlY3RlZFZhbHVlKTsKQEAgLTQzNiwxMyArNDYxLDYgQEAKIAkJdGhpcy5zeW5jaHJvbml6ZUNvbWJvU2VsZWN0aW9uKCk7CiAJfQogCi0JLy8gbWluaW1pemVkIHVuY2hlY2tlZCBjb2RlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IGl0ZW1zKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKChJdGVyYXRvcjxFPikgZXZlbnQuaXRlbXMoKSk7Ci0JfQotCi0KIAkvKioKIAkgKiBSZXR1cm4gd2hldGhlciB0aGUgdmFsdWVzIGFyZSBlcXVhbCwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVsbCBjaGVja3MuCiAJICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgY2hhbmdlZC4KQEAgLTQ4Miw5ICs1MDAsOSBAQAogCX0KIAogCXByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoRSBzZWxlY3RlZEl0ZW0pIHsKLQkJaWYgKHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLmxlbmd0aCA+IDApIHsKKwkJaWYgKHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0LnNpemUoKSA+IDApIHsKIAkJCVNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+IHNjRXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RT4odGhpcywgc2VsZWN0ZWRJdGVtKTsKLQkJCWZvciAoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgOiB0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycykgeworCQkJZm9yIChTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA6IHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7CiAJCQkJc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChzY0V2ZW50KTsKIAkJCX0KIAkJfQpAQCAtNTM1LDExICs1NTMsMTEgQEAKIAkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7CiAJCQlyZXR1cm47CiAJCX0KLQkJaWYgKHRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lcnMubGVuZ3RoID4gMCkgeworCQlpZiAodGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdC5zaXplKCkgPiAwKSB7CiAJCQkvLyB0aGVyZSBzaG91bGQgYmUgb25seSBhIHNpbmdsZSBpdGVtIHNlbGVjdGVkIGR1cmluZyBhIGRvdWJsZS1jbGljayg/KQogCQkJRSBzZWxlY3Rpb24gPSB0aGlzLmxpc3RIb2xkZXIuZ2V0KHRoaXMuY29tYm9Ib2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7CiAJCQlEb3VibGVDbGlja0V2ZW50PEU+IGRjRXZlbnQgPSBuZXcgRG91YmxlQ2xpY2tFdmVudDxFPih0aGlzLCBzZWxlY3Rpb24pOwotCQkJZm9yIChEb3VibGVDbGlja0xpc3RlbmVyPEU+IGRvdWJsZUNsaWNrTGlzdGVuZXIgOiB0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJzKSB7CisJCQlmb3IgKERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gZG91YmxlQ2xpY2tMaXN0ZW5lciA6IHRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKIAkJCQlkb3VibGVDbGlja0xpc3RlbmVyLmRvdWJsZUNsaWNrKGRjRXZlbnQpOwogCQkJfQogCQl9CkBAIC01NzQsMTQgKzU5MiwxNCBAQAogCS8vICoqKioqKioqKiogZG91YmxlIGNsaWNrIHN1cHBvcnQgKioqKioqKioqKgogCiAJcHVibGljIHZvaWQgYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihEb3VibGVDbGlja0xpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lcnMgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKHRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lcnMsIGxpc3RlbmVyKTsKKwkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwogCX0KIAogCXB1YmxpYyB2b2lkIHJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJzID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZSh0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJzLCBsaXN0ZW5lcik7CisJCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKIAl9CiAKLQlwdWJsaWMgaW50ZXJmYWNlIERvdWJsZUNsaWNrTGlzdGVuZXI8RT4geworCXB1YmxpYyBpbnRlcmZhY2UgRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCQl2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQ8RT4gZXZlbnQpOwogCX0KIApAQCAtNjEyLDE0ICs2MzAsMTQgQEAKIAkvLyAqKioqKioqKioqIHNlbGVjdGlvbiBzdXBwb3J0ICoqKioqKioqKioKIAogCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzID0gQ29sbGVjdGlvblRvb2xzLmFkZCh0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycywgbGlzdGVuZXIpOworCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwogCX0KIAogCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZSh0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycywgbGlzdGVuZXIpOworCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwogCX0KIAotCXB1YmxpYyBpbnRlcmZhY2UgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4geworCXB1YmxpYyBpbnRlcmZhY2UgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKIAkJdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+IGV2ZW50KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9Cb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvQm9vbGVhbkJ1dHRvbk1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmQwZmZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9Cb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBjYW4gYmUgdXNlZCB0byBrZWVwIGEgY2hlY2sgYm94IG9yIHRvZ2dsZSBidXR0b24gaW4gc3luY2ggd2l0aAotICogYSBtb2RlbCBib29sZWFuLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBCb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyIHsKLQotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGJvb2xlYW4uICovCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBidXR0b24ncyBzZWxlY3Rpb24gc3RhdGUgd2l0aAotCSAqIHRoZSBtb2RlbCBib29sZWFuLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJvb2xlYW5DaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKiBUaGUgY2hlY2sgYm94L3RvZ2dsZSBidXR0b24gd2Ugc3luY2hyb25pemUgd2l0aCB0aGUgbW9kZWwgYm9vbGVhbi4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGJ1dHRvbjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIG1vZGVsIGJvb2xlYW4gd2l0aAotCSAqIHRoZSBidXR0b24ncyBzZWxlY3Rpb24gc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNlbGVjdGlvbkxpc3RlbmVyIGJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSBidXR0b24KLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHRoZSBjaGVjayBib3gvdG9nZ2xlIGJ1dHRvbjsgZm9yIHdoZW4gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbCBpcyBudWxsLgotCSAqIFRoZSBkZWZhdWx0IFtkZWZhdWx0IHZhbHVlXSBpcyBmYWxzZSAoaS5lLiB0aGUgYnV0dG9uIGlzIGNoZWNrZWQvcG9wcGVkIG91dCkuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZGVmYXVsdFZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgYm9vbGVhbiB0byB0aGUgc3BlY2lmaWVkIGJ1dHRvbi4KLQkgKiBJZiB0aGUgYm9vbGVhbiBpcyBudWxsLCB0aGUgYnV0dG9uJ3MgdmFsdWUgd2lsbCBiZSAidW5zZWxlY3RlZCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyIGFkYXB0KFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIEJ1dHRvbiBidXR0b24pIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyKGJvb2xlYW5Ib2xkZXIsIGJ1dHRvbik7Ci0JfQotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBib29sZWFuIHRvIHRoZSBzcGVjaWZpZWQgYnV0dG9uLgotCSAqIElmIHRoZSBib29sZWFuIGlzIG51bGwsIHRoZSBidXR0b24ncyB2YWx1ZSB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXIgYWRhcHQoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwgQnV0dG9uIGJ1dHRvbiwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyKGJvb2xlYW5Ib2xkZXIsIGJ1dHRvbiwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGFuZCBidXR0b24gYXJlIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwgQnV0dG9uIGJ1dHRvbikgewotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIGJ1dHRvbiwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGFuZCBidXR0b24gYXJlIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIEJ1dHRvbiBidXR0b24sIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgoYm9vbGVhbkhvbGRlciA9PSBudWxsKSB8fCAoYnV0dG9uID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmJvb2xlYW5Ib2xkZXIgPSBib29sZWFuSG9sZGVyOwotCQl0aGlzLmJ1dHRvbiA9IGJ1dHRvbjsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0KLQkJdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuYnV0dG9uRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZEJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcigpOwotCQl0aGlzLmJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy5idXR0b25EaXNwb3NlTGlzdGVuZXIpOwotCi0JCXRoaXMuYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJdGhpcy5zZXRCdXR0b25TZWxlY3Rpb24odGhpcy5ib29sZWFuSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQm9vbGVhbkJ1dHRvbk1vZGVsQWRhcHRlci50aGlzLmJvb2xlYW5DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImJvb2xlYW4gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQm9vbGVhbkJ1dHRvbk1vZGVsQWRhcHRlci50aGlzLmJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLQkJCX0KLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImJ1dHRvbiBzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgYnVpbGRCdXR0b25EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQm9vbGVhbkJ1dHRvbk1vZGVsQWRhcHRlci50aGlzLmJ1dHRvbkRpc3Bvc2VkKGV2ZW50KTsKLQkJCX0KLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImJ1dHRvbiBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGJ1dHRvbi4KLQkgKiBJZiB0aGUgbmV3IG1vZGVsIHZhbHVlIGlzIG51bGwsIHVzZSB0aGUgYWRhcHRlcidzIGRlZmF1bHQgdmFsdWUKLQkgKiAod2hpY2ggaXMgdHlwaWNhbGx5IGZhbHNlKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBib29sZWFuQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2V0QnV0dG9uU2VsZWN0aW9uKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCdXR0b25TZWxlY3Rpb24oQm9vbGVhbiBiKSB7Ci0JCWlmICh0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmJ1dHRvbi5zZXRTZWxlY3Rpb24odGhpcy5ib29sZWFuVmFsdWUoYikpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJvb2xlYW5WYWx1ZShCb29sZWFuIGIpIHsKLQkJcmV0dXJuIChiICE9IG51bGwpID8gYi5ib29sZWFuVmFsdWUoKSA6IHRoaXMuZGVmYXVsdFZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogVGhlIGJ1dHRvbiBoYXMgYmVlbiAic2VsZWN0ZWQiIC0gc3luY2hyb25pemUgdGhlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoQm9vbGVhbi52YWx1ZU9mKHRoaXMuYnV0dG9uLmdldFNlbGVjdGlvbigpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpc3Bvc2UgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uRGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSBidXR0b24gaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50Ci0JCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycwotCQl0aGlzLmJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy5idXR0b24ucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMuYnV0dG9uRGlzcG9zZUxpc3RlbmVyKTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5ib29sZWFuSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9Db21ib01vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyLmphdmEKaW5kZXggOTY0Nzg4Yi4uM2I3OTU1NiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0RhdGVUaW1lTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvRGF0ZVRpbWVNb2RlbEFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTA0NDRmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0RhdGVUaW1lTW9kZWxBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwzNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EYXRlVGltZTsKKworLyoqCisgKiBUaGlzIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIERhdGVUaW1lIHdpZGdldCBpbiBzeW5jaCB3aXRoCisgKiBtb2RlbCBpbnRlZ2VycyBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMuICBIYXMgZGVmYXVsdCBob3VycywKKyAqIG1pbnV0ZXMgYW5kIHNlY29uZHMgb2YgMCB3aGljaCBjb3JyZXNwb25kcyB0byAxMjowMDowMCBBTS4gVGhpcyBtb2RlbAorICogYWRhcHRlciBjYW4gb25seSBiZSB1c2VkIGZvciBhIERhdGVUaW1lIHdpZGdldCB3aXRoIHRoZSBzdHlsZSBTV1QuVElNRQorICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBEYXRlVGltZU1vZGVsQWRhcHRlciB7CisKKwkvKioKKwkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGhvdXJzIGludGVnZXIuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGhvdXJzSG9sZGVyOworCQorCS8qKgorCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgbWludXRlcyBpbnRlZ2VyLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBtaW51dGVzSG9sZGVyOworCQorCS8qKgorCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgc2Vjb25kcyBpbnRlZ2VyLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBzZWNvbmRzSG9sZGVyOworCisJLyoqCisJICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgZGF0ZVRpbWUncyBzZWxlY3Rpb24gc3RhdGUgd2l0aAorCSAqIHRoZSBtb2RlbCBob3VycyBpbnRlZ2VyLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKKwkKKwkvKioKKwkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBkYXRlVGltZSdzIHNlbGVjdGlvbiBzdGF0ZSB3aXRoCisJICogdGhlIG1vZGVsIG1pbnV0ZXMgaW50ZWdlci4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBtaW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKKwkKKwkvKioKKwkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBkYXRlVGltZSdzIHNlbGVjdGlvbiBzdGF0ZSB3aXRoCisJICogdGhlIG1vZGVsIHNlY29uZHMgaW50ZWdlci4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzZWNvbmRzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKKworCS8qKgorCSAqIFRoZSBkYXRlVGltZSB3ZSBrZWVwIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCBpbnRlZ2Vycy4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgRGF0ZVRpbWUgZGF0ZVRpbWU7CisKKwkvKioKKwkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIG91ciBzZWxlY3Rpb24gbnVtYmVyIGhvbGRlcgorCSAqIHdpdGggdGhlIHNwaW5uZXIncyB2YWx1ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgU2VsZWN0aW9uTGlzdGVuZXIgZGF0ZVRpbWVTZWxlY3Rpb25MaXN0ZW5lcjsKKworCS8qKgorCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgZGF0ZVRpbWUKKwkgKiBpcyBkaXNwb3NlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGRhdGVUaW1lRGlzcG9zZUxpc3RlbmVyOworCisJLyoqCisJICogVGhpcyBsb2NrIGlzIHVzZWQgdG8gcHJldmVudCB0aGUgbGlzdGVuZXJzIHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHZhbHVlCisJICogY2hhbmdlcyBmcm9tIHRoZSBzcGlubmVyIG9yIGZyb20gdGhlIGhvbGRlci4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gbG9ja2VkOworCisJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCisKKwkvKioKKwkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIG1vZGVsIGludGVnZXIgaG9sZGVycyB0byB0aGUgc3BlY2lmaWVkIGRhdGVUaW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRGF0ZVRpbWVNb2RlbEFkYXB0ZXIgYWRhcHQoCisJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBob3Vyc0hvbGRlciwKKwkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG1pbnV0ZXNIb2xkZXIsCisJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBzZWNvbmRzSG9sZGVyLAorCQkJRGF0ZVRpbWUgZGF0ZVRpbWUpCisJeworCQlyZXR1cm4gbmV3IERhdGVUaW1lTW9kZWxBZGFwdGVyKGhvdXJzSG9sZGVyLCBtaW51dGVzSG9sZGVyLCBzZWNvbmRzSG9sZGVyLCBkYXRlVGltZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciAtIHRoZSBob3Vyc0hvbGRlciwgbWludXRlc0hvbGRlciwgc2Vjb25kc0hvbGRlciwgYW5kIGRhdGVUaW1lIGFyZSByZXF1aXJlZAorCSAqLworCXByb3RlY3RlZCBEYXRlVGltZU1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBob3Vyc0hvbGRlciwKKwkJCQkJCQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG1pbnV0ZXNIb2xkZXIsCisJCQkJCQkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBzZWNvbmRzSG9sZGVyLAorCQkJCQkJCQkJRGF0ZVRpbWUgZGF0ZVRpbWUpIHsKKwkJc3VwZXIoKTsKKwkJaWYgKChob3Vyc0hvbGRlciA9PSBudWxsKSAKKwkJCXx8IChtaW51dGVzSG9sZGVyID09IG51bGwpIAorCQkJfHwgKHNlY29uZHNIb2xkZXIgPT0gbnVsbCkgCisJCQl8fCAoZGF0ZVRpbWUgPT0gbnVsbCkpIHsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMuaG91cnNIb2xkZXIgPSBob3Vyc0hvbGRlcjsKKwkJdGhpcy5taW51dGVzSG9sZGVyID0gbWludXRlc0hvbGRlcjsKKwkJdGhpcy5zZWNvbmRzSG9sZGVyID0gc2Vjb25kc0hvbGRlcjsKKwkJdGhpcy5kYXRlVGltZSA9IGRhdGVUaW1lOworCisJCXRoaXMuaG91cnNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOworCQl0aGlzLmhvdXJzSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisKKwkJdGhpcy5taW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRNaW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOworCQl0aGlzLm1pbnV0ZXNIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubWludXRlc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCisJCXRoaXMuc2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKKwkJdGhpcy5zZWNvbmRzSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNlY29uZHNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJCisJCXRoaXMuZGF0ZVRpbWVTZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGREYXRlVGltZVNlbGVjdGlvbkxpc3RlbmVyKCk7CisJCXRoaXMuZGF0ZVRpbWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5kYXRlVGltZVNlbGVjdGlvbkxpc3RlbmVyKTsKKworCQl0aGlzLmRhdGVUaW1lRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZERhdGVUaW1lRGlzcG9zZUxpc3RlbmVyKCk7CisJCXRoaXMuZGF0ZVRpbWUuYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMuZGF0ZVRpbWVEaXNwb3NlTGlzdGVuZXIpOworCisJCXRoaXMudXBkYXRlRGF0ZVRpbWVIb3Vycyhob3Vyc0hvbGRlci5nZXRWYWx1ZSgpKTsKKwkJdGhpcy51cGRhdGVEYXRlVGltZU1pbnV0ZXMobWludXRlc0hvbGRlci5nZXRWYWx1ZSgpKTsKKwkJdGhpcy51cGRhdGVEYXRlVGltZVNlY29uZHMoc2Vjb25kc0hvbGRlci5nZXRWYWx1ZSgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRIb3Vyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZEhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSk7CisJfQorCisJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRIb3Vyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCURhdGVUaW1lTW9kZWxBZGFwdGVyLnRoaXMuaG91cnNDaGFuZ2VkKGV2ZW50KTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gImRhdGVUaW1lIGhvdXJzIGxpc3RlbmVyIjsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRNaW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTWludXRlc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkpOworCX0KKworCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTWludXRlc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCURhdGVUaW1lTW9kZWxBZGFwdGVyLnRoaXMubWludXRlc0NoYW5nZWQoZXZlbnQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiZGF0ZVRpbWUgbWludXRlcyBsaXN0ZW5lciI7CisJCQl9CisJCX07CisJfQorCQorCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFNlY29uZHNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpKTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlY29uZHNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQlEYXRlVGltZU1vZGVsQWRhcHRlci50aGlzLnNlY29uZHNDaGFuZ2VkKGV2ZW50KTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gImRhdGVUaW1lIHNlY29uZHMgbGlzdGVuZXIiOworCQkJfQorCQl9OworCX0KKworCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZERhdGVUaW1lU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJRGF0ZVRpbWVNb2RlbEFkYXB0ZXIudGhpcy5kYXRlVGltZVNlbGVjdGVkKGUpOworCQkJfQorCQkJCisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewkJCQkKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiZGF0ZVRpbWUgc2VsZWN0aW9uIGxpc3RlbmVyIjsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcm90ZWN0ZWQgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkRGF0ZVRpbWVEaXNwb3NlTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7CisJCQkJRGF0ZVRpbWVNb2RlbEFkYXB0ZXIudGhpcy5kYXRlVGltZURpc3Bvc2VkKGV2ZW50KTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gImRhdGVUaW1lIGRpc3Bvc2UgbGlzdGVuZXIiOworCQkJfQorCQl9OworCX0KKworCisJLy8gKioqKioqKioqKiBtb2RlbCBldmVudHMgKioqKioqKioqKgorCisJcHJvdGVjdGVkIHZvaWQgaG91cnNDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJaWYgKCF0aGlzLmxvY2tlZCkgeworCQkJdGhpcy51cGRhdGVEYXRlVGltZUhvdXJzKChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIG1pbnV0ZXNDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJaWYgKCF0aGlzLmxvY2tlZCkgeworCQkJdGhpcy51cGRhdGVEYXRlVGltZU1pbnV0ZXMoKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2Vjb25kc0NoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQlpZiAoIXRoaXMubG9ja2VkKSB7CisJCQl0aGlzLnVwZGF0ZURhdGVUaW1lU2Vjb25kcygoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7CisJCX0KKwl9CisKKwkvLyAqKioqKioqKioqIGRhdGVUaW1lIGV2ZW50cyAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgdm9pZCBkYXRlVGltZVNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCWlmICghdGhpcy5sb2NrZWQpIHsKKwkJCXRoaXMubG9ja2VkID0gdHJ1ZTsKKwkJCXRyeSB7CisJCQkJLy90b28gYmFkIHRoZXkgZGlkbid0IHNwbGl0IHRoZSBldmVudCB1cAorCQkJCWhvdXJzU2VsZWN0ZWQoKTsKKwkJCQltaW51dGVzU2VsZWN0ZWQoKTsKKwkJCQlzZWNvbmRzU2VsZWN0ZWQoKTsKKwkJCX0KKwkJCWZpbmFsbHkgeworCQkJCXRoaXMubG9ja2VkID0gZmFsc2U7CisJCQl9CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaG91cnNTZWxlY3RlZCgpIHsKKwkJSW50ZWdlciBob3VycyA9IG51bGw7CisJCWlmICh0aGlzLmRhdGVUaW1lLmdldEhvdXJzKCkgIT0gMCkgeworCQkJaG91cnMgPSBJbnRlZ2VyLnZhbHVlT2YodGhpcy5kYXRlVGltZS5nZXRIb3VycygpKTsKKwkJfQorCQl0aGlzLmhvdXJzSG9sZGVyLnNldFZhbHVlKGhvdXJzKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgbWludXRlc1NlbGVjdGVkKCkgeworCQlJbnRlZ2VyIG1pbnV0ZXMgPSBudWxsOworCQlpZiAodGhpcy5kYXRlVGltZS5nZXRNaW51dGVzKCkgIT0gMCkgeworCQkJbWludXRlcyA9IEludGVnZXIudmFsdWVPZih0aGlzLmRhdGVUaW1lLmdldE1pbnV0ZXMoKSk7CisJCX0KKwkJdGhpcy5taW51dGVzSG9sZGVyLnNldFZhbHVlKG1pbnV0ZXMpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZWNvbmRzU2VsZWN0ZWQoKSB7CisJCUludGVnZXIgc2Vjb25kcyA9IG51bGw7CisJCWlmICh0aGlzLmRhdGVUaW1lLmdldFNlY29uZHMoKSAhPSAwKSB7CisJCQlzZWNvbmRzID0gSW50ZWdlci52YWx1ZU9mKHRoaXMuZGF0ZVRpbWUuZ2V0U2Vjb25kcygpKTsKKwkJfQorCQl0aGlzLnNlY29uZHNIb2xkZXIuc2V0VmFsdWUoc2Vjb25kcyk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZGF0ZVRpbWVEaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKKwkJLy8gdGhlIGRhdGVUaW1lIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAorCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKKwkJdGhpcy5kYXRlVGltZS5yZW1vdmVEaXNwb3NlTGlzdGVuZXIodGhpcy5kYXRlVGltZURpc3Bvc2VMaXN0ZW5lcik7CisJCXRoaXMuZGF0ZVRpbWUucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5kYXRlVGltZVNlbGVjdGlvbkxpc3RlbmVyKTsKKwkJdGhpcy5ob3Vyc0hvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ob3Vyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLm1pbnV0ZXNIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubWludXRlc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLnNlY29uZHNIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCX0KKworCS8vICoqKioqKioqKiogdXBkYXRlICoqKioqKioqKioKKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURhdGVUaW1lSG91cnMoSW50ZWdlciBob3VycykgeworCQlpZiAodGhpcy5kYXRlVGltZS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoaG91cnMgPT0gbnVsbCkgeworCQkJaG91cnMgPSBJbnRlZ2VyLnZhbHVlT2YoMCk7Ly9UT0RPIGRlZmF1bHRIb3VycworCQl9CisJCXRoaXMubG9ja2VkID0gdHJ1ZTsKKwkJdHJ5IHsKKwkJCXRoaXMuZGF0ZVRpbWUuc2V0SG91cnMoaG91cnMuaW50VmFsdWUoKSk7CisJCX0KKwkJZmluYWxseSB7CisJCQl0aGlzLmxvY2tlZCA9IGZhbHNlOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURhdGVUaW1lTWludXRlcyhJbnRlZ2VyIG1pbnV0ZXMpIHsKKwkJaWYgKHRoaXMuZGF0ZVRpbWUuaXNEaXNwb3NlZCgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKG1pbnV0ZXMgPT0gbnVsbCkgeworCQkJbWludXRlcyA9IEludGVnZXIudmFsdWVPZigwKTsvL1RPRE8gZGVmYXVsdE1pbnV0ZXMKKwkJfQorCQl0aGlzLmxvY2tlZCA9IHRydWU7CisJCXRyeSB7CisJCQl0aGlzLmRhdGVUaW1lLnNldE1pbnV0ZXMobWludXRlcy5pbnRWYWx1ZSgpKTsKKwkJfQorCQlmaW5hbGx5IHsKKwkJCXRoaXMubG9ja2VkID0gZmFsc2U7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGF0ZVRpbWVTZWNvbmRzKEludGVnZXIgc2Vjb25kcykgeworCQlpZiAodGhpcy5kYXRlVGltZS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoc2Vjb25kcyA9PSBudWxsKSB7CisJCQlzZWNvbmRzID0gSW50ZWdlci52YWx1ZU9mKDApOy8vVE9ETyBkZWZhdWx0U2Vjb25kcworCQl9CisJCXRoaXMubG9ja2VkID0gdHJ1ZTsKKwkJdHJ5IHsKKwkJCXRoaXMuZGF0ZVRpbWUuc2V0U2Vjb25kcyhzZWNvbmRzLmludFZhbHVlKCkpOworCQl9CisJCWZpbmFsbHkgeworCQkJdGhpcy5sb2NrZWQgPSBmYWxzZTsKKwkJfQorCX0KKworCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmhvdXJzSG9sZGVyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvTGlzdEJveE1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L0xpc3RCb3hNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhmMWEyMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvTGlzdEJveE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgcHJvdmlkZXMgYSBtb3JlIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2UgdG8gdGhlIGl0ZW1zIGFuZAotICogc2VsZWN0ZWQgaXRlbXMgaW4gYSBsaXN0IGJveC4KLSAqICdsaXN0SG9sZGVyJyBjb250YWlucyB0aGUgaXRlbXMgaW4gdGhlIGxpc3QgYm94LgotICogJ3NlbGVjdGVkSXRlbXNIb2xkZXInIGNvbnRhaW5zIHRoZSBpdGVtcyBpbiAnbGlzdEhvbGRlcicgdGhhdCBhcmUgc2VsZWN0ZWQKLSAqIGluIHRoZSBsaXN0IGJveC4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGlzdEJveE1vZGVsQWRhcHRlcjxFPiB7Ci0KLQkvLyAqKioqKioqKioqIG1vZGVsICoqKioqKioqKioKLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBsaXN0IGJveCdzIGNvbnRlbnRzIHdpdGgKLQkgKiB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgc2VsZWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc0hvbGRlcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGxpc3QgYm94J3Mgc2VsZWN0aW9uIHdpdGgKLQkgKiB0aGUgbW9kZWwgc2VsZWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgY29udmVydGVyIHRoYXQgY29udmVydHMgaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QKLQkgKiB0byBzdHJpbmdzIHRoYXQgY2FuIGJlIHB1dCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXI7Ci0KLQkvLyAqKioqKioqKioqIFVJICoqKioqKioqKioKLQkvKioKLQkgKiBUaGUgbGlzdCBib3ggd2Uga2VlcCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBsaXN0Qm94OwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIGxpc3QgaG9sZGVyCi0JICogd2l0aCB0aGUgbGlzdCBib3gncyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCS8qKgotCSAqIENsaWVudHMgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT5bXSBzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnM7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gZG91YmxlIGNsaWNrIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPltdIGRvdWJsZUNsaWNrTGlzdGVuZXJzOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSBsaXN0IGJveAotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgbGlzdEJveERpc3Bvc2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBsaXN0IGJveC4KLQkgKiBVc2UgdGhlIGRlZmF1bHQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveCwgd2hpY2ggY2FsbHMgI3RvU3RyaW5nKCkgb24gdGhlCi0JICogaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gTGlzdEJveE1vZGVsQWRhcHRlcjxUPiBhZGFwdCgKLQkJCUxpc3RWYWx1ZU1vZGVsPFQ+IGxpc3RIb2xkZXIsCi0JCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxUPiBzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkJTGlzdCBsaXN0Qm94KQotCXsKLQkJcmV0dXJuIGFkYXB0KGxpc3RIb2xkZXIsIHNlbGVjdGVkSXRlbXNIb2xkZXIsIGxpc3RCb3gsIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxUPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gTGlzdEJveE1vZGVsQWRhcHRlcjxUPiBhZGFwdCgKLQkJCUxpc3RWYWx1ZU1vZGVsPFQ+IGxpc3RIb2xkZXIsCi0JCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxUPiBzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkJTGlzdCBsaXN0Qm94LAotCQkJU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcikKLQl7Ci0JCXJldHVybiBuZXcgTGlzdEJveE1vZGVsQWRhcHRlcjxUPihsaXN0SG9sZGVyLCBzZWxlY3RlZEl0ZW1zSG9sZGVyLCBsaXN0Qm94LCBzdHJpbmdDb252ZXJ0ZXIpOwotCX0KLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVXNlIHRoZSBkZWZhdWx0IHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3gsIHdoaWNoIGNhbGxzICN0b1N0cmluZygpIG9uIHRoZQotCSAqIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IExpc3RCb3hNb2RlbEFkYXB0ZXI8VD4gYWRhcHQoCi0JCQlMaXN0VmFsdWVNb2RlbDxUPiBsaXN0SG9sZGVyLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCUxpc3QgbGlzdEJveCkKLQl7Ci0JCXJldHVybiBhZGFwdChsaXN0SG9sZGVyLCBzZWxlY3RlZEl0ZW1Ib2xkZXIsIGxpc3RCb3gsIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxUPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBMaXN0Qm94TW9kZWxBZGFwdGVyPFQ+IGFkYXB0KAotCQkJTGlzdFZhbHVlTW9kZWw8VD4gbGlzdEhvbGRlciwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlMaXN0IGxpc3RCb3gsCi0JCQlTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyKQotCXsKLQkJcmV0dXJuIG5ldyBMaXN0Qm94TW9kZWxBZGFwdGVyPFQ+KGxpc3RIb2xkZXIsIG5ldyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxUPihzZWxlY3RlZEl0ZW1Ib2xkZXIpLCBsaXN0Qm94LCBzdHJpbmdDb252ZXJ0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIsIHNlbGVjdGlvbnMgaG9sZGVyLCBsaXN0IGJveCwgYW5kCi0JICogc3RyaW5nIGNvbnZlcnRlciBhcmUgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIExpc3RCb3hNb2RlbEFkYXB0ZXIoCi0JCQlMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLAotCQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJCUxpc3QgbGlzdEJveCwKLQkJCVN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIpCi0JewotCQlzdXBlcigpOwotCQlpZiAoKGxpc3RIb2xkZXIgPT0gbnVsbCkgfHwgKHNlbGVjdGVkSXRlbXNIb2xkZXIgPT0gbnVsbCkgfHwgKGxpc3RCb3ggPT0gbnVsbCkgfHwgKHN0cmluZ0NvbnZlcnRlciA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyID0gc2VsZWN0ZWRJdGVtc0hvbGRlcjsKLQkJdGhpcy5saXN0Qm94ID0gbGlzdEJveDsKLQkJdGhpcy5zdHJpbmdDb252ZXJ0ZXIgPSBzdHJpbmdDb252ZXJ0ZXI7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0Qm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMubGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycyA9IHRoaXMuYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVycyA9IHRoaXMuYnVpbGREb3VibGVDbGlja0xpc3RlbmVycygpOwotCi0JCXRoaXMubGlzdEJveERpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Qm94RGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMubGlzdEJveC5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy5saXN0Qm94RGlzcG9zZUxpc3RlbmVyKTsKLQotCQl0aGlzLnN5bmNocm9uaXplTGlzdEJveCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94TW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94TW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlci50aGlzLnNlbGVjdGVkSXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlci50aGlzLnNlbGVjdGVkSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXIudGhpcy5zZWxlY3RlZEl0ZW1zQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94TW9kZWxBZGFwdGVyLnRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic2VsZWN0ZWQgaXRlbXMgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZExpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlci50aGlzLmxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXIudGhpcy5saXN0Qm94RG91YmxlQ2xpY2tlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGJveCBzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBEb3VibGVDbGlja0xpc3RlbmVyPEU+W10gYnVpbGREb3VibGVDbGlja0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIG5ldyBEb3VibGVDbGlja0xpc3RlbmVyWzBdOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPltdIGJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyWzBdOwotCX0KLQotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgYnVpbGRMaXN0Qm94RGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXIudGhpcy5saXN0Qm94RGlzcG9zZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBib3ggZGlzcG9zZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVMaXN0Qm94KCkgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdEJveEl0ZW1zKCk7Ci0JCXRoaXMuc3luY2hyb25pemVMaXN0Qm94U2VsZWN0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0cmluZyBjb252ZXJ0ZXIgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nQ29udmVydGVyKFN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQkJaWYgKHN0cmluZ0NvbnZlcnRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciA9IHN0cmluZ0NvbnZlcnRlcjsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3RCb3goKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2UgdGhlIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgc3BlY2lmaWVkIGl0ZW0gdG8gYQotCSAqIHN0cmluZyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBib3guCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0KEUgaXRlbSkgewotCQlyZXR1cm4gdGhpcy5zdHJpbmdDb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nKGl0ZW0pOwotCX0KLQotCS8qKgotCSAqIEJydXRlIGZvcmNlIHN5bmNocm9uaXphdGlvbiBvZiBsaXN0IGJveCB3aXRoIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplTGlzdEJveEl0ZW1zKCkgewotCQlpZiAodGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBsZW4gPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbbGVuXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaXRlbXNbaV0gPSB0aGlzLmNvbnZlcnQodGhpcy5saXN0SG9sZGVyLmdldChpKSk7Ci0JCX0KLQkJdGhpcy5saXN0Qm94LnNldEl0ZW1zKGl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCBib3guCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGkgPSBldmVudC5nZXRJbmRleCgpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxFPiBzdHJlYW0gPSB0aGlzLml0ZW1zKGV2ZW50KTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmxpc3RCb3guYWRkKHRoaXMuY29udmVydChzdHJlYW0ubmV4dCgpKSwgaSsrKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBsaXN0IGJveC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMubGlzdEJveC5yZW1vdmUoZXZlbnQuZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0SW5kZXgoKSArIGV2ZW50Lml0ZW1zU2l6ZSgpIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGxpc3QgYm94LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCB0YXJnZXQgPSBldmVudC5nZXRUYXJnZXRJbmRleCgpOwotCQlpbnQgc291cmNlID0gZXZlbnQuZ2V0U291cmNlSW5kZXgoKTsKLQkJaW50IGxlbiA9IGV2ZW50LmdldE1vdmVMZW5ndGgoKTsKLQkJaW50IGxvU3RhcnQgPSBNYXRoLm1pbih0YXJnZXQsIHNvdXJjZSk7Ci0JCWludCBoaVN0YXJ0ID0gTWF0aC5tYXgodGFyZ2V0LCBzb3VyY2UpOwotCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgYWZmZWN0ZWQgaXRlbXMuLi4KLQkJU3RyaW5nW10gc3ViQXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuc3ViQXJyYXkodGhpcy5saXN0Qm94LmdldEl0ZW1zKCksIGxvU3RhcnQsIGhpU3RhcnQgKyBsZW4gLSBsb1N0YXJ0KTsKLQkJLy8gLi4ubW92ZSB0aGVtIGFyb3VuZC4uLgotCQlzdWJBcnJheSA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKHN1YkFycmF5LCB0YXJnZXQgLSBsb1N0YXJ0LCBzb3VyY2UgLSBsb1N0YXJ0LCBsZW4pOwotCQkvLyAuLi5hbmQgdGhlbiBwdXQgdGhlbSBiYWNrCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3ViQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCXRoaXMubGlzdEJveC5zZXRJdGVtKGxvU3RhcnQgKyBpLCBzdWJBcnJheVtpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCBib3guCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGkgPSBldmVudC5nZXRJbmRleCgpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxFPiBzdHJlYW0gPSB0aGlzLml0ZW1zKGV2ZW50KTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmxpc3RCb3guc2V0SXRlbShpKyssIHRoaXMuY29udmVydChzdHJlYW0ubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCBib3guCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5saXN0Qm94LnJlbW92ZUFsbCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBsaXN0IGJveC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3RCb3hJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCB1bmNoZWNrZWQgY29kZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gaXRlbXMoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoKExpc3RJdGVyYXRvcjxFPikgZXZlbnQuaXRlbXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlbGVjdGVkIGl0ZW1zICoqKioqKioqKioKLQotCXByb3RlY3RlZCBpbnQgaW5kZXhPZihFIGl0ZW0pIHsKLQkJaW50IGxlbiA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICh0aGlzLmxpc3RIb2xkZXIuZ2V0KGkpID09IGl0ZW0pIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVMaXN0Qm94U2VsZWN0aW9uKCkgewotCQlpZiAodGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W3RoaXMuc2VsZWN0ZWRJdGVtc0hvbGRlci5zaXplKCldOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8RT4gc3RyZWFtID0gdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaW5kaWNlc1tpKytdID0gdGhpcy5pbmRleE9mKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JCXRoaXMubGlzdEJveC5kZXNlbGVjdEFsbCgpOwotCQl0aGlzLmxpc3RCb3guc2VsZWN0KGluZGljZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFtldmVudC5pdGVtc1NpemUoKV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxFPiBzdHJlYW0gPSB0aGlzLml0ZW1zKGV2ZW50KTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpbmRpY2VzW2krK10gPSB0aGlzLmluZGV4T2Yoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJdGhpcy5saXN0Qm94LnNlbGVjdChpbmRpY2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFtldmVudC5pdGVtc1NpemUoKV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxFPiBzdHJlYW0gPSB0aGlzLml0ZW1zKGV2ZW50KTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpbmRpY2VzW2krK10gPSB0aGlzLmluZGV4T2Yoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJdGhpcy5saXN0Qm94LmRlc2VsZWN0KGluZGljZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbXNDbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMubGlzdEJveC5kZXNlbGVjdEFsbCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbXNDaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdEJveFNlbGVjdGlvbigpOwotCX0KLQotCS8vIG1pbmltaXplZCB1bmNoZWNrZWQgY29kZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYXRvcjxFPiBpdGVtcyhDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuICgoSXRlcmF0b3I8RT4pIGV2ZW50Lml0ZW1zKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGJveCBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEJveFNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLmxlbmd0aCA+IDApIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RT4gc2NFdmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VFdmVudCh0aGlzLCB0aGlzLnNlbGVjdGVkSXRlbXMoKSk7Ci0JCQlmb3IgKFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IHNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIDogdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKHNjRXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RT4gc2VsZWN0ZWRJdGVtcygpIHsKLQkJaWYgKHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlBcnJheUxpc3Q8RT4gc2VsZWN0ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3QodGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQlmb3IgKGludCBzZWxlY3Rpb25JbmRleCA6IHRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpIHsKLQkJCXNlbGVjdGVkSXRlbXMuYWRkKHRoaXMubGlzdEhvbGRlci5nZXQoc2VsZWN0aW9uSW5kZXgpKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRJdGVtczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Qm94RG91YmxlQ2xpY2tlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlpZiAodGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJzLmxlbmd0aCA+IDApIHsKLQkJCS8vIHRoZXJlIHNob3VsZCBiZSBvbmx5IGEgc2luZ2xlIGl0ZW0gc2VsZWN0ZWQgZHVyaW5nIGEgZG91YmxlLWNsaWNrKD8pCi0JCQlFIHNlbGVjdGlvbiA9IHRoaXMubGlzdEhvbGRlci5nZXQodGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlEb3VibGVDbGlja0V2ZW50PEU+IGRjRXZlbnQgPSBuZXcgRG91YmxlQ2xpY2tFdmVudCh0aGlzLCBzZWxlY3Rpb24pOwotCQkJZm9yIChEb3VibGVDbGlja0xpc3RlbmVyPEU+IGRvdWJsZUNsaWNrTGlzdGVuZXIgOiB0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJzKSB7Ci0JCQkJZG91YmxlQ2xpY2tMaXN0ZW5lci5kb3VibGVDbGljayhkY0V2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGxpc3RCb3hEaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIGxpc3QgYm94IGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5saXN0Qm94LnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLmxpc3RCb3hEaXNwb3NlTGlzdGVuZXIpOwotCQl0aGlzLmxpc3RCb3gucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5saXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZG91YmxlIGNsaWNrIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihEb3VibGVDbGlja0xpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lcnMgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKHRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lcnMsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVycyA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmUodGhpcy5kb3VibGVDbGlja0xpc3RlbmVycywgbGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiB7Ci0JCXZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudDxFPiBldmVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEb3VibGVDbGlja0V2ZW50PEU+IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCQlwcml2YXRlIGZpbmFsIEUgc2VsZWN0aW9uOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwcm90ZWN0ZWQgRG91YmxlQ2xpY2tFdmVudChMaXN0Qm94TW9kZWxBZGFwdGVyPEU+IHNvdXJjZSwgRSBzZWxlY3Rpb24pIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgTGlzdEJveE1vZGVsQWRhcHRlcjxFPiBnZXRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gKExpc3RCb3hNb2RlbEFkYXB0ZXI8RT4pIHN1cGVyLmdldFNvdXJjZSgpOwotCQl9Ci0KLQkJcHVibGljIEUgc2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuc2VsZWN0aW9uOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0aW9uIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlKHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiB7Ci0JCXZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBldmVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPEU+IHNlbGVjdGlvbjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHJvdGVjdGVkIFNlbGVjdGlvbkNoYW5nZUV2ZW50KExpc3RCb3hNb2RlbEFkYXB0ZXI8RT4gc291cmNlLCBDb2xsZWN0aW9uPEU+IHNlbGVjdGlvbikgewotCQkJc3VwZXIoc291cmNlKTsKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBMaXN0Qm94TW9kZWxBZGFwdGVyPEU+IGdldFNvdXJjZSgpIHsKLQkJCXJldHVybiAoTGlzdEJveE1vZGVsQWRhcHRlcjxFPikgc3VwZXIuZ2V0U291cmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gc2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L1RhYmxlSXRlbU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L1RhYmxlSXRlbU1vZGVsQWRhcHRlci5qYXZhCmluZGV4IDEyNjc1ODYuLmFhMTc3MTAgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N3dC9UYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvVGFibGVJdGVtTW9kZWxBZGFwdGVyLmphdmEKQEAgLTIwLDcgKzIwLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07CiAKQEAgLTE2NSw4ICsxNjUsOSBAQAogCiAJcHJpdmF0ZSB2b2lkIGxheW91dFRhYmxlKCkgewogCQkvLyBSZWZyZXNoIHRoZSB0YWJsZSBpbiBvcmRlciB0byBzaG93IHRoZSBzY3JvbGxiYXIgaWYgcmVxdWlyZWQKLQkJUG9pbnQgc2l6ZSA9IHRoaXMudGFibGVJdGVtLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCXRoaXMudGFibGVJdGVtLmdldFBhcmVudCgpLnNldFNpemUoc2l6ZSk7CisJCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0aGlzLnRhYmxlSXRlbS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKTsKKwkJY29udGFpbmVyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7CisJCWNvbnRhaW5lci5sYXlvdXQoKTsKIAl9CiAKIAkvLyAqKioqKioqKioqIGRpc3Bvc2UgKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3d0L1RhYmxlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXIuamF2YQppbmRleCBkYjI5Yzg4Li43YzMwNjg5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMiwxOCArMTIsMjggQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7CkBAIC04NSwxMiArOTUsMTQgQEAKIAkvKioKIAkgKiBDbGllbnRzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gc2VsZWN0aW9uIGNoYW5nZSBldmVudHMuCiAJICovCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+W10gc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzOworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByb3RlY3RlZCBmaW5hbCBMaXN0ZW5lckxpc3Q8U2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IHNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdDsKIAogCS8qKgogCSAqIENsaWVudHMgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiBkb3VibGUgY2xpY2sgZXZlbnRzLgogCSAqLwotCXByb3RlY3RlZCBEb3VibGVDbGlja0xpc3RlbmVyPEU+W10gZG91YmxlQ2xpY2tMaXN0ZW5lcnM7CisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPiBkb3VibGVDbGlja0xpc3RlbmVyTGlzdDsKIAogCS8qKgogCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgdGFibGUKQEAgLTE3NCw4ICsxODYsOCBAQAogCQl0aGlzLnRhYmxlU2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGFibGVTZWxlY3Rpb25MaXN0ZW5lcigpOwogCQl0aGlzLnRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMudGFibGVTZWxlY3Rpb25MaXN0ZW5lcik7CiAKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lcnMgPSB0aGlzLmJ1aWxkRG91YmxlQ2xpY2tMaXN0ZW5lcnMoKTsKKwkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QgPSB0aGlzLmJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0KCk7CisJCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QgPSB0aGlzLmJ1aWxkRG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QoKTsKIAogCQl0aGlzLnRhYmxlRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZFRhYmxlRGlzcG9zZUxpc3RlbmVyKCk7CiAJCXRoaXMudGFibGUuYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMudGFibGVEaXNwb3NlTGlzdGVuZXIpOwpAQCAtMTkyLDE5ICsyMDQsMTkgQEAKIAogCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewogCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewogCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zQWRkZWQoZXZlbnQpOwogCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgeworCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewogCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zUmVtb3ZlZChldmVudCk7CiAJCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgeworCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7CiAJCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNNb3ZlZChldmVudCk7CiAJCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgeworCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7CiAJCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNSZXBsYWNlZChldmVudCk7CiAJCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7CiAJCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7CiAJCQl9CiAJCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKQEAgLTIyMywxMyArMjM1LDEzIEBACiAKIAlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyXygpIHsKIAkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgeworCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKIAkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnNlbGVjdGVkSXRlbXNBZGRlZChldmVudCk7CiAJCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7CiAJCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5zZWxlY3RlZEl0ZW1zUmVtb3ZlZChldmVudCk7CiAJCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7CiAJCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5zZWxlY3RlZEl0ZW1zQ2xlYXJlZChldmVudCk7CiAJCQl9CiAJCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKQEAgLTI1OCwxMyArMjcwLDEzIEBACiAJfQogCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIERvdWJsZUNsaWNrTGlzdGVuZXI8RT5bXSBidWlsZERvdWJsZUNsaWNrTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbmV3IERvdWJsZUNsaWNrTGlzdGVuZXJbMF07CisJcHJvdGVjdGVkIExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPiBidWlsZERvdWJsZUNsaWNrTGlzdGVuZXJMaXN0KCkgeworCQlyZXR1cm4gbmV3IExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPihEb3VibGVDbGlja0xpc3RlbmVyLmNsYXNzKTsKIAl9CiAKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT5bXSBidWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lclswXTsKKwlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0PFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBidWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdCgpIHsKKwkJcmV0dXJuIG5ldyBMaXN0ZW5lckxpc3Q8U2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+KFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzKTsKIAl9CiAKIAlwcm90ZWN0ZWQgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkVGFibGVEaXNwb3NlTGlzdGVuZXIoKSB7CkBAIC0zNDIsNyArMzU0LDcgQEAKIAkvKioKIAkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgdGFibGUuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CisJcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7CiAKIAkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7CiAJCQlyZXR1cm47CkBAIC0zNTAsMjggKzM2MiwyOCBAQAogCiAJCWludCBpbmRleCA9IGV2ZW50LmdldEluZGV4KCk7CiAKLQkJZm9yIChMaXN0SXRlcmF0b3I8RT4gc3RyZWFtID0gdGhpcy5pdGVtcyhldmVudCk7IHN0cmVhbS5oYXNOZXh0KCk7IGluZGV4KyspIHsKKwkJZm9yIChFIGl0ZW0gOiB0aGlzLmdldEl0ZW1zKGV2ZW50KSkgewogCiAJCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gbmV3IFRhYmxlSXRlbSh0aGlzLnRhYmxlLCBTV1QuTlVMTCwgaW5kZXgpOwotCQkJdGFibGVJdGVtLnNldERhdGEoc3RyZWFtLm5leHQoKSk7CisJCQl0YWJsZUl0ZW0uc2V0RGF0YShpdGVtKTsKIAogCQkJVGFibGVJdGVtTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSB0aGlzLmJ1aWxkSXRlbU1vZGVsKHRhYmxlSXRlbSk7Ci0JCQl0YWJsZUl0ZW1Nb2RlbEFkYXB0ZXJzLmFkZChpbmRleCwgYWRhcHRlcik7CisJCQl0YWJsZUl0ZW1Nb2RlbEFkYXB0ZXJzLmFkZChpbmRleCsrLCBhZGFwdGVyKTsKIAkJfQogCX0KIAogCS8qKgogCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSB0YWJsZS4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgeworCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7CiAKIAkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7CiAJCQlyZXR1cm47CiAJCX0KIAotCQl0aGlzLnRhYmxlLnJlbW92ZShldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJbmRleCgpICsgZXZlbnQuaXRlbXNTaXplKCkgLSAxKTsKKwkJdGhpcy50YWJsZS5yZW1vdmUoZXZlbnQuZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0SW5kZXgoKSArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpIC0gMSk7CiAKLQkJZm9yIChpbnQgaW5kZXggPSBldmVudC5nZXRJbmRleCgpICsgZXZlbnQuaXRlbXNTaXplKCk7IC0taW5kZXggPj0gZXZlbnQuZ2V0SW5kZXgoKTsgKSB7CisJCWZvciAoaW50IGluZGV4ID0gZXZlbnQuZ2V0SW5kZXgoKSArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpOyAtLWluZGV4ID49IGV2ZW50LmdldEluZGV4KCk7ICkgewogCQkJdGFibGVJdGVtTW9kZWxBZGFwdGVycy5yZW1vdmUoaW5kZXgpOwogCQl9CiAJfQpAQCAtMzc5LDEzICszOTEsMTMgQEAKIAkvKioKIAkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgdGFibGUuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CisJcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewogCiAJCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewogCQkJcmV0dXJuOwogCQl9CiAKLQkJaW50IGxlbmd0aCAgICAgICAgPSBldmVudC5nZXRNb3ZlTGVuZ3RoKCk7CisJCWludCBsZW5ndGggICAgICAgID0gZXZlbnQuZ2V0TGVuZ3RoKCk7CiAJCWludCBzb3VyY2VJbmRleCAgID0gZXZlbnQuZ2V0U291cmNlSW5kZXgoKTsKIAkJaW50IHRhcmdldEluZGV4ICAgPSBldmVudC5nZXRUYXJnZXRJbmRleCgpOwogCQlpbnQgbG93U3RhcnRJbmRleCA9IE1hdGgubWluKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7CkBAIC00MDYsNyArNDE4LDcgQEAKIAogCQkvLyBNb3ZlIHRoZSBpdGVtcyBzbyB0aGV5IGNhbiByZXRyaWV2ZWQgaW4gdGhlIHJpZ2h0IG9yZGVyIHdoZW4KIAkJLy8gcmUtY3JlYXRpbmcgdGhlIFRhYmxlSXRlbXMKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUoCisJCUFycmF5VG9vbHMubW92ZSgKIAkJCWl0ZW1zLAogCQkJdGFyZ2V0SW5kZXggLSBsb3dTdGFydEluZGV4LAogCQkJc291cmNlSW5kZXggLSBsb3dTdGFydEluZGV4LApAQCAtNDQwLDE2ICs0NTIsMTYgQEAKIAkvKioKIAkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgdGFibGUuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CisJcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewogCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKIAkJCXJldHVybjsKIAkJfQogCiAJCWludCByb3dJbmRleCA9IGV2ZW50LmdldEluZGV4KCk7CiAKLQkJZm9yIChMaXN0SXRlcmF0b3I8RT4gc3RyZWFtID0gdGhpcy5pdGVtcyhldmVudCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpKSB7CiAJCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGhpcy50YWJsZS5nZXRJdGVtKHJvd0luZGV4KTsKLQkJCXRhYmxlSXRlbS5zZXREYXRhKHN0cmVhbS5uZXh0KCkpOworCQkJdGFibGVJdGVtLnNldERhdGEoaXRlbSk7CiAKIAkJCVRhYmxlSXRlbU1vZGVsQWRhcHRlciBhZGFwdGVyID0gdGFibGVJdGVtTW9kZWxBZGFwdGVycy5nZXQocm93SW5kZXgpOwogCkBAIC00NjcsNyArNDc5LDcgQEAKIAkvKioKIAkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgdGFibGUuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CisJcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDbGVhckV2ZW50IGV2ZW50KSB7CiAJCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewogCQkJcmV0dXJuOwogCQl9CkBAIC00NzcsMTQgKzQ4OSwyMCBAQAogCS8qKgogCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSB0YWJsZS4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CiAJCXRoaXMuc3luY2hyb25pemVUYWJsZUl0ZW1zKCk7CiAJfQogCi0JLy8gbWluaW1pemVkIHVuY2hlY2tlZCBjb2RlCisJLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEU+IGl0ZW1zKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKChMaXN0SXRlcmF0b3I8RT4pIGV2ZW50Lml0ZW1zKCkpOworCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKKwkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKKwl9CisKKwkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXROZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7CisJCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7CiAJfQogCiAKQEAgLTUxMyw1NSArNTMxLDYwIEBACiAJCXRoaXMudGFibGUuc2VsZWN0KGluZGljZXMpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7CiAJCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewogCQkJcmV0dXJuOwogCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2V2ZW50Lml0ZW1zU2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEU+IHN0cmVhbSA9IHRoaXMuaXRlbXMoZXZlbnQpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWluZGljZXNbaSsrXSA9IHRoaXMuaW5kZXhPZihzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQl0aGlzLnRhYmxlLnNlbGVjdChpbmRpY2VzKTsKKwkJdGhpcy50YWJsZS5zZWxlY3QodGhpcy5nZXRJbmRpY2VzKGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0aGlzLmdldEl0ZW1zKGV2ZW50KSkpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgeworCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewogCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKIAkJCXJldHVybjsKIAkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFtldmVudC5pdGVtc1NpemUoKV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxFPiBzdHJlYW0gPSB0aGlzLml0ZW1zKGV2ZW50KTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpbmRpY2VzW2krK10gPSB0aGlzLmluZGV4T2Yoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJdGhpcy50YWJsZS5kZXNlbGVjdChpbmRpY2VzKTsKKwkJdGhpcy50YWJsZS5kZXNlbGVjdCh0aGlzLmdldEluZGljZXMoZXZlbnQuZ2V0SXRlbXNTaXplKCksIHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSk7CiAJfQogCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0ZWRJdGVtc0NsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJcHJvdGVjdGVkIGludFtdIGdldEluZGljZXMoaW50IGl0ZW1zU2l6ZSwgSXRlcmFibGU8RT4gaXRlbXMpIHsKKwkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbaXRlbXNTaXplXTsKKwkJaW50IGkgPSAwOworCQlmb3IgKEUgaXRlbSA6IGl0ZW1zKSB7CisJCQlpbmRpY2VzW2krK10gPSB0aGlzLmluZGV4T2YoaXRlbSk7CisJCX0KKwkJcmV0dXJuIGluZGljZXM7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2VsZWN0ZWRJdGVtc0NsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7CiAJCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewogCQkJcmV0dXJuOwogCQl9CiAJCXRoaXMudGFibGUuZGVzZWxlY3RBbGwoKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7CiAJCXRoaXMuc3luY2hyb25pemVUYWJsZVNlbGVjdGlvbigpOwogCX0KIAotCS8vIG1pbmltaXplZCB1bmNoZWNrZWQgY29kZQorCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IGl0ZW1zKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKChJdGVyYXRvcjxFPikgZXZlbnQuaXRlbXMoKSk7CisJcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgeworCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOworCX0KKworCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgeworCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwogCX0KIAogCiAJLy8gKioqKioqKioqKiBsaXN0IGJveCBldmVudHMgKioqKioqKioqKgogCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgdGFibGVTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycy5sZW5ndGggPiAwKSB7CisJcHJvdGVjdGVkIHZvaWQgdGFibGVTZWxlY3Rpb25DaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQlpZiAodGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3Quc2l6ZSgpID4gMCkgewogCQkJU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RT4gc2NFdmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VFdmVudCh0aGlzLCB0aGlzLnNlbGVjdGVkSXRlbXMoKSk7Ci0JCQlmb3IgKFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IHNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIDogdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMpIHsKKwkJCWZvciAoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgOiB0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewogCQkJCXNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoc2NFdmVudCk7CiAJCQl9CiAJCX0KQEAgLTU4MCwxNSArNjAzLDE1IEBACiAJfQogCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgdGFibGVEb3VibGVDbGlja2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJcHJvdGVjdGVkIHZvaWQgdGFibGVEb3VibGVDbGlja2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTZWxlY3Rpb25FdmVudCBldmVudCkgewogCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKIAkJCXJldHVybjsKIAkJfQotCQlpZiAodGhpcy5kb3VibGVDbGlja0xpc3RlbmVycy5sZW5ndGggPiAwKSB7CisJCWlmICh0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0LnNpemUoKSA+IDApIHsKIAkJCS8vIHRoZXJlIHNob3VsZCBiZSBvbmx5IGEgc2luZ2xlIGl0ZW0gc2VsZWN0ZWQgZHVyaW5nIGEgZG91YmxlLWNsaWNrKD8pCiAJCQlFIHNlbGVjdGlvbiA9IHRoaXMubGlzdEhvbGRlci5nZXQodGhpcy50YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKIAkJCURvdWJsZUNsaWNrRXZlbnQ8RT4gZGNFdmVudCA9IG5ldyBEb3VibGVDbGlja0V2ZW50KHRoaXMsIHNlbGVjdGlvbik7Ci0JCQlmb3IgKERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gZG91YmxlQ2xpY2tMaXN0ZW5lciA6IHRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lcnMpIHsKKwkJCWZvciAoRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBkb3VibGVDbGlja0xpc3RlbmVyIDogdGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewogCQkJCWRvdWJsZUNsaWNrTGlzdGVuZXIuZG91YmxlQ2xpY2soZGNFdmVudCk7CiAJCQl9CiAJCX0KQEAgLTU5Nyw3ICs2MjAsNyBAQAogCiAJLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKIAotCXByb3RlY3RlZCB2b2lkIHRhYmxlRGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7CisJcHJvdGVjdGVkIHZvaWQgdGFibGVEaXNwb3NlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRGlzcG9zZUV2ZW50IGV2ZW50KSB7CiAJCS8vIHRoZSB0YWJsZSBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKIAkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCiAJCXRoaXMudGFibGUucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMudGFibGVEaXNwb3NlTGlzdGVuZXIpOwpAQCAtNjE4LDE0ICs2NDEsMTQgQEAKIAkvLyAqKioqKioqKioqIGRvdWJsZSBjbGljayBzdXBwb3J0ICoqKioqKioqKioKIAogCXB1YmxpYyB2b2lkIGFkZERvdWJsZUNsaWNrTGlzdGVuZXIoRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJzID0gQ29sbGVjdGlvblRvb2xzLmFkZCh0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJzLCBsaXN0ZW5lcik7CisJCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCByZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVycyA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmUodGhpcy5kb3VibGVDbGlja0xpc3RlbmVycywgbGlzdGVuZXIpOworCQl0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7CiAJfQogCi0JcHVibGljIGludGVyZmFjZSBEb3VibGVDbGlja0xpc3RlbmVyPEU+IHsKKwlwdWJsaWMgaW50ZXJmYWNlIERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKIAkJdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50PEU+IGV2ZW50KTsKIAl9CiAKQEAgLTY1NywxNCArNjgwLDE0IEBACiAJLy8gKioqKioqKioqKiBzZWxlY3Rpb24gc3VwcG9ydCAqKioqKioqKioqCiAKIAlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycyA9IENvbGxlY3Rpb25Ub29scy5hZGQodGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMsIGxpc3RlbmVyKTsKKwkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVycyA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmUodGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMsIGxpc3RlbmVyKTsKKwkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKIAl9CiAKLQlwdWJsaWMgaW50ZXJmYWNlIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IHsKKwlwdWJsaWMgaW50ZXJmYWNlIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAJCXZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBldmVudCk7CiAJfQogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0NvbnRyb2xFbmFibGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0NvbnRyb2xFbmFibGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MjkxOGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9Db250cm9sRW5hYmxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIFRoaXMgPGNvZGU+Q29udHJvbEVuYWJsZXI8L2NvZGU+IGtlZXBzIHRoZSAiZW5hYmxlZCIgc3RhdGUgb2YgYSBjb2xsZWN0aW9uIG9mCi0gKiBjb250cm9scyBpbiBzeW5jaCB3aXRoIHRoZSBwcm92aWRlZCBib29sZWFuIGhvbGRlci4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xFbmFibGVyIGV4dGVuZHMgU3RhdGVDb250cm9sbGVyCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db250cm9sRW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gZGlzYWJsZWQpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xzIFRoZSBjb2xsZWN0aW9uIG9mIGNvbnRyb2xzIHdob3NlICJlbmFibGVkIiBzdGF0ZSBpcwotCSAqIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIENvbnRyb2xFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgY29udHJvbHMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9scyBUaGUgY29sbGVjdGlvbiBvZiBjb250cm9scyB3aG9zZSAiZW5hYmxlZCIgc3RhdGUgaXMKLQkgKiBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbEVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzLAotCSAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgY29udHJvbHMuaXRlcmF0b3IoKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBkaXNhYmxlZCkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCB3aG9zZSAiZW5hYmxlZCIgc3RhdGUgaXMKLQkgKiBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBDb250cm9sRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjb250cm9sKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBjb250cm9sLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db250cm9sRW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gZGlzYWJsZWQpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xzIFRoZSBjb2xsZWN0aW9uIG9mIGNvbnRyb2xzIHdob3NlICJlbmFibGVkIiBzdGF0ZSBpcwotCSAqIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIENvbnRyb2xFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sLi4uIGNvbnRyb2xzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoY29udHJvbHMpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db250cm9sRW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCB3aG9zZSAiZW5hYmxlZCIgc3RhdGUgaXMKLQkgKiBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbEVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcihjb250cm9sKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbEVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xzIFRoZSBjb2xsZWN0aW9uIG9mIGNvbnRyb2xzIHdob3NlICJlbmFibGVkIiBzdGF0ZSBpcwotCSAqIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb250cm9sRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFtdIGNvbnRyb2xzLAotCSAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKGNvbnRyb2xzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBkaXNhYmxlZCkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbHMgQW4gaXRlcmF0b3Igb24gdGhlIGNvbGxlY3Rpb24gb2YgY29udHJvbHMgd2hvc2UKLQkgKiAiZW5hYmxlZCIgc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgQ29udHJvbEVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgY29udHJvbHMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9scyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZiBjb250cm9scyB3aG9zZQotCSAqICJlbmFibGVkIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbEVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scywKLQkgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQlzdXBlcihib29sZWFuSG9sZGVyLCB3cmFwKGNvbnRyb2xzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPElDb250cm9sSG9sZGVyPiB3cmFwKEl0ZXJhdG9yPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8Q29udHJvbCwgSUNvbnRyb2xIb2xkZXI+KGNvbnRyb2xzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJQ29udHJvbEhvbGRlciB0cmFuc2Zvcm0oQ29udHJvbCBjb250cm9sKSB7Ci0JCQkJcmV0dXJuIG5ldyBDb250cm9sSG9sZGVyKGNvbnRyb2wpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhvbGRlciBob2xkcyBvbnRvIGEgPGNvZGU+Q29udHJvbDwvY29kZT4gYW5kIHVwZGF0ZSBpdHMgZW5hYmxlZCBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250cm9sSG9sZGVyIGltcGxlbWVudHMgSUNvbnRyb2xIb2xkZXIgewotCi0JCXByaXZhdGUgZmluYWwgQ29udHJvbCBjb250cm9sOwotCi0JCUNvbnRyb2xIb2xkZXIoQ29udHJvbCBjb250cm9sKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb250cm9sID0gY29udHJvbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZVN0YXRlKGJvb2xlYW4gc3RhdGUpIHsKLQkJCWlmICghdGhpcy5jb250cm9sLmlzRGlzcG9zZWQoKSkgewotCQkJCXRoaXMuY29udHJvbC5zZXRFbmFibGVkKHN0YXRlKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0NvbnRyb2xWaXNpYmlsaXR5RW5hYmxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9Db250cm9sVmlzaWJpbGl0eUVuYWJsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0YWI2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL0NvbnRyb2xWaXNpYmlsaXR5RW5hYmxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5Db250cm9sVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+IGtlZXBzIHRoZSAidmlzaWJsZSIgc3RhdGUgb2YgYQotICogY29sbGVjdGlvbiBvZiBjb250cm9scyBpbiBzeW5jaCB3aXRoIHRoZSBwcm92aWRlZCBib29sZWFuIGhvbGRlci4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xWaXNpYmlsaXR5RW5hYmxlciBleHRlbmRzIFN0YXRlQ29udHJvbGxlcgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbFZpc2liaWxpdHlFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZQotCSAqIG9mIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBub3QgdmlzaWJsZSkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbHMgVGhlIGNvbGxlY3Rpb24gb2YgY29udHJvbHMgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzCi0JICoga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgQ29udHJvbFZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIGNvbnRyb2xzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db250cm9sVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xzIFRoZSBjb2xsZWN0aW9uIG9mIGNvbnRyb2xzIHdob3NlICJ2aXNpYmxlIiBzdGF0ZSBpcwotCSAqIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb250cm9sVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBjb250cm9scy5pdGVyYXRvcigpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbFZpc2liaWxpdHlFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBub3QgdmlzaWJsZSkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMKLQkgKiBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBDb250cm9sVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNvbnRyb2wpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIGNvbnRyb2wsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gbm90IHZpc2libGUpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xzIFRoZSBjb2xsZWN0aW9uIG9mIGNvbnRyb2xzIHdob3NlICJ2aXNpYmxlIiBzdGF0ZSBpcwotCSAqIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIENvbnRyb2xWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wuLi4gY29udHJvbHMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihjb250cm9scyksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlCi0JICogYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbFZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcihjb250cm9sKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbFZpc2liaWxpdHlFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9scyBUaGUgY29sbGVjdGlvbiBvZiBjb250cm9scyB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMga2VwdAotCSAqIGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbFZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbFtdIGNvbnRyb2xzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihjb250cm9scyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db250cm9sVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlCi0JICogb2YgPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIG5vdCB2aXNpYmxlKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9scyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZiBjb250cm9scyB3aG9zZSAidmlzaWJsZSIKLQkgKiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBDb250cm9sVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIGNvbnRyb2xzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db250cm9sVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mIGNvbnRyb2xzIHdob3NlICJ2aXNpYmxlIgotCSAqIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb250cm9sVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXN1cGVyKGJvb2xlYW5Ib2xkZXIsIHdyYXAoY29udHJvbHMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248SUNvbnRyb2xIb2xkZXI+IHdyYXAoSXRlcmF0b3I8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxDb250cm9sLCBJQ29udHJvbEhvbGRlcj4oY29udHJvbHMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElDb250cm9sSG9sZGVyIHRyYW5zZm9ybShDb250cm9sIGNvbnRyb2wpIHsKLQkJCQlyZXR1cm4gbmV3IENvbnRyb2xIb2xkZXIoY29udHJvbCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaG9sZGVyIGhvbGRzIG9udG8gYSA8Y29kZT5Db250cm9sPC9jb2RlPiBhbmQgdXBkYXRlIGl0cyB2aXNpYmxlIHN0YXRlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRyb2xIb2xkZXIgaW1wbGVtZW50cyBJQ29udHJvbEhvbGRlciB7Ci0JCXByaXZhdGUgZmluYWwgQ29udHJvbCBjb250cm9sOwotCi0JCUNvbnRyb2xIb2xkZXIoQ29udHJvbCBjb250cm9sKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb250cm9sID0gY29udHJvbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZVN0YXRlKGJvb2xlYW4gc3RhdGUpIHsKLQkJCWlmICghdGhpcy5jb250cm9sLmlzRGlzcG9zZWQoKSkgewotCQkJCXRoaXMuY29udHJvbC5zZXRWaXNpYmxlKHN0YXRlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXIuamF2YQppbmRleCA2MzY4NWIxLi42YTEyODgxIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1BhbmVFbmFibGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9QYW5lRW5hYmxlci5qYXZhCkBAIC0xMSwxMSArMTEsMTAgQEAKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdFBhbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKIAogLyoqCiAgKiBUaGlzIDxjb2RlPlBhbmVFbmFibGVyPC9jb2RlPiBrZWVwcyB0aGUgImVuYWJsZWQiIHN0YXRlIG9mIGEgY29sbGVjdGlvbiBvZgpAQCAtMzUsNyArMzQsNyBAQAogCSAqIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKIAkgKi8KIAlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGFuZTw/PiBwYW5lKSB7CisJICAgICAgICAgICAgICAgICAgIFBhbmU8Pz4gcGFuZSkgewogCiAJCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZSwgZmFsc2UpOwogCX0KQEAgLTQ5LDcgKzQ4LDcgQEAKIAkgKiB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCiAJICovCiAJcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFBhbmU8Pz4uLi4gcGFuZXMpIHsKKwkgICAgICAgICAgICAgICAgICAgUGFuZTw/Pi4uLiBwYW5lcykgewogCiAJCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24ocGFuZXMpLCBmYWxzZSk7CiAJfQpAQCAtNjQsNyArNjMsNyBAQAogCSAqIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCiAJcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFBhbmU8Pz4gcGFuZSwKKwkgICAgICAgICAgICAgICAgICAgUGFuZTw/PiBwYW5lLAogCSAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewogCiAJCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKHBhbmUpLCBmYWxzZSk7CkBAIC04MCw3ICs3OSw3IEBACiAJICogPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KIAlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGFuZTw/PltdIHBhbmVzLAorCSAgICAgICAgICAgICAgICAgICBQYW5lPD8+W10gcGFuZXMsCiAJICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7CiAKIAkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IocGFuZXMpLCBkZWZhdWx0VmFsdWUpOwpAQCAtOTUsNyArOTQsNyBAQAogCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKIAkgKi8KIAlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIEFic3RyYWN0UGFuZTw/Pj4gcGFuZXMpIHsKKwkgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMpIHsKIAogCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmVzLCBmYWxzZSk7CiAJfQpAQCAtMTEwLDcgKzEwOSw3IEBACiAJICogPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KIAlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIEFic3RyYWN0UGFuZTw/Pj4gcGFuZXMsCisJICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzLAogCSAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewogCiAJCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZXMuaXRlcmF0b3IoKSwgZGVmYXVsdFZhbHVlKTsKQEAgLTEyNSw3ICsxMjQsNyBAQAogCSAqIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCiAJICovCiAJcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjw/IGV4dGVuZHMgQWJzdHJhY3RQYW5lPD8+PiBwYW5lcykgeworCSAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMpIHsKIAogCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmVzLCBmYWxzZSk7CiAJfQpAQCAtMTQwLDUxICsxMzksMzYgQEAKIAkgKiA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwogCXB1YmxpYyBQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIEFic3RyYWN0UGFuZTw/Pj4gcGFuZXMsCisJICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPD8gZXh0ZW5kcyBQYW5lPD8+PiBwYW5lcywKIAkgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKIAogCQlzdXBlcihib29sZWFuSG9sZGVyLCB3cmFwKHBhbmVzKSwgZGVmYXVsdFZhbHVlKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPElDb250cm9sSG9sZGVyPiB3cmFwKEl0ZXJhdG9yPD8gZXh0ZW5kcyBBYnN0cmFjdFBhbmU8Pz4+IHBhbmVzKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxBYnN0cmFjdFBhbmU8Pz4sIElDb250cm9sSG9sZGVyPihwYW5lcykgeworCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248Q29udHJvbEhvbGRlcj4gd3JhcChJdGVyYXRvcjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBhbmU8Pz4sIENvbnRyb2xIb2xkZXI+KHBhbmVzKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJQ29udHJvbEhvbGRlciB0cmFuc2Zvcm0oQWJzdHJhY3RQYW5lPD8+IHBhbmUpIHsKKwkJCXByb3RlY3RlZCBDb250cm9sSG9sZGVyIHRyYW5zZm9ybShQYW5lPD8+IHBhbmUpIHsKIAkJCQlyZXR1cm4gbmV3IFBhbmVIb2xkZXIocGFuZSk7CiAJCQl9CiAJCX0pOwogCX0KIAogCS8qKgotCSAqIFRoaXMgaG9sZGVyIGhvbGRzIG9udG8gYW4gPGNvZGU+QWJzdHJhY3RQYW5lPC9jb2RlPiBhbmQgdXBkYXRlIGl0cyBlbmFibGVkCisJICogVGhpcyBob2xkZXIgaG9sZHMgb250byBhbiA8Y29kZT5QYW5lPC9jb2RlPiBhbmQgdXBkYXRlIGl0cyBlbmFibGVkCiAJICogc3RhdGUuCiAJICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFuZUhvbGRlciBpbXBsZW1lbnRzIElDb250cm9sSG9sZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFBhbmU8Pz4gcGFuZTsKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBQYW5lSG9sZGVyIGltcGxlbWVudHMgQ29udHJvbEhvbGRlciB7CisJCXByaXZhdGUgZmluYWwgUGFuZTw/PiBwYW5lOwogCi0JCVBhbmVIb2xkZXIoQWJzdHJhY3RQYW5lPD8+IHBhbmUpIHsKKwkJUGFuZUhvbGRlcihQYW5lPD8+IHBhbmUpIHsKIAkJCXN1cGVyKCk7CiAJCQl0aGlzLnBhbmUgPSBwYW5lOwogCQl9CiAKIAkJcHVibGljIHZvaWQgdXBkYXRlU3RhdGUoYm9vbGVhbiBzdGF0ZSkgewotCi0JCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGhpcy5wYW5lLmdldENvbnRyb2woKTsKLQotCQkJaWYgKCFjb250YWluZXIuaXNEaXNwb3NlZCgpKSB7Ci0KLQkJCQkvLyBSZW1vdmUgdGhlIGVuYWJsZW1lbnQgZnJvbSB0aGUgcGFuZSdzIGNvbnRyb2wgc2luY2UgdGhpcyBlbmFibGVyCi0JCQkJLy8gaXMgcmVzcG9uc2libGUgdG8gbWFuYWdlIGl0cyBlbmFibGVtZW50IHN0YXRlCi0JCQkJYm9vbGVhbiBlbmFibGVtZW50TWFuYWdlZCA9IHRoaXMucGFuZS5pc0VuYWJsZW1lbnRNYW5hZ2VkKGNvbnRhaW5lcik7Ci0JCQkJdGhpcy5wYW5lLmFkZFRvRW5hYmxlbWVudENvbnRyb2woY29udGFpbmVyKTsKLQotCQkJCS8vIE5vdyB3ZSBjYW4gY2hhbmdlIHRoZSBlbmFibGVtZW50IHN0YXRlIG9mIHRoZSBwYW5lJ3Mgd2lkZ2V0cworCQkJaWYgKCF0aGlzLnBhbmUuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewogCQkJCXRoaXMucGFuZS5lbmFibGVXaWRnZXRzKHN0YXRlKTsKLQotCQkJCS8vIFJlc3RvcmUgdGhlIGVuYWJsZW1lbnQgc3RhdGUKLQkJCQlpZiAoZW5hYmxlbWVudE1hbmFnZWQpIHsKLQkJCQkJdGhpcy5wYW5lLnJlbW92ZUZyb21FbmFibGVtZW50Q29udHJvbChjb250YWluZXIpOwotCQkJCX0KIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvUGFuZVZpc2liaWxpdHlFbmFibGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlci5qYXZhCmluZGV4IGFlZTc1ODEuLjdlNmYwM2QgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvUGFuZVZpc2liaWxpdHlFbmFibGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXIuamF2YQpAQCAtMTEsNyArMTEsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkFic3RyYWN0UGFuZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CkBAIC0zNCw3ICszNCw3IEBACiAJICogYm9vbGVhbiBob2xkZXIncyB2YWx1ZQogCSAqLwogCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFBhbmU8Pz4gcGFuZSkgeworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuZTw/PiBwYW5lKSB7CiAKIAkJdGhpcyhib29sZWFuSG9sZGVyLCBwYW5lLCBmYWxzZSk7CiAJfQpAQCAtNDgsNyArNDgsNyBAQAogCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKIAkgKi8KIAlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQYW5lPD8+Li4uIHBhbmVzKSB7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lPD8+Li4uIHBhbmVzKSB7CiAKIAkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihwYW5lcyksIGZhbHNlKTsKIAl9CkBAIC02Myw3ICs2Myw3IEBACiAJICogPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KIAlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQYW5lPD8+IHBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lPD8+IHBhbmUsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewogCiAJCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKHBhbmUpLCBmYWxzZSk7CkBAIC03OSw3ICs3OSw3IEBACiAJICogPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KIAlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQYW5lPD8+W10gcGFuZXMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lPD8+W10gcGFuZXMsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewogCiAJCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKHBhbmVzKSwgZGVmYXVsdFZhbHVlKTsKQEAgLTk0LDcgKzk0LDcgQEAKIAkgKiB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCiAJICovCiAJcHVibGljIFBhbmVWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIEFic3RyYWN0UGFuZTw/Pj4gcGFuZXMpIHsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzKSB7CiAKIAkJdGhpcyhib29sZWFuSG9sZGVyLCBwYW5lcywgZmFsc2UpOwogCX0KQEAgLTEwOSw3ICsxMDksNyBAQAogCSAqIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCiAJcHVibGljIFBhbmVWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIEFic3RyYWN0UGFuZTw/Pj4gcGFuZXMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQYW5lPD8+PiBwYW5lcywKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7CiAKIAkJdGhpcyhib29sZWFuSG9sZGVyLCBwYW5lcy5pdGVyYXRvcigpLCBkZWZhdWx0VmFsdWUpOwpAQCAtMTI0LDcgKzEyNCw3IEBACiAJICogaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKIAkgKi8KIAlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIEFic3RyYWN0UGFuZTw/Pj4gcGFuZXMpIHsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPD8gZXh0ZW5kcyBQYW5lPD8+PiBwYW5lcykgewogCiAJCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZXMsIGZhbHNlKTsKIAl9CkBAIC0xMzksMjkgKzEzOSwyOSBAQAogCSAqIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCiAJcHVibGljIFBhbmVWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPD8gZXh0ZW5kcyBBYnN0cmFjdFBhbmU8Pz4+IHBhbmVzLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKIAogCQlzdXBlcihib29sZWFuSG9sZGVyLCB3cmFwKHBhbmVzKSwgZGVmYXVsdFZhbHVlKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPElDb250cm9sSG9sZGVyPiB3cmFwKEl0ZXJhdG9yPD8gZXh0ZW5kcyBBYnN0cmFjdFBhbmU8Pz4+IHBhbmVzKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxBYnN0cmFjdFBhbmU8Pz4sIElDb250cm9sSG9sZGVyPihwYW5lcykgeworCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248Q29udHJvbEhvbGRlcj4gd3JhcChJdGVyYXRvcjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBhbmU8Pz4sIENvbnRyb2xIb2xkZXI+KHBhbmVzKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJQ29udHJvbEhvbGRlciB0cmFuc2Zvcm0oQWJzdHJhY3RQYW5lPD8+IHBhbmUpIHsKKwkJCXByb3RlY3RlZCBDb250cm9sSG9sZGVyIHRyYW5zZm9ybShQYW5lPD8+IHBhbmUpIHsKIAkJCQlyZXR1cm4gbmV3IFBhbmVIb2xkZXIocGFuZSk7CiAJCQl9CiAJCX0pOwogCX0KIAogCS8qKgotCSAqIFRoaXMgaG9sZGVyIGhvbGRzIG9udG8gYW4gPGNvZGU+QWJzdHJhY3RQYW5lPC9jb2RlPiBhbmQgdXBkYXRlIGl0cyB2aXNpYmxlCisJICogVGhpcyBob2xkZXIgaG9sZHMgb250byBhbiA8Y29kZT5QYW5lPC9jb2RlPiBhbmQgdXBkYXRlIGl0cyB2aXNpYmxlCiAJICogc3RhdGUuCiAJICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFuZUhvbGRlciBpbXBsZW1lbnRzIElDb250cm9sSG9sZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFBhbmU8Pz4gcGFuZTsKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBQYW5lSG9sZGVyIGltcGxlbWVudHMgQ29udHJvbEhvbGRlciB7CisJCXByaXZhdGUgZmluYWwgUGFuZTw/PiBwYW5lOwogCi0JCVBhbmVIb2xkZXIoQWJzdHJhY3RQYW5lPD8+IHBhbmUpIHsKKwkJUGFuZUhvbGRlcihQYW5lPD8+IHBhbmUpIHsKIAkJCXN1cGVyKCk7CiAJCQl0aGlzLnBhbmUgPSBwYW5lOwogCQl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1NXVFV0aWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvU1dUVXRpbC5qYXZhCmluZGV4IDc0MWZhMDYuLmE2MTY2ZTEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvU1dUVXRpbC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvU1dUVXRpbC5qYXZhCkBAIC0yMzIsNyArMjMyLDcgQEAKIAkJCWNvbXBvc2l0ZS5zZXRSZWRyYXcoZmFsc2UpOwogCQkJY29tcG9zaXRlID0gY29tcG9zaXRlLmdldFBhcmVudCgpOwogCi0JCQlpZiAoY29tcG9zaXRlIGluc3RhbmNlb2YgU2Nyb2xsZWRGb3JtKSB7CisJCQlpZiAoY29tcG9zaXRlIGluc3RhbmNlb2YgU2Nyb2xsZWRGb3JtIHx8IGNvbXBvc2l0ZSBpbnN0YW5jZW9mIFNoZWxsKSB7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTI1MSw3ICsyNTEsNyBAQAogCQkJY29tcG9zaXRlLnNldFJlZHJhdyh0cnVlKTsKIAkJCWNvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKIAotCQkJaWYgKGNvbXBvc2l0ZSBpbnN0YW5jZW9mIFNjcm9sbGVkRm9ybSkgeworCQkJaWYgKGNvbXBvc2l0ZSBpbnN0YW5jZW9mIFNjcm9sbGVkRm9ybSB8fCBjb21wb3NpdGUgaW5zdGFuY2VvZiBTaGVsbCkgewogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0zODcsNjggKzM4NywyNCBAQAogCXByaXZhdGUgc3RhdGljIGNsYXNzIENDb21ib0hhbmRsZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9jdXNMaXN0ZW5lciB7CiAKLQkJLyoqCi0JCSAqIFRoaXMgZmxhZyBpcyB1c2VkIHRvIHByZXZlbnQgdGhlIG1ldGhvZHMgb2YgdGhpcyBoYW5kbGVyIGZyb20KLQkJICogaW50ZXJhY3Rpbmcgd2l0aCBlYWNoIG90aGVyLgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGxvY2tlZDsKIAotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwogCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQotCQkJaWYgKGxvY2tlZCkgewotCQkJCXJldHVybjsKLQkJCX0KLQogCQkJQ0NvbWJvIGNvbWJvID0gKENDb21ibykgZS53aWRnZXQ7Ci0KKwkJCQogCQkJaWYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkgewotCQkJCWNvbWJvLnNldERhdGEoInBvcHVsYXRpbmciLCBCb29sZWFuLlRSVUUpOwotCQkJCWxvY2tlZCA9IHRydWU7Ci0KLQkJCQkvLyBUaGUgdGV4dCBoYXMgdG8gYmUgY2hhbmdlZCBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIHRoaXMKKwkJCQkvLyBUaGUgdGV4dCBzZWxlY3Rpb24gaGFzIHRvIGJlIGNoYW5nZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dCBvZiB0aGlzCiAJCQkJLy8gbGlzdGVuZXIgb3RoZXJ3aXNlIHRoZSBjb21ibyB3b24ndCB1cGRhdGUgYmVjYXVzZSBpdCdzIGN1cnJlbnRseQogCQkJCS8vIG5vdGlmeWluZyBpdHMgbGlzdGVuZXJzCi0JCQkJYXN5bmNFeGVjKG5ldyBSZW1vdmVEZWZhdWx0KGNvbWJvLCBCb29sZWFuLkZBTFNFKSk7CisJCQkJYXN5bmNFeGVjKG5ldyBTZWxlY3RUZXh0KGNvbWJvKSk7CiAJCQl9CiAJCX0KIAotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwogCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0KLQkJCWlmIChsb2NrZWQpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUNDb21ibyBjb21ibyA9IChDQ29tYm8pIGUud2lkZ2V0OwotCi0JCQlpZiAoY29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLQkJCQljb21iby5zZXREYXRhKCJwb3B1bGF0aW5nIiwgQm9vbGVhbi5UUlVFKTsKLQkJCQlsb2NrZWQgPSB0cnVlOwotCi0JCQkJdHJ5IHsKLQkJCQkJY29tYm8uc2V0VGV4dChjb21iby5nZXRJdGVtKDApKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWNvbWJvLnNldERhdGEoInBvcHVsYXRpbmciLCBCb29sZWFuLkZBTFNFKTsKLQkJCQkJbG9ja2VkID0gZmFsc2U7Ci0JCQkJfQotCQkJfQorCQkJLy9kbyBub3RoaW5nCiAJCX0KIAotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwogCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKIAotCQkJaWYgKGxvY2tlZCkgewotCQkJCXJldHVybjsKLQkJCX0KLQogCQkJQ0NvbWJvIGNvbWJvID0gKENDb21ibykgZS53aWRnZXQ7CiAKIAkJCWlmIChjb21iby5pc0ZvY3VzQ29udHJvbCgpICYmCkBAIC00NjQsNzQgKzQyMCw1MCBAQAogCQkJCQlyZXR1cm47CiAJCQkJfQogCi0JCQkJLy8gUmVtb3ZlIHRoZSBkZWZhdWx0IHZhbHVlCi0JCQkJT2JqZWN0IHBvcHVsYXRpbmcgPSBjb21iby5nZXREYXRhKCJwb3B1bGF0aW5nIik7Ci0JCQkJY29tYm8uc2V0RGF0YSgicG9wdWxhdGluZyIsIEJvb2xlYW4uVFJVRSk7Ci0JCQkJbG9ja2VkID0gdHJ1ZTsKLQogCQkJCS8vIFRoZSB0ZXh0IGhhcyB0byBiZSBjaGFuZ2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgdGhpcwogCQkJCS8vIGxpc3RlbmVyIG90aGVyd2lzZSB0aGUgY29tYm8gd29uJ3QgdXBkYXRlIGJlY2F1c2UgaXQncyBjdXJyZW50bHkKIAkJCQkvLyBub3RpZnlpbmcgaXRzIGxpc3RlbmVycwotCQkJCWFzeW5jRXhlYyhuZXcgTW9kaWZ5VGV4dChjb21ibywgcG9wdWxhdGluZykpOworCQkJCWFzeW5jRXhlYyhuZXcgTW9kaWZ5VGV4dChjb21ibykpOworCQkJfQorCQl9CisJCQorCQlwcml2YXRlIGNsYXNzIFNlbGVjdFRleHQgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisJCQlwcml2YXRlIGZpbmFsIENDb21ibyBjb21ibzsKKworCQkJcHVibGljIFNlbGVjdFRleHQoQ0NvbWJvIGNvbWJvKSB7CisJCQkJc3VwZXIoKTsKKwkJCQl0aGlzLmNvbWJvID0gY29tYm87CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlpZiAodGhpcy5jb21iby5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlTdHJpbmcgdGV4dCA9IHRoaXMuY29tYm8uZ2V0VGV4dCgpOworCQkJCXRoaXMuY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCB0ZXh0Lmxlbmd0aCgpKSk7CiAJCQl9CiAJCX0KIAogCQlwcml2YXRlIGNsYXNzIE1vZGlmeVRleHQgaW1wbGVtZW50cyBSdW5uYWJsZSB7CiAJCQlwcml2YXRlIGZpbmFsIENDb21ibyBjb21ibzsKLQkJCXByaXZhdGUgZmluYWwgT2JqZWN0IHBvcHVsYXRpbmc7CiAKLQkJCXB1YmxpYyBNb2RpZnlUZXh0KENDb21ibyBjb21ibywgT2JqZWN0IHBvcHVsYXRpbmcpIHsKKwkJCXB1YmxpYyBNb2RpZnlUZXh0KENDb21ibyBjb21ibykgewogCQkJCXN1cGVyKCk7Ci0JCQkJdGhpcy5jb21ibyAgICAgID0gY29tYm87Ci0JCQkJdGhpcy5wb3B1bGF0aW5nID0gcG9wdWxhdGluZzsKKwkJCQl0aGlzLmNvbWJvID0gY29tYm87CiAJCQl9CiAKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJCQlpZiAodGhpcy5jb21iby5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJQ0NvbWJvSGFuZGxlci50aGlzLmxvY2tlZCA9IGZhbHNlOworCQkJCQlyZXR1cm47CiAJCQkJfQotCQkJCWVsc2UgewotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHRleHQgPSB0aGlzLmNvbWJvLmdldFRleHQoKTsKKwkJCQlTdHJpbmcgdGV4dCA9IHRoaXMuY29tYm8uZ2V0VGV4dCgpOwogCi0JCQkJCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJdGV4dCA9IHRoaXMuY29tYm8uZ2V0SXRlbSgwKTsKLQkJCQkJCQl0aGlzLmNvbWJvLnNldFRleHQodGV4dCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXRoaXMuY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCB0ZXh0Lmxlbmd0aCgpKSk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQl0aGlzLmNvbWJvLnNldERhdGEoInBvcHVsYXRpbmciLCB0aGlzLnBvcHVsYXRpbmcpOwotCQkJCQkJQ0NvbWJvSGFuZGxlci50aGlzLmxvY2tlZCA9IGZhbHNlOwotCQkJCQl9CisJCQkJaWYgKHRleHQubGVuZ3RoKCkgPT0gMCkgeworCQkJCQl0ZXh0ID0gdGhpcy5jb21iby5nZXRJdGVtKDApOworCQkJCQl0aGlzLmNvbWJvLnNldFRleHQodGV4dCk7CiAJCQkJfQotCQkJfQotCQl9CiAKLQkJcHJpdmF0ZSBjbGFzcyBSZW1vdmVEZWZhdWx0IGltcGxlbWVudHMgUnVubmFibGUgewotCQkJcHJpdmF0ZSBmaW5hbCBDQ29tYm8gY29tYm87Ci0JCQlwcml2YXRlIGZpbmFsIE9iamVjdCBwb3B1bGF0aW5nOwotCi0JCQlwdWJsaWMgUmVtb3ZlRGVmYXVsdChDQ29tYm8gY29tYm8sIE9iamVjdCBwb3B1bGF0aW5nKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCQl0aGlzLmNvbWJvICAgICAgPSBjb21ibzsKLQkJCQl0aGlzLnBvcHVsYXRpbmcgPSBwb3B1bGF0aW5nOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKHRoaXMuY29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCUNDb21ib0hhbmRsZXIudGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl0aGlzLmNvbWJvLnNldFRleHQoIiIpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJdGhpcy5jb21iby5zZXREYXRhKCJwb3B1bGF0aW5nIiwgdGhpcy5wb3B1bGF0aW5nKTsKLQkJCQkJCUNDb21ib0hhbmRsZXIudGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KKwkJCQl0aGlzLmNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgdGV4dC5sZW5ndGgoKSkpOwogCQkJfQogCQl9CiAJfQpAQCAtNTQ0LDE0MCArNDc2LDcyIEBACiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tYm9IYW5kbGVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9jdXNMaXN0ZW5lciB7CiAKLQkJLyoqCi0JCSAqIFRoaXMgZmxhZyBpcyB1c2VkIHRvIHByZXZlbnQgdGhlIG1ldGhvZHMgb2YgdGhpcyBoYW5kbGVyIGZyb20KLQkJICogaW50ZXJhY3Rpbmcgd2l0aCBlYWNoIG90aGVyLgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGxvY2tlZDsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwogCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQotCQkJaWYgKGxvY2tlZCkgewotCQkJCXJldHVybjsKLQkJCX0KLQogCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGUud2lkZ2V0OwogCi0JCQlpZiAoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwKSB7Ci0JCQkJY29tYm8uc2V0RGF0YSgicG9wdWxhdGluZyIsIEJvb2xlYW4uVFJVRSk7Ci0JCQkJbG9ja2VkID0gdHJ1ZTsKLQotCQkJCS8vIFRoZSB0ZXh0IGhhcyB0byBiZSBjaGFuZ2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgdGhpcworCQkJaWYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkgewkKKwkJCQkvLyBUaGUgdGV4dCBzZWxlY3Rpb24gaGFzIHRvIGJlIGNoYW5nZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dCBvZiB0aGlzCiAJCQkJLy8gbGlzdGVuZXIgb3RoZXJ3aXNlIHRoZSBjb21ibyB3b24ndCB1cGRhdGUgYmVjYXVzZSBpdCdzIGN1cnJlbnRseQogCQkJCS8vIG5vdGlmeWluZyBpdHMgbGlzdGVuZXJzCi0JCQkJYXN5bmNFeGVjKG5ldyBSZW1vdmVEZWZhdWx0KGNvbWJvLCBCb29sZWFuLkZBTFNFKSk7CisJCQkJYXN5bmNFeGVjKG5ldyBTZWxlY3RUZXh0KGNvbWJvKSk7CiAJCQl9CiAJCX0KIAotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwogCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0KLQkJCWlmIChsb2NrZWQpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBlLndpZGdldDsKLQotCQkJaWYgKGNvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY29tYm8uc2V0RGF0YSgicG9wdWxhdGluZyIsIEJvb2xlYW4uVFJVRSk7Ci0JCQkJbG9ja2VkID0gdHJ1ZTsKLQotCQkJCXRyeSB7Ci0JCQkJCWNvbWJvLnNlbGVjdCgwKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWNvbWJvLnNldERhdGEoInBvcHVsYXRpbmciLCBCb29sZWFuLkZBTFNFKTsKLQkJCQkJbG9ja2VkID0gZmFsc2U7Ci0JCQkJfQotCQkJfQorCQkJLy9kbyBub3RoaW5nCiAJCX0KIAotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwogCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKIAotCQkJaWYgKGxvY2tlZCkgewotCQkJCXJldHVybjsKLQkJCX0KLQogCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGUud2lkZ2V0OwogCiAJCQlpZiAoY29tYm8uaXNGb2N1c0NvbnRyb2woKSAmJgogCQkJICAgIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkgewogCi0JCQkJT2JqZWN0IHBvcHVsYXRpbmcgPSBjb21iby5nZXREYXRhKCJwb3B1bGF0aW5nIik7Ci0JCQkJY29tYm8uc2V0RGF0YSgicG9wdWxhdGluZyIsIEJvb2xlYW4uVFJVRSk7Ci0JCQkJbG9ja2VkID0gdHJ1ZTsKLQogCQkJCS8vIFRoZSB0ZXh0IGhhcyB0byBiZSBjaGFuZ2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgdGhpcwogCQkJCS8vIGxpc3RlbmVyIG90aGVyd2lzZSB0aGUgY29tYm8gd29uJ3QgdXBkYXRlIGJlY2F1c2UgaXQncyBjdXJyZW50bHkKIAkJCQkvLyBub3RpZnlpbmcgaXRzIGxpc3RlbmVycwotCQkJCWFzeW5jRXhlYyhuZXcgTW9kaWZ5VGV4dChjb21ibywgcG9wdWxhdGluZykpOworCQkJCWFzeW5jRXhlYyhuZXcgTW9kaWZ5VGV4dChjb21ibykpOwogCQkJfQogCQl9CiAKIAkJcHJpdmF0ZSBjbGFzcyBNb2RpZnlUZXh0IGltcGxlbWVudHMgUnVubmFibGUgewogCQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBjb21ibzsKLQkJCXByaXZhdGUgZmluYWwgT2JqZWN0IHBvcHVsYXRpbmc7CiAKLQkJCXB1YmxpYyBNb2RpZnlUZXh0KENvbWJvIGNvbWJvLCBPYmplY3QgcG9wdWxhdGluZykgeworCQkJcHVibGljIE1vZGlmeVRleHQoQ29tYm8gY29tYm8pIHsKIAkJCQlzdXBlcigpOwotCQkJCXRoaXMuY29tYm8gICAgICA9IGNvbWJvOwotCQkJCXRoaXMucG9wdWxhdGluZyA9IHBvcHVsYXRpbmc7CisJCQkJdGhpcy5jb21ibyA9IGNvbWJvOwogCQkJfQogCiAJCQlwdWJsaWMgdm9pZCBydW4oKSB7CiAJCQkJaWYgKHRoaXMuY29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCUNvbWJvSGFuZGxlci50aGlzLmxvY2tlZCA9IGZhbHNlOworCQkJCQlyZXR1cm47CiAJCQkJfQotCQkJCWVsc2UgewotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHRleHQgPSB0aGlzLmNvbWJvLmdldFRleHQoKTsKKwkJCQlTdHJpbmcgdGV4dCA9IHRoaXMuY29tYm8uZ2V0VGV4dCgpOwogCi0JCQkJCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJdGV4dCA9IHRoaXMuY29tYm8uZ2V0SXRlbSgwKTsKLQkJCQkJCQl0aGlzLmNvbWJvLnNldFRleHQodGV4dCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXRoaXMuY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCB0ZXh0Lmxlbmd0aCgpKSk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQl0aGlzLmNvbWJvLnNldERhdGEoInBvcHVsYXRpbmciLCB0aGlzLnBvcHVsYXRpbmcpOwotCQkJCQkJQ29tYm9IYW5kbGVyLnRoaXMubG9ja2VkID0gZmFsc2U7Ci0JCQkJCX0KKwkJCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCXRleHQgPSB0aGlzLmNvbWJvLmdldEl0ZW0oMCk7CisJCQkJCXRoaXMuY29tYm8uc2V0VGV4dCh0ZXh0KTsKIAkJCQl9CisKKwkJCQl0aGlzLmNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgdGV4dC5sZW5ndGgoKSkpOwogCQkJfQogCQl9CiAKLQkJcHJpdmF0ZSBjbGFzcyBSZW1vdmVEZWZhdWx0IGltcGxlbWVudHMgUnVubmFibGUgeworCQlwcml2YXRlIGNsYXNzIFNlbGVjdFRleHQgaW1wbGVtZW50cyBSdW5uYWJsZSB7CiAJCQlwcml2YXRlIGZpbmFsIENvbWJvIGNvbWJvOwotCQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgcG9wdWxhdGluZzsKIAotCQkJcHVibGljIFJlbW92ZURlZmF1bHQoQ29tYm8gY29tYm8sIE9iamVjdCBwb3B1bGF0aW5nKSB7CisJCQlwdWJsaWMgU2VsZWN0VGV4dChDb21ibyBjb21ibykgewogCQkJCXN1cGVyKCk7Ci0JCQkJdGhpcy5jb21ibyAgICAgID0gY29tYm87Ci0JCQkJdGhpcy5wb3B1bGF0aW5nID0gcG9wdWxhdGluZzsKKwkJCQl0aGlzLmNvbWJvID0gY29tYm87CiAJCQl9CiAKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJCQlpZiAodGhpcy5jb21iby5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJQ29tYm9IYW5kbGVyLnRoaXMubG9ja2VkID0gZmFsc2U7CisJCQkJCXJldHVybjsKIAkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl0aGlzLmNvbWJvLnNldFRleHQoIiIpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJdGhpcy5jb21iby5zZXREYXRhKCJwb3B1bGF0aW5nIiwgdGhpcy5wb3B1bGF0aW5nKTsKLQkJCQkJCUNvbWJvSGFuZGxlci50aGlzLmxvY2tlZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQorCQkJCVN0cmluZyB0ZXh0ID0gdGhpcy5jb21iby5nZXRUZXh0KCk7CisJCQkJdGhpcy5jb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIHRleHQubGVuZ3RoKCkpKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvU3RhdGVDb250cm9sbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1N0YXRlQ29udHJvbGxlci5qYXZhCmluZGV4IDZhYzMzNGEuLjc2NzU5ZmEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvU3RhdGVDb250cm9sbGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9TdGF0ZUNvbnRyb2xsZXIuamF2YQpAQCAtNDcsMTAgKzQ3LDEwIEBACiAJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcjsKIAogCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPklDb250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2Ugc3RhdGUgaXMga2VwdCBpbiBzeW5jCisJICogVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlIHN0YXRlIGlzIGtlcHQgaW4gc3luYwogCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUuCiAJICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPElDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVyczsKKwlwcml2YXRlIENvbGxlY3Rpb248Q29udHJvbEhvbGRlcj4gY29udHJvbEhvbGRlcnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgc3RhdGU7IGZvciB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCkBAIC03MSwxMSArNzEsMTEgQEAKIAkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCiAJICoKIAkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+SUNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZQorCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2UKIAkgKiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQogCSAqLwogCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJQ29udHJvbEhvbGRlcj4gY29udHJvbEhvbGRlcnMpIHsKKwkgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycykgewogCiAJCXRoaXMoYm9vbGVhbkhvbGRlciwgY29udHJvbEhvbGRlcnMsIGZhbHNlKTsKIAl9CkBAIC04NSwxMyArODUsMTMgQEAKIAkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCiAJICoKIAkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+SUNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZQorCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2UKIAkgKiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQogCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCiAJICogPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KIAlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIENvbGxlY3Rpb248SUNvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzLAorCSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPENvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzLAogCSAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewogCiAJCXRoaXMoKTsKQEAgLTEwMywxMSArMTAzLDExIEBACiAJICogPGNvZGU+ZmFsc2U8L2NvZGU+LgogCSAqCiAJICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXIgVGhlIDxjb2RlPklDb250cm9sSG9sZGVyPC9jb2RlPiB3aG9zZSBzdGF0ZSBpcyBrZXB0CisJICogQHBhcmFtIGNvbnRyb2xIb2xkZXIgVGhlIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+IHdob3NlIHN0YXRlIGlzIGtlcHQKIAkgKiBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKIAkgKi8KIAlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIElDb250cm9sSG9sZGVyIGNvbnRyb2xIb2xkZXIpIHsKKwkgICAgICAgICAgICAgICAgQ29udHJvbEhvbGRlciBjb250cm9sSG9sZGVyKSB7CiAKIAkJdGhpcyhib29sZWFuSG9sZGVyLCBjb250cm9sSG9sZGVyLCBmYWxzZSk7CiAJfQpAQCAtMTE3LDExICsxMTcsMTEgQEAKIAkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCiAJICoKIAkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+SUNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZQorCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2UKIAkgKiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQogCSAqLwogCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgSUNvbnRyb2xIb2xkZXIuLi4gY29udHJvbEhvbGRlcnMpIHsKKwkgICAgICAgICAgICAgICAgQ29udHJvbEhvbGRlci4uLiBjb250cm9sSG9sZGVycykgewogCiAJCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oY29udHJvbEhvbGRlcnMpLCBmYWxzZSk7CiAJfQpAQCAtMTMxLDI5ICsxMzEsMjkgQEAKIAkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCiAJICoKIAkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlciBUaGUgPGNvZGU+SUNvbnRyb2xIb2xkZXI8L2NvZGU+IHdob3NlIHN0YXRlIGlzIGtlcHQKKwkgKiBAcGFyYW0gY29udHJvbEhvbGRlciBUaGUgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT4gd2hvc2Ugc3RhdGUgaXMga2VwdAogCSAqIGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQogCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCiAJICogPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KIAlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIElDb250cm9sSG9sZGVyIGNvbnRyb2xIb2xkZXIsCisJICAgICAgICAgICAgICAgIENvbnRyb2xIb2xkZXIgY29udHJvbEhvbGRlciwKIAkgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKIAotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIG5ldyBJQ29udHJvbEhvbGRlcltdIHsgY29udHJvbEhvbGRlciB9LCBmYWxzZSk7CisJCXRoaXMoYm9vbGVhbkhvbGRlciwgbmV3IENvbnRyb2xIb2xkZXJbXSB7IGNvbnRyb2xIb2xkZXIgfSwgZmFsc2UpOwogCX0KIAogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPi4KIAkgKgogCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5JQ29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlCisJICogQHBhcmFtIGNvbnRyb2xIb2xkZXJzIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZQogCSAqIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCiAJICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKIAkgKiA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwogCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgSUNvbnRyb2xIb2xkZXJbXSBjb250cm9sSG9sZGVycywKKwkgICAgICAgICAgICAgICAgQ29udHJvbEhvbGRlcltdIGNvbnRyb2xIb2xkZXJzLAogCSAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewogCiAJCXRoaXMoKTsKQEAgLTE2NiwxMSArMTY2LDExIEBACiAJICoKIAkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKIAkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgQW4gaXRlcmF0b3Igb24gdGhlIGNvbGxlY3Rpb24gb2YKLQkgKiA8Y29kZT5JQ29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuCisJICogPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuCiAJICogaG9sZGVyJ3MgdmFsdWUKIAkgKi8KIAlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIEl0ZXJhdG9yPElDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycykgeworCSAgICAgICAgICAgICAgICBJdGVyYXRvcjxDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycykgewogCiAJCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oY29udHJvbEhvbGRlcnMpLCBmYWxzZSk7CiAJfQpAQCAtMTgwLDEzICsxODAsMTMgQEAKIAkgKgogCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAogCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZgotCSAqIDxjb2RlPklDb250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2Ugc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4KKwkgKiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2Ugc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4KIAkgKiBob2xkZXIncyB2YWx1ZQogCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCiAJICogPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KIAlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIEl0ZXJhdG9yPElDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycywKKwkgICAgICAgICAgICAgICAgSXRlcmF0b3I8Q29udHJvbEhvbGRlcj4gY29udHJvbEhvbGRlcnMsCiAJICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7CiAKIAkJdGhpcygpOwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJICogdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4KIAkgKi8KIAlwcm90ZWN0ZWQgYm9vbGVhbiBib29sZWFuVmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB2YWx1ZTsKKwkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IHRoaXMuZGVmYXVsdFZhbHVlIDogdmFsdWUuYm9vbGVhblZhbHVlKCk7CiAJfQogCiAJLyoqCkBAIC0yMzEsNyArMjMxLDcgQEAKIAlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkgewogCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CiAJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZVN0YXRlKGJvb2xlYW5WYWx1ZShib29sZWFuSG9sZGVyLmdldFZhbHVlKCkpKTsKKwkJCQl1cGRhdGVTdGF0ZSgpOwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKQEAgLTI0MywxMiArMjQzLDEyIEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIGFuIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPiBvdmVyIHRoZSBjb2xsZWN0aW9uIG9mCi0JICogPGNvZGU+SUNvbnRyb2xIb2xkZXI8L2NvZGU+cy4KKwkgKiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMuCiAJICoKLQkgKiBAcmV0dXJuIFRoZSBpdGVyYXRpb24gb2YgPGNvZGU+SUNvbnRyb2xIb2xkZXI8L2NvZGU+cworCSAqIEByZXR1cm4gVGhlIGl0ZXJhdGlvbiBvZiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMKIAkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSXRlcmF0b3I8SUNvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8SUNvbnRyb2xIb2xkZXI+KHRoaXMuY29udHJvbEhvbGRlcnMpOworCXByb3RlY3RlZCBmaW5hbCBJdGVyYXRvcjxDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPENvbnRyb2xIb2xkZXI+KHRoaXMuY29udHJvbEhvbGRlcnMpOwogCX0KIAogCS8qKgpAQCAtMjYzLDE5ICsyNjMsMTkgQEAKIAkgKiBJbml0aWFsaXplcyB0aGlzIDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gd2l0aCB0aGUgZ2l2ZW4gc3RhdGUuCiAJICoKIAkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgQSA8Y29kZT5JQ29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlIGVuYWJsZW1lbnQgc3RhdGUKKwkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgQSA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2UgZW5hYmxlbWVudCBzdGF0ZQogCSAqIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCiAJICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKIAkgKiA8Y29kZT5udWxsPC9jb2RlPgogCSAqLwogCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JCQkJCQkJCQkgIENvbGxlY3Rpb248SUNvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzLAorCQkJCQkJCQkJICBDb2xsZWN0aW9uPENvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzLAogCQkJCQkJCQkJICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewogCiAJCUFzc2VydC5pc05vdE51bGwoYm9vbGVhbkhvbGRlciwgICJUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHZhbHVlIGNhbm5vdCBiZSBudWxsIik7CiAJCUFzc2VydC5pc05vdE51bGwoY29udHJvbEhvbGRlcnMsICJUaGUgY29sbGVjdGlvbiBvZiBDb250cm9sSG9sZGVycyBjYW5ub3QgYmUgbnVsbCIpOwogCi0JCXRoaXMuY29udHJvbEhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PElDb250cm9sSG9sZGVyPihjb250cm9sSG9sZGVycyk7CisJCXRoaXMuY29udHJvbEhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PENvbnRyb2xIb2xkZXI+KGNvbnRyb2xIb2xkZXJzKTsKIAkJdGhpcy5kZWZhdWx0VmFsdWUgICA9IGRlZmF1bHRWYWx1ZTsKIAkJdGhpcy5ib29sZWFuSG9sZGVyICA9IGJvb2xlYW5Ib2xkZXI7CiAKQEAgLTI5MSw3ICsyOTEsNyBAQAogCSAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sIGhvbGRlcnMuCiAJICovCiAJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdGUoKSB7Ci0JCXRoaXMudXBkYXRlU3RhdGUoYm9vbGVhblZhbHVlKGJvb2xlYW5Ib2xkZXIuZ2V0VmFsdWUoKSkpOworCQl0aGlzLnVwZGF0ZVN0YXRlKGJvb2xlYW5WYWx1ZSh0aGlzLmJvb2xlYW5Ib2xkZXIuZ2V0VmFsdWUoKSkpOwogCX0KIAogCS8qKgpAQCAtMzAwLDcgKzMwMCw3IEBACiAJICogQHBhcmFtIHN0YXRlIFRoZSBuZXcgc3RhdGUgdGhlIHdpZGdldHMgbmVlZCB0byBoYXZlCiAJICovCiAJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdGUoYm9vbGVhbiBzdGF0ZSkgewotCQlmb3IgKElDb250cm9sSG9sZGVyIGNvbnRyb2xIb2xkZXIgOiB0aGlzLmNvbnRyb2xIb2xkZXJzKSB7CisJCWZvciAoQ29udHJvbEhvbGRlciBjb250cm9sSG9sZGVyIDogdGhpcy5jb250cm9sSG9sZGVycykgewogCQkJY29udHJvbEhvbGRlci51cGRhdGVTdGF0ZShzdGF0ZSk7CiAJCX0KIAl9CkBAIC0zMDgsNyArMzA4LDcgQEAKIAkvKioKIAkgKiBUaGUgaG9sZGVyIG9mIHRoZSBhY3R1YWwgd2lkZ2V0LgogCSAqLwotCXN0YXRpYyBpbnRlcmZhY2UgSUNvbnRyb2xIb2xkZXIgeworCXN0YXRpYyBpbnRlcmZhY2UgQ29udHJvbEhvbGRlciB7CiAKIAkJLyoqCiAJCSAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSB3cmFwcGVkIGNvbnRyb2wuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEKaW5kZXggYTAzN2IxMi4uMmQ1ZDNlNiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9UYWJsZUxheW91dENvbXBvc2l0ZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvVGFibGVMYXlvdXRDb21wb3NpdGUuamF2YQpAQCAtOCwxNSArOCwxMiBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKy8vIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS51dGlsLlRhYmxlTGF5b3V0Q29tcG9zaXRlCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGF5b3V0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtblBpeGVsRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7CkBAIC0yNiwxMiArMjMsMTkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxheW91dERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5QaXhlbERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOworCiAvKioKICAqIEEgc3BlY2lhbCBjb21wb3NpdGUgdG8gbGF5b3V0IGNvbHVtbnMgaW5zaWRlIGEgdGFibGUuIFRoZSBjb21wb3NpdGUgaXMgbmVlZGVkIHNpbmNlIHdlIGhhdmUKICAqIHRvIGxheW91dCB0aGUgY29sdW1ucyAiYmVmb3JlIiB0aGUgYWN0dWFsIHRhYmxlIGdldHMgbGF5b3V0ZWQuIEhlbmNlIHdlIGNhbid0IHVzZSBhIG5vcm1hbAogICogbGF5b3V0IG1hbmFnZXIuCi0gKgotICogY29waWVkIGZyb20gamR0LmludGVybmFsLnVpLnV0aWwKKyAqIDxwPgorICogWFhYOiBTaG91bGQgc3dpdGNoIHRvIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LlRhYmxlQ29sdW1uTGF5b3V0fS4KKyAqIDwvcD4KICAqLwogcHVibGljIGNsYXNzIFRhYmxlTGF5b3V0Q29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKIApAQCAtMzksMjEgKzQzLDM1IEBACiAJICogVGhlIG51bWJlciBvZiBleHRyYSBwaXhlbHMgdGFrZW4gYXMgaG9yaXpvbnRhbCB0cmltIGJ5IHRoZSB0YWJsZSBjb2x1bW4uCiAJICogVG8gZW5zdXJlIHRoZXJlIGFyZSBOIHBpeGVscyBhdmFpbGFibGUgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4sCiAJICogYXNzaWduIE4rQ09MVU1OX1RSSU0gZm9yIHRoZSBjb2x1bW4gd2lkdGguCisJICogPHA+CisJICogWFhYOiBTaG91bGQgZWl0aGVyIHN3aXRjaCB0byB1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5UYWJsZUNvbHVtbkxheW91dH0gb3IgZ2V0IEFQSSBmcm9tIEpGYWNlIG9yIFNXVCwgc2VlOiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE4NDgzCisJICogPC9wPgogCSAqCiAJICogQHNpbmNlIDMuMQogCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBDT0xVTU5fVFJJTSA9ICJjYXJib24iLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSkgPyAyNCA6IDM7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBpbnQgQ09MVU1OX1RSSU07CisJc3RhdGljIHsKKwkJU3RyaW5nIHBsYXRmb3JtPSBTV1QuZ2V0UGxhdGZvcm0oKTsKKwkJaWYgKCJ3aW4zMiIuZXF1YWxzKHBsYXRmb3JtKSkgLy8kTk9OLU5MUy0xJAorCQkJQ09MVU1OX1RSSU09IDQ7CisJCWVsc2UgaWYgKCJjYXJib24iLmVxdWFscyhwbGF0Zm9ybSkpIC8vJE5PTi1OTFMtMSQKKwkJCUNPTFVNTl9UUklNPSAyNDsKKwkJZWxzZQorCQkJQ09MVU1OX1RSSU09IDM7CisJfQogCi0JcHJpdmF0ZSBMaXN0PENvbHVtbkxheW91dERhdGE+IGNvbHVtbnM9IG5ldyBBcnJheUxpc3Q8Q29sdW1uTGF5b3V0RGF0YT4oKTsKKwlwcml2YXRlIExpc3QgY29sdW1ucz0gbmV3IEFycmF5TGlzdCgpOwogCiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYWJsZUxheW91dENvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCisJICogQHBhcmFtIHN0eWxlIHRoZSBTV1Qgc3R5bGUKIAkgKi8KIAlwdWJsaWMgVGFibGVMYXlvdXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7CiAJCXN1cGVyKHBhcmVudCwgc3R5bGUpOwogICAgICAgICBhZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7CiAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGFyZWE9IGdldENsaWVudEFyZWEoKTsKICAgICAgICAgICAgICAgICBUYWJsZSB0YWJsZT0gKFRhYmxlKWdldENoaWxkcmVuKClbMF07CiAgICAgICAgICAgICAgICAgUG9pbnQgcHJlZmVycmVkU2l6ZT0gY29tcHV0ZVRhYmxlU2l6ZSh0YWJsZSk7CkBAIC04Niw3ICsxMDQsNyBAQAogCQlpbnQgd2lkdGg9IDA7CiAJCWludCBzaXplPSBjb2x1bW5zLnNpemUoKTsKIAkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7ICsraSkgewotCQkJQ29sdW1uTGF5b3V0RGF0YSBsYXlvdXREYXRhPSBjb2x1bW5zLmdldChpKTsKKwkJCUNvbHVtbkxheW91dERhdGEgbGF5b3V0RGF0YT0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwogCQkJaWYgKGxheW91dERhdGEgaW5zdGFuY2VvZiBDb2x1bW5QaXhlbERhdGEpIHsKIAkJCQlDb2x1bW5QaXhlbERhdGEgY29sPSAoQ29sdW1uUGl4ZWxEYXRhKSBsYXlvdXREYXRhOwogCQkJCXdpZHRoICs9IGNvbC53aWR0aDsKQEAgLTEyMiw3ICsxNDAsNyBAQAogCiAJCS8vIEZpcnN0IGNhbGMgc3BhY2Ugb2NjdXBpZWQgYnkgZml4ZWQgY29sdW1ucwogCQlmb3IgKGludCBpPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlDb2x1bW5MYXlvdXREYXRhIGNvbD0gY29sdW1ucy5nZXQoaSk7CisJCQlDb2x1bW5MYXlvdXREYXRhIGNvbD0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwogCQkJaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtblBpeGVsRGF0YSkgewogCQkJCUNvbHVtblBpeGVsRGF0YSBjcGQ9IChDb2x1bW5QaXhlbERhdGEpIGNvbDsKIAkJCQlpbnQgcGl4ZWxzPSBjcGQud2lkdGg7CkBAIC0xNDksNyArMTY3LDcgQEAKIAkJCWludCByZXN0PSB3aWR0aCAtIGZpeGVkV2lkdGg7CiAJCQlpbnQgdG90YWxEaXN0cmlidXRlZD0gMDsKIAkJCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJCQlDb2x1bW5MYXlvdXREYXRhIGNvbD0gY29sdW1ucy5nZXQoaSk7CisJCQkJQ29sdW1uTGF5b3V0RGF0YSBjb2w9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKIAkJCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewogCQkJCQlDb2x1bW5XZWlnaHREYXRhIGN3PSAoQ29sdW1uV2VpZ2h0RGF0YSkgY29sOwogCQkJCQkvLyBjYWxjdWxhdGUgd2VpZ2h0IGFzIGFib3ZlCkBAIC0xNjgsNyArMTg2LDcgQEAKIAkJCWZvciAoaW50IGk9IDA7IGRpZmYgPiAwOyArK2kpIHsKIAkJCQlpZiAoaSA9PSBzaXplKQogCQkJCQlpPSAwOwotCQkJCUNvbHVtbkxheW91dERhdGEgY29sPSBjb2x1bW5zLmdldChpKTsKKwkJCQlDb2x1bW5MYXlvdXREYXRhIGNvbD0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwogCQkJCWlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7CiAJCQkJCSsrd2lkdGhzW2ldOwogCQkJCQktLWRpZmY7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L0FzeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L0FzeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1NzM0NAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29tbWFuZFJ1bm5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CisKKy8qKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBDb21tYW5kRXhlY3V0b3IgY2FuIGJlIHVzZWQgYnkgYSBub24tVUkKKyAqIHRocmVhZCB0byBhc3luY2hyb25vdXNseSBtb2RpZnkgYSBKUEEgcHJvamVjdCB3aXRoIGFueSBvYmplY3RzIGFzc29jaWF0ZWQKKyAqIHdpdGggZG9jdW1lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5ZWQgaW4gdGhlIFVJLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IKKwlpbXBsZW1lbnRzIENvbW1hbmRFeGVjdXRvcgoreworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tbWFuZEV4ZWN1dG9yIElOU1RBTkNFID0gbmV3IEFzeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yKCk7CisKKwlwdWJsaWMgc3RhdGljIENvbW1hbmRFeGVjdXRvciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKKwlwcml2YXRlIEFzeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7CisJCXRoaXMuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyh0aGlzLmJ1aWxkUnVubmFibGUoY29tbWFuZCkpOworCX0KKworCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShDb21tYW5kIGNvbW1hbmQpIHsKKwkJcmV0dXJuIG5ldyBDb21tYW5kUnVubmFibGUoY29tbWFuZCk7CisJfQorCisJcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7CisJCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOworCQlyZXR1cm4gKGRpc3BsYXkgIT0gbnVsbCkgPyBkaXNwbGF5IDogRGlzcGxheS5nZXREZWZhdWx0KCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L1N5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvU3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZDE1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L1N5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29tbWFuZFJ1bm5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CisKKy8qKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBDb21tYW5kRXhlY3V0b3IgY2FuIGJlIHVzZWQgYnkgYSBub24tVUkKKyAqIHRocmVhZCB0byBzeW5jaHJvbm91c2x5IG1vZGlmeSBhIEpQQSBwcm9qZWN0IHdpdGggYW55IG9iamVjdHMgYXNzb2NpYXRlZAorICogd2l0aCBkb2N1bWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXllZCBpbiB0aGUgVUkuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yCisJaW1wbGVtZW50cyBDb21tYW5kRXhlY3V0b3IKK3sKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmRFeGVjdXRvciBJTlNUQU5DRSA9IG5ldyBTeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yKCk7CisKKwlwdWJsaWMgc3RhdGljIENvbW1hbmRFeGVjdXRvciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKKwlwcml2YXRlIFN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKKwkJdGhpcy5nZXREaXNwbGF5KCkuc3luY0V4ZWModGhpcy5idWlsZFJ1bm5hYmxlKGNvbW1hbmQpKTsKKwl9CisKKwlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoQ29tbWFuZCBjb21tYW5kKSB7CisJCXJldHVybiBuZXcgQ29tbWFuZFJ1bm5hYmxlKGNvbW1hbmQpOworCX0KKworCXByaXZhdGUgRGlzcGxheSBnZXREaXNwbGF5KCkgeworCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKKwkJcmV0dXJuIChkaXNwbGF5ICE9IG51bGwpID8gZGlzcGxheSA6IERpc3BsYXkuZ2V0RGVmYXVsdCgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTFlYjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9BYnN0cmFjdExpc3RXaWRnZXRBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7CisKKy8qKgorICogQWxsIHRoZSAibGlzdCB3aWRnZXRzIiBhcmUgc3ViY2xhc3NlcyBvZiB7QGxpbmsgV2lkZ2V0fTsgc28gd2UgY2FuIHByb3ZpZGUKKyAqIGEgc21pZGdlbiBvZiBjb21tb24gYmVoYXZpb3IgaGVyZS4KKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlcjxXIGV4dGVuZHMgV2lkZ2V0PgorCWltcGxlbWVudHMgTGlzdFdpZGdldE1vZGVsQmluZGluZy5MaXN0V2lkZ2V0Cit7CisJZmluYWwgVyB3aWRnZXQ7CisKKwlBYnN0cmFjdExpc3RXaWRnZXRBZGFwdGVyKFcgd2lkZ2V0KSB7CisJCXN1cGVyKCk7CisJCXRoaXMud2lkZ2V0ID0gd2lkZ2V0OworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7CisJCXJldHVybiB0aGlzLndpZGdldC5pc0Rpc3Bvc2VkKCk7CisJfQorCisJcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCQl0aGlzLndpZGdldC5hZGREaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZURpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJdGhpcy53aWRnZXQucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKKwl9CisKK30KKwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MmZlYTkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuQnV0dG9uTW9kZWxCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwxOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworCisvKioKKyAqIFRoaXMgYmluZGluZyBjYW4gYmUgdXNlZCB0byBrZWVwIGEgY2hlY2stYm94LCB0b2dnbGUgYnV0dG9uLCBvciByYWRpbyBidXR0b24KKyAqICJzZWxlY3Rpb24iIHN5bmNocm9uaXplZCB3aXRoIGEgbW9kZWwgYm9vbGVhbi4KKyAqIAorICogQHNlZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbAorICogQHNlZSBCdXR0b24KKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitmaW5hbCBjbGFzcyBCb29sZWFuQnV0dG9uTW9kZWxCaW5kaW5nIHsKKworCS8vICoqKioqIG1vZGVsCisJLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgYm9vbGVhbi4gKi8KKwlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXI7CisKKwkvKioKKwkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBidXR0b24ncyBzZWxlY3Rpb24gc3RhdGUgd2l0aAorCSAqIHRoZSBtb2RlbCBib29sZWFuLgorCSAqLworCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBib29sZWFuQ2hhbmdlTGlzdGVuZXI7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgY2hlY2stYm94L3RvZ2dsZSBidXR0b24vcmFkaW8gYnV0dG9uOworCSAqIGZvciB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIFRoZSBkZWZhdWx0IFtkZWZhdWx0IHZhbHVlXSBpcyA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gdGhlIGNoZWNrLWJveAorCSAqIGlzIHVuY2hlY2tlZC90b2dnbGUgYnV0dG9uIHBvcHBlZCBvdXQvcmFkaW8gYnV0dG9uIHVuY2hlY2tlZCkuCisJICovCisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGRlZmF1bHRWYWx1ZTsKKworCS8vICoqKioqIFVJCisJLyoqIFRoZSBjaGVjay1ib3gvdG9nZ2xlIGJ1dHRvbi9yYWRpbyBidXR0b24gd2Ugc3luY2hyb25pemUgd2l0aCB0aGUgbW9kZWwgYm9vbGVhbi4gKi8KKwlwcml2YXRlIGZpbmFsIEJ1dHRvbiBidXR0b247CisKKwkvKioKKwkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBtb2RlbCBib29sZWFuIHdpdGgKKwkgKiB0aGUgYnV0dG9uJ3Mgc2VsZWN0aW9uIHN0YXRlLgorCSAqLworCXByaXZhdGUgZmluYWwgU2VsZWN0aW9uTGlzdGVuZXIgYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXI7CisKKwkvKioKKwkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHN0dWZmIHdoZW4gdGhlIGJ1dHRvbgorCSAqIGlzIGRpc3Bvc2VkLiAoQ3JpdGljYWwgZm9yIHByZXZlbnRpbmcgbWVtb3J5IGxlYWtzLikKKwkgKi8KKwlwcml2YXRlIGZpbmFsIERpc3Bvc2VMaXN0ZW5lciBidXR0b25EaXNwb3NlTGlzdGVuZXI7CisKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgorCisJLyoqCisJICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgYW5kIGJ1dHRvbiBhcmUgcmVxdWlyZWQuCisJICovCisJQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZyhXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBCdXR0b24gYnV0dG9uLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgeworCQlzdXBlcigpOworCQlpZiAoKGJvb2xlYW5Ib2xkZXIgPT0gbnVsbCkgfHwgKGJ1dHRvbiA9PSBudWxsKSkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy5ib29sZWFuSG9sZGVyID0gYm9vbGVhbkhvbGRlcjsKKwkJdGhpcy5idXR0b24gPSBidXR0b247CisJCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOworCisJCXRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpOworCQl0aGlzLmJvb2xlYW5Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKKworCQl0aGlzLmJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCk7CisJCXRoaXMuYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOworCisJCXRoaXMuYnV0dG9uRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZEJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcigpOworCQl0aGlzLmJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy5idXR0b25EaXNwb3NlTGlzdGVuZXIpOworCisJCXRoaXMuc2V0QnV0dG9uU2VsZWN0aW9uKHRoaXMuYm9vbGVhbkhvbGRlci5nZXRWYWx1ZSgpKTsKKwl9CisKKworCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZy50aGlzLmJvb2xlYW5DaGFuZ2VkKGV2ZW50KTsKKwkJCX0KKwkJICAgIEBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gImJvb2xlYW4gbGlzdGVuZXIiOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQkJCUJvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcudGhpcy5idXR0b25TZWxlY3RlZChldmVudCk7CisJCQl9CisJCSAgICBAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJidXR0b24gc2VsZWN0aW9uIGxpc3RlbmVyIjsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIERpc3Bvc2VMaXN0ZW5lciBidWlsZEJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKKwkJCQlCb29sZWFuQnV0dG9uTW9kZWxCaW5kaW5nLnRoaXMuYnV0dG9uRGlzcG9zZWQoZXZlbnQpOworCQkJfQorCQkgICAgQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiYnV0dG9uIGRpc3Bvc2UgbGlzdGVuZXIiOworCQkJfQorCQl9OworCX0KKworCisJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCisKKwkvKioKKwkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgYnV0dG9uLgorCSAqIElmIHRoZSBuZXcgbW9kZWwgdmFsdWUgaXMgbnVsbCwgdXNlIHRoZSBiaW5kaW5nJ3MgZGVmYXVsdCB2YWx1ZQorCSAqICh3aGljaCBpcyB0eXBpY2FsbHkgZmFsc2UpLgorCSAqLworCXZvaWQgYm9vbGVhbkNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQl0aGlzLnNldEJ1dHRvblNlbGVjdGlvbigoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEJ1dHRvblNlbGVjdGlvbihCb29sZWFuIGIpIHsKKwkJaWYgKCAhIHRoaXMuYnV0dG9uLmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5idXR0b24uc2V0U2VsZWN0aW9uKHRoaXMuYm9vbGVhblZhbHVlKGIpKTsKKwkJfQorCX0KKworCXByaXZhdGUgYm9vbGVhbiBib29sZWFuVmFsdWUoQm9vbGVhbiBiKSB7CisJCXJldHVybiAoYiAhPSBudWxsKSA/IGIuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmdldERlZmF1bHRWYWx1ZSgpOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBnZXREZWZhdWx0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgYnV0dG9uIGhhcyBiZWVuICJzZWxlY3RlZCIgLSBzeW5jaHJvbml6ZSB0aGUgbW9kZWwuCisJICovCisJdm9pZCBidXR0b25TZWxlY3RlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJaWYgKCAhIHRoaXMuYnV0dG9uLmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5ib29sZWFuSG9sZGVyLnNldFZhbHVlKEJvb2xlYW4udmFsdWVPZih0aGlzLmJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkpOworCQl9CisJfQorCisKKwkvLyAqKioqKioqKioqIGRpc3Bvc2UgKioqKioqKioqKgorCisJdm9pZCBidXR0b25EaXNwb3NlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRGlzcG9zZUV2ZW50IGV2ZW50KSB7CisJCS8vIHRoZSBidXR0b24gaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50CisJCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycworCQl0aGlzLmJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKKwkJdGhpcy5idXR0b24ucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMuYnV0dG9uRGlzcG9zZUxpc3RlbmVyKTsKKwkJdGhpcy5ib29sZWFuSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgorCisgICAgQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5ib29sZWFuSG9sZGVyKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Jvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Jvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzEzNjg0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhblN0YXRlQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMjA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OworCisvKioKKyAqIFRoaXMgY29udHJvbGxlciBlbmFibGVzIGEgbW9kZWwgYm9vbGVhbiB0byBjb250cm9sIGVpdGhlciB0aGUgJ2VuYWJsZWQnIG9yCisgKiAndmlzaWJsZScgcHJvcGVydGllcyBvZiBhIHNldCBvZiBTV1QgY29udHJvbHM7IGkuZS4gdGhlCisgKiBjb250cm9scycgcHJvcGVydGllcyBhcmUga2VwdCBpbiBzeW5jaCB3aXRoIHRoZSBtb2RlbCBib29sZWFuLAorICogYnV0IG5vdCB2aWNlLXZlcnNhLgorICogCisgKiBAc2VlIFByb3BlcnR5VmFsdWVNb2RlbAorICogQHNlZSBDb250cm9sI3NldEVuYWJsZWQoYm9vbGVhbikKKyAqIEBzZWUgQ29udHJvbCNzZXRWaXNpYmxlKGJvb2xlYW4pCisgKi8KK2ZpbmFsIGNsYXNzIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIgeworCisJLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgYm9vbGVhbi4gKi8KKwlwcml2YXRlIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyOworCisJLyoqCisJICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgY29udHJvbCBzdGF0ZXMgd2l0aAorCSAqIGNoYW5nZXMgaW4gdGhlIHZhbHVlIG9mIHRoZSBtb2RlbCBib29sZWFuLgorCSAqLworCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBib29sZWFuQ2hhbmdlTGlzdGVuZXI7CisKKwkvKioKKwkgKiBUaGUgc2V0IG9mIGNvbnRyb2xzIHdob3NlIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBtb2RlbCBib29sZWFuLgorCSAqLworCXByaXZhdGUgZmluYWwgSGFzaFNldDxDb250cm9sPiBjb250cm9scyA9IG5ldyBIYXNoU2V0PENvbnRyb2w+KCk7CisKKwkvKioKKwkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHN0dWZmIHdoZW4gYWxsIHRoZQorCSAqIGNvbnRyb2xzIGFyZSBkaXNwb3NlZC4gKENyaXRpY2FsIGZvciBwcmV2ZW50aW5nIG1lbW9yeSBsZWFrcy4pCisJICovCisJcHJpdmF0ZSBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgY29udHJvbERpc3Bvc2VMaXN0ZW5lcjsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHRoZSBzdGF0ZTsgZm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIGRlZmF1bHQgW2RlZmF1bHQgdmFsdWVdIGlzIDxjb2RlPmZhbHNlPGNvZGU+LgorCSAqLworCXByaXZhdGUgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmFsdWU7CisKKwkvKioKKwkgKiBUaGUgYWRhcHRlciBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlICdlbmFibGVkJyBvciAndmlzaWJsZScgcHJvcGVydHkgaXMKKwkgKiBjb250cm9sbGVkLgorCSAqLworCXByaXZhdGUgZmluYWwgQWRhcHRlciBhZGFwdGVyOworCisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyLCB0aGUgY29udHJvbHMsIGFuZCB0aGUgYWRhcHRlciBhcmUgcmVxdWlyZWQuCisJICovCisJQm9vbGVhblN0YXRlQ29udHJvbGxlcigKKwkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAorCQkJSXRlcmFibGU8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzLAorCQkJYm9vbGVhbiBkZWZhdWx0VmFsdWUsCisJCQlBZGFwdGVyIGFkYXB0ZXIKKwkpIHsKKwkJc3VwZXIoKTsKKwkJaWYgKChib29sZWFuSG9sZGVyID09IG51bGwpIHx8IChjb250cm9scyA9PSBudWxsKSB8fCAoYWRhcHRlciA9PSBudWxsKSkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy5ib29sZWFuSG9sZGVyID0gYm9vbGVhbkhvbGRlcjsKKwkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7CisJCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7CisKKwkJdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCk7CisJCXRoaXMuYm9vbGVhbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIpOworCisJCXRoaXMuY29udHJvbERpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb250cm9sRGlzcG9zZUxpc3RlbmVyKCk7CisJCXRoaXMuYWRkQ29udHJvbHMoY29udHJvbHMpOworCX0KKworCisJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCisKKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSk7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQlCb29sZWFuU3RhdGVDb250cm9sbGVyLnRoaXMuYm9vbGVhbkNoYW5nZWQoZXZlbnQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiYm9vbGVhbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIERpc3Bvc2VMaXN0ZW5lciBidWlsZENvbnRyb2xEaXNwb3NlTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7CisJCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLmNvbnRyb2xEaXNwb3NlZChldmVudCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJjb250cm9sIGRpc3Bvc2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJfQorCisKKwkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKKworCXByaXZhdGUgdm9pZCBhZGRDb250cm9scyhJdGVyYWJsZTw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNfKSB7CisJCWJvb2xlYW4gYiA9IHRoaXMuZ2V0Qm9vbGVhblZhbHVlKCk7CisJCWZvciAoQ29udHJvbCBjb250cm9sIDogY29udHJvbHNfKSB7CisJCQl0aGlzLmFkZENvbnRyb2woY29udHJvbCwgYik7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkQ29udHJvbChDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gYikgeworCQlpZiAodGhpcy5jb250cm9scy5hZGQoY29udHJvbCkpIHsKKwkJCWNvbnRyb2wuYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMuY29udHJvbERpc3Bvc2VMaXN0ZW5lcik7CisJCQl0aGlzLnNldENvbnRyb2xTdGF0ZShjb250cm9sLCBiKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb250cm9scy4KKwkgKiBJZiB0aGUgbmV3IG1vZGVsIHZhbHVlIGlzIG51bGwsIHVzZSB0aGUgY29udHJvbGxlcidzIGRlZmF1bHQgdmFsdWUKKwkgKiAod2hpY2ggaXMgdHlwaWNhbGx5IGZhbHNlKS4KKwkgKi8KKwl2b2lkIGJvb2xlYW5DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJdGhpcy5zZXRDb250cm9sU3RhdGVzKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0Q29udHJvbFN0YXRlcyhCb29sZWFuIGIpIHsKKwkJdGhpcy5zZXRDb250cm9sU3RhdGVzKHRoaXMuYm9vbGVhblZhbHVlKGIpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0Q29udHJvbFN0YXRlcyhib29sZWFuIGIpIHsKKwkJZm9yIChDb250cm9sIGNvbnRyb2wgOiB0aGlzLmNvbnRyb2xzKSB7CisJCQl0aGlzLnNldENvbnRyb2xTdGF0ZShjb250cm9sLCBiKTsKKwkJfQorCX0KKworCXByaXZhdGUgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmJvb2xlYW5WYWx1ZSh0aGlzLmJvb2xlYW5Ib2xkZXIuZ2V0VmFsdWUoKSk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGJvb2xlYW5WYWx1ZShCb29sZWFuIGIpIHsKKwkJcmV0dXJuIChiICE9IG51bGwpID8gYi5ib29sZWFuVmFsdWUoKSA6IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldENvbnRyb2xTdGF0ZShDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gYikgeworCQlpZiAoICEgY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXRoaXMuYWRhcHRlci5zZXRTdGF0ZShjb250cm9sLCBiKTsKKwkJfQorCX0KKworCXByaXZhdGUgYm9vbGVhbiBnZXREZWZhdWx0VmFsdWUoKSB7CisJCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKKwl9CisKKworCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCisKKwl2b2lkIGNvbnRyb2xEaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKKwkJLy8gdGhlIGNvbnRyb2wgaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50CisJCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVyCisJCVdpZGdldCBjb250cm9sID0gZXZlbnQud2lkZ2V0OworCQljb250cm9sLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLmNvbnRyb2xEaXNwb3NlTGlzdGVuZXIpOworCQl0aGlzLmNvbnRyb2xzLnJlbW92ZShjb250cm9sKTsKKwkJaWYgKHRoaXMuY29udHJvbHMuaXNFbXB0eSgpKSB7CisJCQl0aGlzLmJvb2xlYW5Ib2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYm9vbGVhbkhvbGRlcik7CisJfQorCisKKwkvLyAqKioqKioqKioqIGFkYXB0ZXJzICoqKioqKioqKioKKworCWludGVyZmFjZSBBZGFwdGVyIHsKKwkJdm9pZCBzZXRTdGF0ZShDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gYik7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Ecm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Ecm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBkYTc5YwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Ryb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDI3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOworCisvKioKKyAqIFRoaXMgYmluZGluZyBjYW4gYmUgdXNlZCB0byBrZWVwIGEgZHJvcC1kb3duIGxpc3QgYm94J3Mgc2VsZWN0aW9uCisgKiBzeW5jaHJvbml6ZWQgd2l0aCBhIG1vZGVsLiBUaGUgc2VsZWN0aW9uIGNhbiBiZSBtb2RpZmllZCBieSBlaXRoZXIgdGhlCisgKiBkcm9wLWRvd24gbGlzdCBib3ggb3IgdGhlIG1vZGVsLCBzbyBjaGFuZ2VzIG11c3QgYmUgY29vcmRpbmF0ZWQuCisgKiA8cD4KKyAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IEEgc2VsZWN0ZWQgaXRlbSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiBjYW4gYmUgdXNlZAorICogdG8gY2xlYXIgdGhlIGRyb3AtZG93biBsaXN0IGJveCdzIHNlbGVjdGlvbjsgYnV0IGlmIDxjb2RlPm51bGw8L2NvZGU+IGlzIGEKKyAqIHZhbGlkIGl0ZW0gaW4gdGhlIG1vZGVsIGxpc3QsIHRoZXJlIHdpbGwgYmUgPGVtPm5vPC9lbT4gd2F5IHRvIGNsZWFyIHRoZQorICogc2VsZWN0aW9uLgorICogCisgKiBAc2VlIExpc3RWYWx1ZU1vZGVsCisgKiBAc2VlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsCisgKiBAc2VlIERyb3BEb3duTGlzdEJveAorICogQHNlZSBTV1RUb29scworICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK2ZpbmFsIGNsYXNzIERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmc8RT4KKwlpbXBsZW1lbnRzIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZworeworCS8vICoqKioqIG1vZGVsCisJLyoqCisJICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgorCSAqLworCXByaXZhdGUgZmluYWwgTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcjsKKworCS8qKgorCSAqIEEgd3JpdGFibGUgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgc2VsZWN0aW9uLgorCSAqLworCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtSG9sZGVyOworCisJLyoqCisJICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgZHJvcC1kb3duIGxpc3QgYm94J3MKKwkgKiBzZWxlY3Rpb24gd2l0aCB0aGUgbW9kZWwgc2VsZWN0aW9uLgorCSAqLworCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcjsKKworCS8vICoqKioqIFVJCisJLyoqCisJICogVGhlIGRyb3AtZG93biBsaXN0IGJveCB3aG9zZSBzZWxlY3Rpb24gd2Uga2VlcCBzeW5jaHJvbml6ZWQKKwkgKiB3aXRoIHRoZSBtb2RlbCBzZWxlY3Rpb24uCisJICovCisJcHJpdmF0ZSBmaW5hbCBEcm9wRG93bkxpc3RCb3ggZHJvcGRvd25MaXN0Qm94OworCisJLyoqCisJICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0ZWQgaXRlbSBob2xkZXIKKwkgKiB3aXRoIHRoZSBkcm9wLWRvd24gbGlzdCBib3gncyBzZWxlY3Rpb24uCisJICovCisJcHJpdmF0ZSBmaW5hbCBTZWxlY3Rpb25MaXN0ZW5lciBkcm9wZG93bkxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcjsKKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciAtIGFsbCBwYXJhbWV0ZXJzIGFyZSByZXF1aXJlZC4KKwkgKi8KKwlEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nKAorCQkJTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwKKwkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbUhvbGRlciwKKwkJCURyb3BEb3duTGlzdEJveCBkcm9wZG93bkxpc3RCb3gKKwkpIHsKKwkJc3VwZXIoKTsKKwkJaWYgKChsaXN0SG9sZGVyID09IG51bGwpIHx8IChzZWxlY3RlZEl0ZW1Ib2xkZXIgPT0gbnVsbCkgfHwgKGRyb3Bkb3duTGlzdEJveCA9PSBudWxsKSkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKKwkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIgPSBzZWxlY3RlZEl0ZW1Ib2xkZXI7CisJCXRoaXMuZHJvcGRvd25MaXN0Qm94ID0gZHJvcGRvd25MaXN0Qm94OworCisJCXRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIoKTsKKwkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIpOworCisJCXRoaXMuZHJvcGRvd25MaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIoKTsKKwkJdGhpcy5kcm9wZG93bkxpc3RCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5kcm9wZG93bkxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcik7CisJfQorCisKKwkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKKworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcl8oKSk7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXJfKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCURyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcudGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VkKGV2ZW50KTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gInNlbGVjdGVkIGl0ZW0gbGlzdGVuZXIiOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGREcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLmRyb3BEb3duTGlzdEJveFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOworCQkJfQorCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLmRyb3BEb3duTGlzdEJveERvdWJsZUNsaWNrZWQoZXZlbnQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiZHJvcC1kb3duIGxpc3QgYm94IHNlbGVjdGlvbiBsaXN0ZW5lciI7CisJCQl9CisJCX07CisJfQorCisKKwkvLyAqKioqKioqKioqIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvKioKKwkgKiBNb2RpZnlpbmcgdGhlIGRyb3AtZG93biBsaXNiIGJveCdzIHNlbGVjdGVkIGl0ZW0gcHJvZ3JhbW1hdGljYWxseSBkb2VzCisJICogbm90IHRyaWdnZXIgYSBTZWxlY3Rpb25FdmVudC4KKwkgKiA8cD4KKwkgKiBQcmUtY29uZGl0aW9uOiBUaGUgZHJvcC1kb3duIGxpc3QgYm94IGlzIG5vdCBkaXNwb3NlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKSB7CisJCWludCBvbGRJbmRleCA9IHRoaXMuZHJvcGRvd25MaXN0Qm94LmdldFNlbGVjdGlvbkluZGV4KCk7CisJCUUgdmFsdWUgPSB0aGlzLnNlbGVjdGVkSXRlbUhvbGRlci5nZXRWYWx1ZSgpOworCQlpbnQgbmV3SW5kZXggPSB0aGlzLmluZGV4T2YodmFsdWUpOworCQlpZiAoKG9sZEluZGV4ICE9IC0xKSAmJiAobmV3SW5kZXggIT0gLTEpICYmIChuZXdJbmRleCAhPSBvbGRJbmRleCkpIHsKKwkJCXRoaXMuZHJvcGRvd25MaXN0Qm94LmRlc2VsZWN0KG9sZEluZGV4KTsKKwkJfQorCQlpZiAobmV3SW5kZXggPT0gLTEpIHsKKwkJCXRoaXMuZHJvcGRvd25MaXN0Qm94LmRlc2VsZWN0QWxsKCk7CisJCX0gZWxzZSB7CisJCQlpZiAobmV3SW5kZXggIT0gb2xkSW5kZXgpIHsKKwkJCQl0aGlzLmRyb3Bkb3duTGlzdEJveC5zZWxlY3QobmV3SW5kZXgpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJdGhpcy5kcm9wZG93bkxpc3RCb3gucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5kcm9wZG93bkxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcik7CisJCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyKTsKKwl9CisKKworCS8vICoqKioqKioqKiogc2VsZWN0ZWQgaXRlbSAqKioqKioqKioqCisKKwl2b2lkIHNlbGVjdGVkSXRlbUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQlpZiAoICEgdGhpcy5kcm9wZG93bkxpc3RCb3guaXNEaXNwb3NlZCgpKSB7CisJCQl0aGlzLnNlbGVjdGVkSXRlbUNoYW5nZWRfKGV2ZW50KTsKKwkJfQorCX0KKworCS8qKgorCSAqIE1vZGlmeWluZyB0aGUgZHJvcC1kb3duIGxpc3QgYm94J3Mgc2VsZWN0ZWQgaXRlbSBwcm9ncmFtbWF0aWNhbGx5IGRvZXMKKwkgKiBub3QgdHJpZ2dlciBhIFNlbGVjdGlvbkV2ZW50LgorCSAqLworCXByaXZhdGUgdm9pZCBzZWxlY3RlZEl0ZW1DaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQl0aGlzLnN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpOworCX0KKworCXByaXZhdGUgaW50IGluZGV4T2YoRSBpdGVtKSB7CisJCWludCBsZW4gPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5saXN0SG9sZGVyLmdldChpKSwgaXRlbSkpIHsKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJfQorCQkvLyBpZiAnbnVsbCcgaXMgbm90IGluIHRoZSBsaXN0LCB1c2UgaXQgdG8gY2xlYXIgdGhlIHNlbGVjdGlvbgorCQlpZiAoaXRlbSA9PSBudWxsKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLy8gZXhwbGljaXRseSBjYXRjaCBhbnkgbW9kZWwgYnVncworCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZWxlY3RlZCBpdGVtIG5vdCBmb3VuZDogIiArIGl0ZW0pOworCX0KKworCisJLy8gKioqKioqKioqKiBjb21iby1ib3ggZXZlbnRzICoqKioqKioqKioKKworCXZvaWQgZHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQlpZiAoICEgdGhpcy5kcm9wZG93bkxpc3RCb3guaXNEaXNwb3NlZCgpKSB7CisJCQl0aGlzLmRyb3BEb3duTGlzdEJveFNlbGVjdGlvbkNoYW5nZWRfKGV2ZW50KTsKKwkJfQorCX0KKworCXZvaWQgZHJvcERvd25MaXN0Qm94RG91YmxlQ2xpY2tlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQlpZiAoICEgdGhpcy5kcm9wZG93bkxpc3RCb3guaXNEaXNwb3NlZCgpKSB7CisJCQl0aGlzLmRyb3BEb3duTGlzdEJveFNlbGVjdGlvbkNoYW5nZWRfKGV2ZW50KTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBkcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUodGhpcy5nZXREcm9wRG93bkxpc3RCb3hTZWxlY3RlZEl0ZW0oKSk7CisJfQorCisJcHJpdmF0ZSBFIGdldERyb3BEb3duTGlzdEJveFNlbGVjdGVkSXRlbSgpIHsKKwkJaW50IHNlbGVjdGlvbkluZGV4ID0gdGhpcy5kcm9wZG93bkxpc3RCb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKwkJcmV0dXJuIChzZWxlY3Rpb25JbmRleCA9PSAtMSkgPyBudWxsIDogdGhpcy5saXN0SG9sZGVyLmdldChzZWxlY3Rpb25JbmRleCk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIpOworCX0KKworCisJLy8gKioqKioqKioqKiBhZGFwdGVyIGludGVyZmFjZSAqKioqKioqKioqCisKKwkvKioKKwkgKiBBZGFwdGVyIHVzZWQgYnkgdGhlIGRyb3AtZG93biBsaXN0IGJveCBzZWxlY3Rpb24gYmluZGluZyB0byBxdWVyeSBhbmQgbWFuaXB1bGF0ZQorCSAqIHRoZSBkcm9wLWRvd24gbGlzdCBib3guCisJICovCisJaW50ZXJmYWNlIERyb3BEb3duTGlzdEJveCB7CisKKwkJLyoqCisJCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb21iby1ib3ggaXMgImRpc3Bvc2VkIi4KKwkJICovCisJCWJvb2xlYW4gaXNEaXNwb3NlZCgpOworCisJCS8qKgorCQkgKiBBZGQgdGhlIHNwZWNpZmllZCBzZWxlY3Rpb24gbGlzdGVuZXIgdG8gdGhlIGNvbWJvLWJveC4KKwkJICovCisJCXZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOworCisJCS8qKgorCQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBzZWxlY3Rpb24gbGlzdGVuZXIgZnJvbSB0aGUgY29tYm8tYm94LgorCQkgKi8KKwkJdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7CisKKwkJLyoqCisJCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGNvbWJvLWJveCdzIHNlbGVjdGlvbi4KKwkJICovCisJCWludCBnZXRTZWxlY3Rpb25JbmRleCgpOworCisJCS8qKgorCQkgKiBTZWxlY3QgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleCBpbiB0aGUgY29tYm8tYm94LgorCQkgKi8KKwkJdm9pZCBzZWxlY3QoaW50IGluZGV4KTsKKworCQkvKioKKwkJICogRGVzZWxlY3QgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleCBpbiB0aGUgY29tYm8tYm94LgorCQkgKi8KKwkJdm9pZCBkZXNlbGVjdChpbnQgaW5kZXgpOworCisJCS8qKgorCQkgKiBDbGVhciB0aGUgY29tYm8tYm94J3Mgc2VsZWN0aW9uLgorCQkgKi8KKwkJdm9pZCBkZXNlbGVjdEFsbCgpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0Qm94U2VsZWN0aW9uQmluZGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzM3OTUxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDMwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKKworLyoqCisgKiBUaGlzIGJpbmRpbmcgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3QgYm94J3Mgc2VsZWN0aW9uCisgKiBzeW5jaHJvbml6ZWQgd2l0aCBhIG1vZGVsLiBUaGUgc2VsZWN0aW9uIGNhbiBiZSBtb2RpZmllZCBieSBlaXRoZXIgdGhlIGxpc3QKKyAqIGJveCBvciB0aGUgbW9kZWwsIHNvIGNoYW5nZXMgbXVzdCBiZSBjb29yZGluYXRlZC4KKyAqIAorICogQHNlZSBMaXN0VmFsdWVNb2RlbAorICogQHNlZSBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsCisgKiBAc2VlIExpc3QKKyAqIEBzZWUgU1dUVG9vbHMKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitmaW5hbCBjbGFzcyBMaXN0Qm94U2VsZWN0aW9uQmluZGluZzxFPgorCWltcGxlbWVudHMgTGlzdFdpZGdldE1vZGVsQmluZGluZy5TZWxlY3Rpb25CaW5kaW5nCit7CisJLy8gKioqKiogbW9kZWwKKwkvKioKKwkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCisJICovCisJcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyOworCisJLyoqCisJICogQSB3cml0YWJsZSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBzZWxlY3Rpb25zLgorCSAqLworCXByaXZhdGUgZmluYWwgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1zSG9sZGVyOworCisJLyoqCisJICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgbGlzdCBib3gncyBzZWxlY3Rpb24gd2l0aAorCSAqIHRoZSBtb2RlbCBzZWxlY3Rpb25zLgorCSAqLworCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcjsKKworCS8vICoqKioqIFVJCisJLyoqCisJICogVGhlIGxpc3QgYm94IHdob3NlIHNlbGVjdGlvbiB3ZSBrZWVwIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCBzZWxlY3Rpb25zLgorCSAqLworCXByaXZhdGUgZmluYWwgTGlzdCBsaXN0Qm94OworCisJLyoqCisJICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0ZWQgaXRlbXMgaG9sZGVyCisJICogd2l0aCB0aGUgbGlzdCBib3gncyBzZWxlY3Rpb24uCisJICovCisJcHJpdmF0ZSBmaW5hbCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXI7CisKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgorCisJLyoqCisJICogQ29uc3RydWN0b3IgLSBhbGwgcGFyYW1ldGVycyBhcmUgcmVxdWlyZWQuCisJICovCisJTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcoCisJCQlMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLAorCQkJV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1zSG9sZGVyLAorCQkJTGlzdCBsaXN0Qm94CisJKSB7CisJCXN1cGVyKCk7CisJCWlmICgobGlzdEhvbGRlciA9PSBudWxsKSB8fCAoc2VsZWN0ZWRJdGVtc0hvbGRlciA9PSBudWxsKSB8fCAobGlzdEJveCA9PSBudWxsKSkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKKwkJdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyID0gc2VsZWN0ZWRJdGVtc0hvbGRlcjsKKwkJdGhpcy5saXN0Qm94ID0gbGlzdEJveDsKKworCQl0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIoKTsKKwkJdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyKTsKKworCQl0aGlzLmxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIoKTsKKwkJdGhpcy5saXN0Qm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMubGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKTsKKwl9CisKKworCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyXygpKTsKKwl9CisKKwlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcl8oKSB7CisJCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKKwkJCQlMaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLnNlbGVjdGVkSXRlbXNBZGRlZChldmVudCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7CisJCQkJTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcudGhpcy5zZWxlY3RlZEl0ZW1zUmVtb3ZlZChldmVudCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgeworCQkJCUxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLnRoaXMuc2VsZWN0ZWRJdGVtc0NsZWFyZWQoZXZlbnQpOworCQkJfQorCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcudGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlZChldmVudCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJzZWxlY3RlZCBpdGVtcyBsaXN0ZW5lciI7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZExpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcudGhpcy5saXN0Qm94U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCQlMaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLmxpc3RCb3hEb3VibGVDbGlja2VkKGV2ZW50KTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gImxpc3QgYm94IHNlbGVjdGlvbiBsaXN0ZW5lciI7CisJCQl9CisJCX07CisJfQorCisKKwkvLyAqKioqKioqKioqIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwkvKioKKwkgKiBNb2RpZnlpbmcgdGhlIGxpc3QgYm94J3Mgc2VsZWN0ZWQgaXRlbXMgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdAorCSAqIHRyaWdnZXIgYSBTZWxlY3Rpb25FdmVudC4KKwkgKiAKKwkgKiBQcmUtY29uZGl0aW9uOiBUaGUgbGlzdC1ib3ggaXMgbm90IGRpc3Bvc2VkLgorCSAqLworCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpIHsKKwkJaW50IHNlbGVjdGVkSXRlbXNTaXplID0gdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyLnNpemUoKTsKKwkJaW50W10gc2VsZWN0ID0gbmV3IGludFtzZWxlY3RlZEl0ZW1zU2l6ZV07CisJCWludCBpID0gMDsKKwkJZm9yIChFIGl0ZW0gOiB0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIpIHsKKwkJCXNlbGVjdFtpKytdID0gdGhpcy5pbmRleE9mKGl0ZW0pOworCQl9CisKKwkJaW50IGxpc3RTaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKKwkJaW50W10gZGVzZWxlY3QgPSBuZXcgaW50W2xpc3RTaXplIC0gc2VsZWN0ZWRJdGVtc1NpemVdOworCQlpID0gMDsKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBsaXN0U2l6ZTsgaisrKSB7CisJCQlpZiAoICEgQXJyYXlUb29scy5jb250YWlucyhzZWxlY3QsIGopKSB7CisJCQkJZGVzZWxlY3RbaSsrXSA9IGo7CisJCQl9CisJCX0KKworCQlpbnRbXSBvbGQgPSBBcnJheVRvb2xzLnNvcnQodGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbkluZGljZXMoKSk7CisJCXNlbGVjdCA9IEFycmF5VG9vbHMuc29ydChzZWxlY3QpOworCQlpZiAoICEgQXJyYXlzLmVxdWFscyhzZWxlY3QsIG9sZCkpIHsKKwkJCXRoaXMubGlzdEJveC5kZXNlbGVjdChkZXNlbGVjdCk7CisJCQl0aGlzLmxpc3RCb3guc2VsZWN0KHNlbGVjdCk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQl0aGlzLmxpc3RCb3gucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5saXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIpOworCQl0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIpOworCX0KKworCisJLy8gKioqKioqKioqKiBzZWxlY3RlZCBpdGVtcyAqKioqKioqKioqCisKKwl2b2lkIHNlbGVjdGVkSXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKKwkJaWYgKCAhIHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXRoaXMuc2VsZWN0ZWRJdGVtc0FkZGVkXyhldmVudCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBNb2RpZnlpbmcgdGhlIGxpc3QgYm94J3Mgc2VsZWN0ZWQgaXRlbXMgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdAorCSAqIHRyaWdnZXIgYSBTZWxlY3Rpb25FdmVudC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgc2VsZWN0ZWRJdGVtc0FkZGVkXyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKKwkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbZXZlbnQuZ2V0SXRlbXNTaXplKCldOworCQlpbnQgaSA9IDA7CisJCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKKwkJCWluZGljZXNbaSsrXSA9IHRoaXMuaW5kZXhPZihpdGVtKTsKKwkJfQorCQl0aGlzLmxpc3RCb3guc2VsZWN0KGluZGljZXMpOworCX0KKworCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSBJdGVyYWJsZTxFPiBnZXRJdGVtcyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKKwkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKKwl9CisKKwl2b2lkIHNlbGVjdGVkSXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgeworCQlpZiAoICEgdGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5zZWxlY3RlZEl0ZW1zUmVtb3ZlZF8oZXZlbnQpOworCQl9CisJfQorCisJLyoqCisJICogTW9kaWZ5aW5nIHRoZSBsaXN0IGJveCdzIHNlbGVjdGVkIGl0ZW1zIHByb2dyYW1tYXRpY2FsbHkgZG9lcyBub3QKKwkgKiB0cmlnZ2VyIGEgU2VsZWN0aW9uRXZlbnQuCisJICovCisJcHJpdmF0ZSB2b2lkIHNlbGVjdGVkSXRlbXNSZW1vdmVkXyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKKwkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbZXZlbnQuZ2V0SXRlbXNTaXplKCldOworCQlpbnQgaSA9IDA7CisJCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKKwkJCWluZGljZXNbaSsrXSA9IHRoaXMuaW5kZXhPZihpdGVtKTsKKwkJfQorCQl0aGlzLmxpc3RCb3guZGVzZWxlY3QoaW5kaWNlcyk7CisJfQorCisJLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcml2YXRlIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgeworCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOworCX0KKworCXZvaWQgc2VsZWN0ZWRJdGVtc0NsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKKwkJaWYgKCAhIHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXRoaXMuc2VsZWN0ZWRJdGVtc0NsZWFyZWRfKGV2ZW50KTsKKwkJfQorCX0KKworCS8qKgorCSAqIE1vZGlmeWluZyB0aGUgbGlzdCBib3gncyBzZWxlY3RlZCBpdGVtcyBwcm9ncmFtbWF0aWNhbGx5IGRvZXMgbm90CisJICogdHJpZ2dlciBhIFNlbGVjdGlvbkV2ZW50LgorCSAqLworCXByaXZhdGUgdm9pZCBzZWxlY3RlZEl0ZW1zQ2xlYXJlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7CisJCXRoaXMubGlzdEJveC5kZXNlbGVjdEFsbCgpOworCX0KKworCXZvaWQgc2VsZWN0ZWRJdGVtc0NoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCWlmICggISB0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7CisJCQl0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VkXyhldmVudCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgc2VsZWN0ZWRJdGVtc0NoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJdGhpcy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKKwl9CisKKwlwcml2YXRlIGludCBpbmRleE9mKEUgaXRlbSkgeworCQlpbnQgbGVuID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMubGlzdEhvbGRlci5nZXQoaSksIGl0ZW0pKSB7CisJCQkJcmV0dXJuIGk7CisJCQl9CisJCX0KKwkJLy8gZXhwbGljaXRseSBjYXRjaCBhbnkgbW9kZWwgYnVncworCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZWxlY3RlZCBpdGVtIG5vdCBmb3VuZDogIiArIGl0ZW0pOworCX0KKworCisJLy8gKioqKioqKioqKiBsaXN0IGJveCBldmVudHMgKioqKioqKioqKgorCisJdm9pZCBsaXN0Qm94U2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQlpZiAoICEgdGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5saXN0Qm94U2VsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOworCQl9CisJfQorCisJdm9pZCBsaXN0Qm94RG91YmxlQ2xpY2tlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQlpZiAoICEgdGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5saXN0Qm94U2VsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyLnNldFZhbHVlcyh0aGlzLmdldExpc3RCb3hTZWxlY3RlZEl0ZW1zKCkpOworCX0KKworCXByaXZhdGUgSXRlcmFibGU8RT4gZ2V0TGlzdEJveFNlbGVjdGVkSXRlbXMoKSB7CisJCUFycmF5TGlzdDxFPiBzZWxlY3RlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFPih0aGlzLmxpc3RCb3guZ2V0U2VsZWN0aW9uQ291bnQoKSk7CisJCWZvciAoaW50IHNlbGVjdGlvbkluZGV4IDogdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbkluZGljZXMoKSkgeworCQkJc2VsZWN0ZWRJdGVtcy5hZGQodGhpcy5saXN0SG9sZGVyLmdldChzZWxlY3Rpb25JbmRleCkpOworCQl9CisJCXJldHVybiBzZWxlY3RlZEl0ZW1zOworCX0KKworCisJLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc2VsZWN0ZWRJdGVtc0hvbGRlcik7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmMzg5YwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RXaWRnZXRNb2RlbEJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDQyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7CisKKy8qKgorICogVGhpcyBiaW5kaW5nIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBsaXN0IHdpZGdldCdzIGNvbnRlbnRzCisgKiBzeW5jaHJvbml6ZWQgd2l0aCBhIG1vZGVsLiBUaGUgbGlzdCB3aWRnZXQgbmV2ZXIgYWx0ZXJzCisgKiBpdHMgY29udGVudHMgZGlyZWN0bHk7IGFsbCBjaGFuZ2VzIGFyZSBkcml2ZW4gYnkgdGhlIG1vZGVsLgorICogCisgKiBAc2VlIExpc3RWYWx1ZU1vZGVsCisgKiBAc2VlIFN0cmluZ0NvbnZlcnRlcgorICogQHNlZSBMaXN0V2lkZ2V0CisgKiBAc2VlIFNlbGVjdGlvbkJpbmRpbmcKKyAqIEBzZWUgU1dUVG9vbHMKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitmaW5hbCBjbGFzcyBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nPEU+IHsKKworCS8vICoqKioqIG1vZGVsCisJLyoqCisJICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgorCSAqLworCXByaXZhdGUgZmluYWwgTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcjsKKworCS8qKgorCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGxpc3Qgd2lkZ2V0J3MgY29udGVudHMgd2l0aAorCSAqIHRoZSBtb2RlbCBsaXN0LgorCSAqLworCXByaXZhdGUgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKKworCS8qKgorCSAqIEEgY29udmVydGVyIHRoYXQgY29udmVydHMgaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QKKwkgKiB0byBzdHJpbmdzIHRoYXQgY2FuIGJlIHB1dCBpbiB0aGUgbGlzdCB3aWRnZXQuCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyOworCisJLy8gKioqKiogVUkKKwkvKioKKwkgKiBBbiBhZGFwdGVyIG9uIHRoZSBsaXN0IHdpZGdldCB3ZSBrZWVwIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCBsaXN0LgorCSAqLworCXByaXZhdGUgZmluYWwgTGlzdFdpZGdldCBsaXN0V2lkZ2V0OworCisJLyoqCisJICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSBsaXN0IHdpZGdldAorCSAqIGlzIGRpc3Bvc2VkLiAoQ3JpdGljYWwgZm9yIHByZXZlbnRpbmcgbWVtb3J5IGxlYWtzLikKKwkgKi8KKwlwcml2YXRlIGZpbmFsIERpc3Bvc2VMaXN0ZW5lciBsaXN0V2lkZ2V0RGlzcG9zZUxpc3RlbmVyOworCisJLy8gKioqKiogc2VsZWN0aW9uCisJLyoqCisJICogV2lkZ2V0LXNwZWNpZmljIHNlbGVjdGlvbiBiaW5kaW5nLgorCSAqLworCXByaXZhdGUgZmluYWwgU2VsZWN0aW9uQmluZGluZyBzZWxlY3Rpb25CaW5kaW5nOworCisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIC0gYWxsIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkLgorCSAqLworCUxpc3RXaWRnZXRNb2RlbEJpbmRpbmcoCisJCQlMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLAorCQkJTGlzdFdpZGdldCBsaXN0V2lkZ2V0LAorCQkJU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlciwKKwkJCVNlbGVjdGlvbkJpbmRpbmcgc2VsZWN0aW9uQmluZGluZworCSkgeworCQlzdXBlcigpOworCQlpZiAoKGxpc3RIb2xkZXIgPT0gbnVsbCkgfHwgKGxpc3RXaWRnZXQgPT0gbnVsbCkgfHwgKHN0cmluZ0NvbnZlcnRlciA9PSBudWxsKSB8fCAoc2VsZWN0aW9uQmluZGluZyA9PSBudWxsKSkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKKwkJdGhpcy5saXN0V2lkZ2V0ID0gbGlzdFdpZGdldDsKKwkJdGhpcy5zdHJpbmdDb252ZXJ0ZXIgPSBzdHJpbmdDb252ZXJ0ZXI7CisJCXRoaXMuc2VsZWN0aW9uQmluZGluZyA9IHNlbGVjdGlvbkJpbmRpbmc7CisKKwkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7CisJCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKKworCQl0aGlzLmxpc3RXaWRnZXREaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdFdpZGdldERpc3Bvc2VMaXN0ZW5lcigpOworCQl0aGlzLmxpc3RXaWRnZXQuYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMubGlzdFdpZGdldERpc3Bvc2VMaXN0ZW5lcik7CisKKwkJdGhpcy5zeW5jaHJvbml6ZUxpc3RXaWRnZXQoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKKwl9CisKKwlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7CisJCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKKwkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdEl0ZW1zQWRkZWQoZXZlbnQpOworCQkJfQorCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgeworCQkJCUxpc3RXaWRnZXRNb2RlbEJpbmRpbmcudGhpcy5saXN0SXRlbXNSZW1vdmVkKGV2ZW50KTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgeworCQkJCUxpc3RXaWRnZXRNb2RlbEJpbmRpbmcudGhpcy5saXN0SXRlbXNNb3ZlZChldmVudCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKKwkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdEl0ZW1zUmVwbGFjZWQoZXZlbnQpOworCQkJfQorCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKKwkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOworCQkJfQorCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJTGlzdFdpZGdldE1vZGVsQmluZGluZy50aGlzLmxpc3RDaGFuZ2VkKGV2ZW50KTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gImxpc3QgbGlzdGVuZXIiOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkTGlzdFdpZGdldERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKKwkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdFdpZGdldERpc3Bvc2VkKGV2ZW50KTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gImxpc3Qgd2lkZ2V0IGRpc3Bvc2UgbGlzdGVuZXIiOworCQkJfQorCQl9OworCX0KKworCisJLy8gKioqKioqKioqKiBsaXN0ICoqKioqKioqKioKKworCS8qKgorCSAqIEJydXRlIGZvcmNlIHN5bmNocm9uaXphdGlvbiBvZiBsaXN0IHdpZGdldCB3aXRoIHRoZSBtb2RlbCBsaXN0LgorCSAqLworCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZUxpc3RXaWRnZXQoKSB7CisJCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7CisJCQl0aGlzLnN5bmNocm9uaXplTGlzdFdpZGdldF8oKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZUxpc3RXaWRnZXRfKCkgeworCQlBcnJheUxpc3Q8U3RyaW5nPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKTsKKwkJZm9yIChFIGl0ZW0gOiB0aGlzLmxpc3RIb2xkZXIpIHsKKwkJCWl0ZW1zLmFkZCh0aGlzLmNvbnZlcnQoaXRlbSkpOworCQl9CisJCXRoaXMubGlzdFdpZGdldC5zZXRJdGVtcyhpdGVtcy50b0FycmF5KG5ldyBTdHJpbmdbaXRlbXMuc2l6ZSgpXSkpOworCisJCS8vIG5vdyB0aGF0IHRoZSBsaXN0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHN5bmNoIHRoZSBzZWxlY3Rpb24KKwkJdGhpcy5zZWxlY3Rpb25CaW5kaW5nLnN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpOworCX0KKworCS8qKgorCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBsaXN0IHdpZGdldC4KKwkgKi8KKwl2b2lkIGxpc3RJdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgeworCQlpZiAoICEgdGhpcy5saXN0V2lkZ2V0LmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5saXN0SXRlbXNBZGRlZF8oZXZlbnQpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGxpc3RJdGVtc0FkZGVkXyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKKwkJaW50IGkgPSBldmVudC5nZXRJbmRleCgpOworCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7CisJCQl0aGlzLmxpc3RXaWRnZXQuYWRkKHRoaXMuY29udmVydChpdGVtKSwgaSsrKTsKKwkJfQorCisJCS8vIG5vdyB0aGF0IHRoZSBsaXN0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHN5bmNoIHRoZSBzZWxlY3Rpb24KKwkJdGhpcy5zZWxlY3Rpb25CaW5kaW5nLnN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpOworCX0KKworCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSBJdGVyYWJsZTxFPiBnZXRJdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKKwkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCB3aWRnZXQuCisJICovCisJdm9pZCBsaXN0SXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgeworCQlpZiAoICEgdGhpcy5saXN0V2lkZ2V0LmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5saXN0SXRlbXNSZW1vdmVkXyhldmVudCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgbGlzdEl0ZW1zUmVtb3ZlZF8oTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7CisJCXRoaXMubGlzdFdpZGdldC5yZW1vdmUoZXZlbnQuZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0SW5kZXgoKSArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpIC0gMSk7CisKKwkJLy8gbm93IHRoYXQgdGhlIGxpc3QgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gc3luY2ggdGhlIHNlbGVjdGlvbgorCQl0aGlzLnNlbGVjdGlvbkJpbmRpbmcuc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGxpc3Qgd2lkZ2V0LgorCSAqLworCXZvaWQgbGlzdEl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgeworCQlpZiAoICEgdGhpcy5saXN0V2lkZ2V0LmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5saXN0SXRlbXNNb3ZlZF8oZXZlbnQpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGxpc3RJdGVtc01vdmVkXyhMaXN0TW92ZUV2ZW50IGV2ZW50KSB7CisJCWludCB0YXJnZXQgPSBldmVudC5nZXRUYXJnZXRJbmRleCgpOworCQlpbnQgc291cmNlID0gZXZlbnQuZ2V0U291cmNlSW5kZXgoKTsKKwkJaW50IGxlbiA9IGV2ZW50LmdldExlbmd0aCgpOworCQlpbnQgbG9TdGFydCA9IE1hdGgubWluKHRhcmdldCwgc291cmNlKTsKKwkJaW50IGhpU3RhcnQgPSBNYXRoLm1heCh0YXJnZXQsIHNvdXJjZSk7CisJCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBhZmZlY3RlZCBpdGVtcy4uLgorCQlTdHJpbmdbXSBzdWJBcnJheSA9IEFycmF5VG9vbHMuc3ViQXJyYXkodGhpcy5saXN0V2lkZ2V0LmdldEl0ZW1zKCksIGxvU3RhcnQsIGhpU3RhcnQgKyBsZW4pOworCQkvLyAuLi5tb3ZlIHRoZW0gYXJvdW5kLi4uCisJCXN1YkFycmF5ID0gQXJyYXlUb29scy5tb3ZlKHN1YkFycmF5LCB0YXJnZXQgLSBsb1N0YXJ0LCBzb3VyY2UgLSBsb1N0YXJ0LCBsZW4pOworCQkvLyAuLi5hbmQgdGhlbiBwdXQgdGhlbSBiYWNrCisJCWludCBpID0gbG9TdGFydDsKKwkJZm9yIChTdHJpbmcgaXRlbSA6IHN1YkFycmF5KSB7CisJCQl0aGlzLmxpc3RXaWRnZXQuc2V0SXRlbShpKyssIGl0ZW0pOworCQl9CisKKwkJLy8gbm93IHRoYXQgdGhlIGxpc3QgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gc3luY2ggdGhlIHNlbGVjdGlvbgorCQl0aGlzLnNlbGVjdGlvbkJpbmRpbmcuc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCk7CisJfQorCisJLyoqCisJICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGxpc3Qgd2lkZ2V0LgorCSAqLworCXZvaWQgbGlzdEl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgeworCQlpZiAoICEgdGhpcy5saXN0V2lkZ2V0LmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5saXN0SXRlbXNSZXBsYWNlZF8oZXZlbnQpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGxpc3RJdGVtc1JlcGxhY2VkXyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7CisJCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKKwkJZm9yIChFIGl0ZW0gOiB0aGlzLmdldE5ld0l0ZW1zKGV2ZW50KSkgeworCQkJdGhpcy5saXN0V2lkZ2V0LnNldEl0ZW0oaSsrLCB0aGlzLmNvbnZlcnQoaXRlbSkpOworCQl9CisKKwkJLy8gbm93IHRoYXQgdGhlIGxpc3QgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gc3luY2ggdGhlIHNlbGVjdGlvbgorCQl0aGlzLnNlbGVjdGlvbkJpbmRpbmcuc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCk7CisJfQorCisJLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcml2YXRlIEl0ZXJhYmxlPEU+IGdldE5ld0l0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKKwkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0TmV3SXRlbXMoKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCB3aWRnZXQuCisJICovCisJdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgeworCQlpZiAoICEgdGhpcy5saXN0V2lkZ2V0LmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGxpc3RDbGVhcmVkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKKwkJdGhpcy5saXN0V2lkZ2V0LnJlbW92ZUFsbCgpOworCX0KKworCS8qKgorCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBsaXN0IHdpZGdldC4KKwkgKi8KKwl2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgeworCQlpZiAoICEgdGhpcy5saXN0V2lkZ2V0LmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5saXN0Q2hhbmdlZF8oZXZlbnQpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGxpc3RDaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7CisJCXRoaXMuc3luY2hyb25pemVMaXN0V2lkZ2V0XygpOworCX0KKworCS8qKgorCSAqIFVzZSB0aGUgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgaXRlbSB0byBhCisJICogc3RyaW5nIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IHdpZGdldC4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBjb252ZXJ0KEUgaXRlbSkgeworCQlyZXR1cm4gdGhpcy5zdHJpbmdDb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nKGl0ZW0pOworCX0KKworCisJLy8gKioqKioqKioqKiBsaXN0IHdpZGdldCBldmVudHMgKioqKioqKioqKgorCisJdm9pZCBsaXN0V2lkZ2V0RGlzcG9zZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIERpc3Bvc2VFdmVudCBldmVudCkgeworCQkvLyB0aGUgbGlzdCB3aWRnZXQgaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50CisJCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycworCQl0aGlzLmxpc3RXaWRnZXQucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMubGlzdFdpZGdldERpc3Bvc2VMaXN0ZW5lcik7CisJCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5zZWxlY3Rpb25CaW5kaW5nLmRpc3Bvc2UoKTsKKwl9CisKKworCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RIb2xkZXIpOworCX0KKworCisJLy8gKioqKioqKioqKiBhZGFwdGVyIGludGVyZmFjZXMgKioqKioqKioqKgorCisJLyoqCisJICogQWRhcHRlciB1c2VkIGJ5IHRoZSBsaXN0IHdpZGdldCBtb2RlbCBiaW5kaW5nIHRvIHF1ZXJ5IGFuZCBtYW5pcHVsYXRlCisJICogdGhlIHdpZGdldC4KKwkgKi8KKwlpbnRlcmZhY2UgTGlzdFdpZGdldCB7CisKKwkJLyoqCisJCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IHdpZGdldCBpcyAiZGlzcG9zZWQiLgorCQkgKi8KKwkJYm9vbGVhbiBpc0Rpc3Bvc2VkKCk7CisKKwkJLyoqCisJCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGRpc3Bvc2UgbGlzdGVuZXIgdG8gdGhlIGxpc3Qgd2lkZ2V0LgorCQkgKi8KKwkJdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworCQkvKioKKwkJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZGlzcG9zZSBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IHdpZGdldC4KKwkJICovCisJCXZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcik7CisKKwkJLyoqCisJCSAqIFJldHVybiB0aGUgbGlzdCB3aWRnZXQncyBpdGVtcy4KKwkJICovCisJCVN0cmluZ1tdIGdldEl0ZW1zKCk7CisKKwkJLyoqCisJCSAqIFNldCB0aGUgbGlzdCB3aWRnZXQncyBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggdG8gdGhlIHNwZWNpZmllZCBpdGVtLgorCQkgKi8KKwkJdm9pZCBzZXRJdGVtKGludCBpbmRleCwgU3RyaW5nIGl0ZW0pOworCisJCS8qKgorCQkgKiBTZXQgdGhlIGxpc3Qgd2lkZ2V0J3MgaXRlbXMuCisJCSAqLworCQl2b2lkIHNldEl0ZW1zKFN0cmluZ1tdIGl0ZW1zKTsKKworCQkvKioKKwkJICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgbGlzdCB3aWRnZXQncyBpdGVtcyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorCQkgKi8KKwkJdm9pZCBhZGQoU3RyaW5nIGl0ZW0sIGludCBpbmRleCk7CisKKwkJLyoqCisJCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIGl0ZW1zIGZyb20gdGhlIGxpc3Qgd2lkZ2V0J3MgaXRlbXMuCisJCSAqLworCQl2b2lkIHJlbW92ZShpbnQgc3RhcnQsIGludCBlbmQpOworCisJCS8qKgorCQkgKiBSZW1vdmUgYWxsIHRoZSBpdGVtcyBmcm9tIHRoZSBsaXN0IHdpZGdldC4KKwkJICovCisJCXZvaWQgcmVtb3ZlQWxsKCk7CisKKwl9CisKKworCS8qKgorCSAqIFdpZGdldC1zcGVjaWZpYyBzZWxlY3Rpb24gYmluZGluZyB0aGF0IGlzIGNvbnRyb2xsZWQgYnkgdGhlIGxpc3Qgd2lkZ2V0CisJICogbW9kZWwgYmluZGluZy4KKwkgKi8KKwlpbnRlcmZhY2UgU2VsZWN0aW9uQmluZGluZyB7CisKKwkJLyoqCisJCSAqIFN5bmNocm9uaXplIHRoZSBzZWxlY3Rpb24gYmluZGluZydzIHdpZGdldCB3aXRoIHRoZSBzZWxlY3Rpb24gbW9kZWwuCisJCSAqIDxwPgorCQkgKiBQcmUtY29uZGl0aW9uOiBUaGUgd2lkZ2V0IGlzIG5vdCBkaXNwb3NlZC4KKwkJICovCisJCXZvaWQgc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQ7IGRpc3Bvc2UgdGhlIHNlbGVjdGlvbiBiaW5kaW5nLgorCQkgKi8KKwkJdm9pZCBkaXNwb3NlKCk7CisKKworCQkvKioKKwkJICogVXNlZnVsIGZvciBsaXN0IGJveGVzIHRoYXQgaWdub3JlIHRoZSBzZWxlY3Rpb24uCisJCSAqLworCQlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgU2VsZWN0aW9uQmluZGluZyB7CisJCQlwdWJsaWMgc3RhdGljIGZpbmFsIFNlbGVjdGlvbkJpbmRpbmcgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOworCQkJcHVibGljIHN0YXRpYyBTZWxlY3Rpb25CaW5kaW5nIGluc3RhbmNlKCkgeworCQkJCXJldHVybiBJTlNUQU5DRTsKKwkJCX0KKwkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKKwkJCXByaXZhdGUgTnVsbCgpIHsKKwkJCQlzdXBlcigpOworCQkJfQorCQkJcHVibGljIHZvaWQgc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCkgeworCQkJCS8vIGRvIG5vdGhpbmcKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQkJLy8gZG8gbm90aGluZworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiU2VsZWN0aW9uQmluZGluZy5OdWxsIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVENDb21ib0FkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVENDb21ib0FkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjFkZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU1dUQ0NvbWJvQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87CisKKy8qKgorICogQWRhcHQgYW4gU1dUIHtAbGluayBDQ29tYm99IHRvIHRoZSBsaXN0IHdpZGdldCBleHBlY3RlZCBieQorICoge0BsaW5rIExpc3RXaWRnZXRNb2RlbEJpbmRpbmd9IGFuZCB0aGUKKyAqIGRyb3AtZG93biBsaXN0IGJveCBleHBlY3RlZCBieSB7QGxpbmsgRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZ30uCisgKi8KK2ZpbmFsIGNsYXNzIFNXVENDb21ib0FkYXB0ZXIKKwlleHRlbmRzIEFic3RyYWN0TGlzdFdpZGdldEFkYXB0ZXI8Q0NvbWJvPgorCWltcGxlbWVudHMgRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZy5Ecm9wRG93bkxpc3RCb3gKK3sKKwlTV1RDQ29tYm9BZGFwdGVyKENDb21ibyBjb21ibykgeworCQlzdXBlcihjb21ibyk7CisJfQorCisJLy8gKioqKioqKioqKiBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLkxpc3RXaWRnZXQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIFN0cmluZ1tdIGdldEl0ZW1zKCkgeworCQlyZXR1cm4gdGhpcy53aWRnZXQuZ2V0SXRlbXMoKTsKKwl9CisKKwkvKioKKwkgKiB7QGxpbmsgQ0NvbWJvI3NldEl0ZW0oaW50KX0gZG9lcyBub3QgdXBkYXRlIHRoZSB0ZXh0IGZpZWxkIGlmIHdlIGFyZQorCSAqIGNoYW5naW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbS4gU28gaWYgd2UgYXJlIGNoYW5naW5nIHRoZQorCSAqIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLCB3ZSBkZXNlbGVjdCBpdCwgc2V0IGl0IGluIHRoZSBsaXN0LCBhbmQKKwkgKiByZS1zZWxlY3QgaXQgc28gdGhlIHRleHQgZmllbGQgdXBkYXRlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJdGVtKGludCBpbmRleCwgU3RyaW5nIGl0ZW0pIHsKKwkJaW50IGN1cnJlbnRJbmRleCA9IHRoaXMud2lkZ2V0LmdldFNlbGVjdGlvbkluZGV4KCk7CisJCWlmIChjdXJyZW50SW5kZXggPT0gaW5kZXgpIHsKKwkJCXRoaXMud2lkZ2V0LmRlc2VsZWN0QWxsKCk7CisJCX0KKwkJdGhpcy53aWRnZXQuc2V0SXRlbShpbmRleCwgaXRlbSk7CisJCWlmIChjdXJyZW50SW5kZXggPT0gaW5kZXgpIHsKKwkJCXRoaXMud2lkZ2V0LnNlbGVjdChjdXJyZW50SW5kZXgpOworCQl9CisJfQorCisJLyoqCisJICoge0BsaW5rIENDb21ibyNzZXRJdGVtcyhTdHJpbmdbXSl9IHdpbGwgY2xlYXIgdGhlIHRleHQgZmllbGQgaWYgaXQgaXMKKwkgKiByZWFkLW9ubHkuCisJICovCisJcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpIHsKKwkJdGhpcy53aWRnZXQuc2V0SXRlbXMoaXRlbXMpOworCX0KKworCS8qKgorCSAqIFRoZSB0ZXh0IGZpZWxkIHdpbGwgYmUgdXBkYXRlZCB3aGVuIHdlIHN5bmNoIHRoZSBzZWxlY3Rpb24gYWZ0ZXIgYW4KKwkgKiBpdGVtIGlzIGFkZGVkIHRvIHRoZSBsaXN0LgorCSAqLworCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgaXRlbSwgaW50IGluZGV4KSB7CisJCXRoaXMud2lkZ2V0LmFkZChpdGVtLCBpbmRleCk7CisJfQorCisJLyoqCisJICogVGhlIHRleHQgZmllbGQgd2lsbCBiZSB1cGRhdGVkIHdoZW4gd2Ugc3luY2ggdGhlIHNlbGVjdGlvbiBhZnRlcgorCSAqIGl0ZW1zIGFyZSByZW1vdmVkIGZyb20gdGhlIGxpc3QuIElmIHRoZSBzZWxlY3Rpb24gd2FzIGFtb25nIHRoZSByZW1vdmVkCisJICogaXRlbXMsIHRoZSBtb2RlbCBzaG91bGQgaGF2ZSBhbHJlYWR5IGNsZWFyZWQgdGhlIHNlbGVjdGlvbiA8ZW0+YmVmb3JlPC9lbT4KKwkgKiB0aGUgbWFzdGVyIGxpc3Qgd2FzIG1vZGlmaWVkLgorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJdGhpcy53aWRnZXQucmVtb3ZlKHN0YXJ0LCBlbmQpOworCX0KKworCS8qKgorCSAqIHtAbGluayBDQ29tYm8jcmVtb3ZlQWxsKCl9IHdpbGwgY2xlYXIgdGhlIHRleHQgZmllbGQuCisJICogVGhlIG1vZGVsIHNlbGVjdGlvbiBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gY2xlYXJlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7CisJCXRoaXMud2lkZ2V0LnJlbW92ZUFsbCgpOworCX0KKworCisJLy8gKioqKioqKioqKiBDb21ib0JveFNlbGVjdGlvbkJpbmRpbmcuQ29tYm9Cb3ggaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJdGhpcy53aWRnZXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXRoaXMud2lkZ2V0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgaW50IGdldFNlbGVjdGlvbkluZGV4KCkgeworCQlyZXR1cm4gdGhpcy53aWRnZXQuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZWxlY3QoaW50IGluZGV4KSB7CisJCXRoaXMud2lkZ2V0LnNlbGVjdChpbmRleCk7CisJfQorCisJLyoqCisJICoge0BsaW5rIENDb21ibyNkZXNlbGVjdChpbnQpfSB3aWxsIGNsZWFyIHRoZSB0ZXh0IGZpZWxkIGlmIHRoZSBpbmRleAorCSAqIG1hdGNoZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluZGV4LgorCSAqLworCXB1YmxpYyB2b2lkIGRlc2VsZWN0KGludCBpbmRleCkgeworCQl0aGlzLndpZGdldC5kZXNlbGVjdChpbmRleCk7CisJfQorCisJLyoqCisJICoge0BsaW5rIENDb21ibyNkZXNlbGVjdEFsbCgpfSB3aWxsIGNsZWFyIHRoZSB0ZXh0IGZpZWxkLgorCSAqIFRoZSBtb2RlbCBzZWxlY3Rpb24gc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGNsZWFyZWQuCisJICovCisJcHVibGljIHZvaWQgZGVzZWxlY3RBbGwoKSB7CisJCXRoaXMud2lkZ2V0LmRlc2VsZWN0QWxsKCk7CisJfQorCit9CisKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVENvbWJvQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU1dUQ29tYm9BZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1MDcxZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVENvbWJvQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKKworLyoqCisgKiBBZGFwdCBhbiBTV1Qge0BsaW5rIENvbWJvfSB0byB0aGUgbGlzdCB3aWRnZXQgZXhwZWN0ZWQgYnkKKyAqIHtAbGluayBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nfSBhbmQgdGhlCisgKiBkcm9wLWRvd24gbGlzdCBib3ggZXhwZWN0ZWQgYnkge0BsaW5rIERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmd9LgorICovCitmaW5hbCBjbGFzcyBTV1RDb21ib0FkYXB0ZXIKKwlleHRlbmRzIEFic3RyYWN0TGlzdFdpZGdldEFkYXB0ZXI8Q29tYm8+CisJaW1wbGVtZW50cyBEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLkRyb3BEb3duTGlzdEJveAoreworCVNXVENvbWJvQWRhcHRlcihDb21ibyBjb21ibykgeworCQlzdXBlcihjb21ibyk7CisJfQorCisJLy8gKioqKioqKioqKiBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLkxpc3RXaWRnZXQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCXB1YmxpYyBTdHJpbmdbXSBnZXRJdGVtcygpIHsKKwkJcmV0dXJuIHRoaXMud2lkZ2V0LmdldEl0ZW1zKCk7CisJfQorCXB1YmxpYyB2b2lkIHNldEl0ZW0oaW50IGluZGV4LCBTdHJpbmcgaXRlbSkgeworCQl0aGlzLndpZGdldC5zZXRJdGVtKGluZGV4LCBpdGVtKTsKKwl9CisJcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpIHsKKwkJdGhpcy53aWRnZXQuc2V0SXRlbXMoaXRlbXMpOworCX0KKwlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGl0ZW0sIGludCBpbmRleCkgeworCQl0aGlzLndpZGdldC5hZGQoaXRlbSwgaW5kZXgpOworCX0KKwlwdWJsaWMgdm9pZCByZW1vdmUoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJCXRoaXMud2lkZ2V0LnJlbW92ZShzdGFydCwgZW5kKTsKKwl9CisJcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgeworCQl0aGlzLndpZGdldC5yZW1vdmVBbGwoKTsKKwl9CisKKwkvLyAqKioqKioqKioqIENvbWJvQm94U2VsZWN0aW9uQmluZGluZy5Db21ib0JveCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJdGhpcy53aWRnZXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCX0KKwlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworCQl0aGlzLndpZGdldC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJfQorCXB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKSB7CisJCXJldHVybiB0aGlzLndpZGdldC5nZXRTZWxlY3Rpb25JbmRleCgpOworCX0KKwlwdWJsaWMgdm9pZCBzZWxlY3QoaW50IGluZGV4KSB7CisJCXRoaXMud2lkZ2V0LnNlbGVjdChpbmRleCk7CisJfQorCXB1YmxpYyB2b2lkIGRlc2VsZWN0KGludCBpbmRleCkgeworCQl0aGlzLndpZGdldC5kZXNlbGVjdChpbmRleCk7CisJfQorCXB1YmxpYyB2b2lkIGRlc2VsZWN0QWxsKCkgeworCQl0aGlzLndpZGdldC5kZXNlbGVjdEFsbCgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVExpc3RBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RMaXN0QWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjgxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RMaXN0QWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWxpdHkuc3d0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OworCisvKioKKyAqIEFkYXB0IGFuIFNXVCB7QGxpbmsgTGlzdH0gdG8gdGhlIGxpc3Qgd2lkZ2V0IGV4cGVjdGVkIGJ5CisgKiB7QGxpbmsgTGlzdFdpZGdldE1vZGVsQmluZGluZ30uCisgKi8KK2ZpbmFsIGNsYXNzIFNXVExpc3RBZGFwdGVyCisJZXh0ZW5kcyBBYnN0cmFjdExpc3RXaWRnZXRBZGFwdGVyPExpc3Q+Cit7CisJU1dUTGlzdEFkYXB0ZXIoTGlzdCBsaXN0KSB7CisJCXN1cGVyKGxpc3QpOworCX0KKwlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworCQl0aGlzLndpZGdldC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJfQorCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXRoaXMud2lkZ2V0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwl9CisJcHVibGljIFN0cmluZ1tdIGdldEl0ZW1zKCkgeworCQlyZXR1cm4gdGhpcy53aWRnZXQuZ2V0SXRlbXMoKTsKKwl9CisJcHVibGljIHZvaWQgc2V0SXRlbShpbnQgaW5kZXgsIFN0cmluZyBpdGVtKSB7CisJCXRoaXMud2lkZ2V0LnNldEl0ZW0oaW5kZXgsIGl0ZW0pOworCX0KKwlwdWJsaWMgdm9pZCBzZXRJdGVtcyhTdHJpbmdbXSBpdGVtcykgeworCQl0aGlzLndpZGdldC5zZXRJdGVtcyhpdGVtcyk7CisJfQorCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgaXRlbSwgaW50IGluZGV4KSB7CisJCXRoaXMud2lkZ2V0LmFkZChpdGVtLCBpbmRleCk7CisJfQorCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgc3RhcnQsIGludCBlbmQpIHsKKwkJdGhpcy53aWRnZXQucmVtb3ZlKHN0YXJ0LCBlbmQpOworCX0KKwlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7CisJCXRoaXMud2lkZ2V0LnJlbW92ZUFsbCgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVFRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RUb29scy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTdhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RUb29scy5qYXZhCkBAIC0wLDAgKzEsMzI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpdFRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7CisKKy8qKgorICogVmFyaW91cyBTV1QgdG9vbHMuCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGZpbmFsIGNsYXNzIFNXVFRvb2xzIHsKKworCS8vICoqKioqKioqKiogY2hlY2stYm94L3JhZGlvIGJ1dHRvbi90b2dnbGUgYnV0dG9uICoqKioqKioqKioKKworCS8qKgorCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBidXR0b24gKGNoZWNrLWJveCwgcmFkaW8gYnV0dG9uLCBvciB0b2dnbGUgYnV0dG9uKQorCSAqIHRvIHRoZSBzcGVjaWZpZWQgYm9vbGVhbi4KKwkgKiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgYnV0dG9uJ3MgJ3NlbGVjdGlvbicgc3RhdGUgd2lsbAorCSAqIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBiaW5kKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIEJ1dHRvbiBidXR0b24pIHsKKwkJYmluZChib29sZWFuSG9sZGVyLCBidXR0b24sIGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgYnV0dG9uIChjaGVjay1ib3gsIHJhZGlvIGJ1dHRvbiwgb3IgdG9nZ2xlIGJ1dHRvbikKKwkgKiB0byB0aGUgc3BlY2lmaWVkIGJvb2xlYW4uCisJICogSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGJ1dHRvbidzICdzZWxlY3Rpb24nIHN0YXRlIHdpbGwKKwkgKiBiZSB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGJpbmQoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwgQnV0dG9uIGJ1dHRvbiwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKKwkJLy8gdGhlIG5ldyBiaW5kaW5nIHdpbGwgYWRkIGl0c2VsZiBhcyBhIGxpc3RlbmVyIHRvIHRoZSB2YWx1ZSBtb2RlbCBhbmQgdGhlIGJ1dHRvbgorCQluZXcgQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZyhib29sZWFuSG9sZGVyLCBidXR0b24sIGRlZmF1bHRWYWx1ZSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIGxpc3QgYm94ICoqKioqKioqKioKKworCS8qKgorCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCisJICogVGhlIGxpc3QgYm94IHNlbGVjdGlvbiBpcyBpZ25vcmVkLgorCSAqIFVzZSB0aGUgZGVmYXVsdCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKKwkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LCB3aGljaCBjYWxscyB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCl9CisJICogb24gdGhlIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBMaXN0IGxpc3RCb3gpIHsKKwkJYmluZChsaXN0SG9sZGVyLCBsaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48RT5pbnN0YW5jZSgpKTsKKwl9CisKKwkvKioKKwkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgorCSAqIFRoZSBsaXN0IGJveCBzZWxlY3Rpb24gaXMgaWdub3JlZC4KKwkgKiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKKwkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBMaXN0IGxpc3RCb3gsIFN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIpIHsKKwkJYmluZChsaXN0SG9sZGVyLCBuZXcgU1dUTGlzdEFkYXB0ZXIobGlzdEJveCksIHN0cmluZ0NvbnZlcnRlcik7CisJfQorCisJLyoqCisJICogQmluZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgorCSAqIFVzZSB0aGUgZGVmYXVsdCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKKwkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LCB3aGljaCBjYWxscyB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCl9CisJICogb24gdGhlIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsIExpc3QgbGlzdEJveCkgeworCQliaW5kKGxpc3RIb2xkZXIsIHNlbGVjdGVkSXRlbUhvbGRlciwgbGlzdEJveCwgU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPEU+aW5zdGFuY2UoKSk7CisJfQorCisJLyoqCisJICogQWRhcHQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBsaXN0IGJveC4KKwkgKiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKKwkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsIExpc3QgbGlzdEJveCwgU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikgeworCQljaGVja0ZvclNpbmdsZVNlbGVjdGlvblN0eWxlKGxpc3RCb3gpOworCQliaW5kKGxpc3RIb2xkZXIsIG5ldyBXcml0YWJsZVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+KHNlbGVjdGVkSXRlbUhvbGRlciksIGxpc3RCb3gsIHN0cmluZ0NvbnZlcnRlcik7CisJfQorCisJLyoqCisJICogQmluZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBsaXN0IGJveC4KKwkgKiBVc2UgdGhlIGRlZmF1bHQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCisJICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveCwgd2hpY2ggY2FsbHMge0BsaW5rIE9iamVjdCN0b1N0cmluZygpfQorCSAqIG9uIHRoZSBpdGVtcyBpbiB0aGUgbW9kZWwgbGlzdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1zSG9sZGVyLCBMaXN0IGxpc3RCb3gpIHsKKwkJYmluZChsaXN0SG9sZGVyLCBzZWxlY3RlZEl0ZW1zSG9sZGVyLCBsaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48RT5pbnN0YW5jZSgpKTsKKwl9CisKKwkvKioKKwkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgorCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncworCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCisJICovCisJcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc0hvbGRlciwgTGlzdCBsaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKSB7CisJCWJpbmQoCisJCQkJbGlzdEhvbGRlciwKKwkJCQluZXcgU1dUTGlzdEFkYXB0ZXIobGlzdEJveCksCisJCQkJc3RyaW5nQ29udmVydGVyLAorCQkJCW5ldyBMaXN0Qm94U2VsZWN0aW9uQmluZGluZzxFPihsaXN0SG9sZGVyLCBzZWxlY3RlZEl0ZW1zSG9sZGVyLCBsaXN0Qm94KQorCQkpOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tGb3JTaW5nbGVTZWxlY3Rpb25TdHlsZShMaXN0IGxpc3RCb3gpIHsKKwkJaWYgKCAhIEJpdFRvb2xzLmZsYWdJc1NldChsaXN0Qm94LmdldFN0eWxlKCksIFNXVC5TSU5HTEUpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJsaXN0IGJveCBtdXN0IGJlIHNpbmdsZS1zZWxlY3Rpb246ICIgKyBsaXN0Qm94KTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBkcm9wLWRvd24gbGlzdCBib3ggKioqKioqKioqKgorCisJLyoqCisJICogQmluZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGRyb3AtZG93biBsaXN0IGJveC4KKwkgKiBVc2UgdGhlIGRlZmF1bHQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCisJICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBkcm9wLWRvd24gbGlzdCBib3gsIHdoaWNoIGNhbGxzIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKX0KKwkgKiBvbiB0aGUgaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QuCisJICovCisJcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbUhvbGRlciwgQ29tYm8gZHJvcERvd25MaXN0Qm94KSB7CisJCWJpbmQobGlzdEhvbGRlciwgc2VsZWN0ZWRJdGVtSG9sZGVyLCBkcm9wRG93bkxpc3RCb3gsIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxFPmluc3RhbmNlKCkpOworCX0KKworCS8qKgorCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgZHJvcC1kb3duIGxpc3QgYm94LgorCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncworCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZHJvcC1kb3duIGxpc3QgYm94LgorCSAqLworCXB1YmxpYyBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsIENvbWJvIGRyb3BEb3duTGlzdEJveCwgU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikgeworCQljaGVja0ZvclJlYWRPbmx5U3R5bGUoZHJvcERvd25MaXN0Qm94KTsKKwkJU1dUQ29tYm9BZGFwdGVyIGNvbWJvQWRhcHRlciA9IG5ldyBTV1RDb21ib0FkYXB0ZXIoZHJvcERvd25MaXN0Qm94KTsKKwkJYmluZCgKKwkJCQlsaXN0SG9sZGVyLAorCQkJCWNvbWJvQWRhcHRlciwKKwkJCQlzdHJpbmdDb252ZXJ0ZXIsCisJCQkJbmV3IERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmc8RT4obGlzdEhvbGRlciwgc2VsZWN0ZWRJdGVtSG9sZGVyLCBjb21ib0FkYXB0ZXIpCisJCSk7CisJfQorCisJLyoqCisJICogQmluZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGRyb3AtZG93biBsaXN0IGJveC4KKwkgKiBVc2UgdGhlIGRlZmF1bHQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCisJICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBkcm9wLWRvd24gbGlzdCBib3gsIHdoaWNoIGNhbGxzIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKX0KKwkgKiBvbiB0aGUgaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QuCisJICovCisJcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbUhvbGRlciwgQ0NvbWJvIGRyb3BEb3duTGlzdEJveCkgeworCQliaW5kKGxpc3RIb2xkZXIsIHNlbGVjdGVkSXRlbUhvbGRlciwgZHJvcERvd25MaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48RT5pbnN0YW5jZSgpKTsKKwl9CisKKwkvKioKKwkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGRyb3AtZG93biBsaXN0IGJveC4KKwkgKiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKKwkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGRyb3AtZG93biBsaXN0IGJveC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtSG9sZGVyLCBDQ29tYm8gZHJvcERvd25MaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKSB7CisJCWNoZWNrRm9yUmVhZE9ubHlTdHlsZShkcm9wRG93bkxpc3RCb3gpOworCQlTV1RDQ29tYm9BZGFwdGVyIGNvbWJvQWRhcHRlciA9IG5ldyBTV1RDQ29tYm9BZGFwdGVyKGRyb3BEb3duTGlzdEJveCk7CisJCWJpbmQoCisJCQkJbGlzdEhvbGRlciwKKwkJCQljb21ib0FkYXB0ZXIsCisJCQkJc3RyaW5nQ29udmVydGVyLAorCQkJCW5ldyBEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nPEU+KGxpc3RIb2xkZXIsIHNlbGVjdGVkSXRlbUhvbGRlciwgY29tYm9BZGFwdGVyKQorCQkpOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tGb3JSZWFkT25seVN0eWxlKFdpZGdldCBjb21ib0JveCkgeworCQlpZiAoICEgQml0VG9vbHMuZmxhZ0lzU2V0KGNvbWJvQm94LmdldFN0eWxlKCksIFNXVC5SRUFEX09OTFkpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb21iby1ib3ggbXVzdCBiZSByZWFkLW9ubHk6ICIgKyBjb21ib0JveCk7CisJCX0KKwl9CisKKworCS8vICoqKioqKioqKiogbGlzdCAid2lkZ2V0IiAqKioqKioqKioqCisKKwkvKioKKwkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCB0byB0aGUgc3BlY2lmaWVkIGxpc3Qgd2lkZ2V0LgorCSAqIFRoZSBsaXN0IHdpZGdldCdzIHNlbGVjdGlvbiBpcyBpZ25vcmVkLgorCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncworCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCisJICovCisJcHJpdmF0ZSBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLkxpc3RXaWRnZXQgbGlzdFdpZGdldCwgU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikgeworCQliaW5kKGxpc3RIb2xkZXIsIGxpc3RXaWRnZXQsIHN0cmluZ0NvbnZlcnRlciwgTGlzdFdpZGdldE1vZGVsQmluZGluZy5TZWxlY3Rpb25CaW5kaW5nLk51bGwuaW5zdGFuY2UoKSk7CisJfQorCisJLyoqCisJICogQmluZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgdG8gdGhlIHNwZWNpZmllZCBsaXN0IHdpZGdldC4KKwkgKiBVc2UgdGhlIHNwZWNpZmllZCBzZWxlY3Rpb24gYmluZGluZyB0byBjb250cm9sIHRoZSBsaXN0IHdpZGdldCdzIHNlbGVjdGlvbi4KKwkgKiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKKwkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LgorCSAqLworCXByaXZhdGUgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgTGlzdFdpZGdldE1vZGVsQmluZGluZy5MaXN0V2lkZ2V0IGxpc3RXaWRnZXQsIFN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIsIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZyBzZWxlY3Rpb25CaW5kaW5nKSB7CisJCS8vIHRoZSBuZXcgYmluZGluZyB3aWxsIGFkZCBpdHNlbGYgYXMgYSBsaXN0ZW5lciB0byB0aGUgdmFsdWUgbW9kZWxzIGFuZCB0aGUgbGlzdCBib3gKKwkJbmV3IExpc3RXaWRnZXRNb2RlbEJpbmRpbmc8RT4obGlzdEhvbGRlciwgbGlzdFdpZGdldCwgc3RyaW5nQ29udmVydGVyLCBzZWxlY3Rpb25CaW5kaW5nKTsKKwl9CisKKworCS8vICoqKioqKioqKiogJ2VuYWJsZWQnIHN0YXRlICoqKioqKioqKioKKworCS8qKgorCSAqIENvbnRyb2wgdGhlICdlbmFibGVkJyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlIHNwZWNpZmllZAorCSAqIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBidXR0b24ncyAnZW5hYmxlZCcgc3RhdGUgd2lsbAorCSAqIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sRW5hYmxlZFN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBDb250cm9sLi4uIGNvbnRyb2xzKSB7CisJCWNvbnRyb2xFbmFibGVkU3RhdGUoYm9vbGVhbkhvbGRlciwgY29udHJvbHMsIGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBDb250cm9sIHRoZSAnZW5hYmxlZCcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9scyB3aXRoIHRoZSBzcGVjaWZpZWQKKwkgKiBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgYnV0dG9uJ3MgJ2VuYWJsZWQnIHN0YXRlIHdpbGwKKwkgKiBiZSB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xFbmFibGVkU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIENvbnRyb2xbXSBjb250cm9scywgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKKwkJY29udHJvbEVuYWJsZWRTdGF0ZShib29sZWFuSG9sZGVyLCBuZXcgQXJyYXlJdGVyYWJsZTxDb250cm9sPihjb250cm9scyksIGRlZmF1bHRWYWx1ZSk7CisJfQorCisJLyoqCisJICogQ29udHJvbCB0aGUgJ2VuYWJsZWQnIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUgc3BlY2lmaWVkCisJICogYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGJ1dHRvbidzICdlbmFibGVkJyBzdGF0ZSB3aWxsCisJICogYmUgPGNvZGU+ZmFsc2U8Y29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xFbmFibGVkU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scykgeworCQljb250cm9sRW5hYmxlZFN0YXRlKGJvb2xlYW5Ib2xkZXIsIGNvbnRyb2xzLCBmYWxzZSk7CisJfQorCisJLyoqCisJICogQ29udHJvbCB0aGUgJ2VuYWJsZWQnIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUgc3BlY2lmaWVkCisJICogYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGJ1dHRvbidzICdlbmFibGVkJyBzdGF0ZSB3aWxsCisJICogYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sRW5hYmxlZFN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBJdGVyYWJsZTw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7CisJCWNvbnRyb2woYm9vbGVhbkhvbGRlciwgY29udHJvbHMsIGRlZmF1bHRWYWx1ZSwgRU5BQkxFRF9BREFQVEVSKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb29sZWFuU3RhdGVDb250cm9sbGVyLkFkYXB0ZXIgRU5BQkxFRF9BREFQVEVSID0KKwkJCW5ldyBCb29sZWFuU3RhdGVDb250cm9sbGVyLkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgc2V0U3RhdGUoQ29udHJvbCBjb250cm9sLCBib29sZWFuIGIpIHsKKwkJCQkJY29udHJvbC5zZXRFbmFibGVkKGIpOworCQkJCX0KKwkJCX07CisgICAKKworCS8vICoqKioqKioqKiogJ3Zpc2libGUnIHN0YXRlICoqKioqKioqKioKKworCS8qKgorCSAqIENvbnRyb2wgdGhlICd2aXNpYmxlJyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlIHNwZWNpZmllZAorCSAqIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBidXR0b24ncyAndmlzaWJsZScgc3RhdGUgd2lsbAorCSAqIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBDb250cm9sLi4uIGNvbnRyb2xzKSB7CisJCWNvbnRyb2xWaXNpYmxlU3RhdGUoYm9vbGVhbkhvbGRlciwgY29udHJvbHMsIGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBDb250cm9sIHRoZSAndmlzaWJsZScgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9scyB3aXRoIHRoZSBzcGVjaWZpZWQKKwkgKiBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgYnV0dG9uJ3MgJ3Zpc2libGUnIHN0YXRlIHdpbGwKKwkgKiBiZSB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xWaXNpYmxlU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIENvbnRyb2xbXSBjb250cm9scywgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKKwkJY29udHJvbFZpc2libGVTdGF0ZShib29sZWFuSG9sZGVyLCBuZXcgQXJyYXlJdGVyYWJsZTxDb250cm9sPihjb250cm9scyksIGRlZmF1bHRWYWx1ZSk7CisJfQorCisJLyoqCisJICogQ29udHJvbCB0aGUgJ3Zpc2libGUnIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUgc3BlY2lmaWVkCisJICogYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGJ1dHRvbidzICd2aXNpYmxlJyBzdGF0ZSB3aWxsCisJICogYmUgPGNvZGU+ZmFsc2U8Y29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xWaXNpYmxlU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scykgeworCQljb250cm9sVmlzaWJsZVN0YXRlKGJvb2xlYW5Ib2xkZXIsIGNvbnRyb2xzLCBmYWxzZSk7CisJfQorCisJLyoqCisJICogQ29udHJvbCB0aGUgJ3Zpc2libGUnIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUgc3BlY2lmaWVkCisJICogYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGJ1dHRvbidzICd2aXNpYmxlJyBzdGF0ZSB3aWxsCisJICogYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBJdGVyYWJsZTw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7CisJCWNvbnRyb2woYm9vbGVhbkhvbGRlciwgY29udHJvbHMsIGRlZmF1bHRWYWx1ZSwgVklTSUJMRV9BREFQVEVSKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb29sZWFuU3RhdGVDb250cm9sbGVyLkFkYXB0ZXIgVklTSUJMRV9BREFQVEVSID0KKwkJCW5ldyBCb29sZWFuU3RhdGVDb250cm9sbGVyLkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgc2V0U3RhdGUoQ29udHJvbCBjb250cm9sLCBib29sZWFuIGIpIHsKKwkJCQkJY29udHJvbC5zZXRWaXNpYmxlKGIpOworCQkJCX0KKwkJCX07CisgICAKKworCS8vICoqKioqKioqKiogYm9vbGVhbiBzdGF0ZSBjb250cm9sbGVyICoqKioqKioqKioKKworCXByaXZhdGUgc3RhdGljIHZvaWQgY29udHJvbChQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwgSXRlcmFibGU8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzLCBib29sZWFuIGRlZmF1bHRWYWx1ZSwgQm9vbGVhblN0YXRlQ29udHJvbGxlci5BZGFwdGVyIGFkYXB0ZXIpIHsKKwkJLy8gdGhlIG5ldyBjb250cm9sbGVyIHdpbGwgYWRkIGl0c2VsZiBhcyBhIGxpc3RlbmVyIHRvIHRoZSB2YWx1ZSBtb2RlbCBhbmQgdGhlIGNvbnRyb2xzCisJCW5ldyBCb29sZWFuU3RhdGVDb250cm9sbGVyKGJvb2xlYW5Ib2xkZXIsIGNvbnRyb2xzLCBkZWZhdWx0VmFsdWUsIGFkYXB0ZXIpOworCX0KKworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCisKKwkvKioKKwkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgorCSAqLworCXByaXZhdGUgU1dUVG9vbHMoKSB7CisJCXN1cGVyKCk7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3MvQWJzdHJhY3RKcGFWaWV3LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9BYnN0cmFjdEpwYVZpZXcuamF2YQppbmRleCBiYjQ0OTliLi5kNmEwYmNiIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9BYnN0cmFjdEpwYVZpZXcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9BYnN0cmFjdEpwYVZpZXcuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uSnBhU2VsZWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uSnBhU2VsZWN0aW9uTWFuYWdlcjsKQEAgLTE2LDYgKzE3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5Qcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKQEAgLTUxLDYgKzUzLDkgQEAKIAkgKi8KIAlwcml2YXRlIFBhZ2VCb29rIHBhZ2VCb29rOwogCisJcHJpdmF0ZSBTY3JvbGxlZEZvcm0gc2Nyb2xsZWRGb3JtOworCQorCQogCS8qKgogCSAqIFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB2YXJpb3VzIHdpZGdldHMuCiAJICovCkBAIC03NCwxNSArNzksMjEgQEAKIAkJcmV0dXJuIGNvbXBvc2l0ZTsKIAl9CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHBhcmVudCwgU1dULk5PTkUpOworCQl0aGlzLnNjcm9sbGVkRm9ybSA9IGdldEZvcm1XaWRnZXRGYWN0b3J5KCkuY3JlYXRlU2Nyb2xsZWRGb3JtKHBhcmVudCk7CisJCUpwdFVpUGx1Z2luLmluc3RhbmNlKCkuY29udHJvbEFmZmVjdHNKYXZhU291cmNlKHRoaXMuc2Nyb2xsZWRGb3JtKTsKKwkJdGhpcy5zY3JvbGxlZEZvcm0uZ2V0Qm9keSgpLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKIAotCQlkZWZhdWx0Q29tcG9zaXRlID0gYnVpbGREZWZhdWx0Q29tcG9zaXRlKCk7Ci0JCXBhZ2VCb29rLnNob3dQYWdlKGRlZmF1bHRDb21wb3NpdGUpOworCQl0aGlzLnBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHRoaXMuc2Nyb2xsZWRGb3JtLmdldEJvZHkoKSwgU1dULk5PTkUpOworCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQl0aGlzLnBhZ2VCb29rLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCQl0aGlzLnNjcm9sbGVkRm9ybS5zZXRDb250ZW50KHRoaXMucGFnZUJvb2spOworCisJCXRoaXMuZGVmYXVsdENvbXBvc2l0ZSA9IGJ1aWxkRGVmYXVsdENvbXBvc2l0ZSgpOworCQl0aGlzLnBhZ2VCb29rLnNob3dQYWdlKHRoaXMuZGVmYXVsdENvbXBvc2l0ZSk7CiAKIAkJc3ViY3JlYXRlUGFydENvbnRyb2wocGFyZW50KTsKIApAQCAtOTQsNyArMTA1LDcgQEAKIAl9CiAKIAlwcm90ZWN0ZWQgZmluYWwgUGFnZUJvb2sgZ2V0UGFnZUJvb2soKSB7Ci0JCXJldHVybiBwYWdlQm9vazsKKwkJcmV0dXJuIHRoaXMucGFnZUJvb2s7CiAJfQogCiAJcHVibGljIGZpbmFsIFdpZGdldEZhY3RvcnkgZ2V0V2lkZ2V0RmFjdG9yeSgpIHsKQEAgLTE0MywyNCArMTU0LDEzIEBACiAJICogQHBhcmFtIHBhZ2UgVGhlIG5ldyBwYWdlIHRvIHNob3csIDxjb2RlPm51bGw8L2NvZGU+IGNhbid0IGJlIHBhc3NlZAogCSAqLwogCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNob3dQYWdlKENvbnRyb2wgcGFnZSkgewotCQlwYWdlQm9vay5nZXRQYXJlbnQoKS5zZXRSZWRyYXcoZmFsc2UpOwotCQl0cnkgewotCQkJLy8gSXQgc2VlbXMgdGhlIHNjcm9sbCBwYW5lIGhhcyB0byBiZSBpbnN0YWxsZWQgcmlnaHQgYmVmb3JlIHNob3dpbmcKLQkJCS8vIHRoZSBwYWdlLCBpZiBpdCBpcyBpbnN0YWxsZWQgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiB0aGUgcGFuZSB0aGVuCi0JCQkvLyBpdHMgbGF5b3V0IHdpbGwgbm90IGFsd2F5cyByZXZhbGlkYXRlIGNvcnJlY3RseSwgaS5lLiB3aWxsIG5vdCBzaG93Ci0JCQkvLyBhbGwgdGhlIHRpbWUgdGhlIHZlcnRpY2FsIHNjcm9sbCBiYXIKLQkJCVNjcm9sbGVkRm9ybSBzY3JvbGxlZEZvcm0gPSBnZXRGb3JtV2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNjcm9sbGVkRm9ybShwYWdlQm9vayk7Ci0JCQlzY3JvbGxlZEZvcm0uZ2V0Qm9keSgpLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQkJcGFnZS5zZXRQYXJlbnQoc2Nyb2xsZWRGb3JtLmdldEJvZHkoKSk7Ci0KLQkJCXBhZ2VCb29rLnNob3dQYWdlKHNjcm9sbGVkRm9ybSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlwYWdlQm9vay5nZXRQYXJlbnQoKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCX0KKwkJcGFnZS5zZXRQYXJlbnQodGhpcy5wYWdlQm9vayk7CisJCXRoaXMucGFnZUJvb2suc2hvd1BhZ2UocGFnZSk7CisJCXRoaXMuc2Nyb2xsZWRGb3JtLnJlZmxvdyh0cnVlKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzdWJjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJcHJvdGVjdGVkIHZvaWQgc3ViY3JlYXRlUGFydENvbnRyb2woQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbXBvc2l0ZSBwYXJlbnQpIHsKIAkJLy8gbm8gb3AgLSBmb3Igc3ViY2xhc3NlcyB0byBvdmVycmlkZSBpZiB3aXNoZWQKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9KcGFEZXRhaWxzVmlldy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3MvSnBhRGV0YWlsc1ZpZXcuamF2YQppbmRleCAzMDAxOTAyLi4xNzE2NGEzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9KcGFEZXRhaWxzVmlldy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ZpZXdzL0pwYURldGFpbHNWaWV3LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwogICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgogICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCiAgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKQEAgLTEwLDEzICsxMCwxMiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFSZXNvdXJjZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnBhUGxhdGZvcm1VaTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5UcmFjaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybVVpUmVnaXN0cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKQEAgLTI0LDE2ICsyMywxNSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKIAogLyoqCi0gKiBUaGUgSlBBIHZpZXcgdGhhdCBzaG93cyB0aGUgZGV0YWlscyBhIG1hcHBpbmcgKGVpdGhlciB0eXBlIG9yIGF0dHJpYnV0ZSkuCisgKiBUaGUgSlBBIHZpZXcgdGhhdCBzaG93cyB0aGUgZGV0YWlscyBvZiBhIHN0cnVjdHVyZSBub2RlCiAgKgotICogQHZlcnNpb24gMi4wCisgKiBAdmVyc2lvbiAyLjIKICAqIEBzaW5jZSAxLjAKICAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSnBhRGV0YWlsc1ZpZXcgZXh0ZW5kcyBBYnN0cmFjdEpwYVZpZXcKIHsKIAkvKioKLQkgKiBUaGUgY3VycmVudCA8Y29kZT5JSnBhRGV0YWlsc1BhZ2U8L2NvZGU+IHRoYXQgd2FzIHJldHJpZXZlIGJhc2VkIG9uIHRoZQorCSAqIFRoZSBjdXJyZW50IDxjb2RlPkpwYURldGFpbHNQYWdlPC9jb2RlPiB0aGF0IHdhcyByZXRyaWV2ZSBiYXNlZCBvbiB0aGUKIAkgKiBjdXJyZW50IHNlbGVjdGlvbi4KIAkgKi8KIAlwcml2YXRlIEpwYURldGFpbHNQYWdlPEpwYVN0cnVjdHVyZU5vZGU+IGN1cnJlbnRQYWdlOwpAQCAtNDMsMTAgKzQxLDEyIEBACiAJICovCiAJcHJpdmF0ZSBKcGFTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKIAotCS8qKgotCSAqIGtleTogT2JqZWN0IGNvbnRlbnQgbm9kZSBpZCwgIHZhbHVlOiBDb21wb3NpdGUgcGFnZS4KLQkgKi8KLQlwcml2YXRlIE1hcDxPYmplY3QsIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4gZGV0YWlsc1BhZ2VzOworCS8vVE9ETyB0aGlzIGlzIGNyYXAsIGEgTWFwIG9mIE1hcHMgb2YgTWFwcy4gTmVlZHMgdG8gYmUgZG9uZSBkaWZmZXJlbnRseSwgdGhlIGZhY3RvcnkvcGxhdGZvcm0gc2hvdWxkIGhhbmRsZSBjYWNoaW5nIGluc3RlYWQKKwkvLyBrZXkxIHBsYXRmb3JtIGlkCisJLy8ga2V5MiBKcGFSZXNvdXJjZVR5cGUKKwkvLyBrZXkzIHN0cnVjdHVyZSBub2RlIHR5cGUKKwkvLyB2YWx1ZSBDb21wb3NpdGUgcGFnZQorCXByaXZhdGUgTWFwPFN0cmluZywgTWFwPEpwYVJlc291cmNlVHlwZSwgTWFwPFN0cmluZywgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+Pj4+IGRldGFpbHNQYWdlczsKIAogCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhRGV0YWlsc1ZpZXc8L2NvZGU+LgpAQCAtNTUsMTEwICs1NSwxMDAgQEAKIAkJc3VwZXIoSnB0VWlNZXNzYWdlcy5KcGFEZXRhaWxzVmlld192aWV3Tm90QXZhaWxhYmxlKTsKIAl9CiAKLQlwcml2YXRlIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBidWlsZERldGFpbHNQYWdlKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgewotCQlKcGFEZXRhaWxzUHJvdmlkZXIgZGV0YWlsc1Byb3ZpZGVyID0gZ2V0RGV0YWlsc1Byb3ZpZGVyKHN0cnVjdHVyZU5vZGUpOwotCi0JCWlmIChkZXRhaWxzUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgaWQgPSBzdHJ1Y3R1cmVOb2RlLmdldElkKCk7Ci0KLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoZ2V0UGFnZUJvb2soKSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULkhPUklaT05UQUwpKTsKLQotCQlKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gcGFnZSA9IGRldGFpbHNQcm92aWRlci5idWlsZERldGFpbHNQYWdlKAotCQkJY29udGFpbmVyLAotCQkJaWQsCi0JCQlnZXRXaWRnZXRGYWN0b3J5KCkKLQkJKTsKLQotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmRldGFpbHNQYWdlcy5wdXQoaWQsIHBhZ2UpOwotCQl9Ci0KLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotCQlkZXRhaWxzUGFnZXMuY2xlYXIoKTsKLQotCQljdXJyZW50U2VsZWN0aW9uID0gSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQljdXJyZW50UGFnZSA9IG51bGw7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGdldERldGFpbHNQYWdlKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgewotCQlpZiAoZGV0YWlsc1BhZ2VzLmNvbnRhaW5zS2V5KHN0cnVjdHVyZU5vZGUuZ2V0SWQoKSkpIHsKLQkJCUpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBwYWdlID0gIGRldGFpbHNQYWdlcy5nZXQoc3RydWN0dXJlTm9kZS5nZXRJZCgpKTsKLQotCQkJaWYgKChwYWdlICE9IG51bGwpICYmCi0JCQkJCShwYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQkJZGV0YWlsc1BhZ2VzLnJlbW92ZShzdHJ1Y3R1cmVOb2RlLmdldElkKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHBhZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1aWxkRGV0YWlsc1BhZ2Uoc3RydWN0dXJlTm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBKcGFEZXRhaWxzUHJvdmlkZXIgZ2V0RGV0YWlsc1Byb3ZpZGVyKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgewotCi0JCVN0cmluZyBwbGF0Zm9ybUlkID0gc3RydWN0dXJlTm9kZS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOwotCQlKcGFQbGF0Zm9ybVVpIGpwYVBsYXRmb3JtVUkgPSBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkuaW5zdGFuY2UoKS5qcGFQbGF0Zm9ybShwbGF0Zm9ybUlkKTsKLQkJcmV0dXJuIGpwYVBsYXRmb3JtVUkuZGV0YWlsc1Byb3ZpZGVyKHN0cnVjdHVyZU5vZGUpOwotCi0JCS8vVE9ETyB0aGlzIHZpZXcgYW5kIHRoZSBkZXRhaWxzUHJvdmlkZXJzIE1hcCBpcyBub3QgY3JlYXRlZCBvbiBhIHBlciBwcm9qZWN0IGJhc2lzLgotCQkvL3RoZSBkZXRhaWxzUHJvdmlkZXJzIGFuZCB0aGVpciBmaWxlQ29udGVudFR5cGVzIGNvdWxkIG92ZXJsYXAgYWNyb3NzIHByb2plY3QsIHRoaXMgd291bGQgY2F1c2UgcHJvYmxlbXMgd2l0aCBzdG9yaW5nIHRoaXMgbWFwLgotCX0KLQotCXB1YmxpYyBKcGFTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewogCQlzdXBlci5pbml0aWFsaXplKCk7CiAKIAkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQl0aGlzLmRldGFpbHNQYWdlcyAgICAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4oKTsKKwkJdGhpcy5kZXRhaWxzUGFnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxKcGFSZXNvdXJjZVR5cGUsIE1hcDxTdHJpbmcsIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4+PigpOwogCX0KIAotCXByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKFRyYWNpbmcuYm9vbGVhbkRlYnVnT3B0aW9uKFRyYWNpbmcuVUlfREVUQUlMU19WSUVXKSkgewotCQkJVHJhY2luZy5sb2cobWVzc2FnZSk7CisJcHJpdmF0ZSBKcGFQbGF0Zm9ybVVpIGdldEpwYVBsYXRmb3JtVWkoSnBhU3RydWN0dXJlTm9kZSBzdHJ1Y3R1cmVOb2RlKSB7CisJCVN0cmluZyBwbGF0Zm9ybUlkID0gc3RydWN0dXJlTm9kZS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOworCQlyZXR1cm4gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1VaShwbGF0Zm9ybUlkKTsKKwl9CisKKwlwdWJsaWMgSnBhU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuY3VycmVudFNlbGVjdGlvbjsKKwl9CisJCisJcHJpdmF0ZSBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gZ2V0RGV0YWlsc1BhZ2UoSnBhU3RydWN0dXJlTm9kZSBzdHJ1Y3R1cmVOb2RlKSB7CisJCVN0cmluZyBwbGF0Zm9ybUlkID0gc3RydWN0dXJlTm9kZS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOworCQlpZiAodGhpcy5kZXRhaWxzUGFnZXMuY29udGFpbnNLZXkocGxhdGZvcm1JZCkpIHsKKwkJCU1hcDxKcGFSZXNvdXJjZVR5cGUsIE1hcDxTdHJpbmcsIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4+IHBsYXRmb3JtRGV0YWlsc1BhZ2VzID0gdGhpcy5kZXRhaWxzUGFnZXMuZ2V0KHBsYXRmb3JtSWQpOworCQkJTWFwPFN0cmluZywgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+PiBjb250ZW50VHlwZURldGFpbHNQYWdlcyA9IHBsYXRmb3JtRGV0YWlsc1BhZ2VzLmdldChzdHJ1Y3R1cmVOb2RlLmdldFJlc291cmNlVHlwZSgpKTsKKwkJCWlmIChjb250ZW50VHlwZURldGFpbHNQYWdlcyAhPSBudWxsKSB7CisJCQkJSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IHBhZ2UgPSAgY29udGVudFR5cGVEZXRhaWxzUGFnZXMuZ2V0KHN0cnVjdHVyZU5vZGUuZ2V0SWQoKSk7CisJCQkJaWYgKHBhZ2UgIT0gbnVsbCkgeworCQkJCQlpZiAocGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisJCQkJCQlwbGF0Zm9ybURldGFpbHNQYWdlcy5yZW1vdmUoc3RydWN0dXJlTm9kZS5nZXRJZCgpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiBwYWdlOworCQkJCQl9CisJCQkJfQorCQkJfQogCQl9CisJCXJldHVybiBidWlsZERldGFpbHNQYWdlKHN0cnVjdHVyZU5vZGUpOwogCX0KIAotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLworCXByaXZhdGUgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkRGV0YWlsc1BhZ2UoSnBhU3RydWN0dXJlTm9kZSBzdHJ1Y3R1cmVOb2RlKSB7CisJCUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSA9IGdldEpwYVBsYXRmb3JtVWkoc3RydWN0dXJlTm9kZSk7CisJCQorCQlDb21wb3NpdGUgY29udGFpbmVyID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShnZXRQYWdlQm9vaygpKTsKKwkJY29udGFpbmVyLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuSE9SSVpPTlRBTCkpOworCisJCUpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBwYWdlID0ganBhUGxhdGZvcm1VaS5idWlsZEpwYURldGFpbHNQYWdlKGNvbnRhaW5lciwgc3RydWN0dXJlTm9kZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKKwkJaWYgKHBhZ2UgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlTdHJpbmcgcGxhdGZvcm1JZCA9IHN0cnVjdHVyZU5vZGUuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKKwkJTWFwPEpwYVJlc291cmNlVHlwZSwgTWFwPFN0cmluZywgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+Pj4gcGxhdGZvcm1EZXRhaWxzUGFnZXMgPSB0aGlzLmRldGFpbHNQYWdlcy5nZXQocGxhdGZvcm1JZCk7CisJCWlmIChwbGF0Zm9ybURldGFpbHNQYWdlcyA9PSBudWxsKSB7CisJCQlwbGF0Zm9ybURldGFpbHNQYWdlcyA9IG5ldyBIYXNoTWFwPEpwYVJlc291cmNlVHlwZSwgTWFwPFN0cmluZywgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+Pj4oKTsKKwkJCXRoaXMuZGV0YWlsc1BhZ2VzLnB1dChwbGF0Zm9ybUlkLCBwbGF0Zm9ybURldGFpbHNQYWdlcyk7CisJCX0KKwkJSnBhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IHN0cnVjdHVyZU5vZGUuZ2V0UmVzb3VyY2VUeXBlKCk7CisJCU1hcDxTdHJpbmcsIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4gY29udGVudFR5cGVEZXRhaWxzUGFnZXMgPSBwbGF0Zm9ybURldGFpbHNQYWdlcy5nZXQocmVzb3VyY2VUeXBlKTsKKwkJaWYgKGNvbnRlbnRUeXBlRGV0YWlsc1BhZ2VzID09IG51bGwpIHsKKwkJCWNvbnRlbnRUeXBlRGV0YWlsc1BhZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4+KCk7CisJCQlwbGF0Zm9ybURldGFpbHNQYWdlcy5wdXQocmVzb3VyY2VUeXBlLCBjb250ZW50VHlwZURldGFpbHNQYWdlcyk7CisJCX0KKwkJY29udGVudFR5cGVEZXRhaWxzUGFnZXMucHV0KHN0cnVjdHVyZU5vZGUuZ2V0SWQoKSwgcGFnZSk7CisKKwkJcmV0dXJuIHBhZ2U7CisJfQorCiAJQE92ZXJyaWRlCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAJcHVibGljIHZvaWQgc2VsZWN0KEpwYVNlbGVjdGlvbiBqcGFTZWxlY3Rpb24pIHsKLQkJaWYgKGpwYVNlbGVjdGlvbi5lcXVhbHMoY3VycmVudFNlbGVjdGlvbikpIHsKKwkJaWYgKGpwYVNlbGVjdGlvbi5lcXVhbHModGhpcy5jdXJyZW50U2VsZWN0aW9uKSkgewogCQkJcmV0dXJuOwogCQl9CiAKLQkJY3VycmVudFNlbGVjdGlvbiA9IGpwYVNlbGVjdGlvbjsKLQorCQl0aGlzLmN1cnJlbnRTZWxlY3Rpb24gPSBqcGFTZWxlY3Rpb247CisJCUpwYURldGFpbHNQYWdlPEpwYVN0cnVjdHVyZU5vZGU+IG5ld1BhZ2UgPSBudWxsOwogCQlpZiAoanBhU2VsZWN0aW9uICE9IEpwYVNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTikgewogCQkJSnBhU3RydWN0dXJlTm9kZSBuZXdOb2RlID0ganBhU2VsZWN0aW9uLmdldFNlbGVjdGVkTm9kZSgpOwotCQkJSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IG5ld1BhZ2UgPSBnZXREZXRhaWxzUGFnZShuZXdOb2RlKTsKLQkJCXNldEN1cnJlbnRQYWdlKG5ld1BhZ2UpOworCQkJbmV3UGFnZSA9IChKcGFEZXRhaWxzUGFnZTxKcGFTdHJ1Y3R1cmVOb2RlPikgZ2V0RGV0YWlsc1BhZ2UobmV3Tm9kZSk7CisJCQlpZiAodGhpcy5jdXJyZW50UGFnZSAhPSBudWxsICYmIHRoaXMuY3VycmVudFBhZ2UgIT0gbmV3UGFnZSl7CisJCQkJdHJ5IHsKKwkJCQkJdGhpcy5jdXJyZW50UGFnZS5zZXRTdWJqZWN0KG51bGwpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKKwkJCQl9CisJCQl9CisJCQlpZiAobmV3UGFnZSAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJbmV3UGFnZS5zZXRTdWJqZWN0KG5ld05vZGUpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFNob3cgZXJyb3IgcGFnZQorCQkJCQluZXdQYWdlID0gbnVsbDsKKwkJCQkJSnB0VWlQbHVnaW4ubG9nKGUpOworCQkJCX0KKwkJCX0KIAkJfQotCQllbHNlIHsKLQkJCXNldEN1cnJlbnRQYWdlKG51bGwpOwotCQl9CisJCXNldEN1cnJlbnRQYWdlKG5ld1BhZ2UpOwogCX0KIAogCS8qKgpAQCAtMTY2LDUxICsxNTYsMzIgQEAKIAkgKgogCSAqIEBwYXJhbSBuZXdQYWdlIFRoZSBuZXcgcGFnZSB0byBkaXNwbGF5CiAJICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSB2b2lkIHNldEN1cnJlbnRQYWdlKEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBwYWdlKSB7Ci0KLQkJLy8gVW5wb3B1bGF0ZSBvbGQgcGFnZQotCQlpZiAoY3VycmVudFBhZ2UgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlsb2coIkpwYURldGFpbHNWaWV3LnNldEN1cnJlbnRQYWdlKCkgOiBkaXNwb3Npbmcgb2YgY3VycmVudCBwYWdlIik7Ci0KLQkJCQljdXJyZW50UGFnZS5zZXRTdWJqZWN0KG51bGwpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0KLQkJSnBhRGV0YWlsc1BhZ2U8SnBhU3RydWN0dXJlTm9kZT4gbmV3UGFnZSA9IChKcGFEZXRhaWxzUGFnZTxKcGFTdHJ1Y3R1cmVOb2RlPikgcGFnZTsKLQotCQkvLyBQb3B1bGF0ZSBuZXcgcGFnZQotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWxvZygiSnBhRGV0YWlsc1ZpZXcuc2V0Q3VycmVudFBhZ2UoKSA6IHBvcHVsYXRpbmcgbmV3IHBhZ2UiKTsKLQkJCQluZXdQYWdlLnNldFN1YmplY3QoY3VycmVudFNlbGVjdGlvbi5nZXRTZWxlY3RlZE5vZGUoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBTaG93IGVycm9yIHBhZ2UKLQkJCQlwYWdlID0gbnVsbDsKLQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsb2coIkpwYURldGFpbHNWaWV3LnNldEN1cnJlbnRQYWdlKCkgOiBObyBwYWdlIHRvIHBvcHVsYXRlIik7Ci0JCX0KLQotCQkvL25vIG5lZWQgdG8gc2hvdyB0aGUgcGFnZSBhZ2FpbiBpZiBpdCBpcyBzdGlsbCB0aGUgc2FtZQotCQlpZiAobmV3UGFnZSAhPSBudWxsICYmIGN1cnJlbnRQYWdlID09IG5ld1BhZ2UpIHsKLQkJCXJldHVybjsKLQkJfQotCQljdXJyZW50UGFnZSA9IG5ld1BhZ2U7CisJcHJpdmF0ZSB2b2lkIHNldEN1cnJlbnRQYWdlKEpwYURldGFpbHNQYWdlPEpwYVN0cnVjdHVyZU5vZGU+IG5ld1BhZ2UpIHsKKwkJdGhpcy5jdXJyZW50UGFnZSA9IG5ld1BhZ2U7CiAKIAkJLy8gU2hvdyBuZXcgcGFnZQotCQlpZiAocGFnZSA9PSBudWxsKSB7CisJCWlmIChuZXdQYWdlID09IG51bGwpIHsKIAkJCXNob3dEZWZhdWx0UGFnZSgpOwogCQl9CiAJCWVsc2UgewotCQkJc2hvd1BhZ2UocGFnZS5nZXRDb250cm9sKCkpOworCQkJc2hvd1BhZ2UobmV3UGFnZS5nZXRDb250cm9sKCkpOwogCQl9CiAJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJZm9yIChNYXA8SnBhUmVzb3VyY2VUeXBlLCBNYXA8U3RyaW5nLCBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4+PiByZXNvdXJjZVR5cGVNYXAgOiB0aGlzLmRldGFpbHNQYWdlcy52YWx1ZXMoKSkgeworCQkJZm9yIChNYXA8U3RyaW5nLCBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4+IGRldGFpbHNQYWdlTWFwIDogcmVzb3VyY2VUeXBlTWFwLnZhbHVlcygpKSB7CisJCQkJZm9yIChKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gZGV0YWlsc1BhZ2UgOiBkZXRhaWxzUGFnZU1hcC52YWx1ZXMoKSkgeworCQkJCQlkZXRhaWxzUGFnZS5kaXNwb3NlKCk7CisJCQkJfQorCQkJfQorCQl9CisJCXRoaXMuZGV0YWlsc1BhZ2VzLmNsZWFyKCk7CisKKwkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOworCQl0aGlzLmN1cnJlbnRQYWdlID0gbnVsbDsKKworCQlzdXBlci5kaXNwb3NlKCk7CisJfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ZpZXdzL3N0cnVjdHVyZS9KcGFTdHJ1Y3R1cmVQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9zdHJ1Y3R1cmUvSnBhU3RydWN0dXJlUGFnZS5qYXZhCmluZGV4IGI3MmZmY2UuLmZhNTc4YmYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ZpZXdzL3N0cnVjdHVyZS9KcGFTdHJ1Y3R1cmVQYWdlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3Mvc3RydWN0dXJlL0pwYVN0cnVjdHVyZVBhZ2UuamF2YQpAQCAtMSwzNCArMSw0OSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3cy5zdHJ1Y3R1cmU7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZVNlbGVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5EZWZhdWx0SnBhU2VsZWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uSnBhU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKQEAgLTM4LDIzICs1MywxNzcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlU2l0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2U7CiAKLXB1YmxpYyBjbGFzcyBKcGFTdHJ1Y3R1cmVQYWdlIGV4dGVuZHMgUGFnZQotCWltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCitwdWJsaWMgY2xhc3MgSnBhU3RydWN0dXJlUGFnZSAKKwlleHRlbmRzIFBhZ2UKKwlpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlcgogewotCXByaXZhdGUgSnBhU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXI7CisJcHJpdmF0ZSBmaW5hbCBKcGFTdHJ1Y3R1cmVWaWV3IGpwYVN0cnVjdHVyZVZpZXc7CiAJCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Qgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyczsKKwlKcGFGaWxlIGpwYUZpbGU7CisJCisJcHJpdmF0ZSBmaW5hbCBJRmlsZSBmaWxlOworCQorCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0OworCQorCXByaXZhdGUgZmluYWwgSnBhU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXI7CiAJCiAJcHJpdmF0ZSBDb21wb3NpdGUgY29udHJvbDsKIAkKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdmlld2VyOworCXByaXZhdGUgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwogCQotCXByaXZhdGUgSnBhU3RydWN0dXJlVmlldyBqcGFTdHJ1Y3R1cmVWaWV3OworCVRyZWVWaWV3ZXIgdmlld2VyOwogCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVQYWdlKEpwYVN0cnVjdHVyZVZpZXcganBhU3RydWN0dXJlVmlldywgSnBhU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIpIHsKKwlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdCBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJMaXN0OworCQorCXByaXZhdGUgZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB0cmVlU2VsZWN0aW9uTGlzdGVuZXI7CisJCisJcHJpdmF0ZSBmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHRyZWVQb3N0U2VsZWN0aW9uTGlzdGVuZXI7CisJCisJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgcHJvamVjdHNMaXN0ZW5lcjsKKwkKKwlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBqcGFGaWxlc0xpc3RlbmVyOworCQorCXB1YmxpYyBKcGFTdHJ1Y3R1cmVQYWdlKAorCQkJSnBhU3RydWN0dXJlVmlldyBqcGFTdHJ1Y3R1cmVWaWV3LCAKKwkJCUpwYUZpbGUganBhRmlsZSwgCisJCQlKcGFTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlcikgewogCQl0aGlzLmpwYVN0cnVjdHVyZVZpZXcgPSBqcGFTdHJ1Y3R1cmVWaWV3OworCQl0aGlzLmpwYUZpbGUgPSBqcGFGaWxlOworCQl0aGlzLmpwYVByb2plY3QgPSBqcGFGaWxlLmdldEpwYVByb2plY3QoKTsKKwkJdGhpcy5maWxlID0ganBhRmlsZS5nZXRGaWxlKCk7CiAJCXRoaXMuc3RydWN0dXJlUHJvdmlkZXIgPSBzdHJ1Y3R1cmVQcm92aWRlcjsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOworCQl0aGlzLnNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0KCk7CisJCXRoaXMudHJlZVNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFRyZWVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKTsKKwkJdGhpcy50cmVlUG9zdFNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFRyZWVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCk7CisJCXRoaXMucHJvamVjdHNMaXN0ZW5lciA9IGJ1aWxkUHJvamVjdHNMaXN0ZW5lcigpOworCQl0aGlzLmpwYUZpbGVzTGlzdGVuZXIgPSBidWlsZEpwYUZpbGVzTGlzdGVuZXIoKTsKKwl9CisJCisJcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9qZWN0c0xpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpeworCQkKKwkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKKwkJCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMucHJvamVjdHNSZW1vdmVkKGV2ZW50KTsKKwkJCX0KKwkJCisJCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgeworCQkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy5wcm9qZWN0c0FkZGVkKGV2ZW50KTsKKwkJCX0KKwkJCisJCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgeworCQkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy5wcm9qZWN0c0NsZWFyZWQoZXZlbnQpOworCQkJfQorCQkKKwkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgeworCQkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy5wcm9qZWN0c0NoYW5nZWQoZXZlbnQpOworCQkJfQorCQl9OworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXZvaWQgcHJvamVjdHNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgeworCQlmb3IgKEpwYVByb2plY3QgaXRlbSA6IChJdGVyYWJsZTxKcGFQcm9qZWN0PikgZXZlbnQuZ2V0SXRlbXMoKSkgeworCQkJaWYgKGl0ZW0uZ2V0UHJvamVjdCgpID09IEpwYVN0cnVjdHVyZVBhZ2UudGhpcy5maWxlLmdldFByb2plY3QoKSkgeworCQkJCXNldEpwYVByb2plY3QobnVsbCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwl2b2lkIHByb2plY3RzQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7CisJCWZvciAoSnBhUHJvamVjdCBpdGVtIDogKEl0ZXJhYmxlPEpwYVByb2plY3Q+KSBldmVudC5nZXRJdGVtcygpKSB7CisJCQlpZiAoaXRlbS5nZXRQcm9qZWN0KCkgPT0gSnBhU3RydWN0dXJlUGFnZS50aGlzLmZpbGUuZ2V0UHJvamVjdCgpKSB7CisJCQkJc2V0SnBhUHJvamVjdChpdGVtKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXZvaWQgcHJvamVjdHNDbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgeworCQlzZXRKcGFQcm9qZWN0KG51bGwpOworCX0KKwkKKwl2b2lkIHByb2plY3RzQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCXNldEpwYVByb2plY3QoSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMuZmlsZS5nZXRQcm9qZWN0KCkpKTsKKwl9CisJCisJcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRKcGFGaWxlc0xpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpeworCQkKKwkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKKwkJCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMuanBhRmlsZXNSZW1vdmVkKGV2ZW50KTsKKwkJCX0KKwkJCisJCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgeworCQkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy5qcGFGaWxlc0FkZGVkKGV2ZW50KTsKKwkJCX0KKwkJCisJCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgeworCQkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy5qcGFGaWxlc0NsZWFyZWQoZXZlbnQpOworCQkJfQorCQkKKwkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgeworCQkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy5qcGFGaWxlc0NoYW5nZWQoZXZlbnQpOworCQkJfQorCQl9OworCX0KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwl2b2lkIGpwYUZpbGVzUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKKwkJZm9yIChKcGFGaWxlIGl0ZW0gOiAoSXRlcmFibGU8SnBhRmlsZT4pIGV2ZW50LmdldEl0ZW1zKCkpIHsKKwkJCWlmIChpdGVtID09IEpwYVN0cnVjdHVyZVBhZ2UudGhpcy5qcGFGaWxlKSB7CisJCQkJc2V0SnBhRmlsZShudWxsKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXZvaWQganBhRmlsZXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKKwkJZm9yIChKcGFGaWxlIGl0ZW0gOiAoSXRlcmFibGU8SnBhRmlsZT4pIGV2ZW50LmdldEl0ZW1zKCkpIHsKKwkJCWlmIChpdGVtLmdldEZpbGUoKSA9PSBKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMuZmlsZSkgeworCQkJCXNldEpwYUZpbGUoaXRlbSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIGpwYUZpbGVzQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKKwkJc2V0SnBhRmlsZShudWxsKTsKKwl9CisKKwl2b2lkIGpwYUZpbGVzQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCXNldEpwYUZpbGUodGhpcy5qcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5maWxlKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldEpwYVByb2plY3QoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7CisJCWlmICh0aGlzLmpwYVByb2plY3QgPT0ganBhUHJvamVjdCkgeworCQkJcmV0dXJuOworCQl9CisJCWlmICh0aGlzLmpwYVByb2plY3QgIT0gbnVsbCkgeworCQkJdGhpcy5qcGFQcm9qZWN0LnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihKcGFQcm9qZWN0LkpQQV9GSUxFU19DT0xMRUNUSU9OLCB0aGlzLmpwYUZpbGVzTGlzdGVuZXIpOworCQl9CisJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7CisJCWlmICh0aGlzLmpwYVByb2plY3QgIT0gbnVsbCkgeworCQkJdGhpcy5qcGFQcm9qZWN0LmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihKcGFQcm9qZWN0LkpQQV9GSUxFU19DT0xMRUNUSU9OLCB0aGlzLmpwYUZpbGVzTGlzdGVuZXIpOworCQkJc2V0SnBhRmlsZSh0aGlzLmpwYVByb2plY3QuZ2V0SnBhRmlsZShKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMuZmlsZSkpOworCQl9CisJCWVsc2UgeworCQkJc2V0SnBhRmlsZShudWxsKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgc2V0SnBhRmlsZShKcGFGaWxlIGpwYUZpbGUpIHsKKwkJaWYgKHRoaXMuanBhRmlsZSA9PSBqcGFGaWxlKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5qcGFGaWxlID0ganBhRmlsZTsKKwkJU1dUVXRpbC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7CQkJCQkJCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJSnBhU3RydWN0dXJlUGFnZS50aGlzLnZpZXdlci5zZXRJbnB1dChKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMuanBhRmlsZSk7CisJCQl9CisJCX0pOwogCX0KIAkKIAlAT3ZlcnJpZGUKQEAgLTY5LDM0ICsyMzgsNDkgQEAKIAkJY29udHJvbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7CQkKIAkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY29udHJvbCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKIAkJdmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbCgyKTsKLQkJRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcgorCQlEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHByb3ZpZGVyCiAJCQk9IG5ldyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKAogCQkJCXN0cnVjdHVyZVByb3ZpZGVyLmdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpLAogCQkJCXN0cnVjdHVyZVByb3ZpZGVyLmdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50QW5kTGFiZWxQcm92aWRlcik7CisJCXRoaXMuY29udGVudEFuZExhYmVsUHJvdmlkZXIgPSBwcm92aWRlcjsKKwkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7CiAJCS8vIFRPRE8gVXNlIHByb2JsZW0gZGVjb3JhdG9yCi0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldElucHV0KHN0cnVjdHVyZVByb3ZpZGVyLmdldElucHV0KCkpOwotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7CisJCXRoaXMudmlld2VyLnNldElucHV0KHRoaXMuanBhRmlsZSk7CisJCWVuZ2FnZUxpc3RlbmVycygpOwogCQlpbml0Q29udGV4dE1lbnUoKTsKIAl9CiAJCisJcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgeworCQl0aGlzLnZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcy50cmVlU2VsZWN0aW9uTGlzdGVuZXIpOworCQl0aGlzLnZpZXdlci5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMudHJlZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcik7CisJCXRoaXMuanBhUHJvamVjdC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhUHJvamVjdC5KUEFfRklMRVNfQ09MTEVDVElPTiwgdGhpcy5qcGFGaWxlc0xpc3RlbmVyKTsKKwkJSnB0Q29yZVBsdWdpbi5nZXRKcGFNb2RlbCgpLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihKcGFNb2RlbC5KUEFfUFJPSkVDVFNfQ09MTEVDVElPTiwgdGhpcy5wcm9qZWN0c0xpc3RlbmVyKTsKKwl9CisJCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJc3RydWN0dXJlUHJvdmlkZXIuZGlzcG9zZSgpOworCQlkaXNlbmdhZ2VMaXN0ZW5lcnMoKTsKIAkJc3VwZXIuZGlzcG9zZSgpOwogCX0KIAkKLQkvL1RPRE8gdGhpcyBpc24ndCByZWFsbHkgd29ya2luZy4gIG91ciBqcGEgYWN0aW9ucyBhcHBlYXIsIGJ1dCBhbG9uZyB3aXRoIGEgYnVuY2ggb2Ygb3RoZXIgYWN0aW9ucyEhCisJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgeworCQlKcHRDb3JlUGx1Z2luLmdldEpwYU1vZGVsKCkucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKEpwYU1vZGVsLkpQQV9QUk9KRUNUU19DT0xMRUNUSU9OLCB0aGlzLnByb2plY3RzTGlzdGVuZXIpOworCQlpZiAodGhpcy5qcGFQcm9qZWN0ICE9IG51bGwpIHsKKwkJCXRoaXMuanBhUHJvamVjdC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhUHJvamVjdC5KUEFfRklMRVNfQ09MTEVDVElPTiwgdGhpcy5qcGFGaWxlc0xpc3RlbmVyKTsKKwkJfQorCQl0aGlzLnZpZXdlci5yZW1vdmVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMudHJlZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcik7CisJCXRoaXMudmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzLnRyZWVTZWxlY3Rpb25MaXN0ZW5lcik7CisJfQorCQogICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb250ZXh0TWVudSgpIHsKICAgICAgICAgLy8gQ3JlYXRlIGR5bmFtaWMgbWVudSBtZ3IuICBEeW5hbWljIGlzIGN1cnJlbnRseSByZXF1aXJlZCB0bwogICAgICAgICAvLyBzdXBwb3J0IGFjdGlvbiBjb250cmlidXRpb25zLgogICAgICAgICBNZW51TWFuYWdlciBtZ3IgPSBuZXcgTWVudU1hbmFnZXIoKTsKICAgICAgICAgbWdyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKICAgICAgICAgbWdyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWdyKSB7Ci0gICAgICAgICAgICAgICAgZmlsbENvbnRleHRNZW51KG1ncik7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgSnBhU3RydWN0dXJlUGFnZS50aGlzLmZpbGxDb250ZXh0TWVudShtZW51TWFuYWdlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICAgICAgICBNZW51IG1lbnUgPSBtZ3IuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7CkBAIC0xMzgsMTEgKzMyMiwxMSBAQAogCS8vICoqKioqKioqKioqKioqKiogSVNlbGVjdGlvblByb3ZpZGVyIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkKIAlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7CiAJfQogCQogCXB1YmxpYyBJVHJlZVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CkBAIC0xNjUsMjEgKzM0OSwxNiBAQAogCQl9CiAJfQogCQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlmaXJlU2VsZWN0aW9uQ2hhbmdlZChldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCQorCS8qCisJICogcmVsYXlzIHRyZWUgc2VsZWN0aW9uIGV2ZW50IHRvIGxpc3RlbmVycyBvZiB0aGlzIHBhZ2UKKwkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewogCQkvLyBjcmVhdGUgYW4gZXZlbnQKIAkJZmluYWwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gCiAJCQkJbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pOwogCQkKIAkJLy8gZmlyZSB0aGUgZXZlbnQKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKKwkJT2JqZWN0W10gbGlzdGVuZXJzID0gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHsKIAkJCWZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbCA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcnNbaV07CiAJCQlTYWZlUnVubmVyLnJ1bigKQEAgLTE5MCw0ICszNjksNDAgQEAKIAkJCQkJfSk7CiAgICAgICAgIH0KICAgICB9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzQmFyKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKKwkJaWYgKCEgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKKwkJaWYgKHNzZWxlY3Rpb24uc2l6ZSgpID4gMSkgeworCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShOTFMuYmluZChKcHRVaU1lc3NhZ2VzLkpwYVN0cnVjdHVyZVZpZXdfbnVtSXRlbXNTZWxlY3RlZCwgc3NlbGVjdGlvbi5zaXplKCkpKTsKKwkJfQorCQllbHNlIHsKKwkJCU9iamVjdCBzZWxPYmogPSBzc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOworCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSgKKwkJCQl0aGlzLmNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmdldEltYWdlKHNlbE9iaiksIAorCQkJCXRoaXMuY29udGVudEFuZExhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oc2VsT2JqKSk7CisJCX0KKwl9CisJCisJCisJY2xhc3MgVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgorCQlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKKwl7CisJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMuZmlyZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQorCQorCQorCWNsYXNzIFRyZWVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCisJCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgorCXsKKwkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy51cGRhdGVTdGF0dXNCYXIoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworCQl9CisJfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ZpZXdzL3N0cnVjdHVyZS9KcGFTdHJ1Y3R1cmVWaWV3LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9zdHJ1Y3R1cmUvSnBhU3RydWN0dXJlVmlldy5qYXZhCmluZGV4IDM1YjFhZGIuLjljZWQ0MTAgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ZpZXdzL3N0cnVjdHVyZS9KcGFTdHJ1Y3R1cmVWaWV3LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3Mvc3RydWN0dXJlL0pwYVN0cnVjdHVyZVZpZXcuamF2YQpAQCAtMSwxMSArMSwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzLnN0cnVjdHVyZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKQEAgLTI2LDcgKzI3LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2tWaWV3OwogCi1wdWJsaWMgY2xhc3MgSnBhU3RydWN0dXJlVmlldyBleHRlbmRzIFBhZ2VCb29rVmlldworcHVibGljIGNsYXNzIEpwYVN0cnVjdHVyZVZpZXcKKwlleHRlbmRzIFBhZ2VCb29rVmlldwogewogCXB1YmxpYyBKcGFTdHJ1Y3R1cmVWaWV3KCkgewogCQlzdXBlcigpOwpAQCAtMzcsMTAgKzM5LDE3IEBACiAJCXN1cGVyLmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7CiAJCQogCQlKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXIgPQotCQkJU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcihnZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKTsKKwkJCVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmdldFNlbGVjdGlvbk1hbmFnZXIodGhpcy5nZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKTsKIAkJCiAJCXNlbGVjdGlvbk1hbmFnZXIucmVnaXN0ZXIodGhpcyk7Ci0JCXNlbGVjdChzZWxlY3Rpb25NYW5hZ2VyLmdldEN1cnJlbnRTZWxlY3Rpb24oKSk7CisJCXRoaXMuc2VsZWN0KHNlbGVjdGlvbk1hbmFnZXIuZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7CisJCS8vIGRvIHNhbWUgdGhpbmcgYXMgcGFydEFjdGl2YXRlZCwgd2hpY2ggd2lsbCBjaGVjayB0byBzZWUgaWYgdGhlIAorCQkvLyBwYXJ0IGlzIGFuIGVkaXRvciwgaW4gd2hpY2ggY2FzZSwgd2Ugd2FudCB0byBzaG93IHRoZSByaWdodCBwYWdlCisJCXBhcnRBY3RpdmF0ZWQocGFydCk7CiAJfQogCQogCUBPdmVycmlkZQpAQCAtNTAsMTggKzU5LDE0IEBACiAJCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElXb3JrYmVuY2hQYXJ0IGdldEJvb3RzdHJhcFBhcnQoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpOwotICAgICAgICBpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJfQotCi0gICAgICAgIHJldHVybiBudWxsOworCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gdGhpcy5nZXRTaXRlKCkuZ2V0UGFnZSgpOworICAgICAgICByZXR1cm4gKHBhZ2UgPT0gbnVsbCkgPyBudWxsIDogcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKIAl9CiAJCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElQYWdlIGNyZWF0ZURlZmF1bHRQYWdlKFBhZ2VCb29rIGJvb2spIHsKIAkJTWVzc2FnZVBhZ2UgcGFnZSA9IG5ldyBNZXNzYWdlUGFnZSgpOwotICAgICAgICBpbml0UGFnZShwYWdlKTsKKyAgICAgICAgdGhpcy5pbml0UGFnZShwYWdlKTsKICAgICAgICAgcGFnZS5jcmVhdGVDb250cm9sKGJvb2spOwogICAgICAgICBwYWdlLnNldE1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5KcGFTdHJ1Y3R1cmVWaWV3X3N0cnVjdHVyZU5vdEF2YWlsYWJsZSk7CiAgICAgICAgIHJldHVybiBwYWdlOwpAQCAtNjksNTggKzc0LDYxIEBACiAJCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFBhZ2VSZWMgZG9DcmVhdGVQYWdlKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJSnBhU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIgPSAKLQkJCXN0cnVjdHVyZVByb3ZpZGVyKHBhcnQpOwotCQlpZiAoc3RydWN0dXJlUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJSnBhU3RydWN0dXJlUGFnZSBwYWdlID0gbmV3IEpwYVN0cnVjdHVyZVBhZ2UodGhpcywgc3RydWN0dXJlUHJvdmlkZXIpOwotCQkJaW5pdFBhZ2UocGFnZSk7Ci0JCQlwYWdlLmNyZWF0ZUNvbnRyb2woZ2V0UGFnZUJvb2soKSk7Ci0JCQlyZXR1cm4gbmV3IFBhZ2VSZWMocGFydCwgcGFnZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSnBhU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlKcGFGaWxlIGpwYUZpbGUgPSAKLQkJCShKcGFGaWxlKSBwYXJ0LmdldEFkYXB0ZXIoSnBhRmlsZS5jbGFzcyk7Ci0JCQorCQkvLyB1c2UgdGhlIHBsYXRmb3JtIGFkYXB0ZXIgc2VydmljZSBzbyB0aGUgc3RydWN0dXJlIHZpZXcgY2FuIGJlCisJCS8vIGFzc29jaWF0ZWQgd2l0aCBhbnkgSUVkaXRvclBhcnQgdGhhdCBoYXMgYW4gYXNzb2NpYXRlZCBhZGFwdGVyCisJCS8vIGZhY3RvcnkgdGhhdCBjYW4gZ2l2ZSB1cyB0aGUgSlBBIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlZGl0b3IgcGFydAorCQkvLyBAc2VlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5FZGl0b3JQYXJ0QWRhcHRlckZhY3RvcnkKKwkJSnBhRmlsZSBqcGFGaWxlID0gKEpwYUZpbGUpIHBhcnQuZ2V0QWRhcHRlcihKcGFGaWxlLmNsYXNzKTsKIAkJaWYgKGpwYUZpbGUgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJCi0JCUpwYVBsYXRmb3JtVWkgcGxhdGZvcm1VaSA9IEpwdFVpUGx1Z2luLmdldFBsdWdpbigpLmpwYVBsYXRmb3JtVWkoanBhRmlsZS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKSk7Ci0JCXJldHVybiBwbGF0Zm9ybVVpLmJ1aWxkU3RydWN0dXJlUHJvdmlkZXIoanBhRmlsZSk7CisKKwkJSnBhU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIgPSB0aGlzLmdldFN0cnVjdHVyZVByb3ZpZGVyKGpwYUZpbGUpOworCQlpZiAoc3RydWN0dXJlUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlKcGFTdHJ1Y3R1cmVQYWdlIHBhZ2UgPSBuZXcgSnBhU3RydWN0dXJlUGFnZSh0aGlzLCBqcGFGaWxlLCBzdHJ1Y3R1cmVQcm92aWRlcik7CisJCXRoaXMuaW5pdFBhZ2UocGFnZSk7CisJCXBhZ2UuY3JlYXRlQ29udHJvbCh0aGlzLmdldFBhZ2VCb29rKCkpOworCQlyZXR1cm4gbmV3IFBhZ2VSZWMocGFydCwgcGFnZSk7CisJfQorCQorCXByaXZhdGUgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoSnBhRmlsZSBqcGFGaWxlKSB7CisJCXJldHVybiB0aGlzLmdldFBsYXRmb3JtVWkoanBhRmlsZSkuZ2V0U3RydWN0dXJlUHJvdmlkZXIoanBhRmlsZSk7CisJfQorCQorCXByaXZhdGUgSnBhUGxhdGZvcm1VaSBnZXRQbGF0Zm9ybVVpKEpwYUZpbGUganBhRmlsZSkgeworCQlyZXR1cm4gSnB0VWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybVVpKGpwYUZpbGUuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkpOwogCX0KIAkKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBkb0Rlc3Ryb3lQYWdlKElXb3JrYmVuY2hQYXJ0IHBhcnQsIFBhZ2VSZWMgcGFnZVJlY29yZCkgewogCQlKcGFTdHJ1Y3R1cmVQYWdlIHBhZ2UgPSAoSnBhU3RydWN0dXJlUGFnZSkgcGFnZVJlY29yZC5wYWdlOwotCQlyZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIocGFnZSk7CiAgICAgICAgIHBhZ2UuZGlzcG9zZSgpOwogICAgICAgICBwYWdlUmVjb3JkLmRpc3Bvc2UoKTsKIAl9CiAJCiAJcHVibGljIEpwYVNlbGVjdGlvbiBnZXRKcGFTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRDdXJyZW50UGFnZSgpICE9IGdldERlZmF1bHRQYWdlKCkpIHsKLQkJCXJldHVybiAoKEpwYVN0cnVjdHVyZVBhZ2UpIGdldEN1cnJlbnRQYWdlKCkpLmdldEpwYVNlbGVjdGlvbigpOworCQlpZiAodGhpcy5nZXRDdXJyZW50UGFnZSgpICE9IHRoaXMuZ2V0RGVmYXVsdFBhZ2UoKSkgeworCQkJcmV0dXJuICgoSnBhU3RydWN0dXJlUGFnZSkgdGhpcy5nZXRDdXJyZW50UGFnZSgpKS5nZXRKcGFTZWxlY3Rpb24oKTsKIAkJfQotCQllbHNlIHsKLQkJCXJldHVybiBKcGFTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT047Ci0JCX0KKwkJcmV0dXJuIEpwYVNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKIAl9CiAJCiAJcHVibGljIHZvaWQgc2VsZWN0KEpwYVNlbGVjdGlvbiBuZXdTZWxlY3Rpb24pIHsKIAkJLy8gY29ycmVjdCBwYWdlIHNob3VsZCBiZSBzaG93bgotCQlpZiAoZ2V0Q3VycmVudFBhZ2UoKSAhPSBnZXREZWZhdWx0UGFnZSgpKSB7Ci0JCQkoKEpwYVN0cnVjdHVyZVBhZ2UpIGdldEN1cnJlbnRQYWdlKCkpLnNlbGVjdChuZXdTZWxlY3Rpb24pOworCQlpZiAodGhpcy5nZXRDdXJyZW50UGFnZSgpICE9IHRoaXMuZ2V0RGVmYXVsdFBhZ2UoKSkgeworCQkJKChKcGFTdHJ1Y3R1cmVQYWdlKSB0aGlzLmdldEN1cnJlbnRQYWdlKCkpLnNlbGVjdChuZXdTZWxlY3Rpb24pOwogCQl9CiAJfQogCQogCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldFNlbGVjdGlvblByb3ZpZGVyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKKwkJdGhpcy5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CiAJfQogCQogCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldFNlbGVjdGlvblByb3ZpZGVyKCkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKKwkJdGhpcy5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CiAJfQorCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0Q2hvb3NlclBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWJzdHJhY3RDaG9vc2VyUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI4YWM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWJzdHJhY3RDaG9vc2VyUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBBIGNob29zZXIgaXMgc2ltcGx5IGEgcGFuZSB3aXRoIHRocmVlIHdpZGdldHMsIHRoZSBsYWJlbCBvbiB0aGUgbGVmdCwgYSBtYWluCi0gKiB3aWRnZXQsIHVzdWFsbHkgYSB0ZXh0IGZpZWxkLCBhbmQgYSByaWdodCB3aWRnZXQgd2hpY2ggaXMgdXN1YWxseSBhIGJyb3dzZQotICogYnV0dG9uLgotICoKLSAqIEBzZWUgQ2xhc3NDaG9vc2VyUGFuZQotICogQHNlZSBQYWNrYWdlQ2hvb3NlclBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2hvb3NlclBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEFic3RyYWN0UGFuZTxUPgotewotCS8qKgotCSAqIFRoZSBjb250cm9sIHNob3duIGFmdGVyIHRoZSBsYWJlbCAobGVmdCBjb250cm9sKS4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2wgbWFpbkNvbnRyb2w7Ci0KLQkvKioKLQkgKiBUaGUgY29udHJvbCBzaG93biBhZnRlciB0aGUgbWFpbiBjb250cm9sLgotCSAqLwotCXByaXZhdGUgQ29udHJvbCByaWdodENvbnRyb2w7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0Q2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdENob29zZXJQYW5lKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0Q2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEFic3RyYWN0Q2hvb3NlclBhbmUoQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIGJyb3dzZSBidXR0b24uIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieQotCSAqIHtAbGluayAjYnVpbGRSaWdodENvbnRyb2woQ29tcG9zaXRlKX0uCi0JICoKLQkgKiBAcmV0dXJuICJCcm93c2UuLi4iCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBicm93c2VCdXR0b25UZXh0KCkgewotCQlyZXR1cm4gSnB0VWlNZXNzYWdlcy5BYnN0cmFjdENob29zZXJQYW5lX2Jyb3dzZUJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBhY3Rpb24gcmVzcG9uc2libGUgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIHdoZW4gdGhlIEJyb3dzZSBpcwotCSAqIGNsaWNrZWQuCi0JICoKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlJ1bm5hYmxlPC9jb2RlPiBwZXJmb3JtaW5nIHRoZSBhY3R1YWwgYWN0aW9uIG9mIHRoZQotCSAqIGJ1dHRvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBSdW5uYWJsZSBidWlsZEJyb3dzZUFjdGlvbigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGVmdCBjb250cm9sLiBCeSBkZWZhdWx0IGEgbGFiZWwgaXMgY3JlYXRlZCBhbmQgaXRzIHRleHQgaXMKLQkgKiByZXRyaWV2ZWQgYnkge0BsaW5rICNsYWJlbFRleHQoKX0uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBsZWZ0IGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBidWlsZExlZnRDb250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIGJ1aWxkTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWFpbiBjb250cm9sIG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIG1haW4gY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBDb250cm9sIGJ1aWxkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSByaWdodCBjb250cm9sLiBCeSBkZWZhdWx0IGEgYnJvd3NlIGJ1dHRvbiBpcyBjcmVhdGVkIGFuZCBpdHMKLQkgKiBhY3Rpb24gaXMgcGVyZm9ybWVkIGJ5IHtAbGluayAjYnVpbGRCcm93c2VBY3Rpb24oKX0gYW5kIGl0cyB0ZXh0IGlzCi0JICogcmV0cmlldmVkIGJ5IHtAbGluayAjYnJvd3NlQnV0dG9uVGV4dCgpfS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIHJpZ2h0IGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBidWlsZFJpZ2h0Q29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBidWlsZEJ1dHRvbigKLQkJCWNvbnRhaW5lciwKLQkJCWJyb3dzZUJ1dHRvblRleHQoKSwKLQkJCWJ1aWxkQnJvd3NlQWN0aW9uKCkKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCi0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0KLQkJaWYgKCFtYWluQ29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCW1haW5Db250cm9sLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQotCQlpZiAoIXJpZ2h0Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJpZ2h0Q29udHJvbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGVscCB0b3BpYyBJRCBmb3IgdGhlIGNvbnRyb2xzIG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQgb3RoZXJ3aXNlIHRoZSBzdWJjbGFzcyBjYW4gcmV0dXJuIGFuIElECi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBoZWxwSWQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCW1haW5Db250cm9sICA9IGJ1aWxkTWFpbkNvbnRyb2woY29udGFpbmVyKTsKLQkJcmlnaHRDb250cm9sID0gYnVpbGRSaWdodENvbnRyb2woY29udGFpbmVyKTsKLQotCQlidWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlidWlsZExlZnRDb250cm9sKGNvbnRhaW5lciksCi0JCQltYWluQ29udHJvbCwKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZCgpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHRleHQgb2YgdGhlIGxhYmVsLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKLQkgKiB7QGxpbmsgI2J1aWxkTGVmdENvbnRyb2woQ29tcG9zaXRlKX0uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgdGV4dCBvZiB0aGUgbGVmdCBjb250cm9sICh3aGljaCBpcyBhIGxhYmVsIGJ5Ci0JICogZGVmYXVsdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGxhYmVsVGV4dCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BYnN0cmFjdERpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BYnN0cmFjdERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTI2OWU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWJzdHJhY3REaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIGRpYWxvZyB1c2luZyBhICJzdGF0ZSBvYmplY3QiIChtb2RlbCBvYmplY3QpCi0gKiBmb3IgYmVoYXZpb3IuCi0gKiA8cD4KLSAqIFRoZSBtYWluIHBhbmUgb2YgdGhpcyBkaWFsb2cgc2hvdWxkIGJlIGV4dGVuZGluZyA8Y29kZT5BYnN0cmFjdERpYWxvZ1BhbmU8L2NvZGU+Ci0gKiBmb3IgY3JlYXRpbmcgdGhlIHJpZ2h0IHR5cGUgb2Ygd2lkZ2V0cyBhbmQgaXQgaGFzIHRoZSAic3RhdGUgb2JqZWN0IiAoc3ViamVjdCkKLSAqIGJlaGF2aW9yIGJ1aWx0LWluLgotICoKLSAqIEBzZWUgTm9kZQotICogQHNlZSBBYnN0cmFjdERpYWxvZ1BhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaWFsb2c8VCBleHRlbmRzIE5vZGU+IGV4dGVuZHMgVGl0bGVBcmVhRGlhbG9nCi17Ci0JLyoqCi0JICogVGhlIG1haW4gY29udGVudCBwYW5lIG9mIHRoaXMgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgQWJzdHJhY3REaWFsb2dQYW5lPD8+IHBhbmU7Ci0KLQkvKioKLQkgKiBUaGUgaG9sZGVyIG9mIHRoZSAic3RhdGUgb2JqZWN0IiB1c2VkIGJ5IHRoaXMgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlcjsKLQotCS8qKgotCSAqIENhY2hlcyB0aGUgdGl0bGUgdGV4dCB1bnRpbCB0aGUgZGlhbG9nIGlzIGNyZWF0ZWQgYW5kIHRoZSBkaWFsb2cncyBzaGVsbAotCSAqIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0RGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdERpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJdGhpcyhwYXJlbnQsICIiKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0RGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSB0aXRsZSBUaGUgZGlhbG9nJ3MgdGl0bGUKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3REaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIG1haW4gcGFuZSBvZiB0aGlzIGRpYWxvZy4gVGhpcyBtZXRob2QgaXMgaW52b2tlZCBvbmx5Ci0JICogd2hlbiB0aGUgZGlhbG9nIGlzIHJlcXVlc3RlZCB0byBzaG93IG9uIHNjcmVlbiBhbmQgbm90IGR1cmluZwotCSAqIGluaXRpYWxpemF0aW9uLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIHRvIHdoaWNoIHRoZSB3aWRnZXRzIHNob3VsZCBiZSBhZGRlZCB0bywKLQkgKiB0aGUgbGF5b3V0IGlzIGFscmVhZHkgc2V0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0RGlhbG9nUGFuZTw/PiBidWlsZExheW91dChDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHN0YXRlIG9iamVjdCAobW9kZWwgb2JqZWN0KSB0aGF0IHdpbGwgYmUgdXNlZCB0byBrZWVwIHRyYWNrCi0JICogb2YgdGhlIGluZm9ybWF0aW9uIGVudGVyZWQgaW4gdGhpcyBkaWFsb2cuIFRoZSBzdGF0ZSBvYmplY3Qgd2lsbCBiZSBzdG9yZWQKLQkgKiBpbiB0aGUgc3ViamVjdCBob2xkZXIgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcge0BsaW5rICNzdWJqZWN0KCl9LgotCSAqCi0JICogQHJldHVybiBBIG5ldyBzdGF0ZSBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgVCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSA8Y29kZT5WYWxpZGF0b3I8L2NvZGU+IHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIGNoYW5nZXMgYXJlCi0JICogbWFkZSB0byB0aGUgc3RhdGUgb2JqZWN0LgotCSAqCi0JICogQHJldHVybiBUaGUgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBzZXQgb24gdGhlIHN0YXRlIG9iamVjdAotCSAqLwotCU5vZGUuVmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gTm9kZS5OVUxMX1ZBTElEQVRPUjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQotCQkvLyBEaXNwb3NlIHRoZSBwYW5lIGluIG9yZGVyIHRvIHJlbW92ZSBhbnkgbGlzdGVuZXJzIHRoYXQgY291bGQKLQkJLy8gaGF2ZSBiZWVuIGluc3RhbGxlZCBvdXRzaWRlIHRoZSBzY3JvcGUgb2YgdGhlIHN0YXRlIG9iamVjdAotCQlpZiAocGFuZSAhPSBudWxsKSB7Ci0JCQlwYW5lLmRpc3Bvc2UoKTsKLQkJCXBhbmUgPSBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dCh0aXRsZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQkJaW5zdGFsbFN1YmplY3QoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChoYXNUaXRsZUFyZWEoKSkgewotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCX0KLQotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdENvbnRlbnQocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IG1haW4gY29udGFpbmVyIG9mIHRoaXMgZGlhbG9nIHdoZW4gdGhlIHRpdGxlIGFyZWEgaXMKLQkgKiBub3QgcmVxdWlyZWQuIFRoZSB0b3AgcGFydCBpcyB0aGUgZGlhbG9nIGFyZWEgcG9wdWxhdGVkIGJ5IHRoZSBzdWJjbGFzcwotCSAqIGFuZCB0aGUgbG93ZXIgcGFydCBpcyB0aGUgYnV0dG9uIHBhbmUgaGF2aW5nIHRoZSBPSyBhbmQgQ2FuY2VsIGJ1dHRvbnMuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUKLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVEZWZhdWx0Q29udGVudChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgICAgICA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCAgICA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCAgICAgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wb3NpdGUpOwotCQlkaWFsb2dBcmVhID0gY3JlYXRlRGlhbG9nQXJlYShjb21wb3NpdGUpOwotCQlidXR0b25CYXIgID0gY3JlYXRlQnV0dG9uQmFyKGNvbXBvc2l0ZSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCS8vIElmIHRoZSB0aXRsZSBhcmVhIG5lZWRzIHRvIGJlIHNob3duLCB0aGVuIGxlYXZlIHRoZSBzdXBlcmNsYXNzIHRvCi0JCS8vIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHdpZGdldHMKLQkJaWYgKGhhc1RpdGxlQXJlYSgpKSB7Ci0JCQlwYXJlbnQgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIG1haW4gYXJlYSdzIGNvbnRhaW5lcgotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCAgICAgICAgID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlICAgPSB0cnVlOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSB0aGUgY29udGVudCBwYW5lCi0JCXBhbmUgPSBidWlsZExheW91dChjb250YWluZXIpOwotCQlwYW5lLnBvcHVsYXRlKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSB0aGUgVUkgcGFydCwgd2hpY2ggcmVxdWlyZXMgdGhlIHdpZGdldHMgYmVpbmcgY3JlYXRlZAotCQlpbml0aWFsaXplVUkoKTsKLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGVzY3JpcHRpb24gYXJlYSAod2hlcmUgYSB0aXRsZSwgZGVzY3JpcHRpb24gYW5kCi0JICogaW1hZ2UpIHNob3VsZCBiZSB2aXNpYmxlIG9yIGhpZGRlbi4gPGNvZGU+QWJzdHJhY3RWYWxpZGF0aW5nRGlhbG9nPC9jb2RlPgotCSAqIGF1dG9tYXRpY2FsbHkgc2hvdyB0aGUgZGVzY3JpcHRpb24gYXJlYSBpbiBvcmRlciB0byBzaG93IHByb2JsZW1zLgotCSAqCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gYnkgZGVmYXVsdCwgd2hpY2ggbWVhbnMgdGhlIG1ldGhvZHMgdXNlZCB0bwotCSAqIHVwZGF0ZSB0aGUgdGl0bGUsIGRlc2NyaXB0aW9uIGFuZCBpbWFnZSBzaG91bGRuJ3QgYmUgY2FsbGVkOyA8Y29kZT50cnVlPC9jb2RlPgotCSAqIHRvIG1ha2UgdGhlIGRlc2NyaXB0aW9uIHBhbmUgdmlzaWJsZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc1RpdGxlQXJlYSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhlbHBzIHN5c3RlbS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBsYXRmb3JtJ3MgaGVscCBzeXN0ZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBIZWxwZXIKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgZGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuc3ViamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4oKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgVUkgcGFydCBvZiB0aGlzIGRpYWxvZywgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHdpZGdldHMKLQkgKiBoYXZlIGJlZW4gY3JlYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVUkoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgc3RhdGUgb2JqZWN0LCBpZiBvbmUgaXMgbmVlZGVkIGFuZCBpbnN0YWxsIGEgPGNvZGU+VmFsaWRhdG9yPC9jb2RlPgotCSAqIGluIG9yZGVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgZG9uZSB0byB0aGF0IHN0YXRlIG9iamVjdC4gVGhlCi0JICogc3ViamVjdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHN1YmplY3QgaG9sZGVyLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnN0YWxsU3ViamVjdCgpIHsKLQotCQlUIHN1YmplY3QgPSBidWlsZFN0YXRlT2JqZWN0KCk7Ci0KLQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJc3ViamVjdC5zZXRWYWxpZGF0b3IoYnVpbGRWYWxpZGF0b3IoKSk7Ci0JCX0KLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKHN1YmplY3QpOwotCX0KLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IGxhdW5jaGVzIHRoaXMgZGlhbG9nIGluIHRoZSBVSSB0aHJlYWQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgb3BlbkRpYWxvZygpIHsKLQkJU1dUVXRpbC5zZXRVc2VySW50ZXJmYWNlQWN0aXZlKGZhbHNlKTsKLQkJU1dUVXRpbC5zaG93KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IGxhdW5jaGVzIHRoaXMgZGlhbG9nIGluIHRoZSBVSSB0aHJlYWQgYW5kIGludm9rZSB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5Qb3N0RXhlY3V0aW9uPC9jb2RlPiB0byBwZXJmb3JtIGFueSBwb3N0LXRhc2suCi0JICoKLQkgKiBAcGFyYW0gcG9zdEV4ZWN1dGlvbiBUaGlzIGludGVyZmFjZSBsZXQgdGhlIGNhbGxlciB0byBpbnZva2UgYSBwaWVjZSBvZgotCSAqIGNvZGUgb25jZSB0aGUgZGlhbG9nIGlzIGRpc3Bvc2VkCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgb3BlbkRpYWxvZyhQb3N0RXhlY3V0aW9uPD8gZXh0ZW5kcyBBYnN0cmFjdERpYWxvZzxUPj4gZXhlY3V0aW9uKSB7Ci0JCVNXVFV0aWwuc2V0VXNlckludGVyZmFjZUFjdGl2ZShmYWxzZSk7Ci0JCVNXVFV0aWwuc2hvdyh0aGlzLCBleGVjdXRpb24pOwotCX0KLQotCS8qKgotCSAqIEdpdmVzIGFjY2VzcyB0byB0aGUgZGlhbG9nJ3MgbWFpbiBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgcGFuZSBzaG93aW5nIHRoZSBjdXN0b20gd2lkZ2V0cwotCSAqLwotCUFic3RyYWN0RGlhbG9nUGFuZTw/PiBwYW5lKCkgewotCQlyZXR1cm4gcGFuZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWJqZWN0IG9mIHRoaXMgZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBUaGUgc3ViamVjdCBvZiB0aGlzIGRpYWxvZyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWJqZWN0IHdhcwotCSAqIHVzZWQKLQkgKi8KLQlwdWJsaWMgVCBzdWJqZWN0KCkgewotCQlyZXR1cm4gc3ViamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHN1YmplY3QgaG9sZGVyIHVzZWQgdG8gYmUgcGFzc2VkIHRvIHRoZSBkaWFsb2cgcGFuZSwgd2hpY2ggaXMKLQkgKiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5BYnN0cmFjdERpYWxvZ1BhbmU8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gc3ViamVjdEhvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRpYWxvZydzIHRpdGxlLiBUaGUgdGl0bGUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGJlCi0JICogcmV0dXJuZWQgYnkgZGVmYXVsdCBidXQgaWYgaXQgd2Fzbid0IHNwZWNpZmllZCwgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQKLQkgKiB0byByZXR1cm4gaXQuCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciB0aGUgdGl0bGUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBvciBhIGRpZmZlcmVudCB0aXRsZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGUoKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRpYWxvZyB3YXMgY2FuY2VsbGVkIG9yIG5vdC4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRpYWxvZyB3YXMgY2FuY2VsbGVkOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBpdCB3YXMgY29uZmlybWVkCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gd2FzQ2FuY2VsbGVkKCkgewotCQlyZXR1cm4gZ2V0UmV0dXJuQ29kZSgpID09IENBTkNFTDsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRpYWxvZyB3YXMgY29uZmlybWVkIG9yIG5vdC4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRpYWxvZyB3YXMgY29uZmlybWVkOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBpdCB3YXMgY2FuY2VsbGVkCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gd2FzQ29uZmlybWVkKCkgewotCQlyZXR1cm4gZ2V0UmV0dXJuQ29kZSgpID09IE9LOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0RGlhbG9nUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BYnN0cmFjdERpYWxvZ1BhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiZjVhNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0RGlhbG9nUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBwYW5lIHRvIHVzZSB3aGVuIHRoZSBwYW5lIGlzIHNob3duIGluIGFuIDxjb2RlPkFic3RyYWN0RGlhbG9nPC9jb2RlPi4KLSAqCi0gKiBAc2VlIEFic3RyYWN0RGlhbG9nCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERpYWxvZ1BhbmU8VCBleHRlbmRzIE5vZGU+IGV4dGVuZHMgQWJzdHJhY3RQYW5lPFQ+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3REaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0RGlhbG9nUGFuZShBYnN0cmFjdERpYWxvZ1BhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0RGlhbG9nUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCi0JICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IGNvbnRyb2xsZXI7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3REaWFsb2dQYW5lKEFic3RyYWN0RGlhbG9nUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3REaWFsb2dQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0RGlhbG9nUGFuZShBYnN0cmFjdERpYWxvZ1BhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3REaWFsb2dQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgY29udHJvbGxlcjsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdERpYWxvZ1BhbmUoQWJzdHJhY3REaWFsb2dQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0RGlhbG9nUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3REaWFsb2dQYW5lKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0RW51bUNvbWJvVmlld2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0RW51bUNvbWJvVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjN2ZmMDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BYnN0cmFjdEVudW1Db21ib1ZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcGFuZSBzaW1wbHkgc2hvd3MgYSBjb21ibyB3aGVyZSBpdHMgZGF0YSBpcyBwb3B1bGF0aW5nIHRocm91Z2gKLSAqIHtAbGluayAjY2hvaWNlcygpfSBhbmQgYSBkZWZhdWx0IHZhbHVlIGNhbiBhbHNvIGJlIGFkZGVkLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0RW51bUNvbWJvVmlld2VyPFQgZXh0ZW5kcyBNb2RlbCwgVj4gZXh0ZW5kcyBBYnN0cmFjdFBhbmU8VD4KLXsKLQkvKioKLQkgKiBUaGUgbWFpbiB3aWRnZXQgb2YgdGhpcyBwYW5lLgotCSAqLwotCXByaXZhdGUgQ29tYm9WaWV3ZXIgY29tYm9WaWV3ZXI7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHVzZWQgdG8gcmVwcmVzZW50IHRoZSA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1ZBTFVFID0gIm51bGwiOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEVudW1Db21ib1ZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKi8KLQlBYnN0cmFjdEVudW1Db21ib1ZpZXdlcihBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEVudW1Db21ib1ZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKi8KLQlBYnN0cmFjdEVudW1Db21ib1ZpZXdlcihBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEVudW1Db21ib1ZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JQWJzdHJhY3RFbnVtQ29tYm9WaWV3ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsaXN0IG9mIGNob2ljZXMgYW5kIGFkZCBhbiBleHRyYSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUKLQkgKiBkZWZhdWx0IHZhbHVlLgotCSAqCi0JICogQHJldHVybiBUaGUgY29tYm8ncyBjaG9pY2VzIGluY2x1ZGluZyB0aGUgZGVmYXVsdCB2YWx1ZQotCSAqLwotCXByaXZhdGUgT2JqZWN0W10gYnVpbGRDaG9pY2VzKCkgewotCQlWW10gY2hvaWNlcyA9IGNob2ljZXMoKTsKLQkJaWYgKHNvcnRDaG9pY2VzKCkpIHsKLQkJCUFycmF5cy5zb3J0KGNob2ljZXMsIGJ1aWxkQ29tcGFyYXRvcigpKTsKLQkJfQotCi0JCU9iamVjdFtdIGV4dGVuZGVkQ2hvaWNlcyA9IG5ldyBPYmplY3RbY2hvaWNlcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShjaG9pY2VzLCAwLCBleHRlbmRlZENob2ljZXMsIDEsIGNob2ljZXMubGVuZ3RoKTsKLQkJZXh0ZW5kZWRDaG9pY2VzWzBdID0gTlVMTF9WQUxVRTsKLQotCQlyZXR1cm4gZXh0ZW5kZWRDaG9pY2VzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIHRvIHNvcnQgdGhlIGNob2ljZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+IHdpdGggdGhlIHJpZ2h0IGNvbWJvIHdpZGdldHMuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIGNvbWJvCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4gY29udGFpbmluZyB0aGUgcmlnaHQgY29tYm8gd2lkZ2V0Ci0JICovCi0JYWJzdHJhY3QgQ29tYm9WaWV3ZXIgYnVpbGRDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCXByaXZhdGUgQ29tcGFyYXRvcjxPYmplY3Q+IGJ1aWxkQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPE9iamVjdD4oKSB7Ci0JCQlmaW5hbCBMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBidWlsZExhYmVsUHJvdmlkZXIoKTsKLQotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZzEgPSBsYWJlbFByb3ZpZGVyLmdldFRleHQodmFsdWUxKTsKLQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZzIgPSBsYWJlbFByb3ZpZGVyLmdldFRleHQodmFsdWUyKTsKLQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGRpc3BsYXlTdHJpbmcxLCBkaXNwbGF5U3RyaW5nMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGZyb20gdGhlIGdpdmVuIE5MUyBjbGFzcyBieSBjcmVhdGluZyB0aGUKLQkgKiBrZXkuIFRoYXQga2V5IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjb21wb3NpdGUncyBzaG9ydCBjbGFzcyBuYW1lCi0JICogd2l0aCB0aGUgdG9TdHJpbmcoKSBvZiB0aGUgZ2l2ZW4gdmFsdWUgc2VwYXJhdGVkIGJ5IGFuIHVuZGVyc2NvcmUuCi0JICoKLQkgKiBAcGFyYW0gbmxzQ2xhc3MgVGhlIE5MUyBjbGFzcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBsb2NhbGl6ZWQgdGV4dAotCSAqIEBwYXJhbSBjb21wb3NpdGVDbGFzcyBUaGUgY2xhc3MgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGtleSwgaXRzIHNob3J0IGNsYXNzCi0JICogbmFtZSBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHVzZWQgdG8gYXBwZW5kIGl0cyB0b1N0cmluZygpIHRvIHRoZSBnZW5lcmF0ZWQga2V5Ci0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgYnVpbGREaXNwbGF5U3RyaW5nKENsYXNzPD8+IG5sc0NsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGNvbXBvc2l0ZUNsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSkgewotCi0JCXJldHVybiBTV1RVdGlsLmJ1aWxkRGlzcGxheVN0cmluZyhubHNDbGFzcywgY29tcG9zaXRlQ2xhc3MsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGxvY2FsaXplZCBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gTkxTIGNsYXNzIGJ5IGNyZWF0aW5nIHRoZQotCSAqIGtleS4gVGhhdCBrZXkgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGNvbXBvc2l0ZSdzIHNob3J0IGNsYXNzIG5hbWUKLQkgKiB3aXRoIHRoZSB0b1N0cmluZygpIG9mIHRoZSBnaXZlbiB2YWx1ZSBzZXBhcmF0ZWQgYnkgYW4gdW5kZXJzY29yZS4KLQkgKgotCSAqIEBwYXJhbSBubHNDbGFzcyBUaGUgTkxTIGNsYXNzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGxvY2FsaXplZCB0ZXh0Ci0JICogQHBhcmFtIGNvbXBvc2l0ZSBUaGUgb2JqZWN0IHVzZWQgdG8gcmV0cmlldmUgdGhlIHNob3J0IGNsYXNzIG5hbWUgdGhhdCBpcwotCSAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGtleQotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdXNlZCB0byBhcHBlbmQgaXRzIHRvU3RyaW5nKCkgdG8gdGhlIGdlbmVyYXRlZCBrZXkKLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoQ2xhc3M8Pz4gbmxzQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKLQotCQlyZXR1cm4gU1dUVXRpbC5idWlsZERpc3BsYXlTdHJpbmcobmxzQ2xhc3MsIGNvbXBvc2l0ZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpc3BsYXkgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgaXMgdGhlCi0JICogdmlydHVhbCA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZSB0aGVuIGl0cyBkaXNwbGF5IHN0cmluZyB3aWxsIGJlICJEZWZhdWx0IgotCSAqIGFwcGVuZGVkIGJ5IHRoZSBhY3R1YWwgZGVmYXVsdCB2YWx1ZSwgaWYgaXQgZXhpc3RzLgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0IGludG8gYSBodW1hbiByZWFkYWJsZSBzdHJpbmcKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBOVUxMX1ZBTFVFKSB7Ci0JCQlWIGRlZmF1bHRWYWx1ZSA9IChzdWJqZWN0KCkgIT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUoKSA6IG51bGw7Ci0KLQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gZGlzcGxheVN0cmluZyhkZWZhdWx0VmFsdWUpOwotCQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1lc3NhZ2VzLkVudW1Db21ib1ZpZXdlcl9kZWZhdWx0V2l0aERlZmF1bHQsIGRpc3BsYXlTdHJpbmcpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIEpwdFVpTWVzc2FnZXMuRW51bUNvbWJvVmlld2VyX2RlZmF1bHQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZGlzcGxheVN0cmluZygoVikgdmFsdWUpOwotCX0KLQotCWZpbmFsIExhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIGJ1aWxkU2VsZWN0aW9uKCkgewotCQlPYmplY3QgdmFsdWUgPSAoc3ViamVjdCgpICE9IG51bGwpID8gZ2V0VmFsdWUoKSA6IG51bGw7Ci0KLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gTlVMTF9WQUxVRTsKLQkJfQotCi0JCXJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGJ1aWxkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJaWYgKCFpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBlLmdldFNlbGVjdGlvbigpOwotCQkJCQl2YWx1ZUNoYW5nZWQoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcG9zc2libGUgY2hvaWNlcyB0byBzaG93IGluIHRoZSB2aWV3ZXIuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBpdGVtcyB0byBzaG93IGluIHRoZSBjb21ib3MKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVltdIGNob2ljZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUsIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgaWYgdGhlIHN1YmplY3QgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIHRoYXQgaXMgZGVjbGFyZWQgYXMgYmVpbmcgdGhlIGRlZmF1bHQgd2hlbiBpdCBpcyBub3QKLQkgKiBkZWZpbmVkIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgViBkZWZhdWx0VmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIHN0cmluZyBmb3IgdGhlIGdpdmVuIHZhbHVlLgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB0cmFuc2xhdGUgaW50byBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZwotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCB0ZXh0IHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRpc3BsYXlTdHJpbmcoViB2YWx1ZSk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXRoaXMucG9wdWxhdGVDb21ibygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMKLQkgKgotCSAqIEByZXR1cm4KLQkgKi8KLQlmaW5hbCBDb21ib1ZpZXdlciBnZXRDb21ib1ZpZXdlcigpIHsKLQkJcmV0dXJuIGNvbWJvVmlld2VyOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgc3ViamVjdCdzIHZhbHVlLiBUaGUgc3ViamVjdCBpcyBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHN1YmplY3QnIHZhbHVlLCB3aGljaCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgViBnZXRWYWx1ZSgpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5jb21ib1ZpZXdlciA9IHRoaXMuYnVpbGRDb21ib1ZpZXdlcihjb250YWluZXIpOwotCQl0aGlzLmNvbWJvVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihidWlsZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIGNvbWJvIGJ5IHJlLWFkZGluZyBhbGwgdGhlIGl0ZW1zLgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbWJvKCkgewotCi0JCXJlbW92ZUFsbCgpOwotCQljb21ib1ZpZXdlci5hZGQoYnVpbGRDaG9pY2VzKCkpOwotCQl1cGRhdGVTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgdGhlIGl0ZW1zIGZyb20gdGhlIGNvbWJvLgotCSAqLwotCWFic3RyYWN0IHZvaWQgcmVtb3ZlQWxsKCk7Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyB0aGUgZ2l2ZW4gbmV3IHZhbHVlIGJlIHNldCBvbiB0aGUgc3ViamVjdC4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIHRvIGJlIHNldAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldFZhbHVlKFYgdmFsdWUpOwotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgY3Vyc29yLCB3aGljaCBpcyByZXF1aXJlZCB0byBzaG93IHRoZSBlbnRpcmUgc2VsZWN0ZWQgaXRlbQotCSAqIHdpdGhpbiB0aGUgY29tYm8ncyBhcmVhLgotCSAqLwotCWFic3RyYWN0IHZvaWQgdXBkYXRlQ3Vyc29yKCk7Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjb21ibydzIHNlbGVjdGVkIGl0ZW0uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlbGVjdGlvbigpIHsKLQkJY29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKGJ1aWxkU2VsZWN0aW9uKCkpOwotCQl1cGRhdGVDdXJzb3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc2VsZWN0aW9uIGNoYW5nZXMsIG5vdGlmeSB0aGUgc3ViY2xhc3MgdG8gc2V0IHRoZSB2YWx1ZS4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHNlbGVjdGVkIGl0ZW0KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHZvaWQgdmFsdWVDaGFuZ2VkKE9iamVjdCB2YWx1ZSkgewotCi0JCS8vIENvbnZlcnQgdGhlIGRlZmF1bHQgIm51bGwiIHZhbHVlIHRvIGEgcmVhbCBudWxsCi0JCWlmICh2YWx1ZSA9PSBOVUxMX1ZBTFVFKSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0KLQotCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCXRyeSB7Ci0JCQlzZXRWYWx1ZSgoVikgdmFsdWUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0Rm9ybVBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWJzdHJhY3RGb3JtUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDkzN2ExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWJzdHJhY3RGb3JtUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgcGFuZSB0byB1c2Ugd2hlbiB0aGUgcGFuZSBpcyBzaG93biB1c2luZyB0aGUgZm9ybSBsb29rIGFuZCBmZWVsLAotICogd2hpY2ggaXMgaGFuZGxlZCBieSA8Y29kZT5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTwvY29kZT4uCi0gKgotICogQHNlZSBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RGb3JtUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQWJzdHJhY3RQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEZvcm1QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEZvcm1QYW5lKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEZvcm1QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgY29udHJvbGxlcjsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEZvcm1QYW5lKEFic3RyYWN0Rm9ybVBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RGb3JtUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEZvcm1QYW5lKEFic3RyYWN0Rm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEZvcm1QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgY29udHJvbGxlcjsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEZvcm1QYW5lKEFic3RyYWN0Rm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RGb3JtUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0Rm9ybVBhbmUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0Rm9ybVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEZvcm1QYW5lKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1Ub29sa2l0IHdpZGdldEZhY3RvcnkpIHsKLQotCQl0aGlzKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgbmV3IEZvcm1XaWRnZXRGYWN0b3J5KHdpZGdldEZhY3RvcnkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3R1YWwgd2lkZ2V0IGZhY3Rvcnkgd3JhcHBlZCBieSB0aGUgPGNvZGU+SVdpZGdldEZhY3Rvcnk8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cyB3aXRoIHRoZSBmb3JtIHN0eWxlCi0JICogKGZsYXQtc3R5bGUpIGxvb2sgYW5kIGZlZWwKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRm9ybVRvb2xraXQgZ2V0Rm9ybVdpZGdldEZhY3RvcnkoKSB7Ci0JCUZvcm1XaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkgPSAoRm9ybVdpZGdldEZhY3RvcnkpIGdldFdpZGdldEZhY3RvcnkoKTsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0UGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BYnN0cmFjdFBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3MDUwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Fic3RyYWN0UGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5Cb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQ0NvbWJvTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQ29tYm9Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5TcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVGV4dEZpZWxkTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sQWxpZ25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRDb250cm9sVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGRlZmluaXRpb24gb2YgYSBwYW5lIHdoaWNoIGhvbGRzIG9udG8gYSA8Y29kZT5Qcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+Ci0gKiB0aGF0IGNvbnRhaW5zIHRoZSBzdWJqZWN0IG9mIHRoaXMgcGFuZS4KLSAqIDxwPgotICogSXQgYWxzbyBjb250YWlucyBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBidWlsZGluZyBidXR0b25zLCBsYWJlbHMsIGNoZWNrCi0gKiBib3hlcywgYW5kIHJhZGlvIGJ1dHRvbnMsIGV0Yy4KLSAqIDxwPgotICogSXQgaXMgcG9zc2libGUgdG8gZWFzaWx5IGxpc3RlbiB0byBhbnkgcHJvcGVydHkgY2hhbmdlcyBjb21pbmcgZnJvbSB0aGUKLSAqIHN1YmplY3QsIHtAbGluayAjYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uKX0gaXMgc3BlY2lmeSB3aGljaCBwcm9wZXJ0aWVzCi0gKiBhcmUgb2YgaW50ZXJlc3QgYW5kIHtAbGluayAjcHJvcGVydHlDaGFuZ2VkKFN0cmluZyl9IGlzIHVzZWQgdG8gbm90aWZ5IHRoZQotICogcGFuZSB3aGVuIHRoZSBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLSAqCi0gKiBAc2VlIEFic3RyYWN0Rm9ybVBhbmUKLSAqIEBzZWUgQWJzdHJhY3REaWFsb2dQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGFuZTxUIGV4dGVuZHMgTW9kZWw+Ci17Ci0JLyoqCi0JICogVGhlIGxpc3RlbmVyIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3ViamVjdCBpbiBvcmRlciB0byBiZSBub3RpZmllZCB3aGVuIGEKLQkgKiBwcm9wZXJ0eSBoYXMgY2hhbmdlZCwgdGhlIHByb3BlcnR5IG5hbWVzIGFyZSBkZXRlcm1pbmVkIGJ5Ci0JICoge0BsaW5rICNwcm9wZXJ0eU5hbWVzKCl9LgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBhc3BlY3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSBjb250YWluZXIgb2YgdGhpcyBjb21wb3NpdGUuCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29udGFpbmVyOwotCi0JLyoqCi0JICoKLQkgKi8KLQlwcml2YXRlIEFycmF5TGlzdDxBYnN0cmFjdFBhbmU8Pz4+IGludGVybmFsUGFuZXNGb3JFbmFibGVtZW50Q29udHJvbDsKLQotCS8qKgotCSAqIFRoZSBhbGlnbmVyIHJlc3BvbnNpYmxlIHRvIGFsaWduIHRoZSBsZWZ0IGNvbnRyb2xzLgotCSAqLwotCXByaXZhdGUgQ29udHJvbEFsaWduZXIgbGVmdENvbnRyb2xBbGlnbmVyOwotCi0JLyoqCi0JICogRmxhZyB1c2VkIHRvIHN0b3AgdGhlIGNpcmN1bGFyIHBvcHVsYXRpb24gb2Ygd2lkZ2V0cy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcG9wdWxhdGluZzsKLQotCS8qKgotCSAqIFRoZSBhbGlnbmVyIHJlc3BvbnNpYmxlIHRvIGFsaWduIHRoZSBsZWZ0IGNvbnRyb2xzLgotCSAqLwotCXByaXZhdGUgQ29udHJvbEFsaWduZXIgcmlnaHRDb250cm9sQWxpZ25lcjsKLQotCS8qKgotCSAqIFRoaXMgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzdWJqZWN0IGhvbGRlciBpbiBvcmRlciB0bwotCSAqIGF1dG9tYXRpY2FsbHkgcmVwb3B1bGF0ZSB0aGlzIHBhbmUgd2l0aCB0aGUgbmV3IHN1YmplY3QuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHN1YmplY3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IG9mIHRoaXMgcGFuZS4KLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyOwotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2YgcmVnaXN0ZXJlZCBzdWItcGFuZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG5vdGlmaWVkCi0JICogd2hlbiBsaXN0ZW5lcnMgbmVlZCB0byBiZSBlbmdhZ2VkIG9yIGRpc2VuZ2FnZWQgb3Igd2hlbiB0byBwb3B1bGF0ZSBpdHMKLQkgKiB3aWRnZXRzLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxBYnN0cmFjdFBhbmU8Pz4+IHN1YlBhbmVzOwotCi0JLyoqCi0JICogVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cy4KLQkgKi8KLQlwcml2YXRlIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeTsKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNvbnRyb2w8L2NvZGU+cyB0aGF0IGFyZSBkaXNwbGF5ZWQgaW4gdGhpcyBwYW5lLAotCSAqIHdoaWNoIHdpbGwgaGF2ZSB0aGVpciBlbmFibGVtZW50IHN0YXRlIHVwZGF0ZWQgd2hlbgotCSAqIHtAbGluayAjZW5hYmxlV2lkZ2V0cyhib29sZWFuKX0gaXMgY2FsbGVkLgotCSAqLwotCXByaXZhdGUgQXJyYXlMaXN0PENvbnRyb2w+IHdpZGdldHM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0U3ViamVjdFBhbmU8L2NvZGU+LgotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSBBYnN0cmFjdFBhbmUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdFN1YmplY3RQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFBhbmUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMocGFyZW50UGFuZSwgcGFyZW50LCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0U3ViamVjdFBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBwYW5lOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0UGFuZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0KLQkJdGhpcyhwYXJlbnRQYW5lLAotCQkgICAgIHBhcmVudFBhbmUuZ2V0U3ViamVjdEhvbGRlcigpLAotCQkgICAgIHBhcmVudCwKLQkJICAgICBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0U3ViamVjdFBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQYW5lKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0U3ViamVjdFBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBwYW5lOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0UGFuZShBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQotCQl0aGlzKHN1YmplY3RIb2xkZXIsCi0JCSAgICAgcGFyZW50LAotCQkgICAgIHBhcmVudFBhbmUuZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQotCQlpbml0aWFsaXplKHBhcmVudFBhbmUsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RTdWJqZWN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0UGFuZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoKTsKLQotCQl0aGlzLmluaXRpYWxpemUoc3ViamVjdEhvbGRlciwgd2lkZ2V0RmFjdG9yeSk7Ci0KLQkJdHJ5IHsKLQkJCXRoaXMucG9wdWxhdGluZyA9IHRydWU7Ci0KLQkJCXRoaXMuY29udGFpbmVyID0gdGhpcy5idWlsZENvbnRhaW5lcihwYXJlbnQpOwotCQkJdGhpcy5pbml0aWFsaXplTGF5b3V0KHRoaXMuY29udGFpbmVyKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRoaXMucG9wdWxhdGluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gcGFuZSdzIHdpZGdldHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIHdpdGggaXRzCi0JICogbGVmdCA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4pIHRvIHRoaXMgcGFuZSdzIGxlZnQKLQkgKiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4gc28gdGhhdCB0aGVpciB3aWR0aCBjYW4gYmUgYWRqdXN0ZWQgdG8gaGF2ZQotCSAqIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIHdpZGdldHMgdG8gYWRkCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkQWxpZ25MZWZ0KEFic3RyYWN0UGFuZTw/PiBjb250YWluZXIpIHsKLQkJdGhpcy5sZWZ0Q29udHJvbEFsaWduZXIuYWRkKGNvbnRhaW5lci5sZWZ0Q29udHJvbEFsaWduZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbnRyb2wgdG8gdGhlIGNvbGxlY3Rpb24gb2Ygd2lkZ2V0cyB0aGF0IGhhdmUgdGhlaXIgd2lkdGgKLQkgKiBhZGp1c3Qgd2l0aCB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB3aWRnZXQuIFRoZSBsZWZ0IGFsaWdubWVudCBpcyB1c3VhbGx5Ci0JICogdXNlZCBmb3IgbGFiZWxzLgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgdG8gYWRkCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkQWxpZ25MZWZ0KENvbnRyb2wgY29udHJvbCkgewotCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lci5hZGQoY29udHJvbCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gcGFuZSdzIHdpZGdldHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIHdpdGggaXRzCi0JICogcmlnaHQgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+KSB0byB0aGlzIHBhbmUncyByaWdodAotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBzbyB0aGF0IHRoZWlyIHdpZHRoIGNhbiBiZSBhZGp1c3RlZCB0byBoYXZlCi0JICogdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgY29udGFpbmluZyB0aGUgd2lkZ2V0cyB0byBhZGQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRBbGlnblJpZ2h0KEFic3RyYWN0UGFuZTw/PiBjb250YWluZXIpIHsKLQkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLmFkZChjb250YWluZXIucmlnaHRDb250cm9sQWxpZ25lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29udHJvbCB0byB0aGUgY29sbGVjdGlvbiBvZiB3aWRnZXRzIHRoYXQgaGF2ZSB0aGVpciB3aWR0aAotCSAqIGFkanVzdCB3aXRoIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHdpZGdldC4gVGhlIGxlZnQgYWxpZ25tZW50IGlzIHVzdWFsbHkKLQkgKiB1c2VkIGZvciBidXR0b25zLgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgdG8gYWRkCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkQWxpZ25SaWdodChDb250cm9sIGNvbnRyb2wpIHsKLQkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBwYW5lJ3MgY29udHJvbHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIGZvcgotCSAqIGFsaWdubWVudCkgZnJvbSB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRvIGFkZCBmb3IKLQkgKiBhbGlnbm1lbnQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRQYW5lRm9yQWxpZ25tZW50KEFic3RyYWN0UGFuZTw/PiBjb250YWluZXIpIHsKLQkJYWRkQWxpZ25MZWZ0KGNvbnRhaW5lcik7Ci0JCWFkZEFsaWduUmlnaHQoY29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGFueSBwcm9wZXJ0eSBuYW1lcyB0byB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBpbiBvcmRlciB0byBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhlIGFjdHVhbCBwcm9wZXJ0eSBjaGFuZ2VzIGluIHRoZSBzdWJqZWN0LgotCSAqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZXMgVGhlIGNvbGxlY3Rpb24gb2YgcHJvcGVydHkgbmFtZXMgdG8gcmVnaXN0ZXIgd2l0aCB0aGUKLQkgKiBzdWJqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGF0IHRoZSBnaXZlbiA8Y29kZT5Db250cm9sPC9jb2RlPiBoYXMgaXRzIGVuYWJsZW1lbnQgc3RhdGUKLQkgKiBtYW5hZ2VkIGJ5IHRoaXMgcGFuZSwgaS5lLiB0aHJvdWdoIHtAbGluayAjZW5hYmxlV2lkZ2V0cyhib29sZWFuKX0uCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgPGNvZGU+Q29udHJvbDwvY29kZT4gdG8gbWFuYWdlIGl0cyBlbmFibGVtZW50IHN0YXRlCi0JICogYXV0b21hdGljYWxseQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZFRvRW5hYmxlbWVudENvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCWNvbnRyb2wuc2V0RGF0YSgiZW5hYmxlbWVudCIsIG51bGwpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEFzcGVjdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKGJ1aWxkQXNwZWN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEFzcGVjdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCS8vc3ViamVjdCgpIGNvdWxkIGhhdmUgY2hhbmdlZCBvciBpcyBudWxsIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmlsaXR5IG9mCi0JCQkJLy8ianVtcGluZyIgb24gdGhlIFVJIHRocmVhZCBoZXJlIGFuZCBhIHNlbGVjdGlvbiBjaGFuZ2Ugb2NjdXJpbmcKLQkJCQlpZiAoZS5nZXRTb3VyY2UoKSA9PSBzdWJqZWN0KCkpIHsKLQkJCQkJdXBkYXRlUGFuZShlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBidXR0b24gdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJ1dHRvbkFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGJ1aWxkQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGJ1dHRvbkFjdGlvbikgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkQnV0dG9uKGNvbnRhaW5lciwgdGV4dCwgbnVsbCwgYnV0dG9uQWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGJ1dHRvbiB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgY2hlY2sgYm94Ci0JICogQHBhcmFtIGJ1dHRvbkFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGJ1aWxkQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBidXR0b25BY3Rpb24pIHsKLQotCQlCdXR0b24gYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUJ1dHRvbihjb250YWluZXIsIHRleHQpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTV1RVdGlsLmFzeW5jRXhlYyhidXR0b25BY3Rpb24pOwotCQkJfQotCQl9KTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWhlbHBTeXN0ZW0oKS5zZXRIZWxwKGJ1dHRvbiwgaGVscElkKTsKLQkJfQotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbm9uLWVkaXRhYmxlIDxjb2RlPkNDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ0NvbWJvIGJ1aWxkQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDQ29tYm8gY29tYm8gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlQ0NvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgPGNvZGU+Q0NvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ0NvbWJvIGJ1aWxkQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZENDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48Vj5pbnN0YW5jZSgpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgPGNvZGU+Q0NvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCi0JICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ0NvbWJvIGJ1aWxkQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlcikgewotCi0JCUNDb21ibyBjb21ibyA9IHRoaXMuYnVpbGRDQ29tYm8oY29udGFpbmVyKTsKLQotCQlDQ29tYm9Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJY29tYm8sCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4gdXNpbmcgYSA8Y29kZT5DQ29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSBwcm92aWRlciByZXNwb25zaWJsZSB0byBjb252ZXJ0IHRoZSBjb21ibydzIGl0ZW1zCi0JICogaW50byBodW1hbiByZWFkYWJsZSBzdHJpbmdzCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm9WaWV3ZXIgYnVpbGRDQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQlDQ29tYm8gY29tYm8gPSB0aGlzLmJ1aWxkQ0NvbWJvKGNvbnRhaW5lcik7Ci0JCUNvbWJvVmlld2VyIHZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21ibyk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hlY2sgYm94IHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYnVpbGRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkQ2hlY2tCb3gocGFyZW50LCBidXR0b25UZXh0LCBib29sZWFuSG9sZGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgY2hlY2sgYm94Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBidWlsZENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRUb2dnbGVCdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlidXR0b25UZXh0LAotCQkJYm9vbGVhbkhvbGRlciwKLQkJCWhlbHBJZCwKLQkJCVNXVC5DSEVDSwotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4gdGhhdCBjYW4gYmUgY29sbGFwc2VkLiBBIHN1Yi1wYW5lIGlzCi0JICogYXV0b21hdGljYWxseSBhZGRlZCBhcyBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBidWlsZENvbGxhcHNhYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0KSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRDb2xsYXBzYWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKLQkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBzZWN0aW9uIHRvIGNyZWF0ZQotCSAqIEBwYXJhbSBleHBhbmRlZFN0YXRlSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdGhhdCB3aWxsIGRpY3RhdGUKLQkgKiB3aGVuIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZENvbGxhcHNhYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZXhwYW5kZWRTdGF0ZUhvbGRlcikgewotCi0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gdGhpcy5idWlsZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IHR5cGUKLQkJKTsKLQotCQlTZWN0aW9uIHNlY3Rpb24gPSAoU2VjdGlvbikgc3ViUGFuZS5nZXRQYXJlbnQoKTsKLQotCQlleHBhbmRlZFN0YXRlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQlidWlsZEV4cGFuZGVkU3RhdGVDaGFuZ2VMaXN0ZW5lcihzZWN0aW9uKQotCQkpOwotCi0JCXNlY3Rpb24uc2V0RXhwYW5kZWQoCi0JCQlleHBhbmRlZFN0YXRlSG9sZGVyLmdldFZhbHVlKCkgIT0gbnVsbCA/IGV4cGFuZGVkU3RhdGVIb2xkZXIuZ2V0VmFsdWUoKSA6IHRydWUKLQkJKTsKLQotCQlyZXR1cm4gc3ViUGFuZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKLQkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gZXhwYW5kZWRTdGF0ZUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHRoYXQgd2lsbCBkaWN0YXRlCi0JICogd2hlbiB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBidWlsZENvbGxhcHNhYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGV4cGFuZGVkU3RhdGVIb2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZENvbGxhcHNhYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUsCi0JCQlleHBhbmRlZFN0YXRlSG9sZGVyCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCB3aGljaCBjYW4gYmUgdHlwZWQgY2FzdCBkaXJlY3RseSBhcyBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYnVpbGRDb2xsYXBzYWJsZVN1YlNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGV4cGFuZGVkU3RhdGVIb2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZENvbGxhcHNhYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJU1dULk5VTEwsCi0JCQlleHBhbmRlZFN0YXRlSG9sZGVyCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGJ1aWxkQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUNvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGJ1aWxkQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48Vj5pbnN0YW5jZSgpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGJ1aWxkQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmJ1aWxkQ29tYm8oY29udGFpbmVyKTsKLQotCQlDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQljb21ibywKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiB1c2luZyBhIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcwotCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncwotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvVmlld2VyIGJ1aWxkQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5idWlsZENvbWJvKGNvbnRhaW5lcik7Ci0JCUNvbWJvVmlld2VyIHZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21ibyk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1haW4gY29udGFpbmVyIG9mIHRoaXMgcGFuZS4gVGhlIGxheW91dCBhbmQgbGF5b3V0IGRhdGEgYXJlCi0JICogYXV0b21hdGljYWxseSBzZXQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHRoYXQgd2lsbCBob2xkcyBhbGwgdGhlCi0JICogd2lkZ2V0cyBjcmVhdGVkIGJ5IHRoaXMgcGFuZSB0aHJvdWdoIHtAbGluayAjaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUpfQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgYnVpbGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFN1YlBhbmUocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENDb21ibyBidWlsZEVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDQ29tYm8gY29tYm8gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlRWRpdGFibGVDQ29tYm8oY29udGFpbmVyKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNDb21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENDb21ibyBidWlsZEVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRFZGl0YWJsZUNDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48Vj5pbnN0YW5jZSgpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSA8Y29kZT5DQ29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDQ29tYm8gYnVpbGRFZGl0YWJsZUNDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQotCQlDQ29tYm8gY29tYm8gPSB0aGlzLmJ1aWxkRWRpdGFibGVDQ29tYm8oY29udGFpbmVyKTsKLQotCQlDQ29tYm9Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJY29tYm8sCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4gdXNpbmcgYSA8Y29kZT5DQ29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSBwcm92aWRlciByZXNwb25zaWJsZSB0byBjb252ZXJ0IHRoZSBjb21ibydzIGl0ZW1zCi0JICogaW50byBodW1hbiByZWFkYWJsZSBzdHJpbmdzCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm9WaWV3ZXIgYnVpbGRFZGl0YWJsZUNDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJQ0NvbWJvIGNvbWJvID0gdGhpcy5idWlsZEVkaXRhYmxlQ0NvbWJvKGNvbnRhaW5lcik7Ci0JCUNvbWJvVmlld2VyIHZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21ibyk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGJ1aWxkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlRWRpdGFibGVDb21ibyhjb250YWluZXIpOwotCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGJ1aWxkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxWPmluc3RhbmNlKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCi0JICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBidWlsZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmJ1aWxkRWRpdGFibGVDb21ibyhjb250YWluZXIpOwotCi0JCUNvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWNvbWJvLAotCQkJc3RyaW5nQ29udmVydGVyCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+IHVzaW5nIGEgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSBwcm92aWRlciByZXNwb25zaWJsZSB0byBjb252ZXJ0IHRoZSBjb21ibydzIGl0ZW1zCi0JICogaW50byBodW1hbiByZWFkYWJsZSBzdHJpbmdzCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm9WaWV3ZXIgYnVpbGRFZGl0YWJsZUNvbWJvVmlld2VyKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5idWlsZEVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQkJQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbWJvKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRXhwYW5kZWRTdGF0ZUNoYW5nZUxpc3RlbmVyKGZpbmFsIFNlY3Rpb24gc2VjdGlvbikgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKGJ1aWxkRXhwYW5kZWRTdGF0ZUNoYW5nZUxpc3RlbmVyXyhzZWN0aW9uKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRXhwYW5kZWRTdGF0ZUNoYW5nZUxpc3RlbmVyXyhmaW5hbCBTZWN0aW9uIHNlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgZS5nZXROZXdWYWx1ZSgpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gQm9vbGVhbi5UUlVFOwotCQkJCX0KLQkJCQlzZWN0aW9uLnNldEV4cGFuZGVkKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkh5cGVybGluazwvY29kZT4gdGhhdCB3aWxsIGludm9rZWQgdGhlIGdpdmVuCi0JICogPGNvZGU+UnVubmFibGU8L2NvZGU+IHdoZW4gc2VsZWN0ZWQuIFRoZSBnaXZlbiBhY3Rpb24gaXMgYWx3YXlzIGludm9rZWQKLQkgKiBmcm9tIHRoZSBVSSB0aHJlYWQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGh5cGVybGluaydzIHRleHQKLQkgKiBAcGFyYW0gaHlwZXJMaW5rQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBsaW5rIHdhcyBzZWxlY3RlZAotCSAqIHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5IeXBlcmxpbms8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEh5cGVybGluayBidWlsZEh5cGVyTGluayhDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBoeXBlckxpbmtBY3Rpb24pIHsKLQotCQlIeXBlcmxpbmsgbGluayA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVIeXBlcmxpbmsocGFyZW50LCB0ZXh0KTsKLQkJdGhpcy53aWRnZXRzLmFkZChsaW5rKTsKLQotCQlsaW5rLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQotCQkJCUh5cGVybGluayBoeXBlckxpbmsgPSAoSHlwZXJsaW5rKSBlLndpZGdldDsKLQotCQkJCWlmIChoeXBlckxpbmsuaXNFbmFibGVkKCkpIHsKLQkJCQkJU1dUVXRpbC5hc3luY0V4ZWMoaHlwZXJMaW5rQWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGFibGUgdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIGxhYmVsJ3MgdGV4dAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMYWJlbCBidWlsZExhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCkgewotCi0JCXJldHVybiB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENDb21ibyBidWlsZExhYmVsZWRDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkQ0NvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxWPmluc3RhbmNlKCksCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIG5vbi1lZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGgKLQkgKiB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ0NvbWJvIGJ1aWxkTGFiZWxlZENDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJQ0NvbWJvIGNvbWJvID0gdGhpcy5idWlsZENDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQotCQl0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCShjb21iby5nZXRQYXJlbnQoKSAhPSBjb250YWluZXIpID8gY29tYm8uZ2V0UGFyZW50KCkgOiBjb21ibywKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIG5vbi1lZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGgKLQkgKiB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ0NvbWJvIGJ1aWxkTGFiZWxlZENDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRDQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJc3RyaW5nQ29udmVydGVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgbm9uLWVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aAotCSAqIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGNvbWJvTGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBzZWxlY3Rpb24KLQkgKiBjaGFuZ2VzCi0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDQ29tYm8gYnVpbGRMYWJlbGVkQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlDQ29tYm8gY29tYm8gPSB0aGlzLmJ1aWxkQ0NvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxlZnRDb250cm9sIFRoZSB3aWRnZXQgc2hvd24gdG8gdGhlIGxlZnQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDQ29tYm8gYnVpbGRMYWJlbGVkQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRDQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQljb21ib0xpc3RlbmVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgbm9uLWVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aAotCSAqIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBidWlsZExhYmVsZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48Vj5pbnN0YW5jZSgpLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYnVpbGRMYWJlbGVkQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZENvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxWPmluc3RhbmNlKCksCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIG5vbi1lZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGgKLQkgKiB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYnVpbGRMYWJlbGVkQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5idWlsZENvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgbm9uLWVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aAotCSAqIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBidWlsZExhYmVsZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZENvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXN0cmluZ0NvbnZlcnRlciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIG5vbi1lZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGgKLQkgKiB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBjb21ib0xpc3RlbmVyIFRoZSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgc2VsZWN0aW9uCi0JICogY2hhbmdlcwotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYnVpbGRMYWJlbGVkQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZ5TGlzdGVuZXIgY29tYm9MaXN0ZW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYnVpbGRDb21ibyhjb250YWluZXIpOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQotCQl0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCShjb21iby5nZXRQYXJlbnQoKSAhPSBjb250YWluZXIpID8gY29tYm8uZ2V0UGFyZW50KCkgOiBjb21ibywKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsZWZ0Q29udHJvbCBUaGUgd2lkZ2V0IHNob3duIHRvIHRoZSBsZWZ0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYnVpbGRMYWJlbGVkQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZ5TGlzdGVuZXIgY29tYm9MaXN0ZW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZENvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJY29tYm9MaXN0ZW5lciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsZWZ0Q29udHJvbCBUaGUgd2lkZ2V0IHNob3duIHRvIHRoZSBsZWZ0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgbGVmdENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjZW50ZXJDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQkvLyBDb250YWluZXIgZm9yIHRoZSBsYWJlbCBhbmQgbWFpbiBjb21wb3NpdGUKLQkJY29udGFpbmVyID0gdGhpcy5idWlsZFN1YlBhbmUoY29udGFpbmVyLCAzLCA1LCAwLCAwLCAwKTsKLQotCQkvLyBMZWZ0IGNvbnRyb2wKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQlsZWZ0Q29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBSZS1wYXJlbnQgdGhlIGxlZnQgY29udHJvbCB0byB0aGUgbmV3IHN1YiBwYW5lCi0JCWxlZnRDb250cm9sLnNldFBhcmVudChjb250YWluZXIpOwotCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lci5hZGQobGVmdENvbnRyb2wpOwotCQl0aGlzLndpZGdldHMuYWRkKGxlZnRDb250cm9sKTsKLQotCQkvLyBDZW50ZXIgY29udHJvbAotCQljZW50ZXJDb250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl0aGlzLndpZGdldHMuYWRkKGNlbnRlckNvbnRyb2wpOwotCi0JCS8vIFJlLXBhcmVudCB0aGUgY2VudGVyIGNvbnRyb2wgdG8gdGhlIG5ldyBzdWIgcGFuZQotCQljZW50ZXJDb250cm9sLnNldFBhcmVudChjb250YWluZXIpOwotCi0JCS8vIFJlZ2lzdGVyIHRoZSBoZWxwIGlkIGZvciB0aGUgY2VudGVyIGNvbnRyb2wKLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQloZWxwU3lzdGVtKCkuc2V0SGVscChjZW50ZXJDb250cm9sLCBoZWxwSWQpOwotCQl9Ci0KLQkJLy8gUmlnaHQgY29udHJvbAotCQlpZiAocmlnaHRDb250cm9sID09IG51bGwpIHsKLQkJCUNvbXBvc2l0ZSBzcGFjZXIgPSB0aGlzLmJ1aWxkUGFuZShjb250YWluZXIpOwotCQkJc3BhY2VyLnNldExheW91dCh0aGlzLmJ1aWxkU3BhY2VyTGF5b3V0KCkpOwotCQkJcmlnaHRDb250cm9sID0gc3BhY2VyOwotCQl9Ci0JCWVsc2UgewotCQkJcmlnaHRDb250cm9sLnNldFBhcmVudChjb250YWluZXIpOwotCi0JCQkvLyBSZWdpc3RlciB0aGUgaGVscCBpZCBmb3IgdGhlIHJpZ2h0IGNvbnRyb2wKLQkJCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJCWhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJpZ2h0Q29udHJvbCwgaGVscElkKTsKLQkJCX0KLQkJfQotCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotCQlyaWdodENvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRoaXMucmlnaHRDb250cm9sQWxpZ25lci5hZGQocmlnaHRDb250cm9sKTsKLQkJdGhpcy53aWRnZXRzLmFkZChyaWdodENvbnRyb2wpOwotCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGNlbnRlciBjb250cm9sCi0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29udHJvbAotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYnVpbGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBsYWJlbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNlbnRlckNvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsLAotCQkJY2VudGVyQ29udHJvbCwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdXNlZCB0byBkZXNjcmliZSB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsIGxhYmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsLAotCQkJY2VudGVyQ29udHJvbCwKLQkJCW51bGwKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbXBvc2l0ZSBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IHRvIGxhYmVsIHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjZW50ZXJQYW5lIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQYW5lPD8+IGNlbnRlclBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENlbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWNlbnRlclBhbmUuZ2V0Q29udHJvbCgpLAotCQkJcmlnaHRDZW50cm9sLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb21wb3NpdGUgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCB0byBsYWJlbCB0aGUgbWFpbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY2VudGVyUGFuZSBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBidWlsZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGFuZTw/PiBjZW50ZXJQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQljZW50ZXJQYW5lLmdldENvbnRyb2woKSwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29tcG9zaXRlIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbCB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgdG8gbGFiZWwgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBidWlsZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCkgewotCi0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJY2VudGVyQ29udHJvbCwKLQkJCW51bGwsCi0JCQludWxsCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb21wb3NpdGUgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCB0byBsYWJlbCB0aGUgbWFpbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjZW50ZXJDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sKSB7Ci0KLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQljZW50ZXJDb250cm9sLAotCQkJcmlnaHRDb250cm9sLAotCQkJbnVsbAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29tcG9zaXRlIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbCB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgdG8gbGFiZWwgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYnVpbGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNlbnRlckNvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENlbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCXRoaXMuYnVpbGRMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCksCi0JCQljZW50ZXJDb250cm9sLAotCQkJcmlnaHRDZW50cm9sLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb21wb3NpdGUgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCB0byBsYWJlbCB0aGUgbWFpbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBidWlsZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSB0aGlzLmJ1aWxkTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQpOwotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsLAotCQkJY2VudGVyQ29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENDb21ibyBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxWPmluc3RhbmNlKCksCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhbiBlZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ0NvbWJvIGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFY+aW5zdGFuY2UoKSwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDQ29tYm8gYnVpbGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUNDb21ibyBjb21ibyA9IHRoaXMuYnVpbGRFZGl0YWJsZUNDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQotCQl0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCShjb21iby5nZXRQYXJlbnQoKSAhPSBjb250YWluZXIpID8gY29tYm8uZ2V0UGFyZW50KCkgOiBjb21ibywKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhbiBlZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ0NvbWJvIGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlzdHJpbmdDb252ZXJ0ZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGVmdENvbnRyb2wgVGhlIHdpZGdldCBzaG93biB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENDb21ibyBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlDQ29tYm8gY29tYm8gPSB0aGlzLmJ1aWxkRWRpdGFibGVDQ29tYm8oY29udGFpbmVyKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoY29tYm9MaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWlsZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQkoY29tYm8uZ2V0UGFyZW50KCkgIT0gY29udGFpbmVyKSA/IGNvbWJvLmdldFBhcmVudCgpIDogY29tYm8sCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYW4gZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoIHRoZQotCSAqIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gY29tYm9MaXN0ZW5lciBUaGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNlbGVjdGlvbgotCSAqIGNoYW5nZXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENDb21ibyBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQljb21ib0xpc3RlbmVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxlZnRDb250cm9sIFRoZSB3aWRnZXQgc2hvd24gdG8gdGhlIGxlZnQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHByb3ZpZGVyIHJlc3BvbnNpYmxlIHRvIGNvbnZlcnQgdGhlIGNvbWJvJ3MgaXRlbXMKLQkgKiBpbnRvIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENDb21ibyBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJQ29tYm9WaWV3ZXIgY29tYm9WaWV3ZXIgPSB0aGlzLmJ1aWxkRWRpdGFibGVDQ29tYm9WaWV3ZXIoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFByb3ZpZGVyCi0JCSk7Ci0KLQkJQ0NvbWJvIGNvbWJvID0gY29tYm9WaWV3ZXIuZ2V0Q0NvbWJvKCk7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGFuIGVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGNvbWJvTGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBzZWxlY3Rpb24KLQkgKiBjaGFuZ2VzCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHByb3ZpZGVyIHJlc3BvbnNpYmxlIHRvIGNvbnZlcnQgdGhlIGNvbWJvJ3MgaXRlbXMKLQkgKiBpbnRvIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENDb21ibyBidWlsZExhYmVsZWRFZGl0YWJsZUNDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvVmlld2VyKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJY29tYm9MaXN0ZW5lciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFY+aW5zdGFuY2UoKSwKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGFuIGVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGJ1aWxkTGFiZWxlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48Vj5pbnN0YW5jZSgpLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCi0JICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYnVpbGRMYWJlbGVkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmJ1aWxkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQotCQl0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCShjb21iby5nZXRQYXJlbnQoKSAhPSBjb250YWluZXIpID8gY29tYm8uZ2V0UGFyZW50KCkgOiBjb21ibywKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhbiBlZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBidWlsZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJc3RyaW5nQ29udmVydGVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxlZnRDb250cm9sIFRoZSB3aWRnZXQgc2hvd24gdG8gdGhlIGxlZnQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21ibyBidWlsZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYnVpbGRFZGl0YWJsZUNvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGFuIGVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGNvbWJvTGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBzZWxlY3Rpb24KLQkgKiBjaGFuZ2VzCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21ibyBidWlsZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJY29tYm9MaXN0ZW5lciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGFyZWEncyBsYWJlbAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZExhYmVsZWRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkTXVsdGlMaW5lVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCXRleHRIb2xkZXIsCi0JCQludWxsCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBhcmVhJ3MgbGFiZWwKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSB3aWRnZXQgdG8gYmUgcGxhY2VkIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dCBhcmVhCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZExhYmVsZWRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5idWlsZE11bHRpTGluZVRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyKTsKLQotCQl0aGlzLmJ1aWxkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCXRleHQsCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGFyZWEncyBsYWJlbAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBsaW5lQ291bnQgVGhlIG51bWJlciBvZiBsaW5lcyB0aGUgdGV4dCBhcmVhIHNob3VsZCBkaXNwbGF5Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkTGFiZWxlZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZUNvdW50KSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkTXVsdGlMaW5lVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCXRleHRIb2xkZXIsCi0JCQlsaW5lQ291bnQsCi0JCQludWxsCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBhcmVhJ3MgbGFiZWwKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gbGluZUNvdW50IFRoZSBudW1iZXIgb2YgbGluZXMgdGhlIHRleHQgYXJlYSBzaG91bGQgZGlzcGxheQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRMYWJlbGVkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5idWlsZE11bHRpTGluZVRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyLCBsaW5lQ291bnQpOwotCi0JCWNvbnRhaW5lciA9IHRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJdGV4dCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCWludCB0ZXh0SGVpZ2h0ID0gdGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnk7Ci0KLQkJLy8gU3BlY2lmeSB0aGUgbnVtYmVyIG9mIGxpbmVzIHRoZSB0ZXh0IGFyZWEgc2hvdWxkIGRpc3BsYXkKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIHRleHQuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiBsaW5lQ291bnQ7Ci0KLQkJLy8gTW92ZSB0aGUgbGFiZWwgdG8gdGhlIHRvcCBvZiBpdHMgY2VsbAotCQlDb250cm9sIGxhYmVsID0gY29udGFpbmVyLmdldENoaWxkcmVuKClbMF07Ci0JCWludCBsYWJlbEhlaWdodCA9IGxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLQotCQlncmlkRGF0YSA9IChHcmlkRGF0YSkgbGFiZWwuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ICAgKz0gKE1hdGguYWJzKHRleHRIZWlnaHQgLSBsYWJlbEhlaWdodCkgLyAyKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGFyZWEncyBsYWJlbAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRMYWJlbGVkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRNdWx0aUxpbmVUZXh0KAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJdGV4dEhvbGRlciwKLQkJCTMsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRMYWJlbGVkUGFzc3dvcmRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZFBhc3N3b3JkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCXRleHRIb2xkZXIsCi0JCQludWxsCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBmaWVsZCdzIGxhYmVsCi0JICogQHBhcmFtIHJpZ2h0Q29tcG9uZW50IFRoZSBjb21wb25lbnQgdG8gYmUgcGxhY2VkIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dAotCSAqIGZpZWxkCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZExhYmVsZWRQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29tcG9uZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5idWlsZFBhc3N3b3JkVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIpOwotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJdGV4dCwKLQkJCXJpZ2h0Q29tcG9uZW50LAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZExhYmVsZWRQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkUGFzc3dvcmRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJdGV4dEhvbGRlciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkTGFiZWxlZFBhd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkUGFzc3dvcmRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJdGV4dEhvbGRlciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNwaW5uZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgbGFiZWwncyB0ZXh0Ci0JICogQHBhcmFtIG51bWJlckhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgc2hvd24gd2hlbiB0aGUgaG9sZGVyIGhhcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+U3Bpbm5lcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lciBidWlsZExhYmVsZWRTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQludW1iZXJIb2xkZXIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQkwLAotCQkJSW50ZWdlci5NQVhfVkFMVUUsCi0JCQludWxsLAotCQkJbnVsbAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc3Bpbm5lci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKiBAcGFyYW0gbnVtYmVySG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGludGVnZXIgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSBzaG93biB3aGVuIHRoZSBob2xkZXIgaGFzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgd2lkZ2V0IHRvIGJlIHBsYWNlZCB0byB0aGUgcmlnaHQgb2Ygc3Bpbm5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+U3Bpbm5lcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lciBidWlsZExhYmVsZWRTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRMYWJlbGVkU3Bpbm5lcigKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCW51bWJlckhvbGRlciwKLQkJCWRlZmF1bHRWYWx1ZSwKLQkJCTAsCi0JCQlJbnRlZ2VyLk1BWF9WQUxVRSwKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCW51bGwKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNwaW5uZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgbGFiZWwncyB0ZXh0Ci0JICogQHBhcmFtIG51bWJlckhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgc2hvd24gd2hlbiB0aGUgaG9sZGVyIGhhcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBtaW5pbXVtVmFsdWUgVGhlIG1pbmltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIG1heGltdW1WYWx1ZSBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSB3aWRnZXQgdG8gYmUgcGxhY2VkIHRvIHRoZSByaWdodCBvZiBzcGlubmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5TcGlubmVyPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTcGlubmVyIGJ1aWxkTGFiZWxlZFNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbmltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhpbXVtVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZFNwaW5uZXIoCi0JCQlwYXJlbnQsCi0JCQlsYWJlbFRleHQsCi0JCQludW1iZXJIb2xkZXIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQltaW5pbXVtVmFsdWUsCi0JCQltYXhpbXVtVmFsdWUsCi0JCQlyaWdodENvbnRyb2wsCi0JCQludWxsCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzcGlubmVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIGxhYmVsJ3MgdGV4dAotCSAqIEBwYXJhbSBudW1iZXJIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHNob3duIHdoZW4gdGhlIGhvbGRlciBoYXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbWluaW11bVZhbHVlIFRoZSBtaW5pbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSBtYXhpbXVtVmFsdWUgVGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgd2lkZ2V0IHRvIGJlIHBsYWNlZCB0byB0aGUgcmlnaHQgb2Ygc3Bpbm5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHNwaW5uZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlNwaW5uZXI8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNwaW5uZXIgYnVpbGRMYWJlbGVkU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluaW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heGltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IHRoaXMuYnVpbGRTcGlubmVyKAotCQkJcGFyZW50LAotCQkJbnVtYmVySG9sZGVyLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJbWluaW11bVZhbHVlLAotCQkJbWF4aW11bVZhbHVlCi0JCSk7Ci0KLQkJYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJcGFyZW50LAotCQkJbGFiZWxUZXh0LAotCQkJKHNwaW5uZXIuZ2V0UGFyZW50KCkgIT0gcGFyZW50KSA/IHNwaW5uZXIuZ2V0UGFyZW50KCkgOiBzcGlubmVyLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIHNwaW5uZXIuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCi0JCXJldHVybiBzcGlubmVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc3Bpbm5lci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKiBAcGFyYW0gbnVtYmVySG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGludGVnZXIgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSBzaG93biB3aGVuIHRoZSBob2xkZXIgaGFzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIG1pbmltdW1WYWx1ZSBUaGUgbWluaW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKLQkgKiBAcGFyYW0gbWF4aW11bVZhbHVlIFRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHNwaW5uZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlNwaW5uZXI8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNwaW5uZXIgYnVpbGRMYWJlbGVkU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluaW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heGltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRTcGlubmVyKAotCQkJcGFyZW50LAotCQkJbGFiZWxUZXh0LAotCQkJbnVtYmVySG9sZGVyLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJMCwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc3Bpbm5lci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKiBAcGFyYW0gbnVtYmVySG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGludGVnZXIgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSBzaG93biB3aGVuIHRoZSBob2xkZXIgaGFzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgc3Bpbm5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+U3Bpbm5lcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lciBidWlsZExhYmVsZWRTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExhYmVsZWRTcGlubmVyKAotCQkJcGFyZW50LAotCQkJbGFiZWxUZXh0LAotCQkJbnVtYmVySG9sZGVyLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJMCwKLQkJCUludGVnZXIuTUFYX1ZBTFVFLAotCQkJbnVsbCwKLQkJCW51bGwKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRMYWJlbGVkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZFRleHQoY29udGFpbmVyLCBsYWJlbFRleHQsIHRleHRIb2xkZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgZmllbGQncyBsYWJlbAotCSAqIEBwYXJhbSByaWdodENvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIGJlIHBsYWNlZCB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQKLQkgKiBmaWVsZAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRMYWJlbGVkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb21wb25lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5idWlsZFRleHQoY29udGFpbmVyKTsKLQkJVGV4dEZpZWxkTW9kZWxBZGFwdGVyLmFkYXB0KHRleHRIb2xkZXIsIHRleHQpOwotCi0JCXRoaXMuYnVpbGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJdGV4dCwKLQkJCXJpZ2h0Q29tcG9uZW50LAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0SG9sZGVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGlzdCBhbmQgbm90aWZ5IHRoZSBnaXZlbiBzZWxlY3Rpb24gaG9sZGVyIHdoZW4gdGhlCi0JICogc2VsZWN0aW9uIGNoYW5nZXMuIElmIHRoZSBzZWxlY3Rpb24gY291bnQgaXMgZGlmZmVyZW50IHRoYW4gb25lIHRoYW4gdGhlCi0JICogaG9sZGVyIHdpbGwgcmVjZWl2ZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkxpc3Q8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgYnVpbGRMaXN0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0KGNvbnRhaW5lciwgKFN0cmluZykgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsaXN0IGFuZCBub3RpZnkgdGhlIGdpdmVuIHNlbGVjdGlvbiBob2xkZXIgd2hlbiB0aGUKLQkgKiBzZWxlY3Rpb24gY2hhbmdlcy4gSWYgdGhlIHNlbGVjdGlvbiBjb3VudCBpcyBkaWZmZXJlbnQgdGhhbiBvbmUgdGhhbiB0aGUKLQkgKiBob2xkZXIgd2lsbCByZWNlaXZlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyByYWRpbyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkxpc3Q8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgYnVpbGRMaXN0KENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QoCi0JCQljb250YWluZXIsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKSwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGlzdCBhbmQgbm90aWZ5IHRoZSBnaXZlbiBzZWxlY3Rpb24gaG9sZGVyIHdoZW4gdGhlCi0JICogc2VsZWN0aW9uIGNoYW5nZXMuIElmIHRoZSBzZWxlY3Rpb24gY291bnQgaXMgZGlmZmVyZW50IHRoYW4gb25lIHRoYW4gdGhlCi0JICogaG9sZGVyIHdpbGwgcmVjZWl2ZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc2VsZWN0aW9uSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHVuaXF1ZSBzZWxlY3RlZCBpdGVtCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5MaXN0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0IGJ1aWxkTGlzdChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHNlbGVjdGlvbkhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdChjb250YWluZXIsIHNlbGVjdGlvbkhvbGRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsaXN0IGFuZCBub3RpZnkgdGhlIGdpdmVuIHNlbGVjdGlvbiBob2xkZXIgd2hlbiB0aGUKLQkgKiBzZWxlY3Rpb24gY2hhbmdlcy4gSWYgdGhlIHNlbGVjdGlvbiBjb3VudCBpcyBkaWZmZXJlbnQgdGhhbiBvbmUgdGhhbiB0aGUKLQkgKiBob2xkZXIgd2lsbCByZWNlaXZlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzZWxlY3Rpb25Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdW5pcXVlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgcmFkaW8gYnV0dG9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5MaXN0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0IGJ1aWxkTGlzdChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHNlbGVjdGlvbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUxpc3QgbGlzdCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVMaXN0KAotCQkJY29udGFpbmVyLAotCQkJU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5NVUxUSQotCQkpOwotCi0JCWxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIoYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25Ib2xkZXIpKTsKLQkJbGlzdC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdGhpcy53aWRnZXRzLmFkZChsaXN0KTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWhlbHBTeXN0ZW0oKS5zZXRIZWxwKGxpc3QsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxhYmxlIGV4cGFuZGluZyBvbiBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBidWlsZE11bHRpTGluZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0KLQkJdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZU11bHRpTGluZUxhYmVsKGNvbnRhaW5lciwgbGFiZWxUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldCB0aGF0IGhhcyBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTXVsdGlMaW5lVGV4dChjb250YWluZXIsIDMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IHRoYXQgaGFzIG11bHRpcGxlIGxpbmVzLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaW5lQ291bnQgVGhlIG51bWJlciBvZiBsaW5lcyB0aGUgdGV4dCBhcmVhIHNob3VsZCBkaXNwbGF5Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRleHQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZUNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSAgID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIGxpbmVDb3VudDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRleHQsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldCB0aGF0IGhhcyBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGV4dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZE11bHRpTGluZVRleHQoY29udGFpbmVyLCAzLCBoZWxwSWQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IHRoYXQgaGFzIG11bHRpcGxlIGxpbmVzLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkTXVsdGlMaW5lVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IHRoYXQgaGFzIG11bHRpcGxlIGxpbmVzLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBsaW5lQ291bnQgVGhlIG51bWJlciBvZiBsaW5lcyB0aGUgdGV4dCBhcmVhIHNob3VsZCBkaXNwbGF5Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZUNvdW50KSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlciwgbGluZUNvdW50LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldCB0aGF0IGhhcyBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGV4dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRleHQgdGV4dCA9IHRoaXMuYnVpbGRNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgbGluZUNvdW50LCBoZWxwSWQpOwotCQlUZXh0RmllbGRNb2RlbEFkYXB0ZXIuYWRhcHQodGV4dEhvbGRlciwgdGV4dCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IHRoYXQgaGFzIG11bHRpcGxlIGxpbmVzLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlciwgMywgaGVscElkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhZ2VCb29rPC9jb2RlPiBhbmQgc2V0IHRoZSBwcm9wZXIgbGF5b3V0IGFuZCBsYXlvdXQKLQkgKiBkYXRhLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+UGFnZUJvb2s8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFBhZ2VCb29rIGJ1aWxkUGFnZUJvb2soQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVBhZ2VCb29rIHBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmV0dXJuIHBhZ2VCb29rOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHdpdGhvdXQgc3BlY2lmeWluZyBhbnkgbGF5b3V0IG1hbmFnZXIuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgb2YgdGhlIG5ldyBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdXNpbmcgdGhlIGdpdmVuIGxheW91dCBtYW5hZ2VyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9mIHRoZSBuZXcgY29udGFpbmVyCi0JICogQHBhcmFtIGxheW91dCBUaGUgbGF5b3V0IG1hbmFnZXIgb2YgdGhlIG5ldyBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYnVpbGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIExheW91dCBsYXlvdXQpIHsKLQotCQljb250YWluZXIgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGNvbnRhaW5lcik7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYnVpbGRQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlUGFzc3dvcmRUZXh0KGNvbnRhaW5lcik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJVGV4dEZpZWxkTW9kZWxBZGFwdGVyLmFkYXB0KHRleHRIb2xkZXIsIHRleHQpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcHVzaCBidXR0b24gdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJ1dHRvbkFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGJ1aWxkUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGJ1dHRvbkFjdGlvbikgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkUHVzaEJ1dHRvbihwYXJlbnQsIGJ1dHRvblRleHQsIG51bGwsIGJ1dHRvbkFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBwdXNoIGJ1dHRvbiB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyByYWRpbyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGJ1aWxkUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgYnV0dG9uQWN0aW9uKSB7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVQdXNoQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCk7Ci0KLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU1dUVXRpbC5hc3luY0V4ZWMoYnV0dG9uQWN0aW9uKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJaGVscFN5c3RlbSgpLnNldEhlbHAoYnV0dG9uLCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHJhZGlvIGJ1dHRvbiB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGJ1aWxkUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZFJhZGlvQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCwgYm9vbGVhbkhvbGRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGVjayBib3ggdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0aW9uIHN0YXRlCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHJhZGlvIGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYnVpbGRSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkVG9nZ2xlQnV0dG9uKAotCQkJcGFyZW50LAotCQkJYnV0dG9uVGV4dCwKLQkJCWJvb2xlYW5Ib2xkZXIsCi0JCQloZWxwSWQsCi0JCQlTV1QuUkFESU8KLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKLQkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBidWlsZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2Ygc2VjdGlvbiB0byBjcmVhdGUKLQkgKiBAcGFyYW0gZXhwYW5kZWRTdGF0ZUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHRoYXQgd2lsbCBkaWN0YXRlCi0JICogd2hlbiB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgYnVpbGRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZFNlY3Rpb24oY29udGFpbmVyLCBzZWN0aW9uVGV4dCwgbnVsbCwgdHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBzZWN0aW9uJ3MgZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBidWlsZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJc2VjdGlvblRleHQsCi0JCQlkZXNjcmlwdGlvbiwKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBzZWN0aW9uJ3MgZGVzY3JpcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIHdhcyBwcm92aWRlcgotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHNlY3Rpb24gdG8gY3JlYXRlCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGJ1aWxkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpIHsKLQotCQlTZWN0aW9uIHNlY3Rpb24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlU2VjdGlvbihjb250YWluZXIsIHR5cGUgfCAoKGRlc2NyaXB0aW9uICE9IG51bGwpID8gU2VjdGlvbi5ERVNDUklQVElPTiA6IFNXVC5OVUxMKSk7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXNlY3Rpb24uc2V0VGV4dChzZWN0aW9uVGV4dCk7Ci0JCXNlY3Rpb24ubWFyZ2luV2lkdGggID0gMDsKLQkJc2VjdGlvbi5tYXJnaW5IZWlnaHQgPSAwOwotCi0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJfQotCi0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gdGhpcy5idWlsZFN1YlBhbmUoc2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KHN1YlBhbmUpOwotCi0JCXJldHVybiBzdWJQYW5lOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcihmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHNlbGVjdGlvbkhvbGRlcikgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgZS53aWRnZXQ7Ci0JCQkJU3RyaW5nW10gc2VsZWN0ZWRJdGVtcyA9IGxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKChzZWxlY3RlZEl0ZW1zID09IG51bGwpIHx8IChzZWxlY3RlZEl0ZW1zLmxlbmd0aCAhPSAxKSkgewotCQkJCQlzZWxlY3Rpb25Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZWxlY3Rpb25Ib2xkZXIuc2V0VmFsdWUoc2VsZWN0ZWRJdGVtc1swXSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxheW91dCByZXNwb25zaWJsZSB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoZSBzcGFjZXIgY3JlYXRlZAotCSAqIGZvciB0aGUgcmlnaHQgY29udHJvbCB3aGVuIG5vbmUgd2FzIGdpdmVuLiBUaGUgc3BhY2VyIGhlbHBzIHRvIGFsaWduIGFsbAotCSAqIHRoZSByaWdodCBjb250cm9scy4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIExheW91dCBidWlsZFNwYWNlckxheW91dCgpIHsKLQkJcmV0dXJuIG5ldyBMYXlvdXQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aEhpbnQsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodEhpbnQsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0KLQkJCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoSGludCwgaGVpZ2h0SGludCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQkJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGNvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJY29tcG9zaXRlLnNldEJvdW5kcygwLCAwLCBkYXRhLndpZHRoSGludCwgZGF0YS5oZWlnaHRIaW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNwaW5uZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIG51bWJlckhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgc2hvd24gd2hlbiB0aGUgaG9sZGVyIGhhcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+U3Bpbm5lcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lciBidWlsZFNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRTcGlubmVyKAotCQkJcGFyZW50LAotCQkJbnVtYmVySG9sZGVyLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJMCwKLQkJCUludGVnZXIuTUFYX1ZBTFVFCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzcGlubmVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBudW1iZXJIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHNob3duIHdoZW4gdGhlIGhvbGRlciBoYXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbWluaW11bVZhbHVlIFRoZSBtaW5pbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSBtYXhpbXVtVmFsdWUgVGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5TcGlubmVyPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTcGlubmVyIGJ1aWxkU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5pbXVtVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhpbXVtVmFsdWUpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZFNwaW5uZXIoCi0JCQlwYXJlbnQsCi0JCQludW1iZXJIb2xkZXIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQltaW5pbXVtVmFsdWUsCi0JCQltYXhpbXVtVmFsdWUsCi0JCQludWxsCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzcGlubmVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBudW1iZXJIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHNob3duIHdoZW4gdGhlIGhvbGRlciBoYXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbWluaW11bVZhbHVlIFRoZSBtaW5pbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSBtYXhpbXVtVmFsdWUgVGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+U3Bpbm5lcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lciBidWlsZFNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluaW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4aW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVNwaW5uZXIocGFyZW50KTsKLQkJc3Bpbm5lci5zZXRNaW5pbXVtKG1pbmltdW1WYWx1ZSk7Ci0JCXNwaW5uZXIuc2V0TWF4aW11bShtYXhpbXVtVmFsdWUpOwotCQlzcGlubmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORykpOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQobnVtYmVySG9sZGVyLCBzcGlubmVyLCBkZWZhdWx0VmFsdWUpOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJaGVscFN5c3RlbSgpLnNldEhlbHAoc3Bpbm5lciwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiBzcGlubmVyOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlBYnN0cmFjdFBhbmUudGhpcy5zdWJqZWN0Q2hhbmdlZCgoVCkgZS5nZXRPbGRWYWx1ZSgpLCAoVCkgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkU3ViUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3ViUGFuZShjb250YWluZXIsIDApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRvcE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgYXQgdGhlIHRvcCBvZiB0aGUgcGFuZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkU3ViUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgdG9wTWFyZ2luKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3ViUGFuZShjb250YWluZXIsIHRvcE1hcmdpbiwgMCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdG9wTWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIGxlZnRNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIHRvIHRoZSBsZWZ0IG9mIHRoZSBwYW5lCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYnVpbGRTdWJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcE1hcmdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdE1hcmdpbikgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkU3ViUGFuZShjb250YWluZXIsIHRvcE1hcmdpbiwgbGVmdE1hcmdpbiwgMCwgMCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZSwgdGhlIG5ldyB3aWRnZXQKLQkgKiB3aWxsIGhhdmUgaXRzIGxheW91dCBhbmQgbGF5b3V0IGRhdGEgYWxyZWFkeSBpbml0aWFsaXplZCwgdGhlIGxheW91dCB3aWxsCi0JICogYmUgYSA8Y29kZT5HcmlkTGF5b3V0PC9jb2RlPiB3aXRoIDEgY29sdW1uLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0b3BNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSB0b3Agb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gbGVmdE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgdG8gdGhlIGxlZnQgb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gYm90dG9tTWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIHJpZ2h0TWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCB0byB0aGUgcmlnaHQgb2YgdGhlIHBhbmUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBidWlsZFN1YlBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wTWFyZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0TWFyZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBib3R0b21NYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJpZ2h0TWFyZ2luKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRTdWJQYW5lKAotCQkJY29udGFpbmVyLAotCQkJMSwKLQkJCXRvcE1hcmdpbiwKLQkJCWxlZnRNYXJnaW4sCi0JCQlib3R0b21NYXJnaW4sCi0JCQlyaWdodE1hcmdpbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZSwgdGhlIG5ldyB3aWRnZXQKLQkgKiB3aWxsIGhhdmUgaXRzIGxheW91dCBhbmQgbGF5b3V0IGRhdGEgYWxyZWFkeSBpbml0aWFsaXplZCwgdGhlIGxheW91dCB3aWxsCi0JICogYmUgYSA8Y29kZT5HcmlkTGF5b3V0PC9jb2RlPiB3aXRoIDEgY29sdW1uLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0b3BNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSB0b3Agb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gbGVmdE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgdG8gdGhlIGxlZnQgb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gYm90dG9tTWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIHJpZ2h0TWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCB0byB0aGUgcmlnaHQgb2YgdGhlIHBhbmUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBidWlsZFN1YlBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcE1hcmdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdE1hcmdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm90dG9tTWFyZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByaWdodE1hcmdpbikgewotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoY29sdW1uQ291bnQsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCAgPSAwOwotCQlsYXlvdXQubWFyZ2luVG9wICAgID0gdG9wTWFyZ2luOwotCQlsYXlvdXQubWFyZ2luTGVmdCAgID0gbGVmdE1hcmdpbjsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IGJvdHRvbU1hcmdpbjsKLQkJbGF5b3V0Lm1hcmdpblJpZ2h0ICA9IHJpZ2h0TWFyZ2luOwotCi0JCWNvbnRhaW5lciA9IHRoaXMuYnVpbGRQYW5lKGNvbnRhaW5lciwgbGF5b3V0KTsKLQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgd2hpY2ggY2FuIGJlIHR5cGVkIGNhc3QgZGlyZWN0bHkgYXMgYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGJ1aWxkU3ViU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkQ29sbGFwc2FibGVTdWJTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJc2VjdGlvblRleHQsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRhYmxlLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGFibGU8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRhYmxlIGJ1aWxkVGFibGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gdGhpcy5idWlsZFRhYmxlKGNvbnRhaW5lciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0YWJsZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSB0YWJsZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGFibGU8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRhYmxlIGJ1aWxkVGFibGUoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVGFibGUoY29udGFpbmVyLCBzdHlsZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0YWJsZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0YWJsZSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGhlbHAgSUQgaXMgcmVxdWlyZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRhYmxlPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUYWJsZSBidWlsZFRhYmxlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUYWJsZSB0YWJsZSA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVUYWJsZShjb250YWluZXIsIHN0eWxlKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhICAgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IHRhYmxlLmdldEl0ZW1IZWlnaHQoKSAqIDQ7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl0aGlzLndpZGdldHMuYWRkKHRhYmxlKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRhYmxlLCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdGFibGUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRhYmxlIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaGVscCBJRCBpcyByZXF1aXJlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGFibGU8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRhYmxlIGJ1aWxkVGFibGUoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmJ1aWxkVGFibGUoCi0JCQljb250YWluZXIsCi0JCQlTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEksCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkVGV4dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlVGV4dChjb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRleHQgdGV4dCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVUZXh0KGNvbnRhaW5lcik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQloZWxwU3lzdGVtKCkuc2V0SGVscCh0ZXh0LCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBidWlsZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRleHQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGJ1aWxkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlVGV4dChjb250YWluZXIpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCVRleHRGaWVsZE1vZGVsQWRhcHRlci5hZGFwdCh0ZXh0SG9sZGVyLCB0ZXh0KTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRleHQsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB3aXRoIGEgdGl0bGVkIGJvcmRlci4KLQkgKgotCSAqIEBwYXJhbSB0aXRsZSBUaGUgdGV4dCBvZiB0aGUgdGl0bGVkIGJvcmRlcgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gd2l0aCBhIHRpdGxlZCBib3JkZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgR3JvdXAgYnVpbGRUaXRsZWRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyB0aXRsZSkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRpdGxlZFBhbmUoY29udGFpbmVyLCB0aXRsZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgd2l0aCBhIHRpdGxlZCBib3JkZXIuCi0JICoKLQkgKiBAcGFyYW0gdGl0bGUgVGhlIHRleHQgb2YgdGhlIHRpdGxlZCBib3JkZXIKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGdyb3VwCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHdpdGggYSB0aXRsZWQgYm9yZGVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEdyb3VwIGJ1aWxkVGl0bGVkUGFuZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUdyb3VwIGdyb3VwID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUdyb3VwKGNvbnRhaW5lciwgdGl0bGUpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCAgPSAwOwotCQlsYXlvdXQubWFyZ2luVG9wICAgID0gNTsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgICA9IDU7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSA1OwotCQlsYXlvdXQubWFyZ2luUmlnaHQgID0gNTsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQloZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRvZ2dsZSBidXR0b24gKHJhZGlvIGJ1dHRvbiBvciBjaGVjayBib3gpIHVzaW5nIHRoZSBnaXZlbgotCSAqIGluZm9ybWF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0aW9uIHN0YXRlCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQnV0dG9uIGJ1aWxkVG9nZ2xlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b2dnbGVCdXR0b25UeXBlKSB7Ci0KLQkJQnV0dG9uIGJ1dHRvbjsKLQotCQlpZiAodG9nZ2xlQnV0dG9uVHlwZSA9PSBTV1QuUFVTSCkgewotCQkJYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVB1c2hCdXR0b24ocGFyZW50LCBidXR0b25UZXh0KTsKLQkJfQotCQllbHNlIGlmICh0b2dnbGVCdXR0b25UeXBlID09IFNXVC5SQURJTykgewotCQkJYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVJhZGlvQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCk7Ci0JCX0KLQkJZWxzZSBpZiAodG9nZ2xlQnV0dG9uVHlwZSA9PSBTV1QuQ0hFQ0spIHsKLQkJCWJ1dHRvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDaGVja0JveChwYXJlbnQsIGJ1dHRvblRleHQpOwotCQl9Ci0JCWVsc2UgewotCQkJYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUJ1dHRvbihwYXJlbnQsIGJ1dHRvblRleHQpOwotCQl9Ci0KLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlCb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyLmFkYXB0KGJvb2xlYW5Ib2xkZXIsIGJ1dHRvbik7Ci0JCXRoaXMud2lkZ2V0cy5hZGQoYnV0dG9uKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWhlbHBTeXN0ZW0oKS5zZXRIZWxwKGJ1dHRvbiwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGVjayBib3ggdGhhdCBjYW4gaGF2ZSAzIHNlbGVjdGlvbiBzdGF0ZXMgKHNlbGVjdGVkLAotCSAqIHVuc2VsZWN0ZWQgYW5kIHBhcnRpYWxseSBzZWxlY3RlZC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdmFsdWUgd2hlcmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBtZWFucyBwYXJ0aWFsbHkgc2VsZWN0ZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRyaVN0YXRlQ2hlY2tCb3g8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyaVN0YXRlQ2hlY2tCb3ggYnVpbGRUcmlTdGF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmlTdGF0ZUNoZWNrQm94KHBhcmVudCwgdGV4dCwgYm9vbGVhbkhvbGRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGVjayBib3ggdGhhdCBjYW4gaGF2ZSAzIHNlbGVjdGlvbiBzdGF0ZXMgKHNlbGVjdGVkLAotCSAqIHVuc2VsZWN0ZWQgYW5kIHBhcnRpYWxseSBzZWxlY3RlZC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdmFsdWUgd2hlcmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBtZWFucyBwYXJ0aWFsbHkgc2VsZWN0ZWQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgY2hlY2sgYm94Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UcmlTdGF0ZUNoZWNrQm94PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmlTdGF0ZUNoZWNrQm94IGJ1aWxkVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveCgKLQkJCXBhcmVudCwKLQkJCXRleHQsCi0JCQl0aGlzLmdldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCi0JCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlib29sZWFuSG9sZGVyLAotCQkJY2hlY2tCb3gKLQkJKTsKLQotCQl0aGlzLndpZGdldHMuYWRkKGNoZWNrQm94LmdldENoZWNrQm94KCkpOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJaGVscFN5c3RlbSgpLnNldEhlbHAoY2hlY2tCb3guZ2V0Q2hlY2tCb3goKSwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCB0aGF0IGNhbiBoYXZlIDMgc2VsZWN0aW9uIHN0YXRlcyAoc2VsZWN0ZWQsCi0JICogdW5zZWxlY3RlZCBhbmQgcGFydGlhbGx5IHNlbGVjdGVkLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB2YWx1ZSB3aGVyZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIG1lYW5zIHBhcnRpYWxseSBzZWxlY3RlZAotCSAqIEBwYXJhbSBzdHJpbmdIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3RyaW5nIHRvIHB1dCBpbiBwYXJlbnRoZXNpcyBhZnRlcgotCSAqIHRoZSBjaGVjayBib3gncyB0ZXh0IHdoZW4gaXQgaXMgcGFydGlhbGx5IHNlbGVjdGVkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UcmlTdGF0ZUNoZWNrQm94PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmlTdGF0ZUNoZWNrQm94IGJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdIb2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5idWlsZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCXBhcmVudCwKLQkJCXRleHQsCi0JCQlib29sZWFuSG9sZGVyLAotCQkJc3RyaW5nSG9sZGVyLAotCQkJbnVsbAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hlY2sgYm94IHRoYXQgY2FuIGhhdmUgMyBzZWxlY3Rpb24gc3RhdGVzIChzZWxlY3RlZCwKLQkgKiB1bnNlbGVjdGVkIGFuZCBwYXJ0aWFsbHkgc2VsZWN0ZWQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHZhbHVlIHdoZXJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogbWVhbnMgcGFydGlhbGx5IHNlbGVjdGVkCi0JICogQHBhcmFtIHN0cmluZ0hvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdHJpbmcgdG8gcHV0IGluIHBhcmVudGhlc2lzIGFmdGVyCi0JICogdGhlIGNoZWNrIGJveCdzIHRleHQgd2hlbiBpdCBpcyBwYXJ0aWFsbHkgc2VsZWN0ZWQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgY2hlY2sgYm94Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UcmlTdGF0ZUNoZWNrQm94PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmlTdGF0ZUNoZWNrQm94IGJ1aWxkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSB0aGlzLmJ1aWxkVHJpU3RhdGVDaGVja0JveCgKLQkJCXBhcmVudCwKLQkJCXRleHQsCi0JCQlib29sZWFuSG9sZGVyLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcigKLQkJCW5ldyBMYWJlbGVkQnV0dG9uKGNoZWNrQm94LmdldENoZWNrQm94KCkpLAotCQkJc3RyaW5nSG9sZGVyCi0JCSk7Ci0KLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCS8qKgotCSAqIFVuaW5zdGFsbHMgYW55IGxpc3RlbmVycyBmcm9tIHRoZSBzdWJqZWN0IGluIG9yZGVyIHRvIHN0b3AgYmVpbmcgbm90aWZpZWQKLQkgKiBmb3IgY2hhbmdlcyBtYWRlIG91dHNpZGUgb2YgdGhpcyBwYW5lcy4KLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQotCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgIiAgIC0+ZGlzZW5nYWdlTGlzdGVuZXJzKCkiKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCXRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyCi0JCSk7Ci0KLQkJdGhpcy5kaXNlbmdhZ2VMaXN0ZW5lcnModGhpcy5zdWJqZWN0KCkpOwotCi0JCWZvciAoQWJzdHJhY3RQYW5lPD8+IHN1YlBhbmUgOiB0aGlzLnN1YlBhbmVzKSB7Ci0JCQlzdWJQYW5lLmRpc2VuZ2FnZUxpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbnkgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyBmcm9tIHRoZSBnaXZlbiBzdWJqZWN0LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3QgVGhlIG9sZCBzdWJqZWN0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoVCBzdWJqZWN0KSB7Ci0JCWlmIChzdWJqZWN0ICE9IG51bGwpIHsKLS8vCQkJdGhpcy5sb2coIiAgIC0+ZGlzZW5nYWdlTGlzdGVuZXJzKCkgZnJvbSAiICsgc3ViamVjdCk7Ci0KLQkJCWZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHRoaXMucHJvcGVydHlOYW1lcygpKSB7Ci0JCQkJc3ViamVjdC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgdGhpcy5hc3BlY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIHBhbmUgaXMgc2hvdWxkIGRpc3Bvc2UgaXRzZWxmLgotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKCF0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAiZGlzcG9zZSgpIik7Ci0JCQl0aGlzLnBlcmZvcm1EaXNwb3NlKCk7Ci0JCQl0aGlzLmRpc2VuZ2FnZUxpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVxdWVzdHMgdGhpcyBwYW5lIHRvIGRpc3Bvc2UgaXRzZWxmLgotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9EaXNwb3NlKCkgewotCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgIiAgIC0+ZG9EaXNwb3NlKCkiKTsKLQotCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lci5kaXNwb3NlKCk7Ci0JCXRoaXMucmlnaHRDb250cm9sQWxpZ25lci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogUmVxdWVzdHMgdGhpcyBwYW5lIHRvIHBvcHVsYXRlIGl0cyB3aWRnZXRzIHdpdGggdGhlIHN1YmplY3QncyB2YWx1ZXMuCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgIiAgIC0+ZG9Qb3B1bGF0ZSgpIik7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgZW5hYmxlbWVudCBzdGF0ZSBvZiB0aGUgY2hpbGRyZW4gPGNvZGU+Q29udHJvbDwvY29kZT5zLgotCSAqCi0JICogQHBhcmFtIGVuYWJsZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZW5hYmxlIHRoZSB3aWRnZXRzIG9yIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIHRvIGRpc2FibGUgdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgdm9pZCBlbmFibGVDaGlsZHJlbihib29sZWFuIGVuYWJsZWQpIHsKLQotCQkvLyBPbmx5IHVwZGF0ZSB0aGUgZW5hYmxlbWVudCBzdGF0ZSBvZiB0aGUgY2hpbGQgd2lkZ2V0cyBpZiB0aGlzIHBhbmUKLQkJLy8gaGFzIGl0cyBlbmFibGVtZW50IG1hbmFnZWQgYnkgZW5hYmxlV2lkZ2V0cygpIChpLmUuIG5vdCBkb25lIG1hbnVhbGx5KQotCQlpZiAodGhpcy5pc0VuYWJsZW1lbnRNYW5hZ2VkKGNvbnRhaW5lcikpIHsKLQotCQkJZm9yIChDb250cm9sIGNvbnRyb2wgOiB0aGlzLndpZGdldHMpIHsKLQotCQkJCS8vIE1ha2Ugc3VyZSB0byBjaGVjayBpZiB0aGUgY2hpbGQgY29udHJvbCBkb2Vzbid0IGhhdmUgaXRzCi0JCQkJLy8gZW5hYmxlbWVudCBzdGF0ZSBtYW51YWxseSBtYW5hZ2VkCi0JCQkJaWYgKHRoaXMuaXNFbmFibGVtZW50TWFuYWdlZChjb250cm9sKSkgewotCQkJCQljb250cm9sLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgZW5hYmxlbWVudCBzdGF0ZSBvZiB0aGUgd2lkZ2V0cyBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gZW5hYmxlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBlbmFibGUgdGhlIHdpZGdldHMgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogdG8gZGlzYWJsZSB0aGVtCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKLQotCQlpZiAoIWNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuZW5hYmxlQ2hpbGRyZW4oZW5hYmxlZCk7Ci0KLQkJCWZvciAoQWJzdHJhY3RQYW5lPD8+IHN1YlBhbmUgOiB0aGlzLnN1YlBhbmVzKSB7Ci0JCQkJaWYgKHRoaXMuaXNQYW5lRW5hYmxlbWVudE1hbmFnZWQoc3ViUGFuZSkpIHsKLQkJCQkJc3ViUGFuZS5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluc3RhbGxzIHRoZSBsaXN0ZW5lcnMgb24gdGhlIHN1YmplY3QgaW4gb3JkZXIgdG8gYmUgbm90aWZpZWQgZnJvbSBjaGFuZ2VzCi0JICogbWFkZSBvdXRzaWRlIG9mIHRoaXMgcGFuZXMgYW5kIG5vdGlmaWVzIHRoZSBzdWItcGFuZXMgdG8gZG8gdGhlIHNhbWUuCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0KLQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICIgICAtPmVuZ2FnZUxpc3RlbmVycygpIik7Ci0KLQkJdGhpcy5lbmdhZ2VTdWJqZWN0SG9sZGVyKCk7Ci0JCXRoaXMuZW5nYWdlTGlzdGVuZXJzKHRoaXMuc3ViamVjdCgpKTsKLQotCQlmb3IgKEFic3RyYWN0UGFuZTw/PiBzdWJQYW5lIDogdGhpcy5zdWJQYW5lcykgewotCQkJc3ViUGFuZS5lbmdhZ2VMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRPRE8KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoVCBzdWJqZWN0KSB7Ci0JCWlmIChzdWJqZWN0ICE9IG51bGwpIHsKLQotLy8JCQl0aGlzLmxvZygiICAgLT5lbmdhZ2VMaXN0ZW5lcnMoKSBvbiAiICsgc3ViamVjdCk7Ci0KLQkJCWZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHRoaXMucHJvcGVydHlOYW1lcygpKSB7Ci0JCQkJc3ViamVjdC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgdGhpcy5hc3BlY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5nYWdlU3ViamVjdEhvbGRlcigpIHsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQl0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lcgotCQkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1haW4gPGNvZGU+Q29udHJvbDwvY29kZT4gb2YgdGhpcyBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgbWFpbiBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWJqZWN0IGhvbGRlciB1c2VkIGJ5IHRoaXMgcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxUPiBnZXRTdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5zdWJqZWN0SG9sZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSB3aWRnZXRzLgotCSAqCi0JICogQHJldHVybiBUaGUgZmFjdG9yeSB1c2VkIGJ5IHRoaXMgcGFuZSB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgV2lkZ2V0RmFjdG9yeSBnZXRXaWRnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy53aWRnZXRGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcmdpbiB0YWtlbiBieSBhIGdyb3VwIGJveCwgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBwaXhlbCB0aGUKLQkgKiBncm91cCBib3ggYm9yZGVyIGFuZCBpdHMgbWFyZ2luIHRha2VzIGJlZm9yZSBkaXNwbGF5aW5nIGl0cyB3aWRnZXRzIHBsdXMKLQkgKiA1IHBpeGVscyBzaW5jZSB0aGUgd2lkZ2V0cyBpbnNpZGUgb2YgdGhlIGdyb3VwIGJveCBhbmQgdGhlIGJvcmRlciBzaG91bGQKLQkgKiBoYXZlIHRoYXQgZXh0cmEgNSBwaXhlbHMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB3aWR0aCB0YWtlbiBieSB0aGUgZ3JvdXAgYm94IGJvcmRlciB3aXRoIGl0cyBtYXJnaW4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGdyb3VwQm94TWFyZ2luKCkgewotCQlHcm91cCBncm91cCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVHcm91cChTV1RVdGlsLmdldFNoZWxsKCksICIiKTsKLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBncm91cC5nZXRDbGllbnRBcmVhKCk7Ci0JCWdyb3VwLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIGNsaWVudEFyZWEueCArIDU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGVscHMgc3lzdGVtLgotCSAqCi0JICogQHJldHVybiBUaGUgcGxhdGZvcm0ncyBoZWxwIHN5c3RlbQotCSAqCi0JICogQGNhdGVnb3J5IEhlbHBlcgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyA8Y29kZT5BYnN0cmFjdFN1YmplY3RQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBjYXRlZ29yeSBJbml0aWFsaXphdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoaXMgcGFuZSB3aXRoIHRoZSBwYXJlbnQgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZQotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgcGFuZTsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBJbml0aWFsaXphdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgewotCi0JCS8vIFJlZ2lzdGVyIHRoaXMgcGFuZSB3aXRoIHRoZSBwYXJlbnQgcGFuZSwgaXQgd2lsbCBjYWxsIHRoZSBtZXRob2RzCi0JCS8vIGF1dG9tYXRpY2FsbHkgKGVuZ2FnZUxpc3RlbmVycygpLCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSwgcG9wdWxhdGUoKSwKLQkJLy8gZGlzcG9zZSgpLCBldGMpCi0JCXBhcmVudFBhbmUucmVnaXN0ZXJTdWJQYW5lKHRoaXMpOwotCi0JCS8vIEFsaWduIHRoZSBsZWZ0IGFuZCByaWdodCBjb250cm9scyB3aXRoIHRoZSBjb250cm9scyBmcm9tIHRoZSBwYXJlbnQKLQkJLy8gcGFuZQotCQlpZiAoYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgewotCQkJcGFyZW50UGFuZS5sZWZ0Q29udHJvbEFsaWduZXIgLmFkZCh0aGlzLmxlZnRDb250cm9sQWxpZ25lcik7Ci0JCQlwYXJlbnRQYW5lLnJpZ2h0Q29udHJvbEFsaWduZXIuYWRkKHRoaXMucmlnaHRDb250cm9sQWxpZ25lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIDxjb2RlPkFic3RyYWN0U3ViamVjdFBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICoKLQkgKiBAY2F0ZWdvcnkgSW5pdGlhbGl6YXRpb24KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KQotCXsKLQkJQXNzZXJ0LmlzTm90TnVsbChzdWJqZWN0SG9sZGVyLCAiVGhlIHN1YmplY3QgaG9sZGVyIGNhbm5vdCBiZSBudWxsIik7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyICAgICAgICAgPSAoUHJvcGVydHlWYWx1ZU1vZGVsPFQ+KSBzdWJqZWN0SG9sZGVyOwotCQl0aGlzLndpZGdldEZhY3RvcnkgICAgICAgICA9IHdpZGdldEZhY3Rvcnk7Ci0JCXRoaXMuc3ViUGFuZXMgICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdFBhbmU8Pz4+KCk7Ci0JCXRoaXMud2lkZ2V0cyAgICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxDb250cm9sPigpOwotCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lciAgICA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIgICA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCQl0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VMaXN0ZW5lciAgPSB0aGlzLmJ1aWxkQXNwZWN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5pbnRlcm5hbFBhbmVzRm9yRW5hYmxlbWVudENvbnRyb2wgPSBuZXcgQXJyYXlMaXN0PEFic3RyYWN0UGFuZTw/Pj4oKTsKLQotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpOwotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBlbmFibGVtZW50IHN0YXRlIGlzIG1hbmFnZWQgYnkgdGhpcyBwYW5lIG9yIGlzCi0JICogbWFudWFsbHkgbWFuYWdlZC4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9sIFRoZSA8Y29kZT5Db250cm9sPC9jb2RlPiB0byB2ZXJpZnkgaG93IGl0cyBlbmFibGVtZW50IHN0YXRlCi0JICogaXMgbWFuYWdlZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGVuYWJsZW1lbnQgc3RhdGUgY2FuIGJlIGNoYW5nZWQgd2hlbgotCSAqIHtAbGluayAjZW5hYmxlV2lkZ2V0cyhib29sZWFuKX0gaXMgY2FsbGVkOyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXRzCi0JICogZW5hYmxlbWVudCBzdGF0ZSBpcyBtYW51YWxseSBjaGFuZ2VkCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFbmFibGVtZW50TWFuYWdlZChDb250cm9sIGNvbnRyb2wpIHsKLQkJcmV0dXJuIGNvbnRyb2wuZ2V0RGF0YSgiZW5hYmxlbWVudCIpICE9IEJvb2xlYW4uRkFMU0U7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBwYW5lIGhhcyBpdHMgZW5hYmxlbWVudCBzdGF0ZSBtYW5hZ2VkIGJ5IHRoaXMKLQkgKiBwYW5lLgotCSAqCi0JICogQHBhcmFtIHN1YlBhbmUgVGhlIHN1Yi1wYW5lIHRvIHZlcmlmeSBob3cgaXRzIGVuYWJsZW1lbnQgc3RhdGUgaXMgYmVpbmcKLQkgKiBtYW5hZ2VkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3ViLXBhbmUncyBlbmFibGVtZW50IHN0YXRlIGlzIG1hbmFnZWQgYnkKLQkgKiB0aGlzIHN0YXRlOyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQncyBtYW51YWxseSBtYW5hZ2VkCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFuZUVuYWJsZW1lbnRNYW5hZ2VkKEFic3RyYWN0UGFuZTw/PiBzdWJQYW5lKSB7Ci0KLQkJcmV0dXJuIC8vIFRlc3QgMTogVGhpcyBwYW5lIGlzIGJlaW5nIGF1dG9tYXRpY2FsbHkgbWFuYWdlZCBhbmQgdGhlCi0JCSAgICAgICAvLyBzdWItcGFuZSB3YXMgcmVnaXN0ZXJlZCBoYXMgYW4gaW50ZXJuYWwgcGFuZSwgd2hpY2ggbWVhbnMgaXRzCi0JCSAgICAgICAvLyBlbmFibGVtZW50IHN0YXRlIGlzIGJlaW5nIG1hbmFnZWQgYXV0b21hdGljYWxseSBhcyB3ZWxsLiBBCi0JCSAgICAgICAvLyBzdWItcGFuZSBpcyBtYW5hZ2VkIGF1dG9tYXRpY2FsbHkgb25seSB3aGVuIFBhbmVFbmFibGVyIGNoYW5nZXMKLQkJICAgICAgIC8vIHRoZSBlbmFibGVtZW50IG1hbmFnZW1lbnQgY2hlY2tzCi0JCSAgICAgICB0aGlzLmlzRW5hYmxlbWVudE1hbmFnZWQoY29udGFpbmVyKSAmJgotCQkgICAgICAgdGhpcy5pbnRlcm5hbFBhbmVzRm9yRW5hYmxlbWVudENvbnRyb2wuY29udGFpbnMoc3ViUGFuZSkgfHwKLQotCQkgICAgICAgLy8gVGVzdCAyOiBDaGVjayB0byBzZWUgaWYgdGhlIHBhbmUgaXMgYXV0b21hdGljYWxseSBtYW5hZ2VkCi0JCSAgICAgICB0aGlzLmlzRW5hYmxlbWVudE1hbmFnZWQoc3ViUGFuZS5nZXRDb250cm9sKCkpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlcgotCSAqCi0JICogQHJldHVybgotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNQb3B1bGF0aW5nKCkgewotCQlyZXR1cm4gdGhpcy5wb3B1bGF0aW5nOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIG1lc3NhZ2UgaWYgdGhlIDxjb2RlPlRyYWNpbmcuREVCVUdfTEFZT1VUPC9jb2RlPiBpcyBlbmFibGVkLgotCSAqCi0JICogQHBhcmFtIGZsYWcKLQkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbG9nZ2luZyBtZXNzYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBmbGFnLCBTdHJpbmcgbWVzc2FnZSkgewotCi0JCWlmIChUcmFjaW5nLlVJX0xBWU9VVC5lcXVhbHMoZmxhZykgJiYKLQkJICAgIFRyYWNpbmcuYm9vbGVhbkRlYnVnT3B0aW9uKFRyYWNpbmcuVUlfTEFZT1VUKSkgewotCi0JCQlDbGFzczw/PiB0aGlzQ2xhc3MgPSBnZXRDbGFzcygpOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IENsYXNzVG9vbHMuc2hvcnROYW1lRm9yKHRoaXNDbGFzcyk7Ci0KLQkJCWlmICh0aGlzQ2xhc3MuaXNBbm9ueW1vdXNDbGFzcygpKSB7Ci0JCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWUuaW5kZXhPZignJCcpKTsKLQkJCQljbGFzc05hbWUgKz0gIi0+IiArIENsYXNzVG9vbHMuc2hvcnROYW1lRm9yKHRoaXNDbGFzcy5nZXRTdXBlcmNsYXNzKCkpOwotCQkJfQotCi0JCQlUcmFjaW5nLmxvZyhjbGFzc05hbWUgKyAiOiAiICsgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIHBhbmUgaXMgc2hvdWxkIGRpc3Bvc2UgaXRzZWxmLgotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpc3Bvc2UoKSB7Ci0JCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAiICAgLT5wZXJmb3JtRGlzcG9zZSgpIik7Ci0KLQkJLy8gRGlzcG9zZSB0aGlzIHBhbmUKLQkJZG9EaXNwb3NlKCk7Ci0KLQkJLy8gQXNrIHRoZSBzdWItcGFuZXMgdG8gcGVyZm9ybSB0aGUgZGlzcG9zZSB0aGVtc2VsdmVzCi0JCWZvciAoQWJzdHJhY3RQYW5lPD8+IHN1YlBhbmUgOiB0aGlzLnN1YlBhbmVzKSB7Ci0JCQlzdWJQYW5lLnBlcmZvcm1EaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIHBhbmUgdG8gcG9wdWxhdGUgaXRzZWxmIHVzaW5nIHRoZSBzdWJqZWN0J3MgaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwb3B1bGF0ZSgpIHsKLQkJaWYgKCF0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAicG9wdWxhdGUoKSIpOwotCQkJdGhpcy5lbmdhZ2VMaXN0ZW5lcnMoKTsKLQkJCXRoaXMucmVwb3B1bGF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIHN1YmplY3QncyBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3BlcnR5IG5hbWUKLQkgKiBoYXMgY2hhbmdlZC4KLQkgKgotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIHByb3BlcnR5IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eSBjaGFuZ2UKLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBuYW1lcyB0byBsaXN0ZW4gZm9yIHByb3BlcnRpZXMgY2hhbmdpbmcgZnJvbSB0aGUKLQkgKiBzdWJqZWN0LgotCSAqCi0JICogQHJldHVybiBBIG5vbi08Y29kZT5udWxsPC9jb2RlPiBsaXN0IG9mIHByb3BlcnR5IG5hbWVzCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHByb3BlcnR5TmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFub3RoZXIgPGNvZGU+QWJzdHJhY3RTdWJqZWN0UGFuZTwvY29kZT4gd2l0aCB0aGlzIG9uZSBzbyBpdCBjYW4KLQkgKiBiZSBhdXRvbWF0aWNhbGx5IG5vdGlmaWVkIGFib3V0IGNlcnRhaW4gZXZlbnRzIHN1Y2ggYXMgZW5nYWdpbmcgb3IKLQkgKiBkaXNlbmdhZ2luZyB0aGUgbGlzdGVuZXJzLCBldGMuCi0JICoKLQkgKiBAcGFyYW0gc3ViUGFuZSBUaGUgc3ViLXBhbmUgdG8gcmVnaXN0ZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb250cm9sbGVyCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVnaXN0ZXJTdWJQYW5lKEFic3RyYWN0UGFuZTw/PiBzdWJQYW5lKSB7Ci0JCXRoaXMuc3ViUGFuZXMuYWRkKHN1YlBhbmUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHBhbmUncyB3aWRnZXRzICh0aG9zZSB0aGF0IHdlcmUgcmVnaXN0ZXJlZCB3aXRoCi0JICogaXRzIGxlZnQgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+KSBmcm9tIHRoaXMgcGFuZSdzIGxlZnQKLQkgKiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4gc28gdGhhdCB0aGVpciB3aWR0aCB3aWxsIG5vIGxvbmdlciBiZSBhZGp1c3RlZAotCSAqIHdpdGggdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgY29udGFpbmluZyB0aGUgd2lkZ2V0cyB0byByZW1vdmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZW1vdmVBbGlnbkxlZnQoQWJzdHJhY3RQYW5lPD8+IHBhbmUpIHsKLQkJdGhpcy5sZWZ0Q29udHJvbEFsaWduZXIucmVtb3ZlKHBhbmUubGVmdENvbnRyb2xBbGlnbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb250cm9sIGZyb20gdGhlIGNvbGxlY3Rpb24gb2Ygd2lkZ2V0cyB0aGF0IGFyZSBhbGlnbmVkCi0JICogdG8gaGF2ZSB0aGUgc2FtZSB3aWR0aCB3aGVuIHRoZXkgYXJlIHNob3duIHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIDMKLQkgKiB3aWRnZXQgY29sdW1zLgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgdG8gcmVtb3ZlLCBpdHMgd2lkdGggd2lsbCBubyBsb25nZXIgYmUKLQkgKiBhanVzdGVkIHRvIGJlIHRoZSB3aWR0aCBvZiB0aGUgbG9uZ2VzdCB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZW1vdmVBbGlnbkxlZnQoQ29udHJvbCBjb250cm9sKSB7Ci0JCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyLnJlbW92ZShjb250cm9sKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBwYW5lJ3Mgd2lkZ2V0cyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgd2l0aAotCSAqIGl0cyByaWdodCA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4pIGZyb20gdGhpcyBwYW5lJ3MgcmlnaHQKLQkgKiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4gc28gdGhhdCB0aGVpciB3aWR0aCB3aWxsIG5vIGxvbmdlciBiZSBhZGp1c3RlZAotCSAqIHdpdGggdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgY29udGFpbmluZyB0aGUgd2lkZ2V0cyB0byByZW1vdmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZW1vdmVBbGlnblJpZ2h0KEFic3RyYWN0UGFuZTw/PiBwYW5lKSB7Ci0JCXRoaXMucmlnaHRDb250cm9sQWxpZ25lci5yZW1vdmUocGFuZS5yaWdodENvbnRyb2xBbGlnbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb250cm9sIGZyb20gdGhlIGNvbGxlY3Rpb24gb2Ygd2lkZ2V0cyB0aGF0IGFyZSBhbGlnbmVkCi0JICogdG8gaGF2ZSB0aGUgc2FtZSB3aWR0aCB3aGVuIHRoZXkgYXJlIHNob3duIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSAzCi0JICogd2lkZ2V0IGNvbHVtcy4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHRvIHJlbW92ZSwgaXRzIHdpZHRoIHdpbGwgbm8gbG9uZ2VyIGJlCi0JICogYWp1c3RlZCB0byBiZSB0aGUgd2lkdGggb2YgdGhlIGxvbmdlc3Qgd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtb3ZlQWxpZ25SaWdodChDb250cm9sIGNvbnRyb2wpIHsKLQkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLnJlbW92ZShjb250cm9sKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiA8Y29kZT5BYnN0cmFjdFBhbmU8L2NvZGU+J3MgPGNvZGU+Q29udHJvbDwvY29kZT4gZnJvbQotCSAqIGhhdmluZyBpdHMgZW5hYmxlbWVudCBzdGF0ZSBtYW5hZ2VkIGJ5IHRoaXMgcGFuZS4gSG93ZXZlciwgaWYgdGhpcyBwYW5lCi0JICogaGFzIGl0cyBlbmFibGVtZW50IHN0YXRlIG1vZGlmaWVkLCB0aGUgZ2l2ZW4gcGFuZSB3aWxsIHJlY2VpdmUgdGhhdAotCSAqIG5vdGlmaWNhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHRvIGhhdmUgaXRzIGVuYWJsZW1lbnQgc3RhdGUgbm90IG1hbmFnZWQgYnkgdGhpcyBwYW5lCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbUVuYWJsZW1lbnRDb250cm9sKEFic3RyYWN0UGFuZTw/PiBwYW5lKSB7Ci0JCXRoaXMucmVtb3ZlRnJvbUVuYWJsZW1lbnRDb250cm9sKHBhbmUuZ2V0Q29udHJvbCgpKTsKLQkJdGhpcy5pbnRlcm5hbFBhbmVzRm9yRW5hYmxlbWVudENvbnRyb2wuYWRkKHBhbmUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIDxjb2RlPkNvbnRyb2w8L2NvZGU+IGZyb20gaGF2aW5nIGl0cyBlbmFibGVtZW50IHN0YXRlCi0JICogYmVpbmcgbWFuYWdlZCBieSB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgPGNvZGU+Q29udHJvbDwvY29kZT4gdGhhdCBoYXMgaXRzIGVuYWJsZW1lbnQgc3RhdGUKLQkgKiBtYW51YWxseSBjb250cm9sbGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbUVuYWJsZW1lbnRDb250cm9sKENvbnRyb2wgY29udHJvbCkgewotCQljb250cm9sLnNldERhdGEoImVuYWJsZW1lbnQiLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBwYW5lJ3MgY29udHJvbHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIGZvcgotCSAqIGFsaWdubWVudCkgZnJvbSB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRoYXQgbm8gbG9uZ2VyCi0JICogcmVxdWlyZXMgdGhlaXIgd2lkdGggYWRqdXN0ZWQgd2l0aCB0aGUgd2lkdGggb2YgdGhlIGxvbmdlc3Qgd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtb3ZlUGFuZUZvckFsaWdubWVudChBYnN0cmFjdFBhbmU8Pz4gcGFuZSkgewotCQlyZW1vdmVBbGlnbkxlZnQocGFuZSk7Ci0JCXJlbW92ZUFsaWduUmlnaHQocGFuZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIChwZXJoYXBzIGludGVybmFsbHkpIHdoZW4gdGhpcyBuZWVkcyB0byByZXBvcHVsYXRlCi0JICogYnV0IHRoZSBvYmplY3Qgb2YgaW50ZXJlc3QgaGFzIG5vdCBjaGFuZ2VkLgotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVwb3B1bGF0ZSgpIHsKLQotCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgIiAgIC0+cmVwb3B1bGF0ZSgpIik7Ci0KLQkJLy8gUG9wdWxhdGUgdGhpcyBwYW5lCi0JCXRyeSB7Ci0JCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCQkJZG9Qb3B1bGF0ZSgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCX0KLQotCQkvLyBBc2sgdGhlIHN1Yi1wYW5lcyB0byByZXBvcHVsYXRlIHRoZW1zZWx2ZXMKLQkJZm9yIChBYnN0cmFjdFBhbmU8Pz4gc3ViUGFuZSA6IHRoaXMuc3ViUGFuZXMpIHsKLQkJCXN1YlBhbmUucmVwb3B1bGF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgcGFuZSBzaG91bGQgYmUgcmVwb3B1bGF0ZSBldmVuIGlmIHRoZSBzdWJqZWN0IGlmCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlzIHJldHVybmVkIGJ5IGRlZmF1bHQKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXBvcHVsYXRlV2l0aE51bGxTdWJqZWN0KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbnRlcm5hbCBmbGFnIHRoYXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgcGFuZSBpcyBiZWluZwotCSAqIHBvcHVsYXRlZCBvciBub3QuIER1cmluZyBwb3B1bGF0aW9uLCBpdCBpcyByZXF1aXJlZCB0byBub3QgdXBkYXRlIHRoZQotCSAqIHdpZGdldHMgd2hlbiB0aGUgbW9kZWwgaXMgdXBkYXRlZCBub3IgdG8gdXBkYXRlIHRoZSBtb2RlbCB3aGVuIHRoZSB3aWRnZXRzCi0JICogYXJlIGJlaW5nIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCdzIHZhbHVlcy4KLQkgKgotCSAqIEBwYXJhbSBwb3B1bGF0aW5nCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRQb3B1bGF0aW5nKGJvb2xlYW4gcG9wdWxhdGluZykgewotCQl0aGlzLnBvcHVsYXRpbmcgPSBwb3B1bGF0aW5nOwotCX0KLQotCS8qKgotCSAqIEVpdGhlciBzaG93IG9yIGhpZGVzIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSB2aXNpYmxlIFRoZSBuZXcgdmlzaWJpbGl0eSBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCWlmICghdGhpcy5jb250YWluZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmNvbnRhaW5lci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmVhcmVzdCA8Y29kZT5TaGVsbDwvY29kZT4gZGlzcGxheWluZyB0aGUgbWFpbiB3aWRnZXQgb2YgdGhpcwotCSAqIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBuZWFyZXN0IHdpbmRvdyBkaXNwbGF5aW5nIHRoaXMgcGFuZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTaGVsbCBzaGVsbCgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGFpbmVyLmdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3ViamVjdCBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdWJqZWN0IGlmIHRoaXMgcGFuZSB3YXMgbm90IGRpc3Bvc2VkOyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIGl0IHdhcwotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIFQgc3ViamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuc3ViamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGhhcyBjaGFuZ2VkLCBkaXNjb25uZWN0cyBhbnkgbGlzdGVuZXJzIGZyb20gdGhlIG9sZCBzdWJqZWN0Ci0JICogYW5kIGNvbm5lY3RzIHRob3NlIGxpc3RlbmVycyBvbnRvIHRoZSBuZXcgc3ViamVjdC4KLQkgKgotCSAqIEBwYXJhbSBvbGRzdWJqZWN0IFRoZSBvbGQgc3ViamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIHdhcyBzZXQKLQkgKiBAcGFyYW0gbmV3U3ViamVjdCBUaGUgbmV3IHN1YmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBuZWVkcyB0byBiZQotCSAqIHNldAotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc3ViamVjdENoYW5nZWQoVCBvbGRTdWJqZWN0LCBUIG5ld1N1YmplY3QpIHsKLQkJaWYgKCF0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQotCQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICJzdWJqZWN0Q2hhbmdlZCgpIik7Ci0JCQl0aGlzLmRpc2VuZ2FnZUxpc3RlbmVycyhvbGRTdWJqZWN0KTsKLQotCQkJLy8gT25seSByZXBvcHVsYXRlIGlmIGl0IGlzIGFsbG93ZWQgd2hlbiB0aGUgc3ViamVjdCBpcyBudWxsCi0JCQlpZiAobmV3U3ViamVjdCAhPSBudWxsIHx8Ci0JCQkgICAobmV3U3ViamVjdCA9PSBudWxsICYmIHJlcG9wdWxhdGVXaXRoTnVsbFN1YmplY3QoKSkpCi0JCQl7Ci0JCQkJdGhpcy5yZXBvcHVsYXRlKCk7Ci0JCQl9Ci0KLQkJCXRoaXMuZW5nYWdlTGlzdGVuZXJzKG5ld1N1YmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVW5yZWdpc3RlcnMgdGhlIGdpdmVuIDxjb2RlPkFic3RyYWN0U3ViamVjdFBhbmU8L2NvZGU+IGZyb20gdGhpcyBvbmUgc28gaXQKLQkgKiBjYW4gbm8gbG9uZ2VyIGJlIGF1dG9tYXRpY2FsbHkgbm90aWZpZWQgYWJvdXQgY2VydGFpbiBldmVudHMgc3VjaCBhcwotCSAqIGVuZ2FnaW5nIG9yIGRpc2VuZ2FnaW5nIHRoZSBsaXN0ZW5lcnMsIGV0Yy4KLQkgKgotCSAqIEBwYXJhbSBzdWJQYW5lIFRoZSBzdWItcGFuZSB0byB1bnJlZ2lzdGVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29udHJvbGxlcgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHVucmVnaXN0ZXJTdWJQYW5lKEFic3RyYWN0UGFuZTw/PiBzdWJQYW5lKSB7Ci0JCXRoaXMuc3ViUGFuZXMucmVtb3ZlKHN1YlBhbmUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVQYW5lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKCFpc1BvcHVsYXRpbmcoKSAmJiAhY29udGFpbmVyLmlzRGlzcG9zZWQoKSkgewotCQkJcG9wdWxhdGluZyA9IHRydWU7Ci0KLQkJCXRyeSB7Ci0JCQkJcHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlwb3B1bGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BYnN0cmFjdFZhbGlkYXRpbmdEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWJzdHJhY3RWYWxpZGF0aW5nRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNzBmY2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BYnN0cmFjdFZhbGlkYXRpbmdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Qcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoaXMgZGlhbG9nIGlzIHNpbWlsYXIgdG8gaXQgc3VwZXJjbGFzcywgPGNvZGU+QWJzdHJhY3REaWFsb2c8L2NvZGU+LCB3aXRoCi0gKiB0aGUgYWRkZWQgdmFsdWUgb2YgYW4gZXJyb3IgbWVzc2FnZSBsYWJlbCBiZWxvdyB0aGUgbWFpbiBwYW5lbC4gQSBzdWJjbGFzcwotICogY2FuIHNldCB0aGlzIGVycm9yIG1lc3NhZ2UgYXMgbmVlZGVkIHNvIHRoYXQgaXQgY2FuIGluZm9ybSB0aGUgdXNlciBzb21ldGhpbmcKLSAqIGluY29ycmVjdCBoYXMgYmVlbiBlbnRlcmVkLgotICogPHA+Ci0gKiBJZiB0aGVyZSBpcyBhbiBlcnJvciBtZXNzYWdlLCBpdCB3aWxsIGJlIHNob3duLiBJZiB0aGVyZSBpcyBhIHdhcm5pbmcKLSAqIG1lc3NhZ2UsIGl0IHdpbGwgb25seSBiZSBzaG93biBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiBXYXJuaW5nIG1lc3NhZ2VzCi0gKiBoYXZlIGEgZGlmZmVyZW50IGljb24gdGhhbiBlcnJvciBtZXNzYWdlcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGluZ0RpYWxvZzxUIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBBYnN0cmFjdERpYWxvZzxUPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0VmFsaWRhdGluZ0RpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RWYWxpZGF0aW5nRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RWYWxpZGF0aW5nRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSB0aXRsZSBUaGUgZGlhbG9nJ3MgdGl0bGUKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RWYWxpZGF0aW5nRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdGl0bGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCWZpbmFsIE5vZGUuVmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IE5vZGUuVmFsaWRhdG9yKCkgewotCQkJcHVibGljIHZvaWQgcGF1c2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlc3VtZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCQkJQWJzdHJhY3RWYWxpZGF0aW5nRGlhbG9nLnRoaXMudmFsaWRhdGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgZGVzY3JpcHRpb24gcGFuZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjbGVhckVycm9yTWVzc2FnZSgpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIHNob3duIGluIHRoZSBkZXNjcmlwdGlvbiBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgZGVzY3JpcHRpb24gdW5kZXIgdGhlIGRlc2NyaXB0aW9uJ3MgdGl0bGUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBzaG93biBpbiB0aGUgZGVzY3JpcHRpb24gcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGltYWdlIG9mIHRoZSBkZXNjcmlwdGlvbiBwYW5lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMKLQkgKiByZXF1aXJlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBkZXNjcmlwdGlvbkltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aXRsZSBvZiB0aGUgZGVzY3JpcHRpb24gcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHRpdGxlIHNob3duIGluIHRoZSBkZXNjcmlwdGlvbiBwYW5lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvblRpdGxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0JCVBvaW50IHJlc3VsdCA9IGdldFNoZWxsKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJUG9pbnQgcGFuZVNpemUgPSBwYW5lKCkuZ2V0Q29udHJvbCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWludCB3aWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQwMCk7Ci0JCXJlc3VsdC54ID0gTWF0aC5tYXgod2lkdGgsIHBhbmVTaXplLngpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc1RpdGxlQXJlYSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVVJKCkgewotCi0JCXN1cGVyLmluaXRpYWxpemVVSSgpOwotCi0JCS8vIFVwZGF0ZSB0aGUgZGVzY3JpcHRpb24gdGl0bGUKLQkJU3RyaW5nIGRlc2NyaXB0aW9uVGl0bGUgPSBkZXNjcmlwdGlvblRpdGxlKCk7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uVGl0bGUgIT0gbnVsbCkgewotCQkJc2V0VGl0bGUoZGVzY3JpcHRpb25UaXRsZSk7Ci0JCX0KLQotCQkvLyBVcGRhdGUgdGhlIGRlc2NyaXB0aW9uIHRpdGxlCi0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uKCk7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXNldE1lc3NhZ2UoZGVzY3JpcHRpb24pOwotCQl9Ci0KLQkJLy8gVXBkYXRlIHRoZSBkZXNjcmlwdGlvbiBpbWFnZQotCQlJbWFnZSBpbWFnZSA9IGRlc2NyaXB0aW9uSW1hZ2UoKTsKLQotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJc2V0VGl0bGVJbWFnZShpbWFnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBkZXNjcmlwdGlvbiBwYW5lIGJ5IHNob3dpbmcgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UgYW5kIGZvcm1hdAotCSAqIHRoZSB0ZXh0IHdpdGggdGhlIGdpdmVuIGxpc3Qgb2YgYXJndW1lbnRzIGlmIGFueSBleGlzdHMuCi0JICoKLQkgKiBAcGFyYW0gZXJyb3JNZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRlc2NyaXB0aW9uIHBhbmUKLQkgKiBAcGFyYW0gYXJndW1lbnRzIFRoZSBsaXN0IG9mIGFyZ3VtZW50cyB1c2VkIHRvIGZvcm1hdCB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlLCBPYmplY3QuLi4gYXJndW1lbnRzKSB7Ci0JCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChlcnJvck1lc3NhZ2UsIGFyZ3VtZW50cykpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGVycm9yIG1lc3NhZ2UsIGVpdGhlciBzaG93cyB0aGUgZmlyc3QgZXJyb3IgcHJvYmxlbSBvciBoaWRlcwotCSAqIHRoZSBlcnJvciBwYW5lLiBJZiB0aGUgcHJvZ3Jlc3MgYmFyIGlzIHNob3duLCB0aGVuIHRoZSBlcnJvciBtZXNzYWdlIHdpbGwKLQkgKiBub3QgYmUgc2hvd24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpIHsKLQkJaWYgKHN1YmplY3QoKS5oYXNCcmFuY2hQcm9ibGVtcygpKSB7Ci0JCQlQcm9ibGVtIHByb2JsZW0gPSBzdWJqZWN0KCkuYnJhbmNoUHJvYmxlbXMoKS5uZXh0KCk7Ci0JCQlzZXRFcnJvck1lc3NhZ2UocHJvYmxlbS5tZXNzYWdlS2V5KCksIHByb2JsZW0ubWVzc2FnZUFyZ3VtZW50cygpKTsKLQkJfQotCQkvLyBUT0RPOiBJdCB3b3VsZCBiZSBuaWNlIHRvIGFkZCB3YXJuaW5ncyB0byB0aGUgbW9kZWwKLS8vCQllbHNlIGlmICh0aGlzLnN1YmplY3QoKS5oYXNCcmFuY2hXYXJuaW5ncygpKSB7Ci0vLwkJCVByb2JsZW0gcHJvYmxlbSA9IHRoaXMuc3ViamVjdCgpLmJyYW5jaFdhcm5pbmdzKCkubmV4dCgpOwotLy8JCQl0aGlzLnNldFdhcm5pbmdNZXNzYWdlS2V5KHByb2JsZW0uZ2V0TWVzc2FnZUtleSgpLCBwcm9ibGVtLmdldE1lc3NhZ2VBcmd1bWVudHMoKSk7Ci0vLwkJfQotCQllbHNlIHsKLQkJCWNsZWFyRXJyb3JNZXNzYWdlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIHN0YXRlIG9iamVjdCBhbmQgYmFzZWQgb24gaXRzIHN0YXR1cywgdXBkYXRlIHRoZSBkZXNjcmlwdGlvbgotCSAqIHBhbmUgdG8gc2hvdyB0aGUgZmlyc3QgZXJyb3IgaWYgYW55IGV4aXN0cyBhbmQgdXBkYXRlIHRoZSBlbmFibGVtZW50IG9mCi0JICogdGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCXN1YmplY3QoKS52YWxpZGF0ZUJyYW5jaCgpOwotCQl1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKCFzdWJqZWN0KCkuaGFzQnJhbmNoUHJvYmxlbXMoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlTGlzdFBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlTGlzdFBhbmUuamF2YQppbmRleCA1Nzk3ZTc0Li44OTA2OWM1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZUxpc3RQYW5lLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVMaXN0UGFuZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEzLDE5ICsxMywyMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkNvbHVtbkFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CkBAIC02NiwxMCArNjksNiBAQAogQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgQWRkUmVtb3ZlTGlzdFBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEFkZFJlbW92ZVBhbmU8VD4KIHsKLQkvKioKLQkgKiBGbGFnIHVzZWQgdG8gcHJldmVudCBjaXJjdWxhcgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7CiAKIAkvKioKIAkgKiBUaGUgbWFpbiB3aWRnZXQgb2YgdGhpcyBhZGQvcmVtb3ZlIHBhbmUuCkBAIC04Nyw3ICs4Niw3IEBACiAJICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCiAJICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSB0YWJsZSBob2xkZXIncyBpdGVtcwogCSAqLwotCXB1YmxpYyBBZGRSZW1vdmVMaXN0UGFuZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCisJcHVibGljIEFkZFJlbW92ZUxpc3RQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCiAJICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCiAJICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKQEAgLTExNCw3ICsxMTMsNyBAQAogCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgdGFibGUgaG9sZGVyJ3MgaXRlbXMKIAkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKIAkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlTGlzdFBhbmUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAorCXB1YmxpYyBBZGRSZW1vdmVMaXN0UGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAogCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAogCSAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCiAJICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCkBAIC0xMzUsNiArMTM0LDM5IEBACiAJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4uCiAJICoKIAkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gYWRhcHRlcgorCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKKwkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgorCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAorCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgdGFibGUgaG9sZGVyJ3MgaXRlbXMKKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKKwkgKiBAcGFyYW0gcGFyZW50TWFuYWdlUGFuZSA8Y29kZT50cnVlPC9jb2RlPiB0byBoYXZlIHRoZSBwYXJlbnQgcGFuZSBtYW5hZ2UKKwkgKiB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGlzIHBhbmUKKwkgKi8KKwlwdWJsaWMgQWRkUmVtb3ZlTGlzdFBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQsCisJICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcGFyZW50TWFuYWdlUGFuZSkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsCisJCSAgICAgIHBhcmVudCwKKwkJICAgICAgYWRhcHRlciwKKwkJICAgICAgbGlzdEhvbGRlciwKKwkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAorCQkgICAgICBsYWJlbFByb3ZpZGVyLAorCQkgICAgICBoZWxwSWQsCisJCSAgICAgIHBhcmVudE1hbmFnZVBhbmUpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlTGlzdFBhbmU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKIAkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0CiAJICogQHBhcmFtIGFkYXB0ZXIKIAkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCkBAIC0xNDMsNyArMTc1LDcgQEAKIAkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKIAkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIHRhYmxlIGhvbGRlcidzIGl0ZW1zCiAJICovCi0JcHVibGljIEFkZFJlbW92ZUxpc3RQYW5lKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAorCXB1YmxpYyBBZGRSZW1vdmVMaXN0UGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCiAJICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLApAQCAtMTczLDcgKzIwNSw3IEBACiAJICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSB0YWJsZSBob2xkZXIncyBpdGVtcwogCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQogCSAqLwotCXB1YmxpYyBBZGRSZW1vdmVMaXN0UGFuZShBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKKwlwdWJsaWMgQWRkUmVtb3ZlTGlzdFBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAogCSAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCiAJICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCiAJICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKQEAgLTIxMCw1MiArMjQyLDU0IEBACiAJCX07CiAJfQogCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcihidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7CisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgeworCQlzdXBlci5pdGVtc0FkZGVkKGUpOworCQlyZXZhbGlkYXRlTGF5b3V0KCk7CiAJfQogCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoIXRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCQl0YWJsZS5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoIXRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCQl0YWJsZS5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCWlmICghdGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXRhYmxlLmdldFBhcmVudCgpLmxheW91dCgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCWlmICghdGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXRhYmxlLmdldFBhcmVudCgpLmxheW91dCgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoIXRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCQl0YWJsZS5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKCF0YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJdGFibGUuZ2V0UGFyZW50KCkubGF5b3V0KCk7Ci0JCQkJfQotCQkJfQotCQl9OworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7CisJCXN1cGVyLml0ZW1zTW92ZWQoZSk7CisJCXJldmFsaWRhdGVMYXlvdXQoKTsKIAl9CiAKLQlwcml2YXRlIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCk7CisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7CisJCXN1cGVyLml0ZW1zUmVtb3ZlZChlKTsKKwkJcmV2YWxpZGF0ZUxheW91dCgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7CisJCXN1cGVyLml0ZW1zUmVwbGFjZWQoZSk7CisJCXJldmFsaWRhdGVMYXlvdXQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgeworCQlzdXBlci5saXN0Q2hhbmdlZChlKTsKKwkJcmV2YWxpZGF0ZUxheW91dCgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKKwkJc3VwZXIubGlzdENsZWFyZWQoZSk7CisJCXJldmFsaWRhdGVMYXlvdXQoKTsKKwl9CisKKwkvKioKKwkgKiBSZXZhbGlkYXRlcyB0aGUgdGFibGUgbGF5b3V0IGFmdGVyIHRoZSBsaXN0IG9mIGl0ZW1zIGhhcyBjaGFuZ2VkLiBUaGUKKwkgKiBsYXlvdXQgaGFzIHRvIGJlIGRvbmUgaW4gYSBuZXcgVUkgdGhyZWFkIGJlY2F1c2Ugb3VyIGxpc3RlbmVyIG1pZ2h0IGJlCisJICogbm90aWZpZWQgYmVmb3JlIHRoZSB0YWJsZSBoYXMgYmVlbiB1cGRhdGVkICh0YWJsZSBjb2x1bW4gYWRkZWQgb3IgcmVtb3ZlZCkuCisJICovCisJcHJpdmF0ZSB2b2lkIHJldmFsaWRhdGVMYXlvdXQoKSB7CisJCVNXVFV0aWwuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKCF0YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQl0YWJsZS5nZXRQYXJlbnQoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOworCQkJCXRhYmxlLmdldFBhcmVudCgpLmxheW91dCgpOworCQkJfQorCQl9fSk7CiAJfQogCiAJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKQEAgLTI3MCwyNiArMzA0LDggQEAKIAkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCgpKSB7CiAJCQkJCXJldHVybjsKIAkJCQl9Ci0KLQkJCQlpZiAoIWxvY2tlZCkgewotCQkJCQlsb2NrZWQgPSB0cnVlOwotCi0JCQkJCXRyeSB7Ci0JCQkJCQlPYmplY3QgdmFsdWUgPSBlLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlnZXRTZWxlY3Rpb25Nb2RlbCgpLnNldFNlbGVjdGVkVmFsdWUoZS5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCWludCBpbmRleCA9IC0xOwotCi0JCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCWluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2YoZ2V0TGlzdEhvbGRlcigpLml0ZXJhdG9yKCksIHZhbHVlKTsKLQkJCQkJCX0KLQotCQkJCQkJdGFibGUuc2VsZWN0KGluZGV4KTsKLQkJCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCWxvY2tlZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQorCQkJCWdldFNlbGVjdGlvbk1vZGVsKCkuc2V0U2VsZWN0ZWRWYWx1ZShlLmdldE5ld1ZhbHVlKCkpOworCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKIAkJCX0KIAkJfTsKIAl9CkBAIC0zMDIsOSArMzE4LDkgQEAKIAkJfTsKIAl9CiAKLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZFRhYmxlQ29udGFpbmVyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwlwcml2YXRlIENvbXBvc2l0ZSBhZGRUYWJsZUNvbnRhaW5lcihDb21wb3NpdGUgY29udGFpbmVyKSB7CiAKLQkJY29udGFpbmVyID0gYnVpbGRQYW5lKGNvbnRhaW5lciwgYnVpbGRUYWJsZUNvbnRhaW5lckxheW91dCgpKTsKKwkJY29udGFpbmVyID0gYWRkUGFuZShjb250YWluZXIsIGJ1aWxkVGFibGVDb250YWluZXJMYXlvdXQoKSk7CiAJCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKIAkJcmV0dXJuIGNvbnRhaW5lcjsKIAl9CkBAIC0zMTgsNiArMzM0LDggQEAKIAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoQ2FjaGUpIHsKIAogCQkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKVswXTsKKwkJCQlUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IHRhYmxlLmdldENvbHVtbigwKTsKKwkJCQlpbnQgY29sdW1uV2lkdGggPSB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpOwogCQkJCXBhY2tDb2x1bW4odGFibGUpOwogCiAJCQkJLy8gQ2FsY3VsYXRlIHRoZSB0YWJsZSBzaXplIGFuZCBhZGp1c3QgaXQgd2l0aCB0aGUgaGludHMKQEAgLTMzMSw2ICszNDksMTMgQEAKIAkJCQkJc2l6ZS55ID0gaGVpZ2h0SGludDsKIAkJCQl9CiAKKwkJCQkvLyBSZXZlcnQgdGhlIGNvbHVtbidzIHdpZHRoIHRvIGl0cyBjdXJyZW50IHZhbHVlCisJCQkJdGFibGUuc2V0UmVkcmF3KGZhbHNlKTsKKwkJCQl0YWJsZS5zZXRMYXlvdXREZWZlcnJlZCh0cnVlKTsKKwkJCQl0YWJsZUNvbHVtbi5zZXRXaWR0aChjb2x1bW5XaWR0aCk7CisJCQkJdGFibGUuc2V0TGF5b3V0RGVmZXJyZWQoZmFsc2UpOworCQkJCXRhYmxlLnNldFJlZHJhdyh0cnVlKTsKKwogCQkJCXJldHVybiBzaXplOwogCQkJfQogCkBAIC00MTEsNyArNDM2LDcgQEAKIAkJfTsKIAl9CiAKLQlwcml2YXRlIElUYWJsZUxhYmVsUHJvdmlkZXIgYnVpVGFibGVMYWJlbFByb3ZpZGVyKElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7CisJcHJpdmF0ZSBJVGFibGVMYWJlbFByb3ZpZGVyIGJ1aWxkVGFibGVMYWJlbFByb3ZpZGVyKElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7CiAJCXJldHVybiBuZXcgVGFibGVMYWJlbFByb3ZpZGVyKChJTGFiZWxQcm92aWRlcikgbGFiZWxQcm92aWRlcik7CiAJfQogCkBAIC00MzUsMjAgKzQ2MCwxOSBAQAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKIAotCQl0YWJsZSA9IGJ1aWxkVGFibGUoCi0JCQlidWlsZFRhYmxlQ29udGFpbmVyKGNvbnRhaW5lciksCisJCXRhYmxlID0gYWRkVW5tYW5hZ2VkVGFibGUoCisJCQlhZGRUYWJsZUNvbnRhaW5lcihjb250YWluZXIpLAogCQkJU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJLAogCQkJaGVscElkCiAJCSk7CiAKLQkJcmVtb3ZlRnJvbUVuYWJsZW1lbnRDb250cm9sKHRhYmxlKTsKIAogCQlUYWJsZU1vZGVsQWRhcHRlciBtb2RlbCA9IFRhYmxlTW9kZWxBZGFwdGVyLmFkYXB0KAogCQkJKExpc3RWYWx1ZU1vZGVsPE9iamVjdD4pIGxpc3RIb2xkZXIsCi0JCQlidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAorCQkJZ2V0U2VsZWN0ZWRJdGVtSG9sZGVyKCksCiAJCQl0YWJsZSwKIAkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpVGFibGVMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpCisJCQlidWlsZFRhYmxlTGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKQogCQkpOwogCiAJCW1vZGVsLmFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoKSk7CkBAIC00NTgsMTEgKzQ4Miw2IEBACiAJCQlidWlsZFNlbGVjdGVkSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKQogCQkpOwogCi0JCWxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKAotCQkJTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsCi0JCQlidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpCi0JCSk7Ci0KIAkJaW5pdGlhbGl6ZVRhYmxlKHRhYmxlKTsKIAl9CiAKQEAgLTQ4Myw0MyArNTAyLDMxIEBACiAJICogc2VsZWN0aW9uIG1vZGVsIGFuZCAoMykgdGhlIGJ1dHRvbnMuCiAJICovCiAJcHJpdmF0ZSB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoKSB7CisJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gZ2V0U2VsZWN0ZWRJdGVtSG9sZGVyKCk7CisJCU9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBzZWxlY3Rpb25Nb2RlbCA9IGdldFNlbGVjdGlvbk1vZGVsKCk7CisJCWludCBzZWxlY3Rpb25Db3VudCA9IHRoaXMudGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKTsKIAotCQlpZiAobG9ja2VkKSB7Ci0JCQlyZXR1cm47CisJCWlmIChzZWxlY3Rpb25Db3VudCA9PSAwKSB7CisJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7CisJCQlzZWxlY3Rpb25Nb2RlbC5jbGVhclNlbGVjdGlvbigpOworCQl9CisJCWVsc2UgaWYgKHNlbGVjdGlvbkNvdW50ICE9IDEpIHsKKwkJCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShudWxsKTsKKwkJCXNlbGVjdGlvbk1vZGVsLmNsZWFyU2VsZWN0aW9uKCk7CisKKwkJCWZvciAoaW50IGluZGV4IDogdGhpcy50YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpIHsKKwkJCQlzZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3Rpb25JbnRlcnZhbChpbmRleCwgaW5kZXgpOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJaW50IHNlbGVjdGVkSW5kZXggPSB0aGlzLnRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7CisJCQlPYmplY3Qgc2VsZWN0ZWRJdGVtID0gZ2V0TGlzdEhvbGRlcigpLmdldChzZWxlY3RlZEluZGV4KTsKKworCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKHNlbGVjdGVkSXRlbSk7CisJCQlzZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKHNlbGVjdGVkSXRlbSk7CiAJCX0KIAotCQlsb2NrZWQgPSB0cnVlOwotCi0JCXRyeSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGdldFNlbGVjdGVkSXRlbUhvbGRlcigpOwotCQkJT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHNlbGVjdGlvbk1vZGVsID0gZ2V0U2VsZWN0aW9uTW9kZWwoKTsKLQkJCWludCBzZWxlY3Rpb25Db3VudCA9IHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCk7Ci0KLQkJCWlmIChzZWxlY3Rpb25Db3VudCA9PSAwKSB7Ci0JCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkJCXNlbGVjdGlvbk1vZGVsLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzZWxlY3Rpb25Db3VudCAhPSAxKSB7Ci0JCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkJCXNlbGVjdGlvbk1vZGVsLmNsZWFyU2VsZWN0aW9uKCk7Ci0KLQkJCQlmb3IgKGludCBpbmRleCA6IHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSkgewotCQkJCQlzZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3Rpb25JbnRlcnZhbChpbmRleCwgaW5kZXgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWludCBzZWxlY3RlZEluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRJdGVtID0gZ2V0TGlzdEhvbGRlcigpLmdldChzZWxlY3RlZEluZGV4KTsKLQotCQkJCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZEl0ZW0pOwotCQkJCXNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoc2VsZWN0ZWRJdGVtKTsKLQkJCX0KLQotCQkJdXBkYXRlQnV0dG9ucygpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbG9ja2VkID0gZmFsc2U7Ci0JCX0KKwkJdXBkYXRlQnV0dG9ucygpOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVBhbmUuamF2YQppbmRleCAyYTFkZjk1Li40OTAyMmZhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVBhbmUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVBhbmUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw2ICsxMCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKQEAgLTE3LDcgKzE4LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CkBAIC0zNiw3ICs0Miw3IEBACiAgKiBAdmVyc2lvbiAxLjAKICAqIEBzaW5jZSAyLjAKICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFkZFJlbW92ZVBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEFic3RyYWN0UGFuZTxUPgorcHVibGljIGFic3RyYWN0IGNsYXNzIEFkZFJlbW92ZVBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIFBhbmU8VD4KIHsKIAlwcml2YXRlIEFkYXB0ZXIgYWRhcHRlcjsKIAlwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247CkBAIC02Miw3ICs2OCw3IEBACiAJICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCiAJICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCiAJICovCi0JcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAorCXByb3RlY3RlZCBBZGRSZW1vdmVQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCiAJICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKIAkgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCiAJICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKQEAgLTkyLDcgKzk4LDcgQEAKIAkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKIAkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKIAkgKi8KLQlwcm90ZWN0ZWQgQWRkUmVtb3ZlUGFuZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCisJcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKIAkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAogCSAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKIAkgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLApAQCAtMTAwLDcgKzEwNiw0MSBAQAogCSAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAogCSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKIAotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCQl0aGlzKHBhcmVudFBhbmUsCisJCSAgICAgcGFyZW50LAorCQkgICAgIGFkYXB0ZXIsCisJCSAgICAgbGlzdEhvbGRlciwKKwkJICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJCSAgICAgbGFiZWxQcm92aWRlciwKKwkJICAgICBoZWxwSWQsCisJCSAgICAgdHJ1ZSk7CisJfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCisJICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQorCSAqIGJlaGF2aW9yCisJICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcworCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCisJICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCisJICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCisJICogQHBhcmFtIHBhcmVudE1hbmFnZVBhbmUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaGF2ZSB0aGUgcGFyZW50IHBhbmUgbWFuYWdlCisJICogdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhpcyBwYW5lCisJICovCisJcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBhcmVudE1hbmFnZVBhbmUpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIHRydWUsIHBhcmVudE1hbmFnZVBhbmUpOwogCiAJCWluaXRpYWxpemUoCiAJCQlhZGFwdGVyLApAQCAtMTMyLDcgKzE3Miw3IEBACiAJICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCiAJICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCiAJICovCi0JcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCisJcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAogCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKIAkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAogCSAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKQEAgLTE2NSw3ICsyMDUsNyBAQAogCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwogCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQogCSAqLwotCXByb3RlY3RlZCBBZGRSZW1vdmVQYW5lKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAorCXByb3RlY3RlZCBBZGRSZW1vdmVQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKIAkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCiAJICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKIAkgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCkBAIC0yMzUsOCArMjc1LDggQEAKIAkvKioKIAkgKiBAY2F0ZWdvcnkgQWRkCiAJICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBidWlsZEFkZEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBidWlsZEJ1dHRvbigKKwlwcm90ZWN0ZWQgQnV0dG9uIGFkZEFkZEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7CisJCXJldHVybiBhZGRVbm1hbmFnZWRCdXR0b24oCiAJCQlwYXJlbnQsCiAJCQlhZGFwdGVyLmFkZEJ1dHRvblRleHQoKSwKIAkJCWJ1aWxkQWRkSXRlbUFjdGlvbigpCkBAIC0yNjEsMzkgKzMwMSw2OCBAQAogCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKIAkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7CiAKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKKwkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKKwkJCQlBZGRSZW1vdmVQYW5lLnRoaXMuaXRlbXNBZGRlZChlKTsKIAkJCX0KIAotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgeworCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKKwkJCQlBZGRSZW1vdmVQYW5lLnRoaXMuaXRlbXNNb3ZlZChlKTsKIAkJCX0KIAotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkSXRlbSA9IHNlbGVjdGVkSXRlbUhvbGRlci5nZXRWYWx1ZSgpOwotCi0JCQkJaWYgKHNlbGVjdGVkSXRlbSA9PSBudWxsKSB7Ci0JCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoZS5pdGVtcygpLCBzZWxlY3RlZEl0ZW0pKSB7Ci0JCQkJCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJCQkJdXBkYXRlQnV0dG9ucygpOwotCQkJCX0KKwkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgeworCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5pdGVtc1JlbW92ZWQoZSk7CiAJCQl9CiAKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKKwkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7CisJCQkJQWRkUmVtb3ZlUGFuZS50aGlzLml0ZW1zUmVwbGFjZWQoZSk7CiAJCQl9CiAKIAkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7CisJCQkJQWRkUmVtb3ZlUGFuZS50aGlzLmxpc3RDaGFuZ2VkKGUpOwogCQkJfQogCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJCQl1cGRhdGVCdXR0b25zKCk7CisJCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7CisJCQkJQWRkUmVtb3ZlUGFuZS50aGlzLmxpc3RDbGVhcmVkKGUpOwogCQkJfQogCQl9OwogCX0KIAorCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKKwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7CisJCQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKKwkJT2JqZWN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyLmdldFZhbHVlKCk7CisKKwkJaWYgKHNlbGVjdGVkSXRlbSA9PSBudWxsKSB7CisJCQl1cGRhdGVCdXR0b25zKCk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGUuZ2V0SXRlbXMoKSwgc2VsZWN0ZWRJdGVtKSkgeworCQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7CisJCQl1cGRhdGVCdXR0b25zKCk7CisJCX0JCQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgeworCQkKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKKwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKKwkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7CisJCXVwZGF0ZUJ1dHRvbnMoKTsKKwl9CisJCisJCiAJLyoqCiAJICogQGNhdGVnb3J5IE9wdGlvbgogCSAqLwpAQCAtMzA4LDggKzM3Nyw4IEBACiAJLyoqCiAJICogQGNhdGVnb3J5IE9wdGlvbgogCSAqLwotCXByb3RlY3RlZCBCdXR0b24gYnVpbGRPcHRpb25hbEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBidWlsZEJ1dHRvbigKKwlwcm90ZWN0ZWQgQnV0dG9uIGFkZE9wdGlvbmFsQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJcmV0dXJuIGFkZFVubWFuYWdlZEJ1dHRvbigKIAkJCWNvbnRhaW5lciwKIAkJCWFkYXB0ZXIub3B0aW9uYWxCdXR0b25UZXh0KCksCiAJCQlidWlsZE9wdGlvbmFsQWN0aW9uKCkKQEAgLTMxOSw4ICszODgsOCBAQAogCS8qKgogCSAqIEBjYXRlZ29yeSBBZGQKIAkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGJ1aWxkUmVtb3ZlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGJ1aWxkQnV0dG9uKAorCXByb3RlY3RlZCBCdXR0b24gYWRkUmVtb3ZlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJcmV0dXJuIGFkZFVubWFuYWdlZEJ1dHRvbigKIAkJCXBhcmVudCwKIAkJCWFkYXB0ZXIucmVtb3ZlQnV0dG9uVGV4dCgpLAogCQkJYnVpbGRSZW1vdmVJdGVtc0FjdGlvbigpCkBAIC00MzQsNyArNTAzLDcgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQnV0dG9uUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7CiAKLQkJY29udGFpbmVyID0gYnVpbGRTdWJQYW5lKGNvbnRhaW5lcik7CisJCWNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY29udGFpbmVyKTsKIAogCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwogCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7CkBAIC00NDIsMzUgKzUxMSwzMiBAQAogCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CiAKIAkJLy8gQWRkIGJ1dHRvbgotCQlhZGRCdXR0b24gPSBidWlsZEFkZEJ1dHRvbihjb250YWluZXIpOwotCQlhZGRBbGlnblJpZ2h0KGFkZEJ1dHRvbik7Ci0JCXJlbW92ZUZyb21FbmFibGVtZW50Q29udHJvbChhZGRCdXR0b24pOworCQl0aGlzLmFkZEJ1dHRvbiA9IGFkZEFkZEJ1dHRvbihjb250YWluZXIpOworCQlhZGRBbGlnblJpZ2h0KHRoaXMuYWRkQnV0dG9uKTsKIAogCQkvLyBDdXN0b20gYnV0dG9uCiAJCWFkZEN1c3RvbUJ1dHRvbkFmdGVyQWRkQnV0dG9uKGNvbnRhaW5lciwgaGVscElkKTsKIAogCQkvLyBPcHRpb25hbCBidXR0b24KLQkJaWYgKGFkYXB0ZXIuaGFzT3B0aW9uYWxCdXR0b24oKSkgewotCQkJb3B0aW9uYWxCdXR0b24gPSBidWlsZE9wdGlvbmFsQnV0dG9uKGNvbnRhaW5lcik7Ci0JCQlyZW1vdmVGcm9tRW5hYmxlbWVudENvbnRyb2wob3B0aW9uYWxCdXR0b24pOwotCQkJYWRkQWxpZ25SaWdodChvcHRpb25hbEJ1dHRvbik7CisJCWlmICh0aGlzLmFkYXB0ZXIuaGFzT3B0aW9uYWxCdXR0b24oKSkgeworCQkJdGhpcy5vcHRpb25hbEJ1dHRvbiA9IGFkZE9wdGlvbmFsQnV0dG9uKGNvbnRhaW5lcik7CisJCQlhZGRBbGlnblJpZ2h0KHRoaXMub3B0aW9uYWxCdXR0b24pOwogCQl9CiAKIAkJLy8gQ3VzdG9tIGJ1dHRvbgogCQlhZGRDdXN0b21CdXR0b25BZnRlck9wdGlvbmFsQnV0dG9uKGNvbnRhaW5lciwgaGVscElkKTsKIAogCQkvLyBSZW1vdmUgYnV0dG9uCi0JCXJlbW92ZUJ1dHRvbiA9IGJ1aWxkUmVtb3ZlQnV0dG9uKGNvbnRhaW5lcik7Ci0JCXJlbW92ZUZyb21FbmFibGVtZW50Q29udHJvbChyZW1vdmVCdXR0b24pOworCQlyZW1vdmVCdXR0b24gPSBhZGRSZW1vdmVCdXR0b24oY29udGFpbmVyKTsKIAkJYWRkQWxpZ25SaWdodChyZW1vdmVCdXR0b24pOwogCiAJCS8vIFVwZGF0ZSB0aGUgaGVscCB0b3BpYyBJRAogCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWhlbHBTeXN0ZW0oKS5zZXRIZWxwKGFkZEJ1dHRvbiwgaGVscElkKTsKLQkJCWhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJlbW92ZUJ1dHRvbiwgaGVscElkKTsKKwkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGFkZEJ1dHRvbiwgaGVscElkKTsKKwkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJlbW92ZUJ1dHRvbiwgaGVscElkKTsKIAogCQkJaWYgKG9wdGlvbmFsQnV0dG9uICE9IG51bGwpIHsKLQkJCQloZWxwU3lzdGVtKCkuc2V0SGVscChvcHRpb25hbEJ1dHRvbiwgaGVscElkKTsKKwkJCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChvcHRpb25hbEJ1dHRvbiwgaGVscElkKTsKIAkJCX0KIAkJfQogCX0KQEAgLTUwNSw3ICs1NzEsNyBAQAogCQkJaGVscElkKTsKIAogCQlpbml0aWFsaXplQnV0dG9uUGFuZShjb250YWluZXIsIGhlbHBJZCk7Ci0JCWVuYWJsZVdpZGdldHMoc3ViamVjdCgpICE9IG51bGwpOworCQllbmFibGVXaWRnZXRzKGdldFN1YmplY3QoKSAhPSBudWxsKTsKIAl9CiAKIAkvKioKQEAgLTUxMyw3ICs1NzksNyBAQAogCSAqLwogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmNvbnRhaW5lciA9IGJ1aWxkU3ViUGFuZShjb250YWluZXIsIDIsIDAsIDAsIDAsIDApOworCQl0aGlzLmNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY29udGFpbmVyLCAyLCAwLCAwLCAwLCAwKTsKIAl9CiAKIAkvKioKQEAgLTU3NywxMCArNjQzLDcgQEAKIAkgKiBAY2F0ZWdvcnkgVXBkYXRlQnV0dG9ucwogCSAqLwogCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFkZEJ1dHRvbihCdXR0b24gYWRkQnV0dG9uKSB7Ci0JCWFkZEJ1dHRvbi5zZXRFbmFibGVkKAotCQkJZW5hYmxlZCAmJgotCQkJc3ViamVjdCgpICE9IG51bGwKLQkJKTsKKwkJYWRkQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVRhYmxlUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVUYWJsZVBhbmUuamF2YQppbmRleCA0ZDE2Njc2Li5hNTUwM2M5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVRhYmxlUGFuZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlVGFibGVQYW5lLmphdmEKQEAgLTczLDcgKzczLDcgQEAKIAkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKIAkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKIAkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlVGFibGVQYW5lKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKKwlwdWJsaWMgQWRkUmVtb3ZlVGFibGVQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKQEAgLTEwMSw3ICsxMDEsNyBAQAogCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwogCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQogCSAqLwotCXB1YmxpYyBBZGRSZW1vdmVUYWJsZVBhbmUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAorCXB1YmxpYyBBZGRSZW1vdmVUYWJsZVBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLApAQCAtMTMwLDcgKzEzMCw3IEBACiAJICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCiAJICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCiAJICovCi0JcHVibGljIEFkZFJlbW92ZVRhYmxlUGFuZShBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKKwlwdWJsaWMgQWRkUmVtb3ZlVGFibGVQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKIAkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKIAkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlVGFibGVQYW5lKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAorCXB1YmxpYyBBZGRSZW1vdmVUYWJsZVBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKQEAgLTI0OSwxMSArMjQ5LDkgQEAKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKQogCXsKLQkJdGFibGUgPSBidWlsZFRhYmxlKGNvbnRhaW5lciwgaGVscElkKTsKKwkJdGFibGUgPSBhZGRVbm1hbmFnZWRUYWJsZShjb250YWluZXIsIGhlbHBJZCk7CiAJCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CiAKLQkJcmVtb3ZlRnJvbUVuYWJsZW1lbnRDb250cm9sKHRhYmxlKTsKLQogCQlUYWJsZU1vZGVsQWRhcHRlcjxPYmplY3Q+IHRhYmxlTW9kZWwgPSBUYWJsZU1vZGVsQWRhcHRlci5hZGFwdCgKIAkJCShMaXN0VmFsdWVNb2RlbDxPYmplY3Q+KSBsaXN0SG9sZGVyLAogCQkJYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ2hvb3NlclBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ2hvb3NlclBhbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTNiNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9DaG9vc2VyUGFuZS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CisKKy8qKgorICogQSBjaG9vc2VyIGlzIHNpbXBseSBhIHBhbmUgd2l0aCB0aHJlZSB3aWRnZXRzLCB0aGUgbGFiZWwgb24gdGhlIGxlZnQsIGEgbWFpbgorICogd2lkZ2V0LCB1c3VhbGx5IGEgdGV4dCBmaWVsZCwgYW5kIGEgcmlnaHQgd2lkZ2V0IHdoaWNoIGlzIHVzdWFsbHkgYSBicm93c2UKKyAqIGJ1dHRvbi4KKyAqCisgKiBAc2VlIENsYXNzQ2hvb3NlclBhbmUKKyAqIEBzZWUgUGFja2FnZUNob29zZXJQYW5lCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaG9vc2VyUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUGFuZTxUPgoreworCS8qKgorCSAqIFRoZSBjb250cm9sIHNob3duIGFmdGVyIHRoZSBsYWJlbCAobGVmdCBjb250cm9sKS4KKwkgKi8KKwlwcml2YXRlIENvbnRyb2wgbWFpbkNvbnRyb2w7CisKKwkvKioKKwkgKiBUaGUgY29udHJvbCBzaG93biBhZnRlciB0aGUgbWFpbiBjb250cm9sLgorCSAqLworCXByaXZhdGUgQ29udHJvbCByaWdodENvbnRyb2w7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNob29zZXJQYW5lPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKi8KKwlwdWJsaWMgQ2hvb3NlclBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNob29zZXJQYW5lPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBDaG9vc2VyUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIGJyb3dzZSBidXR0b24uIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieQorCSAqIHtAbGluayAjYnVpbGRSaWdodENvbnRyb2woQ29tcG9zaXRlKX0uCisJICoKKwkgKiBAcmV0dXJuICJCcm93c2UuLi4iCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRCcm93c2VCdXR0b25UZXh0KCkgeworCQlyZXR1cm4gSnB0VWlNZXNzYWdlcy5DaG9vc2VyUGFuZV9icm93c2VCdXR0b247CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgYWN0aW9uIHJlc3BvbnNpYmxlIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiB3aGVuIHRoZSBCcm93c2UgaXMKKwkgKiBjbGlja2VkLgorCSAqCisJICogQHJldHVybiBBIG5ldyA8Y29kZT5SdW5uYWJsZTwvY29kZT4gcGVyZm9ybWluZyB0aGUgYWN0dWFsIGFjdGlvbiBvZiB0aGUKKwkgKiBidXR0b24KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgUnVubmFibGUgYnVpbGRCcm93c2VBY3Rpb24oKTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGxlZnQgY29udHJvbC4gQnkgZGVmYXVsdCBhIGxhYmVsIGlzIGNyZWF0ZWQgYW5kIGl0cyB0ZXh0IGlzCisJICogcmV0cmlldmVkIGJ5IHtAbGluayAjZ2V0TGFiZWxUZXh0KCl9LgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgbGVmdCBjb250cm9sCisJICovCisJcHJvdGVjdGVkIENvbnRyb2wgYWRkTGVmdENvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gYWRkTGFiZWwoY29udGFpbmVyLCBnZXRMYWJlbFRleHQoKSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWFpbiBjb250cm9sIG9mIHRoaXMgcGFuZS4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIG1haW4gY29udHJvbAorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBDb250cm9sIGFkZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgcmlnaHQgY29udHJvbC4gQnkgZGVmYXVsdCBhIGJyb3dzZSBidXR0b24gaXMgY3JlYXRlZCBhbmQgaXRzCisJICogYWN0aW9uIGlzIHBlcmZvcm1lZCBieSB7QGxpbmsgI2J1aWxkQnJvd3NlQWN0aW9uKCl9IGFuZCBpdHMgdGV4dCBpcworCSAqIHJldHJpZXZlZCBieSB7QGxpbmsgI2dldEJyb3dzZUJ1dHRvblRleHQoKX0uCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCByaWdodCBjb250cm9sCisJICovCisJcHJvdGVjdGVkIENvbnRyb2wgYWRkUmlnaHRDb250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJcmV0dXJuIGFkZEJ1dHRvbigKKwkJCWNvbnRhaW5lciwKKwkJCWdldEJyb3dzZUJ1dHRvblRleHQoKSwKKwkJCWJ1aWxkQnJvd3NlQWN0aW9uKCkKKwkJKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgeworCisJCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7CisKKwkJaWYgKCFtYWluQ29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCW1haW5Db250cm9sLnNldEVuYWJsZWQoZW5hYmxlZCk7CisJCX0KKworCQlpZiAoIXJpZ2h0Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXJpZ2h0Q29udHJvbC5zZXRFbmFibGVkKGVuYWJsZWQpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaGVscCB0b3BpYyBJRCBmb3IgdGhlIGNvbnRyb2xzIG9mIHRoaXMgcGFuZS4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQgb3RoZXJ3aXNlIHRoZSBzdWJjbGFzcyBjYW4gcmV0dXJuIGFuIElECisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCW1haW5Db250cm9sICA9IGFkZE1haW5Db250cm9sKGNvbnRhaW5lcik7CisJCXJpZ2h0Q29udHJvbCA9IGFkZFJpZ2h0Q29udHJvbChjb250YWluZXIpOworCisJCWFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlhZGRMZWZ0Q29udHJvbChjb250YWluZXIpLAorCQkJbWFpbkNvbnRyb2wsCisJCQlyaWdodENvbnRyb2wsCisJCQlnZXRIZWxwSWQoKQorCQkpOworCX0KKworCS8qKgorCSAqIFRoZSB0ZXh0IG9mIHRoZSBsYWJlbC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5CisJICoge0BsaW5rICNidWlsZExlZnRDb250cm9sKENvbXBvc2l0ZSl9LgorCSAqCisJICogQHJldHVybiBUaGUgbG9jYWxpemVkIHRleHQgb2YgdGhlIGxlZnQgY29udHJvbCAod2hpY2ggaXMgYSBsYWJlbCBieQorCSAqIGRlZmF1bHQpCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRMYWJlbFRleHQoKTsKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ2xhc3NDaG9vc2VyQ29tYm9QYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0NsYXNzQ2hvb3NlckNvbWJvUGFuZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTUxYWYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0NsYXNzQ2hvb3NlckNvbWJvUGFuZS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5Db250cm9sQ29udGVudEFzc2lzdEhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5GaWVsZERlY29yYXRpb25SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworCisvKioKKyAqIFRoaXMgY2hvb3NlciBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgdHlwZSB3aGVuIGJyb3dzaW5nIGFuZCBpdCBhZGRzIGNvZGUKKyAqIGNvbXBsZXRpb24gc3VwcG9ydCB0byB0aGUgdGV4dCBmaWVsZCwgd2hpY2ggaXMgdGhlIG1haW4gY29tcG9uZW50LgorICogPHA+CisgKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgorICogPHByZT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAorICogfCBMYWJlbDogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCAgfCB8IEJyb3dzZS4uLiB8IHwKKyAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NDaG9vc2VyQ29tYm9QYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBDbGFzc0Nob29zZXJQYW5lPFQ+Cit7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNsYXNzQ2hvb3NlclBhbmU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBDbGFzc0Nob29zZXJDb21ib1BhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNsYXNzQ2hvb3NlclBhbmU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICovCisJcHVibGljIENsYXNzQ2hvb3NlckNvbWJvUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29udHJvbCBhZGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCUNvbXBvc2l0ZSBzdWJQYW5lID0gYWRkU3ViUGFuZShjb250YWluZXIpOworICAgIAlDb21ibyBjb21ibyA9IHRoaXMuYWRkQ2xhc3NDb21ibyhzdWJQYW5lKTsKKwkJSW1hZ2UgaW1hZ2UgPSBGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19DT05URU5UX1BST1BPU0FMKS5nZXRJbWFnZSgpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IGltYWdlLmdldEJvdW5kcygpLndpZHRoOworCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOworCisJCUNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyLmNyZWF0ZUNvbWJvQ29udGVudEFzc2lzdGFudCgKKwkJCWNvbWJvLAorCQkJamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yCisJCSk7CisKKwkJcmV0dXJuIHN1YlBhbmU7CisJfQorCQorCXByb3RlY3RlZCBDb21ibyBhZGRDbGFzc0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJcmV0dXJuIHRoaXMuYWRkRWRpdGFibGVDb21ibygKKwkJCWNvbnRhaW5lciwKKwkJCXRoaXMuYnVpbGRDbGFzc0xpc3RIb2xkZXIoKSwKKwkJCXRoaXMuYnVpbGRUZXh0SG9sZGVyKCksCisJCQl0aGlzLmJ1aWxkQ2xhc3NDb252ZXJ0ZXIoKQorCQkpOworIAl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDbGFzc0xpc3RIb2xkZXIoKTsKKwkKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGRDbGFzc0NvbnZlcnRlcigpOworCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0NsYXNzQ2hvb3NlclBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ2xhc3NDaG9vc2VyUGFuZS5qYXZhCmluZGV4IDllMTgxMDIuLmRmMjYyN2QgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ2xhc3NDaG9vc2VyUGFuZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ2xhc3NDaG9vc2VyUGFuZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMjggKzksNDMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwogCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLk5ld0NsYXNzQ3JlYXRpb25XaXphcmQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0NsYXNzV2l6YXJkUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5GaWVsZERlY29yYXRpb25SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwogCiAvKioKQEAgLTQwLDcgKzU1LDcgQEAKICAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CiAgKiA8cHJlPgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8CisgKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAogICogfCBMYWJlbDogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJyb3dzZS4uLiB8IHwKICAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8CiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgpAQCAtNDksMTIgKzY0LDEyIEBACiAgKiBAc2luY2UgMi4wCiAgKi8KIEBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIENsYXNzQ2hvb3NlclBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEFic3RyYWN0Q2hvb3NlclBhbmU8VD4KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc0Nob29zZXJQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBDaG9vc2VyUGFuZTxUPgogewogCS8qKgogCSAqIFRoZSBjb2RlIGNvbXBsZXRpb24gbWFuYWdlci4KIAkgKi8KLQlwcml2YXRlIEphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvciBqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3I7CisJcHJvdGVjdGVkIEphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvciBqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3I7CiAKIAkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNsYXNzQ2hvb3NlclBhbmU8L2NvZGU+LgpAQCAtNjIsNyArNzcsNyBAQAogCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQogCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKIAkgKi8KLQlwdWJsaWMgQ2xhc3NDaG9vc2VyUGFuZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCisJcHVibGljIENsYXNzQ2hvb3NlclBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKIAkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CiAKIAkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKQEAgLTc1LDEzICs5MCwxMzIgQEAKIAkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKIAkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCiAJICovCi0JcHVibGljIENsYXNzQ2hvb3NlclBhbmUoQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCisJcHVibGljIENsYXNzQ2hvb3NlclBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAogCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKIAkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CiAKIAkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKIAl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbnRyb2wgYWRkTGVmdENvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlIeXBlcmxpbmsgbGFiZWxMaW5rID0gYWRkSHlwZXJsaW5rKGNvbnRhaW5lciwKKwkJCWdldExhYmVsVGV4dCgpLAorCQkJYnVpbGRIeXBlckxpbmtBY3Rpb24oKQorCQkpOworCQlyZXR1cm4gbGFiZWxMaW5rOworCX0KKwkKKwlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSHlwZXJMaW5rQWN0aW9uKCkgeworCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCUNsYXNzQ2hvb3NlclBhbmUudGhpcy5oeXBlckxpbmtTZWxlY3RlZCgpOworCQkJfQorCQl9OworCX0KIAorCXByb3RlY3RlZCB2b2lkIGh5cGVyTGlua1NlbGVjdGVkKCkgeworCQlJVHlwZSB0eXBlID0gZ2V0VHlwZSgpOworCQlpZiAodHlwZSAhPSBudWxsKSB7CisJCQlvcGVuRWRpdG9yKHR5cGUpOwkKKwkJfQorCQllbHNlIGlmIChhbGxvd1R5cGVDcmVhdGlvbigpKXsKKwkJCWNyZWF0ZVR5cGUoKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgSVR5cGUgZ2V0VHlwZSgpIHsKKwkJaWYgKGdldENsYXNzTmFtZSgpID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUlUeXBlIHR5cGUgPSBudWxsOworCQl0cnkgeworCQkJdHlwZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGdldENsYXNzTmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpKTsKKwkJfQorCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKKwkJfQorCQlyZXR1cm4gdHlwZTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHlwZSgpIHsKKwkJTmV3Q2xhc3NXaXphcmRQYWdlIG5ld0NsYXNzV2l6YXJkUGFnZSA9IG5ldyBOZXdDbGFzc1dpemFyZFBhZ2UoKTsKKwkJbmV3Q2xhc3NXaXphcmRQYWdlLnNldFN1cGVyQ2xhc3MoZ2V0U3VwZXJjbGFzc05hbWUoKSwgdHJ1ZSk7CisJCW5ld0NsYXNzV2l6YXJkUGFnZS5zZXRTdXBlckludGVyZmFjZXMoZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpLCB0cnVlKTsKKwkJbmV3Q2xhc3NXaXphcmRQYWdlLnNldFBhY2thZ2VGcmFnbWVudFJvb3QoZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpLCB0cnVlKTsKKwkJaWYgKGdldENsYXNzTmFtZSgpICE9IG51bGwpIHsKKwkJCW5ld0NsYXNzV2l6YXJkUGFnZS5zZXRUeXBlTmFtZShDbGFzc1Rvb2xzLnNob3J0TmFtZUZvckNsYXNzTmFtZWQoZ2V0Q2xhc3NOYW1lKCkpLCB0cnVlKTsKKwkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IENsYXNzVG9vbHMucGFja2FnZU5hbWVGb3JDbGFzc05hbWVkKGdldENsYXNzTmFtZSgpKTsKKwkJCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsKSB7CisJCQkJbmV3Q2xhc3NXaXphcmRQYWdlLnNldFBhY2thZ2VGcmFnbWVudChnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKSwgdHJ1ZSk7CisJCQl9CisJCX0KKwkJTmV3Q2xhc3NDcmVhdGlvbldpemFyZCB3aXphcmQgPSBuZXcgTmV3Q2xhc3NDcmVhdGlvbldpemFyZChuZXdDbGFzc1dpemFyZFBhZ2UsIGZhbHNlKTsKKwkJd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSkpOy8vVE9ETyBTdHJ1Y3R1cmVkU2VsZWN0aW9uCisJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7CisJCWRpYWxvZy5jcmVhdGUoKTsKKwkJaW50IGRSZXN1bHQgPSBkaWFsb2cub3BlbigpOworCQlpZiAoZFJlc3VsdCA9PSBXaW5kb3cuT0spIHsKKwkJCVN0cmluZyBjbGFzc05hbWUgPSAobmV3Q2xhc3NXaXphcmRQYWdlLmdldENyZWF0ZWRUeXBlKCkpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZShnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkpOworCQkJc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpOworCQorCXByb3RlY3RlZCBjaGFyIGdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7CisJCXJldHVybiAnJCc7CisJfQorCQorCS8qKgorCSAqIE92ZXJyaWRlIHRoaXMgdG8gc2V0IGEgc3VwZXJjbGFzcyBpbiB0aGUgTmV3IENsYXNzIHdpemFyZC4gIElmIG5vIGNsYXNzIGlzIGNob3NlbiwgCisJICogY2xpY2tpbmcgdGhlIGh5cGVybGluayBsYWJlbCB3aWxsIG9wZW4gdGhlIG5ldyBjbGFzcyB3aXphcmQuCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlcmNsYXNzTmFtZSgpIHsKKwkJcmV0dXJuICIiOworCX0KKwkKKwkvKioKKwkgKiBPdmVycmlkZSB0aGlzIHRvIHNldCBhIHN1cGVyIGludGVyZmFjZSBpbiB0aGUgTmV3IENsYXNzIHdpemFyZC4gIElmIG5vIGNsYXNzIGlzIGNob3NlbiwgCisJICogY2xpY2tpbmcgdGhlIGh5cGVybGluayBsYWJlbCB3aWxsIG9wZW4gdGhlIG5ldyBjbGFzcyB3aXphcmQuCisJICogQHNlZSBnZXRTdXBlckludGVyZmFjZU5hbWUKKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGdldFN1cGVySW50ZXJmYWNlTmFtZXMoKSB7CisJCXJldHVybiBnZXRTdXBlckludGVyZmFjZU5hbWUoKSAhPSBudWxsID8gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChnZXRTdXBlckludGVyZmFjZU5hbWUoKSkgOiBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5TGlzdCgpOworCX0KKwkKKwkvKioKKwkgKiBPdmVycmlkZSB0aGlzIHRvIHNldCBhIHN1cGVyIGludGVyZmFjZSBpbiB0aGUgTmV3IENsYXNzIHdpemFyZC4gIElmIG5vIGNsYXNzIGlzIGNob3NlbiwgCisJICogY2xpY2tpbmcgdGhlIGh5cGVybGluayBsYWJlbCB3aWxsIG9wZW4gdGhlIG5ldyBjbGFzcyB3aXphcmQuCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlckludGVyZmFjZU5hbWUoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBPdmVycmlkZSB0aGlzIGlmIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gYWxsb3cgdGhlIHVzZXIgdG8gY3JlYXRlIGEgbmV3IHR5cGUuCisJICogVGhpcyB3aWxsIGRldGVybWluZSB3aGV0aGVyIGNsaWNraW5nIHRoZSBoeXBlcmxpbmsgb3BlbnMgdGhlIE5ldyBDbGFzcyB3aXphcmQKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dUeXBlQ3JlYXRpb24oKSB7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBvcGVuRWRpdG9yKElUeXBlIHR5cGUpIHsKKwkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gdHlwZS5nZXRQYXJlbnQoKTsKKwkJdHJ5IHsKKwkJCUphdmFVSS5vcGVuSW5FZGl0b3IoamF2YUVsZW1lbnQsIHRydWUsIHRydWUpOworCQl9CisJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJSnB0VWlQbHVnaW4ubG9nKGUpOworCQl9CisJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7CisJCQlKcHRVaVBsdWdpbi5sb2coZSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCk7CisJCiAJLyoqCiAJICoge0Bpbmhlcml0RG9jfQogCSAqLwpAQCAtOTgsMTYgKzIzMiwyMSBAQAogCSAqIHtAaW5oZXJpdERvY30KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBidWlsZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwlwcm90ZWN0ZWQgQ29udHJvbCBhZGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCUNvbXBvc2l0ZSBzdWJQYW5lID0gYWRkU3ViUGFuZShjb250YWluZXIpOworCQlUZXh0IHRleHQgPSBhZGRUZXh0KHN1YlBhbmUsIGJ1aWxkVGV4dEhvbGRlcigpKTsKIAotCQlUZXh0IHRleHQgPSBidWlsZFRleHQoY29udGFpbmVyLCBidWlsZFRleHRIb2xkZXIoKSk7CisJCUltYWdlIGltYWdlID0gRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuZ2V0RGVmYXVsdCgpLmdldEZpZWxkRGVjb3JhdGlvbihGaWVsZERlY29yYXRpb25SZWdpc3RyeS5ERUNfQ09OVEVOVF9QUk9QT1NBTCkuZ2V0SW1hZ2UoKTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSBpbWFnZS5nZXRCb3VuZHMoKS53aWR0aDsKKwkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwogCiAJCUNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyLmNyZWF0ZVRleHRDb250ZW50QXNzaXN0YW50KAogCQkJdGV4dCwKIAkJCWphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcgogCQkpOwogCi0JCXJldHVybiB0ZXh0OworCQlyZXR1cm4gc3ViUGFuZTsKIAl9CiAKIAkvKioKQEAgLTEyNSw3ICsyNjQsNyBAQAogCSAqLwogCXByb3RlY3RlZCBJVHlwZSBjaG9vc2VUeXBlKCkgewogCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290KCk7CisJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7CiAKIAkJaWYgKHJvb3QgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CkBAIC0xMzgsMTIgKzI3NywxMiBAQAogCiAJCXRyeSB7CiAJCQl0eXBlU2VsZWN0aW9uRGlhbG9nID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coCi0JCQkJc2hlbGwoKSwKKwkJCQlnZXRTaGVsbCgpLAogCQkJCXNlcnZpY2UsCiAJCQkJc2NvcGUsCi0JCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsCisJCQkJZ2V0VHlwZURpYWxvZ1N0eWxlKCksCiAJCQkJZmFsc2UsCi0JCQkJY2xhc3NOYW1lKCkgIT0gbnVsbCA/IENsYXNzVG9vbHMuc2hvcnROYW1lRm9yQ2xhc3NOYW1lZChjbGFzc05hbWUoKSkgOiAiIgorCQkJCWdldENsYXNzTmFtZSgpICE9IG51bGwgPyBDbGFzc1Rvb2xzLnNob3J0TmFtZUZvckNsYXNzTmFtZWQoZ2V0Q2xhc3NOYW1lKCkpIDogIiIKIAkJCSk7CiAJCX0KIAkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CkBAIC0xNjEsMTIgKzMwMCwxNiBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAKKwlwcm90ZWN0ZWQgaW50IGdldFR5cGVEaWFsb2dTdHlsZSgpIHsKKwkJcmV0dXJuIElKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9DTEFTU0VTOworCX0KKwkKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSBjbGFzcyBuYW1lIGZyb20gaXRzIHN1YmplY3QuCiAJICoKIAkgKiBAcmV0dXJuIFRoZSBjbGFzcyBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMgZGVmaW5lZAogCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgY2xhc3NOYW1lKCk7CisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDbGFzc05hbWUoKTsKIAogCS8qKgogCSAqIHtAaW5oZXJpdERvY30KQEAgLTE5NCwxOCArMzM3LDM2IEBACiAJICogQHJldHVybiBFaXRoZXIgdGhlIHJvb3Qgb2YgdGhlIHBhY2thZ2UgZnJhZ21lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQKIAkgKiBjYW4ndCBiZSByZXRyaWV2ZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCgpOworCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkgeworCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKKwkJSUphdmFQcm9qZWN0IHJvb3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CisKKwkJdHJ5IHsKKwkJCXJldHVybiByb290LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07CisJCX0KKwkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlKcHRVaVBsdWdpbi5sb2coZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQogCiAJLyoqCiAJICogVGhlIGJyb3dzZSBidXR0b24gd2FzIGNsaWNrZWQsIGl0cyBhY3Rpb24gaW52b2tlcyB0aGlzIGFjdGlvbiB3aGljaCBzaG91bGQKIAkgKiBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgY2xhc3MgYW5kIHNldCBpdC4KIAkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9tcHRUeXBlKCk7CisJcHJvdGVjdGVkIHZvaWQgcHJvbXB0VHlwZSgpIHsKKwkJSVR5cGUgdHlwZSA9IHRoaXMuY2hvb3NlVHlwZSgpOwogCisJCWlmICh0eXBlICE9IG51bGwpIHsKKwkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZShnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkpOworCQkJc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7CisJCX0KKwl9CisJCiAJcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhY2thZ2VGcmFnbWVudCgpIHsKIAotCQlpZiAoc3ViamVjdCgpICE9IG51bGwpIHsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290KCk7CisJCWlmIChnZXRTdWJqZWN0KCkgIT0gbnVsbCkgeworCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKIAogCQkJaWYgKHJvb3QgIT0gbnVsbCkgewogCQkJCWphdmFUeXBlQ29tcGxldGlvblByb2Nlc3Nvci5zZXRQYWNrYWdlRnJhZ21lbnQocm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpKTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRGVmYXVsdFdpZGdldEZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRGVmYXVsdFdpZGdldEZhY3RvcnkuamF2YQppbmRleCBmZWI3NWE5Li5hZTIzZjBjIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0RlZmF1bHRXaWRnZXRGYWN0b3J5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9EZWZhdWx0V2lkZ2V0RmFjdG9yeS5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EYXRlVGltZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwpAQCAtMTA3LDYgKzEwOCwxMyBAQAogCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAkJcmV0dXJuIG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7CiAJfQorCQorCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlwdWJsaWMgRGF0ZVRpbWUgY3JlYXRlRGF0ZVRpbWUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7CisJCXJldHVybiBuZXcgRGF0ZVRpbWUocGFyZW50LCBzdHlsZSk7CisJfQogCiAJLyoqCiAJICoge0Bpbmhlcml0RG9jfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9EaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzMDAxNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRGlhbG9nLmphdmEKQEAgLTAsMCArMSwzNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07CisKKy8qKgorICogVGhlIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgZGlhbG9nIHVzaW5nIGEgInN0YXRlIG9iamVjdCIgKG1vZGVsIG9iamVjdCkKKyAqIGZvciBiZWhhdmlvci4KKyAqIDxwPgorICogVGhlIG1haW4gcGFuZSBvZiB0aGlzIGRpYWxvZyBzaG91bGQgYmUgZXh0ZW5kaW5nIDxjb2RlPkRpYWxvZ1BhbmU8L2NvZGU+CisgKiBmb3IgY3JlYXRpbmcgdGhlIHJpZ2h0IHR5cGUgb2Ygd2lkZ2V0cyBhbmQgaXQgaGFzIHRoZSAic3RhdGUgb2JqZWN0IiAoc3ViamVjdCkKKyAqIGJlaGF2aW9yIGJ1aWx0LWluLgorICoKKyAqIEBzZWUgTm9kZQorICogQHNlZSBEaWFsb2dQYW5lCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGFic3RyYWN0IGNsYXNzIERpYWxvZzxUIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cKK3sKKwkvKioKKwkgKiBUaGUgbWFpbiBjb250ZW50IHBhbmUgb2YgdGhpcyBkaWFsb2cuCisJICovCisJcHJpdmF0ZSBEaWFsb2dQYW5lPD8+IHBhbmU7CisKKwkvKioKKwkgKiBUaGUgaG9sZGVyIG9mIHRoZSAic3RhdGUgb2JqZWN0IiB1c2VkIGJ5IHRoaXMgZGlhbG9nLgorCSAqLworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlcjsKKworCS8qKgorCSAqIENhY2hlcyB0aGUgdGl0bGUgdGV4dCB1bnRpbCB0aGUgZGlhbG9nIGlzIGNyZWF0ZWQgYW5kIHRoZSBkaWFsb2cncyBzaGVsbAorCSAqIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpYWxvZzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKKwkgKi8KKwlwcm90ZWN0ZWQgRGlhbG9nKFNoZWxsIHBhcmVudCkgeworCQl0aGlzKHBhcmVudCwgIiIpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlhbG9nPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAorCSAqIEBwYXJhbSB0aXRsZSBUaGUgZGlhbG9nJ3MgdGl0bGUKKwkgKi8KKwlwcm90ZWN0ZWQgRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMudGl0bGUgPSB0aXRsZTsKKwkJaW5pdGlhbGl6ZSgpOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIHRoZSBtYWluIHBhbmUgb2YgdGhpcyBkaWFsb2cuIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgb25seQorCSAqIHdoZW4gdGhlIGRpYWxvZyBpcyByZXF1ZXN0ZWQgdG8gc2hvdyBvbiBzY3JlZW4gYW5kIG5vdCBkdXJpbmcKKwkgKiBpbml0aWFsaXphdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciB0byB3aGljaCB0aGUgd2lkZ2V0cyBzaG91bGQgYmUgYWRkZWQgdG8sCisJICogdGhlIGxheW91dCBpcyBhbHJlYWR5IHNldAorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCBEaWFsb2dQYW5lPD8+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgc3RhdGUgb2JqZWN0IChtb2RlbCBvYmplY3QpIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGtlZXAgdHJhY2sKKwkgKiBvZiB0aGUgaW5mb3JtYXRpb24gZW50ZXJlZCBpbiB0aGlzIGRpYWxvZy4gVGhlIHN0YXRlIG9iamVjdCB3aWxsIGJlIHN0b3JlZAorCSAqIGluIHRoZSBzdWJqZWN0IGhvbGRlciBhbmQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB7QGxpbmsgI3N1YmplY3QoKX0uCisJICoKKwkgKiBAcmV0dXJuIEEgbmV3IHN0YXRlIG9iamVjdAorCSAqLworCXByb3RlY3RlZCBUIGJ1aWxkU3RhdGVPYmplY3QoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIDxjb2RlPlZhbGlkYXRvcjwvY29kZT4gdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gY2hhbmdlcyBhcmUKKwkgKiBtYWRlIHRvIHRoZSBzdGF0ZSBvYmplY3QuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIHNldCBvbiB0aGUgc3RhdGUgb2JqZWN0CisJICovCisJTm9kZS5WYWxpZGF0b3IgYnVpbGRWYWxpZGF0b3IoKSB7CisJCXJldHVybiBOb2RlLk5VTExfVkFMSURBVE9SOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgeworCisJCS8vIERpc3Bvc2UgdGhlIHBhbmUgaW4gb3JkZXIgdG8gcmVtb3ZlIGFueSBsaXN0ZW5lcnMgdGhhdCBjb3VsZAorCQkvLyBoYXZlIGJlZW4gaW5zdGFsbGVkIG91dHNpZGUgdGhlIHNjcm9wZSBvZiB0aGUgc3RhdGUgb2JqZWN0CisJCWlmIChwYW5lICE9IG51bGwpIHsKKwkJCXBhbmUuZGlzcG9zZSgpOworCQkJcGFuZSA9IG51bGw7CisJCX0KKworCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKKwkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOworCQlzaGVsbC5zZXRUZXh0KGdldFRpdGxlKCkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7CisJCXN1cGVyLmNyZWF0ZSgpOworCQlpbnN0YWxsU3ViamVjdCgpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJaWYgKGhhc1RpdGxlQXJlYSgpKSB7CisJCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKKwkJfQorCisJCXJldHVybiBjcmVhdGVEZWZhdWx0Q29udGVudChwYXJlbnQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgbWFpbiBjb250YWluZXIgb2YgdGhpcyBkaWFsb2cgd2hlbiB0aGUgdGl0bGUgYXJlYSBpcworCSAqIG5vdCByZXF1aXJlZC4gVGhlIHRvcCBwYXJ0IGlzIHRoZSBkaWFsb2cgYXJlYSBwb3B1bGF0ZWQgYnkgdGhlIHN1YmNsYXNzCisJICogYW5kIHRoZSBsb3dlciBwYXJ0IGlzIHRoZSBidXR0b24gcGFuZSBoYXZpbmcgdGhlIE9LIGFuZCBDYW5jZWwgYnV0dG9ucy4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcmV0dXJuIFRoZQorCSAqLworCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZURlZmF1bHRDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKKworCQlHcmlkTGF5b3V0IGxheW91dCAgICAgID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ICAgID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoICAgICA9IDA7CisJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOworCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKworCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKKwkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXBvc2l0ZSk7CisJCWRpYWxvZ0FyZWEgPSBjcmVhdGVEaWFsb2dBcmVhKGNvbXBvc2l0ZSk7CisJCWJ1dHRvbkJhciAgPSBjcmVhdGVCdXR0b25CYXIoY29tcG9zaXRlKTsKKworCQlyZXR1cm4gY29tcG9zaXRlOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJLy8gSWYgdGhlIHRpdGxlIGFyZWEgbmVlZHMgdG8gYmUgc2hvd24sIHRoZW4gbGVhdmUgdGhlIHN1cGVyY2xhc3MgdG8KKwkJLy8gY3JlYXRlIHRoZSBuZWNlc3Nhcnkgd2lkZ2V0cworCQlpZiAoaGFzVGl0bGVBcmVhKCkpIHsKKwkJCXBhcmVudCA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKKwkJfQorCisJCS8vIENyZWF0ZSB0aGUgbWFpbiBhcmVhJ3MgY29udGFpbmVyCisJCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOworCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7CisKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7CisJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ICAgICAgICAgPSBHcmlkRGF0YS5GSUxMOworCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgICA9IHRydWU7CisJCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKworCQkvLyBJbml0aWFsaXplIHRoZSBjb250ZW50IHBhbmUKKwkJcGFuZSA9IGJ1aWxkTGF5b3V0KGNvbnRhaW5lcik7CisKKwkJLy8gSW5pdGlhbGl6ZSB0aGUgVUkgcGFydCwgd2hpY2ggcmVxdWlyZXMgdGhlIHdpZGdldHMgYmVpbmcgY3JlYXRlZAorCQlpbml0aWFsaXplVUkoKTsKKworCQlyZXR1cm4gcGFyZW50OworCX0KKworCS8qKgorCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGVzY3JpcHRpb24gYXJlYSAod2hlcmUgYSB0aXRsZSwgZGVzY3JpcHRpb24gYW5kCisJICogaW1hZ2UpIHNob3VsZCBiZSB2aXNpYmxlIG9yIGhpZGRlbi4gPGNvZGU+VmFsaWRhdGluZ0RpYWxvZzwvY29kZT4KKwkgKiBhdXRvbWF0aWNhbGx5IHNob3cgdGhlIGRlc2NyaXB0aW9uIGFyZWEgaW4gb3JkZXIgdG8gc2hvdyBwcm9ibGVtcy4KKwkgKgorCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGJ5IGRlZmF1bHQsIHdoaWNoIG1lYW5zIHRoZSBtZXRob2RzIHVzZWQgdG8KKwkgKiB1cGRhdGUgdGhlIHRpdGxlLCBkZXNjcmlwdGlvbiBhbmQgaW1hZ2Ugc2hvdWxkbid0IGJlIGNhbGxlZDsgPGNvZGU+dHJ1ZTwvY29kZT4KKwkgKiB0byBtYWtlIHRoZSBkZXNjcmlwdGlvbiBwYW5lIHZpc2libGUKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNUaXRsZUFyZWEoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBoZWxwcyBzeXN0ZW0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBwbGF0Zm9ybSdzIGhlbHAgc3lzdGVtCisJICoKKwkgKiBAY2F0ZWdvcnkgSGVscGVyCisJICovCisJcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGdldEhlbHBTeXN0ZW0oKSB7CisJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGlzIGRpYWxvZy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQl0aGlzLnN1YmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+KCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgdGhlIFVJIHBhcnQgb2YgdGhpcyBkaWFsb2csIHRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSB3aWRnZXRzCisJICogaGF2ZSBiZWVuIGNyZWF0ZWQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVVJKCkgeworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIHN0YXRlIG9iamVjdCwgaWYgb25lIGlzIG5lZWRlZCBhbmQgaW5zdGFsbCBhIDxjb2RlPlZhbGlkYXRvcjwvY29kZT4KKwkgKiBpbiBvcmRlciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIGRvbmUgdG8gdGhhdCBzdGF0ZSBvYmplY3QuIFRoZQorCSAqIHN1YmplY3QgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBzdWJqZWN0IGhvbGRlci4KKwkgKi8KKwlwcml2YXRlIHZvaWQgaW5zdGFsbFN1YmplY3QoKSB7CisKKwkJVCBzdWJqZWN0ID0gYnVpbGRTdGF0ZU9iamVjdCgpOworCisJCWlmIChzdWJqZWN0ICE9IG51bGwpIHsKKwkJCXN1YmplY3Quc2V0VmFsaWRhdG9yKGJ1aWxkVmFsaWRhdG9yKCkpOworCQl9CisKKwkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShzdWJqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBBc3luY2hyb25vdXNseSBsYXVuY2hlcyB0aGlzIGRpYWxvZyBpbiB0aGUgVUkgdGhyZWFkLgorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIG9wZW5EaWFsb2coKSB7CisJCVNXVFV0aWwuc2V0VXNlckludGVyZmFjZUFjdGl2ZShmYWxzZSk7CisJCVNXVFV0aWwuc2hvdyh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBBc3luY2hyb25vdXNseSBsYXVuY2hlcyB0aGlzIGRpYWxvZyBpbiB0aGUgVUkgdGhyZWFkIGFuZCBpbnZva2UgdGhlIGdpdmVuCisJICogPGNvZGU+UG9zdEV4ZWN1dGlvbjwvY29kZT4gdG8gcGVyZm9ybSBhbnkgcG9zdC10YXNrLgorCSAqCisJICogQHBhcmFtIHBvc3RFeGVjdXRpb24gVGhpcyBpbnRlcmZhY2UgbGV0IHRoZSBjYWxsZXIgdG8gaW52b2tlIGEgcGllY2Ugb2YKKwkgKiBjb2RlIG9uY2UgdGhlIGRpYWxvZyBpcyBkaXNwb3NlZAorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIG9wZW5EaWFsb2coUG9zdEV4ZWN1dGlvbjw/IGV4dGVuZHMgRGlhbG9nPFQ+PiBleGVjdXRpb24pIHsKKwkJU1dUVXRpbC5zZXRVc2VySW50ZXJmYWNlQWN0aXZlKGZhbHNlKTsKKwkJU1dUVXRpbC5zaG93KHRoaXMsIGV4ZWN1dGlvbik7CisJfQorCisJLyoqCisJICogR2l2ZXMgYWNjZXNzIHRvIHRoZSBkaWFsb2cncyBtYWluIHBhbmUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBwYW5lIHNob3dpbmcgdGhlIGN1c3RvbSB3aWRnZXRzCisJICovCisJcHJvdGVjdGVkIERpYWxvZ1BhbmU8Pz4gZ2V0UGFuZSgpIHsKKwkJcmV0dXJuIHBhbmU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc3ViamVjdCBvZiB0aGlzIGRpYWxvZy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHN1YmplY3Qgb2YgdGhpcyBkaWFsb2cgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3ViamVjdCB3YXMKKwkgKiB1c2VkCisJICovCisJcHVibGljIFQgZ2V0U3ViamVjdCgpIHsKKwkJcmV0dXJuIHN1YmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzdWJqZWN0IGhvbGRlciB1c2VkIHRvIGJlIHBhc3NlZCB0byB0aGUgZGlhbG9nIHBhbmUsIHdoaWNoIGlzCisJICogYW4gaW5zdGFuY2Ugb2YgPGNvZGU+RGlhbG9nUGFuZTwvY29kZT4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IGdldFN1YmplY3RIb2xkZXIoKSB7CisJCXJldHVybiBzdWJqZWN0SG9sZGVyOworCX0KKworCS8qKgorCSAqIFJldHJpZXZlcyB0aGUgZGlhbG9nJ3MgdGl0bGUuIFRoZSB0aXRsZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIHdpbGwgYmUKKwkgKiByZXR1cm5lZCBieSBkZWZhdWx0IGJ1dCBpZiBpdCB3YXNuJ3Qgc3BlY2lmaWVkLCB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZAorCSAqIHRvIHJldHVybiBpdC4KKwkgKgorCSAqIEByZXR1cm4gRWl0aGVyIHRoZSB0aXRsZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIG9yIGEgZGlmZmVyZW50IHRpdGxlCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKKwkJcmV0dXJuIHRpdGxlOworCX0KKworCS8qKgorCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGlhbG9nIHdhcyBjYW5jZWxsZWQgb3Igbm90LgorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGlhbG9nIHdhcyBjYW5jZWxsZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgorCSAqIGlmIGl0IHdhcyBjb25maXJtZWQKKwkgKi8KKwlwdWJsaWMgZmluYWwgYm9vbGVhbiB3YXNDYW5jZWxsZWQoKSB7CisJCXJldHVybiBnZXRSZXR1cm5Db2RlKCkgPT0gQ0FOQ0VMOworCX0KKworCS8qKgorCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGlhbG9nIHdhcyBjb25maXJtZWQgb3Igbm90LgorCSAqCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGlhbG9nIHdhcyBjb25maXJtZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgorCSAqIGlmIGl0IHdhcyBjYW5jZWxsZWQKKwkgKi8KKwlwdWJsaWMgZmluYWwgYm9vbGVhbiB3YXNDb25maXJtZWQoKSB7CisJCXJldHVybiBnZXRSZXR1cm5Db2RlKCkgPT0gT0s7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRGlhbG9nUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9EaWFsb2dQYW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4OTA4NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRGlhbG9nUGFuZS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworLyoqCisgKiBUaGUgYWJzdHJhY3QgcGFuZSB0byB1c2Ugd2hlbiB0aGUgcGFuZSBpcyBzaG93biBpbiBhbiA8Y29kZT5EaWFsb2c8L2NvZGU+LgorICoKKyAqIEBzZWUgRGlhbG9nCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFsb2dQYW5lPFQgZXh0ZW5kcyBOb2RlPiBleHRlbmRzIFBhbmU8VD4geworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWFsb2dQYW5lPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKgorCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgorCSAqLworCXByb3RlY3RlZCBEaWFsb2dQYW5lKERpYWxvZ1BhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpYWxvZ1BhbmU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCisJICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cworCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBjb250cm9sbGVyOworCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQorCSAqCisJICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCisJICovCisJcHJvdGVjdGVkIERpYWxvZ1BhbmUoRGlhbG9nUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlhbG9nUGFuZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKgorCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgorCSAqLworCXByb3RlY3RlZCBEaWFsb2dQYW5lKERpYWxvZ1BhbmU8Pz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlhbG9nUGFuZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKKwkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCisJICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IGNvbnRyb2xsZXI7CisJICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCisJICoKKwkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgRGlhbG9nUGFuZShEaWFsb2dQYW5lPD8+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7CisKKwkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpYWxvZ1BhbmU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqCisJICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCisJICovCisJcHJvdGVjdGVkIERpYWxvZ1BhbmUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgRGVmYXVsdFdpZGdldEZhY3RvcnkuaW5zdGFuY2UoKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRW51bUNvbWJvVmlld2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1Db21ib1ZpZXdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTk5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1Db21ib1ZpZXdlci5qYXZhCkBAIC0wLDAgKzEsMzY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7CisKK2ltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVGhpcyBwYW5lIHNpbXBseSBzaG93cyBhIGNvbWJvIHdoZXJlIGl0cyBkYXRhIGlzIHBvcHVsYXRpbmcgdGhyb3VnaAorICoge0BsaW5rICNjaG9pY2VzKCl9IGFuZCBhIGRlZmF1bHQgdmFsdWUgY2FuIGFsc28gYmUgYWRkZWQuCisgKiA8cD4KKyAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6CisgKiA8cHJlPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgKiB8IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAorICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+CisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMS4wCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorYWJzdHJhY3QgY2xhc3MgRW51bUNvbWJvVmlld2VyPFQgZXh0ZW5kcyBNb2RlbCwgVj4gZXh0ZW5kcyBQYW5lPFQ+Cit7CisJLyoqCisJICogVGhlIG1haW4gd2lkZ2V0IG9mIHRoaXMgcGFuZS4KKwkgKi8KKwlwcml2YXRlIENvbWJvVmlld2VyIGNvbWJvVmlld2VyOworCisJLyoqCisJICogQSBjb25zdGFudCB1c2VkIHRvIHJlcHJlc2VudCB0aGUgPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTF9WQUxVRSA9ICJudWxsIjsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bUNvbWJvVmlld2VyPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cworCSAqLworCUVudW1Db21ib1ZpZXdlcihQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bUNvbWJvVmlld2VyPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cworCSAqLworCUVudW1Db21ib1ZpZXdlcihQYW5lPD8+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bUNvbWJvVmlld2VyPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKKwkgKi8KKwlFbnVtQ29tYm9WaWV3ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7CisKKwkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBsaXN0IG9mIGNob2ljZXMgYW5kIGFkZCBhbiBleHRyYSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUKKwkgKiBkZWZhdWx0IHZhbHVlLgorCSAqCisJICogQHJldHVybiBUaGUgY29tYm8ncyBjaG9pY2VzIGluY2x1ZGluZyB0aGUgZGVmYXVsdCB2YWx1ZQorCSAqLworCXByaXZhdGUgT2JqZWN0W10gYnVpbGRDaG9pY2VzKCkgeworCQlWW10gY2hvaWNlcyA9IGdldENob2ljZXMoKTsKKwkJaWYgKHNvcnRDaG9pY2VzKCkpIHsKKwkJCUFycmF5cy5zb3J0KGNob2ljZXMsIGJ1aWxkQ29tcGFyYXRvcigpKTsKKwkJfQorCisJCU9iamVjdFtdIGV4dGVuZGVkQ2hvaWNlcyA9IG5ldyBPYmplY3RbY2hvaWNlcy5sZW5ndGggKyAxXTsKKwkJU3lzdGVtLmFycmF5Y29weShjaG9pY2VzLCAwLCBleHRlbmRlZENob2ljZXMsIDEsIGNob2ljZXMubGVuZ3RoKTsKKwkJZXh0ZW5kZWRDaG9pY2VzWzBdID0gTlVMTF9WQUxVRTsKKworCQlyZXR1cm4gZXh0ZW5kZWRDaG9pY2VzOworCX0KKworCS8qKgorCSAqIFJldHVybiB0cnVlIHRvIHNvcnQgdGhlIGNob2ljZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyCisJICogQHJldHVybgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyB0aGUgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+IHdpdGggdGhlIHJpZ2h0IGNvbWJvIHdpZGdldHMuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIGNvbWJvCisJICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4gY29udGFpbmluZyB0aGUgcmlnaHQgY29tYm8gd2lkZ2V0CisJICovCisJYWJzdHJhY3QgQ29tYm9WaWV3ZXIgYWRkQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lcik7CisKKwlwcml2YXRlIENvbXBhcmF0b3I8T2JqZWN0PiBidWlsZENvbXBhcmF0b3IoKSB7CisJCXJldHVybiBuZXcgQ29tcGFyYXRvcjxPYmplY3Q+KCkgeworCQkJZmluYWwgTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gYnVpbGRMYWJlbFByb3ZpZGVyKCk7CisKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7CisJCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcxID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KHZhbHVlMSk7CisJCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcyID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KHZhbHVlMik7CisJCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShkaXNwbGF5U3RyaW5nMSwgZGlzcGxheVN0cmluZzIpOworCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIFJldHJpZXZlcyB0aGUgbG9jYWxpemVkIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBOTFMgY2xhc3MgYnkgY3JlYXRpbmcgdGhlCisJICoga2V5LiBUaGF0IGtleSBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgY29tcG9zaXRlJ3Mgc2hvcnQgY2xhc3MgbmFtZQorCSAqIHdpdGggdGhlIHRvU3RyaW5nKCkgb2YgdGhlIGdpdmVuIHZhbHVlIHNlcGFyYXRlZCBieSBhbiB1bmRlcnNjb3JlLgorCSAqCisJICogQHBhcmFtIG5sc0NsYXNzIFRoZSBOTFMgY2xhc3MgdXNlZCB0byByZXRyaWV2ZSB0aGUgbG9jYWxpemVkIHRleHQKKwkgKiBAcGFyYW0gY29tcG9zaXRlQ2xhc3MgVGhlIGNsYXNzIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBrZXksIGl0cyBzaG9ydCBjbGFzcworCSAqIG5hbWUgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUga2V5CisJICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB1c2VkIHRvIGFwcGVuZCBpdHMgdG9TdHJpbmcoKSB0byB0aGUgZ2VuZXJhdGVkIGtleQorCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhDbGFzczw/PiBubHNDbGFzcywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBjb21wb3NpdGVDbGFzcywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKKworCQlyZXR1cm4gU1dUVXRpbC5idWlsZERpc3BsYXlTdHJpbmcobmxzQ2xhc3MsIGNvbXBvc2l0ZUNsYXNzLCB2YWx1ZSk7CisJfQorCisJLyoqCisJICogUmV0cmlldmVzIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGZyb20gdGhlIGdpdmVuIE5MUyBjbGFzcyBieSBjcmVhdGluZyB0aGUKKwkgKiBrZXkuIFRoYXQga2V5IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjb21wb3NpdGUncyBzaG9ydCBjbGFzcyBuYW1lCisJICogd2l0aCB0aGUgdG9TdHJpbmcoKSBvZiB0aGUgZ2l2ZW4gdmFsdWUgc2VwYXJhdGVkIGJ5IGFuIHVuZGVyc2NvcmUuCisJICoKKwkgKiBAcGFyYW0gbmxzQ2xhc3MgVGhlIE5MUyBjbGFzcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBsb2NhbGl6ZWQgdGV4dAorCSAqIEBwYXJhbSBjb21wb3NpdGUgVGhlIG9iamVjdCB1c2VkIHRvIHJldHJpZXZlIHRoZSBzaG9ydCBjbGFzcyBuYW1lIHRoYXQgaXMKKwkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBrZXkKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHVzZWQgdG8gYXBwZW5kIGl0cyB0b1N0cmluZygpIHRvIHRoZSBnZW5lcmF0ZWQga2V5CisJICogQHJldHVybiBUaGUgbG9jYWxpemVkIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZQorCSAqLworCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgYnVpbGREaXNwbGF5U3RyaW5nKENsYXNzPD8+IG5sc0NsYXNzLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb21wb3NpdGUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7CisKKwkJcmV0dXJuIFNXVFV0aWwuYnVpbGREaXNwbGF5U3RyaW5nKG5sc0NsYXNzLCBjb21wb3NpdGUsIHZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkaXNwbGF5IHN0cmluZyBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IGlzIHRoZQorCSAqIHZpcnR1YWwgPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUgdGhlbiBpdHMgZGlzcGxheSBzdHJpbmcgd2lsbCBiZSAiRGVmYXVsdCIKKwkgKiBhcHBlbmRlZCBieSB0aGUgYWN0dWFsIGRlZmF1bHQgdmFsdWUsIGlmIGl0IGV4aXN0cy4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydCBpbnRvIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nCisJICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBlbGVtZW50CisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGREaXNwbGF5U3RyaW5nKE9iamVjdCB2YWx1ZSkgeworCQlpZiAodmFsdWUgPT0gTlVMTF9WQUxVRSkgeworCQkJViBkZWZhdWx0VmFsdWUgPSAoZ2V0U3ViamVjdCgpICE9IG51bGwpID8gZ2V0RGVmYXVsdFZhbHVlKCkgOiBudWxsOworCisJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKKwkJCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9IGRpc3BsYXlTdHJpbmcoZGVmYXVsdFZhbHVlKTsKKwkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNZXNzYWdlcy5FbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdFdpdGhEZWZhdWx0LCBkaXNwbGF5U3RyaW5nKTsKKwkJCX0KKwkJCXJldHVybiBudWxsRGlzcGxheVN0cmluZygpOworCQl9CisKKwkJcmV0dXJuIGRpc3BsYXlTdHJpbmcoKFYpIHZhbHVlKTsKKwl9CisKKwlmaW5hbCBMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKKwkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKGVsZW1lbnQpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgSVNlbGVjdGlvbiBidWlsZFNlbGVjdGlvbigpIHsKKwkJT2JqZWN0IHZhbHVlID0gKGdldFN1YmplY3QoKSAhPSBudWxsKSA/IGdldFZhbHVlKCkgOiBudWxsOworCisJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQl2YWx1ZSA9IE5VTExfVkFMVUU7CisJCX0KKworCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odmFsdWUpOworCX0KKworCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBidWlsZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgeworCQkJCWlmICghaXNQb3B1bGF0aW5nKCkpIHsKKwkJCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKTsKKwkJCQkJdmFsdWVDaGFuZ2VkKHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBvc3NpYmxlIGNob2ljZXMgdG8gc2hvdyBpbiB0aGUgdmlld2VyLgorCSAqCisJICogQHJldHVybiBUaGUgaXRlbXMgdG8gc2hvdyBpbiB0aGUgY29tYm9zCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IFZbXSBnZXRDaG9pY2VzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlLCB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGlmIHRoZSBzdWJqZWN0IGlzCisJICogPGNvZGU+bnVsbDwvY29kZT4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB2YWx1ZSB0aGF0IGlzIGRlY2xhcmVkIGFzIGJlaW5nIHRoZSBkZWZhdWx0IHdoZW4gaXQgaXMgbm90CisJICogZGVmaW5lZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IFYgZ2V0RGVmYXVsdFZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHJhbnNsYXRlIGludG8gYSBodW1hbiByZWFkYWJsZSBzdHJpbmcKKwkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgdGV4dCByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZhbHVlCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkaXNwbGF5U3RyaW5nKFYgdmFsdWUpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIHN0cmluZyBmb3IgYSBudWxsIHZhbHVlLgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbnVsbERpc3BsYXlTdHJpbmcoKSB7CisJCXJldHVybiBudWxsOyAvL0kgd291bGQgcmF0aGVyIGRpc3BsYXkgbm90aGluZyB0aGFuICJEZWZhdWx0KCkiCisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKKwkJc3VwZXIuZG9Qb3B1bGF0ZSgpOworCQl0aGlzLnBvcHVsYXRlQ29tYm8oKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zCisJICoKKwkgKiBAcmV0dXJuCisJICovCisJZmluYWwgQ29tYm9WaWV3ZXIgZ2V0Q29tYm9WaWV3ZXIoKSB7CisJCXJldHVybiBjb21ib1ZpZXdlcjsKKwl9CisKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIHN1YmplY3QncyB2YWx1ZS4gVGhlIHN1YmplY3QgaXMgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzdWJqZWN0JyB2YWx1ZSwgd2hpY2ggY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IFYgZ2V0VmFsdWUoKTsKKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCXRoaXMuY29tYm9WaWV3ZXIgPSB0aGlzLmFkZENvbWJvVmlld2VyKGNvbnRhaW5lcik7CisJCXRoaXMuY29tYm9WaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGJ1aWxkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOworCX0KKworCS8qKgorCSAqIFBvcHVsYXRlcyB0aGUgY29tYm8gYnkgcmUtYWRkaW5nIGFsbCB0aGUgaXRlbXMuCisJICovCisJcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7CisKKwkJcmVtb3ZlQWxsKCk7CisJCWNvbWJvVmlld2VyLmFkZChidWlsZENob2ljZXMoKSk7CisJCXVwZGF0ZVNlbGVjdGlvbigpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOworCQl0aGlzLnBvcHVsYXRlQ29tYm8oKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIGFsbCB0aGUgaXRlbXMgZnJvbSB0aGUgY29tYm8uCisJICovCisJYWJzdHJhY3Qgdm9pZCByZW1vdmVBbGwoKTsKKworCS8qKgorCSAqIFJlcXVlc3RzIHRoZSBnaXZlbiBuZXcgdmFsdWUgYmUgc2V0IG9uIHRoZSBzdWJqZWN0LgorCSAqCisJICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgdG8gYmUgc2V0CisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0VmFsdWUoViB2YWx1ZSk7CisKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBjdXJzb3IsIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHNob3cgdGhlIGVudGlyZSBzZWxlY3RlZCBpdGVtCisJICogd2l0aGluIHRoZSBjb21ibydzIGFyZWEuCisJICovCisJYWJzdHJhY3Qgdm9pZCB1cGRhdGVDdXJzb3IoKTsKKworCS8qKgorCSAqIFVwZGF0ZXMgdGhlIGNvbWJvJ3Mgc2VsZWN0ZWQgaXRlbS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0aW9uKCkgeworCQljb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24oYnVpbGRTZWxlY3Rpb24oKSk7CisJCXVwZGF0ZUN1cnNvcigpOworCX0KKworCS8qKgorCSAqIFRoZSBzZWxlY3Rpb24gY2hhbmdlcywgbm90aWZ5IHRoZSBzdWJjbGFzcyB0byBzZXQgdGhlIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgc2VsZWN0ZWQgaXRlbQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXByaXZhdGUgdm9pZCB2YWx1ZUNoYW5nZWQoT2JqZWN0IHZhbHVlKSB7CisKKwkJLy8gQ29udmVydCB0aGUgZGVmYXVsdCAibnVsbCIgdmFsdWUgdG8gYSByZWFsIG51bGwKKwkJaWYgKHZhbHVlID09IE5VTExfVkFMVUUpIHsKKwkJCXZhbHVlID0gbnVsbDsKKwkJfQorCisJCXNldFBvcHVsYXRpbmcodHJ1ZSk7CisKKwkJdHJ5IHsKKwkJCXNldFZhbHVlKChWKSB2YWx1ZSk7CisJCX0KKwkJZmluYWxseSB7CisJCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRW51bURpYWxvZ0NvbWJvVmlld2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1EaWFsb2dDb21ib1ZpZXdlci5qYXZhCmluZGV4IGFhNjUxNzEuLjZkNDJkZjQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRW51bURpYWxvZ0NvbWJvVmlld2VyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtRGlhbG9nQ29tYm9WaWV3ZXIuamF2YQpAQCAtMTAsNyArMTAsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLldpZGdldEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKQEAgLTIzLDcgKzIyLDcgQEAKICAqIEB2ZXJzaW9uIDIuMAogICogQHNpbmNlIDIuMAogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW51bURpYWxvZ0NvbWJvVmlld2VyPFQgZXh0ZW5kcyBNb2RlbCwgVj4gZXh0ZW5kcyBBYnN0cmFjdEVudW1Db21ib1ZpZXdlcjxULCBWPgorcHVibGljIGFic3RyYWN0IGNsYXNzIEVudW1EaWFsb2dDb21ib1ZpZXdlcjxUIGV4dGVuZHMgTW9kZWwsIFY+IGV4dGVuZHMgRW51bUNvbWJvVmlld2VyPFQsIFY+CiB7CiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtRGlhbG9nQ29tYm9WaWV3ZXI8L2NvZGU+LgpAQCAtMzIsNyArMzEsNyBAQAogCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKIAkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKIAkgKi8KLQlwcm90ZWN0ZWQgRW51bURpYWxvZ0NvbWJvVmlld2VyKEFic3RyYWN0RGlhbG9nUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKKwlwcm90ZWN0ZWQgRW51bURpYWxvZ0NvbWJvVmlld2VyKERpYWxvZ1BhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CiAKIAkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKQEAgLTQ1LDMzICs0NCwxOSBAQAogCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKIAkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKIAkgKi8KLQlwcm90ZWN0ZWQgRW51bURpYWxvZ0NvbWJvVmlld2VyKEFic3RyYWN0RGlhbG9nUGFuZTw/PiBwYXJlbnRQYW5lLAorCXByb3RlY3RlZCBFbnVtRGlhbG9nQ29tYm9WaWV3ZXIoRGlhbG9nUGFuZTw/PiBwYXJlbnRQYW5lLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewogCiAJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CiAJfQogCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtRGlhbG9nQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBFbnVtRGlhbG9nQ29tYm9WaWV3ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCiAJLyoKIAkgKiAobm9uLUphdmFkb2MpCiAJICovCiAJQE92ZXJyaWRlCi0JQ29tYm9WaWV3ZXIgYnVpbGRDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbWJvVmlld2VyIGNvbWJvVmlld2VyID0gYnVpbGRDb21ib1ZpZXdlcihjb250YWluZXIsIGJ1aWxkTGFiZWxQcm92aWRlcigpKTsKKwlDb21ib1ZpZXdlciBhZGRDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCUNvbWJvVmlld2VyIGNvbWJvVmlld2VyID0gYWRkQ29tYm9WaWV3ZXIoY29udGFpbmVyLCBidWlsZExhYmVsUHJvdmlkZXIoKSk7CiAJCWNvbWJvVmlld2VyLmdldENvbWJvKCkuc2V0VmlzaWJsZUl0ZW1Db3VudChJbnRlZ2VyLk1BWF9WQUxVRSk7CiAJCXJldHVybiBjb21ib1ZpZXdlcjsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1Gb3JtQ29tYm9WaWV3ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRW51bUZvcm1Db21ib1ZpZXdlci5qYXZhCmluZGV4IDU5MTg3YjAuLjZmODY3ZDIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRW51bUZvcm1Db21ib1ZpZXdlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRW51bUZvcm1Db21ib1ZpZXdlci5qYXZhCkBAIC0xMCw3ICsxMCw2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87CkBAIC0yMyw3ICsyMiw3IEBACiAgKiBAdmVyc2lvbiAyLjAKICAqIEBzaW5jZSAxLjAKICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVudW1Gb3JtQ29tYm9WaWV3ZXI8VCBleHRlbmRzIE1vZGVsLCBWPiBleHRlbmRzIEFic3RyYWN0RW51bUNvbWJvVmlld2VyPFQsIFY+CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW51bUZvcm1Db21ib1ZpZXdlcjxUIGV4dGVuZHMgTW9kZWwsIFY+IGV4dGVuZHMgRW51bUNvbWJvVmlld2VyPFQsIFY+CiB7CiAJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtRm9ybUNvbWJvVmlld2VyPC9jb2RlPi4KQEAgLTMyLDcgKzMxLDcgQEAKIAkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCiAJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCiAJICovCi0JcHJvdGVjdGVkIEVudW1Gb3JtQ29tYm9WaWV3ZXIoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAorCXByb3RlY3RlZCBFbnVtRm9ybUNvbWJvVmlld2VyKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewogCiAJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CkBAIC00NSwzMyArNDQsMTkgQEAKIAkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCiAJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCiAJICovCi0JcHJvdGVjdGVkIEVudW1Gb3JtQ29tYm9WaWV3ZXIoQWJzdHJhY3RQYW5lPD8+IHBhcmVudFBhbmUsCisJcHJvdGVjdGVkIEVudW1Gb3JtQ29tYm9WaWV3ZXIoUGFuZTw/PiBwYXJlbnRQYW5lLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CiAKIAkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKIAl9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudW1Gb3JtQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBFbnVtRm9ybUNvbWJvVmlld2VyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCiAJLyoKIAkgKiAobm9uLUphdmFkb2MpCiAJICovCiAJQE92ZXJyaWRlCi0JQ29tYm9WaWV3ZXIgYnVpbGRDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbWJvVmlld2VyIGNvbWJvVmlld2VyID0gYnVpbGRDQ29tYm9WaWV3ZXIoY29udGFpbmVyLCBidWlsZExhYmVsUHJvdmlkZXIoKSk7CisJQ29tYm9WaWV3ZXIgYWRkQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlDb21ib1ZpZXdlciBjb21ib1ZpZXdlciA9IGFkZENDb21ib1ZpZXdlcihjb250YWluZXIsIGJ1aWxkTGFiZWxQcm92aWRlcigpKTsKIAkJY29tYm9WaWV3ZXIuZ2V0Q0NvbWJvKCkuc2V0VmlzaWJsZUl0ZW1Db3VudChJbnRlZ2VyLk1BWF9WQUxVRSk7CiAJCXJldHVybiBjb21ib1ZpZXdlcjsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0ZpbGVDaG9vc2VyUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9GaWxlQ2hvb3NlclBhbmUuamF2YQppbmRleCA3NjRhYTAyLi5mMWZmZmMzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0ZpbGVDaG9vc2VyUGFuZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRmlsZUNob29zZXJQYW5lLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKICAqIEBzaW5jZSAyLjAKICAqLwogQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsZUNob29zZXJQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBBYnN0cmFjdENob29zZXJQYW5lPFQ+CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsZUNob29zZXJQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBDaG9vc2VyUGFuZTxUPgogewogCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyOwogCkBAIC01Myw3ICs1Myw3IEBACiAJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCiAJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgogCSAqLwotCXB1YmxpYyBGaWxlQ2hvb3NlclBhbmUoQWJzdHJhY3RQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAorCXB1YmxpYyBGaWxlQ2hvb3NlclBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKIAkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKIAogCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwpAQCAtNjYsNyArNjYsNyBAQAogCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAogCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKIAkgKi8KLQlwdWJsaWMgRmlsZUNob29zZXJQYW5lKEFic3RyYWN0UGFuZTw/PiBwYXJlbnRQYW5lLAorCXB1YmxpYyBGaWxlQ2hvb3NlclBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAogCSAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAogCSAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewogCkBAIC0xMDcsOCArMTA3LDggQEAKIAkgKiAobm9uLUphdmFkb2MpCiAJICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYnVpbGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBidWlsZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyKTsKKwlwcm90ZWN0ZWQgQ29udHJvbCBhZGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCXJldHVybiBhZGRUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlcik7CiAJfQogCiAJcHJpdmF0ZSBQb3N0RXhlY3V0aW9uPEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nPiBidWlsZFNlbGVjdGlvbkRpYWxvZ1Bvc3RFeGVjdXRpb24oKSB7CkBAIC0xNTMsMTQgKzE1MywxNCBAQAogCSAqIEByZXR1cm4gQSBub24tPGNvZGU+bnVsbDwvY29kZT4gc3RyaW5nIHNob3duIGFib3ZlIHRoZSB0ZXh0IGZpZWxkIG9mIHRoZQogCSAqIHNlbGVjdGlvbiBkaWFsb2cKIAkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRpYWxvZ01lc3NhZ2UoKTsKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERpYWxvZ01lc3NhZ2UoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHNlbGVjdGlvbiBkaWFsb2cncyB0aXRsZS4KIAkgKgogCSAqIEByZXR1cm4gQSBub24tPGNvZGU+bnVsbDwvY29kZT4gc3RyaW5nCiAJICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkaWFsb2dUaXRsZSgpOworCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhbG9nVGl0bGUoKTsKIAogCS8qKgogCSAqIFJldHJpZXZlcyB0aGUgcm9vdCBpbnB1dCB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgc2VsZWN0aW9uIGRpYWxvZy4KQEAgLTE4NSwxNSArMTg1LDE1IEBACiAJcHJvdGVjdGVkIHZvaWQgcHJvbXB0RmlsZSgpIHsKIAogCQlFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coCi0JCQlzaGVsbCgpLAorCQkJZ2V0U2hlbGwoKSwKIAkJCW5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCksCiAJCQluZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkKIAkJKTsKIAogCQlkaWFsb2cuc2V0SGVscEF2YWlsYWJsZShmYWxzZSk7CiAJCWRpYWxvZy5zZXRWYWxpZGF0b3IoYnVpbGRWYWxpZGF0b3IoKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShkaWFsb2dUaXRsZSgpKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoZGlhbG9nTWVzc2FnZSgpKTsKKwkJZGlhbG9nLnNldFRpdGxlKGdldERpYWxvZ1RpdGxlKCkpOworCQlkaWFsb2cuc2V0TWVzc2FnZShnZXREaWFsb2dNZXNzYWdlKCkpOwogCQlkaWFsb2cuYWRkRmlsdGVyKGJ1aWxkRmlsdGVyKCkpOwogCQlkaWFsb2cuc2V0SW5wdXQoZ2V0RGlhbG9nSW5wdXQoKSk7CiAJCWRpYWxvZy5zZXRDb21wYXJhdG9yKG5ldyBSZXNvdXJjZUNvbXBhcmF0b3IoUmVzb3VyY2VDb21wYXJhdG9yLk5BTUUpKTsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRm9sZGVyQ2hvb3NlclBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRm9sZGVyQ2hvb3NlclBhbmUuamF2YQppbmRleCA2MTg1NzhiLi4wZmM1M2I2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0ZvbGRlckNob29zZXJQYW5lLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb2xkZXJDaG9vc2VyUGFuZS5qYXZhCkBAIC0zMCw3ICszMCw3IEBACiAgKiBAdmVyc2lvbiAyLjAKICAqIEBzaW5jZSAyLjAKICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZvbGRlckNob29zZXJQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBBYnN0cmFjdENob29zZXJQYW5lPFQ+CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9sZGVyQ2hvb3NlclBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIENob29zZXJQYW5lPFQ+CiB7CiAJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXI7CiAKQEAgLTQwLDcgKzQwLDcgQEAKIAkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKIAkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCiAJICovCi0JcHVibGljIEZvbGRlckNob29zZXJQYW5lKEFic3RyYWN0UGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKKwlwdWJsaWMgRm9sZGVyQ2hvb3NlclBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewogCiAJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CkBAIC01Myw3ICs1Myw3IEBACiAJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CiAJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgogCSAqLwotCXB1YmxpYyBGb2xkZXJDaG9vc2VyUGFuZShBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKKwlwdWJsaWMgRm9sZGVyQ2hvb3NlclBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAogCSAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCiAJICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKIApAQCAtNzYsOCArNzYsOCBAQAogCSAqIHtAaW5oZXJpdERvY30KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBidWlsZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIGJ1aWxkVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIpOworCXByb3RlY3RlZCBDb250cm9sIGFkZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJcmV0dXJuIGFkZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyKTsKIAl9CiAKIAkvKioKQEAgLTkzLDE0ICs5MywxNCBAQAogCSAqIEByZXR1cm4gQSBub24tPGNvZGU+bnVsbDwvY29kZT4gc3RyaW5nIHNob3duIGFib3ZlIHRoZSB0ZXh0IGZpZWxkIG9mIHRoZQogCSAqIHNlbGVjdGlvbiBkaWFsb2cKIAkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRpYWxvZ01lc3NhZ2UoKTsKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERpYWxvZ01lc3NhZ2UoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHNlbGVjdGlvbiBkaWFsb2cncyB0aXRsZS4KIAkgKgogCSAqIEByZXR1cm4gQSBub24tPGNvZGU+bnVsbDwvY29kZT4gc3RyaW5nCiAJICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkaWFsb2dUaXRsZSgpOworCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhbG9nVGl0bGUoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHBhdGggdGhhdCB0aGUgZGlhbG9nIHdpbGwgdXNlIHRvIGZpbHRlciB0aGUgZGlyZWN0b3JpZXMgaXQKQEAgLTEzMiw5ICsxMzIsOSBAQAogCSAqLwogCXByb3RlY3RlZCB2b2lkIHByb21wdEZvbGRlcigpIHsKIAotCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCgpKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoZGlhbG9nTWVzc2FnZSgpKTsKLQkJZGlhbG9nLnNldFRleHQoZGlhbG9nVGl0bGUoKSk7CisJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGdldFNoZWxsKCkpOworCQlkaWFsb2cuc2V0TWVzc2FnZShnZXREaWFsb2dNZXNzYWdlKCkpOworCQlkaWFsb2cuc2V0VGV4dChnZXREaWFsb2dUaXRsZSgpKTsKIAkJZGlhbG9nLnNldEZpbHRlclBhdGgoZmlsdGVyUGF0aCgpKTsKIAkJU3RyaW5nIGRpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRm9ybVBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRm9ybVBhbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDUyNDAyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb3JtUGFuZS5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7CisKKy8qKgorICogVGhlIGFic3RyYWN0IHBhbmUgdG8gdXNlIHdoZW4gdGhlIHBhbmUgaXMgc2hvd24gdXNpbmcgdGhlIGZvcm0gbG9vayBhbmQgZmVlbCwKKyAqIHdoaWNoIGlzIGhhbmRsZWQgYnkgPGNvZGU+VGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk8L2NvZGU+LgorICoKKyAqIEBzZWUgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkKKyAqCisgKiBAdmVyc2lvbiAyLjAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEZvcm1QYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBQYW5lPFQ+Cit7CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Gb3JtUGFuZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICoKKwkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgRm9ybVBhbmUoRm9ybVBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Gb3JtUGFuZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKKwkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCisJICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IGNvbnRyb2xsZXI7CisJICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCisJICoKKwkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgRm9ybVBhbmUoRm9ybVBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Rm9ybVBhbmU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICoKKwkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgRm9ybVBhbmUoRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Gb3JtUGFuZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKKwkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCisJICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IGNvbnRyb2xsZXI7CisJICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCisJICoKKwkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgRm9ybVBhbmUoRm9ybVBhbmU8Pz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZvcm1QYW5lPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cworCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKKwkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgY29udHJvbGxlcjsKKwkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KKwkgKgorCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgorCSAqLworCXByb3RlY3RlZCBGb3JtUGFuZShGb3JtUGFuZTw/PiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBhcmVudE1hbmFnZVBhbmUpIHsKKworCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsIHBhcmVudE1hbmFnZVBhbmUpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Rm9ybVBhbmU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKgorCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgorCSAqLworCXByb3RlY3RlZCBGb3JtUGFuZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Rm9ybVBhbmU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKgorCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgorCSAqLworCXByb3RlY3RlZCBGb3JtUGFuZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtVG9vbGtpdCB3aWRnZXRGYWN0b3J5KSB7CisKKwkJdGhpcyhzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIG5ldyBGb3JtV2lkZ2V0RmFjdG9yeSh3aWRnZXRGYWN0b3J5KSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgYWN0dWFsIHdpZGdldCBmYWN0b3J5IHdyYXBwZWQgYnkgdGhlIDxjb2RlPklXaWRnZXRGYWN0b3J5PC9jb2RlPi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMgd2l0aCB0aGUgZm9ybSBzdHlsZQorCSAqIChmbGF0LXN0eWxlKSBsb29rIGFuZCBmZWVsCisJICovCisJcHJvdGVjdGVkIGZpbmFsIEZvcm1Ub29sa2l0IGdldEZvcm1XaWRnZXRGYWN0b3J5KCkgeworCQlGb3JtV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5ID0gKEZvcm1XaWRnZXRGYWN0b3J5KSBnZXRXaWRnZXRGYWN0b3J5KCk7CisJCXJldHVybiB3aWRnZXRGYWN0b3J5LmdldFdpZGdldEZhY3RvcnkoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb3JtV2lkZ2V0RmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb3JtV2lkZ2V0RmFjdG9yeS5qYXZhCmluZGV4IGRiMzFjMTguLjUyY2YzZGYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvRm9ybVdpZGdldEZhY3RvcnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0Zvcm1XaWRnZXRGYWN0b3J5LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRhdGVUaW1lOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7CkBAIC03MywxNCArNzQsMTQgQEAKIAkgKiB0aGUgYm9yZGVyCiAJICovCiAJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVCb3JkZXJDb250YWluZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gY3JlYXRlQm9yZGVyQ29udGFpbmVyKGNvbnRhaW5lciwgMiwgMSk7CisJfQorCQorCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQm9yZGVyQ29udGFpbmVyKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBtYXJnaW5IZWlnaHQsIGludCBtYXJnaW5XaWR0aCkgewogCiAJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgICAgPSAyOwotCQlsYXlvdXQubWFyZ2luTGVmdCAgID0gMTsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDI7Ci0JCWxheW91dC5tYXJnaW5SaWdodCAgPSAxOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0OworCQlsYXlvdXQubWFyZ2luV2lkdGggID0gbWFyZ2luV2lkdGg7CiAKIAkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKIAkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7CkBAIC05Miw3ICs5Myw3IEBACiAKIAkJcmV0dXJuIGNvbnRhaW5lcjsKIAl9Ci0KKwkKIAkvKioKIAkgKiB7QGluaGVyaXREb2N9CiAJICovCkBAIC0xMjgsNyArMTI5LDcgQEAKIAkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KIAkgKi8KIAlwcm90ZWN0ZWQgQ0NvbWJvIGNyZWF0ZUNDb21ibyhDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcGFyZW50ID0gY3JlYXRlQm9yZGVyQ29udGFpbmVyKHBhcmVudCk7CisJCXBhcmVudCA9IGNyZWF0ZUJvcmRlckNvbnRhaW5lcihwYXJlbnQsIDEsIDEpOwogCiAJCUNDb21ibyBjb21ibyA9IG5ldyBDQ29tYm8ocGFyZW50LCBzdHlsZSk7CiAJCXdpZGdldEZhY3RvcnkuYWRhcHQoY29tYm8sIHRydWUsIGZhbHNlKTsKQEAgLTE2MCw5ICsxNjEsMjEgQEAKIAkgKi8KIAlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7CiAJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotICAgICAgd2lkZ2V0RmFjdG9yeS5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKKwkJd2lkZ2V0RmFjdG9yeS5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKIAkJcmV0dXJuIGNvbXBvc2l0ZTsKIAl9CisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCXB1YmxpYyBEYXRlVGltZSBjcmVhdGVEYXRlVGltZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKKwkJcGFyZW50ID0gY3JlYXRlQm9yZGVyQ29udGFpbmVyKHBhcmVudCk7CisKKwkJRGF0ZVRpbWUgZGF0ZVRpbWUgPSBuZXcgRGF0ZVRpbWUocGFyZW50LCBzdHlsZSB8IFNXVC5GTEFUKTsKKwkJZGF0ZVRpbWUuc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKKwkJdGhpcy53aWRnZXRGYWN0b3J5LmFkYXB0KGRhdGVUaW1lLCB0cnVlLCBmYWxzZSk7CisKKwkJcmV0dXJuIGRhdGVUaW1lOworCX0KIAogCS8qKgogCSAqIHtAaW5oZXJpdERvY30KQEAgLTE3Niw3ICsxODksNiBAQAogCSAqLwogCXB1YmxpYyBDb21ibyBjcmVhdGVFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0JCWNvbWJvLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLCBGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7CiAJCXJldHVybiBjb21ibzsKIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvSW50ZWdlckNvbWJvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0ludGVnZXJDb21iby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZDRmZGYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0ludGVnZXJDb21iby5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgYSBTcGlubmVyLiAgSXQgaXMgYSBjb21ibyB0aGF0IG9ubHkgYWNjZXB0cyBpbnRlZ2Vycy4KKyAqIEl0IGFsc28gaW5jbHVkZXMgYSBEZWZhdWx0IG9wdGlvbiBpbiB0aGUgY29tYm8uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnRlZ2VyQ29tYm88VCBleHRlbmRzIE1vZGVsPgorCWV4dGVuZHMgUGFuZTxUPgoreworCisJLyoqCisJICogVGhlIG1haW4gKG9ubHkpIHdpZGdldCBvZiB0aGlzIHBhbmUuCisJICovCisJcHJpdmF0ZSBDQ29tYm8gY29tYm9Cb3g7CisKKworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVmYXVsdFZhbHVlSG9sZGVyOworCQorCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKKworCXByb3RlY3RlZCBJbnRlZ2VyQ29tYm8oCisJCQkJCQlQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAorCQkJCQkJQ29tcG9zaXRlIHBhcmVudAorCSkgeworCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOworCX0KKworCXByb3RlY3RlZCBJbnRlZ2VyQ29tYm8oCisJCQkJCQlQYW5lPD8+IHBhcmVudFBhbmUsCisJCQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJCQkJCQlDb21wb3NpdGUgcGFyZW50CisJKSB7CisJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7CisJfQorCisJcHVibGljIENDb21ibyBnZXRDb21ibygpIHsKKwkJcmV0dXJuIHRoaXMuY29tYm9Cb3g7CisJfQorCQorCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCXRoaXMuZGVmYXVsdFZhbHVlSG9sZGVyID0gYnVpbGREZWZhdWx0U3RyaW5nSG9sZGVyKCk7CisJCXRoaXMuY29tYm9Cb3ggPSB0aGlzLmFkZEludGVnZXJDb21ibyhjb250YWluZXIpOworCisJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUw7CisJCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKKwkJdGhpcy5jb21ib0JveC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKwkJCisJCXRoaXMuY29tYm9Cb3guYWRkVmVyaWZ5TGlzdGVuZXIodGhpcy5idWlsZFZlcmlmeUxpc3RlbmVyKCkpOworCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIodGhpcy5jb21ib0JveCk7CisJfQorCQorCXByb3RlY3RlZCBDQ29tYm8gYWRkSW50ZWdlckNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKAorCQkJCWNvbnRhaW5lciwKKwkJCQlnZXRMYWJlbFRleHQoKSwKKwkJCQlidWlsZERlZmF1bHRMaXN0SG9sZGVyKCksCisJCQkJYnVpbGRTZWxlY3RlZEl0ZW1TdHJpbmdIb2xkZXIoKSwKKwkJCQlnZXRIZWxwSWQoKQorCQkJCSk7CisJCQorCX0KKwkKKwlwcm90ZWN0ZWQgVmVyaWZ5TGlzdGVuZXIgYnVpbGRWZXJpZnlMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZSkgeworCQkJCUludGVnZXJDb21iby50aGlzLnZlcmlmeUNvbWJvQm94KGUpOworCQkJfQorCQl9OworCX0KKworCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdExpc3RIb2xkZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLmRlZmF1bHRWYWx1ZUhvbGRlcik7CisJfQorCQorCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U3RyaW5nSG9sZGVyKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXIsIFN0cmluZz4oYnVpbGREZWZhdWx0SG9sZGVyKCkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm1fKEludGVnZXIgdmFsdWUpIHsKKwkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKEludGVnZXIgZGVmYXVsdFZhbHVlKSB7CisJCXJldHVybiBOTFMuYmluZCgKKwkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAorCQkJCWRlZmF1bHRWYWx1ZQorCQkJKTsKKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkgeworCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWVIb2xkZXIuZ2V0VmFsdWUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNlbGVjdGVkSXRlbVN0cmluZ0hvbGRlcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXIsIFN0cmluZz4oYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJbnRlZ2VyIHZhbHVlKSB7CisJCQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyAKKwkJCQkJCWdldERlZmF1bHRWYWx1ZVN0cmluZygpCisJCQkJCTogCisJCQkJCQl2YWx1ZS50b1N0cmluZygpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBJbnRlZ2VyIHJldmVyc2VUcmFuc2Zvcm1fKFN0cmluZyB2YWx1ZSkgeworCQkJCWludCBpbnRMZW5ndGg7CisJCQkJdHJ5IHsKKwkJCQkJaW50TGVuZ3RoID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisJCQkJfQorCQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJCQkvL2lmIHRoZSBkZWZhdWx0IGlzIHNlbGVjdGVkIGZyb20gdGhlIGNvbWJvLCBzZXQgbGVuZ3RoIHRvIG51bGwKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoaW50TGVuZ3RoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvLyAqKioqKioqKioqIGFic3RyYWN0IG1ldGhvZHMgKioqKioqKioqKgorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCk7CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRIZWxwSWQoKTsKKworCXByb3RlY3RlZCBhYnN0cmFjdCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCk7CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCk7CisKKwkvLyAqKioqKioqKioqIGNvbWJvLWJveCB2ZXJpZnkgbGlzdGVuZXIgY2FsbGJhY2sgKioqKioqKioqKgorCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5Q29tYm9Cb3goVmVyaWZ5RXZlbnQgZSkgeworCQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ1xiJykgeworCQkJLy9pZ25vcmUgYmFja3NwYWNlCisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGUudGV4dC5lcXVhbHMoIiIpIC8vRGVmYXVsdFZhbHVlSGFuZGxlciBzZXRzIHRoZSB0ZXh0IHRvICIiIC8vJE5PTi1OTFMtMSQKKwkJCQl8fCBlLnRleHQuZXF1YWxzKHRoaXMuZGVmYXVsdFZhbHVlSG9sZGVyLmdldFZhbHVlKCkpKSB7IAorCQkJcmV0dXJuOworCQl9CisJCXRyeSB7CisJCQlJbnRlZ2VyLnBhcnNlSW50KGUudGV4dCk7CisJCX0KKwkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCWUuZG9pdCA9IGZhbHNlOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZURpYWxvZy5qYXZhCmluZGV4IDk2MzJiYTAuLjNmYjgzZjggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZURpYWxvZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZURpYWxvZy5qYXZhCkBAIC0yMyw3ICsyMyw3IEBACiAgKiBAdmVyc2lvbiAyLjAKICAqIEBzaW5jZSAyLjAKICAqLwotcHVibGljIGNsYXNzIE5ld05hbWVEaWFsb2cgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpbmdEaWFsb2c8TmV3TmFtZVN0YXRlT2JqZWN0PgorcHVibGljIGNsYXNzIE5ld05hbWVEaWFsb2cgZXh0ZW5kcyBWYWxpZGF0aW5nRGlhbG9nPE5ld05hbWVTdGF0ZU9iamVjdD4KIHsKIAlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKIAlwcml2YXRlIEltYWdlIGRlc2NyaXB0aW9uSW1hZ2U7CkBAIC02Nyw4ICs2Nyw4IEBACiAJICogKG5vbi1KYXZhZG9jKQogCSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdERpYWxvZ1BhbmU8TmV3TmFtZVN0YXRlT2JqZWN0PiBidWlsZExheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRGlhbG9nUGFuZShjb250YWluZXIpOworCXByb3RlY3RlZCBEaWFsb2dQYW5lPE5ld05hbWVTdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gbmV3IE5ld05hbWVEaWFsb2dQYW5lKGNvbnRhaW5lcik7CiAJfQogCiAJLyoKQEAgLTg2LDcgKzg2LDcgQEAKIAlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7CiAJCXN1cGVyLmNyZWF0ZSgpOwogCi0JCURpYWxvZ1BhbmUgcGFuZSA9IChEaWFsb2dQYW5lKSBwYW5lKCk7CisJCU5ld05hbWVEaWFsb2dQYW5lIHBhbmUgPSAoTmV3TmFtZURpYWxvZ1BhbmUpIGdldFBhbmUoKTsKIAkJcGFuZS5zZWxlY3RBbGwoKTsKIAogCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwpAQCAtOTYsNyArOTYsNyBAQAogCSAqIChub24tSmF2YWRvYykKIAkgKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uKCkgeworCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CiAJCXJldHVybiBkZXNjcmlwdGlvbjsKIAl9CiAKQEAgLTEwNCwxNCArMTA0LDE0IEBACiAJICogKG5vbi1KYXZhZG9jKQogCSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBJbWFnZSBkZXNjcmlwdGlvbkltYWdlKCkgeworCXByb3RlY3RlZCBJbWFnZSBnZXREZXNjcmlwdGlvbkltYWdlKCkgewogCQlyZXR1cm4gZGVzY3JpcHRpb25JbWFnZTsKIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCiAJICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvblRpdGxlKCkgeworCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25UaXRsZSgpIHsKIAkJcmV0dXJuIGRlc2NyaXB0aW9uVGl0bGU7CiAJfQogCkBAIC0xMjEsMTUgKzEyMSwxNSBAQAogCSAqIEByZXR1cm4gVGhlIG5hbWUgdGhlIHVzZXIgZW50ZXJlZAogCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHN1YmplY3QoKS5nZXROYW1lKCk7CisJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0TmFtZSgpOwogCX0KIAotCXByaXZhdGUgY2xhc3MgRGlhbG9nUGFuZSBleHRlbmRzIEFic3RyYWN0RGlhbG9nUGFuZTxOZXdOYW1lU3RhdGVPYmplY3Q+IHsKKwlwcml2YXRlIGNsYXNzIE5ld05hbWVEaWFsb2dQYW5lIGV4dGVuZHMgRGlhbG9nUGFuZTxOZXdOYW1lU3RhdGVPYmplY3Q+IHsKIAogCQlwcml2YXRlIFRleHQgdGV4dDsKIAotCQlEaWFsb2dQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKE5ld05hbWVEaWFsb2cudGhpcy5zdWJqZWN0SG9sZGVyKCksIHBhcmVudCk7CisJCU5ld05hbWVEaWFsb2dQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCXN1cGVyKE5ld05hbWVEaWFsb2cudGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIHBhcmVudCk7CiAJCX0KIAogCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKCkgewpAQCAtMTUyLDcgKzE1Miw3IEBACiAJCUBPdmVycmlkZQogCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKIAotCQkJdGV4dCA9IGJ1aWxkTGFiZWxlZFRleHQoCisJCQl0ZXh0ID0gYWRkTGFiZWxlZFRleHQoCiAJCQkJY29udGFpbmVyLAogCQkJCWxhYmVsVGV4dCwKIAkJCQlidWlsZE5hbWVIb2xkZXIoKQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdOYW1lU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZVN0YXRlT2JqZWN0LmphdmEKaW5kZXggZmI1OTIzMC4uMjI1MjQxMyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdOYW1lU3RhdGVPYmplY3QuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVTdGF0ZU9iamVjdC5qYXZhCkBAIC0xMSw3ICsxMSw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuQWJzdHJhY3ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKQEAgLTc1LDEwICs3NSwxMCBAQAogCXByaXZhdGUgdm9pZCBhZGROYW1lUHJvYmxlbXMoTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKIAogCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk5ld05hbWVTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkKSk7CisJCQljdXJyZW50UHJvYmxlbXMuYWRkKGJ1aWxkUHJvYmxlbShKcHRVaURldGFpbHNNZXNzYWdlcy5OZXdOYW1lU3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZCkpOwogCQl9CiAJCWVsc2UgaWYgKG5hbWVzLmNvbnRhaW5zKG5hbWUudHJpbSgpKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk5ld05hbWVTdGF0ZU9iamVjdF9uYW1lQWxyZWFkeUV4aXN0cykpOworCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oSnB0VWlEZXRhaWxzTWVzc2FnZXMuTmV3TmFtZVN0YXRlT2JqZWN0X25hbWVBbHJlYWR5RXhpc3RzKSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvUGFja2FnZUNob29zZXJQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1BhY2thZ2VDaG9vc2VyUGFuZS5qYXZhCmluZGV4IDhkMWNiMTkuLjA2OTFlZWQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvUGFja2FnZUNob29zZXJQYW5lLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYWNrYWdlQ2hvb3NlclBhbmUuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5jb250ZW50YXNzaXN0LkphdmFQYWNrYWdlQ29tcGxldGlvblByb2Nlc3NvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uUmVnaXN0cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7CkBAIC0yNSw2ICsyNiw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKQEAgLTQ1LDcgKzQ4LDcgQEAKICAqIEB2ZXJzaW9uIDIuMAogICogQHNpbmNlIDIuMAogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFja2FnZUNob29zZXJQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBBYnN0cmFjdENob29zZXJQYW5lPFQ+CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFja2FnZUNob29zZXJQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBDaG9vc2VyUGFuZTxUPgogewogCS8qKgogCSAqIFRoZSBjb2RlIGNvbXBsZXRpb24gbWFuYWdlci4KQEAgLTU4LDcgKzYxLDcgQEAKIAkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKIAkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCiAJICovCi0JcHVibGljIFBhY2thZ2VDaG9vc2VyUGFuZShBYnN0cmFjdFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCisJcHVibGljIFBhY2thZ2VDaG9vc2VyUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewogCiAJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7CkBAIC03MSwxNiArNzQsMTMgQEAKIAkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKIAkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCiAJICovCi0JcHVibGljIFBhY2thZ2VDaG9vc2VyUGFuZShBYnN0cmFjdFBhbmU8Pz4gcGFyZW50UGFuZSwKKwlwdWJsaWMgUGFja2FnZUNob29zZXJQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKIAogCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwogCX0KIAotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwogCUBPdmVycmlkZQogCXByb3RlY3RlZCBmaW5hbCBSdW5uYWJsZSBidWlsZEJyb3dzZUFjdGlvbigpIHsKIAkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKQEAgLTkwLDEyICs5MCw5IEBACiAJCX07CiAJfQogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYnVpbGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KKwlwcm90ZWN0ZWQgQ29udHJvbCBhZGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCUNvbXBvc2l0ZSBzdWJQYW5lID0gYWRkU3ViUGFuZShjb250YWluZXIpOwogCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIgPSBidWlsZFRleHRIb2xkZXIoKTsKIAogCQl0ZXh0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCkBAIC0xMDMsMTQgKzEwMCwxOSBAQAogCQkJYnVpbGRUZXh0Q2hhbmdlTGlzdGVuZXIoKQogCQkpOwogCi0JCVRleHQgdGV4dCA9IGJ1aWxkVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIpOworCQlUZXh0IHRleHQgPSBhZGRUZXh0KHN1YlBhbmUsIHRleHRIb2xkZXIpOworCisJCUltYWdlIGltYWdlID0gRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuZ2V0RGVmYXVsdCgpLmdldEZpZWxkRGVjb3JhdGlvbihGaWVsZERlY29yYXRpb25SZWdpc3RyeS5ERUNfQ09OVEVOVF9QUk9QT1NBTCkuZ2V0SW1hZ2UoKTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSBpbWFnZS5nZXRCb3VuZHMoKS53aWR0aDsKKwkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwogCiAJCUNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyLmNyZWF0ZVRleHRDb250ZW50QXNzaXN0YW50KAogCQkJdGV4dCwKIAkJCWphdmFQYWNrYWdlQ29tcGxldGlvblByb2Nlc3NvcgogCQkpOwogCi0JCXJldHVybiB0ZXh0OworCQlyZXR1cm4gc3ViUGFuZTsKIAl9CiAKIAlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUZXh0Q2hhbmdlTGlzdGVuZXIoKSB7CkBAIC0xMjAsOCArMTIyLDggQEAKIAlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUZXh0Q2hhbmdlTGlzdGVuZXJfKCkgewogCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CiAJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKHN1YmplY3QoKSAhPSBudWxsKSB7Ci0JCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290KCk7CisJCQkJaWYgKGdldFN1YmplY3QoKSAhPSBudWxsKSB7CisJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7CiAKIAkJCQkJaWYgKHJvb3QgIT0gbnVsbCkgewogCQkJCQkJamF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yLnNldFBhY2thZ2VGcmFnbWVudFJvb3Qocm9vdCk7CkBAIC0xNTAsOCArMTUyLDggQEAKIAogCQl0cnkgewogCQkJc2VsZWN0aW9uRGlhbG9nID0gSmF2YVVJLmNyZWF0ZVBhY2thZ2VEaWFsb2coCi0JCQkJc2hlbGwoKSwKLQkJCQlwYWNrYWdlRnJhZ21lbnRSb290KCkKKwkJCQlnZXRTaGVsbCgpLAorCQkJCWdldFBhY2thZ2VGcmFnbWVudFJvb3QoKQogCQkJKTsKIAkJfQogCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKQEAgLTE2Miw3ICsxNjQsNyBAQAogCQlzZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5DbGFzc0Nob29zZXJQYW5lX2RpYWxvZ1RpdGxlKTsKIAkJc2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5DbGFzc0Nob29zZXJQYW5lX2RpYWxvZ01lc3NhZ2UpOwogCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGFjayA9IHBhY2thZ2VGcmFnbWVudCgpOworCQlJUGFja2FnZUZyYWdtZW50IHBhY2sgPSBnZXRQYWNrYWdlRnJhZ21lbnQoKTsKIAogCQlpZiAocGFjayAhPSBudWxsKSB7CiAJCQlzZWxlY3Rpb25EaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbnMobmV3IE9iamVjdFtdIHsgcGFjayB9KTsKQEAgLTE4OCwxNCArMTkwLDE0IEBACiAJCSk7CiAJfQogCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCgpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUoKTsKKwlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KCkgeworCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZSgpOwogCiAJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCi0JCXJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290KCkuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKTsKKwkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKS5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpOwogCX0KIAogCS8qKgpAQCAtMjA0LDE0ICsyMDYsMTQgQEAKIAkgKiBAcmV0dXJuIEVpdGhlciB0aGUgcm9vdCBvZiB0aGUgcGFja2FnZSBmcmFnbWVudCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdAogCSAqIGNhbid0IGJlIHJldHJpZXZlZAogCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290KCk7CisJcHJvdGVjdGVkIGFic3RyYWN0IElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgbmFtZSBmcm9tIGl0cyBzdWJqZWN0LgogCSAqCiAJICogQHJldHVybiBUaGUgcGFja2FnZSBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMgZGVmaW5lZAogCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgcGFja2FnZU5hbWUoKTsKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCk7CiAKIAkvKioKIAkgKiBUaGUgYnJvd3NlIGJ1dHRvbiB3YXMgY2xpY2tlZCwgaXRzIGFjdGlvbiBpbnZva2VzIHRoaXMgYWN0aW9uIHdoaWNoIHNob3VsZApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1BhbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTAwYThkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYW5lLmphdmEKQEAgLTAsMCArMSwzODU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5XaWRnZXRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5UcmFjaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5DQ29tYm9Nb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5Db21ib01vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkRhdGVUaW1lTW9kZWxBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuU3Bpbm5lck1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRleHRGaWVsZE1vZGVsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuQ29udHJvbEFsaWduZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZEJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EYXRlVGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOworCisvKioKKyAqIFRoZSBhYnN0cmFjdCBkZWZpbml0aW9uIG9mIGEgcGFuZSB3aGljaCBob2xkcyBvbnRvIGEgPGNvZGU+UHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPgorICogdGhhdCBjb250YWlucyB0aGUgc3ViamVjdCBvZiB0aGlzIHBhbmUuCisgKiA8cD4KKyAqIEl0IGFsc28gY29udGFpbnMgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgYnVpbGRpbmcgYnV0dG9ucywgbGFiZWxzLCBjaGVjaworICogYm94ZXMsIGFuZCByYWRpbyBidXR0b25zLCBldGMuCisgKiA8cD4KKyAqIEl0IGlzIHBvc3NpYmxlIHRvIGVhc2lseSBsaXN0ZW4gdG8gYW55IHByb3BlcnR5IGNoYW5nZXMgY29taW5nIGZyb20gdGhlCisgKiBzdWJqZWN0LCB7QGxpbmsgI2FkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbil9IGlzIHNwZWNpZnkgd2hpY2ggcHJvcGVydGllcworICogYXJlIG9mIGludGVyZXN0IGFuZCB7QGxpbmsgI3Byb3BlcnR5Q2hhbmdlZChTdHJpbmcpfSBpcyB1c2VkIHRvIG5vdGlmeSB0aGUKKyAqIHBhbmUgd2hlbiB0aGUgcHJvcGVydHkgaGFzIGNoYW5nZWQuCisgKgorICogQHNlZSBGb3JtUGFuZQorICogQHNlZSBEaWFsb2dQYW5lCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGFic3RyYWN0IGNsYXNzIFBhbmU8VCBleHRlbmRzIE1vZGVsPgoreworCS8qKgorCSAqIFRoZSBsaXN0ZW5lciByZWdpc3RlcmVkIHdpdGggdGhlIHN1YmplY3QgaW4gb3JkZXIgdG8gYmUgbm90aWZpZWQgd2hlbiBhCisJICogcHJvcGVydHkgaGFzIGNoYW5nZWQsIHRoZSBwcm9wZXJ0eSBuYW1lcyBhcmUgZGV0ZXJtaW5lZCBieQorCSAqIHtAbGluayAjcHJvcGVydHlOYW1lcygpfS4KKwkgKi8KKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYXNwZWN0Q2hhbmdlTGlzdGVuZXI7CisKKwkvKioKKwkgKiBUaGUgY29udGFpbmVyIG9mIHRoaXMgY29tcG9zaXRlLgorCSAqLworCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsKKworCS8qKgorCSAqIFRoZSBhbGlnbmVyIHJlc3BvbnNpYmxlIHRvIGFsaWduIHRoZSBsZWZ0IGNvbnRyb2xzLgorCSAqLworCXByaXZhdGUgQ29udHJvbEFsaWduZXIgbGVmdENvbnRyb2xBbGlnbmVyOworCisJLyoqCisJICogRmxhZyB1c2VkIHRvIHN0b3AgdGhlIGNpcmN1bGFyIHBvcHVsYXRpb24gb2Ygd2lkZ2V0cy4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gcG9wdWxhdGluZzsKKworCS8qKgorCSAqIFRoZSBhbGlnbmVyIHJlc3BvbnNpYmxlIHRvIGFsaWduIHRoZSBsZWZ0IGNvbnRyb2xzLgorCSAqLworCXByaXZhdGUgQ29udHJvbEFsaWduZXIgcmlnaHRDb250cm9sQWxpZ25lcjsKKworCS8qKgorCSAqIFRoaXMgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzdWJqZWN0IGhvbGRlciBpbiBvcmRlciB0bworCSAqIGF1dG9tYXRpY2FsbHkgcmVwb3B1bGF0ZSB0aGlzIHBhbmUgd2l0aCB0aGUgbmV3IHN1YmplY3QuCisJICovCisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHN1YmplY3RDaGFuZ2VMaXN0ZW5lcjsKKworCS8qKgorCSAqIFRoZSBzdWJqZWN0IG9mIHRoaXMgcGFuZS4KKwkgKi8KKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyOworCisJLyoqCisJICogVGhlIGNvbGxlY3Rpb24gb2YgcmVnaXN0ZXJlZCBzdWItcGFuZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG5vdGlmaWVkCisJICogd2hlbiBsaXN0ZW5lcnMgbmVlZCB0byBiZSBlbmdhZ2VkIG9yIGRpc2VuZ2FnZWQgb3Igd2hlbiB0byBwb3B1bGF0ZSBpdHMKKwkgKiB3aWRnZXRzLgorCSAqLworCXByaXZhdGUgQ29sbGVjdGlvbjxQYW5lPD8+PiBzdWJQYW5lczsKKworCS8qKgorCSAqIFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMuCisJICovCisJcHJpdmF0ZSBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3Rvcnk7CisKKwkvKioKKwkgKiBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sPC9jb2RlPnMgdGhhdCBhcmUgZGlzcGxheWVkIGluIHRoaXMgcGFuZSwKKwkgKiB3aGljaCB3aWxsIGhhdmUgdGhlaXIgZW5hYmxlbWVudCBzdGF0ZSB1cGRhdGVkIHdoZW4KKwkgKiB7QGxpbmsgI2VuYWJsZVdpZGdldHMoYm9vbGVhbil9IGlzIGNhbGxlZC4KKwkgKi8KKwlwcml2YXRlIEFycmF5TGlzdDxDb250cm9sPiBtYW5hZ2VkV2lkZ2V0czsKKwkKKwkvKioKKwkgKiBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5QYW5lPC9jb2RlPnMgdGhhdCBhcmUgZGlzcGxheWVkIGluIHRoaXMgcGFuZSwKKwkgKiB3aGljaCB3aWxsIGhhdmUgdGhlaXIgZW5hYmxlbWVudCBzdGF0ZSB1cGRhdGVkIHdoZW4KKwkgKiB7QGxpbmsgI2VuYWJsZVdpZGdldHMoYm9vbGVhbil9IGlzIGNhbGxlZC4KKwkgKi8KKwlwcml2YXRlIEFycmF5TGlzdDxQYW5lPD8+PiBtYW5hZ2VkU3ViUGFuZXM7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgorCSAqCisJICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisJcHJpdmF0ZSBQYW5lKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICoKKwkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgeworCisJCXRoaXMocGFyZW50UGFuZSwgcGFyZW50LCB0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCisJICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cworCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBwYW5lOworCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQorCSAqCisJICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCisJICovCisJcHJvdGVjdGVkIFBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKKworCQl0aGlzKHBhcmVudFBhbmUsCisJCSAgICAgcGFyZW50UGFuZS5nZXRTdWJqZWN0SG9sZGVyKCksCisJCSAgICAgcGFyZW50LAorCQkgICAgIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKKwkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCisJICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IHBhbmU7CisJICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCisJICoKKwkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywKKwkgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcGFyZW50TWFuYWdlUGFuZSkgeworCisJCXRoaXMocGFyZW50UGFuZSwKKwkJICAgICBwYXJlbnRQYW5lLmdldFN1YmplY3RIb2xkZXIoKSwKKwkJICAgICBwYXJlbnQsCisJCSAgICAgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywKKwkJICAgICBwYXJlbnRNYW5hZ2VQYW5lKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKKwkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICoKKwkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJdGhpcyhwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHRydWUpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKKwkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCisJICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IHBhbmU7CisJICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCisJICoKKwkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCisJICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7CisKKwkJdGhpcyhzdWJqZWN0SG9sZGVyLAorCQkgICAgIHBhcmVudCwKKwkJICAgICBwYXJlbnRQYW5lLmdldFdpZGdldEZhY3RvcnkoKSk7CisKKwkJaW5pdGlhbGl6ZShwYXJlbnRQYW5lLCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzLCB0cnVlKTsKKwl9CisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cworCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKKwkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgcGFuZTsKKwkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KKwkgKiBAcGFyYW0gcGFyZW50TWFuYWdlUGFuZSA8Y29kZT50cnVlPC9jb2RlPiB0byBoYXZlIHRoZSBwYXJlbnQgcGFuZSBtYW5hZ2UKKwkgKiB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGlzIHBhbmUKKwkgKgorCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgorCSAqLworCXByb3RlY3RlZCBQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsIAorCSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwYXJlbnRNYW5hZ2VQYW5lKSB7CisKKwkJdGhpcyhzdWJqZWN0SG9sZGVyLAorCQkgICAgIHBhcmVudCwKKwkJICAgICBwYXJlbnRQYW5lLmdldFdpZGdldEZhY3RvcnkoKSk7CisKKwkJaW5pdGlhbGl6ZShwYXJlbnRQYW5lLCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzLCBwYXJlbnRNYW5hZ2VQYW5lKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0CisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKKwkgKgorCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgorCSAqLworCXByb3RlY3RlZCBQYW5lKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKKworCQlzdXBlcigpOworCisJCXRoaXMuaW5pdGlhbGl6ZShzdWJqZWN0SG9sZGVyLCB3aWRnZXRGYWN0b3J5KTsKKwkJdGhpcy5jb250YWluZXIgPSB0aGlzLmFkZENvbnRhaW5lcihwYXJlbnQpOworCQl0aGlzLmluaXRpYWxpemVMYXlvdXQodGhpcy5jb250YWluZXIpOworCQl0aGlzLmVuZ2FnZVN1YmplY3RIb2xkZXIoKTsKKwkJdGhpcy5lbmdhZ2VMaXN0ZW5lcnMoZ2V0U3ViamVjdCgpKTsKKwkJdGhpcy5wb3B1bGF0ZSgpOworCX0KKwkKKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGlzIDxjb2RlPlBhbmU8L2NvZGU+LgorCSAqCisJICogQGNhdGVnb3J5IEluaXRpYWxpemF0aW9uCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwl9CisKKwkvKioKKwkgKiBSZWdpc3RlcnMgdGhpcyBwYW5lIHdpdGggdGhlIHBhcmVudCBwYW5lLgorCSAqCisJICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lCisJICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cworCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBwYW5lOworCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQorCSAqIEBwYXJhbSBwYXJlbnRNYW5hZ2VQYW5lIDxjb2RlPnRydWU8L2NvZGU+IHRvIGhhdmUgdGhlIHBhcmVudCBwYW5lIG1hbmFnZQorCSAqIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoaXMgcGFuZQorCSAqCisJICogQGNhdGVnb3J5IEluaXRpYWxpemF0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoUGFuZTw/PiBwYXJlbnRQYW5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywKKwkgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBhcmVudE1hbmFnZVBhbmUpIHsKKworCQkvLyBSZWdpc3RlciB0aGlzIHBhbmUgd2l0aCB0aGUgcGFyZW50IHBhbmUsIGl0IHdpbGwgY2FsbCB0aGUgbWV0aG9kcworCQkvLyBhdXRvbWF0aWNhbGx5IChlbmdhZ2VMaXN0ZW5lcnMoKSwgZGlzZW5nYWdlTGlzdGVuZXJzKCksIHBvcHVsYXRlKCksCisJCS8vIGRpc3Bvc2UoKSwgZXRjKQorCQlwYXJlbnRQYW5lLnJlZ2lzdGVyU3ViUGFuZSh0aGlzKTsKKworCQlpZiAocGFyZW50TWFuYWdlUGFuZSkgeworCQkJcGFyZW50UGFuZS5tYW5hZ2VTdWJQYW5lKHRoaXMpOworCQl9CisJCQorCQkvLyBBbGlnbiB0aGUgbGVmdCBhbmQgcmlnaHQgY29udHJvbHMgd2l0aCB0aGUgY29udHJvbHMgZnJvbSB0aGUgcGFyZW50CisJCS8vIHBhbmUKKwkJaWYgKGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKKwkJCXBhcmVudFBhbmUubGVmdENvbnRyb2xBbGlnbmVyIC5hZGQodGhpcy5sZWZ0Q29udHJvbEFsaWduZXIpOworCQkJcGFyZW50UGFuZS5yaWdodENvbnRyb2xBbGlnbmVyLmFkZCh0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIpOworCQl9CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgdGhpcyA8Y29kZT5QYW5lPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAorCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cworCSAqCisJICogQGNhdGVnb3J5IEluaXRpYWxpemF0aW9uCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkKKwl7CisJCUFzc2VydC5pc05vdE51bGwoc3ViamVjdEhvbGRlciwgIlRoZSBzdWJqZWN0IGhvbGRlciBjYW5ub3QgYmUgbnVsbCIpOworCisJCXRoaXMuc3ViamVjdEhvbGRlciAgICAgICAgID0gKFByb3BlcnR5VmFsdWVNb2RlbDxUPikgc3ViamVjdEhvbGRlcjsKKwkJdGhpcy53aWRnZXRGYWN0b3J5ICAgICAgICAgPSB3aWRnZXRGYWN0b3J5OworCQl0aGlzLnN1YlBhbmVzICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8UGFuZTw/Pj4oKTsKKwkJdGhpcy5tYW5hZ2VkV2lkZ2V0cyAgICAgICAgPSBuZXcgQXJyYXlMaXN0PENvbnRyb2w+KCk7CisJCXRoaXMubWFuYWdlZFN1YlBhbmVzICAgICAgID0gbmV3IEFycmF5TGlzdDxQYW5lPD8+PigpOworCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lciAgICA9IG5ldyBDb250cm9sQWxpZ25lcigpOworCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIgICA9IG5ldyBDb250cm9sQWxpZ25lcigpOworCQl0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXIoKTsKKwkJdGhpcy5hc3BlY3RDaGFuZ2VMaXN0ZW5lciAgPSB0aGlzLmJ1aWxkQXNwZWN0Q2hhbmdlTGlzdGVuZXIoKTsKKwkJCisJCXRoaXMuaW5pdGlhbGl6ZSgpOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcik7CisKKwlwcml2YXRlIHZvaWQgbWFuYWdlV2lkZ2V0KENvbnRyb2wgY29udHJvbCkgeworCQlpZiAodGhpcy5tYW5hZ2VkV2lkZ2V0cy5jb250YWlucyhjb250cm9sKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCQl9CisJCXRoaXMubWFuYWdlZFdpZGdldHMuYWRkKGNvbnRyb2wpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgbWFuYWdlU3ViUGFuZShQYW5lPD8+IHN1YlBhbmUpIHsKKwkJaWYgKHRoaXMubWFuYWdlZFN1YlBhbmVzLmNvbnRhaW5zKHN1YlBhbmUpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisJCX0KKwkJdGhpcy5tYW5hZ2VkU3ViUGFuZXMuYWRkKHN1YlBhbmUpOworCX0KKworCS8qKgorCSAqIEFkZHMgdGhlIGdpdmVuIHBhbmUncyB3aWRnZXRzICh0aG9zZSB0aGF0IHdlcmUgcmVnaXN0ZXJlZCB3aXRoIGl0cworCSAqIGxlZnQgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+KSB0byB0aGlzIHBhbmUncyBsZWZ0CisJICogPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+IHNvIHRoYXQgdGhlaXIgd2lkdGggY2FuIGJlIGFkanVzdGVkIHRvIGhhdmUKKwkgKiB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB3aWRnZXQuCisJICoKKwkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRvIGFkZAorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZEFsaWduTGVmdChQYW5lPD8+IGNvbnRhaW5lcikgeworCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lci5hZGQoY29udGFpbmVyLmxlZnRDb250cm9sQWxpZ25lcik7CisJfQorCisJLyoqCisJICogQWRkcyB0aGUgZ2l2ZW4gY29udHJvbCB0byB0aGUgY29sbGVjdGlvbiBvZiB3aWRnZXRzIHRoYXQgaGF2ZSB0aGVpciB3aWR0aAorCSAqIGFkanVzdCB3aXRoIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHdpZGdldC4gVGhlIGxlZnQgYWxpZ25tZW50IGlzIHVzdWFsbHkKKwkgKiB1c2VkIGZvciBsYWJlbHMuCisJICoKKwkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB0byBhZGQKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRBbGlnbkxlZnQoQ29udHJvbCBjb250cm9sKSB7CisJCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIHRoZSBnaXZlbiBwYW5lJ3Mgd2lkZ2V0cyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgd2l0aCBpdHMKKwkgKiByaWdodCA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4pIHRvIHRoaXMgcGFuZSdzIHJpZ2h0CisJICogPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+IHNvIHRoYXQgdGhlaXIgd2lkdGggY2FuIGJlIGFkanVzdGVkIHRvIGhhdmUKKwkgKiB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB3aWRnZXQuCisJICoKKwkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRvIGFkZAorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZEFsaWduUmlnaHQoUGFuZTw/PiBjb250YWluZXIpIHsKKwkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLmFkZChjb250YWluZXIucmlnaHRDb250cm9sQWxpZ25lcik7CisJfQorCisJLyoqCisJICogQWRkcyB0aGUgZ2l2ZW4gY29udHJvbCB0byB0aGUgY29sbGVjdGlvbiBvZiB3aWRnZXRzIHRoYXQgaGF2ZSB0aGVpciB3aWR0aAorCSAqIGFkanVzdCB3aXRoIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHdpZGdldC4gVGhlIGxlZnQgYWxpZ25tZW50IGlzIHVzdWFsbHkKKwkgKiB1c2VkIGZvciBidXR0b25zLgorCSAqCisJICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgdG8gYWRkCisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkQWxpZ25SaWdodChDb250cm9sIGNvbnRyb2wpIHsKKwkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIHRoZSBnaXZlbiBwYW5lJ3MgY29udHJvbHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIGZvcgorCSAqIGFsaWdubWVudCkgZnJvbSB0aGlzIHBhbmUuCisJICoKKwkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRvIGFkZCBmb3IKKwkgKiBhbGlnbm1lbnQKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRQYW5lRm9yQWxpZ25tZW50KFBhbmU8Pz4gY29udGFpbmVyKSB7CisJCWFkZEFsaWduTGVmdChjb250YWluZXIpOworCQlhZGRBbGlnblJpZ2h0KGNvbnRhaW5lcik7CisJfQorCisJLyoqCisJICogQWRkcyBhbnkgcHJvcGVydHkgbmFtZXMgdG8gdGhlIGdpdmVuIGNvbGxlY3Rpb24gaW4gb3JkZXIgdG8gYmUgbm90aWZpZWQKKwkgKiB3aGVuIHRoZSBhY3R1YWwgcHJvcGVydHkgY2hhbmdlcyBpbiB0aGUgc3ViamVjdC4KKwkgKgorCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWVzIFRoZSBjb2xsZWN0aW9uIG9mIHByb3BlcnR5IG5hbWVzIHRvIHJlZ2lzdGVyIHdpdGggdGhlCisJICogc3ViamVjdAorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRBc3BlY3RDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcihidWlsZEFzcGVjdENoYW5nZUxpc3RlbmVyXygpKTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRBc3BlY3RDaGFuZ2VMaXN0ZW5lcl8oKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKKwkJCQkvL3N1YmplY3QoKSBjb3VsZCBoYXZlIGNoYW5nZWQgb3IgaXMgbnVsbCBiZWNhdXNlIG9mIHRoZSBwb3NzaWJpbGl0eSBvZgorCQkJCS8vImp1bXBpbmciIG9uIHRoZSBVSSB0aHJlYWQgaGVyZSBhbmQgYSBzZWxlY3Rpb24gY2hhbmdlIG9jY3VyaW5nCisJCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gZ2V0U3ViamVjdCgpKSB7CisJCQkJCXVwZGF0ZVBhbmUoZS5nZXRQcm9wZXJ0eU5hbWUoKSk7CisJCQkJfQorCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYnV0dG9uIHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAorCSAqIEBwYXJhbSBidXR0b25BY3Rpb24gVGhlIGFjdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGJ1dHRvbiBpcyBwcmVzc2VkCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBhZGRCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgYnV0dG9uQWN0aW9uKSB7CisKKwkJcmV0dXJuIHRoaXMuYWRkQnV0dG9uKGNvbnRhaW5lciwgdGV4dCwgbnVsbCwgYnV0dG9uQWN0aW9uKTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgPGNvZGU+QnV0dG9uPC9jb2RlPiB3aWRnZXQuICBVbm1hbmFnZWQgbWVhbnMgCisJICogdGhhdCB0aGlzIFBhbmUgd2lsbCBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQuICAKKwkgKiBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZSBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKKwkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYWRkVW5tYW5hZ2VkQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGJ1dHRvbkFjdGlvbikgeworCisJCXJldHVybiB0aGlzLmFkZFVubWFuYWdlZEJ1dHRvbihjb250YWluZXIsIHRleHQsIG51bGwsIGJ1dHRvbkFjdGlvbik7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBidXR0b24gdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0CisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGNoZWNrIGJveAorCSAqIEBwYXJhbSBidXR0b25BY3Rpb24gVGhlIGFjdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGJ1dHRvbiBpcyBwcmVzc2VkCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBhZGRCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGJ1dHRvbkFjdGlvbikgeworCisJCUJ1dHRvbiBidXR0b24gPSBhZGRVbm1hbmFnZWRCdXR0b24oY29udGFpbmVyLCB0ZXh0LCBoZWxwSWQsIGJ1dHRvbkFjdGlvbik7CisJCXRoaXMubWFuYWdlV2lkZ2V0KGJ1dHRvbik7CisKKwkJcmV0dXJuIGJ1dHRvbjsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgPGNvZGU+QnV0dG9uPC9jb2RlPiB3aWRnZXQuICBVbm1hbmFnZWQgbWVhbnMgCisJICogdGhhdCB0aGlzIFBhbmUgd2lsbCBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQuICAKKwkgKiBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZSBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgY2hlY2sgYm94CisJICogQHBhcmFtIGJ1dHRvbkFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZFVubWFuYWdlZEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgYnV0dG9uQWN0aW9uKSB7CisKKwkJQnV0dG9uIGJ1dHRvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVCdXR0b24oY29udGFpbmVyLCB0ZXh0KTsKKwkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJU1dUVXRpbC5hc3luY0V4ZWMoYnV0dG9uQWN0aW9uKTsKKwkJCX0KKwkJfSk7CisKKwkJaWYgKGhlbHBJZCAhPSBudWxsKSB7CisJCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChidXR0b24sIGhlbHBJZCk7CisJCX0KKworCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7CisJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOworCQlidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisKKwkJcmV0dXJuIGJ1dHRvbjsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5DQ29tYm88L2NvZGU+LgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENDb21ibyBhZGRDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCUNDb21ibyBjb21ibyA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDQ29tYm8oY29udGFpbmVyKTsKKwkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCXRoaXMubWFuYWdlV2lkZ2V0KGNvbWJvKTsKKwkJcmV0dXJuIGNvbWJvOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgbm9uLWVkaXRhYmxlIDxjb2RlPkNDb21ibzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KKwkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgPFY+IENDb21ibyBhZGRDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlcikgeworCisJCXJldHVybiB0aGlzLmFkZENDb21ibygKKwkJCWNvbnRhaW5lciwKKwkJCWxpc3RIb2xkZXIsCisJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJCQlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48Vj5pbnN0YW5jZSgpCisJCSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgPGNvZGU+Q0NvbWJvPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgorCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQorCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCisJICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ0NvbWJvIGFkZENDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIpIHsKKworCQlDQ29tYm8gY29tYm8gPSB0aGlzLmFkZENDb21ibyhjb250YWluZXIpOworCisJCUNDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKKwkJCWxpc3RIb2xkZXIsCisJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJCQljb21ibywKKwkJCXN0cmluZ0NvbnZlcnRlcgorCQkpOworCisJCXJldHVybiBjb21ibzsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiB1c2luZyBhIDxjb2RlPkNDb21ibzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHByb3ZpZGVyIHJlc3BvbnNpYmxlIHRvIGNvbnZlcnQgdGhlIGNvbWJvJ3MgaXRlbXMKKwkgKiBpbnRvIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBDb21ib1ZpZXdlciBhZGRDQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKKworCQlDQ29tYm8gY29tYm8gPSB0aGlzLmFkZENDb21ibyhjb250YWluZXIpOworCQlDb21ib1ZpZXdlciB2aWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tYm8pOworCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKKwkJcmV0dXJuIHZpZXdlcjsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKKwkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUKKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgY2hlY2sgYm94CisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBhZGRDaGVja0JveCgKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKKwkgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCisJICAgICAgICBTdHJpbmcgaGVscElkKSB7CisJCQorCQlyZXR1cm4gdGhpcy5hZGRUb2dnbGVCdXR0b24oCisJCQlwYXJlbnQsCisJCQlidXR0b25UZXh0LAorCQkJYm9vbGVhbkhvbGRlciwKKwkJCWhlbHBJZCwKKwkJCVNXVC5DSEVDSyk7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIGNoZWNrYm94IDxjb2RlPkJ1dHRvbjwvY29kZT4gd2lkZ2V0LiAgVW5tYW5hZ2VkIG1lYW5zIAorCSAqIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgCisJICogVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0CisJICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0aW9uIHN0YXRlCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGNoZWNrIGJveAorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYWRkVW5tYW5hZ2VkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKKworCQlyZXR1cm4gdGhpcy5hZGRVbm1hbmFnZWRUb2dnbGVCdXR0b24oCisJCQlwYXJlbnQsCisJCQlidXR0b25UZXh0LAorCQkJYm9vbGVhbkhvbGRlciwKKwkJCWhlbHBJZCwKKwkJCVNXVC5DSEVDSworCQkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4gdGhhdCBjYW4gYmUgY29sbGFwc2VkLiBBIHN1Yi1wYW5lIGlzCisJICogYXV0b21hdGljYWxseSBhZGRlZCBhcyBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAorCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KKwkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCkgeworCisJCXJldHVybiB0aGlzLmFkZENvbGxhcHNhYmxlU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCXNlY3Rpb25UZXh0LAorCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKQorCQkpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+IHRoYXQgY2FuIGJlIGNvbGxhcHNlZC4gQSBzdWItcGFuZSBpcworCSAqIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMgaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKKwkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCisJICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBzZWN0aW9uJ3MgZGVzY3JpcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZENvbGxhcHNhYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKwkJcmV0dXJuIHRoaXMuYWRkQ29sbGFwc2FibGVTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJc2VjdGlvblRleHQsCisJCQlkZXNjcmlwdGlvbiwKKwkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSkKKwkJKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKKwkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAorCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KKwkgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBzZWN0aW9uIHRvIGNyZWF0ZQorCSAqIEBwYXJhbSBleHBhbmRlZFN0YXRlSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdGhhdCB3aWxsIGRpY3RhdGUKKwkgKiB3aGVuIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgc2VjdGlvbgorCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcml2YXRlIENvbXBvc2l0ZSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGV4cGFuZGVkU3RhdGVIb2xkZXIpIHsKKwkJCisJCXJldHVybiBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oY29udGFpbmVyLCBzZWN0aW9uVGV4dCwgbnVsbCwgdHlwZSwgZXhwYW5kZWRTdGF0ZUhvbGRlcik7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcworCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0CisJICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgorCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgc2VjdGlvbidzIGRlc2NyaXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKiB3YXMgcHJvdmlkZWQKKwkgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBzZWN0aW9uIHRvIGNyZWF0ZQorCSAqIEBwYXJhbSBleHBhbmRlZFN0YXRlSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdGhhdCB3aWxsIGRpY3RhdGUKKwkgKiB3aGVuIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgc2VjdGlvbgorCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcml2YXRlIENvbXBvc2l0ZSBhZGRDb2xsYXBzYWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBleHBhbmRlZFN0YXRlSG9sZGVyKSB7CisKKwkJQ29tcG9zaXRlIHN1YlBhbmUgPSB0aGlzLmFkZFNlY3Rpb24oCisJCQljb250YWluZXIsCisJCQlzZWN0aW9uVGV4dCwKKwkJCWRlc2NyaXB0aW9uLAorCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgdHlwZQorCQkpOworCisJCVNlY3Rpb24gc2VjdGlvbiA9IChTZWN0aW9uKSBzdWJQYW5lLmdldFBhcmVudCgpOworCisJCWV4cGFuZGVkU3RhdGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKKwkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKKwkJCWJ1aWxkRXhwYW5kZWRTdGF0ZUNoYW5nZUxpc3RlbmVyKHNlY3Rpb24pCisJCSk7CisKKwkJc2VjdGlvbi5zZXRFeHBhbmRlZCgKKwkJCWV4cGFuZGVkU3RhdGVIb2xkZXIuZ2V0VmFsdWUoKSAhPSBudWxsID8gZXhwYW5kZWRTdGF0ZUhvbGRlci5nZXRWYWx1ZSgpIDogdHJ1ZQorCQkpOworCisJCXJldHVybiBzdWJQYW5lOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcworCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0CisJICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgorCSAqIEBwYXJhbSBleHBhbmRlZFN0YXRlSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdGhhdCB3aWxsIGRpY3RhdGUKKwkgKiB3aGVuIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgc2VjdGlvbgorCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZENvbGxhcHNhYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGV4cGFuZGVkU3RhdGVIb2xkZXIpIHsKKworCQlyZXR1cm4gdGhpcy5hZGRDb2xsYXBzYWJsZVNlY3Rpb24oCisJCQljb250YWluZXIsCisJCQlzZWN0aW9uVGV4dCwKKwkJCUV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFLAorCQkJZXhwYW5kZWRTdGF0ZUhvbGRlcgorCQkpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKKwkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAorCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIHNlY3Rpb24ncyBkZXNjcmlwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQorCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCisJICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkQ29sbGFwc2FibGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZXhwYW5kZWRTdGF0ZUhvbGRlcikgeworCisJCXJldHVybiB0aGlzLmFkZENvbGxhcHNhYmxlU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCXNlY3Rpb25UZXh0LAorCQkJZGVzY3JpcHRpb24sCisJCQlFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSwKKwkJCWV4cGFuZGVkU3RhdGVIb2xkZXIKKwkJKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKKwkgKiBpdHMgY2xpZW50IHdoaWNoIGNhbiBiZSB0eXBlZCBjYXN0IGRpcmVjdGx5IGFzIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAorCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KKwkgKiBAcGFyYW0gZXhwYW5kZWRTdGF0ZUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHRoYXQgd2lsbCBkaWN0YXRlCisJICogd2hlbiB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIHNlY3Rpb24KKwkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRDb2xsYXBzYWJsZVN1YlNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGV4cGFuZGVkU3RhdGVIb2xkZXIpIHsKKworCQlyZXR1cm4gdGhpcy5hZGRDb2xsYXBzYWJsZVNlY3Rpb24oCisJCQljb250YWluZXIsCisJCQlzZWN0aW9uVGV4dCwKKwkJCVNXVC5OVUxMLAorCQkJZXhwYW5kZWRTdGF0ZUhvbGRlcgorCQkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgbm9uLWVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBDb21ibyBhZGRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJQ29tYm8gY29tYm8gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlQ29tYm8oY29udGFpbmVyKTsKKwkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCXRoaXMubWFuYWdlV2lkZ2V0KGNvbWJvKTsKKwkJcmV0dXJuIGNvbWJvOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgbm9uLWVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgorCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQorCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCisJICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBhZGRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIpIHsKKworCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkQ29tYm8oY29udGFpbmVyKTsKKworCQlDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKKwkJCWxpc3RIb2xkZXIsCisJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJCQljb21ibywKKwkJCXN0cmluZ0NvbnZlcnRlcgorCQkpOworCisJCXJldHVybiBjb21ibzsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiB1c2luZyBhIDxjb2RlPkNvbWJvPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcworCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncworCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENvbWJvVmlld2VyIGFkZENvbWJvVmlld2VyKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKKworCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkQ29tYm8oY29udGFpbmVyKTsKKwkJQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbWJvKTsKKwkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7CisJCXJldHVybiB2aWV3ZXI7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWFpbiBjb250YWluZXIgb2YgdGhpcyBwYW5lLiBUaGUgbGF5b3V0IGFuZCBsYXlvdXQgZGF0YSBhcmUKKwkgKiBhdXRvbWF0aWNhbGx5IHNldC4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdGhhdCB3aWxsIGhvbGRzIGFsbCB0aGUKKwkgKiB3aWRnZXRzIGNyZWF0ZWQgYnkgdGhpcyBwYW5lIHRocm91Z2gge0BsaW5rICNpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSl9CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQlyZXR1cm4gdGhpcy5hZGRTdWJQYW5lKHBhcmVudCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSA8Y29kZT5DQ29tYm88L2NvZGU+LgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBDQ29tYm8gYWRkRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCUNDb21ibyBjb21ibyA9IGFkZFVubWFuYWdlZEVkaXRhYmxlQ0NvbWJvKGNvbnRhaW5lcik7CisJCXRoaXMubWFuYWdlV2lkZ2V0KGNvbWJvKTsKKwkJcmV0dXJuIGNvbWJvOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q0NvbWJvPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgorCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQorCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCisJICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ0NvbWJvIGFkZEVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlcikgeworCisJCUNDb21ibyBjb21ibyA9IGFkZFVubWFuYWdlZEVkaXRhYmxlQ0NvbWJvKGNvbnRhaW5lciwgbGlzdEhvbGRlciwgc2VsZWN0ZWRJdGVtSG9sZGVyLCBzdHJpbmdDb252ZXJ0ZXIpOworCQl0aGlzLm1hbmFnZVdpZGdldChjb21ibyk7CisKKwkJcmV0dXJuIGNvbWJvOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+IHVzaW5nIGEgPGNvZGU+Q0NvbWJvPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcworCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncworCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENvbWJvVmlld2VyIGFkZEVkaXRhYmxlQ0NvbWJvVmlld2VyKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKKworCQlDQ29tYm8gY29tYm8gPSB0aGlzLmFkZEVkaXRhYmxlQ0NvbWJvKGNvbnRhaW5lcik7CisJCUNvbWJvVmlld2VyIHZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21ibyk7CisJCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOworCQlyZXR1cm4gdmlld2VyOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENvbWJvIGFkZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCisJCUNvbWJvIGNvbWJvID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKKwkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCXRoaXMubWFuYWdlV2lkZ2V0KGNvbWJvKTsKKwkJcmV0dXJuIGNvbWJvOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+CisJICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCisJICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KKwkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyKSB7CisKKwkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZEVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKKworCQlDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKKwkJCWxpc3RIb2xkZXIsCisJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJCQljb21ibywKKwkJCXN0cmluZ0NvbnZlcnRlcgorCQkpOworCisJCXJldHVybiBjb21ibzsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiB1c2luZyBhIDxjb2RlPkNvbWJvPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcworCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncworCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENvbWJvVmlld2VyIGFkZEVkaXRhYmxlQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7CisKKwkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZEVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKKwkJQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbWJvKTsKKwkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7CisJCXJldHVybiB2aWV3ZXI7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRXhwYW5kZWRTdGF0ZUNoYW5nZUxpc3RlbmVyKGZpbmFsIFNlY3Rpb24gc2VjdGlvbikgeworCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKGJ1aWxkRXhwYW5kZWRTdGF0ZUNoYW5nZUxpc3RlbmVyXyhzZWN0aW9uKSk7CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRXhwYW5kZWRTdGF0ZUNoYW5nZUxpc3RlbmVyXyhmaW5hbCBTZWN0aW9uIHNlY3Rpb24pIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgeworCQkJCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgZS5nZXROZXdWYWx1ZSgpOworCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQkJCXZhbHVlID0gQm9vbGVhbi5UUlVFOworCQkJCX0KKwkJCQlzZWN0aW9uLnNldEV4cGFuZGVkKHZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkh5cGVybGluazwvY29kZT4gdGhhdCB3aWxsIGludm9rZWQgdGhlIGdpdmVuCisJICogPGNvZGU+UnVubmFibGU8L2NvZGU+IHdoZW4gc2VsZWN0ZWQuIFRoZSBnaXZlbiBhY3Rpb24gaXMgYWx3YXlzIGludm9rZWQKKwkgKiBmcm9tIHRoZSBVSSB0aHJlYWQuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHRleHQgVGhlIGh5cGVybGluaydzIHRleHQKKwkgKiBAcGFyYW0gaHlwZXJMaW5rQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBsaW5rIHdhcyBzZWxlY3RlZAorCSAqIHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5IeXBlcmxpbms8L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIEh5cGVybGluayBhZGRIeXBlcmxpbmsoQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgaHlwZXJMaW5rQWN0aW9uKSB7CisKKwkJSHlwZXJsaW5rIGxpbmsgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlSHlwZXJsaW5rKHBhcmVudCwgdGV4dCk7CisJCXRoaXMubWFuYWdlV2lkZ2V0KGxpbmspOworCisJCWxpbmsuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgeworCisJCQkJSHlwZXJsaW5rIGh5cGVyTGluayA9IChIeXBlcmxpbmspIGUud2lkZ2V0OworCisJCQkJaWYgKGh5cGVyTGluay5pc0VuYWJsZWQoKSkgeworCQkJCQlTV1RVdGlsLmFzeW5jRXhlYyhoeXBlckxpbmtBY3Rpb24pOworCQkJCX0KKwkJCX0KKwkJfSk7CisKKwkJcmV0dXJuIGxpbms7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBsYWJlbCB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgbGFiZWwncyB0ZXh0CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIExhYmVsIGFkZExhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCkgeworCQkKKwkJTGFiZWwgbGFiZWwgPSBhZGRVbm1hbmFnZWRMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCk7CisJCW1hbmFnZVdpZGdldChsYWJlbCk7CisJCXJldHVybiBsYWJlbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCA8Y29kZT5MYWJlbDwvY29kZT4gd2lkZ2V0LiAgVW5tYW5hZ2VkIG1lYW5zIAorCSAqIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgCisJICogVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIGxhYmVsJ3MgdGV4dAorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBMYWJlbCBhZGRVbm1hbmFnZWRMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQpIHsKKworCQlyZXR1cm4gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgbGFiZWxUZXh0KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIG5vbi1lZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGgKKwkgKiB0aGUgZ2l2ZW4gdGV4dC4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAorCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+CisJICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCisJICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0CisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCisJICogY29tcG9zaXRlcgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ0NvbWJvIGFkZExhYmVsZWRDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCUNDb21ibyBjb21ibyA9IHRoaXMuYWRkQ0NvbWJvKAorCQkJY29udGFpbmVyLAorCQkJbGlzdEhvbGRlciwKKwkJCXNlbGVjdGVkSXRlbUhvbGRlciwKKwkJCXN0cmluZ0NvbnZlcnRlcgorCQkpOworCisJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCWxhYmVsVGV4dCwKKwkJCShjb21iby5nZXRQYXJlbnQoKSAhPSBjb250YWluZXIpID8gY29tYm8uZ2V0UGFyZW50KCkgOiBjb21ibywKKwkJCXJpZ2h0Q29udHJvbCwKKwkJCWhlbHBJZAorCQkpOworCisJCXJldHVybiBjb21ibzsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIG5vbi1lZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGgKKwkgKiB0aGUgZ2l2ZW4gdGV4dC4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAorCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+CisJICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCisJICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0CisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCisJICogY29tcG9zaXRlcgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ0NvbWJvIGFkZExhYmVsZWRDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZENDb21ibygKKwkJCWNvbnRhaW5lciwKKwkJCWxhYmVsVGV4dCwKKwkJCWxpc3RIb2xkZXIsCisJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJCQlzdHJpbmdDb252ZXJ0ZXIsCisJCQludWxsLAorCQkJaGVscElkCisJCSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSBub24tZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoCisJICogdGhlIGdpdmVuIHRleHQuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKKwkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgorCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQorCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgorCSAqIGNvbXBvc2l0ZXIKKwkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZExhYmVsZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZENvbWJvKAorCQkJY29udGFpbmVyLAorCQkJbGlzdEhvbGRlciwKKwkJCXNlbGVjdGVkSXRlbUhvbGRlciwKKwkJCXN0cmluZ0NvbnZlcnRlcgorCQkpOworCisJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCWxhYmVsVGV4dCwKKwkJCShjb21iby5nZXRQYXJlbnQoKSAhPSBjb250YWluZXIpID8gY29tYm8uZ2V0UGFyZW50KCkgOiBjb21ibywKKwkJCXJpZ2h0Q29udHJvbCwKKwkJCWhlbHBJZAorCQkpOworCisJCXJldHVybiBjb21ibzsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIG5vbi1lZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGgKKwkgKiB0aGUgZ2l2ZW4gdGV4dC4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAorCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+CisJICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCisJICogY29tcG9zaXRlcgorCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYWRkTGFiZWxlZENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZENvbWJvKAorCQkJY29udGFpbmVyLAorCQkJbGFiZWxUZXh0LAorCQkJbGlzdEhvbGRlciwKKwkJCXNlbGVjdGVkSXRlbUhvbGRlciwKKwkJCXN0cmluZ0NvbnZlcnRlciwKKwkJCW51bGwsCisJCQloZWxwSWQKKwkJKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAorCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBsZWZ0Q29udHJvbCBUaGUgd2lkZ2V0IHNob3duIHRvIHRoZSBsZWZ0IG9mIHRoZSBtYWluIHdpZGdldAorCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAorCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgorCSAqIGNvbXBvc2l0ZXIKKwkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkJCQkJCQkJCQkJCQlDb250cm9sIGxlZnRDb250cm9sLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJLy8gQ29udGFpbmVyIGZvciB0aGUgbGFiZWwgYW5kIG1haW4gY29tcG9zaXRlCisJCWNvbnRhaW5lciA9IHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDMsIDUsIDAsIDAsIDApOworCisJCS8vIExlZnQgY29udHJvbAorCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuQkVHSU5OSU5HOworCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7CisJCWxlZnRDb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCisJCS8vIFJlLXBhcmVudCB0aGUgbGVmdCBjb250cm9sIHRvIHRoZSBuZXcgc3ViIHBhbmUKKwkJbGVmdENvbnRyb2wuc2V0UGFyZW50KGNvbnRhaW5lcik7CisJCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyLmFkZChsZWZ0Q29udHJvbCk7CisKKwkJLy8gQ2VudGVyIGNvbnRyb2wKKwkJY2VudGVyQ29udHJvbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKworCQkvLyBSZS1wYXJlbnQgdGhlIGNlbnRlciBjb250cm9sIHRvIHRoZSBuZXcgc3ViIHBhbmUKKwkJY2VudGVyQ29udHJvbC5zZXRQYXJlbnQoY29udGFpbmVyKTsKKworCQkvLyBSZWdpc3RlciB0aGUgaGVscCBpZCBmb3IgdGhlIGNlbnRlciBjb250cm9sCisJCWlmIChoZWxwSWQgIT0gbnVsbCkgeworCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY2VudGVyQ29udHJvbCwgaGVscElkKTsKKwkJfQorCisJCS8vIFJpZ2h0IGNvbnRyb2wKKwkJaWYgKHJpZ2h0Q29udHJvbCA9PSBudWxsKSB7CisJCQlDb21wb3NpdGUgc3BhY2VyID0gdGhpcy5hZGRQYW5lKGNvbnRhaW5lcik7CisJCQlzcGFjZXIuc2V0TGF5b3V0KHRoaXMuYnVpbGRTcGFjZXJMYXlvdXQoKSk7CisJCQlyaWdodENvbnRyb2wgPSBzcGFjZXI7CisJCX0KKwkJZWxzZSB7CisJCQlyaWdodENvbnRyb2wuc2V0UGFyZW50KGNvbnRhaW5lcik7CisKKwkJCS8vIFJlZ2lzdGVyIHRoZSBoZWxwIGlkIGZvciB0aGUgcmlnaHQgY29udHJvbAorCQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7CisJCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmlnaHRDb250cm9sLCBoZWxwSWQpOworCQkJfQorCQl9CisKKwkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTDsKKwkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOworCisJCXJpZ2h0Q29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKwkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLmFkZChyaWdodENvbnRyb2wpOworCisJCXJldHVybiBjb250YWluZXI7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCisJICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB1c2VkIHRvIGRlc2NyaWJlIHRoZSBjZW50ZXIgY29udHJvbAorCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgorCSAqIGNvbnRyb2wKKwkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkJCQkJCQkJCQkJCQlDb250cm9sIGxhYmVsLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCWxhYmVsLAorCQkJY2VudGVyQ29udHJvbCwKKwkJCW51bGwsCisJCQloZWxwSWQKKwkJKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbXBvc2l0ZSBsYWJlbGVkCisJICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgdGV4dC4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IHRvIGxhYmVsIHRoZSBtYWluIGNvbXBvc2l0ZQorCSAqIEBwYXJhbSBjZW50ZXJQYW5lIFRoZSBtYWluIHdpZGdldAorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgorCSAqIGNvbXBvc2l0ZXIKKwkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhbmU8Pz4gY2VudGVyUGFuZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCWxhYmVsVGV4dCwKKwkJCWNlbnRlclBhbmUuZ2V0Q29udHJvbCgpLAorCQkJaGVscElkCisJCSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb21wb3NpdGUgbGFiZWxlZAorCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsIHRleHQuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCB0byBsYWJlbCB0aGUgbWFpbiBjb21wb3NpdGUKKwkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKKwkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCkgeworCisKKwkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCWxhYmVsVGV4dCwKKwkJCWNlbnRlckNvbnRyb2wsCisJCQludWxsLAorCQkJbnVsbAorCQkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29tcG9zaXRlIGxhYmVsZWQKKwkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbCB0ZXh0LgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgdG8gbGFiZWwgdGhlIG1haW4gY29tcG9zaXRlCisJICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0CisJICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0CisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCisJICogY29tcG9zaXRlcgorCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjZW50ZXJDb250cm9sLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKKworCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJdGhpcy5hZGRMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCksCisJCQljZW50ZXJDb250cm9sLAorCQkJcmlnaHRDb250cm9sLAorCQkJaGVscElkCisJCSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb21wb3NpdGUgbGFiZWxlZAorCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsIHRleHQuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCB0byBsYWJlbCB0aGUgbWFpbiBjb21wb3NpdGUKKwkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKKwkgKiBjb21wb3NpdGVyCisJICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNlbnRlckNvbnRyb2wsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCUxhYmVsIGxhYmVsID0gdGhpcy5hZGRMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCk7CisKKwkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCWxhYmVsLAorCQkJY2VudGVyQ29udHJvbCwKKwkJCWhlbHBJZAorCQkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGFuIGVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aCB0aGUKKwkgKiBnaXZlbiB0ZXh0LgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCisJICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KKwkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKKwkgKiBjb21wb3NpdGVyCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIDxWPiBDQ29tYm8gYWRkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZEVkaXRhYmxlQ0NvbWJvKAorCQkJY29udGFpbmVyLAorCQkJbGFiZWxUZXh0LAorCQkJbGlzdEhvbGRlciwKKwkJCXNlbGVjdGVkSXRlbUhvbGRlciwKKwkJCVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxWPmluc3RhbmNlKCksCisJCQludWxsLAorCQkJaGVscElkCisJCSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKKwkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAorCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+CisJICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCisJICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KKwkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisJICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0CisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCisJICogY29tcG9zaXRlcgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ0NvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJQ0NvbWJvIGNvbWJvID0gdGhpcy5hZGRFZGl0YWJsZUNDb21ibygKKwkJCWNvbnRhaW5lciwKKwkJCWxpc3RIb2xkZXIsCisJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJCQlzdHJpbmdDb252ZXJ0ZXIKKwkJKTsKKworCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlsYWJlbFRleHQsCisJCQkoY29tYm8uZ2V0UGFyZW50KCkgIT0gY29udGFpbmVyKSA/IGNvbWJvLmdldFBhcmVudCgpIDogY29tYm8sCisJCQlyaWdodENvbnRyb2wsCisJCQloZWxwSWQKKwkJKTsKKworCQlyZXR1cm4gY29tYm87CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYW4gZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoIHRoZQorCSAqIGdpdmVuIHRleHQuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKKwkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgorCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQorCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCisJICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgorCSAqIGNvbXBvc2l0ZXIKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgPFY+IENDb21ibyBhZGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCXJldHVybiB0aGlzLmFkZExhYmVsZWRFZGl0YWJsZUNDb21ibygKKwkJCWNvbnRhaW5lciwKKwkJCWxhYmVsVGV4dCwKKwkJCWxpc3RIb2xkZXIsCisJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJCQlzdHJpbmdDb252ZXJ0ZXIsCisJCQludWxsLAorCQkJaGVscElkCisJCSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKKwkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGVmdENvbnRyb2wgVGhlIHdpZGdldCBzaG93biB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiB3aWRnZXQKKwkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKKwkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKKwkgKiBjb21wb3NpdGVyCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENDb21ibyBhZGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJQ0NvbWJvIGNvbWJvID0gdGhpcy5hZGRFZGl0YWJsZUNDb21ibyhjb250YWluZXIpOworCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKKworCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlsYWJlbFRleHQsCisJCQkoY29tYm8uZ2V0UGFyZW50KCkgIT0gY29udGFpbmVyKSA/IGNvbWJvLmdldFBhcmVudCgpIDogY29tYm8sCisJCQlyaWdodENvbnRyb2wsCisJCQloZWxwSWQKKwkJKTsKKworCQlyZXR1cm4gY29tYm87CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYW4gZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoIHRoZQorCSAqIGdpdmVuIHRleHQuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKKwkgKiBAcGFyYW0gY29tYm9MaXN0ZW5lciBUaGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNlbGVjdGlvbgorCSAqIGNoYW5nZXMKKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKKwkgKiBjb21wb3NpdGVyCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENDb21ibyBhZGRMYWJlbGVkRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCXJldHVybiB0aGlzLmFkZExhYmVsZWRFZGl0YWJsZUNDb21ibygKKwkJCWNvbnRhaW5lciwKKwkJCWxhYmVsVGV4dCwKKwkJCWNvbWJvTGlzdGVuZXIsCisJCQludWxsLAorCQkJaGVscElkCisJCSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKKwkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGVmdENvbnRyb2wgVGhlIHdpZGdldCBzaG93biB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiB3aWRnZXQKKwkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKKwkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcworCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncworCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgorCSAqIGNvbXBvc2l0ZXIKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgQ0NvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJQ29tYm9WaWV3ZXIgY29tYm9WaWV3ZXIgPSB0aGlzLmFkZEVkaXRhYmxlQ0NvbWJvVmlld2VyKAorCQkJY29udGFpbmVyLAorCQkJbGFiZWxQcm92aWRlcgorCQkpOworCisJCUNDb21ibyBjb21ibyA9IGNvbWJvVmlld2VyLmdldENDb21ibygpOworCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKKworCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlsYWJlbFRleHQsCisJCQkoY29tYm8uZ2V0UGFyZW50KCkgIT0gY29udGFpbmVyKSA/IGNvbWJvLmdldFBhcmVudCgpIDogY29tYm8sCisJCQlyaWdodENvbnRyb2wsCisJCQloZWxwSWQKKwkJKTsKKworCQlyZXR1cm4gY29tYm87CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYW4gZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoIHRoZQorCSAqIGdpdmVuIHRleHQuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKKwkgKiBAcGFyYW0gY29tYm9MaXN0ZW5lciBUaGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNlbGVjdGlvbgorCSAqIGNoYW5nZXMKKwkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcworCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncworCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgorCSAqIGNvbXBvc2l0ZXIKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgQ0NvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCXJldHVybiB0aGlzLmFkZExhYmVsZWRFZGl0YWJsZUNDb21ib1ZpZXdlcigKKwkJCWNvbnRhaW5lciwKKwkJCWxhYmVsVGV4dCwKKwkJCWNvbWJvTGlzdGVuZXIsCisJCQlsYWJlbFByb3ZpZGVyLAorCQkJbnVsbCwKKwkJCWhlbHBJZAorCQkpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhbiBlZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGggdGhlCisJICogZ2l2ZW4gdGV4dC4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAorCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+CisJICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCisJICogY29tcG9zaXRlCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBhZGRMYWJlbGVkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCXJldHVybiB0aGlzLmFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAorCQkJY29udGFpbmVyLAorCQkJbGFiZWxUZXh0LAorCQkJbGlzdEhvbGRlciwKKwkJCXNlbGVjdGVkSXRlbUhvbGRlciwKKwkJCVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxWPmluc3RhbmNlKCksCisJCQludWxsLAorCQkJaGVscElkCisJCSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKKwkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAorCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+CisJICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCisJICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KKwkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisJICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0CisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCisJICogY29tcG9zaXRlcgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBhZGRMYWJlbGVkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZEVkaXRhYmxlQ29tYm8oCisJCQljb250YWluZXIsCisJCQlsaXN0SG9sZGVyLAorCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAorCQkJc3RyaW5nQ29udmVydGVyCisJCSk7CisKKwkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJbGFiZWxUZXh0LAorCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAorCQkJcmlnaHRDb250cm9sLAorCQkJaGVscElkCisJCSk7CisKKwkJcmV0dXJuIGNvbWJvOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGFuIGVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aCB0aGUKKwkgKiBnaXZlbiB0ZXh0LgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCisJICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KKwkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KKwkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQorCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKKwkgKiBjb21wb3NpdGVyCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCXJldHVybiB0aGlzLmFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAorCQkJY29udGFpbmVyLAorCQkJbGFiZWxUZXh0LAorCQkJbGlzdEhvbGRlciwKKwkJCXNlbGVjdGVkSXRlbUhvbGRlciwKKwkJCXN0cmluZ0NvbnZlcnRlciwKKwkJCW51bGwsCisJCQloZWxwSWQKKwkJKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCisJICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGFyZWEncyBsYWJlbAorCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAorCSAqIEBwYXJhbSBsaW5lQ291bnQgVGhlIG51bWJlciBvZiBsaW5lcyB0aGUgdGV4dCBhcmVhIHNob3VsZCBkaXNwbGF5CisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lQ291bnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlciwgbGluZUNvdW50KTsKKworCQljb250YWluZXIgPSB0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlsYWJlbFRleHQsCisJCQl0ZXh0LAorCQkJaGVscElkCisJCSk7CisKKwkJaW50IHRleHRIZWlnaHQgPSB0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKKworCQkvLyBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgbGluZXMgdGhlIHRleHQgYXJlYSBzaG91bGQgZGlzcGxheQorCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgdGV4dC5nZXRMYXlvdXREYXRhKCk7CisJCWdyaWREYXRhLmhlaWdodEhpbnQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIGxpbmVDb3VudDsKKworCQkvLyBNb3ZlIHRoZSBsYWJlbCB0byB0aGUgdG9wIG9mIGl0cyBjZWxsCisJCUNvbnRyb2wgbGFiZWwgPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKVswXTsKKwkJaW50IGxhYmVsSGVpZ2h0ID0gbGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OworCisJCWdyaWREYXRhID0gKEdyaWREYXRhKSBsYWJlbC5nZXRMYXlvdXREYXRhKCk7CisJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKKwkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgICArPSAoTWF0aC5hYnModGV4dEhlaWdodCAtIGxhYmVsSGVpZ2h0KSAvIDIpOworCisJCXJldHVybiB0ZXh0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKKwkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkUGFzc3dvcmRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikgeworCisJCXJldHVybiB0aGlzLmFkZExhYmVsZWRQYXNzd29yZFRleHQoCisJCQljb250YWluZXIsCisJCQlsYWJlbFRleHQsCisJCQl0ZXh0SG9sZGVyLAorCQkJbnVsbAorCQkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKKwkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgZmllbGQncyBsYWJlbAorCSAqIEBwYXJhbSByaWdodENvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIGJlIHBsYWNlZCB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQKKwkgKiBmaWVsZAorCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTGFiZWxlZFBhc3N3b3JkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRQYXNzd29yZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyKTsKKworCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCisJCQljb250YWluZXIsCisJCQlsYWJlbFRleHQsCisJCQl0ZXh0LAorCQkJcmlnaHRDb250cm9sLAorCQkJaGVscElkCisJCSk7CisKKwkJcmV0dXJuIHRleHQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAorCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0CisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkUGFzc3dvcmRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCXJldHVybiB0aGlzLmFkZExhYmVsZWRQYXNzd29yZFRleHQoCisJCQljb250YWluZXIsCisJCQlsYWJlbFRleHQsCisJCQl0ZXh0SG9sZGVyLAorCQkJbnVsbCwKKwkJCWhlbHBJZAorCQkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgc3Bpbm5lci4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKKwkgKiBAcGFyYW0gbnVtYmVySG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGludGVnZXIgdmFsdWUKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSBzaG93biB3aGVuIHRoZSBob2xkZXIgaGFzIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHBhcmFtIG1pbmltdW1WYWx1ZSBUaGUgbWluaW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKKwkgKiBAcGFyYW0gbWF4aW11bVZhbHVlIFRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdworCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIHdpZGdldCB0byBiZSBwbGFjZWQgdG8gdGhlIHJpZ2h0IG9mIHNwaW5uZXIKKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBzcGlubmVyCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5TcGlubmVyPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBTcGlubmVyIGFkZExhYmVsZWRTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5pbXVtVmFsdWUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4aW11bVZhbHVlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJU3Bpbm5lciBzcGlubmVyID0gdGhpcy5hZGRTcGlubmVyKAorCQkJcGFyZW50LAorCQkJbnVtYmVySG9sZGVyLAorCQkJZGVmYXVsdFZhbHVlLAorCQkJbWluaW11bVZhbHVlLAorCQkJbWF4aW11bVZhbHVlLAorCQkJaGVscElkCisJCSk7CisJCUxhYmVsIGxhYmVsID0gYWRkTGFiZWwocGFyZW50LCBsYWJlbFRleHQpOworCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJcGFyZW50LAorCQkJbGFiZWwsCisJCQkoc3Bpbm5lci5nZXRQYXJlbnQoKSAhPSBwYXJlbnQpID8gc3Bpbm5lci5nZXRQYXJlbnQoKSA6IHNwaW5uZXIsCisJCQlyaWdodENvbnRyb2wsCisJCQloZWxwSWQKKwkJKTsKKworCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgc3Bpbm5lci5nZXRMYXlvdXREYXRhKCk7CisJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7CisKKwkJcmV0dXJuIHNwaW5uZXI7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBtYW5hZ2VkIHNwaW5uZXIuIE1hbmFnZWQgbWVhbnMgdGhhdCB0aGlzIFBhbmUgd2lsbAorCSAqIGhhbmRsZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQgaWYgYSBQYW5lRW5hYmxlciBpcyB1c2VkLiAgCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIG51bWJlckhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBpbnRlZ2VyIHZhbHVlCisJICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgc2hvd24gd2hlbiB0aGUgaG9sZGVyIGhhcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBwYXJhbSBtaW5pbXVtVmFsdWUgVGhlIG1pbmltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93CisJICogQHBhcmFtIG1heGltdW1WYWx1ZSBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgYnV0dG9uCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5TcGlubmVyPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBTcGlubmVyIGFkZFNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluaW11bVZhbHVlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4aW11bVZhbHVlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJU3Bpbm5lciBzcGlubmVyID0gYWRkVW5tYW5hZ2VkU3Bpbm5lcihwYXJlbnQsIG51bWJlckhvbGRlciwgZGVmYXVsdFZhbHVlLCBtaW5pbXVtVmFsdWUsIG1heGltdW1WYWx1ZSwgaGVscElkKTsKKwkJdGhpcy5tYW5hZ2VXaWRnZXQoc3Bpbm5lcik7CisJCXJldHVybiBzcGlubmVyOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIHNwaW5uZXIuICBVbm1hbmFnZWQgbWVhbnMgdGhhdCB0aGlzIFBhbmUgd2lsbAorCSAqIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4gIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlCisJICogaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBudW1iZXJIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaW50ZWdlciB2YWx1ZQorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHNob3duIHdoZW4gdGhlIGhvbGRlciBoYXMgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcGFyYW0gbWluaW11bVZhbHVlIFRoZSBtaW5pbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdworCSAqIEBwYXJhbSBtYXhpbXVtVmFsdWUgVGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93CisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGJ1dHRvbgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+U3Bpbm5lcjwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lciBhZGRVbm1hbmFnZWRTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbmltdW1WYWx1ZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heGltdW1WYWx1ZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCVNwaW5uZXIgc3Bpbm5lciA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVTcGlubmVyKHBhcmVudCk7CisJCXNwaW5uZXIuc2V0TWluaW11bShtaW5pbXVtVmFsdWUpOworCQlzcGlubmVyLnNldE1heGltdW0obWF4aW11bVZhbHVlKTsKKwkJc3Bpbm5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpKTsKKworCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KG51bWJlckhvbGRlciwgc3Bpbm5lciwgZGVmYXVsdFZhbHVlKTsKKworCQlpZiAoaGVscElkICE9IG51bGwpIHsKKwkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNwaW5uZXIsIGhlbHBJZCk7CisJCX0KKworCQlyZXR1cm4gc3Bpbm5lcjsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBtYW5hZ2VkIERhdGVUaW1lIG9mIHR5cGUgU1dULlRJTUUuICBNYW5hZ2VkIG1lYW5zIHRoYXQgdGhpcyBQYW5lIHdpbGwKKwkgKiBoYW5kbGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0IGlmIGEgUGFuZUVuYWJsZXIgaXMgdXNlZC4gIAorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBob3Vyc0hvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBob3VycyBpbnRlZ2VyIHZhbHVlCisJICogQHBhcmFtIG1pbnV0ZXNIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWludXRlcyBpbnRlZ2VyIHZhbHVlCisJICogQHBhcmFtIHNlY29uZHNIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2Vjb25kcyBpbnRlZ2VyIHZhbHVlCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGRhdGVUaW1lCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5EYXRlVGltZTwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgRGF0ZVRpbWUgYWRkRGF0ZVRpbWUoQ29tcG9zaXRlIHBhcmVudCwKKwkJCQkJCQkJCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gaG91cnNIb2xkZXIsCisJCQkJCQkJCQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG1pbnV0ZXNIb2xkZXIsCisJCQkJCQkJCQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHNlY29uZHNIb2xkZXIsCisJCQkJCQkJCQkJCVN0cmluZyBoZWxwSWQpIHsKKwkJCisJCURhdGVUaW1lIGRhdGVUaW1lID0gdGhpcy5hZGRVbm1hbmFnZWREYXRlVGltZShwYXJlbnQsIGhvdXJzSG9sZGVyLCBtaW51dGVzSG9sZGVyLCBzZWNvbmRzSG9sZGVyLCBoZWxwSWQpOworCQl0aGlzLm1hbmFnZVdpZGdldChkYXRlVGltZSk7CisKKwkJcmV0dXJuIGRhdGVUaW1lOworCX0KKworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgRGF0ZVRpbWUgb2YgdHlwZSBTV1QuVElNRS4gIFVubWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsCisJICogbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUKKwkgKiBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGhvdXJzSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGhvdXJzIGludGVnZXIgdmFsdWUKKwkgKiBAcGFyYW0gbWludXRlc0hvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBtaW51dGVzIGludGVnZXIgdmFsdWUKKwkgKiBAcGFyYW0gc2Vjb25kc0hvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWNvbmRzIGludGVnZXIgdmFsdWUKKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgZGF0ZVRpbWUKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkRhdGVUaW1lPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBEYXRlVGltZSBhZGRVbm1hbmFnZWREYXRlVGltZShDb21wb3NpdGUgcGFyZW50LAorCQkJCQkJCQkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBob3Vyc0hvbGRlciwKKwkJCQkJCQkJCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbWludXRlc0hvbGRlciwKKwkJCQkJCQkJCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gc2Vjb25kc0hvbGRlciwKKwkJCQkJCQkJCQkJU3RyaW5nIGhlbHBJZCkgeworCQkKKwkJRGF0ZVRpbWUgZGF0ZVRpbWUgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlRGF0ZVRpbWUocGFyZW50LCBTV1QuVElNRSk7CisJCQorCQlEYXRlVGltZU1vZGVsQWRhcHRlci5hZGFwdChob3Vyc0hvbGRlciwgbWludXRlc0hvbGRlciwgc2Vjb25kc0hvbGRlciwgZGF0ZVRpbWUpOworCQorCQlpZiAoaGVscElkICE9IG51bGwpIHsKKwkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRhdGVUaW1lLCBoZWxwSWQpOworCQl9CisKKwkJcmV0dXJuIGRhdGVUaW1lOworCX0KKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNDb21ibzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KKwkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KKwkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQorCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgPFY+IENDb21ibyBhZGRVbm1hbmFnZWRFZGl0YWJsZUNDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIpIHsKKworCQlDQ29tYm8gY29tYm8gPSBhZGRVbm1hbmFnZWRFZGl0YWJsZUNDb21ibyhjb250YWluZXIpOworCisJCUNDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKKwkJCWxpc3RIb2xkZXIsCisJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCisJCQljb21ibywKKwkJCXN0cmluZ0NvbnZlcnRlcgorCQkpOworCisJCXJldHVybiBjb21ibzsKKwl9CisKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNDb21ibzwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENDb21ibyBhZGRVbm1hbmFnZWRFZGl0YWJsZUNDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7CisKKwkJQ0NvbWJvIGNvbWJvID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUVkaXRhYmxlQ0NvbWJvKGNvbnRhaW5lcik7CisJCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQlyZXR1cm4gY29tYm87CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAorCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0CisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyKSB7CisKKwkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZFRleHQoY29udGFpbmVyLCBsYWJlbFRleHQsIHRleHRIb2xkZXIsIG51bGwpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKKwkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgZmllbGQncyBsYWJlbAorCSAqIEBwYXJhbSByaWdodENvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIGJlIHBsYWNlZCB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQKKwkgKiBmaWVsZAorCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTGFiZWxlZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29tcG9uZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCVRleHQgdGV4dCA9IHRoaXMuYWRkVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIpOworCisJCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKKwkJCWNvbnRhaW5lciwKKwkJCWxhYmVsVGV4dCwKKwkJCXRleHQsCisJCQlyaWdodENvbXBvbmVudCwKKwkJCWhlbHBJZAorCQkpOworCisJCXJldHVybiB0ZXh0OworCX0KKwkvKioKKwkgKiAKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCisJICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGZpZWxkJ3MgbGFiZWwKKwkgKiBAcGFyYW0gcmlnaHRDb21wb25lbnQgVGhlIGNvbXBvbmVudCB0byBiZSBwbGFjZWQgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0CisJICogZmllbGQKKwkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCBsYWJlbCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb21wb25lbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlcik7CisKKwkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAorCQkJY29udGFpbmVyLAorCQkJbGFiZWwsCisJCQl0ZXh0LAorCQkJcmlnaHRDb21wb25lbnQsCisJCQloZWxwSWQKKwkJKTsKKworCQlyZXR1cm4gdGV4dDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCisJICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCXJldHVybiB0aGlzLmFkZExhYmVsZWRUZXh0KAorCQkJY29udGFpbmVyLAorCQkJbGFiZWxUZXh0LAorCQkJdGV4dEhvbGRlciwKKwkJCW51bGwsCisJCQloZWxwSWQKKwkJKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCisJICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCBsYWJlbCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKKworCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkVGV4dCgKKwkJCWNvbnRhaW5lciwKKwkJCWxhYmVsLAorCQkJdGV4dEhvbGRlciwKKwkJCW51bGwsCisJCQloZWxwSWQKKwkJKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGxpc3QgYW5kIG5vdGlmeSB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhvbGRlciB3aGVuIHRoZQorCSAqIHNlbGVjdGlvbiBjaGFuZ2VzLiBJZiB0aGUgc2VsZWN0aW9uIGNvdW50IGlzIGRpZmZlcmVudCB0aGFuIG9uZSB0aGFuIHRoZQorCSAqIGhvbGRlciB3aWxsIHJlY2VpdmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHJhZGlvIGJ1dHRvbgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+TGlzdDwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgTGlzdCBhZGRMaXN0KENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKKworCQlyZXR1cm4gdGhpcy5hZGRMaXN0KAorCQkJY29udGFpbmVyLAorCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCksCisJCQloZWxwSWQKKwkJKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGxpc3QgYW5kIG5vdGlmeSB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhvbGRlciB3aGVuIHRoZQorCSAqIHNlbGVjdGlvbiBjaGFuZ2VzLiBJZiB0aGUgc2VsZWN0aW9uIGNvdW50IGlzIGRpZmZlcmVudCB0aGFuIG9uZSB0aGFuIHRoZQorCSAqIGhvbGRlciB3aWxsIHJlY2VpdmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHNlbGVjdGlvbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB1bmlxdWUgc2VsZWN0ZWQgaXRlbQorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyByYWRpbyBidXR0b24KKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkxpc3Q8L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIExpc3QgYWRkTGlzdChDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHNlbGVjdGlvbkhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCUxpc3QgbGlzdCA9IHRoaXMuYWRkVW5tYW5hZ2VkTGlzdChjb250YWluZXIsIHNlbGVjdGlvbkhvbGRlciwgaGVscElkKTsKKwkJdGhpcy5tYW5hZ2VXaWRnZXQobGlzdCk7CisKKwkJcmV0dXJuIGxpc3Q7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIGxpc3QgYW5kIG5vdGlmeSB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhvbGRlciB3aGVuIHRoZQorCSAqIHNlbGVjdGlvbiBjaGFuZ2VzLiBJZiB0aGUgc2VsZWN0aW9uIGNvdW50IGlzIGRpZmZlcmVudCB0aGFuIG9uZSB0aGFuIHRoZQorCSAqIGhvbGRlciB3aWxsIHJlY2VpdmUgPGNvZGU+bnVsbDwvY29kZT4uIAorCSAqIFVubWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4gIAorCSAqIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gc2VsZWN0aW9uSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHVuaXF1ZSBzZWxlY3RlZCBpdGVtCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHJhZGlvIGJ1dHRvbgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+TGlzdDwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgTGlzdCBhZGRVbm1hbmFnZWRMaXN0KENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc2VsZWN0aW9uSG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJTGlzdCBsaXN0ID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUxpc3QoCisJCQljb250YWluZXIsCisJCQlTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULk1VTFRJCisJCSk7CisKKwkJbGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidWlsZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkhvbGRlcikpOworCQlsaXN0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCisJCWlmIChoZWxwSWQgIT0gbnVsbCkgeworCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobGlzdCwgaGVscElkKTsKKwkJfQorCisJCXJldHVybiBsaXN0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgbGFibGUgZXhwYW5kaW5nIG9uIG11bHRpcGxlIGxpbmVzLgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIGxhYmVsJ3MgdGV4dAorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBGb3JtVGV4dCBhZGRNdWx0aUxpbmVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCkgeworCisJCUZvcm1UZXh0IGxhYmVsID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZU11bHRpTGluZUxhYmVsKGNvbnRhaW5lciwgbGFiZWxUZXh0KTsKKwkJbWFuYWdlV2lkZ2V0KGxhYmVsKTsKKwkJcmV0dXJuIGxhYmVsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IHRoYXQgaGFzIG11bHRpcGxlIGxpbmVzLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0CisJICoKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlUZXh0IHRleHQgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIpOwkJCisJCXRoaXMubWFuYWdlV2lkZ2V0KHRleHQpOworCisJCXJldHVybiB0ZXh0OworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldCB0aGF0IGhhcyBtdWx0aXBsZSBsaW5lcy4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gbGluZUNvdW50IFRoZSBudW1iZXIgb2YgbGluZXMgdGhlIHRleHQgYXJlYSBzaG91bGQgZGlzcGxheQorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0CisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lQ291bnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKKworCQlUZXh0IHRleHQgPSB0aGlzLmFkZE11bHRpTGluZVRleHQoY29udGFpbmVyKTsKKwkJCisJCUdyaWREYXRhIGdyaWREYXRhICAgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IHRleHQuZ2V0TGluZUhlaWdodCgpICogbGluZUNvdW50OworCQl0ZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOworCisJCWlmIChoZWxwSWQgIT0gbnVsbCkgeworCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGV4dCwgaGVscElkKTsKKwkJfQorCisJCXJldHVybiB0ZXh0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IHRoYXQgaGFzIG11bHRpcGxlIGxpbmVzLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAorCSAqIEBwYXJhbSBsaW5lQ291bnQgVGhlIG51bWJlciBvZiBsaW5lcyB0aGUgdGV4dCBhcmVhIHNob3VsZCBkaXNwbGF5CisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVDb3VudCkgeworCisJCXJldHVybiB0aGlzLmFkZE11bHRpTGluZVRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyLCBsaW5lQ291bnQsIG51bGwpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0IHRoYXQgaGFzIG11bHRpcGxlIGxpbmVzLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0CisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVDb3VudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCVRleHQgdGV4dCA9IHRoaXMuYWRkTXVsdGlMaW5lVGV4dChjb250YWluZXIsIGxpbmVDb3VudCwgaGVscElkKTsKKwkJVGV4dEZpZWxkTW9kZWxBZGFwdGVyLmFkYXB0KHRleHRIb2xkZXIsIHRleHQpOworCQlyZXR1cm4gdGV4dDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhZ2VCb29rPC9jb2RlPiBhbmQgc2V0IHRoZSBwcm9wZXIgbGF5b3V0IGFuZCBsYXlvdXQKKwkgKiBkYXRhLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+UGFnZUJvb2s8L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIFBhZ2VCb29rIGFkZFBhZ2VCb29rKENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKKwkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCXJldHVybiBwYWdlQm9vazsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB3aXRob3V0IHNwZWNpZnlpbmcgYW55IGxheW91dCBtYW5hZ2VyLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IG9mIHRoZSBuZXcgY29udGFpbmVyCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB1c2luZyB0aGUgZ2l2ZW4gbGF5b3V0IG1hbmFnZXIuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgb2YgdGhlIG5ldyBjb250YWluZXIKKwkgKiBAcGFyYW0gbGF5b3V0IFRoZSBsYXlvdXQgbWFuYWdlciBvZiB0aGUgbmV3IGNvbnRhaW5lcgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgY29udGFpbmVyCisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIExheW91dCBsYXlvdXQpIHsKKworCQljb250YWluZXIgPSB0aGlzLmFkZFBhbmUoY29udGFpbmVyKTsKKwkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOworCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCXJldHVybiBjb250YWluZXI7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0CisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIpIHsKKworCQlUZXh0IHRleHQgPSB0aGlzLmFkZFBhc3N3b3JkVGV4dChjb250YWluZXIpOworCQlUZXh0RmllbGRNb2RlbEFkYXB0ZXIuYWRhcHQodGV4dEhvbGRlciwgdGV4dCk7CisKKwkJcmV0dXJuIHRleHQ7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkUGFzc3dvcmRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKworCQlUZXh0IHRleHQgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlUGFzc3dvcmRUZXh0KGNvbnRhaW5lcik7CisJCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisKKwkJdGhpcy5tYW5hZ2VXaWRnZXQodGV4dCk7CisJCXJldHVybiB0ZXh0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgcHVzaCBidXR0b24gdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0CisJICogQHBhcmFtIGJ1dHRvbkFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZFB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBidXR0b25BY3Rpb24pIHsKKworCQlyZXR1cm4gdGhpcy5hZGRQdXNoQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCwgbnVsbCwgYnV0dG9uQWN0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHB1c2ggYnV0dG9uIHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAorCSAqIEBwYXJhbSBidXR0b25BY3Rpb24gVGhlIGFjdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGJ1dHRvbiBpcyBwcmVzc2VkCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHJhZGlvIGJ1dHRvbgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYWRkUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgYnV0dG9uQWN0aW9uKSB7CisKKwkJQnV0dG9uIGJ1dHRvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVQdXNoQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCk7CisJCW1hbmFnZVdpZGdldChidXR0b24pOworCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlTV1RVdGlsLmFzeW5jRXhlYyhidXR0b25BY3Rpb24pOworCQkJfQorCQl9KTsKKworCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7CisKKwkJaWYgKGhlbHBJZCAhPSBudWxsKSB7CisJCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChidXR0b24sIGhlbHBJZCk7CisJCX0KKworCQlyZXR1cm4gYnV0dG9uOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY2hlY2sgYm94IHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAorCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZQorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyByYWRpbyBidXR0b24KKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZFJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJcmV0dXJuIHRoaXMuYWRkVG9nZ2xlQnV0dG9uKAorCQkJcGFyZW50LAorCQkJYnV0dG9uVGV4dCwKKwkJCWJvb2xlYW5Ib2xkZXIsCisJCQloZWxwSWQsCisJCQlTV1QuUkFESU8KKwkJKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKKwkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAorCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KKwkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0KSB7CisKKwkJcmV0dXJuIHRoaXMuYWRkU2VjdGlvbigKKwkJCWNvbnRhaW5lciwKKwkJCXNlY3Rpb25UZXh0LAorCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIKKwkJKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKKwkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAorCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KKwkgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBzZWN0aW9uIHRvIGNyZWF0ZQorCSAqIEBwYXJhbSBleHBhbmRlZFN0YXRlSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdGhhdCB3aWxsIGRpY3RhdGUKKwkgKiB3aGVuIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgc2VjdGlvbgorCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcml2YXRlIENvbXBvc2l0ZSBhZGRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpIHsKKworCQlyZXR1cm4gdGhpcy5hZGRTZWN0aW9uKGNvbnRhaW5lciwgc2VjdGlvblRleHQsIG51bGwsIHR5cGUpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcworCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0CisJICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgorCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgc2VjdGlvbidzIGRlc2NyaXB0aW9uCisJICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKworCQlyZXR1cm4gdGhpcy5hZGRTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJc2VjdGlvblRleHQsCisJCQlkZXNjcmlwdGlvbiwKKwkJCUV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSCisJCSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCisJICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKKwkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCisJICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBzZWN0aW9uJ3MgZGVzY3JpcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIHdhcyBwcm92aWRlcgorCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHNlY3Rpb24gdG8gY3JlYXRlCisJICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQorCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCisJICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByaXZhdGUgQ29tcG9zaXRlIGFkZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlKSB7CisKKwkJU2VjdGlvbiBzZWN0aW9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVNlY3Rpb24oY29udGFpbmVyLCB0eXBlIHwgKChkZXNjcmlwdGlvbiAhPSBudWxsKSA/IFNlY3Rpb24uREVTQ1JJUFRJT04gOiBTV1QuTlVMTCkpOworCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQlzZWN0aW9uLnNldFRleHQoc2VjdGlvblRleHQpOworCQlzZWN0aW9uLm1hcmdpbldpZHRoICA9IDA7CisJCXNlY3Rpb24ubWFyZ2luSGVpZ2h0ID0gMDsKKwkJCisJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7CisJCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKwkJfQorCisJCUNvbXBvc2l0ZSBzdWJQYW5lID0gdGhpcy5hZGRTdWJQYW5lKHNlY3Rpb24pOworCQlzZWN0aW9uLnNldENsaWVudChzdWJQYW5lKTsKKworCQlyZXR1cm4gc3ViUGFuZTsKKwl9CisKKwlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzZWxlY3Rpb25Ib2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJTGlzdCBsaXN0ID0gKExpc3QpIGUud2lkZ2V0OworCQkJCVN0cmluZ1tdIHNlbGVjdGVkSXRlbXMgPSBsaXN0LmdldFNlbGVjdGlvbigpOworCQkJCWlmICgoc2VsZWN0ZWRJdGVtcyA9PSBudWxsKSB8fCAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggIT0gMSkpIHsKKwkJCQkJc2VsZWN0aW9uSG9sZGVyLnNldFZhbHVlKG51bGwpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJc2VsZWN0aW9uSG9sZGVyLnNldFZhbHVlKHNlbGVjdGVkSXRlbXNbMF0pOworCQkJCX0KKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBsYXlvdXQgcmVzcG9uc2libGUgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgc3BhY2VyIGNyZWF0ZWQKKwkgKiBmb3IgdGhlIHJpZ2h0IGNvbnRyb2wgd2hlbiBub25lIHdhcyBnaXZlbi4gVGhlIHNwYWNlciBoZWxwcyB0byBhbGlnbiBhbGwKKwkgKiB0aGUgcmlnaHQgY29udHJvbHMuCisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJpdmF0ZSBMYXlvdXQgYnVpbGRTcGFjZXJMYXlvdXQoKSB7CisJCXJldHVybiBuZXcgTGF5b3V0KCkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGhIaW50LAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHRIaW50LAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmx1c2hDYWNoZSkgeworCisJCQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aEhpbnQsIGhlaWdodEhpbnQpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKKwkJCQlHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKSBjb21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpOworCQkJCWNvbXBvc2l0ZS5zZXRCb3VuZHMoMCwgMCwgZGF0YS53aWR0aEhpbnQsIGRhdGEuaGVpZ2h0SGludCk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXJfKCkpOworCX0KKworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcl8oKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgeworCQkJCVBhbmUudGhpcy5zdWJqZWN0Q2hhbmdlZCgoVCkgZS5nZXRPbGRWYWx1ZSgpLCAoVCkgZS5nZXROZXdWYWx1ZSgpKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZFN1YlBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlyZXR1cm4gdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgMCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZS4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gdG9wTWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZQorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkU3ViUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgdG9wTWFyZ2luKSB7CisJCXJldHVybiB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCB0b3BNYXJnaW4sIDApOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHRvcE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgYXQgdGhlIHRvcCBvZiB0aGUgcGFuZQorCSAqIEBwYXJhbSBsZWZ0TWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCB0byB0aGUgbGVmdCBvZiB0aGUgcGFuZQorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZFN1YlBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wTWFyZ2luLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0TWFyZ2luKSB7CisKKwkJcmV0dXJuIHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIHRvcE1hcmdpbiwgbGVmdE1hcmdpbiwgMCwgMCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZSwgdGhlIG5ldyB3aWRnZXQKKwkgKiB3aWxsIGhhdmUgaXRzIGxheW91dCBhbmQgbGF5b3V0IGRhdGEgYWxyZWFkeSBpbml0aWFsaXplZCwgdGhlIGxheW91dCB3aWxsCisJICogYmUgYSA8Y29kZT5HcmlkTGF5b3V0PC9jb2RlPiB3aXRoIDEgY29sdW1uLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB0b3BNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSB0b3Agb2YgdGhlIHBhbmUKKwkgKiBAcGFyYW0gbGVmdE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgdG8gdGhlIGxlZnQgb2YgdGhlIHBhbmUKKwkgKiBAcGFyYW0gYm90dG9tTWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYW5lCisJICogQHBhcmFtIHJpZ2h0TWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCB0byB0aGUgcmlnaHQgb2YgdGhlIHBhbmUKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lCisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTdWJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcE1hcmdpbiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdE1hcmdpbiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm90dG9tTWFyZ2luLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByaWdodE1hcmdpbikgeworCisJCXJldHVybiB0aGlzLmFkZFN1YlBhbmUoCisJCQljb250YWluZXIsCisJCQkxLAorCQkJdG9wTWFyZ2luLAorCQkJbGVmdE1hcmdpbiwKKwkJCWJvdHRvbU1hcmdpbiwKKwkJCXJpZ2h0TWFyZ2luKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lLCB0aGUgbmV3IHdpZGdldAorCSAqIHdpbGwgaGF2ZSBpdHMgbGF5b3V0IGFuZCBsYXlvdXQgZGF0YSBhbHJlYWR5IGluaXRpYWxpemVkLCB0aGUgbGF5b3V0IHdpbGwKKwkgKiBiZSBhIDxjb2RlPkdyaWRMYXlvdXQ8L2NvZGU+IHdpdGggMSBjb2x1bW4uCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHRvcE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgYXQgdGhlIHRvcCBvZiB0aGUgcGFuZQorCSAqIEBwYXJhbSBsZWZ0TWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCB0byB0aGUgbGVmdCBvZiB0aGUgcGFuZQorCSAqIEBwYXJhbSBib3R0b21NYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhbmUKKwkgKiBAcGFyYW0gcmlnaHRNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIHRvIHRoZSByaWdodCBvZiB0aGUgcGFuZQorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZFN1YlBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uQ291bnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcE1hcmdpbiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdE1hcmdpbiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm90dG9tTWFyZ2luLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByaWdodE1hcmdpbikgeworCisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoY29sdW1uQ291bnQsIGZhbHNlKTsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWxheW91dC5tYXJnaW5XaWR0aCAgPSAwOworCQlsYXlvdXQubWFyZ2luVG9wICAgID0gdG9wTWFyZ2luOworCQlsYXlvdXQubWFyZ2luTGVmdCAgID0gbGVmdE1hcmdpbjsKKwkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IGJvdHRvbU1hcmdpbjsKKwkJbGF5b3V0Lm1hcmdpblJpZ2h0ICA9IHJpZ2h0TWFyZ2luOworCisJCWNvbnRhaW5lciA9IHRoaXMuYWRkUGFuZShjb250YWluZXIsIGxheW91dCk7CisKKwkJcmV0dXJuIGNvbnRhaW5lcjsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKKwkgKiBpdHMgY2xpZW50IHdoaWNoIGNhbiBiZSB0eXBlZCBjYXN0IGRpcmVjdGx5IGFzIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAorCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KKwkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTdWJTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0KSB7CisKKwkJcmV0dXJuIHRoaXMuYWRkQ29sbGFwc2FibGVTdWJTZWN0aW9uKAorCQkJY29udGFpbmVyLAorCQkJc2VjdGlvblRleHQsCisJCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkKKwkJKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHRhYmxlLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgdG8gYXBwbHkgdG8gdGhlIHRhYmxlCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRhYmxlIG9yCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaGVscCBJRCBpcyByZXF1aXJlZAorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGFibGU8L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIFRhYmxlIGFkZFRhYmxlKENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0eWxlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKKworCQlUYWJsZSB0YWJsZSA9IGFkZFVubWFuYWdlZFRhYmxlKGNvbnRhaW5lciwgc3R5bGUsIGhlbHBJZCk7CisJCXRoaXMubWFuYWdlV2lkZ2V0KHRhYmxlKTsKKworCQlyZXR1cm4gdGFibGU7CisJfQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIHRhYmxlLiAgVW5tYW5hZ2VkIG1lYW5zIHRoYXQgdGhpcyBQYW5lIHdpbGwKKwkgKiBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQuICBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZQorCSAqIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSB0YWJsZQorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0YWJsZSBvcgorCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGhlbHAgSUQgaXMgcmVxdWlyZWQKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRhYmxlPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBUYWJsZSBhZGRVbm1hbmFnZWRUYWJsZShDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHlsZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJVGFibGUgdGFibGUgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlVGFibGUoY29udGFpbmVyLCBzdHlsZSk7CisJCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CisJCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKKworCQlHcmlkRGF0YSBncmlkRGF0YSAgID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCWdyaWREYXRhLmhlaWdodEhpbnQgPSB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgKiA0OworCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKworCQlpZiAoaGVscElkICE9IG51bGwpIHsKKwkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRhYmxlLCBoZWxwSWQpOworCQl9CisKKwkJcmV0dXJuIHRhYmxlOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgdGFibGUuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRhYmxlIG9yCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaGVscCBJRCBpcyByZXF1aXJlZAorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGFibGU8L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIFRhYmxlIGFkZFRhYmxlKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKKworCQlyZXR1cm4gdGhpcy5hZGRUYWJsZSgKKwkJCWNvbnRhaW5lciwKKwkJCVNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSwKKwkJCWhlbHBJZAorCQkpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCB0YWJsZS4gIFVubWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsCisJICogbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUKKwkgKiBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRhYmxlIG9yCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaGVscCBJRCBpcyByZXF1aXJlZAorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGFibGU8L2NvZGU+CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIFRhYmxlIGFkZFVubWFuYWdlZFRhYmxlKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKKworCQlyZXR1cm4gdGhpcy5hZGRVbm1hbmFnZWRUYWJsZSgKKwkJCWNvbnRhaW5lciwKKwkJCVNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSwKKwkJCWhlbHBJZAorCQkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgbWFuYWdlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCisJICoKKwkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKKwkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRVbm1hbmFnZWRUZXh0KGNvbnRhaW5lcik7CisJCXRoaXMubWFuYWdlV2lkZ2V0KHRleHQpOworCQlyZXR1cm4gdGV4dDsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LiAgVW5tYW5hZ2VkIG1lYW5zIAorCSAqIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgCisJICogVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkVW5tYW5hZ2VkVGV4dChDb21wb3NpdGUgY29udGFpbmVyKSB7CisJCVRleHQgdGV4dCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVUZXh0KGNvbnRhaW5lcik7CisJCXJldHVybiB0ZXh0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0CisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKKworCQlUZXh0IHRleHQgPSB0aGlzLmFkZFRleHQoY29udGFpbmVyKTsKKwkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKworCQlpZiAoaGVscElkICE9IG51bGwpIHsKKwkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRleHQsIGhlbHBJZCk7CisJCX0KKworCQlyZXR1cm4gdGV4dDsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LiAgVW5tYW5hZ2VkIG1lYW5zIAorCSAqIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgCisJICogVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0CisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRVbm1hbmFnZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKKworCQlUZXh0IHRleHQgPSB0aGlzLmFkZFVubWFuYWdlZFRleHQoY29udGFpbmVyKTsKKwkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKworCQlpZiAoaGVscElkICE9IG51bGwpIHsKKwkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRleHQsIGhlbHBJZCk7CisJCX0KKwkJCisJCXJldHVybiB0ZXh0OworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4KKwkgKgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyKSB7CisKKwkJcmV0dXJuIHRoaXMuYWRkVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIsIG51bGwpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0CisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCVRleHQgdGV4dCA9IHRoaXMuYWRkVGV4dChjb250YWluZXIsIGhlbHBJZCk7CisJCVRleHRGaWVsZE1vZGVsQWRhcHRlci5hZGFwdCh0ZXh0SG9sZGVyLCB0ZXh0KTsKKworCQlyZXR1cm4gdGV4dDsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LiAgVW5tYW5hZ2VkIG1lYW5zIAorCSAqIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgCisJICogVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgorCSAqCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0CisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRVbm1hbmFnZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCVRleHQgdGV4dCA9IHRoaXMuYWRkVW5tYW5hZ2VkVGV4dChjb250YWluZXIsIGhlbHBJZCk7CisJCVRleHRGaWVsZE1vZGVsQWRhcHRlci5hZGFwdCh0ZXh0SG9sZGVyLCB0ZXh0KTsKKworCQlyZXR1cm4gdGV4dDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB3aXRoIGEgdGl0bGVkIGJvcmRlci4KKwkgKgorCSAqIEBwYXJhbSB0aXRsZSBUaGUgdGV4dCBvZiB0aGUgdGl0bGVkIGJvcmRlcgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gd2l0aCBhIHRpdGxlZCBib3JkZXIKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgR3JvdXAgYWRkVGl0bGVkR3JvdXAoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIHRpdGxlKSB7CisJCXJldHVybiB0aGlzLmFkZFRpdGxlZEdyb3VwKGNvbnRhaW5lciwgdGl0bGUsIG51bGwpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHdpdGggYSB0aXRsZWQgYm9yZGVyLgorCSAqCisJICogQHBhcmFtIHRpdGxlIFRoZSB0ZXh0IG9mIHRoZSB0aXRsZWQgYm9yZGVyCisJICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBncm91cAorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB3aXRoIGEgdGl0bGVkIGJvcmRlcgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCBHcm91cCBhZGRUaXRsZWRHcm91cChDb21wb3NpdGUgY29udGFpbmVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgeworCisJCXJldHVybiBhZGRUaXRsZWRHcm91cChjb250YWluZXIsIHRpdGxlLCAxLCBoZWxwSWQpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB3aXRoIGEgdGl0bGVkIGJvcmRlci4KKwkgKgorCSAqIEBwYXJhbSB0aXRsZSBUaGUgdGV4dCBvZiB0aGUgdGl0bGVkIGJvcmRlcgorCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKKwkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgZ3JvdXAKKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gd2l0aCBhIHRpdGxlZCBib3JkZXIKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgR3JvdXAgYWRkVGl0bGVkR3JvdXAoQ29tcG9zaXRlIGNvbnRhaW5lciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0aXRsZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW5Db3VudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKKworCQlHcm91cCBncm91cCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVHcm91cChjb250YWluZXIsIHRpdGxlKTsKKwkJLy9tYW5hZ2VXaWRnZXQoZ3JvdXApOyBUT0RPIHVuc3VyZSBpZiBJIHdhbnQgdG8gbWFuYWdlIGdyb3VwcywgCisJCS8vYWxzbyBzaG91bGQgcHJvYmFibHkgcmVuYW1lIHRoaXMgYWRkVW5tYW5hZ2VkVGl0bGVkUGFuZQorCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KGNvbHVtbkNvdW50LCBmYWxzZSk7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlsYXlvdXQubWFyZ2luV2lkdGggID0gMDsKKwkJbGF5b3V0Lm1hcmdpblRvcCAgICA9IDU7CisJCWxheW91dC5tYXJnaW5MZWZ0ICAgPSA1OworCQlsYXlvdXQubWFyZ2luQm90dG9tID0gNTsKKwkJbGF5b3V0Lm1hcmdpblJpZ2h0ICA9IDU7CisJCWdyb3VwLnNldExheW91dChsYXlvdXQpOworCisJCWlmIChoZWxwSWQgIT0gbnVsbCkgeworCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIGhlbHBJZCk7CisJCX0KKworCQlyZXR1cm4gZ3JvdXA7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgbmV3IHRvZ2dsZSBidXR0b24gKHJhZGlvIGJ1dHRvbiBvciBjaGVjayBib3gpLiAgCisJICogVW5tYW5hZ2VkIG1lYW5zICB0aGF0IHRoaXMgUGFuZSB3aWxsIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyAKKwkgKiBvZiB0aGlzIHdpZGdldC4gVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIAorCSAqIG9yIENvbnRyb2xFbmFibGVyLgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0CisJICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0aW9uIHN0YXRlCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGJ1dHRvbgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByaXZhdGUgQnV0dG9uIGFkZFVubWFuYWdlZFRvZ2dsZUJ1dHRvbigKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKKwkgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCisJICAgICAgICBTdHJpbmcgaGVscElkLAorCSAgICAgICAgaW50IHRvZ2dsZUJ1dHRvblR5cGUpIHsKKwkJCisJCUJ1dHRvbiBidXR0b247CisJCQorCQlpZiAodG9nZ2xlQnV0dG9uVHlwZSA9PSBTV1QuUFVTSCkgeworCQkJYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVB1c2hCdXR0b24ocGFyZW50LCBidXR0b25UZXh0KTsKKwkJfQorCQllbHNlIGlmICh0b2dnbGVCdXR0b25UeXBlID09IFNXVC5SQURJTykgeworCQkJYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVJhZGlvQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCk7CisJCX0KKwkJZWxzZSBpZiAodG9nZ2xlQnV0dG9uVHlwZSA9PSBTV1QuQ0hFQ0spIHsKKwkJCWJ1dHRvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDaGVja0JveChwYXJlbnQsIGJ1dHRvblRleHQpOworCQl9CisJCWVsc2UgeworCQkJYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUJ1dHRvbihwYXJlbnQsIGJ1dHRvblRleHQpOworCQl9CisJCQorCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7CisJCVNXVFRvb2xzLmJpbmQoYm9vbGVhbkhvbGRlciwgYnV0dG9uKTsKKwkJCisJCWlmIChoZWxwSWQgIT0gbnVsbCkgeworCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYnV0dG9uLCBoZWxwSWQpOworCQl9CisJCQorCQlyZXR1cm4gYnV0dG9uOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHRvZ2dsZSBidXR0b24gKHJhZGlvIGJ1dHRvbiBvciBjaGVjayBib3gpIHVzaW5nIHRoZSBnaXZlbgorCSAqIGluZm9ybWF0aW9uLgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0CisJICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0aW9uIHN0YXRlCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGJ1dHRvbgorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByaXZhdGUgQnV0dG9uIGFkZFRvZ2dsZUJ1dHRvbigKKwkJCUNvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKKwkgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCisJICAgICAgICBTdHJpbmcgaGVscElkLAorCSAgICAgICAgaW50IHRvZ2dsZUJ1dHRvblR5cGUpIHsKKwkJCisJCUJ1dHRvbiBidXR0b24gPSBhZGRVbm1hbmFnZWRUb2dnbGVCdXR0b24oCisJCQkJcGFyZW50LCAKKwkJCQlidXR0b25UZXh0LCAKKwkJCQlib29sZWFuSG9sZGVyLCAKKwkJCQloZWxwSWQsIAorCQkJCXRvZ2dsZUJ1dHRvblR5cGUpOworCQl0aGlzLm1hbmFnZVdpZGdldChidXR0b24pOworCQlyZXR1cm4gYnV0dG9uOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgY2hlY2sgYm94IHRoYXQgY2FuIGhhdmUgMyBzZWxlY3Rpb24gc3RhdGVzIChzZWxlY3RlZCwKKwkgKiB1bnNlbGVjdGVkIGFuZCBwYXJ0aWFsbHkgc2VsZWN0ZWQuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCisJICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKKwkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHZhbHVlIHdoZXJlIDxjb2RlPm51bGw8L2NvZGU+CisJICogbWVhbnMgcGFydGlhbGx5IHNlbGVjdGVkCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGNoZWNrIGJveAorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VHJpU3RhdGVDaGVja0JveDwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVHJpU3RhdGVDaGVja0JveCBhZGRUcmlTdGF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJVHJpU3RhdGVDaGVja0JveCBjaGVja0JveCA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94KAorCQkJcGFyZW50LAorCQkJdGV4dCwKKwkJCXRoaXMuZ2V0V2lkZ2V0RmFjdG9yeSgpCisJCSk7CisKKwkJdGhpcy5tYW5hZ2VXaWRnZXQoY2hlY2tCb3guZ2V0Q2hlY2tCb3goKSk7CisKKwkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5hZGFwdCgKKwkJCWJvb2xlYW5Ib2xkZXIsCisJCQljaGVja0JveAorCQkpOworCisJCWlmIChoZWxwSWQgIT0gbnVsbCkgeworCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY2hlY2tCb3guZ2V0Q2hlY2tCb3goKSwgaGVscElkKTsKKwkJfQorCisJCXJldHVybiBjaGVja0JveDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCB0aGF0IGNhbiBoYXZlIDMgc2VsZWN0aW9uIHN0YXRlcyAoc2VsZWN0ZWQsCisJICogdW5zZWxlY3RlZCBhbmQgcGFydGlhbGx5IHNlbGVjdGVkLgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgorCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0CisJICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB2YWx1ZSB3aGVyZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIG1lYW5zIHBhcnRpYWxseSBzZWxlY3RlZAorCSAqIEBwYXJhbSBzdHJpbmdIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3RyaW5nIHRvIHB1dCBpbiBwYXJlbnRoZXNpcyBhZnRlcgorCSAqIHRoZSBjaGVjayBib3gncyB0ZXh0IHdoZW4gaXQgaXMgcGFydGlhbGx5IHNlbGVjdGVkCisJICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGNoZWNrIGJveAorCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VHJpU3RhdGVDaGVja0JveDwvY29kZT4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgVHJpU3RhdGVDaGVja0JveCBhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoQ29tcG9zaXRlIHBhcmVudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7CisKKwkJVHJpU3RhdGVDaGVja0JveCBjaGVja0JveCA9IHRoaXMuYWRkVHJpU3RhdGVDaGVja0JveCgKKwkJCXBhcmVudCwKKwkJCXRleHQsCisJCQlib29sZWFuSG9sZGVyLAorCQkJaGVscElkCisJCSk7CisKKwkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcigKKwkJCW5ldyBMYWJlbGVkQnV0dG9uKGNoZWNrQm94LmdldENoZWNrQm94KCkpLAorCQkJc3RyaW5nSG9sZGVyCisJCSk7CisKKwkJcmV0dXJuIGNoZWNrQm94OworCX0KKworCS8qKgorCSAqIFJlcXVlc3RzIHRoaXMgcGFuZSB0byBwb3B1bGF0ZSBpdHMgd2lkZ2V0cyB3aXRoIHRoZSBzdWJqZWN0J3MgdmFsdWVzLgorCSAqCisJICogQGNhdGVnb3J5IFBvcHVsYXRlCisJICovCisJcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKKwkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICIgICAtPmRvUG9wdWxhdGUoKSIpOworCX0KKworCS8qKgorCSAqIENoYW5nZXMgdGhlIGVuYWJsZW1lbnQgc3RhdGUgb2YgdGhlIGNoaWxkcmVuIDxjb2RlPkNvbnRyb2w8L2NvZGU+cy4KKwkgKgorCSAqIEBwYXJhbSBlbmFibGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGVuYWJsZSB0aGUgd2lkZ2V0cyBvciA8Y29kZT5mYWxzZTwvY29kZT4KKwkgKiB0byBkaXNhYmxlIHRoZW0KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcml2YXRlIHZvaWQgZW5hYmxlQ2hpbGRyZW4oYm9vbGVhbiBlbmFibGVkKSB7CisJCWZvciAoQ29udHJvbCBjb250cm9sIDogdGhpcy5tYW5hZ2VkV2lkZ2V0cykgeworCQkJY29udHJvbC5zZXRFbmFibGVkKGVuYWJsZWQpOworCQl9CisJfQorCisJLyoqCisJICogQ2hhbmdlcyB0aGUgZW5hYmxlbWVudCBzdGF0ZSBvZiB0aGUgd2lkZ2V0cyBvZiB0aGlzIHBhbmUuCisJICoKKwkgKiBAcGFyYW0gZW5hYmxlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBlbmFibGUgdGhlIHdpZGdldHMgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+CisJICogdG8gZGlzYWJsZSB0aGVtCisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKKworCQlpZiAoIXRoaXMuY29udGFpbmVyLmlzRGlzcG9zZWQoKSkgeworCQkJdGhpcy5lbmFibGVDaGlsZHJlbihlbmFibGVkKTsKKworCQkJZm9yIChQYW5lPD8+IHN1YlBhbmUgOiB0aGlzLm1hbmFnZWRTdWJQYW5lcykgeworCQkJCXN1YlBhbmUuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBlbmdhZ2VTdWJqZWN0SG9sZGVyKCkgeworCQl0aGlzLnN1YmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKKwl9CisJCisJLyoqCisJICogZW5nYWdlIHRoZSBzcGVjaWZpZWQgc3ViamVjdAorCSAqLworCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycyhUIHN1YmplY3QpIHsKKwkJaWYgKHN1YmplY3QgIT0gbnVsbCkgeworCQkJdGhpcy5lbmdhZ2VMaXN0ZW5lcnNfKHN1YmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogc3BlY2lmaWVkIHN1YmplY3QgaXMgbm90IG51bGwKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnNfKFQgc3ViamVjdCkgeworCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgIiAgIC0+ZW5nYWdlTGlzdGVuZXJzXygiICsgc3ViamVjdCArICcpJyk7CisKKwkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5nZXRQcm9wZXJ0eU5hbWVzKCkpIHsKKwkJCXN1YmplY3QuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMuYXNwZWN0Q2hhbmdlTGlzdGVuZXIpOworCQl9CisJfQorCisJLyoqCisJICogZGlzZW5nYWdlIHRoZSBzcGVjaWZpZWQgc3ViamVjdAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycyhUIHN1YmplY3QpIHsKKwkJaWYgKHN1YmplY3QgIT0gbnVsbCkgeworCQkJdGhpcy5kaXNlbmdhZ2VMaXN0ZW5lcnNfKHN1YmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogc3BlY2lmaWVkIHN1YmplY3QgaXMgbm90IG51bGwKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnNfKFQgc3ViamVjdCkgeworCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgIiAgIC0+ZGlzZW5nYWdlTGlzdGVuZXJzXygiICsgc3ViamVjdCArICcpJyk7CisKKwkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5nZXRQcm9wZXJ0eU5hbWVzKCkpIHsKKwkJCXN1YmplY3QucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMuYXNwZWN0Q2hhbmdlTGlzdGVuZXIpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGRpc2VuZ2FnZVN1YmplY3RIb2xkZXIoKSB7CisJCXRoaXMuc3ViamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1haW4gPGNvZGU+Q29udHJvbDwvY29kZT4gb2YgdGhpcyBwYW5lLgorCSAqCisJICogQHJldHVybiBUaGUgbWFpbiBjb250YWluZXIKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7CisJCXJldHVybiB0aGlzLmNvbnRhaW5lcjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdWJqZWN0IGhvbGRlciB1c2VkIGJ5IHRoaXMgcGFuZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAorCSAqCisJICogQGNhdGVnb3J5IFBvcHVsYXRlCisJICovCisJcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxUPiBnZXRTdWJqZWN0SG9sZGVyKCkgeworCQlyZXR1cm4gdGhpcy5zdWJqZWN0SG9sZGVyOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSB3aWRnZXRzLgorCSAqCisJICogQHJldHVybiBUaGUgZmFjdG9yeSB1c2VkIGJ5IHRoaXMgcGFuZSB0byBjcmVhdGUgdGhlIHdpZGdldHMKKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgV2lkZ2V0RmFjdG9yeSBnZXRXaWRnZXRGYWN0b3J5KCkgeworCQlyZXR1cm4gdGhpcy53aWRnZXRGYWN0b3J5OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1hcmdpbiB0YWtlbiBieSBhIGdyb3VwIGJveCwgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBwaXhlbCB0aGUKKwkgKiBncm91cCBib3ggYm9yZGVyIGFuZCBpdHMgbWFyZ2luIHRha2VzIGJlZm9yZSBkaXNwbGF5aW5nIGl0cyB3aWRnZXRzIHBsdXMKKwkgKiA1IHBpeGVscyBzaW5jZSB0aGUgd2lkZ2V0cyBpbnNpZGUgb2YgdGhlIGdyb3VwIGJveCBhbmQgdGhlIGJvcmRlciBzaG91bGQKKwkgKiBoYXZlIHRoYXQgZXh0cmEgNSBwaXhlbHMuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB3aWR0aCB0YWtlbiBieSB0aGUgZ3JvdXAgYm94IGJvcmRlciB3aXRoIGl0cyBtYXJnaW4KKwkgKgorCSAqIEBjYXRlZ29yeSBMYXlvdXQKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgaW50IGdldEdyb3VwQm94TWFyZ2luKCkgeworCQlHcm91cCBncm91cCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVHcm91cChTV1RVdGlsLmdldFNoZWxsKCksICIiKTsKKwkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBncm91cC5nZXRDbGllbnRBcmVhKCk7CisJCWdyb3VwLmRpc3Bvc2UoKTsKKwkJcmV0dXJuIGNsaWVudEFyZWEueCArIDU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaGVscHMgc3lzdGVtLgorCSAqCisJICogQHJldHVybiBUaGUgcGxhdGZvcm0ncyBoZWxwIHN5c3RlbQorCSAqCisJICogQGNhdGVnb3J5IEhlbHBlcgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgeworCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7CisJfQorCisKKwkvKioKKwkgKiBEZXRlcm1pbmVzIHdoZXRoZXIKKwkgKgorCSAqIEByZXR1cm4KKwkgKgorCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQorCSAqLworCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzUG9wdWxhdGluZygpIHsKKwkJcmV0dXJuIHRoaXMucG9wdWxhdGluZzsKKwl9CisKKwkvKioKKwkgKiBMb2dzIHRoZSBnaXZlbiBtZXNzYWdlIGlmIHRoZSA8Y29kZT5UcmFjaW5nLkRFQlVHX0xBWU9VVDwvY29kZT4gaXMgZW5hYmxlZC4KKwkgKgorCSAqIEBwYXJhbSBmbGFnCisJICogQHBhcmFtIG1lc3NhZ2UgVGhlIGxvZ2dpbmcgbWVzc2FnZQorCSAqLworCXByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgZmxhZywgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJaWYgKGZsYWcuZXF1YWxzKFRyYWNpbmcuVUlfTEFZT1VUKSAmJiBUcmFjaW5nLmJvb2xlYW5EZWJ1Z09wdGlvbihUcmFjaW5nLlVJX0xBWU9VVCkpIHsKKwkJCXRoaXMubG9nKG1lc3NhZ2UpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisJCUNsYXNzPD8+IHRoaXNDbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKwkJU3RyaW5nIGNsYXNzTmFtZSA9IENsYXNzVG9vbHMuc2hvcnROYW1lRm9yKHRoaXNDbGFzcyk7CisKKwkJaWYgKHRoaXNDbGFzcy5pc0Fub255bW91c0NsYXNzKCkpIHsKKwkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmluZGV4T2YoJyQnKSk7CisJCQljbGFzc05hbWUgKz0gIi0+IiArIENsYXNzVG9vbHMuc2hvcnROYW1lRm9yKHRoaXNDbGFzcy5nZXRTdXBlcmNsYXNzKCkpOworCQl9CisKKwkJVHJhY2luZy5sb2coY2xhc3NOYW1lICsgIjogIiArIG1lc3NhZ2UpOworCX0KKworCS8qKgorCSAqIE5vdGlmaWVzIHRoaXMgcGFuZSB0byBwb3B1bGF0ZSBpdHNlbGYgdXNpbmcgdGhlIHN1YmplY3QncyBpbmZvcm1hdGlvbi4KKwkgKgorCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQorCSAqLworCXByaXZhdGUgdm9pZCBwb3B1bGF0ZSgpIHsKKwkJaWYgKCF0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAicG9wdWxhdGUoKSIpOworCQkJdGhpcy5yZXBvcHVsYXRlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBOb3RpZmllcyB0aGUgc3ViamVjdCdzIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZQorCSAqIGhhcyBjaGFuZ2VkLgorCSAqCisJICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IGNoYW5nZQorCSAqCisJICogQGNhdGVnb3J5IFBvcHVsYXRlCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIG5hbWVzIHRvIGxpc3RlbiBmb3IgcHJvcGVydGllcyBjaGFuZ2luZyBmcm9tIHRoZQorCSAqIHN1YmplY3QuCisJICoKKwkgKiBAcmV0dXJuIEEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMKKwkgKgorCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQorCSAqLworCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKKwkJQXJyYXlMaXN0PFN0cmluZz4gcHJvcGVydHlOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlhZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOworCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSBnaXZlbiBwYW5lJ3Mgd2lkZ2V0cyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgd2l0aAorCSAqIGl0cyBsZWZ0IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPikgZnJvbSB0aGlzIHBhbmUncyBsZWZ0CisJICogPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+IHNvIHRoYXQgdGhlaXIgd2lkdGggd2lsbCBubyBsb25nZXIgYmUgYWRqdXN0ZWQKKwkgKiB3aXRoIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHdpZGdldC4KKwkgKgorCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIHdpZGdldHMgdG8gcmVtb3ZlCisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtb3ZlQWxpZ25MZWZ0KFBhbmU8Pz4gcGFuZSkgeworCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lci5yZW1vdmUocGFuZS5sZWZ0Q29udHJvbEFsaWduZXIpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbnRyb2wgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiB3aWRnZXRzIHRoYXQgYXJlIGFsaWduZWQKKwkgKiB0byBoYXZlIHRoZSBzYW1lIHdpZHRoIHdoZW4gdGhleSBhcmUgc2hvd24gdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgMworCSAqIHdpZGdldCBjb2x1bXMuCisJICoKKwkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB0byByZW1vdmUsIGl0cyB3aWR0aCB3aWxsIG5vIGxvbmdlciBiZQorCSAqIGFqdXN0ZWQgdG8gYmUgdGhlIHdpZHRoIG9mIHRoZSBsb25nZXN0IHdpZGdldAorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbW92ZUFsaWduTGVmdChDb250cm9sIGNvbnRyb2wpIHsKKwkJdGhpcy5sZWZ0Q29udHJvbEFsaWduZXIucmVtb3ZlKGNvbnRyb2wpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHBhbmUncyB3aWRnZXRzICh0aG9zZSB0aGF0IHdlcmUgcmVnaXN0ZXJlZCB3aXRoCisJICogaXRzIHJpZ2h0IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPikgZnJvbSB0aGlzIHBhbmUncyByaWdodAorCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBzbyB0aGF0IHRoZWlyIHdpZHRoIHdpbGwgbm8gbG9uZ2VyIGJlIGFkanVzdGVkCisJICogd2l0aCB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB3aWRnZXQuCisJICoKKwkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRvIHJlbW92ZQorCSAqCisJICogQGNhdGVnb3J5IExheW91dAorCSAqLworCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbW92ZUFsaWduUmlnaHQoUGFuZTw/PiBwYW5lKSB7CisJCXRoaXMucmlnaHRDb250cm9sQWxpZ25lci5yZW1vdmUocGFuZS5yaWdodENvbnRyb2xBbGlnbmVyKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb250cm9sIGZyb20gdGhlIGNvbGxlY3Rpb24gb2Ygd2lkZ2V0cyB0aGF0IGFyZSBhbGlnbmVkCisJICogdG8gaGF2ZSB0aGUgc2FtZSB3aWR0aCB3aGVuIHRoZXkgYXJlIHNob3duIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSAzCisJICogd2lkZ2V0IGNvbHVtcy4KKwkgKgorCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHRvIHJlbW92ZSwgaXRzIHdpZHRoIHdpbGwgbm8gbG9uZ2VyIGJlCisJICogYWp1c3RlZCB0byBiZSB0aGUgd2lkdGggb2YgdGhlIGxvbmdlc3Qgd2lkZ2V0CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtb3ZlQWxpZ25SaWdodChDb250cm9sIGNvbnRyb2wpIHsKKwkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLnJlbW92ZShjb250cm9sKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSBnaXZlbiBwYW5lJ3MgY29udHJvbHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIGZvcgorCSAqIGFsaWdubWVudCkgZnJvbSB0aGlzIHBhbmUuCisJICoKKwkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRoYXQgbm8gbG9uZ2VyCisJICogcmVxdWlyZXMgdGhlaXIgd2lkdGggYWRqdXN0ZWQgd2l0aCB0aGUgd2lkdGggb2YgdGhlIGxvbmdlc3Qgd2lkZ2V0CisJICoKKwkgKiBAY2F0ZWdvcnkgTGF5b3V0CisJICovCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtb3ZlUGFuZUZvckFsaWdubWVudChQYW5lPD8+IHBhbmUpIHsKKwkJcmVtb3ZlQWxpZ25MZWZ0KHBhbmUpOworCQlyZW1vdmVBbGlnblJpZ2h0KHBhbmUpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCAocGVyaGFwcyBpbnRlcm5hbGx5KSB3aGVuIHRoaXMgbmVlZHMgdG8gcmVwb3B1bGF0ZQorCSAqIGJ1dCB0aGUgb2JqZWN0IG9mIGludGVyZXN0IGhhcyBub3QgY2hhbmdlZC4KKwkgKgorCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQorCSAqLworCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlcG9wdWxhdGUoKSB7CisKKwkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICIgICAtPnJlcG9wdWxhdGUoKSIpOworCisJCS8vIFBvcHVsYXRlIHRoaXMgcGFuZQorCQl0cnkgeworCQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKKwkJCWRvUG9wdWxhdGUoKTsKKwkJfQorCQlmaW5hbGx5IHsKKwkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOworCQl9CisKKwkJLy8gQXNrIHRoZSBzdWItcGFuZXMgdG8gcmVwb3B1bGF0ZSB0aGVtc2VsdmVzCisJCWZvciAoUGFuZTw/PiBzdWJQYW5lIDogdGhpcy5zdWJQYW5lcykgeworCQkJc3ViUGFuZS5yZXBvcHVsYXRlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBpbnRlcm5hbCBmbGFnIHRoYXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgcGFuZSBpcyBiZWluZworCSAqIHBvcHVsYXRlZCBvciBub3QuIER1cmluZyBwb3B1bGF0aW9uLCBpdCBpcyByZXF1aXJlZCB0byBub3QgdXBkYXRlIHRoZQorCSAqIHdpZGdldHMgd2hlbiB0aGUgbW9kZWwgaXMgdXBkYXRlZCBub3IgdG8gdXBkYXRlIHRoZSBtb2RlbCB3aGVuIHRoZSB3aWRnZXRzCisJICogYXJlIGJlaW5nIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCdzIHZhbHVlcy4KKwkgKgorCSAqIEBwYXJhbSBwb3B1bGF0aW5nCisJICoKKwkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRQb3B1bGF0aW5nKGJvb2xlYW4gcG9wdWxhdGluZykgeworCQl0aGlzLnBvcHVsYXRpbmcgPSBwb3B1bGF0aW5nOworCX0KKworCS8qKgorCSAqIEVpdGhlciBzaG93IG9yIGhpZGVzIHRoaXMgcGFuZS4KKwkgKgorCSAqIEBwYXJhbSB2aXNpYmxlIFRoZSBuZXcgdmlzaWJpbGl0eSBzdGF0ZQorCSAqLworCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CisJCWlmICghdGhpcy5jb250YWluZXIuaXNEaXNwb3NlZCgpKSB7CisJCQl0aGlzLmNvbnRhaW5lci5zZXRWaXNpYmxlKHZpc2libGUpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmVhcmVzdCA8Y29kZT5TaGVsbDwvY29kZT4gZGlzcGxheWluZyB0aGUgbWFpbiB3aWRnZXQgb2YgdGhpcworCSAqIHBhbmUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBuZWFyZXN0IHdpbmRvdyBkaXNwbGF5aW5nIHRoaXMgcGFuZQorCSAqLworCXByb3RlY3RlZCBmaW5hbCBTaGVsbCBnZXRTaGVsbCgpIHsKKwkJcmV0dXJuIHRoaXMuY29udGFpbmVyLmdldFNoZWxsKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc3ViamVjdCBvZiB0aGlzIHBhbmUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBzdWJqZWN0IGlmIHRoaXMgcGFuZSB3YXMgbm90IGRpc3Bvc2VkOyA8Y29kZT5udWxsPC9jb2RlPgorCSAqIGlmIGl0IHdhcworCSAqCisJICogQGNhdGVnb3J5IFBvcHVsYXRlCisJICovCisJcHVibGljIFQgZ2V0U3ViamVjdCgpIHsKKwkJcmV0dXJuIHRoaXMuc3ViamVjdEhvbGRlci5nZXRWYWx1ZSgpOworCX0KKworCS8qKgorCSAqIFRoZSBzdWJqZWN0IGhhcyBjaGFuZ2VkLCBkaXNjb25uZWN0cyBhbnkgbGlzdGVuZXJzIGZyb20gdGhlIG9sZCBzdWJqZWN0CisJICogYW5kIGNvbm5lY3RzIHRob3NlIGxpc3RlbmVycyBvbnRvIHRoZSBuZXcgc3ViamVjdC4KKwkgKgorCSAqIEBwYXJhbSBvbGRzdWJqZWN0IFRoZSBvbGQgc3ViamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIHdhcyBzZXQKKwkgKiBAcGFyYW0gbmV3U3ViamVjdCBUaGUgbmV3IHN1YmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBuZWVkcyB0byBiZQorCSAqIHNldAorCSAqCisJICogQGNhdGVnb3J5IFBvcHVsYXRlCisJICovCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgc3ViamVjdENoYW5nZWQoVCBvbGRTdWJqZWN0LCBUIG5ld1N1YmplY3QpIHsKKwkJaWYgKCF0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKKworCQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICJzdWJqZWN0Q2hhbmdlZCgpIik7CisJCQl0aGlzLmRpc2VuZ2FnZUxpc3RlbmVycyhvbGRTdWJqZWN0KTsKKworCQkJdGhpcy5yZXBvcHVsYXRlKCk7CisKKwkJCXRoaXMuZW5nYWdlTGlzdGVuZXJzKG5ld1N1YmplY3QpOworCQl9CisJfQorCisKKwkvKioKKwkgKiBSZWdpc3RlcnMgYW5vdGhlciA8Y29kZT5QYW5lPC9jb2RlPiB3aXRoIHRoaXMgb25lIHNvIGl0IGNhbgorCSAqIGJlIGF1dG9tYXRpY2FsbHkgbm90aWZpZWQgYWJvdXQgY2VydGFpbiBldmVudHMgc3VjaCBhcyBlbmdhZ2luZyBvcgorCSAqIGRpc2VuZ2FnaW5nIHRoZSBsaXN0ZW5lcnMsIGV0Yy4KKwkgKgorCSAqIEBwYXJhbSBzdWJQYW5lIFRoZSBzdWItcGFuZSB0byByZWdpc3RlcgorCSAqCisJICogQGNhdGVnb3J5IENvbnRyb2xsZXIKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWdpc3RlclN1YlBhbmUoUGFuZTw/PiBzdWJQYW5lKSB7CisJCXRoaXMuc3ViUGFuZXMuYWRkKHN1YlBhbmUpOworCX0KKworCS8qKgorCSAqIFVucmVnaXN0ZXJzIHRoZSBnaXZlbiA8Y29kZT5QYW5lPC9jb2RlPiBmcm9tIHRoaXMgb25lIHNvIGl0CisJICogY2FuIG5vIGxvbmdlciBiZSBhdXRvbWF0aWNhbGx5IG5vdGlmaWVkIGFib3V0IGNlcnRhaW4gZXZlbnRzIHN1Y2ggYXMKKwkgKiBlbmdhZ2luZyBvciBkaXNlbmdhZ2luZyB0aGUgbGlzdGVuZXJzLCBldGMuCisJICoKKwkgKiBAcGFyYW0gc3ViUGFuZSBUaGUgc3ViLXBhbmUgdG8gdW5yZWdpc3RlcgorCSAqCisJICogQGNhdGVnb3J5IENvbnRyb2xsZXIKKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCB1bnJlZ2lzdGVyU3ViUGFuZShQYW5lPD8+IHN1YlBhbmUpIHsKKwkJdGhpcy5zdWJQYW5lcy5yZW1vdmUoc3ViUGFuZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhbmUoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlpZiAoIWlzUG9wdWxhdGluZygpICYmICF0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXRoaXMucG9wdWxhdGluZyA9IHRydWU7CisKKwkJCXRyeSB7CisJCQkJcHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7CisJCQl9CisJCQlmaW5hbGx5IHsKKwkJCQl0aGlzLnBvcHVsYXRpbmcgPSBmYWxzZTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgImRpc3Bvc2UoKSIpOworCisJCS8vIERpc3Bvc2UgdGhpcyBwYW5lCisJCXRoaXMuZGlzZW5nYWdlTGlzdGVuZXJzKGdldFN1YmplY3QoKSk7CisJCXRoaXMuZGlzZW5nYWdlU3ViamVjdEhvbGRlcigpOworCisJCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyLmRpc3Bvc2UoKTsKKwkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLmRpc3Bvc2UoKTsKKworCQkvLyBBc2sgdGhlIHN1Yi1wYW5lcyB0byBkaXNwb3NlIHRoZW1zZWx2ZXMKKwkJZm9yIChQYW5lPD8+IHN1YlBhbmUgOiB0aGlzLnN1YlBhbmVzKSB7CisJCQlzdWJQYW5lLmRpc3Bvc2UoKTsKKwkJfQorCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkuamF2YQppbmRleCA1ZDU0ZjgyLi5kYzMyMGExIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Qcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeS5qYXZhCkBAIC05LDExICs5LDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwogCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKIAogLyoqCkBAIC00MiwxNSArMzksNiBAQAogCSAqIHtAaW5oZXJpdERvY30KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ0NvbWJvIGNyZWF0ZUNDb21ibyhDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcGFyZW50ID0gY3JlYXRlQm9yZGVyQ29udGFpbmVyKHBhcmVudCk7Ci0JCXJldHVybiBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7CiAJCXJldHVybiBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7CiAJfQpAQCAtNjcsMTUgKzU1LDYgQEAKIAkgKiB7QGluaGVyaXREb2N9CiAJICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcGFyZW50ID0gY3JlYXRlQm9yZGVyQ29udGFpbmVyKHBhcmVudCk7Ci0JCXJldHVybiBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChwYXJlbnQsIG51bGwsIFNXVC5GTEFUIHwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKIAlwdWJsaWMgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZ2V0V2lkZ2V0RmFjdG9yeSgpIHsKIAkJcmV0dXJuIChUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkgc3VwZXIuZ2V0V2lkZ2V0RmFjdG9yeSgpOwogCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvVmFsaWRhdGluZ0RpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9WYWxpZGF0aW5nRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlNmRhMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvVmFsaWRhdGluZ0RpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMTk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Qcm9ibGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworCisvKioKKyAqIFRoaXMgZGlhbG9nIGlzIHNpbWlsYXIgdG8gaXQgc3VwZXJjbGFzcywgPGNvZGU+RGlhbG9nPC9jb2RlPiwgd2l0aAorICogdGhlIGFkZGVkIHZhbHVlIG9mIGFuIGVycm9yIG1lc3NhZ2UgbGFiZWwgYmVsb3cgdGhlIG1haW4gcGFuZWwuIEEgc3ViY2xhc3MKKyAqIGNhbiBzZXQgdGhpcyBlcnJvciBtZXNzYWdlIGFzIG5lZWRlZCBzbyB0aGF0IGl0IGNhbiBpbmZvcm0gdGhlIHVzZXIgc29tZXRoaW5nCisgKiBpbmNvcnJlY3QgaGFzIGJlZW4gZW50ZXJlZC4KKyAqIDxwPgorICogSWYgdGhlcmUgaXMgYW4gZXJyb3IgbWVzc2FnZSwgaXQgd2lsbCBiZSBzaG93bi4gSWYgdGhlcmUgaXMgYSB3YXJuaW5nCisgKiBtZXNzYWdlLCBpdCB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gV2FybmluZyBtZXNzYWdlcworICogaGF2ZSBhIGRpZmZlcmVudCBpY29uIHRoYW4gZXJyb3IgbWVzc2FnZXMuCisgKgorICogQHZlcnNpb24gMi4wCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWxpZGF0aW5nRGlhbG9nPFQgZXh0ZW5kcyBOb2RlPiBleHRlbmRzIERpYWxvZzxUPiB7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlZhbGlkYXRpbmdEaWFsb2c8L2NvZGU+LgorCSAqCisJICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCisJICovCisJcHVibGljIFZhbGlkYXRpbmdEaWFsb2coU2hlbGwgcGFyZW50KSB7CisJCXN1cGVyKHBhcmVudCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW5nRGlhbG9nPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAorCSAqIEBwYXJhbSB0aXRsZSBUaGUgZGlhbG9nJ3MgdGl0bGUKKwkgKi8KKwlwdWJsaWMgVmFsaWRhdGluZ0RpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSkgeworCQlzdXBlcihwYXJlbnQsIHRpdGxlKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlmaW5hbCBOb2RlLlZhbGlkYXRvciBidWlsZFZhbGlkYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBOb2RlLlZhbGlkYXRvcigpIHsKKwkJCXB1YmxpYyB2b2lkIHBhdXNlKCkgeworCQkJfQorCisJCQlwdWJsaWMgdm9pZCByZXN1bWUoKSB7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgeworCQkJCVZhbGlkYXRpbmdEaWFsb2cudGhpcy52YWxpZGF0ZSgpOworCQkJfQorCQl9OworCX0KKworCS8qKgorCSAqIENsZWFycyB0aGUgZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBkZXNjcmlwdGlvbiBwYW5lLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCB2b2lkIGNsZWFyRXJyb3JNZXNzYWdlKCkgeworCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gc2hvd24gaW4gdGhlIGRlc2NyaXB0aW9uIHBhbmUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdGlvbiB1bmRlciB0aGUgZGVzY3JpcHRpb24ncyB0aXRsZQorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGltYWdlIHNob3duIGluIHRoZSBkZXNjcmlwdGlvbiBwYW5lLgorCSAqCisJICogQHJldHVybiBUaGUgaW1hZ2Ugb2YgdGhlIGRlc2NyaXB0aW9uIHBhbmUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcworCSAqIHJlcXVpcmVkCisJICovCisJcHJvdGVjdGVkIEltYWdlIGdldERlc2NyaXB0aW9uSW1hZ2UoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHRpdGxlIG9mIHRoZSBkZXNjcmlwdGlvbiBwYW5lLgorCSAqCisJICogQHJldHVybiBUaGUgdGl0bGUgc2hvd24gaW4gdGhlIGRlc2NyaXB0aW9uIHBhbmUKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uVGl0bGUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsU2l6ZSgpIHsKKwkJUG9pbnQgcmVzdWx0ID0gZ2V0U2hlbGwoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOworCQlQb2ludCBwYW5lU2l6ZSA9IGdldFBhbmUoKS5nZXRDb250cm9sKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKKwkJaW50IHdpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNDAwKTsKKwkJcmVzdWx0LnggPSBNYXRoLm1heCh3aWR0aCwgcGFuZVNpemUueCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzVGl0bGVBcmVhKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVUkoKSB7CisKKwkJc3VwZXIuaW5pdGlhbGl6ZVVJKCk7CisKKwkJLy8gVXBkYXRlIHRoZSBkZXNjcmlwdGlvbiB0aXRsZQorCQlTdHJpbmcgZGVzY3JpcHRpb25UaXRsZSA9IGdldERlc2NyaXB0aW9uVGl0bGUoKTsKKworCQlpZiAoZGVzY3JpcHRpb25UaXRsZSAhPSBudWxsKSB7CisJCQlzZXRUaXRsZShkZXNjcmlwdGlvblRpdGxlKTsKKwkJfQorCisJCS8vIFVwZGF0ZSB0aGUgZGVzY3JpcHRpb24gdGl0bGUKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZ2V0RGVzY3JpcHRpb24oKTsKKworCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgeworCQkJc2V0TWVzc2FnZShkZXNjcmlwdGlvbik7CisJCX0KKworCQkvLyBVcGRhdGUgdGhlIGRlc2NyaXB0aW9uIGltYWdlCisJCUltYWdlIGltYWdlID0gZ2V0RGVzY3JpcHRpb25JbWFnZSgpOworCisJCWlmIChpbWFnZSAhPSBudWxsKSB7CisJCQlzZXRUaXRsZUltYWdlKGltYWdlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFVwZGF0ZXMgdGhlIGRlc2NyaXB0aW9uIHBhbmUgYnkgc2hvd2luZyB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZSBhbmQgZm9ybWF0CisJICogdGhlIHRleHQgd2l0aCB0aGUgZ2l2ZW4gbGlzdCBvZiBhcmd1bWVudHMgaWYgYW55IGV4aXN0cy4KKwkgKgorCSAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGVzY3JpcHRpb24gcGFuZQorCSAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGxpc3Qgb2YgYXJndW1lbnRzIHVzZWQgdG8gZm9ybWF0IHRoZSBlcnJvciBtZXNzYWdlCisJICovCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UsIE9iamVjdC4uLiBhcmd1bWVudHMpIHsKKwkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKGVycm9yTWVzc2FnZSwgYXJndW1lbnRzKSk7CisJfQorCisJLyoqCisJICogVXBkYXRlcyB0aGUgZXJyb3IgbWVzc2FnZSwgZWl0aGVyIHNob3dzIHRoZSBmaXJzdCBlcnJvciBwcm9ibGVtIG9yIGhpZGVzCisJICogdGhlIGVycm9yIHBhbmUuIElmIHRoZSBwcm9ncmVzcyBiYXIgaXMgc2hvd24sIHRoZW4gdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbAorCSAqIG5vdCBiZSBzaG93bi4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkgeworCQlpZiAoZ2V0U3ViamVjdCgpLmhhc0JyYW5jaFByb2JsZW1zKCkpIHsKKwkJCVByb2JsZW0gcHJvYmxlbSA9IGdldFN1YmplY3QoKS5icmFuY2hQcm9ibGVtcygpLm5leHQoKTsKKwkJCXNldEVycm9yTWVzc2FnZShwcm9ibGVtLm1lc3NhZ2VLZXkoKSwgcHJvYmxlbS5tZXNzYWdlQXJndW1lbnRzKCkpOworCQl9CisJCS8vIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gYWRkIHdhcm5pbmdzIHRvIHRoZSBtb2RlbAorLy8JCWVsc2UgaWYgKHRoaXMuc3ViamVjdCgpLmhhc0JyYW5jaFdhcm5pbmdzKCkpIHsKKy8vCQkJUHJvYmxlbSBwcm9ibGVtID0gdGhpcy5zdWJqZWN0KCkuYnJhbmNoV2FybmluZ3MoKS5uZXh0KCk7CisvLwkJCXRoaXMuc2V0V2FybmluZ01lc3NhZ2VLZXkocHJvYmxlbS5nZXRNZXNzYWdlS2V5KCksIHByb2JsZW0uZ2V0TWVzc2FnZUFyZ3VtZW50cygpKTsKKy8vCQl9CisJCWVsc2UgeworCQkJY2xlYXJFcnJvck1lc3NhZ2UoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFZhbGlkYXRlcyB0aGUgc3RhdGUgb2JqZWN0IGFuZCBiYXNlZCBvbiBpdHMgc3RhdHVzLCB1cGRhdGUgdGhlIGRlc2NyaXB0aW9uCisJICogcGFuZSB0byBzaG93IHRoZSBmaXJzdCBlcnJvciBpZiBhbnkgZXhpc3RzIGFuZCB1cGRhdGUgdGhlIGVuYWJsZW1lbnQgb2YKKwkgKiB0aGUgT0sgYnV0dG9uLgorCSAqLworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKKwkJZ2V0U3ViamVjdCgpLnZhbGlkYXRlQnJhbmNoKCk7CisJCXVwZGF0ZUVycm9yTWVzc2FnZSgpOworCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoIWdldFN1YmplY3QoKS5oYXNCcmFuY2hQcm9ibGVtcygpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMDQzMTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuSnB0RGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLnVpLmludGVybmFsLkRUUFVpVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi17Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGU7Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXI7Ci0KLQlwcml2YXRlIERhdGFiYXNlR3JvdXAgZGF0YWJhc2VHcm91cDsKLQotCXB1YmxpYyBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXN1cGVyKCJEYXRhYmFzZSBTZXR0aW5ncyIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7Ci0JCXNldFRpdGxlKEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2RhdGFiYXNlQ29ubmVjdGlvbik7Ci0JCXNldE1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfcmVjb25uZWN0VG9EYXRhYmFzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJQ29tcG9zaXRlIHRvcCA9IHRoaXMuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQkJdGhpcy5zZXRDb250cm9sKHRvcCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGhpcy5kYXRhYmFzZUdyb3VwID0gbmV3IERhdGFiYXNlR3JvdXAoY29tcG9zaXRlKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQkvLyBUT0RPIEFkZCBIZWxwIC0gdGVzdGluZwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuUFJPUEVSVElFU19KQVZBX1BFUlNJU1RFTkNFX0NPTk5FQ1RJT04pOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gMzA7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsIGJvb2xlYW4gZmlsbEhvcml6b250YWwpIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0JCWlmIChmaWxsSG9yaXpvbnRhbCkgewotCQkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJfQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhIGdyaWQgbGF5b3V0IHdpdGggdGhlIGRlZmF1bHQgRGlhbG9nIHNldHRpbmdzLgotCSAqLwotCXByb3RlY3RlZCBHcmlkTGF5b3V0IGluaXRHcmlkTGF5b3V0KEdyaWRMYXlvdXQgbGF5b3V0LCBib29sZWFuIG1hcmdpbnMpIHsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gdGhpcy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSB0aGlzLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlpZiAobWFyZ2lucykgewotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gdGhpcy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSB0aGlzLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCX0KLQkJcmV0dXJuIGxheW91dDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxUYWJsZT4gZ2V0VGFibGVzKCkgewotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCWlmIChzY2hlbWEgIT0gbnVsbCAmJiBzY2hlbWEuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzY2hlbWEudGFibGVzKCkpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy48VGFibGU+IGVtcHR5TGlzdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHZW5lcmF0ZUVudGl0aWVzUGFnZShTY2hlbWEgc2NoZW1hKSB7Ci0JCWlmICh0aGlzLmdldFdpemFyZCgpIGluc3RhbmNlb2YgR2VuZXJhdGVFbnRpdGllc1dpemFyZCkgewotCQkJR2VuZXJhdGVFbnRpdGllc1dpemFyZCBnZW5lcmF0ZUVudGl0aWVzV2l6YXJkID0gKChHZW5lcmF0ZUVudGl0aWVzV2l6YXJkKSB0aGlzLmdldFdpemFyZCgpKTsKLQkJCWdlbmVyYXRlRW50aXRpZXNXaXphcmQudXBkYXRlUG9zc2libGVUYWJsZXMoQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc2NoZW1hLnRhYmxlcygpKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJaWYgKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnByb2ZpbGUgIT0gbnVsbCkgewotCQkJCXRoaXMucHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQkJfQotCQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JQ29ubmVjdGlvblByb2ZpbGUgZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlTdHJpbmcgcHJvZmlsZU5hbWUgPSB0aGlzLmpwYVByb2plY3QuZ2V0RGF0YVNvdXJjZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOwotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZU5hbWVkKHByb2ZpbGVOYW1lKTsKLQl9Ci0KLQlDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZU5hbWVkKFN0cmluZyBwcm9maWxlTmFtZSkgewotCQlyZXR1cm4gSnB0RGJQbHVnaW4uaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkoKS5jb25uZWN0aW9uUHJvZmlsZU5hbWVkKHByb2ZpbGVOYW1lKTsKLQl9Ci0KLQlTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2VHcm91cC5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckNvbm5lY3Rpb25Qcm9maWxlTmFtZSgpIHsKLQkJdGhpcy5kYXRhYmFzZUdyb3VwLmNsZWFyQ29ubmVjdGlvblByb2ZpbGVOYW1lKCk7Ci0JfQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCXByaXZhdGUgZmluYWwgY2xhc3MgRGF0YWJhc2VHcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBHcm91cCBncm91cDsKLQotCQlwcml2YXRlIGZpbmFsIENvbWJvIGNvbm5lY3Rpb25Db21ibzsKLQotCQlwcml2YXRlIGZpbmFsIENvbWJvIHNjaGVtYUNvbWJvOwotCi0JCXByaXZhdGUgTGluayBhZGRDb25uZWN0aW9uTGluazsKLQotCQlwcml2YXRlIExpbmsgcmVjb25uZWN0TGluazsKLQotCQlwdWJsaWMgRGF0YWJhc2VHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQl0aGlzLmdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkJdGhpcy5ncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCXRoaXMuZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQl0aGlzLmdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfZGF0YWJhc2UpOwotCQkJLy8gVE9ETyBBZGQgSGVscAotCQkJLy8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggdGhpcy5ncm91cCwKLQkJCS8vIElEYWxpSGVscENvbnRleHRJZHMuWFhYKTsKLQkJCWNyZWF0ZUxhYmVsKHRoaXMuZ3JvdXAsIDEsIEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2Nvbm5lY3Rpb24pOwotCQkJdGhpcy5jb25uZWN0aW9uQ29tYm8gPSBjcmVhdGVDb21ibyh0aGlzLmdyb3VwLCB0cnVlKTsKLQkJCXRoaXMuY29ubmVjdGlvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaGFuZGxlQ29ubmVjdGlvbkNoYW5nZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJY3JlYXRlTGFiZWwodGhpcy5ncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2Vfc2NoZW1hKTsKLQkJCXRoaXMuc2NoZW1hQ29tYm8gPSBjcmVhdGVDb21ibyh0aGlzLmdyb3VwLCB0cnVlKTsKLQkJCXRoaXMuc2NoZW1hQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQloYW5kbGVTY2hlbWFDaGFuZ2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWNyZWF0ZUxhYmVsKHRoaXMuZ3JvdXAsIDIsIEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3NjaGVtYUluZm8pOwotCQkJdGhpcy5hZGRDb25uZWN0aW9uTGluayA9IG5ldyBMaW5rKHRoaXMuZ3JvdXAsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCXRoaXMuYWRkQ29ubmVjdGlvbkxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXRoaXMuYWRkQ29ubmVjdGlvbkxpbmsuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkRhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9hZGRDb25uZWN0aW9uTGluayk7Ci0JCQl0aGlzLmFkZENvbm5lY3Rpb25MaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJb3Blbk5ld0Nvbm5lY3Rpb25XaXphcmQoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXRoaXMucmVjb25uZWN0TGluayA9IG5ldyBMaW5rKHRoaXMuZ3JvdXAsIFNXVC5OT05FKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCXRoaXMucmVjb25uZWN0TGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJdGhpcy5yZWNvbm5lY3RMaW5rLnNldFRleHQoSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfcmVjb25uZWN0TGluayk7Ci0JCQl0aGlzLnJlY29ubmVjdExpbmsuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl0aGlzLnJlY29ubmVjdExpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlvcGVuQ29ubmVjdGlvblByb2ZpbGVOYW1lZChnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQl0aGlzLnBvcHVsYXRlQ29ubmVjdGlvbkNvbWJvKCk7Ci0JCQl0aGlzLnBvcHVsYXRlU2NoZW1hQ29tYm8oKTsKLQkJfQotCi0JCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGVOYW1lZChTdHJpbmcgcHJvZmlsZU5hbWUpIHsKLQkJCXJldHVybiBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5jb25uZWN0aW9uUHJvZmlsZU5hbWVkKHByb2ZpbGVOYW1lKTsKLQkJfQotCi0JCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBkdHBDb25uZWN0aW9uUHJvZmlsZU5hbWVzKCkgewotCQkJcmV0dXJuIEpwdERiUGx1Z2luLmluc3RhbmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5KCkuY29ubmVjdGlvblByb2ZpbGVOYW1lcygpOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpIHsKLQkJCXJldHVybiBqcGFQcm9qZWN0LmdldERhdGFTb3VyY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBvcGVuQ29ubmVjdGlvblByb2ZpbGVOYW1lZChTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lKSB7Ci0JCQlEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJCURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS50aGlzLnByb2ZpbGUgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTmFtZWQoY29ubmVjdGlvblByb2ZpbGVOYW1lKTsKLQkJCURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS50aGlzLnByb2ZpbGUuY29ubmVjdCgpOwotCQkJaWYgKERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS50aGlzLnByb2ZpbGUuaXNBY3RpdmUoKSkgewotCQkJCXRoaXMucG9wdWxhdGVTY2hlbWFDb21ibygpOwotCQkJCURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS50aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJCQlEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5wcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29ubmVjdGlvbkNvbWJvKCkgewotCQkJLy8gY2xlYXIgb3V0IGNvbm5lY3Rpb24gZW50cmllcyBmcm9tIHByZXZpb3VzIGxvZ2luLgotCQkJdGhpcy5jb25uZWN0aW9uQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaSA9IENvbGxlY3Rpb25Ub29scy5zb3J0KHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGVOYW1lcygpKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJdGhpcy5jb25uZWN0aW9uQ29tYm8uYWRkKGkubmV4dCgpKTsKLQkJCX0KLQkJCVN0cmluZyBjb25uZWN0aW9uTmFtZSA9IGdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZU5hbWUoKTsKLQkJCWlmICghU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShjb25uZWN0aW9uTmFtZSkpIHsKLQkJCQl0aGlzLmNvbm5lY3Rpb25Db21iby5zZWxlY3QoY29ubmVjdGlvbkNvbWJvLmluZGV4T2YoY29ubmVjdGlvbk5hbWUpKTsKLQkJCQl0aGlzLnJlY29ubmVjdExpbmsuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVDb25uZWN0aW9uQ2hhbmdlKCkgewotCQkJdGhpcy5yZWNvbm5lY3RMaW5rLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl0aGlzLnBvcHVsYXRlU2NoZW1hQ29tYm8oKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVTY2hlbWFDaGFuZ2UoKSB7Ci0JCQlDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lZChnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKSk7Ci0JCQlTY2hlbWEgc2NoZW1hID0gY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lZCh0aGlzLmdldFNjaGVtYU5hbWUoKSk7Ci0JCQlEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy51cGRhdGVHZW5lcmF0ZUVudGl0aWVzUGFnZShzY2hlbWEpOwotCQkJRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlLnRoaXMuc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHBvcHVsYXRlU2NoZW1hQ29tYm8oKSB7Ci0JCQkvLyBjbGVhciBvdXQgc2NoZW1hIGVudHJpZXMgZnJvbSBwcmV2aW91cyBjb25uZWN0aW9uIHNlbGVjdGlvbgotCQkJdGhpcy5zY2hlbWFDb21iby5yZW1vdmVBbGwoKTsKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZU5hbWVkKGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpKTsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc29ydChjb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLnNjaGVtYU5hbWVzKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCXRoaXMuc2NoZW1hQ29tYm8uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQkJLy8gZ2V0IGRlZmF1bHQgc2NoZW1hIG5hbWUgZnJvbSB0aGUgcHJvamVjdAotCQkJU2NoZW1hIHNjaGVtYSA9IGdldERlZmF1bHRTY2hlbWEoKTsKLQkJCWlmIChzY2hlbWEgIT0gbnVsbCAmJiBzY2hlbWEuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQlzY2hlbWEgPSBjb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLnNjaGVtYU5hbWVkKHNjaGVtYS5nZXROYW1lKCkpOyAvLyB2ZXJpZnkKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzY2hlbWEKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBleGlzdAotCQkJCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJCQl0aGlzLnNjaGVtYUNvbWJvLnNlbGVjdCh0aGlzLnNjaGVtYUNvbWJvLmluZGV4T2Yoc2NoZW1hLmdldE5hbWUoKSkpOwotCQkJCQlEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy51cGRhdGVHZW5lcmF0ZUVudGl0aWVzUGFnZShzY2hlbWEpOwotCQkJCQlEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvbkNvbWJvLmdldFRleHQoKTsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIGdldFNjaGVtYU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zY2hlbWFDb21iby5nZXRUZXh0KCk7Ci0JCX0KLQotCQl2b2lkIGNsZWFyQ29ubmVjdGlvblByb2ZpbGVOYW1lKCkgewotCQkJdGhpcy5jb25uZWN0aW9uQ29tYm8uc2V0VGV4dCgiIik7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgb3Blbk5ld0Nvbm5lY3Rpb25XaXphcmQoKSB7Ci0JCQlTdHJpbmcgYWRkZWRQcm9maWxlTmFtZSA9IERUUFVpVG9vbHMuY3JlYXRlTmV3UHJvZmlsZSgpOwotCQkJQ29ubmVjdGlvblByb2ZpbGUgYWRkZWRQcm9maWxlID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZU5hbWVkKGFkZGVkUHJvZmlsZU5hbWUpOwotCQkJaWYgKCFhZGRlZFByb2ZpbGUuaXNOdWxsKCkpIHsKLQkJCQlhZGRlZFByb2ZpbGUuY29ubmVjdCgpOwotCQkJCXRoaXMucG9wdWxhdGVDb25uZWN0aW9uQ29tYm8oKTsKLQkJCQl0aGlzLmNvbm5lY3Rpb25Db21iby5zZWxlY3QoY29ubmVjdGlvbkNvbWJvLmluZGV4T2YoYWRkZWRQcm9maWxlLmdldE5hbWUoKSkpOwotCQkJCXRoaXMuaGFuZGxlQ29ubmVjdGlvbkNoYW5nZSgpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25BZGFwdGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQkJCWlmIChEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5wcm9maWxlLmVxdWFscyhwcm9maWxlKSkgewotCQkJCQkJRGF0YWJhc2VHcm91cC50aGlzLnBvcHVsYXRlU2NoZW1hQ29tYm8oKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQkJCWlmIChEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5wcm9maWxlLmVxdWFscyhwcm9maWxlKSkgewotCQkJCQkJRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlLnRoaXMucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxOGJmOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlLmphdmEKQEAgLTAsMCArMSw0NDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuU2NoZW1hQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJvcGVydGllcy5KcGFQcm9qZWN0UHJvcGVydGllc1BhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKKworLyoqCisgKiBNb3N0IG9mIHRoZSBiZWhhdmlvciBpcyBpbiBEYXRhYmFzZUdyb3VwLi4uLgorICogCisgKiBXZSBvcGVuIHRoZSB3aXphcmQgcGFnZSB3aXRoIHRoZSBKUEEgcHJvamVjdCdzIGNvbm5lY3Rpb24gcHJvZmlsZSBhbmQKKyAqIGRlZmF1bHQgc2NoZW1hIHNlbGVjdGVkIChpZiBwb3NzaWJsZSksIGJ1dCB0aGVuIHRoZSBzZWxlY3Rpb25zIGFyZSBkcml2ZW4KKyAqIGJ5IHRoZSB1c2VyLiBJZiB0aGUgdXNlciByZS1zZWxlY3RzIHRoZSBKUEEgcHJvamVjdCdzIGNvbm5lY3Rpb24gcHJvZmlsZSwKKyAqIHdlIHdpbGwgcHJlLXNlbGVjdCB0aGUgcHJvamVjdCdzIGRlZmF1bHQgc2NoZW1hIGlmIHBvc3NpYmxlLgorICovCitwdWJsaWMgY2xhc3MgRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7CisKKwlmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7CisKKwlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOworCisJcHJpdmF0ZSBEYXRhYmFzZUdyb3VwIGRhdGFiYXNlR3JvdXA7CisKKworCXB1YmxpYyBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7CisJCXN1cGVyKCJEYXRhYmFzZSBTY2hlbWEiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoanBhUHJvamVjdCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKwkJfQorCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OworCQl0aGlzLnNldFRpdGxlKEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3RpdGxlKTsKKwkJdGhpcy5zZXRNZXNzYWdlKEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2Rlc2MpOworCX0KKworCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7CisJCXRoaXMuc2V0Q29udHJvbCh0aGlzLmJ1aWxkVG9wTGV2ZWxDb250cm9sKHBhcmVudCkpOworCX0KKworCXByaXZhdGUgQ29udHJvbCBidWlsZFRvcExldmVsQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOworCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOworCQl0aGlzLmRhdGFiYXNlR3JvdXAgPSBuZXcgRGF0YWJhc2VHcm91cChjb21wb3NpdGUpOworCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7CisJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5QUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0VfQ09OTkVDVElPTik7CisJCXJldHVybiBjb21wb3NpdGU7CisJfQorCisJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIGdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpIHsKKwkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOworCX0KKwkKKwlwdWJsaWMgU2NoZW1hIGdldFNlbGVjdGVkU2NoZW1hKCkgeworCQlyZXR1cm4gdGhpcy5kYXRhYmFzZUdyb3VwLmdldFNlbGVjdGVkU2NoZW1hKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJdGhpcy5kYXRhYmFzZUdyb3VwLmRpc3Bvc2UoKTsKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCisJLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgorCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgeworCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCXZvaWQgZmlyZVNjaGVtYUNoYW5nZWQoU2NoZW1hIHNjaGVtYSkgeworCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShzY2hlbWEgIT0gbnVsbCk7CisJCWZvciAoTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgeworCQkJbGlzdGVuZXIuc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKHNjaGVtYSk7CisJCX0KKwl9CisKKworCS8vICoqKioqKioqKiogbGlzdGVuZXIgaW50ZXJmYWNlICoqKioqKioqKioKKworCS8qKgorCSAqIEFsbG93cyBjbGllbnRzIHRvIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlCisJICogYW5kIHNjaGVtYS4KKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CisJCXZvaWQgc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKFNjaGVtYSBzY2hlbWEpOworCX0KKworCisJLy8gKioqKioqKioqKiBkYXRhYmFzZSBncm91cCAqKioqKioqKioqCisKKwkvKioKKwkgKiBzY2hlbWEgY29tYm8tYm94CisJICogYWRkIHByb2plY3QgY29ubmVjdGlvbiBsaW5rCisJICogcmVjb25uZWN0IGxpbmsKKwkgKi8KKwljbGFzcyBEYXRhYmFzZUdyb3VwIHsKKworCQkvLyB0aGVzZSBhcmUga2VwdCBpbiBzeW5jaCB3aXRoIHRoZSBzZWxlY3Rpb24KKwkJcHJpdmF0ZSBTY2hlbWEgc2VsZWN0ZWRTY2hlbWE7CisKKwkJcHJpdmF0ZSBmaW5hbCBDb21ibyBzY2hlbWFDb21ib0JveDsKKworCQlwcml2YXRlIGZpbmFsIExpbmsgcmVjb25uZWN0TGluazsKKworCQlwcml2YXRlIExpbmsgYWRkSnBhUHJvamVjdENvbm5lY3Rpb25MaW5rOworCQkKKwkJcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOworCisKKwkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgorCisJCURhdGFiYXNlR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJc3VwZXIoKTsKKworCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsgIC8vIGZhbHNlID0gZG8gbm90IG1ha2UgY29sdW1ucyBlcXVhbCB3aWR0aAorCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3NjaGVtYVNldHRpbmdzKTsKKwkJCS8vIFRPRE8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLmdyb3VwLCBKcGFIZWxwQ29udGV4dElkcy5YWFgpOworCisJCQkvLyBzY2hlbWEgY29tYm8tYm94CisJCQl0aGlzLmJ1aWxkTGFiZWwoZ3JvdXAsIDEsIEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3NjaGVtYSk7CisJCQl0aGlzLnNjaGVtYUNvbWJvQm94ID0gdGhpcy5idWlsZENvbWJvQm94KGdyb3VwLCB0aGlzLmJ1aWxkU2NoZW1hQ29tYm9Cb3hTZWxlY3Rpb25MaXN0ZW5lcigpKTsKKwkJCQorCQkJU3RyaW5nIG1lc3NhZ2UgPSAodGhpcy5wcm9qZWN0SGFzQUNvbm5lY3Rpb24oKSkgPworCQkJCUpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3NjaGVtYUluZm8gOgorCQkJCUpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2Nvbm5lY3Rpb25JbmZvOworCQkJCisJCQl0aGlzLmJ1aWxkTGFiZWwoZ3JvdXAsIDIsIG1lc3NhZ2UpOworCisJCQkvLyBhZGQgcHJvamVjdCdzIGNvbm5lY3Rpb24gbGluaworCQkJaWYoICEgdGhpcy5wcm9qZWN0SGFzQUNvbm5lY3Rpb24oKSkgeworCQkJCXRoaXMuYWRkSnBhUHJvamVjdENvbm5lY3Rpb25MaW5rID0gdGhpcy5idWlsZExpbmsoZ3JvdXAsIAorCQkJCQkJCUpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2FkZENvbm5lY3Rpb25Ub1Byb2plY3QsIAorCQkJCQkJCXRoaXMuYnVpbGRBZGRKcGFQcm9qZWN0Q29ubmVjdGlvbkxpbmtMaXN0ZW5lcigpKTsKKwkJCX0KKworCQkJLy8gcmVjb25uZWN0IGxpbmsKKwkJCXRoaXMucmVjb25uZWN0TGluayA9IHRoaXMuYnVpbGRMaW5rKGdyb3VwLCBKcHRVaU1lc3NhZ2VzLkRhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9jb25uZWN0TGluaywgdGhpcy5idWlsZFJlY29ubmVjdExpbmtTZWxlY3Rpb25MaXN0ZW5lcigpKTsKKwkJCXRoaXMucmVjb25uZWN0TGluay5zZXRFbmFibGVkKHRydWUpOworCisJCQl0aGlzLnNlbGVjdGVkU2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7CisKKwkJCWlmICh0aGlzLnNlbGVjdGVkU2NoZW1hICE9IG51bGwpIHsKKwkJCQlEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UudGhpcy5maXJlU2NoZW1hQ2hhbmdlZCh0aGlzLnNlbGVjdGVkU2NoZW1hKTsKKwkJCX0KKworCQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7CisJCQl0aGlzLmFkZEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKKworCQkJdGhpcy51cGRhdGVTY2hlbWFDb21ib0JveCgpOworCQkJdGhpcy51cGRhdGVSZWNvbm5lY3RMaW5rKCk7CisJCX0KKworCisJCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgorCisJCVNjaGVtYSBnZXRTZWxlY3RlZFNjaGVtYSgpIHsKKwkJCXJldHVybiB0aGlzLnNlbGVjdGVkU2NoZW1hOworCQl9CisKKwkJdm9pZCBkaXNwb3NlKCkgeworCQkJaWYodGhpcy5wcm9qZWN0SGFzQUNvbm5lY3Rpb24oKSkgeworCQkJCXRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKKwkJCX0KKwkJfQorCisKKwkJLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKKworCQl2b2lkIGFkZEpwYVByb2plY3RDb25uZWN0aW9uTGlzdGVuZXIoKSB7CisJCQl0aGlzLmFkZEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKKwkJfQorCQkKKwkJCisJCXByaXZhdGUgdm9pZCBhZGRKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJCWlmKHRoaXMucHJvamVjdEhhc0FDb25uZWN0aW9uKCkpIHsKKwkJCQl0aGlzLmdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQl9CisJCX0KKworCQlwcml2YXRlIGJvb2xlYW4gcHJvamVjdEhhc0FDb25uZWN0aW9uKCkgeworCQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgIT0gbnVsbDsKKwkJfQorCQkKKwkJLyoqCisJCSAqIHRoaXMgY2FuIHJldHVybiBudWxsOworCQkgKiBjYWxsZWQgYXQgc3RhcnQtdXAgYW5kIHdoZW4gdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZSBjaGFuZ2VzCisJCSAqLworCQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpIHsKKwkJCXJldHVybiBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UudGhpcy5qcGFQcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7CisJCX0KKworCQkvKioKKwkJICogdGhpcyBjYW4gcmV0dXJuIG51bGw7CisJCSAqIGNhbGxlZCBhdCBzdGFydC11cCBhbmQgd2hlbiB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIGNoYW5nZXMKKwkJICovCisJCXByaXZhdGUgU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKSB7CisJCQlyZXR1cm4gRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlLnRoaXMuanBhUHJvamVjdC5nZXREZWZhdWx0RGJTY2hlbWEoKTsKKwkJfQorCisJCXByaXZhdGUgU2NoZW1hQ29udGFpbmVyIGdldERlZmF1bHRTY2hlbWFDb250YWluZXIoKSB7CisJCQlyZXR1cm4gRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlLnRoaXMuanBhUHJvamVjdC5nZXREZWZhdWx0RGJTY2hlbWFDb250YWluZXIoKTsKKwkJfQorCisJCS8qKgorCQkgKiBjYWxsZWQgYXQgc3RhcnQtdXAgYW5kIHdoZW4gdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZSBjaGFuZ2VzCisJCSAqLworCQlwcml2YXRlIHZvaWQgdXBkYXRlUmVjb25uZWN0TGluaygpIHsKKwkJCXRoaXMucmVjb25uZWN0TGluay5zZXRFbmFibGVkKHRoaXMucmVjb25uZWN0TGlua0NhbkJlRW5hYmxlZCgpKTsKKwkJfQorCisJCXZvaWQgdXBkYXRlQWRkSnBhUHJvamVjdENvbm5lY3Rpb25MaW5rKCkgeworCQkJdGhpcy5hZGRKcGFQcm9qZWN0Q29ubmVjdGlvbkxpbmsuc2V0RW5hYmxlZCh0aGlzLmFkZEpwYVByb2plY3RDb25uZWN0aW9uTGlua0NhbkJlRW5hYmxlZCgpKTsKKwkJfQorCisJCXByaXZhdGUgYm9vbGVhbiByZWNvbm5lY3RMaW5rQ2FuQmVFbmFibGVkKCkgeworCQkJaWYodGhpcy5wcm9qZWN0SGFzQUNvbm5lY3Rpb24oKSkgeworCQkJCXJldHVybiB0aGlzLmdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpLmlzSW5hY3RpdmUoKTsKKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXByaXZhdGUgYm9vbGVhbiBhZGRKcGFQcm9qZWN0Q29ubmVjdGlvbkxpbmtDYW5CZUVuYWJsZWQoKSB7CisJCQlyZXR1cm4gISB0aGlzLnByb2plY3RIYXNBQ29ubmVjdGlvbigpOworCQl9CisKKwkJLyoqCisJCSAqIHRoZSBzY2hlbWEgY29tYm8tYm94IGlzIHVwZGF0ZWQgYXQgc3RhcnQtdXAgYW5kCisJCSAqIHdoZW4gdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZSBjaGFuZ2VzCisJCSAqLworCQlwcml2YXRlIHZvaWQgdXBkYXRlU2NoZW1hQ29tYm9Cb3goKSB7CisJCQl0aGlzLnNjaGVtYUNvbWJvQm94LnJlbW92ZUFsbCgpOworCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuc2NoZW1hTmFtZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQkJdGhpcy5zY2hlbWFDb21ib0JveC5hZGQoc3RyZWFtLm5leHQoKSk7CisJCQl9CisJCQkvLyB0aGUgY3VycmVudCBzY2hlbWEgKnNob3VsZCogYmUgaW4gdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBwcm9maWxlCisJCQlpZiAodGhpcy5zZWxlY3RlZFNjaGVtYSAhPSBudWxsKSB7CisJCQkJdGhpcy5zY2hlbWFDb21ib0JveC5zZWxlY3QodGhpcy5zY2hlbWFDb21ib0JveC5pbmRleE9mKHRoaXMuc2VsZWN0ZWRTY2hlbWEuZ2V0TmFtZSgpKSk7CisJCQl9CisJCX0KKworCQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gc2NoZW1hTmFtZXMoKSB7CisJCQlTY2hlbWFDb250YWluZXIgc2MgPSB0aGlzLmdldERlZmF1bHRTY2hlbWFDb250YWluZXIoKTsKKwkJCS8vIHVzZSBzY2hlbWEgKm5hbWVzKiBzaW5jZSB0aGUgY29tYm8tYm94IGlzIHJlYWQtb25seQorCQkJcmV0dXJuIChzYyAhPSBudWxsKSA/IHNjLnNvcnRlZFNjaGVtYU5hbWVzKCkgOiBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKTsKKwkJfQorCisJCS8vICoqKioqKioqKiogbGlzdGVuZXIgY2FsbGJhY2tzICoqKioqKioqKioKKworCQl2b2lkIHNlbGVjdGVkU2NoZW1hQ2hhbmdlZCgpIHsKKwkJCVNjaGVtYSBvbGQgPSB0aGlzLnNlbGVjdGVkU2NoZW1hOworCQkJdGhpcy5zZWxlY3RlZFNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYUNvbnRhaW5lcigpLmdldFNjaGVtYU5hbWVkKHRoaXMuc2NoZW1hQ29tYm9Cb3guZ2V0VGV4dCgpKTsKKwkJCWlmICh0aGlzLnNlbGVjdGVkU2NoZW1hICE9IG9sZCkgeworCQkJCURhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZS50aGlzLmZpcmVTY2hlbWFDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRTY2hlbWEpOworCQkJfQorCQl9CisKKwkJdm9pZCByZWNvbm5lY3QoKSB7CisJCQl0aGlzLmdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpLmNvbm5lY3QoKTsKKwkJCS8vIGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIHN5bmNocm9uaXplZCB3aGVuIHdlIGdldCB0aGUgcmVzdWx0aW5nIG9wZW4gZXZlbnQKKwkJfQorCisJCS8qKgorCQkgKiBjYWxsZWQgd2hlbgorCQkgKiAgICAgLSBhIGNvbm5lY3Rpb24gaXMgc2V0IHRvIHRoZSBKcGEgcHJvamVjdAorCQkgKiAgICAgLSB0aGUgY29ubmVjdGlvbiB3YXMgb3BlbmVkCisJCSAqICAgICAtIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgKG5ldmVyIGhhcHBlbnM/KQorCQkgKiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc2NoZW1hIHN0dWZmIGFuZCB0aGUgcmVjb25uZWN0IGxpbmsKKwkJICovCisJCXZvaWQgY29ubmVjdGlvbkNoYW5nZWQoKSB7CisJCQlTY2hlbWEgb2xkID0gdGhpcy5zZWxlY3RlZFNjaGVtYTsKKwkJCXRoaXMuc2VsZWN0ZWRTY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKKwkJCWlmICh0aGlzLnNlbGVjdGVkU2NoZW1hICE9IG9sZCkgeworCQkJCURhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZS50aGlzLmZpcmVTY2hlbWFDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRTY2hlbWEpOworCQkJfQorCQkJdGhpcy51cGRhdGVTY2hlbWFDb21ib0JveCgpOworCQkJdGhpcy51cGRhdGVSZWNvbm5lY3RMaW5rKCk7CisJCX0KKworCisJCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKKworCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU2NoZW1hQ29tYm9Cb3hTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJCS8vIG5vdGhpbmcgc3BlY2lhbCBmb3IgImRlZmF1bHQiIChkb3VibGUtY2xpY2s/KQorCQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKKwkJCQl9CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCQkJRGF0YWJhc2VHcm91cC50aGlzLnNlbGVjdGVkU2NoZW1hQ2hhbmdlZCgpOworCQkJCX0KKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCQlyZXR1cm4gIkRhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZSBzY2hlbWEgY29tYm8tYm94IHNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9OworCQl9CisKKwkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFJlY29ubmVjdExpbmtTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQkJCQlEYXRhYmFzZUdyb3VwLnRoaXMucmVjb25uZWN0KCk7CisJCQkJfQorCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJCXJldHVybiAiRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlIHJlY29ubmVjdCBsaW5rIHNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9OworCQl9CisKKwkJcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25BZGFwdGVyKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBjcCkgeworCQkJCQl0aGlzLmNvbm5lY3Rpb25DaGFuZ2VkKCk7CisJCQkJfQorCQkJCUBPdmVycmlkZSAgLy8gdGhpcyBwcm9iYWJseSB3b24ndCBldmVyIGdldCBjYWxsZWQuLi4KKwkJCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKKwkJCQkJdGhpcy5jb25uZWN0aW9uQ2hhbmdlZCgpOworCQkJCX0KKwkJCQlwcml2YXRlIHZvaWQgY29ubmVjdGlvbkNoYW5nZWQoKSB7CisJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKKwkJCQkJCW5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCURhdGFiYXNlR3JvdXAudGhpcy5jb25uZWN0aW9uQ2hhbmdlZCgpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJKTsKKwkJCQl9CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQkJcmV0dXJuICJEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UgY29ubmVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9OworCQl9CisKKwkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZEFkZEpwYVByb2plY3RDb25uZWN0aW9uTGlua0xpc3RlbmVyKCkgeworCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJRGF0YWJhc2VHcm91cC50aGlzLnByb21wdFRvQ29uZmlnSnBhUHJvamVjdENvbm5lY3Rpb24oKTsKKwkJCQkJCisJCQkJCURhdGFiYXNlR3JvdXAudGhpcy5hZGRKcGFQcm9qZWN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7CisJCQkJCURhdGFiYXNlR3JvdXAudGhpcy51cGRhdGVBZGRKcGFQcm9qZWN0Q29ubmVjdGlvbkxpbmsoKTsKKwkJCQkJRGF0YWJhc2VHcm91cC50aGlzLmNvbm5lY3Rpb25DaGFuZ2VkKCk7CisJCQkJfQorCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJCXJldHVybiAiRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlIEFkZFByb2plY3RDb25uZWN0aW9uIGxpbmsgc2VsZWN0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX07CisJCX0KKworCQl2b2lkIHByb21wdFRvQ29uZmlnSnBhUHJvamVjdENvbm5lY3Rpb24oKSB7CisJCQlQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9CisJCQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByb3BlcnR5RGlhbG9nT24oCisJCQkJCWdldFNoZWxsKCksIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZS50aGlzLmpwYVByb2plY3QuZ2V0UHJvamVjdCgpLAorCQkJCQlKcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UuUFJPUF9JRCwKKwkJCQkJbnVsbCwKKwkJCQkJbnVsbCk7CisJCQlkaWFsb2cub3BlbigpOworCQl9CisKKwkJLy8gKioqKioqKioqKiBVSSBjb21wb25lbnRzICoqKioqKioqKioKKworCQkvKioKKwkJICogYnVpbGQgYW5kIHJldHVybiBhIGxhYmVsCisJCSAqLworCQlwcml2YXRlIExhYmVsIGJ1aWxkTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7CisJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKKwkJCWxhYmVsLnNldFRleHQodGV4dCk7CisJCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOworCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7CisJCQlyZXR1cm4gbGFiZWw7CisJCX0KKworCQkvKioKKwkJICogYnVpbGQgYW5kIHJldHVybiBhIGNvbWJvLWJveAorCQkgKi8KKwkJcHJpdmF0ZSBDb21ibyBidWlsZENvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKKwkJCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCQkJcmV0dXJuIGNvbWJvOworCQl9CisKKwkJLyoqCisJCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBsaW5rCisJCSAqLworCQlwcml2YXRlIExpbmsgYnVpbGRMaW5rKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworCQkJTGluayBsaW5rID0gbmV3IExpbmsocGFyZW50LCBTV1QuTk9ORSk7CisJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOworCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7CisJCQlsaW5rLnNldFRleHQodGV4dCk7CisJCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCXJldHVybiBsaW5rOworCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvR2VuZXJhdGVFbnRpdGllc1dpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9HZW5lcmF0ZUVudGl0aWVzV2l6YXJkLmphdmEKaW5kZXggNGI2NjNlNi4uZmVjNjE0ZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9HZW5lcmF0ZUVudGl0aWVzV2l6YXJkLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9HZW5lcmF0ZUVudGl0aWVzV2l6YXJkLmphdmEKQEAgLTExLDExOSArMTEsMTUwIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5FbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuRW50aXR5R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuUGFja2FnZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLm9sZC5FbnRpdHlHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5vbGQuUGFja2FnZUdlbmVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CiAKKy8qKgorICogdHdvIHBhZ2VzOgorICogICAtIGEgRGF0YWJhc2UgU2NoZW1hIHBhZ2UgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IGEgc2NoZW1hCisgKiAgIC0gYSBHZW5lcmF0ZSBFbnRpdGllcyBwYWdlIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCB3aGljaCB0YWJsZXMgaW4KKyAqICAgICB0aGUgc2VsZWN0ZWQgc2NoZW1hIGFyZSB0byBiZSB1c2VkIGFuZCB0byBjb25maWd1cmUgRW50aXR5IG5hbWVzCisgKi8KIHB1YmxpYyBjbGFzcyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsJCiAKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKKwlwcml2YXRlIGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdDsKIAotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOworCXByaXZhdGUgZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwogCi0JLyoqIHRoaXMgcGFnZSBpcyBvbmx5IGJ1aWx0IHdoZW4gdGhlIHByb2plY3QgaXMgbm90IGNvbm5lY3RlZCB0byB0aGUgZGIgKi8KLQlwcml2YXRlIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZSBkYlNldHRpbmdzUGFnZTsKLQorCXByaXZhdGUgRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlIGRiU2NoZW1hUGFnZTsKKwkKIAlwcml2YXRlIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlIGdlbmVyYXRlRW50aXRpZXNQYWdlOwogCi0JcHJpdmF0ZSBQYWNrYWdlR2VuZXJhdG9yLkNvbmZpZyBwYWNrYWdlR2VuZXJhdG9yQ29uZmlnOworCXByaXZhdGUgZmluYWwgUGFja2FnZUdlbmVyYXRvci5Db25maWcgcGFja2FnZUdlbmVyYXRvckNvbmZpZzsKIAotCXByaXZhdGUgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlHZW5lcmF0b3JDb25maWc7CisJcHJpdmF0ZSBmaW5hbCBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGVudGl0eUdlbmVyYXRvckNvbmZpZzsKIAogCXByaXZhdGUgYm9vbGVhbiBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxUYWJsZT4gc2VsZWN0ZWRUYWJsZXM7CiAKLQlwdWJsaWMgR2VuZXJhdGVFbnRpdGllc1dpemFyZCggSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKworCXB1YmxpYyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkKEpwYVByb2plY3QganBhUHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CiAJCXN1cGVyKCk7CiAJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7CiAJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwogCQl0aGlzLnBhY2thZ2VHZW5lcmF0b3JDb25maWcgPSBuZXcgUGFja2FnZUdlbmVyYXRvci5Db25maWcoKTsKIAkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcgPSBuZXcgRW50aXR5R2VuZXJhdG9yLkNvbmZpZygpOwotCQl0aGlzLnNldFdpbmRvd1RpdGxlKCBKcHRVaU1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZ2VuZXJhdGVFbnRpdGllcyk7CisJCXRoaXMuc2V0V2luZG93VGl0bGUoSnB0VWlNZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2dlbmVyYXRlRW50aXRpZXMpOwogCX0KLQkKKwogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewogCQlzdXBlci5hZGRQYWdlcygpOwotCQl0aGlzLmRiU2V0dGluZ3NQYWdlID0gbmV3IERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZSggdGhpcy5qcGFQcm9qZWN0KTsKLQkJdGhpcy5hZGRQYWdlKHRoaXMuZGJTZXR0aW5nc1BhZ2UpOworCQl0aGlzLmRiU2NoZW1hUGFnZSA9IG5ldyBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UodGhpcy5qcGFQcm9qZWN0KTsKKwkJdGhpcy5kYlNjaGVtYVBhZ2UuYWRkTGlzdGVuZXIobmV3IFNjaGVtYVBhZ2VMaXN0ZW5lcigpKTsKKwkJdGhpcy5hZGRQYWdlKHRoaXMuZGJTY2hlbWFQYWdlKTsKKwkJCiAJCXRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UgPSBuZXcgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UoKTsKLQkJdGhpcy5hZGRQYWdlKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlKTsKLQkJdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5pbml0KCB0aGlzLnNlbGVjdGlvbik7CisJCXRoaXMuYWRkUGFnZSh0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlKTsKKwkJdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5pbml0KHRoaXMuc2VsZWN0aW9uKTsKIAl9CiAJCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJdGhpcy5wYWNrYWdlR2VuZXJhdG9yQ29uZmlnLnNldFBhY2thZ2VGcmFnbWVudCggdGhpcy5idWlsZFBhY2thZ2VGcmFnbWVudCgpKTsKKwlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7CisJCXJldHVybiB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmlzUGFnZUNvbXBsZXRlKCk7CisJfQogCi0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldENvbnZlcnRUb0NhbWVsQ2FzZSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5jb252ZXJ0VG9DYW1lbENhc2UoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEZpZWxkQWNjZXNzVHlwZSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5maWVsZEFjY2Vzc1R5cGUoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldENvbGxlY3Rpb25UeXBlTmFtZSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEZpZWxkVmlzaWJpbGl0eSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRGaWVsZFZpc2liaWxpdHkoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldE1ldGhvZFZpc2liaWxpdHkoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0TWV0aG9kVmlzaWJpbGl0eSgpKTsKLQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0R2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycyggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKCkpOwotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcigpKTsKLQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0U2VyaWFsaXphYmxlKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLnNlcmlhbGl6YWJsZSgpKTsKLQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0R2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCgpKTsKLQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0R2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSyggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkpOwotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRPdmVycmlkZUVudGl0eU5hbWVzKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldE92ZXJyaWRlRW50aXR5TmFtZXMoKSk7CisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKKwkJdGhpcy5wYWNrYWdlR2VuZXJhdG9yQ29uZmlnLnNldFBhY2thZ2VGcmFnbWVudCh0aGlzLmJ1aWxkUGFja2FnZUZyYWdtZW50KCkpOworCisJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldENvbnZlcnRUb0phdmFTdHlsZUlkZW50aWZpZXJzKHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuY29udmVydFRvSmF2YVN0eWxlSWRlbnRpZmllcnMoKSk7CisJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEZpZWxkQWNjZXNzVHlwZSh0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmZpZWxkQWNjZXNzVHlwZSgpKTsKKwkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0Q29sbGVjdGlvblR5cGVOYW1lKHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkpOworCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRDb2xsZWN0aW9uQXR0cmlidXRlTmFtZVN1ZmZpeCh0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldENvbGxlY3Rpb25BdHRyaWJ1dGVOYW1lU3VmZml4KCkpOworCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRGaWVsZFZpc2liaWxpdHkodGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRGaWVsZFZpc2liaWxpdHkoKSk7CisJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldE1ldGhvZFZpc2liaWxpdHkodGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRNZXRob2RWaXNpYmlsaXR5KCkpOworCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRHZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycygpKTsKKwkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0R2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IodGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcigpKTsKKwkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0U2VyaWFsaXphYmxlKHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2Uuc2VyaWFsaXphYmxlKCkpOworCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRHZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQodGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQoKSk7CisJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsodGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkpOworCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRFbWJlZGRlZElkQXR0cmlidXRlTmFtZSh0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldEVtYmVkZGVkSWRBdHRyaWJ1dGVOYW1lKCkpOworCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRQcmltYXJ5S2V5TWVtYmVyQ2xhc3NOYW1lKHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0UHJpbWFyeUtleU1lbWJlckNsYXNzTmFtZSgpKTsKKwkJZm9yIChNYXAuRW50cnk8VGFibGUsIFN0cmluZz4gZW50cnkgOiB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldFNlbGVjdGVkVGFibGVzKCkuZW50cnlTZXQoKSkgeworCQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuYWRkVGFibGUoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworCQl9CisJCS8vIHRoZSBuYW1lIGJ1aWxkZXIgY29tZXMgZnJvbSB0aGUgSlBBIHBsYXRmb3JtCisJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKHRoaXMuYnVpbGREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpKTsKIAogCQl0aGlzLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwgPSB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwoKTsKIAkJCi0JCXRoaXMuc2VsZWN0ZWRUYWJsZXMgPSB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldFNlbGVjdGVkVGFibGVzKCk7CiAJCXJldHVybiB0cnVlOwogCX0KLQkKKworCXByaXZhdGUgRW50aXR5R2VuZXJhdG9yLkRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGJ1aWxkRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKSB7CisJCXJldHVybiBuZXcgTG9jYWxEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcih0aGlzLmpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKS5nZXRFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpKTsKKwl9CisKIAlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgYnVpbGRQYWNrYWdlRnJhZ21lbnQoKSB7CiAJCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKIAkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldFBhY2thZ2VGcmFnbWVudCgpOwogCQkKLQkJaWYgKCBwYWNrYWdlRnJhZ21lbnQgPT0gbnVsbCkgewotCQkJcGFja2FnZUZyYWdtZW50PSBwYWNrYWdlRnJhZ21lbnRSb290LmdldFBhY2thZ2VGcmFnbWVudCggIiIpOyAvLyROT04tTkxTLTEkCisJCWlmIChwYWNrYWdlRnJhZ21lbnQgPT0gbnVsbCkgeworCQkJcGFja2FnZUZyYWdtZW50PSBwYWNrYWdlRnJhZ21lbnRSb290LmdldFBhY2thZ2VGcmFnbWVudCgiIik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCQkKLQkJaWYgKCBwYWNrYWdlRnJhZ21lbnQuZXhpc3RzKCkpIHsKKwkJaWYgKHBhY2thZ2VGcmFnbWVudC5leGlzdHMoKSkgewogCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudDsKIAkJfQogCiAJCXRyeSB7Ci0JCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50Um9vdC5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoIHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpLCB0cnVlLCBudWxsKTsKKwkJCXJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290LmNyZWF0ZVBhY2thZ2VGcmFnbWVudChwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSwgdHJ1ZSwgbnVsbCk7CiAJCX0gCi0JCWNhdGNoICggSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZXgpOworCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7CiAJCX0KIAl9Ci0JCisKKworCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgorCiAJQ29sbGVjdGlvbjxUYWJsZT4gZ2V0UG9zc2libGVUYWJsZXMoKSB7Ci0JCWlmICggdGhpcy5kYlNldHRpbmdzUGFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5kYlNldHRpbmdzUGFnZS5nZXRUYWJsZXMoKTsKLQkJfQotCQlyZXR1cm4gKCB0aGlzLnByb2plY3REZWZhdWx0U2NoZW1hRXhpc3RzKCkpID8gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oIHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLnRhYmxlcygpKSA6IENvbGxlY3Rpb25zLjxUYWJsZT5lbXB0eUxpc3QoKTsKKwkJcmV0dXJuIHRoaXMuYnVpbGRUYWJsZXModGhpcy5kYlNjaGVtYVBhZ2UuZ2V0U2VsZWN0ZWRTY2hlbWEoKSk7CiAJfQotCQotCUNvbm5lY3Rpb25Qcm9maWxlIGdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCX0KLQkKLQlKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKXsKKworCUpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKIAkJcmV0dXJuIHRoaXMuanBhUHJvamVjdDsKIAl9CiAKLQlTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0U2NoZW1hKCk7CisJdm9pZCBzZWxlY3RlZFNjaGVtYUNoYW5nZWQoU2NoZW1hIHNjaGVtYSkgeworCQl0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLnNldFBvc3NpYmxlVGFibGVzKHRoaXMuYnVpbGRUYWJsZXMoc2NoZW1hKSk7CiAJfQotCQorCisJcHJpdmF0ZSBDb2xsZWN0aW9uPFRhYmxlPiBidWlsZFRhYmxlcyhTY2hlbWEgc2NoZW1hKSB7CisJCXJldHVybiAoc2NoZW1hID09IG51bGwpID8KKwkJCQkJCUNvbGxlY3Rpb25zLjxUYWJsZT5lbXB0eVNldCgpCisJCQkJCToKKwkJCQkJCUNvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHNjaGVtYS50YWJsZXMoKSk7CisJfQorCisKKwkvLyAqKioqKioqKioqIHB1YmxpYyBtZXRob2RzIC0gc2V0dGluZ3MgKioqKioqKioqKgorCiAJcHVibGljIFBhY2thZ2VHZW5lcmF0b3IuQ29uZmlnIGdldFBhY2thZ2VHZW5lcmF0b3JDb25maWcoKSB7CiAJCXJldHVybiB0aGlzLnBhY2thZ2VHZW5lcmF0b3JDb25maWc7CiAJfQpAQCAtMTMyLDM0ICsxNjMsNTAgQEAKIAkJcmV0dXJuIHRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnOwogCX0KIAotCXB1YmxpYyBDb2xsZWN0aW9uPFRhYmxlPiBnZXRTZWxlY3RlZFRhYmxlcygpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWRUYWJsZXM7Ci0JfQotCQogCXB1YmxpYyBib29sZWFuIHN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwoKXsKIAkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbDsKIAl9Ci0JCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotICAgICAgICBib29sZWFuIGNhbkZpbmlzaCA9IHRydWU7Ci0gICAgICAgIGlmICggISB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmlzUGFnZUNvbXBsZXRlKCkpIHsKLSAgICAgICAgCWNhbkZpbmlzaCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYW5GaW5pc2g7Ci0gICAgfQogCi0JcHJpdmF0ZSBib29sZWFuIHByb2plY3REZWZhdWx0U2NoZW1hRXhpc3RzKCkgewotCQlyZXR1cm4gKCB0aGlzLmdldERlZmF1bHRTY2hlbWEoKSAhPSBudWxsKTsKLQl9Ci0JCisKKwkvLyAqKioqKioqKioqIG5hbWUgYnVpbGRlciBhZGFwdGVyICoqKioqKioqKioKKwogCS8qKgotCSAqIHVwZGF0ZVBvc3NpYmxlVGFibGVzIGlzIGNhbGxlZCB3aGVuIHNjaGVtYZJzIFBvc3NpYmxlVGFibGVzIGNoYW5nZWQuCi0JICogVGhlIGRiU2V0dGluZ3NQYWdlIGlzIG1haW5seSB0aGUgc291cmNlIG9mIGNoYW5nZXMsIAotCSAqIGFuZCB0aGUgZ2VuZXJhdGVFbnRpdGllc1BhZ2UgbmVlZHMgdG8gYmUga2VwdCBpbiBzeW5jLgorCSAqIGFkYXB0IHRoZSBKUEEgcGxhdGZvcm0tc3VwcGxpZWQgYnVpbGRlciB0byB0aGUgYnVpbGRlciBpbnRlcmZhY2UKKwkgKiBleHBlY3RlZCBieSB0aGUgZW50aXR5IGdlbmVyYXRvcgogCSAqLwotCXZvaWQgdXBkYXRlUG9zc2libGVUYWJsZXMoIENvbGxlY3Rpb248VGFibGU+IHBvc3NpYmxlVGFibGVzKSB7Ci0JCXRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UudXBkYXRlVGFibGVzTGlzdFZpZXdlciggcG9zc2libGVUYWJsZXMpOworCXN0YXRpYyBjbGFzcyBMb2NhbERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGltcGxlbWVudHMgRW50aXR5R2VuZXJhdG9yLkRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIHsKKwkJcHJpdmF0ZSBFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBidWlsZGVyOworCQlMb2NhbERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKEVudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGJ1aWxkZXIpIHsKKwkJCXN1cGVyKCk7CisJCQl0aGlzLmJ1aWxkZXIgPSBidWlsZGVyOworCQl9CisJCXB1YmxpYyBTdHJpbmcgYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKFN0cmluZyBlbnRpdHlOYW1lLCBUYWJsZSB0YWJsZSkgeworCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZFRhYmxlQW5ub3RhdGlvbk5hbWUoZW50aXR5TmFtZSwgdGFibGUpOworCQl9CisJCXB1YmxpYyBTdHJpbmcgYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgQ29sdW1uIGNvbHVtbikgeworCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZENvbHVtbkFubm90YXRpb25OYW1lKGF0dHJpYnV0ZU5hbWUsIGNvbHVtbik7CisJCX0KKwkJcHVibGljIFN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7CisJCQlyZXR1cm4gdGhpcy5idWlsZGVyLmJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKGF0dHJpYnV0ZU5hbWUsIGZvcmVpZ25LZXkpOworCQl9CisJCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoQ29sdW1uIGNvbHVtbikgeworCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShjb2x1bW4pOworCQl9CisJCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uTmFtZShUYWJsZSB0YWJsZSkgeworCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKHRhYmxlKTsKKwkJfQogCX0KIAorCisJLy8gKioqKioqKioqKiBzY2hlbWEgcGFnZSBsaXN0ZW5lciAqKioqKioqKioqCisKKwkvKioKKwkgKiBsaXN0ZW4gZm9yIHdoZW4gdGhlIERhdGFiYXNlIENvbm5lY3Rpb24gcGFnZSBjaGFuZ2VzIGl0cyBzZWxlY3RlZCBzY2hlbWEKKwkgKiBzbyB3ZSBjYW4ga2VlcCB0aGUgR2VuZXJhdGUgRW50aXRpZXMgcGFnZSBpbiBzeW5jaAorCSAqLworCWNsYXNzIFNjaGVtYVBhZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZS5MaXN0ZW5lciB7CisJCXB1YmxpYyB2b2lkIHNlbGVjdGVkU2NoZW1hQ2hhbmdlZChTY2hlbWEgc2NoZW1hKSB7CisJCQlHZW5lcmF0ZUVudGl0aWVzV2l6YXJkLnRoaXMuc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKHNjaGVtYSk7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0dlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0dlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlLmphdmEKaW5kZXggYWY4NTFjOS4uZDZmMjE3NSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UuamF2YQpAQCAtOSwxMSArOSwxMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHM7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdUeXBlV2l6YXJkUGFnZTsKQEAgLTMyLDEyICszMiwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLkVudGl0eUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLm9sZC5FbnRpdHlHZW5Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLm9sZC5FbnRpdHlHZW5lcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuVGFibGVMYXlvdXRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7CkBAIC01MywxNCArNTQsMjIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKIAotLy8gVE9ETyBkZXRlcm1pbmUgbmFtZSBjb2xsaXNpb25zCisvLyBUT0RPIGFkZCBudW1lcm91cyBzZXR0aW5ncyB0byBVSS4uLgorLy8gVE9ETyB2YWxpZGF0ZSBsaXN0IG9mIHVzZXItYXBwcm92ZWQgZW50aXR5IG5hbWVzOgorLy8gICAgIG5vIGR1cGxpY2F0ZXMgKGNhc2Utc2Vuc2l0aXZlKQorLy8gICAgIHZhbGlkIEphdmEgaWRlbnRpZmllcnMgQHNlZSBOYW1lVG9vbHMuc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVycyhTdHJpbmcpCisvLyAgICAgbm8gSmF2YSByZXNlcnZlZCB3b3JkcyBAc2VlIE5hbWVUb29scy5KQVZBX1JFU0VSVkVEX1dPUkRTX1NFVAogY2xhc3MgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UgZXh0ZW5kcyBOZXdUeXBlV2l6YXJkUGFnZSB7CiAKIAlDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVGFibGU7CisJQnV0dG9uIHN5bmNocm9uaXplQ2xhc3Nlc0NoZWNrQm94OwogCi0JcHJpdmF0ZSBib29sZWFuIGNvbnZlcnRUb0NhbWVsQ2FzZSA9IHRydWU7CisJLy8gVE9ETyBpZiB0aGlzIGZsYWcgY2hhbmdlcyB3ZSBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGUgZW50aXR5IG5hbWVzLi4uCisJLy8gKGF0IHRoZSBtb21lbnQsIGl0IGRvZXMgbm90IGNoYW5nZSBiZWNhdXNlIGl0IGlzIG5vdCB2aXNpYmxlIHRvIHRoZSB1c2VyLi4uKQorCXByaXZhdGUgYm9vbGVhbiBjb252ZXJ0VG9KYXZhU3R5bGVJZGVudGlmaWVycyA9IHRydWU7CiAJcHJpdmF0ZSBib29sZWFuIGZpZWxkQWNjZXNzVHlwZSA9IHRydWU7CiAJcHJpdmF0ZSBTdHJpbmcgY29sbGVjdGlvblR5cGVOYW1lID0gU2V0LmNsYXNzLmdldE5hbWUoKTsKKwlwcml2YXRlIFN0cmluZyBjb2xsZWN0aW9uQXR0cmlidXRlTmFtZVN1ZmZpeCA9ICJfY29sbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIGludCBmaWVsZFZpc2liaWxpdHkgPSBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnLlBSSVZBVEU7CiAJcHJpdmF0ZSBpbnQgbWV0aG9kVmlzaWJpbGl0eSA9IEVudGl0eUdlbmVyYXRvci5Db25maWcuUFVCTElDOwogCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzID0gdHJ1ZTsKQEAgLTY4LDEwICs3NywxNSBAQAogCXByaXZhdGUgYm9vbGVhbiBzZXJpYWxpemFibGUgPSB0cnVlOwogCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQgPSB0cnVlOwogCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCA9IGZhbHNlOwotCXByaXZhdGUgTWFwPFRhYmxlLCBTdHJpbmc+IG92ZXJyaWRlRW50aXR5TmFtZXM7CisJcHJpdmF0ZSBTdHJpbmcgZW1iZWRkZWRJZEF0dHJpYnV0ZU5hbWUgPSAicGsiOyAgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgU3RyaW5nIHByaW1hcnlLZXlNZW1iZXJDbGFzc05hbWUgPSAiUEsiOyAgLy8kTk9OLU5MUy0xJAorCisJLy8ga2V5ID0gdGFibGU7IHZhbHVlID0gZW50aXR5IG5hbWUKKwlwcml2YXRlIEhhc2hNYXA8VGFibGUsIFN0cmluZz4gZW50aXR5TmFtZXM7CiAJCi0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRBQkxFX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTID0geyAidGFibGUiLCAiZW50aXR5TmFtZSIgfTsKKwlwcml2YXRlIGJvb2xlYW4gc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCA9IGZhbHNlOworCisJc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRBQkxFX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTID0geyAidGFibGUiLCAiZW50aXR5TmFtZSIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0NPTFVNTl9JTkRFWCA9IDA7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9OQU1FX0NPTFVNTl9JTkRFWCA9IDE7CiAJCkBAIC0xMDgsMTcgKzEyMiw5IEBACiAJCWNyZWF0ZUNvbnRhaW5lckNvbnRyb2xzKGNvbXBvc2l0ZSwgbkNvbHVtbnMpOwkKIAkJY3JlYXRlUGFja2FnZUNvbnRyb2xzKGNvbXBvc2l0ZSwgbkNvbHVtbnMpOwkKIAkJCi0JCWZpbmFsIEJ1dHRvbiBzeW5jaHJvbml6ZUNsYXNzZXNDaGVja0JveCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOworCQl0aGlzLnN5bmNocm9uaXplQ2xhc3Nlc0NoZWNrQm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7CiAJCXN5bmNocm9uaXplQ2xhc3Nlc0NoZWNrQm94LnNldFRleHQoSnB0VWlNZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9zeW5jaHJvbml6ZUNsYXNzZXMpOwotCQlzeW5jaHJvbml6ZUNsYXNzZXNDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0U3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbChzeW5jaHJvbml6ZUNsYXNzZXNDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOworCQlzeW5jaHJvbml6ZUNsYXNzZXNDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkU3luY2hDbGFzc2VzU2VsZWN0aW9uTGlzdGVuZXIoKSk7CiAJCQogCQlHcm91cCB0YWJsZXNHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKIAkJdGFibGVzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7CkBAIC0xMzQsMzIgKzE0MCw0OSBAQAogCQljcmVhdGVUYWJsZXNTZWxlY3Rpb25Db250cm9sKHRhYmxlc0dyb3VwKTsKIAkJY3JlYXRlQnV0dG9uQ29tcG9zaXRlKHRhYmxlc0dyb3VwKTsKIAkJCi0JCUdlbmVyYXRlRW50aXRpZXNXaXphcmQgZ2VuZXJhdGVFbnRpdGllc1dpemFyZCA9ICgoR2VuZXJhdGVFbnRpdGllc1dpemFyZCl0aGlzLmdldFdpemFyZCgpKTsKLQkJQ29sbGVjdGlvbjxUYWJsZT4gcG9zc2libGVUYWJsZXMgPSBnZW5lcmF0ZUVudGl0aWVzV2l6YXJkLmdldFBvc3NpYmxlVGFibGVzKCk7Ci0JCWluaXRUYWJsZXNTZWxlY3Rpb25Db250cm9sKHBvc3NpYmxlVGFibGVzKTsKKwkJdGhpcy5pbml0VGFibGVzU2VsZWN0aW9uQ29udHJvbCgpOwogCQkKIAkJLy9zZXQgaW5pdGlhbCBzZWxlY3Rpb24gc3RhdGUgb2YgdGhlIHN5bmNocm9uaXplIGNsYXNzZXMgY2hlY2tib3gKLQkJc3luY2hyb25pemVDbGFzc2VzQ2hlY2tCb3guc2V0U2VsZWN0aW9uKCFnZW5lcmF0ZUVudGl0aWVzV2l6YXJkLmdldEpwYVByb2plY3QoKS5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCkpOworCQlzeW5jaHJvbml6ZUNsYXNzZXNDaGVja0JveC5zZXRTZWxlY3Rpb24oICEgdGhpcy5nZXRHZW5FbnRpdGllc1dpemFyZCgpLmdldEpwYVByb2plY3QoKS5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCkpOwogCQlzZXRTeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKHN5bmNocm9uaXplQ2xhc3Nlc0NoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKIAkJCiAJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy50YWJsZVRhYmxlLmdldENvbnRyb2woKSwgSnBhSGVscENvbnRleHRJZHMuRElBTE9HX0dFTkVSQVRFX0VOVElUSUVTX1RBQkxFUyk7CiAJCQogCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKCBmYWxzZSk7CisJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc2VsZWN0QWxsVGFibGVzKCl7CisJcHJpdmF0ZSBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkIGdldEdlbkVudGl0aWVzV2l6YXJkKCkgeworCQlyZXR1cm4gKEdlbmVyYXRlRW50aXRpZXNXaXphcmQpIHRoaXMuZ2V0V2l6YXJkKCk7CisJfQorCisJdm9pZCBzZWxlY3RBbGxUYWJsZXMoKXsKIAkJdGhpcy50YWJsZVRhYmxlLnNldEFsbENoZWNrZWQodHJ1ZSk7CiAJCWRvU3RhdHVzVXBkYXRlKCk7CiAJfQogCQotCXByaXZhdGUgdm9pZCBkZXNlbGVjdEFsbFRhYmxlcygpeworCXZvaWQgZGVzZWxlY3RBbGxUYWJsZXMoKXsKIAkJdGhpcy50YWJsZVRhYmxlLnNldEFsbENoZWNrZWQoZmFsc2UpOwogCQlkb1N0YXR1c1VwZGF0ZSgpOwogCX0KIAkKLQlwcml2YXRlIHZvaWQgaW5pdFRhYmxlc1NlbGVjdGlvbkNvbnRyb2woQ29sbGVjdGlvbjxUYWJsZT4gcG9zc2libGVUYWJsZXMpIHsKLQkJdGhpcy5vdmVycmlkZUVudGl0eU5hbWVzID0gbmV3IEhhc2hNYXA8VGFibGUsIFN0cmluZz4ocG9zc2libGVUYWJsZXMuc2l6ZSgpKTsKKwlwcml2YXRlIHZvaWQgaW5pdFRhYmxlc1NlbGVjdGlvbkNvbnRyb2woKSB7CisJCXRoaXMuc2V0UG9zc2libGVUYWJsZXModGhpcy5nZXRHZW5FbnRpdGllc1dpemFyZCgpLmdldFBvc3NpYmxlVGFibGVzKCkpOworCX0KKworCXZvaWQgc2V0UG9zc2libGVUYWJsZXMoQ29sbGVjdGlvbjxUYWJsZT4gcG9zc2libGVUYWJsZXMpIHsKKwkJaWYgKHRoaXMudGFibGVUYWJsZSA9PSBudWxsKSB7CisJCQlyZXR1cm47ICAvLyB0aGUgd2l6YXJkIGhhcyBjYWxsZWQgdGhpcyBtZXRob2QgYmVmb3JlIG91ciB3aWRnZXRzIGFyZSBidWlsdAorCQl9CisJCXRoaXMuZW50aXR5TmFtZXMgPSBuZXcgSGFzaE1hcDxUYWJsZSwgU3RyaW5nPihwb3NzaWJsZVRhYmxlcy5zaXplKCkpOworCQlmb3IgKFRhYmxlIHRhYmxlIDogcG9zc2libGVUYWJsZXMpIHsKKwkJCVN0cmluZyB0YWJsZU5hbWUgPSB0YWJsZS5nZXROYW1lKCk7CisJCQlTdHJpbmcgZW50aXR5TmFtZSA9ICh0aGlzLmNvbnZlcnRUb0phdmFTdHlsZUlkZW50aWZpZXJzKSA/CisJCQkJCQkJRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKHRhYmxlTmFtZSwgZW50aXR5TmFtZXMudmFsdWVzKCkpCisJCQkJCQk6CisJCQkJCQkJTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IodGFibGVOYW1lLCBlbnRpdHlOYW1lcy52YWx1ZXMoKSk7CisJCQl0aGlzLmVudGl0eU5hbWVzLnB1dCh0YWJsZSwgZW50aXR5TmFtZSk7CisJCX0KIAkJdGhpcy50YWJsZVRhYmxlLnNldElucHV0KHBvc3NpYmxlVGFibGVzKTsKIAl9CiAKQEAgLTE5Nyw3ICsyMjAsNyBAQAogCQkKIAkJdGhpcy50YWJsZVRhYmxlLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CiAJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWhhbmRsZVRhYmxlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKKwkJCQloYW5kbGVUYWJsZXNMaXN0U2VsZWN0aW9uQ2hhbmdlZCgpOwogCQkJfQogCQl9KTsKIAkJCkBAIC0yMTUsNyArMjM4LDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvbkNvbXBvc2l0ZShHcm91cCB0YWJsZXNHcm91cCl7Ci0JCQogCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJsZXNHcm91cCwgU1dULk5VTEwpOwogCQlHcmlkTGF5b3V0IGJ1dHRvbkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKIAkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChidXR0b25MYXlvdXQpOwpAQCAtMjI5LDMxICsyNTEsMTQgQEAKIAkJR3JpZERhdGEgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7CiAJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwogCQlzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0QWxsVGFibGVzKCk7Ci0JCQkJCi0JCQl9Ci0JCX0pOworCQlzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFNlbGVjdEFsbEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCkpOwogCQkKIAkJQnV0dG9uIGRlc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKIAkJZGVzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkdlbmVyYWxfZGVzZWxlY3RBbGwpOwogCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKIAkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CiAJCWRlc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZGVzZWxlY3RBbGxUYWJsZXMoKTsKLQkJCX0KLQkJfSk7CisJCWRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGREZXNlbGVjdEFsbEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCkpOwogCX0KIAkKIAkKQEAgLTI2NCwxMCArMjY5LDkgQEAKIAogCXZvaWQgZWRpdEVudGl0eU5hbWVJZlBvc3NpYmxlKCl7CiAJCU9iamVjdFtdIHNlbGVjdGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy50YWJsZVRhYmxlLmdldFNlbGVjdGlvbigpKS50b0FycmF5KCk7Ci0JCWlmIChzZWxlY3RlZC5sZW5ndGggIT0gMSkgewotCQkJcmV0dXJuOworCQlpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDEpIHsKKwkJCXRoaXMudGFibGVUYWJsZS5lZGl0RWxlbWVudChzZWxlY3RlZFswXSwgRU5USVRZX05BTUVfQ09MVU1OX0lOREVYKTsKIAkJfQotCQl0aGlzLnRhYmxlVGFibGUuZWRpdEVsZW1lbnQoc2VsZWN0ZWRbMF0sIEVOVElUWV9OQU1FX0NPTFVNTl9JTkRFWCk7CiAJfQogCQogCXByaXZhdGUgdm9pZCBhZGRDZWxsRWRpdG9ycygpIHsKQEAgLTI4MCw5ICsyODQsOSBAQAogCQl0aGlzLnRhYmxlVGFibGUuc2V0Q2VsbE1vZGlmaWVyKHRoaXMuYnVpbGRUYWJsZVRhYmxlQ2VsbE1vZGlmaWVyKCkpOwogCX0KIAotCXZvaWQgaGFuZGxlVGFibGVzTGlzdFNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJdm9pZCBoYW5kbGVUYWJsZXNMaXN0U2VsZWN0aW9uQ2hhbmdlZCgpIHsKIAkJdGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCWlmICggISB0aGlzLmhhc1RhYmxlc1NlbGVjdGVkKCkpIHsKKwkJaWYgKHRoaXMubm9UYWJsZXNBcmVTZWxlY3RlZCgpKSB7CiAJCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7CiAJCX0KIAl9CkBAIC0yOTksMjMgKzMwMywyMCBAQAogCQlyZXR1cm4gbmV3IFRhYmxlVGFibGVDZWxsTW9kaWZpZXIoKTsKIAl9CiAJCi0JQ29sbGVjdGlvbjxUYWJsZT4gZ2V0U2VsZWN0ZWRUYWJsZXMoKSB7Ci0JCUFycmF5TGlzdDxUYWJsZT4gc2VsZWN0ZWRUYWJsZXMgPSBuZXcgQXJyYXlMaXN0PFRhYmxlPigpOwotCQlmb3IgKE9iamVjdCBzZWxlY3RlZFRhYmxlIDogdGhpcy50YWJsZVRhYmxlLmdldENoZWNrZWRFbGVtZW50cygpKQotCQkJc2VsZWN0ZWRUYWJsZXMuYWRkKChUYWJsZSkgc2VsZWN0ZWRUYWJsZSk7CisJTWFwPFRhYmxlLCBTdHJpbmc+IGdldFNlbGVjdGVkVGFibGVzKCkgeworCQlPYmplY3RbXSBjaGVja2VkRWxlbWVudHMgPSB0aGlzLnRhYmxlVGFibGUuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7CisJCUhhc2hNYXA8VGFibGUsIFN0cmluZz4gc2VsZWN0ZWRUYWJsZXMgPSBuZXcgSGFzaE1hcDxUYWJsZSwgU3RyaW5nPihjaGVja2VkRWxlbWVudHMubGVuZ3RoKTsKKwkJZm9yIChPYmplY3QgY2hlY2tlZEVsZW1lbnQgOiBjaGVja2VkRWxlbWVudHMpIHsKKwkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKSBjaGVja2VkRWxlbWVudDsKKwkJCXNlbGVjdGVkVGFibGVzLnB1dCh0YWJsZSwgdGhpcy5lbnRpdHlOYW1lcy5nZXQodGFibGUpKTsKKwkJfQogCQlyZXR1cm4gc2VsZWN0ZWRUYWJsZXM7CiAJfQotCQotCXByaXZhdGUgYm9vbGVhbiBoYXNUYWJsZXNTZWxlY3RlZCgpIHsKLQkJcmV0dXJuICh0aGlzLnRhYmxlVGFibGUgIT0gbnVsbCkgPyAodGhpcy5nZXRTZWxlY3RlZFRhYmxlcygpLnNpemUoKSA+IDApIDogZmFsc2U7Ci0JfQotCQotCXZvaWQgdXBkYXRlVGFibGVzTGlzdFZpZXdlcihDb2xsZWN0aW9uPFRhYmxlPiBwb3NzaWJsZVRhYmxlcykgewotCQlpZiAodGhpcy50YWJsZVRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMuaW5pdFRhYmxlc1NlbGVjdGlvbkNvbnRyb2wocG9zc2libGVUYWJsZXMpOwotCQl9Ci0JfQogCisJcHJpdmF0ZSBib29sZWFuIG5vVGFibGVzQXJlU2VsZWN0ZWQoKSB7CisJCXJldHVybiAodGhpcy50YWJsZVRhYmxlID09IG51bGwpID8gdHJ1ZSA6ICh0aGlzLnRhYmxlVGFibGUuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkubGVuZ3RoID09IDApOworCX0KKwkKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGaWVsZENoYW5nZWQoU3RyaW5nIGZpZWxkTmFtZSkgewogCQlzdXBlci5oYW5kbGVGaWVsZENoYW5nZWQoZmllbGROYW1lKTsKQEAgLTMzOSwzNCArMzQwLDI1IEBACiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7CiAJCXN1cGVyLnVwZGF0ZVN0YXR1cyhzdGF0dXMpOwotCQlpZiAodGhpcy5pc1BhZ2VDb21wbGV0ZSgpICYmICEgdGhpcy5oYXNUYWJsZXNTZWxlY3RlZCgpKSB7CisJCWlmICh0aGlzLmlzUGFnZUNvbXBsZXRlKCkgJiYgdGhpcy5ub1RhYmxlc0FyZVNlbGVjdGVkKCkpIHsKIAkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKIAkJfQogCX0KIAotCVN0cmluZyBlbnRpdHlOYW1lKFRhYmxlIHRhYmxlKSB7Ci0JCVN0cmluZyBvdmVycmlkZUVudGl0eU5hbWUgPSB0aGlzLm92ZXJyaWRlRW50aXR5TmFtZXMuZ2V0KHRhYmxlKTsKLQkJcmV0dXJuIChvdmVycmlkZUVudGl0eU5hbWUgIT0gbnVsbCkgPyBvdmVycmlkZUVudGl0eU5hbWUgOiB0aGlzLmRlZmF1bHRFbnRpdHlOYW1lKHRhYmxlKTsKKwlTdHJpbmcgZ2V0RW50aXR5TmFtZShUYWJsZSB0YWJsZSkgeworCQlyZXR1cm4gdGhpcy5lbnRpdHlOYW1lcy5nZXQodGFibGUpOwogCX0KIAotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRFbnRpdHlOYW1lKFRhYmxlIHRhYmxlKSB7Ci0JCVN0cmluZyBlbnRpdHlOYW1lID0gdGFibGUuZ2V0U2hvcnRKYXZhQ2xhc3NOYW1lKCk7Ci0JCWlmICh0aGlzLmNvbnZlcnRUb0NhbWVsQ2FzZSkgewotCQkJZW50aXR5TmFtZSA9IFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGVudGl0eU5hbWUpOwotCQl9Ci0JCXJldHVybiBlbnRpdHlOYW1lOworCS8qKgorCSAqIHJldHVybiB3aGV0aGVyIHRoZSBuZXcgZW50aXR5IG5hbWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9sZCBlbnRpdHkgbmFtZQorCSAqLworCWJvb2xlYW4gc2V0RW50aXR5TmFtZShUYWJsZSB0YWJsZSwgU3RyaW5nIGVudGl0eU5hbWUpIHsKKwkJU3RyaW5nIG9sZCA9IHRoaXMuZW50aXR5TmFtZXMucHV0KHRhYmxlLCBlbnRpdHlOYW1lKTsKKwkJcmV0dXJuICEgZW50aXR5TmFtZS5lcXVhbHMob2xkKTsKIAl9CiAKLQl2b2lkIHNldE92ZXJyaWRlRW50aXR5TmFtZShUYWJsZSB0YWJsZSwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHRhYmxlLmdldFNob3J0SmF2YUNsYXNzTmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJdGhpcy5vdmVycmlkZUVudGl0eU5hbWVzLnJlbW92ZSh0YWJsZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLm92ZXJyaWRlRW50aXR5TmFtZXMucHV0KHRhYmxlLCBuYW1lKTsKLQkJfQotCX0KLQotCWJvb2xlYW4gY29udmVydFRvQ2FtZWxDYXNlKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9DYW1lbENhc2U7CisJYm9vbGVhbiBjb252ZXJ0VG9KYXZhU3R5bGVJZGVudGlmaWVycygpIHsKKwkJcmV0dXJuIHRoaXMuY29udmVydFRvSmF2YVN0eWxlSWRlbnRpZmllcnM7CiAJfQogCiAJYm9vbGVhbiBmaWVsZEFjY2Vzc1R5cGUoKSB7CkBAIC0zNzcsNiArMzY5LDEwIEBACiAJCXJldHVybiB0aGlzLmNvbGxlY3Rpb25UeXBlTmFtZTsKIAl9CiAKKwlTdHJpbmcgZ2V0Q29sbGVjdGlvbkF0dHJpYnV0ZU5hbWVTdWZmaXgoKSB7CisJCXJldHVybiB0aGlzLmNvbGxlY3Rpb25BdHRyaWJ1dGVOYW1lU3VmZml4OworCX0KKwogCWludCBnZXRGaWVsZFZpc2liaWxpdHkoKSB7CiAJCXJldHVybiB0aGlzLmZpZWxkVmlzaWJpbGl0eTsKIAl9CkBAIC00MDksMjIgKzQwNSw1OCBAQAogCQlyZXR1cm4gdGhpcy5zeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sOwogCX0KIAkKLQlwcml2YXRlIHZvaWQgc2V0U3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbChib29sZWFuIHN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwpeworCXZvaWQgc2V0U3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbChib29sZWFuIHN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwpewogCQl0aGlzLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwgPSBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sOwogCX0KKworCVN0cmluZyBnZXRFbWJlZGRlZElkQXR0cmlidXRlTmFtZSgpIHsKKwkJcmV0dXJuIHRoaXMuZW1iZWRkZWRJZEF0dHJpYnV0ZU5hbWU7CisJfQorCisJU3RyaW5nIGdldFByaW1hcnlLZXlNZW1iZXJDbGFzc05hbWUoKSB7CisJCXJldHVybiB0aGlzLnByaW1hcnlLZXlNZW1iZXJDbGFzc05hbWU7CisJfQogCQotCS8qKgotCSAqIGtleSA9IHRhYmxlCi0JICogdmFsdWUgPSBvdmVycmlkZSBlbnRpdHkgbmFtZQotCSAqLwotCU1hcDxUYWJsZSwgU3RyaW5nPiBnZXRPdmVycmlkZUVudGl0eU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5vdmVycmlkZUVudGl0eU5hbWVzOworCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRTZWxlY3RBbGxCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQkJCS8vIG5vdGhpbmcgc3BlY2lhbCBmb3IgImRlZmF1bHQiIChkb3VibGUtY2xpY2s/KQorCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOworCQkJfQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCQlzZWxlY3RBbGxUYWJsZXMoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZERlc2VsZWN0QWxsQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCQkvLyBub3RoaW5nIHNwZWNpYWwgZm9yICJkZWZhdWx0IiAoZG91YmxlLWNsaWNrPykKKwkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJZGVzZWxlY3RBbGxUYWJsZXMoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFN5bmNoQ2xhc3Nlc1NlbGVjdGlvbkxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJLy8gbm90aGluZyBzcGVjaWFsIGZvciAiZGVmYXVsdCIgKGRvdWJsZS1jbGljaz8pCisJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQkJCXNldFN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwoc3luY2hyb25pemVDbGFzc2VzQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOworCQkJfQorCQl9OwogCX0KIAogCiAJLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKIAotCXByaXZhdGUgY2xhc3MgVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7CisJY2xhc3MgVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7CiAKIAkJVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKSB7CiAJCQlzdXBlcigpOwpAQCAtNDQ4LDE1ICs0ODAsMTUgQEAKIAkJCQkJcmV0dXJuICgoVGFibGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKIAogCQkJCWNhc2UgRU5USVRZX05BTUVfQ09MVU1OX0lOREVYOgotCQkJCQlyZXR1cm4gR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UudGhpcy5lbnRpdHlOYW1lKChUYWJsZSkgZWxlbWVudCk7CisJCQkJCXJldHVybiBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZS50aGlzLmdldEVudGl0eU5hbWUoKFRhYmxlKSBlbGVtZW50KTsKIAkJCX0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgY29sdW1uIGluZGV4OiAiICsgY29sdW1uSW5kZXgpOworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBjb2x1bW4gaW5kZXg6ICIgKyBjb2x1bW5JbmRleCk7IC8vJE5PTi1OTFMtMSQKIAkJfQogCiAJfQogCiAKLQlwcml2YXRlIGNsYXNzIFRhYmxlVGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7CisJc3RhdGljIGNsYXNzIFRhYmxlVGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7CiAKIAkJVGFibGVUYWJsZUNvbnRlbnRQcm92aWRlcigpIHsKIAkJCXN1cGVyKCk7CkBAIC00NzcsNyArNTA5LDcgQEAKIAl9CiAKIAotCXByaXZhdGUgY2xhc3MgVGFibGVUYWJsZUNlbGxNb2RpZmllciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIgeworCWNsYXNzIFRhYmxlVGFibGVDZWxsTW9kaWZpZXIgaW1wbGVtZW50cyBJQ2VsbE1vZGlmaWVyIHsKIAogCQlUYWJsZVRhYmxlQ2VsbE1vZGlmaWVyKCkgewogCQkJc3VwZXIoKTsKQEAgLTQ4OSw3ICs1MjEsNyBAQAogCiAJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewogCQkJaWYgKHByb3BlcnR5LmVxdWFscyhUQUJMRV9UQUJMRV9DT0xVTU5fUFJPUEVSVElFU1tFTlRJVFlfTkFNRV9DT0xVTU5fSU5ERVhdKSkgewotCQkJCXJldHVybiBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZS50aGlzLmVudGl0eU5hbWUoKFRhYmxlKSBlbGVtZW50KTsKKwkJCQlyZXR1cm4gR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UudGhpcy5nZXRFbnRpdHlOYW1lKChUYWJsZSkgZWxlbWVudCk7CiAJCQl9CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQpAQCAtNTAxLDE0ICs1MzMsMTMgQEAKIAkJCWlmICggISAoZWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlKSkgewogCQkJCXJldHVybjsKIAkJCX0KLQotCQkJYm9vbGVhbiB1bmNoYW5nZWQgPSBmYWxzZTsKIAkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKSBlbGVtZW50OworCisJCQlib29sZWFuIGNoYW5nZWQgPSB0cnVlOwogCQkJaWYgKHByb3BlcnR5LmVxdWFscyhUQUJMRV9UQUJMRV9DT0xVTU5fUFJPUEVSVElFU1tFTlRJVFlfTkFNRV9DT0xVTU5fSU5ERVhdKSkgewotCQkJCXVuY2hhbmdlZCA9IEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlLnRoaXMuZW50aXR5TmFtZSh0YWJsZSkuZXF1YWxzKHZhbHVlKTsKLQkJCQlHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZS50aGlzLnNldE92ZXJyaWRlRW50aXR5TmFtZSh0YWJsZSwgKFN0cmluZykgdmFsdWUpOworCQkJCWNoYW5nZWQgPSBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZS50aGlzLnNldEVudGl0eU5hbWUodGFibGUsIChTdHJpbmcpIHZhbHVlKTsKIAkJCX0KLQkJCWlmICghIHVuY2hhbmdlZCkgeworCQkJaWYgKGNoYW5nZWQpIHsKIAkJCQlHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZS50aGlzLnRhYmxlVGFibGUudXBkYXRlKHRhYmxlLCBuZXcgU3RyaW5nW10geyBwcm9wZXJ0eSB9KTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFGYWNldEFjdGlvblBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvSnBhRmFjZXRBY3Rpb25QYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwZDJlNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvSnBhRmFjZXRBY3Rpb25QYWdlLmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5MaWJyYXJ5SW5zdGFsbERlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5saWJwcm92LkxpYnJhcnlQcm92aWRlckZyYW1ld29ya1VpOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLkRhdGFNb2RlbEZhY2V0SW5zdGFsbFBhZ2U7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKcGFGYWNldEFjdGlvblBhZ2UKKwlleHRlbmRzIERhdGFNb2RlbEZhY2V0SW5zdGFsbFBhZ2UKKwlpbXBsZW1lbnRzIEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcworeworCXByb3RlY3RlZCBKcGFGYWNldEFjdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7CisJCXN1cGVyKHBhZ2VOYW1lKTsKKwkJc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfdGl0bGUpOworCQlzZXREZXNjcmlwdGlvbihKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kZXNjcmlwdGlvbik7CisJCXNldEltYWdlRGVzY3JpcHRvcihKcHRVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoSnB0VWlJY29ucy5KUEFfV0laX0JBTk5FUikpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCQkKKwkJYWRkU3ViQ29tcG9zaXRlcyhjb21wb3NpdGUpOworCQkKKwkJc2V0VXBSdW50aW1lTGlzdGVuZXIoKTsKKwkJCisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIEpwYUhlbHBDb250ZXh0SWRzLkRJQUxPR19KUEFfRkFDRVQpOworCQkKKwkJcmV0dXJuIGNvbXBvc2l0ZTsKKwl9CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgIGFkZFN1YkNvbXBvc2l0ZXMoQ29tcG9zaXRlIGNvbXBvc2l0ZSk7CisJCisJcHJpdmF0ZSB2b2lkIHNldFVwUnVudGltZUxpc3RlbmVyKCkgeworCSAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSB3YyA9ICggKE1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkKSBnZXRXaXphcmQoKSApLmdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKTsKKwkJLy8gbXVzdCBkbyBpdCBtYW51YWxseSB0aGUgZmlyc3QgdGltZQorCQltb2RlbC5zZXRQcm9wZXJ0eShSVU5USU1FLCB3Yy5nZXRQcmltYXJ5UnVudGltZSgpKTsKKwkJd2MuYWRkTGlzdGVuZXIoCisJCQluZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50ICkgeworCQkJCQltb2RlbC5zZXRQcm9wZXJ0eShSVU5USU1FLCB3Yy5nZXRQcmltYXJ5UnVudGltZSgpKTsKKwkJCQl9CisJCQl9LAorCQkJSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QUklNQVJZX1JVTlRJTUVfQ0hBTkdFRAorCQkpOworCX0KKwkKKwlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgeworCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5OT05FIHwgc3R5bGUpOworCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKKwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOworCQlidXR0b24uc2V0TGF5b3V0RGF0YShnZCk7CisJCXJldHVybiBidXR0b247CisJfQorCQorCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgYm9vbGVhbiBmaWxsSG9yaXpvbnRhbCkgeworCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7CisJCUdyaWREYXRhIGdkOworCQlpZiAoZmlsbEhvcml6b250YWwpIHsKKwkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCX0KKwkJZWxzZSB7CisJCQlnZCA9IG5ldyBHcmlkRGF0YSgpOworCQl9CisJCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKKwkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7CisJCXJldHVybiBjb21ibzsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgeworCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKKwkJCVBMQVRGT1JNX0lELAorCQkJQ09OTkVDVElPTiwKKwkJCVVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HLAorCQkJVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0csCisJCQlVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLAorCQkJVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwKKwkJCURJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLAorCQkJTElCUkFSWV9QUk9WSURFUl9ERUxFR0FURQorCQl9OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKKwkJaWYgKCEgc3VwZXIuaXNQYWdlQ29tcGxldGUoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWVsc2UgeworCQkJSVN0YXR1cyBzdGF0dXMgPSBtb2RlbC52YWxpZGF0ZSgpOyAKKwkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7CisJCQkJc2V0RXJyb3JNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCkpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX07CisJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOworCQlpZiAodmlzaWJsZSkgeworCQkJc2V0RXJyb3JNZXNzYWdlKCk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGdldEhlbHBTeXN0ZW0oKSB7CisJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKKwl9CisJCisJCisJcHJvdGVjdGVkIGZpbmFsIGNsYXNzIFBsYXRmb3JtR3JvdXAKKwl7CisJCXByaXZhdGUgZmluYWwgQ29tYm8gcGxhdGZvcm1Db21ibzsKKwkJCisJCQorCQlwdWJsaWMgUGxhdGZvcm1Hcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfcGxhdGZvcm1MYWJlbCk7CisJCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CisJCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLkRJQUxPR19KUEFfUExBVEZPUk0pOworCisJCQlwbGF0Zm9ybUNvbWJvID0gY3JlYXRlQ29tYm8oZ3JvdXAsIDEsIHRydWUpOworCQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhwbGF0Zm9ybUNvbWJvLCBQTEFURk9STV9JRCwgbnVsbCk7CisJCX0KKwl9CisJCisJCisJcHJvdGVjdGVkIGZpbmFsIGNsYXNzIENsYXNzcGF0aENvbmZpZ0dyb3VwCisJeworCQlwdWJsaWMgQ2xhc3NwYXRoQ29uZmlnR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJCisJCQlmaW5hbCBMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGxpYnJhcmllc0luc3RhbGxEZWxlZ2F0ZQorCQkJCT0gKExpYnJhcnlJbnN0YWxsRGVsZWdhdGUpIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KExJQlJBUllfUFJPVklERVJfREVMRUdBVEUpOworCQkJCisJCQlmaW5hbCBDb21wb3NpdGUgbGlicmFyaWVzQ29tcG9zaXRlIAorCQkJCT0gKENvbXBvc2l0ZSkgTGlicmFyeVByb3ZpZGVyRnJhbWV3b3JrVWkuY3JlYXRlSW5zdGFsbExpYnJhcnlQYW5lbCgKKwkJCQkJY29tcG9zaXRlLCBsaWJyYXJpZXNJbnN0YWxsRGVsZWdhdGUsIAorCQkJCQlKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9qcGFJbXBsZW1lbnRhdGlvbkxhYmVsICk7CisJCQlsaWJyYXJpZXNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGxpYnJhcmllc0NvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9DTEFTU1BBVEgpOwkJCQorCQl9CisJfQorCQorCQorCXByb3RlY3RlZCBmaW5hbCBjbGFzcyBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAKKwl7CisJCXByaXZhdGUgZmluYWwgQnV0dG9uIGRpc2NvdmVyQ2xhc3Nlc0J1dHRvbjsKKwkJCisJCXByaXZhdGUgZmluYWwgQnV0dG9uIGxpc3RDbGFzc2VzQnV0dG9uOworCQkKKwkJCisJCXB1YmxpYyBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3BlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRMYWJlbCk7CisJCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CisJCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfQ0xBU1NQQVRIKTsKKwkJCQorCQkJZGlzY292ZXJDbGFzc2VzQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kaXNjb3ZlckNsYXNzZXNCdXR0b24sIFNXVC5SQURJTyk7CisJCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGRpc2NvdmVyQ2xhc3Nlc0J1dHRvbiwgRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIG51bGwpOworCQkJCisJCQlsaXN0Q2xhc3Nlc0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfbGlzdENsYXNzZXNCdXR0b24sIFNXVC5SQURJTyk7CisJCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGxpc3RDbGFzc2VzQnV0dG9uLCBMSVNUX0FOTk9UQVRFRF9DTEFTU0VTLCBudWxsKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvSnBhRmFjZXRJbnN0YWxsUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFGYWNldEluc3RhbGxQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhZTg4NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvSnBhRmFjZXRJbnN0YWxsUGFnZS5qYXZhCkBAIC0wLDAgKzEsMjMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuSnB0RGJQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLnVpLmludGVybmFsLkRUUFVpVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworCitwdWJsaWMgY2xhc3MgSnBhRmFjZXRJbnN0YWxsUGFnZQorCWV4dGVuZHMgSnBhRmFjZXRBY3Rpb25QYWdlCisJaW1wbGVtZW50cyBKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzCit7CisJcHVibGljIEpwYUZhY2V0SW5zdGFsbFBhZ2UoKSB7CisJCXN1cGVyKCJqcHQuanBhLmZhY2V0Lmluc3RhbGwucGFnZSIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKKwkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9KUEFfRkFDRVQpOworCQlyZXR1cm4gY29tcG9zaXRlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhZGRTdWJDb21wb3NpdGVzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJbmV3IFBsYXRmb3JtR3JvdXAoY29tcG9zaXRlKTsKKwkJbmV3IENsYXNzcGF0aENvbmZpZ0dyb3VwKGNvbXBvc2l0ZSk7CisJCW5ldyBDb25uZWN0aW9uR3JvdXAoY29tcG9zaXRlKTsKKwkJbmV3IFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cChjb21wb3NpdGUpOworCQluZXcgT3JtWG1sR3JvdXAoY29tcG9zaXRlKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgeworCQlTdHJpbmdbXSB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCk7CisJCXJldHVybiBBcnJheVRvb2xzLmFkZEFsbCgKKwkJCQl2YWxpZGF0aW9uUHJvcGVydHlOYW1lcywKKwkJCQlVU0VSX1dBTlRTX1RPX0FERF9EQl9EUklWRVJfSkFSU19UT19DTEFTU1BBVEgsCisJCQkJREJfRFJJVkVSX05BTUUpOworCX0KKwkKKwkKKwlwcm90ZWN0ZWQgZmluYWwgY2xhc3MgQ29ubmVjdGlvbkdyb3VwCisJeworCQlwcml2YXRlIGZpbmFsIENvbWJvIGNvbm5lY3Rpb25Db21ibzsKKwkJCisJCXByaXZhdGUgTGluayBjb25uZWN0aW9uTGluazsKKwkJCisJCXByaXZhdGUgTGluayBjb25uZWN0TGluazsKKwkJCisJCXByaXZhdGUgZmluYWwgQnV0dG9uIGFkZERyaXZlckxpYnJhcnlCdXR0b247CisJCQorCQlwcml2YXRlIGZpbmFsIExhYmVsIGRyaXZlckxpYnJhcnlMYWJlbDsKKwkJCisJCXByaXZhdGUgZmluYWwgQ29tYm8gZHJpdmVyTGlicmFyeUNvbWJvOworCQkKKwkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0J1dHRvbjsKKwkJCisJCXByaXZhdGUgZmluYWwgTGFiZWwgZGVmYXVsdENhdGFsb2dMYWJlbDsKKwkJCisJCXByaXZhdGUgZmluYWwgQ29tYm8gZGVmYXVsdENhdGFsb2dDb21ibzsKKwkJCisJCXByaXZhdGUgZmluYWwgQnV0dG9uIG92ZXJyaWRlRGVmYXVsdFNjaGVtYUJ1dHRvbjsKKwkJCisJCXByaXZhdGUgZmluYWwgTGFiZWwgZGVmYXVsdFNjaGVtYUxhYmVsOworCQkKKwkJcHJpdmF0ZSBmaW5hbCBDb21ibyBkZWZhdWx0U2NoZW1hQ29tYm87CisJCQorCQkKKwkJcHVibGljIENvbm5lY3Rpb25Hcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxhYmVsKTsKKwkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOworCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBKcGFIZWxwQ29udGV4dElkcy5ORVdfSlBBX1BST0pFQ1RfQ09OVEVOVF9QQUdFX0RBVEFCQVNFKTsKKwkJCQorCQkJY29ubmVjdGlvbkNvbWJvID0gY3JlYXRlQ29tYm8oZ3JvdXAsIDMsIHRydWUpOworCQkJc3luY2hIZWxwZXIuc3luY2hDb21ibyhjb25uZWN0aW9uQ29tYm8sIENPTk5FQ1RJT04sIG51bGwpOworCQkJY29ubmVjdGlvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAorCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQkJdXBkYXRlQ29ubmVjdExpbmsoKTsKKwkJCQkJfQorCQkJCX0pOworCQkJCisJCQljb25uZWN0aW9uTGluayA9IG5ldyBMaW5rKGdyb3VwLCBTV1QuTk9ORSk7CisJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOworCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQljb25uZWN0aW9uTGluay5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJY29ubmVjdGlvbkxpbmsuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGluayk7CisJCQljb25uZWN0aW9uTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKKwkJCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJCW9wZW5OZXdDb25uZWN0aW9uV2l6YXJkKCk7CisJCQkJCX0KKwkJCQl9CisJCQkpOworCQkJCisJCQljb25uZWN0TGluayA9IG5ldyBMaW5rKGdyb3VwLCBTV1QuTk9ORSk7CisJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOworCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQljb25uZWN0TGluay5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJY29ubmVjdExpbmsuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0TGluayk7CisJCQljb25uZWN0TGluay5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCWNvbm5lY3RMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAorCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQkJb3BlbkNvbm5lY3Rpb25Qcm9maWxlKCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCQorCQkJYWRkRHJpdmVyTGlicmFyeUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMywgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfYWRkRHJpdmVyTGlicmFyeUxhYmVsLCBTV1QuQ0hFQ0spOworCQkJYWRkRHJpdmVyTGlicmFyeUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChhZGREcml2ZXJMaWJyYXJ5QnV0dG9uLCBVU0VSX1dBTlRTX1RPX0FERF9EQl9EUklWRVJfSkFSU19UT19DTEFTU1BBVEgsIG51bGwpOworCQkJCisJCQlkcml2ZXJMaWJyYXJ5TGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5MRUZUKTsKKwkJCWRyaXZlckxpYnJhcnlMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2RyaXZlckxpYnJhcnlMYWJlbCk7CisJCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOworCQkJZHJpdmVyTGlicmFyeUxhYmVsLnNldExheW91dERhdGEoZ2QpOworCQkJCisJCQlkcml2ZXJMaWJyYXJ5Q29tYm8gPSBjcmVhdGVDb21ibyhncm91cCwgMSwgdHJ1ZSk7CisJCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKAorCQkJCWRyaXZlckxpYnJhcnlDb21ibywgREJfRFJJVkVSX05BTUUsIAorCQkJCW5ldyBDb250cm9sW10ge2RyaXZlckxpYnJhcnlMYWJlbH0pOworCQkJCisJCQlvdmVycmlkZURlZmF1bHRDYXRhbG9nQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAzLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9vdmVycmlkZURlZmF1bHRDYXRhbG9nTGFiZWwsIFNXVC5DSEVDSyk7CisJCQlvdmVycmlkZURlZmF1bHRDYXRhbG9nQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7CisJCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KG92ZXJyaWRlRGVmYXVsdENhdGFsb2dCdXR0b24sIFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HLCBudWxsKTsKKwkJCQorCQkJZGVmYXVsdENhdGFsb2dMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULkxFRlQpOworCQkJZGVmYXVsdENhdGFsb2dMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2RlZmF1bHRDYXRhbG9nTGFiZWwpOworCQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKKwkJCWdkLmhvcml6b250YWxTcGFuID0gMTsKKwkJCWRlZmF1bHRDYXRhbG9nTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7CisJCQkKKwkJCWRlZmF1bHRDYXRhbG9nQ29tYm8gPSBjcmVhdGVDb21ibyhncm91cCwgMSwgdHJ1ZSk7CisJCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKAorCQkJCWRlZmF1bHRDYXRhbG9nQ29tYm8sIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HLCAKKwkJCQluZXcgQ29udHJvbFtdIHtkZWZhdWx0Q2F0YWxvZ0xhYmVsfSk7CisJCQkKKwkJCW92ZXJyaWRlRGVmYXVsdFNjaGVtYUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMywgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2Vfb3ZlcnJpZGVEZWZhdWx0U2NoZW1hTGFiZWwsIFNXVC5DSEVDSyk7CisJCQlvdmVycmlkZURlZmF1bHRTY2hlbWFCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKKwkJCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3gob3ZlcnJpZGVEZWZhdWx0U2NoZW1hQnV0dG9uLCBVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBudWxsKTsKKwkJCQorCQkJZGVmYXVsdFNjaGVtYUxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTEVGVCk7CisJCQlkZWZhdWx0U2NoZW1hTGFiZWwuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kZWZhdWx0U2NoZW1hTGFiZWwpOworCQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKKwkJCWdkLmhvcml6b250YWxTcGFuID0gMTsKKwkJCWRlZmF1bHRTY2hlbWFMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKKwkJCQorCQkJZGVmYXVsdFNjaGVtYUNvbWJvID0gY3JlYXRlQ29tYm8oZ3JvdXAsIDEsIHRydWUpOworCQkJc3luY2hIZWxwZXIuc3luY2hDb21ibygKKwkJCQlkZWZhdWx0U2NoZW1hQ29tYm8sIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIAorCQkJCW5ldyBDb250cm9sW10ge2RlZmF1bHRTY2hlbWFMYWJlbH0pOworCQl9CisJCQorCQlwcml2YXRlIHZvaWQgb3Blbk5ld0Nvbm5lY3Rpb25XaXphcmQoKSB7CisJCQlTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSBEVFBVaVRvb2xzLmNyZWF0ZU5ld0Nvbm5lY3Rpb25Qcm9maWxlKCk7CisJCQlpZiAoY29ubmVjdGlvbk5hbWUgIT0gbnVsbCkgeworCQkJCW1vZGVsLnNldFByb3BlcnR5KENPTk5FQ1RJT04sIGNvbm5lY3Rpb25OYW1lKTsKKwkJCX0KKwkJfQorCQkKKwkJcHJpdmF0ZSB2b2lkIG9wZW5Db25uZWN0aW9uUHJvZmlsZSgpIHsKKwkJCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKKwkJCWlmIChjcCAhPSBudWxsKSB7CisJCQkJY3AuY29ubmVjdCgpOworCQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShDT05ORUNUSU9OX0FDVElWRSwgY3AuaXNBY3RpdmUoKSk7CisJCQkJdXBkYXRlQ29ubmVjdExpbmsoKTsKKwkJCX0KKwkJfQorCQkKKwkJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbm5lY3RMaW5rKCkgeworCQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7CisJCQljb25uZWN0TGluay5zZXRFbmFibGVkKChjcCAhPSBudWxsKSAmJiBjcC5pc0Rpc2Nvbm5lY3RlZCgpKTsKKwkJCWFkZERyaXZlckxpYnJhcnlCdXR0b24uc2V0RW5hYmxlZChjcCAhPSBudWxsKTsKKwkJfQorCQkKKwkJcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKKwkJCS8vIHdlIGp1c3QgdXNlIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgdG8gbG9nIGluLCBzbyBnbyB0aGUgdGhlIGRiIHBsdWctaW4KKwkJCXJldHVybiBKcHREYlBsdWdpbi5pbnN0YW5jZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoQ09OTkVDVElPTikpOworCQl9CisJfQorCQorCQorCXByb3RlY3RlZCBmaW5hbCBjbGFzcyBPcm1YbWxHcm91cAorCXsKKwkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gY3JlYXRlT3JtWG1sQnV0dG9uOworCisKKwkJcHVibGljIE9ybVhtbEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKwkJCUNvbXBvc2l0ZSBncm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CisJCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLkRJQUxPR19DUkVBVEVfT1JNKTsKKworCQkJY3JlYXRlT3JtWG1sQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKKwkJCWNyZWF0ZU9ybVhtbEJ1dHRvbi5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2NyZWF0ZU9ybVhtbEJ1dHRvbik7CisJCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGNyZWF0ZU9ybVhtbEJ1dHRvbiwgQ1JFQVRFX09STV9YTUwsIG51bGwpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFGYWNldFZlcnNpb25DaGFuZ2VQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0pwYUZhY2V0VmVyc2lvbkNoYW5nZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmUwY2UwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFGYWNldFZlcnNpb25DaGFuZ2VQYWdlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKK3B1YmxpYyBjbGFzcyBKcGFGYWNldFZlcnNpb25DaGFuZ2VQYWdlCisJZXh0ZW5kcyBKcGFGYWNldEFjdGlvblBhZ2UKK3sKKwlwdWJsaWMgSnBhRmFjZXRWZXJzaW9uQ2hhbmdlUGFnZSgpIHsKKwkJc3VwZXIoImpwdC5qcGEuZmFjZXQudmVyc2lvbi1jaGFuZ2UucGFnZSIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKKwkJLy8gVE9ETworCQkvL3RoaXMuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5ORVdfSlBBX1BST0pFQ1RfSlBBX0ZBQ0VUKTsKKwkJcmV0dXJuIGNvbXBvc2l0ZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWRkU3ViQ29tcG9zaXRlcyhDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJCW5ldyBQbGF0Zm9ybUdyb3VwKGNvbXBvc2l0ZSk7CisJCW5ldyBDbGFzc3BhdGhDb25maWdHcm91cChjb21wb3NpdGUpOworCQkvL25ldyBDb25uZWN0aW9uR3JvdXAoY29tcG9zaXRlKTsKKwkJLy9uZXcgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwKGNvbXBvc2l0ZSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKKwkJLy8gbm90aGluZyBuZXcgaGVyZSAqanVzdCogeWV0CisJCXJldHVybiBzdXBlci5nZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvSnBhRmFjZXRXaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0pwYUZhY2V0V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjg1MWQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvSnBhRmFjZXRXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuSnB0RGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLnVpLmludGVybmFsLkRUUFVpVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJlZnMuSnBhUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLk1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhTW9kZWxGYWNldEluc3RhbGxQYWdlOwotCi1wdWJsaWMgY2xhc3MgSnBhRmFjZXRXaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsRmFjZXRJbnN0YWxsUGFnZQotCWltcGxlbWVudHMgSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JcHVibGljIEpwYUZhY2V0V2l6YXJkUGFnZSgpIHsKLQkJc3VwZXIoImpwdC5qcGEuZmFjZXQuaW5zdGFsbC5wYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kZXNjcmlwdGlvbik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKcHRVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoSnB0VWlJY29ucy5KUEFfV0laX0JBTk5FUikpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQluZXcgUGxhdGZvcm1Hcm91cChjb21wb3NpdGUpOwotCQluZXcgQ29ubmVjdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0JCW5ldyBDbGFzc3BhdGhDb25maWdHcm91cChjb21wb3NpdGUpOwotCQluZXcgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCW5ldyBPcm1YbWxHcm91cChjb21wb3NpdGUpOwotCi0JCXNldFVwUnVudGltZUxpc3RlbmVyKCk7Ci0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSnBhSGVscENvbnRleHRJZHMuRElBTE9HX0pQQV9GQUNFVCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VXBSdW50aW1lTGlzdGVuZXIoKSB7Ci0JICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IHdjID0gKCAoTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQpIGdldFdpemFyZCgpICkuZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpOwotCQkvLyBtdXN0IGRvIGl0IG1hbnVhbGx5IHRoZSBmaXJzdCB0aW1lCi0JCW1vZGVsLnNldFByb3BlcnR5KFJVTlRJTUUsIHdjLmdldFByaW1hcnlSdW50aW1lKCkpOwotCQl3Yy5hZGRMaXN0ZW5lcigKLQkJCW5ldyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKSB7Ci0JCQkJCW1vZGVsLnNldFByb3BlcnR5KFJVTlRJTUUsIHdjLmdldFByaW1hcnlSdW50aW1lKCkpOwotCQkJCX0KLQkJCX0sCi0JCQlJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBSSU1BUllfUlVOVElNRV9DSEFOR0VECi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuLCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULk5PTkUgfCBzdHlsZSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcml2YXRlIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuLCBib29sZWFuIGZpbGxIb3Jpem9udGFsKSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZ2Q7Ci0JCWlmIChmaWxsSG9yaXpvbnRhbCkgewotCQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJfQotCQllbHNlIHsKLQkJCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCX0KLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQljb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JCQlQTEFURk9STV9JRCwKLQkJCUNPTk5FQ1RJT04sCi0JCQlVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLAotCQkJVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwKLQkJCVVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OLAotCQkJSlBBX0xJQlJBUlksCi0JCQlESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUwotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoISBzdXBlci5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gKG1vZGVsLnZhbGlkYXRlKCkuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmICh2aXNpYmxlKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBQbGF0Zm9ybUdyb3VwCi0JewotCQlwcml2YXRlIGZpbmFsIENvbWJvIHBsYXRmb3JtQ29tYm87Ci0JCQotCQkKLQkJcHVibGljIFBsYXRmb3JtR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3BsYXRmb3JtTGFiZWwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBKcGFIZWxwQ29udGV4dElkcy5ESUFMT0dfSlBBX1BMQVRGT1JNKTsKLQotCQkJcGxhdGZvcm1Db21ibyA9IGNyZWF0ZUNvbWJvKGdyb3VwLCAxLCB0cnVlKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8ocGxhdGZvcm1Db21ibywgUExBVEZPUk1fSUQsIG51bGwpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIENvbm5lY3Rpb25Hcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBjb25uZWN0aW9uQ29tYm87Ci0JCQotCQlwcml2YXRlIExpbmsgY29ubmVjdGlvbkxpbms7Ci0JCQotCQlwcml2YXRlIExpbmsgY29ubmVjdExpbms7Ci0JCQotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBvdmVycmlkZURlZmF1bHRTY2hlbWFCdXR0b247Ci0JCQotCQlwcml2YXRlIGZpbmFsIExhYmVsIGRlZmF1bHRTY2hlbWFMYWJlbDsKLQkJCi0JCXByaXZhdGUgZmluYWwgQ29tYm8gZGVmYXVsdFNjaGVtYUNvbWJvOwotCQkKLQkJCi0JCXB1YmxpYyBDb25uZWN0aW9uR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MYWJlbCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9EQVRBQkFTRSk7Ci0JCQkKLQkJCWNvbm5lY3Rpb25Db21ibyA9IGNyZWF0ZUNvbWJvKGdyb3VwLCAzLCB0cnVlKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oY29ubmVjdGlvbkNvbWJvLCBDT05ORUNUSU9OLCBudWxsKTsKLQkJCWNvbm5lY3Rpb25Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXVwZGF0ZUNvbm5lY3RMaW5rKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQotCQkJY29ubmVjdGlvbkxpbmsgPSBuZXcgTGluayhncm91cCwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJY29ubmVjdGlvbkxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWNvbm5lY3Rpb25MaW5rLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxpbmspOwotCQkJY29ubmVjdGlvbkxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlvcGVuTmV3Q29ubmVjdGlvbldpemFyZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJCQotCQkJY29ubmVjdExpbmsgPSBuZXcgTGluayhncm91cCwgU1dULk5PTkUpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJY29ubmVjdExpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWNvbm5lY3RMaW5rLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdExpbmspOwotCQkJY29ubmVjdExpbmsuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljb25uZWN0TGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCW9wZW5Db25uZWN0aW9uUHJvZmlsZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkKLQkJCW92ZXJyaWRlRGVmYXVsdFNjaGVtYUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMywgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2Vfb3ZlcnJpZGVEZWZhdWx0U2NoZW1hTGFiZWwsIFNXVC5DSEVDSyk7Ci0JCQlvdmVycmlkZURlZmF1bHRTY2hlbWFCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3gob3ZlcnJpZGVEZWZhdWx0U2NoZW1hQnV0dG9uLCBVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBudWxsKTsKLQkJCQotCQkJZGVmYXVsdFNjaGVtYUxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTEVGVCk7Ci0JCQlkZWZhdWx0U2NoZW1hTGFiZWwuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kZWZhdWx0U2NoZW1hTGFiZWwpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWRlZmF1bHRTY2hlbWFMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQotCQkJZGVmYXVsdFNjaGVtYUNvbWJvID0gY3JlYXRlQ29tYm8oZ3JvdXAsIDEsIHRydWUpOwotCQkJc3luY2hIZWxwZXIuc3luY2hDb21ibygKLQkJCQlkZWZhdWx0U2NoZW1hQ29tYm8sIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIAotCQkJCW5ldyBDb250cm9sW10ge2RlZmF1bHRTY2hlbWFMYWJlbH0pOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgb3Blbk5ld0Nvbm5lY3Rpb25XaXphcmQoKSB7Ci0JCQlTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSBEVFBVaVRvb2xzLmNyZWF0ZU5ld1Byb2ZpbGUoKTsKLQkJCWlmIChjb25uZWN0aW9uTmFtZSAhPSBudWxsKSB7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoQ09OTkVDVElPTiwgY29ubmVjdGlvbk5hbWUpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgb3BlbkNvbm5lY3Rpb25Qcm9maWxlKCkgewotCQkJQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvbiA9IGdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCQljb25uZWN0aW9uLmNvbm5lY3QoKTsKLQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShDT05ORUNUSU9OX0FDVElWRSwgY29ubmVjdGlvbi5pc0FjdGl2ZSgpKTsKLQkJCXVwZGF0ZUNvbm5lY3RMaW5rKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVDb25uZWN0TGluaygpIHsKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlID0gZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJCWNvbm5lY3RMaW5rLnNldEVuYWJsZWQoISBjb25uZWN0aW9uUHJvZmlsZS5pc051bGwoKSAmJiAhIGNvbm5lY3Rpb25Qcm9maWxlLmlzQ29ubmVjdGVkKCkpOwotCQl9Ci0JCQotCQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQkJcmV0dXJuIEpwdERiUGx1Z2luLmluc3RhbmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5KCkuY29ubmVjdGlvblByb2ZpbGVOYW1lZChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDT05ORUNUSU9OKSk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgZmluYWwgY2xhc3MgQ2xhc3NwYXRoQ29uZmlnR3JvdXAKLQl7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHVzZVNlcnZlckxpYkJ1dHRvbjsKLQotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBzcGVjaWZ5TGliQnV0dG9uOwotCi0JCXByaXZhdGUgZmluYWwgQ29tYm8ganBhTGliQ29tYm87Ci0KLQkJcHJpdmF0ZSBmaW5hbCBMaW5rIGpwYVByZWZzTGluazsKLQotCQlwcml2YXRlIGZpbmFsIExpbmsgdXNlckxpYnNMaW5rOwotCQkKLQkJCi0JCXB1YmxpYyBDbGFzc3BhdGhDb25maWdHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfanBhSW1wbGVtZW50YXRpb25MYWJlbCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9DTEFTU1BBVEgpOwotCQkJCi0JCQl1c2VTZXJ2ZXJMaWJCdXR0b24gPSBjcmVhdGVCdXR0b24oZ3JvdXAsIDIsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3VzZXJTZXJ2ZXJMaWJMYWJlbCwgU1dULlJBRElPKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoUmFkaW8odXNlU2VydmVyTGliQnV0dG9uLCBVU0VfU0VSVkVSX0pQQV9JTVBMRU1FTlRBVElPTiwgbnVsbCk7Ci0JCQkKLQkJCXNwZWNpZnlMaWJCdXR0b24gPSBjcmVhdGVCdXR0b24oZ3JvdXAsIDEsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3NwZWNpZnlMaWJMYWJlbCwgU1dULlJBRElPKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoUmFkaW8oc3BlY2lmeUxpYkJ1dHRvbiwgVVNFX1VTRVJfSlBBX0xJQlJBUlksIG51bGwpOwotCQkJCi0JCQlqcGFMaWJDb21ibyA9IGNyZWF0ZUNvbWJvKGdyb3VwLCAxLCB0cnVlKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oanBhTGliQ29tYm8sIEpQQV9MSUJSQVJZLCBudWxsKTsKLQkJCQotCQkJanBhUHJlZnNMaW5rID0gbmV3IExpbmsoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWpwYVByZWZzTGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJanBhUHJlZnNMaW5rLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfanBhUHJlZnNMaW5rKTsKLQkJCWpwYVByZWZzTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXByb21wdFRvQ29uZmlnSnBhUHJlZnMoKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCQkKLQkJCXVzZXJMaWJzTGluayA9IG5ldyBMaW5rKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQl1c2VyTGlic0xpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXVzZXJMaWJzTGluay5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3VzZXJMaWJzTGluayk7Ci0JCQl1c2VyTGlic0xpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlwcm9tcHRUb0NvbmZpZ1VzZXJMaWJyYXJpZXMoKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBwcm9tcHRUb0NvbmZpZ0pwYVByZWZzKCkgewotCQkJUHJlZmVyZW5jZURpYWxvZyBkbGcgPQotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oCi0JCQkJCWdldFNoZWxsKCksCi0JCQkJCUpwYVByZWZlcmVuY2VQYWdlLklELAotCQkJCQluZXcgU3RyaW5nW10ge0pwYVByZWZlcmVuY2VQYWdlLklEfSwKLQkJCQkJbnVsbCk7Ci0JCQlkbGcub3BlbigpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoSlBBX0xJQlJBUlksIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShKUEFfTElCUkFSWSwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBwcm9tcHRUb0NvbmZpZ1VzZXJMaWJyYXJpZXMoKSB7Ci0JCQlQcmVmZXJlbmNlRGlhbG9nIGRsZyA9Ci0JCQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbigKLQkJCQkJZ2V0U2hlbGwoKSwKLQkJCQkJSmF2YVVJLklEX1VTRVJfTElCUkFSWV9QUkVGRVJFTkNFX1BBR0UsCi0JCQkJCW5ldyBTdHJpbmdbXSB7SmF2YVVJLklEX1VTRVJfTElCUkFSWV9QUkVGRVJFTkNFX1BBR0V9LAotCQkJCQludWxsKTsKLQkJCWRsZy5vcGVuKCk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShKUEFfTElCUkFSWSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAKLQl7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGRpc2NvdmVyQ2xhc3Nlc0J1dHRvbjsKLQotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBsaXN0Q2xhc3Nlc0J1dHRvbjsKLQotCi0JCXB1YmxpYyBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3BlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRMYWJlbCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfQ0xBU1NQQVRIKTsKLQkJCQotCQkJZGlzY292ZXJDbGFzc2VzQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kaXNjb3ZlckNsYXNzZXNCdXR0b24sIFNXVC5SQURJTyk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGRpc2NvdmVyQ2xhc3Nlc0J1dHRvbiwgRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIG51bGwpOwotCQkJCi0JCQlsaXN0Q2xhc3Nlc0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfbGlzdENsYXNzZXNCdXR0b24sIFNXVC5SQURJTyk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaFJhZGlvKGxpc3RDbGFzc2VzQnV0dG9uLCBMSVNUX0FOTk9UQVRFRF9DTEFTU0VTLCBudWxsKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBPcm1YbWxHcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gY3JlYXRlT3JtWG1sQnV0dG9uOwotCi0KLQkJcHVibGljIE9ybVhtbEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUNvbXBvc2l0ZSBncm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLkRJQUxPR19DUkVBVEVfT1JNKTsKLQotCQkJY3JlYXRlT3JtWG1sQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCWNyZWF0ZU9ybVhtbEJ1dHRvbi5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2NyZWF0ZU9ybVhtbEJ1dHRvbik7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGNyZWF0ZU9ybVhtbEJ1dHRvbiwgQ1JFQVRFX09STV9YTUwsIG51bGwpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdFbnRpdHlEcm9wRG93bkFjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdFbnRpdHlEcm9wRG93bkFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNjdjMDkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL05ld0VudGl0eURyb3BEb3duQWN0aW9uLmphdmEKQEAgLTAsMCArMSwyNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBPcmFjbGUgLSBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gTmV3SmF2YUVFRHJvcERvd25BY3Rpb24gYW5kIE5ld1R5cGVEcm9wRG93bkFjdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5QaXhlbENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5BYnN0cmFjdE9wZW5XaXphcmRBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnV0aWwuQ29yZVV0aWxpdHk7CisKKworLyoqCisgKiBBIHR5cGUgd2l6YXJkIGlzIGFkZGVkIHRvIHRoZSB0eXBlIGRyb3AgZG93biBpZiBpdCBoYXMgYSBwYXJhbWF0ZXIgJ2phdmF0eXBlJzoKKyAqICAgICA8d2l6YXJkCisgKiAgICAgICAgIG5hbWU9Ik15IEpQVCBXaXphcmQiCisgKiAgICAgICAgIGljb249Imljb25zL3dpei5naWYiCisgKiAgICAgICAgIGNhdGVnb3J5PSJteWNhdGVnb3J5IgorICogICAgICAgICBpZD0ieHguTXlXaXphcmQiPgorICogICAgICAgICA8Y2xhc3MgY2xhc3M9Im9yZy54eC5NeVdpemFyZCI+CisgKiAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImpwdGFydGlmYWN0IiB2YWx1ZT0idHJ1ZSIvPgorICogICAgICAgICA8L2NsYXNzPiAKKyAqICAgICAgICAgPGRlc2NyaXB0aW9uPgorICogICAgICAgICAgICAgTXkgSlBUIFdpemFyZAorICogICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICogICAgICA8L3dpemFyZD4KKyAqLworcHVibGljIGNsYXNzIE5ld0VudGl0eURyb3BEb3duQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSU1lbnVDcmVhdG9yLCBJV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZTIgeworCisJcHVibGljIHN0YXRpYyBjbGFzcyBPcGVuSnB0V2l6YXJkQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uIGltcGxlbWVudHMgQ29tcGFyYWJsZTxPYmplY3Q+ICB7CisKKwkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9OQU1FID0gIm5hbWUiOy8vJE5PTi1OTFMtMSQKKwkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7Ly8kTk9OLU5MUy0xJAorCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0lDT04gPSAiaWNvbiI7Ly8kTk9OLU5MUy0xJAorCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsJLy8kTk9OLU5MUy0xJAorCQkKKwkJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZkNvbmZpZ3VyYXRpb25FbGVtZW50OworCQlwcml2YXRlIGludCBtZW51SW5kZXg7CisKKwkJcHVibGljIE9wZW5KcHRXaXphcmRBY3Rpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJCXRoaXMuZkNvbmZpZ3VyYXRpb25FbGVtZW50PSBlbGVtZW50OworCQkJc2V0VGV4dChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRSkpOworCQkJCisJCQlTdHJpbmcgZGVzY3JpcHRpb249IGdldERlc2NyaXB0aW9uRnJvbUNvbmZpZyh0aGlzLmZDb25maWd1cmF0aW9uRWxlbWVudCk7CisJCQlzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisJCQlzZXRUb29sVGlwVGV4dChkZXNjcmlwdGlvbik7CisJCQlzZXRJbWFnZURlc2NyaXB0b3IoZ2V0SWNvbkZyb21Db25maWcodGhpcy5mQ29uZmlndXJhdGlvbkVsZW1lbnQpKTsKKwkJCXNldE1lbnVJbmRleChnZXRNZW51SW5kZXhGcm9tQ29uZmlnKHRoaXMuZkNvbmZpZ3VyYXRpb25FbGVtZW50KSk7CisJCX0KKwkJCisJCXByaXZhdGUgU3RyaW5nIGdldERlc2NyaXB0aW9uRnJvbUNvbmZpZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnKSB7CisJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgW10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oVEFHX0RFU0NSSVBUSU9OKTsKKwkJCWlmIChjaGlsZHJlbi5sZW5ndGg+PTEpIHsKKwkJCQlyZXR1cm4gY2hpbGRyZW5bMF0uZ2V0VmFsdWUoKTsKKwkJCX0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZ2V0SWNvbkZyb21Db25maWcoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZykgeworCQkJU3RyaW5nIGljb25OYW1lID0gY29uZmlnLmdldEF0dHJpYnV0ZShBVFRfSUNPTik7CisJCQlpZiAoaWNvbk5hbWUgIT0gbnVsbCkgeworCQkJCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpLCBpY29uTmFtZSk7CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKwkJcHJpdmF0ZSBpbnQgZ2V0TWVudUluZGV4RnJvbUNvbmZpZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnKSB7CisJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjbGFzc0VsZW1lbnRzID0gY29uZmlnLmdldENoaWxkcmVuKFRBR19DTEFTUyk7CisJCQlpZiAoY2xhc3NFbGVtZW50cy5sZW5ndGggPiAwKSB7CisJCQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2xhc3NFbGVtZW50IDogY2xhc3NFbGVtZW50cykgeworCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBwYXJhbUVsZW1lbnRzID0gY2xhc3NFbGVtZW50LmdldENoaWxkcmVuKFRBR19QQVJBTUVURVIpOworCQkJCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBwYXJhbUVsZW1lbnQgOiBwYXJhbUVsZW1lbnRzKSB7CisJCQkJCQlpZiAoQVRUX01FTlVJTkRFWC5lcXVhbHMocGFyYW1FbGVtZW50LmdldEF0dHJpYnV0ZShUQUdfTkFNRSkpKSB7CisJCQkJCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQocGFyYW1FbGVtZW50LmdldEF0dHJpYnV0ZShUQUdfVkFMVUUpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKKwkJCXRyeSB7CisJCQkJSU5ld1dpemFyZCB3aXphcmQgPSBjcmVhdGVXaXphcmQoKTsKKwkJCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBnZXRTZWxlY3Rpb24oKSk7CisJCQkJCisJCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7CisJCQkJUGl4ZWxDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IFBpeGVsQ29udmVydGVyKEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7CisJCQkJZGlhbG9nLnNldE1pbmltdW1QYWdlU2l6ZShjb252ZXJ0ZXIuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDcwKSwgY29udmVydGVyLmNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMjApKTsKKwkJCQlkaWFsb2cuY3JlYXRlKCk7CisJCQkJaW50IHJlcyA9IGRpYWxvZy5vcGVuKCk7CisJCQkJCisJCQkJbm90aWZ5UmVzdWx0KHJlcyA9PSBXaW5kb3cuT0spOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKKwkJCX0KKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgSU5ld1dpemFyZCBjcmVhdGVXaXphcmQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQlyZXR1cm4gKElOZXdXaXphcmQpIENvcmVVdGlsaXR5LmNyZWF0ZUV4dGVuc2lvbihmQ29uZmlndXJhdGlvbkVsZW1lbnQsIEFUVF9DTEFTUyk7CisJCX0KKworCQlwdWJsaWMgaW50IGdldE1lbnVJbmRleCgpIHsKKwkJCXJldHVybiB0aGlzLm1lbnVJbmRleDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldE1lbnVJbmRleChpbnQgbWVudUluZGV4KSB7CisJCQl0aGlzLm1lbnVJbmRleCA9IG1lbnVJbmRleDsKKwkJfQorCisJCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7CisJCQlPcGVuSnB0V2l6YXJkQWN0aW9uIGFjdGlvbiA9IChPcGVuSnB0V2l6YXJkQWN0aW9uKSBvOworCQkJcmV0dXJuIGdldE1lbnVJbmRleCgpIC0gYWN0aW9uLmdldE1lbnVJbmRleCgpOworCQl9CisKKwl9CisJCisJCisJCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBR19XSVpBUkQgPSAid2l6YXJkIjsvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9KUFRBUlRJRkFDVCA9ICJqcHRhcnRpZmFjdCI7Ly8kTk9OLU5MUy0xJAorCQorCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfUEFSQU1FVEVSID0gInBhcmFtZXRlciI7Ly8kTk9OLU5MUy0xJAorCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfTkFNRSA9ICJuYW1lIjsvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBR19WQUxVRSA9ICJ2YWx1ZSI7Ly8kTk9OLU5MUy0xJAorCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9NRU5VSU5ERVggPSAibWVudUluZGV4IjsvLyROT04tTkxTLTEkCisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMX05FVyA9ICJuZXdXaXphcmRzIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCisJCisJcHJpdmF0ZSBNZW51IGZNZW51OworCQorCXByaXZhdGUgU2hlbGwgZldpemFyZFNoZWxsOworCQorCXB1YmxpYyBOZXdFbnRpdHlEcm9wRG93bkFjdGlvbigpIHsKKwkJdGhpcy5mTWVudT0gbnVsbDsKKwkJc2V0TWVudUNyZWF0b3IodGhpcyk7CisJCS8vUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBJSmF2YUhlbHBDb250ZXh0SWRzLk9QRU5fQ0xBU1NfV0laQVJEX0FDVElPTik7CisJfQorCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKHRoaXMuZk1lbnUgIT0gbnVsbCkgeworCQkJdGhpcy5mTWVudS5kaXNwb3NlKCk7CisJCQl0aGlzLmZNZW51PSBudWxsOworCQl9CisJfQorCisJcHVibGljIE1lbnUgZ2V0TWVudShNZW51IHBhcmVudCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgTWVudSBnZXRNZW51KENvbnRyb2wgcGFyZW50KSB7CisJCWlmICh0aGlzLmZNZW51ID09IG51bGwpIHsKKwkJCXRoaXMuZk1lbnUgPSBuZXcgTWVudShwYXJlbnQpOworCQkJT3BlbkpwdFdpemFyZEFjdGlvbltdIGFjdGlvbnMgPSBnZXRBY3Rpb25Gcm9tRGVzY3JpcHRvcnMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykgeworCQkJCU9wZW5KcHRXaXphcmRBY3Rpb24gY3VyciA9IGFjdGlvbnNbaV07CisJCQkJY3Vyci5zZXRTaGVsbCh0aGlzLmZXaXphcmRTaGVsbCk7CisJCQkJQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oY3Vycik7CisJCQkJaXRlbS5maWxsKHRoaXMuZk1lbnUsIC0xKTsJCQkJCisJCQl9CQkJCisJCQorCQl9CisJCXJldHVybiB0aGlzLmZNZW51OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCWdldERlZmF1bHRBY3Rpb24oKS5ydW4oKTsKKwl9CisJCisJcHVibGljIEFjdGlvbiBnZXREZWZhdWx0QWN0aW9uKCkgeworCQlBY3Rpb25bXSBhY3Rpb25zID0gZ2V0QWN0aW9uRnJvbURlc2NyaXB0b3JzKCk7CisJCWlmIChhY3Rpb25zLmxlbmd0aCA+IDApCisJCQlyZXR1cm4gYWN0aW9uc1swXTsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgT3BlbkpwdFdpemFyZEFjdGlvbltdIGdldEFjdGlvbkZyb21EZXNjcmlwdG9ycygpIHsKKwkJQXJyYXlMaXN0PE9wZW5KcHRXaXphcmRBY3Rpb24+IGNvbnRhaW5lcnM9IG5ldyBBcnJheUxpc3Q8T3BlbkpwdFdpemFyZEFjdGlvbj4oKTsKKwkJCisJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoUGxhdGZvcm1VSS5QTFVHSU5fSUQsIFBMX05FVyk7CisJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7CisJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvblBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50PSBlbGVtZW50c1tpXTsKKwkJCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19XSVpBUkQpICYmIGlzSnB0QXJ0aWZhY3RXaXphcmQoZWxlbWVudCkpIHsKKwkJCQkJY29udGFpbmVycy5hZGQobmV3IE9wZW5KcHRXaXphcmRBY3Rpb24oZWxlbWVudCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlPcGVuSnB0V2l6YXJkQWN0aW9uW10gYWN0aW9ucyA9IGNvbnRhaW5lcnMudG9BcnJheShuZXcgT3BlbkpwdFdpemFyZEFjdGlvbltjb250YWluZXJzLnNpemUoKV0pOworCQlBcnJheXMuc29ydChhY3Rpb25zKTsKKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCQkKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSnB0QXJ0aWZhY3RXaXphcmQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2xhc3NFbGVtZW50cz0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfQ0xBU1MpOworCQlpZiAoY2xhc3NFbGVtZW50cy5sZW5ndGggPiAwKSB7CisJCQlmb3IgKGludCBpPSAwOyBpIDwgY2xhc3NFbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHBhcmFtRWxlbWVudHM9IGNsYXNzRWxlbWVudHNbaV0uZ2V0Q2hpbGRyZW4oVEFHX1BBUkFNRVRFUik7CisJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBwYXJhbUVsZW1lbnRzLmxlbmd0aDsgaysrKSB7CisJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjdXJyPSBwYXJhbUVsZW1lbnRzW2tdOworCQkJCQlpZiAoQVRUX0pQVEFSVElGQUNULmVxdWFscyhjdXJyLmdldEF0dHJpYnV0ZShUQUdfTkFNRSkpKSB7CisJCQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGN1cnIuZ2V0QXR0cmlidXRlKFRBR19WQUxVRSkpLmJvb2xlYW5WYWx1ZSgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCQorCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKKwkJZldpemFyZFNoZWxsPSB3aW5kb3cuZ2V0U2hlbGwoKTsKKwl9CisJCisJcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7CisJCXJ1bigpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvQW5ub3RhdGVkRW50aXR5VGVtcGxhdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0Fubm90YXRlZEVudGl0eVRlbXBsYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRmZDA5MQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0Fubm90YXRlZEVudGl0eVRlbXBsYXRlLmphdmEKQEAgLTAsMCArMSwxNjYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIEFubm90YXRlZEVudGl0eVRlbXBsYXRlCit7CisgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIG5sOworICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBBbm5vdGF0ZWRFbnRpdHlUZW1wbGF0ZSBjcmVhdGUoU3RyaW5nIGxpbmVTZXBhcmF0b3IpCisgIHsKKyAgICBubCA9IGxpbmVTZXBhcmF0b3I7CisgICAgQW5ub3RhdGVkRW50aXR5VGVtcGxhdGUgcmVzdWx0ID0gbmV3IEFubm90YXRlZEVudGl0eVRlbXBsYXRlKCk7CisgICAgbmwgPSBudWxsOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgZmluYWwgU3RyaW5nIE5MID0gbmwgPT0gbnVsbCA/IChTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKSA6IG5sOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMSA9ICJwYWNrYWdlICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yID0gIjsiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMyA9IE5MOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNCA9IE5MICsgImltcG9ydCAiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNSA9ICI7IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzYgPSBOTCArIE5MICsgIi8qKiIgKyBOTCArICIgKiBFbnRpdHkgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIEVudGl0eTogIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzcgPSBOTCArICIgKiIgKyBOTCArICIgKi8iOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOCA9IE5MOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOSA9ICIobmFtZT1cIiI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMCA9ICJcIikiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTEgPSBOTCArICJAVGFibGUobmFtZT1cIiI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMiA9ICJcIikiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTMgPSBOTDsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE0ID0gTkwgKyAiQElkQ2xhc3MoIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE1ID0gIi5jbGFzcykiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTYgPSBOTCArICJwdWJsaWMgY2xhc3MgIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE3ID0gIiBleHRlbmRzICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOCA9ICIgaW1wbGVtZW50cyAiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTkgPSAiLCAiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjAgPSAiIHsiICsgTkwgKyAiIiArIE5MICsgIlx0IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIxID0gIiAgICIgKyBOTCArICJcdEBJZCI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMiA9IE5MICsgIlx0cHJpdmF0ZSAiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjMgPSAiICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNCA9ICI7IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI1ID0gTkwgKyAiXHRwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsiICsgTkwgKyAiIiArIE5MICsgIlx0cHVibGljICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNiA9ICIoKSB7IiArIE5MICsgIlx0XHRzdXBlcigpOyIgKyBOTCArICJcdH0iOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjcgPSAiICAgIiArIE5MICsgIlx0QElkICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yOCA9ICIgICAiICsgTkwgKyAiXHRwdWJsaWMgIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI5ID0gIiBnZXQiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzAgPSAiKCkgeyIgKyBOTCArICJcdFx0cmV0dXJuIHRoaXMuIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMxID0gIjsiICsgTkwgKyAiXHR9IiArIE5MICsgIiIgKyBOTCArICJcdHB1YmxpYyB2b2lkIHNldCI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMiA9ICIoIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMzID0gIiAiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzQgPSAiKSB7IiArIE5MICsgIlx0XHR0aGlzLiI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNSA9ICIgPSAiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzYgPSAiOyIgKyBOTCArICJcdH0iOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzcgPSBOTCArICIgICAiICsgTkwgKyAifSI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOCA9IE5MOworCisgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGUoT2JqZWN0IGFyZ3VtZW50KQorICB7CisgICAgZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBtb2RlbCA9IChDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsKSBhcmd1bWVudDsgCitpZiAobW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPW51bGwgJiYgbW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPSIiKSB7IAorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMik7CisgICAgfQorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zKTsKKyAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKGZhbHNlKTsKK2ZvciAoU3RyaW5nIGFuSW1wb3J0IDogaW1wb3J0cykgeyAKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChhbkltcG9ydCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUpOworICAgICB9IAorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldEVudGl0eU5hbWUoKSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzcpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldEFydGlmYWN0VHlwZSgpKTsKKyAgICBTdHJpbmcgRU5USVRZX05BTUUgPSBtb2RlbC5nZXRFbnRpdHlOYW1lKCk7CitpZiAobW9kZWwuaXNFbnRpdHlOYW1lU2V0KCkpIHsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChFTlRJVFlfTkFNRSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEwKTsKKyAgICB9CisgICAgaWYgKG1vZGVsLmlzVGFibGVOYW1lU2V0KCkpIHsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTEpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0VGFibGVOYW1lKCkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMik7CisgICAgfQorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMyk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChtb2RlbC5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworICAgIGlmIChtb2RlbC5pc0NvbXBvc2l0ZVBLKCkpIHsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTQpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0SWRDbGFzc05hbWUoKSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE1KTsKKyAgICB9CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE2KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldENsYXNzTmFtZSgpKTsKKyAgICBTdHJpbmcgc3VwZXJDbGFzcyA9IG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCk7CisJaWYgKCEgIiIuZXF1YWxzKHN1cGVyQ2xhc3MpKSB7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE3KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKHN1cGVyQ2xhc3MpOworICAgIH0KKyAgICAKKwlMaXN0PFN0cmluZz4gaW50ZXJmYWNlcyA9IG1vZGVsLmdldEludGVyZmFjZXMoKTsgCisJaWYgKGludGVyZmFjZXMuc2l6ZSgpPjApIHsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTgpOworICAgICB9CisJZm9yIChpbnQgaT0wOyBpPGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKKyAJCVN0cmluZyBJTlRFUkZBQ0UgPSAoU3RyaW5nKSBpbnRlcmZhY2VzLmdldChpKTsKKwkJaWYgKGk+MCkgeyAKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTkpOworICAgIH0KKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKElOVEVSRkFDRSk7CisgICAgfQorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMCk7CisgICAgIExpc3Q8RW50aXR5Um93PiBmaWVsZHMgPSBtb2RlbC5nZXRFbnRpdHlGaWVsZHMoKTsKKwlMaXN0PFN0cmluZz4gcGtGaWVsZHMgPSBtb2RlbC5nZXRQS0ZpZWxkcygpOyAKKyAJZm9yIChFbnRpdHlSb3cgZW50aXR5IDogZmllbGRzKSB7CisJCVN0cmluZyBOQU1FID0gZW50aXR5LmdldE5hbWUoKTsKKwkJaWYgKHBrRmllbGRzLmNvbnRhaW5zKE5BTUUpICYmIG1vZGVsLmlzRmllbGRBY2Nlc3MoKSkgeworICAgIAorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMSk7CisgICAgfQorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMik7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChlbnRpdHkuZ2V0VHlwZSgpKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjMpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoZW50aXR5LmdldE5hbWUoKSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI0KTsKKyAgICB9CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI1KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldENsYXNzTmFtZSgpKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjYpOworICAgIAorCWZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOworCWlmIChmaWVsZHMgIT0gbnVsbCkgZm9yIChpbnQgaT0wOyBpPGZpZWxkcy5zaXplKCk7IGkrKykgeworCQlFbnRpdHlSb3cgZmllbGQgPSAoRW50aXR5Um93KSBmaWVsZHMuZ2V0KGkpOworCQlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsKKwkJU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7CisJCVN0cmluZyBNRVRIT0QgPSBOQU1FLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBOQU1FLnN1YnN0cmluZygxKTsKKwlpZiAocGtGaWVsZHMuY29udGFpbnMoTkFNRSkgJiYgIW1vZGVsLmlzRmllbGRBY2Nlc3MoKSkgeworICAgIAorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNyk7CisgICAgfQorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yOCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChUWVBFKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTUVUSE9EKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTkFNRSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMxKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE1FVEhPRCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMyKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRZUEUpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMyk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChOQU1FKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzQpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTkFNRSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM1KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE5BTUUpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNik7CisgICAgfQorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNyk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM4KTsKKyAgICByZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eUNsYXNzV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5Q2xhc3NXaXphcmRQYWdlLmphdmEKaW5kZXggMDZhN2VhNi4uOGZhMDUyYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5Q2xhc3NXaXphcmRQYWdlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5Q2xhc3NXaXphcmRQYWdlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDI4ICsxNSwyNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5YbWxNYXBwaW5nRmlsZVZpZXdlckZpbHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC5JRW50aXR5RGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLk5ld0phdmFDbGFzc1dpemFyZFBhZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwpAQCAtNDUsMzAgKzQ0LDI2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKIAogcHVibGljIGNsYXNzIEVudGl0eUNsYXNzV2l6YXJkUGFnZSBleHRlbmRzIE5ld0phdmFDbGFzc1dpemFyZFBhZ2V7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX0ZBQ0VUID0gImpwdC5qcGEiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VYVEVOU0lPTiA9ICIueG1sIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1hNTCA9ICJwZXJzaXN0ZW5jZS54bWwiOy8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX0ZBQ0VUID0gSnB0Q29yZVBsdWdpbi5GQUNFVF9JRDsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9JTkYgPSAiTUVUQS1JTkYiOy8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSAiIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTTEFTSCA9ICcvJzsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0xBU0ggPSAnLyc7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9UQUJMRSA9ICJTSU5HTEVfVEFCTEUiOy8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfUEVSX0NMQVNTID0gIlRBQkxFX1BFUl9DTEFTUyI7Ly8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lORUQgPSAiSk9JTkVEIjsvLyROT04tTkxTLTEkCkBAIC05MSw2ICs4NiwxNCBAQAogCQkJU3RyaW5nIHBhZ2VEZXNjLCBTdHJpbmcgcGFnZVRpdGxlLCBTdHJpbmcgbW9kdWxlVHlwZSkgewogCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHBhZ2VEZXNjLCBwYWdlVGl0bGUsIG1vZHVsZVR5cGUpOwogCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7CisJCXJldHVybiBBcnJheVRvb2xzLmFkZEFsbCgKKwkJCQlzdXBlci5nZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpLCAKKwkJCQluZXcgU3RyaW5nW10ge0lFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9OQU1FLCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5YTUxfU1VQUE9SVH0pOworCX0KIAogCS8qIENyZWF0ZSB0b3AgbGV2ZWwgY29tcG9zaXRlIChjbGFzcyBwcm9wZXJ0aWVzKSBhbmQgYWRkIHRoZSBlbnRpdHkncyBzcGVjaWZpYyBpbmhlcml0YW5jZSBncm91cAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLk5ld0phdmFDbGFzc1dpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQpAQCAtOTgsNiArMTAxLDggQEAKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLmNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7CisJCXRoaXMuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5ORVdfSlBBX0VOVElUWV9FTlRJVFlfQ0xBU1MpOworCQkKIAkJY3JlYXRlSW5oZXJpdGFuY2VDb250cm9sKGNvbXBvc2l0ZSk7CiAJCWluaGVyaXRhbmNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewogCQkJQE92ZXJyaWRlCkBAIC0xMTksMTUgKzEyNCwxMSBAQAogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CiAJCQkJYm9vbGVhbiBpc0NoZWNrZWQgPSB4bWxTdXBwb3J0QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJCW9ybVhtbE5hbWUuc2V0RW5hYmxlZChpc0NoZWNrZWQpOwkKLQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChpc0NoZWNrZWQpOworCQkJCWVuYWJsZU1hcHBpbmdYTUxDaG9vc2VHcm91cChpc0NoZWNrZWQpOwogCQkJCWlmIChpc0ZpcnN0Q2hlY2spIHsKIAkJCQkJb3JtWG1sTmFtZS5zZXRUZXh0KEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7CiAJCQkJCWlzRmlyc3RDaGVjayA9IGZhbHNlOwogCQkJCX0KLQkJCQkvL0Rpc2FibGUgdGhlIGNob29zZSBhbHRlcm5hdGl2ZSBYTUwgOiBzZWUgZW5oYW5jZW1lbnQgcmVxdWVzdCAxNTI0NjEKLQkJCQkvL1RoZSBjcmVhdGlvbiBvZiBhbHRlcm5hdGl2ZSBtYXBwaW5nIGlzIHByb2JsZW1hdGljIAotCQkJCWRpc2FibGVNYXBwaW5nWE1MQ2hvb3NlR3JvdXAoKTsKIAkJCX0KIAkJfSk7CQkKIAkJcmV0dXJuIGNvbXBvc2l0ZTsKQEAgLTI1NSwxMCArMjU2LDggQEAKIAkJCX0KIAkJfSk7CiAJCXN5bmNoSGVscGVyLnN5bmNoVGV4dChvcm1YbWxOYW1lLCBwcm9wZXJ0eSwgLypkZXBlbmRlbnRDb250cm9scyovbnVsbCk7Ci0JCW9ybVhtbE5hbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCS8vRGlzYWJsZSB0aGUgY2hvb3NlIGFsdGVybmF0aXZlIFhNTCA6IHNlZSBlbmhhbmNlbWVudCByZXF1ZXN0IDE1MjQ2MQotCQkvL1RoZSBjcmVhdGlvbiBvZiBhbHRlcm5hdGl2ZSBtYXBwaW5nIGlzIHByb2JsZW1hdGljCi0JCWRpc2FibGVNYXBwaW5nWE1MQ2hvb3NlR3JvdXAoKTsJCQorCQkKKwkJZW5hYmxlTWFwcGluZ1hNTENob29zZUdyb3VwKGZhbHNlKTsJCQogCX0KIAkKIAkvKioKQEAgLTI3MSw3MyArMjcwLDQxIEBACiAJCWlmIChwcm9qZWN0ID09IG51bGwpIHsKIAkJCXJldHVybjsKIAkJfQotCQlJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldERpYWxvZ1NlbGVjdGlvblZhbGlkYXRvcigpOwkJCi0JCVZpZXdlckZpbHRlciBmaWx0ZXIgPSBnZXREaWFsb2dWaWV3ZXJGaWx0ZXIoKTsKKwkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpOworCQlWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gZ2V0RGlhbG9nVmlld2VyRmlsdGVyKGpwYVByb2plY3QpOwogCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCk7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSk7CisJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpOwogCQlTZWxlY3RNYXBwaW5nWE1MRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RNYXBwaW5nWE1MRGlhbG9nKGdldFNoZWxsKCksIGxhYmVsUHJvdmlkZXIsIGNvbnRlbnRQcm92aWRlcik7Ci0JCWRpYWxvZy5zZXRWYWxpZGF0b3IodmFsaWRhdG9yKTsKIAkJZGlhbG9nLnNldFRpdGxlKEVudGl0eVdpemFyZE1zZy5NQVBQSU5HX1hNTF9USVRMRSk7CiAJCWRpYWxvZy5zZXRNZXNzYWdlKEVudGl0eVdpemFyZE1zZy5DSE9PU0VfTUFQUElOR19YTUxfTUVTU0FHRSk7CiAJCWRpYWxvZy5hZGRGaWx0ZXIoZmlsdGVyKTsKLQkJCQkKLQkJSUZpbGUgcm9vdEZvbGRlciA9IHByb2plY3QuZ2V0RmlsZShKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRTb3VyY2VDb250YWluZXJzKHByb2plY3QpWzBdLmdldFJlc291cmNlKCkuZ2V0TmFtZSgpICsgU0xBU0ggKyBvcm1YbWxOYW1lLmdldFRleHQoKS50cmltKCkpOy8vVE9ETyAKLQkJZGlhbG9nLnNldElucHV0KEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldE1hbmlmZXN0RmlsZShwcm9qZWN0KS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSk7CisJCQkKKwkJU3RyaW5nIG9ybUZpbGVOYW1lID0gdGhpcy5vcm1YbWxOYW1lLmdldFRleHQoKTsKKwkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSBqcGFQcm9qZWN0LmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2Uob3JtRmlsZU5hbWUpOworCQlJRmlsZSBpbml0aWFsU2VsZWN0aW9uID0gKHJlc291cmNlICE9IG51bGwpID8gcmVzb3VyY2UuZ2V0RmlsZSgpIDogbnVsbDsKKwkJZGlhbG9nLnNldElucHV0KHByb2plY3QpOwogCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpCi0JCQlkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbihyb290Rm9sZGVyKTsKKwkJaWYgKGluaXRpYWxTZWxlY3Rpb24gIT0gbnVsbCkgeworCQkJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb24oaW5pdGlhbFNlbGVjdGlvbik7CisJCX0KIAkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlvcm1YbWxOYW1lLnNldFRleHQoZGlhbG9nLmdldENob3Nlbk5hbWUoKSk7Ci0JCQltb2RlbC52YWxpZGF0ZVByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9OQU1FKTsKKwkJCXRoaXMub3JtWG1sTmFtZS5zZXRUZXh0KGRpYWxvZy5nZXRDaG9zZW5OYW1lKCkpOworCQkJdGhpcy5tb2RlbC52YWxpZGF0ZVByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9OQU1FKTsKIAkJfQkJCiAJfQogCQogCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBleHRlbmRlZCBieSBzdWJjbGFzc2VzLCBhcyBpdCBkb2VzIHNvbWUgYmFzaWMgdmFsaWRhdGlvbi4gCi0JICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2YgdGhlIFNlbGVjdGlvbiB2YWxpZGF0b3IgZm9yIHRoZSBTZWxlY3RNYXBwaW5nWE1MRGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgZ2V0RGlhbG9nU2VsZWN0aW9uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uWzBdICE9IG51bGwgJiYgIShzZWxlY3Rpb25bMF0gaW5zdGFuY2VvZiBJUHJvamVjdCkpCi0JCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoRW50aXR5V2l6YXJkTXNnLklOQ09SUkVDVF9YTUxfTkFNRSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgogCSAqIFRoaXMgbWV0aG9kIGNyZWF0ZSBmaWx0ZXIgZm9yIHRoZSBicm93c2UvYWRkIGFsdGVybmF0aXZlIG1hcHBpbmcgWE1MIAogCSAqIEByZXR1cm4gbmV3IGluc3RhbmNlIG9mIHZpZXdlciBmaWx0ZXIgZm9yIHRoZSBTZWxlY3RNYXBwaW5nWE1MRGlhbG9nCiAJICovCi0JcHJvdGVjdGVkIFZpZXdlckZpbHRlciBnZXREaWFsb2dWaWV3ZXJGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVCk7Ci0JCQkJCUlGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpZWxlbWVudDsKLQkJCQkJaWYgKGZvbGRlci5jb250YWlucyhKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRNYW5pZmVzdEZpbGUocHJvamVjdCkpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgZWxlbWVudDsKLQkJCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKFhNTF9FWFRFTlNJT04pICYmICFmaWxlLmdldE5hbWUoKS5lcXVhbHMoUEVSU0lTVEVOQ0VfWE1MKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OworCXByb3RlY3RlZCBWaWV3ZXJGaWx0ZXIgZ2V0RGlhbG9nVmlld2VyRmlsdGVyKEpwYVByb2plY3QganBhUHJvamVjdCkgeworCQlyZXR1cm4gbmV3IFhtbE1hcHBpbmdGaWxlVmlld2VyRmlsdGVyKGpwYVByb2plY3QpOwogCX0KIAkKLQlwcml2YXRlIHZvaWQgZGlzYWJsZU1hcHBpbmdYTUxDaG9vc2VHcm91cCgpIHsKLQkJLy9EaXNhYmxlIHRoZSBjaG9vc2UgYWx0ZXJuYXRpdmUgWE1MIDogc2VlIGVuaGFuY2VtZW50IHJlcXVlc3QgMTUyNDYxCi0JCS8vVGhlIGNyZWF0aW9uIG9mIGFsdGVybmF0aXZlIG1hcHBpbmcgaXMgcHJvYmxlbWF0aWMKLQkJZGlzcGxheU5hbWVMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJb3JtWG1sTmFtZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCXByaXZhdGUgdm9pZCBlbmFibGVNYXBwaW5nWE1MQ2hvb3NlR3JvdXAoYm9vbGVhbiBlbmFibGVkKSB7CisJCWRpc3BsYXlOYW1lTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKKwkJb3JtWG1sTmFtZS5zZXRFbmFibGVkKGVuYWJsZWQpOworCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKIAogCX0KIAkKQEAgLTM2NSw0NSArMzMyLDE3IEBACiAJCXJldHVybiAocHJvamVjdC5pc0FjY2Vzc2libGUoKSAmJiBmUHJvamVjdCAhPSBudWxsICYmIGZQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChqcGFGYWNldCkpOwkKIAl9CiAJCi0JcHJpdmF0ZSBjbGFzcyBTZWxlY3RNYXBwaW5nWE1MRGlhbG9nIGV4dGVuZHMgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2d7Ci0JCQotCQlwcml2YXRlIFRleHQgbmV3WG1sTmFtZTsKKwlwcml2YXRlIGNsYXNzIFNlbGVjdE1hcHBpbmdYTUxEaWFsb2cgZXh0ZW5kcyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZworCXsJCiAJCXByaXZhdGUgU3RyaW5nIHhtbE5hbWUgPSBFTVBUWTsKLQkJcHJpdmF0ZSBJU3RhdHVzIGN1cnJlbnRTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBsYXRmb3JtVUkuUExVR0lOX0lELCBJU3RhdHVzLk9LLCBFTVBUWSwgbnVsbCk7CisJCQogCQkKIAkJcHVibGljIFNlbGVjdE1hcHBpbmdYTUxEaWFsb2coU2hlbGwgcGFyZW50LCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKIAkJCXN1cGVyKHBhcmVudCwgbGFiZWxQcm92aWRlciwgY29udGVudFByb3ZpZGVyKTsJCQkKLQkJfQkJCisJCX0KIAkJCi0JICAgIC8qCi0JICAgICAqIEBzZWUgRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlKQotCSAgICAgKi8KLQkgICAgQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCSAgICAJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwkgICAgCQotCQkJTGFiZWwgZmlsZU5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJCWZpbGVOYW1lTGFiZWwuc2V0VGV4dChFbnRpdHlXaXphcmRNc2cuWE1MX05BTUVfVElUTEUpOwotCQkJZmlsZU5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQkJbmV3WG1sTmFtZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJbmV3WG1sTmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsJCQkKLQkJCW5ld1htbE5hbWUuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewkJCQkJCi0JCQkJCXN1cGVyLmtleVJlbGVhc2VkKGUpOwkJCQkJCi0JCQkJCXhtbE5hbWUgPSBuZXdYbWxOYW1lLmdldFRleHQoKTsKLQkJCQkJVHJlZVNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoVHJlZVNlbGVjdGlvbilnZXRUcmVlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7CQotCQkJCQlJUmVzb3VyY2Ugc2VsZWN0ZWRSZXNvdXJjZSA9IChJUmVzb3VyY2Upc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCQlnZXRUcmVlVmlld2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBUcmVlU2VsZWN0aW9uKG5ldyBUcmVlUGF0aChnZXRTZWdtZW50cyhzZWxlY3RlZFJlc291cmNlLmdldFBhcmVudCgpKSkpKTsKLQkJCQkJfQotCQkJCQl1cGRhdGVPS1N0YXR1cygpOwotCQkJCX0KLQkJCQkKLQkJCX0pOwkJCQotCSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLQkgICAgfQkJCi0JICAgIAotCSAgICAvKioKKwkJCisJCS8qKgogCSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhbHRlcm5hdGl2ZSBtYXBwaW5nIFhNTAogCSAgICAgKi8KIAkgICAgcHVibGljIFN0cmluZyBnZXRDaG9zZW5OYW1lKCkgewpAQCAtNDI2LDIwICszNjUsMTQgQEAKIAkgICAgICovCiAJCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9LU3RhdHVzKCkgewogCQkJc3VwZXIudXBkYXRlT0tTdGF0dXMoKTsKLQkJCVRyZWVTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFRyZWVTZWxlY3Rpb24pZ2V0VHJlZVZpZXdlcigpLmdldFNlbGVjdGlvbigpOwkKLQkJCUlSZXNvdXJjZSBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSlzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7CisJCQlUcmVlU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChUcmVlU2VsZWN0aW9uKWdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKKwkJCUlSZXNvdXJjZSBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwogCQkJaWYgKHNlbGVjdGVkUmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpc2VsZWN0ZWRSZXNvdXJjZTsKLQkJCQl4bWxOYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCQkJbmV3WG1sTmFtZS5zZXRUZXh0KHhtbE5hbWUpOwkJCQkJCQkJCQkJCQotCQkJCWN1cnJlbnRTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBsYXRmb3JtVUkuUExVR0lOX0lELCBJU3RhdHVzLk9LLCBFTVBUWSwgbnVsbCk7CQkJCQorCQkJCXVwZGF0ZVN0YXR1cyhuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgIiIpKTsKIAkJCX0KLQkJCWlmICgheG1sTmFtZS5lbmRzV2l0aChYTUxfRVhURU5TSU9OKSkgewotCQkJCWN1cnJlbnRTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBsYXRmb3JtVUkuUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBFbnRpdHlXaXphcmRNc2cuSU5DT1JSRUNUX1hNTF9OQU1FLCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3VycmVudFN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUGxhdGZvcm1VSS5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIEVNUFRZLCBudWxsKTsKLQkJCX0JCQotCQkJdXBkYXRlU3RhdHVzKGN1cnJlbnRTdGF0dXMpOwkgICAgCisJCQllbHNlIHsKKwkJCQl1cGRhdGVTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsICIiKSk7CisJCQl9CiAJCX0KIAkJCiAJCS8qKiAKQEAgLTQ1MiwyMCArMzg1LDkgQEAKIAkJCW91dHB1dCA9IG91dHB1dC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgU0xBU0gpOwogCQkJcmV0dXJuIG91dHB1dDsKIAkJfQotCQkKLQkJLyoqCi0JCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCBwdXJwb3NlcyBvbmx5LiBJdCBpcyBpbnRlbmRlZCB0byBjcmVhdGUgY29ycmVjdAotCQkgKiBzZWxlY3Rpb24gb2YgdGhlIHJlc291cmNlIHJlc291cmNlCi0JCSAqIEBwYXJhbSByZXNvdXJjZQotCQkgKiBAcmV0dXJuIHRoZSBzZWdtZW50cyBvZiB0aGUgcmVzb3VyY2UKLQkJICovCi0JCXByaXZhdGUgT2JqZWN0W10gZ2V0U2VnbWVudHMoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQlPYmplY3RbXSBzZWdtZW50cyA9IG5ldyBPYmplY3RbcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS5zZWdtZW50cygpLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gc2VnbWVudHMubGVuZ3RoIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlzZWdtZW50c1tpXSA9IHJlc291cmNlOwotCQkJCXJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc2VnbWVudHM7Ci0JCX0JICAgIAotCX0JCisJfQorCQorCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgeworCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7CisJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5RmllbGRzV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5RmllbGRzV2l6YXJkUGFnZS5qYXZhCmluZGV4IDNjZjMwMWUuLjdlM2IxNWUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eUZpZWxkc1dpemFyZFBhZ2UuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlGaWVsZHNXaXphcmRQYWdlLmphdmEKQEAgLTEzLDYgKzEzLDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC5JRW50aXR5RGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKQEAgLTI0LDYgKzI1LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwpAQCAtNTMsNyArNTYsOCBAQAogCSAqLwogCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFlfRklFTERTfTsKKwkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFlfRklFTERTLCAKKwkJCQkJCQlJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5QS19GSUVMRFN9OwogCX0KIAkKIAkvKiBDcmVhdGUgdGhlIG1haW4gY29tcG9zaXRlIGFuZCBhZGQgdG8gaXQgdGhlIGVudGl0eSBwcm9wZXJ0aWVzCkBAIC02Myw2ICs2Nyw4IEBACiAJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7CiAJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwogCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOworCQl0aGlzLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9FTlRJVFlfRU5USVRZX1BST1BFUlRJRVMpOworCQkKIAkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwogCQlkYXRhLndpZHRoSGludCA9IDMwMDsKIAkJZGF0YS5oZWlnaHRIaW50ID0gNDUwOwpAQCAtNzYsNyArODIsNyBAQAogCQl0YWJsZU5hbWVUZXh0LnNldEVuYWJsZWQoIXRhYmxlTmFtZUNoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKIAkJaXNCdXR0b25zQ3JlYXRlZCA9IHRydWU7CiAJCWluaXROYW1lR3JvdXAoKTsKLQkJRW50aXR5Um93VGFibGVXaXphcmRTZWN0aW9uIGluaXRTZWN0aW9uID0gbmV3IEVudGl0eVJvd1RhYmxlV2l6YXJkU2VjdGlvbihjb21wb3NpdGUsIG1vZGVsLCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFlfRklFTERTKTsKKwkJY3JlYXRlRW50aXR5RmllbGRzR3JvdXAoY29tcG9zaXRlKTsKIAogCQlHcm91cCBhY2Nlc3NUeXBlR3JvdXAgPSBjcmVhdGVHcm91cChjb21wb3NpdGUsIEVudGl0eVdpemFyZE1zZy5BQ0NFU1NfVFlQRSk7CiAJCWZpZWxkQWNjZXNzQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oYWNjZXNzVHlwZUdyb3VwLCBFbnRpdHlXaXphcmRNc2cuRklFTERfQkFTRUQsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkZJRUxEX0FDQ0VTU19UWVBFKTsKQEAgLTEwMiw3ICsxMDgsMTcgQEAKIAkJfQogCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKIAl9Ci0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbnRpdHlGaWVsZHNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7CisJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwkJCisJCUdyaWREYXRhIGdyb3VwR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJZ3JvdXBHcmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7CisJCWdyb3VwLnNldExheW91dERhdGEoZ3JvdXBHcmlkRGF0YSk7CisJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOworCQlncm91cC5zZXRUZXh0KEVudGl0eVdpemFyZE1zZy5FTlRJVFlfRklFTERTX0dST1VQKTsKKwkJbmV3IEVudGl0eVJvd1RhYmxlV2l6YXJkU2VjdGlvbihncm91cCwgbW9kZWwsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVElUWV9GSUVMRFMpOworCX0KKwkKIAkvKioKIAkgKiBDcmVhdGUgbmFtZWQgZ3JvdXAKIAkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZQpAQCAtMjA4LDcgKzIyNCwxMSBAQAogCQkJdGFibGVOYW1lQ2hlY2tCdXR0b24uc2V0RW5hYmxlZCghaXNOb25FbnRpdHkpOwogCQkJdGFibGVOYW1lVGV4dC5zZXRFbmFibGVkKCF0YWJsZU5hbWVDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7CiAJCX0JCQotCX0JCisJfQorCQorCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgeworCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7CisJfQogfQogCiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVJvd1RhYmxlV2l6YXJkU2VjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5Um93VGFibGVXaXphcmRTZWN0aW9uLmphdmEKaW5kZXggYmQ3MjVmOC4uNzlhMTJhYyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5Um93VGFibGVXaXphcmRTZWN0aW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5Um93VGFibGVXaXphcmRTZWN0aW9uLmphdmEKQEAgLTE1LDEzICsxNSwyMyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5kaWFsb2dzLkZpbHRlcmVkVHlwZXNTZWxlY3Rpb25EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTdHJva2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5QYXJzZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuQ29udGVudFByb3Bvc2FsQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5JQ29udGVudFByb3Bvc2FsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuU2ltcGxlQ29udGVudFByb3Bvc2FsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuVGV4dENvbnRlbnRBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwpAQCAtMzcsNiArNDcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuRW50aXR5Um93OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLklFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwpAQCAtNTQsMTQgKzY1LDE1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKIAogLyoqCkBAIC03NSwxMyArODcsNDIgQEAKIAkvKioKIAkgKiBUaGUgcG9zc2libGUgZW50aXR5IHR5cGVzLCBtZW50aW9uZWQgaW4gdGhlIHNwZWNpZmljYXRpb24gKENoYXB0ZXIgMi4xLjEgUGVyc2lzdGVudCBGaWVsZHMgYW5kIFByb3BlcnRpZXMgcC4yMCkKIAkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZ1tdIFZBTElEX1RZUEVTID0geyJpbnQiLCAibG9uZyIsICJzaG9ydCIsICJjaGFyIiwgImJvb2xlYW4iLCAiYnl0ZSIsICJkb3VibGUiLCAiZmxvYXQiLCAiamF2YS5sYW5nLlN0cmluZyIsCi0JCSJieXRlW10iLCAiY2hhcltdIiwJImphdmEubGFuZy5CeXRlW10iLCAiamF2YS5sYW5nLkNoYXJhY3RlcltdIiwgImphdmEubWF0aC5CaWdEZWNpbWFsIiwgImphdmEubWF0aC5CaWdJbnRlZ2VyIiwgImphdmEuc3FsLkRhdGUiLCAiamF2YS5zcWwuVGltZSIsICJqYXZhLnNxbC5UaW1lc3RhbXAiLAotCQkiamF2YS51dGlsLkRhdGUiLCAiamF2YS51dGlsLkNhbGVuZGFyIn07CisJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBWQUxJRF9UWVBFUyA9IHsiaW50IiwgCisJCQkJCQkJCQkJCQkgICAibG9uZyIsIAorCQkJCQkJCQkJCQkJICAgInNob3J0IiwgCisJCQkJCQkJCQkJCQkgICAiY2hhciIsIAorCQkJCQkJCQkJCQkJICAgImJvb2xlYW4iLCAKKwkJCQkJCQkJCQkJCSAgICJieXRlIiwgCisJCQkJCQkJCQkJCQkgICAiZG91YmxlIiwgCisJCQkJCQkJCQkJCQkgICAiZmxvYXQiLCAKKwkJCQkJCQkJCQkJCSAgICJqYXZhLmxhbmcuU3RyaW5nIiwgCisJCQkJCQkJCQkJCQkgICAiamF2YS5sYW5nLkludGVnZXIiLCAKKwkJCQkJCQkJCQkJCSAgICJqYXZhLmxhbmcuTG9uZyIsIAorCQkJCQkJCQkJCQkJICAgImphdmEubGFuZy5TaG9ydCIsCisJCQkJCQkJCQkJCQkgICAiamF2YS5sYW5nLkNoYXJhY3RlciIsIAorCQkJCQkJCQkJCQkJICAgImphdmEubGFuZy5Cb29sZWFuIiwgCisJCQkJCQkJCQkJCQkgICAiamF2YS5sYW5nLkJ5dGUiLCAKKwkJCQkJCQkJCQkJCSAgICJqYXZhLmxhbmcuRG91YmxlIiwgCisJCQkJCQkJCQkJCQkgICAiamF2YS5sYW5nLkZsb2F0IiwgCisJCQkJCQkJCQkJCQkgICAiamF2YS5tYXRoLkJpZ0RlY2ltYWwiLCAKKwkJCQkJCQkJCQkJCSAgICJqYXZhLm1hdGguQmlnSW50ZWdlciIsIAorCQkJCQkJCQkJCQkJICAgImphdmEudXRpbC5EYXRlIiwgCisJCQkJCQkJCQkJCQkgICAiamF2YS51dGlsLkNhbGVuZGFyIiwKKwkJCQkJCQkJCQkJCSAgICJqYXZhLnNxbC5EYXRlIiwgCisJCQkJCQkJCQkJCQkgICAiamF2YS5zcWwuVGltZSIsIAorCQkJCQkJCQkJCQkJICAgImphdmEuc3FsLlRpbWVzdGFtcCIsCisJCQkJCQkJCQkJCQkgICAiU3RyaW5nIiwgCisJCQkJCQkJCQkJCQkgICAiSW50ZWdlciIsIAorCQkJCQkJCQkJCQkJICAgIkxvbmciLCAKKwkJCQkJCQkJCQkJCSAgICJTaG9ydCIsCisJCQkJCQkJCQkJCQkgICAiQ2hhcmFjdGVyIiwgCisJCQkJCQkJCQkJCQkgICAiQm9vbGVhbiIsIAorCQkJCQkJCQkJCQkJICAgIkJ5dGUiLCAKKwkJCQkJCQkJCQkJCSAgICJEb3VibGUiLCAKKwkJCQkJCQkJCQkJCSAgICJGbG9hdCIgfTsJCiAJCiAJICBwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgbVRhYmxlVmlld2VyID0gbnVsbDsKIAkgIHByaXZhdGUgVGFibGUgbVRhYmxlV2lkZ2V0ID0gbnVsbDsKLQkgIHByaXZhdGUgZmluYWwgaW50IFBLX0NPTFVNTiA9IDA7CiAJICBwcml2YXRlIGZpbmFsIGludCBOQU1FX0NPTFVNTiA9IDE7CiAJICBwcml2YXRlIGZpbmFsIGludCBUWVBFX0NPTFVNTiA9IDI7CiAJCkBAIC05MSwxMyArMTMyLDIxIEBACiAJcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwogCXByaXZhdGUgQnV0dG9uIGVkaXRCdXR0b247CiAJcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOwotCXByaXZhdGUgU3RyaW5nIHRpdGxlID0gRW50aXR5V2l6YXJkTXNnLkVOVElUWV9GSUVMRFM7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBsYWJlbHNGb3JDb21ibyA9IFZBTElEX1RZUEVTOworCXByaXZhdGUgU3RyaW5nIHRpdGxlID0gRW50aXR5V2l6YXJkTXNnLkVOVElUWV9GSUVMRFNfRElBTE9HX1RJVExFOworCXByaXZhdGUgU3RyaW5nW10gdHlwZVByb3Bvc2FscyA9IFZBTElEX1RZUEVTOwogCXByaXZhdGUgU3RyaW5nW10gbGFiZWxzRm9yVGV4dCA9IG5ldyBTdHJpbmdbXXtFbnRpdHlXaXphcmRNc2cuVFlQRV9URVhUX0ZJRUxELCBFbnRpdHlXaXphcmRNc2cuTkFNRV9URVhUX0ZJRUxEfTsKIAlwcml2YXRlIElEYXRhTW9kZWwgbW9kZWw7CiAJcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlOYW1lOwogCXByaXZhdGUgSW1hZ2UgbGFiZWxQcm92aWRlckltYWdlID0gbnVsbDsKIAlwcml2YXRlIERpYWxvZ0NhbGxiYWNrIGNhbGxiYWNrOwkKKwlwcml2YXRlIHN0YXRpYyBLZXlTdHJva2Uga3MgPSBudWxsOworCXN0YXRpYyB7CisJCXRyeSB7CisJCQlrcyA9IEtleVN0cm9rZS5nZXRJbnN0YW5jZSgiQ3RybCtTcGFjZSIpOwkJCQorCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlMSkgeworCQkJSnB0VWlQbHVnaW4ubG9nKGUxKTsKKwkJfSAKKwl9CiAKIAogCS8qKgpAQCAtMTE2LDE4ICsxNjUsMTIgQEAKIAkJdGhpcy5zZXRMYXlvdXQobGF5b3V0KTsKIAkJdGhpcy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKIAotCQlMYWJlbCB0aXRsZUxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5MRUZUKTsKLQkJdGl0bGVMYWJlbC5zZXRUZXh0KHRpdGxlKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGl0bGVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCiAJCW1UYWJsZVdpZGdldCA9IG5ldyBUYWJsZSh0aGlzLCBTV1QuQ0hFQ0sgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKICAgICAgICAgbVRhYmxlV2lkZ2V0LnNldEhlYWRlclZpc2libGUodHJ1ZSk7CiAgICAgICAgIG1UYWJsZVdpZGdldC5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7CiAKICAgICAgICAgbVRhYmxlVmlld2VyID0gbmV3IENoZWNrYm94VGFibGVWaWV3ZXIobVRhYmxlV2lkZ2V0KTsKLSAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CiAgICAgICAgIGRhdGEudmVydGljYWxTcGFuID0gMjsKIAkJbVRhYmxlV2lkZ2V0LnNldExheW91dERhdGEoZGF0YSk7CiAJCW1UYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEVudGl0eVJvd0NvbnRlbnRQcm92aWRlcigpKTsKQEAgLTI2MSwxNiArMzA0LDEzIEBACiAJICogYWRkIG5ldyBlbnRpdHkgZmllbGQKIAkgKi8KIAlwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCUFkZEZpZWxkRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRGaWVsZERpYWxvZyhnZXRTaGVsbCgpLCB0aXRsZSwgbGFiZWxzRm9yQ29tYm8sIGxhYmVsc0ZvclRleHQpOworCQlBZGRGaWVsZERpYWxvZyBkaWFsb2cgPSBuZXcgQWRkRmllbGREaWFsb2coZ2V0U2hlbGwoKSwgdGl0bGUsIHR5cGVQcm9wb3NhbHMsIGxhYmVsc0ZvclRleHQpOwogCQlpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKIAkJaWYgKHJlc3VsdCA9PSBXaW5kb3cuQ0FOQ0VMKSB7CiAJCQlyZXR1cm47CiAJCX0KIAkJRW50aXR5Um93IGVudGl0eVJvdyA9IGRpYWxvZy5nZXRFbnRpdHlSb3coKTsKIAkJYWRkRW50aXR5Um93KGVudGl0eVJvdyk7Ci0JCWlmICghZW50aXR5Um93LmNvdWxkQmVLZXkoKSkgewotCQkJbVRhYmxlVmlld2VyLnNldEdyYXllZChlbnRpdHlSb3csIHRydWUpOwotCQl9CQkKIAl9CiAJCiAJLyoqCkBAIC0zMDUsMTggKzM0NSwxMyBAQAogCQlpbnQgaW5kZXggPSBtVGFibGVXaWRnZXQuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKIAkJYm9vbGVhbiBpc0NoZWNrZWQgPSBtVGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZChlbnRpdHlGb3JFZGl0KTsKIAkJCi0JCUVkaXRGaWVsZERpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdEZpZWxkRGlhbG9nKGdldFNoZWxsKCksIHRpdGxlLCBsYWJlbHNGb3JDb21ibywgbGFiZWxzRm9yVGV4dCwgZW50aXR5Rm9yRWRpdCk7CisJCUVkaXRGaWVsZERpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdEZpZWxkRGlhbG9nKGdldFNoZWxsKCksIHRpdGxlLCB0eXBlUHJvcG9zYWxzLCBsYWJlbHNGb3JUZXh0LCBlbnRpdHlGb3JFZGl0KTsKIAkJZGlhbG9nLm9wZW4oKTsKIAkJRW50aXR5Um93IGVudGl0eVJvdyA9IGRpYWxvZy5nZXRFbnRpdHlSb3coKTsKIAkJaWYgKGVudGl0eVJvdyAhPSBudWxsKSB7CQkJCiAJCQllZGl0RW50aXR5Um93KGluZGV4LCBlbnRpdHlSb3cpOwogCQkJbVRhYmxlVmlld2VyLnNldENoZWNrZWQoZW50aXR5Um93LCBpc0NoZWNrZWQpOwotCQkJaWYgKCFlbnRpdHlSb3cuY291bGRCZUtleSgpKSB7Ci0JCQkJbVRhYmxlVmlld2VyLnNldENoZWNrZWQoZW50aXR5Um93LCBmYWxzZSk7Ci0JCQkJbVRhYmxlVmlld2VyLnNldEdyYXllZChlbnRpdHlSb3csIHRydWUpOwotCQkJfSBlbHNlIHsJCQkJCi0JCQkJbVRhYmxlVmlld2VyLnNldEdyYXllZChlbnRpdHlSb3csIGZhbHNlKTsKLQkJCX0KKwkJCW1UYWJsZVZpZXdlci5zZXRHcmF5ZWQoZW50aXR5Um93LCBmYWxzZSk7CiAJCX0KIAl9CiAJCkBAIC00MjMsMTEgKzQ1OCw5IEBACiAJCQkJcmV0dXJuIGVudGl0eS5nZXROYW1lKCk7CiAJCQl9CiAJCQlpZiAoY29sdW1uSW5kZXggPT0gVFlQRV9DT0xVTU4pIHsKLQkJCQlyZXR1cm4gZW50aXR5LmdldFR5cGUoKTsKKwkJCQlyZXR1cm4gZW50aXR5LmdldEZxblR5cGVOYW1lKCk7CiAJCQl9CQkKLQkJCWlmIChlbnRpdHkuY291bGRCZUtleSgpKSB7Ci0JCQkJbVRhYmxlVmlld2VyLnNldENoZWNrZWQoZW50aXR5LCBlbnRpdHkuaXNLZXkoKSk7Ci0JCQl9IAorCQkJbVRhYmxlVmlld2VyLnNldENoZWNrZWQoZW50aXR5LCBlbnRpdHkuaXNLZXkoKSk7CiAJCQlyZXR1cm4gIiI7CiAJCX0KIApAQCAtNDU0LDE3ICs0ODcsMTYgQEAKIAlwcml2YXRlIGNsYXNzIFBLRmllbGRDaGVja1N0YXRlTGlzdGVuZXIgaW1wbGVtZW50cyBJQ2hlY2tTdGF0ZUxpc3RlbmVyIHsKIAogCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlPYmplY3RbXSBjaGVja2VkRWxlbWVudHMgPSBtVGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7CiAJCQlMaXN0PFN0cmluZz4gcGtGaWVsZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWZvciAoT2JqZWN0IG9iamVjdCA6IGNoZWNrZWRFbGVtZW50cykgewotCQkJCUVudGl0eVJvdyBlbnRpdHkgPSAoRW50aXR5Um93KW9iamVjdDsKLQkJCQlpZiAoZW50aXR5LmNvdWxkQmVLZXkoKSkgewkJCQkJCi0JCQkJCXBrRmllbGRzLmFkZChlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQltVGFibGVWaWV3ZXIuc2V0Q2hlY2tlZChlbnRpdHksIGZhbHNlKTsKLQkJCQl9Ci0JCQl9CQkJCi0JCQltb2RlbC5zZXRQcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5QS19GSUVMRFMsIHBrRmllbGRzKTsJCQkKKwkgICAgICAgIFRhYmxlSXRlbVtdIGNoaWxkcmVuID0gbVRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKKwkgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IGNoaWxkcmVuW2ldOworCSAgICAgICAgICAgIEVudGl0eVJvdyBlbnRpdHlSb3cgPSAoRW50aXR5Um93KWl0ZW0uZ2V0RGF0YSgpOyAKKwkgICAgICAgICAgICBlbnRpdHlSb3cuc2V0S2V5KGl0ZW0uZ2V0Q2hlY2tlZCgpKTsKKwkJCQlpZiAoaXRlbS5nZXRDaGVja2VkKCkpCisJCQkJCXBrRmllbGRzLmFkZChlbnRpdHlSb3cuZ2V0TmFtZSgpKTsKKwkgICAgICAgIH0KKwkgICAgICAgIG1vZGVsLnNldFByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlBLX0ZJRUxEUywgcGtGaWVsZHMpOwogCQl9CiAJCQogCX0KQEAgLTQ4NSw3ICs1MTcsNyBAQAogCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZXMgaW4gdGhlIHRleHQgZmllbGRzIGFyZSAKIAkJICogICAgICAgICB2YWxpZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4JIAogCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoQ29tYm8gY29tYm8sIFRleHRbXSB0ZXh0cyk7CisJCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKFRleHQgdHlwZSwgVGV4dFtdIHRleHRzKTsKIAkJCiAJCS8qKgogCQkgKiBSZXRyaWV2ZXMgdGhlIGVudGl0eSBwcmVzZW50YXRpb24gb2JqZWN0IGZyb20gdGhlIGZpZWxkcyBvZiB0aGUgZGlhbG9nLiAKQEAgLTQ5Nyw3ICs1MjksNyBAQAogCQkgKiBAcGFyYW0gdGV4dHMJdGhlIG5hbWUgb2YgdGhlIGVudGl0eSBmaWVsZAkKIAkJICogQHJldHVybiB0aGUgZW50aXR5IHByZXNlbnRhdGlvbiBvYmplY3QgcmV0cmlldmVkIGZyb20gdGhlIGRpYWxvZwogCQkgKi8KLQkJcHVibGljIEVudGl0eVJvdyByZXRyaWV2ZVJlc3VsdFN0cmluZ3MoQ29tYm8gY29tYm8sIFRleHRbXSB0ZXh0cyk7CisJCXB1YmxpYyBFbnRpdHlSb3cgcmV0cmlldmVSZXN1bHRTdHJpbmdzKFRleHQgdHlwZSwgVGV4dFtdIHRleHRzKTsKIAkJCiAJfQogCQpAQCAtNTEwLDkgKzU0MiwxOCBAQAogCQkvKioKIAkJICogVGhlIGZpcnN0IHRleHQgZmllbGQgc2hvdWxkIG5vdCBiZSBlbXB0eS4gCiAJCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShDb21ibyBjb21ibywgVGV4dFtdIHRleHRzKSB7CisJCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKFRleHQgdHlwZSwgVGV4dFtdIHRleHRzKSB7CiAJCQlpZiAodGV4dHMubGVuZ3RoID4gMCkgewotCQkJCXJldHVybiB0ZXh0c1swXS5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMDsKKwkJCQlJU3RhdHVzIHZhbGlkYXRlRmllbGROYW1lU3RhdHVzID0gSmF2YUNvbnZlbnRpb25zCisJCQkJCQkudmFsaWRhdGVGaWVsZE5hbWUodGV4dHNbMF0uZ2V0VGV4dCgpLAorCQkJCQkJCQlKYXZhQ29yZS5WRVJTSU9OXzFfNSwKKwkJCQkJCQkJSmF2YUNvcmUuVkVSU0lPTl8xXzUpOworCQkJCWlmICghdmFsaWRhdGVGaWVsZE5hbWVTdGF0dXMuaXNPSygpKSB7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQlpZiAodHlwZS5nZXRUZXh0KCkuZXF1YWxzKCIiKSkgeworCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAkJCXJldHVybiB0cnVlOwogCQl9CkBAIC01MjIsOSArNTYzLDkgQEAKIAkJICogZW50aXR5IGZpZWxkIHByZXNlbnRhdGlvbgogCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLkVudGl0eVJvdwogCQkgKi8KLQkJcHVibGljIEVudGl0eVJvdyByZXRyaWV2ZVJlc3VsdFN0cmluZ3MoQ29tYm8gY29tYm8sIFRleHRbXSB0ZXh0cykgeworCQlwdWJsaWMgRW50aXR5Um93IHJldHJpZXZlUmVzdWx0U3RyaW5ncyhUZXh0IHR5cGUsIFRleHRbXSB0ZXh0cykgewogCQkJRW50aXR5Um93IGVudGl0eSA9IG5ldyBFbnRpdHlSb3coKTsJCQkKLQkJCWVudGl0eS5zZXRGcW5UeXBlTmFtZShjb21iby5nZXRUZXh0KCkpOworCQkJZW50aXR5LnNldEZxblR5cGVOYW1lKHR5cGUuZ2V0VGV4dCgpKTsKIAkJCWVudGl0eS5zZXROYW1lKHRleHRzWzBdLmdldFRleHQoKSk7CiAJCQlyZXR1cm4gZW50aXR5OwogCQl9CkBAIC01MzcsMjMgKzU3OCwyNCBAQAogCSAqLwogCXByaXZhdGUgY2xhc3MgQWRkRmllbGREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIgewogCQlwcm90ZWN0ZWQgU3RyaW5nIHdpbmRvd1RpdGxlOwotCQlwcm90ZWN0ZWQgU3RyaW5nW10gbGFiZWxzRm9yQ29tYm87CisJCXByb3RlY3RlZCBTdHJpbmdbXSB0eXBlUHJvcG9zYWxzOwogCQlwcm90ZWN0ZWQgU3RyaW5nW10gbGFiZWxzRm9yVGV4dDsKIAkJcHJvdGVjdGVkIFRleHRbXSB0ZXh0czsJCQogCQlwcm90ZWN0ZWQgRW50aXR5Um93IGVudGl0eVJvdzsKLQkJcHJvdGVjdGVkIENvbWJvIGNvbWJvOworCQlwcm90ZWN0ZWQgVGV4dCBhdHRyaWJ1dGVUeXBlOworCQlwcm90ZWN0ZWQgQ29udGVudFByb3Bvc2FsQWRhcHRlciBjb250ZW50UHJvcG9zYWxBZGFwdGVyOyAJCQogCQkKIAkJLyoqCiAJCSAqIENvbnN0cnVjdHMgQWRkRmllbGREaWFsb2cKIAkJICogQHBhcmFtIHNoZWxsCiAJCSAqIEBwYXJhbSB3aW5kb3dUaXRsZSBkaWFsb2cgbGFiZWwKLQkJICogQHBhcmFtIGxhYmVsc0ZvckNvbWJvIHRoZSBlbGVtZW50cyBmb3IgdGhlIGNvbWJvCisJCSAqIEBwYXJhbSB0eXBlUHJvcG9zYWxzIHRoZSBlbGVtZW50cyBmb3IgdGhlIGNvbWJvCiAJCSAqIEBwYXJhbSBsYWJlbHNGb3JUZXh0IG5hbWUgdGV4dAogCQkgKi8KLQkJcHVibGljIEFkZEZpZWxkRGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgd2luZG93VGl0bGUsIFN0cmluZ1tdIGxhYmVsc0ZvckNvbWJvLCBTdHJpbmdbXSBsYWJlbHNGb3JUZXh0KSB7CisJCXB1YmxpYyBBZGRGaWVsZERpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIHdpbmRvd1RpdGxlLCBTdHJpbmdbXSB0eXBlUHJvcG9zYWxzLCBTdHJpbmdbXSBsYWJlbHNGb3JUZXh0KSB7CiAJCQlzdXBlcihzaGVsbCk7CiAJCQl0aGlzLndpbmRvd1RpdGxlID0gd2luZG93VGl0bGU7Ci0JCQl0aGlzLmxhYmVsc0ZvckNvbWJvID0gbGFiZWxzRm9yQ29tYm87CisJCQl0aGlzLnR5cGVQcm9wb3NhbHMgPSB0eXBlUHJvcG9zYWxzOwogCQkJdGhpcy5sYWJlbHNGb3JUZXh0ICA9IGxhYmVsc0ZvclRleHQ7CiAJCX0KIAkJCkBAIC01ODAsMTEgKzYyMiwxMSBAQAogCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKIAkJCQogCQkJCi0JCQljb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsvLyB8IFNXVC5SRUFEX09OTFkpOwkJCQotCQkJY29tYm8uc2V0SXRlbXMobGFiZWxzRm9yQ29tYm8pOworCQkJYXR0cmlidXRlVHlwZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOy8vIHwgU1dULlJFQURfT05MWSk7CQkKKwkJCS8vY29tYm8uc2V0SXRlbXMobGFiZWxzRm9yQ29tYm8pOwogCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwogCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CQkJCi0JCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkJYXR0cmlidXRlVHlwZS5zZXRMYXlvdXREYXRhKGRhdGEpOwogCQkJCiAJCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKIAkJCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEVudGl0eVdpemFyZE1zZy5CUk9XU0VfQlVUVE9OX0xBQkVMKTsKQEAgLTYwOSwxOSArNjUxLDM1IEBACiAJCQkJbGFiZWxJLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7CiAJCQkJdGV4dHNbaS0xXSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwogCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCQlkYXRhLndpZHRoSGludCA9IDEwMDsKKwkJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsJCQogCQkJCXRleHRzW2ktMV0uc2V0TGF5b3V0RGF0YShkYXRhKTsKIAkJCX0KIAotCQkJY29tYm8uc2V0Rm9jdXMoKTsKKwkJCWF0dHJpYnV0ZVR5cGUuc2V0Rm9jdXMoKTsKIAkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKKwkJCWNyZWF0ZUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyKCk7CQkJCiAJCQlyZXR1cm4gY29tcG9zaXRlOwogCQl9CisJCQorCQlwcml2YXRlIElDb250ZW50UHJvcG9zYWxQcm92aWRlciBjcmVhdGVDb250ZW50UHJvcG9zYWxQcm92aWRlcigpIHsKKwkJCVNpbXBsZUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyIGNvbnRQcm92aWRlciA9IG5ldyBTaW1wbGVDb250ZW50UHJvcG9zYWxQcm92aWRlcih0eXBlUHJvcG9zYWxzKTsKKwkJCWNvbnRQcm92aWRlci5zZXRGaWx0ZXJpbmcodHJ1ZSk7CisJCQkKKwkJCWNvbnRlbnRQcm9wb3NhbEFkYXB0ZXIgPSBuZXcgQ29udGVudFByb3Bvc2FsQWRhcHRlcigKKwkJCQkJYXR0cmlidXRlVHlwZSwKKwkJCQkJbmV3IFRleHRDb250ZW50QWRhcHRlcigpLCAKKwkJCQkJY29udFByb3ZpZGVyLAorCQkJCQlrcywKKwkJCQkJbmV3IGNoYXJbXSB7J2InLCAnYycsICdkJywgJ2knLCAnZicsICdsJywgJ3MnLCAnaicsICdCJywgJ0MnLCAnRCcsICdGJywgJ1MnLCAnTCcsICdJJ30pOworCQkJY29udGVudFByb3Bvc2FsQWRhcHRlci5zZXRFbmFibGVkKHRydWUpOworCQkJY29udGVudFByb3Bvc2FsQWRhcHRlci5zZXRQcm9wb3NhbEFjY2VwdGFuY2VTdHlsZShDb250ZW50UHJvcG9zYWxBZGFwdGVyLlBST1BPU0FMX1JFUExBQ0UpOworCQkJcmV0dXJuIGNvbnRQcm92aWRlcjsKKwkJfQorCQkKIAogCQkvKioKIAkJICogUHJvY2VzcyBicm93c2luZyB3aGVuIHRoZSBCcm93c2UuLi4gYnV0dG9uIGhhdmUgYmVlbiBwcmVzc2VkLiBBbGxvdyBhZGRpbmcgb2YgZW50aXR5IGZpZWxkCiAJCSAqIHdpdGggYXJiaXRyYXJ5IHR5cGUuCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmRpYWxvZ3MuRmlsdGVyZWRUeXBlc1NlbGVjdGlvbkRpYWxvZwogCQkgKi8KIAkJcHJpdmF0ZSB2b2lkIGhhbmRsZUNob29zZUVudGl0eVR5cGVCdXR0b25QcmVzc2VkKCkgewogCQkJLy9nZXRDb250cm9sKCkuc2V0Q3Vyc29yKG5ldyBDdXJzb3IoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfV0FJVCkpOwpAQCAtNjMxLDIwICs2ODksMzggQEAKIAkJCX0KIAogCQkJLy8gdGhpcyBlbGltaW5hdGVzIHRoZSBub24tZXhwb3J0ZWQgY2xhc3NwYXRoIGVudHJpZXMKLQkJCWZpbmFsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBUeXBlU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZUZvckFQcm9qZWN0KHBhY2tSb290LmdldEphdmFQcm9qZWN0KCksIHRydWUsIHRydWUpOwotCisJCQlmaW5hbCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gVHlwZVNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGVGb3JBUHJvamVjdChwYWNrUm9vdC5nZXRKYXZhUHJvamVjdCgpLCB0cnVlLCB0cnVlKTsgCisJCQkKIAkJCS8vIFRoaXMgaW5jbHVkZXMgYWxsIGVudHJpZXMgb24gdGhlIGNsYXNzcGF0aC4KLQkJCUZpbHRlcmVkVHlwZXNTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEZpbHRlcmVkVHlwZXNTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgZmFsc2UsIG51bGwvKmdldFdpemFyZCgpLmdldENvbnRhaW5lcigpKi8sIHNjb3BlLCBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFKTsKKwkJCVNlbGVjdGlvbkRpYWxvZyBkaWFsb2c9bnVsbDsKKwkJCXRyeXsKKwkJCQlkaWFsb2cgPSBKYXZhVUkKKwkJCQkJCS5jcmVhdGVUeXBlRGlhbG9nKAorCQkJCQkJCQlnZXRTaGVsbCgpLAorCQkJCQkJCQludWxsLAorCQkJCQkJCQlzY29wZSwKKwkJCQkJCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0FMTF9UWVBFUywKKwkJCQkJCQkJZmFsc2UpOworCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQlKcHRVaVBsdWdpbi5pbnN0YW5jZSgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKIAkJCWRpYWxvZy5zZXRUaXRsZShFbnRpdHlXaXphcmRNc2cuVFlQRV9ESUFMT0dfVElUTEUpOwogCQkJZGlhbG9nLnNldE1lc3NhZ2UoRW50aXR5V2l6YXJkTXNnLlRZUEVfRElBTE9HX0RFU0NSSVBUSU9OKTsKIAogCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJSVR5cGUgdHlwZSA9IChJVHlwZSkgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7CisJCQkJSVR5cGUgdHlwZTsKKwkJCQlPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7CisJCSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5sZW5ndGggPT0gMCkgeworCQkgICAgICAgIAl0eXBlID0gbnVsbDsKKwkJCQl9CisJCSAgICAgICAgZWxzZSB0eXBlID0gKElUeXBlKSByZXN1bHRbMF07CiAJCQkJU3RyaW5nIHN1cGVyY2xhc3NGdWxsUGF0aCA9IElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVNUFRZX1NUUklORzsKIAkJCQlpZiAodHlwZSAhPSBudWxsKSB7CiAJCQkJCXN1cGVyY2xhc3NGdWxsUGF0aCA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7CiAJCQkJfQotCQkJCWNvbWJvLnNldFRleHQoc3VwZXJjbGFzc0Z1bGxQYXRoKTsKKwkJCQlhdHRyaWJ1dGVUeXBlLnNldFRleHQoc3VwZXJjbGFzc0Z1bGxQYXRoKTsKIAkJCQkvL2dldENvbnRyb2woKS5zZXRDdXJzb3IobnVsbCk7CiAJCQkJcmV0dXJuOwogCQkJfQpAQCAtNjU5LDcgKzczNSw4IEBACiAJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwogCQkJCi0JCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCWF0dHJpYnV0ZVR5cGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQlhdHRyaWJ1dGVUeXBlLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0cy5sZW5ndGg7IGkrKykgewogCQkJCXRleHRzW2ldLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwogCQkJfQpAQCAtNjc0LDcgKzc1MSw3IEBACiAJCSAqLwogCQlAT3ZlcnJpZGUKIAkJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQkJZW50aXR5Um93ID0gY2FsbGJhY2sucmV0cmlldmVSZXN1bHRTdHJpbmdzKGNvbWJvLCB0ZXh0cyk7CisJCQllbnRpdHlSb3cgPSBjYWxsYmFjay5yZXRyaWV2ZVJlc3VsdFN0cmluZ3MoYXR0cmlidXRlVHlwZSwgdGV4dHMpOwogCQkJc3VwZXIub2tQcmVzc2VkKCk7CiAJCX0KIApAQCAtNjk3LDcgKzc3NCw3IEBACiAJCSAqIEBzZWUgRGlhbG9nQ2FsbGJhY2sKIAkJICovCiAJCXByaXZhdGUgdm9pZCB1cGRhdGVPS0J1dHRvbigpIHsKLQkJCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGNhbGxiYWNrLnZhbGlkYXRlKGNvbWJvLCB0ZXh0cykpOworCQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoY2FsbGJhY2sudmFsaWRhdGUoYXR0cmlidXRlVHlwZSwgdGV4dHMpKTsKIAkJfQogCQkvKiAobm9uLUphdmFkb2MpCiAJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKQEAgLTczNSw3ICs4MTIsNyBAQAogCiAJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwogCi0JCQljb21iby5zZXRUZXh0KGVudGl0eVJvdy5nZXRGcW5UeXBlTmFtZSgpKTsKKwkJCWF0dHJpYnV0ZVR5cGUuc2V0VGV4dChlbnRpdHlSb3cuZ2V0RnFuVHlwZU5hbWUoKSk7CiAJCQl0ZXh0c1swXS5zZXRUZXh0KGVudGl0eVJvdy5nZXROYW1lKCkpOwogCQkJCiAJCQlyZXR1cm4gY29tcG9zaXRlOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5VGVtcGxhdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVRlbXBsYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzMDljNAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVRlbXBsYXRlLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIEVudGl0eVRlbXBsYXRlCit7CisgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIG5sOworICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBFbnRpdHlUZW1wbGF0ZSBjcmVhdGUoU3RyaW5nIGxpbmVTZXBhcmF0b3IpCisgIHsKKyAgICBubCA9IGxpbmVTZXBhcmF0b3I7CisgICAgRW50aXR5VGVtcGxhdGUgcmVzdWx0ID0gbmV3IEVudGl0eVRlbXBsYXRlKCk7CisgICAgbmwgPSBudWxsOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgZmluYWwgU3RyaW5nIE5MID0gbmwgPT0gbnVsbCA/IChTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKSA6IG5sOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMSA9ICJwYWNrYWdlICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yID0gIjsiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMyA9IE5MOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNCA9IE5MICsgImltcG9ydCAiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNSA9ICI7IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzYgPSBOTCArIE5MICsgIi8qKiIgKyBOTCArICIgKiBFbnRpdHkgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIEVudGl0eTogIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzcgPSBOTCArICIgKiIgKyBOTCArICIgKi8iICsgTkwgKyAicHVibGljIGNsYXNzICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF84ID0gIiBleHRlbmRzICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85ID0gIiBpbXBsZW1lbnRzICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMCA9ICIsICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMSA9ICIgeyIgKyBOTCArICIiICsgTkwgKyAiXHQiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTIgPSAiICIgKyBOTCArICJcdHByaXZhdGUgIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEzID0gIiAiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTQgPSAiOyI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNSA9IE5MICsgIlx0cHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7XHQiICsgTkwgKyAiXHRwdWJsaWMgIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE2ID0gIigpIHsiICsgTkwgKyAiXHRcdHN1cGVyKCk7IiArIE5MICsgIlx0fSAiICsgTkwgKyAiXHQiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTcgPSAiICAgIiArIE5MICsgIlx0cHVibGljICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOCA9ICIgZ2V0IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE5ID0gIigpIHsiICsgTkwgKyAiIFx0XHRyZXR1cm4gdGhpcy4iOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjAgPSAiOyIgKyBOTCArICJcdH0iICsgTkwgKyAiIiArIE5MICsgIlx0cHVibGljIHZvaWQgc2V0IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIxID0gIigiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjIgPSAiICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMyA9ICIpIHsiICsgTkwgKyAiXHRcdHRoaXMuIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI0ID0gIiA9ICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNSA9ICI7IiArIE5MICsgIlx0fSIgKyBOTCArICJcdCI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNiA9IE5MICsgIiAgICIgKyBOTCArICJ9IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI3ID0gTkw7CisKKyAgcHVibGljIFN0cmluZyBnZW5lcmF0ZShPYmplY3QgYXJndW1lbnQpCisgIHsKKyAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsID0gKENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwpIGFyZ3VtZW50OyAKK2lmIChtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9bnVsbCAmJiBtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9IiIpIHsgCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yKTsKKyAgICB9CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMpOworICAgICBDb2xsZWN0aW9uPFN0cmluZz4gaW1wb3J0cyA9IG1vZGVsLmdldEltcG9ydHMoZmFsc2UpOworZm9yIChTdHJpbmcgYW5JbXBvcnQgOiBpbXBvcnRzKSB7IAorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGFuSW1wb3J0KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNSk7CisgICAgIH0gCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0RW50aXR5TmFtZSgpKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNyk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChtb2RlbC5nZXRDbGFzc05hbWUoKSk7CisgICAgU3RyaW5nIHN1cGVyQ2xhc3MgPSBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpOworCWlmICghICIiLmVxdWFscyhzdXBlckNsYXNzKSkgeworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKHN1cGVyQ2xhc3MpOworICAgIH0KKyAgICAKKwlMaXN0PFN0cmluZz4gaW50ZXJmYWNlcyA9IG1vZGVsLmdldEludGVyZmFjZXMoKTsgCisJaWYgKGludGVyZmFjZXMuc2l6ZSgpPjApIHsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOSk7CisgICAgIH0KKwlmb3IgKGludCBpPTA7IGk8aW50ZXJmYWNlcy5zaXplKCk7IGkrKykgeworCQlTdHJpbmcgSU5URVJGQUNFID0gKFN0cmluZykgaW50ZXJmYWNlcy5nZXQoaSk7CisJCWlmIChpPjApIHsgCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEwKTsKKyAgICB9CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChJTlRFUkZBQ0UpOworICAgIH0KKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTEpOworICAgICBMaXN0PEVudGl0eVJvdz4gZmllbGRzID0gbW9kZWwuZ2V0RW50aXR5RmllbGRzKCk7IAorCWZvciAoRW50aXR5Um93IGVudGl0eSA6IGZpZWxkcykgeyAgICAgCisJCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEyKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGVudGl0eS5nZXRUeXBlKCkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMyk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChlbnRpdHkuZ2V0TmFtZSgpKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTQpOworICAgIH0KKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTUpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0Q2xhc3NOYW1lKCkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNik7CisgICAgCisJZmllbGRzID0gbW9kZWwuZ2V0RW50aXR5RmllbGRzKCk7CisJaWYgKGZpZWxkcyAhPSBudWxsKSBmb3IgKGludCBpPTA7IGk8ZmllbGRzLnNpemUoKTsgaSsrKSB7CisJCUVudGl0eVJvdyBmaWVsZCA9IChFbnRpdHlSb3cpIGZpZWxkcy5nZXQoaSk7CisJCVN0cmluZyBUWVBFID0gZmllbGQuZ2V0VHlwZSgpOworCQlTdHJpbmcgTkFNRSA9IGZpZWxkLmdldE5hbWUoKTsKKwkJU3RyaW5nIE1FVEhPRCA9IE5BTUUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIE5BTUUuc3Vic3RyaW5nKDEpOworCQorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNyk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChUWVBFKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTgpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTUVUSE9EKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTkFNRSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIwKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE1FVEhPRCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIxKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRZUEUpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMik7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChOQU1FKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjMpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTkFNRSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI0KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE5BTUUpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNSk7CisgICAgfQorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNik7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI3KTsKKyAgICByZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVdpemFyZE1zZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5V2l6YXJkTXNnLmphdmEKaW5kZXggN2ZlNjk4Yi4uNmEwMzg4MCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5V2l6YXJkTXNnLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5V2l6YXJkTXNnLmphdmEKQEAgLTExLDEwICsxMSw5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eTsKIAotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQogaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CiAKIHB1YmxpYyBjbGFzcyBFbnRpdHlXaXphcmRNc2cgZXh0ZW5kcyBOTFMgewkKQEAgLTM3LDcgKzM2LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDSE9PU0VfWE1MOwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUFBJTkdfWE1MX1RJVExFOwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9OQU1FX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOQ09SUkVDVF9YTUxfTkFNRTsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1hNTF9OQU1FOwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENIT09TRV9NQVBQSU5HX1hNTF9NRVNTQUdFOwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfRElBTE9HX1RJVExFOwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfRElBTE9HX0RFU0NSSVBUSU9OOwpAQCAtNDUsNyArNDQsOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBQkxFX05BTUU7CiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVEFCTEVfTkFNRV9HUk9VUDsKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVU0VfREVGQVVMVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfRklFTERTOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9GSUVMRFNfRElBTE9HX1RJVExFOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9GSUVMRFNfR1JPVVA7CiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZOwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5BTUVfQ09MVU1OOwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfQ09MVU1OOwpAQCAtNTQsNyArNTQsMTAgQEAKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCUk9XU0VfQlVUVE9OX0xBQkVMOwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9CVVRUT05fTEFCRUw7CiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRURJVF9CVVRUT05fTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX0JVVFRPTl9MQUJFTDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlEYXRhTW9kZWxQcm92aWRlcl90eXBlTm90SW5Qcm9qZWN0Q2xhc3NwYXRoOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eURhdGFNb2RlbFByb3ZpZGVyX2ludmFsaWRQS1R5cGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5RGF0YU1vZGVsUHJvdmlkZXJfaW52YWxpZEFyZ3VtZW50OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRV9CVVRUT05fTEFCRUw7CiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRFVQTElDQVRFRF9FTlRJVFlfTkFNRVNfTUVTU0FHRTsKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBQ0NFU1NfVFlQRTsKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBGSUVMRF9CQVNFRDsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0lkQ2xhc3NUZW1wbGF0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvSWRDbGFzc1RlbXBsYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhMzNmZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0lkQ2xhc3NUZW1wbGF0ZS5qYXZhCkBAIC0wLDAgKzEsMjU1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBjbGFzcyBJZENsYXNzVGVtcGxhdGUKK3sKKyAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbmw7CisgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIElkQ2xhc3NUZW1wbGF0ZSBjcmVhdGUoU3RyaW5nIGxpbmVTZXBhcmF0b3IpCisgIHsKKyAgICBubCA9IGxpbmVTZXBhcmF0b3I7CisgICAgSWRDbGFzc1RlbXBsYXRlIHJlc3VsdCA9IG5ldyBJZENsYXNzVGVtcGxhdGUoKTsKKyAgICBubCA9IG51bGw7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgTkwgPSBubCA9PSBudWxsID8gKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpIDogbmw7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xID0gInBhY2thZ2UgIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIgPSAiOyI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zID0gTkw7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80ID0gTkwgKyAiaW1wb3J0ICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81ID0gIjsiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNiA9IE5MICsgTkwgKyAiLyoqIiArIE5MICsgIiAqIElEIGNsYXNzIGZvciBlbnRpdHk6ICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83ID0gTkwgKyAiICoiICsgTkwgKyAiICovICIgKyBOTCArICJwdWJsaWMgY2xhc3MgIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzggPSAiICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85ID0gIiBpbXBsZW1lbnRzICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMCA9ICIsICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMSA9ICIgeyAgICIgKyBOTCArICIgICAiICsgTkwgKyAiXHQiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTIgPSAiICAgICAgICAgIiArIE5MICsgIlx0cHJpdmF0ZSAiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTMgPSAiICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNCA9ICI7IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE1ID0gTkwgKyAiXHRwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsiICsgTkwgKyAiIiArIE5MICsgIlx0cHVibGljICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNiA9ICIoKSB7fSIgKyBOTCArICIiICsgTkwgKyAiXHQiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTcgPSBOTCArIE5MICsgIlx0cHVibGljICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOCA9ICIgZ2V0IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE5ID0gIigpIHsiICsgTkwgKyAiXHRcdHJldHVybiB0aGlzLiI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMCA9ICI7IiArIE5MICsgIlx0fSIgKyBOTCArICIiICsgTkwgKyAiXHRwdWJsaWMgdm9pZCBzZXQiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjEgPSAiKCI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMiA9ICIgIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIzID0gIikgeyIgKyBOTCArICJcdFx0dGhpcy4iOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjQgPSAiID0gIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI1ID0gIjsiICsgTkwgKyAiXHR9IiArIE5MICsgIlx0IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI2ID0gTkwgKyAiICAgIiArIE5MICsgIlx0LyoiICsgTkwgKyAiXHQgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKE9iamVjdCkiICsgTkwgKyAiXHQgKi9cdCIgKyBOTCArICJcdHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeyIgKyBOTCArICJcdFx0aWYgKG8gPT0gdGhpcykgeyIgKyBOTCArICJcdFx0XHRyZXR1cm4gdHJ1ZTsiICsgTkwgKyAiXHRcdH0iICsgTkwgKyAiXHRcdGlmICghKG8gaW5zdGFuY2VvZiAiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjcgPSAiKSkgeyIgKyBOTCArICJcdFx0XHRyZXR1cm4gZmFsc2U7IiArIE5MICsgIlx0XHR9IiArIE5MICsgIlx0XHQiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjggPSAiIG90aGVyID0gKCI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yOSA9ICIpIG87IiArIE5MICsgIlx0XHRyZXR1cm4gdHJ1ZSI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMCA9IE5MICsgIlx0XHRcdCYmICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMSA9ICIoKSA9PSBvdGhlci4iOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzIgPSAiKCkiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzMgPSBOTCArICJcdFx0XHQmJiAoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM0ID0gIigpKSA9PSBEb3VibGUuZG91YmxlVG9Mb25nQml0cyhvdGhlci4iOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzUgPSAiKCkpKSI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNiA9IE5MICsgIlx0XHRcdCYmIChGbG9hdC5mbG9hdFRvSW50Qml0cygiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzcgPSAiKCkpID09IEZsb2F0LmZsb2F0VG9JbnRCaXRzKG90aGVyLiI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOCA9ICIoKSkpIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM5ID0gTkwgKyAiXHRcdFx0JiYgKCI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MCA9ICIoKSA9PSBudWxsID8gb3RoZXIuIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQxID0gIigpID09IG51bGwgOiAiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDIgPSAiKCkuZXF1YWxzKG90aGVyLiI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MyA9ICIoKSkpIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ0ID0gIjsiICsgTkwgKyAiXHR9IiArIE5MICsgIlx0IiArIE5MICsgIlx0LypcdCAiICsgTkwgKyAiXHQgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKSIgKyBOTCArICJcdCAqL1x0IiArIE5MICsgIlx0cHVibGljIGludCBoYXNoQ29kZSgpIHsiICsgTkwgKyAiXHRcdGZpbmFsIGludCBwcmltZSA9IDMxOyIgKyBOTCArICJcdFx0aW50IHJlc3VsdCA9IDE7IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ1ID0gTkwgKyAiXHRcdHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80NiA9ICIoKSA/IDEgOiAwKTsiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDcgPSBOTCArICJcdFx0cmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDggPSAiKCk7IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ5ID0gTkwgKyAiXHRcdHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChpbnQpICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81MCA9ICIoKSk7IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUxID0gTkwgKyAiXHRcdHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChpbnQpICgiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTIgPSAiKCkgXiAoIjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUzID0gIigpID4+PiAzMikpKTsiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTQgPSBOTCArICJcdFx0cmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGludCkgKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKCI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NSA9ICIoKSApIF4gKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKCI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NiA9ICIoKSkgPj4+IDMyKSkpOyI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NyA9IE5MICsgIlx0XHRyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIEZsb2F0LmZsb2F0VG9JbnRCaXRzKCI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81OCA9ICIoKSk7IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU5ID0gTkwgKyAiXHRcdHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MCA9ICIoKSA9PSBudWxsID8gMCA6ICI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MSA9ICIoKS5oYXNoQ29kZSgpKTsiOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNjIgPSBOTCArICJcdFx0cmV0dXJuIHJlc3VsdDsiICsgTkwgKyAiXHR9IiArIE5MICsgIiAgICIgKyBOTCArICIgICAiICsgTkwgKyAifSI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MyA9IE5MOworCisgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGUoT2JqZWN0IGFyZ3VtZW50KQorICB7CisgICAgZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBtb2RlbCA9IChDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsKSBhcmd1bWVudDsgCitpZiAobW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPW51bGwgJiYgbW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPSIiKSB7IAorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMik7CisgICAgfQorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zKTsKKyAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKHRydWUpOworZm9yIChTdHJpbmcgYW5JbXBvcnQgOiBpbXBvcnRzKSB7IAorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGFuSW1wb3J0KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNSk7CisgICAgIH0gCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0Q2xhc3NOYW1lKCkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF83KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldElkQ2xhc3NOYW1lKCkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84KTsKKyAgICAgTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBtb2RlbC5nZXRJbnRlcmZhY2VzKCk7IAorCWlmIChpbnRlcmZhY2VzLnNpemUoKT4wKSB7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzkpOworICAgICB9CisJZm9yIChpbnQgaT0wOyBpPGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKKwkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOworCQlpZiAoaT4wKSB7IAorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMCk7CisgICAgfQorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoSU5URVJGQUNFKTsKKyAgICB9CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzExKTsKKyAgICAgTGlzdDxFbnRpdHlSb3c+IGZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOworCUxpc3Q8U3RyaW5nPiBwa0ZpZWxkcyA9IG1vZGVsLmdldFBLRmllbGRzKCk7IAorCWZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKKwkJRW50aXR5Um93IGVudGl0eSA9IChFbnRpdHlSb3cpIGZpZWxkcy5nZXQoaSk7CisJCWlmICghcGtGaWVsZHMuY29udGFpbnMoZW50aXR5LmdldE5hbWUoKSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEyKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGVudGl0eS5nZXRUeXBlKCkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMyk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChlbnRpdHkuZ2V0TmFtZSgpKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTQpOworICAgIH0KKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTUpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0SWRDbGFzc05hbWUoKSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE2KTsKKyAgICAKKwlmaWVsZHMgPSBtb2RlbC5nZXRFbnRpdHlGaWVsZHMoKTsKKwlpZiAoZmllbGRzICE9IG51bGwpIGZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKKwkJRW50aXR5Um93IGZpZWxkID0gKEVudGl0eVJvdykgZmllbGRzLmdldChpKTsKKwkJU3RyaW5nIFRZUEUgPSBmaWVsZC5nZXRUeXBlKCk7CisJCVN0cmluZyBOQU1FID0gZmllbGQuZ2V0TmFtZSgpOworCQlpZiAoIXBrRmllbGRzLmNvbnRhaW5zKE5BTUUpKSB7CisJCQljb250aW51ZTsKKwkJfSAJCQorCQlTdHJpbmcgTUVUSE9EID0gTkFNRS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgTkFNRS5zdWJzdHJpbmcoMSk7ICAgICAgICAKKwkKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTcpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVFlQRSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE4KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE1FVEhPRCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE5KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE5BTUUpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChNRVRIT0QpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChUWVBFKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjIpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTkFNRSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIzKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE5BTUUpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChOQU1FKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjUpOworICAgIH0KKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjYpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0SWRDbGFzc05hbWUoKSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI3KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldElkQ2xhc3NOYW1lKCkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yOCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChtb2RlbC5nZXRJZENsYXNzTmFtZSgpKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjkpOworICAgICBpZiAoZmllbGRzICE9IG51bGwpIGZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKKwlFbnRpdHlSb3cgZmllbGQgPSAoRW50aXR5Um93KSBmaWVsZHMuZ2V0KGkpOyAKKwlTdHJpbmcgTkFNRSA9IGZpZWxkLmdldE5hbWUoKTsKKwlpZiAoIXBrRmllbGRzLmNvbnRhaW5zKE5BTUUpKSB7CisgICAgICAgCWNvbnRpbnVlOworICAgIH0KKyAgICAgCVN0cmluZyBUWVBFID0gZmllbGQuZ2V0VHlwZSgpOyAKKwlTdHJpbmcgR0VUX01FVEhPRCA9ICJnZXQiICsgTkFNRS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgTkFNRS5zdWJzdHJpbmcoMSk7IAorICAgIAlpZiAoVFlQRS5lcXVhbHMoImJvb2xlYW4iKSB8fCBUWVBFLmVxdWFscygiYnl0ZSIpIHx8IFRZUEUuZXF1YWxzKCJjaGFyIikgfHwgVFlQRS5lcXVhbHMoInNob3J0IikgfHwgVFlQRS5lcXVhbHMoImludCIpIHx8IFRZUEUuZXF1YWxzKCJsb25nIikpIHsgCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMwKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzIpOworICAgICAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygiZG91YmxlIikpIHsgCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMzKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzUpOworICAgICAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygiZmxvYXQiKSkgeyAKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzYpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM3KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zOCk7CisgICAgIAl9IGVsc2UgeyAKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQwKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80MSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDIpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQzKTsKKyAgICAgCX0gCisgICAgIH0gCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ0KTsKKyAgICAgaWYgKGZpZWxkcyAhPSBudWxsKSBmb3IgKGludCBpPTA7IGk8ZmllbGRzLnNpemUoKTsgaSsrKSB7IAorCUVudGl0eVJvdyBmaWVsZCA9IChFbnRpdHlSb3cpIGZpZWxkcy5nZXQoaSk7CisJU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7CisJaWYgKCFwa0ZpZWxkcy5jb250YWlucyhOQU1FKSkgeworICAgICAgIAljb250aW51ZTsKKyAgICB9CisgICAgIAlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsgCisJU3RyaW5nIEdFVF9NRVRIT0QgPSAiZ2V0IiArIE5BTUUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIE5BTUUuc3Vic3RyaW5nKDEpOyAKKyAgICAJaWYgKFRZUEUuZXF1YWxzKCJib29sZWFuIikpIHsgCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ1KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80Nik7CisgICAgIAl9IGVsc2UgaWYgKFRZUEUuZXF1YWxzKCJpbnQiKSkgeyAKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDcpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ4KTsKKyAgICAgCX0gZWxzZSBpZiAoVFlQRS5lcXVhbHMoImJ5dGUiKSB8fCBUWVBFLmVxdWFscygiY2hhciIpIHx8IFRZUEUuZXF1YWxzKCJzaG9ydCIpKSB7IAorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80OSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTApOworICAgICAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygibG9uZyIpKSB7IAorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81MSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTIpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUzKTsKKyAgICAgCX0gZWxzZSBpZiAoVFlQRS5lcXVhbHMoImRvdWJsZSIpKSB7IAorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81NCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTUpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU2KTsKKyAgICAgCX0gZWxzZSBpZiAoVFlQRS5lcXVhbHMoImZsb2F0IikpIHsgCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU3KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81OCk7CisgICAgIAl9IGVsc2UgeyAKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYwKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82MSk7CisgICAgIAl9IAorICAgICB9IAorICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82Mik7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYzKTsKKyAgICByZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9DcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsLmphdmEKaW5kZXggMDk1ZWI3ZS4uNTkzN2Y5MSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9DcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9DcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsLmphdmEKQEAgLTE3LDcgKzE3LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCAzMTFlMTU4Li42MGQ5ZWM5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL21vZGVsL0VudGl0eURhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9FbnRpdHlEYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwxNiArMTEsMzIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWw7CiAKK2ltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LkVudGl0eVdpemFyZE1zZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5vcGVyYXRpb24uTmV3RW50aXR5Q2xhc3NPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVDb21tb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5OZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwogCiBwdWJsaWMgY2xhc3MgRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzewpAQCAtMzYsOCArNTIsNiBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0UHJvcGVydHlOYW1lcygpCiAJICovCi0JCi0JCiAJQE92ZXJyaWRlCiAJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewkJCiAJCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwpAQCAtMTAxLDYgKzExNSwxNSBAQAogCQkvLyBPdGhlcndpc2UgY2hlY2sgc3VwZXIgZm9yIGRlZmF1bHQgdmFsdWUgZm9yIHByb3BlcnR5CiAJCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKIAl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKKwkJYm9vbGVhbiBvayA9IHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTkFNRSkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhYTUxfU1VQUE9SVCkpIHsKKwkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoWE1MX05BTUUsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7CisJCX0KKwkJcmV0dXJuIG9rOworCX0KIAogCS8qIEFkZHMgYWRkaXRpb25hbCBjaGVjayB0byB0aGUgbW9kZWwgdmFsaWRhdGlvbgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoamF2YS5sYW5nLlN0cmluZykKQEAgLTExNCwxOCArMTM3LDggQEAKIAkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU1VQRVJDTEFTUykgJiYgRU1QVFlfU1RSSU5HLmVxdWFscyhnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSkgewogCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7CiAJCX0KLQkJLy9TaG91bGQgYmUgY2hlY2sgZXhpc3Rpbmcgb2YgdGhlIGNsYXNzIHdpdGggdGhlIHJlbGV2YW50IG5hbWUKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ0xBU1NfTkFNRSkpIHsKLQkJCVN0cmluZyBjbGFzc05hbWVWYWx1ZSA9IGdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQlyZXN1bHQgPSBzdXBlci52YWxpZGF0ZUphdmFDbGFzc05hbWUoZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKSk7Ci0JCQlpZiAocmVzdWx0LmlzT0soKSl7Ci0JCQkJcmV0dXJuIHN1cGVyLmNhbkNyZWF0ZVR5cGVJbkNsYXNzcGF0aChjbGFzc05hbWVWYWx1ZSk7Ci0JCQl9Ci0JCX0JCQogCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhYTUxfTkFNRSkpIHsKLS8vCQkJU3RyaW5nIHhtbE5hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotLy8JCQl4bWxOYW1lID0geG1sTmFtZS5zdWJzdHJpbmcoeG1sTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikgKyAxKTsKLS8vCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZU5hbWUoeG1sTmFtZSwgSVJlc291cmNlLkZJTEUpOworCQkJcmV0dXJuIHZhbGlkYXRlWG1sTmFtZShnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKIAkJfQogCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFTlRJVFlfRklFTERTKSkgewogCQkJcmV0dXJuIHZhbGlkYXRlRmllbGRzTGlzdCgoQXJyYXlMaXN0PEVudGl0eVJvdz4pIGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkpOwpAQCAtMTQ4LDcgKzE2MSw3IEBACiAJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZVdhcm5pbmdTdGF0dXMoRW50aXR5V2l6YXJkTXNnLkRFRkFVTFRfUEFDS0FHRV9XQVJOSU5HKTsKIAkJfQkJCQogCQkvLyBVc2Ugc3RhbmRhcmQgamF2YSBjb252ZW50aW9ucyB0byB2YWxpZGF0ZSB0aGUgcGFja2FnZSBuYW1lCi0JCUlTdGF0dXMgamF2YVN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKHBhY2tOYW1lKTsKKwkJSVN0YXR1cyBqYXZhU3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlUGFja2FnZU5hbWUocGFja05hbWUsIEphdmFDb3JlLlZFUlNJT05fMV81LCBKYXZhQ29yZS5WRVJTSU9OXzFfNSk7CiAJCWlmIChqYXZhU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewogCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5FUlJfSkFWQV9QQUNBS0dFX05BTUVfSU5WQUxJRCArIGphdmFTdGF0dXMuZ2V0TWVzc2FnZSgpOwkJCQkKIAkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKQEAgLTE2MCw2ICsxNzMsMzMgQEAKIAkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7CiAJfQogCQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gIEl0IHdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSAKKwkgKiB0aGUgY29ycmVjdG5lc3Mgb2YgeG1sIGZpbGUgbG9jYXRpb24uIAorCSAqIFRoaXMgbWV0aG9kIHdpbGwgYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIuIAorCSAqIAorCSAqIEBzZWUgTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShTdHJpbmcpCisJICogCisJICogQHBhcmFtIHhtbE5hbWUKKwkgKiBAcmV0dXJuIElTdGF0dXMgaXMgdGhlIHBhY2thZ2UgbmFtZSBzYXRpc2ZpZXMgSmF2YSBjb252ZW50aW9uIHJlcXVpcmVtZW50cworCSAqLworCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVhtbE5hbWUoU3RyaW5nIHhtbE5hbWUpIHsKKwkJaWYgKGdldEJvb2xlYW5Qcm9wZXJ0eShYTUxfU1VQUE9SVCkpIHsKKwkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IHRoaXMubW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKKwkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOworCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgeworCQkJCS8vVE9ETyBuZWVkIHRvIGNoZWNrIGNvbnRlbnQgdHlwZSBhcyB3ZWxsIHNpbmNlIHVzZXIgY2FuIHR5cGUgaW4gYSBmaWxlIG5hbWUsIHNob3VsZCBoYXZlIGEgZGlmZmVyZW50IGVycm9yIG1lc3NhZ2UgZm9yIGludmFsaWQgY29udGVudCB0eXBlCisJCQkJSnBhRmlsZSBqcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKHByb2plY3QsIHhtbE5hbWUpOworCQkJCWlmIChqcGFGaWxlID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoCisJCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsCisJCQkJCQkJRW50aXR5V2l6YXJkTXNnLklOVkFMSURfWE1MX05BTUUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwl9CisJCiAJCiAJLyoqCiAJICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGVudGl0eSBmaWVsZHMKQEAgLTE3OCwxMSArMjE4LDEyMyBAQAogCQkJCVN0cmluZyBtc2cgPSBFbnRpdHlXaXphcmRNc2cuRFVQTElDQVRFRF9FTlRJVFlfTkFNRVNfTUVTU0FHRTsJCQkJCiAJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwogCQkJfQorCQkJLy8gRW5zdXJlIHRoYXQgdGhlIGVudHJpZXMgaW4gdGhlIGxpc3QgYXJlIHZhbGlkCisJCQlTdHJpbmcgZXJyb3JNc2cgPSBjaGVja0lucHV0RWxlbWVudHNUeXBlVmFsaWRhdGlvbihlbnRpdGllcyk7CisJCQlpZiAoZXJyb3JNc2cgIT0gbnVsbCkgeworCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoZXJyb3JNc2cpOworCQkJfQorCQkJU3RyaW5nIHdhcm5pbmdNc2cgPSBjaGVja0lucHV0RWxlbWVudHNUeXBlRXhpc3RlbmNlKGVudGl0aWVzKTsKKwkJCWlmICh3YXJuaW5nTXNnICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZVdhcm5pbmdTdGF0dXMod2FybmluZ01zZyk7CisJCQl9CiAJCX0KLQkJLy8gUmV0dXJuIE9LCiAJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwogCX0KIAkKKwlwcml2YXRlIFN0cmluZyBjaGVja0lucHV0RWxlbWVudHNUeXBlVmFsaWRhdGlvbihMaXN0PEVudGl0eVJvdz4gaW5wdXRFbGVtZW50cykgeworCQlJU3RhdHVzIHZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKKwkJZm9yIChFbnRpdHlSb3cgZW50aXR5Um93OiBpbnB1dEVsZW1lbnRzKSB7CisJCQlpZiAoZW50aXR5Um93LmlzS2V5KCkgJiYgIWVudGl0eVJvdy5jb3VsZEJlS2V5KCkpIHsKKwkJCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJRW50aXR5V2l6YXJkTXNnLkVudGl0eURhdGFNb2RlbFByb3ZpZGVyX2ludmFsaWRQS1R5cGUsIG5ldyBPYmplY3RbXXtlbnRpdHlSb3cuZ2V0RnFuVHlwZU5hbWUoKX0pOworCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAorCQkJCQkJSnB0VWlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKKwkJCQlicmVhazsJCQkJCisJCQl9CQkJCisJCQlTdHJpbmcgc2lnID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJc2lnID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUoZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCksIHRydWUpOworCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEVudGl0eVdpemFyZE1zZy5FbnRpdHlEYXRhTW9kZWxQcm92aWRlcl9pbnZhbGlkQXJndW1lbnQsIG5ldyBPYmplY3RbXXtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pOworCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHNpZyA9PSBudWxsKXsKKwkJCQl2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUphdmFUeXBlTmFtZShlbnRpdHlSb3cuZ2V0VHlwZSgpLCBKYXZhQ29yZS5WRVJTSU9OXzFfNSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUpOworCQkJCWJyZWFrOworCQkJfQorCQkJaW50IHNpZ1R5cGUgPSBTaWduYXR1cmUuZ2V0VHlwZVNpZ25hdHVyZUtpbmQoc2lnKTsKKwkJCWlmIChzaWdUeXBlID09IFNpZ25hdHVyZS5CQVNFX1RZUEVfU0lHTkFUVVJFKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQllbHNlIGlmIChzaWdUeXBlID09IFNpZ25hdHVyZS5BUlJBWV9UWVBFX1NJR05BVFVSRSkgeworCQkJCVN0cmluZyBlbGVtZW50U2lnbmF0dXJlID0gU2lnbmF0dXJlLmdldEVsZW1lbnRUeXBlKHNpZyk7CisJCQkJaWYgKFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZChlbGVtZW50U2lnbmF0dXJlKSA9PSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCF2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cy5pc09LKCkpIHsKKwkJCXJldHVybiB2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cy5nZXRNZXNzYWdlKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGNoZWNrSW5wdXRFbGVtZW50c1R5cGVFeGlzdGVuY2UoTGlzdDxFbnRpdHlSb3c+IGlucHV0RWxlbWVudHMpIHsKKwkJSVN0YXR1cyB2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cz1TdGF0dXMuT0tfU1RBVFVTOworCQlmb3IgKEVudGl0eVJvdyBlbnRpdHlSb3c6IGlucHV0RWxlbWVudHMpIHsKKwkJCVN0cmluZyBzaWcgPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShlbnRpdHlSb3cuZ2V0RnFuVHlwZU5hbWUoKSAsdHJ1ZSk7CisJCQlpZiAoc2lnID09IG51bGwpIHsKKwkJCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJRW50aXR5V2l6YXJkTXNnLkVudGl0eURhdGFNb2RlbFByb3ZpZGVyX3R5cGVOb3RJblByb2plY3RDbGFzc3BhdGgsIG5ldyBPYmplY3RbXXtlbnRpdHlSb3cuZ2V0RnFuVHlwZU5hbWUoKX0pOworCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAorCQkJCQkJSnB0VWlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWludCBzaWdUeXBlID0gU2lnbmF0dXJlLmdldFR5cGVTaWduYXR1cmVLaW5kKHNpZyk7CisJCQlpZiAoc2lnVHlwZSA9PSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRSl7CisJCQkJY29udGludWU7CisJCQl9CisJCQllbHNlIGlmIChzaWdUeXBlID09IFNpZ25hdHVyZS5BUlJBWV9UWVBFX1NJR05BVFVSRSkgeworCQkJCVN0cmluZyBlbGVtZW50U2lnbmF0dXJlID0gU2lnbmF0dXJlLmdldEVsZW1lbnRUeXBlKHNpZyk7CisJCQkJaWYoU2lnbmF0dXJlLmdldFR5cGVTaWduYXR1cmVLaW5kKGVsZW1lbnRTaWduYXR1cmUpID09IFNpZ25hdHVyZS5CQVNFX1RZUEVfU0lHTkFUVVJFKXsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCVN0cmluZyBxdWFsaWZpZWROYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKGVsZW1lbnRTaWduYXR1cmUpOworCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1QpOworCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKKwkJCQlJVHlwZSB0eXBlID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQl0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUocXVhbGlmaWVkTmFtZSk7CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMgPSBlLmdldFN0YXR1cygpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKHR5cGUgPT0gbnVsbCkgeworCQkJCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCUVudGl0eVdpemFyZE1zZy5FbnRpdHlEYXRhTW9kZWxQcm92aWRlcl90eXBlTm90SW5Qcm9qZWN0Q2xhc3NwYXRoLCBuZXcgT2JqZWN0W117ZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCl9KTsKKwkJCQkJdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCisJCQkJCQkJSnB0VWlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVCk7CisJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOworCQkJCUlUeXBlIHR5cGUgPSBudWxsOworCQkJCXRyeSB7CisJCQkJCXR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShlbnRpdHlSb3cuZ2V0RnFuVHlwZU5hbWUoKSk7CisJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKwkJCQkJdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMgPSBlLmdldFN0YXR1cygpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKHR5cGUgPT0gbnVsbCkgeworCQkJCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCUVudGl0eVdpemFyZE1zZy5FbnRpdHlEYXRhTW9kZWxQcm92aWRlcl90eXBlTm90SW5Qcm9qZWN0Q2xhc3NwYXRoLCBuZXcgT2JqZWN0W117ZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCl9KTsKKwkJCQkJdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCisJCQkJCQkJSnB0VWlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWlmKCF2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cy5pc09LKCkpIHsKKwkJCXJldHVybiB2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cy5nZXRNZXNzYWdlKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQkJCisJCQkKKwkKIAkvKioKIAkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEl0IHByb3ZpZGVzIGEgc2ltcGxlIGFsZ29yaXRobSBmb3IgZGV0ZWN0aW5nCiAJICogaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZSBlbnRyaWVzIGluIGEgbGlzdC4gSXQgd2lsbCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gSXQgd2lsbCByZXR1cm4KQEAgLTIwNCw3ICszNTYsNiBAQAogCQkJCWlmIChpbnRFbnRpdHkuZ2V0TmFtZSgpLmVxdWFscyhlbnRpdHkuZ2V0TmFtZSgpKSkgewogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQl9Ci0JCQkJCiAJCQl9CiAJCX0JCQogCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL21vZGVsL0VudGl0eVJvdy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9FbnRpdHlSb3cuamF2YQppbmRleCA1MmQ3YjBkLi40NDc1ZWE2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL21vZGVsL0VudGl0eVJvdy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvRW50aXR5Um93LmphdmEKQEAgLTE3LDQ4ICsxNywyMyBAQAogcHVibGljIGNsYXNzIEVudGl0eVJvdyB7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UID0gIi4iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQlJBQ0tFVF9TUVVBUkUgPSAnWyc7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBCUkFDS0VUX0FOR1VMQVIgPSAnPCc7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfSkFWQV9MQU5HID0gImphdmEubGFuZy4iOwogCXByaXZhdGUgYm9vbGVhbiBrZXkgPSBmYWxzZTsKIAlwcml2YXRlIFN0cmluZyBuYW1lID0gIiI7CiAJcHJpdmF0ZSBTdHJpbmcgdHlwZSA9ICIiOwogCXByaXZhdGUgU3RyaW5nIGZxblR5cGVOYW1lID0gIiI7Ci0JcHJpdmF0ZSBib29sZWFuIGlzU2ltcGxlVHlwZSA9IGZhbHNlOwogCiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gUEtfVFlQRVMgPSB7ImludCIsICJsb25nIiwgInNob3J0IiwgImNoYXIiLCAiYm9vbGVhbiIsICJieXRlIiwgImRvdWJsZSIsICJmbG9hdCIsIAogCQkiamF2YS5sYW5nLlN0cmluZyIsICJqYXZhLnNxbC5EYXRlIiwgImphdmEudXRpbC5EYXRlIiwgImphdmEubGFuZy5JbnRlZ2VyIiwgImphdmEubGFuZy5Mb25nIiwgImphdmEubGFuZy5TaG9ydCIsCiAJCSJqYXZhLmxhbmcuQ2hhcmFjdGVyIiwgImphdmEubGFuZy5Cb29sZWFuIiwgImphdmEubGFuZy5CeXRlIiwgImphdmEubGFuZy5Eb3VibGUiLCAiamF2YS5sYW5nLkZsb2F0In07CiAJCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTGlzdDxTdHJpbmc+IFZBTElEX1BLX1RZUEVTID0gQXJyYXlzLmFzTGlzdChQS19UWVBFUyk7Ci0JCi0JCi0JLyoqCi0JICogQ29uc3RydWN0cyA8Y29kZT5FbnRpdHlDb2x1bW48L2NvZGU+LgotCSAqLwotCXB1YmxpYyBFbnRpdHlSb3coKSB7Ci0JCXN1cGVyKCk7Ci0JfQorCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIFBLX1RZUEVTX1NIT1JUID0geyAiU3RyaW5nIiwgIkludGVnZXIiLCAiTG9uZyIsICJTaG9ydCIsICJDaGFyYWN0ZXIiLCAiQm9vbGVhbiIsIAorCQkgIkJ5dGUiLCAiRG91YmxlIiwgIkZsb2F0IiB9OwogCi0JCi0JLyoqCi0JICogCi0JICogQ29uc3RydWN0cyA8Y29kZT5FbnRpdHlDb2x1bW48L2NvZGU+IHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzCi0JICogCi0JICogQHBhcmFtIGZxblR5cGVOYW1lIC0gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGl0eSBmaWVsZCB0eXBlCi0JICogQHBhcmFtIG5hbWUgLSBuYW1lIG9mIHRoZSBlbnRpdHkgZmllbGQKLQkgKiBAcGFyYW0gaXNLZXkgLSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnRpdHkgZmllbGQgaXMgcHJpbWFyeSBrZXkgb3IgcGFydCBvZiBjb21wb3NpdGUgcHJpbWFyeSBrZXkKLQkgKi8KLQlwdWJsaWMgRW50aXR5Um93KFN0cmluZyBmcW5UeXBlTmFtZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNLZXkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mcW5UeXBlTmFtZSA9IHR5cGU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMua2V5ID0gaXNLZXk7Ci0JCWlmIChmcW5UeXBlTmFtZS5pbmRleE9mKERPVCkgPT0gLTEpIHsKLQkJCXR5cGUgPSBmcW5UeXBlTmFtZTsKLQkJCWlzU2ltcGxlVHlwZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQl0eXBlID0gZ2V0U2ltcGxlTmFtZShmcW5UeXBlTmFtZSk7Ci0JCX0KLQl9Ci0JCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTGlzdDxTdHJpbmc+IFZBTElEX1BLX1RZUEVTID0gQXJyYXlzLmFzTGlzdChQS19UWVBFUyk7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTGlzdDxTdHJpbmc+IFZBTElEX1BLX1RZUEVTX1NIT1JUID0gQXJyYXlzLmFzTGlzdChQS19UWVBFU19TSE9SVCk7CiAJCiAJLyoqCiAJICogQHJldHVybiB3aGV0aGVyIHRoZSBwcmVzZW50ZWQgZW50aXR5IGZpZWxkIGlzIHByaW1hcnkga2V5IG9yIHBhcnQgb2YgY29tcG9zaXRlIHByaW1hcnkga2V5CkBAIC0xMjQsNiArOTksMzEgQEAKIAlwdWJsaWMgU3RyaW5nIGdldEZxblR5cGVOYW1lKCkgewogCQlyZXR1cm4gZnFuVHlwZU5hbWU7CiAJfQorCQorCXByaXZhdGUgU3RyaW5nIHJlbW92ZVNwYWNlcyhTdHJpbmcgc3RyKSB7CisJCXN0ciA9IHN0ci50cmltKCk7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgeworCQkJY2hhciBjID0gc3RyLmNoYXJBdChpKTsKKwkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgCisJCQkJc2IuYXBwZW5kKGMpOworCQl9CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKwkKKwlwcml2YXRlIFN0cmluZyBnZXRCYXNpY0ZRTihTdHJpbmcgZnFuKSB7CisJCVN0cmluZyByZXM7CisJCWludCBic0luZGV4ID0gZnFuLmluZGV4T2YoQlJBQ0tFVF9TUVVBUkUpOworCQlpbnQgYmFJbmRleCA9IGZxbi5pbmRleE9mKEJSQUNLRVRfQU5HVUxBUik7CisJCWlmIChic0luZGV4ID09IC0xKSB7CisJCQlpZiAoYmFJbmRleCA9PSAtMSkgcmVzID0gZnFuOworCQkJZWxzZSByZXMgPSBmcW4uc3Vic3RyaW5nKDAsIGJhSW5kZXgpOworCQl9IGVsc2UgeworCQkJaWYgKGJhSW5kZXggPT0gLTEpIHJlcyA9IGZxbi5zdWJzdHJpbmcoMCwgYnNJbmRleCk7CisJCQllbHNlIHJlcyA9IGZxbi5zdWJzdHJpbmcoMCwgTWF0aC5tYXgoYnNJbmRleCwgYmFJbmRleCkpOworCQl9CisJCXJldHVybiByZXM7CisJfQogCiAJLyoqCiAJICogU2V0cyB0aGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZSBvZiB0aGUgZW50aXR5IGZpZWxkCkBAIC0xMzEsMzAgKzEzMSwyMCBAQAogCSAqIEBwYXJhbSBmcW5UeXBlTmFtZQogCSAqLwogCXB1YmxpYyB2b2lkIHNldEZxblR5cGVOYW1lKFN0cmluZyBmcW5UeXBlTmFtZSkgewotCQl0aGlzLmZxblR5cGVOYW1lID0gZnFuVHlwZU5hbWU7Ci0JCWlmIChmcW5UeXBlTmFtZS5pbmRleE9mKERPVCkgPT0gLTEpIHsKLQkJCXNldFR5cGUoZnFuVHlwZU5hbWUpOwotCQkJc2V0U2ltcGxlVHlwZSh0cnVlKTsKKwkJZnFuVHlwZU5hbWUgPSByZW1vdmVTcGFjZXMoZnFuVHlwZU5hbWUpOworCQlTdHJpbmcgZnFuQmFzaWNUeXBlTmFtZSA9IGdldEJhc2ljRlFOKGZxblR5cGVOYW1lKTsKKwkJaWYgKGZxbkJhc2ljVHlwZU5hbWUuaW5kZXhPZihET1QpID09IC0xKSB7CisJCQlpZiAoVkFMSURfUEtfVFlQRVNfU0hPUlQuY29udGFpbnMoZnFuQmFzaWNUeXBlTmFtZSkpIHsKKwkJCQl0aGlzLmZxblR5cGVOYW1lID0gUEFDS0FHRV9KQVZBX0xBTkcgKyBmcW5UeXBlTmFtZTsKKwkJCQlzZXRUeXBlKGZxblR5cGVOYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5mcW5UeXBlTmFtZSA9IGZxblR5cGVOYW1lOworCQkJCXNldFR5cGUoZnFuVHlwZU5hbWUpOworCQkJfQkJCQogCQl9IGVsc2UgeworCQkJdGhpcy5mcW5UeXBlTmFtZSA9IGZxblR5cGVOYW1lOwogCQkJc2V0VHlwZShnZXRTaW1wbGVOYW1lKGZxblR5cGVOYW1lKSk7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBpcyB0aGUgdHlwZSBvZiB0aGUgZW50aXR5IGZpZWxkIGlzIHByaW1pdGl2ZSB0eXBlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaW1wbGVUeXBlKCkgewotCQlyZXR1cm4gaXNTaW1wbGVUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGUgdGhlIHR5cGUgb2YgdGhlIGVudGl0eSBmaWVsZCBhcyBwcmltaXRpdmUgdHlwZQotCSAqIAotCSAqIEBwYXJhbSBpc1NpbXBsZVR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaW1wbGVUeXBlKGJvb2xlYW4gaXNTaW1wbGVUeXBlKSB7Ci0JCXRoaXMuaXNTaW1wbGVUeXBlID0gaXNTaW1wbGVUeXBlOworCQl9CQkKIAl9CiAKIAkvKioKQEAgLTE3Myw3ICsxNjMsNiBAQAogCSAqLwogCXByaXZhdGUgU3RyaW5nIGdldFNpbXBsZU5hbWUoU3RyaW5nIGZ1bGx5TmFtZSkgewogCQlyZXR1cm4gZnVsbHlOYW1lLnN1YnN0cmluZyhmdWxseU5hbWUubGFzdEluZGV4T2YoRE9UKSArIDEpOwotCiAJfQogCiAJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL29wZXJhdGlvbi9OZXdFbnRpdHlDbGFzc09wZXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9vcGVyYXRpb24vTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24uamF2YQppbmRleCBlOTNhYjMzLi41NDlhYmU5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL29wZXJhdGlvbi9OZXdFbnRpdHlDbGFzc09wZXJhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvb3BlcmF0aW9uL05ld0VudGl0eUNsYXNzT3BlcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDEwICsxMSw5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm9wZXJhdGlvbjsKIAoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKQEAgLTMwLDYgKzI5LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uamV0LkpFVEV4Y2VwdGlvbjsKQEAgLTQxLDM0ICs0MSwzMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUFydGlmYWN0RWRpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUFydGlmYWN0RWRpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LkFubm90YXRlZEVudGl0eVRlbXBsYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5FbnRpdHlUZW1wbGF0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuRW50aXR5V2l6YXJkTXNnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5JZENsYXNzVGVtcGxhdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvbnRyb2xsZXIuQW5ub3RhdGlvbnNDb250cm9sbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uc0NvbnRyb2xsZXJNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuV1RQSkVURW1pdHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247CkBAIC0xMDcsNyArMTA0LDExIEBACiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERFUl9JRCA9ICJidWlsZGVySWQiOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOy8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX1RBQkxFID0gIlNJTkdMRV9UQUJMRSI7Ly8kTk9OLU5MUy0xJAotCisJCisJLyoqCisJICogTWV0aG9kIG5hbWUgb2YgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy4gCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfTUVUSE9EID0gImdlbmVyYXRlIjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCiAJICogVGhpcyBpcyB0aGUgY29uc3RydWN0b3Igd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIE5ld0VudGl0eUNsYXNzT3BlcmF0aW9uLiAKQEAgLTIwMiwyMSArMjAzLDIzIEBACiAJICogQHRocm93cyBXRlRXcmFwcGVkRXhjZXB0aW9uCiAJICovCiAJcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVVc2luZ1RlbXBsYXRlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQYWNrYWdlRnJhZ21lbnQgZnJhZ21lbnQpIHRocm93cyBXRlRXcmFwcGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkgICAgLy8gQ3JlYXRlIHRoZSBmaWx0ZXIgdGVtcGxhdGUgbW9kZWwKKwkgICAgLy8gQ3JlYXRlIHRoZSBlbnRpdHkgdGVtcGxhdGUgbW9kZWwKIAkgICAgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCB0ZW1wTW9kZWwgPSBjcmVhdGVUZW1wbGF0ZU1vZGVsKCk7CiAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRUYXJnZXRQcm9qZWN0KCk7CiAgICAgICAgIFN0cmluZyBlbnRpdHlDbGFzc1NvdXJjZSA9IG51bGw7CiAgICAgICAgIFN0cmluZyBpZENsYXNzU291cmNlID0gbnVsbDsKLSAgICAgICAgLy8gVXNpbmcgdGhlIFdUUEpldEVtaXR0ZXIsIGdlbmVyYXRlIHRoZSBqYXZhIHNvdXJjZSBiYXNlZCBvbiB0aGUgZmlsdGVyIHRlbXBsYXRlIG1vZGVsCisgICAgICAgIC8vIEdlbmVyYXRlIHRoZSBqYXZhIHNvdXJjZSBiYXNlZCBvbiB0aGUgZW50aXR5IHRlbXBsYXRlIG1vZGVscwogICAgICAgICB0cnkgewogICAgICAgICAJaWYgKHRlbXBNb2RlbC5pc0FydGlmYWN0c0Fubm90YXRlZCgpKSB7Ci0gICAgICAgIAkJZW50aXR5Q2xhc3NTb3VyY2UgPSBnZW5lcmF0ZVRlbXBsYXRlU291cmNlKHRlbXBNb2RlbCwgbW9uaXRvciwgQU5OT1RBVEVEX0VOVElUWV9URU1QTEFURV9GSUxFKTsKKyAgICAgICAgCQlBbm5vdGF0ZWRFbnRpdHlUZW1wbGF0ZSB0ZW1wSW1wbCA9IEFubm90YXRlZEVudGl0eVRlbXBsYXRlLmNyZWF0ZShudWxsKTsKKyAgICAgICAgCQllbnRpdHlDbGFzc1NvdXJjZSA9IGdlbmVyYXRlVGVtcGxhdGVTb3VyY2UodGVtcE1vZGVsLCBBTk5PVEFURURfRU5USVRZX1RFTVBMQVRFX0ZJTEUsIHRlbXBJbXBsLCBtb25pdG9yKTsKICAgICAgICAgCX0gZWxzZSB7Ci0gICAgICAgIAkJZW50aXR5Q2xhc3NTb3VyY2UgPSBnZW5lcmF0ZVRlbXBsYXRlU291cmNlKHRlbXBNb2RlbCwgbW9uaXRvciwgRU5USVRZX1RFTVBMQVRFX0ZJTEUpOworICAgICAgICAJCUVudGl0eVRlbXBsYXRlIHRlbXBJbXBsID0gRW50aXR5VGVtcGxhdGUuY3JlYXRlKG51bGwpOworICAgICAgICAJCWVudGl0eUNsYXNzU291cmNlID0gZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZSh0ZW1wTW9kZWwsIEVOVElUWV9URU1QTEFURV9GSUxFLCB0ZW1wSW1wbCwgbW9uaXRvcik7CiAgICAgICAgIAl9CiAgICAgICAgICAgICBpZiAodGVtcE1vZGVsLmlzQ29tcG9zaXRlUEsoKSkgewotICAgICAgICAgICAgCWlkQ2xhc3NTb3VyY2UgPSBnZW5lcmF0ZVRlbXBsYXRlU291cmNlKHRlbXBNb2RlbCwgbW9uaXRvciwgSURDTEFTU19URU1QTEFURV9GSUxFKTsKLSAgICAgICAgICAgIAkKKyAgICAgICAgICAgIAlJZENsYXNzVGVtcGxhdGUgdGVtcEltcGwgPSBJZENsYXNzVGVtcGxhdGUuY3JlYXRlKG51bGwpOworICAgICAgICAgICAgCWlkQ2xhc3NTb3VyY2UgPSBnZW5lcmF0ZVRlbXBsYXRlU291cmNlKHRlbXBNb2RlbCwgSURDTEFTU19URU1QTEFURV9GSUxFLCB0ZW1wSW1wbCwgbW9uaXRvcik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgV0ZUV3JhcHBlZEV4Y2VwdGlvbihlKTsKQEAgLTI1MCwxMyArMjUzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICBpZiAoIXRlbXBNb2RlbC5pc0FydGlmYWN0c0Fubm90YXRlZCgpKSB7CiAgICAgICAgIAlpZiAodGVtcE1vZGVsLmlzTm9uRW50aXR5U3VwZXJjbGFzcygpKSB7IAotICAgICAgICAJCWFkZE1hcHBlZFN1cGVyY2xhc3NUb1hMTSh0ZW1wTW9kZWwsIHByb2plY3QpLnNjaGVkdWxlKCk7CisgICAgICAgIAkJYWRkTWFwcGVkU3VwZXJjbGFzc1RvWE1MKHRlbXBNb2RlbCwgcHJvamVjdCkuc2NoZWR1bGUoKTsKICAgICAgICAgCX0gZWxzZSB7CiAgICAgICAgIAkJYWRkRW50aXR5VG9YTUwodGVtcE1vZGVsLCBwcm9qZWN0KS5zY2hlZHVsZSgpOwogICAgICAgICAJfQogICAgICAgICB9Ci0gICAgICAgIGlmICghdGVtcE1vZGVsLmlzTWFwcGluZ1hNTERlZmF1bHQoKSB8fCAhSnB0Q29yZVBsdWdpbi5kaXNjb3ZlckFubm90YXRlZENsYXNzZXMocHJvamVjdCkpIHsKLSAgICAgICAgCXJlZ2lzdGVyTWFwcGluZ1hNTCh0ZW1wTW9kZWwsIHByb2plY3QpLnNjaGVkdWxlKCk7CisgICAgICAgIGlmICh0ZW1wTW9kZWwuaXNBcnRpZmFjdHNBbm5vdGF0ZWQoKSAmJiAhSnB0Q29yZVBsdWdpbi5kaXNjb3ZlckFubm90YXRlZENsYXNzZXMocHJvamVjdCkpIHsKKyAgICAgICAgCXJlZ2lzdGVyQ2xhc3NJblBlcnNpc3RlbmNlWG1sKHRlbXBNb2RlbCwgcHJvamVjdCkuc2NoZWR1bGUoKTsKICAgICAgICAgfQogCX0KIApAQCAtMjg4LDE5ICsyOTEsMzEgQEAKICAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3RbXSkKICAgICAgKiBAc2VlIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwKICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVtcE1vZGVsCisgICAgICogQHBhcmFtIHRlbXBsYXRlTW9kZWwKICAgICAgKiBAcGFyYW0gbW9uaXRvcgogICAgICAqIEBwYXJhbSB0ZW1wbGF0ZV9maWxlIAogICAgICAqIEByZXR1cm4gU3RyaW5nIHRoZSBzb3VyY2UgZm9yIHRoZSBqYXZhIGZpbGUKICAgICAgKiBAdGhyb3dzIEpFVEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIAorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gCisgICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiAgCiAgICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZShDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIHRlbXBNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgdGVtcGxhdGVfZmlsZSkgdGhyb3dzIEpFVEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCB0ZW1wbGF0ZVVSTCA9IEZpbGVMb2NhdG9yLmZpbmQoSnB0VWlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCksIG5ldyBQYXRoKHRlbXBsYXRlX2ZpbGUpLCBudWxsKTsKLSAgICAgICAgY2xlYW5VcE9sZEVtaXR0ZXJQcm9qZWN0KCk7Ci0gICAgICAgIFdUUEpFVEVtaXR0ZXIgZW1pdHRlciA9IG5ldyBXVFBKRVRFbWl0dGVyKHRlbXBsYXRlVVJMLnRvU3RyaW5nKCksIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgZW1pdHRlci5zZXRJbnRlbGxpZ2VudExpbmtpbmdFbmFibGVkKHRydWUpOwotICAgICAgICBlbWl0dGVyLmFkZFZhcmlhYmxlKFdUUF9DVVNUT01JWkFUSU9OX1BMVUdJTiwgSnB0VWlQbHVnaW4uUExVR0lOX0lEKTsKLSAgICAgICAgcmV0dXJuIGVtaXR0ZXIuZ2VuZXJhdGUobW9uaXRvciwgbmV3IE9iamVjdFtdIHsgdGVtcE1vZGVsIH0pOworICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlVGVtcGxhdGVTb3VyY2UoQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCB0ZW1wbGF0ZU1vZGVsLCBTdHJpbmcgdGVtcGxhdGVGaWxlLCBPYmplY3QgdGVtcGxhdGVJbXBsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIAorICAgIAkJdGhyb3dzIEpFVEV4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisgICAgCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJYm9vbGVhbiBkeW5hbWljVHJhbnNsYXRpb24gPSBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEoyRUVQbHVnaW4uRFlOQU1JQ19UUkFOU0xBVElPTl9PRl9KRVRfVEVNUExBVEVTX1BSRUZfS0VZKTsKKwkJaWYgKGR5bmFtaWNUcmFuc2xhdGlvbikgeworCSAgICAgICAgVVJMIHRlbXBsYXRlVVJMID0gRmlsZUxvY2F0b3IuZmluZChKcHRVaVBsdWdpbi5pbnN0YW5jZSgpLmdldEJ1bmRsZSgpLCBuZXcgUGF0aCh0ZW1wbGF0ZUZpbGUpLCBudWxsKTsKKwkgICAgICAgIGNsZWFuVXBPbGRFbWl0dGVyUHJvamVjdCgpOworCSAgICAgICAgV1RQSkVURW1pdHRlciBlbWl0dGVyID0gbmV3IFdUUEpFVEVtaXR0ZXIodGVtcGxhdGVVUkwudG9TdHJpbmcoKSwgdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOworCSAgICAgICAgZW1pdHRlci5zZXRJbnRlbGxpZ2VudExpbmtpbmdFbmFibGVkKHRydWUpOworCSAgICAgICAgZW1pdHRlci5hZGRWYXJpYWJsZShXVFBfQ1VTVE9NSVpBVElPTl9QTFVHSU4sIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCk7CisJICAgICAgICByZXR1cm4gZW1pdHRlci5nZW5lcmF0ZShtb25pdG9yLCBuZXcgT2JqZWN0W10geyB0ZW1wbGF0ZU1vZGVsIH0pOworCQl9IGVsc2UgeworCQkJTWV0aG9kIG1ldGhvZCA9IHRlbXBsYXRlSW1wbC5nZXRDbGFzcygpLmdldE1ldGhvZChHRU5FUkFURV9NRVRIT0QsIG5ldyBDbGFzc1tdIHsgT2JqZWN0LmNsYXNzIH0pOworCQkJcmV0dXJuIChTdHJpbmcpIG1ldGhvZC5pbnZva2UodGVtcGxhdGVJbXBsLCB0ZW1wbGF0ZU1vZGVsKTsKKwkJfQogICAgIH0KICAgICAKIAkvKioKQEAgLTM3Myw3NCArMzg4LDM0IEBACiAJCUpvYiBqb2IgPSBuZXcgSm9iKEVudGl0eVdpemFyZE1zZy5BRERfRU5USVRZX1RPX1hNTCkgewogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJT3JtQXJ0aWZhY3RFZGl0IG9hZSA9IE9ybUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCQl0cnkgewkJCQkJCi0JCQkJCVN0cmluZyB4bWxVcmkgPSBKcHRDb3JlUGx1Z2luLmdldERlZmF1bHRPcm1YbWxEZXBsb3ltZW50VVJJKHByb2plY3QpOwotCQkJCQlPcm1SZXNvdXJjZSByZXNvdXJjZSA9IG9hZS5nZXRSZXNvdXJjZSh4bWxVcmkpOwotCQkJCQlpZiAoIW1vZGVsLmlzTWFwcGluZ1hNTERlZmF1bHQoKSkgewotCQkJCQkJcmVzb3VyY2UgPSBvYWUuZ2V0UmVzb3VyY2UobW9kZWwuZ2V0TWFwcGluZ1htbEZpbGUoKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCVhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gcmVzb3VyY2UuZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJCQkJaWYgKGVudGl0eU1hcHBpbmdzID09IG51bGwpIHsKLQkJCQkJCWVudGl0eU1hcHBpbmdzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJCQkJCWVudGl0eU1hcHBpbmdzLnNldFZlcnNpb24oVkVSU0lPTl9TVFJJTkcpOwotCQkJCQl9CisJCQkJZmluYWwgSnBhWG1sUmVzb3VyY2UgeG1sUmVzb3VyY2UgPSBnZXRPcm1YbWxSZXNvdXJjZShtb2RlbCwgcHJvamVjdCk7CisJCQkJRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSAoRW50aXR5TWFwcGluZ3MpIEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KS5nZXRKcGFGaWxlKHhtbFJlc291cmNlLmdldEZpbGUoKSkucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpOworCQkJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIG1vZGVsLmdldFF1YWxpZmllZEphdmFDbGFzc05hbWUoKSk7CisJCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJCQlpZiAobW9kZWwuaXNJbmhlcml0YW5jZVNldCgpKSB7CisJCQkJCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KGdldE1vZGVsSW5oZXJpdGFuY2VUeXBlKG1vZGVsKSk7CisJCQkJfQorCQkJCQorCQkJCWlmIChtb2RlbC5pc0VudGl0eU5hbWVTZXQoKSkgeworCQkJCQllbnRpdHkuc2V0U3BlY2lmaWVkTmFtZShtb2RlbC5nZXRFbnRpdHlOYW1lKCkpOworCQkJCX0KKwkJCQlpZiAobW9kZWwuaXNUYWJsZU5hbWVTZXQoKSkgeworCQkJCQllbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG1vZGVsLmdldFRhYmxlTmFtZSgpKTsKKwkJCQl9CisJCQkJaWYgKG1vZGVsLmlzQ29tcG9zaXRlUEsoKSkgeworCQkJCQllbnRpdHkuc2V0SWRDbGFzcyhtb2RlbC5nZXRJZENsYXNzTmFtZSgpKTsKKwkJCQl9CisJCQkJZm9yIChTdHJpbmcgZmllbGROYW1lIDogbW9kZWwuZ2V0UEtGaWVsZHMoKSkgeworCQkJCQlwZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgZmllbGROYW1lKTsKKwkJCQl9CiAKLQkJCQkJWG1sRW50aXR5IHhtbEVudGl0eSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVudGl0eSgpOwotCQkJCQl4bWxFbnRpdHkuc2V0Q2xhc3NOYW1lKG1vZGVsLmdldFF1YWxpZmllZEphdmFDbGFzc05hbWUoKSk7Ci0JCQkJCWlmIChtb2RlbC5pc0luaGVyaXRhbmNlU2V0KCkpIHsKLQkJCQkJCUluaGVyaXRhbmNlIGluaGVyaXRhbmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5oZXJpdGFuY2UoKTsKLQkJCQkJCVN0cmluZyBpbmhlcml0YW5jZVN0cmF0ZWd5ID0gbW9kZWwuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneU5hbWUoKTsKLQkJCQkJCWlmIChpbmhlcml0YW5jZVN0cmF0ZWd5LmVxdWFscyhFTVBUWV9TVFJJTkcpKSB7Ci0JCQkJCQkJaW5oZXJpdGFuY2VTdHJhdGVneSA9IFNJTkdMRV9UQUJMRTsKLQkJCQkJCX0KLQkJCQkJCUluaGVyaXRhbmNlVHlwZSBpbmhlcml0YW5jZVR5cGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbmhlcml0YW5jZVR5cGVGcm9tU3RyaW5nKG51bGwsIGluaGVyaXRhbmNlU3RyYXRlZ3kpOy8vIFRPRE8KLQkJCQkJCWluaGVyaXRhbmNlLnNldFN0cmF0ZWd5KGluaGVyaXRhbmNlVHlwZSk7Ci0JCQkJCQl4bWxFbnRpdHkuc2V0SW5oZXJpdGFuY2UoaW5oZXJpdGFuY2UpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKG1vZGVsLmlzRW50aXR5TmFtZVNldCgpKSB7Ci0JCQkJCQl4bWxFbnRpdHkuc2V0TmFtZShtb2RlbC5nZXRFbnRpdHlOYW1lKCkpOwotCQkJCQl9Ci0JCQkJCWlmIChtb2RlbC5pc1RhYmxlTmFtZVNldCgpKSB7Ci0JCQkJCQlYbWxUYWJsZSB4bWxUYWJsZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlKCk7Ci0JCQkJCQl4bWxUYWJsZS5zZXROYW1lKG1vZGVsLmdldFRhYmxlTmFtZSgpKTsKLQkJCQkJCXhtbEVudGl0eS5zZXRUYWJsZSh4bWxUYWJsZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKG1vZGVsLmlzQ29tcG9zaXRlUEsoKSkgewotCQkJCQkJWG1sSWRDbGFzcyBpZENsYXNzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSWRDbGFzcygpOwotCQkJCQkJaWRDbGFzcy5zZXRDbGFzc05hbWUobW9kZWwuZ2V0SWRDbGFzc05hbWUoKSk7Ci0JCQkJCQl4bWxFbnRpdHkuc2V0SWRDbGFzcyhpZENsYXNzKTsKLQkJCQkJfQotCQkJCQlMaXN0PFN0cmluZz4gcGtGaWVsZHMgPSBtb2RlbC5nZXRQS0ZpZWxkcygpOwotCQkJCQlpZiAocGtGaWVsZHMuc2l6ZSgpID4gMCkgewotCQkJCQkJQXR0cmlidXRlcyBlbnRpdHlBdHRyaWJ1dGVzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0cmlidXRlcygpOwotCQkJCQkJTGlzdDxYbWxJZEltcGw+IGlkcyA9IG5ldyBBcnJheUxpc3Q8WG1sSWRJbXBsPigpOwotCQkJCQkJZm9yIChTdHJpbmcgZmllbGROYW1lIDogcGtGaWVsZHMpIHsKLQkJCQkJCQlYbWxJZEltcGwgaWRJbXBsID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSWRJbXBsKCk7Ci0JCQkJCQkJaWRJbXBsLnNldE5hbWUoZmllbGROYW1lKTsKLQkJCQkJCQlpZHMuYWRkKGlkSW1wbCk7Ci0JCQkJCQl9Ci0JCQkJCQllbnRpdHlBdHRyaWJ1dGVzLmVTZXQoT3JtUGFja2FnZS5BVFRSSUJVVEVTX19JRFMsIGlkcyk7Ci0JCQkJCQl4bWxFbnRpdHkuc2V0QXR0cmlidXRlcyhlbnRpdHlBdHRyaWJ1dGVzKTsKLQkJCQkJfQotCi0JCQkJCVN0cmluZyBhY2Nlc3NUeXBlU3RyaW5nID0gRklFTEQ7Ci0JCQkJCWlmICghbW9kZWwuaXNGaWVsZEFjY2VzcygpKSB7Ci0JCQkJCQlhY2Nlc3NUeXBlU3RyaW5nID0gUFJPUEVSVFk7Ci0JCQkJCX0KLQkJCQkJQWNjZXNzVHlwZSBhY2Nlc3NUeXBlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWNjZXNzVHlwZUZyb21TdHJpbmcobnVsbCwgYWNjZXNzVHlwZVN0cmluZyk7Ly8gVE9ETwotCQkJCQl4bWxFbnRpdHkuc2V0QWNjZXNzKGFjY2Vzc1R5cGUpOwotCQkJCQlFTGlzdDxYbWxFbnRpdHk+IGVudGl0aWVzID0gZW50aXR5TWFwcGluZ3MuZ2V0RW50aXRpZXMoKTsKLQkJCQkJZW50aXRpZXMuYWRkKHhtbEVudGl0eSk7Ci0JCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGVudGl0eU1hcHBpbmdzKTsKLQkJCQkJb2FlLnNhdmUobnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlwZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoZ2V0TW9kZWxBY2Nlc3NUeXBlKG1vZGVsKSk7CisJCQkJCisJCQkJdHJ5IHsKKwkJCQkJeG1sUmVzb3VyY2Uuc2F2ZUlmTmVjZXNzYXJ5KCk7CisJCQkJfQorCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQkJCW9hZS5kaXNwb3NlKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJb2FlLmRpc3Bvc2UoKTsKIAkJCQl9CiAJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CiAJCQl9CkBAIC00NDgsNiArNDIzLDEzIEBACiAJCXJldHVybiBqb2I7CiAJfQogCisJcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIGdldE9ybVhtbFJlc291cmNlKENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgbW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKKwkJaWYgKG1vZGVsLmlzTWFwcGluZ1hNTERlZmF1bHQoKSkgeworCQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKKwkJfQorCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UobW9kZWwuZ2V0TWFwcGluZ1hNTE5hbWUoKSk7CisJfQorCQogCS8qKgogCSAqIEFkZHMgbWFwcGVkIHN1cGVyY2xhc3MgdG8gT1JNIFhNTCBpbiBzZXBhcmF0ZSBqb2IKIAkgKiAKQEAgLTQ1NSw2MCArNDM3LDMwIEBACiAJICogQHBhcmFtIHByb2plY3QgSlBBIHByb2plY3QgaW4gd2hpY2ggdGhlIGVudGl0eSB3aWxsIGJlIGNyZWF0ZWQKIAkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGpvYgogCSAqLwotCXByaXZhdGUgSm9iIGFkZE1hcHBlZFN1cGVyY2xhc3NUb1hMTShmaW5hbCBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7CisJcHJpdmF0ZSBKb2IgYWRkTWFwcGVkU3VwZXJjbGFzc1RvWE1MKGZpbmFsIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgbW9kZWwsIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKIAkJSm9iIGpvYiA9IG5ldyBKb2IoRW50aXR5V2l6YXJkTXNnLkFERF9NQVBQRURfU1VQRVJDTEFTU19UT19YTUwpIHsKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCU9ybUFydGlmYWN0RWRpdCBvYWUgPSBPcm1BcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7CisJCQkJZmluYWwgSnBhWG1sUmVzb3VyY2UgeG1sUmVzb3VyY2UgPSBnZXRPcm1YbWxSZXNvdXJjZShtb2RlbCwgcHJvamVjdCk7CisJCQkJRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSAoRW50aXR5TWFwcGluZ3MpIEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KS5nZXRKcGFGaWxlKHhtbFJlc291cmNlLmdldEZpbGUoKSkucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpOworCQkJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgbW9kZWwuZ2V0UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpKTsKKwkJCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQkJCQorCQkJCWlmIChtb2RlbC5pc0NvbXBvc2l0ZVBLKCkpIHsKKwkJCQkJbWFwcGVkU3VwZXJjbGFzcy5zZXRJZENsYXNzKG1vZGVsLmdldElkQ2xhc3NOYW1lKCkpOworCQkJCX0KKwkJCQkKKwkJCQlmb3IgKFN0cmluZyBmaWVsZE5hbWUgOiBtb2RlbC5nZXRQS0ZpZWxkcygpKSB7CisJCQkJCXBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBmaWVsZE5hbWUpOworCQkJCX0KKworCQkJCXBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhnZXRNb2RlbEFjY2Vzc1R5cGUobW9kZWwpKTsKKwkJCQkKIAkJCQl0cnkgewotCQkJCQkvL09ybVJlc291cmNlIHJlc291cmNlID0gb2FlLmdldFJlc291cmNlKEpwdENvcmVQbHVnaW4ub3JtWG1sRGVwbG95bWVudFVSSShwcm9qZWN0KSk7Ci0JCQkJCVN0cmluZyB4bWxVcmkgPSBKcHRDb3JlUGx1Z2luLmdldERlZmF1bHRPcm1YbWxEZXBsb3ltZW50VVJJKHByb2plY3QpOwotCQkJCQlpZiAoIW1vZGVsLmlzTWFwcGluZ1hNTERlZmF1bHQoKSkgewotCQkJCQkJeG1sVXJpID0gbW9kZWwuZ2V0TWFwcGluZ1hNTE5hbWUoKTsKLQkJCQkJfQotCQkJCQlPcm1SZXNvdXJjZSByZXNvdXJjZSA9IG9hZS5nZXRSZXNvdXJjZSh4bWxVcmkpOwotCQkJCQlYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IHJlc291cmNlLmdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCQkJCWlmIChlbnRpdHlNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQkJCQllbnRpdHlNYXBwaW5ncyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCQkJCQllbnRpdHlNYXBwaW5ncy5zZXRWZXJzaW9uKFZFUlNJT05fU1RSSU5HKTsKLQkJCQkJfQotCi0JCQkJCVhtbE1hcHBlZFN1cGVyY2xhc3MgeG1sTWFwcGVkU3VwZXJjbGFzcyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJCQkJeG1sTWFwcGVkU3VwZXJjbGFzcy5zZXRDbGFzc05hbWUobW9kZWwuZ2V0UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpKTsKLQkJCQkJCi0JCQkJCWlmIChtb2RlbC5pc0NvbXBvc2l0ZVBLKCkpIHsKLQkJCQkJCVhtbElkQ2xhc3MgaWRDbGFzcyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbElkQ2xhc3MoKTsKLQkJCQkJCWlkQ2xhc3Muc2V0Q2xhc3NOYW1lKG1vZGVsLmdldElkQ2xhc3NOYW1lKCkpOwotCQkJCQkJeG1sTWFwcGVkU3VwZXJjbGFzcy5zZXRJZENsYXNzKGlkQ2xhc3MpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlMaXN0PFN0cmluZz4gcGtGaWVsZHMgPSBtb2RlbC5nZXRQS0ZpZWxkcygpOwotCQkJCQlpZiAocGtGaWVsZHMuc2l6ZSgpID4gMCkgewotCQkJCQkJQXR0cmlidXRlcyBlbnRpdHlBdHRyaWJ1dGVzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0cmlidXRlcygpOwotCQkJCQkJTGlzdDxYbWxJZEltcGw+IGlkcyA9IG5ldyBBcnJheUxpc3Q8WG1sSWRJbXBsPigpOwotCQkJCQkJZm9yIChTdHJpbmcgZmllbGROYW1lIDogcGtGaWVsZHMpIHsKLQkJCQkJCQlYbWxJZEltcGwgaWRJbXBsID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSWRJbXBsKCk7Ci0JCQkJCQkJaWRJbXBsLnNldE5hbWUoZmllbGROYW1lKTsKLQkJCQkJCQlpZHMuYWRkKGlkSW1wbCk7Ci0JCQkJCQl9Ci0JCQkJCQllbnRpdHlBdHRyaWJ1dGVzLmVTZXQoT3JtUGFja2FnZS5BVFRSSUJVVEVTX19JRFMsIGlkcyk7Ci0JCQkJCQl4bWxNYXBwZWRTdXBlcmNsYXNzLnNldEF0dHJpYnV0ZXMoZW50aXR5QXR0cmlidXRlcyk7Ci0JCQkJCX0KLQotCQkJCQlTdHJpbmcgYWNjZXNzVHlwZVN0cmluZyA9IEZJRUxEOwotCQkJCQlpZiAoIW1vZGVsLmlzRmllbGRBY2Nlc3MoKSkgewotCQkJCQkJYWNjZXNzVHlwZVN0cmluZyA9IFBST1BFUlRZOwotCQkJCQl9Ci0JCQkJCUFjY2Vzc1R5cGUgYWNjZXNzVHlwZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjY2Vzc1R5cGVGcm9tU3RyaW5nKG51bGwsIGFjY2Vzc1R5cGVTdHJpbmcpOwotCQkJCQl4bWxNYXBwZWRTdXBlcmNsYXNzLnNldEFjY2VzcyhhY2Nlc3NUeXBlKTsKLQkJCQkJZW50aXR5TWFwcGluZ3MuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuYWRkKHhtbE1hcHBlZFN1cGVyY2xhc3MpOwotCQkJCQkKLQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZW50aXR5TWFwcGluZ3MpOwotCQkJCQlvYWUuc2F2ZShudWxsKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQl4bWxSZXNvdXJjZS5zYXZlSWZOZWNlc3NhcnkoKTsKKwkJCQl9CisJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAJCQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlvYWUuZGlzcG9zZSgpOwogCQkJCX0KIAkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKIAkJCX0KQEAgLTUxNiw1MSArNDY4LDQ5IEBACiAJCXJldHVybiBqb2I7CQkKIAl9CiAJCisJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZ2V0TW9kZWxBY2Nlc3NUeXBlKENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgbW9kZWwpIHsKKwkJU3RyaW5nIGFjY2Vzc1R5cGVTdHJpbmcgPSBGSUVMRDsKKwkJaWYgKCFtb2RlbC5pc0ZpZWxkQWNjZXNzKCkpIHsKKwkJCWFjY2Vzc1R5cGVTdHJpbmcgPSBQUk9QRVJUWTsKKwkJfQorCQlyZXR1cm4gQWNjZXNzVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY2Nlc3NUeXBlRnJvbVN0cmluZyhudWxsLCBhY2Nlc3NUeXBlU3RyaW5nKSk7Ly8gVE9ETworCX0KKworCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgZ2V0TW9kZWxJbmhlcml0YW5jZVR5cGUoQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBtb2RlbCkgeworCQlTdHJpbmcgaW5oZXJpdGFuY2VTdHJhdGVneSA9IG1vZGVsLmdldEluaGVyaXRhbmNlU3RyYXRlZ3lOYW1lKCk7CisJCWlmIChpbmhlcml0YW5jZVN0cmF0ZWd5LmVxdWFscyhFTVBUWV9TVFJJTkcpKSB7CisJCQlpbmhlcml0YW5jZVN0cmF0ZWd5ID0gU0lOR0xFX1RBQkxFOworCQl9CisJCXJldHVybiBJbmhlcml0YW5jZVR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5oZXJpdGFuY2VUeXBlRnJvbVN0cmluZyhudWxsLCBpbmhlcml0YW5jZVN0cmF0ZWd5KSk7Ly9UT0RPCisJfQorCiAJLyoqCi0JICogUmVnaXN0ZXIgYWx0ZXJuYXRpdmUgbWFwcGluZyBYTUwgYW5kL29yIGNsYXNzZXMgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAorCSAqIFJlZ2lzdCB0aGUgY2xhc3MgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAogCSAqIAogCSAqIEBwYXJhbSBtb2RlbCBlbnRpdHkgZGF0YSBtb2RlbAogCSAqIEBwYXJhbSBwcm9qZWN0IEpQQSBwcm9qZWN0IGluIHdoaWNoIHRoZSBlbnRpdHkgd2lsbCBiZSBjcmVhdGVkCiAJICogQHJldHVybiB0aGUgY3JlYXRlZCBqb2IKIAkgKi8KLQlwcml2YXRlIEpvYiByZWdpc3Rlck1hcHBpbmdYTUwoZmluYWwgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBtb2RlbCwgZmluYWwgSVByb2plY3QgcHJvamVjdCkgeworCXByaXZhdGUgSm9iIHJlZ2lzdGVyQ2xhc3NJblBlcnNpc3RlbmNlWG1sKGZpbmFsIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgbW9kZWwsIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKIAkJSm9iIGpvYiA9IG5ldyBKb2IoRW50aXR5V2l6YXJkTXNnLkFQUExZX0NIQU5HRVNfVE9fUEVSU0lTVEVOQ0VfWE1MKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRMYXN0U2VnbWVudChtb2RlbC5nZXRNYXBwaW5nWE1MTmFtZSgpKTsKLQkJCQlQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCBwYWUgPSBQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCQl0cnkgewotCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlIHBlcnNpc3RlbmNlUmVzb3VyY2UgPSBwYWUuZ2V0UmVzb3VyY2UoSnB0Q29yZVBsdWdpbi5nZXRQZXJzaXN0ZW5jZVhtbERlcGxveW1lbnRVUkkocHJvamVjdCkpOwotCQkJCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlUmVzb3VyY2UuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJCQkJRUxpc3Q8WG1sUGVyc2lzdGVuY2VVbml0PiBwZXJzaXN0ZW5jZVVuaXRzID0geG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpOwotCQkJCQlYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0cy5nZXQoMCk7Ly8gTXVsdGlwbHkgcGVyc2lzdGVuY2UgdW5pdCBzdXBwb3J0Ci0JCQkJCWlmICghbW9kZWwuaXNNYXBwaW5nWE1MRGVmYXVsdCgpKSB7Ci0JCQkJCQlib29sZWFuIG5ld1htbE1hcHBpbmdGaWxlID0gdHJ1ZTsKLQkJCQkJCUVMaXN0PFhtbE1hcHBpbmdGaWxlUmVmPiB4bWxNYXBwaW5nRmlsZXMgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCk7Ci0JCQkJCQlmb3IgKFhtbE1hcHBpbmdGaWxlUmVmIGZpbGVSZWYgOiB4bWxNYXBwaW5nRmlsZXMpIHsKLQkJCQkJCQlpZiAoZmlsZU5hbWUuZXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSkpIHsKLQkJCQkJCQkJbmV3WG1sTWFwcGluZ0ZpbGUgPSBmYWxzZTsKLQkJCQkJCQkJYnJlYWs7CisJCQkJZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpOworCQkJCWZpbmFsIEpwYVhtbFJlc291cmNlIHJlc291cmNlID0ganBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7CisJCQkJcmVzb3VyY2UubW9kaWZ5KG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IChYbWxQZXJzaXN0ZW5jZSkgcmVzb3VyY2UuZ2V0Um9vdE9iamVjdCgpOworCQkJCQkJCUVMaXN0PFhtbFBlcnNpc3RlbmNlVW5pdD4gcGVyc2lzdGVuY2VVbml0cyA9IHhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKTsKKwkJCQkJCQlYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0cy5nZXQoMCk7Ly8gTXVsdGlwbHkgcGVyc2lzdGVuY2UgdW5pdCBzdXBwb3J0CisJCQkJCQkJCisJCQkJCQkJaWYgKCFtb2RlbC5pc05vbkVudGl0eVN1cGVyY2xhc3MoKSkgeworCQkJCQkJCQlYbWxKYXZhQ2xhc3NSZWYgY2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOworCQkJCQkJCQljbGFzc1JlZi5zZXRKYXZhQ2xhc3MobW9kZWwuZ2V0UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpKTsKKwkJCQkJCQkJcGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoY2xhc3NSZWYpOwogCQkJCQkJCX0KLQkJCQkJCX0JCQkJCQkKLQkJCQkJCWlmIChuZXdYbWxNYXBwaW5nRmlsZSkgewotCQkJCQkJCVhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQkJCQkJCXhtbE1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKLQkJCQkJCQlwZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKHhtbE1hcHBpbmdGaWxlUmVmKTsKIAkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIW1vZGVsLmlzTm9uRW50aXR5U3VwZXJjbGFzcygpICYmICFKcHRDb3JlUGx1Z2luLmRpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlcyhwcm9qZWN0KSkgewotCQkJCQkJWG1sSmF2YUNsYXNzUmVmIGNsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJCQkJCWNsYXNzUmVmLnNldEphdmFDbGFzcyhtb2RlbC5nZXRRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkpOwotCQkJCQkJcGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoY2xhc3NSZWYpOwotCQkJCQl9Ci0JCQkJCXBlcnNpc3RlbmNlUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoeG1sUGVyc2lzdGVuY2UpOwotCQkJCQlwYWUuc2F2ZShudWxsKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcGFlLmRpc3Bvc2UoKTsKLQkJCQl9CisJCQkJCX0pOworCQkJCQogCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwogCQkJfQogCQl9OwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQXNzb2NpYXRpb25GaWd1cmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0Fzc29jaWF0aW9uRmlndXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5OWUxNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0Fzc29jaWF0aW9uRmlndXJlLmphdmEKQEAgLTAsMCArMSwyMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5DaG9wYm94QW5jaG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkVuZHBvaW50TG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5Z29uRGVjb3JhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVDb25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7CisKKworY2xhc3MgQXNzb2NpYXRpb25GaWd1cmUgZXh0ZW5kcyBCdXR0b24geworCQorCUNvbG9yIGVuYWJsZWRDb2xvciA9IG5ldyBDb2xvciggbnVsbCwgMTQsNjYsMTE1KTsKKwlDb2xvciBkaXNhYmxlZExpbmVDb2xvciA9IG5ldyBDb2xvciggbnVsbCwgMTkyLDIxNSwyMzEpOworCUNvbG9yIHNlbGVjdGVkQ29sb3IgPSBuZXcgQ29sb3IoIG51bGwsIDIzMiwyMzIsMjMyICk7CisKKwlDb2xvciBzZWxlY3RlZEJvcmRlckNvbG9yID0gbmV3IENvbG9yKCBudWxsLCAxNCw2NiwxMTUgKTsKKwlMaW5lQm9yZGVyIHNlbGVjdGVkQm9yZGVyID0gbmV3IExpbmVCb3JkZXIoIHNlbGVjdGVkQm9yZGVyQ29sb3IsIDIgKTsKKwlMaW5lQm9yZGVyIHVuc2VsZWN0ZWRCb3JkZXIgPSBuZXcgTGluZUJvcmRlciggQ29sb3JDb25zdGFudHMubGlnaHRHcmF5LCAxICk7CisJRm9udCBkZXNjcmlwdGlvbkZvbnQgPSBuZXcgRm9udChudWxsLCAiQXJpYWwiLCA4LCBTV1QuTk9ORSk7CisJCisJLyoqCisJICogVGhlIG1vZGVsIGJlaGluZCB0aGUgdGhlIHZpZXcgb2JqZWN0CisJICovCisJQXNzb2NpYXRpb24gYXNzb2NpYXRpb247CisJVGFibGVGaWd1cmUgdGFibGVGaWcxOworCVRhYmxlRmlndXJlIHRhYmxlRmlnMjsKKwlQb2x5bGluZUNvbm5lY3Rpb24gY29ubmVjdGlvbiA7CisJCisJUG9seWdvbkRlY29yYXRpb24gcmVmZXJyZXJEZWNvcmF0aW9uIDsJCisJUG9seWdvbkRlY29yYXRpb24gcmVmZXJlbmNlZERlY29yYXRpb24gOworCisJTGFiZWwgcmVmZXJlbmNlZExhYmVsIDsKKwlMYWJlbCByZWZlcnJlckxhYmVsIDsKKwlMYWJlbCBkZXNjcmlwdGlvbkxhYmVsIDsKKwkKKwlBc3NvY2lhdGlvbkZpZ3VyZShBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbikgeworCQl0aGlzLmFzc29jaWF0aW9uID0gYXNzb2NpYXRpb247CisJCQorCQlYWUxheW91dCBjb250ZW50c0xheW91dCA9IG5ldyBYWUxheW91dCgpOworCQlzZXRMYXlvdXRNYW5hZ2VyKGNvbnRlbnRzTGF5b3V0KTsKKwkJc2V0Qm9yZGVyKCB1bnNlbGVjdGVkQm9yZGVyICk7CisKKwkJLy9DcmVhdGUgdGhlIGZpZ3VyZXMgZm9yIHJlZmVycmVyIHRhYmxlIGFuZCByZWZlcmVuY2VkIHRhYmxlCisJCXRhYmxlRmlnMSA9IG5ldyBUYWJsZUZpZ3VyZSggYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJUYWJsZSgpLmdldE5hbWUoKSApOyAKKwkJdGFibGVGaWcyID0gbmV3IFRhYmxlRmlndXJlKCBhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXROYW1lKCkgKTsgCisJCQorCQljb250ZW50c0xheW91dC5zZXRDb25zdHJhaW50KHRhYmxlRmlnMSwgbmV3IFJlY3RhbmdsZSgxMCwxMCwxNTAsMjApKTsKKwkJY29udGVudHNMYXlvdXQuc2V0Q29uc3RyYWludCh0YWJsZUZpZzIsIG5ldyBSZWN0YW5nbGUoMjgwLCAxMCwgMTUwLCAyMCkpOworCisJCWNvbm5lY3Rpb24gPSBkcmF3Q29ubmVjdGlvbih0YWJsZUZpZzEsIHRhYmxlRmlnMik7CisKKwkJYWRkKHRhYmxlRmlnMSk7CisJCWFkZCh0YWJsZUZpZzIpOworCQlhZGQoY29ubmVjdGlvbik7CisJCQorCisJCWRlc2NyaXB0aW9uTGFiZWwgPSBuZXcgTGFiZWwoIiIpOworCQljb250ZW50c0xheW91dC5zZXRDb25zdHJhaW50KGRlc2NyaXB0aW9uTGFiZWwsIG5ldyBSZWN0YW5nbGUoMTAsMzAsLTEsLTEpKTsKKwkJZGVzY3JpcHRpb25MYWJlbC5zZXRGb250KCBkZXNjcmlwdGlvbkZvbnQgKTsgCisJCWFkZChkZXNjcmlwdGlvbkxhYmVsKTsKKworCQkvL3NldCB3aGl0ZSBiYWNrZ3JvdW5kCisJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKKwkJCisJCXVwZGF0ZSgpOworCQkKKwl9CisKKwlwcml2YXRlIFBvbHlsaW5lQ29ubmVjdGlvbiBkcmF3Q29ubmVjdGlvbihUYWJsZUZpZ3VyZSB0YWJsZUZpZzEsCisJCQlUYWJsZUZpZ3VyZSB0YWJsZUZpZzIpIHsKKwkJLyogQ3JlYXRpbmcgdGhlIGNvbm5lY3Rpb24gKi8KKwkJUG9seWxpbmVDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBuZXcgUG9seWxpbmVDb25uZWN0aW9uKCk7CisJCUNob3Bib3hBbmNob3Igc291cmNlQW5jaG9yID0gbmV3IENob3Bib3hBbmNob3IodGFibGVGaWcxKTsKKwkJQ2hvcGJveEFuY2hvciB0YXJnZXRBbmNob3IgPSBuZXcgQ2hvcGJveEFuY2hvcih0YWJsZUZpZzIpOworCQljb25uZWN0aW9uLnNldFNvdXJjZUFuY2hvcihzb3VyY2VBbmNob3IpOworCQljb25uZWN0aW9uLnNldFRhcmdldEFuY2hvcih0YXJnZXRBbmNob3IpOworCQkKKwkJLyogQ3JlYXRpbmcgdGhlIGRlY29yYXRpb24gKi8KKwkJcmVmZXJyZXJEZWNvcmF0aW9uID0gbmV3IFNtb290aFBvbHlnb25EZWNvcmF0aW9uKCk7CisJCWNvbm5lY3Rpb24uc2V0U291cmNlRGVjb3JhdGlvbihyZWZlcnJlckRlY29yYXRpb24pOworCisJCXJlZmVyZW5jZWREZWNvcmF0aW9uID0gbmV3IFNtb290aFBvbHlnb25EZWNvcmF0aW9uKCk7CisJCWNvbm5lY3Rpb24uc2V0VGFyZ2V0RGVjb3JhdGlvbihyZWZlcmVuY2VkRGVjb3JhdGlvbik7CisJCQorCQkKKwkJLyogQWRkaW5nIGxhYmVscyB0byB0aGUgY29ubmVjdGlvbiAqLworCQlDb25uZWN0aW9uRW5kcG9pbnRMb2NhdG9yIHNvdXJjZUVuZHBvaW50TG9jYXRvciA9IAorCQkJbmV3IENvbm5lY3Rpb25FbmRwb2ludExvY2F0b3IoY29ubmVjdGlvbiwgZmFsc2UpOworCQlzb3VyY2VFbmRwb2ludExvY2F0b3Iuc2V0VkRpc3RhbmNlKC01KTsKKwkJcmVmZXJyZXJMYWJlbCA9IG5ldyBMYWJlbCgiIik7CisJCWNvbm5lY3Rpb24uYWRkKHJlZmVycmVyTGFiZWwsIHNvdXJjZUVuZHBvaW50TG9jYXRvcik7CisKKwkJQ29ubmVjdGlvbkVuZHBvaW50TG9jYXRvciB0YXJnZXRFbmRwb2ludExvY2F0b3IgPSAKKwkJICAgICAgICBuZXcgQ29ubmVjdGlvbkVuZHBvaW50TG9jYXRvcihjb25uZWN0aW9uLCB0cnVlKTsKKwkJdGFyZ2V0RW5kcG9pbnRMb2NhdG9yLnNldFZEaXN0YW5jZSgtNSk7CisJCXJlZmVyZW5jZWRMYWJlbCA9IG5ldyBMYWJlbCgiIik7CisJCWNvbm5lY3Rpb24uYWRkKHJlZmVyZW5jZWRMYWJlbCwgdGFyZ2V0RW5kcG9pbnRMb2NhdG9yKTsKKworCQlDb25uZWN0aW9uRW5kcG9pbnRMb2NhdG9yIHJlbGF0aW9uc2hpcExvY2F0b3IgPSAKKwkJCW5ldyBDb25uZWN0aW9uRW5kcG9pbnRMb2NhdG9yKGNvbm5lY3Rpb24sdHJ1ZSk7CisJCXJlbGF0aW9uc2hpcExvY2F0b3Iuc2V0VURpc3RhbmNlKDEwKTsKKwkJcmVsYXRpb25zaGlwTG9jYXRvci5zZXRWRGlzdGFuY2UoLTIwKTsKKwkJTGFiZWwgcmVsYXRpb25zaGlwTGFiZWwgPSBuZXcgTGFiZWwoImNvbnRhaW5zIik7CisJCWNvbm5lY3Rpb24uYWRkKHJlbGF0aW9uc2hpcExhYmVsLHJlbGF0aW9uc2hpcExvY2F0b3IpOworCQlyZXR1cm4gY29ubmVjdGlvbjsKKwl9CisKKwlwdWJsaWMgQXNzb2NpYXRpb24gZ2V0QXNzb2NpYXRpb24oKSB7CisJCXJldHVybiB0aGlzLmFzc29jaWF0aW9uOworCX0gCisJCisJcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQgKCBib29sZWFuIGlzU2VsZWN0ZWQgKXsKKwkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoIGlzU2VsZWN0ZWQgPyBzZWxlY3RlZENvbG9yIDogQ29sb3JDb25zdGFudHMud2hpdGUgKTsKKwkJdGhpcy5zZXRCb3JkZXIoaXNTZWxlY3RlZD8gc2VsZWN0ZWRCb3JkZXIgOiB1bnNlbGVjdGVkQm9yZGVyKTsKKwl9CisJCisJLyoqCisJICogVXBkYXRlIHRoZSB2aWV3IHdpdGggdGhlIGNoYW5nZXMgdXNlciBtYWRlIG9uIHRoZSBtb2RlbAorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZSgpeworCQlib29sZWFuIGlzR2VuZXJhdGVkID0gYXNzb2NpYXRpb24uaXNHZW5lcmF0ZWQoKTsKKwkJCisJCWNvbm5lY3Rpb24uc2V0Rm9yZWdyb3VuZENvbG9yKCBpc0dlbmVyYXRlZD8gZW5hYmxlZENvbG9yOiBkaXNhYmxlZExpbmVDb2xvciApOworCQkKKwkJdGFibGVGaWcxLnNldEVuYWJsZWQoaXNHZW5lcmF0ZWQpOworCQl0YWJsZUZpZzIuc2V0RW5hYmxlZChpc0dlbmVyYXRlZCk7CisJCWRlc2NyaXB0aW9uTGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGlzR2VuZXJhdGVkPyBlbmFibGVkQ29sb3I6IGRpc2FibGVkTGluZUNvbG9yKTsKKworCQkvL3BhaW50RGlyZWN0aW9uYWxpdHlBbmRDYXJkaW5hbGl0eSAKKwkJU3RyaW5nIGNhcmRpbmFsaXR5U3RyOworCQlTdHJpbmcgZGlyZWN0aW9uYWxpdHkgPSBhc3NvY2lhdGlvbi5nZXREaXJlY3Rpb25hbGl0eSgpOworCQlTdHJpbmcgY2FyZGluYWxpdHkgPSBhc3NvY2lhdGlvbi5nZXRDYXJkaW5hbGl0eSgpOworCQkvL0RyYXcgcmVmZXJyZXJSb2xlCisJCWlmIChjYXJkaW5hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uTUFOWV9UT19PTkUpIHx8IGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5NQU5ZX1RPX01BTlkpKSB7CisJCQljYXJkaW5hbGl0eVN0ciA9ICIqIjsKKwkJfSBlbHNlIHsKKwkJCWNhcmRpbmFsaXR5U3RyID0gIjEiOworCQl9CisJCWlmIChkaXJlY3Rpb25hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uQklfREkpIHx8IGRpcmVjdGlvbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5PUFBPU0lURV9ESSkpIHsKKwkJCWNvbm5lY3Rpb24uc2V0U291cmNlRGVjb3JhdGlvbih0aGlzLnJlZmVycmVyRGVjb3JhdGlvbik7CisJCX1lbHNleworCQkJY29ubmVjdGlvbi5zZXRTb3VyY2VEZWNvcmF0aW9uKG51bGwpOworCQl9CisJCQorCQl0aGlzLnJlZmVycmVyTGFiZWwuc2V0VGV4dCggY2FyZGluYWxpdHlTdHIgKTsKKwkJCQorCQkvL0RyYXcgcmVmZXJlbmNlZFJvbGUKKwkJaWYgKGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORSkgfHwgY2FyZGluYWxpdHkuZXF1YWxzKEFzc29jaWF0aW9uLk9ORV9UT19PTkUpKSB7CisJCQljYXJkaW5hbGl0eVN0ciA9ICIxIjsKKwkJfSBlbHNlIHsKKwkJCWNhcmRpbmFsaXR5U3RyID0gIioiOworCQl9CisJCWlmIChkaXJlY3Rpb25hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uQklfREkpIHx8IGRpcmVjdGlvbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5OT1JNQUxfREkpKSB7CisJCQljb25uZWN0aW9uLnNldFRhcmdldERlY29yYXRpb24odGhpcy5yZWZlcmVuY2VkRGVjb3JhdGlvbik7CisJCX1lbHNleworCQkJY29ubmVjdGlvbi5zZXRUYXJnZXREZWNvcmF0aW9uKG51bGwpOworCQl9CisJCXRoaXMucmVmZXJlbmNlZExhYmVsLnNldFRleHQoY2FyZGluYWxpdHlTdHIpOworCQkKKwkJU3RyaW5nIHRleHQgPSAiIjsKKwkJU3RyaW5nIHJlZmVycmVyVGFibGVOYW1lID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKTsKKwkJU3RyaW5nIHJlZmVyZW5jZWRUYWJsZSA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKTsKKwkJaWYoIGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORSApICl7CisJCQl0ZXh0ID0gU3RyaW5nLmZvcm1hdCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5tYW55VG9PbmVEZXNjLCByZWZlcmVuY2VkVGFibGUgLCByZWZlcnJlclRhYmxlTmFtZSApOyAKKwkJfWVsc2UgaWYoIGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5PTkVfVE9fT05FICkgKXsKKwkJCXRleHQgPSBTdHJpbmcuZm9ybWF0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm9uZVRvT25lRGVzYywgcmVmZXJyZXJUYWJsZU5hbWUsIHJlZmVyZW5jZWRUYWJsZSApOworCQl9ZWxzZSBpZiggY2FyZGluYWxpdHkuZXF1YWxzKEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWSkgKXsKKwkJCXRleHQgPSBTdHJpbmcuZm9ybWF0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm1hbnlUb01hbnlEZXNjLCByZWZlcnJlclRhYmxlTmFtZSwgcmVmZXJlbmNlZFRhYmxlLCByZWZlcmVuY2VkVGFibGUsIHJlZmVycmVyVGFibGVOYW1lICk7CQkJCisJCX0KKwkJCisJCWlmKCBhc3NvY2lhdGlvbi5pc0N1c3RvbSgpICl7CisJCQljb25uZWN0aW9uLnNldExpbmVTdHlsZSggU1dULkxJTkVfRE9UKTsKKwkJfQorCQkKKwkJdGhpcy5kZXNjcmlwdGlvbkxhYmVsLnNldFRleHQodGV4dCk7CisJCQorCX0KKwkKKwlwdWJsaWMgY2xhc3MgU21vb3RoUG9seWdvbkRlY29yYXRpb24gZXh0ZW5kcyBQb2x5Z29uRGVjb3JhdGlvbgorCXsKKwkJcHVibGljIFNtb290aFBvbHlnb25EZWNvcmF0aW9uKCkKKwkJeworCQkJc3VwZXIoKTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKQorCQl7CisJCQlpbnQgc2F2ZWRBbnRpYWxpYXMgPSBncmFwaGljcy5nZXRBbnRpYWxpYXMoKTsKKwkJCWdyYXBoaWNzLnNldEFudGlhbGlhcyhTV1QuT04pOworCQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOworCQkJZ3JhcGhpY3Muc2V0QW50aWFsaWFzKHNhdmVkQW50aWFsaWFzKTsKKwkJfQorCX0KK30gCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Bc3NvY2lhdGlvblRhYmxlc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0Fzc29jaWF0aW9uVGFibGVzUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3M2RmY2QKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Bc3NvY2lhdGlvblRhYmxlc1BhZ2UuamF2YQpAQCAtMCwwICsxLDE4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uU1dUVXRpbC5jcmVhdGVCdXR0b247CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbi5TV1RVdGlsLmNyZWF0ZUxhYmVsOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uU1dUVXRpbC5jcmVhdGVUZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5Bc3NvY2lhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLk9STUdlbkN1c3RvbWl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkltYWdlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKKworCitwdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25UYWJsZXNQYWdlIGV4dGVuZHMgTmV3QXNzb2NpYXRpb25XaXphcmRQYWdlIHsKKworCXByaXZhdGUgQnV0dG9uIHNpbXBsZUFzc29CdG47CisJcHJpdmF0ZSBCdXR0b24gbXRtQXNzb0J0bjsgCisJcHJpdmF0ZSBUZXh0IHRhYmxlMVRleHRGaWVsZCA7CisJcHJpdmF0ZSBUZXh0IHRhYmxlMlRleHRGaWVsZCA7CisJcHJpdmF0ZSBUZXh0IGpvaW5UYWJsZVRleHRGaWVsZDsgCisJcHJpdmF0ZSBCdXR0b24gam9pblRhYmxlQnJvd3NlOworCQorCXB1YmxpYyBBc3NvY2lhdGlvblRhYmxlc1BhZ2UoT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyKSB7CisJCXN1cGVyKGN1c3RvbWl6ZXIsICAiQXNzb2NpYXRpb25UYWJsZXNQYWdlIik7CisJCXNldFRpdGxlKCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV90aXRsZSk7CisJCXNldERlc2NyaXB0aW9uKEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2Rlc2MpOworCX0KKworCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoY29tcG9zaXRlKTsKKwkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSkpOworCQkKKwkJR3JvdXAgYXNzb2NLaW5kR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7CisJCWludCBuQ29sdW1ucz0gMyA7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKKwkJYXNzb2NLaW5kR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7CisJCWFzc29jS2luZEdyb3VwLnNldExheW91dChsYXlvdXQpOworCQl0aGlzLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX0FTU09DSUFUSU9OX1RBQkxFUyk7CisJCWFzc29jS2luZEdyb3VwLnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2Fzc29jS2luZCk7CisKKwkJc2ltcGxlQXNzb0J0biA9IGNyZWF0ZUJ1dHRvbihhc3NvY0tpbmRHcm91cCwgMywgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2Vfc2ltcGxlQXNzb2MsIFNXVC5SQURJTyk7CisJCW10bUFzc29CdG4gPSBjcmVhdGVCdXR0b24oYXNzb2NLaW5kR3JvdXAsIDMsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX20ybUFzc29jLCBTV1QuUkFESU8pOworCisJCQorCQlHcm91cCBhc3NvY1RhYmxlc0dyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOworCQluQ29sdW1ucz0gMyA7CisJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gbkNvbHVtbnM7CisJCWFzc29jVGFibGVzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7CisJCWFzc29jVGFibGVzR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7CisJCQorCQkKKwkJYXNzb2NUYWJsZXNHcm91cC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9hc3NvY1RhYmxlcyApOworCQkKKwkJY3JlYXRlTGFiZWwoYXNzb2NUYWJsZXNHcm91cCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfdGFibGUxKTsKKwkJdGFibGUxVGV4dEZpZWxkID0gY3JlYXRlVGV4dChhc3NvY1RhYmxlc0dyb3VwLCAxKTsKKwkJCisJCUJ1dHRvbiBicm93c2VyMSA9IGNyZWF0ZUJ1dHRvbihhc3NvY1RhYmxlc0dyb3VwLCAxLCAiIiwgU1dULk5PTkUpOworCQlicm93c2VyMS5zZXRJbWFnZSggSW1hZ2VSZXBvc2l0b3J5LmdldEJyb3dzZUJ1dHRvbkltYWdlKCkpOyAKKworCQlicm93c2VyMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCVNlbGVjdFRhYmxlRGlhbG9nIGRsZyA9IG5ldyBTZWxlY3RUYWJsZURpYWxvZyggRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgY3VzdG9taXplci5nZXRUYWJsZU5hbWVzKCkgKTsKKwkJCQlpZiggZGxnLm9wZW4oKSA9PURpYWxvZy5PSyApeworCQkJCQl0YWJsZTFUZXh0RmllbGQuc2V0VGV4dCggZGxnLmdldFNlbGVjdGVkVGFibGUoKSApOworCQkJCQlnZXRXaXphcmREYXRhTW9kZWwoKS5wdXQoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX1JFRkVSUkVSX1RBQkxFLCB0YWJsZTFUZXh0RmllbGQuZ2V0VGV4dCgpKTsKKwkJCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOworCQkJCQkoKE5ld0Fzc29jaWF0aW9uV2l6YXJkKWdldFdpemFyZCgpKS51cGRhdGVUYWJsZU5hbWVzKCk7CisJCQkJfQorCQkJfQorCQl9KTsKKworCQljcmVhdGVMYWJlbChhc3NvY1RhYmxlc0dyb3VwLCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV90YWJsZTIpOworCQl0YWJsZTJUZXh0RmllbGQgPSBjcmVhdGVUZXh0KGFzc29jVGFibGVzR3JvdXAsIDEpOworCQkKKwkJQnV0dG9uIGJyb3dzZXIyID0gY3JlYXRlQnV0dG9uKGFzc29jVGFibGVzR3JvdXAsIDEsICIiLCBTV1QuTk9ORSk7CisJCWJyb3dzZXIyLnNldEltYWdlKCBJbWFnZVJlcG9zaXRvcnkuZ2V0QnJvd3NlQnV0dG9uSW1hZ2UoKSk7IAorCisJCWJyb3dzZXIyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJU2VsZWN0VGFibGVEaWFsb2cgZGxnID0gbmV3IFNlbGVjdFRhYmxlRGlhbG9nKCBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCBjdXN0b21pemVyLmdldFNjaGVtYSgpICk7CisJCQkJaWYoIGRsZy5vcGVuKCkgPT0gRGlhbG9nLk9LKXsKKwkJCQkJdGFibGUyVGV4dEZpZWxkLnNldFRleHQoIGRsZy5nZXRTZWxlY3RlZFRhYmxlKCkgKTsKKwkJCQkJZ2V0V2l6YXJkRGF0YU1vZGVsKCkucHV0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9SRUZFUkVOQ0VEX1RBQkxFLCB0YWJsZTJUZXh0RmllbGQuZ2V0VGV4dCgpKTsKKwkJCQkJKChOZXdBc3NvY2lhdGlvbldpemFyZClnZXRXaXphcmQoKSkudXBkYXRlVGFibGVOYW1lcygpOworCQkJCX0KKwkJCQl1cGRhdGVQYWdlQ29tcGxldGUoKTsKKwkJCX0KKwkJfSk7CisJCQorCQljcmVhdGVMYWJlbChhc3NvY1RhYmxlc0dyb3VwLCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9pbnRlcm1lZGlhdGVUYWJsZSApOworCQlqb2luVGFibGVUZXh0RmllbGQgPSBjcmVhdGVUZXh0KGFzc29jVGFibGVzR3JvdXAsIDEpOworCQlqb2luVGFibGVUZXh0RmllbGQuc2V0RW5hYmxlZChmYWxzZSk7CisKKwkJam9pblRhYmxlQnJvd3NlID0gY3JlYXRlQnV0dG9uKGFzc29jVGFibGVzR3JvdXAsIDEsICIiLCBTV1QuTk9ORSk7CisJCWpvaW5UYWJsZUJyb3dzZS5zZXRJbWFnZSggSW1hZ2VSZXBvc2l0b3J5LmdldEJyb3dzZUJ1dHRvbkltYWdlKCkpOyAKKwkJam9pblRhYmxlQnJvd3NlLnNldEVuYWJsZWQoZmFsc2UpOworCQkKKwkJam9pblRhYmxlQnJvd3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CisKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlTZWxlY3RUYWJsZURpYWxvZyBkbGcgPSBuZXcgU2VsZWN0VGFibGVEaWFsb2coIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIGN1c3RvbWl6ZXIuZ2V0U2NoZW1hKCkgKTsKKwkJCQlpZiggZGxnLm9wZW4oKSA9PSBEaWFsb2cuT0speworCQkJCQlqb2luVGFibGVUZXh0RmllbGQuc2V0VGV4dCggZGxnLmdldFNlbGVjdGVkVGFibGUoKSApOworCQkJCQlnZXRXaXphcmREYXRhTW9kZWwoKS5wdXQoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fVEFCTEUsIGpvaW5UYWJsZVRleHRGaWVsZC5nZXRUZXh0KCkgKTsKKwkJCQkJKChOZXdBc3NvY2lhdGlvbldpemFyZClnZXRXaXphcmQoKSkudXBkYXRlVGFibGVOYW1lcygpOworCQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7CisJCQkJfQorCQkJCXVwZGF0ZVBhZ2VDb21wbGV0ZSgpOworCQkJfQorCQl9KTsKKwkJCisJCXNldENvbnRyb2wocGFyZW50KTsKKworCQlzaW1wbGVBc3NvQnRuLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJam9pblRhYmxlVGV4dEZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCWpvaW5UYWJsZVRleHRGaWVsZC5jbGVhclNlbGVjdGlvbigpOworCQkJCWpvaW5UYWJsZVRleHRGaWVsZC5zZXRUZXh0KCIiKTsKKwkJCQlqb2luVGFibGVCcm93c2Uuc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJZ2V0V2l6YXJkRGF0YU1vZGVsKCkucHV0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9DQURJTkFMSVRZLCBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORSk7CisJCQkJZ2V0V2l6YXJkRGF0YU1vZGVsKCkucmVtb3ZlKCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX1RBQkxFICk7CisJCQkJKChOZXdBc3NvY2lhdGlvbldpemFyZClnZXRXaXphcmQoKSkudXBkYXRlVGFibGVOYW1lcygpOworCQkJCXVwZGF0ZVBhZ2VDb21wbGV0ZSgpOworCQkJfQorCQkJCisJCX0pOworCisJCW10bUFzc29CdG4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlqb2luVGFibGVUZXh0RmllbGQuc2V0RW5hYmxlZCh0cnVlKTsKKwkJCQlqb2luVGFibGVCcm93c2Uuc2V0RW5hYmxlZCh0cnVlKTsKKwkJCQlnZXRXaXphcmREYXRhTW9kZWwoKS5wdXQoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0NBRElOQUxJVFksIEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWSk7CisJCQkJKChOZXdBc3NvY2lhdGlvbldpemFyZClnZXRXaXphcmQoKSkudXBkYXRlVGFibGVOYW1lcygpOworCQkJCXVwZGF0ZVBhZ2VDb21wbGV0ZSgpOworCQkJfQorCQl9KTsJCQorCQkKKwkJdGhpcy5zZXRQYWdlQ29tcGxldGUoIGZhbHNlKTsKKwkJdGFibGUxVGV4dEZpZWxkLnNldEZvY3VzKCk7IAorCX0KKworCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgeworCQlyZXR1cm4gaXNQYWdlQ29tcGxldGUoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlUGFnZUNvbXBsZXRlKCkgeworCQlpZiggdGhpcy50YWJsZTFUZXh0RmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpIDw9IDApeworCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiggbXRtQXNzb0J0bi5nZXRTZWxlY3Rpb24oKSApeworCQkJaWYoIHRoaXMuam9pblRhYmxlVGV4dEZpZWxkLmdldFRleHQoKS5sZW5ndGgoKSA8PSAwICl7CisJCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0Fzc29jaWF0aW9uc0xpc3RDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0Fzc29jaWF0aW9uc0xpc3RDb21wb3NpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzkyZTMwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQXNzb2NpYXRpb25zTGlzdENvbXBvc2l0ZS5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZUNhbnZhczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLkFzc29jaWF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKKworLyoqCisgKiBBIERyYXcyZCBmaWd1cmUgcmVwcmVzZW50aW5nIGxpc3Qgb2YgYXNzb2NpYXRpb25zIGJldHdlZW4gdHdvIGRhdGFiYXNlIHRhYmxlcworICoKKyAqLworcHVibGljIGNsYXNzIEFzc29jaWF0aW9uc0xpc3RDb21wb3NpdGUgZXh0ZW5kcyBGaWd1cmVDYW52YXMgeworCisJTGlzdDxBc3NvY2lhdGlvbj4gYXNzb2NpYXRpb25zOyAgCisJQXNzb2NpYXRpb25Ub2dnbGVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA7CisJVGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlIHRhYmxlQXNzb2NpYXRpb25zV2l6YXJkUGFnZTsgLy90aGUgcGFyZW50IHdpemFyZCBwYWdlCisJQXNzb2NpYXRpb25GaWd1cmUgc2VsZWN0ZWRBc3NvY2lhdGlvbkZpZ3VyZSA7CisJCisJcHVibGljIEFzc29jaWF0aW9uc0xpc3RDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgVGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlIHRhYmxlQXNzb2NpYXRpb25zV2l6YXJkUGFnZSl7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMudGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlID0gdGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlOworCisJCXNldEJvdW5kcygxMCwgMTAgLCA1MDAsIDIwMCk7CisJCXNldEJhY2tncm91bmQoIG5ldyBDb2xvcihEaXNwbGF5LmdldERlZmF1bHQoKSwgMjU1LDI1NSwyNTUpKTsKKwkJCisJCUZpZ3VyZSBmaWd1cmUgPSBuZXcgRmlndXJlKCk7CisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOworCQlmaWd1cmUuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKDEpKTsKKwkJdGhpcy5saXN0ZW5lciA9IG5ldyBBc3NvY2lhdGlvblRvZ2dsZVNlbGVjdGlvbkxpc3RlbmVyKCk7IAorCQkKKwkJdGhpcy5zZXRDb250ZW50cyhmaWd1cmUpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyB2b2lkIHVwZGF0ZUFzc29jaWF0aW9ucyhMaXN0PEFzc29jaWF0aW9uPiBhc3NvY2lhdGlvbnMpeworCQlGaWd1cmUgZmlndXJlID0gKEZpZ3VyZSl0aGlzLmdldENvbnRlbnRzKCk7CisJCUxpc3Q8QXNzb2NpYXRpb25GaWd1cmU+IGFzc29jaWF0aW9uRmlndXJlcyA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOworCQlmb3IoQXNzb2NpYXRpb25GaWd1cmUgYXNzb2NGaWcgOiBhc3NvY2lhdGlvbkZpZ3VyZXMpeworCQkJYXNzb2NGaWcucmVtb3ZlQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCQl9CisJCWZpZ3VyZS5yZW1vdmVBbGwoKTsKKwkJdGhpcy5zZWxlY3RlZEFzc29jaWF0aW9uRmlndXJlID0gbnVsbDsKKwkJCisJCXRoaXMuYXNzb2NpYXRpb25zID0gYXNzb2NpYXRpb25zOworCQlpZiggYXNzb2NpYXRpb25zICE9IG51bGwgKXsKKwkJCWZvciggaW50IGkgPSAwOyBpIDxhc3NvY2lhdGlvbnMuc2l6ZSgpOyBpICsrICl7CisJCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb24gPSBhc3NvY2lhdGlvbnMuZ2V0KGkpOworCQkJCUFzc29jaWF0aW9uRmlndXJlIGFzc29jRmlndXJlID0gbmV3IEFzc29jaWF0aW9uRmlndXJlKGFzc29jaWF0aW9uKTsKKwkJCQlhc3NvY0ZpZ3VyZS5hZGRBY3Rpb25MaXN0ZW5lciggbGlzdGVuZXIgKTsKKwkJCQlmaWd1cmUuYWRkKGFzc29jRmlndXJlKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwdWJsaWMgQXNzb2NpYXRpb24gZ2V0U2VsZWN0ZWRBc3NvY2lhdGlvbigpeworCQlyZXR1cm4gdGhpcy5zZWxlY3RlZEFzc29jaWF0aW9uRmlndXJlLmdldEFzc29jaWF0aW9uKCk7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIHZvaWQgdXBkYXRlU2VsZWN0ZWRBc3NvY2lhdGlvbigpeworCQlGaWd1cmUgZmlndXJlID0gKEZpZ3VyZSl0aGlzLmdldENvbnRlbnRzKCk7CisJCUxpc3Q8QXNzb2NpYXRpb25GaWd1cmU+IGFzc29jaWF0aW9uRmlndXJlcyA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOworCQlmb3IoQXNzb2NpYXRpb25GaWd1cmUgYXNzb2NGaWcgOiBhc3NvY2lhdGlvbkZpZ3VyZXMpeworCQkJaWYoIGFzc29jRmlnID09IHRoaXMuc2VsZWN0ZWRBc3NvY2lhdGlvbkZpZ3VyZSl7CisJCQkJYXNzb2NGaWcudXBkYXRlKCk7IAorCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIEdldCB0aGUgYXNzb2NpYXRpb24ganVzdCBiZWZvcmUgdGhlIHNlbGVjdGVkIG9uZSBpbiBVSQorCSAqIEByZXR1cm4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgQXNzb2NpYXRpb24gZ2V0UHJldmlvdXNBc3NvY2lhdGlvbigpeworCQlGaWd1cmUgZmlndXJlID0gKEZpZ3VyZSl0aGlzLmdldENvbnRlbnRzKCk7CisJCUxpc3Q8QXNzb2NpYXRpb25GaWd1cmU+IGFzc29jaWF0aW9uRmlndXJlcyA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOworCQlBc3NvY2lhdGlvbkZpZ3VyZSByZXQgPSBudWxsOworCQlmb3IoQXNzb2NpYXRpb25GaWd1cmUgYXNzb2NGaWcgOiBhc3NvY2lhdGlvbkZpZ3VyZXMpeworCQkJaWYoIGFzc29jRmlnLmlzU2VsZWN0ZWQoKSApeworCQkJCWJyZWFrOyAKKwkJCX0KKwkJCXJldCA9IGFzc29jRmlnOworCQl9CisJCXJldHVybiByZXQ9PW51bGw/bnVsbDpyZXQuZ2V0QXNzb2NpYXRpb24oKTsKKwl9CisJCisJY2xhc3MgQXNzb2NpYXRpb25Ub2dnbGVTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyIHsKKwkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQlBc3NvY2lhdGlvbkZpZ3VyZSBmaWd1cmUgPSAoQXNzb2NpYXRpb25GaWd1cmUgKWV2ZW50LmdldFNvdXJjZSgpIDsKKwkJCWZpZ3VyZS5zZXRTZWxlY3RlZCh0cnVlKTsKKwkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gZmlndXJlLmdldEFzc29jaWF0aW9uKCk7CisJCQl0YWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UudXBkYXRlQXNzb2NpYXRpb25FZGl0UGFuZWwoYXNzb2NpYXRpb24pOworCQkJLy91bi1zZWxlY3QgdGhlIHByZXZpb3VzIHNlbGVjdGVkCisJCQlpZiggc2VsZWN0ZWRBc3NvY2lhdGlvbkZpZ3VyZSAhPSBudWxsICAmJiBzZWxlY3RlZEFzc29jaWF0aW9uRmlndXJlIT0gZmlndXJlICl7CisJCQkJc2VsZWN0ZWRBc3NvY2lhdGlvbkZpZ3VyZS5zZXRTZWxlY3RlZCggZmFsc2UgKTsKKwkJCX0KKwkJCS8vSGlnaGxpZ2h0IG5ldyBzZWxlY3Rpb24KKwkJCXNlbGVjdGVkQXNzb2NpYXRpb25GaWd1cmUgPSBmaWd1cmU7CisJCQlzZWxlY3RlZEFzc29jaWF0aW9uRmlndXJlLnNldFNlbGVjdGVkKCB0cnVlICk7CisJCQkKKwkJfQorCQkKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9DYXJkaW5hbGl0eVBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0NhcmRpbmFsaXR5UGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YzlhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9DYXJkaW5hbGl0eVBhZ2UuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworCisKK3B1YmxpYyBjbGFzcyBDYXJkaW5hbGl0eVBhZ2UgZXh0ZW5kcyBOZXdBc3NvY2lhdGlvbldpemFyZFBhZ2UgeworCisJcHJpdmF0ZSBMYWJlbCBtdG9EZXNjTGFiZWw7CisJcHJpdmF0ZSBMYWJlbCBvdG1EZXNjTGFiZWw7CisJcHJpdmF0ZSBMYWJlbCBvdG9EZXNjTGFiZWw7CisJcHJpdmF0ZSBMYWJlbCBtdG1EZXNjTGFiZWw7CisJCisJcHJpdmF0ZSBCdXR0b25bXSBjYXJkaW5hbGl0eUJ1dHRvbnMgPSBuZXcgQnV0dG9uWzRdOworCQorCXByb3RlY3RlZCBDYXJkaW5hbGl0eVBhZ2UoT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyKSB7CisJCXN1cGVyKCBjdXN0b21pemVyICwgIkNhcmRpbmFsaXR5UGFnZSIgKTsKKwkJc2V0VGl0bGUoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX2NhcmRpbmFsaXR5UGFnZV90aXRsZSk7CisJCXNldERlc2NyaXB0aW9uKCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY2FyZGluYWxpdHlQYWdlX2Rlc2MpOworCX0KKworCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKKwkJCisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOworCQlpbnQgbkNvbHVtbnM9IDEgOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gbkNvbHVtbnM7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLkdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9BU1NPQ0lBVElPTl9DQVJESU5BTElUWSk7CisKKwkJQ2FyZGluYWxpdHlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBDYXJkaW5hbGl0eVNlbGVjdGlvbkxpc3RlbmVyKCk7CisJCWNhcmRpbmFsaXR5QnV0dG9uc1swXSA9IGNyZWF0ZVJhZGlvQnV0dG9uKCBjb21wb3NpdGUsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMubWFueVRvT25lKTsKKwkJY2FyZGluYWxpdHlCdXR0b25zWzBdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBzZWxlY3Rpb25MaXN0ZW5lciApOworCQkvL0RlZmF1bHQgY2FyZGluYWxpdHkgaXMgTVRPCisJCWNhcmRpbmFsaXR5QnV0dG9uc1swXS5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJCWdldFdpemFyZERhdGFNb2RlbCgpLnB1dChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9DQURJTkFMSVRZLCBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORSk7CQkKKworCQltdG9EZXNjTGFiZWwgPSBjcmVhdGVMYWJlbChjb21wb3NpdGUsMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5tYW55VG9PbmVEZXNjKTsKKwkJCisJCWNhcmRpbmFsaXR5QnV0dG9uc1sxXSA9IGNyZWF0ZVJhZGlvQnV0dG9uKCBjb21wb3NpdGUsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMub25lVG9NYW55KTsKKwkJY2FyZGluYWxpdHlCdXR0b25zWzFdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBzZWxlY3Rpb25MaXN0ZW5lciApOworCQkKKwkJb3RtRGVzY0xhYmVsID0gY3JlYXRlTGFiZWwoY29tcG9zaXRlLDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMubWFueVRvT25lRGVzYyk7CisKKwkJY2FyZGluYWxpdHlCdXR0b25zWzJdID0gY3JlYXRlUmFkaW9CdXR0b24oIGNvbXBvc2l0ZSwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5vbmVUb09uZSk7CisJCWNhcmRpbmFsaXR5QnV0dG9uc1syXS5hZGRTZWxlY3Rpb25MaXN0ZW5lciggc2VsZWN0aW9uTGlzdGVuZXIgKTsKKworCQlvdG9EZXNjTGFiZWwgPSBjcmVhdGVMYWJlbChjb21wb3NpdGUsMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5vbmVUb09uZURlc2MpOworCisJCWNhcmRpbmFsaXR5QnV0dG9uc1szXSA9IGNyZWF0ZVJhZGlvQnV0dG9uKCBjb21wb3NpdGUsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMubWFueVRvTWFueSk7CisJCW10bURlc2NMYWJlbD0gY3JlYXRlTGFiZWwoY29tcG9zaXRlLDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMubWFueVRvTWFueURlc2MpOworCQkKKwkJc2V0Q29udHJvbChjb21wb3NpdGUpOworCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSggdHJ1ZSApOworCisJCWNhcmRpbmFsaXR5QnV0dG9uc1swXS5zZXRGb2N1cygpOworCisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlV2l0aE5ld1RhYmxlcygpIHsKKwkJU3RyaW5nIHMxID0gZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKSA7CisJCVN0cmluZyBzMiA9IGdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSA7CisJCVN0cmluZyBqb2luVGFibGVOYW1lID0gZ2V0Sm9pblRhYmxlTmFtZSgpOworCQlpZiggczEgPT0gbnVsbCB8fCBzMiA9PSBudWxsICkKKwkJCXJldHVybiA7CisJCQorCQl1cGRhdGVEZXNjcmlwdGlvblRleHQoczEsIHMyKTsKKwkJaWYoIGpvaW5UYWJsZU5hbWUgPT0gbnVsbCApeworCQkJY2FyZGluYWxpdHlCdXR0b25zWzBdLnNldEVuYWJsZWQodHJ1ZSk7CisJCQljYXJkaW5hbGl0eUJ1dHRvbnNbMV0uc2V0RW5hYmxlZCh0cnVlKTsKKwkJCWNhcmRpbmFsaXR5QnV0dG9uc1syXS5zZXRFbmFibGVkKHRydWUpOworCQkJY2FyZGluYWxpdHlCdXR0b25zWzNdLnNldEVuYWJsZWQoZmFsc2UpOworCQkJbXRtRGVzY0xhYmVsLnNldEVuYWJsZWQoZmFsc2UpOworCQl9ZWxzZXsKKwkJCWNhcmRpbmFsaXR5QnV0dG9uc1swXS5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCWNhcmRpbmFsaXR5QnV0dG9uc1sxXS5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCWNhcmRpbmFsaXR5QnV0dG9uc1syXS5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCWNhcmRpbmFsaXR5QnV0dG9uc1szXS5zZXRFbmFibGVkKHRydWUpOworCQkJY2FyZGluYWxpdHlCdXR0b25zWzNdLnNldFNlbGVjdGlvbih0cnVlKTsKKwkJCW10bURlc2NMYWJlbC5zZXRFbmFibGVkKHRydWUpOworCQl9CisJCSgoQ29tcG9zaXRlKXRoaXMuZ2V0Q29udHJvbCgpKS5sYXlvdXQoKSA7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZURlc2NyaXB0aW9uVGV4dChTdHJpbmcgczEsIFN0cmluZyBzMikgeworCQkvL01UTworCQlTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdChKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm1hbnlUb09uZURlc2MsIHMyLCBzMSk7CisJCW10b0Rlc2NMYWJlbC5zZXRUZXh0KCBtc2cgKTsKKwkJLy9PVE0KKwkJbXNnID0gU3RyaW5nLmZvcm1hdChKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm1hbnlUb09uZURlc2MsIHMxLCBzMik7CisJCW90bURlc2NMYWJlbC5zZXRUZXh0KCBtc2cgKTsKKwkJbXNnID0gU3RyaW5nLmZvcm1hdChKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm9uZVRvT25lRGVzYywgczEsIHMyKTsKKwkJb3RvRGVzY0xhYmVsLnNldFRleHQoIG1zZyApOworCQltc2cgPSBTdHJpbmcuZm9ybWF0KEpwdFVpRW50aXR5R2VuTWVzc2FnZXMubWFueVRvTWFueURlc2MsIHMxLCBzMiwgczIsIHMxKTsKKwkJbXRtRGVzY0xhYmVsLnNldFRleHQoIG1zZyApOworCX0KKworCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7CisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KHRleHQpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47CisJCWdkLmhvcml6b250YWxJbmRlbnQgPSAzMDsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7CisJCXJldHVybiBsYWJlbDsKKwl9CisJCisJCisJcHJpdmF0ZSBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0ICkgeworCQlCdXR0b24gYnRuID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5SQURJTyApOworCQlidG4uc2V0VGV4dCh0ZXh0KTsKKwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOworCQlidG4uc2V0TGF5b3V0RGF0YShnZCk7CisJCXJldHVybiBidG47CisJfQorCQorCisJcHJpdmF0ZSBjbGFzcyBDYXJkaW5hbGl0eVNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgeworCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KKwkKKwkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJaWYoIGUuZ2V0U291cmNlKCkgPT0gY2FyZGluYWxpdHlCdXR0b25zWzBdKXsKKwkJCQlnZXRXaXphcmREYXRhTW9kZWwoKS5wdXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fQ0FESU5BTElUWSwgQXNzb2NpYXRpb24uTUFOWV9UT19PTkUpOworCQkJfWVsc2UgaWYoIGUuZ2V0U291cmNlKCkgPT0gY2FyZGluYWxpdHlCdXR0b25zWzFdKXsKKwkJCQlnZXRXaXphcmREYXRhTW9kZWwoKS5wdXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fQ0FESU5BTElUWSwgQXNzb2NpYXRpb24uT05FX1RPX01BTlkgKTsKKwkJCX1lbHNlIGlmKCBlLmdldFNvdXJjZSgpID09IGNhcmRpbmFsaXR5QnV0dG9uc1syXSl7CisJCQkJZ2V0V2l6YXJkRGF0YU1vZGVsKCkucHV0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0NBRElOQUxJVFksIEFzc29jaWF0aW9uLk9ORV9UT19PTkUpOworCQkJfWVsc2V7CisJCQkJZ2V0V2l6YXJkRGF0YU1vZGVsKCkucHV0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0NBRElOQUxJVFksIEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWSk7CisJCQl9CisJCQlDYXJkaW5hbGl0eVBhZ2UudGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7CisJCQkKKwkJfQorCX0KKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0Nhc2NhZGVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0Nhc2NhZGVEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGI2YTFiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQ2FzY2FkZURpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVHJheURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLkFzc29jaWF0aW9uUm9sZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOworCisvKioKKyAqIFNpbXBsZSBkaWFsb2cgYWxsb3dzIHVzZXIgdG8gc2V0IHRoZSBjYXNjYWRlIHByb3BlcnR5IG9mIGFuIGFzc29jaWF0aW9uUm9sZS4KKyAqIFRoZSB2YWx1ZSBvZiBjYXNjYWRlIGNhbiBiZSAiYWxsIiwgb3IgYW55IGNvbWJpbmF0aW9uIG9mIG90aGVyIHNlbGVjdGlvbnMuCisgKiAKKyAqLworcHVibGljIGNsYXNzIENhc2NhZGVEaWFsb2cgZXh0ZW5kcyBUcmF5RGlhbG9nIHsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIEFMTF9DQVNDQURFUyA9IG5ldyBTdHJpbmdbXSB7VGFnTmFtZXMuQUxMX0NBU0NBREUsIFRhZ05hbWVzLlBFUlNJU1RfQ0FTQ0FERSwgVGFnTmFtZXMuTUVSR0VfQ0FTQ0FERQorCQkJLCBUYWdOYW1lcy5SRU1PVkVfQ0FTQ0FERSwgVGFnTmFtZXMuUkVGUkVTSF9DQVNDQURFfTsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIEFMTF9DQVNDQURFU19MQUJFTFMgCisJCT0gbmV3IFN0cmluZ1tdIHsgIiZhbGwiLCAJCS8vJE5PTi1OTFMtMSQKKwkJCQkJCSImcGVyc2lzdCIsCQkvLyROT04tTkxTLTEkCisJCQkJCQkiJm1lcmdlIiwJCS8vJE5PTi1OTFMtMSQKKwkJCQkJCSImcmVtb3ZlIiwJCS8vJE5PTi1OTFMtMSQKKwkJCQkJCSJyJmVmcmVzaCJ9OwkvLyROT04tTkxTLTEkCisKKwkKKwlwcml2YXRlIEJ1dHRvbltdIGFsbEJ1dHRvbnMgPSBuZXcgQnV0dG9uW0FMTF9DQVNDQURFUy5sZW5ndGhdOworCisJcHJpdmF0ZSBBc3NvY2lhdGlvblJvbGUgYXNzb2NpYXRpb25Sb2xlOworCXByaXZhdGUgTGlzdDxTdHJpbmc+IGNhc2NhZGVzOworCQorCXByb3RlY3RlZCBDYXNjYWRlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7CisJCXN1cGVyKHBhcmVudFNoZWxsKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIENhc2NhZGVEaWFsb2cgY3JlYXRlKEFzc29jaWF0aW9uUm9sZSByb2xlKSB7CisJCUNhc2NhZGVEaWFsb2cgZGxnID0gbmV3IENhc2NhZGVEaWFsb2coRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSApOworCQlkbGcuc2V0QXNzb2NpYXRpb25Sb2xlKHJvbGUpOworCQlyZXR1cm4gZGxnOworCX0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7CisgICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKKyAgICAgICAgbmV3U2hlbGwuc2V0VGV4dChKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLnNlbGVjdENhc2NhZGVEbGdUaXRsZSk7CisJCXRoaXMuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmV3U2hlbGwsIEpwYUhlbHBDb250ZXh0SWRzLkdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9TRUxFQ1RfQ0FTQ0FERSk7CisgICAgfQorCQorCXByaXZhdGUgdm9pZCBzZXRBc3NvY2lhdGlvblJvbGUoQXNzb2NpYXRpb25Sb2xlIHJvbGUpIHsKKwkJdGhpcy5hc3NvY2lhdGlvblJvbGUgPSByb2xlOworCQlMaXN0PFN0cmluZz4gbGlzdCA9IFN0cmluZ1V0aWwuc3RyVG9MaXN0KGFzc29jaWF0aW9uUm9sZS5nZXRDYXNjYWRlKCksICcsJywgdHJ1ZS8qdHJpbSovKTsgLy9yb2xlLmdldENhc2NhZGUoKSBjb250YWlucyB0aGUgY29tbWEgc2VwYXJlZCBjYXNjYWRlcyAoc2VlIGJlbG93KQorCQlpZiAobGlzdCA9PSBudWxsKSB7CisJCQlsaXN0ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJCX0KKwkJY2FzY2FkZXMgPSBsaXN0OworCQkKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7CisJCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOworCX0KKwkKKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKKwkJY3JlYXRlQ2FzY2FkZVR5cGVzR3JvdXAoY29udGFpbmVyKTsKKwkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb250YWluZXIpOworCQlyZXR1cm4gY29udGFpbmVyOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVDYXNjYWRlVHlwZXNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7CisJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOworCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWdkLndpZHRoSGludCA9IDI3NTsKKwkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7CisJCWdyb3VwLnNldFRleHQoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5jYXNjYWRlKTsKKworCQlmb3IoIGludCBpPTA7IGk8IEFMTF9DQVNDQURFUy5sZW5ndGg7IGkgKysgKXsKKwkJCUJ1dHRvbiBjaGVja2JveCA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7CisJCQljaGVja2JveC5zZXRUZXh0KCBBTExfQ0FTQ0FERVNfTEFCRUxTW2ldICk7CisJCQljaGVja2JveC5zZXRTZWxlY3Rpb24oIGlzSW5MaXN0KEFMTF9DQVNDQURFU1tpXSkgKTsgLy8kTk9OLU5MUy0xJAorCQkJY2hlY2tib3guc2V0RGF0YShBTExfQ0FTQ0FERVNbaV0pOworCQkJYWxsQnV0dG9uc1tpXSA9IGNoZWNrYm94OworCQkJLyppZiA8Y29kZT5hbGw8L2NvZGU+IGlzIHNlbGVjdGVkIHRoZW4gZGVzZWxlY3QgYWxsIG90aGVycyovCisJCQljaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQlCdXR0b24gYiA9IChCdXR0b24pZS5nZXRTb3VyY2UoKTsKKwkJCQkJaWYoIGIuZ2V0U2VsZWN0aW9uKCkgKXsKKwkJCQkJCWlmKCBiID09IGFsbEJ1dHRvbnNbMF0gKXsKKwkJCQkJCQlmb3IoIEJ1dHRvbiBidG4gOiBhbGxCdXR0b25zICl7CisJCQkJCQkJCWlmKCBidG4gIT0gZS5nZXRTb3VyY2UoKSApIGJ0bi5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQkJCQkJCX0KKwkJCQkJCX1lbHNleworCQkJCQkJCWFsbEJ1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKGZhbHNlKTsgCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9KTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKKwkJU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJZm9yKCBCdXR0b24gYiA6IGFsbEJ1dHRvbnMgKXsKKwkJCWlmKCBiLmdldFNlbGVjdGlvbigpICl7CisJCQkJaWYoIGJ1aWxkZXIubGVuZ3RoKCk+MCApeworCQkJCQlidWlsZGVyLmFwcGVuZCggJywnKTsKKwkJCQl9CisJCQkJYnVpbGRlci5hcHBlbmQoIGIuZ2V0RGF0YSgpICk7CisJCQl9CisJCX0KKwkJdGhpcy5hc3NvY2lhdGlvblJvbGUuc2V0Q2FzY2FkZSggYnVpbGRlci50b1N0cmluZygpICk7CisJCXN1cGVyLm9rUHJlc3NlZCgpOworCX0JCisKKwlwcml2YXRlIGJvb2xlYW4gaXNJbkxpc3QoU3RyaW5nIGNhc2NhZGUpIHsKKwkJZm9yKCBTdHJpbmcgcyA6IGNhc2NhZGVzICl7CisJCQlpZiggcy5lcXVhbHMoY2FzY2FkZSApKXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgeworCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7CisJfQorCit9CisKK2NsYXNzIFRhZ05hbWVzCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTSUNfVEFHID0gImJhc2ljIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNDQURFX1RBRyA9ICJjYXNjYWRlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fVEFHID0gImNvbHVtbiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRURERURfVEFHID0gImVtYmVkZGVkIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERFRF9JRF9UQUcgPSAiZW1iZWRkZWQtaWQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFRF9WQUxVRV9UQUcgPSAiZ2VuZXJhdGVkLXZhbHVlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9UQUcgPSAiaWQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0NMQVNTX1RBRyA9ICJpZCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9DT0xVTU5fVEFHID0gImpvaW4tY29sdW1uIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZFUlNFX0pPSU5fQ09MVU1OX1RBRyA9ICJpbnZlcnNlLWpvaW4tY29sdW1uIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0JfVEFHID0gImxvYiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOWV9UT19NQU5ZX1RBRyA9ICJtYW55LXRvLW1hbnkiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTllfVE9fT05FX1RBRyA9ICJtYW55LXRvLW9uZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX0JZX1RBRyA9ICJtYXBwZWQtYnkiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9UT19NQU5ZX1RBRyA9ICJvbmUtdG8tbWFueSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1RPX09ORV9UQUcgPSAib25lLXRvLW9uZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtfSk9JTl9DT0xVTU5fVEFHID0gInByaW1hcnkta2V5LWpvaW4tY29sdW1uIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9UQUcgPSAidGFibGUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fVEFHID0gInZlcnNpb24iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fVEFCTEVfVEFHID0gImpvaW4tdGFibGUiOworCisJLypjYXNjYWRlIHRhZ3MqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9DQVNDQURFID0gImFsbCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVF9DQVNDQURFID0gInBlcnNpc3QiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FUkdFX0NBU0NBREUgPSAibWVyZ2UiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9DQVNDQURFID0gInJlbW92ZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGUkVTSF9DQVNDQURFID0gInJlZnJlc2giOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQ29sdW1uR2VuUGFuZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0NvbHVtbkdlblBhbmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMzRiZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0NvbHVtbkdlblBhbmVsLmphdmEKQEAgLTAsMCArMSwzNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PUk1HZW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CisKKy8qKgorICogVGhlIHBhbmVsIHVzZWQgaW4gdGhlIDxjb2RlPlRhYmxlc0FuZENvbHVtbnNQYWdlPC9jb2RlPiB3aXphcmQgcGFnZSAKKyAqIHRvIGVkaXQgdGhlIGNvbHVtbiBnZW5lcmF0aW9uIHByb3BlcnRpZXMuCisgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQgYnkgdGhlIDxjb2RlPk9STUdlbldpemFyZDwvY29kZT4gCisgKiBpbXBsZW1lbnRhdGlvbi4KKworICovCitwdWJsaWMgY2xhc3MgQ29sdW1uR2VuUGFuZWwgCit7CisJV2l6YXJkUGFnZSB3aXphcmRQYWdlIDsgCisJQ29tcG9zaXRlIHBhcmVudDsJLy9wYXJlbnQgY29udHJvbCB3aXRoIGdyaWQgbGF5b3V0CisJaW50IGNvbHVtbnM7IAkJLy90b3RhbCBjb2x1bW5zIGluIHRoZSBwYXJlbnQgY29tcG9zaXRlCisJCisJT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyOworCQorCXByaXZhdGUgT1JNR2VuQ29sdW1uIG1Db2x1bW47CisJcHJpdmF0ZSBib29sZWFuIG1QYW5lbEluaXRlZDsKKwlwcml2YXRlIGJvb2xlYW4gbUlzVXBkYXRpbmdDb250cm9sczsKKwkKKwlwcml2YXRlIEdyb3VwIGNvbHVtbk1hcHBpbmdHcm91cDsKKwlwcml2YXRlIEJ1dHRvbiBtR2VuZXJhdGVkQ2hlY2tib3g7CisJcHJpdmF0ZSBUZXh0IG1Qcm9wTmFtZUZpZWxkOworCXByaXZhdGUgQ29tYm8gbU1hcHBpbmdLaW5kQ29tYm87CisJcHJpdmF0ZSBDb21ibyBtUHJvcFR5cGVDb21ibzsKKwlwcml2YXRlIEJ1dHRvbiBtVXBkYXRlYWJsZUNoZWNrQm94OworCXByaXZhdGUgQnV0dG9uIG1JbnNlcnRhYmxlQ2hlY2tCb3g7CisJCisJcHJpdmF0ZSBHcm91cCBkb21haW5DbGFzc0dyb3VwIDsKKwlwcml2YXRlIFNjb3BlUGFuZWwgbVByb3BHZXRTY29wZVBhbmVsOworCXByaXZhdGUgU2NvcGVQYW5lbCBtUHJvcFNldFNjb3BlUGFuZWw7CisJCisJcHVibGljIENvbHVtbkdlblBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW5zLCBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIsIFdpemFyZFBhZ2Ugd2l6YXJkUGFnZSApIHsKKwkJdGhpcy53aXphcmRQYWdlID0gd2l6YXJkUGFnZTsKKwkJdGhpcy5jdXN0b21pemVyID0gY3VzdG9taXplcjsKKwkJdGhpcy5wYXJlbnQgPXBhcmVudDsKKwkJdGhpcy5jb2x1bW5zID0gY29sdW1uczsKKwkJCisJCWluaXRQYW5lbCgpOworCX0KKwkvKioKKwkgKiBDaGFuZ2VzIHRoZSB0YWJsZSBlZGl0ZWQgYnkgdGhlIHBhbmVsLgorCSAqIFRoaXMgaXMgc3VwcG9zZWQgdG8gdXBkYXRlIHRoZSBwYW5lbCBlZGl0aW5nIGNvbnRyb2xzIAorCSAqIHVzaW5nIHRoZSBjb2x1bW4gdmFsdWVzLgorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbHVtbihPUk1HZW5Db2x1bW4gY29sdW1uKSB7CisJCW1Db2x1bW4gPSBjb2x1bW47CisJCQorCQkvKmxhenkgaW5pdCBwYW5lbCBiZWNhdXNlIGl0IHVzZXMgbUNvbHVtbiovCisJCWlmICghbVBhbmVsSW5pdGVkKSB7CisJCQlpbml0UGFuZWwoKTsKKwkJCW1QYW5lbEluaXRlZCA9IHRydWU7CisJCX0KKwkJCisJCXVwZGF0ZUNvbnRyb2xzKCk7CisJfQorCXByaXZhdGUgdm9pZCB1cGRhdGVDb250cm9scygpIHsKKwkJaWYgKG1Jc1VwZGF0aW5nQ29udHJvbHMpIHsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJbUlzVXBkYXRpbmdDb250cm9scyA9IHRydWU7CisJCWJvb2xlYW4gaXNHZW5lcmF0ZWQgPSBtQ29sdW1uLmlzR2VuZXJhdGVkKCk7CisJCW1HZW5lcmF0ZWRDaGVja2JveC5zZXRTZWxlY3Rpb24oIGlzR2VuZXJhdGVkKTsKKworCQllbmFibGVDb250cm9scyhpc0dlbmVyYXRlZCk7CisJCXRyeSB7CisJCQltUHJvcE5hbWVGaWVsZC5zZXRUZXh0KG1Db2x1bW4uZ2V0UHJvcGVydHlOYW1lKCkpOworCisJCQltUHJvcFR5cGVDb21iby5zZXRUZXh0KCBtQ29sdW1uLmdldFByb3BlcnR5VHlwZSgpKTsKKwkJCQorCQkJbU1hcHBpbmdLaW5kQ29tYm8uc2V0VGV4dCggbUNvbHVtbi5nZXRNYXBwaW5nS2luZCgpKTsKKwkJCQorCQkJbVVwZGF0ZWFibGVDaGVja0JveC5zZXRTZWxlY3Rpb24oIG1Db2x1bW4uaXNVcGRhdGVhYmxlKCkpOworCQkJCisJCQltSW5zZXJ0YWJsZUNoZWNrQm94LnNldFNlbGVjdGlvbihtQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKKwkJCQorCQkJbVByb3BHZXRTY29wZVBhbmVsLmVuYWJsZUNvbXBvbmVudHMoaXNHZW5lcmF0ZWQpOworCQkJbVByb3BHZXRTY29wZVBhbmVsLnNldFNjb3BlKG1Db2x1bW4uZ2V0UHJvcGVydHlHZXRTY29wZSgpKTsKKwkJCQorCQkJbVByb3BTZXRTY29wZVBhbmVsLmVuYWJsZUNvbXBvbmVudHMoIGlzR2VuZXJhdGVkICk7CisJCQltUHJvcFNldFNjb3BlUGFuZWwuc2V0U2NvcGUobUNvbHVtbi5nZXRQcm9wZXJ0eVNldFNjb3BlKCkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJSnB0VWlQbHVnaW4ubG9nKGUpOworCQl9CisKKwkJbUlzVXBkYXRpbmdDb250cm9scyA9IGZhbHNlOworCX0KKwlwcml2YXRlIHZvaWQgZW5hYmxlQ29udHJvbHMoYm9vbGVhbiBpc0dlbmVyYXRlZCkgeworCQlDb250cm9sW10gY29udHJvbHMgPSB0aGlzLmRvbWFpbkNsYXNzR3JvdXAuZ2V0Q2hpbGRyZW4oKTsKKwkJZm9yKCBDb250cm9sIGM6IGNvbnRyb2xzKXsKKwkJCWMuc2V0RW5hYmxlZCggaXNHZW5lcmF0ZWQgKTsKKwkJfQorCisJCWNvbnRyb2xzID0gdGhpcy5jb2x1bW5NYXBwaW5nR3JvdXAuZ2V0Q2hpbGRyZW4oKTsKKwkJZm9yKCBDb250cm9sIGM6IGNvbnRyb2xzKXsKKwkJCWMuc2V0RW5hYmxlZCggaXNHZW5lcmF0ZWQgKTsKKwkJfQorCX0KKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGUgcGFuZWwgYnkgYWRkaW5nIHRoZSBlZGl0aW5nIGNvbnRyb2xzLgorCSAqIEBwYXJhbSBjb2x1bW5zIAorCSAqIEBwYXJhbSBwYXJlbnQgCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdFBhbmVsKCkgeworCQljcmVhdGVDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOworCQl0aGlzLm1QYW5lbEluaXRlZCA9IHRydWU7CisJfQorCQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vLS0tLS0gU2NvcGVQYW5lbCBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8qKgorCSAqIEEgcGFuZWwgY29udGFpbmluZyAzIHJhZGlvcyAocHVibGljLCBwcm90ZWN0ZWQsIHByaXZhdGUpCisJICovCisJcHJpdmF0ZSBjbGFzcyBTY29wZVBhbmVsIAorCXsKKwkJcHJpdmF0ZSBCdXR0b24gbVB1YmxpY1JhZGlvOworCQlwcml2YXRlIEJ1dHRvbiBtUHJvdGVjdGVkUmFkaW87CisJCXByaXZhdGUgQnV0dG9uIG1Qcml2YXRlUmFkaW87CisJCQorCQlwdWJsaWMgU2NvcGVQYW5lbChDb21wb3NpdGUgY29tcCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJCS8vc3VwZXIoMywgMjAvKmhzcGFjaW5nKi8sIDAvKnZzcGFjaW5nKi8pOworCQkJCisJCQlDb21wb3NpdGUgcmFkaW9Hcm91cCA9IG5ldyBDb21wb3NpdGUoIGNvbXAsIFNXVC5OT05FKTsKKwkJCXJhZGlvR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIHRydWUpKTsKKwkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7CisJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7CisJCQlyYWRpb0dyb3VwLnNldExheW91dERhdGEoZ2QpOworCQkJCisJCQkvKnN0cmluZyBub3QgbG9jYWxpemVkIGludGVudGlvbmFsbHksIHRoZXkgYXJlIHVzZWQgYXMgdGhlIGFjdHVhbCAKKwkJCSAqIHNjb3BlIHZhbHVlIChzZWUgZ2V0VGV4dCgpIHVzYWdlKSovCisJCQltUHVibGljUmFkaW8gPSBuZXcgQnV0dG9uKCByYWRpb0dyb3VwLCBTV1QuUkFESU8gKTsKKwkJCW1QdWJsaWNSYWRpby5zZXRUZXh0KCAicHVibGljIik7CisJCQltUHVibGljUmFkaW8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7CisJCQltUHJvdGVjdGVkUmFkaW8gPSBuZXcgQnV0dG9uKCByYWRpb0dyb3VwLCBTV1QuUkFESU8gKTsKKwkJCW1Qcm90ZWN0ZWRSYWRpby5zZXRUZXh0KCJwcm90ZWN0ZWQiKTsKKwkJCW1Qcm90ZWN0ZWRSYWRpby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKKwkJCW1Qcml2YXRlUmFkaW8gPSBuZXcgQnV0dG9uKHJhZGlvR3JvdXAsIFNXVC5SQURJTyApOworCQkJbVByaXZhdGVSYWRpby5zZXRUZXh0KCAicHJpdmF0ZSIpOworCQkJbVByaXZhdGVSYWRpby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKKwkJCQorCQkJbVB1YmxpY1JhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCW1Qcm90ZWN0ZWRSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQltUHJpdmF0ZVJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCQkKKwkJfQorCQlwdWJsaWMgdm9pZCBlbmFibGVDb21wb25lbnRzKGJvb2xlYW4gYikgeworCQkJbVB1YmxpY1JhZGlvLnNldEVuYWJsZWQoYik7CisJCQltUHJvdGVjdGVkUmFkaW8uc2V0RW5hYmxlZChiKTsKKwkJCW1Qcml2YXRlUmFkaW8uc2V0RW5hYmxlZChiKTsKKwkJfQorCQkvKioKKwkJICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHNjb3BlLgorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRTY29wZSgpIHsKKwkJCUJ1dHRvbiByYWRpbyA9IG51bGw7CisJCQlpZiAobVB1YmxpY1JhZGlvLmdldFNlbGVjdGlvbigpKSB7CisJCQkJcmFkaW8gPSBtUHVibGljUmFkaW87CisJCQl9IGVsc2UgaWYgKG1Qcm90ZWN0ZWRSYWRpby5nZXRTZWxlY3Rpb24oKSApIHsKKwkJCQlyYWRpbyA9IG1Qcm90ZWN0ZWRSYWRpbzsKKwkJCX0gZWxzZSBpZiAobVByaXZhdGVSYWRpby5nZXRTZWxlY3Rpb24oKSApIHsKKwkJCQlyYWRpbyA9IG1Qcml2YXRlUmFkaW87CisJCQl9CisJCQlyZXR1cm4gcmFkaW8gIT0gbnVsbCA/IHJhZGlvLmdldFRleHQoKSA6IG51bGw7CisJCX0KKwkJcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7CisJCQltUHVibGljUmFkaW8uc2V0U2VsZWN0aW9uKGZhbHNlKTsKKwkJCW1Qcm90ZWN0ZWRSYWRpby5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQkJbVByaXZhdGVSYWRpby5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQkJaWYoIHNjb3BlID09IG51bGwgKQorCQkJCXJldHVybjsKKwkJCWlmIChzY29wZS5lcXVhbHMoT1JNR2VuQ29sdW1uLlBVQkxJQ19TQ09QRSkpIHsKKwkJCQltUHVibGljUmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOworCQkJfSBlbHNlIGlmIChzY29wZS5lcXVhbHMoT1JNR2VuQ29sdW1uLlBST1RFQ1RFRF9TQ09QRSkpIHsKKwkJCQltUHJvdGVjdGVkUmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOworCQkJfSBlbHNlIGlmIChzY29wZS5lcXVhbHMoT1JNR2VuQ29sdW1uLlBSSVZBVEVfU0NPUEUpKSB7CisJCQkJbVByaXZhdGVSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJCQl9CisJCX0KKwl9CisJCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8tLS0tLSBwcml2YXRlIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5zKSB7CisJCW1HZW5lcmF0ZWRDaGVja2JveCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOworCQltR2VuZXJhdGVkQ2hlY2tib3guc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2dlblByb3ApOworCQltR2VuZXJhdGVkQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJaWYgKCFtSXNVcGRhdGluZ0NvbnRyb2xzKSB7CisJCQkJCW1Db2x1bW4uc2V0R2VuZXJhdGVkKG1HZW5lcmF0ZWRDaGVja2JveC5nZXRTZWxlY3Rpb24oKSApOworCQkJCQl1cGRhdGVDb250cm9scygpOworCQkJCX0KKwkJCX19KTsKKwkJU1dUVXRpbC5maWxsQ29sdW1ucyhtR2VuZXJhdGVkQ2hlY2tib3gsIGNvbHVtbnMpOworCQkKKwkJY29sdW1uTWFwcGluZ0dyb3VwID0gbmV3IEdyb3VwKCBjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJY29sdW1uTWFwcGluZ0dyb3VwLnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9jb2xNYXBwaW5nKTsKKwkJY29sdW1uTWFwcGluZ0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dChjb2x1bW5zLCBmYWxzZSkpOworCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5zOworCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwIDsKKwkJY29sdW1uTWFwcGluZ0dyb3VwLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7CisJCQorCQlTV1RVdGlsLmNyZWF0ZUxhYmVsKGNvbHVtbk1hcHBpbmdHcm91cCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX3Byb3BOYW1lICk7CisJCW1Qcm9wTmFtZUZpZWxkID0gbmV3IFRleHQoY29sdW1uTWFwcGluZ0dyb3VwLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSApOworCQltUHJvcE5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQlpZiAoIW1Jc1VwZGF0aW5nQ29udHJvbHMpIHsKKwkJCQkJU3RyaW5nIGZsZE5hbWUgPSBtUHJvcE5hbWVGaWVsZC5nZXRUZXh0KCk7CisJCQkJCUlTdGF0dXMgc3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSWRlbnRpZmllciggZmxkTmFtZSwgCisJCQkJCQlKYXZhQ29yZS5WRVJTSU9OXzFfMywgSmF2YUNvcmUuVkVSU0lPTl8xXzMgKTsKKwkJCQkJaWYoICFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSl7CisJCQkJCQltQ29sdW1uLnNldFByb3BlcnR5TmFtZShmbGROYW1lKTsKKwkJCQkJCXdpemFyZFBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG51bGwpOworCQkJCQl9ZWxzZXsKKwkJCQkJCXdpemFyZFBhZ2Uuc2V0RXJyb3JNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCkpOworCQkJCQl9CisJCQkJfQorCQkJfQkJCQorCQl9KTsKKwkJU1dUVXRpbC5maWxsQ29sdW1ucyhtUHJvcE5hbWVGaWVsZCAsMyk7CisJCQorCQlTV1RVdGlsLmNyZWF0ZUxhYmVsKGNvbHVtbk1hcHBpbmdHcm91cCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX3Byb3BUeXBlICk7CisJCW1Qcm9wVHlwZUNvbWJvID0gbmV3IENvbWJvKGNvbHVtbk1hcHBpbmdHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOworCQltUHJvcFR5cGVDb21iby5zZXRJdGVtcyggdGhpcy5jdXN0b21pemVyLmdldEFsbFByb3BlcnR5VHlwZXMoKSk7CisJCW1Qcm9wVHlwZUNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKCBuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKKwkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCWlmICghbUlzVXBkYXRpbmdDb250cm9scykgeworCQkJCQltQ29sdW1uLnNldFByb3BlcnR5VHlwZShtUHJvcFR5cGVDb21iby5nZXRUZXh0KCkpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCVNXVFV0aWwuZmlsbENvbHVtbnMobVByb3BUeXBlQ29tYm8sMyk7CisJCQorCQlTV1RVdGlsLmNyZWF0ZUxhYmVsKGNvbHVtbk1hcHBpbmdHcm91cCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX21hcEtpbmQgKTsKKwkJbU1hcHBpbmdLaW5kQ29tYm8gPSBuZXcgQ29tYm8oY29sdW1uTWFwcGluZ0dyb3VwLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7CisJCW1NYXBwaW5nS2luZENvbWJvLnNldEl0ZW1zKCB0aGlzLmN1c3RvbWl6ZXIuZ2V0QWxsTWFwcGluZ0tpbmRzKCkpOworCQltTWFwcGluZ0tpbmRDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlpZiAoIW1Jc1VwZGF0aW5nQ29udHJvbHMpIHsKKwkJCQkJbUNvbHVtbi5zZXRNYXBwaW5nS2luZCgoU3RyaW5nKW1NYXBwaW5nS2luZENvbWJvLmdldFRleHQoKSk7CisJCQkJfQorCQkJCQorCQkJfX0pOworCQlTV1RVdGlsLmZpbGxDb2x1bW5zKG1NYXBwaW5nS2luZENvbWJvICwzKTsKKwkJCisJCW1VcGRhdGVhYmxlQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNvbHVtbk1hcHBpbmdHcm91cCwgU1dULkNIRUNLKTsKKwkJbVVwZGF0ZWFibGVDaGVja0JveC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfY29sVXBkYXRlYWJsZSk7CisJCW1VcGRhdGVhYmxlQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJaWYgKCFtSXNVcGRhdGluZ0NvbnRyb2xzKSB7CisJCQkJCW1Db2x1bW4uc2V0VXBkYXRlYWJsZShtVXBkYXRlYWJsZUNoZWNrQm94LmdldFNlbGVjdGlvbigpICk7CisJCQkJfQorCQkJfX0pOworCQlTV1RVdGlsLmZpbGxDb2x1bW5zKG1VcGRhdGVhYmxlQ2hlY2tCb3ggLDQpOworCQkKKwkJbUluc2VydGFibGVDaGVja0JveCA9IG5ldyBCdXR0b24oY29sdW1uTWFwcGluZ0dyb3VwLCBTV1QuQ0hFQ0spOworCQltSW5zZXJ0YWJsZUNoZWNrQm94LnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9jb2xJbnNlcnRhYmxlKTsKKwkJbUluc2VydGFibGVDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlpZiAoIW1Jc1VwZGF0aW5nQ29udHJvbHMpIHsKKwkJCQkJbUNvbHVtbi5zZXRJbnNlcnRhYmxlKG1JbnNlcnRhYmxlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOworCQkJCX0KKwkJCX19KTsKKwkJU1dUVXRpbC5maWxsQ29sdW1ucyhtSW5zZXJ0YWJsZUNoZWNrQm94ICw0KTsKKwkJCisJCVNXVFV0aWwuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCA0LCIiKTsgCisJCQorCQljcmVhdGVKYXZhQmVhblByb3BlcnR5Q29udHJvbHMoY29tcG9zaXRlLCBjb2x1bW5zKTsKKwl9CisJCisJdm9pZCBjcmVhdGVKYXZhQmVhblByb3BlcnR5Q29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGNvbHVtbnMpeworCQkvL0phdmEgY2xhc3MgZ2VuZXJhdGlvbiBwcm9wZXJ0aWVzIAorCQlkb21haW5DbGFzc0dyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlkb21haW5DbGFzc0dyb3VwLnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9iZWFuUHJvcCApOworCQlkb21haW5DbGFzc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dChjb2x1bW5zLCBmYWxzZSkpOworCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5zOworCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOworCQlkb21haW5DbGFzc0dyb3VwLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7CisKKwkJU1dUVXRpbC5jcmVhdGVMYWJlbChkb21haW5DbGFzc0dyb3VwLCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfZ2V0dGVyU2NvcGUgKTsKKwkJbVByb3BHZXRTY29wZVBhbmVsID0gbmV3IFNjb3BlUGFuZWwoZG9tYWluQ2xhc3NHcm91cCwgbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CisKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlpZiAoIW1Jc1VwZGF0aW5nQ29udHJvbHMpIHsKKwkJCQkJaWYoICgoQnV0dG9uKWUuZ2V0U291cmNlKCkpLmdldFNlbGVjdGlvbigpICkKKwkJCQkJCW1Db2x1bW4uc2V0UHJvcGVydHlHZXRTY29wZShtUHJvcEdldFNjb3BlUGFuZWwuZ2V0U2NvcGUoKSk7CisJCQkJfQorCQkJCQorCQkJfX0pOworCQkKKwkJU1dUVXRpbC5jcmVhdGVMYWJlbChkb21haW5DbGFzc0dyb3VwLCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfc2V0dGVyU2NvcGUgKTsKKwkJbVByb3BTZXRTY29wZVBhbmVsID0gbmV3IFNjb3BlUGFuZWwoZG9tYWluQ2xhc3NHcm91cCwgbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CisKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlpZiAoIW1Jc1VwZGF0aW5nQ29udHJvbHMpIHsKKwkJCQkJaWYoICgoQnV0dG9uKWUuZ2V0U291cmNlKCkpLmdldFNlbGVjdGlvbigpICkKKwkJCQkJCW1Db2x1bW4uc2V0UHJvcGVydHlTZXRTY29wZShtUHJvcFNldFNjb3BlUGFuZWwuZ2V0U2NvcGUoKSk7CisJCQkJfQorCQkJfX0pOworCQkKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EYXRhYmFzZUdyb3VwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EYXRhYmFzZUdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1MTM0YgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0RhdGFiYXNlR3JvdXAuamF2YQpAQCAtMCwwICsxLDUxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIudWkuaW50ZXJuYWwuRFRQVWlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkltYWdlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CisKKy8qKgorICogQSBjb21wb3NpdGUgdXNlZCB0byBjb25uZWN0IHRvIGRhdGFiYXNlLCBpbmNsdWRlcyBmb2xsb3dpbmcgVUkgY29udHJvbHM6CisgKiAtIGNvbm5lY3Rpb24gY29tYm8tYm94CisgKiAtIHNjaGVtYSBjb21iby1ib3gKKyAqIC0gYWRkIGNvbm5lY3Rpb24gYnV0dG9uCisgKiAtIHJlY29ubmVjdCBidXR0b24KKyAqLworcHVibGljIGNsYXNzIERhdGFiYXNlR3JvdXAKK3sKKwlwcml2YXRlIGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdDsKKwlwcml2YXRlIGZpbmFsIFNldDxMaXN0ZW5lcj4gbGlzdGVuZXJzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0KG5ldyBIYXNoU2V0PExpc3RlbmVyPigpKTsKKworCS8vIHRoZXNlIGFyZSBrZXB0IGluIHN5bmNoIHdpdGggdGhlIHNlbGVjdGlvbgorCUNvbm5lY3Rpb25Qcm9maWxlIHNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGU7CisJcHJpdmF0ZSBTY2hlbWEgc2VsZWN0ZWRTY2hlbWE7CisKKwlwcml2YXRlIGZpbmFsIENvbWJvIGNvbm5lY3Rpb25Db21ib0JveDsKKworCXByaXZhdGUgZmluYWwgQ29tYm8gc2NoZW1hQ29tYm9Cb3g7CisKKwlwcml2YXRlIGZpbmFsIEJ1dHRvbiByZWNvbm5lY3RCdXR0b247CisKKwlwcml2YXRlIGZpbmFsIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXI7CisKKwlwcml2YXRlIElXaXphcmRDb250YWluZXIgd2l6YXJkQ29udGFpbmVyOworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgorCisJRGF0YWJhc2VHcm91cChJV2l6YXJkQ29udGFpbmVyIHdpemFyZENvbnRhaW5lciwgSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGhIaW50KSAKKwl7CisJCXN1cGVyKCk7CisJCXRoaXMud2l6YXJkQ29udGFpbmVyID0gd2l6YXJkQ29udGFpbmVyOworCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OworCisJCS8vIGNvbm5lY3Rpb24gY29tYm8tYm94CisJCXRoaXMuYnVpbGRMYWJlbChwYXJlbnQsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuY29ubmVjdGlvbik7CisJCXRoaXMuY29ubmVjdGlvbkNvbWJvQm94ID0gdGhpcy5idWlsZENvbWJvQm94KHBhcmVudCwgd2lkdGhIaW50LCB0aGlzLmJ1aWxkQ29ubmVjdGlvbkNvbWJvQm94U2VsZWN0aW9uTGlzdGVuZXIoKSk7CisKKwkJLy8gYWRkIGNvbm5lY3Rpb24gYnV0dG9uCisJCXRoaXMuYnVpbGRCdXR0b24ocGFyZW50LCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLmFkZENvbm5lY3Rpb25MaW5rLCBJbWFnZVJlcG9zaXRvcnkuZ2V0QWRkQ29ubmVjdGlvbkJ1dHRvbkltYWdlKCksIHRoaXMuYnVpbGRBZGRDb25uZWN0aW9uTGlua1NlbGVjdGlvbkxpc3RlbmVyKCkpOworCisJCS8vIEEgY29tcG9zaXRlIGhvbGRzIHRoZSByZWNvbm5lY3QgYnV0dG9uICYgdGV4dAorCQl0aGlzLmJ1aWxkTGFiZWwocGFyZW50LCAxLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQgLCBTV1QuTk9ORSApOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZSA7CisJCWdkLmhvcml6b250YWxTcGFuID0gMjsKKwkJY29tcC5zZXRMYXlvdXREYXRhKCBnZCApOworCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOworCQkvLyBNYWtlIHRoZSByZWNvbm5lY3QgYnV0dG9uIHRvIGJlIGNsb3NlciB0byB0aGUgY29ubmVjdGlvbiBjb21iby4KKwkJZ2wubWFyZ2luVG9wID0gLTU7CisJCWNvbXAuc2V0TGF5b3V0KGdsKTsKKwkJdGhpcy5yZWNvbm5lY3RCdXR0b24gPSB0aGlzLmJ1aWxkQnV0dG9uKGNvbXAsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuY29ubmVjdExpbmssIEltYWdlUmVwb3NpdG9yeS5nZXRSZWNvbm5lY3RCdXR0b25JbWFnZSgpLCAgdGhpcy5idWlsZFJlY29ubmVjdExpbmtTZWxlY3Rpb25MaXN0ZW5lcigpKTsKKwkJdGhpcy5idWlsZExhYmVsKGNvbXAsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuc2NoZW1hSW5mbyk7CisKKwkJLy8gc2NoZW1hIGNvbWJvLWJveAorCQl0aGlzLmJ1aWxkTGFiZWwocGFyZW50LCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLnNjaGVtYSk7CisJCXRoaXMuc2NoZW1hQ29tYm9Cb3ggPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOworCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7CisJCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWUgOworCQl0aGlzLnNjaGVtYUNvbWJvQm94LnNldExheW91dERhdGEoZGF0YSk7CisJCXRoaXMuc2NoZW1hQ29tYm9Cb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFNjaGVtYUNvbWJvQm94U2VsZWN0aW9uTGlzdGVuZXIoKSk7CisJCS8vIGZpbGxlcgorCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7CisKKwkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7CisJfQorCisKKwlwdWJsaWMgdm9pZCBpbml0KCkKKwl7CisJCS8vIGluaXRpYWxpemUgc3RhdGUsIGJhc2VkIG9uIEpQQSBwcm9qZWN0CisJCXRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCk7CisJCXRoaXMuc2VsZWN0ZWRTY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKKworCQlpZiAodGhpcy5zZWxlY3RlZFNjaGVtYSAhPSBudWxsKSB7CisJCQl0aGlzLmZpcmVTY2hlbWFDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRTY2hlbWEpOworCQl9CisJCWlmICh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUgIT0gbnVsbCkgeworCQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7CisJCQl0aGlzLmZpcmVDb25uZWN0aW9uUHJvZmlsZUNoYW5nZWQodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlKTsKKwkJfQorCisJCXRoaXMudXBkYXRlQ29ubmVjdGlvbkNvbWJvQm94KCk7CisJCXRoaXMudXBkYXRlU2NoZW1hQ29tYm9Cb3goKTsKKwkJdGhpcy51cGRhdGVSZWNvbm5lY3RMaW5rKCk7CisKKwl9CisJLy8gKioqKioqKioqKiBpbnRyYS13aXphcmQgbWV0aG9kcyAqKioqKioqKioqCisKKwlTY2hlbWEgZ2V0U2VsZWN0ZWRTY2hlbWEoKSB7CisJCXJldHVybiB0aGlzLnNlbGVjdGVkU2NoZW1hOworCX0KKworCXZvaWQgZGlzcG9zZSgpIHsKKwkJaWYgKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSAhPSBudWxsKSB7CisJCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKKwkJfQorCX0KKworCisJLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKKworCS8qKgorCSAqIHRoaXMgY2FuIHJldHVybiBudWxsOworCSAqIGNhbGxlZCBhdCBzdGFydC11cCBhbmQgd2hlbiB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIGNoYW5nZXMKKwkgKi8KKwlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpIHsKKwkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOworCX0KKworCS8qKgorCSAqIHRoaXMgY2FuIHJldHVybiBudWxsOworCSAqIGNhbGxlZCBhdCBzdGFydC11cCBhbmQgd2hlbiB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIGNoYW5nZXMKKwkgKi8KKwlwcml2YXRlIFNjaGVtYSBnZXREZWZhdWx0U2NoZW1hKCkgeworCQlyZXR1cm4gKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSA9PSB0aGlzLmdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpKSA/CisJCQkJCQlqcGFQcm9qZWN0LmdldERlZmF1bHREYlNjaGVtYSgpCTogbnVsbDsKKwl9CisKKwkvKioKKwkgKiB0aGUgY29ubmVjdGlvbiBjb21iby1ib3ggaXMgdXBkYXRlZCBhdCBzdGFydC11cCBhbmQgd2hlbiB0aGUgdXNlcgorCSAqIGFkZHMgYSBjb25uZWN0aW9uIHByb2ZpbGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlQ29ubmVjdGlvbkNvbWJvQm94KCkgeworCQl0aGlzLmNvbm5lY3Rpb25Db21ib0JveC5yZW1vdmVBbGwoKTsKKwkJZm9yIChTdHJpbmcgY3BOYW1lIDogdGhpcy5idWlsZFNvcnRlZENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKSkgeworCQkJdGhpcy5jb25uZWN0aW9uQ29tYm9Cb3guYWRkKGNwTmFtZSk7CisJCX0KKwkJaWYgKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSAhPSBudWxsKSB7CisJCQl0aGlzLmNvbm5lY3Rpb25Db21ib0JveC5zZWxlY3QodGhpcy5jb25uZWN0aW9uQ29tYm9Cb3guaW5kZXhPZih0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuZ2V0TmFtZSgpKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIFNvcnRlZFNldDxTdHJpbmc+IGJ1aWxkU29ydGVkQ29ubmVjdGlvblByb2ZpbGVOYW1lcygpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zb3J0ZWRTZXQoSnB0RGJQbHVnaW4uaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5jb25uZWN0aW9uUHJvZmlsZU5hbWVzKCkpOworCX0KKworCS8qKgorCSAqIGNhbGxlZCBhdCBzdGFydC11cCBhbmQgd2hlbiB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIGNoYW5nZXMKKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlUmVjb25uZWN0TGluaygpIHsKKwkJdGhpcy5yZWNvbm5lY3RCdXR0b24uc2V0RW5hYmxlZCh0aGlzLnJlY29ubmVjdExpbmtDYW5CZUVuYWJsZWQoKSk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHJlY29ubmVjdExpbmtDYW5CZUVuYWJsZWQoKSB7CisJCXJldHVybiAodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpICYmICEodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLmlzQWN0aXZlKCkpOworCX0KKworCS8qKgorCSAqIHRoZSBzY2hlbWEgY29tYm8tYm94IGlzIHVwZGF0ZWQgYXQgc3RhcnQtdXAgYW5kCisJICogd2hlbiB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIGNoYW5nZXMKKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlU2NoZW1hQ29tYm9Cb3goKSB7CisJCXRoaXMuc2NoZW1hQ29tYm9Cb3gucmVtb3ZlQWxsKCk7CisJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLnNjaGVtYU5hbWVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJdGhpcy5zY2hlbWFDb21ib0JveC5hZGQoc3RyZWFtLm5leHQoKSk7CisJCX0KKwkJLy8gdGhlIGN1cnJlbnQgc2NoZW1hICpzaG91bGQqIGJlIGluIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gcHJvZmlsZQorCQlpZiAodGhpcy5zZWxlY3RlZFNjaGVtYSAhPSBudWxsKSB7CisJCQl0aGlzLnNjaGVtYUNvbWJvQm94LnNlbGVjdCh0aGlzLnNjaGVtYUNvbWJvQm94LmluZGV4T2YodGhpcy5zZWxlY3RlZFNjaGVtYS5nZXROYW1lKCkpKTsKKwkJfQorCX0KKworCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBzY2hlbWFOYW1lcygpIHsKKwkJU2NoZW1hQ29udGFpbmVyIHNjID0gdGhpcy5qcGFQcm9qZWN0LmdldERlZmF1bHREYlNjaGVtYUNvbnRhaW5lcigpOworCQkvLyB1c2Ugc2NoZW1hICpuYW1lcyogc2luY2UgdGhlIGNvbWJvLWJveCBpcyByZWFkLW9ubHkKKwkJcmV0dXJuIChzYyAhPSBudWxsKSA/IHNjLnNvcnRlZFNjaGVtYU5hbWVzKCkgOiBFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiBJZiB0aGUgc3BlY2lmaWVkIG5hbWUgbWF0Y2hlcyB0aGUgbmFtZSBvZiB0aGUgSlBBIHByb2plY3QncworCSAqIGNvbm5lY3Rpb24gcHJvZmlsZSwgcmV0dXJuIGl0OyBvdGhlcndpc2UsIGJ1aWxkIGEgbmV3IGNvbm5lY3Rpb24KKwkgKiBwcm9maWxlLgorCSAqLworCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgY2hlY2tKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoU3RyaW5nIGNwTmFtZSkgeworCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCk7CisJCWlmICgoY3AgIT0gbnVsbCkgJiYgY3AuZ2V0TmFtZSgpLmVxdWFscyhjcE5hbWUpKSB7CisJCQlyZXR1cm4gY3A7CisJCX0KKwkJcmV0dXJuIHRoaXMuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShjcE5hbWUpOworCX0KKworCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gSnB0RGJQbHVnaW4uaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKG5hbWUpOworCX0KKworCisJLy8gKioqKioqKioqKiBsaXN0ZW5lciBjYWxsYmFja3MgKioqKioqKioqKgorCisJdm9pZCBzZWxlY3RlZENvbm5lY3Rpb25DaGFuZ2VkKCkgeworCQlTdHJpbmcgdGV4dCA9IHRoaXMuY29ubmVjdGlvbkNvbWJvQm94LmdldFRleHQoKTsKKwkJaWYgKHRleHQubGVuZ3RoKCkgPT0gMCkgeworCQkJaWYgKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuOyAgLy8gbm8gY2hhbmdlCisJCQl9CisJCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKKwkJCXRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSA9IG51bGw7CisJCX0gZWxzZSB7CisJCQlpZiAodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlID09IG51bGwpIHsKKwkJCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLmNoZWNrSnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKHRleHQpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodGV4dC5lcXVhbHModGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLmdldE5hbWUoKSkpIHsKKwkJCQkJcmV0dXJuOyAgLy8gbm8gY2hhbmdlCisJCQkJfQorCQkJCXRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOworCQkJCXRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuY2hlY2tKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUodGV4dCk7CisJCQl9CisJCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKKwkJfQorCQl0aGlzLmZpcmVDb25uZWN0aW9uUHJvZmlsZUNoYW5nZWQodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlKTsKKwkJdGhpcy5jb25uZWN0aW9uQ2hhbmdlZCgpOworCX0KKworCXZvaWQgc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKCkgeworCQlTY2hlbWEgb2xkID0gdGhpcy5zZWxlY3RlZFNjaGVtYTsKKwkJdGhpcy5zZWxlY3RlZFNjaGVtYSA9IHRoaXMuanBhUHJvamVjdC5nZXREZWZhdWx0RGJTY2hlbWFDb250YWluZXIoKS5nZXRTY2hlbWFOYW1lZCh0aGlzLnNjaGVtYUNvbWJvQm94LmdldFRleHQoKSk7CisJCWlmICh0aGlzLnNlbGVjdGVkU2NoZW1hICE9IG9sZCkgeworCQkJZmlyZVNjaGVtYUNoYW5nZWQodGhpcy5zZWxlY3RlZFNjaGVtYSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBPcGVuIHRoZSBEVFAgTmV3IENvbm5lY3Rpb24gUHJvZmlsZSB3aXphcmQuCisJICogSWYgdGhlIHVzZXIgY3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIHByb2ZpbGUsIHN0YXJ0IHVzaW5nIGl0IGFuZAorCSAqIGNvbm5lY3QgaXQKKwkgKi8KKwl2b2lkIGFkZENvbm5lY3Rpb24oKSB7CisJCVN0cmluZyBhZGRlZFByb2ZpbGVOYW1lID0gRFRQVWlUb29scy5jcmVhdGVOZXdDb25uZWN0aW9uUHJvZmlsZSgpOworCQlpZiAoYWRkZWRQcm9maWxlTmFtZSA9PSBudWxsKSB7CisJCQlyZXR1cm47ICAvLyB1c2VyIHByZXNzZWQgIkNhbmNlbCIKKwkJfQorCQlpZiAodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpIHsKKwkJCXRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOworCQl9CisJCXRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShhZGRlZFByb2ZpbGVOYW1lKTsKKwkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7CisJCXRoaXMudXBkYXRlQ29ubmVjdGlvbkNvbWJvQm94KCk7CisJCXRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7CisJCXRoaXMudXBkYXRlU2NoZW1hQ29tYm9Cb3goKTsKKwkJLy8gZXZlcnl0aGluZyBlbHNlIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQgd2hlbiB3ZSBnZXQgdGhlIHJlc3VsdGluZyBvcGVuIGV2ZW50CisJCXRoaXMuZmlyZUNvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZCh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUpOworCX0KKworCXZvaWQgcmVjb25uZWN0KCkgeworCQl0cnkgeworCQkJd2l6YXJkQ29udGFpbmVyLnJ1bih0cnVlLCB0cnVlLCBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCl7CisJCQkJcHVibGljIHZvaWQgcnVuKCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSAKKwkJCSAgICAJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisJCQkgICAgeworCQkJCQltb25pdG9yLmJlZ2luVGFzayhKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLmNvbm5lY3RpbmdUb0RhdGFiYXNlLCAxMCk7CisJCQkJCWZpbmFsIGJvb2xlYW5bXSBpc0Nvbm5lY3RlZD0gbmV3IGJvb2xlYW5bMV07CisJCQkJCWlzQ29ubmVjdGVkWzBdPWZhbHNlOworCQkJCQlUaHJlYWQgdD0gbmV3IFRocmVhZCgpeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJRGF0YWJhc2VHcm91cC50aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOworCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJCQkJCQkvLyBodWg/CisJCQkJCQkJfQorCQkJCQkJCWlzQ29ubmVjdGVkWzBdPXRydWU7CisJCQkJCQl9CQkJCQkJCisJCQkJCX07CisJCQkJCXQuc3RhcnQoKTsKKwkJCQkJd2hpbGUoICFpc0Nvbm5lY3RlZFswXSApeworCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOworCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7CisJCQkJCX0KKwkJCSAgICAgICAgLy8gZXZlcnl0aGluZyBzaG91bGQgYmUgc3luY2hyb25pemVkIHdoZW4gd2UgZ2V0IHRoZSByZXN1bHRpbmcgb3BlbiBldmVudAorCQkJCQltb25pdG9yLmRvbmUoKTsKKwkJCSAgICB9CisJCQl9KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIGNhbGxlZCB3aGVuCisJICogICAgIC0gdGhlIHVzZXIgc2VsZWN0cyBhIG5ldyBjb25uZWN0aW9uCisJICogICAgIC0gdGhlIGNvbm5lY3Rpb24gd2FzIG9wZW5lZAorCSAqICAgICAtIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgKG5ldmVyIGhhcHBlbnM/KQorCSAqIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzY2hlbWEgc3R1ZmYgYW5kIHRoZSByZWNvbm5lY3QgbGluaworCSAqLworCXZvaWQgY29ubmVjdGlvbkNoYW5nZWQoKSB7CisJCVNjaGVtYSBvbGQgPSB0aGlzLnNlbGVjdGVkU2NoZW1hOworCQl0aGlzLnNlbGVjdGVkU2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7CisJCWlmICh0aGlzLnNlbGVjdGVkU2NoZW1hICE9IG9sZCkgeworCQkJdGhpcy5maXJlU2NoZW1hQ2hhbmdlZCh0aGlzLnNlbGVjdGVkU2NoZW1hKTsKKwkJfQorCQl0aGlzLnVwZGF0ZVNjaGVtYUNvbWJvQm94KCk7CisJCXRoaXMudXBkYXRlUmVjb25uZWN0TGluaygpOworCX0KKworCisJLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgorCisJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3Rpb25Db21ib0JveFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJLy8gbm90aGluZyBzcGVjaWFsIGZvciAiZGVmYXVsdCIgKGRvdWJsZS1jbGljaz8pCisJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQkJCURhdGFiYXNlR3JvdXAudGhpcy5zZWxlY3RlZENvbm5lY3Rpb25DaGFuZ2VkKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJEYXRhYmFzZUNvbm5lY3Rpb25XaXphcmRQYWdlIGNvbm5lY3Rpb24gY29tYm8tYm94IHNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU2NoZW1hQ29tYm9Cb3hTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQkJCS8vIG5vdGhpbmcgc3BlY2lhbCBmb3IgImRlZmF1bHQiIChkb3VibGUtY2xpY2s/KQorCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOworCQkJfQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKwkJCQlEYXRhYmFzZUdyb3VwLnRoaXMuc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCQkJcmV0dXJuICJEYXRhYmFzZUNvbm5lY3Rpb25XaXphcmRQYWdlIHNjaGVtYSBjb21iby1ib3ggc2VsZWN0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRBZGRDb25uZWN0aW9uTGlua1NlbGVjdGlvbkxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJRGF0YWJhc2VHcm91cC50aGlzLmFkZENvbm5lY3Rpb24oKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gIkRhdGFiYXNlQ29ubmVjdGlvbldpemFyZFBhZ2UgYWRkIGNvbm5lY3Rpb24gbGluayBzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFJlY29ubmVjdExpbmtTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQkJCURhdGFiYXNlR3JvdXAudGhpcy5yZWNvbm5lY3QoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCQlyZXR1cm4gIkRhdGFiYXNlQ29ubmVjdGlvbldpemFyZFBhZ2UgcmVjb25uZWN0IGxpbmsgc2VsZWN0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKKwkJCQl0aGlzLmNvbm5lY3Rpb25DaGFuZ2VkKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUgIC8vIHRoaXMgcHJvYmFibHkgd29uJ3QgZXZlciBnZXQgY2FsbGVkLi4uCisJCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKKwkJCQl0aGlzLmNvbm5lY3Rpb25DaGFuZ2VkKCk7CisJCQl9CisJCQlwcml2YXRlIHZvaWQgY29ubmVjdGlvbkNoYW5nZWQoKSB7CisJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAorCQkJCQluZXcgUnVubmFibGUoKSB7CisJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJRGF0YWJhc2VHcm91cC50aGlzLmNvbm5lY3Rpb25DaGFuZ2VkKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiRGF0YWJhc2VDb25uZWN0aW9uV2l6YXJkUGFnZSBjb25uZWN0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9OworCX0KKworCisJLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgorCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJaWYgKCAhIHRoaXMubGlzdGVuZXJzLmFkZChsaXN0ZW5lcikpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJaWYgKCAhIHRoaXMubGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcikpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1pc3NpbmcgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCXByaXZhdGUgSXRlcmF0b3I8TGlzdGVuZXI+IGxpc3RlbmVycygpIHsKKwkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPExpc3RlbmVyPih0aGlzLmxpc3RlbmVycyk7CisJfQorCisJdm9pZCBmaXJlQ29ubmVjdGlvblByb2ZpbGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlKSB7CisJCWZvciAoSXRlcmF0b3I8TGlzdGVuZXI+IHN0cmVhbSA9IHRoaXMubGlzdGVuZXJzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgeworCQkJc3RyZWFtLm5leHQoKS5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZChjb25uZWN0aW9uUHJvZmlsZSk7CisJCX0KKwl9CisKKwl2b2lkIGZpcmVTY2hlbWFDaGFuZ2VkKFNjaGVtYSBzY2hlbWEpIHsKKwkJZm9yIChJdGVyYXRvcjxMaXN0ZW5lcj4gc3RyZWFtID0gdGhpcy5saXN0ZW5lcnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7CisJCQlzdHJlYW0ubmV4dCgpLnNlbGVjdGVkU2NoZW1hQ2hhbmdlZChzY2hlbWEpOworCQl9CisJfQorCisJLy8gKioqKioqKioqKiBVSSBjb21wb25lbnRzICoqKioqKioqKioKKworCS8qKgorCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBsYWJlbAorCSAqLworCXByaXZhdGUgTGFiZWwgYnVpbGRMYWJlbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQodGV4dCk7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7CisJCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7CisJCXJldHVybiBsYWJlbDsKKwl9CisKKwkvKioKKwkgKiBidWlsZCBhbmQgcmV0dXJuIGEgY29tYm8tYm94CisJICovCisJcHJpdmF0ZSBDb21ibyBidWlsZENvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOworCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKKwkJLy9kYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlIDsKKwkJZGF0YS53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7CisJCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7CisJCXJldHVybiBjb21ibzsKKwl9CisKKwkvKioKKwkgKiBidWlsZCBhbmQgcmV0dXJuIGEgbGluaworCSAqLworCXByaXZhdGUgQnV0dG9uIGJ1aWxkQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0b29sVGlwVGV4dCwgSW1hZ2UgaW1hZ2UsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKKwkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7CisJCWJ1dHRvbi5zZXRJbWFnZSggaW1hZ2UgKTsKKwkJYnV0dG9uLnNldFRvb2xUaXBUZXh0KCB0b29sVGlwVGV4dCk7CisJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCXJldHVybiBidXR0b247CisJfQorCisJLy8gKioqKioqKioqKiBsaXN0ZW5lciBpbnRlcmZhY2UgKioqKioqKioqKgorCisJLyoqCisJICogQWxsb3dzIGNsaWVudHMgdG8gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBzZWxlY3RlZCBjb25uZWN0aW9uIHByb2ZpbGUKKwkgKiBhbmQgc2NoZW1hLgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyCisJeworCQl2b2lkIHNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlKTsKKwkJdm9pZCBzZWxlY3RlZFNjaGVtYUNoYW5nZWQoU2NoZW1hIHNjaGVtYSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EZWZhdWx0VGFibGVHZW5lcmF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vRGVmYXVsdFRhYmxlR2VuZXJhdGlvbldpemFyZFBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDJiOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vRGVmYXVsdFRhYmxlR2VuZXJhdGlvbldpemFyZFBhZ2UuamF2YQpAQCAtMCwwICsxLDM0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5KYXZhUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLk5ld1dpemFyZE1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLlR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5UeXBlZFZpZXdlckZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRDb21wYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3VHlwZVdpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuT1JNR2VuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLkpwdFVpUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKKworLyoqCisgKiBBIHdpemFyZCBwYWdlIGFsbG93aW5nIHRoZSBlbnRyeSBvZiB0aGUgZGVmYXVsdCB0YWJsZSBnZW5lcmF0aW9uIAorICogcHJvcGVydGllcyAoSmF2YSBjbGFzc2VzIHBhY2thZ2UsIGJhc2UgY2xhc3MsIGV0YykuCisgKiBUaGVzZSBwcm9wZXJ0aWVzIGFwcGx5IHRvIGFsbCB0YWJsZXMgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiAoaW4gdGhlIHRhYmxlIGdlbmVyYXRpb24gcGFnZSkuCisgKiAKKyAqIEBhdXRob3IgRGFubnkgSnUKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRUYWJsZUdlbmVyYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgTmV3VHlwZVdpemFyZFBhZ2UgeworCisJcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3Q7CisKKwkvKnRoZSBpbnN0YW5jZSB1c2VkIHRvIGdldC9zZXQgdGhlIGRlZmF1bHQgcHJvcGVydGllcy4qLworCXByaXZhdGUgT1JNR2VuVGFibGUgZGVmYXVsdHNUYWJsZTsKKworCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyOworCQorCXByaXZhdGUgVGFibGVHZW5QYW5lbCBkZWZhdWx0VGFibGVHZW5QYW5lbCA7CisKKwlwcm90ZWN0ZWQgRGVmYXVsdFRhYmxlR2VuZXJhdGlvbldpemFyZFBhZ2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7CisJCXN1cGVyKHRydWUsICJEZWZhdWx0VGFibGVHZW5lcmF0aW9uV2l6YXJkUGFnZSIpOyAvLyROT04tTkxTLTEkCisJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7CisJCXNldFRpdGxlKEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3RpdGxlKTsKKwkJc2V0RGVzY3JpcHRpb24oIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2Rlc2MpOworCX0KKwkKKwkKKwkvLyAtLS0tLS0tLSBJbml0aWFsaXphdGlvbiAtLS0tLS0tLS0KKwkvKioKKwkgKiBUaGUgd2l6YXJkIG93bmluZyB0aGlzIHBhZ2UgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aCB0aGUKKwkgKiBjdXJyZW50IHNlbGVjdGlvbi4gVGhlIHNlbGVjdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkcyBvZiB0aGUgd2l6YXJkIAorCSAqIHBhZ2UuCisJICogCisJICogQHBhcmFtIHNlbGVjdGlvbiB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkcworCSAqLworCXZvaWQgaW5pdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJSUphdmFFbGVtZW50IGplbGVtID0gbnVsbDsKKwkJaWYgKCBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQgKSB7CisJCQlqZWxlbSA9IChJSmF2YUVsZW1lbnQpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJfWVsc2V7CisJCQlqZWxlbSA9IHRoaXMuanBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpOwkJCQorCQl9CisJCWlmKCBqZWxlbSAhPW51bGwgKXsKKwkJCWluaXRDb250YWluZXJQYWdlKGplbGVtKTsKKwkJCWluaXRUeXBlUGFnZShqZWxlbSk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKKwkJaW50IG5Db2x1bW5zPSA0CQk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKKwkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCQl0aGlzLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX0NVU1RPTUlaRV9ERUZBVUxUX0VOVElUWV9HRU5FUkFUSU9OKTsKKworCQkvL0NyZWF0ZSBlbnRpdHkgYWNjZXNzLCBjb2xsZWN0aW9uIHR5cGUsIGV0YyAKKwkJZGVmYXVsdFRhYmxlR2VuUGFuZWwgPSBuZXcgVGFibGVHZW5QYW5lbChjb21wb3NpdGUsIDQsIHRydWUsIHRoaXMpOworCQkKKwkJY3JlYXRlRG9tYWluSmF2YUNsYXNzZXNQcm9wZXJ0aWVzR3JvdXAoY29tcG9zaXRlLCA0KTsKKwkJc2V0Q29udHJvbChjb21wb3NpdGUpOworCisJCQorCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSggdHJ1ZSApOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CisJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7CisJCWlmICh2aXNpYmxlKSB7CisJCQlPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBnZXRDdXN0b21pemVyKCk7CisJCQkvL0lmIHVzZXIgY2hhbmdlZCB0aGUgY29ubmVjdGlvbiBvciBzY2hlbWEKKwkJCWlmICggdGhpcy5jdXN0b21pemVyICE9IGN1c3RvbWl6ZXIgKSB7CisJCQkJdGhpcy5jdXN0b21pemVyID0gY3VzdG9taXplcjsgCisJCQkJT1JNR2VuVGFibGUgbmV3VGFibGU7CisJCQkJbmV3VGFibGUgPSBnZXRDdXN0b21pemVyKCkuY3JlYXRlR2VuVGFibGUobnVsbCk7CisJCQkJdGhpcy5kZWZhdWx0c1RhYmxlID0gbmV3VGFibGU7CisJCQkJZGVmYXVsdFRhYmxlR2VuUGFuZWwuc2V0T1JNR2VuVGFibGUobmV3VGFibGUpOworCisJCQkJLy9zZXQgdGhlIHN1cGVyIGNsYXNzIGFuZCBpbXBsZW1lbnRlZCBpbnRlcmZhY2VzIHZhbHVlCisJCQkJU3RyaW5nIGJhc2VDbGFzcyA9IGRlZmF1bHRzVGFibGUuZ2V0RXh0ZW5kcygpID09IG51bGwgPyIiIDogZGVmYXVsdHNUYWJsZS5nZXRFeHRlbmRzKCk7CisJCQkJc2V0U3VwZXJDbGFzcyhiYXNlQ2xhc3MsIHRydWUpOworCQkJCXNldFN1cGVySW50ZXJmYWNlcyhkZWZhdWx0c1RhYmxlLmdldEltcGxlbWVudHMoKSwgdHJ1ZSk7CisJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFNvdXJjZUZvbGRlciggZGVmYXVsdHNUYWJsZS5nZXRTb3VyY2VGb2xkZXIoKSk7CisJCQkJU3RyaW5nIGluaXRQYWNrYWdlTmFtZSA9IHRoaXMuZ2V0UGFja2FnZVRleHQoKTsKKwkJCQlpZiggaW5pdFBhY2thZ2VOYW1lLmxlbmd0aCgpPT0wICl7CisJCQkJCXNldFBhY2thZ2VOYW1lKCByb290LCBkZWZhdWx0c1RhYmxlLmdldFBhY2thZ2UoKSApOworCQkJCX0KKwkJCQlzZXRQYWNrYWdlRnJhZ21lbnRSb290KHJvb3QsIHRydWUvKmNhbkJlTW9kaWZpZWQqLyk7CisJCQl9CisJCX0KKwl9CQorCQorCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0U291cmNlRm9sZGVyKFN0cmluZyBzcmNGb2RsZXIpeworCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290PW51bGw7CisJCS8vIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC51aS5lZGl0b3IucGx1Z2luLkphdmFBdHRyaWJ1dGVXaXphcmRQYWdlCisJCXRyeSB7CisJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBqcGFQcm9qZWN0LmdldEphdmFQcm9qZWN0KCk7CisKKwkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgeworCQkJCWlmIChyb290c1tpXS5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKKwkJCQkJLy9TYXZlIHRoZSBkZWZhdWx0IHNvdXJjZSByb290CisJCQkJCWlmKGk9PTApIHBhY2thZ2VGcmFnbWVudFJvb3QgPSByb290c1tpXTsKKwkJCQkJLy9maW5kIGFsdGVybmF0aXZlIHNvdXJjZSByb290IG1hdGNoIHRoZSBzYXZlZCB2YWx1ZQorCQkJCQlpZiggcm9vdHNbaV0uZ2V0UGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKCIvIitzcmNGb2RsZXIpKXsKKwkJCQkJCXBhY2thZ2VGcmFnbWVudFJvb3Q9cm9vdHNbaV07CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlKcHRVaVBsdWdpbi5sb2coZSk7CisJCX0KKwkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudFJvb3Q7CisJfQorCQorCXByaXZhdGUgdm9pZCBzZXRQYWNrYWdlTmFtZShJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290LCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKKwkJaWYoIHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoKCkgPT0gMCB8fCBwYWNrYWdlRnJhZ21lbnRSb290PT1udWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJLy9JSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBqcGFQcm9qZWN0LmdldEphdmFQcm9qZWN0KCk7CisJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpOworCQlzZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZUZyYWdtZW50LCB0cnVlLypjYW5CZU1vZGlmaWVkKi8pOworCX0KKworCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRG9tYWluSmF2YUNsYXNzZXNQcm9wZXJ0aWVzR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGNvbHVtbnMpIHsKKwkJR3JvdXAgcGFyZW50ID0gbmV3IEdyb3VwKCBjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJcGFyZW50LnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2RvbWFpbkphdmFDbGFzcyk7CisJCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoIGNvbHVtbnMsIGZhbHNlKSk7CisJCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJbGF5b3V0RGF0YS5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbnM7CisJCWxheW91dERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJbGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWxheW91dERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWxheW91dERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOworCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKKwkJCisJCS8vZGVmYXVsdCBKYXZhIHBhY2thZ2UgbmFtZSBvbmx5IGF2YWlsYWJsZSBmb3IgZGVmYXVsdCB0YWJsZSBnZW5lcmF0aW9uCisJCWNyZWF0ZVBhY2thZ2VDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOworCQljcmVhdGVDb250YWluZXJDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOworCQljcmVhdGVTdXBlckNsYXNzQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKKwkJY3JlYXRlU3VwZXJJbnRlcmZhY2VzQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElTdGF0dXMgcGFja2FnZUNoYW5nZWQoKSB7CisJCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIucGFja2FnZUNoYW5nZWQoKTsgCisJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gZ2V0UGFja2FnZUZyYWdtZW50KCk7CisJCS8vU3RyaW5nIHNyY0ZvbGRlciA9IHBhY2thZ2VGcmFnbWVudC5nZXRQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpOworCQlpZiAoZGVmYXVsdHNUYWJsZSAhPSBudWxsICYmICFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgeworCQkJZGVmYXVsdHNUYWJsZS5zZXRQYWNrYWdlKHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0JCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSVN0YXR1cyBzdXBlckNsYXNzQ2hhbmdlZCgpIHsKKwkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci5zdXBlckNsYXNzQ2hhbmdlZCgpOworCQlTdHJpbmcgYmFzZUNsYXNzID0gZ2V0U3VwZXJDbGFzcygpOworCQlpZiAoYmFzZUNsYXNzICE9IG51bGwgJiYgZGVmYXVsdHNUYWJsZSAhPSBudWxsICYmICFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgeworCQkJU3RyaW5nIG9sZEJhc2VDbGFzcyA9IGRlZmF1bHRzVGFibGUuZ2V0RXh0ZW5kcygpOworCQkJaWYgKCAhYmFzZUNsYXNzLmVxdWFscyhvbGRCYXNlQ2xhc3MpKSB7CisJCQkJZGVmYXVsdHNUYWJsZS5zZXRFeHRlbmRzKGJhc2VDbGFzcyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN0YXR1czsgCisJfQkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSVN0YXR1cyBjb250YWluZXJDaGFuZ2VkKCkgeworCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLmNvbnRhaW5lckNoYW5nZWQoKTsKKwkJU3RyaW5nIHNyY0ZvbGRlciA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3RUZXh0KCk7CisJCWlmKCAhc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikgKXsKKwkJCWlmIChkZWZhdWx0c1RhYmxlICE9IG51bGwgKSB7CisJCQkJZGVmYXVsdHNUYWJsZS5zZXRTb3VyY2VGb2xkZXIoIHNyY0ZvbGRlciApOworCQkJfQorCQl9CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyoqIE92ZXJyaWRlIHRvIGFsbG93IHNlbGVjdCBzb3VyY2UgZm9sZGVyIGluIGN1cnJlbnQgcHJvamVjdCBvbmx5CisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdDb250YWluZXJXaXphcmRQYWdlI2Nob29zZUNvbnRhaW5lcigpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IGNob29zZUNvbnRhaW5lcigpIHsKKwkJSUphdmFFbGVtZW50IGluaXRFbGVtZW50PSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7CisJCUNsYXNzW10gYWNjZXB0ZWRDbGFzc2VzPSBuZXcgQ2xhc3NbXSB7IElQYWNrYWdlRnJhZ21lbnRSb290LmNsYXNzLCBJSmF2YVByb2plY3QuY2xhc3MgfTsKKwkJVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yIHZhbGlkYXRvcj0gbmV3IFR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvcihhY2NlcHRlZENsYXNzZXMsIGZhbHNlKSB7CisJCQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkVmFsaWQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCQl0cnkgeworCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgeworCQkJCQkJSUphdmFQcm9qZWN0IGpwcm9qZWN0PSAoSUphdmFQcm9qZWN0KWVsZW1lbnQ7CisJCQkJCQlJUGF0aCBwYXRoPSBqcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKKwkJCQkJCXJldHVybiAoanByb2plY3QuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QocGF0aCkgIT0gbnVsbCk7CisJCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7CisJCQkJCQlyZXR1cm4gKCgoSVBhY2thZ2VGcmFnbWVudFJvb3QpZWxlbWVudCkuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQlKYXZhUGx1Z2luLmxvZyhlLmdldFN0YXR1cygpKTsgLy8ganVzdCBsb2csIG5vIFVJIGluIHZhbGlkYXRpb24KKwkJCQl9CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9OworCisJCWFjY2VwdGVkQ2xhc3Nlcz0gbmV3IENsYXNzW10geyBJSmF2YU1vZGVsLmNsYXNzLCBJUGFja2FnZUZyYWdtZW50Um9vdC5jbGFzcywgSUphdmFQcm9qZWN0LmNsYXNzIH07CisJCVZpZXdlckZpbHRlciBmaWx0ZXI9IG5ldyBUeXBlZFZpZXdlckZpbHRlcihhY2NlcHRlZENsYXNzZXMpIHsKKwkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgeworCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCXJldHVybiAoKChJUGFja2FnZUZyYWdtZW50Um9vdCllbGVtZW50KS5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpOworCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJCQkJSmF2YVBsdWdpbi5sb2coZS5nZXRTdGF0dXMoKSk7IC8vIGp1c3QgbG9nLCBubyBVSSBpbiB2YWxpZGF0aW9uCisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIHN1cGVyLnNlbGVjdCh2aWV3ZXIsIHBhcmVudCwgZWxlbWVudCk7CisJCQl9CisJCX07CisKKwkJU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlciBwcm92aWRlcj0gbmV3IFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIoKTsKKwkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcj0gbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcihKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19ERUZBVUxUKTsKKwkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgbGFiZWxQcm92aWRlciwgcHJvdmlkZXIpOworCQlkaWFsb2cuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7CisJCWRpYWxvZy5zZXRDb21wYXJhdG9yKG5ldyBKYXZhRWxlbWVudENvbXBhcmF0b3IoKSk7CisJCWRpYWxvZy5zZXRUaXRsZShOZXdXaXphcmRNZXNzYWdlcy5OZXdDb250YWluZXJXaXphcmRQYWdlX0Nob29zZVNvdXJjZUNvbnRhaW5lckRpYWxvZ190aXRsZSk7CisJCWRpYWxvZy5zZXRNZXNzYWdlKE5ld1dpemFyZE1lc3NhZ2VzLk5ld0NvbnRhaW5lcldpemFyZFBhZ2VfQ2hvb3NlU291cmNlQ29udGFpbmVyRGlhbG9nX2Rlc2NyaXB0aW9uKTsKKwkJZGlhbG9nLmFkZEZpbHRlcihmaWx0ZXIpOworCQlkaWFsb2cuc2V0SW5wdXQoSmF2YUNvcmUuY3JlYXRlKCBqcGFQcm9qZWN0LmdldFByb2plY3QoKSkpOworCQlkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbihpbml0RWxlbWVudCk7CisJCWRpYWxvZy5zZXRIZWxwQXZhaWxhYmxlKGZhbHNlKTsKKworCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKKwkJCU9iamVjdCBlbGVtZW50PSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7CisJCQkJSUphdmFQcm9qZWN0IGpwcm9qZWN0PSAoSUphdmFQcm9qZWN0KWVsZW1lbnQ7CisJCQkJcmV0dXJuIGpwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoanByb2plY3QuZ2V0UHJvamVjdCgpKTsKKwkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7CisJCQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50Um9vdCllbGVtZW50OworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZUZpZWxkQ2hhbmdlZChTdHJpbmcgZmllbGROYW1lKSB7CisJCXN1cGVyLmhhbmRsZUZpZWxkQ2hhbmdlZChmaWVsZE5hbWUpOworCQlpZiAodGhpcy5mQ29udGFpbmVyU3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKKwkJCXVwZGF0ZVN0YXR1cyhmQ29udGFpbmVyU3RhdHVzKTsKKwkJfWVsc2UgaWYoICEgdGhpcy5mUGFja2FnZVN0YXR1cy5tYXRjaGVzKElTdGF0dXMuT0spICkgeworCQkJdXBkYXRlU3RhdHVzKGZQYWNrYWdlU3RhdHVzKTsKKwkJfSBlbHNlIGlmICh0aGlzLmZTdXBlckNsYXNzU3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKKwkJCXVwZGF0ZVN0YXR1cyhmU3VwZXJDbGFzc1N0YXR1cyk7CisJCX0gZWxzZSB7CisJCQl1cGRhdGVTdGF0dXMoU3RhdHVzLk9LX1NUQVRVUyk7CisJCX0KKwl9CisJCisJQE92ZXJyaWRlCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJvdGVjdGVkIElTdGF0dXMgc3VwZXJJbnRlcmZhY2VzQ2hhbmdlZCgpIHsKKwkJSVN0YXR1cyByZXQgPSBzdXBlci5zdXBlckludGVyZmFjZXNDaGFuZ2VkKCk7CisJCWlmICggcmV0LmlzT0soKSApIHsKKwkJCUxpc3QgaW50ZXJmYWNlcyA9IGdldFN1cGVySW50ZXJmYWNlcygpOworCQkJaWYoZGVmYXVsdHNUYWJsZSE9bnVsbCkKKwkJCQlkZWZhdWx0c1RhYmxlLnNldEltcGxlbWVudHMoaW50ZXJmYWNlcyk7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CQorCisJcHJpdmF0ZSBPUk1HZW5DdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKSB7CisJCUdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIHdpemFyZCA9IChHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCkgdGhpcy5nZXRXaXphcmQoKTsKKwkJcmV0dXJuIHdpemFyZC5nZXRDdXN0b21pemVyKCk7CisJfQkKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHBlcmZvcm1IZWxwKCkgeworICAgICAgICB0aGlzLmdldEhlbHBTeXN0ZW0oKS5kaXNwbGF5SGVscCggR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQuSEVMUF9DT05URVhUX0lEICk7CisgICAgfQorICAgIAorCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgeworCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7CisJfQorfQorCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9HZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTIzNTAzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQuamF2YQpAQCAtMCwwICsxLDU1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVJ1bGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuc3luY2guU3luY2hyb25pemVDbGFzc2VzSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5Gb3JlaWduS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuQmFzZUVudGl0eUdlbkN1c3RvbWl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5EYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLk9STUdlbkN1c3RvbWl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5QYWNrYWdlR2VuZXJhdG9yMjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKKworcHVibGljIGNsYXNzIEdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIGV4dGVuZHMgV2l6YXJkIAorCWltcGxlbWVudHMgSU5ld1dpemFyZCAgewkKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUxQX0NPTlRFWFRfSUQgPSBKcHRVaVBsdWdpbi5QTFVHSU5fSUQgKyAiLkdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPTlRfU0hPV19PVkVSV1JJVEVfV0FSTklOR19ESUFMT0cgPSAiRE9OVF9TSE9XX09WRVJXUklURV9XQVJOSU5HX0RJQUxPRyI7CisKKwlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKKworCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOworCisJcHJpdmF0ZSBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBudWxsOwkKKworCXByaXZhdGUgYm9vbGVhbiBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sOworCisJcHJpdmF0ZSBQcm9tcHRKUEFQcm9qZWN0V2l6YXJkUGFnZSBwcm9qZWN0UGFnZTsJCisKKwlwcml2YXRlIFRhYmxlc1NlbGVjdG9yV2l6YXJkUGFnZSB0YWJsZXNTZWxlY3RvclBhZ2U7CisKKwlwcml2YXRlIFRhYmxlQXNzb2NpYXRpb25zV2l6YXJkUGFnZSB0YWJsZUFzc29jaWF0aW9uc1BhZ2U7CisJCisJcHJpdmF0ZSBEZWZhdWx0VGFibGVHZW5lcmF0aW9uV2l6YXJkUGFnZSBkZWZhdWx0VGFibGVHZW5lcmF0aW9uUGFnZTsKKwkKKwlwcml2YXRlIFRhYmxlc0FuZENvbHVtbnNDdXN0b21pemF0aW9uV2l6YXJkUGFnZSB0YWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvblBhZ2U7CisJCisJcHVibGljIEdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkKCkgeworCQl0aGlzLnNldFdpbmRvd1RpdGxlKCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZ2VuZXJhdGVFbnRpdGllcyk7CisJfQorCQorCXB1YmxpYyBHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCggSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKKwkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247CisJCXRoaXMuc2V0V2luZG93VGl0bGUoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9nZW5lcmF0ZUVudGl0aWVzKTsKKwl9CisJCisJcHVibGljIEltYWdlIGdldERlZmF1bHRQYWdlSW1hZ2UoKSB7CisJCXJldHVybiBKcHRVaVBsdWdpbi5nZXRJbWFnZSggSnB0VWlJY29ucy5FTlRJVFlfV0laX0JBTk5FUiApIDsKKwl9CQorCQorCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgeworCQlzdXBlci5hZGRQYWdlcygpOworCisJCXNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKKwkJCisJCS8vSWYgdGhpcy5qcGFQcm9qZWN0IGlzIG5vdCBpbml0aWFsaXplZCBiZWNhdXNlIHVzZXIgZGlkbid0IHNlbGVjdCBhIEpQQSBwcm9qZWN0CisJCWlmKCB0aGlzLmpwYVByb2plY3QgPT0gbnVsbCApeworCQkJcHJvamVjdFBhZ2UgPSBuZXcgUHJvbXB0SlBBUHJvamVjdFdpemFyZFBhZ2UoIEhFTFBfQ09OVEVYVF9JRCApOworCQkJdGhpcy5hZGRQYWdlKHByb2plY3RQYWdlKTsKKwkJCXJldHVybjsKKwkJfQorCQlhZGRNYWluUGFnZXMoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkTWFpblBhZ2VzKCkKKwl7CisJCXRoaXMudGFibGVzU2VsZWN0b3JQYWdlID0gbmV3IFRhYmxlc1NlbGVjdG9yV2l6YXJkUGFnZSggdGhpcy5qcGFQcm9qZWN0ICk7CisJCXRoaXMuYWRkUGFnZSh0YWJsZXNTZWxlY3RvclBhZ2UpOworCQkKKwkJdGhpcy50YWJsZUFzc29jaWF0aW9uc1BhZ2UgPSBuZXcgVGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlKCB0aGlzLmpwYVByb2plY3QgICk7CisJCXRoaXMuYWRkUGFnZSh0YWJsZUFzc29jaWF0aW9uc1BhZ2UpOworCisJCXRoaXMuZGVmYXVsdFRhYmxlR2VuZXJhdGlvblBhZ2UgPSBuZXcgRGVmYXVsdFRhYmxlR2VuZXJhdGlvbldpemFyZFBhZ2UoIHRoaXMuanBhUHJvamVjdCk7CisJCXRoaXMuYWRkUGFnZShkZWZhdWx0VGFibGVHZW5lcmF0aW9uUGFnZSk7CisJCXRoaXMuZGVmYXVsdFRhYmxlR2VuZXJhdGlvblBhZ2UuaW5pdCh0aGlzLnNlbGVjdGlvbik7CisJCQorCQl0aGlzLnRhYmxlc0FuZENvbHVtbnNDdXN0b21pemF0aW9uUGFnZSA9IG5ldyBUYWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvbldpemFyZFBhZ2UoIHRoaXMuanBhUHJvamVjdCApOworCQl0aGlzLmFkZFBhZ2UodGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25QYWdlKTsKKwkJdGhpcy50YWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvblBhZ2UuaW5pdChzZWxlY3Rpb24pOwkJCisJfQorCQorCXB1YmxpYyBPUk1HZW5DdXN0b21pemVyIGdldE9STUdlbkN1c3RvbWl6ZXIoKXsKKwkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIE9STUdlbkN1c3RvbWl6ZXIgd2hlbiB1c2VyIHNlbGVjdHMgYSBuZXcgY29ubmVjdGlvbiBwcm9maWxlIGFuZCBzY2hlbWEgCisJICogCisJICogSnBhUGxhdGZvcm0gaW1wbGVtZW50b3IgY2FuIHByb3ZpZGUgYSBjdXN0b20gT1JNR2VuQ3VzdG9taXplciBzcGVjaWZpYyB0byBhIHBsYXRmb3JtCisJICogd2l0aCBBZGFwdGVyRmFjdG9yeSB0aHJvdWdoIEVjbGlwc2Ugb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIGV4dGVuc2lvbiBwb2ludDoKKwkgKiA8cHJlPiAKKwkgKiAgCisJICo8ZXh0ZW5zaW9uCisgICAgICogICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+CisgICAgICogPGZhY3RvcnkKKyAgICAgKiAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua1BsYXRmb3JtIgorICAgICAqICAgICAgIGNsYXNzPSJvcmFjbGUuZWNsaXBzZS50b29scy5vcm0uaW50ZXJuYWwuRWNsaXBzZUxpbmtPUk1HZW5DdXN0b21pemVyQWRhcHRlckZhY3RvcnkiPgorICAgICAqICAgIDxhZGFwdGVyCisgICAgICogICAgICAgICAgdHlwZT0ib3JhY2xlLmVjbGlwc2UudG9vbHMub3JtLmludGVybmFsLk9STUdlbkN1c3RvbWl6ZXIiPgorICAgICAqICAgIDwvYWRhcHRlcj4KKyAgICAgKiA8L2ZhY3Rvcnk+CisgICAgICo8L2V4dGVuc2lvbj4KKwkgKjwvcHJlPiAKKwkgKiAKKwkgKiBAcGFyYW0gc2NoZW1hIAorCSAqLworCXB1YmxpYyBPUk1HZW5DdXN0b21pemVyIGNyZWF0ZU9STUdlbkN1c3RvbWl6ZXIoU2NoZW1hIHNjaGVtYSl7CisJCUpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtID0gdGhpcy5qcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCk7CisJCU9iamVjdCBvYmogPSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIoIGpwYVBsYXRmb3JtLCBPUk1HZW5DdXN0b21pemVyLmNsYXNzICk7CisJCWlmKCBvYmogIT0gbnVsbCAgJiYgb2JqIGluc3RhbmNlb2YgT1JNR2VuQ3VzdG9taXplcil7CisJCQljdXN0b21pemVyID0gKE9STUdlbkN1c3RvbWl6ZXIpIG9iaiA7IAorCQkJY3VzdG9taXplci5pbml0KGdldEN1c3RvbWl6YXRpb25GaWxlKCksIHNjaGVtYSApOyAgCisJCX1lbHNleworCQkJY3VzdG9taXplciA9IG5ldyBCYXNlRW50aXR5R2VuQ3VzdG9taXplciggKTsKKwkJCWN1c3RvbWl6ZXIuaW5pdChnZXRDdXN0b21pemF0aW9uRmlsZSgpLCBzY2hlbWEgKTsgIAorCQl9CisJCXJldHVybiBjdXN0b21pemVyOworCX0gCisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21pemF0aW9uRmlsZU5hbWUoKSB7CisJCUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUgPSBnZXRQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKTsKKwkJU3RyaW5nIGNvbm5lY3Rpb24gPSBwcm9maWxlPT1udWxsPyIiOnByb2ZpbGUuZ2V0TmFtZSgpOworCQlTdHJpbmcgbmFtZSA9ICJvcmcuZWNsaXBzZS5qcHQuZW50aXR5Z2VuLiIgKyAoY29ubmVjdGlvbj09bnVsbD8iIjpjb25uZWN0aW9uLnJlcGxhY2UoJyAnLCAnLScpKTsgIC8vJE5PTi1OTFMtMSQKKwkJU2NoZW1hIHNjaGVtYSA9IGdldERlZmF1bHRTY2hlbWEoKTsKKwkJaWYgKCBzY2hlbWEhPSBudWxsICApIHsKKwkJCW5hbWUgKz0gIi4iICsgc2NoZW1hLmdldE5hbWUoKTsvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgbm9kZXMgc3RhdGUgZmlsZS4gCisJICovCisJcHJpdmF0ZSBGaWxlIGdldEN1c3RvbWl6YXRpb25GaWxlKCkgeworCQlTdHJpbmcgcHJvamVjdFBhdGggPSBqcGFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpLnRvUG9ydGFibGVTdHJpbmcoKTsKKwkJRmlsZSBnZW5EaXIgPSBuZXcgRmlsZShwcm9qZWN0UGF0aCArICIvLnNldHRpbmdzIik7Ly8kTk9OLU5MUy0xJAorICAgICAgICBnZW5EaXIubWtkaXJzKCk7CisJCXJldHVybiBuZXcgRmlsZShnZW5EaXIsIGdldEN1c3RvbWl6YXRpb25GaWxlTmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgeworCQlpZiggdGhpcy5qcGFQcm9qZWN0ID09IG51bGwgKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQl0cnkgeworCQkJdGhpcy5jdXN0b21pemVyLnNldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCBidWlsZERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkgKTsKKwkJCXRoaXMuY3VzdG9taXplci5zYXZlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKKwkJfQorCQkKKwkJdGhpcy5zeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sID0gdGhpcy50YWJsZXNTZWxlY3RvclBhZ2Uuc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCgpOworCisJCWlmKHNob3VsZFNob3dPdmVyd3JpdGVXYXJuaW5nKCkpCisJCQlQYWNrYWdlR2VuZXJhdG9yMi5zZXRPdmVyd3JpdGVDb25maXJtZXIoIG5ldyBPdmVyd3JpdGVDb25maXJtZXIoKSk7CisKKwkJV29ya3NwYWNlSm9iIGdlbkVudGl0aWVzSm9iID0gbmV3IEdlbmVyYXRlRW50aXRpZXNKb2IoIHRoaXMuanBhUHJvamVjdCwgIGdldEN1c3RvbWl6ZXIoKSApOworCQkKKwkJV29ya3NwYWNlSm9iIHN5bmNoQ2xhc3Nlc0pvYiA9IG51bGw7CisJCWlmIChzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKCkpIHsKKwkJCS8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgKm9uZSogcGVyc2lzdGVuY2UueG1sIGZpbGUgcGVyIHByb2plY3QKKwkJCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOworCQkJaWYgKHBlcnNpc3RlbmNlWG1sICE9IG51bGwpIHsKKwkJCQkvLyBUT0RPIGNhc3RpbmcgdG8gSUZpbGUgLSBqdXN0IHRyeWluZyB0byBnZXQgcmlkIG9mIGFsbCBjb21waWxlciBlcnJvcnMgZm9yIG5vdworCQkJCXN5bmNoQ2xhc3Nlc0pvYiA9IG5ldyBTeW5jaHJvbml6ZUNsYXNzZXNKb2IoKElGaWxlKSBwZXJzaXN0ZW5jZVhtbC5nZXRSZXNvdXJjZSgpKTsKKwkJCX0KKwkJfQorCQkKKwkJZ2VuRW50aXRpZXNKb2Iuc2NoZWR1bGUoKTsKKwkJaWYgKHN5bmNoQ2xhc3Nlc0pvYiAhPSBudWxsKSB7CisJCQlzeW5jaENsYXNzZXNKb2Iuc2NoZWR1bGUoKTsKKwkJfQkJCisJCQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJLy8gKioqKioqKioqKiBnZW5lcmF0ZSBlbnRpdGllcyBqb2IgKioqKioqKioqKgorCisJc3RhdGljIGNsYXNzIEdlbmVyYXRlRW50aXRpZXNKb2IgZXh0ZW5kcyBXb3Jrc3BhY2VKb2IgeworCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgOworCQlPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXI7CisJCUdlbmVyYXRlRW50aXRpZXNKb2IoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIpIHsKKwkJCXN1cGVyKEpwdFVpTWVzc2FnZXMuRW50aXRpZXNHZW5lcmF0b3Jfam9iTmFtZSk7CisJCQl0aGlzLmN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOworCQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdCA7CisJCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBydWxlRmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOworCQkJdGhpcy5zZXRSdWxlKHJ1bGVGYWN0b3J5Lm1vZGlmeVJ1bGUoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCXRyeXsKKwkJCQlQYWNrYWdlR2VuZXJhdG9yMi5nZW5lcmF0ZShqcGFQcm9qZWN0LmdldEphdmFQcm9qZWN0KCksdGhpcy5jdXN0b21pemVyLCBtb25pdG9yKTsKKwkJCX1jYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKXsKKwkJCQkvL3VzZXIgY2FuY2VsZWQgZ2VuZXJhdGlvbgorCQkJfQorCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCX0KKworCX0JCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFNob3dPdmVyd3JpdGVXYXJuaW5nKCl7CisgICAgCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZiA9IG5ldyBJbnN0YW5jZVNjb3BlKCkuZ2V0Tm9kZSggSnB0VWlQbHVnaW4uUExVR0lOX0lEKTsgCisgICAgCWJvb2xlYW4gcmV0ID0gISBwcmVmLmdldEJvb2xlYW4oIERPTlRfU0hPV19PVkVSV1JJVEVfV0FSTklOR19ESUFMT0csIGZhbHNlKSA7CisgICAgCXJldHVybiggcmV0ICk7CisgICAgfQorICAgIAorICAgIC8vICoqKioqKioqKiogb3ZlcndyaXRlIGNvbmZpcm1lciAqKioqKioqKioqCisKKwlzdGF0aWMgY2xhc3MgT3ZlcndyaXRlQ29uZmlybWVyIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PdmVyd3JpdGVDb25maXJtZXIgeworCQlwcml2YXRlIGJvb2xlYW4gb3ZlcndyaXRlQWxsID0gZmFsc2U7CisJCXByaXZhdGUgYm9vbGVhbiBza2lwQWxsID0gZmFsc2U7CisKKwkJT3ZlcndyaXRlQ29uZmlybWVyKCkgeworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gb3ZlcndyaXRlKGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHsKKwkJCWlmICh0aGlzLm92ZXJ3cml0ZUFsbCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJaWYgKHRoaXMuc2tpcEFsbCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXJldHVybiB0aGlzLnByb21wdFVzZXIoY2xhc3NOYW1lKTsKKwkJfQorCisJCXByaXZhdGUgYm9vbGVhbiBwcm9tcHRVc2VyKGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHsKKwkJCS8vIGdldCBvbiB0aGUgVUkgdGhyZWFkIHN5bmNocm9ub3VzbHksIG5lZWQgZmVlZGJhY2sgYmVmb3JlIGNvbnRpbnVpbmcKKwkJCWZpbmFsIGJvb2xlYW4gcmV0W109bmV3IGJvb2xlYW5bMV07CisJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQlmaW5hbCBPdmVyd3JpdGVDb25maXJtZXJEaWFsb2cgZGlhbG9nID0gbmV3IE92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBjbGFzc05hbWUpOworCQkJCQlkaWFsb2cub3BlbigpOworCQkJCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7CisJCQkJCQkvL3Rocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOworCQkJCQkJc2tpcEFsbCA9IHRydWU7CisJCQkJCQlyZXRbMF0gPSBmYWxzZTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCQlpZiAoZGlhbG9nLnllcygpKSB7CisJCQkJCQlyZXRbMF0gPSB0cnVlOworCQkJCQl9CisJCQkJCWlmIChkaWFsb2cueWVzVG9BbGwoKSkgeworCQkJCQkJb3ZlcndyaXRlQWxsID0gdHJ1ZTsKKwkJCQkJCXJldFswXSA9IHRydWU7CisJCQkJCX0KKwkJCQkJaWYgKGRpYWxvZy5ubygpKSB7CisJCQkJCQlyZXRbMF0gPSBmYWxzZTsKKwkJCQkJfQorCQkJCQlpZiAoZGlhbG9nLm5vVG9BbGwoKSkgeworCQkJCQkJc2tpcEFsbCA9IHRydWU7CisJCQkJCQlyZXRbMF0gPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCQkJcmV0dXJuIHJldFswXTsKKwkJfQorCisJfQorCisKKwkvLyAqKioqKioqKioqIG92ZXJ3cml0ZSBkaWFsb2cgKioqKioqKioqKgorCisJc3RhdGljIGNsYXNzIE92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZyBleHRlbmRzIERpYWxvZyB7CisJCXByaXZhdGUgZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKKwkJcHJpdmF0ZSBib29sZWFuIHllcyA9IGZhbHNlOworCQlwcml2YXRlIGJvb2xlYW4geWVzVG9BbGwgPSBmYWxzZTsKKwkJcHJpdmF0ZSBib29sZWFuIG5vID0gZmFsc2U7CisJCXByaXZhdGUgYm9vbGVhbiBub1RvQWxsID0gZmFsc2U7CisKKwkJT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIGNsYXNzTmFtZSkgeworCQkJc3VwZXIocGFyZW50KTsKKwkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7CisJCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7CisJCQlzaGVsbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RpdGxlKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7CisJCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOworCQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKKworCQkJTGFiZWwgdGV4dCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKKwkJCXRleHQuc2V0VGV4dChOTFMuYmluZChKcHRVaU1lc3NhZ2VzLk92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZ190ZXh0LCB0aGlzLmNsYXNzTmFtZSkpOworCQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKKwkJCQorCQkJY3JlYXRlRG9udFNob3dDb250cm9sKGNvbXBvc2l0ZSk7CisJCQkKKwkJCXJldHVybiBjb21wb3NpdGU7CisJCX0KKwkgICAgCisJICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURvbnRTaG93Q29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7CisJICAgIAlmaW5hbCBCdXR0b24gY2hlY2tib3ggPSBuZXcgQnV0dG9uKCBjb21wb3NpdGUsIFNXVC5DSEVDSyApOworCSAgICAJY2hlY2tib3guc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RvTm90U2hvd1dhcm5pbmcgKTsKKwkgICAgCWNoZWNrYm94LnNldFNlbGVjdGlvbihmYWxzZSk7CisJICAgIAlmaW5hbCBJRWNsaXBzZVByZWZlcmVuY2VzIHByZWYgPSBuZXcgSW5zdGFuY2VTY29wZSgpLmdldE5vZGUoIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCk7IAorCSAgICAJY2hlY2tib3guc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkgKTsKKwkgICAgCWNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lciAoKXsKKwkgICAgCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCWJvb2xlYW4gYiA9IGNoZWNrYm94LmdldFNlbGVjdGlvbigpOworCSAgICAgICAgICAgICAgICBwcmVmLnB1dEJvb2xlYW4oIERPTlRfU0hPV19PVkVSV1JJVEVfV0FSTklOR19ESUFMT0csIGIpOworCQkJCX0KKwkgICAgCX0pOworCSAgICAJcmV0dXJuIGNoZWNrYm94OworCSAgICB9CisJICAgIAorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7CisJCQl0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuWUVTX0lELCBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgZmFsc2UpOworCQkJdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQsIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9MQUJFTCwgZmFsc2UpOworCQkJdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk5PX0lELCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLCB0cnVlKTsKKwkJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5OT19UT19BTExfSUQsIElEaWFsb2dDb25zdGFudHMuTk9fVE9fQUxMX0xBQkVMLCBmYWxzZSk7CisJCQl0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7CisJCQlzd2l0Y2ggKGJ1dHRvbklkKSB7CisJCQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCA6CisJCQkJCXRoaXMueWVzUHJlc3NlZCgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCA6CisJCQkJCXRoaXMueWVzVG9BbGxQcmVzc2VkKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5OT19JRCA6CisJCQkJCXRoaXMubm9QcmVzc2VkKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5OT19UT19BTExfSUQgOgorCQkJCQl0aGlzLm5vVG9BbGxQcmVzc2VkKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQgOgorCQkJCQl0aGlzLmNhbmNlbFByZXNzZWQoKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdCA6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcHJpdmF0ZSB2b2lkIHllc1ByZXNzZWQoKSB7CisJCQl0aGlzLnllcyA9IHRydWU7CisJCQl0aGlzLnNldFJldHVybkNvZGUoT0spOworCQkJdGhpcy5jbG9zZSgpOworCQl9CisKKwkJcHJpdmF0ZSB2b2lkIHllc1RvQWxsUHJlc3NlZCgpIHsKKwkJCXRoaXMueWVzVG9BbGwgPSB0cnVlOworCQkJdGhpcy5zZXRSZXR1cm5Db2RlKE9LKTsKKwkJCXRoaXMuY2xvc2UoKTsKKwkJfQorCisJCXByaXZhdGUgdm9pZCBub1ByZXNzZWQoKSB7CisJCQl0aGlzLm5vID0gdHJ1ZTsKKwkJCXRoaXMuc2V0UmV0dXJuQ29kZShPSyk7CisJCQl0aGlzLmNsb3NlKCk7CisJCX0KKworCQlwcml2YXRlIHZvaWQgbm9Ub0FsbFByZXNzZWQoKSB7CisJCQl0aGlzLm5vVG9BbGwgPSB0cnVlOworCQkJdGhpcy5zZXRSZXR1cm5Db2RlKE9LKTsKKwkJCXRoaXMuY2xvc2UoKTsKKwkJfQorCisJCWJvb2xlYW4geWVzKCkgeworCQkJcmV0dXJuIHRoaXMueWVzOworCQl9CisKKwkJYm9vbGVhbiB5ZXNUb0FsbCgpIHsKKwkJCXJldHVybiB0aGlzLnllc1RvQWxsOworCQl9CisKKwkJYm9vbGVhbiBubygpIHsKKwkJCXJldHVybiB0aGlzLm5vOworCQl9CisKKwkJYm9vbGVhbiBub1RvQWxsKCkgeworCQkJcmV0dXJuIHRoaXMubm9Ub0FsbDsKKwkJfQorCX0KKworCisJcHJpdmF0ZSBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBidWlsZERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkgeworCQlyZXR1cm4gbmV3IExvY2FsRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIodGhpcy5qcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkuZ2V0RW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKSk7CisJfQorCisJLy8gKioqKioqKioqKiBuYW1lIGJ1aWxkZXIgYWRhcHRlciAqKioqKioqKioqCisKKwkvKioKKwkgKiBhZGFwdCB0aGUgSlBBIHBsYXRmb3JtLXN1cHBsaWVkIGJ1aWxkZXIgdG8gdGhlIGJ1aWxkZXIgaW50ZXJmYWNlCisJICogZXhwZWN0ZWQgYnkgdGhlIGVudGl0eSBnZW5lcmF0b3IKKwkgKi8KKwlzdGF0aWMgY2xhc3MgTG9jYWxEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBpbXBsZW1lbnRzIERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIHsKKwkJcHJpdmF0ZSBFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBidWlsZGVyOworCQlMb2NhbERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKEVudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGJ1aWxkZXIpIHsKKwkJCXN1cGVyKCk7CisJCQl0aGlzLmJ1aWxkZXIgPSBidWlsZGVyOworCQl9CisJCXB1YmxpYyBTdHJpbmcgYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKFN0cmluZyBlbnRpdHlOYW1lLCBUYWJsZSB0YWJsZSkgeworCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZFRhYmxlQW5ub3RhdGlvbk5hbWUoZW50aXR5TmFtZSwgdGFibGUpOworCQl9CisJCXB1YmxpYyBTdHJpbmcgYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgQ29sdW1uIGNvbHVtbikgeworCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZENvbHVtbkFubm90YXRpb25OYW1lKGF0dHJpYnV0ZU5hbWUsIGNvbHVtbik7CisJCX0KKwkJcHVibGljIFN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7CisJCQlyZXR1cm4gdGhpcy5idWlsZGVyLmJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKGF0dHJpYnV0ZU5hbWUsIGZvcmVpZ25LZXkpOworCQl9CisJCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoQ29sdW1uIGNvbHVtbikgeworCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShjb2x1bW4pOworCQl9CisJCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uTmFtZShUYWJsZSB0YWJsZSkgeworCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKHRhYmxlKTsKKwkJfQorCX0KKwkKKwlAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0U3RhcnRpbmdQYWdlKCkgeworCQlpZiAodGhpcy5wcm9qZWN0UGFnZSAhPSBudWxsKSB7CisJCQlpZiAodGhpcy50YWJsZXNTZWxlY3RvclBhZ2UgIT0gbnVsbCkKKwkJCQlyZXR1cm4gdGhpcy50YWJsZXNTZWxlY3RvclBhZ2U7CisJCQllbHNlCisJCQkJcmV0dXJuIHRoaXMucHJvamVjdFBhZ2U7CisJCX0KKwkJZWxzZQorCQkJcmV0dXJuIHN1cGVyLmdldFN0YXJ0aW5nUGFnZSgpOworICAgIH0KKwkKKwlwdWJsaWMgT1JNR2VuQ3VzdG9taXplciBnZXRDdXN0b21pemVyICgpeworCQlyZXR1cm4gY3VzdG9taXplcjsKKwl9IAorLy8JQ29sbGVjdGlvbjxUYWJsZT4gZ2V0UG9zc2libGVUYWJsZXMoKSB7CisvLwkJaWYgKCB0aGlzLnRhYmxlc1NlbGVjdG9yUGFnZSAhPSBudWxsKSB7CisvLwkJCXJldHVybiB0aGlzLnRhYmxlc1NlbGVjdG9yUGFnZS5nZXRUYWJsZXMoKTsKKy8vCQl9CisvLwkJcmV0dXJuICggdGhpcy5wcm9qZWN0RGVmYXVsdFNjaGVtYUV4aXN0cygpKSA/IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKCB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS50YWJsZXMoKSkgOiBDb2xsZWN0aW9ucy48VGFibGU+ZW1wdHlMaXN0KCk7CisvLwl9CisJCisJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIGdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpIHsKKwkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOworCX0KKwkKKwlwdWJsaWMgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCl7CisJCXJldHVybiB0aGlzLmpwYVByb2plY3Q7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEpwYVByb2plY3QoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7CisJCWlmICh0aGlzLmpwYVByb2plY3QgPT0gbnVsbCkgeworCQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKKwkJCUlXaXphcmRQYWdlIGN1cnJlbnRQYWdlID0gZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKTsKKwkJCWlmIChwcm9qZWN0UGFnZSAhPSBudWxsICYmIGN1cnJlbnRQYWdlLmVxdWFscyhwcm9qZWN0UGFnZSkpIHsKKwkJCQlhZGRNYWluUGFnZXMoKTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyBTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKKwkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RGJTY2hlbWEoKSA7CisJfQorCisJcHVibGljIGJvb2xlYW4gc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCgpIHsKKwkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJCisJCU9iamVjdCBzZWwgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7CisJCWlmKCBzZWwgaW5zdGFuY2VvZiBJUmVzb3VyY2UgKXsKKwkJCUlQcm9qZWN0IHByb2ogPSAoKElSZXNvdXJjZSkgc2VsKS5nZXRQcm9qZWN0KCk7CisJCQlKcGFQcm9qZWN0IGpwYVByb2ogPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QoIHByb2ogKTsKKwkJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2o7CisJCX1lbHNlIGlmKCBzZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdCApeworCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdClzZWw7CisJCQlJUHJvamVjdCBwcm9qID0gcm9vdC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKKwkJCUpwYVByb2plY3QganBhUHJvaiA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCggcHJvaiApOworCQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvajsKKwkJfWVsc2UgaWYoIHNlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQpeworCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCBmcmFnID0gKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQpc2VsOworCQkJSVByb2plY3QgcHJvaiA9IGZyYWcuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCk7CisJCQlKcGFQcm9qZWN0IGpwYVByb2ogPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QoIHByb2ogKTsKKwkJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2o7CisJCX0KKwkJCisJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOworCQl0aGlzLnNldFdpbmRvd1RpdGxlKCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZ2VuZXJhdGVFbnRpdGllcyk7CisJCQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vSm9pbkNvbHVtbnNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Kb2luQ29sdW1uc1BhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmVjY2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vSm9pbkNvbHVtbnNQYWdlLmphdmEKQEAgLTAsMCArMSw2MjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSVBhZ2VDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5QYWdlQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlRhYmxlTGF5b3V0Q29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOworCisKK3B1YmxpYyBjbGFzcyBKb2luQ29sdW1uc1BhZ2UgZXh0ZW5kcyBOZXdBc3NvY2lhdGlvbldpemFyZFBhZ2UgeworCisJcHJpdmF0ZSBMYWJlbCBqb2luQ29sdW1uc0Rlc2NMYWJlbDE7CisJLyp0aGUgdGFibGUgY29udGFpbmluZyB0aGUgYXNzb2NpYXRpb24gY29sdW1ucyBiZXR3ZWVuIHRhYmxlMSBhbmQgdGFibGUyCisJICogLCBvciB0YWJsZTEgYW5kIGpvaW4gdGFibGUgaWYgbWFueSB0byBtYW55Ki8KKwlwcml2YXRlIFRhYmxlVmlld2VyIGpvaW5Db2x1bW5zVGFibGUxOworCXByaXZhdGUgQXJyYXlMaXN0PFNpbXBsZUpvaW4+IHRhYmxlRGF0YU1vZGVsMSA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlSm9pbj4oKTsgIAorCXByaXZhdGUgQ29tcG9zaXRlIHRhYmxlc0dyb3VwMTsKKwkKKwlwcml2YXRlIExhYmVsIGpvaW5Db2x1bW5zRGVzY0xhYmVsMjsKKwkvKnRoZSB0YWJsZSBjb250YWluaW5nIHRoZSBhc3NvY2lhdGlvbiBjb2x1bW5zIGJldHdlZW4gam9pbiB0YWJsZSBhbmQgdGFibGUyCisJICogaWYgbWFueSB0byBtYW55Ki8KKwlwcml2YXRlIFRhYmxlVmlld2VyIGpvaW5Db2x1bW5zVGFibGUyOworCXByaXZhdGUgQXJyYXlMaXN0PFNpbXBsZUpvaW4+IHRhYmxlRGF0YU1vZGVsMiA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlSm9pbj4oKTsgIAorCXByaXZhdGUgQ29tcG9zaXRlIHRhYmxlc0dyb3VwMjsKKwkKKwlzdGF0aWMgZmluYWwgU3RyaW5nW10gSk9JTkNPTFVNTlNfVEFCTEVfQ09MVU1OX1BST1BFUlRJRVMgPSB7ICJyZWZlcnJlckNvbHVtbiIsICJyZWZlcmVuY2VkQ29sdW1uIiB9OworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKT0lOQ09MVU1OMV9DT0xVTU5fSU5ERVggPSAwOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKT0lOQ09MVU1OMl9DT0xVTU5fSU5ERVggPSAxOworCisJcHJvdGVjdGVkIEpvaW5Db2x1bW5zUGFnZShPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIgKSB7CisJCXN1cGVyKGN1c3RvbWl6ZXIsICJKb2luQ29sdW1uc1BhZ2UiKTsKKwkJc2V0VGl0bGUoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV90aXRsZSk7CisJCXNldERlc2NyaXB0aW9uKEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9kZXNjKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7CisJCQorCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLkdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9KT0lOX0NPTFVNTlMpOworCisJCXRhYmxlc0dyb3VwMSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7CisJCXRhYmxlc0dyb3VwMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKKwkJdGFibGVzR3JvdXAxLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOworCQljcmVhdGVKb2luQ29sdW1uc1RhYmxlQ29udHJvbDEodGFibGVzR3JvdXAxKTsKKworCQkvL2NyZWF0ZU10bUpvaW5Db2x1bW5zVGFibGUyKGNvbXBvc2l0ZSk7CisJCQorCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7CisJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKCBmYWxzZSk7CisJCQorCQkoKFdpemFyZERpYWxvZylnZXRDb250YWluZXIoKSkuYWRkUGFnZUNoYW5nZWRMaXN0ZW5lcihuZXcgSVBhZ2VDaGFuZ2VkTGlzdGVuZXIoKXsKKwkJCXB1YmxpYyB2b2lkIHBhZ2VDaGFuZ2VkKFBhZ2VDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQlpZiggZXZlbnQuZ2V0U2VsZWN0ZWRQYWdlKCkgPT0gSm9pbkNvbHVtbnNQYWdlLnRoaXMgKXsKKwkJCQkJKChDb21wb3NpdGUpSm9pbkNvbHVtbnNQYWdlLnRoaXMuZ2V0Q29udHJvbCgpKS5nZXRQYXJlbnQoKS5sYXlvdXQoKSA7CQkKKwkJCQkJCisJCQkJfQorCQkJfQkJCQorCQl9KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlTXRtSm9pbkNvbHVtbnNUYWJsZTIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworCQl0YWJsZXNHcm91cDIgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULlNIQURPV19FVENIRURfSU4pOworCQl0YWJsZXNHcm91cDIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7CisJCXRhYmxlc0dyb3VwMi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKKwkJY3JlYXRlSm9pbkNvbHVtbnNUYWJsZUNvbnRyb2wyKHRhYmxlc0dyb3VwMik7CisJfQorCisJLyoqCisJICogVXBkYXRlIHdpemFyZCBwYWdlIFVJIHdpdGggbmV3IHRhYmxlIG5hbWVzCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlV2l0aE5ld1RhYmxlcygpIHsKKwkJU3RyaW5nIGNhcmRpbmFsaXR5ID0gdGhpcy5nZXRDYXJkaW5hbGl0eSgpIDsKKwkJaWYoIEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWS5lcXVhbHMoIGNhcmRpbmFsaXR5ICkgKXsKKwkJCXVwZGF0ZVdpdGhNdG1UYWJsZXMoKTsKKwkJfWVsc2V7CisJCQl1cGRhdGVXaXRoT3RtVGFibGVzKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgV2l6YXJkIFVJIHdpdGggYSBzaW5nbGUgVGFibGVWaWV3ZXIgd2l0aCBjb2x1bW5zIGZyb20gdGhlIHR3byBhc3NvY2lhdGVkIGRhdGFiYXNlIHRhYmxlcworCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZVdpdGhPdG1UYWJsZXMoKSB7CisJCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IGpvaW5Db2x1bW5zVGFibGUxLmdldFRhYmxlKCkuZ2V0Q29sdW1ucygpOworCQlTdHJpbmcgdGFibGUxTmFtZSA9IHRoaXMuZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKSA7CisJCVN0cmluZyB0YWJsZTJOYW1lID0gdGhpcy5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkgOworCQkKKwkJaWYoIHRhYmxlMU5hbWUgPT1udWxsIHx8IHRhYmxlMk5hbWUgPT0gbnVsbCApCisJCQlyZXR1cm47CisJCQorCQljb2x1bW5zWzBdLnNldFRleHQoIHRhYmxlMU5hbWUgKTsKKwkJY29sdW1uc1sxXS5zZXRUZXh0KCB0YWJsZTJOYW1lICk7CisKKwkJLy9IaWRlIHRoZSBKb2luIGNvbHVtbiB0YWJsZSAyCisJCWlmKCB0YWJsZXNHcm91cDIgIT1udWxsICkKKwkJCXRhYmxlc0dyb3VwMi5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCisJCXRhYmxlRGF0YU1vZGVsMS5jbGVhcigpOworCQlqb2luQ29sdW1uc1RhYmxlMS5yZWZyZXNoKCk7CisJCQorCQlTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdChKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfbGFiZWwsIHRhYmxlMU5hbWUsIHRhYmxlMk5hbWUpOyAKKwkJam9pbkNvbHVtbnNEZXNjTGFiZWwxLnNldFRleHQobXNnKTsKKwkJam9pbkNvbHVtbnNEZXNjTGFiZWwxLnNldFRvb2xUaXBUZXh0KCBtc2cgKTsKKwkJdGFibGVzR3JvdXAxLmxheW91dCgpOworCQkKKwkJU3RyaW5nW10gcmVmZXJyZXJDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUxTmFtZSk7CisJCVN0cmluZ1tdIHJlZmVyZW5jZWRDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUyTmFtZSk7CisJCQorCQl1cGRhdGVDZWxsRWRpdG9ycyhqb2luQ29sdW1uc1RhYmxlMSwgcmVmZXJyZXJDb2x1bW5WYWx1ZXMsIHJlZmVyZW5jZWRDb2x1bW5WYWx1ZXMpOwkJCisKKwkJCisJCSgoQ29tcG9zaXRlKXRoaXMuZ2V0Q29udHJvbCgpKS5sYXlvdXQoKSA7CisJfQorCisJLyoqCisJICogVXBkYXRlIFdpemFyZCBVSSB3aXRoIGEgdHdvIFRhYmxlVmlld2VycyB3aXRoIHRoZSBmaXJzdCB3aXRoIGNvbHVtbnMgZnJvbSB0YWJsZTEgdG8gdGhlIE1UTSBqb2luIHRhYmxlCisJICogYW5kIHRoZSBzZWNvbmQgb25lIHdpdGggY29sdW1ucyBmcm9tIHRoZSBNVE0gam9pbiB0YWJsZSB0byB0YWJsZTIKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGVXaXRoTXRtVGFibGVzKCkgeworCQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSBqb2luQ29sdW1uc1RhYmxlMS5nZXRUYWJsZSgpLmdldENvbHVtbnMoKTsKKwkJU3RyaW5nIHRhYmxlMU5hbWUgPSB0aGlzLmdldFJlZmVycmVyVGFibGVOYW1lKCkgOworCQlTdHJpbmcgdGFibGUyTmFtZSA9IHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpIDsKKwkJU3RyaW5nIGpvaW5UYWJsZU5hbWUgPSB0aGlzLmdldEpvaW5UYWJsZU5hbWUoKSA7CisJCWlmKCB0YWJsZTFOYW1lPT1udWxsIHx8IHRhYmxlMk5hbWU9PW51bGwgfHwgam9pblRhYmxlTmFtZT09bnVsbCApeworCQkJcmV0dXJuOworCQl9CisJCWlmKCB0YWJsZXNHcm91cDIgPT0gbnVsbCApeworCQkJY3JlYXRlTXRtSm9pbkNvbHVtbnNUYWJsZTIoIHRhYmxlc0dyb3VwMS5nZXRQYXJlbnQoKSk7CisJCX0gCisKKwkJY29sdW1uc1swXS5zZXRUZXh0KCB0YWJsZTFOYW1lPT1udWxsPyIiOnRhYmxlMU5hbWUgKTsKKwkJY29sdW1uc1sxXS5zZXRUZXh0KCB0YWJsZTJOYW1lPT1udWxsPyIiOmpvaW5UYWJsZU5hbWUgKTsKKwkJCisJCS8vVXBkYXRlIGpvaW4gY29sdW1uIFRhYmxlVmlld2VyIDEKKwkJdGFibGVEYXRhTW9kZWwxLmNsZWFyKCk7CisJCWpvaW5Db2x1bW5zVGFibGUxLnJlZnJlc2goKTsKKwkJCisJCVN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9sYWJlbCwgdGFibGUxTmFtZSwgam9pblRhYmxlTmFtZSk7IAorCQlqb2luQ29sdW1uc0Rlc2NMYWJlbDEuc2V0VGV4dChtc2cpOworCQlqb2luQ29sdW1uc0Rlc2NMYWJlbDEuc2V0VG9vbFRpcFRleHQoIG1zZyApOworCQlTdHJpbmdbXSByZWZlcnJlckNvbHVtblZhbHVlcyA9IGdldFRhYmxlQ29sdW1ucyh0YWJsZTFOYW1lKTsKKwkJU3RyaW5nW10gcmVmZXJlbmNlZENvbHVtblZhbHVlcyA9IGdldFRhYmxlQ29sdW1ucyhqb2luVGFibGVOYW1lKTsKKwkJCisJCXVwZGF0ZUNlbGxFZGl0b3JzKGpvaW5Db2x1bW5zVGFibGUxLCByZWZlcnJlckNvbHVtblZhbHVlcywgcmVmZXJlbmNlZENvbHVtblZhbHVlcyApOworCisJCS8vVXBkYXRlIGpvaW4gY29sdW1uIFRhYmxlVmlld2VyIDIKKwkJY29sdW1ucyA9IGpvaW5Db2x1bW5zVGFibGUyLmdldFRhYmxlKCkuZ2V0Q29sdW1ucygpOworCQljb2x1bW5zWzBdLnNldFRleHQoIGpvaW5UYWJsZU5hbWU9PW51bGw/IiI6am9pblRhYmxlTmFtZSApOworCQljb2x1bW5zWzFdLnNldFRleHQoIHRhYmxlMk5hbWU9PW51bGw/IiI6dGFibGUyTmFtZSApOworCQl0YWJsZXNHcm91cDEubGF5b3V0KCk7CisKKwkJdGFibGVEYXRhTW9kZWwyLmNsZWFyKCk7CisJCWpvaW5Db2x1bW5zVGFibGUyLnJlZnJlc2goKTsKKwkJbXNnID0gU3RyaW5nLmZvcm1hdChKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfbGFiZWwsIGpvaW5UYWJsZU5hbWUsIHRhYmxlMk5hbWUpOyAKKwkJam9pbkNvbHVtbnNEZXNjTGFiZWwyLnNldFRleHQobXNnKTsKKwkJam9pbkNvbHVtbnNEZXNjTGFiZWwyLnNldFRvb2xUaXBUZXh0KCBtc2cgKTsKKwkJcmVmZXJyZXJDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnMoam9pblRhYmxlTmFtZSk7CisJCXJlZmVyZW5jZWRDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUyTmFtZSk7CisJCXVwZGF0ZUNlbGxFZGl0b3JzKGpvaW5Db2x1bW5zVGFibGUyLCByZWZlcnJlckNvbHVtblZhbHVlcywgcmVmZXJlbmNlZENvbHVtblZhbHVlcyApOworCQkKKwkJdGFibGVzR3JvdXAyLmxheW91dCgpOworCisJCS8vU2hvdyB0aGUgSm9pbiBjb2x1bW4gVGFibGVWaWV3ZXIgMgorCQl0YWJsZXNHcm91cDIuc2V0VmlzaWJsZSh0cnVlKTsKKwkJCisJCQorCQkoKENvbXBvc2l0ZSl0aGlzLmdldENvbnRyb2woKSkubGF5b3V0KG5ldyBDb250cm9sW117dGhpcy50YWJsZXNHcm91cDEsIHRoaXMudGFibGVzR3JvdXAyfSk7CQkKKwl9CisJCisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUFkZFJlbW92ZUJ1dHRvbkNvbXBvc2l0ZShDb21wb3NpdGUgdGFibGVzR3JvdXAsIGZpbmFsIFRhYmxlVmlld2VyIGpvaW5Db2x1bW5zVGFibGUsICBmaW5hbCBBcnJheUxpc3Q8U2ltcGxlSm9pbj4gdGFibGVEYXRhTW9kZWwpIHsKKwkJLy9BZGQgYW5kIFJlbW92ZSBKb2luQ29sdW1ucyBidXR0b25zCisJCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYmxlc0dyb3VwLCBTV1QuTlVMTCk7CisJCUdyaWRMYXlvdXQgYnV0dG9uTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOworCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkxheW91dCk7CisJCUdyaWREYXRhIGRhdGEgPSAgbmV3IEdyaWREYXRhKCk7CisJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7CisJCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkKKwkJQnV0dG9uIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7CisJCWFkZEJ1dHRvbi5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLmFkZCApOworCQlHcmlkRGF0YSBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKwkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQorCQkKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQorCQkJCVNpbXBsZUpvaW4gam9pbiA9IGdldERlZmF1bHROZXdKb2luKGpvaW5Db2x1bW5zVGFibGUpOworCQkJCXRhYmxlRGF0YU1vZGVsLmFkZChqb2luKTsKKwkJCQlqb2luQ29sdW1uc1RhYmxlLnJlZnJlc2goKTsKKwkJCQkKKwkJCQkvL1VwZGF0ZSBXaXphcmQgbW9kZWwKKwkJCQlUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBqb2lucyA9IG51bGw7CisJCQkJaWYoIGpvaW5Db2x1bW5zVGFibGUgPT0gam9pbkNvbHVtbnNUYWJsZTEgKXsKKwkJCQkJam9pbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZ2V0V2l6YXJkRGF0YU1vZGVsKCkuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzEgKTsKKwkJCQl9ZWxzZXsKKwkJCQkJam9pbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZ2V0V2l6YXJkRGF0YU1vZGVsKCkuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzIgKTsKKwkJCQl9CisJCQkJam9pbnMucHV0KCBqb2luLmZvcmVpZ25LZXksIGpvaW4ucHJpbWFyeUtleSk7CisJCQkJCisJCQkJdXBkYXRlUGFnZUNvbXBsZXRlKCk7CisJCQl9CisJCX0pOworCQkKKwkJQnV0dG9uIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7CisJCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLnJlbW92ZSApOworCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKwkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQorCQkKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pam9pbkNvbHVtbnNUYWJsZS5nZXRTZWxlY3Rpb24oKTsKKwkJCQlpZiggc2VsZWN0aW9uLmlzRW1wdHkoKSkKKwkJCQkJcmV0dXJuOworCQkJCVNpbXBsZUpvaW4gam9pbiA9IChTaW1wbGVKb2luKXNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKKworCQkJCS8vVXBkYXRlIFRhYmxlVmlld2VyIG1vZGVsCisJCQkJdGFibGVEYXRhTW9kZWwucmVtb3ZlKCBqb2luICk7CisJCQkJLy9VcGRhdGUgV2l6YXJkIG1vZGVsCisJCQkJCisJCQkJVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gam9pbnMgPSBudWxsOworCQkJCWlmKCBqb2luQ29sdW1uc1RhYmxlID09IGpvaW5Db2x1bW5zVGFibGUxICl7CisJCQkJCWpvaW5zID0gKFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KWdldFdpemFyZERhdGFNb2RlbCgpLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMxICk7CisJCQkJfWVsc2V7CisJCQkJCWpvaW5zID0gKFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KWdldFdpemFyZERhdGFNb2RlbCgpLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMyICk7CisJCQkJfQorCQkJCWpvaW5zLnJlbW92ZShqb2luLmZvcmVpZ25LZXkpOworCisJCQkJam9pbkNvbHVtbnNUYWJsZS5yZWZyZXNoKCk7CisJCQl9CisJCX0pOworCQkKKwkJYWRkQnV0dG9uLnNldEZvY3VzKCk7CisJCQorCX0KKworCXByb3RlY3RlZCBTaW1wbGVKb2luIGdldERlZmF1bHROZXdKb2luKFRhYmxlVmlld2VyIGpvaW5Db2x1bW5zVGFibGUpIHsKKwkJU3RyaW5nIHRhYmxlMU5hbWUgPSAiIjsKKwkJU3RyaW5nIHRhYmxlMk5hbWUgPSAiIjsKKworCQlUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBleGlzdGluZ0pvaW5zID0gbnVsbDsKKwkJaWYoIGpvaW5Db2x1bW5zVGFibGUgPT0gdGhpcy5qb2luQ29sdW1uc1RhYmxlMSApeworCQkJZXhpc3RpbmdKb2lucyA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPilnZXRXaXphcmREYXRhTW9kZWwoKS5nZXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fSk9JTl9DT0xVTU5TMSApOworCQkJaWYoIHRoaXMuZ2V0Sm9pblRhYmxlTmFtZSgpID09IG51bGwpIHsKKwkJCQl0YWJsZTFOYW1lID0gdGhpcy5nZXRSZWZlcnJlclRhYmxlTmFtZSgpOworCQkJCXRhYmxlMk5hbWUgPSB0aGlzLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSA7CisJCQl9ZWxzZXsKKwkJCQl0YWJsZTFOYW1lID0gdGhpcy5nZXRSZWZlcnJlclRhYmxlTmFtZSgpOworCQkJCXRhYmxlMk5hbWUgPSB0aGlzLmdldEpvaW5UYWJsZU5hbWUoKSAgOworCQkJfQorCQl9ZWxzZXsKKwkJCWV4aXN0aW5nSm9pbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZ2V0V2l6YXJkRGF0YU1vZGVsKCkuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzIgKTsKKwkJCXRhYmxlMU5hbWUgPSB0aGlzLmdldEpvaW5UYWJsZU5hbWUoKTsKKwkJCXRhYmxlMk5hbWUgPSB0aGlzLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSA7CisJCX0KKwkJLy9maW5kIG5leHQgYXZhaWxhYmxlIGNvbHVtbgorCQlTdHJpbmdbXSB0YWJsZTFDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUxTmFtZSk7CisJCVN0cmluZyBuZXh0Q29sMSA9ICIiOworCQlmb3IoIFN0cmluZyBzOiB0YWJsZTFDb2x1bW5WYWx1ZXMgKXsKKwkJCWlmKCAhZXhpc3RpbmdKb2lucy5rZXlTZXQoKS5jb250YWlucyhzKSl7CisJCQkJbmV4dENvbDEgPSBzOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCQorCQlTdHJpbmdbXSB0YWJsZTJDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUyTmFtZSk7CisJCVN0cmluZyBuZXh0Q29sMiA9ICIiOworCQlmb3IoIFN0cmluZyBzOiB0YWJsZTJDb2x1bW5WYWx1ZXMgKXsKKwkJCWlmKCAhZXhpc3RpbmdKb2lucy52YWx1ZXMoKS5jb250YWlucyhzKSl7CisJCQkJbmV4dENvbDIgPSBzOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBuZXcgU2ltcGxlSm9pbiggbmV4dENvbDEsIG5leHRDb2wyKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKKwkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZVBhZ2VDb21wbGV0ZSgpIHsKKwkJYm9vbGVhbiByZXQgPSB0YWJsZURhdGFNb2RlbDEuc2l6ZSgpPiAwIDsKKwkJc2V0UGFnZUNvbXBsZXRlKCByZXQgKTsKKwl9CQorCQorCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7CisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KHRleHQpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47CisJCWxhYmVsLnNldExheW91dERhdGEoZ2QpOworCQlyZXR1cm4gbGFiZWw7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvaW5Db2x1bW5zVGFibGVDb250cm9sMShDb21wb3NpdGUgdGFibGVzR3JvdXApIHsKKwkJam9pbkNvbHVtbnNEZXNjTGFiZWwxID0gY3JlYXRlTGFiZWwodGFibGVzR3JvdXAsIDIsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9sYWJlbCApOworCQlqb2luQ29sdW1uc1RhYmxlMSA9IGNyZWF0ZUpvaW5Db2x1bW5zVGFibGVDb250cm9sKHRhYmxlc0dyb3VwLCB0aGlzLnRhYmxlRGF0YU1vZGVsMSk7CisJCWNyZWF0ZUFkZFJlbW92ZUJ1dHRvbkNvbXBvc2l0ZSh0YWJsZXNHcm91cCwgam9pbkNvbHVtbnNUYWJsZTEsIHRhYmxlRGF0YU1vZGVsMSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVKb2luQ29sdW1uc1RhYmxlQ29udHJvbDIoQ29tcG9zaXRlIHRhYmxlc0dyb3VwKSB7CisJCWpvaW5Db2x1bW5zRGVzY0xhYmVsMiA9IGNyZWF0ZUxhYmVsKHRhYmxlc0dyb3VwLCAyLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfbGFiZWwgKTsKKwkJam9pbkNvbHVtbnNUYWJsZTIgPSBjcmVhdGVKb2luQ29sdW1uc1RhYmxlQ29udHJvbCh0YWJsZXNHcm91cCwgdGhpcy50YWJsZURhdGFNb2RlbDIpOworCQljcmVhdGVBZGRSZW1vdmVCdXR0b25Db21wb3NpdGUodGFibGVzR3JvdXAsIGpvaW5Db2x1bW5zVGFibGUyLCB0YWJsZURhdGFNb2RlbDIpOworCX0KKwkKKwlwcml2YXRlIFRhYmxlVmlld2VyIGNyZWF0ZUpvaW5Db2x1bW5zVGFibGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIEFycmF5TGlzdDxTaW1wbGVKb2luPiB0YWJsZURhdGFNb2RlbCApewkKKwkKKwkJVGFibGVMYXlvdXRDb21wb3NpdGUgbGF5b3V0PSBuZXcgVGFibGVMYXlvdXRDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCWFkZENvbHVtbkxheW91dERhdGEobGF5b3V0KTsKKwkJCisJCWZpbmFsIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlIHRhYmxlID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlKGxheW91dCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIgKTsKKwkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKKwkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOworCQkKKwkJVGFibGVDb2x1bW4gcmVmZXJyZXJDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCBKT0lOQ09MVU1OMV9DT0xVTU5fSU5ERVgpOworCQlyZWZlcnJlckNvbHVtbi5zZXRUZXh0KCIldGFibGUxIik7CisJCXJlZmVycmVyQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKKworCQlUYWJsZUNvbHVtbiByZWZlcmVuY2VkQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgSk9JTkNPTFVNTjJfQ09MVU1OX0lOREVYKTsKKwkJcmVmZXJlbmNlZENvbHVtbi5zZXRUZXh0KCIldGFibGUyIik7CisJCXJlZmVyZW5jZWRDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOworCQkKKwkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQlnZC5oZWlnaHRIaW50PSBTV1RVdGlsLmdldFRhYmxlSGVpZ2h0SGludCh0YWJsZSwgMyk7CisJCWdkLndpZHRoSGludCA9IDMwMDsKKwkJbGF5b3V0LnNldExheW91dERhdGEoZ2QpOworCisJCVRhYmxlVmlld2VyIG5ld0pvaW5Db2x1bW5zVGFibGUgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOworCQluZXdKb2luQ29sdW1uc1RhYmxlLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7CisJCW5ld0pvaW5Db2x1bW5zVGFibGUuc2V0TGFiZWxQcm92aWRlcih0aGlzLmJ1aWxkVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKSk7CisJCW5ld0pvaW5Db2x1bW5zVGFibGUuc2V0Q29udGVudFByb3ZpZGVyKHRoaXMuYnVpbGRUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyKCkpOworCQluZXdKb2luQ29sdW1uc1RhYmxlLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgeworCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7CisJCQkJcmV0dXJuICgoU2ltcGxlSm9pbikgZTEpLmZvcmVpZ25LZXkuY29tcGFyZVRvKCgoU2ltcGxlSm9pbikgZTIpLmZvcmVpZ25LZXkpOworCQkJfQorCQl9KTsKKwkJCisJCW5ld0pvaW5Db2x1bW5zVGFibGUuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJLy9oYW5kbGVUYWJsZXNMaXN0U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7CisJCQl9CisJCX0pOworCQlwb3B1bGF0ZVRhYmxlRGF0YU1vZGVsKCk7CisJCW5ld0pvaW5Db2x1bW5zVGFibGUuc2V0SW5wdXQoIHRhYmxlRGF0YU1vZGVsICk7CisJCXJldHVybiBuZXdKb2luQ29sdW1uc1RhYmxlOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyB2b2lkIHBvcHVsYXRlVGFibGVEYXRhTW9kZWwoKXsKKwkJSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YU1vZGVsID0gKEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IClnZXRXaXphcmREYXRhTW9kZWwoKTsKKwkJVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gam9pbkNvbHVtbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZGF0YU1vZGVsLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMxKTsKKwkJaWYoIGpvaW5Db2x1bW5zIT0gbnVsbCApeworCQkJZm9yKCBTdHJpbmcgcmVmZXJyZXJDb2x1bW4gOiBqb2luQ29sdW1ucy5rZXlTZXQoKSApeworCQkJCXRhYmxlRGF0YU1vZGVsMS5hZGQobmV3IFNpbXBsZUpvaW4ocmVmZXJyZXJDb2x1bW4sIGpvaW5Db2x1bW5zLmdldChyZWZlcnJlckNvbHVtbikgKSk7CisJCQl9CisJCX0KKwkJCisJCVRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+IGpvaW5Db2x1bW5zMiA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPilkYXRhTW9kZWwuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzIpOworCQlpZiggam9pbkNvbHVtbnMyIT0gbnVsbCApeworCQkJZm9yKCBTdHJpbmcgcmVmZXJyZXJDb2x1bW4gOiBqb2luQ29sdW1uczIua2V5U2V0KCkgKXsKKwkJCQl0YWJsZURhdGFNb2RlbDIuYWRkKG5ldyBTaW1wbGVKb2luKHJlZmVycmVyQ29sdW1uLCBqb2luQ29sdW1uczIuZ2V0KHJlZmVycmVyQ29sdW1uKSApKTsKKwkJCX0KKwkJfQorCQkKKwl9CisJCisJcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGJ1aWxkVGFibGVUYWJsZUNvbnRlbnRQcm92aWRlcigpIHsKKwkJcmV0dXJuIG5ldyBKb2luQ29sdW1uc0NvbnRlbnRQcm92aWRlcigpOworCX0KKworCQorCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgSm9pbkNvbHVtbnNUYWJsZUxhYmVsUHJvdmlkZXIoKTsKKwl9CisJCisJCisJcHJpdmF0ZSB2b2lkIGFkZENvbHVtbkxheW91dERhdGEoVGFibGVMYXlvdXRDb21wb3NpdGUgbGF5b3V0KSB7CisJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCB0cnVlKSk7CisJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCB0cnVlKSk7CisJfQorCQorCQorCXByaXZhdGUgdm9pZCB1cGRhdGVDZWxsRWRpdG9ycyhUYWJsZVZpZXdlciBqb2luQ29sdW1uc1RhYmxlLCBTdHJpbmdbXSByZWZlcnJlckNvbHVtblZhbHVlcywgU3RyaW5nW10gcmVmZXJlbmNlZENvbHVtblZhbHVlcyApeworCQlqb2luQ29sdW1uc1RhYmxlLnNldENvbHVtblByb3BlcnRpZXMoSk9JTkNPTFVNTlNfVEFCTEVfQ09MVU1OX1BST1BFUlRJRVMpOworCQlDb21ib0JveENlbGxFZGl0b3JbXSBlZGl0b3JzID0gbmV3IENvbWJvQm94Q2VsbEVkaXRvcltKT0lOQ09MVU1OU19UQUJMRV9DT0xVTU5fUFJPUEVSVElFUy5sZW5ndGhdOworCisJCWVkaXRvcnNbSk9JTkNPTFVNTjFfQ09MVU1OX0lOREVYXT0gbmV3IENvbWJvQm94Q2VsbEVkaXRvcihqb2luQ29sdW1uc1RhYmxlLmdldFRhYmxlKCksIHJlZmVycmVyQ29sdW1uVmFsdWVzLCBTV1QuU0lOR0xFKTsKKwkJZWRpdG9yc1tKT0lOQ09MVU1OMl9DT0xVTU5fSU5ERVhdPSBuZXcgQ29tYm9Cb3hDZWxsRWRpdG9yKGpvaW5Db2x1bW5zVGFibGUuZ2V0VGFibGUoKSwgcmVmZXJlbmNlZENvbHVtblZhbHVlcywgU1dULlNJTkdMRSk7CisJCQorCQlqb2luQ29sdW1uc1RhYmxlLnNldENlbGxFZGl0b3JzKGVkaXRvcnMpOworCQlqb2luQ29sdW1uc1RhYmxlLnNldENlbGxNb2RpZmllcih0aGlzLmJ1aWxkVGFibGVUYWJsZUNlbGxNb2RpZmllcihqb2luQ29sdW1uc1RhYmxlLCByZWZlcnJlckNvbHVtblZhbHVlcywgcmVmZXJlbmNlZENvbHVtblZhbHVlcyApKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nW10gZ2V0VGFibGVDb2x1bW5zKFN0cmluZyB0YWJsZU5hbWUpeworCQlTY2hlbWEgc2NoZW1hID0gKFNjaGVtYSlnZXRXaXphcmREYXRhTW9kZWwoKS5nZXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fU0NIRU1BKTsKKwkJVGFibGUgdGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCh0YWJsZU5hbWUpOworCQlJdGVyYXRvcjxDb2x1bW4+IGNvbHVtbnMgPSB0YWJsZS5jb2x1bW5zKCkgOworCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQl3aGlsZSggY29sdW1ucy5oYXNOZXh0KCkgKXsKKwkJCWxpc3QuYWRkKGNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCX0KKwkJU3RyaW5nW10gcmV0ID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07CisJCWxpc3QudG9BcnJheShyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwkKKwlwcml2YXRlIElDZWxsTW9kaWZpZXIgYnVpbGRUYWJsZVRhYmxlQ2VsbE1vZGlmaWVyKFRhYmxlVmlld2VyIGpvaW5Db2x1bW5zVGFibGUsIFN0cmluZ1tdIHJlZmVycmVyQ29sdW1uVmFsdWVzLCBTdHJpbmdbXSByZWZlcmVuY2VkQ29sdW1uVmFsdWVzKSB7CisJCXJldHVybiBuZXcgSm9pbkNvbHVtbnNDZWxsTW9kaWZpZXIoam9pbkNvbHVtbnNUYWJsZSwgcmVmZXJyZXJDb2x1bW5WYWx1ZXMsIHJlZmVyZW5jZWRDb2x1bW5WYWx1ZXMpOworCX0JCisJCisJLyoqCisJICogQSBDb250ZW50UHJvdmlkZXIgdHJhbnNsYXRlcyB0aGUgU2ltcGxlSm9pbiBsaXN0IGludG8gYSBDb2xsZWN0aW9uIGZvciBkaXNwbGF5IAorCSAqCisJICovCisJcHJpdmF0ZSBjbGFzcyBKb2luQ29sdW1uc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKKworCQlKb2luQ29sdW1uc0NvbnRlbnRQcm92aWRlcigpIHsKKwkJCXN1cGVyKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHt9CQorCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KKwkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJCXJldHVybiAoKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudCkudG9BcnJheSgpOworCQl9CisJfQorCQorCS8qKgorCSAqIFNpbXBsZSB2YWx1ZSBvYmplY3QgdXNlZCBhcyBtb2RlbCBiYWNraW5nIHRoZSBKRmFjZSB0YWJsZSAKKwkgKgorCSAqLworCXByaXZhdGUgY2xhc3MgU2ltcGxlSm9pbiB7CisJCXB1YmxpYyBTaW1wbGVKb2luKFN0cmluZyBmb3JlaWduS2V5LCBTdHJpbmcgcHJpbWFyeUtleSkgeworCQkJdGhpcy5mb3JlaWduS2V5ID0gZm9yZWlnbktleTsKKwkJCXRoaXMucHJpbWFyeUtleSA9IHByaW1hcnlLZXk7IAorCQl9CisJCXB1YmxpYyBTdHJpbmcgZm9yZWlnbktleTsKKwkJcHVibGljIFN0cmluZyBwcmltYXJ5S2V5OworCQkKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpeworCQkJcmV0dXJuICJbIisgdGhpcy5mb3JlaWduS2V5ICsgIiA9ICIgKyB0aGlzLnByaW1hcnlLZXkgKyAiXSI7CisJCX0KKwl9CisJCisJLyoqCisJICoJQSBDZWxsTW9kaWZpZXIgdG8gdXBkYXRlIHRoZSBqb2luIGNvbHVtbnMgaW4gdGhlIHdpemFyZCBkYXRhIG1vZGVsCisJICovCisJcHJpdmF0ZSBjbGFzcyBKb2luQ29sdW1uc0NlbGxNb2RpZmllciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIgeworCQlwcml2YXRlIFRhYmxlVmlld2VyIGpvaW5Db2x1bW5zVGFibGU7CisJCXByaXZhdGUgU3RyaW5nW10gcmVmZXJyZXJDb2x1bW5WYWx1ZXM7CisJCXByaXZhdGUgU3RyaW5nW10gcmVmZXJlbmNlZENvbHVtblZhbHVlczsKKwkJSm9pbkNvbHVtbnNDZWxsTW9kaWZpZXIoVGFibGVWaWV3ZXIgam9pbkNvbHVtbnNUYWJsZSwgU3RyaW5nW10gcmVmZXJyZXJDb2x1bW5WYWx1ZXMsIFN0cmluZ1tdIHJlZmVyZW5jZWRDb2x1bW5WYWx1ZXMpIHsKKwkJCXN1cGVyKCk7CisJCQl0aGlzLmpvaW5Db2x1bW5zVGFibGUgPSBqb2luQ29sdW1uc1RhYmxlOworCQkJdGhpcy5yZWZlcnJlckNvbHVtblZhbHVlcyA9IHJlZmVycmVyQ29sdW1uVmFsdWVzOworCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uVmFsdWVzID0gcmVmZXJlbmNlZENvbHVtblZhbHVlczsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKKy8vCQkJU2ltcGxlSm9pbiBqb2luID0gKFNpbXBsZUpvaW4pIGVsZW1lbnQ7CisvLwkJCWlmIChwcm9wZXJ0eS5lcXVhbHMoSk9JTkNPTFVNTlNfVEFCTEVfQ09MVU1OX1BST1BFUlRJRVNbSk9JTkNPTFVNTjJfQ09MVU1OX0lOREVYXSkpIHsKKy8vCQkJCXJldHVybiBqb2luLnByaW1hcnlLZXk7CisvLwkJCX0KKy8vCQkJcmV0dXJuIGpvaW4uZm9yZWlnbktleTsKKwkJCS8vIHJldHVybnQgdGhlIGluZGV4IG9mIHRoZSB2YWx1ZSBpbiB0aGUgQ29tYm94Q2VsbEVkaXRvcgorCQkJQXJyYXlMaXN0PFNpbXBsZUpvaW4+IHRhYmxlRGF0YU1vZGVsID0gKEFycmF5TGlzdDxTaW1wbGVKb2luPikgam9pbkNvbHVtbnNUYWJsZS5nZXRJbnB1dCgpOworCQkJZm9yKGludCBpPTA7IGk8IHRhYmxlRGF0YU1vZGVsLnNpemUoKTsgaSArKyApeworCQkJCWlmKCB0YWJsZURhdGFNb2RlbC5nZXQoaSkgPT0gZWxlbWVudCApCisJCQkJCXJldHVybiBuZXcgSW50ZWdlcihpKTsKKwkJCX0KKwkJCXJldHVybiBuZXcgSW50ZWdlcigwKTsKKwkJCQorCQl9CisKKwkJLyoqIAorCQkgKiBlbGVtZW50IGlzIHRoZSBzZWxlY3RlZCBUYWJsZUl0ZW0KKwkJICogdmFsdWUgaXMgdGhlIHNlbGVjdGVkIGl0ZW0gaW5kZXggaW4gdGhlIGNvbWJvQ2VsbEVkaXRvciAKKwkJICovCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7CisJCQlpZiAoICEgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJSW50ZWdlciBpbmRleCA9IChJbnRlZ2VyKXZhbHVlOworCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWVsZW1lbnQ7CisJCQlib29sZWFuIHVuY2hhbmdlZCA9IGZhbHNlOworCQkJU2ltcGxlSm9pbiBqb2luID0gKFNpbXBsZUpvaW4pIGl0ZW0uZ2V0RGF0YSgpOworCQkJaWYgKHByb3BlcnR5LmVxdWFscyhKT0lOQ09MVU1OU19UQUJMRV9DT0xVTU5fUFJPUEVSVElFU1tKT0lOQ09MVU1OMV9DT0xVTU5fSU5ERVhdKSkgeworCQkJCXVuY2hhbmdlZCA9IGpvaW4uZm9yZWlnbktleS5lcXVhbHMoIHJlZmVycmVyQ29sdW1uVmFsdWVzWyBpbmRleC5pbnRWYWx1ZSgpIF0gKTsKKwkJCQlpZiAoISB1bmNoYW5nZWQpIHsKKwkJCQkJCisJCQkJCS8vdXBkYXRlIHRoZSB3aXphcmQgZGF0YW1vZGVsCisJCQkJCVRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+IGpvaW5zID0gbnVsbDsKKwkJCQkJaWYoIGpvaW5Db2x1bW5zVGFibGUgPT0gam9pbkNvbHVtbnNUYWJsZTEgKXsKKwkJCQkJCWpvaW5zID0gKFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KWdldFdpemFyZERhdGFNb2RlbCgpLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMxICk7CisJCQkJCX1lbHNleworCQkJCQkJam9pbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZ2V0V2l6YXJkRGF0YU1vZGVsKCkuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzIgKTsKKwkJCQkJfQorCQkJCQlqb2lucy5yZW1vdmUoam9pbi5mb3JlaWduS2V5KTsKKwkJCQkJam9pbnMucHV0KHJlZmVycmVyQ29sdW1uVmFsdWVzWyBpbmRleC5pbnRWYWx1ZSgpIF0sIGpvaW4ucHJpbWFyeUtleSk7CisKKwkJCQkJLy9VcGRhdGUgdGhlIFRhYmxlVmlld2VyIG1vZGVsCisJCQkJCWpvaW4uZm9yZWlnbktleSA9IHJlZmVycmVyQ29sdW1uVmFsdWVzWyBpbmRleC5pbnRWYWx1ZSgpXTsKKwkJCQkJam9pbkNvbHVtbnNUYWJsZS5yZWZyZXNoKCk7CisJCQkJfQorCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJaWYgKHByb3BlcnR5LmVxdWFscyhKT0lOQ09MVU1OU19UQUJMRV9DT0xVTU5fUFJPUEVSVElFU1tKT0lOQ09MVU1OMl9DT0xVTU5fSU5ERVhdKSkgeworCQkJCXVuY2hhbmdlZCA9IGpvaW4ucHJpbWFyeUtleS5lcXVhbHMoIHJlZmVyZW5jZWRDb2x1bW5WYWx1ZXNbIGluZGV4LmludFZhbHVlKCldICkgOworCQkJCWlmICghIHVuY2hhbmdlZCkgeworCQkJCQkvL1VwZGF0ZSB0aGUgVGFibGVWaWV3ZXIgbW9kZWwKKwkJCQkJam9pbi5wcmltYXJ5S2V5ID0gcmVmZXJlbmNlZENvbHVtblZhbHVlc1sgaW5kZXguaW50VmFsdWUoKV0gOworCQkJCQkKKwkJCQkJLy9VcGRhdGUgd2l6YXJkIGRhdGEgbW9kZWwKKwkJCQkJVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gam9pbnMgPSBudWxsOworCQkJCQlpZiggam9pbkNvbHVtbnNUYWJsZSA9PSBqb2luQ29sdW1uc1RhYmxlMSApeworCQkJCQkJam9pbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZ2V0V2l6YXJkRGF0YU1vZGVsKCkuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzEgKTsKKwkJCQkJfWVsc2V7CisJCQkJCQlqb2lucyA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPilnZXRXaXphcmREYXRhTW9kZWwoKS5nZXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fSk9JTl9DT0xVTU5TMiApOworCQkJCQl9CisJCQkJCWpvaW5zLnB1dChqb2luLmZvcmVpZ25LZXksIGpvaW4ucHJpbWFyeUtleSk7CisKKwkJCQkJam9pbkNvbHVtbnNUYWJsZS5yZWZyZXNoKCk7CisJCQkJfQorCQkJfQorCQkJCisJCQkKKwkJfQorCisJfQorCisJLyoqCisJICogQSB0YWJsZSBsYWJlbCBwcm92aWRlciB0byByZXR1cm4gdGhlIGpvaW4gY29sdW1uIG5hbWVzIGZvciBkaXNwbGF5CisJICoKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGNsYXNzIEpvaW5Db2x1bW5zVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgeworCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJCWlmKCAhKGVsZW1lbnQgaW5zdGFuY2VvZiBTaW1wbGVKb2luKSApCisJCQkJcmV0dXJuIG51bGw7CisJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7CisJICAgICAgICAgICAgY2FzZSAwOgorCSAgICAgICAgICAgIAlyZXR1cm4gKChTaW1wbGVKb2luKWVsZW1lbnQpLmZvcmVpZ25LZXk7CisJICAgICAgICAgICAgY2FzZSAxOgorCSAgICAgICAgICAgIAlyZXR1cm4gKChTaW1wbGVKb2luKWVsZW1lbnQpLnByaW1hcnlLZXk7CisJICAgICAgICAgICAgZGVmYXVsdDoKKwkgICAgICAgICAgICAJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7CisJICAgICAgICAgICAgCXJldHVybiBudWxsOworICAgICAgICAgICAgfQorCQl9CisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkgICAgcmV0dXJuIGdldENvbHVtblRleHQoZWxlbWVudCwgMCk7IC8vIG5lZWRlZCB0byBtYWtlIHRoZSBzb3J0ZXIgd29yaworCQl9CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzFjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9KcHRVaUVudGl0eUdlbk1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworLyoqCisgKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIFVJLgorICoKKyAqIEB2ZXJzaW9uIDIuMAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF91aV9lbnRpdHlfZ2VuIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuY2xhc3M7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfUmVzdG9yZV9EZWZhdWx0czsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2dlbmVyYXRlRW50aXRpZXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kb05vdFNob3dXYXJuaW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfc2VsZWN0SlBBUHJvamVjdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3NlbGVjdEpQQVByb2plY3RfbXNnOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX3NlbGVjdFRhYmxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX2Nob29zZUVudGl0eVRhYmxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX3N5bmNocm9uaXplQ2xhc3NlczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV90YWJsZXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfdGFibGVDb2x1bW47CisJLy9EYXRhYmFzZSBjb25uZWN0aW9uIGdyb3VwCisJcHVibGljIHN0YXRpYyBTdHJpbmcgY29ubmVjdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRDb25uZWN0aW9uTGluazsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25uZWN0TGluazsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzY2hlbWFJbmZvOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNjaGVtYTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25uZWN0aW5nVG9EYXRhYmFzZTsKKwkKKwkvL0RlZmF1bHQgdGFibGUgZ2VuIHByb3BlcnRpZXMKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2Rlc2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2RvbWFpbkphdmFDbGFzczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfdGFibGVNYXBwaW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVQYW5lbF9jbGFzc05hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2ZldGNoOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9jb2xsVHlwZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2Vfc2VxdWVuY2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3NlcXVlbmNlTm90ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfYWNjZXNzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9rZXlHZW47CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2dlbk9wdGlvbmFsQW5ub3RhdGlvbnM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2dlbk9wdGlvbmFsQW5ub3RhdGlvbnNfZGVzYzsKKwkKKwkvL0Fzc28gZmlndXJlCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbWFueVRvT25lRGVzYzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBvbmVUb09uZURlc2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgbWFueVRvTWFueURlc2M7CisJLy90YWJsZSBhc3NvY2lhdGlvbiB3aXphcmQgcGFnZQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX2Rlc2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY1BhZ2VfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY1BhZ2VfbmV3QXNzb2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY1BhZ2VfZGVsQXNzb2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9nZW5Bc3NvYzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2VudGl0eVJlZjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9wZXJ0eTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXNjYWRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3Jfc2V0UmVmOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3Jfam9pbmVkV2hlbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX3RhYmxlSm9pbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXJkaW5hbGl0eTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDYXNjYWRlRGxnVGl0bGU7CisJLy9uZXcgYXNzb2NpYXRpb24gd2l6YXJkCisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2Rlc2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2Fzc29jS2luZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2Vfc2ltcGxlQXNzb2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX20ybUFzc29jOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9hc3NvY1RhYmxlczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfdGFibGUxOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV90YWJsZTI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2ludGVybWVkaWF0ZVRhYmxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9kZXNjOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX2NhcmRpbmFsaXR5UGFnZV90aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX2NhcmRpbmFsaXR5UGFnZV9kZXNjOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hbnlUb09uZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBvbmVUb01hbnk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgb25lVG9PbmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgbWFueVRvTWFueTsKKwkvL3NlbGVjdCB0YWJsZSBkaWFsb2cKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RUYWJsZURsZ1RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFRhYmxlRGxnRGVzYzsKKwkvL2luZGl2aWR1YWwgdGFibGUgYW5kIGNvbHVtbiBnZW4gcHJvcGVydGllcworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVzQW5kQ29sdW1uc1BhZ2VfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZXNBbmRDb2x1bW5zUGFnZV9kZXNjOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVzQW5kQ29sdW1uc1BhZ2VfbGFiZWxUYWJsZUFuZENvbHVtbnM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9nZW5Qcm9wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfY29sTWFwcGluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX3Byb3BOYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfcHJvcFR5cGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9tYXBLaW5kOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfY29sVXBkYXRlYWJsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2NvbEluc2VydGFibGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9iZWFuUHJvcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2dldHRlclNjb3BlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfc2V0dGVyU2NvcGU7CisJc3RhdGljIHsKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKKwl9CisKKwlwcml2YXRlIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vTmV3QXNzb2NpYXRpb25XaXphcmQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL05ld0Fzc29jaWF0aW9uV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwYTg4ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL05ld0Fzc29jaWF0aW9uV2l6YXJkLmphdmEKQEAgLTAsMCArMSwxOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLkFzc29jaWF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuT1JNR2VuQ3VzdG9taXplcjsKKworCitwdWJsaWMgY2xhc3MgTmV3QXNzb2NpYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgewkKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFTU09DSUFUSU9OX1NDSEVNQSA9ICJBU1NPQ0lBVElPTl9TQ0hFTUEiOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFTU09DSUFUSU9OX1JFRkVSUkVSX1RBQkxFID0gIkFTU09DSUFUSU9OX1JFRkVSUkVSX1RBQkxFIjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBU1NPQ0lBVElPTl9SRUZFUkVOQ0VEX1RBQkxFID0gIkFTU09DSUFUSU9OX1JFRkVSRU5DRURfVEFCTEUiOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzEgPSAiQVNTT0NJQVRJT05fUkVGRVJSRVJfQ09MVU1OUzEiOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzIgPSAiQVNTT0NJQVRJT05fUkVGRVJSRVJfQ09MVU1OUzIiOyAvL3VzZWQgaW4gTVRNIGFzc29jaWF0aW9ucyBvbmx5CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQVNTT0NJQVRJT05fSk9JTl9UQUJMRSA9ICJBU1NPQ0lBVElPTl9KT0lOX1RBQkxFIjsgLy8gVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBU1NPQ0lBVElPTl9DQURJTkFMSVRZID0gIkFTU09DSUFUSU9OX0NBRElOQUxJVFkiOworCQorCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0OworCXByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gYXNzb2NpYXRpb25EYXRhTW9kZWwgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKworCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyID0gbnVsbDsJCisJCisJcHJpdmF0ZSBBc3NvY2lhdGlvblRhYmxlc1BhZ2UgYXNzb2NpYXRpb25UYWJsZXNQYWdlOworCXByaXZhdGUgSm9pbkNvbHVtbnNQYWdlIGpvaW5Db2x1bW5zUGFnZTsKKwlwcml2YXRlIENhcmRpbmFsaXR5UGFnZSBjYXJkaW5hbGl0eVBhZ2U7CisJCisJcHVibGljIE5ld0Fzc29jaWF0aW9uV2l6YXJkKCBKcGFQcm9qZWN0IGpwYVByb2plY3QsIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciApIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKKwkJdGhpcy5jdXN0b21pemVyID0gY3VzdG9taXplcjsKKwkJdGhpcy5zZXRXaW5kb3dUaXRsZSggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RpdGxlKTsKKwkJCisJCXRoaXMuYXNzb2NpYXRpb25EYXRhTW9kZWwucHV0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9TQ0hFTUEsIHRoaXMuY3VzdG9taXplci5nZXRTY2hlbWEoKSk7CisJCXRoaXMuYXNzb2NpYXRpb25EYXRhTW9kZWwucHV0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMxLCBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKSk7CisJCXRoaXMuYXNzb2NpYXRpb25EYXRhTW9kZWwucHV0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMyLCBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKSk7CisJfQorCisJcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7CisJCXN1cGVyLmFkZFBhZ2VzKCk7CisJCXRoaXMuYXNzb2NpYXRpb25UYWJsZXNQYWdlID0gbmV3IEFzc29jaWF0aW9uVGFibGVzUGFnZSggY3VzdG9taXplciApOworCQlhZGRQYWdlKHRoaXMuYXNzb2NpYXRpb25UYWJsZXNQYWdlKTsKKwkJCisJCXRoaXMuam9pbkNvbHVtbnNQYWdlID0gbmV3IEpvaW5Db2x1bW5zUGFnZShjdXN0b21pemVyKTsKKwkJYWRkUGFnZSh0aGlzLmpvaW5Db2x1bW5zUGFnZSk7CisJCQorCQl0aGlzLmNhcmRpbmFsaXR5UGFnZSA9IG5ldyBDYXJkaW5hbGl0eVBhZ2UoY3VzdG9taXplcik7CisJCWFkZFBhZ2UodGhpcy5jYXJkaW5hbGl0eVBhZ2UpOworCX0KKworCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlwdWJsaWMgT1JNR2VuQ3VzdG9taXplciBnZXRDdXN0b21pemVyICgpeworCQlyZXR1cm4gY3VzdG9taXplcjsKKwl9IAorCQorCXB1YmxpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKXsKKwkJcmV0dXJuIHRoaXMuanBhUHJvamVjdDsKKwl9CisKKy8vCXB1YmxpYyBTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKKy8vCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHREYlNjaGVtYSgpOworLy8JfQorLy8KKy8vCXByaXZhdGUgYm9vbGVhbiBwcm9qZWN0RGVmYXVsdFNjaGVtYUV4aXN0cygpIHsKKy8vCQlyZXR1cm4gKCB0aGlzLmdldERlZmF1bHRTY2hlbWEoKSAhPSBudWxsKTsKKy8vCX0KKworCXB1YmxpYyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBnZXREYXRhTW9kZWwoKXsKKwkJcmV0dXJuIHRoaXMuYXNzb2NpYXRpb25EYXRhTW9kZWw7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZVRhYmxlTmFtZXMoKXsKKwkJSVdpemFyZFBhZ2VbXSBwYWdlcyA9IHRoaXMuZ2V0UGFnZXMoKTsKKwkJZm9yKCBJV2l6YXJkUGFnZSBwYWdlIDogcGFnZXMpeworCQkJKChOZXdBc3NvY2lhdGlvbldpemFyZFBhZ2UpcGFnZSkudXBkYXRlV2l0aE5ld1RhYmxlcygpOworCQl9CisJfQorCQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBBc3NvY2lhdGlvbiBnZXROZXdBc3NvY2lhdGlvbigpeworCQlTdHJpbmcgcmVmZXJyZXJUYWJsZU5hbWUgPWdldFJlZmVycmVyVGFibGVOYW1lKCk7IAorCQlTdHJpbmcgcmVmZXJlbmNlZFRhYmxlTmFtZSA9IGdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKTsKKwkJTGlzdDxTdHJpbmc+IHJlZmVycmVyQ29sTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRDb2xOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQkKKwkJU3RyaW5nIGNhcmRpbmFsaXR5ID0gKFN0cmluZylhc3NvY2lhdGlvbkRhdGFNb2RlbC5nZXQoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0NBRElOQUxJVFkgKTsKKwkJaWYoIGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5NQU5ZX1RPX01BTlkpICl7CisJCQlyZXR1cm4gY3JlYXRlTWFueVRvTWFueUFzc29jaWF0aW9uKCk7CisJCX0KKwkJCisJCU9iamVjdCB2YWx1ZSA9IGFzc29jaWF0aW9uRGF0YU1vZGVsLmdldCggTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fSk9JTl9DT0xVTU5TMSk7CisJCWlmKHZhbHVlIT1udWxsKXsKKwkJCVRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+IGpvaW5Db2x1bW5zID0gKFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KXZhbHVlOwkJCisJCQlmb3IoIFN0cmluZyBwayA6IGpvaW5Db2x1bW5zLmtleVNldCgpKXsKKwkJCQlyZWZlcnJlckNvbE5hbWVzLmFkZChwayk7CisJCQkJcmVmZXJlbmNlZENvbE5hbWVzLmFkZCggam9pbkNvbHVtbnMuZ2V0KHBrKSk7CisJCQl9CisJCX0KKworCQkvKmlmIG9uZS10by1tYW55IHRoZW4gY29udmVydCBpdCB0byBtYW55LXRvLW9uZSB0byBiZSBjb25zaXN0ZW50IAorCQkgKiB3aXRoIHRoZSBhc3NvY2lhdGlvbnMgY29tcHV0ZWQgZnJvbSB0aGUgZGIgZm9yZWlnbiBrZXlzLgorCQkgKiBEb24ndCBzZWUgYXQgdGhpcyBwb2ludCBob3cgb25lLXRvLW1hbnkgd291bGQgCisJCSAqIGFmZmVjdCB0aGUgZ2VuZXJhdGlvbi4qLworCQlpZiggY2FyZGluYWxpdHkuZXF1YWxzKEFzc29jaWF0aW9uLk9ORV9UT19NQU5ZKSApeworCQkJY2FyZGluYWxpdHkgPSBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORTsKKwkJCQorCQkJU3RyaW5nIHRlbXAxID0gcmVmZXJyZXJUYWJsZU5hbWU7CisJCQlyZWZlcnJlclRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZU5hbWU7CisJCQlyZWZlcmVuY2VkVGFibGVOYW1lID0gdGVtcDE7CisJCQkKKwkJCUxpc3Q8U3RyaW5nPiB0ZW1wMiA9IHJlZmVycmVyQ29sTmFtZXM7CisJCQlyZWZlcnJlckNvbE5hbWVzID0gcmVmZXJlbmNlZENvbE5hbWVzOworCQkJcmVmZXJlbmNlZENvbE5hbWVzID0gdGVtcDI7CisJCX0KKwkJCisJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gbnVsbDsKKwkJYXNzb2NpYXRpb24gPSBuZXcgQXNzb2NpYXRpb24odGhpcy5jdXN0b21pemVyLCByZWZlcnJlclRhYmxlTmFtZSwgcmVmZXJyZXJDb2xOYW1lcwksIHJlZmVyZW5jZWRUYWJsZU5hbWUsIHJlZmVyZW5jZWRDb2xOYW1lcyk7CisJCWFzc29jaWF0aW9uLnNldENhcmRpbmFsaXR5KCBjYXJkaW5hbGl0eSApOworCQlhc3NvY2lhdGlvbi5zZXRDdXN0b20odHJ1ZSk7CisJCXJldHVybiBhc3NvY2lhdGlvbjsKKwl9CisJCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSBBc3NvY2lhdGlvbiBjcmVhdGVNYW55VG9NYW55QXNzb2NpYXRpb24oKSB7CisJCVN0cmluZyByZWZlcnJlclRhYmxlTmFtZSA9Z2V0UmVmZXJyZXJUYWJsZU5hbWUoKTsgCisJCVN0cmluZyBqb2luVGFibGUgPSBnZXRKb2luVGFibGVOYW1lKCk7CisJCVN0cmluZyByZWZlcmVuY2VkVGFibGVOYW1lID0gZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpOworCisJCUxpc3Q8U3RyaW5nPiByZWZlcnJlckNvbE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCUxpc3Q8U3RyaW5nPiByZWZlcnJlckpvaW5Db2xOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlPYmplY3QgdmFsdWUgPSBhc3NvY2lhdGlvbkRhdGFNb2RlbC5nZXQoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzEpOworCQlpZih2YWx1ZSE9bnVsbCl7CisJCQlUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBqb2luQ29sdW1ucyA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPil2YWx1ZTsJCQorCQkJZm9yKCBTdHJpbmcgcGsgOiBqb2luQ29sdW1ucy5rZXlTZXQoKSl7CisJCQkJcmVmZXJyZXJDb2xOYW1lcy5hZGQocGspOworCQkJCXJlZmVycmVySm9pbkNvbE5hbWVzLmFkZCggam9pbkNvbHVtbnMuZ2V0KHBrKSk7CisJCQl9CisJCX0KKwkJCisJCXZhbHVlID0gYXNzb2NpYXRpb25EYXRhTW9kZWwuZ2V0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMyKTsKKwkJTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRDb2xOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlMaXN0PFN0cmluZz4gcmVmZXJlbmNlZEpvaW5Db2xOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlpZih2YWx1ZSE9bnVsbCl7CisJCQlUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBqb2luQ29sdW1ucyA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPil2YWx1ZTsJCQorCQkJZm9yKCBTdHJpbmcgcGsgOiBqb2luQ29sdW1ucy5rZXlTZXQoKSl7CisJCQkJcmVmZXJlbmNlZEpvaW5Db2xOYW1lcy5hZGQocGspOworCQkJCXJlZmVyZW5jZWRDb2xOYW1lcy5hZGQoIGpvaW5Db2x1bW5zLmdldChwaykpOworCQkJfQorCQl9CisKKwkJCisJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gbnVsbDsKKwkJYXNzb2NpYXRpb24gPSBuZXcgQXNzb2NpYXRpb24odGhpcy5jdXN0b21pemVyLCByZWZlcnJlclRhYmxlTmFtZSwgcmVmZXJyZXJDb2xOYW1lcywgCisJCQkJcmVmZXJlbmNlZFRhYmxlTmFtZSwgcmVmZXJlbmNlZENvbE5hbWVzLCBqb2luVGFibGUsIHJlZmVycmVySm9pbkNvbE5hbWVzLCByZWZlcmVuY2VkSm9pbkNvbE5hbWVzKTsKKwkJcmV0dXJuIGFzc29jaWF0aW9uOworCX0KKworCVN0cmluZyBnZXRSZWZlcnJlclRhYmxlTmFtZSgpeworCQlyZXR1cm4gKFN0cmluZylhc3NvY2lhdGlvbkRhdGFNb2RlbC5nZXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fUkVGRVJSRVJfVEFCTEUpOworCX0KKworCVN0cmluZyBnZXRSZWZlcmVuY2VkVGFibGVOYW1lKCl7CisJCXJldHVybiAoU3RyaW5nKWFzc29jaWF0aW9uRGF0YU1vZGVsLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9SRUZFUkVOQ0VEX1RBQkxFKTsKKwl9CisJCisJU3RyaW5nIGdldEpvaW5UYWJsZU5hbWUoKXsKKwkJcmV0dXJuIChTdHJpbmcpYXNzb2NpYXRpb25EYXRhTW9kZWwuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fVEFCTEUgKTsKKwl9CisJCisJU3RyaW5nIGdldENhcmRpbmFsaXR5KCl7CisJCXJldHVybiAoU3RyaW5nKWFzc29jaWF0aW9uRGF0YU1vZGVsLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9DQURJTkFMSVRZICk7CisJfQorCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL05ld0Fzc29jaWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vTmV3QXNzb2NpYXRpb25XaXphcmRQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjMzI4YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL05ld0Fzc29jaWF0aW9uV2l6YXJkUGFnZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuT1JNR2VuQ3VzdG9taXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07CisKKworcHVibGljIGFic3RyYWN0IGNsYXNzIE5ld0Fzc29jaWF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgeworCisJcHJvdGVjdGVkIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplcjsKKwkKKwlwdWJsaWMgTmV3QXNzb2NpYXRpb25XaXphcmRQYWdlKE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJCXRoaXMuY3VzdG9taXplciA9IGN1c3RvbWl6ZXIgOworCX0KKwkKKwlwcm90ZWN0ZWQgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0V2l6YXJkRGF0YU1vZGVsKCl7CisJCXJldHVybiAoKE5ld0Fzc29jaWF0aW9uV2l6YXJkKXRoaXMuZ2V0V2l6YXJkKCkpLmdldERhdGFNb2RlbCgpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlZmVycmVyVGFibGVOYW1lKCl7CisJCXJldHVybiAoKE5ld0Fzc29jaWF0aW9uV2l6YXJkKWdldFdpemFyZCgpKS5nZXRSZWZlcnJlclRhYmxlTmFtZSgpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpeworCQlyZXR1cm4gKChOZXdBc3NvY2lhdGlvbldpemFyZClnZXRXaXphcmQoKSkuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0Sm9pblRhYmxlTmFtZSgpeworCQlyZXR1cm4gKChOZXdBc3NvY2lhdGlvbldpemFyZClnZXRXaXphcmQoKSkuZ2V0Sm9pblRhYmxlTmFtZSgpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2FyZGluYWxpdHkoKXsKKwkJcmV0dXJuICgoTmV3QXNzb2NpYXRpb25XaXphcmQpZ2V0V2l6YXJkKCkpLmdldENhcmRpbmFsaXR5KCkgOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGVXaXRoTmV3VGFibGVzKCkgeworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGhlbHBzIHN5c3RlbS4KKwkgKiBAcmV0dXJuIFRoZSBwbGF0Zm9ybSdzIGhlbHAgc3lzdGVtCisJICovCisJcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGdldEhlbHBTeXN0ZW0oKSB7CisJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Qcm9tcHRKUEFQcm9qZWN0V2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vUHJvbXB0SlBBUHJvamVjdFdpemFyZFBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDljNTNkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vUHJvbXB0SlBBUHJvamVjdFdpemFyZFBhZ2UuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKKworcHVibGljIGNsYXNzIFByb21wdEpQQVByb2plY3RXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU0VMRUNUX1BST0pFQ1RfUEFHRV9OQU1FID0gIlNlbGVjdEpQQVByb2plY3QiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBUYWJsZSBwcm9qVGFibGU7CisJcHJpdmF0ZSBUYWJsZVZpZXdlciBwcm9qVGFibGVWaWV3ZXI7CisJcHJpdmF0ZSBzdGF0aWMgaW50IFBST0pFQ1RfTkFNRV9DT0xVTU5fSU5ERVggPSAwOworCXByaXZhdGUgZmluYWwgU3RyaW5nIGhlbHBDb250ZXh0SWQ7CisJCisJcHJvdGVjdGVkIFByb21wdEpQQVByb2plY3RXaXphcmRQYWdlKCBmaW5hbCBTdHJpbmcgaGVscENvbnRleHRJZCApIHsKKwkJc3VwZXIoU0VMRUNUX1BST0pFQ1RfUEFHRV9OQU1FKTsKKwkJc2V0VGl0bGUoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9zZWxlY3RKUEFQcm9qZWN0ICk7CisJCXNldE1lc3NhZ2UoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9zZWxlY3RKUEFQcm9qZWN0X21zZyApOworCQl0aGlzLmhlbHBDb250ZXh0SWQgPSBoZWxwQ29udGV4dElkOworCX0KKworCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKKwkJaW50IG5Db2x1bW5zPSAxOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gbkNvbHVtbnM7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsJCQkKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIGNvbXBvc2l0ZSwgU1dULk5PTkUgKTsKKwkJbGFiZWwuc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3NlbGVjdEpQQVByb2plY3QgKTsKKwkJCisJCXByb2pUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULlZJUlRVQUwpOwkJCisJCXByb2pUYWJsZSA9IHByb2pUYWJsZVZpZXdlci5nZXRUYWJsZSgpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSggU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlICk7CisJCXByb2pUYWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKKwkJCQkKKwkJcHJvalRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWhhbmRsZUpwYVByb2plY3RTZWxlY3Rpb24oKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQl3aWRnZXRTZWxlY3RlZChlKTsKKwkJCX0KKwkJCQorCQl9KTsKKwkJCisJCXByb2pUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwcm9qVGFibGUpOworCQlwcm9qVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgUHJvamVjdFRhYmxlTGFiZWxQcm92aWRlcigpKTsKKwkJcHJvalRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUHJvamVjdFRhYmxlQ29udGVudFByb3ZpZGVyKCkpOworCQlmaWxsSnBhUHJvamVjdExpc3QoKTsKKwkJc2V0Q29udHJvbCggY29tcG9zaXRlICk7CisJCXZhbGlkYXRlKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBoYW5kbGVKcGFQcm9qZWN0U2VsZWN0aW9uKCkgeworCQlpZiAocHJvalRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgIT0gLTEpIHsKKwkJCVRhYmxlSXRlbSBpdGVtID0gIHByb2pUYWJsZS5nZXRJdGVtKHByb2pUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKKwkJCVN0cmluZyBwcm9qTmFtZSA9IGl0ZW0uZ2V0VGV4dCgwKTsKKwkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvak5hbWUpOworCQkJSnBhUHJvamVjdCBqcGFQcm9qID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KCBwcm9qZWN0ICk7CisJCQkoKEdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkKWdldFdpemFyZCgpKS5zZXRKcGFQcm9qZWN0KGpwYVByb2opOworCQkJdmFsaWRhdGUoKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgZmlsbEpwYVByb2plY3RMaXN0KCkgeworCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOworCQlMaXN0PFN0cmluZz4gcHJvak5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWZvciAoIElQcm9qZWN0IHByb2plY3QgOiBwcm9qZWN0cyApCisJCXsKKwkJCUpwYVByb2plY3QganBhUHJvaiA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCggcHJvamVjdCApOworCQkJaWYgKCBqcGFQcm9qICE9IG51bGwgKSB7CisJCQkJcHJvak5hbWVzLmFkZChwcm9qZWN0LmdldE5hbWUoKSk7CisJCQl9CisJCX0KKwkJcHJvalRhYmxlVmlld2VyLnNldElucHV0KHByb2pOYW1lcyk7CisJfQorCQorCXByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKKwkJaWYgKHByb2pUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpICE9IC0xKQorCQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOworCQllbHNlCisJCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZmluYWwgdm9pZCBwZXJmb3JtSGVscCgpIAorCXsKKwkgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuZGlzcGxheUhlbHAoIHRoaXMuaGVscENvbnRleHRJZCApOworCX0KKworCS8vIGlubmVyIGNsYXNzZXMKKwlwcml2YXRlIGZpbmFsIGNsYXNzIFByb2plY3RUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7CisJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQorCQl7CisJCQlpZiAoY29sdW1uSW5kZXggPT0gUFJPSkVDVF9OQU1FX0NPTFVNTl9JTkRFWCkKKwkJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShvcmcuZWNsaXBzZS51aS5pZGUuSURFLlNoYXJlZEltYWdlcy5JTUdfT0JKX1BST0pFQ1QpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKKwkJeworCQkJYXNzZXJ0IGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmc7CisJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKWVsZW1lbnQ7CisJCQlpZiAoY29sdW1uSW5kZXggPT0gUFJPSkVDVF9OQU1FX0NPTFVNTl9JTkRFWCkKKwkJCQlyZXR1cm4gcHJvamVjdE5hbWU7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQkJCisJfQorCQorCXByaXZhdGUgZmluYWwgY2xhc3MgUHJvamVjdFRhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKKwl7CisJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KXsKKwkJCXJldHVybiAoKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudCkudG9BcnJheSgpOworCQl9CisKKwkJcHVibGljIHZvaWQgZGlzcG9zZSgpe30KKworCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpe30KKwkJCisJfQorfQkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NXVFV0aWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NXVFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTE3MGQxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vU1dUVXRpbC5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworLyoqCisgKiBDb2xsZWN0aW9uIG9mIHV0aWxpdHkgbWV0aG9kcyB0byBjcmVhdGUgU1dUIFVJCisgKgorICovCitwdWJsaWMgY2xhc3MgU1dUVXRpbCB7CisJLyoqCisJICogU2V0IHRoZSBsYXlvdXREYXRhIG9mIHRoZSBpbnB1dCBjb250cm9sIHRvIG9jY3VweSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbHVtbnMKKwkgKiBAcGFyYW0gYworCSAqIEBwYXJhbSBjb2x1bW5zCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGZpbGxDb2x1bW5zKENvbnRyb2wgYywgaW50IGNvbHVtbnMpeworCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5zOworCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7CisJCWMuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKKwkJcmV0dXJuIDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZmlsbENvbHVtbnNXaXRoSW5kZW50KENvbnRyb2wgYywgaW50IGNvbHVtbnMsIGludCBpbmRlbnQpeworCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5zOworCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbEluZGVudCA9IGluZGVudCA7CisJCWMuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKKwkJcmV0dXJuIDsKKwl9CisJCisJcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQodGV4dCk7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7CisJCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7CisJCXJldHVybiBsYWJlbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgbGFiZWwgd2hpY2ggb2NjdXBpZXMgb25lIGdyaWQgY29sdW1uCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSB0ZXh0CisJICovCisJcHVibGljIHN0YXRpYyBMYWJlbCBuZXdMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgeworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCggcGFyZW50LCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoIHRleHQgKTsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7CisJCXJldHVybiBsYWJlbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgbGFiZWwgd2hpY2ggb2NjdXBpZXMgb25lIGdyaWQgY29sdW1uCisJICogQHBhcmFtIHBhcmVudAorCSAqIEBwYXJhbSB0ZXh0CisJICovCisJcHVibGljIHN0YXRpYyBMYWJlbCBuZXdMYWJlbFdpdGhJbmRlbnQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBpbmRlbnQpIHsKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIHBhcmVudCwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KCB0ZXh0ICk7CisJCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJbGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKKwkJbGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1AgOworCQlsYXlvdXREYXRhLmhvcml6b250YWxJbmRlbnQgPSBpbmRlbnQgOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOworCQlyZXR1cm4gbGFiZWw7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBzZXBhcmF0b3IgbGluZS4gRXhwZWN0cyBhIDxjb2RlPkdyaWRMYXlvdXQ8L2NvZGU+IHdpdGggYXQgbGVhc3QgMSBjb2x1bW4uCisJICogCisJICogQHBhcmFtIGNvbXBvc2l0ZSB0aGUgcGFyZW50IGNvbXBvc2l0ZQorCSAqIEBwYXJhbSBuQ29sdW1ucyBudW1iZXIgb2YgY29sdW1ucyB0byBzcGFuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKKwlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlU2VwYXJhdG9yKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBuQ29sdW1ucykgeworCQkobmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmRpYWxvZ2ZpZWxkcy5TZXBhcmF0b3IoCisJCQkJU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKSkuZG9GaWxsSW50b0dyaWQoY29tcG9zaXRlLCBuQ29sdW1ucywgNSk7CQkKKwl9CisKKwkKKwlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKKwkJQnV0dG9uIGJ0biA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBzdHlsZSk7CisJCWJ0bi5zZXRUZXh0KHRleHQpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47CisJCWJ0bi5zZXRMYXlvdXREYXRhKGdkKTsKKwkJcmV0dXJuIGJ0bjsKKwl9CisJCisJcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiApIHsKKwkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7CisJCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKKwkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT10cnVlOworCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWNvbWJvLnNldExheW91dERhdGEoZ2QpOworCQlyZXR1cm4gY29tYm87CisJfQorCisJcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4gKSB7CisJCVRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUik7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7CisJCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKKwkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT10cnVlOworCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7CisJCXJldHVybiB0ZXh0OworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdFRhYmxlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9TZWxlY3RUYWJsZURpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOGNhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9TZWxlY3RUYWJsZURpYWxvZy5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JbWFnZVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7CisKKy8qKgorICogQSBkYXRhYmFzZSB0YWJsZSBzZWxlY3Rpb24gZGlhbG9nIHdoaWNoIGFsbG93cyB1c2VyIHRvIGZpbHRlciB0YWJsZXMgYnkgbmFtZQorICovCitwdWJsaWMgY2xhc3MgU2VsZWN0VGFibGVEaWFsb2cgZXh0ZW5kcyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyB7CisJCisJcHVibGljIFNlbGVjdFRhYmxlRGlhbG9nKFNoZWxsIHNoZWxsKXsKKwkJc3VwZXIoc2hlbGwsIG5ldyBJTGFiZWxQcm92aWRlcigpeworCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7CisJCQkJcmV0dXJuIEltYWdlUmVwb3NpdG9yeS5nZXRUYWJsZUltYWdlKCk7CisJCQl9CisKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7fQorCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9CisKKwkJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7fQorCisJCX0pOworCQl0aGlzLnNldFRpdGxlKCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLnNlbGVjdFRhYmxlRGxnVGl0bGUgKTsvLworCQl0aGlzLnNldE1lc3NhZ2UoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuc2VsZWN0VGFibGVEbGdEZXNjKTsvLworCX0KKwkKKwlwdWJsaWMgU2VsZWN0VGFibGVEaWFsb2coU2hlbGwgc2hlbGwsIFNjaGVtYSBzY2hlbWEpeworCQl0aGlzKHNoZWxsKTsKKwkJCisJCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJSXRlcmF0b3I8VGFibGU+IHRhYmxlc0l0ID0gc2NoZW1hLnRhYmxlcygpOworCQl3aGlsZSAodGFibGVzSXQuaGFzTmV4dCgpKQorCQl7CisJCQlUYWJsZSB0YWJsZSA9IHRhYmxlc0l0Lm5leHQoKTsKKwkJCWxpc3QuYWRkKHRhYmxlLmdldE5hbWUoKSk7CisJCX0KKwkJdGhpcy5zZXRFbGVtZW50cyggbGlzdC50b0FycmF5KCkgKTsKKwkJCisJfQkKKwkKKwlwdWJsaWMgU2VsZWN0VGFibGVEaWFsb2coU2hlbGwgc2hlbGwsIExpc3Q8U3RyaW5nPiB0YWJsZU5hbWVzKXsKKwkJdGhpcyhzaGVsbCk7CisJCXRoaXMuc2V0RWxlbWVudHMoIHRhYmxlTmFtZXMudG9BcnJheSgpICk7CisJfQkKKwlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkVGFibGUoKQorCXsKKwkJU3RyaW5nIHRhYmxlTmFtZSA9IChTdHJpbmcpdGhpcy5nZXRGaXJzdFJlc3VsdCgpOworCQlyZXR1cm4gdGFibGVOYW1lIDsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1RhYmxlQXNzb2NpYXRpb25zV2l6YXJkUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NmFkMDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UuamF2YQpAQCAtMCwwICsxLDc1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKKworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmdlbi5TV1RVdGlsLmZpbGxDb2x1bW5zOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uU1dUVXRpbC5uZXdMYWJlbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuLlNXVFV0aWwubmV3TGFiZWxXaXRoSW5kZW50OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuZGlhbG9ncy5TdGF0dXNVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmRpYWxvZ2ZpZWxkcy5EaWFsb2dGaWVsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5kaWFsb2dmaWVsZHMuSVN0cmluZ0J1dHRvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLkxheW91dFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLlN0cmluZ0J1dHRvbkRpYWxvZ0ZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5Bc3NvY2lhdGlvblJvbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PUk1HZW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5EVFBVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JbWFnZVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOworCitwdWJsaWMgY2xhc3MgVGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7CisKKwlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKKwlwcml2YXRlIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciA7CisJCisJcHJpdmF0ZSBBc3NvY2lhdGlvbnNMaXN0Q29tcG9zaXRlIGFzc29jaWF0aW9uTGlzdDsgCisJcHJpdmF0ZSBBc3NvY2lhdGlvbiBzZWxlY3RlZEFzc29jaWF0aW9uOworCXByaXZhdGUgQnV0dG9uIGRlbGV0ZUFzc29jaWF0aW9uTGluayA7CisJcHJpdmF0ZSBCdXR0b24gY3JlYXRlQXNzb2NpYXRpb25MaW5rIDsKKwkKKwkvL0NvbnRyb2xzIGluIEFzc29jaWF0aW9uIEVkaXQgUGFuZWwKKwlwcml2YXRlIENvbXBvc2l0ZSBhc3NvY2lhdGlvbnNFZGl0UGFuZWwgOworCXByaXZhdGUgQnV0dG9uIGdlbmVyYXRlQXNzb2NpYXRpb25DaGVja0JveDsgCisJcHJpdmF0ZSBMYWJlbCBjYXJkaW5hbGl0eUxhYmVsIDsKKwlwcml2YXRlIENvbWJvIGNhcmRpbmFsaXR5Q29tYm8gOworCS8qd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgcmVmZXJyZXItLT5yZWZlcmVuY2VkIHJvbGUuKi8KKwlwcml2YXRlIEJ1dHRvbiByZWZlcnJlclJvbGVDaGVja0JveDsgCisJLyp0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIHJlZmVycmVyLS0+cmVmZXJlbmNlZCByb2xlLiovCisJcHJpdmF0ZSBMYWJlbCByZWZlcnJlclJvbGVQcm9wZXJ0eUxhYmVsOworCXByaXZhdGUgVGV4dCByZWZlcnJlclJvbGVQcm9wZXJ0eUZpZWxkIDsKKwkvKnRoZSBjYXNjYWRlIGluIHRoZSByZWZlcnJlci0tPnJlZmVyZW5jZWQgcm9sZS4qLworCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCisJcHJpdmF0ZSBTdHJpbmdCdXR0b25EaWFsb2dGaWVsZCByZWZlcnJlclJvbGVDYXNjYWRlRmllbGQ7CisJLyp3aGV0aGVyIHRvIGdlbmVyYXRlIHRoZSByZWZlcmVuY2VkLT5yZWZlcnJlciByb2xlLiovCisJcHJpdmF0ZSBCdXR0b24gcmVmZXJlbmNlZFJvbGVDaGVja0JveDsKKwkvKnRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgcmVmZXJlbmNlZC0+cmVmZXJyZXIgcm9sZS4qLworCXByaXZhdGUgTGFiZWwgcmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUxhYmVsOworCXByaXZhdGUgVGV4dCByZWZlcmVuY2VkUm9sZVByb3BlcnR5RmllbGQgOworCS8qdGhlIGNhc2NhZGUgaW4gdGhlIHJlZmVyZW5jZWQtPnJlZmVycmVyIHJvbGUuKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorCXByaXZhdGUgU3RyaW5nQnV0dG9uRGlhbG9nRmllbGQgcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQ7CisJcHJpdmF0ZSBMYWJlbCBqb2luQ29uZGl0aW9uTGFiZWw7CisJcHJpdmF0ZSBUZXh0IGpvaW5Db25kaXRpb25UZXh0OyAKKwkKKwlwcml2YXRlIENvbXBvc2l0ZSBkZXRhaWxQYW5lbCA7CisJcHJpdmF0ZSBTdGFja0xheW91dCBkZXRhaWxQYW5lbFN0YXRja0xheW91dCA7CisJcHJpdmF0ZSBDb21wb3NpdGUgZW1wdHlQYW5lbCA7CisJCisJcHJvdGVjdGVkIFRhYmxlQXNzb2NpYXRpb25zV2l6YXJkUGFnZShKcGFQcm9qZWN0IGpwYVByb2plY3QgKSB7CisJCXN1cGVyKCJUYWJsZSBBc3NvY2lhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAorCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OworCQlzZXRUaXRsZShKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX3RpdGxlKTsKKwkJc2V0TWVzc2FnZShKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX2Rlc2MpOworCQkKKwl9CisKKwlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7CisJCQorCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKKwkJaW50IG5Db2x1bW5zPSAyIDsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IG5Db2x1bW5zOworCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisJCXRoaXMuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5HRU5FUkFURV9FTlRJVElFU19XSVpBUkRfVEFCTEVfQVNTT0NJQVRJT05TKTsKKworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9sYWJlbCApOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7CisJCWxhYmVsLnNldExheW91dERhdGEoIGdkICk7CisJCQorCQljcmVhdGVBc3NvY2lhdGlvbnNMaXN0UGFuZWwoY29tcG9zaXRlKTsKKwkJY3JlYXRlQWRkRGVsZXRlQnV0dG9ucyhjb21wb3NpdGUsIG5Db2x1bW5zKTsKKwkJU1dUVXRpbC5jcmVhdGVTZXBhcmF0b3IoY29tcG9zaXRlLCBuQ29sdW1ucyk7CisJCQorCQljcmVhdGVEZXRhaWxQYW5lbChjb21wb3NpdGUpOworCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7CisJCQorCQljb21wb3NpdGUubGF5b3V0KHRydWUpOworCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSggdHJ1ZSk7CisJCQorCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVBZGREZWxldGVCdXR0b25zKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5zKSB7CisJCQorCQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoIGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlmaWxsQ29sdW1ucyhjLCAxKTsKKwkJYy5zZXRMYXlvdXQoIG5ldyBHcmlkTGF5b3V0KDEsdHJ1ZSkgKTsKKwkJCisJCWNyZWF0ZUFzc29jaWF0aW9uTGluayA9IG5ldyBCdXR0b24oYywgU1dULk5PTkUpOworCQljcmVhdGVBc3NvY2lhdGlvbkxpbmsuc2V0VG9vbFRpcFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY1BhZ2VfbmV3QXNzb2MgKTsKKwkJY3JlYXRlQXNzb2NpYXRpb25MaW5rLnNldEltYWdlKCBJbWFnZVJlcG9zaXRvcnkuZ2V0QWRkQnV0dG9uSW1hZ2UoKSApOworCQljcmVhdGVBc3NvY2lhdGlvbkxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30JCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJbGF1bmNoTmV3QXNzb2NpYXRpb25zV2l6YXJkKCk7CisJCQl9CQorCQkJCisJCX0pOworCQkKKwkJZGVsZXRlQXNzb2NpYXRpb25MaW5rID0gbmV3IEJ1dHRvbihjLCBTV1QuTk9ORSk7CisJCWRlbGV0ZUFzc29jaWF0aW9uTGluay5zZXRGb3JlZ3JvdW5kKCBuZXcgQ29sb3IoRGlzcGxheS5nZXREZWZhdWx0KCksIDAsMCwyNTUpKTsKKwkJZGVsZXRlQXNzb2NpYXRpb25MaW5rLnNldEltYWdlKCBJbWFnZVJlcG9zaXRvcnkuZ2V0RGVsZXRlQnV0dG9uSW1hZ2UoKSAgKTsKKwkJZGVsZXRlQXNzb2NpYXRpb25MaW5rLnNldFRvb2xUaXBUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX2RlbEFzc29jICk7CisJCWRlbGV0ZUFzc29jaWF0aW9uTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQkKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IGFzc29jaWF0aW9uTGlzdC5nZXRTZWxlY3RlZEFzc29jaWF0aW9uKCk7CisJCQkJaWYoIGFzc29jaWF0aW9uICE9IG51bGwgKXsKKwkJCQkJT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyID0gZ2V0Q3VzdG9taXplcigpOworCQkJCQljdXN0b21pemVyLmRlbGV0ZUFzc29jaWF0aW9uKGFzc29jaWF0aW9uKTsKKwkJCQkJTGlzdDxBc3NvY2lhdGlvbj4gYXNzb2NpYXRpb25zID0gY3VzdG9taXplci5nZXRBc3NvY2lhdGlvbnMoKTsKKwkJCQkJYXNzb2NpYXRpb25MaXN0LnVwZGF0ZUFzc29jaWF0aW9ucyhhc3NvY2lhdGlvbnMpOworCQkJCQlpZiggYXNzb2NpYXRpb25zLnNpemUoKT09MCApeworCQkJCQkJaGlkZUFzc29jaWF0aW9uRGV0YWlsKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CQorCQl9KTsKKwkJZGVsZXRlQXNzb2NpYXRpb25MaW5rLnNldEVuYWJsZWQoZmFsc2UpOworCQkKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlR2VuZXJhdGVBc3NvY2lhdGlvbkNoZWNrYm94KENvbXBvc2l0ZSBjb21wb3NpdGUsICBpbnQgY29sdW1ucykgeworCQlnZW5lcmF0ZUFzc29jaWF0aW9uQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKKwkJZ2VuZXJhdGVBc3NvY2lhdGlvbkNoZWNrQm94LnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9nZW5Bc3NvYyk7CisJCWdlbmVyYXRlQXNzb2NpYXRpb25DaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KKwkJCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb24gPSBhc3NvY2lhdGlvbkxpc3QuZ2V0U2VsZWN0ZWRBc3NvY2lhdGlvbigpOworCQkJCWlmKCBhc3NvY2lhdGlvbiA9PSBudWxsICkKKwkJCQkJcmV0dXJuOworCQkJCWFzc29jaWF0aW9uLnNldEdlbmVyYXRlZChnZW5lcmF0ZUFzc29jaWF0aW9uQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOworCQkJCQorCQkJCXVwZGF0ZUFzc29jaWF0aW9uRWRpdFBhbmVsKGFzc29jaWF0aW9uKTsKKwkJCQlhc3NvY2lhdGlvbkxpc3QudXBkYXRlU2VsZWN0ZWRBc3NvY2lhdGlvbigpOworCQkJfQorCisJCX0pOworCisJCWZpbGxDb2x1bW5zKGdlbmVyYXRlQXNzb2NpYXRpb25DaGVja0JveCwgY29sdW1ucy0xKTsKKwkJbmV3TGFiZWwoY29tcG9zaXRlLCAiIik7CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKKwlwcml2YXRlIHZvaWQgY3JlYXRlR2VuZXJhdGVSZWZlcnJlclJvbGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCAgaW50IGNvbHVtbnMpIHsKKwkJcmVmZXJyZXJSb2xlQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKKwkJcmVmZXJyZXJSb2xlQ2hlY2tCb3guc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2VudGl0eVJlZiApOworCQlyZWZlcnJlclJvbGVDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KKwkJCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJYm9vbGVhbiBnZW5lcmF0ZSA9IHJlZmVycmVyUm9sZUNoZWNrQm94LmdldFNlbGVjdGlvbigpOworCQkJCS8vcmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZC5zZXRFZGl0YWJsZSggZ2VuZXJhdGUgKTsKKwkJCQlyZWZlcnJlclJvbGVQcm9wZXJ0eUxhYmVsLnNldEVuYWJsZWQoIGdlbmVyYXRlICk7CisJCQkJcmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZC5zZXRFbmFibGVkKCBnZW5lcmF0ZSApOworCQkJCXJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZC5zZXRFbmFibGVkKGdlbmVyYXRlKTsKKwkJCQkKKwkJCQkvL0lmIGJvdGggcmVmZXJlbmNlZFJvbGVDaGVja0JveCBhbmQgcmVmZXJlbmNlZFJvbGVDaGVja0JveCB1bmNoZWNrZWQsIAorCQkJCS8vdGhlIGFzc29jaWF0aW9uIGl0c2VsZiBzaG91bGRuJ3QgYmUgZ2VuZXJhdGVkIAorCQkJCWlmKCAhZ2VuZXJhdGUgJiYgIXJlZmVyZW5jZWRSb2xlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpeworCQkJCQlnZW5lcmF0ZUFzc29jaWF0aW9uQ2hlY2tCb3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKKwkJCQkJY2FyZGluYWxpdHlMYWJlbC5zZXRFbmFibGVkKCBmYWxzZSApOworCQkJCQljYXJkaW5hbGl0eUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCQlyZWZlcnJlclJvbGVDaGVja0JveC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQkJcmVmZXJlbmNlZFJvbGVDaGVja0JveC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQl9CisJCQkJCisJCQkJZGlyZWN0aW9uYWxpdHlDaGVja0JveENoYW5nZWQoICk7CQkJCisJCQkJCisJCQkJaWYoIGdlbmVyYXRlICl7CisJCQkJCUFzc29jaWF0aW9uUm9sZSByb2xlID0gc2VsZWN0ZWRBc3NvY2lhdGlvbi5nZXRSZWZlcnJlclJvbGUoKTsKKwkJCQkJcmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZC5zZXRUZXh0KCByb2xlLmdldFByb3BlcnR5TmFtZSgpICk7CisJCQkJfQorCQkJfQorCisJCX0pOworCisJCVNXVFV0aWwuZmlsbENvbHVtbnNXaXRoSW5kZW50KHJlZmVycmVyUm9sZUNoZWNrQm94ICwgY29sdW1ucy0xLCAyMCApOworCQluZXdMYWJlbChwYXJlbnQsICIiKTsvLyROT04tTkxTLTEkCisJCQorCQlyZWZlcnJlclJvbGVQcm9wZXJ0eUxhYmVsID0gbmV3TGFiZWxXaXRoSW5kZW50KCBwYXJlbnQsICBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLnByb3BlcnR5LCA0MCApOyAvLyROT04tTkxTLTEkCisJCXJlZmVycmVyUm9sZVByb3BlcnR5RmllbGQgPSBuZXcgVGV4dCggcGFyZW50LCBTV1QuQk9SREVSKTsKKwkJZmlsbENvbHVtbnMocmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZCwgMik7CisJCXJlZmVycmVyUm9sZVByb3BlcnR5RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7CisJCQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJaWYoIHNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJSb2xlKCkgPT0gbnVsbCApCisJCQkJCXJldHVybjsKKwkJCQlTdHJpbmcgZmllbGROYW1lID0gcmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZC5nZXRUZXh0KCk7CisJCQkJSVN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVGaWVsZE5hbWUoIGZpZWxkTmFtZSApOworCQkJCWlmKCAhc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikgKXsKKwkJCQkJc2VsZWN0ZWRBc3NvY2lhdGlvbi5nZXRSZWZlcnJlclJvbGUoKS5zZXRQcm9wZXJ0eU5hbWUoZmllbGROYW1lKTsKKwkJCQl9CisJCQkJdXBkYXRlU3RhdHVzKHN0YXR1cyk7CisJCQl9CQkJCisJCX0pOworCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBwYXJlbnQsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0VGV4dCggIiIgKTsvLyROT04tTkxTLTEkCisJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOworCQkKKwkJcmVmZXJyZXJSb2xlQ2FzY2FkZUZpZWxkID0gbmV3IFN0cmluZ0J1dHRvbkRpYWxvZ0ZpZWxkKCBuZXcgSVN0cmluZ0J1dHRvbkFkYXB0ZXIoKXsKKwkJCXB1YmxpYyB2b2lkIGNoYW5nZUNvbnRyb2xQcmVzc2VkKERpYWxvZ0ZpZWxkIGZpZWxkKSB7CisJCQkJaWYoIGVkaXRDYXNjYWRlKCBzZWxlY3RlZEFzc29jaWF0aW9uLmdldFJlZmVycmVyUm9sZSgpICkpeworCQkJCQlyZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuc2V0VGV4dChzZWxlY3RlZEFzc29jaWF0aW9uLmdldFJlZmVycmVyUm9sZSgpLmdldENhc2NhZGUoKSk7CisJCQkJfQorCQkJfQkKKwkJfSkgOworCQlyZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuc2V0TGFiZWxUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLmNhc2NhZGUgKTsgLy8kTk9OLU5MUy0xJAorCQlyZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuc2V0QnV0dG9uTGFiZWwoIiIpOyAvLyROT04tTkxTLTEkCisJCXJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZC5kb0ZpbGxJbnRvR3JpZChwYXJlbnQsIDMpOworCQlyZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuZ2V0VGV4dENvbnRyb2wocGFyZW50KS5zZXRFZGl0YWJsZShmYWxzZSk7CisJCWludCBtYXhGaWVsZFdpZHRoID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDQwKTsKKwkJTGF5b3V0VXRpbC5zZXRXaWR0aEhpbnQocmVmZXJyZXJSb2xlQ2FzY2FkZUZpZWxkLmdldFRleHRDb250cm9sKG51bGwpLCBtYXhGaWVsZFdpZHRoICk7CisJCUJ1dHRvbiBidG4gPSByZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuZ2V0Q2hhbmdlQ29udHJvbChudWxsKTsKKwkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSlidG4uZ2V0TGF5b3V0RGF0YSgpOworCQlidG4uc2V0SW1hZ2UoIEltYWdlUmVwb3NpdG9yeS5nZXRCcm93c2VCdXR0b25JbWFnZSgpICk7CisJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7CisJCWRhdGEud2lkdGhIaW50ID0gMzA7CisJCWJ0bi5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkKKwkJTGFiZWwgbGFiZWxDdHJsICA9IHJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZC5nZXRMYWJlbENvbnRyb2wocGFyZW50KTsKKwkJZGF0YSA9IChHcmlkRGF0YSlsYWJlbEN0cmwuZ2V0TGF5b3V0RGF0YSgpOworCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSA0MCA7CisJCWxhYmVsQ3RybC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkKKwkJCisJCWxhYmVsID0gbmV3IExhYmVsKCBwYXJlbnQsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0VGV4dCggIiIgKTsvLyROT04tTkxTLTEkCisJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOworCQkKKwl9CQorCQorCQorCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CisJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7CisJCWlmKCB2aXNpYmxlICl7CisJCQloaWRlQXNzb2NpYXRpb25EZXRhaWwoKTsKKwkJCXVwZGF0ZUFzc29jaWF0aW9uc0xpc3RQYW5lbCgpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGhpZGVBc3NvY2lhdGlvbkRldGFpbCggKXsKKwkJdGhpcy5kZXRhaWxQYW5lbFN0YXRja0xheW91dC50b3BDb250cm9sID0gZW1wdHlQYW5lbDsKKwkJdGhpcy5kZXRhaWxQYW5lbC5sYXlvdXQoKTsKKwkJdGhpcy5kZXRhaWxQYW5lbC5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKKwl9CisJCisJLyoqCisJICogVXBkYXRlcyB0aGUgc3RhdHVzIGxpbmUgYW5kIHRoZSBPSyBidXR0b24gYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzdGF0dXMKKwkgKiAKKwkgKiBAcGFyYW0gc3RhdHVzIHN0YXR1cyB0byBhcHBseQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7CisJCXNldFBhZ2VDb21wbGV0ZSghc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpOworCQkKKwkJU3RhdHVzVXRpbC5hcHBseVRvU3RhdHVzTGluZSh0aGlzLCBzdGF0dXMpOworCQlpZiggc3RhdHVzLmdldENvZGUoKSA9PSBTdGF0dXMuT0sgKXsKKwkJCXNldE1lc3NhZ2UoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9kZXNjKTsKKwkJfQorCX0KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorCXByaXZhdGUgdm9pZCBjcmVhdGVHZW5lcmF0ZVJlZmVyZW5jZWRSb2xlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgIGludCBjb2x1bW5zKSB7CisJCXJlZmVyZW5jZWRSb2xlQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKKwkJcmVmZXJlbmNlZFJvbGVDaGVja0JveC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3Jfc2V0UmVmICk7CisJCXJlZmVyZW5jZWRSb2xlQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CisJCQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWJvb2xlYW4gZ2VuZXJhdGUgPSByZWZlcmVuY2VkUm9sZUNoZWNrQm94LmdldFNlbGVjdGlvbigpOworCQkJCXJlZmVyZW5jZWRSb2xlUHJvcGVydHlMYWJlbC5zZXRFbmFibGVkKCBnZW5lcmF0ZSk7CisJCQkJcmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLnNldEVuYWJsZWQoIGdlbmVyYXRlKTsKKwkJCQlyZWZlcmVuY2VkUm9sZUNhc2NhZGVGaWVsZC5zZXRFbmFibGVkKGdlbmVyYXRlKTsKKwkJCQkKKwkJCQlpZiggIWdlbmVyYXRlICYmICFyZWZlcnJlclJvbGVDaGVja0JveC5nZXRTZWxlY3Rpb24oKSl7CisJCQkJCWdlbmVyYXRlQXNzb2NpYXRpb25DaGVja0JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQkJCQljYXJkaW5hbGl0eUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCQlyZWZlcnJlclJvbGVDaGVja0JveC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQkJcmVmZXJlbmNlZFJvbGVDaGVja0JveC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQl9CisJCQkJZGlyZWN0aW9uYWxpdHlDaGVja0JveENoYW5nZWQoKTsKKwkJCQlpZiggZ2VuZXJhdGUgKXsKKwkJCQkJQXNzb2NpYXRpb25Sb2xlIHJvbGUgPSBzZWxlY3RlZEFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRSb2xlKCk7CisJCQkJCXJlZmVyZW5jZWRSb2xlUHJvcGVydHlGaWVsZC5zZXRUZXh0KCByb2xlLmdldFByb3BlcnR5TmFtZSgpICk7CisJCQkJfQorCQkJfQorCisJCX0pOworCisJCVNXVFV0aWwuZmlsbENvbHVtbnNXaXRoSW5kZW50KCByZWZlcmVuY2VkUm9sZUNoZWNrQm94ICwgY29sdW1ucy0xLCAyMCApOworCQluZXdMYWJlbChwYXJlbnQsICIiKTsvLyROT04tTkxTLTEkCisJCQorCQlyZWZlcmVuY2VkUm9sZVByb3BlcnR5TGFiZWwgPSBTV1RVdGlsLm5ld0xhYmVsV2l0aEluZGVudChwYXJlbnQsICBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLnByb3BlcnR5LCA0MCApOyAvLyROT04tTkxTLTEkCisJCQorCQlyZWZlcmVuY2VkUm9sZVByb3BlcnR5RmllbGQgPSBuZXcgVGV4dCggcGFyZW50LCBTV1QuQk9SREVSKTsKKwkJZmlsbENvbHVtbnMocmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLCAyKTsKKwkJcmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpeworCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJaWYoIHNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFJvbGUoKSA9PSBudWxsICkKKwkJCQkJcmV0dXJuIDsKKwkJCQkKKwkJCQlTdHJpbmcgZmllbGROYW1lID0gcmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLmdldFRleHQoKTsKKwkJCQlJU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUlkZW50aWZpZXIoZmllbGROYW1lLAorCQkJCQkJSmF2YUNvcmUuVkVSU0lPTl8xXzMsIEphdmFDb3JlLlZFUlNJT05fMV8zKTsKKwkJCQlpZiggIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpICl7CisJCQkJCWlmKCAhZmllbGROYW1lLmVxdWFscyhzZWxlY3RlZEFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRSb2xlKCkuZ2V0UHJvcGVydHlOYW1lKCkpICkKKwkJCQkJCXNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFJvbGUoKS5zZXRQcm9wZXJ0eU5hbWUoZmllbGROYW1lKTsKKwkJCQl9CisJCQkJdXBkYXRlU3RhdHVzKHN0YXR1cyk7CisJCQl9CQkJCisJCX0pOworCQkKKworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCggcGFyZW50LCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoICIiICk7Ly8kTk9OLU5MUy0xJAorCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKKwkJCisJCQorCQlyZWZlcmVuY2VkUm9sZUNhc2NhZGVGaWVsZCA9IG5ldyBTdHJpbmdCdXR0b25EaWFsb2dGaWVsZCggbmV3IElTdHJpbmdCdXR0b25BZGFwdGVyKCl7CisJCQlwdWJsaWMgdm9pZCBjaGFuZ2VDb250cm9sUHJlc3NlZChEaWFsb2dGaWVsZCBmaWVsZCkgeworCQkJCWlmKCBlZGl0Q2FzY2FkZSggc2VsZWN0ZWRBc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkUm9sZSgpICkgKXsKKwkJCQkJcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuc2V0VGV4dCggc2VsZWN0ZWRBc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkUm9sZSgpLmdldENhc2NhZGUoKSApOworCQkJCX0KKwkJCX0JCisJCX0pIDsKKwkJcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuc2V0TGFiZWxUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLmNhc2NhZGUgKTsgLy8kTk9OLU5MUy0xJAorCQlyZWZlcmVuY2VkUm9sZUNhc2NhZGVGaWVsZC5zZXRCdXR0b25MYWJlbCgiIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuZG9GaWxsSW50b0dyaWQocGFyZW50LCAzKTsKKwkJcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuZ2V0VGV4dENvbnRyb2wocGFyZW50KS5zZXRFZGl0YWJsZSggZmFsc2UpOworCQlpbnQgbWF4RmllbGRXaWR0aCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg0MCk7CisJCUxheW91dFV0aWwuc2V0V2lkdGhIaW50KHJlZmVyZW5jZWRSb2xlQ2FzY2FkZUZpZWxkLmdldFRleHRDb250cm9sKG51bGwpLCBtYXhGaWVsZFdpZHRoICk7CisJCUJ1dHRvbiBidG4gPSByZWZlcmVuY2VkUm9sZUNhc2NhZGVGaWVsZC5nZXRDaGFuZ2VDb250cm9sKG51bGwpOworCQlidG4uc2V0SW1hZ2UoIEltYWdlUmVwb3NpdG9yeS5nZXRCcm93c2VCdXR0b25JbWFnZSgpICk7CisJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpYnRuLmdldExheW91dERhdGEoKTsKKwkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKKwkJZGF0YS53aWR0aEhpbnQgPSAzMDsKKwkJYnRuLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQlMYWJlbCBsYWJlbEN0cmwgID0gcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuZ2V0TGFiZWxDb250cm9sKHBhcmVudCk7CisJCWRhdGEgPSAoR3JpZERhdGEpbGFiZWxDdHJsLmdldExheW91dERhdGEoKTsKKwkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNDAgOworCQlsYWJlbEN0cmwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCWxhYmVsID0gbmV3IExhYmVsKCBwYXJlbnQsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0VGV4dCggIiIgKTsvLyROT04tTkxTLTEkCisJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOworCQkKKwl9CQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVEZXRhaWxQYW5lbChDb21wb3NpdGUgY29tcG9zaXRlICkgeworCQkKKwkJdGhpcy5kZXRhaWxQYW5lbCA9IG5ldyBDb21wb3NpdGUoIGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOworCQl0aGlzLmRldGFpbFBhbmVsLnNldExheW91dERhdGEoZ2QpOworCQl0aGlzLmRldGFpbFBhbmVsU3RhdGNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7CisJCXRoaXMuZGV0YWlsUGFuZWwuc2V0TGF5b3V0KCB0aGlzLmRldGFpbFBhbmVsU3RhdGNrTGF5b3V0ICk7CisJCQorCQllbXB0eVBhbmVsID0gbmV3IENvbXBvc2l0ZSggZGV0YWlsUGFuZWwsIFNXVC5OT05FKTsKKwkJZW1wdHlQYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsgCisJCWRldGFpbFBhbmVsU3RhdGNrTGF5b3V0LnRvcENvbnRyb2wgPSBlbXB0eVBhbmVsOworCQlkZXRhaWxQYW5lbC5sYXlvdXQoKTsKKwkJCisJCWNvbXBvc2l0ZS5sYXlvdXQoKTsKKwl9CisJCisJCisJcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQXNzb2NpYXRpb25zRWRpdFBhbmVsKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5zKSB7CisJCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKCBjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJZmlsbENvbHVtbnMocGFyZW50LCA0KTsKKworCQljcmVhdGVHZW5lcmF0ZUFzc29jaWF0aW9uQ2hlY2tib3gocGFyZW50LGNvbHVtbnMpOworCQlpbnQgbkNvbHVtbnM9IDQgOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gbkNvbHVtbnM7CisJCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKKworCQkvL0NhcmRpbmFsaXR5CisJCWNhcmRpbmFsaXR5TGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7CisJCWNhcmRpbmFsaXR5TGFiZWwuc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5jYXJkaW5hbGl0eSk7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7CisJCWdkLmhvcml6b250YWxJbmRlbnQgPSAyMDsKKwkJY2FyZGluYWxpdHlMYWJlbC5zZXRMYXlvdXREYXRhKCBnZCApOworCQkKKwkJY2FyZGluYWxpdHlDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZICk7CisJCQorCQlmaWxsQ29sdW1ucyhjYXJkaW5hbGl0eUNvbWJvLCAxKTsKKwkJCisJCWNhcmRpbmFsaXR5Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlzZWxlY3RlZEFzc29jaWF0aW9uLnNldENhcmRpbmFsaXR5KCBjYXJkaW5hbGl0eUNvbWJvLmdldFRleHQoKSk7CisJCQkJYXNzb2NpYXRpb25MaXN0LnVwZGF0ZVNlbGVjdGVkQXNzb2NpYXRpb24oKTsKKwkJCX0KKwkJfSk7CisJCQorCQkvL0FkZGluZyBhIGZpbGxlciBjb2x1bW4KKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIHBhcmVudCwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KCAiIik7Ly8kTk9OLU5MUy0xJAorCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOworCQlsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKKwkJCisJCS8vVGFibGUgam9pbiBjb25kaXRpb24KKwkJam9pbkNvbmRpdGlvbkxhYmVsID0gbmV3TGFiZWxXaXRoSW5kZW50KHBhcmVudCwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX3RhYmxlSm9pbiwgMjAgKTsKKwkJCisJCWpvaW5Db25kaXRpb25UZXh0ID0gbmV3IFRleHQoIHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiApOworCQlqb2luQ29uZGl0aW9uVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7CisJCWpvaW5Db25kaXRpb25UZXh0LnNldFRleHQoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2pvaW5lZFdoZW4pOworCQlsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOworCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKKwkJbGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWxheW91dERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWxheW91dERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKKwkJbGF5b3V0RGF0YS5oZWlnaHRIaW50ID0gNTA7CisJCWpvaW5Db25kaXRpb25UZXh0LnNldExheW91dERhdGEobGF5b3V0RGF0YSk7CisJCW5ld0xhYmVsKHBhcmVudCwgIiIpOy8vJE5PTi1OTFMtMSQKKworCQkvL0dlbmVyYXRlIFVJIGNvbnRyb2xzIGZvciBSZWZlcnJlclJvbGUKKwkJY3JlYXRlR2VuZXJhdGVSZWZlcnJlclJvbGVDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOworCisJCS8vR2VuZXJhdGUgVUkgY29udHJvbHMgZm9yIFJlZmVyZW5jZWRSb2xlCisJCWNyZWF0ZUdlbmVyYXRlUmVmZXJlbmNlZFJvbGVDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOworCQkKKwkJCisJCXJldHVybiBwYXJlbnQ7CisJfQorCisJcHVibGljIGJvb2xlYW4gZWRpdENhc2NhZGUoQXNzb2NpYXRpb25Sb2xlIHJvbGUpIHsKKwkJQ2FzY2FkZURpYWxvZyBkbGcgPSBDYXNjYWRlRGlhbG9nLmNyZWF0ZShyb2xlKTsKKwkJaWYgKGRsZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJcmV0dXJuIHRydWU7CisJfQkKKworCXByaXZhdGUgdm9pZCBjcmVhdGVBc3NvY2lhdGlvbnNMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSggcGFyZW50LCBTV1QuTlVMTCApOworCQljb21wb3NpdGUuc2V0TGF5b3V0KCBuZXcgRmlsbExheW91dCgpKTsKKwkJY29tcG9zaXRlLnNldEJhY2tncm91bmQobmV3IENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLDI1NSwgMCwwKSApOworCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOworCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKKwkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7CisJCWxheW91dERhdGEud2lkdGhIaW50ID0gNDAwOworCQlsYXlvdXREYXRhLmhlaWdodEhpbnQgPSA0MDA7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOworCQkKKwkJYXNzb2NpYXRpb25MaXN0ID0gbmV3IEFzc29jaWF0aW9uc0xpc3RDb21wb3NpdGUoY29tcG9zaXRlLCB0aGlzKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGxhdW5jaE5ld0Fzc29jaWF0aW9uc1dpemFyZCgpIHsKKwkJT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyID0gZ2V0Q3VzdG9taXplcigpOworCQlOZXdBc3NvY2lhdGlvbldpemFyZCB3aXphcmQgPSBuZXcgTmV3QXNzb2NpYXRpb25XaXphcmQodGhpcy5qcGFQcm9qZWN0LCBjdXN0b21pemVyICk7CisJCQorCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyggdGhpcy5nZXRTaGVsbCgpLCB3aXphcmQpOworCQlkaWFsb2cuY3JlYXRlKCk7CisJCWludCByZXR1cm5Db2RlID0gZGlhbG9nLm9wZW4oKTsKKwkJaWYgKHJldHVybkNvZGUgPT0gV2luZG93Lk9LKSB7CisJCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IHdpemFyZC5nZXROZXdBc3NvY2lhdGlvbigpOworCQkJaWYoIGFzc29jaWF0aW9uICE9bnVsbCApeworCQkJCWN1c3RvbWl6ZXIuYWRkQXNzb2NpYXRpb24oYXNzb2NpYXRpb24pOworCQkJCXVwZGF0ZUZvcmVpZ25LZXlDb2x1bW5HZW5Qcm9wZXJ0eShhc3NvY2lhdGlvbik7CisJCQkJdXBkYXRlQXNzb2NpYXRpb25zTGlzdFBhbmVsKCk7CisJCQl9CisJCX0JCQorCX0KKwkvKioKKwkgKiBGb3IgdXNlciBjcmVhdGVkIGFzc29jaWF0aW9uOgorCSAqIElmIGFzc29jaWF0aW9uIGlzIHRvIGJlIGdlbmVyYXRlZCwgbm8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgZ2V0dGVyL3NldHRlciBmb3IgdGhlIGNvbHVtbiBpdHNlbGYKKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlRm9yZWlnbktleUNvbHVtbkdlblByb3BlcnR5KEFzc29jaWF0aW9uIGFzc29jaWF0aW9uKSB7CisJCS8vTmVlZCB0byBwcm9jZXNzIE1BTllfVE9fT05FIG9ubHkgc2luY2UgdGhlIHRoZSBhc3NvY2lhdGlvbnMgbGlzdCBhcmUgb3B0aW1pemVkIHRvIGhhdmUgTUFOWV9UT19PTkUKKwkJaWYoIGFzc29jaWF0aW9uLmlzQ3VzdG9tKCkgJiYgYXNzb2NpYXRpb24uZ2V0Q2FyZGluYWxpdHkoKS5lcXVhbHMoIEFzc29jaWF0aW9uLk1BTllfVE9fT05FICkgKXsKKwkJCWJvb2xlYW4gZ2VuZXJhdGVDb2x1bW4gPSAgIWFzc29jaWF0aW9uLmlzR2VuZXJhdGVkKCk7CisJCQkvL1RoZSAiTUFOWSIgc2lkZSBEQiB0YWJsZQorCQkJLy9PUk1HZW5UYWJsZSB0YWJsZTEgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclRhYmxlKCk7CisJCQkvL1RoZSAiT05FIiBzaWRlIERCIHRhYmxlCisJCQkvL09STUdlblRhYmxlIHRhYmxlMiA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRUYWJsZSgpOworCQkJLy9UaGUgbGlzdCBvZiBmb3JlaWduIGtleSBjb2x1bW5zIGluIHRoZSBNQU5ZIHNpZGUsIHNob3VsZCBub3QgYmUgZ2VuZXJhdGVkCisJCQkvL1RoZSBsaXN0IG9mIHByaW1hcnkga2V5cyBpbiB0aGUgT05FIHNpZGUsIHdpbGwgYmUgZ2VuZXJhdGVkCisJCQkvL0xpc3Q8T1JNR2VuQ29sdW1uPiBsaXN0MiA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRDb2x1bW5zKCk7CQorCQkJTGlzdDxPUk1HZW5Db2x1bW4+IGxpc3QxID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJDb2x1bW5zKCk7CQorCQkJZm9yKE9STUdlbkNvbHVtbiBjIDogbGlzdDEgKXsKKwkJCQlpZiggYy5pc0dlbmVyYXRlZCgpICE9IGdlbmVyYXRlQ29sdW1uKXsKKwkJCQkJaWYoICFnZW5lcmF0ZUNvbHVtbiAmJiBjLmdldERiQ29sdW1uKCkuaXNQYXJ0T2ZQcmltYXJ5S2V5KCkgKXsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWMuc2V0R2VuZXJhdGVkKGdlbmVyYXRlQ29sdW1uKTsKKwkJCQkJYy5zZXRJbnNlcnRhYmxlKGdlbmVyYXRlQ29sdW1uKTsKKwkJCQkJYy5zZXRVcGRhdGVhYmxlKGdlbmVyYXRlQ29sdW1uKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlQXNzb2NpYXRpb25zTGlzdFBhbmVsKCkgeworCQkJT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyID0gZ2V0Q3VzdG9taXplcigpOworCQkJLy9JZiB1c2VyIGNoYW5nZWQgdGhlIGNvbm5lY3Rpb24gb3Igc2NoZW1hCisJCQlpZiggdGhpcy5jdXN0b21pemVyICE9IGN1c3RvbWl6ZXIgKXsKKwkJCQl0aGlzLmN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOyAKKwkJCX0KKwkJCUxpc3Q8QXNzb2NpYXRpb24+IGFzc29jaWF0aW9ucyA9IGN1c3RvbWl6ZXIuZ2V0QXNzb2NpYXRpb25zKCk7CisJCQl0aGlzLmFzc29jaWF0aW9uTGlzdC51cGRhdGVBc3NvY2lhdGlvbnMoIGFzc29jaWF0aW9ucyApOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCisJcHVibGljIHZvaWQgdXBkYXRlQXNzb2NpYXRpb25FZGl0UGFuZWwoQXNzb2NpYXRpb24gYXNzb2NpYXRpb24pIHsKKwkJdGhpcy5zZWxlY3RlZEFzc29jaWF0aW9uID0gYXNzb2NpYXRpb247CisKKwkJYm9vbGVhbiBlbmFibGVkID0gYXNzb2NpYXRpb24uaXNDdXN0b20oKTsKKwkJdGhpcy5kZWxldGVBc3NvY2lhdGlvbkxpbmsuc2V0RW5hYmxlZChlbmFibGVkKTsKKwkJCisJCS8vQ3JlYXRlIGFuZCBkaXNwbGF5IHRoZSBhc3NvY2lhdGlvbnNFZGl0UGFuZWwgaWYgaXQgd2FzIGhpZGRlbiBiZWZvcmUKKwkJaWYoIGFzc29jaWF0aW9uc0VkaXRQYW5lbCA9PSBudWxsICl7CisJCQlhc3NvY2lhdGlvbnNFZGl0UGFuZWwgPSB0aGlzLmNyZWF0ZUFzc29jaWF0aW9uc0VkaXRQYW5lbCh0aGlzLmRldGFpbFBhbmVsLCA0KTsKKwkJfQorCQl0aGlzLmRldGFpbFBhbmVsU3RhdGNrTGF5b3V0LnRvcENvbnRyb2wgPSBhc3NvY2lhdGlvbnNFZGl0UGFuZWw7CisJCXRoaXMuZGV0YWlsUGFuZWwubGF5b3V0KCk7CisJCXRoaXMuZGV0YWlsUGFuZWwuZ2V0UGFyZW50KCkubGF5b3V0KCk7CisKKwkJLy9VcGRhdGUgdGhlIFVJIGNvbnRyb2xzIGZyb20gdGhlIG1vZGVsCisJCVN0cmluZyB0YWJsZTFOYW1lID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKTsKKwkJU3RyaW5nIHRhYmxlMk5hbWUgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCk7CisJCVN0cmluZyBqb2luVGFibGVOYW1lID0gYXNzb2NpYXRpb24uZ2V0Sm9pblRhYmxlTmFtZSgpOworCQkKKwkJYm9vbGVhbiBpc0dlbmVyYXRlZCA9IGFzc29jaWF0aW9uLmlzR2VuZXJhdGVkKCk7CisJCXRoaXMuZ2VuZXJhdGVBc3NvY2lhdGlvbkNoZWNrQm94LnNldFNlbGVjdGlvbihpc0dlbmVyYXRlZCk7CisJCXRoaXMucmVmZXJyZXJSb2xlUHJvcGVydHlMYWJlbC5zZXRFbmFibGVkKCBpc0dlbmVyYXRlZCApOworCQl0aGlzLnJlZmVycmVyUm9sZVByb3BlcnR5RmllbGQuc2V0RW5hYmxlZCggaXNHZW5lcmF0ZWQgKTsKKwkJdGhpcy5yZWZlcnJlclJvbGVDaGVja0JveC5zZXRFbmFibGVkKCBpc0dlbmVyYXRlZCApOworCQl0aGlzLnJlZmVyZW5jZWRSb2xlUHJvcGVydHlMYWJlbC5zZXRFbmFibGVkKCBpc0dlbmVyYXRlZCApOworCQl0aGlzLnJlZmVyZW5jZWRSb2xlUHJvcGVydHlGaWVsZC5zZXRFbmFibGVkKCBpc0dlbmVyYXRlZCApOworCQl0aGlzLnJlZmVyZW5jZWRSb2xlQ2hlY2tCb3guc2V0RW5hYmxlZCggaXNHZW5lcmF0ZWQgKTsKKwkJdGhpcy5jYXJkaW5hbGl0eUxhYmVsLnNldEVuYWJsZWQoaXNHZW5lcmF0ZWQpOworCQl0aGlzLmNhcmRpbmFsaXR5Q29tYm8uc2V0RW5hYmxlZChpc0dlbmVyYXRlZCk7CisJCXRoaXMuam9pbkNvbmRpdGlvbkxhYmVsLnNldEVuYWJsZWQoIGlzR2VuZXJhdGVkICk7CisJCXRoaXMuam9pbkNvbmRpdGlvblRleHQuc2V0RW5hYmxlZCggaXNHZW5lcmF0ZWQgKTsKKwkJCisJCVN0cmluZyBjYXJkaW5hbGl0eSA9IGFzc29jaWF0aW9uLmdldENhcmRpbmFsaXR5KCk7CisJCWlmKCBBc3NvY2lhdGlvbi5NQU5ZX1RPX01BTlkuZXF1YWxzKCBjYXJkaW5hbGl0eSApICl7CisJCQljYXJkaW5hbGl0eUNvbWJvLnJlbW92ZUFsbCgpOworCQkJY2FyZGluYWxpdHlDb21iby5hZGQoIEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWSk7CisJCX1lbHNleworCQkJY2FyZGluYWxpdHlDb21iby5yZW1vdmVBbGwoKTsKKwkJCWNhcmRpbmFsaXR5Q29tYm8uYWRkKCBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORSk7CisJCQljYXJkaW5hbGl0eUNvbWJvLmFkZCggQXNzb2NpYXRpb24uT05FX1RPX09ORSk7CisJCX0KKwkJCisJCWNhcmRpbmFsaXR5Q29tYm8uc2V0VGV4dChjYXJkaW5hbGl0eSk7CisJCWNhcmRpbmFsaXR5Q29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKKwkJCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsKKwkJLy9pZiBNVE0KKwkJaWYoIEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWS5lcXVhbHMoIGNhcmRpbmFsaXR5ICkgKXsKKwkJCXRleHQgPSBTdHJpbmcuZm9ybWF0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3Jfc2V0UmVmLCB0YWJsZTJOYW1lLCB0YWJsZTFOYW1lKTsKKwkJfWVsc2V7CisJCQl0ZXh0ID0gU3RyaW5nLmZvcm1hdCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2VudGl0eVJlZiwgdGFibGUyTmFtZSwgdGFibGUxTmFtZSk7CisJCX0KKwkJdGhpcy5yZWZlcnJlclJvbGVDaGVja0JveC5zZXRUZXh0KHRleHQpOworCisJCS8vaWYgT1RPCisJCWlmKCBBc3NvY2lhdGlvbi5PTkVfVE9fT05FLmVxdWFscyggY2FyZGluYWxpdHkgKSApeworCQkJdGV4dCA9IFN0cmluZy5mb3JtYXQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9lbnRpdHlSZWYsIHRhYmxlMU5hbWUsIHRhYmxlMk5hbWUpOworCQl9ZWxzZXsKKwkJCXRleHQgPSBTdHJpbmcuZm9ybWF0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3Jfc2V0UmVmLCB0YWJsZTFOYW1lLCB0YWJsZTJOYW1lKTsKKwkJfQorCQl0aGlzLnJlZmVyZW5jZWRSb2xlQ2hlY2tCb3guc2V0VGV4dCh0ZXh0KTsKKworCQkvL0Fzc29jaWF0aW9uUm9sZSBwcm9wZXJ0aWVzCisJCUFzc29jaWF0aW9uUm9sZSByZWZlcnJlclJvbGUgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclJvbGUoKTsKKwkJaWYoIHJlZmVycmVyUm9sZSAhPSBudWxsKXsKKwkJCXRoaXMucmVmZXJyZXJSb2xlQ2hlY2tCb3guc2V0U2VsZWN0aW9uKCB0cnVlICk7CisJCQl0aGlzLnJlZmVycmVyUm9sZVByb3BlcnR5RmllbGQuc2V0RWRpdGFibGUodHJ1ZSk7CisJCQl0aGlzLnJlZmVycmVyUm9sZVByb3BlcnR5RmllbGQuc2V0VGV4dChyZWZlcnJlclJvbGUuZ2V0UHJvcGVydHlOYW1lKCkpOworCQkJdGhpcy5yZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuc2V0RW5hYmxlZCh0cnVlKTsKKwkJCVN0cmluZyBjYXNjYWRlID0gcmVmZXJyZXJSb2xlLmdldENhc2NhZGUoKTsKKwkJCWlmKCBjYXNjYWRlIT1udWxsICkgCisJCQkJdGhpcy5yZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuc2V0VGV4dCggY2FzY2FkZSApOworCQkJCisJCQkvL2lmIE1UTzogCisJCQlpZiggQXNzb2NpYXRpb24uTUFOWV9UT19PTkUuZXF1YWxzKCBjYXJkaW5hbGl0eSApICl7CisJCQkJdGhpcy5yZWZlcnJlclJvbGVDaGVja0JveC5zZXRFbmFibGVkKCBmYWxzZSApOworCQkJfQorCQl9ZWxzZXsKKwkJCXRoaXMucmVmZXJyZXJSb2xlQ2hlY2tCb3guc2V0U2VsZWN0aW9uKCBmYWxzZSApOworCQkJdGhpcy5yZWZlcnJlclJvbGVQcm9wZXJ0eUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOworCQkJdGhpcy5yZWZlcnJlclJvbGVQcm9wZXJ0eUZpZWxkLnNldEVkaXRhYmxlKGZhbHNlKTsKKwkJCXRoaXMucmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZC5zZXRUZXh0KCIiKTsKKwkJCXRoaXMucmVmZXJyZXJSb2xlQ2FzY2FkZUZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOworCQl9CisJCQorCQlBc3NvY2lhdGlvblJvbGUgcmVmZXJlbmNlZFJvbGUgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkUm9sZSgpOworCQlpZiggcmVmZXJlbmNlZFJvbGUgIT0gbnVsbCl7CisJCQl0aGlzLnJlZmVyZW5jZWRSb2xlQ2hlY2tCb3guc2V0U2VsZWN0aW9uKCB0cnVlICk7CisJCQl0aGlzLnJlZmVyZW5jZWRSb2xlUHJvcGVydHlMYWJlbC5zZXRFbmFibGVkKHRydWUpOworCQkJdGhpcy5yZWZlcmVuY2VkUm9sZVByb3BlcnR5RmllbGQuc2V0RWRpdGFibGUodHJ1ZSk7CisJCQl0aGlzLnJlZmVyZW5jZWRSb2xlUHJvcGVydHlGaWVsZC5zZXRUZXh0KHJlZmVyZW5jZWRSb2xlLmdldFByb3BlcnR5TmFtZSgpKTsKKwkJCXRoaXMucmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuc2V0RW5hYmxlZCh0cnVlKTsKKwkJCVN0cmluZyBjYXNjYWRlID0gcmVmZXJlbmNlZFJvbGUuZ2V0Q2FzY2FkZSgpOworCQkJaWYoIGNhc2NhZGUhPW51bGwgKSAKKwkJCQl0aGlzLnJlZmVyZW5jZWRSb2xlQ2FzY2FkZUZpZWxkLnNldFRleHQoY2FzY2FkZSk7CisJCX1lbHNleworCQkJdGhpcy5yZWZlcmVuY2VkUm9sZUNoZWNrQm94LnNldFNlbGVjdGlvbiggZmFsc2UgKTsKKwkJCXRoaXMucmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOworCQkJdGhpcy5yZWZlcmVuY2VkUm9sZVByb3BlcnR5RmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOworCQkJdGhpcy5yZWZlcmVuY2VkUm9sZVByb3BlcnR5RmllbGQuc2V0VGV4dCgiIik7CisJCQl0aGlzLnJlZmVyZW5jZWRSb2xlQ2FzY2FkZUZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOworCQl9CisJCQorCQkvL0pvaW4gY29uZGl0aW9ucworCQl1cGRhdGVKb2luQ29uZGl0aW9ucyhhc3NvY2lhdGlvbiwgdGFibGUxTmFtZSwgdGFibGUyTmFtZSwgam9pblRhYmxlTmFtZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUpvaW5Db25kaXRpb25zKEFzc29jaWF0aW9uIGFzc29jaWF0aW9uLAorCQkJU3RyaW5nIHRhYmxlMU5hbWUsIFN0cmluZyB0YWJsZTJOYW1lLCBTdHJpbmcgam9pblRhYmxlTmFtZSkgeworCQlTdHJpbmcgdGV4dCA9ICIlcyI7CisJCWlmKCBqb2luVGFibGVOYW1lID09IG51bGwgKXsKKwkJCVN0cmluZ0J1aWxkZXIgc3RyVGV4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQkvL3RleHQgPSBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3Jfam9pbmVkV2hlbjsKKwkJCUxpc3Q8U3RyaW5nPiBjb2x1bW5MaXN0MSA9IGFzc29jaWF0aW9uLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKSA7CisJCQlMaXN0PFN0cmluZz4gY29sdW1uTGlzdDIgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKTsKKwkJCWZvciggaW50IGk9MDsgaSA8IGNvbHVtbkxpc3QxLnNpemUoKTsgaSsrKXsKKwkJCQlzdHJUZXh0LmFwcGVuZCggdGFibGUxTmFtZSArICIuIiArIGNvbHVtbkxpc3QxLmdldChpKSApOy8vJE5PTi1OTFMtMSQKKwkJCQlzdHJUZXh0LmFwcGVuZCggIj0iICk7Ly8kTk9OLU5MUy0xJAorCQkJCXN0clRleHQuYXBwZW5kKCB0YWJsZTJOYW1lICsgIi4iICsgY29sdW1uTGlzdDIuZ2V0KGkpICk7Ly8kTk9OLU5MUy0xJAorCQkJCWlmKCBpIDwgY29sdW1uTGlzdDEuc2l6ZSgpLTEgKQorCQkJCQlzdHJUZXh0LmFwcGVuZCggIlxuIEFORCAiICk7Ly8kTk9OLU5MUy0xJAorCQkJfQorCQkJam9pbkNvbmRpdGlvblRleHQuc2V0VGV4dCggU3RyaW5nLmZvcm1hdCggdGV4dCAsIHN0clRleHQudG9TdHJpbmcoKSkgKTsgCisJCX1lbHNleworCQkJU3RyaW5nQnVpbGRlciBzdHJUZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCS8vdGV4dCA9IEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9qb2luZWRXaGVuOworCQkJTGlzdDxTdHJpbmc+IGNvbHVtbkxpc3QxID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpIDsKKwkJCUxpc3Q8U3RyaW5nPiBqb2luQ29sdW1uTGlzdDEgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlckpvaW5Db2x1bW5OYW1lcygpICA7CisJCQlmb3IoIGludCBpPTA7IGkgPCBjb2x1bW5MaXN0MS5zaXplKCk7IGkrKyl7CisJCQkJc3RyVGV4dC5hcHBlbmQoIHRhYmxlMU5hbWUgKyAiLiIgKyBjb2x1bW5MaXN0MS5nZXQoaSkgKTsvLyROT04tTkxTLTEkCisJCQkJc3RyVGV4dC5hcHBlbmQoICI9IiApOy8vJE5PTi1OTFMtMSQKKwkJCQlzdHJUZXh0LmFwcGVuZCggam9pblRhYmxlTmFtZSArICIuIiArIGpvaW5Db2x1bW5MaXN0MS5nZXQoaSkgKTsKKwkJCQlzdHJUZXh0LmFwcGVuZCggIlxuIEFORCAiICk7Ly8kTk9OLU5MUy0xJAorCQkJfQorCQkJCisJCQlMaXN0PFN0cmluZz4gam9pblRhYmxlQ29sdW1uTGlzdDIgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkSm9pbkNvbHVtbk5hbWVzKCk7CisJCQlMaXN0PFN0cmluZz4gY29sdW1uTGlzdDIgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKTsKKwkJCWZvciggaW50IGk9MDsgaSA8IGpvaW5UYWJsZUNvbHVtbkxpc3QyLnNpemUoKTsgaSsrKXsKKwkJCQlzdHJUZXh0LmFwcGVuZCggam9pblRhYmxlTmFtZSArICIuIiArIGpvaW5UYWJsZUNvbHVtbkxpc3QyLmdldChpKSApOworCQkJCXN0clRleHQuYXBwZW5kKCAiPSIgKTsvLyROT04tTkxTLTEkCisJCQkJc3RyVGV4dC5hcHBlbmQoIHRhYmxlMk5hbWUgKyAiLiIgKyBjb2x1bW5MaXN0Mi5nZXQoaSkgKTsvLyROT04tTkxTLTEkCisJCQkJaWYoIGkgPCBqb2luVGFibGVDb2x1bW5MaXN0Mi5zaXplKCktMSApCisJCQkJCXN0clRleHQuYXBwZW5kKCAiXG4gQU5EICIgKTsvLyROT04tTkxTLTEkCisJCQl9CisJCQkKKwkJCWpvaW5Db25kaXRpb25UZXh0LnNldFRleHQoIFN0cmluZy5mb3JtYXQoIHRleHQgLCBzdHJUZXh0LnRvU3RyaW5nKCkpICk7IAorCQkJCisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiBvbmUgb2YgcmVmZXJyZXJSb2xlQ2hlY2tCb3ggb3IgcmVmZXJlbmNlZFJvbGVDaGVja0JveCAKKwkgKiBjaGFuZ2VzIHZhbHVlLiAKKwkgKgorCSAqLworCXByaXZhdGUgdm9pZCBkaXJlY3Rpb25hbGl0eUNoZWNrQm94Q2hhbmdlZCgpIHsKKwkJU3RyaW5nIGRpcjsKKwkJaWYgKHJlZmVycmVyUm9sZUNoZWNrQm94LmdldFNlbGVjdGlvbigpKSB7CisJCQlkaXIgPSByZWZlcmVuY2VkUm9sZUNoZWNrQm94LmdldFNlbGVjdGlvbigpID8gQXNzb2NpYXRpb24uQklfREkgOiBBc3NvY2lhdGlvbi5OT1JNQUxfREk7CisJCX0gZWxzZSB7CisJCQlpZiAocmVmZXJlbmNlZFJvbGVDaGVja0JveC5nZXRTZWxlY3Rpb24oKSkgeworCQkJCWRpciA9IEFzc29jaWF0aW9uLk9QUE9TSVRFX0RJOworCQkJfSBlbHNlIHsKKwkJCQlkaXIgPSBudWxsOworCQkJfQorCQl9CisJCWlmIChkaXIgIT0gbnVsbCkgeworCQkJc2VsZWN0ZWRBc3NvY2lhdGlvbi5zZXREaXJlY3Rpb25hbGl0eShkaXIpOworCQl9IGVsc2UgeworCQkJc2VsZWN0ZWRBc3NvY2lhdGlvbi5zZXRHZW5lcmF0ZWQoZmFsc2UpOworCQl9CisJCQorCQl0aGlzLmFzc29jaWF0aW9uTGlzdC51cGRhdGVTZWxlY3RlZEFzc29jaWF0aW9uKCk7CisJfQkKKwkKKwlwcml2YXRlIE9STUdlbkN1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpeworCQlHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCB3aXphcmQgPSAoR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQpIHRoaXMuZ2V0V2l6YXJkKCk7CisJCXJldHVybiB3aXphcmQuZ2V0Q3VzdG9taXplcigpOworCX0KKwkKKwkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBwZXJmb3JtSGVscCgpIAorICAgIHsKKyAgICAgICAgdGhpcy5nZXRIZWxwU3lzdGVtKCkuZGlzcGxheUhlbHAoIEdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkLkhFTFBfQ09OVEVYVF9JRCApOworICAgIH0KKyAgICAKKwlwcm90ZWN0ZWQgZmluYWwgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gZ2V0SGVscFN5c3RlbSgpIHsKKwkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1RhYmxlRmlndXJlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUZpZ3VyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NDYyZjQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUZpZ3VyZS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuSW5zZXRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkltYWdlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKKworLyoqCisgKiBBIGRyYXcyRCBmaWd1cmUgcmVwcmVzZW50aW5nIGEgZGF0YWJhc2UgdGFibGUKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUYWJsZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7CisJICBwdWJsaWMgc3RhdGljIENvbG9yIHRhYmxlQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwyMjAsMjMyLDI0MSk7CisJICBwdWJsaWMgc3RhdGljIEZvbnQgdGFibGVGb250ID0gbmV3IEZvbnQobnVsbCwgIkFyaWFsIiwgOCwgU1dULk5PTkUpOworCSAgcHVibGljIHN0YXRpYyBDb2xvciBkaXNhYmxlZENvbG9yID0gQ29sb3JDb25zdGFudHMud2hpdGU7IAorCSAgcHVibGljIHN0YXRpYyBDb2xvciBib3JkZXJDb2xvciA9IG5ldyBDb2xvciggbnVsbCwgMTQsNjYsMTE1KTsKKwkgIAorCSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUTElORV9DT1JORVJfUkFESVVTID0gNjsgCisJICAKKwkgIHB1YmxpYyBUYWJsZUZpZ3VyZShTdHJpbmcgbmFtZSkgeworCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJZ2wubWFyZ2luSGVpZ2h0ID0gMjsKKwkJZ2wubWFyZ2luV2lkdGggPSAxMDsKKwkJc2V0TGF5b3V0TWFuYWdlcihnbCk7CisKKwkJc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKHRhYmxlQ29sb3IsMCkpOworCSAgICBzZXRCYWNrZ3JvdW5kQ29sb3IodGFibGVDb2xvcik7CisJICAgIHNldE9wYXF1ZSh0cnVlKTsKKwkgICAgc2V0U2l6ZSgxNTAsIDIwKTsKKwkJCisJCUxhYmVsIG5hbWVMYWJlbCA9IG5ldyBMYWJlbCgiIiwgSW1hZ2VSZXBvc2l0b3J5LmdldFRhYmxlT2JqSW1hZ2UoKSk7CisJCW5hbWVMYWJlbC5zZXRGb250KHRhYmxlRm9udCk7CisJCW5hbWVMYWJlbC5zZXRUZXh0KG5hbWUpOworCQluYW1lTGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGJvcmRlckNvbG9yKTsKKwkJbmFtZUxhYmVsLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUik7CisJICAgIGFkZChuYW1lTGFiZWwpOwkKKwkgIH0KKwkgIAorCXByb3RlY3RlZCB2b2lkIHBhaW50Q2xpZW50QXJlYShHcmFwaGljcyBncmFwaGljcykKKwl7CisJCXN1cGVyLnBhaW50Q2xpZW50QXJlYShncmFwaGljcyk7CisJCWdyYXBoaWNzLnB1c2hTdGF0ZSgpOworCQlSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpLmdldENvcHkoKTsKKwkJZ3JhcGhpY3MuZHJhd1JvdW5kUmVjdGFuZ2xlKHIuZXhwYW5kKG5ldyBJbnNldHMoLTEsIC0xLCAtMiwgLTIpKSwKKwkJCQlPVVRMSU5FX0NPUk5FUl9SQURJVVMsIE9VVExJTkVfQ09STkVSX1JBRElVUyApOwkJCQkJCisJCWdyYXBoaWNzLnBvcFN0YXRlKCk7CisJfQkgIAorCQorCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkICkgeworCQlzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQpOworCQlpZiggZW5hYmxlZCApeworCQkJc2V0QmFja2dyb3VuZENvbG9yKHRhYmxlQ29sb3IpOworCQl9ZWxzZXsKKwkJCXNldEJhY2tncm91bmRDb2xvcihkaXNhYmxlZENvbG9yKTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUdlblBhbmVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUdlblBhbmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNlZDUxYgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1RhYmxlR2VuUGFuZWwuamF2YQpAQCAtMCwwICsxLDQwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLk9STUdlblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcHRVaVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCisvKioKKyAqIFRoZSBVSSBwYW5lbCBmb3Igc2V0dGluZyB0aGUgZGVmYXVsdCBhbmQgc3BlY2lmaWMgCisgKiB0YWJsZSBlbnRpdHkgZ2VuZXJhdGlvbiBwcm9wZXJ0aWVzLgorICogCisgKi8KK2NsYXNzIFRhYmxlR2VuUGFuZWwKK3sKKwlXaXphcmRQYWdlIHdpemFyZFBhZ2UgOyAKKwkKKwlwcml2YXRlIFRleHQgY2xhc3NOYW1lRmllbGQ7IC8vIHVzZWQgaW4gc2V0dGluZyBpbmRpdmlkdWFsIHRhYmxlL2VudGl0eSBnZW5lcmF0aW9uIG9ubHkKKwkKKwlwcml2YXRlIENvbWJvIGlkR2VuZXJhdG9yQ29tYm87CisJcHJpdmF0ZSBUZXh0IHNlcXVlbmNlTmFtZUZpZWxkOworCQorCXByaXZhdGUgQnV0dG9uIGVudGl0eUFjY2Vzc0ZpZWxkOworCXByaXZhdGUgQnV0dG9uIGVudGl0eUFjY2Vzc1Byb3BlcnR5OworCXByaXZhdGUgQnV0dG9uIGFzc29jaWF0aW9uRmV0Y2hEZWZhdWx0OworCXByaXZhdGUgQnV0dG9uIGFzc29jaWF0aW9uRmV0Y2hFYWdlcjsKKwlwcml2YXRlIEJ1dHRvbiBhc3NvY2lhdGlvbkZldGNoTGF6eTsKKwkKKwlwcml2YXRlIEJ1dHRvbiBjb2xsZWN0aW9uVHlwZVNldDsKKwlwcml2YXRlIEJ1dHRvbiBjb2xsZWN0aW9uVHlwZUxpc3Q7CisJCisJcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVPcHRpb25hbEFubm90YXRpb25zOworCQorCXByaXZhdGUgTGFiZWwgc2VxdWVuY2VOYW1lTm90ZUxhYmVsOyAKKwkKKwlwcml2YXRlIGJvb2xlYW4gaXNVcGRhdGluZ0NvbnRyb2xzOworCQorCXByaXZhdGUgT1JNR2VuVGFibGUgbVRhYmxlOworCQorCXByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRUYWJsZSA9IGZhbHNlOworCQorCXByaXZhdGUgc3RhdGljIENvbG9yIE5PVEVfTEFCRUxfQ09MT1IgPSBuZXcgQ29sb3IoIERpc3BsYXkuZ2V0RGVmYXVsdCgpLCAxMDIsMTAyLDEwMik7CisJCisJcHVibGljIFRhYmxlR2VuUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbnMgLCBib29sZWFuIGlzRGVmYXVsdFRhYmxlLCBXaXphcmRQYWdlIHdpemFyZFBhZ2UgICApeworCQlzdXBlcigpOworCQl0aGlzLndpemFyZFBhZ2UgPSB3aXphcmRQYWdlOworCQl0aGlzLmlzRGVmYXVsdFRhYmxlID0gaXNEZWZhdWx0VGFibGU7CisJCWNyZWF0ZVRhYmxlTWFwcGluZ1Byb3BlcnRpZXNHcm91cChwYXJlbnQsIGNvbHVtbnMpOworCQlTV1RVdGlsLmNyZWF0ZUxhYmVsKHBhcmVudCwgNCwgIiIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlTWFwcGluZ1Byb3BlcnRpZXNHcm91cChDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1ucykgeworCQlHcm91cCBwYXJlbnQgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSApOworCQlwYXJlbnQuc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfdGFibGVNYXBwaW5nKTsKKwkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dChjb2x1bW5zLCBmYWxzZSkpOworCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5zOworCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CisJCWxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7CisJCXBhcmVudC5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOworCQkKKwkJY3JlYXRlQ2xhc3NOYW1lQ29udHJvbChwYXJlbnQsIGNvbHVtbnMpOworCQkKKwkJY3JlYXRlSWRHZW5lcmF0b3JDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOworCQljcmVhdGVFbnRpdHlBY2Nlc3NDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOworCQkKKwkJLy9Bc3NvY2lhdGlvbkZldGNoIGFuZCBDb2xsZWN0aW9uVHlwZSBvbmx5IGF2YWlsYWJsZSBmb3IgZGVmYXVsdCB0YWJsZSBnZW5lcmF0aW9uCisJCWlmICggaXNEZWZhdWx0VGFibGUgKSB7CisJCQljcmVhdGVBc3NvY2lhdGlvbkZldGNoQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKKwkJCWNyZWF0ZUNvbGxlY3Rpb25UeXBlQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKKwkJCWNyZWF0ZUdlbmVyYXRlT3B0aW9uYWxBbm5vdGF0aW9uQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlR2VuZXJhdGVPcHRpb25hbEFubm90YXRpb25Db250cm9scyhHcm91cCBwYXJlbnQsIGludCBjb2x1bW5zKSB7CisJCVNXVFV0aWwuY3JlYXRlTGFiZWwocGFyZW50LCAxLCAiIik7CisJCWdlbmVyYXRlT3B0aW9uYWxBbm5vdGF0aW9ucyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0sgKTsKKwkJZ2VuZXJhdGVPcHRpb25hbEFubm90YXRpb25zLnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2dlbk9wdGlvbmFsQW5ub3RhdGlvbnMpOworCQlnZW5lcmF0ZU9wdGlvbmFsQW5ub3RhdGlvbnMuc2V0VG9vbFRpcFRleHQoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZ2VuT3B0aW9uYWxBbm5vdGF0aW9uc19kZXNjKTsKKworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbnMtMTsKKwkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IDMgOworCQlnZW5lcmF0ZU9wdGlvbmFsQW5ub3RhdGlvbnMuc2V0TGF5b3V0RGF0YShnZCk7CisJCWdlbmVyYXRlT3B0aW9uYWxBbm5vdGF0aW9ucy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSBnZW5lcmF0ZU9wdGlvbmFsQW5ub3RhdGlvbnMuZ2V0U2VsZWN0aW9uKCk7CisJCQkJbVRhYmxlLnNldEdlbmVyYXRlRERMQW5ub3RhdGlvbnMoc2VsZWN0ZWQpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlQ2xhc3NOYW1lQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1ucykgeworCQkvL0N1c3RvbWl6ZSBjbGFzcyBuYW1lIGZvciBzcGVjaWZpYyB0YWJsZSBvbmx5CisJCWlmICggIWlzRGVmYXVsdFRhYmxlICkgeworCQkJU1dUVXRpbC5jcmVhdGVMYWJlbCggcGFyZW50LCAxICwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlUGFuZWxfY2xhc3NOYW1lICk7CisJCQkKKwkJCWNsYXNzTmFtZUZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiApOworCQkJLy9tUGFja2FnZU5hbWVGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7CisJCQlTV1RVdGlsLmZpbGxDb2x1bW5zKGNsYXNzTmFtZUZpZWxkLDMpOworCQkJY2xhc3NOYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7CisJCQkJQFN1cHByZXNzV2FybmluZ3MoeyAgImRlcHJlY2F0aW9uIiB9KQorCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCQlpZiAoZS5nZXRTb3VyY2UoKSA9PSBudWxsIHx8ICFpc1VwZGF0aW5nQ29udHJvbHMpIHsKKwkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjbGFzc05hbWVGaWVsZC5nZXRUZXh0KCk7CisJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUphdmFUeXBlTmFtZSggY2xhc3NOYW1lICk7CisJCQkJCQlpZiggIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpICl7CisJCQkJCQkJbVRhYmxlLnNldENsYXNzTmFtZSggIGNsYXNzTmFtZSApOworCQkJCQkJCXdpemFyZFBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG51bGwpOworCQkJCQkJfWVsc2V7CisJCQkJCQkJd2l6YXJkUGFnZS5zZXRFcnJvck1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CQkJCisJCQl9KTsKKwkJfQorCX0KKwkKKwljbGFzcyBBc3NvY2lhdGlvbkZldGNoTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcnsKKwkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CisJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCWlmICghaXNVcGRhdGluZ0NvbnRyb2xzKSB7CisJCQkJQnV0dG9uIHJhZGlvQnRuID0gKEJ1dHRvbillLmdldFNvdXJjZSgpOworCQkJCW1UYWJsZS5zZXREZWZhdWx0RmV0Y2goIHJhZGlvQnRuLmdldERhdGEoKS50b1N0cmluZygpKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVBc3NvY2lhdGlvbkZldGNoQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGNvbHVtbnMpIHsKKwkJU1dUVXRpbC5jcmVhdGVMYWJlbChjb21wb3NpdGUsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2ZldGNoICk7CisJCQorCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCXBhcmVudC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKKwkJU1dUVXRpbC5maWxsQ29sdW1ucyggcGFyZW50ICwgMyk7CisJCWFzc29jaWF0aW9uRmV0Y2hEZWZhdWx0CT0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuUkFESU8gKTsKKwkJYXNzb2NpYXRpb25GZXRjaERlZmF1bHQuc2V0VGV4dCggIkRlZmF1bHQiKTsKKwkJYXNzb2NpYXRpb25GZXRjaERlZmF1bHQuc2V0RGF0YSggT1JNR2VuVGFibGUuREVGQVVMVF9GRVRDSCApOwkKKwkJCisJCWFzc29jaWF0aW9uRmV0Y2hFYWdlciA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULlJBRElPICk7CisJCWFzc29jaWF0aW9uRmV0Y2hFYWdlci5zZXRUZXh0KCAiJkVhZ2VyIik7CisJCWFzc29jaWF0aW9uRmV0Y2hFYWdlci5zZXREYXRhKCBPUk1HZW5UYWJsZS5FQUdFUl9GRVRDSCApOworCisJCWFzc29jaWF0aW9uRmV0Y2hMYXp5ID0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuUkFESU8gKTsKKwkJYXNzb2NpYXRpb25GZXRjaExhenkuc2V0VGV4dCggIkxhJnp5Iik7CisJCWFzc29jaWF0aW9uRmV0Y2hMYXp5LnNldERhdGEoIE9STUdlblRhYmxlLkxBWllfRkVUQ0ggKTsKKwkJCisJCUFzc29jaWF0aW9uRmV0Y2hMaXN0ZW5lciBhc3NvY2lhdGlvbkZldGNoTGlzdGVuZXIgPSBuZXcgQXNzb2NpYXRpb25GZXRjaExpc3RlbmVyKCk7CisJCWFzc29jaWF0aW9uRmV0Y2hEZWZhdWx0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBhc3NvY2lhdGlvbkZldGNoTGlzdGVuZXIgKTsKKwkJYXNzb2NpYXRpb25GZXRjaExhenkuYWRkU2VsZWN0aW9uTGlzdGVuZXIoIGFzc29jaWF0aW9uRmV0Y2hMaXN0ZW5lciApOworCQlhc3NvY2lhdGlvbkZldGNoRWFnZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoIGFzc29jaWF0aW9uRmV0Y2hMaXN0ZW5lciApOworCX0KKworCWNsYXNzIENvbGxlY3Rpb25UeXBlTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7CisJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQorCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQlpZiAoIWlzVXBkYXRpbmdDb250cm9scykgeworCQkJCUJ1dHRvbiByYWRpb0J0biA9IChCdXR0b24pZS5nZXRTb3VyY2UoKTsKKwkJCQltVGFibGUuc2V0RGVmYXVsdENvbGxlY3Rpb25UeXBlKCByYWRpb0J0bi5nZXREYXRhKCkudG9TdHJpbmcoKSk7CisJCQl9CisJCX0KKwl9CQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVDb2xsZWN0aW9uVHlwZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5zKSB7CisJCVNXVFV0aWwuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9jb2xsVHlwZSApOworCQkKKwkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoIGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7CisJCVNXVFV0aWwuZmlsbENvbHVtbnMoIHBhcmVudCAsIDMpOworCQkKKwkJdGhpcy5jb2xsZWN0aW9uVHlwZVNldCA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULlJBRElPKTsKKwkJdGhpcy5jb2xsZWN0aW9uVHlwZVNldC5zZXRUZXh0KCAiamF2YS51dGlsLlNlJnQiKTsKKwkJdGhpcy5jb2xsZWN0aW9uVHlwZVNldC5zZXREYXRhKCBPUk1HZW5UYWJsZS5TRVRfQ09MTEVDVElPTl9UWVBFICk7CisJCXRoaXMuY29sbGVjdGlvblR5cGVMaXN0ID0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuUkFESU8pOworCQl0aGlzLmNvbGxlY3Rpb25UeXBlTGlzdC5zZXRUZXh0KCJqYXZhLnV0aWwuJkxpc3QiKTsKKwkJdGhpcy5jb2xsZWN0aW9uVHlwZUxpc3Quc2V0RGF0YShPUk1HZW5UYWJsZS5MSVNUX0NPTExFQ1RJT05fVFlQRSk7IAorCQkKKwkJQ29sbGVjdGlvblR5cGVMaXN0ZW5lciBjb2xsZWN0aW9uVHlwZUxpc3RlbmVyID0gbmV3IENvbGxlY3Rpb25UeXBlTGlzdGVuZXIoKTsKKwkJY29sbGVjdGlvblR5cGVMaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBjb2xsZWN0aW9uVHlwZUxpc3RlbmVyICk7CisJCWNvbGxlY3Rpb25UeXBlU2V0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBjb2xsZWN0aW9uVHlwZUxpc3RlbmVyICk7CisJfQorCisKKwlwdWJsaWMgdm9pZCBzZXRPUk1HZW5UYWJsZShPUk1HZW5UYWJsZSB0YWJsZSkgeworCQltVGFibGUgPSB0YWJsZTsKKwkJCisJCWlzVXBkYXRpbmdDb250cm9scyA9IHRydWU7CisJCQkJCisJCXRyeSB7CisJCQkvL0NsYXNzTmFtZUZpZWxkIGlzIG5vdCBhdmFpbGFibGUgZm9yIGRlZmF1bHQgdGFibGUKKwkJCWlmKGNsYXNzTmFtZUZpZWxkIT0gbnVsbCApCisJCQkJY2xhc3NOYW1lRmllbGQuc2V0VGV4dCggbVRhYmxlLmdldENsYXNzTmFtZSgpICk7CisJCQkKKwkJCWZpbmFsIExpc3Q8U3RyaW5nPiBzY2hlbWVzID0gdGhpcy5tVGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEFsbElkR2VuZXJhdG9ycygpOworCQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tzY2hlbWVzLnNpemUoKV07CisJCQlzY2hlbWVzLnRvQXJyYXkodmFsdWVzKTsKKwkJCWlkR2VuZXJhdG9yQ29tYm8uc2V0SXRlbXMoIHZhbHVlcyApOworCQkJU3RyaW5nIGlkR2VuZXJhdG9yID0gbVRhYmxlLmdldElkR2VuZXJhdG9yKCk7CisJCQlpZEdlbmVyYXRvckNvbWJvLnNldFRleHQoIGlkR2VuZXJhdG9yKTsKKwkJCQorCQkJYm9vbGVhbiBpc1NlcXVlbmNlID0gdGhpcy5tVGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNlcXVlbmNlSWRHZW5lcmF0b3JzKCkuY29udGFpbnMoaWRHZW5lcmF0b3IpOwkJCisJCQlTdHJpbmcgc2VxdWVuY2VOYW1lID0gbVRhYmxlLmlzRGVmYXVsdHNUYWJsZSgpID8gbVRhYmxlLmdldFNlcXVlbmNlKCkgOiBtVGFibGUuZ2V0Rm9ybWF0dGVkU2VxdWVuY2UoKTsKKwkJCXNlcXVlbmNlTmFtZSAgPSAoIHNlcXVlbmNlTmFtZSA9PSBudWxsID8gIiIgOiBzZXF1ZW5jZU5hbWUgKTsgCisJCQlzZXF1ZW5jZU5hbWVGaWVsZC5zZXRUZXh0KCBzZXF1ZW5jZU5hbWUgKTsKKwkJCWlmICggaXNTZXF1ZW5jZSApIHsKKwkJCQlzZXF1ZW5jZU5hbWVGaWVsZC5zZXRFbmFibGVkKHRydWUpOworCQkJCXNlcXVlbmNlTmFtZU5vdGVMYWJlbC5zZXRFbmFibGVkKHRydWUpOworCQkJfSBlbHNlIHsKKwkJCQlzZXF1ZW5jZU5hbWVGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQlzZXF1ZW5jZU5hbWVOb3RlTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7CisJCQl9CisJCQkKKwkJCVN0cmluZyBhY2Nlc3MgPSBtVGFibGUuZ2V0QWNjZXNzKCkgOworCQkJaWYgKCAgT1JNR2VuVGFibGUuRklFTERfQUNDRVNTLmVxdWFscyggYWNjZXNzICkgKSB7CisJCQkJdGhpcy5lbnRpdHlBY2Nlc3NGaWVsZC5zZXRTZWxlY3Rpb24oIHRydWUgKTsKKwkJCQl0aGlzLmVudGl0eUFjY2Vzc1Byb3BlcnR5LnNldFNlbGVjdGlvbiggZmFsc2UgKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5lbnRpdHlBY2Nlc3NQcm9wZXJ0eS5zZXRTZWxlY3Rpb24oIHRydWUgKTsKKwkJCQl0aGlzLmVudGl0eUFjY2Vzc0ZpZWxkLnNldFNlbGVjdGlvbiggZmFsc2UgKTsKKwkJCX0KKwkKKwkJCWlmIChhc3NvY2lhdGlvbkZldGNoTGF6eSAhPSBudWxsICYmIGFzc29jaWF0aW9uRmV0Y2hFYWdlciAhPSBudWxsICkgeworCQkJCVN0cmluZyBkZWZhdWx0RmV0Y2ggPSBtVGFibGUuZ2V0RGVmYXVsdEZldGNoKCk7CisJCQkJLy9yZXNldCBhbGwgdGhyZWUgYnV0dG9ucworCQkJCWFzc29jaWF0aW9uRmV0Y2hEZWZhdWx0LnNldFNlbGVjdGlvbihmYWxzZSk7CisJCQkJYXNzb2NpYXRpb25GZXRjaEVhZ2VyLnNldFNlbGVjdGlvbihmYWxzZSk7CisJCQkJYXNzb2NpYXRpb25GZXRjaExhenkuc2V0U2VsZWN0aW9uKGZhbHNlKTsKKwkJCQlpZiggT1JNR2VuVGFibGUuREVGQVVMVF9GRVRDSC5lcXVhbHMoIGRlZmF1bHRGZXRjaCApICkKKwkJCQkJYXNzb2NpYXRpb25GZXRjaERlZmF1bHQuc2V0U2VsZWN0aW9uKHRydWUpOworCQkJCWVsc2UgaWYoIE9STUdlblRhYmxlLkVBR0VSX0ZFVENILmVxdWFscyggZGVmYXVsdEZldGNoICkgKQorCQkJCQlhc3NvY2lhdGlvbkZldGNoRWFnZXIuc2V0U2VsZWN0aW9uKHRydWUpOworCQkJCWVsc2UKKwkJCQkJYXNzb2NpYXRpb25GZXRjaExhenkuc2V0U2VsZWN0aW9uKHRydWUpOworCQkJfQorCQkJCisJCQkvL0RlZmF1bHRUYWJsZSBvbmx5CisJCQlpZiAoY29sbGVjdGlvblR5cGVMaXN0ICE9IG51bGwpIHsKKwkJCQlTdHJpbmcgY1R5cGUgPSBtVGFibGUuZ2V0RGVmYXVsdENvbGxlY3Rpb25UeXBlKCk7CisJCQkJaWYgKCBPUk1HZW5UYWJsZS5MSVNUX0NPTExFQ1RJT05fVFlQRS5lcXVhbHMoIGNUeXBlICkgKSB7CisJCQkJCXRoaXMuY29sbGVjdGlvblR5cGVMaXN0LnNldFNlbGVjdGlvbiggdHJ1ZSApOworCQkJCQl0aGlzLmNvbGxlY3Rpb25UeXBlU2V0LnNldFNlbGVjdGlvbiggZmFsc2UgKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0aGlzLmNvbGxlY3Rpb25UeXBlU2V0LnNldFNlbGVjdGlvbiggdHJ1ZSApOworCQkJCQl0aGlzLmNvbGxlY3Rpb25UeXBlTGlzdC5zZXRTZWxlY3Rpb24oIGZhbHNlICk7CisJCQkJfQorCQkJCQorCQkJCXRoaXMuZ2VuZXJhdGVPcHRpb25hbEFubm90YXRpb25zLnNldFNlbGVjdGlvbiggbVRhYmxlLmlzR2VuZXJhdGVERExBbm5vdGF0aW9ucygpKTsKKwkJCX0KKwkJCQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJSnB0VWlQbHVnaW4ubG9nKGUpOworCQl9CisJCQorCQlpc1VwZGF0aW5nQ29udHJvbHMgPSBmYWxzZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlSWRHZW5lcmF0b3JDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1ucykgeworCQlTV1RVdGlsLmNyZWF0ZUxhYmVsKHBhcmVudCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2Vfa2V5R2VuICk7CisKKwkJaWRHZW5lcmF0b3JDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOworCQlTV1RVdGlsLmZpbGxDb2x1bW5zKGlkR2VuZXJhdG9yQ29tYm8sIDMpOworCQkKKwkJaWRHZW5lcmF0b3JDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CisKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlpZiAoaXNVcGRhdGluZ0NvbnRyb2xzKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJCisJCQkJaWRHZW5DaGFuZ2VkKCk7CisJCQl9fSk7CisKKwkJU1dUVXRpbC5jcmVhdGVMYWJlbChwYXJlbnQsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3NlcXVlbmNlICk7CisJCXNlcXVlbmNlTmFtZUZpZWxkID0gbmV3IFRleHQoIHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgKTsKKwkJCisJCVNXVFV0aWwuZmlsbENvbHVtbnMoc2VxdWVuY2VOYW1lRmllbGQsIDMpOworCQlzZXF1ZW5jZU5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKKwkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCWlmIChlLmdldFNvdXJjZSgpID09IG51bGwgfHwgIWlzVXBkYXRpbmdDb250cm9scykgeworCisJCQkJCWlmICggaWRHZW5lcmF0b3JDb21iby5nZXRUZXh0KCkuZXF1YWxzKCJzZXF1ZW5jZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCVN0cmluZyBzZXF1ZW5jZU5hbWUgPSBzZXF1ZW5jZU5hbWVGaWVsZC5nZXRUZXh0KCk7CisJCQkJCQlpZiAoIHNlcXVlbmNlTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIiR0YWJsZSIpID49IDAgfHwgIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJc2VxdWVuY2VOYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiJHBrIikgPj0gMCApIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCXNlcXVlbmNlTmFtZSA9IGNvbnZlcnRWYXJUb0xvd2VyQ2FzZSgiJHRhYmxlIiwgc2VxdWVuY2VOYW1lKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCXNlcXVlbmNlTmFtZSA9IGNvbnZlcnRWYXJUb0xvd2VyQ2FzZSgiJHBrIiwgc2VxdWVuY2VOYW1lKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQorCQkJCQkJaWYgKCBzZXF1ZW5jZU5hbWUudHJpbSgpLmxlbmd0aCgpICE9IDAgKSB7CisJCQkJCQkJbVRhYmxlLnNldFNlcXVlbmNlKCBzZXF1ZW5jZU5hbWUgKTsKKwkJCQkJCX0gZWxzZXsKKwkJCQkJCQltVGFibGUuc2V0U2VxdWVuY2UoICIiICk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJcHJpdmF0ZSBTdHJpbmcgY29udmVydFZhclRvTG93ZXJDYXNlKFN0cmluZyB2YXIsIFN0cmluZyBzZXF1ZW5jZU5hbWUpIHsKKwkJCQlpbnQgbiA9IHNlcXVlbmNlTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIHZhciApOworCQkJCWlmKCBuPT0wICkgeworCQkJCQlyZXR1cm4gdmFyICsgc2VxdWVuY2VOYW1lLnN1YnN0cmluZyggdmFyLmxlbmd0aCgpKTsKKwkJCQl9IGVsc2UgaWYoIG4gPjAgKSB7CisJCQkJCXJldHVybiBzZXF1ZW5jZU5hbWUuc3Vic3RyaW5nKDAsbikgKyB2YXIgKyBzZXF1ZW5jZU5hbWUuc3Vic3RyaW5nKCBuICsgdmFyLmxlbmd0aCgpKTsKKwkJCQl9CisJCQkJcmV0dXJuIHNlcXVlbmNlTmFtZTsKKwkJCX0JCQkKKwkJfSk7CisJCQorCQlTV1RVdGlsLm5ld0xhYmVsKHBhcmVudCwgIiIpOy8vJE5PTi1OTFMtMSQKKwkJc2VxdWVuY2VOYW1lTm90ZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOworCQlTdHJpbmcgdGV4dCA9U3RyaW5nLmZvcm1hdCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2Vfc2VxdWVuY2VOb3RlLCAKKwkJCQlPUk1HZW5UYWJsZS5UQUJMRV9TRVFfUEFUVEVSTiwgT1JNR2VuVGFibGUuUEtfU0VRX1BBVFRFUk4pOworCQlzZXF1ZW5jZU5hbWVOb3RlTGFiZWwuc2V0VGV4dCggdGV4dCApIDsKKwkJc2VxdWVuY2VOYW1lTm90ZUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOworCQlTV1RVdGlsLmZpbGxDb2x1bW5zKCBzZXF1ZW5jZU5hbWVOb3RlTGFiZWwsIDMpOworCX0KKworCXByaXZhdGUgdm9pZCBpZEdlbkNoYW5nZWQoKSB7CisJCVN0cmluZyBzY2hlbWUgPSBpZEdlbmVyYXRvckNvbWJvLmdldFRleHQoKTsKKwkJbVRhYmxlLnNldElkR2VuZXJhdG9yKHNjaGVtZSk7CisJCQorCQlib29sZWFuIGlzU2VxdWVuY2UgPSB0aGlzLm1UYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U2VxdWVuY2VJZEdlbmVyYXRvcnMoKS5jb250YWlucyhzY2hlbWUpOwkJCisJCWlmICghaXNTZXF1ZW5jZSkgeworCQkJc2VxdWVuY2VOYW1lRmllbGQuc2V0VGV4dCgiIik7CisJCQlzZXF1ZW5jZU5hbWVGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCW1UYWJsZS5zZXRTZXF1ZW5jZShudWxsKTsKKwkJCXNlcXVlbmNlTmFtZU5vdGVMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCXNlcXVlbmNlTmFtZUZpZWxkLnNldEVuYWJsZWQodHJ1ZSk7CisJCQlzZXF1ZW5jZU5hbWVOb3RlTGFiZWwuc2V0Rm9yZWdyb3VuZCggTk9URV9MQUJFTF9DT0xPUiApOworCQkJc2VxdWVuY2VOYW1lTm90ZUxhYmVsLnNldEVuYWJsZWQodHJ1ZSk7CisJCQlpZiAoIHNlcXVlbmNlTmFtZUZpZWxkLmdldFRleHQoKS5sZW5ndGgoKT09MCApIHsKKwkJCQlTdHJpbmcgbmV3TWVzc2FnZSA9ICJQbGVhc2Ugc3BlY2lmeSBhIHNlcXVlbmNlIG5hbWUiOworCQkJCXRoaXMud2l6YXJkUGFnZS5zZXRNZXNzYWdlKG5ld01lc3NhZ2UpOworCQkJCXRoaXMud2l6YXJkUGFnZS5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMud2l6YXJkUGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7CisJCQkJdGhpcy53aXphcmRQYWdlLnNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKKwkJCX0KKwkJfQorCX0KKwkKKwljbGFzcyBFbnRpdHlBY2Nlc3NGZXRjaExpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXJ7CisJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQorCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQlpZiAoIWlzVXBkYXRpbmdDb250cm9scykgeworCQkJCUJ1dHRvbiByYWRpb0J0biA9IChCdXR0b24pZS5nZXRTb3VyY2UoKTsKKwkJCQltVGFibGUuc2V0QWNjZXNzKCByYWRpb0J0bi5nZXREYXRhKCkudG9TdHJpbmcoKSApOworCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBY2Nlc3NDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1ucykgeworCQlTV1RVdGlsLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfYWNjZXNzICk7CisJCQorCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCVNXVFV0aWwuZmlsbENvbHVtbnMoIHBhcmVudCAsIDMpOworCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7CisKKwkJZW50aXR5QWNjZXNzRmllbGQgPSBuZXcgQnV0dG9uKCBwYXJlbnQsIFNXVC5SQURJTyApOworCQllbnRpdHlBY2Nlc3NGaWVsZC5zZXRUZXh0KCAiJkZpZWxkIiApOyAvLyROT04tTkxTMSQKKwkJZW50aXR5QWNjZXNzRmllbGQuc2V0RGF0YSggT1JNR2VuVGFibGUuRklFTERfQUNDRVNTKTsKKworCQllbnRpdHlBY2Nlc3NQcm9wZXJ0eSA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULlJBRElPICk7CisJCWVudGl0eUFjY2Vzc1Byb3BlcnR5LnNldFRleHQoICAiJlByb3BlcnR5IiApOy8vJE5PTi1OTFMxJAorCQllbnRpdHlBY2Nlc3NQcm9wZXJ0eS5zZXREYXRhKCBPUk1HZW5UYWJsZS5QUk9QRVJUWV9BQ0NFU1MgKTsKKwkJCisJCUVudGl0eUFjY2Vzc0ZldGNoTGlzdGVuZXIgZW50aXR5QWNjZXNzRmV0Y2hMaXN0ZW5lciA9IG5ldyBFbnRpdHlBY2Nlc3NGZXRjaExpc3RlbmVyKCk7CisJCWVudGl0eUFjY2Vzc0ZpZWxkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBlbnRpdHlBY2Nlc3NGZXRjaExpc3RlbmVyICk7CisJCWVudGl0eUFjY2Vzc1Byb3BlcnR5LmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBlbnRpdHlBY2Nlc3NGZXRjaExpc3RlbmVyICk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vVGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25XaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvbldpemFyZFBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTNhNTI4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vVGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25XaXphcmRQYWdlLmphdmEKQEAgLTAsMCArMSwzNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmRpYWxvZ2ZpZWxkcy5MYXlvdXRVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld1R5cGVXaXphcmRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuT1JNR2VuQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuT1JNR2VuQ3VzdG9taXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLk9STUdlblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwudXRpbC5EVFBVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JbWFnZVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07CisKK3B1YmxpYyBjbGFzcyBUYWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBOZXdUeXBlV2l6YXJkUGFnZSB7CisKKwlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKKworCXByaXZhdGUgVHJlZVZpZXdlciB0YWJsZUNvbHVtblRyZWVWaWV3ZXI7CisJCisJcHJpdmF0ZSBDb21wb3NpdGUgZGV0YWlsUGFuZWwgOworCXByaXZhdGUgU3RhY2tMYXlvdXQgZGV0YWlsUGFuZWxTdGF0Y2tMYXlvdXQ7CisJcHJpdmF0ZSBDb21wb3NpdGUgdGFibGVHZW5EZXRhdGlsR3JvdXA7CisJcHJpdmF0ZSBDb2x1bW5HZW5QYW5lbCBjb2x1bW5HZW5QYW5lbDsKKwlwcml2YXRlIENvbXBvc2l0ZSBjb2x1bW5HZW5EZXRhdGlsR3JvdXA7CisJcHJpdmF0ZSBUYWJsZUdlblBhbmVsIHRhYmxlR2VuUGFuZWw7CisJcHJpdmF0ZSBPUk1HZW5UYWJsZSBzZWxlY3RlZFRhYmxlOworCQorCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyOworCQorCXByb3RlY3RlZCBUYWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvbldpemFyZFBhZ2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0ICkgeworCQlzdXBlcih0cnVlLCAiVGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25XaXphcmRQYWdlIik7IC8vJE5PTi1OTFMtMSQKKwkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKKwkJc2V0VGl0bGUoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZXNBbmRDb2x1bW5zUGFnZV90aXRsZSApOworCQlzZXRNZXNzYWdlKCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVzQW5kQ29sdW1uc1BhZ2VfZGVzYyk7CisJfQorCisJLy8gLS0tLS0tLS0gSW5pdGlhbGl6YXRpb24gLS0tLS0tLS0tCisJLyoqCisJICogVGhlIHdpemFyZCBvd25pbmcgdGhpcyBwYWdlIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGggdGhlCisJICogY3VycmVudCBzZWxlY3Rpb24uIFRoZSBzZWxlY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMgb2YgdGhlIHdpemFyZCAKKwkgKiBwYWdlLgorCSAqIAorCSAqIEBwYXJhbSBzZWxlY3Rpb24gdXNlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMKKwkgKi8KKwl2b2lkIGluaXQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWlmICgganBhUHJvamVjdCAhPSBudWxsICkgeworCQkJSUphdmFFbGVtZW50IGplbGVtID0gdGhpcy5qcGFQcm9qZWN0LmdldEphdmFQcm9qZWN0KCk7CisJCQlpbml0Q29udGFpbmVyUGFnZShqZWxlbSk7CisJCQlpbml0VHlwZVBhZ2UoamVsZW0pOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7CisJCWludCBuQ29sdW1ucz0gMQk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKKwkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCQl0aGlzLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX0NVU1RPTUlaRV9JTkRJVklEVUFMX0VOVElUSUVTKTsKKworCQljcmVhdGVUYWJsZUFuZENvbHVtbnNMaXN0UGFuZWwoY29tcG9zaXRlLCAxKTsKKwkJCisJCVNXVFV0aWwuY3JlYXRlTGFiZWwoIGNvbXBvc2l0ZSwgMSwgIiIpOyAvLyROT04tTkxTLTEkCisKKwkJU1dUVXRpbC5jcmVhdGVTZXBhcmF0b3IoY29tcG9zaXRlLCAxKTsKKwkJCisJCWNyZWF0ZUdlbmVyYXRlRGV0YWlsR3JvdXAoY29tcG9zaXRlLCAxKTsKKworCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7CisJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKCB0cnVlICk7CisJfQorCQorCS8qKgorCSAqIEEgcGFuZWwgd2l0aCBKRmFjZSBUcmVlVmlld2VyIHNob3dpbmcgdGFibGVzIGFuZCBjb2x1bW5zIHRvIGJlIGdlbmVyYXRlZCBpbnRvIEpQQSBlbnRpdGllcworCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQKKwkgKiBAcGFyYW0gY29sdW1ucworCSAqLworCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZUFuZENvbHVtbnNMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbnMpIHsKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBjb2x1bW5zICk7CisJCWxhYmVsLnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZXNBbmRDb2x1bW5zUGFnZV9sYWJlbFRhYmxlQW5kQ29sdW1ucyApOworCQlTV1RVdGlsLmZpbGxDb2x1bW5zKCBsYWJlbCAsIGNvbHVtbnMpOworCQkKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gY29sdW1uczsKKwkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJZGF0YS5oZWlnaHRIaW50ID0gMjAwOworCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKKwkJCisJCXRhYmxlQ29sdW1uVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCk7CisJCXRhYmxlQ29sdW1uVHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YSggZGF0YSk7CQkKKwkJdGFibGVDb2x1bW5UcmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGFibGVDb2x1bW5UcmVlQ29udGVudFByb3ZpZGVyKCkpOworCQl0YWJsZUNvbHVtblRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGFibGVDb2x1bW5UcmVlTGFiZWxQcm92aWRlcigpKTsKKwkJCisJCXRhYmxlQ29sdW1uVHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCl7CisJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCXVwZGF0ZURldGFpbFBhbmVsKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKKwkJCX0KKworCQl9KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOworCQlpZih2aXNpYmxlKXsKKwkJCU9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciA9IGdldEN1c3RvbWl6ZXIoKTsKKwkJCS8vSWYgdXNlciBjaGFuZ2VkIHRoZSBjb25uZWN0aW9uIG9yIHNjaGVtYQorCQkJaWYoIHRoaXMuY3VzdG9taXplciAhPSBjdXN0b21pemVyICl7CisJCQkJdGhpcy5jdXN0b21pemVyID0gY3VzdG9taXplcjsgCisJCQkJdGFibGVDb2x1bW5UcmVlVmlld2VyLnNldElucHV0KCBjdXN0b21pemVyICk7CisJCQl9ZWxzZXsKKwkJCQl0YWJsZUNvbHVtblRyZWVWaWV3ZXIucmVmcmVzaCgpOworCQkJfQorCQkJTGlzdDxTdHJpbmc+IHRhYmxlTmFtZXMgPSB0aGlzLmN1c3RvbWl6ZXIuZ2V0VGFibGVOYW1lcygpOworCQkJCisJCQkvL1NlbGVjdCB0aGUgZmlyc3QgdGFibGUKKwkJCU9STUdlblRhYmxlIG9ybUdlblRhYmxlID0gdGhpcy5jdXN0b21pemVyLmdldFRhYmxlKHRhYmxlTmFtZXMuZ2V0KDApKTsKKwkJCXVwZGF0ZVRhYmVsR2VuRGV0YWlsKCBvcm1HZW5UYWJsZSApOworCQl9CisJfQorCisKKwlwcml2YXRlIHZvaWQgdXBkYXRlRGV0YWlsUGFuZWwoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJVHJlZVNlbGVjdGlvbiB0cyA9IChUcmVlU2VsZWN0aW9uKXNlbGVjdGlvbjsKKwkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gdHMuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCWlmKCBzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIE9STUdlblRhYmxlICl7CisJCQl1cGRhdGVUYWJlbEdlbkRldGFpbCggKE9STUdlblRhYmxlKXNlbGVjdGVkT2JqZWN0ICk7CisJCX1lbHNlIGlmKCBzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIE9STUdlbkNvbHVtbiApeworCQkJdXBkYXRlQ29sdW1uR2VuRGV0YWlsKCAoT1JNR2VuQ29sdW1uKXNlbGVjdGVkT2JqZWN0ICk7CisJCX0KKwl9CQkJCisJCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbHVtbkdlbkRldGFpbChPUk1HZW5Db2x1bW4gY29sdW1uKSB7CisJCWlmKGNvbHVtbkdlbkRldGF0aWxHcm91cD09bnVsbCl7CisJCQljb2x1bW5HZW5EZXRhdGlsR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGRldGFpbFBhbmVsLCBTV1QuTk9ORSk7CisJCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gNDsKKwkJCWNvbHVtbkdlbkRldGF0aWxHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7CisJCQl0aGlzLmNvbHVtbkdlblBhbmVsID0gbmV3IENvbHVtbkdlblBhbmVsKGNvbHVtbkdlbkRldGF0aWxHcm91cCwgNCwgZ2V0Q3VzdG9taXplcigpICwgdGhpcyApOworCQl9CisJCWNvbHVtbkdlblBhbmVsLnNldENvbHVtbihjb2x1bW4pOworCQl0aGlzLmRldGFpbFBhbmVsU3RhdGNrTGF5b3V0LnRvcENvbnRyb2wgPSBjb2x1bW5HZW5EZXRhdGlsR3JvdXA7CisJCXRoaXMuZGV0YWlsUGFuZWwubGF5b3V0KCk7CQkKKwkJZGV0YWlsUGFuZWwuZ2V0UGFyZW50KCkubGF5b3V0KCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhYmVsR2VuRGV0YWlsKE9STUdlblRhYmxlIHRhYmxlKSB7CisJCXRoaXMuc2VsZWN0ZWRUYWJsZSA9IHRhYmxlOworCQlpZih0YWJsZUdlbkRldGF0aWxHcm91cD09bnVsbCl7CisJCQl0YWJsZUdlbkRldGF0aWxHcm91cCA9IG5ldyBDb21wb3NpdGUoZGV0YWlsUGFuZWwsIFNXVC5OT05FKTsKKwkJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA0OworCQkJdGFibGVHZW5EZXRhdGlsR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOworCQkJCisJCQl0aGlzLnRhYmxlR2VuUGFuZWwgPSBuZXcgVGFibGVHZW5QYW5lbCh0YWJsZUdlbkRldGF0aWxHcm91cCwgNCAsIGZhbHNlLCB0aGlzICk7CisJCQljcmVhdGVEb21haW5KYXZhQ2xhc3Nlc1Byb3BlcnRpZXNHcm91cCh0YWJsZUdlbkRldGF0aWxHcm91cCwgNCApOworCQl9CisJCXRhYmxlR2VuUGFuZWwuc2V0T1JNR2VuVGFibGUodGFibGUpOworCQkKKwkJdGhpcy5kZXRhaWxQYW5lbFN0YXRja0xheW91dC50b3BDb250cm9sID0gdGFibGVHZW5EZXRhdGlsR3JvdXA7CisJCXRoaXMuZGV0YWlsUGFuZWwubGF5b3V0KCk7CQkKKworCQlTdHJpbmcgYmFzZUNsYXNzID0gdGFibGUuZ2V0RXh0ZW5kcygpOworCQlpZiggYmFzZUNsYXNzIT0gbnVsbCApCisJCQlzZXRTdXBlckNsYXNzKGJhc2VDbGFzcywgdHJ1ZSk7CisJCQorCQlzZXRTdXBlckludGVyZmFjZXMoIHRhYmxlLmdldEltcGxlbWVudHMoKSwgdHJ1ZSk7CisJCQorCQlkZXRhaWxQYW5lbC5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRG9tYWluSmF2YUNsYXNzZXNQcm9wZXJ0aWVzR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGNvbHVtbnMpIHsKKwkJR3JvdXAgcGFyZW50ID0gbmV3IEdyb3VwKCBjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJcGFyZW50LnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2RvbWFpbkphdmFDbGFzcyApOworCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KGNvbHVtbnMsIGZhbHNlKSk7CisJCVNXVFV0aWwuZmlsbENvbHVtbnMoIHBhcmVudCwgY29sdW1ucyk7CisKKwkJY3JlYXRlU3VwZXJDbGFzc0NvbnRyb2xzKHBhcmVudCwgY29sdW1ucyk7CisJCWNyZWF0ZVN1cGVySW50ZXJmYWNlc0NvbnRyb2xzKHBhcmVudCwgY29sdW1ucyk7CisKKwkJLy9SZXNpemUgc3VwcGVyIGNsYXNzIHRleHQgd2lkdGggdG8gZmlsbCB0aGUgcGFyZW50IGdyb3VwLgorCQkvL0hhdmUgdG8gZG8gaXQgaW5kaXJlY3RseSBzaW5jZSBmU3VwZXJDbGFzc0RpYWxvZ0ZpZWxkIGlzIHByaXZhdGUgaW4gc3VwZXIgY2xhc3MuCisJCUNvbnRyb2xbXSBjb250cm9scyA9IHBhcmVudC5nZXRDaGlsZHJlbigpOworCQlpZiggY29udHJvbHMubGVuZ3RoPjEgJiYgY29udHJvbHNbMV0gaW5zdGFuY2VvZiBUZXh0ICl7CisJCQlUZXh0IHRleHQgPSAoVGV4dCkocGFyZW50LmdldENoaWxkcmVuKClbMV0pOworCQkJTGF5b3V0VXRpbC5zZXRXaWR0aEhpbnQodGV4dCwgZ2V0TWF4RmllbGRXaWR0aCgpKTsKKwkJCUxheW91dFV0aWwuc2V0SG9yaXpvbnRhbEdyYWJiaW5nKHRleHQpOworCQl9CQkKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3VHlwZVdpemFyZFBhZ2Ujc3VwZXJDbGFzc0NoYW5nZWQoKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJU3RhdHVzIHN1cGVyQ2xhc3NDaGFuZ2VkKCkgeworCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnN1cGVyQ2xhc3NDaGFuZ2VkKCk7CisJCVN0cmluZyBiYXNlQ2xhc3MgPSBnZXRTdXBlckNsYXNzKCk7CisJCWlmKGJhc2VDbGFzcyE9bnVsbCAmJiB0aGlzLnNlbGVjdGVkVGFibGUhPW51bGwgKXsKKwkJCVN0cmluZyBvbGRCYXNlQ2xhc3MgPSB0aGlzLnNlbGVjdGVkVGFibGUuZ2V0RXh0ZW5kcygpOworCQkJaWYoICFvbGRCYXNlQ2xhc3MuZXF1YWxzKGJhc2VDbGFzcyApKQorCQkJCXRoaXMuc2VsZWN0ZWRUYWJsZS5zZXRFeHRlbmRzKGJhc2VDbGFzcyk7CisJCX0KKwkJcmV0dXJuIHN0YXR1czsgCisJfQkKKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdUeXBlV2l6YXJkUGFnZSNhZGRTdXBlckludGVyZmFjZShqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCUBPdmVycmlkZQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBib29sZWFuIGFkZFN1cGVySW50ZXJmYWNlKFN0cmluZyBzdXBlckludGVyZmFjZSkgeworCQlzdXBlci5hZGRTdXBlckludGVyZmFjZShzdXBlckludGVyZmFjZSk7CisJCUxpc3QgaW50ZXJmYWNlcyA9IGdldFN1cGVySW50ZXJmYWNlcygpOworCQlpZih0aGlzLnNlbGVjdGVkVGFibGUhPW51bGwpCisJCQl0aGlzLnNlbGVjdGVkVGFibGUuc2V0SW1wbGVtZW50cyhpbnRlcmZhY2VzKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZUZpZWxkQ2hhbmdlZChTdHJpbmcgZmllbGROYW1lKSB7CisJCXN1cGVyLmhhbmRsZUZpZWxkQ2hhbmdlZChmaWVsZE5hbWUpOworCQlpZiggdGhpcy5mU3VwZXJDbGFzc1N0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKXsKKwkJCXVwZGF0ZVN0YXR1cyhmU3VwZXJDbGFzc1N0YXR1cyk7CisJCX1lbHNleworCQkJc2V0TWVzc2FnZSgiIiwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKKwkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKKwkJfQorCQkKKwl9CQorCQorCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCl7CisJCUdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIHdpemFyZCA9IChHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCkgdGhpcy5nZXRXaXphcmQoKTsKKwkJcmV0dXJuIHdpemFyZC5nZXRDdXN0b21pemVyKCk7CisJfQorCS8qKgorCSAqIENvbnRlbnQgcHJvdmlkZXIsIGFuZCBsYWJlbCBwcm92aWRlciBmb3IgdGhlIERCIFRhYmxlL0NvbHVtbiBUcmVlVmlld2VyCisJICoKKwkgKi8KKwljbGFzcyBUYWJsZUNvbHVtblRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7CisJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7CisJCQlpZiggaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgT1JNR2VuQ3VzdG9taXplciApeworCQkJCU9STUdlbkN1c3RvbWl6ZXIgaW5wdXQgPSAoT1JNR2VuQ3VzdG9taXplciApaW5wdXRFbGVtZW50OworCQkJCUxpc3Q8U3RyaW5nPiB0YWJsZU5hbWVMaXN0ID0gaW5wdXQuZ2V0R2VuVGFibGVOYW1lcygpOworCQkJCUxpc3Q8T1JNR2VuVGFibGU+IHJldCA9IG5ldyBBcnJheUxpc3Q8T1JNR2VuVGFibGU+KCk7CisJCQkJZm9yKFN0cmluZyB0IDogdGFibGVOYW1lTGlzdCl7CisJCQkJCU9STUdlblRhYmxlIG9ybUdlblRhYmxlID0gZ2V0Q3VzdG9taXplcigpLmdldFRhYmxlKCB0ICk7CisJCQkJCXJldC5hZGQoIG9ybUdlblRhYmxlICk7CisJCQkJfQorCQkJCXJldHVybiByZXQudG9BcnJheSgpOworCQkJfQorCQkJcmV0dXJuIG5ldyBPYmplY3RbXXt9OworCQl9CisJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgeworCQkJaWYoIHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBPUk1HZW5UYWJsZSApeworCQkJCU9STUdlblRhYmxlIHRhYmxlID0gKE9STUdlblRhYmxlKSBwYXJlbnRFbGVtZW50OworCQkJCUxpc3Q8T1JNR2VuQ29sdW1uPiBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOworCQkJCUxpc3Q8T1JNR2VuQ29sdW1uPiByZXQgPSBuZXcgQXJyYXlMaXN0PE9STUdlbkNvbHVtbj4oKTsKKwkJCQlib29sZWFuIGlzQ29tcG9zaXRlUGsgPSB0YWJsZS5nZXREYlRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnNTaXplKCk+MTsKKwkJCQlmb3IoIE9STUdlbkNvbHVtbiBjb2wgOiBjb2x1bW5zKXsKKwkJCQkJaWYoIGNvbC5pc0ZvcmVpZ25LZXkoKSApCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYoIGNvbC5pc1ByaW1hcnlLZXkoKSApeworCQkJCQkJaWYoIGlzQ29tcG9zaXRlUGsgKXsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX1lbHNleworCQkJCQkJCXJldC5hZGQoMCxjb2wgKTsKKwkJCQkJCX0KKwkJCQkJfWVsc2V7CisJCQkJCQlyZXQuYWRkKGNvbCk7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIHJldC50b0FycmF5KCk7CisJCQl9CisJCQlyZXR1cm4gbmV3IE9iamVjdFtde307CisJCX0KKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsgCisJCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIE9STUdlbkNvbHVtbil7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgeworCQkJcmV0dXJuKCBlbGVtZW50IGluc3RhbmNlb2YgT1JNR2VuVGFibGUgKTsKKwkJfQorCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHt9CisJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQorCX0KKworCWNsYXNzIFRhYmxlQ29sdW1uVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyeworCisJCUBPdmVycmlkZQorCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgT1JNR2VuVGFibGUgKXsKKwkJCQlyZXR1cm4gSW1hZ2VSZXBvc2l0b3J5LmdldFRhYmxlSW1hZ2UoKTsKKwkJCX1lbHNlIAlpZiggZWxlbWVudCBpbnN0YW5jZW9mIE9STUdlbkNvbHVtbiApeworCQkJCU9STUdlbkNvbHVtbiBjb2wgPSAoIE9STUdlbkNvbHVtbillbGVtZW50OworCQkJCXJldHVybiBjb2wuaXNQcmltYXJ5S2V5KCkgPworCQkJCQkJSW1hZ2VSZXBvc2l0b3J5LmdldEtleUNvbHVtbkltYWdlKCkgOgorCQkJCQkJSW1hZ2VSZXBvc2l0b3J5LmdldENvbHVtbkltYWdlKCk7CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CisJCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIE9STUdlblRhYmxlICl7CisJCQkJcmV0dXJuICgoT1JNR2VuVGFibGUpZWxlbWVudCkuZ2V0TmFtZSgpOworCQkJfWVsc2UgCQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBPUk1HZW5Db2x1bW4gKXsKKwkJCQlyZXR1cm4gKChPUk1HZW5Db2x1bW4pZWxlbWVudCkuZ2V0TmFtZSgpOworCQkJfQorCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7CisJCX0JCQorCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlR2VuZXJhdGVEZXRhaWxHcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1ucykgeworCQlkZXRhaWxQYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCVNXVFV0aWwuZmlsbENvbHVtbnMoIGRldGFpbFBhbmVsLCBjb2x1bW5zKTsKKwkJICAKKwkJZGV0YWlsUGFuZWxTdGF0Y2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKKwkJZGV0YWlsUGFuZWwuc2V0TGF5b3V0KGRldGFpbFBhbmVsU3RhdGNrTGF5b3V0KTsKKwkJICAKKwkJQ29tcG9zaXRlIGVtcHR5UGFuZWwgPSBuZXcgQ29tcG9zaXRlKGRldGFpbFBhbmVsLCBTV1QuTk9ORSk7CisJCWVtcHR5UGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7CisKKwkJZGV0YWlsUGFuZWxTdGF0Y2tMYXlvdXQudG9wQ29udHJvbCA9IGVtcHR5UGFuZWw7CisJCWRldGFpbFBhbmVsLmxheW91dCgpOworCX0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHBlcmZvcm1IZWxwKCkgCisgICAgeworICAgICAgICB0aGlzLmdldEhlbHBTeXN0ZW0oKS5kaXNwbGF5SGVscCggR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQuSEVMUF9DT05URVhUX0lEICk7CisgICAgfQorCisJcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGdldEhlbHBTeXN0ZW0oKSB7CisJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1RhYmxlc1NlbGVjdG9yV2l6YXJkUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MjQxODIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UuamF2YQpAQCAtMCwwICsxLDU0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZ2VuOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuT1JNR2VuQ3VzdG9taXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuSnB0VWlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkltYWdlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5UYWJsZUxheW91dENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOworCitjbGFzcyBUYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdleworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0NPTFVNTl9JTkRFWCA9IDA7CisJcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3Q7CisJcHJpdmF0ZSBTY2hlbWEgc2NoZW1hID0gbnVsbDsKKwlwcml2YXRlIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciA9IG51bGw7CisJcHJpdmF0ZSBib29sZWFuIHN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwgPSB0cnVlOworCisJcHJpdmF0ZSBEYXRhYmFzZUdyb3VwIGRhdGFiYXNlR3JvdXA7CisJcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVGFibGU7CisJCisJVGFibGVzU2VsZWN0b3JXaXphcmRQYWdlKEpwYVByb2plY3QganBhUHJvamVjdCApIHsKKwkJc3VwZXIoIlRhYmxlc1NlbGVjdG9yV2l6YXJkUGFnZSIpOyAvLyROT04tTkxTLTEkCisJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7CisJCXRoaXMuc2NoZW1hID0ganBhUHJvamVjdC5nZXREZWZhdWx0RGJTY2hlbWEoKTsKKwkJc2V0VGl0bGUoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9zZWxlY3RUYWJsZSApOworCQlzZXRNZXNzYWdlKEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfY2hvb3NlRW50aXR5VGFibGUgKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOworCQlkb1N0YXR1c1VwZGF0ZSgpOworCX0KKworCS8vIC0tLS0tLS0tIFByb3ZpZGUgYWNjZXNzIHRvIHdyYXBwZWQgRFRQIGNvbm5lY3Rpb24gcmVsYXRlZCBjbGFzc2VzIC0tLS0tLS0tLQorCUNvbm5lY3Rpb25Qcm9maWxlIGdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpIHsKKwkJU3RyaW5nIHByb2ZpbGVOYW1lID0gdGhpcy5qcGFQcm9qZWN0LmdldERhdGFTb3VyY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKTsKKwkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lZChwcm9maWxlTmFtZSk7CisJfQorCisJQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGVOYW1lZChTdHJpbmcgcHJvZmlsZU5hbWUpIHsKKwkJcmV0dXJuIEpwdERiUGx1Z2luLmluc3RhbmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShwcm9maWxlTmFtZSk7CisJfQorCisJU2NoZW1hIGdldFNjaGVtYSgpeworCQlyZXR1cm4gdGhpcy5zY2hlbWE7CisJfQorCisJdm9pZCBzZXRTY2hlbWEoU2NoZW1hIHMpeworCQl0aGlzLnNjaGVtYSA9IHM7CisJfQorCisJcHJpdmF0ZSBDb2xsZWN0aW9uPFRhYmxlPiBwb3NzaWJsZVRhYmxlcygpIHsKKwkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCk7CisJCWlmIChzY2hlbWEgIT0gbnVsbCAmJiBzY2hlbWEuZ2V0TmFtZSgpICE9IG51bGwpIHsKKwkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzY2hlbWEudGFibGVzKCkpOworCQl9CisJCXJldHVybiBDb2xsZWN0aW9ucy48VGFibGU+IGVtcHR5TGlzdCgpOworCX0KKworCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKKworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKKwkJaW50IG5Db2x1bW5zPSAzOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gbkNvbHVtbnM7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLkdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9TRUxFQ1RfVEFCTEVTKTsKKworCQl0aGlzLmRhdGFiYXNlR3JvdXAgPSBjcmVhdGVEYXRhYmFzZUdyb3VwKGNvbXBvc2l0ZSwgNDAwKTsKKworCQljcmVhdGVUYWJsZXNTZWxlY3Rpb25Db250cm9sKGNvbXBvc2l0ZSwgbkNvbHVtbnMpOworCisJCS8vRmlsbGVyIGNvbHVtbgorCQluZXcgTGFiZWwoIGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQkKKwkJZmluYWwgQnV0dG9uIHN5bmNocm9uaXplQ2xhc3Nlc0NoZWNrQm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7CisJCXN5bmNocm9uaXplQ2xhc3Nlc0NoZWNrQm94LnNldFRleHQoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9zeW5jaHJvbml6ZUNsYXNzZXMgKTsKKwkJc3luY2hyb25pemVDbGFzc2VzQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRydWUpOworCQlzeW5jaHJvbml6ZUNsYXNzZXNDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KKworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXNldFN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwoc3luY2hyb25pemVDbGFzc2VzQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOworCQkJfQorCisJCX0pOworCQlmaWxsQ29sdW1ucyggc3luY2hyb25pemVDbGFzc2VzQ2hlY2tCb3gsIDIpOworCisKKwkJLy9GaWxsZXIgY29sdW1uCisJCW5ldyBMYWJlbCggY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCS8vUmVzdG9yZSBkZWZhdWx0IGJ1dHRvbgorCQlmaW5hbCBCdXR0b24gcmVzdG9yZUJ0biA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCApOworCQlyZXN0b3JlQnRuLnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfUmVzdG9yZV9EZWZhdWx0cyApOworCQlyZXN0b3JlQnRuLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWlmKCBjdXN0b21pemVyIT1udWxsICYmIGN1c3RvbWl6ZXIuZ2V0RmlsZSgpIT1udWxsICl7CisJCQkJCWlmKCBjdXN0b21pemVyLmdldEZpbGUoKS5leGlzdHMoKSApeworCQkJCQkJY3VzdG9taXplci5nZXRGaWxlKCkuZGVsZXRlKCk7CisJCQkJCX0KKwkJCQkJdXBkYXRlVGFibGVzU2VsZWN0b3IoIGRhdGFiYXNlR3JvdXAuZ2V0U2VsZWN0ZWRTY2hlbWEoKSApOworCQkJCQlkZXNlbGVjdEFsbFRhYmxlcygpOworCQkJCX0KKwkJCX0KKworCQl9KTsKKwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5FTkQ7CisJCXJlc3RvcmVCdG4uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisJCQorCQkKKwkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLnRhYmxlVGFibGUuZ2V0Q29udHJvbCgpLCBKcGFIZWxwQ29udGV4dElkcy5ESUFMT0dfR0VORVJBVEVfRU5USVRJRVNfVEFCTEVTKTsKKworCQl0aGlzLnNldENvbnRyb2woY29tcG9zaXRlKTsKKworCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlpZiAodGhpcy5kYXRhYmFzZUdyb3VwICE9IG51bGwpCisJCQl0aGlzLmRhdGFiYXNlR3JvdXAuZGlzcG9zZSgpOworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZSgpIHsKKwkJSVdpemFyZFBhZ2UgcHJldlBhZ2UgPSBzdXBlci5nZXRQcmV2aW91c1BhZ2UoKTsKKwkJaWYgKHByZXZQYWdlIGluc3RhbmNlb2YgUHJvbXB0SlBBUHJvamVjdFdpemFyZFBhZ2UpCisJCQkvL1ByZXZlbnQgZ29pbmcgYmFjayB0byB0aGUgUHJvbXB0SlBBUHJvamVjdFdpemFyZFBhZ2UKKwkJCS8vaWYgSlBBIHByb2plY3QgYWxyZWFkeSBzZWxlY3RlZAorCQkJcmV0dXJuIHByZXZQYWdlLmdldFByZXZpb3VzUGFnZSgpOworCQllbHNlCisJCQlyZXR1cm4gcHJldlBhZ2U7CisJfQorCisJcHJpdmF0ZSBEYXRhYmFzZUdyb3VwIGNyZWF0ZURhdGFiYXNlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoSGludCkgeworCQlEYXRhYmFzZUdyb3VwIGRiR3JvdXAgPSBuZXcgRGF0YWJhc2VHcm91cCh0aGlzLmdldENvbnRhaW5lcigpLCBqcGFQcm9qZWN0LCBwYXJlbnQsIHdpZHRoSGludCk7CisJCS8qKgorCQkgKiBsaXN0ZW4gZm9yIHdoZW4gdGhlIERhdGFiYXNlIENvbm5lY3Rpb24gY2hhbmdlcyBpdHMgc2VsZWN0ZWQgc2NoZW1hCisJCSAqIHNvIHdlIGNhbiBrZWVwIHRoZSBwYWdlIGluIHN5bmNoCisJCSAqLworCQljbGFzcyBEYXRhYmFzZVBhZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIERhdGFiYXNlR3JvdXAuTGlzdGVuZXIgeworCQkJcHVibGljIHZvaWQgc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGUpIHsKKwkJCQlqcGFQcm9qZWN0LmdldERhdGFTb3VyY2UoKS5zZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoY29ubmVjdGlvblByb2ZpbGUuZ2V0TmFtZSgpKTsKKwkJCX0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJcHVibGljIHZvaWQgc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKFNjaGVtYSBzY2hlbWEpIHsKKwkJCQlpZiAoc2NoZW1hPT1udWxsKSB7CisJCQkJCXVwZGF0ZVRhYmxlc0xpc3RWaWV3ZXIoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCApOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIHN0b3JlIHRoZSAqaWRlbnRpZmllciogaW4gdGhlIEpQQSBwcm9qZWN0LCBzaW5jZSBpdCBnZXRzIHB1dCBpbiBKYXZhIGFubm90YXRpb25zCisJCQkJCWpwYVByb2plY3Quc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYShzY2hlbWEuZ2V0SWRlbnRpZmllcigpKTsKKwkJCQkJc2V0U2NoZW1hKCBzY2hlbWEgKTsKKwkJCQkJdXBkYXRlVGFibGVzU2VsZWN0b3Ioc2NoZW1hKTsKKwkJCQl9CisJCQkJZG9TdGF0dXNVcGRhdGUoKTsKKwkJCX0KKwkJfQorCQlkYkdyb3VwLmFkZExpc3RlbmVyKG5ldyBEYXRhYmFzZVBhZ2VMaXN0ZW5lcigpKTsKKwkJZGJHcm91cC5pbml0KCk7CisJCXJldHVybiBkYkdyb3VwOworCX0KKworCWJvb2xlYW4gc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCgpIHsKKwkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0U3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbChib29sZWFuIHN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwpeworCQl0aGlzLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwgPSBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sOworCX0KKworCXByaXZhdGUgdm9pZCBzZWxlY3RBbGxUYWJsZXMoKXsKKwkJdGhpcy50YWJsZVRhYmxlLnNldEFsbENoZWNrZWQodHJ1ZSk7CisJCWRvU3RhdHVzVXBkYXRlKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlc2VsZWN0QWxsVGFibGVzKCl7CisJCXRoaXMudGFibGVUYWJsZS5zZXRBbGxDaGVja2VkKGZhbHNlKTsKKwkJZG9TdGF0dXNVcGRhdGUoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdFRhYmxlc1NlbGVjdGlvbkNvbnRyb2woQ29sbGVjdGlvbjxUYWJsZT4gcG9zc2libGVUYWJsZXMpIHsKKwkJdGhpcy50YWJsZVRhYmxlLnNldElucHV0KHBvc3NpYmxlVGFibGVzKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVzU2VsZWN0aW9uQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1ucykgeworCQlMYWJlbCB0YWJsZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOworCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7CisJCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKKwkJdGFibGVMYWJlbC5zZXRMYXlvdXREYXRhKCBnZCApOworCQl0YWJsZUxhYmVsLnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfdGFibGVzICk7CisJCQorCQlUYWJsZUxheW91dENvbXBvc2l0ZSBsYXlvdXQ9IG5ldyBUYWJsZUxheW91dENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJYWRkQ29sdW1uTGF5b3V0RGF0YShsYXlvdXQpOworCisJCWZpbmFsIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlIHRhYmxlID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlKGxheW91dCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIgfCBTV1QuQ0hFQ0spOworCisJCVRhYmxlQ29sdW1uIHRhYmxlTmFtZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIFRBQkxFX0NPTFVNTl9JTkRFWCk7CisJCXRhYmxlTmFtZUNvbHVtbi5zZXRUZXh0KEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfdGFibGVDb2x1bW4gKTsKKwkJdGFibGVOYW1lQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKKworCQlnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCWdkLmhlaWdodEhpbnQ9IFNXVFV0aWwuZ2V0VGFibGVIZWlnaHRIaW50KHRhYmxlLCAyMCk7CisJCWdkLndpZHRoSGludCA9IDI1MDsKKwkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZSA7CisJCWxheW91dC5zZXRMYXlvdXREYXRhKGdkKTsKKwkJbGF5b3V0LnNldEJhY2tncm91bmQobmV3IENvbG9yKCBEaXNwbGF5LmdldERlZmF1bHQoKSwgMjU1LCAwLDApKTsKKworCQl0aGlzLnRhYmxlVGFibGUgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcih0YWJsZSk7CisJCXRoaXMudGFibGVUYWJsZS5zZXRVc2VIYXNobG9va3VwKHRydWUpOworCQl0aGlzLnRhYmxlVGFibGUuc2V0TGFiZWxQcm92aWRlcih0aGlzLmJ1aWxkVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKSk7CisJCXRoaXMudGFibGVUYWJsZS5zZXRDb250ZW50UHJvdmlkZXIodGhpcy5idWlsZFRhYmxlVGFibGVDb250ZW50UHJvdmlkZXIoKSk7CisJCXRoaXMudGFibGVUYWJsZS5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7CisJCQkJcmV0dXJuICgoVGFibGUpIGUxKS5nZXROYW1lKCkuY29tcGFyZVRvKCgoVGFibGUpIGUyKS5nZXROYW1lKCkpOworCQkJfQorCQl9KTsKKworCQl0aGlzLnRhYmxlVGFibGUuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJaGFuZGxlVGFibGVzTGlzdFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOworCQkJfQorCQl9KTsKKworCQl0YWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7CisJCQkJaWYgKGUua2V5Q29kZSA9PSBTV1QuRjIgJiYgZS5zdGF0ZU1hc2sgPT0gU1dULk5PTkUpIHsKKwkJCQkJZWRpdEVudGl0eU5hbWVJZlBvc3NpYmxlKCk7CisJCQkJCWUuZG9pdD0gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9KTsKKworCQl1cGRhdGVUYWJsZXNTZWxlY3RvciggZGF0YWJhc2VHcm91cC5nZXRTZWxlY3RlZFNjaGVtYSgpICk7CisJCWNyZWF0ZUJ1dHRvbkNvbXBvc2l0ZShwYXJlbnQpOworCQlpbml0VGFibGVzU2VsZWN0aW9uQ29udHJvbChwb3NzaWJsZVRhYmxlcygpKTsJCQorCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCl7CisKKwkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7CisJCUdyaWRMYXlvdXQgYnV0dG9uTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOworCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkxheW91dCk7CisJCUdyaWREYXRhIGRhdGEgPSAgbmV3IEdyaWREYXRhKCk7CisJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7CisJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7CisJCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCisJCUJ1dHRvbiBzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOworCQlzZWxlY3RBbGxCdXR0b24uc2V0VG9vbFRpcFRleHQoSnB0VWlNZXNzYWdlcy5HZW5lcmFsX3NlbGVjdEFsbCk7CisJCXNlbGVjdEFsbEJ1dHRvbi5zZXRJbWFnZSggSW1hZ2VSZXBvc2l0b3J5LmdldFNlbGVjdEFsbEJ1dHRvbkltYWdlKCkgICk7CisJCUdyaWREYXRhIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOworCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKKwkJc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOworCQlzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CisKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlzZWxlY3RBbGxUYWJsZXMoKTsKKwkJCX0KKwkJfSk7CisKKwkJQnV0dG9uIGRlc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKKwkJZGVzZWxlY3RBbGxCdXR0b24uc2V0VG9vbFRpcFRleHQoSnB0VWlNZXNzYWdlcy5HZW5lcmFsX2Rlc2VsZWN0QWxsKTsKKwkJZGVzZWxlY3RBbGxCdXR0b24uc2V0SW1hZ2UoIEltYWdlUmVwb3NpdG9yeS5nZXREZXNlbGVjdEFsbEJ1dHRvbkltYWdlKCkgKTsKKwkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7CisJCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOworCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKwkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CisKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlkZXNlbGVjdEFsbFRhYmxlcygpOworCQkJfQorCQl9KTsKKwl9CisKKworCXByaXZhdGUgdm9pZCBhZGRDb2x1bW5MYXlvdXREYXRhKFRhYmxlTGF5b3V0Q29tcG9zaXRlIGxheW91dCkgeworCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgdHJ1ZSkpOworCX0KKworCXZvaWQgZWRpdEVudGl0eU5hbWVJZlBvc3NpYmxlKCl7CisJCU9iamVjdFtdIHNlbGVjdGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy50YWJsZVRhYmxlLmdldFNlbGVjdGlvbigpKS50b0FycmF5KCk7CisJCWlmIChzZWxlY3RlZC5sZW5ndGggIT0gMSkgeworCQkJcmV0dXJuOworCQl9CisJfQorCisJdm9pZCBoYW5kbGVUYWJsZXNMaXN0U2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJZG9TdGF0dXNVcGRhdGUoKTsKKwl9CisKKwlwcml2YXRlIElCYXNlTGFiZWxQcm92aWRlciBidWlsZFRhYmxlVGFibGVMYWJlbFByb3ZpZGVyKCkgeworCQlyZXR1cm4gbmV3IFRhYmxlVGFibGVMYWJlbFByb3ZpZGVyKCk7CisJfQorCisJcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGJ1aWxkVGFibGVUYWJsZUNvbnRlbnRQcm92aWRlcigpIHsKKwkJcmV0dXJuIG5ldyBUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyKCk7CisJfQorCQorCXB1YmxpYyBTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKKwkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXREZWZhdWx0RGJTY2hlbWEoKSA7CisJfQorCQorCUNvbGxlY3Rpb248VGFibGU+IGdldFNlbGVjdGVkVGFibGVzKCkgeworCQlBcnJheUxpc3Q8VGFibGU+IHNlbGVjdGVkVGFibGVzID0gbmV3IEFycmF5TGlzdDxUYWJsZT4oKTsKKwkJZm9yIChPYmplY3Qgc2VsZWN0ZWRUYWJsZSA6IHRoaXMudGFibGVUYWJsZS5nZXRDaGVja2VkRWxlbWVudHMoKSkKKwkJCXNlbGVjdGVkVGFibGVzLmFkZCgoVGFibGUpIHNlbGVjdGVkVGFibGUpOworCQlyZXR1cm4gc2VsZWN0ZWRUYWJsZXM7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGhhc1RhYmxlc1NlbGVjdGVkKCkgeworCQlyZXR1cm4gKHRoaXMudGFibGVUYWJsZSAhPSBudWxsKSA/ICh0aGlzLmdldFNlbGVjdGVkVGFibGVzKCkuc2l6ZSgpID4gMCkgOiBmYWxzZTsKKwl9CisKKwl2b2lkIHVwZGF0ZVRhYmxlc0xpc3RWaWV3ZXIoQ29sbGVjdGlvbjxUYWJsZT4gcG9zc2libGVUYWJsZXMpIHsKKwkJaWYgKHRoaXMudGFibGVUYWJsZSAhPSBudWxsKSB7CisJCQl0aGlzLmluaXRUYWJsZXNTZWxlY3Rpb25Db250cm9sKHBvc3NpYmxlVGFibGVzKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFVwZGF0ZSB0aGUgc3RhdHVzIGxpbmUgYW5kIHRoZSBPSyBidXR0b24gYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzdGF0dXMKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkb1N0YXR1c1VwZGF0ZSgpIHsKKwkJaWYgKCAhIHRoaXMuaGFzVGFibGVzU2VsZWN0ZWQoKSkgeworCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOworCQl9ZWxzZXsKKwkJCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKKwkJCXRyeXsKKwkJCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIGZhbHNlLCBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCl7CisJCQkJCXB1YmxpYyB2b2lkIHJ1biggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCisJCQkJICAgIAl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKwkJCQkgICAgeworCQkJCQkJbW9uaXRvci5iZWdpblRhc2soIlVwZGF0aW5nIiwgMTApOworCQkJCQorCQkJCQkJQ29sbGVjdGlvbjxUYWJsZT4gcmV0ID0gZ2V0U2VsZWN0ZWRUYWJsZXMoKTsKKwkJCQkJCUFycmF5TGlzdDxTdHJpbmc+IHRhYmxlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCQkJCWZvciggVGFibGUgdCA6IHJldCApeworCQkJCQkJCXRhYmxlTmFtZXMuYWRkKHQuZ2V0TmFtZSgpKTsKKwkJCQkJCX0KKwkJCQkJCVNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKKwkJCQkJCWlmKCBzY2hlbWEgPT0gbnVsbCApeworCQkJCQkJCXJldHVybiA7CisJCQkJCQl9CisJCQkJCQljdXN0b21pemVyLnNldFNjaGVtYShzY2hlbWEpOworCQkJCQkJY3VzdG9taXplci5zZXRUYWJsZU5hbWVzKHRhYmxlTmFtZXMpOworCQkJCQkJbW9uaXRvci5kb25lKCk7CisJCQkJICAgIH0KKwkJCQl9KTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJSnB0VWlQbHVnaW4ubG9nKGUpOworCQkJfQorCQkJCQorCQl9CisJfQorCisJLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKKwlwcml2YXRlIGNsYXNzIFRhYmxlVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgeworCisJCVRhYmxlVGFibGVMYWJlbFByb3ZpZGVyKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCXJldHVybiAoKFRhYmxlKSBlbGVtZW50KS5nZXROYW1lKCk7CisJCX0KKworCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgeworCQkJCWNhc2UgVEFCTEVfQ09MVU1OX0lOREVYOgorCQkJCQlyZXR1cm4gKChUYWJsZSkgZWxlbWVudCkuZ2V0TmFtZSgpOworCisJCQl9CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGNvbHVtbiBpbmRleDogIiArIGNvbHVtbkluZGV4KTsvLyAkTk9OLU5MUy0xJAorCQl9CisKKwl9CisKKworCXByaXZhdGUgY2xhc3MgVGFibGVUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKKworCQlUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewl9CisKKwkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9CisKKwkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJCXJldHVybiAoKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudCkudG9BcnJheSgpOworCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlVGFibGVzU2VsZWN0b3IoZmluYWwgU2NoZW1hIHNjaGVtYSkgeworCQlpZihzY2hlbWEgPT1udWxsKQorCQkJcmV0dXJuOworCQl0aGlzLmpwYVByb2plY3Quc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSggc2NoZW1hLmdldElkZW50aWZpZXIoKSk7CisJCQorCQl1cGRhdGVUYWJsZXNMaXN0Vmlld2VyKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHNjaGVtYS50YWJsZXMoKSkpOworCisJCS8vQ3JlYXRlIHRoZSBPUk1HZW5DdXN0b21pemVyCisJCUdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIHdpemFyZCA9IChHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCkgZ2V0V2l6YXJkKCk7CisJCWN1c3RvbWl6ZXIgPSB3aXphcmQuY3JlYXRlT1JNR2VuQ3VzdG9taXplciggc2NoZW1hICk7CisKKwkJaWYoIHRhYmxlVGFibGUhPW51bGwgJiYgY3VzdG9taXplciAhPSBudWxsICApeworCQkJcmVzdG9yZVdpemFyZFN0YXRlKCk7CisJCX0KKyAgICAgICAgZG9TdGF0dXNVcGRhdGUoKTsKKworCX0KKworCXByaXZhdGUgYm9vbGVhbiByZXN0b3JlV2l6YXJkU3RhdGUoKXsKKwkJYm9vbGVhbiBwYWdlQ29tcGxldGUgPSBmYWxzZTsKKwkJTGlzdDxTdHJpbmc+IHByZVNlbGVjdGVkVGFibGVOYW1lcyA9IHRoaXMuY3VzdG9taXplci5nZXRUYWJsZU5hbWVzKCk7CisJCWlmKHByZVNlbGVjdGVkVGFibGVOYW1lcyE9bnVsbCAmJiBwcmVTZWxlY3RlZFRhYmxlTmFtZXMuc2l6ZSgpPjApIHsKKwkJCVNldDxTdHJpbmc+IHNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJCWZvcihTdHJpbmcgcyA6IHByZVNlbGVjdGVkVGFibGVOYW1lcyApeworCQkJCXNldC5hZGQocyk7CisJCQl9CisJICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IHRoaXMudGFibGVUYWJsZS5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7CisJICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7CisJICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKKwkgICAgICAgICAgICBvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUgZWxlbWVudCA9IChvcmcuZWNsaXBzZS5qcHQuZGIuVGFibGUpaXRlbS5nZXREYXRhKCk7CisJICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgeworCSAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrID0gc2V0LmNvbnRhaW5zKGVsZW1lbnQuZ2V0TmFtZSgpKTsKKwkgICAgICAgICAgICAgICAgLy8gb25seSBzZXQgaWYgZGlmZmVyZW50LCB0byBhdm9pZCBmbGlja2VyCisJICAgICAgICAgICAgICAgIGlmIChpdGVtLmdldENoZWNrZWQoKSAhPSBjaGVjaykgeworCSAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRDaGVja2VkKGNoZWNrKTsKKwkgICAgICAgICAgICAgICAgICAgIHBhZ2VDb21wbGV0ZSA9IHRydWU7CisJICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICB9CisJICAgICAgICB9CisJCX0KKwkJcmV0dXJuIHBhZ2VDb21wbGV0ZTsKKwl9CisKKworCS8qKgorCSAqIFNldCB0aGUgbGF5b3V0RGF0YSBvZiB0aGUgaW5wdXQgY29udHJvbCB0byBvY2N1cHkgc3BlY2lmaWVkIG51bWJlciBvZiBjb2x1bW5zCisJICogQHBhcmFtIGMKKwkgKiBAcGFyYW0gY29sdW1ucworCSAqLworCXByaXZhdGUgdm9pZCBmaWxsQ29sdW1ucyhDb250cm9sIGMsIGludCBjb2x1bW5zKXsKKwkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOworCQlsYXlvdXREYXRhLmhvcml6b250YWxTcGFuID0gY29sdW1uczsKKwkJbGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOworCQlsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKKwkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKKwkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOworCQljLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7CisJCXJldHVybiA7CisJfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgcGVyZm9ybUhlbHAoKSAKKyAgICB7CisgICAgCXRoaXMuZ2V0SGVscFN5c3RlbSgpLmRpc3BsYXlIZWxwKCBHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZC5IRUxQX0NPTlRFWFRfSUQgKTsKKyAgICB9CisgICAgCisJcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGdldEhlbHBTeXN0ZW0oKSB7CisJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL29ybS9NYXBwaW5nRmlsZVdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9vcm0vTWFwcGluZ0ZpbGVXaXphcmQuamF2YQppbmRleCAwNGUxOTgzLi4zNDRmM2E2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL29ybS9NYXBwaW5nRmlsZVdpemFyZC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvb3JtL01hcHBpbmdGaWxlV2l6YXJkLmphdmEKQEAgLTYzLDEwICs2MywxNCBAQAogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGRvQWRkUGFnZXMoKSB7CiAJCXN1cGVyLmRvQWRkUGFnZXMoKTsKLQkJcGFnZSA9IG5ldyBNYXBwaW5nRmlsZVdpemFyZFBhZ2UoZ2V0RGF0YU1vZGVsKCksICJQYWdlXzEiKTsKKwkJcGFnZSA9IGJ1aWxkTWFwcGluZ0ZpbGVXaXphcmRQYWdlKCk7CiAJCWFkZFBhZ2UocGFnZSk7CiAJfQogCQorCXByb3RlY3RlZCBNYXBwaW5nRmlsZVdpemFyZFBhZ2UgYnVpbGRNYXBwaW5nRmlsZVdpemFyZFBhZ2UoKSB7CisJCXJldHVybiBuZXcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlKGdldERhdGFNb2RlbCgpLCAiUGFnZV8xIik7CisJfQorCQogCUBPdmVycmlkZQogCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewogCQlyZXR1cm4gbmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCk7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL29ybS9NYXBwaW5nRmlsZVdpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvb3JtL01hcHBpbmdGaWxlV2l6YXJkUGFnZS5qYXZhCmluZGV4IGNjMWIzMTMuLmI5OGY4OWEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvb3JtL01hcHBpbmdGaWxlV2l6YXJkUGFnZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvb3JtL01hcHBpbmdGaWxlV2l6YXJkUGFnZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gCiAgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAogICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAogICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IApAQCAtMTksNyArMTksNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwpAQCAtMTA3LDMwICsxMDYsMzAgQEAKIAkJZGF0YS53aWR0aEhpbnQgPSAzMDA7CiAJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwogCQkKLQkJcHJvamVjdE5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3Byb2plY3RMYWJlbCk7IC8vJE5PTi1OTFMtMSQKKwkJdGhpcy5wcm9qZWN0TmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQl0aGlzLnByb2plY3ROYW1lTGFiZWwuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9wcm9qZWN0TGFiZWwpOwogCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXByb2plY3ROYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJdGhpcy5wcm9qZWN0TmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CiAJCQotCQlwcm9qZWN0TmFtZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOworCQl0aGlzLnByb2plY3ROYW1lQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7CiAJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKIAkJZGF0YS53aWR0aEhpbnQgPSAzMDA7CiAJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlwcm9qZWN0TmFtZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8ocHJvamVjdE5hbWVDb21ibywgUFJPSkVDVF9OQU1FLCBudWxsKTsKKwkJdGhpcy5wcm9qZWN0TmFtZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7CisJCXRoaXMuc3luY2hIZWxwZXIuc3luY2hDb21ibyh0aGlzLnByb2plY3ROYW1lQ29tYm8sIFBST0pFQ1RfTkFNRSwgbnVsbCk7CiAJCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKIAkJCi0JCXNvdXJjZUZvbGRlckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzb3VyY2VGb2xkZXJMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3NvdXJjZUZvbGRlckxhYmVsKTsgLy8kTk9OLU5MUy0xJAorCQl0aGlzLnNvdXJjZUZvbGRlckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQl0aGlzLnNvdXJjZUZvbGRlckxhYmVsLnNldFRleHQoSnB0VWlNZXNzYWdlcy5NYXBwaW5nRmlsZVdpemFyZFBhZ2Vfc291cmNlRm9sZGVyTGFiZWwpOwogCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXNvdXJjZUZvbGRlckxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisJCXRoaXMuc291cmNlRm9sZGVyTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKIAkJCi0JCXNvdXJjZUZvbGRlclRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOworCQl0aGlzLnNvdXJjZUZvbGRlclRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwogCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CiAJCWRhdGEud2lkdGhIaW50ID0gMzAwOwogCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJc291cmNlRm9sZGVyVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoc291cmNlRm9sZGVyVGV4dCwgU09VUkNFX0ZPTERFUiwgbnVsbCk7CisJCXRoaXMuc291cmNlRm9sZGVyVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQl0aGlzLnN5bmNoSGVscGVyLnN5bmNoVGV4dCh0aGlzLnNvdXJjZUZvbGRlclRleHQsIFNPVVJDRV9GT0xERVIsIG51bGwpOwogCQkKIAkJQnV0dG9uIHNvdXJjZUZvbGRlckJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7CiAJCXNvdXJjZUZvbGRlckJ1dHRvbi5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuR2VuZXJhbF9icm93c2UpOwpAQCAtMTQ3LDUwICsxNDYsNTAgQEAKIAkJCQl9CiAJCQl9KTsKIAkJCi0JCWZpbGVQYXRoTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZpbGVQYXRoTGFiZWwuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9maWxlUGF0aExhYmVsKTsgLy8kTk9OLU5MUy0xJAorCQl0aGlzLmZpbGVQYXRoTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCXRoaXMuZmlsZVBhdGhMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2ZpbGVQYXRoTGFiZWwpOwogCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWZpbGVQYXRoTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJdGhpcy5maWxlUGF0aExhYmVsLnNldExheW91dERhdGEoZGF0YSk7CiAJCQotCQlmaWxlUGF0aFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKKwkJdGhpcy5maWxlUGF0aFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwogCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CiAJCWRhdGEud2lkdGhIaW50ID0gMzAwOwogCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJZmlsZVBhdGhUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChmaWxlUGF0aFRleHQsIEZJTEVfUEFUSCwgbnVsbCk7CisJCXRoaXMuZmlsZVBhdGhUZXh0LnNldExheW91dERhdGEoZGF0YSk7CisJCXRoaXMuc3luY2hIZWxwZXIuc3luY2hUZXh0KHRoaXMuZmlsZVBhdGhUZXh0LCBGSUxFX1BBVEgsIG51bGwpOwogCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CiAJCQotCQlhY2Nlc3NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYWNjZXNzTGFiZWwuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9hY2Nlc3NMYWJlbCk7IC8vJE5PTi1OTFMtMSQKKwkJdGhpcy5hY2Nlc3NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJdGhpcy5hY2Nlc3NMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FjY2Vzc0xhYmVsKTsKIAkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlhY2Nlc3NMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworCQl0aGlzLmFjY2Vzc0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7CiAJCQotCQlhY2Nlc3NDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKKwkJdGhpcy5hY2Nlc3NDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKIAkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwogCQlkYXRhLndpZHRoSGludCA9IDMwMDsKIAkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWFjY2Vzc0NvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oYWNjZXNzQ29tYm8sIERFRkFVTFRfQUNDRVNTLCBudWxsKTsKKwkJdGhpcy5hY2Nlc3NDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOworCQl0aGlzLnN5bmNoSGVscGVyLnN5bmNoQ29tYm8odGhpcy5hY2Nlc3NDb21ibywgREVGQVVMVF9BQ0NFU1MsIG51bGwpOwogCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CiAJCQotCQlhZGRUb1BlcnNpc3RlbmNlVW5pdEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0sgfCBTV1QuQkVHSU5OSU5HKTsKLQkJYWRkVG9QZXJzaXN0ZW5jZVVuaXRCdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9hZGRUb1BlcnNpc3RlbmNlVW5pdEJ1dHRvbik7CisJCXRoaXMuYWRkVG9QZXJzaXN0ZW5jZVVuaXRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLIHwgU1dULkJFR0lOTklORyk7CisJCXRoaXMuYWRkVG9QZXJzaXN0ZW5jZVVuaXRCdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9hZGRUb1BlcnNpc3RlbmNlVW5pdEJ1dHRvbik7CiAJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKIAkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWFkZFRvUGVyc2lzdGVuY2VVbml0QnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goYWRkVG9QZXJzaXN0ZW5jZVVuaXRCdXR0b24sIEFERF9UT19QRVJTSVNURU5DRV9VTklULCBudWxsKTsKKwkJdGhpcy5hZGRUb1BlcnNpc3RlbmNlVW5pdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOworCQl0aGlzLnN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3godGhpcy5hZGRUb1BlcnNpc3RlbmNlVW5pdEJ1dHRvbiwgQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQsIG51bGwpOwogCQkKLQkJcGVyc2lzdGVuY2VVbml0TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBlcnNpc3RlbmNlVW5pdExhYmVsLnNldFRleHQoSnB0VWlNZXNzYWdlcy5NYXBwaW5nRmlsZVdpemFyZFBhZ2VfcGVyc2lzdGVuY2VVbml0TGFiZWwpOyAvLyROT04tTkxTLTEkCisJCXRoaXMucGVyc2lzdGVuY2VVbml0TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0TGFiZWwuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9wZXJzaXN0ZW5jZVVuaXRMYWJlbCk7CiAJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJcGVyc2lzdGVuY2VVbml0TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwogCQkKLQkJcGVyc2lzdGVuY2VVbml0Q29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0Q29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7CiAJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKIAkJZGF0YS53aWR0aEhpbnQgPSAzMDA7CiAJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlwZXJzaXN0ZW5jZVVuaXRDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKHBlcnNpc3RlbmNlVW5pdENvbWJvLCBQRVJTSVNURU5DRV9VTklULCBudWxsKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOworCQl0aGlzLnN5bmNoSGVscGVyLnN5bmNoQ29tYm8odGhpcy5wZXJzaXN0ZW5jZVVuaXRDb21ibywgUEVSU0lTVEVOQ0VfVU5JVCwgbnVsbCk7CiAJCQogCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CiAJCQpAQCAtMjA0LDkgKzIwMyw3IEBACiAJCUlTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgdmFsaWRhdG9yID0gZ2V0U291cmNlRm9sZGVyRGlhbG9nU2VsZWN0aW9uVmFsaWRhdG9yKCk7CiAJCVZpZXdlckZpbHRlciBmaWx0ZXIgPSBnZXRTb3VyY2VGb2xkZXJEaWFsb2dWaWV3ZXJGaWx0ZXIoKTsKIAkJSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpOwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKAotCQkJCW5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCksIAotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpOworCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKIAkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIGxhYmVsUHJvdmlkZXIsIGNvbnRlbnRQcm92aWRlcik7CiAJCWRpYWxvZy5zZXRWYWxpZGF0b3IodmFsaWRhdG9yKTsKIAkJZGlhbG9nLnNldFRpdGxlKEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FjY2Vzc0xhYmVsX3NvdXJjZUZvbGRlckRpYWxvZ1RpdGxlKTsKQEAgLTIzNywxMyArMjM0LDE0IEBACiAJCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvblswXSAhPSBudWxsICYmICEgKHNlbGVjdGlvblswXSBpbnN0YW5jZW9mIElQcm9qZWN0KSkgewogCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKIAkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsIEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2luY29ycmVjdFNvdXJjZUZvbGRlckVycm9yKTsKKwkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsIEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2luY29ycmVjdFNvdXJjZUZvbGRlckVycm9yKTsKIAkJCX0KIAkJfTsKIAl9CiAJCiAJcHJpdmF0ZSBWaWV3ZXJGaWx0ZXIgZ2V0U291cmNlRm9sZGVyRGlhbG9nVmlld2VyRmlsdGVyKCkgewogCQlyZXR1cm4gbmV3IFZpZXdlckZpbHRlcigpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7CiAJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewogCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBlbGVtZW50OwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIuamF2YQppbmRleCBhNDAxZTQyLi5iNzZmMjc0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklEZXNjcmlwdGlvblByb3ZpZGVyOwogCiAvKioKICAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcn0gYW5kIHtAbGluayBJTGFiZWxQcm92aWRlcn0gdGhhdCAKQEAgLTM1LDggKzM2LDkgQEAKICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyCi0JaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgSUxhYmVsUHJvdmlkZXIKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgCisJZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlcgorCWltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIElMYWJlbFByb3ZpZGVyLCBJRGVzY3JpcHRpb25Qcm92aWRlcgogewogCXByaXZhdGUgZmluYWwgSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgaXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7CiAJCkBAIC0xMTEsNiArMTEzLDExIEBACiAJCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBudWxsIDogcHJvdmlkZXIuZ2V0VGV4dCgpOwogCX0KIAkKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKE9iamVjdCBlbGVtZW50KSB7CisJCUl0ZW1MYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gaXRlbUxhYmVsUHJvdmlkZXIoZWxlbWVudCk7CisJCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBudWxsIDogcHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oKTsKKwl9CisJCiAJLyoqCiAJICogRGlzcG9zZXMgYWxsIGl0ZW1zCiAJICovCkBAIC0xNjYsNyArMTczLDkgQEAKIAkJCQl9CiAJCQl9CiAJCX07Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7CisJCWlmICghdmlld2VySXNEaXNwb3NlZCgpKSB7CisJCQl0aGlzLnZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7CisJCX0KIAl9CiAJCiAJLy8gb3BlbiB1cCB2aXNpYmlsaXR5IGEgYml0IGZvciBpbm5lciBjbGFzc2VzCkBAIC0xODYsNiArMTk1LDEzIEBACiAJCQkJfQogCQkJfQogCQl9OwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMocnVubmFibGUpOworCQlpZiAoIXZpZXdlcklzRGlzcG9zZWQoKSkgeworCQkJdGhpcy52aWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMocnVubmFibGUpOworCQl9CiAJfQorCQorCXByb3RlY3RlZCBib29sZWFuIHZpZXdlcklzRGlzcG9zZWQoKSB7CisJCXJldHVybiB0aGlzLnZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpOworCX0KKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pmYWNlL0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEKaW5kZXggZDE1ZGYzYy4uYTZjM2RiNiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlci5qYXZhCkBAIC0zNiw2ICszNiwxMSBAQAogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpOwogCQogCS8qKgorCSAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBpdGVtCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCQorCS8qKgogCSAqIERpc3Bvc2Ugb2YgdGhpcyBsYWJlbCBwcm92aWRlciwgY2xlYW5pbmcgdXAgYWxsIHJlZmVyZW5jZXMsIGxpc3RlbmVycywgZXRjLgogCSAqLwogCXZvaWQgZGlzcG9zZSgpOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvamZhY2UvSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQppbmRleCBiM2NjMzU4Li4xY2U3MmY4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQpAQCAtMjEsNiArMjEsNiBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQogewotCUl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKKwlJdGVtTGFiZWxQcm92aWRlciBidWlsZEl0ZW1MYWJlbFByb3ZpZGVyKE9iamVjdCBpdGVtLCAKKwkJCURlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qcGEyL2RldGFpbHMvamF2YS9KYXZhVWlGYWN0b3J5Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qcGEyL2RldGFpbHMvamF2YS9KYXZhVWlGYWN0b3J5Ml8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3MjEwOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2pwYTIvZGV0YWlscy9qYXZhL0phdmFVaUZhY3RvcnkyXzAuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmpwYTIuZGV0YWlscy5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CisKKy8qKgorICogVXNlIHtAbGluayBKYXZhVWlGYWN0b3J5Ml8wfSB0byBjcmVhdGUgYW55IGphdmEgSlBBIGNvbXBvc2l0ZXMKKyAqIDxwPgorICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKKyAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LgorICogSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcKKyAqIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0CisgKiBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCisgKgorICoKKyAqIEB2ZXJzaW9uIDMuMAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFVaUZhY3RvcnkyXzAKKwlleHRlbmRzIEphdmFVaUZhY3RvcnkKK3sJCisKKwlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSgKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsCisJCUNvbXBvc2l0ZSBwYXJlbnQsCisJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9qcGEyL2RldGFpbHMvb3JtL09ybVhtbFVpRmFjdG9yeTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvanBhMi9kZXRhaWxzL29ybS9Pcm1YbWxVaUZhY3RvcnkyXzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWU5MjJmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvanBhMi9kZXRhaWxzL29ybS9Pcm1YbWxVaUZhY3RvcnkyXzAuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmpwYTIuZGV0YWlscy5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuV2lkZ2V0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFVzZSB7QGxpbmsgT3JtWG1sVWlGYWN0b3J5Ml8wfSB0byBjcmVhdGUgYW55IE9STSBKUEEgY29tcG9zaXRlcworICogPHA+CisgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgorICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuCisgKiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZworICogYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QKKyAqIGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5CYXNlSnBhVWlGYWN0b3J5CisgKgorICogQHZlcnNpb24gMy4wCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3JtWG1sVWlGYWN0b3J5Ml8wIGV4dGVuZHMgT3JtWG1sVWlGYWN0b3J5Cit7CisJCisJSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSgKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4gc3ViamVjdEhvbGRlciwKKwkJQ29tcG9zaXRlIHBhcmVudCwKKwkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvbmF2aWdhdG9yL0pwYU5hdmlnYXRvclByb3ZpZGVyLmphdmEKaW5kZXggODRjN2I3ZS4uYzE5M2U5NyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvbmF2aWdhdG9yL0pwYU5hdmlnYXRvclByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvbmF2aWdhdG9yL0pwYU5hdmlnYXRvclByb3ZpZGVyLmphdmEKQEAgLTksNyArOSw5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvc3RydWN0dXJlL0pwYVN0cnVjdHVyZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9zdHJ1Y3R1cmUvSnBhU3RydWN0dXJlUHJvdmlkZXIuamF2YQppbmRleCAyZmM4NzI0Li45YTRiMjU2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9zdHJ1Y3R1cmUvSnBhU3RydWN0dXJlUHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9zdHJ1Y3R1cmUvSnBhU3RydWN0dXJlUHJvdmlkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDM2ICs5LDMzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuc3RydWN0dXJlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7CiAKIC8qKgogICogVGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldyBjb250ZW50cyBhbmQgCiAgKiBsYWJlbHMgZm9yIGEgZ2l2ZW4gSlBBIHJlc291cmNlLgogICoKLSAqIEB2ZXJzaW9uIDIuMAorICogQHZlcnNpb24gMy4wCiAgKiBAc2luY2UgMi4wCi0gKiAKKyAqCiAgKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAogICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwogICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KICAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKICAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KICAqLwotcHVibGljIGludGVyZmFjZSBKcGFTdHJ1Y3R1cmVQcm92aWRlcgorcHVibGljIGludGVyZmFjZSBKcGFTdHJ1Y3R1cmVQcm92aWRlciAKIHsKLQkvLyBUT0RPIC0gY2hhbmdlIHRoaXMKLQlPYmplY3QgZ2V0SW5wdXQoKTsKLQogCS8qKgogCSAqIEJ1aWxkIGFuIGZhY3RvcnkgdG8gY3JlYXRlIHtAbGluayBUcmVlSXRlbUNvbnRlbnRQcm92aWRlcn1zCiAJICovCiAJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwotCisJCiAJLyoqCiAJICogQnVpbGQgYSBmYWN0b3J5IHRvIGNyZWF0ZSB7QGxpbmsgSXRlbUxhYmVsUHJvdmlkZXJ9cwogCSAqLwogCUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBnZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKTsKLQotCXZvaWQgZGlzcG9zZSgpOwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3RlbXBsYXRlcy9hbm5vdGF0ZWRfZW50aXR5LmphdmFqZXQgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2Fubm90YXRlZF9lbnRpdHkuamF2YWpldAppbmRleCBjNmM2MTUzLi5hMmM3ZDFkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2Fubm90YXRlZF9lbnRpdHkuamF2YWpldAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2Fubm90YXRlZF9lbnRpdHkuamF2YWpldApAQCAtMSw0ICsxLDQgQEAKLTwlQCBqZXQgcGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LnVpIiAKKzwlQCBqZXQgcGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5IiAKIAlpbXBvcnRzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC4qIGphdmEudXRpbC4qICIgCiAJY2xhc3M9IkFubm90YXRlZEVudGl0eVRlbXBsYXRlIiAKICU+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2VudGl0eS5qYXZhamV0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3RlbXBsYXRlcy9lbnRpdHkuamF2YWpldAppbmRleCA3N2NiNmZmLi5mNTgyMzFjIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2VudGl0eS5qYXZhamV0CisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS90ZW1wbGF0ZXMvZW50aXR5LmphdmFqZXQKQEAgLTEsNCArMSw0IEBACi08JUAgamV0IHBhY2thZ2U9Im9yZy5lY2xpcHNlLmpwdC51aSIgCis8JUAgamV0IHBhY2thZ2U9Im9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eSIgCiAJaW1wb3J0cz0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuKiBqYXZhLnV0aWwuKiAiIAogCWNsYXNzPSJFbnRpdHlUZW1wbGF0ZSIgCiAlPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3RlbXBsYXRlcy9pZENsYXNzLmphdmFqZXQgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2lkQ2xhc3MuamF2YWpldAppbmRleCAxYmFhZGQ4Li43OTk3MzQ0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2lkQ2xhc3MuamF2YWpldAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvdGVtcGxhdGVzL2lkQ2xhc3MuamF2YWpldApAQCAtMSw0ICsxLDQgQEAKLTwlQCBqZXQJcGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LnVpIiAKKzwlQCBqZXQJcGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuZW50aXR5IiAKIAlpbXBvcnRzPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC4qIGphdmEudXRpbC4qICIgCiAJY2xhc3M9IklkQ2xhc3NUZW1wbGF0ZSIgCiAlPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyODYwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLUBkb3QKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWIzODliLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnV0aWxpdHk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTViMmMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBKYW4gMTUgMTE6MTI6MjIgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDM4MjYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTU6MzcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjNjBjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eQotQnVuZGxlLVZlcnNpb246IDEuMi4xMDAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQudWkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC51aSIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhYjhkNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZT0xLjUKLWphdmFjVGFyZ2V0PTEuNQotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjEwYjI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ij48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjMDI5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBVdGlsaXR5Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhYmYxMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTsKLQotLyoqCi0gKiBTaW1wbGUgaW50ZXJmYWNlIGZvciBpbXBsZW1lbnRpbmcgdGhlIEdPRiBDb21tYW5kIGRlc2lnbiBwYXR0ZXJuLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tYW5kIHsKLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGNvbW1hbmQKLQkgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4KLQkgKi8KLQl2b2lkIGV4ZWN1dGUoKTsKLQotCWZpbmFsIGNsYXNzIE51bGwgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJcHVibGljIHN0YXRpYyBDb21tYW5kIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJDb21tYW5kLk51bGwiOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQ29tbWFuZCBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkNvbW1hbmQuRGlzYWJsZWQiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OGRiZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L0NvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgY2xpZW50cyB0byBjb250cm9sIGhvdyBhIGNvbW1hbmQgaXMgZXhlY3V0ZWQKLSAqIChlLmcuIGRpc3BhdGNoaW5nIHRoZSBjb21tYW5kIHRvIHRoZSBVSSB0aHJlYWQpLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tYW5kRXhlY3V0b3IgewotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuCi0JICovCi0Jdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCk7Ci0KLQotCS8qKgotCSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBleGVjdXRvciBpbnRlcmZhY2UKLQkgKiB0aGF0IHNpbXBseSBleGVjdXRlcyB0aGUgY29tbWFuZCB3aXRob3V0IGFueSBzb3J0IG9mIGVuaGFuY2VtZW50LgotCSAqLwotCWZpbmFsIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBDb21tYW5kRXhlY3V0b3IgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmRFeGVjdXRvciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7Ci0JCXB1YmxpYyBzdGF0aWMgQ29tbWFuZEV4ZWN1dG9yIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkNvbW1hbmRFeGVjdXRvci5EZWZhdWx0IjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L0NvbW1hbmRFeGVjdXRvclByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExZjVjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7Ci0KLS8qKgotICogWWV0IGFub3RoZXIgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gdG8gYWxsb3cgY2xpZW50cyB0byBjb250cm9sCi0gKiBob3cgYSBjb21tYW5kIGlzIGV4ZWN1dGVkIGJ5IHRoZSBzZXJ2ZXIKLSAqIChlLmcuIGRpc3BhdGNoaW5nIHRoZSBjb21tYW5kIHRvIHRoZSBVSSB0aHJlYWQpLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tYW5kRXhlY3V0b3JQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmQgZXhlY3V0b3IuCi0JICovCi0JQ29tbWFuZEV4ZWN1dG9yIGdldENvbW1hbmRFeGVjdXRvcigpOwotCi0KLQkvKioKLQkgKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgZXhlY3V0b3IgcHJvdmlkZXIKLQkgKiBpbnRlcmZhY2UgdGhlIHJldHVybnMgdGhlIGRlZmF1bHQgY29tbWFuZCBleGVjdXRvci4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmRFeGVjdXRvclByb3ZpZGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJcHVibGljIHN0YXRpYyBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIENvbW1hbmRFeGVjdXRvciBnZXRDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCQlyZXR1cm4gQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIuRGVmYXVsdCI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9GaWx0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4YzdmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5OwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIGZpbHRlciBvYmplY3RzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXI8VD4gewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgImFjY2VwdGVkIiBieSB0aGUKLQkgKiBmaWx0ZXIuIFRoZSBzZW1hbnRpY3Mgb2YgImFjY2VwdCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JYm9vbGVhbiBhY2NlcHQoVCBvKTsKLQotCi0JZmluYWwgY2xhc3MgTnVsbDxTPiBpbXBsZW1lbnRzIEZpbHRlcjxTPiB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbHRlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIG5vdGhpbmcgaXMgZmlsdGVyZWQgLSBldmVyeXRoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG5leHQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJGaWx0ZXIuTnVsbCI7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIEZpbHRlcjxTPiB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbHRlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG5leHQpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJGaWx0ZXIuRGlzYWJsZWQiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvSmF2YVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9KYXZhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzQ3ZGJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9KYXZhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlc2NyaWJlcyBhIEphdmEgdHlwZTsgaS5lLiBpdHMgImVsZW1lbnQgdHlwZSIKLSAqIGFuZCBpdHMgImFycmF5IGRlcHRoIi4gVGhlIGVsZW1lbnQgdHlwZSBpcyByZWZlcmVuY2VkIGJ5IG5hbWUsCi0gKiBhbGxvd2luZyB1cyB0byByZWZlcmVuY2UgY2xhc3NlcyB0aGF0IGFyZSBub3QgKG9yIGNhbm5vdCBiZSkgbG9hZGVkLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVR5cGUKLQlleHRlbmRzIENvbXBhcmFibGU8SmF2YVR5cGU+Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHR5cGUncyAiZWxlbWVudCB0eXBlIi4KLQkgKiBBIG1lbWJlciB0eXBlIHdpbGwgaGF2ZSBvbmUgb3IgbW9yZSAnJCcgY2hhcmFjdGVycyBpbiBpdHMgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyAiYXJyYXkgZGVwdGgiLgotCSAqLwotCWludCBnZXRBcnJheURlcHRoKCk7Ci0KLQlib29sZWFuIGlzQXJyYXkoKTsKLQotCS8qKgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCWJvb2xlYW4gaXNQcmltaXRpdmUoKTsKLQotCS8qKgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCWJvb2xlYW4gaXNQcmltaXRpdmVXcmFwcGVyKCk7Ci0KLQkvKioKLQkgKiBOQjogdmFyaWFibGVzIGNhbm5vdCBiZSBkZWNsYXJlZCAndm9pZCcKLQkgKi8KLQlib29sZWFuIGlzVmFyaWFibGVQcmltaXRpdmUoKTsKLQotCS8qKgotCSAqIE5COiB2YXJpYWJsZXMgY2Fubm90IGJlIGRlY2xhcmVkICd2b2lkJwotCSAqLwotCWJvb2xlYW4gaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSdzIGVsZW1lbnQgdHlwZSBhbmQgYXJyYXkgZGVwdGguCi0JICovCi0JQ2xhc3M8Pz4gZ2V0SmF2YUNsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgbWF0Y2hlcyB0aGF0Ci0JICogcmV0dXJuZWQgYnkgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqIChlLmcuICJbW0oiLCAiW0xqYXZhLmxhbmcuT2JqZWN0OyIsICJqYXZhLnV0aWwuTWFwJEVudHJ5IikuCi0JICovCi0JU3RyaW5nIGdldEphdmFDbGFzc05hbWUoKTsKLQotCWJvb2xlYW4gZXF1YWxzKFN0cmluZyBvdGhlckVsZW1lbnRUeXBlTmFtZSwgaW50IG90aGVyQXJyYXlEZXB0aCk7Ci0KLQlib29sZWFuIGRlc2NyaWJlcyhTdHJpbmcgY2xhc3NOYW1lKTsKLQotCWJvb2xlYW4gZGVzY3JpYmVzKENsYXNzPD8+IGphdmFDbGFzcyk7Ci0KLQlib29sZWFuIGVxdWFscyhKYXZhVHlwZSBvdGhlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgaW4gc291cmNlIGNvZGU6Ci0JICogICAgICJbW0oiID0+ICJsb25nW11bXSIKLQkgKiAgICAgImphdmEudXRpbC5NYXAkRW50cnkiID0+ICJqYXZhLnV0aWwuTWFwLkVudHJ5IgotCSAqLwotCVN0cmluZyBkZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogQXBwZW5kIHRoZSB2ZXJzaW9uIG9mIHRoZSB0eXBlJ3MgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGluIHNvdXJjZSBjb2RlOgotCSAqICAgICAiW1tKIiA9PiAibG9uZ1tdW10iCi0JICogICAgICJqYXZhLnV0aWwuTWFwJEVudHJ5IiA9PiAiamF2YS51dGlsLk1hcC5FbnRyeSIKLQkgKi8KLQl2b2lkIGFwcGVuZERlY2xhcmF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgdmVyc2lvbiBvZiB0aGUgdHlwZSdzIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiBzb3VyY2UgY29kZToKLQkgKiAgICAgIltbSiIgPT4gImxvbmdbXVtdIgotCSAqICAgICAiamF2YS51dGlsLk1hcCRFbnRyeSIgPT4gImphdmEudXRpbC5NYXAuRW50cnkiCi0JICovCi0Jdm9pZCBwcmludERlY2xhcmF0aW9uT24oUHJpbnRXcml0ZXIgcHcpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvTWV0aG9kU2lnbmF0dXJlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvTWV0aG9kU2lnbmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZmNiYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L01ldGhvZFNpZ25hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVzY3JpYmVzIGEgSmF2YSBtZXRob2Qgc2lnbmF0dXJlOyBpLmUuIGl0cyAibmFtZSIKLSAqIGFuZCBpdHMgInBhcmFtZXRlciB0eXBlcyIuIFRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIHJlZmVyZW5jZWQgYnkgbmFtZSwKLSAqIGFsbG93aW5nIHVzIHRvIHJlZmVyZW5jZSBjbGFzc2VzIHRoYXQgYXJlIG5vdCAob3IgY2Fubm90IGJlKSBsb2FkZWQuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RTaWduYXR1cmUKLQlleHRlbmRzIENvbXBhcmFibGU8TWV0aG9kU2lnbmF0dXJlPgotewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QncyBuYW1lLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCdzIHBhcmFtZXRlciB0eXBlcy4KLQkgKi8KLQlKYXZhVHlwZVtdIGdldFBhcmFtZXRlclR5cGVzKCk7Ci0KLQlib29sZWFuIGVxdWFscyhTdHJpbmcgb3RoZXJOYW1lLCBKYXZhVHlwZVtdIG90aGVyUGFyYW1ldGVyVHlwZXMpOwotCi0JYm9vbGVhbiBlcXVhbHMoTWV0aG9kU2lnbmF0dXJlIG90aGVyKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kIHNpZ25hdHVyZToKLQkgKiAgICAgImZvbyhpbnQsIGphdmEubGFuZy5TdHJpbmcpIgotCSAqLwotCVN0cmluZyBnZXRTaWduYXR1cmUoKTsKLQotCS8qKgotCSAqIEFwcGVuZCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kIHNpZ25hdHVyZToKLQkgKiAgICAgImZvbyhpbnQsIGphdmEubGFuZy5TdHJpbmcpIgotCSAqLwotCXZvaWQgYXBwZW5kU2lnbmF0dXJlVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0KLQkvKioKLQkgKiBQcmludCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kIHNpZ25hdHVyZToKLQkgKiAgICAgImZvbyhpbnQsIGphdmEubGFuZy5TdHJpbmcpIgotCSAqLwotCXZvaWQgcHJpbnRTaWduYXR1cmVPbihQcmludFdyaXRlciBwdyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9BYnN0cmFjdEFzc29jaWF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQWJzdHJhY3RBc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmZhNjFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9BYnN0cmFjdEFzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEltcGxlbWVudCBzb21lIG9mIHRoZSBtZXRob2RzIGluIEFzc29jaWF0aW9uIHRoYXQgY2FuCi0gKiBiZSBkZWZpbmVkIGluIHRlcm1zIG9mIHRoZSBvdGhlciBtZXRob2RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBc3NvY2lhdGlvbjxLLCBWPgotCWltcGxlbWVudHMgQXNzb2NpYXRpb248SywgVj4KLXsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0QXNzb2NpYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBBc3NvY2lhdGlvbikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlBc3NvY2lhdGlvbjw/LCA/PiBvdGhlciA9IChBc3NvY2lhdGlvbjw/LCA/PikgbzsKLQkJcmV0dXJuICh0aGlzLmtleSgpID09IG51bGwgPwotCQkJCQlvdGhlci5rZXkoKSA9PSBudWxsIDogdGhpcy5rZXkoKS5lcXVhbHMob3RoZXIua2V5KCkpKQotCQkJJiYgKHRoaXMudmFsdWUoKSA9PSBudWxsID8KLQkJCQkJb3RoZXIudmFsdWUoKSA9PSBudWxsIDogdGhpcy52YWx1ZSgpLmVxdWFscyhvdGhlci52YWx1ZSgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAodGhpcy5rZXkoKSA9PSBudWxsID8gMCA6IHRoaXMua2V5KCkuaGFzaENvZGUoKSkKLQkJCV4gKHRoaXMudmFsdWUoKSA9PSBudWxsID8gMCA6IHRoaXMudmFsdWUoKS5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMua2V5KCkgKyAiID0+ICIgKyB0aGlzLnZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQXNzb2NpYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzEzMGU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgZGVmaW5pdGlvbiBvZiBhbiBvYmplY3QgcGFpcmluZy4KLSAqIFRoZSBrZXkgaXMgaW1tdXRhYmxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFzc29jaWF0aW9uPEssIFY+IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNzb2NpYXRpb24ncyBrZXkuCi0JICovCi0JSyBrZXkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNzb2NpYXRpb24ncyB2YWx1ZS4KLQkgKi8KLQlWIHZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGFzc29jaWF0aW9uJ3MgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlWIHNldFZhbHVlKFYgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYm90aCB0aGUgYXNzb2NpYXRpb25zJyBrZXlzIGFuZCB2YWx1ZXMKLQkgKiBhcmUgZXF1YWwuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pOwotCi0JLyoqCi0JICogUmV0dXJuIGEgaGFzaCBjb2RlIGJhc2VkIG9uIHRoZSBhc3NvY2lhdGlvbidzCi0JICoga2V5IGFuZCB2YWx1ZS4KLQkgKi8KLQlpbnQgaGFzaENvZGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JhZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTkwNWM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLQotLyoqCi0gKiBBIGNvbGxlY3Rpb24gdGhhdCBhbGxvd3MgZHVwbGljYXRlIGVsZW1lbnRzLgotICogPHA+Ci0gKiBUaGUgPGNvZGU+QmFnPC9jb2RlPiBpbnRlcmZhY2UgcGxhY2VzIGFkZGl0aW9uYWwgc3RpcHVsYXRpb25zLAotICogYmV5b25kIHRob3NlIGluaGVyaXRlZCBmcm9tIHRoZSA8Y29kZT5qYXZhLnV0aWwuQ29sbGVjdGlvbjwvY29kZT4gaW50ZXJmYWNlLAotICogb24gdGhlIGNvbnRyYWN0cyBvZiB0aGUgPGNvZGU+ZXF1YWxzPC9jb2RlPiBhbmQgPGNvZGU+aGFzaENvZGU8L2NvZGU+IG1ldGhvZHMuCi0gKiAKLSAqIEBzZWUgSGFzaEJhZwotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgQmFnPEU+IGV4dGVuZHMgamF2YS51dGlsLkNvbGxlY3Rpb248RT4gewotCi0JLyoqCi0JICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIGJhZyBmb3IgZXF1YWxpdHkuIFJldHVybnMKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhbHNvIGEgYmFnLCB0aGUgdHdvIGJhZ3MKLQkgKiBoYXZlIHRoZSBzYW1lIHNpemUsIGFuZCBldmVyeSBtZW1iZXIgb2YgdGhlIHNwZWNpZmllZCBiYWcgaXMKLQkgKiBjb250YWluZWQgaW4gdGhpcyBiYWcgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgKG9yIGVxdWl2YWxlbnRseSwKLQkgKiBldmVyeSBtZW1iZXIgb2YgdGhpcyBiYWcgaXMgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgYmFnIHdpdGggdGhlIHNhbWUKLQkgKiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMpLiBUaGlzIGRlZmluaXRpb24gZW5zdXJlcyB0aGF0IHRoZQotCSAqIGVxdWFscyBtZXRob2Qgd29ya3MgcHJvcGVybHkgYWNyb3NzIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCi0JICogYmFnIGludGVyZmFjZS4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhPYmplY3Qgbyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgYmFnLiBUaGUgaGFzaCBjb2RlIG9mIGEgYmFnIGlzCi0JICogZGVmaW5lZCB0byBiZSB0aGUgc3VtIG9mIHRoZSBoYXNoIGNvZGVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgYmFnLAotCSAqIHdoZXJlIHRoZSBoYXNoY29kZSBvZiBhIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnQgaXMgZGVmaW5lZCB0byBiZSB6ZXJvLgotCSAqIFRoaXMgZW5zdXJlcyB0aGF0IDxjb2RlPmIxLmVxdWFscyhiMik8L2NvZGU+IGltcGxpZXMgdGhhdAotCSAqIDxjb2RlPmIxLmhhc2hDb2RlKCkgPT0gYjIuaGFzaENvZGUoKTwvY29kZT4gZm9yIGFueSB0d28gYmFncwotCSAqIDxjb2RlPmIxPC9jb2RlPiBhbmQgPGNvZGU+YjI8L2NvZGU+LCBhcyByZXF1aXJlZCBieSB0aGUgZ2VuZXJhbAotCSAqIGNvbnRyYWN0IG9mIHRoZSA8Y29kZT5PYmplY3QuaGFzaENvZGU8L2NvZGU+IG1ldGhvZC4KLQkgKi8KLQlpbnQgaGFzaENvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG9jY3VycyBpbiB0aGUgYmFnLgotCSAqLwotCWludCBjb3VudChPYmplY3Qgbyk7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMgdG8gdGhlIGJhZy4KLQkgKi8KLQlib29sZWFuIGFkZChFIG8sIGludCBjb3VudCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QKLQkgKiBmcm9tIHRoZSBiYWcuIFJldHVybiB3aGV0aGVyIHRoZSBiYWcgY2hhbmdlZC4KLQkgKi8KLQlib29sZWFuIHJlbW92ZShPYmplY3QgbywgaW50IGNvdW50KTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgZWFjaCBpdGVtIGluIHRoZSBiYWcKLQkgKiBvbmNlIGFuZCBvbmx5IG9uY2UsIGlycmVzcGVjdGl2ZSBvZiBob3cgbWFueSB0aW1lcwotCSAqIHRoZSBpdGVtIHdhcyBhZGRlZCB0byB0aGUgYmFnLgotCSAqLwotCWphdmEudXRpbC5JdGVyYXRvcjxFPiB1bmlxdWVJdGVyYXRvcigpOwotCi0KLQlmaW5hbCBjbGFzcyBFbXB0eTxFPiBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbjxFPiBpbXBsZW1lbnRzIEJhZzxFPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmFnIElOU1RBTkNFID0gbmV3IEVtcHR5KCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxUPiBCYWc8VD4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEVtcHR5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBzaXplKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPEU+IHVuaXF1ZUl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8sIGludCBjb3VudCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGFkZChFIG8sIGludCBjb3VudCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gPT0gdGhpcykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKCAhIChvIGluc3RhbmNlb2YgQmFnKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiAoKEJhZzw/Pikgbykuc2l6ZSgpID09IDA7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaWRpRmlsdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmlkaUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTAyZjllLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaWRpRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIGZpbHRlciBvYmplY3RzCi0gKiBpbiBib3RoIGRpcmVjdGlvbnMuCi0gKiAKLSAqIElmIGFueW9uZSBjYW4gY29tZSB1cCB3aXRoIGEgYmV0dGVyIGNsYXNzIG5hbWUKLSAqIGFuZC9vciBtZXRob2QgbmFtZSwgSSB3b3VsZCBsb3ZlIHRvIGhlYXIgaXQuICB+Ymp2Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmlkaUZpbHRlcjxUPiBleHRlbmRzIEZpbHRlcjxUPiB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyAiYWNjZXB0ZWQiIGJ5IHRoZQotCSAqICJyZXZlcnNlIiBmaWx0ZXIuIFdoYXQgdGhhdCBtZWFucyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjbGllbnQuCi0JICovCi0JYm9vbGVhbiByZXZlcnNlQWNjZXB0KFQgbyk7Ci0KLQotCWZpbmFsIGNsYXNzIE51bGw8Uz4gaW1wbGVtZW50cyBCaWRpRmlsdGVyPFM+IHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaUZpbHRlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBCaWRpRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBub3RoaW5nIGlzIGZpbHRlcmVkIC0gZXZlcnl0aGluZyBpcyBhY2NlcHRlZAotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBuZXh0KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBub3RoaW5nIGlzICJyZXZlcnNlLWZpbHRlcmVkIiAtIGV2ZXJ5dGhpbmcgaXMgYWNjZXB0ZWQKLQkJcHVibGljIGJvb2xlYW4gcmV2ZXJzZUFjY2VwdChTIG8pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpRmlsdGVyLk51bGwiOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQ8Uz4gaW1wbGVtZW50cyBCaWRpRmlsdGVyPFM+IHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaUZpbHRlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gQmlkaUZpbHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBuZXh0KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIGJvb2xlYW4gcmV2ZXJzZUFjY2VwdChTIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpRmlsdGVyLkRpc2FibGVkIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JpZGlTdHJpbmdDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZDhmNGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JpZGlTdHJpbmdDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIHRyYW5zZm9ybSBvYmplY3RzCi0gKiBpbnRvIHN0cmluZ3MgYW5kIHZpY2UgdmVyc2EuCi0gKiAKLSAqIElmIGFueW9uZSBjYW4gY29tZSB1cCB3aXRoIGEgYmV0dGVyIGNsYXNzIG5hbWUKLSAqIGFuZC9vciBtZXRob2QgbmFtZSwgSSB3b3VsZCBsb3ZlIHRvIGhlYXIgaXQuICB+Ymp2Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmlkaVN0cmluZ0NvbnZlcnRlcjxUPiBleHRlbmRzIFN0cmluZ0NvbnZlcnRlcjxUPiB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIGludG8gYW4gb2JqZWN0LgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgImNvbnZlcnQgdG8gb2JqZWN0IiBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotCSAqIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKiBUeXBpY2FsbHksIGlmIHRoZSBzdHJpbmcgaXMgbnVsbCwgbnVsbCBpcyByZXR1cm5lZC4KLQkgKi8KLQlUIGNvbnZlcnRUb09iamVjdChTdHJpbmcgcyk7Ci0KLQotCWZpbmFsIGNsYXNzIERlZmF1bHQ8Uz4gaW1wbGVtZW50cyBCaWRpU3RyaW5nQ29udmVydGVyPFM+IHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVN0cmluZ0NvbnZlcnRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBCaWRpU3RyaW5nQ29udmVydGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgcmV0dXJuIHRoZSBvYmplY3QncyAjdG9TdHJpbmcoKSByZXN1bHQKLQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoUyBvKSB7Ci0JCQlyZXR1cm4gKG8gPT0gbnVsbCkgPyBudWxsIDogby50b1N0cmluZygpOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIHN0cmluZwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIFMgY29udmVydFRvT2JqZWN0KFN0cmluZyBzKSB7Ci0JCQlyZXR1cm4gKFMpIHM7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdCI7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIEJpZGlTdHJpbmdDb252ZXJ0ZXI8Uz4gewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpU3RyaW5nQ29udmVydGVyIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBCaWRpU3RyaW5nQ29udmVydGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFMgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTIGNvbnZlcnRUb09iamVjdChTdHJpbmcgcykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQiOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgQm9vbGVhbkNvbnZlcnRlciBpbXBsZW1lbnRzIEJpZGlTdHJpbmdDb252ZXJ0ZXI8Qm9vbGVhbj4gewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8Qm9vbGVhbj4gSU5TVEFOQ0UgPSBuZXcgQm9vbGVhbkNvbnZlcnRlcigpOwotCQlwdWJsaWMgc3RhdGljIEJpZGlTdHJpbmdDb252ZXJ0ZXI8Qm9vbGVhbj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEJvb2xlYW5Db252ZXJ0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8qKiBSZXR1cm4gInRydWUiIGlmIHRoZSBCb29sZWFuIGlzIHRydWUsIG90aGVyd2lzZSByZXR1cm4gImZhbHNlIi4gKi8KLQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoQm9vbGVhbiBiKSB7Ci0JCQlyZXR1cm4gKGIgPT0gbnVsbCkgPyBudWxsIDogYi50b1N0cmluZygpOwotCQl9Ci0JCS8qKiBSZXR1cm4gQm9vbGVhbi5UUlVFIGlmIHRoZSBzdHJpbmcgaXMgInRydWUiIChjYXNlLWluc2Vuc2l0aXZlKSwgb3RoZXJ3aXNlIHJldHVybiBCb29sZWFuLkZBTFNFLiAqLwotCQlwdWJsaWMgQm9vbGVhbiBjb252ZXJ0VG9PYmplY3QoU3RyaW5nIHMpIHsKLQkJCXJldHVybiAocyA9PSBudWxsKSA/IG51bGwgOiBCb29sZWFuLnZhbHVlT2Yocyk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlciI7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBJbnRlZ2VyQ29udmVydGVyIGltcGxlbWVudHMgQmlkaVN0cmluZ0NvbnZlcnRlcjxJbnRlZ2VyPiB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVN0cmluZ0NvbnZlcnRlcjxJbnRlZ2VyPiBJTlNUQU5DRSA9IG5ldyBJbnRlZ2VyQ29udmVydGVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQmlkaVN0cmluZ0NvbnZlcnRlcjxJbnRlZ2VyPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgSW50ZWdlckNvbnZlcnRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLyoqIEludGVnZXIncyAjdG9TdHJpbmcoKSB3b3JrcyB3ZWxsLiAqLwotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhJbnRlZ2VyIGludGVnZXIpIHsKLQkJCXJldHVybiAoaW50ZWdlciA9PSBudWxsKSA/IG51bGwgOiBpbnRlZ2VyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLyoqIENvbnZlcnQgdGhlIHN0cmluZyB0byBhbiBJbnRlZ2VyLCBpZiBwb3NzaWJsZS4gKi8KLQkJcHVibGljIEludGVnZXIgY29udmVydFRvT2JqZWN0KFN0cmluZyBzKSB7Ci0JCQlyZXR1cm4gKHMgPT0gbnVsbCkgPyBudWxsIDogSW50ZWdlci52YWx1ZU9mKHMpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmlkaVRyYW5zZm9ybWVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmlkaVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNmQzZDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JpZGlUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBVc2VkIGJ5IHZhcmlvdXMgInBsdWdnYWJsZSIgY2xhc3NlcyB0byB0cmFuc2Zvcm0gb2JqZWN0cwotICogaW4gYm90aCBkaXJlY3Rpb25zLgotICogCi0gKiBJZiBhbnlvbmUgY2FuIGNvbWUgdXAgd2l0aCBhIGJldHRlciBjbGFzcyBuYW1lCi0gKiBhbmQvb3IgbWV0aG9kIG5hbWUsIEkgd291bGQgbG92ZSB0byBoZWFyIGl0LiAgfmJqdgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJpZGlUcmFuc2Zvcm1lcjxUMSwgVDI+IGV4dGVuZHMgVHJhbnNmb3JtZXI8VDEsIFQyPiB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJyZXZlcnNlLXRyYW5zZm9ybWVkIiBvYmplY3QuCi0JICogVGhlIHNlbWFudGljcyBvZiAicmV2ZXJzZS10cmFuc2Zvcm0iIGlzIGRldGVybWluZWQgYnkgdGhlCi0JICogY29udHJhY3QgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLgotCSAqLwotCVQxIHJldmVyc2VUcmFuc2Zvcm0oVDIgbyk7Ci0KLQotCWZpbmFsIGNsYXNzIE51bGw8UzEsIFMyPiBpbXBsZW1lbnRzIEJpZGlUcmFuc2Zvcm1lcjxTMSwgUzI+IHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVRyYW5zZm9ybWVyIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFIxLCBSMj4gQmlkaVRyYW5zZm9ybWVyPFIxLCBSMj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCwgdW5jaGFuZ2VkCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgUzIgdHJhbnNmb3JtKFMxIG8pIHsKLQkJCXJldHVybiAoUzIpIG87Ci0JCX0KLQkJLy8gc2ltcGx5IHJldHVybiB0aGUgb2JqZWN0LCB1bmNoYW5nZWQKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBTMSByZXZlcnNlVHJhbnNmb3JtKFMyIG8pIHsKLQkJCXJldHVybiAoUzEpIG87Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlUcmFuc2Zvcm1lci5OdWxsIjsKLQkJfQotCX0KLQotCWZpbmFsIGNsYXNzIERpc2FibGVkPFMxLCBTMj4gaW1wbGVtZW50cyBCaWRpVHJhbnNmb3JtZXI8UzEsIFMyPiB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlUcmFuc2Zvcm1lciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8UjEsIFIyPiBCaWRpVHJhbnNmb3JtZXI8UjEsIFIyPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgUzIgdHJhbnNmb3JtKFMxIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgUzEgcmV2ZXJzZVRyYW5zZm9ybShTMiBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQmlkaVRyYW5zZm9ybWVyLkRpc2FibGVkIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0JpdFRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQml0VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0ZjViYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQml0VG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEFzc29ydGVkIGJpdCB0b29scwotICovCi1wdWJsaWMgY2xhc3MgQml0VG9vbHMgewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZsYWdJc1NldChpbnQgZmxhZ3MsIGludCBmbGFnVG9DaGVjaykgewotCQlyZXR1cm4gYWxsRmxhZ3NBcmVTZXQoZmxhZ3MsIGZsYWdUb0NoZWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZsYWdJc09mZihpbnQgZmxhZ3MsIGludCBmbGFnVG9DaGVjaykgewotCQlyZXR1cm4gYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIGZsYWdUb0NoZWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIE9OTFkgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5RmxhZ0lzU2V0KGludCBmbGFncywgaW50IGZsYWdUb0NoZWNrKSB7Ci0JCXJldHVybiBvbmx5RmxhZ3NBcmVTZXQoZmxhZ3MsIGZsYWdUb0NoZWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIE9OTFkgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdJc09mZihpbnQgZmxhZ3MsIGludCBmbGFnVG9DaGVjaykgewotCQlyZXR1cm4gb25seUZsYWdzQXJlT2ZmKGZsYWdzLCBmbGFnVG9DaGVjayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbGwgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWxsRmxhZ3NBcmVTZXQoaW50IGZsYWdzLCBpbnQgZmxhZ3NUb0NoZWNrKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBmbGFnc1RvQ2hlY2spID09IGZsYWdzVG9DaGVjazsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFsbCB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWxsRmxhZ3NBcmVPZmYoaW50IGZsYWdzLCBpbnQgZmxhZ3NUb0NoZWNrKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBmbGFnc1RvQ2hlY2spID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBPTkxZIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCBmbGFnc1RvQ2hlY2spICYmIGFsbEZsYWdzQXJlT2ZmKGZsYWdzLCB+ZmxhZ3NUb0NoZWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIE9OTFkgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIGFsbEZsYWdzQXJlT2ZmKGZsYWdzLCBmbGFnc1RvQ2hlY2spICYmIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCB+ZmxhZ3NUb0NoZWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFueSBvbmUgb2YgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYW55RmxhZ3NBcmVTZXQoaW50IGZsYWdzLCBpbnQgZmxhZ3NUb0NoZWNrKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBmbGFnc1RvQ2hlY2spICE9IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbnkgb25lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbnlGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIChmbGFncyAmIGZsYWdzVG9DaGVjaykgIT0gZmxhZ3NUb0NoZWNrOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYWxsIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFsbEZsYWdzQXJlU2V0KGludCBmbGFncywgaW50W10gZmxhZ3NUb0NoZWNrKSB7Ci0JCWZvciAoaW50IGkgPSBmbGFnc1RvQ2hlY2subGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBhbGxGbGFnc0FyZVNldChmbGFncywgZmxhZ3NUb0NoZWNrW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFsbCB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWxsRmxhZ3NBcmVPZmYoaW50IGZsYWdzLCBpbnRbXSBmbGFnc1RvQ2hlY2spIHsKLQkJZm9yIChpbnQgaSA9IGZsYWdzVG9DaGVjay5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGFsbEZsYWdzQXJlT2ZmKGZsYWdzLCBmbGFnc1RvQ2hlY2tbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5RmxhZ3NBcmVTZXQoaW50IGZsYWdzLCBpbnRbXSBmbGFnc1RvQ2hlY2spIHsKLQkJaW50IGNvbWJpbmVkRmxhZ3MgPSBvckZsYWdzKGZsYWdzVG9DaGVjayk7Ci0JCXJldHVybiBhbGxGbGFnc0FyZVNldChmbGFncywgY29tYmluZWRGbGFncykgJiYgYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIH5jb21iaW5lZEZsYWdzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIE9OTFkgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludFtdIGZsYWdzVG9DaGVjaykgewotCQlpbnQgY29tYmluZWRGbGFncyA9IG9yRmxhZ3MoZmxhZ3NUb0NoZWNrKTsKLQkJcmV0dXJuIGFsbEZsYWdzQXJlT2ZmKGZsYWdzLCBjb21iaW5lZEZsYWdzKSAmJiBhbGxGbGFnc0FyZVNldChmbGFncywgfmNvbWJpbmVkRmxhZ3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYW55IG9uZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbnlGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludFtdIGZsYWdzVG9DaGVjaykgewotCQlmb3IgKGludCBpID0gZmxhZ3NUb0NoZWNrLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYW55RmxhZ3NBcmVTZXQoZmxhZ3MsIGZsYWdzVG9DaGVja1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbnkgb25lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbnlGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludFtdIGZsYWdzVG9DaGVjaykgewotCQlmb3IgKGludCBpID0gZmxhZ3NUb0NoZWNrLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYW55RmxhZ3NBcmVPZmYoZmxhZ3MsIGZsYWdzVG9DaGVja1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogT1IgYWxsIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyB0b2dldGhlciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgb3JGbGFncyhpbnRbXSBmbGFncykgewotCQlpbnQgbGFzdCA9IGZsYWdzLmxlbmd0aCAtIDE7Ci0JCWludCByZXN1bHQgPSBmbGFnc1tsYXN0XTsKLQkJZm9yIChpbnQgaSA9IGxhc3Q7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0IHw9IGZsYWdzW2ldOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQU5EIGFsbCB0aGUgc3BlY2lmaWVkICdmbGFncycgdG9nZXRoZXIgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGFuZEZsYWdzKGludFtdIGZsYWdzKSB7Ci0JCWludCBsYXN0ID0gZmxhZ3MubGVuZ3RoIC0gMTsKLQkJaW50IHJlc3VsdCA9IGZsYWdzW2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHQgJj0gZmxhZ3NbaV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBYT1IgYWxsIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyB0b2dldGhlciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgeG9yRmxhZ3MoaW50W10gZmxhZ3MpIHsKLQkJaW50IGxhc3QgPSBmbGFncy5sZW5ndGggLSAxOwotCQlpbnQgcmVzdWx0ID0gZmxhZ3NbbGFzdF07Ci0JCWZvciAoaW50IGkgPSBsYXN0OyBpLS0gPiAwOyApIHsKLQkJCXJlc3VsdCBePSBmbGFnc1tpXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQml0VG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NsYXNzVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9DbGFzc1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYjdjNTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NsYXNzVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyByZWxhdGVkIHRvIHRoZSBqYXZhLmxhbmcucmVmbGVjdCBwYWNrYWdlLgotICogVGhlc2UgbWV0aG9kcyBwcm92aWRlIHNob3J0Y3V0cyBmb3IgbWFuaXB1bGF0aW5nIG9iamVjdHMgdmlhCi0gKiByZWZsZWN0aW9uOyBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggZmllbGRzIGFuZC9vciBtZXRob2RzIHRoYXQKLSAqIGFyZSBub3QgcHVibGljbHkgYWNjZXNzaWJsZSBvciBhcmUgaW5oZXJpdGVkLgotICogCi0gKiBJbiBtb3N0IGNhc2VzLCBhbGwgdGhlIGV4Y2VwdGlvbnMgYXJlIGhhbmRsZWQgYW5kCi0gKiB3cmFwcGVkIGluIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uczsgc28gdGhlc2UgbWV0aG9kcyBzaG91bGQKLSAqIGJlIHVzZWQgd2hlbiB5b3UgYXJlIGNvbmZpZGVudCB0aGF0IHlvdSB3aWxsIG5vdCBoYXZpbmcgYW55IHByb2JsZW1zCi0gKiB1c2luZyByZWZsZWN0aW9uLgotICogCi0gKiBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZiBtZXRob2RzIHdob3NlIG5hbWVzCi0gKiBiZWdpbiB3aXRoICJhdHRlbXB0Ii4gVGhlc2UgbWV0aG9kcyB3aWxsIHRocm93IGEgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gKiBvciBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB3aGVuIGFwcHJvcHJpYXRlLCBhbGxvd2luZyB5b3UgdG8gcHJvYmUKLSAqIGZvciBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIHByZXNlbnQgYnV0IG1pZ2h0IG5vdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENsYXNzVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIFpFUk9fUEFSQU1FVEVSX1RZUEVTID0gbmV3IENsYXNzWzBdOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gWkVST19QQVJBTUVURVJTID0gbmV3IE9iamVjdFswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTdHJpbmdUb29scy5DUjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IgPSAnJCc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQVJSQVlfSU5ESUNBVE9SID0gJ1snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX09QRU4gPSAnWyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFRZUEVfREVDTEFSQVRJT05fQVJSQVlfQ0xPU0UgPSAnXSc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUkVGRVJFTkNFX0NMQVNTX0NPREUgPSAnTCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUiA9ICc7JzsKLQkKLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVbXSBQUklNSVRJVkVTOyAgLy8gcHNldWRvLSdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEJZVEVfQ09ERSA9ICdCJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hBUl9DT0RFID0gJ0MnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfQ09ERSA9ICdEJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRkxPQVRfQ09ERSA9ICdGJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSU5UX0NPREUgPSAnSSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIExPTkdfQ09ERSA9ICdKJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgU0hPUlRfQ09ERSA9ICdTJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQk9PTEVBTl9DT0RFID0gJ1onOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBWT0lEX0NPREUgPSAnVic7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPSAtMTsgIC8vIHBzZXVkby0nZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCXByaXZhdGUgc3RhdGljIGludCBNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEggPSAtMTsgIC8vIHBzZXVkby0nZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9DTEFTU19OQU1FID0gdm9pZC5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9XUkFQUEVSX0NMQVNTX05BTUUgPSBqYXZhLmxhbmcuVm9pZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIGZpZWxkcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNhbGxGaWVsZHMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGRbXSBhbGxGaWVsZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVN0YWNrPEZpZWxkPiBzdGFjayA9IG5ldyBTdGFjazxGaWVsZD4oKTsKLQkJZm9yIChDbGFzczw/PiB0ZW1wQ2xhc3MgPSBqYXZhQ2xhc3M7IHRlbXBDbGFzcyAhPSBudWxsOyB0ZW1wQ2xhc3MgPSB0ZW1wQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKSB7Ci0JCQlwdXNoRGVjbGFyZWRGaWVsZHModGVtcENsYXNzLCBzdGFjayk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShzdGFjayk7Ci0JCXJldHVybiBzdGFjay50b0FycmF5KG5ldyBGaWVsZFtzdGFjay5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbWV0aG9kcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjYWxsTWV0aG9kcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RbXSBhbGxNZXRob2RzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlTdGFjazxNZXRob2Q+IHN0YWNrID0gbmV3IFN0YWNrPE1ldGhvZD4oKTsKLQkJZm9yIChDbGFzczw/PiB0ZW1wQ2xhc3MgPSBqYXZhQ2xhc3M7IHRlbXBDbGFzcyAhPSBudWxsOyB0ZW1wQ2xhc3MgPSB0ZW1wQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKSB7Ci0JCQlwdXNoRGVjbGFyZWRNZXRob2RzKHRlbXBDbGFzcywgc3RhY2spOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2Uoc3RhY2spOwotCQlyZXR1cm4gc3RhY2sudG9BcnJheShuZXcgTWV0aG9kW3N0YWNrLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI25ld0luc3RhbmNlKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgYXR0ZW1wdE5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0TmV3SW5zdGFuY2UoamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIGF0dGVtcHROZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLm5ld0luc3RhbmNlKHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSArIENSICsgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgaWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBpYWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSArIENSICsgaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpLCBpdGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIGF0dGVtcHROZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdE5ld0luc3RhbmNlKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGdldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIE9iamVjdCNnZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0dldEZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmaWVsZChvYmplY3QsIGZpZWxkTmFtZSkuZ2V0KG9iamVjdCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgaWFlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGdldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNnZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0dldFN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGZpZWxkKGphdmFDbGFzcywgZmllbGROYW1lKS5nZXQobnVsbCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgaWFlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgemVyby1hcmd1bWVudCBtZXRob2QsCi0JICogZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QobWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIElmIHRoZSBleGVjdXRlZCBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgCi0JCXRocm93cyBUaHJvd2FibGUsIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiAKLQl7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihtZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgcmVjZWl2ZXIsIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgemVyby1hcmd1bWVudCBzdGF0aWMgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSBjbGFzcyBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2Qoc3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIHNldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUKLQkgKiBjb250YWluaW5nIG9iamVjdCwgZmllbGQgbmFtZSwgYW5kIG5ldyBmaWVsZCB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQuCi0JICogT2JqZWN0I3NldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhdHRlbXB0VG9TZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJZmllbGQob2JqZWN0LCBmaWVsZE5hbWUpLnNldChvYmplY3QsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBzZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZQotCSAqIGNvbnRhaW5pbmcgY2xhc3MsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI3NldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhdHRlbXB0VG9TZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlmaWVsZChqYXZhQ2xhc3MsIGZpZWxkTmFtZSkuc2V0KG51bGwsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IKLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcnMuCi0JICogQ2xhc3MjY29uc3RydWN0b3IoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2NvbnN0cnVjdG9yKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvciA9IGphdmFDbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKHBhcmFtZXRlclR5cGVzKTsKLQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2NvbnN0cnVjdG9yKENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gY29uc3RydWN0b3IoamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIGZpZWxkcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMuCi0JICogQ2xhc3MjYWNjZXNzaWJsZURlY2xhcmVkRmllbGRzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkW10gZGVjbGFyZWRGaWVsZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCUZpZWxkW10gZmllbGRzID0gamF2YUNsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCWZvciAoRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKLQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBtZXRob2RzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNhY2Nlc3NpYmxlRGVjbGFyZWRNZXRob2RzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFtdIGRlY2xhcmVkTWV0aG9kcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGphdmFDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotCQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IKLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcnMuCi0JICogQ2xhc3MjZGVmYXVsdENvbnN0cnVjdG9yKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBkZWZhdWx0Q29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGFuZCBmaWVsZCBuYW1lLgotCSAqIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGRlZmluZSB0aGUgZmllbGQsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBmaWVsZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCUZpZWxkIGZpZWxkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpZWxkID0gamF2YUNsYXNzLmdldERlY2xhcmVkRmllbGQoZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCUNsYXNzPD8+IHN1cGVyY2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewotCQkJCXRocm93IGV4OwotCQkJfQotCQkJLy8gcmVjdXJzZQotCQkJcmV0dXJuIGZpZWxkKHN1cGVyY2xhc3MsIGZpZWxkTmFtZSk7Ci0JCX0KLQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIGZpZWxkOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGRlZmluZSB0aGUgZmllbGQsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBmaWVsZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlyZXR1cm4gZmllbGQob2JqZWN0LmdldENsYXNzKCksIGZpZWxkTmFtZSk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG51bGwsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgnLicpOwotCQlzYi5hcHBlbmQoZmllbGROYW1lKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJcmV0dXJuIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdC5nZXRDbGFzcygpLCBmaWVsZE5hbWUpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCQkvLyB0aGlzIGNoZWNrIGFsbG93cyB1cyB0byB1c2UgdGhpcyBjb2RlIGZvciBjb25zdHJ1Y3RvcnMsIHdoZXJlIHRoZSBtZXRob2ROYW1lIGlzIG51bGwKLQkJaWYgKG1ldGhvZE5hbWUgIT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKCcuJyk7Ci0JCQlzYi5hcHBlbmQobWV0aG9kTmFtZSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCWludCBtYXggPSBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggLSAxOwotCQlpZiAobWF4ICE9IC0xKSB7Ci0JCQkvLyBzdG9wIG9uZSBzaG9ydCBvZiB0aGUgZW5kIG9mIHRoZSBhcnJheQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJCXNiLmFwcGVuZChwYXJhbWV0ZXJUeXBlc1tpXS5nZXROYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgiLCAiKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChwYXJhbWV0ZXJUeXBlc1ttYXhdLmdldE5hbWUoKSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUocmVjZWl2ZXIuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogT2JqZWN0I2dldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBmaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9HZXRGaWVsZFZhbHVlKG9iamVjdCwgZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gbnNmZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNmZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBuc2ZlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIGNsYXNzIGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogQ2xhc3MjZ2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvR2V0U3RhdGljRmllbGRWYWx1ZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zbWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIG5zbWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgb25lLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIAotCQl0aHJvd3MgVGhyb3dhYmxlCi0JewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24ocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIG9uZS1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogSWYgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgCi0JCXRocm93cyBUaHJvd2FibGUKLQl7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogSWYgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgCi0JCXRocm93cyBUaHJvd2FibGUKLQl7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24ocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zbWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIG5zbWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogQ29udmVydCBleGNlcHRpb25zIHRvIFJ1bnRpbWVFeGNlcHRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoTWV0aG9kIG1ldGhvZCwgT2JqZWN0IHJlY2VpdmVyLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWV0aG9kLmludm9rZShyZWNlaXZlciwgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIG1ldGhvZCwgaWFlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1ldGhvZCArIENSICsgaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpLCBpdGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogSWYgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIENvbnZlcnQgYWxsIG90aGVyIGV4Y2VwdGlvbnMgdG8gUnVudGltZUV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oTWV0aG9kIG1ldGhvZCwgT2JqZWN0IHJlY2VpdmVyLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCQl0aHJvd3MgVGhyb3dhYmxlCi0JewotCQl0cnkgewotCQkJcmV0dXJuIG1ldGhvZC5pbnZva2UocmVjZWl2ZXIsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBtZXRob2QsIGlhZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0JCQlUaHJvd2FibGUgY2F1c2UgPSBpdGUuZ2V0Q2F1c2UoKTsKLQkJCWlmIChjYXVzZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWV0aG9kLnRvU3RyaW5nKCksIGl0ZSk7Ci0JCQl9Ci0JCQl0aHJvdyBjYXVzZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgc3RhdGljIG1ldGhvZCwKLQkgKiBnaXZlbiB0aGUgY2xhc3MgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zbWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIHN0YXRpYyBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogQ29udmVydCBleGNlcHRpb25zIHRvIFJ1bnRpbWVFeGNlcHRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChtZXRob2QsIG51bGwsIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQl0cnkgewotCQkJbWV0aG9kID0gamF2YUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQlDbGFzczw/PiBzdXBlcmNsYXNzID0gamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJCS8vIHJlY3Vyc2UKLQkJCXJldHVybiBtZXRob2Qoc3VwZXJjbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9Ci0JCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlyZXR1cm4gbWV0aG9kOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdAotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2Qob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCwgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcyAod2l0aG91dCB0aGUgY2hlY2tlZCBleGNlcHRpb24pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGNsYXNzTmFtZSwgZXgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIENsYXNzI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGNsYXNzTG9hZGVyKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHROZXdJbnN0YW5jZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zbWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyksIG5zbWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc05hbWUsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgY2xhc3NMb2FkZXIpLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc05hbWUsIHBhcmFtZXRlclR5cGUsIHBhcmFtZXRlciwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgcGFyYW1ldGVyLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlciwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpLCBwYXJhbWV0ZXJUeXBlLCBwYXJhbWV0ZXIpOwotCX0KLQkKLQkvKgotCSAqIFB1c2ggdGhlIGRlY2xhcmVkIGZpZWxkcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIG9udG8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXNoRGVjbGFyZWRGaWVsZHMoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdGFjazxGaWVsZD4gc3RhY2spIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBkZWNsYXJlZEZpZWxkcyhqYXZhQ2xhc3MpOwotCQlmb3IgKGludCBpID0gZmllbGRzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlzdGFjay5wdXNoKGZpZWxkc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBQdXNoIHRoZSBkZWNsYXJlZCBtZXRob2RzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogb250byB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHB1c2hEZWNsYXJlZE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdGFjazxNZXRob2Q+IHN0YWNrKSB7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBkZWNsYXJlZE1ldGhvZHMoamF2YUNsYXNzKTsKLQkJZm9yIChpbnQgaSA9IG1ldGhvZHMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCXN0YWNrLnB1c2gobWV0aG9kc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCwgZmllbGQgbmFtZSwgYW5kIG5ldyBmaWVsZCB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIE9iamVjdCNzZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlhdHRlbXB0VG9TZXRGaWVsZFZhbHVlKG9iamVjdCwgZmllbGROYW1lLCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gbnNmZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNmZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBuc2ZlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIGNsYXNzLCBmaWVsZCBuYW1lLCBhbmQgbmV3IGZpZWxkIHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogQ2xhc3Mjc2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlhdHRlbXB0VG9TZXRTdGF0aWNGaWVsZFZhbHVlKGphdmFDbGFzcywgZmllbGROYW1lLCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gbnNmZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNmZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBuc2ZlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIG9iamVjdCdzIGNsYXNzLgotCSAqIENsYXNzI2dldFNob3J0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnRDbGFzc05hbWVGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc2hvcnROYW1lRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiT2JqZWN0IikuCi0JICogQ2xhc3MjZ2V0U2hvcnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydE5hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiT2JqZWN0IikuCi0JICogQ2xhc3MjZ2V0U2hvcnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydE5hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBzaG9ydE5hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lc3RlZCBuYW1lIG9mIHRoZSBvYmplY3QncyBjbGFzcy4KLQkgKiBDbGFzcyNnZXROZXN0ZWROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXN0ZWRDbGFzc05hbWVGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbmVzdGVkTmFtZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmVzdGVkIG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJFbnRyeSIpLgotCSAqIENsYXNzI2dldE5lc3RlZE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5lc3RlZE5hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUikgKyAxKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXN0ZWQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIkVudHJ5IikuCi0JICogQ2xhc3MjZ2V0TmVzdGVkTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmVzdGVkTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIG5lc3RlZE5hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJ0b1N0cmluZygpIiBuYW1lIG9mIHRoZSBvYmplY3QncyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ0NsYXNzTmFtZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0b1N0cmluZ05hbWVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJ0b1N0cmluZygpIiBuYW1lIG9mIHRoZSBjbGFzcy4KLQkgKiAiTWVtYmVyIiBjbGFzc2VzIHdpbGwgcmV0dXJuIG9ubHkgdGhlIGZpbmFsIG5hbWU6Ci0JICogICAgICJjb20uZm9vLmJhci5Ub3BMZXZlbENsYXNzJE1lbWJlckNsYXNzJE5lc3RlZE1lbWJlckNsYXNzIgotCSAqICAgICAgICAgPT4gIk5lc3RlZE1lbWJlckNsYXNzIgotCSAqICJMb2NhbCIgYW5kICJhbm9ueW1vdXMiIGNsYXNzZXMgd2lsbCBzdGlsbCByZXR1cm4gdGhlIGVtYmVkZGVkICckJ3M6Ci0JICogICAgICJjb20uZm9vLmJhci5Ub3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIgotCSAqICAgICAgICAgPT4gIlRvcExldmVsQ2xhc3MkMUxvY2FsQ2xhc3MiCi0JICogICAgICJjb20uZm9vLmJhci5Ub3BMZXZlbENsYXNzJDEiCi0JICogICAgICAgICA9PiAiVG9wTGV2ZWxDbGFzcyQxIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lZElzTWVtYmVyKGNsYXNzTmFtZSkgPwotCQkJY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKSArIDEpCi0JCToKLQkJCWNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAidG9TdHJpbmcoKSIgbmFtZSBvZiB0aGUgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdOYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gdG9TdHJpbmdOYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJqYXZhLmxhbmciKS4KLQkgKiBDbGFzcyNnZXRQYWNrYWdlTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2FnZU5hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBwYWNrYWdlTmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiamF2YS5sYW5nIikuCi0JICogQ2xhc3MjZ2V0UGFja2FnZU5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2thZ2VOYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBsYXN0UGVyaW9kID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChsYXN0UGVyaW9kID09IC0xKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgbGFzdFBlcmlvZCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgY2xhc3MsCi0JICogZm9sbG93ZWQgYnkgaXRzIHBhY2thZ2UgbmFtZSAoZS5nLiAiT2JqZWN0IChqYXZhLmxhbmcpIikuCi0JICogQ2xhc3MjZ2V0U2hvcnROYW1lV2l0aFBhY2thZ2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0TmFtZVdpdGhQYWNrYWdlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKHNob3J0TmFtZUZvcihqYXZhQ2xhc3MpKTsKLQkJaWYgKCAhIGphdmFDbGFzcy5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlzYi5hcHBlbmQoIiAoIik7Ci0JCQlzYi5hcHBlbmQocGFja2FnZU5hbWVGb3IoamF2YUNsYXNzKSk7Ci0JCQlzYi5hcHBlbmQoJyknKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQsIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBzdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2Qgc3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMobWV0aG9kLmdldE1vZGlmaWVycygpKSkgewotCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBzdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gc3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGVzfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBjYW4gYmUgImRlY2xhcmVkIiBpbiBjb2RlOwotCSAqIGkuZS4gaXQgaXMgZWl0aGVyIGEgInRvcC1sZXZlbCIgY2xhc3Mgb3IgYSAibWVtYmVyIiBjbGFzcywgYnV0IGl0Ci0JICogaXMgbm90IGFuICJhcnJheSIgY2xhc3MuIFRoaXMgbWV0aG9kIHJvbGxzIHRvZ2V0aGVyIGFsbCB0aGUgY2hlY2tzCi0JICogZnJvbSB0aGUgb3RoZXIgbWV0aG9kcyBmb3IgYSBiaXQgb2YgYSBwZXJmb3JtYW5jZSB0d2Vhay4KLQkgKiBDbGFzcyNpc0RlY2xhcmFibGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNEZWNsYXJhYmxlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZS5jaGFyQXQoMCkgPT0gQVJSQVlfSU5ESUNBVE9SKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CQkvLyBpdCBpcyBhbiAiYXJyYXkiIGNsYXNzCi0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJCS8vIGl0IGlzIGEgInRvcC1sZXZlbCIgY2xhc3MKLQkJfQotCQlkbyB7Ci0JCQkvLyB0aGUgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggZG9sbGFyIHNpZ24gY2Fubm90IGJlIGEgZGlnaXQKLQkJCWluZGV4Kys7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpbmRleCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IsIGluZGV4KTsKLQkJfSB3aGlsZSAoaW5kZXggIT0gLTEpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAibWVtYmVyIiwgImxvY2FsIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBkb2VzIE5PVCBjb250YWluIGEgJyQnOiAiVG9wTGV2ZWxDbGFzcyIpLgotCSAqIENsYXNzI2lzVG9wTGV2ZWwoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNUb3BMZXZlbChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUikgPT0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJtZW1iZXIiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAidG9wLWxldmVsIiwgImxvY2FsIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBjb250YWlucyBhdCBsZWFzdCBvbmUgJyQnIGFuZCBhbGwgdGhlIG5hbWVzIGJldHdlZW4KLQkgKiBlYWNoICckJyBhcmUgbGVnYWwgY2xhc3MgbmFtZXM6Ci0JICogIlRvcExldmVsQ2xhc3MkTWVtYmVyQ2xhc3MkTmVzdGVkTWVtYmVyQ2xhc3MiKS4KLQkgKiBDbGFzcyNpc01lbWJlcigpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc01lbWJlcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CS8vIGl0IGlzIGEgInRvcC1sZXZlbCIgY2xhc3MKLQkJfQotCQlkbyB7Ci0JCQkvLyB0aGUgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggZG9sbGFyIHNpZ24gY2Fubm90IGJlIGEgZGlnaXQKLQkJCWluZGV4Kys7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpbmRleCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IsIGluZGV4KTsKLQkJfSB3aGlsZSAoaW5kZXggIT0gLTEpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgImxvY2FsIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJtZW1iZXIiLCBvciAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgamRrIChvciBFY2xpcHNlKSBuYW1pbmcgY29udmVudGlvbnMuCi0JICogSW4gdGhlIGpkaywgdGhlIGNsYXNzIG5hbWUgZW5kcyB3aXRoICckbm5uWFhYJyB3aGVyZSB0aGUgJyQnIGlzCi0JICogZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgbnVtZXJpYyBkaWdpdHMgd2hpY2ggYXJlIGZvbGxvd2VkIGJ5IHRoZQotCSAqIGxvY2FsIGNsYXNzIG5hbWU6ICJUb3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIi4KLQkgKiBJbiBFY2xpcHNlLCB0aGUgY2xhc3MgbmFtZSBlbmRzIHdpdGggJyRubm4kWFhYJyB3aGVyZSB0aGUgJyQnIGlzCi0JICogZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgbnVtZXJpYyBkaWdpdHMgd2hpY2ggYXJlIHNlcGFyYXRlZCBmcm9tCi0JICogdGhlIGxvY2FsIGNsYXNzIG5hbWUgYnkgYW5vdGhlciAnJCc6ICJUb3BMZXZlbENsYXNzJDEkTG9jYWxDbGFzcyIuCi0JICogQ2xhc3MjaXNMb2NhbCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0xvY2FsKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgZG9sbGFyID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGRvbGxhciA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICggISBDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc05hbWUuY2hhckF0KGRvbGxhciArIDEpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBsZW4gPSBjbGFzc05hbWUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSBkb2xsYXIgKyAyOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNsYXNzTmFtZS5jaGFyQXQoaSkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlICQgYXJlIGRpZ2l0cyAoYW5vbnltb3VzKQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhbiAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJtZW1iZXIiLCBvciAibG9jYWwiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgbmFtaW5nIGNvbnZlbnRpb25zIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgZW5kcyB3aXRoICckbm5uJyB3aGVyZSBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUKLQkgKiBsYXN0ICckJyBhcmUgbnVtZXJpYyBkaWdpdHM6ICJUb3BMZXZlbENsYXNzJDEiKS4KLQkgKiBDbGFzcyNpc0Fub255bW91cygpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0Fub255bW91cyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGRvbGxhciA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChkb2xsYXIgPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgc3RhcnQgPSBkb2xsYXIgKyAxOwotCQlmb3IgKGludCBpID0gY2xhc3NOYW1lLmxlbmd0aCgpOyBpLS0gPiBzdGFydDsgKSB7Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlICQgYXJlIGRpZ2l0cwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiBDbGFzcyNnZXRBcnJheURlcHRoKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpbnQgZGVwdGggPSAwOwotCQl3aGlsZSAoamF2YUNsYXNzLmlzQXJyYXkoKSkgewotCQkJZGVwdGgrKzsKLQkJCWphdmFDbGFzcyA9IGphdmFDbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogVGhlIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkuCi0JICogTm9uLWFycmF5cyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGFycmF5RGVwdGhGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKiBDbGFzcyNnZXRBcnJheURlcHRoKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCXdoaWxlIChjbGFzc05hbWUuY2hhckF0KGRlcHRoKSA9PSBBUlJBWV9JTkRJQ0FUT1IpIHsKLQkJCWRlcHRoKys7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYW4gYXJyYXkgdHlwZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzQXJyYXkoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLmNoYXJBdCgwKSA9PSBBUlJBWV9JTkRJQ0FUT1I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogQSBub24tYXJyYXkgdHlwZSBzaW1wbHkgcmV0dXJucyBpdHNlbGYuCi0JICogQ2xhc3MjZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZWxlbWVudFR5cGVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXdoaWxlIChqYXZhQ2xhc3MuaXNBcnJheSgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBqYXZhQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheS4KLQkgKiBBIG5vbi1hcnJheSBzaW1wbHkgcmV0dXJucyBpdHMgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBlbGVtZW50VHlwZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBlbGVtZW50VHlwZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIHNpbXBseSByZXR1cm4gdGhlbXNlbHZlcy4KLQkgKiBDbGFzcyNnZXRFbGVtZW50VHlwZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFR5cGVOYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gZWxlbWVudFR5cGVGb3IoamF2YUNsYXNzKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIHNpbXBseSByZXR1cm4gdGhlbXNlbHZlcy4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKiBDbGFzcyNnZXRFbGVtZW50VHlwZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBkZXB0aCA9IGFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGNsYXNzTmFtZSk7Ci0JCWlmIChkZXB0aCA9PSAwKSB7Ci0JCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogImphdmEubGFuZy5PYmplY3QiIG9yICJpbnQiCi0JCQlyZXR1cm4gY2xhc3NOYW1lOwotCQl9Ci0JCWludCBsYXN0ID0gY2xhc3NOYW1lLmxlbmd0aCgpIC0gMTsKLQkJaWYgKGNsYXNzTmFtZS5jaGFyQXQoZGVwdGgpID09IFJFRkVSRU5DRV9DTEFTU19DT0RFKSB7Ci0JCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogIltbW0xqYXZhLmxhbmcuT2JqZWN0OyIKLQkJCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGRlcHRoICsgMSwgbGFzdCk7CS8vIGRyb3AgdGhlIHRyYWlsaW5nICc7JwotCQl9Ci0JCS8vIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtOiAiW1tbSSIKLQkJcmV0dXJuIGNsYXNzTmFtZUZvckNvZGUoY2xhc3NOYW1lLmNoYXJBdChsYXN0KSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAicmVmZXJlbmNlIgotCSAqIGNsYXNzIChpLmUuIG5laXRoZXIgJ3ZvaWQnIG5vciBvbmUgb2YgdGhlIHByaW1pdGl2ZSB2YXJpYWJsZSBjbGFzc2VzLAotCSAqIFsnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuXSkuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1JlZmVyZW5jZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiAhIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZShjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiAndm9pZCcgb3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgY2xhc3NlcywKLQkgKiBbJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNQcmltaXRpdmUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSB8fCAoY2xhc3NOYW1lLmxlbmd0aCgpID4gbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuICdib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy4sIGJ1dCBub3QgJ3ZvaWQnKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lZElzUHJpbWl0aXZlKGNsYXNzTmFtZSkKLQkJCSYmICggISBjbGFzc05hbWUuZXF1YWxzKFZPSURfQ0xBU1NfTkFNRSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuICdqYXZhLmxhbmcuVm9pZCcgb3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgd3JhcHBlciBjbGFzc2VzLAotCSAqIFsnamF2YS5sYW5nLkJvb2xlYW4nLCAnamF2YS5sYW5nLkludGVnZXInLCAnamF2YS5sYW5nLkZsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSB8fCAoY2xhc3NOYW1lLmxlbmd0aCgpID4gbWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJfQotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoY29kZXNbaV0ud3JhcHBlckNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiAnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuLCBidXQgbm90ICd2b2lkJykuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhjbGFzc05hbWUpCi0JCQkmJiAoICEgY2xhc3NOYW1lLmVxdWFscyhWT0lEX1dSQVBQRVJfQ0xBU1NfTkFNRSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuICdqYXZhLmxhbmcuVm9pZCcgb3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgd3JhcHBlciBjbGFzc2VzLAotCSAqIFsnamF2YS5sYW5nLkJvb2xlYW4nLCAnamF2YS5sYW5nLkludGVnZXInLCAnamF2YS5sYW5nLkZsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc0lzUHJpbWl0aXZlV3JhcHBlckNsYXNzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpZiAoamF2YUNsYXNzLmlzQXJyYXkoKSB8fCAoamF2YUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKSA+IG1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGNvZGVzW2ldLndyYXBwZXJDbGFzcyA9PSBqYXZhQ2xhc3MpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLiwgYnV0IG5vdCAndm9pZCcpLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjbGFzc0lzUHJpbWl0aXZlV3JhcHBlckNsYXNzKGphdmFDbGFzcykKLQkJCSYmIChqYXZhQ2xhc3MgIT0gamF2YS5sYW5nLlZvaWQuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvckNvZGUoY2hhciBjbGFzc0NvZGUpIHsKLQkJcmV0dXJuIGNsYXNzRm9yQ29kZShjbGFzc0NvZGUpLmdldE5hbWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lRm9yQ29kZShpbnQgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBjbGFzc05hbWVGb3JDb2RlKChjaGFyKSBjbGFzc0NvZGUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvckNvZGUoY2hhciBjbGFzc0NvZGUpIHsKLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGNvZGVzW2ldLmNvZGUgPT0gY2xhc3NDb2RlKSB7Ci0JCQkJcmV0dXJuIGNvZGVzW2ldLmphdmFDbGFzczsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKGNsYXNzQ29kZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yQ29kZShpbnQgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBjbGFzc0ZvckNvZGUoKGNoYXIpIGNsYXNzQ29kZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXIgY29kZUZvckNsYXNzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpZiAoKCAhIGphdmFDbGFzcy5pc0FycmF5KCkpICYmIChqYXZhQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpIDw9IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzID09IGphdmFDbGFzcykgewotCQkJCQlyZXR1cm4gY29kZXNbaV0uY29kZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsJCQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGNvZGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIGNvZGVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKCggISBjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSAmJiAoY2xhc3NOYW1lLmxlbmd0aCgpIDw9IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCQlyZXR1cm4gY29kZXNbaV0uY29kZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjbGFzc05hbWUpOwkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24sIENsYXNzVG9vbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLAotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJVHlwZURlY2xhcmF0aW9uIHRkID0gdHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXJldHVybiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbih0ZC5lbGVtZW50VHlwZU5hbWUsIHRkLmFycmF5RGVwdGgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQl0eXBlRGVjbGFyYXRpb24gPSBTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHR5cGVEZWNsYXJhdGlvbik7Ci0JCWludCBhcnJheURlcHRoID0gYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbl8odHlwZURlY2xhcmF0aW9uKTsKLQkJU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSA9IHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcoMCwgdHlwZURlY2xhcmF0aW9uLmxlbmd0aCgpIC0gKGFycmF5RGVwdGggKiAyKSk7Ci0JCXJldHVybiBuZXcgVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIsCi0JICogdXNpbmcgdGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIuCi0JICovCi0JLy8gc2VlIHRoZSAiRXZhbHVhdGlvbiIgb2YgamRrIGJ1ZyA2NDQ2NjI3IGZvciBhIGRpc2N1c3Npb24gb2YgbG9hZGluZyBjbGFzc2VzCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJLy8gcHJpbWl0aXZlcyBjYW5ub3QgYmUgbG9hZGVkIHZpYSBDbGFzcyNmb3JOYW1lKCksCi0JCS8vIHNvIGNoZWNrIGZvciBhIHByaW1pdGl2ZSBjbGFzcyBuYW1lIGZpcnN0Ci0JCVByaW1pdGl2ZSBwY2MgPSBudWxsOwotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmxlbmd0aCgpIDw9IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSB7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lKSkgewotCQkJCQlwY2MgPSBjb2Rlc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gbm9uLWFycmF5Ci0JCWlmIChhcnJheURlcHRoID09IDApIHsKLQkJCXJldHVybiAocGNjID09IG51bGwpID8gQ2xhc3MuZm9yTmFtZShlbGVtZW50VHlwZU5hbWUsIGZhbHNlLCBjbGFzc0xvYWRlcikgOiBwY2MuamF2YUNsYXNzOwotCQl9Ci0KLQkJLy8gYXJyYXkKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7Ci0JCWZvciAoaW50IGkgPSBhcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZChBUlJBWV9JTkRJQ0FUT1IpOwotCQl9Ci0JCWlmIChwY2MgPT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19DT0RFKTsKLQkJCXNiLmFwcGVuZChlbGVtZW50VHlwZU5hbWUpOwotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0JCXJldHVybiBDbGFzcy5mb3JOYW1lKHNiLnRvU3RyaW5nKCksIGZhbHNlLCBjbGFzc0xvYWRlcik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiI7IGUuZy4KLQkgKiAgICAgImludFtdIiAtPiAiW0kiCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJVHlwZURlY2xhcmF0aW9uIHRkID0gdHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXJldHVybiBjbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24odGQuZWxlbWVudFR5cGVOYW1lLCB0ZC5hcnJheURlcHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGRlcHRoIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIjsgZS5nLgotCSAqICAgICAiaW50W10iIC0+IDEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2UodHlwZURlY2xhcmF0aW9uKSk7Ci0JfQotCi0JLyoKLQkgKiBBc3N1bWUgbm8gd2hpdGVzcGFjZSBpbiB0aGUgdHlwZSBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlpbnQgbGFzdCA9IHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSAtIDE7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCWludCBjbG9zZSA9IGxhc3Q7Ci0JCXdoaWxlICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KGNsb3NlKSA9PSBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX0NMT1NFKSB7Ci0JCQlpZiAodHlwZURlY2xhcmF0aW9uLmNoYXJBdChjbG9zZSAtIDEpID09IFRZUEVfREVDTEFSQVRJT05fQVJSQVlfT1BFTikgewotCQkJCWRlcHRoKys7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgdHlwZSBkZWNsYXJhdGlvbjogIiArIHR5cGVEZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCQljbG9zZSA9IGxhc3QgLSAoZGVwdGggKiAyKTsKLQkJfQotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCS8vIG5vbi1hcnJheQotCQlpZiAoYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZWxlbWVudFR5cGVOYW1lOwotCQl9Ci0KLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5lcXVhbHMoVk9JRF9DTEFTU19OQU1FKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJyIgKyBWT0lEX0NMQVNTX05BTUUgKyAiJyBtdXN0IGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybzogIiArIGFycmF5RGVwdGggKyAnLicpOwotCQl9Ci0JCS8vIGFycmF5Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOwotCQlmb3IgKGludCBpID0gYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlzYi5hcHBlbmQoQVJSQVlfSU5ESUNBVE9SKTsKLQkJfQotCi0JCS8vIGxvb2sgZm9yIGEgcHJpbWl0aXZlIGZpcnN0Ci0JCVByaW1pdGl2ZSBwY2MgPSBudWxsOwotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmxlbmd0aCgpIDw9IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSB7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lKSkgewotCQkJCQlwY2MgPSBjb2Rlc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHBjYyA9PSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoUkVGRVJFTkNFX0NMQVNTX0NPREUpOwotCQkJc2IuYXBwZW5kKGVsZW1lbnRUeXBlTmFtZSk7Ci0JCQlzYi5hcHBlbmQoUkVGRVJFTkNFX0NMQVNTX05BTUVfREVMSU1JVEVSKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChwY2MuY29kZSk7Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpZiAoTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCA9PSAtMSkgewotCQkJTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCA9IGNhbGN1bGF0ZU1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpOwotCQl9Ci0JCXJldHVybiBNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBjYWxjdWxhdGVNYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSB7Ci0JCWludCBtYXggPSAtMTsKLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaW50IGxlbiA9IGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQlpZiAobGVuID4gbWF4KSB7Ci0JCQkJbWF4ID0gbGVuOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSB7Ci0JCWlmIChNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEggPT0gLTEpIHsKLQkJCU1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSCA9IGNhbGN1bGF0ZU1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gTUFYX1BSSU1JVElWRV9XUkFQUEVSX0NMQVNTX05BTUVfTEVOR1RIOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBjYWxjdWxhdGVNYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpbnQgbWF4ID0gLTE7Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWludCBsZW4gPSBjb2Rlc1tpXS53cmFwcGVyQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA+IG1heCkgewotCQkJCW1heCA9IGxlbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZVtdIHByaW1pdGl2ZXMoKSB7Ci0JCWlmIChQUklNSVRJVkVTID09IG51bGwpIHsKLQkJCVBSSU1JVElWRVMgPSBidWlsZFByaW1pdGl2ZXMoKTsKLQkJfQotCQlyZXR1cm4gUFJJTUlUSVZFUzsKLQl9Ci0JCi0JLyoqCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUHJpbWl0aXZlW10gYnVpbGRQcmltaXRpdmVzKCkgewotCQlQcmltaXRpdmVbXSByZXN1bHQgPSBuZXcgUHJpbWl0aXZlWzldOwotCQlyZXN1bHRbMF0gPSBuZXcgUHJpbWl0aXZlKEJZVEVfQ09ERSwgamF2YS5sYW5nLkJ5dGUuY2xhc3MpOwotCQlyZXN1bHRbMV0gPSBuZXcgUHJpbWl0aXZlKENIQVJfQ09ERSwgamF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzcyk7Ci0JCXJlc3VsdFsyXSA9IG5ldyBQcmltaXRpdmUoRE9VQkxFX0NPREUsIGphdmEubGFuZy5Eb3VibGUuY2xhc3MpOwotCQlyZXN1bHRbM10gPSBuZXcgUHJpbWl0aXZlKEZMT0FUX0NPREUsIGphdmEubGFuZy5GbG9hdC5jbGFzcyk7Ci0JCXJlc3VsdFs0XSA9IG5ldyBQcmltaXRpdmUoSU5UX0NPREUsIGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzKTsKLQkJcmVzdWx0WzVdID0gbmV3IFByaW1pdGl2ZShMT05HX0NPREUsIGphdmEubGFuZy5Mb25nLmNsYXNzKTsKLQkJcmVzdWx0WzZdID0gbmV3IFByaW1pdGl2ZShTSE9SVF9DT0RFLCBqYXZhLmxhbmcuU2hvcnQuY2xhc3MpOwotCQlyZXN1bHRbN10gPSBuZXcgUHJpbWl0aXZlKEJPT0xFQU5fQ09ERSwgamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MpOwotCQlyZXN1bHRbOF0gPSBuZXcgUHJpbWl0aXZlKFZPSURfQ09ERSwgamF2YS5sYW5nLlZvaWQuY2xhc3MpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBDbGFzc1Rvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJpbWl0aXZlIHsKLQkJZmluYWwgY2hhciBjb2RlOwotCQlmaW5hbCBDbGFzczw/PiBqYXZhQ2xhc3M7Ci0JCWZpbmFsIENsYXNzPD8+IHdyYXBwZXJDbGFzczsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdSQVBQRVJfQ0xBU1NfVFlQRV9GSUVMRF9OQU1FID0gIlRZUEUiOwotCQkvLyBlLmcuIGphdmEubGFuZy5Cb29sZWFuLlRZUEUgPT4gYm9vbGVhbi5jbGFzcwotCQlQcmltaXRpdmUoY2hhciBjb2RlLCBDbGFzczw/PiB3cmFwcGVyQ2xhc3MpIHsKLQkJCXRoaXMuY29kZSA9IGNvZGU7Ci0JCQl0aGlzLndyYXBwZXJDbGFzcyA9IHdyYXBwZXJDbGFzczsKLQkJCXRoaXMuamF2YUNsYXNzID0gKENsYXNzPD8+KSBzdGF0aWNGaWVsZFZhbHVlKHdyYXBwZXJDbGFzcywgV1JBUFBFUl9DTEFTU19UWVBFX0ZJRUxEX05BTUUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZURlY2xhcmF0aW9uIHsKLQkJZmluYWwgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZTsKLQkJZmluYWwgaW50IGFycmF5RGVwdGg7Ci0JCVR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQkJdGhpcy5lbGVtZW50VHlwZU5hbWUgPSBlbGVtZW50VHlwZU5hbWU7Ci0JCQl0aGlzLmFycmF5RGVwdGggPSBhcnJheURlcHRoOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NwYXRoLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NwYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOGYzZDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NsYXNzcGF0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotLyoqCi0gKiBUT0RPCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGgKLQlpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQotewotCS8qKiBUaGUgZW50cmllcyBpbiB0aGUgY2xhc3NwYXRoICovCi0JcHJpdmF0ZSBmaW5hbCBFbnRyeVtdIGVudHJpZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvLyAqKioqKiBmYWN0b3J5IG1ldGhvZHMgZm9yICJzdGFuZGFyZCIgY2xhc3NwYXRocyAqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhICJib290IiBjbGFzc3BhdGguIFRoaXMgaW5jbHVkZXMgcnQuamFyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoIGJvb3RDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NwYXRoKFN5c3RlbS5nZXRQcm9wZXJ0eSgic3VuLmJvb3QuY2xhc3MucGF0aCIpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgInZpcnR1YWwgY2xhc3NwYXRoIiB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgamFycwotCSAqIHRoYXQgd291bGQgYmUgdXNlZCBieSB0aGUgSmF2YSBFeHRlbnNpb24gTWVjaGFuaXNtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoIGphdmFFeHRlbnNpb25DbGFzc3BhdGgoKSB7Ci0JCUZpbGVbXSBkaXJzID0gamF2YUV4dGVuc2lvbkRpcmVjdG9yaWVzKCk7Ci0JCUxpc3Q8U3RyaW5nPiBqYXJGaWxlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChGaWxlIGRpciA6IGRpcnMpIHsKLQkJCWlmIChkaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJCWFkZEphckZpbGVOYW1lc1RvKGRpciwgamFyRmlsZU5hbWVzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChqYXJGaWxlTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSAic3lzdGVtIiBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGggamF2YUNsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB1bnJldG91Y2hlZCAiY29tcGxldGUiIGNsYXNzcGF0aC4KLQkgKiBUaGlzIGluY2x1ZGVzIHRoZSBib290IGNsYXNzcGF0aCwgdGhlIEphdmEgRXh0ZW5zaW9uCi0JICogTWVjaGFuaXNtIGNsYXNzcGF0aCwgYW5kIHRoZSBub3JtYWwgInN5c3RlbSIgY2xhc3NwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoIGNvbXBsZXRlQ2xhc3NwYXRoKCkgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChuZXcgQ2xhc3NwYXRoW10gewotCQkJCWJvb3RDbGFzc3BhdGgoKSwKLQkJCQlqYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCksCi0JCQkJamF2YUNsYXNzcGF0aCgpCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNsYXNzcGF0aCB0aGF0IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoIGNsYXNzcGF0aEZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgobG9jYXRpb25Gb3IoamF2YUNsYXNzKSk7Ci0JfQotCi0KLQkvLyAqKioqKiBmaWxlID0+IGNsYXNzICoqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IGEgcmVsYXRpdmUgZmlsZSBuYW1lIHRvIGEgY2xhc3MgbmFtZTsgdGhpcyB3aWxsIHdvcmsgZm9yCi0JICogYW55IGZpbGUgdGhhdCBoYXMgYSBzaW5nbGUgZXh0ZW5zaW9uIGJleW9uZCB0aGUgYmFzZQotCSAqIGNsYXNzIG5hbWUuCi0JICogZS5nLiAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyIgaXMgY29udmVydGVkIHRvICJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIGUuZy4gImphdmEvbGFuZy9TdHJpbmcuamF2YSIgaXMgY29udmVydGVkIHRvICJqYXZhLmxhbmcuU3RyaW5nIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0NsYXNzTmFtZShTdHJpbmcgY2xhc3NGaWxlTmFtZSkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKGNsYXNzRmlsZU5hbWUpOwotCQkvLyBkbyB0aGlzIGZvciBhcmNoaXZlIGVudHJ5IG5hbWVzCi0JCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCcvJywgJy4nKTsKLQkJLy8gZG8gdGhpcyBmb3IgTy9TLXNwZWNpZmljIGZpbGUgbmFtZXMKLQkJaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycpIHsKLQkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKTsKLQkJfQotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBmaWxlIHRvIGEgY2xhc3MgbmFtZTsKLQkgKiBlLmcuIEZpbGUoamF2YS9sYW5nL1N0cmluZy5jbGFzcykgaXMgY29udmVydGVkIHRvICJqYXZhLmxhbmcuU3RyaW5nIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0NsYXNzTmFtZShGaWxlIGNsYXNzRmlsZSkgewotCQlyZXR1cm4gY29udmVydFRvQ2xhc3NOYW1lKGNsYXNzRmlsZS5nZXRQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSByZWxhdGl2ZSBmaWxlIG5hbWUgdG8gYSBjbGFzczsKLQkgKiBlLmcuICJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIiBpcyBjb252ZXJ0ZWQgdG8gamF2YS5sYW5nLlN0cmluZy5jbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY29udmVydFRvQ2xhc3MoU3RyaW5nIGNsYXNzRmlsZU5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIENsYXNzLmZvck5hbWUoY29udmVydFRvQ2xhc3NOYW1lKGNsYXNzRmlsZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgcmVsYXRpdmUgZmlsZSB0byBhIGNsYXNzOwotCSAqIGUuZy4gRmlsZShqYXZhL2xhbmcvU3RyaW5nLmNsYXNzKSBpcyBjb252ZXJ0ZWQgdG8gamF2YS5sYW5nLlN0cmluZy5jbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY29udmVydFRvQ2xhc3MoRmlsZSBjbGFzc0ZpbGUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0NsYXNzKGNsYXNzRmlsZS5nZXRQYXRoKCkpOwotCX0KLQotCi0JLy8gKioqKiogY2xhc3MgPT4gSkFSIGVudHJ5ICoqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhbiBhcmNoaXZlIGVudHJ5IG5hbWUgYmFzZTsKLQkgKiBlLmcuICJqYXZhLmxhbmcuU3RyaW5nIiBpcyBjb252ZXJ0ZWQgdG8gImphdmEvbGFuZy9TdHJpbmciCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQXJjaGl2ZUVudHJ5TmFtZUJhc2UoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYW4gYXJjaGl2ZSBlbnRyeSBuYW1lIGJhc2U7Ci0JICogZS5nLiBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzIGlzIGNvbnZlcnRlZCB0byAiamF2YS9sYW5nL1N0cmluZyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BcmNoaXZlRW50cnlOYW1lQmFzZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0FyY2hpdmVFbnRyeU5hbWVCYXNlKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhbiBhcmNoaXZlIGNsYXNzIGZpbGUgZW50cnkgbmFtZTsKLQkgKiBlLmcuICJqYXZhLmxhbmcuU3RyaW5nIiBpcyBjb252ZXJ0ZWQgdG8gImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9BcmNoaXZlRW50cnlOYW1lQmFzZShjbGFzc05hbWUpICsgIi5jbGFzcyI7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhbiBhcmNoaXZlIGNsYXNzIGZpbGUgZW50cnkgbmFtZTsKLQkgKiBlLmcuIGphdmEubGFuZy5TdHJpbmcuY2xhc3MgaXMgY29udmVydGVkIHRvICJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQotCS8vICoqKioqIGNsYXNzID0+IGZpbGUgKC5jbGFzcyBvciAuamF2YSkgKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGEgZmlsZSBuYW1lIGJhc2UgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuICJqYXZhLmxhbmcuU3RyaW5nIiBpcyBjb252ZXJ0ZWQgdG8gImphdmEvbGFuZy9TdHJpbmciIG9uIFVuaXgKLQkgKiBhbmQgImphdmFcXGxhbmdcXFN0cmluZyIgb24gV2luZG93cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0ZpbGVOYW1lQmFzZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGZpbGUgbmFtZSBiYXNlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzIGlzIGNvbnZlcnRlZCB0byAiamF2YS9sYW5nL1N0cmluZyIgb24gVW5peAotCSAqIGFuZCAiamF2YVxcbGFuZ1xcU3RyaW5nIiBvbiBXaW5kb3dzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvRmlsZU5hbWVCYXNlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvRmlsZU5hbWVCYXNlKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGNsYXNzIGZpbGUgbmFtZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gImphdmEubGFuZy5TdHJpbmciIGlzIGNvbnZlcnRlZCB0byAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyIgb24gVW5peAotCSAqIGFuZCAiamF2YVxcbGFuZ1xcU3RyaW5nLmNsYXNzIiBvbiBXaW5kb3dzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQ2xhc3NGaWxlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9GaWxlTmFtZUJhc2UoY2xhc3NOYW1lKSArICIuY2xhc3MiOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSBjbGFzcyBmaWxlIG5hbWUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIGphdmEubGFuZy5TdHJpbmcuY2xhc3MgaXMgY29udmVydGVkIHRvICJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIiBvbiBVbml4Ci0JICogYW5kICJqYXZhXFxsYW5nXFxTdHJpbmcuY2xhc3MiIG9uIFdpbmRvd3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYSBjbGFzcyBmaWxlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiAiamF2YS5sYW5nLlN0cmluZyIgaXMgY29udmVydGVkIHRvIEZpbGUoamF2YS9sYW5nL1N0cmluZy5jbGFzcykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvQ2xhc3NGaWxlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoY2xhc3NOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGNsYXNzIGZpbGUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIGphdmEubGFuZy5TdHJpbmcuY2xhc3MgaXMgY29udmVydGVkIHRvIEZpbGUoamF2YS9sYW5nL1N0cmluZy5jbGFzcykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvQ2xhc3NGaWxlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvQ2xhc3NGaWxlKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGphdmEgZmlsZSBuYW1lIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiAiamF2YS5sYW5nLlN0cmluZyIgaXMgY29udmVydGVkIHRvICJqYXZhL2xhbmcvU3RyaW5nLmphdmEiIG9uIFVuaXgKLQkgKiBhbmQgImphdmFcXGxhbmdcXFN0cmluZy5qYXZhIiBvbiBXaW5kb3dzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSmF2YUZpbGVOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0ZpbGVOYW1lQmFzZShjbGFzc05hbWUpICsgIi5qYXZhIjsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSBqYXZhIGZpbGUgbmFtZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gamF2YS5sYW5nLlN0cmluZy5jbGFzcyBpcyBjb252ZXJ0ZWQgdG8gImphdmEvbGFuZy9TdHJpbmcuamF2YSIgb24gVW5peAotCSAqIGFuZCAiamF2YVxcbGFuZ1xcU3RyaW5nLmphdmEiIG9uIFdpbmRvd3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9KYXZhRmlsZU5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9KYXZhRmlsZU5hbWUoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYSBqYXZhIGZpbGUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuICJqYXZhLmxhbmcuU3RyaW5nIiBpcyBjb252ZXJ0ZWQgdG8gRmlsZShqYXZhL2xhbmcvU3RyaW5nLmphdmEpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0phdmFGaWxlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGNvbnZlcnRUb0phdmFGaWxlTmFtZShjbGFzc05hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSBqYXZhIGZpbGUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIGphdmEubGFuZy5TdHJpbmcuY2xhc3MgaXMgY29udmVydGVkIHRvIEZpbGUoamF2YS9sYW5nL1N0cmluZy5qYXZhKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjb252ZXJ0VG9KYXZhRmlsZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0phdmFGaWxlKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKiogY2xhc3MgPT4gcmVzb3VyY2UgKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIHJlc291cmNlIG5hbWU7Ci0JICogZS5nLiBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzIGlzIGNvbnZlcnRlZCB0byAiL2phdmEvbGFuZy9TdHJpbmcuY2xhc3MiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1Jlc291cmNlTmFtZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuICcvJyArIGNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoamF2YUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSByZXNvdXJjZTsKLQkgKiBlLmcuIGphdmEubGFuZy5TdHJpbmcuY2xhc3MgaXMgY29udmVydGVkIHRvCi0JICogVVJMKGphcjpmaWxlOi9DOi9qZGsvMS40LjJfMDQvanJlL2xpYi9ydC5qYXIhL2phdmEvbGFuZy9TdHJpbmcuY2xhc3MpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGNvbnZlcnRUb1Jlc291cmNlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gamF2YUNsYXNzLmdldFJlc291cmNlKGNvbnZlcnRUb1Jlc291cmNlTmFtZShqYXZhQ2xhc3MpKTsKLQl9Ci0KLQotCS8vICoqKioqIHV0aWxpdGllcyAqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIGlzIGFuIGFyY2hpdmUgZmlsZTsKLQkgKiBpLmUuIGl0cyBuYW1lIGVuZHMgd2l0aCAiLnppcCIgb3IgIi5qYXIiCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVOYW1lSXNBcmNoaXZlKFN0cmluZyBmaWxlTmFtZSkgewotCQlTdHJpbmcgZXh0ID0gRmlsZVRvb2xzLmV4dGVuc2lvbihmaWxlTmFtZSkudG9Mb3dlckNhc2UoKTsKLQkJcmV0dXJuIGV4dC5lcXVhbHMoIi5qYXIiKSB8fCBleHQuZXF1YWxzKCIuemlwIik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBpcyBhbiBhcmNoaXZlIGZpbGU7Ci0JICogaS5lLiBpdHMgbmFtZSBlbmRzIHdpdGggIi56aXAiIG9yICIuamFyIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaWxlSXNBcmNoaXZlKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZmlsZU5hbWVJc0FyY2hpdmUoZmlsZS5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hhdCBzaG91bGQgYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBmaWxlIG5hbWUKLQkgKiBmb3IgdGhlIEpSRSBydW50aW1lIEpBUjsKLQkgKiBlLmcuICJDOlxqZGsxLjQuMl8wNFxqcmVcbGliXHJ0LmphciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnRKYXJOYW1lKCkgewotCQlyZXR1cm4gbG9jYXRpb25Gb3IoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbG9jYXRpb24gZnJvbSB3aGVyZSB0aGUgc3BlY2lmaWVkIGNsYXNzIHdhcyBsb2FkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYXRpb25Gb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVVSTCB1cmwgPSBjb252ZXJ0VG9SZXNvdXJjZShqYXZhQ2xhc3MpOwotCQlTdHJpbmcgcGF0aDsKLQkJdHJ5IHsKLQkJCXBhdGggPSBGaWxlVG9vbHMuYnVpbGRGaWxlKHVybCkuZ2V0UGF0aCgpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlTdHJpbmcgcHJvdG9jb2wgPSB1cmwuZ2V0UHJvdG9jb2woKS50b0xvd2VyQ2FzZSgpOwotCQlpZiAocHJvdG9jb2wuZXF1YWxzKCJqYXIiKSkgewotCQkJLy8gaWYgdGhlIGNsYXNzIGlzIGluIGEgSkFSLCB0aGUgVVJMIHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgotCQkJLy8gICAgIGphcjpmaWxlOi9DOi9qZGsvMS40LjJfMDQvanJlL2xpYi9ydC5qYXIhL2phdmEvbGFuZy9TdHJpbmcuY2xhc3MKLQkJCXJldHVybiBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmluZGV4T2YoJyEnKSk7Ci0JCX0gZWxzZSBpZiAocHJvdG9jb2wuZXF1YWxzKCJmaWxlIikpIHsKLQkJCS8vIGlmIHRoZSBjbGFzcyBpcyBpbiBhIGRpcmVjdG9yeSwgdGhlIFVSTCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKLQkJCS8vICAgICBmaWxlOi9DOi9kZXYvbWFpbi9td2Rldi9jbGFzcy9vcmcvZWNsaXBzZS9kYWxpL3V0aWxpdHkvQ2xhc3NwYXRoLmNsYXNzCi0JCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoamF2YUNsYXNzKS5sZW5ndGgoKSAtIDEpOwotCQl9IGVsc2UgaWYgKHByb3RvY29sLmVxdWFscygiYnVuZGxlcmVzb3VyY2UiKSkgewotCQkJLy8gaWYgdGhlIGNsYXNzIGlzIGluIGEgYnVuZGxlIHJlc291cmNlIChFY2xpcHNlPyksIHRoZSBVUkwgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0JCQkvLyAgICAgYnVuZGxlcmVzb3VyY2U6Ly80My9vcmcvZWNsaXBzZS9kYWxpL3V0aWxpdHkvQ2xhc3NwYXRoLmNsYXNzCi0JCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoamF2YUNsYXNzKS5sZW5ndGgoKSAtIDEpOwotCQl9Ci0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih1cmwudG9TdHJpbmcoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGlyZWN0b3JpZXMgdXNlZCBieSB0aGUgSmF2YSBFeHRlbnNpb24gTWVjaGFuaXNtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZVtdIGphdmFFeHRlbnNpb25EaXJlY3RvcmllcygpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0ZpbGVzKGphdmFFeHRlbnNpb25EaXJlY3RvcnlOYW1lcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRpcmVjdG9yeSBuYW1lcyB1c2VkIGJ5IHRoZSBKYXZhIEV4dGVuc2lvbiBNZWNoYW5pc20uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBqYXZhRXh0ZW5zaW9uRGlyZWN0b3J5TmFtZXMoKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuZXh0LmRpcnMiKS5zcGxpdChGaWxlLnBhdGhTZXBhcmF0b3IpOwotCX0KLQotCi0JLy8gKioqKiogaW50ZXJuYWwgKioqKioKLQotCXByaXZhdGUgc3RhdGljIEZpbGVbXSBjb252ZXJ0VG9GaWxlcyhTdHJpbmdbXSBmaWxlTmFtZXMpIHsKLQkJRmlsZVtdIGZpbGVzID0gbmV3IEZpbGVbZmlsZU5hbWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSBmaWxlTmFtZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWZpbGVzW2ldID0gbmV3IEZpbGUoZmlsZU5hbWVzW2ldKTsKLQkJfQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKYXJGaWxlTmFtZXNUbyhGaWxlIGRpciwgTGlzdDxTdHJpbmc+IGphckZpbGVOYW1lcykgewotCQlGaWxlW10gamFyRmlsZXMgPSBqYXJGaWxlc0luKGRpcik7Ci0JCWZvciAoRmlsZSBqYXJGaWxlIDogamFyRmlsZXMpIHsKLQkJCWphckZpbGVOYW1lcy5hZGQoRmlsZVRvb2xzLmNhbm9uaWNhbEZpbGUoamFyRmlsZSkuZ2V0UGF0aCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEZpbGVbXSBqYXJGaWxlc0luKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCXJldHVybiBkaXJlY3RvcnkubGlzdEZpbGVzKGphckZpbGVGaWx0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZUZpbHRlciBqYXJGaWxlRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKSB7Ci0JCQkJcmV0dXJuIEZpbGVUb29scy5leHRlbnNpb24oZmlsZS5nZXROYW1lKCkpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCIuamFyIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjbGFzc3BhdGggd2l0aCB0aGUgc3BlY2lmaWVkIGVudHJpZXMuCi0JICovCi0JcHJpdmF0ZSBDbGFzc3BhdGgoRW50cnlbXSBlbnRyaWVzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZW50cmllcyA9IGVudHJpZXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2xhc3NwYXRoIHdpdGggdGhlIHNwZWNpZmllZCBlbnRyaWVzLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGgoU3RyaW5nW10gZmlsZU5hbWVzKSB7Ci0JCXRoaXMoYnVpbGRFbnRyaWVzKGZpbGVOYW1lcykpOwotCX0KLQotCS8qKgotCSAqIFNraXAgZW1wdHkgZmlsZSBuYW1lcyBiZWNhdXNlIHRoZXkgd2lsbCBlbmQgdXAgZXhwYW5kaW5nIHRvIHRoZSBjdXJyZW50Ci0JICogd29ya2luZyBkaXJlY3RvcnksIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnQuIEVtcHR5IGZpbGUgbmFtZXMgYWN0dWFsbHkKLQkgKiBvY2N1ciB3aXRoIHNvbWUgZnJlcXVlbmN5OyBzdWNoIGFzIHdoZW4gdGhlIGNsYXNzcGF0aCBoYXMgYmVlbiBidWlsdCB1cAotCSAqIGR5bmFtaWNhbGx5IHdpdGggdG9vIG1hbnkgc2VwYXJhdG9ycy4gRm9yIGV4YW1wbGU6Ci0JICogICAgICJDOlxkZXZcZm9vLmphcjs7QzpcZGV2XGJhci5qYXIiCi0JICogd2lsbCBiZSBwYXJzZWQgaW50byB0aHJlZSBmaWxlIG5hbWVzOgotCSAqICAgICB7ICJDOlxkZXZcZm9vLmphciIsICIiLCAiQzpcZGV2XGJhci5qYXIiIH0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBFbnRyeVtdIGJ1aWxkRW50cmllcyhTdHJpbmdbXSBmaWxlTmFtZXMpIHsKLQkJTGlzdDxFbnRyeT4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8RW50cnk+KCk7Ci0JCWZvciAoU3RyaW5nIGZpbGVOYW1lIDogZmlsZU5hbWVzKSB7Ci0JCQlpZiAoKGZpbGVOYW1lICE9IG51bGwpICYmIChmaWxlTmFtZS5sZW5ndGgoKSAhPSAwKSkgewotCQkJCWVudHJpZXMuYWRkKG5ldyBFbnRyeShmaWxlTmFtZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbnRyaWVzLnRvQXJyYXkobmV3IEVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2xhc3NwYXRoIHdpdGggdGhlIHNwZWNpZmllZCBwYXRoLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGgoU3RyaW5nIHBhdGgpIHsKLQkJdGhpcyhwYXRoLnNwbGl0KEZpbGUucGF0aFNlcGFyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNsYXNzcGF0aCB3aXRoIHRoZSBzcGVjaWZpZWQgZW50cmllcy4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKExpc3Q8U3RyaW5nPiBmaWxlTmFtZXMpIHsKLQkJdGhpcyhmaWxlTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW2ZpbGVOYW1lcy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc29saWRhdGUgdGhlIHNwZWNpZmllZCBjbGFzc3BhdGhzIGludG8gYSBzaW5nbGUgY2xhc3NwYXRoLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGgoQ2xhc3NwYXRoW10gY2xhc3NwYXRocykgewotCQl0aGlzKGNvbnNvbGlkYXRlRW50cmllcyhjbGFzc3BhdGhzKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRW50cnlbXSBjb25zb2xpZGF0ZUVudHJpZXMoQ2xhc3NwYXRoW10gY2xhc3NwYXRocykgewotCQlMaXN0PEVudHJ5PiBlbnRyaWVzID0gbmV3IEFycmF5TGlzdDxFbnRyeT4oKTsKLQkJZm9yIChDbGFzc3BhdGggY2xhc3NwYXRoIDogY2xhc3NwYXRocykgewotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChlbnRyaWVzLCBjbGFzc3BhdGguZW50cmllcygpKTsKLQkJfQotCQlyZXR1cm4gZW50cmllcy50b0FycmF5KG5ldyBFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3NwYXRoJ3MgZW50cmllcy4KLQkgKi8KLQlwdWJsaWMgRW50cnlbXSBlbnRyaWVzKCkgewotCQlyZXR1cm4gdGhpcy5lbnRyaWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3NwYXRoJ3MgcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHBhdGgoKSB7Ci0JCUVudHJ5W10gbG9jYWxFbnRyaWVzID0gdGhpcy5lbnRyaWVzOwotCQlpbnQgbWF4ID0gbG9jYWxFbnRyaWVzLmxlbmd0aCAtIDE7Ci0JCWlmIChtYXggPT0gLTEpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwMCk7Ci0JCS8vIHN0b3Agb25lIHNob3J0IG9mIHRoZSBlbmQgb2YgdGhlIGFycmF5Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXNiLmFwcGVuZChsb2NhbEVudHJpZXNbaV0uZmlsZU5hbWUoKSk7Ci0JCQlzYi5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcik7Ci0JCX0KLQkJc2IuYXBwZW5kKGxvY2FsRW50cmllc1ttYXhdLmZpbGVOYW1lKCkpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2ggdGhlIGNsYXNzcGF0aCBmb3IgdGhlIHNwZWNpZmllZCAodW5xdWFsaWZpZWQpIGZpbGUKLQkgKiBhbmQgcmV0dXJuIGl0cyBlbnRyeS4gUmV0dXJuIG51bGwgaWYgYW4gZW50cnkgaXMgbm90IGZvdW5kLgotCSAqIEZvciBleGFtcGxlLCB5b3UgY291bGQgdXNlIHRoaXMgbWV0aG9kIHRvIGZpbmQgdGhlIGVudHJ5Ci0JICogZm9yICJydC5qYXIiIG9yICJ0b3BsaW5rLmphciIuCi0JICovCi0JcHVibGljIEVudHJ5IGVudHJ5Rm9yRmlsZU5hbWVkKFN0cmluZyBzaG9ydEZpbGVOYW1lKSB7Ci0JCUVudHJ5W10gbG9jYWxFbnRyaWVzID0gdGhpcy5lbnRyaWVzOwotCQlmb3IgKEVudHJ5IGVudHJ5IDogbG9jYWxFbnRyaWVzKSB7Ci0JCQlpZiAoZW50cnkuZmlsZSgpLmdldE5hbWUoKS5lcXVhbHMoc2hvcnRGaWxlTmFtZSkpIHsKLQkJCQlyZXR1cm4gZW50cnk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbnRyeSBmaWxlIGluIHRoZSBjbGFzc3BhdGgKLQkgKiB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogUmV0dXJuIG51bGwgaWYgYW4gZW50cnkgaXMgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBFbnRyeSBlbnRyeUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlTdHJpbmcgcmVsYXRpdmVDbGFzc0ZpbGVOYW1lID0gY29udmVydFRvQ2xhc3NGaWxlTmFtZShjbGFzc05hbWUpOwotCQlTdHJpbmcgYXJjaGl2ZUVudHJ5TmFtZSA9IGNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoY2xhc3NOYW1lKTsKLQkJRW50cnlbXSBsb2NhbEVudHJpZXMgPSB0aGlzLmVudHJpZXM7Ci0JCWZvciAoRW50cnkgZW50cnkgOiBsb2NhbEVudHJpZXMpIHsKLQkJCWlmIChlbnRyeS5jb250YWlucyhyZWxhdGl2ZUNsYXNzRmlsZU5hbWUsIGFyY2hpdmVFbnRyeU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVudHJ5OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aCwKLQkgKiB3aXRoIGR1cGxpY2F0ZXMgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gY2xhc3NOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lcyhGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIGFuZCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlciwgd2l0aCBkdXBsaWNhdGVzIHJlbW92ZWQuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGNsYXNzTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigxMDAwMCk7Ci0JCXRoaXMuYWRkQ2xhc3NOYW1lc1RvKGNsYXNzTmFtZXMsIGZpbHRlcik7Ci0JCXJldHVybiBjbGFzc05hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tjbGFzc05hbWVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDbGFzc05hbWVzVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMpIHsKLQkJdGhpcy5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgRmlsdGVyLk51bGwuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGgKLQkgKiBhbmQgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENsYXNzTmFtZXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCUVudHJ5W10gbG9jYWxFbnRyaWVzID0gdGhpcy5lbnRyaWVzOwotCQlmb3IgKEVudHJ5IGVudHJ5IDogbG9jYWxFbnRyaWVzKSB7Ci0JCQllbnRyeS5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aC4KLQkgKiBKdXN0IGEgYml0IG1vcmUgcGVyZm9ybWFudCB0aGFuICNjbGFzc05hbWVzKCkuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lc1N0cmVhbSgpIHsKLQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lc1N0cmVhbShGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyLgotCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4gI2NsYXNzTmFtZXMoRmlsdGVyKS4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzU3RyZWFtKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4odGhpcy5lbnRyeUNsYXNzTmFtZXNTdHJlYW1zKGZpbHRlcikpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gZW50cnlDbGFzc05hbWVzU3RyZWFtcyhmaW5hbCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEVudHJ5LCBJdGVyYXRvcjxTdHJpbmc+PihuZXcgQXJyYXlJdGVyYXRvcjxFbnRyeT4odGhpcy5lbnRyaWVzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB0cmFuc2Zvcm0oRW50cnkgZW50cnkpIHsKLQkJCQlyZXR1cm4gZW50cnkuY2xhc3NOYW1lc1N0cmVhbShmaWx0ZXIpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhICJjb21wcmVzc2VkIiB2ZXJzaW9uIG9mIHRoZSBjbGFzc3BhdGggd2l0aCBpdHMKLQkgKiBkdXBsaWNhdGUgZW50cmllcyBlbGltaW5hdGVkLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGggY29tcHJlc3NlZCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKHRoaXMuZW50cmllcykpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGNsYXNzcGF0aCB0byBhbiBhcnJheSBvZiBVUkxzCi0JICogKHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgYSBVUkxDbGFzc0xvYWRlcikuCi0JICovCi0JcHVibGljIFVSTFtdIHVybHMoKSB7Ci0JCUVudHJ5W10gbG9jYWxFbnRyaWVzID0gdGhpcy5lbnRyaWVzOwotCQlpbnQgbGVuID0gbG9jYWxFbnRyaWVzLmxlbmd0aDsKLQkJVVJMW10gdXJscyA9IG5ldyBVUkxbbGVuXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdXJsc1tpXSA9IGxvY2FsRW50cmllc1tpXS51cmwoKTsKLQkJfQotCQlyZXR1cm4gdXJsczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnBhdGgoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRPRE8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVudHJ5IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZU5hbWU7Ci0JCXByaXZhdGUgZmluYWwgRmlsZSBmaWxlOwotCQlwcml2YXRlIGZpbmFsIEZpbGUgY2Fub25pY2FsRmlsZTsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlFbnRyeShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAoKGZpbGVOYW1lID09IG51bGwpIHx8IChmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidmaWxlTmFtZScgbXVzdCBiZSBub24tZW1wdHkiKTsKLQkJCX0KLQkJCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQkJCXRoaXMuZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJCXRoaXMuY2Fub25pY2FsRmlsZSA9IEZpbGVUb29scy5jYW5vbmljYWxGaWxlKHRoaXMuZmlsZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGZpbGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuZmlsZU5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgRmlsZSBmaWxlKCkgewotCQkJcmV0dXJuIHRoaXMuZmlsZTsKLQkJfQotCi0JCXB1YmxpYyBGaWxlIGNhbm9uaWNhbEZpbGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jYW5vbmljYWxGaWxlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjYW5vbmljYWxGaWxlTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLmNhbm9uaWNhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBFbnRyeSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gKChFbnRyeSkgbykuY2Fub25pY2FsRmlsZS5lcXVhbHModGhpcy5jYW5vbmljYWxGaWxlKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIHRoaXMuY2Fub25pY2FsRmlsZS5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgZW50cnkncyAiY2Fub25pY2FsIiBVUkwuCi0JCSAqLwotCQlwdWJsaWMgVVJMIHVybCgpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHRoaXMuY2Fub25pY2FsRmlsZS50b1VSTCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRhaW5zKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRyeSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuY29udGFpbnMoY29udmVydFRvQ2xhc3NGaWxlTmFtZShjbGFzc05hbWUpLCBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKGNsYXNzTmFtZSkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRyeSBjb250YWlucyBlaXRoZXIgdGhlIHNwZWNpZmllZCByZWxhdGl2ZQotCQkgKiBjbGFzcyBmaWxlIG9yIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZSBlbnRyeS4KLQkJICogTm90IHRoZSBwcmV0dGllc3Qgc2lnbmF0dXJlLCBidXQgaXQncyBpbnRlcm5hbC4uLi4KLQkJICovCi0JCWJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHJlbGF0aXZlQ2xhc3NGaWxlTmFtZSwgU3RyaW5nIGFyY2hpdmVFbnRyeU5hbWUpIHsKLQkJCWlmICggISB0aGlzLmNhbm9uaWNhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAodGhpcy5jYW5vbmljYWxGaWxlLmlzRGlyZWN0b3J5KCkgJiYgKG5ldyBGaWxlKHRoaXMuY2Fub25pY2FsRmlsZSwgcmVsYXRpdmVDbGFzc0ZpbGVOYW1lKSkuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiAoZmlsZUlzQXJjaGl2ZSh0aGlzLmNhbm9uaWNhbEZpbGUpICYmIHRoaXMuYXJjaGl2ZUNvbnRhaW5zRW50cnkoYXJjaGl2ZUVudHJ5TmFtZSkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRyeSdzIGFyY2hpdmUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbnRyeS4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBhcmNoaXZlQ29udGFpbnNFbnRyeShTdHJpbmcgemlwRW50cnlOYW1lKSB7Ci0JCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOwotCQkJWmlwRW50cnkgemlwRW50cnkgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlID0gbmV3IFppcEZpbGUodGhpcy5jYW5vbmljYWxGaWxlKTsKLQkJCQl6aXBFbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkoemlwRW50cnlOYW1lKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gc29tZXRoaW5nIGlzIHdyb25nLCBsZWF2ZSB0aGUgZW50cnkgbnVsbAotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoemlwRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQl6aXBGaWxlLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQl6aXBFbnRyeSA9IG51bGw7CS8vIHNvbWV0aGluZyBpcyB3cm9uZywgY2xlYXIgb3V0IHRoZSBlbnRyeQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB6aXBFbnRyeSAhPSBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgaW4gdGhlIGVudHJ5LgotCQkgKi8KLQkJcHVibGljIFN0cmluZ1tdIGNsYXNzTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGFzc05hbWVzKEZpbHRlci5OdWxsLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBpbiB0aGUgZW50cnkKLQkJICogYW5kIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyLgotCQkgKi8KLQkJcHVibGljIFN0cmluZ1tdIGNsYXNzTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigyMDAwKTsKLQkJCXRoaXMuYWRkQ2xhc3NOYW1lc1RvKGNsYXNzTmFtZXMsIGZpbHRlcik7Ci0JCQlyZXR1cm4gY2xhc3NOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbY2xhc3NOYW1lcy5zaXplKCldKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIGluIHRoZSBlbnRyeQotCQkgKiB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRDbGFzc05hbWVzVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMpIHsKLQkJCXRoaXMuYWRkQ2xhc3NOYW1lc1RvKGNsYXNzTmFtZXMsIEZpbHRlci5OdWxsLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBpbiB0aGUgZW50cnkKLQkJICogYW5kIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZENsYXNzTmFtZXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlpZiAodGhpcy5jYW5vbmljYWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKHRoaXMuY2Fub25pY2FsRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCXRoaXMuYWRkQ2xhc3NOYW1lc0ZvckRpcmVjdG9yeVRvKGNsYXNzTmFtZXMsIGZpbHRlcik7Ci0JCQkJfSBlbHNlIGlmIChmaWxlSXNBcmNoaXZlKHRoaXMuY2Fub25pY2FsRmlsZSkpIHsKLQkJCQkJdGhpcy5hZGRDbGFzc05hbWVzRm9yQXJjaGl2ZVRvKGNsYXNzTmFtZXMsIGZpbHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQKLQkJICogdW5kZXIgdGhlIGVudHJ5J3MgZGlyZWN0b3J5IGFuZCBhY2NlcHRlZCBieQotCQkgKiB0aGUgc3BlY2lmaWVkIGZpbHRlciB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NOYW1lc0ZvckRpcmVjdG9yeVRvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCWludCBzdGFydCA9IHRoaXMuY2Fub25pY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5sZW5ndGgoKSArIDE7Ci0JCQlmb3IgKEl0ZXJhdG9yPEZpbGU+IHN0cmVhbSA9IHRoaXMuY2xhc3NGaWxlc0ZvckRpcmVjdG9yeSgpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29udmVydFRvQ2xhc3NOYW1lKHN0cmVhbS5uZXh0KCkuZ2V0QWJzb2x1dGVQYXRoKCkuc3Vic3RyaW5nKHN0YXJ0KSk7Ci0JCQkJaWYgKGZpbHRlci5hY2NlcHQoY2xhc3NOYW1lKSkgewotCQkJCQljbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBjbGFzcyBmaWxlcyBkaXNjb3ZlcmVkCi0JCSAqIHVuZGVyIHRoZSBlbnRyeSdzIGRpcmVjdG9yeS4KLQkJICovCi0JCXByaXZhdGUgSXRlcmF0b3I8RmlsZT4gY2xhc3NGaWxlc0ZvckRpcmVjdG9yeSgpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RmlsZSwgRmlsZT4oRmlsZVRvb2xzLmZpbGVzSW5UcmVlKHRoaXMuY2Fub25pY2FsRmlsZSkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoRmlsZSBuZXh0KSB7Ci0JCQkJCXJldHVybiBFbnRyeS50aGlzLmZpbGVOYW1lTWlnaHRCZUZvckNsYXNzRmlsZShuZXh0LmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkCi0JCSAqIGluIHRoZSBlbnRyeSdzIGFyY2hpdmUgZmlsZSBhbmQgYWNjZXB0ZWQgYnkgdGhlCi0JCSAqIHNwZWNpZmllZCBmaWx0ZXIgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGFkZENsYXNzTmFtZXNGb3JBcmNoaXZlVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHRoaXMuY2Fub25pY2FsRmlsZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWZvciAoRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBzdHJlYW0gPSB6aXBGaWxlLmVudHJpZXMoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCQlaaXBFbnRyeSB6aXBFbnRyeSA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyB6aXBFbnRyeU5hbWUgPSB6aXBFbnRyeS5nZXROYW1lKCk7Ci0JCQkJaWYgKHRoaXMuZmlsZU5hbWVNaWdodEJlRm9yQ2xhc3NGaWxlKHppcEVudHJ5TmFtZSkpIHsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbnZlcnRUb0NsYXNzTmFtZSh6aXBFbnRyeU5hbWUpOwotCQkJCQlpZiAoZmlsdGVyLmFjY2VwdChjbGFzc05hbWUpKSB7Ci0JCQkJCQljbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgbWlnaHQgYmUgYSBKYXZhIGNsYXNzIGZpbGUuCi0JCSAqIFRoZSBmaWxlIG5hbWUgbXVzdCBhdCBsZWFzdCBlbmQgd2l0aCAiLmNsYXNzIiBhbmQgY29udGFpbiBubyBzcGFjZXMuCi0JCSAqIChOZWl0aGVyIGNsYXNzIG5hbWVzIG5vciBwYWNrYWdlIG5hbWVzIG1heSBjb250YWluIHNwYWNlcy4pCi0JCSAqIFdoZXRoZXIgaXQgYWN0dWFsbHkgaXMgYSBjbGFzcyBmaWxlIHdpbGwgbmVlZCB0byBiZSBkZXRlcm1pbmVkIGJ5Ci0JCSAqIGEgY2xhc3MgbG9hZGVyLgotCQkgKi8KLQkJYm9vbGVhbiBmaWxlTmFtZU1pZ2h0QmVGb3JDbGFzc0ZpbGUoU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBGaWxlVG9vbHMuZXh0ZW5zaW9uKG5hbWUpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCIuY2xhc3MiKQotCQkJCQkmJiAobmFtZS5pbmRleE9mKCcgJykgPT0gLTEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aC4KLQkJICogSnVzdCBhIGJpdCBtb3JlIHBlcmZvcm1hbnQgdGhhbiAjY2xhc3NOYW1lcygpLgotCQkgKi8KLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lc1N0cmVhbSgpIHsKLQkJCXJldHVybiB0aGlzLmNsYXNzTmFtZXNTdHJlYW0oRmlsdGVyLk51bGwuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGgKLQkJICogdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4gI2NsYXNzTmFtZXMoRmlsdGVyKS4KLQkJICovCi0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNTdHJlYW0oRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlpZiAodGhpcy5jYW5vbmljYWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKHRoaXMuY2Fub25pY2FsRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCXJldHVybiB0aGlzLmNsYXNzTmFtZXNGb3JEaXJlY3RvcnkoZmlsdGVyKTsKLQkJCQl9Ci0JCQkJaWYgKGZpbGVJc0FyY2hpdmUodGhpcy5jYW5vbmljYWxGaWxlKSkgewotCQkJCQlyZXR1cm4gdGhpcy5jbGFzc05hbWVzRm9yQXJjaGl2ZShmaWx0ZXIpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZAotCQkgKiB1bmRlciB0aGUgZW50cnkncyBkaXJlY3RvcnkgYW5kIGFjY2VwdGVkIGJ5Ci0JCSAqIHRoZSBzcGVjaWZpZWQgZmlsdGVyLgotCQkgKi8KLQkJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNGb3JEaXJlY3RvcnkoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPih0aGlzLmNsYXNzTmFtZXNGb3JEaXJlY3RvcnkoKSwgZmlsdGVyKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUcmFuc2Zvcm0gdGhlIGNsYXNzIGZpbGVzIHRvIGNsYXNzIG5hbWVzLgotCQkgKi8KLQkJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNGb3JEaXJlY3RvcnkoKSB7Ci0JCQlmaW5hbCBpbnQgc3RhcnQgPSB0aGlzLmNhbm9uaWNhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkubGVuZ3RoKCkgKyAxOwotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEZpbGUsIFN0cmluZz4odGhpcy5jbGFzc0ZpbGVzRm9yRGlyZWN0b3J5KCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShGaWxlIGYpIHsKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0NsYXNzTmFtZShmLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZyhzdGFydCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZAotCQkgKiBpbiB0aGUgZW50cnkncyBhcmNoaXZlIGZpbGUgYW5kIGFjY2VwdGVkIGJ5IHRoZQotCQkgKiBzcGVjaWZpZWQgZmlsdGVyLgotCQkgKi8KLQkJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNGb3JBcmNoaXZlKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJLy8gd2UgY2FuJ3Qgc2ltcGx5IHdyYXAgaXRlcmF0b3JzIGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBhcmNoaXZlIGZpbGUuLi4KLQkJCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZSh0aGlzLmNhbm9uaWNhbEZpbGUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQkJfQotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KHppcEZpbGUuc2l6ZSgpKTsKLQkJCWZvciAoRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBzdHJlYW0gPSB6aXBGaWxlLmVudHJpZXMoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCQlaaXBFbnRyeSB6aXBFbnRyeSA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyB6aXBFbnRyeU5hbWUgPSB6aXBFbnRyeS5nZXROYW1lKCk7Ci0JCQkJaWYgKHRoaXMuZmlsZU5hbWVNaWdodEJlRm9yQ2xhc3NGaWxlKHppcEVudHJ5TmFtZSkpIHsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbnZlcnRUb0NsYXNzTmFtZSh6aXBFbnRyeU5hbWUpOwotCQkJCQlpZiAoZmlsdGVyLmFjY2VwdChjbGFzc05hbWUpKSB7Ci0JCQkJCQljbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2xhc3NOYW1lcy5pdGVyYXRvcigpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db2xsZWN0aW9uVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db2xsZWN0aW9uVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3ZWQ2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb21BY2Nlc3M7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuR2VuZXJpY0l0ZXJhdG9yV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvblRvb2xzIHsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gbmV3QXJyYXkoRVtdIGFycmF5LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiAoRVtdKSBBcnJheS5uZXdJbnN0YW5jZShhcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIGJlIGFkZGVkLgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkKE9iamVjdFtdIGFycmF5LCBPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkKEVbXSBhcnJheSwgRSB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGxlbiArIDEpOwotCQlpZiAobGVuID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBsZW4pOwotCQl9Ci0JCXJlc3VsdFtsZW5dID0gdmFsdWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogamF2YS51dGlsLkFycmF5cyNhZGQoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgT2JqZWN0IG8pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZChFW10gYXJyYXksIGludCBpbmRleCwgRSB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGxlbiArIDEpOwotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJfQotCQlyZXN1bHRbaW5kZXhdID0gdmFsdWU7Ci0JCWlmIChsZW4gPiBpbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyAxLCBsZW4gLSBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gYmUgYWRkZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNhZGQoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGFkZChjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbiArIDFdOwotCQlpZiAobGVuID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBsZW4pOwotCQl9Ci0JCXJlc3VsdFtsZW5dID0gdmFsdWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZChjaGFyW10gYXJyYXksIGludCBpbmRleCwgY2hhciB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBhZGQoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgsIGNoYXIgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbiArIDFdOwotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJfQotCQlyZXN1bHRbaW5kZXhdID0gdmFsdWU7Ci0JCWlmIChsZW4gPiBpbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyAxLCBsZW4gLSBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gYmUgYWRkZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNhZGQoaW50W10gYXJyYXksIGludCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGFkZChpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbbGVuICsgMV07Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGxlbik7Ci0JCX0KLQkJcmVzdWx0W2xlbl0gPSB2YWx1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkKGludFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGFkZChpbnRbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtsZW4gKyAxXTsKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCX0KLQkJcmVzdWx0W2luZGV4XSA9IHZhbHVlOwotCQlpZiAobGVuID4gaW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4LCByZXN1bHQsIGluZGV4ICsgMSwgbGVuIC0gaW5kZXgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI2FkZEFsbChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IHN1cGVyIEU+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYWRkQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiNhZGRBbGwoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBzaXplKSB7Ci0JCXJldHVybiBhZGRBbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI2FkZEFsbChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IHN1cGVyIEU+IGNvbGxlY3Rpb24sIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSkgPyBjb2xsZWN0aW9uLmFkZEFsbChsaXN0KGl0ZXJhdG9yKSkgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jYWRkQWxsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gc3VwZXIgRT4gY29sbGVjdGlvbiwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSkgPyBjb2xsZWN0aW9uLmFkZEFsbChsaXN0KGl0ZXJhdG9yLCBzaXplKSkgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jYWRkQWxsKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBFW10gYXJyYXkpIHsKLQkJcmV0dXJuIChhcnJheS5sZW5ndGggPT0gMCkgPyBmYWxzZSA6IGNvbGxlY3Rpb24uYWRkQWxsKEFycmF5cy5hc0xpc3QoYXJyYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuTGlzdCNhZGRBbGwoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKExpc3Q8PyBzdXBlciBFPiBsaXN0LCBpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBhZGRBbGwobGlzdCwgaW5kZXgsIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5MaXN0I2FkZEFsbChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoTGlzdDw/IHN1cGVyIEU+IGxpc3QsIGludCBpbmRleCwgSXRlcmFibGU8RT4gaXRlcmFibGUsIGludCBzaXplKSB7Ci0JCXJldHVybiBhZGRBbGwobGlzdCwgaW5kZXgsIGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNpemUpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5MaXN0I2FkZEFsbChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoTGlzdDw/IHN1cGVyIEU+IGxpc3QsIGludCBpbmRleCwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGxpc3QuYWRkQWxsKGluZGV4LCBsaXN0KGl0ZXJhdG9yKSkgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuTGlzdCNhZGRBbGwoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKExpc3Q8PyBzdXBlciBFPiBsaXN0LCBpbnQgaW5kZXgsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJcmV0dXJuIChpdGVyYXRvci5oYXNOZXh0KCkpID8gbGlzdC5hZGRBbGwoaW5kZXgsIGxpc3QoaXRlcmF0b3IsIHNpemUpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5MaXN0I2FkZEFsbChPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBFW10gYXJyYXkpIHsKLQkJcmV0dXJuIChhcnJheS5sZW5ndGggPT0gMCkgPyBmYWxzZSA6IGxpc3QuYWRkQWxsKGluZGV4LCBBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogamF2YS51dGlsLkFycmF5cyNhZGRBbGwoT2JqZWN0W10gYXJyYXksIGphdmEudXRpbC5Db2xsZWN0aW9uIGMpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJaW50IHNpemUgPSBjb2xsZWN0aW9uLnNpemUoKTsKLQkJcmV0dXJuIChzaXplID09IDApID8gYXJyYXkgOiBhZGRBbGwoYXJyYXksIGNvbGxlY3Rpb24sIHNpemUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIGlzIG5vbi1lbXB0eQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbi5zaXplKCkpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIGlzIG5vbi1lbXB0eQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgbGVuICsgY29sbGVjdGlvblNpemUpOwotCQlpZiAobGVuID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBsZW4pOwotCQl9Ci0JCWludCBpID0gbGVuOwotCQlmb3IgKEUgaXRlbSA6IGNvbGxlY3Rpb24pIHsKLQkJCXJlc3VsdFtpKytdID0gaXRlbTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZEFsbChPYmplY3RbXSBhcnJheSwgamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkQWxsKE9iamVjdFtdIGFycmF5LCBqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkQWxsKE9iamVjdFtdIGFycmF5LCBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSkgPyBhZGRBbGxfKGFycmF5LCBsaXN0KGl0ZXJhdG9yKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLkFycmF5cyNhZGRBbGwoT2JqZWN0W10gYXJyYXksIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSkgPyBhZGRBbGxfKGFycmF5LCBsaXN0KGl0ZXJhdG9yLCBzaXplKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IDEgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkQWxsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5MSwgRVtdIGFycmF5MikgewotCQlpbnQgYXJyYXkyTGVuZ3RoID0gYXJyYXkyLmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5Mkxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBFW10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MiA6IGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheTFMZW5ndGggPiAwIGFuZCBhcnJheTJMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5MSwgRVtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXkxLCBhcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBhcnJheTFMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIGZpcnN0IHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBvYmplY3RzIGluIHRoZSBzZWNvbmQKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZChPYmplY3RbXSBhcnJheTEsIGludCBpbmRleCwgT2JqZWN0W10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5MSwgaW50IGluZGV4LCBFW10gYXJyYXkyKSB7Ci0JCWludCBhcnJheTJMZW5ndGggPSBhcnJheTIubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5Mkxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBpbnQgaW5kZXgsIEVbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCXJldHVybiAoaW5kZXggPT0gYXJyYXkxTGVuZ3RoKSA/ICAvLyBhcnJheTIgYWRkZWQgdG8gZW5kIG9mIGFycmF5MQotCQkJCShhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTIgOiBhZGRBbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKQotCQkJOgotCQkJCWFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkxTGVuZ3RoID4gMCBhbmQgYXJyYXkyTGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIGludCBpbmRleCwgRVtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXkxLCBhcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGluZGV4LCBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyBhcnJheTJMZW5ndGgsIGFycmF5MUxlbmd0aCAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogamF2YS51dGlsLkFycmF5cyNhZGRBbGwoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgamF2YS51dGlsLkNvbGxlY3Rpb24gYykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCWludCBzaXplID0gY29sbGVjdGlvbi5zaXplKCk7Ci0JCXJldHVybiAoc2l6ZSA9PSAwKSA/IGFycmF5IDogYWRkQWxsKGFycmF5LCBpbmRleCwgY29sbGVjdGlvbiwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGluZGV4LCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uLnNpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgYXJyYXlMZW5ndGggKyBjb2xsZWN0aW9uU2l6ZSk7Ci0JCWlmICgoYXJyYXlMZW5ndGggPT0gMCkgJiYgKGluZGV4ID09IDApKSB7Ci0JCQlyZXR1cm4gY29sbGVjdGlvbi50b0FycmF5KHJlc3VsdCk7Ci0JCX0KLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCWludCBpID0gaW5kZXg7Ci0JCWZvciAoRSBpdGVtIDogY29sbGVjdGlvbikgewotCQkJcmVzdWx0W2krK10gPSBpdGVtOwotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4LCByZXN1bHQsIGluZGV4ICsgY29sbGVjdGlvblNpemUsIGFycmF5TGVuZ3RoIC0gaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogamF2YS51dGlsLkFycmF5cyNhZGRBbGwoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpbmRleCwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZEFsbChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpbmRleCwgaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZEFsbChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGFkZEFsbF8oYXJyYXksIGluZGV4LCBsaXN0KGl0ZXJhdG9yKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvciBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkQWxsKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGFkZEFsbF8oYXJyYXksIGluZGV4LCBsaXN0KGl0ZXJhdG9yLCBzaXplKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IDEgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpIHsKLQkJaW50IGFycmF5Mkxlbmd0aCA9IGFycmF5Mi5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gYXJyYXkxIDogYWRkQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheTJMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MiA6IGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheTFMZW5ndGggPiAwIGFuZCBhcnJheTJMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhclthcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBhcnJheTFMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIGZpcnN0IHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBvYmplY3RzIGluIHRoZSBzZWNvbmQKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZChjaGFyW10gYXJyYXkxLCBpbnQgaW5kZXgsIGNoYXJbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhcltdIGFycmF5MikgewotCQlpbnQgYXJyYXkyTGVuZ3RoID0gYXJyYXkyLmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGwoYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheTJMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbChjaGFyW10gYXJyYXkxLCBpbnQgaW5kZXgsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCXJldHVybiAoaW5kZXggPT0gYXJyYXkxTGVuZ3RoKSA/ICAvLyBhcnJheTIgYWRkZWQgdG8gZW5kIG9mIGFycmF5MQotCQkJCShhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTIgOiBhZGRBbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKQotCQkJOgotCQkJCWFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkxTGVuZ3RoID4gMCBhbmQgYXJyYXkyTGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBhZGRBbGwoY2hhcltdIGFycmF5MSwgaW50IGluZGV4LCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhclthcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGluZGV4LCBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyBhcnJheTJMZW5ndGgsIGFycmF5MUxlbmd0aCAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IDEgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gYWRkQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKSB7Ci0JCWludCBhcnJheTJMZW5ndGggPSBhcnJheTIubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkyTGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlpbnQgYXJyYXkxTGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTIgOiBhZGRBbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkxTGVuZ3RoID4gMCBhbmQgYXJyYXkyTGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2FycmF5MUxlbmd0aCArIGFycmF5Mkxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGFycmF5MUxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogZmlyc3Qgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG9iamVjdHMgaW4gdGhlIHNlY29uZAotCSAqIHNwZWNpZmllZCBhcnJheSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkKGludFtdIGFycmF5MSwgaW50IGluZGV4LCBpbnRbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBhZGRBbGwoaW50W10gYXJyYXkxLCBpbnQgaW5kZXgsIGludFtdIGFycmF5MikgewotCQlpbnQgYXJyYXkyTGVuZ3RoID0gYXJyYXkyLmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGwoYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheTJMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gYWRkQWxsKGludFtdIGFycmF5MSwgaW50IGluZGV4LCBpbnRbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCXJldHVybiAoaW5kZXggPT0gYXJyYXkxTGVuZ3RoKSA/ICAvLyBhcnJheTIgYWRkZWQgdG8gZW5kIG9mIGFycmF5MQotCQkJCShhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTIgOiBhZGRBbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKQotCQkJOgotCQkJCWFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkxTGVuZ3RoID4gMCBhbmQgYXJyYXkyTGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludCBpbmRleCwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoICsgYXJyYXkyTGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBpbmRleCwgYXJyYXkyTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIGluZGV4LCByZXN1bHQsIGluZGV4ICsgYXJyYXkyTGVuZ3RoLCBhcnJheTFMZW5ndGggLSBpbmRleCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3RvQXJyYXkoKQotCSAqIGphdmEubGFuZy5JdGVyYWJsZSN0b0FycmF5KCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGFycmF5KEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBhcnJheShpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jdG9BcnJheSgpCi0JICogamF2YS5sYW5nLkl0ZXJhYmxlI3RvQXJyYXkoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gYXJyYXkoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBzaXplKSB7Ci0JCXJldHVybiBhcnJheShpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlOwotCSAqIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlIHJldHVybmVkIGFycmF5IGlzIHRoYXQgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBJZiB0aGUgY29sbGVjdGlvbiBmaXRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXksIGl0IGlzIHJldHVybmVkIHRoZXJlaW4uCi0JICogT3RoZXJ3aXNlLCBhIG5ldyBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCB0aGUgcnVudGltZSB0eXBlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBhbmQgdGhlIHNpemUgb2YgdGhpcyBjb2xsZWN0aW9uLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jdG9BcnJheShqYXZhLmxhbmcuT2JqZWN0W10pCi0JICogamF2YS5sYW5nLkl0ZXJhYmxlI3RvQXJyYXkoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFycmF5KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgRVtdIGFycmF5KSB7Ci0JCXJldHVybiBhcnJheShpdGVyYWJsZS5pdGVyYXRvcigpLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZTsKLQkgKiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGF0IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogSWYgdGhlIGNvbGxlY3Rpb24gZml0cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LCBpdCBpcyByZXR1cm5lZCB0aGVyZWluLgotCSAqIE90aGVyd2lzZSwgYSBuZXcgYXJyYXkgaXMgYWxsb2NhdGVkIHdpdGggdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYW5kIHRoZSBzaXplIG9mIHRoaXMgY29sbGVjdGlvbi4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3RvQXJyYXkoamF2YS5sYW5nLk9iamVjdFtdKQotCSAqIGphdmEubGFuZy5JdGVyYWJsZSN0b0FycmF5KE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhcnJheShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBzaXplLCBFW10gYXJyYXkpIHsKLQkJcmV0dXJuIGFycmF5KGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNpemUsIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jdG9BcnJheSgpCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI3RvQXJyYXkoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gYXJyYXkoSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIChpdGVyYXRvci5oYXNOZXh0KCkpID8gbGlzdChpdGVyYXRvcikudG9BcnJheSgpIDogRU1QVFlfT0JKRUNUX0FSUkFZOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3RvQXJyYXkoKQotCSAqIGphdmEudXRpbC5JdGVyYXRvciN0b0FycmF5KCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGFycmF5KEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSkgPyBsaXN0KGl0ZXJhdG9yLCBzaXplKS50b0FycmF5KCkgOiBFTVBUWV9PQkpFQ1RfQVJSQVk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvcjsKLQkgKiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGF0IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogSWYgdGhlIGNvbGxlY3Rpb24gZml0cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LCBpdCBpcyByZXR1cm5lZCB0aGVyZWluLgotCSAqIE90aGVyd2lzZSwgYSBuZXcgYXJyYXkgaXMgYWxsb2NhdGVkIHdpdGggdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYW5kIHRoZSBzaXplIG9mIHRoaXMgY29sbGVjdGlvbi4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3RvQXJyYXkoamF2YS5sYW5nLk9iamVjdFtdKQotCSAqIGphdmEudXRpbC5JdGVyYXRvciN0b0FycmF5KE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhcnJheShJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEVbXSBhcnJheSkgewotCQlyZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSkgPyBsaXN0KGl0ZXJhdG9yKS50b0FycmF5KGFycmF5KSA6IG5ld0FycmF5KGFycmF5LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yOwotCSAqIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlIHJldHVybmVkIGFycmF5IGlzIHRoYXQgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBJZiB0aGUgY29sbGVjdGlvbiBmaXRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXksIGl0IGlzIHJldHVybmVkIHRoZXJlaW4uCi0JICogT3RoZXJ3aXNlLCBhIG5ldyBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCB0aGUgcnVudGltZSB0eXBlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBhbmQgdGhlIHNpemUgb2YgdGhpcyBjb2xsZWN0aW9uLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jdG9BcnJheShqYXZhLmxhbmcuT2JqZWN0W10pCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI3RvQXJyYXkoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFycmF5KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IHNpemUsIEVbXSBhcnJheSkgewotCQlyZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSkgPyBsaXN0KGl0ZXJhdG9yLCBzaXplKS50b0FycmF5KGFycmF5KSA6IG5ld0FycmF5KGFycmF5LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uLgotCSAqIEhhc2hCYWcoamF2YS51dGlsLkVudW1lcmF0aW9uIGVudW1lcmF0aW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEJhZzxFPiBiYWcoRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uKSB7Ci0JCXJldHVybiAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpID8KLQkJCQliYWcoZW51bWVyYXRpb24sIG5ldyBIYXNoQmFnPEU+KCkpCi0JCQk6Ci0JCQkJQmFnLkVtcHR5LjxFPmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKiBIYXNoQmFnKGphdmEudXRpbC5FbnVtZXJhdGlvbiBlbnVtZXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBCYWc8RT4gYmFnKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFPiBlbnVtZXJhdGlvbiwgaW50IHNpemUpIHsKLQkJcmV0dXJuIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgPwotCQkJCWJhZyhlbnVtZXJhdGlvbiwgbmV3IEhhc2hCYWc8RT4oc2l6ZSkpCi0JCQk6Ci0JCQkJQmFnLkVtcHR5LjxFPmluc3RhbmNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEJhZzxFPiBiYWcoRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uLCBIYXNoQmFnPEU+IGJhZykgewotCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWJhZy5hZGQoZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSk7Ci0JCX0KLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIEhhc2hCYWcoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEJhZzxFPiBiYWcoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBiYWcoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBIYXNoQmFnKGphdmEubGFuZy5JdGVyYWJsZSBpdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBCYWc8RT4gYmFnKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGJhZyhpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIEhhc2hCYWcoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEJhZzxFPiBiYWcoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/Ci0JCQkJYmFnKGl0ZXJhdG9yLCBuZXcgSGFzaEJhZzxFPigpKQotCQkJOgotCQkJCUJhZy5FbXB0eS48RT5pbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogSGFzaEJhZyhqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQmFnPEU+IGJhZyhJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/Ci0JCQkJYmFnKGl0ZXJhdG9yLCBuZXcgSGFzaEJhZzxFPihzaXplKSkKLQkJCToKLQkJCQlCYWcuRW1wdHkuPEU+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gQmFnPEU+IGJhZyhJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEhhc2hCYWc8RT4gYmFnKSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWJhZy5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gYmFnOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogSGFzaEJhZyhPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBCYWc8RT4gYmFnKEUuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gQmFnLkVtcHR5LjxFPmluc3RhbmNlKCk7Ci0JCX0KLQkJQmFnPEU+IGJhZyA9IG5ldyBIYXNoQmFnPEU+KGxlbik7Ci0JCWZvciAoRSBpdGVtIDogYXJyYXkpIHsKLQkJCWJhZy5hZGQoaXRlbSk7Ci0JCX0KLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24oRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uKSB7Ci0JCXJldHVybiBiYWcoZW51bWVyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IENvbGxlY3Rpb248RT4gY29sbGVjdGlvbihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24sIGludCBzaXplKSB7Ci0JCXJldHVybiBiYWcoZW51bWVyYXRpb24sIHNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IENvbGxlY3Rpb248RT4gY29sbGVjdGlvbihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGNvbGxlY3Rpb24oaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGNvbGxlY3Rpb24oaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gYmFnKGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gYmFnKGl0ZXJhdG9yLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24oRS4uLiBhcnJheSkgewotCQlyZXR1cm4gYmFnKGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uIGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIGphdmEudXRpbC5FbnVtZXJhdGlvbiNjb250YWlucyhPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoRW51bWVyYXRpb248Pz4gZW51bWVyYXRpb24sIE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJaWYgKGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKiBqYXZhLmxhbmcuSXRlcmFibGUjY29udGFpbnMoT2JqZWN0IG8pCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIGphdmEudXRpbC5JdGVyYXRvciNjb250YWlucyhPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWlmIChpdGVyYXRvci5uZXh0KCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2NvbnRhaW5zKE9iamVjdFtdIGFycmF5LCBPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0W10gYXJyYXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGFycmF5W2ldID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhhcnJheVtpXSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIGphdmEudXRpbC5BcnJheXMjY29udGFpbnMoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2NvbnRhaW5zKGludFtdIGFycmF5LCBpbnQgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI2NvbnRhaW5zQWxsKGphdmEubGFuZy5JdGVyYWJsZSBpdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI2NvbnRhaW5zQWxsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoICEgY29sbGVjdGlvbi5jb250YWlucyhpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiNjb250YWluc0FsbChPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3RbXSBhcnJheSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb2xsZWN0aW9uLmNvbnRhaW5zKGFycmF5W2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogamF2YS5sYW5nLkl0ZXJhYmxlI2NvbnRhaW5zQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBqYXZhLmxhbmcuSXRlcmFibGUjY29udGFpbnNBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBzaXplLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNpemUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZSAyLgotCSAqIGphdmEubGFuZy5JdGVyYWJsZSNjb250YWluc0FsbChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgSXRlcmFibGU8Pz4gaXRlcmFibGUyKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChpdGVyYWJsZTEuaXRlcmF0b3IoKSwgaXRlcmFibGUyLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZSAyLgotCSAqIGphdmEubGFuZy5JdGVyYWJsZSNjb250YWluc0FsbChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgaW50IHNpemUsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUxLml0ZXJhdG9yKCksIHNpemUsIGl0ZXJhYmxlMi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIGphdmEubGFuZy5JdGVyYWJsZSNjb250YWluc0FsbChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS5sYW5nLkl0ZXJhYmxlI2NvbnRhaW5zQWxsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBzaXplLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogamF2YS5sYW5nLkl0ZXJhYmxlI2NvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYWJsZTw/PiBpdGVyYWJsZSwgT2JqZWN0W10gYXJyYXkpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIGphdmEubGFuZy5JdGVyYWJsZSNjb250YWluc0FsbChPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBzaXplLCBPYmplY3RbXSBhcnJheSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjY29udGFpbnNBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29sbGVjdGlvbihpdGVyYXRvcikuY29udGFpbnNBbGwoY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIGphdmEudXRpbC5JdGVyYXRvciNjb250YWluc0FsbChqYXZhLnV0aWwuQ29sbGVjdGlvbiBjb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IHNpemUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29sbGVjdGlvbihpdGVyYXRvciwgc2l6ZSkuY29udGFpbnNBbGwoY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjY29udGFpbnNBbGwoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGNvbGxlY3Rpb24oaXRlcmF0b3IpLCBpdGVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjY29udGFpbnNBbGwoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IHNpemUsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChjb2xsZWN0aW9uKGl0ZXJhdG9yLCBzaXplKSwgaXRlcmFibGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvciAyLgotCSAqIGphdmEudXRpbC5JdGVyYXRvciNjb250YWluc0FsbChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChjb2xsZWN0aW9uKGl0ZXJhdG9yMSksIGl0ZXJhdG9yMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDIuCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI2NvbnRhaW5zQWxsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IxLCBpbnQgc2l6ZSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChjb2xsZWN0aW9uKGl0ZXJhdG9yMSwgc2l6ZSksIGl0ZXJhdG9yMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBPYmplY3RbXSBhcnJheSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoY29sbGVjdGlvbihpdGVyYXRvciksIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIGphdmEudXRpbC5JdGVyYXRvciNjb250YWluc0FsbChPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBzaXplLCBPYmplY3RbXSBhcnJheSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoY29sbGVjdGlvbihpdGVyYXRvciwgc2l6ZSksIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogamF2YS51dGlsLkFycmF5cyNjb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgamF2YS51dGlsLkNvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoYXJyYXksIGNvbGxlY3Rpb24uaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2NvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5LCBqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoYXJyYXksIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLkFycmF5cyNjb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaWYgKCAhIGNvbnRhaW5zKGFycmF5LCBpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIGphdmEudXRpbC5BcnJheXMjY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheTIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb250YWlucyhhcnJheTEsIGFycmF5MltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogamF2YS51dGlsLkFycmF5cyNjb250YWluc0FsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheTIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb250YWlucyhhcnJheTEsIGFycmF5MltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogamF2YS51dGlsLkFycmF5cyNjb250YWluc0FsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Mi5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGNvbnRhaW5zKGFycmF5MSwgYXJyYXkyW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudCwgYmVnaW5uaW5nIGF0IHRoZSBlbmQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gLTEuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgZGlmZmVyZW50IHNpemVzLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQotCSAqIGxhc3QgZWxlbWVudCBpbiB0aGUgbG9uZ2VyIGFycmF5LgotCSAqIFVzZSB0aGUgZWxlbWVudHMnICNlcXVhbHMoKSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBkaWZmRW5kKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCXJldHVybiBkaWZmRW5kKEFycmF5cy5hc0xpc3QoYXJyYXkxKSwgQXJyYXlzLmFzTGlzdChhcnJheTIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogbGlzdHMgdGhhdCBhcmUgZGlmZmVyZW50LCBiZWdpbm5pbmcgYXQgdGhlIGVuZC4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIC0xLgotCSAqIElmIHRoZSBsaXN0cyBhcmUgZGlmZmVyZW50IHNpemVzLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQotCSAqIGxhc3QgZWxlbWVudCBpbiB0aGUgbG9uZ2VyIGxpc3QuCi0JICogVXNlIHRoZSBlbGVtZW50cycgI2VxdWFscygpIG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZFbmQoTGlzdDw/PiBsaXN0MSwgTGlzdDw/PiBsaXN0MikgewotCQlpbnQgc2l6ZTEgPSBsaXN0MS5zaXplKCk7Ci0JCWludCBzaXplMiA9IGxpc3QyLnNpemUoKTsKLQkJaWYgKHNpemUxICE9IHNpemUyKSB7Ci0JCQlyZXR1cm4gTWF0aC5tYXgoc2l6ZTEsIHNpemUyKSAtIDE7Ci0JCX0KLQkJaW50IGVuZCA9IHNpemUxIC0gMTsKLQkJd2hpbGUgKGVuZCA+IC0xKSB7Ci0JCQlPYmplY3QgbyA9IGxpc3QxLmdldChlbmQpOwotCQkJaWYgKG8gPT0gbnVsbCkgewotCQkJCWlmIChsaXN0Mi5nZXQoZW5kKSA9PSBudWxsKSB7Ci0JCQkJCWVuZC0tOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbmQ7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoby5lcXVhbHMobGlzdDIuZ2V0KGVuZCkpKSB7Ci0JCQkJCWVuZC0tOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbmQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByYW5nZSBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiBbc2l6ZSwgLTFdLgotCSAqIFVzZSB0aGUgZWxlbWVudHMnICNlcXVhbHMoKSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKiBAc2VlICNkaWZmU3RhcnQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqIEBzZWUgI2RpZmZFbmQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2UgZGlmZlJhbmdlKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCXJldHVybiBkaWZmUmFuZ2UoQXJyYXlzLmFzTGlzdChhcnJheTEpLCBBcnJheXMuYXNMaXN0KGFycmF5MikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gW3NpemUsIC0xXS4KLQkgKiBVc2UgdGhlIGVsZW1lbnRzJyAjZXF1YWxzKCkgbWV0aG9kIHRvIGNvbXBhcmUgdGhlCi0JICogZWxlbWVudHMuCi0JICogQHNlZSAjZGlmZlN0YXJ0KGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuTGlzdCkKLQkgKiBAc2VlICNkaWZmRW5kKGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlIGRpZmZSYW5nZShMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCWludCBlbmQgPSBkaWZmRW5kKGxpc3QxLCBsaXN0Mik7Ci0JCWlmIChlbmQgPT0gLTEpIHsKLQkJCS8vIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCB0aGUgc3RhcnQgaXMgdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cwotCQkJcmV0dXJuIG5ldyBSYW5nZShsaXN0MS5zaXplKCksIGVuZCk7Ci0JCX0KLQkJLy8gdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQsIGNhbGN1bGF0ZSB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlCi0JCXJldHVybiBuZXcgUmFuZ2UoZGlmZlN0YXJ0KGxpc3QxLCBsaXN0MiksIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBhcnJheXMgKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXgpLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGRpZmZlcmVudCBzaXplcyBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzaG9ydGVyIGFycmF5IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGFycmF5LCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNob3J0ZXIgYXJyYXkKLQkgKiAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc2hvcnRlciBhcnJheSkuCi0JICogVXNlIHRoZSBlbGVtZW50cycgI2VxdWFscygpIG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZTdGFydChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlyZXR1cm4gZGlmZlN0YXJ0KEFycmF5cy5hc0xpc3QoYXJyYXkxKSwgQXJyYXlzLmFzTGlzdChhcnJheTIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogbGlzdHMgdGhhdCBhcmUgZGlmZmVyZW50LiBJZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cyAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCkuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2hvcnRlciBsaXN0IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGxpc3QsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc2hvcnRlciBsaXN0Ci0JICogKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNob3J0ZXIgbGlzdCkuCi0JICogVXNlIHRoZSBlbGVtZW50cycgI2VxdWFscygpIG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZTdGFydChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCWludCBlbmQgPSBNYXRoLm1pbihsaXN0MS5zaXplKCksIGxpc3QyLnNpemUoKSk7Ci0JCWludCBzdGFydCA9IDA7Ci0JCXdoaWxlIChzdGFydCA8IGVuZCkgewotCQkJT2JqZWN0IG8gPSBsaXN0MS5nZXQoc3RhcnQpOwotCQkJaWYgKG8gPT0gbnVsbCkgewotCQkJCWlmIChsaXN0Mi5nZXQoc3RhcnQpID09IG51bGwpIHsKLQkJCQkJc3RhcnQrKzsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoby5lcXVhbHMobGlzdDIuZ2V0KHN0YXJ0KSkpIHsKLQkJCQkJc3RhcnQrKzsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9ycyByZXR1cm4gZXF1YWwgZWxlbWVudHMuCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI2VxdWFscyhqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMikgewotCQl3aGlsZSAoaXRlcmF0b3IxLmhhc05leHQoKSAmJiBpdGVyYXRvcjIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbzEgPSBpdGVyYXRvcjEubmV4dCgpOwotCQkJT2JqZWN0IG8yID0gaXRlcmF0b3IyLm5leHQoKTsKLQkJCWlmICggISAobzEgPT0gbnVsbCA/IG8yID09IG51bGwgOiBvMS5lcXVhbHMobzIpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gISAoaXRlcmF0b3IxLmhhc05leHQoKSB8fCBpdGVyYXRvcjIuaGFzTmV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGluZGV4Ci0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yI2dldChpbnQgaW5kZXgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRSBnZXQoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGluZGV4KSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUUgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpdGVyYXRvci5wcmV2aW91c0luZGV4KCkgPT0gaW5kZXgpIHsKLQkJCQlyZXR1cm4gbmV4dDsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihpbmRleCkgKyAnOicgKyBTdHJpbmcudmFsdWVPZihpdGVyYXRvci5wcmV2aW91c0luZGV4KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5cyBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzLgotCSAqIGphdmEudXRpbC5BcnJheXMjaWRlbnRpY2FsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpZGVudGljYWwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaWYgKGFycmF5MSA9PSBhcnJheTIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhcnJheTEgPT0gbnVsbCB8fCBhcnJheTIgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBsZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlpZiAoYXJyYXkyLmxlbmd0aCAhPSBsZW5ndGgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheTFbaV0gIT0gYXJyYXkyW2ldKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3JzIHJldHVybiB0aGUgc2FtZSBlbGVtZW50cy4KLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjaWRlbnRpY2FsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaWRlbnRpY2FsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXdoaWxlIChpdGVyYXRvcjEuaGFzTmV4dCgpICYmIGl0ZXJhdG9yMi5oYXNOZXh0KCkpIHsKLQkJCWlmIChpdGVyYXRvcjEubmV4dCgpICE9IGl0ZXJhdG9yMi5uZXh0KCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICEgKGl0ZXJhdG9yMS5oYXNOZXh0KCkgfHwgaXRlcmF0b3IyLmhhc05leHQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQsIGJlZ2lubmluZyBhdCB0aGUgZW5kLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIC0xLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGRpZmZlcmVudCBzaXplcywgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUKLQkgKiBsYXN0IGVsZW1lbnQgaW4gdGhlIGxvbmdlciBhcnJheS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5RGlmZkVuZChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlyZXR1cm4gaWRlbnRpdHlEaWZmRW5kKEFycmF5cy5hc0xpc3QoYXJyYXkxKSwgQXJyYXlzLmFzTGlzdChhcnJheTIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogbGlzdHMgdGhhdCBhcmUgZGlmZmVyZW50LCBiZWdpbm5pbmcgYXQgdGhlIGVuZC4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIC0xLgotCSAqIElmIHRoZSBsaXN0cyBhcmUgZGlmZmVyZW50IHNpemVzLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQotCSAqIGxhc3QgZWxlbWVudCBpbiB0aGUgbG9uZ2VyIGxpc3QuCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eURpZmZFbmQoTGlzdDw/PiBsaXN0MSwgTGlzdDw/PiBsaXN0MikgewotCQlpbnQgc2l6ZTEgPSBsaXN0MS5zaXplKCk7Ci0JCWludCBzaXplMiA9IGxpc3QyLnNpemUoKTsKLQkJaWYgKHNpemUxICE9IHNpemUyKSB7Ci0JCQlyZXR1cm4gTWF0aC5tYXgoc2l6ZTEsIHNpemUyKSAtIDE7Ci0JCX0KLQkJaW50IGVuZCA9IHNpemUxIC0gMTsKLQkJd2hpbGUgKGVuZCA+IC0xKSB7Ci0JCQlpZiAobGlzdDEuZ2V0KGVuZCkgPT0gbGlzdDIuZ2V0KGVuZCkpIHsKLQkJCQllbmQtLTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGVuZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gW3NpemUsIC0xXS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqIEBzZWUgI2lkZW50aXR5RGlmZlN0YXJ0KE9iamVjdFtdLCBPYmplY3RbXSkKLQkgKiBAc2VlICNpZGVudGl0eURpZmZFbmQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2UgaWRlbnRpdHlEaWZmUmFuZ2UoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJcmV0dXJuIGlkZW50aXR5RGlmZlJhbmdlKEFycmF5cy5hc0xpc3QoYXJyYXkxKSwgQXJyYXlzLmFzTGlzdChhcnJheTIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJhbmdlIG9mIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIFtzaXplLCAtMV0uCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKiBAc2VlICNpZGVudGl0eURpZmZTdGFydChqYXZhLnV0aWwuTGlzdCwgamF2YS51dGlsLkxpc3QpCi0JICogQHNlZSAjaWRlbnRpdHlEaWZmRW5kKGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlIGlkZW50aXR5RGlmZlJhbmdlKExpc3Q8Pz4gbGlzdDEsIExpc3Q8Pz4gbGlzdDIpIHsKLQkJaW50IGVuZCA9IGlkZW50aXR5RGlmZkVuZChsaXN0MSwgbGlzdDIpOwotCQlpZiAoZW5kID09IC0xKSB7Ci0JCQkvLyB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgdGhlIHN0YXJ0IGlzIHRoZSBzaXplIG9mIHRoZSB0d28gbGlzdHMKLQkJCXJldHVybiBuZXcgUmFuZ2UobGlzdDEuc2l6ZSgpLCBlbmQpOwotCQl9Ci0JCS8vIHRoZSBsaXN0cyBhcmUgZGlmZmVyZW50LCBjYWxjdWxhdGUgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZQotCQlyZXR1cm4gbmV3IFJhbmdlKGlkZW50aXR5RGlmZlN0YXJ0KGxpc3QxLCBsaXN0MiksIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBhcnJheXMgKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXgpLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGRpZmZlcmVudCBzaXplcyBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzaG9ydGVyIGFycmF5IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGFycmF5LCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNob3J0ZXIgYXJyYXkKLQkgKiAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc2hvcnRlciBhcnJheSkuCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eURpZmZTdGFydChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlyZXR1cm4gaWRlbnRpdHlEaWZmU3RhcnQoQXJyYXlzLmFzTGlzdChhcnJheTEpLCBBcnJheXMuYXNMaXN0KGFycmF5MikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBsaXN0cyB0aGF0IGFyZSBkaWZmZXJlbnQuIElmIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4KLQkgKiB0aGUgc2l6ZSBvZiB0aGUgdHdvIGxpc3RzIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4KS4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCBzaXplcyBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzaG9ydGVyIGxpc3QgbWF0Y2ggdGhlaXIgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbgotCSAqIHRoZSBsb25nZXIgbGlzdCwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzaG9ydGVyIGxpc3QKLQkgKiAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc2hvcnRlciBsaXN0KS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5RGlmZlN0YXJ0KExpc3Q8Pz4gbGlzdDEsIExpc3Q8Pz4gbGlzdDIpIHsKLQkJaW50IGVuZCA9IE1hdGgubWluKGxpc3QxLnNpemUoKSwgbGlzdDIuc2l6ZSgpKTsKLQkJaW50IHN0YXJ0ID0gMDsKLQkJd2hpbGUgKHN0YXJ0IDwgZW5kKSB7Ci0JCQlpZiAobGlzdDEuZ2V0KHN0YXJ0KSA9PSBsaXN0Mi5nZXQoc3RhcnQpKSB7Ci0JCQkJc3RhcnQrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHN0YXJ0OwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IsCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI2luZGV4T2YoT2JqZWN0IG8pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaXRlcmF0b3IuaGFzTmV4dCgpOyBpKyspIHsKLQkJCQlpZiAoaXRlcmF0b3IubmV4dCgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGl0ZXJhdG9yLmhhc05leHQoKTsgaSsrKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjaW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IG8pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJaWYgKGFycmF5W2ldID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjaW5kZXhPZihjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBvciByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2luZGV4T2YoaW50W10gYXJyYXksIGludCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmFibGUgb2JqZWN0Ci0JICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBzb3J0ZWQgbGlzdCBhbmQgc3RpbGwga2VlcAotCSAqIHRoZSBsaXN0IHNvcnRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBpbnQgaW5zZXJ0aW9uSW5kZXhPZihMaXN0PEU+IHNvcnRlZExpc3QsIENvbXBhcmFibGU8RT4gdmFsdWUpIHsKLQkJaW50IGxlbiA9IHNvcnRlZExpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAodmFsdWUuY29tcGFyZVRvKHNvcnRlZExpc3QuZ2V0KGkpKSA8IDApIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIG9iamVjdAotCSAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgc29ydGVkIGxpc3QgYW5kIHN0aWxsIGtlZXAKLQkgKiB0aGUgbGlzdCBzb3J0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gaW50IGluc2VydGlvbkluZGV4T2YoTGlzdDxFPiBzb3J0ZWRMaXN0LCBFIHZhbHVlLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlpbnQgbGVuID0gc29ydGVkTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChjb21wYXJhdG9yLmNvbXBhcmUodmFsdWUsIHNvcnRlZExpc3QuZ2V0KGkpKSA8IDApIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmFibGUgb2JqZWN0Ci0JICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBzb3J0ZWQgYXJyYXkgYW5kIHN0aWxsIGtlZXAKLQkgKiB0aGUgYXJyYXkgc29ydGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IGludCBpbnNlcnRpb25JbmRleE9mKEVbXSBzb3J0ZWRBcnJheSwgQ29tcGFyYWJsZTxFPiB2YWx1ZSkgewotCQlpbnQgbGVuID0gc29ydGVkQXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAodmFsdWUuY29tcGFyZVRvKHNvcnRlZEFycmF5W2ldKSA8IDApIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmFibGUgb2JqZWN0Ci0JICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBzb3J0ZWQgYXJyYXkgYW5kIHN0aWxsIGtlZXAKLQkgKiB0aGUgYXJyYXkgc29ydGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGludCBpbnNlcnRpb25JbmRleE9mKEVbXSBzb3J0ZWRBcnJheSwgRSB2YWx1ZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJaW50IGxlbiA9IHNvcnRlZEFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGNvbXBhcmF0b3IuY29tcGFyZSh2YWx1ZSwgc29ydGVkQXJyYXlbaV0pIDwgMCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgb25lLXVzZSBJdGVyYWJsZSBmb3IgdGhlIEl0ZXJhdG9yIGdpdmVuLgotCSAqIFRocm93cyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaXRlcmFibGUoKSBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogQXMgc3VjaCwgdGhpcyB1dGlsaXR5IHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gb25lLXVzZSBzaXR1YXRpb25zLCBzdWNoIGFzCi0JICogYSAiZm9yIiBsb29wLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFNpbmdsZVVzZUl0ZXJhYmxlPEU+KGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmFibGUgb24gdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkFycmF5cyNpdGVyYWJsZShPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYWJsZTxFPiBpdGVyYWJsZShFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkFycmF5cyNpdGVyYXRvcihPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYXRvcjxFPiBpdGVyYXRvcihFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxFPihhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IsCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI2xhc3RJbmRleE9mKE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIChpdGVyYXRvci5oYXNOZXh0KCkpID8gbGlzdChpdGVyYXRvcikubGFzdEluZGV4T2YodmFsdWUpIDogLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IsCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI2xhc3RJbmRleE9mKE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgc2l6ZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGxpc3QoaXRlcmF0b3IsIHNpemUpLmxhc3RJbmRleE9mKHZhbHVlKSA6IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjbGFzdEluZGV4T2YoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJCWlmIChhcnJheVtpXSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogamF2YS51dGlsLkFycmF5cyNsYXN0SW5kZXhPZihjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjbGFzdEluZGV4T2YoaW50W10gYXJyYXksIGludCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIGphdmEubGFuZy5JdGVyYWJsZSN0b0xpc3QoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gbGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGxpc3QoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogamF2YS5sYW5nLkl0ZXJhYmxlI3RvTGlzdCgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBsaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGxpc3QoaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI3RvTGlzdCgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBsaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSkgPyBsaXN0KGl0ZXJhdG9yLCBuZXcgQXJyYXlMaXN0PEU+KCkpIDogQ29sbGVjdGlvbnMuPEU+ZW1wdHlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI3RvTGlzdCgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBsaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJcmV0dXJuIChpdGVyYXRvci5oYXNOZXh0KCkpID8gbGlzdChpdGVyYXRvciwgbmV3IEFycmF5TGlzdDxFPihzaXplKSkgOiBDb2xsZWN0aW9ucy48RT5lbXB0eUxpc3QoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gTGlzdDxFPiBsaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgQXJyYXlMaXN0PEU+IGxpc3QpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbGlzdC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBVbmxpa2UgamF2YS51dGlsLkFycmF5cy5hc0xpc3QoT2JqZWN0W10pLCB0aGUgbGlzdAotCSAqIGlzIG1vZGlmaWFibGUgYW5kIGlzIG5vdCBiYWNrZWQgYnkgdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gbGlzdChFLi4uIGFycmF5KSB7Ci0JCUxpc3Q8RT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RT4oYXJyYXkubGVuZ3RoKTsKLQkJZm9yIChFIGl0ZW0gOiBhcnJheSkgewotCQkJbGlzdC5hZGQoaXRlbSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2xpc3RJdGVyYXRvcihPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGxpc3RJdGVyYXRvcihhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIGFycmF5LgotCSAqIGphdmEudXRpbC5BcnJheXMjbGlzdEl0ZXJhdG9yKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcihFW10gYXJyYXksIGludCBpbmRleCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChhcnJheSkubGlzdEl0ZXJhdG9yKGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbWF4aW11bSB2YWx1ZS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI21heChjaGFyW10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIG1heChjaGFyLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCQljaGFyIG1heCA9IGFycmF5WzBdOwotCQkvLyBzdGFydCBhdCAxCi0JCWZvciAoaW50IGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgbmV4dCA9IGFycmF5W2ldOwotCQkJaWYgKG5leHQgPiBtYXgpIHsKLQkJCQltYXggPSBuZXh0OwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbnRlZ2VyIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBtYXhpbXVtIHZhbHVlLgotCSAqIGphdmEudXRpbC5BcnJheXMjbWF4KGludFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IG1heChpbnQuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JCWludCBtYXggPSBhcnJheVswXTsKLQkJLy8gc3RhcnQgYXQgMQotCQlmb3IgKGludCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpbnQgbmV4dCA9IGFycmF5W2ldOwotCQkJaWYgKG5leHQgPiBtYXgpIHsKLQkJCQltYXggPSBuZXh0OwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG1pbmltdW0gdmFsdWUuCi0JICogamF2YS51dGlsLkFycmF5cyNtaW4oY2hhcltdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciBtaW4oY2hhci4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQkJY2hhciBtaW4gPSBhcnJheVswXTsKLQkJLy8gc3RhcnQgYXQgMQotCQlmb3IgKGludCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIG5leHQgPSBhcnJheVtpXTsKLQkJCWlmIChuZXh0IDwgbWluKSB7Ci0JCQkJbWluID0gbmV4dDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWluOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW50ZWdlciBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbWluaW11bSB2YWx1ZS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI21pbihpbnRbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBtaW4oaW50Li4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCQlpbnQgbWluID0gYXJyYXlbMF07Ci0JCS8vIHN0YXJ0IGF0IDEKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBsZW47IGkrKykgewotCQkJaW50IG5leHQgPSBhcnJheVtpXTsKLQkJCWlmIChuZXh0IDwgbWluKSB7Ci0JCQkJbWluID0gbmV4dDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWluOwotCX0KLQotCS8qKgotCSAqIE1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI21vdmUoT2JqZWN0W10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBtb3ZlKEVbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJcmV0dXJuICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgPyBhcnJheSA6IG1vdmVfKGFycmF5LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0YXJnZXRJbmRleCAhPSBzb3VyY2VJbmRleAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gbW92ZV8oRVtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlFIHRlbXAgPSBhcnJheVtzb3VyY2VJbmRleF07Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgMSwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIDEsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJYXJyYXlbdGFyZ2V0SW5kZXhdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkFycmF5cyNtb3ZlKE9iamVjdFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gbW92ZShFW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICgodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHx8IChsZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpZiAobGVuZ3RoID09IDEpIHsKLQkJCXJldHVybiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQlFW10gdGVtcCA9IG5ld0FycmF5KGFycmF5LCBsZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCwgdGVtcCwgMCwgbGVuZ3RoKTsKLQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHRhcmdldEluZGV4LCBhcnJheSwgdGFyZ2V0SW5kZXggKyBsZW5ndGgsIHNvdXJjZUluZGV4IC0gdGFyZ2V0SW5kZXgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXggKyBsZW5ndGgsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBhcnJheSwgdGFyZ2V0SW5kZXgsIGxlbmd0aCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkFycmF5cyNtb3ZlKGludFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIG1vdmUoaW50W10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXJldHVybiAodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpID8gYXJyYXkgOiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGFyZ2V0SW5kZXggIT0gc291cmNlSW5kZXgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBtb3ZlXyhpbnRbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJaW50IHRlbXAgPSBhcnJheVtzb3VyY2VJbmRleF07Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgMSwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIDEsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJYXJyYXlbdGFyZ2V0SW5kZXhdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkFycmF5cyNtb3ZlKGludFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIG1vdmUoaW50W10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICgodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHx8IChsZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpZiAobGVuZ3RoID09IDEpIHsKLQkJCXJldHVybiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQlpbnRbXSB0ZW1wID0gbmV3IGludFtsZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCwgdGVtcCwgMCwgbGVuZ3RoKTsKLQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHRhcmdldEluZGV4LCBhcnJheSwgdGFyZ2V0SW5kZXggKyBsZW5ndGgsIHNvdXJjZUluZGV4IC0gdGFyZ2V0SW5kZXgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXggKyBsZW5ndGgsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBhcnJheSwgdGFyZ2V0SW5kZXgsIGxlbmd0aCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkFycmF5cyNtb3ZlKGNoYXJbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gbW92ZShjaGFyW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXJldHVybiAodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpID8gYXJyYXkgOiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGFyZ2V0SW5kZXggIT0gc291cmNlSW5kZXgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gbW92ZV8oY2hhcltdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQljaGFyIHRlbXAgPSBhcnJheVtzb3VyY2VJbmRleF07Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgMSwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIDEsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJYXJyYXlbdGFyZ2V0SW5kZXhdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkFycmF5cyNtb3ZlKGNoYXJbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gbW92ZShjaGFyW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICgodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHx8IChsZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpZiAobGVuZ3RoID09IDEpIHsKLQkJCXJldHVybiBtb3ZlXyhhcnJheSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQljaGFyW10gdGVtcCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4LCB0ZW1wLCAwLCBsZW5ndGgpOwotCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgdGFyZ2V0SW5kZXgsIGFycmF5LCB0YXJnZXRJbmRleCArIGxlbmd0aCwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIGxlbmd0aCwgYXJyYXksIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCAtIHNvdXJjZUluZGV4KTsKLQkJfQotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIGFycmF5LCB0YXJnZXRJbmRleCwgbGVuZ3RoKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBsaXN0LgotCSAqIGphdmEudXRpbC5MaXN0I21vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBtb3ZlKExpc3Q8RT4gbGlzdCwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJcmV0dXJuICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgPyBsaXN0IDogbW92ZV8obGlzdCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGFyZ2V0SW5kZXggIT0gc291cmNlSW5kZXgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gTGlzdDxFPiBtb3ZlXyhMaXN0PEU+IGxpc3QsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWlmIChsaXN0IGluc3RhbmNlb2YgUmFuZG9tQWNjZXNzKSB7Ci0JCQkvLyBtb3ZlIGVsZW1lbnRzLCBsZWF2aW5nIHRoZSBsaXN0IGluIHBsYWNlCi0JCQlFIHRlbXAgPSBsaXN0LmdldChzb3VyY2VJbmRleCk7Ci0JCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaS0tID4gdGFyZ2V0SW5kZXg7ICkgewotCQkJCQlsaXN0LnNldChpICsgMSwgbGlzdC5nZXQoaSkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IHNvdXJjZUluZGV4OyBpIDwgdGFyZ2V0SW5kZXg7IGkrKykgewotCQkJCQlsaXN0LnNldChpLCBsaXN0LmdldChpICsgMSkpOwotCQkJCX0KLQkJCX0KLQkJCWxpc3Quc2V0KHRhcmdldEluZGV4LCB0ZW1wKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHJlbW92ZSB0aGUgZWxlbWVudCBhbmQgcmUtYWRkIGl0IGF0IHRoZSB0YXJnZXQgaW5kZXgKLQkJCWxpc3QuYWRkKHRhcmdldEluZGV4LCBsaXN0LnJlbW92ZShzb3VyY2VJbmRleCkpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgbGlzdC4KLQkgKiBqYXZhLnV0aWwuTGlzdCNtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gbW92ZShMaXN0PEU+IGxpc3QsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICgodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHx8IChsZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBsaXN0OwotCQl9Ci0JCWlmIChsZW5ndGggPT0gMSkgewotCQkJcmV0dXJuIG1vdmVfKGxpc3QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJaWYgKGxpc3QgaW5zdGFuY2VvZiBSYW5kb21BY2Nlc3MpIHsKLQkJCS8vIG1vdmUgZWxlbWVudHMsIGxlYXZpbmcgdGhlIGxpc3QgaW4gcGxhY2UKLQkJCUFycmF5TGlzdDxFPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxFPihsaXN0LnN1Ykxpc3Qoc291cmNlSW5kZXgsIHNvdXJjZUluZGV4ICsgbGVuZ3RoKSk7Ci0JCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaS0tID4gdGFyZ2V0SW5kZXg7ICkgewotCQkJCQlsaXN0LnNldChpICsgbGVuZ3RoLCBsaXN0LmdldChpKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gc291cmNlSW5kZXg7IGkgPCB0YXJnZXRJbmRleDsgaSsrKSB7Ci0JCQkJCWxpc3Quc2V0KGksIGxpc3QuZ2V0KGkgKyBsZW5ndGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJbGlzdC5zZXQodGFyZ2V0SW5kZXggKyBpLCB0ZW1wLmdldChpKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyByZW1vdmUgdGhlIGVsZW1lbnRzIGFuZCByZS1hZGQgdGhlbSBhdCB0aGUgdGFyZ2V0IGluZGV4Ci0JCQlsaXN0LmFkZEFsbCh0YXJnZXRJbmRleCwgcmVtb3ZlRWxlbWVudHNBdEluZGV4KGxpc3QsIHNvdXJjZUluZGV4LCBsZW5ndGgpKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIG9sZCB2YWx1ZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUuCi0JICogamF2YS51dGlsLkFycmF5cyNyZXBsYWNlQWxsKE9iamVjdFtdIGFycmF5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVwbGFjZUFsbChFW10gYXJyYXksIE9iamVjdCBvbGRWYWx1ZSwgRSBuZXdWYWx1ZSkgewotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGFycmF5W2ldID09IG51bGwpIHsKLQkJCQkJYXJyYXlbaV0gPSBuZXdWYWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAob2xkVmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlhcnJheVtpXSA9IG5ld1ZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBvbGQgdmFsdWUgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlLgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVwbGFjZUFsbChpbnRbXSBhcnJheSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZXBsYWNlQWxsKGludFtdIGFycmF5LCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSBvbGRWYWx1ZSkgewotCQkJCWFycmF5W2ldID0gbmV3VmFsdWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgb2xkIHZhbHVlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlcGxhY2VBbGwoY2hhcltdIGFycmF5LCBjaGFyIG9sZFZhbHVlLCBjaGFyIG5ld1ZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlcGxhY2VBbGwoY2hhcltdIGFycmF5LCBjaGFyIG9sZFZhbHVlLCBjaGFyIG5ld1ZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IG9sZFZhbHVlKSB7Ci0JCQkJYXJyYXlbaV0gPSBuZXdWYWx1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZShFW10gYXJyYXksIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIGluZGV4T2YoYXJyYXksIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmUoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgaW5kZXhPZihhcnJheSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmUoaW50W10gYXJyYXksIGludCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZShpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgaW5kZXhPZihhcnJheSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZW1vdmVBbGwoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI3JlbW92ZUFsbChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNpemUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI3JlbW92ZUFsbChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGNvbGxlY3Rpb24ucmVtb3ZlQWxsKHNldChpdGVyYXRvcikpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jcmVtb3ZlQWxsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IGNvbGxlY3Rpb24ucmVtb3ZlQWxsKHNldChpdGVyYXRvciwgc2l6ZSkpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jcmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3RbXSBhcnJheSkgewotCQlyZXR1cm4gY29sbGVjdGlvbi5yZW1vdmVBbGwoc2V0KGFycmF5KSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmVBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5LCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/IHJlbW92ZUFsbF8oYXJyYXksIHNldChpdGVyYXRvcikpIDogYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYXRvciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmVBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJcmV0dXJuIChpdGVyYXRvci5oYXNOZXh0KCkpID8gcmVtb3ZlQWxsXyhhcnJheSwgc2V0KGl0ZXJhdG9yLCBzaXplKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSA/IGFycmF5IDogcmVtb3ZlQWxsXyhhcnJheSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBjb2xsZWN0aW9uIGlzIG5vbi1lbXB0eQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBhcnJheSA6IHJlbW92ZUFsbChhcnJheSwgY29sbGVjdGlvbiwgYXJyYXlMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgY29sbGVjdGlvbiBpcyBub24tZW1wdHkgYW5kIGFycmF5TGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXlMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotCQkJaWYgKCAhIGNvbGxlY3Rpb24uY29udGFpbnMoYXJyYXlbaV0pKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgaik7Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQkvLyBjb252ZXJ0IHRvIGEgYmFnIHRvIHRha2UgYWR2YW50YWdlIG9mIGhhc2hlZCBsb29rLXVwCi0JCXJldHVybiAoYXJyYXkyLmxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IHJlbW92ZUFsbF8oYXJyYXkxLCBzZXQoYXJyYXkyKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpIHsKLQkJaWYgKGFycmF5Mi5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5MTsKLQkJfQotCQlpbnQgYXJyYXkxTGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJaWYgKGFycmF5MUxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5MUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheTFMZW5ndGg7IGkrKykgewotCQkJaWYgKCAhIGNvbnRhaW5zKGFycmF5MiwgYXJyYXkxW2ldKSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXkxTGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5MVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZUFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MikgewotCQlpZiAoYXJyYXkyLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOwotCQl9Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlpZiAoYXJyYXkxTGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTE7Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5MUxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoICEgY29udGFpbnMoYXJyYXkyLCBhcnJheTFbaV0pKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheTFMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTE7ICAvLyBub3RoaW5nIHdhcyByZW1vdmVkCi0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5MVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZW1vdmVBbGxPY2N1cnJlbmNlcyhPYmplY3QgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbE9jY3VycmVuY2VzKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgT2JqZWN0IHZhbHVlKSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8Pz4gc3RyZWFtID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoc3RyZWFtLm5leHQoKSA9PSBudWxsKSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIG9jY3VycmVuY2VzIG9mCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbE9jY3VycmVuY2VzKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbE9jY3VycmVuY2VzKEVbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGFycmF5TGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGFycmF5W2ldICE9IG51bGwpIHsKLQkJCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoICEgdmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgaik7Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIG9jY3VycmVuY2VzIG9mCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbE9jY3VycmVuY2VzKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoYXJyYXlMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldICE9IHZhbHVlKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5W2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgb2NjdXJyZW5jZXMgb2YKLQkgKiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlQWxsT2NjdXJyZW5jZXMoaW50W10gYXJyYXksIGludCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZUFsbE9jY3VycmVuY2VzKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoYXJyYXlMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldICE9IHZhbHVlKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbal07Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUVsZW1lbnRBdEluZGV4KE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUVsZW1lbnRBdEluZGV4KEVbXSBhcnJheSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50c0F0SW5kZXgoYXJyYXksIGluZGV4LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmVFbGVtZW50QXRJbmRleChjaGFyW10gYXJyYXksIGludCBpbmRleCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVFbGVtZW50QXRJbmRleChjaGFyW10gYXJyYXksIGludCBpbmRleCkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudHNBdEluZGV4KGFycmF5LCBpbmRleCwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlRWxlbWVudEF0SW5kZXgoaW50W10gYXJyYXksIGludCBpbmRleCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZUVsZW1lbnRBdEluZGV4KGludFtdIGFycmF5LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRzQXRJbmRleChhcnJheSwgaW5kZXgsIDEpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgZWxlbWVudHMuCi0JICogamF2YS51dGlsLkxpc3QjcmVtb3ZlKGludCBpbmRleCwgaW50IGxlbmd0aCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJlbW92ZUVsZW1lbnRzQXRJbmRleChMaXN0PEU+IGxpc3QsIGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQlMaXN0PEU+IHN1Ykxpc3QgPSBsaXN0LnN1Ykxpc3QoaW5kZXgsIGluZGV4ICsgbGVuZ3RoKTsKLQkJQXJyYXlMaXN0PEU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RT4oc3ViTGlzdCk7Ci0JCXN1Ykxpc3QuY2xlYXIoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50cyByZW1vdmVkLgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlRWxlbWVudHNBdEluZGV4KE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUVsZW1lbnRzQXRJbmRleChFW10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCWludCBuZXdMZW5ndGggPSBhcnJheUxlbmd0aCAtIGxlbmd0aDsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBuZXdMZW5ndGgpOwotCQlpZiAoKG5ld0xlbmd0aCA9PSAwKSAmJiAoaW5kZXggPT0gMCkpIHsKLQkJCXJldHVybiByZXN1bHQ7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCArIGxlbmd0aCwgcmVzdWx0LCBpbmRleCwgbmV3TGVuZ3RoIC0gaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIHJlbW92ZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmVFbGVtZW50QXRJbmRleChjaGFyW10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVFbGVtZW50c0F0SW5kZXgoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpbnQgbmV3TGVuZ3RoID0gYXJyYXlMZW5ndGggLSBsZW5ndGg7Ci0JCWlmICgobmV3TGVuZ3RoID09IDApICYmIChpbmRleCA9PSAwKSkgewotCQkJcmV0dXJuIEVNUFRZX0NIQVJfQVJSQVk7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltuZXdMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXggKyBsZW5ndGgsIHJlc3VsdCwgaW5kZXgsIG5ld0xlbmd0aCAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVNUFRZX0NIQVJfQVJSQVkgPSBuZXcgY2hhclswXTsKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIHJlbW92ZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmVFbGVtZW50QXRJbmRleChpbnRbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlRWxlbWVudHNBdEluZGV4KGludFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpbnQgbmV3TGVuZ3RoID0gYXJyYXlMZW5ndGggLSBsZW5ndGg7Ci0JCWlmICgobmV3TGVuZ3RoID09IDApICYmIChpbmRleCA9PSAwKSkgewotCQkJcmV0dXJuIEVNUFRZX0lOVF9BUlJBWTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtuZXdMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXggKyBsZW5ndGgsIHJlc3VsdCwgaW5kZXgsIG5ld0xlbmd0aCAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gRU1QVFlfSU5UX0FSUkFZID0gbmV3IGludFswXTsKLQotCS8qKgotCSAqIFJlbW92ZSBhbnkgZHVwbGljYXRlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiB3aGlsZSBtYWludGFpbmluZyB0aGUgb3JkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKEUuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCUxpc3Q8RT4gbGlzdCA9IHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKEFycmF5cy5hc0xpc3QoYXJyYXkpLCBsZW4pOwotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ld0FycmF5KGFycmF5LCBsaXN0LnNpemUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbnkgZHVwbGljYXRlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBsaXN0LAotCSAqIHdoaWxlIG1haW50YWluaW5nIHRoZSBvcmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKExpc3Q8RT4gbGlzdCkgewotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlpZiAoKHNpemUgPT0gMCkgfHwgKHNpemUgPT0gMSkpIHsKLQkJCXJldHVybiBsaXN0OwotCQl9Ci0JCXJldHVybiByZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0LCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgbGlzdCBpcyBub24tZW1wdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gTGlzdDxFPiByZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhMaXN0PEU+IGxpc3QsIGludCBzaXplKSB7Ci0JCUxpc3Q8RT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxFPihzaXplKTsKLQkJU2V0PEU+IHNldCA9IG5ldyBIYXNoU2V0PEU+KHNpemUpOwkJLy8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFzaGVkIGxvb2stdXAKLQkJZm9yIChFIGl0ZW0gOiBsaXN0KSB7Ci0JCQlpZiAoc2V0LmFkZChpdGVtKSkgewotCQkJCXJlc3VsdC5hZGQoaXRlbSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI3JldGFpbkFsbChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiByZXRhaW5BbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIG9ubHkgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZXRhaW5BbGwoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIHJldGFpbkFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI3JldGFpbkFsbChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBjb2xsZWN0aW9uLnJldGFpbkFsbChzZXQoaXRlcmF0b3IpKTsKLQkJfQotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jcmV0YWluQWxsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBjb2xsZWN0aW9uLnJldGFpbkFsbChzZXQoaXRlcmF0b3IsIHNpemUpKTsKLQkJfQotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jcmV0YWluQWxsKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3RbXSBhcnJheSkgewotCQlpZiAoYXJyYXkubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIGNvbGxlY3Rpb24ucmV0YWluQWxsKHNldChhcnJheSkpOwotCQl9Ci0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNvbGxlY3Rpb24uY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmV0YWluQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZSBpdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGFycmF5TGVuZ3RoLCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGFycmF5TGVuZ3RoLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYXRvciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBhcnJheSA6IHJldGFpbkFsbChhcnJheSwgYXJyYXlMZW5ndGgsIGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYXRvciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGFycmF5TGVuZ3RoLCBpdGVyYXRvciwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5TGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgaW50IGFycmF5TGVuZ3RoLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSkgPwotCQkJCXJldGFpbkFsbF8oYXJyYXksIHNldChpdGVyYXRvciksIGFycmF5TGVuZ3RoKQotCQkJOgotCQkJCW5ld0FycmF5KGFycmF5LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXlMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBpbnQgYXJyYXlMZW5ndGgsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiAoaXRlcmF0b3IuaGFzTmV4dCgpKSA/Ci0JCQkJcmV0YWluQWxsXyhhcnJheSwgc2V0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLCBhcnJheUxlbmd0aCkKLQkJCToKLQkJCQluZXdBcnJheShhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGFycmF5IDogcmV0YWluQWxsKGFycmF5LCBjb2xsZWN0aW9uLCBhcnJheUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5TGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJcmV0dXJuIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgPwotCQkJCW5ld0FycmF5KGFycmF5LCAwKQotCQkJOgotCQkJCXJldGFpbkFsbF8oYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBpcyBub24tZW1wdHkgYW5kIGFycmF5TGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb2xsZWN0aW9uLmNvbnRhaW5zKGFycmF5W2ldKSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXlMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTsgIC8vIGV2ZXJ5dGhpbmcgd2FzIHJldGFpbmVkCi0JCX0KLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBqKTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5W2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmV0YWluQWxsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5Mi5sZW5ndGggPT0gMCkgPwotCQkJCShhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBuZXdBcnJheShhcnJheTEsIDApCi0JCQk6Ci0JCQkJcmV0YWluQWxsKGFycmF5MSwgc2V0KGFycmF5MiksIGFycmF5MUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmV0YWluQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmV0YWluQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpIHsKLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8gYXJyYXkxIDogcmV0YWluQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheTFMZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHJldGFpbkFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoKSB7Ci0JCWludCBhcnJheTJMZW5ndGggPSBhcnJheTIubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IEVNUFRZX0NIQVJfQVJSQVkgOiByZXRhaW5BbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkxTGVuZ3RoID4gMCBhbmQgYXJyYXkyTGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSByZXRhaW5BbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheTFMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkxTGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb250YWlucyhhcnJheTIsIGFycmF5MVtpXSkpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5MUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5MTsgIC8vIGV2ZXJ5dGhpbmcgd2FzIHJldGFpbmVkCi0JCX0KLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2pdOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXkxW2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmV0YWluQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmV0YWluQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKSB7Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IHJldGFpbkFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkxTGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIHJldGFpbkFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCkgewotCQlpbnQgYXJyYXkyTGVuZ3RoID0gYXJyYXkyLmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBFTVBUWV9JTlRfQVJSQVkgOiByZXRhaW5BbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkxTGVuZ3RoID4gMCBhbmQgYXJyYXkyTGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIHJldGFpbkFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheTFMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkxTGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb250YWlucyhhcnJheTIsIGFycmF5MVtpXSkpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5MUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5MTsgIC8vIGV2ZXJ5dGhpbmcgd2FzIHJldGFpbmVkCi0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5MVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgcmV2ZXJzZWQuCi0JICogamF2YS51dGlsLkFycmF5cy5yZXZlcnNlKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXZlcnNlKEUuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDAsIG1pZCA9IGxlbiA+PiAxLCBqID0gbGVuIC0gMTsgaSA8IG1pZDsgaSsrLCBqLS0pIHsKLQkJCXN3YXAoYXJyYXksIGksIGopOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IHJldmVyc2VkLgotCSAqIGphdmEudXRpbC5BcnJheXMucmV2ZXJzZShjaGFyW10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmV2ZXJzZShjaGFyLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwLCBtaWQgPSBsZW4gPj4gMSwgaiA9IGxlbiAtIDE7IGkgPCBtaWQ7IGkrKywgai0tKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCBqKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSByZXZlcnNlZC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzLnJldmVyc2UoaW50W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZXZlcnNlKGludC4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMCwgbWlkID0gbGVuID4+IDEsIGogPSBsZW4gLSAxOyBpIDwgbWlkOyBpKyssIGotLSkgewotCQkJc3dhcChhcnJheSwgaSwgaik7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgd2l0aCBlbnRyaWVzIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB0aG9zZQotCSAqIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiByZXZlcnNlTGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHJldmVyc2UobGlzdChpdGVyYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgd2l0aCBlbnRyaWVzIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB0aG9zZQotCSAqIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiByZXZlcnNlTGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBzaXplKSB7Ci0JCXJldHVybiByZXZlcnNlKGxpc3QoaXRlcmFibGUsIHNpemUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHdpdGggZW50cmllcyBpbiByZXZlcnNlIG9yZGVyIGZyb20gdGhvc2UKLQkgKiByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiByZXZlcnNlKGxpc3QoaXRlcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHdpdGggZW50cmllcyBpbiByZXZlcnNlIG9yZGVyIGZyb20gdGhvc2UKLQkgKiByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gcmV2ZXJzZShsaXN0KGl0ZXJhdG9yLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb3RhdGVkIGFycmF5IGFmdGVyIHJvdGF0aW5nIGl0IG9uZSBwb3NpdGlvbi4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzLnJvdGF0ZShPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcm90YXRlKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHJvdGF0ZShhcnJheSwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb3RhdGVkIGFycmF5IGFmdGVyIHJvdGF0aW5nIGl0IHRoZSBzcGVjaWZpZWQgZGlzdGFuY2UuCi0JICogamF2YS51dGlsLkFycmF5cy5yb3RhdGUoT2JqZWN0W10gYXJyYXksIGludCBkaXN0YW5jZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcm90YXRlKEVbXSBhcnJheSwgaW50IGRpc3RhbmNlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlkaXN0YW5jZSA9IGRpc3RhbmNlICUgbGVuOwotCQlpZiAoZGlzdGFuY2UgPCAwKSB7Ci0JCQlkaXN0YW5jZSArPSBsZW47Ci0JCX0KLQkJaWYgKGRpc3RhbmNlID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBjeWNsZVN0YXJ0ID0gMCwgbk1vdmVkID0gMDsgbk1vdmVkICE9IGxlbjsgY3ljbGVTdGFydCsrKSB7Ci0JCQlFIGRpc3BsYWNlZCA9IGFycmF5W2N5Y2xlU3RhcnRdOwotCQkJaW50IGkgPSBjeWNsZVN0YXJ0OwotCQkJZG8gewotCQkJCWkgKz0gZGlzdGFuY2U7Ci0JCQkJaWYgKGkgPj0gbGVuKSB7Ci0JCQkJCWkgLT0gbGVuOwotCQkJCX0KLQkJCQlFIHRlbXAgPSBhcnJheVtpXTsKLQkJCQlhcnJheVtpXSA9IGRpc3BsYWNlZDsKLQkJCQlkaXNwbGFjZWQgPSB0ZW1wOwotCQkJCW5Nb3ZlZCArKzsKLQkJCX0gd2hpbGUgKGkgIT0gY3ljbGVTdGFydCk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCBvbmUgcG9zaXRpb24uCi0JICogamF2YS51dGlsLkFycmF5cy5yb3RhdGUoY2hhcltdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJvdGF0ZShjaGFyLi4uIGFycmF5KSB7Ci0JCXJldHVybiByb3RhdGUoYXJyYXksIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCB0aGUgc3BlY2lmaWVkIGRpc3RhbmNlLgotCSAqIGphdmEudXRpbC5BcnJheXMucm90YXRlKGNoYXJbXSBhcnJheSwgaW50IGRpc3RhbmNlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJvdGF0ZShjaGFyW10gYXJyYXksIGludCBkaXN0YW5jZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZGlzdGFuY2UgPSBkaXN0YW5jZSAlIGxlbjsKLQkJaWYgKGRpc3RhbmNlIDwgMCkgewotCQkJZGlzdGFuY2UgKz0gbGVuOwotCQl9Ci0JCWlmIChkaXN0YW5jZSA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgY3ljbGVTdGFydCA9IDAsIG5Nb3ZlZCA9IDA7IG5Nb3ZlZCAhPSBsZW47IGN5Y2xlU3RhcnQrKykgewotCQkJY2hhciBkaXNwbGFjZWQgPSBhcnJheVtjeWNsZVN0YXJ0XTsKLQkJCWludCBpID0gY3ljbGVTdGFydDsKLQkJCWRvIHsKLQkJCQlpICs9IGRpc3RhbmNlOwotCQkJCWlmIChpID49IGxlbikgewotCQkJCQlpIC09IGxlbjsKLQkJCQl9Ci0JCQkJY2hhciB0ZW1wID0gYXJyYXlbaV07Ci0JCQkJYXJyYXlbaV0gPSBkaXNwbGFjZWQ7Ci0JCQkJZGlzcGxhY2VkID0gdGVtcDsKLQkJCQluTW92ZWQgKys7Ci0JCQl9IHdoaWxlIChpICE9IGN5Y2xlU3RhcnQpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvdGF0ZWQgYXJyYXkgYWZ0ZXIgcm90YXRpbmcgaXQgb25lIHBvc2l0aW9uLgotCSAqIGphdmEudXRpbC5BcnJheXMucm90YXRlKGludFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcm90YXRlKGludC4uLiBhcnJheSkgewotCQlyZXR1cm4gcm90YXRlKGFycmF5LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvdGF0ZWQgYXJyYXkgYWZ0ZXIgcm90YXRpbmcgaXQgdGhlIHNwZWNpZmllZCBkaXN0YW5jZS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzLnJvdGF0ZShpbnRbXSBhcnJheSwgaW50IGRpc3RhbmNlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcm90YXRlKGludFtdIGFycmF5LCBpbnQgZGlzdGFuY2UpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWRpc3RhbmNlID0gZGlzdGFuY2UgJSBsZW47Ci0JCWlmIChkaXN0YW5jZSA8IDApIHsKLQkJCWRpc3RhbmNlICs9IGxlbjsKLQkJfQotCQlpZiAoZGlzdGFuY2UgPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGN5Y2xlU3RhcnQgPSAwLCBuTW92ZWQgPSAwOyBuTW92ZWQgIT0gbGVuOyBjeWNsZVN0YXJ0KyspIHsKLQkJCWludCBkaXNwbGFjZWQgPSBhcnJheVtjeWNsZVN0YXJ0XTsKLQkJCWludCBpID0gY3ljbGVTdGFydDsKLQkJCWRvIHsKLQkJCQlpICs9IGRpc3RhbmNlOwotCQkJCWlmIChpID49IGxlbikgewotCQkJCQlpIC09IGxlbjsKLQkJCQl9Ci0JCQkJaW50IHRlbXAgPSBhcnJheVtpXTsKLQkJCQlhcnJheVtpXSA9IGRpc3BsYWNlZDsKLQkJCQlkaXNwbGFjZWQgPSB0ZW1wOwotCQkJCW5Nb3ZlZCArKzsKLQkJCX0gd2hpbGUgKGkgIT0gY3ljbGVTdGFydCk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogamF2YS51dGlsLkhhc2hTZXQoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFNldDxFPiBzZXQoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBzZXQoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBqYXZhLnV0aWwuSGFzaFNldChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gU2V0PEU+IHNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBzaXplKSB7Ci0JCXJldHVybiBzZXQoaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBqYXZhLnV0aWwuSGFzaFNldChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gU2V0PEU+IHNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIHNldChpdGVyYXRvciwgbmV3IEhhc2hTZXQ8RT4oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBqYXZhLnV0aWwuSGFzaFNldChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gU2V0PEU+IHNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiBzZXQoaXRlcmF0b3IsIG5ldyBIYXNoU2V0PEU+KHNpemUpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gU2V0PEU+IHNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEhhc2hTZXQ8RT4gc2V0KSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXNldC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gc2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkhhc2hTZXQoT2JqZWN0W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gU2V0PEU+IHNldChFLi4uIGFycmF5KSB7Ci0JCVNldDxFPiBzZXQgPSBuZXcgSGFzaFNldDxFPihhcnJheS5sZW5ndGgpOwotCQlmb3IgKEUgaXRlbSA6IGFycmF5KSB7Ci0JCQlzZXQuYWRkKGl0ZW0pOwotCQl9Ci0JCXJldHVybiBzZXQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmFuZG9tIFJBTkRPTSA9IG5ldyBSYW5kb20oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogamF2YS51dGlsLkFycmF5cyNzaHVmZmxlKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzaHVmZmxlKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHNodWZmbGUoYXJyYXksIFJBTkRPTSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3NodWZmbGUoT2JqZWN0W10gYXJyYXksIFJhbmRvbSByKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzaHVmZmxlKEVbXSBhcnJheSwgUmFuZG9tIHJhbmRvbSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCByYW5kb20ubmV4dEludChsZW4pKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3NodWZmbGUoY2hhcltdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHNodWZmbGUoY2hhci4uLiBhcnJheSkgewotCQlyZXR1cm4gc2h1ZmZsZShhcnJheSwgUkFORE9NKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyICJzaHVmZmxpbmciIGl0LgotCSAqIGphdmEudXRpbC5BcnJheXMjc2h1ZmZsZShjaGFyW10gYXJyYXksIFJhbmRvbSByKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHNodWZmbGUoY2hhcltdIGFycmF5LCBSYW5kb20gcmFuZG9tKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCXN3YXAoYXJyYXksIGksIHJhbmRvbS5uZXh0SW50KGxlbikpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyICJzaHVmZmxpbmciIGl0LgotCSAqIGphdmEudXRpbC5BcnJheXMjc2h1ZmZsZShpbnRbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHNodWZmbGUoaW50Li4uIGFycmF5KSB7Ci0JCXJldHVybiBzaHVmZmxlKGFycmF5LCBSQU5ET00pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogamF2YS51dGlsLkFycmF5cyNzaHVmZmxlKGludFtdIGFycmF5LCBSYW5kb20gcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHNodWZmbGUoaW50W10gYXJyYXksIFJhbmRvbSByYW5kb20pIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJc3dhcChhcnJheSwgaSwgcmFuZG9tLm5leHRJbnQobGVuKSk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgb25seSB0aGUgc2luZ2xlLAotCSAqIHNwZWNpZmllZCBvYmplY3QuCi0JICogT2JqZWN0I3RvSXRlcmF0b3IoKSA/IQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhdG9yPEU+IHNpbmdsZXRvbkl0ZXJhdG9yKEUgdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4odmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogamF2YS5sYW5nLkl0ZXJhYmxlI3NpemUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNpemUoSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNpemUoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3Ijc2l6ZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgc2l6ZShJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlpbnQgc2l6ZSA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCXNpemUrKzsKLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBqYXZhLnV0aWwuVHJlZVNldChqYXZhLmxhbmcuSXRlcmFibGUgaXRlcmFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gU29ydGVkU2V0PEU+IHNvcnRlZFNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYWJsZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogamF2YS51dGlsLlRyZWVTZXQoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IFNvcnRlZFNldDxFPiBzb3J0ZWRTZXQoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gc29ydGVkU2V0KGl0ZXJhYmxlLCBzaXplLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIGphdmEudXRpbC5UcmVlU2V0KGphdmEubGFuZy5JdGVyYWJsZSBpdGVyYWJsZSwgamF2YS51dGlsLkNvbXBhcmF0b3IgYykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBTb3J0ZWRTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYWJsZS5pdGVyYXRvcigpLCBjb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIGphdmEudXRpbC5UcmVlU2V0KGphdmEubGFuZy5JdGVyYWJsZSBpdGVyYWJsZSwgamF2YS51dGlsLkNvbXBhcmF0b3IgYykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBTb3J0ZWRTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSwgY29tcGFyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLlRyZWVTZXQoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IFNvcnRlZFNldDxFPiBzb3J0ZWRTZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoaXRlcmF0b3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIGphdmEudXRpbC5UcmVlU2V0KGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBTb3J0ZWRTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYXRvciwgc2l6ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiBhbmQgY29tcGFyYXRvci4KLQkgKiBqYXZhLnV0aWwuVHJlZVNldChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IsIGphdmEudXRpbC5Db21wYXJhdG9yIGMpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gU29ydGVkU2V0PEU+IHNvcnRlZFNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQobGlzdChpdGVyYXRvciksIGNvbXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogYW5kIGNvbXBhcmF0b3IuCi0JICogamF2YS51dGlsLlRyZWVTZXQoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yLCBqYXZhLnV0aWwuQ29tcGFyYXRvciBjKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFNvcnRlZFNldDxFPiBzb3J0ZWRTZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChsaXN0KGl0ZXJhdG9yLCBzaXplKSwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IFNvcnRlZFNldDxFPiBzb3J0ZWRTZXQoTGlzdDxFPiBsaXN0LCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlTb3J0ZWRTZXQ8RT4gc29ydGVkU2V0ID0gbmV3IFRyZWVTZXQ8RT4oY29tcGFyYXRvcik7Ci0JCXNvcnRlZFNldC5hZGRBbGwobGlzdCk7Ci0JCXJldHVybiBzb3J0ZWRTZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogamF2YS51dGlsLlRyZWVTZXQoT2JqZWN0W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gU29ydGVkU2V0PEU+IHNvcnRlZFNldChFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoYXJyYXksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogYW5kIGNvbXBhcmF0b3IuCi0JICogamF2YS51dGlsLlRyZWVTZXQoT2JqZWN0W10gYXJyYXksIGphdmEudXRpbC5Db21wYXJhdG9yIGMpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gU29ydGVkU2V0PEU+IHNvcnRlZFNldChFW10gYXJyYXksIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCVNvcnRlZFNldDxFPiBzb3J0ZWRTZXQgPSBuZXcgVHJlZVNldDxFPihjb21wYXJhdG9yKTsKLQkJc29ydGVkU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0JCXJldHVybiBzb3J0ZWRTZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLWFycmF5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXksIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQKLQkgKiBwb3NpdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIGphdmEudXRpbC5BcnJheXMjc3ViQXJyYXkoRVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHN1YkFycmF5KEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgbGVuZ3RoKTsKLQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHN0YXJ0LCByZXN1bHQsIDAsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBhcnJheSwgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZAotCSAqIHBvc2l0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogamF2YS51dGlsLkFycmF5cyNzdWJBcnJheShpbnRbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc3ViQXJyYXkoaW50W10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xlbmd0aF07Ci0JCWlmIChsZW5ndGggPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzdGFydCwgcmVzdWx0LCAwLCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLWFycmF5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXksIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQKLQkgKiBwb3NpdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIGphdmEudXRpbC5BcnJheXMjc3ViQXJyYXkoY2hhcltdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc3ViQXJyYXkoY2hhcltdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCWlmIChsZW5ndGggPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzdGFydCwgcmVzdWx0LCAwLCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGhhdmUgYmVlbiAic3dhcHBlZCIuCi0JICogamF2YS51dGlsLkFycmF5cyNzd2FwKE9iamVjdFtdIGFycmF5LCBpbnQgaSwgaW50IGopCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHN3YXAoRVtdIGFycmF5LCBpbnQgaSwgaW50IGopIHsKLQkJRSB0ZW1wID0gYXJyYXlbaV07Ci0JCWFycmF5W2ldID0gYXJyYXlbal07Ci0JCWFycmF5W2pdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBlbGVtZW50cyBoYXZlIGJlZW4gInN3YXBwZWQiLgotCSAqIGphdmEudXRpbC5BcnJheXMjc3dhcChjaGFyW10gYXJyYXksIGludCBpLCBpbnQgaikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzd2FwKGNoYXJbXSBhcnJheSwgaW50IGksIGludCBqKSB7Ci0JCWNoYXIgdGVtcCA9IGFycmF5W2ldOwotCQlhcnJheVtpXSA9IGFycmF5W2pdOwotCQlhcnJheVtqXSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgaGF2ZSBiZWVuICJzd2FwcGVkIi4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3N3YXAoaW50W10gYXJyYXksIGludCBpLCBpbnQgaikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHN3YXAoaW50W10gYXJyYXksIGludCBpLCBpbnQgaikgewotCQlpbnQgdGVtcCA9IGFycmF5W2ldOwotCQlhcnJheVtpXSA9IGFycmF5W2pdOwotCQlhcnJheVtqXSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsZWdhY3kgY29kZSB0aGF0IHJlcXVpcmVzIGEgamF2YS51dGlsLlZlY3Rvci4KLQkgKiBqYXZhLnV0aWwuVmVjdG9yKGphdmEubGFuZy5JdGVyYWJsZSBpdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gdmVjdG9yKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgcmVxdWlyZXMgYSBqYXZhLnV0aWwuVmVjdG9yLgotCSAqIGphdmEudXRpbC5WZWN0b3IoamF2YS5sYW5nLkl0ZXJhYmxlIGl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFZlY3RvcjxFPiB2ZWN0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gdmVjdG9yKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgcmVxdWlyZXMgYSBqYXZhLnV0aWwuVmVjdG9yLgotCSAqIGphdmEudXRpbC5WZWN0b3IoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFZlY3RvcjxFPiB2ZWN0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiB2ZWN0b3IoaXRlcmF0b3IsIG5ldyBWZWN0b3I8RT4oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbGVnYWN5IGNvZGUgdGhhdCByZXF1aXJlcyBhIGphdmEudXRpbC5WZWN0b3IuCi0JICogamF2YS51dGlsLlZlY3RvcihqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVmVjdG9yPEU+IHZlY3RvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiB2ZWN0b3IoaXRlcmF0b3IsIG5ldyBWZWN0b3I8RT4oc2l6ZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgVmVjdG9yPEU+IHYpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdi5hZGRFbGVtZW50KGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbGVnYWN5IGNvZGUgdGhhdCByZXF1aXJlcyBhIGphdmEudXRpbC5WZWN0b3IuCi0JICogamF2YS51dGlsLlZlY3RvcihPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEUuLi4gYXJyYXkpIHsKLQkJVmVjdG9yPEU+IHYgPSBuZXcgVmVjdG9yPEU+KGFycmF5Lmxlbmd0aCk7Ci0JCWZvciAoRSBpdGVtIDogYXJyYXkpIHsKLQkJCXYuYWRkRWxlbWVudChpdGVtKTsKLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2luZ2xlLXVzZSBJdGVyYWJsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGlzIGEgb25lLXRpbWUgdXNlIGl0ZXJhYmxlIHRoYXQgY2FuIHJldHVybiBhIHNpbmdsZSBpdGVyYXRvci4KLQkgKiBPbmNlIHRoZSBpdGVyYXRvciBpcyByZXR1cm5lZCB0aGUgaXRlcmFibGUgaXMgbm8gbG9uZ2VyIHZhbGlkLgotCSAqIEFzIHN1Y2gsIHRoaXMgdXRpbGl0eSBzaG91bGQgb25seSBiZSB1c2VkIGluIG9uZS10aW1lIHVzZSBzaXR1YXRpb25zLAotCSAqIHN1Y2ggYXMgYSAnZm9yLWVhY2gnIGxvb3AuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGVVc2VJdGVyYWJsZTxFPiBpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+IHsKLQkJcHJpdmF0ZSBJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQotCQlwdWJsaWMgU2luZ2xlVXNlSXRlcmFibGUoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuaXRlcmF0b3IgPSBuZXcgR2VuZXJpY0l0ZXJhdG9yV3JhcHBlcjxFPihpdGVyYXRvcik7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCQlpZiAodGhpcy5pdGVyYXRvciA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyBtZXRob2QgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQuIik7Ci0JCQl9Ci0JCQlJdGVyYXRvcjxFPiByZXN1bHQgPSB0aGlzLml0ZXJhdG9yOwotCQkJdGhpcy5pdGVyYXRvciA9IG51bGw7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGphdmEudXRpbC5Db2xsZWN0aW9ucyBlbmhhbmNlbWVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZXN0aW5hdGlvbiBsaXN0IGFmdGVyIHRoZSBzb3VyY2UgbGlzdCBoYXMgYmVlbiBjb3BpZWQgaW50byBpdC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyNjb3B5KGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PD8gc3VwZXIgRT4gY29weShMaXN0PD8gc3VwZXIgRT4gZGVzdCwgTGlzdDw/IGV4dGVuZHMgRT4gc3JjKSB7Ci0JCUNvbGxlY3Rpb25zLmNvcHkoZGVzdCwgc3JjKTsKLQkJcmV0dXJuIGRlc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zI2ZpbGwoamF2YS51dGlsLkxpc3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDw/IHN1cGVyIEU+IGZpbGwoTGlzdDw/IHN1cGVyIEU+IGxpc3QsIEUgdmFsdWUpIHsKLQkJQ29sbGVjdGlvbnMuZmlsbChsaXN0LCB2YWx1ZSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAicmV2ZXJzZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zI3JldmVyc2UoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiByZXZlcnNlKExpc3Q8RT4gbGlzdCkgewotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInJvdGF0ZWQiIGJ5IG9uZSBwb3NpdGlvbi4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyNyb3RhdGUoamF2YS51dGlsLkxpc3QsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJvdGF0ZShMaXN0PEU+IGxpc3QpIHsKLQkJcmV0dXJuIHJvdGF0ZShsaXN0LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInJvdGF0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zI3JvdGF0ZShqYXZhLnV0aWwuTGlzdCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcm90YXRlKExpc3Q8RT4gbGlzdCwgaW50IGRpc3RhbmNlKSB7Ci0JCUNvbGxlY3Rpb25zLnJvdGF0ZShsaXN0LCBkaXN0YW5jZSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAic2h1ZmZsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zI3NodWZmbGUoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBzaHVmZmxlKExpc3Q8RT4gbGlzdCkgewotCQlDb2xsZWN0aW9ucy5zaHVmZmxlKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInNodWZmbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzaHVmZmxlKGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuUmFuZG9tKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gc2h1ZmZsZShMaXN0PEU+IGxpc3QsIFJhbmRvbSByYW5kb20pIHsKLQkJQ29sbGVjdGlvbnMuc2h1ZmZsZShsaXN0LCByYW5kb20pOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc29ydChqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBMaXN0PEU+IHNvcnQoTGlzdDxFPiBsaXN0KSB7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzb3J0KGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuQ29tcGFyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHNvcnQoTGlzdDxFPiBsaXN0LCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIGNvbXBhcmF0b3IpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZXJhYmxlIGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IEl0ZXJhYmxlPEU+IHNvcnQoSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNvcnQoaXRlcmFibGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmFibGUgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSXRlcmFibGU8RT4gc29ydChJdGVyYWJsZTxFPiBpdGVyYWJsZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnQobGlzdChpdGVyYWJsZSksIGNvbXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gSXRlcmF0b3I8RT4gc29ydChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnQoaXRlcmF0b3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSXRlcmF0b3I8RT4gc29ydChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0KGxpc3QoaXRlcmF0b3IpLCBjb21wYXJhdG9yKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGhhdmUgYmVlbiAic3dhcHBlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3dhcChqYXZhLnV0aWwuTGlzdCwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBzd2FwKExpc3Q8RT4gbGlzdCwgaW50IGksIGludCBqKSB7Ci0JCUNvbGxlY3Rpb25zLnN3YXAobGlzdCwgaSwgaik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqYXZhLnV0aWwuQXJyYXlzIGVuaGFuY2VtZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGJvb2xlYW5bXSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW5bXSBmaWxsKGJvb2xlYW5bXSBhcnJheSwgYm9vbGVhbiB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjZmlsbChib29sZWFuW10sIGludCwgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbltdIGZpbGwoYm9vbGVhbltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgYm9vbGVhbiB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGJ5dGVbXSwgYnl0ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBmaWxsKGJ5dGVbXSBhcnJheSwgYnl0ZSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjZmlsbChieXRlW10sIGludCwgaW50LCBieXRlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGZpbGwoYnl0ZVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgYnl0ZSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGNoYXJbXSwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBmaWxsKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjZmlsbChjaGFyW10sIGludCwgaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGZpbGwoY2hhcltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgY2hhciB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGRvdWJsZVtdLCBkb3VibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBkb3VibGVbXSBmaWxsKGRvdWJsZVtdIGFycmF5LCBkb3VibGUgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoZG91YmxlW10sIGludCwgaW50LCBkb3VibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBkb3VibGVbXSBmaWxsKGRvdWJsZVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoZmxvYXRbXSwgZmxvYXQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdFtdIGZpbGwoZmxvYXRbXSBhcnJheSwgZmxvYXQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoZmxvYXRbXSwgaW50LCBpbnQsIGZsb2F0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmxvYXRbXSBmaWxsKGZsb2F0W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBmbG9hdCB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGludFtdLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBmaWxsKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoaW50W10sIGludCwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBmaWxsKGludFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgaW50IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoT2JqZWN0W10sIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gZmlsbChFW10gYXJyYXksIEUgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoT2JqZWN0W10sIGludCwgaW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGZpbGwoRVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgRSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGxvbmdbXSwgbG9uZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmdbXSBmaWxsKGxvbmdbXSBhcnJheSwgbG9uZyB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjZmlsbChsb25nW10sIGludCwgaW50LCBsb25nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZ1tdIGZpbGwobG9uZ1tdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgbG9uZyB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKHNob3J0W10sIHNob3J0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBmaWxsKHNob3J0W10gYXJyYXksIHNob3J0IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKHNob3J0W10sIGludCwgaW50LCBzaG9ydCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHNob3J0W10gZmlsbChzaG9ydFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgc2hvcnQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChieXRlW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gc29ydChieXRlLi4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoYnl0ZVtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBzb3J0KGJ5dGVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KGNoYXJbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzb3J0KGNoYXIuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHNvcnQoY2hhcltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoZG91YmxlW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBkb3VibGVbXSBzb3J0KGRvdWJsZS4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KGRvdWJsZVtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGRvdWJsZVtdIHNvcnQoZG91YmxlW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChmbG9hdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmxvYXRbXSBzb3J0KGZsb2F0Li4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoZmxvYXRbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdFtdIHNvcnQoZmxvYXRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KGludFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc29ydChpbnQuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChpbnRbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzb3J0KGludFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHNvcnQoRS4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KE9iamVjdFtdLCBqYXZhLnV0aWwuQ29tcGFyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc29ydChFW10gYXJyYXksIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoT2JqZWN0W10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzb3J0KEVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KE9iamVjdFtdLCBpbnQsIGludCwgamF2YS51dGlsLkNvbXBhcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHNvcnQoRVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgY29tcGFyYXRvcik7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KGxvbmdbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmdbXSBzb3J0KGxvbmcuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChsb25nW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZ1tdIHNvcnQobG9uZ1tdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoc2hvcnRbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHNob3J0W10gc29ydChzaG9ydC4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KHNob3J0W10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBzb3J0KHNob3J0W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvdW50ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9Db3VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZTNjZGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvdW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB3aGVyZXZlciBhIG11dGFibGUgaW50ZWdlciBvYmplY3QgaXMgbmVlZGVkLgotICogSXQgaXMgYSBjcm9zcyBiZXR3ZWVuIGFuIGludCBhbmQgYW4gSW50ZWdlci4gSXQgY2FuIGJlIHN0b3JlZCBpbiBhIHN0YW5kYXJkCi0gKiBjb250YWluZXIgKGUuZy4gQ29sbGVjdGlvbikgYnV0IGNhbiBiZSBtb2RpZmllZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvdW50ZXIKLQlpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBpbnQgY291bnQgPSAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvdW50ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIENvdW50ZXIoaW50IGNvdW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY291bnQgPSBjb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb3VudGVyIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiB6ZXJvLgotCSAqLwotCXB1YmxpYyBDb3VudGVyKCkgewotCQl0aGlzKDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBjb3VudCBvZiB0aGUgY291bnRlci4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBjb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMuY291bnQ7Ci0JfQotCi0JLyoqCi0JICogSW5jcmVtZW50IGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgY291bnQgb2YgdGhlIGNvdW50ZXIuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgaW5jcmVtZW50KCkgewotCQlyZXR1cm4gKyt0aGlzLmNvdW50OwotCX0KLQotCS8qKgotCSAqIEluY3JlbWVudCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IGNvdW50IG9mIHRoZSBjb3VudGVyLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGluY3JlbWVudChpbnQgaW5jcmVtZW50KSB7Ci0JCXJldHVybiB0aGlzLmNvdW50ICs9IGluY3JlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBEZXJlbWVudCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IGNvdW50IG9mIHRoZSBjb3VudGVyLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGRlY3JlbWVudCgpIHsKLQkJcmV0dXJuIC0tdGhpcy5jb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBEZXJlbWVudCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IGNvdW50IG9mIHRoZSBjb3VudGVyLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGRlY3JlbWVudChpbnQgZGVjcmVtZW50KSB7Ci0JCXJldHVybiB0aGlzLmNvdW50IC09IGRlY3JlbWVudDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIENvdW50ZXIpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY291bnQgPT0gKChDb3VudGVyKSBvKS5jb3VudDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuY291bnQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlzYi5hcHBlbmQodGhpcy5jb3VudCk7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9FbXB0eUl0ZXJhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvRW1wdHlJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjE1NTY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9FbXB0eUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLS8qKgotICogQW4gPGNvZGU+RW1wdHlJdGVyYWJsZTwvY29kZT4gaXMganVzdCB0aGF0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVtcHR5SXRlcmFibGUgSU5TVEFOQ0UgPSBuZXcgRW1wdHlJdGVyYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8VD4gSXRlcmFibGU8VD4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRW1wdHlJdGVyYWJsZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvRmlsZVRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvRmlsZVRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTU0YzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0ZpbGVUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqIEFzc29ydGVkIGZpbGUgdG9vbHM6Ci0gKiAtIGRlbGV0ZSBlbnRpcmUgdHJlZXMgb2YgZGlyZWN0b3JpZXMgYW5kIGZpbGVzCi0gKiAtIGJ1aWxkIGl0ZXJhdG9ycyBvbiBlbnRpcmUgdHJlZXMgb2YgZGlyZWN0b3JpZXMgYW5kIGZpbGVzCi0gKiAtIGJ1aWxkIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeQotICogLSAiY2Fub25pemUiIGZpbGVzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWxlVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9IT01FX0RJUkVDVE9SWV9OQU1FID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSA9ICJ0bXBkaXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfV09SS0lOR19ESVJFQ1RPUllfTkFNRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKLQotICAgIC8qKiBBIGxpc3Qgb2Ygc29tZSBpbnZhbGlkIGZpbGUgbmFtZSBjaGFyYWN0ZXJzLgotCQkJCTogaXMgdGhlIGZpbGVuYW1lIHNlcGFyYXRvciBpbiBNYWNPUyBhbmQgdGhlIGRyaXZlIGluZGljYXRvciBpbiBET1MKLQkJCQkqIGlzIGEgRE9TIHdpbGRjYXJkIGNoYXJhY3RlcgotCQkJCXwgaXMgYSBET1MgcmVkaXJlY3Rpb24gY2hhcmFjdGVyCi0JCQkJJiBpcyBvdXIgb3duIGVzY2FwZSBjaGFyYWN0ZXIKLQkJCQkvIGlzIHRoZSBmaWxlbmFtZSBzZXBhcmF0b3IgaW4gVW5peCBhbmQgdGhlIGNvbW1hbmQgb3B0aW9uIHRhZyBpbiBET1MKLQkJCQlcIGlzIHRoZSBmaWxlbmFtZSBzZXBhcmF0b3IgaW4gRE9TL1dpbmRvd3MgYW5kIHRoZSBlc2NhcGUgY2hhcmFjdGVyIGluIFVuaXgKLQkJCQk7IGlzID8/PwotCQkJCT8gaXMgYSBET1Mgd2lsZGNhcmQgY2hhcmFjdGVyCi0JCQkJWyBpcyA/Pz8KLQkJCQldIGlzID8/PwotCQkJCT0gaXMgPz8/Ci0JCQkJKyBpcyA/Pz8KLQkJCQk8IGlzIGEgRE9TIHJlZGlyZWN0aW9uIGNoYXJhY3RlcgotCQkJCT4gaXMgYSBET1MgcmVkaXJlY3Rpb24gY2hhcmFjdGVyCi0JCQkJIiBpcyB1c2VkIGJ5IERPUyB0byBkZWxpbWl0IGZpbGUgbmFtZXMgd2l0aCBzcGFjZXMKLQkJCQksIGlzID8/PwotICAgICAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIElOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyA9IHsgJzonLCAnKicsICd8JywgJyYnLCAnLycsICdcXCcsICc7JywgJz8nLCAnWycsICddJywgJz0nLCAnKycsICc8JywgJz4nLCAnIicsICcsJyB9OwotCi0JLyoqIFRoaXMgZW5jb2RlciB3aWxsIGNvbnZlcnQgc3RyaW5ncyBpbnRvIHZhbGlkIGZpbGUgbmFtZXMuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTdHJpbmdFbmNvZGVyIEZJTEVfTkFNRV9FTkNPREVSID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQotCS8qKiBXaW5kb3dzIGZpbGVzIHRoYXQgYXJlIHJlZGlyZWN0ZWQgdG8gZGV2aWNlcyBldGMuICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gV0lORE9XU19SRVNFUlZFRF9GSUxFX05BTUVTID0gewotCQkiY29uIiwKLQkJImF1eCIsCi0JCSJjb20xIiwgImNvbTIiLCAiY29tMyIsICJjb200IiwgImNvbTUiLCAiY29tNiIsICJjb203IiwgImNvbTgiLCAiY29tOSIsCi0JCSJscHQxIiwgImxwdDIiLCAibHB0MyIsICJscHQ0IiwgImxwdDUiLCAibHB0NiIsICJscHQ3IiwgImxwdDgiLCAibHB0OSIsCi0JCSJwcm4iLAotCQkibnVsIgotCX07Ci0KLQkvKiogVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgc2hvcnRlbmVkIGZpbGUgbmFtZS4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIID0gNjA7Ci0KLQotCS8vICoqKioqKioqKiogZGVsZXRpbmcgZGlyZWN0b3JpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogRGVsZXRlIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnRzLgotCSAqIDxlbT5VU0UgV0lUSCBDQVJFLjwvZW0+Ci0JICogRmlsZSNkZWxldGVBbGwoKT8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCWRlbGV0ZURpcmVjdG9yeShuZXcgRmlsZShkaXJlY3RvcnlOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBhbmQgYWxsIG9mIGl0cyBjb250ZW50cy4KLQkgKiA8ZW0+VVNFIFdJVEggQ0FSRS48L2VtPgotCSAqIEZpbGUjZGVsZXRlQWxsKCk/Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkgewotCQlkZWxldGVEaXJlY3RvcnlDb250ZW50cyhkaXJlY3RvcnkpOwotCQlpZiAoICEgZGlyZWN0b3J5LmRlbGV0ZSgpKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidW5hYmxlIHRvIGRlbGV0ZSBkaXJlY3Rvcnk6ICIgKyBkaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZSB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkKLQkgKiAoYnV0IG5vdCB0aGUgZGlyZWN0b3J5IGl0c2VsZikuCi0JICogPGVtPlVTRSBXSVRIIENBUkUuPC9lbT4KLQkgKiBGaWxlI2RlbGV0ZUZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5Q29udGVudHMoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJZGVsZXRlRGlyZWN0b3J5Q29udGVudHMobmV3IEZpbGUoZGlyZWN0b3J5TmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Ci0JICogKGJ1dCBub3QgdGhlIGRpcmVjdG9yeSBpdHNlbGYpLgotCSAqIDxlbT5VU0UgV0lUSCBDQVJFLjwvZW0+Ci0JICogRmlsZSNkZWxldGVGaWxlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCWZvciAoRmlsZSBmaWxlIDogZGlyZWN0b3J5Lmxpc3RGaWxlcygpKSB7Ci0JCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJZGVsZXRlRGlyZWN0b3J5KGZpbGUpOwkvLyByZWN1cnNlIHRocm91Z2ggc3ViZGlyZWN0b3JpZXMKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCAhIGZpbGUuZGVsZXRlKCkpIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInVuYWJsZSB0byBkZWxldGUgZmlsZTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQotCS8vICoqKioqKioqKiogY29weWluZyBmaWxlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLgotCSAqIEZpbGUjY29weShGaWxlIGRlc3RpbmF0aW9uRmlsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weVRvRmlsZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdGluYXRpb25GaWxlKQotCQl0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCUZpbGVDaGFubmVsIHNvdXJjZUNoYW5uZWwgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZUZpbGUpLmdldENoYW5uZWwoKTsKLQkJRmlsZUNoYW5uZWwgZGVzdGluYXRpb25DaGFubmVsID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdGluYXRpb25GaWxlKS5nZXRDaGFubmVsKCk7Ci0JCXRyeSB7Ci0JCQlkZXN0aW5hdGlvbkNoYW5uZWwudHJhbnNmZXJGcm9tKHNvdXJjZUNoYW5uZWwsIDAsIHNvdXJjZUNoYW5uZWwuc2l6ZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNvdXJjZUNoYW5uZWwuY2xvc2UoKTsKLQkJCWRlc3RpbmF0aW9uQ2hhbm5lbC5jbG9zZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvcGllcyB0aGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGUgdG8gYSBmaWxlIGJ5Ci0JICogdGhlIHNhbWUgbmFtZSBpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgotCSAqIEZpbGUjY29weVRvRGlyZWN0b3J5KEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnkpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlUb0RpcmVjdG9yeShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnkpCi0JCXRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJRmlsZSBkZXN0aW5hdGlvbkZpbGUgPSBuZXcgRmlsZShkZXN0aW5hdGlvbkRpcmVjdG9yeSwgc291cmNlRmlsZS5nZXROYW1lKCkpOwotCQlkZXN0aW5hdGlvbkZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQljb3B5VG9GaWxlKHNvdXJjZUZpbGUsIGRlc3RpbmF0aW9uRmlsZSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBpdGVyYXRvcmluZyBvdmVyIGZpbGVzIGFuZCBkaXJlY3RvcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiBUaGUgaXRlcmF0b3Igd2lsbCBza2lwIG92ZXIgc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNmaWxlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0luKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCXJldHVybiBmaWxlc0luKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogVGhlIGl0ZXJhdG9yIHdpbGwgc2tpcCBvdmVyIHN1YmRpcmVjdG9yaWVzLgotCSAqIEZpbGUjZmlsZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJbihGaWxlIGRpcmVjdG9yeSkgewotCQlyZXR1cm4gZmlsZXNJbihkaXJlY3RvcnkubGlzdEZpbGVzKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0luKEZpbGVbXSBmaWxlcykgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEZpbGUsIEZpbGU+KG5ldyBBcnJheUl0ZXJhdG9yPEZpbGU+KGZpbGVzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoRmlsZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuaXNGaWxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzCi0JICogaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogRmlsZSNzdWJEaXJlY3RvcmllcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBkaXJlY3Rvcmllc0luKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCXJldHVybiBkaXJlY3Rvcmllc0luKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgc3ViZGlyZWN0b3JpZXMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiBGaWxlI3N1YkRpcmVjdG9yaWVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW4oRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGRpcmVjdG9yaWVzSW4oZGlyZWN0b3J5Lmxpc3RGaWxlcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJbihGaWxlW10gZmlsZXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxGaWxlLCBGaWxlPihuZXcgQXJyYXlJdGVyYXRvcjxGaWxlPihmaWxlcykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmlzRGlyZWN0b3J5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGZpbGVzIHVuZGVyIHRoZSBzcGVjaWZpZWQKLQkgKiBkaXJlY3RvcnksIHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzLgotCSAqIFRoZSBpdGVyYXRvciB3aWxsIHNraXAgb3ZlciB0aGUgc3ViZGlyZWN0b3JpZXMgdGhlbXNlbHZlcy4KLQkgKiBGaWxlI2ZpbGVzUmVjdXJzZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0luVHJlZShTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlyZXR1cm4gZmlsZXNJblRyZWUobmV3IEZpbGUoZGlyZWN0b3J5TmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBmaWxlcyB1bmRlciB0aGUgc3BlY2lmaWVkCi0JICogZGlyZWN0b3J5LCByZWN1cnNpbmcgaW50byBzdWJkaXJlY3Rvcmllcy4KLQkgKiBUaGUgaXRlcmF0b3Igd2lsbCBza2lwIG92ZXIgdGhlIHN1YmRpcmVjdG9yaWVzIHRoZW1zZWx2ZXMuCi0JICogRmlsZSNmaWxlc1JlY3Vyc2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJblRyZWUoRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGZpbGVzSW5UcmVlQXNTZXQoZGlyZWN0b3J5KS5pdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFNldDxGaWxlPiBmaWxlc0luVHJlZUFzU2V0KEZpbGUgZGlyZWN0b3J5KSB7Ci0JCVNldDxGaWxlPiBmaWxlcyA9IG5ldyBIYXNoU2V0PEZpbGU+KDEwMDAwKTsKLQkJYWRkRmlsZXNJblRyZWVUbyhkaXJlY3RvcnksIGZpbGVzKTsKLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRmlsZXNJblRyZWVUbyhGaWxlIGRpcmVjdG9yeSwgQ29sbGVjdGlvbjxGaWxlPiBhbGxGaWxlcykgewotCQlmb3IgKEZpbGUgZmlsZSA6IGRpcmVjdG9yeS5saXN0RmlsZXMoKSkgewotCQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKLQkJCQlhbGxGaWxlcy5hZGQoZmlsZSk7Ci0JCQl9IGVsc2UgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWFkZEZpbGVzSW5UcmVlVG8oZmlsZSwgYWxsRmlsZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZGlyZWN0b3JpZXMgdW5kZXIgdGhlIHNwZWNpZmllZAotCSAqIGRpcmVjdG9yeSwgcmVjdXJzaW5nIGludG8gc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNzdWJEaXJlY3Rvcmllc1JlY3Vyc2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWUoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJcmV0dXJuIGRpcmVjdG9yaWVzSW5UcmVlKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZGlyZWN0b3JpZXMgdW5kZXIgdGhlIHNwZWNpZmllZAotCSAqIGRpcmVjdG9yeSwgcmVjdXJzaW5nIGludG8gc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNzdWJEaXJlY3Rvcmllc1JlY3Vyc2UoKQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWUoRmlsZSBkaXJlY3RvcnkpIHsKLQkJRmlsZVtdIGZpbGVzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEZpbGU+KGRpcmVjdG9yaWVzSW4oZmlsZXMpLCBkaXJlY3Rvcmllc0luVHJlZXMoZGlyZWN0b3JpZXNJbihmaWxlcykpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWVzKEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8RmlsZT4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGaWxlLCBJdGVyYXRvcjxGaWxlPj4oZGlyZWN0b3JpZXMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8RmlsZT4gdHJhbnNmb3JtKEZpbGUgbmV4dCkgewotCQkJCQlyZXR1cm4gRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW5UcmVlKG5leHQpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHNob3J0IGZpbGUgbmFtZSBtYW5pcHVsYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaXAgdGhlIGV4dGVuc2lvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lCi0JICogYW5kIHJldHVybiB0aGUgcmVzdWx0LiBJZiB0aGUgZmlsZSBuYW1lIGhhcyBubwotCSAqIGV4dGVuc2lvbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkCi0JICogRmlsZSNiYXNlUGF0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBFeHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZpbGVOYW1lOwotCQl9Ci0JCXJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCX0KLQkKLQkvKioKLQkgKiBTdHJpcCB0aGUgZXh0ZW5zaW9uIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlJ3MgbmFtZQotCSAqIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gSWYgdGhlIGZpbGUncyBuYW1lIGhhcyBubwotCSAqIGV4dGVuc2lvbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkCi0JICogRmlsZSNiYXNlUGF0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBFeHRlbnNpb24oRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBzdHJpcEV4dGVuc2lvbihmaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHRlbnNpb24sIGluY2x1ZGluZyB0aGUgZG90LCBvZiB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZS4KLQkgKiBJZiB0aGUgZmlsZSBuYW1lIGhhcyBubyBleHRlbnNpb24sIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCi0JICogRmlsZSNleHRlbnNpb24oKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuc2lvbihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgdGhlIGRvdCwgb2YgdGhlIHNwZWNpZmllZCBmaWxlJ3MgbmFtZS4KLQkgKiBJZiB0aGUgZmlsZSdzIG5hbWUgaGFzIG5vIGV4dGVuc2lvbiwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KLQkgKiBGaWxlI2V4dGVuc2lvbigpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5zaW9uKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZXh0ZW5zaW9uKGZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVtcG9yYXJ5IGRpcmVjdG9yaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYW4gZW1wdHkgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGNsZWFyZWQgb3V0LgotCSAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIEphdmEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwKLQkgKiBhcyBpbmRpY2F0ZWQgYnkgdGhlIFN5c3RlbSBwcm9wZXJ0eSAiamF2YS5pby50bXBkaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBlbXB0eVRlbXBvcmFyeURpcmVjdG9yeShTdHJpbmcgbmFtZSkgewotCQlGaWxlIGRpciA9IG5ldyBGaWxlKHVzZXJUZW1wb3JhcnlEaXJlY3RvcnkoKSwgbmFtZSk7Ci0JCWlmIChkaXIuZXhpc3RzKCkpIHsKLQkJCWRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpcik7Ci0JCX0gZWxzZSB7Ci0JCQlkaXIubWtkaXJzKCk7Ci0JCX0KLQkJcmV0dXJuIGRpcjsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhbiBlbXB0eSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggYQotCSAqIG5hbWUgb2YgInRtcGRpciIuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgY2xlYXJlZCBvdXQuCi0JICogVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LAotCSAqIGFzIGluZGljYXRlZCBieSB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGVtcHR5VGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZW1wdHlUZW1wb3JhcnlEaXJlY3RvcnkoREVGQVVMVF9URU1QT1JBUllfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGxlZnQgdW5jaGFuZ2VkOwotCSAqIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4KLQkgKiBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksCi0JICogYXMgaW5kaWNhdGVkIGJ5IHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgdGVtcG9yYXJ5RGlyZWN0b3J5KFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUodXNlclRlbXBvcmFyeURpcmVjdG9yeSgpLCBuYW1lKTsKLQkJaWYgKCAhIGRpci5leGlzdHMoKSkgewotCQkJZGlyLm1rZGlycygpOwotCQl9Ci0JCXJldHVybiBkaXI7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggYSBuYW1lIG9mCi0JICogInRtcGRpciIuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgbGVmdCB1bmNoYW5nZWQ7Ci0JICogaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLgotCSAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIEphdmEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwKLQkgKiBhcyBpbmRpY2F0ZWQgYnkgdGhlIFN5c3RlbSBwcm9wZXJ0eSAiamF2YS5pby50bXBkaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSB0ZW1wb3JhcnlEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiB0ZW1wb3JhcnlEaXJlY3RvcnkoREVGQVVMVF9URU1QT1JBUllfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgKm5ldyogdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBwcmVmaXguIFRoZSBwcmVmaXggd2lsbCBiZSBhcHBlbmRlZCB3aXRoIGEgbnVtYmVyIHRoYXQKLQkgKiBpcyBpbmNyZW1lbnRlZCwgc3RhcnRpbmcgd2l0aCAxLCB1bnRpbCBhIG5vbi1wcmUtZXhpc3RpbmcgZGlyZWN0b3J5Ci0JICogaXMgZm91bmQgYW5kIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGEKLQkgKiBzdWJkaXJlY3Rvcnkgb2YgdGhlIEphdmEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYXMgaW5kaWNhdGVkIGJ5Ci0JICogdGhlIFN5c3RlbSBwcm9wZXJ0eSAiamF2YS5pby50bXBkaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBuZXdUZW1wb3JhcnlEaXJlY3RvcnkoU3RyaW5nIHByZWZpeCkgewotCQlpZiAoICEgcHJlZml4LmVuZHNXaXRoKCIuIikpIHsKLQkJCXByZWZpeCA9IHByZWZpeCArICIuIjsKLQkJfQotCQlGaWxlIGRpcjsKLQkJaW50IGkgPSAwOwotCQlkbyB7Ci0JCQlpKys7Ci0JCQlkaXIgPSBuZXcgRmlsZSh1c2VyVGVtcG9yYXJ5RGlyZWN0b3J5KCksIHByZWZpeCArIGkpOwotCQl9IHdoaWxlICggISBkaXIubWtkaXJzKCkpOwotCQlyZXR1cm4gZGlyOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgKm5ldyogdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIGEKLQkgKiBwcmVmaXggb2YgInRtcGRpciIuIFRoaXMgcHJlZml4IHdpbGwgYmUgYXBwZW5kZWQgd2l0aCBhIG51bWJlciB0aGF0Ci0JICogaXMgaW5jcmVtZW50ZWQsIHN0YXJ0aW5nIHdpdGggMSwgdW50aWwgYSBub24tcHJlLWV4aXN0aW5nIGRpcmVjdG9yeQotCSAqIGlzIGZvdW5kIGFuZCBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhCi0JICogc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFzIGluZGljYXRlZCBieQotCSAqIHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgbmV3VGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3VGVtcG9yYXJ5RGlyZWN0b3J5KERFRkFVTFRfVEVNUE9SQVJZX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgotCSAqIFRoZSByZXNvdXJjZSBuYW1lIG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLCBpLmUuIGl0IGNhbm5vdCBiZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBwYWNrYWdlIG5hbWUvZGlyZWN0b3J5LgotCSAqIE5COiBUaGVyZSBpcyBhIGJ1ZyBpbiBqZGsxLjQueCB0aGUgcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nCi0JICogYSByZXNvdXJjZSB0aGF0IGhhcyBzcGFjZXMgKG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycykgaW4KLQkgKiBpdHMgbmFtZS4uLi4gKHNlZSBTdW4ncyBKYXZhIGJ1ZyA0NDY2NDg1KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSByZXNvdXJjZUZpbGUoU3RyaW5nIHJlc291cmNlTmFtZSkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCWlmICggISByZXNvdXJjZU5hbWUuc3RhcnRzV2l0aCgiLyIpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHJlc291cmNlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIEZpbGVUb29scy5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgotCSAqIE5COiBUaGVyZSBpcyBhIGJ1ZyBpbiBqZGsxLjQueCB0aGUgcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nCi0JICogYSByZXNvdXJjZSB0aGF0IGhhcyBzcGFjZXMgKG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycykgaW4KLQkgKiBpdHMgbmFtZS4uLi4gKHNlZSBTdW4ncyBKYXZhIGJ1ZyA0NDY2NDg1KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSByZXNvdXJjZUZpbGUoU3RyaW5nIHJlc291cmNlTmFtZSwgQ2xhc3M8Pz4gamF2YUNsYXNzKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IGphdmFDbGFzcy5nZXRSZXNvdXJjZShyZXNvdXJjZU5hbWUpOwotCQlyZXR1cm4gYnVpbGRGaWxlKHVybCk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIFVSTC4KLQkgKiBOQjogVGhlcmUgaXMgYSBidWcgaW4gamRrMS40LnggdGhlIHByZXZlbnRzIHVzIGZyb20gZ2V0dGluZwotCSAqIGEgcmVzb3VyY2UgdGhhdCBoYXMgc3BhY2VzIChvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMpIGluCi0JICogaXRzIG5hbWUuLi4uIChzZWUgU3VuJ3MgSmF2YSBidWcgNDQ2NjQ4NSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgYnVpbGRGaWxlKFVSTCB1cmwpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlyZXR1cm4gYnVpbGRGaWxlKHVybC5nZXRGaWxlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUuCi0JICogTkI6IFRoZXJlIGlzIGEgYnVnIGluIGpkazEuNC54IHRoZSBwcmV2ZW50cyB1cyBmcm9tIGdldHRpbmcKLQkgKiBhIHJlc291cmNlIHRoYXQgaGFzIHNwYWNlcyAob3Igb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzKSBpbgotCSAqIGl0cyBuYW1lLi4uLiAoc2VlIFN1bidzIEphdmEgYnVnIDQ0NjY0ODUpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGJ1aWxkRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlVUkkgdXJpID0gbmV3IFVSSShmaWxlTmFtZSk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVyaS5nZXRQYXRoKCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqICJjYW5vbmljYWwiIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlIGludG8gYSAiY2Fub25pY2FsIiBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjYW5vbmljYWxGaWxlKEZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2V4Y2VwdGlvbikgewotCQkJLy8gc2V0dGxlIGZvciB0aGUgYWJzb2x1dGUgZmlsZQotCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVGaWxlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW4gaXRlcmF0b3IgdGhhdCB3aWxsIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlcwotCSAqIGludG8gImNhbm9uaWNhbCIgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBjYW5vbmljYWxGaWxlcyhJdGVyYXRvcjxGaWxlPiBmaWxlcykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RmlsZSwgRmlsZT4oZmlsZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEZpbGUgdHJhbnNmb3JtKEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBjYW5vbmljYWxGaWxlKG5leHQpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgY29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGVzCi0JICogaW50byAiY2Fub25pY2FsIiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGNhbm9uaWNhbEZpbGVzKENvbGxlY3Rpb248RmlsZT4gZmlsZXMpIHsKLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGVzKGZpbGVzLml0ZXJhdG9yKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIGludG8gYSAiY2Fub25pY2FsIiBmaWxlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fub25pY2FsRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlKG5ldyBGaWxlKGZpbGVOYW1lKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lcwotCSAqIGludG8gImNhbm9uaWNhbCIgZmlsZSBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gY2Fub25pY2FsRmlsZU5hbWVzKEl0ZXJhdG9yPFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4oZmlsZU5hbWVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIGNhbm9uaWNhbEZpbGVOYW1lKG5leHQpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgY29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZXMKLQkgKiBpbnRvICJjYW5vbmljYWwiIGZpbGUgbmFtZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IGNhbm9uaWNhbEZpbGVOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlTmFtZXMoZmlsZU5hbWVzLml0ZXJhdG9yKCkpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogZmlsZSBuYW1lIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgaW52YWxpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZU5hbWVJc0ludmFsaWQoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCXJldHVybiAhIGZpbGVOYW1lSXNWYWxpZChmaWxlbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgdmFsaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVOYW1lSXNWYWxpZChTdHJpbmcgZmlsZW5hbWUpIHsKLQkJaW50IGxlbiA9IGZpbGVuYW1lLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGZpbGVuYW1lQ2hhciA9IGZpbGVuYW1lLmNoYXJBdChpKTsKLQkJCWlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTLCBmaWxlbmFtZUNoYXIpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGlsbGVnYWwgY2hhcmFjdGVycyBpbiB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSB0bwotCSAqIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9WYWxpZEZpbGVOYW1lKFN0cmluZyBmaWxlbmFtZSwgY2hhciByZXBsYWNlbWVudENoYXIpIHsKLQkJaW50IGxlbiA9IGZpbGVuYW1lLmxlbmd0aCgpOwotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBmaWxlbmFtZUNoYXIgPSBmaWxlbmFtZS5jaGFyQXQoaSk7Ci0JCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKElOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUywgZmlsZW5hbWVDaGFyKSkgewotCQkJCXNiLmFwcGVuZChyZXBsYWNlbWVudENoYXIpOwotCQkJfSBlbHNlIHsKLQkJCQlzYi5hcHBlbmQoZmlsZW5hbWVDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBpbGxlZ2FsIGNoYXJhY3RlcnMgaW4gdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgdG8KLQkgKiBwZXJpb2RzICgnLicpIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9WYWxpZEZpbGVOYW1lKFN0cmluZyBmaWxlbmFtZSkgewotCQlyZXR1cm4gY29udmVydFRvVmFsaWRGaWxlTmFtZShmaWxlbmFtZSwgJy4nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSBpcyAicmVzZXJ2ZWQiCi0JICogKGkuZS4gaXQgY2Fubm90IGJlIHVzZWQgZm9yICJ1c2VyIiBmaWxlcykuIFdpbmRvd3MgcmVzZXJ2ZXMKLQkgKiBhIG51bWJlciBvZiBmaWxlIG5hbWVzIChlLmcuIENPTiwgQVVYLCBQUk4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaWxlTmFtZUlzUmVzZXJ2ZWQoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmIChleGVjdXRpbmdPbldpbmRvd3MoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhXSU5ET1dTX1JFU0VSVkVEX0ZJTEVfTkFNRVMsIGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsJLy8gVW5peCBkb2VzIG5vdCBoYXZlIGFueSAicmVzZXJ2ZWQiIGZpbGUgbmFtZXMgKEkgdGhpbmsuLi4pCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIGNvbnRhaW5zIGFueSAicmVzZXJ2ZWQiCi0JICogY29tcG9uZW50cy4KLQkgKiBXaW5kb3dzIHJlc2VydmVzIGEgbnVtYmVyIG9mIGZpbGUgbmFtZXMgKGUuZy4gQ09OLCBBVVgsIFBSTik7Ci0JICogYW5kIHRoZXNlIGZpbGUgbmFtZXMgY2Fubm90IGJlIHVzZWQgZm9yIGVpdGhlciB0aGUgbmFtZXMgb2YKLQkgKiBmaWxlcyBvciBkaXJlY3Rvcmllcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhGaWxlIGZpbGUpIHsKLQkJRmlsZSB0ZW1wID0gZmlsZTsKLQkJd2hpbGUgKHRlbXAgIT0gbnVsbCkgewotCQkJaWYgKGZpbGVOYW1lSXNSZXNlcnZlZCh0ZW1wLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudEZpbGUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNob3J0ZW5lZCBmaWxlIG5hbWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIHNob3J0ZXIgdmVyc2lvbiBvZiB0aGUgYWJzb2x1dGUgZmlsZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogVGhlIHNob3J0ZXIgdmVyc2lvbiB3aWxsIG5vdCBiZSBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGguCi0JICogVGhlIGZpcnN0IGRpcmVjdG9yeSAodXN1YWxseSB0aGUgZHJpdmUgbGV0dGVyKSBhbmQgdGhlIGZpbGUgbmFtZSBvciB0aGUKLQkgKiBsYXN0IGRpcmVjdG9yeSB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIHN0cmluZyByZWdhcmRsZXNzIG9mCi0JICogdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnRlbkZpbGVOYW1lKFVSTCB1cmwpIHsKLQkJcmV0dXJuIHNob3J0ZW5GaWxlTmFtZSh1cmwsIE1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNob3J0ZXIgdmVyc2lvbiBvZiB0aGUgYWJzb2x1dGUgZmlsZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogVGhlIHNob3J0ZXIgdmVyc2lvbiB3aWxsIG5vdCBiZSBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGguCi0JICogVGhlIGZpcnN0IGRpcmVjdG9yeSAodXN1YWxseSB0aGUgZHJpdmUgbGV0dGVyKSBhbmQgdGhlIGZpbGUgbmFtZSBvciB0aGUKLQkgKiBsYXN0IGRpcmVjdG9yeSB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIHN0cmluZyByZWdhcmRsZXNzIG9mCi0JICogdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnRlbkZpbGVOYW1lKFVSTCB1cmwsIGludCBtYXhMZW5ndGgpIHsKLQkJRmlsZSBmaWxlOwotCQl0cnkgewotCQkJZmlsZSA9IGJ1aWxkRmlsZSh1cmwpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQkJZmlsZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOwotCQl9Ci0JCXJldHVybiBzaG9ydGVuRmlsZU5hbWUoZmlsZSwgbWF4TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzaG9ydGVyIHZlcnNpb24gb2YgdGhlIGFic29sdXRlIGZpbGUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIFRoZSBzaG9ydGVyIHZlcnNpb24gd2lsbCBub3QgYmUgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gbGVuZ3RoLgotCSAqIFRoZSBmaXJzdCBkaXJlY3RvcnkgKHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcikgYW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlCi0JICogbGFzdCBkaXJlY3Rvcnkgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBzdHJpbmcgcmVnYXJkbGVzcyBvZgotCSAqIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0ZW5GaWxlTmFtZShGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIHNob3J0ZW5GaWxlTmFtZShmaWxlLCBNQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzaG9ydGVyIHZlcnNpb24gb2YgdGhlIGFic29sdXRlIGZpbGUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIFRoZSBzaG9ydGVyIHZlcnNpb24gd2lsbCBub3QgYmUgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gbGVuZ3RoLgotCSAqIFRoZSBmaXJzdCBkaXJlY3RvcnkgKHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcikgYW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlCi0JICogbGFzdCBkaXJlY3Rvcnkgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBzdHJpbmcgcmVnYXJkbGVzcyBvZgotCSAqIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0ZW5GaWxlTmFtZShGaWxlIGZpbGUsIGludCBtYXhMZW5ndGgpIHsKLQkJU3RyaW5nIGFic29sdXRlRmlsZU5hbWUgPSBjYW5vbmljYWxGaWxlKGZpbGUpLmdldEFic29sdXRlUGF0aCgpOwotCQlpZiAoYWJzb2x1dGVGaWxlTmFtZS5sZW5ndGgoKSA8PSBtYXhMZW5ndGgpIHsKLQkJCS8vIG5vIG5lZWQgdG8gc2hvcnRlbgotCQkJcmV0dXJuIGFic29sdXRlRmlsZU5hbWU7Ci0JCX0KLQotCQkvLyBicmVhayBkb3duIHRoZSBwYXRoIGludG8gaXRzIGNvbXBvbmVudHMKLQkJU3RyaW5nIGZzID0gRmlsZS5zZXBhcmF0b3I7Ci0JCVN0cmluZ1tdIHBhdGhzID0gYWJzb2x1dGVGaWxlTmFtZS5zcGxpdCgiXFwiICsgZnMpOwotCi0JCWlmIChwYXRocy5sZW5ndGggPD0gMSkgewotCQkJLy8gZS5nLiAiQzpcIgotCQkJcmV0dXJuIHBhdGhzWzBdOwotCQl9Ci0KLQkJaWYgKHBhdGhzLmxlbmd0aCA9PSAyKSB7Ci0JCQkvLyBlLmcuICJDOlxNeVJlYWxseUxvbmdGaWxlTmFtZS5leHQiIG9yICJDOlxNeVJlYWxseUxvbmdEaXJlY3RvcnlOYW1lIgotCQkJLy8gcmV0dXJuIHRoZSBjb21wbGV0ZSBmaWxlIG5hbWUgc2luY2UgdGhpcyBpcyBhIG1pbmltdW0gcmVxdWlyZW1lbnQsCi0JCQkvLyByZWdhcmRsZXNzIG9mIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkCi0JCQlyZXR1cm4gYWJzb2x1dGVGaWxlTmFtZTsKLQkJfQotCi0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQocGF0aHNbMF0pOwkJLy8gYWx3YXlzIGFkZCB0aGUgZmlyc3QgZGlyZWN0b3J5LCB3aGljaCBpcyB1c3VhbGx5IHRoZSBkcml2ZSBsZXR0ZXIKLQotCQkvLyBLZWVwIHRoZSBpbmRleCBvZiBpbnNlcnRpb24gaW50byB0aGUgc3RyaW5nIGJ1ZmZlcgotCQlpbnQgaW5zZXJ0SW5kZXggPSBzYi5sZW5ndGgoKTsKLQotCQlzYi5hcHBlbmQoZnMpOwotCQlzYi5hcHBlbmQocGF0aHNbcGF0aHMubGVuZ3RoIC0gMV0pOwkJLy8gYXBwZW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlIGxhc3QgZGlyZWN0b3J5Ci0KLQkJbWF4TGVuZ3RoIC09IDQ7ICAgICAgICAgICAgICAgICAgICAgIC8vIC00IGZvciAiLy4uLiIKLQotCQlpbnQgY3VycmVudExlbmd0aCA9IHNiLmxlbmd0aCgpIC0gNDsgLy8gLTQgZm9yICIvLi4uIgotCQlpbnQgbGVmdEluZGV4ID0gMTsgICAgICAgICAgICAgICAgICAgLy8gIDEgdG8gc2tpcCB0aGUgcm9vdCBkaXJlY3RvcnkKLQkJaW50IHJpZ2h0SW5kZXggPSBwYXRocy5sZW5ndGggLSAyOyAgIC8vIC0xIGZvciB0aGUgZmlsZSBuYW1lIG9yIHRoZSBsYXN0IGRpcmVjdG9yeQotCi0JCWJvb2xlYW4gY2FuQWRkRnJvbUxlZnQgPSB0cnVlOwotCQlib29sZWFuIGNhbkFkZEZyb21SaWdodCA9IHRydWU7Ci0KLQkJLy8gQWRkIGVhY2ggZGlyZWN0b3J5LCB0aGUgaW5zZXJ0aW9uIGlzIGdvaW5nIGluIGJvdGggZGlyZWN0aW9uOiBsZWZ0IGFuZAotCQkvLyByaWdodCwgb25jZSBhIHNpZGUgY2FuJ3QgYmUgYWRkZWQsIHRoZSBvdGhlciBzaWRlIGlzIHN0aWxsIGNvbnRpbnVpbmcKLQkJLy8gdW50aWwgYm90aCBjYW4ndCBhZGQgYW55bW9yZQotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKCFjYW5BZGRGcm9tTGVmdCAmJiAhY2FuQWRkRnJvbVJpZ2h0KQotCQkJCWJyZWFrOwotCi0JCQlpZiAoY2FuQWRkRnJvbVJpZ2h0KSB7Ci0JCQkJU3RyaW5nIHJpZ2h0RGlyZWN0b3J5ID0gcGF0aHNbcmlnaHRJbmRleF07Ci0JCQkJaW50IHJpZ2h0TGVuZ3RoID0gcmlnaHREaXJlY3RvcnkubGVuZ3RoKCk7Ci0KLQkJCQkvLyBBZGQgdGhlIGRpcmVjdG9yeSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgbG9vcAotCQkJCWlmIChjdXJyZW50TGVuZ3RoICsgcmlnaHRMZW5ndGggKyAxIDw9IG1heExlbmd0aCkgewotCQkJCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXgsICAgICBmcyk7Ci0JCQkJCXNiLmluc2VydChpbnNlcnRJbmRleCArIDEsIHJpZ2h0RGlyZWN0b3J5KTsKLQotCQkJCQljdXJyZW50TGVuZ3RoICs9IHJpZ2h0TGVuZ3RoICsgMTsKLQkJCQkJcmlnaHRJbmRleC0tOwotCi0JCQkJCS8vIFRoZSByaWdodCBzaWRlIGlzIG5vdyBvdmVybGFwcGluZyB0aGUgbGVmdCBzaWRlLCB0aGF0IG1lYW5zCi0JCQkJCS8vIHdlIGNhbid0IGFkZCBmcm9tIHRoZSByaWdodCBzaWRlIGFueW1vcmUKLQkJCQkJaWYgKGxlZnRJbmRleCA+PSByaWdodEluZGV4KSB7Ci0JCQkJCQljYW5BZGRGcm9tUmlnaHQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWNhbkFkZEZyb21SaWdodCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNhbkFkZEZyb21MZWZ0KSB7Ci0JCQkJU3RyaW5nIGxlZnREaXJlY3RvcnkgPSBwYXRoc1tsZWZ0SW5kZXhdOwotCQkJCWludCBsZWZ0TGVuZ3RoID0gbGVmdERpcmVjdG9yeS5sZW5ndGgoKTsKLQotCQkJCS8vIEFkZCB0aGUgZGlyZWN0b3J5IG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGxvb3AKLQkJCQlpZiAoY3VycmVudExlbmd0aCArIGxlZnRMZW5ndGggKyAxIDw9IG1heExlbmd0aCkgewotCQkJCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXgsICAgICBmcyk7Ci0JCQkJCXNiLmluc2VydChpbnNlcnRJbmRleCArIDEsIGxlZnREaXJlY3RvcnkpOwotCi0JCQkJCWluc2VydEluZGV4ICs9IGxlZnRMZW5ndGggKyAxOwotCQkJCQljdXJyZW50TGVuZ3RoICs9IGxlZnRMZW5ndGggKyAxOwotCQkJCQlsZWZ0SW5kZXgrKzsKLQotCQkJCQkvLyBUaGUgbGVmdCBzaWRlIGlzIG5vdyBvdmVybGFwcGluZyB0aGUgcmlnaHQgc2lkZSwgdGhhdCBtZWFucwotCQkJCQkvLyB3ZSBjYW4ndCBhZGQgZnJvbSB0aGUgbGVmdCBzaWRlIGFueW1vcmUKLQkJCQkJaWYgKGxlZnRJbmRleCA+PSByaWdodEluZGV4KSB7Ci0JCQkJCQljYW5BZGRGcm9tTGVmdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2FuQWRkRnJvbUxlZnQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobGVmdEluZGV4IDw9IHJpZ2h0SW5kZXgpIHsKLQkJCXNiLmluc2VydChpbnNlcnRJbmRleCwgZnMpOwotCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4ICsgMSwgIi4uLiIpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5c3RlbSBwcm9wZXJ0aWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgcmVwcmVzZW50aW5nIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIHVzZXJIb21lRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEZpbGUoVVNFUl9IT01FX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSByZXByZXNlbnRpbmcgdGhlIHVzZXIncyB0ZW1wb3JhcnkgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSB1c2VyVGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEZpbGUoVVNFUl9URU1QT1JBUllfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY3VycmVudFdvcmtpbmdEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRmlsZShDVVJSRU5UX1dPUktJTkdfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGV4ZWN1dGluZ09uV2luZG93cygpIHsKLQkJcmV0dXJuIGV4ZWN1dGluZ09uKCJXaW5kb3dzIik7Ci0JfQotCi0vLwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGV4ZWN1dGluZ09uTGludXgoKSB7Ci0vLwkJcmV0dXJuIGV4ZWN1dGluZ09uKCJMaW51eCIpOwotLy8JfQotLy8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGV4ZWN1dGluZ09uKFN0cmluZyBvc05hbWUpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmluZGV4T2Yob3NOYW1lKSAhPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gb25seSB0aGUgZmlsZXMgdGhhdCBmaXQgdGhlIGZpbHRlci4KLQkgKiBGaWxlI2ZpbGVzKEZpbGVGaWx0ZXIgZmlsZUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGZpbHRlcihJdGVyYXRvcjxGaWxlPiBmaWxlcywgZmluYWwgRmlsZUZpbHRlciBmaWxlRmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RmlsZSwgRmlsZT4oZmlsZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBmaWxlRmlsdGVyLmFjY2VwdChuZXh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHRoYXQgaXMgYSByZS1zcGVjaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiAgICAgTGludXgvVW5peC9NYWM6Ci0JICogICAgICAgICBjb252ZXJ0VG9SZWxhdGl2ZUZpbGUoL2Zvby9iYXIvYmF6LmphdmEsIC9mb28pCi0JICogICAgICAgICAgICAgPT4gYmFyL2Jhei5qYXZhCi0JICogICAgIFdpbmRvd3M6Ci0JICogICAgICAgICBjb252ZXJ0VG9SZWxhdGl2ZUZpbGUoQzpcZm9vXGJhclxiYXouamF2YSwgQzpcZm9vKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqIFRoZSBmaWxlIGNhbiBiZSBlaXRoZXIgYSBmaWxlIG9yIGEgZGlyZWN0b3J5OyB0aGUgZGlyZWN0b3J5Ci0JICogKnNob3VsZCogYmUgYSBkaXJlY3RvcnkuCi0JICogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSByZWxhdGl2ZSBvciBpdCBjYW5ub3QgYmUgbWFkZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIAotCSAqIE5COiBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgb24gV2luZG93cyBhbmQgTGludXgsCi0JICogYnV0IG5vdCBNYWMgKGJ1dCB0aGUgTWFjIGlzIFVuaXgtYmFzZWQgdGhlc2UgZGF5cywgc28KLQkgKiBpdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgRmlsZSBkaXIpIHsKLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBhbHJlYWR5IHJlbGF0aXZlCi0JCWlmICggISBmaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJcmV0dXJuIGZpbGU7CQkvLyByZXR1cm4gdW5jaGFuZ2VkCi0JCX0KLQotCQlGaWxlIGNGaWxlID0gY2Fub25pY2FsRmlsZShmaWxlKTsKLQkJRmlsZSBjRGlyID0gY2Fub25pY2FsRmlsZShkaXIpOwotCi0JCS8vIHRoZSB0d28gYXJlIHRoZSBzYW1lIGRpcmVjdG9yeQotCQlpZiAoY0ZpbGUuZXF1YWxzKGNEaXIpKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbGUoIi4iKTsKLQkJfQotCi0JCUZpbGVbXSBmaWxlUGF0aEZpbGVzID0gcGF0aEZpbGVzKGNGaWxlKTsKLQkJRmlsZVtdIGRpclBhdGhGaWxlcyA9IHBhdGhGaWxlcyhjRGlyKTsKLQotCQkvLyBXaW5kb3dzIG9ubHkgKD8pOiB0aGUgcm9vdHMgYXJlIGRpZmZlcmVudCAtIGUuZy4gRDpcIHZzLiBDOlwKLQkJaWYgKCAhIGRpclBhdGhGaWxlc1swXS5lcXVhbHMoZmlsZVBhdGhGaWxlc1swXSkpIHsKLQkJCXJldHVybiBmaWxlOwkJLy8gcmV0dXJuIHVuY2hhbmdlZAotCQl9Ci0KLQkJLy8gYXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSByb290IGlzIHRoZSBzYW1lLCBub3cgZmluZCBob3cgbXVjaCBpcyBpbiBjb21tb24KLQkJaW50IGkgPSAwOwkJLy8gdGhpcyB3aWxsIHBvaW50IGF0IHRoZSBmaXJzdCBtaXNjb21wYXJlCi0JCXdoaWxlICgoaSA8IGRpclBhdGhGaWxlcy5sZW5ndGgpICYmIChpIDwgZmlsZVBhdGhGaWxlcy5sZW5ndGgpKSB7Ci0JCQlpZiAoZGlyUGF0aEZpbGVzW2ldLmVxdWFscyhmaWxlUGF0aEZpbGVzW2ldKSkgewotCQkJCWkrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gc2F2ZSBvdXIgY3VycmVudCBwb3NpdGlvbgotCQlpbnQgZmlyc3RNaXNtYXRjaCA9IGk7Ci0KLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBBQk9WRSB0aGUgZGlyZWN0b3J5OiAuLi8uLgotCQlpZiAoZmlyc3RNaXNtYXRjaCA9PSBmaWxlUGF0aEZpbGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIHJlbGF0aXZlUGFyZW50RmlsZShkaXJQYXRoRmlsZXMubGVuZ3RoIC0gZmlyc3RNaXNtYXRjaCk7Ci0JCX0KLQotCQkvLyBidWlsZCBhIG5ldyBmaWxlIGZyb20gdGhlIHBhdGggYmV5b25kIHRoZSBtYXRjaGluZyBwb3J0aW9ucwotCQlGaWxlIGRpZmYgPSBuZXcgRmlsZShmaWxlUGF0aEZpbGVzW2ldLmdldE5hbWUoKSk7Ci0JCXdoaWxlICgrK2kgPCBmaWxlUGF0aEZpbGVzLmxlbmd0aCkgewotCQkJZGlmZiA9IG5ldyBGaWxlKGRpZmYsIGZpbGVQYXRoRmlsZXNbaV0uZ2V0TmFtZSgpKTsKLQkJfQotCi0JCS8vIGNoZWNrIHdoZXRoZXIgdGhlIGZpbGUgaXMgQkVMT1cgdGhlIGRpcmVjdG9yeTogc3ViZGlyMS9zdWJkaXIyL2ZpbGUuZXh0Ci0JCWlmIChmaXJzdE1pc21hdGNoID09IGRpclBhdGhGaWxlcy5sZW5ndGgpIHsKLQkJCXJldHVybiBkaWZmOwotCQl9Ci0KLQkJLy8gdGhlIGZpbGUgbXVzdCBiZSBhIFBFRVIgb2YgdGhlIGRpcmVjdG9yeTogLi4vLi4vc3ViZGlyMS9zdWJkaXIyL2ZpbGUuZXh0Ci0JCXJldHVybiBuZXcgRmlsZShyZWxhdGl2ZVBhcmVudEZpbGUoZGlyUGF0aEZpbGVzLmxlbmd0aCAtIGZpcnN0TWlzbWF0Y2gpLCBkaWZmLmdldFBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSB0aGF0IGlzIGEgcmUtc3BlY2lmaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCi0JICogZmlsZSwgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi0JICogICAgIExpbnV4L1VuaXgvTWFjIChDV0QgPSAvZm9vKToKLQkgKiAgICAgICAgIGNvbnZlcnRUb1JlbGF0aXZlRmlsZSgvZm9vL2Jhci9iYXouamF2YSkKLQkgKiAgICAgICAgICAgICA9PiBiYXIvYmF6LmphdmEKLQkgKiAgICAgV2luZG93cyAoQ1dEID0gQzpcZm9vKToKLQkgKiAgICAgICAgIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShDOlxmb29cYmFyXGJhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqIFRoZSBmaWxlIGNhbiBiZSBlaXRoZXIgYSBmaWxlIG9yIGEgZGlyZWN0b3J5LgotCSAqIElmIHRoZSBmaWxlIGlzIGFscmVhZHkgcmVsYXRpdmUgb3IgaXQgY2Fubm90IGJlIG1hZGUgcmVsYXRpdmUKLQkgKiB0byB0aGUgZGlyZWN0b3J5LCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiAKLQkgKiBOQjogVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4LAotCSAqIGJ1dCBub3QgTWFjIChidXQgdGhlIE1hYyBpcyBVbml4LWJhc2VkIHRoZXNlIGRheXMsIHNvCi0JICogaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLikuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBjdXJyZW50V29ya2luZ0RpcmVjdG9yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZmlsZXMgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLiBGb3IgZXhhbXBsZToKLQkgKiAgICAgQzovZm9vL2Jhci9iYXoudHh0ID0+Ci0JICogICAgIHsgQzovLCBDOi9mb28sIEM6L2Zvby9iYXIsIEM6L2Zvby9iYXIvYmF6LnR4dCB9Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVtdIHBhdGhGaWxlcyhGaWxlIGZpbGUpIHsKLQkJTGlzdDxGaWxlPiBwYXRoID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotCQlmb3IgKEZpbGUgZiA9IGZpbGU7IGYgIT0gbnVsbDsgZiA9IGYuZ2V0UGFyZW50RmlsZSgpKSB7Ci0JCQlwYXRoLmFkZChmKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHBhdGgpOwotCQlyZXR1cm4gcGF0aC50b0FycmF5KG5ldyBGaWxlW3BhdGguc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgKG5vbi16ZXJvKSBudW1iZXIgb2YgcmVsYXRpdmUKLQkgKiBmaWxlIG5hbWVzLCBlLmcuIHh4eCgzKSA9PiAuLi8uLi8uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEZpbGUgcmVsYXRpdmVQYXJlbnRGaWxlKGludCBsZW4pIHsKLQkJaWYgKGxlbiA8PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybzogIiArIGxlbik7Ci0JCX0KLQkJRmlsZSByZXN1bHQgPSBuZXcgRmlsZSgiLi4iKTsKLQkJZm9yIChpbnQgaSA9IGxlbiAtIDE7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0ID0gbmV3IEZpbGUocmVzdWx0LCAiLi4iKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgdGhhdCBpcyBhIHJlLXNwZWNpZmljYXRpb24gb2YgdGhlIHNwZWNpZmllZAotCSAqIGZpbGUsIGFic29sdXRlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqICAgICBMaW51eC9Vbml4L01hYzoKLQkgKiAgICAgICAgIGNvbnZlcnRUb0Fic29sdXRlRmlsZShiYXIvYmF6LmphdmEsIC9mb28pCi0JICogICAgICAgICAgICAgPT4gL2Zvby9iYXIvYmF6LmphdmEKLQkgKiAgICAgV2luZG93czoKLQkgKiAgICAgICAgIGNvbnZlcnRUb0Fic29sdXRlRmlsZShiYXIvYmF6LmphdmEsIEM6XGZvbykKLQkgKiAgICAgICAgICAgICA9PiBDOlxmb29cYmFyXGJhei5qYXZhCi0JICogVGhlIGZpbGUgY2FuIGJlIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3Rvcnk7IHRoZSBkaXJlY3RvcnkKLQkgKiAqc2hvdWxkKiBiZSBhIGRpcmVjdG9yeS4KLQkgKiBJZiB0aGUgZmlsZSBpcyBhbHJlYWR5IGFic29sdXRlLCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiAKLQkgKiBOQjogVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4LAotCSAqIGJ1dCBub3QgTWFjIChidXQgdGhlIE1hYyBpcyBVbml4LWJhc2VkIHRoZXNlIGRheXMsIHNvCi0JICogaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLikuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0Fic29sdXRlRmlsZShmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIEZpbGUgZGlyKSB7Ci0JCS8vIGNoZWNrIHdoZXRoZXIgdGhlIGZpbGUgaXMgYWxyZWFkeSBhYnNvbHV0ZQotCQlpZiAoZmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCXJldHVybiBmaWxlOwkJLy8gcmV0dXJuIHVuY2hhbmdlZAotCQl9Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlKG5ldyBGaWxlKGRpciwgZmlsZS5nZXRQYXRoKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHRoYXQgaXMgYSByZS1zcGVjaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLCBhYnNvbHV0ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLQkgKiAgICAgTGludXgvVW5peC9NYWMgKENXRCA9IC9mb28pOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSkKLQkgKiAgICAgICAgICAgICA9PiAvZm9vL2Jhci9iYXouamF2YQotCSAqICAgICBXaW5kb3dzIChDV0QgPSBDOlxmb28pOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSkKLQkgKiAgICAgICAgICAgICA9PiBDOlxmb29cYmFyXGJhei5qYXZhCi0JICogVGhlIGZpbGUgY2FuIGJlIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuCi0JICogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSBhYnNvbHV0ZSwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogCi0JICogTkI6IFRoaXMgbWV0aG9kIGhhcyBiZWVuIHRlc3RlZCBvbiBXaW5kb3dzIGFuZCBMaW51eCwKLQkgKiBidXQgbm90IE1hYyAoYnV0IHRoZSBNYWMgaXMgVW5peC1iYXNlZCB0aGVzZSBkYXlzLCBzbwotCSAqIGl0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0uLi4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmluYWwgRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgY3VycmVudFdvcmtpbmdEaXJlY3RvcnkoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBGaWxlVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0hhc2hCYWcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9IYXNoQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMDcwOTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0hhc2hCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSA8Y29kZT5CYWc8L2NvZGU+IGludGVyZmFjZSwgYmFja2VkIGJ5IGEKLSAqIGhhc2ggdGFibGUuIEl0IG1ha2VzIG5vIGd1YXJhbnRlZXMgYXMgdG8gdGhlIGl0ZXJhdGlvbiBvcmRlciBvZgotICogdGhlIGJhZydzIGVsZW1lbnRzOyBpbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUgb3JkZXIKLSAqIHdpbGwgcmVtYWluIGNvbnN0YW50IG92ZXIgdGltZS4gVGhpcyBjbGFzcyBwZXJtaXRzIHRoZSA8Y29kZT5udWxsPC9jb2RlPgotICogZWxlbWVudC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBvZmZlcnMgY29uc3RhbnQgdGltZSBwZXJmb3JtYW5jZSBmb3IgdGhlIGJhc2ljIG9wZXJhdGlvbnMKLSAqICg8Y29kZT5hZGQ8L2NvZGU+LCA8Y29kZT5yZW1vdmU8L2NvZGU+LCA8Y29kZT5jb250YWluczwvY29kZT4gYW5kCi0gKiA8Y29kZT5zaXplPC9jb2RlPiksIGFzc3VtaW5nIHRoZSBoYXNoIGZ1bmN0aW9uIGRpc3BlcnNlcyB0aGUgZWxlbWVudHMKLSAqIHByb3Blcmx5IGFtb25nIHRoZSBidWNrZXRzLiBJdGVyYXRpbmcgb3ZlciB0aGlzIGJhZyByZXF1aXJlcyB0aW1lCi0gKiBwcm9wb3J0aW9uYWwgdG8gdGhlIHN1bSBvZiB0aGUgYmFnJ3Mgc2l6ZSAodGhlIG51bWJlciBvZiBlbGVtZW50cykgcGx1cyB0aGUKLSAqICJjYXBhY2l0eSIgb2YgdGhlIGJhY2tpbmcgaGFzaCB0YWJsZSAodGhlIG51bWJlciBvZiBidWNrZXRzKS4gVGh1cywgaXQgaXMKLSAqIGltcG9ydGFudCBub3QgdG8gc2V0IHRoZSBpbml0aWFsIGNhcGFjaXR5IHRvbyBoaWdoIChvciB0aGUgbG9hZCBmYWN0b3IgdG9vCi0gKiBsb3cpIGlmIGl0ZXJhdGlvbiBwZXJmb3JtYW5jZSBpcyBpbXBvcnRhbnQuCi0gKiA8cD4KLSAqIDxiPk5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzeW5jaHJvbml6ZWQuPC9iPiBJZiBtdWx0aXBsZQotICogdGhyZWFkcyBhY2Nlc3MgYSBiYWcgY29uY3VycmVudGx5LCBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZSB0aHJlYWRzIG1vZGlmaWVzCi0gKiB0aGUgYmFnLCBpdCA8aT5tdXN0PC9pPiBiZSBzeW5jaHJvbml6ZWQgZXh0ZXJuYWxseS4gVGhpcyBpcyB0eXBpY2FsbHkKLSAqIGFjY29tcGxpc2hlZCBieSBzeW5jaHJvbml6aW5nIG9uIHNvbWUgb2JqZWN0IHRoYXQgbmF0dXJhbGx5IGVuY2Fwc3VsYXRlcwotICogdGhlIGJhZy4gSWYgbm8gc3VjaCBvYmplY3QgZXhpc3RzLCB0aGUgYmFnIHNob3VsZCBiZSAid3JhcHBlZCIgdXNpbmcgdGhlCi0gKiA8Y29kZT5Db2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRDb2xsZWN0aW9uPC9jb2RlPiBtZXRob2QuIFRoaXMgaXMKLSAqIGJlc3QgZG9uZSBhdCBjcmVhdGlvbiB0aW1lLCB0byBwcmV2ZW50IGFjY2lkZW50YWwgdW5zeW5jaHJvbml6ZWQgYWNjZXNzCi0gKiB0byB0aGUgYmFnOgotICogPHByZT4KLSAqIENvbGxlY3Rpb24gYyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb24obmV3IEhhc2hCYWcoLi4uKSk7Ci0gKiA8L3ByZT4KLSAqIDxwPgotICogVGhlIGl0ZXJhdG9ycyByZXR1cm5lZCBieSB0aGlzIGNsYXNzJ3MgPGNvZGU+aXRlcmF0b3I8L2NvZGU+IG1ldGhvZCBhcmUKLSAqIDxpPmZhaWwtZmFzdDwvaT46IGlmIHRoZSBiYWcgaXMgbW9kaWZpZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGl0ZXJhdG9yIGlzCi0gKiBjcmVhdGVkLCBpbiBhbnkgd2F5IGV4Y2VwdCB0aHJvdWdoIHRoZSBpdGVyYXRvcidzIG93biA8Y29kZT5yZW1vdmU8L2NvZGU+Ci0gKiBtZXRob2QsIHRoZSBpdGVyYXRvciB0aHJvd3MgYSA8Y29kZT5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uPC9jb2RlPi4KLSAqIFRodXMsIGluIHRoZSBmYWNlIG9mIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLCB0aGUgaXRlcmF0b3IgZmFpbHMgcXVpY2tseQotICogYW5kIGNsZWFubHksIHJhdGhlciB0aGFuIHJpc2tpbmcgYXJiaXRyYXJ5LCBub24tZGV0ZXJtaW5pc3RpYyBiZWhhdmlvciBhdAotICogYW4gdW5kZXRlcm1pbmVkIHRpbWUgaW4gdGhlIGZ1dHVyZS4KLSAqIAotICogQHNlZQlDb2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRDb2xsZWN0aW9uKENvbGxlY3Rpb24pCi0gKi8KLQotcHVibGljIGNsYXNzIEhhc2hCYWc8RT4gZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb248RT4KLQkJCWltcGxlbWVudHMgQmFnPEU+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZSB7Ci0KLQkvKiogVGhlIGhhc2ggdGFibGUuICovCi0JdHJhbnNpZW50IEVudHJ5PEU+W10gdGFibGU7Ci0KLQkvKiogVGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBiYWcuICovCi0JdHJhbnNpZW50IGludCBjb3VudCA9IDA7Ci0KLQkvKiogVGhlIG51bWJlciBvZiB1bmlxdWUgZW50cmllcyBpbiB0aGUgYmFnLiAqLwotCXRyYW5zaWVudCBpbnQgdW5pcXVlQ291bnQgPSAwOwotCi0JLyoqCi0JICogVGhlIGhhc2ggdGFibGUgaXMgcmVoYXNoZWQgd2hlbiBpdHMgc2l6ZSBleGNlZWRzIHRoaXMgdGhyZXNob2xkLiAoVGhlCi0JICogdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyAoaW50KShjYXBhY2l0eSAqIGxvYWRGYWN0b3IpLikKLQkgKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIGludCB0aHJlc2hvbGQ7Ci0KLQkvKioKLQkgKiBUaGUgbG9hZCBmYWN0b3IgZm9yIHRoZSBoYXNoIHRhYmxlLgotCSAqCi0JICogQHNlcmlhbAotCSAqLwotCXByaXZhdGUgZmxvYXQgbG9hZEZhY3RvcjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBiYWcgaGFzIGJlZW4gc3RydWN0dXJhbGx5IG1vZGlmaWVkLgotCSAqIFN0cnVjdHVyYWwgbW9kaWZpY2F0aW9ucyBhcmUgdGhvc2UgdGhhdCBjaGFuZ2UgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluCi0JICogdGhlIGJhZyBvciBvdGhlcndpc2UgbW9kaWZ5IGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUgKGUuZy4gcmVoYXNoKS4KLQkgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gbWFrZSBpdGVyYXRvcnMgb24gdGhpcyBiYWcgZmFpbC1mYXN0LgotCSAqCi0JICogQHNlZSBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXRyYW5zaWVudCBpbnQgbW9kQ291bnQgPSAwOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgYmFnIHdpdGggdGhlCi0JICogZGVmYXVsdCBjYXBhY2l0eSwgd2hpY2ggaXMgMTEsIGFuZCBsb2FkIGZhY3Rvciwgd2hpY2ggaXMgMC43NS4KLQkgKi8KLQlwdWJsaWMgSGFzaEJhZygpIHsKLQkJdGhpcygxMSwgMC43NWYpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IGJhZyB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eQotCSAqIGFuZCBkZWZhdWx0IGxvYWQgZmFjdG9yLCB3aGljaCBpcyAwLjc1LgotCSAqCi0JICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgYmFja2luZyBtYXAuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcwotCSAqICAgICB0aGFuIHplcm8uCi0JICovCi0JcHVibGljIEhhc2hCYWcoaW50IGluaXRpYWxDYXBhY2l0eSkgewotCQl0aGlzKGluaXRpYWxDYXBhY2l0eSwgMC43NWYpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IGJhZyB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5IGFuZCB0aGUgc3BlY2lmaWVkIGxvYWQgZmFjdG9yLgotCSAqCi0JICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgYmFja2luZyBtYXAuCi0JICogQHBhcmFtIGxvYWRGYWN0b3IgdGhlIGxvYWQgZmFjdG9yIG9mIHRoZSBiYWNraW5nIG1hcC4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBpcyBsZXNzCi0JICogICAgIHRoYW4gemVybywgb3IgaWYgdGhlIGxvYWQgZmFjdG9yIGlzIG5vbnBvc2l0aXZlLgotCSAqLwotCXB1YmxpYyBIYXNoQmFnKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKLQkJaWYgKGluaXRpYWxDYXBhY2l0eSA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgSW5pdGlhbCBDYXBhY2l0eTogIiArIGluaXRpYWxDYXBhY2l0eSk7Ci0JCX0KLQkJaWYgKGxvYWRGYWN0b3IgPD0gMCB8fCBGbG9hdC5pc05hTihsb2FkRmFjdG9yKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBMb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3IpOwotCQl9Ci0JCWlmIChpbml0aWFsQ2FwYWNpdHkgPT0gMCkgewotCQkJaW5pdGlhbENhcGFjaXR5ID0gMTsKLQkJfQotCQl0aGlzLmxvYWRGYWN0b3IgPSBsb2FkRmFjdG9yOwotCQl0aGlzLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKGluaXRpYWxDYXBhY2l0eSk7Ci0JCXRoaXMudGhyZXNob2xkID0gKGludCkgKGluaXRpYWxDYXBhY2l0eSAqIGxvYWRGYWN0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgYmFnIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBjb2xsZWN0aW9uLiBUaGUgY2FwYWNpdHkgb2YgdGhlIGJhZyBpcwotCSAqIHR3aWNlIHRoZSBzaXplIG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvciAxMSAod2hpY2hldmVyIGlzCi0JICogZ3JlYXRlciksIGFuZCB0aGUgZGVmYXVsdCBsb2FkIGZhY3Rvciwgd2hpY2ggaXMgMC43NSwgaXMgdXNlZC4KLQkgKgotCSAqIEBwYXJhbSBjIHRoZSBjb2xsZWN0aW9uIHdob3NlIGVsZW1lbnRzIGFyZSB0byBiZSBwbGFjZWQgaW50byB0aGlzIGJhZy4KLQkgKi8KLQlwdWJsaWMgSGFzaEJhZyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXRoaXMoTWF0aC5tYXgoMipjLnNpemUoKSwgMTEpKTsKLQkJdGhpcy5hZGRBbGwoYyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUgbWFpbnRhaW5lZCBjb3VudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvdW50OwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNvbXBhcmVzIHRoZSBtYWludGFpbmVkIGNvdW50IHRvIHplcm8uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuY291bnQgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLnRhYmxlOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbMF07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJCWlmIChlLm9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWludCBoYXNoID0gby5oYXNoQ29kZSgpOwotCQkJaW50IGluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiBvLmVxdWFscyhlLm9iamVjdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJZm9yIChFbnRyeTxFPiBlID0gdGFiWzBdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZS5vYmplY3QgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZS5jb3VudDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgaGFzaCA9IG8uaGFzaENvZGUoKTsKLQkJCWludCBpbmRleCA9IChoYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOwotCQkJZm9yIChFbnRyeTxFPiBlID0gdGFiW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKChlLmhhc2ggPT0gaGFzaCkgJiYgby5lcXVhbHMoZS5vYmplY3QpKSB7Ci0JCQkJCXJldHVybiBlLmNvdW50OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZWhhc2hlcyB0aGUgY29udGVudHMgb2YgdGhpcyBiYWcgaW50byBhIG5ldyBoYXNoIHRhYmxlCi0JICogd2l0aCBhIGxhcmdlciBjYXBhY2l0eS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlCi0JICogbnVtYmVyIG9mIGRpZmZlcmVudCBlbGVtZW50cyBpbiB0aGlzIG1hcCBleGNlZWRzIGl0cwotCSAqIGNhcGFjaXR5IGFuZCBsb2FkIGZhY3Rvci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVoYXNoKCkgewotCQlFbnRyeTxFPltdIG9sZE1hcCA9IHRoaXMudGFibGU7Ci0JCWludCBvbGRDYXBhY2l0eSA9IG9sZE1hcC5sZW5ndGg7Ci0KLQkJaW50IG5ld0NhcGFjaXR5ID0gb2xkQ2FwYWNpdHkgKiAyICsgMTsKLQkJRW50cnk8RT5bXSBuZXdUYWJsZSA9IHRoaXMuYnVpbGRUYWJsZShuZXdDYXBhY2l0eSk7Ci0KLQkJdGhpcy5tb2RDb3VudCsrOwotCQl0aGlzLnRocmVzaG9sZCA9IChpbnQpIChuZXdDYXBhY2l0eSAqIHRoaXMubG9hZEZhY3Rvcik7Ci0JCXRoaXMudGFibGUgPSBuZXdUYWJsZTsKLQotCQlmb3IgKGludCBpID0gb2xkQ2FwYWNpdHk7IGktLSA+IDA7ICkgewotCQkJZm9yIChFbnRyeTxFPiBvbGQgPSBvbGRNYXBbaV07IG9sZCAhPSBudWxsOyApIHsKLQkJCQlFbnRyeTxFPiBlID0gb2xkOwotCQkJCW9sZCA9IG9sZC5uZXh0OwotCi0JCQkJaW50IGluZGV4ID0gKGUuaGFzaCAmIDB4N0ZGRkZGRkYpICUgbmV3Q2FwYWNpdHk7Ci0JCQkJZS5uZXh0ID0gbmV3VGFibGVbaW5kZXhdOwotCQkJCW5ld1RhYmxlW2luZGV4XSA9IGU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEVudHJ5PEU+W10gYnVpbGRUYWJsZShpbnQgY2FwYWNpdHkpIHsKLQkJcmV0dXJuIG5ldyBFbnRyeVtjYXBhY2l0eV07Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSA8VD4gRW50cnk8RT4gYnVpbGRFbnRyeShpbnQgaGFzaCwgT2JqZWN0IG8sIEVudHJ5PFQ+IG5leHQpIHsKLQkJcmV0dXJuIG5ldyBFbnRyeShoYXNoLCBvLCBuZXh0KTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIDxUPiBFbnRyeTxFPiBidWlsZEVudHJ5KGludCBoYXNoLCBPYmplY3QgbywgaW50IGNudCwgRW50cnk8VD4gbmV4dCkgewotCQlyZXR1cm4gbmV3IEVudHJ5KGhhc2gsIG8sIGNudCwgbmV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJdGhpcy5tb2RDb3VudCsrOwotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCWludCBoYXNoID0gMDsKLQkJaW50IGluZGV4ID0gMDsKLQotCQkvLyBpZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkgaW4gdGhlIGJhZywgc2ltcGx5IGJ1bXAgaXRzIGNvdW50Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYlswXTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKGUub2JqZWN0ID09IG51bGwpIHsKLQkJCQkJZS5jb3VudCsrOwotCQkJCQl0aGlzLmNvdW50Kys7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWhhc2ggPSBvLmhhc2hDb2RlKCk7Ci0JCQlpbmRleCA9IChoYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOwotCQkJZm9yIChFbnRyeTxFPiBlID0gdGFiW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKChlLmhhc2ggPT0gaGFzaCkgJiYgby5lcXVhbHMoZS5vYmplY3QpKSB7Ci0JCQkJCWUuY291bnQrKzsKLQkJCQkJdGhpcy5jb3VudCsrOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyByZWhhc2ggdGhlIHRhYmxlIGlmIHRoZSB0aHJlc2hvbGQgaXMgZXhjZWVkZWQKLQkJaWYgKHRoaXMudW5pcXVlQ291bnQgPj0gdGhpcy50aHJlc2hvbGQpIHsKLQkJCXRoaXMucmVoYXNoKCk7Ci0JCQl0YWIgPSB0aGlzLnRhYmxlOwotCQkJaW5kZXggPSAoaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJfQotCi0JCS8vIGNyZWF0ZSB0aGUgbmV3IGVudHJ5IGFuZCBwdXQgaXQgaW4gdGhlIHRhYmxlCi0JCUVudHJ5PEU+IGUgPSB0aGlzLmJ1aWxkRW50cnkoaGFzaCwgbywgdGFiW2luZGV4XSk7Ci0JCXRhYltpbmRleF0gPSBlOwotCQl0aGlzLmNvdW50Kys7Ci0JCXRoaXMudW5pcXVlQ291bnQrKzsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZChFIG8sIGludCBjbnQpIHsKLQkJaWYgKGNudCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdGhpcy5tb2RDb3VudCsrOwotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCWludCBoYXNoID0gMDsKLQkJaW50IGluZGV4ID0gMDsKLQotCQkvLyBpZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkgaW4gdGhlIGJhZywgc2ltcGx5IGJ1bXAgaXRzIGNvdW50Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYlswXTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKGUub2JqZWN0ID09IG51bGwpIHsKLQkJCQkJZS5jb3VudCArPSBjbnQ7Ci0JCQkJCXRoaXMuY291bnQgKz0gY250OwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQloYXNoID0gby5oYXNoQ29kZSgpOwotCQkJaW5kZXggPSAoaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYltpbmRleF07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmIG8uZXF1YWxzKGUub2JqZWN0KSkgewotCQkJCQllLmNvdW50ICs9IGNudDsKLQkJCQkJdGhpcy5jb3VudCArPSBjbnQ7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlaGFzaCB0aGUgdGFibGUgaWYgdGhlIHRocmVzaG9sZCBpcyBleGNlZWRlZAotCQlpZiAodGhpcy51bmlxdWVDb3VudCA+PSB0aGlzLnRocmVzaG9sZCkgewotCQkJdGhpcy5yZWhhc2goKTsKLQkJCXRhYiA9IHRoaXMudGFibGU7Ci0JCQlpbmRleCA9IChoYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOwotCQl9Ci0KLQkJLy8gY3JlYXRlIHRoZSBuZXcgZW50cnkgYW5kIHB1dCBpdCBpbiB0aGUgdGFibGUKLQkJRW50cnk8RT4gZSA9IHRoaXMuYnVpbGRFbnRyeShoYXNoLCBvLCBjbnQsIHRhYltpbmRleF0pOwotCQl0YWJbaW5kZXhdID0gZTsKLQkJdGhpcy5jb3VudCArPSBjbnQ7Ci0JCXRoaXMudW5pcXVlQ291bnQrKzsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYlswXSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZS5vYmplY3QgPT0gbnVsbCkgewotCQkJCQl0aGlzLm1vZENvdW50Kys7Ci0JCQkJCWUuY291bnQtLTsKLQkJCQkJLy8gaWYgd2UgYXJlIHJlbW92aW5nIHRoZSBsYXN0IG9uZSwgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZQotCQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQkJdGFiWzBdID0gZS5uZXh0OwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCQl9Ci0JCQkJCQl0aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJCX0KLQkJCQkJdGhpcy5jb3VudC0tOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgaGFzaCA9IG8uaGFzaENvZGUoKTsKLQkJCWludCBpbmRleCA9IChoYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOwotCQkJZm9yIChFbnRyeTxFPiBlID0gdGFiW2luZGV4XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiBvLmVxdWFscyhlLm9iamVjdCkpIHsKLQkJCQkJdGhpcy5tb2RDb3VudCsrOwotCQkJCQllLmNvdW50LS07Ci0JCQkJCS8vIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBvbmUsIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQkJaWYgKGUuY291bnQgPT0gMCkgewotCQkJCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCQkJCXRhYltpbmRleF0gPSBlLm5leHQ7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJCX0KLQkJCQkJCXRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJfQotCQkJCQl0aGlzLmNvdW50LS07Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvLCBpbnQgY250KSB7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJZm9yIChFbnRyeTxFPiBlID0gdGFiWzBdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJCWlmIChlLm9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCXRoaXMubW9kQ291bnQrKzsKLQkJCQkJaW50IGNudDIgPSAoY250IDwgZS5jb3VudCkgPyBjbnQgOiBlLmNvdW50OwotCQkJCQllLmNvdW50IC09IGNudDI7Ci0JCQkJCS8vIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBlbGVtZW50KHMpLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCWlmIChlLmNvdW50ID09IDApIHsKLQkJCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCQl0YWJbMF0gPSBlLm5leHQ7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJCX0KLQkJCQkJCXRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJfQotCQkJCQl0aGlzLmNvdW50IC09IGNudDI7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWludCBoYXNoID0gby5oYXNoQ29kZSgpOwotCQkJaW50IGluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbaW5kZXhdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmIG8uZXF1YWxzKGUub2JqZWN0KSkgewotCQkJCQl0aGlzLm1vZENvdW50Kys7Ci0JCQkJCWludCBjbnQyID0gKGNudCA8IGUuY291bnQpID8gY250IDogZS5jb3VudDsKLQkJCQkJZS5jb3VudCAtPSBjbnQyOwotCQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3QgZWxlbWVudChzKSwgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZQotCQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQkJdGFiW2luZGV4XSA9IGUubmV4dDsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQkJfQotCQkJCQkJdGhpcy51bmlxdWVDb3VudC0tOwotCQkJCQl9Ci0JCQkJCXRoaXMuY291bnQgLT0gY250MjsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNsZWFycyBvdXQgYWxsIG9mIHRoZSBoYXNoIHRhYmxlIGJ1Y2tldHMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJdGhpcy5tb2RDb3VudCsrOwotCQlmb3IgKGludCBpID0gdGFiLmxlbmd0aDsgLS1pID49IDA7ICkgewotCQkJdGFiW2ldID0gbnVsbDsKLQkJfQotCQl0aGlzLmNvdW50ID0gMDsKLQkJdGhpcy51bmlxdWVDb3VudCA9IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGJhZzogdGhlIGVsZW1lbnRzCi0JICogdGhlbXNlbHZlcyBhcmUgbm90IGNsb25lZC4KLQkgKgotCSAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBiYWcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEhhc2hCYWc8RT4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUhhc2hCYWc8RT4gY2xvbmUgPSAoSGFzaEJhZzxFPikgc3VwZXIuY2xvbmUoKTsKLQkJCWNsb25lLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKHRoaXMudGFibGUubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSB0aGlzLnRhYmxlLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJY2xvbmUudGFibGVbaV0gPSAodGhpcy50YWJsZVtpXSA9PSBudWxsKSAKLQkJCQkJCT8gbnVsbCA6IChFbnRyeTxFPikgdGhpcy50YWJsZVtpXS5jbG9uZSgpOwotCQkJfQotCQkJY2xvbmUubW9kQ291bnQgPSAwOwotCQkJcmV0dXJuIGNsb25lOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFzaCB0YWJsZSBjb2xsaXNpb24gbGlzdCBlbnRyeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRyeTxFPiB7Ci0JCWludCBoYXNoOwotCQlFIG9iamVjdDsKLQkJaW50IGNvdW50OwotCQlFbnRyeTxFPiBuZXh0OwotCi0JCUVudHJ5KGludCBoYXNoLCBFIG9iamVjdCwgRW50cnk8RT4gbmV4dCkgewotCQkJdGhpcyhoYXNoLCBvYmplY3QsIDEsIG5leHQpOwotCQl9Ci0KLQkJRW50cnkoaW50IGhhc2gsIEUgb2JqZWN0LCBpbnQgY291bnQsIEVudHJ5PEU+IG5leHQpIHsKLQkJCXRoaXMuaGFzaCA9IGhhc2g7Ci0JCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJCXRoaXMubmV4dCA9IG5leHQ7Ci0JCX0KLQotCQkvKioKLQkJICogQ2FzY2FkZSB0aGUgY2xvbmUgdG8gYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBzYW1lIGJ1Y2tldC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHJvdGVjdGVkIEVudHJ5PEU+IGNsb25lKCkgewotCQkJcmV0dXJuIG5ldyBFbnRyeSh0aGlzLmhhc2gsIHRoaXMub2JqZWN0LCB0aGlzLmNvdW50LAotCQkJCQkodGhpcy5uZXh0ID09IG51bGwgPyBudWxsIDogdGhpcy5uZXh0LmNsb25lKCkpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMub2JqZWN0ICsgIj0+IiArIHRoaXMuY291bnQ7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCWlmICh0aGlzLmNvdW50ID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9JVEVSQVRPUjsKLQkJfQotCQlyZXR1cm4gbmV3IEhhc2hJdGVyYXRvcigpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxFPiB1bmlxdWVJdGVyYXRvcigpIHsKLQkJaWYgKHRoaXMuY291bnQgPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX0lURVJBVE9SOwotCQl9Ci0JCXJldHVybiBuZXcgVW5pcXVlSXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbXB0eSBpdGVyYXRvciB0aGF0IGRvZXMganVzdCBhYm91dCBub3RoaW5nLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhdG9yIEVNUFRZX0lURVJBVE9SID0gbmV3IEVtcHR5SXRlcmF0b3IoKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVtcHR5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0KLQkJRW1wdHlJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgSGFzaEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewotCQlFbnRyeTxFPltdIGxvY2FsVGFibGUgPSBIYXNoQmFnLnRoaXMudGFibGU7Ci0JCWludCBpbmRleCA9IHRoaXMubG9jYWxUYWJsZS5sZW5ndGg7CS8vIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlCi0JCUVudHJ5PEU+IG5leHRFbnRyeSA9IG51bGw7Ci0JCWludCBuZXh0RW50cnlDb3VudCA9IDA7Ci0JCUVudHJ5PEU+IGxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIG1vZENvdW50IHZhbHVlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlbGlldmVzIHRoYXQgdGhlIGJhY2tpbmcKLQkJICogYmFnIHNob3VsZCBoYXZlLiBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKLQkJICogaGFzIGRldGVjdGVkIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50ID0gSGFzaEJhZy50aGlzLm1vZENvdW50OwotCi0JCUhhc2hJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJRW50cnk8RT4gZSA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLmxvY2FsVGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZSA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZSA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZTsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJcmV0dXJuIGUgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBFIG5leHQoKSB7Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBldCA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLmxvY2FsVGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZXQgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWV0ID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBldDsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJaWYgKGV0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZSA9IHRoaXMubGFzdFJldHVybmVkRW50cnkgPSB0aGlzLm5leHRFbnRyeTsKLQkJCXRoaXMubmV4dEVudHJ5Q291bnQrKzsKLQkJCWlmICh0aGlzLm5leHRFbnRyeUNvdW50ID09IGUuY291bnQpIHsKLQkJCQl0aGlzLm5leHRFbnRyeSA9IGUubmV4dDsKLQkJCQl0aGlzLm5leHRFbnRyeUNvdW50ID0gMDsKLQkJCX0KLQkJCXJldHVybiBlLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCWlmICh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMubG9jYWxUYWJsZTsKLQkJCWludCBzbG90ID0gKHRoaXMubGFzdFJldHVybmVkRW50cnkuaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYltzbG90XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZSA9PSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5KSB7Ci0JCQkJCUhhc2hCYWcudGhpcy5tb2RDb3VudCsrOwotCQkJCQl0aGlzLmV4cGVjdGVkTW9kQ291bnQrKzsKLQkJCQkJZS5jb3VudC0tOwotCQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3Qgb25lLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQkJdGFiW3Nsb3RdID0gZS5uZXh0OwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCQl9Ci0JCQkJCQlIYXNoQmFnLnRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHNsaWRlIGJhY2sgdGhlIGNvdW50IHRvIGFjY291bnQgZm9yIHRoZSBqdXN0LXJlbW92ZWQgZWxlbWVudAotCQkJCQkJdGhpcy5uZXh0RW50cnlDb3VudC0tOwotCQkJCQl9Ci0JCQkJCUhhc2hCYWcudGhpcy5jb3VudC0tOwotCQkJCQl0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsJLy8gaXQgY2Fubm90IGJlIHJlbW92ZWQgYWdhaW4KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBVbmlxdWVJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKLQkJRW50cnk8RT5bXSBsb2NhbFRhYmxlID0gSGFzaEJhZy50aGlzLnRhYmxlOwotCQlpbnQgaW5kZXggPSB0aGlzLmxvY2FsVGFibGUubGVuZ3RoOwkvLyBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZQotCQlFbnRyeTxFPiBuZXh0RW50cnkgPSBudWxsOwotCQlFbnRyeTxFPiBsYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtb2RDb3VudCB2YWx1ZSB0aGF0IHRoZSBpdGVyYXRvciBiZWxpZXZlcyB0aGF0IHRoZSBiYWNraW5nCi0JCSAqIGJhZyBzaG91bGQgaGF2ZS4gSWYgdGhpcyBleHBlY3RhdGlvbiBpcyB2aW9sYXRlZCwgdGhlIGl0ZXJhdG9yCi0JCSAqIGhhcyBkZXRlY3RlZCBhIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgZXhwZWN0ZWRNb2RDb3VudCA9IEhhc2hCYWcudGhpcy5tb2RDb3VudDsKLQotCQlVbmlxdWVJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJRW50cnk8RT4gZSA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLmxvY2FsVGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZSA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZSA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZTsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJcmV0dXJuIGUgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBFIG5leHQoKSB7Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBldCA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLmxvY2FsVGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZXQgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWV0ID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBldDsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJaWYgKGV0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZSA9IHRoaXMubGFzdFJldHVybmVkRW50cnkgPSB0aGlzLm5leHRFbnRyeTsKLQkJCXRoaXMubmV4dEVudHJ5ID0gZS5uZXh0OwotCQkJcmV0dXJuIGUub2JqZWN0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJaWYgKHRoaXMubGFzdFJldHVybmVkRW50cnkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmIChIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+W10gdGFiID0gdGhpcy5sb2NhbFRhYmxlOwotCQkJaW50IHNsb3QgPSAodGhpcy5sYXN0UmV0dXJuZWRFbnRyeS5oYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOwotCQkJZm9yIChFbnRyeTxFPiBlID0gdGFiW3Nsb3RdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJCWlmIChlID09IHRoaXMubGFzdFJldHVybmVkRW50cnkpIHsKLQkJCQkJSGFzaEJhZy50aGlzLm1vZENvdW50Kys7Ci0JCQkJCXRoaXMuZXhwZWN0ZWRNb2RDb3VudCsrOwotCQkJCQkvLyByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCXRhYltzbG90XSA9IGUubmV4dDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJfQotCQkJCQlIYXNoQmFnLnRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJSGFzaEJhZy50aGlzLmNvdW50IC09IHRoaXMubGFzdFJldHVybmVkRW50cnkuY291bnQ7Ci0JCQkJCXRoaXMubGFzdFJldHVybmVkRW50cnkgPSBudWxsOwkvLyBpdCBjYW5ub3QgYmUgcmVtb3ZlZCBhZ2FpbgotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgQmFnKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlCYWc8RT4gYiA9IChCYWc8RT4pIG87Ci0JCWlmIChiLnNpemUoKSAhPSB0aGlzLnNpemUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUJhZzxFPiBjbG9uZSA9IHRoaXMuY2xvbmUoKTsKLQkJZm9yIChFIGUgOiBiKSB7Ci0JCQlpZiAoICEgY2xvbmUucmVtb3ZlKGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBjbG9uZS5pc0VtcHR5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IGggPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEU+IHN0cmVhbSA9IHRoaXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3QgbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJaCArPSBuZXh0Lmhhc2hDb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGg7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgc3RhdGUgb2YgdGhpcyBiYWcgdG8gYSBzdHJlYW0gKGkuZS4gc2VyaWFsaXplIGl0KS4KLQkgKgotCSAqIEBzZXJpYWxEYXRhIEVtaXQgdGhlIGNhcGFjaXR5IG9mIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzIGluIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IGFsbCBvZiB0aGUgYmFnJ3MgZWxlbWVudHMgKGVhY2ggYW4gT2JqZWN0KSBhbmQKLQkgKiAgICAgdGhlaXIgY291bnRzIChlYWNoIGFuIGludCksIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJLy8gd3JpdGUgb3V0IHRoZSB0aHJlc2hvbGQsIGxvYWQgZmFjdG9yLCBhbmQgYW55IGhpZGRlbiBzdHVmZgotCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCi0JCS8vIHdyaXRlIG91dCBudW1iZXIgb2YgYnVja2V0cwotCQlzLndyaXRlSW50KHRoaXMudGFibGUubGVuZ3RoKTsKLQotCQkvLyB3cml0ZSBvdXQgbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cwotCQlzLndyaXRlSW50KHRoaXMudW5pcXVlQ291bnQpOwotCi0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJLy8gd3JpdGUgb3V0IGVsZW1lbnRzIGFuZCBjb3VudHMgKGFsdGVybmF0aW5nKQotCQlmb3IgKEVudHJ5PEU+IGVudHJ5IDogdGFiKSB7Ci0JCQl3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotCQkJCXMud3JpdGVPYmplY3QoZW50cnkub2JqZWN0KTsKLQkJCQlzLndyaXRlSW50KGVudHJ5LmNvdW50KTsKLQkJCQllbnRyeSA9IGVudHJ5Lm5leHQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFJlY29uc3RpdHV0ZSB0aGUgYmFnIGZyb20gYSBzdHJlYW0gKGkuZS4gZGVzZXJpYWxpemUgaXQpLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkvLyByZWFkIGluIHRoZSB0aHJlc2hvbGQsIGxvYWRmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQotCQkvLyByZWFkIGluIG51bWJlciBvZiBidWNrZXRzIGFuZCBhbGxvY2F0ZSB0aGUgYnVja2V0IGFycmF5Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUocy5yZWFkSW50KCkpOwotCi0JCS8vIHJlYWQgaW4gbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cwotCQlpbnQgdW5pcXVlID0gcy5yZWFkSW50KCk7Ci0KLQkJLy8gcmVhZCB0aGUgZWxlbWVudHMgYW5kIGNvdW50cywgYW5kIHB1dCB0aGUgZWxlbWVudHMgaW4gdGhlIGJhZwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXF1ZTsgaSsrKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUUgZWxlbWVudCA9IChFKSBzLnJlYWRPYmplY3QoKTsKLQkJCWludCBlbGVtZW50Q291bnQgPSBzLnJlYWRJbnQoKTsKLQkJCXRoaXMuYWRkKGVsZW1lbnQsIGVsZW1lbnRDb3VudCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9JZGVudGl0eUhhc2hCYWcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9JZGVudGl0eUhhc2hCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwMjNmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgPGNvZGU+QmFnPC9jb2RlPiBpbnRlcmZhY2Ugd2l0aCBhCi0gKiBoYXNoIHRhYmxlLCB1c2luZyBvYmplY3QtaWRlbnRpdHkgaW4gcGxhY2Ugb2Ygb2JqZWN0LWVxdWFsaXR5IHdoZW4KLSAqIGNvbXBhcmluZyBlbGVtZW50cy4gSW4gb3RoZXIgd29yZHMsIGluIGFuIDxjb2RlPklkZW50aXR5SGFzaEJhZzwvY29kZT4sCi0gKiB0d28gb2JqZWN0cyA8Y29kZT5rMTwvY29kZT4gYW5kIDxjb2RlPmsyPC9jb2RlPiBhcmUgY29uc2lkZXJlZAotICogZXF1YWwgaWYgYW5kIG9ubHkgaWYgPGNvZGU+KGsxID09IGsyKTwvY29kZT4uIChJbiBub3JtYWwgPGNvZGU+QmFnPC9jb2RlPgotICogaW1wbGVtZW50YXRpb25zIChsaWtlIDxjb2RlPkhhc2hCYWc8L2NvZGU+KSB0d28gb2JqZWN0cyA8Y29kZT5rMTwvY29kZT4KLSAqIGFuZCA8Y29kZT5rMjwvY29kZT4gYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgYW5kIG9ubHkgaWYKLSAqIDxjb2RlPihrMSA9PSBudWxsID8gazIgPT0gbnVsbCA6IGsxLmVxdWFscyhrMikpPC9jb2RlPi4pCi0gKiA8cD4KLSAqIDxiPgotICogVGhpcyBjbGFzcyBpcyA8aT5ub3Q8L2k+IGEgZ2VuZXJhbC1wdXJwb3NlIDxjb2RlPkJhZzwvY29kZT4KLSAqIGltcGxlbWVudGF0aW9uISBXaGlsZSB0aGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIDxjb2RlPkJhZzwvY29kZT4gaW50ZXJmYWNlLCBpdAotICogaW50ZW50aW9uYWxseSB2aW9sYXRlcyA8Y29kZT5CYWcnczwvY29kZT4gZ2VuZXJhbCBjb250cmFjdCwgd2hpY2ggbWFuZGF0ZXMgdGhlCi0gKiB1c2Ugb2YgdGhlIDxjb2RlPmVxdWFsczwvY29kZT4gbWV0aG9kIHdoZW4gY29tcGFyaW5nIG9iamVjdHMuIFRoaXMgY2xhc3MgaXMKLSAqIGRlc2lnbmVkIGZvciB1c2Ugb25seSBpbiB0aGUgcmFyZSBjYXNlcyB3aGVyZWluIG9iamVjdC1pZGVudGl0eQotICogc2VtYW50aWNzIGFyZSByZXF1aXJlZC4KLSAqIDwvYj4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYWtlcyBubyBndWFyYW50ZWVzIGFzIHRvIHRoZSBpdGVyYXRpb24gb3JkZXIgb2YKLSAqIHRoZSBiYWcncyBlbGVtZW50czsgaW4gcGFydGljdWxhciwgaXQgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIG9yZGVyCi0gKiB3aWxsIHJlbWFpbiBjb25zdGFudCBvdmVyIHRpbWUuIFRoaXMgY2xhc3MgcGVybWl0cyB0aGUgPGNvZGU+bnVsbDwvY29kZT4KLSAqIGVsZW1lbnQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgb2ZmZXJzIGNvbnN0YW50IHRpbWUgcGVyZm9ybWFuY2UgZm9yIHRoZSBiYXNpYyBvcGVyYXRpb25zCi0gKiAoPGNvZGU+YWRkPC9jb2RlPiwgPGNvZGU+cmVtb3ZlPC9jb2RlPiwgPGNvZGU+Y29udGFpbnM8L2NvZGU+IGFuZAotICogPGNvZGU+c2l6ZTwvY29kZT4pLCBhc3N1bWluZyB0aGUgc3lzdGVtIGlkZW50aXR5IGhhc2ggZnVuY3Rpb24KLSAqICh7QGxpbmsgU3lzdGVtI2lkZW50aXR5SGFzaENvZGUoT2JqZWN0KX0pIGRpc3BlcnNlcyBlbGVtZW50cyBwcm9wZXJseQotICogYW1vbmcgdGhlIGJ1Y2tldHMuIEl0ZXJhdGluZyBvdmVyIHRoaXMgYmFnIHJlcXVpcmVzIHRpbWUKLSAqIHByb3BvcnRpb25hbCB0byB0aGUgc3VtIG9mIHRoZSBiYWcncyBzaXplICh0aGUgbnVtYmVyIG9mIGVsZW1lbnRzKSBwbHVzIHRoZQotICogImNhcGFjaXR5IiBvZiB0aGUgYmFja2luZyBoYXNoIHRhYmxlICh0aGUgbnVtYmVyIG9mIGJ1Y2tldHMpLiBUaHVzLCBpdCBpcwotICogaW1wb3J0YW50IG5vdCB0byBzZXQgdGhlIGluaXRpYWwgY2FwYWNpdHkgdG9vIGhpZ2ggKG9yIHRoZSBsb2FkIGZhY3RvciB0b28KLSAqIGxvdykgaWYgaXRlcmF0aW9uIHBlcmZvcm1hbmNlIGlzIGltcG9ydGFudC4KLSAqIDxwPgotICogPGI+Tm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC48L2I+IElmIG11bHRpcGxlCi0gKiB0aHJlYWRzIGFjY2VzcyBhIGJhZyBjb25jdXJyZW50bHksIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlIHRocmVhZHMgbW9kaWZpZXMKLSAqIHRoZSBiYWcsIGl0IDxpPm11c3Q8L2k+IGJlIHN5bmNocm9uaXplZCBleHRlcm5hbGx5LiBUaGlzIGlzIHR5cGljYWxseQotICogYWNjb21wbGlzaGVkIGJ5IHN5bmNocm9uaXppbmcgb24gc29tZSBvYmplY3QgdGhhdCBuYXR1cmFsbHkgZW5jYXBzdWxhdGVzCi0gKiB0aGUgYmFnLiBJZiBubyBzdWNoIG9iamVjdCBleGlzdHMsIHRoZSBiYWcgc2hvdWxkIGJlICJ3cmFwcGVkIiB1c2luZyB0aGUKLSAqIDxjb2RlPkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb248L2NvZGU+IG1ldGhvZC4gVGhpcyBpcwotICogYmVzdCBkb25lIGF0IGNyZWF0aW9uIHRpbWUsIHRvIHByZXZlbnQgYWNjaWRlbnRhbCB1bnN5bmNocm9uaXplZCBhY2Nlc3MKLSAqIHRvIHRoZSBiYWc6Ci0gKiA8cHJlPgotICogQ29sbGVjdGlvbiBjID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkQ29sbGVjdGlvbihuZXcgSWRlbnRpdHlIYXNoQmFnKC4uLikpOwotICogPC9wcmU+Ci0gKiA8cD4KLSAqIFRoZSBpdGVyYXRvcnMgcmV0dXJuZWQgYnkgdGhpcyBjbGFzcydzIDxjb2RlPml0ZXJhdG9yPC9jb2RlPiBtZXRob2QgYXJlCi0gKiA8aT5mYWlsLWZhc3Q8L2k+OiBpZiB0aGUgYmFnIGlzIG1vZGlmaWVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBpdGVyYXRvciBpcwotICogY3JlYXRlZCwgaW4gYW55IHdheSBleGNlcHQgdGhyb3VnaCB0aGUgaXRlcmF0b3IncyBvd24gPGNvZGU+cmVtb3ZlPC9jb2RlPgotICogbWV0aG9kLCB0aGUgaXRlcmF0b3IgdGhyb3dzIGEgPGNvZGU+Q29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjwvY29kZT4uCi0gKiBUaHVzLCBpbiB0aGUgZmFjZSBvZiBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiwgdGhlIGl0ZXJhdG9yIGZhaWxzIHF1aWNrbHkKLSAqIGFuZCBjbGVhbmx5LCByYXRoZXIgdGhhbiByaXNraW5nIGFyYml0cmFyeSwgbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3IgYXQKLSAqIGFuIHVuZGV0ZXJtaW5lZCB0aW1lIGluIHRoZSBmdXR1cmUuCi0gKiAKLSAqIEBzZWUJQ29sbGVjdGlvbnMjc3luY2hyb25pemVkQ29sbGVjdGlvbihDb2xsZWN0aW9uKQotICovCi0KLXB1YmxpYyBjbGFzcyBJZGVudGl0eUhhc2hCYWc8RT4gZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb248RT4KLQkJCWltcGxlbWVudHMgQmFnPEU+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZSB7Ci0KLQkvKiogVGhlIGhhc2ggdGFibGUuICovCi0JdHJhbnNpZW50IEVudHJ5PEU+W10gdGFibGU7Ci0KLQkvKiogVGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBiYWcuICovCi0JdHJhbnNpZW50IGludCBjb3VudCA9IDA7Ci0KLQkvKiogVGhlIG51bWJlciBvZiB1bmlxdWUgZW50cmllcyBpbiB0aGUgYmFnLiAqLwotCXRyYW5zaWVudCBpbnQgdW5pcXVlQ291bnQgPSAwOwotCi0JLyoqCi0JICogVGhlIGhhc2ggdGFibGUgaXMgcmVoYXNoZWQgd2hlbiBpdHMgc2l6ZSBleGNlZWRzIHRoaXMgdGhyZXNob2xkLiAoVGhlCi0JICogdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyAoaW50KShjYXBhY2l0eSAqIGxvYWRGYWN0b3IpLikKLQkgKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIGludCB0aHJlc2hvbGQ7Ci0KLQkvKioKLQkgKiBUaGUgbG9hZCBmYWN0b3IgZm9yIHRoZSBoYXNoIHRhYmxlLgotCSAqCi0JICogQHNlcmlhbAotCSAqLwotCXByaXZhdGUgZmxvYXQgbG9hZEZhY3RvcjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBiYWcgaGFzIGJlZW4gc3RydWN0dXJhbGx5IG1vZGlmaWVkLgotCSAqIFN0cnVjdHVyYWwgbW9kaWZpY2F0aW9ucyBhcmUgdGhvc2UgdGhhdCBjaGFuZ2UgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluCi0JICogdGhlIGJhZyBvciBvdGhlcndpc2UgbW9kaWZ5IGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUgKGUuZy4gcmVoYXNoKS4KLQkgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gbWFrZSBpdGVyYXRvcnMgb24gdGhpcyBiYWcgZmFpbC1mYXN0LgotCSAqCi0JICogQHNlZSBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXRyYW5zaWVudCBpbnQgbW9kQ291bnQgPSAwOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgYmFnIHdpdGggdGhlCi0JICogZGVmYXVsdCBjYXBhY2l0eSwgd2hpY2ggaXMgMTEsIGFuZCBsb2FkIGZhY3Rvciwgd2hpY2ggaXMgMC43NS4KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnKCkgewotCQl0aGlzKDExLCAwLjc1Zik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgYmFnIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5Ci0JICogYW5kIGRlZmF1bHQgbG9hZCBmYWN0b3IsIHdoaWNoIGlzIDAuNzUuCi0JICoKLQkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoZSBiYWNraW5nIG1hcC4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBpcyBsZXNzCi0JICogICAgIHRoYW4gemVyby4KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKLQkJdGhpcyhpbml0aWFsQ2FwYWNpdHksIDAuNzVmKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBiYWcgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eSBhbmQgdGhlIHNwZWNpZmllZCBsb2FkIGZhY3Rvci4KLQkgKgotCSAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhlIGJhY2tpbmcgbWFwLgotCSAqIEBwYXJhbSBsb2FkRmFjdG9yIHRoZSBsb2FkIGZhY3RvciBvZiB0aGUgYmFja2luZyBtYXAuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcwotCSAqICAgICB0aGFuIHplcm8sIG9yIGlmIHRoZSBsb2FkIGZhY3RvciBpcyBub25wb3NpdGl2ZS4KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKLQkJaWYgKGluaXRpYWxDYXBhY2l0eSA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgSW5pdGlhbCBDYXBhY2l0eTogIiArIGluaXRpYWxDYXBhY2l0eSk7Ci0JCX0KLQkJaWYgKGxvYWRGYWN0b3IgPD0gMCB8fCBGbG9hdC5pc05hTihsb2FkRmFjdG9yKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBMb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3IpOwotCQl9Ci0JCWlmIChpbml0aWFsQ2FwYWNpdHkgPT0gMCkgewotCQkJaW5pdGlhbENhcGFjaXR5ID0gMTsKLQkJfQotCQl0aGlzLmxvYWRGYWN0b3IgPSBsb2FkRmFjdG9yOwotCQl0aGlzLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKGluaXRpYWxDYXBhY2l0eSk7Ci0JCXRoaXMudGhyZXNob2xkID0gKGludCkgKGluaXRpYWxDYXBhY2l0eSAqIGxvYWRGYWN0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgYmFnIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBjb2xsZWN0aW9uLiBUaGUgY2FwYWNpdHkgb2YgdGhlIGJhZyBpcwotCSAqIHR3aWNlIHRoZSBzaXplIG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvciAxMSAod2hpY2hldmVyIGlzCi0JICogZ3JlYXRlciksIGFuZCB0aGUgZGVmYXVsdCBsb2FkIGZhY3Rvciwgd2hpY2ggaXMgMC43NSwgaXMgdXNlZC4KLQkgKgotCSAqIEBwYXJhbSBjIHRoZSBjb2xsZWN0aW9uIHdob3NlIGVsZW1lbnRzIGFyZSB0byBiZSBwbGFjZWQgaW50byB0aGlzIGJhZy4KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJdGhpcyhNYXRoLm1heCgyKmMuc2l6ZSgpLCAxMSkpOwotCQl0aGlzLmFkZEFsbChjKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIHRoZSBtYWludGFpbmVkIGNvdW50LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY291bnQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY29tcGFyZXMgdGhlIG1haW50YWluZWQgY291bnQgdG8gemVyby4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5jb3VudCA9PSAwOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkKLQkgKiBjYWxjdWxhdGluZyB0aGUgb2JqZWN0J3MgaWRlbnRpdHkgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlCi0JICogZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCWludCBoYXNoID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobyk7Ci0JCWludCBpbmRleCA9IChoYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOwotCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmIChlLm9iamVjdCA9PSBvKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJaW50IGhhc2ggPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvKTsKLQkJaW50IGluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCWZvciAoRW50cnk8RT4gZSA9IHRhYltpbmRleF07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJaWYgKChlLmhhc2ggPT0gaGFzaCkgJiYgKGUub2JqZWN0ID09IG8pKSB7Ci0JCQkJcmV0dXJuIGUuY291bnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogUmVoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYmFnIGludG8gYSBuZXcgaGFzaCB0YWJsZQotCSAqIHdpdGggYSBsYXJnZXIgY2FwYWNpdHkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZQotCSAqIG51bWJlciBvZiBkaWZmZXJlbnQgZWxlbWVudHMgaW4gdGhpcyBtYXAgZXhjZWVkcyBpdHMKLQkgKiBjYXBhY2l0eSBhbmQgbG9hZCBmYWN0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKLQkJRW50cnk8RT5bXSBvbGRNYXAgPSB0aGlzLnRhYmxlOwotCQlpbnQgb2xkQ2FwYWNpdHkgPSBvbGRNYXAubGVuZ3RoOwotCi0JCWludCBuZXdDYXBhY2l0eSA9IG9sZENhcGFjaXR5ICogMiArIDE7Ci0JCUVudHJ5PEU+W10gbmV3VGFibGUgPSB0aGlzLmJ1aWxkVGFibGUobmV3Q2FwYWNpdHkpOwotCi0JCXRoaXMubW9kQ291bnQrKzsKLQkJdGhpcy50aHJlc2hvbGQgPSAoaW50KSAobmV3Q2FwYWNpdHkgKiB0aGlzLmxvYWRGYWN0b3IpOwotCQl0aGlzLnRhYmxlID0gbmV3VGFibGU7Ci0KLQkJZm9yIChpbnQgaSA9IG9sZENhcGFjaXR5OyBpLS0gPiAwOyApIHsKLQkJCWZvciAoRW50cnk8RT4gb2xkID0gb2xkTWFwW2ldOyBvbGQgIT0gbnVsbDsgKSB7Ci0JCQkJRW50cnk8RT4gZSA9IG9sZDsKLQkJCQlvbGQgPSBvbGQubmV4dDsKLQotCQkJCWludCBpbmRleCA9IChlLmhhc2ggJiAweDdGRkZGRkZGKSAlIG5ld0NhcGFjaXR5OwotCQkJCWUubmV4dCA9IG5ld1RhYmxlW2luZGV4XTsKLQkJCQluZXdUYWJsZVtpbmRleF0gPSBlOwotCQkJfQotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBFbnRyeTxFPltdIGJ1aWxkVGFibGUoaW50IGNhcGFjaXR5KSB7Ci0JCXJldHVybiBuZXcgRW50cnlbY2FwYWNpdHldOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgPFQ+IEVudHJ5PEU+IGJ1aWxkRW50cnkoaW50IGhhc2gsIE9iamVjdCBvLCBFbnRyeTxUPiBuZXh0KSB7Ci0JCXJldHVybiBuZXcgRW50cnkoaGFzaCwgbywgbmV4dCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSA8VD4gRW50cnk8RT4gYnVpbGRFbnRyeShpbnQgaGFzaCwgT2JqZWN0IG8sIGludCBjbnQsIEVudHJ5PFQ+IG5leHQpIHsKLQkJcmV0dXJuIG5ldyBFbnRyeShoYXNoLCBvLCBjbnQsIG5leHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkKLQkgKiBjYWxjdWxhdGluZyB0aGUgb2JqZWN0J3MgaWRlbnRpdHkgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlCi0JICogZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXRoaXMubW9kQ291bnQrKzsKLQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLnRhYmxlOwotCQlpbnQgaGFzaCA9IDA7Ci0JCWludCBpbmRleCA9IDA7Ci0KLQkJLy8gaWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGluIHRoZSBiYWcsIHNpbXBseSBidW1wIGl0cyBjb3VudAotCQloYXNoID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobyk7Ci0JCWluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCWZvciAoRW50cnk8RT4gZSA9IHRhYltpbmRleF07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJaWYgKChlLmhhc2ggPT0gaGFzaCkgJiYgKGUub2JqZWN0ID09IG8pKSB7Ci0JCQkJZS5jb3VudCsrOwotCQkJCXRoaXMuY291bnQrKzsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlaGFzaCB0aGUgdGFibGUgaWYgdGhlIHRocmVzaG9sZCBpcyBleGNlZWRlZAotCQlpZiAodGhpcy51bmlxdWVDb3VudCA+PSB0aGlzLnRocmVzaG9sZCkgewotCQkJdGhpcy5yZWhhc2goKTsKLQkJCXRhYiA9IHRoaXMudGFibGU7Ci0JCQlpbmRleCA9IChoYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOwotCQl9Ci0KLQkJLy8gY3JlYXRlIHRoZSBuZXcgZW50cnkgYW5kIHB1dCBpdCBpbiB0aGUgdGFibGUKLQkJRW50cnk8RT4gZSA9IHRoaXMuYnVpbGRFbnRyeShoYXNoLCBvLCB0YWJbaW5kZXhdKTsKLQkJdGFiW2luZGV4XSA9IGU7Ci0JCXRoaXMuY291bnQrKzsKLQkJdGhpcy51bmlxdWVDb3VudCsrOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5Ci0JICogY2FsY3VsYXRpbmcgdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZQotCSAqIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaCB0YWJsZSBidWNrZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbywgaW50IGNudCkgewotCQlpZiAoY250IDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aGlzLm1vZENvdW50Kys7Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJaW50IGhhc2ggPSAwOwotCQlpbnQgaW5kZXggPSAwOwotCi0JCS8vIGlmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBpbiB0aGUgYmFnLCBzaW1wbHkgYnVtcCBpdHMgY291bnQKLQkJaGFzaCA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG8pOwotCQlpbmRleCA9IChoYXNoICYgMHg3RkZGRkZGRikgJSB0YWIubGVuZ3RoOwotCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmIChlLm9iamVjdCA9PSBvKSkgewotCQkJCWUuY291bnQgKz0gY250OwotCQkJCXRoaXMuY291bnQgKz0gY250OwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVoYXNoIHRoZSB0YWJsZSBpZiB0aGUgdGhyZXNob2xkIGlzIGV4Y2VlZGVkCi0JCWlmICh0aGlzLnVuaXF1ZUNvdW50ID49IHRoaXMudGhyZXNob2xkKSB7Ci0JCQl0aGlzLnJlaGFzaCgpOwotCQkJdGFiID0gdGhpcy50YWJsZTsKLQkJCWluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCX0KLQotCQkvLyBjcmVhdGUgdGhlIG5ldyBlbnRyeSBhbmQgcHV0IGl0IGluIHRoZSB0YWJsZQotCQlFbnRyeTxFPiBlID0gdGhpcy5idWlsZEVudHJ5KGhhc2gsIG8sIGNudCwgdGFiW2luZGV4XSk7Ci0JCXRhYltpbmRleF0gPSBlOwotCQl0aGlzLmNvdW50ICs9IGNudDsKLQkJdGhpcy51bmlxdWVDb3VudCsrOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5Ci0JICogY2FsY3VsYXRpbmcgdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZQotCSAqIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaCB0YWJsZSBidWNrZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJaW50IGhhc2ggPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvKTsKLQkJaW50IGluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCWZvciAoRW50cnk8RT4gZSA9IHRhYltpbmRleF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiAoZS5vYmplY3QgPT0gbykpIHsKLQkJCQl0aGlzLm1vZENvdW50Kys7Ci0JCQkJZS5jb3VudC0tOwotCQkJCS8vIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBvbmUsIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCXRhYltpbmRleF0gPSBlLm5leHQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCX0KLQkJCQkJdGhpcy51bmlxdWVDb3VudC0tOwotCQkJCX0KLQkJCQl0aGlzLmNvdW50LS07Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkKLQkgKiBjYWxjdWxhdGluZyB0aGUgb2JqZWN0J3MgaWRlbnRpdHkgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlCi0JICogZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8sIGludCBjbnQpIHsKLQkJaWYgKGNudCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLnRhYmxlOwotCQlpbnQgaGFzaCA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG8pOwotCQlpbnQgaW5kZXggPSAoaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJZm9yIChFbnRyeTxFPiBlID0gdGFiW2luZGV4XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmIChlLm9iamVjdCA9PSBvKSkgewotCQkJCXRoaXMubW9kQ291bnQrKzsKLQkJCQlpbnQgY250MiA9IChjbnQgPCBlLmNvdW50KSA/IGNudCA6IGUuY291bnQ7Ci0JCQkJZS5jb3VudCAtPSBjbnQyOwotCQkJCS8vIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBlbGVtZW50KHMpLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJaWYgKGUuY291bnQgPT0gMCkgewotCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQl0YWJbaW5kZXhdID0gZS5uZXh0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQl9Ci0JCQkJCXRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQl9Ci0JCQkJdGhpcy5jb3VudCAtPSBjbnQyOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgb2JqZWN0LWlkZW50aXR5IHRvIGRldGVybWluZSB3aGV0aGVyCi0JICogc3BlY2lmaWVkIGNvbGxlY3Rpb24gY29udGFpbnMgYSBwYXJ0aWN1bGFyIGVsZW1lbnQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gc3VwZXIucmVtb3ZlQWxsKHRoaXMuYnVpbGRJZGVudGl0eUhhc2hCYWcoYykpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBvYmplY3QtaWRlbnRpdHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKLQkgKiBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyBhIHBhcnRpY3VsYXIgZWxlbWVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiBzdXBlci5yZXRhaW5BbGwodGhpcy5idWlsZElkZW50aXR5SGFzaEJhZyhjKSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPD8+IGJ1aWxkSWRlbnRpdHlIYXNoQmFnKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gbmV3IElkZW50aXR5SGFzaEJhZyhjKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSBjbGVhcnMgb3V0IGFsbCBvZiB0aGUgaGFzaCB0YWJsZSBidWNrZXRzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCXRoaXMubW9kQ291bnQrKzsKLQkJZm9yIChpbnQgaSA9IHRhYi5sZW5ndGg7IC0taSA+PSAwOyApIHsKLQkJCXRhYltpXSA9IG51bGw7Ci0JCX0KLQkJdGhpcy5jb3VudCA9IDA7Ci0JCXRoaXMudW5pcXVlQ291bnQgPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBiYWc6IHRoZSBlbGVtZW50cwotCSAqIHRoZW1zZWx2ZXMgYXJlIG5vdCBjbG9uZWQuCi0JICoKLQkgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgYmFnLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJZGVudGl0eUhhc2hCYWc8RT4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUlkZW50aXR5SGFzaEJhZzxFPiBjbG9uZSA9IChJZGVudGl0eUhhc2hCYWc8RT4pIHN1cGVyLmNsb25lKCk7Ci0JCQljbG9uZS50YWJsZSA9IHRoaXMuYnVpbGRUYWJsZSh0aGlzLnRhYmxlLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gdGhpcy50YWJsZS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWNsb25lLnRhYmxlW2ldID0gKHRoaXMudGFibGVbaV0gPT0gbnVsbCkgCi0JCQkJCQk/IG51bGwgOiAoRW50cnk8RT4pIHRoaXMudGFibGVbaV0uY2xvbmUoKTsKLQkJCX0KLQkJCWNsb25lLm1vZENvdW50ID0gMDsKLQkJCXJldHVybiBjbG9uZTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEhhc2ggdGFibGUgY29sbGlzaW9uIGxpc3QgZW50cnkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50cnk8RT4gewotCQlpbnQgaGFzaDsKLQkJRSBvYmplY3Q7Ci0JCWludCBjb3VudDsKLQkJRW50cnk8RT4gbmV4dDsKLQotCQlFbnRyeShpbnQgaGFzaCwgRSBvYmplY3QsIEVudHJ5PEU+IG5leHQpIHsKLQkJCXRoaXMoaGFzaCwgb2JqZWN0LCAxLCBuZXh0KTsKLQkJfQotCi0JCUVudHJ5KGludCBoYXNoLCBFIG9iamVjdCwgaW50IGNvdW50LCBFbnRyeTxFPiBuZXh0KSB7Ci0JCQl0aGlzLmhhc2ggPSBoYXNoOwotCQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCQl0aGlzLm5leHQgPSBuZXh0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENhc2NhZGUgdGhlIGNsb25lIHRvIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgc2FtZSBidWNrZXQuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXByb3RlY3RlZCBFbnRyeTxFPiBjbG9uZSgpIHsKLQkJCXJldHVybiBuZXcgRW50cnkodGhpcy5oYXNoLCB0aGlzLm9iamVjdCwgdGhpcy5jb3VudCwKLQkJCQkJKHRoaXMubmV4dCA9PSBudWxsID8gbnVsbCA6IHRoaXMubmV4dC5jbG9uZSgpKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm9iamVjdCArICI9PiIgKyB0aGlzLmNvdW50OwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlpZiAodGhpcy5jb3VudCA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfSVRFUkFUT1I7Ci0JCX0KLQkJcmV0dXJuIG5ldyBIYXNoSXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIGVhY2ggaXRlbSBpbiB0aGUgYmFnCi0JICogb25jZSBhbmQgb25seSBvbmNlLCBpcnJlc3BlY3RpdmUgb2YgaG93IG1hbnkgdGltZXMKLQkgKiB0aGUgaXRlbSB3YXMgYWRkZWQgdG8gdGhlIGJhZy4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8RT4gdW5pcXVlSXRlcmF0b3IoKSB7Ci0JCWlmICh0aGlzLmNvdW50ID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9JVEVSQVRPUjsKLQkJfQotCQlyZXR1cm4gbmV3IFVuaXF1ZUl0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogRW1wdHkgaXRlcmF0b3IgdGhhdCBkb2VzIGp1c3QgYWJvdXQgbm90aGluZy4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYXRvciBFTVBUWV9JVEVSQVRPUiA9IG5ldyBFbXB0eUl0ZXJhdG9yKCk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbXB0eUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCi0JCUVtcHR5SXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEhhc2hJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKLQkJRW50cnk8RT5bXSBsb2NhbFRhYmxlID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGU7Ci0JCWludCBpbmRleCA9IHRoaXMubG9jYWxUYWJsZS5sZW5ndGg7CS8vIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlCi0JCUVudHJ5PEU+IG5leHRFbnRyeSA9IG51bGw7Ci0JCWludCBuZXh0RW50cnlDb3VudCA9IDA7Ci0JCUVudHJ5PEU+IGxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIG1vZENvdW50IHZhbHVlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlbGlldmVzIHRoYXQgdGhlIGJhY2tpbmcKLQkJICogYmFnIHNob3VsZCBoYXZlLiBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKLQkJICogaGFzIGRldGVjdGVkIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50ID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQ7Ci0KLQkJSGFzaEl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMubG9jYWxUYWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChlID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQllID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBlOwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlyZXR1cm4gZSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIEUgbmV4dCgpIHsKLQkJCWlmIChJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZXQgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gdGhpcy5sb2NhbFRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGV0ID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQlldCA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZXQ7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCWlmIChldCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGUgPSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQl0aGlzLm5leHRFbnRyeUNvdW50Kys7Ci0JCQlpZiAodGhpcy5uZXh0RW50cnlDb3VudCA9PSBlLmNvdW50KSB7Ci0JCQkJdGhpcy5uZXh0RW50cnkgPSBlLm5leHQ7Ci0JCQkJdGhpcy5uZXh0RW50cnlDb3VudCA9IDA7Ci0JCQl9Ci0JCQlyZXR1cm4gZS5vYmplY3Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpZiAodGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKElkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMubG9jYWxUYWJsZTsKLQkJCWludCBzbG90ID0gKHRoaXMubGFzdFJldHVybmVkRW50cnkuaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYltzbG90XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZSA9PSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5KSB7Ci0JCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50Kys7Ci0JCQkJCXRoaXMuZXhwZWN0ZWRNb2RDb3VudCsrOwotCQkJCQllLmNvdW50LS07Ci0JCQkJCWlmIChlLmNvdW50ID09IDApIHsKLQkJCQkJCS8vIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBvbmUsIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCQl0YWJbc2xvdF0gPSBlLm5leHQ7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJCX0KLQkJCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBzbGlkZSBiYWNrIHRoZSBjb3VudCB0byBhY2NvdW50IGZvciB0aGUganVzdC1yZW1vdmVkIGVsZW1lbnQKLQkJCQkJCXRoaXMubmV4dEVudHJ5Q291bnQtLTsKLQkJCQkJfQotCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy5jb3VudC0tOwotCQkJCQl0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsJLy8gaXQgY2Fubm90IGJlIHJlbW92ZWQgYWdhaW4KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFVuaXF1ZUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewotCQlFbnRyeTxFPltdIGxvY2FsVGFibGUgPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZTsKLQkJaW50IGluZGV4ID0gdGhpcy5sb2NhbFRhYmxlLmxlbmd0aDsJLy8gc3RhcnQgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUKLQkJRW50cnk8RT4gbmV4dEVudHJ5ID0gbnVsbDsKLQkJRW50cnk8RT4gbGFzdFJldHVybmVkRW50cnkgPSBudWxsOwotCi0JCS8qKgotCQkgKiBUaGUgbW9kQ291bnQgdmFsdWUgdGhhdCB0aGUgaXRlcmF0b3IgYmVsaWV2ZXMgdGhhdCB0aGUgYmFja2luZwotCQkgKiBiYWcgc2hvdWxkIGhhdmUuIElmIHRoaXMgZXhwZWN0YXRpb24gaXMgdmlvbGF0ZWQsIHRoZSBpdGVyYXRvcgotCQkgKiBoYXMgZGV0ZWN0ZWQgYSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4KLQkJICovCi0JCXByaXZhdGUgaW50IGV4cGVjdGVkTW9kQ291bnQgPSBJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudDsKLQotCQlVbmlxdWVJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJRW50cnk8RT4gZSA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLmxvY2FsVGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZSA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZSA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZTsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJcmV0dXJuIGUgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBFIG5leHQoKSB7Ci0JCQlpZiAoSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGV0ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMubG9jYWxUYWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChldCA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZXQgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGV0OwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlpZiAoZXQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IHRoaXMubmV4dEVudHJ5OwotCQkJdGhpcy5uZXh0RW50cnkgPSBlLm5leHQ7Ci0JCQlyZXR1cm4gZS5vYmplY3Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpZiAodGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKElkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMubG9jYWxUYWJsZTsKLQkJCWludCBzbG90ID0gKHRoaXMubGFzdFJldHVybmVkRW50cnkuaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYltzbG90XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZSA9PSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5KSB7Ci0JCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50Kys7Ci0JCQkJCXRoaXMuZXhwZWN0ZWRNb2RDb3VudCsrOwotCQkJCQkvLyByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCXRhYltzbG90XSA9IGUubmV4dDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJfQotCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy51bmlxdWVDb3VudC0tOwotCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy5jb3VudCAtPSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5LmNvdW50OwotCQkJCQl0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsJLy8gaXQgY2Fubm90IGJlIHJlbW92ZWQgYWdhaW4KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJZGVudGl0eUhhc2hCYWcpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJSWRlbnRpdHlIYXNoQmFnPEU+IGIgPSAoSWRlbnRpdHlIYXNoQmFnPEU+KSBvOwotCQkJaWYgKGIuc2l6ZSgpICE9IHRoaXMuc2l6ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJSWRlbnRpdHlIYXNoQmFnPEU+IGNsb25lID0gdGhpcy5jbG9uZSgpOwotCQkJZm9yIChFIGUgOiBiKSB7Ci0JCQkJaWYgKCAhIGNsb25lLnJlbW92ZShlKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNsb25lLmlzRW1wdHkoKTsKLQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQmFnKSB7Ci0JCQkvLyBobW1tLi4uCi0JCQlyZXR1cm4gdGhpcy5idWlsZEJhZygpLmVxdWFscyhvKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgQmFnPEU+IGJ1aWxkQmFnKCkgewotCQlyZXR1cm4gbmV3IEhhc2hCYWcodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IGggPSAwOwotCQlmb3IgKEUgZSA6IHRoaXMpIHsKLQkJCWggKz0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZSk7Ci0JCX0KLQkJcmV0dXJuIGg7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgc3RhdGUgb2YgdGhpcyBiYWcgdG8gYSBzdHJlYW0gKGkuZS4gc2VyaWFsaXplIGl0KS4KLQkgKgotCSAqIEBzZXJpYWxEYXRhIEVtaXQgdGhlIGNhcGFjaXR5IG9mIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzIGluIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IGFsbCBvZiB0aGUgYmFnJ3MgZWxlbWVudHMgKGVhY2ggYW4gT2JqZWN0KSBhbmQKLQkgKiAgICAgdGhlaXIgY291bnRzIChlYWNoIGFuIGludCksIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJLy8gd3JpdGUgb3V0IHRoZSB0aHJlc2hvbGQsIGxvYWQgZmFjdG9yLCBhbmQgYW55IGhpZGRlbiBzdHVmZgotCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCi0JCS8vIHdyaXRlIG91dCBudW1iZXIgb2YgYnVja2V0cwotCQlzLndyaXRlSW50KHRoaXMudGFibGUubGVuZ3RoKTsKLQotCQkvLyB3cml0ZSBvdXQgbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cwotCQlzLndyaXRlSW50KHRoaXMudW5pcXVlQ291bnQpOwotCi0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJLy8gd3JpdGUgb3V0IGVsZW1lbnRzIGFuZCBjb3VudHMgKGFsdGVybmF0aW5nKQotCQlmb3IgKEVudHJ5PEU+IGVudHJ5IDogdGFiKSB7Ci0JCQl3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotCQkJCXMud3JpdGVPYmplY3QoZW50cnkub2JqZWN0KTsKLQkJCQlzLndyaXRlSW50KGVudHJ5LmNvdW50KTsKLQkJCQllbnRyeSA9IGVudHJ5Lm5leHQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFJlY29uc3RpdHV0ZSB0aGUgYmFnIGZyb20gYSBzdHJlYW0gKGkuZS4gZGVzZXJpYWxpemUgaXQpLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkvLyByZWFkIGluIHRoZSB0aHJlc2hvbGQsIGxvYWRmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQotCQkvLyByZWFkIGluIG51bWJlciBvZiBidWNrZXRzIGFuZCBhbGxvY2F0ZSB0aGUgYnVja2V0IGFycmF5Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUocy5yZWFkSW50KCkpOwotCi0JCS8vIHJlYWQgaW4gbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cwotCQlpbnQgdW5pcXVlID0gcy5yZWFkSW50KCk7Ci0KLQkJLy8gcmVhZCB0aGUgZWxlbWVudHMgYW5kIGNvdW50cywgYW5kIHB1dCB0aGUgZWxlbWVudHMgaW4gdGhlIGJhZwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXF1ZTsgaSsrKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUUgZWxlbWVudCA9IChFKSBzLnJlYWRPYmplY3QoKTsKLQkJCWludCBlbGVtZW50Q291bnQgPSBzLnJlYWRJbnQoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudENvdW50OyBqKyspIHsKLQkJCQl0aGlzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0luZGVudGluZ1ByaW50V3JpdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSW5kZW50aW5nUHJpbnRXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhZmIxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSW5kZW50aW5nUHJpbnRXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotLyoqCi0gKiBFeHRlbmQgUHJpbnRXcml0ZXIgdG8gYXV0b21hdGljYWxseSBpbmRlbnQgbmV3IGxpbmVzLgotICovCi1wdWJsaWMgY2xhc3MgSW5kZW50aW5nUHJpbnRXcml0ZXIgZXh0ZW5kcyBQcmludFdyaXRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBpbmRlbnQ7Ci0JcHJpdmF0ZSBpbnQgaW5kZW50TGV2ZWw7Ci0JcHJpdmF0ZSBib29sZWFuIG5lZWRzSW5kZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9JTkRFTlQgPSAiXHQiOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0ZXIgdGhhdCBpbmRlbnRzIHdpdGggdGFicy4KLQkgKi8KLQlwdWJsaWMgSW5kZW50aW5nUHJpbnRXcml0ZXIoV3JpdGVyIG91dCkgewotCQl0aGlzKG91dCwgREVGQVVMVF9JTkRFTlQpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0ZXIgdGhhdCBpbmRlbnRzIHdpdGggdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICovCi0JcHVibGljIEluZGVudGluZ1ByaW50V3JpdGVyKFdyaXRlciBvdXQsIFN0cmluZyBpbmRlbnQpIHsKLQkJc3VwZXIob3V0KTsKLQkJdGhpcy5pbmRlbnQgPSBpbmRlbnQ7Ci0JCXRoaXMuaW5kZW50TGV2ZWwgPSAwOwotCQl0aGlzLm5lZWRzSW5kZW50ID0gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IGZsYWcgc28gZm9sbG93aW5nIGxpbmUgaXMgaW5kZW50ZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbnRsbigpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXN1cGVyLnByaW50bG4oKTsKLQkJCXRoaXMubmVlZHNJbmRlbnQgPSB0cnVlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByaW50IHRoZSBhcHByb3ByaWF0ZSBpbmRlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50SW5kZW50KCkgewotCQlpZiAodGhpcy5uZWVkc0luZGVudCkgewotCQkJdGhpcy5uZWVkc0luZGVudCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IHRoaXMuaW5kZW50TGV2ZWw7IGktLSA+IDA7ICkgewotCQkJCXRoaXMucHJpbnQodGhpcy5pbmRlbnQpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgYnVmW10sIGludCBvZmYsIGludCBsZW4pIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMucHJpbnRJbmRlbnQoKTsKLQkJCXN1cGVyLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFdyaXRlIGEgc2luZ2xlIGNoYXJhY3Rlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5wcmludEluZGVudCgpOwotCQkJc3VwZXIud3JpdGUoYyk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogV3JpdGUgYSBwb3J0aW9uIG9mIGEgc3RyaW5nLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzLCBpbnQgb2ZmLCBpbnQgbGVuKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCQl0aGlzLnByaW50SW5kZW50KCk7Ci0JCQlzdXBlci53cml0ZShzLCBvZmYsIGxlbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQnVtcCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGluZGVudCgpIHsKLQkJdGhpcy5pbmNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCX0KLQkKLQkvKioKLQkgKiBEZWNyZW1lbnQgdGhlIGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRlbnQoKSB7Ci0JCXRoaXMuZGVjcmVtZW50SW5kZW50TGV2ZWwoKTsKLQl9Ci0JCi0JLyoqCi0JICogQnVtcCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGluY3JlbWVudEluZGVudExldmVsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5pbmRlbnRMZXZlbCsrOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERlY3JlbWVudCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlY3JlbWVudEluZGVudExldmVsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5pbmRlbnRMZXZlbC0tOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBpbmRlbnQgbGV2ZWwuCi0JICovCi0JcHVibGljIGludCBpbmRlbnRMZXZlbCgpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZW50TGV2ZWw7Ci0JfQotCQotCS8qKgotCSAqIEFsbG93IHRoZSBpbmRlbnQgbGV2ZWwgdG8gYmUgc2V0IGRpcmVjdGx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZGVudExldmVsKGludCBpbmRlbnRMZXZlbCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5pbmRlbnRMZXZlbCA9IGluZGVudExldmVsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NzM2NDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0pEQkNUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnNxbC5UeXBlczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotCi0vKioKLSAqIEhlbHBlciBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGggdGhlIEpEQkMgQVBJLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSkRCQ1Rvb2xzIHsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKREJDIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIGpkYmNUeXBlRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCUphdmFUb0pEQkNUeXBlTWFwcGluZyBtYXBwaW5nID0gamF2YVRvSkRCQ1R5cGVNYXBwaW5nKGNsYXNzTmFtZSk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IERFRkFVTFRfSkRCQ19UWVBFIDogbWFwcGluZy5nZXRKREJDVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKREJDVHlwZSBqZGJjVHlwZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGpkYmNUeXBlRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEQkMgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkRCQ1R5cGUgamRiY1R5cGVGb3IoSmF2YVR5cGUgamF2YVR5cGUpIHsKLQkJcmV0dXJuIGpkYmNUeXBlRm9yQ2xhc3NOYW1lZChqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKREJDIHR5cGUuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3JKREJDVHlwZU5hbWVkKFN0cmluZyBqZGJjVHlwZU5hbWUpIHsKLQkJSkRCQ1RvSmF2YVR5cGVNYXBwaW5nIG1hcHBpbmcgPSBqZGJjVG9KYXZhVHlwZU1hcHBpbmcoamRiY1R5cGVOYW1lKTsKLQkJcmV0dXJuIChtYXBwaW5nID09IG51bGwpID8gREVGQVVMVF9KQVZBX1RZUEUgOiBtYXBwaW5nLmdldEphdmFUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEpEQkMgdHlwZS4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZSBqYXZhVHlwZUZvcihKREJDVHlwZSBqZGJjVHlwZSkgewotCQlyZXR1cm4gamF2YVR5cGVGb3JKREJDVHlwZU5hbWVkKGpkYmNUeXBlLm5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEpEQkMgdHlwZS4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZSBqYXZhVHlwZUZvckpEQkNUeXBlQ29kZShpbnQgamRiY1R5cGVDb2RlKSB7Ci0JCXJldHVybiBqYXZhVHlwZUZvcihKREJDVHlwZS50eXBlKGpkYmNUeXBlQ29kZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBzdHVmZiAqKioqKioqKioqCi0KLQotCS8vICoqKioqKioqKiogSkRCQyA9PiBKYXZhICoqKioqKioqKioKLQotCS8qKgotCSAqIEpEQkMgPT4gSmF2YSB0eXBlIG1hcHBpbmdzLCBrZXllZCBieSBKREJDIHR5cGUgbmFtZSAoZS5nLiAiVkFSQ0hBUiIpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4gSkRCQ19UT19KQVZBX1RZUEVfTUFQUElOR1M7ICAvLyBwc2V1ZG8gJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBERUZBVUxUX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsgIC8vIFRPRE8gT2JqZWN0IGlzIHRoZSBkZWZhdWx0PwotCi0KLQlwcml2YXRlIHN0YXRpYyBKREJDVG9KYXZhVHlwZU1hcHBpbmcgamRiY1RvSmF2YVR5cGVNYXBwaW5nKFN0cmluZyBqZGJjVHlwZU5hbWUpIHsKLQkJcmV0dXJuIGpkYmNUb0phdmFUeXBlTWFwcGluZ3MoKS5nZXQoamRiY1R5cGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4gamRiY1RvSmF2YVR5cGVNYXBwaW5ncygpIHsKLQkJaWYgKEpEQkNfVE9fSkFWQV9UWVBFX01BUFBJTkdTID09IG51bGwpIHsKLQkJCUpEQkNfVE9fSkFWQV9UWVBFX01BUFBJTkdTID0gYnVpbGRKREJDVG9KYXZhVHlwZU1hcHBpbmdzKCk7Ci0JCX0KLQkJcmV0dXJuIEpEQkNfVE9fSkFWQV9UWVBFX01BUFBJTkdTOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IGJ1aWxkSkRCQ1RvSmF2YVR5cGVNYXBwaW5ncygpIHsKLQkJSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4gbWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4oKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nc1RvKG1hcHBpbmdzKTsKLQkJcmV0dXJuIG1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIGhhcmQgY29kZSB0aGUgZGVmYXVsdCBtYXBwaW5ncyBmcm9tIHRoZSBKREJDIHR5cGVzIHRvIHRoZQotCSAqIGFwcHJvcHJpYXRlIEphdmEgdHlwZXMKLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICogc2VlICJKREJDIDMuMCBTcGVjaWZpY2F0aW9uIiBBcHBlbmRpeCBCCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdzVG8oSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4gbWFwcGluZ3MpIHsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQVJSQVksIGphdmEuc3FsLkFycmF5LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkJJR0lOVCwgbG9uZy5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5CSU5BUlksIGJ5dGVbXS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5CSVQsIGJvb2xlYW4uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQkxPQiwgamF2YS5zcWwuQmxvYi5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5CT09MRUFOLCBib29sZWFuLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkNIQVIsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQ0xPQiwgamF2YS5zcWwuQ2xvYi5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5EQVRBTElOSywgamF2YS5uZXQuVVJMLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkRBVEUsIGphdmEuc3FsLkRhdGUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuREVDSU1BTCwgamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuRElTVElOQ1QsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsgIC8vID8/PwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5ET1VCTEUsIGRvdWJsZS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5GTE9BVCwgZG91YmxlLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLklOVEVHRVIsIGludC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5KQVZBX09CSkVDVCwgamF2YS5sYW5nLk9iamVjdC5jbGFzcywgbWFwcGluZ3MpOyAgLy8gPz8/Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkxPTkdWQVJCSU5BUlksIGJ5dGVbXS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5MT05HVkFSQ0hBUiwgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgbWFwcGluZ3MpOwotCQkvLyBub3Qgc3VyZSB3aHkgdGhpcyBpcyBkZWZpbmVkIGluIGphdmEuc3FsLlR5cGVzCi0vLwkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuTlVMTCwgamF2YS5sYW5nLk9iamVjdC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5OVU1FUklDLCBqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5PVEhFUiwgamF2YS5sYW5nLk9iamVjdC5jbGFzcywgbWFwcGluZ3MpOwkvLyA/Pz8KLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuUkVBTCwgZmxvYXQuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuUkVGLCBqYXZhLnNxbC5SZWYuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuU01BTExJTlQsIHNob3J0LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlNUUlVDVCwgamF2YS5zcWwuU3RydWN0LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlRJTUUsIGphdmEuc3FsLlRpbWUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVElNRVNUQU1QLCBqYXZhLnNxbC5UaW1lc3RhbXAuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVElOWUlOVCwgYnl0ZS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5WQVJCSU5BUlksIGJ5dGVbXS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5WQVJDSEFSLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBtYXBwaW5ncyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhpbnQgamRiY1R5cGVDb2RlLCBDbGFzczw/PiBqYXZhQ2xhc3MsIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCS8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCUpEQkNUeXBlIGpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShqZGJjVHlwZUNvZGUpOwotCQlPYmplY3QgcHJldiA9IG1hcHBpbmdzLnB1dChqZGJjVHlwZS5uYW1lKCksIGJ1aWxkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nKGpkYmNUeXBlLCBqYXZhQ2xhc3MpKTsKLQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVwbGljYXRlIEpEQkMgdHlwZTogIiArIGpkYmNUeXBlLm5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBKREJDVG9KYXZhVHlwZU1hcHBpbmcgYnVpbGRKREJDVG9KYXZhVHlwZU1hcHBpbmcoSkRCQ1R5cGUgamRiY1R5cGUsIENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmV3IEpEQkNUb0phdmFUeXBlTWFwcGluZyhqZGJjVHlwZSwgbmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhID0+IEpEQkMgKioqKioqKioqKgotCi0JLyoqCi0JICogSmF2YSA9PiBKREJDIHR5cGUgbWFwcGluZ3MsIGtleWVkIGJ5IEphdmEgY2xhc3MgbmFtZSAoZS5nLiAiamF2YS5sYW5nLk9iamVjdCIpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1M7ICAvLyBwc2V1ZG8gJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKREJDVHlwZSBERUZBVUxUX0pEQkNfVFlQRSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuVkFSQ0hBUik7ICAvLyBUT0RPIFZBUkNIQVIgaXMgdGhlIGRlZmF1bHQ/Ci0KLQotCXByaXZhdGUgc3RhdGljIEphdmFUb0pEQkNUeXBlTWFwcGluZyBqYXZhVG9KREJDVHlwZU1hcHBpbmcoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gamF2YVRvSkRCQ1R5cGVNYXBwaW5ncygpLmdldChjbGFzc05hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBqYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlpZiAoSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1MgPT0gbnVsbCkgewotCQkJSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1MgPSBidWlsZEphdmFUb0pEQkNUeXBlTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1M7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gYnVpbGRKYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPigpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdzVG8obWFwcGluZ3MpOwotCQlyZXR1cm4gbWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogaGFyZCBjb2RlIHRoZSBkZWZhdWx0IG1hcHBpbmdzIGZyb20gdGhlIEphdmEgdHlwZXMgdG8gdGhlCi0JICogYXBwcm9wcmlhdGUgSkRCQyB0eXBlcwotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKiBzZWUgIkpEQkMgMy4wIFNwZWNpZmljYXRpb24iIEFwcGVuZGl4IEIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ3NUbyhIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncykgewotCQkvLyBwcmltaXRpdmVzCi0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGJvb2xlYW4uY2xhc3MsIFR5cGVzLkJJVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhieXRlLmNsYXNzLCBUeXBlcy5USU5ZSU5ULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGRvdWJsZS5jbGFzcywgVHlwZXMuRE9VQkxFLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGZsb2F0LmNsYXNzLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGludC5jbGFzcywgVHlwZXMuSU5URUdFUiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhsb25nLmNsYXNzLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oc2hvcnQuY2xhc3MsIFR5cGVzLlNNQUxMSU5ULCBtYXBwaW5ncyk7Ci0KLQkJLy8gcmVmZXJlbmNlIGNsYXNzZXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MsIFR5cGVzLkJJVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuQnl0ZS5jbGFzcywgVHlwZXMuVElOWUlOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuRG91YmxlLmNsYXNzLCBUeXBlcy5ET1VCTEUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkZsb2F0LmNsYXNzLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLCBUeXBlcy5JTlRFR0VSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5Mb25nLmNsYXNzLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLlNob3J0LmNsYXNzLCBUeXBlcy5TTUFMTElOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBUeXBlcy5WQVJDSEFSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBUeXBlcy5OVU1FUklDLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubmV0LlVSTC5jbGFzcywgVHlwZXMuREFUQUxJTkssIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQXJyYXkuY2xhc3MsIFR5cGVzLkFSUkFZLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLkJsb2IuY2xhc3MsIFR5cGVzLkJMT0IsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQ2xvYi5jbGFzcywgVHlwZXMuQ0xPQiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLnNxbC5EYXRlLmNsYXNzLCBUeXBlcy5EQVRFLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlJlZi5jbGFzcywgVHlwZXMuUkVGLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlN0cnVjdC5jbGFzcywgVHlwZXMuU1RSVUNULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlRpbWUuY2xhc3MsIFR5cGVzLlRJTUUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLCBUeXBlcy5USU1FU1RBTVAsIG1hcHBpbmdzKTsKLQotCQkvLyBhcnJheXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oYnl0ZVtdLmNsYXNzLCBUeXBlcy5WQVJCSU5BUlksIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkJ5dGVbXS5jbGFzcywgVHlwZXMuVkFSQklOQVJZLCBtYXBwaW5ncyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhDbGFzczw/PiBqYXZhQ2xhc3MsIGludCBqZGJjVHlwZUNvZGUsIEhhc2hNYXA8U3RyaW5nLCBKYXZhVG9KREJDVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCS8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCU9iamVjdCBwcmV2ID0gbWFwcGluZ3MucHV0KGphdmFDbGFzcy5nZXROYW1lKCksIGJ1aWxkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nKGphdmFDbGFzcywgamRiY1R5cGVDb2RlKSk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBKYXZhIGNsYXNzOiAiICsgKChKYXZhVG9KREJDVHlwZU1hcHBpbmcpIHByZXYpLmdldEphdmFUeXBlKCkuZGVjbGFyYXRpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBKYXZhVG9KREJDVHlwZU1hcHBpbmcgYnVpbGRKYXZhVG9KREJDVHlwZU1hcHBpbmcoQ2xhc3M8Pz4gamF2YUNsYXNzLCBpbnQgamRiY1R5cGVDb2RlKSB7Ci0JCXJldHVybiBuZXcgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nKG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhQ2xhc3MpLCBKREJDVHlwZS50eXBlKGpkYmNUeXBlQ29kZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSkRCQ1Rvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogSkRCQyA9PiBKYXZhCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nIHsKLQkJcHJpdmF0ZSBmaW5hbCBKREJDVHlwZSBqZGJjVHlwZTsKLQkJcHJpdmF0ZSBmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZTsKLQotCQlKREJDVG9KYXZhVHlwZU1hcHBpbmcoSkRCQ1R5cGUgamRiY1R5cGUsIEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5qZGJjVHlwZSA9IGpkYmNUeXBlOwotCQkJdGhpcy5qYXZhVHlwZSA9IGphdmFUeXBlOwotCQl9Ci0KLQkJcHVibGljIEpEQkNUeXBlIGdldEpEQkNUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YVR5cGUgZ2V0SmF2YVR5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoaW50IGpkYmNUeXBlQ29kZSkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGUuY29kZSgpID09IGpkYmNUeXBlQ29kZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoU3RyaW5nIGpkYmNUeXBlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGUubmFtZSgpLmVxdWFscyhqZGJjVHlwZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhKREJDVHlwZSB0eXBlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZSA9PSB0eXBlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCXRoaXMuYXBwZW5kVG8oc2IpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQl0aGlzLmpkYmNUeXBlLmFwcGVuZFRvKHNiKTsKLQkJCXNiLmFwcGVuZCgiID0+ICIpOwotCQkJdGhpcy5qYXZhVHlwZS5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogSmF2YSA9PiBKREJDCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nIHsKLQkJcHJpdmF0ZSBmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZTsKLQkJcHJpdmF0ZSBmaW5hbCBKREJDVHlwZSBqZGJjVHlwZTsKLQotCQlKYXZhVG9KREJDVHlwZU1hcHBpbmcoSmF2YVR5cGUgamF2YVR5cGUsIEpEQkNUeXBlIGpkYmNUeXBlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5qYXZhVHlwZSA9IGphdmFUeXBlOwotCQkJdGhpcy5qZGJjVHlwZSA9IGpkYmNUeXBlOwotCQl9Ci0KLQkJcHVibGljIEphdmFUeXBlIGdldEphdmFUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuamF2YVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSkRCQ1R5cGUgZ2V0SkRCQ1R5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoSmF2YVR5cGUganQpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlLmVxdWFscyhqdCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXBzKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoU3RyaW5nIGphdmFDbGFzc05hbWUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlLmRlc2NyaWJlcyhqYXZhQ2xhc3NOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZS5kZXNjcmliZXMoamF2YUNsYXNzKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQl0aGlzLmFwcGVuZFRvKHNiKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJdGhpcy5qYXZhVHlwZS5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJCXNiLmFwcGVuZCgiID0+ICIpOwotCQkJdGhpcy5qZGJjVHlwZS5hcHBlbmRUbyhzYik7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0pEQkNUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhZTI5NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5zcWwuVHlwZXM7Ci1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIEFzc29jaWF0ZSB0aGUgSmF2YSBjb25zdGFudCBhbmQgdGhlIEpEQkMgdHlwZSBuYW1lLgotICogVGhlc2UgYXJlIGRlcml2ZWQgZnJvbSBqYXZhLnNxbC5UeXBlcy4KLSAqIAotICogQHNlZSBqYXZhLnNxbC5UeXBlcwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSkRCQ1R5cGUKLQlpbXBsZW1lbnRzIENvbXBhcmFibGU8SkRCQ1R5cGU+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCi0JLyoqCi0JICogdGhlIGNvbnN0YW50IG5hbWUgKGUuZy4gVkFSQ0hBUikKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogdGhlIEpEQkMgY29kZSB1c2VkIGJ5IEpEQkMgZHJpdmVycwotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IGNvZGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSkRCQyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB0eXBlIGNvZGUuCi0JICogVGhpcyBpcyBwcml2YXRlIGJlY2F1c2UgYWxsIHRoZSBwb3NzaWJsZSBKREJDIHR5cGVzIGFyZSBidWlsdCBhbmQKLQkgKiBzdG9yZWQgaW4gdGhlIHN0YXRpYyBhcnJheSBUWVBFUy4KLQkgKiBAc2VlICN0eXBlcygpCi0JICovCi0JcHJpdmF0ZSBKREJDVHlwZShTdHJpbmcgbmFtZSwgaW50IGNvZGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5jb2RlID0gY29kZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSwgYXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIG5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgY29kZSwgYXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcy4KLQkgKi8KLQlwdWJsaWMgaW50IGNvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvZGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50aW5nIGFuZCBkaXNwbGF5aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZChDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCXRoaXMuYXBwZW5kVG8oc2IpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpEQkNUeXBlIGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChKREJDVHlwZSkgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhKREJDVHlwZSB0eXBlKSB7Ci0JCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGhpcy5uYW1lLCB0eXBlLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgc3R1ZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogYWxsIHRoZSBKREJDIHR5cGUgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEpEQkNUeXBlW10gVFlQRVM7CQkvLyBwc2V1ZG8gJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSkRCQ1R5cGVbXSB0eXBlcygpIHsKLQkJaWYgKFRZUEVTID09IG51bGwpIHsKLQkJCVRZUEVTID0gYnVpbGRUeXBlcygpOwotCQl9Ci0JCXJldHVybiBUWVBFUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEQkMgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIGNvZGUgKGUuZy4gVHlwZXMuVkFSQ0hBUikuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkRCQ1R5cGUgdHlwZShpbnQgY29kZSkgewotCQlKREJDVHlwZVtdIHR5cGVzID0gdHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IHR5cGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAodHlwZXNbaV0uY29kZSgpID09IGNvZGUpIHsKLQkJCQlyZXR1cm4gdHlwZXNbaV07Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBKREJDIHR5cGUgY29kZTogIiArIGNvZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZSAoZS5nLiAiVkFSQ0hBUiIpLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIHR5cGUoU3RyaW5nIG5hbWUpIHsKLQkJSkRCQ1R5cGVbXSB0eXBlcyA9IHR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSB0eXBlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKHR5cGVzW2ldLm5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gdHlwZXNbaV07Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBKREJDIHR5cGUgbmFtZTogIiArIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIHVwIHRoZSBKREJDIHR5cGVzIHZpYSByZWZsZWN0aW9uCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEpEQkNUeXBlW10gYnVpbGRUeXBlcygpIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBUeXBlcy5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotCQlpbnQgbGVuID0gZmllbGRzLmxlbmd0aDsKLQkJSkRCQ1R5cGVbXSB0eXBlcyA9IG5ldyBKREJDVHlwZVtsZW5dOwotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCWludCBjb2RlOwotCQkJdHJ5IHsKLQkJCQljb2RlID0gKChJbnRlZ2VyKSBmaWVsZHNbaV0uZ2V0KG51bGwpKS5pbnRWYWx1ZSgpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsJLy8gc2hvdWxkbid0IGhhcHBlbi4uLgotCQkJfQotCQkJdHlwZXNbaV0gPSBuZXcgSkRCQ1R5cGUobmFtZSwgY29kZSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL05hbWVUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL05hbWVUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYThiNTYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9OYW1lVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLS8qKgotICogVmFyaW91cyBoZWxwZXIgbWV0aG9kcyBmb3IgZ2VuZXJhdGluZyBuYW1lcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hbWVUb29scyB7Ci0KLQkvKioKLQkgKiBHaXZlbiBhICJyb290IiBuYW1lIGFuZCBhIHNldCBvZiBleGlzdGluZyBuYW1lcywgZ2VuZXJhdGUgYSB1bmlxdWUsCi0JICogSmF2YS1sZWdhbCBuYW1lIHRoYXQgaXMgZWl0aGVyIHRoZSAicm9vdCIgbmFtZSBvciBzb21lIHZhcmlhdGlvbiBvbgotCSAqIHRoZSAicm9vdCIgbmFtZSAoZS5nLiAicm9vdDIiLCAicm9vdDMiLC4uLikuCi0JICogVGhlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVKYXZhTmFtZUZvcihTdHJpbmcgcm9vdE5hbWUsIEl0ZXJhdG9yPFN0cmluZz4gZXhpc3RpbmdOYW1lcykgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lczIgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KGV4aXN0aW5nTmFtZXMpOwotCQlleGlzdGluZ05hbWVzMi5hZGRBbGwoSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQpOwotCQlyZXR1cm4gdW5pcXVlTmFtZUZvcihyb290TmFtZSwgZXhpc3RpbmdOYW1lczIsIHJvb3ROYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gYSAicm9vdCIgbmFtZSBhbmQgYSBzZXQgb2YgZXhpc3RpbmcgbmFtZXMsIGdlbmVyYXRlIGEgdW5pcXVlLAotCSAqIEphdmEtbGVnYWwgbmFtZSB0aGF0IGlzIGVpdGhlciB0aGUgInJvb3QiIG5hbWUgb3Igc29tZSB2YXJpYXRpb24gb24KLQkgKiB0aGUgInJvb3QiIG5hbWUgKGUuZy4gInJvb3QyIiwgInJvb3QzIiwuLi4pLgotCSAqIFRoZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlSmF2YU5hbWVGb3IoU3RyaW5nIHJvb3ROYW1lLCBDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lcykgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lczIgPSBuZXcgSGFzaFNldDxTdHJpbmc+KGV4aXN0aW5nTmFtZXMpOwotCQlleGlzdGluZ05hbWVzMi5hZGRBbGwoSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQpOwotCQlyZXR1cm4gdW5pcXVlTmFtZUZvcihyb290TmFtZSwgZXhpc3RpbmdOYW1lczIsIHJvb3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhICJyb290IiBuYW1lIGFuZCBhIHNldCBvZiBleGlzdGluZyBuYW1lcywgZ2VuZXJhdGUgYSB1bmlxdWUKLQkgKiBuYW1lIHRoYXQgaXMgZWl0aGVyIHRoZSAicm9vdCIgbmFtZSBvciBzb21lIHZhcmlhdGlvbiBvbiB0aGUgInJvb3QiCi0JICogbmFtZSAoZS5nLiAicm9vdDIiLCAicm9vdDMiLC4uLikuIFRoZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcihTdHJpbmcgcm9vdE5hbWUsIEl0ZXJhdG9yPFN0cmluZz4gZXhpc3RpbmdOYW1lcykgewotCQlyZXR1cm4gdW5pcXVlTmFtZUZvcihyb290TmFtZSwgQ29sbGVjdGlvblRvb2xzLnNldChleGlzdGluZ05hbWVzKSk7Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGEgInJvb3QiIG5hbWUgYW5kIGEgc2V0IG9mIGV4aXN0aW5nIG5hbWVzLCBnZW5lcmF0ZSBhIHVuaXF1ZQotCSAqIG5hbWUgdGhhdCBpcyBlaXRoZXIgdGhlICJyb290IiBuYW1lIG9yIHNvbWUgdmFyaWF0aW9uIG9uIHRoZSAicm9vdCIKLQkgKiBuYW1lIChlLmcuICJyb290MiIsICJyb290MyIsLi4uKS4gVGhlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVOYW1lRm9yKFN0cmluZyByb290TmFtZSwgQ29sbGVjdGlvbjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMpIHsKLQkJcmV0dXJuIHVuaXF1ZU5hbWVGb3Iocm9vdE5hbWUsIGV4aXN0aW5nTmFtZXMsIHJvb3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhICJyb290IiBuYW1lIGFuZCBhIHNldCBvZiBleGlzdGluZyBuYW1lcywgZ2VuZXJhdGUgYSB1bmlxdWUKLQkgKiBuYW1lIHRoYXQgaXMgZWl0aGVyIHRoZSAicm9vdCIgbmFtZSBvciBzb21lIHZhcmlhdGlvbiBvbiB0aGUgInJvb3QiCi0JICogbmFtZSAoZS5nLiAicm9vdDIiLCAicm9vdDMiLC4uLikuIFRoZSBuYW1lcyBhcmUgTk9UIGNhc2Utc2Vuc2l0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKFN0cmluZyByb290TmFtZSwgSXRlcmF0b3I8U3RyaW5nPiBleGlzdGluZ05hbWVzKSB7Ci0JCXJldHVybiB1bmlxdWVOYW1lRm9ySWdub3JlQ2FzZShyb290TmFtZSwgQ29sbGVjdGlvblRvb2xzLnNldChleGlzdGluZ05hbWVzKSk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSAicm9vdCIgbmFtZSBhbmQgYSBzZXQgb2YgZXhpc3RpbmcgbmFtZXMsIGdlbmVyYXRlIGEgdW5pcXVlCi0JICogbmFtZSB0aGF0IGlzIGVpdGhlciB0aGUgInJvb3QiIG5hbWUgb3Igc29tZSB2YXJpYXRpb24gb24gdGhlICJyb290IgotCSAqIG5hbWUgKGUuZy4gInJvb3QyIiwgInJvb3QzIiwuLi4pLiBUaGUgbmFtZXMgYXJlIE5PVCBjYXNlLXNlbnNpdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVOYW1lRm9ySWdub3JlQ2FzZShTdHJpbmcgcm9vdE5hbWUsIENvbGxlY3Rpb248U3RyaW5nPiBleGlzdGluZ05hbWVzKSB7Ci0JCXJldHVybiB1bmlxdWVOYW1lRm9yKHJvb3ROYW1lLCBjb252ZXJ0VG9Mb3dlckNhc2UoZXhpc3RpbmdOYW1lcyksIHJvb3ROYW1lLnRvTG93ZXJDYXNlKCkpOwotCX0KLQotCS8qKgotCSAqIHVzZSB0aGUgc3VmZml4ZWQgInRlbXBsYXRlIiBuYW1lIHRvIHBlcmZvcm0gdGhlIGNvbXBhcmlzb25zLCBidXQgUkVUVVJOCi0JICogdGhlIHN1ZmZpeGVkICJyb290IiBuYW1lOyB0aGlzIGFsbG93cyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb25zCi0JICogKGkuZS4gdGhlICJ0ZW1wbGF0ZSIgbmFtZSBoYXMgYmVlbiBtb3JwaGVkIHRvIHRoZSBzYW1lIGNhc2UgYXMKLQkgKiB0aGUgImV4aXN0aW5nIiBuYW1lcywgd2hpbGUgdGhlICJyb290IiBuYW1lIGhhcyBub3QsIGJ1dCB0aGUgInJvb3QiIG5hbWUKLQkgKiBpcyB3aGF0IHRoZSBjbGllbnQgd2FudHMgbW9ycGhlZCB0byBiZSB1bmlxdWUpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVuaXF1ZU5hbWVGb3IoU3RyaW5nIHJvb3ROYW1lLCBDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lcywgU3RyaW5nIHRlbXBsYXRlTmFtZSkgewotCQlpZiAoICEgZXhpc3RpbmdOYW1lcy5jb250YWlucyh0ZW1wbGF0ZU5hbWUpKSB7Ci0JCQlyZXR1cm4gcm9vdE5hbWU7Ci0JCX0KLQkJU3RyaW5nIHVuaXF1ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0JCWZvciAoaW50IHN1ZmZpeCA9IDI7IHRydWU7IHN1ZmZpeCsrKSB7Ci0JCQlpZiAoICEgZXhpc3RpbmdOYW1lcy5jb250YWlucyh1bmlxdWVOYW1lICsgc3VmZml4KSkgewotCQkJCXJldHVybiByb290TmFtZS5jb25jYXQoU3RyaW5nLnZhbHVlT2Yoc3VmZml4KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiBzdHJpbmdzIHRvIGEgY29sbGVjdGlvbiBvZiB0aGUgc2FtZQotCSAqIHN0cmluZ3MgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxTdHJpbmc+IGNvbnZlcnRUb0xvd2VyQ2FzZShDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncykgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPihzdHJpbmdzLnNpemUoKSk7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IHN0cmluZ3MpIHsKLQkJCXJlc3VsdC5hZGQoc3RyaW5nLnRvTG93ZXJDYXNlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBmdWxseS1xdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBkYXRhYmFzZSBvYmplY3QuCi0JICogVmFyaWF0aW9uczoKLQkgKiAgICAgY2F0YWxvZy5zY2hlbWEubmFtZQotCSAqICAgICBjYXRhbG9nLi5uYW1lCi0JICogICAgIHNjaGVtYS5uYW1lCi0JICogICAgIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZShTdHJpbmcgY2F0YWxvZywgU3RyaW5nIHNjaGVtYSwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKChjYXRhbG9nID09IG51bGwpICYmIChzY2hlbWEgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7Ci0JCWlmIChjYXRhbG9nICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZChjYXRhbG9nKTsKLQkJCXNiLmFwcGVuZCgnLicpOwotCQl9Ci0JCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKHNjaGVtYSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCcuJyk7Ci0JCXNiLmFwcGVuZChuYW1lKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNldCBvZiByZXNlcnZlZCB3b3JkcyBpbiB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZS4KLQkgKiBUaGVzZSB3b3JkcyBjYW5ub3QgYmUgdXNlZCBhcyBpZGVudGlmaWVycyAoaS5lLiBuYW1lcykuCi0JICogaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3R1dG9yaWFsL2phdmEvbnV0c2FuZGJvbHRzL19rZXl3b3Jkcy5odG1sCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKQVZBX1JFU0VSVkVEX1dPUkRTID0gbmV3IFN0cmluZ1tdIHsKLQkJCQkiYWJzdHJhY3QiLAotCQkJCSJhc3NlcnQiLCAgLy8gamRrIDEuNAotCQkJCSJib29sZWFuIiwKLQkJCQkiYnJlYWsiLAotCQkJCSJieXRlIiwKLQkJCQkiY2FzZSIsCi0JCQkJImNhdGNoIiwKLQkJCQkiY2hhciIsCi0JCQkJImNsYXNzIiwKLQkJCQkiY29uc3QiLCAgLy8gdW51c2VkCi0JCQkJImNvbnRpbnVlIiwKLQkJCQkiZGVmYXVsdCIsCi0JCQkJImRvIiwKLQkJCQkiZG91YmxlIiwKLQkJCQkiZWxzZSIsCi0JCQkJImVudW0iLCAgLy8gamRrIDEuNQotCQkJCSJleHRlbmRzIiwKLQkJCQkiZmFsc2UiLAotCQkJCSJmaW5hbCIsCi0JCQkJImZpbmFsbHkiLAotCQkJCSJmbG9hdCIsCi0JCQkJImZvciIsCi0JCQkJImdvdG8iLCAgLy8gdW51c2VkCi0JCQkJImlmIiwKLQkJCQkiaW1wbGVtZW50cyIsCi0JCQkJImltcG9ydCIsCi0JCQkJImluc3RhbmNlb2YiLAotCQkJCSJpbnQiLAotCQkJCSJpbnRlcmZhY2UiLAotCQkJCSJsb25nIiwKLQkJCQkibmF0aXZlIiwKLQkJCQkibmV3IiwKLQkJCQkibnVsbCIsCi0JCQkJInBhY2thZ2UiLAotCQkJCSJwcml2YXRlIiwKLQkJCQkicHJvdGVjdGVkIiwKLQkJCQkicHVibGljIiwKLQkJCQkicmV0dXJuIiwKLQkJCQkic2hvcnQiLAotCQkJCSJzdGF0aWMiLAotCQkJCSJzdHJpY3RmcCIsICAvLyBqZGsgMS4yCi0JCQkJInN1cGVyIiwKLQkJCQkic3dpdGNoIiwKLQkJCQkic3luY2hyb25pemVkIiwKLQkJCQkidGhpcyIsCi0JCQkJInRocm93IiwKLQkJCQkidGhyb3dzIiwKLQkJCQkidHJhbnNpZW50IiwKLQkJCQkidHJ1ZSIsCi0JCQkJInRyeSIsCi0JCQkJInZvaWQiLAotCQkJCSJ2b2xhdGlsZSIsCi0JCQkJIndoaWxlIgotCQkJfTsKLQotCS8qKgotCSAqIFRoZSBzZXQgb2YgcmVzZXJ2ZWQgd29yZHMgaW4gdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCi0JICogVGhlc2Ugd29yZHMgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllcnMgKGkuZS4gbmFtZXMpLgotCSAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy90dXRvcmlhbC9qYXZhL251dHNhbmRib2x0cy9fa2V5d29yZHMuaHRtbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KEpBVkFfUkVTRVJWRURfV09SRFMpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXQgb2YgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSByZXNlcnZlZCB3b3Jkcy4KLQkgKiBUaGVzZSB3b3JkcyBjYW5ub3QgYmUgdXNlZCBhcyBpZGVudGlmaWVycyAoaS5lLiBuYW1lcykuCi0JICogaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3R1dG9yaWFsL2phdmEvbnV0c2FuZGJvbHRzL19rZXl3b3Jkcy5odG1sCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IGphdmFSZXNlcnZlZFdvcmRzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVZBX1JFU0VSVkVEX1dPUkRTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCi0JICogYnkgc3Vic3RpdHV0aW5nIGFuIHVuZGVyc2NvcmUgJ18nIGZvciBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzCi0JICogaW4gdGhlIHN0cmluZyBhbmQgYXBwZW5kaW5nIGFuIHVuZGVyc2NvcmUgJ18nIHRvIHRoZSBzdHJpbmcgaWYKLQkgKiBpdCBpcyBhIEphdmEgcmVzZXJ2ZWQgd29yZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihzdHJpbmcsICdfJyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgotCSAqIGJ5IHN1YnN0aXR1dGluZyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBmb3IgYW55IGludmFsaWQgY2hhcmFjdGVycwotCSAqIGluIHRoZSBzdHJpbmcgYW5kLCBpZiBuZWNlc3NhcnksIGFwcGVuZGluZyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIHRvIHRoZSBzdHJpbmcgdW50aWwgaXQgaXMgbm90IGEgSmF2YSByZXNlcnZlZCB3b3JkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKFN0cmluZyBzdHJpbmcsIGNoYXIgYykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKEpBVkFfUkVTRVJWRURfV09SRFNfU0VULmNvbnRhaW5zKHN0cmluZykpIHsKLQkJCS8vIGEgcmVzZXJ2ZWQgd29yZCBpcyBhIHZhbGlkIGlkZW50aWZpZXIsIHdlIGp1c3QgbmVlZCB0byB0d2VhayBpdCBhIGJpdAotCQkJY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclBhcnQoYyk7Ci0JCQlyZXR1cm4gY29udmVydFRvSmF2YUlkZW50aWZpZXIoc3RyaW5nICsgYywgYyk7Ci0JCX0KLQkJY2hhcltdIGFycmF5ID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCXJldHVybiAoY29udmVydFRvSmF2YUlkZW50aWZpZXJfKGFycmF5LCBjKSkgPyBuZXcgU3RyaW5nKGFycmF5KSA6IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCi0JICogYnkgc3Vic3RpdHV0aW5nIGFuIHVuZGVyc2NvcmUgJ18nIGZvciBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzCi0JICogaW4gdGhlIHN0cmluZyBhbmQgYXBwZW5kaW5nIGFuIHVuZGVyc2NvcmUgJ18nIHRvIHRoZSBzdHJpbmcgaWYKLQkgKiBpdCBpcyBhIEphdmEgcmVzZXJ2ZWQgd29yZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihzdHJpbmcsICdfJyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgotCSAqIGJ5IHN1YnN0aXR1dGluZyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBmb3IgYW55IGludmFsaWQgY2hhcmFjdGVycwotCSAqIGluIHRoZSBzdHJpbmcgYW5kLCBpZiBuZWNlc3NhcnksIGFwcGVuZGluZyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIHRvIHRoZSBzdHJpbmcgdW50aWwgaXQgaXMgbm90IGEgSmF2YSByZXNlcnZlZCB3b3JkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKGNoYXJbXSBzdHJpbmcsIGNoYXIgYykgewotCQlpbnQgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChKQVZBX1JFU0VSVkVEX1dPUkRTX1NFVC5jb250YWlucyhuZXcgU3RyaW5nKHN0cmluZykpKSB7Ci0JCQkvLyBhIHJlc2VydmVkIHdvcmQgaXMgYSB2YWxpZCBpZGVudGlmaWVyLCB3ZSBqdXN0IG5lZWQgdG8gdHdlYWsgaXQgYSBiaXQKLQkJCWNoZWNrQ2hhcklzSmF2YUlkZW50aWZpZXJQYXJ0KGMpOwotCQkJcmV0dXJuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKENvbGxlY3Rpb25Ub29scy5hZGQoc3RyaW5nLCBjKSwgYyk7Ci0JCX0KLQkJY29udmVydFRvSmF2YUlkZW50aWZpZXJfKHN0cmluZywgYyk7Ci0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBtdXN0IG5vdCBiZSBlbXB0eS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3RyaW5nIHdhcyBtb2RpZmllZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyXyhjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJYm9vbGVhbiBtb2QgPSBmYWxzZTsKLQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoc3RyaW5nWzBdKSkgewotCQkJY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclN0YXJ0KGMpOwotCQkJc3RyaW5nWzBdID0gYzsKLQkJCW1vZCA9IHRydWU7Ci0JCX0KLQkJY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclBhcnQoYyk7Ci0JCWZvciAoaW50IGkgPSBzdHJpbmcubGVuZ3RoOyBpLS0gPiAxOyApIHsgIC8vIE5COiBlbmQgd2l0aCAxCi0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHN0cmluZ1tpXSkpIHsKLQkJCQlzdHJpbmdbaV0gPSBjOwotCQkJCW1vZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ2hhcklzSmF2YUlkZW50aWZpZXJTdGFydChjaGFyIGMpIHsKLQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYykpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgSmF2YSBpZGVudGlmaWVyIHN0YXJ0IGNoYXI6ICciICsgYyArICInIik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ2hhcklzSmF2YUlkZW50aWZpZXJQYXJ0KGNoYXIgYykgewotCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIEphdmEgaWRlbnRpZmllciBwYXJ0IGNoYXI6ICciICsgYyArICInIik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE5hbWVUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvTnVsbExpc3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9OdWxsTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjBkNGU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9OdWxsTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBICJudWxsIiBsaXN0IGlzIGEgYml0IGRpZmZlcmVudCBmcm9tIGFuICJlbXB0eSIgbGlzdDogaXQgYWxsb3dzIGNsaWVudHMgdG8KLSAqIGFkZC9yZW1vdmUgZWxlbWVudHMgdG8vZnJvbSBpdCBidXQgbmV2ZXIgY2hhbmdlcy4gVGhpcyBpcyB1c2VmdWwKLSAqIGZvciBwYXNzaW5nIHRvIG1ldGhvZHMgdGhhdCByZXF1aXJlIGEgImNvbGxlY3RpbmcgcGFyYW1ldGVyIiBidXQgdGhlCi0gKiBjbGllbnQgd2lsbCBpZ25vcmUgdGhlIHJlc3VsdGluZyAiY29sbGVjdGlvbiIuCi0gKiAKLSAqIE5COiBXZSByZXR1cm4gJ251bGwnIGZyb20gdGhlIGZvbGxvd2luZyBtZXRob2RzIChhcyBvcHBvc2VkIHRvIHRocm93aW5nCi0gKiBhbiBleGNlcHRpb24pOgotICogICAgIGdldChpbnQpIDogRQotICogICAgIHJlbW92ZShpbnQpIDogRQotICogICAgIHNldChpbnQsIEUpIDogRQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbExpc3Q8RT4gaW1wbGVtZW50cyBMaXN0PEU+IHsKLQotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxMaXN0IElOU1RBTkNFID0gbmV3IE51bGxMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxMaXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJLy8gaWdub3JlCi0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiBmYWxzZTsgIC8vIHRoZSBsaXN0IGRpZCBub3QgY2hhbmdlCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCS8vIGlnbm9yZQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIGMuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAwIik7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgRSByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogMCIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiBmYWxzZTsgIC8vIHRoZSBsaXN0IGRpZCBub3QgY2hhbmdlCi0JfQotCi0JcHVibGljIEUgc2V0KGludCBpbmRleCwgRSBlbGVtZW50KSB7Ci0JCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogMCIpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIExpc3Q8RT4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gRU1QVFlfT0JKRUNUX0FSUkFZOwotCX0KLQotCXB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvUmFuZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGJlNDg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFRoaXMgc2ltcGxlIGNvbnRhaW5lciBjbGFzcyBzaW1wbHkgcHV0cyBhIGJpdCBvZiBzZW1hbnRpY3MKLSAqIGFyb3VuZCBhIHBhaXIgb2YgbnVtYmVycy4KLSAqLwotcHVibGljIGNsYXNzIFJhbmdlCi0JaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBUaGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIHJhbmdlLiAqLwotCXB1YmxpYyBmaW5hbCBpbnQgc3RhcnQ7Ci0KLQkvKiogVGhlIGVuZGluZyBpbmRleCBvZiB0aGUgcmFuZ2UuICovCi0JcHVibGljIGZpbmFsIGludCBlbmQ7Ci0KLQkvKioKLQkgKiBUaGUgc2l6ZSBjYW4gYmUgbmVnYXRpdmUgaWYgdGhlIGVuZGluZyBpbmRleAotCSAqIGlzIGxlc3MgdGhhbiB0aGUgc3RhcnRpbmcgaW5kZXguCi0JICovCi0JcHVibGljIGZpbmFsIGludCBzaXplOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnQgYW5kIGVuZCwKLQkgKiBib3RoIG9mIHdoaWNoIGFyZSBpbW11dGFibGUuCi0JICovCi0JcHVibGljIFJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgewotCQlzdXBlcigpOwotCQl0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0JCXRoaXMuZW5kID0gZW5kOwotCQl0aGlzLnNpemUgPSBlbmQgLSBzdGFydCArIDE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHJhbmdlIGluY2x1ZGVzIHRoZSBzcGVjaWZpZWQKLQkgKiBpbmRleC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhpbnQgaW5kZXgpIHsKLQkJcmV0dXJuICh0aGlzLnN0YXJ0IDw9IGluZGV4KSAmJiAoaW5kZXggPD0gdGhpcy5lbmQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAodGhpcyA9PSBvKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBSYW5nZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlSYW5nZSBvdGhlclJhbmdlID0gKFJhbmdlKSBvOwotCQlyZXR1cm4gKHRoaXMuc3RhcnQgPT0gb3RoZXJSYW5nZS5zdGFydCkKLQkJCSYmICh0aGlzLmVuZCA9PSBvdGhlclJhbmdlLmVuZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RhcnQgXiB0aGlzLmVuZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmFuZ2UgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFJhbmdlKSBzdXBlci5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiWyIgKyB0aGlzLnN0YXJ0ICsgIiwgIiArIHRoaXMuZW5kICsgJ10nOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1JldmVyc2VDb21wYXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjMDFmOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNvbXBhcmF0b3Igd2lsbCByZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IuCi0gKiBJZiB0aGUgY29tcGFyYXRvciBpcyBudWxsLCB0aGUgbmF0dXJhbCBvcmRlcmluZyBvZiB0aGUgb2JqZWN0cyB3aWxsIGJlIHVzZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXZlcnNlQ29tcGFyYXRvcjxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PgotCWltcGxlbWVudHMgQ29tcGFyYXRvcjxFPiwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3I7Ci0KLQlwdWJsaWMgUmV2ZXJzZUNvbXBhcmF0b3IoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JcHVibGljIFJldmVyc2VDb21wYXJhdG9yKENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZShFIGUxLCBFIGUyKSB7Ci0JCXJldHVybiAodGhpcy5jb21wYXJhdG9yID09IG51bGwpID8KLQkJCWUyLmNvbXBhcmVUbyhlMSkKLQkJOgotCQkJdGhpcy5jb21wYXJhdG9yLmNvbXBhcmUoZTIsIGUxKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVBc3NvY2lhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOWIwYTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIEFzc29jaWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQXNzb2NpYXRpb248SywgVj4KLQlleHRlbmRzIEFic3RyYWN0QXNzb2NpYXRpb248SywgVj4KLQlpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBLIGtleTsKLQlwcml2YXRlIFYgdmFsdWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzc29jaWF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBrZXkKLQkgKiBhbmQgYSBudWxsIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVBc3NvY2lhdGlvbihLIGtleSkgewotCQlzdXBlcigpOwotCQl0aGlzLmtleSA9IGtleTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXNzb2NpYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbmQgdmFsdWUuCi0JICovCi0JcHVibGljIFNpbXBsZUFzc29jaWF0aW9uKEsga2V5LCBWIHZhbHVlKSB7Ci0JCXRoaXMoa2V5KTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCi0JcHVibGljIEsga2V5KCkgewotCQlyZXR1cm4gdGhpcy5rZXk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBWIHZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFYgc2V0VmFsdWUoViB2YWx1ZSkgewotCQlWIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3luY2hyb25pemVkIFNpbXBsZUFzc29jaWF0aW9uPEssIFY+IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChTaW1wbGVBc3NvY2lhdGlvbjxLLCBWPikgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVGaWx0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmNmJiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotCi0vKioKLSAqIFNpbXBsZSwgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+RmlsdGVyPC9jb2RlPgotICogdGhhdCBob2xkcyBvbiB0byBhIGNyaXRlcmlvbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUKLSAqIDxjb2RlPmFjY2VwdChPYmplY3QpPC9jb2RlPiBvciA8Y29kZT5yZWplY3QoT2JqZWN0KTwvY29kZT4KLSAqIG1ldGhvZHMuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGVpdGhlciBvZiB0aGVzZSBtZXRob2RzLAotICogZGVwZW5kaW5nIG9uIHdoaWNoIGlzIGVhc2llciB0byBpbXBsZW1lbnQuIE5vdGUgdGhhdCBhdCBsZWFzdAotICogb25lIG9mIHRoZXNlIG1ldGhvZHMgPGVtPm11c3Q8L2VtPiBiZSBvdmVycmlkZGVuIG9yCi0gKiBhbiBpbmZpbml0ZSBsb29wIHdpbGwgb2NjdXIuIElmIGJvdGggb2YgdGhlbSBhcmUgb3ZlcnJpZGRlbiwKLSAqIG9ubHkgdGhlIDxjb2RlPmFjY2VwdChPYmplY3QpPC9jb2RlPiBtZXRob2Qgd2lsbCBiZSB1c2VkLgotICogPHA+Ci0gKiBTaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBzdHJhaWdodGZvcndhcmQgaW5uZXIgY2xhc3Nlcy4KLSAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIGZpbHRlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEKLSAqIDxjb2RlPkZpbHRlcmluZ0l0ZXJhdG9yPC9jb2RlPiB0byByZXR1cm4gb25seSB0aG9zZSBzdHJpbmdzCi0gKiBpbiB0aGUgbmVzdGVkIGl0ZXJhdG9yIHN0YXJ0IHdpdGggInByZWZpeCI6Ci0gKiA8cHJlPgotICoJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gbmV3IFNpbXBsZUZpbHRlcjxTdHJpbmc+KCJwcmVmaXgiKSB7Ci0gKgkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBvKSB7Ci0gKgkJCXJldHVybiBvLnN0YXJ0c1dpdGgoKFN0cmluZykgY3JpdGVyaW9uKTsKLSAqCQl9Ci0gKgl9OwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaW1wbGVGaWx0ZXI8VCwgUz4KLQlpbXBsZW1lbnRzIEZpbHRlcjxUPiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQlwcm90ZWN0ZWQgZmluYWwgUyBjcml0ZXJpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogTW9yZSB1c2VmdWwgY29uc3RydWN0b3IuIFRoZSBzcGVjaWZpZWQgY3JpdGVyaW9uIGNhbgotCSAqIGJlIHVzZWQgYnkgYSBzdWJjbGFzcyB0byAiYWNjZXB0IiBvciAicmVqZWN0IiBvYmplY3RzLgotCSAqLwotCXByb3RlY3RlZCBTaW1wbGVGaWx0ZXIoUyBjcml0ZXJpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jcml0ZXJpb24gPSBjcml0ZXJpb247Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc2ltcGxlIGZpbHRlciB3aXRoIGEgbnVsbCBjcml0ZXJpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU2ltcGxlRmlsdGVyKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0aGUgc3BlY2lmaWVkIG9iamVjdCBzaG91bGQgYmUgInJlamVjdGVkIi4KLQkgKiBUaGUgc2VtYW50aWNzIG9mICJyZWplY3RlZCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY2xpZW50LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlamVjdChUIG8pIHsKLQkJcmV0dXJuICEgdGhpcy5hY2NlcHQobyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHNob3VsZCBiZSAiYWNjZXB0ZWQiLgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgImFjY2VwdGVkIiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjbGllbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KFQgbykgewotCQlyZXR1cm4gISB0aGlzLnJlamVjdChvKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgU2ltcGxlRmlsdGVyPFQsIFM+IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChTaW1wbGVGaWx0ZXI8VCwgUz4pIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIFNpbXBsZUZpbHRlcikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTaW1wbGVGaWx0ZXI8PywgPz4gb3RoZXIgPSAoU2ltcGxlRmlsdGVyPD8sID8+KSBvOwotCQlyZXR1cm4gKHRoaXMuY3JpdGVyaW9uID09IG51bGwpID8KLQkJCShvdGhlci5jcml0ZXJpb24gPT0gbnVsbCkgOiB0aGlzLmNyaXRlcmlvbi5lcXVhbHMob3RoZXIuY3JpdGVyaW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKHRoaXMuY3JpdGVyaW9uID09IG51bGwpID8gMCA6IHRoaXMuY3JpdGVyaW9uLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jcml0ZXJpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUphdmFUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlSmF2YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VjMjUzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlSmF2YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5KYXZhVHlwZTsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEphdmFUeXBlIGludGVyZmFjZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNpbXBsZUphdmFUeXBlCi0JaW1wbGVtZW50cyBKYXZhVHlwZSwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQotCS8qKgotCSAqIHN0b3JlIHRoZSB0eXBlIGFzIGEgbmFtZSwgc28gd2UgY2FuIHJlZmVyZW5jZSBjbGFzc2VzCi0JICogdGhhdCBhcmUgbm90IGxvYWRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZTsKLQotCS8qKgotCSAqIG5vbi1hcnJheSB0eXBlcyBoYXZlIGFuIGFycmF5IGRlcHRoIG9mIHplcm8KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBhcnJheURlcHRoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEphdmEgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0eXBlIGFuZCBhcnJheSBkZXB0aC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlSmF2YVR5cGUoU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChlbGVtZW50VHlwZU5hbWUgPT0gbnVsbCkgfHwgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGVsZW1lbnQgdHlwZSBuYW1lIGlzIHJlcXVpcmVkLiIpOwotCQl9Ci0JCWlmIChDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGVsZW1lbnRUeXBlTmFtZSkgIT0gMCkgewkJLy8gZS5nLiAiW0xqYXZhLmxhbmcuT2JqZWN0OyIKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBlbGVtZW50IHR5cGUgbXVzdCBub3QgYmUgYW4gYXJyYXk6ICIgKyBlbGVtZW50VHlwZU5hbWUgKyAnLicpOwotCQl9Ci0JCWlmIChhcnJheURlcHRoIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGFycmF5IGRlcHRoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm86ICIgKyBhcnJheURlcHRoICsgJy4nKTsKLQkJfQotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSkgJiYgKGFycmF5RGVwdGggIT0gMCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIid2b2lkJyBtdXN0IGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybzogIiArIGFycmF5RGVwdGggKyAnLicpOwotCQl9Ci0JCXRoaXMuZWxlbWVudFR5cGVOYW1lID0gZWxlbWVudFR5cGVOYW1lOwotCQl0aGlzLmFycmF5RGVwdGggPSBhcnJheURlcHRoOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEphdmEgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgY2xhc3MgbmFtZSBjYW4gYmUgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6Ci0JICogICAgIGphdmEubGFuZy5PYmplY3QKLQkgKiAgICAgaW50Ci0JICogICAgIGphdmEudXRpbC5NYXAkRW50cnkKLQkgKiAgICAgW0xqYXZhLmxhbmcuT2JqZWN0OwotCSAqICAgICBbSQotCSAqICAgICBbTGphdmEudXRpbC5NYXAkRW50cnk7Ci0JICovCi0JcHVibGljIFNpbXBsZUphdmFUeXBlKFN0cmluZyBqYXZhQ2xhc3NOYW1lKSB7Ci0JCXRoaXMoQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzc05hbWUpLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGphdmFDbGFzc05hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBKYXZhIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICovCi0JcHVibGljIFNpbXBsZUphdmFUeXBlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQl0aGlzKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUeXBlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEFycmF5RGVwdGgoKSB7Ci0JCXJldHVybiB0aGlzLmFycmF5RGVwdGg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMuYXJyYXlEZXB0aCA+IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiAodGhpcy5hcnJheURlcHRoID09IDApICYmIENsYXNzVG9vbHMuY2xhc3NOYW1lZElzUHJpbWl0aXZlKHRoaXMuZWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZVdyYXBwZXIoKSB7Ci0JCXJldHVybiAodGhpcy5hcnJheURlcHRoID09IDApICYmIENsYXNzVG9vbHMuY2xhc3NOYW1lZElzUHJpbWl0aXZlV3JhcHBlckNsYXNzKHRoaXMuZWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhcmlhYmxlUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gKHRoaXMuYXJyYXlEZXB0aCA9PSAwKSAmJiBDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKHRoaXMuZWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcigpIHsKLQkJcmV0dXJuICh0aGlzLmFycmF5RGVwdGggPT0gMCkgJiYgQ2xhc3NUb29scy5jbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyh0aGlzLmVsZW1lbnRUeXBlTmFtZSk7Ci0JfQotCi0JcHVibGljIENsYXNzPD8+IGdldEphdmFDbGFzcygpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odGhpcy5lbGVtZW50VHlwZU5hbWUsIHRoaXMuYXJyYXlEZXB0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24odGhpcy5lbGVtZW50VHlwZU5hbWUsIHRoaXMuYXJyYXlEZXB0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbXBhcmlzb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKFN0cmluZyBvdGhlckVsZW1lbnRUeXBlTmFtZSwgaW50IG90aGVyQXJyYXlEZXB0aCkgewotCQlyZXR1cm4gKHRoaXMuYXJyYXlEZXB0aCA9PSBvdGhlckFycmF5RGVwdGgpCi0JCQkmJiB0aGlzLmVsZW1lbnRUeXBlTmFtZS5lcXVhbHMob3RoZXJFbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRlc2NyaWJlcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmVxdWFscyhDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQoY2xhc3NOYW1lKSwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yQ2xhc3NOYW1lZChjbGFzc05hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkZXNjcmliZXMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiB0aGlzLmRlc2NyaWJlcyhqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoSmF2YVR5cGUgb3RoZXIpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxzKG90aGVyLmdldEVsZW1lbnRUeXBlTmFtZSgpLCBvdGhlci5nZXRBcnJheURlcHRoKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gKHRoaXMgPT0gbykgPyB0cnVlIDogKG8gaW5zdGFuY2VvZiBKYXZhVHlwZSkgPyB0aGlzLmVxdWFscygoSmF2YVR5cGUpIG8pIDogZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFR5cGVOYW1lLmhhc2hDb2RlKCkgXiB0aGlzLmFycmF5RGVwdGg7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlVG8oSmF2YVR5cGUganQpIHsKLQkJaW50IHggPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGhpcy5lbGVtZW50VHlwZU5hbWUsIGp0LmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQkJcmV0dXJuICh4ICE9IDApID8geCA6ICh0aGlzLmFycmF5RGVwdGggLSBqdC5nZXRBcnJheURlcHRoKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmludGluZyBhbmQgZGlzcGxheWluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgaW4gc291cmNlIGNvZGU6Ci0JICogICAgICJbW0oiID0+ICJsb25nW11bXSIKLQkgKiAgICAgImphdmEudXRpbC5NYXAkRW50cnkiID0+ICJqYXZhLnV0aWwuTWFwLkVudHJ5IgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjbGFyYXRpb24oKSB7Ci0JCWlmICh0aGlzLmFycmF5RGVwdGggPT0gMCkgewotCQkJcmV0dXJuIHRoaXMuZWxlbWVudFR5cGVOYW1lRGVjbGFyYXRpb24oKTsKLQkJfQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIodGhpcy5lbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgKyAoMiAqIHRoaXMuYXJyYXlEZXB0aCkpOwotCQl0aGlzLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgaW4gc291cmNlIGNvZGU6Ci0JICogICAgICJbW0oiID0+ICJsb25nW11bXSIKLQkgKiAgICAgImphdmEudXRpbC5NYXAkRW50cnkiID0+ICJqYXZhLnV0aWwuTWFwLkVudHJ5IgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZERlY2xhcmF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5lbGVtZW50VHlwZU5hbWVEZWNsYXJhdGlvbigpKTsKLQkJZm9yIChpbnQgaSA9IHRoaXMuYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlzYi5hcHBlbmQoIltdIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgdmVyc2lvbiBvZiB0aGUgdHlwZSdzIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiBzb3VyY2UgY29kZToKLQkgKiAgICAgIltbSiIgPT4gImxvbmdbXVtdIgotCSAqICAgICAiamF2YS51dGlsLk1hcCRFbnRyeSIgPT4gImphdmEudXRpbC5NYXAuRW50cnkiCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnREZWNsYXJhdGlvbk9uKFByaW50V3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KHRoaXMuZWxlbWVudFR5cGVOYW1lRGVjbGFyYXRpb24oKSk7Ci0JCWZvciAoaW50IGkgPSB0aGlzLmFycmF5RGVwdGg7IGktLSA+IDA7ICkgewotCQkJcHcucHJpbnQoIltdIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgJyQnIHZlcnNpb24gb2YgdGhlIG5hbWUgaXMgdXNlZCBpbiBDbGFzcy5mb3JOYW1lKFN0cmluZyksCi0JICogYnV0IHRoZSAnLicgdmVyaW9ucyBvZiB0aGUgbmFtZSBpcyB1c2VkIGluIHNvdXJjZSBjb2RlLgotCSAqIFZlcnkgaXJyaXRhdGluZy4uLi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50VHlwZU5hbWVEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFR5cGVOYW1lLnJlcGxhY2UoJyQnLCAnLicpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQl0aGlzLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZU1ldGhvZFNpZ25hdHVyZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZU1ldGhvZFNpZ25hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGM1NDgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVNZXRob2RTaWduYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5KYXZhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNZXRob2RTaWduYXR1cmUgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2ltcGxlTWV0aG9kU2lnbmF0dXJlCi0JaW1wbGVtZW50cyBNZXRob2RTaWduYXR1cmUsIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIHN0b3JlIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXMgbmFtZXMsIHNvIHdlIGNhbiByZWZlcmVuY2UgY2xhc3NlcwotCSAqIHRoYXQgYXJlIG5vdCBsb2FkZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIEphdmFUeXBlW10gcGFyYW1ldGVyVHlwZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVR5cGVbXSBFTVBUWV9QQVJBTUVURVJfVFlQRVMgPSBuZXcgSmF2YVR5cGVbMF07Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG1ldGhvZCBzaWduYXR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kCi0JICogbm8gcGFyYW1ldGVyIHR5cGVzLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcyhuYW1lLCBFTVBUWV9QQVJBTUVURVJfVFlQRVMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG1ldGhvZCBzaWduYXR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHBhcmFtZXRlcgotCSAqIHR5cGVzLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoU3RyaW5nIG5hbWUsIEphdmFUeXBlLi4uIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIG5hbWUgaXMgcmVxdWlyZWQuIik7Ci0JCX0KLQkJaWYgKHBhcmFtZXRlclR5cGVzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIHJlcXVpcmVkLiIpOwotCQl9Ci0JCWNoZWNrUGFyYW1ldGVyVHlwZXMocGFyYW1ldGVyVHlwZXMpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnBhcmFtZXRlclR5cGVzID0gcGFyYW1ldGVyVHlwZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1BhcmFtZXRlclR5cGVzKEphdmFUeXBlW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhcmFtZXRlclR5cGVzW2ldID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNzaW5nIHBhcmFtZXRlciB0eXBlOiAiICsgaSk7Ci0JCQl9Ci0JCQlpZiAocGFyYW1ldGVyVHlwZXNbaV0uZ2V0RWxlbWVudFR5cGVOYW1lKCkuZXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgcGFyYW1ldGVyIHR5cGUgb2YgJ3ZvaWQnIGlzIG5vdCBhbGxvd2VkOiAiICsgaSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBtZXRob2Qgc2lnbmF0dXJlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBwYXJhbWV0ZXIKLQkgKiB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKFN0cmluZyBuYW1lLCBTdHJpbmcuLi4gcGFyYW1ldGVyVHlwZU5hbWVzKSB7Ci0JCXRoaXMobmFtZSwgYnVpbGRQYXJhbWV0ZXJUeXBlcyhwYXJhbWV0ZXJUeXBlTmFtZXMpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBKYXZhVHlwZVtdIGJ1aWxkUGFyYW1ldGVyVHlwZXMoU3RyaW5nW10gcGFyYW1ldGVyVHlwZU5hbWVzKSB7Ci0JCWlmIChwYXJhbWV0ZXJUeXBlTmFtZXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmFtZXRlciB0eXBlIG5hbWVzIGFyZSByZXF1aXJlZC4iKTsKLQkJfQotCQlKYXZhVHlwZVtdIHBhcmFtZXRlclR5cGVzID0gbmV3IEphdmFUeXBlW3BhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhcmFtZXRlclR5cGVOYW1lc1tpXSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWlzc2luZyBwYXJhbWV0ZXIgdHlwZSBuYW1lOiAiICsgaSk7Ci0JCQl9Ci0JCQlwYXJhbWV0ZXJUeXBlc1tpXSA9IG5ldyBTaW1wbGVKYXZhVHlwZShwYXJhbWV0ZXJUeXBlTmFtZXNbaV0pOwotCQl9Ci0JCXJldHVybiBwYXJhbWV0ZXJUeXBlczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBtZXRob2Qgc2lnbmF0dXJlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBwYXJhbWV0ZXIKLQkgKiB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKFN0cmluZyBuYW1lLCBDbGFzczw/Pi4uLiBwYXJhbWV0ZXJKYXZhQ2xhc3NlcykgewotCQl0aGlzKG5hbWUsIGJ1aWxkUGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlckphdmFDbGFzc2VzKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gYnVpbGRQYXJhbWV0ZXJUeXBlTmFtZXMoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJKYXZhQ2xhc3NlcykgewotCQlpZiAocGFyYW1ldGVySmF2YUNsYXNzZXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmFtZXRlciBKYXZhIGNsYXNzZXMgYXJlIHJlcXVpcmVkLiIpOwotCQl9Ci0JCVN0cmluZ1tdIHBhcmFtZXRlclR5cGVOYW1lcyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVySmF2YUNsYXNzZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJKYXZhQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhcmFtZXRlckphdmFDbGFzc2VzW2ldID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNzaW5nIHBhcmFtZXRlciBKYXZhIGNsYXNzOiAiICsgaSk7Ci0JCQl9Ci0JCQlwYXJhbWV0ZXJUeXBlTmFtZXNbaV0gPSBwYXJhbWV0ZXJKYXZhQ2xhc3Nlc1tpXS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmFtZXRlclR5cGVOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBtZXRob2Qgc2lnbmF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIEphdmEgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoTWV0aG9kIG1ldGhvZCkgewotCQl0aGlzKG1ldGhvZC5nZXROYW1lKCksIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVR5cGVbXSBnZXRQYXJhbWV0ZXJUeXBlcygpIHsKLQkJcmV0dXJuIHRoaXMucGFyYW1ldGVyVHlwZXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbXBhcmlzb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKFN0cmluZyBvdGhlck5hbWUsIEphdmFUeXBlW10gb3RoZXJQYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gdGhpcy5uYW1lLmVxdWFscyhvdGhlck5hbWUpCi0JCQkJJiYgQXJyYXlzLmVxdWFscyh0aGlzLnBhcmFtZXRlclR5cGVzLCBvdGhlclBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoTWV0aG9kU2lnbmF0dXJlIG90aGVyKSB7Ci0JCXJldHVybiB0aGlzLmVxdWFscyhvdGhlci5nZXROYW1lKCksIG90aGVyLmdldFBhcmFtZXRlclR5cGVzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gKHRoaXMgPT0gbykgPyB0cnVlIDogKG8gaW5zdGFuY2VvZiBNZXRob2RTaWduYXR1cmUpID8gdGhpcy5lcXVhbHMoKE1ldGhvZFNpZ25hdHVyZSkgbykgOiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lLmhhc2hDb2RlKCkgXiBBcnJheXMuaGFzaENvZGUodGhpcy5wYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlVG8oTWV0aG9kU2lnbmF0dXJlIG1zKSB7Ci0JCWludCBjb21wYXJlID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKHRoaXMubmFtZSwgbXMuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIChjb21wYXJlICE9IDApID8gY29tcGFyZSA6IHRoaXMuY29tcGFyZVBhcmFtZXRlclR5cGVzKG1zLmdldFBhcmFtZXRlclR5cGVzKCkpOwotCX0KLQotCXByaXZhdGUgaW50IGNvbXBhcmVQYXJhbWV0ZXJUeXBlcyhKYXZhVHlwZVtdIG90aGVyUGFyYW1ldGVyVHlwZXMpIHsKLQkJaW50IGxlbjEgPSB0aGlzLnBhcmFtZXRlclR5cGVzLmxlbmd0aDsKLQkJaW50IGxlbjIgPSBvdGhlclBhcmFtZXRlclR5cGVzLmxlbmd0aDsKLQkJaW50IG1pbiA9IE1hdGgubWluKGxlbjEsIGxlbjIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1pbjsgaSsrKSB7Ci0JCQlpbnQgY29tcGFyZSA9IHRoaXMucGFyYW1ldGVyVHlwZXNbaV0uY29tcGFyZVRvKG90aGVyUGFyYW1ldGVyVHlwZXNbaV0pOwotCQkJaWYgKGNvbXBhcmUgIT0gMCkgewotCQkJCXJldHVybiBjb21wYXJlOwotCQkJfQotCQl9Ci0JCXJldHVybiAobGVuMSA9PSBsZW4yKSA/IDAgOiAobGVuMSA8IGxlbjIpID8gLTEgOiAxOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmludGluZyBhbmQgZGlzcGxheWluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXRoaXMuYXBwZW5kU2lnbmF0dXJlVG8oc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBlbmRTaWduYXR1cmVUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKSB7Ci0JCQkJc2IuYXBwZW5kKCIsICIpOwotCQkJfQotCQkJdGhpcy5wYXJhbWV0ZXJUeXBlc1tpXS5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJfQotCQlzYi5hcHBlbmQoJyknKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFNpZ25hdHVyZU9uKFByaW50V3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KHRoaXMubmFtZSk7Ci0JCXB3LnByaW50KCcoJyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5wYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCkgewotCQkJCXB3LnByaW50KCIsICIpOwotCQkJfQotCQkJdGhpcy5wYXJhbWV0ZXJUeXBlc1tpXS5wcmludERlY2xhcmF0aW9uT24ocHcpOwotCQl9Ci0JCXB3LnByaW50KCcpJyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCXRoaXMuYXBwZW5kU2lnbmF0dXJlVG8oc2IpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZVN0YWNrLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4Mzk0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFN0YWNrIGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVN0YWNrPEU+Ci0JaW1wbGVtZW50cyBTdGFjazxFPiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIExpbmtlZExpc3Q8RT4gZWxlbWVudHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVtcHR5IHN0YWNrLgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdGFjaygpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0PEU+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhY2sgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24uIFRoZSBzdGFjayB3aWxsIHBvcCBpdHMgZWxlbWVudHMgaW4gcmV2ZXJzZSBvZiB0aGUKLQkgKiBvcmRlciB0aGV5IGFyZSByZXR1cm5lZCBieSB0aGUgY29sbGVjdGlvbidzIGl0ZXJhdG9yIChpLmUuIHRoZQotCSAqIGxhc3QgZWxlbWVudCByZXR1cm5lZCBieSB0aGUgY29sbGVjdGlvbidzIGl0ZXJhdG9yIHdpbGwgYmUgdGhlCi0JICogZmlyc3QgZWxlbWVudCByZXR1cm5lZCBieSAjcG9wKCkpLgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdGFjayhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDxFPihjKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3RhY2sgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcHVzaChFIG8pIHsKLQkJdGhpcy5lbGVtZW50cy5hZGRMYXN0KG8pOwotCX0KLQotCXB1YmxpYyBFIHBvcCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmVsZW1lbnRzLnJlbW92ZUxhc3QoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyBFIHBlZWsoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5nZXRMYXN0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5pc0VtcHR5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENsb25lYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2ltcGxlU3RhY2s8RT4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCVNpbXBsZVN0YWNrPEU+IGNsb25lID0gKFNpbXBsZVN0YWNrPEU+KSBzdXBlci5jbG9uZSgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlMaW5rZWRMaXN0PEU+IGxsID0gKExpbmtlZExpc3Q8RT4pIHRoaXMuZWxlbWVudHMuY2xvbmUoKTsKLQkJCWNsb25lLmVsZW1lbnRzID0gbGw7Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RyaW5nTWF0Y2hlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZVN0cmluZ01hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1NTk1Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RyaW5nTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLQotLy8gVE9ETyB0aGUgcmVnZXggY29kZSBpcyBub3QgdmVyeSBmYXN0IC0gd2UgY291bGQgcHJvYmFibHkgZG8gYmV0dGVyLAotLy8gaGFuZC1jb2RpbmcgdGhlIG1hdGNoaW5nIGFsZ29yaXRobSAoZWNsaXBzZSBTdHJpbmdNYXRjaGVyPykKLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgc2ltcGxlIHN0cmluZy1tYXRjaGluZyBhbGdvcml0aG0gdGhhdCBpcyBhIGxpdHRsZQotICogbW9yZSB1c2VyLWZyaWVuZGx5IHRoYW4gc3RhbmRhcmQgcmVndWxhciBleHByZXNzaW9ucy4gSW5zdGFudGlhdGUgYQotICogc3RyaW5nIG1hdGNoZXIgd2l0aCBhIGZpbHRlciBwYXR0ZXJuIGFuZCB0aGVuIHlvdSBjYW4gdXNlIHRoZSBtYXRjaGVyCi0gKiB0byBkZXRlcm1pbmUgd2hldGhlciBhbm90aGVyIHN0cmluZyAob3Igb2JqZWN0KSBtYXRjaGVzIHRoZSBwYXR0ZXJuLgotICogWW91IGNhbiBhbHNvIHNwZWNpZnkgd2hldGhlciB0aGUgbWF0Y2hpbmcgc2hvdWxkIGJlIGNhc2Utc2Vuc2l0aXZlLgotICogCi0gKiBUaGUgcGF0dGVybiBjYW4gY29udGFpbiB0d28gIm1ldGEtY2hhcmFjdGVycyI6Ci0gKiAJJyonIHdpbGwgbWF0Y2ggYW55IHNldCBvZiB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycwotICogCSc/JyB3aWxsIG1hdGNoIGFueSBzaW5nbGUgY2hhcmFjdGVyCi0gKiAKLSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlICNwcmVmaXgoKSBhbmQvb3IgI3N1ZmZpeCgpIHRvIGNoYW5nZSB3aGF0Ci0gKiBzdHJpbmdzIGFyZSBwcmVwZW5kZWQgb3IgYXBwZW5kZWQgdG8gdGhlIG9yaWdpbmFsIHBhdHRlcm4gc3RyaW5nLgotICogVGhpcyBjYW4gb2ZmZXIgYSBzbGlnaHQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb3ZlciBjb25jYXRlbmF0aW5nCi0gKiBzdHJpbmdzIGJlZm9yZSBjYWxsaW5nICNzZXRQYXR0ZXJuU3RyaW5nKFN0cmluZykuCi0gKiBCeSBkZWZhdWx0LCBhICcqJyBpcyBhcHBlbmRlZCB0byBldmVyeSBzdHJpbmcuCi0gKiAKLSAqIFRoaXMgY2xhc3MgYWxzbyB1c2VzIHRoZSBzdHJpbmctbWF0Y2hpbmcgYWxnb3JpdGhtIHRvICJmaWx0ZXIiIG9iamVjdHMKLSAqIChhbmQsIGFzIGEgcmVzdWx0LCBhbHNvIGltcGxlbWVudHMgdGhlIEZpbHRlciBpbnRlcmZhY2UpLgotICogQSBzdHJpbmcgY29udmVydGVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQgc3RyaW5nIGFzcGVjdCBvZiB0aGUKLSAqIG9iamVjdCBpcyBjb21wYXJlZCB0byB0aGUgcGF0dGVybi4gQnkgZGVmYXVsdCB0aGUgc3RyaW5nIHJldHVybmVkCi0gKiBieSB0aGUgb2JqZWN0J3MgI3RvU3RyaW5nKCkgbWV0aG9kIGlzIHBhc3NlZCB0byB0aGUgcGF0dGVybiBtYXRjaGVyLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlU3RyaW5nTWF0Y2hlcjxUPgotCWltcGxlbWVudHMgU3RyaW5nTWF0Y2hlciwgRmlsdGVyPFQ+LCBTZXJpYWxpemFibGUKLXsKLQotCS8qKiBBbiBhZGFwdGVyIHRoYXQgY29udmVydHMgdGhlIG9iamVjdHMgaW50byBzdHJpbmdzIHRvIGJlIG1hdGNoZWQgd2l0aCB0aGUgcGF0dGVybi4gKi8KLQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXI7Ci0KLQkvKiogVGhlIHN0cmluZyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uICovCi0JcHJpdmF0ZSBTdHJpbmcgcGF0dGVyblN0cmluZzsKLQotCS8qKiBXaGV0aGVyIHRoZSBtYXRjaGVyIGlnbm9yZXMgY2FzZSAtIHRoZSBkZWZhdWx0IGlzIHRydWUuICovCi0JcHJpdmF0ZSBib29sZWFuIGlnbm9yZXNDYXNlOwotCi0JLyoqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBidWlsdCBmcm9tIHRoZSBwYXR0ZXJuIHN0cmluZy4gKi8KLQlwcml2YXRlIFBhdHRlcm4gcGF0dGVybjsKLQotCS8qKiBBIGxpc3Qgb2YgdGhlIG1ldGEtY2hhcmFjdGVycyB3ZSBuZWVkIHRvIGVzY2FwZSBpZiBmb3VuZCBpbiB0aGUgcGF0dGVybiBzdHJpbmcuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gUkVHX0VYX01FVEFfQ0hBUlMgPSB7ICcoJywgJ1snLCAneycsICdcXCcsICdeJywgJyQnLCAnfCcsICcpJywgJz8nLCAnKicsICcrJywgJy4nIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RyaW5nIG1hdGNoZXIgd2l0aCBhbiBwYXR0ZXJuIHRoYXQgd2lsbCBtYXRjaAotCSAqIGFueSBzdHJpbmcgYW5kIGlnbm9yZSBjYXNlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdHJpbmdNYXRjaGVyKCkgewotCQl0aGlzKCIqIik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RyaW5nIG1hdGNoZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdHRlcm4KLQkgKiB0aGF0IHdpbGwgaWdub3JlIGNhc2UuCi0JICovCi0JcHVibGljIFNpbXBsZVN0cmluZ01hdGNoZXIoU3RyaW5nIHBhdHRlcm5TdHJpbmcpIHsKLQkJdGhpcyhwYXR0ZXJuU3RyaW5nLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdHJpbmcgbWF0Y2hlciB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0dGVybiB0aGF0IHdpbGwKLQkgKiBpZ25vcmUgY2FzZSBhcyBzcGVjaWZpZWQuCi0JICovCi0JcHVibGljIFNpbXBsZVN0cmluZ01hdGNoZXIoU3RyaW5nIHBhdHRlcm5TdHJpbmcsIGJvb2xlYW4gaWdub3Jlc0Nhc2UpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXR0ZXJuU3RyaW5nID0gcGF0dGVyblN0cmluZzsKLQkJdGhpcy5pZ25vcmVzQ2FzZSA9IGlnbm9yZXNDYXNlOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5zdHJpbmdDb252ZXJ0ZXIgPSBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC5pbnN0YW5jZSgpOwotCQl0aGlzLnJlYnVpbGRQYXR0ZXJuKCk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIGN1cnJlbnQgcGF0dGVybiBzdHJpbmcgYW5kIGNhc2Utc2Vuc2l0aXZpdHkgc2V0dGluZywKLQkgKiByZS1idWlsZCB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHJlYnVpbGRQYXR0ZXJuKCkgewotCQl0aGlzLnBhdHRlcm4gPSB0aGlzLmJ1aWxkUGF0dGVybigpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBjdXJyZW50IHBhdHRlcm4gc3RyaW5nIGFuZCBjYXNlLXNlbnNpdGl2aXR5IHNldHRpbmcsCi0JICogYnVpbGQgYW5kIHJldHVybiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRoYXQgY2FuIGJlIHVzZWQKLQkgKiB0byBtYXRjaCBzdHJpbmdzLgotCSAqLwotCXByb3RlY3RlZCBQYXR0ZXJuIGJ1aWxkUGF0dGVybigpIHsKLQkJaW50IHBhdHRlcm5GbGFncyA9IDB4MDsKLQkJaWYgKHRoaXMuaWdub3Jlc0Nhc2UpIHsKLQkJCXBhdHRlcm5GbGFncyA9IFBhdHRlcm4uVU5JQ09ERV9DQVNFIHwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFOwotCQl9Ci0JCXJldHVybiBQYXR0ZXJuLmNvbXBpbGUodGhpcy5jb252ZXJ0VG9SZWdFeCh0aGlzLnBhdHRlcm5TdHJpbmcpLCBwYXR0ZXJuRmxhZ3MpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTdHJpbmdNYXRjaGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQYXR0ZXJuU3RyaW5nKFN0cmluZyBwYXR0ZXJuU3RyaW5nKSB7Ci0JCXRoaXMucGF0dGVyblN0cmluZyA9IHBhdHRlcm5TdHJpbmc7Ci0JCXRoaXMucmVidWlsZFBhdHRlcm4oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBtYXRjaGVzIHRoZSBwYXR0ZXJuLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHRoaXMucGF0dGVybi5tYXRjaGVyKHN0cmluZykubWF0Y2hlcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBGaWx0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGFjY2VwdChUIG8pIHsKLQkJcmV0dXJuIHRoaXMubWF0Y2hlcyh0aGlzLnN0cmluZ0NvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcobykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdHJpbmcgY29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgb2JqZWN0cwotCSAqIHBhc3NlZCB0byB0aGUgbWF0Y2hlciBpbnRvIHN0cmluZ3MuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5zdHJpbmdDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzdHJpbmcgY29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgb2JqZWN0cwotCSAqIHBhc3NlZCB0byB0aGUgbWF0Y2hlciBpbnRvIHN0cmluZ3MuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFN0cmluZ0NvbnZlcnRlcihTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyID0gc3RyaW5nQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb3JpZ2luYWwgcGF0dGVybiBzdHJpbmcuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgcGF0dGVyblN0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMucGF0dGVyblN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWF0Y2hlciBpZ25vcmVzIGNhc2UuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlnbm9yZXNDYXNlKCkgewotCQlyZXR1cm4gdGhpcy5pZ25vcmVzQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgd2hldGhlciB0aGUgbWF0Y2hlciBpZ25vcmVzIGNhc2UuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldElnbm9yZXNDYXNlKGJvb2xlYW4gaWdub3Jlc0Nhc2UpIHsKLQkJdGhpcy5pZ25vcmVzQ2FzZSA9IGlnbm9yZXNDYXNlOwotCQl0aGlzLnJlYnVpbGRQYXR0ZXJuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFBhdHRlcm4gcGF0dGVybigpIHsKLQkJcmV0dXJuIHRoaXMucGF0dGVybjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3RoZXIgcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvCi0JICogdGhlIG9yaWdpbmFsIHBhdHRlcm4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHJlZ3VsYXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9SZWdFeCh0aGlzLnBhdHRlcm5TdHJpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9SZWdFeChTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyaW5nLmxlbmd0aCgpICsgMTApOwotCQl0aGlzLmNvbnZlcnRUb1JlZ0V4T24odGhpcy5wcmVmaXgoKSwgc2IpOwotCQl0aGlzLmNvbnZlcnRUb1JlZ0V4T24oc3RyaW5nLCBzYik7Ci0JCXRoaXMuY29udmVydFRvUmVnRXhPbih0aGlzLnN1ZmZpeCgpLCBzYik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbnkgcHJlZml4IHRoYXQgc2hvdWxkIGJlIHByZXBlbmRlZCB0byB0aGUgb3JpZ2luYWwKLQkgKiBzdHJpbmcuIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIG5vIHByZWZpeC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbnkgc3VmZml4IHRoYXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSBvcmlnaW5hbAotCSAqIHN0cmluZy4gU2luY2UgdGhpcyBjbGFzcyBpcyB0eXBpY2FsbHkgdXNlZCBpbiBVSSBzaXR1YXRpb24gd2hlcmUKLQkgKiB0aGUgdXNlciBpcyB0eXBpbmcgaW4gYSBwYXR0ZXJuIHVzZWQgdG8gZmlsdGVyIGEgbGlzdCwgdGhlIGRlZmF1bHQKLQkgKiBzdWZmaXggaXMgYSB3aWxkY2FyZCBjaGFyYWN0ZXIuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdWZmaXgoKSB7Ci0JCXJldHVybiAiKiI7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb252ZXJ0VG9SZWdFeE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyW10gY2hhckFycmF5ID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWludCBsZW5ndGggPSBjaGFyQXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGMgPSBjaGFyQXJyYXlbaV07Ci0JCQkvLyBjb252ZXJ0IHVzZXItZnJpZW5kbHkgbWV0YS1jaGFycyBpbnRvIHJlZ2V4IG1ldGEtY2hhcnMKLQkJCWlmIChjID09ICcqJykgewotCQkJCXNiLmFwcGVuZCgiLioiKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjID09ICc/JykgewotCQkJCXNiLmFwcGVuZCgnLicpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy8gZXNjYXBlIHJlZ2V4IG1ldGEtY2hhcnMKLQkJCWlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoUkVHX0VYX01FVEFfQ0hBUlMsIGMpKSB7Ci0JCQkJc2IuYXBwZW5kKCdcXCcpOwotCQkJfQotCQkJc2IuYXBwZW5kKGMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RhY2suamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2JlZjY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi0vKioKLSAqIEludGVyZmFjZSBkZWZpbmluZyB0aGUgY2xhc3NpYyBzdGFjayBiZWhhdmlvciwKLSAqIHdpdGhvdXQgdGhlIGJhY2tkb29ycyBhbGxvd2VkIGJ5IGphdmEudXRpbC5TdGFjay4KLSAqIEUgaXMgdGhlIHR5cGUgb2YgZWxlbWVudHMgY29udGFpbmVkIGJ5IHRoZSBTdGFjay4KLSAqLwotcHVibGljIGludGVyZmFjZSBTdGFjazxFPiB7Ci0KLQkvKioKLQkgKiAiUHVzaCIgdGhlIHNwZWNpZmllZCBpdGVtIG9uIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCSAqLwotCXZvaWQgcHVzaChFIG8pOwotCi0JLyoqCi0JICogIlBvcCIgYW4gaXRlbSBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCSAqLwotCUUgcG9wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW0gb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGhlIHN0YWNrLgotCSAqLwotCUUgcGVlaygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHN0YWNrIGlzIGVtcHR5LgotCSAqLwotCWJvb2xlYW4gaXNFbXB0eSgpOwotCi0KLQlmaW5hbCBjbGFzcyBFbXB0eTxFPiBpbXBsZW1lbnRzIFN0YWNrPEU+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdGFjayBJTlNUQU5DRSA9IG5ldyBFbXB0eSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8VD4gU3RhY2s8VD4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEVtcHR5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBwdXNoKEUgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIEUgcG9wKCkgewotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJfQotCQlwdWJsaWMgRSBwZWVrKCkgewotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NmI1MzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBVc2VkIGJ5IHZhcmlvdXMgInBsdWdnYWJsZSIgY2xhc3NlcyB0byB0cmFuc2Zvcm0gb2JqZWN0cwotICogaW50byBzdHJpbmdzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0cmluZ0NvbnZlcnRlcjxUPiB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gYSBzdHJpbmcuCi0JICogVGhlIHNlbWFudGljcyBvZiAiY29udmVydCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhUIG8pOwotCi0KLQlmaW5hbCBjbGFzcyBEZWZhdWx0PFM+IGltcGxlbWVudHMgU3RyaW5nQ29udmVydGVyPFM+IHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nQ29udmVydGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IFN0cmluZ0NvbnZlcnRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gc2ltcGx5IHJldHVybiB0aGUgb2JqZWN0J3MgI3RvU3RyaW5nKCkgcmVzdWx0Ci0JCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFMgbykgewotCQkJcmV0dXJuIChvID09IG51bGwpID8gbnVsbCA6IG8udG9TdHJpbmcoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiU3RyaW5nQ29udmVydGVyLkRlZmF1bHQiOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQ8Uz4gaW1wbGVtZW50cyBTdHJpbmdDb252ZXJ0ZXI8Uz4gewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdDb252ZXJ0ZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IFN0cmluZ0NvbnZlcnRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nTWF0Y2hlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ01hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3NjlkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgc2ltcGxlIEFQSSBmb3IgYWxsb3dpbmcgInBsdWdnYWJsZSIKLSAqIHN0cmluZyBtYXRjaGVycyB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHdpdGggYSBwYXR0ZXJuIHN0cmluZwotICogdGhlbiB1c2VkIHRvIGRldGVybWluZSB3aGF0IHN0cmluZ3MgbWF0Y2ggdGhlIHBhdHRlcm4uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RyaW5nTWF0Y2hlciB7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHBhdHRlcm4gc3RyaW5nIHVzZWQgdG8gZGV0ZXJtaW5lIGZ1dHVyZQotCSAqIG1hdGNoZXMuIFRoZSBmb3JtYXQgYW5kIHNlbWFudGljcyBvZiB0aGUgcGF0dGVybgotCSAqIHN0cmluZyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUKLQkgKiBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0Jdm9pZCBzZXRQYXR0ZXJuU3RyaW5nKFN0cmluZyBwYXR0ZXJuU3RyaW5nKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIG1hdGNoZXMgdGhlCi0JICogZXN0YWJsaXNoZWQgcGF0dGVybiBzdHJpbmcuIFRoZSBzZW1hbnRpY3Mgb2YgYSBtYXRjaAotCSAqIGlzIGRldGVybWluZWQgYnkgdGhlIGNvbnRyYWN0IGJldHdlZW4gdGhlCi0JICogY2xpZW50IGFuZCB0aGUgc2VydmVyLgotCSAqLwotCWJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgc3RyaW5nKTsKLQotCi0JZmluYWwgY2xhc3MgTnVsbCBpbXBsZW1lbnRzIFN0cmluZ01hdGNoZXIgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ01hdGNoZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlwdWJsaWMgc3RhdGljIFN0cmluZ01hdGNoZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFBhdHRlcm5TdHJpbmcoU3RyaW5nIHBhdHRlcm5TdHJpbmcpIHsKLQkJCS8vIGlnbm9yZSB0aGUgcGF0dGVybiBzdHJpbmcKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBzdHJpbmcpIHsKLQkJCS8vIGV2ZXJ5dGhpbmcgaXMgYSBtYXRjaAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlN0cmluZ01hdGNoZXIuTnVsbCI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3Y2MyNWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N0cmluZ1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyByZWxhdGVkIHRvIHRoZSBqYXZhLmxhbmcuU3RyaW5nIGNsYXNzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nVG9vbHMgewotCi0JLyoqIGNhcnJpYWdlIHJldHVybiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0JLyoqIGRvdWJsZSBxdW90ZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBRVU9URSA9ICciJzsKLQotCi0KLQkvLyAqKioqKioqKioqIHBhZGRpbmcvdHJ1bmNhdGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWQoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gcGFkKHN0cmluZywgbGVuZ3RoLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZChpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIHBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBwYWQoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gcGFkKHN0cmluZywgbGVuZ3RoLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIHdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZChpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcGFkKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBwYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZShpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBwYWRPclRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZShpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gcGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoKSwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLnN1YnN0cmluZygwLCBsZW5ndGgpKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGUoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHBhZE9yVHJ1bmNhdGUoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gcGFkT3JUcnVuY2F0ZShzdHJpbmcsIGxlbmd0aCwgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZShpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIHBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAwLCBsZW5ndGgsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDAsIGxlbmd0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBwYWRfKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlyZXR1cm4gbmV3IFN0cmluZyhwYWRfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW5ndGgsIGMpKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCB3cml0ZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgoKSwgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCB3cml0ZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oaW50IHN0cmluZ0xlbmd0aCwgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlU3RyaW5nT24oQ29sbGVjdGlvblRvb2xzLmZpbGwobmV3IGNoYXJbbGVuZ3RoIC0gc3RyaW5nTGVuZ3RoXSwgYyksIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLmxlbmd0aCgpLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLmxlbmd0aCwgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKGludCBzdHJpbmdMZW5ndGgsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDb2xsZWN0aW9uVG9vbHMuZmlsbChuZXcgY2hhcltsZW5ndGggLSBzdHJpbmdMZW5ndGhdLCBjKSk7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLmxlbmd0aCgpLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKGludCBzdHJpbmdMZW5ndGgsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoQ29sbGVjdGlvblRvb2xzLmZpbGwobmV3IGNoYXJbbGVuZ3RoIC0gc3RyaW5nTGVuZ3RoXSwgYykpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHBhZF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgMCwgc3RyaW5nTGVuZ3RoKTsKLQkJQXJyYXlzLmZpbGwocmVzdWx0LCBzdHJpbmdMZW5ndGgsIGxlbmd0aCwgYyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYWRPbl8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB6ZXJvUGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkKHN0cmluZywgbGVuZ3RoLCAnMCcpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWQoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZyb250UGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGZyb250UGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZChpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gemVyb1BhZChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmcm9udFBhZChzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZyb250UGFkT24oc3RyaW5nLCBsZW5ndGgsICcwJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBmcm9udFBhZChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gZnJvbnRQYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGUoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHplcm9QYWRPclRydW5jYXRlKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkT3JUcnVuY2F0ZShzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9yVHJ1bmNhdGUoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZyb250UGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gZnJvbnRQYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcuc3Vic3RyaW5nKHN0cmluZ0xlbmd0aCAtIGxlbmd0aCksIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcuc3Vic3RyaW5nKHN0cmluZ0xlbmd0aCAtIGxlbmd0aCkpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZy5zdWJzdHJpbmcoc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGUoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHplcm9QYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkT3JUcnVuY2F0ZShzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZSAKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBmcm9udFBhZE9yVHJ1bmNhdGUoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCBzdHJpbmdMZW5ndGggLSBsZW5ndGgsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIGZyb250UGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZSAKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHN0cmluZ0xlbmd0aCAtIGxlbmd0aCwgbGVuZ3RoLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlIAotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcsIHN0cmluZ0xlbmd0aCAtIGxlbmd0aCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlIAotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZywgc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogRnJvbnQtcGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZyb250UGFkXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoZnJvbnRQYWRfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW5ndGgsIGMpKTsKLQl9Ci0KLQkvKgotCSAqIFplcm8tcGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGZyb250UGFkXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpbnQgcGFkTGVuZ3RoID0gbGVuZ3RoIC0gc3RyaW5nTGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCBwYWRMZW5ndGgsIHN0cmluZ0xlbmd0aCk7Ci0JCUFycmF5cy5maWxsKHJlc3VsdCwgMCwgcGFkTGVuZ3RoLCBjKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25fKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcm9udFBhZE9uXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25fKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogd3JhcHBpbmcvcXVvdGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBxdW90ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiB3cmFwKHN0cmluZywgUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JhcE9uKHN0cmluZywgUVVPVEUsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXdyYXBPbihzdHJpbmcsIFFVT1RFLCBzYik7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQl3cmFwT24oc3RyaW5nLCBRVU9URSwgc2IpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBxdW90ZShJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihzdHJpbmdzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzdHJpbmcpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMucXVvdGUoc3RyaW5nKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd3JhcChTdHJpbmcgc3RyaW5nLCBjaGFyIHdyYXApIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcod3JhcChzdHJpbmcudG9DaGFyQXJyYXkoKSwgd3JhcCkpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JhcE9uKFN0cmluZyBzdHJpbmcsIGNoYXIgd3JhcCwgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZUNoYXJPbih3cmFwLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJd3JpdGVDaGFyT24od3JhcCwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyYXBPbihTdHJpbmcgc3RyaW5nLCBjaGFyIHdyYXAsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQod3JhcCk7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCQlzYi5hcHBlbmQod3JhcCk7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcDsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIHdyYXAgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cmFwT24oU3RyaW5nIHN0cmluZywgY2hhciB3cmFwLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IHdyYXAoSXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzLCBmaW5hbCBjaGFyIHdyYXApIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihzdHJpbmdzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzdHJpbmcpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMud3JhcChzdHJpbmcsIHdyYXApOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3cmFwKFN0cmluZyBzdHJpbmcsIFN0cmluZyB3cmFwKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKHdyYXAoc3RyaW5nLnRvQ2hhckFycmF5KCksIHdyYXAudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JhcE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyB3cmFwLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlU3RyaW5nT24od3JhcCwgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24od3JhcCwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyYXBPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgd3JhcCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyYXBPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgd3JhcCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQod3JhcCk7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCQlzYi5hcHBlbmQod3JhcCk7Ci0JfQotCi0JLyoqCi0JICogV3JhcCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcDsgaS5lLiBwdXQgYQotCSAqIGNvcHkgb2YgdGhlIHdyYXAgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiB3cmFwKEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncywgZmluYWwgU3RyaW5nIHdyYXApIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihzdHJpbmdzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzdHJpbmcpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMud3JhcChzdHJpbmcsIHdyYXApOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHF1b3RlKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHdyYXAoc3RyaW5nLCBRVU9URSk7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl3cmFwT24oc3RyaW5nLCBRVU9URSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJd3JhcE9uKHN0cmluZywgUVVPVEUsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXdyYXBPbihzdHJpbmcsIFFVT1RFLCBzYik7Ci0JfQotCi0JLyoqCi0JICogV3JhcCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxjaGFyW10+IHF1b3RlQ2hhckFycmF5cyhJdGVyYXRvcjxjaGFyW10+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPGNoYXJbXSwgY2hhcltdPihzdHJpbmdzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBjaGFyW10gdHJhbnNmb3JtKGNoYXJbXSBzdHJpbmcpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMucXVvdGUoc3RyaW5nKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gd3JhcChjaGFyW10gc3RyaW5nLCBjaGFyIHdyYXApIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW4rMl07Ci0JCXJlc3VsdFswXSA9IHdyYXA7Ci0JCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIDEsIGxlbik7Ci0JCXJlc3VsdFtsZW4rMV0gPSB3cmFwOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JhcE9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgd3JhcCwgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZUNoYXJPbih3cmFwLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJd3JpdGVDaGFyT24od3JhcCwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyYXBPbihjaGFyW10gc3RyaW5nLCBjaGFyIHdyYXAsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQod3JhcCk7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCQlzYi5hcHBlbmQod3JhcCk7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcDsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIHdyYXAgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cmFwT24oY2hhcltdIHN0cmluZywgY2hhciB3cmFwLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxjaGFyW10+IHdyYXBDaGFyQXJyYXlzKEl0ZXJhdG9yPGNoYXJbXT4gc3RyaW5ncywgZmluYWwgY2hhciB3cmFwKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgY2hhcltdIHRyYW5zZm9ybShjaGFyW10gc3RyaW5nKSB7Ci0JCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLndyYXAoc3RyaW5nLCB3cmFwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gd3JhcChjaGFyW10gc3RyaW5nLCBjaGFyW10gd3JhcCkgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaW50IHdyYXBMZW5ndGggPSB3cmFwLmxlbmd0aDsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW3N0cmluZ0xlbmd0aCsoMip3cmFwTGVuZ3RoKV07Ci0JCVN5c3RlbS5hcnJheWNvcHkod3JhcCwgMCwgcmVzdWx0LCAwLCB3cmFwTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgd3JhcExlbmd0aCwgc3RyaW5nTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weSh3cmFwLCAwLCByZXN1bHQsIHN0cmluZ0xlbmd0aCt3cmFwTGVuZ3RoLCB3cmFwTGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyYXBPbihjaGFyW10gc3RyaW5nLCBjaGFyW10gd3JhcCwgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHdyYXAsIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHdyYXAsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcDsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIHdyYXAgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cmFwT24oY2hhcltdIHN0cmluZywgY2hhcltdIHdyYXAsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQod3JhcCk7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCQlzYi5hcHBlbmQod3JhcCk7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcDsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIHdyYXAgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cmFwT24oY2hhcltdIHN0cmluZywgY2hhcltdIHdyYXAsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHdyYXApOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJc2IuYXBwZW5kKHdyYXApOwotCX0KLQotCS8qKgotCSAqIFdyYXAgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPGNoYXJbXT4gd3JhcENoYXJBcnJheXMoSXRlcmF0b3I8Y2hhcltdPiBzdHJpbmdzLCBmaW5hbCBjaGFyW10gd3JhcCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8Y2hhcltdLCBjaGFyW10+KHN0cmluZ3MpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGNoYXJbXSB0cmFuc2Zvcm0oY2hhcltdIHN0cmluZykgewotCQkJCXJldHVybiBTdHJpbmdUb29scy53cmFwKHN0cmluZywgd3JhcCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92aW5nIGNoYXJhY3RlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZShjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUZpcnN0T2NjdXJyZW5jZShTdHJpbmcgc3RyaW5nLCBjaGFyIGMpIHsKLQkJaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJLy8gY2hhcmFjdGVyIG5vdCBmb3VuZAotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBmcm9udCBvZiBzdHJpbmcKLQkJCXJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDEpOwotCQl9Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCgpIC0gMTsKLQkJaWYgKGluZGV4ID09IGxhc3QpIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHN0cmluZwotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgbGFzdCk7Ci0JCX0KLQkJLy8gY2hhcmFjdGVyIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcKLQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpLmNvbmNhdChzdHJpbmcuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBjLCB3cml0ZXIsIGluZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVGaXJzdE9jY3VycmVuY2VPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGMsIHNiLCBpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGaXJzdE9jY3VycmVuY2VPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVGaXJzdE9jY3VycmVuY2VPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGMsIHNiLCBpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBTdHJpbmcjcmVtb3ZlRmlyc3RPY2N1cnJlbmNlKGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlRmlyc3RPY2N1cnJlbmNlKGNoYXJbXSBzdHJpbmcsIGNoYXIgYykgewotCQlpbnQgaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCS8vIGNoYXJhY3RlciBub3QgZm91bmQKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaW50IGxhc3QgPSBzdHJpbmcubGVuZ3RoIC0gMTsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xhc3RdOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBmcm9udCBvZiBzdHJpbmcKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAxLCByZXN1bHQsIDAsIGxhc3QpOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IGxhc3QpIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHN0cmluZwotCQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgMCwgbGFzdCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZwotCQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIGluZGV4ICsgMSwgcmVzdWx0LCBpbmRleCwgbGFzdCAtIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVGaXJzdE9jY3VycmVuY2VPbl8oc3RyaW5nLCBjLCB3cml0ZXIsIGluZGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25fKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgV3JpdGVyIHdyaXRlciwgaW50IGluZGV4KSB7Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGZyb250IG9mIHN0cmluZwotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDEsIGxhc3QsIHdyaXRlcik7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gbGFzdCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgbGFzdCwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCi0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgaW5kZXgsIHdyaXRlcik7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgaW5kZXggKyAxLCBsYXN0IC0gaW5kZXgsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVGaXJzdE9jY3VycmVuY2VPbl8oc3RyaW5nLCBjLCBzYiwgaW5kZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVGaXJzdE9jY3VycmVuY2VPbl8oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IsIGludCBpbmRleCkgewotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBmcm9udCBvZiBzdHJpbmcKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDEsIGxhc3QpOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IGxhc3QpIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgbGFzdCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgaW5kZXgpOwotCQkJc2IuYXBwZW5kKHN0cmluZywgaW5kZXggKyAxLCBsYXN0IC0gaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVGaXJzdE9jY3VycmVuY2VPbl8oc3RyaW5nLCBjLCBzYiwgaW5kZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVGaXJzdE9jY3VycmVuY2VPbl8oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiLCBpbnQgaW5kZXgpIHsKLQkJaW50IGxhc3QgPSBzdHJpbmcubGVuZ3RoIC0gMTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZnJvbnQgb2Ygc3RyaW5nCi0JCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBsYXN0KTsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSBsYXN0KSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiBzdHJpbmcKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDAsIGxhc3QpOwotCQl9IGVsc2UgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDAsIGluZGV4KTsKLQkJCXNiLmFwcGVuZChzdHJpbmcsIGluZGV4ICsgMSwgbGFzdCAtIGluZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXMoY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVBbGxPY2N1cnJlbmNlcyhTdHJpbmcgc3RyaW5nLCBjaGFyIGMpIHsKLQkJaW50IGZpcnN0ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogbmV3IFN0cmluZyhyZW1vdmVBbGxPY2N1cnJlbmNlc18oc3RyaW5nLnRvQ2hhckFycmF5KCksIGMsIGZpcnN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgZmlyc3QgPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBjLCBmaXJzdCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgZmlyc3QgPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBjLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgYywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXMoY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJaW50IGZpcnN0ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJcmV0dXJuIChmaXJzdCA9PSAtMSkgPyBzdHJpbmcgOiByZW1vdmVBbGxPY2N1cnJlbmNlc18oc3RyaW5nLCBjLCBmaXJzdCk7Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHJlbW92ZUFsbE9jY3VycmVuY2VzXyhjaGFyW10gc3RyaW5nLCBjaGFyIGMsIGludCBmaXJzdCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyaW5nLmxlbmd0aCk7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZywgYywgZmlyc3QsIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHdyaXRlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBmaXJzdCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcsIGMsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhjaGFyW10gc3RyaW5nLCBjaGFyIGMsIGludCBmaXJzdCwgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgZmlyc3QsIHdyaXRlcik7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBkID0gc3RyaW5nW2ldOwotCQkJaWYgKGQgIT0gYykgewotCQkJCXdyaXRlQ2hhck9uKGQsIHdyaXRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcsIGMsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT25fKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgaW50IGZpcnN0LCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZywgMCwgZmlyc3QpOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgZCA9IHN0cmluZ1tpXTsKLQkJCWlmIChkICE9IGMpIHsKLQkJCQlzYi5hcHBlbmQoZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcsIGMsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT25fKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgaW50IGZpcnN0LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGQgPSBzdHJpbmdbaV07Ci0JCQlpZiAoZCAhPSBjKSB7Ci0JCQkJc2IuYXBwZW5kKGQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbFNwYWNlcyhTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiByZW1vdmVBbGxPY2N1cnJlbmNlcyhzdHJpbmcsICcgJyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIHdyaXRlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsU3BhY2VzT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkCi0JICogc3RyaW5nIGJ1ZmZlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsU3BhY2VzT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHNwYWNlcwotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIHNwZWNpZmllZAotCSAqIHN0cmluZyBidWlsZGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXNPbihTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsU3BhY2VzKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbE9jY3VycmVuY2VzKHN0cmluZywgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB3cml0ZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlc09uKFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsU3BhY2VzT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uKHN0cmluZywgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHNwYWNlcwotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXNPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uKHN0cmluZywgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXNPbihTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVBbGxXaGl0ZXNwYWNlKFN0cmluZyBzdHJpbmcpIHsKLQkJY2hhcltdIHN0cmluZzIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZzIpOwotCQlyZXR1cm4gKGZpcnN0ID09IC0xKSA/IHN0cmluZyA6IG5ldyBTdHJpbmcocmVtb3ZlQWxsV2hpdGVzcGFjZV8oc3RyaW5nMiwgZmlyc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHdyaXRlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJY2hhcltdIHN0cmluZzIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZzIpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcyLCBmaXJzdCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJY2hhcltdIHN0cmluZzIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZzIpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcyLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZSBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsV2hpdGVzcGFjZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsV2hpdGVzcGFjZShjaGFyW10gc3RyaW5nKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlyZXR1cm4gKGZpcnN0ID09IC0xKSA/IHN0cmluZyA6IHJlbW92ZUFsbFdoaXRlc3BhY2VfKHN0cmluZywgZmlyc3QpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBpbmRleE9mV2hpdGVzcGFjZV8oY2hhcltdIHN0cmluZykgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc3RyaW5nW2ldKSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsV2hpdGVzcGFjZV8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0KSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHJpbmcubGVuZ3RoKTsKLQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oc3RyaW5nLCBmaXJzdCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhjaGFyW10gc3RyaW5nLCBpbnQgZmlyc3QsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDAsIGZpcnN0LCB3cml0ZXIpOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHN0cmluZ1tpXTsKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0JCQkJd3JpdGVDaGFyT24oYywgd3JpdGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oc3RyaW5nLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbaV07Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCXNiLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFdoaXRlc3BhY2VPbihTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oc3RyaW5nLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBmaXJzdCk7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gc3RyaW5nW2ldOwotCQkJaWYgKCAhIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29tbW9uIHByZWZpeCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBzaGFyZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJpbmdzLgotCSAqIFN0cmluZyNjb21tb25QcmVmaXhMZW5ndGgoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbW1vblByZWZpeExlbmd0aChTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQlyZXR1cm4gY29tbW9uUHJlZml4TGVuZ3RoKHMxLnRvQ2hhckFycmF5KCksIHMyLnRvQ2hhckFycmF5KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gcHJlZml4IHNoYXJlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmluZ3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29tbW9uUHJlZml4TGVuZ3RoKGNoYXJbXSBzMSwgY2hhcltdIHMyKSB7Ci0JCXJldHVybiBjb21tb25QcmVmaXhMZW5ndGhfKHMxLCBzMiwgTWF0aC5taW4oczEubGVuZ3RoLCBzMi5sZW5ndGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBzaGFyZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJpbmdzOwotCSAqIGJ1dCBsaW1pdCB0aGUgbGVuZ3RoIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bS4KLQkgKiBTdHJpbmcjY29tbW9uUHJlZml4TGVuZ3RoKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbW1vblByZWZpeExlbmd0aChTdHJpbmcgczEsIFN0cmluZyBzMiwgaW50IG1heCkgewotCQlyZXR1cm4gY29tbW9uUHJlZml4TGVuZ3RoKHMxLnRvQ2hhckFycmF5KCksIHMyLnRvQ2hhckFycmF5KCksIG1heCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5nczsKLQkgKiBidXQgbGltaXQgdGhlIGxlbmd0aCB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29tbW9uUHJlZml4TGVuZ3RoKGNoYXJbXSBzMSwgY2hhcltdIHMyLCBpbnQgbWF4KSB7Ci0JCXJldHVybiBjb21tb25QcmVmaXhMZW5ndGhfKHMxLCBzMiwgTWF0aC5taW4obWF4LCBNYXRoLm1pbihzMS5sZW5ndGgsIHMyLmxlbmd0aCkpKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gcHJlZml4IHNoYXJlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmluZ3M7Ci0JICogYnV0IGxpbWl0IHRoZSBsZW5ndGggdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtLiBBc3N1bWUgdGhlIHNwZWNpZmllZAotCSAqIG1heGltdW0gaXMgbGVzcyB0aGFuIHRoZSBsZW5ndGhzIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgY29tbW9uUHJlZml4TGVuZ3RoXyhjaGFyW10gczEsIGNoYXJbXSBzMiwgaW50IG1heCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlpZiAoczFbaV0gIT0gczJbaV0pIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwkvLyBhbGwgdGhlIGNoYXJhY3RlcnMgdXAgdG8gJ21heCcgYXJlIHRoZSBzYW1lCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGNhcGl0YWxpemF0aW9uICoqKioqKioqKioKLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgbG93ZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjYXBpdGFsaXplXyhjaGFyW10gc3RyaW5nKSB7Ci0JCXN0cmluZ1swXSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHJpbmdbMF0pOwotCQlyZXR1cm4gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGgKLQkgKiBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNhcGl0YWxpemUoY2hhcltdIHN0cmluZykgewotCQlpZiAoKHN0cmluZy5sZW5ndGggPT0gMCkgfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZ1swXSkpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGNhcGl0YWxpemVfKHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKiBTdHJpbmcjY2FwaXRhbGl6ZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwaXRhbGl6ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmICgoc3RyaW5nLmxlbmd0aCgpID09IDApIHx8IENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmcuY2hhckF0KDApKSkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhjYXBpdGFsaXplXyhzdHJpbmcudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgdXBwZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHJpbmdbMF0pKTsKLQkJc2IuYXBwZW5kKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzBdKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKiBTdHJpbmcjY2FwaXRhbGl6ZU9uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgdXBwZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyaW5nWzBdKSk7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDEsIHN0cmluZy5sZW5ndGggLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzBdKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICogU3RyaW5nI2NhcGl0YWxpemVPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY2FwaXRhbGl6ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciB1cHBlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT25fKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVDaGFyT24oQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0cmluZ1swXSksIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMF0pKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKiBTdHJpbmcjY2FwaXRhbGl6ZU9uKFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmcuY2hhckF0KDApKSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciBsb3dlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHVuY2FwaXRhbGl6ZV8oY2hhcltdIHN0cmluZykgewotCQlzdHJpbmdbMF0gPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc3RyaW5nWzBdKTsKLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKGNoYXJbXSBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShzdHJpbmdbMF0pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBpZiBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGNoYXJhY3RlcnMgYXJlIGNhcGl0YWxpemVkLAotCQkvLyByZXR1cm4gdGhlIHN0cmluZyB1bmNoYW5nZWQKLQkJaWYgKChzdHJpbmcubGVuZ3RoID4gMSkKLQkJCQkmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzFdKQotCQkJCSYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMF0pKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgYW5kIHJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGl0cwotCSAqIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSB1bmNhcGl0YWxpemUoY2hhcltdIHN0cmluZykgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gdW5jYXBpdGFsaXplXyhzdHJpbmcpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGlmIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2hhcmFjdGVycyBhcmUgY2FwaXRhbGl6ZWQsCi0JCS8vIHJldHVybiB0aGUgc3RyaW5nIHVuY2hhbmdlZAotCQlpZiAoKHN0cmluZy5sZW5ndGgoKSA+IDEpCi0JCQkJJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMSkpCi0JCQkJJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqIFN0cmluZyN1bmNhcGl0YWxpemUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuY2FwaXRhbGl6ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKHVuY2FwaXRhbGl6ZV8oc3RyaW5nLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIGxvd2VyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHJpbmdbMF0pKTsKLQkJc2IuYXBwZW5kKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqIFN0cmluZyN1bmNhcGl0YWxpemVPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgbG93ZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHJpbmdbMF0pKTsKLQkJc2IuYXBwZW5kKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uXyhzdHJpbmcsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqIFN0cmluZyN1bmNhcGl0YWxpemVPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIHVwcGVyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHJpbmdbMF0pLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKiBTdHJpbmcjdW5jYXBpdGFsaXplT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiAjdG9TdHJpbmcoKSBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhICJzdGFuZGFyZCIgI3RvU3RyaW5nKCkgcmVzdWx0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdAotCSAqIGFuZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uOgotCSAqIAlDbGFzc05hbWVbMDBGM0VFNDJdIChhZGQnbCBpbmZvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVG9TdHJpbmdGb3IoT2JqZWN0IG8sIE9iamVjdCBhZGRpdGlvbmFsSW5mbykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJYnVpbGRTaW1wbGVUb1N0cmluZ09uKG8sIHNiKTsKLQkJc2IuYXBwZW5kKCIgKCIpOwotCQlzYi5hcHBlbmQoYWRkaXRpb25hbEluZm8pOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSAic3RhbmRhcmQiIHNpbXBsZSAjdG9TdHJpbmcoKSByZXN1bHQgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0OgotCSAqIAlDbGFzc05hbWVbMDBGM0VFNDJdCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRUb1N0cmluZ0ZvcihPYmplY3QgbykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJYnVpbGRTaW1wbGVUb1N0cmluZ09uKG8sIHNiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIGEgInN0YW5kYXJkIiBzaW1wbGUgI3RvU3RyaW5nKCkgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvCi0JICogdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyOgotCSAqIAlDbGFzc05hbWVbMDBGM0VFNDJdCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGJ1aWxkU2ltcGxlVG9TdHJpbmdPbihPYmplY3QgbywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDbGFzc1Rvb2xzLnRvU3RyaW5nQ2xhc3NOYW1lRm9yT2JqZWN0KG8pKTsKLQkJc2IuYXBwZW5kKCdbJyk7Ci0JCS8vIHVzZSBTeXN0ZW0jaWRlbnRpdHlIYXNoQ29kZShPYmplY3QpLCBzaW5jZSBPYmplY3QjaGFzaENvZGUoKSBtYXkgYmUgb3ZlcnJpZGRlbgotCQlzYi5hcHBlbmQoemVyb1BhZChJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG8pKS50b1VwcGVyQ2FzZSgpLCA4KSk7Ci0JCXNiLmFwcGVuZCgnXScpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCBhICJzdGFuZGFyZCIgc2ltcGxlICN0b1N0cmluZygpIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCB0bwotCSAqIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXI6Ci0JICogCUNsYXNzTmFtZVswMEYzRUU0Ml0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYnVpbGRTaW1wbGVUb1N0cmluZ09uKE9iamVjdCBvLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDbGFzc1Rvb2xzLnRvU3RyaW5nQ2xhc3NOYW1lRm9yT2JqZWN0KG8pKTsKLQkJc2IuYXBwZW5kKCdbJyk7Ci0JCS8vIHVzZSBTeXN0ZW0jaWRlbnRpdHlIYXNoQ29kZShPYmplY3QpLCBzaW5jZSBPYmplY3QjaGFzaENvZGUoKSBtYXkgYmUgb3ZlcnJpZGRlbgotCQlzYi5hcHBlbmQoemVyb1BhZChJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG8pKS50b1VwcGVyQ2FzZSgpLCA4KSk7Ci0JCXNiLmFwcGVuZCgnXScpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIG51bGwsIGVtcHR5LCBvciBjb250YWlucwotCSAqIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0VtcHR5KFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKChzdHJpbmcgPT0gbnVsbCkgfHwgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0lzRW1wdHlfKHN0cmluZy50b0NoYXJBcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBudWxsLCBlbXB0eSwgb3IgY29udGFpbnMKLQkgKiBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eShjaGFyW10gc3RyaW5nKSB7Ci0JCWlmICgoc3RyaW5nID09IG51bGwpIHx8IChzdHJpbmcubGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNFbXB0eV8oc3RyaW5nKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHlfKGNoYXJbXSBzKSB7Ci0JCWZvciAoaW50IGkgPSBzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgYXJlIGVxdWFsLCBpZ25vcmluZyBjYXNlLgotCSAqIENoZWNrIGZvciBudWxscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZShTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQlpZiAoKHMxID09IG51bGwpICYmIChzMiA9PSBudWxsKSkgewotCQkJcmV0dXJuIHRydWU7ICAvLyBib3RoIGFyZSBudWxsCi0JCX0KLQkJaWYgKChzMSA9PSBudWxsKSB8fCAoczIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIG9uZSBpcyBudWxsIGJ1dCB0aGUgb3RoZXIgaXMgbm90Ci0JCX0KLQkJcmV0dXJuIHMxLmVxdWFsc0lnbm9yZUNhc2UoczIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgYXJlIGVxdWFsLCBpZ25vcmluZyBjYXNlLgotCSAqIENoZWNrIGZvciBudWxscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZShjaGFyW10gczEsIGNoYXJbXSBzMikgewotCQlpZiAoKHMxID09IG51bGwpICYmIChzMiA9PSBudWxsKSkgewotCQkJcmV0dXJuIHRydWU7ICAvLyBib3RoIGFyZSBudWxsCi0JCX0KLQkJaWYgKChzMSA9PSBudWxsKSB8fCAoczIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIG9uZSBpcyBudWxsIGJ1dCB0aGUgb3RoZXIgaXMgbm90Ci0JCX0KLQkJaWYgKHMxLmxlbmd0aCAhPSBzMi5sZW5ndGgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gczEubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKHMxW2ldLCBzMltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsCi0JICogaWdub3JpbmcgY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoY2hhcltdIHN0cmluZywgY2hhcltdIHByZWZpeCkgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA8IHByZWZpeC5sZW5ndGgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gcHJlZml4Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZShzdHJpbmdbaV0sIHByZWZpeFtpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LAotCSAqIGlnbm9yaW5nIGNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIHN0cmluZy5yZWdpb25NYXRjaGVzKHRydWUsIDAsIHByZWZpeCwgMCwgcHJlZml4Lmxlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcnMgYXJlIGFyZSBlcXVhbCwgaWdub3JpbmcgY2FzZS4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcjcmVnaW9uTWF0Y2hlcyhib29sZWFuLCBpbnQsIFN0cmluZywgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoY2hhciBjMSwgY2hhciBjMikgewotCQkvLyAgc29tZXRoaW5nIGFib3V0IHRoZSBHZW9yZ2lhbiBhbHBoYWJldCByZXF1aXJlcyB1cyB0byBjaGVjayBsb3dlciBjYXNlIGFsc28KLQkJcmV0dXJuIChjMSA9PSBjMikKLQkJCQl8fCAoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMxKSA9PSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYzIpKQotCQkJCXx8IChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYzEpID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjMikpOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcyhTdHJpbmcgY2FtZWxDYXNlU3RyaW5nKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIGNhbWVsQ2FzZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBjYW1lbENhc2VTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNfKGNhbWVsQ2FzZVN0cmluZywgbGVuKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc18oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IGxlbikgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuICogMik7Ci0JCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBsZW4sIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbGVuLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBsZW4sIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHsJLy8gTkI6IHN0YXJ0IGF0IDEgYW5kIGVuZCBhdCBsZW4hCi0JCQljID0gbmV4dDsKLQkJCW5leHQgPSAoKGkgPT0gbGVuKSA/IDAgOiBjYW1lbENhc2VTdHJpbmdbaV0pOwotCQkJaWYgKGNhbWVsQ2FzZVdvcmRCcmVha18ocHJldiwgYywgbmV4dCkpIHsKLQkJCQl3cml0ZUNoYXJPbignXycsIHdyaXRlcik7Ci0JCQl9Ci0JCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9VcHBlckNhc2UoYyksIHdyaXRlcik7Ci0JCQlwcmV2ID0gYzsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcyhTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmICgobGVuID09IDApIHx8IChtYXhMZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBjYW1lbENhc2VTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc18oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIG1heExlbmd0aCwgbGVuKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChtYXhMZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBjYW1lbENhc2VTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNfKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBpbnQgbGVuKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihtYXhMZW5ndGgpOwotCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBtYXhMZW5ndGgsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIG1heExlbmd0aCwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgaW50IGxlbiwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXIgcHJldiA9IDA7CS8vIGFzc3VtZSAwIGlzIG5vdCBhIHZhbGlkIGNoYXIKLQkJY2hhciBjID0gMDsKLQkJY2hhciBuZXh0ID0gY2FtZWxDYXNlU3RyaW5nWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrXyhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXNiLmFwcGVuZCgnXycpOwotCQkJCWlmIChzYi5sZW5ndGgoKSA9PSBtYXhMZW5ndGgpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJaWYgKHNiLmxlbmd0aCgpID09IG1heExlbmd0aCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBpbnQgbGVuLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWNoYXIgcHJldiA9IDA7CS8vIGFzc3VtZSAwIGlzIG5vdCBhIHZhbGlkIGNoYXIKLQkJY2hhciBjID0gMDsKLQkJY2hhciBuZXh0ID0gY2FtZWxDYXNlU3RyaW5nWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrXyhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXNiLmFwcGVuZCgnXycpOwotCQkJCWlmIChzYi5sZW5ndGgoKSA9PSBtYXhMZW5ndGgpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJaWYgKHNiLmxlbmd0aCgpID09IG1heExlbmd0aCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbWF4TGVuZ3RoLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIG1heExlbmd0aCwgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWludCB3cml0ZXJMZW5ndGggPSAwOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrXyhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXdyaXRlQ2hhck9uKCdfJywgd3JpdGVyKTsKLQkJCQlpZiAoKyt3cml0ZXJMZW5ndGggPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9VcHBlckNhc2UoYyksIHdyaXRlcik7Ci0JCQlpZiAoKyt3cml0ZXJMZW5ndGggPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc2VyaWVzIG9mIGNoYXJhY3RlcnMgb2NjdXIgYXQKLQkgKiBhICJjYW1lbCBjYXNlIiB3b3JrIGJyZWFrOgotCSAqICAgICAiKmFhIiAtPiBmYWxzZQotCSAqICAgICAiKkFBIiAtPiBmYWxzZQotCSAqICAgICAiKkFhIiAtPiBmYWxzZQotCSAqICAgICAiQWFBIiAtPiBmYWxzZQotCSAqICAgICAiQUFBIiAtPiBmYWxzZQotCSAqICAgICAiYWEqIiAtPiBmYWxzZQotCSAqICAgICAiQWFBIiAtPiBmYWxzZQotCSAqICAgICAiYUFhIiAtPiB0cnVlCi0JICogICAgICJBQSoiIC0+IGZhbHNlCi0JICogICAgICJBQWEiIC0+IHRydWUKLQkgKiB3aGVyZSAnKicgPT0gYW55IGNoYXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhbWVsQ2FzZVdvcmRCcmVha18oY2hhciBwcmV2LCBjaGFyIGMsIGNoYXIgbmV4dCkgewotCQlpZiAocHJldiA9PSAwKSB7CS8vIHN0YXJ0IG9mIHN0cmluZwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoYykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHByZXYpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAobmV4dCA9PSAwKSB7CS8vIGVuZCBvZiBzdHJpbmcKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKG5leHQpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gIkxhcmdlUHJvamVjdCIKLQkgKiBDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoU3RyaW5nIHVuZGVyc2NvcmVTdHJpbmcpIHsKLQkJcmV0dXJuIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKHVuZGVyc2NvcmVTdHJpbmcsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gIkxhcmdlUHJvamVjdCIKLQkgKiBDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcpIHsKLQkJcmV0dXJuIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKHVuZGVyc2NvcmVTdHJpbmcsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZShTdHJpbmcgdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHVuZGVyc2NvcmVTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VfKHVuZGVyc2NvcmVTdHJpbmcudG9DaGFyQXJyYXkoKSwgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdW5kZXJzY29yZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VfKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VfKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgaW50IGxlbikgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuKTsKLQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8odW5kZXJzY29yZVN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKFN0cmluZyB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcudG9DaGFyQXJyYXkoKSwgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8odW5kZXJzY29yZVN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8oY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBpbnQgbGVuLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsKLQkJY2hhciBjID0gMDsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXByZXYgPSBjOwotCQkJYyA9IHVuZGVyc2NvcmVTdHJpbmdbaV07Ci0JCQlpZiAoYyA9PSAnXycpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmaXJzdCkgewotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJaWYgKGNhcGl0YWxpemVGaXJzdExldHRlcikgewotCQkJCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwcmV2ID09ICdfJykgewotCQkJCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oU3RyaW5nIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcudG9DaGFyQXJyYXkoKSwgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgaW50IGxlbiwgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyIHByZXYgPSAwOwotCQljaGFyIGMgPSAwOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJcHJldiA9IGM7Ci0JCQljID0gdW5kZXJzY29yZVN0cmluZ1tpXTsKLQkJCWlmIChjID09ICdfJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlpZiAoY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKSB7Ci0JCQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHByZXYgPT0gJ18nKSB7Ci0JCQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihTdHJpbmcgdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8odW5kZXJzY29yZVN0cmluZy50b0NoYXJBcnJheSgpLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbiwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyhjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJY2hhciBwcmV2ID0gMDsKLQkJY2hhciBjID0gMDsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXByZXYgPSBjOwotCQkJYyA9IHVuZGVyc2NvcmVTdHJpbmdbaV07Ci0JCQlpZiAoYyA9PSAnXycpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmaXJzdCkgewotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJaWYgKGNhcGl0YWxpemVGaXJzdExldHRlcikgewotCQkJCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9VcHBlckNhc2UoYyksIHdyaXRlcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJd3JpdGVDaGFyT24oQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpLCB3cml0ZXIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHByZXYgPT0gJ18nKSB7Ci0JCQkJCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSwgd3JpdGVyKTsKLQkJCQl9IGVsc2UgewotCQkJCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYyksIHdyaXRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRUb0NoYXJBcnJheShTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJc2IuZ2V0Q2hhcnMoMCwgbGVuLCByZXN1bHQsIDApOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRUb0NoYXJBcnJheShTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBzYi5sZW5ndGgoKTsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbl07Ci0JCXNiLmdldENoYXJzKDAsIGxlbiwgcmVzdWx0LCAwKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKHN0cmluZyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nT24oY2hhcltdIHN0cmluZywgaW50IG9mZiwgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKHN0cmluZywgb2ZmLCBsZW4pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVN0cmluZ09uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZShzdHJpbmcpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUNoYXJPbihjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZShjKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEJvb2xlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiNmJjMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzeW5jaHJvbml6ZWQgYWNjZXNzIHRvIGEgYm9vbGVhbiB2YWx1ZS4KLSAqIEl0IGFsc28gcHJvdmlkZXMgcHJvdG9jb2wgZm9yIHN1c3BlbmRpbmcgYSB0aHJlYWQgdW50aWwgdGhlCi0gKiBib29sZWFuIHZhbHVlIGlzIHNldCB0byB0cnVlIG9yIGZhbHNlLCB3aXRoIG9wdGlvbmFsIHRpbWUtb3V0cy4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEJvb2xlYW4KLQlpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgYm9vbGVhbi4gKi8KLQlwcml2YXRlIGJvb2xlYW4gdmFsdWU7Ci0KLQkvKiogT2JqZWN0IHRvIHN5bmNocm9uaXplIG9uLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG11dGV4OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBib29sZWFuIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlCi0JICogYW5kIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRCb29sZWFuKGJvb2xlYW4gdmFsdWUsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgYm9vbGVhbiB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQm9vbGVhbihib29sZWFuIHZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIGJvb2xlYW4gd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIGZhbHNlCi0JICogYW5kIHNwZWNpZmllZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQm9vbGVhbihPYmplY3QgbXV0ZXgpIHsKLQkJdGhpcyhmYWxzZSwgbXV0ZXgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBib29sZWFuIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQm9vbGVhbigpIHsKLQkJdGhpcyhmYWxzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgYm9vbGVhbiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IGJvb2xlYW4gdmFsdWUgaXMgdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RydWUoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCBib29sZWFuIHZhbHVlIGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFsc2UoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuICEgdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgYm9vbGVhbiB2YWx1ZS4gSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nCi0JICogdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWlmICh0aGlzLnZhbHVlICE9IHZhbHVlKSB7Ci0JCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGJvb2xlYW4gdmFsdWUgdG8gdHJ1ZS4gSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nCi0JICogdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJ1ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLnNldFZhbHVlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBib29sZWFuIHZhbHVlIHRvIGZhbHNlLiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcKLQkgKiB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGYWxzZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLnNldFZhbHVlKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IHRoaXMgb2JqZWN0IGxvY2tzIG9uIHdoaWxlIHBlcmZvcm1pbmcKLQkgKiBpdHMgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IG11dGV4KCkgewotCQlyZXR1cm4gdGhpcy5tdXRleDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZWZpbml0ZSB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgYm9vbGVhbiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIGJvb2xlYW4gdmFsdWUgaXMgYWxyZWFkeSB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzKGJvb2xlYW4gdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl3aGlsZSAodGhpcy52YWx1ZSAhPSB2KSB7Ci0JCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgYm9vbGVhbiB2YWx1ZSBjaGFuZ2VzIHRvIHRydWUuCi0JICogSWYgdGhlIGJvb2xlYW4gdmFsdWUgaXMgYWxyZWFkeSB0cnVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsVHJ1ZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIGJvb2xlYW4gdmFsdWUgY2hhbmdlcyB0byBmYWxzZS4KLQkgKiBJZiB0aGUgYm9vbGVhbiB2YWx1ZSBpcyBhbHJlYWR5IGZhbHNlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsRmFsc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJcyhmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgYm9vbGVhbiB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogTk9UIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuIElmIHRoZSBib29sZWFuIHZhbHVlIGlzIGFscmVhZHkKLQkgKiBOT1QgdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlCi0JICogaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvU2V0VmFsdWUoYm9vbGVhbiB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJcyggISB2KTsKLQkJCXRoaXMuc2V0VmFsdWUodik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgYm9vbGVhbiB2YWx1ZSBjaGFuZ2VzIHRvIGZhbHNlLAotCSAqIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gdHJ1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgYm9vbGVhbgotCSAqIHZhbHVlIGlzIGFscmVhZHkgZmFsc2UsIHNldCB0aGUgdmFsdWUgdG8gdHJ1ZSBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9TZXRUcnVlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRUb1NldFZhbHVlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIGJvb2xlYW4gdmFsdWUgY2hhbmdlcyB0byB0cnVlLAotCSAqIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gZmFsc2UgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIGJvb2xlYW4KLQkgKiB2YWx1ZSBpcyBhbHJlYWR5IHRydWUsIHNldCB0aGUgdmFsdWUgdG8gZmFsc2UgaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvU2V0RmFsc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFRvU2V0VmFsdWUoZmFsc2UpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRpbWVkIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBib29sZWFuIHZhbHVlIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gZmFsc2UgaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgYm9vbGVhbiB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiB0cnVlCi0JICogaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsVmFsdWVJcyhib29sZWFuIHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJCXRoaXMud2FpdFVudGlsVmFsdWVJcyh2KTsJLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCQlyZXR1cm4gdHJ1ZTsJLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJCX0KLQkKLQkJCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJCXdoaWxlICgodGhpcy52YWx1ZSAhPSB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJcmV0dXJuICh0aGlzLnZhbHVlID09IHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIGJvb2xlYW4gdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRydWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiBmYWxzZSBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBib29sZWFuIHZhbHVlIGlzIGFscmVhZHkgdHJ1ZSwgcmV0dXJuIHRydWUgaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsVHJ1ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJcyh0cnVlLCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBib29sZWFuIHZhbHVlIGNoYW5nZXMKLQkgKiB0byBmYWxzZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIGZhbHNlIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIGJvb2xlYW4gdmFsdWUgaXMgYWxyZWFkeSB0cnVlLCByZXR1cm4gdHJ1ZSBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxGYWxzZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJcyhmYWxzZSwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgYm9vbGVhbiB2YWx1ZSBjaGFuZ2VzIHRvIE5PVCB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBhbmQgY29udGludWUKLQkgKiBleGVjdXRpbmcuIElmIHRoZSBib29sZWFuIHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0byBmYWxzZSBiZWZvcmUgdGhlCi0JICogdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcgd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSB3YXMKLQkgKiBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZTsgcmV0dXJuIGZhbHNlIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIGJvb2xlYW4gdmFsdWUgaXMgYWxyZWFkeSBOT1QgdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0IHRoZSB2YWx1ZQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW1tZWRpYXRlbHkgYW5kIHJldHVybiB0cnVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldFZhbHVlKGJvb2xlYW4gdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsVmFsdWVJcyggISB2LCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJdGhpcy5zZXRWYWx1ZSh2KTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIGJvb2xlYW4gdmFsdWUgY2hhbmdlcyB0byBmYWxzZSwKLQkgKiB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIHRydWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIGJvb2xlYW4KLQkgKiB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdG8gZmFsc2UgYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlCi0JICogZXhlY3V0aW5nIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZhbHVlLiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluCi0JICogbWlsbGlzZWNvbmRzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byB0cnVlOyByZXR1cm4gZmFsc2UKLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgYm9vbGVhbiB2YWx1ZSBpcyBhbHJlYWR5IGZhbHNlLCBzZXQgdGhlCi0JICogdmFsdWUgdG8gdHJ1ZSBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIHRydWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU2V0VHJ1ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUodHJ1ZSwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgYm9vbGVhbiB2YWx1ZSBjaGFuZ2VzIHRvIHRydWUsCi0JICogdGhlbiBjaGFuZ2UgaXQgYmFjayB0byBmYWxzZSBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgYm9vbGVhbgotCSAqIHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0byB0cnVlIGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZQotCSAqIGV4ZWN1dGluZyB3aXRob3V0IGNoYW5naW5nIHRoZSB2YWx1ZS4gVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbgotCSAqIG1pbGxpc2Vjb25kcy4gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gZmFsc2U7IHJldHVybiBmYWxzZQotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSBib29sZWFuIHZhbHVlIGlzIGFscmVhZHkgdHJ1ZSwgc2V0IHRoZQotCSAqIHZhbHVlIHRvIGZhbHNlIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXRGYWxzZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUoZmFsc2UsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplZCBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGludGVycnVwdGVkLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCAKLQkgKiB3aXRoIHRoZSBtdXRleCBsb2NrZWQuIFRoaXMgaXMgdXNlZnVsIGZvciBpbml0aWFsaXppbmcgdGhlIHZhbHVlIGluIGFub3RoZXIKLQkgKiB0aHJlYWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCQlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBTeW5jaHJvbml6ZWRCb29sZWFuKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSgpID09ICgoU3luY2hyb25pemVkQm9vbGVhbikgbykudmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUoKSA/IDEgOiAwOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmcudmFsdWVPZih0aGlzLnZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmIwOWMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3luY2hyb25pemVkIGFjY2VzcyB0byBhbiBvYmplY3Qgb2YgdHlwZSBULgotICogSXQgYWxzbyBwcm92aWRlcyBwcm90b2NvbCBmb3Igc3VzcGVuZGluZyBhIHRocmVhZCB1bnRpbCB0aGUKLSAqIHZhbHVlIGlzIHNldCB0byBudWxsIG9yIGEgbm9uLW51bGwgdmFsdWUsIHdpdGggb3B0aW9uYWwgdGltZS1vdXRzLgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkT2JqZWN0PFQ+Ci0JaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIHZhbHVlLiAqLwotCXByaXZhdGUgVCB2YWx1ZTsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZQotCSAqIGFuZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkT2JqZWN0KFQgdmFsdWUsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRPYmplY3QoVCB2YWx1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBvYmplY3Qgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIG51bGwuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZE9iamVjdCgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgVCB2YWx1ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIG51bGwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOdWxsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlID09IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBub3QgbnVsbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vdE51bGwoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgIT0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUuIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZwotCSAqIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlpZiAodGhpcy52YWx1ZSAhPSB2YWx1ZSkgewotCQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCQl0aGlzLm11dGV4Lm5vdGlmeUFsbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byBudWxsLiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcKLQkgKiB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROdWxsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMuc2V0VmFsdWUobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGlzIG9iamVjdCBsb2NrcyBvbiB3aGlsZSBwZXJmb3JtaW5nCi0JICogaXRzIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIE9iamVjdCBtdXRleCgpIHsKLQkJcmV0dXJuIHRoaXMubXV0ZXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGVmaW5pdGUgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzKFQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl3aGlsZSAodGhpcy52YWx1ZSAhPSB2KSB7Ci0JCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZQotCSAqIHZhbHVlIGlzIGFscmVhZHkgTk9UIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzTm90KFQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl3aGlsZSAodGhpcy52YWx1ZSA9PSB2KSB7Ci0JCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBudWxsLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IG51bGwsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxOdWxsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXMobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIG51bGwuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgTk9UIG51bGwsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxOb3ROdWxsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3QobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlCi0JICogaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgTk9UIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHNldAotCSAqIHRoZSB2YWx1ZSBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9TZXRWYWx1ZShUIHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzTm90KHYpOwotCQkJdGhpcy5zZXRWYWx1ZSh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogc29tZXRoaW5nIG90aGVyIHRoYW4gbnVsbCwgdGhlbiBjaGFuZ2UgaXQgYmFjayB0byBudWxsCi0JICogYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgTk9UIG51bGwsCi0JICogc2V0IHRoZSB2YWx1ZSB0byBudWxsIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRUb1NldE51bGwoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsTm90TnVsbCgpOwotCQkJdGhpcy5zZXRWYWx1ZShudWxsKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB0aW1lZCB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiBmYWxzZSBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiB0cnVlIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXMoVCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCQl0aGlzLndhaXRVbnRpbFZhbHVlSXModik7CS8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQkJcmV0dXJuIHRydWU7CS8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCQl9Ci0KLQkJCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJCXdoaWxlICgodGhpcy52YWx1ZSAhPSB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJcmV0dXJuICh0aGlzLnZhbHVlID09IHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gc29tZXRoaW5nCi0JICogb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUgd2FzIHJlbW92ZWQ7IHJldHVybiBmYWxzZSBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IE5PVCB0aGUgc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gdHJ1ZSBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxWYWx1ZUlzTm90KFQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzTm90KHYpOwkvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJCXJldHVybiB0cnVlOwkvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQkJfQotCi0JCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCQl3aGlsZSAoKHRoaXMudmFsdWUgPT0gdikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCXJldHVybiAodGhpcy52YWx1ZSAhPSB2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gbnVsbCBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIGZhbHNlIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgbnVsbCwgcmV0dXJuIHRydWUgaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTnVsbChsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJcyhudWxsLCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gbnVsbCBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIGZhbHNlIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgTk9UIG51bGwsIHJldHVybiB0cnVlIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5vdE51bGwobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3QobnVsbCwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlCi0JICogaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUKLQkgKiBzcGVjaWZpZWQgYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlIGV4ZWN1dGluZwotCSAqIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZhbHVlLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgd2FzCi0JICogc2V0IHRvIHRydWU7IHJldHVybiBmYWxzZSBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHNldAotCSAqIHRoZSB2YWx1ZSBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIHRydWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU2V0VmFsdWUoVCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxWYWx1ZUlzTm90KHYsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLnNldFZhbHVlKHYpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBzb21ldGhpbmcKLQkgKiBvdGhlciB0aGFuIG51bGwsIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gbnVsbCBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gbnVsbCBiZWZvcmUKLQkgKiB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcgd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSB3YXMKLQkgKiBzZXQgdG8gZmFsc2U7IHJldHVybiBmYWxzZSBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBvdGhlciB0aGFuIG51bGwsIHNldAotCSAqIHRoZSB2YWx1ZSB0byBudWxsIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXROdWxsKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbE5vdE51bGwodGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMuc2V0VmFsdWUobnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZWQgYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgY3VycmVudCB0aHJlYWQgaXMgbm90IGludGVycnVwdGVkLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCAKLQkgKiB3aXRoIHRoZSBtdXRleCBsb2NrZWQuIFRoaXMgaXMgdXNlZnVsIGZvciBpbml0aWFsaXppbmcgdGhlIHZhbHVlIGluIGFub3RoZXIKLQkgKiB0aHJlYWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTeW5jaHJvbml6ZWRPYmplY3Q8VD4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3Q8VD4gY2xvbmUgPSAoU3luY2hyb25pemVkT2JqZWN0PFQ+KSBzdXBlci5jbG9uZSgpOwotCQkJCXJldHVybiBjbG9uZTsKLQkJCX0KLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoICEgKG9iaiBpbnN0YW5jZW9mIFN5bmNocm9uaXplZE9iamVjdCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlPYmplY3QgdjEgPSB0aGlzLnZhbHVlKCk7Ci0JCU9iamVjdCB2MiA9ICgoU3luY2hyb25pemVkT2JqZWN0PD8+KSBvYmopLnZhbHVlKCk7Ci0JCXJldHVybiAodjEgPT0gbnVsbCkgPwotCQkJKHYyID09IG51bGwpIDogdjEuZXF1YWxzKHYyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlPYmplY3QgdiA9IHRoaXMudmFsdWUoKTsKLQkJcmV0dXJuICh2ID09IG51bGwpID8gMCA6IHYuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YodGhpcy52YWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFjay5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MzgyYmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuQ29tbWFuZDsKLQotLyoqCi0gKiBUaHJlYWQtc2FmZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RhY2sgaW50ZXJmYWNlLgotICogVGhpcyBhbHNvIHByb3ZpZGVzIHByb3RvY29sIGZvciBzdXNwZW5kaW5nIGEgdGhyZWFkIHVudGlsIHRoZQotICogc3RhY2sgaXMgZW1wdHkgb3Igbm90IGVtcHR5LCB3aXRoIG9wdGlvbmFsIHRpbWUtb3V0cy4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFN0YWNrPEU+Ci0JaW1wbGVtZW50cyBTdGFjazxFPiwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgc3RhY2suICovCi0JcHJpdmF0ZSBTdGFjazxFPiBzdGFjazsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIHN0YWNrIHRoYXQgd3JhcHMgdGhlCi0JICogc3BlY2lmaWVkIHN0YWNrIGFuZCBsb2NrcyBvbiB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGFjayhTdGFjazxFPiBzdGFjaywgT2JqZWN0IG11dGV4KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhY2sgPSBzdGFjazsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBzdGFjayB0aGF0IHdyYXBzIHRoZQotCSAqIHNwZWNpZmllZCBzdGFjayBhbmQgbG9ja3Mgb24gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGFjayhTdGFjazxFPiBzdGFjaykgewotCQlzdXBlcigpOwotCQl0aGlzLnN0YWNrID0gc3RhY2s7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBzdGFjayB0aGF0IGxvY2tzIG9uIHRoZSBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFN0YWNrKE9iamVjdCBtdXRleCkgewotCQl0aGlzKG5ldyBTaW1wbGVTdGFjazxFPigpLCBtdXRleCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIHN0YWNrIHRoYXQgbG9ja3Mgb24gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGFjaygpIHsKLQkJdGhpcyhuZXcgU2ltcGxlU3RhY2s8RT4oKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0YWNrIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHB1c2goRSBvKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy5zdGFjay5wdXNoKG8pOwotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBFIHBvcCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlFIG8gPSB0aGlzLnN0YWNrLnBvcCgpOwotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJCXJldHVybiBvOwotCQl9Ci0JfQotCi0JcHVibGljIEUgcGVlaygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zdGFjay5wZWVrKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnN0YWNrLmlzRW1wdHkoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRlZmluaXRlIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjaydzIGVtcHR5IHN0YXR1cyBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxFbXB0eUlzKGJvb2xlYW4gZW1wdHkpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJd2hpbGUgKHRoaXMuaXNFbXB0eSgpICE9IGVtcHR5KSB7Ci0JCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsRW1wdHkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJcyh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBoYXMgc29tZXRoaW5nIG9uIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVtcHR5KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXMoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5LAotCSAqIHRoZW4gInB1c2giIHRoZSBzcGVjaWZpZWQgaXRlbSBvbiB0byB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvUHVzaChFIG8pIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFbXB0eSgpOwotCQkJdGhpcy5wdXNoKG8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGhhcyBzb21ldGhpbmcgb24gaXQsCi0JICogdGhlbiAicG9wIiBhbiBpdGVtIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIHJldHVybiBpdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHdhaXRUb1BvcCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxOb3RFbXB0eSgpOwotCQkJcmV0dXJuIHRoaXMucG9wKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGltZWQgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrJ3MgZW1wdHkgc3RhdHVzIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gZmFsc2UgaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxFbXB0eUlzKGJvb2xlYW4gZW1wdHksIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJCXRoaXMud2FpdFVudGlsRW1wdHlJcyhlbXB0eSk7CS8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQkJcmV0dXJuIHRydWU7CS8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCQl9Ci0KLQkJCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJCXdoaWxlICgodGhpcy5pc0VtcHR5KCkgIT0gZW1wdHkpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gKHRoaXMuaXNFbXB0eSgpID09IGVtcHR5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eQotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gdHJ1ZSBpZgotCSAqIHRoZSBzdGFjayBpcyBlbXB0eTsgcmV0dXJuIGZhbHNlIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsRW1wdHkobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbEVtcHR5SXModHJ1ZSwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaGFzIHNvbWV0aGluZyBvbiBpdC4KLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIHRydWUgaWYKLQkgKiB0aGUgc3RhY2sgaGFzIHNvbWV0aGluZyBvbiBpdDsgcmV0dXJuIGZhbHNlIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTm90RW1wdHkobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbEVtcHR5SXMoZmFsc2UsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5LAotCSAqIHRoZW4gInB1c2giIHRoZSBzcGVjaWZpZWQgaXRlbSBvbiB0byB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIGFuZCBjb250aW51ZSBleGVjdXRpbmcuIElmIHRoZSBzdGFjayBpcyBub3QgZW1wdGllZCBvdXQKLQkgKiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nIHdpdGhvdXQKLQkgKiAicHVzaGluZyIgdGhlIGl0ZW0uCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiB0cnVlIGlmIHRoZQotCSAqIGl0ZW0gd2FzIHB1c2hlZDsgcmV0dXJuIGZhbHNlIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvUHVzaChFIG8sIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbEVtcHR5KHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLnB1c2gobyk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBoYXMgc29tZXRoaW5nIG9uIGl0LAotCSAqIHRoZW4gInBvcCIgYW4gaXRlbSBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGFuZCByZXR1cm4gaXQuCi0JICogSWYgdGhlIHN0YWNrIGlzIGVtcHR5IGFuZCBub3RoaW5nIGlzICJwdXNoZWQiIG9uIHRvIGl0IGJlZm9yZSB0aGUKLQkgKiB0aW1lLW91dCwgdGhyb3cgYW4gZW1wdHkgc3RhY2sgZXhjZXB0aW9uLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLgotCSAqLwotCXB1YmxpYyBPYmplY3Qgd2FpdFRvUG9wKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbE5vdEVtcHR5KHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQlyZXR1cm4gdGhpcy5wb3AoKTsKLQkJCX0KLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemVkIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgaW50ZXJydXB0ZWQsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIAotCSAqIHdpdGggdGhlIG11dGV4IGxvY2tlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGluaXRpYWxpemluZyB0aGUgc3RhY2sgaW4gYW5vdGhlcgotCSAqIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJfQotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZGl0aW9uYWwgcHVibGljIHByb3RvY29sICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IHRoaXMgb2JqZWN0IGxvY2tzIG9uIHdoaWxlIHBlcmZvcm1pbmcKLQkgKiBpdHMgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IG11dGV4KCkgewotCQlyZXR1cm4gdGhpcy5tdXRleDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnN0YWNrLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9UcmFuc2Zvcm1lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1RyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZTRjYzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1RyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIHRyYW5zZm9ybSBvYmplY3RzLgotICogVHJhbnNmb3JtIGFuIG9iamVjdCBvZiB0eXBlIFQxIHRvIGFuIG9iamVjdCBvZiB0eXBlIFQyLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyYW5zZm9ybWVyPFQxLCBUMj4gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCBvYmplY3QuCi0JICogVGhlIHNlbWFudGljcyBvZiAidHJhbnNmb3JtIiBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotCSAqIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKi8KLQlUMiB0cmFuc2Zvcm0oVDEgbyk7Ci0KLQotCWZpbmFsIGNsYXNzIE51bGw8UzEsIFMyPiBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPFMxLCBTMj4gewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSMSwgUjI+IFRyYW5zZm9ybWVyPFIxLCBSMj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCwgdW5jaGFuZ2VkCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgUzIgdHJhbnNmb3JtKFMxIG8pIHsKLQkJCXJldHVybiAoUzIpIG87Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRyYW5zZm9ybWVyLk51bGwiOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQ8UzEsIFMyPiBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPFMxLCBTMj4gewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8UjEsIFIyPiBUcmFuc2Zvcm1lcjxSMSwgUjI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTMiB0cmFuc2Zvcm0oUzEgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRyYW5zZm9ybWVyLkRpc2FibGVkIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYzM1OWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotLyoqCi0gKiBUaGlzIGVuY29kZXIgd2lsbCByZXBsYWNlIGFueSBvZiBhIHNwZWNpZmllZCBzZXQgb2YgY2hhcmFjdGVycyB3aXRoIGFuIFhNTAotICogImNoYXJhY3RlciByZWZlcmVuY2UiOiAnLycgPT4gIiYjeDJmOyIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTFN0cmluZ0VuY29kZXIgewotCi0JLyoqIFRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZSBjb252ZXJ0ZWQgaW50byBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMuICovCi0JcHJpdmF0ZSBmaW5hbCBjaGFyW10gY2hhcnM7Ci0KLQkvKiogQ2FjaGUgdGhlIHZhbHVlIG9mIHRoZSBoaWdoZXN0IGNoYXJhY3RlciBpbiB0aGUgc2V0IGFib3ZlLiAqLwotCXByaXZhdGUgZmluYWwgY2hhciBtYXhDaGFyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZW5jb2RlciB0aGF0IGNvbnZlcnRzIHRoZSBzcGVjaWZpZWQgc2V0IG9mIGNoYXJhY3RlcnMKLQkgKiBpbnRvIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgWE1MU3RyaW5nRW5jb2RlcihjaGFyW10gY2hhcnMpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNoYXJzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRoZSBhbXBlcnNhbmQgbXVzdCBiZSBpbmNsdWRlZCBzaW5jZSBpdCBpcyB0aGUgZXNjYXBlIGNoYXJhY3RlcgotCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGNoYXJzLCAnJicpKSB7Ci0JCQl0aGlzLmNoYXJzID0gY2hhcnM7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmNoYXJzID0gQ29sbGVjdGlvblRvb2xzLmFkZChjaGFycywgJyYnKTsKLQkJfQotCQl0aGlzLm1heENoYXIgPSB0aGlzLmNhbGN1bGF0ZU1heEludmFsaWRGaWxlTmFtZUNoYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIGNvbnZlcnRlZAotCSAqIGludG8gWE1MIGNoYXJhY3RlciByZWZlcmVuY2VzLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBzaG9ydC1jaXJjdWl0IHRoZQotCSAqIHNlYXJjaCBmb3IgYSBjaGFyYWN0ZXIgaW4gdGhlIHNldC4KLQkgKiBAc2VlICNjaGFySXNUb0JlRW5jb2RlZChjaGFyKQotCSAqLwotCXByaXZhdGUgY2hhciBjYWxjdWxhdGVNYXhJbnZhbGlkRmlsZU5hbWVDaGFyKCkgewotCQljaGFyW10gbG9jYWxDaGFycyA9IHRoaXMuY2hhcnM7Ci0JCWNoYXIgbWF4ID0gMDsKLQkJZm9yIChpbnQgaSA9IGxvY2FsQ2hhcnMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWNoYXIgYyA9IGxvY2FsQ2hhcnNbaV07Ci0JCQlpZiAobWF4IDwgYykgewotCQkJCW1heCA9IGM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGFueSBjaGFyYWN0ZXJzIGluIHRoZSBzZXQKLQkgKiByZXBsYWNlZCB3aXRoIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcykgewotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJLy8gYWxsb3cgZm9yIGEgZmV3IGVuY29kZWQgY2hhcmFjdGVycwotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuICsgMjApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQl0aGlzLmFwcGVuZENoYXJhY3RlclRvKHMuY2hhckF0KGkpLCBzYik7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggYW55IFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcwotCSAqIHJlcGxhY2VkIGJ5IHRoZSBjaGFyYWN0ZXJzIHRoZW1zZWx2ZXMuCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHMubGVuZ3RoKCkpOwotCQlTdHJpbmdCdWlsZGVyIHRlbXAgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwkvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl0aGlzLmRlY29kZVRvKG5ldyBTdHJpbmdSZWFkZXIocyksIHNiLCB0ZW1wKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHRvIHRoZSBzdHJpbmcgYnVmZmVyLAotCSAqIGNvbnZlcnRpbmcgaXQgdG8gYW4gWE1MIGNoYXJhY3RlciByZWZlcmVuY2UgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRDaGFyYWN0ZXJUbyhjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHRoaXMuY2hhcklzVG9CZUVuY29kZWQoYykpIHsKLQkJCXRoaXMuYXBwZW5kQ2hhcmFjdGVyUmVmZXJlbmNlVG8oYywgc2IpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKGMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgb25lIG9mIHRoZSBjaGFyYWN0ZXJzCi0JICogdG8gYmUgY29udmVydGVkIHRvIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hhcklzVG9CZUVuY29kZWQoY2hhciBjKSB7Ci0JCXJldHVybiAoYyA8PSB0aGlzLm1heENoYXIpICYmIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNoYXJzLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIncyBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZSB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlciAoZS5nLiAnLycgPT4gIiYjeDJmOyIpLgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRDaGFyYWN0ZXJSZWZlcmVuY2VUbyhjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKCImI3giKTsKLQkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoYywgMTYpKTsKLQkJc2IuYXBwZW5kKCc7Jyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlY29kZVRvKFJlYWRlciByZWFkZXIsIFN0cmluZ0J1aWxkZXIgc2IsIFN0cmluZ0J1aWxkZXIgdGVtcCkgewotCQl0cnkgewotCQkJdGhpcy5kZWNvZGVUb18ocmVhZGVyLCBzYiwgdGVtcCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVjb2RlVG9fKFJlYWRlciByZWFkZXIsIFN0cmluZ0J1aWxkZXIgc2IsIFN0cmluZ0J1aWxkZXIgdGVtcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGMgPSByZWFkZXIucmVhZCgpOwotCQl3aGlsZSAoYyAhPSAtMSkgewotCQkJaWYgKGMgPT0gJyYnKSB7Ci0JCQkJdGhpcy5kZWNvZGVDaGFyYWN0ZXJSZWZlcmVuY2VUbyhyZWFkZXIsIHNiLCB0ZW1wKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKChjaGFyKSBjKTsKLQkJCX0KLQkJCWMgPSByZWFkZXIucmVhZCgpOwotCQl9Ci0JCXJlYWRlci5jbG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWNvZGVDaGFyYWN0ZXJSZWZlcmVuY2VUbyhSZWFkZXIgcmVhZGVyLCBTdHJpbmdCdWlsZGVyIHNiLCBTdHJpbmdCdWlsZGVyIHRlbXApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjID0gcmVhZGVyLnJlYWQoKTsKLQkJdGhpcy5jaGVja0NoYXIoYywgJyMnKTsKLQkJYyA9IHJlYWRlci5yZWFkKCk7Ci0JCXRoaXMuY2hlY2tDaGFyKGMsICd4Jyk7Ci0KLQkJdGVtcC5zZXRMZW5ndGgoMCk7ICAvLyByZS11c2UgdGVtcAotCQljID0gcmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gJzsnKSB7Ci0JCQl0aGlzLmNoZWNrRW5kT2ZTdHJlYW0oYyk7Ci0JCQl0ZW1wLmFwcGVuZCgoY2hhcikgYyk7Ci0JCQljID0gcmVhZGVyLnJlYWQoKTsKLQkJfQotCQlTdHJpbmcgY2hhclZhbHVlID0gdGVtcC50b1N0cmluZygpOwotCQlpZiAoY2hhclZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1pc3NpbmcgbnVtZXJpYyBzdHJpbmciKTsKLQkJfQotCQlzYi5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQoY2hhclZhbHVlLCAxNikpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0NoYXIoaW50IGMsIGludCBleHBlY3RlZCkgewotCQl0aGlzLmNoZWNrRW5kT2ZTdHJlYW0oYyk7Ci0JCWlmIChjICE9IGV4cGVjdGVkKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJleHBlY3RlZCAnIiArIChjaGFyKSBleHBlY3RlZCArICInLCBidXQgZW5jb3VudGVyZWQgJyIgKyAoY2hhcikgYyArICInIik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tFbmRPZlN0cmVhbShpbnQgYykgewotCQlpZiAoYyA9PSAtMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nIik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NzRhZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQW4gPGNvZGU+QXJyYXlJdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYW4gPGNvZGU+SXRlcmF0b3I8L2NvZGU+Ci0gKiBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyBvZiB0eXBlIEUuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCWZpbmFsIEVbXSBhcnJheTsJLy8gcHJpdmF0ZS1wcm90ZWN0ZWQKLQlpbnQgbmV4dEluZGV4OwkJLy8gcHJpdmF0ZS1wcm90ZWN0ZWQKLQlwcml2YXRlIGZpbmFsIGludCBtYXhJbmRleDsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlJdGVyYXRvcihFLi4uIGFycmF5KSB7Ci0JCXRoaXMoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBBcnJheUl0ZXJhdG9yKEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICgoc3RhcnQgPCAwKSB8fCAoc3RhcnQgPiBhcnJheS5sZW5ndGgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGFydDogIiArIHN0YXJ0KTsKLQkJfQotCQlpZiAoKGxlbmd0aCA8IDApIHx8IChsZW5ndGggPiBhcnJheS5sZW5ndGggLSBzdGFydCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxlbmd0aDogIiArIGxlbmd0aCk7Ci0JCX0KLQkJdGhpcy5hcnJheSA9IGFycmF5OwotCQl0aGlzLm5leHRJbmRleCA9IHN0YXJ0OwotCQl0aGlzLm1heEluZGV4ID0gc3RhcnQgKyBsZW5ndGg7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRJbmRleCA8IHRoaXMubWF4SW5kZXg7Ci0JfQotCQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRoaXMuYXJyYXlbdGhpcy5uZXh0SW5kZXgrK107Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hcnJheSkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3MGVkNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogQW4gPGNvZGU+QXJyYXlMaXN0SXRlcmF0b3I8L2NvZGU+IHByb3ZpZGVzIGEgPGNvZGU+TGlzdEl0ZXJhdG9yPC9jb2RlPgotICogZm9yIGFuIGFycmF5IG9mIG9iamVjdHMuCi0gKiAKLSAqIFRoZSBuYW1lIG1pZ2h0IGJlIGEgYml0IGNvbmZ1c2luZzoKLSAqIFRoaXMgaXMgYSA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+IGZvciBhbiA8Y29kZT5BcnJheTwvY29kZT47Ci0gKiA8ZW0+bm90PC9lbT4gYW4gPGNvZGU+SXRlcmF0b3I8L2NvZGU+IGZvciBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlMaXN0SXRlcmF0b3I8RT4KLQlleHRlbmRzIEFycmF5SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgaW50IG1pbkluZGV4OwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmF0b3IoRS4uLiBhcnJheSkgewotCQl0aGlzKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhdG9yKEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQkJdGhpcy5taW5JbmRleCA9IHN0YXJ0OwotCX0KLQkKLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4OwotCX0KLQkKLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRJbmRleCAtIDE7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXggPiB0aGlzLm1pbkluZGV4OwotCX0KLQkKLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJaWYgKHRoaXMuaGFzUHJldmlvdXMoKSkgewotCQkJcmV0dXJuIHRoaXMuYXJyYXlbLS10aGlzLm5leHRJbmRleF07Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DaGFpbkl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1MDc2ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkNoYWluSXRlcmF0b3I8L2NvZGU+IHByb3ZpZGVzIGEgcGx1Z2dhYmxlIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPgotICogdGhhdCBsb29wcyBvdmVyIGEgY2hhaW4gb2YgYXJiaXRyYXJpbHkgbGlua2VkIG9iamVjdHMuIFRoZSBjaGFpbgotICogc2hvdWxkIGJlIG51bGwtdGVybWluYXRlZCAoaS5lLiBhIGNhbGwgdG8gdGhlIDxjb2RlPm5leHRMaW5rKE9iamVjdCk8L2NvZGU+Ci0gKiBtZXRob2Qgc2hvdWxkIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIGl0IGlzIHBhc3NlZCB0aGUgbGFzdAotICogbGluayBvZiB0aGUgY2hhaW4pLgotICogVG8gdXNlLCBzdXBwbHkgYSBzdGFydGluZyBsaW5rIGFuZCBzdXBwbHkgYSA8Y29kZT5MaW5rZXI8L2NvZGU+IG9yIAotICogc3ViY2xhc3MgPGNvZGU+Q2hhaW5JdGVyYXRvcjwvY29kZT4gYW5kIG92ZXJyaWRlIHRoZQotICogPGNvZGU+bmV4dExpbmsoT2JqZWN0KTwvY29kZT4gbWV0aG9kLgotICogVGhlIHN0YXJ0aW5nIGxpbmsgd2lsbCBiZSB0aGUgZmlyc3Qgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvci4KLSAqIElmIHRoZSBzdGFydGluZyBsaW5rIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgaXRlcmF0b3Igd2lsbCBiZSBlbXB0eS4KLSAqIE5vdGUgdGhhdCB0aGUgaXRlcmF0b3IgZG9lcyBub3Qgc3VwcG9ydCA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50cy4KLSAqLwotcHVibGljIGNsYXNzIENoYWluSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBFIG5leHRMaW5rOwotCXByaXZhdGUgZmluYWwgTGlua2VyPEU+IGxpbmtlcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBzdGFydGluZyBsaW5rCi0JICogYW5kIGEgZGlzYWJsZWQgbGlua2VyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIDxjb2RlPm5leHRMaW5rKE9iamVjdCk8L2NvZGU+IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSA8Y29kZT5MaW5rZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDaGFpbkl0ZXJhdG9yKEUgc3RhcnRMaW5rKSB7Ci0JCXRoaXMoc3RhcnRMaW5rLCBMaW5rZXIuRGlzYWJsZWQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgbGluawotCSAqIGFuZCBsaW5rZXIuCi0JICovCi0JcHVibGljIENoYWluSXRlcmF0b3IoRSBzdGFydExpbmssIExpbmtlcjxFPiBsaW5rZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uZXh0TGluayA9IHN0YXJ0TGluazsKLQkJdGhpcy5saW5rZXIgPSBsaW5rZXI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRMaW5rICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLm5leHRMaW5rID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRSByZXN1bHQgPSB0aGlzLm5leHRMaW5rOwotCQl0aGlzLm5leHRMaW5rID0gdGhpcy5uZXh0TGluayh0aGlzLm5leHRMaW5rKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXh0IGxpbmsgaW4gdGhlIGNoYWluLgotCSAqLwotCXByb3RlY3RlZCBFIG5leHRMaW5rKEUgY3VycmVudExpbmspIHsKLQkJcmV0dXJuIHRoaXMubGlua2VyLm5leHRMaW5rKGN1cnJlbnRMaW5rKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5uZXh0TGluayk7Ci0JfQotCQotCi0JLy8qKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSA8Y29kZT5DaGFpbkl0ZXJhdG9yPC9jb2RlPiB0byBsaW5rCi0JICogdGhlIGVsZW1lbnRzIGluIHRoZSBjaGFpbi4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpbmtlcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmV4dCBsaW5rIGluIHRoZSBjaGFpbi4KLQkJICovCi0JCVQgbmV4dExpbmsoVCBjdXJyZW50TGluayk7Ci0KLQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgTGlua2VyPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBMaW5rZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBMaW5rZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyBzaW1wbHkgcmV0dXJuIG51bGwsIGluZGljYXRpbmcgdGhlIGNoYWluIGlzIGVuZGVkCi0JCQlwdWJsaWMgUyBuZXh0TGluayhTIGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJDaGFpbkl0ZXJhdG9yLkxpbmtlci5OdWxsIjsKLQkJCX0KLQkJfQotCi0JCWZpbmFsIGNsYXNzIERpc2FibGVkPFM+IGltcGxlbWVudHMgTGlua2VyPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBMaW5rZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTGlua2VyPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQkJcHVibGljIFMgbmV4dExpbmsoUyBjdXJyZW50TGluaykgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyAgLy8gQ2hhaW5JdGVyYXRvci5uZXh0TGluayhPYmplY3QpIHdhcyBub3QgaW1wbGVtZW50ZWQKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkNoYWluSXRlcmF0b3IuTGlua2VyLkRpc2FibGVkIjsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjgyM2E1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+Q2xvbmVJdGVyYXRvcjwvY29kZT4gaXRlcmF0ZXMgb3ZlciBhIGNvcHkgb2YgYSBjb2xsZWN0aW9uLAotICogYWxsb3dpbmcgZm9yIGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBUaGUgb3JpZ2luYWwgY29sbGVjdGlvbiBwYXNzZWQgdG8gdGhlIDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQ7IG90aGVyd2lzZSB5b3UgcnVuIHRoZSByaXNrIG9mCi0gKiBhIGNvcnJ1cHRlZCBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCBhIDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+IGRvZXMgbm90IHN1cHBvcnQgdGhlCi0gKiA8Y29kZT4jcmVtb3ZlKCk8L2NvZGU+IG9wZXJhdGlvbjsgdGhpcyBpcyBiZWNhdXNlIGl0IGRvZXMgbm90IGhhdmUKLSAqIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4gQnV0IGlmIHRoZSA8Y29kZT5DbG9uZUl0ZXJhdG9yPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhbiA8Y29kZT5NdXRhdG9yPC9jb2RlPiBpdCB3aWxsIGRlbGVnYXRlIHRoZQotICogPGNvZGU+I3JlbW92ZSgpPC9jb2RlPiBvcGVyYXRpb24gdG8gdGhlIDxjb2RlPk11dGF0b3I8L2NvZGU+LgotICogQWx0ZXJuYXRpdmVseSwgYSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhlIDxjb2RlPiNyZW1vdmUoT2JqZWN0KTwvY29kZT4KLSAqIG1ldGhvZC4KLSAqLwotcHVibGljIGNsYXNzIENsb25lSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxPYmplY3Q+IG5lc3RlZEl0ZXJhdG9yOwotCXByaXZhdGUgRSBjdXJyZW50OwotCXByaXZhdGUgZmluYWwgTXV0YXRvcjxFPiBtdXRhdG9yOwotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVBbGxvd2VkOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUgPGNvZGU+I3JlbW92ZSgpPC9jb2RlPiBtZXRob2Qgd2lsbCBub3QgYmUgc3VwcG9ydGVkLAotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGUgPGNvZGU+I3JlbW92ZShPYmplY3QpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXRoaXMoYywgTXV0YXRvci5SZWFkT25seS48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBtdXRhdG9yIHRvIHJlbW92ZSBvYmplY3RzIGZyb20gdGhlCi0JICogb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjLCBNdXRhdG9yPEU+IG11dGF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uZXN0ZWRJdGVyYXRvciA9IG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oYy50b0FycmF5KCkpOwotCQl0aGlzLmN1cnJlbnQgPSBudWxsOwotCQl0aGlzLm11dGF0b3IgPSBtdXRhdG9yOwotCQl0aGlzLnJlbW92ZUFsbG93ZWQgPSBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkSXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRoaXMuY3VycmVudCA9IHRoaXMubmVzdGVkTmV4dCgpOwotCQl0aGlzLnJlbW92ZUFsbG93ZWQgPSB0cnVlOwotCQlyZXR1cm4gdGhpcy5jdXJyZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJaWYgKCAhIHRoaXMucmVtb3ZlQWxsb3dlZCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucmVtb3ZlKHRoaXMuY3VycmVudCk7Ci0JCXRoaXMucmVtb3ZlQWxsb3dlZCA9IGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIHBhc3NlZCBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGhlbGQgRXMsCi0JICogc28gdGhpcyBjYXN0IGlzIG5vdCBhIHByb2JsZW0uIFdlIG5lZWQgdGhpcyBjYXN0IGJlY2F1c2UKLQkgKiBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIHdlcmUgY29waWVkIGludG8KLQkgKiBhbiBvYmplY3QgYXJyYXkgKE9iamVjdFtdKS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgRSBuZXN0ZWROZXh0KCkgewotCQlyZXR1cm4gKEUpIHRoaXMubmVzdGVkSXRlcmF0b3IubmV4dCgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYW4gPGNvZGU+TXV0YXRvcjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEUgZSkgewotCQl0aGlzLm11dGF0b3IucmVtb3ZlKGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotCi0JLy8qKioqKioqKioqIG1lbWJlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSA8Y29kZT5DbG9uZUl0ZXJhdG9yPC9jb2RlPiB0byByZW1vdmUKLQkgKiBlbGVtZW50cyBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uOyBzaW5jZSB0aGUgaXRlcmF0b3IKLQkgKiBkb2VzIG5vdCBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIGludGVyZmFjZSBNdXRhdG9yPFQ+IHsKLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZyb20gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JCSAqLwotCQl2b2lkIHJlbW92ZShUIGN1cnJlbnQpOwotCi0KLQkJZmluYWwgY2xhc3MgUmVhZE9ubHk8Uz4gaW1wbGVtZW50cyBNdXRhdG9yPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBNdXRhdG9yIElOU1RBTkNFID0gbmV3IFJlYWRPbmx5KCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE11dGF0b3I8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBSZWFkT25seSgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gcmVtb3ZlIGlzIG5vdCBzdXBwb3J0ZWQKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3QgY3VycmVudCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ2xvbmVJdGVyYXRvci5NdXRhdG9yLlJlYWRPbmx5IjsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYWQzNDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkNsb25lTGlzdEl0ZXJhdG9yPC9jb2RlPiBpdGVyYXRlcyBvdmVyIGEgY29weSBvZiBhIGxpc3QsCi0gKiBhbGxvd2luZyBmb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuCi0gKiA8cD4KLSAqIFRoZSBvcmlnaW5hbCBsaXN0IHBhc3NlZCB0byB0aGUgPGNvZGU+Q2xvbmVMaXN0SXRlcmF0b3I8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQ7IG90aGVyd2lzZSB5b3UgcnVuIHRoZSByaXNrIG9mCi0gKiBhIGNvcnJ1cHRlZCBsaXN0LgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCBhIDxjb2RlPkNsb25lTGlzdEl0ZXJhdG9yPC9jb2RlPiBkb2VzIG5vdCBzdXBwb3J0IHRoZQotICogbW9kaWZpY2F0aW9uIG9wZXJhdGlvbnM7IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlCi0gKiBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuIEJ1dCBpZiB0aGUgPGNvZGU+Q2xvbmVMaXN0SXRlcmF0b3I8L2NvZGU+Ci0gKiBpcyBzdXBwbGllZCB3aXRoIGEgPGNvZGU+TXV0YXRvcjwvY29kZT4gaXQgd2lsbCBkZWxlZ2F0ZSB0aGUKLSAqIG1vZGlmaWNhdGlvbiBvcGVyYXRpb25zIHRvIHRoZSA8Y29kZT5NdXRhdG9yPC9jb2RlPi4KLSAqIEFsdGVybmF0aXZlbHksIGEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoZSBtb2RpZmljYXRpb24gbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIENsb25lTGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjxPYmplY3Q+IG5lc3RlZExpc3RJdGVyYXRvcjsKLQlwcml2YXRlIGludCBjdXJzb3I7Ci0JcHJpdmF0ZSBTdHJpbmcgc3RhdGU7Ci0JcHJpdmF0ZSBmaW5hbCBNdXRhdG9yPEU+IG11dGF0b3I7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTiA9ICJ1bmtub3duIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFVklPVVMgPSAicHJldmlvdXMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVhUID0gIm5leHQiOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVGhlIG1vZGlmaWNhdGlvbiBtZXRob2RzIHdpbGwgbm90IGJlIHN1cHBvcnRlZCwKLQkgKiB1bmxlc3MgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlbS4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCkgewotCQl0aGlzKGxpc3QsIE11dGF0b3IuUmVhZE9ubHkuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIGxpc3QgbXV0YXRvciB0byBtb2RpZnkgdGhlIG9yaWdpbmFsIGxpc3QuCi0JICovCi0JcHVibGljIENsb25lTGlzdEl0ZXJhdG9yKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QsIE11dGF0b3I8RT4gbXV0YXRvcikgewotCQlzdXBlcigpOwotCQkvLyBidWlsZCBhIGNvcHkgb2YgdGhlIGxpc3QgYW5kIGtlZXAgaXQgaW4gc3luY2ggd2l0aCBvcmlnaW5hbCAoaWYgdGhlIG11dGF0b3IgYWxsb3dzIGNoYW5nZXMpCi0JCS8vIHRoYXQgd2F5IHRoZSBuZXN0ZWQgbGlzdCBpdGVyYXRvciB3aWxsIG1haW50YWluIHNvbWUgb2Ygb3VyIHN0YXRlCi0JCXRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yID0gQ29sbGVjdGlvblRvb2xzLmxpc3QobGlzdC50b0FycmF5KCkpLmxpc3RJdGVyYXRvcigpOwotCQl0aGlzLm11dGF0b3IgPSBtdXRhdG9yOwotCQl0aGlzLmN1cnNvciA9IDA7Ci0JCXRoaXMuc3RhdGUgPSBVTktOT1dOOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0SXRlcmF0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQkvLyBhbGxvdyB0aGUgbmVzdGVkIGl0ZXJhdG9yIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBiZWZvcmUgd2UgbW9kaWZ5IHRoZSBpbmRleAotCQlFIG5leHQgPSB0aGlzLm5lc3RlZE5leHQoKTsKLQkJdGhpcy5jdXJzb3IrKzsKLQkJdGhpcy5zdGF0ZSA9IE5FWFQ7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJLy8gYWxsb3cgdGhlIG5lc3RlZCBpdGVyYXRvciB0byB0aHJvdyBhbiBleGNlcHRpb24gYmVmb3JlIHdlIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdAotCQl0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5yZW1vdmUoKTsKLQkJaWYgKHRoaXMuc3RhdGUgPT0gUFJFVklPVVMpIHsKLQkJCXRoaXMucmVtb3ZlKHRoaXMuY3Vyc29yKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuY3Vyc29yLS07Ci0JCQl0aGlzLnJlbW92ZSh0aGlzLmN1cnNvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIGluZGV4Ci0JCUUgcHJldmlvdXMgPSB0aGlzLm5lc3RlZFByZXZpb3VzKCk7Ci0JCXRoaXMuY3Vyc29yLS07Ci0JCXRoaXMuc3RhdGUgPSBQUkVWSU9VUzsKLQkJcmV0dXJuIHByZXZpb3VzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChFIG8pIHsKLQkJLy8gYWxsb3cgdGhlIG5lc3RlZCBpdGVyYXRvciB0byB0aHJvdyBhbiBleGNlcHRpb24gYmVmb3JlIHdlIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdAotCQl0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5hZGQobyk7Ci0JCXRoaXMuYWRkKHRoaXMuY3Vyc29yLCBvKTsKLQkJdGhpcy5jdXJzb3IrKzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBvKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIG9yaWdpbmFsIGxpc3QKLQkJdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3Iuc2V0KG8pOwotCQlpZiAodGhpcy5zdGF0ZSA9PSBQUkVWSU9VUykgewotCQkJdGhpcy5zZXQodGhpcy5jdXJzb3IsIG8pOwotCQl9IGVsc2UgewotCQkJdGhpcy5zZXQodGhpcy5jdXJzb3IgLSAxLCBvKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBsaXN0IHBhc3NlZCBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGhlbGQgRXMsCi0JICogc28gdGhpcyBjYXN0IGlzIG5vdCBhIHByb2JsZW0uIFdlIG5lZWQgdGhpcyBjYXN0IGJlY2F1c2UKLQkgKiBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIHdlcmUgY29waWVkIGludG8KLQkgKiBhbiBvYmplY3QgYXJyYXkgKE9iamVjdFtdKS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgRSBuZXN0ZWROZXh0KCkgewotCQlyZXR1cm4gKEUpIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGlzdCBwYXNzZWQgaW4gZHVyaW5nIGNvbnN0cnVjdGlvbiBoZWxkIEVzLAotCSAqIHNvIHRoaXMgY2FzdCBpcyBub3QgYSBwcm9ibGVtLiBXZSBuZWVkIHRoaXMgY2FzdCBiZWNhdXNlCi0JICogYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiB3ZXJlIGNvcGllZCBpbnRvCi0JICogYW4gb2JqZWN0IGFycmF5IChPYmplY3RbXSkuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEUgbmVzdGVkUHJldmlvdXMoKSB7Ci0JCXJldHVybiAoRSkgdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIDxjb2RlPk11dGF0b3I8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZChpbnQgaW5kZXgsIEUgbykgewotCQl0aGlzLm11dGF0b3IuYWRkKGluZGV4LCBvKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+TXV0YXRvcjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQl0aGlzLm11dGF0b3IucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIDxjb2RlPk11dGF0b3I8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldChpbnQgaW5kZXgsIEUgbykgewotCQl0aGlzLm11dGF0b3Iuc2V0KGluZGV4LCBvKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotCi0JLy8qKioqKioqKioqIG1lbWJlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSA8Y29kZT5DbG9uZUxpc3RJdGVyYXRvcjwvY29kZT4gdG8gcmVtb3ZlCi0JICogZWxlbWVudHMgZnJvbSB0aGUgb3JpZ2luYWwgbGlzdDsgc2luY2UgdGhlIGxpc3QgaXRlcmF0b3IKLQkgKiBkb2VzIG5vdCBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBNdXRhdG9yPFQ+IHsKLQotCQkvKioKLQkJICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotCQkgKi8KLQkJdm9pZCBhZGQoaW50IGluZGV4LCBUIG8pOwotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkJICovCi0JCXZvaWQgcmVtb3ZlKGludCBpbmRleCk7Ci0KLQkJLyoqCi0JCSAqIFNldCB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbiB0aGUgb3JpZ2luYWwgbGlzdC4KLQkJICovCi0JCXZvaWQgc2V0KGludCBpbmRleCwgVCBvKTsKLQotCi0JCWZpbmFsIGNsYXNzIFJlYWRPbmx5PFM+IGltcGxlbWVudHMgTXV0YXRvcjxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTXV0YXRvciBJTlNUQU5DRSA9IG5ldyBSZWFkT25seSgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBNdXRhdG9yPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgUmVhZE9ubHkoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIGFkZCBpcyBub3Qgc3VwcG9ydGVkCi0JCQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgbykgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJLy8gcmVtb3ZlIGlzIG5vdCBzdXBwb3J0ZWQKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCS8vIHNldCBpcyBub3Qgc3VwcG9ydGVkCi0JCQlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBPYmplY3QgbykgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvci5SZWFkT25seSI7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODNmNTM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhIGNvbGxlY3Rpb24KLSAqIG9mIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPnMgYW5kIG1ha2VzIHRoZW0gYXBwZWFyIHRvIGJlIGEgc2luZ2xlCi0gKiA8Y29kZT5JdGVyYXRvcjwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IGl0ZXJhdG9yczsKLQlwcml2YXRlIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBjdXJyZW50SXRlcmF0b3I7Ci0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbGFzdEl0ZXJhdG9yVG9SZXR1cm5OZXh0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IGl0ZXJhdG9ycykgewotCQl0aGlzKGl0ZXJhdG9ycy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgSXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvcnMgPSBpdGVyYXRvcnM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoRSBvYmplY3QsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4ob2JqZWN0KSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhdG9yLCBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4uLi4gaXRlcmF0b3JzKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmF0b3I8SXRlcmF0b3I8PyBleHRlbmRzIEU+PihpdGVyYXRvcnMpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZEN1cnJlbnRJdGVyYXRvcigpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGlzIG9jY3VycyBpZiB0aGVyZSBhcmUgbm8gaXRlcmF0b3JzIGF0IGFsbAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhpcy5sb2FkQ3VycmVudEl0ZXJhdG9yKCk7Ci0JCUUgcmVzdWx0ID0gdGhpcy5jdXJyZW50SXRlcmF0b3IubmV4dCgpOwotCi0JCS8vIHRoZSBzdGF0ZW1lbnQgYWJvdmUgd2lsbCB0aHJvdyBhIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkJLy8gaWYgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZTsKLQkJLy8gc28gaWYgd2UgZ2V0IGhlcmUsIHdlIGNhbiBzZXQgJ2xhc3RJdGVyYXRvclRvUmV0dXJuTmV4dCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybk5leHQgPSB0aGlzLmN1cnJlbnRJdGVyYXRvcjsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJaWYgKHRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5OZXh0ID09IG51bGwpIHsKLQkJCS8vIENvbXBvc2l0ZUl0ZXJhdG9yI25leHQoKSBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuTmV4dC5yZW1vdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGN1cnJlbnRJdGVyYXRvciB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IDxjb2RlPmhhc05leHQoKTwvY29kZT4KLQkgKiBvciB0aGUgZmluYWwgaXRlcmF0b3IgaWYgYWxsIHRoZSBlbGVtZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRDdXJyZW50SXRlcmF0b3IoKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvciA9PSBudWxsKSB7Ci0JCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoKCAhIHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgJiYgdGhpcy5pdGVyYXRvcnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLm5leHQoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMDM3ZjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVMaXN0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGEgbGlzdAotICogb2YgPGNvZGU+TGlzdEl0ZXJhdG9yPC9jb2RlPnMgYW5kIG1ha2VzIHRoZW0gYXBwZWFyIHRvIGJlIGEgc2luZ2xlCi0gKiA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPEU+PiBpdGVyYXRvcnM7Ci0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8RT4gbmV4dEl0ZXJhdG9yOwotCXByaXZhdGUgaW50IG5leHRJbmRleDsKLSAJLyoqCi0gCSAqIHRydWUgaWYgIm5leHQiIHdhcyBsYXN0IHJldHVybmVkOyBmYWxzZSBpZiAicHJldmlvdXMiIHdhcyBsYXN0IHJldHVybmVkOwotIAkgKiB0aGlzIGRldGVybWluZXMgdGhlIGVmZmVjdCBvZiByZW1vdmUoT2JqZWN0KSBvbiBuZXh0SW5kZXgKLSAJICovCi0JcHJpdmF0ZSBib29sZWFuIG5leHRSZXR1cm5lZDsKLQlwcml2YXRlIExpc3RJdGVyYXRvcjxFPiBsYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQ7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgbGlzdCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8RT4+IGl0ZXJhdG9ycykgewotCQl0aGlzKGl0ZXJhdG9ycy5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0IGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPEU+PiBpdGVyYXRvcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvcnMgPSBpdGVyYXRvcnM7Ci0JCXRoaXMubmV4dEluZGV4ID0gMDsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKEUgb2JqZWN0LCBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxFPihvYmplY3QpLCBpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvciwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYXRvciwgbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8RT4uLi4gaXRlcmF0b3JzKSB7Ci0JCXRoaXMobmV3IEFycmF5TGlzdEl0ZXJhdG9yPExpc3RJdGVyYXRvcjxFPj4oaXRlcmF0b3JzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXRoaXMubmV4dEl0ZXJhdG9yLmFkZChvKTsKLQkJdGhpcy5uZXh0SW5kZXgrKzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkTmV4dEl0ZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoaXMgb2NjdXJzIGlmIHRoZXJlIGFyZSBubyBpdGVyYXRvcnMgYXQgYWxsCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZFByZXZpb3VzSXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQl0aGlzLmxvYWROZXh0SXRlcmF0b3IoKTsKLQkJRSByZXN1bHQgPSB0aGlzLm5leHRJdGVyYXRvci5uZXh0KCk7Ci0KLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIHNldCB0aGUgJ2xhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPSB0aGlzLm5leHRJdGVyYXRvcjsKLQkJdGhpcy5uZXh0SW5kZXgrKzsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSB0cnVlOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRJbmRleDsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJdGhpcy5sb2FkUHJldmlvdXNJdGVyYXRvcigpOwotCQlFIHJlc3VsdCA9IHRoaXMubmV4dEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0KLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIHNldCB0aGUgJ2xhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPSB0aGlzLm5leHRJdGVyYXRvcjsKLQkJdGhpcy5uZXh0SW5kZXgtLTsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSBmYWxzZTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4ICAtIDE7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQlpZiAodGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50LnJlbW92ZSgpOwotCQlpZiAodGhpcy5uZXh0UmV0dXJuZWQpIHsKLQkJCS8vIGRlY3JlbWVudCB0aGUgaW5kZXggYmVjYXVzZSB0aGUgIm5leHQiIGVsZW1lbnQgaGFzIG1vdmVkIGZvcndhcmQgaW4gdGhlIGxpc3QKLQkJCXRoaXMubmV4dEluZGV4LS07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCWlmICh0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQuc2V0KGUpOwotCX0KLQotCS8qKgotCSAqIExvYWQgJ25leHRJdGVyYXRvcicgd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IgdGhhdCA8Y29kZT5oYXNOZXh0KCk8L2NvZGU+Ci0JICogb3IgdGhlIGZpbmFsIGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dEl0ZXJhdG9yKCkgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXdoaWxlICgoICEgdGhpcy5uZXh0SXRlcmF0b3IuaGFzTmV4dCgpKSAmJiB0aGlzLml0ZXJhdG9ycy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMubmV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCAnbmV4dEl0ZXJhdG9yJyB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IDxjb2RlPmhhc1ByZXZpb3VzKCk8L2NvZGU+Ci0JICogb3IgdGhlIGZpcnN0IGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkUHJldmlvdXNJdGVyYXRvcigpIHsKLQkJdGhpcy5jaGVja05leHRJdGVyYXRvcigpOwotCQl3aGlsZSAoKCAhIHRoaXMubmV4dEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCkpICYmIHRoaXMuaXRlcmF0b3JzLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElmICduZXh0SXRlcmF0b3InIGlzIG51bGwsIGxvYWQgaXQgd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTmV4dEl0ZXJhdG9yKCkgewotCQlpZiAodGhpcy5uZXh0SXRlcmF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9ycyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5RW51bWVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlFbnVtZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTc3MjFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlFbnVtZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5OdWxsRW51bWVyYXRpb248L2NvZGU+IGlzIGp1c3QgdGhhdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVtcHR5RW51bWVyYXRpb248RT4KLQlpbXBsZW1lbnRzIEVudW1lcmF0aW9uPEU+Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbXB0eUVudW1lcmF0aW9uIElOU1RBTkNFID0gbmV3IEVtcHR5RW51bWVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFQ+IEVudW1lcmF0aW9uPFQ+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5RW51bWVyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEUgbmV4dEVsZW1lbnQoKSB7Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNhYzMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQW4gPGNvZGU+RW1wdHlJdGVyYXRvcjwvY29kZT4gaXMganVzdCB0aGF0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVtcHR5SXRlcmF0b3IgSU5TVEFOQ0UgPSBuZXcgRW1wdHlJdGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8VD4gSXRlcmF0b3I8VD4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRW1wdHlJdGVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2FiNGE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbXB0eUxpc3RJdGVyYXRvcjwvY29kZT4gaXMganVzdCB0aGF0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCi0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1wdHlMaXN0SXRlcmF0b3IgSU5TVEFOQ0UgPSBuZXcgRW1wdHlMaXN0SXRlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFQ+IExpc3RJdGVyYXRvcjxUPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFbXB0eUxpc3RJdGVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1NzEwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbnVtZXJhdGlvbkl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbgotICogPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IHNvIHRoYXQgaXQgY2FuIGJlIHRyZWF0ZWQgbGlrZSBhbgotICogPGNvZGU+SXRlcmF0b3I8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRpb25JdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFPiBlbnVtZXJhdGlvbjsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHdyYXBzIHRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24uCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uSXRlcmF0b3IoRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uKSB7Ci0JCXRoaXMuZW51bWVyYXRpb24gPSBlbnVtZXJhdGlvbjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7Ci0JfQotCQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXJldHVybiB0aGlzLmVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZW51bWVyYXRpb24pOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4MjMwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0ZpbHRlcmluZ0l0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciA8Y29kZT5JdGVyYXRvcjwvY29kZT4KLSAqIGFuZCB1c2VzIGEgPGNvZGU+RmlsdGVyPC9jb2RlPiB0byBkZXRlcm1pbmUgd2hpY2ggZWxlbWVudHMgaW4gdGhlCi0gKiBuZXN0ZWQgaXRlcmF0b3IgYXJlIHRvIGJlIHJldHVybmVkIGJ5IGNhbGxzIHRvIDxjb2RlPm5leHQoKTwvY29kZT4uCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+RmlsdGVyPC9jb2RlPiwgYSBzdWJjbGFzcwotICogb2YgPGNvZGU+RmlsdGVyaW5nSXRlcmF0b3I8L2NvZGU+IGNhbiBvdmVycmlkZSB0aGUKLSAqIDxjb2RlPmFjY2VwdChPYmplY3QpPC9jb2RlPiBtZXRob2QuCi0gKiA8cD4KLSAqIE9uZSwgcG9zc2libHkgdW5kZXNpcmFibGUsIHNpZGUtZWZmZWN0IG9mIHVzaW5nIHRoaXMgaXRlcmF0b3IgaXMgdGhhdAotICogdGhlIG5lc3RlZCBpdGVyYXRvcidzIDxjb2RlPm5leHQoKTwvY29kZT4gbWV0aG9kIHdpbGwgYmUgaW52b2tlZAotICogPGVtPmJlZm9yZTwvZW0+IHRoZSBmaWx0ZXJlZCBpdGVyYXRvcidzIDxjb2RlPm5leHQoKTwvY29kZT4KLSAqIG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzIGlzIGJlY2F1c2UgdGhlICJuZXh0IiBlbGVtZW50IG11c3QgYmUKLSAqIGNoZWNrZWQgZm9yIHdoZXRoZXIgaXQgaXMgdG8gYmUgYWNjZXB0ZWQgYmVmb3JlIHRoZSBmaWx0ZXJlZCBpdGVyYXRvcgotICogY2FuIGRldGVybWluZSB3aGV0aGVyIGl0IGhhcyBhICJuZXh0IiBlbGVtZW50IChpLmUuIHRoYXQgdGhlCi0gKiA8Y29kZT5oYXNOZXh0KCk8L2NvZGU+IG1ldGhvZCBzaG91bGQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+KS4KLSAqIFRoaXMgYWxzbyBwcmV2ZW50cyBhIGZpbHRlcmVkIGl0ZXJhdG9yIGZyb20gc3VwcG9ydGluZyB0aGUgb3B0aW9uYWwKLSAqIDxjb2RlPnJlbW92ZSgpPC9jb2RlPiBtZXRob2QuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdJdGVyYXRvcjxFMSwgRTI+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbmVzdGVkSXRlcmF0b3I7Ci0JcHJpdmF0ZSBmaW5hbCBGaWx0ZXI8RTE+IGZpbHRlcjsKLQlwcml2YXRlIEUyIG5leHQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogaXRlcmF0b3IgYW5kIGEgZGlzYWJsZWQgZmlsdGVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIDxjb2RlPmFjY2VwdChPYmplY3QpPC9jb2RlPiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEgPGNvZGU+RmlsdGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEUxPiBuZXN0ZWRJdGVyYXRvcikgewotCQl0aGlzKG5lc3RlZEl0ZXJhdG9yLCBGaWx0ZXIuRGlzYWJsZWQuPEUxPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogaXRlcmF0b3IgYW5kIGZpbHRlci4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEUxPiBuZXN0ZWRJdGVyYXRvciwgRmlsdGVyPEUxPiBmaWx0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uZXN0ZWRJdGVyYXRvciA9IG5lc3RlZEl0ZXJhdG9yOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy5sb2FkTmV4dCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRTIgbmV4dCgpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlFMiByZXN1bHQgPSB0aGlzLm5leHQ7Ci0JCXRoaXMubG9hZE5leHQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCZWNhdXNlIHdlIG5lZWQgdG8gcHJlLWxvYWQgdGhlIG5leHQgZWxlbWVudAotCSAqIHRvIGJlIHJldHVybmVkLCB3ZSBjYW5ub3Qgc3VwcG9ydCB0aGUgPGNvZGU+cmVtb3ZlKCk8L2NvZGU+Ci0JICogbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBuZXh0IHdpdGggdGhlIG5leHQgdmFsaWQgZW50cnkgZnJvbSB0aGUgbmVzdGVkCi0JICogaXRlcmF0b3IuIElmIHRoZXJlIGFyZSBub25lLCBuZXh0IGlzIHNldCB0byA8Y29kZT5FTkQ8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dCgpIHsKLQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJd2hpbGUgKHRoaXMubmVzdGVkSXRlcmF0b3IuaGFzTmV4dCgpICYmICh0aGlzLmRvbmUpKSB7Ci0JCQlFMSB0ZW1wID0gdGhpcy5uZXN0ZWRJdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodGhpcy5hY2NlcHQodGVtcCkpIHsKLQkJCQkvLyBhc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0IHdhcyBhY2NlcHRlZCBpdCBpcyBvZiB0eXBlIEUKLQkJCQl0aGlzLm5leHQgPSB0aGlzLmNhc3QodGVtcCk7Ci0JCQkJdGhpcy5kb25lID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMubmV4dCA9IG51bGw7Ci0JCQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFdlIGhhdmUgdG8gYXNzdW1lIHRoZSBmaWx0ZXIgd2lsbCBvbmx5ICJhY2NlcHQiIG9iamVjdHMgdGhhdCBjYW4KLQkgKiBiZSBjYXN0IHRvIEUyLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRTIgY2FzdChFMSBvKSB7Ci0JCXJldHVybiAoRTIpIG87Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIDxjb2RlPkZpbHRlcmluZ0l0ZXJhdG9yPC9jb2RlPgotCSAqIHNob3VsZCByZXR1cm4gdGhlIHNwZWNpZmllZCBuZXh0IGVsZW1lbnQgZnJvbSBhIGNhbGwgdG8gdGhlCi0JICogPGNvZGU+bmV4dCgpPC9jb2RlPiBtZXRob2QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+RmlsdGVyPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoRTEgbykgewotCQlyZXR1cm4gdGhpcy5maWx0ZXIuYWNjZXB0KG8pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubmVzdGVkSXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HZW5lcmljSXRlcmF0b3JXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0dlbmVyaWNJdGVyYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ2ZWFkOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0dlbmVyaWNJdGVyYXRvcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogV3JhcCBhbiBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiBhbnkgc3ViLXR5cGUgb2YgRSwgY29udmVydGluZyBpdCBpbnRvIGFuCi0gKiBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlIEUuIFRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSBzaW5jZSB0aGVyZQotICogaXMgbm8gd2F5IHRvIGFkZCBlbGVtZW50cyB0byB0aGUgaXRlcmF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSXRlcmF0b3JXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCi0JcHVibGljIEdlbmVyaWNJdGVyYXRvcldyYXBwZXIoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvR3JhcGhJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOTllNmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkdyYXBoSXRlcmF0b3I8L2NvZGU+IGlzIHNpbWlsYXIgdG8gYSA8Y29kZT5UcmVlSXRlcmF0b3I8L2NvZGU+Ci0gKiBleGNlcHQgdGhhdCBpdCBjYW5ub3QgYmUgYXNzdW1lZCB0aGF0IGFsbCBub2RlcyBhc3N1bWUgYSBzdHJpY3QgdHJlZQotICogc3RydWN0dXJlLiAgRm9yIGluc3RhbmNlLCBpbiBhIHRyZWUsIGEgbm9kZSBjYW5ub3QgYmUgYSBkZXNjZW5kZW50IG9mCi0gKiBpdHNlbGYsIGJ1dCBhIGdyYXBoIG1heSBoYXZlIGEgY3ljbGljYWwgc3RydWN0dXJlLgotICogCi0gKiBBIDxjb2RlPkdyYXBoSXRlcmF0b3I8L2NvZGU+IHNpbXBsaWZpZXMgdGhlIHRyYXZlcnNhbCBvZiBhCi0gKiBncmFwaCBvZiBvYmplY3RzLCB3aGVyZSB0aGUgb2JqZWN0cycgcHJvdG9jb2wocykgcHJvdmlkZXMKLSAqIGEgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBuZXh0IGNvbGxlY3Rpb24gb2Ygbm9kZXMgaW4gdGhlIGdyYXBoLAotICogKG9yICpuZWlnaGJvcnMqKSwgYnV0IGRvZXMgbm90IHByb3ZpZGUgYSBtZXRob2QgZm9yIGdldHRpbmcgKmFsbCogCi0gKiBvZiB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoLgotICogKGUuZy4gYSBuZWlnaGJvciBjYW4gcmV0dXJuIGhpcyBuZWlnaGJvcnMsIGFuZCB0aG9zZSBuZWlnaGJvcnMKLSAqIGNhbiByZXR1cm4gdGhlaXIgbmVpZ2hib3JzLCB3aGljaCBtaWdodCBhbHNvIGluY2x1ZGUgdGhlIG9yaWdpbmFsCi0gKiBuZWlnaGJvciwgYnV0IHlvdSBvbmx5IHdhbnQgdG8gdmlzaXQgdGhlIG9yaWdpbmFsIG5laWdoYm9yIG9uY2UuKQotICogPHA+Ci0gKiBJZiBhIG5laWdoYm9yIGhhcyBhbHJlYWR5IGJlZW4gdmlzaXRlZCAoZGV0ZXJtaW5lZCBieSB1c2luZyAKLSAqIDxjb2RlPmVxdWFscyhPYmplY3QpPC9jb2RlPiksIHRoYXQgbmVpZ2hib3IgaXMgbm90IHZpc2l0ZWQgYWdhaW4sCi0gKiBub3IgYXJlIHRoZSBuZWlnaGJvcnMgb2YgdGhhdCBvYmplY3QuCi0gKiA8cD4KLSAqIEl0IGlzIHVwIHRvIHRoZSB1c2VyIG9mIHRoaXMgY2xhc3MgdG8gZW5zdXJlIGEgKmNvbXBsZXRlKiBncmFwaC4KLSAqIDxwPgotICogVG8gdXNlLCBzdXBwbHk6PHVsPgotICogPGxpPiBlaXRoZXIgdGhlIGluaXRpYWwgbm9kZSBvZiB0aGUgZ3JhcGggb3IgYW4gSXRlcmF0b3Igb3ZlciBhbgotICogaW5pdGlhbCBjb2xsZWN0aW9uIG9mIGdyYXBoIG5vZGVzCi0gKiA8bGk+IGEgPGNvZGU+TWlzdGVyUm9nZXJzPC9jb2RlPiB0aGF0IHRlbGxzIHdobyB0aGUgbmVpZ2hib3JzIGFyZQotICogb2YgZWFjaCBub2RlCi0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+R3JhcGhJdGVyYXRvcjwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUgPGNvZGU+bmVpZ2hib3JzKE9iamVjdCk8L2NvZGU+IG1ldGhvZCkKLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIDxjb2RlPnJlbW92ZSgpPC9jb2RlPiBpcyBub3Qgc3VwcG9ydGVkLiAgVGhpcyBtZXRob2QsIGlmIAotICogZGVzaXJlZCwgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgdXNlciBvZiB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnM7Ci0JcHJpdmF0ZSBmaW5hbCBTZXQ8RT4gdmlzaXRlZE5laWdoYm9yczsKLQlwcml2YXRlIGZpbmFsIE1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnM7Ci0JCi0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY3VycmVudEl0ZXJhdG9yOwotCQotCXByaXZhdGUgRSBuZXh0TmVpZ2hib3I7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRpc2FibGVkIG1pc3RlciByb2dlcnMuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+Y2hpbGRyZW4oT2JqZWN0KTwvY29kZT4gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIDxjb2RlPk1pc3RlclJvZ2VyczwvY29kZT4uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoRS4uLiByb290cykgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhdG9yPEU+KHJvb3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGlzYWJsZWQgbWlzdGVyIHJvZ2Vycy4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiA8Y29kZT5jaGlsZHJlbihPYmplY3QpPC9jb2RlPiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEgPGNvZGU+TWlzdGVyUm9nZXJzPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gcm9vdHMpIHsKLQkJdGhpcyhyb290cywgTWlzdGVyUm9nZXJzLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdAotCSAqIGFuZCBhIGRpc2FibGVkIG1pc3RlciByb2dlcnMuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+Y2hpbGRyZW4oT2JqZWN0KTwvY29kZT4gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIDxjb2RlPk1pc3RlclJvZ2VyczwvY29kZT4uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoRSByb290KSB7Ci0JCXRoaXMocm9vdCwgTWlzdGVyUm9nZXJzLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdAotCSAqIGFuZCBtaXN0ZXIgcm9nZXJzLgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEUgcm9vdCwgTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4ocm9vdCksIG1pc3RlclJvZ2Vycyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCByb290cwotCSAqIGFuZCBtaXN0ZXIgcm9nZXJzLgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiByb290cywgTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQlzdXBlcigpOwotCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHJvb3RzOwotCQkvLyB1c2UgYSBMaW5rZWRMaXN0IHNpbmNlIHdlIHdpbGwgYmUgcHVsbGluZyBvZmYgdGhlIGZyb250IGFuZCBhZGRpbmcgdG8gdGhlIGVuZAotCQl0aGlzLml0ZXJhdG9ycyA9IG5ldyBMaW5rZWRMaXN0PEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4oKTsKLQkJdGhpcy5taXN0ZXJSb2dlcnMgPSBtaXN0ZXJSb2dlcnM7Ci0JCXRoaXMudmlzaXRlZE5laWdoYm9ycyA9IG5ldyBIYXNoU2V0PEU+KCk7Ci0JCXRoaXMubG9hZE5leHROZWlnaGJvcigpOwotCX0KLQotCS8qKgotCSAqIExvYWQgbmV4dCBuZWlnaGJvciB3aXRoIHRoZSBuZXh0IGVudHJ5IGZyb20gdGhlIGN1cnJlbnQgaXRlcmF0b3IuCi0JICogSWYgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaGFzIG5vbmUsIGxvYWQgdGhlIG5leHQgaXRlcmF0b3IuCi0JICogSWYgdGhlcmUgYXJlIG5vIG1vcmUsIHRoZSAnZG9uZScgZmxhZyBpcyBzZXQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0TmVpZ2hib3IoKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvciA9PSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpIHsKLQkJCXRoaXMuZG9uZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFIG5leHRQb3NzaWJsZU5laWdoYm9yID0gdGhpcy5jdXJyZW50SXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHRoaXMudmlzaXRlZE5laWdoYm9ycy5jb250YWlucyhuZXh0UG9zc2libGVOZWlnaGJvcikpIHsKLQkJCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsgIC8vIHJlY3Vyc2UKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5uZXh0TmVpZ2hib3IgPSBuZXh0UG9zc2libGVOZWlnaGJvcjsKLQkJCQl0aGlzLnZpc2l0ZWROZWlnaGJvcnMuYWRkKG5leHRQb3NzaWJsZU5laWdoYm9yKTsKLQkJCQl0aGlzLml0ZXJhdG9ycy5hZGQodGhpcy5uZWlnaGJvcnMobmV4dFBvc3NpYmxlTmVpZ2hib3IpKTsKLQkJCX0KLQkJfSAKLQkJZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IHN0cmVhbSA9IHRoaXMuaXRlcmF0b3JzLml0ZXJhdG9yKCk7ICEgdGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpICYmIHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gc3RyZWFtLm5leHQoKTsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlpZiAoICEgdGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsgIC8vIHJlY3Vyc2UKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgbmV4dCA9IHRoaXMubmV4dE5laWdoYm9yOwotCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsKLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBuZWlnaGJvcnMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZWlnaGJvcnMoRSBuZXh0KSB7Ci0JCXJldHVybiB0aGlzLm1pc3RlclJvZ2Vycy5uZWlnaGJvcnMobmV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jdXJyZW50SXRlcmF0b3IpOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogVXNlZCBieSA8Y29kZT5HcmFwaEl0ZXJhdG9yPC9jb2RlPiB0byByZXRyaWV2ZQotCSAqIHRoZSBpbW1lZGlhdGUgbmVpZ2hib3JzIG9mIGEgbm9kZSBpbiB0aGUgZ3JhcGguCi0JICogIlRoZXNlIGFyZSB0aGUgcGVvcGxlIGluIHlvdXIgbmVpZ2hib3Job29kLi4uIgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTWlzdGVyUm9nZXJzPFQ+IHsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgbmVpZ2hib3JzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCQkgKi8KLQkJSXRlcmF0b3I8PyBleHRlbmRzIFQ+IG5laWdoYm9ycyhUIG5leHQpOwotCQkKLQkJCi0JCWZpbmFsIGNsYXNzIE51bGw8Uz4gaW1wbGVtZW50cyBNaXN0ZXJSb2dlcnM8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1pc3RlclJvZ2VycyBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE1pc3RlclJvZ2VyczxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIE51bGwoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHJldHVybiBubyBuZWlnaGJvcnMKLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBuZWlnaGJvcnMoUyBuZXh0KSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzLk51bGwiOwotCQkJfQotCQl9Ci0KLQkJLyoqIFRoZSBtaXN0ZXIgcm9nZXJzIHVzZWQgd2hlbiB0aGUgI25laWdoYm9ycyhPYmplY3QpIG1ldGhvZCBpcyBvdmVycmlkZGVuLiAqLwotCQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIE1pc3RlclJvZ2VyczxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTWlzdGVyUm9nZXJzIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE1pc3RlclJvZ2VyczxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBuZWlnaGJvcnMoUyBuZXh0KSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7ICAvLyBHcmFwaEl0ZXJhdG9yLm5laWdoYm9ycyhPYmplY3QpIHdhcyBub3QgaW1wbGVtZW50ZWQKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzLkRpc2FibGVkIjsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0l0ZXJhdG9yRW51bWVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvSXRlcmF0b3JFbnVtZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWE0ZjA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvSXRlcmF0b3JFbnVtZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFuIDxjb2RlPkl0ZXJhdG9yRW51bWVyYXRpb248L2NvZGU+IHdyYXBzIGFuCi0gKiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gc28gdGhhdCBpdCBjYW4gYmUgdHJlYXRlZCBsaWtlIGFuCi0gKiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRvckVudW1lcmF0aW9uPEU+Ci0JaW1wbGVtZW50cyBFbnVtZXJhdGlvbjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVudW1lcmF0aW9uIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3JFbnVtZXJhdGlvbihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHRFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2YWVkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlBlZWthYmxlSXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIgPGNvZGU+SXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgYWxsb3dzIGEgPGNvZGU+cGVlaygpPC9jb2RlPiBhdCB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIAotICogcmV0dXJuZWQgYnkgPGNvZGU+bmV4dCgpPC9jb2RlPi4KLSAqIDxwPgotICogT25lLCBwb3NzaWJseSB1bmRlc2lyYWJsZSwgc2lkZS1lZmZlY3Qgb2YgdXNpbmcgdGhpcyBpdGVyYXRvciBpcyB0aGF0Ci0gKiB0aGUgbmVzdGVkIGl0ZXJhdG9yJ3MgPGNvZGU+bmV4dCgpPC9jb2RlPiBtZXRob2Qgd2lsbCBiZSBpbnZva2VkCi0gKiA8ZW0+YmVmb3JlPC9lbT4gdGhlIHBlZWthYmxlIGl0ZXJhdG9yJ3MgPGNvZGU+bmV4dCgpPC9jb2RlPgotICogbWV0aG9kIGlzIGludm9rZWQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgIm5leHQiIGVsZW1lbnQgbXVzdCBiZQotICogcHJlLWxvYWRlZCBmb3IgdGhlIDxjb2RlPnBlZWsoKTwvY29kZT4gbWV0aG9kLgotICogVGhpcyBhbHNvIHByZXZlbnRzIGEgcGVla2FibGUgaXRlcmF0b3IgZnJvbSBzdXBwb3J0aW5nIHRoZSBvcHRpb25hbAotICogPGNvZGU+cmVtb3ZlKCk8L2NvZGU+IG1ldGhvZC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUGVla2FibGVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXN0ZWRJdGVyYXRvcjsKLQlwcml2YXRlIEUgbmV4dDsKLQlwcml2YXRlIGJvb2xlYW4gZG9uZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcGVla2FibGUgaXRlcmF0b3IgdGhhdCB3cmFwcyB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBQZWVrYWJsZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXN0ZWRJdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLm5lc3RlZEl0ZXJhdG9yID0gbmVzdGVkSXRlcmF0b3I7Ci0JCXRoaXMuZG9uZSA9IGZhbHNlOwotCQl0aGlzLmxvYWROZXh0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5kb25lOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmRvbmUpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRSByZXN1bHQgPSB0aGlzLm5leHQ7Ci0JCXRoaXMubG9hZE5leHQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSBuZXh0IGNhbGwgdG8gdGhlCi0JICogPGNvZGU+bmV4dCgpPC9jb2RlPiBtZXRob2QsIHdpdGhvdXQgYWR2YW5jaW5nIHBhc3QgaXQuCi0JICovCi0JcHVibGljIEUgcGVlaygpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0OwotCX0KLQotCS8qKgotCSAqIEJlY2F1c2Ugd2UgbmVlZCB0byBwcmUtbG9hZCB0aGUgbmV4dCBlbGVtZW50Ci0JICogdG8gYmUgcmV0dXJuZWQsIHdlIGNhbm5vdCBzdXBwb3J0IHRoZSA8Y29kZT5yZW1vdmUoKTwvY29kZT4KLQkgKiBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIG5leHQgd2l0aCB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSBuZXN0ZWQKLQkgKiBpdGVyYXRvci4gSWYgdGhlcmUgYXJlIG5vbmUsIG5leHQgaXMgc2V0IHRvIDxjb2RlPkVORDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0KCkgewotCQlpZiAodGhpcy5uZXN0ZWRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmV4dCA9IHRoaXMubmVzdGVkSXRlcmF0b3IubmV4dCgpOwotCQl9IGVsc2UgewotCQkJdGhpcy5uZXh0ID0gbnVsbDsKLQkJCXRoaXMuZG9uZSA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzZDM2ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjwvY29kZT4gd3JhcHMgYSBsaXN0Ci0gKiBvZiA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+cyBhbmQgbWFrZXMgdGhlbSBhcHBlYXIgdG8gYmUgYSBzaW5nbGUKLSAqIHJlYWQtb25seSA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+LiBBIHJlYWQtb25seSBjb21wb3NpdGUgbGlzdAotICogaXRlcmF0b3IgaXMgbW9yZSBmbGV4aWJsZSB0aGFuIGEgbm9ybWFsIGNvbXBvc2l0ZSB3aGVuIGl0IGNvbWVzIHRvIHRoZSBlbGVtZW50IHR5cGVzIG9mCi0gKiB0aGUgbmVzdGVkIGl0ZXJhdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzOwotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXh0SXRlcmF0b3I7Ci0JcHJpdmF0ZSBpbnQgbmV4dEluZGV4OwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZgotCSAqIGxpc3QgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMpIHsKLQkJdGhpcyhpdGVyYXRvcnMubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mCi0JICogbGlzdCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3JzID0gaXRlcmF0b3JzOwotCQl0aGlzLm5leHRJbmRleCA9IDA7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihFIG9iamVjdCwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEU+KG9iamVjdCksIGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYXRvciwgbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3QgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+Li4uIGl0ZXJhdG9ycykgewotCQl0aGlzKG5ldyBBcnJheUxpc3RJdGVyYXRvcjxMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PihpdGVyYXRvcnMpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkTmV4dEl0ZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoaXMgb2NjdXJzIGlmIHRoZXJlIGFyZSBubyBpdGVyYXRvcnMgYXQgYWxsCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZFByZXZpb3VzSXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQl0aGlzLmxvYWROZXh0SXRlcmF0b3IoKTsKLQkJRSByZXN1bHQgPSB0aGlzLm5leHRJdGVyYXRvci5uZXh0KCk7Ci0JCi0JCS8vIHRoZSBzdGF0ZW1lbnQgYWJvdmUgd2lsbCB0aHJvdyBhIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkJLy8gaWYgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZTsKLQkJLy8gc28gaWYgd2UgZ2V0IGhlcmUsIHdlIGNhbiBpbmNyZW1lbnQgJ25leHRJbmRleCcKLQkJdGhpcy5uZXh0SW5kZXgrKzsKLQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4OwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQl0aGlzLmxvYWRQcmV2aW91c0l0ZXJhdG9yKCk7Ci0JCUUgcmVzdWx0ID0gdGhpcy5uZXh0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkKLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIGRlY3JlbWVudCAnbmV4dEluZGV4JwotCQl0aGlzLm5leHRJbmRleC0tOwotCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4ICAtIDE7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQkvLyB0aGUgbGlzdCBpdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyB0aGUgbGlzdCBpdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQkvLyB0aGUgbGlzdCBpdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBuZXh0SXRlcmF0b3Igd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IgdGhhdCA8Y29kZT5oYXNOZXh0KCk8L2NvZGU+Ci0JICogb3IgdGhlIGZpbmFsIGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dEl0ZXJhdG9yKCkgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXdoaWxlICgoICEgdGhpcy5uZXh0SXRlcmF0b3IuaGFzTmV4dCgpKSAmJiB0aGlzLml0ZXJhdG9ycy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMubmV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCBuZXh0SXRlcmF0b3Igd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IgdGhhdCA8Y29kZT5oYXNQcmV2aW91cygpPC9jb2RlPgotCSAqIG9yIHRoZSBmaXJzdCBpdGVyYXRvciBpZiBhbGwgdGhlIGVsZW1lbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHJldHJpZXZlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFByZXZpb3VzSXRlcmF0b3IoKSB7Ci0JCXRoaXMuY2hlY2tOZXh0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKCggISB0aGlzLm5leHRJdGVyYXRvci5oYXNQcmV2aW91cygpKSAmJiB0aGlzLml0ZXJhdG9ycy5oYXNQcmV2aW91cygpKSB7Ci0JCQl0aGlzLm5leHRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLnByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiAnbmV4dEl0ZXJhdG9yJyBpcyBudWxsLCBsb2FkIGl0IHdpdGggdGhlIGZpcnN0IGl0ZXJhdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja05leHRJdGVyYXRvcigpIHsKLQkJaWYgKHRoaXMubmV4dEl0ZXJhdG9yID09IG51bGwpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMubmV4dCgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwYTUxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UmVhZE9ubHlJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciA8Y29kZT5JdGVyYXRvcjwvY29kZT4KLSAqIGFuZCByZW1vdmVzIHN1cHBvcnQgZm9yICNyZW1vdmUoKS4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbmVzdGVkSXRlcmF0b3I7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHRoYXQKLQkgKiBkaXNhbGxvd3MgcmVtb3Zlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYXRvcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXRoaXMoYy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCBkaXNhbGxvdyByZW1vdmVzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXN0ZWRJdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLm5lc3RlZEl0ZXJhdG9yID0gbmVzdGVkSXRlcmF0b3I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRJdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYjI1OTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UmVhZE9ubHlMaXN0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIDxjb2RlPkxpc3RJdGVyYXRvcjwvY29kZT4gYW5kIHJlbW92ZXMgc3VwcG9ydCBmb3I6Ci0gKiAJI3JlbW92ZSgpCi0gKiAJI3NldChPYmplY3QpCi0gKiAJI2FkZChPYmplY3QpCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IG5lc3RlZExpc3RJdGVyYXRvcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgbGlzdCB0aGF0Ci0JICogZGlzYWxsb3dzIHJlbW92ZXMsIHNldHMsIGFuZCBhZGRzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYXRvciB0aGF0Ci0JICogZGlzYWxsb3dzIHJlbW92ZXMsIHNldHMsIGFuZCBhZGRzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IG5lc3RlZExpc3RJdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLm5lc3RlZExpc3RJdGVyYXRvciA9IG5lc3RlZExpc3RJdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIG8pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5lc3RlZExpc3RJdGVyYXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZXN1bHRTZXRJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZXN1bHRTZXRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGRhODQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVzdWx0U2V0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UmVzdWx0U2V0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGEgPGNvZGU+UmVzdWx0U2V0PC9jb2RlPgotICogYW5kIHRyYW5zZm9ybXMgaXRzIHJvd3MgZm9yIGNsaWVudCBjb25zdW1wdGlvbi4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKLSAqIDxjb2RlPiNidWlsZE5leHQoUmVzdWx0U2V0KTwvY29kZT4gdG8gYnVpbGQgdGhlIGV4cGVjdGVkIG9iamVjdCBmcm9tCi0gKiB0aGUgY3VycmVudCByb3cgb2YgdGhlIHJlc3VsdCBzZXQuCi0gKiA8cD4KLSAqIFRvIHVzZSwgc3VwcGx5Ojx1bD4KLSAqIDxsaT4gYSA8Y29kZT5SZXN1bHRTZXQ8L2NvZGU+Ci0gKiA8bGk+IGFuIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IHRoYXQgY29udmVydHMgYSByb3cgaW4gdGhlIDxjb2RlPlJlc3VsdFNldDwvY29kZT4KLSAqIGludG8gdGhlIGRlc2lyZWQgb2JqZWN0Ci0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+UmVzdWx0U2V0SXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIDxjb2RlPmJ1aWxkTmV4dChSZXN1bHRTZXQpPC9jb2RlPiBtZXRob2QpCi0gKiA8L3VsPgotICogPHA+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXN1bHRTZXRJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIFJlc3VsdFNldCByZXN1bHRTZXQ7Ci0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyPEU+IGFkYXB0ZXI7Ci0JcHJpdmF0ZSBFIG5leHQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiB0aGUgc3BlY2lmaWVkIHJlc3VsdCBzZXQgdGhhdCByZXR1cm5zCi0JICogdGhlIG9iamVjdHMgcHJvZHVjZWQgYnkgdGhlIHNwZWNpZmllZCBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBSZXN1bHRTZXRJdGVyYXRvcihSZXN1bHRTZXQgcmVzdWx0U2V0LCBBZGFwdGVyPEU+IGFkYXB0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZXN1bHRTZXQgPSByZXN1bHRTZXQ7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JCXRoaXMuZG9uZSA9IGZhbHNlOwotCQl0aGlzLm5leHQgPSB0aGlzLmJ1aWxkTmV4dCgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiB0aGUgc3BlY2lmaWVkIHJlc3VsdCBzZXQgdGhhdCByZXR1cm5zCi0JICogdGhlIGZpcnN0IG9iamVjdCBpbiBlYWNoIHJvdyBvZiB0aGUgcmVzdWx0IHNldC4KLQkgKi8KLQlwdWJsaWMgUmVzdWx0U2V0SXRlcmF0b3IoUmVzdWx0U2V0IHJlc3VsdFNldCkgewotCQl0aGlzKHJlc3VsdFNldCwgQWRhcHRlci5EZWZhdWx0LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHRoZSBuZXh0IG9iamVjdCBmb3IgdGhlIGl0ZXJhdG9yIHRvIHJldHVybi4KLQkgKiBDbG9zZSB0aGUgcmVzdWx0IHNldCB3aGVuIHdlIHJlYWNoIHRoZSBlbmQuCi0JICovCi0JcHJpdmF0ZSBFIGJ1aWxkTmV4dCgpIHsKLQkJdHJ5IHsKLQkJCWlmICh0aGlzLnJlc3VsdFNldC5uZXh0KCkpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZE5leHQodGhpcy5yZXN1bHRTZXQpOwotCQkJfQotCQkJdGhpcy5yZXN1bHRTZXQuY2xvc2UoKTsKLQkJCXRoaXMuZG9uZSA9IHRydWU7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCByZXR1cm4gdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUgY3VycmVudCByb3cKLQkgKiBvZiB0aGUgcmVzdWx0IHNldC4gQW55IDxjb2RlPlNRTEV4Y2VwdGlvbjwvY29kZT5zIHdpbGwKLQkgKiBiZSBjYXVnaHQgYW5kIHdyYXBwZWQgaW4gYSA8Y29kZT5SdW50aW1lRXhjZXB0aW9uPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgRSBidWlsZE5leHQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5idWlsZE5leHQocnMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgdGVtcCA9IHRoaXMubmV4dDsKLQkJdGhpcy5uZXh0ID0gdGhpcy5idWlsZE5leHQoKTsKLQkJcmV0dXJuIHRlbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnJlc3VsdFNldCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2VkIGJ5IDxjb2RlPlJlc3VsdFNldEl0ZXJhdG9yPC9jb2RlPiB0byBjb252ZXJ0IGEKLQkgKiA8Y29kZT5SZXN1bHRTZXQ8L2NvZGU+J3MgY3VycmVudCByb3cgaW50byB0aGUgbmV4dCBvYmplY3QKLQkgKiB0byBiZSByZXR1cm5lZCBieSB0aGUgPGNvZGU+SXRlcmF0b3I8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgQWRhcHRlcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhbiBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzdWx0IHNldCdzCi0JCSAqICJjdXJyZW50IiByb3cuIEFueSA8Y29kZT5TUUxFeGNlcHRpb248L2NvZGU+cyB3aWxsCi0JCSAqIGJlIGNhdWdodCBhbmQgd3JhcHBlZCBpbiBhIDxjb2RlPlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+LgotCQkgKiBAc2VlIGphdmEuc3FsLlJlc3VsdFNldAotCQkgKi8KLQkJVCBidWlsZE5leHQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwotCi0KLQkJZmluYWwgY2xhc3MgRGVmYXVsdDxTPiBpbXBsZW1lbnRzIEFkYXB0ZXI8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIEFkYXB0ZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBBZGFwdGVyPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gcmV0dXJuIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIGN1cnJlbnQgcm93IG9mIHRoZSByZXN1bHQgc2V0Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBTIGJ1aWxkTmV4dChSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQkJCS8vIHJlc3VsdCBzZXQgY29sdW1ucyBhcmUgaW5kZXhlZCBzdGFydGluZyB3aXRoIDEKLQkJCQlyZXR1cm4gKFMpIHJzLmdldE9iamVjdCgxKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlJlc3VsdFNldEl0ZXJhdG9yLkFkYXB0ZXIuRGVmYXVsdCI7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZmQ5ZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudEl0ZXJhdG9yPC9jb2RlPiBob2xkcyBhIHNpbmdsZSBlbGVtZW50Ci0gKiBhbmQgcmV0dXJucyBpdCB3aXRoIHRoZSBmaXJzdCBjYWxsIHRvIDxjb2RlPm5leHQoKTwvY29kZT4sIGF0Ci0gKiB3aGljaCBwb2ludCBpdCB3aWxsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gYW55IHN1YnNlcXVlbnQKLSAqIGNhbGwgdG8gPGNvZGU+aGFzTmV4dCgpPC9jb2RlPi4KLSAqIDxwPgotICogQSA8Y29kZT5TaW5nbGVFbGVtZW50SXRlcmF0b3I8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8gdGhlCi0gKiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gcmV0dXJuZWQgYnk6Ci0gKiAJPGNvZGU+amF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbihlbGVtZW50KS5pdGVyYXRvcigpPC9jb2RlPgotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgRSBlbGVtZW50OwotCXByaXZhdGUgYm9vbGVhbiBkb25lOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIG9ubHkgdGhlIHNwZWNpZmllZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBTaW5nbGVFbGVtZW50SXRlcmF0b3IoRSBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMuZG9uZSA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuZG9uZSA9IHRydWU7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5Y2I3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8L2NvZGU+IGhvbGRzIGEgc2luZ2xlIGVsZW1lbnQKLSAqIGFuZCByZXR1cm5zIGl0IHdpdGggdGhlIGZpcnN0IGNhbGwgdG8gPGNvZGU+bmV4dCgpPC9jb2RlPiwgYXQKLSAqIHdoaWNoIHBvaW50IGl0IHdpbGwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBhbnkgc3Vic2VxdWVudAotICogY2FsbCB0byA8Y29kZT5oYXNOZXh0KCk8L2NvZGU+LiBMaWtld2lzZSwgaXQgd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gKiB0byBhIGNhbGwgdG8gPGNvZGU+aGFzUHJldmlvdXMoKTwvY29kZT4gdW50aWwgYSBjYWxsIHRvIDxjb2RlPm5leHQoKTwvY29kZT4sCi0gKiBhdCB3aGljaCBwb2ludCBhIGNhbGwgdG8gPGNvZGU+cHJldmlvdXMoKTwvY29kZT4gd2lsbCByZXR1cm4gdGhlCi0gKiBzaW5nbGUgZWxlbWVudC4KLSAqIDxwPgotICogQSA8Y29kZT5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIHRoZQotICogPGNvZGU+SXRlcmF0b3I8L2NvZGU+IHJldHVybmVkIGJ5OgotICogCTxjb2RlPmphdmEudXRpbC5Db2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGVsZW1lbnQpLmxpc3RJdGVyYXRvcigpPC9jb2RlPgotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBFIGVsZW1lbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc05leHQ7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3IgdGhhdCByZXR1cm5zIG9ubHkgdGhlIHNwZWNpZmllZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKEUgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLmhhc05leHQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLmhhc05leHQ7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuaGFzTmV4dCkgewotCQkJdGhpcy5oYXNOZXh0ID0gZmFsc2U7Ci0JCQlyZXR1cm4gdGhpcy5lbGVtZW50OwotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmhhc05leHQgPyAwIDogMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNOZXh0OwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQlpZiAodGhpcy5oYXNOZXh0KSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuaGFzTmV4dCA9IHRydWU7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5oYXNOZXh0ID8gLTEgOiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTcwZDI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci0KLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIgPGNvZGU+SXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgdHJhbnNmb3JtcyBpdHMgcmVzdWx0cyBmb3IgY2xpZW50IGNvbnN1bXB0aW9uLiBUbyB1c2UsIHN1cHBseSBhIAotICogPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+IG9yIHN1YmNsYXNzIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIDxjb2RlPnRyYW5zZm9ybShPYmplY3QpPC9jb2RlPiBtZXRob2QuCi0gKiBPYmplY3RzIG9mIHR5cGUgRTEgYXJlIHRyYW5zZm9ybWVkIGludG8gb2JqZWN0cyBvZiB0eXBlIEUyOwotICogaS5lLiB0aGUgaXRlcmF0b3IgcmV0dXJucyBvYmplY3RzIG9mIHR5cGUgRTIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEUxLCBFMj4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEUyPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEUxPiBuZXN0ZWRJdGVyYXRvcjsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCBhIGRpc2FibGVkIHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIDxjb2RlPnRyYW5zZm9ybShPYmplY3QpPC9jb2RlPiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEgPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJdGhpcyhuZXN0ZWRJdGVyYXRvciwgVHJhbnNmb3JtZXIuRGlzYWJsZWQuPEUxLCBFMj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IG5lc3RlZEl0ZXJhdG9yLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLm5lc3RlZEl0ZXJhdG9yID0gbmVzdGVkSXRlcmF0b3I7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLm5lc3RlZEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRTIgbmV4dCgpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG5lc3RlZCBpdGVyYXRvciBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLm5lc3RlZEl0ZXJhdG9yLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXRoaXMubmVzdGVkSXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgRTIgdHJhbnNmb3JtKEUxIG5leHQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubmVzdGVkSXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODdmYzExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgdHJhbnNmb3JtcyBpdHMgcmVzdWx0cyBmb3IgY2xpZW50IGNvbnN1bXB0aW9uLiBUbyB1c2UsIHN1cHBseSBhIAotICogPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+IG9yIHN1YmNsYXNzIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIDxjb2RlPnRyYW5zZm9ybShPYmplY3QpPC9jb2RlPiBtZXRob2QuCi0gKiAKLSAqIFRoZSBtZXRob2RzIDxjb2RlPnNldChPYmplY3QpPC9jb2RlPiBhbmQgPGNvZGU+YWRkKE9iamVjdCk8L2NvZGU+Ci0gKiBhcmUgbGVmdCB1bnN1cHBvcnRlZCBpbiB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8RTEsIEUyPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEUyPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbmVzdGVkSXRlcmF0b3I7Ci0JcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgYSBkaXNhYmxlZCB0cmFuc2Zvcm1lci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiA8Y29kZT50cmFuc2Zvcm0oT2JqZWN0KTwvY29kZT4gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJdGhpcyhuZXN0ZWRJdGVyYXRvciwgVHJhbnNmb3JtZXIuRGlzYWJsZWQuPEUxLCBFMj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubmVzdGVkSXRlcmF0b3IgPSBuZXN0ZWRJdGVyYXRvcjsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubmVzdGVkSXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFMiBuZXh0KCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgbmVzdGVkIGl0ZXJhdG9yIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMubmVzdGVkSXRlcmF0b3IubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBFMiBwcmV2aW91cygpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG5lc3RlZCBpdGVyYXRvciBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLm5lc3RlZEl0ZXJhdG9yLnByZXZpb3VzKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRJdGVyYXRvci5wcmV2aW91c0luZGV4KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUyIG8pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUyIG8pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXRoaXMubmVzdGVkSXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgRTIgdHJhbnNmb3JtKEUxIG5leHQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubmVzdGVkSXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJlZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMDUwOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlRyZWVJdGVyYXRvcjwvY29kZT4gc2ltcGxpZmllcyB0aGUgdHJhdmVyc2FsIG9mIGEKLSAqIHRyZWUgb2Ygb2JqZWN0cywgd2hlcmUgdGhlIG9iamVjdHMnIHByb3RvY29sKHMpIHByb3ZpZGVzCi0gKiBhIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbgotICogbm9kZSBidXQgZG9lcyBub3QgcHJvdmlkZSBhIG1ldGhvZCBmb3IgZ2V0dGluZyBhbGwgdGhlCi0gKiBkZXNjZW5kYW50cyAoY2hpbGRyZW4sIGdyYW5kY2hpbGRyZW4sIGV0Yy4pIG9mIHRoZSBnaXZlbiBub2RlLgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGVpdGhlciB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSB0cmVlIG9yLCBpZiB0aGUgdHJlZSBoYXMKLSAqIG11bHRpcGxlIHJvb3RzLCBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gb3ZlciB0aGUgc2V0IG9mIHJvb3RzCi0gKiA8bGk+IGEgPGNvZGU+TWlkd2lmZTwvY29kZT4gdGhhdCBkZWxpdmVycyB0aGUgY2hpbGRyZW4KLSAqIG9mIGVhY2ggY2hpbGQKLSAqIChhbHRlcm5hdGl2ZWx5LCBzdWJjbGFzcyA8Y29kZT5UcmVlSXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIDxjb2RlPmNoaWxkcmVuKE9iamVjdCk8L2NvZGU+IG1ldGhvZCkKLSAqIDwvdWw+Ci0gKiA8cD4KLSAqLwotcHVibGljIGNsYXNzIFRyZWVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnM7Ci0JcHJpdmF0ZSBmaW5hbCBNaWR3aWZlPEU+IG1pZHdpZmU7Ci0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY3VycmVudEl0ZXJhdG9yOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkaXNhYmxlZCBtaWR3aWZlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIDxjb2RlPmNoaWxkcmVuKE9iamVjdCk8L2NvZGU+IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSA8Y29kZT5NaWR3aWZlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiByb290cykgewotCQl0aGlzKHJvb3RzLCBNaWR3aWZlLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdAotCSAqIGFuZCBhIGRpc2FibGVkIG1pZHdpZmUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+Y2hpbGRyZW4oT2JqZWN0KTwvY29kZT4gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIDxjb2RlPk1pZHdpZmU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmF0b3IoRSByb290KSB7Ci0JCXRoaXMocm9vdCwgTWlkd2lmZS5EaXNhYmxlZC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QKLQkgKiBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEUgcm9vdCwgTWlkd2lmZTxFPiBtaWR3aWZlKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxFPihyb290KSwgbWlkd2lmZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCByb290cwotCSAqIGFuZCBtaWR3aWZlLgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IHJvb3RzLCBNaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSByb290czsKLQkJLy8gdXNlIGEgTGlua2VkTGlzdCBzaW5jZSB3ZSB3aWxsIGJlIHB1bGxpbmcgb2ZmIHRoZSBmcm9udCBhbmQgYWRkaW5nIHRvIHRoZSBlbmQKLQkJdGhpcy5pdGVyYXRvcnMgPSBuZXcgTGlua2VkTGlzdDxJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KCk7Ci0JCXRoaXMubWlkd2lmZSA9IG1pZHdpZmU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJaWYgKHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IgOiB0aGlzLml0ZXJhdG9ycykgewotCQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZXh0SW50ZXJuYWwoKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gc3RyZWFtID0gdGhpcy5pdGVyYXRvcnMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEludGVybmFsKCk7Ci0JfQotCi0JLyoqCi0JICogRmV0Y2ggdGhlIGNoaWxkcmVuIG9mIHRoZSBuZXh0IG5vZGUgYmVmb3JlIHJldHVybmluZyBpdC4KLQkgKi8KLQlwcml2YXRlIEUgbmV4dEludGVybmFsKCkgewotCQlFIG5leHQgPSB0aGlzLmN1cnJlbnRJdGVyYXRvci5uZXh0KCk7Ci0JCXRoaXMuaXRlcmF0b3JzLmFkZCh0aGlzLmNoaWxkcmVuKG5leHQpKTsKLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aGlzLmN1cnJlbnRJdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGNoaWxkcmVuKEUgbmV4dCkgewotCQlyZXR1cm4gdGhpcy5taWR3aWZlLmNoaWxkcmVuKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY3VycmVudEl0ZXJhdG9yKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZWQgYnkgPGNvZGU+VHJlZUl0ZXJhdG9yPC9jb2RlPiB0byByZXRyaWV2ZQotCSAqIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgYSBub2RlIGluIHRoZSB0cmVlLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTWlkd2lmZTxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCQkgKi8KLQkJSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGNoaWxkcmVuKFQgbyk7Ci0KLQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgTWlkd2lmZTxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTWlkd2lmZSBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE1pZHdpZmU8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyByZXR1cm4gbm8gbmVpZ2hib3JzCi0JCQlwdWJsaWMgSXRlcmF0b3I8Uz4gY2hpbGRyZW4oUyBuZXh0KSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlRyZWVJdGVyYXRvci5NaWR3aWZlLk51bGwiOwotCQkJfQotCQl9Ci0KLQkJLyoqIFRoZSBtaWR3aWZlIHVzZWQgd2hlbiB0aGUgI2NoaWxkcmVuKE9iamVjdCkgbWV0aG9kIGlzIG92ZXJyaWRkZW4uICovCi0JCWZpbmFsIGNsYXNzIERpc2FibGVkPFM+IGltcGxlbWVudHMgTWlkd2lmZTxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTWlkd2lmZSBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBNaWR3aWZlPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQkJcHVibGljIEl0ZXJhdG9yPFM+IGNoaWxkcmVuKFMgbmV4dCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyAgLy8gVHJlZUl0ZXJhdG9yLmNoaWxkcmVuKE9iamVjdCkgd2FzIG5vdCBpbXBsZW1lbnRlZAotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVHJlZUl0ZXJhdG9yLk1pZHdpZmUuRGlzYWJsZWQiOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWE0ZDlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBNb2RlbCBwcm90b2NvbC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBNb2RlbCwgU2VyaWFsaXphYmxlIHsKLQkvKioKLQkgKiBEZWxlZ2F0ZSBzdGF0ZS9wcm9wZXJ0eS9jb2xsZWN0aW9uL2xpc3QvdHJlZSBjaGFuZ2Ugc3VwcG9ydCB0byB0aGlzCi0JICogaGVscGVyIG9iamVjdC4gVGhlIGNoYW5nZSBzdXBwb3J0IG9iamVjdCBpcyAibGF6eS1pbml0aWFsaXplZCIuCi0JICovCi0JcHJpdmF0ZSBDaGFuZ2VTdXBwb3J0IGNoYW5nZVN1cHBvcnQ7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICogVGhpcyB3aWxsIGNhbGwgI2luaXRpYWxpemUoKSBvbiB0aGUgbmV3bHktY3JlYXRlZCBpbnN0YW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhY2Nlc3NvciB3aWxsIGJ1aWxkIHRoZSBjaGFuZ2Ugc3VwcG9ydCB3aGVuIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQ2hhbmdlU3VwcG9ydCBnZXRDaGFuZ2VTdXBwb3J0KCkgewotCQlpZiAodGhpcy5jaGFuZ2VTdXBwb3J0ID09IG51bGwpIHsKLQkJCXRoaXMuY2hhbmdlU3VwcG9ydCA9IHRoaXMuYnVpbGRDaGFuZ2VTdXBwb3J0KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2hhbmdlU3VwcG9ydDsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvdyBzdWJjbGFzc2VzIHRvIHR3ZWFrIHRoZSBjaGFuZ2Ugc3VwcG9ydCB1c2VkLgotCSAqLwotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VTdXBwb3J0KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbnVsbCwgbmV3VmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1zQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGFkZGVkSXRlbXMpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IHJlbW92ZWRJdGVtcykgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlQ29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlQ29sbGVjdGlvbkNoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNhZGQoT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtVG9Db2xsZWN0aW9uKEUgaXRlbSwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKGNvbGxlY3Rpb24uYWRkKGl0ZW0pKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGl0ZW0pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI2FkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oRVtdIGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbihuZXcgQXJyYXlJdGVyYXRvcjxFPihpdGVtcyksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNhZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI2FkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlDb2xsZWN0aW9uPEU+IGFkZGVkSXRlbXMgPSBudWxsOwotCQl3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQlFIGl0ZW0gPSBpdGVtcy5uZXh0KCk7Ci0JCQlpZiAoY29sbGVjdGlvbi5hZGQoaXRlbSkpIHsKLQkJCQlpZiAoYWRkZWRJdGVtcyA9PSBudWxsKSB7Ci0JCQkJCWFkZGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEU+KCk7Ci0JCQkJfQotCQkJCWFkZGVkSXRlbXMuYWRkKGl0ZW0pOwotCQkJfQotCQl9Ci0JCWlmIChhZGRlZEl0ZW1zICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jcmVtb3ZlKE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oT2JqZWN0IGl0ZW0sIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmIChjb2xsZWN0aW9uLnJlbW92ZShpdGVtKSkgewotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoY29sbGVjdGlvbk5hbWUsIGl0ZW0pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3JlbW92ZUFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKE9iamVjdFtdIGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oaXRlbXMpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jcmVtb3ZlQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oSXRlcmFibGU8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3JlbW92ZUFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKEl0ZXJhdG9yPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlDb2xsZWN0aW9uPD8+IGl0ZW1zMiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZW1zKTsKLQkJaXRlbXMyLnJldGFpbkFsbChjb2xsZWN0aW9uKTsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gY29sbGVjdGlvbi5yZW1vdmVBbGwoaXRlbXMyKTsKLQotCQlpZiAoICEgaXRlbXMyLmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCBpdGVtczIpOwotCQl9Ci0JCXJldHVybiBjaGFuZ2VkOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZXRhaW5BbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oT2JqZWN0W10gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oaXRlbXMpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luQ29sbGVjdGlvbihJdGVyYWJsZTw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZXRhaW5BbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oSXRlcmF0b3I8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCUNvbGxlY3Rpb248Pz4gaXRlbXMyID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oaXRlbXMpOwotCQlDb2xsZWN0aW9uPD8+IHJlbW92ZWRJdGVtcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGNvbGxlY3Rpb24pOwotCQlyZW1vdmVkSXRlbXMucmVtb3ZlQWxsKGl0ZW1zMik7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGNvbGxlY3Rpb24ucmV0YWluQWxsKGl0ZW1zMik7Ci0KLQkJaWYgKCAhIHJlbW92ZWRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKTsKLQkJfQotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQ2xlYXIgdGhlIGVudGlyZSBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jY2xlYXIoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNsZWFyQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGNvbGxlY3Rpb25OYW1lKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFN5bmNocm9uaXplIHRoZSBjb2xsZWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuZXcgY29sbGVjdGlvbiwKLQkgKiBtYWtpbmcgYSBtaW5pbXVtIG51bWJlciBvZiByZW1vdmVzIGFuZCBhZGRzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplQ29sbGVjdGlvbihDb2xsZWN0aW9uPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmIChuZXdDb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0KLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCUNvbGxlY3Rpb248RT4gcmVtb3ZlSXRlbXMgPSBuZXcgSGFzaEJhZzxFPihjb2xsZWN0aW9uKTsKLQkJcmVtb3ZlSXRlbXMucmVtb3ZlQWxsKG5ld0NvbGxlY3Rpb24pOwotCQljaGFuZ2VkIHw9IHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmVJdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCi0JCUNvbGxlY3Rpb248RT4gYWRkSXRlbXMgPSBuZXcgSGFzaEJhZzxFPihuZXdDb2xsZWN0aW9uKTsKLQkJYWRkSXRlbXMucmVtb3ZlQWxsKGNvbGxlY3Rpb24pOwotCQljaGFuZ2VkIHw9IHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oYWRkSXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogU3luY2hyb25pemUgdGhlIGNvbGxlY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5ldyBjb2xsZWN0aW9uLAotCSAqIG1ha2luZyBhIG1pbmltdW0gbnVtYmVyIG9mIHJlbW92ZXMgYW5kIGFkZHMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uKEl0ZXJhdG9yPEU+IG5ld0l0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5zeW5jaHJvbml6ZUNvbGxlY3Rpb24oQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obmV3SXRlbXMpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtQWRkZWQobGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW0pOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zQWRkZWQobGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IHJlbW92ZWRJdGVtcykgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbVJlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgbmV3SXRlbSwgT2JqZWN0IHJlcGxhY2VkSXRlbSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbVJlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgcmVwbGFjZWRJdGVtKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgPEU+IHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8PyBleHRlbmRzIEU+IG5ld0l0ZW1zLCBMaXN0PEU+IHJlcGxhY2VkSXRlbXMpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zUmVwbGFjZWQobGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgcmVwbGFjZWRJdGVtcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbU1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1Nb3ZlZChsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgPEU+IHZvaWQgZmlyZUl0ZW1zTW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNNb3ZlZChsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNNb3ZlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUxpc3RDbGVhcmVkKFN0cmluZyBsaXN0TmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTGlzdENsZWFyZWQobGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVMaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUxpc3RDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTGlzdENoYW5nZWQoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVMaXN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTGlzdENoYW5nZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNhZGQoaW50LCBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIDxFPiB2b2lkIGFkZEl0ZW1Ub0xpc3QoaW50IGluZGV4LCBFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWxpc3QuYWRkKGluZGV4LCBpdGVtKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW0gdG8gdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I2FkZChPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1Ub0xpc3QoRSBpdGVtLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGlzdC5hZGQoaXRlbSkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChsaXN0TmFtZSwgbGlzdC5zaXplKCkgLSAxLCBpdGVtKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I2FkZEFsbChpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIEVbXSBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3QoaW5kZXgsIG5ldyBBcnJheUl0ZXJhdG9yPEU+KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjYWRkQWxsKGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdChpbmRleCwgaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjYWRkQWxsKGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlMaXN0PEU+IGl0ZW1zMiA9IENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZW1zKTsKLQkJaWYgKGxpc3QuYWRkQWxsKGluZGV4LCBpdGVtczIpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbXMyKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIGVuZCBvZiB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChFW10gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9MaXN0KG5ldyBBcnJheUl0ZXJhdG9yPEU+KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgZW5kIG9mIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNhZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3QoaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgZW5kIG9mIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNhZGRBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJTGlzdDxFPiBpdGVtczIgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVtcyk7Ci0JCWludCBpbmRleCA9IGxpc3Quc2l6ZSgpOwotCQlpZiAobGlzdC5hZGRBbGwoaXRlbXMyKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zMik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7ICAvLyBlbXB0eSBsaXN0IG9mIGl0ZW1zIGFkZGVkCi0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW0gZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBpdGVtLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjcmVtb3ZlKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IEUgcmVtb3ZlSXRlbUZyb21MaXN0KGludCBpbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJRSBpdGVtID0gbGlzdC5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW0pOwotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbSBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZW1vdmVkIGl0ZW0uCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmUoT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1Gcm9tTGlzdChPYmplY3QgaXRlbSwgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKGl0ZW0pOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlsaXN0LnJlbW92ZShpbmRleCk7Ci0JCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZW1vdmVkIGl0ZW1zLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjcmVtb3ZlKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8RT4gcmVtb3ZlSXRlbXNGcm9tTGlzdChpbnQgaW5kZXgsIGludCBsZW5ndGgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCUxpc3Q8RT4gc3ViTGlzdCA9IGxpc3Quc3ViTGlzdChpbmRleCwgaW5kZXggKyBsZW5ndGgpOwotCQlMaXN0PEU+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oc3ViTGlzdCk7Ci0JCXN1Ykxpc3QuY2xlYXIoKTsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQkJcmV0dXJuIHJlbW92ZWRJdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBpdGVtcy4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JlbW92ZUFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KE9iamVjdFtdIGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgaXRlbXMuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChJdGVyYWJsZTw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChpdGVtcy5pdGVyYXRvcigpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgaXRlbXMuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNyZW1vdmVBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCXdoaWxlIChpdGVtcy5oYXNOZXh0KCkpIHsKLQkJCWNoYW5nZWQgfD0gdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaXRlbXMubmV4dCgpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChPYmplY3RbXSBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkxpc3QobmV3IEFycmF5SXRlcmF0b3I8T2JqZWN0PihpdGVtcyksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0YWluIHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QjcmV0YWluQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbkl0ZW1zSW5MaXN0KEl0ZXJhYmxlPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luTGlzdChpdGVtcy5pdGVyYXRvcigpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJQ29sbGVjdGlvbjw/PiBpdGVtczIgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihpdGVtcyk7Ci0JCUNvbGxlY3Rpb248Pz4gcmVtb3ZlZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obGlzdCk7Ci0JCXJlbW92ZWRJdGVtcy5yZW1vdmVBbGwoaXRlbXMyKTsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChyZW1vdmVkSXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgaXRlbSBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVwbGFjZWQgaXRlbS4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3NldChpbnQsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IEUgc2V0SXRlbUluTGlzdChpbnQgaW5kZXgsIEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJRSByZXBsYWNlZEl0ZW0gPSBsaXN0LnNldChpbmRleCwgaXRlbSk7Ci0JCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW0sIHJlcGxhY2VkSXRlbSk7Ci0JCXJldHVybiByZXBsYWNlZEl0ZW07Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJlcGxhY2UgdGhlIHNwZWNpZmllZCBpdGVtIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZXBsYWNlZCBpdGVtLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3Qjc2V0KGludCwgT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCA8RT4gRSByZXBsYWNlSXRlbUluTGlzdChFIG9sZEl0ZW0sIEUgbmV3SXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2V0SXRlbUluTGlzdChsaXN0LmluZGV4T2Yob2xkSXRlbSksIG5ld0l0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlcGxhY2VkIGl0ZW1zLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3Qjc2V0KGludCwgT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCA8RT4gTGlzdDxFPiBzZXRJdGVtc0luTGlzdChpbnQgaW5kZXgsIEVbXSBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2V0SXRlbXNJbkxpc3QoaW5kZXgsIEFycmF5cy5hc0xpc3QoaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZXBsYWNlZCBpdGVtcy4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0I3NldChpbnQsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8RT4gc2V0SXRlbXNJbkxpc3QoaW50IGluZGV4LCBMaXN0PD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJTGlzdDxFPiBzdWJMaXN0ID0gbGlzdC5zdWJMaXN0KGluZGV4LCBpbmRleCArIGl0ZW1zLnNpemUoKSk7Ci0JCUxpc3Q8RT4gcmVwbGFjZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oc3ViTGlzdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCXN1Ykxpc3Quc2V0KGksIGl0ZW1zLmdldChpKSk7Ci0JCX0KLQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zLCByZXBsYWNlZEl0ZW1zKTsKLQkJcmV0dXJuIHJlcGxhY2VkSXRlbXM7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIE1vdmUgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBsaXN0IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlCi0JICogc3BlY2lmaWVkIHRhcmdldCBpbmRleCBmb3IgdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJvdGVjdGVkIDxFPiB2b2lkIG1vdmVJdGVtc0luTGlzdChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQl0aGlzLmZpcmVJdGVtc01vdmVkKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIE1vdmUgYW4gaXRlbSBpbiB0aGUgc3BlY2lmaWVkIGxpc3QgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4LgotCSAqLwotCXByb3RlY3RlZCA8RT4gdm9pZCBtb3ZlSXRlbUluTGlzdChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5maXJlSXRlbU1vdmVkKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBDbGVhciB0aGUgZW50aXJlIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdCNjbGVhcigpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xlYXJMaXN0KExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWxpc3QuY2xlYXIoKTsKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQobGlzdE5hbWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVOb2RlQWRkZWQoU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBwYXRoKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlQWRkZWQodHJlZU5hbWUsIHBhdGgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVOb2RlQWRkZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlQWRkZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVOb2RlUmVtb3ZlZChTdHJpbmcgdHJlZU5hbWUsIE9iamVjdFtdIHBhdGgpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZU5vZGVSZW1vdmVkKHRyZWVOYW1lLCBwYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTm9kZVJlbW92ZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFN0cmluZyB0cmVlTmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlVHJlZUNsZWFyZWQodHJlZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVUcmVlQ2xlYXJlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVRyZWVDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlVHJlZUNoYW5nZWQoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVUcmVlQ2hhbmdlZCh0cmVlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFN0cmluZyB0cmVlTmFtZSwgT2JqZWN0W10gcGF0aCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlVHJlZUNoYW5nZWQodHJlZU5hbWUsIHBhdGgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVRyZWVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHN0YXRlIGNoYW5nZSBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBubyBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMgZm9yIGEgc3BlY2lmaWMgcHJvcGVydHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMgZm9yIGEgc3BlY2lmaWMgcHJvcGVydHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVycyBmb3IgYSBzcGVjaWZpYyBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVycyBmb3IgYSBzcGVjaWZpYyBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGxpc3QgY2hhbmdlIGxpc3RlbmVycyBmb3IgYSBzcGVjaWZpYyBsaXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGxpc3QgY2hhbmdlIGxpc3RlbmVycyBmb3IgYSBzcGVjaWZpYyBsaXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHRyZWUgY2hhbmdlIGxpc3RlbmVycyBmb3IgYSBzcGVjaWZpYyB0cmVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHRyZWUgY2hhbmdlIGxpc3RlbmVycyBmb3IgYSBzcGVjaWZpYyB0cmVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vVHJlZUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgdHJlZU5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdmFsdWVzIGFyZSBlcXVhbCwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVsbCBjaGVja3MuCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBETyBOT1QgdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gZmlyZSBhIGNoYW5nZSBub3RpZmljYXRpb24sCi0JICogQ2hhbmdlU3VwcG9ydCBhbHJlYWR5IGRvZXMgdGhhdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB2YWx1ZXNBcmVFcXVhbChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS52YWx1ZXNBcmVFcXVhbCh2YWx1ZTEsIHZhbHVlMik7Ci0JfQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gdGhpcy52YWx1ZXNBcmVFcXVhbChvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBudWxsIGNoZWNrcy4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gYXR0cmlidXRlIHZhbHVlIGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIERPIE5PVCB1c2UgdGhpcyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBmaXJlIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiwKLQkgKiBDaGFuZ2VTdXBwb3J0IGFscmVhZHkgZG9lcyB0aGF0LgotCSAqIAotCSAqIEZvciBleGFtcGxlLCBhZnRlciBmaXJpbmcgdGhlIGNoYW5nZSBub3RpZmljYXRpb24sIHlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kCi0JICogdG8gZGVjaWRlIGlmIHNvbWUgb3RoZXIsIHJlbGF0ZWQsIHBpZWNlIG9mIHN0YXRlIG5lZWRzIHRvIGJlIHN5bmNocm9uaXplZAotCSAqIHdpdGggdGhlIHN0YXRlIHRoYXQganVzdCBjaGFuZ2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHZhbHVlc0FyZURpZmZlcmVudChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS52YWx1ZXNBcmVEaWZmZXJlbnQodmFsdWUxLCB2YWx1ZTIpOwotCX0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBhdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWx0aG91Z2ggY2xvbmluZyBtb2RlbHMgaXMgdXN1YWxseSBub3QgYSBHb29kIElkZWEsCi0JICogd2Ugc2hvdWxkIGF0IGxlYXN0IHN1cHBvcnQgaXQgcHJvcGVybHkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0TW9kZWwgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotCQlBYnN0cmFjdE1vZGVsIGNsb25lID0gKEFic3RyYWN0TW9kZWwpIHN1cGVyLmNsb25lKCk7Ci0JCWNsb25lLnBvc3RDbG9uZSgpOwotCQlyZXR1cm4gY2xvbmU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSBhbnkgcG9zdC1jbG9uZSBwcm9jZXNzaW5nIG5lY2Vzc2FyeSB0bwotCSAqIHN1Y2Nlc3NmdWxseSBkaXNjb25uZWN0IHRoZSBjbG9uZSBmcm9tIHRoZSBvcmlnaW5hbC4KLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiB0aGUgY2xvbmUsIHRoZSBjbG9uZQotCSAqIGlzIGEgInNoYWxsb3ciIGNvcHkgb2YgdGhlIG9yaWdpbmFsIChpLmUuIHRoZSBjbG9uZQotCSAqIHNoYXJlcyBhbGwgaXRzIGluc3RhbmNlIHZhcmlhYmxlcyB3aXRoIHRoZSBvcmlnaW5hbCkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9zdENsb25lKCkgewotCQkvLyBjbGVhciBvdXQgY2hhbmdlIHN1cHBvcnQgLSBtb2RlbHMgZG8gbm90IHNoYXJlIGxpc3RlbmVycwotCQl0aGlzLmNoYW5nZVN1cHBvcnQgPSBudWxsOwotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5wb3N0Q2xvbmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuYnVpbGRTaW1wbGVUb1N0cmluZ09uKHRoaXMsIHNiKTsKLQkJc2IuYXBwZW5kKCIgKCIpOwotCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIG1ha2UgdGhpcyBwdWJsaWMgc28gb25lIG1vZGVsIGNhbiBjYWxsIGEgbmVzdGVkIG1vZGVsJ3MKLQkgKiAjdG9TdHJpbmcoU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCS8vIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgdG8gZG8gc29tZXRoaW5nIGEgYml0IG1vcmUgaGVscGZ1bAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL0NhbGxiYWNrQ2hhbmdlU3VwcG9ydC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL0NhbGxiYWNrQ2hhbmdlU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzZmMTdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9DYWxsYmFja0NoYW5nZVN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBUaGlzIGNoYW5nZSBzdXBwb3J0IGNsYXNzIHdpbGwgbm90aWZ5IHRoZSBzb3VyY2Ugd2hlbiBvbmUgb2YgdGhlIHNvdXJjZSdzCi0gKiBhc3BlY3RzIGhhcyBjaGFuZ2VkLgotICovCi1wdWJsaWMgY2xhc3MgQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0IGV4dGVuZHMgQ2hhbmdlU3VwcG9ydCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwdWJsaWMgQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0KFNvdXJjZSBzb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU291cmNlIHNvdXJjZSgpIHsKLQkJcmV0dXJuIChTb3VyY2UpIHRoaXMuc291cmNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IENoaWxkKHRoaXMuc291cmNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNvdXJjZUNoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJc3VwZXIuc291cmNlQ2hhbmdlZChhc3BlY3ROYW1lKTsKLQkJdGhpcy5zb3VyY2UoKS5hc3BlY3RDaGFuZ2VkKGFzcGVjdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGlsZCBjaGFuZyBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBhc3BlY3Qtc3BlY2lmaWMgY2hhbmdlIHN1cHBvcnQgY2xhc3MgZG9lcyBub3QgbmVlZCB0bwotCSAqIG5vdGlmeSB0aGUgc291cmNlIG5vZGUgb2YgY2hhbmdlcyAodGhlIHBhcmVudCB3aWxsIHRha2UgY2FyZSBvZiB0aGF0KTsKLQkgKiBub3IgZG9lcyBpdCBuZWVkIHRvIGJ1aWxkICJncmFuZGNoaWxkcmVuIiBjaGFuZ2Ugc3VwcG9ydCBvYmplY3RzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ2hpbGQgZXh0ZW5kcyBDaGFuZ2VTdXBwb3J0IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHVibGljIENoaWxkKFNvdXJjZSBzb3VyY2UpIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU291cmNlIHNvdXJjZSgpIHsKLQkJCXJldHVybiAoU291cmNlKSB0aGlzLnNvdXJjZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoaWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJCS8vIHRoZXJlIGFyZSBubyBncmFuZGNoaWxkcmVuCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHNvdXJjZSBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGNhbGxiYWNrIGNoYW5nZSBzdXBwb3J0IHNvdXJjZSBtdXN0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBzbyBpdAotCSAqIGNhbiBiZSBub3RpZmllZCBvZiBhbnkgYXNwZWN0IGNoYW5nZXMuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBTb3VyY2UgZXh0ZW5kcyBNb2RlbCB7Ci0KLQkJLyoqCi0JCSAqIFRoZSBzcGVjaWZpZWQgYXNwZWN0IGNoYW5nZWQuCi0JCSAqLwotCQl2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL0NoYW5nZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3NDhhZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogU3VwcG9ydCBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBieSBpbXBsZW1lbnRvcnMgb2YgdGhlIE1vZGVsIGludGVyZmFjZS4KLSAqIEl0IHByb3ZpZGVzIGZvciBzdGF0ZSwgcHJvcGVydHksIGNvbGxlY3Rpb24sIGxpc3QsIGFuZCB0cmVlIGNoYW5nZSBub3RpZmljYXRpb25zIHRvCi0gKiBsaXN0ZW5lcnMuCi0gKiAKLSAqIE5COiBUaGVyZSBpcyBsb3RzIG9mIGNvcHktbi1wYXN0ZSBjb2RlIGluIHRoaXMgY2xhc3MuIE5lYXJseSBhbGwgb2YgdGhpcyBkdXBsaWNhdGlvbgotICogaXMgYW4gZWZmb3J0IHRvIHByZXZlbnQgdGhlIHVubmVjZXNzYXJ5IGNyZWF0aW9uIG9mIG5ldyBvYmplY3RzICh0eXBpY2FsbHkgZXZlbnQKLSAqIG9iamVjdHMpLiBTaW5jZSBtYW55IGV2ZW50cyBhcmUgZmlyZWQgd2hlbiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzLCB3ZSBwb3N0cG9uZQotICogdGhlIGNyZWF0aW9uIG9mIGV2ZW50IG9iamVjdHMgdW50aWwgd2Uga25vdyB3ZSBoYXZlIGludGVyZXN0ZWQgbGlzdGVuZXJzLgotICogTW9zdCBtZXRob2RzIGhhdmUgdGhlICJub24tZHVwbGljYXRlZCIgdmVyc2lvbiBvZiB0aGUgbWV0aG9kIGJvZHkgY29tbWVudGVkCi0gKiBvdXQgYXQgdGhlIHRvcCBvZiB0aGUgY3VycmVudCBtZXRob2QgYm9keS4KLSAqIFRoZSBob3BlIHdhcyB0aGF0IHRoaXMgY2xhc3Mgd291bGQgcHJvdmUgdG8gYmUgZmFpcmx5IHN0YXRpYyBhbmQgdGhlIGR1cGxpY2F0ZWQKLSAqIGNvZGUgd291bGQgbm90IHByb3ZlIG9uZXJvdXM7IGJ1dCB0aGF0IGhhcyBub3QgcHJvdmVuIHRvIGJlCi0gKiB0aGUgY2FzZSwgYXMgd2UgaGF2ZSBhZGRlZCBzdXBwb3J0IGZvciAic3RhdGUiIGNoYW5nZXMsICJkaXJ0eSIgbm90aWZpY2F0aW9uLAotICogYW5kIGN1c3RvbSAibm90aWZpZXJzIiwgd2l0aCBtb3JlIHRvIGNvbWUsIEknbSBzdXJlLi4uLiAgfmJqdgotICogCi0gKiBOQjI6IFRoaXMgY2xhc3Mgd2lsbCBjaGVjayB0byBzZWUgaWYsIGR1cmluZyB0aGUgZmlyaW5nIG9mIGV2ZW50cywgYSBsaXN0ZW5lcgotICogb24gdGhlIG9yaWdpbmFsLCBjbG9uZWQsIGxpc3Qgb2YgbGlzdGVuZXJzIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbWFzdGVyCi0gKiBsaXN0IG9mIGxpc3RlbmVycyAqYmVmb3JlKiBpdCBpcyBub3RpZmllZC4gSWYgdGhlIGxpc3RlbmVyIGhhcyBiZWVuIHJlbW92ZWQKLSAqICJjb25jdXJyZW50bHkiIGl0IHdpbGwgKm5vdCogYmUgbm90aWZpZWQuIChTZWUgdGhlIGNvZGUgdGhhdCB1c2VzIHRoZQotICogJ3N0aWxsTGlzdGVuaW5nJyBsb2NhbCBib29sZWFuIGZsYWcuKQotICogCi0gKiBOQjM6IEFueSBsaXN0ZW5lciB0aGF0IGlzIGFkZGVkIGR1cmluZyB0aGUgZmlyaW5nIG9mIGV2ZW50cyB3aWxsICpub3QqIGJlCi0gKiBhbHNvIG5vdGlmaWVkLgotICogCi0gKiBOQjQ6IFRoaXMgY2xhc3MgaXMgc2VyaWFsaXphYmxlLCBidXQgaXQgd2lsbCBvbmx5IHdyaXRlIG91dCBsaXN0ZW5lcnMgdGhhdAotICogYXJlIGFsc28gc2VyaWFsaXphYmxlIHdoaWxlIHNpbGVudGx5IGxlYXZpbmcgYmVoaW5kIGxpc3RlbmVycyB0aGF0IGFyZSBub3QuCi0gKiAKLSAqIFRPRE8gZmlyZSBhIHN0YXRlIGNoYW5nZSBldmVudCB3aXRoICpldmVyeSogY2hhbmdlPwotICogVE9ETyB1c2Ugb2JqZWN0cyAoSURzPykgaW5zdGVhZCBvZiBzdHJpbmdzIHRvIGlkZW50aWZ5IGFzcGVjdHM/Ci0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VTdXBwb3J0Ci0JaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLXsKLQotCS8qKiBUaGUgb2JqZWN0IHRvIGJlIHByb3ZpZGVkIGFzIHRoZSAic291cmNlIiBmb3IgYW55IGdlbmVyYXRlZCBldmVudHMuICovCi0JcHJvdGVjdGVkIGZpbmFsIE1vZGVsIHNvdXJjZTsKLQotCS8qKiBBc3NvY2lhdGUgYSBsaXN0ZW5lciBjbGFzcyB0byBhIGNvbGxlY3Rpb24gb2YgImdlbmVyaWMiIGxpc3RlbmVycyBmb3IgdGhhdCBjbGFzcy4gKi8KLQl0cmFuc2llbnQgcHJpdmF0ZSBHZW5lcmljTGlzdGVuZXJMaXN0W10gZ2VuZXJpY0xpc3RlbmVycyA9IEVNUFRZX0dFTkVSSUNfTElTVEVORVJTOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBHZW5lcmljTGlzdGVuZXJMaXN0W10gRU1QVFlfR0VORVJJQ19MSVNURU5FUlMgPSBuZXcgR2VuZXJpY0xpc3RlbmVyTGlzdFswXTsKLQotCS8qKiBBc3NvY2lhdGUgYXNwZWN0IG5hbWVzIHRvIGNoaWxkIGNoYW5nZSBzdXBwb3J0IG9iamVjdHMuICovCi0JcHJpdmF0ZSBBc3BlY3RDaGlsZFtdIGFzcGVjdENoaWxkcmVuID0gRU1QVFlfQVNQRUNUX0NISUxEUkVOOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBc3BlY3RDaGlsZFtdIEVNUFRZX0FTUEVDVF9DSElMRFJFTiA9IG5ldyBBc3BlY3RDaGlsZFswXTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBzdXBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIHNvdXJjZSBvZiBjaGFuZ2UgZXZlbnRzLgotCSAqIFRoZSBzb3VyY2UgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHVibGljIENoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhICJnZW5lcmljIiBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGV2ZW50cyBhcHByb3ByaWF0ZSB0byB0aGF0Ci0JICogbGlzdGVuZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFzcGVjdCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGV2ZW50LgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihDbGFzczxUPiBsaXN0ZW5lckNsYXNzLCBUIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsJCS8vIGJldHRlciBzb29uZXIgdGhhbiBsYXRlcgotCQl9Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJR2VuZXJpY0xpc3RlbmVyTGlzdCBnbGwgPSB0aGlzLmdlbmVyaWNMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcyk7Ci0JCQlpZiAoZ2xsID09IG51bGwpIHsKLQkJCQl0aGlzLmFkZEdlbmVyaWNMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCQkJfSBlbHNlIHsKLQkJCQlnbGwuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZ2VuZXJpYyIgbGlzdGVuZXIgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcy4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgbGlzdCBpcyBub3QgcHJlc2VudC4KLQkgKi8KLQlwcm90ZWN0ZWQgR2VuZXJpY0xpc3RlbmVyTGlzdCBnZW5lcmljTGlzdGVuZXJMaXN0KENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcykgewotCQlmb3IgKEdlbmVyaWNMaXN0ZW5lckxpc3QgZ2xsIDogdGhpcy5nZW5lcmljTGlzdGVuZXJzKSB7Ci0JCQlpZiAoZ2xsLmxpc3RlbmVyQ2xhc3MgPT0gbGlzdGVuZXJDbGFzcykgewotCQkJCXJldHVybiBnbGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSAiZ2VuZXJpYyIgbGlzdGVuZXIgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcy4KLQkgKiBSZXR1cm4gdGhlIG5ld2x5LWJ1aWx0IGdlbmVyaWMgbGlzdGVuZXIgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gR2VuZXJpY0xpc3RlbmVyTGlzdCBhZGRHZW5lcmljTGlzdGVuZXJMaXN0KENsYXNzPFQ+IGxpc3RlbmVyQ2xhc3MsIFQgbGlzdGVuZXIpIHsKLQkJR2VuZXJpY0xpc3RlbmVyTGlzdCBnbGwgPSBuZXcgR2VuZXJpY0xpc3RlbmVyTGlzdChsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0JCXRoaXMuZ2VuZXJpY0xpc3RlbmVycyA9IENvbGxlY3Rpb25Ub29scy5hZGQodGhpcy5nZW5lcmljTGlzdGVuZXJzLCBnbGwpOwotCQlyZXR1cm4gZ2xsOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGV2ZW50cyBhcHByb3ByaWF0ZSB0byB0aGF0IGxpc3RlbmVyLAotCSAqIGFuZCBvbmx5IHRvIHRob3NlIGV2ZW50cyBjYXJyeWluZyB0aGUgYXNwZWN0IG5hbWUgc3BlY2lmaWVkLgotCSAqIFRoZSBhc3BlY3QgbmFtZSBjYW5ub3QgYmUgbnVsbCBhbmQgdGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXByb3RlY3RlZCA8VCBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiB2b2lkIGFkZExpc3RlbmVyKFN0cmluZyBhc3BlY3ROYW1lLCBDbGFzczxUPiBsaXN0ZW5lckNsYXNzLCBUIGxpc3RlbmVyKSB7Ci0JCWlmICgoYXNwZWN0TmFtZSA9PSBudWxsKSB8fCAobGlzdGVuZXIgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwkJLy8gYmV0dGVyIHNvb25lciB0aGFuIGxhdGVyCi0JCX0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gdGhpcy5jaGlsZChhc3BlY3ROYW1lKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQgPSB0aGlzLmFkZENoaWxkKGFzcGVjdE5hbWUpOwotCQkJfQotCQkJY2hpbGQuYWRkTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGlsZCBjaGFuZ2Ugc3VwcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBhc3BlY3QgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYXNwZWN0IG5hbWUgaXMgbnVsbCBvciB0aGUgY2hpbGQgaXMgbm90IHByZXNlbnQuCi0JICovCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgY2hpbGQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJLy8gcHV0IGluIGEgbnVsbCBjaGVjayB0byBzaW1wbGlmeSBjYWxsaW5nIGNvZGUKLQkJaWYgKGFzcGVjdE5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZm9yIChBc3BlY3RDaGlsZCBhc3BlY3RDaGlsZCA6IHRoaXMuYXNwZWN0Q2hpbGRyZW4pIHsKLQkJCWlmIChhc3BlY3RDaGlsZC5hc3BlY3ROYW1lID09IGFzcGVjdE5hbWUpIHsKLQkJCQlyZXR1cm4gYXNwZWN0Q2hpbGQuY2hpbGQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBjaGlsZCBjaGFuZ2Ugc3VwcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBhc3BlY3QgbmFtZS4KLQkgKiBSZXR1cm4gdGhlIG5ld2x5LWJ1aWx0IGNoaWxkIGNoYW5nZSBzdXBwb3J0LgotCSAqLwotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGFkZENoaWxkKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSB0aGlzLmJ1aWxkQ2hpbGRDaGFuZ2VTdXBwb3J0KCk7Ci0JCXRoaXMuYXNwZWN0Q2hpbGRyZW4gPSBDb2xsZWN0aW9uVG9vbHMuYWRkKHRoaXMuYXNwZWN0Q2hpbGRyZW4sIG5ldyBBc3BlY3RDaGlsZChhc3BlY3ROYW1lLCBjaGlsZCkpOwotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIGNoaWxkIGNoYW5nZSBzdXBwb3J0IHRvIGhvbGQgYXNwZWN0LXNwZWNpZmljIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoaWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VTdXBwb3J0KHRoaXMuc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgImdlbmVyaWMiIGxpc3RlbmVyIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCBmb3IgYWxsIGV2ZW50cwotCSAqIGFwcHJvcHJpYXRlIHRvIHRoYXQgbGlzdGVuZXIuCi0JICovCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8VD4gbGlzdGVuZXJDbGFzcywgVCBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUdlbmVyaWNMaXN0ZW5lckxpc3QgZ2xsID0gdGhpcy5nZW5lcmljTGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MpOwotCQkJaWYgKGdsbCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdGVuZXIgbm90IHJlZ2lzdGVyZWQiKTsKLQkJCX0KLQkJCWlmICggISBnbGwucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpKSB7ICAvLyBsZWF2ZSB0aGUgR0xMLCBldmVuIGlmIGl0IGlzIGVtcHR5PwotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3RlbmVyIG5vdCByZWdpc3RlcmVkIik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIGZvciBhcHByb3ByaWF0ZQotCSAqIGV2ZW50cyBjYXJyeWluZyB0aGUgc3BlY2lmaWVkIGFzcGVjdCBuYW1lLgotCSAqLwotCXByb3RlY3RlZCA8VCBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiB2b2lkIHJlbW92ZUxpc3RlbmVyKFN0cmluZyBhc3BlY3ROYW1lLCBDbGFzczxUPiBsaXN0ZW5lckNsYXNzLCBUIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IHRoaXMuY2hpbGQoYXNwZWN0TmFtZSk7Ci0JCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3RlbmVyIG5vdCByZWdpc3RlcmVkIik7Ci0JCQl9Ci0JCQljaGlsZC5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7ICAvLyBsZWF2ZSB0aGUgY2hpbGQsIGV2ZW4gaWYgaXQgaXMgZW1wdHk/Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJnZW5lcmljIiBsaXN0ZW5lcnMgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgY2xhc3MuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlcmUgYXJlIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlTGlzdGVuZXJbXSBsaXN0ZW5lcnMoQ2xhc3M8PyBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckNsYXNzKSB7Ci0JCUdlbmVyaWNMaXN0ZW5lckxpc3QgZ2xsID0gdGhpcy5nZW5lcmljTGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MpOwotCQlyZXR1cm4gKGdsbCA9PSBudWxsKSA/IG51bGwgOiBnbGwubGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgImdlbmVyaWMiIGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmllZAotCSAqIGxpc3RlbmVyIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPFQgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gYm9vbGVhbiBoYXNBbnlMaXN0ZW5lcnMoQ2xhc3M8VD4gbGlzdGVuZXJDbGFzcykgewotCQlHZW5lcmljTGlzdGVuZXJMaXN0IGdsbCA9IHRoaXMuZ2VuZXJpY0xpc3RlbmVyTGlzdChsaXN0ZW5lckNsYXNzKTsKLQkJcmV0dXJuIChnbGwgIT0gbnVsbCkgJiYgZ2xsLmhhc0xpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBubyAiZ2VuZXJpYyIgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkCi0JICogbGlzdGVuZXIgY2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoQ2xhc3M8VD4gbGlzdGVuZXJDbGFzcykgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueUxpc3RlbmVycyhsaXN0ZW5lckNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmllZAotCSAqIGxpc3RlbmVyIGNsYXNzIGFuZCBhc3BlY3QgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzQW55TGlzdGVuZXJzKENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJaWYgKHRoaXMuaGFzQW55TGlzdGVuZXJzKGxpc3RlbmVyQ2xhc3MpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJCS8vIHRoZXJlJ3MgYSAiZ2VuZXJpYyIgbGlzdGVuZXIKLQkJfQotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gdGhpcy5jaGlsZChhc3BlY3ROYW1lKTsKLQkJcmV0dXJuIChjaGlsZCAhPSBudWxsKSAmJgotCQkJY2hpbGQuaGFzQW55TGlzdGVuZXJzKGxpc3RlbmVyQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBubyAiZ2VuZXJpYyIgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkCi0JICogbGlzdGVuZXIgY2xhc3MgYW5kIGFzcGVjdCBuYW1lLgotCSAqLwotCXByb3RlY3RlZCA8VCBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBib29sZWFuIGhhc05vTGlzdGVuZXJzKENsYXNzPFQ+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55TGlzdGVuZXJzKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIGFzcGVjdCBvZiB0aGUgc291cmNlIGhhcyBjaGFuZ2VkOwotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gdGhpbmdzIGxpa2Ugc2V0dGluZyBhCi0JICogZGlydHkgZmxhZyBvciB2YWxpZGF0aW5nIHRoZSBzb3VyY2UncyBzdGF0ZS4KLQkgKiBUaGUgYXNwZWN0IElEIHdpbGwgYmUgbnVsbCBpZiBhICJzdGF0ZSBjaGFuZ2UiIG9jY3VycmVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNvdXJjZUNoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJLy8gdGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFN0YXRlQ2hhbmdlTGlzdGVuZXI+IFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IFN0YXRlQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBBZGQgYSBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoU1RBVEVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgc3RhdGUgY2hhbmdlIGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgc3RhdGUgY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBTdGF0ZUNoYW5nZUxpc3RlbmVyW10gc3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAoU3RhdGVDaGFuZ2VMaXN0ZW5lcltdKSB0aGlzLmxpc3RlbmVycyhTVEFURV9DSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgdGhlIHNwZWNpZmllZCBzdGF0ZSBjaGFuZ2UgZXZlbnQgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCi0JCVN0YXRlQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCVN0YXRlQ2hhbmdlTGlzdGVuZXJbXSBzdGF0ZUNoYW5nZUxpc3RlbmVycyA9IHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChzdGF0ZUNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IHN0YXRlQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKFN0YXRlQ2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCXRhcmdldC5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBnZW5lcmljIHN0YXRlIGNoYW5nZSBldmVudCB0byBhbnkgcmVnaXN0ZXJlZCBzdGF0ZSBjaGFuZ2UKLQkgKiBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLS8vCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZShuZXcgU3RhdGVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSkpOwotCi0JCVN0YXRlQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCVN0YXRlQ2hhbmdlTGlzdGVuZXJbXSBzdGF0ZUNoYW5nZUxpc3RlbmVycyA9IHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChzdGF0ZUNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IHN0YXRlQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJCWZvciAoU3RhdGVDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCWV2ZW50ID0gbmV3IFN0YXRlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlcyBhcmUgZXF1YWwsIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bGwgY2hlY2tzLgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBhdHRyaWJ1dGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsdWVzQXJlRXF1YWwoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlpZiAoKHZhbHVlMSA9PSBudWxsKSAmJiAodmFsdWUyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJLy8gYm90aCBhcmUgbnVsbAotCQl9Ci0JCWlmICgodmFsdWUxID09IG51bGwpIHx8ICh2YWx1ZTIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsJLy8gb25lIGlzIG51bGwgYnV0IHRoZSBvdGhlciBpcyBub3QKLQkJfQotCQlyZXR1cm4gdmFsdWUxLmVxdWFscyh2YWx1ZTIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbnVsbCBjaGVja3MuCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlyZXR1cm4gISB0aGlzLnZhbHVlc0FyZUVxdWFsKHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCBpcyByZWdpc3RlcmVkIGZvciBhbGwgcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuIFRoZSBsaXN0ZW5lcgotCSAqIHdpbGwgYmUgbm90aWZpZWQgb25seSBmb3IgY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKHByb3BlcnR5TmFtZSwgUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZm9yIGFsbCBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBhIHNwZWNpZmljIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyhQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gYW55IHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10pIHRoaXMubGlzdGVuZXJzKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogRmlyZSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGNoYW5nZSBldmVudCB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogTm8gZXZlbnQgaXMgZmlyZWQgaWYgdGhlIGdpdmVuIGV2ZW50J3Mgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB0aGUgc2FtZTsKLQkgKiB0aGlzIGluY2x1ZGVzIHdoZW4gYm90aCB2YWx1ZXMgYXJlIG51bGwuIFVzZSBhIHN0YXRlIGNoYW5nZSBldmVudAotCSAqIGZvciBnZW5lcmFsIHB1cnBvc2Ugbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGV2ZW50LmdldE9sZFZhbHVlKCksIGV2ZW50LmdldE5ld1ZhbHVlKCkpKSB7Ci0JCQlyZXR1cm47IAotCQl9Ci0KLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAocHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCXRhcmdldC5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGQuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBwcm9wZXJ0eSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycy4KLQkgKiBObyBldmVudCBpcyBmaXJlZCBpZiB0aGUgZ2l2ZW4gb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB0aGUgc2FtZTsKLQkgKiB0aGlzIGluY2x1ZGVzIHdoZW4gYm90aCB2YWx1ZXMgYXJlIG51bGwuIFVzZSBhIHN0YXRlIGNoYW5nZSBldmVudAotCSAqIGZvciBnZW5lcmFsIHB1cnBvc2Ugbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpKTsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwob2xkVmFsdWUsIG5ld1ZhbHVlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyA9IHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChwcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQocHJvcGVydHlOYW1lKTsKLQkJfQotCi0JCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCWV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGFuIGludCBib3VuZCBwcm9wZXJ0eSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIE5vIGV2ZW50IGlzIGZpcmVkIGlmIG9sZCBhbmQgbmV3IGFyZSBlcXVhbC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG1lcmVseSBhIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBtb3JlIGdlbmVyYWwKLQkgKiBmaXJlUHJvcGVydHlDaGFuZ2UgbWV0aG9kIHRoYXQgdGFrZXMgT2JqZWN0IHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0vLwkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3IEludGVnZXIob2xkVmFsdWUpLCBuZXcgSW50ZWdlcihuZXdWYWx1ZSkpOwotCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAocHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQotCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBwcm9wZXJ0eU5hbWUsIG5ldyBJbnRlZ2VyKG9sZFZhbHVlKSwgbmV3IEludGVnZXIobmV3VmFsdWUpKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm9vbGVhbiBib3VuZCBwcm9wZXJ0eSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIE5vIGV2ZW50IGlzIGZpcmVkIGlmIG9sZCBhbmQgbmV3IGFyZSBlcXVhbC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG1lcmVseSBhIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBtb3JlIGdlbmVyYWwKLQkgKiBmaXJlUHJvcGVydHlDaGFuZ2UgbWV0aG9kIHRoYXQgdGFrZXMgT2JqZWN0IHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLS8vCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBCb29sZWFuLnZhbHVlT2Yob2xkVmFsdWUpLCBCb29sZWFuLnZhbHVlT2YobmV3VmFsdWUpKTsKLQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzID0gdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChwcm9wZXJ0eU5hbWUpOwotCQl9Ci0KLQkJUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBCb29sZWFuLnZhbHVlT2Yob2xkVmFsdWUpLCBCb29sZWFuLnZhbHVlT2YobmV3VmFsdWUpKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCi0JLyoqCi0JICogQWRkIGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdGhhdCBpcyByZWdpc3RlcmVkIGZvciBhbGwgY29sbGVjdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gVGhlIGxpc3RlbmVyCi0JICogd2lsbCBiZSBub3RpZmllZCBvbmx5IGZvciBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBhbGwgY29sbGVjdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBmb3IgYSBzcGVjaWZpYyBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gYW55IGNvbGxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyW10pIHRoaXMubGlzdGVuZXJzKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5pdGVtc1NpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgY29sbGVjdGlvbk5hbWUgPSBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpOwotCi0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCXRhcmdldC5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkLmZpcmVJdGVtc0FkZGVkKGV2ZW50KTsKLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBhZGRlZEl0ZW1zKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNBZGRlZChuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcykpOwotCQlpZiAoYWRkZWRJdGVtcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyW10gY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyA9IHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQoY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJdGFyZ2V0Lml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlSXRlbXNBZGRlZChjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNBZGRlZChjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKGFkZGVkSXRlbSkpOwotCi0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihhZGRlZEl0ZW0pKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCWNoaWxkLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5pdGVtc1NpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgY29sbGVjdGlvbk5hbWUgPSBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpOwotCi0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCXRhcmdldC5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGQuZmlyZUl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiByZW1vdmVkSXRlbXMpIHsKLS8vCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcykpOwotCQlpZiAocmVtb3ZlZEl0ZW1zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJbXSBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAoY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZC5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCByZW1vdmVkSXRlbSkgewotLy8JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJlbW92ZWRJdGVtKSk7Ci0KLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyW10gY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyA9IHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQoY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJlbW92ZWRJdGVtKSk7Ci0JCQkJCX0KLQkJCQkJdGFyZ2V0Lml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCWNoaWxkLmZpcmVJdGVtUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZC5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGNvbGxlY3Rpb25OYW1lID0gZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKTsKLQotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJbXSBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAoY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQl0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGQuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLS8vCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSkpOwotCi0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcltdIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCWNoaWxkLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChjb2xsZWN0aW9uTmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBjb2xsZWN0aW9uTmFtZSA9IGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCk7Ci0KLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyW10gY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyA9IHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQoY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJdGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0vLwkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQobmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUpKTsKLQotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJbXSBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAoY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlQ29sbGVjdGlvbkNoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZC5maXJlQ29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RDaGFuZ2VMaXN0ZW5lcj4gTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IGlzIHJlZ2lzdGVyZWQgZm9yIGFsbCBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBsaXN0LiBUaGUgbGlzdGVuZXIKLQkgKiB3aWxsIGJlIG5vdGlmaWVkIG9ubHkgZm9yIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKGxpc3ROYW1lLCBMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3QgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZm9yIGFsbCBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBhIHNwZWNpZmljIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIobGlzdE5hbWUsIExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGxpc3QgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiBhbnkgbGlzdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIChMaXN0Q2hhbmdlTGlzdGVuZXJbXSkgdGhpcy5saXN0ZW5lcnMoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50Lml0ZW1zU2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycyA9IHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBsaXN0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQobGlzdE5hbWUpOwotCQl9Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJdGFyZ2V0Lml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGQuZmlyZUl0ZW1zQWRkZWQoZXZlbnQpOwotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gYWRkZWRJdGVtcykgewotLy8JCXRoaXMuZmlyZUl0ZW1zQWRkZWQobmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKSk7Ci0JCWlmIChhZGRlZEl0ZW1zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSBsaXN0Q2hhbmdlTGlzdGVuZXJzID0gdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAobGlzdENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGxpc3RDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChsaXN0TmFtZSk7Ci0JCX0KLQotCQlMaXN0Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJdGFyZ2V0Lml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZC5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYWRkZWRJdGVtKSk7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycyA9IHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBsaXN0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQobGlzdE5hbWUpOwotCQl9Ci0KLQkJTGlzdENoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYWRkZWRJdGVtKSk7Ci0JCQkJCX0KLQkJCQkJdGFyZ2V0Lml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGQuZmlyZUl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50Lml0ZW1zU2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycyA9IHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBsaXN0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQobGlzdE5hbWUpOwotCQl9Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJdGFyZ2V0Lml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQljaGlsZC5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKSk7Ci0JCWlmIChyZW1vdmVkSXRlbXMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3RDaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUxpc3RDaGFuZ2VMaXN0ZW5lcltdIGxpc3RDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChsaXN0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gbGlzdENoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKGxpc3ROYW1lKTsKLQkJfQotCi0JCUxpc3RDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGQuZmlyZUl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCByZW1vdmVkSXRlbSkgewotLy8JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVtb3ZlZEl0ZW0pKTsKLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSBsaXN0Q2hhbmdlTGlzdGVuZXJzID0gdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAobGlzdENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGxpc3RDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChsaXN0TmFtZSk7Ci0JCX0KLQotCQlMaXN0Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyZW1vdmVkSXRlbSkpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlSXRlbVJlbW92ZWQobGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5pdGVtc1NpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgbGlzdE5hbWUgPSBldmVudC5nZXRMaXN0TmFtZSgpOwotCi0JCUxpc3RDaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUxpc3RDaGFuZ2VMaXN0ZW5lcltdIGxpc3RDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChsaXN0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gbGlzdENoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKGxpc3ROYW1lKTsKLQkJfQotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCXRhcmdldC5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IG5ld0l0ZW1zLCBMaXN0PD8+IHJlcGxhY2VkSXRlbXMpIHsKLS8vCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIHJlcGxhY2VkSXRlbXMpKTsKLQkJaWYgKG5ld0l0ZW1zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSBsaXN0Q2hhbmdlTGlzdGVuZXJzID0gdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAobGlzdENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGxpc3RDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChsaXN0TmFtZSk7Ci0JCX0KLQotCQlMaXN0Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIHJlcGxhY2VkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuZmlyZUl0ZW1zUmVwbGFjZWQobGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgcmVwbGFjZWRJdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBuZXdJdGVtLCBPYmplY3QgcmVwbGFjZWRJdGVtKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3SXRlbSksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVwbGFjZWRJdGVtKSk7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycyA9IHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBsaXN0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQobGlzdE5hbWUpOwotCQl9Ci0KLQkJTGlzdENoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3SXRlbSksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVwbGFjZWRJdGVtKSk7Ci0JCQkJCX0KLQkJCQkJdGFyZ2V0Lml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlSXRlbVJlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgcmVwbGFjZWRJdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGQuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRUYXJnZXRJbmRleCgpID09IGV2ZW50LmdldFNvdXJjZUluZGV4KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycyA9IHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBsaXN0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQobGlzdE5hbWUpOwotCQl9Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJdGFyZ2V0Lml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGQuZmlyZUl0ZW1zTW92ZWQoZXZlbnQpOwotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zTW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotLy8JCXRoaXMuZmlyZUl0ZW1zTW92ZWQobmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKSk7Ci0JCWlmICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycyA9IHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBsaXN0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQobGlzdE5hbWUpOwotCQl9Ci0KLQkJTGlzdENoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuZmlyZUl0ZW1zTW92ZWQobGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGQuZmlyZUl0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1Nb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQobGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGxpc3ROYW1lID0gZXZlbnQuZ2V0TGlzdE5hbWUoKTsKLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSBsaXN0Q2hhbmdlTGlzdGVuZXJzID0gdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAobGlzdENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGxpc3RDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChsaXN0TmFtZSk7Ci0JCX0KLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQl0YXJnZXQubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGQuZmlyZUxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2xlYXJlZChTdHJpbmcgbGlzdE5hbWUpIHsKLS8vCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSkpOwotCi0JCUxpc3RDaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCUxpc3RDaGFuZ2VMaXN0ZW5lcltdIGxpc3RDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmIChsaXN0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gbGlzdENoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKGxpc3ROYW1lKTsKLQkJfQotCi0JCUxpc3RDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCWNoaWxkLmZpcmVMaXN0Q2xlYXJlZChsaXN0TmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVMaXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyW10gbGlzdENoYW5nZUxpc3RlbmVycyA9IHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSBsaXN0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQobGlzdE5hbWUpOwotCQl9Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdENoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJdGFyZ2V0Lmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkLmZpcmVMaXN0Q2hhbmdlZChldmVudCk7Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENoYW5nZWQoU3RyaW5nIGxpc3ROYW1lKSB7Ci0vLwkJdGhpcy5maXJlTGlzdENoYW5nZWQobmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUpKTsKLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXJbXSBsaXN0Q2hhbmdlTGlzdGVuZXJzID0gdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAobGlzdENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IGxpc3RDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZChsaXN0TmFtZSk7Ci0JCX0KLQotCQlMaXN0Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlTGlzdENoYW5nZWQobGlzdE5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZC5maXJlTGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBUcmVlQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfVFJFRV9QQVRIID0gbmV3IE9iamVjdFswXTsKLQotCS8qKgotCSAqIEFkZCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgaXMgcmVnaXN0ZXJlZCBmb3IgYWxsIHRyZWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIHRyZWUuIFRoZSBsaXN0ZW5lcgotCSAqIHdpbGwgYmUgbm90aWZpZWQgb25seSBmb3IgY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIHRyZWUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIodHJlZU5hbWUsIFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBmb3IgYWxsIHRyZWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBmb3IgYSBzcGVjaWZpYyB0cmVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgdHJlZU5hbWUsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKHRyZWVOYW1lLCBUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgdHJlZSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCB0cmVlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgdHJlZSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gYW55IHRyZWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVDaGFuZ2VMaXN0ZW5lcltdIHRyZWVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAoVHJlZUNoYW5nZUxpc3RlbmVyW10pIHRoaXMubGlzdGVuZXJzKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHRyZWVOYW1lID0gZXZlbnQuZ2V0VHJlZU5hbWUoKTsKLQotCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0cmVlQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAodHJlZUNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IHRyZWVDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZCh0cmVlTmFtZSk7Ci0JCX0KLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy50cmVlQ2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQl0YXJnZXQubm9kZUFkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkLmZpcmVOb2RlQWRkZWQoZXZlbnQpOwotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKHRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChTdHJpbmcgdHJlZU5hbWUsIE9iamVjdFtdIHBhdGgpIHsKLS8vCQl0aGlzLmZpcmVOb2RlQWRkZWQobmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpKTsKLQotCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0cmVlQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAodHJlZUNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IHRyZWVDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZCh0cmVlTmFtZSk7Ci0JCX0KLQotCQlUcmVlQ2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBUcmVlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQubm9kZUFkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuZmlyZU5vZGVBZGRlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVOb2RlQWRkZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKHRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgdHJlZU5hbWUgPSBldmVudC5nZXRUcmVlTmFtZSgpOwotCi0JCVRyZWVDaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCVRyZWVDaGFuZ2VMaXN0ZW5lcltdIHRyZWVDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmICh0cmVlQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gdHJlZUNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKHRyZWVOYW1lKTsKLQkJfQotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCXRhcmdldC5ub2RlUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQljaGlsZC5maXJlTm9kZVJlbW92ZWQoZXZlbnQpOwotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKHRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFN0cmluZyB0cmVlTmFtZSwgT2JqZWN0W10gcGF0aCkgewotLy8JCXRoaXMuZmlyZU5vZGVSZW1vdmVkKG5ldyBUcmVlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKSk7Ci0KLQkJVHJlZUNoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJVHJlZUNoYW5nZUxpc3RlbmVyW10gdHJlZUNoYW5nZUxpc3RlbmVycyA9IHRoaXMudHJlZUNoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKHRyZWVDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSB0cmVlQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQodHJlZU5hbWUpOwotCQl9Ci0KLQkJVHJlZUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy50cmVlQ2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgcGF0aCk7Ci0JCQkJCX0KLQkJCQkJdGFyZ2V0Lm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJY2hpbGQuZmlyZU5vZGVSZW1vdmVkKHRyZWVOYW1lLCBwYXRoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGQuZmlyZU5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZCh0cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHRyZWVOYW1lID0gZXZlbnQuZ2V0VHJlZU5hbWUoKTsKLQotCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0cmVlQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAodHJlZUNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IHRyZWVDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZCh0cmVlTmFtZSk7Ci0JCX0KLQotCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJYm9vbGVhbiBzdGlsbExpc3RlbmluZzsKLQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy50cmVlQ2hhbmdlTGlzdGVuZXJzKCksIHRhcmdldCk7Ci0JCQkJfQotCQkJCWlmIChzdGlsbExpc3RlbmluZykgewotCQkJCQl0YXJnZXQudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGQuZmlyZVRyZWVDbGVhcmVkKGV2ZW50KTsKLQkJfQotCi0JCXRoaXMuc291cmNlQ2hhbmdlZCh0cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChTdHJpbmcgdHJlZU5hbWUsIE9iamVjdFtdIHBhdGgpIHsKLS8vCQl0aGlzLmZpcmVUcmVlQ2xlYXJlZChuZXcgVHJlZUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgcGF0aCkpOwotCi0JCVRyZWVDaGFuZ2VMaXN0ZW5lcltdIHRhcmdldHMgPSBudWxsOwotCQlDaGFuZ2VTdXBwb3J0IGNoaWxkID0gbnVsbDsKLQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCVRyZWVDaGFuZ2VMaXN0ZW5lcltdIHRyZWVDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCWlmICh0cmVlQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzID0gdHJlZUNoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJfQotCQkJY2hpbGQgPSB0aGlzLmNoaWxkKHRyZWVOYW1lKTsKLQkJfQotCi0JCVRyZWVDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMudHJlZUNoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpOwotCQkJCQl9Ci0JCQkJCXRhcmdldC50cmVlQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCWNoaWxkLmZpcmVUcmVlQ2xlYXJlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkLmZpcmVUcmVlQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQodHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNsZWFyZWQoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXRoaXMuZmlyZVRyZWVDbGVhcmVkKHRyZWVOYW1lLCBFTVBUWV9UUkVFX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyB0cmVlTmFtZSA9IGV2ZW50LmdldFRyZWVOYW1lKCk7Ci0KLQkJVHJlZUNoYW5nZUxpc3RlbmVyW10gdGFyZ2V0cyA9IG51bGw7Ci0JCUNoYW5nZVN1cHBvcnQgY2hpbGQgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJVHJlZUNoYW5nZUxpc3RlbmVyW10gdHJlZUNoYW5nZUxpc3RlbmVycyA9IHRoaXMudHJlZUNoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKHRyZWVDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCXRhcmdldHMgPSB0cmVlQ2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7Ci0JCQl9Ci0JCQljaGlsZCA9IHRoaXMuY2hpbGQodHJlZU5hbWUpOwotCQl9Ci0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgdGFyZ2V0IDogdGFyZ2V0cykgewotCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCXN0aWxsTGlzdGVuaW5nID0gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMudHJlZUNoYW5nZUxpc3RlbmVycygpLCB0YXJnZXQpOwotCQkJCX0KLQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJdGFyZ2V0LnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkLmZpcmVUcmVlQ2hhbmdlZChldmVudCk7Ci0JCX0KLQotCQl0aGlzLnNvdXJjZUNoYW5nZWQodHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZWQoU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBwYXRoKSB7Ci0vLwkJdGhpcy5maXJlVHJlZUNoYW5nZWQobmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpKTsKLQotCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJQ2hhbmdlU3VwcG9ydCBjaGlsZCA9IG51bGw7Ci0KLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlUcmVlQ2hhbmdlTGlzdGVuZXJbXSB0cmVlQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAodHJlZUNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0cyA9IHRyZWVDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKLQkJCX0KLQkJCWNoaWxkID0gdGhpcy5jaGlsZCh0cmVlTmFtZSk7Ci0JCX0KLQotCQlUcmVlQ2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIHRhcmdldCA6IHRhcmdldHMpIHsKLQkJCQlib29sZWFuIHN0aWxsTGlzdGVuaW5nOwotCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQlzdGlsbExpc3RlbmluZyA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJaWYgKHN0aWxsTGlzdGVuaW5nKSB7Ci0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkvLyBoZXJlJ3MgdGhlIHJlYXNvbiBmb3IgdGhlIGR1cGxpY2F0ZSBjb2RlLi4uCi0JCQkJCQlldmVudCA9IG5ldyBUcmVlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKTsKLQkJCQkJfQotCQkJCQl0YXJnZXQudHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQljaGlsZC5maXJlVHJlZUNoYW5nZWQodHJlZU5hbWUsIHBhdGgpOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZC5maXJlVHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5zb3VyY2VDaGFuZ2VkKHRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFN0cmluZyB0cmVlTmFtZSkgewotCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZCh0cmVlTmFtZSwgRU1QVFlfVFJFRV9QQVRIKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnNvdXJjZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlcmlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gd3JpdGUgb3V0IHRoZSBzb3VyY2UsIGNoaWxkcmVuLCBhbmQgYW55IGhpZGRlbiBzdHVmZgotCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCi0JCS8vIG9ubHkgd3JpdGUgb3V0IFNlcmlhbGl6YWJsZSBsaXN0ZW5lcnMKLQkJaW50IGxlbjEgPSB0aGlzLmdlbmVyaWNMaXN0ZW5lcnMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjE7IGkrKykgewotCQkJdGhpcy53cml0ZU9iamVjdChzLCB0aGlzLmdlbmVyaWNMaXN0ZW5lcnNbaV0pOwotCQl9Ci0JCXMud3JpdGVPYmplY3QobnVsbCk7Ci0gICAgfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBzLCBHZW5lcmljTGlzdGVuZXJMaXN0IGdsbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWludCBsZW4gPSBnbGwubGlzdGVuZXJzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBnbGwubGlzdGVuZXJzW2ldOwotCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgU2VyaWFsaXphYmxlKSB7Ci0JCQkJaWYgKGZpcnN0KSB7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJCXMud3JpdGVPYmplY3QoZ2xsLmxpc3RlbmVyQ2xhc3MpOwotCQkJCX0KLQkJCQlzLndyaXRlT2JqZWN0KGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQlpZiAoICEgZmlyc3QpIHsKLQkJCXMud3JpdGVPYmplY3QobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gcmVhZCBpbiB0aGUgc291cmNlLCBjaGlsZHJlbiwgYW5kIGFueSBoaWRkZW4gc3R1ZmYKLQkJcy5kZWZhdWx0UmVhZE9iamVjdCgpOwotCi0JCS8vIHJlYWQgaW4gZ2VuZXJpYyBsaXN0ZW5lciBsaXN0cwotCQl0aGlzLmdlbmVyaWNMaXN0ZW5lcnMgPSBFTVBUWV9HRU5FUklDX0xJU1RFTkVSUzsKLQkJT2JqZWN0IG87Ci0JCXdoaWxlIChudWxsICE9IChvID0gcy5yZWFkT2JqZWN0KCkpKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUNsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcyA9IChDbGFzczw/IGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+KSBvOwotCQkJR2VuZXJpY0xpc3RlbmVyTGlzdCBnbGwgPSBudWxsOwotCQkJd2hpbGUgKG51bGwgIT0gKG8gPSBzLnJlYWRPYmplY3QoKSkpIHsKLQkJCQlpZiAoZ2xsID09IG51bGwpIHsKLQkJCQkJZ2xsID0gdGhpcy5hZGRHZW5lcmljTGlzdGVuZXJMaXN0SW50ZXJuYWwobGlzdGVuZXJDbGFzcywgKENoYW5nZUxpc3RlbmVyKSBvKTsKLQkJCQl9IGVsc2UgewotCQkJCQlnbGwuYWRkTGlzdGVuZXIoKENoYW5nZUxpc3RlbmVyKSBvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIDxUIGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IEdlbmVyaWNMaXN0ZW5lckxpc3QgYWRkR2VuZXJpY0xpc3RlbmVyTGlzdEludGVybmFsKENsYXNzPFQ+IGxpc3RlbmVyQ2xhc3MsIENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJldHVybiB0aGlzLmFkZEdlbmVyaWNMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcywgKFQpIGxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUGFpciBhIGxpc3RlbmVyIGNsYXNzIHdpdGggaXRzICJnZW5lcmljIiBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR2VuZXJpY0xpc3RlbmVyTGlzdCB7Ci0JCWZpbmFsIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzczsKLQkJQ2hhbmdlTGlzdGVuZXJbXSBsaXN0ZW5lcnM7Ci0KLQkJPFQgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gR2VuZXJpY0xpc3RlbmVyTGlzdChDbGFzczxUPiBsaXN0ZW5lckNsYXNzLCBUIGxpc3RlbmVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5saXN0ZW5lckNsYXNzID0gbGlzdGVuZXJDbGFzczsKLQkJCXRoaXMubGlzdGVuZXJzID0gKENoYW5nZUxpc3RlbmVyW10pIEFycmF5Lm5ld0luc3RhbmNlKGxpc3RlbmVyQ2xhc3MsIDEpOwotCQkJdGhpcy5saXN0ZW5lcnNbMF0gPSBsaXN0ZW5lcjsKLQkJfQotCi0JCXZvaWQgYWRkTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJzID0gQ29sbGVjdGlvblRvb2xzLmFkZCh0aGlzLmxpc3RlbmVycywgbGlzdGVuZXIpOwotCQl9Ci0KLQkJYm9vbGVhbiByZW1vdmVMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJaW50IGxlbiA9IHRoaXMubGlzdGVuZXJzLmxlbmd0aDsKLQkJCWlmIChsZW4gPT0gMCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJdGhpcy5saXN0ZW5lcnMgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlKHRoaXMubGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0JCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBsaXN0ZW5lciBub3QgaW4gdGhlIGxpc3QKLQkJCX0KLQkJCXJldHVybiAodGhpcy5saXN0ZW5lcnMubGVuZ3RoICsgMSkgPT0gbGVuOwotCQl9Ci0KLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0ZW5lcnMubGVuZ3RoID4gMDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgQ2xhc3NUb29scy5zaG9ydE5hbWVGb3IodGhpcy5saXN0ZW5lckNsYXNzKSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFBhaXIgYW4gYXNwZWN0IG5hbWUgd2l0aCB0aGUgY2hhbmdlIHN1cHBvcnQgaG9sZGluZyBpdHMgYXNzb2NpYXRlZAotCSAqIGxpc3RlbmVycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBBc3BlY3RDaGlsZCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0JCWZpbmFsIFN0cmluZyBhc3BlY3ROYW1lOwotCQlmaW5hbCBDaGFuZ2VTdXBwb3J0IGNoaWxkOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlBc3BlY3RDaGlsZChTdHJpbmcgYXNwZWN0TmFtZSwgQ2hhbmdlU3VwcG9ydCBjaGlsZCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYXNwZWN0TmFtZSA9IGFzcGVjdE5hbWU7Ci0JCQl0aGlzLmNoaWxkID0gY2hpbGQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYXNwZWN0TmFtZSk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL1NpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2M2U1MjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL1NpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBjaGFuZ2Ugc3VwcG9ydCBjbGFzcyBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZiB0aGUgc3RhbmRhcmQKLSAqIENoYW5nZVN1cHBvcnQgaW4gc2V2ZXJhbCB3YXlzOgotICogCS0gQWxsIGV2ZW50cyBmaXJlZCBieSB0aGUgc291cmNlIG11c3Qgc3BlY2lmeSB0aGUgc2luZ2xlIGFzcGVjdC4KLSAqIAktIExpc3RlbmVycyBhcmUgcmVxdWlyZWQgdG8gYmUgZWl0aGVyICJnZW5lcmljIiBsaXN0ZW5lcnMgb3IKLSAqIAkgICAgbGlzdGVuZXJzIG9mIHRoZSBzaW5nbGUgYXNwZWN0LgotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydAotCWV4dGVuZHMgQ2hhbmdlU3VwcG9ydAotewotCXByb3RlY3RlZCBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3M7Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBhc3BlY3ROYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlLCBDbGFzczw/IGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCXRoaXMubGlzdGVuZXJDbGFzcyA9IGxpc3RlbmVyQ2xhc3M7Ci0JCXRoaXMuYXNwZWN0TmFtZSA9IGFzcGVjdE5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByaXZhdGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gdW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCXJldHVybiBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgTW9kZWwgc3VwcG9ydHMgb25seSBjaGFuZ2VzIGZvciB0aGUgbGlzdGVuZXIgdHlwZSBcIiIgKyB0aGlzLmxpc3RlbmVyQ2xhc3MuZ2V0TmFtZSgpCi0JCQkJKyAiXCIgYW5kIHRoZSBhc3BlY3QgXCIiICsgdGhpcy5hc3BlY3ROYW1lICsgIlwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrKENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbENsYXNzLCBTdHJpbmcgYU5hbWUpIHsKLQkJaWYgKGxDbGFzcyAhPSB0aGlzLmxpc3RlbmVyQ2xhc3MpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoaXMgTW9kZWwgc3VwcG9ydHMgb25seSBjaGFuZ2VzIGZvciB0aGUgbGlzdGVuZXIgdHlwZSBcIiIgKyB0aGlzLmxpc3RlbmVyQ2xhc3MuZ2V0TmFtZSgpICsgIlwiIDogXCIiICsgbENsYXNzLmdldE5hbWUoKSArICJcIiIpOwotCQl9Ci0JCWlmIChhTmFtZSAhPSB0aGlzLmFzcGVjdE5hbWUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoaXMgTW9kZWwgc3VwcG9ydHMgb25seSBjaGFuZ2VzIGZvciB0aGUgYXNwZWN0IFwiIiArIHRoaXMuYXNwZWN0TmFtZSArICJcIiA6IFwiIiArIGFOYW1lICsgIlwiIik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihTdHJpbmcgYU5hbWUsIENsYXNzPFQ+IGxDbGFzcywgVCBsaXN0ZW5lcikgewotCQl0aGlzLmNoZWNrKGxDbGFzcywgYU5hbWUpOwotCQlzdXBlci5hZGRMaXN0ZW5lcihhTmFtZSwgbENsYXNzLCBsaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoU3RyaW5nIGFOYW1lLCBDbGFzczxUPiBsQ2xhc3MsIFQgbGlzdGVuZXIpIHsKLQkJdGhpcy5jaGVjayhsQ2xhc3MsIGFOYW1lKTsKLQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIoYU5hbWUsIGxDbGFzcywgbGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBxdWVyaWVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0FueUxpc3RlbmVycyhDbGFzczw/IGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IGxDbGFzcywgU3RyaW5nIGFOYW1lKSB7Ci0JCXRoaXMuY2hlY2sobENsYXNzLCBhTmFtZSk7Ci0JCXJldHVybiBzdXBlci5oYXNBbnlMaXN0ZW5lcnMobENsYXNzLCBhTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aHJvdyB0aGlzLnVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLQkJdGhyb3cgdGhpcy51bnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmNoZWNrKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lKTsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQl0aGlzLmNoZWNrKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lKTsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCXRoaXMuY2hlY2soUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBwcm9wZXJ0eU5hbWUpOwotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVJdGVtc0FkZGVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNBZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gYWRkZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtc0FkZGVkKGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IGFkZGVkSXRlbSkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IHJlbW92ZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlbW92ZWQoY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1SZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNsZWFyZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJc3VwZXIuZmlyZUl0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiByZW1vdmVkSXRlbXMpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCByZW1vdmVkSXRlbSkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNSZXBsYWNlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBuZXdJdGVtcywgTGlzdDw/PiByZXBsYWNlZEl0ZW1zKSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVwbGFjZWQobGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgcmVwbGFjZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZXBsYWNlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IG5ld0l0ZW0sIE9iamVjdCByZXBsYWNlZEl0ZW0pIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbVJlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgcmVwbGFjZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVJdGVtc01vdmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbXNNb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1zTW92ZWQobGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlzdXBlci5maXJlTGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2xlYXJlZChTdHJpbmcgbGlzdE5hbWUpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlTGlzdENsZWFyZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVMaXN0Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKFN0cmluZyBsaXN0TmFtZSkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXN1cGVyLmZpcmVMaXN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyZWUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVOb2RlQWRkZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlQWRkZWQoU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBwYXRoKSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQkJc3VwZXIuZmlyZU5vZGVBZGRlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRUcmVlTmFtZSgpKTsKLQkJc3VwZXIuZmlyZU5vZGVSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZVJlbW92ZWQoU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBwYXRoKSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQkJc3VwZXIuZmlyZU5vZGVSZW1vdmVkKHRyZWVOYW1lLCBwYXRoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNsZWFyZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCQlzdXBlci5maXJlVHJlZUNsZWFyZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChTdHJpbmcgdHJlZU5hbWUsIE9iamVjdFtdIHBhdGgpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUpOwotCQlzdXBlci5maXJlVHJlZUNsZWFyZWQodHJlZU5hbWUsIHBhdGgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVUcmVlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFN0cmluZyB0cmVlTmFtZSwgT2JqZWN0W10gcGF0aCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCB0cmVlTmFtZSk7Ci0JCXN1cGVyLmZpcmVUcmVlQ2hhbmdlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTc2NTRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgQVdUCi0gKiBldmVudCBxdWV1ZS4KLSAqLwotcHVibGljIGNsYXNzIEFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIEFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKEV2ZW50UXVldWUuaXNEaXNwYXRjaFRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChFdmVudFF1ZXVlLmlzRGlzcGF0Y2hUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCkpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkQ29sbGVjdGlvbkNsZWFyZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChFdmVudFF1ZXVlLmlzRGlzcGF0Y2hUaHJlYWQoKSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyBhZGRlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRDb2xsZWN0aW9uQ2xlYXJlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjbGVhcmVkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogRXZlbnRRdWV1ZSNpbnZva2VMYXRlcihSdW5uYWJsZSkgc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcgI2ludm9rZUFuZFdhaXQoUnVubmFibGUpIGNhbiBzb21ldGltZXMgbWFrZSB0aGluZ3MKLQkgKiBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPbkV2ZW50UXVldWUoUnVubmFibGUgcikgewotCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKHIpOwotLy8JCXRyeSB7Ci0vLwkJCUV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChyKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfQotCX0KLQotCXZvaWQgaXRlbXNBZGRlZF8oQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc1JlbW92ZWRfKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZF8oQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgY29sbGVjdGlvbkNoYW5nZWRfKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgIikiOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2M2M2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dDsKLQotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBsaXN0IGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIEFXVAotICogZXZlbnQgcXVldWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChFdmVudFF1ZXVlLmlzRGlzcGF0Y2hUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNNb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc01vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChFdmVudFF1ZXVlLmlzRGlzcGF0Y2hUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zUmVwbGFjZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChFdmVudFF1ZXVlLmlzRGlzcGF0Y2hUaHJlYWQoKSkgewotCQkJdGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRMaXN0Q2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKEV2ZW50UXVldWUuaXNEaXNwYXRjaFRocmVhZCgpKSB7Ci0JCQl0aGlzLmxpc3RDaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZExpc3RDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIGFkZGVkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgcmVtb3ZlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNNb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgbW92ZWQiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlcGxhY2VkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTGlzdENsZWFyZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgY2xlYXJlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZExpc3RDaGFuZ2VkUnVubmFibGUoZmluYWwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmxpc3RDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNoYW5nZWQiOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpIHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nICNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKSBjYW4gc29tZXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25FdmVudFF1ZXVlKFJ1bm5hYmxlIHIpIHsKLQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihyKTsKLS8vCQl0cnkgewotLy8JCQlFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQocik7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0KLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNNb3ZlZF8oTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNNb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc1JlcGxhY2VkXyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGxpc3RDbGVhcmVkXyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5saXN0Q2xlYXJlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBsaXN0Q2hhbmdlZF8oTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQVdUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAiKSI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MWFjODcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3Q7Ci0KLWltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLgotICovCi1wdWJsaWMgY2xhc3MgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQotCXB1YmxpYyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKEV2ZW50UXVldWUuaXNEaXNwYXRjaFRocmVhZCgpKSB7Ci0JCQl0aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpIHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nICNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKSBjYW4gc29tZXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25FdmVudFF1ZXVlKFJ1bm5hYmxlIHIpIHsKLQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihyKTsKLS8vCQl0cnkgewotLy8JCQlFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQocik7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0KLQl9Ci0KLQl2b2lkIHByb3BlcnR5Q2hhbmdlZF8oUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICIpIjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIwNDJhZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dDsKLQotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIHN0YXRlIGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIEFXVAotICogZXZlbnQgcXVldWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBBV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgU3RhdGVDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBBV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKEV2ZW50UXVldWUuaXNEaXNwYXRjaFRocmVhZCgpKSB7Ci0JCQl0aGlzLnN0YXRlQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnN0YXRlQ2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpIHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nICNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKSBjYW4gc29tZXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25FdmVudFF1ZXVlKFJ1bm5hYmxlIHIpIHsKLQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihyKTsKLS8vCQl0cnkgewotLy8JCQlFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQocik7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0KLQl9Ci0KLQl2b2lkIHN0YXRlQ2hhbmdlZF8oU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICIpIjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxODZkNWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3Q7Ci0KLWltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLgotICovCi1wdWJsaWMgY2xhc3MgQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgVHJlZUNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlcihUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChFdmVudFF1ZXVlLmlzRGlzcGF0Y2hUaHJlYWQoKSkgewotCQkJdGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCkpIHsKLQkJCXRoaXMubm9kZVJlbW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTm9kZVJlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChFdmVudFF1ZXVlLmlzRGlzcGF0Y2hUaHJlYWQoKSkgewotCQkJdGhpcy50cmVlQ2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKEV2ZW50UXVldWUuaXNEaXNwYXRjaFRocmVhZCgpKSB7Ci0JCQl0aGlzLnRyZWVDaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZFRyZWVDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGROb2RlQWRkZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubm9kZUFkZGVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIGFkZGVkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTm9kZVJlbW92ZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubm9kZVJlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgcmVtb3ZlZCI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZmluYWwgVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnRyZWVDbGVhcmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNsZWFyZWQiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRUcmVlQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy50cmVlQ2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJlZSBjaGFuZ2VkIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBFdmVudFF1ZXVlI2ludm9rZUxhdGVyKFJ1bm5hYmxlKSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyAjaW52b2tlQW5kV2FpdChSdW5uYWJsZSkgY2FuIHNvbWV0aW1lcyBtYWtlIHRoaW5ncwotCSAqIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBub2RlQWRkZWRfKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBub2RlUmVtb3ZlZF8oVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNsZWFyZWRfKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIHRyZWVDaGFuZ2VkXyhUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci50cmVlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICIpIjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNmM4M2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2hhaW5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlTm9kZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogU3ViY2xhc3NlcyBuZWVkIG9ubHkgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqIAotICogI3ZhbHVlKCkKLSAqCSAgICByZXR1cm4gdGhlIHVzZXItZGV0ZXJtaW5lZCAidmFsdWUiIG9mIHRoZSBub2RlLAotICogICAgIGkuZS4gdGhlIG9iamVjdCAid3JhcHBlZCIgYnkgdGhlIG5vZGUKLSAqIAotICogI3NldFZhbHVlKE9iamVjdCkKLSAqICAgICBzZXQgdGhlIHVzZXItZGV0ZXJtaW5lZCAidmFsdWUiIG9mIHRoZSBub2RlLAotICogICAgIGkuZS4gdGhlIG9iamVjdCAid3JhcHBlZCIgYnkgdGhlIG5vZGU7Ci0gKiAgICAgdHlwaWNhbGx5IG9ubHkgb3ZlcnJpZGRlbiBmb3Igbm9kZXMgd2l0aCAicHJpbWl0aXZlIiB2YWx1ZXMKLSAqIAotICogI3BhcmVudCgpCi0gKiAgICAgcmV0dXJuIHRoZSBwYXJlbnQgb2YgdGhlIG5vZGUsIHdoaWNoIHNob3VsZCBiZSBhbm90aGVyCi0gKiAgICAgVHJlZU5vZGVWYWx1ZU1vZGVsCi0gKiAKLSAqICNjaGlsZHJlbk1vZGVsKCkKLSAqICAgICByZXR1cm4gYSBMaXN0VmFsdWVNb2RlbCBmb3IgdGhlIG5vZGUncyBjaGlsZHJlbgotICogCi0gKiAjZW5nYWdlVmFsdWUoKSBhbmQgI2Rpc2VuZ2FnZVZhbHVlKCkKLSAqICAgICBvdmVycmlkZSB0aGVzZSBtZXRob2RzIHRvIGxpc3RlbiB0byB0aGUgbm9kZSdzIHZhbHVlIGlmCi0gKiAgICAgaXQgY2FuIGNoYW5nZSBpbiBhIHdheSB0aGF0IHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gdGhlIHRyZWUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBUcmVlTm9kZVZhbHVlTW9kZWw8VD4KLXsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCS8vIHRoaXMgbW9kZWwgZmlyZXMgKmJvdGgqICJ2YWx1ZSBwcm9wZXJ0eSBjaGFuZ2UiIGFuZCAic3RhdGUgY2hhbmdlIiBldmVudHMuLi4KLS8vCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzcywgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJcmV0dXJuIHN1cGVyLmJ1aWxkQ2hhbmdlU3VwcG9ydCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCBiZSBhZGRpbmcgYm90aCAic3RhdGUgY2hhbmdlIiBhbmQgInZhbHVlIHByb3BlcnR5IGNoYW5nZSIKLQkgKiBsaXN0ZW5lcnMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VWYWx1ZSgpOwotCQl9Ci0JCXN1cGVyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEJlZ2luIGxpc3RlbmluZyB0byB0aGUgbm9kZSdzIHZhbHVlJ3Mgc3RhdGUuIElmIHRoZSBzdGF0ZSBvZiB0aGUgbm9kZSBjaGFuZ2VzCi0JICogaW4gYSB3YXkgdGhhdCBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZSB0cmVlLCBmaXJlIGEgInN0YXRlIGNoYW5nZSIgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5nYWdlVmFsdWUoKTsKLQotCS8qKgotCSAqIEBzZWUgI2FkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG5vZGUncyB2YWx1ZS4KLQkgKiBAc2VlICNlbmdhZ2VWYWx1ZSgpCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlVmFsdWUoKTsKLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVHJlZU5vZGVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGF0aCgpIHsKLQkJTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHBhdGggPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QodGhpcy5iYWNrUGF0aCgpKTsKLQkJcmV0dXJuIHBhdGgudG9BcnJheShuZXcgVHJlZU5vZGVWYWx1ZU1vZGVsW3BhdGguc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgY2xpbWJzIHVwIHRoZSBub2RlJ3MgcGF0aCwKLQkgKiBzdGFydGluZyB3aXRoLCBhbmQgaW5jbHVkaW5nLCB0aGUgbm9kZQotCSAqIGFuZCB1cCB0bywgYW5kIGluY2x1ZGluZywgdGhlIHJvb3Qgbm9kZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBiYWNrUGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4odGhpcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5leHRMaW5rKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBjdXJyZW50TGluaykgewotCQkJCXJldHVybiBjdXJyZW50TGluay5wYXJlbnQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGNoaWxkKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsKCkuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbCgpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2ZDaGlsZChUcmVlTm9kZVZhbHVlTW9kZWw8VD4gY2hpbGQpIHsKLQkJTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5Nb2RlbCgpOwotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChjaGlsZHJlbi5nZXQoaSkgPT0gY2hpbGQpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMZWFmKCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsKCkuc2l6ZSgpID09IDA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogV2UgaW1wbGVtZW50ICNlcXVhbHMoT2JqZWN0KSBzbyB0aGF0IFRyZWVQYXRocyBjb250YWluaW5nIHRoZXNlIG5vZGVzCi0JICogd2lsbCByZXNvbHZlIHByb3Blcmx5IHdoZW4gdGhlIG5vZGVzIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWVzLiBUaGlzIGlzCi0JICogbmVjZXNzYXJ5IGJlY2F1c2Ugbm9kZXMgYXJlIGRyb3BwZWQgYW5kIHJlYnVpbHQgd2lsbHktbmlsbHkgd2hlbiBkZWFsaW5nCi0JICogd2l0aCBhIHNvcnRlZCBsaXN0IG9mIGNoaWxkcmVuOyBhbmQgdGhpcyBhbGxvd3MgdXMgdG8gc2F2ZSBhbmQgcmVzdG9yZQotCSAqIGEgdHJlZSdzIGV4cGFuZGVkIHBhdGhzLiBUaGUgbm9kZXMgaW4gdGhlIGV4cGFuZGVkIHBhdGhzIHRoYXQgYXJlCi0JICogc2F2ZWQgYmVmb3JlIGFueSBtb2RpZmljYXRpb24gKGUuZy4gcmVuYW1pbmcgYSBub2RlKSB3aWxsIGJlIGRpZmZlcmVudAotCSAqIGZyb20gdGhlIG5vZGVzIGluIHRoZSB0cmVlJ3MgcGF0aHMgYWZ0ZXIgdGhlIG1vZGlmaWNhdGlvbiwgaWYgdGhlIG1vZGlmaWNhdGlvbgotCSAqIHJlc3VsdHMgaW4gYSBwb3NzaWJsZSBjaGFuZ2UgaW4gdGhlIG5vZGUgc29ydCBvcmRlci4gIH5ianYKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChvLmdldENsYXNzKCkgIT0gdGhpcy5nZXRDbGFzcygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG90aGVyID0gKEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBvOwotCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2QzM2Q1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBleHRlbnNpb24gb2YgQWJzdHJhY3RNb2RlbCBwcm92aWRlcyBhIGJhc2UgZm9yIGFkZGluZyAKLSAqIGNoYW5nZSBsaXN0ZW5lcnMgKFByb3BlcnR5Q2hhbmdlLCBDb2xsZWN0aW9uQ2hhbmdlLCBMaXN0Q2hhbmdlLCBUcmVlQ2hhbmdlKQotICogdG8gYSBzdWJqZWN0IGFuZCBjb252ZXJ0aW5nIHRoZSBzdWJqZWN0J3MgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBhIHNpbmdsZQotICogc2V0IG9mIGNoYW5nZSBub3RpZmljYXRpb25zIGZvciBhIGNvbW1vbiBhc3BlY3QgKGUuZy4gVkFMVUUpLgotICogCi0gKiBUaGUgYWRhcHRlciB3aWxsIG9ubHkgbGlzdGVuIHRvIHRoZSBzdWJqZWN0IChhbmQgc3ViamVjdCBob2xkZXIpIHdoZW4gdGhlCi0gKiBhZGFwdGVyIGl0c2VsZiBhY3R1YWxseSBoYXMgbGlzdGVuZXJzLiBUaGlzIHdpbGwgYWxsb3cgdGhlIGFkYXB0ZXIgdG8gYmUKLSAqIGdhcmJhZ2UgY29sbGVjdGVkIHdoZW4gYXBwcm9wcmlhdGUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFzcGVjdEFkYXB0ZXI8Uz4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLXsKLQkvKioKLQkgKiBUaGUgc3ViamVjdCB0aGF0IGhvbGRzIHRoZSBhc3BlY3QgYW5kIGZpcmVzCi0JICogY2hhbmdlIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBhc3BlY3QgY2hhbmdlcy4KLQkgKiBXZSBuZWVkIHRvIGhvbGQgb24gdG8gdGhpcyBkaXJlY3RseSBzbyB3ZSBjYW4KLQkgKiBkaXNlbmdhZ2UgaXQgd2hlbiBpdCBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCBTIHN1YmplY3Q7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIHRoYXQgaG9sZHMgdGhlIHN1YmplY3QKLQkgKiB0aGF0IGhvbGRzIHRoZSBhc3BlY3QgYW5kIHByb3ZpZGVzIGNoYW5nZSBub3RpZmljYXRpb24uCi0JICogVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGVyZSBhcmUgYSBudW1iZXIgb2YgQXNwZWN0QWRhcHRlcnMKLQkgKiB0aGF0IGhhdmUgdGhlIHNhbWUgc3ViamVjdCBhbmQgdGhhdCBzdWJqZWN0IGNhbiBjaGFuZ2UuCi0JICogQWxsIHRoZSBBc3BlY3RBZGFwdGVycyBzaG91bGQgc2hhcmUgdGhlIHNhbWUgc3ViamVjdCBob2xkZXIuCi0JICogRm9yIG5vdywgdGhpcyBpcyBjYW4gb25seSBiZSBzZXQgdXBvbiBjb25zdHJ1Y3Rpb24gYW5kIGlzCi0JICogaW1tdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGtlZXBzIHVzIGluIHN5bmNoIHdpdGggdGhlIHN1YmplY3RIb2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc3ViamVjdENoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gQXNwZWN0QWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBBc3BlY3RBZGFwdGVyKFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBBc3BlY3RBZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyLgotCSAqIFRoZSBzdWJqZWN0IGhvbGRlciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHN1YmplY3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyID0gc3ViamVjdEhvbGRlcjsKLQkJdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHRoZSBzdWJqZWN0IGlzIG51bGwgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byBpdAotCQkvLyB0aGlzIHdpbGwgdHlwaWNhbGx5IHJlc3VsdCBpbiBvdXIgdmFsdWUgYmVpbmcgbnVsbAotCQl0aGlzLnN1YmplY3QgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDaGFuZ2VTdXBwb3J0KHRoaXMsIHRoaXMuZ2V0TGlzdGVuZXJDbGFzcygpLCB0aGlzLmdldExpc3RlbmVyQXNwZWN0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBob2xkZXIncyB2YWx1ZSBoYXMgY2hhbmdlZCwga2VlcCBvdXIgc3ViamVjdCBpbiBzeW5jaC4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuc3ViamVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInN1YmplY3QgY2hhbmdlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaGFzIGNoYW5nZWQuIE5vdGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCWJvb2xlYW4gaGFzTGlzdGVuZXJzID0gdGhpcy5oYXNMaXN0ZW5lcnMoKTsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5kaXNlbmdhZ2VTdWJqZWN0KCk7Ci0JCX0KLQkJdGhpcy5zdWJqZWN0ID0gdGhpcy5zdWJqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWlmIChoYXNMaXN0ZW5lcnMpIHsKLQkJCXRoaXMuZW5nYWdlU3ViamVjdCgpOwotCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKG9sZFZhbHVlLCB0aGlzLmdldFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhc3BlY3QncyBjdXJyZW50IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3Mgb2YgbGlzdGVuZXIgdGhhdCBpcyBpbnRlcmVzdGVkIGluIHRoZSBhc3BlY3QgYWRhcHRlcidzCi0JICogY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGFzcGVjdCBhZGFwdGVyJ3MgYXNwZWN0IChlLmcuIFZBTFVFKS4KLQkgKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhc3BlY3QgYWRhcHRlcidzIHNpbmdsZSBhc3BlY3QsIG5vdCB0aGUKLQkgKiBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgYXNwZWN0IHRoZSBhc3BlY3QgYWRhcHRlciBpcyBhZGFwdGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0ZW5lcnMgZm9yIHRoZSBhc3BlY3QuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFzTGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzIGZvciB0aGUgYXNwZWN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc0xpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFRoZSBhc3BlY3QgaGFzIGNoYW5nZWQsIG5vdGlmeSBsaXN0ZW5lcnMgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKTsKLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3QoKSB7Ci0JCS8vIGNoZWNrIGZvciBub3RoaW5nIHRvIGxpc3RlbiB0bwotCQlpZiAodGhpcy5zdWJqZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuZW5nYWdlU3ViamVjdF8oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGlzIG5vdCBudWxsIC0gYWRkIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VTdWJqZWN0XygpOwotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdCgpIHsKLQkJLy8gY2hlY2sgZm9yIG5vdGhpbmcgdG8gbGlzdGVuIHRvCi0JCWlmICh0aGlzLnN1YmplY3QgIT0gbnVsbCkgewotCQkJdGhpcy5kaXNlbmdhZ2VTdWJqZWN0XygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaXMgbm90IG51bGwgLSByZW1vdmUgb3VyIGxpc3RlbmVyLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0SG9sZGVyKCkgewotCQl0aGlzLnN1YmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIHN1YmplY3QgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHN1YmplY3QgaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLnN1YmplY3QgPSB0aGlzLnN1YmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0SG9sZGVyKCkgewotCQl0aGlzLnN1YmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSBzdWJqZWN0IHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gaXRzIGhvbGRlcgotCQl0aGlzLnN1YmplY3QgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVscygpIHsKLQkJdGhpcy5lbmdhZ2VTdWJqZWN0SG9sZGVyKCk7Ci0JCXRoaXMuZW5nYWdlU3ViamVjdCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVscygpIHsKLQkJdGhpcy5kaXNlbmdhZ2VTdWJqZWN0KCk7Ci0JCXRoaXMuZGlzZW5nYWdlU3ViamVjdEhvbGRlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsb2NhbCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgY2hhbmdlIHN1cHBvcnQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBhc3BlY3QgYWRhcHRlcidzCi0JICogbW9kZWxzICh0aGUgc3ViamVjdCBob2xkZXIgYW5kIHRoZSBzdWJqZWN0IGl0c2VsZikgd2hlbiB0aGUgZmlyc3QKLQkgKiByZWxldmFudCBsaXN0ZW5lciBpcyBhZGRlZC4KLQkgKiBDb252ZXJzZWx5LCBzdG9wIGxpc3RlbmluZyB0byB0aGUgYXNwZWN0IGFkYXB0ZXIncyBtb2RlbHMgd2hlbiB0aGUKLQkgKiBsYXN0IHJlbGV2YW50IGxpc3RlbmVyIGlzIHJlbW92ZWQuCi0JICogQSByZWxldmFudCBsaXN0ZW5lciBpcyBhIGxpc3RlbmVyIG9mIHRoZSByZWxldmFudCB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBMb2NhbENoYW5nZVN1cHBvcnQgZXh0ZW5kcyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHVibGljIExvY2FsQ2hhbmdlU3VwcG9ydChBc3BlY3RBZGFwdGVyPFM+IHNvdXJjZSwgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQkJc3VwZXIoc291cmNlLCBsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQkJfQotCi0JCXByb3RlY3RlZCBib29sZWFuIGxpc3RlbmVySXNSZWxldmFudChDbGFzczw/IGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IGxDbGFzcykgewotCQkJcmV0dXJuIGxDbGFzcyA9PSB0aGlzLmxpc3RlbmVyQ2xhc3M7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb1JlbGV2YW50TGlzdGVuZXJzKENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbENsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0ZW5lcklzUmVsZXZhbnQobENsYXNzKQotCQkJCQkJJiYgdGhpcy5oYXNOb0xpc3RlbmVycyhsQ2xhc3MpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gbGlzdGVuZXJJc1JlbGV2YW50KENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gbENsYXNzLCBTdHJpbmcgbGlzdGVuZXJBc3BlY3ROYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0ZW5lcklzUmVsZXZhbnQobENsYXNzKQotCQkJCQkJJiYgKGxpc3RlbmVyQXNwZWN0TmFtZSA9PSBBc3BlY3RBZGFwdGVyLnRoaXMuZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9SZWxldmFudExpc3RlbmVycyhDbGFzczw/IGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IGxDbGFzcywgU3RyaW5nIGxpc3RlbmVyQXNwZWN0TmFtZSkgewotCQkJcmV0dXJuIHRoaXMubGlzdGVuZXJJc1JlbGV2YW50KGxDbGFzcywgbGlzdGVuZXJBc3BlY3ROYW1lKQotCQkJCQkJJiYgdGhpcy5oYXNOb0xpc3RlbmVycyhsQ2xhc3MsIGxpc3RlbmVyQXNwZWN0TmFtZSk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIDxUIGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IHZvaWQgYWRkTGlzdGVuZXIoQ2xhc3M8VD4gbENsYXNzLCBUIGxpc3RlbmVyKSB7Ci0JCQlpZiAodGhpcy5oYXNOb1JlbGV2YW50TGlzdGVuZXJzKGxDbGFzcykpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuZW5nYWdlTW9kZWxzKCk7Ci0JCQl9Ci0JCQlzdXBlci5hZGRMaXN0ZW5lcihsQ2xhc3MsIGxpc3RlbmVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihTdHJpbmcgbGlzdGVuZXJBc3BlY3ROYW1lLCBDbGFzczxUPiBsQ2xhc3MsIFQgbGlzdGVuZXIpIHsKLQkJCWlmICh0aGlzLmhhc05vUmVsZXZhbnRMaXN0ZW5lcnMobENsYXNzLCBsaXN0ZW5lckFzcGVjdE5hbWUpKSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLmVuZ2FnZU1vZGVscygpOwotCQkJfQotCQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXJBc3BlY3ROYW1lLCBsQ2xhc3MsIGxpc3RlbmVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gdm9pZCByZW1vdmVMaXN0ZW5lcihDbGFzczxUPiBsQ2xhc3MsIFQgbGlzdGVuZXIpIHsKLQkJCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxDbGFzcywgbGlzdGVuZXIpOwotCQkJaWYgKHRoaXMuaGFzTm9SZWxldmFudExpc3RlbmVycyhsQ2xhc3MpKSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLmRpc2VuZ2FnZU1vZGVscygpOwotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCA8VCBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiB2b2lkIHJlbW92ZUxpc3RlbmVyKFN0cmluZyBsaXN0ZW5lckFzcGVjdE5hbWUsIENsYXNzPFQ+IGxDbGFzcywgVCBsaXN0ZW5lcikgewotCQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXJBc3BlY3ROYW1lLCBsQ2xhc3MsIGxpc3RlbmVyKTsKLQkJCWlmICh0aGlzLmhhc05vUmVsZXZhbnRMaXN0ZW5lcnMobENsYXNzLCBsaXN0ZW5lckFzcGVjdE5hbWUpKSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLmRpc2VuZ2FnZU1vZGVscygpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg1Mzc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIHZhbHVlIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBjb252ZXJ0Ci0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBjaGFuZ2UKLSAqIG5vdGlmaWNhdGlvbnMuCi0gKiAKLSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZToKLSAqIC0gI2J1aWxkVmFsdWUoKQotICogICAgIHRvIHJldHVybiB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotICogICAgIGN1cnJlbnQgbW9kZWwgdmFsdWUKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0JLyoqCi0JICogQ2FjaGUgdGhlIGN1cnJlbnQgdmFsdWUgc28gd2UgY2FuIHBhc3MgYW4gIm9sZCB2YWx1ZSIgd2hlbgotCSAqIHdlIGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICogV2UgbmVlZCB0aGlzIGJlY2F1c2UgdGhlIHZhbHVlIG1heSBiZSBjYWxjdWxhdGVkIGFuZCB3ZSBtYXkKLQkgKiBub3QgYWJsZSB0byBkZXJpdmUgdGhlICJvbGQgdmFsdWUiIGZyb20gdGhlIGNvbGxlY3Rpb24KLQkgKiBjaGFuZ2UgZXZlbnQgZmlyZWQgYnkgdGhlIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIFQgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIG91ciB2YWx1ZSBpcyBudWxsIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyCi0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIFZBTFVFKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2FjaGVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocHJvcGVydHlOYW1lID09IFZBTFVFICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBWQUxVRSAmJiB0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbGlzdGVuZXJzIGZvciB0aGUgYXNwZWN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbGlzdGVuZXJzIGZvciB0aGUgYXNwZWN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc0xpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsIGFuZCBidWlsZCB0aGUgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZW5nYWdlTW9kZWxfKCk7Ci0JCS8vIHN5bmNoIG91ciB2YWx1ZSAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiwKLQkJLy8gc2luY2UgdGhlIGNvbGxlY3Rpb24ncyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZU1vZGVsXygpOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotCSAqIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHdyYXBwZWQgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFQgYnVpbGRWYWx1ZSgpOwotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsIGFuZCBjbGVhciB0aGUgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlTW9kZWxfKCk7Ci0JCS8vIGNsZWFyIG91dCBvdXIgdmFsdWUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbgotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlTW9kZWxfKCk7Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBtb2RlbCBjaGFuZ2VkIGluIHNvbWUgZmFzaGlvbi4KLQkgKiBSZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIG5vdGlmeSBhbnkgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZCgpIHsKLQkJT2JqZWN0IG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGQsIHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODFiZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIEJ1ZmZlcmVkUHJvcGVydHlWYWx1ZU1vZGVsIGlzIHVzZWQgdG8gaG9sZCBhIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSB2YWx1ZQotICogaW4gYW5vdGhlciBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCAodGhlICJ3cmFwcGVkIiB2YWx1ZSBob2xkZXIpLiBUaGUgYXBwbGljYXRpb24KLSAqIGNhbiBtb2RpZnkgdGhpcyB0ZW1wb3JhcnkgY29weSwgYWQgbmF1c2VhbTsgYnV0IHRoZSB0ZW1wb3JhcnkgY29weSBpcyBvbmx5Ci0gKiBwYXNzZWQgdGhyb3VnaCB0byB0aGUgIndyYXBwZWQiIHZhbHVlIGhvbGRlciB3aGVuIHRoZSB0cmlnZ2VyICJhY2NlcHRzIiB0aGUKLSAqIGJ1ZmZlcmVkIHZhbHVlLiBBbHRlcm5hdGl2ZWx5LCB0aGUgYXBwbGljYXRpb24gY2FuICJyZXNldCIgdGhlIGJ1ZmZlcmVkIHZhbHVlCi0gKiB0byB0aGUgb3JpZ2luYWwsICJ3cmFwcGVkIiB2YWx1ZS4KLSAqIAotICogVGhlIHRyaWdnZXIgaXMgYW5vdGhlciB2YWx1ZSBtb2RlbCB0aGF0IGhvbGRzIGEgQm9vbGVhbiBhbmQgdGhlIGFwcGxpY2F0aW9uCi0gKiBjaGFuZ2VzIHRoZSB0cmlnZ2VyJ3MgdmFsdWUgdG8gdHJ1ZSBvbiAiYWNjZXB0IiwgZmFsc2Ugb24gInJlc2V0Ii4gVHlwaWNhbGx5LAotICogaW4gYSBkaWFsb2c6Ci0gKiAJLSBwcmVzc2luZyB0aGUgT0sgYnV0dG9uIHdpbGwgdHJpZ2dlciBhbiAiYWNjZXB0IiBhbmQgY2xvc2UgdGhlIGRpYWxvZwotICogCS0gcHJlc3NpbmcgdGhlIENhbmNlbCBidXR0b24gd2lsbCBzaW1wbHkgY2xvc2UgdGhlIGRpYWxvZywKLSAqIAkJZHJvcHBpbmcgdGhlICJidWZmZXJlZCIgdmFsdWVzIGludG8gdGhlIGJpdCBidWNrZXQKLSAqIAktIHByZXNzaW5nIHRoZSBBcHBseSBidXR0b24gd2lsbCB0cmlnZ2VyIGFuICJhY2NlcHQiIGFuZCBsZWF2ZSB0aGUgZGlhbG9nIG9wZW4KLSAqIAktIHByZXNzaW5nIHRoZSBSZXN0b3JlIGJ1dHRvbiB3aWxsIHRyaWdnZXIgYSAicmVzZXQiIGFuZCBsZWF2ZSB0aGUgZGlhbG9nIG9wZW4KLSAqIAotICogQSBudW1iZXIgb2YgYnVmZmVyZWQgcHJvcGVydHkgdmFsdWUgbW9kZWxzIGNhbiB3cmFwIGFub3RoZXIgc2V0IG9mCi0gKiBwcm9wZXJ0eSBhc3BlY3QgYWRhcHRlcnMgdGhhdCBhZGFwdCB0aGUgdmFyaW91cyBhc3BlY3RzIG9mIGEgc2luZ2xlCi0gKiBkb21haW4gbW9kZWwuIEFsbCB0aGUgYnVmZmVyZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMgY2FuIGJlIGhvb2tlZCB0byB0aGUKLSAqIHNhbWUgdHJpZ2dlciwgYW5kIHRoYXQgdHJpZ2dlciBpcyBjb250cm9sbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgdHlwaWNhbGx5Ci0gKiB2aWEgdGhlIE9LIGJ1dHRvbiBpbiBhIGRpYWxvZy4KLSAqIAotICogQHNlZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8VD4KLQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQkvKioKLQkgKiBXZSBjYWNoZSB0aGUgdmFsdWUgaGVyZSB1bnRpbCBpdCBpcyBhY2NlcHRlZCBhbmQgcGFzc2VkCi0JICogdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIuCi0JICovCi0JcHJvdGVjdGVkIFQgYnVmZmVyZWRWYWx1ZTsKLQotCS8qKgotCSAqIFRoaXMgaXMgc2V0IHRvIHRydWUgd2hlbiB3ZSBhcmUgImFjY2VwdGluZyIgdGhlIGJ1ZmZlcmVkIHZhbHVlCi0JICogYW5kIHBhc3NpbmcgaXQgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIuIFRoaXMgYWxsb3dzCi0JICogdXMgdG8gaWdub3JlIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgZmlyZWQgYnkgdGhlIHdyYXBwZWQKLQkgKiB2YWx1ZSBob2xkZXIuCi0JICogKFdlIGNhbid0IHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlciwgYmVjYXVzZQotCSAqIGlmIHdlIGFyZSB0aGUgb25seSBsaXN0ZW5lciB0aGF0IGNvdWxkICJkZWFjdGl2YXRlIiB0aGUgd3JhcHBlZAotCSAqIHZhbHVlIGhvbGRlci4pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0aW5nOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgdHJpZ2dlciB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBidWZmZXJlZCB2YWx1ZQotCSAqIHNob3VsZCBiZSBhY2NlcHRlZCBvciByZXNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRyaWdnZXJIb2xkZXI7Ci0KLQkvKiogVGhpcyBsaXN0ZW5zIHRvIHRoZSB0cmlnZ2VyIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0cmlnZ2VyQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgb3VyIGJ1ZmZlcmVkIHZhbHVlIGhhcyBiZWVuIGFzc2lnbmVkCi0JICogYSB2YWx1ZSBhbmQgaXMgcG9zc2libHkgb3V0IG9mIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVmZmVyaW5nOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBidWZmZXJlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCB0cmlnZ2VyIGhvbGRlci4KLQkgKi8KLQlwdWJsaWMgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRyaWdnZXJIb2xkZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQlpZiAodHJpZ2dlckhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnRyaWdnZXJIb2xkZXIgPSB0cmlnZ2VySG9sZGVyOwotCQl0aGlzLmJ1ZmZlcmVkVmFsdWUgPSBudWxsOwotCQl0aGlzLmJ1ZmZlcmluZyA9IGZhbHNlOwotCQl0aGlzLmFjY2VwdGluZyA9IGZhbHNlOwotCQl0aGlzLnRyaWdnZXJDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmlnZ2VyQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJpZ2dlckNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwudGhpcy50cmlnZ2VyQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmlnZ2VyIGNoYW5nZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHdlIGFyZSBjdXJyZW50bHkgImJ1ZmZlcmluZyIgYSB2YWx1ZSwgcmV0dXJuIHRoYXQ7Ci0JICogb3RoZXJ3aXNlLCByZXR1cm4gdGhlIHdyYXBwZWQgdmFsdWUuCi0JICovCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1ZmZlcmluZyA/IHRoaXMuYnVmZmVyZWRWYWx1ZSA6IHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NpZ24gdGhlIG5ldyB2YWx1ZSB0byBvdXIgImJ1ZmZlcmVkIiB2YWx1ZS4KLQkgKiBJdCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIKLQkgKiB3aGVuIHRoZSB0cmlnZ2VyIGlzICJhY2NlcHRlZCIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQlPYmplY3Qgb2xkID0gdGhpcy5nZXRWYWx1ZSgpOwotCQl0aGlzLmJ1ZmZlcmVkVmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5idWZmZXJpbmcgPSB0cnVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdGhpcy5idWZmZXJlZFZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlciBleHRlbnNpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIGV4dGVuZCB0byBlbmdhZ2UgdGhlIHRyaWdnZXIgaG9sZGVyIGFsc28KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZUhvbGRlcigpIHsKLQkJc3VwZXIuZW5nYWdlVmFsdWVIb2xkZXIoKTsKLQkJdGhpcy50cmlnZ2VySG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMudHJpZ2dlckNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBleHRlbmQgdG8gZGlzZW5nYWdlIHRoZSB0cmlnZ2VyIGhvbGRlciBhbHNvCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVIb2xkZXIoKSB7Ci0JCXRoaXMudHJpZ2dlckhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFZBTFVFLCB0aGlzLnRyaWdnZXJDaGFuZ2VMaXN0ZW5lcik7Ci0JCXN1cGVyLmRpc2VuZ2FnZVZhbHVlSG9sZGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHdlIGRvIG5vdCB5ZXQgaGF2ZSBhICJidWZmZXJlZCIgdmFsdWUsIHNpbXBseSBwcm9wYWdhdGUgdGhlCi0JICogY2hhbmdlIG5vdGlmaWNhdGlvbiB3aXRoIHRoZSBidWZmZXJlZCBtb2RlbCBhcyB0aGUgc291cmNlLgotCSAqIElmIHdlIGRvIGhhdmUgYSAiYnVmZmVyZWQiIHZhbHVlLCBkbyBub3RoaW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmFjY2VwdGluZykgewotCQkJLy8gaWYgd2UgYXJlIGN1cnJlbnRseSAiYWNjZXB0aW5nIiB0aGUgdmFsdWUsIGlnbm9yZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucywKLQkJCS8vIHNpbmNlIHdlIGNhdXNlZCB0aGVtIGFuZCBvdXIgb3duIGxpc3RlbmVycyBhcmUgYWxyZWFkeSBhd2FyZSBvZiB0aGUgY2hhbmdlCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMuYnVmZmVyaW5nKSB7Ci0JCQl0aGlzLmhhbmRsZUNoYW5nZUNvbmZsaWN0KGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcykpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIGlmIHdlIGhhdmUgYSAiYnVmZmVyZWQiIHZhbHVlIGFuZCB0aGUgIndyYXBwZWQiIHZhbHVlIGNoYW5nZXMsCi0JICogd2Ugc2ltcGx5IGlnbm9yZSB0aGUgbmV3ICJ3cmFwcGVkIiB2YWx1ZSBhbmQgc2ltcGx5IG92ZXJsYXkgaXQgd2l0aCB0aGUKLQkgKiAiYnVmZmVyZWQiIHZhbHVlIGlmIGl0IGlzICJhY2NlcHRlZCIuICgiTGFzdCBPbmUgSW4gV2lucyIgY29uY3VycmVuY3kgbW9kZWwpCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoYXQgYmVoYXZpb3Igd2l0aCBhCi0JICogZGlmZmVyZW50IGNvbmN1cnJlbmN5IG1vZGVsLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGRyb3AgdGhlICJidWZmZXJlZCIgdmFsdWUKLQkgKiBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBuZXcgIndyYXBwZWQiIHZhbHVlLCBvciB5b3UgY291bGQgdGhyb3cgYW4KLQkgKiBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlQ29uZmxpY3QoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyB0aGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCQotCS8qKgotCSAqIFRoZSB0cmlnZ2VyIGNoYW5nZWQ6Ci0JICogSWYgaXQgaXMgbm93IHRydWUsICJhY2NlcHQiIHRoZSBidWZmZXJlZCB2YWx1ZSBhbmQgZm9yd2FyZAotCSAqIGl0IHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlci4KLQkgKiBJZiBpdCBpcyBub3cgZmFsc2UsICJyZXNldCIgdGhlIGJ1ZmZlcmVkIHZhbHVlIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmlnZ2VyQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmJ1ZmZlcmluZykgewotCQkJLy8gaWYgbm90aGluZyBoYXMgYmVlbiAiYnVmZmVyZWQiLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nOgotCQkJLy8gbm90aGluZyBuZWVkcyB0byBiZSBwYXNzZWQgdGhyb3VnaDsgbm90aGluZyBuZWVkcyB0byBiZSByZXNldDsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJLy8gc2V0IHRoZSBhY2NlcHRpbmcgZmxhZyBzbyB3ZSBpZ25vcmUgYW55IGV2ZW50cwotCQkJLy8gZmlyZWQgYnkgdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyCi0JCQl0aGlzLmFjY2VwdGluZyA9IHRydWU7Ci0JCQl0aGlzLnZhbHVlSG9sZGVyKCkuc2V0VmFsdWUodGhpcy5idWZmZXJlZFZhbHVlKTsKLQkJCXRoaXMuYnVmZmVyZWRWYWx1ZSA9IG51bGw7Ci0JCQl0aGlzLmJ1ZmZlcmluZyA9IGZhbHNlOwotCQkJLy8gY2xlYXIgdGhlIGZsYWcgb25jZSB0aGUgImFjY2VwdCIgaXMgY29tcGxldGUKLQkJCXRoaXMuYWNjZXB0aW5nID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3RpZnkgb3VyIGxpc3RlbmVycyB0aGF0IG91ciB2YWx1ZSBoYXMgYmVlbiByZXNldAotCQkJT2JqZWN0IG9sZCA9IHRoaXMuYnVmZmVyZWRWYWx1ZTsKLQkJCXRoaXMuYnVmZmVyZWRWYWx1ZSA9IG51bGw7Ci0JCQl0aGlzLmJ1ZmZlcmluZyA9IGZhbHNlOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGQsIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBidWZmZXJlZCBtb2RlbCBpcyBjdXJyZW50bHkgImJ1ZmZlcmluZyIKLQkgKiBhIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQnVmZmVyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5idWZmZXJpbmc7Ci0JfQotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9yIGFjY2VwdHMgb25seSBhIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+LgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPikgdGhpcy52YWx1ZUhvbGRlcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJpZ2dlciBpcyBhIHNwZWNpYWwgcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBvbmx5IG1haW50YWlucyBpdHMKLQkgKiB2YWx1ZSAob2YgdHJ1ZSBvciBmYWxzZSkgZHVyaW5nIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGNhdXNlZCBieQotCSAqIHRoZSAjc2V0VmFsdWUoT2JqZWN0KSBtZXRob2QuIEluIG90aGVyIHdvcmRzLCBhIFRyaWdnZXIgb2JqZWN0Ci0JICogb25seSBoYXMgYSB2YWxpZCB2YWx1ZSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRyaWdnZXIgZXh0ZW5kcyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gewotCi0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdCBhIHRyaWdnZXIgd2l0aCBhIG51bGwgdmFsdWUuCi0JCSAqLwotCQlwdWJsaWMgVHJpZ2dlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIEV4dGVuZCBzbyB0aGF0IHRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGludm9rZWQgZHVyaW5nCi0JCSAqIGNoYW5nZSBub3RpZmljYXRpb24gdHJpZ2dlcmVkIGJ5ICNzZXRWYWx1ZShPYmplY3QpLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBCb29sZWFuIGdldFZhbHVlKCkgewotCQkJaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBtZXRob2QgVHJpZ2dlci52YWx1ZSgpIG1heSBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbi4iKTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEV4dGVuZCB0byByZXNldCB0aGUgdmFsdWUgdG8gbnVsbCBvbmNlIGFsbCB0aGUKLQkJICogbGlzdGVuZXJzIGhhdmUgYmVlbiBub3RpZmllZC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQlzdXBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQl0aGlzLnZhbHVlID0gbnVsbDsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCQkvKioKLQkJICogU2V0IHRoZSB0cmlnZ2VyJ3MgdmFsdWU6Ci0JCSAqIAktIHRydWUgaW5kaWNhdGVzICJhY2NlcHQiCi0JCSAqIAktIGZhbHNlIGluZGljYXRlcyAicmVzZXQiCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShib29sZWFuIHZhbHVlKSB7Ci0JCQl0aGlzLnNldFZhbHVlKEJvb2xlYW4udmFsdWVPZih2YWx1ZSkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgdHJpZ2dlcidzIHZhbHVlOgotCQkgKiAJLSB0cnVlIGluZGljYXRlcyAiYWNjZXB0IgotCQkgKiAJLSBmYWxzZSBpbmRpY2F0ZXMgInJlc2V0IgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBY2NlcHQgdGhlIHRyaWdnZXIgKGkuZS4gc2V0IGl0cyB2YWx1ZSB0byB0cnVlKS4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGFjY2VwdCgpIHsKLQkJCXRoaXMuc2V0VmFsdWUodHJ1ZSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIHRyaWdnZXIgaGFzIGJlZW4gYWNjZXB0ZWQKLQkJICogKGkuZS4gaXRzIHZhbHVlIHdhcyBjaGFuZ2VkIHRvIHRydWUpLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNBY2NlcHRlZCgpIHsKLQkJCXJldHVybiB0aGlzLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlc2V0IHRoZSB0cmlnZ2VyIChpLmUuIHNldCBpdHMgdmFsdWUgdG8gZmFsc2UpLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCQl0aGlzLnNldFZhbHVlKGZhbHNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHJpZ2dlciBoYXMgYmVlbiByZXNldAotCQkgKiAoaS5lLiBpdHMgdmFsdWUgd2FzIGNoYW5nZWQgdG8gZmFsc2UpLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNSZXNldCgpIHsKLQkJCXJldHVybiAhIHRoaXMuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1YzI3NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBleHRlbnNpb24gb2YgQXNwZWN0QWRhcHRlciBwcm92aWRlcyBDb2xsZWN0aW9uQ2hhbmdlIHN1cHBvcnQuCi0gKiBUaGlzIGFsbG93cyB1cyB0byBjb252ZXJ0IGEgc2V0IG9mIG9uZSBvciBtb3JlIGNvbGxlY3Rpb25zIGludG8KLSAqIGEgc2luZ2xlIGNvbGxlY3Rpb24sIFZBTFVFUy4KLSAqIAotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gKiAjaXRlcmF0b3JfKCkKLSAqICAgICBhdCB0aGUgdmVyeSBtaW5pbXVtLCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlCi0gKiAgICAgc3ViamVjdCdzIGNvbGxlY3Rpb24gYXNwZWN0OyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICAjaXRlcmF0b3IoKSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogI3NpemVfKCkKLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlOyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICAjc2l6ZSgpIGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiAjaXRlcmF0b3IoKQotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGFuIGVtcHR5IGl0ZXJhdG9yIHdoZW4gdGhlCi0gKiAgICAgc3ViamVjdCBpcyBudWxsIGlzIHVuYWNjZXB0YWJsZQotICogI3NpemUoKQotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGEgemVybyB3aGVuIHRoZQotICogICAgIHN1YmplY3QgaXMgbnVsbCBpcyB1bmFjY2VwdGFibGUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPFMgZXh0ZW5kcyBNb2RlbCwgRT4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8Uz4KLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QncyBjb2xsZWN0aW9ucyB0aGF0IHdlIHVzZSBmb3IgdGhlIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBjb2xsZWN0aW9uTmFtZXM7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfQ09MTEVDVElPTl9OQU1FUyA9IG5ldyBTdHJpbmdbMF07Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdHJpbmdbXSB7Y29sbGVjdGlvbk5hbWV9LCBzdWJqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIGNvbGxlY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihTdHJpbmdbXSBjb2xsZWN0aW9uTmFtZXMsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCksIGNvbGxlY3Rpb25OYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdCBob2xkZXIKLQkgKiBhbmQgY29sbGVjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlciwgU3RyaW5nLi4uIGNvbGxlY3Rpb25OYW1lcykgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyKTsKLQkJdGhpcy5jb2xsZWN0aW9uTmFtZXMgPSBjb2xsZWN0aW9uTmFtZXM7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIGNvbGxlY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIENvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uTmFtZXMpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBjb2xsZWN0aW9uTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW2NvbGxlY3Rpb25OYW1lcy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIgZm9yIGFuICJ1bmNoYW5naW5nIiBjb2xsZWN0aW9uIGluCi0JICogdGhlIHNwZWNpZmllZCBzdWJqZWN0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYSBjb2xsZWN0aW9uIGFzcGVjdCB0aGF0IGRvZXMgbm90Ci0JICogY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIgc3ViamVjdDsgYnV0IHRoZSBzdWJqZWN0IHdpbGwgY2hhbmdlLCByZXN1bHRpbmcgaW4KLQkgKiBhIG5ldyBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBFTVBUWV9DT0xMRUNUSU9OX05BTUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdCBoYXMgY2hhbmdlZCwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUUgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzCi0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uTmFtZXMpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPEU+aW5zdGFuY2UoKSA6IHRoaXMuaXRlcmF0b3JfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGNvbGxlY3Rpb24gYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNpdGVyYXRvcigpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yXygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IDAgOiB0aGlzLnNpemVfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI3NpemUoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLml0ZXJhdG9yKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIFZBTFVFUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0gICAgCWZvciAoU3RyaW5nIGNvbGxlY3Rpb25OYW1lIDogdGhpcy5jb2xsZWN0aW9uTmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNvbGxlY3Rpb25OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCkgewotCQkJCXNiLmFwcGVuZCgiLCAiKTsKLQkJCX0KLQkJCXNiLmFwcGVuZCh0aGlzLmNvbGxlY3Rpb25OYW1lc1tpXSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcywgVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIFZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChWQUxVRVMpOyAgLy8gbm90aGluZyBmcm9tIG9yaWdpbmFsIGV2ZW50IHRvIGZvcndhcmQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTKTsgIC8vIG5vdGhpbmcgZnJvbSBvcmlnaW5hbCBldmVudCB0byBmb3J3YXJkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJhYzMxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSBDb2xsZWN0aW9uVmFsdWVNb2RlbCBiZWhhdmUgbGlrZQotICogYSByZWFkLW9ubHkgTGlzdFZhbHVlTW9kZWwsIHNvcnRhLgotICogCi0gKiBUbyBtYWludGFpbiBhIHJlYXNvbmFibHkgY29uc2lzdGVudCBhcHBlYXJhbmNlIHRvIGNsaWVudCBjb2RlLCB3ZQotICoga2VlcCBhbiBpbnRlcm5hbCBsaXN0IHNvbWV3aGF0IGluIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQgY29sbGVjdGlvbi4KLSAqIAotICogTkI6IFNpbmNlIHdlIG9ubHkgbGlzdGVuIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gd2hlbiB3ZSBoYXZlCi0gKiBsaXN0ZW5lcnMgb3Vyc2VsdmVzIGFuZCB3ZSBjYW4gb25seSBzdGF5IGluIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQKLSAqIGNvbGxlY3Rpb24gd2hpbGUgd2UgYXJlIGxpc3RlbmluZyB0byBpdCwgcmVzdWx0cyB0byB2YXJpb3VzIG1ldGhvZHMKLSAqIChlLmcuICNzaXplKCksIGdldEl0ZW0oaW50KSkgd2lsbCBiZSB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50IG9iamVjdHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbnkgZXZlbnRzIGZpcmVkIGJ5IHRoZSBjb2xsZWN0aW9uIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIE91ciBpbnRlcm5hbCBsaXN0LCB3aGljaCBob2xkcyB0aGUgc2FtZSBlbGVtZW50cyBhcwotCSAqIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24sIGJ1dCBrZWVwcyB0aGVtIGluIG9yZGVyLgotCSAqLwotCS8vIHdlIGRlY2xhcmUgdGhpcyBhbiBBcnJheUxpc3Qgc28gd2UgY2FuIHVzZSAjY2xvbmUoKSBhbmQgI2Vuc3VyZUNhcGFjaXR5KGludCkKLQlwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PEU+IGxpc3Q7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBDb2xsZWN0aW9uVmFsdWVNb2RlbC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAoY29sbGVjdGlvbkhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBjb2xsZWN0aW9uSG9sZGVyOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0ID0gbmV3IEFycmF5TGlzdDxFPigpOwotCQkvLyBwb3N0cG9uZSBidWlsZGluZyB0aGUgbGlzdCBhbmQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24KLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzcywgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaGFzIGNoYW5nZWQsIGZvcndhcmQgYW4gZXF1aXZhbGVudAotCSAqIGxpc3QgY2hhbmdlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdCk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4dGVuZCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZExpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdE5hbWUgPT0gTElTVF9WQUxVRVMgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKTsKLQkJaWYgKGxpc3ROYW1lID09IExJU1RfVkFMVUVTICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgaXRlbSwgdXNpbmcgb2JqZWN0Ci0JICogaWRlbnRpdHkgaW5zdGVhZCBvZiBlcXVhbGl0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGxhc3RJZGVudGl0eUluZGV4T2YoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGFzdElkZW50aXR5SW5kZXhPZihvLCB0aGlzLmxpc3Quc2l6ZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsYXN0IGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgaXRlbSwgc3RhcnRpbmcganVzdCBiZWZvcmUgdGhlCi0JICogdGhlIHNwZWNpZmllZCBlbmRwb2ludCwgYW5kIHVzaW5nIG9iamVjdCBpZGVudGl0eSBpbnN0ZWFkIG9mIGVxdWFsaXR5LgotCSAqLwotCXByb3RlY3RlZCBpbnQgbGFzdElkZW50aXR5SW5kZXhPZihPYmplY3QgbywgaW50IGVuZCkgewotCQlmb3IgKGludCBpID0gZW5kOyBpLS0gPiAwOyApIHsKLQkJCWlmICh0aGlzLmxpc3QuZ2V0KGkpID09IG8pIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZExpc3QoKSB7Ci0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBzdHJlYW0gPSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKTsKLQkJLy8gaWYgdGhlIG5ldyBjb2xsZWN0aW9uIGlzIGVtcHR5LCBkbyBub3RoaW5nCi0JCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLmxpc3QuZW5zdXJlQ2FwYWNpdHkodGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJCXRoaXMubGlzdC5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCQl0aGlzLnBvc3RCdWlsZExpc3QoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFuaXB1bGF0ZSB0aGUgaW50ZXJuYWwgbGlzdCBiZWZvcmUKLQkgKiBzZW5kaW5nIG91dCBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvc3RCdWlsZExpc3QoKSB7Ci0JCS8vIHRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuLi4KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIGxpc3QgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLmJ1aWxkTGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCQkvLyBjbGVhciBvdXQgdGhlIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KHRoaXMuaW5kZXhUb0FkZEl0ZW1zKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuaXRlbXMoZSkpLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBpbmRleFRvQWRkSXRlbXMoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3Quc2l6ZSgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYXRvcjxFPiBpdGVtcyhDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQlyZXR1cm4gKEl0ZXJhdG9yPEU+KSBlLml0ZW1zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCS8vIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBpdGVtcyBpbmRpdmlkdWFsbHksCi0JCS8vIHNpbmNlIHRoZXkgYXJlIHByb2JhYmx5IG5vdCBpbiBzZXF1ZW5jZQotCQlmb3IgKEl0ZXJhdG9yPEU+IHN0cmVhbSA9IHRoaXMuaXRlbXMoZSk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QodGhpcy5sYXN0SWRlbnRpdHlJbmRleE9mKHN0cmVhbS5uZXh0KCkpLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuY2xlYXJMaXN0KHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQkKLQkvKioKLQkgKiBzeW5jaHJvbml6ZSBvdXIgaW50ZXJuYWwgbGlzdCB3aXRoIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJLy8gcHV0IGluIGVtcHR5IGNoZWNrIHNvIHdlIGRvbid0IGZpcmUgZXZlbnRzIHVubmVjZXNzYXJpbHkKLQkJaWYgKCAhIHRoaXMubGlzdC5pc0VtcHR5KCkpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJQXJyYXlMaXN0PEU+IHJlbW92ZWRJdGVtcyA9IChBcnJheUxpc3Q8RT4pIHRoaXMubGlzdC5jbG9uZSgpOwotCQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoTElTVF9WQUxVRVMsIDAsIHJlbW92ZWRJdGVtcyk7Ci0JCX0KLQotCQl0aGlzLmJ1aWxkTGlzdCgpOwotCQkvLyBwdXQgaW4gZW1wdHkgY2hlY2sgc28gd2UgZG9uJ3QgZmlyZSBldmVudHMgdW5uZWNlc3NhcmlseQotCQlpZiAoICEgdGhpcy5saXN0LmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX1ZBTFVFUywgMCwgdGhpcy5saXN0KTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjhmZjcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIGNvbnZlcnQKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZQotICogbm90aWZpY2F0aW9ucy4KLSAqIAotICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlOgotICogLSAjYnVpbGRWYWx1ZSgpCi0gKiAgICAgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlLCBhcyBkZXJpdmVkIGZyb20gdGhlCi0gKiAgICAgY3VycmVudCBjb2xsZWN0aW9uIHZhbHVlCi0gKiAKLSAqIFN1YmNsYXNzZXMgbWlnaHQgd2FudCB0byBvdmVycmlkZToKLSAqIC0gI2l0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KQotICogLSAjaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkKLSAqIC0gI2NvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkKLSAqIC0gI2NvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkKLSAqICAgICB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLXsKLQkvKiogVGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvblZhbHVlTW9kZWw8Pz4gY29sbGVjdGlvbkhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNoIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gY29sbGVjdGlvbkhvbGRlcjsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9CQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIGhhcyBjaGFuZ2VkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YmQzMDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhbm90aGVyIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIHByb3BhZ2F0ZQotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi17Ci0KLQkvKiogVGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gY29sbGVjdGlvbkhvbGRlcjsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3MsIENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUyk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQkJCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5lc3RlZCBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGNvbGxlY3Rpb25OYW1lID09IENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUyAmJiB0aGlzLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCQlpZiAoY29sbGVjdGlvbk5hbWUgPT0gQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTICYmIHRoaXMuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBjb2xsZWN0aW9uIGhvbGRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IGl0ZW1zKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhdG9yPEU+KSBldmVudC5pdGVtcygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXIgaGFzIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkNjVlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5OdWxsTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiA8Y29kZT5Db2xsZWN0aW9uVmFsdWVNb2RlbDwvY29kZT4gYW5kIHVzZXMgYSA8Y29kZT5UcmFuc2Zvcm1lcjwvY29kZT4KLSAqIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdG8geWV0IGFub3RoZXIKLSAqIDxjb2RlPkNvbGxlY3Rpb25WYWx1ZU1vZGVsPC9jb2RlPi4gVGhpcyBjb21wb3NpdGUgY29sbGVjdGlvbiBjb250YWlucwotICogdGhlIGNvbWJpbmVkIGl0ZW1zIGZyb20gYWxsIHRoZXNlIGNvbXBvbmVudCBjb2xsZWN0aW9ucy4KLSAqIAotICogTkI6IFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gbXVzdCBiZSBhbiAiaWRlbnRpdHkgc2V0IiB0aGF0IGRvZXMgbm90Ci0gKiBjb250YWluIHRoZSBzYW1lIGl0ZW0gdHdpY2Ugb3IgdGhpcyBjbGFzcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAqIAotICogVGVybWlub2xvZ3k6Ci0gKiAtIHNvdXJjZXMgLSB0aGUgaXRlbXMgaW4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbDsgdGhlc2UKLSAqICAgIGFyZSBjb252ZXJ0ZWQgaW50byBjb21wb25lbnQgQ1ZNcyBieSB0aGUgdHJhbnNmb3JtZXIKLSAqIC0gY29tcG9uZW50IENWTXMgLSB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzIHRoYXQgYXJlIGNvbWJpbmVkCi0gKiAgICBieSB0aGlzIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsCi0gKiAtIGl0ZW1zIC0gdGhlIGl0ZW1zIGhlbGQgYnkgdGhlIGNvbXBvbmVudCBDVk1zCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMSwgRTI+Ci0JZXh0ZW5kcyBDb2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXI8RTE+Ci0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4KLXsKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSAob3B0aW9uYWwpIHVzZXItc3VwcGxpZWQgb2JqZWN0IHRoYXQgdHJhbnNmb3JtcwotCSAqIHRoZSBpdGVtcyBpbiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHRvIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLgotCSAqLwotCXByaXZhdGUgZmluYWwgVHJhbnNmb3JtZXI8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXI7Ci0KLQkvKioKLQkgKiBDYWNoZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzIHRoYXQKLQkgKiB3ZXJlIGdlbmVyYXRlZCBieSB0aGUgdHJhbnNmb3JtZXI7IGtleWVkIGJ5IHRoZSBpdGVtCi0JICogaW4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlIHRyYW5zZm9ybWVyLgotCSAqLwotCXByaXZhdGUgZmluYWwgSWRlbnRpdHlIYXNoTWFwPEUxLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4+IGNvbXBvbmVudENWTXM7Ci0KLQkvKioKLQkgKiBDYWNoZSBvZiB0aGUgY29sbGVjdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgY29tcG9uZW50Ci0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMgYWJvdmU7IGtleWVkIGJ5IHRoZSBjb21wb25lbnQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscy4KLQkgKiBVc2UgQXJyYXlMaXN0cyBzbyB3ZSBjYW4gdXNlIEFycmF5TGlzdC1zcGVjaWZpYyBtZXRob2RzCi0JICogKGUuZy4gI2Nsb25lKCkgYW5kICNlbnN1cmVDYXBhY2l0eSgpKS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIElkZW50aXR5SGFzaE1hcDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4sIEFycmF5TGlzdDxFMj4+IGNvbGxlY3Rpb25zOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscy4gKi8KLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBjb21wb25lbnRDVk1MaXN0ZW5lcjsKLQotCS8qKiBDYWNoZSB0aGUgc2l6ZSBvZiB0aGUgY29tcG9zaXRlIGNvbGxlY3Rpb24uICovCi0JcHJpdmF0ZSBpbnQgc2l6ZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmCi0JICogICAgIC0gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbHJlYWR5IGNvbnRhaW5zIG90aGVyCi0JICogICAgICAgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMgb3IKLQkgKiAgICAgLSB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgPGNvZGU+dHJhbnNmb3JtKEUxKTwvY29kZT4gbWV0aG9kCi0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcyhjb2xsZWN0aW9uSG9sZGVyLCBUcmFuc2Zvcm1lci5OdWxsLjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+Pmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uSG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcihjb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCQl0aGlzLmNvbXBvbmVudENWTXMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPEUxLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4+KCk7Ci0JCXRoaXMuY29sbGVjdGlvbnMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiwgQXJyYXlMaXN0PEUyPj4oKTsKLQkJdGhpcy5jb21wb25lbnRDVk1MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21wb25lbnRMaXN0ZW5lcigpOwotCQl0aGlzLnNpemUgPSAwOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZgotCSAqICAgICAtIHRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBjb2xsZWN0aW9uCi0JICogICAgICAgdmFsdWUgbW9kZWxzIG9yCi0JICogICAgIC0geW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIDxjb2RlPnRyYW5zZm9ybShFMSk8L2NvZGU+IG1ldGhvZAotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSA8Y29kZT5UcmFuc2Zvcm1lcjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RTE+KGxpc3RIb2xkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFMT4obGlzdEhvbGRlciksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24uIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmCi0JICogICAgIC0gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBhbHJlYWR5IGNvbnRhaW5zIGNvbGxlY3Rpb24KLQkgKiAgICAgICB2YWx1ZSBtb2RlbHMgb3IKLQkgKiAgICAgLSB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgPGNvZGU+dHJhbnNmb3JtKEUxKTwvY29kZT4gbWV0aG9kCi0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFMT4gY29sbGVjdGlvbikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMT4oY29sbGVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb248PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uLCBUcmFuc2Zvcm1lcjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMT4oY29sbGVjdGlvbiksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbXBvbmVudExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0JCQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50SXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50Q29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRDb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb21wb25lbnQgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RTI+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEUyPih0aGlzLmJ1aWxkQ29sbGVjdGlvbnNJdGVyYXRvcnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEl0ZXJhdG9yPEUyPj4gYnVpbGRDb2xsZWN0aW9uc0l0ZXJhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEFycmF5TGlzdDxFMj4sIEl0ZXJhdG9yPEUyPj4odGhpcy5jb2xsZWN0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxFMj4gdHJhbnNmb3JtKEFycmF5TGlzdDxFMj4gbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5zaXplOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXIgb3ZlcnJpZGVzL2ltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCBvdXIgY2FjaGUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5hZGRBbGxDb21wb25lbnRTb3VyY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIGFsbCB0aGUgc291cmNlcyB0byBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscwotCSAqIGFuZCBhZGQgdGhlaXIgaXRlbXMgdG8gb3VyIGNhY2hlLCB3aXRoIG5vIGV2ZW50IG5vdGlmaWNhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbGxDb21wb25lbnRTb3VyY2VzKCkgewotCQlmb3IgKEUxIHNvdXJjZSA6IHRoaXMuY29sbGVjdGlvbkhvbGRlcikgewotCQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2Uoc291cmNlLCBOdWxsTGlzdC48RTI+aW5zdGFuY2UoKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbXBvbmVudHMuLi4KLQkJZm9yIChDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNIDogdGhpcy5jb21wb25lbnRDVk1zLnZhbHVlcygpKSB7Ci0JCQljb21wb25lbnRDVk0ucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFZBTFVFUywgdGhpcy5jb21wb25lbnRDVk1MaXN0ZW5lcik7Ci0JCX0KLQkJLy8gLi4uYW5kIGNsZWFyIHRoZSBjYWNoZQotCQl0aGlzLmNvbXBvbmVudENWTXMuY2xlYXIoKTsKLQkJdGhpcy5jb2xsZWN0aW9ucy5jbGVhcigpOwotCQl0aGlzLnNpemUgPSAwOwotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSBhZGRlZDsKLQkgKiBhZGQgdGhlaXIgY29ycmVzcG9uZGluZyBpdGVtcyB0byBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJQXJyYXlMaXN0PEUyPiBhZGRlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4oKTsKLQkJZm9yIChJdGVyYXRvcjxFMT4gc3RyZWFtID0gdGhpcy5pdGVtcyhldmVudCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2Uoc3RyZWFtLm5leHQoKSwgYWRkZWRJdGVtcyk7Ci0JCX0KLQkJdGhpcy5maXJlSXRlbXNBZGRlZChWQUxVRVMsIGFkZGVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIHNvdXJjZSB0byBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwKLQkgKiBhbmQgYWRkIGl0cyBpdGVtcyB0byBvdXIgY2FjaGUgYW5kIHRoZSAiY29sbGVjdGluZyBwYXJhbWV0ZXIiLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbXBvbmVudFNvdXJjZShFMSBzb3VyY2UsIExpc3Q8RTI+IGFkZGVkSXRlbXMpIHsKLQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTSA9IHRoaXMudHJhbnNmb3JtKHNvdXJjZSk7Ci0JCWlmICh0aGlzLmNvbXBvbmVudENWTXMucHV0KHNvdXJjZSwgY29tcG9uZW50Q1ZNKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkdXBsaWNhdGUgY29tcG9uZW50OiAiICsgc291cmNlKTsKLQkJfQotCQljb21wb25lbnRDVk0uYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFZBTFVFUywgdGhpcy5jb21wb25lbnRDVk1MaXN0ZW5lcik7Ci0JCUFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8RTI+KGNvbXBvbmVudENWTS5zaXplKCkpOwotCQlpZiAodGhpcy5jb2xsZWN0aW9ucy5wdXQoY29tcG9uZW50Q1ZNLCBjb21wb25lbnRDb2xsZWN0aW9uKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkdXBsaWNhdGUgY29sbGVjdGlvbjogIiArIHNvdXJjZSk7Ci0JCX0KLQkJdGhpcy5hZGRDb21wb25lbnRJdGVtcyhjb21wb25lbnRDVk0sIGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQlhZGRlZEl0ZW1zLmFkZEFsbChjb21wb25lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IENWTSB0byB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudAotCSAqIGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tcG9uZW50SXRlbXMoQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTSwgQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uKSB7Ci0JCWludCBpdGVtc1NpemUgPSBjb21wb25lbnRDVk0uc2l6ZSgpOwotCQl0aGlzLnNpemUgKz0gaXRlbXNTaXplOwotCQljb21wb25lbnRDb2xsZWN0aW9uLmVuc3VyZUNhcGFjaXR5KGNvbXBvbmVudENvbGxlY3Rpb24uc2l6ZSgpICsgaXRlbXNTaXplKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChjb21wb25lbnRDb2xsZWN0aW9uLCBjb21wb25lbnRDVk0pOwotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSByZW1vdmVkOwotCSAqIHJlbW92ZSB0aGVpciBjb3JyZXNwb25kaW5nIGl0ZW1zIGZyb20gb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJQXJyYXlMaXN0PEUyPiByZW1vdmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPigpOwotCQlmb3IgKEl0ZXJhdG9yPEUxPiBzdHJlYW0gPSB0aGlzLml0ZW1zKGV2ZW50KTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZShzdHJlYW0ubmV4dCgpLCByZW1vdmVkSXRlbXMpOwotCQl9Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChWQUxVRVMsIHJlbW92ZWRJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBpdGVtcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogZnJvbSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29tcG9uZW50U291cmNlKEUxIHNvdXJjZSwgTGlzdDxFMj4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRDVk0gPSB0aGlzLmNvbXBvbmVudENWTXMucmVtb3ZlKHNvdXJjZSk7Ci0JCWlmIChjb21wb25lbnRDVk0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWlzc2luZyBjb21wb25lbnQ6ICIgKyBzb3VyY2UpOwotCQl9Ci0JCWNvbXBvbmVudENWTS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVkFMVUVTLCB0aGlzLmNvbXBvbmVudENWTUxpc3RlbmVyKTsKLQkJQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9ucy5yZW1vdmUoY29tcG9uZW50Q1ZNKTsKLQkJaWYgKGNvbXBvbmVudENvbGxlY3Rpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWlzc2luZyBjb2xsZWN0aW9uOiAiICsgc291cmNlKTsKLQkJfQotCQlyZW1vdmVkSXRlbXMuYWRkQWxsKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLnJlbW92ZUNvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBvdXIgc2l6ZSBhbmQgY29sbGVjdGlvbiBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb21wb25lbnRJdGVtcyhBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24pIHsKLQkJdGhpcy5zaXplIC09IGNvbXBvbmVudENvbGxlY3Rpb24uc2l6ZSgpOwotCQljb21wb25lbnRDb2xsZWN0aW9uLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbXBvbmVudCBzb3VyY2VzIGNsZWFyZWQ7Ci0JICogY2xlYXIgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUFsbENvbXBvbmVudFNvdXJjZXMoKTsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNsZWFyZWQoVkFMVUVTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxDb21wb25lbnRTb3VyY2VzKCkgewotCQkvLyBjb3B5IHRoZSBrZXlzIHNvIHdlIGRvbid0IGVhdCBvdXIgb3duIHRhaWwKLQkJQXJyYXlMaXN0PEUxPiBjb3B5ID0gbmV3IEFycmF5TGlzdDxFMT4odGhpcy5jb21wb25lbnRDVk1zLmtleVNldCgpKTsKLQkJZm9yIChFMSBzb3VyY2UgOiBjb3B5KSB7Ci0JCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZShzb3VyY2UsIE51bGxMaXN0LjxFMj5pbnN0YW5jZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnQgc291cmNlcyBjaGFuZ2VkOwotCSAqIHJlYnVpbGQgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUFsbENvbXBvbmVudFNvdXJjZXMoKTsKLQkJdGhpcy5hZGRBbGxDb21wb25lbnRTb3VyY2VzKCk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IHRyYW5zZm9ybShFMSB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lci50cmFuc2Zvcm0odmFsdWUpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb25zIGhhZCBpdGVtcyBhZGRlZDsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWludCBpdGVtc1NpemUgPSBldmVudC5pdGVtc1NpemUoKTsKLQkJdGhpcy5zaXplICs9IGl0ZW1zU2l6ZTsKLQotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldCh0aGlzLmNvbXBvbmVudENWTShldmVudCkpOwotCQljb21wb25lbnRDb2xsZWN0aW9uLmVuc3VyZUNhcGFjaXR5KGNvbXBvbmVudENvbGxlY3Rpb24uc2l6ZSgpICsgaXRlbXNTaXplKTsKLQotCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKHRoaXMuY29tcG9uZW50SXRlbXMoZXZlbnQpLCBjb21wb25lbnRDb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb25zIGhhZCBpdGVtcyByZW1vdmVkOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnNpemUgLT0gZXZlbnQuaXRlbXNTaXplKCk7Ci0JCUFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbiA9IHRoaXMuY29sbGVjdGlvbnMuZ2V0KHRoaXMuY29tcG9uZW50Q1ZNKGV2ZW50KSk7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbih0aGlzLmNvbXBvbmVudEl0ZW1zKGV2ZW50KSwgY29tcG9uZW50Q29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9ucyB3YXMgY2xlYXJlZDsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGVzIGJ5IGNsZWFyaW5nIG91dCB0aGUgYXBwcm9wcmlhdGUKLQkgKiBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudENvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldCh0aGlzLmNvbXBvbmVudENWTShldmVudCkpOwotCQlBcnJheUxpc3Q8RTI+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLnJlbW92ZUNvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoVkFMVUVTLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb25zIGNoYW5nZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlcyBieSBjbGVhcmluZyBvdXQgdGhlIGFwcHJvcHJpYXRlCi0JICogY29sbGVjdGlvbiBhbmQgdGhlbiByZWJ1aWxkaW5nIGl0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudENvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNID0gdGhpcy5jb21wb25lbnRDVk0oZXZlbnQpOwotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldChjb21wb25lbnRDVk0pOwotCQl0aGlzLnJlbW92ZUNvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLmFkZENvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENWTSwgY29tcG9uZW50Q29sbGVjdGlvbik7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUyk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYXRvcjxFMj4gY29tcG9uZW50SXRlbXMoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmF0b3I8RTI+KSBldmVudC5pdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTShDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4pIGV2ZW50LmdldFNvdXJjZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjODRjNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICogPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGFuZCB1c2VzIGEgPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+Ci0gKiB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IHRvIHlldCBhbm90aGVyCi0gKiA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4uIFRoaXMgY29tcG9zaXRlIGxpc3QgY29udGFpbnMKLSAqIHRoZSBjb21iaW5lZCBpdGVtcyBmcm9tIGFsbCB0aGVzZSBjb21wb25lbnQgbGlzdHMuCi0gKiAKLSAqIFRlcm1pbm9sb2d5OgotICogLSBzb3VyY2VzIC0gdGhlIGl0ZW1zIGluIHRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWw7IHRoZXNlCi0gKiAgICBhcmUgY29udmVydGVkIGludG8gY29tcG9uZW50IExWTXMgYnkgdGhlIHRyYW5zZm9ybWVyCi0gKiAtIGNvbXBvbmVudExWTXMgLSB0aGUgY29tcG9uZW50IGxpc3QgdmFsdWUgbW9kZWxzIHRoYXQgYXJlIGNvbWJpbmVkCi0gKiAgICBieSB0aGlzIGNvbXBvc2l0ZSBsaXN0IHZhbHVlIG1vZGVsCi0gKiAtIGl0ZW1zIC0gdGhlIGl0ZW1zIGhlbGQgYnkgdGhlIGNvbXBvbmVudCBMVk1zCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxFMSwgRTI+Ci0JZXh0ZW5kcyBMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RTE+Ci0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFMj4KLXsKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSAob3B0aW9uYWwpIHVzZXItc3VwcGxpZWQgb2JqZWN0IHRoYXQgdHJhbnNmb3JtcwotCSAqIHRoZSBpdGVtcyBpbiB0aGUgd3JhcHBlZCBsaXN0IHRvIGxpc3QgdmFsdWUgbW9kZWxzLgotCSAqLwotCXByaXZhdGUgZmluYWwgVHJhbnNmb3JtZXI8RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXI7Ci0KLQkvKioKLQkgKiBDYWNoZSBvZiB0aGUgc291cmNlcywgY29tcG9uZW50IExWTXMsIGxpc3RzLgotCSAqLwotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEluZm8+IGluZm9MaXN0OwotCXByb3RlY3RlZCBjbGFzcyBJbmZvIHsKLQkJLy8gdGhlIG9iamVjdCBwYXNzZWQgdG8gdGhlIHRyYW5zZm9ybWVyCi0JCWZpbmFsIEUxIHNvdXJjZTsKLQkJLy8gdGhlIGxpc3QgdmFsdWUgbW9kZWwgZ2VuZXJhdGVkIGJ5IHRoZSB0cmFuc2Zvcm1lcgotCQlmaW5hbCBMaXN0VmFsdWVNb2RlbDxFMj4gY29tcG9uZW50TFZNOwotCQkvLyBjYWNoZSBvZiB0aGUgaXRlbXMgaGVsZCBieSB0aGUgY29tcG9uZW50IExWTQotCQlmaW5hbCBBcnJheUxpc3Q8RTI+IGl0ZW1zOwotCQkvLyB0aGUgY29tcG9uZW50IExWTSdzIGJlZ2lubmluZyBpbmRleCB3aXRoaW4gdGhlIGNvbXBvc2l0ZSBMVk0KLQkJaW50IGJlZ2luOwotCQlJbmZvKEUxIHNvdXJjZSwgTGlzdFZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudExWTSwgQXJyYXlMaXN0PEUyPiBpdGVtcywgaW50IGJlZ2luKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLmNvbXBvbmVudExWTSA9IGNvbXBvbmVudExWTTsKLQkJCXRoaXMuaXRlbXMgPSBpdGVtczsKLQkJCXRoaXMuYmVnaW4gPSBiZWdpbjsKLQkJfQotCX0KLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBjb21wb25lbnQgbGlzdCB2YWx1ZSBtb2RlbHMuICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgY29tcG9uZW50TFZNTGlzdGVuZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIHNpemUgb2YgdGhlIGNvbXBvc2l0ZSBsaXN0LiAqLwotCXByaXZhdGUgaW50IHNpemU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZgotCSAqICAgICAtIHRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGxpc3QgdmFsdWUgbW9kZWxzIG9yCi0JICogICAgIC0geW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIDxjb2RlPnRyYW5zZm9ybShFMSk8L2NvZGU+IG1ldGhvZAotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSA8Y29kZT5UcmFuc2Zvcm1lcjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobGlzdEhvbGRlciwgVHJhbnNmb3JtZXIuTnVsbC48RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQkJdGhpcy5pbmZvTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW5mbz4oKTsKLQkJdGhpcy5jb21wb25lbnRMVk1MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21wb25lbnRMVk1MaXN0ZW5lcigpOwotCQl0aGlzLnNpemUgPSAwOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogbGlzdC4gVXNlIHRoaXMgY29uc3RydWN0b3IgaWYKLQkgKiAgICAgLSB0aGUgd3JhcHBlZCBsaXN0IGFscmVhZHkgY29udGFpbnMgbGlzdCB2YWx1ZSBtb2RlbHMgb3IKLQkgKiAgICAgLSB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgPGNvZGU+dHJhbnNmb3JtKEUxKTwvY29kZT4gbWV0aG9kCi0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbChMaXN0PD8gZXh0ZW5kcyBFMT4gbGlzdCkgewotCQl0aGlzKG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxFMT4obGlzdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogbGlzdCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsKExpc3Q8PyBleHRlbmRzIEUxPiBsaXN0LCBUcmFuc2Zvcm1lcjxFMSwgTGlzdFZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxFMT4obGlzdCksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZENvbXBvbmVudExWTUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0JCQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50SXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50TGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRMaXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb21wb25lbnQgTFZNIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEUyIGdldChpbnQgaW5kZXgpIHsKLQkJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSB0aGlzLnNpemUpKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6ICIgKyB0aGlzLnNpemUpOwotCQl9Ci0JCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIGluZm8gbGlzdAotCQlmb3IgKGludCBpID0gdGhpcy5pbmZvTGlzdC5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoaSk7Ci0JCQlpZiAoaW5kZXggPj0gaW5mby5iZWdpbikgewotCQkJCXJldHVybiBpbmZvLml0ZW1zLmdldChpbmRleCAtIGluZm8uYmVnaW4pOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsgIC8vIHNvbWV0aGluZyBpcyB3YWNrCi0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFMj4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEUyPih0aGlzLmJ1aWxkTGlzdHNJdGVyYXRvcnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxMaXN0SXRlcmF0b3I8RTI+PiBidWlsZExpc3RzSXRlcmF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPEluZm8sIExpc3RJdGVyYXRvcjxFMj4+KHRoaXMuaW5mb0xpc3QubGlzdEl0ZXJhdG9yKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFMj4gdHJhbnNmb3JtKEluZm8gaW5mbykgewotCQkJCXJldHVybiBpbmZvLml0ZW1zLmxpc3RJdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5hcnJheSh0aGlzLmxpc3RJdGVyYXRvcigpLCB0aGlzLnNpemUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbFdyYXBwZXIgb3ZlcnJpZGVzL2ltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCBvdXIgY2FjaGUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgbGlzdCwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2VzKDAsIHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKSwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBjb21wb25lbnQgTFZNcy4uLgotCQlmb3IgKEluZm8gaW5mbyA6IHRoaXMuaW5mb0xpc3QpIHsKLQkJCWluZm8uY29tcG9uZW50TFZNLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX1ZBTFVFUywgdGhpcy5jb21wb25lbnRMVk1MaXN0ZW5lcik7Ci0JCX0KLQkJLy8gLi4uYW5kIGNsZWFyIHRoZSBjYWNoZQotCQl0aGlzLmluZm9MaXN0LmNsZWFyKCk7Ci0JCXRoaXMuc2l6ZSA9IDA7Ci0JfQotCi0JLyoqCi0JICogU29tZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIGFkZGVkOyB1cGRhdGUgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYWRkQ29tcG9uZW50U291cmNlcyhldmVudC5nZXRJbmRleCgpLCB0aGlzLml0ZW1zKGV2ZW50KSwgZXZlbnQuaXRlbXNTaXplKCksIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQl9Ci0KLQkvKioKLQkgKiBEbyBub3QgZmlyZSBhbiBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21wb25lbnRTb3VyY2VzKGludCBhZGRlZFNvdXJjZXNJbmRleCwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gYWRkZWRTb3VyY2VzLCBpbnQgYWRkZWRTb3VyY2VzU2l6ZSkgewotCQl0aGlzLmFkZENvbXBvbmVudFNvdXJjZXMoYWRkZWRTb3VyY2VzSW5kZXgsIGFkZGVkU291cmNlcywgYWRkZWRTb3VyY2VzU2l6ZSwgZmFsc2UpOyAgLy8gZmFsc2UgPSBkbyBub3QgZmlyZSBldmVudAotCX0KLQotCS8qKgotCSAqIEFkZCBpbmZvcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgc291cmNlcyB0byBvdXIgY2FjaGUuCi0JICogRmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgcmVxdWVzdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbXBvbmVudFNvdXJjZXMoaW50IGFkZGVkU291cmNlc0luZGV4LCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEUxPiBhZGRlZFNvdXJjZXMsIGludCBhZGRlZFNvdXJjZXNTaXplLCBib29sZWFuIGZpcmVFdmVudCkgewotCQlBcnJheUxpc3Q8SW5mbz4gbmV3SW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0PEluZm8+KGFkZGVkU291cmNlc1NpemUpOwotCQkvLyB0aGUgJ2l0ZW1zJyBhcmUgZWl0aGVyIHRhY2tlZCBvbiB0byB0aGUgZW5kIG9yCi0JCS8vIGF0IHRoZSAnYmVnaW4nIGluZGV4IG9mIHRoZSBmaXJzdCAnaW5mbycgdGhhdCBpcyBiZWluZyBwdXNoZWQgYmFjawotCQlpbnQgbmV3SXRlbXNJbmRleCA9IChhZGRlZFNvdXJjZXNJbmRleCA9PSB0aGlzLmluZm9MaXN0LnNpemUoKSkgPyB0aGlzLnNpemUgOiB0aGlzLmluZm9MaXN0LmdldChhZGRlZFNvdXJjZXNJbmRleCkuYmVnaW47Ci0KLQkJaW50IGJlZ2luID0gbmV3SXRlbXNJbmRleDsKLQkJd2hpbGUgKGFkZGVkU291cmNlcy5oYXNOZXh0KCkpIHsKLQkJCUUxIHNvdXJjZSA9IGFkZGVkU291cmNlcy5uZXh0KCk7Ci0JCQlMaXN0VmFsdWVNb2RlbDxFMj4gY29tcG9uZW50TFZNID0gdGhpcy50cmFuc2Zvcm0oc291cmNlKTsKLQkJCWNvbXBvbmVudExWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9WQUxVRVMsIHRoaXMuY29tcG9uZW50TFZNTGlzdGVuZXIpOwotCQkJQXJyYXlMaXN0PEUyPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KGNvbXBvbmVudExWTS5zaXplKCkpOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChpdGVtcywgY29tcG9uZW50TFZNLmxpc3RJdGVyYXRvcigpKTsKLQkJCW5ld0luZm9MaXN0LmFkZChuZXcgSW5mbyhzb3VyY2UsIGNvbXBvbmVudExWTSwgaXRlbXMsIGJlZ2luKSk7Ci0JCQliZWdpbiArPSBpdGVtcy5zaXplKCk7Ci0JCX0KLQkJdGhpcy5pbmZvTGlzdC5hZGRBbGwoYWRkZWRTb3VyY2VzSW5kZXgsIG5ld0luZm9MaXN0KTsKLQkJaW50IG5ld0l0ZW1zU2l6ZSA9IGJlZ2luIC0gbmV3SXRlbXNJbmRleDsKLQkJdGhpcy5zaXplICs9IG5ld0l0ZW1zU2l6ZTsKLQotCQkvLyBidW1wIHRoZSAnYmVnaW4nIGluZGV4IGZvciBhbGwgdGhlIGluZm9zIHRoYXQgd2VyZSBwdXNoZWQgYmFjayBieSB0aGUgaW5zZXJ0Ci0JCWludCBtb3ZlZEluZm9zSW5kZXggPSBhZGRlZFNvdXJjZXNJbmRleCArIGFkZGVkU291cmNlc1NpemU7Ci0JCWZvciAoaW50IGkgPSBtb3ZlZEluZm9zSW5kZXg7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiArPSBuZXdJdGVtc1NpemU7Ci0JCX0KLQotCQlpZiAoZmlyZUV2ZW50KSB7Ci0JCQlBcnJheUxpc3Q8RTI+IG5ld0l0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4obmV3SXRlbXNTaXplKTsKLQkJCWZvciAoaW50IGkgPSBhZGRlZFNvdXJjZXNJbmRleDsgaSA8IG1vdmVkSW5mb3NJbmRleDsgaSsrKSB7Ci0JCQkJbmV3SXRlbXMuYWRkQWxsKHRoaXMuaW5mb0xpc3QuZ2V0KGkpLml0ZW1zKTsKLQkJCX0KLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoTElTVF9WQUxVRVMsIG5ld0l0ZW1zSW5kZXgsIG5ld0l0ZW1zKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSByZW1vdmVkOyB1cGRhdGUgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2VzKGV2ZW50LmdldEluZGV4KCksIGV2ZW50Lml0ZW1zU2l6ZSgpLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JfQotCi0JLyoqCi0JICogRG8gbm90IGZpcmUgYW4gZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29tcG9uZW50U291cmNlcyhpbnQgcmVtb3ZlZFNvdXJjZXNJbmRleCwgaW50IHJlbW92ZWRTb3VyY2VzU2l6ZSkgewotCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZXMocmVtb3ZlZFNvdXJjZXNJbmRleCwgcmVtb3ZlZFNvdXJjZXNTaXplLCBmYWxzZSk7ICAvLyBmYWxzZSA9IGRvIG5vdCBmaXJlIGV2ZW50Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBpbmZvcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgc291cmNlcyBmcm9tIG91ciBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb21wb25lbnRTb3VyY2VzKGludCByZW1vdmVkU291cmNlc0luZGV4LCBpbnQgcmVtb3ZlZFNvdXJjZXNTaXplLCBib29sZWFuIGZpcmVFdmVudCkgewotCQlpbnQgcmVtb3ZlZEl0ZW1zSW5kZXggPSB0aGlzLmluZm9MaXN0LmdldChyZW1vdmVkU291cmNlc0luZGV4KS5iZWdpbjsKLQkJaW50IG1vdmVkU291cmNlc0luZGV4ID0gcmVtb3ZlZFNvdXJjZXNJbmRleCArIHJlbW92ZWRTb3VyY2VzU2l6ZTsKLQkJaW50IG1vdmVkSXRlbXNJbmRleCA9IChtb3ZlZFNvdXJjZXNJbmRleCA9PSB0aGlzLmluZm9MaXN0LnNpemUoKSkgPyB0aGlzLnNpemUgOiB0aGlzLmluZm9MaXN0LmdldChtb3ZlZFNvdXJjZXNJbmRleCkuYmVnaW47Ci0JCWludCByZW1vdmVkSXRlbXNTaXplID0gbW92ZWRJdGVtc0luZGV4IC0gcmVtb3ZlZEl0ZW1zSW5kZXg7Ci0JCXRoaXMuc2l6ZSAtPSByZW1vdmVkSXRlbXNTaXplOwotCi0JCUxpc3Q8SW5mbz4gc3ViTGlzdCA9IHRoaXMuaW5mb0xpc3Quc3ViTGlzdChyZW1vdmVkU291cmNlc0luZGV4LCByZW1vdmVkU291cmNlc0luZGV4ICsgcmVtb3ZlZFNvdXJjZXNTaXplKTsKLQkJQXJyYXlMaXN0PEluZm8+IHJlbW92ZWRJbmZvTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW5mbz4oc3ViTGlzdCk7ICAvLyBtYWtlIGEgY29weQotCQlzdWJMaXN0LmNsZWFyKCk7Ci0KLQkJLy8gZGVjcmVtZW50IHRoZSAnYmVnaW4nIGluZGV4IGZvciBhbGwgdGhlIGluZm9zIHRoYXQgd2VyZSBtb3ZlZCBmb3J3YXJkIGJ5IHRoZSBkZWxldGVzCi0JCWZvciAoaW50IGkgPSByZW1vdmVkU291cmNlc0luZGV4OyBpIDwgdGhpcy5pbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJdGhpcy5pbmZvTGlzdC5nZXQoaSkuYmVnaW4gLT0gcmVtb3ZlZEl0ZW1zU2l6ZTsKLQkJfQotCi0JCWZvciAoSW5mbyByZW1vdmVkSW5mbyA6IHJlbW92ZWRJbmZvTGlzdCkgewotCQkJcmVtb3ZlZEluZm8uY29tcG9uZW50TFZNLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX1ZBTFVFUywgdGhpcy5jb21wb25lbnRMVk1MaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoZmlyZUV2ZW50KSB7Ci0JCQlBcnJheUxpc3Q8RTI+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KHJlbW92ZWRJdGVtc1NpemUpOwotCQkJZm9yIChJbmZvIHJlbW92ZWRJbmZvIDogcmVtb3ZlZEluZm9MaXN0KSB7Ci0JCQkJcmVtb3ZlZEl0ZW1zLmFkZEFsbChyZW1vdmVkSW5mby5pdGVtcyk7Ci0JCQl9Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoTElTVF9WQUxVRVMsIHJlbW92ZWRJdGVtc0luZGV4LCByZW1vdmVkSXRlbXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU29tZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIHJlcGxhY2VkOyB1cGRhdGUgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVwbGFjZUNvbXBvbmVudFNvdXJjZXMoZXZlbnQuZ2V0SW5kZXgoKSwgdGhpcy5pdGVtcyhldmVudCksIGV2ZW50Lml0ZW1zU2l6ZSgpLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZWQgY29tcG9uZW50IHNvdXJjZXMgd2lsbCBub3QgKHR5cGljYWxseSkgbWFwIHRvIGEgc2V0IG9mIHJlcGxhY2VkCi0JICogaXRlbXMsIHNvIHdlIHJlbW92ZSBhbmQgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGxpc3RzIG9mIGl0ZW1zLCByZXN1bHRpbmcgaW4KLQkgKiB0d28gZXZlbnRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VDb21wb25lbnRTb3VyY2VzKGludCByZXBsYWNlZFNvdXJjZXNJbmRleCwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbmV3U291cmNlcywgaW50IHJlcGxhY2VkU291cmNlc1NpemUsIGJvb2xlYW4gZmlyZUV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50U291cmNlcyhyZXBsYWNlZFNvdXJjZXNJbmRleCwgcmVwbGFjZWRTb3VyY2VzU2l6ZSwgZmlyZUV2ZW50KTsKLQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2VzKHJlcGxhY2VkU291cmNlc0luZGV4LCBuZXdTb3VyY2VzLCByZXBsYWNlZFNvdXJjZXNTaXplLCBmaXJlRXZlbnQpOwotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSBtb3ZlZDsgdXBkYXRlIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vdmVDb21wb25lbnRTb3VyY2VzKGV2ZW50LmdldFRhcmdldEluZGV4KCksIGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldE1vdmVMZW5ndGgoKSwgdHJ1ZSk7ICAvLyB0cnVlID0gZmlyZSBldmVudAotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVDb21wb25lbnRTb3VyY2VzKGludCB0YXJnZXRTb3VyY2VzSW5kZXgsIGludCBzb3VyY2VTb3VyY2VzSW5kZXgsIGludCBtb3ZlZFNvdXJjZXNMZW5ndGgsIGJvb2xlYW4gZmlyZUV2ZW50KSB7Ci0JCWludCBzb3VyY2VJdGVtc0luZGV4ID0gdGhpcy5pbmZvTGlzdC5nZXQoc291cmNlU291cmNlc0luZGV4KS5iZWdpbjsKLQotCQlpbnQgbmV4dFNvdXJjZVNvdXJjZUluZGV4ID0gc291cmNlU291cmNlc0luZGV4ICsgbW92ZWRTb3VyY2VzTGVuZ3RoOwotCQlpbnQgbmV4dFNvdXJjZUl0ZW1JbmRleCA9IChuZXh0U291cmNlU291cmNlSW5kZXggPT0gdGhpcy5pbmZvTGlzdC5zaXplKCkpID8gdGhpcy5zaXplIDogdGhpcy5pbmZvTGlzdC5nZXQobmV4dFNvdXJjZVNvdXJjZUluZGV4KS5iZWdpbjsKLQkJaW50IG1vdmVJdGVtc0xlbmd0aCA9IG5leHRTb3VyY2VJdGVtSW5kZXggLSBzb3VyY2VJdGVtc0luZGV4OwotCi0JCWludCB0YXJnZXRJdGVtc0luZGV4ID0gLTE7Ci0JCWlmIChzb3VyY2VTb3VyY2VzSW5kZXggPiB0YXJnZXRTb3VyY2VzSW5kZXgpIHsKLQkJCS8vIG1vdmUgZnJvbSBoaWdoIHRvIGxvdyBpbmRleAotCQkJdGFyZ2V0SXRlbXNJbmRleCA9IHRoaXMuaW5mb0xpc3QuZ2V0KHRhcmdldFNvdXJjZXNJbmRleCkuYmVnaW47Ci0JCX0gZWxzZSB7Ci0JCQkvLyBtb3ZlIGZyb20gbG93IHRvIGhpZ2ggaW5kZXggKGhpZ2hlciBpdGVtcyBtb3ZlIGRvd24gZHVyaW5nIG1vdmUpCi0JCQlpbnQgbmV4dFRhcmdldFNvdXJjZUluZGV4ID0gdGFyZ2V0U291cmNlc0luZGV4ICsgbW92ZWRTb3VyY2VzTGVuZ3RoOwotCQkJdGFyZ2V0SXRlbXNJbmRleCA9IChuZXh0VGFyZ2V0U291cmNlSW5kZXggPT0gdGhpcy5pbmZvTGlzdC5zaXplKCkpID8gdGhpcy5zaXplIDogdGhpcy5pbmZvTGlzdC5nZXQobmV4dFRhcmdldFNvdXJjZUluZGV4KS5iZWdpbjsKLQkJCXRhcmdldEl0ZW1zSW5kZXggPSB0YXJnZXRJdGVtc0luZGV4IC0gbW92ZUl0ZW1zTGVuZ3RoOwotCQl9Ci0KLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5pbmZvTGlzdCwgdGFyZ2V0U291cmNlc0luZGV4LCBzb3VyY2VTb3VyY2VzSW5kZXgsIG1vdmVkU291cmNlc0xlbmd0aCk7Ci0KLQkJLy8gdXBkYXRlIHRoZSAnYmVnaW4nIGluZGV4ZXMgb2YgYWxsIHRoZSBhZmZlY3RlZCAnaW5mb3MnCi0JCWludCBtaW4gPSBNYXRoLm1pbih0YXJnZXRTb3VyY2VzSW5kZXgsIHNvdXJjZVNvdXJjZXNJbmRleCk7Ci0JCWludCBtYXggPSBNYXRoLm1heCh0YXJnZXRTb3VyY2VzSW5kZXgsIHNvdXJjZVNvdXJjZXNJbmRleCkgKyBtb3ZlZFNvdXJjZXNMZW5ndGg7Ci0JCWludCBiZWdpbiA9IE1hdGgubWluKHRhcmdldEl0ZW1zSW5kZXgsIHNvdXJjZUl0ZW1zSW5kZXgpOwotCQlmb3IgKGludCBpID0gbWluOyBpIDwgbWF4OyBpKyspIHsKLQkJCUluZm8gaW5mbyA9IHRoaXMuaW5mb0xpc3QuZ2V0KGkpOwotCQkJaW5mby5iZWdpbiA9IGJlZ2luOwotCQkJYmVnaW4gKz0gaW5mby5jb21wb25lbnRMVk0uc2l6ZSgpOwotCQl9Ci0KLQkJaWYgKGZpcmVFdmVudCkgewotCQkJdGhpcy5maXJlSXRlbXNNb3ZlZChMSVNUX1ZBTFVFUywgdGFyZ2V0SXRlbXNJbmRleCwgc291cmNlSXRlbXNJbmRleCwgbW92ZUl0ZW1zTGVuZ3RoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIGNsZWFyZWQ7IGNsZWFyIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2VzKDAsIHRoaXMuaW5mb0xpc3Quc2l6ZSgpKTsKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQoTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnQgc291cmNlcyBjaGFuZ2VkOyByZWJ1aWxkIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2VzKDAsIHRoaXMuaW5mb0xpc3Quc2l6ZSgpKTsKLQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2VzKDAsIHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKSwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RJdGVyYXRvcigpLCB0aGlzLnNpemUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3QgaW50byBhIGxpc3QgdmFsdWUgbW9kZWwuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxFMj4gdHJhbnNmb3JtKEUxIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBMVk0uCi0JICovCi0JcHJvdGVjdGVkIGludCBpbmRleE9mKExpc3RWYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRMVk0pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAodGhpcy5pbmZvTGlzdC5nZXQoaSkuY29tcG9uZW50TFZNID09IGNvbXBvbmVudExWTSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgY29tcG9uZW50IExWTTogIiArIGNvbXBvbmVudExWTSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50J3MgY29tcG9uZW50IExWTS4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGluZGV4Rm9yKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy5pbmRleE9mKHRoaXMuY29tcG9uZW50TFZNKGV2ZW50KSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byBvbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0czsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdXBkYXRlIHRoZSBhZmZlY3RlZCAnYmVnaW4nIGluZGljZXMKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCWludCBuZXdJdGVtc1NpemUgPSBldmVudC5pdGVtc1NpemUoKTsKLQkJZm9yIChpbnQgaSA9IGNvbXBvbmVudExWTUluZGV4ICsgMTsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuaW5mb0xpc3QuZ2V0KGkpLmJlZ2luICs9IG5ld0l0ZW1zU2l6ZTsKLQkJfQotCQl0aGlzLnNpemUgKz0gbmV3SXRlbXNTaXplOwotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoaW5mby5pdGVtcywgZXZlbnQuZ2V0SW5kZXgoKSwgdGhpcy5jb21wb25lbnRJdGVtcyhldmVudCksIGV2ZW50Lml0ZW1zU2l6ZSgpKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gb25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHM7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdXBkYXRlIHRoZSBhZmZlY3RlZCAnYmVnaW4nIGluZGljZXMKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCWludCByZW1vdmVkSXRlbXNTaXplID0gZXZlbnQuaXRlbXNTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBjb21wb25lbnRMVk1JbmRleCArIDE7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiAtPSByZW1vdmVkSXRlbXNTaXplOwotCQl9Ci0JCXRoaXMuc2l6ZSAtPSByZW1vdmVkSXRlbXNTaXplOwotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCk7Ci0JCWludCBpdGVtSW5kZXggPSBldmVudC5nZXRJbmRleCgpOwotCQlpbmZvLml0ZW1zLnN1Ykxpc3QoaXRlbUluZGV4LCBpdGVtSW5kZXggKyBldmVudC5pdGVtc1NpemUoKSkuY2xlYXIoKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcywgTElTVF9WQUxVRVMsIGluZm8uYmVnaW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIG9uZSBvZiB0aGUgY29tcG9uZW50IGxpc3RzOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRJdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBubyBjaGFuZ2VzIHRvIHRoZSAnYmVnaW4nIGluZGljZXMgb3Igc2l6ZQotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlpbnQgY29tcG9uZW50TFZNSW5kZXggPSB0aGlzLmluZGV4Rm9yKGV2ZW50KTsKLQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoY29tcG9uZW50TFZNSW5kZXgpOwotCQlpbnQgaSA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWZvciAoSXRlcmF0b3I8RTI+IHN0cmVhbSA9IHRoaXMuY29tcG9uZW50SXRlbXMoZXZlbnQpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWluZm8uaXRlbXMuc2V0KGkrKywgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiBvbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0czsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gbm8gY2hhbmdlcyB0byB0aGUgJ2JlZ2luJyBpbmRpY2VzIG9yIHNpemUKLQotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY2FjaGVkIGxpc3QKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCUluZm8gaW5mbyA9IHRoaXMuaW5mb0xpc3QuZ2V0KGNvbXBvbmVudExWTUluZGV4KTsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUoaW5mby5pdGVtcywgZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0U291cmNlSW5kZXgoKSwgZXZlbnQuZ2V0TW92ZUxlbmd0aCgpKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luKSk7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHMgd2FzIGNsZWFyZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudExpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQgY29tcG9uZW50TFZNSW5kZXggPSB0aGlzLmluZGV4Rm9yKGV2ZW50KTsKLQkJdGhpcy5jbGVhckNvbXBvbmVudExpc3QoY29tcG9uZW50TFZNSW5kZXgsIHRoaXMuaW5mb0xpc3QuZ2V0KGNvbXBvbmVudExWTUluZGV4KSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJDb21wb25lbnRMaXN0KGludCBjb21wb25lbnRMVk1JbmRleCwgSW5mbyBpbmZvKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgYWZmZWN0ZWQgJ2JlZ2luJyBpbmRpY2VzCi0JCWludCByZW1vdmVkSXRlbXNTaXplID0gaW5mby5pdGVtcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSBjb21wb25lbnRMVk1JbmRleCArIDE7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiAtPSByZW1vdmVkSXRlbXNTaXplOwotCQl9Ci0JCXRoaXMuc2l6ZSAtPSByZW1vdmVkSXRlbXNTaXplOwotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlBcnJheUxpc3Q8RTI+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4oaW5mby5pdGVtcyk7Ci0JCWluZm8uaXRlbXMuY2xlYXIoKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChMSVNUX1ZBTFVFUywgaW5mby5iZWdpbiwgaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGxpc3RzIGNoYW5nZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlIGJ5IGNsZWFyaW5nIG91dCB0aGUgYXBwcm9wcmlhdGUKLQkgKiBsaXN0IGFuZCByZWJ1aWxkaW5nIGl0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudExpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQgY29tcG9uZW50TFZNSW5kZXggPSB0aGlzLmluZGV4Rm9yKGV2ZW50KTsKLQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoY29tcG9uZW50TFZNSW5kZXgpOwotCQl0aGlzLmNsZWFyQ29tcG9uZW50TGlzdChjb21wb25lbnRMVk1JbmRleCwgaW5mbyk7Ci0KLQkJLy8gdXBkYXRlIHRoZSBhZmZlY3RlZCAnYmVnaW4nIGluZGljZXMKLQkJaW50IG5ld0l0ZW1zU2l6ZSA9IGluZm8uY29tcG9uZW50TFZNLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IGNvbXBvbmVudExWTUluZGV4ICsgMTsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuaW5mb0xpc3QuZ2V0KGkpLmJlZ2luICs9IG5ld0l0ZW1zU2l6ZTsKLQkJfQotCQl0aGlzLnNpemUgKz0gbmV3SXRlbXNTaXplOwotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGluZm8uaXRlbXMsIGluZm8uY29tcG9uZW50TFZNLmxpc3RJdGVyYXRvcigpLCBuZXdJdGVtc1NpemUpOwotCi0JCS8vIHRyYW5zbGF0ZSB0aGUgZXZlbnQKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX1ZBTFVFUywgaW5mby5iZWdpbiwgaW5mby5pdGVtcyk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RTI+IGNvbXBvbmVudEl0ZW1zKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKExpc3RJdGVyYXRvcjxFMj4pIGV2ZW50Lml0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxFMj4gY29tcG9uZW50TFZNKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKExpc3RWYWx1ZU1vZGVsPEUyPikgZXZlbnQuZ2V0U291cmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGJkNDEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIHdyYXBwZXIgZXh0ZW5kcyBhIExpc3RWYWx1ZU1vZGVsIChvciBDb2xsZWN0aW9uVmFsdWVNb2RlbCkKLSAqIHdpdGggZml4ZWQgY29sbGVjdGlvbnMgb2YgaXRlbXMgb24gZWl0aGVyIGVuZC4KLSAqIDxwPgotICogTkI6IEJlIGNhcmVmdWwgdXNpbmcgb3Igd3JhcHBpbmcgdGhpcyBsaXN0IHZhbHVlIG1vZGVsLCBzaW5jZSB0aGUKLSAqICJleHRlbmRlZCIgaXRlbXMgbWF5IGJlIHVuZXhwZWN0ZWQgYnkgdGhlIGNsaWVudCBjb2RlIG9yIHdyYXBwZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWV4dGVuZHMgTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKiB0aGUgaXRlbXMgInByZXBlbmRlZCIgdG8gdGhlIHdyYXBwZWQgbGlzdCAqLwotCXByb3RlY3RlZCBMaXN0PEU+IHByZWZpeDsKLQotCS8qKiB0aGUgaXRlbXMgImFwcGVuZGVkIiB0byB0aGUgd3JhcHBlZCBsaXN0ICovCi0JcHJvdGVjdGVkIExpc3Q8RT4gc3VmZml4OwotCi0KLQkvLyAqKioqKioqKioqIGxvdHMgbycgY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeCBhbmQgc3VmZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0PD8gZXh0ZW5kcyBFPiBwcmVmaXgsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBMaXN0PD8gZXh0ZW5kcyBFPiBzdWZmaXgpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gbmV3IEFycmF5TGlzdDxFPihwcmVmaXgpOwotCQl0aGlzLnN1ZmZpeCA9IG5ldyBBcnJheUxpc3Q8RT4oc3VmZml4KTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggYSBwcmVmaXggYW5kIHN1ZmZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoRSBwcmVmaXgsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBFIHN1ZmZpeCkgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHByZWZpeCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzdWZmaXgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdDw/IGV4dGVuZHMgRT4gcHJlZml4LCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBuZXcgQXJyYXlMaXN0PEU+KHByZWZpeCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRoZSBzcGVjaWZpZWQgbGlzdCB3aXRoIGEgcHJlZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihFIHByZWZpeCwgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwcmVmaXgpOwotCQl0aGlzLnN1ZmZpeCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHN1ZmZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIsIExpc3Q8PyBleHRlbmRzIEU+IHN1ZmZpeCkgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJdGhpcy5zdWZmaXggPSBuZXcgQXJyYXlMaXN0PEU+KHN1ZmZpeCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRoZSBzcGVjaWZpZWQgbGlzdCB3aXRoIGEgc3VmZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlciwgRSBzdWZmaXgpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzdWZmaXgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeCBjb250YWluaW5nIGEgc2luZ2xlIG51bGwgaXRlbS4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChudWxsKTsKLQkJdGhpcy5zdWZmaXggPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3RJdGVyYXRvcl8oKSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3JfKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+KAotCQkJdGhpcy5wcmVmaXgubGlzdEl0ZXJhdG9yKCksCi0JCQl0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCksCi0JCQl0aGlzLnN1ZmZpeC5saXN0SXRlcmF0b3IoKQotCQkpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJaW50IHByZWZpeFNpemUgPSB0aGlzLnByZWZpeC5zaXplKCk7Ci0JCWlmIChpbmRleCA8IHByZWZpeFNpemUpIHsKLQkJCXJldHVybiB0aGlzLnByZWZpeC5nZXQoaW5kZXgpOwotCQl9IGVsc2UgaWYgKGluZGV4ID49IHByZWZpeFNpemUgKyB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWZmaXguZ2V0KGluZGV4IC0gKHByZWZpeFNpemUgKyB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmdldChpbmRleCAtIHByZWZpeFNpemUpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5wcmVmaXguc2l6ZSgpICsgdGhpcy5saXN0SG9sZGVyLnNpemUoKSArIHRoaXMuc3VmZml4LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJQXJyYXlMaXN0PEU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMuc2l6ZSgpKTsKLQkJbGlzdC5hZGRBbGwodGhpcy5wcmVmaXgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLQkJbGlzdC5hZGRBbGwodGhpcy5zdWZmaXgpOwotCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsV3JhcHBlciBpbXBsZW1lbnRhdGlvbi9vdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcywgTElTVF9WQUxVRVMsIHRoaXMucHJlZml4LnNpemUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGV2ZW50LmNsb25lV2l0aFNvdXJjZSh0aGlzLCBMSVNUX1ZBTFVFUywgdGhpcy5wcmVmaXguc2l6ZSgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcywgTElTVF9WQUxVRVMsIHRoaXMucHJlZml4LnNpemUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTLCB0aGlzLnByZWZpeC5zaXplKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMpOyAgLy8gbm90ICJjbGVhcmVkIgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5wcmVmaXgpOwotCQlzYi5hcHBlbmQoIiAiKTsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIiAiKTsKLQkJc2IuYXBwZW5kKHRoaXMuc3VmZml4KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoTGlzdDxFPiBwcmVmaXgpIHsKLQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdWZmaXgoTGlzdDxFPiBzdWZmaXgpIHsKLQkJdGhpcy5zdWZmaXggPSBzdWZmaXg7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZjJlMmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+RmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIDxjb2RlPkNvbGxlY3Rpb25WYWx1ZU1vZGVsPC9jb2RlPiBhbmQgdXNlcyBhIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAqIHRvIGRldGVybWluZSB3aGljaCBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbiBhcmUgcmV0dXJuZWQgYnkgY2FsbHMKLSAqIHRvIDxjb2RlPiNpdGVyYXRvcigpPC9jb2RlPi4KLSAqIDxwPgotICogVGhlIGZpbHRlciBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZTsgYWxsb3dpbmcgdGhlIHNhbWUKLSAqIGFkYXB0ZXIgdG8gYmUgdXNlZCB3aXRoIGRpZmZlcmVudCBmaWx0ZXIgY3JpdGVyaWEgKGUuZy4gd2hlbiB0aGUgdXNlcgotICogd2FudHMgdG8gdmlldyBhIGxpc3Qgb2YgLmphdmEgZmlsZXMpLgotICogPHA+Ci0gKiBOQjogSWYgdGhlIG9iamVjdHMgaW4gdGhlICJmaWx0ZXJlZCIgY29sbGVjdGlvbiBjYW4gY2hhbmdlIGluIHN1Y2ggYSB3YXkKLSAqIHRoYXQgdGhleSBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSAiZmlsdGVyZWQiIGNvbGxlY3Rpb24sIHlvdSB3aWxsCi0gKiBuZWVkIHRvIHdyYXAgdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gaW4gYW4gSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci4KLSAqIEZvciBleGFtcGxlLCBpZiB0aGUgZmlsdGVyIG9ubHkgImFjY2VwdHMiIGl0ZW1zIHdob3NlIG5hbWVzIGJlZ2luCi0gKiB3aXRoICJYIiBhbmQgdGhlIG5hbWVzIG9mIHRoZSBpdGVtcyBjYW4gY2hhbmdlLCB5b3Ugd2lsbCBuZWVkIHRvCi0gKiB3cmFwIHRoZSBvcmlnaW5hbCBsaXN0IG9mIHVuZmlsdGVyZWQgaXRlbXMgd2l0aCBhbgotICogSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyB0byBlYWNoCi0gKiBpdGVtJ3MgbmFtZSBhbmQgZmlyZXMgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IHdoZW5ldmVyIGFuIGl0ZW0ncyBuYW1lCi0gKiBjaGFuZ2VzLiBUaGUgZXZlbnQgd2lsbCBjYXVzZSB0aGlzIHdyYXBwZXIgdG8gcmUtZmlsdGVyIHRoZSBjaGFuZ2VkCi0gKiBpdGVtIGFuZCBhZGQgb3IgcmVtb3ZlIGl0IGZyb20gdGhlICJmaWx0ZXJlZCIgY29sbGVjdGlvbiBhcyBhcHByb3ByaWF0ZS4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBDb2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoaXMgZmlsdGVycyB0aGUgaXRlbXMgaW4gdGhlIG5lc3RlZCBjb2xsZWN0aW9uLiAqLwotCXByaXZhdGUgRmlsdGVyPEU+IGZpbHRlcjsKLQotCS8qKiBDYWNoZSB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBmaWx0ZXIgKi8KLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248RT4gZmlsdGVyZWRJdGVtczsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYW5kIGEgZmlsdGVyIHRoYXQgc2ltcGx5IGFjY2VwdHMgZXZlcnkgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKGNvbGxlY3Rpb25Ib2xkZXIsIEZpbHRlci5OdWxsLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCBmaWx0ZXIuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyLCBGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy5maWx0ZXJlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFPigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCBhIGZpbHRlciB0aGF0IHNpbXBseSBhY2NlcHRzIGV2ZXJ5IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcikgewotCQl0aGlzKG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+KGxpc3RIb2xkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgZmlsdGVyLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXRoaXMobmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4obGlzdEhvbGRlciksIGZpbHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPEU+KHRoaXMuZmlsdGVyZWRJdGVtcyk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXJlZEl0ZW1zLnNpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyIG92ZXJyaWRlcy9pbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3luY2ggb3VyIGNhY2hlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgY29sbGVjdGlvbiwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmZpbHRlcmVkSXRlbXMsIHRoaXMuZmlsdGVyKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCS8vIGNsZWFyIG91dCB0aGUgY2FjaGUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIGNvbGxlY3Rpb24KLQkJdGhpcy5maWx0ZXJlZEl0ZW1zLmNsZWFyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZmlsdGVyIHRoZSB2YWx1ZXMgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBjaGFuZ2UgZXZlbnQKLQkJdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbih0aGlzLmZpbHRlcih0aGlzLml0ZW1zKGV2ZW50KSksIHRoaXMuZmlsdGVyZWRJdGVtcywgVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvICpub3QqIGZpbHRlciB0aGUgdmFsdWVzLCBiZWNhdXNlIHRoZXkgbWF5IG5vIGxvbmdlciBiZQotCQkvLyAiYWNjZXB0ZWQiIGFuZCB0aGF0IG1pZ2h0IGJlIHdoeSB0aGV5IHdlcmUgcmVtb3ZlZCBpbiB0aGUgZmlyc3QgcGxhY2U7Ci0JCS8vIGFueXdheSwgYW55IGV4dHJhbmVvdXMgaXRlbXMgYXJlIGhhcm1sZXNzCi0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihldmVudC5pdGVtcygpLCB0aGlzLmZpbHRlcmVkSXRlbXMsIFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMuZmlsdGVyZWRJdGVtcywgVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZWJ1aWxkRmlsdGVyZWRJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKLQotCS8qKgotCSAqIENoYW5nZSB0aGUgZmlsdGVyIGFuZCByZWJ1aWxkIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLnJlYnVpbGRGaWx0ZXJlZEl0ZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgZmlsdGVycyB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjxFPiBmaWx0ZXIoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RSwgRT4oaXRlbXMsIHRoaXMuZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSBvdXIgY2FjaGUgd2l0aCB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYnVpbGRGaWx0ZXJlZEl0ZW1zKCkgewotCQl0aGlzLmZpbHRlcmVkSXRlbXMuY2xlYXIoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmZpbHRlcmVkSXRlbXMsIHRoaXMuZmlsdGVyKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpKSk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NmNjMzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIDxjb2RlPlByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gYW5kIHVzZXMgYSA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0gKiB0byBkZXRlcm1pbmUgd2hlbiB0aGUgd3JhcHBlZCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZCBieSBjYWxscwotICogdG8gPGNvZGU+dmFsdWUoKTwvY29kZT4uCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+RmlsdGVyPC9jb2RlPiwgYSBzdWJjbGFzcwotICogb2YgPGNvZGU+RmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiBjYW4gb3ZlcnJpZGUgdGhlCi0gKiA8Y29kZT5hY2NlcHQoT2JqZWN0KTwvY29kZT4gbWV0aG9kLgotICogPHA+Ci0gKiBPbmUsIHBvc3NpYmx5IHVuZGVzaXJhYmxlLCBzaWRlLWVmZmVjdCBvZiB1c2luZyB0aGlzIHZhbHVlIG1vZGVsIGlzIHRoYXQKLSAqIGl0IG11c3QgcmV0dXJuICpzb21ldGhpbmcqIGFzIHRoZSB2YWx1ZS4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMKLSAqIHRvIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuZXZlciB0aGUgd3JhcHBlZCB2YWx1ZSBpcyBub3QgImFjY2VwdGVkIiwKLSAqIHdoaWNoIGNhbiBiZSBjb25maWd1cmVkIGFuZC9vciBvdmVycmlkZGVuLgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQ+Ci0JaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLXsKLQlwcm90ZWN0ZWQgZmluYWwgRmlsdGVyPFQ+IGZpbHRlcjsKLQlwcm90ZWN0ZWQgZmluYWwgVCBkZWZhdWx0VmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+Ci0JICogbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSA8Y29kZT5GaWx0ZXI8L2NvZGU+LgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHZhbHVlSG9sZGVyKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIEZpbHRlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwsIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLCBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+Ci0JICogbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0JICogPGVtPmFuZDwvZW0+IHlvdSBuZWVkIHRvIHNwZWNpZnkKLQkgKiBhIGRlZmF1bHQgdmFsdWUgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gdmFsdWVIb2xkZXIsIFQgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIEZpbHRlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGZpbHRlci4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiB2YWx1ZUhvbGRlciwgRmlsdGVyPFQ+IGZpbHRlcikgewotCQl0aGlzKHZhbHVlSG9sZGVyLCBmaWx0ZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwsIGZpbHRlciwgYW5kIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHZhbHVlSG9sZGVyLCBGaWx0ZXI8VD4gZmlsdGVyLCBUIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXJWYWx1ZSh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGZpbHRlciB0aGUgdmFsdWVzIGJlZm9yZSBwcm9wYWdhdGluZyB0aGUgY2hhbmdlIGV2ZW50Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmZpbHRlclZhbHVlKChUKSBldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZmlsdGVyVmFsdWUoKFQpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyAiYWNjZXB0ZWQiIHNpbXBseSByZXR1cm4gaXQsCi0JICogb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVCBmaWx0ZXJWYWx1ZShUIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmFjY2VwdCh2YWx1ZSkgPyB2YWx1ZSA6IHRoaXMuZGVmYXVsdFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIDxjb2RlPkZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gc2hvdWxkCi0JICogcmV0dXJuIHRoZSBzcGVjaWZpZWQgdmFsdWUgZnJvbSBhIGNhbGwgdG8gdGhlCi0JICogPGNvZGU+dmFsdWUoKTwvY29kZT4gbWV0aG9kOyB0aGUgdmFsdWUgY2FtZQotCSAqIGZyb20gdGhlIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbAotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIDxjb2RlPkZpbHRlcjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFQgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuZmlsdGVyLmFjY2VwdCh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgaWYKLQkgKiB0aGUgbmVzdGVkIHZhbHVlIHdhcyByZWplY3RlZCBieSB0aGUgZmlsdGVyLgotCSAqIFRoZSBkZWZhdWx0IGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBUIGRlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlMjBmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmlkaUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiA8Y29kZT5Xcml0YWJlbFByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gYW5kIHVzZXMgYSA8Y29kZT5CaWRpRmlsdGVyPC9jb2RlPgotICogdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQgYnkgY2FsbHMKLSAqIHRvIDxjb2RlPnZhbHVlKCk8L2NvZGU+IGFuZCBtb2RpZmllZCBieSBjYWxscyB0bwotICogPGNvZGU+c2V0VmFsdWUoT2JqZWN0KTwvY29kZT4uCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+QmlkaUZpbHRlcjwvY29kZT4sIGEgc3ViY2xhc3MKLSAqIG9mIDxjb2RlPkZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiBjYW4gb3ZlcnJpZGUgdGhlCi0gKiA8Y29kZT5hY2NlcHQoT2JqZWN0KTwvY29kZT4gYW5kIDxjb2RlPnJldmVyc2VBY2NlcHQoT2JqZWN0KTwvY29kZT4KLSAqIG1ldGhvZHMuCi0gKiA8cD4KLSAqIE9uZSwgcG9zc2libHkgdW5kZXNpcmFibGUsIHNpZGUtZWZmZWN0IG9mIHVzaW5nIHRoaXMgdmFsdWUgbW9kZWwgaXMgdGhhdAotICogaXQgbXVzdCByZXR1cm4gKnNvbWV0aGluZyogYXMgdGhlIHZhbHVlLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcwotICogdG8gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHdoZW5ldmVyIHRoZSB3cmFwcGVkIHZhbHVlIGlzIG5vdCAiYWNjZXB0ZWQiLAotICogd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgYW5kL29yIG92ZXJyaWRkZW4uCi0gKiA8cD4KLSAqIFNpbWlsYXJseSwgaWYgYW4gaW5jb21pbmcgdmFsdWUgaXMgbm90ICJyZXZlcnNlQWNjZXB0ZWQiLCAqbm90aGluZyogd2lsbCBwYXNzZWQKLSAqIHRocm91Z2ggdG8gdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyLCBub3QgZXZlbiA8Y29kZT5udWxsPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+IGFuZCA8Y29kZT5yZXZlcnNlQWNjZXB0KE9iamVjdCk8L2NvZGU+Ci0JICogbWV0aG9kcyBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgPGNvZGU+QmlkaUZpbHRlcjwvY29kZT4uCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgQmlkaUZpbHRlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwsIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLCBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+IGFuZCA8Y29kZT5yZXZlcnNlQWNjZXB0KE9iamVjdCk8L2NvZGU+Ci0JICogbWV0aG9kcyBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgPGNvZGU+QmlkaUZpbHRlcjwvY29kZT4KLQkgKiA8ZW0+YW5kPC9lbT4geW91IG5lZWQgdG8gc3BlY2lmeQotCSAqIGEgZGVmYXVsdCB2YWx1ZSBvdGhlciB0aGFuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgVCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgQmlkaUZpbHRlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGZpbHRlci4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgQmlkaUZpbHRlcjxUPiBmaWx0ZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgZmlsdGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsLCBmaWx0ZXIsIGFuZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgQmlkaUZpbHRlcjxUPiBmaWx0ZXIsIFQgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyLCBmaWx0ZXIsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsKLQkJaWYgKHRoaXMucmV2ZXJzZUFjY2VwdCh2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWVIb2xkZXIoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgPGNvZGU+RmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+Ci0JICogc2hvdWxkIHBhc3MgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIHRoZSBuZXN0ZWQKLQkgKiB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBpbiBhIGNhbGwgdG8gdGhlCi0JICogPGNvZGU+c2V0VmFsdWUoT2JqZWN0KTwvY29kZT4gbWV0aG9kCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+QmlkaUZpbHRlcjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV2ZXJzZUFjY2VwdChUIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmdldEZpbHRlcigpLnJldmVyc2VBY2NlcHQodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvcnMgYWNjZXB0IG9ubHkgYSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiAoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9ycyBhY2NlcHQgb25seSBhIGJpZGlyZWN0aW9uYWwgZmlsdGVyLgotCSAqLwotCXByb3RlY3RlZCBCaWRpRmlsdGVyPFQ+IGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIChCaWRpRmlsdGVyPFQ+KSB0aGlzLmZpbHRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzg2ZGJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db3VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQWJzdHJhY3QgbGlzdCB2YWx1ZSBtb2RlbCB0aGF0IHByb3ZpZGVzIGJlaGF2aW9yIGZvciB3cmFwcGluZyBhIGxpc3QgdmFsdWUKLSAqIG1vZGVsIChvciBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsKSBhbmQgbGlzdGVuaW5nIGZvciBjaGFuZ2VzIHRvIGFzcGVjdHMgb2YgdGhlCi0gKiAqaXRlbXMqIGhlbGQgYnkgdGhlIGxpc3QgKG9yIGNvbGxlY3Rpb24pLiBDaGFuZ2VzIHRvIHRoZSBhY3R1YWwgbGlzdAotICogKG9yIGNvbGxlY3Rpb24pIGFyZSBhbHNvIG1vbml0b3JlZC4KLSAqIAotICogVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBjb2xsZWN0aW9uIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIG1vZGlmaWVkIGJ5IGFkZGluZwotICogb3IgcmVtb3ZpbmcgaXRlbXMgb3IgdGhlIGl0ZW1zIHRoZW1zZWx2ZXMgbWlnaHQgY2hhbmdlIGluIGEgZmFzaGlvbiB0aGF0Ci0gKiBtaWdodCBjaGFuZ2UgdGhlIGNvbGxlY3Rpb24ncyBleHRlcm5hbCBhcHBlYXJhbmNlLgotICogCi0gKiBTdWJjbGFzc2VzIG5lZWQgdG8gb3ZlcnJpZGUgdHdvIG1ldGhvZHM6Ci0gKiAKLSAqICNsaXN0ZW5Ub0l0ZW0oTW9kZWwpCi0gKiAgICAgYmVnaW4gbGlzdGVuaW5nIHRvIHRoZSBhcHByb3ByaWF0ZSBhc3BlY3Qgb2YgdGhlIHNwZWNpZmllZCBpdGVtIGFuZCBjYWxsCi0gKiAgICAgI2l0ZW1Bc3BlY3RDaGFuZ2VkKE9iamVjdCkgd2hlbmV2ZXIgdGhlIGFzcGVjdCBjaGFuZ2VzCi0gKiAKLSAqICNzdG9wTGlzdGVuaW5nVG9JdGVtKE1vZGVsKQotICogICAgIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBhcHByb3ByaWF0ZSBhc3BlY3Qgb2YgdGhlIHNwZWNpZmllZCBpdGVtCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0KLQkvKioKLQkgKiBNYWludGFpbiBhIGNvdW50ZXIgZm9yIGVhY2ggb2YgdGhlIGl0ZW1zIGluIHRoZQotCSAqIHdyYXBwZWQgbGlzdCBob2xkZXIgd2UgYXJlIGxpc3RlbmluZyB0by4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSWRlbnRpdHlIYXNoTWFwPEUsIENvdW50ZXI+IGNvdW50ZXJzOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5jb3VudGVycyA9IG5ldyBJZGVudGl0eUhhc2hNYXA8RSwgQ291bnRlcj4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBjb2xsZWN0aW9uIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyIGFuZCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCXRoaXMuZW5nYWdlQWxsSXRlbXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VBbGxJdGVtcygpIHsKLQkJdGhpcy5lbmdhZ2VJdGVtcyh0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbXMoSXRlcmF0b3I8PyBleHRlbmRzIEU+IHN0cmVhbSkgewotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJdGhpcy5lbmdhZ2VJdGVtKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbShFIGl0ZW0pIHsKLQkJLy8gbGlzdGVuIHRvIGFuIGl0ZW0gb25seSBvbmNlCi0JCUNvdW50ZXIgY291bnRlciA9IHRoaXMuY291bnRlcnMuZ2V0KGl0ZW0pOwotCQlpZiAoY291bnRlciA9PSBudWxsKSB7Ci0JCQljb3VudGVyID0gbmV3IENvdW50ZXIoKTsKLQkJCXRoaXMuY291bnRlcnMucHV0KGl0ZW0sIGNvdW50ZXIpOwotCQkJdGhpcy5zdGFydExpc3RlbmluZ1RvSXRlbSgoTW9kZWwpIGl0ZW0pOwotCQl9Ci0JCWNvdW50ZXIuaW5jcmVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlbS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzdGFydExpc3RlbmluZ1RvSXRlbShNb2RlbCBpdGVtKTsKLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlciBhbmQgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmRpc2VuZ2FnZUFsbEl0ZW1zKCk7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlQWxsSXRlbXMoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlSXRlbXModGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW1zKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBzdHJlYW0pIHsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlSXRlbShzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW0oRSBpdGVtKSB7Ci0JCS8vIHN0b3AgbGlzdGVuaW5nIHRvIGFuIGl0ZW0gb25seSBvbmNlCi0JCUNvdW50ZXIgY291bnRlciA9IHRoaXMuY291bnRlcnMuZ2V0KGl0ZW0pOwotCQlpZiAoY291bnRlciA9PSBudWxsKSB7Ci0JCQkvLyBzb21ldGhpbmcgaXMgd3JvbmcgaWYgdGhpcyBoYXBwZW5zLi4uICB+Ymp2Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtaXNzaW5nIGNvdW50ZXI6ICIgKyBpdGVtKTsKLQkJfQotCQlpZiAoY291bnRlci5kZWNyZW1lbnQoKSA9PSAwKSB7Ci0JCQl0aGlzLmNvdW50ZXJzLnJlbW92ZShpdGVtKTsKLQkJCXRoaXMuc3RvcExpc3RlbmluZ1RvSXRlbSgoTW9kZWwpIGl0ZW0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVtLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHN0b3BMaXN0ZW5pbmdUb0l0ZW0oTW9kZWwgaXRlbSk7Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIEZvcndhcmQgdGhlIGV2ZW50IGFuZCBiZWdpbiBsaXN0ZW5pbmcgdG8gdGhlIGFkZGVkIGl0ZW1zLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHJlLWZpcmUgZXZlbnQgd2l0aCB0aGUgd3JhcHBlciBhcyB0aGUgc291cmNlCi0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuZW5nYWdlSXRlbXModGhpcy5pdGVtcyhldmVudCkpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSByZW1vdmVkIGl0ZW1zIGFuZCBmb3J3YXJkIHRoZSBldmVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZGlzZW5nYWdlSXRlbXModGhpcy5pdGVtcyhldmVudCkpOwotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgcmVtb3ZlZCBpdGVtcywgZm9yd2FyZCB0aGUgZXZlbnQsCi0JICogYW5kIGJlZ2luIGxpc3RlbmluZyB0byB0aGUgYWRkZWQgaXRlbXMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyh0aGlzLnJlcGxhY2VkSXRlbXMoZXZlbnQpKTsKLQkJLy8gcmUtZmlyZSBldmVudCB3aXRoIHRoZSB3cmFwcGVyIGFzIHRoZSBzb3VyY2UKLQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcywgTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5lbmdhZ2VJdGVtcyh0aGlzLml0ZW1zKGV2ZW50KSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBObyBuZWVkIHRvIGNoYW5nZSBhbnkgbGlzdGVuZXJzOyBqdXN0IGZvcndhcmQgdGhlIGV2ZW50LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHJlLWZpcmUgZXZlbnQgd2l0aCB0aGUgd3JhcHBlciBhcyB0aGUgc291cmNlCi0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBob2xkZXIgd2FzIGNsZWFyZWQuCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHJlbW92ZWQgaXRlbXMgYW5kIGZvcndhcmQgdGhlIGV2ZW50LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyB3ZSBzaG91bGQgb25seSBuZWVkIHRvIGRpc2VuZ2FnZSBlYWNoIGl0ZW0gb25jZS4uLgotCQkvLyBtYWtlIGEgY29weSB0byBwcmV2ZW50IGEgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbgotCQlDb2xsZWN0aW9uPEU+IGtleXMgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMuY291bnRlcnMua2V5U2V0KCkpOwotCQl0aGlzLmRpc2VuZ2FnZUl0ZW1zKGtleXMuaXRlcmF0b3IoKSk7Ci0JCXRoaXMuY291bnRlcnMuY2xlYXIoKTsKLQkJLy8gcmUtZmlyZSBldmVudCB3aXRoIHRoZSB3cmFwcGVyIGFzIHRoZSBzb3VyY2UKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQoTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIGhhcyBjaGFuZ2VkIGluIHNvbWUgZHJhbWF0aWMgZmFzaGlvbi4KLQkgKiBSZWNvbmZpZ3VyZSBvdXIgbGlzdGVuZXJzIGFuZCBmb3J3YXJkIHRoZSBldmVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2Ugc2hvdWxkIG9ubHkgbmVlZCB0byBkaXNlbmdhZ2UgZWFjaCBpdGVtIG9uY2UuLi4KLQkJLy8gbWFrZSBhIGNvcHkgdG8gcHJldmVudCBhIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkJQ29sbGVjdGlvbjxFPiBrZXlzID0gbmV3IEFycmF5TGlzdDxFPih0aGlzLmNvdW50ZXJzLmtleVNldCgpKTsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyhrZXlzLml0ZXJhdG9yKCkpOwotCQl0aGlzLmNvdW50ZXJzLmNsZWFyKCk7Ci0JCS8vIHJlLWZpcmUgZXZlbnQgd2l0aCB0aGUgd3JhcHBlciBhcyB0aGUgc291cmNlCi0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTKTsKLQkJdGhpcy5lbmdhZ2VBbGxJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpdGVtIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlbSBoYXMgYSBib3VuZCBwcm9wZXJ0eSB0aGF0IGhhcyBjaGFuZ2VkLgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtQXNwZWN0Q2hhbmdlZChFdmVudE9iamVjdCBldmVudCkgewotCQlPYmplY3QgaXRlbSA9IGV2ZW50LmdldFNvdXJjZSgpOwotCQlpbnQgaW5kZXggPSB0aGlzLmxhc3RJZGVudGl0eUluZGV4T2YoaXRlbSk7Ci0JCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJdGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChpbmRleCwgaXRlbSk7Ci0JCQlpbmRleCA9IHRoaXMubGFzdElkZW50aXR5SW5kZXhPZihpdGVtLCBpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZW0gaGFzIGEgYm91bmQgcHJvcGVydHkgdGhhdCBoYXMgY2hhbmdlZC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbUFzcGVjdENoYW5nZWQoaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWQoTElTVF9WQUxVRVMsIGluZGV4LCBpdGVtLCBpdGVtKTsJCS8vIGhtbW0uLi4KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBpdGVtLCB1c2luZyBvYmplY3QKLQkgKiBpZGVudGl0eSBpbnN0ZWFkIG9mIGVxdWFsaXR5LgotCSAqLwotCXByb3RlY3RlZCBpbnQgbGFzdElkZW50aXR5SW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5sYXN0SWRlbnRpdHlJbmRleE9mKG8sIHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGl0ZW0sIHN0YXJ0aW5nIGp1c3QgYmVmb3JlIHRoZQotCSAqIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQsIGFuZCB1c2luZyBvYmplY3QgaWRlbnRpdHkgaW5zdGVhZCBvZiBlcXVhbGl0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGxhc3RJZGVudGl0eUluZGV4T2YoT2JqZWN0IG8sIGludCBlbmQpIHsKLQkJZm9yIChpbnQgaSA9IGVuZDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAodGhpcy5saXN0SG9sZGVyLmdldChpKSA9PSBvKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0NmE3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlciB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgY29sbGVjdGlvbgotICogYXNwZWN0cyBvZiBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBpdGVtcycgY29sbGVjdGlvbnMgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIGNvbGxlY3Rpb25OYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGl0ZW1Db2xsZWN0aW9uTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gQ29sbGVjdGlvbnMuCi0JICovCi0JcHVibGljIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsIFN0cmluZy4uLiBjb2xsZWN0aW9uTmFtZXMpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMuY29sbGVjdGlvbk5hbWVzID0gY29sbGVjdGlvbk5hbWVzOwotCQl0aGlzLml0ZW1Db2xsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbUNvbGxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gQ29sbGVjdGlvbnMuCi0JICovCi0JcHVibGljIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNvbGxlY3Rpb25Ib2xkZXIsIFN0cmluZy4uLiBjb2xsZWN0aW9uTmFtZXMpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSwgY29sbGVjdGlvbk5hbWVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsIHdlIHJlYWxseSBjYXJlIGFib3V0IGlzIHRoZSBmYWN0IHRoYXQgYSBDb2xsZWN0aW9uIGFzcGVjdCBoYXMgCi0JICogY2hhbmdlZC4gIERvIHRoZSBzYW1lIHRoaW5nIG5vIG1hdHRlciB3aGljaCBldmVudCBvY2N1cnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZEl0ZW1Db2xsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtIGNvbGxlY3Rpb24gbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuY29sbGVjdGlvbk5hbWVzKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnRMaXN0ZW5pbmdUb0l0ZW0oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBjb2xsZWN0aW9uTmFtZSA6IHRoaXMuY29sbGVjdGlvbk5hbWVzKSB7Ci0JCQlpdGVtLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgdGhpcy5pdGVtQ29sbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN0b3BMaXN0ZW5pbmdUb0l0ZW0oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBjb2xsZWN0aW9uTmFtZSA6IHRoaXMuY29sbGVjdGlvbk5hbWVzKSB7Ci0JCQlpdGVtLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgdGhpcy5pdGVtQ29sbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzYWM2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIgdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlIGxpc3QKLSAqIGFzcGVjdHMgb2YgZWFjaCBpdGVtIGluIHRoZSB3cmFwcGVkIGxpc3QgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotewotCi0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgc3ViamVjdCdzIGxpc3RzIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBsaXN0TmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBpdGVtTGlzdExpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIExpc3QgYXNwZWN0cy4KLQkgKi8KLQlwdWJsaWMgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgU3RyaW5nLi4uIGxpc3ROYW1lcykgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5saXN0TmFtZXMgPSBsaXN0TmFtZXM7Ci0JCXRoaXMuaXRlbUxpc3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtTGlzdExpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBMaXN0IGFzcGVjdHMuCi0JICovCi0JcHVibGljIEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNvbGxlY3Rpb25Ib2xkZXIsIFN0cmluZy4uLiBsaXN0TmFtZXMpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSwgbGlzdE5hbWVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsIHdlIHJlYWxseSBjYXJlIGFib3V0IGlzIHRoZSBmYWN0IHRoYXQgdGhlIExpc3QgYXNwZWN0IGhhcyAKLQkgKiBjaGFuZ2VkLiAgRG8gdGhlIHNhbWUgdGhpbmcgbm8gbWF0dGVyIHdoaWNoIGV2ZW50IG9jY3Vycy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbUxpc3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbSBsaXN0IGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmxpc3ROYW1lcyk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzdGFydExpc3RlbmluZ1RvSXRlbShNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCWl0ZW0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLml0ZW1MaXN0TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc3RvcExpc3RlbmluZ1RvSXRlbShNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLml0ZW1MaXN0TGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMDAwNzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIgdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlCi0gKiBwcm9wZXJ0aWVzIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBpdGVtcycgcHJvcGVydGllcyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpdGVtUHJvcGVydHlMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgU3RyaW5nLi4uIHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJvcGVydHlOYW1lcyA9IHByb3BlcnR5TmFtZXM7Ci0JCXRoaXMuaXRlbVByb3BlcnR5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbVByb3BlcnR5TGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjb2xsZWN0aW9uSG9sZGVyLCBTdHJpbmcuLi4gcHJvcGVydHlOYW1lcykgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCBwcm9wZXJ0eU5hbWVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtUHJvcGVydHlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtIHByb3BlcnR5IGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5wcm9wZXJ0eU5hbWVzKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0TGlzdGVuaW5nVG9JdGVtKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKSB7Ci0JCQlpdGVtLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLml0ZW1Qcm9wZXJ0eUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN0b3BMaXN0ZW5pbmdUb0l0ZW0oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMuaXRlbVByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZDdkODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlciB0byBsaXN0ZW4gdG8gdGhlCi0gKiAic3RhdGUiIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGl0ZW1TdGF0ZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIGl0ZW0gc3RhdGUuCi0JICovCi0JcHVibGljIEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLml0ZW1TdGF0ZUxpc3RlbmVyID0gdGhpcy5idWlsZEl0ZW1TdGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBpdGVtIHN0YXRlLgotCSAqLwotCXB1YmxpYyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtU3RhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtIHN0YXRlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0TGlzdGVuaW5nVG9JdGVtKE1vZGVsIGl0ZW0pIHsKLQkJaXRlbS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuaXRlbVN0YXRlTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN0b3BMaXN0ZW5pbmdUb0l0ZW0oTW9kZWwgaXRlbSkgewotCQlpdGVtLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5pdGVtU3RhdGVMaXN0ZW5lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmNjNzcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyIHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZSB0cmVlCi0gKiBhc3BlY3RzIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLXsKLQotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIGl0ZW1zJyB0cmVlIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSB0cmVlTmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciBpdGVtVHJlZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIHRyZWVzLgotCSAqLwotCXB1YmxpYyBJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBTdHJpbmcuLi4gdHJlZU5hbWVzKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnRyZWVOYW1lcyA9IHRyZWVOYW1lczsKLQkJdGhpcy5pdGVtVHJlZUxpc3RlbmVyID0gdGhpcy5idWlsZEl0ZW1UcmVlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIHRyZWVzLgotCSAqLwotCXB1YmxpYyBJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjb2xsZWN0aW9uSG9sZGVyLCBTdHJpbmcuLi4gdHJlZU5hbWVzKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4oY29sbGVjdGlvbkhvbGRlciksIHRyZWVOYW1lcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbCB3ZSByZWFsbHkgY2FyZSBhYm91dCBpcyB0aGUgZmFjdCB0aGF0IGEgdHJlZSBhc3BlY3QgaGFzIAotCSAqIGNoYW5nZWQuICBEbyB0aGUgc2FtZSB0aGluZyBubyBtYXR0ZXIgd2hpY2ggZXZlbnQgb2NjdXJzLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtVHJlZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyZWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW0gdHJlZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy50cmVlTmFtZXMpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzdGFydExpc3RlbmluZ1RvSXRlbShNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCWl0ZW0uYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLml0ZW1UcmVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc3RvcExpc3RlbmluZ1RvSXRlbShNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLml0ZW1UcmVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTAwNGZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGV4dGVuc2lvbiBvZiBBc3BlY3RBZGFwdGVyIHByb3ZpZGVzIExpc3RDaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgYWxsb3dzIHVzIHRvIGNvbnZlcnQgYSBzZXQgb2Ygb25lIG9yIG1vcmUgY29sbGVjdGlvbnMgaW50bwotICogYSBzaW5nbGUgY29sbGVjdGlvbiwgTElTVF9WQUxVRVMuCi0gKiAKLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogI2xpc3RJdGVyYXRvcl8oKQotICogICAgIGF0IHRoZSB2ZXJ5IG1pbmltdW0sIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiBhIGxpc3QgaXRlcmF0b3IKLSAqICAgICBvbiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0OyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICAjbGlzdEl0ZXJhdG9yKCkgaXMgb3ZlcnJpZGRlbiBhbmQgaXRzIGJlaGF2aW9yIGNoYW5nZWQKLSAqICNnZXQoaW50KQotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKLSAqICNzaXplXygpCi0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZTsgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVuIGlmCi0gKiAgICAgI3NpemUoKSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogI2xpc3RJdGVyYXRvcigpCi0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb25seSBpZiByZXR1cm5pbmcgYW4gZW1wdHkgbGlzdCBpdGVyYXRvciB3aGVuIHRoZQotICogICAgIHN1YmplY3QgaXMgbnVsbCBpcyB1bmFjY2VwdGFibGUKLSAqICNzaXplKCkKLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHJldHVybmluZyBhIHplcm8gd2hlbiB0aGUKLSAqICAgICBzdWJqZWN0IGlzIG51bGwgaXMgdW5hY2NlcHRhYmxlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXN0QXNwZWN0QWRhcHRlcjxTIGV4dGVuZHMgTW9kZWwsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFM+Ci0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgbGlzdHMgdGhhdCB3ZSB1c2UgZm9yIHRoZSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gbGlzdE5hbWVzOwotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX0xJU1RfTkFNRVMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIExpc3RBc3BlY3RBZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoU3RyaW5nIGxpc3ROYW1lLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RyaW5nW10ge2xpc3ROYW1lfSwgc3ViamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgTGlzdEFzcGVjdEFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBsaXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoU3RyaW5nW10gbGlzdE5hbWVzLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpLCBsaXN0TmFtZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIExpc3RBc3BlY3RBZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIGxpc3RzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIFN0cmluZy4uLiBsaXN0TmFtZXMpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JCXRoaXMubGlzdE5hbWVzID0gbGlzdE5hbWVzOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBMaXN0QXNwZWN0QWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBsaXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gbGlzdE5hbWVzKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgbGlzdE5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0TmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIExpc3RBc3BlY3RBZGFwdGVyIGZvciBhbiAidW5jaGFuZ2luZyIgbGlzdCBpbgotCSAqIHRoZSBzcGVjaWZpZWQgc3ViamVjdC4gVGhpcyBpcyB1c2VmdWwgZm9yIGEgbGlzdCBhc3BlY3QgdGhhdCBkb2VzIG5vdAotCSAqIGNoYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIHN1YmplY3Q7IGJ1dCB0aGUgc3ViamVjdCB3aWxsIGNoYW5nZSwgcmVzdWx0aW5nIGluCi0JICogYSBuZXcgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgRU1QVFlfTElTVF9OQU1FUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QgaGFzIGNoYW5nZWQsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgc3ViamVjdCdzIGxpc3QgY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFIGxpc3QgY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2UgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KExpc3RBc3BlY3RBZGFwdGVyLnRoaXMubGlzdE5hbWVzKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEVtcHR5TGlzdEl0ZXJhdG9yLjxFPmluc3RhbmNlKCkgOiB0aGlzLmxpc3RJdGVyYXRvcl8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI2xpc3RJdGVyYXRvcigpCi0JICovCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3JfKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5nZXQodGhpcy5saXN0SXRlcmF0b3IoKSwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3ViamVjdCA9PSBudWxsID8gMCA6IHRoaXMuc2l6ZV8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoYXQgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICogQHNlZSAjc2l6ZSgpCi0JICovCi0JcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBtYW5pZmVzdGF0aW9uIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLnN1YmplY3QgPT0gbnVsbCA/IEVNUFRZX0FSUkFZIDogdGhpcy50b0FycmF5XygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBtYW5pZmVzdGF0aW9uIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI3RvQXJyYXkoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSB0b0FycmF5XygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5hcnJheSh0aGlzLmxpc3RJdGVyYXRvcigpLCB0aGlzLnNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gTElTVF9WQUxVRVM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgbGlzdE5hbWUgOiB0aGlzLmxpc3ROYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyBsaXN0TmFtZSA6IHRoaXMubGlzdE5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubGlzdE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKSB7Ci0JCQkJc2IuYXBwZW5kKCIsICIpOwotCQkJfQotCQkJc2IuYXBwZW5kKHRoaXMubGlzdE5hbWVzW2ldKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGV2ZW50LmNsb25lV2l0aFNvdXJjZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGV2ZW50LmNsb25lV2l0aFNvdXJjZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQuY2xvbmVXaXRoU291cmNlKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNNb3ZlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQoTElTVF9WQUxVRVMpOyAgLy8gbm90aGluZyBmcm9tIG9yaWdpbmFsIGV2ZW50IHRvIGZvcndhcmQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMpOyAgLy8gbm90aGluZyBmcm9tIG9yaWdpbmFsIGV2ZW50IHRvIGZvcndhcmQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGU3M2E3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSBMaXN0VmFsdWVNb2RlbCBiZWhhdmUgbGlrZQotICogYSByZWFkLW9ubHkgQ29sbGVjdGlvblZhbHVlTW9kZWwsIHNvcnRhLgotICogCi0gKiBXZSBrZWVwIGFuIGludGVybmFsIGNvbGxlY3Rpb24gc29tZXdoYXQgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZCBsaXN0LgotICogCi0gKiBOQjogU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgbGlzdCB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZAotICogbGlzdCB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4gI3NpemUoKSwgdmFsdWUoKSkgd2lsbCBiZSB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50IG9iamVjdHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbnkgZXZlbnRzIGZpcmVkIGJ5IHRoZSBsaXN0IGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIE91ciBpbnRlcm5hbCBjb2xsZWN0aW9uLCB3aGljaCBob2xkcyB0aGUgc2FtZSBlbGVtZW50cyBhcwotCSAqIHRoZSB3cmFwcGVkIGxpc3QuCi0JICovCi0JLy8gd2UgZGVjbGFyZSB0aGlzIGFuIEFycmF5TGlzdCBzbyB3ZSBjYW4gdXNlICNjbG9uZSgpIGFuZCAjZW5zdXJlQ2FwYWNpdHkoaW50KQotCXByb3RlY3RlZCBmaW5hbCBBcnJheUxpc3Q8RT4gY29sbGVjdGlvbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIExpc3RWYWx1ZU1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0SG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PEU+KCk7Ci0JCS8vIHBvc3Rwb25lIGJ1aWxkaW5nIHRoZSBjb2xsZWN0aW9uIGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbGlzdAotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3MsIFZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBoYXMgY2hhbmdlZCwgZm9yd2FyZCBhbiBlcXVpdmFsZW50Ci0JICogY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnQgdG8gb3VyIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCS8vIHRyeSB0byBwcmV2ZW50IGJhY2tkb29yIG1vZGlmaWNhdGlvbiBvZiB0aGUgbGlzdAotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5jb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlciBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGNvbGxlY3Rpb25OYW1lID09IFZBTFVFUyAmJiB0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCQlpZiAoY29sbGVjdGlvbk5hbWUgPT0gVkFMVUVTICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFZBTFVFUyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGl0ZW0sIHVzaW5nIG9iamVjdAotCSAqIGlkZW50aXR5IGluc3RlYWQgb2YgZXF1YWxpdHkuCi0JICovCi0JcHJvdGVjdGVkIGludCBsYXN0SWRlbnRpdHlJbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxhc3RJZGVudGl0eUluZGV4T2YobywgdGhpcy5jb2xsZWN0aW9uLnNpemUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGl0ZW0sIHN0YXJ0aW5nIGp1c3QgYmVmb3JlIHRoZQotCSAqIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQsIGFuZCB1c2luZyBvYmplY3QgaWRlbnRpdHkgaW5zdGVhZCBvZiBlcXVhbGl0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGxhc3RJZGVudGl0eUluZGV4T2YoT2JqZWN0IG8sIGludCBlbmQpIHsKLQkJZm9yIChpbnQgaSA9IGVuZDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uLmdldChpKSA9PSBvKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRDb2xsZWN0aW9uKCkgewotCQlJdGVyYXRvcjw/IGV4dGVuZHMgRT4gc3RyZWFtID0gdGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCk7Ci0JCS8vIGlmIHRoZSBuZXcgbGlzdCBpcyBlbXB0eSwgZG8gbm90aGluZwotCQlpZiAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJdGhpcy5jb2xsZWN0aW9uLmVuc3VyZUNhcGFjaXR5KHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIGNvbGxlY3Rpb24gKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgY29sbGVjdGlvbiB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlcgotCQl0aGlzLmNvbGxlY3Rpb24uY2xlYXIoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiBpdGVtcyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChMaXN0SXRlcmF0b3I8RT4pIGV2ZW50Lml0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gcmVwbGFjZWRJdGVtcyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChMaXN0SXRlcmF0b3I8RT4pIGV2ZW50LnJlcGxhY2VkSXRlbXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKHRoaXMuaXRlbXMoZXZlbnQpLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSW50ZXJuYWxJdGVtcyhJdGVyYXRvcjxFPiBpdGVtcykgewotCQkvLyB3ZSBoYXZlIHRvIHJlbW92ZSB0aGUgaXRlbXMgaW5kaXZpZHVhbGx5LAotCQkvLyBzaW5jZSB0aGV5IGFyZSBwcm9iYWJseSBub3QgaW4gc2VxdWVuY2UKLQkJd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgewotCQkJT2JqZWN0IHJlbW92ZWRJdGVtID0gaXRlbXMubmV4dCgpOwotCQkJaW50IGluZGV4ID0gdGhpcy5sYXN0SWRlbnRpdHlJbmRleE9mKHJlbW92ZWRJdGVtKTsKLQkJCXRoaXMuY29sbGVjdGlvbi5yZW1vdmUoaW5kZXgpOwotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVkFMVUVTLCByZW1vdmVkSXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlSW50ZXJuYWxJdGVtcyh0aGlzLml0ZW1zKGV2ZW50KSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJbnRlcm5hbEl0ZW1zKHRoaXMucmVwbGFjZWRJdGVtcyhldmVudCkpOwotCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKHRoaXMuaXRlbXMoZXZlbnQpLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZz8gbW92aW5nIGl0ZW1zIGluIGEgbGlzdCBoYXMgbm8gbmV0IGVmZmVjdCBvbiBhIGNvbGxlY3Rpb24uLi4KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gcHV0IGluIGVtcHR5IGNoZWNrIHNvIHdlIGRvbid0IGZpcmUgZXZlbnRzIHVubmVjZXNzYXJpbHkKLQkJaWYgKCAhIHRoaXMuY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuY29sbGVjdGlvbi5jbGVhcigpOwotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNsZWFyZWQoVkFMVUVTKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHN5bmNocm9uaXplIG91ciBpbnRlcm5hbCBjb2xsZWN0aW9uIHdpdGggdGhlIHdyYXBwZWQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gcHV0IGluIGVtcHR5IGNoZWNrIHNvIHdlIGRvbid0IGZpcmUgZXZlbnRzIHVubmVjZXNzYXJpbHkKLQkJaWYgKCAhIHRoaXMuY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJQXJyYXlMaXN0PEU+IHJlbW92ZWRJdGVtcyA9IChBcnJheUxpc3Q8RT4pIHRoaXMuY29sbGVjdGlvbi5jbG9uZSgpOwotCQkJdGhpcy5jb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoVkFMVUVTLCByZW1vdmVkSXRlbXMpOwotCQl9Ci0KLQkJdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJLy8gcHV0IGluIGVtcHR5IGNoZWNrIHNvIHdlIGRvbid0IGZpcmUgZXZlbnRzIHVubmVjZXNzYXJpbHkKLQkJaWYgKCAhIHRoaXMuY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb24pOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q3VyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MjBiNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgZXh0ZW5zaW9uIG9mIEFzcGVjdEFkYXB0ZXIgcHJvdmlkZXMgTGlzdENoYW5nZSBzdXBwb3J0Ci0gKiBieSBhZGFwdGluZyBhIHN1YmplY3QncyBzdGF0ZSBjaGFuZ2UgZXZlbnRzIHRvIGEgbWluaW11bSBzZXQKLSAqIG9mIGxpc3QgY2hhbmdlIGV2ZW50cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExpc3RDdXJhdG9yPFMgZXh0ZW5kcyBNb2RlbCwgRT4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8Uz4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIEhvdyB0aGUgbGlzdCBsb29rZWQgYmVmb3JlIHRoZSBsYXN0IHN0YXRlIGNoYW5nZSAqLwotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEU+IHJlY29yZDsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyBmb3IgdGhlIHN1YmplY3QncyBzdGF0ZSB0byBjaGFuZ2UgKi8KLQlwcml2YXRlIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgc3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgQ3VyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q3VyYXRvcihTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjdXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyLgotCSAqIFRoZSBzdWJqZWN0IGhvbGRlciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEN1cmF0b3IoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQl0aGlzLnJlY29yZCA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQkJdGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHN1YmplY3QncyBzdGF0ZSBoYXMgY2hhbmdlZCwgZG8gaW52ZW50b3J5IGFuZCByZXBvcnQgdG8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q3VyYXRvci50aGlzLnN1Ym1pdEludmVudG9yeVJlcG9ydCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3RhdGUgY2hhbmdlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLnJlY29yZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnJlY29yZC5nZXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVjb3JkLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbWFuaWZlc3RhdGlvbiBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5yZWNvcmQudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIExJU1RfVkFMVUVTOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGFzcGVjdCBoYXMgY2hhbmdlZCwgbm90aWZ5IGxpc3RlbmVycyBhcHByb3ByaWF0ZWx5LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVBc3BlY3RDaGFuZ2UoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGlzIG5vdCBudWxsIC0gYWRkIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIHN5bmNoIG91ciBsaXN0ICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0LAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMucmVjb3JkLCB0aGlzLml0ZXJhdG9yRm9yUmVjb3JkKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGlzIG5vdCBudWxsIC0gcmVtb3ZlIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgbGlzdCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0Ci0JCXRoaXMucmVjb3JkLmNsZWFyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RDdXJhdG9yIHByb3RvY29sICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgZGlmZmVyZW50IGZyb20gI0xpc3RWYWx1ZU1vZGVsLml0ZXJhdG9yKCkuCi0JICogSXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IHdoZW4gdGhlIHN1YmplY3QgY2hhbmdlcyBvciB0aGUKLQkgKiBzdWJqZWN0J3MgInN0YXRlIiBjaGFuZ2VzIChhcyBzaWduaWZpZWQgYnkgYSBzdGF0ZSBjaGFuZ2UgZXZlbnQpLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYXRvcjxFPiBpdGVyYXRvckZvclJlY29yZCgpOwotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXZvaWQgc3VibWl0SW52ZW50b3J5UmVwb3J0KCkgewotCQlMaXN0PEU+IG5ld1JlY29yZCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuaXRlcmF0b3JGb3JSZWNvcmQoKSk7Ci0JCWludCByZWNvcmRJbmRleCA9IDA7Ci0KLQkJLy8gYWRkIGl0ZW1zIGZyb20gdGhlIG5ldyByZWNvcmQKLQkJZm9yIChFIG5ld0l0ZW0gOiBuZXdSZWNvcmQpIHsKLQkJCXRoaXMuaW52ZW50b3J5TmV3SXRlbShyZWNvcmRJbmRleCwgbmV3SXRlbSk7Ci0JCQlyZWNvcmRJbmRleCsrOwotCQl9Ci0KLQkJLy8gY2xlYW4gb3V0IGl0ZW1zIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgbmV3IHJlY29yZAotCQlmb3IgKHJlY29yZEluZGV4ID0gMDsgcmVjb3JkSW5kZXggPCB0aGlzLnJlY29yZC5zaXplKCk7ICkgewotCQkJRSBpdGVtID0gdGhpcy5yZWNvcmQuZ2V0KHJlY29yZEluZGV4KTsKLQotCQkJaWYgKG5ld1JlY29yZC5jb250YWlucyhpdGVtKSkgewotCQkJCXJlY29yZEluZGV4Kys7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMucmVtb3ZlSXRlbUZyb21JbnZlbnRvcnkocmVjb3JkSW5kZXgsIGl0ZW0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludmVudG9yeU5ld0l0ZW0oaW50IHJlY29yZEluZGV4LCBFIG5ld0l0ZW0pIHsKLQkJTGlzdDxFPiByZWMgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMucmVjb3JkKTsKLQotCQlpZiAoKHJlY29yZEluZGV4IDwgcmVjLnNpemUoKSkgJiYgcmVjLmdldChyZWNvcmRJbmRleCkuZXF1YWxzKG5ld0l0ZW0pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHJlYy5jb250YWlucyhuZXdJdGVtKSkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUludmVudG9yeShyZWNvcmRJbmRleCwgcmVjLmdldChyZWNvcmRJbmRleCkpOwotCQkJdGhpcy5pbnZlbnRvcnlOZXdJdGVtKHJlY29yZEluZGV4LCBuZXdJdGVtKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuYWRkSXRlbVRvSW52ZW50b3J5KHJlY29yZEluZGV4LCBuZXdJdGVtKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJdGVtVG9JbnZlbnRvcnkoaW50IGluZGV4LCBFIGl0ZW0pIHsKLQkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBpdGVtLCB0aGlzLnJlY29yZCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVJdGVtRnJvbUludmVudG9yeShpbnQgaW5kZXgsIEUgaXRlbSkgewotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5yZWNvcmQsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzhiNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIHRvIHdyYXAKLSAqIGEgbGlzdCB2YWx1ZSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgY29udmVydAotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gcHJvcGVydHkgdmFsdWUgbW9kZWwgY2hhbmdlCi0gKiBub3RpZmljYXRpb25zLgotICogCi0gKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGU6Ci0gKiAtICNidWlsZFZhbHVlKCkKLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IGxpc3QgdmFsdWUKLSAqIAotICogU3ViY2xhc3NlcyBtaWdodCB3YW50IHRvIG92ZXJyaWRlOgotICogLSAjaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpCi0gKiAtICNpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KQotICogLSAjaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpCi0gKiAtICNpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkKLSAqIC0gI2xpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkKLSAqIC0gI2xpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkKLSAqICAgICB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLXsKLQkvKiogVGhlIHdyYXBwZWQgbGlzdCB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNoIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIExpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9CQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhvbGRlciB3YXMgY2xlYXJlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWI2MDRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIHRvIHdyYXAKLSAqIGFub3RoZXIgbGlzdCB2YWx1ZSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgcHJvcGFnYXRlCi0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLXsKLQotCS8qKiBUaGUgd3JhcHBlZCBsaXN0IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNoIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RIb2xkZXIgPSBsaXN0SG9sZGVyOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzcywgTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFZhbHVlTW9kZWxXcmFwcGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNoYW5nZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4dGVuZCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3ROYW1lID09IExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTICYmIHRoaXMuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG5lc3RlZCBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCQlpZiAobGlzdE5hbWUgPT0gTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMgJiYgdGhpcy5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCS8vIG1pbmltaXplIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEU+IGl0ZW1zKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKExpc3RJdGVyYXRvcjxFPikgZXZlbnQuaXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiByZXBsYWNlZEl0ZW1zKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKExpc3RJdGVyYXRvcjxFPikgZXZlbnQucmVwbGFjZWRJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgbW92ZWQgaW4gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBob2xkZXIgd2FzIGNsZWFyZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGQ5MGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIHJlYWQtb25seSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGZvciB3aGVuIHlvdQotICogZG9uJ3QgbmVlZCB0byBzdXBwb3J0IGEgY29sbGVjdGlvbi4gSW4gcGFydGljdWxhciwgdGhpcwotICogaXMgdXNlZnVsIGZvciB0aGUgbGVhZiBub2RlcyBvZiBhIHRyZWUgdGhhdCBuZXZlciBoYXZlCi0gKiBjaGlsZHJlbi4KLSAqIAotICogV2UgZG9uJ3QgdXNlIGEgc2luZ2xldG9uIGJlY2F1c2Ugd2UgaG9sZCBvbiB0byBsaXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIAlyZXR1cm4gQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsTGlzdFZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsTGlzdFZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5MmVkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGVtcHR5IGxpc3QgdmFsdWUgbW9kZWwgZm9yIHdoZW4geW91IGRvbid0Ci0gKiBuZWVkIHRvIHN1cHBvcnQgYSBsaXN0LgotICogCi0gKiBXZSBkb24ndCB1c2UgYSBzaW5nbGV0b24gYmVjYXVzZSB3ZSBob2xkIG9uIHRvIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBOdWxsTGlzdFZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogMCIpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gRU1QVFlfQVJSQVk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjOWI2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBmb3Igd2hlbiB5b3UKLSAqIGRvbid0IG5lZWQgdG8gc3VwcG9ydCBhIHZhbHVlLgotICogCi0gKiBXZSBkb24ndCB1c2UgYSBzaW5nbGV0b24gYmVjYXVzZSB3ZSBob2xkIG9uIHRvIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIE51bGxQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTnVsbFByb3BlcnR5VmFsdWVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFRyZWVWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFRyZWVWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDM1MzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxUcmVlVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIHRyZWUgdmFsdWUgbW9kZWwgZm9yIHdoZW4geW91Ci0gKiBkb24ndCBuZWVkIHRvIHN1cHBvcnQgYW55IG5vZGVzLgotICogCi0gKiBXZSBkb24ndCB1c2UgYSBzaW5nbGV0b24gYmVjYXVzZSB3ZSBob2xkIG9uIHRvIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIE51bGxUcmVlVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgVHJlZVZhbHVlTW9kZWw8RT4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE51bGxUcmVlVmFsdWVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIFRyZWVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBub2RlcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlOTNkOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlBc3BlY3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgQXNwZWN0QWRhcHRlciBwcm92aWRlcyBiYXNpYyBQcm9wZXJ0eUNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBhbGxvd3MgdXMgdG8gY29udmVydCBhIHNldCBvZiBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIGludG8KLSAqIGEgc2luZ2xlIHByb3BlcnR5LCBWQUxVRS4KLSAqIAotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gKiAjYnVpbGRWYWx1ZV8oKQotICogICAgIGF0IHRoZSB2ZXJ5IG1pbmltdW0sIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCi0gKiAgICAgc3ViamVjdCdzIHByb3BlcnR5IChvciAidmlydHVhbCIgcHJvcGVydHkpOyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlCi0gKiAgICAgb3ZlcnJpZGRlbiBpZiAjYnVpbGRWYWx1ZSgpIGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiAjc2V0VmFsdWVfKE9iamVjdCkKLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGUgY2xpZW50IGNvZGUgbmVlZHMgdG8gKnNldCogdGhlIHZhbHVlIG9mCi0gKiAgICAgdGhlIHN1YmplY3QncyBwcm9wZXJ0eTsgb2Z0ZW50aW1lcywgdGhvdWdoLCB0aGUgY2xpZW50IGNvZGUgKGUuZy4gVUkpCi0gKiAgICAgd2lsbCBuZWVkIG9ubHkgdG8gKmdldCogdGhlIHZhbHVlOyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlCi0gKiAgICAgb3ZlcnJpZGRlbiBpZiAjc2V0VmFsdWUoT2JqZWN0KSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogI2J1aWxkVmFsdWUoKQotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGEgbnVsbCB2YWx1ZSB3aGVuIHRoZSBzdWJqZWN0IGlzIG51bGwKLSAqICAgICBpcyB1bmFjY2VwdGFibGUKLSAqICNzZXRWYWx1ZShPYmplY3QpCi0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb25seSBpZiBzb21ldGhpbmcgbXVzdCBiZSBkb25lIHdoZW4gdGhlIHN1YmplY3QKLSAqICAgICBpcyBudWxsIChlLmcuIHRocm93IGFuIGV4Y2VwdGlvbikKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTIGV4dGVuZHMgTW9kZWwsIFQ+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFM+Ci0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCS8qKgotCSAqIENhY2hlIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBhc3BlY3Qgc28gd2UKLQkgKiBjYW4gcGFzcyBhbiAib2xkIHZhbHVlIiB3aGVuIHdlIGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICogV2UgbmVlZCB0aGlzIGJlY2F1c2UgdGhlIHZhbHVlIG1heSBiZSBjYWxjdWxhdGVkIGFuZCBtYXkKLQkgKiBub3QgYmUgaW4gdGhlIHByb3BlcnR5IGNoYW5nZSBldmVudCBmaXJlZCBieSB0aGUgc3ViamVjdCwKLQkgKiBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIG11bHRpcGxlIGFzcGVjdHMuCi0JICovCi0JcHJvdGVjdGVkIFQgdmFsdWU7Ci0KLQkvKiogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0aWVzIHRoYXQgd2UgdXNlIGZvciB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIHByb3BlcnR5TmFtZXM7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfUFJPUEVSVFlfTkFNRVMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0aWVzIG9mIHRoZSBzdWJqZWN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFByb3BlcnR5QXNwZWN0QWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIHByb3BlcnR5LgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0cmluZ1tdIHtwcm9wZXJ0eU5hbWV9LCBzdWJqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoU3RyaW5nW10gcHJvcGVydHlOYW1lcywgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTPihzdWJqZWN0KSwgcHJvcGVydHlOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgUHJvcGVydHlBc3BlY3RBZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIHByb3BlcnRpZXMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIFN0cmluZy4uLiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQl0aGlzLnByb3BlcnR5TmFtZXMgPSBwcm9wZXJ0eU5hbWVzOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBvdXIgdmFsdWUgaXMgbnVsbCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0Ci0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFByb3BlcnR5QXNwZWN0QWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQl0aGlzKHN1YmplY3RIb2xkZXIsIHByb3BlcnR5TmFtZXMudG9BcnJheShuZXcgU3RyaW5nW3Byb3BlcnR5TmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFByb3BlcnR5QXNwZWN0QWRhcHRlciBmb3IgYW4gInVuY2hhbmdpbmciIHByb3BlcnR5IGluCi0JICogdGhlIHNwZWNpZmllZCBzdWJqZWN0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYSBwcm9wZXJ0eSBhc3BlY3QgdGhhdCBkb2VzIG5vdAotCSAqIGNoYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIHN1YmplY3Q7IGJ1dCB0aGUgc3ViamVjdCB3aWxsIGNoYW5nZSwgcmVzdWx0aW5nIGluCi0JICogYSBuZXcgcHJvcGVydHkuIChBIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsIGNvdWxkIGFsc28gYmUKLQkgKiB1c2VkIGluIHRoaXMgc2l0dWF0aW9uLikKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlcikgewotCQl0aGlzKHN1YmplY3RIb2xkZXIsIEVNUFRZX1BST1BFUlRZX05BTUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHN1YmplY3QncyBwcm9wZXJ0eSBoYXMgY2hhbmdlZCwgbm90aWZ5IHRoZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHN1YmplY3QncyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUUgcHJvcGVydHkgY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVByb3BlcnR5QXNwZWN0QWRhcHRlci50aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIudGhpcy5wcm9wZXJ0eU5hbWVzKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0eS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgVCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKSB7Ci0JCWlmICh0aGlzLnN1YmplY3QgIT0gbnVsbCkgewotCQkJdGhpcy5zZXRWYWx1ZV8odmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ViamVjdCdzIHByb3BlcnR5LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNzZXRWYWx1ZShPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFQgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiBWQUxVRTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFZBTFVFKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0KCkgewotCQlzdXBlci5lbmdhZ2VTdWJqZWN0KCk7Ci0JCS8vIHN5bmNoIG91ciB2YWx1ZSAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgc3ViamVjdCwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0KCkgewotCQlzdXBlci5kaXNlbmdhZ2VTdWJqZWN0KCk7Ci0JCS8vIGNsZWFyIG91dCBvdXIgdmFsdWUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgc3ViamVjdAotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCkgewotCQkJCXNiLmFwcGVuZCgiLCAiKTsKLQkJCX0KLQkJCXNiLmFwcGVuZCh0aGlzLnByb3BlcnR5TmFtZXNbaV0pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNwZWN0J3MgdmFsdWUuCi0JICogQXQgdGhpcyBwb2ludCB0aGUgc3ViamVjdCBtYXkgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgVCBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkVmFsdWVfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3ViamVjdCdzIHByb3BlcnR5LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNidWlsZFZhbHVlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVCBidWlsZFZhbHVlXygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKCkgewotCQlUIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKG9sZCwgdGhpcy52YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGNjMGQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIFByb3BlcnR5VmFsdWVNb2RlbCBiZWhhdmUgbGlrZQotICogYSByZWFkLW9ubHksIHNpbmdsZS1lbGVtZW50IENvbGxlY3Rpb25WYWx1ZU1vZGVsLCBzb3J0YS4KLSAqIAotICogSWYgdGhlIHByb3BlcnR5J3MgdmFsdWUgaXMgbnVsbCwgYW4gZW1wdHkgaXRlcmF0b3IgaXMgcmV0dXJuZWQKLSAqIChpLmUuIHlvdSBjYW4ndCBoYXZlIGEgY29sbGVjdGlvbiB3aXRoIGEgbnVsbCBlbGVtZW50KS4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGUgd3JhcHBlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiB2YWx1ZUhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgZm9yd2FyZHMgYW55IGV2ZW50cyBmaXJlZCBieSB0aGUgdmFsdWUgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBFIHZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgTGlzdFZhbHVlTW9kZWwuCi0JICovCi0JcHVibGljIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZhbHVlSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSB2YWx1ZUhvbGRlcjsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzLCBWQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIHZhbHVlIGhhcyBjaGFuZ2VkLCBmb3J3YXJkIGFuIGVxdWl2YWxlbnQKLQkgKiBjb2xsZWN0aW9uIGNoYW5nZSBldmVudCB0byBvdXIgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMudmFsdWVDaGFuZ2VkKChFKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8KLQkJCQkJRW1wdHlJdGVyYXRvci48RT5pbnN0YW5jZSgpCi0JCQkJOgotCQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KHRoaXMudmFsdWUpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8gMCA6IDE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4dGVuZCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlciBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlciBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChjb2xsZWN0aW9uTmFtZSA9PSBWQUxVRVMgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlciBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCQlpZiAoY29sbGVjdGlvbk5hbWUgPT0gVkFMVUVTICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFZBTFVFUyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTGlzdGVuZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkvLyBzeW5jaCBvdXIgdmFsdWUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlciwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy52YWx1ZSA9IHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSB2YWx1ZSB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogc3luY2hyb25pemUgb3VyIGludGVybmFsIHZhbHVlIHdpdGggdGhlIHdyYXBwZWQgdmFsdWUKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKEUgbmV3VmFsdWUpIHsKLQkJLy8gcHV0IGluICJlbXB0eSIgY2hlY2sgc28gd2UgZG9uJ3QgZmlyZSBldmVudHMgdW5uZWNlc3NhcmlseQotCQlpZiAodGhpcy52YWx1ZSAhPSBudWxsKSB7Ci0JCQlFIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKLQkJCXRoaXMudmFsdWUgPSBudWxsOwotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVkFMVUVTLCBvbGRWYWx1ZSk7Ci0JCX0KLQkJdGhpcy52YWx1ZSA9IG5ld1ZhbHVlOwotCQkvLyBwdXQgaW4gImVtcHR5IiBjaGVjayBzbyB3ZSBkb24ndCBmaXJlIGV2ZW50cyB1bm5lY2Vzc2FyaWx5Ci0JCWlmICh0aGlzLnZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChWQUxVRVMsIHRoaXMudmFsdWUpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZUhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODI2YWY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSBQcm9wZXJ0eVZhbHVlTW9kZWwgYmVoYXZlIGxpa2UKLSAqIGEgcmVhZC1vbmx5LCBzaW5nbGUtZWxlbWVudCBMaXN0VmFsdWVNb2RlbCwgc29ydGEuCi0gKiAKLSAqIElmIHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGlzIG51bGwsIGFuIGVtcHR5IGl0ZXJhdG9yIGlzIHJldHVybmVkCi0gKiAoaS5lLiB5b3UgY2FuJ3QgaGF2ZSBhIGxpc3Qgd2l0aCBhIG51bGwgZWxlbWVudCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQotCS8qKiBUaGUgd3JhcHBlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiB2YWx1ZUhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgZm9yd2FyZHMgYW55IGV2ZW50cyBmaXJlZCBieSB0aGUgdmFsdWUgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBFIHZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwuCi0JICovCi0JcHVibGljIFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZhbHVlSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSB2YWx1ZUhvbGRlcjsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzLCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgdmFsdWUgaGFzIGNoYW5nZWQsIGZvcndhcmQgYW4gZXF1aXZhbGVudAotCSAqIGxpc3QgY2hhbmdlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy52YWx1ZUNoYW5nZWQoKEUpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8KLQkJCQkJRW1wdHlMaXN0SXRlcmF0b3IuPEU+aW5zdGFuY2UoKQotCQkJCToKLQkJCQkJbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4odGhpcy52YWx1ZSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCWlmICh0aGlzLnZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IHRoaXMuaW9vYmUoaW5kZXgsIDApOwotCQl9Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCXRocm93IHRoaXMuaW9vYmUoaW5kZXgsIDEpOwotCQl9Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfT0JKRUNUX0FSUkFZID0gbmV3IE9iamVjdFswXTsKLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8gRU1QVFlfT0JKRUNUX0FSUkFZIDogbmV3IE9iamVjdFtdIHt0aGlzLnZhbHVlfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3ROYW1lID09IExJU1RfVkFMVUVTICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKTsKLQkJaWYgKGxpc3ROYW1lID09IExJU1RfVkFMVUVTICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNMaXN0ZW5lcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW9vYmUoaW50IGluZGV4LCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAiICsgc2l6ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIHN5bmNoIG91ciB2YWx1ZSAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLnZhbHVlID0gdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkvLyBjbGVhciBvdXQgdGhlIHZhbHVlIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlcgotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzeW5jaHJvbml6ZSBvdXIgaW50ZXJuYWwgdmFsdWUgd2l0aCB0aGUgd3JhcHBlZCB2YWx1ZQotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoRSBuZXdWYWx1ZSkgewotCQlFIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkgewotCQkJdGhpcy5maXJlSXRlbUFkZGVkKExJU1RfVkFMVUVTLCAwLCBuZXdWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKExJU1RfVkFMVUVTLCAwLCBvbGRWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChMSVNUX1ZBTFVFUywgMCwgbmV3VmFsdWUsIG9sZFZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWVIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNGU1NTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYW5vdGhlciBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgcHJvcGFnYXRlCi0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi17Ci0KLQkvKiogVGhlIHdyYXBwZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gdmFsdWVIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHZhbHVlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwuIFRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAodmFsdWVIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLnRoaXMudmFsdWVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGNoYW5nZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSkgewotCQkJdGhpcy5lbmdhZ2VWYWx1ZUhvbGRlcigpOwotCQl9Ci0JCXN1cGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUgJiYgdGhpcy5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpIHsKLQkJCXRoaXMuZW5nYWdlVmFsdWVIb2xkZXIoKTsKLQkJfQotCQlzdXBlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG5lc3RlZCBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVZhbHVlSG9sZGVyKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUgJiYgdGhpcy5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlVmFsdWVIb2xkZXIoKTsKLQkJfQotCX0KLQkKLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCS8qKgotCSAqIEJlZ2luIGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlSG9sZGVyKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlSG9sZGVyKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlSG9sZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjQyNjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBhbmQgQ29sbGVjdGlvbiB0aGF0IHNpbXBseSBob2xkcyBhCi0gKiBjb2xsZWN0aW9uIGFuZCBub3RpZmllcyBsaXN0ZW5lcnMgb2YgYW55IGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4sIENvbGxlY3Rpb248RT4KLXsKLQkvKiogVGhlIGNvbGxlY3Rpb24uICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgQ29sbGVjdGlvblZhbHVlTW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgQ29sbGVjdGlvblZhbHVlTW9kZWwgd2l0aCBhbiBlbXB0eSBpbml0aWFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKCkgewotCQl0aGlzKG5ldyBIYXNoQmFnPEU+KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzcywgVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IExvY2FsSXRlcmF0b3I8RT4odGhpcy5jb2xsZWN0aW9uLml0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5zaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5jb250YWlucyhvKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIDxUIGV4dGVuZHMgT2JqZWN0PiBUW10gdG9BcnJheShUW10gYSkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLnRvQXJyYXkoYSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKG8sIHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKG8sIHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5jb250YWluc0FsbChjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbihjLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKGMsIHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKGMsIHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSB0aGlzKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoKG8gaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSAmJiAobyBpbnN0YW5jZW9mIENvbGxlY3Rpb25WYWx1ZU1vZGVsKSkgewotCQkJQ29sbGVjdGlvbjxFPiBjMSA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuY29sbGVjdGlvbik7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUNvbGxlY3Rpb248RT4gYzIgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbigoKENvbGxlY3Rpb248RT4pIG8pLml0ZXJhdG9yKCkpOwotCQkJcmV0dXJuIGMxLmVxdWFscyhjMik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmNvbGxlY3Rpb24pLmhhc2hDb2RlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZGl0aW9uYWwgYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsb3cgdGhlIGNvbGxlY3Rpb24gdG8gYmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sbGVjdGlvbihDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24pIHsKLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmNvbGxlY3Rpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpdGVyYXRvciAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIExvY2FsSXRlcmF0b3I8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7Ci0JCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8VD4gaXRlcmF0b3I7Ci0JCXByaXZhdGUgVCBuZXh0OwotCi0JCUxvY2FsSXRlcmF0b3IoSXRlcmF0b3I8VD4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIFQgbmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLm5leHQgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuZmlyZUl0ZW1SZW1vdmVkKFZBTFVFUywgdGhpcy5uZXh0KTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlTGlzdFZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmFmZTYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBMaXN0VmFsdWVNb2RlbCBhbmQgTGlzdCB0aGF0IHNpbXBseSBob2xkcyBhCi0gKiBjb2xsZWN0aW9uIGFuZCBub3RpZmllcyBsaXN0ZW5lcnMgb2YgYW55IGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4sIExpc3Q8RT4KLXsKLQkvKiogVGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIExpc3Q8RT4gbGlzdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgTGlzdFZhbHVlTW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTGlzdFZhbHVlTW9kZWwoTGlzdDxFPiBsaXN0KSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdCA9IGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgTGlzdFZhbHVlTW9kZWwgd2l0aCBhbiBlbXB0eSBpbml0aWFsIGxpc3QuCi0JICovCi0JcHVibGljIFNpbXBsZUxpc3RWYWx1ZU1vZGVsKCkgewotCQl0aGlzKG5ldyBBcnJheUxpc3Q8RT4oKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzLCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbEl0ZXJhdG9yPEU+KHRoaXMubGlzdC5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbExpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmdldChpbmRleCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5jb250YWlucyhvKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIDxUIGV4dGVuZHMgT2JqZWN0PiBUW10gdG9BcnJheShUW10gYSkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvQXJyYXkoYSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtVG9MaXN0KG8sIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QobywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuY29udGFpbnNBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3QoYywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdChpbmRleCwgYywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KGMsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkxpc3QoYywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMuY2xlYXJMaXN0KHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSB0aGlzKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoKG8gaW5zdGFuY2VvZiBMaXN0KSAmJiAobyBpbnN0YW5jZW9mIExpc3RWYWx1ZU1vZGVsKSkgewotCQkJTGlzdDxFPiBsMSA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUxpc3Q8RT4gbDIgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCgoKExpc3Q8RT4pIG8pLml0ZXJhdG9yKCkpOwotCQkJcmV0dXJuIGwxLmVxdWFscyhsMik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaGFzaENvZGUoKTsKLQl9Ci0KLQlwdWJsaWMgRSBzZXQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRoaXMuc2V0SXRlbUluTGlzdChpbmRleCwgZWxlbWVudCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgRSBlbGVtZW50KSB7Ci0JCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgZWxlbWVudCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIEUgcmVtb3ZlKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmluZGV4T2Yobyk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxhc3RJbmRleE9mKG8pOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IExvY2FsTGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdC5saXN0SXRlcmF0b3IoaW5kZXgpKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxFPiBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCS8vIFRPRE8gaG1tbSAgfmJqdgotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkaXRpb25hbCBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGxvdyB0aGUgbGlzdCB0byBiZSByZXBsYWNlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0KExpc3Q8RT4gbGlzdCkgewotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3QgPSBsaXN0OwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBhIHNpbmdsZSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5tb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIE1vdmUgYSBzdWItbGlzdCBvZiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMubW92ZUl0ZW1zSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSByYW5nZSBvZiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChpbmRleCwgbGVuZ3RoLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSByYW5nZSBvZiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBMaXN0PEU+IGVsZW1lbnRzKSB7Ci0JCXRoaXMuc2V0SXRlbXNJbkxpc3QoaW5kZXgsIGVsZW1lbnRzLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmxpc3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpdGVyYXRvcnMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbEl0ZXJhdG9yPFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4gewotCQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOwotCQlwcml2YXRlIGludCBpbmRleCA9IC0xOwotCQlwcml2YXRlIFQgbmV4dDsKLQotCQlMb2NhbEl0ZXJhdG9yKEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCi0JCXB1YmxpYyBUIG5leHQoKSB7Ci0JCQl0aGlzLm5leHQgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJCXRoaXMuaW5kZXgrKzsKLQkJCXJldHVybiB0aGlzLm5leHQ7Ci0JCX0KLQotCQlAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRoaXMuaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQlTaW1wbGVMaXN0VmFsdWVNb2RlbC50aGlzLmZpcmVJdGVtUmVtb3ZlZChMSVNUX1ZBTFVFUywgdGhpcy5pbmRleCwgdGhpcy5uZXh0KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbExpc3RJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxUPiB7Ci0JCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOwotCQlwcml2YXRlIGludCBsYXN0ID0gLTE7Ci0JCXByaXZhdGUgaW50IG5leHQgPSAwOwotCQlwcml2YXRlIFQgY3VycmVudDsKLQotCQlMb2NhbExpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8VD4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIFQgbmV4dCgpIHsKLQkJCXRoaXMuY3VycmVudCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCQkJdGhpcy5sYXN0ID0gdGhpcy5uZXh0Kys7Ci0JCQlyZXR1cm4gdGhpcy5jdXJyZW50OwotCQl9Ci0KLQkJcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0SW5kZXgoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQkJfQotCi0JCXB1YmxpYyBUIHByZXZpb3VzKCkgewotCQkJdGhpcy5jdXJyZW50ID0gdGhpcy5pdGVyYXRvci5wcmV2aW91cygpOwotCQkJdGhpcy5sYXN0ID0gLS10aGlzLm5leHQ7Ci0JCQlyZXR1cm4gdGhpcy5jdXJyZW50OwotCQl9Ci0KLQkJcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQlwdWJsaWMgdm9pZCBzZXQoVCBvKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnNldChvKTsKLQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsLnRoaXMuZmlyZUl0ZW1SZXBsYWNlZChMSVNUX1ZBTFVFUywgdGhpcy5sYXN0LCBvLCB0aGlzLmN1cnJlbnQpOwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQlwdWJsaWMgdm9pZCBhZGQoVCBvKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLmFkZChvKTsKLQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsLnRoaXMuZmlyZUl0ZW1BZGRlZChMSVNUX1ZBTFVFUywgdGhpcy5uZXh0LCBvKTsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsLnRoaXMuZmlyZUl0ZW1SZW1vdmVkKExJU1RfVkFMVUVTLCB0aGlzLmxhc3QsIHRoaXMuY3VycmVudCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzI0OGU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgc2ltcGx5IGhvbGRzIG9uIHRvIGFuCi0gKiBvYmplY3QgYW5kIHVzZXMgaXQgYXMgdGhlIHZhbHVlLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCS8qKiBUaGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIFQgdmFsdWU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFByb3BlcnR5VmFsdWVNb2RlbCBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsKFQgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFByb3BlcnR5VmFsdWVNb2RlbCB3aXRoIGEgc3RhcnRpbmcgdmFsdWUgb2YgbnVsbC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIFZBTFVFKTsKLQl9Ci0KLQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKSB7Ci0JCVQgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTEyYjlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIDxjb2RlPkNvbGxlY3Rpb25WYWx1ZU1vZGVsPC9jb2RlPgotICogKG9yIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPikgYmVoYXZlIGxpa2UgYSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4KLSAqIHRoYXQga2VlcHMgaXRzIGNvbnRlbnRzIHNvcnRlZCBhbmQgbm90aWZpZXMgbGlzdGVuZXJzIGFwcHJvcHJpYXRlbHkuCi0gKiA8cD4KLSAqIFRoZSBjb21wYXJhdG9yIGNhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lOyBhbGxvd2luZyB0aGUgc2FtZQotICogYWRhcHRlciB0byBiZSB1c2VkIHdpdGggZGlmZmVyZW50IHNvcnQgY3JpdGVyaWEgKGUuZy4gd2hlbiB0aGUgdXNlcgotICogd2FudHMgdG8gc29ydCBhIGxpc3Qgb2YgZmlsZXMgZmlyc3QgYnkgbmFtZSwgdGhlbiBieSBkYXRlLCB0aGVuIGJ5IHNpemUpLgotICogPHA+Ci0gKiBOQjogU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZAotICogY29sbGVjdGlvbiB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4gPGNvZGU+I3NpemUoKTwvY29kZT4sIDxjb2RlPiNnZXRJdGVtKGludCk8L2NvZGU+KSB3aWxsIGJlCi0gKiB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50IG9iamVjdHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotewotCS8qKgotCSAqIEEgY29tcGFyYXRvciB1c2VkIGZvciBzb3J0aW5nIHRoZSBlbGVtZW50czsKLQkgKiBpZiBpdCBpcyBudWxsLCB3ZSB1c2UgIm5hdHVyYWwgb3JkZXJpbmciLgotCSAqLwotCXByb3RlY3RlZCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3I7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCBzb3J0IGl0cyBjb250ZW50cwotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyLCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJc3VwZXIoY29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYW5kIHNvcnQgaXRzIGNvbnRlbnRzCi0JICogYmFzZWQgb24gdGhlIGVsZW1lbnRzJyAibmF0dXJhbCBvcmRlcmluZyIuCi0JICovCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKGNvbGxlY3Rpb25Ib2xkZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBsaXN0IHZhbHVlIG1vZGVsIGFuZCBzb3J0IGl0cyBjb250ZW50cwotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJdGhpcyhuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFPihsaXN0SG9sZGVyKSwgY29tcGFyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGxpc3QgdmFsdWUgbW9kZWwgYW5kIHNvcnQgaXRzIGNvbnRlbnRzCi0JICogYmFzZWQgb24gdGhlIGVsZW1lbnRzJyAibmF0dXJhbCBvcmRlcmluZyIuCi0JICovCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQl0aGlzKGxpc3RIb2xkZXIsIG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0Q29tcGFyYXRvcihDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLQkJdGhpcy5zb3J0TGlzdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTb3J0IHRoZSBpbnRlcm5hbCBsaXN0IGJlZm9yZQotCSAqIHNlbmRpbmcgb3V0IGNoYW5nZSBub3RpZmljYXRpb24uCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEJ1aWxkTGlzdCgpIHsKLQkJc3VwZXIucG9zdEJ1aWxkTGlzdCgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHRoaXMubGlzdCwgdGhpcy5jb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgbGlzdCB3aWxsIG5lZWQgdG8gYmUgc29ydGVkIGFmdGVyIHRoZSBpdGVtIGlzIGFkZGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZmlyc3QgYWRkIHRoZSBpdGVtcyBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuLi4KLQkJc3VwZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCS8vIC4uLnRoZW4gc29ydCB0aGUgbGlzdAotCQl0aGlzLnNvcnRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogc29ydCB0aGUgbGlzdCBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMsIGlmIG5lY2Vzc2FyeTsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzb3J0TGlzdCgpIHsKLQkJLy8gc2F2ZSB0aGUgdW5zb3J0ZWQgc3RhdGUgb2YgdGhlIHNvcnRlZCBsaXN0IHNvIHdlIGNhbiBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mICJyZXBsYWNlZCIgaXRlbXMKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUFycmF5TGlzdDxFPiB1bnNvcnRlZExpc3QgPSAoQXJyYXlMaXN0PEU+KSB0aGlzLmxpc3QuY2xvbmUoKTsKLQkJQ29sbGVjdGlvbnMuc29ydCh0aGlzLmxpc3QsIHRoaXMuY29tcGFyYXRvcik7Ci0JCVJhbmdlIGRpZmZSYW5nZSA9IENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZSh1bnNvcnRlZExpc3QsIHRoaXMubGlzdCk7Ci0JCWlmIChkaWZmUmFuZ2Uuc2l6ZSA+IDApIHsKLQkJCUxpc3Q8RT4gdW5zb3J0ZWRJdGVtcyA9IHVuc29ydGVkTGlzdC5zdWJMaXN0KGRpZmZSYW5nZS5zdGFydCwgZGlmZlJhbmdlLmVuZCArIDEpOwotCQkJTGlzdDxFPiBzb3J0ZWRJdGVtcyA9IHRoaXMubGlzdC5zdWJMaXN0KGRpZmZSYW5nZS5zdGFydCwgZGlmZlJhbmdlLmVuZCArIDEpOwotCQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChMSVNUX1ZBTFVFUywgZGlmZlJhbmdlLnN0YXJ0LCBzb3J0ZWRJdGVtcywgdW5zb3J0ZWRJdGVtcyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2YzBjOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgY29udmVydAotICogaXRzIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gcHJvcGVydHkgdmFsdWUgbW9kZWwgY2hhbmdlCi0gKiBub3RpZmljYXRpb25zLgotICogCi0gKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGU6Ci0gKiAtICNidWlsZFZhbHVlKCkKLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IG1vZGVsCi0gKiAKLSAqIFN1YmNsYXNzZXMgbWlnaHQgd2FudCB0byBvdmVycmlkZToKLSAqIC0gI3N0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KQotICogICAgIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgKGJ5IG5vdCByZWNhbGN1bGF0aW5nIHRoZSB2YWx1ZSwgaWYgcG9zc2libGUpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLXsKLQkvKiogVGhlIHdyYXBwZWQgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIE1vZGVsIG1vZGVsOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIHN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIFN0YXRlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcihNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVN0YXRlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5tb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5tb2RlbC5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5tb2RlbCk7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgbW9kZWwncyBzdGF0ZSBjaGFuZ2VkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYmE0YzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBDb2xsZWN0aW9uVmFsdWVNb2RlbCB0aGF0IGNhbiBiZSB1c2VkIGZvcgotICogcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG9uIGEgc3RhdGljIGNvbGxlY3Rpb24sIGJ1dCBzdGlsbCBhbGxvd3MgbGlzdGVuZXJzIHRvIGJlIGFkZGVkLgotICogTGlzdGVuZXJzIHdpbGwgTkVWRVIgYmUgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMsIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIG5vbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIGNvbGxlY3Rpb24uICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5zaXplKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5jb2xsZWN0aW9uLml0ZXJhdG9yKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljTGlzdFZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODRkNGFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgTGlzdFZhbHVlTW9kZWwgdGhhdCBjYW4gYmUgdXNlZCBmb3IKLSAqIHJldHVybmluZyBhIGxpc3QgaXRlcmF0b3Igb24gYSBzdGF0aWMgbGlzdCwgYnV0IHN0aWxsIGFsbG93cyBsaXN0ZW5lcnMgdG8gYmUgYWRkZWQuCi0gKiBMaXN0ZW5lcnMgd2lsbCBORVZFUiBiZSBub3RpZmllZCBvZiBhbnkgY2hhbmdlcywgYmVjYXVzZSB0aGVyZSBzaG91bGQgYmUgbm9uZS4KLSAqLwotcHVibGljIGNsYXNzIFN0YXRpY0xpc3RWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8PyBleHRlbmRzIEU+IGxpc3Q7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIExpc3RWYWx1ZU1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIFN0YXRpY0xpc3RWYWx1ZU1vZGVsKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ID0gbGlzdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5saXN0Lml0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlY2NmMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgY2FuIGJlIHVzZWQgZm9yCi0gKiByZXR1cm5pbmcgYSBzdGF0aWMgdmFsdWUsIGJ1dCBzdGlsbCBhbGxvd3MgbGlzdGVuZXJzIHRvIGJlIGFkZGVkLgotICogTGlzdGVuZXJzIHdpbGwgTkVWRVIgYmUgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMsIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIG5vbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCS8qKiBUaGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFQgdmFsdWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIFByb3BlcnR5VmFsdWVNb2RlbCBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsKFQgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1RyZWVWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVHJlZVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyOTUzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVHJlZVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBUcmVlVmFsdWVNb2RlbCB0aGF0IGNhbiBiZSB1c2VkIGZvcgotICogcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG9uIGEgc3RhdGljIHRyZWUsIGJ1dCBzdGlsbCBhbGxvd3MgbGlzdGVuZXJzIHRvIGJlIGFkZGVkLgotICogTGlzdGVuZXJzIHdpbGwgTkVWRVIgYmUgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMsIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIG5vbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNUcmVlVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgVHJlZVZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIHRyZWUncyBub2Rlcy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEU+IG5vZGVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBUcmVlVmFsdWVNb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgU3RhdGljVHJlZVZhbHVlTW9kZWwoSXRlcmFibGU8PyBleHRlbmRzIEU+IG5vZGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChub2RlcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm5vZGVzID0gbm9kZXM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUcmVlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gbm9kZXMoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxFPih0aGlzLm5vZGVzLml0ZXJhdG9yKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMubm9kZXMoKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ0YTJhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQW4gYWRhcHRlciB0aGF0IGFsbG93cyB1cyB0byB0cmFuc2Zvcm0gYSBMaXN0VmFsdWVNb2RlbAotICogKG9yIENvbGxlY3Rpb25WYWx1ZU1vZGVsKSBpbnRvIGEgcmVhZC1vbmx5IExpc3RWYWx1ZU1vZGVsCi0gKiB3aG9zZSBpdGVtcyBhcmUgdHJhbmZvcm1hdGlvbnMgb2YgdGhlIGl0ZW1zIGluIHRoZSB3cmFwcGVkCi0gKiBMaXN0VmFsdWVNb2RlbC4gSXQgd2lsbCBrZWVwIGl0cyBjb250ZW50cyBpbiBzeW5jaCB3aXRoCi0gKiB0aGUgY29udGVudHMgb2YgdGhlIHdyYXBwZWQgTGlzdFZhbHVlTW9kZWwgYW5kIG5vdGlmaWVzIGl0cwotICogbGlzdGVuZXJzIG9mIGFueSBjaGFuZ2VzLgotICogPHA+Ci0gKiBUaGUgdHJhbnNmb3JtZXIgY2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWU7IGFsbG93aW5nIHRoZSBzYW1lCi0gKiBhZGFwdGVyIHRvIGJlIHVzZWQgd2l0aCBkaWZmZXJlbnQgdHJhbnNmb3JtYXRpb25zLgotICogPHA+Ci0gKiBOQjogU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgbGlzdCB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZAotICogbGlzdCB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4gI3NpemUoKSwgI2dldEl0ZW0oaW50KSkgd2lsbCBiZSB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50IG9iamVjdHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEUxLCBFMj4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFMT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEUyPgotewotCi0JLyoqIFRoaXMgdHJhbnNmb3JtcyB0aGUgaXRlbXMsIHVubGVzcyB0aGUgc3ViY2xhc3Mgb3ZlcnJpZGVzICN0cmFuc2Zvcm1JdGVtKE9iamVjdCkuICovCi0JcHJvdGVjdGVkIFRyYW5zZm9ybWVyPEUxLCBFMj4gdHJhbnNmb3JtZXI7Ci0KLQkvKiogVGhlIGxpc3Qgb2YgdHJhbnNmb3JtZWQgaXRlbXMuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8RTI+IHRyYW5zZm9ybWVkTGlzdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8RTI+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlcikgewotCQl0aGlzKGxpc3RIb2xkZXIsIFRyYW5zZm9ybWVyLk51bGwuPEUxLCBFMj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBjb2xsZWN0aW9uIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uSG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RTE+KGNvbGxlY3Rpb25Ib2xkZXIpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgY29sbGVjdGlvbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEUxPihjb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RTI+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFMj4odGhpcy50cmFuc2Zvcm1lZExpc3QpOwotCX0KLQotCXB1YmxpYyBFMiBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVkTGlzdC5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZWRMaXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZWRMaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCB0aGUgdHJhbnNmb3JtZWQgbGlzdCAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0LmFkZEFsbCh0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMubGlzdEhvbGRlcikpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCQkvLyBjbGVhciBvdXQgdGhlIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3QuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1JdGVtcyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5pdGVtcyhldmVudCksIGV2ZW50Lml0ZW1zU2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgbGlzdCB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxFMj4gdHJhbnNmb3JtSXRlbXMoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsdm0pIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXMobHZtLmxpc3RJdGVyYXRvcigpLCBsdm0uc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHJlcGxhY2VkIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1SZXBsYWNlZEl0ZW1zKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1JdGVtcyh0aGlzLnJlcGxhY2VkSXRlbXMoZXZlbnQpLCBldmVudC5pdGVtc1NpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgaXRlbXMuCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8RTI+IHRyYW5zZm9ybUl0ZW1zKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IGl0ZW1zLCBpbnQgc2l6ZSkgewotCQlMaXN0PEUyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEUyPihzaXplKTsKLQkJd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgewotCQkJcmVzdWx0LmFkZCh0aGlzLnRyYW5zZm9ybUl0ZW0oaXRlbXMubmV4dCgpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBpdGVtLgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm1JdGVtKEUxIGl0ZW0pIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKGl0ZW0pOwotCX0KLQotCS8qKgotCSAqIENoYW5nZSB0aGUgdHJhbnNmb3JtZXIgYW5kIHJlYnVpbGQgdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtZXIoVHJhbnNmb3JtZXI8RTEsIEUyPiB0cmFuc2Zvcm1lcikgewotCQl0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0JCXRoaXMucmVidWlsZFRyYW5zZm9ybWVkTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIG91ciBjYWNoZSB3aXRoIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVidWlsZFRyYW5zZm9ybWVkTGlzdCgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3QuY2xlYXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3QuYWRkQWxsKHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5saXN0SG9sZGVyKSk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFRyYW5zZm9ybSB0aGVtLCBhZGQgdGhlbSB0byBvdXIgdHJhbnNmb3JtYXRpb24gbGlzdCwKLQkgKiBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hZGRJdGVtc1RvTGlzdChldmVudC5nZXRJbmRleCgpLCB0aGlzLnRyYW5zZm9ybUl0ZW1zKGV2ZW50KSwgdGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBSZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbXMgZnJvbSBvdXIgdHJhbnNmb3JtYXRpb24gbGlzdAotCSAqIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChldmVudC5nZXRJbmRleCgpLCBldmVudC5pdGVtc1NpemUoKSwgdGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFJlcGxhY2UgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbXMgaW4gb3VyIHRyYW5zZm9ybWF0aW9uIGxpc3QKLQkgKiBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRJdGVtc0luTGlzdChldmVudC5nZXRJbmRleCgpLCB0aGlzLnRyYW5zZm9ybUl0ZW1zKGV2ZW50KSwgdGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIE1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbXMgaW4gb3VyIHRyYW5zZm9ybWF0aW9uIGxpc3QKLQkgKiBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAJdGhpcy5tb3ZlSXRlbXNJbkxpc3QoZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0U291cmNlSW5kZXgoKSwgZXZlbnQuZ2V0TW92ZUxlbmd0aCgpLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIHdhcyBjbGVhcmVkLgotCSAqIENsZWFyIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAJdGhpcy5jbGVhckxpc3QodGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhvbGRlciBoYXMgY2hhbmdlZCBpbiBzb21lIGRyYW1hdGljIGZhc2hpb24uCi0JICogUmVidWlsZCBvdXIgdHJhbnNmb3JtYXRpb24gbGlzdCBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVidWlsZFRyYW5zZm9ybWVkTGlzdCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzYjkzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICogPGNvZGU+UHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiBhbmQgdXNlcyBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPgotICogdG8gdHJhbnNmb3JtIHRoZSB3cmFwcGVkIHZhbHVlIGJlZm9yZSBpdCBpcyByZXR1cm5lZCBieSA8Y29kZT52YWx1ZSgpPC9jb2RlPi4KLSAqIDxwPgotICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSA8Y29kZT5UcmFuc2Zvcm1lcjwvY29kZT4sCi0gKiBhIHN1YmNsYXNzIG9mIDxjb2RlPlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiBjYW4KLSAqIGVpdGhlciBvdmVycmlkZSB0aGUgPGNvZGU+dHJhbnNmb3JtXyhPYmplY3QpPC9jb2RlPiBtZXRob2Qgb3IsCi0gKiBpZiBzb21ldGhpbmcgb3RoZXIgdGhhbiBudWxsIHNob3VsZCBiZSByZXR1cm5lZCB3aGVuIHRoZSB3cmFwcGVkIHZhbHVlCi0gKiBpcyBudWxsLCBvdmVycmlkZSB0aGUgPGNvZGU+dHJhbnNmb3JtKE9iamVjdCk8L2NvZGU+IG1ldGhvZC4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8VDE+Ci0JaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlTW9kZWw8VDI+Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIFRyYW5zZm9ybWVyPFQxLCBUMj4gdHJhbnNmb3JtZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+dHJhbnNmb3JtXyhPYmplY3QpPC9jb2RlPiBvciA8Y29kZT50cmFuc2Zvcm0oT2JqZWN0KTwvY29kZT4KLQkgKiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZyBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUMT4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLnRyYW5zZm9ybWVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVDE+IHZhbHVlSG9sZGVyLCBUcmFuc2Zvcm1lcjxUMSwgVDI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2Zvcm1lcjxUMSwgVDI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVDIgZ2V0VmFsdWUoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBuZXN0ZWQgdmFsdWUgbW9kZWwgYmVmb3JlIHJldHVybmluZyBpdAotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHZhbHVlcyBiZWZvcmUgcHJvcGFnYXRpbmcgdGhlIGNoYW5nZSBldmVudAotCSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy50cmFuc2Zvcm0oKFQxKSBldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMudHJhbnNmb3JtKChUMSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5ICN2YWx1ZSgpIGFuZCAjdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQpLgotCSAqLwotCXByb3RlY3RlZCBUMiB0cmFuc2Zvcm0oVDEgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCwgbm9uLW51bGwsIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtXyhUMSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCB0cmFuc2Zvcm1lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB0cmFuc2Zvcm1lciB3aWxsIHJldHVybiBudWxsIGlmIHRoZSB3cmFwcGVkIHZhbHVlIGlzIG51bGwuCi0JICogSWYgdGhlIHdyYXBwZWQgdmFsdWUgaXMgbm90IG51bGwsIGl0IGlzIHRyYW5zZm9ybWVkIGJ5IGEgc3ViY2xhc3MKLQkgKiBpbXBsZW1lbnRhdGlvbiBvZiAjdHJhbnNmb3JtXyhPYmplY3QpLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxUMSwgVDI+IHsKLQkJcHVibGljIFQyIHRyYW5zZm9ybShUMSB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbC50aGlzLnRyYW5zZm9ybV8odmFsdWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1Y2M2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CaWRpVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiA8Y29kZT5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gYW5kIHVzZXMgYSA8Y29kZT5CaWRpVHJhbnNmb3JtZXI8L2NvZGU+Ci0gKiB0bzo8dWw+Ci0gKiA8bGk+dHJhbnNmb3JtIHRoZSB3cmFwcGVkIHZhbHVlIGJlZm9yZSBpdCBpcyByZXR1cm5lZCBieSA8Y29kZT52YWx1ZSgpPC9jb2RlPgotICogPGxpPiJyZXZlcnNlLXRyYW5zZm9ybSIgdGhlIG5ldyB2YWx1ZSB0aGF0IGNvbWVzIGluIHZpYQotICogPGNvZGU+c2V0VmFsdWUoT2JqZWN0KTwvY29kZT4KLSAqIDwvdWw+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIDxjb2RlPkJpZGlUcmFuc2Zvcm1lcjwvY29kZT4sCi0gKiBhIHN1YmNsYXNzIG9mIDxjb2RlPlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGNhbgotICogb3ZlcnJpZGUgdGhlIDxjb2RlPnRyYW5zZm9ybV8oT2JqZWN0KTwvY29kZT4gYW5kIAotICogPGNvZGU+cmV2ZXJzZVRyYW5zZm9ybV8oT2JqZWN0KTwvY29kZT4gbWV0aG9kczsgb3IsCi0gKiBpZiBzb21ldGhpbmcgb3RoZXIgdGhhbiBudWxsIHNob3VsZCBiZSByZXR1cm5lZCB3aGVuIHRoZSB3cmFwcGVkIHZhbHVlCi0gKiBpcyBudWxsIG9yIHRoZSBuZXcgdmFsdWUgaXMgbnVsbCwgb3ZlcnJpZGUgdGhlIDxjb2RlPnRyYW5zZm9ybShPYmplY3QpPC9jb2RlPgotICogYW5kIDxjb2RlPnJldmVyc2VUcmFuc2Zvcm0oT2JqZWN0KTwvY29kZT4gbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotCWV4dGVuZHMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDI+Ci17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRoZSBkZWZhdWx0IGJpZGkgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+dHJhbnNmb3JtXyhPYmplY3QpPC9jb2RlPiBhbmQgPGNvZGU+cmV2ZXJzZVRyYW5zZm9ybV8oT2JqZWN0KTwvY29kZT4KLQkgKiAob3IgPGNvZGU+dHJhbnNmb3JtKE9iamVjdCk8L2NvZGU+IGFuZCA8Y29kZT5yZXZlcnNlVHJhbnNmb3JtKE9iamVjdCk8L2NvZGU+KQotCSAqIG1ldGhvZHMgaW5zdGVhZCBvZiBidWlsZGluZyBhIDxjb2RlPkJpZGlUcmFuc2Zvcm1lcjwvY29kZT4uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGJpZGkgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+IHZhbHVlSG9sZGVyLCBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcih2YWx1ZUhvbGRlciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRCaWRpVHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVDIgdmFsdWUpIHsKLQkJLy8gInJldmVyc2UtdHJhbnNmb3JtIiB0aGUgb2JqZWN0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSB0aGUgbmVzdGVkIHZhbHVlIG1vZGVsCi0JCXRoaXMudmFsdWVIb2xkZXIoKS5zZXRWYWx1ZSh0aGlzLnJldmVyc2VUcmFuc2Zvcm0odmFsdWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogIlJldmVyc2UtdHJhbnNmb3JtIiB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGlzIGlzIGNhbGxlZCBieSAjc2V0VmFsdWUoT2JqZWN0KS4KLQkgKi8KLQlwcm90ZWN0ZWQgVDEgcmV2ZXJzZVRyYW5zZm9ybShUMiB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lcigpLnJldmVyc2VUcmFuc2Zvcm0odmFsdWUpOwotCX0KLQotCS8qKgotCSAqICJSZXZlcnNlLXRyYW5zZm9ybSIgdGhlIHNwZWNpZmllZCwgbm9uLW51bGwsIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgVDEgcmV2ZXJzZVRyYW5zZm9ybV8oVDIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9ycyBhY2NlcHQgb25seSBhIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxPi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+IHZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxPikgdGhpcy52YWx1ZUhvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3JzIGFjY2VwdCBvbmx5IGEgYmlkaXJlY3Rpb25hbCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwcm90ZWN0ZWQgQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj4gdHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiAoQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj4pIHRoaXMudHJhbnNmb3JtZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgYmlkaSB0cmFuc2Zvcm1lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBiaWRpIHRyYW5zZm9ybWVyIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIHdyYXBwZWQgdmFsdWUgaXMgbnVsbC4KLQkgKiBJZiB0aGUgd3JhcHBlZCB2YWx1ZSBpcyBub3QgbnVsbCwgaXQgaXMgdHJhbnNmb3JtZWQgYnkgYSBzdWJjbGFzcwotCSAqIGltcGxlbWVudGF0aW9uIG9mICN0cmFuc2Zvcm1fKE9iamVjdCkuCi0JICogVGhlIGRlZmF1bHQgYmlkaSB0cmFuc2Zvcm1lciB3aWxsIGFsc28gcmV0dXJuIG51bGwgaWYgdGhlIG5ldyB2YWx1ZSBpcyBudWxsLgotCSAqIElmIHRoZSBuZXcgdmFsdWUgaXMgbm90IG51bGwsIGl0IGlzIHJldmVyc2UtdHJhbnNmb3JtZWQgYnkgYSBzdWJjbGFzcwotCSAqIGltcGxlbWVudGF0aW9uIG9mICNyZXZlcnNlVHJhbnNmb3JtXyhPYmplY3QpLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0QmlkaVRyYW5zZm9ybWVyCi0JCWV4dGVuZHMgRGVmYXVsdFRyYW5zZm9ybWVyCi0JCWltcGxlbWVudHMgQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj4KLQl7Ci0JCXB1YmxpYyBUMSByZXZlcnNlVHJhbnNmb3JtKFQyIHZhbHVlKSB7Ci0JCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gbnVsbCA6IFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwudGhpcy5yZXZlcnNlVHJhbnNmb3JtXyh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlQXNwZWN0QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVBc3BlY3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMTMxZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVBc3BlY3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBleHRlbnNpb24gb2YgUHJvcGVydHlBZGFwdGVyIHByb3ZpZGVzIFRyZWVDaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgYWxsb3dzIHVzIHRvIGNvbnZlcnQgYSBzZXQgb2Ygb25lIG9yIG1vcmUgdHJlZXMgaW50bwotICogYSBzaW5nbGUgdHJlZSwgTk9ERVMuCi0gKiAKLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogI25vZGVzXygpCi0gKiAgICAgYXQgdGhlIHZlcnkgbWluaW11bSwgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGFuIGl0ZXJhdG9yCi0gKiAgICAgb24gdGhlIHN1YmplY3QncyB0cmVlIGFzcGVjdDsgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVuIGlmCi0gKiAgICAgI25vZGVzKCkgaXMgb3ZlcnJpZGRlbiBhbmQgaXRzIGJlaGF2aW9yIGNoYW5nZWQKLSAqICNub2RlcygpCi0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb25seSBpZiByZXR1cm5pbmcgYW4gZW1wdHkgaXRlcmF0b3Igd2hlbiB0aGUKLSAqICAgICBzdWJqZWN0IGlzIG51bGwgaXMgdW5hY2NlcHRhYmxlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmVlQXNwZWN0QWRhcHRlcjxTIGV4dGVuZHMgTW9kZWwsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFM+Ci0JaW1wbGVtZW50cyBUcmVlVmFsdWVNb2RlbDxFPgotewotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgdHJlZXMgdGhhdCB3ZSB1c2UgZm9yIHRoZSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gdHJlZU5hbWVzOwotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1RSRUVfTkFNRVMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBzdWJqZWN0J3MgdHJlZSBhc3BlY3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciB0cmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFRyZWVBc3BlY3RBZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgdHJlZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUFzcGVjdEFkYXB0ZXIoU3RyaW5nIHRyZWVOYW1lLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RyaW5nW10ge3RyZWVOYW1lfSwgc3ViamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgVHJlZUFzcGVjdEFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCB0cmVlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUFzcGVjdEFkYXB0ZXIoU3RyaW5nW10gdHJlZU5hbWVzLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpLCB0cmVlTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFRyZWVBc3BlY3RBZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIHRyZWVzLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIFN0cmluZy4uLiB0cmVlTmFtZXMpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JCXRoaXMudHJlZU5hbWVzID0gdHJlZU5hbWVzOwotCQl0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBUcmVlQXNwZWN0QWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCB0cmVlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gdHJlZU5hbWVzKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgdHJlZU5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1t0cmVlTmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIFRyZWVBc3BlY3RBZGFwdGVyIGZvciBhbiAidW5jaGFuZ2luZyIgdHJlZSBpbgotCSAqIHRoZSBzcGVjaWZpZWQgc3ViamVjdC4gVGhpcyBpcyB1c2VmdWwgZm9yIGEgdHJlZSBhc3BlY3QgdGhhdCBkb2VzIG5vdAotCSAqIGNoYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIHN1YmplY3Q7IGJ1dCB0aGUgc3ViamVjdCB3aWxsIGNoYW5nZSwgcmVzdWx0aW5nIGluCi0JICogYSBuZXcgdHJlZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgRU1QVFlfVFJFRV9OQU1FUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0J3MgdHJlZSBhc3BlY3QgaGFzIGNoYW5nZWQsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgc3ViamVjdCdzIHRyZWUgY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFIHRyZWUgY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IFRyZWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlci50aGlzLm5vZGVBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlci50aGlzLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVBc3BlY3RBZGFwdGVyLnRoaXMudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXIudGhpcy50cmVlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNoYW5nZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoVHJlZUFzcGVjdEFkYXB0ZXIudGhpcy50cmVlTmFtZXMpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGVzIG9mIHRoZSBzdWJqZWN0J3MgdHJlZSBhc3BlY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPEU+IG5vZGVzKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPEU+aW5zdGFuY2UoKSA6IHRoaXMubm9kZXNfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBub2RlcyBvZiB0aGUgc3ViamVjdCdzIHRyZWUgYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNub2RlcygpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IG5vZGVzXygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMubm9kZXMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gVHJlZUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gTk9ERVM7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKE5PREVTKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKE5PREVTKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgdHJlZU5hbWUgOiB0aGlzLnRyZWVOYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIHRoaXMudHJlZUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyB0cmVlTmFtZSA6IHRoaXMudHJlZU5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMudHJlZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKSB7Ci0JCQkJc2IuYXBwZW5kKCIsICIpOwotCQkJfQotCQkJc2IuYXBwZW5kKHRoaXMudHJlZU5hbWVzW2ldKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlQWRkZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZU5vZGVBZGRlZChOT0RFUywgZXZlbnQuZ2V0UGF0aCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTm9kZVJlbW92ZWQoTk9ERVMsIGV2ZW50LmdldFBhdGgoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZVRyZWVDbGVhcmVkKE5PREVTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoTk9ERVMsIGV2ZW50LmdldFBhdGgoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWI2ZjFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIHRyZWUgdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIGNvbnZlcnQKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZQotICogbm90aWZpY2F0aW9ucy4KLSAqIAotICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlOgotICogLSAjYnVpbGRWYWx1ZSgpCi0gKiAgICAgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlLCBhcyBkZXJpdmVkIGZyb20gdGhlCi0gKiAgICAgY3VycmVudCBjb2xsZWN0aW9uIHZhbHVlCi0gKiAKLSAqIFN1YmNsYXNzZXMgbWlnaHQgd2FudCB0byBvdmVycmlkZToKLSAqIC0gI3N0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KQotICogICAgIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgKGJ5IG5vdCByZWNhbGN1bGF0aW5nIHRoZSB2YWx1ZSwgaWYgcG9zc2libGUpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotCWV4dGVuZHMgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotewotCS8qKiBUaGUgd3JhcHBlZCB0cmVlIHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmVlVmFsdWVNb2RlbDw/PiB0cmVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIHRyZWUgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmVlQ2hhbmdlTGlzdGVuZXIgdHJlZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogdHJlZSB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIoVHJlZVZhbHVlTW9kZWw8Pz4gdHJlZUhvbGRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnRyZWVIb2xkZXIgPSB0cmVlSG9sZGVyOwotCQl0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyZWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLm5vZGVBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy50cmVlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNoYW5nZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdHJlZSBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLnRyZWVIb2xkZXIuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMudHJlZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgdHJlZSBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLnRyZWVIb2xkZXIucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMudHJlZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnRyZWVIb2xkZXIpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogTm9kZXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCB0cmVlIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub2RlQWRkZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCB0cmVlIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIHRyZWUgaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgdHJlZSBob2xkZXIgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQXNwZWN0QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDdjNTBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUFzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQWJzdHJhY3QgbW9kZWwgdGhhdCBwcm92aWRlcyBiZWhhdmlvciBmb3Igd3JhcHBpbmcgYSBwcm9wZXJ0eQotICogdmFsdWUgbW9kZWwgYW5kIGxpc3RlbmluZyBmb3IgY2hhbmdlcyB0byBhc3BlY3RzIG9mIHRoZSAqdmFsdWUqIGNvbnRhaW5lZAotICogYnkgdGhlIHByb3BlcnR5IHZhbHVlIG1vZGVsLiBDaGFuZ2VzIHRvIHRoZSBhY3R1YWwgdmFsdWUgYXJlIGFsc28gbW9uaXRvcmVkLgotICogCi0gKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIHZhbHVlIHRoYXQgbWF5IGNoYW5nZSwgYnV0IHdob3NlIGFzcGVjdHMgY2FuIGFsc28KLSAqIGNoYW5nZSBpbiBhIGZhc2hpb24gdGhhdCBtaWdodCBiZSBvZiBpbnRlcmVzdCB0byB0aGUgY2xpZW50LgotICogCi0gKiBOQjogQ2xpZW50cyB3aWxsIG5lZWQgdG8gbGlzdGVuIGZvciB0d28gZGlmZmVyZW50IGNoYW5nZSBub3RpZmljYXRpb25zOiBhIHByb3BlcnR5Ci0gKiBjaGFuZ2UgZXZlbnQgd2lsbCBiZSBiZSBmaXJlZCB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzOyBhIHN0YXRlIGNoYW5nZSBldmVudAotICogd2lsbCBiZSBmaXJlZCB3aGVuIGFuIGFzcGVjdCBvZiB0aGUgdmFsdWUgY2hhbmdlcy4KLSAqIAotICogU3ViY2xhc3NlcyBuZWVkIHRvIG92ZXJyaWRlIHR3byBtZXRob2RzOgotICogCi0gKiAjZW5nYWdlVmFsdWVfKCkKLSAqICAgICBiZWdpbiBsaXN0ZW5pbmcgdG8gdGhlIGFwcHJvcHJpYXRlIGFzcGVjdCBvZiB0aGUgdmFsdWUgYW5kIGNhbGwKLSAqICAgICAjdmFsdWVBc3BlY3RDaGFuZ2VkKE9iamVjdCkgd2hlbmV2ZXIgdGhlIGFzcGVjdCBjaGFuZ2VzCi0gKiAKLSAqICNkaXNlbmdhZ2VWYWx1ZV8oKQotICogICAgIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBhcHByb3ByaWF0ZSBhc3BlY3Qgb2YgdGhlIHZhbHVlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWx1ZUFzcGVjdEFkYXB0ZXI8VD4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8VD4KLQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0JLyoqIENhY2hlIHRoZSB2YWx1ZSBzbyB3ZSBjYW4gZGlzZW5nYWdlLiAqLwotCXByb3RlY3RlZCBUIHZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlQXNwZWN0QWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBhbGxvdyBib3RoIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZSBhbmQgc3RhdGUgY2hhbmdlCi0JICogbGlzdGVuZXJzLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VTdXBwb3J0KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZSgpOwotCQl0aGlzLmVuZ2FnZVZhbHVlKCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5jbG9uZVdpdGhTb3VyY2UodGhpcykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlVmFsdWUoKTsKLQkJfQotCQlzdXBlci5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlVmFsdWUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGN1cnJlbnQgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWUoKSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JCWlmICh0aGlzLnZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMuZW5nYWdlVmFsdWVfKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGN1cnJlbnQgdmFsdWUuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VWYWx1ZV8oKTsKLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBjdXJyZW50IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlKCkgewotCQlpZiAodGhpcy52YWx1ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVZhbHVlXygpOwotCQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoYXQgdGhlIHZhbHVlIGlzIG5vdCBudWxsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpOwotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCB3aGVuZXZlciB0aGUgdmFsdWUncyBhc3BlY3QgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUFzcGVjdENoYW5nZWQoKSB7Ci0JCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvcnMgYWNjZXB0IG9ubHkgYSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUMT4uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+KSB0aGlzLnZhbHVlSG9sZGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUNvbGxlY3Rpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZGI3NGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQgVmFsdWVBc3BlY3RBZGFwdGVyIHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZSBjb2xsZWN0aW9uCi0gKiBhc3BlY3RzIG9mIHRoZSB2YWx1ZSBpbiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXI8VCBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFQ+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSB2YWx1ZSdzIGNvbGxlY3Rpb25zIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBjb2xsZWN0aW9uTmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSBjb2xsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgVmFsdWVDb2xsZWN0aW9uQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgU3RyaW5nLi4uIGNvbGxlY3Rpb25OYW1lcykgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMuY29sbGVjdGlvbk5hbWVzID0gY29sbGVjdGlvbk5hbWVzOwotCQl0aGlzLnZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbCB3ZSByZWFsbHkgY2FyZSBhYm91dCBpcyB0aGUgZmFjdCB0aGF0IGEgQ29sbGVjdGlvbiBhc3BlY3QgaGFzIAotCSAqIGNoYW5nZWQuIERvIHRoZSBzYW1lIHRoaW5nIG5vIG1hdHRlciB3aGljaCBldmVudCBvY2N1cnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVDb2xsZWN0aW9uQWRhcHRlci50aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGNvbGxlY3Rpb24gbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uTmFtZXMpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJdGhpcy52YWx1ZS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMudmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyBjb2xsZWN0aW9uTmFtZSA6IHRoaXMuY29sbGVjdGlvbk5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgdGhpcy52YWx1ZUNvbGxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjRkMTAwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIFZhbHVlQXNwZWN0QWRhcHRlciB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgbGlzdAotICogYXNwZWN0cyBvZiB0aGUgdmFsdWUgaW4gdGhlIHdyYXBwZWQgdmFsdWUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZUxpc3RBZGFwdGVyPFQgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFZhbHVlQXNwZWN0QWRhcHRlcjxUPgotewotCi0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgdmFsdWUncyBsaXN0cyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gbGlzdE5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciB2YWx1ZUxpc3RMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgbGlzdHMuCi0JICovCi0JcHVibGljIFZhbHVlTGlzdEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIsIFN0cmluZy4uLiBsaXN0TmFtZXMpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLmxpc3ROYW1lcyA9IGxpc3ROYW1lczsKLQkJdGhpcy52YWx1ZUxpc3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUxpc3RMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGwgd2UgcmVhbGx5IGNhcmUgYWJvdXQgaXMgdGhlIGZhY3QgdGhhdCBhIExpc3QgYXNwZWN0IGhhcyAKLQkgKiBjaGFuZ2VkLiBEbyB0aGUgc2FtZSB0aGluZyBubyBtYXR0ZXIgd2hpY2ggZXZlbnQgb2NjdXJzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUxpc3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlTGlzdEFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUxpc3RBZGFwdGVyLnRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlTGlzdEFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgbGlzdCBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoVmFsdWVMaXN0QWRhcHRlci50aGlzLmxpc3ROYW1lcyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyBsaXN0TmFtZSA6IHRoaXMubGlzdE5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgdGhpcy52YWx1ZUxpc3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCXRoaXMudmFsdWUucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLnZhbHVlTGlzdExpc3RlbmVyKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0MGU4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCBWYWx1ZUFzcGVjdEFkYXB0ZXIgdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlCi0gKiBwcm9wZXJ0aWVzIG9mIHRoZSB2YWx1ZSBpbiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbHVlUHJvcGVydHlBZGFwdGVyPFQgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFZhbHVlQXNwZWN0QWRhcHRlcjxUPgotewotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIHZhbHVlJ3MgcHJvcGVydGllcyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHZhbHVlUHJvcGVydHlMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgVmFsdWVQcm9wZXJ0eUFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIsIFN0cmluZy4uLiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy5wcm9wZXJ0eU5hbWVzID0gcHJvcGVydHlOYW1lczsKLQkJdGhpcy52YWx1ZVByb3BlcnR5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVQcm9wZXJ0eUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlUHJvcGVydHlBZGFwdGVyLnRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSBwcm9wZXJ0eSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoVmFsdWVQcm9wZXJ0eUFkYXB0ZXIudGhpcy5wcm9wZXJ0eU5hbWVzKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLnZhbHVlUHJvcGVydHlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHRoaXMucHJvcGVydHlOYW1lcykgewotCQkJdGhpcy52YWx1ZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgdGhpcy52YWx1ZVByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVTdGF0ZUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVN0YXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTE2ZmRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVN0YXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQgVmFsdWVBc3BlY3RBZGFwdGVyIHRvIGxpc3RlbiB0byB0aGUKLSAqICJzdGF0ZSIgb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVTdGF0ZUFkYXB0ZXI8VCBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFQ+Ci17Ci0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciB2YWx1ZVN0YXRlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgdmFsdWUgc3RhdGUuCi0JICovCi0JcHVibGljIFZhbHVlU3RhdGVBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy52YWx1ZVN0YXRlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVTdGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVTdGF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlU3RhdGVBZGFwdGVyLnRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSBzdGF0ZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCXRoaXMudmFsdWUuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnZhbHVlU3RhdGVMaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVfKCkgewotCQl0aGlzLnZhbHVlLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy52YWx1ZVN0YXRlTGlzdGVuZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlVHJlZUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVRyZWVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzljNTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlVHJlZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQgVmFsdWVBc3BlY3RBZGFwdGVyIHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZQotICogdHJlZSBhc3BlY3RzIG9mIHRoZSB2YWx1ZSBpbiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbHVlVHJlZUFkYXB0ZXI8VCBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFQ+Ci17Ci0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgdmFsdWUncyB0cmVlcyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gdHJlZU5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciB2YWx1ZVRyZWVMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgdHJlZXMuCi0JICovCi0JcHVibGljIFZhbHVlVHJlZUFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIsIFN0cmluZy4uLiB0cmVlTmFtZXMpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLnRyZWVOYW1lcyA9IHRyZWVOYW1lczsKLQkJdGhpcy52YWx1ZVRyZWVMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZVRyZWVMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVUcmVlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlVHJlZUFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlVHJlZUFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlVHJlZUFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlVHJlZUFkYXB0ZXIudGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIHRyZWUgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFZhbHVlVHJlZUFkYXB0ZXIudGhpcy50cmVlTmFtZXMpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCXRoaXMudmFsdWUuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLnZhbHVlVHJlZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgdHJlZU5hbWUgOiB0aGlzLnRyZWVOYW1lcykgewotCQkJdGhpcy52YWx1ZS5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIHRoaXMudmFsdWVUcmVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjY2E3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmlkaVN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgd3JhcHMgYSBQcmVmZXJlbmNlIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgUHJvcGVydHlWYWx1ZU1vZGVsLgotICogSXQgbGlzdGVucyBmb3IgdGhlIGFwcHJvcHJpYXRlICJwcmVmZXJlbmNlIiBjaGFuZ2VzIGFuZCBjb252ZXJ0cyB0aGVtIGludG8KLSAqIFZBTFVFIHByb3BlcnR5IGNoYW5nZXMuIEl0IGFsc28gYWxsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgZGVmYXVsdCB2YWx1ZQotICogZm9yIHRoZSBQcmVmZXJlbmNlLCB3aGljaCwgYnkgZGVmYXVsdCwgaXMgbnVsbCAoYW5kIGlzIHByb2JhYmx5ICpub3QqIGEgdmVyeQotICogZ29vZCBkZWZhdWx0KS4KLSAqIAotICogWW91IGNhbiBjb25maWd1cmUgd2hldGhlciB0aGUgcHJlZmVyZW5jZSdzIHZhbHVlIGlzIHJldHVybmVkLAotICogdW5jaGFuZ2VkLCBhcyBhIHN0cmluZyBvciBhcyBzb21lIG90aGVyIG9iamVjdCAoZS5nLiBhbiBJbnRlZ2VyKSBieQotICogc2V0dGluZyB0aGUgYWRhcHRlcidzIGNvbnZlcnRlci4gSW50ZXJuYWxseSwgdGhlIHByZWZlcmVuY2UncyB2YWx1ZQotICogaXMgc3RvcmVkIGFzIHRoZSBjb252ZXJ0ZWQgb2JqZWN0OyBhbmQgdGhlIGNvbnZlcnNpb25zIHRha2UgcGxhY2UKLSAqIHdoZW4gcmVhZGluZyBvciB3cml0aW5nIGZyb20gdGhlIHByZWZlcmVuY2VzIG5vZGUgb3IgcmV0cmlldmluZyB0aGUKLSAqIHZhbHVlIGZyb20gYW4gZXZlbnQgZmlyZWQgYnkgdGhlIHByZWZlcmVuY2VzIG5vZGUuCi0gKiAKLSAqIFRoaXMgYWRhcHRlciBpcyBhIGJpdCBkaWZmZXJlbnQgZnJvbSBtb3N0IG90aGVyIGFkYXB0ZXJzIGJlY2F1c2UgdGhlCi0gKiBjaGFuZ2UgZXZlbnRzIGZpcmVkIG9mZiBieSBhIFByZWZlcmVuY2VzIG5vZGUgYXJlIGFzeW5jaHJvbm91cyBmcm9tCi0gKiB0aGUgY2hhbmdlIGl0c2VsZi4gKEFic3RyYWN0UHJlZmVyZW5jZXMgdXNlcyBhbiBldmVudCBkaXNwYXRjaCBkYWVtb24uKQotICogQXMgYSByZXN1bHQsIGEgY2xpZW50IGNhbiBzZXQgb3VyIHZhbHVlIHdpdGggI3NldFZhbHVlKE9iamVjdCkgYW5kIHdlCi0gKiB3aWxsIHJldHVybiBmcm9tIHRoYXQgbWV0aG9kIGJlZm9yZSB3ZSBldmVyIHJlY2VpdmUgbm90aWZpY2F0aW9uIGZyb20KLSAqIHRoZSBQcmVmZXJlbmNlcyBub2RlIHRoYXQgKml0KiBoYXMgY2hhbmdlZC4gVGhpcyBtZWFucyB3ZSBjYW5ub3QKLSAqIHJlbHkgb24gdGhhdCBldmVudCB0byBrZWVwIG91ciBpbnRlcm5hbGx5IGNhY2hlZCB2YWx1ZSBpbiBzeW5jaC4KLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8UHJlZmVyZW5jZXM+Ci0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQPgotewotCS8qKiBUaGUga2V5IHRvIHRoZSBwcmVmZXJlbmNlIHdlIHVzZSBmb3IgdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcga2V5OwotCi0JLyoqCi0JICogQ2FjaGUgdGhlIGN1cnJlbnQgKG9iamVjdCkgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugc28gd2UKLQkgKiBjYW4gcGFzcyBhbiAib2xkIHZhbHVlIiB3aGVuIHdlIGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIFAgdmFsdWU7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCAob2JqZWN0KSB2YWx1ZSByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyB2YWx1ZQotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUCBkZWZhdWx0VmFsdWU7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnZlcnRlciBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIHByZWZlcmVuY2UncwotCSAqIHN0cmluZyB2YWx1ZSB0byBhbmQgZnJvbSBhbiBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8UD4gY29udmVydGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBhcHByb3ByaWF0ZSBwcmVmZXJlbmNlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSkgewotCQl0aGlzKHByZWZlcmVuY2VzLCBrZXksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2Ugd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMsIFN0cmluZyBrZXksIFAgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXMocHJlZmVyZW5jZXMsIGtleSwgZGVmYXVsdFZhbHVlLCBCaWRpU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFA+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSwgUCBkZWZhdWx0VmFsdWUsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8UD4gY29udmVydGVyKSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4ocHJlZmVyZW5jZXMpLCBrZXksIGRlZmF1bHRWYWx1ZSwgY29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmb3JCb29sZWFuKFByZWZlcmVuY2VzIHByZWZlcmVuY2VzLCBTdHJpbmcga2V5LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oCi0JCQkJcHJlZmVyZW5jZXMsCi0JCQkJa2V5LAotCQkJCWRlZmF1bHRWYWx1ZSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UsCi0JCQkJQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkKLQkJCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gZm9ySW50ZWdlcihQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oCi0JCQkJcHJlZmVyZW5jZXMsCi0JCQkJa2V5LAotCQkJCW5ldyBJbnRlZ2VyKGRlZmF1bHRWYWx1ZSksCi0JCQkJQmlkaVN0cmluZ0NvbnZlcnRlci5JbnRlZ2VyQ29udmVydGVyLmluc3RhbmNlKCkKLQkJCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aWxsIGJlIG51bGwuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcmVmZXJlbmNlcz4gcHJlZmVyZW5jZXNIb2xkZXIsIFN0cmluZyBrZXkpIHsKLQkJdGhpcyhwcmVmZXJlbmNlc0hvbGRlciwga2V5LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJlZmVyZW5jZXM+IHByZWZlcmVuY2VzSG9sZGVyLCBTdHJpbmcga2V5LCBQIGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKHByZWZlcmVuY2VzSG9sZGVyLCBrZXksIGRlZmF1bHRWYWx1ZSwgQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxQPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2Ugd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcmVmZXJlbmNlcz4gcHJlZmVyZW5jZXNIb2xkZXIsIFN0cmluZyBrZXksIFAgZGVmYXVsdFZhbHVlLCBCaWRpU3RyaW5nQ29udmVydGVyPFA+IGNvbnZlcnRlcikgewotCQlzdXBlcihwcmVmZXJlbmNlc0hvbGRlcik7Ci0JCXRoaXMua2V5ID0ga2V5OwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCXRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBvdXIgdmFsdWUgaXMgbnVsbCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBwcmVmZXJlbmNlCi0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBIHByZWZlcmVuY2UgaGFzIGNoYW5nZWQsIG5vdGlmeSB0aGUgbGlzdGVuZXJzIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHByZWZlcmVuY2UgY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFIHByb3BlcnR5IGNoYW5nZSBldmVudHMKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKFByZWZlcmVuY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwudGhpcy5wcmVmZXJlbmNlQ2hhbmdlZChldmVudC5nZXRLZXkoKSwgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJwcmVmZXJlbmNlIGNoYW5nZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYWNoZWQgKGNvbnZlcnRlZCkgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBQIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgY2FjaGVkIHZhbHVlLCB0aGVuIHNldCB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VmFsdWUoUCB2YWx1ZSkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQlyZXR1cm47CQkvLyBubyBjaGFuZ2VzIGFsbG93ZWQgd2hlbiB3ZSBoYXZlIG5vIGxpc3RlbmVycwotCQl9Ci0KLQkJT2JqZWN0IG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlKG9sZCwgdmFsdWUpOwotCi0JCWlmICgodGhpcy5zdWJqZWN0ICE9IG51bGwpICYmIHRoaXMuc2hvdWxkU2V0UHJlZmVyZW5jZShvbGQsIHZhbHVlKSkgewotCQkJdGhpcy5zZXRWYWx1ZV8odmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiBWQUxVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFZBTFVFKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJdGhpcy5zdWJqZWN0LmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuc3ViamVjdC5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGZvciBzb21lIG9kZCByZWFzb24sIHdlIGFyZSBub3QgYWxsb3dlZCB0byByZW1vdmUgYSBsaXN0ZW5lciBmcm9tIGEgImRlYWQiCi0JCQkvLyBwcmVmZXJlbmNlcyBub2RlOyBzbyBoYW5kbGUgdGhlIGV4Y2VwdGlvbiB0aGF0IGdldHMgdGhyb3duIGhlcmUKLQkJCWlmICggISBleC5nZXRNZXNzYWdlKCkuZXF1YWxzKCJOb2RlIGhhcyBiZWVuIHJlbW92ZWQuIikpIHsKLQkJCQkvLyBpZiBpdCBpcyBub3QgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiwgcmUtdGhyb3cgaXQKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJfQotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmtleSk7Ci0JCXNiLmFwcGVuZCgiID0+ICIpOwotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmVmZXJlbmNlJ3Mga2V5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gdGhpcy5rZXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmVmZXJlbmNlJ3MgdmFsdWUuCi0JICogQXQgdGhpcyBwb2ludCB0aGUgc3ViamVjdCBtYXkgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgUCBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkVmFsdWVfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBwcmVmZXJlbmNlLCBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIG9iamVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoYXQgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICovCi0JcHJvdGVjdGVkIFAgYnVpbGRWYWx1ZV8oKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRUb09iamVjdCh0aGlzLnN1YmplY3QuZ2V0KHRoaXMua2V5LCB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLmRlZmF1bHRWYWx1ZSkpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGFwcHJvcHJpYXRlIHByZWZlcmVuY2UgYWZ0ZXIgY29udmVydGluZyB0aGUgdmFsdWUgdG8gYSBzdHJpbmcuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhQIHZhbHVlKSB7Ci0JCXRoaXMuc3ViamVjdC5wdXQodGhpcy5rZXksIHRoaXMuY29udmVydFRvU3RyaW5nKHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgc2hvdWxkIGJlIHBhc3NlZAotCSAqIHRocm91Z2ggdG8gdGhlIHByZWZlcmVuY2UuIEJ5IGRlZmF1bHQsIG9ubHkgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLAotCSAqIHdpbGwgaXQgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHByZWZlcmVuY2UuIFRoaXMgYWxzbyBoYXMgdGhlCi0JICogZWZmZWN0IG9mIG5vdCBjcmVhdGluZyBuZXcgcHJlZmVyZW5jZXMgaW4gdGhlICJiYWNraW5nIHN0b3JlIgotCSAqIGlmIHRoZSBuZXcgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRydWUgaWYgdGhleQotCSAqIHdvdWxkIGxpa2UgdG8gQUxXQVlTIHBhc3MgdGhyb3VnaCB0aGUgbmV3IHZhbHVlIHRvIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNldFByZWZlcmVuY2UoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byBhIHN0cmluZyB0aGF0IGNhbiBiZSBzdG9yZWQgYXMKLQkgKiB0aGUgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoUCBvKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcobyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2UgdmFsdWUgc3RyaW5nIHRvIGFuCi0JICogYXBwcm9wcmlhdGVseS10eXBlZCBvYmplY3QgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgUCBjb252ZXJ0VG9PYmplY3QoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyLmNvbnZlcnRUb09iamVjdChzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlZChTdHJpbmcgcHJlZktleSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCWlmIChwcmVmS2V5LmVxdWFscyh0aGlzLmtleSkpIHsKLQkJCXRoaXMucHJlZmVyZW5jZUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSB1bmRlcmx5aW5nIHByZWZlcmVuY2UgY2hhbmdlZDsgZWl0aGVyIGJlY2F1c2Ugd2UgY2hhbmdlZCBpdAotCSAqIGluICNzZXRWYWx1ZV8oT2JqZWN0KSBvciBhIHRoaXJkLXBhcnR5IGNoYW5nZWQgaXQuCi0JICogSWYgdGhpcyBpcyBjYWxsZWQgYmVjYXVzZSBvZiBvdXIgb3duIGNoYW5nZSwgdGhlIGV2ZW50IHdpbGwgYmUKLQkgKiBzd2FsbG93ZWQgYmVjYXVzZSB0aGUgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB0aGUgc2FtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcHJlZmVyZW5jZUNoYW5nZWQoKSB7Ci0JCU9iamVjdCBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JCXRoaXMuZmlyZUFzcGVjdENoYW5nZShvbGQsIHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Y2VmNjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIHdyYXBzIGEgUHJlZmVyZW5jZXMgbm9kZSBhbmQgY29udmVydHMgaXRzIHByZWZlcmVuY2VzIGludG8gYQotICogQ29sbGVjdGlvblZhbHVlTW9kZWwgb2YgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbHMuIEl0IGxpc3RlbnMgZm9yCi0gKiAicHJlZmVyZW5jZSIgY2hhbmdlcyBhbmQgY29udmVydHMgdGhlbSBpbnRvIFZBTFVFIGNvbGxlY3Rpb24gY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWw8UD4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8UHJlZmVyZW5jZXM+Ci0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PgotewotCi0JLyoqIENhY2hlIHRoZSBjdXJyZW50IHByZWZlcmVuY2VzLCBzdG9yZWQgaW4gbW9kZWxzIGFuZCBrZXllZCBieSBuYW1lLiAqLwotCXByb3RlY3RlZCBmaW5hbCBIYXNoTWFwPFN0cmluZywgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gcHJlZmVyZW5jZXM7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHByZWZlcmVuY2VzIG5vZGUgZm9yIGFkZGVkIG9yIHJlbW92ZWQgcHJlZmVyZW5jZXMuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBwcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2VzIG5vZGUuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFByZWZlcmVuY2VzPihwcmVmZXJlbmNlcykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2VzIG5vZGUuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcmVmZXJlbmNlcz4gcHJlZmVyZW5jZXNIb2xkZXIpIHsKLQkJc3VwZXIocHJlZmVyZW5jZXNIb2xkZXIpOwotCQl0aGlzLnByZWZlcmVuY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PigpOwotCQl0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQSBwcmVmZXJlbmNlcyBoYXZlIGNoYW5nZWQsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgcHJlZmVyZW5jZSBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUUgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzCi0JCXJldHVybiBuZXcgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJlZmVyZW5jZUNoYW5nZShQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMucHJlZmVyZW5jZUNoYW5nZWQoZXZlbnQuZ2V0S2V5KCksIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJlZmVyZW5jZSBjaGFuZ2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIHByZWZlcmVuY2UgbW9kZWxzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnByZWZlcmVuY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJlZmVyZW5jZXMuc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIFZBTFVFUzsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVkFMVUVTKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUyk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0JCXRoaXMuc3ViamVjdC5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlmb3IgKEl0ZXJhdG9yPFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4+IHN0cmVhbSA9IHRoaXMucHJlZmVyZW5jZU1vZGVscygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gcHJlZmVyZW5jZU1vZGVsID0gc3RyZWFtLm5leHQoKTsKLQkJCXRoaXMucHJlZmVyZW5jZXMucHV0KHByZWZlcmVuY2VNb2RlbC5nZXRLZXkoKSwgcHJlZmVyZW5jZU1vZGVsKTsKLQkJfQotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotCQl0cnkgewotCQkJdGhpcy5zdWJqZWN0LnJlbW92ZVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJLy8gZm9yIHNvbWUgb2RkIHJlYXNvbiwgd2UgYXJlIG5vdCBhbGxvd2VkIHRvIHJlbW92ZSBhIGxpc3RlbmVyIGZyb20gYSAiZGVhZCIKLQkJCS8vIHByZWZlcmVuY2VzIG5vZGU7IHNvIGhhbmRsZSB0aGUgZXhjZXB0aW9uIHRoYXQgZ2V0cyB0aHJvd24gaGVyZQotCQkJaWYgKCAhIGV4LmdldE1lc3NhZ2UoKS5lcXVhbHMoIk5vZGUgaGFzIGJlZW4gcmVtb3ZlZC4iKSkgewotCQkJCS8vIGlmIGl0IGlzIG5vdCB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uLCByZS10aHJvdyBpdAotCQkJCXRocm93IGV4OwotCQkJfQotCQl9Ci0JCXRoaXMucHJlZmVyZW5jZXMuY2xlYXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnN1YmplY3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUgcHJlZmVyZW5jZSBtb2RlbHMuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PiBwcmVmZXJlbmNlTW9kZWxzKCkgewotCQlTdHJpbmdbXSBrZXlzOwotCQl0cnkgewotCQkJa2V5cyA9IHRoaXMuc3ViamVjdC5rZXlzKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4+KG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oa2V5cykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gdHJhbnNmb3JtKFN0cmluZyBrZXkpIHsKLQkJCQlyZXR1cm4gUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbC50aGlzLmJ1aWxkUHJlZmVyZW5jZU1vZGVsKGtleSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gdHdlYWsgdGhlIG1vZGVsIHVzZWQgdG8gd3JhcCB0aGUKLQkgKiBzcGVjaWZpZWQgcHJlZmVyZW5jZSAoZS5nLiB0byBjdXN0b21pemUgdGhlIG1vZGVsJ3MgY29udmVydGVyKS4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBidWlsZFByZWZlcmVuY2VNb2RlbChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBuZXcgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPih0aGlzLnN1YmplY3RIb2xkZXIsIGtleSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHByZWZlcmVuY2VDaGFuZ2VkKFN0cmluZyBrZXksIFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgewotCQkJLy8gYSBwcmVmZXJlbmNlIHdhcyByZW1vdmVkCi0JCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+IHByZWZlcmVuY2VNb2RlbCA9IHRoaXMucHJlZmVyZW5jZXMucmVtb3ZlKGtleSk7Ci0JCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChWQUxVRVMsIHByZWZlcmVuY2VNb2RlbCk7Ci0JCX0gZWxzZSBpZiAoICEgdGhpcy5wcmVmZXJlbmNlcy5jb250YWluc0tleShrZXkpKSB7Ci0JCQkvLyBhIHByZWZlcmVuY2Ugd2FzIGFkZGVkCi0JCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+IHByZWZlcmVuY2VNb2RlbCA9IHRoaXMuYnVpbGRQcmVmZXJlbmNlTW9kZWwoa2V5KTsKLQkJCXRoaXMucHJlZmVyZW5jZXMucHV0KGtleSwgcHJlZmVyZW5jZU1vZGVsKTsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChWQUxVRVMsIHByZWZlcmVuY2VNb2RlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBhIHByZWZlcmVuY2UncyB2YWx1ZSBjaGFuZ2VkIC0gZG8gbm90aGluZwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQWJzdHJhY3RUcmVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9BYnN0cmFjdFRyZWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTQ2NDE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9BYnN0cmFjdFRyZWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsOwotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBwcm92aWRlZCBieSB0aGUgSkRLCi0gKiAo4CBsYSBqYXZheC5zd2luZy5BYnN0cmFjdExpc3RNb2RlbCkuIFRoaXMgY2xhc3MgcHJvdmlkZXM6Ci0gKiAtIHN1cHBvcnQgZm9yIGEgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMKLSAqIC0gYSBudW1iZXIgb2YgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmlyaW5nIGV2ZW50cyBmb3IgdGhvc2UgbGlzdGVuZXJzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyZWVNb2RlbAotCWltcGxlbWVudHMgVHJlZU1vZGVsLCBTZXJpYWxpemFibGUKLXsKLQkvKiogT3VyIGxpc3RlbmVycy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdGVuZXJMaXN0ID0gbmV3IEV2ZW50TGlzdGVuZXJMaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBhcnRpYWwgVHJlZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKFRyZWVNb2RlbExpc3RlbmVyLmNsYXNzLCBsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcywgbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtb2RlbCdzIGN1cnJlbnQgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMuCi0JICogKFRoZXJlIHNlZW1zIHRvIGJlIGEgcGF0dGVybiBvZiBtYWtpbmcgdGhpcyB0eXBlIG9mIG1ldGhvZCBwdWJsaWM7Ci0JICogYWx0aG91Z2ggaXQgc2hvdWxkIHByb2JhYmx5IGJlIHByb3RlY3RlZC4uLi4pCi0JICovCi0JcHVibGljIFRyZWVNb2RlbExpc3RlbmVyW10gdHJlZU1vZGVsTGlzdGVuZXJzKCkgewotIAkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycyhUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgbm8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vVHJlZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcykgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1vZGVsIGhhcyBhbnkgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc1RyZWVNb2RlbExpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNOb1RyZWVNb2RlbExpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEEgc2lnbmlmaWNhbnQgcHJvcGVydHkgb2YgdGhlIG5vZGVzIGNoYW5nZWQsIGJ1dCB0aGUgbm9kZXMgdGhlbXNlbHZlcwotCSAqIGFyZSBzdGlsbCB0aGUgc2FtZSBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVOb2Rlc0NoYW5nZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEEgc2lnbmlmaWNhbnQgcHJvcGVydHkgb2YgdGhlIG5vZGUgY2hhbmdlZCwgYnV0IHRoZSBub2RlIGl0c2VsZiBpcyB0aGUgc2FtZSBvYmplY3QuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVDaGFuZ2VkKE9iamVjdFtdIHBhdGgsIGludCBjaGlsZEluZGV4LCBPYmplY3QgY2hpbGQpIHsKLQkJdGhpcy5maXJlVHJlZU5vZGVzQ2hhbmdlZChwYXRoLCBuZXcgaW50W10ge2NoaWxkSW5kZXh9LCBuZXcgT2JqZWN0W10ge2NoaWxkfSk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBBIHNpZ25pZmljYW50IHByb3BlcnR5IG9mIHRoZSByb290IGNoYW5nZWQsIGJ1dCB0aGUgcm9vdCBpdHNlbGYgaXMgdGhlIHNhbWUgb2JqZWN0LgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVSb290Q2hhbmdlZChPYmplY3Qgcm9vdCkgewotCQl0aGlzLmZpcmVUcmVlTm9kZXNDaGFuZ2VkKG5ldyBPYmplY3RbXSB7cm9vdH0sIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVzSW5zZXJ0ZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc0luc2VydGVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVJbnNlcnRlZChPYmplY3RbXSBwYXRoLCBpbnQgY2hpbGRJbmRleCwgT2JqZWN0IGNoaWxkKSB7Ci0JCXRoaXMuZmlyZVRyZWVOb2Rlc0luc2VydGVkKHBhdGgsIG5ldyBpbnRbXSB7Y2hpbGRJbmRleH0sIG5ldyBPYmplY3RbXSB7Y2hpbGR9KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVOb2Rlc1JlbW92ZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50Ci0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVUcmVlTm9kZVJlbW92ZWQoT2JqZWN0W10gcGF0aCwgaW50IGNoaWxkSW5kZXgsIE9iamVjdCBjaGlsZCkgewotCQl0aGlzLmZpcmVUcmVlTm9kZXNSZW1vdmVkKHBhdGgsIG5ldyBpbnRbXSB7Y2hpbGRJbmRleH0sIG5ldyBPYmplY3RbXSB7Y2hpbGR9KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKE9iamVjdFtdIHBhdGgpIHsKLQkJLy8gZ3VhcmFudGVlZCB0byByZXR1cm4gYSBub24tbnVsbCBhcnJheQotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKTsKLQkJVHJlZU1vZGVsRXZlbnQgZXZlbnQgPSBudWxsOwotCQkvLyBwcm9jZXNzIHRoZSBsaXN0ZW5lcnMgbGFzdCB0byBmaXJzdCwgbm90aWZ5aW5nCi0JCS8vIHRob3NlIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gdGhpcyBldmVudAotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aC0yOyBpPj0wOyBpLT0yKSB7Ci0JCQlpZiAobGlzdGVuZXJzW2ldPT1UcmVlTW9kZWxMaXN0ZW5lci5jbGFzcykgewotCQkJCS8vIGxhemlseSBjcmVhdGUgdGhlIGV2ZW50Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJZXZlbnQgPSBuZXcgVHJlZU1vZGVsRXZlbnQodGhpcywgcGF0aCk7Ci0JCQkJfQotCQkJCSgoVHJlZU1vZGVsTGlzdGVuZXIpIGxpc3RlbmVyc1tpKzFdKS50cmVlU3RydWN0dXJlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVSb290UmVwbGFjZWQoT2JqZWN0IG5ld1Jvb3QpIHsKLQkJdGhpcy5maXJlVHJlZVN0cnVjdHVyZUNoYW5nZWQobmV3IE9iamVjdFtdIHtuZXdSb290fSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjZjYmZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuQnV0dG9uTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3RlbmVyCi0gKiAoZS5nLiBhIEpDaGVja0JveCkgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0Ci0gKiBob2xkcyBhIGJvb2xlYW4uCi0gKiAKLSAqIE1heWJlIG5vdCB0aGUgcmljaGVzdCBjbGFzcyBpbiBvdXIgdG9vbGJveCwgYnV0IGl0IHdhcyB0aGUKLSAqIHZpY3RpbSBvZiByZWZhY3RvcmluZy4uLi4gIH5ianYKLSAqLwotcHVibGljIGNsYXNzIENoZWNrQm94TW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBUb2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIKLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBDaGVja0JveE1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcihib29sZWFuSG9sZGVyLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0JICovCi0JcHVibGljIENoZWNrQm94TW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIpIHsKLQkJc3VwZXIoYm9vbGVhbkhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29sdW1uQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbHVtbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyYjVkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29sdW1uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0KLS8qKgotICogVGhpcyBhZGFwdGVyIGlzIHVzZWQgYnkgdGhlIHRhYmxlIG1vZGVsIGFkYXB0ZXIgdG8KLSAqIGNvbnZlcnQgYSBtb2RlbCBvYmplY3QgaW50byB0aGUgbW9kZWxzIHVzZWQgZm9yIGVhY2ggb2YKLSAqIHRoZSBjZWxscyBmb3IgdGhlIG9iamVjdCdzIGNvcnJlc3BvbmRpbmcgcm93IGluIHRoZSB0YWJsZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb2x1bW5BZGFwdGVyIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0YWJsZS4KLQkgKiBUeXBpY2FsbHkgdGhpcyBpcyBzdGF0aWMuCi0JICovCi0JaW50IGNvbHVtbkNvdW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBjb2x1bW4uCi0JICovCi0JU3RyaW5nIGNvbHVtbk5hbWUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCBjb2x1bW4uCi0JICovCi0JQ2xhc3M8Pz4gY29sdW1uQ2xhc3MoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sdW1uIGlzIGVkaXRhYmxlLgotCSAqIFR5cGljYWxseSB0aGlzIGlzIHRoZSBzYW1lIGZvciBldmVyeSByb3cuCi0JICovCi0JYm9vbGVhbiBjb2x1bW5Jc0VkaXRhYmxlKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwgbW9kZWxzIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIHJvdyBpbiB0aGUgdGFibGUuCi0JICovCi0JV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIGNlbGxNb2RlbHMoT2JqZWN0IHN1YmplY3QpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmMzBjZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgTGlzdERhdGFMaXN0ZW5lcgotICogKGUuZy4gYSBKQ29tYm9Cb3gpIGluIHN5bmNoIHdpdGggYSBMaXN0VmFsdWVNb2RlbCAob3IgYSBDb2xsZWN0aW9uVmFsdWVNb2RlbCkuCi0gKiBGb3IgY29tYm8gYm94ZXMsIHRoZSBtb2RlbCBvYmplY3QgdGhhdCBob2xkcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMKLSAqIHR5cGljYWxseSBhIGRpZmZlcmVudCBtb2RlbCBvYmplY3QgdGhhbiB0aGUgb25lIHRoYXQgaG9sZHMgdGhlIGNvbGxlY3Rpb24KLSAqIG9mIGNob2ljZXMuCi0gKiAKLSAqIEZvciBleGFtcGxlLCBhIE1XUmVmZXJlbmNlICh0aGUgc2VsZWN0aW9uT3duZXIpIGhhcyBhbiBhdHRyaWJ1dGUKLSAqICJzb3VyY2VUYWJsZSIgKHRoZSBjb2xsZWN0aW9uT3duZXIpCi0gKiB3aGljaCBob2xkcyBvbiB0byBhIGNvbGxlY3Rpb24gb2YgTVdEYXRhYmFzZUZpZWxkcy4gV2hlbiB0aGUgc2VsZWN0aW9uCi0gKiBpcyBjaGFuZ2VkIHRoaXMgbW9kZWwgd2lsbCBrZWVwIHRoZSBsaXN0ZW5lcnMgYXdhcmUgb2YgdGhlIGNoYW5nZXMuCi0gKiBUaGUgaW5oZXJpdGVkIGxpc3QgbW9kZWwgd2lsbCBrZWVwIGl0cyBsaXN0ZW5lcnMgYXdhcmUgb2YgY2hhbmdlcyB0byB0aGUKLSAqIGNvbGxlY3Rpb24gbW9kZWwKLSAqIAotICogSW4gYWRkaXRpb24gdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIHJlcXVpcmVkIGJ5IHRoZSBzdXBlcmNsYXNzLAotICogYW4gaW5zdGFuY2Ugb2YgdGhpcyBDb21ib0JveE1vZGVsIG11c3QgYmUgc3VwcGxpZWQgd2l0aCBhCi0gKiBzZWxlY3Rpb24gaG9sZGVyLCB3aGljaCBpcyBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IHByb3ZpZGVzIGFjY2VzcwotICogdG8gdGhlIHNlbGVjdGlvbiAodHlwaWNhbGx5IGEgUHJvcGVydHlBc3BlY3RBZGFwdGVyKS4KLSAqLwotcHVibGljIGNsYXNzIENvbWJvQm94TW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBMaXN0TW9kZWxBZGFwdGVyCi0JaW1wbGVtZW50cyBDb21ib0JveE1vZGVsCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0aW9uSG9sZGVyOwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciBhbmQgc2VsZWN0aW9uIGhvbGRlciBhcmUgcmVxdWlyZWQ7Ci0JICovCi0JcHVibGljIENvbWJvQm94TW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0aW9uSG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQlpZiAoc2VsZWN0aW9uSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc2VsZWN0aW9uSG9sZGVyID0gc2VsZWN0aW9uSG9sZGVyOwotCQl0aGlzLnNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgY29sbGVjdGlvbiBob2xkZXIgYW5kIHNlbGVjdGlvbiBob2xkZXIgYXJlIHJlcXVpcmVkOwotCSAqLwotCXB1YmxpYyBDb21ib0JveE1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PiBjb2xsZWN0aW9uSG9sZGVyLCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcihjb2xsZWN0aW9uSG9sZGVyKTsKLQkJaWYgKHNlbGVjdGlvbkhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnNlbGVjdGlvbkhvbGRlciA9IHNlbGVjdGlvbkhvbGRlcjsKLQkJdGhpcy5zZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gbm90aWZ5IGxpc3RlbmVycyB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlci50aGlzLmZpcmVTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21ib0JveE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRJdGVtKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3Rpb25Ib2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEl0ZW0oT2JqZWN0IHNlbGVjdGVkSXRlbSkgewotCQl0aGlzLnNlbGVjdGlvbkhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZEl0ZW0pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gZW5nYWdlIHRoZSBzZWxlY3Rpb24gaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQl0aGlzLnNlbGVjdGlvbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGRpc2VuZ2FnZSB0aGUgc2VsZWN0aW9uIGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5zZWxlY3Rpb25Ib2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSB0aGUgbGlzdGVuZXJzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJLy8gSSBndWVzcyB0aGlzIHdpbGwgd29yay4uLgotCQl0aGlzLmZpcmVDb250ZW50c0NoYW5nZWQodGhpcywgLTEsIC0xKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnNlbGVjdGlvbkhvbGRlciArICI6IiArIHRoaXMubGlzdEhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDAyNTZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyRGF0ZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5TcGlubmVyRGF0ZU1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBDaGFuZ2VMaXN0ZW5lcgotICogKGUuZy4gYSBKU3Bpbm5lcikgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgZGF0ZS4KLSAqIAotICogVGhpcyBjbGFzcyBtdXN0IGJlIGEgc3ViLWNsYXNzIG9mIFNwaW5uZXJEYXRlTW9kZWwgYmVjYXVzZSBvZiBzb21lCi0gKiBjcmFwcHkgamRrIGNvZGUuLi4uICB+Ymp2Ci0gKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyI2NyZWF0ZUVkaXRvcihqYXZheC5zd2luZy5TcGlubmVyTW9kZWwpCi0gKiAKLSAqIElmIHRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgbW9kaWZpZWQsIGl0IHdvdWxkIGJlaG9vdmUgdXMgdG8gcmV2aWV3IHRoZQotICogb3RoZXIsIHNpbWlsYXIgY2xhc3NlczoKLSAqIEBzZWUgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqIEBzZWUgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIFNwaW5uZXJEYXRlTW9kZWwKLXsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWU7IHVzZWQgd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBkYXRlIHZhbHVlIGlzIG51bGwuCi0JICogVGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgZGF0ZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIERhdGUgZGVmYXVsdFZhbHVlOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgZGF0ZS4gKi8KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZGF0ZUhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGggY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGUuICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGRhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgZGF0ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZSBpcyB0aGUgY3VycmVudCBkYXRlLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGRhdGVIb2xkZXIpIHsKLQkJdGhpcyhkYXRlSG9sZGVyLCBuZXcgRGF0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBkYXRlIGhvbGRlciBhbmQgZGVmYXVsdCB2YWx1ZSBhcmUgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZGF0ZUhvbGRlciwgRGF0ZSBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhkYXRlSG9sZGVyLCBudWxsLCBudWxsLCBDYWxlbmRhci5EQVlfT0ZfTU9OVEgsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgZGF0ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZSBpcyB0aGUgY3VycmVudCBkYXRlLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGRhdGVIb2xkZXIsIENvbXBhcmFibGU8Pz4gc3RhcnQsIENvbXBhcmFibGU8Pz4gZW5kLCBpbnQgY2FsZW5kYXJGaWVsZCkgewotCQl0aGlzKGRhdGVIb2xkZXIsIHN0YXJ0LCBlbmQsIGNhbGVuZGFyRmllbGQsIG5ldyBEYXRlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGRhdGUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGRhdGVIb2xkZXIsIENvbXBhcmFibGU8Pz4gc3RhcnQsIENvbXBhcmFibGU8Pz4gZW5kLCBpbnQgY2FsZW5kYXJGaWVsZCwgRGF0ZSBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIoZGF0ZUhvbGRlci5nZXRWYWx1ZSgpID09IG51bGwgPyBkZWZhdWx0VmFsdWUgOiAoRGF0ZSkgZGF0ZUhvbGRlci5nZXRWYWx1ZSgpLCBzdGFydCwgZW5kLCBjYWxlbmRhckZpZWxkKTsKLQkJdGhpcy5kYXRlSG9sZGVyID0gZGF0ZUhvbGRlcjsKLQkJdGhpcy5kYXRlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBkYXRlCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZERhdGVDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCURhdGVTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMuc3luY2hyb25pemUoZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkYXRlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3Bpbm5lck1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBjaGVjayB3aGV0aGVyIHRoaXMgbWV0aG9kIGlzIGJlaW5nIGNhbGxlZCBiZWZvcmUgd2UgCi0JICogaGF2ZSBhbnkgbGlzdGVuZXJzLgotCSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZSBjcmFwcHkgamRrIGNvZGUgZ2V0cyB0aGUgdmFsdWUKLQkgKiBmcm9tIHRoZSBtb2RlbCAqYmVmb3JlKiBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLiAgfmJqdgotCSAqIEBzZWUgamF2YXguc3dpbmcuSlNwaW5uZXIuRGVmYXVsdEVkaXRvcihqYXZheC5zd2luZy5KU3Bpbm5lcikKLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJLy8gc29ycnkgYWJvdXQgdGhpcyAibGF0ZXJhbCIgY2FsbCB0byBzdXBlciAgfmJqdgotCQkJc3VwZXIuc2V0VmFsdWUodGhpcy5zcGlubmVyVmFsdWVPZih0aGlzLmRhdGVIb2xkZXIuZ2V0VmFsdWUoKSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgZGF0ZSBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemUoT2JqZWN0KS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJc3VwZXIuc2V0VmFsdWUodmFsdWUpOwotCQl0aGlzLmRhdGVIb2xkZXIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgZGF0ZSBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMuZGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5kYXRlQ2hhbmdlTGlzdGVuZXIpOwotCQkJdGhpcy5zeW5jaHJvbml6ZSh0aGlzLmRhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBkYXRlIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMuZGF0ZUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5kYXRlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIERhdGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0byBhIG5vbi1udWxsIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgc3Bpbm5lclZhbHVlT2YoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyB0aGlzLmdldERlZmF1bHRWYWx1ZSgpIDogdmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgc3Bpbm5lciB2YWx1ZSBpZiBpdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIHN5bmNocm9uaXplKE9iamVjdCB2YWx1ZSkgewotCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLnNwaW5uZXJWYWx1ZU9mKHZhbHVlKTsKLQkJLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIHNwaW5uZXIgZGF0ZSBoYXMgYWxyZWFkeSBiZWVuIHN5bmNocm9uaXplZAotCQkvLyAodmlhICNzZXRWYWx1ZSgpKQotCQlpZiAoICEgdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCXRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kYXRlSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmMDRkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5FdmVudExpc3RlbmVyTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5VbmRvYWJsZUVkaXRFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5VbmRvYWJsZUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkF0dHJpYnV0ZVNldDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5FbGVtZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuUGxhaW5Eb2N1bWVudDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuU2VnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcudGV4dC5Eb2N1bWVudCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgRG9jdW1lbnRMaXN0ZW5lcgotICogKGUuZy4gYSBKVGV4dEZpZWxkKSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSBzdHJpbmcuCi0gKiAKLSAqIE5COiBUaGlzIG1vZGVsIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yICJzbWFsbCIgZG9jdW1lbnRzOwotICogaS5lLiBkb2N1bWVudHMgdXNlZCBieSB0ZXh0IGZpZWxkcywgbm90IHRleHQgcGFuZXMuCi0gKiBAc2VlICNzeW5jaHJvbml6ZURlbGVnYXRlKFN0cmluZykKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50QWRhcHRlcgotCWltcGxlbWVudHMgRG9jdW1lbnQsIFNlcmlhbGl6YWJsZQotewotCi0JLyoqIFRoZSBkZWxlZ2F0ZSBkb2N1bWVudCB3aG9zZSBiZWhhdmlvciB3ZSAiZW5oYW5jZSIuICovCi0JcHJvdGVjdGVkIGZpbmFsIERvY3VtZW50IGRlbGVnYXRlOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gZm9yd2FyZCBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBkZWxlZ2F0ZSBkb2N1bWVudC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYmluZWRMaXN0ZW5lciBkZWxlZ2F0ZUxpc3RlbmVyOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgc3RyaW5nLiAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGggY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzdHJpbmdMaXN0ZW5lcjsKLQotICAgIC8qKiBUaGUgZXZlbnQgbGlzdGVuZXIgbGlzdCBmb3IgdGhlIGRvY3VtZW50LiAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBFdmVudExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgRXZlbnRMaXN0ZW5lckxpc3QoKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgc3RyaW5nIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIERvY3VtZW50QWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlciwgRG9jdW1lbnQgZGVsZWdhdGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHN0cmluZ0hvbGRlciA9PSBudWxsIHx8IGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc3RyaW5nSG9sZGVyID0gc3RyaW5nSG9sZGVyOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgc3RyaW5nCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JCXRoaXMuc3RyaW5nTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdGVuZXIoKTsKLQkJdGhpcy5kZWxlZ2F0ZUxpc3RlbmVyID0gdGhpcy5idWlsZERlbGVnYXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBzdHJpbmcgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFdyYXAgYSBwbGFpbiBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nSG9sZGVyKSB7Ci0JCXRoaXMoc3RyaW5nSG9sZGVyLCBuZXcgUGxhaW5Eb2N1bWVudCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdHJpbmdMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU3RyaW5nTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RyaW5nTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCURvY3VtZW50QWRhcHRlci50aGlzLnN0cmluZ0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3RyaW5nIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYmluZWRMaXN0ZW5lciBidWlsZERlbGVnYXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSW50ZXJuYWxMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEb2N1bWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbHMgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50TGlzdGVuZXIoRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChEb2N1bWVudExpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRlbGVnYXRlLmFkZERvY3VtZW50TGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJCXRoaXMuZW5nYWdlU3RyaW5nSG9sZGVyKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKERvY3VtZW50TGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWxzIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50TGlzdGVuZXIoRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUoRG9jdW1lbnRMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChEb2N1bWVudExpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVN0cmluZ0hvbGRlcigpOwotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMuZGVsZWdhdGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBkZWxlZ2F0ZSBkb2N1bWVudCBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVW5kb2FibGVFZGl0TGlzdGVuZXIoVW5kb2FibGVFZGl0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyQ291bnQoVW5kb2FibGVFZGl0TGlzdGVuZXIuY2xhc3MpID09IDApIHsKLQkJCXRoaXMuZGVsZWdhdGUuYWRkVW5kb2FibGVFZGl0TGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQoVW5kb2FibGVFZGl0TGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGRlbGVnYXRlIGRvY3VtZW50IGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVVuZG9hYmxlRWRpdExpc3RlbmVyKFVuZG9hYmxlRWRpdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcykgPT0gMCkgewotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVVbmRvYWJsZUVkaXRMaXN0ZW5lcih0aGlzLmRlbGVnYXRlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFByb3BlcnR5KGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0UHJvcGVydHkoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRoaXMuZGVsZWdhdGUucHV0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBtb2RlbCBzdHJpbmcgZGlyZWN0bHkuCi0JICogVGhlIHJlc3VsdGluZyBldmVudCB3aWxsIGJlIGlnbm9yZWQ6IEBzZWUgI3N5bmNocm9uaXplRGVsZWdhdGUoU3RyaW5nKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IG9mZnNldCwgaW50IGxlbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmUob2Zmc2V0LCBsZW4pOwotCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRWYWx1ZSh0aGlzLmRlbGVnYXRlLmdldFRleHQoMCwgdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKSkpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgbW9kZWwgc3RyaW5nIGRpcmVjdGx5LgotCSAqIFRoZSByZXN1bHRpbmcgZXZlbnQgd2lsbCBiZSBpZ25vcmVkOiBAc2VlICNzeW5jaHJvbml6ZURlbGVnYXRlKFN0cmluZykuCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0U3RyaW5nKGludCBvZmZzZXQsIFN0cmluZyBpbnNlcnRlZFN0cmluZywgQXR0cmlidXRlU2V0IGEpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRoaXMuZGVsZWdhdGUuaW5zZXJ0U3RyaW5nKG9mZnNldCwgaW5zZXJ0ZWRTdHJpbmcsIGEpOwotCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRWYWx1ZSh0aGlzLmRlbGVnYXRlLmdldFRleHQoMCwgdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKSkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRUZXh0KG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZXRUZXh0KGludCBvZmZzZXQsIGludCBsZW5ndGgsIFNlZ21lbnQgdHh0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aGlzLmRlbGVnYXRlLmdldFRleHQob2Zmc2V0LCBsZW5ndGgsIHR4dCk7Ci0JfQotCi0JcHVibGljIFBvc2l0aW9uIGdldFN0YXJ0UG9zaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFN0YXJ0UG9zaXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgUG9zaXRpb24gZ2V0RW5kUG9zaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldEVuZFBvc2l0aW9uKCk7Ci0JfQotCi0JcHVibGljIFBvc2l0aW9uIGNyZWF0ZVBvc2l0aW9uKGludCBvZmZzKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVQb3NpdGlvbihvZmZzKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudFtdIGdldFJvb3RFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0Um9vdEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0RGVmYXVsdFJvb3RFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXREZWZhdWx0Um9vdEVsZW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW5kZXIoUnVubmFibGUgcikgewotCQl0aGlzLmRlbGVnYXRlLnJlbmRlcihyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgRG9jdW1lbnRMaXN0ZW5lcltdIGRvY3VtZW50TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKERvY3VtZW50TGlzdGVuZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBVbmRvYWJsZUVkaXRMaXN0ZW5lcltdIHVuZG9hYmxlRWRpdExpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycyhVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgdGhpcmQgcGFydHkgaGFzIG1vZGlmaWVkIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZy4KLQkgKiBTeW5jaHJvbml6ZSB0aGUgZGVsZWdhdGUgZG9jdW1lbnQgYWNjb3JkaW5nbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RyaW5nQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSgoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSBkb2N1bWVudCdzIGVudGlyZSB0ZXh0IHN0cmluZyB3aXRoIHRoZSBuZXcgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplRGVsZWdhdGUoU3RyaW5nIHMpIHsKLQkJdHJ5IHsKLQkJCWludCBsZW4gPSB0aGlzLmRlbGVnYXRlLmdldExlbmd0aCgpOwotCQkJLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGRlbGVnYXRlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCQkvLyAodmlhICNpbnNlcnRTdHJpbmcoKSBvciAjcmVtb3ZlKCkpCi0JCQlpZiAoICEgdGhpcy5kZWxlZ2F0ZS5nZXRUZXh0KDAsIGxlbikuZXF1YWxzKHMpKSB7Ci0JCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmUoMCwgbGVuKTsKLQkJCQl0aGlzLmRlbGVnYXRlLmluc2VydFN0cmluZygwLCBzLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3RyaW5nSG9sZGVyKCkgewotCQl0aGlzLnN0cmluZ0hvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdHJpbmdMaXN0ZW5lcik7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSh0aGlzLnN0cmluZ0hvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdHJpbmdIb2xkZXIoKSB7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN0cmluZ0xpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxlZ2F0ZUNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBubyBuZWVkIHRvIGxhenktaW5pdGlhbGl6ZSB0aGUgZXZlbnQ7Ci0JCS8vIHdlIHdvdWxkbid0IGdldCBoZXJlIGlmIHdlIGRpZCBub3QgaGF2ZSBsaXN0ZW5lcnMuLi4KLQkJRG9jdW1lbnRFdmVudCBlZSA9IG5ldyBJbnRlcm5hbERvY3VtZW50RXZlbnQodGhpcywgZXZlbnQpOwotCQlEb2N1bWVudExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy5kb2N1bWVudExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaV0uY2hhbmdlZFVwZGF0ZShlZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxlZ2F0ZUluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCS8vIG5vIG5lZWQgdG8gbGF6eS1pbml0aWFsaXplIHRoZSBldmVudDsKLQkJLy8gd2Ugd291bGRuJ3QgZ2V0IGhlcmUgaWYgd2UgZGlkIG5vdCBoYXZlIGxpc3RlbmVycy4uLgotCQlEb2N1bWVudEV2ZW50IGVlID0gbmV3IEludGVybmFsRG9jdW1lbnRFdmVudCh0aGlzLCBldmVudCk7Ci0JCURvY3VtZW50TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSB0aGlzLmRvY3VtZW50TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWxpc3RlbmVyc1tpXS5pbnNlcnRVcGRhdGUoZWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZWdhdGVSZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBubyBuZWVkIHRvIGxhenktaW5pdGlhbGl6ZSB0aGUgZXZlbnQ7Ci0JCS8vIHdlIHdvdWxkbid0IGdldCBoZXJlIGlmIHdlIGRpZCBub3QgaGF2ZSBsaXN0ZW5lcnMuLi4KLQkJRG9jdW1lbnRFdmVudCBlZSA9IG5ldyBJbnRlcm5hbERvY3VtZW50RXZlbnQodGhpcywgZXZlbnQpOwotCQlEb2N1bWVudExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy5kb2N1bWVudExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaV0ucmVtb3ZlVXBkYXRlKGVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGVnYXRlVW5kb2FibGVFZGl0SGFwcGVuZWQoVW5kb2FibGVFZGl0RXZlbnQgZXZlbnQpIHsKLQkJLy8gbm8gbmVlZCB0byBsYXp5LWluaXRpYWxpemUgdGhlIGV2ZW50OwotCQkvLyB3ZSB3b3VsZG4ndCBnZXQgaGVyZSBpZiB3ZSBkaWQgbm90IGhhdmUgbGlzdGVuZXJzLi4uCi0JCVVuZG9hYmxlRWRpdEV2ZW50IGVlID0gbmV3IFVuZG9hYmxlRWRpdEV2ZW50KHRoaXMsIGV2ZW50LmdldEVkaXQoKSk7Ci0JCVVuZG9hYmxlRWRpdExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy51bmRvYWJsZUVkaXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVycy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJbGlzdGVuZXJzW2ldLnVuZG9hYmxlRWRpdEhhcHBlbmVkKGVlKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnN0cmluZ0hvbGRlcik7Ci0JfQotCi0KLS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGludGVyZmFjZSBDb21iaW5lZExpc3RlbmVyIGV4dGVuZHMgRG9jdW1lbnRMaXN0ZW5lciwgVW5kb2FibGVFZGl0TGlzdGVuZXIgewotCQkvLyBqdXN0IGNvbnNvbGlkYXRlIHRoZSB0d28gaW50ZXJmYWNlcwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBJbnRlcm5hbExpc3RlbmVyIGltcGxlbWVudHMgQ29tYmluZWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRG9jdW1lbnRBZGFwdGVyLnRoaXMuZGVsZWdhdGVDaGFuZ2VkVXBkYXRlKGV2ZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpbnNlcnRVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRG9jdW1lbnRBZGFwdGVyLnRoaXMuZGVsZWdhdGVJbnNlcnRVcGRhdGUoZXZlbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlEb2N1bWVudEFkYXB0ZXIudGhpcy5kZWxlZ2F0ZVJlbW92ZVVwZGF0ZShldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgdW5kb2FibGVFZGl0SGFwcGVuZWQoVW5kb2FibGVFZGl0RXZlbnQgZXZlbnQpIHsKLQkJCURvY3VtZW50QWRhcHRlci50aGlzLmRlbGVnYXRlVW5kb2FibGVFZGl0SGFwcGVuZWQoZXZlbnQpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSW50ZXJuYWxEb2N1bWVudEV2ZW50Ci0JCWV4dGVuZHMgRXZlbnRPYmplY3QKLQkJaW1wbGVtZW50cyBEb2N1bWVudEV2ZW50Ci0JewotCQlwcm90ZWN0ZWQgRG9jdW1lbnRFdmVudCBkZWxlZ2F0ZTsKLQkKLQkJcHJvdGVjdGVkIEludGVybmFsRG9jdW1lbnRFdmVudChEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRFdmVudCBkZWxlZ2F0ZSkgewotCQkJc3VwZXIoZG9jdW1lbnQpOwotCQkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotCQl9Ci0JCXB1YmxpYyBFbGVtZW50Q2hhbmdlIGdldENoYW5nZShFbGVtZW50IGVsZW0pIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldENoYW5nZShlbGVtKTsKLQkJfQotCQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCQlyZXR1cm4gKERvY3VtZW50KSB0aGlzLnNvdXJjZTsKLQkJfQotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldExlbmd0aCgpOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0T2Zmc2V0KCk7Ci0JCX0KLQkJcHVibGljIEV2ZW50VHlwZSBnZXRUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0VHlwZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhZDc0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdExpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0RGF0YUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuTGlzdE1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBMaXN0RGF0YUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpMaXN0KSBpbiBzeW5jaCB3aXRoIGEgTGlzdFZhbHVlTW9kZWwgKG9yIGEgQ29sbGVjdGlvblZhbHVlTW9kZWwpLgotICogCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIExpc3RNb2RlbCAqbXVzdCogYmUgc3VwcGxpZWQgd2l0aCBhIHZhbHVlIG1vZGVsLAotICogd2hpY2ggaXMgYSBMaXN0VmFsdWVNb2RlbCBvbiB0aGUgYm91bmQgbGlzdCBvciBhIENvbGxlY3Rpb25WYWx1ZU1vZGVsCi0gKiBvbiB0aGUgYm91bmQgY29sbGVjdGlvbi4gVGhpcyBpcyByZXF1aXJlZCAtIHRoZSBsaXN0IChvciBjb2xsZWN0aW9uKQotICogaXRzZWxmIGNhbiBiZSBudWxsLCBidXQgdGhlIHZhbHVlIG1vZGVsIHRoYXQgaG9sZHMgaXQgY2Fubm90LgotICovCi1wdWJsaWMgY2xhc3MgTGlzdE1vZGVsQWRhcHRlcgotCWV4dGVuZHMgQWJzdHJhY3RMaXN0TW9kZWwKLXsKLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LiAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyOwotCi0JLyoqCi0JICogQ2FjaGUgdGhlIHNpemUgb2YgdGhlIGxpc3QgZm9yICJkcmFtYXRpYyIgY2hhbmdlcy4KLQkgKiBAc2VlICNsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGludCBsaXN0U2l6ZTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGZvcndhcmQgY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IgLSBpbml0aWFsaXplIHN0dWZmLgotCSAqLwotCXByaXZhdGUgTGlzdE1vZGVsQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0U2l6ZSA9IDA7Ci0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0TW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIpIHsKLQkJdGhpcygpOwotCQl0aGlzLnNldE1vZGVsKGxpc3RIb2xkZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0TW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcygpOwotCQl0aGlzLnNldE1vZGVsKGNvbGxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlci50aGlzLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkTGlzdERhdGFMaXN0ZW5lcihMaXN0RGF0YUxpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0RGF0YUxpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCQl0aGlzLmxpc3RTaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJfQotCQlzdXBlci5hZGRMaXN0RGF0YUxpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3REYXRhTGlzdGVuZXIoTGlzdERhdGFMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmhhc05vTGlzdERhdGFMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQkJdGhpcy5saXN0U2l6ZSA9IDA7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgbGlzdCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdFZhbHVlTW9kZWw8Pz4gbW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXI7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIpIHsKLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMgPSB0aGlzLmhhc0xpc3REYXRhTGlzdGVuZXJzKCk7Ci0JCWlmIChoYXNMaXN0ZW5lcnMpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCQl0aGlzLmxpc3RIb2xkZXIgPSBsaXN0SG9sZGVyOwotCQlpZiAoaGFzTGlzdGVuZXJzKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCQl0aGlzLmxpc3RDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbiBtb2RlbC4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMuc2V0TW9kZWwobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3REYXRhTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0RGF0YUxpc3RlbmVycygpLmxlbmd0aCA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIGFueSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdERhdGFMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTm9MaXN0RGF0YUxpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQgc3RhcnQgPSBldmVudC5nZXRJbmRleCgpOwotCQlpbnQgZW5kID0gc3RhcnQgKyBldmVudC5pdGVtc1NpemUoKSAtIDE7Ci0JCXRoaXMuZmlyZUludGVydmFsQWRkZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JCXRoaXMubGlzdFNpemUgKz0gZXZlbnQuaXRlbXNTaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHN0YXJ0ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJaW50IGVuZCA9IHN0YXJ0ICsgZXZlbnQuaXRlbXNTaXplKCkgLSAxOwotCQl0aGlzLmZpcmVJbnRlcnZhbFJlbW92ZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JCXRoaXMubGlzdFNpemUgLT0gZXZlbnQuaXRlbXNTaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHN0YXJ0ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJaW50IGVuZCA9IHN0YXJ0ICsgZXZlbnQuaXRlbXNTaXplKCkgLSAxOwotCQl0aGlzLmZpcmVDb250ZW50c0NoYW5nZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHN0YXJ0ID0gTWF0aC5taW4oZXZlbnQuZ2V0U291cmNlSW5kZXgoKSwgZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSk7Ci0JCWludCBlbmQgPSBNYXRoLm1heChldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRUYXJnZXRJbmRleCgpKSArIGV2ZW50LmdldE1vdmVMZW5ndGgoKSAtIDE7Ci0JCXRoaXMuZmlyZUNvbnRlbnRzQ2hhbmdlZCh0aGlzLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IHdhcyBjbGVhcmVkLgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoKSB7Ci0JCWlmICh0aGlzLmxpc3RTaXplICE9IDApIHsKLQkJCXRoaXMuZmlyZUludGVydmFsUmVtb3ZlZCh0aGlzLCAwLCB0aGlzLmxpc3RTaXplIC0gMSk7Ci0JCQl0aGlzLmxpc3RTaXplID0gMDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QgaGFzIGNoYW5nZWQgImRyYW1hdGljYWxseSIuCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMubGlzdFNpemUgIT0gMCkgewotCQkJdGhpcy5maXJlSW50ZXJ2YWxSZW1vdmVkKHRoaXMsIDAsIHRoaXMubGlzdFNpemUgLSAxKTsKLQkJfQotCQl0aGlzLmxpc3RTaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJaWYgKHRoaXMubGlzdFNpemUgIT0gMCkgewotCQkJdGhpcy5maXJlSW50ZXJ2YWxBZGRlZCh0aGlzLCAwLCB0aGlzLmxpc3RTaXplIC0gMSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlZTdiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJMaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLlNwaW5uZXJMaXN0TW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIENoYW5nZUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpTcGlubmVyKSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSB2YWx1ZQotICogaW4gdGhlIGxpc3QuCi0gKiAKLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHN1Yi1jbGFzcyBvZiBTcGlubmVyTGlzdE1vZGVsIGJlY2F1c2Ugb2Ygc29tZQotICogY3JhcHB5IGpkayBjb2RlLi4uLiAgfmJqdgotICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lciNjcmVhdGVFZGl0b3IoamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsKQotICogCi0gKiBOQjogVGhpcyBtb2RlbCBzaG91bGQgb25seSBiZSB1c2VkIGZvciB2YWx1ZXMgdGhhdCBoYXZlIGEgcmVhc29uYWJseQotICogaW5leHBlbnNpdmUgI2VxdWFscygpIGltcGxlbWVudGF0aW9uLgotICogQHNlZSAjc3luY2hyb25pemUoT2JqZWN0KQotICogCi0gKiBJZiB0aGlzIGNsYXNzIG5lZWRzIHRvIGJlIG1vZGlmaWVkLCBpdCB3b3VsZCBiZWhvb3ZlIHVzIHRvIHJldmlldyB0aGUKLSAqIG90aGVyLCBzaW1pbGFyIGNsYXNzZXM6Ci0gKiBAc2VlIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyCi0gKiBAc2VlIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBTcGlubmVyTGlzdE1vZGVsCi17Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlOyB1c2VkIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgdmFsdWUgaXMgbnVsbC4KLQkgKiBUaGUgZGVmYXVsdCBpcyB0aGUgZmlyc3QgaXRlbSBvbiB0aGUgbGlzdC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBkZWZhdWx0VmFsdWU7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyB2YWx1ZS4gKi8KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyB2YWx1ZS4gKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdmFsdWVDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFVzZSB0aGUgbW9kZWwgdmFsdWUgaXRzZWxmIGFzIHRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUuCi0JICovCi0JcHVibGljIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgdmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIG5ldyBPYmplY3RbXSB7ZGVmYXVsdFZhbHVlfSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IG9mIHZhbHVlcyBhcyB0aGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBPYmplY3RbXSB2YWx1ZXMpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgdmFsdWVzLCB2YWx1ZXNbMF0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgT2JqZWN0W10gdmFsdWVzLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIEFycmF5cy5hc0xpc3QodmFsdWVzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IG9mIHZhbHVlcyBhcyB0aGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBMaXN0PE9iamVjdD4gdmFsdWVzKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIHZhbHVlcywgdmFsdWVzLmdldCgwKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBMaXN0PE9iamVjdD4gdmFsdWVzLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKHZhbHVlcyk7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSB2YWx1ZUhvbGRlcjsKLQkJdGhpcy52YWx1ZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gcG9zdHBvbmUgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMuc3luY2hyb25pemUoZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNwaW5uZXJNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gY2hlY2sgd2hldGhlciB0aGlzIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgYmVmb3JlIHdlIAotCSAqIGhhdmUgYW55IGxpc3RlbmVycy4KLQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgY3JhcHB5IGpkayBjb2RlIGdldHMgdGhlIHZhbHVlCi0JICogZnJvbSB0aGUgbW9kZWwgKmJlZm9yZSogbGlzdGVuaW5nIHRvIHRoZSBtb2RlbC4gIH5ianYKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyLkRlZmF1bHRFZGl0b3IoamF2YXguc3dpbmcuSlNwaW5uZXIpCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCS8vIHNvcnJ5IGFib3V0IHRoaXMgImxhdGVyYWwiIGNhbGwgdG8gc3VwZXIgIH5ianYKLQkJCXN1cGVyLnNldFZhbHVlKHRoaXMuc3Bpbm5lclZhbHVlT2YodGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyB2YWx1ZSBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemUoT2JqZWN0KS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJc3VwZXIuc2V0VmFsdWUodmFsdWUpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy52YWx1ZUNoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemUodGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudmFsdWVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdG8gYSBub24tbnVsbCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHNwaW5uZXJWYWx1ZU9mKE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0VmFsdWUoKSA6IHZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIHNwaW5uZXIgdmFsdWUgaWYgaXQgaGFzIGNoYW5nZWQuCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZShPYmplY3QgdmFsdWUpIHsKLQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5zcGlubmVyVmFsdWVPZih2YWx1ZSk7Ci0JCS8vIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBzcGlubmVyIHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCS8vICh2aWEgI3NldFZhbHVlKCkpCi0JCWlmICggISB0aGlzLmdldFZhbHVlKCkuZXF1YWxzKG5ld1ZhbHVlKSkgewotCQkJdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnZhbHVlSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTg4YWE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJOdW1iZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuU3Bpbm5lck51bWJlck1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBDaGFuZ2VMaXN0ZW5lcgotICogKGUuZy4gYSBKU3Bpbm5lcikgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgbnVtYmVyLgotICogCi0gKiBUaGlzIGNsYXNzIG11c3QgYmUgYSBzdWItY2xhc3Mgb2YgU3Bpbm5lck51bWJlck1vZGVsIGJlY2F1c2Ugb2Ygc29tZQotICogY3JhcHB5IGpkayBjb2RlLi4uLiAgfmJqdgotICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lciNjcmVhdGVFZGl0b3IoamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsKQotICogCi0gKiBJZiB0aGlzIGNsYXNzIG5lZWRzIHRvIGJlIG1vZGlmaWVkLCBpdCB3b3VsZCBiZWhvb3ZlIHVzIHRvIHJldmlldyB0aGUKLSAqIG90aGVyLCBzaW1pbGFyIGNsYXNzZXM6Ci0gKiBAc2VlIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyCi0gKiBAc2VlIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBTcGlubmVyTnVtYmVyTW9kZWwKLXsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWU7IHVzZWQgd2hlbiB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsIG51bWJlciB2YWx1ZSBpcyBudWxsLgotCSAqLwotCXByaXZhdGUgZmluYWwgTnVtYmVyIGRlZmF1bHRWYWx1ZTsKLQotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG51bWJlci4gKi8KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoCi0JICogY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG51bWJlci4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbnVtYmVyQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZSBpcyB6ZXJvLgotCSAqIFRoZSBzdGVwIHNpemUgaXMgb25lLgotCSAqLwotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyKSB7Ci0JCXRoaXMobnVtYmVySG9sZGVyLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBudW1iZXIgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBzdGVwIHNpemUgaXMgb25lLgotCSAqLwotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyLCBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXMobnVtYmVySG9sZGVyLCBudWxsLCBudWxsLCBuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoZGVmYXVsdFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBVc2UgdGhlIG1pbmltdW0gdmFsdWUgYXMgdGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgaW50IG1pbmltdW0sIGludCBtYXhpbXVtLCBpbnQgc3RlcFNpemUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIG1pbmltdW0sIG1heGltdW0sIHN0ZXBTaXplLCBtaW5pbXVtKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBudW1iZXIgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyLCBpbnQgbWluaW11bSwgaW50IG1heGltdW0sIGludCBzdGVwU2l6ZSwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKG51bWJlckhvbGRlciwgbmV3IEludGVnZXIobWluaW11bSksIG5ldyBJbnRlZ2VyKG1heGltdW0pLCBuZXcgSW50ZWdlcihzdGVwU2l6ZSksIG5ldyBJbnRlZ2VyKGRlZmF1bHRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBtaW5pbXVtIHZhbHVlIGFzIHRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIGRvdWJsZSB2YWx1ZSwgZG91YmxlIG1pbmltdW0sIGRvdWJsZSBtYXhpbXVtLCBkb3VibGUgc3RlcFNpemUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIHZhbHVlLCBtaW5pbXVtLCBtYXhpbXVtLCBzdGVwU2l6ZSwgbWluaW11bSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgZG91YmxlIHZhbHVlLCBkb3VibGUgbWluaW11bSwgZG91YmxlIG1heGltdW0sIGRvdWJsZSBzdGVwU2l6ZSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKG51bWJlckhvbGRlciwgbmV3IERvdWJsZShtaW5pbXVtKSwgbmV3IERvdWJsZShtYXhpbXVtKSwgbmV3IERvdWJsZShzdGVwU2l6ZSksIG5ldyBEb3VibGUoZGVmYXVsdFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgQ29tcGFyYWJsZTw/PiBtaW5pbXVtLCBDb21wYXJhYmxlPD8+IG1heGltdW0sIE51bWJlciBzdGVwU2l6ZSwgTnVtYmVyIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcihudW1iZXJIb2xkZXIuZ2V0VmFsdWUoKSA9PSBudWxsID8gZGVmYXVsdFZhbHVlIDogKE51bWJlcikgbnVtYmVySG9sZGVyLmdldFZhbHVlKCksIG1pbmltdW0sIG1heGltdW0sIHN0ZXBTaXplKTsKLQkJdGhpcy5udW1iZXJIb2xkZXIgPSBudW1iZXJIb2xkZXI7Ci0JCXRoaXMubnVtYmVyQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gcG9zdHBvbmUgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG51bWJlcgotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZE51bWJlckNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE51bWJlckNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMuc3luY2hyb25pemUoZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJudW1iZXIgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTcGlubmVyTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBtZXRob2QgaXMgYmVpbmcgY2FsbGVkIGJlZm9yZSB3ZSAKLQkgKiBoYXZlIGFueSBsaXN0ZW5lcnMuCi0JICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIGNyYXBweSBqZGsgY29kZSBnZXRzIHRoZSB2YWx1ZQotCSAqIGZyb20gdGhlIG1vZGVsICpiZWZvcmUqIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuICB+Ymp2Ci0JICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lci5EZWZhdWx0RWRpdG9yKGphdmF4LnN3aW5nLkpTcGlubmVyKQotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBzb3JyeSBhYm91dCB0aGlzICJsYXRlcmFsIiBjYWxsIHRvIHN1cGVyICB+Ymp2Ci0JCQlzdXBlci5zZXRWYWx1ZSh0aGlzLnNwaW5uZXJWYWx1ZU9mKHRoaXMubnVtYmVySG9sZGVyLmdldFZhbHVlKCkpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gdXBkYXRlIHRoZSB1bmRlcmx5aW5nIG51bWJlciBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShPYmplY3QpLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlzdXBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMubnVtYmVySG9sZGVyLnNldFZhbHVlKChOdW1iZXIpIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG51bWJlciBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMubnVtYmVySG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm51bWJlckNoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemUodGhpcy5udW1iZXJIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBudW1iZXIgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy5udW1iZXJIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubnVtYmVyQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIE51bWJlciBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRvIGEgbm9uLW51bGwgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzcGlubmVyVmFsdWVPZihPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCkgOiB2YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSBzcGlubmVyIHZhbHVlIGlmIGl0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXZvaWQgc3luY2hyb25pemUoT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuc3Bpbm5lclZhbHVlT2YodmFsdWUpOwotCQkvLyBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgZGF0ZSBoYXMgYWxyZWFkeSBiZWVuIHN5bmNocm9uaXplZAotCQkvLyAodmlhICNzZXRWYWx1ZSgpKQotCQlpZiAoICEgdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCXRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5udW1iZXJIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL09iamVjdExpc3RTZWxlY3Rpb25Nb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL09iamVjdExpc3RTZWxlY3Rpb25Nb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQyZTM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0RGF0YUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3REYXRhTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiBUaGlzIExpc3RTZWxlY3Rpb25Nb2RlbCBpcyBhd2FyZSBvZiB0aGUgTGlzdE1vZGVsIGFuZAotICogcHJvdmlkZXMgY29udmVuaWVuY2UgbWV0aG9kcyB0byBhY2Nlc3MgYW5kIHNldCB0aGUKLSAqIHNlbGVjdGVkICpvYmplY3RzKiwgYXMgb3Bwb3NlZCB0byB0aGUgc2VsZWN0ZWQgKmluZGV4ZXMqLgotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsCi0JZXh0ZW5kcyBEZWZhdWx0TGlzdFNlbGVjdGlvbk1vZGVsCi17Ci0JLyoqIFRoZSBsaXN0IG1vZGVsIHJlZmVyZW5jZWQgYnkgdGhlIGxpc3Qgc2VsZWN0aW9uIG1vZGVsLiAqLwotCXByaXZhdGUgZmluYWwgTGlzdE1vZGVsIGxpc3RNb2RlbDsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGNsZWFyIHRoZSBzZWxlY3Rpb24gd2hlbiB0aGUgbGlzdCBtb2RlbCBoYXMgY2hhbmdlZC4gKi8KLQlwcml2YXRlIGZpbmFsIExpc3REYXRhTGlzdGVuZXIgbGlzdERhdGFMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBzZWxlY3Rpb24gbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsKExpc3RNb2RlbCBsaXN0TW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0TW9kZWwgPSBsaXN0TW9kZWw7Ci0JCXRoaXMubGlzdERhdGFMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0RGF0YUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgTGlzdERhdGFMaXN0ZW5lciBidWlsZExpc3REYXRhTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdERhdGFMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGludGVydmFsQWRkZWQoTGlzdERhdGFFdmVudCBldmVudCkgewotCQkJCS8vIHRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBzZWxlY3Rpb24KLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGludGVydmFsUmVtb3ZlZChMaXN0RGF0YUV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gdGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbGVjdGlvbgotCQkJfQotCQkJcHVibGljIHZvaWQgY29udGVudHNDaGFuZ2VkKExpc3REYXRhRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwudGhpcy5saXN0TW9kZWxDb250ZW50c0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBkYXRhIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBUeXBpY2FsbHksIHRoZSBzZWxlY3Rpb24gZG9lcyBub3QgbmVlZCB0byBiZSBjbGVhcmVkIHdoZW4gdGhlCi0JICogY29udGVudHMgb2YgdGhlIGxpc3QgaGF2ZSBjaGFuZ2VkLiBNb3N0IG9mIHRoZSB0aW1lIHRoaXMganVzdAotCSAqIG1lYW5zIGFuIGl0ZW0gaGFzIGNoYW5nZWQgaW4gYSB3YXkgdGhhdCBhZmZlY3RzIGl0cyBkaXNwbGF5IHN0cmluZwotCSAqIG9yIGljb24uIFdlIHR5cGljYWxseSBvbmx5IHVzZSB0aGUgY2xhc3MgZm9yIGVkaXRzIGludm9sdmluZwotCSAqIHNpbmdsZSBzZWxlY3Rpb24uCi0JICogQSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhlIHNlbGVjdGlvbgotCSAqIHNob3VsZCBiZSBjbGVhcmVkIGJlY2F1c2UgYSBjaGFuZ2UgY291bGQgbWVhbiB0aGUgc2VsZWN0aW9uIGlzIGludmFsaWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdE1vZGVsQ29udGVudHNDaGFuZ2VkKExpc3REYXRhRXZlbnQgZXZlbnQpIHsKLQkJLyoqdGhpcy5jbGVhclNlbGVjdGlvbigpOyovCi0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RTZWxlY3Rpb25Nb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoTGlzdFNlbGVjdGlvbkxpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0U2VsZWN0aW9uTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMubGlzdE1vZGVsLmFkZExpc3REYXRhTGlzdGVuZXIodGhpcy5saXN0RGF0YUxpc3RlbmVyKTsKLQkJfQotCQlzdXBlci5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIobCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdFNlbGVjdGlvbkxpc3RlbmVyKExpc3RTZWxlY3Rpb25MaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RTZWxlY3Rpb25MaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0U2VsZWN0aW9uTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMubGlzdE1vZGVsLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIodGhpcy5saXN0RGF0YUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RTZWxlY3Rpb25MaXN0ZW5lcnMoKSB7CS8vIHByaXZhdGUtcHJvdGVjdGVkCi0JCXJldHVybiB0aGlzLmdldExpc3RTZWxlY3Rpb25MaXN0ZW5lcnMoKS5sZW5ndGggPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgbW9kZWwgcmVmZXJlbmNlZCBieSB0aGUgbGlzdCBzZWxlY3Rpb24gbW9kZWwuCi0JICovCi0JcHVibGljIExpc3RNb2RlbCBnZXRMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgaW50IHNlbGVjdGVkVmFsdWVzU2l6ZSgpIHsKLQkJaW50IG1pbiA9IHRoaXMuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKTsKLQkJaW50IG1heCA9IHRoaXMuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlpZiAoKG1pbiA8IDApIHx8IChtYXggPCAwKSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpbnQgbiA9IDA7Ci0JCWludCBjb3VudCA9IHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0U2l6ZSgpOwotCQlmb3IgKGludCBpID0gbWluOyBpIDw9IG1heDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5pc1NlbGVjdGVkSW5kZXgoaSkgJiYgKGkgPCBjb3VudCkpIHsKLQkJCQluKys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBzZWxlY3RlZCB2YWx1ZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBPYmplY3Qgc2VsZWN0ZWRWYWx1ZSgpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5nZXRNaW5TZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0aGlzLmdldExpc3RNb2RlbCgpLmdldFNpemUoKSA8PSBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHNlbGVjdGVkIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gc2VsZWN0ZWRWYWx1ZXMoKSB7Ci0JCWludCBtaW4gPSB0aGlzLmdldE1pblNlbGVjdGlvbkluZGV4KCk7Ci0JCWludCBtYXggPSB0aGlzLmdldE1heFNlbGVjdGlvbkluZGV4KCk7Ci0KLQkJaWYgKChtaW4gPCAwKSB8fCAobWF4IDwgMCkpIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJaW50IG1heFNpemUgPSAobWF4IC0gbWluKSArIDE7Ci0JCU9iamVjdFtdIHRlbXAgPSBuZXcgT2JqZWN0W21heFNpemVdOwotCQlpbnQgbiA9IDA7Ci0JCWludCBjb3VudCA9IHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0U2l6ZSgpOwotCQlmb3IgKGludCBpID0gbWluOyBpIDw9IG1heDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5pc1NlbGVjdGVkSW5kZXgoaSkgJiYgKGkgPCBjb3VudCkpIHsKLQkJCQl0ZW1wW24rK10gPSB0aGlzLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpKTsKLQkJCX0KLQkJfQotCQlpZiAobiA9PSBtYXhTaXplKSB7Ci0JCQkvLyBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCQkvLyBvbmx5IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3Rbbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBuKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHNlbGVjdGVkIGluZGljZXMgaW4gb3JkZXIuCi0JICovCi0JcHVibGljIGludFtdIHNlbGVjdGVkSW5kaWNlcygpIHsKLQkJaW50IG1pbiA9IHRoaXMuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKTsKLQkJaW50IG1heCA9IHRoaXMuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlpZiAoKG1pbiA8IDApIHx8IChtYXggPCAwKSkgewotCQkJcmV0dXJuIG5ldyBpbnRbMF07Ci0JCX0KLQotCQlpbnQgbWF4U2l6ZSA9IChtYXggLSBtaW4pICsgMTsKLQkJaW50W10gdGVtcCA9IG5ldyBpbnRbbWF4U2l6ZV07Ci0JCWludCBuID0gMDsKLQkJaW50IGNvdW50ID0gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBtaW47IGkgPD0gbWF4OyBpKyspIHsKLQkJCWlmICh0aGlzLmlzU2VsZWN0ZWRJbmRleChpKSAmJiAoaSA8IGNvdW50KSkgewotCQkJCXRlbXBbbisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG4gPT0gbWF4U2l6ZSkgewotCQkJLy8gYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2Ugd2VyZSBzZWxlY3RlZAotCQkJQXJyYXlzLnNvcnQodGVtcCk7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCQkvLyBvbmx5IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBuKTsKLQkJQXJyYXlzLnNvcnQocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNlbGVjdGVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLnNldFNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMgdG8gdGhlIHNwZWNpZmllZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3NldFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWVzKEl0ZXJhdG9yPD8+IG9iamVjdHMpIHsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKHRydWUpOwotCQl0aGlzLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXNJbnRlcm5hbChvYmplY3RzKTsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMgdG8gdGhlIHNwZWNpZmllZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3NldFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb248Pz4gb2JqZWN0cykgewotCQl0aGlzLnNldFNlbGVjdGVkVmFsdWVzKG9iamVjdHMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNzZXRTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFZhbHVlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCXRoaXMuc2V0U2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKG9iamVjdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjYWRkU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdHMgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjYWRkU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZXMoSXRlcmF0b3I8Pz4gb2JqZWN0cykgewotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcodHJ1ZSk7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXNJbnRlcm5hbChvYmplY3RzKTsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3RzIHRvIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2FkZFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb248Pz4gb2JqZWN0cykgewotCQl0aGlzLmFkZFNlbGVjdGVkVmFsdWVzKG9iamVjdHMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyB0byB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNhZGRTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RlZFZhbHVlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKG9iamVjdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNyZW1vdmVTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZFZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJdGhpcy5yZW1vdmVTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uVG9vbHMuc2luZ2xldG9uSXRlcmF0b3Iob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyBmcm9tIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3JlbW92ZVNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkVmFsdWVzKEl0ZXJhdG9yPD8+IG9iamVjdHMpIHsKLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKHRydWUpOwotCQlMaXN0TW9kZWwgbG0gPSB0aGlzLmdldExpc3RNb2RlbCgpOwotCQlpbnQgbG1TaXplID0gbG0uZ2V0U2l6ZSgpOwotCQl3aGlsZSAob2JqZWN0cy5oYXNOZXh0KCkpIHsKLQkJCWludCBpbmRleCA9IHRoaXMuaW5kZXhPZihvYmplY3RzLm5leHQoKSwgbG0sIGxtU2l6ZSk7Ci0JCQl0aGlzLnJlbW92ZVNlbGVjdGlvbkludGVydmFsKGluZGV4LCBpbmRleCk7Ci0JCX0KLQkJdGhpcy5zZXRWYWx1ZUlzQWRqdXN0aW5nKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3RzIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjcmVtb3ZlU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvbjw/PiBvYmplY3RzKSB7Ci0JCXRoaXMucmVtb3ZlU2VsZWN0ZWRWYWx1ZXMob2JqZWN0cy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3RzIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjcmVtb3ZlU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoT2JqZWN0W10gb2JqZWN0cykgewotCQl0aGlzLnJlbW92ZVNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihvYmplY3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjZ2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgoKQotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbmNob3Igc2VsZWN0aW9uIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QW5jaG9yU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5nZXRBbmNob3JTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjc2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFuY2hvclNlbGVjdGVkVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLnNldEFuY2hvclNlbGVjdGlvbkluZGV4KHRoaXMuaW5kZXhPZihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRMZWFkU2VsZWN0aW9uSW5kZXgoKQotCSAqIFJldHVybiBudWxsIGlmIHRoZSBsZWFkIHNlbGVjdGlvbiBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExlYWRTZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldExlYWRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjc2V0TGVhZFNlbGVjdGlvbkluZGV4KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZWFkU2VsZWN0ZWRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuc2V0TGVhZFNlbGVjdGlvbkluZGV4KHRoaXMuaW5kZXhPZihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRNYXhTZWxlY3Rpb25JbmRleCgpCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIG1heCBzZWxlY3Rpb24gaXMgZW1wdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNYXhTZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldE1heFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRNaW5TZWxlY3Rpb25JbmRleCgpCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIG1pbiBzZWxlY3Rpb24gaXMgZW1wdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNaW5TZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldE1pblNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNpc1NlbGVjdGVkSW5kZXgoaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbHVlSXNTZWxlY3RlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0aGlzLmlzU2VsZWN0ZWRJbmRleCh0aGlzLmluZGV4T2Yob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyB0byB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cywKLQkgKiB3aXRob3V0IHdyYXBwaW5nIHRoZSBhY3Rpb25zIGluICJhZGp1c3RpbmciIGV2ZW50cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZXNJbnRlcm5hbChJdGVyYXRvcjw/PiBvYmplY3RzKSB7Ci0JCUxpc3RNb2RlbCBsbSA9IHRoaXMuZ2V0TGlzdE1vZGVsKCk7Ci0JCWludCBsaXN0TW9kZWxTaXplID0gbG0uZ2V0U2l6ZSgpOwotCQl3aGlsZSAob2JqZWN0cy5oYXNOZXh0KCkpIHsKLQkJCWludCBpbmRleCA9IHRoaXMuaW5kZXhPZihvYmplY3RzLm5leHQoKSwgbG0sIGxpc3RNb2RlbFNpemUpOwotCQkJdGhpcy5hZGRTZWxlY3Rpb25JbnRlcnZhbChpbmRleCwgaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBpbiB0aGUgbGlzdCBtb2RlbCBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiBSZXR1cm4gLTEgaWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGxpc3QgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBpbnQgaW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3RNb2RlbCBsbSA9IHRoaXMuZ2V0TGlzdE1vZGVsKCk7Ci0JCXJldHVybiB0aGlzLmluZGV4T2Yob2JqZWN0LCBsbSwgbG0uZ2V0U2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBsaXN0IG1vZGVsIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIFJldHVybiAtMSBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgbGlzdCBtb2RlbC4KLQkgKi8KLQkvLyB3ZSdyZSBqdXN0IGplcmtpbmcgYXJvdW5kIHdpdGggcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBoZXJlCi0JLy8gKGluIG1lbW9yeSBvZiBQaGlsLi4uKTsKLQkvLyBjYWxsIHRoaXMgbWV0aG9kIGluc2lkZSBsb29wcyB0aGF0IGRvIG5vdCBtb2RpZnkgdGhlIGxpc3RNb2RlbAotCXByaXZhdGUgaW50IGluZGV4T2YoT2JqZWN0IG9iamVjdCwgTGlzdE1vZGVsIGxtLCBpbnQgbGlzdE1vZGVsU2l6ZSkgewotCQlmb3IgKGludCBpID0gbGlzdE1vZGVsU2l6ZTsgaS0tID4gMDsgKSB7Ci0JCQlpZiAobG0uZ2V0RWxlbWVudEF0KGkpID09IG9iamVjdCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWI0YjRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRNdXRhYmxlVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0VHJlZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuTXV0YWJsZVRyZWVOb2RlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSB0cmVlIHdpdGggYSAibnVsbCIgcm9vdCB0aGF0Ci0gKiBoYXMgYSBzZXQgb2YgInByaW1pdGl2ZSIgY2hpbGRyZW4uIFRoZXNlICJwcmltaXRpdmUiIGNoaWxkcmVuIGRvIG5vdCBoYXZlCi0gKiBjaGlsZHJlbiB0aGVtc2VsdmVzLCBtYWtpbmcgdGhlIHRyZWUgYSBtYXhpbXVtIG9mIDIgbGV2ZWxzIGRlZXAuCi0gKiBUaGlzIG1vZGVsIGF1dG9tYXRpY2FsbHkgc3luY2hyb25pemVzIHRoZSByb290J3MgY2hpbGRyZW4gd2l0aCBhCi0gKiBMaXN0VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgY29sbGVjdGlvbiBvZiBwcmltaXRpdmUgKG5vbi1tb2RlbCkgb2JqZWN0cwotICogKGUuZy4gU3RyaW5ncykuCi0gKiAKLSAqIFRoaXMgaXMgdXNlZnVsIGZvciBwcm92aWRpbmcgYW4gImVkaXRhYmxlIiBsaXN0IG9mIHByaW1pdGl2ZXMuIFNpbmNlIHRoZSBKREsKLSAqIGRvZXMgbm90IHByb3ZpZGUgdXMgd2l0aCBhbiBlZGl0YWJsZSBsaXN0Ym94LCB3ZSBtdXN0IHVzZSBhbiBlZGl0YWJsZSB0cmVlLgotICogV2Ugd3JhcCBldmVyeXRoaW5nIGluIERlZmF1bHRNdXRhYmxlVHJlZU5vZGVzLgotICogCi0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50ICNwcmltaXRpdmVDaGFuZ2VkKGludCwgT2JqZWN0KSBhbmQgdXBkYXRlCi0gKiB0aGUgbW9kZWwgYXBwcm9wcmlhdGVseS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgZWRpdHMgdGhlCi0gKiBsaXN0IGRpcmVjdGx5IGFuZCBwcmVzc2VzIDxFbnRlcj4uCi0gKiAKLSAqIFRoZSBKVHJlZSB1c2luZyB0aGlzIG1vZGVsIG11c3QgYmUgY29uZmlndXJlZCBhcyAiZWRpdGFibGUiOgotICogCXRyZWUuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gKi8KLS8vIFRPRE8gY29udmVydCB0byB1c2UgYW4gYWRhcHRlciBpbnN0ZWFkIG9mIHJlcXVpcmluZyBzdWJjbGFzcwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwKLQlleHRlbmRzIERlZmF1bHRUcmVlTW9kZWwKLXsKLQkvKiogYSBtb2RlbCBvbiB0aGUgbGlzdCBvZiBwcmltaXRpdmVzICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyOwotCi0JLyoqIGEgbGlzdGVuZXIgdGhhdCBoYW5kbGVzIHRoZSBhZGRpbmcsIHJlbW92aW5nLCBhbmQgcmVwbGFjaW5nIG9mIHRoZSBwcmltaXRpdmVzICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogUHVibGljIGNvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyIGlzIHJlcXVpcmVkCi0JICovCi0JcHVibGljIFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcikgewotCQlzdXBlcihuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShudWxsLCB0cnVlKSk7ICAvLyB0cnVlID0gdGhlIHJvb3QgY2FuIGhhdmUgY2hpbGRyZW4KLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgbW9kZWwgdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzCi0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByaW1pdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byB1cGRhdGUgdGhlIAotCSAqIG1vZGVsIGFwcHJvcHJpYXRlbHkuIFRoZSBwcmltaXRpdmUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB3YXMKLQkgKiBlZGl0ZWQgZGlyZWN0bHkgYnkgdGhlIHVzZXIgYW5kIHRoZSBuZXcgdmFsdWUgaXMgYXMgc3BlY2lmaWVkLgotCSAqIENvbnZlcnQgdGhlIHZhbHVlIGFwcHJvcHJpYXRlbHkgYW5kIHBsYWNlIGl0IGluIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcmltaXRpdmVDaGFuZ2VkKGludCBpbmRleCwgT2JqZWN0IG5ld1ZhbHVlKTsKLQotCi0JLy8gKioqKioqKioqKiBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGluc3RlYWQgb2YgY2hhbmdpbmcgdGhlIG5vZGUgZGlyZWN0bHkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsdWVGb3JQYXRoQ2hhbmdlZChUcmVlUGF0aCBwYXRoLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJVHJlZU5vZGUgbm9kZSA9IChUcmVlTm9kZSkgcGF0aC5nZXRMYXN0UGF0aENvbXBvbmVudCgpOwotCQlpbnQgaW5kZXggPSAoKFRyZWVOb2RlKSB0aGlzLmdldFJvb3QoKSkuZ2V0SW5kZXgobm9kZSk7Ci0JCXRoaXMucHJpbWl0aXZlQ2hhbmdlZChpbmRleCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuZ2V0VHJlZU1vZGVsTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemVMaXN0KCk7Ci0JCX0KLQkJc3VwZXIuYWRkVHJlZU1vZGVsTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZVRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlVHJlZU1vZGVsTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmdldFRyZWVNb2RlbExpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3luY2hyb25pemUgb3VyIGxpc3Qgb2Ygbm9kZXMgd2l0aCB0aGUgbGlzdCBvZiBwcmltaXRpdmVzCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZUxpc3QoKSB7Ci0JCXRoaXMuY2xlYXJMaXN0KCk7Ci0JCXRoaXMuYnVpbGRMaXN0KCk7Ci0JfQotCi0Jdm9pZCBjbGVhckxpc3QoKSB7Ci0JCWludCBjaGlsZGNvdW50ID0gdGhpcy5yb290LmdldENoaWxkQ291bnQoKTsKLQkJZm9yIChpbnQgaSA9IGNoaWxkY291bnQgLSAxOyBpID49IDA7IGktLSkgewotCQkJdGhpcy5yZW1vdmVOb2RlRnJvbVBhcmVudCgoTXV0YWJsZVRyZWVOb2RlKXRoaXMucm9vdC5nZXRDaGlsZEF0KGkpKTsKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTGlzdCgpIHsKLQkJZm9yIChJdGVyYXRvcjw/PiBzdHJlYW0gPSB0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmFkZFByaW1pdGl2ZShzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIHByaW1pdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQcmltaXRpdmUoT2JqZWN0IHByaW1pdGl2ZSkgewotCQl0aGlzLmluc2VydFByaW1pdGl2ZSh0aGlzLnJvb3QuZ2V0Q2hpbGRDb3VudCgpLCBwcmltaXRpdmUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5vZGUgZm9yIHRoZSBzcGVjaWZpZWQgcHJpbWl0aXZlCi0JICogYW5kIGluc2VydCBpdCBhcyBhIGNoaWxkIG9mIHRoZSByb290LgotCSAqLwotCXZvaWQgaW5zZXJ0UHJpbWl0aXZlKGludCBpbmRleCwgT2JqZWN0IHByaW1pdGl2ZSkgewotCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShwcmltaXRpdmUsIGZhbHNlKTsgLy8gZG9uJ3QgYWxsb3cgY2hpbGRyZW4gb24gdGhlIGNoaWxkIG5vZGUKLQkJdGhpcy5pbnNlcnROb2RlSW50byhub2RlLCAoTXV0YWJsZVRyZWVOb2RlKSB0aGlzLnJvb3QsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgbm9kZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCU11dGFibGVUcmVlTm9kZSByZW1vdmVOb2RlKGludCBpbmRleCkgewotCQlNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IChNdXRhYmxlVHJlZU5vZGUpIHRoaXMucm9vdC5nZXRDaGlsZEF0KGluZGV4KTsKLQkJdGhpcy5yZW1vdmVOb2RlRnJvbVBhcmVudChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSB0aGUgdXNlciBvYmplY3Qgb2YgdGhlIG5vZGUgYXQgY2hpbGRJbmRleC4KLQkgKi8KLQl2b2lkIHJlcGxhY2VQcmltaXRpdmUoaW50IGluZGV4LCBPYmplY3QgcHJpbWl0aXZlKSB7Ci0JCU11dGFibGVUcmVlTm9kZSBub2RlID0gKE11dGFibGVUcmVlTm9kZSkgdGhpcy5yb290LmdldENoaWxkQXQoaW5kZXgpOwotCQlub2RlLnNldFVzZXJPYmplY3QocHJpbWl0aXZlKTsKLQkJdGhpcy5ub2RlQ2hhbmdlZChub2RlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBQcmltaXRpdmVMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlQcmltaXRpdmVMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJCWZvciAoTGlzdEl0ZXJhdG9yPD8+IHN0cmVhbSA9IGV2ZW50Lml0ZW1zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5pbnNlcnRQcmltaXRpdmUoaSsrLCBzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnQuaXRlbXNTaXplKCk7IGkrKykgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5yZW1vdmVOb2RlKGV2ZW50LmdldEluZGV4KCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJCWZvciAoTGlzdEl0ZXJhdG9yPD8+IHN0cmVhbSA9IGV2ZW50Lml0ZW1zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5yZXBsYWNlUHJpbWl0aXZlKGkrKywgc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJQXJyYXlMaXN0PE11dGFibGVUcmVlTm9kZT4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8TXV0YWJsZVRyZWVOb2RlPihldmVudC5nZXRNb3ZlTGVuZ3RoKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudC5nZXRNb3ZlTGVuZ3RoKCk7IGkrKykgewotCQkJCXRlbXAuYWRkKFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5yZW1vdmVOb2RlKGV2ZW50LmdldFNvdXJjZUluZGV4KCkpKTsKLQkJCX0KLQkJCWludCBpID0gZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKTsKLQkJCWZvciAoTXV0YWJsZVRyZWVOb2RlIG5vZGUgOiB0ZW1wKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLmluc2VydFByaW1pdGl2ZShpKyssIG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsLnRoaXMuY2xlYXJMaXN0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5zeW5jaHJvbml6ZUxpc3QoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2FlZTQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CaWRpRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5GaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuQnV0dG9uTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3RlbmVyCi0gKiAoZS5nLiBhIEpSYWRpb0J1dHRvbikgaW4gc3luY2ggd2l0aCBhICh0eXBpY2FsbHkgc2hhcmVkKQotICogUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgb25lIHZhbHVlIG91dCBvZiBhIHNldCBvZiB2YWx1ZXMuCi0gKiAKLSAqIE5PVEU6IERvICpub3QqIHVzZSB0aGlzIG1vZGVsIHdpdGggYSBCdXR0b25Hcm91cCwgc2luY2UgdGhlCi0gKiBzaGFyZWQgdmFsdWUgaG9sZGVyIGFuZCB0aGUgd3JhcHBlcnMgYnVpbHQgYnkgdGhpcyBhZGFwdGVyIHdpbGwKLSAqIGtlZXAgdGhlIGFwcHJvcHJpYXRlIHJhZGlvIGJ1dHRvbiBjaGVja2VkLiBBbHNvLCB0aGlzIGFsbG93cwotICogdXMgdG8gdW5jaGVjayBhbGwgdGhlIHJhZGlvIGJ1dHRvbnMgaW4gYSBncm91cCB3aGVuIHRoZSBzaGFyZWQKLSAqIHZhbHVlIGlzIG51bGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcgotCWV4dGVuZHMgVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyCi17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdCBidXR0b25WYWx1ZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIoYnVpbGRCb29sZWFuSG9sZGVyKHZhbHVlSG9sZGVyLCBidXR0b25WYWx1ZSksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0JICovCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdCBidXR0b25WYWx1ZSkgewotCQlzdXBlcihidWlsZEJvb2xlYW5Ib2xkZXIodmFsdWVIb2xkZXIsIGJ1dHRvblZhbHVlKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIHVwIGEgc2V0IG9mIHdyYXBwZXJzIHRoYXQgd2lsbCBjb252ZXJ0IHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZSBob2xkZXIgYW5kIGJ1dHRvbiB2YWx1ZSB0by9mcm9tIGEgYm9vbGVhbi4KLQkgKiAKLQkgKiBJZiB0aGUgdmFsdWUgaG9sZGVyJ3MgdmFsdWUgbWF0Y2hlcyB0aGUgYnV0dG9uIHZhbHVlLAotCSAqIHRoZSB3cmFwcGVyIHdpbGwgcmV0dXJuIHRydWUuIExpa2V3aXNlLCBpZiB0aGUgdmFsdWUgaG9sZGVyJ3MKLQkgKiB2YWx1ZSBpcyBzZXQgdG8gdHJ1ZSwgdGhlIHdyYXBwZXIgd2lsbCBzZXQgdGhlIHZhbHVlIGhvbGRlcidzCi0JICogdmFsdWUgdG8gdGhlIGJ1dHRvbiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBmaWx0ZXJpbmdQVk0gPSBuZXcgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0Pih2YWx1ZUhvbGRlciwgbmV3IFJhZGlvQnV0dG9uRmlsdGVyKGJ1dHRvblZhbHVlKSk7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3QsIEJvb2xlYW4+KGZpbHRlcmluZ1BWTSwgbmV3IFJhZGlvQnV0dG9uVHJhbnNmb3JtZXIoYnV0dG9uVmFsdWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSB1c2VyIGNhbm5vdCBkZS1zZWxlY3QgYSByYWRpbyBidXR0b24gLSB0aGUgdXNlcgotCSAqIGNhbiBvbmx5ICpzZWxlY3QqIGEgcmFkaW8gYnV0dG9uLiBPbmx5IHRoZSBtb2RlbCBjYW4KLQkgKiBjYXVzZSBhIHJhZGlvIGJ1dHRvbiB0byBiZSBkZS1zZWxlY3RlZC4gV2UgdXNlIHRoZQotCSAqIEFSTUVEIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBhcmUgYmVpbmcgZGUtc2VsZWN0ZWQKLQkgKiBieSB0aGUgdXNlci4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIGIpIHsKLQkJLy8gZG8gbm90IGFsbG93IHRoZSB1c2VyIHRvIGRlLXNlbGVjdCBhIHJhZGlvIGJ1dHRvbgotCQkvLyByYWRpbyBidXR0b25zIGNhbgotCQlpZiAoKGIgPT0gZmFsc2UpICYmIHRoaXMuaXNBcm1lZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuc2V0U2VsZWN0ZWQoYik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBmaWx0ZXIgd2lsbCBvbmx5IHBhc3MgdGhyb3VnaCBhIG5ldyB2YWx1ZSB0byB0aGUgd3JhcHBlZAotCSAqIHZhbHVlIGhvbGRlciB3aGVuIGl0IG1hdGNoZXMgdGhlIGNvbmZpZ3VyZWQgYnV0dG9uIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmFkaW9CdXR0b25GaWx0ZXIgaW1wbGVtZW50cyBCaWRpRmlsdGVyPE9iamVjdD4gewotCQlwcml2YXRlIE9iamVjdCBidXR0b25WYWx1ZTsKLQotCQlwdWJsaWMgUmFkaW9CdXR0b25GaWx0ZXIoT2JqZWN0IGJ1dHRvblZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5idXR0b25WYWx1ZSA9IGJ1dHRvblZhbHVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGFsd2F5cyByZXR1cm4gdGhlIHdyYXBwZWQgdmFsdWUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3QgdmFsdWUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHBhc3MgdGhyb3VnaCB0aGUgdmFsdWUgdG8gdGhlIHdyYXBwZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwKLQkJICogKm9ubHkqIHdoZW4gaXQgbWF0Y2hlcyBvdXIgYnV0dG9uIHZhbHVlCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiByZXZlcnNlQWNjZXB0KE9iamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuIHZhbHVlID09IHRoaXMuYnV0dG9uVmFsdWU7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgdHJhbnNmb3JtZXIgd2lsbCBjb252ZXJ0IHRoZSB3cmFwcGVkIHZhbHVlIHRvIEJvb2xlYW4uVFJVRQotCSAqIHdoZW4gaXQgbWF0Y2hlcyB0aGUgY29uZmlndXJlZCBidXR0b24gdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBSYWRpb0J1dHRvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgQmlkaVRyYW5zZm9ybWVyPE9iamVjdCwgQm9vbGVhbj4gewotCQlwcml2YXRlIE9iamVjdCBidXR0b25WYWx1ZTsKLQotCQlwdWJsaWMgUmFkaW9CdXR0b25UcmFuc2Zvcm1lcihPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJ1dHRvblZhbHVlID0gYnV0dG9uVmFsdWU7Ci0JCX0KLQotCQkvKioKLQkJICogaWYgdGhlIHdyYXBwZWQgdmFsdWUgbWF0Y2hlcyBvdXIgYnV0dG9uIHZhbHVlIHJldHVybiB0cnVlLAotCQkgKiBpZiBpdCBpcyBzb21lIG90aGVyIHZhbHVlIHJldHVybiBmYWxzZTsKLQkJICogYnV0IGlmIGl0IGlzIG51bGwgc2ltcGx5IHBhc3MgaXQgdGhyb3VnaCBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgdGhlCi0JCSAqIGJ1dHRvbiBtb2RlbCdzIGRlZmF1bHQgdmFsdWUgdG8gYmUgdXNlZAotCQkgKi8KLQkJcHVibGljIEJvb2xlYW4gdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBCb29sZWFuLnZhbHVlT2YodmFsdWUgPT0gdGhpcy5idXR0b25WYWx1ZSk7Ci0JCX0KLQotCQkvKioKLQkJICogaWYgdGhlIG5ldyB2YWx1ZSBpcyB0cnVlLCBwYXNzIHRocm91Z2ggdGhlIG91ciBidXR0b24gdmFsdWU7Ci0JCSAqIG90aGVyd2lzZSBwYXNzIHRocm91Z2ggbnVsbAotCQkgKi8KLQkJcHVibGljIE9iamVjdCByZXZlcnNlVHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCXJldHVybiAodmFsdWUuYm9vbGVhblZhbHVlKCkpID8gdGhpcy5idXR0b25WYWx1ZSA6IG51bGw7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZDg5M2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RTcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJOdW1iZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBDaGFuZ2VMaXN0ZW5lcgotICogKGUuZy4gYSBKU3Bpbm5lcikgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgdmFsdWUuCi0gKiAKLSAqIE5vdGU6IGl0IGlzIGxpa2VseSB5b3Ugd2FudCB0byB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBpbnN0ZWFkIG9mCi0gKiB0aGlzIG9uZToKLSAqICAgICBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcgotICogICAgIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqICAgICBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcgotICogCi0gKiBOQjogVGhpcyBtb2RlbCBzaG91bGQgb25seSBiZSB1c2VkIGZvciB2YWx1ZXMgdGhhdCBoYXZlIGEgZmFpcmx5Ci0gKiBpbmV4cGVuc2l2ZSAjZXF1YWxzKCkgaW1wbGVtZW50YXRpb24uCi0gKiBAc2VlICNzeW5jaHJvbml6ZURlbGVnYXRlKE9iamVjdCkKLSAqLwotcHVibGljIGNsYXNzIFNwaW5uZXJNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0U3Bpbm5lck1vZGVsCi17Ci0JLyoqIFRoZSBkZWxlZ2F0ZSBzcGlubmVyIG1vZGVsIHdob3NlIGJlaGF2aW9yIHdlICJlbmhhbmNlIi4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lck1vZGVsIGRlbGVnYXRlOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gZm9yd2FyZCBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBkZWxlZ2F0ZSBzcGlubmVyIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDaGFuZ2VMaXN0ZW5lciBkZWxlZ2F0ZUxpc3RlbmVyOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB2YWx1ZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgYW5kIGRlbGVnYXRlIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBTcGlubmVyTW9kZWwgZGVsZWdhdGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZhbHVlSG9sZGVyID09IG51bGwgfHwgZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZQotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy52YWx1ZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlTGlzdGVuZXIoKTsKLQkJdGhpcy5kZWxlZ2F0ZUxpc3RlbmVyID0gdGhpcy5idWlsZERlbGVnYXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhpcyB3aWxsIHdyYXAgYSBzaW1wbGUgbnVtYmVyIHNwaW5uZXIgbW9kZWwuCi0JICovCi0JcHVibGljIFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcikgewotCQl0aGlzKHZhbHVlSG9sZGVyLCBuZXcgU3Bpbm5lck51bWJlck1vZGVsKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFZhbHVlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnZhbHVlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogZXhwYW5kIGFjY2VzcyBhIGJpdCBmb3IgaW5uZXIgY2xhc3MKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKCkgewotCQlzdXBlci5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENoYW5nZUxpc3RlbmVyIGJ1aWxkRGVsZWdhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCS8vIGZvcndhcmQgdGhlIGV2ZW50LCB3aXRoIHRoaXMgYXMgdGhlIHNvdXJjZQotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkZWxlZ2F0ZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNwaW5uZXJNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgdmFsdWUgZGlyZWN0bHkuCi0JICogVGhlIHJlc3VsdGluZyBldmVudCB3aWxsIGJlIGlnbm9yZWQ6IEBzZWUgI3N5bmNocm9uaXplRGVsZWdhdGUoT2JqZWN0KS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJdGhpcy5kZWxlZ2F0ZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TmV4dFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXROZXh0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByZXZpb3VzVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFByZXZpb3VzVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChDaGFuZ2VMaXN0ZW5lci5jbGFzcykgPT0gMCkgewotCQkJdGhpcy5kZWxlZ2F0ZS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmRlbGVnYXRlTGlzdGVuZXIpOwotCQkJdGhpcy5lbmdhZ2VWYWx1ZUhvbGRlcigpOwotCQl9Ci0JCXN1cGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChDaGFuZ2VMaXN0ZW5lci5jbGFzcykgPT0gMCkgewotCQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZUhvbGRlcigpOwotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmRlbGVnYXRlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgdGhpcmQgcGFydHkgaGFzIG1vZGlmaWVkIHRoZSB1bmRlcmx5aW5nIHZhbHVlLgotCSAqIFN5bmNocm9uaXplIHRoZSBkZWxlZ2F0ZSBtb2RlbCBhY2NvcmRpbmdseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplRGVsZWdhdGUoZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkZWxlZ2F0ZSdzIHZhbHVlIGlmIGl0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplRGVsZWdhdGUoT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBkZWxlZ2F0ZSBoYXMgYWxyZWFkeSBiZWVuIHN5bmNocm9uaXplZAotCQkvLyAodmlhICNzZXRWYWx1ZSgpKQotCQlpZiAoICEgdGhpcy5kZWxlZ2F0ZS5nZXRWYWx1ZSgpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCXRoaXMuZGVsZWdhdGUuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVIb2xkZXIoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudmFsdWVMaXN0ZW5lcik7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlSG9sZGVyKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudmFsdWVIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE5NjExOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UYWJsZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgVGFibGVNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgVGFibGVNb2RlbExpc3RlbmVyIChlLmcuIGEgSlRhYmxlKQotICogaW4gc3luY2ggd2l0aCBhIExpc3RWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIG1vZGVsIG9iamVjdHMsCi0gKiBlYWNoIG9mIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgcm93IGluIHRoZSB0YWJsZS4KLSAqIFR5cGljYWxseSwgZWFjaCBjb2x1bW4gb2YgdGhlIHRhYmxlIHdpbGwgYmUgYm91bmQgdG8gYSBkaWZmZXJlbnQgYXNwZWN0Ci0gKiBvZiB0aGUgY29udGFpbmVkIG1vZGVsIG9iamVjdHMuCi0gKiAKLSAqIEZvciBleGFtcGxlLCBhIE1XVGFibGUgaGFzIGFuIGF0dHJpYnV0ZSAnZGF0YWJhc2VGaWVsZHMnIHRoYXQgaG9sZHMKLSAqIGEgY29sbGVjdGlvbiBvZiBNV0RhdGFiYXNlRmllbGRzIHRoYXQgd291bGQgY29ycmVzcG9uZCB0byB0aGUgcm93cyBvZgotICogYSBKVGFibGU7IGFuZCBlYWNoIE1XRGF0YWJhc2VGaWVsZCBoYXMgYSBudW1iZXIKLSAqIG9mIGF0dHJpYnV0ZXMgKGUuZy4gbmFtZSwgdHlwZSwgc2l6ZSkgdGhhdCBjYW4gYmUgYm91bmQgdG8gdGhlIGNvbHVtbnMgb2YKLSAqIGEgcm93IGluIHRoZSBKVGFibGUuIEFzIHRoZXNlIGRhdGFiYXNlIGZpZWxkcyBhcmUgYWRkZWQsIHJlbW92ZWQsIGFuZAotICogY2hhbmdlZCwgdGhpcyBtb2RlbCB3aWxsIGtlZXAgdGhlIGxpc3RlbmVycyBhd2FyZSBvZiB0aGUgY2hhbmdlcy4KLSAqIAotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBUYWJsZU1vZGVsIG11c3QgYmUgc3VwcGxpZWQgd2l0aCBhCi0gKiBsaXN0IGhvbGRlciAoZS5nLiB0aGUgJ2RhdGFiYXNlRmllbGRzJyksIHdoaWNoIGlzIGEgdmFsdWUKLSAqIG1vZGVsIG9uIHRoZSBib3VuZCBjb2xsZWN0aW9uIFRoaXMgaXMgcmVxdWlyZWQgLSB0aGUKLSAqIGNvbGxlY3Rpb24gaXRzZWxmIGNhbiBiZSBudWxsLCBidXQgdGhlIGxpc3QgdmFsdWUgbW9kZWwgdGhhdAotICogaG9sZHMgaXQgaXMgcmVxdWlyZWQuIFR5cGljYWxseSB0aGlzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgKEBzZWUKLSAqIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcikuCi0gKiAKLSAqIFRoaXMgVGFibGVNb2RlbCBtdXN0IGFsc28gYmUgc3VwcGxpZWQgd2l0aCBhIENvbHVtbkFkYXB0ZXIgdGhhdAotICogd2lsbCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgaGVhZGVycywgcmVuZGVyZXJzLCBlZGl0b3JzLCBhbmQgY29udGVudHMKLSAqIG9mIHRoZSB2YXJpb3VzIGNvbHVtbnMuCi0gKiAKLSAqIERlc2lnbiBkZWNpc2lvbjoKLSAqIENlbGwgbGlzdGVuZXIgb3B0aW9ucyAoZnJvbSBsb3cgc3BhY2UvaGlnaCB0aW1lIHRvIGhpZ2ggc3BhY2UvbG93IHRpbWUpOgotICogCS0gMSBjZWxsIGxpc3RlbmVyIGxpc3RlbmluZyB0byBldmVyeSBjZWxsICh0aGlzIGlzIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uKQotICogCS0gMSBjZWxsIGxpc3RlbmVyIHBlciByb3cKLSAqIAktIDEgY2VsbCBsaXN0ZW5lciBwZXIgY2VsbAotICovCi1wdWJsaWMgY2xhc3MgVGFibGVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0VGFibGVNb2RlbAotewotCS8qKgotCSAqIGEgbGlzdCBvZiB1c2VyIG9iamVjdHMgdGhhdCBhcmUgY29udmVydGVkIHRvCi0JICogcm93cyB2aWEgdGhlIGNvbHVtbiBhZGFwdGVyCi0JICovCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBlYWNoIHJvdyBpcyBhbiBhcnJheSBvZiBjZWxsIG1vZGVscwotCSAqLwotCS8vIGRlY2xhcmUgYXMgQXJyYXlMaXN0IHNvIHdlIGNhbiB1c2UgI2Vuc3VyZUNhcGFjaXR5KGludCkKLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+IHJvd3M7Ci0KLQkvKioKLQkgKiBjbGllbnQtc3VwcGxpZWQgYWRhcHRlciB0aGF0IHByb3ZpZGVzIHdpdGggdGhlIHZhcmlvdXMgY29sdW1uCi0JICogc2V0dGluZ3MgYW5kIGNvbnZlcnRzIHRoZSBvYmplY3RzIGluIHRoZSBMVk0KLQkgKiBpbnRvIGFuIGFycmF5IG9mIGNlbGwgbW9kZWxzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb2x1bW5BZGFwdGVyIGNvbHVtbkFkYXB0ZXI7Ci0KLQkvKioKLQkgKiB0aGUgc2luZ2xlIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBldmVyeSBjZWxsJ3MgbW9kZWwKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY2VsbExpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0YWJsZSBtb2RlbCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdHMKLQkgKiBhbmQgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgVGFibGVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIsIENvbHVtbkFkYXB0ZXIgY29sdW1uQWRhcHRlcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RIb2xkZXIgPSBsaXN0SG9sZGVyOwotCQl0aGlzLmNvbHVtbkFkYXB0ZXIgPSBjb2x1bW5BZGFwdGVyOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5yb3dzID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+KCk7Ci0JCXRoaXMuY2VsbExpc3RlbmVyID0gdGhpcy5idWlsZENlbGxMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRhYmxlIG1vZGVsIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0cwotCSAqIGFuZCBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBUYWJsZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlciwgQ29sdW1uQWRhcHRlciBjb2x1bW5BZGFwdGVyKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4oY29sbGVjdGlvbkhvbGRlciksIGNvbHVtbkFkYXB0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmFkZFJvd3MoZXZlbnQuZ2V0SW5kZXgoKSwgZXZlbnQuaXRlbXNTaXplKCksIHRoaXMuaXRlbXMoZXZlbnQpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZVJvd3MoZXZlbnQuZ2V0SW5kZXgoKSwgZXZlbnQuaXRlbXNTaXplKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnJlcGxhY2VSb3dzKGV2ZW50LmdldEluZGV4KCksIHRoaXMuaXRlbXMoZXZlbnQpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5tb3ZlUm93cyhldmVudC5nZXRUYXJnZXRJbmRleCgpLCBldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRNb3ZlTGVuZ3RoKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5jbGVhclRhYmxlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnJlYnVpbGRUYWJsZSgpOwotCQkJfQotCQkJLyoqCi0JCQkgKiBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JCQkgKi8KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPE9iamVjdD4gaXRlbXMoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJcmV0dXJuIChJdGVyYXRvcjxPYmplY3Q+KSBldmVudC5pdGVtcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENlbGxMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQ2VsbExpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENlbGxMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmNlbGxDaGFuZ2VkKChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KSBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjZWxsIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNvdW50KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMucm93cy5zaXplKCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5OYW1lKGNvbHVtbik7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIENsYXNzPD8+IGdldENvbHVtbkNsYXNzKGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNsYXNzKGNvbHVtbkluZGV4KTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0YWJsZShpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbklzRWRpdGFibGUoY29sdW1uSW5kZXgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5yb3dzLmdldChyb3dJbmRleCk7Ci0JCXJldHVybiByb3dbY29sdW1uSW5kZXhdLmdldFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmFsdWVBdChPYmplY3QgdmFsdWUsIGludCByb3dJbmRleCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLnJvd3MuZ2V0KHJvd0luZGV4KTsKLQkJcm93W2NvbHVtbkluZGV4XS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVGFibGVNb2RlbExpc3RlbmVyKFRhYmxlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vVGFibGVNb2RlbExpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFibGVNb2RlbExpc3RlbmVyKFRhYmxlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZVRhYmxlTW9kZWxMaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9UYWJsZU1vZGVsTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcikgewotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlib29sZWFuIGhhc0xpc3RlbmVycyA9IHRoaXMuaGFzVGFibGVNb2RlbExpc3RlbmVycygpOwotCQlpZiAoaGFzTGlzdGVuZXJzKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQkJdGhpcy5maXJlVGFibGVEYXRhQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzLnNldE1vZGVsKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1vZGVsIGhhcyBubyBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9UYWJsZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChUYWJsZU1vZGVsTGlzdGVuZXIuY2xhc3MpID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgYW55IGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNUYWJsZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc05vVGFibGVNb2RlbExpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3Qgb2Ygb2JqZWN0cyBhbmQgdGhlIHZhcmlvdXMgYXNwZWN0cwotCSAqIG9mIHRoZSBvYmplY3RzIHRoYXQgbWFrZSB1cCB0aGUgcm93cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5lbmdhZ2VBbGxDZWxscygpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIG9iamVjdHMgaW50byByb3dzIGFuZCBsaXN0ZW4gdG8gdGhlIGNlbGxzLgotCSAqLwotCXByaXZhdGUgdm9pZCBlbmdhZ2VBbGxDZWxscygpIHsKLQkJdGhpcy5yb3dzLmVuc3VyZUNhcGFjaXR5KHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBzdHJlYW0gPSB0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNlbGxNb2RlbHMoc3RyZWFtLm5leHQoKSk7Ci0JCQl0aGlzLmVuZ2FnZVJvdyhyb3cpOwotCQkJdGhpcy5yb3dzLmFkZChyb3cpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSBjZWxscyBpbiB0aGUgc3BlY2lmaWVkIHJvdy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlUm93KFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cpIHsKLQkJZm9yIChpbnQgaSA9IHJvdy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJcm93W2ldLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNlbGxMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlQWxsQ2VsbHMoKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VBbGxDZWxscygpIHsKLQkJZm9yIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93IDogdGhpcy5yb3dzKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVJvdyhyb3cpOwotCQl9Ci0JCXRoaXMucm93cy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VSb3coV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdykgewotCQlmb3IgKGludCBpID0gcm93Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlyb3dbaV0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2VsbExpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGJydXRlLWZvcmNlIHNlYXJjaCBmb3IgdGhlIGNlbGwocykgdGhhdCBjaGFuZ2VkLi4uCi0JICovCi0Jdm9pZCBjZWxsQ2hhbmdlZChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGNlbGxIb2xkZXIpIHsKLQkJZm9yIChpbnQgaSA9IHRoaXMucm93cy5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdyA9IHRoaXMucm93cy5nZXQoaSk7Ci0JCQlmb3IgKGludCBqID0gcm93Lmxlbmd0aDsgai0tID4gMDsgKSB7Ci0JCQkJaWYgKHJvd1tqXSA9PSBjZWxsSG9sZGVyKSB7Ci0JCQkJCXRoaXMuZmlyZVRhYmxlQ2VsbFVwZGF0ZWQoaSwgaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogY29udmVydCB0aGUgaXRlbXMgdG8gcm93cwotCSAqLwotCXZvaWQgYWRkUm93cyhpbnQgaW5kZXgsIGludCBzaXplLCBJdGVyYXRvcjxPYmplY3Q+IGl0ZW1zKSB7Ci0JCUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPiBuZXdSb3dzID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+KHNpemUpOwotCQl3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNlbGxNb2RlbHMoaXRlbXMubmV4dCgpKTsKLQkJCXRoaXMuZW5nYWdlUm93KHJvdyk7Ci0JCQluZXdSb3dzLmFkZChyb3cpOwotCQl9Ci0JCXRoaXMucm93cy5hZGRBbGwoaW5kZXgsIG5ld1Jvd3MpOwotCQl0aGlzLmZpcmVUYWJsZVJvd3NJbnNlcnRlZChpbmRleCwgaW5kZXggKyBzaXplIC0gMSk7Ci0JfQotCi0Jdm9pZCByZW1vdmVSb3dzKGludCBpbmRleCwgaW50IHNpemUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRoaXMuZGlzZW5nYWdlUm93KHRoaXMucm93cy5yZW1vdmUoaW5kZXgpKTsKLQkJfQotCQl0aGlzLmZpcmVUYWJsZVJvd3NEZWxldGVkKGluZGV4LCBpbmRleCArIHNpemUgLSAxKTsKLQl9Ci0KLQl2b2lkIHJlcGxhY2VSb3dzKGludCBpbmRleCwgSXRlcmF0b3I8T2JqZWN0PiBpdGVtcykgewotCQlpbnQgaSA9IGluZGV4OwotCQl3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5yb3dzLmdldChpKTsKLQkJCXRoaXMuZGlzZW5nYWdlUm93KHJvdyk7Ci0JCQlyb3cgPSB0aGlzLmNvbHVtbkFkYXB0ZXIuY2VsbE1vZGVscyhpdGVtcy5uZXh0KCkpOwotCQkJdGhpcy5lbmdhZ2VSb3cocm93KTsKLQkJCXRoaXMucm93cy5zZXQoaSwgcm93KTsKLQkJCWkrKzsKLQkJfQotCQl0aGlzLmZpcmVUYWJsZVJvd3NVcGRhdGVkKGluZGV4LCBpIC0gMSk7Ci0JfQotCi0Jdm9pZCBtb3ZlUm93cyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+KGxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXRlbXAuYWRkKHRoaXMucm93cy5yZW1vdmUoc291cmNlSW5kZXgpKTsKLQkJfQotCQl0aGlzLnJvd3MuYWRkQWxsKHRhcmdldEluZGV4LCB0ZW1wKTsKLQotCQlpbnQgc3RhcnQgPSBNYXRoLm1pbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlpbnQgZW5kID0gTWF0aC5tYXgodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KSArIGxlbmd0aCAtIDE7Ci0JCXRoaXMuZmlyZVRhYmxlUm93c1VwZGF0ZWQoc3RhcnQsIGVuZCk7Ci0JfQotCi0Jdm9pZCBjbGVhclRhYmxlKCkgewotCQl0aGlzLmRpc2VuZ2FnZUFsbENlbGxzKCk7Ci0JCXRoaXMuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLQl9Ci0KLQl2b2lkIHJlYnVpbGRUYWJsZSgpIHsKLQkJdGhpcy5kaXNlbmdhZ2VBbGxDZWxscygpOwotCQl0aGlzLmVuZ2FnZUFsbENlbGxzKCk7Ci0JCXRoaXMuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Ub2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Ub2dnbGVCdXR0b25Nb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY3M2JhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1MaXN0ZW5lcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpUb2dnbGVCdXR0b24uVG9nZ2xlQnV0dG9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBsaXN0ZW5lcgotICogKGUuZy4gYSBKQ2hlY2tCb3ggb3IgYSBKUmFkaW9CdXR0b24pIGluIHN5bmNoIHdpdGggYSBQcm9wZXJ0eVZhbHVlTW9kZWwKLSAqIG9uIGEgYm9vbGVhbi4KLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcgotCWV4dGVuZHMgVG9nZ2xlQnV0dG9uTW9kZWwKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgdG9nZ2xlIGJ1dHRvbjsgZm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMgbnVsbC4KLQkgKiBUaGUgZGVmYXVsdCBbZGVmYXVsdCB2YWx1ZV0gaXMgZmFsc2UgKGkuZS4gdGhlIHRvZ2dsZSBidXR0b24gaXMgdW5jaGVja2VkL2VtcHR5KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBib29sZWFuLiAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoCi0JICogY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGJvb2xlYW4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYm9vbGVhbkNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBib29sZWFuIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChib29sZWFuSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuYm9vbGVhbkhvbGRlciA9IGJvb2xlYW5Ib2xkZXI7Ci0JCXRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0JICovCi0JcHVibGljIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyKSB7Ci0JCXRoaXMoYm9vbGVhbkhvbGRlciwgZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLnRoaXMuYm9vbGVhbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiYm9vbGVhbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJ1dHRvbk1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gYikgewotCQlpZiAodGhpcy5pc1NlbGVjdGVkKCkgIT0gYikgewkvLyBzdG9wIHRoZSByZWN1cnNpb24hCi0JCQlzdXBlci5zZXRTZWxlY3RlZChiKTsvL3B1dCB0aGUgc3VwZXIgY2FsbCBmaXJzdCwgb3RoZXJ3aXNlIHRoZSBmb2xsb3dpbmcgZ2V0cyBjYWxsZWQgdHdpY2UKLQkJCXRoaXMuYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShCb29sZWFuLnZhbHVlT2YoYikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uTGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQWN0aW9uTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUFjdGlvbkxpc3RlbmVyKEFjdGlvbkxpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlQWN0aW9uTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZEl0ZW1MaXN0ZW5lcihJdGVtTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkSXRlbUxpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVJdGVtTGlzdGVuZXIoSXRlbUxpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlSXRlbUxpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbCkgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgd2UgaGF2ZSBubyBsaXN0ZW5lcnMgYXQgYWxsLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudCgpID09IDA7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBJZiBpdCBpcyBudWxsLCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgKHdoaWNoIGlzIHR5cGljYWxseSBmYWxzZSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VsZWN0ZWQoQm9vbGVhbiB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRTZWxlY3RlZCh0aGlzLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0U2VsZWN0ZWQodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSBhY2NvcmRpbmdseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBib29sZWFuQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2V0U2VsZWN0ZWQoKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5zZXRTZWxlY3RlZCh0aGlzLmJvb2xlYW5Ib2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYm9vbGVhbkhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzZWE4YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZU5vZGVWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcudHJlZS5UcmVlTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIFRyZWVNb2RlbExpc3RlbmVyCi0gKiAoZS5nLiBhIEpUcmVlKSBpbiBzeW5jaCB3aXRoIGEgdHJlZSBvZiBUcmVlTm9kZVZhbHVlTW9kZWwgb2JqZWN0cy4gVW5saWtlCi0gKiBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRUcmVlTW9kZWwsIHlvdSBkbyBub3QgYWRkIGFuZCByZW1vdmUgbm9kZXMgd2l0aAotICogbWV0aG9kcyBpbXBsZW1lbnRlZCBoZXJlLiBZb3UgY2FuIGFkZCBhbmQgcmVtb3ZlIG5vZGVzIGJ5IGFkZGluZyBhbmQKLSAqIHJlbW92aW5nIHRoZW0gZGlyZWN0bHkgdG8vZnJvbSB0aGUgbm9kZXMgKG9yLCBtb3JlIHR5cGljYWxseSwgdGhlIGRvbWFpbgotICogb2JqZWN0cyB0aGUgbm9kZXMgYXJlIHdyYXBwaW5nIGFuZCBsaXN0ZW5pbmcgdG8pLgotICogCi0gKiBEdWUgdG8gbGltaXRhdGlvbnMgaW4gSlRyZWUsIHRoZSByb290IG9mIHRoZSB0cmVlIGNhbiBuZXZlciBiZSBudWxsLAotICogd2hpY2gsIHR5cGljYWxseSwgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0uIChJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGFuIGVtcHR5Ci0gKiB0cmVlIHlvdSBjYW4gc2V0IHRoZSBKVHJlZSdzIHRyZWVNb2RlbCB0byBudWxsLikKLSAqLwotcHVibGljIGNsYXNzIFRyZWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFic3RyYWN0VHJlZU1vZGVsCi17Ci0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyB0cmVlJ3Mgcm9vdCBub2RlIGFuZCBpdHMKLQkgKiBjb3JyZXNwb25kaW5nIGxpc3RlbmVyLiBUaGlzIGFsbG93cyBjbGllbnRzIHRvIHN3YXAgb3V0Ci0JICogdGhlIGVudGlyZSB0cmVlLiBEdWUgdG8gbGltaXRhdGlvbnMgaW4gSlRyZWUsIHRoZSByb290IHNob3VsZAotCSAqIG5ldmVyIGJlIHNldCB0byBudWxsIHdoaWxlIHdlIGhhdmUgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gcm9vdEhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcm9vdExpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IG5vdGlmaWVzIHVzIHdoZW4gYSBub2RlJ3MgaW50ZXJuYWwKLQkgKiAic3RhdGUiIGNoYW5nZXMgKGFzIG9wcG9zZWQgdG8gdGhlIG5vZGUncyB2YWx1ZSBvciBsaXN0IG9mCi0JICogY2hpbGRyZW4pLCBhbGxvd2luZyB1cyB0byBmb3J3YXJkIG5vdGlmaWNhdGlvbiB0byBvdXIgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciBub2RlU3RhdGVMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBub3RpZmllcyB1cyB3aGVuIGEgbm9kZSdzICJ2YWx1ZSIKLQkgKiBjaGFuZ2VzIChhcyBvcHBvc2VkIHRvIHRoZSBub2RlJ3Mgc3RhdGUgb3IgbGlzdCBvZgotCSAqIGNoaWxkcmVuKSwgYWxsb3dpbmcgdXMgdG8gZm9yd2FyZCBub3RpZmljYXRpb24gdG8gb3VyIGxpc3RlbmVycy4KLQkgKiBUeXBpY2FsbHksIHRoaXMgd2lsbCBvbmx5IGhhcHBlbiB3aXRoIG5vZGVzIHRoYXQgaG9sZAotCSAqIHByaW1pdGl2ZSBkYXRhLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBub2RlVmFsdWVMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBub3RpZmllcyB1cyB3aGVuIGFuIHVuZGVybHlpbmcgbm9kZSdzCi0JICogImxpc3QiIG9mIGNoaWxkcmVuIGNoYW5nZXMsIGFsbG93aW5nIHVzIHRvIGtlZXAgb3VyCi0JICogaW50ZXJuYWwgdHJlZSBpbiBzeW5jaCB3aXRoIHRoZSB1bmRlcmx5aW5nIHRyZWUgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgY2hpbGRyZW5MaXN0ZW5lcjsKLQotCS8qIHRoZXNlIGF0dHJpYnV0ZXMgbWFrZSB1cCBvdXIgaW50ZXJuYWwgdHJlZSAqLwotCS8qKgotCSAqIFRoZSByb290IGNhbm5vdCBiZSBudWxsIHdoaWxlIHdlIGhhdmUgbGlzdGVuZXJzLCB3aGljaCBpcwotCSAqIG1vc3Qgb2YgdGhlIHRpbWUuIFRoZSByb290IGlzIGNhY2hlZCBzbyB3ZSBjYW4gZGlzZW5nYWdlCi0JICogZnJvbSBpdCB3aGVuIGl0IGhhcyBiZWVuIHN3YXBwZWQgb3V0LgotCSAqLwotCXByaXZhdGUgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHJvb3Q7Ci0KLQkvKioKLQkgKiBNYXAgdGhlIG5vZGVzIHRvIHRoZWlyIGxpc3RzIG9mIGNoaWxkcmVuLgotCSAqIFdlIGNhY2hlIHRoZXNlIHNvIHdlIGNhbiBzd2FwIG91dCB0aGUgZW50aXJlIGxpc3Qgb2YgY2hpbGRyZW4KLQkgKiB3aGVuIHdlIHJlY2VpdmUgYSAjbGlzdENoYW5nZWQoKSBldmVudCAod2hpY2ggZG9lcyBub3QgaW5jbHVkZQotCSAqIHRoZSBpdGVtcyB0aGF0IHdlcmUgYWZmZWN0ZWQpLgotCSAqIEBzZWUgRXZlbnRDaGFuZ2VQb2xpY3kjcmVidWlsZENoaWxkcmVuKCkKLQkgKi8KLQlmaW5hbCBJZGVudGl0eUhhc2hNYXA8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+LCBMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4+IGNoaWxkcmVuTGlzdHM7Ci0KLQkvKioKLQkgKiBNYXAgdGhlIGNoaWxkcmVuIG1vZGVscyB0byB0aGVpciBwYXJlbnRzLgotCSAqIFdlIGNhY2hlIHRoZXNlIHNvIHdlIGNhbiBmaWd1cmUgb3V0IHRoZSAicmVhbCIgc291cmNlIG9mIHRoZQotCSAqIGxpc3QgY2hhbmdlIGV2ZW50cyAodGhlIHBhcmVudCkuCi0JICogQHNlZSBFdmVudENoYW5nZVBvbGljeSNwYXJlbnQoKQotCSAqLwotCWZpbmFsIElkZW50aXR5SGFzaE1hcDxMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+LCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHBhcmVudHM7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgcm9vdC4KLQkgKi8KLQlwdWJsaWMgVHJlZU1vZGVsQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiByb290SG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChyb290SG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucm9vdEhvbGRlciA9IHJvb3RIb2xkZXI7Ci0JCXRoaXMucm9vdExpc3RlbmVyID0gdGhpcy5idWlsZFJvb3RMaXN0ZW5lcigpOwotCQl0aGlzLm5vZGVTdGF0ZUxpc3RlbmVyID0gdGhpcy5idWlsZE5vZGVTdGF0ZUxpc3RlbmVyKCk7Ci0JCXRoaXMubm9kZVZhbHVlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTm9kZVZhbHVlTGlzdGVuZXIoKTsKLQkJdGhpcy5jaGlsZHJlbkxpc3RlbmVyID0gdGhpcy5idWlsZENoaWxkcmVuTGlzdGVuZXIoKTsKLQkJdGhpcy5jaGlsZHJlbkxpc3RzID0gbmV3IElkZW50aXR5SGFzaE1hcDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4sIExpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Pj4oKTsKLQkJdGhpcy5wYXJlbnRzID0gbmV3IElkZW50aXR5SGFzaE1hcDxMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+LCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCByb290LgotCSAqLwotCXB1YmxpYyBUcmVlTW9kZWxBZGFwdGVyKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiByb290KSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KHJvb3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRSb290TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFJvb3RMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRSb290TGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5yb290Q2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicm9vdCBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROb2RlVmFsdWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTm9kZVZhbHVlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVZhbHVlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLm5vZGVDaGFuZ2VkKChUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgdmFsdWUgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVN0YXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZE5vZGVTdGF0ZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVTdGF0ZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5ub2RlQ2hhbmdlZCgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHN0YXRlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRDaGlsZHJlbkxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLmFkZENoaWxkcmVuKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJbmV3IEV2ZW50Q2hhbmdlUG9saWN5KGV2ZW50KS5yZW1vdmVDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLnJlcGxhY2VDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLm1vdmVDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJbmV3IEV2ZW50Q2hhbmdlUG9saWN5KGV2ZW50KS5jbGVhckNoaWxkcmVuKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLnJlYnVpbGRDaGlsZHJlbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY2hpbGRyZW4gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRSb290KCkgewotCQlyZXR1cm4gdGhpcy5yb290OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoT2JqZWN0IHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiAoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgcGFyZW50KS5jaGlsZChpbmRleCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGludCBnZXRDaGlsZENvdW50KE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuICgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBwYXJlbnQpLmNoaWxkcmVuU2l6ZSgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBib29sZWFuIGlzTGVhZihPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gKChUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIG5vZGUpLmlzTGVhZigpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIHZhbHVlRm9yUGF0aENoYW5nZWQoVHJlZVBhdGggcGF0aCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCSgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBwYXRoLmdldExhc3RQYXRoQ29tcG9uZW50KCkpLnNldFZhbHVlKChUKSBuZXdWYWx1ZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGludCBnZXRJbmRleE9mQ2hpbGQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiAoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgcGFyZW50KS5pbmRleE9mQ2hpbGQoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9UcmVlTW9kZWxMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZFRyZWVNb2RlbExpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZVRyZWVNb2RlbExpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb1RyZWVNb2RlbExpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSByb290IGFuZCBhbGwgdGhlIG90aGVyIG5vZGVzCi0JICogaW4gdGhlIHVuZGVybHlpbmcgdHJlZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMucm9vdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5yb290TGlzdGVuZXIpOwotCQl0aGlzLnJvb3QgPSB0aGlzLnJvb3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsJLy8gdGhlIHJvb3QgY2Fubm90IGJlIG51bGwgd2hpbGUgd2UgaGF2ZSBsaXN0ZW5lcnMKLQkJfQotCQl0aGlzLmVuZ2FnZU5vZGUodGhpcy5yb290KTsKLQkJdGhpcy5hZGRSb290KCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSByb290IGFuZCBhbGwgb2YgdGhlIG5vZGVzIHRvIHRoZSB1bmRlcmx5aW5nIHRyZWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJvb3QoKSB7Ci0JCXRoaXMuYWRkTm9kZSgwLCB0aGlzLnJvb3QpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSByb290IGFuZCBhbGwgdGhlIG90aGVyCi0JICogbm9kZXMgaW4gdGhlIHVuZGVybHlpbmcgdHJlZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMucmVtb3ZlUm9vdCgpOwotCQl0aGlzLmRpc2VuZ2FnZU5vZGUodGhpcy5yb290KTsKLQkJdGhpcy5yb290ID0gbnVsbDsKLQkJdGhpcy5yb290SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnJvb3RMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSByb290IGFuZCBhbGwgb2YgdGhlIG5vZGVzIGZyb20gdGhlIHVuZGVybHlpbmcgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUm9vdCgpIHsKLQkJdGhpcy5yZW1vdmVOb2RlKDAsIHRoaXMucm9vdCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHJvb3QgaGFzIGJlZW4gc3dhcHBlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGJpdCBnbmFybHkgYmVjYXVzZSB0aGUgQVBJIGZvciBub3RpZnlpbmcgbGlzdGVuZXJzCi0JICogdGhhdCB0aGUgcm9vdCBoYXMgY2hhbmdlZCBpcyBhIGJpdCBpbmNvbnNpc3RlbnQgd2l0aCB0aGF0IHVzZWQgZm9yCi0JICogbm9uLXJvb3Qgbm9kZXMuCi0JICovCi0Jdm9pZCByb290Q2hhbmdlZCgpIHsKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5ld1Jvb3QgPSB0aGlzLnJvb3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJaWYgKG5ld1Jvb3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CS8vIHRoZSByb290IGNhbm5vdCBiZSBudWxsIHdoaWxlIHdlIGhhdmUgbGlzdGVuZXJzCi0JCX0KLQkJLy8gcmVtb3ZlIGFsbCB0aGUgY3VycmVudCByb290J3MgY2hpbGRyZW4gZnJvbSB0aGUgdHJlZQotCQkvLyBhbmQgcmVtb3ZlIHRoZSBpdCBmcm9tIHRoZSBpbnRlcm5hbCB0cmVlCi0JCXRoaXMucmVtb3ZlUm9vdCgpOyAKLQotCQkvLyBzYXZlIHRoZSBvbGQgcm9vdCBhbmQgc3dhcCBpbiB0aGUgbmV3IHJvb3QKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG9sZFJvb3QgPSB0aGlzLnJvb3Q7Ci0JCXRoaXMucm9vdCA9IG5ld1Jvb3Q7Ci0KLQkJLy8gd2UgbXVzdCBiZSBsaXN0ZW5pbmcgdG8gYm90aCB0aGUgb2xkIGFuZCBuZXcgcm9vdHMgd2hlbiB3ZSBmaXJlIHRoZSBldmVudAotCQkvLyBiZWNhdXNlIHRoZWlyIHZhbHVlcyBjYW4gYmUgYWZmZWN0ZWQgYnkgd2hldGhlciB0aGV5IGhhdmUgbGlzdGVuZXJzCi0JCXRoaXMuZW5nYWdlTm9kZSh0aGlzLnJvb3QpOwotCQl0aGlzLmZpcmVUcmVlUm9vdFJlcGxhY2VkKHRoaXMucm9vdCk7Ci0JCS8vIG5vdyB3ZSBjYW4gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCByb290Ci0JCXRoaXMuZGlzZW5nYWdlTm9kZShvbGRSb290KTsKLQotCQkvLyBhZGQgdGhlIG5ldyByb290IHRvIHRoZSBpbnRlcm5hbCB0cmVlIGFuZAotCQkvLyBhZGQgYWxsIGl0cyBjaGlsZHJlbiB0byB0aGUgdHJlZSBhbHNvCi0JCXRoaXMuYWRkUm9vdCgpOwotCX0KLQotCS8qKgotCSAqIEVpdGhlciB0aGUgInZhbHVlIiBvciB0aGUgInN0YXRlIiBvZiB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGNoYW5nZWQsCi0JICogZm9yd2FyZCBub3RpZmljYXRpb24gdG8gb3VyIGxpc3RlbmVycy4KLQkgKi8KLQl2b2lkIG5vZGVDaGFuZ2VkKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQgPSBub2RlLnBhcmVudCgpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXRoaXMuZmlyZVRyZWVSb290Q2hhbmdlZChub2RlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZmlyZVRyZWVOb2RlQ2hhbmdlZChwYXJlbnQucGF0aCgpLCBwYXJlbnQuaW5kZXhPZkNoaWxkKG5vZGUpLCBub2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3RlbiB0byB0aGUgbm9kZXMsIG5vdGlmeSBvdXIgbGlzdGVuZXJzIHRoYXQgdGhlIG5vZGVzIHdlcmUgYWRkZWQsCi0JICogYW5kIHRoZW4gYWRkIHRoZSBub2RlcyB0byBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKiBXZSBtdXN0IGxpc3RlbiB0byB0aGUgbm9kZXMgYmVmb3JlIG5vdGlmeWluZyBhbnlib2R5LCBiZWNhdXNlCi0JICogYWRkaW5nIGEgbGlzdGVuZXIgY2FuIGNoYW5nZSB0aGUgdmFsdWUgb2YgYSBub2RlLgotCSAqLwotCXZvaWQgYWRkQ2hpbGRyZW4oVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBjaGlsZHJlbikgewotCQlpbnQgbGVuID0gY2hpbGRJbmRpY2VzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5lbmdhZ2VOb2RlKGNoaWxkcmVuW2ldKTsKLQkJfQotCQl0aGlzLmZpcmVUcmVlTm9kZXNJbnNlcnRlZChwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5hZGROb2RlKGNoaWxkSW5kaWNlc1tpXSwgY2hpbGRyZW5baV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSBub2RlIGFuZCBpdHMgY2hpbGRyZW4gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuZ2FnZU5vZGUoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUpIHsKLQkJbm9kZS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMubm9kZVN0YXRlTGlzdGVuZXIpOwotCQlub2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm5vZGVWYWx1ZUxpc3RlbmVyKTsKLQkJbm9kZS5jaGlsZHJlbk1vZGVsKCkuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmNoaWxkcmVuTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbm9kZSB0byBvdXIgaW50ZXJuYWwgdHJlZTsKLQkgKiB0aGVuIHJlY3Vyc2UgZG93biB0aHJvdWdoIHRoZSBub2RlJ3MgY2hpbGRyZW4sCi0JICogYWRkaW5nIHRoZW0gdG8gdGhlIGludGVybmFsIHRyZWUgYWxzby4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTm9kZShpbnQgaW5kZXgsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCXRoaXMuYWRkTm9kZVRvSW50ZXJuYWxUcmVlKG5vZGUucGFyZW50KCksIGluZGV4LCBub2RlLCBub2RlLmNoaWxkcmVuTW9kZWwoKSk7Ci0JCW5ldyBOb2RlQ2hhbmdlUG9saWN5KG5vZGUpLmFkZENoaWxkcmVuKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbm9kZSB0byBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTm9kZVRvSW50ZXJuYWxUcmVlKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQsIGludCBpbmRleCwgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUsIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5Nb2RlbCkgewotCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gc2libGluZ3MgPSB0aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCWlmIChzaWJsaW5ncyA9PSBudWxsKSB7Ci0JCQlzaWJsaW5ncyA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PigpOwotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnB1dChwYXJlbnQsIHNpYmxpbmdzKTsKLQkJfQotCQlzaWJsaW5ncy5hZGQoaW5kZXgsIG5vZGUpOwotCi0JCXRoaXMucGFyZW50cy5wdXQoY2hpbGRyZW5Nb2RlbCwgbm9kZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIG5vZGVzIGZyb20gb3VyIGludGVybmFsIHRyZWUsIG5vdGlmeSBvdXIgbGlzdGVuZXJzIHRoYXQgdGhlCi0JICogbm9kZXMgd2VyZSByZW1vdmVkLCB0aGVuIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBub2Rlcy4KLQkgKiBXZSBtdXN0IGxpc3RlbiB0byB0aGUgbm9kZXMgdW50aWwgYWZ0ZXIgbm90aWZ5aW5nIGFueWJvZHksIGJlY2F1c2UKLQkgKiByZW1vdmluZyBhIGxpc3RlbmVyIGNhbiBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgbm9kZS4KLQkgKi8KLQl2b2lkIHJlbW92ZUNoaWxkcmVuKFRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIHBhdGgsIGludFtdIGNoaWxkSW5kaWNlcywgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gY2hpbGRyZW4pIHsKLQkJaW50IGxlbiA9IGNoaWxkSW5kaWNlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCS8vIHRoZSBpbmRpY2VzIHNsaWRlIGRvd24gYSBub3RjaCBlYWNoIHRpbWUgd2UgcmVtb3ZlIGEgY2hpbGQKLQkJCXRoaXMucmVtb3ZlTm9kZShjaGlsZEluZGljZXNbaV0gLSBpLCBjaGlsZHJlbltpXSk7Ci0JCX0KLQkJdGhpcy5maXJlVHJlZU5vZGVzUmVtb3ZlZChwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5kaXNlbmdhZ2VOb2RlKGNoaWxkcmVuW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpcnN0LCByZWN1cnNlIGRvd24gdGhyb3VnaCB0aGUgbm9kZSdzIGNoaWxkcmVuLAotCSAqIHJlbW92aW5nIHRoZW0gZnJvbSBvdXIgaW50ZXJuYWwgdHJlZTsKLQkgKiB0aGVuIHJlbW92ZSB0aGUgbm9kZSBpdHNlbGYgZnJvbSBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZShpbnQgaW5kZXgsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCW5ldyBOb2RlQ2hhbmdlUG9saWN5KG5vZGUpLnJlbW92ZUNoaWxkcmVuKCk7Ci0JCXRoaXMucmVtb3ZlTm9kZUZyb21JbnRlcm5hbFRyZWUobm9kZS5wYXJlbnQoKSwgaW5kZXgsIG5vZGUsIG5vZGUuY2hpbGRyZW5Nb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBub2RlIGZyb20gb3VyIGludGVybmFsIHRyZWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGVGcm9tSW50ZXJuYWxUcmVlKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQsIGludCBpbmRleCwgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUsIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5Nb2RlbCkgewotCQl0aGlzLnBhcmVudHMucmVtb3ZlKGNoaWxkcmVuTW9kZWwpOwotCi0JCUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBzaWJsaW5ncyA9IHRoaXMuY2hpbGRyZW5MaXN0cy5nZXQocGFyZW50KTsKLQkJc2libGluZ3MucmVtb3ZlKGluZGV4KTsKLQkJaWYgKHNpYmxpbmdzLmlzRW1wdHkoKSkgewotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnJlbW92ZShwYXJlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG5vZGUgYW5kIGl0cyBjaGlsZHJlbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlTm9kZShUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbm9kZSkgewotCQlub2RlLmNoaWxkcmVuTW9kZWwoKS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuY2hpbGRyZW5MaXN0ZW5lcik7Ci0JCW5vZGUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubm9kZVZhbHVlTGlzdGVuZXIpOwotCQlub2RlLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5ub2RlU3RhdGVMaXN0ZW5lcik7Ci0JfQotCi0Jdm9pZCBtb3ZlQ2hpbGRyZW4oVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHBhcmVudCwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGNoaWxkcmVuTGlzdCA9IHRoaXMuY2hpbGRyZW5MaXN0cy5nZXQocGFyZW50KTsKLQkJQXJyYXlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PihsZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQl0ZW1wLmFkZChjaGlsZHJlbkxpc3QucmVtb3ZlKHNvdXJjZUluZGV4KSk7Ci0JCX0KLQkJY2hpbGRyZW5MaXN0LmFkZEFsbCh0YXJnZXRJbmRleCwgdGVtcCk7Ci0KLQkJdGhpcy5maXJlVHJlZVN0cnVjdHVyZUNoYW5nZWQocGFyZW50LnBhdGgoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5yb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb2FsZXNjZSBzb21lIG9mIHRoZSBjb21tb24gY2hhbmdlIHBvbGljeSBiZWhhdmlvci4KLQkgKi8KLQlwcml2YXRlIGFic3RyYWN0IGNsYXNzIENoYW5nZVBvbGljeSB7Ci0KLQkJQ2hhbmdlUG9saWN5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLgotCQkgKi8KLQkJdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5hZGRDaGlsZHJlbih0aGlzLnBhcmVudCgpLnBhdGgoKSwgdGhpcy5jaGlsZEluZGljZXMoKSwgdGhpcy5jaGlsZEFycmF5KCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4uCi0JCSAqLwotCQl2b2lkIHJlbW92ZUNoaWxkcmVuKCkgewotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHRoaXMucGFyZW50KCkucGF0aCgpLCB0aGlzLmNoaWxkSW5kaWNlcygpLCB0aGlzLmNoaWxkQXJyYXkoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBpbmRpY2VzIG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbiwKLQkJICogd2hpY2ggc2hvdWxkIGJlIGNvbnRpZ3VvdXMuCi0JCSAqLwotCQlpbnRbXSBjaGlsZEluZGljZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZEluZGljZXModGhpcy5jaGlsZHJlblN0YXJ0SW5kZXgoKSwgdGhpcy5jaGlsZHJlblNpemUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGNoaWxkQXJyYXkoKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZEFycmF5KHRoaXMuY2hpbGRyZW4oKSwgdGhpcy5jaGlsZHJlblNpemUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQnVpbGQgYW4gYXJyYXkgdG8gaG9sZCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkJICogSWYgdGhleSBhcmUgZGlmZmVyZW50IHNpemVzLCBzb21ldGhpbmcgaXMgc2NyZXdlZCB1cC4uLgotCQkgKi8KLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gYnVpbGRBcnJheShJdGVyYXRvcjxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHN0cmVhbSwgaW50IHNpemUpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gYXJyYXkgPSBuZXcgVHJlZU5vZGVWYWx1ZU1vZGVsW3NpemVdOwotCQkJZm9yIChpbnQgaSA9IDA7IHN0cmVhbS5oYXNOZXh0KCk7IGkrKykgewotCQkJCWFycmF5W2ldID0gc3RyZWFtLm5leHQoKTsKLQkJCX0KLQkJCXJldHVybiBhcnJheTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gYSBzZXQgb2YgaW5kaWNlcywgc3RhcnRpbmcgYXQgemVybyBhbmQKLQkJICogY29udGludWluZyBmb3IgdGhlIHNwZWNpZmllZCBzaXplLgotCQkgKi8KLQkJaW50W10gYnVpbGRJbmRpY2VzKGludCBzaXplKSB7Ci0JCQlyZXR1cm4gYnVpbGRJbmRpY2VzKDAsIHNpemUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhIHNldCBvZiBpbmRpY2VzLCBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGFuZAotCQkgKiBjb250aW51aW5nIGZvciB0aGUgc3BlY2lmaWVkIHNpemUuCi0JCSAqLwotCQlpbnRbXSBidWlsZEluZGljZXMoaW50IHN0YXJ0LCBpbnQgc2l6ZSkgewotCQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbc2l6ZV07Ci0JCQlpbnQgaW5kZXggPSBzdGFydDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaW5kaWNlc1tpXSA9IGluZGV4Kys7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5kaWNlczsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4uCi0JCSAqLwotCQlhYnN0cmFjdCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3RhcnRpbmcgaW5kZXggZm9yIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IGludCBjaGlsZHJlblN0YXJ0SW5kZXgoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IGludCBjaGlsZHJlblNpemUoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGludGVyYXRvciBvbiB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4uCi0JCSAqLwotCQlhYnN0cmFjdCBJdGVyYXRvcjxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGNoaWxkcmVuKCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgTGlzdENoYW5nZUV2ZW50IGZvciBhZGRpbmcsIHJlbW92aW5nLCByZXBsYWNpbmcsCi0JICogYW5kIGNoYW5naW5nIGNoaWxkcmVuLgotCSAqLwotCXByaXZhdGUgY2xhc3MgRXZlbnRDaGFuZ2VQb2xpY3kgZXh0ZW5kcyBDaGFuZ2VQb2xpY3kgewotCQlwcml2YXRlIExpc3RDaGFuZ2VFdmVudCBldmVudDsKLQotCQlFdmVudENoYW5nZVBvbGljeShMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBNYXAgdGhlIExpc3RDaGFuZ2VFdmVudCdzIHNvdXJjZSB0byB0aGUgY29ycmVzcG9uZGluZyBwYXJlbnQuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHBhcmVudCgpIHsKLQkJCXJldHVybiBUcmVlTW9kZWxBZGFwdGVyLnRoaXMucGFyZW50cy5nZXQodGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RDaGFuZ2VFdmVudCdzIGl0ZW0gaW5kZXggaXMgdGhlIGNoaWxkcmVuIHN0YXJ0IGluZGV4LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmVudC5nZXRJbmRleCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBMaXN0Q2hhbmdlRXZlbnQncyBzaXplIGlzIHRoZSBjaGlsZHJlbiBzaXplLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmVudC5pdGVtc1NpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdENoYW5nZUV2ZW50J3MgaXRlbXMgYXJlIHRoZSBjaGlsZHJlbi4KLQkJICovCi0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbigpIHsKLQkJCXJldHVybiAoSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PikgdGhpcy5ldmVudC5pdGVtcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgb2xkIG5vZGVzIGFuZCBhZGQgdGhlIG5ldyBvbmVzLgotCQkgKi8KLQkJdm9pZCByZXBsYWNlQ2hpbGRyZW4oKSB7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXJlbnRQYXRoID0gdGhpcy5wYXJlbnQoKS5wYXRoKCk7Ci0JCQlpbnRbXSBjaGlsZEluZGljZXMgPSB0aGlzLmNoaWxkSW5kaWNlcygpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgdGhpcy5yZXBsYWNlZENoaWxkcmVuKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLmFkZENoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgdGhpcy5jaGlsZEFycmF5KCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgb2xkIG5vZGVzIGFuZCBhZGQgdGhlIG5ldyBvbmVzLgotCQkgKi8KLQkJdm9pZCBtb3ZlQ2hpbGRyZW4oKSB7Ci0JCQlUcmVlTW9kZWxBZGFwdGVyLnRoaXMubW92ZUNoaWxkcmVuKHRoaXMucGFyZW50KCksIHRoaXMuZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSwgdGhpcy5ldmVudC5nZXRTb3VyY2VJbmRleCgpLCB0aGlzLmV2ZW50LmdldE1vdmVMZW5ndGgoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQ2xlYXIgYWxsIHRoZSBub2Rlcy4KLQkJICovCi0JCXZvaWQgY2xlYXJDaGlsZHJlbigpIHsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQgPSB0aGlzLnBhcmVudCgpOwotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGFyZW50UGF0aCA9IHBhcmVudC5wYXRoKCk7Ci0JCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5MaXN0ID0gVHJlZU1vZGVsQWRhcHRlci50aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCQlpbnRbXSBjaGlsZEluZGljZXMgPSB0aGlzLmJ1aWxkSW5kaWNlcyhjaGlsZHJlbkxpc3Quc2l6ZSgpKTsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGNoaWxkQXJyYXkgPSB0aGlzLmJ1aWxkQXJyYXkoY2hpbGRyZW5MaXN0Lml0ZXJhdG9yKCksIGNoaWxkcmVuTGlzdC5zaXplKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRBcnJheSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmVtb3ZlIGFsbCB0aGUgb2xkIG5vZGVzIGFuZCBhZGQgYWxsIHRoZSBuZXcgbm9kZXMuCi0JCSAqLwotCQl2b2lkIHJlYnVpbGRDaGlsZHJlbigpIHsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQgPSB0aGlzLnBhcmVudCgpOwotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGFyZW50UGF0aCA9IHBhcmVudC5wYXRoKCk7Ci0JCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5MaXN0ID0gVHJlZU1vZGVsQWRhcHRlci50aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCQlpbnRbXSBjaGlsZEluZGljZXMgPSB0aGlzLmJ1aWxkSW5kaWNlcyhjaGlsZHJlbkxpc3Quc2l6ZSgpKTsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGNoaWxkQXJyYXkgPSB0aGlzLmJ1aWxkQXJyYXkoY2hpbGRyZW5MaXN0Lml0ZXJhdG9yKCksIGNoaWxkcmVuTGlzdC5zaXplKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRBcnJheSk7Ci0KLQkJCWNoaWxkSW5kaWNlcyA9IHRoaXMuYnVpbGRJbmRpY2VzKHBhcmVudC5jaGlsZHJlbk1vZGVsKCkuc2l6ZSgpKTsKLQkJCWNoaWxkQXJyYXkgPSB0aGlzLmJ1aWxkQXJyYXkocGFyZW50LmNoaWxkcmVuTW9kZWwoKS5pdGVyYXRvcigpLCBwYXJlbnQuY2hpbGRyZW5TaXplKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLmFkZENoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRBcnJheSk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RDaGFuZ2VFdmVudCdzIHJlcGxhY2VkIGl0ZW1zIGFyZSB0aGUgcmVwbGFjZWQgY2hpbGRyZW4uCi0JCSAqLwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcmVwbGFjZWRDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkQXJyYXkoKEl0ZXJhdG9yPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4pIHRoaXMuZXZlbnQucmVwbGFjZWRJdGVtcygpLCB0aGlzLmV2ZW50Lml0ZW1zU2l6ZSgpKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBXcmFwcyBhIFRyZWVOb2RlVmFsdWVNb2RlbCBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyBpdHMgY2hpbGRyZW4uCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBOb2RlQ2hhbmdlUG9saWN5IGV4dGVuZHMgQ2hhbmdlUG9saWN5IHsKLQkJcHJpdmF0ZSBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbm9kZTsKLQotCQlOb2RlQ2hhbmdlUG9saWN5KFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCQl0aGlzLm5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBub2RlIGl0c2VsZiBpcyB0aGUgcGFyZW50LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNpbmNlIHdlIHdpbGwgYWx3YXlzIGJlIGRlYWxpbmcgd2l0aCBhbGwgb2YgdGhlIG5vZGUncwotCQkgKiBjaGlsZHJlbiwgdGhlIGNoaWxkcmVuIHN0YXJ0IGluZGV4IGlzIGFsd2F5cyB6ZXJvLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB3ZSB3aWxsIGFsd2F5cyBiZSBkZWFsaW5nIHdpdGggYWxsIG9mIHRoZSBub2RlJ3MKLQkJICogY2hpbGRyZW4sIHRoZSBjaGlsZHJlbiBzaXplIGlzIGFsd2F5cyBlcXVhbCB0byB0aGUgc2l6ZQotCQkgKiBvZiB0aGUgY2hpbGRyZW4gbW9kZWwuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLm5vZGUuY2hpbGRyZW5Nb2RlbCgpLnNpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB3ZSB3aWxsIGFsd2F5cyBiZSBkZWFsaW5nIHdpdGggYWxsIG9mIHRoZSBub2RlJ3MKLQkJICogY2hpbGRyZW4sIHRoZSBjaGlsZHJlbiBhcmUgYWxsIHRoZSBvYmplY3RzIGhlbGQgYnkKLQkJICogdGhlIGNoaWxkcmVuIG1vZGVsLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCUl0ZXJhdG9yPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlLmNoaWxkcmVuTW9kZWwoKS5pdGVyYXRvcigpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0Fic3RyYWN0Tm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvQWJzdHJhY3ROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NTIzN2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvQWJzdHJhY3ROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgTm9kZSBjbGFzc2VzLgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIGZvbGxvd2luZzoKLSAqICAgICBpbml0aWFsaXphdGlvbgotICogICAgIGVuZm9yY2VkIG9iamVjdCBpZGVudGl0eSB3cnQgI2VxdWFscygpLyNoYXNoQ29kZSgpCi0gKiAgICAgY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGQpCi0gKiAgICAgdXNlciBjb21tZW50Ci0gKiAgICAgZGlydHkgZmxhZwotICogICAgIHByb2JsZW1zCi0gKiAgICAgc29ydGluZwotICogCi0gKiBUeXBpY2FsbHksIHN1YmNsYXNzZXMgc2hvdWxkIGNvbnNpZGVyIGltcGxlbWVudGluZyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gKiAgICAgdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnVjdG9ycwotICogICAgICAgICAod2l0aCB0aGUgYXBwcm9wcmlhdGVseS1yZXN0cmljdGl2ZSB0eXBlIGRlY2xhcmF0aW9uIGZvciBwYXJlbnQpCi0gKiAgICAgI2luaXRpYWxpemUoKQotICogICAgICNpbml0aWFsaXplKE5vZGUgcGFyZW50Tm9kZSkKLSAqICAgICAjY2hlY2tQYXJlbnQoTm9kZSBwYXJlbnROb2RlKQotICogICAgICNhZGRDaGlsZHJlblRvKExpc3QgbGlzdCkKLSAqICAgICAjbm9kZVJlbW92ZWQoTm9kZSkKLSAqICAgICAjdmFsaWRhdG9yKCkKLSAqICAgICAjdHJhbnNpZW50QXNwZWN0TmFtZXMoKSBvcgotICogICAgICAgICAjYWRkVHJhbnNpZW50QXNwZWN0TmFtZXNUbyhTZXQgdHJhbnNpZW50QXNwZWN0TmFtZXMpCi0gKiAgICAgI2FkZFByb2JsZW1zVG8oTGlzdCBjdXJyZW50UHJvYmxlbXMpCi0gKiAgICAgI25vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkKLSAqICAgICAgICAgI2FkZE5vblZhbGlkYXRlZEFzcGVjdE5hbWVzVG8oU2V0IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKQotICogICAgICNkaXNwbGF5U3RyaW5nKCkKLSAqICAgICAjdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm9kZSAKLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIE5vZGUsIENhbGxiYWNrQ2hhbmdlU3VwcG9ydC5Tb3VyY2UKLXsKLQotCS8qKiBDb250YWlubWVudCBoaWVyYXJjaHkuICovCi0JcHJpdmF0ZSBOb2RlIHBhcmVudDsgIC8vIHBzZXVkby1maW5hbAotCi0JLyoqIFRyYWNrIHdoZXRoZXIgdGhlIG5vZGUgaGFzIGNoYW5nZWQuICovCi0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGRpcnR5OwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBkaXJ0eUJyYW5jaDsKLQotCS8qKgotCSAqIFRoZSBub2RlJ3MgcHJvYmxlbXMsIGFzIGNhbGN1bGF0ZWQgZHVyaW5nIHZhbGlkYXRpb24uCi0JICogVGhpcyBsaXN0IHNob3VsZCBvbmx5IGJlIG1vZGlmaWVkIHZpYSBhIFByb2JsZW1TeW5jaHJvbml6ZXIsCi0JICogYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyBtb2RpZmljYXRpb24gZnJvbSBhbm90aGVyIHRocmVhZC4KLQkgKi8KLQlwcml2YXRlIFZlY3RvcjxQcm9ibGVtPiBwcm9ibGVtczsJCS8vIHBzZXVkby1maW5hbAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9QUk9CTEVNX01FU1NBR0VfQVJHVU1FTlRTID0gbmV3IE9iamVjdFswXTsKLQotCS8qKgotCSAqIENhY2hlIHRoZSBub2RlJ3MgImJyYW5jaCIgcHJvYmxlbXMsIGFzIGNhbGN1bGF0ZWQgZHVyaW5nIHZhbGlkYXRpb24uCi0JICogVGhpcyBsaXN0IHNob3VsZCBvbmx5IGJlIG1vZGlmaWVkIHZpYSBhIFByb2JsZW1TeW5jaHJvbml6ZXIsCi0JICogYWxsb3dpbmcgZm9yIGFzeW5jaHJvbm91cyBtb2RpZmljYXRpb24gZnJvbSBhbm90aGVyIHRocmVhZC4KLQkgKiBUaGlzIG11c3QgYmUgcmVjYWxjdWxhdGVkIGV2ZXJ5IHRpbWUgdGhpcyBub2RlIG9yIG9uZSBvZiBpdHMKLQkgKiBkZXNjZW5kYW50cyBjaGFuZ2VzIGl0IHByb2JsZW1zLgotCSAqLwotCXByaXZhdGUgVmVjdG9yPFByb2JsZW0+IGJyYW5jaFByb2JsZW1zOwkJLy8gcHNldWRvLWZpbmFsCi0KLQkvKiogVXNlciBjb21tZW50LiAqLwotCXByaXZhdGUgdm9sYXRpbGUgU3RyaW5nIGNvbW1lbnQ7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIGZpZWxkcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXRzIG9mIHRyYW5zaWVudCBhc3BlY3QgbmFtZXMsIGtleWVkIGJ5IGNsYXNzLgotCSAqIFRoaXMgaXMgYnVpbHQgdXAgbGF6aWx5LCBhcyB0aGUgb2JqZWN0cyBhcmUgbW9kaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3ROb2RlPiwgSGFzaFNldDxTdHJpbmc+PiB0cmFuc2llbnRBc3BlY3ROYW1lU2V0cyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdE5vZGU+LCBIYXNoU2V0PFN0cmluZz4+KCk7Ci0KLQkvKioKLQkgKiBTZXRzIG9mIG5vbi12YWxpZGF0ZWQgYXNwZWN0IG5hbWVzLCBrZXllZCBieSBjbGFzcy4KLQkgKiBUaGlzIGlzIGJ1aWx0IHVwIGxhemlseSwgYXMgdGhlIG9iamVjdHMgYXJlIG1vZGlmaWVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Tm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZVNldHMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3ROb2RlPiwgSGFzaFNldDxTdHJpbmc+PigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBNb3N0IG9iamVjdHMgbXVzdCBoYXZlIGEgcGFyZW50LgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIG5ldyBub2RlLgotCSAqIEBzZWUgI2luaXRpYWxpemUoTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3ROb2RlKE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShwYXJlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbml0aWFsaXplIGEgbmV3bHktY3JlYXRlZCBpbnN0YW5jZS4KLQkgKiBAc2VlICNpbml0aWFsaXplKE5vZGUpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLmNvbW1lbnQgPSAiIjsKLQotCQkvLyBhIG5ldyBvYmplY3QgaXMgZGlydHksIGJ5IGRlZmluaXRpb24KLQkJdGhpcy5kaXJ0eSA9IHRydWU7Ci0JCXRoaXMuZGlydHlCcmFuY2ggPSB0cnVlOwotCi0JCXRoaXMucHJvYmxlbXMgPSBuZXcgVmVjdG9yPFByb2JsZW0+KCk7Ci0JCXRoaXMuYnJhbmNoUHJvYmxlbXMgPSBuZXcgVmVjdG9yPFByb2JsZW0+KCk7Ci0KLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgYSBuZXdseS1jcmVhdGVkIGluc3RhbmNlLgotCSAqIEBzZWUgI2luaXRpYWxpemUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoTm9kZSBwYXJlbnROb2RlKSB7Ci0JCXRoaXMuY2hlY2tQYXJlbnQocGFyZW50Tm9kZSk7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50Tm9kZTsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuaW5pdGlhbGl6ZShwYXJlbnROb2RlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgQ2FsbGJhY2tDaGFuZ2VTdXBwb3J0KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlcXVhbGl0eSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFbmZvcmNlIG9iamVjdCBpZGVudGl0eSAtIGRvIG5vdCBhbGxvdyBvYmplY3RzIHRvIGJlIGVxdWFsIHVubGVzcwotCSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgLSB3ZSByZWx5IG9uIG9iamVjdCBpZGVudGl0eSBleHRlbnNpdmVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMgPT0gbzsKLQl9Ci0KLQkvKioKLQkgKiBFbmZvcmNlIG9iamVjdCBpZGVudGl0eSAtIGRvIG5vdCBhbGxvdyBvYmplY3RzIHRvIGJlIGVxdWFsIHVubGVzcwotCSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgLSB3ZSByZWx5IG9uIG9iamVjdCBpZGVudGl0eSBleHRlbnNpdmVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGRyZW4pICoqKioqKioqKioKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBpbiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5LgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcGFyZW50LgotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBhcmVudCBpcyBub3QgdmFsaWQKLQkgKiBmb3IgdGhlIG5vZGUuCi0JICogQnkgZGVmYXVsdCByZXF1aXJlIGEgbm9uLW51bGwgcGFyZW50LiBPdmVycmlkZSBpZiBvdGhlciByZXN0cmljdGlvbnMgZXhpc3QKLQkgKiBvciB0aGUgcGFyZW50IHNob3VsZCBiZSBudWxsLgotCSAqIE5COiBSb290IG5vZGUgbW9kZWwgaW1wbGVtZW50YXRpb25zIHdpbGwgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChOb2RlIHBhcmVudE5vZGUpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmVudCBub2RlIGNhbm5vdCBiZSBudWxsIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQST8KLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBjaGlsZHJlbiwgd2hpY2ggYXJlIGFsc28gbm9kZXMuCi0JICogRG8gTk9UIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIE92ZXJyaWRlICNhZGRDaGlsZHJlblRvKExpc3QpLgotCSAqIEBzZWUgI2dldFBhcmVudCgpCi0JICogQHNlZSAjYWRkQ2hpbGRyZW5UbyhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgSXRlcmF0b3I8Tm9kZT4gY2hpbGRyZW4oKSB7Ci0JCUxpc3Q8Tm9kZT4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7Ci0JCXRoaXMuYWRkQ2hpbGRyZW5UbyhjaGlsZHJlbik7Ci0JCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFkZCB0aGVpciBjaGlsZHJlbgotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBAc2VlICNjaGlsZHJlbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW5UbyhMaXN0PE5vZGU+IGxpc3QpIHsKLQkJLy8gdGhpcyBjbGFzcyBoYXMgbm8gY2hpbGRyZW4sIHN1YmNsYXNzZXMgd2lsbC4uLgotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5hZGRDaGlsZHJlblRvKGxpc3QpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5J3Mgcm9vdCBub2RlLgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcm9vdC4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqIE5COiBBc3N1bWUgdGhlIHJvb3QgaGFzIG5vIHBhcmVudC4KLQkgKi8KLQlwdWJsaWMgTm9kZSByb290KCkgewotCQlOb2RlIHAgPSB0aGlzLnBhcmVudDsKLQkJcmV0dXJuIChwID09IG51bGwpID8gdGhpcyA6IHAucm9vdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogQnkgZGVmaW5pdGlvbiwgYSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiBpdHNlbGYuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZXNjZW5kYW50T2YoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAodGhpcyA9PSBub2RlKSB8fCB0aGlzLnBhcmVudElzRGVzY2VuZGFudE9mKG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHBhcmVudElzRGVzY2VuZGFudE9mKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKHRoaXMucGFyZW50ICE9IG51bGwpICYmIHRoaXMucGFyZW50LmlzRGVzY2VuZGFudE9mKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gaG9sZGluZyBhbGwgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwKLQkgKiB0aGUgbm9kZSdzIGRlc2NlbmRhbnRzJyAicmVmZXJlbmNlcyIuICJSZWZlcmVuY2VzIiBhcmUKLQkgKiBvYmplY3RzIHRoYXQgYXJlICJyZWZlcmVuY2VkIiBieSBhbm90aGVyIG9iamVjdCwgYXMgb3Bwb3NlZAotCSAqIHRvICJvd25lZCIgYnkgYW5vdGhlciBvYmplY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzKCkgewotCQlDb2xsZWN0aW9uPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxOb2RlLlJlZmVyZW5jZT4oMTAwMCk7CQkvLyBzdGFydCBiaWcKLQkJdGhpcy5hZGRCcmFuY2hSZWZlcmVuY2VzVG8oYnJhbmNoUmVmZXJlbmNlcyk7Ci0JCXJldHVybiBicmFuY2hSZWZlcmVuY2VzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwgdGhlIG5vZGUncyBkZXNjZW5kYW50cycKLQkgKiAicmVmZXJlbmNlcyIsIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gIlJlZmVyZW5jZXMiIGFyZQotCSAqIG9iamVjdHMgdGhhdCBhcmUgInJlZmVyZW5jZWQiIGJ5IGFub3RoZXIgb2JqZWN0LCBhcyBvcHBvc2VkCi0JICogdG8gIm93bmVkIiBieSBhbm90aGVyIG9iamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvZiBwYXJ0aWN1bGFyIGNvbmNlcm4gdG8gSGFuZGxlcywgc2luY2UgbW9zdAotCSAqIChob3BlZnVsbHkgYWxsKSAicmVmZXJlbmNlcyIgYXJlIGhlbGQgYnkgSGFuZGxlcy4KLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCcmFuY2hSZWZlcmVuY2VzVG8oQ29sbGVjdGlvbjxOb2RlLlJlZmVyZW5jZT4gYnJhbmNoUmVmZXJlbmNlcykgewotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJY2hpbGQuYWRkQnJhbmNoUmVmZXJlbmNlc1RvKGJyYW5jaFJlZmVyZW5jZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG9iamVjdCdzIGJyYW5jaCBvZiB0aGUgdHJlZSwKLQkgKiBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLiBUaGUgbm9kZXMgd2lsbCBwcm9iYWJseSByZXR1cm5lZAotCSAqIGluICJkZXB0aC1maXJzdCIgb3JkZXIuCi0JICogT25seSByZWFsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxOb2RlPiBhbGxOb2RlcygpIHsKLQkJQ29sbGVjdGlvbjxOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oMTAwMCk7CQkvLyBzdGFydCBiaWcKLQkJdGhpcy5hZGRBbGxOb2Rlc1RvKG5vZGVzKTsKLQkJcmV0dXJuIG5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEk/Ci0JICogQWRkIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG9iamVjdCdzIGJyYW5jaCBvZiB0aGUgdHJlZSwKLQkgKiBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLCB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogT25seSByZWFsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbE5vZGVzVG8oQ29sbGVjdGlvbjxOb2RlPiBub2RlcykgewotCQlub2Rlcy5hZGQodGhpcyk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5hZGRBbGxOb2Rlc1RvKG5vZGVzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb2RlbCBzeW5jaHJvbml6YXRpb24gc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFRoaXMgaXMgYSBnZW5lcmFsIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBoYXMgYmVlbgotCSAqIHJlbW92ZWQgZnJvbSB0aGUgdHJlZS4gVGhlIG5vZGUgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uCi0JICogc2hvdWxkIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSB1cGRhdGVzIHRvIHJlbWFpbiBpbiBzeW5jaAotCSAqIHdpdGggdGhlIHRyZWUgKGUuZy4gY2xlYXJpbmcgb3V0IG9yIHJlcGxhY2luZyBhbnkgcmVmZXJlbmNlcwotCSAqIHRvIHRoZSByZW1vdmVkIG5vZGUgb3IgYW55IG9mIHRoZSByZW1vdmVkIG5vZGUncyBkZXNjZW5kYW50cykuCi0JICogQHNlZSAjaXNEZXNjZW5kYW50T2YoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLm5vZGVSZW1vdmVkKG5vZGUpOwotCQl9Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLm5vZGVSZW1vdmVkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqIHJldHVybiB3aGV0aGVyIG5vZGUxIGlzIGEgZGVzY2VuZGFudCBvZiBub2RlMjsKLQkgKiBub2RlMSBjYW4gYmUgbnVsbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5vZGVJc0Rlc2NlbmRhbnRPZihOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB7Ci0JCXJldHVybiAobm9kZTEgIT0gbnVsbCkgJiYgbm9kZTEuaXNEZXNjZW5kYW50T2Yobm9kZTIpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogVGhpcyBpcyBhIGdlbmVyYWwgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHNwZWNpZmllZCBub2RlIGhhcyBiZWVuCi0JICogcmVuYW1lZC4gVGhlIG5vZGUgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uIHNob3VsZCBtYXJrIGl0cwotCSAqIGJyYW5jaCBkaXJ0eSBpZiBuZWNlc3NhcnkgKGkuZS4gaXQgcmVmZXJlbmNlcyB0aGUgcmVuYW1lZCBub2RlCi0JICogb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cykuIFRoaXMgbWV0aG9kIGlzIG9mIHBhcnRpY3VsYXIgY29uY2VybgotCSAqIHRvIEhhbmRsZXMuCi0JICogQHNlZSAjaXNEZXNjZW5kYW50T2YoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUmVuYW1lZChOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLm5vZGVSZW5hbWVkKG5vZGUpOwotCQl9Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLm5vZGVSZW5hbWVkKG5vZGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHVzZXIgY29tbWVudCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCdzIHVzZXIgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGNvbW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBvYmplY3QncyB1c2VyIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgewotCQlPYmplY3Qgb2xkID0gdGhpcy5jb21tZW50OwotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09NTUVOVF9QUk9QRVJUWSwgb2xkLCBjb21tZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogQW4gYXNwZWN0IG9mIHRoZSBub2RlIGhhcyBjaGFuZ2VkOgotCSAqIAktIGlmIGl0IGlzIGEgcGVyc2lzdGVudCBhc3BlY3QsIG1hcmsgdGhlIG9iamVjdCBkaXJ0eQotCSAqIAktIGlmIGl0IGlzIGEgc2lnbmlmaWNhbnQgYXNwZWN0LCB2YWxpZGF0ZSB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlpZiAodGhpcy5hc3BlY3RJc1BlcnNpc3RlbnQoYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBkaXJ0eSBjaGFuZ2U6ICIgKyB0aGlzICsgIjogIiArIGFzcGVjdE5hbWUpOwotCQkJdGhpcy5tYXJrRGlydHkoKTsKLQkJfQotCQlpZiAodGhpcy5hc3BlY3RDaGFuZ2VSZXF1aXJlc1ZhbGlkYXRpb24oYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiB2YWxpZGF0aW9uIGNoYW5nZTogIiArIHRoaXMgKyAiOiAiICsgYXNwZWN0TmFtZSk7Ci0JCQl0aGlzLnZhbGlkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJdGhpcy5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogUmV0dXJuIGEgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGEKLQkgKiAidmFsaWRhdGVkIiBhc3BlY3Qgb2YgdGhlIG5vZGUgdHJlZSBjaGFuZ2VzLgotCSAqIFR5cGljYWxseSBvbmx5IHRoZSByb290IG5vZGUgZGlyZWN0bHkgaG9sZHMgYSB2YWxpZGF0b3IuCi0JICogTkI6IFJvb3Qgbm9kZSBtb2RlbCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBOb2RlLlZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIG5vZGUgc2hvdWxkIG5vdCBiZSBmaXJpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgaXRzIGNvbnN0cnVjdGlvbi4iKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0VmFsaWRhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGEKLQkgKiAidmFsaWRhdGVkIiBhc3BlY3Qgb2YgdGhlIG5vZGUgdHJlZSBjaGFuZ2VzLgotCSAqIFR5cGljYWxseSBvbmx5IHRoZSByb290IG5vZGUgZGlyZWN0bHkgaG9sZHMgYSB2YWxpZGF0b3IuCi0JICogTkI6IFJvb3Qgbm9kZSBtb2RlbCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihOb2RlLlZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgcm9vdCBub2RlIHNob3VsZCBpbXBsZW1lbnQgI3NldFZhbGlkYXRvcihOb2RlLlZhbGlkYXRvcikuIik7Ci0JCX0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJPbmx5IHJvb3Qgbm9kZXMgaW1wbGVtZW50ICNzZXRWYWxpZGF0b3IoTm9kZS5WYWxpZGF0b3IpLiIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXJ0eSBmbGFnIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IHBlcnNpc3RlbnQgYXNwZWN0cyBvZiB0aGUgb2JqZWN0Ci0JICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBvYmplY3Qgd2FzIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgY2hhbmdlcyB0byB0aGUgb2JqZWN0J3MgZGVzY2VuZGFudHMuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZGlydHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IHBlcnNpc3RlbnQgYXNwZWN0cyBvZiB0aGUgb2JqZWN0LAotCSAqIG9yIGFueSBvZiBpdHMgZGVzY2VuZGFudHMsIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgb2JqZWN0IGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RpcnR5QnJhbmNoKCkgewotCQlyZXR1cm4gdGhpcy5kaXJ0eUJyYW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgb2JqZWN0IGlzIHVubW9kaWZpZWQKLQkgKiBzaW5jZSBpdCB3YXMgbGFzdCByZWFkIG9yIHNhdmVkLgotCSAqIFRoaXMgZG9lcyBOT1QgaW5jbHVkZSBjaGFuZ2VzIHRvIHRoZSBvYmplY3QncyBkZXNjZW5kYW50cy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NsZWFuKCkgewotCQlyZXR1cm4gISB0aGlzLmRpcnR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBvYmplY3QgYW5kIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMKLQkgKiBhcmUgdW5tb2RpZmllZCBzaW5jZSB0aGUgb2JqZWN0IGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NsZWFuQnJhbmNoKCkgewotCQlyZXR1cm4gISB0aGlzLmRpcnR5QnJhbmNoOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZGlydHkgYnJhbmNoIGZsYWcgc2V0dGluZy4gVGhpcyBpcyBzZXQgdG8gdHJ1ZQotCSAqIHdoZW4gZWl0aGVyIHRoZSBvYmplY3Qgb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cyBiZWNvbWVzIGRpcnR5LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRJc0RpcnR5QnJhbmNoKGJvb2xlYW4gZGlydHlCcmFuY2gpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRpcnR5QnJhbmNoOwotCQl0aGlzLmRpcnR5QnJhbmNoID0gZGlydHlCcmFuY2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVJUWV9CUkFOQ0hfUFJPUEVSVFksIG9sZCwgZGlydHlCcmFuY2gpOwotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIG9iamVjdCBhcyBkaXJ0eSBhbmQgYXMgYSBkaXJ0eSBicmFuY2guCi0JICogQW4gb2JqZWN0IGlzIG1hcmtlZCBkaXJ0eSB3aGVuIGVpdGhlciBhICJwZXJzaXN0ZW50IiBhdHRyaWJ1dGUKLQkgKiBoYXMgY2hhbmdlZCBvciBpdHMgc2F2ZSBsb2NhdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFya0RpcnR5KCkgewotCQl0aGlzLmRpcnR5ID0gdHJ1ZTsKLQkJdGhpcy5tYXJrQnJhbmNoRGlydHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnQgYXMgZGlydHkgYnJhbmNoZXMuCi0JICogVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgZGlydHkuCi0JICovCi0JcHVibGljIHZvaWQgbWFya0JyYW5jaERpcnR5KCkgewotCQkvLyBzaG9ydC1jaXJjdWl0IGFueSB1bm5lY2Vzc2FyeSBwcm9wYWdhdGlvbgotCQlpZiAodGhpcy5kaXJ0eUJyYW5jaCkgewotCQkJLy8gaWYgdGhpcyBpcyBhbHJlYWR5IGEgZGlydHkgYnJhbmNoLCB0aGUgcGFyZW50IG11c3QgYmUgYWxzbwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGhpcy5zZXRJc0RpcnR5QnJhbmNoKHRydWUpOwotCQl0aGlzLm1hcmtQYXJlbnRCcmFuY2hEaXJ0eSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQYXJlbnRCcmFuY2hEaXJ0eSgpIHsKLQkJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHsKLQkJCXRoaXMucGFyZW50Lm1hcmtCcmFuY2hEaXJ0eSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFyayB0aGUgb2JqZWN0IGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGFzIGRpcnR5LgotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBzYXZlIGxvY2F0aW9uIG9mIHNvbWUKLQkgKiB0b3AtbGV2ZWwgb2JqZWN0IGlzIGNoYW5nZWQgYW5kIHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlIG11c3QgYmUgbWFya2VkIGRpcnR5IHNvIGl0Ci0JICogd2lsbCBiZSB3cml0dGVuIG91dC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBtYXJrRW50aXJlQnJhbmNoRGlydHkoKSB7Ci0JCXRoaXMubWFya0RpcnR5KCk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5tYXJrRW50aXJlQnJhbmNoRGlydHkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIG9iamVjdCBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBhcyBjbGVhbi4KLQkgKiBUaGVuIG5vdGlmeSB0aGUgb2JqZWN0J3MgcGFyZW50IHRoYXQgaXQgKHRoZSBwYXJlbnQpCi0JICogbWlnaHQgbm93IGJlIGEgY2xlYW4gYnJhbmNoIGFsc28uCi0JICogVHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgb2JqZWN0IGhhcyBqdXN0IGJlZW4KLQkgKiByZWFkIGluIG9yIHdyaXR0ZW4gb3V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1hcmtFbnRpcmVCcmFuY2hDbGVhbigpIHsKLQkJdGhpcy5jYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCXRoaXMubWFya1BhcmVudEJyYW5jaENsZWFuSWZQb3NzaWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQYXJlbnRCcmFuY2hDbGVhbklmUG9zc2libGUoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudC5tYXJrQnJhbmNoQ2xlYW5JZlBvc3NpYmxlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgYXMgY2xlYW4uCi0JICogVHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgbm9kZSBoYXMganVzdCBiZWVuCi0JICogcmVhZCBpbiBvciB3cml0dGVuIG91dC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqIE5vdCB0aGUgYmVzdCBvZiBtZXRob2QgbmFtZXMuLi4uIDotKAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNhc2NhZGVNYXJrRW50aXJlQnJhbmNoQ2xlYW4oKSB7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5jYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCX0KLQkJdGhpcy5kaXJ0eSA9IGZhbHNlOwotCQl0aGlzLnNldElzRGlydHlCcmFuY2goZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQSBjaGlsZCBub2RlJ3MgYnJhbmNoIGhhcyBiZWVuIG1hcmtlZCBjbGVhbi4gSWYgdGhlIG5vZGUKLQkgKiBpdHNlbGYgaXMgY2xlYW4gYW5kIGlmIGFsbCBvZiBpdHMgY2hpbGRyZW4gYXJlIGFsc28gY2xlYW4sIHRoZQotCSAqIG5vZGUncyBicmFuY2ggY2FuIGJlIG1hcmtlZCBjbGVhbi4gVGhlbiwgaWYgdGhlIG5vZGUncwotCSAqIGJyYW5jaCBpcyBjbGVhbiwgdGhlIG5vZGUgd2lsbCBub3RpZnkgaXRzIHBhcmVudCB0aGF0IGl0IG1pZ2h0Ci0JICogYmUgY2xlYW4gYWxzby4gVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgY2xlYW4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbWFya0JyYW5jaENsZWFuSWZQb3NzaWJsZSgpIHsKLQkJLy8gc2hvcnQtY2lyY3VpdCBhbnkgdW5uZWNlc3NhcnkgcHJvcGFnYXRpb24KLQkJaWYgKHRoaXMuZGlydHkpIHsKLQkJCS8vIGlmIHRoZSBvYmplY3QgaXMgImxvY2FsbHkiIGRpcnR5LCBpdCBpcyBzdGlsbCBhIGRpcnR5IGJyYW5jaAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWlmIChjaGlsZC5pc0RpcnR5QnJhbmNoKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNldElzRGlydHlCcmFuY2goZmFsc2UpOwotCQl0aGlzLm1hcmtQYXJlbnRCcmFuY2hDbGVhbklmUG9zc2libGUoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNwZWN0SXNQZXJzaXN0ZW50KFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuYXNwZWN0SXNUcmFuc2llbnQoYXNwZWN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFzcGVjdElzVHJhbnNpZW50KFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zaWVudEFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIHRoZSBvYmplY3QncyB0cmFuc2llbnQgYXNwZWN0IG5hbWVzLgotCSAqIFRoZXNlIGFyZSB0aGUgYXNwZWN0cyB0aGF0LCB3aGVuIHRoZXkgY2hhbmdlLCB3aWxsIE5PVCBjYXVzZSB0aGUKLQkgKiBvYmplY3QgdG8gYmUgbWFya2VkIGRpcnR5LgotCSAqIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgdHJhbnNpZW50IGFzcGVjdHMsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgI2FkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2V0PFN0cmluZz4gdHJhbnNpZW50QXNwZWN0TmFtZXMoKSB7Ci0JCXN5bmNocm9uaXplZCAodHJhbnNpZW50QXNwZWN0TmFtZVNldHMpIHsKLQkJCUhhc2hTZXQ8U3RyaW5nPiB0cmFuc2llbnRBc3BlY3ROYW1lcyA9IHRyYW5zaWVudEFzcGVjdE5hbWVTZXRzLmdldCh0aGlzLmdldENsYXNzKCkpOwotCQkJaWYgKHRyYW5zaWVudEFzcGVjdE5hbWVzID09IG51bGwpIHsKLQkJCQl0cmFuc2llbnRBc3BlY3ROYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQl0aGlzLmFkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8odHJhbnNpZW50QXNwZWN0TmFtZXMpOwotCQkJCXRyYW5zaWVudEFzcGVjdE5hbWVTZXRzLnB1dCh0aGlzLmdldENsYXNzKCksIHRyYW5zaWVudEFzcGVjdE5hbWVzKTsKLQkJCX0KLQkJCXJldHVybiB0cmFuc2llbnRBc3BlY3ROYW1lczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgb2JqZWN0J3MgdHJhbnNpZW50IGFzcGVjdCBuYW1lcyB0byB0aGUgc3BlY2lmaWVkIHNldC4KLQkgKiBUaGVzZSBhcmUgdGhlIGFzcGVjdHMgdGhhdCwgd2hlbiB0aGV5IGNoYW5nZSwgd2lsbCBOT1QgY2F1c2UgdGhlCi0JICogb2JqZWN0IHRvIGJlIG1hcmtlZCBkaXJ0eS4KLQkgKiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyIHRyYW5zaWVudCBhc3BlY3RzIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uLAotCSAqIG92ZXJyaWRlICN0cmFuc2llbnRBc3BlY3ROYW1lcygpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0PFN0cmluZz4gdHJhbnNpZW50QXNwZWN0TmFtZXMpIHsKLQkJdHJhbnNpZW50QXNwZWN0TmFtZXMuYWRkKERJUlRZX0JSQU5DSF9QUk9QRVJUWSk7Ci0JCXRyYW5zaWVudEFzcGVjdE5hbWVzLmFkZChCUkFOQ0hfUFJPQkxFTVNfTElTVCk7Ci0JCXRyYW5zaWVudEFzcGVjdE5hbWVzLmFkZChIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZKTsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkVHJhbnNpZW50QXNwZWN0TmFtZXNUbyh0cmFuc2llbnRBc3BlY3ROYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaXJ0eSBub2RlcyBpbiB0aGUgb2JqZWN0J3MgYnJhbmNoIG9mIHRoZSB0cmVlLAotCSAqIGluY2x1ZGluZyB0aGUgbm9kZSBpdHNlbGYgKGlmIGFwcHJvcHJpYXRlKS4KLQkgKiBPbmx5IHJlYWxseSB1c2VkIGZvciB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcuCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhdG9yPE5vZGU+IGFsbERpcnR5Tm9kZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8Tm9kZSwgTm9kZT4odGhpcy5hbGxOb2RlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChOb2RlIG5vZGUpIHsKLQkJCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE5vZGUpICYmICgoQWJzdHJhY3ROb2RlKSBub2RlKS5pc0RpcnR5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb2JsZW1zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbm9kZSdzIHByb2JsZW1zLgotCSAqIFRoaXMgZG9lcyBOT1QgaW5jbHVkZSB0aGUgcHJvYmxlbXMgb2YgdGhlIG5vZGUncyBkZXNjZW5kYW50cy4KLQkgKiBAc2VlICNicmFuY2hQcm9ibGVtcygpCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhdG9yPFByb2JsZW0+IHByb2JsZW1zKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8UHJvYmxlbT4odGhpcy5wcm9ibGVtcyk7CS8vIHJlbW92ZXMgYXJlIG5vdCBhbGxvd2VkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub2RlJ3MgcHJvYmxlbXMuCi0JICogVGhpcyBkb2VzIE5PVCBpbmNsdWRlIHRoZSBwcm9ibGVtcyBvZiB0aGUgbm9kZSdzIGRlc2NlbmRhbnRzLgotCSAqIEBzZWUgI2JyYW5jaFByb2JsZW1zU2l6ZSgpCi0JICovCi0JcHVibGljIGZpbmFsIGludCBwcm9ibGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnByb2JsZW1zLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbm9kZSBoYXMgcHJvYmxlbXMKLQkgKiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgdGhlIHByb2JsZW1zIG9mIHRoZSBub2RlJ3MgZGVzY2VuZGFudHMuCi0JICogQHNlZSAjaGFzQnJhbmNoUHJvYmxlbXMoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1Byb2JsZW1zKCkgewotCQlyZXR1cm4gISB0aGlzLnByb2JsZW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBub2RlJ3MgcHJvYmxlbXMgYWxvbmcgd2l0aCBhbGwgdGhlCi0JICogbm9kZSdzIGRlc2NlbmRhbnRzJyBwcm9ibGVtcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdEl0ZXJhdG9yPFByb2JsZW0+IGJyYW5jaFByb2JsZW1zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFByb2JsZW0+KHRoaXMuYnJhbmNoUHJvYmxlbXMpOwkvLyByZW1vdmVzIGFyZSBub3QgYWxsb3dlZAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiBhbGwgdGhlIG5vZGUncyBwcm9ibGVtcyBhbG9uZyB3aXRoIGFsbCB0aGUKLQkgKiBub2RlJ3MgZGVzY2VuZGFudHMnIHByb2JsZW1zLgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgYnJhbmNoUHJvYmxlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5icmFuY2hQcm9ibGVtcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cyBoYXZlIHByb2JsZW1zLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0JyYW5jaFByb2JsZW1zKCkgewotCQlyZXR1cm4gISB0aGlzLmJyYW5jaFByb2JsZW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc0JyYW5jaFByb2JsZW0oUHJvYmxlbSBwcm9ibGVtKSB7Ci0JCXJldHVybiB0aGlzLmJyYW5jaFByb2JsZW1zLmNvbnRhaW5zKHByb2JsZW0pOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBQcm9ibGVtIGJ1aWxkUHJvYmxlbShTdHJpbmcgbWVzc2FnZUtleSwgT2JqZWN0Li4uIG1lc3NhZ2VBcmd1bWVudHMpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0UHJvYmxlbSh0aGlzLCBtZXNzYWdlS2V5LCBtZXNzYWdlQXJndW1lbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUHJvYmxlbSBidWlsZFByb2JsZW0oU3RyaW5nIG1lc3NhZ2VLZXkpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQcm9ibGVtKG1lc3NhZ2VLZXksIEVNUFRZX1BST0JMRU1fTUVTU0FHRV9BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBub2RlIGFuZCBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLAotCSAqIGFuZCB1cGRhdGUgdGhlaXIgc2V0cyBvZiAiYnJhbmNoIiBwcm9ibGVtcy4KLQkgKiBJZiB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwKLQkgKiBub3RpZnkgdGhlIG5vZGUncyBwYXJlbnQuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVCcmFuY2goKSB7Ci0JCWlmICh0aGlzLnZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKSkgewotCQkJLy8gaWYgb3VyICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwgdGhlbgotCQkJLy8gb3VyIHBhcmVudCBtdXN0IHJlYnVpbGQgaXRzICJicmFuY2giIHByb2JsZW1zIGFsc28KLQkJCXRoaXMucmVidWlsZFBhcmVudEJyYW5jaFByb2JsZW1zKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWJ1aWxkUGFyZW50QnJhbmNoUHJvYmxlbXMoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudC5yZWJ1aWxkQnJhbmNoUHJvYmxlbXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogVmFsaWRhdGUgdGhlIG5vZGUgYW5kIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMsCi0JICogYW5kIHVwZGF0ZSB0aGVpciBzZXRzIG9mICJicmFuY2giIHByb2JsZW1zLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIG9mICJicmFuY2giIHByb2JsZW1zIGhhcyBjaGFuZ2VkLgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCcmFuY2hJbnRlcm5hbCgpIHsKLQkJLy8gcmVidWlsZCAiYnJhbmNoIiBwcm9ibGVtcyBpbiBjaGlsZHJlbiBmaXJzdAotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJLy8gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gcmVidWlsZCBvdXIgImJyYW5jaCIKLQkJCS8vIHByb2JsZW1zIG5vIG1hdHRlciB3aGF0LCB0byBzZWUgaWYgdGhleSBoYXZlIGNoYW5nZWQKLQkJCWNoaWxkLnZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKTsKLQkJfQotCi0JCXRoaXMucHJvYmxlbXMuY2xlYXIoKTsKLQkJdGhpcy5hZGRQcm9ibGVtc1RvKHRoaXMucHJvYmxlbXMpOwotCi0JCXJldHVybiB0aGlzLmNoZWNrQnJhbmNoUHJvYmxlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmb3IgYW55IHByb2JsZW1zIGFuZCBhZGQgdGhlbSB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIE9OTFkgYWRkIHByb2JsZW1zIGZvciB0aGlzIHBhcnRpY3VsYXIgbm9kZTsKLQkgKiBpdCBzaG91bGQgTk9UIGFkZCBwcm9ibGVtcyBmb3IgYW55IG9mIHRoaXMgbm9kZSdzIGRlc2NlbmRhbnRzCi0JICogb3IgYW5jZXN0b3JzLiAoQWx0aG91Z2ggdGhlcmUgd2lsbCBiZSB0aW1lcyB3aGVuIGl0IGlzIGRlYmF0YWJsZQotCSAqIGFzIHRvIHdoaWNoIG5vZGUgYSBwcm9ibGVtICJiZWxvbmdzIiB0by4uLi4pCi0JICogCi0JICogTkI6IFRoaXMgbWV0aG9kIHNob3VsZCBOT1QgbW9kaWZ5IEFOWSBwYXJ0IG9mIHRoZSBub2RlJ3Mgc3RhdGUhCi0JICogSXQgaXMgYSBSRUFELU9OTFkgYmVoYXZpb3IuIE9OTFkgdGhlIGxpc3Qgb2YgY3VycmVudCBwcm9ibGVtcwotCSAqIHBhc3NlZCBpbiB0byB0aGUgbWV0aG9kIHNob3VsZCBiZSBtb2RpZmllZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCS8vIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCi0JCS8vIFdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5hZGRQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmVidWlsZCB0aGUgImJyYW5jaCIgcHJvYmxlbXMgYW5kIHJldHVybiB3aGV0aGVyIHRoZXkgaGF2ZQotCSAqIGNoYW5nZWQuCi0JICogTkI6IFRoZSBlbnRpcmUgY29sbGVjdGlvbiBvZiAiYnJhbmNoIiBwcm9ibGVtcyBtdXN0IGJlIHJlLWNhbGN1bGF0ZWQKLQkgKiB3aXRoIEVWRVJZICJzaWduaWZpY2FudCIgY2hhbmdlIC0gd2UgY2Fubm90IGtlZXAgaXQgaW4gc3luY2ggdmlhCi0JICogY2hhbmdlIG5vdGlmaWNhdGlvbnMgYmVjYXVzZSBpZiBhIGRlc2NlbmRhbnQgd2l0aCBwcm9ibGVtcyBpcwotCSAqIHJlbW92ZWQgb3IgcmVwbGFjZWQgd2Ugd2lsbCBub3QgcmVjZWl2ZSBub3RpZmljYXRpb24gdGhhdCBpdHMKLQkgKiBwcm9ibGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSBvdXIgImJyYW5jaCIgcHJvYmxlbXMuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrQnJhbmNoUHJvYmxlbXMoKSB7Ci0JCVZlY3RvcjxQcm9ibGVtPiBvbGRCcmFuY2hQcm9ibGVtcyA9IG5ldyBWZWN0b3I8UHJvYmxlbT4odGhpcy5icmFuY2hQcm9ibGVtcyk7Ci0JCWludCBvbGRTaXplID0gdGhpcy5icmFuY2hQcm9ibGVtcy5zaXplKCk7Ci0KLQkJdGhpcy5icmFuY2hQcm9ibGVtcy5jbGVhcigpOwotCQl0aGlzLmJyYW5jaFByb2JsZW1zLmFkZEFsbCh0aGlzLnByb2JsZW1zKTsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLmFkZEJyYW5jaFByb2JsZW1zVG8odGhpcy5icmFuY2hQcm9ibGVtcyk7Ci0JCX0KLQotCQkvLyBpZiB0aGUgc2l6ZSBoYXMgY2hhbmdlZCB0byBvciBmcm9tIHplcm8sIG91ciB2aXJ0dWFsIGZsYWcgaGFzIGNoYW5nZWQKLQkJaW50IG5ld1NpemUgPSB0aGlzLmJyYW5jaFByb2JsZW1zLnNpemUoKTsKLQkJaWYgKChvbGRTaXplID09IDApICYmIChuZXdTaXplICE9IDApKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSEFTX0JSQU5DSF9QUk9CTEVNU19QUk9QRVJUWSwgZmFsc2UsIHRydWUpOwotCQl9IGVsc2UgaWYgKChvbGRTaXplICE9IDApICYmIChuZXdTaXplID09IDApKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSEFTX0JSQU5DSF9QUk9CTEVNU19QUk9QRVJUWSwgdHJ1ZSwgZmFsc2UpOwotCQl9Ci0KLQkJaWYgKG9sZEJyYW5jaFByb2JsZW1zLmVxdWFscyh0aGlzLmJyYW5jaFByb2JsZW1zKSkgewotCQkJcmV0dXJuIGZhbHNlOwkJLy8gb3VyICJicmFuY2giIHByb2JsZW1zIGRpZCBub3QgY2hhbmdlCi0JCX0KLQkJLy8gb3VyICJicmFuY2giIHByb2JsZW1zIGNoYW5nZWQKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoQlJBTkNIX1BST0JMRU1TX0xJU1QpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEFkZCBhbGwgdGhlIHByb2JsZW1zIG9mIHRoZSBub2RlIGFuZCBhbGwKLQkgKiB0aGUgcHJvYmxlbXMgb2YgaXRzIGRlc2NlbmRhbnRzIHRvIHRoZQotCSAqIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJyYW5jaFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBsaXN0KSB7Ci0JCWxpc3QuYWRkQWxsKHRoaXMuYnJhbmNoUHJvYmxlbXMpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQSBjaGlsZCBub2RlJ3MgImJyYW5jaCIgcHJvYmxlbXMgY2hhbmdlZDsKLQkgKiB0aGVyZWZvcmUgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBoYXZlIGNoYW5nZWQgYWxzbyBhbmQKLQkgKiBtdXN0IGJlIHJlYnVpbHQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVidWlsZEJyYW5jaFByb2JsZW1zKCkgewotCQlpZiAoICEgdGhpcy5jaGVja0JyYW5jaFByb2JsZW1zKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIndlIHNob3VsZCBub3QgZ2V0IGhlcmUgdW5sZXNzIG91ciBcImJyYW5jaFwiIHByb2JsZW1zIGhhdmUgY2hhbmdlZCIpOwotCQl9Ci0JCXRoaXMucmVidWlsZFBhcmVudEJyYW5jaFByb2JsZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBJZiB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwKLQkgKiBub3RpZnkgdGhlIG5vZGUncyBwYXJlbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY2xlYXJBbGxCcmFuY2hQcm9ibGVtcygpIHsKLQkJaWYgKHRoaXMuY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCkpIHsKLQkJCS8vIGlmIG91ciAiYnJhbmNoIiBwcm9ibGVtcyBoYXZlIGNoYW5nZWQsIHRoZW4KLQkJCS8vIG91ciBwYXJlbnQgbXVzdCByZWJ1aWxkIGl0cyAiYnJhbmNoIiBwcm9ibGVtcyBhbHNvCi0JCQl0aGlzLnJlYnVpbGRQYXJlbnRCcmFuY2hQcm9ibGVtcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBDbGVhciB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGFuZCB0aGUgImJyYW5jaCIKLQkgKiBwcm9ibGVtcyBvZiBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIG9mICJicmFuY2giIHByb2JsZW1zIGhhcyBjaGFuZ2VkLgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCkgewotCQlpZiAodGhpcy5icmFuY2hQcm9ibGVtcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJLy8gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gY2xlYXIgb3VyICJicmFuY2giCi0JCQkvLyBwcm9ibGVtcyBubyBtYXR0ZXIgd2hhdAotCQkJY2hpbGQuY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCk7Ci0JCX0KLQkJdGhpcy5wcm9ibGVtcy5jbGVhcigpOwotCQl0aGlzLmJyYW5jaFByb2JsZW1zLmNsZWFyKCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZLCB0cnVlLCBmYWxzZSk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEJSQU5DSF9QUk9CTEVNU19MSVNUKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSBjaGFuZ2UgdG8gc3BlY2lmaWVkIGFzcGVjdCByZXF1aXJlcyBhIHJlLXZhbGlkYXRpb24KLQkgKiBvZiB0aGUgbm9kZSdzIHRyZWUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFzcGVjdENoYW5nZVJlcXVpcmVzVmFsaWRhdGlvbihTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmFzcGVjdENoYW5nZURvZXNOb3RSZXF1aXJlVmFsaWRhdGlvbihhc3BlY3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNwZWN0Q2hhbmdlRG9lc05vdFJlcXVpcmVWYWxpZGF0aW9uKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLm5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIHRoZSBvYmplY3QncyAibm9uLXZhbGlkYXRlZCIgYXNwZWN0IG5hbWVzLgotCSAqIFRoZXNlIGFyZSB0aGUgYXNwZWN0cyB0aGF0LCB3aGVuIHRoZXkgY2hhbmdlLCB3aWxsIE5PVCBjYXVzZSB0aGUKLQkgKiBvYmplY3QgKG9yIGl0cyBjb250YWluaW5nIHRyZWUpIHRvIGJlIHZhbGlkYXRlZCwgaS5lLiBjaGVja2VkIGZvciBwcm9ibGVtcy4KLQkgKiBJZiB5b3UgbmVlZCBpbnN0YW5jZS1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyICJub24tdmFsaWRhdGVkIiBhc3BlY3RzLAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBpcyBzdWZmaWNpZW50LAotCSAqIG92ZXJyaWRlICNhZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKFNldCkuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNldDxTdHJpbmc+IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKG5vblZhbGlkYXRlZEFzcGVjdE5hbWVTZXRzKSB7Ci0JCQlIYXNoU2V0PFN0cmluZz4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMgPSBub25WYWxpZGF0ZWRBc3BlY3ROYW1lU2V0cy5nZXQodGhpcy5nZXRDbGFzcygpKTsKLQkJCWlmIChub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyA9PSBudWxsKSB7Ci0JCQkJbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQkJdGhpcy5hZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKTsKLQkJCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lU2V0cy5wdXQodGhpcy5nZXRDbGFzcygpLCBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG9iamVjdCdzICJub24tdmFsaWRhdGVkIiBhc3BlY3QgbmFtZXMgdG8gdGhlIHNwZWNpZmllZCBzZXQuCi0JICogVGhlc2UgYXJlIHRoZSBhc3BlY3RzIHRoYXQsIHdoZW4gdGhleSBjaGFuZ2UsIHdpbGwgTk9UIGNhdXNlIHRoZQotCSAqIG9iamVjdCAob3IgaXRzIGNvbnRhaW5pbmcgdHJlZSkgdG8gYmUgdmFsaWRhdGVkLCBpLmUuIGNoZWNrZWQgZm9yIHByb2JsZW1zLgotCSAqIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgIm5vbi12YWxpZGF0ZWQiIGFzcGVjdHMgaXMgc3VmZmljaWVudCwKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4gSWYgeW91IG5lZWQgaW5zdGFuY2UtYmFzZWQgY2FsY3VsYXRpb24sCi0JICogb3ZlcnJpZGUgI25vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9uVmFsaWRhdGVkQXNwZWN0TmFtZXNUbyhTZXQ8U3RyaW5nPiBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcykgewotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoQ09NTUVOVF9QUk9QRVJUWSk7Ci0JCW5vblZhbGlkYXRlZEFzcGVjdE5hbWVzLmFkZChESVJUWV9CUkFOQ0hfUFJPUEVSVFkpOwotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoQlJBTkNIX1BST0JMRU1TX0xJU1QpOwotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoSEFTX0JSQU5DSF9QUk9CTEVNU19QUk9QRVJUWSk7Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLmFkZE5vblZhbGlkYXRlZEFzcGVjdE5hbWVzVG8obm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwbGF5IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29tcGFyZSBkaXNwbGF5IHN0cmluZ3MuCi0JICovCi0JcHVibGljIGludCBjb21wYXJlVG8oTm9kZSBub2RlKSB7Ci0JCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLCBub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBkZXZlbG9wZXItZnJpZW5kbHkgU3RyaW5nLiBJZiB5b3Ugd2FudCBzb21ldGhpbmcgdXNlZnVsIGZvcgotCSAqIGRpc3BsYXlpbmcgaW4gYSB1c2VyIGludGVyZmFjZSwgdXNlICNkaXNwbGF5U3RyaW5nKCkuCi0JICogSWYgeW91IHdhbnQgdG8gZ2l2ZSBtb3JlIGluZm9ybWF0aW9uIGluIHlvdXIgI3RvU3RyaW5nKCksCi0JICogb3ZlcnJpZGUgI3RvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpLiAKLQkgKiBXaGF0ZXZlciB5b3UgYWRkIHRvIHRoYXQgc3RyaW5nIGJ1ZmZlciB3aWxsIHNob3cgdXAgYmV0d2VlbiB0aGUgcGFyZW50aGVzZXMuCi0JICogQHNlZSBBYnN0cmFjdE1vZGVsI3RvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpCi0JICogQHNlZSAjZGlzcGxheVN0cmluZygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Bc3luY2hyb25vdXNWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0FzeW5jaHJvbm91c1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDIwNTljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0FzeW5jaHJvbm91c1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUgaW50ZXJmYWNlCi0gKiBzaW1wbHkgc2V0cyBhIHNoYXJlZCAidmFsaWRhdGUiIGZsYWcgdG8gdHJ1ZS4gVGhpcyBzaG91bGQgdHJpZ2dlciBhCi0gKiBzZXBhcmF0ZSAidmFsaWRhdGlvbiIgdGhyZWFkIHRvIGJlZ2luIHZhbGlkYXRpbmcgdGhlIGFwcHJvcHJpYXRlCi0gKiBicmFuY2ggb2Ygbm9kZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3luY2hyb25vdXNWYWxpZGF0b3IKLQlpbXBsZW1lbnRzIFBsdWdnYWJsZVZhbGlkYXRvci5EZWxlZ2F0ZQotewotCXByaXZhdGUgU3luY2hyb25pemVkQm9vbGVhbiB2YWxpZGF0ZUZsYWc7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB2YWxpZGF0b3IgZGVsZWdhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIHNoYXJlZAotCSAqICJ2YWxpZGF0ZSIgZmxhZy4gVGhpcyBmbGFnIHNob3VsZCBiZSBzaGFyZWQgd2l0aAotCSAqIGFub3RoZXIgdGhyZWFkIHRoYXQgd2lsbCBwZXJmb3JtIHRoZSBhY3R1YWwgdmFsaWRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzVmFsaWRhdG9yKFN5bmNocm9uaXplZEJvb2xlYW4gdmFsaWRhdGVGbGFnKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsaWRhdGVGbGFnID0gdmFsaWRhdGVGbGFnOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc2hhcmVkICJ2YWxpZGF0ZSIgZmxhZyB0byB0cnVlLCB0cmlnZ2VyaW5nCi0JICogYW4gYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gb2YgdGhlIGFwcHJvcHJpYXRlCi0JICogYnJhbmNoIG9mIG5vZGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotCQl0aGlzLnZhbGlkYXRlRmxhZy5zZXRUcnVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy52YWxpZGF0ZUZsYWcpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvRGVmYXVsdFByb2JsZW0uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0RlZmF1bHRQcm9ibGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZjU3NDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvRGVmYXVsdFByb2JsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBQcm9ibGVtIGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRQcm9ibGVtCi0JaW1wbGVtZW50cyBQcm9ibGVtCi17Ci0JcHJpdmF0ZSBmaW5hbCBOb2RlIHNvdXJjZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlS2V5OwotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50czsKLQotCi0JRGVmYXVsdFByb2JsZW0oTm9kZSBzb3VyY2UsIFN0cmluZyBtZXNzYWdlS2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc291cmNlID0gc291cmNlOwotCQl0aGlzLm1lc3NhZ2VLZXkgPSBtZXNzYWdlS2V5OwotCQl0aGlzLm1lc3NhZ2VBcmd1bWVudHMgPSBtZXNzYWdlQXJndW1lbnRzOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9ibGVtIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBOb2RlIHNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuc291cmNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgbWVzc2FnZUtleSgpIHsKLQkJcmV0dXJuIHRoaXMubWVzc2FnZUtleTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMubWVzc2FnZUFyZ3VtZW50czsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXZSBpbXBsZW1lbnQgI2VxdWFscyhPYmplY3QpIGJlY2F1c2UgcHJvYmxlbXMgYXJlIHJlcGVhdGVkbHkKLQkgKiByZS1jYWxjdWxhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHByb2JsZW1zIG1lcmdlZCB3aXRoIHRoZSBleGlzdGluZwotCSAqIHNldCBvZiBwcm9ibGVtczsgYW5kIHdlIHdhbnQgdG8ga2VlcCB0aGUgb3JpZ2luYWwgcHJvYmxlbXMgYW5kCi0JICogaWdub3JlIGFueSBmcmVzaGx5LWdlbmVyYXRlZCBkdXBsaWNhdGVzLgotCSAqIEFsc28sIHByb2JsZW1zIGFyZSBub3Qgc2F2ZWQgdG8gZGlzay4uLi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgUHJvYmxlbSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlQcm9ibGVtIG90aGVyID0gKFByb2JsZW0pIG87Ci0JCXJldHVybiB0aGlzLnNvdXJjZSA9PSBvdGhlci5zb3VyY2UoKQotCQkJCSYmIHRoaXMubWVzc2FnZUtleS5lcXVhbHMob3RoZXIubWVzc2FnZUtleSgpKQotCQkJCSYmIEFycmF5cy5lcXVhbHModGhpcy5tZXNzYWdlQXJndW1lbnRzLCBvdGhlci5tZXNzYWdlQXJndW1lbnRzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLnNvdXJjZS5oYXNoQ29kZSgpIF4gdGhpcy5tZXNzYWdlS2V5Lmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5tZXNzYWdlS2V5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL05vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzNjg4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIG1ldGhvZHMgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkCi0gKiBieSBhbnkgY2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSB0byBiZSBwYXJ0IG9mIGEgY29udGFpbm1lbnQgaGllcmFyY2h5Ci0gKiB0aGF0IHN1cHBvcnRzIGEgImRpcnR5IiBzdGF0ZSBhbmQgdmFsaWRhdGlvbiAicHJvYmxlbXMiLgotICogCi0gKiBOb3RlOiBNZXRob2RzIG1hcmtlZCAiSU5UUkEtVFJFRSBBUEkiIGFyZSB0eXBpY2FsbHkgb25seSB1c2VkIGJ5Ci0gKiB0aGUgbm9kZXMgdGhlbXNlbHZlcywgYXMgb3Bwb3NlZCB0byBjbGllbnRzIG9mIHRoZSBub2Rlcy4gVGhlc2UKLSAqIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBhIG5vZGUgb24gZWl0aGVyIGl0cyBwYXJlbnQgb3IgaXRzIGNoaWxkcmVuLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGUgZXh0ZW5kcyBNb2RlbCwgQ29tcGFyYWJsZTxOb2RlPiB7Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGRyZW4pICoqKioqKioqKioKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBpbiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5LgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcGFyZW50LiBUaGUgcGFyZW50IGlzIGltbXV0YWJsZS4KLQkgKiBAc2VlICNjaGlsZHJlbigpCi0JICovCi0JTm9kZSBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIGNoaWxkcmVuLCB3aGljaCBhcmUgYWxzbyBub2Rlcy4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqLwotCUl0ZXJhdG9yPE5vZGU+IGNoaWxkcmVuKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQST8KLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5tZW50IGhpZXJhcmNoeSdzIHJvb3Qgbm9kZS4KLQkgKiBNb3N0IG5vZGVzIG11c3QgaGF2ZSBhIHJvb3QuCi0JICogQHNlZSAjZ2V0UGFyZW50KCkKLQkgKi8KLQlOb2RlIHJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogQnkgZGVmaW5pdGlvbiwgYSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiBpdHNlbGYuCi0JICovCi0JYm9vbGVhbiBpc0Rlc2NlbmRhbnRPZihOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwgdGhlIG5vZGUncyBkZXNjZW5kYW50cycKLQkgKiAicmVmZXJlbmNlcyIsIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gIlJlZmVyZW5jZXMiIGFyZQotCSAqIG9iamVjdHMgdGhhdCBhcmUgInJlZmVyZW5jZWQiIGJ5IGFub3RoZXIgb2JqZWN0LCBhcyBvcHBvc2VkCi0JICogdG8gIm93bmVkIiBieSBhbm90aGVyIG9iamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvZiBwYXJ0aWN1bGFyIGNvbmNlcm4gdG8gSGFuZGxlcywgc2luY2UgbW9zdAotCSAqIChob3BlZnVsbHkgYWxsKSAicmVmZXJlbmNlcyIgYXJlIGhlbGQgYnkgSGFuZGxlcy4KLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQl2b2lkIGFkZEJyYW5jaFJlZmVyZW5jZXNUbyhDb2xsZWN0aW9uPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIEFkZCBhbGwgdGhlIG5vZGVzIGluIHRoZSBvYmplY3QncyBicmFuY2ggb2YgdGhlIHRyZWUsCi0JICogaW5jbHVkaW5nIHRoZSBub2RlIGl0c2VsZiwgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIE9ubHkgcmVhbGx5IHVzZWQgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZy4KLQkgKi8KLQl2b2lkIGFkZEFsbE5vZGVzVG8oQ29sbGVjdGlvbjxOb2RlPiBub2Rlcyk7Ci0KLQotCS8vICoqKioqKioqKiogbW9kZWwgc3luY2hyb25pemF0aW9uIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBUaGlzIGlzIGEgZ2VuZXJhbCBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4KLQkgKiByZW1vdmVkIGZyb20gdGhlIHRyZWUuIFRoZSBub2RlIHJlY2VpdmluZyB0aGlzIG5vdGlmaWNhdGlvbgotCSAqIHNob3VsZCBwZXJmb3JtIGFueSBuZWNlc3NhcnkgdXBkYXRlcyB0byByZW1haW4gaW4gc3luY2gKLQkgKiB3aXRoIHRoZSB0cmVlIChlLmcuIGNsZWFyaW5nIG91dCBvciByZXBsYWNpbmcgYW55IHJlZmVyZW5jZXMKLQkgKiB0byB0aGUgcmVtb3ZlZCBub2RlIG9yIGFueSBvZiB0aGUgcmVtb3ZlZCBub2RlJ3MgZGVzY2VuZGFudHMpLgotCSAqIEBzZWUgI2lzRGVzY2VuZGFudE9mKE5vZGUpCi0JICovCi0Jdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBUaGlzIGlzIGEgZ2VuZXJhbCBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4KLQkgKiByZW5hbWVkLiBUaGUgbm9kZSByZWNlaXZpbmcgdGhpcyBub3RpZmljYXRpb24gc2hvdWxkIG1hcmsgaXRzCi0JICogYnJhbmNoIGRpcnR5IGlmIG5lY2Vzc2FyeSAoaS5lLiBpdCByZWZlcmVuY2VzIHRoZSByZW5hbWVkIG5vZGUKLQkgKiBvciBvbmUgb2YgaXRzIGRlc2NlbmRhbnRzKS4gVGhpcyBtZXRob2QgaXMgb2YgcGFydGljdWxhciBjb25jZXJuCi0JICogdG8gSGFuZGxlcy4KLQkgKiBAc2VlICNpc0Rlc2NlbmRhbnRPZihOb2RlKQotCSAqLwotCXZvaWQgbm9kZVJlbmFtZWQoTm9kZSBub2RlKTsKLQkKLQotCS8vICoqKioqKioqKiogZGlydHkgZmxhZyBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBwZXJzaXN0ZW50IGFzcGVjdHMgb2YgdGhlIG5vZGUsCi0JICogb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cywgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBub2RlIGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlib29sZWFuIGlzRGlydHlCcmFuY2goKTsKLQkJU3RyaW5nIERJUlRZX0JSQU5DSF9QUk9QRVJUWSA9ICJkaXJ0eUJyYW5jaCI7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnQgYXMgZGlydHkgYnJhbmNoZXMuCi0JICogVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgZGlydHkuCi0JICovCi0Jdm9pZCBtYXJrQnJhbmNoRGlydHkoKTsKLQotCS8qKgotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgYXMgZGlydHkuCi0JICogVGhpcyBpcyB1c2VkIHdoZW4gdGhlIHNhdmUgbG9jYXRpb24gb2Ygc29tZQotCSAqIHRvcC1sZXZlbCBub2RlIGlzIGNoYW5nZWQgYW5kIHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlIG11c3QgYmUgbWFya2VkIGRpcnR5IHNvIGl0Ci0JICogd2lsbCBiZSB3cml0dGVuIG91dC4KLQkgKi8KLQl2b2lkIG1hcmtFbnRpcmVCcmFuY2hEaXJ0eSgpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBIGNoaWxkIG5vZGUncyBicmFuY2ggaGFzIGJlZW4gbWFya2VkIGNsZWFuLiBJZiB0aGUgbm9kZQotCSAqIGl0c2VsZiBpcyBjbGVhbiBhbmQgaWYgYWxsIG9mIGl0cyBjaGlsZHJlbiBhcmUgYWxzbyBjbGVhbiwgdGhlCi0JICogbm9kZSdzIGJyYW5jaCBjYW4gYmUgbWFya2VkIGNsZWFuLiBUaGVuLCBpZiB0aGUgbm9kZSdzCi0JICogYnJhbmNoIGlzIGNsZWFuLCB0aGUgbm9kZSB3aWxsIG5vdGlmeSBpdHMgcGFyZW50IHRoYXQgaXQgbWlnaHQKLQkgKiBiZSBjbGVhbiBhbHNvLiBUaGlzIG1lc3NhZ2UgaXMgcHJvcGFnYXRlZCB1cCB0aGUgY29udGFpbm1lbnQKLQkgKiB0cmVlIHdoZW4gYSBwYXJ0aWN1bGFyIG5vZGUgYmVjb21lcyBjbGVhbi4KLQkgKi8KLQl2b2lkIG1hcmtCcmFuY2hDbGVhbklmUG9zc2libGUoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogTWFyayB0aGUgbm9kZSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBhcyBjbGVhbi4KLQkgKiBUeXBpY2FsbHkgdXNlZCB3aGVuIHRoZSBub2RlIGhhcyBqdXN0IGJlZW4KLQkgKiByZWFkIGluIG9yIHdyaXR0ZW4gb3V0LgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICogTm90IHRoZSBiZXN0IG9mIG1ldGhvZCBuYW1lcy4uLi4gOi0oCi0JICovCi0Jdm9pZCBjYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0KLQotCS8vICoqKioqKioqKiogcHJvYmxlbXMgKioqKioqKioqKgotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBSZXR1cm4gYSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbmV2ZXIgYQotCSAqICJ2YWxpZGF0ZWQiIGFzcGVjdCBvZiB0aGUgbm9kZSB0cmVlIGNoYW5nZXMuCi0JICogVHlwaWNhbGx5IG9ubHkgdGhlIHJvb3Qgbm9kZSBkaXJlY3RseSBob2xkcyBhIHZhbGlkYXRvci4KLQkgKi8KLQlWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXQgYSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbmV2ZXIgYQotCSAqICJ2YWxpZGF0ZWQiIGFzcGVjdCBvZiB0aGUgbm9kZSB0cmVlIGNoYW5nZXMuCi0JICogVHlwaWNhbGx5IG9ubHkgdGhlIHJvb3Qgbm9kZSBkaXJlY3RseSBob2xkcyBhIHZhbGlkYXRvci4KLQkgKi8KLQl2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKTsKLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBub2RlIGFuZCBpdHMgZGVzY2VuZGFudHMuCi0JICogVGhpcyBpcyBhbiBleHBsaWNpdCByZXF1ZXN0IGludm9rZWQgYnkgYSBjbGllbnQ7IGFuZCBpdCB3aWxsCi0JICogdHlwaWNhbGx5IGJlIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotCSAqIAkjYnJhbmNoUHJvYmxlbXMoKQotCSAqIAkjaGFzQnJhbmNoUHJvYmxlbXMoKQotCSAqIFdoZXRoZXIgdGhlIG5vZGUgbWFpbnRhaW5zIGl0cyBwcm9ibGVtcyBvbiB0aGUgZmx5Ci0JICogb3Igd2FpdHMgdW50aWwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGlzIGRldGVybWluZWQgYnkgdGhlCi0JICogaW1wbGVtZW50YXRpb24uCi0JICogQHNlZSBQcm9ibGVtCi0JICovCi0Jdm9pZCB2YWxpZGF0ZUJyYW5jaCgpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBWYWxpZGF0ZSB0aGUgbm9kZSBhbmQgYWxsIG9mIGl0cyBkZXNjZW5kYW50cywKLQkgKiBhbmQgdXBkYXRlIHRoZWlyIHNldHMgb2YgImJyYW5jaCIgcHJvYmxlbXMuCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGNvbGxlY3Rpb24gb2YgImJyYW5jaCIgcHJvYmxlbXMgaGFzIGNoYW5nZWQuCi0JICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OyBpdCBpcyBub3QgZm9yCi0JICogY2xpZW50IHVzZS4KLQkgKi8KLQlib29sZWFuIHZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKTsKLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIG5vZGUncyBwcm9ibGVtcyBhbG9uZyB3aXRoIGFsbCB0aGUKLQkgKiBub2RlJ3MgZGVzY2VuZGFudHMnIHByb2JsZW1zLgotCSAqLwotCUxpc3RJdGVyYXRvcjxQcm9ibGVtPiBicmFuY2hQcm9ibGVtcygpOwotCQlTdHJpbmcgQlJBTkNIX1BST0JMRU1TX0xJU1QgPSAiYnJhbmNoUHJvYmxlbXMiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIGFsbCB0aGUgbm9kZSdzIHByb2JsZW1zIGFsb25nIHdpdGggYWxsIHRoZQotCSAqIG5vZGUncyBkZXNjZW5kYW50cycgcHJvYmxlbXMuCi0JICovCi0JaW50IGJyYW5jaFByb2JsZW1zU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cyBoYXZlIHByb2JsZW1zLgotCSAqLwotCWJvb2xlYW4gaGFzQnJhbmNoUHJvYmxlbXMoKTsKLQkJU3RyaW5nIEhBU19CUkFOQ0hfUFJPQkxFTVNfUFJPUEVSVFkgPSAiaGFzQnJhbmNoUHJvYmxlbXMiOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBicmFuY2ggcHJvYmxlbS4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zQnJhbmNoUHJvYmxlbShQcm9ibGVtIHByb2JsZW0pOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBTb21ldGhpbmcgY2hhbmdlZCwgcmVidWlsZCB0aGUgbm9kZSdzIGNvbGxlY3Rpb24gb2YgYnJhbmNoIHByb2JsZW1zLgotCSAqLwotCXZvaWQgcmVidWlsZEJyYW5jaFByb2JsZW1zKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEFkZCB0aGUgbm9kZSdzIHByb2JsZW1zLCBhbmQgYWxsIHRoZSBub2RlJ3MgZGVzY2VuZGFudHMnCi0JICogcHJvYmxlbXMsIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBBIGNhbGwgdG8gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltbWVkaWF0ZWx5IHByZWNlZGVkIGJ5IGEgY2FsbCB0bwotCSAqICN2YWxpZGF0ZUJyYW5jaCgpIG9yIGFsbCBvZiB0aGUgcHJvYmxlbXMgbWlnaHQgbm90IGJlCi0JICogYWRkZWQgdG8gdGhlIGxpc3QuCi0JICogQHNlZSBQcm9ibGVtCi0JICovCi0Jdm9pZCBhZGRCcmFuY2hQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gYnJhbmNoUHJvYmxlbXMpOwotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKi8KLQl2b2lkIGNsZWFyQWxsQnJhbmNoUHJvYmxlbXMoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBvZiAiYnJhbmNoIiBwcm9ibGVtcyBoYXMgY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqLwotCWJvb2xlYW4gY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29tbWVudCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVzZXIgY29tbWVudCBjb25jZXJuaW5nIHRoZSBub2RlLgotCSAqLwotCVN0cmluZyBjb21tZW50KCk7Ci0JCVN0cmluZyBDT01NRU5UX1BST1BFUlRZID0gImNvbW1lbnQiOwotCi0JLyoqCi0JICogU2V0IHRoZSB1c2VyIGNvbW1lbnQgY29uY2VybmluZyB0aGUgbm9kZS4KLQkgKi8KLQl2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpOwotCi0KLQkvLyAqKioqKioqKioqIGRpc3BsYXlpbmcvc29ydGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsLCBzdWl0YWJsZSBmb3Igc29ydGluZy4KLQkgKi8KLQlTdHJpbmcgZGlzcGxheVN0cmluZygpOwotCi0KLQkvLyAqKioqKioqKioqIHN1Yi1pbnRlcmZhY2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFNpbXBsZSBpbnRlcmZhY2UgZGVmaW5pbmcgYSAicmVmZXJlbmNlIiBiZXR3ZWVuIHR3byBub2Rlcy4KLQkgKiBAc2VlIE5vZGUjYWRkQnJhbmNoUmVmZXJlbmNlc1RvKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCWludGVyZmFjZSBSZWZlcmVuY2UgewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlICJzb3VyY2UiIG5vZGUgb2YgdGhlIHJlZmVyZW5jZSwgaS5lLiB0aGUgbm9kZSB0aGF0Ci0JCSAqIHJlZmVyZW5jZXMgdGhlICJ0YXJnZXQiIG5vZGUuCi0JCSAqLwotCQlOb2RlIHNvdXJjZSgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlICJ0YXJnZXQiIG5vZGUgb2YgdGhlIHJlZmVyZW5jZSwgaS5lLiB0aGUgbm9kZSB0aGF0Ci0JCSAqIGlzIHJlZmVyZW5jZWQgYnkgdGhlICJzb3VyY2UiIG5vZGUuCi0JCSAqLwotCQlOb2RlIHRhcmdldCgpOwotCi0JfQotCi0KLQkvKioKLQkgKiBBIHZhbGlkYXRvciB3aWxsIHZhbGlkYXRlIGEgbm9kZSBhcyBhcHByb3ByaWF0ZS4KLQkgKiBUeXBpY2FsbHkgdGhlIHZhbGlkYXRpb24gd2lsbAotCSAqIAktIG9jY3VyIHdoZW5ldmVyIGEgbm9kZSBoYXMgY2hhbmdlZAotCSAqIAktIGVuY29tcGFzcyB0aGUgZW50aXJlIHRyZWUgY29udGFpbmluZyB0aGUgbm9kZQotCSAqIAktIGV4ZWN1dGUgYXN5bmNocm9ub3VzbHkKLQkgKi8KLQlpbnRlcmZhY2UgVmFsaWRhdG9yIHsKLQotCQkvKioKLQkJICogQSAic2lnbmlmaWNhbnQiIGFzcGVjdCBoYXMgY2hhbmdlZDsKLQkJICogdmFsaWRhdGUgdGhlIG5vZGUgYXMgYXBwcm9wcmlhdGUKLQkJICovCi0JCXZvaWQgdmFsaWRhdGUoKTsKLQotCQkvKioKLQkJICogU3RvcCBhbGwgdmFsaWRhdGlvbiBvZiB0aGUgbm9kZSB1bnRpbCAjcmVzdW1lKCkgaXMgY2FsbGVkLgotCQkgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIGFueSBsb25nLXJ1bm5pbmcKLQkJICogYWN0aW9uIHRoYXQgdHJpZ2dlcnMgbnVtZXJvdXMgY2hhbmdlcyB0byB0aGUgbm9kZS4gQmUgc3VyZSB0bwotCQkgKiBtYXRjaCBhIGNhbGwgdG8gdGhpcyBtZXRob2Qgd2l0aCBhIGNvcnJlc3BvbmRpbmcgY2FsbCB0bwotCQkgKiAjcmVzdW1lKCkuCi0JCSAqLwotCQl2b2lkIHBhdXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFJlc3VtZSB2YWxpZGF0aW9uIG9mIHRoZSBub2RlLiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZQotCQkgKiBjYWxsZWQgYWZ0ZXIgYSBtYXRjaGluZyBjYWxsIHRvICNwYXVzZSgpLgotCQkgKi8KLQkJdm9pZCByZXN1bWUoKTsKLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBoZWxwZXIgaW1wbGVtZW50YXRpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmVmZXJlbmNlIGludGVyZmFjZQotCSAqIGRlZmluZWQgYWJvdmUuCi0JICovCi0JcHVibGljIGNsYXNzIFNpbXBsZVJlZmVyZW5jZSBpbXBsZW1lbnRzIFJlZmVyZW5jZSB7Ci0JCXByaXZhdGUgTm9kZSBzb3VyY2U7Ci0JCXByaXZhdGUgTm9kZSB0YXJnZXQ7Ci0JCXB1YmxpYyBTaW1wbGVSZWZlcmVuY2UoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0KSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IHRhcmdldCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotCQl9Ci0JCXB1YmxpYyBOb2RlIHNvdXJjZSgpIHsKLQkJCXJldHVybiB0aGlzLnNvdXJjZTsKLQkJfQotCQlwdWJsaWMgTm9kZSB0YXJnZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXJnZXQ7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnNvdXJjZSArICIgPT4gIiArIHRoaXMudGFyZ2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFR5cGljYWwgY29tcGFyYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHNvcnQgYSBjb2xsZWN0aW9uIG9mIG5vZGVzLgotCSAqIFNvcnQgYmFzZWQgb24gZGlzcGxheSBzdHJpbmc6Ci0JICogCS0gaWRlbnRpY2FsIG9iamVjdHMgYXJlIGVxdWFsICh3aGljaCBtZWFucyB0aGF0IGNhbm5vdAotCSAqIAkJY28tZXhpc3QgaW4gYSBTb3J0ZWRTZXQpCi0JICogCS0gdXNlIHRoZSBkZWZhdWx0IGNvbGxhdG9yICh3aGljaCB0eXBpY2FsbHkgaW50ZXJsZWF2ZXMKLQkgKiAJCWxvd2VyLSBhbmQgdXBwZXItY2FzZSBsZXR0ZXJzKQotCSAqIAktIGFsbG93IGR1cGxpY2F0ZSBkaXNwbGF5IHN0cmluZ3MgKGZyb20gZGlmZmVyZW50IG9iamVjdHMpCi0JICogCS0gdHJ5IHRvIHJldHVybiBjb25zaXN0ZW50IHJlc3VsdHMgZm9yIHNhbWUgb2JqZWN0IHBhaXJzCi0JICovCi0JQ29tcGFyYXRvcjxOb2RlPiBERUZBVUxUX0NPTVBBUkFUT1IgPQotCQluZXcgQ29tcGFyYXRvcjxOb2RlPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB7Ci0JCQkJLy8gZGlzYWxsb3cgZHVwbGljYXRlcyBiYXNlZCBvbiBvYmplY3QgaWRlbnRpdHkKLQkJCQlpZiAobm9kZTEgPT0gbm9kZTIpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCi0JCQkJLy8gZmlyc3QgY29tcGFyZSBkaXNwbGF5IHN0cmluZ3MgdXNpbmcgdGhlIGRlZmF1bHQgY29sbGF0b3IKLQkJCQlpbnQgcmVzdWx0ID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKG5vZGUxLmRpc3BsYXlTdHJpbmcoKSwgbm9kZTIuZGlzcGxheVN0cmluZygpKTsKLQkJCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0KLQkJCQkvLyB0aGVuIGNvbXBhcmUgdXNpbmcgb2JqZWN0LWlkCi0JCQkJcmVzdWx0ID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobm9kZTEpIC0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobm9kZTIpOwotCQkJCWlmIChyZXN1bHQgIT0gMCkgewotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQotCQkJCS8vIEl0J3MgdW5saWtlbHkgdGhhdCB3ZSBnZXQgdG8gdGhpcyBwb2ludDsgYnV0LCBqdXN0IGluIGNhc2UsIHdlIHdpbGwgcmV0dXJuIC0xLgotCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRoaXMgaW50cm9kdWNlcyBzb21lIG1pbGQgdW5wcmVkaWN0YWJpbGl0eSB0byB0aGUgc29ydCBvcmRlcgotCQkJCS8vICh1bmxlc3MgdGhlIG9iamVjdHMgYXJlIGFsd2F5cyBwYXNzZWQgaW50byB0aGlzIG1ldGhvZCBpbiB0aGUgc2FtZSBvcmRlcikuCi0JCQkJcmV0dXJuIC0xOwkJLy8gaWYgYWxsIGVsc2UgZmFpbHMsIGluZGljYXRlIHRoYXQgbzEgPCBvMgotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiTm9kZS5ERUZBVUxUX0NPTVBBUkFUT1IiOwotCQkJfQotCQl9OwotCi0KLQkvKioKLQkgKiBUaGlzIHZhbGlkYXRvciBkb2VzIG5vdGhpbmcgdG8gdmFsaWRhdGUgdGhlIG5vZGUuCi0JICovCi0JVmFsaWRhdG9yIE5VTExfVkFMSURBVE9SID0KLQkJbmV3IFBsdWdnYWJsZVZhbGlkYXRvcihQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUuTnVsbC5pbnN0YW5jZSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJOb2RlLk5VTExfVkFMSURBVE9SIjsKLQkJCX0KLQkJfTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvUGx1Z2dhYmxlVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9QbHVnZ2FibGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0ZjhhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9QbHVnZ2FibGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRCb29sZWFuOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFZhbGlkYXRvciBpbnRlcmZhY2UgaW1wbGVtZW50cyB0aGUKLSAqIHBhdXNlL3Jlc3VtZSBwb3J0aW9uIG9mIHRoZSBwcm90b2NvbCwgYnV0IGRlbGVnYXRlcyB0aGUgYWN0dWFsCi0gKiB2YWxpZGF0aW9uIHRvIGEgInBsdWdnYWJsZSIgZGVsZWdhdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnZ2FibGVWYWxpZGF0b3IKLQlpbXBsZW1lbnRzIE5vZGUuVmFsaWRhdG9yCi17Ci0JcHJpdmF0ZSBib29sZWFuIHBhdXNlOwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZU9uUmVzdW1lOwotCXByaXZhdGUgZmluYWwgRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIGZhY3RvcnkgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZS5WYWxpZGF0b3IgYnVpbGRBc3luY2hyb25vdXNWYWxpZGF0b3IoU3luY2hyb25pemVkQm9vbGVhbiB2YWxpZGF0ZUZsYWcpIHsKLQkJcmV0dXJuIG5ldyBQbHVnZ2FibGVWYWxpZGF0b3IobmV3IEFzeW5jaHJvbm91c1ZhbGlkYXRvcih2YWxpZGF0ZUZsYWcpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBmYWN0b3J5IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUuVmFsaWRhdG9yIGJ1aWxkU3luY2hyb25vdXNWYWxpZGF0b3IoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBuZXcgUGx1Z2dhYmxlVmFsaWRhdG9yKG5ldyBTeW5jaHJvbm91c1ZhbGlkYXRvcihub2RlKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdmFsaWRhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBkZWxlZ2F0ZS4KLQkgKi8KLQlwdWJsaWMgUGx1Z2dhYmxlVmFsaWRhdG9yKERlbGVnYXRlIGRlbGVnYXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGF1c2UgPSBmYWxzZTsKLQkJdGhpcy52YWxpZGF0ZU9uUmVzdW1lID0gZmFsc2U7Ci0JCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCWlmICh0aGlzLnBhdXNlKSB7Ci0JCQl0aGlzLnZhbGlkYXRlT25SZXN1bWUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJdGhpcy5kZWxlZ2F0ZS52YWxpZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHBhdXNlKCkgewotCQlpZiAodGhpcy5wYXVzZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWxyZWFkeSBwYXVzZWQiKTsKLQkJfQotCQl0aGlzLnBhdXNlID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzdW1lKCkgewotCQlpZiAoICEgdGhpcy5wYXVzZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IHBhdXNlZCIpOwotCQl9Ci0JCXRoaXMucGF1c2UgPSBmYWxzZTsKLQkJLy8gdmFsaWRhdGUgYW55IGNoYW5nZXMgdGhhdCBvY2N1cnJlZCB3aGlsZSB0aGUgdmFsaWRhdGlvbiB3YXMgcGF1c2VkCi0JCWlmICh0aGlzLnZhbGlkYXRlT25SZXN1bWUpIHsKLQkJCXRoaXMudmFsaWRhdGVPblJlc3VtZSA9IGZhbHNlOwotCQkJdGhpcy5kZWxlZ2F0ZS52YWxpZGF0ZSgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kZWxlZ2F0ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGFueSBkZWxlZ2F0ZXMgb2YgYSBwbHVnZ2FibGUgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgRGVsZWdhdGUgewotCi0JCS8qKgotCQkgKiBUaGUgdmFsaWRhdG9yIGlzIG5vdCAicGF1c2VkIiAtIHBlcmZvcm0gdGhlIGFwcHJvcHJpYXRlIHZhbGlkYXRpb24uCi0JCSAqLwotCQl2b2lkIHZhbGlkYXRlKCk7Ci0KLQotCQkvKioKLQkJICogVGhpcyBkZWxlZ2F0ZSBkb2VzIG5vdGhpbmcuCi0JCSAqLwotCQlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgRGVsZWdhdGUgewotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBEZWxlZ2F0ZSBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlwdWJsaWMgc3RhdGljIERlbGVnYXRlIGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgTnVsbCgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiUGx1Z2dhYmxlVmFsaWRhdG9yLkRlbGVnYXRlLk51bGwiOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1Byb2JsZW0uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1Byb2JsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4ZTczMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Qcm9ibGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0KLS8qKgotICogRGVmaW5lIGFuIGludGVyZmFjZSBkZXNjcmliaW5nIHRoZSBwcm9ibGVtcyBhc3NvY2lhdGVkIHdpdGggYSBub2RlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2JsZW0gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBub2RlIG1vc3QgY2xvc2VseSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2JsZW0uCi0JICovCi0JTm9kZSBzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGtleSB0aGF0IGNhbiBiZSB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBwcm9ibGVtJ3MgbWVzc2FnZS4KLQkgKi8KLQlTdHJpbmcgbWVzc2FnZUtleSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcmd1bWVudHMgYXNzb2NpYXRlIHdpdGggdGhlIHByb2JsZW0ncyBtZXNzYWdlLgotCSAqLwotCU9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcm9ibGVtIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIEl0IGlzIGVxdWFsIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0JICogUHJvYmxlbSBpbnRlcmZhY2UgYW5kIGl0cyBzb3VyY2UsIG1lc3NhZ2Uga2V5LCBhbmQgbWVzc2FnZQotCSAqIGFyZ3VtZW50cyBhcmUgYWxsIGVxdWFsIHRvIHRoaXMgcHJvYmxlbSdzLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvYmxlbSdzIGhhc2ggY29kZSwgd2hpY2ggc2hvdWxkIGNhbGN1bGF0ZWQgYXMgYW4KLQkgKiBYT1Igb2YgdGhlIHNvdXJjZSdzIGhhc2ggY29kZSBhbmQgdGhlIG1lc3NhZ2Uga2V5J3MgaGFzaCBjb2RlLgotCSAqLwotCWludCBoYXNoQ29kZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9SdW5uYWJsZVZhbGlkYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1J1bm5hYmxlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjM0MDEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1J1bm5hYmxlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRCb29sZWFuOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgUnVubmFibGUgd2lsbCBhc3luY2hyb25vdXNseSB2YWxpZGF0ZQotICogYSBicmFuY2ggb2Ygbm9kZXMuIEl0IHdpbGwgd2FpdCB1bnRpbCBhIHNoYXJlZCAidmFsaWRhdGUiIGZsYWcgaXMKLSAqIHNldCB0byB2YWxpZGF0ZSB0aGUgYnJhbmNoLiBPbmNlIHRoZSB0aGUgYnJhbmNoIGlzIHZhbGlkYXRlZCwKLSAqIHRoZSB0aHJlYWQgd2lsbCBxdWllc2NlIHVudGlsIHRoZSBmbGFnIGlzIHNldCBhZ2Fpbi4KLSAqIAotICogVGhlcmUgYXJlIHR3byB3YXlzIHRvIHN0b3AgdGhpcyB0aHJlYWQ6Ci0gKiAJLSBUaHJlYWQuaW50ZXJydXB0KCkKLSAqIAktIHNldCB0aGUgImNvbnRpbnVlIiBmbGFnIHRvIGZhbHNlCi0gKiBGb3Igbm93LCB0aGVzZSB0d28gYXJlIGVxdWl2YWxlbnQ7IGJ1dCBpbiB0aGUgZnV0dXJlIHdlIG1pZ2h0Ci0gKiBwYXNzIHRoZSAiY29udGludWUiIGZsYWcgdG8gdGhlIE5vZGUudmFsaWRhdGVCcmFuY2goKQotICogbWV0aG9kIHNvIHdlIGNhbiBzaG9ydC1jaXJjdWl0IHRoZSB2YWxpZGF0aW9uIGluc3RlYWQgb2Ygd2FpdGluZwotICogdW50aWwgdGhlIGVudGlyZSBicmFuY2ggaXMgdmFsaWRhdGVkLgotICovCi1wdWJsaWMgY2xhc3MgUnVubmFibGVWYWxpZGF0aW9uCi0JaW1wbGVtZW50cyBSdW5uYWJsZQotewotCS8qKiBUaGUgbm9kZSB3aG9zZSBicmFuY2ggdGhpcyB0aHJlYWQgd2lsbCB2YWxpZGF0ZS4gKi8KLQlwcml2YXRlIGZpbmFsIE5vZGUgbm9kZTsKLQotCS8qKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgdG8gdHJ1ZSwgd2Uga2ljayBvZmYgdGhlIHZhbGlkYXRpb24gcm91dGluZS4gKi8KLQlwcml2YXRlIGZpbmFsIFN5bmNocm9uaXplZEJvb2xlYW4gdmFsaWRhdGVGbGFnOwotCi0JLyoqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB0byBmYWxzZSwgd2UgYWxsb3cgdGhpcyB0aHJlYWQgdG8gZGllLiAqLwotCXByaXZhdGUgZmluYWwgU3luY2hyb25pemVkQm9vbGVhbiBjb250aW51ZUZsYWc7Ci0KLQkvKiogTG9nIGFueSBleGNlcHRpb25zIGVuY291bnRlcmVkIGR1cmluZyB2YWxpZGF0aW9uIHdpdGggdGhlIGZvbGxvd2luZyBzZXR0aW5ncy4gKi8KLQlwcml2YXRlIGZpbmFsIExvZ2dlciBleGNlcHRpb25Mb2dnZXI7Ci0JcHJpdmF0ZSBmaW5hbCBMZXZlbCBleGNlcHRpb25MZXZlbDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBleGNlcHRpb25NZXNzYWdlOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB2YWxpZGF0aW9uIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgUnVubmFibGVWYWxpZGF0aW9uKAotCQkJTm9kZSBub2RlLAotCQkJU3luY2hyb25pemVkQm9vbGVhbiB2YWxpZGF0ZUZsYWcsCi0JCQlTeW5jaHJvbml6ZWRCb29sZWFuIGNvbnRpbnVlRmxhZywKLQkJCUxvZ2dlciBleGNlcHRpb25Mb2dnZXIsCi0JCQlMZXZlbCBleGNlcHRpb25MZXZlbCwKLQkJCVN0cmluZyBleGNlcHRpb25NZXNzYWdlCi0JKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubm9kZSA9IG5vZGU7Ci0JCXRoaXMudmFsaWRhdGVGbGFnID0gdmFsaWRhdGVGbGFnOwotCQl0aGlzLmNvbnRpbnVlRmxhZyA9IGNvbnRpbnVlRmxhZzsKLQkJdGhpcy5leGNlcHRpb25Mb2dnZXIgPSBleGNlcHRpb25Mb2dnZXI7Ci0JCXRoaXMuZXhjZXB0aW9uTGV2ZWwgPSBleGNlcHRpb25MZXZlbDsKLQkJdGhpcy5leGNlcHRpb25NZXNzYWdlID0gZXhjZXB0aW9uTWVzc2FnZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUnVubmFibGUgSW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogTG9vcCB3aGlsZSB0aGUgImNvbnRpbnVlIiBmbGFnIGlzIHRydWUgYW5kIHRoZSB0aHJlYWQKLQkgKiBoYXMgbm90IGJlZW4gaW50ZXJydXB0ZWQgYnkgYW5vdGhlciB0aHJlYWQuCi0JICogSW4gZWFjaCBsb29wOiBXYWl0IHVudGlsIHRoZSAidmFsaWRhdGUiIGZsYWcgaXMgc2V0IHRvIHRydWUsCi0JICogdGhlbiBzZXQgaXQgYmFjayB0byBmYWxzZSBhbmQgdmFsaWRhdGUgdGhlIGJyYW5jaCBvZiBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXdoaWxlICh0aGlzLmNvbnRpbnVlRmxhZy5pc1RydWUoKSkgewotCQkJdHJ5IHsKLQkJCQl0aGlzLnZhbGlkYXRlRmxhZy53YWl0VG9TZXRGYWxzZSgpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyB3ZSB3ZXJlIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcsIG11c3QgYmUgcXVpdHRpbicgdGltZQotCQkJCXJldHVybjsKLQkJCX0KLQkJCXRoaXMudmFsaWRhdGVOb2RlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgbm9kZSwgbG9nZ2luZyBhbnkgZXhjZXB0aW9ucy4KLQkgKiBJZiBhbiBleGNlcHRpb24gb2NjdXJzLCB3ZSB0ZXJtaW5hdGUgdGhlIHZhbGlkYXRpb24gdW50aWwgdGhlCi0JICogInZhbGlkYXRpb24iIGZsYWcgaXMgc2V0IGFnYWluLiBTb21lIGV4Y2VwdGlvbnMgb2NjdXIgYmVjYXVzZQotCSAqIG9mIGNvbmN1cnJlbnQgY2hhbmdlcyB0byB0aGUgbW9kZWwgdGhhdCBvY2N1ciAqYWZ0ZXIqIHZhbGlkYXRpb24KLQkgKiBzdGFydHMgYnV0IGJlZm9yZSBpdCBjb21wbGV0ZXMgYW4gZW50aXJlIHBhc3Mgb3ZlciB0aGUgbW9kZWwuIElmIHRoYXQKLQkgKiBpcyB0aGUgY2FzZSwgdGhpbmdzIHNob3VsZCBiZSBPSzsgYmVjYXVzZSB0aGUgZXhjZXB0aW9uIHdpbGwgYmUKLQkgKiBjYXVnaHQgYW5kIHRoZSAidmFsaWRhdGlvbiIgZmxhZyB3aWxsIGhhdmUgYmVlbiBzZXQgYWdhaW4gKmR1cmluZyogdGhlCi0JICogaW5pdGlhbCB2YWxpZGF0aW9uIHBhc3MuIFNvIHdoZW4gd2UgcmV0dXJuIGZyb20gY2F0Y2hpbmcgdGhlIGV4Y2VwdGlvbgotCSAqIHdlIHdpbGwgc2ltcGx5IHJlLXN0YXJ0IHRoZSB2YWxpZGF0aW9uLCBob3BlZnVsbHkgd2l0aCB0aGUgbW9kZWwgaW4KLQkgKiBhIGNvbnNpc3RlbnQgc3RhdGUgdGhhdCB3aWxsIHByZXZlbnQgYW5vdGhlciBleGNlcHRpb24gZnJvbQotCSAqIG9jY3VycmluZy4gT2YgY291cnNlLCBpZiB3ZSBoYXZlIGFueSBleGNlcHRpb25zIHRoYXQgYXJlICpub3QqCi0JICogdGhlIHJlc3VsdCBvZiB0aGUgbW9kZWwgYmVpbmcgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCB3ZSB3aWxsCi0JICogcHJvYmFibHkgZmlsbCB0aGUgbG9nOyBhbmQgdGhvc2UgZXhjZXB0aW9ucyBhcmUgYnVncyB0aGF0IG5lZWQKLQkgKiB0byBiZSBmaXhlZC4gKCEpIEhvcGVmdWxseSB0aGUgdXNlciB3aWxsIG5vdGljZSB0aGUgZW5vcm1vdXMgbG9nIGFuZAotCSAqIGNvbnRhY3Qgc3VwcG9ydC4uLi4gIH5ianYKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVOb2RlKCkgewotCQl0cnkgewotCQkJdGhpcy5ub2RlLnZhbGlkYXRlQnJhbmNoKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJdGhpcy5sb2dFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV2UgbmVlZCB0byBkbyBhbGwgdGhpcyBiZWNhdXNlIExvZ2dlciNsb2coTG9nUmVjb3JkKSBkb2VzIG5vdCBwYXNzIHRocm91Z2gKLQkgKiBMb2dnZXIjZG9Mb2coTG9nUmVjb3JkKSBsaWtlIGFsbCB0aGUgb3RoZXIgTG9nZ2VyI2xvZyguLi4pIG1ldGhvZHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXgpIHsKLQkJTG9nUmVjb3JkIGxvZ1JlY29yZCA9IG5ldyBMb2dSZWNvcmQodGhpcy5leGNlcHRpb25MZXZlbCwgdGhpcy5leGNlcHRpb25NZXNzYWdlKTsKLQkJbG9nUmVjb3JkLnNldFBhcmFtZXRlcnMobmV3IE9iamVjdFtdIHsgdGhpcy5ub2RlLmRpc3BsYXlTdHJpbmcoKSB9KTsKLQkJbG9nUmVjb3JkLnNldFRocm93bihleCk7Ci0JCWxvZ1JlY29yZC5zZXRMb2dnZXJOYW1lKHRoaXMuZXhjZXB0aW9uTG9nZ2VyLmdldE5hbWUoKSk7Ci0JCWxvZ1JlY29yZC5zZXRSZXNvdXJjZUJ1bmRsZSh0aGlzLmV4Y2VwdGlvbkxvZ2dlci5nZXRSZXNvdXJjZUJ1bmRsZSgpKTsKLQkJdGhpcy5leGNlcHRpb25Mb2dnZXIubG9nKGxvZ1JlY29yZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9TeW5jaHJvbm91c1ZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL25vZGUvU3luY2hyb25vdXNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlNmI4Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9TeW5jaHJvbm91c1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGx1Z2dhYmxlVmFsaWRhdG9yLkRlbGVnYXRlIGludGVyZmFjZQotICogd2lsbCB2YWxpZGF0ZSB0aGUgbm9kZSBpbW1lZGlhdGVseS4KLSAqIAotICogVGhpcyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBpbiBhIHNpbmdsZSB0aHJlYWQgb3IgZ2VuZXJhdGluZwotICogcHJvYmxlbSByZXBvcnRzLgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25vdXNWYWxpZGF0b3IKLQlpbXBsZW1lbnRzIFBsdWdnYWJsZVZhbGlkYXRvci5EZWxlZ2F0ZQotewotCXByaXZhdGUgZmluYWwgTm9kZSBub2RlOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdmFsaWRhdG9yIHRoYXQgd2lsbCBpbW1lZGlhdGVseSB2YWxpZGF0ZSB0aGUKLQkgKiBzcGVjaWZpZWQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25vdXNWYWxpZGF0b3IoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubm9kZSA9IG5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCXRoaXMubm9kZS52YWxpZGF0ZUJyYW5jaCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubm9kZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9DYWNoaW5nQ29tYm9Cb3hNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWJlMjYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9DYWNoaW5nQ29tYm9Cb3hNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGEgY2xpZW50IHRvIGJldHRlciBjb250cm9sIHRoZSBwZXJmb3JtYW5jZSBvZgotICogYSBjb21ibyBib3ggbW9kZWwgYnkgYWxsb3dpbmcgdGhlIGNsaWVudCB0byBzcGVjaWZ5IHdoZW4gaXQgaXMKLSAqIGFjY2VwdGFibGUgZm9yIHRoZSBtb2RlbCB0byAiY2FjaGUiIGFuZCAidW5jYWNoZSIgaXRzIGxpc3Qgb2YgZWxlbWVudHMuCi0gKiBUaGUgbW9kZWwgbWF5IGlnbm9yZSB0aGVzZSBoaW50cyBpZiBhcHByb3ByaWF0ZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBDYWNoaW5nQ29tYm9Cb3hNb2RlbCBleHRlbmRzIENvbWJvQm94TW9kZWwgewotICAgIAotICAgIC8qKgotICAgICAqIENhY2hlIHRoZSBjb21ib0JveE1vZGVsIExpc3QuICBJZiB5b3UgY2FsbCB0aGlzLCB5b3UKLSAgICAgKiBtdXN0IG1ha2Ugc3VyZSB0byBjYWxsIHVuY2FjaGVMaXN0KCkgYXMgd2VsbC4gIE90aGVyd2lzZQotICAgICAqIHN0YWxlIGRhdGEgd2lsbCBiZSBpbiB0aGUgQ29tYm9Cb3ggdW50aWwgY2FjaGVMaXN0KCkgaXMgCi0gICAgICogY2FsbGVkIGFnYWluIG9yIHVuY2FjaGVMaXN0KCkgaXMgY2FsbGVkLgotICAgICAqLwotICAgIHZvaWQgY2FjaGVMaXN0KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGNhY2hlZCBsaXN0LiAgTmV4dCB0aW1lIHRoZSBsaXN0IGlzIG5lZWRlZCBpdCB3aWxsCi0gICAgICogYmUgYnVpbHQgd2hlbiBpdCBpcyBub3QgY2FjaGVkLgotICAgICAqLwotICAgIHZvaWQgdW5jYWNoZUxpc3QoKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgbGlzdCBpcyBhbHJlYWR5IGNhY2hlZC4gIFRoaXMgY2FuIGJlIHVzZWQgZm9yIAotICAgICAqIE1vdXNlRXZlbnRzLCBzaW5jZSB0aGV5IGFyZSBub3QgdGVycmlibHkgcHJlZGljdGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0NhY2hlZCgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiZDM3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNoZWNrQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5Td2luZ0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCi0vKioKLSAqIE1ha2UgdGhlIGNlbGwgbG9vayBsaWtlIGEgY2hlY2sgYm94LgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRzIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgewotCi0JLyoqIHRoZSBjb21wb25lbnQgdXNlZCB0byBwYWludCB0aGUgY2VsbCAqLwotCXByaXZhdGUgZmluYWwgSkNoZWNrQm94IGNoZWNrQm94OwotCQotCS8qKiB0aGUgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgb24gYW4gaW1tZWRpYXRlIGVkaXQgKi8KLQlwcm90ZWN0ZWQgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5JbW1lZGlhdGVFZGl0TGlzdGVuZXIgaW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCi0JLyoqICJub3JtYWwiIGJvcmRlciAtIGFzc3VtZSB0aGUgZGVmYXVsdCB0YWJsZSAiZm9jdXMiIGJvcmRlciBpcyAxIHBpeGVsIHRoaWNrICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9yZGVyIE5PX0ZPQ1VTX0JPUkRFUiA9IEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMSwgMSwgMSwgMSk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgd2l0aCBubyBsYWJlbCBvciBpY29uLgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmNoZWNrQm94ID0gdGhpcy5idWlsZENoZWNrQm94KCk7Ci0JCS8vIGJ5IGRlZmF1bHQsIGNoZWNrIGJveGVzIGRvIG5vdCBwYWludCB0aGVpciBib3JkZXJzCi0JCXRoaXMuY2hlY2tCb3guc2V0Qm9yZGVyUGFpbnRlZCh0cnVlKTsKLQkJLy8gdGhpcyBzZXR0aW5nIGlzIHJlY29tbWVuZGVkIGZvciBjaGVjayBib3hlcyBpbnNpZGUgb2YgdHJlZXMgYW5kIHRhYmxlcwotCQl0aGlzLmNoZWNrQm94LnNldEJvcmRlclBhaW50ZWRGbGF0KHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHQgYW5kIGljb24sCi0JICogZWl0aGVyIG9mIHdoaWNoIG1heSBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKFN0cmluZyB0ZXh0LCBJY29uIGljb24pIHsKLQkJdGhpcygpOwotCQl0aGlzLnNldFRleHQodGV4dCk7Ci0JCXRoaXMuc2V0SWNvbihpY29uKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXModGV4dCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB3aXRoIHRoZSBzcGVjaWZpZWQgaWNvbi4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcihJY29uIGljb24pIHsKLQkJdGhpcyhudWxsLCBpY29uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkNoZWNrQm94IGJ1aWxkQ2hlY2tCb3goKSB7Ci0JCUpDaGVja0JveCBjYiA9IG5ldyBKQ2hlY2tCb3goKTsKLQkJY2IuYWRkQWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZEFjdGlvbkxpc3RlbmVyKCkpOwotCQlyZXR1cm4gY2I7Ci0JfQotCQotCXByaXZhdGUgQWN0aW9uTGlzdGVuZXIgYnVpbGRBY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKENoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyLmltbWVkaWF0ZUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkgICAgdGhpcy5jaGVja0JveC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KFN3aW5nQ29uc3RhbnRzLkNFTlRFUik7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Q29tcG9uZW50T3JpZW50YXRpb24odGFibGUuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKSk7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Rm9udCh0YWJsZS5nZXRGb250KCkpOwotCQl0aGlzLmNoZWNrQm94LnNldEVuYWJsZWQodGFibGUuaXNFbmFibGVkKCkpOwotCi0JCXRoaXMuY2hlY2tCb3guc2V0Rm9yZWdyb3VuZCh0aGlzLmZvcmVncm91bmRDb2xvcih0YWJsZSwgdmFsdWUsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQkJdGhpcy5jaGVja0JveC5zZXRCYWNrZ3JvdW5kKHRoaXMuYmFja2dyb3VuZENvbG9yKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCQkvLyBvbmNlIHRoZSBjb2xvcnMgYXJlIHNldCwgY2FsY3VsYXRlIG9wYXF1ZSBzZXR0aW5nCi0JCXRoaXMuY2hlY2tCb3guc2V0T3BhcXVlKHRoaXMuY2VsbElzT3BhcXVlSW4odGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Qm9yZGVyKHRoaXMuYm9yZGVyKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCi0JCXRoaXMuc2V0VmFsdWUodmFsdWUpOwotCQlyZXR1cm4gdGhpcy5jaGVja0JveDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBmb3JlZ3JvdW5kIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2xvciBmb3JlZ3JvdW5kQ29sb3IoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuZm9jdXNDZWxsRm9yZWdyb3VuZCIpOwotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkZvcmVncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gdGFibGUuZ2V0Rm9yZWdyb3VuZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJhY2tncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmRDb2xvcihKVGFibGUgdGFibGUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCWlmIChoYXNGb2N1cyAmJiB0YWJsZS5pc0NlbGxFZGl0YWJsZShyb3csIGNvbHVtbikpIHsKLQkJCQlyZXR1cm4gVUlNYW5hZ2VyLmdldENvbG9yKCJUYWJsZS5mb2N1c0NlbGxCYWNrZ3JvdW5kIik7Ci0JCQl9Ci0JCQlyZXR1cm4gdGFibGUuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpOwotCQl9Ci0JCXJldHVybiB0YWJsZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYm9yZGVyLgotCSAqLwotCXByb3RlY3RlZCBCb3JkZXIgYm9yZGVyKEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBoYXNGb2N1cyA/ICBVSU1hbmFnZXIuZ2V0Qm9yZGVyKCJUYWJsZS5mb2N1c0NlbGxIaWdobGlnaHRCb3JkZXIiKSA6IE5PX0ZPQ1VTX0JPUkRFUjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY2VsbCBzaG91bGQgYmUgb3BhcXVlIGluIHRoZSB0YWJsZS4KLQkgKiBJZiB0aGUgY2VsbCdzIGJhY2tncm91bmQgaXMgdGhlIHNhbWUgYXMgdGhlIHRhYmxlJ3MgYmFja2dyb3VuZAotCSAqIGFuZCB0YWJsZSBpcyBvcGFxdWUsIHdlIGRvbid0IG5lZWQgdG8gcGFpbnQgdGhlIGJhY2tncm91bmQgLQotCSAqIHRoZSB0YWJsZSB3aWxsIGRvIGl0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNlbGxJc09wYXF1ZUluKEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCUNvbG9yIGNlbGxCYWNrZ3JvdW5kID0gdGhpcy5jaGVja0JveC5nZXRCYWNrZ3JvdW5kKCk7Ci0JCUNvbG9yIHRhYmxlQmFja2dyb3VuZCA9IHRhYmxlLmdldEJhY2tncm91bmQoKTsKLQkJcmV0dXJuICEgKHRhYmxlLmlzT3BhcXVlKCkgJiYgY2VsbEJhY2tncm91bmQuZXF1YWxzKHRhYmxlQmFja2dyb3VuZCkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY2hlY2sgYm94J3MgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIENSIzM5OTkzMTggLSBUaGlzIG51bGwgY2hlY2sgbmVlZHMgdG8gYmUgcmVtb3ZlZCBvbmNlIEpESyBidWcgaXMgZml4ZWQKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQl0aGlzLmNoZWNrQm94LnNldFNlbGVjdGVkKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuY2hlY2tCb3guaXNTZWxlY3RlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW1tZWRpYXRlRWRpdExpc3RlbmVyKEltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIGNoZWNrIGJveCdzIHRleHQ7IHdoaWNoIGJ5IGRlZmF1bHQgaXMgYmxhbmsuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLmNoZWNrQm94LnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjaGVjayBib3gncyBpY29uOyB3aGljaCBieSBkZWZhdWx0IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb24oSWNvbiBpY29uKSB7Ci0JCXRoaXMuY2hlY2tCb3guc2V0SWNvbihpY29uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbmRlcmVyJ3MgcHJlZmVycmVkIGhlaWdodC4gVGhpcyBhbGxvd3MgeW91Ci0JICogdG8gc2V0IHRoZSB0YWJsZSdzIHJvdyBoZWlnaHQgdG8gc29tZXRoaW5nIHRoZSBjaGVjayBib3gKLQkgKiB3aWxsIGxvb2sgZ29vZCBpbi4uLi4KLQkgKi8KLQlwdWJsaWMgaW50IHByZWZlcnJlZEhlaWdodCgpIHsKLQkJLy8gYWRkIGluIHNwYWNlIGZvciB0aGUgYm9yZGVyIHRvcCBhbmQgYm90dG9tCi0JCXJldHVybiAoaW50KSB0aGlzLmNoZWNrQm94LmdldFByZWZlcnJlZFNpemUoKS5nZXRIZWlnaHQoKSArIDI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkYjgyYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5Td2luZ0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Qb3B1cE1lbnVFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Qb3B1cE1lbnVMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci0KLS8qKgotICogTWFrZSB0aGUgY2VsbCBsb29rIGxpa2UgYSBjb21iby1ib3guCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudHMgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciB7Ci0KLQkvKiBjYWNoaW5nIHRoZSBjb21ibyBib3ggYmVjYXVzZSB3ZSBhcmUgY2FjaGluZyB0aGUgY29tYm9Cb3hNb2RlbC4KLQkgKiBFdmVyeXRpbWUgd2UgcmVidWlsdCB0aGUgY29tYm9Cb3ggd2Ugd291bGQgc2V0IHRoZSBtb2RlbCBvbiBpdCBhbmQgbm90Ci0JICogcmVtb3ZlIHRoZSBtb2RlbCBmcm9tIHRoZSBvbGQgY29tYm8gYm94LiAgVGhpcyBtZWFudCB0aGF0IG5ldyBsaXN0ZW5lcnMKLQkgKiBrZXB0IGJlaW5nIGFkZGVkIHRvIHRoZSBjb21ib0JveE1vZGVsIGZvciBldmVyeSBjb21ib0JveCBidWlsZC4KLQkgKiBOb3Qgc3VyZSBpZiB0aGVyZSBpcyBhIHdheSB0byBjbGVhciBvdXQgdGhlIG9sZCBjb21ibyBib3gsIG9yIHdoeQotCSAqIHdlIHdlcmUgYnVpbGRpZyBhIG5ldyBjb21ibyBib3ggZXZlcnkgdGltZSBzbyBJIHdlbnQgd2l0aCBjYWNoaW5nIGl0LgotCSAqLwotCXByaXZhdGUgSkNvbWJvQm94IGNvbWJvQm94OwotCQotCS8qKiB0aGUgaXRlbXMgdXNlZCB0byBwb3B1bGF0ZSB0aGUgY29tYm8gYm94ICovCi0JcHJpdmF0ZSBDYWNoaW5nQ29tYm9Cb3hNb2RlbCBtb2RlbDsKLQlwcml2YXRlIExpc3RDZWxsUmVuZGVyZXIgcmVuZGVyZXI7Ci0JT2JqZWN0IHZhbHVlOwotCXByaXZhdGUgc3RhdGljIGludCBoZWlnaHQgPSAtMTsKLQlib29sZWFuIGZha2VGb2N1c0ZsYWc7Ci0KLQkvKiogdGhlIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIG9uIGFuIGltbWVkaWF0ZSBlZGl0ICovCi0JcHJvdGVjdGVkIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyIGltbWVkaWF0ZUVkaXRMaXN0ZW5lcjsKLQkKLQkvKiogaG9sZCB0aGUgb3JpZ2luYWwgY29sb3JzIG9mIHRoZSBjb21iby1ib3ggKi8KLQlwcml2YXRlIHN0YXRpYyBDb2xvciBkZWZhdWx0Rm9yZWdyb3VuZDsKLQlwcml2YXRlIHN0YXRpYyBDb2xvciBkZWZhdWx0QmFja2dyb3VuZDsKLQotCS8qKiAibm9ybWFsIiBib3JkZXIgLSBhc3N1bWUgdGhlIGRlZmF1bHQgdGFibGUgImZvY3VzIiBib3JkZXIgaXMgMSBwaXhlbCB0aGljayAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvcmRlciBOT19GT0NVU19CT1JERVIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDEsIDEsIDEsIDEpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgY29tYm8tYm94IG1vZGVsLgotCSAqLwotCXB1YmxpYyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyKENvbWJvQm94TW9kZWwgbW9kZWwpIHsKLQkJdGhpcyhuZXcgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwobW9kZWwpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjYWNoaW5nIGNvbWJvLWJveCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcihDYWNoaW5nQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotCQl0aGlzKCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkCi0JICogY29tYm8tYm94IG1vZGVsIGFuZCByZW5kZXJlci4KLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcihDb21ib0JveE1vZGVsIG1vZGVsLCBMaXN0Q2VsbFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMobmV3IE5vbkNhY2hpbmdDb21ib0JveE1vZGVsKG1vZGVsKSwgcmVuZGVyZXIpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkCi0JICogY2FjaGluZyBjb21iby1ib3ggbW9kZWwgYW5kIHJlbmRlcmVyLgotCSAqLwotCXB1YmxpYyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyKENhY2hpbmdDb21ib0JveE1vZGVsIG1vZGVsLCBMaXN0Q2VsbFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMobW9kZWwpOwotCQl0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gc2F2ZSB0aGUgb3JpZ2luYWwgY29sb3JzIG9mIHRoZSBjb21iby1ib3gsIHNvIHdlCi0JCS8vIGNhbiB1c2UgdGhlbSB0byBwYWludCBub24tc2VsZWN0ZWQgY2VsbHMKLQkJaWYgKGhlaWdodCA9PSAtMSkgewotCQkJSkNvbWJvQm94IGNiID0gbmV3IEpDb21ib0JveCgpOwotCQkJY2IuYWRkSXRlbSgibSIpOwotCi0JCQkvLyBhZGQgaW4gc3BhY2UgZm9yIHRoZSBib3JkZXIgdG9wIGFuZCBib3R0b20KLQkJCWhlaWdodCA9IGNiLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQgKyAyOwotCi0JCQlkZWZhdWx0Rm9yZWdyb3VuZCA9IGNiLmdldEZvcmVncm91bmQoKTsKLQkJCWRlZmF1bHRCYWNrZ3JvdW5kID0gY2IuZ2V0QmFja2dyb3VuZCgpOwotCQl9Ci0JfQotCi0gICAgc3RhdGljIEpMYWJlbCBwcm90b3R5cGVMYWJlbCA9IG5ldyBKTGFiZWwoIlByb3RvdHlwZSIsIG5ldyBFbXB0eUljb24oMTYpLCBTd2luZ0NvbnN0YW50cy5MRUFESU5HKTsKLQotICAgIHByb3RlY3RlZCBKQ29tYm9Cb3ggYnVpbGRDb21ib0JveCgpIHsKLQotCQlmaW5hbCBKQ29tYm9Cb3ggcmVzdWx0ID0gbmV3IEpDb21ib0JveCgpIHsKLQkJCXByaXZhdGUgYm9vbGVhbiBmYWtlRm9jdXM7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotCQkJCXJldHVybiBmYWtlRm9jdXMgfHwgc3VwZXIuaGFzRm9jdXMoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgewotCQkJCWZha2VGb2N1cyA9IENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy5mYWtlRm9jdXNGbGFnOwotCQkJCXN1cGVyLnBhaW50KGcpOwotCQkJCWZha2VGb2N1cyA9IGZhbHNlOwotCQkJfQotCQkJLy93cmFwIHRoZSByZW5kZXJlciB0byBkZWFsIHdpdGggdGhlIHByb3RvdHlwZURpc3BsYXlWYWx1ZQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzZXRSZW5kZXJlcihmaW5hbCBMaXN0Q2VsbFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQkgICAgICAgIHN1cGVyLnNldFJlbmRlcmVyKG5ldyBMaXN0Q2VsbFJlbmRlcmVyKCl7Ci0JCSAgICAgICAgICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChKTGlzdCBsaXN0LCBPYmplY3QgdiwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCSAgICAgICAgICAgICAgICBpZiAodiA9PSBwcm90b3R5cGVMYWJlbCkgewotCQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm90b3R5cGVMYWJlbDsKLQkJICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgICAgIHJldHVybiBhUmVuZGVyZXIuZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChsaXN0LCB2LCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKTsKLQkJICAgICAgICAgICAgfQotCQkgICAgICAgIH0pOwotCQkgICAgfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGdldFNlbGVjdGVkSW5kZXgoKSB7Ci0JCSAgICAgICAgYm9vbGVhbiBsaXN0Tm90Q2FjaGVkID0gIWxpc3RJc0NhY2hlZCgpOwotCQkgICAgICAgIGlmIChsaXN0Tm90Q2FjaGVkKSB7Ci0JCSAgICAgICAgICAgIGNhY2hlTGlzdCgpOwotCQkgICAgICAgIH0KLQkJICAgICAgICAKLQkJCQlpbnQgaW5kZXggPSBzdXBlci5nZXRTZWxlY3RlZEluZGV4KCk7Ci0KLQkJICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotCQkgICAgICAgICAgICB1bmNhY2hlTGlzdCgpOwotCQkgICAgICAgIH0KLQkJCQlyZXR1cm4gaW5kZXg7Ci0JCSAgIH0KLQotCQl9OwotCQkvLyBzdG9sZSB0aGlzIGNvZGUgZnJvbSBqYXZheC5zd2luZy5EZWZhdWx0Q2VsbEVkaXRvcgotCQlyZXN1bHQucHV0Q2xpZW50UHJvcGVydHkoIkpDb21ib0JveC5pc1RhYmxlQ2VsbEVkaXRvciIsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkQWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXJlc3VsdC5hZGRQb3B1cE1lbnVMaXN0ZW5lcih0aGlzLmJ1aWxkUG9wdXBNZW51TGlzdGVuZXIoKSk7Ci0JCQotICAgICAgICAvL1RoZXNlIGFyZSB1c2VkIHRvIHdvcmthcm91bmQgcHJvYmxlbXMgd2l0aCBTd2luZyB0cnlpbmcgdG8gCi0gICAgICAgIC8vZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgY29tYm9Cb3ggd2l0aCBhIGxhcmdlIG1vZGVsCi0gICAgICAgIHJlc3VsdC5zZXRQcm90b3R5cGVEaXNwbGF5VmFsdWUocHJvdG90eXBlTGFiZWwpOwotICAgICAgICBnZXRMaXN0Qm94KHJlc3VsdCkuc2V0UHJvdG90eXBlQ2VsbFZhbHVlKHByb3RvdHlwZUxhYmVsKTsKLSAgICAgICAgCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotICAgIAotICAgIHByaXZhdGUgSkxpc3QgZ2V0TGlzdEJveChKQ29tYm9Cb3ggcmVzdWx0KSB7Ci0gICAgICAgIHJldHVybiAoSkxpc3QpIENsYXNzVG9vbHMuZmllbGRWYWx1ZShyZXN1bHQuZ2V0VUkoKSwgImxpc3RCb3giKTsKLSAgICB9Ci0KLQkKLQlwcml2YXRlIEFjdGlvbkxpc3RlbmVyIGJ1aWxkQWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotCQkJCUpDb21ib0JveCBjYiA9IChKQ29tYm9Cb3gpIGUuZ2V0U291cmNlKCk7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkSXRlbSA9IGNiLmdldFNlbGVjdGVkSXRlbSgpOwotCi0JCQkJLy8gT25seSB1cGRhdGUgdGhlIHNlbGVjdGVkIGl0ZW0gYW5kIGludm9rZSBpbW1lZGlhdGVFZGl0KCkgaWYgdGhlCi0JCQkJLy8gc2VsZWN0ZWQgaXRlbSBhY3R1YWxseSBjaGFuZ2VkLCBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZQotCQkJCS8vIGVkaXRpbmcsIHRoZSBtb2RlbCBjaGFuZ2VzIGFuZCBjYXVzZXMgdGhpcyBtZXRob2QgdG8gYmUgaW52b2tlZCwKLQkJCQkvLyBpdCBjYXVzZXMgQ1IjMzk2MzY3NSB0byBvY2N1ciBiZWNhdXNlIGltbWVkaWF0ZUVkaXQoKSBzdG9wIHRoZQotCQkJCS8vIGVkaXRpbmcsIHdoaWNoIGlzIGRvbmUgYXQgdGhlIHdyb25nIHRpbWUKLQkJCQlpZiAoQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci50aGlzLnZhbHVlICE9IHNlbGVjdGVkSXRlbSkgewotCQkJCQlDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMudmFsdWUgPSBjYi5nZXRTZWxlY3RlZEl0ZW0oKTsKLQkJCQkJQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci50aGlzLmltbWVkaWF0ZUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCBpbW1lZGlhdGVFZGl0KCkgewotCQlpZiAodGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJdGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIuaW1tZWRpYXRlRWRpdCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgUG9wdXBNZW51TGlzdGVuZXIgYnVpbGRQb3B1cE1lbnVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQb3B1cE1lbnVMaXN0ZW5lcigpIHsKLQkJCi0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVXaWxsQmVjb21lVmlzaWJsZShQb3B1cE1lbnVFdmVudCBlKSB7Ci0JCQkJaWYgKGxpc3RJc0NhY2hlZCgpKSB7Ci0JCQkJCXVuY2FjaGVMaXN0KCk7Ci0JCQkJfQotCQkJCWNhY2hlTGlzdCgpOwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudVdpbGxCZWNvbWVJbnZpc2libGUoUG9wdXBNZW51RXZlbnQgZSkgewotCSAgICAgICAgICAgIGlmIChsaXN0SXNDYWNoZWQoKSkgewotCSAgICAgICAgICAgICAgICB1bmNhY2hlTGlzdCgpOwotCSAgICAgICAgICAgIH0KLQotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudUNhbmNlbGVkKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkgICAgICAgICAgICBpZiAobGlzdElzQ2FjaGVkKCkpIHsKLQkgICAgICAgICAgICAgICAgdW5jYWNoZUxpc3QoKTsKLQkgICAgICAgICAgICB9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCi0Jdm9pZCBjYWNoZUxpc3QoKSB7Ci0JCXRoaXMubW9kZWwuY2FjaGVMaXN0KCk7Ci0JfQotCQotCXZvaWQgdW5jYWNoZUxpc3QoKSB7Ci0JCXRoaXMubW9kZWwudW5jYWNoZUxpc3QoKTsKLQl9CQotCQotCWJvb2xlYW4gbGlzdElzQ2FjaGVkKCkgewotCQlyZXR1cm4gdGhpcy5tb2RlbC5pc0NhY2hlZCgpOwotCX0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCXRoaXMuZmFrZUZvY3VzRmxhZyA9IHNlbGVjdGVkIHx8IGhhc0ZvY3VzOwotCQlpZiAodGhpcy5jb21ib0JveCA9PSBudWxsKSB7Ci0JCQl0aGlzLmNvbWJvQm94ID0gdGhpcy5idWlsZENvbWJvQm94KCk7Ci0JCi0JCQl0aGlzLmNvbWJvQm94LnNldENvbXBvbmVudE9yaWVudGF0aW9uKHRhYmxlLmdldENvbXBvbmVudE9yaWVudGF0aW9uKCkpOwotCQkJdGhpcy5jb21ib0JveC5zZXRNb2RlbCh0aGlzLm1vZGVsKTsKLQkJCWlmICh0aGlzLnJlbmRlcmVyICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbWJvQm94LnNldFJlbmRlcmVyKHRoaXMucmVuZGVyZXIpOwotCQkJfQotCQkJdGhpcy5jb21ib0JveC5zZXRGb250KHRhYmxlLmdldEZvbnQoKSk7Ci0JCQl0aGlzLmNvbWJvQm94LnNldEVuYWJsZWQodGFibGUuaXNFbmFibGVkKCkpOwotCQkJdGhpcy5jb21ib0JveC5zZXRCb3JkZXIodGhpcy5ib3JkZXIodGFibGUsIHZhbCwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCQl9Ci0KLQkJLy8gV2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSBtb2RlbCBzaW5jZSBKQ29tYm9Cb3ggbWlnaHQgcHJldmVudCB1cyBmcm9tCi0JCS8vIHNlbGVjdGluZyB0aGUgdmFsdWUuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSB2YWx1ZSBpcyBub3QgY29udGFpbmVkCi0JCS8vIGluIHRoZSBtb2RlbCwgc2VlIENSIzM5NTAwNDQgZm9yIGFuIGV4YW1wbGUKLQkJdGhpcy5tb2RlbC5zZXRTZWxlY3RlZEl0ZW0odmFsKTsKLQotCQlyZXR1cm4gdGhpcy5jb21ib0JveDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBmb3JlZ3JvdW5kIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2xvciBmb3JlZ3JvdW5kQ29sb3IoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBkZWZhdWx0Rm9yZWdyb3VuZDsKLQkJCX0KLQkJCXJldHVybiB0YWJsZS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRGb3JlZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJhY2tncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmRDb2xvcihKVGFibGUgdGFibGUsIE9iamVjdCB2YWwsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRCYWNrZ3JvdW5kOwotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkJhY2tncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEJhY2tncm91bmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYm9yZGVyLgotCSAqLwotCXByb3RlY3RlZCBCb3JkZXIgYm9yZGVyKEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbCwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQlyZXR1cm4gaGFzRm9jdXMgPwotCQkJVUlNYW5hZ2VyLmdldEJvcmRlcigiVGFibGUuZm9jdXNDZWxsSGlnaGxpZ2h0Qm9yZGVyIikKLQkJOgotCQkJTk9fRk9DVVNfQk9SREVSOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLlJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbW1lZGlhdGVFZGl0TGlzdGVuZXIoVGFibGVDZWxsRWRpdG9yQWRhcHRlci5JbW1lZGlhdGVFZGl0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbmRlcmVyJ3MgcHJlZmVycmVkIGhlaWdodC4gVGhpcyBhbGxvd3MgeW91Ci0JICogdG8gc2V0IHRoZSByb3cgaGVpZ2h0IHRvIHNvbWV0aGluZyB0aGUgY29tYm8tYm94IHdpbGwgbG9vayBnb29kIGluLi4uLgotCSAqLwotCXB1YmxpYyBpbnQgcHJlZmVycmVkSGVpZ2h0KCkgewotCQlyZXR1cm4gaGVpZ2h0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9EaXNwbGF5YWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0Rpc3BsYXlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MmYxOGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0Rpc3BsYXlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIFVzZWQgYnkgZ2VuZXJhbC1wdXJwb3NlIFVJIG1vZGVscyBhbmQgcmVuZGVyZXJzIHRvIGNhc3QKLSAqIGFwcGxpY2F0aW9uIG1vZGVsIG9iamVjdHMgdG8gc29tZXRoaW5nIGRpc3BsYXlhYmxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc3BsYXlhYmxlCi0JZXh0ZW5kcyBNb2RlbCwgQ29tcGFyYWJsZTxEaXNwbGF5YWJsZT4KLXsKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RlbAotCSAqIGluIGEgdGV4dHVhbCBVSSBzZXR0aW5nICh0eXBpY2FsbHkgdGhlIG9iamVjdCdzIG5hbWUpLgotCSAqIFdoZW4gdGhlIGRpc3BsYXkgc3RyaW5nIGNoYW5nZXMsIHRoZSBtb2RlbCBzaG91bGQgZmlyZQotCSAqIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uOgotCSAqICAgICB0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZERpc3BsYXlTdHJpbmcsIHRoaXMuZGlzcGxheVN0cmluZygpKTsKLQkgKi8KLQlTdHJpbmcgZGlzcGxheVN0cmluZygpOwotCQlTdHJpbmcgRElTUExBWV9TVFJJTkdfUFJPUEVSVFkgPSAiZGlzcGxheVN0cmluZyI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RlbAotCSAqIGluIGEgVUkgY29tcG9uZW50IHRoYXQgc3VwcG9ydHMgaWNvbnMgKHRoZSBpY29uIGNhbiBiZSBudWxsKS4KLQkgKiBXaGVuIHRoZSBpY29uIGNoYW5nZXMsIHRoZSBtb2RlbCBzaG91bGQgZmlyZQotCSAqIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uOgotCSAqICAgICB0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSUNPTl9QUk9QRVJUWSwgb2xkSWNvbiwgdGhpcy5pY29uKCkpOwotCSAqLwotCUljb24gaWNvbigpOwotCQlTdHJpbmcgSUNPTl9QUk9QRVJUWSA9ICJpY29uIjsKLQotCi0JLy8gKioqKioqKioqKiBoZWxwZXIgaW1wbGVtZW50YXRpb25zICoqKioqKioqKioKLQotCUNvbGxhdG9yIERFRkFVTFRfQ09MTEFUT1IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogU2luY2UgYWxsIGRpc3BsYXlhYmxlIG9iamVjdHMgbXVzdCBiZSBjb21wYXJhYmxlLCBwcm92aWRlIGEKLQkgKiB0eXBpY2FsIGNvbXBhcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byBzb3J0IGEgY29sbGVjdGlvbiBvZgotCSAqIGRpc3BsYXlhYmxlIG9iamVjdHMuCi0JICogU29ydCBiYXNlZCBvbiBkaXNwbGF5IHN0cmluZzoKLQkgKiAgICAgLSBpZGVudGljYWwgb2JqZWN0cyBhcmUgZXF1YWwgKHdoaWNoIG1lYW5zIHRoZXkgY2Fubm90Ci0JICogICAgICAgICBjby1leGlzdCBpbiBhIFNvcnRlZFNldCkKLQkgKiAgICAgLSB1c2UgdGhlIGRlZmF1bHQgY29sbGF0b3IgKHdoaWNoIHR5cGljYWxseSBpbnRlcmxlYXZlcwotCSAqICAgICAgICAgbG93ZXItIGFuZCB1cHBlci1jYXNlIGxldHRlcnMpCi0JICogICAgIC0gYWxsb3cgZHVwbGljYXRlIGRpc3BsYXkgc3RyaW5ncyAoZnJvbSBkaWZmZXJlbnQgb2JqZWN0cykKLQkgKiAgICAgLSB0cnkgdG8gcmV0dXJuIGNvbnNpc3RlbnQgcmVzdWx0cyBmb3Igc2FtZSBvYmplY3QgcGFpcnMKLQkgKi8KLQlDb21wYXJhdG9yPERpc3BsYXlhYmxlPiBERUZBVUxUX0NPTVBBUkFUT1IgPQotCQluZXcgQ29tcGFyYXRvcjxEaXNwbGF5YWJsZT4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoRGlzcGxheWFibGUgZDEsIERpc3BsYXlhYmxlIGQyKSB7Ci0JCQkJLy8gZGlzYWxsb3cgZHVwbGljYXRlcyBiYXNlZCBvbiBvYmplY3QgaWRlbnRpdHkKLQkJCQlpZiAoZDEgPT0gZDIpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCi0JCQkJLy8gZmlyc3QgY29tcGFyZSBkaXNwbGF5IHN0cmluZ3MgdXNpbmcgdGhlIGRlZmF1bHQgY29sbGF0b3IKLQkJCQlpbnQgcmVzdWx0ID0gREVGQVVMVF9DT0xMQVRPUi5jb21wYXJlKGQxLmRpc3BsYXlTdHJpbmcoKSwgZDIuZGlzcGxheVN0cmluZygpKTsKLQkJCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0KLQkJCQkvLyB0aGVuIGNvbXBhcmUgdXNpbmcgb2JqZWN0LWlkCi0JCQkJcmVzdWx0ID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDEpIC0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDIpOwotCQkJCWlmIChyZXN1bHQgIT0gMCkgewotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQotCQkJCS8vIEl0J3MgdW5saWtlbHkgdGhhdCB3ZSBnZXQgdG8gdGhpcyBwb2ludDsgYnV0LCBqdXN0IGluIGNhc2UsIHdlIHdpbGwgcmV0dXJuIC0xLgotCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRoaXMgaW50cm9kdWNlcyBzb21lIG1pbGQgdW5wcmVkaWN0YWJpbGl0eSB0byB0aGUgc29ydCBvcmRlcgotCQkJCS8vICh1bmxlc3MgdGhlIG9iamVjdHMgYXJlIGFsd2F5cyBwYXNzZWQgaW50byB0aGlzIG1ldGhvZCBpbiB0aGUgc2FtZSBvcmRlcikuCi0JCQkJcmV0dXJuIC0xOwkJLy8gaWYgYWxsIGVsc2UgZmFpbHMsIGluZGljYXRlIHRoYXQgbzEgPCBvMgotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiRGlzcGxheWFibGUuREVGQVVMVF9DT01QQVJBVE9SIjsKLQkJCX0KLQkJfTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0VtcHR5SWNvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0VtcHR5SWNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDIyNTFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9FbXB0eUljb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi0vKioKLSAqIEltcGxlbWVudCB0aGUgSWNvbiBpbnRlcmZhY2Ugd2l0aCBhbiBpY29uIHRoYXQgaGFzIGEgc2l6ZSBidXQKLSAqIGRvZXMgbm90IHBhaW50IGFueXRoaW5nIG9uIHRoZSBncmFwaGljcyBjb250ZXh0LgotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlJY29uCi0JaW1wbGVtZW50cyBJY29uCi17Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgd2lkdGg7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgaGVpZ2h0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbXB0eUljb24gTlVMTF9JTlNUQU5DRSA9IG5ldyBFbXB0eUljb24oMCk7Ci0KLQotCXB1YmxpYyBFbXB0eUljb24oaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7Ci0JfQotCi0JcHVibGljIEVtcHR5SWNvbihpbnQgc2l6ZSkgewotCQl0aGlzKHNpemUsIHNpemUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJY29uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHBhaW50SWNvbihDb21wb25lbnQgYywgR3JhcGhpY3MgZywgaW50IHgsIGludCB5KSB7Ci0JCS8vIGRvbid0IHBhaW50IGFueXRoaW5nIGZvciBhbiBlbXB0eSBpY29uCi0JfQotCi0JcHVibGljIGludCBnZXRJY29uV2lkdGgoKSB7IAotCQlyZXR1cm4gdGhpcy53aWR0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEljb25IZWlnaHQoKSB7Ci0JCXJldHVybiB0aGlzLmhlaWdodDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9GaWx0ZXJpbmdMaXN0QnJvd3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RCcm93c2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OWYzZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RCcm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIExvbmdMaXN0Q29tcG9uZW50LkJyb3dzZXIgdXNlcyBhCi0gKiBKT3B0aW9uUGFuZSB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIHRoZSBzZWxlY3Rpb24uIFRoZSBKT1B0aW9uUGFuZQotICogaXMgcGFzc2VkIGEgRmlsdGVyaW5nTGlzdFBhbmVsIHRvIGFzc2lzdCB0aGUgdXNlciBpbiBtYWtpbmcKLSAqIGEgc2VsZWN0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nTGlzdEJyb3dzZXI8VD4gCi0JaW1wbGVtZW50cyBMaXN0Q2hvb3Nlci5MaXN0QnJvd3NlciAKLXsKLQlwcml2YXRlIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBwYW5lbDsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0xpc3RCcm93c2VyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhbmVsID0gdGhpcy5idWlsZFBhbmVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBidWlsZFBhbmVsKCkgewotCQlyZXR1cm4gbmV3IExvY2FsRmlsdGVyaW5nTGlzdFBhbmVsPFQ+KCk7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0IHRoZSB1c2VyIHVzaW5nIGEgSk9wdGlvblBhbmUgd2l0aCBhIGZpbHRlcmluZwotCSAqIGxpc3QgcGFuZWwuCi0JICovCi0JcHVibGljIHZvaWQgYnJvd3NlKExpc3RDaG9vc2VyIGNob29zZXIpIHsJCi0JCXRoaXMuaW5pdGlhbGl6ZUNlbGxSZW5kZXJlcihjaG9vc2VyKTsKLQkJCi0JCWludCBvcHRpb24gPSAKLQkJCUpPcHRpb25QYW5lLnNob3dPcHRpb25EaWFsb2coCi0JCQkJY2hvb3NlciwgCi0JCQkJdGhpcy5tZXNzYWdlKGNob29zZXIpLCAKLQkJCQl0aGlzLnRpdGxlKGNob29zZXIpLCAKLQkJCQl0aGlzLm9wdGlvblR5cGUoY2hvb3NlciksIAotCQkJCXRoaXMubWVzc2FnZVR5cGUoY2hvb3NlciksIAotCQkJCXRoaXMuaWNvbihjaG9vc2VyKSwgCi0JCQkJdGhpcy5zZWxlY3Rpb25WYWx1ZXMoY2hvb3NlciksIAotCQkJCXRoaXMuaW5pdGlhbFNlbGVjdGlvblZhbHVlKGNob29zZXIpCi0JCSk7Ci0JCQotCQlpZiAob3B0aW9uID09IEpPcHRpb25QYW5lLk9LX09QVElPTikgewotCQkJY2hvb3Nlci5nZXRNb2RlbCgpLnNldFNlbGVjdGVkSXRlbSh0aGlzLnBhbmVsLnNlbGVjdGlvbigpKTsKLQkJfQotCQkKLQkJLy8gY2xlYXIgdGhlIHRleHQgZmllbGQgc28gdGhlIGxpc3QgYm94IGlzIHJlLWZpbHRlcmVkCi0JCXRoaXMucGFuZWwudGV4dEZpZWxkKCkuc2V0VGV4dCgiIik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDZWxsUmVuZGVyZXIoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCS8vIGRlZmF1bHQgYmVoYXZpb3Igc2hvdWxkIGJlIHRvIHVzZSB0aGUgY2VsbCByZW5kZXJlciBmcm9tIHRoZSBjb21ib2JveC4KLQkJdGhpcy5wYW5lbC5saXN0Qm94KCkuc2V0Q2VsbFJlbmRlcmVyKGNvbWJvQm94LmdldFJlbmRlcmVyKCkpOwotCX0KLQotCS8qKgotCSAqIHRoZSBtZXNzYWdlIGNhbiBiZSBhbnl0aGluZyAtIGhlcmUgd2UgYnVpbGQgYSBjb21wb25lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IG1lc3NhZ2UoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXRoaXMucGFuZWwuc2V0Q29tcGxldGVMaXN0KHRoaXMuY29udmVydFRvQXJyYXkoY29tYm9Cb3guZ2V0TW9kZWwoKSkpOwotCQl0aGlzLnBhbmVsLnNldFNlbGVjdGlvbihjb21ib0JveC5nZXRNb2RlbCgpLmdldFNlbGVjdGVkSXRlbSgpKTsKLQkJcmV0dXJuIHRoaXMucGFuZWw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBvcHRpb25UeXBlKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gSk9wdGlvblBhbmUuT0tfQ0FOQ0VMX09QVElPTjsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IG1lc3NhZ2VUeXBlKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSWNvbiBpY29uKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gc2VsZWN0aW9uVmFsdWVzKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb25WYWx1ZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgbGlzdCBvZiBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBtb2RlbAotCSAqIGludG8gYW4gYXJyYXkuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGNvbnZlcnRUb0FycmF5KExpc3RNb2RlbCBtb2RlbCkgewotCQlpbnQgc2l6ZSA9IG1vZGVsLmdldFNpemUoKTsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IG1vZGVsLmdldEVsZW1lbnRBdChpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGN1c3RvbSBwYW5lbCAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBMb2NhbEZpbHRlcmluZ0xpc3RQYW5lbDxTPiBleHRlbmRzIEZpbHRlcmluZ0xpc3RQYW5lbDxTPiB7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCi0JCXByb3RlY3RlZCBMb2NhbEZpbHRlcmluZ0xpc3RQYW5lbCgpIHsKLQkJCXN1cGVyKEVNUFRZX0FSUkFZLCBudWxsKTsKLQkJfQotCQotCQkvKioKLQkJICogRGlzYWJsZSB0aGUgcGVyZm9ybWFuY2UgdHdlYWsgYmVjYXVzZSBKT3B0aW9uUGFuZQotCQkgKiB3aWxsIHRyeSBvcGVuIHdpZGUgZW5vdWdoIHRvIGRpc2FibGUgdGhlIGhvcml6b250YWwgc2Nyb2xsIGJhcjsKLQkJICogYW5kIGl0IGxvb2tzIGEgYml0IGNsdW1zeS4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIHByb3RvdHlwZUNlbGxWYWx1ZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdFBhbmVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOWE1NmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuRm9udDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0TGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZVN0cmluZ01hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ01hdGNoZXI7Ci0KLS8qKgotICogVGhpcyBwYW5lbCBwcmVzZW50cyBhbiBlbnRyeSBmaWVsZCBhbmQgYSBsaXN0IGJveCBvZiBjaG9pY2VzIHRoYXQKLSAqIGFsbG93cyB0aGUgdXNlciB0byBmaWx0ZXIgdGhlIGVudHJpZXMgaW4gdGhlIGxpc3QgYm94IGJ5IGVudGVyaW5nCi0gKiBhIHBhdHRlcm4gaW4gdGhlIGVudHJ5IGZpZWxkLgotICogCi0gKiBCeSBkZWZhdWx0LCB0d28gd2lsZGNhcmRzIGFyZSBhbGxvd2VkIGluIHRoZSBwYXR0ZXJuOgotICogCScqJyB3aWxsIG1hdGNoIGFueSBzZXQgb2YgemVybyBvciBtb3JlIGNoYXJhY3RlcnMKLSAqIAknPycgd2lsbCBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3RlcgotICogCi0gKiBUaGUgcGFuZWwgY29uc2lzdHMgb2YgNCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIGN1c3RvbWl6ZWQ6Ci0gKiAJLSAxIHRleHQgZmllbGQKLSAqIAktIDEgbGlzdCBib3gKLSAqIAktIDIgbGFiZWxzLCBvbmUgZm9yIGVhY2ggb2YgdGhlIGFib3ZlCi0gKiAKLSAqIE90aGVyIGFzcGVjdHMgb2YgdGhlIHBhbmVsJ3MgYmVoYXZpb3IgY2FuIGJlIGNoYW5nZWQ6Ci0gKiAJLSB0aGUgc3RyaW5nIGNvbnZlcnRlciBkZXRlcm1pbmVzIGhvdyB0aGUgb2JqZWN0cyBpbiB0aGUKLSAqIAkJbGlzdCBhcmUgY29udmVydGVkIHRvIHN0cmluZ3MgYW5kIGNvbXBhcmVkIHRvIHRoZSBwYXR0ZXJuCi0gKiAJCWVudGVyZWQgaW4gdGhlIHRleHQgZmllbGQ7IGJ5IGRlZmF1bHQgdGhlIGNvbnZlcnRlciBzaW1wbHkKLSAqIAkJdXNlcyB0aGUgcmVzdWx0IG9mIHRoZSBvYmplY3QncyAjdG9TdHJpbmcoKSBtZXRob2QKLSAqIAkJKGlmIHlvdSByZXBsYWNlIHRoZSBzdHJpbmcgY29udmVydGVyLCB5b3Ugd2lsbCBwcm9iYWJseQotICogCQl3YW50IHRvIHJlcGxhY2UgdGhlIGxpc3QgYm94J3MgY2VsbCByZW5kZXJlciBhbHNvKQotICogCS0gdGhlIHN0cmluZyBtYXRjaGVyIGNhbiBhbHNvIGJlIGNoYW5nZWQgaWYgeW91IHdvdWxkCi0gKiAJCWxpa2UgZGlmZmVyZW50IHBhdHRlcm4gbWF0Y2hpbmcgYmVoYXZpb3IgdGhhbiB0aGF0Ci0gKiAJCWRlc2NyaWJlZCBhYm92ZQotICogCS0geW91IGNhbiBzcGVjaWZ5IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGxpc3QgLSB0aGlzIG1heQotICogCQlmb3JjZSB0aGUgdXNlciB0byBlbnRlciBhIHBhdHRlcm4gcmVzdHJpY3RpdmUgZW5vdWdoCi0gKiAJCXRvIHJlc3VsdCBpbiBhIGxpc3Qgc21hbGxlciB0aGFuIHRoZSBtYXhpbXVtIHNpemU7IHRoZQotICogCQlkZWZhdWx0IGlzIC0xLCB3aGljaCBkaXNhYmxlcyB0aGUgcmVzdHJpY3Rpb24KLSAqIAotICogVGhpcyBwYW5lbCBpcyBub3QgYSB0eXBpY2FsIHBhbmVsLCBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBkb2VzIG5vdCBzaGFyZQotICogaXRzIG1vZGVsIHdpdGggY2xpZW50cyB2aWEgdmFsdWUgbW9kZWxzLiBJbnN0ZWFkLCB0aGlzIHBhbmVsJ3MgbW9kZWwKLSAqIGlzIHNldCBhbmQgcXVlcmllZCBkaXJlY3RseSBiZWNhdXNlIGl0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gYQotICogZGlhbG9nIHRoYXQgZGlyZWN0cyB0aGUgdXNlcidzIGJlaGF2aW9yIChhcyBvcHBvc2VkIHRvIGEgIm5vcm1hbCIKLSAqIHdpbmRvdykuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdMaXN0UGFuZWw8VD4gZXh0ZW5kcyBKUGFuZWwgewotCi0JLyoqCi0JICogVGhlIGNvbXBsZXRlIGxpc3Qgb2YgYXZhaWxhYmxlIGNob2ljZXMKLQkgKiAoYXMgb3Bwb3NlZCB0byB0aGUgcGFydGlhbCBsaXN0IGhlbGQgYnkgdGhlIGxpc3QgYm94KS4KLQkgKi8KLQlwcml2YXRlIE9iamVjdFtdIGNvbXBsZXRlTGlzdDsKLQotCS8qKgotCSAqIEFuIGFkYXB0ZXIgdXNlZCB0byBjb252ZXJ0IHRoZSBvYmplY3RzIGluIHRoZSBsaXN0Ci0JICogdG8gc3RyaW5ncyBzbyB0aGV5IGNhbiBiZSBydW4gdGhyb3VnaCB0aGUgbWF0Y2hlcgotCSAqIGFuZCBkaXNwbGF5ZWQgaW4gdGhlIHRleHQgZmllbGQuCi0JICovCi0JU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcjsKLQotCS8qKiBUaGUgdGV4dCBmaWVsZC4gKi8KLQlwcml2YXRlIEpUZXh0RmllbGQgdGV4dEZpZWxkOwotCXByaXZhdGUgSkxhYmVsIHRleHRGaWVsZExhYmVsOwotCXByaXZhdGUgRG9jdW1lbnRMaXN0ZW5lciB0ZXh0RmllbGRMaXN0ZW5lcjsKLQotCS8qKiBUaGUgbGlzdCBib3guICovCi0JcHJpdmF0ZSBKTGlzdCBsaXN0Qm94OwotCXByaXZhdGUgSkxhYmVsIGxpc3RCb3hMYWJlbDsKLQotCS8qKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LiAqLwotCXByaXZhdGUgaW50IG1heExpc3RTaXplOwotCi0JLyoqCi0JICogVGhlIG1hdGNoZXIgdXNlZCB0byBmaWx0ZXIgdGhlIGxpc3QgYWdhaW5zdAotCSAqIHRoZSBwYXR0ZXJuIGVudGVyZWQgaW4gdGhlIHRleHQgZmllbGQuIEJ5IGRlZmF1bHQsCi0JICogdGhpcyBhbGxvd3MgdGhlIHR3byB3aWxkY2FyZCBjaGFyYWN0ZXJzIGRlc2NyaWJlZCBpbgotCSAqIHRoZSBjbGFzcyBjb21tZW50LgotCSAqLwotCXByaXZhdGUgU3RyaW5nTWF0Y2hlciBzdHJpbmdNYXRjaGVyOwotCi0JLyoqCi0JICogUGVyZm9ybWFuY2UgdHdlYWs6IFdlIHVzZSB0aGlzIGJ1ZmZlciBpbnN0ZWFkIG9mCi0JICogYSB0ZW1wb3JhcnkgdmFyaWFibGUgZHVyaW5nIGZpbHRlcmluZyBzbyB3ZSBkb24ndCBoYXZlCi0JICogdG8ga2VlcCByZS1hbGxvY2F0aW5nIGl0LgotCSAqLwotCXByaXZhdGUgT2JqZWN0W10gYnVmZmVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9yZGVyIFRFWFRfRklFTERfTEFCRUxfQk9SREVSID0gQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigwLCAwLCA1LCAwKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb3JkZXIgTElTVF9CT1hfTEFCRUxfQk9SREVSID0gQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcig1LCAwLCA1LCAwKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgRmlsdGVyaW5nTGlzdFBhbmVsIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGNob2ljZXMKLQkgKiBhbmQgaW5pdGlhbCBzZWxlY3Rpb24uIFVzZSB0aGUgZGVmYXVsdCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlCi0JICogY2hvaWNlcyBhbmQgc2VsZWN0aW9uIHRvIHN0cmluZ3MgKHdoaWNoIHNpbXBseSBjYWxscyAjdG9TdHJpbmcoKSBvbgotCSAqIHRoZSBvYmplY3RzKS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nTGlzdFBhbmVsKE9iamVjdFtdIGNvbXBsZXRlTGlzdCwgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb24pIHsKLQkJdGhpcyhjb21wbGV0ZUxpc3QsIGluaXRpYWxTZWxlY3Rpb24sIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxUPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEZpbHRlcmluZ0xpc3RQYW5lbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBjaG9pY2VzCi0JICogYW5kIGluaXRpYWwgc2VsZWN0aW9uLiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlCi0JICogY2hvaWNlcyBhbmQgc2VsZWN0aW9uIHRvIHN0cmluZ3MuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0xpc3RQYW5lbChPYmplY3RbXSBjb21wbGV0ZUxpc3QsIE9iamVjdCBpbml0aWFsU2VsZWN0aW9uLCBTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCXN1cGVyKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCXRoaXMuY29tcGxldGVMaXN0ID0gY29tcGxldGVMaXN0OwotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciA9IHN0cmluZ0NvbnZlcnRlcjsKLQkJdGhpcy5pbml0aWFsaXplKGluaXRpYWxTZWxlY3Rpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgaW5pdGlhbFNlbGVjdGlvbikgewotCQl0aGlzLm1heExpc3RTaXplID0gdGhpcy5kZWZhdWx0TWF4TGlzdFNpemUoKTsKLQkJdGhpcy5idWZmZXIgPSB0aGlzLmJ1aWxkQnVmZmVyKCk7Ci0KLQkJdGhpcy50ZXh0RmllbGRMaXN0ZW5lciA9IHRoaXMuYnVpbGRUZXh0RmllbGRMaXN0ZW5lcigpOwotCi0JCXRoaXMuc3RyaW5nTWF0Y2hlciA9IHRoaXMuYnVpbGRTdHJpbmdNYXRjaGVyKCk7Ci0KLQkJdGhpcy5pbml0aWFsaXplTGF5b3V0KGluaXRpYWxTZWxlY3Rpb24pOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gYnVpbGRCdWZmZXIoKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W3RoaXMubWF4KCldOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBtYXggbnVtYmVyIG9mIGVudHJpZXMgYWxsb3dlZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHJpdmF0ZSBpbnQgbWF4KCkgewotCQlpZiAodGhpcy5tYXhMaXN0U2l6ZSA9PSAtMSkgewotCQkJcmV0dXJuIHRoaXMuY29tcGxldGVMaXN0Lmxlbmd0aDsKLQkJfQotCQlyZXR1cm4gTWF0aC5taW4odGhpcy5tYXhMaXN0U2l6ZSwgdGhpcy5jb21wbGV0ZUxpc3QubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIGxpc3RlbmVyIHRoYXQgd2lsbCBsaXN0ZW4gdG8gY2hhbmdlcyBpbiB0aGUgdGV4dCBmaWVsZAotCSAqIGFuZCBmaWx0ZXIgdGhlIGxpc3QgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcml2YXRlIERvY3VtZW50TGlzdGVuZXIgYnVpbGRUZXh0RmllbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEb2N1bWVudExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0xpc3RQYW5lbC50aGlzLmZpbHRlckxpc3QoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nTGlzdFBhbmVsLnRoaXMuZmlsdGVyTGlzdCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0xpc3RQYW5lbC50aGlzLmZpbHRlckxpc3QoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRleHQgZmllbGQgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgaW50IGRlZmF1bHRNYXhMaXN0U2l6ZSgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgU3RyaW5nTWF0Y2hlciBidWlsZFN0cmluZ01hdGNoZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RyaW5nTWF0Y2hlcjxUPigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplTGF5b3V0KE9iamVjdCBpbml0aWFsU2VsZWN0aW9uKSB7Ci0JCS8vIHRleHQgZmllbGQKLQkJSlBhbmVsIHRleHRGaWVsZFBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQl0aGlzLnRleHRGaWVsZExhYmVsID0gbmV3IEpMYWJlbCgpOwotCQl0aGlzLnRleHRGaWVsZExhYmVsLnNldEJvcmRlcihURVhUX0ZJRUxEX0xBQkVMX0JPUkRFUik7Ci0JCXRleHRGaWVsZFBhbmVsLmFkZCh0aGlzLnRleHRGaWVsZExhYmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCi0JCXRoaXMudGV4dEZpZWxkID0gbmV3IEpUZXh0RmllbGQoKTsKLQkJdGhpcy50ZXh0RmllbGQuZ2V0RG9jdW1lbnQoKS5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMudGV4dEZpZWxkTGlzdGVuZXIpOwotCQl0aGlzLnRleHRGaWVsZExhYmVsLnNldExhYmVsRm9yKHRoaXMudGV4dEZpZWxkKTsKLQkJdGV4dEZpZWxkUGFuZWwuYWRkKHRoaXMudGV4dEZpZWxkLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotCQl0aGlzLmFkZCh0ZXh0RmllbGRQYW5lbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQotCQkvLyBsaXN0IGJveAotCQlKUGFuZWwgbGlzdEJveFBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQl0aGlzLmxpc3RCb3hMYWJlbCA9IG5ldyBKTGFiZWwoKTsKLQkJdGhpcy5saXN0Qm94TGFiZWwuc2V0Qm9yZGVyKExJU1RfQk9YX0xBQkVMX0JPUkRFUik7Ci0JCWxpc3RCb3hQYW5lbC5hZGQodGhpcy5saXN0Qm94TGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7Ci0KLQkJdGhpcy5saXN0Qm94ID0gbmV3IEpMaXN0KCk7Ci0JCXRoaXMubGlzdEJveC5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJdGhpcy5saXN0Qm94LnNldE1vZGVsKHRoaXMuYnVpbGRQYXJ0aWFsQXJyYXlMaXN0TW9kZWwodGhpcy5jb21wbGV0ZUxpc3QsIHRoaXMubWF4KCkpKTsKLQkJdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbk1vZGVsKCkuc2V0U2VsZWN0aW9uTW9kZShMaXN0U2VsZWN0aW9uTW9kZWwuU0lOR0xFX1NFTEVDVElPTik7Ci0JCS8vIHBlcmZvcm1hbmNlIHR3ZWFrKD8pCi0JCXRoaXMubGlzdEJveC5zZXRQcm90b3R5cGVDZWxsVmFsdWUodGhpcy5wcm90b3R5cGVDZWxsVmFsdWUoKSk7Ci0JCXRoaXMubGlzdEJveC5zZXRQcm90b3R5cGVDZWxsVmFsdWUobnVsbCk7Ci0JCXRoaXMubGlzdEJveC5zZXRDZWxsUmVuZGVyZXIodGhpcy5idWlsZERlZmF1bHRDZWxsUmVuZGVyZXIoKSk7Ci0JCXRoaXMubGlzdEJveExhYmVsLnNldExhYmVsRm9yKHRoaXMubGlzdEJveCk7Ci0JCS8vIGJ1ZyAyNzc3ODAyIC0gc2Nyb2xsIGJhcnMgc2hvdWxkbid0IGJlIG9uIHRoZSB0YWIgc2VxdWVuY2UKLQkJSlNjcm9sbFBhbmUgbGlzdEJveFNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUodGhpcy5saXN0Qm94KTsKLQkJbGlzdEJveFNjcm9sbFBhbmUuZ2V0SG9yaXpvbnRhbFNjcm9sbEJhcigpLnNldEZvY3VzYWJsZShmYWxzZSk7Ci0JCWxpc3RCb3hTY3JvbGxQYW5lLmdldFZlcnRpY2FsU2Nyb2xsQmFyKCkuc2V0Rm9jdXNhYmxlKGZhbHNlKTsKLQkJbGlzdEJveFBhbmVsLmFkZChsaXN0Qm94U2Nyb2xsUGFuZSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLQkJLy8gaW5pdGlhbGl6ZSB0aGUgd2lkZ2V0cwotCQl0aGlzLmxpc3RCb3guc2V0U2VsZWN0ZWRWYWx1ZShpbml0aWFsU2VsZWN0aW9uLCB0cnVlKTsKLQkJdGhpcy50ZXh0RmllbGQuc2VsZWN0KDAsIHRoaXMudGV4dEZpZWxkLmdldFRleHQoKS5sZW5ndGgoKSk7Ci0KLQkJdGhpcy5hZGQobGlzdEJveFBhbmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IHNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEJveC5nZXRTZWxlY3RlZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJdGhpcy5saXN0Qm94LnNldFNlbGVjdGVkVmFsdWUoc2VsZWN0aW9uLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gY29tcGxldGVMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5jb21wbGV0ZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogcmVidWlsZCB0aGUgZmlsdGVyaW5nIGJ1ZmZlciBhbmQgcmUtYXBwbHkgdGhlIGZpbHRlcgotCSAqIHRvIHRoZSBuZXcgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBsZXRlTGlzdChPYmplY3RbXSBjb21wbGV0ZUxpc3QpIHsKLQkJdGhpcy5jb21wbGV0ZUxpc3QgPSBjb21wbGV0ZUxpc3Q7Ci0JCWlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCB0aGlzLm1heCgpKSB7Ci0JCQkvLyB0aGUgYnVmZmVyIHdpbGwgbmV2ZXIgc2hyaW5rIC0gbWlnaHQgd2FudCB0byByZS1jb25zaWRlci4uLiAgfmJqdgotCQkJdGhpcy5idWZmZXIgPSB0aGlzLmJ1aWxkQnVmZmVyKCk7Ci0JCX0KLQkJdGhpcy5maWx0ZXJMaXN0KCk7Ci0JfQotCi0JcHVibGljIGludCBtYXhMaXN0U2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubWF4TGlzdFNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWF4TGlzdFNpemUoaW50IG1heExpc3RTaXplKSB7Ci0JCXRoaXMubWF4TGlzdFNpemUgPSBtYXhMaXN0U2l6ZTsKLQkJaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA8IHRoaXMubWF4KCkpIHsKLQkJCS8vIHRoZSBidWZmZXIgd2lsbCBuZXZlciBzaHJpbmsgLSBtaWdodCB3YW50IHRvIHJlLWNvbnNpZGVyLi4uICB+Ymp2Ci0JCQl0aGlzLmJ1ZmZlciA9IHRoaXMuYnVpbGRCdWZmZXIoKTsKLQkJfQotCQl0aGlzLmZpbHRlckxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMuc3RyaW5nQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIGFwcGx5IHRoZSBuZXcgZmlsdGVyIHRvIHRoZSBsaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nQ29udmVydGVyKFN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQkJdGhpcy5zdHJpbmdDb252ZXJ0ZXIgPSBzdHJpbmdDb252ZXJ0ZXI7Ci0JCXRoaXMuZmlsdGVyTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIGFsbG93IGNsaWVudCBjb2RlIHRvIGFjY2VzcyB0aGUgdGV4dCBmaWVsZAotCSAqIChzbyB3ZSBjYW4gc2V0IHRoZSBmb2N1cykKLQkgKi8KLQlwdWJsaWMgSlRleHRGaWVsZCB0ZXh0RmllbGQoKSB7Ci0JCXJldHVybiB0aGlzLnRleHRGaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiBhbGxvdyBjbGllbnQgY29kZSB0byBhY2Nlc3MgdGhlIHRleHQgZmllbGQgbGFiZWwKLQkgKi8KLQlwdWJsaWMgSkxhYmVsIHRleHRGaWVsZExhYmVsKCkgewotCQlyZXR1cm4gdGhpcy50ZXh0RmllbGRMYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0RmllbGRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy50ZXh0RmllbGRMYWJlbC5zZXRUZXh0KHRleHQpOwotCX0KLQotCS8qKgotCSAqIGFsbG93IGNsaWVudCBjb2RlIHRvIGFjY2VzcyB0aGUgbGlzdCBib3gKLQkgKiAoc28gd2UgY2FuIGFkZCBtb3VzZSBsaXN0ZW5lcnMgZm9yIGRvdWJsZS1jbGlja2luZykKLQkgKi8KLQlwdWJsaWMgSkxpc3QgbGlzdEJveCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEJveDsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0Qm94Q2VsbFJlbmRlcmVyKExpc3RDZWxsUmVuZGVyZXIgcmVuZGVyZXIpIHsKLQkJdGhpcy5saXN0Qm94LnNldENlbGxSZW5kZXJlcihyZW5kZXJlcik7Ci0JfQotCi0JLyoqCi0JICogYWxsb3cgY2xpZW50IGNvZGUgdG8gYWNjZXNzIHRoZSBsaXN0IGJveCBsYWJlbAotCSAqLwotCXB1YmxpYyBKTGFiZWwgbGlzdEJveExhYmVsKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Qm94TGFiZWw7Ci0JfQotCi0JLyoqCi0JICogY29udmVuaWVuY2UgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdEJveExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLmxpc3RCb3hMYWJlbC5zZXRUZXh0KHRleHQpOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudHNGb250KEZvbnQgZm9udCkgewotCQl0aGlzLnRleHRGaWVsZExhYmVsLnNldEZvbnQoZm9udCk7Ci0JCXRoaXMudGV4dEZpZWxkLnNldEZvbnQoZm9udCk7Ci0JCXRoaXMubGlzdEJveExhYmVsLnNldEZvbnQoZm9udCk7Ci0JCXRoaXMubGlzdEJveC5zZXRGb250KGZvbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdNYXRjaGVyIHN0cmluZ01hdGNoZXIoKSB7Ci0JCXJldHVybiB0aGlzLnN0cmluZ01hdGNoZXI7Ci0JfQotCi0JLyoqCi0JICogcmUtYXBwbHkgdGhlIGZpbHRlciB0byB0aGUgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmluZ01hdGNoZXIoU3RyaW5nTWF0Y2hlciBzdHJpbmdNYXRjaGVyKSB7Ci0JCXRoaXMuc3RyaW5nTWF0Y2hlciA9IHN0cmluZ01hdGNoZXI7Ci0JCXRoaXMuZmlsdGVyTGlzdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbG93IHN1YmNsYXNzZXMgdG8gZGlzYWJsZSBwZXJmb3JtYW5jZSB0d2VhawotCSAqIGJ5IHJldHVybmluZyBudWxsIGhlcmUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm90b3R5cGVDZWxsVmFsdWUoKSB7Ci0JCXJldHVybiAiPT09PT09PT09PT4gQV9TVFJJTkdfVEhBVF9JU19ERUZJTklURUxZX0xPTkdFUl9USEFOX0VWRVJZX1NUUklOR19JTl9USEVfTElTVCA8PT09PT09PT09PSI7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgdXNlIHRoZSBzdHJpbmcgY29udmVydGVyIHRvIGJ1aWxkIHRoZSB0ZXh0Ci0JICogdXNlZCBieSB0aGUgbGlzdCBib3gncyBjZWxsIHJlbmRlcmVyLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2VsbFJlbmRlcmVyIGJ1aWxkRGVmYXVsdENlbGxSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0Q2VsbFJlbmRlcmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkgewotCQkJCXJldHVybiBGaWx0ZXJpbmdMaXN0UGFuZWwudGhpcy5zdHJpbmdDb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nKChUKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogU29tZXRoaW5nIGhhcyBjaGFuZ2VkIHRoYXQgcmVxdWlyZXMgdXMgdG8gZmlsdGVyIHRoZSBsaXN0LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHN5bmNocm9uaXplZCBiZWNhdXNlIGEgZmFzdCB0eXBpc3QgY2FuCi0JICogZ2VuZXJhdGUgZXZlbnRzIHF1aWNrZXIgdGhhbiB3ZSBjYW4gZmlsdGVyIHRoZSBsaXN0LiAoPyAgfmJqdikKLQkgKi8KLQlzeW5jaHJvbml6ZWQgdm9pZCBmaWx0ZXJMaXN0KCkgewotCQkvLyB0ZW1wb3JhcmlseSBzdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBib3ggc2VsZWN0aW9uLCBzaW5jZSB3ZSB3aWxsCi0JCS8vIGJlIGNoYW5naW5nIHRoZSBzZWxlY3Rpb24gZHVyaW5nIHRoZSBmaWx0ZXJpbmcgYW5kIGRvbid0IHdhbnQKLQkJLy8gdGhhdCB0byBhZmZlY3QgdGhlIHRleHQgZmllbGQKLQkJdGhpcy5maWx0ZXJMaXN0KHRoaXMudGV4dEZpZWxkLmdldFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogRmlsdGVyIHRoZSBjb250ZW50cyBvZiB0aGUgbGlzdCBib3ggdG8gbWF0Y2ggdGhlCi0JICogc3BlY2lmaWVkIHBhdHRlcm4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpbHRlckxpc3QoU3RyaW5nIHBhdHRlcm4pIHsKLQkJaWYgKHBhdHRlcm4ubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhpcy5saXN0Qm94LnNldE1vZGVsKHRoaXMuYnVpbGRQYXJ0aWFsQXJyYXlMaXN0TW9kZWwodGhpcy5jb21wbGV0ZUxpc3QsIHRoaXMubWF4KCkpKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc3RyaW5nTWF0Y2hlci5zZXRQYXR0ZXJuU3RyaW5nKHBhdHRlcm4pOwotCQkJaW50IGogPSAwOwotCQkJaW50IGxlbiA9IHRoaXMuY29tcGxldGVMaXN0Lmxlbmd0aDsKLQkJCWludCBtYXggPSB0aGlzLm1heCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWlmICh0aGlzLnN0cmluZ01hdGNoZXIubWF0Y2hlcyh0aGlzLnN0cmluZ0NvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcodGhpcy5lbnRyeShpKSkpKSB7Ci0JCQkJCXRoaXMuYnVmZmVyW2orK10gPSB0aGlzLmNvbXBsZXRlTGlzdFtpXTsKLQkJCQl9Ci0JCQkJaWYgKGogPT0gbWF4KSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXRoaXMubGlzdEJveC5zZXRNb2RlbCh0aGlzLmJ1aWxkUGFydGlhbEFycmF5TGlzdE1vZGVsKHRoaXMuYnVmZmVyLCBqKSk7Ci0JCX0KLQotCQkvLyBhZnRlciBmaWx0ZXJpbmcgdGhlIGxpc3QsIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgc2VsZWN0aW9uCi0JCWlmICh0aGlzLmxpc3RCb3guZ2V0TW9kZWwoKS5nZXRTaXplKCkgPT0gMCkgewotCQkJdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbk1vZGVsKCkuY2xlYXJTZWxlY3Rpb24oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25Nb2RlbCgpLnNldEFuY2hvclNlbGVjdGlvbkluZGV4KDApOwotCQkJdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbk1vZGVsKCkuc2V0TGVhZFNlbGVjdGlvbkluZGV4KDApOwotCQkJdGhpcy5saXN0Qm94LmVuc3VyZUluZGV4SXNWaXNpYmxlKDApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgVCBlbnRyeShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChUKSB0aGlzLmNvbXBsZXRlTGlzdFtpbmRleF07Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBsaXN0IG1vZGVsIHRoYXQgd3JhcHMgb25seSBhIHBvcnRpb24gb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBUaGUgbW9kZWwgd2lsbCBpbmNsdWRlIHRoZSBhcnJheSBlbnRyaWVzIGZyb20gMCB0byAoc2l6ZSAtIDEpLgotCSAqLwotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkUGFydGlhbEFycmF5TGlzdE1vZGVsKGZpbmFsIE9iamVjdFtdIGFycmF5LCBmaW5hbCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gbmV3IEFic3RyYWN0TGlzdE1vZGVsKCkgewotCQkJcHVibGljIGludCBnZXRTaXplKCkgewotCQkJCXJldHVybiBzaXplOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBnZXRFbGVtZW50QXQoaW50IGluZGV4KSB7Ci0JCQkJcmV0dXJuIGFycmF5W2luZGV4XTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTGlzdENob29zZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9MaXN0Q2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRjYThiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9MaXN0Q2hvb3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5BV1RFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5BV1RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci1pbXBvcnQgamF2YS5hd3QuUG9pbnQ7Ci1pbXBvcnQgamF2YS5hd3QuUm9ib3Q7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OwotCi1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlBvcHVwTWVudUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlBvcHVwTWVudUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnBsYWYuYmFzaWMuQmFzaWNDb21ib0JveFVJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLQotLyoqCi0gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHdheSB0byBoYW5kbGUgc2VsZWN0aW5nIGFuIGl0ZW0gZnJvbSBhCi0gKiBsaXN0IHRoYXQgbWF5IGdyb3cgdG9vIGxhcmdlIHRvIGJlIGhhbmRsZWQgY29udmVuaWVudGx5IGJ5IGEgY29tYm8tYm94LiAKLSAqIElmIHRoZSBsaXN0J3Mgc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGRlc2lnbmF0ZWQgImxvbmciIGxpc3Qgc2l6ZSwgCi0gKiB0aGUgY2hvaWNlIGxpc3Qgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gYSBub3JtYWwgY29tYm8tYm94IHBvcHVwOyAKLSAqIG90aGVyd2lzZSwgYSBkaWFsb2cgd2lsbCBiZSB1c2VkIHRvIHByb21wdCB0aGUgdXNlciB0byBjaG9vc2UgYSBzZWxlY3Rpb24uCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgYnJvd3NlIG1lY2hhbmlzbSwgc3ViY2xhc3NlcyBtYXkgCi0gKiAJLSBvdmVycmlkZSB0aGUgbWV0aG9kICNidWlsZEJyb3dzZXIoKQotICogIC0gb3ZlcnJpZGUgdGhlIG1ldGhvZCAjYnJvd3NlKCksIGluIHdoaWNoIGNhc2UgdGhlIG1ldGhvZCAKLSAqIAkJI2J1aWxkQnJvd3NlcigpIG1heSBiZSBpZ25vcmVkLgotICovCi1wdWJsaWMgY2xhc3MgTGlzdENob29zZXIgCi0JZXh0ZW5kcyBKQ29tYm9Cb3gKLXsKLQkKLQkvKiogdGhlIHNpemUgb2YgYSAibG9uZyIgbGlzdCAtIGFueXRoaW5nIHNtYWxsZXIgaXMgYSAic2hvcnQiIGxpc3QgKi8KLQlpbnQgbG9uZ0xpc3RTaXplID0gREVGQVVMVF9MT05HX0xJU1RfU0laRTsKLQkKLQkvKiogdGhlIGRlZmF1bHQgc2l6ZSBvZiBhICJsb25nIiBsaXN0LCB3aGljaCBpcyAyMCAodG8gbWF0Y2ggSk9wdGlvblBhbmUncyBiZWhhdmlvcikgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0xPTkdfTElTVF9TSVpFID0gMjA7Ci0JCi0JLyoqIHByb3BlcnR5IGNoYW5nZSBhc3NvY2lhdGVkIHdpdGggbG9uZyBsaXN0IHNpemUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX0xJU1RfU0laRV9QUk9QRVJUWSA9ICJsb25nTGlzdFNpemUiOwotCQotICAgIHN0YXRpYyBKTGFiZWwgcHJvdG90eXBlTGFiZWwgPSBuZXcgSkxhYmVsKCJQcm90b3R5cGUiLCBuZXcgRW1wdHlJY29uKDE3KSwgU3dpbmdDb25zdGFudHMuTEVBRElORyk7Ci0KLSAgICAvKiogCi0JICogd2hldGhlciB0aGUgY2hvb3NlciBpcyBjaG9vc2FibGUuICBpZiBhIGNob29zZXIgaXMgbm90IGNob29zYWJsZSwKLQkgKiBpdCBvbmx5IHNlcnZlcyBhcyBhIGRpc3BsYXkgd2lkZ2V0LiAgYSB1c2VyIG1heSBub3QgY2hhbmdlIGl0cyAKLQkgKiBzZWxlY3RlZCB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGNob29zYWJsZSA9IHRydWU7Ci0JCi0JLyoqIHByb3BlcnR5IGNoYW5nZSBhc3NvY2lhdGVkIHdpdGggY2hvb3NhYmxlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hPT1NBQkxFX1BST1BFUlRZID0gImNob29zYWJsZSI7Ci0JCi0JLyoqIHRoZSBicm93c2VyIHVzZWQgdG8gbWFrZSBhIHNlbGVjdGlvbiBmcm9tIHRoZSBsb25nIGxpc3QgLSB0eXBpY2FsbHkgdmlhIGEgZGlhbG9nICovCi0JcHJpdmF0ZSBMaXN0QnJvd3NlciBicm93c2VyOwotCQotICAgIHByaXZhdGUgTm9kZVNlbGVjdG9yIG5vZGVTZWxlY3RvcjsKLSAgICAKLQkvKiogSU5URVJOQUwgLSBUaGUgcG9wdXAgaXMgYmVpbmcgc2hvd24uICBVc2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcC4gKi8KLQlib29sZWFuIHBvcHVwQWxyZWFkeUluUHJvZ3Jlc3M7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBDb25zdHJ1Y3RvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBjaG9vc2VyIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0Q2hvb3NlcihDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMobW9kZWwsIG5ldyBOb2RlU2VsZWN0b3IuRGVmYXVsdE5vZGVTZWxlY3RvcigpKTsKLQl9Ci0JCi0gICAgcHVibGljIExpc3RDaG9vc2VyKENhY2hpbmdDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMobW9kZWwsIG5ldyBOb2RlU2VsZWN0b3IuRGVmYXVsdE5vZGVTZWxlY3RvcigpKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIExpc3RDaG9vc2VyKENvbWJvQm94TW9kZWwgbW9kZWwsIE5vZGVTZWxlY3RvciBub2RlU2VsZWN0b3IpIHsKLSAgICAgICAgdGhpcyhuZXcgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwobW9kZWwpLCBub2RlU2VsZWN0b3IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdENob29zZXIoQ2FjaGluZ0NvbWJvQm94TW9kZWwgbW9kZWwsIE5vZGVTZWxlY3RvciBub2RlU2VsZWN0b3IpIHsKLSAgICAgICAgc3VwZXIobW9kZWwpOwotICAgICAgICB0aGlzLmluaXRpYWxpemUoKTsKLSAgICAgICAgdGhpcy5ub2RlU2VsZWN0b3IgPSBub2RlU2VsZWN0b3I7Ci0gICAgfQotCS8vICoqKioqKioqKioqKioqKiogSW5pdGlhbGl6YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuYWRkUG9wdXBNZW51TGlzdGVuZXIodGhpcy5idWlsZFBvcHVwTWVudUxpc3RlbmVyKCkpOwotCQl0aGlzLnNldFJlbmRlcmVyKG5ldyBEZWZhdWx0TGlzdENlbGxSZW5kZXJlcigpKTsKLSAgICAgICAgdGhpcy5hZGRLZXlMaXN0ZW5lcihidWlsZEYzS2V5TGlzdGVuZXIoKSk7Ci0gICAgICAgIAotICAgICAgICAvL1RoZXNlIGFyZSB1c2VkIHRvIHdvcmthcm91bmQgcHJvYmxlbXMgd2l0aCBTd2luZyB0cnlpbmcgdG8gCi0gICAgICAgIC8vZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgY29tYm9Cb3ggd2l0aCBhIGxhcmdlIG1vZGVsCi0gICAgICAgIHNldFByb3RvdHlwZURpc3BsYXlWYWx1ZShwcm90b3R5cGVMYWJlbCk7Ci0gICAgICAgIGxpc3RCb3goKS5zZXRQcm90b3R5cGVDZWxsVmFsdWUocHJvdG90eXBlTGFiZWwpOwotCX0KLQkKLSAgICAKLSAgICBwcml2YXRlIEpMaXN0IGxpc3RCb3goKSB7Ci0gICAgICAgIHJldHVybiAoSkxpc3QpIENsYXNzVG9vbHMuZmllbGRWYWx1ZSh0aGlzLnVpLCAibGlzdEJveCIpOwotICAgIH0KLSAgICAKLQkvKiogCi0JICogV2hlbiB0aGUgcG9wdXAgaXMgYWJvdXQgdG8gYmUgc2hvd24sIHRoZSBldmVudCBpcyBjb25zdW1lZCwgYW5kIAotCSAqIFBvcHVwSGFuZGxlciBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gcmVzaG93IHRoZSBwb3B1cCBvciB0byBzaG93Ci0JICogdGhlIGxvbmcgbGlzdCBicm93c2VyLgotCSAqLwotCXByaXZhdGUgUG9wdXBNZW51TGlzdGVuZXIgYnVpbGRQb3B1cE1lbnVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQb3B1cE1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudVdpbGxCZWNvbWVWaXNpYmxlKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkJCQlMaXN0Q2hvb3Nlci50aGlzLmFib3V0VG9TaG93UG9wdXAoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudVdpbGxCZWNvbWVJbnZpc2libGUoUG9wdXBNZW51RXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHBvcHVwTWVudUNhbmNlbGVkKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJwb3AtdXAgbWVudSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIElmIHRoaXMgY29kZSBpcyBiZWluZyByZWFjaGVkIGR1ZSB0byB0aGUgUG9wdXBIYW5kbGVyIGFscmVhZHkgYmVpbmcgaW4gcHJvZ3Jlc3MsCi0JICogdGhlbiBkbyBub3RoaW5nLiAgT3RoZXJ3aXNlLCBzZXQgdGhlIGZsYWcgdG8gdHJ1ZSBhbmQgbGF1bmNoIHRoZSBQb3B1cEhhbmRsZXIuCi0JICovCi0Jdm9pZCBhYm91dFRvU2hvd1BvcHVwKCkgewotCQlpZiAodGhpcy5wb3B1cEFscmVhZHlJblByb2dyZXNzKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRoaXMucG9wdXBBbHJlYWR5SW5Qcm9ncmVzcyA9IHRydWU7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIobmV3IFBvcHVwSGFuZGxlcigpKTsKLQl9Ci0gCi0gICAgCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBidWlsZEYzS2V5TGlzdGVuZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LlZLX0YzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdvVG9TZWxlY3RlZEl0ZW0oKTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiRjMga2V5IGxpc3RlbmVyIjsKLQkJCX0KLSAgICAgICAgfTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZ29Ub1NlbGVjdGVkSXRlbSgpIHsKLSAgICAgICAgaWYgKGdldFNlbGVjdGVkSXRlbSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3RDaG9vc2VyLnRoaXMubm9kZVNlbGVjdG9yLnNlbGVjdE5vZGVGb3IoZ2V0U2VsZWN0ZWRJdGVtKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotCS8vICoqKioqKioqKioqKioqKiogQnJvd3NpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKiAKLQkgKiBMYXppbHkgaW5pdGlhbGl6ZSBiZWNhdXNlIHN1YmNsYXNzZXMgbWF5IGhhdmUgZnVydGhlciBpbml0aWFsaXphdGlvbiB0byBkbwotCSAqIGJlZm9yZSBicm93c2VyIGNhbiBiZSBidWlsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicm93c2UoKSB7Ci0JCWlmICh0aGlzLmJyb3dzZXIgPT0gbnVsbCkgewotCQkJdGhpcy5icm93c2VyID0gdGhpcy5idWlsZEJyb3dzZXIoKTsKLQkJfQotCQkKLQkJdGhpcy5icm93c2VyLmJyb3dzZSh0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYnJvd3NlciIgdXNlZCB0byBtYWtlIGEgc2VsZWN0aW9uIGZyb20gdGhlIGxvbmcgbGlzdCwKLQkgKiB0eXBpY2FsbHkgdmlhIGEgZGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2hvb3Nlci5MaXN0QnJvd3NlciBidWlsZEJyb3dzZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdEJyb3dzZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBDaG9vc2FibGUgZnVuY3Rpb25hbGl0eSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqIG92ZXJyaWRlIGJlaGF2aW9yIC0gY29uc3VtZSBzZWxlY3Rpb24gaWYgY2hvb3NlciBpcyBub3QgY2hvb3NhYmxlICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJbmRleChpbnQgYW5JbmRleCkgewotCQlpZiAodGhpcy5jaG9vc2FibGUpIHsKLQkJCXN1cGVyLnNldFNlbGVjdGVkSW5kZXgoYW5JbmRleCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUFycm93QnV0dG9uKCkgewotCQl0cnkgewotCQkJQmFzaWNDb21ib0JveFVJIGNvbWJvQm94VWkgPSAoQmFzaWNDb21ib0JveFVJKSBMaXN0Q2hvb3Nlci50aGlzLmdldFVJKCk7Ci0JCQlKQnV0dG9uIGFycm93QnV0dG9uID0gKEpCdXR0b24pIENsYXNzVG9vbHMuZmllbGRWYWx1ZShjb21ib0JveFVpLCAiYXJyb3dCdXR0b24iKTsKLQkJCWFycm93QnV0dG9uLnNldEVuYWJsZWQodGhpcy5pc0VuYWJsZWQoKSAmJiB0aGlzLmNob29zYWJsZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0aGlzIGlzIGEgaHVnZSBoYWNrIHRvIHRyeSBhbmQgbWFrZSB0aGUgY29tYm8gYm94IGxvb2sgcmlnaHQsCi0JCQkvLyBzbyBpZiBpdCBkb2Vzbid0IHdvcmssIGp1c3Qgc3dhbGxvdyB0aGUgZXhjZXB0aW9uCi0JCX0KLQl9Ci0JCi0JCi0gICAgLy8gKioqKioqKioqKioqKioqKiBMaXN0IENhY2hpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgdm9pZCBjYWNoZUxpc3QoKSB7Ci0gICAgICAgICgoQ2FjaGluZ0NvbWJvQm94TW9kZWwpIGdldE1vZGVsKCkpLmNhY2hlTGlzdCgpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHVuY2FjaGVMaXN0KCkgewotICAgICAgICAoKENhY2hpbmdDb21ib0JveE1vZGVsKSBnZXRNb2RlbCgpKS51bmNhY2hlTGlzdCgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gbGlzdElzQ2FjaGVkKCkgewotICAgICAgICByZXR1cm4gKChDYWNoaW5nQ29tYm9Cb3hNb2RlbCkgZ2V0TW9kZWwoKSkuaXNDYWNoZWQoKTsKLSAgICB9Ci0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBQdWJsaWMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIGludCBsb25nTGlzdFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxvbmdMaXN0U2l6ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9uZ0xpc3RTaXplKGludCBuZXdMb25nTGlzdFNpemUpIHsKLQkJaW50IG9sZExvbmdMaXN0U2l6ZSA9IHRoaXMubG9uZ0xpc3RTaXplOwotCQl0aGlzLmxvbmdMaXN0U2l6ZSA9IG5ld0xvbmdMaXN0U2l6ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2UoTE9OR19MSVNUX1NJWkVfUFJPUEVSVFksIG9sZExvbmdMaXN0U2l6ZSwgbmV3TG9uZ0xpc3RTaXplKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDaG9vc2FibGUoKSB7Ci0JCXJldHVybiB0aGlzLmNob29zYWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2hvb3NhYmxlKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHRoaXMuY2hvb3NhYmxlOwotCQl0aGlzLmNob29zYWJsZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZShDSE9PU0FCTEVfUFJPUEVSVFksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCXRoaXMudXBkYXRlQXJyb3dCdXR0b24oKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBIYW5kbGUgc2VsZWN0aW5nIG51bGwgYXMgYSB2YWx1ZSAqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwcml2YXRlIGJvb2xlYW4gc2VsZWN0ZWRJbmRleElzTm9uZVNlbGVjdGVkSXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGluZGV4ID09IC0xICYmCi0JCQkJIGdldE1vZGVsKCkuZ2V0U2l6ZSgpID4gMCAmJgotCQkJCSBnZXRNb2RlbCgpLmdldEVsZW1lbnRBdCgwKSA9PSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJbmRleCgpIHsKLSAgICAgICAgYm9vbGVhbiBsaXN0Tm90Q2FjaGVkID0gIWxpc3RJc0NhY2hlZCgpOwotICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotICAgICAgICAgICAgY2FjaGVMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCWludCBpbmRleCA9IHN1cGVyLmdldFNlbGVjdGVkSW5kZXgoKTsKLQotCQkvLyBVc2UgaW5kZXggMCB0byBzaG93IHRoZSA8bm9uZSBzZWxlY3RlZD4gaXRlbSBzaW5jZSB0aGUgYWN0dWFsIHZhbHVlIGlzCi0JCS8vIG51bGwgYW5kIEpDb21ib0JveCBkb2VzIG5vdCBoYW5kbGUgbnVsbCB2YWx1ZXMKLQkJaWYgKHNlbGVjdGVkSW5kZXhJc05vbmVTZWxlY3RlZEl0ZW0oaW5kZXgpKSB7Ci0JCQlpbmRleCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotICAgICAgICAgICAgdW5jYWNoZUxpc3QoKTsKLSAgICAgICAgfQotCQlyZXR1cm4gaW5kZXg7Ci0gICB9Ci0JCi0JLy93cmFwIHRoZSByZW5kZXJlciB0byBkZWFsIHdpdGggdGhlIHByb3RvdHlwZURpc3BsYXlWYWx1ZQotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyKGZpbmFsIExpc3RDZWxsUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0gICAgICAgIHN1cGVyLnNldFJlbmRlcmVyKG5ldyBMaXN0Q2VsbFJlbmRlcmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgQ29tcG9uZW50IGdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gcHJvdG90eXBlTGFiZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvdHlwZUxhYmVsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYVJlbmRlcmVyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBNZW1iZXIgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogRGVmaW5lIHRoZSBBUEkgcmVxdWlyZWQgYnkgdGhpcyBMaXN0Q2hvb3NlciB3aGVuIGl0IG11c3QKLQkgKiBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGFuIGl0ZW0gZnJvbSB0aGUgImxvbmciIGxpc3QuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXN0QnJvd3NlciAKLQl7Ci0JCS8qKgotCQkgKiBQcm9tcHQgdGhlIHVzZXIgdG8gbWFrZSBhIHNlbGVjdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQKLQkJICogY29tYm8tYm94J3MgbW9kZWwuCi0JCSAqLwotCQl2b2lkIGJyb3dzZShMaXN0Q2hvb3NlciBwYXJlbnRDaG9vc2VyKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUnVubmFibGUgY2xhc3MgdGhhdCBjb25zdW1lcyBwb3B1cCB3aW5kb3cgYW5kIGRldGVybWluZXMgd2hldGhlcgotCSAqIHRvIHJlc2hvdyBwb3B1cCBvciB0byBsYXVuY2ggYnJvd3NlciwgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQb3B1cEhhbmRsZXIKLQkJaW1wbGVtZW50cyBSdW5uYWJsZQotCXsKLQkJLyoqIFRoZSBtb3VzZSBldmVudCAqLwotCQlwcml2YXRlIE1vdXNlRXZlbnQgbGFzdE1vdXNlRXZlbnQ7Ci0JCQotCQkvKiogVGhlIGNvbXBvbmVudCBmcm9tIHdoaWNoIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBKQ29tcG9uZW50IGV2ZW50Q29tcG9uZW50OwotCQkKLQkJLyoqIFRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcG9uZW50IGF0IHRoZSB0aW1lIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBQb2ludCBjb21wb25lbnRMb2NhdGlvbjsKLQkJCi0JCS8qKiBUaGUgbG9jYXRpb24gb2YgdGhlIG1vdXNlIGF0IHRoZSB0aW1lIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBQb2ludCBtb3VzZUxvY2F0aW9uOwotCQkKLQkJCi0JCVBvcHVwSGFuZGxlcigpIHsKLQkJCXRoaXMuaW5pdGlhbGl6ZSgpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCUFXVEV2ZW50IGV2ZW50ID0gRXZlbnRRdWV1ZS5nZXRDdXJyZW50RXZlbnQoKTsKLQkJCQotCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCkgewotCQkJCXRoaXMubGFzdE1vdXNlRXZlbnQgPSAoTW91c2VFdmVudCkgZXZlbnQ7Ci0JCQkJdGhpcy5ldmVudENvbXBvbmVudCA9IChKQ29tcG9uZW50KSB0aGlzLmxhc3RNb3VzZUV2ZW50LmdldFNvdXJjZSgpOwotCQkJCXRoaXMuY29tcG9uZW50TG9jYXRpb24gPSB0aGlzLmV2ZW50Q29tcG9uZW50LmdldExvY2F0aW9uT25TY3JlZW4oKTsKLQkJCQl0aGlzLm1vdXNlTG9jYXRpb24gPSB0aGlzLmxhc3RNb3VzZUV2ZW50LmdldFBvaW50KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmV2ZW50Q29tcG9uZW50ID0gbnVsbDsKLQkJCQl0aGlzLmNvbXBvbmVudExvY2F0aW9uID0gbnVsbDsKLQkJCQl0aGlzLm1vdXNlTG9jYXRpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlMaXN0Q2hvb3Nlci50aGlzLmhpZGVQb3B1cCgpOwotCQkJCi0gICAgICAgICAgICBjYWNoZUxpc3QoKTsKLQkJCWlmIChMaXN0Q2hvb3Nlci50aGlzLmNob29zYWJsZSA9PSB0cnVlKSB7Ci0JCQkJLy8gSWYgdGhlIGNvbWJvIGJveCBtb2RlbCBpcyBvZiBzdWZmaWNpZW50IGxlbmd0aCwgdGhlIGJyb3dzZXIgd2lsbCBiZSBzaG93bi4KLQkJCQkvLyBBc2tpbmcgdGhlIGNvbWJvIGJveCBtb2RlbCBmb3IgaXRzIHNpemUgc2hvdWxkIGJlIGVub3VnaCB0byBlbnN1cmUgdGhhdCAKLQkJCQkvLyAgaXRzIHNpemUgaXMgcmVjYWxjdWxhdGVkLgotCQkJCWlmIChMaXN0Q2hvb3Nlci50aGlzLmdldE1vZGVsKCkuZ2V0U2l6ZSgpID4gTGlzdENob29zZXIudGhpcy5sb25nTGlzdFNpemUpIHsKLQkJCQkJdGhpcy5jaGVja0NvbWJvQm94QnV0dG9uKCk7Ci0JCQkJCUxpc3RDaG9vc2VyLnRoaXMuYnJvd3NlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMaXN0Q2hvb3Nlci50aGlzLnNob3dQb3B1cCgpOwotCQkJCQl0aGlzLmNoZWNrTW91c2VQb3NpdGlvbigpOwotCQkJCX0KLQkJCX0KLSAgICAgICAgICAgIGlmIChsaXN0SXNDYWNoZWQoKSkgewotICAgICAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0JCQkKLQkJCUxpc3RDaG9vc2VyLnRoaXMucG9wdXBBbHJlYWR5SW5Qcm9ncmVzcyA9IGZhbHNlOwotCQl9Ci0JCQotCQkvKiogSWYgdGhpcyBpcyBub3QgZG9uZSwgdGhlIGJ1dHRvbiBuZXZlciBiZWNvbWVzIHVuLXByZXNzZWQgKi8KLQkJcHJpdmF0ZSB2b2lkIGNoZWNrQ29tYm9Cb3hCdXR0b24oKSB7Ci0JCQl0cnkgewotCQkJCUJhc2ljQ29tYm9Cb3hVSSBjb21ib0JveFVpID0gKEJhc2ljQ29tYm9Cb3hVSSkgTGlzdENob29zZXIudGhpcy5nZXRVSSgpOwotCQkJCUpCdXR0b24gYXJyb3dCdXR0b24gPSAoSkJ1dHRvbikgQ2xhc3NUb29scy5maWVsZFZhbHVlKGNvbWJvQm94VWksICJhcnJvd0J1dHRvbiIpOwotCQkJCWFycm93QnV0dG9uLmdldE1vZGVsKCkuc2V0UHJlc3NlZChmYWxzZSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB0aGlzIGlzIGEgaHVnZSBoYWNrIHRvIHRyeSBhbmQgbWFrZSB0aGUgY29tYm8gYm94IGxvb2sgcmlnaHQsCi0JCQkJLy8gc28gaWYgaXQgZG9lc24ndCB3b3JrLCBqdXN0IHN3YWxsb3cgdGhlIGV4Y2VwdGlvbgotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogTW92ZXMgdGhlIG1vdXNlIGJhY2sgdG8gaXRzIG9yaWdpbmFsIHBvc2l0aW9uIGJlZm9yZSBhbnkgamlnZ2VyeSBwb2tlcnkgdGhhdCB3ZSd2ZSBkb25lLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNoZWNrTW91c2VQb3NpdGlvbigpIHsKLQkJCWlmICh0aGlzLmV2ZW50Q29tcG9uZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWZpbmFsIFBvaW50IG5ld0NvbXBvbmVudExvY2F0aW9uID0gdGhpcy5ldmVudENvbXBvbmVudC5nZXRMb2NhdGlvbk9uU2NyZWVuKCk7Ci0JCQlib29sZWFuIGNvbXBvbmVudE1vdmVkID0gCi0JCQkJbmV3Q29tcG9uZW50TG9jYXRpb24ueCAtIHRoaXMuY29tcG9uZW50TG9jYXRpb24ueCAhPSAwCi0JCQkJfHwgbmV3Q29tcG9uZW50TG9jYXRpb24ueSAtIHRoaXMuY29tcG9uZW50TG9jYXRpb24ueSAhPSAwOwotCQkJCi0JCQlpZiAoY29tcG9uZW50TW92ZWQpIHsKLQkJCQl0cnkgewotCQkJCQluZXcgUm9ib3QoKS5tb3VzZU1vdmUoCi0JCQkJCQluZXdDb21wb25lbnRMb2NhdGlvbi54ICsgdGhpcy5tb3VzZUxvY2F0aW9uLngsCi0JCQkJCQluZXdDb21wb25lbnRMb2NhdGlvbi55ICsgdGhpcy5tb3VzZUxvY2F0aW9uLnkKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEFXVEV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBtb3ZlIGZhaWxlZCAtIGRvIG5vdGhpbmcKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTm9kZVNlbGVjdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTm9kZVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YjRkMTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL05vZGVTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotLyoqCi0gKiBUaGlzIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBGMyBvciBjaG9vc2VzCi0gKiAnR28gVG8nIGluIHRoZSBjb250ZXh0IG1lbnUKLSAqLwotcHVibGljIGludGVyZmFjZSBOb2RlU2VsZWN0b3IgCi17ICAgICAgIAotICAgIC8qKgotICAgICAqIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgTm9kZSBpbiB0aGUgdHJlZSBvciB0aGUgZWRpdG9yIHBhbmVsLgotICAgICAqLwotICAgIHZvaWQgc2VsZWN0Tm9kZUZvcihPYmplY3QgaXRlbSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBOb2RlU2VsZWN0b3Igd2lsbCBkbyBub3RoaW5nIHdoZW4gc2VsZWN0Tm9kZUZvcihPYmplY3QpIGlzIGNhbGxlZAotICAgICAqLwotICAgIGNsYXNzIERlZmF1bHROb2RlU2VsZWN0b3IgaW1wbGVtZW50cyBOb2RlU2VsZWN0b3IgewotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0Tm9kZUZvcihPYmplY3QgaXRlbSkgewotICAgICAgICAgICAgLy9kZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob25DYWNoaW5nQ29tYm9Cb3hNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTcyMjY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob25DYWNoaW5nQ29tYm9Cb3hNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDYWNoaW5nQ29tYm9Cb3hNb2RlbCBpbnRlcmZhY2UgY2FuIGJlIHVzZWQKLSAqIHdoZW5ldmVyIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGNhY2hpbmcgKGkuZS4gdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWxlY3Rpb24KLSAqIGxpc3QgY2FuIGJlIGdlbmVyYXRlZCB3aXRoIGxpdHRsZSBsYXRlbmN5KS4gQWxsIHRoZSBub3JtYWwgQ29tYm9Cb3hNb2RlbAotICogYmVoYXZpb3IgaXMgZGVsZWdhdGVkIHRvIGEgY2xpZW50LXN1cHBsaWVkIENvbWJvQm94TW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBOb25DYWNoaW5nQ29tYm9Cb3hNb2RlbCBpbXBsZW1lbnRzIENhY2hpbmdDb21ib0JveE1vZGVsIHsKLQlwcml2YXRlIENvbWJvQm94TW9kZWwgd3JhcHBlZENvbWJvQm94TW9kZWw7Ci0KLQlwdWJsaWMgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwoQ29tYm9Cb3hNb2RlbCB3cmFwcGVkQ29tYm9Cb3hNb2RlbCkgewotCQl0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsID0gd3JhcHBlZENvbWJvQm94TW9kZWw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhY2hpbmdDb21ib0JveE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGNhY2hlTGlzdCgpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgdW5jYWNoZUxpc3QoKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2FjaGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbWJvQm94TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJdGVtKE9iamVjdCBhbkl0ZW0pIHsKLQkJdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbC5zZXRTZWxlY3RlZEl0ZW0oYW5JdGVtKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIHRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwuZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsLmdldFNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0RGF0YUxpc3RlbmVyKExpc3REYXRhTGlzdGVuZXIgbCkgewotCQl0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsLmFkZExpc3REYXRhTGlzdGVuZXIobCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihMaXN0RGF0YUxpc3RlbmVyIGwpIHsKLQkJdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbC5yZW1vdmVMaXN0RGF0YUxpc3RlbmVyKGwpOwotCX0gIAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlRGlzcGxheWFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVEaXNwbGF5YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDZkOGUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVEaXNwbGF5YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIERpc3BsYXlhYmxlIGNvbnZlcnRzIGFueSBPYmplY3QKLSAqIHRvIGEgRGlzcGxheWFibGUuIFN1YmNsYXNzIGl0IHRvIG92ZXJyaWRlICNkaXNwbGF5U3RyaW5nKCkgYW5kCi0gKiAjaWNvbigpIGlmIG5lY2Vzc2FyeS4gQ2hhbmdlIG5vdGlmaWNhdGlvbiB3aWxsIGJlIGZpcmVkIGlmIHRoZQotICogb2JqZWN0IGlzIGNoYW5nZWQuCi0gKiAKLSAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIFN0cmluZ3MgLSB0aGUgZGlzcGxheSBzdHJpbmcKLSAqIHdpbGwgc2ltcGx5IGJlIHRoZSBTdHJpbmcgaXRzZWxmLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlRGlzcGxheWFibGUKLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIERpc3BsYXlhYmxlCi17Ci0JLyoqIFRoZSBvYmplY3QgdG8gYmUgY29udmVydGVkIHRvIGEgRGlzcGxheWFibGUuICovCi0JcHJvdGVjdGVkIE9iamVjdCBvYmplY3Q7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGRpc3BsYXlhYmxlIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoT2JqZWN0IG9iamVjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoYm9vbGVhbiBiKSB7Ci0JCXRoaXMoQm9vbGVhbi52YWx1ZU9mKGIpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoY2hhciBjKSB7Ci0JCXRoaXMobmV3IENoYXJhY3RlcihjKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGJ5dGUgYikgewotCQl0aGlzKG5ldyBCeXRlKGIpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoc2hvcnQgcykgewotCQl0aGlzKG5ldyBTaG9ydChzKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGludCBpKSB7Ci0JCXRoaXMobmV3IEludGVnZXIoaSkpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShsb25nIGwpIHsKLQkJdGhpcyhuZXcgTG9uZyhsKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGZsb2F0IGYpIHsKLQkJdGhpcyhuZXcgRmxvYXQoZikpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShkb3VibGUgZCkgewotCQl0aGlzKG5ldyBEb3VibGUoZCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEaXNwbGF5YWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBJY29uIGljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKERpc3BsYXlhYmxlIG8pIHsKLQkJcmV0dXJuIERFRkFVTFRfQ09NUEFSQVRPUi5jb21wYXJlKHRoaXMsIG8pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgb2xkRGlzcGxheVN0cmluZyA9IHRoaXMuZGlzcGxheVN0cmluZygpOwotCQlJY29uIG9sZEljb24gPSB0aGlzLmljb24oKTsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgb2xkRGlzcGxheVN0cmluZywgdGhpcy5kaXNwbGF5U3RyaW5nKCkpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSUNPTl9QUk9QRVJUWSwgb2xkSWNvbiwgdGhpcy5pY29uKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oKSB7Ci0JCXJldHVybiAoKEJvb2xlYW4pIHRoaXMub2JqZWN0KS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb29sZWFuKGJvb2xlYW4gYikgewotCQl0aGlzLnNldE9iamVjdChCb29sZWFuLnZhbHVlT2YoYikpOwotCX0KLQotCXB1YmxpYyBjaGFyIGdldENoYXIoKSB7Ci0JCXJldHVybiAoKENoYXJhY3RlcikgdGhpcy5vYmplY3QpLmNoYXJWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoYXIoY2hhciBjKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KG5ldyBDaGFyYWN0ZXIoYykpOwotCX0KLQotCXB1YmxpYyBieXRlIGdldEJ5dGUoKSB7Ci0JCXJldHVybiAoKEJ5dGUpIHRoaXMub2JqZWN0KS5ieXRlVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCeXRlKGJ5dGUgYikgewotCQl0aGlzLnNldE9iamVjdChuZXcgQnl0ZShiKSk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldFNob3J0KCkgewotCQlyZXR1cm4gKChTaG9ydCkgdGhpcy5vYmplY3QpLnNob3J0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaG9ydChzaG9ydCBzKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KG5ldyBTaG9ydChzKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbnQoKSB7Ci0JCXJldHVybiAoKEludGVnZXIpIHRoaXMub2JqZWN0KS5pbnRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludChpbnQgaSkgewotCQl0aGlzLnNldE9iamVjdChuZXcgSW50ZWdlcihpKSk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0TG9uZygpIHsKLQkJcmV0dXJuICgoTG9uZykgdGhpcy5vYmplY3QpLmxvbmdWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvbmcobG9uZyBsKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KG5ldyBMb25nKGwpKTsKLQl9Ci0KLQlwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoKSB7Ci0JCXJldHVybiAoKEZsb2F0KSB0aGlzLm9iamVjdCkuZmxvYXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZsb2F0KGZsb2F0IGYpIHsKLQkJdGhpcy5zZXRPYmplY3QobmV3IEZsb2F0KGYpKTsKLQl9Ci0KLQlwdWJsaWMgZG91YmxlIGdldERvdWJsZSgpIHsKLQkJcmV0dXJuICgoRG91YmxlKSB0aGlzLm9iamVjdCkuZG91YmxlVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb3VibGUoZG91YmxlIGQpIHsKLQkJdGhpcy5zZXRPYmplY3QobmV3IERvdWJsZShkKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5vYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZUxpc3RCcm93c2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdEJyb3dzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxNWM2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdEJyb3dzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBMaXN0Q2hvb3Nlci5Ccm93c2VyIHVzZXMgYQotICogSk9wdGlvblBhbmUgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciB0aGUgc2VsZWN0aW9uLiBTdWJjbGFzc2VzIAotICogY2FuIGNoYW5nZSB0aGUgZGlhbG9nJ3MgdGl0bGUsIG1lc3NhZ2UsIGFuZC9vciBpY29uLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlTGlzdEJyb3dzZXIKLQlpbXBsZW1lbnRzIExpc3RDaG9vc2VyLkxpc3RCcm93c2VyIAotewotCS8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yICovCi0JcHJvdGVjdGVkIFNpbXBsZUxpc3RCcm93c2VyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBQcm9tcHQgdGhlIHVzZXIgdXNpbmcgYSBKT3B0aW9uUGFuZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBicm93c2UoTGlzdENob29zZXIgY2hvb3NlcikgewotCQlPYmplY3Qgc2VsZWN0aW9uID0gCi0JCQlKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2coCi0JCQkJY2hvb3NlciwgCi0JCQkJdGhpcy5tZXNzYWdlKGNob29zZXIpLCAKLQkJCQl0aGlzLnRpdGxlKGNob29zZXIpLCAKLQkJCQl0aGlzLm1lc3NhZ2VUeXBlKGNob29zZXIpLCAKLQkJCQl0aGlzLmljb24oY2hvb3NlciksIAotCQkJCXRoaXMuc2VsZWN0aW9uVmFsdWVzKGNob29zZXIpLCAKLQkJCQl0aGlzLmluaXRpYWxTZWxlY3Rpb25WYWx1ZShjaG9vc2VyKQotCQkJKTsKLQkJCi0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJY2hvb3Nlci5nZXRNb2RlbCgpLnNldFNlbGVjdGVkSXRlbShzZWxlY3Rpb24pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgbWVzc2FnZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGUoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IG1lc3NhZ2VUeXBlKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEljb24gaWNvbihKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3RbXSBzZWxlY3Rpb25WYWx1ZXMoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRUb0FycmF5KGNvbWJvQm94LmdldE1vZGVsKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb25WYWx1ZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIGNvbWJvQm94LmdldE1vZGVsKCkuZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGxpc3Qgb2Ygb2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkIGxpc3QgbW9kZWwKLQkgKiBpbnRvIGFuIGFycmF5LgotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSBjb252ZXJ0VG9BcnJheShMaXN0TW9kZWwgbW9kZWwpIHsKLQkJaW50IHNpemUgPSBtb2RlbC5nZXRTaXplKCk7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3Rbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBtb2RlbC5nZXRFbGVtZW50QXQoaSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdENlbGxSZW5kZXJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZUxpc3RDZWxsUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjZjVkMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdENlbGxSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi0vKioKLSAqIFRoaXMgcmVuZGVyZXIgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZSBhcyB0aGUgRGVmYXVsdExpc3RDZWxsUmVuZGVyZXI7Ci0gKiBidXQgaXQgc2xpZ2h0bHkgcmVmYWN0b3JzIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgaWNvbiBhbmQgdGV4dCBvZiB0aGUgbGlzdAotICogY2VsbCBzbyB0aGF0IHN1YmNsYXNzZXMgY2FuIGVhc2lseSBvdmVycmlkZSB0aGUgbWV0aG9kcyB0aGF0IGJ1aWxkCi0gKiB0aGUgaWNvbiBhbmQgdGV4dC4KLSAqIAotICogSW4gbW9zdCBjYXNlcywgeW91IG5lZWQgb25seSBvdmVycmlkZToKLSAqICAgICAjYnVpbGRJY29uKE9iamVjdCB2YWx1ZSkKLSAqICAgICAjYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIKLQlleHRlbmRzIERlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyCi17Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzaW1wbGUgcmVuZGVyZXIuCi0JICovCi0JcHVibGljIFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCS8vIHN1YnN0aXR1dGUgbnVsbCBmb3IgdGhlIGNlbGwgdmFsdWUgc28gbm90aGluZyBpcyBkcmF3biBpbml0aWFsbHkuLi4KLQkJc3VwZXIuZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChsaXN0LCBudWxsLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKTsKLQkJdGhpcy5zZXRPcGFxdWUodHJ1ZSk7Ci0KLQkJLy8gLi4udGhlbiBzZXQgdGhlIGljb24gYW5kIHRleHQgbWFudWFsbHkKLQkJdGhpcy5zZXRJY29uKHRoaXMuYnVpbGRJY29uKGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKSk7Ci0JCXRoaXMuc2V0VGV4dCh0aGlzLmJ1aWxkVGV4dChsaXN0LCB2YWx1ZSwgaW5kZXgsIGlzU2VsZWN0ZWQsIGNlbGxIYXNGb2N1cykpOwotCi0JCXRoaXMuc2V0VG9vbFRpcFRleHQodGhpcy5idWlsZFRvb2xUaXBUZXh0KGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKSk7Ci0KLQkJLy8gdGhlIGNvbnRleHQgd2lsbCBiZSBpbml0aWFsaXplZCBvbmx5IGlmIGEgcmVhZGVyIGlzIHJ1bm5pbmcKLQkJaWYgKHRoaXMuYWNjZXNzaWJsZUNvbnRleHQgIT0gbnVsbCkgewotCQkJdGhpcy5hY2Nlc3NpYmxlQ29udGV4dC5zZXRBY2Nlc3NpYmxlTmFtZSh0aGlzLmJ1aWxkQWNjZXNzaWJsZU5hbWUobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpKTsKLQkJfQotCi0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaWNvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZSBhbmQgb3RoZXIgc2V0dGluZ3MuIChFdmVuIG1vcmUgc2V0dGluZ3MgYXJlCi0JICogYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIEljb24gYnVpbGRJY29uKEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSWNvbih2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpY29uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY2VsbAotCSAqIHZhbHVlLiBUaGUgZGVmYXVsdCBpcyB0byBkaXNwbGF5IG5vIGljb24gYXQgYWxsIHVubGVzcyB0aGUKLQkgKiB2YWx1ZSBpdHNlbGYgaXMgYW4gaWNvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSWNvbiBidWlsZEljb24oT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIHJlcGxpY2F0ZSB0aGUgZGVmYXVsdCBiZWhhdmlvcgotCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgSWNvbikgPyAoSWNvbikgdmFsdWUgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZSBhbmQgb3RoZXIgc2V0dGluZ3MuIChFdmVuIG1vcmUgc2V0dGluZ3MgYXJlCi0JICogYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUZXh0KHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjZWxsCi0JICogdmFsdWUuIFRoZSBkZWZhdWx0IGlzIHRvIGRpc3BsYXkgdGhlIG9iamVjdCdzIGRlZmF1bHQgc3RyaW5nCi0JICogcmVwcmVzZW50YXRpb24gKGFzIHJldHVybmVkIGJ5ICN0b1N0cmluZygpKTsgdW5sZXNzIHRoZQotCSAqIHZhbHVlIGl0c2VsZiBpcyBhbiBpY29uLCBpbiB3aGljaCBjYXNlIG5vIHRleHQgaXMgZGlzcGxheWVkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgSWNvbikgPyAiIiA6ICgodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCBkaXNwbGF5ZWQgd2hlbiB0aGUgY3Vyc29yIGxpbmdlcnMgb3ZlciB0aGUgc3BlY2lmaWVkIGNlbGwuCi0JICogKEV2ZW4gbW9yZSBzZXR0aW5ncyBhcmUgYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRvb2xUaXBUZXh0KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVG9vbFRpcFRleHQodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCBkaXNwbGF5ZWQgd2hlbiB0aGUgY3Vyc29yIGxpbmdlcnMgb3ZlciB0aGUgc3BlY2lmaWVkIGNlbGwuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRvb2xUaXBUZXh0KE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFjY2Vzc2libGUgbmFtZSB0byBiZSBnaXZlbiB0byB0aGUgY29tcG9uZW50IHVzZWQgdG8gcmVuZGVyCi0JICogdGhlIGdpdmVuIHZhbHVlIGFuZCBvdGhlciBzZXR0aW5ncy4gKEV2ZW4gbW9yZSBzZXR0aW5ncyBhcmUgYWNjZXNzaWJsZSB2aWEKLQkgKiBpbmhlcml0ZWQgZ2V0dGVyczogaGFzRm9jdXMsIGlzRW5hYmxlZCwgZXRjLikKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQWNjZXNzaWJsZU5hbWUoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRBY2Nlc3NpYmxlTmFtZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY2Nlc3NpYmxlIG5hbWUgdG8gYmUgZ2l2ZW4gdG8gdGhlIGNvbXBvbmVudCB1c2VkIHRvIHJlbmRlcgotCSAqIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQWNjZXNzaWJsZU5hbWUoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NwaW5uZXJUYWJsZUNlbGxSZW5kZXJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NwaW5uZXJUYWJsZUNlbGxSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDA3MWU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TcGlubmVyVGFibGVDZWxsUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotCi1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkpTcGlubmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogTWFrZSB0aGUgY2VsbCBsb29rIGxpa2UgYSBzcGlubmVyLgotICovCi1wdWJsaWMgY2xhc3MgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudHMgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciB7Ci0KLQkvKiogdGhlIGNvbXBvbmVudCB1c2VkIHRvIHBhaW50IHRoZSBjZWxsICovCi0JcHJvdGVjdGVkIEpTcGlubmVyIHNwaW5uZXI7Ci0JCi0JLyoqIHRoZSBsaXN0ZW5lciB0byBiZSBub3RpZmllZCBvbiBhbiBpbW1lZGlhdGUgZWRpdCAqLwotCXByb3RlY3RlZCBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLkltbWVkaWF0ZUVkaXRMaXN0ZW5lciBpbW1lZGlhdGVFZGl0TGlzdGVuZXI7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB0aGF0IHVzZXMgdGhlIGRlZmF1bHQKLQkgKiBzcGlubmVyIG1vZGVsLCB3aGljaCBpcyBhICJudW1iZXIiIG1vZGVsLgotCSAqLwotCXB1YmxpYyBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQKLQkgKiBzcGlubmVyIG1vZGVsLCB3aGljaCB3aWxsIGRldGVybWluZSBob3cgdGhlIHZhbHVlcyBhcmUgZGlzcGxheWVkLgotCSAqLwotCXB1YmxpYyBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIoU3Bpbm5lck1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5zZXRNb2RlbChtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5zcGlubmVyID0gdGhpcy5idWlsZFNwaW5uZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSlNwaW5uZXIgYnVpbGRTcGlubmVyKCkgewotCQlKU3Bpbm5lciBzID0gbmV3IEpTcGlubmVyKCk7Ci0JCXMuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCkpOwotCQlyZXR1cm4gczsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyLmltbWVkaWF0ZUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJdGhpcy5zcGlubmVyLnNldENvbXBvbmVudE9yaWVudGF0aW9uKHRhYmxlLmdldENvbXBvbmVudE9yaWVudGF0aW9uKCkpOwotCQl0aGlzLnNwaW5uZXIuc2V0Rm9udCh0YWJsZS5nZXRGb250KCkpOwotCQl0aGlzLnNwaW5uZXIuc2V0RW5hYmxlZCh0YWJsZS5pc0VuYWJsZWQoKSk7Ci0KLQkJSkNvbXBvbmVudCBlZGl0b3IgPSB0aGlzLmVkaXRvcigpOwotCQllZGl0b3Iuc2V0Rm9yZWdyb3VuZCh0aGlzLmZvcmVncm91bmRDb2xvcih0YWJsZSwgdmFsdWUsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQkJZWRpdG9yLnNldEJhY2tncm91bmQodGhpcy5iYWNrZ3JvdW5kQ29sb3IodGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCXRoaXMuc3Bpbm5lci5zZXRCb3JkZXIodGhpcy5ib3JkZXIodGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0KLQkJdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXJldHVybiB0aGlzLnNwaW5uZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgZm9yZWdyb3VuZCBjb2xvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sb3IgZm9yZWdyb3VuZENvbG9yKEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlLmZvY3VzQ2VsbEZvcmVncm91bmQiKTsKLQkJCX0KLQkJCXJldHVybiB0YWJsZS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7Ci0JCX0KLQkJcmV0dXJuIHRhYmxlLmdldEZvcmVncm91bmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBiYWNrZ3JvdW5kIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2xvciBiYWNrZ3JvdW5kQ29sb3IoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuZm9jdXNDZWxsQmFja2dyb3VuZCIpOwotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkJhY2tncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gdGFibGUuZ2V0QmFja2dyb3VuZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJvcmRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9yZGVyIGJvcmRlcihKVGFibGUgdGFibGUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQlpZiAoaGFzRm9jdXMpIHsKLQkJCXJldHVybiBVSU1hbmFnZXIuZ2V0Qm9yZGVyKCJUYWJsZS5mb2N1c0NlbGxIaWdobGlnaHRCb3JkZXIiKTsKLQkJfQotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCXJldHVybiBCb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIodGFibGUuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpLCAxKTsKLQkJfQotCQlyZXR1cm4gQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKHRhYmxlLmdldEJhY2tncm91bmQoKSwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlZGl0b3IgY29tcG9uZW50IHdob3NlIGNvbG9ycyBzaG91bGQgYmUgc2V0Ci0JICogYnkgdGhlIHJlbmRlcmVyLgotCSAqLwotCXByb3RlY3RlZCBKQ29tcG9uZW50IGVkaXRvcigpIHsKLQkJSkNvbXBvbmVudCBlZGl0b3IgPSB0aGlzLnNwaW5uZXIuZ2V0RWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBKU3Bpbm5lci5EZWZhdWx0RWRpdG9yKSB7Ci0JCQkvLyB0eXBpY2FsbHksIHRoZSBlZGl0b3Igd2lsbCBiZSB0aGUgZGVmYXVsdCBvciBvbmUgb2YgaXRzIHN1YmNsYXNzZXMuLi4KLQkJCWVkaXRvciA9ICgoSlNwaW5uZXIuRGVmYXVsdEVkaXRvcikgZWRpdG9yKS5nZXRUZXh0RmllbGQoKTsKLQkJfQotCQlyZXR1cm4gZWRpdG9yOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3Bpbm5lcidzIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIENSIzM5OTkzMTggLSBUaGlzIG51bGwgY2hlY2sgbmVlZHMgdG8gYmUgcmVtb3ZlZCBvbmNlIEpESyBidWcgaXMgZml4ZWQKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gbmV3IEludGVnZXIoMCk7Ci0JCX0KLQkJdGhpcy5zcGlubmVyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5zcGlubmVyLmdldFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEltbWVkaWF0ZUVkaXRMaXN0ZW5lcihUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLkltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgc3Bpbm5lcidzIG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKFNwaW5uZXJNb2RlbCBtb2RlbCkgewotCQl0aGlzLnNwaW5uZXIuc2V0TW9kZWwobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVuZGVyZXIncyBwcmVmZXJyZWQgaGVpZ2h0LiBUaGlzIGFsbG93cyB5b3UKLQkgKiB0byBzZXQgdGhlIHJvdyBoZWlnaHQgdG8gc29tZXRoaW5nIHRoZSBzcGlubmVyIHdpbGwgbG9vayBnb29kIGluLi4uLgotCSAqLwotCXB1YmxpYyBpbnQgcHJlZmVycmVkSGVpZ2h0KCkgewotCQkvLyBhZGQgaW4gc3BhY2UgZm9yIHRoZSBib3JkZXIgdG9wIGFuZCBib3R0b20KLQkJcmV0dXJuIChpbnQpIHRoaXMuc3Bpbm5lci5nZXRQcmVmZXJyZWRTaXplKCkuZ2V0SGVpZ2h0KCkgKyAyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1RhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9UYWJsZUNlbGxFZGl0b3JBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMTg2OTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL3N3aW5nL1RhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdENlbGxFZGl0b3I7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ2VsbEVkaXRvcjsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNlbGxSZW5kZXJlcjsKLQotLyoqCi0gKiBBIHRhYmxlIGNlbGwgZWRpdG9yIHRoYXQgd3JhcHMgYSB0YWJsZSBjZWxsIHJlbmRlcmVyLgotICovCi1wdWJsaWMgY2xhc3MgVGFibGVDZWxsRWRpdG9yQWRhcHRlciBleHRlbmRzIEFic3RyYWN0Q2VsbEVkaXRvciBpbXBsZW1lbnRzIFRhYmxlQ2VsbEVkaXRvciB7Ci0KLQkvKiogZGVsZWdhdGUgdG8gYSByZW5kZXJlciAqLwotCXByaXZhdGUgUmVuZGVyZXIgcmVuZGVyZXI7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQotCXByaXZhdGUgVGFibGVDZWxsRWRpdG9yQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCBlZGl0b3IgdGhhdCBiZWhhdmVzIGxpa2UgdGhlIHNwZWNpZmllZCByZW5kZXJlci4KLQkgKi8KLQlwdWJsaWMgVGFibGVDZWxsRWRpdG9yQWRhcHRlcihSZW5kZXJlciByZW5kZXJlcikgewotCQl0aGlzKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShyZW5kZXJlcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUmVuZGVyZXIgcikgewotCQl0aGlzLnJlbmRlcmVyID0gcjsKLQkJci5zZXRJbW1lZGlhdGVFZGl0TGlzdGVuZXIodGhpcy5idWlsZEltbWVkaWF0ZUVkaXRMaXN0ZW5lcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbW1lZGlhdGVFZGl0TGlzdGVuZXIgYnVpbGRJbW1lZGlhdGVFZGl0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSW1tZWRpYXRlRWRpdExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaW1tZWRpYXRlRWRpdCgpIHsKLQkJCQlUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLnRoaXMuc3RvcENlbGxFZGl0aW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogQ2VsbEVkaXRvciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIE9iamVjdCBnZXRDZWxsRWRpdG9yVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlbmRlcmVyLmdldFZhbHVlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsRWRpdG9yQ29tcG9uZW50KEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLnJlbmRlcmVyLmdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIHRydWUsIHJvdywgY29sdW1uKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBNZW1iZXIgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgbWV0aG9kcyB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSByZW5kZXJlcgotCSAqIHRoYXQgY2FuIGJlIHdyYXBwZWQgYnkgYSBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXIgZXh0ZW5kcyBUYWJsZUNlbGxSZW5kZXJlciB7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSByZW5kZXJlci4KLQkJICovCi0JCU9iamVjdCBnZXRWYWx1ZSgpOwotCQkKLQkJLyoqCi0JCSAqIFNldCB0aGUgaW1tZWRpYXRlIGVkaXQgbGlzdGVuZXIKLQkJICovCi0JCXZvaWQgc2V0SW1tZWRpYXRlRWRpdExpc3RlbmVyKEltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JfQotCQotCQotCXB1YmxpYyBpbnRlcmZhY2UgSW1tZWRpYXRlRWRpdExpc3RlbmVyIHsKLQkJCi0JCS8qKgotCQkgKiBDYWxsZWQgd2hlbiB0aGUgcmVuZGVyZXIgZG9lcyBhbiAiaW1tZWRpYXRlIGVkaXQiCi0JCSAqLwotCQl2b2lkIGltbWVkaWF0ZUVkaXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9Nb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2YyZmQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IG1vZGVscyB0aGF0IG5vdGlmeSBsaXN0ZW5lcnMgb2YKLSAqIGNoYW5nZXMgdG8gYm91bmQgcHJvcGVydGllcywgY29sbGVjdGlvbnMsIGxpc3RzLCBhbmQvb3IgdHJlZXMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsIHsKLQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgc3RhdGUgY2hhbmdlIGV2ZW50cy4KLQkgKiBUaGUgc2FtZSBsaXN0ZW5lciBtYXkgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UgYW5kIHdpbGwgYmUgY2FsbGVkCi0JICogYXMgbWFueSB0aW1lcyBhcyBpdCBpcyBhZGRlZC4gVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHN0YXRlIGNoYW5nZSBsaXN0ZW5lci4gSWYgdGhlIGxpc3RlbmVyCi0JICogd2FzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLCBpdCB3aWxsIGJlIG5vdGlmaWVkIG9uZSBsZXNzIHRpbWUKLQkgKiBhZnRlciBiZWluZyByZW1vdmVkLiBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlCi0JICogbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzLAotCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb3BlcnR5IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZXZlbnQuCi0JICogVGhlIHNhbWUgbGlzdGVuZXIgbWF5IGJlIGFkZGVkIG1vcmUgdGhhbiBvbmNlIGFuZCB3aWxsIGJlIGNhbGxlZAotCSAqIGFzIG1hbnkgdGltZXMgYXMgaXQgaXMgYWRkZWQuIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHByb3BlcnR5IGNoYW5nZSBldmVudHMgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgbmFtZS4KLQkgKiBUaGUgc2FtZSBsaXN0ZW5lciBtYXkgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UgYW5kIHdpbGwgYmUgY2FsbGVkCi0JICogYXMgbWFueSB0aW1lcyBhcyBpdCBpcyBhZGRlZC4gVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgcHJvcGVydHkgY2hhbmdlIGV2ZW50cywKLQkgKiByZWdhcmRsZXNzIG9mIHRoZSBwcm9wZXJ0eSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGV2ZW50LgotCSAqIElmIHRoZSBsaXN0ZW5lciB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UsIGl0IHdpbGwgYmUgbm90aWZpZWQgb25lIGxlc3MKLQkgKiB0aW1lIGFmdGVyIGJlaW5nIHJlbW92ZWQuIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUKLQkgKiBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lLgotCSAqIElmIHRoZSBsaXN0ZW5lciB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UsIGl0IHdpbGwgYmUgbm90aWZpZWQgb25lIGxlc3MKLQkgKiB0aW1lIGFmdGVyIGJlaW5nIHJlbW92ZWQuIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUKLQkgKiBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzLAotCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbGxlY3Rpb24gbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBldmVudC4KLQkgKiBUaGUgc2FtZSBsaXN0ZW5lciBtYXkgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UgYW5kIHdpbGwgYmUgY2FsbGVkCi0JICogYXMgbWFueSB0aW1lcyBhcyBpdCBpcyBhZGRlZC4gVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cyB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG5hbWUuCi0JICogVGhlIHNhbWUgbGlzdGVuZXIgbWF5IGJlIGFkZGVkIG1vcmUgdGhhbiBvbmNlIGFuZCB3aWxsIGJlIGNhbGxlZAotCSAqIGFzIG1hbnkgdGltZXMgYXMgaXQgaXMgYWRkZWQuIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cywKLQkgKiByZWdhcmRsZXNzIG9mIHRoZSBjb2xsZWN0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZXZlbnQuCi0JICogSWYgdGhlIGxpc3RlbmVyIHdhcyBhZGRlZCBtb3JlIHRoYW4gb25jZSwgaXQgd2lsbCBiZSBub3RpZmllZCBvbmUgbGVzcwotCSAqIHRpbWUgYWZ0ZXIgYmVpbmcgcmVtb3ZlZC4gQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZQotCSAqIGxpc3RlbmVyIGlzIG51bGwgb3IgaWYgdGhlIGxpc3RlbmVyIHdhcyBuZXZlciBhZGRlZC4KLQkgKi8KLQl2b2lkIHJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBjb2xsZWN0aW9uIGNoYW5nZSBldmVudHMsCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gbmFtZS4KLQkgKiBJZiB0aGUgbGlzdGVuZXIgd2FzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLCBpdCB3aWxsIGJlIG5vdGlmaWVkIG9uZSBsZXNzCi0JICogdGltZSBhZnRlciBiZWluZyByZW1vdmVkLiBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlCi0JICogbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGxpc3QgY2hhbmdlIGV2ZW50cywKLQkgKiByZWdhcmRsZXNzIG9mIHRoZSBsaXN0IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZXZlbnQuCi0JICogVGhlIHNhbWUgbGlzdGVuZXIgbWF5IGJlIGFkZGVkIG1vcmUgdGhhbiBvbmNlIGFuZCB3aWxsIGJlIGNhbGxlZAotCSAqIGFzIG1hbnkgdGltZXMgYXMgaXQgaXMgYWRkZWQuIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBsaXN0IGNoYW5nZSBldmVudHMgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbGlzdCBuYW1lLgotCSAqIFRoZSBzYW1lIGxpc3RlbmVyIG1heSBiZSBhZGRlZCBtb3JlIHRoYW4gb25jZSBhbmQgd2lsbCBiZSBjYWxsZWQKLQkgKiBhcyBtYW55IHRpbWVzIGFzIGl0IGlzIGFkZGVkLiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0Jdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBsaXN0IGNoYW5nZSBldmVudHMsCi0JICogcmVnYXJkbGVzcyBvZiB0aGUgbGlzdCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGV2ZW50LgotCSAqIElmIHRoZSBsaXN0ZW5lciB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UsIGl0IHdpbGwgYmUgbm90aWZpZWQgb25lIGxlc3MKLQkgKiB0aW1lIGFmdGVyIGJlaW5nIHJlbW92ZWQuIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUKLQkgKiBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgbGlzdCBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG5hbWUuCi0JICogSWYgdGhlIGxpc3RlbmVyIHdhcyBhZGRlZCBtb3JlIHRoYW4gb25jZSwgaXQgd2lsbCBiZSBub3RpZmllZCBvbmUgbGVzcwotCSAqIHRpbWUgYWZ0ZXIgYmVpbmcgcmVtb3ZlZC4gQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZQotCSAqIGxpc3RlbmVyIGlzIG51bGwgb3IgaWYgdGhlIGxpc3RlbmVyIHdhcyBuZXZlciBhZGRlZC4KLQkgKi8KLQl2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjaGFuZ2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0cmVlIGNoYW5nZSBldmVudHMsCi0JICogcmVnYXJkbGVzcyBvZiB0aGUgdHJlZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGV2ZW50LgotCSAqIFRoZSBzYW1lIGxpc3RlbmVyIG1heSBiZSBhZGRlZCBtb3JlIHRoYW4gb25jZSBhbmQgd2lsbCBiZSBjYWxsZWQKLQkgKiBhcyBtYW55IHRpbWVzIGFzIGl0IGlzIGFkZGVkLiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0Jdm9pZCBhZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdHJlZSBjaGFuZ2UgZXZlbnRzIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIHRyZWUgbmFtZS4KLQkgKiBUaGUgc2FtZSBsaXN0ZW5lciBtYXkgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UgYW5kIHdpbGwgYmUgY2FsbGVkCi0JICogYXMgbWFueSB0aW1lcyBhcyBpdCBpcyBhZGRlZC4gVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdHJlZSBjaGFuZ2UgZXZlbnRzLAotCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIHRyZWUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBldmVudC4KLQkgKiBJZiB0aGUgbGlzdGVuZXIgd2FzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLCBpdCB3aWxsIGJlIG5vdGlmaWVkIG9uZSBsZXNzCi0JICogdGltZSBhZnRlciBiZWluZyByZW1vdmVkLiBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlCi0JICogbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRyZWUgY2hhbmdlIGV2ZW50cywKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgdHJlZSBuYW1lLgotCSAqIElmIHRoZSBsaXN0ZW5lciB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UsIGl0IHdpbGwgYmUgbm90aWZpZWQgb25lIGxlc3MKLQkgKiB0aW1lIGFmdGVyIGJlaW5nIHJlbW92ZWQuIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUKLQkgKiBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ2hhbmdlRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9DaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzk0MDQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9DaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIGZvciBhbGwgdGhlIGNoYW5nZSBldmVudHMgdGhhdCBjYW4gYmUgZmlyZWQgYnkgbW9kZWxzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2hhbmdlRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNoYW5nZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqLwotCXByb3RlY3RlZCBDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE1vZGVsIGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIChNb2RlbCkgc3VwZXIuZ2V0U291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhc3BlY3Qgb2YgdGhlIHNvdXJjZSB0aGF0IGNoYW5nZWQuCi0JICogTWF5IGJlIG51bGwgaWYgaW5hcHByb3ByaWF0ZS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEFzcGVjdE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBDaGFuZ2VFdmVudCBjbG9uZVdpdGhTb3VyY2UoTW9kZWwgbmV3U291cmNlKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0QXNwZWN0TmFtZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2hhbmdlRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiYWQxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJjb2xsZWN0aW9uIGNoYW5nZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiBjb2xsZWN0aW9uLiBBIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLgotICogCi0gKiBOb3JtYWxseSBhIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBpcyBhY2NvbXBhbmllZCBieSB0aGUgY29sbGVjdGlvbiBuYW1lIGFuZAotICogdGhlIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhlIGNoYW5nZWQgY29sbGVjdGlvbi4KLSAqIAotICogRGVzaWduIG9wdGlvbnM6Ci0gKiAtIGNyZWF0ZSBhIGNvbGxlY3Rpb24gdG8gd3JhcCBhIHNpbmdsZSBhZGRlZCBvciByZW1vdmVkIGl0ZW0KLSAqIAkodGhpcyBpcyB0aGUgb3B0aW9uIHdlIGltcGxlbWVudGVkIGJlbG93IGFuZCBpbiBjb2xsYWJvcmF0aW5nIGNvZGUpCi0gKiAJc2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIG9wdGltaXplIGRvd25zdHJlYW0gY29kZSBmb3IKLSAqIAlzaW5nbGUgaXRlbXMsIHdlIHRha2UgYW5vdGhlciBwZXJmb3JtYW5jZSBoaXQgYnkgYnVpbGRpbmcKLSAqIAlhIGNvbGxlY3Rpb24gZWFjaCB0aW1lICAoQHNlZSBDb2xsZWN0aW9ucyNzaW5nbGV0b24oT2JqZWN0KSkKLSAqIAlhbmQgZm9yY2luZyBkb3duc3RyZWFtIGNvZGUgdG8gdXNlIGFuIGl0ZXJhdG9yIGV2ZXJ5IHRpbWUKLSAqIAotICogLSBmaXJlIGEgc2VwYXJhdGUgZXZlbnQgZm9yIGVhY2ggaXRlbSBhZGRlZCBvciByZW1vdmVkCi0gKiAJZWxpbWluYXRlcyBhbnkgcG90ZW50aWFsIGZvciBvcHRpbWl6YXRpb25zIHRvIGRvd25zdHJlYW0gY29kZQotICogCi0gKiAtIGFkZCBwcm90b2NvbCB0byBzdXBwb3J0IGJvdGggc2luZ2xlIGl0ZW1zIGFuZCBjb2xsZWN0aW9ucwotICogCWFkZHMgY29uZGl0aW9uYWwgbG9naWMgdG8gZG93bnN0cmVhbSBjb2RlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQkvKiogTmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGNoYW5nZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29sbGVjdGlvbk5hbWU7Ci0KLQkvKiogVGhlIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhlIGNvbGxlY3Rpb24uIE1heSBiZSBlbXB0eSwgaWYgbm90IGtub3duLiAqLwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjw/PiBpdGVtczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyB0aGF0IHdlcmUgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gaXRlbXMpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKChjb2xsZWN0aW9uTmFtZSA9PSBudWxsKSB8fCAoaXRlbXMgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29sbGVjdGlvbk5hbWUgPSBjb2xsZWN0aW9uTmFtZTsKLQkJdGhpcy5pdGVtcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBjb2xsZWN0aW9uIGNoYW5nZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXRoaXMoc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbGxlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHRvIG9yCi0JICogcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotCSAqIE1heSBiZSBlbXB0eSBpZiBpbmFwcHJvcHJpYXRlIG9yIHVua25vd24uCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPD8+IGl0ZW1zKCkgewotCQlyZXR1cm4gdGhpcy5pdGVtcy5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB0byBvcgotCSAqIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGlvbi4KLQkgKiBNYXkgYmUgMCBpZiBpbmFwcHJvcHJpYXRlIG9yIHVua25vd24uCi0JICovCi0JcHVibGljIGludCBpdGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZW1zLnNpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGNsb25lV2l0aFNvdXJjZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQobmV3U291cmNlLCB0aGlzLmNvbGxlY3Rpb25OYW1lLCB0aGlzLml0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBjbG9uZVdpdGhTb3VyY2UoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3Q29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQobmV3U291cmNlLCBuZXdDb2xsZWN0aW9uTmFtZSwgdGhpcy5pdGVtcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENoYW5nZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZWZmMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImxpc3QgY2hhbmdlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBvciAiY29uc3RyYWluZWQiIGxpc3QuIEEgTGlzdENoYW5nZUV2ZW50IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSBMaXN0Q2hhbmdlTGlzdGVuZXIuCi0gKiAKLSAqIE5vcm1hbGx5IGEgTGlzdENoYW5nZUV2ZW50IGlzIGFjY29tcGFuaWVkIGJ5IHRoZSBsaXN0IG5hbWUsCi0gKiB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGUgY2hhbmdlZCBsaXN0LAotICogYW5kIHRoZSBpbmRleCBvZiB3aGVyZSB0aGUgaXRlbXMgYXJlIG9yIHdlcmUgaW4gdGhlIGxpc3QuCi0gKiAKLSAqIERlc2lnbiBvcHRpb25zOgotICogLSBjcmVhdGUgYSBsaXN0IHRvIHdyYXAgYSBzaW5nbGUgYWRkZWQgb3IgcmVtb3ZlZCBpdGVtCi0gKiAJKHRoaXMgaXMgdGhlIG9wdGlvbiB3ZSBpbXBsZW1lbnRlZCBiZWxvdyBhbmQgaW4gY29sbGFib3JhdGluZyBjb2RlKQotICogCXNpbmNlIHRoZXJlIGlzIG5vIHdheSB0byBvcHRpbWl6ZSBkb3duc3RyZWFtIGNvZGUgZm9yCi0gKiAJc2luZ2xlIGl0ZW1zLCB3ZSB0YWtlIGFub3RoZXIgcGVyZm9ybWFuY2UgaGl0IGJ5IGJ1aWxkaW5nCi0gKiAJYSBsaXN0IGVhY2ggdGltZSAgKEBzZWUgQ29sbGVjdGlvbnMjc2luZ2xldG9uTGlzdChPYmplY3QpKQotICogCWFuZCBmb3JjaW5nIGRvd25zdHJlYW0gY29kZSB0byB1c2UgYSBsaXN0IGl0ZXJhdG9yIGV2ZXJ5IHRpbWUKLSAqIAotICogLSBmaXJlIGEgc2VwYXJhdGUgZXZlbnQgZm9yIGVhY2ggaXRlbSBhZGRlZCBvciByZW1vdmVkCi0gKiAJZWxpbWluYXRlcyBhbnkgcG90ZW50aWFsIGZvciBvcHRpbWl6YXRpb25zIHRvIGRvd25zdHJlYW0gY29kZQotICogCi0gKiAtIGFkZCBwcm90b2NvbCB0byBzdXBwb3J0IGJvdGggc2luZ2xlIGl0ZW1zIGFuZCBjb2xsZWN0aW9ucwotICogCWFkZHMgY29uZGl0aW9uYWwgbG9naWMgdG8gZG93bnN0cmVhbSBjb2RlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0Q2hhbmdlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQkvKioKLQkgKiBOYW1lIG9mIHRoZSBsaXN0IHRoYXQgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXN0TmFtZTsKLQotCS8qKgotCSAqIFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSBhZGRlZCwgcmVtb3ZlZCwgb3IgcmVwbGFjZWQuCi0JICogSW4gdGhlIGNhc2Ugb2YgIm1vdmVkIiBpdGVtcywgdGhpcyB3aWxsIGJlIHRoZSAidGFyZ2V0IiBpbmRleC4KLQkgKiBNYXkgYmUgLTEsIGlmIG5vdCBrbm93bi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBpbmRleDsKLQotCS8qKgotCSAqIFRoZSBpdGVtcyB0aGF0IHdlcmUgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiBJbiB0aGUgY2FzZSBvZgotCSAqICJyZXBsYWNlZCIgaXRlbXMsIHRoZXNlIGFyZSB0aGUgbmV3IGl0ZW1zIGluIHRoZSBsaXN0LgotCSAqIEluIHRoZSBjYXNlIG9mICJtb3ZlZCIgaXRlbXMsIHRoaXMgd2lsbCBiZSBlbXB0eS4KLQkgKiBNYXkgYmUgZW1wdHksIGlmIG5vdCBrbm93bi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3Q8Pz4gaXRlbXM7Ci0KLQkvKioKLQkgKiBUaGUgaXRlbXMgaW4gdGhlIGxpc3QgdGhhdCB3ZXJlIHJlcGxhY2VkIGJ5IHRoZSBpdGVtcyBsaXN0ZWQgYWJvdmUsCi0JICogaW4gI2l0ZW1zLiBNYXkgYmUgZW1wdHksIGlmIG5vdCBrbm93bi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3Q8Pz4gcmVwbGFjZWRJdGVtczsKLQotCS8qKgotCSAqIEluIHRoZSBjYXNlIG9mICJtb3ZlZCIgaXRlbXMsIHRoaXMgd2lsbCBiZSB0aGUgInNvdXJjZSIgaW5kZXguCi0JICogTWF5IGJlIC0xLCBpZiBub3Qga25vd24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgc291cmNlSW5kZXg7Ci0KLQkvKioKLQkgKiBJbiB0aGUgY2FzZSBvZiAibW92ZWQiIGl0ZW1zLCB0aGlzIHdpbGwgYmUgdGhlIG51bWJlciBvZiBpdGVtcyBtb3ZlZC4KLQkgKiBNYXkgYmUgLTEsIGlmIG5vdCBrbm93bi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBtb3ZlTGVuZ3RoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBpdGVtcywgTGlzdDw/PiByZXBsYWNlZEl0ZW1zLCBpbnQgc291cmNlSW5kZXgsIGludCBtb3ZlTGVuZ3RoKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCWlmICgobGlzdE5hbWUgPT0gbnVsbCkgfHwgKGl0ZW1zID09IG51bGwpIHx8IChyZXBsYWNlZEl0ZW1zID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3ROYW1lID0gbGlzdE5hbWU7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJdGhpcy5pdGVtcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoaXRlbXMpOwotCQl0aGlzLnJlcGxhY2VkSXRlbXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlcGxhY2VkSXRlbXMpOwotCQl0aGlzLnNvdXJjZUluZGV4ID0gc291cmNlSW5kZXg7Ci0JCXRoaXMubW92ZUxlbmd0aCA9IG1vdmVMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgY2hhbmdlIGV2ZW50IGZvciBhIGxpc3Qgb2YgcmVwbGFjZWQgaXRlbXMuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgaW4gdGhlIGxpc3Qgd2VyZSByZXBsYWNlZC4KLQkgKiBAcGFyYW0gaXRlbXMgVGhlIG5ldyBpdGVtcyBpbiB0aGUgbGlzdC4KLQkgKiBAcGFyYW0gcmVwbGFjZWRJdGVtcyBUaGUgaXRlbXMgaW4gdGhlIGxpc3QgdGhhdCB3ZXJlIHJlcGxhY2VkLgotCSAqLwotCXB1YmxpYyBMaXN0Q2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBpdGVtcywgTGlzdDw/PiByZXBsYWNlZEl0ZW1zKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zLCByZXBsYWNlZEl0ZW1zLCAtMSwgLTEpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IGNoYW5nZSBldmVudCBmb3IgYSBsaXN0IG9mIGFkZGVkIG9yIHJlbW92ZWQgaXRlbXMuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhlIGxpc3QuCi0JICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyB0aGF0IHdlcmUgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBMaXN0Q2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBpdGVtcykgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBpdGVtcywgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIC0xLCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgY2hhbmdlIGV2ZW50IGZvciBhIGxpc3Qgb2YgbW92ZWQgaXRlbXMuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIHRhcmdldEluZGV4IFRoZSBpbmRleCB0byB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4KLQkgKiBAcGFyYW0gc291cmNlSW5kZXggVGhlIGluZGV4IGZyb20gd2hpY2ggdGhlIGl0ZW1zIHdlcmUgbW92ZWQuCi0JICovCi0JcHVibGljIExpc3RDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJdGhpcyhzb3VyY2UsIGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIExpc3RDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSkgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIC0xLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIC0xLCAtMSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3ROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5saXN0TmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3ROYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgYWRkZWQgdG8sIHJlbW92ZWQgZnJvbSwKLQkgKiBvciByZXBsYWNlZCBpbiB0aGUgbGlzdC4KLQkgKiBJbiB0aGUgY2FzZSBvZiAibW92ZWQiIGl0ZW1zLCB0aGlzIHdpbGwgYmUgdGhlICJ0YXJnZXQiIGluZGV4LgotCSAqIE1heSBiZSAtMSBpZiBpbmFwcHJvcHJpYXRlIG9yIHVua25vd24uCi0JICovCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvbiB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHRvIG9yCi0JICogcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiBJbiB0aGUgY2FzZSBvZiAicmVwbGFjZWQiIGl0ZW1zLCB0aGVzZQotCSAqIGFyZSB0aGUgbmV3IGl0ZW1zIGluIHRoZSBsaXN0LgotCSAqIE1heSBiZSBlbXB0eSBpZiBpbmFwcHJvcHJpYXRlIG9yIHVua25vd24uCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjw/PiBpdGVtcygpIHsKLQkJcmV0dXJuIHRoaXMuaXRlbXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHRvLAotCSAqIHJlbW92ZWQgZnJvbSwgb3IgcmVwbGFjZWQgaW4gdGhlIGxpc3QuCi0JICogTWF5IGJlIDAgaWYgaW5hcHByb3ByaWF0ZSBvciB1bmtub3duLgotCSAqLwotCXB1YmxpYyBpbnQgaXRlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5pdGVtcy5zaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlcGxhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvbiB0aGUgaXRlbXMgaW4gdGhlIGxpc3QgdGhhdCB3ZXJlIHJlcGxhY2VkLgotCSAqIE1heSBiZSBlbXB0eSBpZiBpbmFwcHJvcHJpYXRlIG9yIHVua25vd24uCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjw/PiByZXBsYWNlZEl0ZW1zKCkgewotCQlyZXR1cm4gdGhpcy5yZXBsYWNlZEl0ZW1zLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb3ZlICoqKioqKioqKioKLQotCS8qKgotCSAqIEluIHRoZSBjYXNlIG9mICJtb3ZlZCIgaXRlbXMsIHRoaXMgd2lsbCBiZSB0aGUgInRhcmdldCIgaW5kZXguCi0JICogTWF5IGJlIC0xIGlmIGluYXBwcm9wcmlhdGUgb3IgdW5rbm93bi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhcmdldEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5pbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBJbiB0aGUgY2FzZSBvZiAibW92ZWQiIGl0ZW1zLCB0aGlzIHdpbGwgYmUgdGhlICJzb3VyY2UiIGluZGV4LgotCSAqIE1heSBiZSAtMSBpZiBpbmFwcHJvcHJpYXRlIG9yIHVua25vd24uCi0JICovCi0JcHVibGljIGludCBnZXRTb3VyY2VJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuc291cmNlSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogSW4gdGhlIGNhc2Ugb2YgIm1vdmVkIiBpdGVtcywgdGhpcyB3aWxsIGJlIHRoZSBudW1iZXIgb2YgaXRlbXMgbW92ZWQuCi0JICogTWF5IGJlIC0xIGlmIGluYXBwcm9wcmlhdGUgb3IgdW5rbm93bi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1vdmVMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLm1vdmVMZW5ndGg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3RDaGFuZ2VFdmVudCBjbG9uZVdpdGhTb3VyY2UoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUV2ZW50KG5ld1NvdXJjZSwgdGhpcy5saXN0TmFtZSwgdGhpcy5pbmRleCwgdGhpcy5pdGVtcywgdGhpcy5yZXBsYWNlZEl0ZW1zLCB0aGlzLnNvdXJjZUluZGV4LCB0aGlzLm1vdmVMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdENoYW5nZUV2ZW50IGNsb25lV2l0aFNvdXJjZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VFdmVudChuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCB0aGlzLmluZGV4LCB0aGlzLml0ZW1zLCB0aGlzLnJlcGxhY2VkSXRlbXMsIHRoaXMuc291cmNlSW5kZXgsIHRoaXMubW92ZUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgbGlzdCBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgbGlzdCBuYW1lIGFuZCBkaXNwbGFjaW5nCi0JICogdGhlIGluZGV4IGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LgotCSAqLwotCXB1YmxpYyBMaXN0Q2hhbmdlRXZlbnQgY2xvbmVXaXRoU291cmNlKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUV2ZW50KG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIHRoaXMuaW5kZXggKyBvZmZzZXQsIHRoaXMuaXRlbXMsIHRoaXMucmVwbGFjZWRJdGVtcywgdGhpcy5zb3VyY2VJbmRleCArIG9mZnNldCwgdGhpcy5tb3ZlTGVuZ3RoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Qcm9wZXJ0eUNoYW5nZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTJmYTJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9ldmVudC9Qcm9wZXJ0eUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgInByb3BlcnR5IGNoYW5nZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiBwcm9wZXJ0eS4gQSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFuZ2VFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQotCS8qKiBOYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lOwotCi0JLyoqIFRoZSBwcm9wZXJ0eSdzIG9sZCB2YWx1ZSwgYmVmb3JlIHRoZSBjaGFuZ2UuICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0KLQkvKiogVGhlIHByb3BlcnR5J3MgbmV3IHZhbHVlLCBhZnRlciB0aGUgY2hhbmdlLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG5ld1ZhbHVlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gb2xkVmFsdWUgVGhlIG9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0JICogQHBhcmFtIG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5TmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMub2xkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TmV3VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLm5ld1ZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZUV2ZW50IGNsb25lV2l0aFNvdXJjZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KG5ld1NvdXJjZSwgdGhpcy5wcm9wZXJ0eU5hbWUsIHRoaXMub2xkVmFsdWUsIHRoaXMubmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCB0aGUgcHJvcGVydHkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlDaGFuZ2VFdmVudCBjbG9uZVdpdGhTb3VyY2UoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3UHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudChuZXdTb3VyY2UsIG5ld1Byb3BlcnR5TmFtZSwgdGhpcy5vbGRWYWx1ZSwgdGhpcy5uZXdWYWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvU3RhdGVDaGFuZ2VFdmVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1N0YXRlQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJlMzY5MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvU3RhdGVDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgZ2VuZXJpYyAic3RhdGUgY2hhbmdlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgdG8gCi0gKiBzdWNoIGV4dGVudCB0aGF0IGl0IGNhbm5vdCBiZSBkZWxpbmVhdGVkIGFsbCBhc3BlY3RzIG9mIGl0IHRoYXQgaGF2ZSBjaGFuZ2VkLiAKLSAqIEEgU3RhdGVDaGFuZ2VFdmVudCBpcyBzZW50IGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBTdGF0ZUNoYW5nZUxpc3RlbmVyLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgU3RhdGVDaGFuZ2VFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgc3RhdGUgY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIFN0YXRlQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7ICAvLyB0aGUgcG9pbnQgb2YgdGhlIGV2ZW50IGlzIHRoYXQgdGhlIG5hbWUgaXMgdW5rbm93bi4uLgotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdGF0ZUNoYW5nZUV2ZW50IGNsb25lV2l0aFNvdXJjZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUV2ZW50KG5ld1NvdXJjZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNoYW5nZUV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzIwMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJ0cmVlIGNoYW5nZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiB0cmVlLiBBIFRyZWVDaGFuZ2VFdmVudCBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUgVHJlZUNoYW5nZUxpc3RlbmVyLgotICogCi0gKiBOb3JtYWxseSBhIFRyZWVDaGFuZ2VFdmVudCBpcyBhY2NvbXBhbmllZCBieSB0aGUgdHJlZSBuYW1lIGFuZCBhIHBhdGgKLSAqIHRvIHRoZSBwYXJ0IG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlQ2hhbmdlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQkvKiogTmFtZSBvZiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHJlZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBQYXRoIHRvIHRoZSBwYXJlbnQgb2YgdGhlIHBhcnQgb2YgdGhlIHRyZWUgdGhhdCB3YXMgY2hhbmdlZC4KLSAgICAgKiBNYXkgYmUgZW1wdHksIGlmIG5vdCBrbm93biBvciBpZiB0aGUgZW50aXJlIHRyZWUgY2hhbmdlZC4KLSAgICAgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0W10gcGF0aDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX1BBVEggPSBuZXcgT2JqZWN0WzBdOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyB0cmVlIGNoYW5nZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSB0cmVlTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIHRyZWUgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byB0aGUgcGFydCBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBUcmVlQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUsIE9iamVjdFtdIHBhdGgpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKCh0cmVlTmFtZSA9PSBudWxsKSB8fCAocGF0aCA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy50cmVlTmFtZSA9IHRyZWVOYW1lOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgdHJlZSBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gdHJlZU5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFRyZWVDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSkgewotCQl0aGlzKHNvdXJjZSwgdHJlZU5hbWUsIEVNUFRZX1BBVEgpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHJlZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnRyZWVOYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudHJlZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBwYXJ0IG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogTWF5IGJlIGVtcHR5LCBpZiBub3Qga25vd24uCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldFBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLnBhdGg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyZWVDaGFuZ2VFdmVudCBjbG9uZVdpdGhTb3VyY2UoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUV2ZW50KG5ld1NvdXJjZSwgdGhpcy50cmVlTmFtZSwgdGhpcy5wYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgdGhlIHRyZWUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUNoYW5nZUV2ZW50IGNsb25lV2l0aFNvdXJjZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdUcmVlTmFtZSkgewotCQlyZXR1cm4gbmV3IFRyZWVDaGFuZ2VFdmVudChuZXdTb3VyY2UsIG5ld1RyZWVOYW1lLCB0aGlzLnBhdGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5YTdhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotLyoqCi0gKiBNYXJrZXIgaW50ZXJmYWNlLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCS8vIG5vdGhpbmcgZm9yIG5vdwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiMTM1OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwMzg4Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotCi0vKioKLSAqIEEgImNvbGxlY3Rpb24gY2hhbmdlIiBldmVudCBnZXRzIGZpcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIGNvbGxlY3Rpb24uIFlvdSBjYW4gcmVnaXN0ZXIgYSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgd2l0aCBhIHNvdXJjZQotICogbW9kZWwgc28gYXMgdG8gYmUgbm90aWZpZWQgb2YgYW55IGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlcy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBpdGVtcyBhcmUgYWRkZWQgdG8gYSBib3VuZCBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIGNvbGxlY3Rpb24gdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZC4KLQkgKi8KLQl2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgYXJlIHJlbW92ZWQgZnJvbSBhIGJvdW5kIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEEgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgY29sbGVjdGlvbiB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQuCi0JICovCi0Jdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCBjb2xsZWN0aW9uIGlzIGNsZWFyZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEEgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSAKLQkgKiBhbmQgdGhlIGNvbGxlY3Rpb24gdGhhdCBjaGFuZ2VkLgotCSAqLwotCXZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCBjb2xsZWN0aW9uIGlzIGNoYW5nZWQgaW4gYSBtYW5uZXIKLQkgKiB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieSB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGlzIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlIAotCSAqIGFuZCB0aGUgY29sbGVjdGlvbiB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9MaXN0Q2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTJhYmM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9MaXN0Q2hhbmdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBMaXN0Q2hhbmdlTGlzdGVuZXIuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0Q2hhbmdlQWRhcHRlciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBMaXN0Q2hhbmdlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZWFiM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0xpc3RDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBBICJsaXN0IGNoYW5nZSIgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBsaXN0LiBZb3UgY2FuIHJlZ2lzdGVyIGEgTGlzdENoYW5nZUxpc3RlbmVyIHdpdGggYSBzb3VyY2UKLSAqIG1vZGVsIHNvIGFzIHRvIGJlIG5vdGlmaWVkIG9mIGFueSBib3VuZCBsaXN0IHVwZGF0ZXMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpc3RDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIENoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgYXJlIGFkZGVkIHRvIGEgYm91bmQgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBMaXN0Q2hhbmdlRXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSBsaXN0IHRoYXQgY2hhbmdlZCwgdGhlIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZCwgYW5kIHRoZSBpbmRleAotCSAqIGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIGFkZGVkLgotCSAqLwotCXZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBpdGVtcyBhcmUgcmVtb3ZlZCBmcm9tIGEgYm91bmQgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBMaXN0Q2hhbmdlRXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSBsaXN0IHRoYXQgY2hhbmdlZCwgdGhlIGl0ZW1zIHRoYXQgd2VyZSByZW1vdmVkLCBhbmQgdGhlIGluZGV4Ci0JICogYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgcmVtb3ZlZC4KLQkgKi8KLQl2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBpdGVtcyBpbiBhIGJvdW5kIGxpc3QgYXJlIHJlcGxhY2VkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBIExpc3RDaGFuZ2VFdmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIGxpc3QgdGhhdCBjaGFuZ2VkLCB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkLCB0aGUgaXRlbXMgdGhhdCB3ZXJlCi0JICogcmVwbGFjZWQsIGFuZCB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgcmVwbGFjZWQuCi0JICovCi0Jdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGl0ZW1zIGluIGEgYm91bmQgbGlzdCBhcmUgbW92ZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEEgTGlzdENoYW5nZUV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgbGlzdCB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgaW5kaWNlcyBvZiB3aGVyZSBpdGVtcyB3ZXJlIG1vdmVkCi0JICogZnJvbSBhbmQgdG8uCi0JICovCi0Jdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgYm91bmQgbGlzdCBpcyBjbGVhcmVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBIExpc3RDaGFuZ2VFdmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlIAotCSAqIGFuZCB0aGUgbGlzdCB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIGJvdW5kIGxpc3QgaXMgY2hhbmdlZCBpbiBhIG1hbm5lcgotCSAqIHRoYXQgaXMgbm90IGVhc2lseSBjaGFyYWN0ZXJpemVkIGJ5IHRoZSBvdGhlciBtZXRob2RzIGluIHRoaXMgaW50ZXJmYWNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBIExpc3RDaGFuZ2VFdmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlIAotCSAqIGFuZCB0aGUgbGlzdCB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9NdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI1YjZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9NdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIgd2hlbiB0aGUgcmVxdWVzdGVkIGxpc3RlbmVyCi0gKiBuZWVkcyB0byBpbXBsZW1lbnQgbXVsdGlwbGUgbWV0aG9kcyAoaS5lLiBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIsCi0gKiBMaXN0Q2hhbmdlTGlzdGVuZXIsIG9yIFRyZWVDaGFuZ2VMaXN0ZW5lcikuCi0gKi8KLWNsYXNzIE11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyCi0JZXh0ZW5kcyBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIgCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIsIExpc3RDaGFuZ2VMaXN0ZW5lciwgVHJlZUNoYW5nZUxpc3RlbmVyCi17Ci0JLyoqIHRoZSBtZXRob2RzIHdlIHdpbGwgaW52b2tlIG9uIHRoZSB0YXJnZXQgb2JqZWN0ICovCi0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgYWRkTWV0aG9kOwotCXByaXZhdGUgZmluYWwgTWV0aG9kIHJlbW92ZU1ldGhvZDsKLQlwcml2YXRlIGZpbmFsIE1ldGhvZCByZXBsYWNlTWV0aG9kOwkvLyB0aGlzIGNhbiBiZSBudWxsCi0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgbW92ZU1ldGhvZDsJLy8gdGhpcyBjYW4gYmUgbnVsbAotCXByaXZhdGUgZmluYWwgTWV0aG9kIGNsZWFyTWV0aG9kOwotCXByaXZhdGUgZmluYWwgTWV0aG9kIGNoYW5nZU1ldGhvZDsKLQotCi0JLyoqCi0JICogVGhlICJyZXBsYWNlIiBhbmQgIm1vdmUiIG1ldGhvZHMgYXJlIG9wdGlvbmFsLgotCSAqLwotCU11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBhZGRNZXRob2QsIE1ldGhvZCByZW1vdmVNZXRob2QsIE1ldGhvZCByZXBsYWNlTWV0aG9kLCBNZXRob2QgbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JCXRoaXMuYWRkTWV0aG9kID0gYWRkTWV0aG9kOwotCQl0aGlzLnJlbW92ZU1ldGhvZCA9IHJlbW92ZU1ldGhvZDsKLQkJdGhpcy5yZXBsYWNlTWV0aG9kID0gcmVwbGFjZU1ldGhvZDsKLQkJdGhpcy5tb3ZlTWV0aG9kID0gbW92ZU1ldGhvZDsKLQkJdGhpcy5jbGVhck1ldGhvZCA9IGNsZWFyTWV0aG9kOwotCQl0aGlzLmNoYW5nZU1ldGhvZCA9IGNoYW5nZU1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBObyAicmVwbGFjZSIgb3IgIm1vdmUiIG1ldGhvZHMuCi0JICovCi0JTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIGFkZE1ldGhvZCwgTWV0aG9kIHJlbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCXRoaXModGFyZ2V0LCBhZGRNZXRob2QsIHJlbW92ZU1ldGhvZCwgbnVsbCwgbnVsbCwgY2xlYXJNZXRob2QsIGNoYW5nZU1ldGhvZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgaW52b2tlKE1ldGhvZCBtZXRob2QsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApIHsKLQkJCUNsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBFTVBUWV9DT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9BUlJBWSk7Ci0JCX0gZWxzZSB7Ci0JCQlDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QobWV0aG9kLCB0aGlzLnRhcmdldCwgbmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudFtdIHtldmVudH0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5hZGRNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMucmVtb3ZlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuY2xlYXJNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jaGFuZ2VNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbnZva2UoTWV0aG9kIG1ldGhvZCwgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMCkgewotCQkJQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKG1ldGhvZCwgdGhpcy50YXJnZXQsIEVNUFRZX0xJU1RfQ0hBTkdFX0VWRU5UX0FSUkFZKTsKLQkJfSBlbHNlIHsKLQkJCUNsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBuZXcgTGlzdENoYW5nZUV2ZW50W10ge2V2ZW50fSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmFkZE1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5yZW1vdmVNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLnJlcGxhY2VNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLm1vdmVNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jbGVhck1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNoYW5nZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGludm9rZShNZXRob2QgbWV0aG9kLCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QobWV0aG9kLCB0aGlzLnRhcmdldCwgRU1QVFlfVFJFRV9DSEFOR0VfRVZFTlRfQVJSQVkpOwotCQl9IGVsc2UgewotCQkJQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKG1ldGhvZCwgdGhpcy50YXJnZXQsIG5ldyBUcmVlQ2hhbmdlRXZlbnRbXSB7ZXZlbnR9KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5hZGRNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5yZW1vdmVNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jbGVhck1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNoYW5nZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NmJlZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIEEgInByb3BlcnR5IGNoYW5nZSIgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBwcm9wZXJ0eS4gWW91IGNhbiByZWdpc3RlciBhIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgd2l0aCBhIHNvdXJjZQotICogbW9kZWwgc28gYXMgdG8gYmUgbm90aWZpZWQgb2YgYW55IGJvdW5kIHByb3BlcnR5IHVwZGF0ZXMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgbW9kZWwgaGFzIGNoYW5nZWQgYSBib3VuZCBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBTdGF0ZUNoYW5nZUV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZQotCSAqIGFuZCB0aGUgcHJvcGVydHkncyBvbGQgYW5kIG5ldyB2YWx1ZXMuCi0JICovCi0Jdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmODFlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIFRoaXMgZmFjdG9yeSBidWlsZHMgbGlzdGVuZXJzIHRoYXQgcmVmbGVjdGl2ZWx5IGZvcndhcmQgQ2hhbmdlRXZlbnRzLgotICogSWYgeW91IGFyZSB3b3JyaWVkIGFib3V0IGhhdmluZyB0b28gbWFueSBsaXR0bGUgY2xhc3NlcyB0aGF0IGhhdmUgdG8gYmUKLSAqIGxvYWRlZCBhbmQgbWFpbnRhaW5lZCBieSB0aGUgY2xhc3MgbG9hZGVyLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlc2UuCi0gKiBPZiBjb3Vyc2UsIHRoaXMgY29tZXMgd2l0aCB0aGUgYWRkaXRpb25hbCBvdmVyaGVhZCBvZiByZWZsZWN0aW9uLi4uLgotICogQWxzbyBub3RlIHRoYXQgdGhlIHZhbGlkaXR5IG9mIHRoZSBtZXRob2QgbmFtZSBpcyBub3QgY2hlY2tlZCBhdCBjb21waWxlCi0gKiB0aW1lLCBidXQgYXQgcnVudGltZTsgYWx0aG91Z2ggd2UgKmRvKiBjaGVjayB0aGUgbWV0aG9kIGFzIHNvb24gYXMgdGhlCi0gKiBsaXN0ZW5lciBpcyBpbnN0YW50aWF0ZWQuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqIHRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHdlIHdpbGwgaW52b2tlIHRoZSBtZXRob2QgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IHRhcmdldDsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxTdGF0ZUNoYW5nZUV2ZW50PiBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBTdGF0ZUNoYW5nZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8U3RhdGVDaGFuZ2VFdmVudD5bXSBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7U1RBVEVfQ0hBTkdFX0VWRU5UX0NMQVNTfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0YXRlQ2hhbmdlRXZlbnRbXSBFTVBUWV9TVEFURV9DSEFOR0VfRVZFTlRfQVJSQVkgPSBuZXcgU3RhdGVDaGFuZ2VFdmVudFswXTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8UHJvcGVydHlDaGFuZ2VFdmVudD4gUFJPUEVSVFlfQ0hBTkdFX0VWRU5UX0NMQVNTID0gUHJvcGVydHlDaGFuZ2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFByb3BlcnR5Q2hhbmdlRXZlbnQ+W10gUFJPUEVSVFlfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge1BST1BFUlRZX0NIQU5HRV9FVkVOVF9DTEFTU307Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eUNoYW5nZUV2ZW50W10gRU1QVFlfUFJPUEVSVFlfQ0hBTkdFX0VWRU5UX0FSUkFZID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnRbMF07Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25DaGFuZ2VFdmVudD4gQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uQ2hhbmdlRXZlbnQ+W10gQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7Q09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1N9OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUV2ZW50W10gRU1QVFlfQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQVJSQVkgPSBuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50WzBdOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0Q2hhbmdlRXZlbnQ+IExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTID0gTGlzdENoYW5nZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdENoYW5nZUV2ZW50PltdIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0xJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExpc3RDaGFuZ2VFdmVudFtdIEVNUFRZX0xJU1RfQ0hBTkdFX0VWRU5UX0FSUkFZID0gbmV3IExpc3RDaGFuZ2VFdmVudFswXTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUNoYW5nZUV2ZW50PiBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTUyA9IFRyZWVDaGFuZ2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVDaGFuZ2VFdmVudD5bXSBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtUUkVFX0NIQU5HRV9FVkVOVF9DTEFTU307Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmVlQ2hhbmdlRXZlbnRbXSBFTVBUWV9UUkVFX0NIQU5HRV9FVkVOVF9BUlJBWSA9IG5ldyBUcmVlQ2hhbmdlRXZlbnRbMF07Ci0KLQotCi0JLy8gKioqKioqKioqKiBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBGaW5kIGFuZCByZXR1cm4gYSBtZXRob2QgaW1wbGVtZW50ZWQgYnkgdGhlIHRhcmdldCB0aGF0IGNhbiBiZSBpbnZva2VkCi0JICogcmVmbGVjdGl2ZWx5IHdoZW4gYSBjaGFuZ2UgZXZlbnQgb2NjdXJzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIE1ldGhvZCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VFdmVudD5bXSBldmVudENsYXNzQXJyYXkpIHsKLQkJTWV0aG9kIG1ldGhvZDsKLQkJdHJ5IHsKLQkJCW1ldGhvZCA9IENsYXNzVG9vbHMubWV0aG9kKHRhcmdldCwgbWV0aG9kTmFtZSwgZXZlbnRDbGFzc0FycmF5KTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4MSkgewotCQkJdHJ5IHsKLQkJCQltZXRob2QgPSBDbGFzc1Rvb2xzLm1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUpOwotCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4MikgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4Mik7ICAvLyAiY2hlY2tlZCIgZXhjZXB0aW9ucyBiaXRlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGlzIHN1aXRhYmxlIGZvciBiZWluZyBpbnZva2VkIHdoZW4gYQotCSAqIGNoYW5nZSBldmVudCBoYXMgb2NjdXJyZWQuIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyBub3Qgc3VpdGFibGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKE1ldGhvZCBtZXRob2QsIENsYXNzPD8gZXh0ZW5kcyBDaGFuZ2VFdmVudD4gZXZlbnRDbGFzcykgewotCQlDbGFzczw/PltdIHBhcm1UeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlpbnQgcGFybVR5cGVzTGVuZ3RoID0gcGFybVR5cGVzLmxlbmd0aDsKLQkJaWYgKHBhcm1UeXBlc0xlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChwYXJtVHlwZXNMZW5ndGggPT0gMSkgJiYgcGFybVR5cGVzWzBdLmlzQXNzaWduYWJsZUZyb20oZXZlbnRDbGFzcykpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1ldGhvZC50b1N0cmluZygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzOiBTdGF0ZUNoYW5nZUxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0YXRlIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QobWV0aG9kLCBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQlyZXR1cm4gbmV3IFNpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7IG90aGVyd2lzZSwKLQkgKiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzOiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QobWV0aG9kLCBQUk9QRVJUWV9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQlyZXR1cm4gbmV3IFNpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7IG90aGVyd2lzZSwKLQkgKiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBQUk9QRVJUWV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzOiBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgYWRkTWV0aG9kLCBNZXRob2QgcmVtb3ZlTWV0aG9kLCBNZXRob2QgY2xlYXJNZXRob2QsIE1ldGhvZCBjaGFuZ2VNZXRob2QpIHsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChhZGRNZXRob2QsIENPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChyZW1vdmVNZXRob2QsIENPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjbGVhck1ldGhvZCwgQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGNoYW5nZU1ldGhvZCwgQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQlyZXR1cm4gbmV3IE11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgYWRkTWV0aG9kLCByZW1vdmVNZXRob2QsIGNsZWFyTWV0aG9kLCBjaGFuZ2VNZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgYW55IGNoYW5nZSBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgY2hhbmdlIGV2ZW50cy4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7Ci0JICogb3RoZXJ3aXNlLCBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgYWRkTWV0aG9kTmFtZSwgU3RyaW5nIHJlbW92ZU1ldGhvZE5hbWUsIFN0cmluZyBjbGVhck1ldGhvZE5hbWUsIFN0cmluZyBjaGFuZ2VNZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigKLQkJCQl0YXJnZXQsCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgYWRkTWV0aG9kTmFtZSwgQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIHJlbW92ZU1ldGhvZE5hbWUsIENPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjbGVhck1ldGhvZE5hbWUsIENPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjaGFuZ2VNZXRob2ROYW1lLCBDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOwotCSAqIG90aGVyd2lzZSwgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgbWV0aG9kTmFtZSwgQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzOiBMaXN0Q2hhbmdlTGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgYWRkTWV0aG9kLCBNZXRob2QgcmVtb3ZlTWV0aG9kLCBNZXRob2QgcmVwbGFjZU1ldGhvZCwgTWV0aG9kIG1vdmVNZXRob2QsIE1ldGhvZCBjbGVhck1ldGhvZCwgTWV0aG9kIGNoYW5nZU1ldGhvZCkgewotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGFkZE1ldGhvZCwgTElTVF9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKHJlbW92ZU1ldGhvZCwgTElTVF9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKHJlcGxhY2VNZXRob2QsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChtb3ZlTWV0aG9kLCBMSVNUX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoY2xlYXJNZXRob2QsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjaGFuZ2VNZXRob2QsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJcmV0dXJuIG5ldyBNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGFkZE1ldGhvZCwgcmVtb3ZlTWV0aG9kLCByZXBsYWNlTWV0aG9kLCBtb3ZlTWV0aG9kLCBjbGVhck1ldGhvZCwgY2hhbmdlTWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBjaGFuZ2UgZXZlbnRzLiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsKLQkgKiBvdGhlcndpc2UsIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBhZGRNZXRob2ROYW1lLCBTdHJpbmcgcmVtb3ZlTWV0aG9kTmFtZSwgU3RyaW5nIHJlcGxhY2VNZXRob2ROYW1lLCBTdHJpbmcgbW92ZU1ldGhvZE5hbWUsIFN0cmluZyBjbGVhck1ldGhvZE5hbWUsIFN0cmluZyBjaGFuZ2VNZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigKLQkJCQl0YXJnZXQsCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgYWRkTWV0aG9kTmFtZSwgTElTVF9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIHJlbW92ZU1ldGhvZE5hbWUsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCByZXBsYWNlTWV0aG9kTmFtZSwgTElTVF9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1vdmVNZXRob2ROYW1lLCBMSVNUX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2xlYXJNZXRob2ROYW1lLCBMSVNUX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2hhbmdlTWV0aG9kTmFtZSwgTElTVF9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBhbnkgY2hhbmdlIGV2ZW50LiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsKLQkgKiBvdGhlcndpc2UsIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kczogVHJlZUNoYW5nZUxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2RzCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIGFkZE1ldGhvZCwgTWV0aG9kIHJlbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoYWRkTWV0aG9kLCBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QocmVtb3ZlTWV0aG9kLCBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoY2xlYXJNZXRob2QsIFRSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjaGFuZ2VNZXRob2QsIFRSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJcmV0dXJuIG5ldyBNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGFkZE1ldGhvZCwgcmVtb3ZlTWV0aG9kLCBjbGVhck1ldGhvZCwgY2hhbmdlTWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2RzCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGNoYW5nZSBldmVudHMuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOwotCSAqIG90aGVyd2lzZSwgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIGFkZE1ldGhvZE5hbWUsIFN0cmluZyByZW1vdmVNZXRob2ROYW1lLCBTdHJpbmcgY2xlYXJNZXRob2ROYW1lLCBTdHJpbmcgY2hhbmdlTWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoCi0JCQkJdGFyZ2V0LAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGFkZE1ldGhvZE5hbWUsIFRSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCByZW1vdmVNZXRob2ROYW1lLCBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2xlYXJNZXRob2ROYW1lLCBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2hhbmdlTWV0aG9kTmFtZSwgVFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBhbnkgY2hhbmdlIGV2ZW50LiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsKLQkgKiBvdGhlcndpc2UsIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIFRSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3Y2M3NTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1NpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIgd2hlbiB0aGUgcmVxdWVzdGVkIGxpc3RlbmVyCi0gKiBuZWVkIG9ubHkgaW1wbGVtZW50IGEgc2luZ2xlIG1ldGhvZCAoaS5lLiBTdGF0ZUNoYW5nZUxpc3RlbmVyIG9yCi0gKiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKS4KLSAqLwotY2xhc3MgU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyCi0JZXh0ZW5kcyBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIKLQlpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLXsKLQotCS8qKiB0aGUgbWV0aG9kIHdlIHdpbGwgaW52b2tlIG9uIHRoZSB0YXJnZXQgb2JqZWN0ICovCi0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgbWV0aG9kOwotCS8qKiBjYWNoZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBtZXRob2RJc1plcm9Bcmd1bWVudDsKLQotCVNpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JCXRoaXMubWV0aG9kID0gbWV0aG9kOwotCQl0aGlzLm1ldGhvZElzWmVyb0FyZ3VtZW50ID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0YXRlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMubWV0aG9kSXNaZXJvQXJndW1lbnQpIHsKLQkJCUNsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZCh0aGlzLm1ldGhvZCwgdGhpcy50YXJnZXQsIEVNUFRZX1NUQVRFX0NIQU5HRV9FVkVOVF9BUlJBWSk7Ci0JCX0gZWxzZSB7Ci0JCQlDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QodGhpcy5tZXRob2QsIHRoaXMudGFyZ2V0LCBuZXcgU3RhdGVDaGFuZ2VFdmVudFtdIHtldmVudH0pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMubWV0aG9kSXNaZXJvQXJndW1lbnQpIHsKLQkJCUNsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZCh0aGlzLm1ldGhvZCwgdGhpcy50YXJnZXQsIEVNUFRZX1BST1BFUlRZX0NIQU5HRV9FVkVOVF9BUlJBWSk7Ci0JCX0gZWxzZSB7Ci0JCQlDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QodGhpcy5tZXRob2QsIHRoaXMudGFyZ2V0LCBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudFtdIHtldmVudH0pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU3RhdGVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1N0YXRlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlNmJhNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU3RhdGVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQSBnZW5lcmljICJzdGF0ZSBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyB0byAKLSAqIHN1Y2ggZXh0ZW50IHRoYXQgaXQgY2Fubm90IGJlIGRlbGluZWF0ZWQgYWxsIGFzcGVjdHMgb2YgaXQgdGhhdCBoYXZlIGNoYW5nZWQuIAotICogWW91IGNhbiByZWdpc3RlciBhIFN0YXRlQ2hhbmdlTGlzdGVuZXIgd2l0aCBhIHNvdXJjZSBtb2RlbCBzbyBhcyB0byBiZSBub3RpZmllZCAKLSAqIG9mIGFueSBzdWNoIGNoYW5nZXMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXRlQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgbW9kZWwgaGFzIGNoYW5nZWQgaW4gc29tZSBnZW5lcmFsIGZhc2hpb24uCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEEgU3RhdGVDaGFuZ2VFdmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UuCi0JICovCi0Jdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9UcmVlQ2hhbmdlQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNDYyMDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIFRyZWVDaGFuZ2VMaXN0ZW5lci4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIFRyZWVDaGFuZ2VBZGFwdGVyIGltcGxlbWVudHMgVHJlZUNoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFRyZWVDaGFuZ2VBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTkxZjlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9UcmVlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQSAidHJlZSBjaGFuZ2UiIGV2ZW50IGdldHMgZmlyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogdHJlZS4gWW91IGNhbiByZWdpc3RlciBhIFRyZWVDaGFuZ2VMaXN0ZW5lciB3aXRoIGEgc291cmNlCi0gKiBtb2RlbCBzbyBhcyB0byBiZSBub3RpZmllZCBvZiBhbnkgYm91bmQgdHJlZSB1cGRhdGVzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUcmVlQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgbm9kZSBpcyBhZGRlZCB0byBhIGJvdW5kIHRyZWUuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEEgVHJlZUNoYW5nZUV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgcGF0aCB0byB0aGUgbm9kZSB0aGF0IHdhcyBhZGRlZC4KLQkgKi8KLQl2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIG5vZGUgaXMgcmVtb3ZlZCBmcm9tIGEgYm91bmQgdHJlZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBUcmVlQ2hhbmdlRXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSB0cmVlIHRoYXQgY2hhbmdlZCwgYW5kIHRoZSBwYXRoIHRvIHRoZSBub2RlIHRoYXQgd2FzIHJlbW92ZWQuCi0JICovCi0Jdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIGJvdW5kIHRyZWUgaXMgY2xlYXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBUcmVlQ2hhbmdlRXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSB0cmVlIHRoYXQgY2hhbmdlZCwgYW5kIGFuIGVtcHR5IHBhdGguCi0JICovCi0Jdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIHBvcnRpb24gb2YgYSBib3VuZCB0cmVlIGlzIGNoYW5nZWQgaW4KLQkgKiBhIG1hbm5lciB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieSB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGlzCi0JICogaW50ZXJmYWNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBIFRyZWVDaGFuZ2VFdmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIHRyZWUgdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIHBhdGggdG8gdGhlIGJyYW5jaCBvZiB0aGUKLQkgKiB0cmVlIHRoYXQgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYTgzNzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gYWJzdHJhY3QgY29sbGVjdGlvbiBhY2Nlc3NpbmcgYW5kCi0gKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFuZCBtYWtlIGl0IG1vcmUgcGx1Z2dhYmxlLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgTW9kZWwsIEl0ZXJhYmxlPEU+Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbGxlY3Rpb24ncyB2YWx1ZXMuCi0JICovCi0JSXRlcmF0b3I8RT4gaXRlcmF0b3IoKTsKLQkJU3RyaW5nIFZBTFVFUyA9ICJ2YWx1ZXMiOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uIHZhbHVlLgotCSAqLwotCWludCBzaXplKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9MaXN0VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzUwNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byBhYnN0cmFjdCBsaXN0IGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpc3RWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBNb2RlbCwgSXRlcmFibGU8RT4KLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QncyB2YWx1ZXMuCi0JICovCi0JSXRlcmF0b3I8RT4gaXRlcmF0b3IoKTsKLQkJU3RyaW5nIExJU1RfVkFMVUVTID0gImxpc3QgdmFsdWVzIjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCdzIHZhbHVlcy4KLQkgKi8KLQlMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICovCi0JaW50IHNpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoZSBsaXN0LgotCSAqLwotCUUgZ2V0KGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QncyB2YWx1ZXMuCi0JICovCi0JT2JqZWN0W10gdG9BcnJheSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZWUzYzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGFic3RyYWN0IHByb3BlcnR5IGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5VmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgTW9kZWwKLXsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvcGVydHkncyB2YWx1ZS4KLQkgKi8KLQlUIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9UcmVlTm9kZVZhbHVlTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9UcmVlTm9kZVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiY2VhOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi0vKioKLSAqIEV4dGVuZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbCB0byBiZXR0ZXIgc3VwcG9ydCBUcmVlTW9kZWxBZGFwdGVyLgotICogCi0gKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGZpcmUgYSAic3RhdGUgY2hhbmdlIiBldmVudAotICogd2hlbmV2ZXIgdGhlIG5vZGUncyBpbnRlcm5hbCBzdGF0ZSBjaGFuZ2VzIGluIGEgd2F5IHRoYXQgdGhlCi0gKiB0cmVlIGxpc3RlbmVycyBzaG91bGQgYmUgbm90aWZpZWQuCi0gKiAKLSAqIEltcGxlbWVudG9ycyBvZiB0aGlzIGludGVyZmFjZSBzaG91bGQgYWxzbyBmaXJlIGEgInZhbHVlIHByb3BlcnR5IGNoYW5nZSIKLSAqIGV2ZW50IHdoZW5ldmVyIHRoZSBub2RlJ3MgdmFsdWUgY2hhbmdlcy4gVHlwaWNhbGx5LCBvbmx5IG5vZGVzIHRoYXQKLSAqIGhvbGQgInByaW1pdGl2ZSIgZGF0YSB3aWxsIGZpcmUgdGhpcyBldmVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUcmVlTm9kZVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBwYXJlbnQgbm9kZTsgbnVsbCBpZiB0aGUgbm9kZQotCSAqIGlzIHRoZSByb290LgotCSAqLwotCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGF0aCB0byB0aGUgbm9kZS4KLQkgKi8KLQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHZhbHVlIG1vZGVsIG9mIHRoZSBub2RlJ3MgY2hpbGQgbm9kZXMuCi0JICovCi0JTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbk1vZGVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBjaGlsZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBjaGlsZChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub2RlJ3MgbGlzdCBvZiBjaGlsZHJlbi4KLQkgKi8KLQlpbnQgY2hpbGRyZW5TaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBub2RlJ3MgbGlzdCBvZiBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkLgotCSAqLwotCWludCBpbmRleE9mQ2hpbGQoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGNoaWxkKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgbGVhZiAoaS5lLiBpdCBoYXMgbm8gY2hpbGRyZW4pCi0JICovCi0JYm9vbGVhbiBpc0xlYWYoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1RyZWVWYWx1ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc2NTQyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byBhYnN0cmFjdCB0cmVlIGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyZWVWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBNb2RlbAotewotCS8qKgotCSAqIFJldHVybiB0aGUgdHJlZSdzIG5vZGVzLgotCSAqLwotCUl0ZXJhdG9yPEU+IG5vZGVzKCk7Ci0JCVN0cmluZyBOT0RFUyA9ICJub2RlcyI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZGRhY2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L21vZGVsL3ZhbHVlL1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi0vKioKLSAqIEV4dGVuZCBWYWx1ZU1vZGVsIHRvIGFsbG93IHRoZSBzZXR0aW5nIG9mIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIGFuZCBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkgKiBAc2VlIFByb3BlcnR5VmFsdWVNb2RlbCNWQUxVRQotCSAqLwotCXZvaWQgc2V0VmFsdWUoVCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY3ZzaWdub3JlIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk2ZGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1qYXZhQ29tcGlsZXIuLi5hcmdzLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2NTYxZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MDQ0YWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDA3IDE0OjI2OjMyIEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGUyM2E5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkV4dGVuc2lvblRlc3RQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5nZW4sCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UuanB0LmRiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7YnVuZGxlLXZlcnNpb249IjMuMy4xMDAiLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMsb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMiCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL2Fib3V0Lmh0bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYnVpbGQucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlM2Y0MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZT0xLjUKLWphdmFjVGFyZ2V0PTEuNQotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2Y3MjdmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIEV4dGVuc2lvblRlc3RQbHVnaW4KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi54bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NGRmN2YuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGFQbGF0Zm9ybSI+Ci0JCQotCQk8anBhUGxhdGZvcm0KLQkJCWlkPSJjb3JlLnRlc3RKcGFQbGF0Zm9ybSIKLQkJCWxhYmVsPSJUZXN0IEpwYSBQbGF0Zm9ybSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuVGVzdEpwYVBsYXRmb3JtIgotCQkJZGVmYXVsdD0idHJ1ZSI+Ci0JCTwvanBhUGxhdGZvcm0+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFQbGF0Zm9ybSI+Ci0JCQotCQk8anBhUGxhdGZvcm0KLQkJCWlkPSJjb3JlLnRlc3RKcGFQbGF0Zm9ybSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuVGVzdEpwYVBsYXRmb3JtVWkiPgotCQk8L2pwYVBsYXRmb3JtPgotCQkKLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvRXh0ZW5zaW9uVGVzdFBsdWdpbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0V4dGVuc2lvblRlc3RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwNzVhNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvRXh0ZW5zaW9uVGVzdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uVGVzdFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEV4dGVuc2lvblRlc3RQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFeHRlbnNpb25UZXN0UGx1Z2luKCkgewotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uVGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjc3N2YzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZwotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gInRlc3RBdHRyaWJ1dGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQVRUUklCVVRFX0FOTk9UQVRJT05fTkFNRSA9ICJ0ZXN0LlRlc3RBdHRyaWJ1dGUiOwotCi0KLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZy5URVNUX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX0FOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOGVkYmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFUZXN0QXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuVEVTVF9BVFRSSUJVVEVfQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKFRlc3RKcGFGYWN0b3J5KSBmYWN0b3J5KS5idWlsZEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0JCQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0VHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E3ZDg0OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFUeXBlTWFwcGluZzsKLQotcHVibGljIGNsYXNzIEphdmFUZXN0VHlwZU1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZwotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVFlQRV9NQVBQSU5HX0tFWSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RZUEVfQU5OT1RBVElPTl9OQU1FID0gInRlc3QuVGVzdCI7Ci0KLQotCXB1YmxpYyBKYXZhVGVzdFR5cGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gVEVTVF9UWVBFX0FOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIFRFU1RfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjb3JyZXNwb25kaW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFwcGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjYTgyYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdQcm92aWRlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFUZXN0VHlwZU1hcHBpbmdQcm92aWRlcgotCWltcGxlbWVudHMgSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVGVzdFR5cGVNYXBwaW5nUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YVRlc3RUeXBlTWFwcGluZ1Byb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKYXZhVGVzdFR5cGVNYXBwaW5nUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBKYXZhVGVzdFR5cGVNYXBwaW5nLlRFU1RfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0VHlwZU1hcHBpbmcuVEVTVF9UWVBFX0FOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVRlc3RUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKFRlc3RKcGFGYWN0b3J5KSBmYWN0b3J5KS5idWlsZEphdmFUZXN0VHlwZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUJhc2ljTWFwcGluZy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKYXZhQmFzaWNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDJmNmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKYXZhQmFzaWNNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUJhc2ljTWFwcGluZzsKLQotcHVibGljIGNsYXNzIFRlc3RKYXZhQmFzaWNNYXBwaW5nIGV4dGVuZHMgR2VuZXJpY0phdmFCYXNpY01hcHBpbmcKLXsKLQlwdWJsaWMgVGVzdEphdmFCYXNpY01hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKYXZhRW50aXR5LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmZmUzYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUVudGl0eTsKLQotcHVibGljIGNsYXNzIFRlc3RKYXZhRW50aXR5IGV4dGVuZHMgR2VuZXJpY0phdmFFbnRpdHkKLXsKLQlwcm90ZWN0ZWQgVGVzdEphdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhRmFjdG9yeS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwM2U3NTEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkdlbmVyaWNKcGFGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgVGVzdEpwYUZhY3RvcnkgZXh0ZW5kcyBHZW5lcmljSnBhRmFjdG9yeQotewotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRW50aXR5IGJ1aWxkSmF2YUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgVGVzdEphdmFFbnRpdHkocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFCYXNpY01hcHBpbmcgYnVpbGRKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRlc3RKYXZhQmFzaWNNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGVzdFR5cGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YVRlc3RUeXBlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm0uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhMDMzNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkdlbmVyaWNKcGFQbGF0Zm9ybTsKLQotcHVibGljIGNsYXNzIFRlc3RKcGFQbGF0Zm9ybSBleHRlbmRzIEdlbmVyaWNKcGFQbGF0Zm9ybQotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImNvcmUudGVzdEpwYVBsYXRmb3JtIjsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBJRDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhRmFjdG9yeSBidWlsZEpwYUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgVGVzdEpwYUZhY3RvcnkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUFubm90YXRpb25Qcm92aWRlciBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzVG8oQ29sbGVjdGlvbjxKYXZhVHlwZU1hcHBpbmdQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCXN1cGVyLmFkZEphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyc1RvKHByb3ZpZGVycyk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVRlc3RUeXBlTWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyc1RvKENvbGxlY3Rpb248SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCXN1cGVyLmFkZEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzVG8ocHJvdmlkZXJzKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1VaS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MDhmNzkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5KcGFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmRldGFpbHMuVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5iYXNlLkJhc2VKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNOYXZpZ2F0b3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgVGVzdEpwYVBsYXRmb3JtVWkgZXh0ZW5kcyBCYXNlSnBhUGxhdGZvcm1VaQotewotCXB1YmxpYyBUZXN0SnBhUGxhdGZvcm1VaSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhTmF2aWdhdG9yUHJvdmlkZXIgYnVpbGROYXZpZ2F0b3JQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljTmF2aWdhdG9yUHJvdmlkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhVWlGYWN0b3J5IGNyZWF0ZUpwYVVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0SnBhVWlGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVEREwoSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzVG8oTGlzdDxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IHByb3ZpZGVycykgewotCQlzdXBlci5hZGRKYXZhQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzVG8ocHJvdmlkZXJzKTsKLQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhVHlwZU1hcHBpbmdVaVByb3ZpZGVyc1RvKExpc3Q8VHlwZU1hcHBpbmdVaVByb3ZpZGVyPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IHByb3ZpZGVycykgewotCQlzdXBlci5hZGRKYXZhVHlwZU1hcHBpbmdVaVByb3ZpZGVyc1RvKHByb3ZpZGVycyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVVpRmFjdG9yeS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmYThiNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5CYXNlSnBhVWlGYWN0b3J5OwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBVSSBmYWN0b3J5IHJlcXVpcmVkIHRvIHNob3cgdGhlIGluZm9ybWF0aW9uCi0gKiByZWxhdGVkIHRvIGEgSlBBIG1hcHBpbmcgKHR5cGUgb3IgYXR0cmlidXRlKS4KLSAqCi0gKiBAc2VlIEpwYVVpRmFjdG9yeQotICoKLSAqIEB2ZXJzaW9uIDEuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEpwYVVpRmFjdG9yeSBleHRlbmRzIEJhc2VKcGFVaUZhY3RvcnkKLXsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAzOTkwMTczLi42Njk2YWQxIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0yLDM5ICsyLDQyIEBACiBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCiBCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMi4wLjEKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDIuMy4wLnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCiAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjIwMCwzLjAuMCkiLAogIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjEwMCwzLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKICBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5kYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xLDIuMC4wKSIsCisgb3JnLmVjbGlwc2UuanB0LmRiO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKICBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKKyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMy4wKSIsCiAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IlszLjguMiw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIKKyBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IlszLjguMiw0LjAuMCkiCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMiLAorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cyIsCiAgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLm1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucGxhdGZvcm07eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0czt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMiLAogIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0O3gtaW50ZXJuYWw6PXRydWUKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLkpwdENvcmVUZXN0c1BsdWdpbgorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKaW5kZXggOWJmMTFmNy4uOTZkZTFlZSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKQEAgLTEsMTMgKzEsMTIgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgogIyAKICMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogamF2YWNTb3VyY2UgPSAxLjUKIGphdmFjVGFyZ2V0ID0gMS41CiBiaW4uaW5jbHVkZXMgPSAuLFwKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwppbmRleCA2ZWJmOGRiLi5jNGY0Y2JkIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0xOCw1ICsxOCw1IEBACiAjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1wbHVnaW5OYW1lPUphdmEgUGVyc2lzdGVuY2UgQVBJIENvcmUgVGVzdHMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZworcGx1Z2luTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb3JlIFRlc3RzCitwcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvSnB0Q29yZVRlc3RzUGx1Z2luLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL0pwdENvcmVUZXN0c1BsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMzk3OGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL0pwdENvcmVUZXN0c1BsdWdpbi5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBjb25maWd1cmUgdGhlIGNvcmUgdG8gaGFuZGxlIGV2ZW50cyBzeW5jaHJvbm91c2x5IHdoZW4gd2UgYXJlCisgKiBydW5uaW5nIHRlc3RzCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEpwdENvcmVUZXN0c1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7CisJCisJcHJpdmF0ZSBzdGF0aWMgSnB0Q29yZVRlc3RzUGx1Z2luIElOU1RBTkNFOworCisJcHVibGljIHN0YXRpYyBKcHRDb3JlVGVzdHNQbHVnaW4gaW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKworCS8vICoqKioqKioqKiogcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCisKKwlwdWJsaWMgSnB0Q29yZVRlc3RzUGx1Z2luKCkgeworCQlzdXBlcigpOworCQlpZiAoSU5TVEFOQ0UgIT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCQl9CisJCS8vIHRoaXMgY29udmVudGlvbiBpcyAqd2FjayouLi4gIH5ianYKKwkJSU5TVEFOQ0UgPSB0aGlzOworCX0KKworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJCUpwYU1vZGVsIGpwYU1vZGVsID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFNb2RlbCgpOworCQlDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QoanBhTW9kZWwsICJoYW5kbGVFdmVudHNTeW5jaHJvbm91c2x5Iik7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdG9wKGNvbnRleHQpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9NaXNjVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvTWlzY1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJjOWFkNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvTWlzY1Rlc3RzLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0czsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBNaXNjVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwlwdWJsaWMgTWlzY1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIHZvaWQgdGVzdEpvYnNBbmRMb2NrcygpIHRocm93cyBFeGNlcHRpb24geworCQlJTG9jayBsb2NrID0gSm9iLmdldEpvYk1hbmFnZXIoKS5uZXdMb2NrKCk7CisJCUpvYiB0ZXN0Sm9iID0gbmV3IFRlc3RKb2IobG9jayk7CisJCXRlc3RKb2Iuc2NoZWR1bGUoKTsKKwl9CisKKwljbGFzcyBUZXN0Sm9iIGV4dGVuZHMgSm9iIHsKKwkJcHJpdmF0ZSBmaW5hbCBJTG9jayBsb2NrOworCQlUZXN0Sm9iKElMb2NrIGxvY2spIHsKKwkJCXN1cGVyKCJ0ZXN0IGpvYiIpOworCQkJdGhpcy5sb2NrID0gbG9jazsKKwkJfQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJdGhpcy5ydW4oKTsKKwkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQl9CisJCXByaXZhdGUgdm9pZCBydW4oKSB7CisJCQl0cnkgeworCQkJCXRoaXMubG9jay5hY3F1aXJlKCk7CisJCQkJTWlzY1Rlc3RzLnNsZWVwKDEwMCk7CisJCQl9IGZpbmFsbHkgeworCQkJCXRoaXMubG9jay5yZWxlYXNlKCk7CisJCQl9CisJCX0KKwl9CisKKwlzdGF0aWMgdm9pZCBzbGVlcChsb25nIG1pbGxpcykgeworCQl0cnkgeworCQkJVGhyZWFkLnNsZWVwKG1pbGxpcyk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0QWxsQ29yZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdEFsbENvcmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjBlNjMyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0QWxsQ29yZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLS8qKgotICogVGhpcyB0ZXN0IHN1aXRlIGlzIHRlbXBvcmFyeSwgdW50aWwganBhLmphciBjYW4gYmUgY2hlY2tlZCBpbnRvIHRoZSBDVlMKLSAqIHJlcG9zaXRvcnkgYW5kIHVzZWQgZHVyaW5nIHRoZSBuaWdodGx5IGJ1aWxkcy4KLSAqIAotICogUnVucyBBTEwgSlBUIENvcmUgVGVzdHMuIEN1cnJlbnRseSB3ZSBkbyBub3QgaGF2ZSBhIGpwYS5qYXIgY2hlY2tlZCBpbiB0byBDVlMuCi0gKiBBcyBhIHJlc3VsdCB3ZSBjYW5ub3QgcnVuIGFueSB0ZXN0cyB0aGF0IGRlcGVuZCBvbiB0aGF0IGphciBkdXJpbmcgdGhlIGJ1aWxkLgotICogSW4gb3VyIGxvY2FsIGRldmVsb3BtZW50IGVudmlyb25tZW50cyB3ZSBzaG91bGQgcnVuIHRoaXMgc3VpdGUgKEpwdEFsbENvcmVUZXN0cykKLSAqIHVudGlsIGpwYS5qYXIgaXMgY2hlY2tlZCBpbnRvIENWUy4KLSAqIEluIHRoZSBuaWdodGx5IGJ1aWxkIHdlIHNob3VsZCBjb250aW51ZSB0byBydW4gSnB0Q29yZVRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgSnB0QWxsQ29yZVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIEpwdENvcmVUZXN0cy5zdWl0ZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIEpwdEFsbENvcmVUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdENvcmVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9KcHRDb3JlVGVzdHMuamF2YQppbmRleCBmODc5NTkzLi5lM2NmYTZmIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdENvcmVUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0Q29yZVRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSw0MCArOSw3NSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWw7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpwdENvcmVDb250ZXh0TW9kZWxUZXN0czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5KcHRDb3JlTW9kZWxUZXN0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5KcHRDb3JlUmVzb3VyY2VNb2RlbFRlc3RzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0LkpwdENvcmVVdGlsaXR5SmR0VGVzdHM7CiAKIC8qKgotICogUnVucyBNT1NUIEpQVCBDb3JlIFRlc3RzLiBDdXJyZW50bHkgd2UgZG8gbm90IGhhdmUgYSBqcGEuamFyIGNoZWNrZWQgaW50byBjdnMuIAotICogQXMgYSByZXN1bHQgd2UgY2Fubm90IHJ1biBhbnkgdGVzdHMgdGhhdCBkZXBlbmQgb24gdGhhdCBqYXIgZHVyaW5nIHRoZSBuaWdodGx5IGJ1aWxkLgotICogSW4gb3VyIGRldmVsb3BtZW50IGVudmlyb25tZW50cyB3ZSBzaG91bGQgcnVuIEpwdEFsbENvcmVUZXN0cyAoTk9UIHRoaXMgc3VpdGUpCi0gKiB1bnRpbCBqcGEuamFyIGlzIGNoZWNrZWQgaW50byBDVlMuCisgKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCisgKiAKKyAqIFJlcXVpcmVkIEphdmEgc3lzdGVtIHByb3BlcnR5OgorICogICAgLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj08anBhLmphciBwYXRoPgogICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBKcHRDb3JlVGVzdHMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfSkFSX1BST1BFUlRZID0gVGVzdEpwYVByb2plY3QuSlBBX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWTsKIAogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIHN1aXRlKGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKGJvb2xlYW4gYWxsKSB7Ci0JCVN0cmluZyBxdWFudGl0eSA9IGFsbCA/ICJBbGwiIDogIk1vc3QiOwotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKHF1YW50aXR5ICsgIiBKUFQgQ29yZSBUZXN0cyIpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdENvcmVVdGlsaXR5SmR0VGVzdHMuc3VpdGUoYWxsKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0Q29yZU1vZGVsVGVzdHMuc3VpdGUoYWxsKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0Q29yZVJlc291cmNlTW9kZWxUZXN0cy5zdWl0ZShhbGwpKTsKLQkJaWYgKGFsbCkgewotCQkJc3VpdGUuYWRkVGVzdChKcHRDb3JlQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoYWxsKSk7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29yZVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOworCisJCWlmKHJlcXVpcmVkSmFyc0V4aXN0cygpKSB7CisJCQlzdWl0ZS5hZGRUZXN0KEpwdENvcmVVdGlsaXR5SmR0VGVzdHMuc3VpdGUoKSk7CisJCQlzdWl0ZS5hZGRUZXN0KEpwdENvcmVNb2RlbFRlc3RzLnN1aXRlKCkpOworCQkJc3VpdGUuYWRkVGVzdChKcHRDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLnN1aXRlKCkpOworCQkJc3VpdGUuYWRkVGVzdChKcHRDb3JlQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7CisJCX0KKwkJZWxzZSB7CisJCQlzdWl0ZS5hZGRUZXN0KFRlc3RTdWl0ZS53YXJuaW5nKGJ1aWxkTWlzc2luZ0phckVycm9yTWVzc2FnZSgpKSk7CiAJCX0KIAkJcmV0dXJuIHN1aXRlOwogCX0KIAkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVxdWlyZWRKYXJzRXhpc3RzKCkgeworCQlyZXR1cm4ganBhSmFyUHJvcGVydHlFeGlzdHMoKSAmJiBqcGFKYXJGaWxlRXhpc3RzKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGpwYUphclByb3BlcnR5RXhpc3RzKCkgeworCQlyZXR1cm4gZ2V0U3lzdGVtUHJvcGVydHkoSlBBX0pBUl9QUk9QRVJUWSkgIT0gbnVsbDsKKwl9CisJCisJcHVibGljIHN0YXRpYyBib29sZWFuIGpwYUphckZpbGVFeGlzdHMoKSB7CisJCXJldHVybiAobmV3IEZpbGUoZ2V0U3lzdGVtUHJvcGVydHkoSlBBX0pBUl9QUk9QRVJUWSkpKS5leGlzdHMoKTsKKwl9CisKKwkvKioqKioqKioqKiogcHJpdmF0ZSAqKioqKioqKioqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBidWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSB7CisKKwkJaWYoICEganBhSmFyUHJvcGVydHlFeGlzdHMoKSkgeworCQkJcmV0dXJuIGVycm9yTWlzc2luZ1Byb3BlcnR5KEpQQV9KQVJfUFJPUEVSVFkpOworCQl9CisJCXJldHVybiBlcnJvckphckZpbGVEb2VzTm90RXhpc3QoZ2V0U3lzdGVtUHJvcGVydHkoSlBBX0pBUl9QUk9QRVJUWSkpOworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCXJldHVybiAibWlzc2luZyBKYXZhIHN5c3RlbSBwcm9wZXJ0eTogXCIiICsgcHJvcGVydHlOYW1lICsgIlwiIjsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7CisJCXJldHVybiAiSkFSIGZpbGUgZG9lc24ndCBleGlzdDogXCIiICsgcHJvcGVydHlWYWx1ZSArICJcIiI7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOworCX0KKwkKIAlwcml2YXRlIEpwdENvcmVUZXN0cygpIHsKIAkJc3VwZXIoKTsKIAkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAJfQotCiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL1Byb2plY3RVdGlsaXR5LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL1Byb2plY3RVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YWJkYjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9Qcm9qZWN0VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotCi0vKioKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RVdGlsaXR5IHsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0QWxsUHJvamVjdHMoKSB7Ci0gICAgCUlQcm9qZWN0W10gcHJvamVjdHMgPSBuZXcgSVByb2plY3RbMF07Ci0gICAgCXRyeSB7Ci0gICAgICAgIHByb2plY3RzID0gIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICAJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgCQkvLyBDYXRjaCBNYWxmb3JtZWQgdHJlZSBleGNlcHRpb24gdGhhdCBvY2N1cnMgZnJvbSB0aW1lIHRvIHRpbWUuLi4KLSAgICAJfQotICAgIAlyZXR1cm4gcHJvamVjdHM7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9qZWN0RXhpc3RzKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkgIT0gbnVsbDsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdCB2ZXJpZnlBbmRSZXR1cm5Qcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBleGlzdHMpIHsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBpZiAoZXhpc3RzKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUHJvamVjdCBEb2VzIE5vdCBFeGlzdDoiICsgcHJvamVjdE5hbWUsIHByb2plY3QuZXhpc3RzKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlByb2plY3QgRXhpc3RzOiIgKyBwcm9qZWN0TmFtZSwgIXByb2plY3QuZXhpc3RzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gZXhpc3RzKSB7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKGV4aXN0cykgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlByb2plY3QgRG9lcyBOb3QgRXhpc3Q6IiArIHByb2plY3ROYW1lLCBwcm9qZWN0LmV4aXN0cygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJQcm9qZWN0IEV4aXN0czoiICsgcHJvamVjdE5hbWUsICFwcm9qZWN0LmV4aXN0cygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICBTdHJpbmcgcGF0aFN0cmluZyA9IHByb2plY3ROYW1lOwotICAgICAgICBpZiAoISh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aFN0cmluZykgPT0gbnVsbCkpCi0gICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGhTdHJpbmcpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeU5vUHJvamVjdHMoKSB7Ci0gICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBnZXRBbGxQcm9qZWN0cygpOwotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWVzID0gIiI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHByb2plY3ROYW1lcyArPSAiICIgKyBwcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkFsbCBwcm9qZWN0cyBub3QgZGVsZXRlZCIgKyBwcm9qZWN0TmFtZXMsIHByb2plY3RzLmxlbmd0aCA9PSAwKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZVByb2plY3RJZkV4aXN0cyhTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgaWYgKHByb2plY3ROYW1lID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHByb2plY3QuY2xvc2UobnVsbCk7Ci0gICAgICAgICAgICAgICAgcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVBbGxQcm9qZWN0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL2Nsb3NpbmcgcHJvamVjdHMgYW5kIHRyZWFkIHdvcmsgaW4gaGVyZSBpcyBhIGhhY2sgYmVjYXVzZSBvZiBhIEJlYW5JbmZvIGJ1ZyBob2xkaW5nCi0gICAgICAgIC8vb250byBqYXJzIGxvYWRlZCBpbiBhbm90aGVyIFZNCi0gICAgICAgIAotLy8gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLS8vICAgICAgICAgICAgaWYgKHByb2plY3RzW2ldLmV4aXN0cygpKSB7Ci0vLyAgICAgICAgICAgICAgICBwcm9qZWN0c1tpXS5jbG9zZShudWxsKTsgLy8gVGhpcyBzaG91bGQgc2lnbmFsIHRoZSBleHRyYSBWTSB0byBraWxsIGl0c2VsZgotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotIC8vICAgICAgIFRocmVhZC55aWVsZCgpOyAvLyBnaXZlIHRoZSBWTSBhIGNoYW5jZSB0byBkaWUKLSAgICAgICAgSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBnZXRBbGxQcm9qZWN0cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJCQkJRXhjZXB0aW9uIGxhc3RFeGNlcHRpb24gPSBudWxsOwotCQkJCQkvLyBEb24ndCBtYWtlIDJeMTIgaXMgYWJvdXQgNCBzZWNvbmRzIHdoaWNoIGlzIHRoZSBtYXggd2UKLQkJCQkJLy8gd2lsbCB3YWl0IGZvciB0aGUgVk0gdG8gZGllCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgMTQgJiYgIXN1Y2Nlc3M7IGorKykgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpZiAocHJvamVjdC5leGlzdHMoKSkgewotCQkJCQkJCQlwcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJc3VjY2VzcyA9IHRydWU7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQlsYXN0RXhjZXB0aW9uID0gZXg7Ci0JCQkJCQkJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXByb2plY3QuY2xvc2UobnVsbCk7Ci0JCQkJCQkJCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLQkJCQkJCQkJCS8vIGlnbm9yZSB0aGlzIGV4Y2VwdGlvbgotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCVRocmVhZC5zbGVlcCgoaW50KSBNYXRoLnBvdygyLCBqKSk7Ci0JCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgyKSB7Ci0JCQkJCQkJCS8vIHByb2JhYmx5IHdvbid0IGhhcHBlbgotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoICEgc3VjY2VzcykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIHdoaWxlIGRlbGV0aW5nOiAiICsgcHJvamVjdC5nZXROYW1lKCkpOwotCQkJCQkJbGFzdEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0gICAgICAgIC8vdmVyaWZ5Tm9Qcm9qZWN0cygpOwotICAgIH0KLSAgICAvKioKLQkgKiBSZXR1cm4gdGhlIGFic29sdXRlIHBhdGggU3RyaW5ncyB0byB0aGUgZmlsZXMgYmFzZWQgb24gdGhlIGZpbGVTdWZmaXggYW5kCi0JICogcGF0aCB3aXRoaW4gdGhlIHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBmaWxlU3VmZml4Ci0JICogICAgICAgICAgICB0aGUgZmlsZSBlbmRpbmcgd2l0aCB0aGUgIi4iIGlmIHJlcXVpcmVkICh0aGUgc3VmZml4IHdpbGwgYmUKLQkgKiAgICAgICAgICAgIHVzZWQgYXMgaXMpCi0JICogQHJldHVybgotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTcGVjaWZpY0ZpbGVzSW5EaXJlY3RvcnkoUGx1Z2luIHBsdWdpbiwgU3RyaW5nIHBhdGgsIGZpbmFsIFN0cmluZyBmaWxlU3VmZml4KSB7Ci0gICAgICAgIFVSTCBlbnRyeSA9IG51bGw7IAotICAgICAgICAgICAgZW50cnkgPSBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aCk7IAotICAgICAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIEZpbGUgZm9sZGVyID0gbnVsbDsKLSAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZW50cnkgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBmb2xkZXIgPSBuZXcgRmlsZShuZXcgVVJJKGVudHJ5LnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIGUxLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdCBmaWxlcyA9IEFycmF5cy5hc0xpc3QoZm9sZGVyLmxpc3QoKSk7Ci0gICAgICAgICAgICBpZiAoIWZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmb2xkZXJQYXRoID0gZm9sZGVyLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3I7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gKFN0cmluZykgZmlsZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKGZpbGVTdWZmaXgpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZm9sZGVyUGF0aCArIGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmVzdWx0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEphcnNJbkRpcmVjdG9yeShQbHVnaW4gcGx1Z2luLCBTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gZ2V0U3BlY2lmaWNGaWxlc0luRGlyZWN0b3J5KHBsdWdpbiwgcGF0aCwgIi5qYXIiKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJhcnNJbkRpcmVjdG9yeShQbHVnaW4gcGx1Z2luLCBTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gZ2V0U3BlY2lmaWNGaWxlc0luRGlyZWN0b3J5KHBsdWdpbiwgcGF0aCwgIi5yYXIiKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEVhcnNJbkRpcmVjdG9yeShQbHVnaW4gcGx1Z2luLCBTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gZ2V0U3BlY2lmaWNGaWxlc0luRGlyZWN0b3J5KHBsdWdpbiwgcGF0aCwgIi5lYXIiKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFdhcnNJbkRpcmVjdG9yeShQbHVnaW4gcGx1Z2luLCBTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gZ2V0U3BlY2lmaWNGaWxlc0luRGlyZWN0b3J5KHBsdWdpbiwgcGF0aCwgIi53YXIiKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RnVsbEZpbGVOYW1lKFBsdWdpbiBwbHVnaW4sIFN0cmluZyBwbHVnaW5SZWxhdGl2ZUZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgocGx1Z2luUmVsYXRpdmVGaWxlTmFtZSk7Ci0gICAgICAgIGlmIChwYXRoLmdldERldmljZSgpICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcGx1Z2luUmVsYXRpdmVGaWxlTmFtZTsKLSAgICAgICAgVVJMIHVybCA9IHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRFbnRyeShwbHVnaW5SZWxhdGl2ZUZpbGVOYW1lKTsKLSAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1cmwgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCk7Ci0gICAgICAgICAgICBJUGF0aCBpUGF0aCA9IG5ldyBQYXRoKHVybC5nZXRQYXRoKCkpOwotICAgICAgICAgICAgcmV0dXJuIGlQYXRoLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0NvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQppbmRleCBmZjUwZmM3Li4wYzcyZWIwIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xNiwzNiArMTYsNDIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGV4dE1vZGVsVGVzdENhc2UgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UKIHsKIAlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1BST0pFQ1RfTkFNRSA9ICJDb250ZXh0TW9kZWxUZXN0UHJvamVjdCI7Ci0JCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZUFydGlmYWN0RWRpdCBwZXJzaXN0ZW5jZUFydGlmYWN0RWRpdDsKLQlwcm90ZWN0ZWQgT3JtQXJ0aWZhY3RFZGl0IG9ybUFydGlmYWN0RWRpdDsKKwkKKwlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgcGVyc2lzdGVuY2VYbWxSZXNvdXJjZTsKKwkKKwlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2Ugb3JtWG1sUmVzb3VyY2U7CiAJCiAJCiAJcHJvdGVjdGVkIENvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CkBAIC01NSwzNCArNjEsMjMgQEAKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0ID0gUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQl0aGlzLm9ybUFydGlmYWN0RWRpdCA9IE9ybUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCXdhaXRGb3JXb3Jrc3BhY2VKb2JzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUFsbFByb2plY3RzKCkgIHRocm93cyBFeGNlcHRpb257Ci0JCS8vZG9uJ3QgZGVsZXRlIHByb2plY3RzLCBjcmVhdGluZyBhIG5ldyBvbmUgd2l0aCBhIG5ldyBuYW1lCi0JCS8vd29ya3NwYWNlIHdpbGwgYmUgZGVsZXRlZCBuZXh0IHRpbWUgdGVzdHMgYXJlIHJ1bi4KLQkJLy9ub3Qgc2F5aW5nIHRoaXMgaXMgdGhlIHVsdGltYXRlIHNvbHV0aW9uLCBidXQgaXQgd2lsbCB3b3JrIGZvciBub3cKLQkJLy91bnRpbCB3ZSBjYW4gZmlndXJlIG91dCBob3cgdG8gcHJvcGVybHkgZGVsZXRlIHByb2plY3RzIGluIHRlc3RzCisJCXRoaXMucGVyc2lzdGVuY2VYbWxSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7CisJCXRoaXMub3JtWG1sUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7CisJCXRoaXMud2FpdEZvcldvcmtzcGFjZUpvYnNUb0ZpbmlzaCgpOwogCX0KIAkKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkvL2F0IGxlYXN0IGRlbGV0ZSB0aGUgcHJvamVjdCBmcm9tIHRoZSB3b3Jrc3BhY2Ugc2luY2UsIGRlbGV0aW5nIGZyb20gdGhlIGZpbGUgc3lzdGVtIGRvZXNuJ3Qgd29yayB3ZWxsLgotCQkvL3Rlc3RzIHJ1biB0b28gc2xvdyBvdGhlcndpc2UgYmVjYXVzZSBzbyBtYW55IHByb2plY3RzIGFyZSBjcmVhdGVkIGluIHRoZSB3b3Jrc3BhY2UKLQkJdGhpcy5wZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCXRoaXMucGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0aGlzLm9ybUFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCXRoaXMub3JtQXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZGVsZXRlKGZhbHNlLCB0cnVlLCBudWxsKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVhtbFJlc291cmNlID0gbnVsbDsKKwkJdGhpcy5vcm1YbWxSZXNvdXJjZSA9IG51bGw7CisJCUpwdENvcmVQbHVnaW4uZ2V0V29ya3NwYWNlUHJlZmVyZW5jZXMoKS5jbGVhcigpOworCQl0aGlzLndhaXRGb3JXb3Jrc3BhY2VKb2JzVG9GaW5pc2goKTsKIAkJc3VwZXIudGVhckRvd24oKTsKIAl9CiAJCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFRlc3RKYXZhUHJvamVjdCBidWlsZEphdmFQcm9qZWN0KGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGJ1aWxkSnBhUHJvamVjdChCQVNFX1BST0pFQ1RfTkFNRSwgYXV0b0J1aWxkLCBudWxsKTsKKwkJcmV0dXJuIGJ1aWxkSnBhUHJvamVjdChCQVNFX1BST0pFQ1RfTkFNRSwgYXV0b0J1aWxkLCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpKTsKIAl9CiAJCiAJcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkLCBJRGF0YU1vZGVsIGpwYUNvbmZpZykgCkBAIC05MCwxMiArODUsMjMgQEAKIAkJcmV0dXJuIFRlc3RKcGFQcm9qZWN0LmJ1aWxkSnBhUHJvamVjdChwcm9qZWN0TmFtZSwgYXV0b0J1aWxkLCBqcGFDb25maWcpOwogCX0KIAkKLQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBqcGFQcm9qZWN0KCkgeworCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgeworCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsJCQorCQkvLyBkZWZhdWx0IGZhY2V0IHZlcnNpb24gaXMgMi4wIC0gbW9zdCB0ZXN0cyB1c2UgMS4wCisJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCBKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzFfMCk7IC8vJE5PTi1OTFMtMSQKKwkJLy8gbW9zdCB0ZXN0cyB1c2UgdGhlIGJhc2ljIGdlbmVyaWMgcGxhdGZvcm0KKwkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STV9JRCwgR2VuZXJpY0pwYVBsYXRmb3JtUHJvdmlkZXIuSUQpOworCQkvLyBtb3N0IHRlc3RzIGRvIHVzZSBhbiBvcm0ueG1sCisJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9PUk1fWE1MLCBCb29sZWFuLlRSVUUpOworCQlyZXR1cm4gZGF0YU1vZGVsOworCX0KKwkKKwlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewogCQlyZXR1cm4gZ2V0SmF2YVByb2plY3QoKS5nZXRKcGFQcm9qZWN0KCk7CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIHdhaXRGb3JXb3Jrc3BhY2VKb2JzKCkgewotCQkvLyBUaGlzIGpvYiB3aWxsIG5vdCBmaW5pc2ggcnVubmluZyB1bnRpbCB0aGUgd29ya3NwYWNlIGpvYnMgYXJlIGRvbmUKKwlwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yV29ya3NwYWNlSm9ic1RvRmluaXNoKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJLy8gVGhpcyBqb2Igd2lsbCBub3Qgc3RhcnQgcnVubmluZyB1bnRpbCBhbGwgdGhlIG90aGVyIHdvcmtzcGFjZSBqb2JzIGFyZSBkb25lCiAJCUpvYiB3YWl0Sm9iID0gbmV3IEpvYigiV2FpdCBqb2IiKSB7CiAJCQkJQE92ZXJyaWRlCiAJCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewpAQCAtMTA0LDUxICsxMTAsNTIgQEAKIAkJCX07CiAJCXdhaXRKb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKIAkJd2FpdEpvYi5zY2hlZHVsZSgpOwotCQl0cnkgewotCQkJd2FpdEpvYi5qb2luKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGUgam9iIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQgZHVyaW5nIGEgd2FpdCAtIGlnbm9yZQotCQl9CisJCXdhaXRKb2Iuam9pbigpOwogCX0KIAkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VSZXNvdXJjZSBwZXJzaXN0ZW5jZVJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZUFydGlmYWN0RWRpdC5nZXRSZXNvdXJjZSgpOworCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkgeworCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVhtbFJlc291cmNlOwogCX0KIAkKLQlwcm90ZWN0ZWQgT3JtUmVzb3VyY2Ugb3JtUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLm9ybUFydGlmYWN0RWRpdC5nZXRSZXNvdXJjZShKcHRDb3JlUGx1Z2luLmdldERlZmF1bHRPcm1YbWxEZXBsb3ltZW50VVJJKGpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpKTsKKwlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZ2V0T3JtWG1sUmVzb3VyY2UoKSB7CisJCXJldHVybiB0aGlzLm9ybVhtbFJlc291cmNlOwogCX0KIAkKLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UoKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVJlc291cmNlKCkuZ2V0UGVyc2lzdGVuY2UoKTsKKwlwcm90ZWN0ZWQgWG1sRW50aXR5TWFwcGluZ3MgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKSB7CisJCXJldHVybiAoWG1sRW50aXR5TWFwcGluZ3MpIGdldE9ybVhtbFJlc291cmNlKCkuZ2V0Um9vdE9iamVjdCgpOwogCX0KIAkKLQlwcm90ZWN0ZWQgRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVVuaXQoKS5tYXBwaW5nRmlsZVJlZnMoKS5uZXh0KCkuZ2V0T3JtWG1sKCkuZ2V0RW50aXR5TWFwcGluZ3MoKTsKKwlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2UgZ2V0WG1sUGVyc2lzdGVuY2UoKSB7CisJCXJldHVybiAoWG1sUGVyc2lzdGVuY2UpIGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5nZXRSb290T2JqZWN0KCk7CiAJfQogCQotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VSZXNvdXJjZSgpLmdldFBlcnNpc3RlbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0cygpLmdldCgwKTsKKwlwcm90ZWN0ZWQgRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7CisJCU1hcHBpbmdGaWxlIG1hcHBpbmdGaWxlID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkubWFwcGluZ0ZpbGVSZWZzKCkubmV4dCgpLmdldE1hcHBpbmdGaWxlKCk7CisJCXJldHVybiAobWFwcGluZ0ZpbGUgPT0gbnVsbCkgPyBudWxsIDogKEVudGl0eU1hcHBpbmdzKSBtYXBwaW5nRmlsZS5nZXRSb290KCk7CiAJfQogCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gcm9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkucGVyc2lzdGVuY2VVbml0cygpLm5leHQoKTsKKwlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpIHsKKwkJcmV0dXJuIGdldFhtbFBlcnNpc3RlbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0cygpLmdldCgwKTsKIAl9CiAJCi0JcHJvdGVjdGVkIENsYXNzUmVmIGNsYXNzUmVmKCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCkubmV4dCgpOworCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgeworCQlyZXR1cm4gZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpLnBlcnNpc3RlbmNlVW5pdHMoKS5uZXh0KCk7CiAJfQogCQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gY2xhc3NSZWYoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwlwcm90ZWN0ZWQgQ2xhc3NSZWYgZ2V0U3BlY2lmaWVkQ2xhc3NSZWYoKSB7CisJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKS5uZXh0KCk7CiAJfQogCQotCXByb3RlY3RlZCBFbnRpdHkgamF2YUVudGl0eSgpIHsKLQkJcmV0dXJuIChFbnRpdHkpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpIHsKKwkJcmV0dXJuIGdldFNwZWNpZmllZENsYXNzUmVmKCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJfQorCQorCXByb3RlY3RlZCBKYXZhRW50aXR5IGdldEphdmFFbnRpdHkoKSB7CisJCXJldHVybiAoSmF2YUVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwogCX0KIAkKIAlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxDbGFzc1JlZihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwogCQkKIAkJWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKIAkJeG1sQ2xhc3NSZWYuc2V0SmF2YUNsYXNzKGNsYXNzTmFtZSk7CkBAIC0xNTYsNyArMTYzLDcgQEAKIAl9CiAJCiAJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sQ2xhc3NSZWYoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJWG1sSmF2YUNsYXNzUmVmIHhtbEphdmFDbGFzc1JlZlRvUmVtb3ZlICA9IG51bGw7CiAJCWZvciAoWG1sSmF2YUNsYXNzUmVmIHhtbEphdmFDbGFzc1JlZiA6IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkpIHsKIAkJCWlmICh4bWxKYXZhQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKQEAgLTE2OCw5ICsxNzUsMTcgQEAKIAkJfQogCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnJlbW92ZSh4bWxKYXZhQ2xhc3NSZWZUb1JlbW92ZSk7CiAJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZFhtbE1hcHBpbmdGaWxlUmVmKFN0cmluZyBmaWxlTmFtZSkgeworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCQorCQlYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKKwkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoZmlsZU5hbWUpOworCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKHhtbE1hcHBpbmdGaWxlUmVmKTsKKwl9CiAKLQlwcm90ZWN0ZWQgSnBhUm9vdENvbnRleHROb2RlIHJvb3RDb250ZXh0KCkgewotCQlyZXR1cm4gZ2V0SmF2YVByb2plY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHQoKTsKKwlwcm90ZWN0ZWQgSnBhUm9vdENvbnRleHROb2RlIGdldFJvb3RDb250ZXh0Tm9kZSgpIHsKKwkJcmV0dXJuIGdldEphdmFQcm9qZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFJvb3RDb250ZXh0Tm9kZSgpOwogCX0KIAkKIAlAT3ZlcnJpZGUKQEAgLTE3OSwxNiArMTk0LDYgQEAKIAl9CiAJCiAJcHJvdGVjdGVkIHZvaWQgZGVsZXRlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3lzdGVtLmdjKCk7CiAJCVdvcmtiZW5jaFJlc291cmNlSGVscGVyLmRlbGV0ZVJlc291cmNlKHJlc291cmNlKTsKLQkJd2FpdEZvcldvcmtzcGFjZUpvYnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgYW5ub3RhdGlvbkJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImphdmF4LnBlcnNpc3RlbmNlIiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVFbnVtQW5kTWVtYmVycyhTdHJpbmcgZW51bU5hbWUsIFN0cmluZyBlbnVtQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiamF2YXgucGVyc2lzdGVuY2UiLCBlbnVtTmFtZSArICIuamF2YSIsICJwdWJsaWMgZW51bSAiICsgZW51bU5hbWUgKyAiIHsgIiArIGVudW1Cb2R5ICsgIiB9Iik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwYUZpbGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwYUZpbGVUZXN0cy5qYXZhCmluZGV4IGNkYjRlYzUuLjU5OTJmNzQgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcGFGaWxlVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnBhRmlsZVRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTcsMTcgKzE3LDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSnBhRmlsZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwdWJsaWMgSnBhRmlsZVRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0zOSwxNyArMzksMTEgQEAKIAkJc3VwZXIuc2V0VXAoKTsKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CiAJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAl9CiAJCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCi0JCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02MywxMiArNTcsMTIgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldFJvb3RTdHJ1Y3R1cmVOb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJSUZpbGUgZmlsZSA9IG9ybVJlc291cmNlKCkuZ2V0UmVzb3VyY2VNb2RlbCgpLmdldEZpbGUoKTsKKwkJSUZpbGUgZmlsZSA9IGdldE9ybVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpOwogCQlKcGFGaWxlIG9ybVhtbEpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoZmlsZSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoZW50aXR5TWFwcGluZ3MoKSwgb3JtWG1sSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoZ2V0RW50aXR5TWFwcGluZ3MoKSwgb3JtWG1sSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwogCQkKIAkJCiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7CkBAIC04MiwxMTAgKzc2LDExNCBAQAogCQkvL3BlcnNpc3RlbmNlLnhtbCA8Y2xhc3M+IHRhZyBhbmQgbWFwcGluZyBmaWxlIDxlbnRpdHk+IHRhZyBleGlzdCBmb3IgYSBwYXJ0aWN1bGFyeSBqYXZhIGNsYXNzCiAJCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKIAotCQllbnRpdHlNYXBwaW5ncygpLnJlbW92ZU9ybVBlcnNpc3RlbnRUeXBlKG9ybVBlcnNpc3RlbnRUeXBlKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZShvcm1QZXJzaXN0ZW50VHlwZSk7CiAKLQkJYXNzZXJ0RXF1YWxzKGphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoZ2V0SmF2YUVudGl0eSgpLmdldFBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7CiAKLQkJb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0RW50aXR5TWFwcGluZ3NSb290U3RydWN0dXJlTm9kZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IG9ybVJlc291cmNlKCkuZ2V0UmVzb3VyY2VNb2RlbCgpLmdldEZpbGUoKTsKKwkJSUZpbGUgZmlsZSA9IGdldE9ybVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpOwogCQlKcGFGaWxlIG9ybVhtbEpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHlNYXBwaW5ncygpLCBvcm1YbWxKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7CisJCWFzc2VydEVxdWFscyhnZXRFbnRpdHlNYXBwaW5ncygpLCBvcm1YbWxKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7CiAJCQotCQkoKE9ybVhtbCkgZW50aXR5TWFwcGluZ3MoKS5nZXRQYXJlbnQoKSkucmVtb3ZlRW50aXR5TWFwcGluZ3MoKTsKKwkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSAoSnBhWG1sUmVzb3VyY2UpIG9ybVhtbEpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpOworCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZShyZXNvdXJjZS5nZXRSb290T2JqZWN0KCkpOwogCQkKIAkJYXNzZXJ0RmFsc2Uob3JtWG1sSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5oYXNOZXh0KCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RJbXBsaWVkRW50aXR5TWFwcGluZ3NSb290U3RydWN0dXJlTm9kZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IG9ybVJlc291cmNlKCkuZ2V0UmVzb3VyY2VNb2RlbCgpLmdldEZpbGUoKTsKKwkJSUZpbGUgZmlsZSA9IGdldE9ybVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpOwogCQlKcGFGaWxlIG9ybVhtbEpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoZmlsZSk7CiAJCQotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCQlhc3NlcnRFcXVhbHMocGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkuZ2V0T3JtWG1sKCkuZ2V0RW50aXR5TWFwcGluZ3MoKSwgb3JtWG1sSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQkJCQotCQlwZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKS5nZXRPcm1YbWwoKS5yZW1vdmVFbnRpdHlNYXBwaW5ncygpOwkJCisJCWFzc2VydE51bGwoZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOworCQkKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkucmVtb3ZlKDApOworCQlhc3NlcnROb3ROdWxsKGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKKwkJYXNzZXJ0RXF1YWxzKGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpLmdldE1hcHBpbmdGaWxlKCkuZ2V0Um9vdCgpLCBvcm1YbWxKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7CisJCQorCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IChKcGFYbWxSZXNvdXJjZSkgb3JtWG1sSnBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCk7CisJCXJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKHJlc291cmNlLmdldFJvb3RPYmplY3QoKSk7CisJCQogCQlhc3NlcnRGYWxzZShvcm1YbWxKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLmhhc05leHQoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RFbnRpdHlNYXBwaW5nc1Jvb3RTdHJ1Y3R1cmVOb2RlUmVtb3ZlZEZyb21SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGUgPSBvcm1SZXNvdXJjZSgpLmdldFJlc291cmNlTW9kZWwoKS5nZXRGaWxlKCk7CisJCUlGaWxlIGZpbGUgPSBnZXRPcm1YbWxSZXNvdXJjZSgpLmdldEZpbGUoKTsKIAkJSnBhRmlsZSBvcm1YbWxKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5TWFwcGluZ3MoKSwgb3JtWG1sSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoZ2V0RW50aXR5TWFwcGluZ3MoKSwgb3JtWG1sSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLnJlbW92ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkpOworCQlnZXRPcm1YbWxSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkucmVtb3ZlKGdldE9ybVhtbFJlc291cmNlKCkuZ2V0Um9vdE9iamVjdCgpKTsKIAkJCiAJCWFzc2VydEZhbHNlKG9ybVhtbEpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkuaGFzTmV4dCgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUGVyc2lzdGVuY2VSb290U3RydWN0dXJlTm9kZVBlcnNpc3RlbmNlUmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gcGVyc2lzdGVuY2VSZXNvdXJjZSgpLmdldFJlc291cmNlTW9kZWwoKS5nZXRGaWxlKCk7CisJCUlGaWxlIGZpbGUgPSBnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpOwogCQlKcGFGaWxlIHBlcnNpc3RlbmNlWG1sSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQkJYXNzZXJ0RXF1YWxzKHJvb3RDb250ZXh0KCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpLCBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKSwgcGVyc2lzdGVuY2VYbWxKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7CiAJCQotCQlyb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCkucmVtb3ZlUGVyc2lzdGVuY2UoKTsJCisJCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gKEpwYVhtbFJlc291cmNlKSBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpOworCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZShyZXNvdXJjZS5nZXRSb290T2JqZWN0KCkpOworCQkKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VYbWxKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLmhhc05leHQoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcm1KYXZhUm9vdFN0cnVjdHVyZU5vZGVQZXJzaXN0ZW5jZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlJRmlsZSBmaWxlID0gZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLmdldEZpbGUoKTsKKwkJSnBhRmlsZSBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoZmlsZSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwogCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7CiAJCQogCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7CiAJCQotCQlyb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCkucmVtb3ZlUGVyc2lzdGVuY2UoKTsKKwkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSAoSnBhWG1sUmVzb3VyY2UpIHBlcnNpc3RlbmNlWG1sSnBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCk7CisJCXJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKHJlc291cmNlLmdldFJvb3RPYmplY3QoKSk7CisJCQogCQlhc3NlcnRGYWxzZShqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5oYXNOZXh0KCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSmF2YVJvb3RTdHJ1Y3R1cmVOb2RlUGVyc2lzdGVuY2VSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKKwkJSUZpbGUgZmlsZSA9IGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7CisJCUpwYUZpbGUgcGVyc2lzdGVuY2VYbWxKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCiAJCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKIAkJCi0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwogCQkKLQkJcm9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLnJlbW92ZVBlcnNpc3RlbmNlKCk7CisJCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gKEpwYVhtbFJlc291cmNlKSBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpOworCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZShyZXNvdXJjZS5nZXRSb290T2JqZWN0KCkpOworCQkKIAkJYXNzZXJ0RmFsc2UoamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkuaGFzTmV4dCgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVuY2VSb290U3RydWN0dXJlTm9kZVJlbW92ZWRGcm9tUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gcGVyc2lzdGVuY2VSZXNvdXJjZSgpLmdldFJlc291cmNlTW9kZWwoKS5nZXRGaWxlKCk7CisJCUlGaWxlIGZpbGUgPSBnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpOwogCQlKcGFGaWxlIHBlcnNpc3RlbmNlWG1sSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQkJcm9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCk7Ci0JCWFzc2VydEVxdWFscyhyb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKSwgcGVyc2lzdGVuY2VYbWxKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7CisJCWdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKTsKKwkJYXNzZXJ0RXF1YWxzKGdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKSwgcGVyc2lzdGVuY2VYbWxKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7CiAJCQotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5yZW1vdmUocGVyc2lzdGVuY2VSZXNvdXJjZSgpLmdldFBlcnNpc3RlbmNlKCkpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5yZW1vdmUoZ2V0WG1sUGVyc2lzdGVuY2UoKSk7CiAJCQogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVhtbEpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkuaGFzTmV4dCgpKTsKIAl9CiAJCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVBlcnNpc3RlbmNlUm9vdFN0cnVjdHVyZU5vZGVQZXJzaXN0ZW5jZVhtbFJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IHBlcnNpc3RlbmNlUmVzb3VyY2UoKS5nZXRSZXNvdXJjZU1vZGVsKCkuZ2V0RmlsZSgpOwotCQlKcGFGaWxlIHBlcnNpc3RlbmNlWG1sSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQkJYXNzZXJ0RXF1YWxzKHJvb3RDb250ZXh0KCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpLCBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKLQkJCi0JCXJvb3RDb250ZXh0KCkucmVtb3ZlUGVyc2lzdGVuY2VYbWwoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VYbWxKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLmhhc05leHQoKSk7Ci0JfQotCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcm1KYXZhUm9vdFN0cnVjdHVyZU5vZGVQZXJzaXN0ZW5jZVhtbFJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwogCQkKLQkJcm9vdENvbnRleHQoKS5yZW1vdmVQZXJzaXN0ZW5jZVhtbCgpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5yZW1vdmUoZ2V0WG1sUGVyc2lzdGVuY2UoKSk7CiAJCWFzc2VydEZhbHNlKGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLmhhc05leHQoKSk7CiAJfQogCQpAQCAtMTk1LDIzICsxOTMsMjMgQEAKIAkJCiAJCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKIAkJCi0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwogCQkKLQkJcm9vdENvbnRleHQoKS5yZW1vdmVQZXJzaXN0ZW5jZVhtbCgpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5yZW1vdmUoZ2V0WG1sUGVyc2lzdGVuY2UoKSk7CiAJCWFzc2VydEZhbHNlKGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLmhhc05leHQoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RPcm1KYXZhUGVyc2lzdGVudFR5cGVSb290U3RydWN0dXJlTm9kZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7CiAJCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKIAkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwogCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIE9ybUVudGl0eSk7CisJCWFzc2VydFRydWUoamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpLmdldFBhcmVudCgpIGluc3RhbmNlb2YgT3JtUGVyc2lzdGVudFR5cGUpOwogCQkKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlT3JtUGVyc2lzdGVudFR5cGUoMCk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlUGVyc2lzdGVudFR5cGUoMCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoMSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpKTsKIAkJYXNzZXJ0VHJ1ZShqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBDbGFzc1JlZik7CkBAIC0yMTksMTYgKzIxNywxNiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0T3JtSmF2YVBlcnNpc3RlbnRUeXBlUm9vdFN0cnVjdHVyZU5vZGVSZW1vdmVkRnJvbVJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7CiAJCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKIAkJCiAJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKIAkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBPcm1FbnRpdHkpOworCQlhc3NlcnRUcnVlKGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIE9ybVBlcnNpc3RlbnRUeXBlKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLnJlbW92ZSgwKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLnJlbW92ZSgwKTsKIAkJCiAJCWFzc2VydEVxdWFscygxLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwogCQlhc3NlcnRUcnVlKGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIENsYXNzUmVmKTsKQEAgLTI0MCwxMyArMjM4LDEzIEBACiAJCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKIAkJCiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gamF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKIAkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCkubmV4dCgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkuZ2V0UGFyZW50KCkpOworCQlhc3NlcnRFcXVhbHMoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKS5uZXh0KCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKS5nZXRQYXJlbnQoKSk7CiAJCQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVNwZWNpZmllZENsYXNzUmVmKDApOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVNwZWNpZmllZENsYXNzUmVmKDApOwogCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpLm5leHQoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpLmdldFBhcmVudCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpLm5leHQoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpLmdldFBhcmVudCgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEphdmFQZXJzaXN0ZW50VHlwZVJvb3RTdHJ1Y3R1cmVOb2RlUmVtb3ZlZEZyb21SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yNTQsMjQgKzI1MiwyNCBAQAogCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7CiAJCQogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CiAJCUl0ZXJhdG9yPEpwYVN0cnVjdHVyZU5vZGU+IHJvb3RTdHJ1Y3R1cmVOb2RlcyA9IGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpOwogCQlKcGFTdHJ1Y3R1cmVOb2RlIHJvb3RTdHJ1Y3R1cmVOb2RlID0gcm9vdFN0cnVjdHVyZU5vZGVzLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgcm9vdFN0cnVjdHVyZU5vZGUpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKS5uZXh0KCksIHJvb3RTdHJ1Y3R1cmVOb2RlLmdldFBhcmVudCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCkubmV4dCgpLCByb290U3RydWN0dXJlTm9kZS5nZXRQYXJlbnQoKSk7CiAJCWFzc2VydEZhbHNlKHJvb3RTdHJ1Y3R1cmVOb2Rlcy5oYXNOZXh0KCkpOwogCQkKIAkJcmVtb3ZlWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCkubmV4dCgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkuZ2V0UGFyZW50KCkpOworCQlhc3NlcnRFcXVhbHMoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCkubmV4dCgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkuZ2V0UGFyZW50KCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RJbXBsaWVkSmF2YVBlcnNpc3RlbnRUeXBlUm9vdFN0cnVjdHVyZU5vZGVSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKHRydWUpOworCQlnZXRKcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyh0cnVlKTsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwogCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IHBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKS5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCkubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwogCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwogCQkKIAkJamF2YVBlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKQEAgLTI4MCw3ICsyNzgsNyBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0SmF2YVJvb3RTdHJ1Y3R1cmVOb2Rlc0VudGl0eU1hcHBpbmdzUmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwpAQCAtMjg4LDE0ICsyODYsMTQgQEAKIAkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwogCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLnJlbW92ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkpOworCQlnZXRPcm1YbWxSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkucmVtb3ZlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkpOwogCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2Rlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhwZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCkubmV4dCgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkuZ2V0UGFyZW50KCkpOworCQlhc3NlcnRFcXVhbHMoZ2V0UGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpLm5leHQoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpLmdldFBhcmVudCgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEphdmFSb290U3RydWN0dXJlTm9kZXNQZXJzaXN0ZW5jZVVuaXRSZW1vdmVkRnJvbVJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7CiAJCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKQEAgLTMwMywxNCArMzAxLDE0IEBACiAJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKIAkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKIAkJCi0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5nZXRQZXJzaXN0ZW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5yZW1vdmUoMCk7CisJCWdldFhtbFBlcnNpc3RlbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnJlbW92ZSgwKTsKIAogCQlhc3NlcnRGYWxzZShqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5oYXNOZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoMCwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEphdmFSb290U3RydWN0dXJlTm9kZXNQZXJzaXN0ZW5jZVVuaXRSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwogCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7CkBAIC0zMTgsMTQgKzMxNiwxNCBAQAogCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CiAJCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7CiAJCQotCQlqcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkucmVtb3ZlUGVyc2lzdGVuY2VVbml0KDApOworCQlnZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpLnJlbW92ZVBlcnNpc3RlbmNlVW5pdCgwKTsKIAogCQlhc3NlcnRGYWxzZShqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5oYXNOZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoMCwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0SmF2YVJvb3RTdHJ1Y3R1cmVOb2Rlc09ybVBlcnNpc3RlbnRUeXBlUmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwpAQCAtMzMzLDE0ICszMzEsMTQgQEAKIAkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwogCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwogCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVPcm1QZXJzaXN0ZW50VHlwZSgwKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKIAkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscygxLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCkubmV4dCgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkuZ2V0UGFyZW50KCkpOworCQlhc3NlcnRFcXVhbHMoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCkubmV4dCgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkuZ2V0UGFyZW50KCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0SmF2YVJvb3RTdHJ1Y3R1cmVOb2Rlc09ybVR5cGVNYXBwaW5nTW9ycGhlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwpAQCAtMzUwLDMwICszNDgsMzAgQEAKIAkKIAkJb3JtUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRFcXVhbHMoMSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpKTsKLQkJamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCWphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkucGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwogCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwogCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVPcm1QZXJzaXN0ZW50VHlwZSgwKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKIAkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscygxLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCkubmV4dCgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkuZ2V0UGFyZW50KCkpOworCQlhc3NlcnRFcXVhbHMoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCkubmV4dCgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkuZ2V0UGFyZW50KCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT3JtSmF2YVJvb3RTdHJ1Y3R1cmVOb2RlTWFwcGluZ0ZpbGVSZWZDaGFuZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7CiAJCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKIAkJCiAJCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKIAkJCi0JCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gcGVyc2lzdGVuY2VVbml0KCkubWFwcGluZ0ZpbGVSZWZzKCkubmV4dCgpOworCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLm1hcHBpbmdGaWxlUmVmcygpLm5leHQoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoImZvbyIpOwogCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUgPSBwZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKS5nZXRPcm1YbWwoKS5nZXRFbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLm5leHQoKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUgPSAoKEVudGl0eU1hcHBpbmdzKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKS5nZXRNYXBwaW5nRmlsZSgpLmdldE1hcHBpbmdGaWxlUm9vdCgpKS5wZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKIAkJCi0JCUlGaWxlIGZpbGUgPSBwZXJzaXN0ZW5jZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VNb2RlbCgpLmdldEZpbGUoKTsKKwkJSUZpbGUgZmlsZSA9IGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7CiAJCUpwYUZpbGUgb3JtWG1sSnBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsJCQogCQkKIAkJYXNzZXJ0RXF1YWxzKDEsIG9ybVhtbEpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpKTsKQEAgLTM4NSwxNiArMzgzLDE2IEBACiAJCQogCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7CisJCWFzc2VydEVxdWFscyhnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKIAkJCi0JCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gcGVyc2lzdGVuY2VVbml0KCkubWFwcGluZ0ZpbGVSZWZzKCkubmV4dCgpOworCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLm1hcHBpbmdGaWxlUmVmcygpLm5leHQoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7CisJCWFzc2VydEVxdWFscyhnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzKCkubmV4dCgpKTsKIAl9CiAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSmF2YVJvb3RTdHJ1Y3V0cmVOb2RlRGVsZXRlT3JtUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7CiAJCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKQEAgLTQwMywxMiArNDAxLDExIEBACiAJCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKSk7CiAKIAkJCi0JCWRlbGV0ZVJlc291cmNlKG9ybVJlc291cmNlKCkpOworCQlkZWxldGVSZXNvdXJjZShnZXRPcm1YbWxSZXNvdXJjZSgpKTsKIAkJCiAJCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoMSwgamF2YUpwYUZpbGUucm9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKS5uZXh0KCksIGphdmFKcGFGaWxlLnJvb3RTdHJ1Y3R1cmVOb2RlcygpLm5leHQoKS5nZXRQYXJlbnQoKSk7CisJCWFzc2VydEVxdWFscyhnZXRQZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCkubmV4dCgpLCBqYXZhSnBhRmlsZS5yb290U3RydWN0dXJlTm9kZXMoKS5uZXh0KCkuZ2V0UGFyZW50KCkpOwogCX0KLQkKIAkvL1RPRE8gdGVzdCByb290U3RydWN0dXJlTm9kZXMgd2l0aCBhIHN0YXRpYyBpbm5lciBjbGFzcwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcGFQcm9qZWN0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcGFQcm9qZWN0VGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDFlYWZiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwYVByb2plY3RUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgSnBhUHJvamVjdFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKK3sKKwlzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfUFJPSkVDVF9OQU1FID0gSnBhUHJvamVjdFRlc3RzLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKwkKKwlUZXN0SnBhUHJvamVjdCBqcGFQcm9qZWN0OworCisJCisJcHVibGljIEpwYVByb2plY3RUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQl0aGlzLmpwYVByb2plY3QgPSBUZXN0SnBhUHJvamVjdC5idWlsZEpwYVByb2plY3QoQkFTRV9QUk9KRUNUX05BTUUsIGZhbHNlKTsgLy8gZmFsc2UgPSBubyBhdXRvLWJ1aWxkCisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOworCQl0aGlzLmpwYVByb2plY3QgPSBudWxsOworCQlzdXBlci50ZWFyRG93bigpOworCX0KKwkKKwlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgeworCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldEpwYVByb2plY3QoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOworCQlhc3NlcnRFcXVhbHMoSnB0Q29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKKwkJCisJCS8vZGVsZXRlIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKQorCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7CisJCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpOworCQlhc3NlcnROdWxsKHJlc291cmNlKTsKKwkJCisJCS8vYWRkIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSBiYWNrCisJCWNyZWF0ZVBlcnNpc3RlbmNlWG1sRmlsZSgpOworCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7CisJCWFzc2VydEVxdWFscyhKcHRDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlUGVyc2lzdGVuY2VYbWxGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlEYXRhTW9kZWwgY29uZmlnID0KKwkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBQZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOworCQljb25maWcuc2V0UHJvcGVydHkoUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXROYW1lKCkpOworCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7CisJCWFzc2VydEVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7CisJCQorCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKKwkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOworCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOworCQlhc3NlcnROdWxsKHJlc291cmNlKTsKKwkJCisJCS8vYWRkIHRoZSBkZWZhdWx0IG9ybS54bWwgZmlsZSBiYWNrCisJCWNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlKCk7CisJCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOworCQlhc3NlcnRFcXVhbHMoSnB0Q29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSURhdGFNb2RlbCBjb25maWcgPQorCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOworCQljb25maWcuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIGdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKKwkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlT3JtWG1sRmlsZShTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBFeGNlcHRpb24geworCQlJRGF0YU1vZGVsIGNvbmZpZyA9CisJCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CisJCWNvbmZpZy5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXROYW1lKCkpOworCQljb25maWcuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX1BBVEgsIGZpbGVQYXRoKTsKKwkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nRmlsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKKwkJYXNzZXJ0RXF1YWxzKEpwdENvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKKwkJCisJCS8vZGVsZXRlIHRoZSBvcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXRNYXBwaW5nRmlsZVJlc291cmNlKCkKKwkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOworCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7CisJCQorCQkvL2FkZCB0aGUgIG9ybS54bWwgZmlsZSBiYWNrCisJCWNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlKCk7CisJCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKKwkJYXNzZXJ0RXF1YWxzKEpwdENvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdGaWxlUmVzb3VyY2VEaWZmZXJlbnRseU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKCJNRVRBLUlORi9vcm0yLnhtbCIpOworCQlhc3NlcnROdWxsKHJlc291cmNlKTsKKworCQkvL2NyZWF0ZSB0aGUgb3JtMi54bWwgZmlsZQorCQljcmVhdGVPcm1YbWxGaWxlKCJNRVRBLUlORi9vcm0yLnhtbCIpOworCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoIk1FVEEtSU5GL29ybTIueG1sIik7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOworCQlhc3NlcnRFcXVhbHMoSnB0Q29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybTIueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKKwkJCisJCS8vZGVsZXRlIHRoZSBvcm0yLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpCisJCXJlc291cmNlLmRlbGV0ZShudWxsKTsKKwkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKCJNRVRBLUlORi9vcm0yLnhtbCIpOworCQlhc3NlcnROdWxsKHJlc291cmNlKTsKKwkJCisJCS8vYWRkIHRoZSBvcm0yLnhtbCBmaWxlIGJhY2sKKwkJY3JlYXRlT3JtWG1sRmlsZSgiTUVUQS1JTkYvb3JtMi54bWwiKTsKKwkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKCJNRVRBLUlORi9vcm0yLnhtbCIpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKKwkJYXNzZXJ0RXF1YWxzKEpwdENvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0yLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdENvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdENvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmluZGV4IDMwN2UzMDUuLmFjY2YwN2EgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcHRDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnB0Q29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAorICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAogICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKQEAgLTE2LDE5ICsxNiwyMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YS5KcHRDb3JlQ29udGV4dEphdmFNb2RlbFRlc3RzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtLkpwdENvcmVPcm1Db250ZXh0TW9kZWxUZXN0czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkpwdENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWMyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5HZW5lcmljMl8wT3JtQ29udGV4dE1vZGVsVGVzdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWMyXzBQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzOwogCiBwdWJsaWMgY2xhc3MgSnB0Q29yZUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKIHsKIAlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBzdWl0ZSh0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKGJvb2xlYW4gYWxsKSB7CiAJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29yZUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShKcGFQcm9qZWN0VGVzdHMuY2xhc3MpOwogCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSnBhRmlsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZShhbGwpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoYWxsKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0Q29yZUNvbnRleHRKYXZhTW9kZWxUZXN0cy5zdWl0ZShhbGwpKTsKKwkJc3VpdGUuYWRkVGVzdChKcHRDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChKcHRDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7CisJCXN1aXRlLmFkZFRlc3QoSnB0Q29yZUNvbnRleHRKYXZhTW9kZWxUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChHZW5lcmljMl8wSmF2YUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOworCQlzdWl0ZS5hZGRUZXN0KEdlbmVyaWMyXzBPcm1Db250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChHZW5lcmljMl8wUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKIAkJcmV0dXJuIHN1aXRlOwogCX0KIApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViMDRhZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKQEAgLTAsMCArMSwyMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCit7CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQElkIik7CisJCQl9CisJCX0pOworCX0KKworCQkKKwlwdWJsaWMgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCQorCQlhc3NlcnRFcXVhbHMoImlkIiwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhSWRNYXBwaW5nKTsKKworCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkobnVsbCk7CisJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhQmFzaWNNYXBwaW5nKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUlkTWFwcGluZyk7CisKKwkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KG51bGwpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE1hcHBpbmdOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKworCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CisJCQorCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkobnVsbCk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7CisKKwkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUVtYmVkZGVkTWFwcGluZyk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNYXBwaW5nS2V5MigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CisKKwkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUVtYmVkZGVkTWFwcGluZyk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE1hcHBpbmdLZXlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CisKKwkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCQorCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdLZXlNYXBwaW5nQ2hhbmdlSW5SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLnNldFByaW1hcnlBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIG5ldyBTdHJpbmdbMF0pOworCQkKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0tleU1hcHBpbmdDaGFuZ2VJblJlc291cmNlTW9kZWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBuZXcgU3RyaW5nWzBdKTsKKwkJCQkKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzMyMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEKQEAgLTAsMCArMSw3NTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKKwkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKKwkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CisJfQorCQkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQorCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJASWQiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJASWQiKTsKKwkJCX0KKwkJfSk7CisJfQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRBbmRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQElkIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKworCQl9KTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN1YlR5cGVXaXRoRmllbGRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdWJUeXBlV2l0aE1ldGhvZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdWJUeXBlTm9uUGVyc2lzdGVudCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZVBlcnNpc3RlbnRFeHRlbmRzTm9uUGVyc2lzdGVudCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZDIuamF2YSIsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZDIiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJleHRlbmRzIEFubm90YXRpb25UZXN0VHlwZUNoaWxkICIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJASWQiKTsKKwkJCX0KKwkJfSk7CisJfQorCQkKKwlwdWJsaWMgR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzTm90aGluZ0Fubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NGaWVsZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFjY2Vzc1Byb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFjY2Vzc0ZpZWxkQW5kTWV0aG9kQW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZEFuZE1ldGhvZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQkKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJY2xhc3NSZWZzLm5leHQoKTsKKwkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOworCQkKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJfQorCQkKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2UyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCWNsYXNzUmVmcy5uZXh0KCk7CisJCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKKwkJCisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKKwkJCisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCX0JCisJCQorCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NJbmhlcml0YW5jZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlV2l0aE1ldGhvZEFubm90YXRpb24oKTsKKwkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCQorCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQljbGFzc1JlZnMubmV4dCgpOworCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7CisJCQorCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwl9CQorCQkKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2U0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGVXaXRoRmllbGRBbm5vdGF0aW9uKCk7CisJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQkKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJY2xhc3NSZWZzLm5leHQoKTsKKwkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJfQorCQorCS8vaW5oZXJpdGVkIGNsYXNzIGhhdmluZyBhbm5vdGF0aW9ucyBzZXQgd2lucyBvdmVyIHRoZSBkZWZhdWx0IGFjY2VzcyBzZXQgb24gcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cworCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NJbmhlcml0YW5jZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOworCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCWNsYXNzUmVmcy5uZXh0KCk7CisJCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKKwkJCisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NYbWxOb0FjY2Vzc05vQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sRW50aXR5QWNjZXNzTm9Bbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCisKKwkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKworCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNBY2Nlc3NOb0Fubm90YXRpb25zKCkgIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbEVudGl0eVByb3BlcnR5QWNjZXNzQW5kRmllbGRBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworCQkvL3htbCBhY2Nlc3Mgc2V0IHRvIHByb3BlcnR5LCBmaWVsZCBhbm5vdGF0aW9ucywgSmF2YVBlcnNpc3RlbnRUeXBlIGFjY2VzcyBpcyBmaWVsZAorCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKKworCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sRW50aXR5RmllbGRBY2Nlc3NBbmRQcm9wZXJ0eUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8veG1sIGFjY2VzcyBzZXQgdG8gZmllbGQsIHByb3BlcnR5IGFubm90YXRpb25zLCBKYXZhUGVyc2lzdGVudFR5cGUgYWNjZXNzIGlzIHByb3BlcnR5CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKKworCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNBY2Nlc3NGaWVsZEFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAorCisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJfQorCisJLy9pbmhlcml0YW5jZSB3aW5zIG92ZXIgZW50aXR5LW1hcHBpbmdzIHNwZWNpZmllZCBhY2Nlc3MKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sRW50aXR5TWFwcGluZ3NBY2Nlc3NXaXRoSW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRFbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJCisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlID0gY2hpbGRFbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCisKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbE1ldGFkYXRhQ29tcGxldGVGaWVsZEFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8veG1sIGFjY2VzcyBzZXQgdG8gcHJvcGVydHksIGphdmEgaGFzIGZpZWxkIGFubm90YXRpb25zIHNvIHRoZSBhY2Nlc3Mgc2hvdWxkIGJlIGZpZWxkCisJCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAorCisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwkJCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NOb1htbEFjY2Vzc1htbE1ldGRhdGFDb21wbGV0ZVByb3BlcnR5QW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy94bWwgYWNjZXNzIG5vdCBzZXQsIG1ldGFkYXRhIGNvbXBsZXRlIHNldC4gIEphdmFQZXJzaXN0ZW50VHlwZSBhY2Nlc3MgaXMgcHJvcGVydHkgYmVjYXVzZSBwcm9wZXJ0aWVzIGFyZSBhbm5vdGF0ZWQKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAorCisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTdXBlclBlcnNpc3RlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGVXaXRoRmllbGRBbm5vdGF0aW9uKCk7CisJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQkKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgcm9vdEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJCisJCWFzc2VydEVxdWFscyhyb290SmF2YVBlcnNpc3RlbnRUeXBlLCBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOworCQlhc3NlcnROdWxsKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFN1cGVyUGVyc2lzdGVudFR5cGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGVXaXRoRmllbGRBbm5vdGF0aW9uKCk7CisJCQorCQkvL3N1cGVyIGlzIG5vdCBhZGRlZCB0byB0aGUgcGVyc2lzdGVuY2VVbml0LCBidXQgaXQgc2hvdWxkIHN0aWxsIGJlIGZvdW5kCisJCS8vYXMgdGhlIHN1cGVyUGVyc2lzdGVudFR5cGUgYmVjYXVzZSBvZiBpbXBsaWVkQ2xhc3NSZWZzIGFuZCBjaGFuZ2VzIGZvciBidWcgMTkwMzE3CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJYXNzZXJ0Tm90TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKKwl9CQorCQorCS8vRW50aXR5IGV4dGVuZHMgTm9uLUVudGl0eSBleHRlbmRzIEVudGl0eSAKKwlwdWJsaWMgdm9pZCB0ZXN0U3VwZXJQZXJzaXN0ZW50VHlwZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOworCQljcmVhdGVUZXN0U3ViVHlwZU5vblBlcnNpc3RlbnQoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGVQZXJzaXN0ZW50RXh0ZW5kc05vblBlcnNpc3RlbnQoKTsKKwkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkMiIpOworCQkKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgcm9vdEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJCisJCWFzc2VydEVxdWFscyhyb290SmF2YVBlcnNpc3RlbnRUeXBlLCBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOworCQlhc3NlcnROdWxsKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEluaGVyaXRhbmNlSGllcmFyY2h5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGVOb25QZXJzaXN0ZW50KCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlUGVyc2lzdGVudEV4dGVuZHNOb25QZXJzaXN0ZW50KCk7CisJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZDIiKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSByb290SmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJCisJCUl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlPiBpbmhlcml0YW5jZUhpZXJhcmNoeSA9IGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLmluaGVyaXRhbmNlSGllcmFyY2h5KCk7CQorCQkKKwkJYXNzZXJ0RXF1YWxzKGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLCBpbmhlcml0YW5jZUhpZXJhcmNoeS5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMocm9vdEphdmFQZXJzaXN0ZW50VHlwZSwgaW5oZXJpdGFuY2VIaWVyYXJjaHkubmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEluaGVyaXRhbmNlSGllcmFyY2h5MigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlTm9uUGVyc2lzdGVudCgpOworCQljcmVhdGVUZXN0U3ViVHlwZVBlcnNpc3RlbnRFeHRlbmRzTm9uUGVyc2lzdGVudCgpOworCQkKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZDIiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgcm9vdEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCQorCQlJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4gaW5oZXJpdGFuY2VIaWVyYXJjaHkgPSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5pbmhlcml0YW5jZUhpZXJhcmNoeSgpOwkKKwkJCisJCWFzc2VydEVxdWFscyhjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSwgaW5oZXJpdGFuY2VIaWVyYXJjaHkubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUsIGluaGVyaXRhbmNlSGllcmFyY2h5Lm5leHQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdFR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nS2V5TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7CisKKwkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJCisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldE1hcHBpbmdLZXkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKKworCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwaW5nS2V5TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOworCisJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdLZXlNYXBwaW5nQ2hhbmdlSW5SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJdHlwZVJlc291cmNlLnNldFByaW1hcnlBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgbmV3IFN0cmluZ1swXSk7CisJCQkJCisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nS2V5TWFwcGluZ0NoYW5nZUluUmVzb3VyY2VNb2RlbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdFR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQl0eXBlUmVzb3VyY2Uuc2V0UHJpbWFyeUFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIG5ldyBTdHJpbmdbMF0pOworCQkJCQorCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdElzTWFwcGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5pc01hcHBlZCgpKTsKKwkJCisJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsJCisJCWFzc2VydEZhbHNlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmlzTWFwcGVkKCkpOwkKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZEFuZE1ldGhvZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVzU2l6ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkQW5kTWV0aG9kKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCisJCWFzc2VydEVxdWFscygyLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU5hbWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJCisJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZm9vIikpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTmFtZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIik7CisJCQorCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJCisJCWFzc2VydE51bGwoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImZvbyIpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFJlbmFtZUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IHRlc3RUeXBlID0gY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpZEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuYW1lQXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCQorCQkKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGlkQXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG5hbWVBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJCisJCUlGaWVsZCBpZEZpZWxkID0gdGVzdFR5cGUuZmluZFByaW1hcnlUeXBlKCkuZ2V0RmllbGQoImlkIik7CisJCWlkRmllbGQucmVuYW1lKCJpZDIiLCBmYWxzZSwgbnVsbCk7CisJCQorCQlhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuYW1lQXR0cmlidXRlMiA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpZDJBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKworCQlhc3NlcnROb3RTYW1lKGlkQXR0cmlidXRlLCBpZDJBdHRyaWJ1dGUpOworCQlhc3NlcnRFcXVhbHMoImlkMiIsIGlkMkF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMobmFtZUF0dHJpYnV0ZSwgbmFtZUF0dHJpYnV0ZTIpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBuYW1lQXR0cmlidXRlMi5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFN1cGVyUGVyc2lzdGVudFR5cGVHZW5lcmljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RHZW5lcmljRW50aXR5KCk7CisJCWNyZWF0ZVRlc3RHZW5lcmljTWFwcGVkU3VwZXJjbGFzcygpOworCQkKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5FbnRpdHkxIik7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRW50aXR5MiIpOworCQkKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlhc3NlcnRFcXVhbHMoInRlc3QuRW50aXR5MSIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOworCQlhc3NlcnROb3ROdWxsKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkVudGl0eTIiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RHZW5lcmljRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgRW50aXR5MSAiKTsKKwkJCQlzYi5hcHBlbmQoImV4dGVuZHMgRW50aXR5MjxJbnRlZ2VyPiB7fSIpLmFwcGVuZChDUik7CisJCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVudGl0eTEuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0R2VuZXJpY01hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyBFbnRpdHkyPEs+IHt9IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW50aXR5Mi5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEKaW5kZXggZGQyNjI0My4uZWU5NGVjMSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMSwxMSArMTEsMTcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKQEAgLTIzLDQ0ICsyOSwxNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FID0gIk1ZX0FTU09DSUFUSU9OX09WRVJSSURFX05BTUUiOwogCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFwcGVkU3VwZXJjbGFzcyIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJIlN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7IiArCi0JCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBc3NvY2lhdGlvbk92ZXJyaWRlIiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsiICsKLQkJCSJKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKTsiKTsJCQotCX0KIAkJCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKCk7Ci0JCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewkJCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5PTkVfVE9fT05FKTsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKQEAgLTY5LDE5ICs0OCwxNiBAQAogCQkJCiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOworCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIik7CiAJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCBhZGRyZXNzOyIpLmFwcGVuZChDUik7CiAJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsKIAkJCX0KIAkJfSk7CiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTk4LDExICs3NCwxMSBAQAogCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewogCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwogCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKIAkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwogCQkJCQlzYi5hcHBlbmQoIjsiKTsKIAkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKIAkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKIAkJCQlzYi5hcHBlbmQoQ1IpOwogCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKQEAgLTEyNSwxNiArMTAxLDE3IEBACiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoamF2YUVudGl0eSgpLmFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0VHJ1ZShvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlcygpLmhhc05leHQoKSk7CiAJCQogCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7CkBAIC0xNTEsNyArMTI4LDcgQEAKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKIAogCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQlhc3NlcnRGYWxzZShqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmhhc05leHQoKSk7CiAJCWFzc2VydEZhbHNlKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpLmhhc05leHQoKSk7CiAJfQogCQpAQCAtMTYxLDE2ICsxMzgsMTcgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwogCiAJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGphdmFFbnRpdHkoKS5hc3NvY2lhdGlvbk92ZXJyaWRlcygpLmhhc05leHQoKSk7CisJCWFzc2VydFRydWUob3ZlcnJpZGVDb250YWluZXIuYXNzb2NpYXRpb25PdmVycmlkZXMoKS5oYXNOZXh0KCkpOwogCQkKIAkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCiAJCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoImZvbyIpOwpAQCAtMTkwLDM4ICsxNjgsNDAgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQorCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQlKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwogCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CiAKIAkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJCQkKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7CiAJCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CiAJCQogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7CiAJCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKKwkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKIAkJam9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CiAJCQogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjIsIGpvaW5Db2x1bW5zLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMywgam9pbkNvbHVtbnMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4sIGpvaW5Db2x1bW5zLm5leHQoKSk7CiAJCQotCQlqb2luQ29sdW1ucyA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CkBAIC0yMzMsMjkgKzIxMywzNiBAQAogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CiAJCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwogCQkKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uc1NpemUoKSk7CisKKwkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCisJCWFzc2VydEVxdWFscyg0LCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbnNTaXplKCkpOworCQkKKwkJam9pbmluZ1N0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uc1NpemUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKIAotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJam9pbmluZ1N0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCWFzc2VydEVxdWFscygyLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbnNTaXplKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKIAkJCi0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlhc3NlcnRFcXVhbHMoMSwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJCisJCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlhc3NlcnRFcXVhbHMoMCwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKIAl9CiAJCkBAIC0yNjUsMjIgKzI1MiwyNCBAQAogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCisJCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CiAJCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCUphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CiAJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKIAkJCi0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CisJCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CiAJCQkJCi0JCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNCwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKIAkJCiAJCQotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJam9pbmluZ1N0cmF0ZWd5Lm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOworCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CkBAIC0yOTAsOCArMjc5LDggQEAKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7CiAKIAotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlqb2luaW5nU3RyYXRlZ3kubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7CisJCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CkBAIC0zMDcsMTMgKzI5NiwyMSBAQAogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCisJCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CiAJCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCUphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CiAJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKIAkKKwkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisKKwkJCiAJCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDApOwogCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigxKTsKIAkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMik7CkBAIC0zMjIsNTcgKzMxOSw2NCBAQAogCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLnNldE5hbWUoIkJBUiIpOwogCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLnNldE5hbWUoIkJBWiIpOwogCi0JCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwogCQkKIAkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLm1vdmVKb2luQ29sdW1uKDIsIDApOwotCQlqb2luQ29sdW1ucyA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwogCiAJCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5tb3ZlSm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAogCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbnMgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAogCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbnMgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAkJCiAJCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7Ci0JfQkKLQkKLQkKLQkKKwkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisKKwkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMCk7CisJCWFzc2VydEZhbHNlKGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7CisJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQXNzb2NpYXRpb25PdmVycmlkZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJCiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwogCQkKIAkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwogCX0KIAkKQEAgLTM4MCwxMiArMzg0LDEzIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQXNzb2NpYXRpb25PdmVycmlkZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJCiAJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKQEAgLTM5NywxMSArNDAyLDEyIEBACiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkKKwkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwogCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CiAJCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAl9CiAJCkBAIC00MTEsMTEgKzQxNywxMiBAQAogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCisJCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKIAkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGVudGl0eS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwogCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhc3NlcnRUcnVlKGFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlT3ZlcnJpZGVUZXN0cy5qYXZhCmluZGV4IDRkOWM0OGQuLjFhZTQwZDcgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuamF2YQpAQCAtMTAsOSArMTAsOSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKQEAgLTI2LDQzICsyNiwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSA9ICJNWV9BVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSI7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSA9ICJNWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUiOwotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFwcGVkU3VwZXJjbGFzcyIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJDb2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7IiArCi0JCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJImludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsiICsKLQkJCSJpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyIgKwotCQkJImludCBzY2FsZSgpIGRlZmF1bHQgMDsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNvbHVtbkFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQXR0cmlidXRlT3ZlcnJpZGUiLCAKLQkJCSJTdHJpbmcgbmFtZSgpOyIgKwotCQkJIkNvbHVtbiBjb2x1bW4oKTsiKTsJCQotCX0KIAkJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKCk7Ci0JCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC03Niw5ICs0Niw2IEBACiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtOTEsMjEgKzU4LDYgQEAKIAkJCX0KIAkJfSk7CiAJfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9CiAKIAlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CkBAIC0xMzUsMTUgKzg3LDE2IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQXR0cmlidXRlT3ZlcnJpZGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQkKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwogCQkKIAkJYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCX0KIAkKQEAgLTE1MSwxMiArMTA0LDEzIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQXR0cmlidXRlT3ZlcnJpZGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQkKIAkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKIAkJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwpAQCAtMTY2LDE4ICsxMjAsMTkgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhBdHRyaWJ1dGVPdmVycmlkZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlDb2x1bW4gY29sdW1uID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7CiAJCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwogCQkKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwogCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtblJlc291cmNlID0gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5nZXRDb2x1bW4oKTsKIAkJY29sdW1uUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7CiAJCQogCQkKLQkJY29sdW1uID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5nZXRDb2x1bW4oKTsKKwkJY29sdW1uID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLmdldENvbHVtbigpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbHVtbi5nZXROYW1lKCkpOwogCX0KIAkKQEAgLTE4NSwxMiArMTQwLDEzIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQXR0cmlidXRlT3ZlcnJpZGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJQ29sdW1uIGNvbHVtbiA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwogCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKIAkJCiAJCWNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSk7CiAJCUNvbHVtbkFubm90YXRpb24gY29sdW1uUmVzb3VyY2UgPSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldENvbHVtbigpOwogCkBAIC0yMDksMTkgKzE2NSwyMCBAQAogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkJCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwogCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwogCQkKIAkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QocGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCkpLmdldCgxKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3MgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKSkuZ2V0KDEpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwogCX0KIAkKQEAgLTIzMSwxOSArMTg4LDIwIEBACiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CisJCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CiAJCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwogCiAJCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgbWFwcGVkU3VwZXJjbGFzcyA9IENvbGxlY3Rpb25Ub29scy5saXN0KHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpKS5nZXQoMSkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCkpLmdldCgxKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKIAkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwogCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IGVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwogCX0KIAkKQEAgLTI1MywxMSArMjExLDEyIEBACiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkKKwkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CiAJCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAl9CiAJCkBAIC0yNjcsMTEgKzIyNiwxMiBAQAogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCisJCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQorCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwogCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7CiAJfQogCQpAQCAtMjgxLDE2ICsyNDEsMTYgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQkKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CiAJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSk7CiAJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQmFzaWNNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmdUZXN0cy5qYXZhCmluZGV4IGRlNDUwZDAuLjY0NmVhMjQgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmdUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmdUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDE1ICsxMCwxNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnVtVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKQEAgLTI2LDYgKzI3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7CkBAIC00OSwzMSArNTEsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBKYXZhQmFzaWNNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVCYXNpY0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXNpYyIsICJGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOyBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVMb2JBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTG9iIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnVtZXJhdGVkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudW1lcmF0ZWQiLCAiRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlbXBvcmFsQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRlbXBvcmFsIiwgIlRlbXBvcmFsVHlwZSB2YWx1ZSgpOyIpOwkJCi0JfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTg2LDEwICs2OCw3IEBACiAJCX0pOwogCX0KIAotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUJhc2ljQW5ub3RhdGlvbigpOwotCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTA2LDEwICs4NSw3IEBACiAJCQl9CiAJCX0pOwogCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmdGZXRjaE9wdGlvbmFsU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlQmFzaWNBbm5vdGF0aW9uKCk7Ci0JCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nRmV0Y2hPcHRpb25hbFNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTI3LDEwICsxMDMsNyBAQAogCQl9KTsKIAl9CiAKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhMb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVMb2JBbm5vdGF0aW9uKCk7Ci0JCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTG9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xNDgsMTAgKzEyMSw3IEBACiAJCX0pOwogCX0KIAotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVFbnVtZXJhdGVkQW5ub3RhdGlvbigpOwotCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTE2OSwxMCArMTM5LDcgQEAKIAkJfSk7CiAJfQogCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlVGVtcG9yYWxBbm5vdGF0aW9uKCk7Ci0JCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTE5OCw3ICsxNjUsNyBAQAogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBiYXNpY01hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwogCX0KQEAgLTIwNyw3ICsxNzQsNyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgYmFzaWNNYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKIAl9CkBAIC0yMTYsNyArMTgzLDcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgYmFzaWNNYXBwaW5nLmdldEZldGNoKCkpOwpAQCAtMjI5LDE1ICsxOTYsMTUgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CiAJCQogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQyk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkJBU0lDKTsKIAkJYmFzaWMuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKQEAgLTI0Nyw3ICsyMTQsNyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZ0ZldGNoT3B0aW9uYWxTcGVjaWZpZWQoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwpAQCAtMjU3LDIwICsyMjQsMjAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CiAJCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQkKIAkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7CiAJCQogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgYmFzaWMuZ2V0RmV0Y2goKSk7CiAJCQogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2gobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkJBU0lDKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZEZldGNoMigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjc4LDE3ICsyNDUsMTcgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQogCQljcmVhdGVPcm1YbWxGaWxlKCk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnRUcnVlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnByb3BlcnRpZXMoKS5uZXh0KCk7Ci0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQyk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZVByb3BlcnRpZXMoKS5uZXh0KCk7CisJCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkJBU0lDKTsKIAkJCiAJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBiYXNpYy5nZXRGZXRjaCgpKTsKIAkJCkBAIC0yOTcsNyArMjY0LDcgQEAKIAkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2gobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkJBU0lDKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpKTsKIAkJCiAJCWJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwpAQCAtMzA2LDM0ICsyNzMsMzYgQEAKIAlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPcm1YbWxGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwogCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKKwkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CiAJfQogCi0JcHVibGljIHZvaWQgdGVzdFNldEJhc2ljUmVtb3ZlZEZyb21SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdFNldEJhc2ljVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQkKIAkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihudWxsKTsKKwkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJCisJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCQogCQlhc3NlcnROb3RTYW1lKGJhc2ljTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwogCQkKIAkJYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQogCQlhc3NlcnRUcnVlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQkKIAkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtMzQ0LDI4ICszMTMsMjcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7CisJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLkVOVU1FUkFURURfQ09OVkVSVEVSKTsKKwkJKChFbnVtZXJhdGVkQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLlNUUklORyk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwogCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmlzTG9iKCkpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRFbnVtZXJhdGVkKCkpOworCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldEVudW1UeXBlKCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWFzc2VydE51bGwoKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKIAkJYXNzZXJ0TnVsbCgoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtMzc2LDI1ICszNDQsMjYgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7CisJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7CiAJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKIAkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpICgoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKQEAgLTQwNSwyMyArMzc0LDI0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpOworCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFRlbXBvcmFsQ29udmVydGVyKSAoKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CkBAIC00MzIsMjIgKzQwMiwyMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0TG9iKHRydWUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5PUkRJTkFMKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKQEAgLTQ1OCwyMiArNDI4LDIyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtNDg0LDIyICs0NTQsMjIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtNTEwLDEzICs0ODAsMTUgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CkBAIC01MjQsMTIgKzQ5NiwxMCBAQAogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogLy9UT0RPCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKElPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKIC8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgKChJT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtNTQwLDEzICs1MTAsMTUgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CkBAIC01NTQsMTEgKzUyNiw5IEBACiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKIC8vVE9ETwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChJT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwogLy8JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UubWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55LkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtNTY4LDEzICs1MzgsMTUgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CkBAIC01ODIsMTIgKzU1NCwxMCBAQAogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAvL1RPRE8JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoSU1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKIC8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgKChJTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtNTk4LDEzICs1NjgsMTUgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CkBAIC02MTIsMTEgKzU4NCw5IEBACiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogLy9UT0RPCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKElNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwogLy8JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UubWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueS5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKQEAgLTYyNyw0NiArNTk3LDQ2IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljTWFwcGluZy5nZXREZWZhdWx0T3B0aW9uYWwoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBiYXNpY01hcHBpbmcuaXNEZWZhdWx0T3B0aW9uYWwoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRCYXNpY0dldERlZmF1bHRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldERlZmF1bHRPcHRpb25hbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5pc0RlZmF1bHRPcHRpb25hbCgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwogCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljTWFwcGluZy5nZXRPcHRpb25hbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5pc09wdGlvbmFsKCkpOwogCQkKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKGJhc2ljTWFwcGluZy5nZXRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldE9wdGlvbmFsKCkpOworCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5pc09wdGlvbmFsKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCQogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQyk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkJBU0lDKTsKIAkJYmFzaWMuc2V0T3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwpAQCAtNjc2LDcgKzY0Niw3IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nRmV0Y2hPcHRpb25hbFNwZWNpZmllZCgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKIAogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwpAQCAtNjg2LDM2ICs2NTYsMzYgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CiAJCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwogCQkKIAkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQyk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkJBU0lDKTsKIAkJCiAJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpYy5nZXRPcHRpb25hbCgpKTsKIAkJCiAJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQykpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3B0aW9uYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwogCQlhc3NlcnRUcnVlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7CiAJCQogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRPcHRpb25hbCgpKTsKIAkJCkBAIC03MjQsNyArNjk0LDcgQEAKIAkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkJBU0lDKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpKTsKIAkJCiAJCWJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwpAQCAtNzM1LDE1ICs3MDUsMTUgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCQogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQyk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkJBU0lDKTsKIAkJYmFzaWMuc2V0T3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwpAQCAtNzU0LDEwICs3MjQsMTAgQEAKIAkJYXNzZXJ0U2FtZShiYXNpY01hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKIAkJCiAJCWJhc2ljLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihudWxsKTsKKwkJYXR0cmlidXRlUmVzb3VyY2Uuc2V0UHJpbWFyeUFubm90YXRpb24obnVsbCwgbmV3IFN0cmluZ1swXSk7CiAJCQogCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRPcHRpb25hbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuaXNPcHRpb25hbCgpKTsKIAl9CiAJCiAJCkBAIC03NjUsMzYgKzczNSwzNiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CiAKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzTG9iKCkpOworCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpID09IENvbnZlcnRlci5MT0JfQ09OVkVSVEVSKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdElzTG9iMigpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aExvYigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAKLQkJYXNzZXJ0VHJ1ZShiYXNpY01hcHBpbmcuaXNMb2IoKSk7CisJCWFzc2VydFRydWUoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBDb252ZXJ0ZXIuTE9CX0NPTlZFUlRFUik7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXRMb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwogCi0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7CisJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLkxPQl9DT05WRVJURVIpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQkKLQkJYmFzaWNNYXBwaW5nLnNldExvYihmYWxzZSk7CisJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIobnVsbCk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTgwMiwxNTUgKzc3MiwxNjMgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwogCi0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0xvYigpKTsKKwkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBDb252ZXJ0ZXIuTE9CX0NPTlZFUlRFUik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQotCQlhc3NlcnRUcnVlKGJhc2ljTWFwcGluZy5pc0xvYigpKTsKKwkJYXNzZXJ0VHJ1ZShiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpID09IENvbnZlcnRlci5MT0JfQ09OVkVSVEVSKTsKIAkKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNMb2IoKSk7CisJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gQ29udmVydGVyLkxPQl9DT05WRVJURVIpOwogCX0KIAkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJhc2ljR2V0RGVmYXVsdEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJhc2ljR2V0RGVmYXVsdENvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgYmFzaWNNYXBwaW5nLmdldERlZmF1bHRFbnVtZXJhdGVkKCkpOworCQlhc3NlcnRUcnVlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gQ29udmVydGVyLk5PX0NPTlZFUlRFUik7CiAJfQogCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRCYXNpY0dldERlZmF1bHRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEJhc2ljR2V0RGVmYXVsdENvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsIGJhc2ljTWFwcGluZy5nZXREZWZhdWx0RW51bWVyYXRlZCgpKTsKKwkJYXNzZXJ0VHJ1ZShiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpID09IENvbnZlcnRlci5OT19DT05WRVJURVIpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0RW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKIAotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgYmFzaWNNYXBwaW5nLmdldEVudW1lcmF0ZWQoKSk7CisJCWFzc2VydFRydWUoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSKTsKKwkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJRW51bWVyYXRlZEFubm90YXRpb24gZW51bWVyYXRlZEFubm90YXRpb24gPSAoRW51bWVyYXRlZEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsICgoRW51bWVyYXRlZENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXREZWZhdWx0RW51bVR5cGUoKSk7CiAJCQotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCBiYXNpY01hcHBpbmcuZ2V0RW51bWVyYXRlZCgpKTsKKwkJZW51bWVyYXRlZEFubm90YXRpb24uc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZS5TVFJJTkcpOwkJCisJCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEVudW1lcmF0ZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW51bWVyYXRlZCgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChFbnVtZXJhdGVkQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkpOworCQlhc3NlcnRUcnVlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gQ29udmVydGVyLk5PX0NPTlZFUlRFUik7CiAJCQotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5TVFJJTkcpOworCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5FTlVNRVJBVEVEX0NPTlZFUlRFUik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJRW51bWVyYXRlZEFubm90YXRpb24gZW51bWVyYXRlZCA9IChFbnVtZXJhdGVkQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKKwkJYXNzZXJ0Tm90TnVsbChlbnVtZXJhdGVkKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7CisJCQorCQkoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuU1RSSU5HKTsKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUuU1RSSU5HLCBlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwogCQkKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQobnVsbCk7CisJCSgoRW51bWVyYXRlZENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShudWxsKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7CisJCQorCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5OT19DT05WRVJURVIpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZUVudW1lcmF0ZWRVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkRW51bWVyYXRlZFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKIAotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkpOworCQlhc3NlcnRUcnVlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gQ29udmVydGVyLk5PX0NPTlZFUlRFUik7CiAJCQogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUVudW1lcmF0ZWRBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoRW51bWVyYXRlZEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJZW51bWVyYXRlZC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORyk7CiAJCQotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChFbnVtZXJhdGVkQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwogCQkKIAkJZW51bWVyYXRlZC5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoKChFbnVtZXJhdGVkQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwogCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlhc3NlcnRTYW1lKGJhc2ljTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwogCX0KIAkKLQkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwogCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUiwgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXRUZW1wb3JhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUZW1wb3JhbCgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgYmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUiwgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCAoKFRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CiAJCQotCQliYXNpY01hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKIAkJCi0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChudWxsKTsKKwkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihudWxsKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAJCkBAIC05NTgsMjIgKzkzNiwyMyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKIAotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwogCQkKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwgPSAoVGVtcG9yYWxBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQl0ZW1wb3JhbC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5EQVRFKTsKIAkJCi0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgYmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUiwgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7CiAJCQogCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJYXNzZXJ0U2FtZShiYXNpY01hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKIAl9CkBAIC05ODIsMTQgKzk2MSwxNCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwogCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7CiAJCQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUNvbHVtblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uVGVzdHMuamF2YQppbmRleCBiYTc3NzQyLi44ZWRiNzYzIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uVGVzdHMuamF2YQpAQCAtMjIsMzcgKzIyLDE1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSmF2YUNvbHVtblRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJNWV9UQUJMRSI7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9ERUZJTklUSU9OID0gIk1ZX0NPTFVNTl9ERUZJTklUSU9OIjsKIAkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQmFzaWNBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFzaWMiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbHVtbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJDb2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7IiArCi0JCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJImludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsiICsKLQkJCSJpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyIgKwotCQkJImludCBzY2FsZSgpIGRlZmF1bHQgMDsiKTsJCQotCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02NSwxMCArNDMsNyBAQAogCQl9KTsKIAl9CiAKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0QmFzaWNDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdEJhc2ljQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC04NiwxMSArNjEsNyBAQAogCQl9KTsKIAl9CiAKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpOwotCQljcmVhdGVCYXNpY0Fubm90YXRpb24oKTsKLQkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMDgsMTEgKzc5LDggQEAKIAkJCX0KIAkJfSk7CiAJfQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUNvbHVtbkFubm90YXRpb24oKTsKLQkJY3JlYXRlQmFzaWNBbm5vdGF0aW9uKCk7CiAJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMzksNyArMTA3LDcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJfQpAQCAtMTQ4LDcgKzExNiw3IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdEJhc2ljQ29sdW1uKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAl9CkBAIC0xNTYsNyArMTI0LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWVTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydEVxdWFscyhiYXNpY01hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwpAQCAtMTY2LDcgKzEzNCw3IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdEJhc2ljQ29sdW1uKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJCQogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7CkBAIC0xNzYsNyArMTQ0LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwogCX0KQEAgLTE4NCw3ICsxNTIsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdEJhc2ljQ29sdW1uKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAkKIAkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKIAl9CkBAIC0xOTIsMTQgKzE2MCwxNCBAQAogCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwogCiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKIAkJCiAJCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKIAkJCiAJCWFzc2VydEVxdWFscygiZm9vIiwgY29sdW1uLmdldE5hbWUoKSk7CkBAIC0yMDksMjYgKzE3NywyNiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRCYXNpY0NvbHVtbigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKIAkJCiAJCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldE5hbWVVcGRhdGVzRnJvbVJlc291cmNlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwogCiAJCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKIAogCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7CkBAIC0yNTUsNyArMjIzLDcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwogCX0KQEAgLTI2NCw3ICsyMzIsNyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uVGFibGVTZXQoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAogCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwogCX0KQEAgLTI3Miw3ICsyNDAsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0VGFibGVTcGVjaWZpZWRUYWJsZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoKChFbnRpdHkpIGJhc2ljTWFwcGluZy5nZXRUeXBlTWFwcGluZygpKS5nZXROYW1lKCksIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CkBAIC0yODIsNyArMjUwLDcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0QmFzaWNDb2x1bW4oKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKIAkJCiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiZm9vIik7CkBAIC0yOTIsNyArMjYwLDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAkKIAkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKIAl9CkBAIC0zMDAsMTQgKzI2OCwxNCBAQAogCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoImZvbyIpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKIAkJCiAJCWFzc2VydEVxdWFscygiZm9vIiwgY29sdW1uLmdldFRhYmxlKCkpOwpAQCAtMzE3LDI2ICsyODUsMjYgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwogCiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKIAkJCiAJCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXRUYWJsZVVwZGF0ZXNGcm9tUmVzb3VyY2VDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKIAogCQljb2x1bW4uc2V0VGFibGUoImZvbyIpOwpAQCAtMzUwLDcgKzMxOCw3IEBACiAJcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKENPTFVNTl9ERUZJTklUSU9OLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKIAl9CkBAIC0zNTgsMTIgKzMyNiwxMiBAQAogCXB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5UYWJsZVNldCgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAJCQogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiZm9vIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKIAkJCiAJCWFzc2VydEVxdWFscygiZm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CkBAIC0zNzUsMTIgKzM0MywxMiBAQAogCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uVXBkYXRlc0Zyb21SZXNvdXJjZUNoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAogCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7CiAKIAkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oImZvbyIpOwpAQCAtMzk0LDE4ICszNjIsMTggQEAKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwogCiAJCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDU1KSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTUpLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoNTUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDU1KSk7CkBAIC00MTcsMTcgKzM4NSwxNyBAQAogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKIAkJY29sdW1uLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNjYpKTsKIAkJCiAJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNjYpLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDY2KSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDY2LCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwogCQkKIAkJY29sdW1uLnNldExlbmd0aChudWxsKTsKIAkJCkBAIC00MzksMTQgKzQwNywxNCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKIAkJCiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDEwMCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7CiAJCQogCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwMCksIGNvbHVtbi5nZXRMZW5ndGgoKSk7CkBAIC00NTksMTggKzQyNywxOCBAQAogCXB1YmxpYyB2b2lkIHRlc3RHZXRQcmVjaXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKIAkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNTUpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1NSksIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscyg1NSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRQcmVjaXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAogCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKIAkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNTUpKTsKQEAgLTQ4MiwxNyArNDUwLDE3IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwogCQljb2x1bW4uc2V0UHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2NikpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig2NiksIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNjYpLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoNjYsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CiAJCQogCQljb2x1bW4uc2V0UHJlY2lzaW9uKG51bGwpOwogCQkKQEAgLTUwNCwxNCArNDcyLDE0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwogCQkKIAkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwogCQkKIAkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoMTAwKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKIAkJCiAJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTAwKSwgY29sdW1uLmdldFByZWNpc2lvbigpKTsKQEAgLTUyNCwxOCArNDkyLDE4IEBACiAJcHVibGljIHZvaWQgdGVzdEdldFNjYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwogCiAJCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9TQ0FMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDU1KSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTUpLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7CisJCWFzc2VydEVxdWFscyg1NSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNjYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1NDQUxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFNjYWxlKCkpOwogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDU1KSk7CkBAIC01NDcsMTcgKzUxNSwxNyBAQAogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwogCQljb2x1bW4uc2V0U2NhbGUoSW50ZWdlci52YWx1ZU9mKDY2KSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDY2KSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDY2KSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCQlhc3NlcnRFcXVhbHMoNjYsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKIAkJCiAJCWNvbHVtbi5zZXRTY2FsZShudWxsKTsKIAkJCkBAIC01NjksMTQgKzUzNywxNCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFNjYWxlKCkpOwogCQkKIAkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZigxMDApKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwogCQkKIAkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMDApLCBjb2x1bW4uZ2V0U2NhbGUoKSk7CkBAIC01ODksNDAgKzU1Nyw0MCBAQAogCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAKLQkJYXNzZXJ0RXF1YWxzKEJhc2VDb2x1bW4uREVGQVVMVF9VTklRVUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfVU5JUVVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFVuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAotCQlhc3NlcnRFcXVhbHMoQmFzZUNvbHVtbi5ERUZBVUxUX1VOSVFVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfVU5JUVVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNEZWZhdWx0VW5pcXVlKCkpOwogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoQmFzZUNvbHVtbi5ERUZBVUxUX1VOSVFVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfVU5JUVVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNEZWZhdWx0VW5pcXVlKCkpOwogCX0JCiAJCiAJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKIAkJY29sdW1uLnNldFVuaXF1ZShCb29sZWFuLlRSVUUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFVuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKIAkJCiAJCWNvbHVtbi5zZXRVbmlxdWUobnVsbCk7CiAJCQpAQCAtNjM0LDE0ICs2MDIsMTQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7CiAJCQogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uRkFMU0UpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7CiAJCQogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFVuaXF1ZSgpKTsKQEAgLTY1NCw0MCArNjIyLDQwIEBACiAJcHVibGljIHZvaWQgdGVzdEdldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAKLQkJYXNzZXJ0RXF1YWxzKEJhc2VDb2x1bW4uREVGQVVMVF9JTlNFUlRBQkxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0SW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJhc2VDb2x1bW4uREVGQVVMVF9JTlNFUlRBQkxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0SW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwogCi0JCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfSU5TRVJUQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQmFzZUNvbHVtbi5ERUZBVUxUX0lOU0VSVEFCTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOwogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLlRSVUUpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKEJhc2VDb2x1bW4uREVGQVVMVF9JTlNFUlRBQkxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdEluc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfSU5TRVJUQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzRGVmYXVsdEluc2VydGFibGUoKSk7CiAJfQkKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7CiAJCWNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uVFJVRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldEluc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwogCQkKIAkJY29sdW1uLnNldEluc2VydGFibGUobnVsbCk7CiAJCQpAQCAtNjk5LDE0ICs2NjcsMTQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwogCQkKIAkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKIAkJCiAJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKQEAgLTcxOSw0MCArNjg3LDQwIEBACiAJcHVibGljIHZvaWQgdGVzdEdldE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwogCi0JCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJhc2VDb2x1bW4uREVGQVVMVF9OVUxMQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwogCi0JCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc0RlZmF1bHROdWxsYWJsZSgpKTsKIAkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uVFJVRSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoQmFzZUNvbHVtbi5ERUZBVUxUX05VTExBQkxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE51bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQmFzZUNvbHVtbi5ERUZBVUxUX05VTExBQkxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNEZWZhdWx0TnVsbGFibGUoKSk7CiAJfQkKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwogCQkKIAkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKIAkJY29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uVFJVRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwogCQkKIAkJY29sdW1uLnNldE51bGxhYmxlKG51bGwpOwogCQkKQEAgLTc2NCwxNCArNzMyLDE0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwogCQkKIAkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7CiAJCQogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKIAkJCiAJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0TnVsbGFibGUoKSk7CkBAIC03ODQsNDAgKzc1Miw0MCBAQAogCXB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAKLQkJYXNzZXJ0RXF1YWxzKEJhc2VDb2x1bW4uREVGQVVMVF9VUERBVEFCTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfVVBEQVRBQkxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFVwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAotCQlhc3NlcnRFcXVhbHMoQmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfVVBEQVRBQkxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uVFJVRSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoQmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCYXNlQ29sdW1uLkRFRkFVTFRfVVBEQVRBQkxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwogCX0JCiAJCiAJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKIAkJY29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLlRSVUUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFVwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKIAkJCiAJCWNvbHVtbi5zZXRVcGRhdGFibGUobnVsbCk7CiAJCQpAQCAtODI5LDE0ICs3OTcsMTQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7CiAJCQogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7CiAJCQogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFEaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFEaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YQppbmRleCA4ZDU5YWU1Li5hMDA3YWVlIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cy5qYXZhCkBAIC0xMCwzNSArMTAsMjggQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JDb2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDUklNSU5BVE9SX0NPTFVNTl9OQU1FID0gIk1ZX0RJU0NSSU1JTkFUT1JfQ09MVU1OIjsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0RFRklOSVRJT04gPSAiTVlfQ09MVU1OX0RFRklOSVRJT04iOwogCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkRpc2NyaW1pbmF0b3JDb2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJEVFlQRVwiOyIgKwotCQkJIkRpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKCkgZGVmYXVsdCBTVFJJTkc7IiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7Iik7CQkKLQl9Ci0JCQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTUyLDkgKzQ1LDYgQEAKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNjcsNiArNTcsNDEgQEAKIAkJCX0KIAkJfSk7CiAJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBhYnN0cmFjdCBjbGFzcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBGSUxFX05BTUUsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7CisJCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7CisJCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KIAogCQkKIAlwdWJsaWMgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtNzcsNTYgKzEwMiw2OCBAQAogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJYXNzZXJ0RXF1YWxzKERJU0NSSU1JTkFUT1JfQ09MVU1OX05BTUUsIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKERJU0NSSU1JTkFUT1JfQ09MVU1OX05BTUUsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lU3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscygiRFRZUEUiLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKKworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJEVFlQRSIsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscygiRFRZUEUiLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKKworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJEVFlQRSIsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJCQotCQlqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkRUWVBFIiwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJEVFlQRSIsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lU3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscygiRFRZUEUiLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldE5hbWUoKSk7CisJCQorCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJEVFlQRSIsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKERJU0NSSU1JTkFUT1JfQ09MVU1OX05BTUUsIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKERJU0NSSU1JTkFUT1JfQ09MVU1OX05BTUUsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCWphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7CisJCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7CiAJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gZGlzY3JpbWluYXRvckNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKIAkJCiAJCWFzc2VydEVxdWFscygiZm9vIiwgZGlzY3JpbWluYXRvckNvbHVtbi5nZXROYW1lKCkpOwpAQCAtMTM2LDExICsxNzMsMTEgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCWphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwogCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JDb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7CiAJCiAJCWFzc2VydE51bGwoZGlzY3JpbWluYXRvckNvbHVtbik7CkBAIC0xNTAsNDggKzE4Nyw1NyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOworCisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERpc2NyaW1pbmF0b3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5TVFJJTkcsIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOworCisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5DSEFSKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5TVFJJTkcsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7CisKKwkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5DSEFSKTsKKwkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKIAkJCiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gZGlzY3JpbWluYXRvckNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKIAkJZGlzY3JpbWluYXRvckNvbHVtbi5zZXREaXNjcmltaW5hdG9yVHlwZShvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlLkNIQVIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7CiAJCQotCQlqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIpOworCQlnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JDb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7CiAJCQogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBkaXNjcmltaW5hdG9yQ29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwogCQkKLQkJamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOworCQlnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CisJCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUobnVsbCk7CiAJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKSk7CiAJfQogCQpAQCAtMTk5LDczICsyNDUsODcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7CiAKIAkJY29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUik7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUiwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwogCQkKIAkJY29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOworCisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwkJCisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RHZXRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1NSkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDU1KSwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCQorCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDU1KSk7CisJCWFzc2VydEVxdWFscyg1NSwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNTUpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKKworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKKworCQlnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNTUpKTsKIAkJCi0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7CiAJfQkKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JDb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7CiAJCWRpc2NyaW1pbmF0b3JDb2x1bW4uc2V0TGVuZ3RoKEludGVnZXIudmFsdWVPZig2NikpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig2NiksIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDY2KSwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CQkKKwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig2NiksIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoNjYsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwkJCiAJCWRpc2NyaW1pbmF0b3JDb2x1bW4uc2V0TmFtZShudWxsKTsKIAkJZGlzY3JpbWluYXRvckNvbHVtbi5zZXRMZW5ndGgobnVsbCk7CiAJCQogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwkKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsJCiAJfQkKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwogCQkKLQkJamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDEwMCkpOworCQlnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoMTAwKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gZGlzY3JpbWluYXRvckNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKIAkJCiAJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTAwKSwgZGlzY3JpbWluYXRvckNvbHVtbi5nZXRMZW5ndGgoKSk7CiAJCQotCQlqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOworCQlnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CisJCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTikpOwogCX0KIAkKQEAgLTI3MywxOCArMzMzLDIyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7CiAKIAkJY29sdW1uLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNzgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3OCksIGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDc4KSwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNzgpLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDc4LCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpKTsKIAkJCiAJCWNvbHVtbi5zZXRMZW5ndGgobnVsbCk7Ci0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CiAJfQogCiAJCkBAIC0yOTIsMTcgKzM1NiwxNyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKIAkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oQ09MVU1OX0RFRklOSVRJT04pOwogCQkKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9ERUZJTklUSU9OLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhDT0xVTU5fREVGSU5JVElPTiwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwogCQkKIAkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CiAKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKIAl9CkBAIC0zMTEsMTYgKzM3NSw3NiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oImZvbyIpOworCQlnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oImZvbyIpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKIAkJCiAJCWFzc2VydEVxdWFscygiZm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CiAJCQotCQlqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7CisJCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKIAkJY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwogCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwogCX0KIAorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHkoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuIiArICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCUphdmFFbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUphdmFFbnRpdHkgY2hpbGRFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisKKwkJLy90ZXN0IGRlZmF1bHRzIHdpdGggc2luZ2xlLXRhYmxlIGluaGVyaXRhbmNlLCBubyBzcGVjaWZpZWQgZGlzY3JpbWluYXRvciBjb2x1bW4gc2V0CisJCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBhYnN0cmFjdEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKKwkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9OQU1FLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEUsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTkFNRSwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOworCisJCQorCQkvL3Rlc3QgZGVmYXVsdHMgd2l0aCBzaW5nbGUtdGFibGUgaW5oZXJpdGFuY2UsIHNwZWNpZmllZCBkaXNjcmltaW5hdG9yIGNvbHVtbiBzZXQgb24gcm9vdAorCQlhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRFRZUEUyIik7CisJCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKKwkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGFic3RyYWN0RW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX05BTUUsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJEVFlQRTIiLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKKwkJCisJCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBjaGlsZEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJEVFlQRTIiLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyg1LCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7CisJCQorCQkKKwkJLy90ZXN0IGRlZmF1bHRzIHdpdGggdGFibGUtcGVyLWNsYXNzIGluaGVyaXRhbmNlLCBkaXNjcmltaW5hdG9yIGNvbHVtbiBkb2VzIG5vdCBhcHBseQorCQlhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKKwkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKKwkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOworCQlhYnN0cmFjdEVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGFic3RyYWN0RW50aXR5LmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygwLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygwLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGFibGVUZXN0cy5qYXZhCmluZGV4IGVmMmM5MGQuLmE2NjVlZmIgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRhYmxlVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkYWJsZVRlc3RzLmphdmEKQEAgLTEwLDcgKzEwLDYgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7CkBAIC0yMywxNiArMjIsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkYWJsZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbWJlZGRhYmxlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRhYmxlIiwgIiIpOwkJCi0JfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbWJlZGRhYmxlQW5ub3RhdGlvbigpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC01NCw0NyArNDgsNDkgQEAKIAkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQkJCi0JCWphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVudGl0eSk7CisJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOworCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVudGl0eSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkJCQotCQlqYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hcHBlZFN1cGVyY2xhc3MpOworCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpOworCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hcHBlZFN1cGVyY2xhc3MpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlqYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YU51bGxUeXBlTWFwcGluZyk7CisJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhTnVsbFR5cGVNYXBwaW5nKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkYWJsZSk7CisJCWFzc2VydFRydWUoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkYWJsZSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwogCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBlbWJlZGRhYmxlLm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpLCAiaWQiKTsKKwkJYXNzZXJ0RXF1YWxzKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpLCAibmFtZSIpOwogCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CiAJfQogCQpAQCAtMTAyLDcgKzk4LDcgQEAKIAkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKIAkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBlbWJlZGRhYmxlLm92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwogCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKIAl9CkBAIC0xMTEsNyArMTA3LDcgQEAKIAkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKIAogCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLnRhYmxlTmFtZUlzSW52YWxpZChGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGFibGUudGFibGVOYW1lSXNJbnZhbGlkKCJGT08iKSk7CkBAIC0xMjEsNyArMTE3LDcgQEAKIAkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0VHJ1ZShlbWJlZGRhYmxlLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwogCQlhc3NlcnRUcnVlKGVtYmVkZGFibGUuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwpAQCAtMTM5LDcgKzEzNSw3IEBACiAJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS5hc3NvY2lhdGVkVGFibGVzKCkuaGFzTmV4dCgpKTsKIAl9CkBAIC0xNDgsNyArMTQ0LDcgQEAKIAkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKIAogCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLmFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKS5oYXNOZXh0KCkpOwogCX0KQEAgLTE1NywyNiArMTUzLDE3IEBACiAJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS5hc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpLmhhc05leHQoKSk7CiAJfQogCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBlbWJlZGRhYmxlLm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKIAkvL1RPRE8gbmVlZCB0byBjcmVhdGUgYSBzdWJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzIGFuZCB0ZXN0IHRoaXMKIAlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CiAJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gZW1iZWRkYWJsZS5vdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKIAkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7CiAJfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZ1Rlc3RzLmphdmEKaW5kZXggNjBhMDEyYi4uOWQ2YWNiOCAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmdUZXN0cy5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7CkBAIC0yOCw4ICsyOSwxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247CkBAIC0zNywxMSArNDAsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwpAQCAtNTAsMjggKzUzLDE0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRUREQUJMRV9UWVBFX05BTUUgPSAiTXlFbWJlZGRhYmxlIjsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBFTUJFRERBQkxFX1RZUEVfTkFNRTsKIAotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbWJlZGRhYmxlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVtYmVkZGFibGUiLCAiIik7CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW1iZWRkZWRJZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRlZElkIiwgIiIpOwkJCi0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVFbWJlZGRlZElkQW5ub3RhdGlvbigpOwotCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC05Myw3ICs4Miw2IEBACiAJfQogCiAJcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtYmVkZGFibGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVtYmVkZGFibGVBbm5vdGF0aW9uKCk7CiAJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewogCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewogCQkJCXNiLmFwcGVuZChDUik7CkBAIC0xMjYsMTAgKzExNCwxMCBAQAogCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQpAQCAtMTM3LDggKzEyNSw4IEBACiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTE0OCwxOCArMTM2LDE4IEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUoKChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5hdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRUcnVlKCgoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5hdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKIAkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTE2Nyw3ICsxNTUsNyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQpAQCAtMTg2LDE4ICsxNzQsMTggQEAKIAkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKIAkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQpAQCAtMjA2LDE4ICsxOTQsMTggQEAKIAkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7CiAJCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQpAQCAtMjI2LDE4ICsyMTQsMTggQEAKIAkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwogCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAKQEAgLTI0NiwxOCArMjM0LDE4IEBACiAJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKIAkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCkBAIC0yNjYsMTggKzI1NCwxOCBAQAogCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKIAkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQpAQCAtMjg2LDE4ICsyNzQsMTggQEAKIAkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKIAkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAJCkBAIC0zMDYsMTggKzI5NCwxOCBAQAogCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwogCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTMyNiwxOCArMzE0LDE4IEBACiAJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKIAkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTM0NywyNSArMzM1LDI1IEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwogCQkKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWRJZCIpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CiAJCQogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJCiAJCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAogCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKQEAgLTM3Myw4MSArMzYxLDEyNyBAQAogCiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkKIAkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJYXR0cmlidXRlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCiAJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQkKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwogCX0KIAotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwogCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKIAkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZElkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7CisJCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygibXlFbWJlZGRlZElkIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCi0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwogCQkKIAkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CiAJCWNsYXNzUmVmcy5uZXh0KCk7CiAJCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKIAkJCiAJCUJhc2ljTWFwcGluZyBjaXR5TWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGVtYmVkZGFibGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiY2l0eSIpLmdldE1hcHBpbmcoKTsKIAkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CiAJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm15RW1iZWRkZWRJZCIsIGF0dHJpYnV0ZVJlc291cmNlLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCisJCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyg2LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoNywgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwogCiAJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CiAJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUobnVsbCk7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG51bGwpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKKwkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwogCQkKIAkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYW5ub3RhdGlvbi5zZXROYW1lKCJjaXR5Iik7Ci0JCWFzc2VydEVxdWFscygxLCBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNDU2LDExICs0OTAsMTIgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CiAJCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWRJZCIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZElkIikuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCiAJCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAogCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKQEAgLTQ2OCw3ICs1MDMsNyBAQAogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKIAotCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC00NzcsMTEgKzUxMiwxMiBAQAogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKIAkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZElkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRJZE1hcHBpbmcuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAKIAkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCiAJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwpAQCAtNDg5LDExICs1MjUsMTEgQEAKIAkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7CiAKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkSWRNYXBwaW5nLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCQkKIAkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlhc3NlcnRFcXVhbHMoNCwgZW1iZWRkZWRJZE1hcHBpbmcuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsJCisJCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwkKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC01MDIsMjUgKzUzOCwyNiBAQAogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKIAkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZElkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUphdmFFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7CisJCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAogCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKIAkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwogCi0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCQkKIAkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAkJCiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInN0YXRlIik7Ci0JCWFzc2VydEVxdWFscygwLCBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTUyOSwzNCArNTY2LDM1IEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwogCQkJCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWRJZCIpLmdldE1hcHBpbmcoKTsKLQkJZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygic3RhdGUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJCQotCQllbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkJCi0JCWFzc2VydEVxdWFscygiY2l0eSIsIGVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAkJCi0JCWVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOworCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkJCi0JCUl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNTY1LDE1ICs2MDMsMTYgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CiAJCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWRJZCIpLmdldE1hcHBpbmcoKTsKLQkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZElkIikuZ2V0TWFwcGluZygpOworCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsJCiAJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQllbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwpAQCAtNTg3LDE2ICs2MjYsMTcgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CiAJCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWRJZCIpLmdldE1hcHBpbmcoKTsKLQkJZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWRJZCIpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UubW92ZSgxLCAwLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWF0dHJpYnV0ZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCi0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAKIAkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ1Rlc3RzLmphdmEKaW5kZXggYjg0ZjJmOS4uOTMzMzhlMyAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ1Rlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ1Rlc3RzLmphdmEKQEAgLTExLDkgKzExLDExIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwpAQCAtMjQsMTEgKzI2LDE0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwpAQCAtMzYsMTEgKzQxLDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKQEAgLTQ5LDI3ICs1NCwxNCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIEphdmFFbWJlZGRlZE1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERBQkxFX1RZUEVfTkFNRSA9ICJNeUVtYmVkZGFibGUiOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIEVNQkVEREFCTEVfVFlQRV9OQU1FOwogCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtYmVkZGFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW1iZWRkYWJsZSIsICIiKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbWJlZGRlZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRlZCIsICIiKTsJCQotCX0KLQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUVtYmVkZGVkQW5ub3RhdGlvbigpOwogCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKQEAgLTkxLDcgKzgzLDYgQEAKIAl9CiAKIAlwcml2YXRlIHZvaWQgY3JlYXRlRW1iZWRkYWJsZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW1iZWRkYWJsZUFubm90YXRpb24oKTsKIAkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CiAJCQkJc2IuYXBwZW5kKENSKTsKQEAgLTExNCw2ICsxMDUsOTYgQEAKIAkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBFTUJFRERBQkxFX1RZUEVfTkFNRSArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7CiAJfQogCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5Q3VzdG9tZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkN1c3RvbWVyIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFppcENvZGUgemlwQ29kZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiWmlwQ29kZSIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyB6aXA7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHBsdXNmb3VyOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiWmlwQ29kZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisJCiAKIAlwdWJsaWMgSmF2YUVtYmVkZGVkTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwpAQCAtMTI0LDcgKzIwNSw3IEBACiAJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKQEAgLTEzMiwxMCArMjEzLDEwIEBACiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTE0NSwxOCArMjI2LDE4IEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKCgoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuYXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0VHJ1ZSgoKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuYXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTE2NCw3ICsyNDUsNyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCkBAIC0xODQsNyArMjY1LDcgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5FbnRpdHkxIik7CiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRW1iZWRkYWJsZTEiKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwogCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKIAkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKQEAgLTIzMCwxOCArMzExLDE4IEBACiAJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwogCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTI1MCwxOCArMzMxLDE4IEBACiAJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKIAkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTI3MCwxOCArMzUxLDE4IEBACiAJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7CiAJCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCkBAIC0yOTAsMTggKzM3MSwxOCBAQAogCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7CiAJCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTMxMCwxOCArMzkxLDE4IEBACiAJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKIAkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAKQEAgLTMzMCwxOCArNDExLDE4IEBACiAJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwogCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCkBAIC0zNTAsMTggKzQzMSwxOCBAQAogCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKIAkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIApAQCAtMzcwLDE4ICs0NTEsMTggQEAKIAkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKIAkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCkBAIC0zOTEsMjUgKzQ3MiwyNiBAQAogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKIAkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7CisJCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJCiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwogCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQkKIAkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCiAJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CkBAIC00MTcsMzQgKzQ5OSwzNCBAQAogCiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJCiAJCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJYXR0cmlidXRlUmVzb3VyY2UubW92ZSgxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwogCiAJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAKIAkJCiAJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJfQogCkBAIC00NTQsNDkgKzUzNiw5MCBAQAogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKIAkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwogCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoIm15RW1iZWRkZWQiLCBhdHRyaWJ1dGVSZXNvdXJjZS5nZXROYW1lKCkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJCi0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKIAkJCiAJCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwogCQljbGFzc1JlZnMubmV4dCgpOwogCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CiAJCQogCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBlbWJlZGRhYmxlLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImNpdHkiKS5nZXRNYXBwaW5nKCk7CiAJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKIAkJCiAJCWFzc2VydEVxdWFscygibXlFbWJlZGRlZCIsIGF0dHJpYnV0ZVJlc291cmNlLmdldE5hbWUoKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCi0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKIAogCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwogCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUobnVsbCk7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShudWxsKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24obnVsbCk7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKG51bGwpOworCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7CiAJCQogCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhbm5vdGF0aW9uLnNldE5hbWUoImNpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNTA1LDExICs2MjgsMTIgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CiAJCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAogCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKIAkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CkBAIC01MTcsNyArNjQxLDcgQEAKIAkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7CiAKLQkJYXNzZXJ0RXF1YWxzKDIsIGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTUyNiwxMSArNjUwLDEyIEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwogCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRNYXBwaW5nLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAKIAkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCiAJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwpAQCAtNTM4LDExICs2NjMsMTEgQEAKIAkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7CiAKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkTWFwcGluZy5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAkJCiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkTWFwcGluZy5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwkKKwkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CQogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTU1MSwyNSArNjc2LDI2IEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwogCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAogCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKIAkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwogCi0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAkJCiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCQkKIAkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic3RhdGUiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTU3OCwzNCArNzA0LDM1IEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwogCQkJCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQllbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkJCi0JCWVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkJCi0JCWFzc2VydEVxdWFscygiY2l0eSIsIGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCQkKLQkJZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOworCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkJCi0JCUl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJSXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CiAJCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC02MTQsMTUgKzc0MSwxNiBAQAogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKIAkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CiAJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwkKIAkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwpAQCAtNjM1LDE5ICs3NjMsODcgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CiAJCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQllbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlKDEsIDAsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMSwgMCwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAogCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAl9CisJCisJLy8xLjAgcHJvamVjdHMgZG8gbm90IHN1cHBvcnQgZG90LW5vdGF0aW9uLCB0aGlzIHRlc3RzIHRvIG1ha2Ugc3VyZSB0aGF0IHN1cHBvcnQgZG9lcyBub3QgZXhpc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5Q3VzdG9tZXIoKTsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOworCQkKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7CisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCVBlcnNpc3RlbnRUeXBlIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQkKKwkJUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJRW1iZWRkZWRNYXBwaW5nIG5lc3RlZEVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbmVzdGVkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBuZXN0ZWRFbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gbmVzdGVkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJCisJCVBlcnNpc3RlbnRUeXBlIHppcENvZGVQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCUJhc2ljTWFwcGluZyBwbHVzRm91ck1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSB6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuZ2V0TWFwcGluZygpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEUiKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOworCisJCS8vY2hlY2sgdGhlIG5lc3RlZCBlbWJlZGRlZCAoQWRkcmVzcy56aXBDb2RlKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgicGx1c2ZvdXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKKwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7CisKKwkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IHRoZXJlIGlzIG5vIGF0dHJpYnV0ZSBvdmVycmlkZSBuYW1lZCB6aXBDb2RlLnBsdXNmb3VyCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRNYXBwaW5nKSBjdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoInppcENvZGUucGx1c2ZvdXIiKTsKKwl9CisKIH0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVudGl0eVRlc3RzLmphdmEKaW5kZXggYzA1MGUyYi4uODMzYjdlZCAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVudGl0eVRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVudGl0eVRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTYsMTcgKzE2LDIxIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvclR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWROYXRpdmVRdWVyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlNlY29uZGFyeVRhYmxlOwpAQCAtMzUsMTAgKzM5LDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkTmF0aXZlUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZFF1ZXJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTnVsbFR5cGVNYXBwaW5nOwpAQCAtNTIsMTQgKzU3LDE0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZENsYXNzQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcmllc0Fubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOwpAQCAtNzIsNiArNzcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSmF2YUVudGl0eVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUUgPSAiZW50aXR5TmFtZSI7CkBAIC04NCw2NiArOTAsOCBAQAogCXB1YmxpYyBKYXZhRW50aXR5VGVzdHMoU3RyaW5nIG5hbWUpIHsKIAkJc3VwZXIobmFtZSk7CiAJfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hcHBlZFN1cGVyY2xhc3MiLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUYWJsZSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSW5oZXJpdGFuY2VBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUluaGVyaXRhbmNlVHlwZUVudW0oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSW5oZXJpdGFuY2UiLCAiSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUluaGVyaXRhbmNlVHlwZUVudW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiSW5oZXJpdGFuY2VUeXBlIiwgIlNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1MiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRGlzY3JpbWluYXRvclZhbHVlIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiU2Vjb25kYXJ5VGFibGUiLCAKLQkJCSJTdHJpbmcgbmFtZSgpOyAiICsKLQkJCSJTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjsgIik7CQkJCQkKLS8vCQkJUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLS8vCQkJVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlNlY29uZGFyeVRhYmxlcyIsICJTZWNvbmRhcnlUYWJsZVtdIHZhbHVlKCk7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJQcmltYXJ5S2V5Sm9pbkNvbHVtbiIsIAotCQkJIlN0cmluZyBuYW1lKCk7ICIgKwotCQkJIlN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7ICIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUHJpbWFyeUtleUpvaW5Db2x1bW5zIiwgIlByaW1hcnlLZXlKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsJCQotCX0KIAotCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTU3LDggKzEwNSw2IEBACiAJfQogCQogCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQogCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKIAkJCQlzYi5hcHBlbmQoQ1IpOwpAQCAtMTc1LDEwICsxMjEsNyBAQAogCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIEZJTEVfTkFNRSwgc291cmNlV3JpdGVyKTsKIAl9CiAKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRpb25PblByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0aW9uT25Qcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTk3LDEyICsxNDAsMjEgQEAKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24oKTsKLQkJCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5PTkVfVE9fT05FKTsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigKKwkJCQkJSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCAKKwkJCQkJSlBBLkJBU0lDLAorCQkJCQlKUEEuVkVSU0lPTiwKKwkJCQkJSlBBLlRSQU5TSUVOVCwKKwkJCQkJSlBBLkVNQkVEREVELAorCQkJCQlKUEEuRU1CRURERURfSUQsCisJCQkJCUpQQS5PTkVfVE9fT05FLAorCQkJCQlKUEEuT05FX1RPX01BTlksCisJCQkJCUpQQS5NQU5ZX1RPX09ORSwKKwkJCQkJSlBBLk1BTllfVE9fTUFOWSwKKwkJCQkJSlBBLklEKTsKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CkBAIC0yMTAsNiArMTYyLDY0IEBACiAJCQl9CiAJCQkKIAkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBCYXNpYyIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYmFzaWM7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBWZXJzaW9uIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB2ZXJzaW9uOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAVHJhbnNpZW50Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB0cmFuc2llbnQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgZW1iZWRkZWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZElkIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBlbWJlZGRlZElkOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFNVQl9UWVBFX05BTUUgKyAiIG9uZVRvT25lOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBvbmVUb01hbnk7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IG1hbnlUb01hbnk7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUsIEpQQS5PTkVfVE9fT05FKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKSIpOworCQkJCXNiLmFwcGVuZCgiYWJzdHJhY3QiKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CiAJCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKIAkJCQlzYi5hcHBlbmQoQ1IpOwpAQCAtMjI3LDggKzIzNyw2IEBACiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTI0Miw5ICsyNTAsNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVRhYmxlQW5ub3RhdGlvbigpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0yNzYsMTAgKzI4MSw3IEBACiAJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwogCX0KIAotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSW5oZXJpdGFuY2VBbm5vdGF0aW9uKCk7Ci0JCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTI5MywxMCArMjk1LDcgQEAKIAkJfSk7CiAJfQogCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZURpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24oKTsKLQkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTMxMSw5ICszMTAsNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0zMjgsOSArMzI0LDYgQEAKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTM0MywzMSArMzM2LDQ2IEBACiAJCQl9CiAJCX0pOwogCX0KLQkKKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7CisJCQl9CisJCX0pOworCX0KKwogCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUVudGl0eSBlbnRpdHkgPSAoSmF2YUVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwogCQllbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwogCQllbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCXR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CiAJCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwogCQllbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCJhc2RmIik7CiAJCWVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWVudGl0eS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQllbnRpdHkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJZW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7CisJCWVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwogCQllbnRpdHkuc2V0SWRDbGFzcygibXlJZENsYXNzIik7Ci0JCWVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQllbnRpdHkuYWRkTmFtZWRRdWVyeSgwKTsKKwkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKIAkJCi0JCWphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFwcGVkU3VwZXJjbGFzcyk7CisJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydFRydWUoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFwcGVkU3VwZXJjbGFzcyk7CiAJCQotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CkBAIC0zODcsMjYgKzM5NSwyNiBAQAogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUVudGl0eSBlbnRpdHkgPSAoSmF2YUVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwogCQllbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwogCQllbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCXR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CiAJCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwogCQllbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCJhc2RmIik7CiAJCWVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWVudGl0eS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQllbnRpdHkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJZW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7CisJCWVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwogCQllbnRpdHkuc2V0SWRDbGFzcygibXlJZENsYXNzIik7Ci0JCWVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQllbnRpdHkuYWRkTmFtZWRRdWVyeSgwKTsKKwkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKIAkJCi0JCWphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRhYmxlKTsKKwkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOworCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGFibGUpOwogCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtNDI2LDI2ICs0MzQsMjYgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUphdmFFbnRpdHkgZW50aXR5ID0gKEphdmFFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKIAkJZW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CiAJCWVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKIAkJZW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwogCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKIAkJZW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiYXNkZiIpOwogCQllbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQllbnRpdHkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJZW50aXR5LmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCWVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOworCQllbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJZW50aXR5LnNldElkQ2xhc3MoIm15SWRDbGFzcyIpOwotCQllbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJZW50aXR5LmFkZE5hbWVkUXVlcnkoMCk7CisJCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7CisJCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7CiAJCQotCQlqYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YU51bGxUeXBlTWFwcGluZyk7CisJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhTnVsbFR5cGVNYXBwaW5nKTsKIAkJCi0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKQEAgLTQ2NCw1MSArNDcyLDUyIEBACiAJcHVibGljIHZvaWQgdGVzdEFjY2Vzc05vQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKIAl9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzQW5ub3RhdGlvbnNPblBhcmVudCgpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NBbm5vdGF0aW9uc09uU3VwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRpb25PblByb3BlcnR5KCk7CiAJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwogCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwogCQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZFBlcnNpc3RlbnRUeXBlID0gamF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCVBlcnNpc3RlbnRUeXBlIHBhcmVudFBlcnNpc3RlbnRUeXBlID0gY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRQYXJlbnRQZXJzaXN0ZW50VHlwZSgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgY2hpbGRQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlQZXJzaXN0ZW50VHlwZSBzdXBlclBlcnNpc3RlbnRUeXBlID0gY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCk7CiAJCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgcGFyZW50UGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CiAJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsJCQogCQkKLQkJKChJZE1hcHBpbmcpIHBhcmVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJdHlwZVJlc291cmNlLnByb3BlcnRpZXMoKS5uZXh0KCkuc2V0TWFwcGluZ0Fubm90YXRpb24obnVsbCk7CisJCSgoSWRNYXBwaW5nKSBzdXBlclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCXR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZVByb3BlcnRpZXMoKS5uZXh0KCkucmVtb3ZlQW5ub3RhdGlvbihKUEEuSUQpOwogCQkvL25vIG1hcHBpbmcoSWQpIGFubm90YXRpb24sIGJ1dCBzdGlsbCBhIENvbHVtbiBhbm5vdGF0aW9uLCBzbyBhY2Nlc3Mgc2hvdWxkIHN0aWxsIGJlIHByb3BlcnR5Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBwYXJlbnRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBzdXBlclBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKIAkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwogCi0JCSgoQmFzaWNNYXBwaW5nKSBwYXJlbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwYXJlbnRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJCSgoQmFzaWNNYXBwaW5nKSBzdXBlclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwogCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CiAJCQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBwYXJlbnRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwogCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CiAJCQotCQllbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7CiAJCS8vc3RpbGwgYWNjZXNzVHlwZSBvZiBQUk9QRVJUWSBiZWNhdXNlIHRoZSBqYXZhIGNsYXNzIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhpcyBvcm0ueG1sCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBwYXJlbnRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBzdXBlclBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKIAkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJcmVtb3ZlWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCS8vb25seSBwYXJlbnQgc3BlY2lmaWVkIGluIG9ybS54bWwsIGkgdGhpbmsgdGhpcyBvdXRjb21lIGlzIHJpZ2h0Pz8KIAkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKIAkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwogCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CiAJCXJlbW92ZVhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJLy9ib3RoIHBhcmVudCBhbmQgY2hpbGQgc3BlY2lmaWVkIGluIG9ybS54bWwKIAkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKQEAgLTUyMCwzMiArNTI5LDMzIEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKIAkJCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKIAkJCQotCQkoKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQl0eXBlUmVzb3VyY2UucHJvcGVydGllcygpLm5leHQoKS5zZXRNYXBwaW5nQW5ub3RhdGlvbihudWxsKTsKKwkJKChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCXR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZVByb3BlcnRpZXMoKS5uZXh0KCkucmVtb3ZlQW5ub3RhdGlvbihKUEEuSUQpOwogCQkvL25vIG1hcHBpbmcoSWQpIGFubm90YXRpb24sIGJ1dCBzdGlsbCBhIENvbHVtbiBhbm5vdGF0aW9uLCBzbyBhY2Nlc3Mgc2hvdWxkIHN0aWxsIGJlIHByb3BlcnR5Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0KLQkJKChCYXNpY01hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKKwkJKChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7CisJCQorCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKIAkJLy9zdGlsbCBhY2Nlc3NUeXBlIG9mIFBST1BFUlRZIGJlY2F1c2UgdGhlIGphdmEgY2xhc3MgaXMgbm90IHNwZWNpZmllZCBpbiB0aGlzIG9ybS54bWwKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKIAkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQogCQkvL25vdyBjbGFzcyBpcyBzcGVjaWZpZWQgaW4gb3JtLnhtbCwgc28gZW50aXR5TWFwcGluZ3MgYWNjZXNzIHNldHRpbmcgd2lucyBvdmVyIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMKIAkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKIAkJCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwogCQkKIAkJLy9hY2Nlc3NUeXBlIHNob3VsZCBiZSBQUk9QRVJUWSBub3csIGphdmEgZ2V0cyB0aGUgYWNjZXNzIGZyb20geG1sIGVudGl0eSBpZiBpdCBpcyBzcGVjaWZpZWQKIAkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKQEAgLTU1NSwxMTQgKzU2NSwxMTQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWROYW1lKCkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlhc3NlcnRFcXVhbHMoRU5USVRZX05BTUUsIGphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoRU5USVRZX05BTUUsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWVTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgamF2YUVudGl0eSgpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGphdmFFbnRpdHkoKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHROYW1lKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBqYXZhRW50aXR5KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscyhFTlRJVFlfTkFNRSwgamF2YUVudGl0eSgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhFTlRJVFlfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldE5hbWUoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlqYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7CisJCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKIAkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUVudGl0eSgpLmdldFNwZWNpZmllZE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFbnRpdHlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVudGl0eUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlqYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKKwkJZ2V0SmF2YUVudGl0eSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWROYW1lKCkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlhc3NlcnROdWxsKCgoRW50aXR5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwoKChFbnRpdHlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLmdldE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVGcm9tU3BlY2lmaWVkTmFtZUNoYW5nZUluUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eUFubm90YXRpb24gZW50aXR5ID0gKEVudGl0eUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUVudGl0eUFubm90YXRpb24gZW50aXR5ID0gKEVudGl0eUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJZW50aXR5LnNldE5hbWUoImZvbyIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKIAkKLQkJYXNzZXJ0RXF1YWxzKEVOVElUWV9OQU1FLCBqYXZhRW50aXR5KCkuZ2V0VGFibGVOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoRU5USVRZX05BTUUsIGdldEphdmFFbnRpdHkoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGVOYW1lMigpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBqYXZhRW50aXR5KCkuZ2V0VGFibGVOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldFRhYmxlTmFtZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIGphdmFFbnRpdHkoKS5nZXRUYWJsZU5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpKTsKIAl9CQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXRUYWJsZU5hbWVXaXRoTnVsbFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQotCQlUYWJsZSB0YWJsZSA9IGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpOworCQlUYWJsZSB0YWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpOwogCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCB0YWJsZS5nZXROYW1lKCkpOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlIiwgY3UpOwogCQkKIAkJdGFibGUuc2V0U3BlY2lmaWVkTmFtZShUQUJMRV9OQU1FKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZShuYW1lPVwiIiArIFRBQkxFX05BTUUgKyAiXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKG5hbWUgPSBcIiIgKyBUQUJMRV9OQU1FICsgIlwiKSIsIGN1KTsKIAkJCi0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBqYXZhRW50aXR5KCkuZ2V0VGFibGVOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldFByaW1hcnlUYWJsZU5hbWUoKSk7CiAJCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCB0YWJsZS5nZXROYW1lKCkpOwogCiAJCXRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coVEFCTEVfTkFNRSk7CkBAIC02NzIsNyArNjgyLDcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhJbmhlcml0YW5jZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgamF2YUVudGl0eSgpLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CQkKKwkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGdldEphdmFFbnRpdHkoKS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwkJCiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNjgyLDQ2ICs2OTIsNTAgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydE5vdFNhbWUoamF2YUVudGl0eSgpLCBqYXZhRW50aXR5KCkuZ2V0Um9vdEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGphdmFFbnRpdHkoKS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJRW50aXR5IGNoaWxkRW50aXR5ID0gKEVudGl0eSkgc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVudGl0eSByb290RW50aXR5ID0gKEVudGl0eSkgc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnROb3RTYW1lKGNoaWxkRW50aXR5LCByb290RW50aXR5KTsKKwkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwogCQkKIAkJLy9jaGFuZ2Ugcm9vdCBpbmhlcml0YW5jZSBzdHJhdGVneSwgdmVyaWZ5IGRlZmF1bHQgaXMgY2hhbmdlZCBmb3IgY2hpbGQgZW50aXR5Ci0JCWphdmFFbnRpdHkoKS5nZXRSb290RW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKKwkJcm9vdEVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwogCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBqYXZhRW50aXR5KCkuZ2V0Um9vdEVudGl0eSgpLmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgamF2YUVudGl0eSgpLmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgamF2YUVudGl0eSgpLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CisJCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCByb290RW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CisJCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBjaGlsZEVudGl0eS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnROdWxsKGNoaWxkRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSW5oZXJpdGFuY2UoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCUluaGVyaXRhbmNlQW5ub3RhdGlvbiBpbmhlcml0YW5jZSA9IChJbmhlcml0YW5jZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEluaGVyaXRhbmNlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCiAJCWluaGVyaXRhbmNlLnNldFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7CiAJCQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgamF2YUVudGl0eSgpLmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CisJCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuSk9JTkVELCBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKIAkJCiAJCWluaGVyaXRhbmNlLnNldFN0cmF0ZWd5KG51bGwpOwogCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhJbmhlcml0YW5jZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CiAKLQkJamF2YUVudGl0eSgpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7CisJCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5KT0lORUQsIGphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJSW5oZXJpdGFuY2VBbm5vdGF0aW9uIGluaGVyaXRhbmNlID0gKEluaGVyaXRhbmNlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSW5oZXJpdGFuY2VBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlVHlwZS5KT0lORUQsIGluaGVyaXRhbmNlLmdldFN0cmF0ZWd5KCkpOwogCQkKQEAgLTczMSw0OCArNzQ1LDUzIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvclZhbHVlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCWFzc2VydEVxdWFscyhESVNDUklNSU5BVE9SX1ZBTFVFLCBqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOwkJCisJCWFzc2VydEVxdWFscyhESVNDUklNSU5BVE9SX1ZBTFVFLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOwkJCiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvclZhbHVlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKGphdmFFbnRpdHkoKS5nZXROYW1lKCksIGphdmFFbnRpdHkoKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSk7CisJCQorCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoZ2V0SmF2YUVudGl0eSgpLmdldE5hbWUoKSwgZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSk7CiAKLQkJamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSKTsKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JWYWx1ZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlhc3NlcnRFcXVhbHMoRElTQ1JJTUlOQVRPUl9WQUxVRSwgamF2YUVudGl0eSgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKERJU0NSSU1JTkFUT1JfVkFMVUUsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCURpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24gZGlzY3JpbWluYXRvclZhbHVlID0gKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAogCQlkaXNjcmltaW5hdG9yVmFsdWUuc2V0VmFsdWUoImZvbyIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSk7CiAJCQogCQlkaXNjcmltaW5hdG9yVmFsdWUuc2V0VmFsdWUobnVsbCk7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKIAkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvclZhbHVlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoRElTQ1JJTUlOQVRPUl9WQUxVRSwgamF2YUVudGl0eSgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKERJU0NSSU1JTkFUT1JfVkFMVUUsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSk7CiAKLQkJamF2YUVudGl0eSgpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiZm9vIik7CisJCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoImZvbyIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yVmFsdWUgPSAoRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIGRpc2NyaW1pbmF0b3JWYWx1ZS5nZXRWYWx1ZSgpKTsKIAl9CkBAIC03ODEsNyArODAwLDcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOwogCQkKIAkJYXNzZXJ0VHJ1ZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7CkBAIC03OTIsOCArODExLDggQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCiAJCWFzc2VydEVxdWFscygwLCBlbnRpdHkuc2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKIApAQCAtODA4LDcgKzgyNyw3IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOworCQlMaXN0SXRlcmF0b3I8SmF2YVNlY29uZGFyeVRhYmxlPiBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMgPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7CiAJCQogCQlhc3NlcnRUcnVlKHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKQEAgLTgyMCw4ICs4MzksOCBAQAogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkKIAkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwogCkBAIC04MzYsMTIgKzg1NSwxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CisJCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gc2Vjb25kYXJ5VGFibGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IHNlY29uZGFyeVRhYmxlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwpAQCAtODUzLDEyICs4NzIsMTIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CisJCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IHNlY29uZGFyeVRhYmxlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBzZWNvbmRhcnlUYWJsZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKQEAgLTg3MCwxOCArODg5LDE4IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlTZWNvbmRhcnlUYWJsZSBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKKwkJU2Vjb25kYXJ5VGFibGUgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7CiAJCXNwZWNpZmllZFNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJDQVRBTE9HIik7CiAJCXNwZWNpZmllZFNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiU0NIRU1BIik7CiAJCXNwZWNpZmllZFNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIlBLX05BTUUiKTsKIAkJCiAJCS8vYWRkIGFub3RoZXIgc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZSwgcGtKb2luQ29sdW1ucyBmcm9tIGZpcnN0IHNob3VsZCBiZSBzYXZlZC4KLQkJU2Vjb25kYXJ5VGFibGUgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUyID0gamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDEpOworCQlTZWNvbmRhcnlUYWJsZSBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZTIgPSBnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMSk7CiAJCXNwZWNpZmllZFNlY29uZGFyeVRhYmxlMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKIAkJCiAJCQotCQlJdGVyYXRvcjxTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOworCQlJdGVyYXRvcjxKYXZhU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IGdldEphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKTsKIAkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoc2Vjb25kYXJ5VGFibGUsIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZS5nZXROYW1lKCkpOwpAQCAtOTAyLDQxICs5MjEsNDEgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CisJCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCiAJCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKSk7CiAKLQkJamF2YUVudGl0eSgpLnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDEpOworCQlnZXRKYXZhRW50aXR5KCkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMSk7CiAJCQotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBzZWNvbmRhcnlUYWJsZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5oYXNOZXh0KCkpOwogCQkKLQkJSXRlcmF0b3I8U2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKTsKKwkJSXRlcmF0b3I8SmF2YVNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXMgPSBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCiAJCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKIAkKIAkJCi0JCWphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKTsKKwkJZ2V0SmF2YUVudGl0eSgpLnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDEpOwogCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQogCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5oYXNOZXh0KCkpOwogCi0JCXNlY29uZGFyeVRhYmxlcyA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKTsKKwkJc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7CiAKIAkJCi0JCWphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKKwkJZ2V0SmF2YUVudGl0eSgpLnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwogCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCXNlY29uZGFyeVRhYmxlcyA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKTsKKwkJc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOwogCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKIAogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CkBAIC05NDYsMTQgKzk2NSwxNCBAQAogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAogCQllbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CiAJCWVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKIAkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbj4gamF2YVNlY29uZGFyeVRhYmxlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YVNlY29uZGFyeVRhYmxlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhU2Vjb25kYXJ5VGFibGVzKSk7CiAJCQogCQkKQEAgLTk2NCw5ICs5ODMsOSBAQAogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAogCQlqYXZhU2Vjb25kYXJ5VGFibGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhU2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFTZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIGphdmFTZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBqYXZhU2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAogCiAJCWVudGl0eS5tb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCwgMSk7CkBAIC05NzYsMTcgKzk5NSwxNyBAQAogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAogCQlqYXZhU2Vjb25kYXJ5VGFibGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhU2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFTZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIGphdmFTZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBqYXZhU2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkKIAkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7CiAJCSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwpAQCAtOTk4LDE0ICsxMDE3LDE0IEBACiAJCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKIAkJCi0JCXR5cGVSZXNvdXJjZS5tb3ZlKDIsIDAsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJdHlwZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJc2Vjb25kYXJ5VGFibGVzID0gZW50aXR5LnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKIAkKLQkJdHlwZVJlc291cmNlLm1vdmUoMCwgMSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMCwgMSwgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlzZWNvbmRhcnlUYWJsZXMgPSBlbnRpdHkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKQEAgLTEwMzIsOCArMTA1MSw4IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkoKS5hc3NvY2lhdGVkVGFibGVzKCkpKTsKLQkJSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXMgPSBqYXZhRW50aXR5KCkuYXNzb2NpYXRlZFRhYmxlcygpOworCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0SmF2YUVudGl0eSgpLmFzc29jaWF0ZWRUYWJsZXMoKSkpOworCQlJdGVyYXRvcjxUYWJsZT4gYXNzb2NpYXRlZFRhYmxlcyA9IGdldEphdmFFbnRpdHkoKS5hc3NvY2lhdGVkVGFibGVzKCk7CiAJCVRhYmxlIHRhYmxlMSA9IGFzc29jaWF0ZWRUYWJsZXMubmV4dCgpOwogCQlTZWNvbmRhcnlUYWJsZSB0YWJsZTIgPSAoU2Vjb25kYXJ5VGFibGUpIGFzc29jaWF0ZWRUYWJsZXMubmV4dCgpOwogCQlTZWNvbmRhcnlUYWJsZSB0YWJsZTMgPSAoU2Vjb25kYXJ5VGFibGUpIGFzc29jaWF0ZWRUYWJsZXMubmV4dCgpOwpAQCAtMTA0OCw5ICsxMDY3LDEyIEBACiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlFbnRpdHkgcGFyZW50RW50aXR5ID0gamF2YUVudGl0eSgpLmdldFJvb3RFbnRpdHkoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHBhcmVudEVudGl0eS5hc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkpKTsKLQkJSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXMgPSBwYXJlbnRFbnRpdHkuYXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpOworCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQlFbnRpdHkgY2hpbGRFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRW50aXR5IHJvb3RFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKworCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUocm9vdEVudGl0eS5hc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkpKTsKKwkJSXRlcmF0b3I8VGFibGU+IGFzc29jaWF0ZWRUYWJsZXMgPSByb290RW50aXR5LmFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKTsKIAkJVGFibGUgdGFibGUxID0gYXNzb2NpYXRlZFRhYmxlcy5uZXh0KCk7CiAJCVNlY29uZGFyeVRhYmxlIHRhYmxlMiA9IChTZWNvbmRhcnlUYWJsZSkgYXNzb2NpYXRlZFRhYmxlcy5uZXh0KCk7CiAJCVNlY29uZGFyeVRhYmxlIHRhYmxlMyA9IChTZWNvbmRhcnlUYWJsZSkgYXNzb2NpYXRlZFRhYmxlcy5uZXh0KCk7CkBAIC0xMDU4LDcgKzEwODAsNiBAQAogCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlMi5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoImJhciIsIHRhYmxlMy5nZXROYW1lKCkpOwogCi0JCUVudGl0eSBjaGlsZEVudGl0eSA9IGphdmFFbnRpdHkoKTsKIAkJLy9UT0RPIHByb2JhYmx5IHdhbnQgdGhpcyB0byBiZSAzLCBzaW5jZSBpbiB0aGlzIGNhc2UgdGhlIGNoaWxkIGRlc2NyaXB0b3IgcmVhbGx5IHVzZXMgdGhlCiAJCS8vcGFyZW50IHRhYmxlIGJlY2F1c2UgaXQgaXMgc2luZ2xlIHRhYmxlIGluaGVyaXRhbmNlIHN0cmF0ZWd5LiAgTm90IHN1cmUgeWV0IGhvdyB0byBkZWFsIHdpdGggdGhpcy4KIAkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5zaXplKGNoaWxkRW50aXR5LmFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSkpOwpAQCAtMTA3MCw5ICsxMDkxLDEyIEBACiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlFbnRpdHkgcGFyZW50RW50aXR5ID0gamF2YUVudGl0eSgpLmdldFJvb3RFbnRpdHkoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHBhcmVudEVudGl0eS5hc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpKSk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gYXNzb2NpYXRlZFRhYmxlcyA9IHBhcmVudEVudGl0eS5hc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpOworCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQlFbnRpdHkgY2hpbGRFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRW50aXR5IHJvb3RFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyb290RW50aXR5LmFzc29jaWF0ZWRUYWJsZU5hbWVzSW5jbHVkaW5nSW5oZXJpdGVkKCkpKTsKKwkJSXRlcmF0b3I8U3RyaW5nPiBhc3NvY2lhdGVkVGFibGVzID0gcm9vdEVudGl0eS5hc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpOwogCQlTdHJpbmcgdGFibGUxID0gYXNzb2NpYXRlZFRhYmxlcy5uZXh0KCk7CiAJCVN0cmluZyB0YWJsZTIgPSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKIAkJU3RyaW5nIHRhYmxlMyA9IGFzc29jaWF0ZWRUYWJsZXMubmV4dCgpOwpAQCAtMTA4MCw3ICsxMTA0LDYgQEAKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0YWJsZTIpOwogCQlhc3NlcnRFcXVhbHMoImJhciIsIHRhYmxlMyk7CiAJCQotCQlFbnRpdHkgY2hpbGRFbnRpdHkgPSBqYXZhRW50aXR5KCk7CiAJCS8vVE9ETyBwcm9iYWJseSB3YW50IHRoaXMgdG8gYmUgMywgc2luY2UgaW4gdGhpcyBjYXNlIHRoZSBjaGlsZCBkZXNjcmlwdG9yIHJlYWxseSB1c2VzIHRoZQogCQkvL3BhcmVudCB0YWJsZSBiZWNhdXNlIGl0IGlzIHNpbmdsZSB0YWJsZSBpbmhlcml0YW5jZSBzdHJhdGVneS4gIE5vdCBzdXJlIHlldCBob3cgdG8gZGVhbCB3aXRoIHRoaXMuCiAJCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShjaGlsZEVudGl0eS5hc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpKSk7CkBAIC0xMDkwLDI3ICsxMTEzLDI3IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7CiAJCXNlY29uZGFyeVRhYmxlLnNldE5hbWUoIkZPTyIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXROYW1lKCkpOwogCiAJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZTIgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7CiAJCXNlY29uZGFyeVRhYmxlMi5zZXROYW1lKCJCQVIiKTsKIAkJCi0JCWFzc2VydEVxdWFscygyLCBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPFNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXMgPSBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7CisJCWFzc2VydEVxdWFscygyLCBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAKIAkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlMyA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKIAkJc2Vjb25kYXJ5VGFibGUzLnNldE5hbWUoIkJBWiIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlzZWNvbmRhcnlUYWJsZXMgPSBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7CisJCWFzc2VydEVxdWFscygzLCBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKKwkJc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwpAQCAtMTEyMCwzMyArMTE0MywzMyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgyKS5zZXRTcGVjaWZpZWROYW1lKCJiYXoiKTsKLQkJTGlzdEl0ZXJhdG9yPFNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZXMgPSBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7CisJCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgyKS5zZXRTcGVjaWZpZWROYW1lKCJiYXoiKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMywgZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlc1NpemUoKSk7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoImJhciIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7CiAJCQotCQlzZWNvbmRhcnlUYWJsZXMgPSBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFzc2VydEVxdWFscygyLCBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKKwkJc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOworCQlhc3NlcnRFcXVhbHMoMiwgZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlc1NpemUoKSk7CiAJCWFzc2VydEVxdWFscygiYmFyIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoImJheiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwogCQkKLQkJc2Vjb25kYXJ5VGFibGVzID0gamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlc1NpemUoKSk7CisJCXNlY29uZGFyeVRhYmxlcyA9IGdldEphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGdldEphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXNTaXplKCkpOwogCQlhc3NlcnRFcXVhbHMoImJheiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJCiAJCQogCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7CiAJCQotCQlzZWNvbmRhcnlUYWJsZXMgPSBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKKwkJc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOworCQlhc3NlcnRFcXVhbHMoMCwgZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlc1NpemUoKSk7CiAJCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwogCX0JCiAJCkBAIC0xMTU0LDM2ICsxMTc3LDM2IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CisJCWFzc2VydEVxdWFscygwLCBnZXRKYXZhRW50aXR5KCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CiAJCQotCQlhc3NlcnROb3ROdWxsKGphdmFFbnRpdHkoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhRW50aXR5KCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7CisJCWFzc2VydE5vdE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgdHlwZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGdldEphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCi0JCWphdmFFbnRpdHkoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUVudGl0eSgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOworCQlnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGdldEphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEFkZFNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKIAkJCi0JCWphdmFFbnRpdHkoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOworCQlnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQogCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpKTsKLQkJYXNzZXJ0Tm90TnVsbChqYXZhRW50aXR5KCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CisJCWFzc2VydE5vdE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwogCQkKIAkJLy90cnkgYWRkaW5nIGFub3RoZXIgc2VxdWVuY2UgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgogCQl0cnkgewotCQkJamF2YUVudGl0eSgpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCQlnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTE5NCwxNyArMTIxNywxNyBAQAogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCXR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwogCQkKLQkJamF2YUVudGl0eSgpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCWdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOwogCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpKTsKIAogCQkvL3RyeSByZW1vdmluZyB0aGUgc2VxdWVuY2UgZ2VuZXJhdG9yIGFnYWluLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgogCQl0cnkgewotCQkJamF2YUVudGl0eSgpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7CQkKKwkJCWdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOwkJCiAJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTEyMTUsMzYgKzEyMzgsMzYgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUVudGl0eSgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGdldEphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCXR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwogCQkKLQkJYXNzZXJ0Tm90TnVsbChqYXZhRW50aXR5KCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhRW50aXR5KCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7CisJCWFzc2VydE5vdE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwkJCisJCWFzc2VydEVxdWFscygyLCB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgZ2V0SmF2YUVudGl0eSgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdlbmVyYXRvcnNTaXplKCkpOwogCQkKLQkJamF2YUVudGl0eSgpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhRW50aXR5KCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7CisJCWdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoMSwgZ2V0SmF2YUVudGl0eSgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdlbmVyYXRvcnNTaXplKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFRhYmxlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKIAkJCi0JCWphdmFFbnRpdHkoKS5hZGRUYWJsZUdlbmVyYXRvcigpOworCQlnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQogCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpKTsKLQkJYXNzZXJ0Tm90TnVsbChqYXZhRW50aXR5KCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CisJCWFzc2VydE5vdE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwogCQkKIAkJLy90cnkgYWRkaW5nIGFub3RoZXIgdGFibGUgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgogCQl0cnkgewotCQkJamF2YUVudGl0eSgpLmFkZFRhYmxlR2VuZXJhdG9yKCk7CQkKKwkJCWdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwkJCiAJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTEyNTUsMTcgKzEyNzgsMTcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CiAJCQotCQlqYXZhRW50aXR5KCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLnJlbW92ZVRhYmxlR2VuZXJhdG9yKCk7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CiAJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUikpOwogCQkKIAkJLy90cnkgcmVtb3ZpbmcgdGhlIHRhYmxlIGdlbmVyYXRvciBhZ2Fpbiwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KIAkJdHJ5IHsKLQkJCWphdmFFbnRpdHkoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwkJCisJCQlnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsJCQogCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewogCQkJcmV0dXJuOwogCQl9CkBAIC0xMjc2LDQzICsxMjk5LDQzIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlhc3NlcnROb3ROdWxsKGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOworCQlhc3NlcnROb3ROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwogCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7CiAJCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKIAkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJCiAJCWNvbHVtbi5zZXROYW1lKG51bGwpOwogCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCiAJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7CiAJCQotCQlhc3NlcnROb3ROdWxsKGphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOworCQlhc3NlcnROb3ROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwogCQkKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwogCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCiAJCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAogCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKIAkJcGtKb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCisJCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAKIAkJcGtKb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKIAkJcGtKb2luQ29sdW1uLnNldE5hbWUoIkJBUiIpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCisJCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKQEAgLTEzMjAsMzQgKzEzNDMsMzQgQEAKIAogCQlwa0pvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwogCQlwa0pvaW5Db2x1bW4uc2V0TmFtZSgiQkFaIik7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKKwkJc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAJCiAJCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJdHlwZVJlc291cmNlLm1vdmUoMSwgMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKKwkJdHlwZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOworCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCiAJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAogCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCisJCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAkKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsJCQorCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwogCiAJCQogCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCisJCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwogCX0KIAkKQEAgLTEzNTUsMTMgKzEzNzgsMTMgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscygwLCBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwogCQotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOworCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMywgZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTEzNjksMzkgKzEzOTIsMzkgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQogCQkvL2p1c3QgdGhlIGRlZmF1bHQgcGtKb2luQ29sdW1uLCBzbyAxCi0JCWFzc2VydEVxdWFscygxLCBqYXZhRW50aXR5KCkucHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGdldEphdmFFbnRpdHkoKS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwogCQotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOworCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwogCQkKIAkJLy9vbmx5IHRoZSBzcGVjaWZpZWQgcGtKb2luQ29sdW1ucywgMwotCQlhc3NlcnRFcXVhbHMoMywgamF2YUVudGl0eSgpLnByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygzLCBnZXRKYXZhRW50aXR5KCkucHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlhc3NlcnROb3ROdWxsKGphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7CisJCWFzc2VydE5vdE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKIAkKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CisJCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CisJCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IHBrSm9pbkNvbHVtbnMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydEVxdWFscygiQkFaIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKQEAgLTE0MTMsMTIgKzE0MzYsMTIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CisJCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IHBrSm9pbkNvbHVtbnMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKQEAgLTE0MjksNTggKzE0NTIsNTggQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CisJCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSkpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpKTsKIAotCQlqYXZhRW50aXR5KCkucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSk7CisJCWdldEphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKTsKIAkJCi0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IHBrSm9pbkNvbHVtblJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuQU5OT1RBVElPTl9OQU1FKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5SZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCiAJCWFzc2VydEVxdWFscygiQkFaIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHBrSm9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwogCQkKLQkJSXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW4+IHBrSm9pbkNvbHVtbnMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCUl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcGtKb2luQ29sdW1ucyA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwkJCiAJCWFzc2VydEVxdWFscygiQkFaIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwogCQogCQkKLQkJamF2YUVudGl0eSgpLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQlwa0pvaW5Db2x1bW5SZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7CisJCWdldEphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKTsKKwkJcGtKb2luQ29sdW1uUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQogCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKIAotCQlwa0pvaW5Db2x1bW5zID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCQlwa0pvaW5Db2x1bW5zID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAogCQkKLQkJamF2YUVudGl0eSgpLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlwa0pvaW5Db2x1bW5SZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7CisJCWdldEphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKKwkJcGtKb2luQ29sdW1uUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCXBrSm9pbkNvbHVtbnMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCXBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEZhbHNlKHBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCiAJCWVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJZW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwogCQllbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CiAJCQotCQlMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpOworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YVByaW1hcnlLZXlKb2luQ29sdW1ucykpOwogCQkKIAkJCkBAIC0xNDkwLDEwICsxNTEzLDEwIEBACiAJCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAotCQlqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAogCiAJCWVudGl0eS5tb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCwgMSk7CkBAIC0xNTAyLDIyICsxNTI1LDIyIEBACiAJCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAotCQlqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkKLQkJKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKKwkJKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7CisJCSgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOworCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKIAkJCQogCQlMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGVudGl0eS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CkBAIC0xNTI1LDMyICsxNTQ4LDMyIEBACiAJCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAkJCi0JCXR5cGVSZXNvdXJjZS5tb3ZlKDIsIDAsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpOworCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMiwgMCwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwogCQotCQl0eXBlUmVzb3VyY2UubW92ZSgwLCAxLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuQU5OT1RBVElPTl9OQU1FKTsKKwkJdHlwZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDAsIDEsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gZW50aXR5LnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpOworCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuQU5OT1RBVElPTl9OQU1FKTsKKwkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gZW50aXR5LnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAJCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCAgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7CisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGVudGl0eS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKIAkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAJfQpAQCAtMTU1OSwzMiArMTU4MiwzMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJYXNzZXJ0VHJ1ZShqYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRUcnVlKGdldEphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKS5pc1ZpcnR1YWwoKSk7CiAKLQkJamF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7CisJCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5pc1ZpcnR1YWwoKSk7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFRhYmxlTmFtZUlzSW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCWFzc2VydEZhbHNlKGphdmFFbnRpdHkoKS50YWJsZU5hbWVJc0ludmFsaWQoVFlQRV9OQU1FKSk7Ci0JCWFzc2VydFRydWUoamF2YUVudGl0eSgpLnRhYmxlTmFtZUlzSW52YWxpZCgiRk9PIikpOworCQlhc3NlcnRGYWxzZShnZXRKYXZhRW50aXR5KCkudGFibGVOYW1lSXNJbnZhbGlkKFRZUEVfTkFNRSkpOworCQlhc3NlcnRUcnVlKGdldEphdmFFbnRpdHkoKS50YWJsZU5hbWVJc0ludmFsaWQoIkZPTyIpKTsKIAkJCi0JCWphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwogCQkKLQkJYXNzZXJ0RmFsc2UoamF2YUVudGl0eSgpLnRhYmxlTmFtZUlzSW52YWxpZCgiQkFSIikpOworCQlhc3NlcnRGYWxzZShnZXRKYXZhRW50aXR5KCkudGFibGVOYW1lSXNJbnZhbGlkKCJCQVIiKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwogCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKIAkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CkBAIC0xNjAxLDcgKzE2MjQsMTUgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkKLQkJSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gamF2YUVudGl0eSgpLm92ZXJyaWRhYmxlQXR0cmlidXRlcygpOworCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOworCQkKKwkJCisJCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOworCQkKKwkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwogCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKIAl9CiAKQEAgLTE2MDksNyArMTY0MCwxNSBAQAogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBqYXZhRW50aXR5KCkub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisJCQorCQkKKwkJZ2V0SmF2YUVudGl0eSgpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7CisJCQorCQlvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwogCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CiAJfQogCkBAIC0xNjE5LDIzICsxNjU4LDY5IEBACiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCi0JCUl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CiAJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwogCX0KIAkKKwlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisJCQorCQkKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJY2xhc3NSZWZzLm5leHQoKTsKKwkJSmF2YUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gYWJzdHJhY3RFbnRpdHkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOworCQkKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCWNsYXNzUmVmcy5uZXh0KCk7CisJCUphdmFFbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCW92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gYWJzdHJhY3RFbnRpdHkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOworCX0KKwogCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXNNYXBwZWRTdXBlcmNsYXNzSW5Pcm1YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKIAkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gamF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYmFzaWMiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKIAkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7CiAJfQogCkBAIC0xNjQ1LDEwICsxNzMwLDExIEBACiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGdldEphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwogCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CiAJfQogCQkKQEAgLTE2NTYsMjIgKzE3NDIsMjMgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CiAJCQogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAogCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKIAkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwpAQCAtMTY3OSw2MyArMTc2NiwxNTkgQEAKIAogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkKIAkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQl0eXBlUmVzb3VyY2UubW92ZSgxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwogCQogCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAKIAkJCiAJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwogCX0KIAotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZURlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CiAJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CiAJCQkKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CiAJCWNsYXNzUmVmcy5uZXh0KCk7CiAJCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGphdmFFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IGphdmFFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKKwkJCisKKwkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJCisJCUJhc2ljTWFwcGluZyBmb29NYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJmb28iKS5nZXRNYXBwaW5nKCk7CisJCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOworCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKKwkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKKwkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKKwkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKKwkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CisJCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7CisKKwkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOworCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOworCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7CisJCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKKwkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUobnVsbCk7CisJCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOworCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOworCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKKwkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24obnVsbCk7CisJCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7CisJCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKKwkJCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc0VudGl0eUhpZXJhY2h5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQkKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJY2xhc3NSZWZzLm5leHQoKTsKKwkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGphdmFFbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwogCQkKIAotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlKYXZhRW50aXR5IHN1cGVyY2xhc3MgPSAoSmF2YUVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwogCQkKLQkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCUJhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBzdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwogCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CiAJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7CiAJCQpAQCAtMTc0Myw4ICsxOTI2LDggQEAKIAkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAotCQlhc3NlcnRFcXVhbHMoMywgamF2YUVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gamF2YUVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CkBAIC0xNzU1LDIyICsxOTM4LDIzIEBACiAJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gamF2YUVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKIAkJCiAJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGphdmFFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscygwLCBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKIAkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCiAJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKQEAgLTE3NzgsMjcgKzE5NjIsMzAgQEAKIAkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwogCi0JCWFzc2VydEVxdWFscygyLCBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CiAJfQogCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwogCQljcmVhdGVUZXN0U3ViVHlwZSgpOwogCQkKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGphdmFFbnRpdHkgPSBqYXZhRW50aXR5KCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMywgamF2YUVudGl0eS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCi0JCWphdmFFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGphdmFFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAkJCi0JCWphdmFFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAkJCi0JCWphdmFFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE4MDcsMjEgKzE5OTQsMjEgQEAKIAkJCQogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgamF2YUVudGl0eSA9IGphdmFFbnRpdHkoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKIAkJCi0JCWFzc2VydEVxdWFscygzLCBqYXZhRW50aXR5LmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCi0JCWphdmFFbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGphdmFFbnRpdHkuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CiAJCQotCQlqYXZhRW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygzLCBqYXZhRW50aXR5LmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCQkKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CiAJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhbm5vdGF0aW9uLnNldE5hbWUoImJhciIpOwkKLQkJYXNzZXJ0RXF1YWxzKDQsIGphdmFFbnRpdHkuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUsIG92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTgzMSwxNCArMjAxOCwxNiBAQAogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkJCQotCQlqYXZhRW50aXR5KCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJamF2YUVudGl0eSgpLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFzaWMiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJfQogCQpAQCAtMTg0OSwxNiArMjAzOCwxOCBAQAogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CiAJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlqYXZhRW50aXR5KCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFzaWMiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJfQogCQpAQCAtMTg2OSw0MCArMjA2MCw0MiBAQAogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkJCQotCQlqYXZhRW50aXR5KCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJamF2YUVudGl0eSgpLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWphdmFFbnRpdHkoKS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkpOwogCi0JCWphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CiAJCQotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7CiAJCQotCQlJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCUl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiYmFzaWMiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJCiAJCQotCQlqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwogCQlhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQorCQlhc3NlcnRFcXVhbHMoImlkIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwogCi0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQkKLQkJamF2YUVudGl0eSgpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOworCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CkBAIC0xOTE1LDg2ICsyMTA4LDg1IEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlqYXZhRW50aXR5KCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJamF2YUVudGl0eSgpLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWphdmFFbnRpdHkoKS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwogCiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbj4gamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhQXR0cmlidXRlT3ZlcnJpZGVzKSk7CiAJCQotCQkKLQkJZW50aXR5Lm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBlbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyLCAwKTsKKwkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAKIAkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFzaWMiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCiAKLQkJZW50aXR5Lm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gZW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCwgMSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAogCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJfQotLy8JCisJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCiAJCSgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwogCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKIAkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7CiAJCQkKLQkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBlbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCUxpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwogCQkKLQkJdHlwZVJlc291cmNlLm1vdmUoMiwgMCwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBlbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCXR5cGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigyLCAwLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkKLQkJdHlwZVJlc291cmNlLm1vdmUoMCwgMSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBlbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCXR5cGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gZW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gZW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwogCQkKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gZW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJfQogCkBAIC0yMDA0LDYzICsyMTk2LDYzIEBACiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBqYXZhRW50aXR5KCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkKIAkJQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwogCiAJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7CiAJCQogCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCQorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKIAkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwogCi0JCWphdmFFbnRpdHkoKS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7CiAJCQogCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkKIAkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKIAkJCiAJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwogCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJfQogCQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUFzc29jaWF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gamF2YUVudGl0eSgpLm92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JfQotCiAJcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gamF2YUVudGl0eSgpLm92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOworCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IGdldEphdmFFbnRpdHkoKS5vdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKIAkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7CiAJfQogCQotLy8JLy9UT0RPIGFkZCBhbGwgbWFwcGluZyB0eXBlcyB0byB0aGUgbWFwcGVkIHN1cGVyY2xhc3MgdG8gdGVzdCB3aGljaCBvbmVzIGFyZSBvdmVycmlkYWJsZQogCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKIAkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IGphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7CisJCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKIAkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7CiAJfQogCQpAQCAtMjA3MCw0NCArMjI2Miw0NSBAQAogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQotCQlJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUFzc29jaWF0aW9ucygpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKS5nZXROYW1lKCkpOworCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOworCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwogCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwogCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnNNYXBwZWRTdXBlcmNsYXNzSW5Pcm1YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBqYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9CisvLwkKKy8vCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uc01hcHBlZFN1cGVyY2xhc3NJbk9ybVhtbCgpIHRocm93cyBFeGNlcHRpb24geworLy8JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisvLwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKy8vCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisvLwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKy8vCQkKKy8vCQlJdGVyYXRvcjxSZWxhdGlvbnNoaXBNYXBwaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGdldEphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUFzc29jaWF0aW9ucygpOworLy8JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKS5nZXROYW1lKCkpOworLy8JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7CisvLwl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwogCQkKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAogCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKIAkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKIAkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwogCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwpAQCAtMjExNSw4MiArMjMwOCwxMTkgQEAKIAogCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwogCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwogCQogCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXR5cGVSZXNvdXJjZS5tb3ZlKDEsIDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCisJCXR5cGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQkKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKIAl9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKIAkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKIAkJCQogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKIAkJY2xhc3NSZWZzLm5leHQoKTsKIAkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gamF2YUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJCi0JCWFzc2VydEVxdWFscygyLCBqYXZhRW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5pbmdTdHJhdGVneS5qb2luQ29sdW1uc1NpemUoKSk7CisJCUpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuam9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygib25lVG9PbmVfaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7CiAJCQogCi0JCS8vTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJLy9CYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5wZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKKwkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpLmdldE1hcHBpbmcoKTsKKwkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fQ09MVU1OIik7CisJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7CisJCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOworCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOworCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAotCQlhc3NlcnRFcXVhbHMoMiwgamF2YUVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCWpvaW5pbmdTdHJhdGVneSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBqb2luaW5nU3RyYXRlZ3kuam9pbkNvbHVtbnNTaXplKCkpOworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuam9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiTVlfSk9JTl9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOwogCisJCWFzc2VydEVxdWFscygiTVlfSk9JTl9DT0xVTU4iLCBqb2luaW5nU3RyYXRlZ3kuam9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKKworCisJCQorCQkKKwkJCisJCQogCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwogCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKIAkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCQogCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YUVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKIAkJCiAJCQogCQkKQEAgLTIyNDEsOSArMjQ3MSwxMCBAQAogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwogCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCiAJCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAogCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwpAQCAtMjI1MSwyNCArMjQ4MiwyNCBAQAogCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwogCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwogCi0JCWFzc2VydEVxdWFscygyLCBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwogCX0KIAkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CiAJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CiAJCQogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgamF2YUVudGl0eSA9IGphdmFFbnRpdHkoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMiwgamF2YUVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKIAkJCi0JCWphdmFFbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YUVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwogCQkKLQkJamF2YUVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhRW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIyNzcsMjEgKzI1MDgsMjIgQEAKIAkJCQogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgamF2YUVudGl0eSA9IGphdmFFbnRpdHkoKTsKIAkJCi0JCWFzc2VydEVxdWFscygyLCBqYXZhRW50aXR5LmFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CiAKLQkJamF2YUVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygyLCBqYXZhRW50aXR5LmFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CiAJCQotCQlqYXZhRW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGphdmFFbnRpdHkuYXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CiAJCQogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKIAkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKIAkJYW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsJCi0JCWFzc2VydEVxdWFscygzLCBqYXZhRW50aXR5LmFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIzMDEsMTQgKzI1MzMsMTUgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCQkKLQkJamF2YUVudGl0eSgpLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJamF2YUVudGl0eSgpLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKIAl9CiAJCkBAIC0yMzE5LDE2ICsyNTUyLDE3IEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CiAJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CiAJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWphdmFFbnRpdHkoKS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygib25lVG9PbmUiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJfQogCQpAQCAtMjMzOSwyNyArMjU3MywyOCBAQAogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkJCQotCQlqYXZhRW50aXR5KCkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwotCQlqYXZhRW50aXR5KCkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpKTsKIAotCQlqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKIAkJCi0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCiAJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKIAotCQlJdGVyYXRvcjxBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCUl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAKIAkJCi0JCWphdmFFbnRpdHkoKS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOworCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOwogCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwogCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwogCiAJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtMjM3Miw4MSArMjYwNyw4MSBAQAogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJamF2YUVudGl0eSgpLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJamF2YUVudGl0eSgpLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOwogCiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uPiBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcykpOwogCQkKIAkJCi0JCWVudGl0eS5tb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgxLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gZW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDEsIDApOworCQlMaXN0SXRlcmF0b3I8QXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAKIAkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAogCi0JCWVudGl0eS5tb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgwLCAxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBlbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMCwgMSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCiAJCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygib25lVG9PbmUiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCiAJCSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwogCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKIAkJKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7CiAJCQkKLQkJTGlzdEl0ZXJhdG9yPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gZW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCUxpc3RJdGVyYXRvcjxBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJCQotCQl0eXBlUmVzb3VyY2UubW92ZSgyLCAwLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBlbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJdHlwZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJCi0JCXR5cGVSZXNvdXJjZS5tb3ZlKDAsIDEsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMCwgMSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gZW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gZW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkJCiAJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CiAJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJfQogCkBAIC0yNDU2LDI0ICsyNjkxLDI1IEBACiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlMaXN0SXRlcmF0b3I8QXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQogCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwogCiAJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CiAJCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwogCi0JCWphdmFFbnRpdHkoKS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CiAJCQogCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gamF2YUVudGl0eSgpLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQogCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwogCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKIAl9CkBAIC0yNDgyLDcxICsyNzE4LDcxIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5hZGROYW1lZFF1ZXJ5KDApOwotCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkZPTyIpOworCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkxID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKKwkJbmFtZWRRdWVyeTEuc2V0TmFtZSgiRk9PIik7CiAJCQotCQlMaXN0SXRlcmF0b3I8TmFtZWRRdWVyeUFubm90YXRpb24+IGphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTmFtZWRRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQkKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5MiA9IGVudGl0eS5hZGROYW1lZFF1ZXJ5KDApOworCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkyID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKIAkJbmFtZWRRdWVyeTIuc2V0TmFtZSgiQkFSIik7CiAJCQogCQlqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJCi0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeTMgPSBlbnRpdHkuYWRkTmFtZWRRdWVyeSgxKTsKKwkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5MyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSk7CiAJCW5hbWVkUXVlcnkzLnNldE5hbWUoIkJBWiIpOwogCQkKIAkJamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxOYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCk7CisJCUxpc3RJdGVyYXRvcjxKYXZhTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWRRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5MiwgbmFtZWRRdWVyaWVzLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5MywgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5LCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkxLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKIAkJCi0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5uYW1lZFF1ZXJpZXMoKTsKKwkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWRRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCQotCQllbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKS5zZXROYW1lKCJmb28iKTsKKwkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKS5zZXROYW1lKCJmb28iKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCWVudGl0eS5hZGROYW1lZFF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHkuYWRkTmFtZWRRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW50aXR5LmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7CisJCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7CisJCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7CisJCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7CiAJCQotCQlMaXN0SXRlcmF0b3I8TmFtZWRRdWVyeUFubm90YXRpb24+IGphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKIAkJCi0JCWVudGl0eS5yZW1vdmVOYW1lZFF1ZXJ5KDApOworCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZFF1ZXJ5KDApOwogCQlqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwogCQlqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAotCQllbnRpdHkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKKwkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKIAkJamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKIAkJamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTmFtZWRRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQkKLQkJZW50aXR5LnJlbW92ZU5hbWVkUXVlcnkoMCk7CisJCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7CiAJCWphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhTmFtZWRRdWVyaWVzKSk7CiAJfQpAQCAtMjU1NSwxNzcgKzI3OTEsMTc5IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQllbnRpdHkuYWRkTmFtZWRRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKKwkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKIAkJCiAJCQogCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSwgSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKTsKIAkJbmF0aXZlUXVlcnkuc2V0TmFtZSgiQkFSIik7CiAJCQotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFOYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZFF1ZXJ5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCWVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOworCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwogCQkKIAkJCiAJCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSwgSlBBLk5BTUVEX1FVRVJJRVMpOwogCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkJBUiIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eS5uYW1lZFF1ZXJpZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkUXVlcmllc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxKYXZhTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWRRdWVyaWVzKCk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJZW50aXR5LmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eS5hZGROYW1lZFF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHkuYWRkTmFtZWRRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKKwkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKKwkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKKwkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxOYW1lZFF1ZXJ5QW5ub3RhdGlvbj4gamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwogCQkKIAkJCi0JCWVudGl0eS5tb3ZlTmFtZWRRdWVyeSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5uYW1lZFF1ZXJpZXMoKTsKKwkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubW92ZU5hbWVkUXVlcnkoMiwgMCk7CisJCUxpc3RJdGVyYXRvcjxKYXZhTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWRRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAKIAkJamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAogCi0JCWVudGl0eS5tb3ZlTmFtZWRRdWVyeSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkUXVlcmllcygpOworCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWRRdWVyeSgwLCAxKTsKKwkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWRRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAKIAkJamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVkUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOworCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLnF1ZXJpZXNTaXplKCkpOwogCQkKIAkJKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwogCQkoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7CiAJCSgoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJTGlzdEl0ZXJhdG9yPE5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5uYW1lZFF1ZXJpZXMoKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFOYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7CisJCWFzc2VydEVxdWFscygzLCBlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkucXVlcmllc1NpemUoKSk7CiAJCQotCQl0eXBlUmVzb3VyY2UubW92ZSgyLCAwLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5uYW1lZFF1ZXJpZXMoKTsKKwkJdHlwZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWRRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwogCQkKLQkJdHlwZVJlc291cmNlLm1vdmUoMCwgMSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCk7CisJCXR5cGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkUXVlcmllcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKIAkJCiAJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkUXVlcmllcygpOworCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5xdWVyaWVzU2l6ZSgpKTsKIAkJCiAJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkUXVlcmllcygpOworCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOworCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLnF1ZXJpZXNTaXplKCkpOwogCQkKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCk7CisJCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkUXVlcmllcygpOwogCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5xdWVyaWVzU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE5hbWVkUXVlcmllc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5Lm5hbWVkUXVlcmllc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXNTaXplKCkpOwogCiAJCSgoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWRRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKIAkJKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwogCQkoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7CiAJCQotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5Lm5hbWVkUXVlcmllc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygzLCBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXNTaXplKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKIAkJbmFtZWROYXRpdmVRdWVyeS5zZXROYW1lKCJGT08iKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbj4gamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkyID0gZW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7CisJCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeTIgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwogCQluYW1lZE5hdGl2ZVF1ZXJ5Mi5zZXROYW1lKCJCQVIiKTsKIAkJCiAJCWphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQkKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5MyA9IGVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpOworCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgxKTsKIAkJbmFtZWROYXRpdmVRdWVyeTMuc2V0TmFtZSgiQkFaIik7CiAJCQogCQlqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPE5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFOYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKG5hbWVkTmF0aXZlUXVlcnkyLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKG5hbWVkTmF0aXZlUXVlcnkzLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKG5hbWVkTmF0aXZlUXVlcnksIG5hbWVkUXVlcmllcy5uZXh0KCkpOwogCQkKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpOworCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKQEAgLTI3MzUsMzAgKzI5NzMsMzAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCWVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7CisJCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7CisJCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7CisJCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7CiAJCQotCQlMaXN0SXRlcmF0b3I8TmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24+IGphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKIAkJCi0JCWVudGl0eS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOworCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOwogCQlqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwogCQlqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAotCQllbnRpdHkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKIAkJamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKIAkJamF2YU5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQkKLQkJZW50aXR5LnJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoMCk7CisJCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoMCk7CiAJCWphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhTmFtZWRRdWVyaWVzKSk7CiAJfQpAQCAtMjc2NywxMjkgKzMwMDUsMTI4IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQllbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOworCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOworCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOworCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uPiBqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFOYW1lZFF1ZXJpZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhTmFtZWRRdWVyaWVzKSk7CiAJCQotCQkKLQkJZW50aXR5Lm1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8TmFtZWROYXRpdmVRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpOworCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWROYXRpdmVRdWVyeSgyLCAwKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFOYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAogCQlqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCiAKLQkJZW50aXR5Lm1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDAsIDEpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7CisJCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDAsIDEpOworCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAogCQlqYXZhTmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZWROYXRpdmVRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7CisJCWFzc2VydEVxdWFscygwLCBlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkucXVlcmllc1NpemUoKSk7CiAJCQogCQkoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7CiAJCSgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKIAkJKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwkKLQkJTGlzdEl0ZXJhdG9yPE5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFOYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7CisJCWFzc2VydEVxdWFscygzLCBlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkucXVlcmllc1NpemUoKSk7CiAJCQotCQl0eXBlUmVzb3VyY2UubW92ZSgyLCAwLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKKwkJdHlwZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwogCQkKLQkJdHlwZVJlc291cmNlLm1vdmUoMCwgMSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7CisJCXR5cGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkTmF0aXZlUXVlcmllcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKIAkJCiAJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpOworCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5xdWVyaWVzU2l6ZSgpKTsKIAkJCiAJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpOworCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOworCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLnF1ZXJpZXNTaXplKCkpOwogCQkKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7CisJCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkTmF0aXZlUXVlcmllcygpOwogCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5xdWVyaWVzU2l6ZSgpKTsKIAl9CQogCQogCXB1YmxpYyB2b2lkIHRlc3ROYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpKTsKIAogCQkoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7CiAJCSgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKIAkJKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRJZENsYXNzKCkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzKCkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQkKIAkJSWRDbGFzc0Fubm90YXRpb24gaWRDbGFzcyA9IChJZENsYXNzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldElkQ2xhc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3MoKSk7CiAJCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCQogCQlpZENsYXNzLnNldFZhbHVlKCJtb2RlbC5Gb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBqYXZhRW50aXR5KCkuZ2V0SWRDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzcygpKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCAoKElkQ2xhc3NBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5nZXRWYWx1ZSgpKTsKIAkJCiAJCS8vdGVzdCBzZXR0aW5nICBASWRDbGFzcyB2YWx1ZSB0byBudWxsLCBJZENsYXNzIGFubm90YXRpb24gaXMgcmVtb3ZlZAogCQlpZENsYXNzLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRJZENsYXNzKCkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzKCkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQkKIAkJLy9yZXNldCBASWRDbGFzcyB2YWx1ZSBhbmQgdGhlbiByZW1vdmUgQElkQ2xhc3MKQEAgLTI4OTcsNyArMzEzNCw3IEBACiAJCWlkQ2xhc3Muc2V0VmFsdWUoIm1vZGVsLkZvbyIpOwogCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0SWRDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzcygpKTsKIAkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsJCQogCX0KIAkKQEAgLTI5MDUsMTcgKzMxNDIsMTcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0SWRDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzcygpKTsKIAkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJCQotCQlqYXZhRW50aXR5KCkuc2V0SWRDbGFzcygibW9kZWwuRm9vIik7CisJCWdldEphdmFFbnRpdHkoKS5zZXRJZENsYXNzKCJtb2RlbC5Gb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCAoKElkQ2xhc3NBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBqYXZhRW50aXR5KCkuZ2V0SWRDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzcygpKTsKIAkJCi0JCWphdmFFbnRpdHkoKS5zZXRJZENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRJZENsYXNzKCkpOworCQlnZXRKYXZhRW50aXR5KCkuc2V0SWRDbGFzcyhudWxsKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzcygpKTsKIAkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAJCkBAIC0yOTI1LDIwICszMTYyLDIwIEBACiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJSXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQlJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CiAJCUphdmFQZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CiAJCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCUphdmFQZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwogCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkpOwotCi0JCW1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBqYXZhRW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkpOwogCQkKIAkJKChKYXZhSWRNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9JRCIpOwogCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgamF2YUVudGl0eS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpKTsKIAkJCi0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSBqYXZhRW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCUphdmFBdHRyaWJ1dGVPdmVycmlkZSBqYXZhQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQkKIAkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlID0gKEphdmFBdHRyaWJ1dGVPdmVycmlkZSkgamF2YUF0dHJpYnV0ZU92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOwpAQCAtMjk0NiwxNSArMzE4Myw3OCBAQAogCQlhc3NlcnRFcXVhbHMoIklEIiwgamF2YUVudGl0eS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpKTsKIAl9CiAJCi0JcHVibGljIHZvaWQgdGVzdERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZENvbmNyZXRlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWRDb25jcmV0ZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydFRydWUoamF2YUVudGl0eSgpLmlzRGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRKYXZhRW50aXR5KCkuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSk7CisJCQorCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFzc2VydEZhbHNlKGdldEphdmFFbnRpdHkoKS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKIAl9CiAJCi0JcHVibGljIHZvaWQgdGVzdERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZEFic3RyYWN0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWRBYnN0cmFjdENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUVudGl0eSgpLmlzRGlzY3JpbWluYXRvclZhbHVlQWxsb3dlZCgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRKYXZhRW50aXR5KCkuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSk7CisJCQorCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFzc2VydFRydWUoZ2V0SmF2YUVudGl0eSgpLmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCUVudGl0eSBjb25jcmV0ZUVudGl0eSA9IChFbnRpdHkpIHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgY29uY3JldGVFbnRpdHkuZ2V0TmFtZSgpKTsKKwkJCisJCUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChFbnRpdHkpIHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBhYnN0cmFjdEVudGl0eS5nZXROYW1lKCkpOworCisJCS8vdGFibGUtcGVyLWNsYXNzLCBubyBkaXNjcmltaW5hdG9yIGNvbHVtbiBhbGxvd2VkCisJCWFzc2VydEZhbHNlKGNvbmNyZXRlRW50aXR5LnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7CisJCWFzc2VydEZhbHNlKGFic3RyYWN0RW50aXR5LnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7CisKKwkJCisJCS8vc2luZ2xlLXRhYmxlLCBkaXNjcmltaW5hdG9yIGNvbHVtbiBhbGxvd2VkIG9uIHJvb3QgZW50aXR5CisJCWFic3RyYWN0RW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kobnVsbCk7CisJCWFzc2VydEZhbHNlKGNvbmNyZXRlRW50aXR5LnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7CisJCWFzc2VydFRydWUoYWJzdHJhY3RFbnRpdHkuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFic3RyYWN0RW50aXR5R2V0RGVmYXVsdERpc2NyaW1pbmF0b3JDb2x1bW5OYW1lVGFibGVQZXJDbGFzc0luaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZUFic3RyYWN0VGVzdEVudGl0eSgpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCUVudGl0eSBjb25jcmV0ZUVudGl0eSA9IChFbnRpdHkpIHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgY29uY3JldGVFbnRpdHkuZ2V0TmFtZSgpKTsKKwkJCisJCUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChFbnRpdHkpIHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBhYnN0cmFjdEVudGl0eS5nZXROYW1lKCkpOworCQkKKwkJCisJCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBhYnN0cmFjdEVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGNvbmNyZXRlRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQkKKwkJCisJCWFzc2VydFRydWUoYWJzdHJhY3RFbnRpdHkuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSk7CisJCWFzc2VydEZhbHNlKGNvbmNyZXRlRW50aXR5LnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb25jcmV0ZUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCQorCQlhc3NlcnRUcnVlKGFic3RyYWN0RW50aXR5LmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb25jcmV0ZUVudGl0eS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRlZFZhbHVlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFHZW5lcmF0ZWRWYWx1ZVRlc3RzLmphdmEKaW5kZXggMjFlMDNlYS4uNzRiZTliOCAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRlZFZhbHVlVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhR2VuZXJhdGVkVmFsdWVUZXN0cy5qYXZhCkBAIC0yNSwyMSArMjUsOCBAQAogcHVibGljIGNsYXNzIEphdmFHZW5lcmF0ZWRWYWx1ZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SID0gIk1ZX0dFTkVSQVRPUiI7Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkdlbmVyYXRlZFZhbHVlIiwgCi0JCQkiR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0OyIgKwotCQkJIlN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0IFwiXCI7ICIpOwkJCi0JfQogCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24oKTsKLQkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmF0ZWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNjYsMTIgKzUzLDEyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJhdGVkVmFsdWUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUiwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0R2VuZXJhdG9yKCkpOwogCiAJCS8vY2hhbmdlIHJlc291cmNlIG1vZGVsIHNlcXVlbmNlR2VuZXJhdG9yIG5hbWUsIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwogCQkKIAkJZ2VuZXJhdGVkVmFsdWUuc2V0R2VuZXJhdG9yKCJmb28iKTsKQEAgLTgzLDE1ICs3MCwxNSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyYXRlZFZhbHVlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEVxdWFscyhHRU5FUkFUT1IsIGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldEdlbmVyYXRvcigpKTsKIAogCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5zZXRTcGVjaWZpZWRHZW5lcmF0b3IoImZvbyIpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5nZXRHZW5lcmF0b3IoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKTsKIAkJCiAJCWFzc2VydEVxdWFscygiZm9vIiwgZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCkpOwpAQCAtMTAxLDE1ICs4OCwxNSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyYXRlZFZhbHVlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEVxdWFscyhHRU5FUkFUT1IsIGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldEdlbmVyYXRvcigpKTsKIAogCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5zZXRTcGVjaWZpZWRHZW5lcmF0b3IobnVsbCk7CiAJCQogCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwogCQkKIAkJYXNzZXJ0Tm90TnVsbChnZW5lcmF0ZWRWYWx1ZSk7CkBAIC0xMTksMTIgKzEwNiwxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyYXRlZFZhbHVlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEVxdWFscyhHZW5lcmF0ZWRWYWx1ZS5ERUZBVUxUX1NUUkFURUdZLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5nZXRTdHJhdGVneSgpKTsKIAogCQkvL2NoYW5nZSByZXNvdXJjZSBtb2RlbCBzZXF1ZW5jZUdlbmVyYXRvciBuYW1lLCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKTsKIAkJCiAJCWdlbmVyYXRlZFZhbHVlLnNldFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuSURFTlRJVFkpOwpAQCAtMTM3LDE1ICsxMjQsMTUgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmF0ZWRWYWx1ZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGVkVmFsdWUuREVGQVVMVF9TVFJBVEVHWSwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3RyYXRlZ3koKSk7CiAKIAkJaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuc2V0U3BlY2lmaWVkU3RyYXRlZ3koR2VuZXJhdGlvblR5cGUuSURFTlRJVFkpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRpb25UeXBlLklERU5USVRZLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5nZXRTdHJhdGVneSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuSURFTlRJVFksIGdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSWRNYXBwaW5nVGVzdHMuamF2YQppbmRleCBlZDExYzg2Li5lNTY0MmY1IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSWRNYXBwaW5nVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSWRNYXBwaW5nVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw2ICsxMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwpAQCAtMjEsNiArMjIsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKQEAgLTQzLDMxICs0NSwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBKYXZhSWRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVJZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiR2VuZXJhdGVkVmFsdWUiLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlbXBvcmFsQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRlbXBvcmFsIiwgIlRlbXBvcmFsVHlwZSB2YWx1ZSgpOyIpOwkJCi0JfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTg2LDkgKzcwLDYgQEAKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVRlbXBvcmFsQW5ub3RhdGlvbigpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMDcsMTEgKzg4LDcgQEAKIAkJfSk7CiAJfQogCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZ0dlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbigpOwotCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZ0dlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMzgsMjQgKzExNSwyNSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQlpZE1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CiAJCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtMTY3LDIzICsxNDUsMjQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJaWRNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKTsKKwkJKChUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwogCQlpZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJaWRNYXBwaW5nLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWlkTWFwcGluZy5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CiAJCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CkBAIC0xOTUsMjQgKzE3NCwyNSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQlpZE1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CiAJCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpICgoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtMjI0LDIzICsyMDQsMjQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJaWRNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKTsKKwkJKChUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwogCQlpZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJaWRNYXBwaW5nLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWlkTWFwcGluZy5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CiAJCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKQEAgLTI1MiwyMyArMjMzLDI0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7CisJCWlkTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwogCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtMjgwLDIzICsyNjIsMjQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJaWRNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKTsKKwkJKChUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwogCQlpZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJaWRNYXBwaW5nLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWlkTWFwcGluZy5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CiAJCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKQEAgLTMwOCwyMyArMjkxLDI0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7CisJCWlkTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwogCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKQEAgLTMzNiwyMyArMzIwLDI0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7CisJCWlkTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwogCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CkBAIC0zNjQsMjMgKzM0OSwyNCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQlpZE1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CiAJCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtMzkyLDY3ICszNzgsNTkgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJaWRNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKTsKKwkJKChUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwogCQlpZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJaWRNYXBwaW5nLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWlkTWFwcGluZy5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CiAJCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwotCX0KIAkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGVtcG9yYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGVtcG9yYWwoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CiAKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIGlkTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RTZXRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKIAkJCi0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7CisJCWlkTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwgPSAoVGVtcG9yYWxBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUUsIHRlbXBvcmFsLmdldFZhbHVlKCkpOwogCQkKLQkJaWRNYXBwaW5nLnNldFRlbXBvcmFsKG51bGwpOworCQlpZE1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKG51bGwpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTQ2MCwyMiArNDM4LDIyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwogCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CiAJCQogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCXRlbXBvcmFsLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLkRBVEUpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCBpZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7CiAJCQogCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJYXNzZXJ0U2FtZShpZE1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKIAl9CkBAIC00ODQsMTQgKzQ2MiwxNCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwogCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7CiAJCQpAQCAtNTA0LDQyICs0ODIsNDIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoaWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOworCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0Tm90TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CisJCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9uc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBpZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAJCQotCQlpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0TmFtZSgiZm9vIik7CisJCWFzc2VydEVxdWFscygxLCBpZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGRTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKIAkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKIAkJCi0JCWlkTWFwcGluZy5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUikpOwotCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0Tm90TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CiAJCQogCQkvL3RyeSBhZGRpbmcgYW5vdGhlciBzZXF1ZW5jZSBnZW5lcmF0b3IsIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCiAJCXRyeSB7Ci0JCQkJaWRNYXBwaW5nLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CiAJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTU1MCwyMiArNTI4LDIyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwogCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwogCQkKIAkJCi0JCWlkTWFwcGluZy5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpKTsKIAogCQkvL3RyeSByZW1vdmluZyB0aGUgc2VxdWVuY2UgZ2VuZXJhdG9yIGFnYWluLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgogCQl0cnkgewotCQkJaWRNYXBwaW5nLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7CQkKKwkJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOwkJCiAJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTU3Niw0MiArNTU0LDQyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CisJCWFzc2VydEVxdWFscygwLCBpZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0Tm90TnVsbChpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0Tm90TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CQkKKwkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoaWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXROYW1lKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEFkZFRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwogCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CisJCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwogCQkKLQkJaWRNYXBwaW5nLmFkZFRhYmxlR2VuZXJhdG9yKCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKIAkJCiAJCS8vdHJ5IGFkZGluZyBhbm90aGVyIHRhYmxlIGdlbmVyYXRvciwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KIAkJdHJ5IHsKLQkJCWlkTWFwcGluZy5hZGRUYWJsZUdlbmVyYXRvcigpOwkJCisJCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsJCQogCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewogCQkJcmV0dXJuOwogCQl9CkBAIC02MjIsMjIgKzYwMCwyMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKIAkJCiAJCQotCQlpZE1hcHBpbmcucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLnJlbW92ZVRhYmxlR2VuZXJhdG9yKCk7CiAJCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKSk7CiAJCQogCQkvL3RyeSByZW1vdmluZyB0aGUgdGFibGUgZ2VuZXJhdG9yIGFnYWluLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgogCQl0cnkgewotCQkJaWRNYXBwaW5nLnJlbW92ZVRhYmxlR2VuZXJhdG9yKCk7CQkKKwkJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwkJCiAJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTY0OCw0NiArNjI2LDQ2IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwogCQkKIAkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKTsKIAkJCiAJCWFzc2VydE5vdE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwkJCi0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9uc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9uc1NpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXRHZW5lcmF0ZWRWYWx1ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nR2VuZXJhdGVkVmFsdWUoKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCiAJCWFzc2VydE5vdE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnNTaXplKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkR2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKIAkJCiAJCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKSk7CiAJCWFzc2VydE5vdE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwpAQCAtNzA1LDExICs2ODMsMTEgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7CiAJCQogCQkKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uVGVzdHMuamF2YQppbmRleCA4ZTNiOTg5Li4zNTZhN2RmIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSm9pbkNvbHVtblRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUpvaW5Db2x1bW5UZXN0cy5qYXZhCkBAIC0xMiw2ICsxMiw3IEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CkBAIC0yNiwzMyArMjcsOCBAQAogCXB1YmxpYyBKYXZhSm9pbkNvbHVtblRlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwogCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlT25lVG9PbmVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9PbmUiLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJImJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsgIiArCi0JCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsgIiArCi0JCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyAiICsKLQkJCSJib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsgIiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkJCiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU9uZVRvT25lQW5ub3RhdGlvbigpOwotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNzAsMTAgKzQ2LDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU9uZVRvT25lQW5ub3RhdGlvbigpOwotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTIwLDI3ICs5MiwyOCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCiAJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMCwgb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKIAkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbik7CiAJCQogCQkKIAkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKIAkJamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJamF2YUpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7CQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luQ29sdW1uLmdldE5hbWUoKSk7CiAJCiAJCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGFubm90YXRpb24gcmVtb3ZlZCwgc3BlY2lmaWVkIGpvaW4gY29sdW1uIHJlbW92ZWQKIAkJamF2YUpvaW5Db2x1bW4uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAJCkBAIC0xNDgsMTIgKzEyMSwxNCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCiAJCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKIAkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKQEAgLTE3NSw4ICsxNTAsOSBAQAogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCiAJCQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5Db2x1bW4gZGVmYXVsdEphdmFKb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmdldERlZmF1bHRKb2luQ29sdW1uKCk7CisJCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCUphdmFKb2luQ29sdW1uIGRlZmF1bHRKYXZhSm9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLmdldERlZmF1bHRKb2luQ29sdW1uKCk7CiAJCQogLy8JCWFzc2VydE51bGwoZGVmYXVsdEphdmFKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwogLy9UT0RPIHRlc3QgZGVmYXVsdCBqb2luIGNvbHVtbiBuYW1lCkBAIC0yMTQsMTQgKzE5MCwxNSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCiAJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMCwgb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKIAkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbik7CiAJCQogCQkKQEAgLTIyOSw3ICsyMDYsNyBAQAogCQlqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlqYXZhSm9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsJCiAJCWphdmFKb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKKwkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CiAJCkBAIC0yNDMsMTIgKzIyMCwxMyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KKwkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKIAkJCi0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJCisJCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQkvL3NldCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiQkFSIik7CkBAIC0yNzIsMTQgKzI1MCwxNSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCiAJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMCwgb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKIAkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbik7CiAJCQogCQkKQEAgLTI4Nyw3ICsyNjYsNyBAQAogCQlqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlqYXZhSm9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsJCiAJCWphdmFKb2luQ29sdW1uLnNldFRhYmxlKCJCQVIiKTsKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKKwkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7CiAJCkBAIC0zMDEsMTIgKzI4MCwxNCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCiAJCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQkvL3NldCB0YWJsZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCiAJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7CiAJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwpAQCAtMzMwLDE0ICszMTEsMTUgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQogCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7CiAJCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4pOwogCQkKIAkJCkBAIC0zNDUsNyArMzI3LDcgQEAKIAkJamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJamF2YUpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7CQogCQlqYXZhSm9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKKwkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgamF2YUpvaW5Db2x1bW4uZ2V0VW5pcXVlKCkpOwogCQpAQCAtMzU5LDEyICszNDEsMTQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAogCQkKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJLy9zZXQgdW5pcXVlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKQEAgLTM4MywxNCArMzY3LDE1IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkKIAkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscygwLCBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgam9pbkNvbHVtbnMuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwogCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uKTsKIAkJCiAJCQpAQCAtMzk4LDcgKzM4Myw3IEBACiAJCWphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWphdmFKb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwkKIAkJamF2YUpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqYXZhSm9pbkNvbHVtbi5nZXROdWxsYWJsZSgpKTsKIAkKQEAgLTQxMiwxMiArMzk3LDE0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAKIAkJCi0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCS8vc2V0IG51bGxhYmxlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKQEAgLTQzNiwxNCArNDIzLDE1IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkKIAkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscygwLCBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgam9pbkNvbHVtbnMuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwogCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uKTsKIAkJCiAJCQpAQCAtNDUxLDcgKzQzOSw3IEBACiAJCWphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWphdmFKb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwkKIAkJamF2YUpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKKwkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgamF2YUpvaW5Db2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKIAkKQEAgLTQ2NSwxMiArNDUzLDE0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUphdmFKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAKIAkJCi0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCS8vc2V0IGluc2VydGFibGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CkBAIC00ODksMTQgKzQ3OSwxNSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCiAJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMCwgb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKIAkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbik7CiAJCQogCQkKQEAgLTUwNCw3ICs0OTUsNyBAQAogCQlqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlqYXZhSm9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsJCiAJCWphdmFKb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKKwkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqYXZhSm9pbkNvbHVtbi5nZXRVcGRhdGFibGUoKSk7CiAJCkBAIC01MTgsMTIgKzUwOSwxNCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCiAJCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQkvL3NldCB1cGRhdGFibGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKQEAgLTUzNyw0ICs1MzAsNCBAQAogCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwogCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uLmdldFVwZGF0YWJsZSgpKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSm9pblRhYmxlVGVzdHMuamF2YQppbmRleCBmMjc3NmM1Li45NjY1MDYzIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSm9pblRhYmxlVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSm9pblRhYmxlVGVzdHMuamF2YQpAQCAtMzEsMzMgKzMxLDggQEAKIAlwdWJsaWMgSmF2YUpvaW5UYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwogCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTWFueVRvTWFueUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9NYW55IiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVKb2luVGFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJLy9UT0RPCi0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5UYWJsZSIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJVbmlxdWVDb25zdHJhaW50IiwgCi0JCQkiU3RyaW5nW10gY29sdW1uTmFtZXMoKTsgIik7CQkKLQl9CiAKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvTWFueUFubm90YXRpb24oKTsKLQkJY3JlYXRlSm9pblRhYmxlQW5ub3RhdGlvbigpOwotCQkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNzUsMTAgKzUwLDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvTWFueUFubm90YXRpb24oKTsKLQkJY3JlYXRlSm9pblRhYmxlQW5ub3RhdGlvbigpOwotCQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTI0LDExICs5NSwxMSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKKwkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQogCQlKb2luVGFibGVBbm5vdGF0aW9uIGphdmFKb2luVGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQpAQCAtMTYxLDExICsxMzIsMTEgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOworCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCiAJCUpvaW5UYWJsZUFubm90YXRpb24gamF2YUpvaW5UYWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCkBAIC0xODksOCArMTYwLDggQEAKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQogCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKKwkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJCiAJCS8vam9pblRhYmxlIGRlZmF1bHQgbmFtZSBpcyBudWxsIGJlY2F1c2UgdGFyZ2V0RW50aXR5IGlzIG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAogCQlhc3NlcnROdWxsKGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKQEAgLTIwMCw4ICsxNzEsOCBAQAogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb2plY3QiKTsKIAkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfUHJvamVjdCIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkKIAkJLy90YXJnZXQgZW50aXR5IGRvZXMgbm90IHJlc29sdmUsIGRlZmF1bHQgbmFtZSBpcyBudWxsCkBAIC0yMjIsNyArMTkzLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfRk9PIiwgam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwogCQkKIAkJLy9zZXQgYSB0YWJsZSBvbiB0aGUgb3duaW5nIGVudGl0eSwgdmVyeSBkZWZhdWx0IGpvaW4gdGFibGUgbmFtZSB1cGRhdGVzCi0JCWphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwogCX0KIApAQCAtMjMwLDExICsyMDEsMTEgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CisJCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkKIAkJSm9pblRhYmxlQW5ub3RhdGlvbiBqYXZhSm9pblRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKQEAgLTI2NywxMSArMjM4LDExIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKKwkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQogCQlKb2luVGFibGVBbm5vdGF0aW9uIGphdmFKb2luVGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQpAQCAtMjk0LDExICsyNjUsMTEgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CisJCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkKIAkJSm9pblRhYmxlQW5ub3RhdGlvbiBqYXZhSm9pblRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKQEAgLTMzMSwxMSArMzAyLDExIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKKwkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQogCQlKb2luVGFibGVBbm5vdGF0aW9uIGphdmFKb2luVGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQpAQCAtMzU4LDExICszMjksMTEgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CisJCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkKIAkJCiAJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwpAQCAtNDAwLDExICszNzEsMTEgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CisJCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAogCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJam9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CkBAIC00MzAsMTEgKzQwMSwxMSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKKwkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCiAJCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKQEAgLTQ3MCwxMSArNDQxLDExIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOworCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCiAJCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCkBAIC01MjksOSArNTAwLDkgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQorCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOworCQkKIAkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7CiAJCQogCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKQEAgLTU0NSw5ICs1MTYsOSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCisJCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CisJCQogCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKIAkJCiAJCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwpAQCAtNTYwLDIwICs1MzEsMjAgQEAKIAkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuam9pbkNvbHVtbnNTaXplKCkpOwogCQkKLQkJLy9pZiBub24tb3duaW5nIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCB0aGVuIG5vIGRlZmF1bHQgam9pbiBjb2x1bW4KLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwcGVkQnkoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMCwgam9pblRhYmxlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJLy9pZiBub24tb3duaW5nIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCB0aGVuIG5vIGRlZmF1bHQgam9pbiB0YWJsZQorCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJmb28iKTsKKwkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKKwkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQogCQkKIAkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKQEAgLTYxMSwxMSArNTgyLDExIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOworCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAKIAkJam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CkBAIC02NDEsMTEgKzYxMiwxMSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKKwkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCiAJCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwpAQCAtNjgxLDExICs2NTIsMTEgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CisJCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkKIAkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkKQEAgLTc0MCw5ICs3MTEsOSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCisJCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CisJCQogCQlhc3NlcnRFcXVhbHMoMCwgam9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7CiAJCQogCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7CkBAIC03NTYsOSArNzI3LDkgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQorCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOworCQkKIAkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwogCQkKIAkJam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwpAQCAtNzcxLDIzICs3NDIsMjMgQEAKIAkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwogCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7CiAJCQotCQkvL2lmIG5vbi1vd25pbmcgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIHRoZW4gbm8gZGVmYXVsdCBqb2luIGNvbHVtbgotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygwLCBqb2luVGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJLy9pZiBub24tb3duaW5nIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCB0aGVuIG5vIGRlZmF1bHQgam9pbiB0YWJsZQorCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJmb28iKTsKKwkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSAoKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkpLmdldEpvaW5UYWJsZSgpOwotCisJCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CisJCQogCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7CiAJCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImZvbyIpOwogCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7CkBAIC04MDAsMTYgKzc3MSwxNiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSAoKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkpLmdldEpvaW5UYWJsZSgpOwotCisJCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CisJCQogCQlhc3NlcnRFcXVhbHMoMCwgIGpvaW5UYWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImZvbyIpOwogCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7CkBAIC04MTgsMTcgKzc4OSwxNyBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSAoKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkpLmdldEpvaW5UYWJsZSgpOworCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwogCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKIAkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7CiAJCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKIAkJCkBAIC04MzksMTcgKzgxMCwxNyBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9ICgoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKSkuZ2V0Sm9pblRhYmxlKCk7CisJCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOworCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CiAJCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwogCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKIAkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwogCQkKQEAgLTg2MCwxNyArODMxLDE3IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSAoKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkpLmdldEpvaW5UYWJsZSgpOworCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwogCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKIAkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7CiAJCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKQEAgLTkwNiwxNyArODc3LDE3IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlKb2luVGFibGUgam9pblRhYmxlID0gKChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpKS5nZXRKb2luVGFibGUoKTsKKwkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7CiAJCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwogCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CkBAIC05NDcsMTMgKzkxOCwxMyBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSAoKEphdmFNYW55VG9NYW55TWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkpLmdldEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKEpvaW5UYWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQogCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YQppbmRleCA5NjFjMDI5Li5mZmRkNjg4IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKQEAgLTEzLDYgKzEzLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7CkBAIC00OCwxNyArNDksMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTWFueVRvTWFueUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9NYW55IiwgIiIpOwkJCi0JfQotCiAJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewogCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewpAQCAtNzEsNiArNjUsMTAgQEAKIAkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7CiAJCQkJCXNiLmFwcGVuZCgiOyIpOwogCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOwogCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwogCQkJCXNiLmFwcGVuZChDUik7CiAJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7CkBAIC04MSw3ICs3OSw4IEBACiAJCQkJc2IuYXBwZW5kKENSKTsKIAkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7CiAJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwogCQkJCXNiLmFwcGVuZChDUik7CiAJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7CiAJCQkJc2IuYXBwZW5kKENSKTsKQEAgLTkwLDExICs4OSwzMSBAQAogCQl9OwogCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwogCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvTWFueUFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTEzLDkgKzEzMiw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVNYW55VG9NYW55QW5ub3RhdGlvbigpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMzcsOSArMTUzLDYgQEAKIAkJfSk7CiAJfQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbGxlY3Rpb25NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU1hbnlUb01hbnlBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTE2MSw5ICsxNzQsNiBAQAogCQl9KTsKIAl9CiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uQ29sbGVjdGlvbk1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvTWFueUFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTg1LDYgKzE5NSw1NiBAQAogCQl9KTsKIAl9CiAKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdERlcGFydG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLk1hcDsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5NQU5ZX1RPX01BTlkpLmFwcGVuZCgiOyIpOworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJEZXBhcnRtZW50IikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBFbXBsb3llZT4gZW1wbG95ZWVzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkRlcGFydG1lbnQuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbXBsb3llZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkVtcGxveWVlIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgZW1wSWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW1wbG95ZWUuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCiAJcHVibGljIEphdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwogCX0KQEAgLTE5MywyMCArMjUzLDIwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CiAJCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQpAQCAtMjE1LDE5ICsyNzUsMTkgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOworCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KQEAgLTIzNiwyMCArMjk2LDIwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CiAJCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7CiAJCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CkBAIC0yNTgsMjAgKzMxOCwyMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7CisJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7CiAJCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KQEAgLTI4MCwyMCArMzQwLDIwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CiAJCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQpAQCAtMzAyLDIwICszNjIsMjAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOworCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7CiAJCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CkBAIC0zMjQsMjAgKzM4NCwyMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7CisJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CkBAIC0zNDYsMjAgKzQwNiwyMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7CisJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQpAQCAtMzY4LDIwICs0MjgsMjAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOworCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CkBAIC0zOTAsMjAgKzQ1MCwyMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7CisJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KQEAgLTQxMiwxMiArNDcyLDEyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKIAkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7CiAJCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7CkBAIC00MzcsMTIgKzQ5NywxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwpAQCAtNDYyLDEyICs1MjIsMTIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7CkBAIC00OTIsMTIgKzU1MiwxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CiAJCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRGZXRjaCgpKTsKQEAgLTUwNiwxMSArNTY2LDEwIEBACiAJCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIsIG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCisJCQogCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CiAJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBtYW55VG9NYW55LmdldEZldGNoKCkpOwotCiAJCQogCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCiAJCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwpAQCAtNTIyLDI0ICs1ODEsMjQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKIAkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCisJCS8vc2V0IG1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQltYW55VG9NYW55LnNldE1hcHBlZEJ5KCJuZXdNYXBwZWRCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7CisJCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwogCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5IiwgbWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKIAkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKKwkJLy9zZXQgbWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKIAkJbWFueVRvTWFueS5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKKwkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7CiAJfQogCQpAQCAtNTQ3LDI0ICs2MDYsMjQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKIAkJCQkKIAkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE1hcHBlZEJ5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibmV3VGFyZ2V0RW50aXR5Iik7CisJCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwogCQogCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKG51bGwpOworCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKIAl9CiAKQEAgLTU3MiwxMyArNjMxLDE2IEBACiAJcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7CiAJCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAKLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IG1hbnlUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAorCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKQEAgLTU4NiwxNiArNjQ4LDIxIEBACiAJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CiAJCQogCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IG1hbnlUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkJYXR0cmlidXRlTmFtZXMgPSAKKwkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwogCQkKIAkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IG1hbnlUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkJYXR0cmlidXRlTmFtZXMgPSAKKwkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwogCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKworCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOworCQlhc3NlcnROdWxsKHN0YXRlRm9vTWFwcGluZyk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTYwMyw3ICs2NzAsNyBAQAogCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAogCQkvL3RhcmdldEVudGl0eSBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIGRlZmF1bHQgc3RpbGwgc2V0LCBoYW5kbGVkIGJ5IHZhbGlkYXRpb24KQEAgLTYxNyw3ICs2ODQsNyBAQAogCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwogCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CiAJCWNsYXNzUmVmcy5uZXh0KCk7CiAJCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7CiAJCUphdmFQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CkBAIC02MzMsNyArNzAwLDcgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwogCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwpAQCAtNjQ1LDcgKzcxMiw3IEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKIAkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCiAJCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKQEAgLTY1Niw3ICs3MjMsNyBAQAogCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAogCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwpAQCAtNjcyLDcgKzczOSw3IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAogCQkvL3RhcmdldEVudGl0eSBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKQEAgLTY4MSw3ICs3NDgsNyBAQAogCQkvL2FkZCB0YXJnZXRFbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyB0YXJnZXQgZW50aXR5IHNob3VsZCByZXNvbHZlCiAJCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7CiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwogCQljbGFzc1JlZnMubmV4dCgpOwogCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwogCQlUeXBlTWFwcGluZyBhZGRyZXNzVHlwZU1hcHBpbmcgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwpAQCAtNzA1LDM0ICs3NzIsMzQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7CisJCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJCiAJCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQogCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7CisJCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwogCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0Tm90TnVsbChtYXBLZXkpOwogCQkJCQogCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKIAkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7CisJCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7CiAJCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYXBLZXkuZ2V0TmFtZSgpKTsKIAkJCiAJCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCiAJCW1hcEtleS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKKwkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7CiAJCWFzc2VydE51bGwobWFwS2V5LmdldE5hbWUoKSk7CiAJCQogCQltYXBLZXkuc2V0TmFtZSgibXlNYXBLZXkiKTsKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOworCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQpAQCAtNzQwLDI0ICs4MDcsMjQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7CisJCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJCQkJCiAJCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleSgibXlNYXBLZXkiKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJteU1hcEtleSIpOwogCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleS5nZXROYW1lKCkpOwogCQogCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOworCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7CisJCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAKQEAgLTc2NSwyNSArODMyLDI1IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKKwkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCQkJCiAJCS8vc2V0IG9yZGVyQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCiAJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7CisJCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7CiAJCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9yZGVyQnkuZ2V0VmFsdWUoKSk7CiAJCiAJCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7CisJCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTc5MSwyNCArODU4LDI0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKKwkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCQkJCiAJCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJuZXdPcmRlckJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7CisJCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkoIm5ld09yZGVyQnkiKTsKKwkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKIAkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcmRlckJ5LmdldFZhbHVlKCkpOwogCQogCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeShudWxsKTsKKwkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQpAQCAtODE2LDExICs4ODMsMTEgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQkKIAkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55TWFwcGluZy5pc05vT3JkZXJpbmcoKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKQEAgLTg0MywxMSArOTEwLDExIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJCiAJCWFzc2VydFRydWUobWFueVRvTWFueU1hcHBpbmcuaXNOb09yZGVyaW5nKCkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CkBAIC04NjksMTEgKzkzNiwxMSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCQogCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc1BrT3JkZXJpbmcoKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKQEAgLTg5NiwxMSArOTYzLDExIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJCiAJCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzQ3VzdG9tT3JkZXJpbmcoKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKQEAgLTkxOCw1ICs5ODUsMTUgQEAKIAkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNDdXN0b21PcmRlcmluZygpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KLQorCQorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0RW50aXR5Rm9yTWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbXBsb3llZSgpOworCQljcmVhdGVUZXN0RGVwYXJ0bWVudCgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkRlcGFydG1lbnQiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIpOworCQkKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlNYW55VG9NYW55TWFwcGluZyBlbXBsb3llZXNNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuRW1wbG95ZWUiLCBlbXBsb3llZXNNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKaW5kZXggYTc4ZmZlYi4uZmZjMTI5MyAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwpAQCAtMjYsNyArMjcsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKQEAgLTM0LDEzICszNCwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uc0Fubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKQEAgLTUwLDE3ICs1MCwxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTWFueVRvT25lQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hbnlUb09uZSIsICIiKTsJCQotCX0KLQogCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewogCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKQEAgLTk0LDkgKzg3LDYgQEAKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvT25lQW5ub3RhdGlvbigpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMTUsOSArMTA1LDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvT25lQW5ub3RhdGlvbigpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xNDAsOSArMTI3LDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sbGVjdGlvbk1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVNYW55VG9PbmVBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTE2NSw5ICsxNDksNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljaXplZENvbGxlY3Rpb25NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlTWFueVRvT25lQW5ub3RhdGlvbigpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xOTcsMTkgKzE3OCwyMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQpAQCAtMjE3LDE4ICsxOTksMTkgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQpAQCAtMjM2LDE5ICsyMTksMjAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQpAQCAtMjU2LDE5ICsyNDAsMjAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7CiAJCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTI3NiwxOSArMjYxLDIwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAJCkBAIC0yOTYsMTkgKzI4MiwyMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQpAQCAtMzE2LDE5ICszMDMsMjAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAJCkBAIC0zMzYsMTkgKzMyNCwyMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAJCkBAIC0zNTYsMTkgKzM0NSwyMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7CiAJCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQpAQCAtMzc2LDE5ICszNjYsMjAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7CiAJCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAJCkBAIC0zOTYsMTIgKzM4NywxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnROdWxsKG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7CkBAIC00MjEsMTIgKzQxMiwxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnROdWxsKG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7CkBAIC00MzUsNyArNDI2LDcgQEAKIAkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwogCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwogCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCisJCQogCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKIAkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7CiAJCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7CkBAIC00NDYsMTIgKzQzNywxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnROdWxsKG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCWFzc2VydE51bGwobWFueVRvT25lLmdldE9wdGlvbmFsKCkpOwpAQCAtNDYwLDExICs0NTEsMTAgQEAKIAkJbWFueVRvT25lLnNldE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkKKwkJCiAJCW1hbnlUb09uZS5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0KIAkJCiAJCS8vc2V0IG9wdGlvbmFsIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCiAJCW1hbnlUb09uZS5zZXRPcHRpb25hbChudWxsKTsKQEAgLTQ3NiwxMiArNDY2LDEyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKIAkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7CkBAIC01MDcsMjYgKzQ5NywyNyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwogCQkKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAogCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKIAkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwogCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCisJCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAKIAkJam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwogCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBUiIpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQorCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKQEAgLTUzNCwzNCArNTI1LDM0IEBACiAKIAkJam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwogCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBWiIpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQorCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAkKIAkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlKDEsIDAsIEpQQS5KT0lOX0NPTFVNTlMpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuSk9JTl9DT0xVTU5TKTsKKwkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwkJCiAJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQorCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAkKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQorCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAogCQkKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQorCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CQkKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAl9CiAJCkBAIC01NzMsMTIzICs1NjQsMTI4IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgbWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKIAkJCi0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgam9pbkNvbHVtbnMuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwogCQkKLQkJbWFueVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7CisJCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCWFzc2VydEVxdWFscygxLCBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7CisJCQorCQlqb2luQ29sdW1ucy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlhc3NlcnRFcXVhbHMoMCwgam9pbkNvbHVtbnMuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygxLCBtYW55VG9PbmVNYXBwaW5nLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgbWFueVRvT25lTWFwcGluZy5qb2luQ29sdW1uc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBqb2luQ29sdW1ucy5qb2luQ29sdW1uc1NpemUoKSk7CiAJCQotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBtYW55VG9PbmVNYXBwaW5nLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5Db2x1bW5zLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJCisJCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCWFzc2VydEVxdWFscygyLCBqb2luQ29sdW1ucy5qb2luQ29sdW1uc1NpemUoKSk7CiAKLQkJbWFueVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQltYW55VG9PbmVNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBtYW55VG9PbmVNYXBwaW5nLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJam9pbkNvbHVtbnMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJam9pbkNvbHVtbnMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5Db2x1bW5zLmpvaW5Db2x1bW5zU2l6ZSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7CiAJfQogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOworCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCiAJCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKSk7CiAKLQkJbWFueVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDEpOworCQlqb2luQ29sdW1ucy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwogCQkKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gam9pbkNvbHVtblJlc291cmNlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtblJlc291cmNlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwogCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKwkJSXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7CiAJCiAJCQotCQltYW55VG9PbmVNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMSk7CisJCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMSk7CiAJCWpvaW5Db2x1bW5SZXNvdXJjZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCiAJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKIAotCQlqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKwkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwogCiAJCQotCQltYW55VG9PbmVNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWpvaW5Db2x1bW5SZXNvdXJjZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwogCiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQpAQCAtNjk4LDEwNCArNjk0LDEwNiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJbWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQltYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqYXZhSm9pbkNvbHVtbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJCisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFKb2luQ29sdW1ucykpOwogCQkKLQkJCi0JCW1hbnlUb09uZU1hcHBpbmcubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWpvaW5Db2x1bW5zLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOworCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAKIAkJamF2YUpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAogCi0JCW1hbnlUb09uZU1hcHBpbmcubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJam9pbkNvbHVtbnMubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7CisJCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAKIAkJamF2YUpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCiAJCSgoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7CiAJCSgoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7CiAJCSgoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7CiAJCQkKLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7CiAJCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlKDIsIDAsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMiwgMCwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7CiAJCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmUoMCwgMSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKIAkKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwogCQogCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKwkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwogCQkKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCAgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7CiAJfQogCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRUcnVlKG1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKS5pc1ZpcnR1YWwoKSk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKIAkJCi0JCW1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJSm9pbkNvbHVtbiBzcGVjaWZpZWRKb2luQ29sdW1uID0gbWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKKwkJYXNzZXJ0VHJ1ZShqb2luQ29sdW1ucy5nZXREZWZhdWx0Sm9pbkNvbHVtbigpLmlzVmlydHVhbCgpKTsKKwkJCisJCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUpvaW5Db2x1bW4gc3BlY2lmaWVkSm9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1uLmlzVmlydHVhbCgpKTsKIAkJCi0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0Sm9pbkNvbHVtbigpKTsKKwkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5nZXREZWZhdWx0Sm9pbkNvbHVtbigpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTgwMyw3ICs4MDEsNyBAQAogCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAogCQkvL3RhcmdldEVudGl0eSBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIGRlZmF1bHQgc3RpbGwgc2V0LCBoYW5kbGVkIGJ5IHZhbGlkYXRpb24KQEAgLTgxNyw3ICs4MTUsNyBAQAogCQltYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7CiAJCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBtYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7CiAJCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwogCQljbGFzc1JlZnMubmV4dCgpOwogCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwogCQlKYXZhUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gYWRkcmVzc0NsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwpAQCAtODMzLDcgKzgzMSw3IEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKIAkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCiAJCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwpAQCAtODQ1LDcgKzg0Myw3IEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKIAkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCiAJCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwpAQCAtODU3LDcgKzg1NSw3IEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAogCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvT25lTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7CkBAIC04NzMsNyArODcxLDcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAKIAkJLy90YXJnZXRFbnRpdHkgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0CkBAIC04ODIsNyArODgwLDcgQEAKIAkJLy9hZGQgdGFyZ2V0RW50aXR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBub3cgdGFyZ2V0IGVudGl0eSBzaG91bGQgcmVzb2x2ZQogCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKIAkJY2xhc3NSZWZzLm5leHQoKTsKIAkJQ2xhc3NSZWYgYWRkcmVzc0NsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKIAkJVHlwZU1hcHBpbmcgYWRkcmVzc1R5cGVNYXBwaW5nID0gYWRkcmVzc0NsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQppbmRleCA2Njg5N2QyLi45OTRiN2QyIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCkBAIC0xMCw3ICsxMCw2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwpAQCAtMjYsMTQgKzI1LDggQEAKIAogcHVibGljIGNsYXNzIEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hcHBlZFN1cGVyY2xhc3MiLCAiIik7CQkKLQl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTU1LDE0ICs0OCwxNCBAQAogCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCQkKLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKIAkJbWFwcGVkU3VwZXJjbGFzcy5zZXRJZENsYXNzKCJteUlkQ2xhc3MiKTsKIAkJCi0JCWphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVudGl0eSk7CisJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOworCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVudGl0eSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCkBAIC03MCwxNCArNjMsMTQgQEAKIAkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQkJCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CiAJCW1hcHBlZFN1cGVyY2xhc3Muc2V0SWRDbGFzcygibXlJZENsYXNzIik7CiAKLQkJamF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGFibGUpOworCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydFRydWUoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkYWJsZSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQpAQCAtODUsMTQgKzc4LDE0IEBACiAJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkJCQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwogCQltYXBwZWRTdXBlcmNsYXNzLnNldElkQ2xhc3MoIm15SWRDbGFzcyIpOwogCi0JCWphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhTnVsbFR5cGVNYXBwaW5nKTsKKwkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOworCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFOdWxsVHlwZU1hcHBpbmcpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIApAQCAtMTAwLDE0ICs5MywxNCBAQAogCXB1YmxpYyB2b2lkIHRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hcHBlZFN1cGVyY2xhc3MpOworCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hcHBlZFN1cGVyY2xhc3MpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkKLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKIAkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gbWFwcGVkU3VwZXJjbGFzcy5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKQEAgLTExOCw3ICsxMTEsNyBAQAogCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwogCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IG1hcHBlZFN1cGVyY2xhc3Mub3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7CiAJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwogCX0KQEAgLTEyNyw3ICsxMjAsNyBAQAogCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwogCiAJCWFzc2VydEZhbHNlKG1hcHBlZFN1cGVyY2xhc3MudGFibGVOYW1lSXNJbnZhbGlkKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKIAkJYXNzZXJ0RmFsc2UobWFwcGVkU3VwZXJjbGFzcy50YWJsZU5hbWVJc0ludmFsaWQoIkZPTyIpKTsKQEAgLTEzNyw3ICsxMzAsNyBAQAogCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwogCiAJCWFzc2VydEZhbHNlKG1hcHBlZFN1cGVyY2xhc3MuYXNzb2NpYXRlZFRhYmxlcygpLmhhc05leHQoKSk7CiAJfQpAQCAtMTQ2LDcgKzEzOSw3IEBACiAJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0RmFsc2UobWFwcGVkU3VwZXJjbGFzcy5hc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkuaGFzTmV4dCgpKTsKIAl9CkBAIC0xNTUsNyArMTQ4LDcgQEAKIAkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKIAogCQlhc3NlcnRGYWxzZShtYXBwZWRTdXBlcmNsYXNzLmFzc29jaWF0ZWRUYWJsZU5hbWVzSW5jbHVkaW5nSW5oZXJpdGVkKCkuaGFzTmV4dCgpKTsKIAl9CkBAIC0xNjQsNyArMTU3LDcgQEAKIAkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CiAJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IG1hcHBlZFN1cGVyY2xhc3Mub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwogCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CkBAIC0xNzYsNyArMTY5LDcgQEAKIAkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKIAkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBtYXBwZWRTdXBlcmNsYXNzLm92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwogCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKIAl9CkBAIC0xODUsNyArMTc4LDcgQEAKIAkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0VHJ1ZShtYXBwZWRTdXBlcmNsYXNzLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwogCQlhc3NlcnRUcnVlKG1hcHBlZFN1cGVyY2xhc3MuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CiAJCWFzc2VydFRydWUobWFwcGVkU3VwZXJjbGFzcy5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKQEAgLTIwMiw4ICsxOTUsOCBAQAogCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3MoKSk7CiAJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CkBAIC0yMzQsOCArMjI3LDggQEAKIAkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwogCiAJCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzcy5nZXRJZENsYXNzKCkpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU5hbWVkTmF0aXZlUXVlcnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU5hbWVkTmF0aXZlUXVlcnlUZXN0cy5qYXZhCmluZGV4IDE1YzBiMDAuLjA0NjBlYTggMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTmFtZWROYXRpdmVRdWVyeVRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTEsOSArMTEsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTmFtZWROYXRpdmVRdWVyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlF1ZXJ5SGludDsKQEAgLTIzLDMzICsyMSwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIEphdmFOYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIlFVRVJZX05BTUUiOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9RVUVSWSA9ICJNWV9RVUVSWSI7Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUXVlcnlIaW50QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOYW1lZE5hdGl2ZVF1ZXJ5IiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsiICsKLQkJCSJTdHJpbmcgcXVlcnkoKTsiICsKLQkJCSJRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVF1ZXJ5SGludEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUXVlcnlIaW50IiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsiICsKLQkJCSJTdHJpbmcgdmFsdWUoKTsiKTsJCQotCX0KIAkJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTczLDEwICs1MSwxMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCkubmV4dCgpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOworCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5uZXh0KCk7CiAJCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwpAQCAtOTYsMTAgKzc0LDEwIEBACiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCkubmV4dCgpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOworCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5uZXh0KCk7CiAJCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwpAQCAtMTIwLDEwICs5OCwxMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCkubmV4dCgpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOworCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5uZXh0KCk7CiAJCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7CkBAIC0xNDMsMTAgKzEyMSwxMCBAQAogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5uZXh0KCk7CisJCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CisJCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkTmF0aXZlUXVlcmllcygpLm5leHQoKTsKIAkJCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKQEAgLTE2NywzMiArMTQ1LDMyIEBACiAJcHVibGljIHZvaWQgdGVzdEFkZEhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCkubmV4dCgpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOworCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5uZXh0KCk7CiAJCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkKIAkJCiAJCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBuYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJZ2V0T3JtWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCQlxdWVyeUhpbnQuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJZ2V0T3JtWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCiAJCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7CiAJCQogCQlRdWVyeUhpbnQgcXVlcnlIaW50MiA9IG5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgwKTsKLQkJb3JtUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCQlnZXRPcm1YbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CiAJCXF1ZXJ5SGludDIuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJZ2V0T3JtWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKIAkJCiAJCVF1ZXJ5SGludCBxdWVyeUhpbnQzID0gbmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDEpOwotCQlvcm1SZXNvdXJjZSgpLnNhdmUobnVsbCk7CisJCWdldE9ybVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAkJcXVlcnlIaW50My5zZXROYW1lKCJCQVoiKTsKLQkJb3JtUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCQlnZXRPcm1YbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwpAQCAtMjEyLDEwICsxOTAsMTAgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5uZXh0KCk7CisJCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CisJCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkTmF0aXZlUXVlcmllcygpLm5leHQoKTsKIAkJCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCiAJCW5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKQEAgLTI0MCwxMCArMjE4LDEwIEBACiAJcHVibGljIHZvaWQgdGVzdE1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpLm5leHQoKTsKKwkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKKwkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWROYXRpdmVRdWVyaWVzKCkubmV4dCgpOwogCQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gamF2YU5hbWVkTmF0aXZlUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAKIAkJbmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkZPTyIpOwpAQCAtMjc4LDEwICsyNTYsMTAgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCkubmV4dCgpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOworCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5uZXh0KCk7CiAJCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMCk7CkBAIC0zMzAsMTIgKzMwOCwxMiBAQAogCXB1YmxpYyB2b2lkIHRlc3RIaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwogCQkKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpLm5leHQoKTsKKwkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWROYXRpdmVRdWVyaWVzKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWROYXRpdmVRdWVyeS5oaW50c1NpemUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gamF2YU5hbWVkTmF0aXZlUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQkKQEAgLTM1NCwxMCArMzMyLDEwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5uZXh0KCk7CisJCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CisJCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkTmF0aXZlUXVlcmllcygpLm5leHQoKTsKIAkJCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwpAQCAtMzc3LDEwICszNTUsMTAgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVzdWx0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCkubmV4dCgpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOworCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5uZXh0KCk7CiAJCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydEVxdWFscyhudWxsLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKQEAgLTQwMSwxMCArMzc5LDEwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5uZXh0KCk7CisJCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CisJCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkTmF0aXZlUXVlcmllcygpLm5leHQoKTsKIAkJCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7CkBAIC00MjQsMTAgKzQwMiwxMCBAQAogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZXN1bHRTZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpLm5leHQoKTsKKwkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKKwkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWROYXRpdmVRdWVyaWVzKCkubmV4dCgpOwogCQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gamF2YU5hbWVkTmF0aXZlUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOYW1lZFF1ZXJ5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOYW1lZFF1ZXJ5VGVzdHMuamF2YQppbmRleCAwMGJmYmFmLi44NGJkZWU0IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTmFtZWRRdWVyeVRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU5hbWVkUXVlcnlUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTIxLDMzICsyMSwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIEphdmFOYW1lZFF1ZXJ5VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIlFVRVJZX05BTUUiOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9RVUVSWSA9ICJNWV9RVUVSWSI7Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTmFtZWRRdWVyeUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUXVlcnlIaW50QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOYW1lZFF1ZXJ5IiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsiICsKLQkJCSJTdHJpbmcgcXVlcnkoKTsiICsKLQkJCSJRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVF1ZXJ5SGludEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUXVlcnlIaW50IiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsiICsKLQkJCSJTdHJpbmcgdmFsdWUoKTsiKTsJCQotCX0KIAkJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU5hbWVkUXVlcnlBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTcxLDEwICs1MSwxMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOworCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCk7CiAJCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBqYXZhTmFtZWRRdWVyeS5nZXROYW1lKCkpOwpAQCAtOTQsMTAgKzc0LDEwIEBACiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOworCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCk7CiAJCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBqYXZhTmFtZWRRdWVyeS5nZXROYW1lKCkpOwpAQCAtMTE4LDEwICs5OCwxMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOworCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCk7CiAJCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgamF2YU5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7CkBAIC0xNDEsMTAgKzEyMSwxMCBAQAogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCk7CisJCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CisJCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkUXVlcmllcygpLm5leHQoKTsKIAkJCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU5hbWVkUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBqYXZhTmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKQEAgLTE2NSwxMCArMTQ1LDEwIEBACiAJcHVibGljIHZvaWQgdGVzdEFkZEhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOworCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCk7CiAJCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkKIAkJCkBAIC0yMDQsMTAgKzE4NCwxMCBAQAogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZW50aXR5Lm5hbWVkUXVlcmllcygpLm5leHQoKTsKKwkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKKwkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWRRdWVyaWVzKCkubmV4dCgpOwogCQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJTmFtZWRRdWVyeUFubm90YXRpb24gamF2YU5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAKIAkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkZPTyIpOwpAQCAtMjMyLDEwICsyMTIsMTAgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpOworCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOworCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCk7CiAJCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAogCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7CkBAIC0yNzAsMTAgKzI1MCwxMCBAQAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVIaW50cygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7Ci0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCk7CisJCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CisJCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkUXVlcmllcygpLm5leHQoKTsKIAkJCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU5hbWVkUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKIAkJamF2YU5hbWVkUXVlcnkuYWRkSGludCgwKTsKQEAgLTMyMiwxMiArMzAyLDEyIEBACiAJcHVibGljIHZvaWQgdGVzdEhpbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBqYXZhRW50aXR5KCk7CisJCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CiAJCQotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpOworCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmluZGV4IDlmMzViYWQuLjMyNDJlMTQgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKQEAgLTEzLDYgKzEzLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7CkBAIC00OCwxNyArNDksMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVPbmVUb01hbnlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9NYW55IiwgIiIpOwkJCi0JfQotCiAJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewogCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewpAQCAtNzEsNiArNjUsMTAgQEAKIAkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7CiAJCQkJCXNiLmFwcGVuZCgiOyIpOwogCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOwogCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwogCQkJCXNiLmFwcGVuZChDUik7CiAJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7CkBAIC04MSw3ICs3OSw4IEBACiAJCQkJc2IuYXBwZW5kKENSKTsKIAkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7CiAJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwogCQkJCXNiLmFwcGVuZChDUik7CiAJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7CiAJCQkJc2IuYXBwZW5kKENSKTsKQEAgLTkxLDEwICs5MCwzMCBAQAogCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwogCX0KIAorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU9uZVRvTWFueUFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTEzLDkgKzEzMiw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU9uZVRvTWFueUFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTM4LDkgKzE1NCw2IEBACiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sbGVjdGlvbk9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVPbmVUb01hbnlBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTE2Miw5ICsxNzUsNiBAQAogCQl9KTsKIAl9CiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uQ29sbGVjdGlvbk9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVPbmVUb01hbnlBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTE4Niw2ICsxOTYsNTUgQEAKIAkJfSk7CiAJfQogCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RGVwYXJ0bWVudCgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuTWFwOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLk9ORV9UT19NQU5ZKS5hcHBlbmQoIjsiKTsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRGVwYXJ0bWVudCIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBFbXBsb3llZT4gZW1wbG95ZWVzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkRlcGFydG1lbnQuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbXBsb3llZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkVtcGxveWVlIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgZW1wSWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW1wbG95ZWUuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQogCQogCXB1YmxpYyBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwpAQCAtMTk1LDIwICsyNTQsMjAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImFzZGYiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7CisJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CiAJCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQpAQCAtMjE3LDE5ICsyNzYsMTkgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImFzZGYiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7CisJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CiAJCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CkBAIC0yMzgsMjAgKzI5NywyMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKKwkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KQEAgLTI2MCwyMCArMzE5LDIwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOworCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KQEAgLTI4MiwyMCArMzQxLDIwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOworCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KQEAgLTMwNCwyMCArMzYzLDIwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOworCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KQEAgLTMyNiwyMCArMzg1LDIwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOworCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CkBAIC0zNDgsMjAgKzQwNywyMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKKwkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KQEAgLTM3MCwyMCArNDI5LDIwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOworCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CkBAIC0zOTIsMjAgKzQ1MSwyMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKKwkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CkBAIC00MTUsMTIgKzQ3NCwxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwogCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7CkBAIC00NDAsMTIgKzQ5OSwxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwogCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7CkBAIC00NjUsMTIgKzUyNCwxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CiAJCWFzc2VydE51bGwob25lVG9NYW55LmdldEZldGNoKCkpOwpAQCAtNDk1LDEyICs1NTQsMTIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKIAkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKQEAgLTUxMyw3ICs1NzIsNiBAQAogCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgb25lVG9NYW55LmdldEZldGNoKCkpOwotCiAJCQogCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCiAJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2gobnVsbCk7CkBAIC01MjUsMjQgKzU4MywyNCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7CisJCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwogCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKIAkJCQkKIAkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCiAJCW9uZVRvTWFueS5zZXRNYXBwZWRCeSgibmV3TWFwcGVkQnkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7CisJCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7CiAJCiAJCS8vc2V0IG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCiAJCW9uZVRvTWFueS5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7CiAJfQogCQpAQCAtNTUwLDI0ICs2MDgsMjQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7CiAJCQkJCiAJCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnlNYXBwaW5nLnNldE1hcHBlZEJ5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm5ld1RhcmdldEVudGl0eSIpOworCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7CiAJCiAJCS8vc2V0IG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUobnVsbCk7CisJCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwogCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKIAl9CiAKQEAgLTU3NSwxMyArNjMzLDE2IEBACiAJcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKIAkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gb25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CisJCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKKwkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKQEAgLTU4OSwxNiArNjUwLDIzIEBACiAJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CiAJCQogCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gb25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CisJCWF0dHJpYnV0ZU5hbWVzID0gCisJCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwogCQkKIAkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gb25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CisJCWF0dHJpYnV0ZU5hbWVzID0gCisJCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwogCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKwkJCisJCS8vVE9ETyB0aGlzIG5lZWRzIHRvIHJldHVybiBudWxsIGZvciAxLjAgbWFwcGluZ3MuICB3ZSB3YW50IHRoZSB2YWxpZGF0aW9uIGVycm9yIGZvciBkb3Qtbm90YXRpb24gc2luY2UgdGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBpbiAyLjAKKwkJLy9UT0RPIG5lZWQgdG8gY29weSB0aGlzIHRvIGFsbCB0aGUgb3RoZXIgbWFwcGVkIGJ5IHRlc3RzLgorCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7CisJCWFzc2VydE51bGwoc3RhdGVGb29NYXBwaW5nKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNjA2LDcgKzY3NCw3IEBACiAJCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCiAJCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgZGVmYXVsdCBzdGlsbCBzZXQsIGhhbmRsZWQgYnkgdmFsaWRhdGlvbgpAQCAtNjIwLDcgKzY4OCw3IEBACiAJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKIAkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CiAJCWNsYXNzUmVmcy5uZXh0KCk7CiAJCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7CiAJCUphdmFQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CkBAIC02MzYsNyArNzA0LDcgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwogCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7CkBAIC02NDgsNyArNzE2LDcgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwogCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7CkBAIC02NTksNyArNzI3LDcgQEAKIAkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAKIAkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwpAQCAtNjc1LDcgKzc0Myw3IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCiAJCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdApAQCAtNjg0LDcgKzc1Miw3IEBACiAJCS8vYWRkIHRhcmdldEVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgbm93IHRhcmdldCBlbnRpdHkgc2hvdWxkIHJlc29sdmUKIAkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CiAJCWNsYXNzUmVmcy5uZXh0KCk7CiAJCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7CiAJCVR5cGVNYXBwaW5nIGFkZHJlc3NUeXBlTWFwcGluZyA9IGFkZHJlc3NDbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CkBAIC03MDgsMzQgKzc3NiwzNCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7CisJCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQkKIAkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCiAJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOworCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwogCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0Tm90TnVsbChtYXBLZXkpOwogCQkJCQogCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKIAkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwogCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7CiAJCQogCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAogCQltYXBLZXkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKKwkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKIAkJYXNzZXJ0TnVsbChtYXBLZXkuZ2V0TmFtZSgpKTsKIAkJCiAJCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwogCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKKwkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQpAQCAtNzQzLDI0ICs4MTEsMjQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOworCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJCQkJCiAJCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJteU1hcEtleSIpOworCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKIAkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwogCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7CiAJCiAJCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOworCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleShudWxsKTsKKwkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCkBAIC03NjgsMjUgKzgzNiwyNSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOworCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQkJCQogCQkvL3NldCBvcmRlckJ5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJb3JkZXJCeS5zZXRWYWx1ZSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7CisJCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5Iiwgb3JkZXJCeS5nZXRWYWx1ZSgpKTsKIAkKIAkJLy9zZXQgb3JkZXJCeSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAogCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOworCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTc5NCwyNCArODYyLDI0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7CisJCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCQkJCiAJCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoIm5ld09yZGVyQnkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5Iiwgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOworCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkoIm5ld09yZGVyQnkiKTsKKwkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5Iiwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwogCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5ID0gKE9yZGVyQnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9yZGVyQnkuZ2V0VmFsdWUoKSk7CiAJCiAJCS8vc2V0IG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKKwkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KG51bGwpOworCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTgxOSwxMSArODg3LDExIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQkKIAkJYXNzZXJ0VHJ1ZShvbmVUb01hbnlNYXBwaW5nLmlzTm9PcmRlcmluZygpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtODQ2LDExICs5MTQsMTEgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCQogCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzUGtPcmRlcmluZygpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwpAQCAtODczLDExICs5NDEsMTEgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCQogCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tT3JkZXJpbmcoKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKQEAgLTg5NSw0ICs5NjMsMTUgQEAKIAkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU9yZGVyaW5nKCkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQorCQorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0RW50aXR5Rm9yTWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbXBsb3llZSgpOworCQljcmVhdGVUZXN0RGVwYXJ0bWVudCgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkRlcGFydG1lbnQiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIpOworCQkKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlPbmVUb01hbnlNYXBwaW5nIGVtcGxveWVlc01hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIiwgZW1wbG95ZWVzTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQppbmRleCA0M2VjYzM3Li4xNTRlZDY1IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQpAQCAtMTMsMjIgKzEzLDI1IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKQEAgLTM3LDE3ICs0MCwxNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uc0Fubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwpAQCAtNTUsMTcgKzU4LDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU9uZVRvT25lQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk9uZVRvT25lIiwgIiIpOwkJCi0JfQotCiAJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewogCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewpAQCAtNzgsNiArNzQsMTAgQEAKIAkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7CiAJCQkJCXNiLmFwcGVuZCgiOyIpOwogCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOwogCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwogCQkJCXNiLmFwcGVuZChDUik7CiAJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7CkBAIC04OCwyMSArODgsNDEgQEAKIAkJCQlzYi5hcHBlbmQoQ1IpOwogCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKIAkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7CiAJCQkJc2IuYXBwZW5kKENSKTsKIAkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKIAkJCQlzYi5hcHBlbmQoQ1IpOwogCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9CisJCX0KIAkJfTsKIAkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKIAl9Ci0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVPbmVUb09uZUFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTIxLDkgKzE0MSw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlT25lVG9PbmVBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTE0Niw5ICsxNjMsNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb2xsZWN0aW9uT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlT25lVG9PbmVBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTE3MSw5ICsxODUsNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljaXplZENvbGxlY3Rpb25PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVPbmVUb09uZUFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMjAzLDE5ICsyMTQsMjAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTIyMywxOCArMjM1LDE5IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTI0MiwxOSArMjU1LDIwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTI2MiwxOSArMjc2LDIwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7CiAJCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAJCkBAIC0yODIsMTkgKzI5NywyMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQpAQCAtMzAyLDE5ICszMTgsMjAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTMyMiwxOSArMzM5LDIwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQpAQCAtMzQyLDE5ICszNjAsMjAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7CiAJCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTM2MiwxOSArMzgxLDIwIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAJCkBAIC0zODIsMTkgKzQwMiwyMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIApAQCAtNDAzLDEyICs0MjQsMTIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7CkBAIC00MjgsMTIgKzQ0OSwxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKIAkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwogCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKQEAgLTQ1MywyNCArNDc0LDI1IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSBtYXBwZWRCeSA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKKwkJYXNzZXJ0TnVsbChtYXBwZWRCeS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKIAkJCQkKIAkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCiAJCW9uZVRvT25lLnNldE1hcHBlZEJ5KCJuZXdNYXBwZWRCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgb25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5IiwgbWFwcGVkQnkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKIAkKIAkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKIAkJb25lVG9PbmUuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlhc3NlcnROdWxsKG1hcHBlZEJ5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwogCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwogCX0KIAkKQEAgLTQ3OCwyNCArNTAwLDI1IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSBtYXBwZWRCeSA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKKwkJYXNzZXJ0TnVsbChtYXBwZWRCeS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKIAkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lTWFwcGluZy5zZXRNYXBwZWRCeSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQkvL3NldCBtYXBwZWRCeUpvaW5pbmdTdHJhdGVneSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKKwkJbWFwcGVkQnkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm5ld1RhcmdldEVudGl0eSIpOworCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hcHBlZEJ5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwogCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwogCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9uZVRvT25lTWFwcGluZy5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7CisJCS8vc2V0IG1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKKwkJbWFwcGVkQnkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUobnVsbCk7CisJCWFzc2VydE51bGwobWFwcGVkQnkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydE51bGwob25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7CiAJfQogCkBAIC01MDMsMTIgKzUyNiwxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKIAkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCWFzc2VydE51bGwob25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7CkBAIC01MzMsMTIgKzU1NiwxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKIAkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCWFzc2VydE51bGwob25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7CkBAIC01NDcsNyArNTcwLDcgQEAKIAkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCisJCQogCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKQEAgLTU2MywxMiArNTg2LDEyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRGZXRjaCgpKTsKQEAgLTU3NywxMSArNjAwLDEwIEBACiAJCW9uZVRvT25lLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIsIG9uZVRvT25lLmdldEZldGNoKCkpOwotCQorCQkKIAkJb25lVG9PbmUuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0KIAkJCiAJCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCiAJCW9uZVRvT25lLnNldEZldGNoKG51bGwpOwpAQCAtNTkzLDEyICs2MTUsMTIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCiAJCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldEZldGNoKCkpOwpAQCAtNjExLDcgKzYzMyw2IEBACiAJCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0KIAkJCiAJCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKIAkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwpAQCAtNjIzLDI2ICs2NDQsMjcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKIAkJCiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAKIAkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCiAJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKIAkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCisJCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAKIAkJam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwogCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBUiIpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwkJCisJCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwpAQCAtNjUwLDM0ICs2NzIsMzQgQEAKIAogCQlqb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUyk7CiAJCWpvaW5Db2x1bW4uc2V0TmFtZSgiQkFaIik7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CQkKKwkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwkJCiAJCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAJCiAJCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJYXR0cmlidXRlUmVzb3VyY2UubW92ZSgxLCAwLCBKUEEuSk9JTl9DT0xVTU5TKTsKLQkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuSk9JTl9DT0xVTU5TKTsKKwkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwkJCiAJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwkJCisJCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwogCQogCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CQkKKwkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwkJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAKIAkJCiAJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKLQkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsJCQorCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CQkKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAl9CiAJCkBAIC02ODksMTI3ICs3MTEsMTM0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygwLCBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOworCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKIAkJCi0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKIAkJCi0JCW9uZVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJCisJCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCWFzc2VydEVxdWFscygwLCBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgb25lVG9PbmVNYXBwaW5nLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CiAJCQotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9uZVRvT25lTWFwcGluZy5qb2luQ29sdW1uc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBqb2luQ29sdW1ucy5qb2luQ29sdW1uc1NpemUoKSk7CiAJCQotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9uZVRvT25lTWFwcGluZy5qb2luQ29sdW1uc1NpemUoKSk7CisJCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCWFzc2VydEVxdWFscygxLCBqb2luQ29sdW1ucy5qb2luQ29sdW1uc1NpemUoKSk7CisJCQorCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlhc3NlcnRFcXVhbHMoMiwgam9pbkNvbHVtbnMuam9pbkNvbHVtbnNTaXplKCkpOwogCi0JCW9uZVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlvbmVUb09uZU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9uZVRvT25lTWFwcGluZy5qb2luQ29sdW1uc1NpemUoKSk7CisJCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCWFzc2VydEVxdWFscygxLCBqb2luQ29sdW1ucy5qb2luQ29sdW1uc1NpemUoKSk7CiAJCQogCQkvL2lmIG5vbi1vd25pbmcgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIHRoZW4gbm8gZGVmYXVsdCBqb2luIGNvbHVtbgotCQlvbmVUb09uZU1hcHBpbmcuc2V0TWFwcGVkQnkoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMCwgb25lVG9PbmVNYXBwaW5nLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoMCwgam9pbkNvbHVtbnMuam9pbkNvbHVtbnNTaXplKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IAorCQkJYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IAorCQkJYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKIAl9CiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkpOwogCi0JCW9uZVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDEpOworCQlqb2luQ29sdW1ucy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwogCQkKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gam9pbkNvbHVtblJlc291cmNlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtblJlc291cmNlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwogCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCQlJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKIAkKIAkJCi0JCW9uZVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDEpOworCQlqb2luQ29sdW1ucy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwogCQlqb2luQ29sdW1uUmVzb3VyY2VzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQogCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7CiAKLQkJam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKwkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwogCiAJCQotCQlvbmVUb09uZU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJam9pbkNvbHVtbnMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJam9pbkNvbHVtblJlc291cmNlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKwkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKIAogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KQEAgLTgxOCwxMTcgKzg0NywxMjMgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CisJCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CiAJCQotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGphdmFKb2luQ29sdW1ucyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQkKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhSm9pbkNvbHVtbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUpvaW5Db2x1bW5zKSk7CiAJCQogCQkKLQkJb25lVG9PbmVNYXBwaW5nLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWpvaW5Db2x1bW5zLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOworCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAKIAkJamF2YUpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAogCi0JCW9uZVRvT25lTWFwcGluZy5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwLCAxKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWpvaW5Db2x1bW5zLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOworCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCiAJCWphdmFKb2luQ29sdW1ucyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCiAJCSgoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7CiAJCSgoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7CiAJCSgoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7CiAJCQkKLQkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKIAkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmUoMiwgMCwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCWF0dHJpYnV0ZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwogCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlKDAsIDEsIEpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKIAkKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKwkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7CiAJCiAJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKIAkJCiAJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJCisJCWFzc2VydFRydWUoam9pbkNvbHVtbnMuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKS5pc1ZpcnR1YWwoKSk7CiAKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKS5pc1ZpcnR1YWwoKSk7Ci0KLQkJb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCUpvaW5Db2x1bW4gc3BlY2lmaWVkSm9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKKwkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSm9pbkNvbHVtbiBzcGVjaWZpZWRKb2luQ29sdW1uID0gam9pbkNvbHVtbnMuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW4uaXNWaXJ0dWFsKCkpOwogCQkKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSk7CisJCWFzc2VydE51bGwoam9pbkNvbHVtbnMuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwogCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOworCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSBvbmVUb09uZU1hcHBpbmcuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCisJCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKQEAgLTkzNiwxNiArOTcxLDIxIEBACiAJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CiAJCQogCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSBvbmVUb09uZU1hcHBpbmcuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhdHRyaWJ1dGVOYW1lcyA9IAorCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwogCQkKIAkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSBvbmVUb09uZU1hcHBpbmcuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhdHRyaWJ1dGVOYW1lcyA9IAorCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwogCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKwkJCisJCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOworCQlhc3NlcnROdWxsKHN0YXRlRm9vTWFwcGluZyk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTk1Myw3ICs5OTMsNyBAQAogCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAogCQkvL3RhcmdldEVudGl0eSBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIGRlZmF1bHQgc3RpbGwgc2V0LCBoYW5kbGVkIGJ5IHZhbGlkYXRpb24KQEAgLTk2Nyw3ICsxMDA3LDcgQEAKIAkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7CiAJCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBvbmVUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CiAJCWNsYXNzUmVmcy5uZXh0KCk7CiAJCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7CiAJCUphdmFQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CkBAIC05ODMsNyArMTAyMyw3IEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKIAkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCiAJCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7CkBAIC05OTUsNyArMTAzNSw3IEBACiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKIAkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCiAJCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7CkBAIC0xMDA2LDcgKzEwNDYsNyBAQAogCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAogCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgb25lVG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKQEAgLTEwMjIsNyArMTA2Miw3IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAKIAkJLy90YXJnZXRFbnRpdHkgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0CkBAIC0xMDMxLDcgKzEwNzEsNyBAQAogCQkvL2FkZCB0YXJnZXRFbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyB0YXJnZXQgZW50aXR5IHNob3VsZCByZXNvbHZlCiAJCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7CiAJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwogCQljbGFzc1JlZnMubmV4dCgpOwogCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwogCQlUeXBlTWFwcGluZyBhZGRyZXNzVHlwZU1hcHBpbmcgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwpAQCAtMTA1NCwyNiArMTA5NCwyOCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgc3RyYXRlZ3kgPSAKKwkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSAKKwkJCXN0cmF0ZWd5LnByaW1hcnlLZXlKb2luQ29sdW1ucygpOwogCQkKIAkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAKIAkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCiAJCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwogCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQorCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzdHJhdGVneS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAogCQlqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwogCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBUiIpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKKwkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gc3RyYXRlZ3kucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKQEAgLTEwODEsMzQgKzExMjMsMzQgQEAKIAogCQlqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwogCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBWiIpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKKwkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gc3RyYXRlZ3kucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAJCiAJCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJYXR0cmlidXRlUmVzb3VyY2UubW92ZSgxLCAwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOworCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzdHJhdGVneS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAogCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsJCQorCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzdHJhdGVneS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwogCQogCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsJCQorCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzdHJhdGVneS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsJCQogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAKIAkJCiAJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCisJCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHN0cmF0ZWd5LnByaW1hcnlLZXlKb2luQ29sdW1ucygpOwkJCiAJCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwogCX0KIAkKQEAgLTExMTYsMzIgKzExNTgsMzYgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOworCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBzdHJhdGVneSA9IAorCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CiAJCQotCQlvbmVUb09uZU1hcHBpbmcuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHN0cmF0ZWd5LnByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7CiAJCQotCQlvbmVUb09uZU1hcHBpbmcucmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7CisJCWFzc2VydEVxdWFscygxLCBzdHJhdGVneS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOworCQkKKwkJc3RyYXRlZ3kucmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7CisJCWFzc2VydEVxdWFscygwLCBzdHJhdGVneS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RBZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlvbmVUb09uZU1hcHBpbmcuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOworCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBzdHJhdGVneSA9IAorCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gam9pbkNvbHVtbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuQU5OT1RBVElPTl9OQU1FKTsKKwkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKQEAgLTExNTMsMTYgKzExOTksMTggQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb25lVG9PbmVNYXBwaW5nLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgc3RyYXRlZ3kgPSAKKwkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IGpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7CisJCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7CkBAIC0xMTc0LDEzNyArMTIyMiwxNDIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IHN0cmF0ZWd5ID0gCisJCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJCisJCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkpOwogCi0JCW9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb25lVG9PbmVNYXBwaW5nLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CisJCXN0cmF0ZWd5LnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSkpKTsKLQotCQlvbmVUb09uZU1hcHBpbmcucmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oMSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBqb2luQ29sdW1uUmVzb3VyY2VzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtblJlc291cmNlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKIAkJCi0JCUl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkJSXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gc3RyYXRlZ3kucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAkKIAkJCi0JCW9uZVRvT25lTWFwcGluZy5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtblJlc291cmNlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpOworCQlzdHJhdGVneS5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKTsKKwkJam9pbkNvbHVtblJlc291cmNlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKIAkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwogCi0JCWpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCQlqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LnByaW1hcnlLZXlKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwogCiAJCQotCQlvbmVUb09uZU1hcHBpbmcucmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW5SZXNvdXJjZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuQU5OT1RBVElPTl9OQU1FKTsKKwkJc3RyYXRlZ3kucmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7CisJCWpvaW5Db2x1bW5SZXNvdXJjZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCWpvaW5Db2x1bW5zID0gc3RyYXRlZ3kucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb25lVG9PbmVNYXBwaW5nLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvbmVUb09uZU1hcHBpbmcuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgc3RyYXRlZ3kgPSAKKwkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CisJCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gamF2YUpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQkKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhSm9pbkNvbHVtbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhSm9pbkNvbHVtbnMpKTsKIAkJCiAJCQotCQlvbmVUb09uZU1hcHBpbmcubW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkJc3RyYXRlZ3kubW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDIsIDApOworCQlMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHN0cmF0ZWd5LnByaW1hcnlLZXlKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCi0JCWphdmFKb2luQ29sdW1ucyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlqYXZhSm9pbkNvbHVtbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7CiAKIAotCQlvbmVUb09uZU1hcHBpbmcubW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDAsIDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCXN0cmF0ZWd5Lm1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigwLCAxKTsKKwkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gc3RyYXRlZ3kucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAKLQkJamF2YUpvaW5Db2x1bW5zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWphdmFKb2luQ29sdW1ucyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByaW1hcnlLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkKLQkJKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgc3RyYXRlZ3kgPSAKKwkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQkKKwkJKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKKwkJKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKKwkJKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKIAkJCQotCQlMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCQlMaXN0SXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gc3RyYXRlZ3kucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAJCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlKDIsIDAsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMiwgMCwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LnByaW1hcnlLZXlKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwogCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlKDAsIDEsIFByaW1hcnlLZXlKb2luQ29sdW1ucy5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMCwgMSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LnByaW1hcnlLZXlKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwogCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgUHJpbWFyeUtleUpvaW5Db2x1bW5zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLnByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWpvaW5Db2x1bW5zID0gc3RyYXRlZ3kucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAJCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKIAkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAl9Ci0KIH0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzYmY1YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQkKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWQiLCAiIik7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUlkTWFwcGluZyk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KG51bGwpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUJhc2ljTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFJZE1hcHBpbmcpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRNYXBwaW5nTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSk7Ci0JCWFzc2VydFRydWUoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSBpbnN0YW5jZW9mIEVtYmVkZGVkQW5ub3RhdGlvbik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhRW1iZWRkZWRNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE1hcHBpbmdLZXkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBFbWJlZGRlZEFubm90YXRpb24pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUVtYmVkZGVkTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE1hcHBpbmdLZXlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0tleU1hcHBpbmdDaGFuZ2VJblJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnNldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nS2V5TWFwcGluZ0NoYW5nZUluUmVzb3VyY2VNb2RlbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzdhMjQ5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50VHlwZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZEFuZE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZVdpdGhGaWVsZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN1YlR5cGVXaXRoTWV0aG9kQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN1YlR5cGVOb25QZXJzaXN0ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdWJUeXBlUGVyc2lzdGVudEV4dGVuZHNOb25QZXJzaXN0ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkMi5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkMiIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQgIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc05vdGhpbmdBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NGaWVsZEFuZE1ldGhvZEFubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRBbmRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0luaGVyaXRhbmNlMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9CQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2UzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVdpdGhNZXRob2RBbm5vdGF0aW9uKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQkKLQkJCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0luaGVyaXRhbmNlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlV2l0aEZpZWxkQW5ub3RhdGlvbigpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQkvL2luaGVyaXRlZCBjbGFzcyBoYXZpbmcgYW5ub3RhdGlvbnMgc2V0IHdpbnMgb3ZlciB0aGUgZGVmYXVsdCBhY2Nlc3Mgc2V0IG9uIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2VQZXJzaXN0ZW5jZVVuaXREZWZhdWx0QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sTm9BY2Nlc3NOb0Fubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbEVudGl0eUFjY2Vzc05vQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNBY2Nlc3NOb0Fubm90YXRpb25zKCkgIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sRW50aXR5UHJvcGVydHlBY2Nlc3NBbmRGaWVsZEFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8veG1sIGFjY2VzcyBzZXQgdG8gcHJvcGVydHksIGZpZWxkIGFubm90YXRpb25zLCBKYXZhUGVyc2lzdGVudFR5cGUgYWNjZXNzIGlzIHByb3BlcnR5Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sRW50aXR5RmllbGRBY2Nlc3NBbmRQcm9wZXJ0eUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8veG1sIGFjY2VzcyBzZXQgdG8gZmllbGQsIHByb3BlcnR5IGFubm90YXRpb25zLCBKYXZhUGVyc2lzdGVudFR5cGUgYWNjZXNzIGlzIGZpZWxkCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzQWNjZXNzRmllbGRBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQotCS8vaW5oZXJpdGFuY2Ugd2lucyBvdmVyIGVudGl0eS1tYXBwaW5ncyBzcGVjaWZpZWQgYWNjZXNzCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbEVudGl0eU1hcHBpbmdzQWNjZXNzV2l0aEluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkRW50aXR5UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCQotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSA9IGNoaWxkRW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NYbWxNZXRhZGF0YUNvbXBsZXRlRmllbGRBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQkvL3htbCBhY2Nlc3Mgc2V0IHRvIHByb3BlcnR5LCBzbyBldmVuIHRob3VnaCB0aGVyZSBhcmUgZmllbGQgYW5ub3RhdGlvbnMsIEphdmFQZXJzaXN0ZW50VHlwZQotCQkvL2FjY2VzcyBzaG91bGQgYmUgcHJvcGVydHkKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc05vWG1sQWNjZXNzWG1sTWV0ZGF0YUNvbXBsZXRlUHJvcGVydHlBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQkvL3htbCBhY2Nlc3Mgbm90IHNldCwgbWV0YWRhdGEgY29tcGxldGUgc2V0LiAgSmF2YVBlcnNpc3RlbnRUeXBlIGFjY2VzcwotCQkvL2lzIGZpZWxkPz8KLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQYXJlbnRQZXJzaXN0ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlV2l0aEZpZWxkQW5ub3RhdGlvbigpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJvb3RKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMocm9vdEphdmFQZXJzaXN0ZW50VHlwZSwgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUuZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKSk7Ci0JCWFzc2VydE51bGwocm9vdEphdmFQZXJzaXN0ZW50VHlwZS5nZXRQYXJlbnRQZXJzaXN0ZW50VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFBhcmVudFBlcnNpc3RlbnRUeXBlMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlV2l0aEZpZWxkQW5ub3RhdGlvbigpOwotCQkKLQkJLy9wYXJlbnQgaXMgbm90IGFkZGVkIHRvIHRoZSBwZXJzaXN0ZW5jZVVuaXQsIGJ1dCBpdCBzaG91bGQgc3RpbGwgYmUgZm91bmQKLQkJLy9hcyB0aGUgcGFyZW50UGVyc2lzdGVudFR5cGUgYmVjYXVzZSBvZiBpbXBsaWVkQ2xhc3NSZWZzIGFuZCBjaGFuZ2VzIGZvciBidWcgMTkwMzE3Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKSk7Ci0JfQkKLQkKLQkvL0VudGl0eSBleHRlbmRzIE5vbi1FbnRpdHkgZXh0ZW5kcyBFbnRpdHkgCi0JcHVibGljIHZvaWQgdGVzdFBhcmVudFBlcnNpc3RlbnRUeXBlMygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlTm9uUGVyc2lzdGVudCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVBlcnNpc3RlbnRFeHRlbmRzTm9uUGVyc2lzdGVudCgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQyIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSByb290SmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQljbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUsIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLmdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCkpOwotCQlhc3NlcnROdWxsKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUuZ2V0UGFyZW50UGVyc2lzdGVudFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbmhlcml0YW5jZUhpZXJhcmNoeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlTm9uUGVyc2lzdGVudCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVBlcnNpc3RlbnRFeHRlbmRzTm9uUGVyc2lzdGVudCgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQyIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgcm9vdEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4gaW5oZXJpdGFuY2VIaWVyYXJjaHkgPSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5pbmhlcml0YW5jZUhpZXJhcmNoeSgpOwkKLQkJCi0JCWFzc2VydEVxdWFscyhjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSwgaW5oZXJpdGFuY2VIaWVyYXJjaHkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUsIGluaGVyaXRhbmNlSGllcmFyY2h5Lm5leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbmhlcml0YW5jZUhpZXJhcmNoeTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZU5vblBlcnNpc3RlbnQoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVQZXJzaXN0ZW50RXh0ZW5kc05vblBlcnNpc3RlbnQoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQyIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJvb3RKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IGluaGVyaXRhbmNlSGllcmFyY2h5ID0gY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUuaW5oZXJpdGFuY2VIaWVyYXJjaHkoKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUsIGluaGVyaXRhbmNlSGllcmFyY2h5Lm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhyb290SmF2YVBlcnNpc3RlbnRUeXBlLCBpbmhlcml0YW5jZUhpZXJhcmNoeS5uZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZ0tleU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSBpbnN0YW5jZW9mIEVudGl0eUFubm90YXRpb24pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGluZ0tleTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSk7Ci0JCWFzc2VydFRydWUodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBFbWJlZGRhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwaW5nS2V5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0tleU1hcHBpbmdDaGFuZ2VJblJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQl0eXBlUmVzb3VyY2Uuc2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdLZXlNYXBwaW5nQ2hhbmdlSW5SZXNvdXJjZU1vZGVsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCXR5cGVSZXNvdXJjZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNNYXBwZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50VHlwZSgpLmlzTWFwcGVkKCkpOwotCQkKLQkJamF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwkKLQkJYXNzZXJ0RmFsc2UoamF2YVBlcnNpc3RlbnRUeXBlKCkuaXNNYXBwZWQoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkQW5kTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscygxLCBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXNTaXplMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRBbmRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTmFtZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIikpOwotCQlhc3NlcnROdWxsKGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJmb28iKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVOYW1lZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKTsKLQkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0TnVsbChqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZm9vIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVuYW1lQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgdGVzdFR5cGUgPSBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgaWRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgbmFtZUF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQkKLQkJSUZpZWxkIGlkRmllbGQgPSB0ZXN0VHlwZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGaWVsZCgiaWQiKTsKLQkJaWRGaWVsZC5yZW5hbWUoImlkMiIsIGZhbHNlLCBudWxsKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVBdHRyaWJ1dGUyID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGlkMkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCi0JCWFzc2VydE5vdFNhbWUoaWRBdHRyaWJ1dGUsIGlkMkF0dHJpYnV0ZSk7Ci0JCWFzc2VydEVxdWFscygiaWQyIiwgaWQyQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lQXR0cmlidXRlLCBuYW1lQXR0cmlidXRlMik7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG5hbWVBdHRyaWJ1dGUyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyZW50UGVyc2lzdGVudFR5cGVHZW5lcmljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RHZW5lcmljRW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RHZW5lcmljTWFwcGVkU3VwZXJjbGFzcygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5FbnRpdHkxIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRW50aXR5MiIpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuRW50aXR5MSIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRQYXJlbnRQZXJzaXN0ZW50VHlwZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygidGVzdC5FbnRpdHkyIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldFBhcmVudFBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEdlbmVyaWNFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyBFbnRpdHkxICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyBFbnRpdHkyPEludGVnZXI+IHt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW50aXR5MS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RHZW5lcmljTWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIEVudGl0eTI8Sz4ge30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbnRpdHkyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhCmluZGV4IGI0MDMwMDYuLmM4MGMwOGEgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuamF2YQpAQCAtMjUsMjYgKzI1LDggQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRSA9ICJNWV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiI7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9ERUZJTklUSU9OID0gIk1ZX0NPTFVNTl9ERUZJTklUSU9OIjsKIAotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVJZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUHJpbWFyeUtleUpvaW5Db2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVJZEFubm90YXRpb24oKTsKLQkJCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTYyLDExICs0NCw3IEBACiAJCX0pOwogCX0KIAotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC05MywxNSArNzEsMTUgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRSwgc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCQogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW5SZXNvdXJjZSA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7CiAJCQogCQlwa0pvaW5Db2x1bW5SZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKKwkJc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKIAl9CiAJCkBAIC0xMDksNyArODcsNyBAQAogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOworCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBwa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7CiAJfQogCkBAIC0xMTcsMTMgKzk1LDEzIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKIAkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7CiAJCQogCQkvL3JlbW92ZSBASWQgYW5ub3RhdGlvbgotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKIAkJaWRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAKIAkJYXNzZXJ0TnVsbChzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7CkBAIC0xMzMsNyArMTExLDcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscyhQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKIAl9CiAKQEAgLTE0MSwxMiArMTE5LDEyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKIAkJCiAJCXNwZWNpZmllZFBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKIAkJCiAJCWFzc2VydEVxdWFscygiZm9vIiwgcGtKb2luQ29sdW1uLmdldE5hbWUoKSk7CkBAIC0xNjEsMTAgKzEzOSwxMCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKIAkJYXNzZXJ0TnVsbChzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7CiAJCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKENPTFVNTl9ERUZJTklUSU9OKTsKIAkJCkBAIC0xNzYsMTcgKzE1NCwxNyBAQAogCiAJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7CiAJCQotCQlhc3NlcnRFcXVhbHMoMCwgamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CiAJCXNwZWNpZmllZFBrSm9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJmb28iKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKIAkJCiAJCWFzc2VydEVxdWFscygiZm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CkBAIC0yMDAsMTQgKzE3OCwxNCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CiAJCWFzc2VydE51bGwoc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW5SZXNvdXJjZSA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7CiAJCQogCQlwa0pvaW5Db2x1bW5SZXNvdXJjZS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCXNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwogCX0KIAkKQEAgLTIxNSw3ICsxOTMsNyBAQAogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOworCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBwa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwogCX0KIAkKQEAgLTIyMywxNCArMjAxLDE0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKIAkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwogCQkKIAkJCiAJCS8vcmVtb3ZlIEBJZCBhbm5vdGF0aW9uCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBpZEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwogCQlpZEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAogCQlhc3NlcnROdWxsKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CkBAIC0yNDAsMTIgKzIxOCwxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW5SZXNvdXJjZSA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7CiAJCQogCQlwa0pvaW5Db2x1bW5SZXNvdXJjZS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRk9PIik7CiAJCQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKIAl9CiAKQEAgLTI1MywxMiArMjMxLDEyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKIAkJCiAJCXNwZWNpZmllZFBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiZm9vIik7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBwa0pvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CkBAIC0yNzQsMTkgKzI1MiwxOSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CiAJCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5pc1ZpcnR1YWwoKSk7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7CisJCWdldEphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKKwkJYXNzZXJ0VHJ1ZShnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkuaXNWaXJ0dWFsKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0SXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOwogCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW4uaXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSk7CiAJfQogCQpAQCAtMjk0LDcgKzI3Miw3IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKKwkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm5leHQoKTsKIAkJYXNzZXJ0TnVsbChzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0RGJDb2x1bW4oKSk7CiAJfQogCQpAQCAtMzAyLDE1ICsyODAsMTUgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXREYlJlZmVyZW5jZWRDb2x1bW4oKSk7CisJCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFJlZmVyZW5jZWREYkNvbHVtbigpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdERiVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpOwogCQlhc3NlcnROdWxsKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXREYlRhYmxlKCkpOwogCX0KIApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVF1ZXJ5SGludFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUXVlcnlIaW50VGVzdHMuamF2YQppbmRleCBjOGMxNDNhLi5jZTRlNGQxIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUXVlcnlIaW50VGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUXVlcnlIaW50VGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0yMCwzMiArMjAsMTIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBKYXZhUXVlcnlIaW50VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIlFVRVJZX05BTUUiOwotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU5hbWVkUXVlcnlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVF1ZXJ5SGludEFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTmFtZWRRdWVyeSIsIAotCQkJIlN0cmluZyBuYW1lKCk7IiArCi0JCQkiU3RyaW5nIHF1ZXJ5KCk7IiArCi0JCQkiUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVRdWVyeUhpbnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlF1ZXJ5SGludCIsIAotCQkJIlN0cmluZyBuYW1lKCk7IiArCi0JCQkiU3RyaW5nIHZhbHVlKCk7Iik7CQkKLQl9CiAJCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbigpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02OSwxMCArNDksMTAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJUXVlcnlIaW50IHF1ZXJ5SGludCA9IGVudGl0eS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCkuaGludHMoKS5uZXh0KCk7CisJCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CisJCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCkuaGludHMoKS5uZXh0KCk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVF1ZXJ5SGludEFubm90YXRpb24gamF2YVF1ZXJ5SGludCA9ICgoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLmhpbnRzKCkubmV4dCgpOwogCQkKIAkJYXNzZXJ0TnVsbChqYXZhUXVlcnlIaW50LmdldE5hbWUoKSk7CkBAIC04NiwxNyArNjYsMTcgQEAKIAkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAogCQlqYXZhUXVlcnlIaW50LnNldE5hbWUobnVsbCk7CiAJCWFzc2VydE51bGwoamF2YVF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5Lm5hbWVkUXVlcmllcygpLm5leHQoKS5oaW50c1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCkuaGludHNTaXplKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlRdWVyeUhpbnQgcXVlcnlIaW50ID0gZW50aXR5Lm5hbWVkUXVlcmllcygpLm5leHQoKS5oaW50cygpLm5leHQoKTsKKwkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKKwkJUXVlcnlIaW50IHF1ZXJ5SGludCA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkUXVlcmllcygpLm5leHQoKS5oaW50cygpLm5leHQoKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJUXVlcnlIaW50QW5ub3RhdGlvbiBqYXZhUXVlcnloaW50ID0gKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuaGludHMoKS5uZXh0KCk7CiAJCQogCQlhc3NlcnROdWxsKGphdmFRdWVyeWhpbnQuZ2V0TmFtZSgpKTsKQEAgLTExNywxMCArOTcsMTAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJRW50aXR5IGVudGl0eSA9IGphdmFFbnRpdHkoKTsKLQkJUXVlcnlIaW50IHF1ZXJ5SGludCA9IGVudGl0eS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCkuaGludHMoKS5uZXh0KCk7CisJCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CisJCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKS5uZXh0KCkuaGludHMoKS5uZXh0KCk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVF1ZXJ5SGludEFubm90YXRpb24gamF2YVF1ZXJ5aGludCA9ICgoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLmhpbnRzKCkubmV4dCgpOwogCQkKIAkJYXNzZXJ0TnVsbChqYXZhUXVlcnloaW50LmdldFZhbHVlKCkpOwpAQCAtMTM0LDE3ICsxMTQsMTcgQEAKIAkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAogCQlqYXZhUXVlcnloaW50LnNldFZhbHVlKG51bGwpOwogCQlhc3NlcnROdWxsKGphdmFRdWVyeWhpbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHkubmFtZWRRdWVyaWVzKCkubmV4dCgpLmhpbnRzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkUXVlcmllcygpLm5leHQoKS5oaW50c1NpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlFbnRpdHkgZW50aXR5ID0gamF2YUVudGl0eSgpOwotCQlRdWVyeUhpbnQgcXVlcnlIaW50ID0gZW50aXR5Lm5hbWVkUXVlcmllcygpLm5leHQoKS5oaW50cygpLm5leHQoKTsKKwkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKKwkJUXVlcnlIaW50IHF1ZXJ5SGludCA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkUXVlcmllcygpLm5leHQoKS5oaW50cygpLm5leHQoKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJUXVlcnlIaW50QW5ub3RhdGlvbiBqYXZhUXVlcnloaW50ID0gKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuaGludHMoKS5uZXh0KCk7CiAJCQogCQlhc3NlcnROdWxsKGphdmFRdWVyeWhpbnQuZ2V0VmFsdWUoKSk7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhU2Vjb25kYXJ5VGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVNlY29uZGFyeVRhYmxlVGVzdHMuamF2YQppbmRleCA3ZDc1YmZjLi4zNGU2ZjdjIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhU2Vjb25kYXJ5VGFibGVUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFTZWNvbmRhcnlUYWJsZVRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTksNDQgKzE5LDIzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlY29uZGFyeVRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSmF2YVNlY29uZGFyeVRhYmxlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gIk1ZX1RBQkxFIjsKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWQiLCAiIik7CQkKLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJTZWNvbmRhcnlUYWJsZSIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiU2Vjb25kYXJ5VGFibGVzIiwgIlNlY29uZGFyeVRhYmxlW10gdmFsdWUoKTsiKTsJCQotCX0KLQkKKwogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC03NSw5ICs1NCw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTAyLDcgKzc4LDcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CisJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJfQogCQpAQCAtMTEwLDcgKzg2LDcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKKwkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwogCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldERlZmF1bHROYW1lKCkpOwogCX0KIAkKQEAgLTExOCw3ICs5NCw3IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CisJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7CiAJfQogCkBAIC0xMjYsMTIgKzEwMiwxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKKwkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwogCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKIAkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGdldEphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKIAkJCiAJCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGUuZ2V0TmFtZSgpKTsKQEAgLTE0MSwxMiArMTE3LDEyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOworCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CiAJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMCwgamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKIAl9CiAJCkBAIC0xNTQsMjMgKzEzMCwyMyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwogCQl0YWJsZS5zZXROYW1lKCJmb28iKTsKIAkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGdldEphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUZyb21TcGVjaWZpZWRDYXRhbG9nQ2hhbmdlSW5SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlMaXN0SXRlcmF0b3I8U2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uPiBzZWNvbmRhcnlUYWJsZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2VzLm5leHQoKS5zZXRDYXRhbG9nKCJmb28iKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMubmV4dCgpLnNldENhdGFsb2coImJhciIpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOworCQkoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMubmV4dCgpKS5zZXRDYXRhbG9nKCJmb28iKTsKKwkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzLm5leHQoKSkuc2V0Q2F0YWxvZygiYmFyIik7CiAJCQotCQlMaXN0SXRlcmF0b3I8U2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRzYmxlcyA9IGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VHNibGVzID0gZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNlY29uZGFyeVRzYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKIAkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBzZWNvbmRhcnlUc2JsZXMubmV4dCgpLmdldFNwZWNpZmllZENhdGFsb2coKSk7CiAJfQpAQCAtMTc5LDEyICsxNTUsMTIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZXMoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUxpc3RJdGVyYXRvcjxTZWNvbmRhcnlUYWJsZUFubm90YXRpb24+IHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMubmV4dCgpLnNldFNjaGVtYSgiZm9vIik7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2VzLm5leHQoKS5zZXRTY2hlbWEoImJhciIpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOworCQkoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMubmV4dCgpKS5zZXRTY2hlbWEoImZvbyIpOworCQkoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMubmV4dCgpKS5zZXRTY2hlbWEoImJhciIpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPFNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUc2JsZXMgPSBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCk7CisJCUxpc3RJdGVyYXRvcjxKYXZhU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRzYmxlcyA9IGdldEphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZWNvbmRhcnlUc2JsZXMubmV4dCgpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBzZWNvbmRhcnlUc2JsZXMubmV4dCgpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKIAl9CkBAIC0xOTMsMzQgKzE2OSwzNCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwogCQkKIAkJdGFibGUuc2V0Q2F0YWxvZygibXlDYXRhbG9nIik7CiAJCQotCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpLmdldENhdGFsb2coKSk7CisJCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIGdldEphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuZ2V0Q2F0YWxvZygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKIAkJCi0JCWphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygibXlDYXRhbG9nIik7CisJCWdldEphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygibXlDYXRhbG9nIik7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJU2Vjb25kYXJ5VGFibGUgdGFibGUgPSBqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOworCQlTZWNvbmRhcnlUYWJsZSB0YWJsZSA9IGdldEphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CiAJCXRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIm15Q2F0YWxvZyIpOwogCQl0YWJsZS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIHRhYmxlUmVzb3VyY2UuZ2V0Q2F0YWxvZygpKTsKQEAgLTIzMywzNCArMjA5LDM0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKIAkJCiAJCXRhYmxlUmVzb3VyY2Uuc2V0U2NoZW1hKCJteVNjaGVtYSIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIGphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U2NoZW1hIiwgamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXRTY2hlbWEoKSk7CisJCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIGdldEphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuZ2V0U2NoZW1hKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpLmdldERlZmF1bHRTY2hlbWEoKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwogCQkKLQkJamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIm15U2NoZW1hIik7CisJCWdldEphdmFFbnRpdHkoKS5zZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJteVNjaGVtYSIpOwogCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpLmdldERlZmF1bHRTY2hlbWEoKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVNlY29uZGFyeVRhYmxlIHRhYmxlID0gamF2YUVudGl0eSgpLnNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKKwkJU2Vjb25kYXJ5VGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuc2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwogCQl0YWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoIm15U2NoZW1hIik7CiAJCXRhYmxlLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKIAkJCiAJCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCB0YWJsZVJlc291cmNlLmdldFNjaGVtYSgpKTsKQEAgLTI3MywxMiArMjQ5LDEyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CisJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKIAkJTGlzdEl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IHNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwogCQkKIAkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwogCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwogCiAJCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZApAQCAtMzE3LDcgKzI5Myw3IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CisJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKDAsIHNlY29uZGFyeVRhYmxlLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7CiAJCiAJCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwpAQCAtMzMxLDcgKzMwNyw3IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CisJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKIAkJLy9qdXN0IHRoZSBkZWZhdWx0IHBrSm9pbkNvbHVtbiwgc28gMQogCQlhc3NlcnRFcXVhbHMoMSwgc2Vjb25kYXJ5VGFibGUucHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKIAkKQEAgLTM0Nyw3ICszMjMsNyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOworCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CiAJCWFzc2VydE5vdE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwogCQogCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKQEAgLTM2MSwxNCArMzM3LDE0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CisJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKIAkJUHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdFBrSm9pbkNvbHVtbiA9IHNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOyAKIAkJYXNzZXJ0Tm90TnVsbChkZWZhdWx0UGtKb2luQ29sdW1uKTsJCiAJCWFzc2VydEVxdWFscygiaWQiLCBkZWZhdWx0UGtKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoImlkIiwgZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CiAJCQogCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKIAkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwkJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0UGtKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKQEAgLTM4Miw3ICszNTgsNyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOworCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CiAJCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKIAkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CkBAIC0zOTIsNyArMzY4LDcgQEAKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwogCQlJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IHBrSm9pbkNvbHVtbnMgPSB0YWJsZVJlc291cmNlLnBrSm9pbkNvbHVtbnMoKTsKIAkJCkBAIC00MDYsNyArMzgyLDcgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKKwkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwogCiAJCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKQEAgLTQxNyw3ICszOTMsNyBAQAogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKIAkJSXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zID0gdGFibGVSZXNvdXJjZS5wa0pvaW5Db2x1bW5zKCk7CiAJCQpAQCAtNDMwLDEzICs0MDYsMTMgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKKwkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwogCiAJCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKIAkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKIAkJCiAJCWFzc2VydEVxdWFscygzLCB0YWJsZVJlc291cmNlLnBrSm9pbkNvbHVtbnNTaXplKCkpOwpAQCAtNDc3LDcgKzQ1Myw3IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CisJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKIAkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CiAJCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwogCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKQEAgLTQ4Nyw3ICs0NjMsNyBAQAogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKIAkJSXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zID0gdGFibGVSZXNvdXJjZS5wa0pvaW5Db2x1bW5zKCk7CiAJCQpAQCAtNTA4LDEzICs0ODQsMTMgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKKwkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwogCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UGtKb2luQ29sdW1uID0gc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBkZWZhdWx0UGtKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwogCiAJCQogCQkvL3JlbW92ZSBASWQgYW5ub3RhdGlvbgotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKIAkJaWRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAKIAkJYXNzZXJ0TnVsbChkZWZhdWx0UGtKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwpAQCAtNTIzLDEyICs0OTksMTIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKKwkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwogCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UGtKb2luQ29sdW1uID0gc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBkZWZhdWx0UGtKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKIAkJCiAJCS8vcmVtb3ZlIEBJZCBhbm5vdGF0aW9uCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBpZEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwogCQlpZEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAogCQlhc3NlcnROdWxsKGRlZmF1bHRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwpAQCAtNTM3LDcgKzUxMyw3IEBACiAJcHVibGljIHZvaWQgdGVzdFByaW1hcnlLZXlKb2luQ29sdW1uSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKKwkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwogCQkKIAkJYXNzZXJ0VHJ1ZShzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKS5pc1ZpcnR1YWwoKSk7CiAJCQpAQCAtNTUzLDEyICs1MjksMTIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKKwkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwogCiAJCUxpc3RJdGVyYXRvcjxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwogCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwogCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7CiAJCXNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImZvbyIpOwogCQlzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJiYXIiKTsKQEAgLTU3NCwxMSArNTUwLDExIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CisJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKIAogCQlhc3NlcnRFcXVhbHMoMCwgIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwogCQlzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKIAkJc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7CkBAIC01OTAsMTIgKzU2NiwxMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOworCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CiAJCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7CiAJCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7CiAJCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpOwogCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7CiAJCQpAQCAtNjA5LDEyICs1ODUsMTIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKKwkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwogCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwogCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwogCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VQZXJzaXN0ZW50VHlwZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlUGVyc2lzdGVudFR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKTsKIAkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwogCQkKQEAgLTYyOCwxMiArNjA0LDEyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CisJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKIAkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKIAkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKIAkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoMywgc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKQEAgLTY3MiwxMiArNjQ4LDEyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CisJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLm5leHQoKTsKIAkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKIAkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKIAkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoMywgc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKQEAgLTcxMSw4ICs2ODcsOCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBqYXZhRW50aXR5KCkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlUGVyc2lzdGVudFR5cGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7CiAJCiAJCXNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFTZXF1ZW5jZUdlbmVyYXRvclRlc3RzLmphdmEKaW5kZXggY2JjMWRhMi4uZjc1ODk3MSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTIxLDI2ICsyMSwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIEphdmFTZXF1ZW5jZUdlbmVyYXRvclRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0VfR0VORVJBVE9SX05BTUUgPSAiTVlfU0VRVUVOQ0VfR0VORVJBVE9SIjsKIAkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiU2VxdWVuY2VHZW5lcmF0b3IiLCAKLQkJCSJTdHJpbmcgbmFtZSgpOyIgKwotCQkJIlN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJImludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDA7ICIgKwotCQkJImludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Iik7CQkKLQl9CiAKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwotCQorCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNjcsMzIgKzU0LDMyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKFNFUVVFTkNFX0dFTkVSQVRPUl9OQU1FLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXROYW1lKCkpOworCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoU0VRVUVOQ0VfR0VORVJBVE9SX05BTUUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7CiAKIAkJLy9jaGFuZ2UgcmVzb3VyY2UgbW9kZWwgc2VxdWVuY2VHZW5lcmF0b3IgbmFtZSwgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CiAJCQogCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXROYW1lKCJmb28iKTsKIAkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKFNFUVVFTkNFX0dFTkVSQVRPUl9OQU1FLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXROYW1lKCkpOworCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoU0VRVUVOQ0VfR0VORVJBVE9SX05BTUUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7CiAKLQkJaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0TmFtZSgiZm9vIik7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKIAkJCiAJCWFzc2VydEVxdWFscygiZm9vIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKQEAgLTEwMiwxNSArODksMTUgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoU0VRVUVOQ0VfR0VORVJBVE9SX05BTUUsIGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7CisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyhTRVFVRU5DRV9HRU5FUkFUT1JfTkFNRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0TmFtZSgpKTsKIAotCQlpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKG51bGwpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKG51bGwpOwogCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CisJCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CiAJCQogCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yKTsKQEAgLTEyMCw0OCArMTA3LDQ4IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKFNlcXVlbmNlR2VuZXJhdG9yLkRFRkFVTFRfSU5JVElBTF9WQUxVRSwgaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKFNlcXVlbmNlR2VuZXJhdG9yLkRFRkFVTFRfSU5JVElBTF9WQUxVRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0SW5pdGlhbFZhbHVlKCkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwkKIAkJCiAJCXNlcXVlbmNlR2VuZXJhdG9yLnNldEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoODIpKTsKIAkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODIpLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODIpLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyg4MiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0SW5pdGlhbFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgyKSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKIAotCQlhc3NlcnRFcXVhbHMoU2VxdWVuY2VHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoU2VxdWVuY2VHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkpOwogCQkKLQkJaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZig4MikpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDgyKSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoU2VxdWVuY2VHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgyKSwgaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoU2VxdWVuY2VHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgyKSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDIwKSk7CisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoMjApKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwkKIAkJCiAJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjApLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRJbml0aWFsVmFsdWUoKSk7CiAJCQotCQlpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUobnVsbCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShudWxsKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpKTsKIAl9CiAJCkBAIC0xNjksNDkgKzE1Niw0OSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKIAkJCi0JCWFzc2VydEVxdWFscyhHZW5lcmF0b3IuREVGQVVMVF9BTExPQ0FUSU9OX1NJWkUsIGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldEFsbG9jYXRpb25TaXplKCkpOworCQlhc3NlcnRFcXVhbHMoR2VuZXJhdG9yLkRFRkFVTFRfQUxMT0NBVElPTl9TSVpFLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCiAJCQogCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMjApKTsKIAkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjApLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyMCksIGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMjAsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldEFsbG9jYXRpb25TaXplKCkpOworCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDIwKSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0QWxsb2NhdGlvblNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CiAKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRvci5ERUZBVUxUX0FMTE9DQVRJT05fU0laRSwgaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCkpOworCQlhc3NlcnRFcXVhbHMoR2VuZXJhdG9yLkRFRkFVTFRfQUxMT0NBVElPTl9TSVpFLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXREZWZhdWx0QWxsb2NhdGlvblNpemUoKSk7CiAJCQotCQlpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMjApKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDIwKSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdG9yLkRFRkFVTFRfQUxMT0NBVElPTl9TSVpFLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXREZWZhdWx0QWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjApLCBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRvci5ERUZBVUxUX0FMTE9DQVRJT05fU0laRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCkpOworCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDIwKSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDI1KSk7CisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigyNSkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CQogCQkKIAkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyNSksIHNlcXVlbmNlR2VuZXJhdG9yLmdldEFsbG9jYXRpb25TaXplKCkpOwogCQkKLQkJaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0TmFtZShudWxsKTsKLQkJaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUobnVsbCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKG51bGwpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUikpOwogCX0KIAkKQEAgLTIyMSw0OCArMjA4LDQ4IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwogCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldFNlcXVlbmNlTmFtZSgpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCiAJCQogCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTZXF1ZW5jZU5hbWUoIm15U2VxdWVuY2VOYW1lIik7CiAJCQotCQlhc3NlcnRFcXVhbHMoIm15U2VxdWVuY2VOYW1lIiwgaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U2VxdWVuY2VOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U2VxdWVuY2VOYW1lIiwgaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U2VxdWVuY2VOYW1lIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U2VxdWVuY2VOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U2VxdWVuY2VOYW1lIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNlcXVlbmNlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKIAotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldERlZmF1bHRTZXF1ZW5jZU5hbWUoKSk7CisJCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFNlcXVlbmNlTmFtZSgpKTsKIAkJCi0JCWlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgibXlTZXF1ZW5jZU5hbWUiKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCJteVNlcXVlbmNlTmFtZSIpOwogCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2VxdWVuY2VOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U2VxdWVuY2VOYW1lIiwgaWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkpOworCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldERlZmF1bHRTZXF1ZW5jZU5hbWUoKSk7CisJCWFzc2VydEVxdWFscygibXlTZXF1ZW5jZU5hbWUiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgibXlTZXF1ZW5jZU5hbWUiKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCJteVNlcXVlbmNlTmFtZSIpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CQogCQkKIAkJYXNzZXJ0RXF1YWxzKCJteVNlcXVlbmNlTmFtZSIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNlcXVlbmNlTmFtZSgpKTsKIAkJCi0JCWlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNlcXVlbmNlTmFtZShudWxsKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0TmFtZShudWxsKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKG51bGwpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUikpOwogCX0KIApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRhYmxlR2VuZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUYWJsZUdlbmVyYXRvclRlc3RzLmphdmEKaW5kZXggMzJjMGQzYS4uMWExZThlMSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRhYmxlR2VuZXJhdG9yVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVGFibGVHZW5lcmF0b3JUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTMxLDM3ICszMSwxMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIEphdmFUYWJsZUdlbmVyYXRvclRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfR0VORVJBVE9SX05BTUUgPSAiTVlfVEFCTEVfR0VORVJBVE9SIjsKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGFibGVHZW5lcmF0b3IiLCAKLQkJCSJTdHJpbmcgbmFtZSgpOyAiICsKLQkJCSJTdHJpbmcgdGFibGUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJIlN0cmluZyBwa0NvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyB2YWx1ZUNvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyBwa0NvbHVtblZhbHVlKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwOyAiICsKLQkJCSJpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOyAiICsKLQkJCSJVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlVuaXF1ZUNvbnN0cmFpbnQiLCAKLQkJCSJTdHJpbmdbXSBjb2x1bW5OYW1lcygpOyAiKTsJCQotCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTg4LDMyICs2MywzMiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9HRU5FUkFUT1JfTkFNRSwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0TmFtZSgpKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKFRBQkxFX0dFTkVSQVRPUl9OQU1FLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwogCiAJCS8vY2hhbmdlIHJlc291cmNlIG1vZGVsIHRhYmxlR2VuZXJhdG9yIG5hbWUsIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwogCQkKIAkJdGFibGVHZW5lcmF0b3Iuc2V0TmFtZSgiZm9vIik7CiAJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0TmFtZSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9HRU5FUkFUT1JfTkFNRSwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0TmFtZSgpKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKFRBQkxFX0dFTkVSQVRPUl9OQU1FLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwogCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXROYW1lKCJmb28iKTsKIAkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CiAJCQogCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7CkBAIC0xMjMsMTUgKzk4LDE1IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX0dFTkVSQVRPUl9OQU1FLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXROYW1lKCkpOworCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoVEFCTEVfR0VORVJBVE9SX05BTUUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7CiAKLQkJaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZShudWxsKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZShudWxsKTsKIAkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwogCQkKIAkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvcik7CkBAIC0xNDEsNDggKzExNiw0OCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKIAkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0Q2F0YWxvZygpKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0Q2F0YWxvZygpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCiAJCQogCQl0YWJsZUdlbmVyYXRvci5zZXRDYXRhbG9nKCJteUNhdGFsb2ciKTsKIAkJCi0JCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldENhdGFsb2coKSk7CisJCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwogCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CiAJCQotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJteUNhdGFsb2ciKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygibXlDYXRhbG9nIik7CiAJCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CisJCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZENhdGFsb2coIm15Q2F0YWxvZyIpOworCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJteUNhdGFsb2ciKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKIAkJCiAJCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgdGFibGVHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKIAkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKSk7CiAJfQogCkBAIC0xOTAsNzYgKzE2NSw3NiBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKIAkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U2NoZW1hKCkpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTY2hlbWEoKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQogCQkKIAkJdGFibGVHZW5lcmF0b3Iuc2V0U2NoZW1hKCJteVNjaGVtYSIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CiAKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2NoZW1hKCkpOworCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7CiAJCQotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIm15U2NoZW1hIik7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNjaGVtYSgibXlTY2hlbWEiKTsKIAkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2NoZW1hKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U2NoZW1hIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFNjaGVtYUZyb21QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKIAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7CiAJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKIAkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwogCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwogCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2NoZW1hKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7CisJCWFzc2VydEVxdWFscygiQkFSIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAkJCiAJCW9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgiWE1MX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAotCQllbnRpdHlNYXBwaW5ncygpLnJlbW92ZU9ybVBlcnNpc3RlbnRUeXBlKDApOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnJlbW92ZVBlcnNpc3RlbnRUeXBlKDApOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJLy9kZWZhdWx0IHNjaGVtYSB0YWtlbiBmcm9tIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgbm90IGVudGl0eS1tYXBwaW5ncyBzaW5jZSB0aGUgZW50aXR5IGlzIG5vdCBpbiBhbiBvcm0ueG1sIGZpbGUKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNjaGVtYSgibXlTY2hlbWEiKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJteVNjaGVtYSIpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQogCQkKIAkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIHRhYmxlR2VuZXJhdG9yLmdldFNjaGVtYSgpKTsKIAkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZShudWxsKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUikpOwogCX0KIAkKQEAgLTI2Nyw0OCArMjQyLDQ4IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwogCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFBrQ29sdW1uTmFtZSgpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCiAJCQogCQl0YWJsZUdlbmVyYXRvci5zZXRQa0NvbHVtbk5hbWUoIm15UGtDb2x1bW5OYW1lIik7CiAJCQotCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5OYW1lIiwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0UGtDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5OYW1lIiwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5OYW1lIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0UGtDb2x1bW5OYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5OYW1lIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKIAotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRQa0NvbHVtbk5hbWUoKSk7CisJCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpKTsKIAkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgibXlQa0NvbHVtbk5hbWUiKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCJteVBrQ29sdW1uTmFtZSIpOwogCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0UGtDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5OYW1lIiwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCkpOworCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRQa0NvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscygibXlQa0NvbHVtbk5hbWUiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgibXlQa0NvbHVtbk5hbWUiKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCJteVBrQ29sdW1uTmFtZSIpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQogCQkKIAkJYXNzZXJ0RXF1YWxzKCJteVBrQ29sdW1uTmFtZSIsIHRhYmxlR2VuZXJhdG9yLmdldFBrQ29sdW1uTmFtZSgpKTsKIAkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFBrQ29sdW1uTmFtZShudWxsKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZShudWxsKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKG51bGwpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUikpOwogCX0JCiAJCkBAIC0zMTYsNDggKzI5MSw0OCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKIAkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQogCQkKIAkJdGFibGVHZW5lcmF0b3Iuc2V0VmFsdWVDb2x1bW5OYW1lKCJteVZhbHVlQ29sdW1uTmFtZSIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVZhbHVlQ29sdW1uTmFtZSIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVZhbHVlQ29sdW1uTmFtZSIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVZhbHVlQ29sdW1uTmFtZSIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFZhbHVlQ29sdW1uTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVZhbHVlQ29sdW1uTmFtZSIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRWYWx1ZUNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CiAKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKCkpOworCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRWYWx1ZUNvbHVtbk5hbWUoKSk7CiAJCQotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoIm15VmFsdWVDb2x1bW5OYW1lIik7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgibXlWYWx1ZUNvbHVtbk5hbWUiKTsKIAkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVZhbHVlQ29sdW1uTmFtZSIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpKTsKKwkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VmFsdWVDb2x1bW5OYW1lIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoIm15VmFsdWVDb2x1bW5OYW1lIik7CisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgibXlWYWx1ZUNvbHVtbk5hbWUiKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKIAkJCiAJCWFzc2VydEVxdWFscygibXlWYWx1ZUNvbHVtbk5hbWUiLCB0YWJsZUdlbmVyYXRvci5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7CiAJCQotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUobnVsbCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZShudWxsKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpKTsKIAl9CiAJCkBAIC0zNjUsNDggKzM0MCw0OCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKIAkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCiAJCQogCQl0YWJsZUdlbmVyYXRvci5zZXRQa0NvbHVtblZhbHVlKCJteVBrQ29sdW1uVmFsdWUiKTsKIAkJCi0JCWFzc2VydEVxdWFscygibXlQa0NvbHVtblZhbHVlIiwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVBrQ29sdW1uVmFsdWUiLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5WYWx1ZSIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFBrQ29sdW1uVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygibXlQa0NvbHVtblZhbHVlIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRQa0NvbHVtblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwogCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoKSk7CisJCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoKSk7CiAJCQotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCJteVBrQ29sdW1uVmFsdWUiKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgibXlQa0NvbHVtblZhbHVlIik7CiAJCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRQa0NvbHVtblZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5WYWx1ZSIsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSk7CisJCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygibXlQa0NvbHVtblZhbHVlIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoIm15UGtDb2x1bW5WYWx1ZSIpOworCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCJteVBrQ29sdW1uVmFsdWUiKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKIAkJCiAJCWFzc2VydEVxdWFscygibXlQa0NvbHVtblZhbHVlIiwgdGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKIAkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUobnVsbCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUobnVsbCk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKSk7CiAJfQogCQpAQCAtNDE0LDQ4ICszODksNDggQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CiAJCQotCQlhc3NlcnRFcXVhbHMoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRJbml0aWFsVmFsdWUoKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQogCQkKIAkJdGFibGVHZW5lcmF0b3Iuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZig4MikpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MiksIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldEluaXRpYWxWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MiksIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDgyLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRJbml0aWFsVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODIpLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwogCi0JCWFzc2VydEVxdWFscyhUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0lOSVRJQUxfVkFMVUUsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRJbml0aWFsVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0lOSVRJQUxfVkFMVUUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRJbml0aWFsVmFsdWUoKSk7CiAJCQotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDgyKSk7CisJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoODIpKTsKIAkJCi0JCWFzc2VydEVxdWFscyhUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0lOSVRJQUxfVkFMVUUsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODIpLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0lOSVRJQUxfVkFMVUUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRJbml0aWFsVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODIpLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoMjApKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigyMCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQogCQkKIAkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyMCksIHRhYmxlR2VuZXJhdG9yLmdldEluaXRpYWxWYWx1ZSgpKTsKIAkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShudWxsKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZShudWxsKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKG51bGwpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUikpOwogCX0KIAkKQEAgLTQ2Myw2NSArNDM4LDY0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRvci5ERUZBVUxUX0FMTE9DQVRJT05fU0laRSwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0QWxsb2NhdGlvblNpemUoKSk7CisJCWFzc2VydEVxdWFscyhHZW5lcmF0b3IuREVGQVVMVF9BTExPQ0FUSU9OX1NJWkUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldEFsbG9jYXRpb25TaXplKCkpOwogCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKIAkJCiAJCXRhYmxlR2VuZXJhdG9yLnNldEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigyMCkpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyMCksIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDIwKSwgaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7CisJCWFzc2VydEVxdWFscygyMCwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0QWxsb2NhdGlvblNpemUoKSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjApLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKIAotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdG9yLkRFRkFVTFRfQUxMT0NBVElPTl9TSVpFLCBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0QWxsb2NhdGlvblNpemUoKSk7CisJCWFzc2VydEVxdWFscyhHZW5lcmF0b3IuREVGQVVMVF9BTExPQ0FUSU9OX1NJWkUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpKTsKIAkJCi0JCWlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigyMCkpOworCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMjApKTsKIAkJCi0JCWFzc2VydEVxdWFscyhHZW5lcmF0b3IuREVGQVVMVF9BTExPQ0FUSU9OX1NJWkUsIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyMCksIGlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOworCQlhc3NlcnRFcXVhbHMoR2VuZXJhdG9yLkRFRkFVTFRfQUxMT0NBVElPTl9TSVpFLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0QWxsb2NhdGlvblNpemUoKSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjApLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMjUpKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDI1KSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCiAJCQogCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDI1KSwgdGFibGVHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKSk7CiAJCQotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShudWxsKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZShudWxsKTsKKwkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUobnVsbCk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKSk7CiAJfQogCQogCiAJcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlR2VuZXJhdG9yKCk7CisJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gKChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKTsKIAogCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludHMoKTsKIAkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQogCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKIAkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7CkBAIC01MzQsMTYgKzUwOCwxNSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlR2VuZXJhdG9yKCk7CisJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gKChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKTsKIAogCQlhc3NlcnRFcXVhbHMoMCwgIHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKIAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQogCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKIAkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7CkBAIC01NTIsMTcgKzUyNSwxNiBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlR2VuZXJhdG9yKCk7CisJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gKChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKTsKIAkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKIAkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKIAkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCiAJCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvckFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKIAkJCkBAIC01NzMsMTcgKzU0NSwxNiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gKChJZE1hcHBpbmcpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0VGFibGVHZW5lcmF0b3IoKTsKKwkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSAoKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpOwogCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwogCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwogCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKIAkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwogCQkKQEAgLTU5NCwxNyArNTY1LDE2IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlR2VuZXJhdG9yKCk7CisJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gKChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKTsKIAkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKIAkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKIAkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCiAJCQogCQlhc3NlcnRFcXVhbHMoMywgdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKQEAgLTY0MCwxNyArNjEwLDE2IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSAoKElkTWFwcGluZykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRUYWJsZUdlbmVyYXRvcigpOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7CiAJCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7CiAJCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7CiAJCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQogCQkKIAkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CkBAIC02ODQsOSArNjUzLDkgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKIAkKIAkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRhYmxlVGVzdHMuamF2YQppbmRleCAxMzRhZWJmLi4yNjJlNDBkIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVGFibGVUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUYWJsZVRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTUsMTIgKzE1LDE1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOwpAQCAtMzAsMjggKzMzLDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSmF2YVRhYmxlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gIk1ZX1RBQkxFIjsKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGFibGUiLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyBzY2hlbWEoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBjcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlVuaXF1ZUNvbnN0cmFpbnQiLCAKLQkJCSJTdHJpbmdbXSBjb2x1bW5OYW1lcygpOyAiKTsJCQotCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02NSw5ICs1Miw2IEBACiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVUYWJsZUFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtOTksNiArODMsMjAgQEAKIAkJfSk7CiAJfQogCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUFic3RyYWN0VGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklOSEVSSVRBTkNFLCBKUEEuSU5IRVJJVEFOQ0VfVFlQRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiYWJzdHJhY3QiKTsKKwkJCX0KKwkJfSk7CisJfQogCiAJCQogCXB1YmxpYyBKYXZhVGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtMTA5LDMyICsxMDcsMzIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lU3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKIAkJCiAJCS8vdGVzdCB0aGF0IHNldHRpbmcgdGhlIGphdmEgZW50aXR5IG5hbWUgd2lsbCBjaGFuZ2UgdGhlIHRhYmxlIGRlZmF1bHQgbmFtZQotCQlqYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lU2luZ2xlVGFibGVJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTQ0LDc1ICsxNDIsNzkgQEAKIAkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydE5vdFNhbWUoamF2YUVudGl0eSgpLCBqYXZhRW50aXR5KCkuZ2V0Um9vdEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGphdmFFbnRpdHkoKS5nZXRSb290RW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJRW50aXR5IGNoaWxkRW50aXR5ID0gKEVudGl0eSkgc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVudGl0eSByb290RW50aXR5ID0gKEVudGl0eSkgc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnROb3RTYW1lKGdldEphdmFFbnRpdHkoKSwgcm9vdEVudGl0eSk7CisJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGNoaWxkRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHJvb3RFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKIAkJCiAJCS8vdGVzdCB0aGF0IHNldHRpbmcgdGhlIHJvb3QgamF2YSBlbnRpdHkgbmFtZSB3aWxsIGNoYW5nZSB0aGUgdGFibGUgZGVmYXVsdCBuYW1lIG9mIHRoZSBjaGlsZAotCQlqYXZhRW50aXR5KCkuZ2V0Um9vdEVudGl0eSgpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOworCQlyb290RW50aXR5LnNldFNwZWNpZmllZE5hbWUoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNoaWxkRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CiAJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CiAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gb3JtRW50aXR5LmdldEphdmFFbnRpdHkoKTsKIAkJCiAJCWFzc2VydE51bGwoamF2YUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7CiAJCQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAkJCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJCQVIiKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAkJCiAJCW9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgiWE1MX1NDSEVNQSIpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwogCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlT3JtUGVyc2lzdGVudFR5cGUoMCk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlUGVyc2lzdGVudFR5cGUoMCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkvL2RlZmF1bHQgc2NoZW1hIHRha2VuIGZyb20gcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBub3QgZW50aXR5LW1hcHBpbmdzIHNpbmNlIHRoZSBlbnRpdHkgaXMgbm90IGluIGFuIG9ybS54bWwgZmlsZQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAotCQlJRmlsZSBmaWxlID0gb3JtUmVzb3VyY2UoKS5nZXRGaWxlKCk7CisJCUlGaWxlIGZpbGUgPSBnZXRPcm1YbWxSZXNvdXJjZSgpLmdldEZpbGUoKTsKIAkJLy9yZW1vdmUgdGhlIG1hcHBpbmcgZmlsZSByZWZlcmVuY2UgZnJvbSB0aGUgcGVyc2lzdGVuY2UueG1sLiAgZGVmYXVsdCBzY2hlbWEgCiAJCS8vc2hvdWxkIHN0aWxsIGNvbWUgZnJvbSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGJlY2F1c2Ugb2YgaW1wbGllZCBtYXBwZWQtZmlsZS1yZWYKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkucmVtb3ZlKG1hcHBpbmdGaWxlUmVmKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5yZW1vdmUobWFwcGluZ0ZpbGVSZWYpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7CiAJCiAJCWZpbGUuZGVsZXRlKHRydWUsIG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldE5hbWVTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0TmFtZSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCWphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOworCQlnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKIAkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlLmdldE5hbWUoKSk7CkBAIC0yMjIsMTEgKzIyNCwxMSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCi0JCWphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CisJCWdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwogCQogCQlhc3NlcnROdWxsKHRhYmxlKTsKQEAgLTIzNiw4NCArMjM4LDg0IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKIAkJdGFibGUuc2V0TmFtZSgiZm9vIik7CiAJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJCiAJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7CiAJCQogCQl0YWJsZS5zZXRDYXRhbG9nKCJteUNhdGFsb2ciKTsKIAkJCi0JCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRDYXRhbG9nKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNwZWNpZmllZENhdGFsb2coKSk7CisJCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwogCQkKLQkJamF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygibXlDYXRhbG9nIik7CisJCWdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZENhdGFsb2coIm15Q2F0YWxvZyIpOwogCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nRnJvbVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwogCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwogCiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IG9ybUVudGl0eS5nZXRKYXZhRW50aXR5KCk7CiAJCQogCQlhc3NlcnROdWxsKGphdmFFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKIAkJCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJGT08iKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRk9PIik7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwogCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFSIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFSIik7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwogCQkKIAkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiWE1MX0NBVEFMT0ciKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CiAKLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVPcm1QZXJzaXN0ZW50VHlwZSgwKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCS8vZGVmYXVsdCBjYXRhbG9nIHRha2VuIGZyb20gcGVyc2lzdGVuY2UtdW5pdGUtZGVmYXVsdHMgbm90IGVudGl0eS1tYXBwaW5ncyBzaW5jZSB0aGUgZW50aXR5IGlzIG5vdCBpbiBhbiBvcm0ueG1sIGZpbGUKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKIAotCQlJRmlsZSBmaWxlID0gb3JtUmVzb3VyY2UoKS5nZXRGaWxlKCk7CisJCUlGaWxlIGZpbGUgPSBnZXRPcm1YbWxSZXNvdXJjZSgpLmdldEZpbGUoKTsKIAkJLy9yZW1vdmUgdGhlIG1hcHBpbmcgZmlsZSByZWZlcmVuY2UgZnJvbSB0aGUgcGVyc2lzdGVuY2UueG1sLiAgZGVmYXVsdCBzY2hlbWEgCiAJCS8vc2hvdWxkIHN0aWxsIGNvbWUgZnJvbSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGJlY2F1c2Ugb2YgaW1wbGllZCBtYXBwZWQtZmlsZS1yZWYKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkucmVtb3ZlKG1hcHBpbmdGaWxlUmVmKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkucmVtb3ZlKG1hcHBpbmdGaWxlUmVmKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKIAkKIAkJZmlsZS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJVGFibGUgdGFibGUgPSBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKKwkJVGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKIAkJdGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygibXlDYXRhbG9nIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJVGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoVGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCB0YWJsZVJlc291cmNlLmdldENhdGFsb2coKSk7CkBAIC0zMjYsMzMgKzMyOCwzMyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7CiAJCQogCQl0YWJsZS5zZXRTY2hlbWEoIm15U2NoZW1hIik7CiAJCQotCQlhc3NlcnRFcXVhbHMoIm15U2NoZW1hIiwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U2NoZW1hIiwgamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U2NoZW1hIiwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U2NoZW1hIiwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJYXNzZXJ0TnVsbChqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOworCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7CiAJCQotCQlqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIm15U2NoZW1hIik7CisJCWdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgibXlTY2hlbWEiKTsKIAkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVRhYmxlIHRhYmxlID0gamF2YUVudGl0eSgpLmdldFRhYmxlKCk7CisJCVRhYmxlIHRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCk7CiAJCXRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgibXlTY2hlbWEiKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlUYWJsZUFubm90YXRpb24gdGFibGVSZXNvdXJjZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoIm15U2NoZW1hIiwgdGFibGVSZXNvdXJjZS5nZXRTY2hlbWEoKSk7CkBAIC0zNjIsMTkgKzM2NCwxOCBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnVuaXF1ZUNvbnN0cmFpbnRzKCk7CisJCUxpc3RJdGVyYXRvcjxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS51bmlxdWVDb25zdHJhaW50cygpOwogCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwogCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlUYWJsZUFubm90YXRpb24gdGFibGVBbm5vdGF0aW9uID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKIAkJdGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiZm9vIik7CiAJCXRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImJhciIpOwogCQkKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKS51bmlxdWVDb25zdHJhaW50cygpOworCQl1bmlxdWVDb25zdHJhaW50cyA9IGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnVuaXF1ZUNvbnN0cmFpbnRzKCk7CiAJCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CkBAIC0zODIsMzEgKzM4MywyOSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMCwgIGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsICBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CiAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24gPSAoVGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwogCQl0YWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKIAkJdGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7CiAJCQotCQlhc3NlcnRFcXVhbHMoMiwgIGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsICBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVRhYmxlIHRhYmxlID0gamF2YUVudGl0eSgpLmdldFRhYmxlKCk7CisJCVRhYmxlIHRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCk7CiAJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7CiAJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7CiAJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJVGFibGVBbm5vdGF0aW9uIHRhYmxlQW5ub3RhdGlvbiA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7CiAJCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKIAkJCkBAIC00MTcsMTYgKzQxNiwxNSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVRhYmxlIHRhYmxlID0gamF2YUVudGl0eSgpLmdldFRhYmxlKCk7CisJCVRhYmxlIHRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCk7CiAJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7CiAJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7CiAJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJVGFibGVBbm5vdGF0aW9uIHRhYmxlQW5ub3RhdGlvbiA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7CiAJCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKIAkJCkBAIC00MzcsMTYgKzQzNSwxNSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJVGFibGUgdGFibGUgPSBqYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKKwkJVGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKIAkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKIAkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKIAkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlUYWJsZUFubm90YXRpb24gdGFibGVBbm5vdGF0aW9uID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKIAkJCiAJCWFzc2VydEVxdWFscygzLCB0YWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwpAQCAtNDgyLDE2ICs0NzksMTUgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlUYWJsZSB0YWJsZSA9IGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpOworCQlUYWJsZSB0YWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpOwogCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwogCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwogCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24gPSAoVGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CkBAIC01MjUsOCArNTIxLDggQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAotCQlUYWJsZSB0YWJsZSA9IGphdmFFbnRpdHkoKS5nZXRUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCVRhYmxlIHRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJVGFibGVBbm5vdGF0aW9uIHRhYmxlQW5ub3RhdGlvbiA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7CiAJCiAJCXRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwpAQCAtNTY5LDQgKzU2NSwzNSBAQAogCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7CiAJCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7CiAJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdEVudGl0eUdldERlZmF1bHROYW1lVGFibGVQZXJDbGFzc0luaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZUFic3RyYWN0VGVzdEVudGl0eSgpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCUVudGl0eSBjb25jcmV0ZUVudGl0eSA9IChFbnRpdHkpIHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgY29uY3JldGVFbnRpdHkuZ2V0TmFtZSgpKTsKKwkJCisJCUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChFbnRpdHkpIHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBhYnN0cmFjdEVudGl0eS5nZXROYW1lKCkpOworCQkKKwkJCisJCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBhYnN0cmFjdEVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGNvbmNyZXRlRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQkKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwkJCisJCQorCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgY29uY3JldGVFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb25jcmV0ZUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7CisJfQorCiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKaW5kZXggZjc5MzM0YS4uOTRlMDEzYiAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YQpAQCAtNDEsMTggKzQxLDggQEAKIAogcHVibGljIGNsYXNzIEphdmFUcmFuc2llbnRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUcmFuc2llbnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVHJhbnNpZW50IiwgIiIpOwkJCi0JfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVRyYW5zaWVudEFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNzgsNyArNjgsNyBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKQEAgLTg2LDE3ICs3NiwxNyBAQAogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCkBAIC0xMDQsMTUyICs5NCwxNTIgQEAKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7CiAJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKIAogCQlhc3NlcnROb3ROdWxsKHRyYW5zaWVudE1hcHBpbmcpOwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEKaW5kZXggNzdmMjY4YS4uZWRiYjZjYiAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhCkBAIC0xMyw2ICsxMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwpAQCAtMjEsNiArMjIsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKQEAgLTQ0LDIyICs0Niw3IEBACiAKIHB1YmxpYyBjbGFzcyBKYXZhVmVyc2lvbk1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZlcnNpb25Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVmVyc2lvbiIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVtcG9yYWxBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVtcG9yYWwiLCAiVGVtcG9yYWxUeXBlIHZhbHVlKCk7Iik7CQkKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVZlcnNpb25Bbm5vdGF0aW9uKCk7Ci0JCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTc3LDEwICs2NCw3IEBACiAJCX0pOwogCX0KIAotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlVGVtcG9yYWxBbm5vdGF0aW9uKCk7Ci0JCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTEwNywyMSArOTEsMjIgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQl2ZXJzaW9uTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwogCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFRlbXBvcmFsQ29udmVydGVyKSAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQpAQCAtMTMwLDIwICsxMTUsMjEgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQl2ZXJzaW9uTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwogCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KQEAgLTE1MiwyMSArMTM4LDIyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJdmVyc2lvbk1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgKChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KQEAgLTE3NSwyMCArMTYyLDIxIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJdmVyc2lvbk1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KQEAgLTE5NywyMCArMTg1LDIxIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJdmVyc2lvbk1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQpAQCAtMjE5LDIwICsyMDgsMjEgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQl2ZXJzaW9uTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwogCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KQEAgLTI0MSwyMCArMjMxLDIxIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJdmVyc2lvbk1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KQEAgLTI2MywyMCArMjU0LDIxIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJdmVyc2lvbk1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCiAJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7CiAJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBqcGFQcm9qZWN0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CkBAIC0yODUsMjAgKzI3NywyMSBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7CisJCXZlcnNpb25NYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKTsKKwkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CiAJCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAogCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CiAJfQpAQCAtMzA3LDYxICszMDAsNTQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQl2ZXJzaW9uTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwogCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAKIAkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKIAl9CiAJCi0JcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbCh2ZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKLQl9CiAJCi0JcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsMigpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHRlc3RHZXRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aFRlbXBvcmFsKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwogCi0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCB2ZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFNldFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwodmVyc2lvbk1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwogCQkKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQl2ZXJzaW9uTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7CiAJCQotCQl2ZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChudWxsKTsKKwkJdmVyc2lvbk1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKG51bGwpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwogCX0KIAkKQEAgLTM2OSwyMiArMzU1LDIyIEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CiAKLQkJYXNzZXJ0TnVsbCh2ZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CiAJCQogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0ganBhUHJvamVjdCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCXRlbXBvcmFsLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLkRBVEUpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCB2ZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwogCQkKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJCi0JCWFzc2VydE51bGwodmVyc2lvbk1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwogCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWFzc2VydFNhbWUodmVyc2lvbk1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKIAl9CkBAIC0zOTMsMTQgKzM3OSwxNCBAQAogCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7CiAJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKIAkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwogCQkKIAkJYXNzZXJ0TnVsbCh2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoImlkIiwgdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKIAkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwogCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7CiAJCQpAQCAtNDA4LDUgKzM5NCw0IEBACiAJCWFzc2VydEVxdWFscygiZm9vIiwgdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwogCX0KLQkKIH0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0pwdENvcmVDb250ZXh0SmF2YU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0pwdENvcmVDb250ZXh0SmF2YU1vZGVsVGVzdHMuamF2YQppbmRleCAyNmUwZGY1Li4yNzc3ZDQ2IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KcHRDb3JlQ29udGV4dEphdmFNb2RlbFRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0Q29yZUNvbnRleHRKYXZhTW9kZWxUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKICAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCkBAIC0xNywxMCArMTcsNiBAQAogcHVibGljIGNsYXNzIEpwdENvcmVDb250ZXh0SmF2YU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQogewogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIHN1aXRlKHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZShib29sZWFuIGFsbCkgewogCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdENvcmVDb250ZXh0SmF2YU1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKIAkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuY2xhc3MpOwogCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuY2xhc3MpOwpAQCAtNDMsOCArMzksOCBAQAogCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVF1ZXJ5SGludFRlc3RzLmNsYXNzKTsKIAkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwogCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFQZXJzaXN0ZW50VHlwZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZVRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmNsYXNzKTsKIAkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmNsYXNzKTsKIAkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFTZWNvbmRhcnlUYWJsZVRlc3RzLmNsYXNzKTsKIAkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFTZXF1ZW5jZUdlbmVyYXRvclRlc3RzLmNsYXNzKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRW50aXR5TWFwcGluZ3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEKaW5kZXggY2M4Yjg4NC4uNjlmZTUyOSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEKQEAgLTEsMTMgKzEsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CkBAIC0yOSw4ICsyOCw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBFbnRpdHlNYXBwaW5nc1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwdWJsaWMgRW50aXR5TWFwcGluZ3NUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtNDIsNTI4ICs0MSw1MjggQEAKIAkJc3VwZXIuc2V0VXAoKTsKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CiAJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldFZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCBlbnRpdHlNYXBwaW5ncygpLmdldFZlcnNpb24oKSk7CisJCWFzc2VydEVxdWFscygiMS4wIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRWZXJzaW9uKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVzY3JpcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7CiAJCQogCQkvL3NldCBkZXNjcmlwdGlvbiBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldERlc2NyaXB0aW9uKCJuZXdEZXNjcmlwdGlvbiIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld0Rlc2NyaXB0aW9uIiwgZW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdEZXNjcmlwdGlvbiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXREZXNjcmlwdGlvbigibmV3RGVzY3JpcHRpb24iKTsKKwkJYXNzZXJ0RXF1YWxzKCJuZXdEZXNjcmlwdGlvbiIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7CisJCWFzc2VydEVxdWFscygibmV3RGVzY3JpcHRpb24iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwogCQogCQkvL3NldCBkZXNjcmlwdGlvbiB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0RGVzY3JpcHRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0RGVzY3JpcHRpb24obnVsbCk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGVzY3JpcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7CiAJCQogCQkvL3NldCBkZXNjcmlwdGlvbiBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWVudGl0eU1hcHBpbmdzKCkuc2V0RGVzY3JpcHRpb24oIm5ld0Rlc2NyaXB0aW9uIik7Ci0JCWFzc2VydEVxdWFscygibmV3RGVzY3JpcHRpb24iLCBlbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld0Rlc2NyaXB0aW9uIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldERlc2NyaXB0aW9uKCJuZXdEZXNjcmlwdGlvbiIpOworCQlhc3NlcnRFcXVhbHMoIm5ld0Rlc2NyaXB0aW9uIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuZXdEZXNjcmlwdGlvbiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7CiAJCQogCQkvL3NldCBkZXNjcmlwdGlvbiB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVudGl0eU1hcHBpbmdzKCkuc2V0RGVzY3JpcHRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0RGVzY3JpcHRpb24obnVsbCk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwogCQkKIAkJLy9zZXQgcGFja2FnZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFBhY2thZ2UoImZvby5tb2RlbCIpOwotCQlhc3NlcnRFcXVhbHMoImZvby5tb2RlbCIsIGVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28ubW9kZWwiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQYWNrYWdlKCJmb28ubW9kZWwiKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28ubW9kZWwiLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7CisJCWFzc2VydEVxdWFscygiZm9vLm1vZGVsIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwogCQkKIAkJLy9zZXQgcGFja2FnZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0UGFja2FnZShudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGFja2FnZShudWxsKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwogCQkKIAkJLy9zZXQgcGFja2FnZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWVudGl0eU1hcHBpbmdzKCkuc2V0UGFja2FnZSgiZm9vLm1vZGVsIik7Ci0JCWFzc2VydEVxdWFscygiZm9vLm1vZGVsIiwgZW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvby5tb2RlbCIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFBhY2thZ2UoImZvby5tb2RlbCIpOworCQlhc3NlcnRFcXVhbHMoImZvby5tb2RlbCIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28ubW9kZWwiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7CiAKIAkJLy9zZXQgcGFja2FnZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVudGl0eU1hcHBpbmdzKCkuc2V0UGFja2FnZShudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0UGFja2FnZShudWxsKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwogCQkKIAkJLy9zZXQgc2NoZW1hIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0U2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFNjaGVtYSgiTVlfU0NIRU1BIik7CisJCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7CisJCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7CiAKIAkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRTY2hlbWEobnVsbCk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwogCQkKIAkJLy9zZXQgc2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJNWV9TQ0hFTUEiKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKIAogCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQllbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwogCQkKIAkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7CisJCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwogCiAJCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldENhdGFsb2cobnVsbCk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7CiAJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKIAkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpOwogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOworCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7CiAJCiAJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0U2NoZW1hKCkpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwogCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0U2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRTY2hlbWEoIk1ZX1NDSEVNQSIpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0U2NoZW1hKG51bGwpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKIAotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkRFRkFVTFRfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiREVGQVVMVF9TQ0hFTUEiLCBlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiREVGQVVMVF9TQ0hFTUEiLCBlbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkRFRkFVTFRfU0NIRU1BIik7CisJCWFzc2VydEVxdWFscygiREVGQVVMVF9TQ0hFTUEiLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7CisJCWFzc2VydEVxdWFscygiREVGQVVMVF9TQ0hFTUEiLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKIAl9CQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7CiAJCQogCQkvL3NldCBjYXRhbG9nIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiTVlfQ0FUQUxPRyIpOworCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7CisJCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKIAkJCiAJCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQllbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwogCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CiAJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKTsKIAkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOworCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRDYXRhbG9nKCkpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7CisJCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7CiAJCiAJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRDYXRhbG9nKCkpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwogCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOworCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7CisJCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRDYXRhbG9nKG51bGwpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7CiAKLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiREVGQVVMVF9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiREVGQVVMVF9DQVRBTE9HIiwgZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJERUZBVUxUX0NBVEFMT0ciLCBlbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJERUZBVUxUX0NBVEFMT0ciKTsKKwkJYXNzZXJ0RXF1YWxzKCJERUZBVUxUX0NBVEFMT0ciLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRDYXRhbG9nKCkpOworCQlhc3NlcnRFcXVhbHMoIkRFRkFVTFRfQ0FUQUxPRyIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwogCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKIAl9CQogCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CiAJCQogCQkvL3NldCBhY2Nlc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CiAJCQogCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldEFjY2VzcyhudWxsKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CiAJCQogCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQllbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CiAJCQogCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQllbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CiAJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKIAkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpOwogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CiAJCQogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CiAJCQogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CiAJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOworCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CiAJCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldEFjY2VzcyhudWxsKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CiAKLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CiAJCQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhudWxsKTsKKwkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7CiAJfQkKIAogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcm1QZXJzaXN0ZW50VHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RmFsc2UoZ2V0RW50aXR5TWFwcGluZ3MoKS5wZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKIAkJCiAJCS8vYWRkIGVtYmVkZGFibGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCiAJCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVtYmVkZGFibGUoKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuYWRkKGVtYmVkZGFibGUpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuYWRkKGVtYmVkZGFibGUpOwogCQllbWJlZGRhYmxlLnNldENsYXNzTmFtZSgibW9kZWwuRm9vIik7Ci0JCWFzc2VydFRydWUoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRUcnVlKGdldEVudGl0eU1hcHBpbmdzKCkucGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBnZXRFbnRpdHlNYXBwaW5ncygpLnBlcnNpc3RlbnRUeXBlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOworCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7CisJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7CiAJCQogCQkvL2FkZCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCiAJCVhtbEVudGl0eSBlbnRpdHkgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbnRpdHkoKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuYWRkKGVudGl0eSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5hZGQoZW50aXR5KTsKIAkJZW50aXR5LnNldENsYXNzTmFtZSgibW9kZWwuRm9vMiIpOwotCQlhc3NlcnRUcnVlKGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28yIiwgZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28yIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRFbnRpdHlNYXBwaW5ncygpLnBlcnNpc3RlbnRUeXBlcygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygibW9kZWwuRm9vMiIsIGdldEVudGl0eU1hcHBpbmdzKCkucGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKSk7CisJCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOworCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7CisJCWFzc2VydEVxdWFscygibW9kZWwuRm9vMiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwogCiAJCS8vYWRkIG1hcHBlZC1zdXBlcmNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5hZGQobWFwcGVkU3VwZXJjbGFzcyk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuYWRkKG1hcHBlZFN1cGVyY2xhc3MpOwogCQltYXBwZWRTdXBlcmNsYXNzLnNldENsYXNzTmFtZSgibW9kZWwuRm9vMyIpOwotCQlhc3NlcnRUcnVlKGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28zIiwgZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRUcnVlKGdldEVudGl0eU1hcHBpbmdzKCkucGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28zIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5wZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKKwkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOworCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7CisJCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKIAl9CiAJCiAJCiAJcHVibGljIHZvaWQgdGVzdEFkZE9ybVBlcnNpc3RlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7CisJCWFzc2VydEZhbHNlKGdldEVudGl0eU1hcHBpbmdzKCkucGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7CisJCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7CisJCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7CiAJCQogCQkvL2FkZCBlbWJlZGRhYmxlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCWFzc2VydFRydWUoZ2V0RW50aXR5TWFwcGluZ3MoKS5wZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGdldEVudGl0eU1hcHBpbmdzKCkucGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIGdldEVudGl0eU1hcHBpbmdzKCkucGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOworCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOworCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKIAogCQkvL2FkZCBlbnRpdHkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOwotCQlhc3NlcnRUcnVlKGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28yIiwgZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOworCQlhc3NlcnRUcnVlKGdldEVudGl0eU1hcHBpbmdzKCkucGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28yIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5wZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRFbnRpdHlNYXBwaW5ncygpLnBlcnNpc3RlbnRUeXBlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7CisJCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOworCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKIAogCQkvL2FkZCBtYXBwZWQtc3VwZXJjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzMiKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28zIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzMiKTsKKwkJYXNzZXJ0VHJ1ZShnZXRFbnRpdHlNYXBwaW5ncygpLnBlcnNpc3RlbnRUeXBlcygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIGdldEVudGl0eU1hcHBpbmdzKCkucGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBnZXRFbnRpdHlNYXBwaW5ncygpLnBlcnNpc3RlbnRUeXBlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7CisJCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOworCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28zIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlT3JtUGVyc2lzdGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RmFsc2UoZ2V0RW50aXR5TWFwcGluZ3MoKS5wZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzMiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMyIpOwogCQkKIAkJLy9yZW1vdmUgb3JtUGVyc2lzdGVudFR5cGUgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlT3JtUGVyc2lzdGVudFR5cGUoMSk7Ci0JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlUGVyc2lzdGVudFR5cGUoMSk7CisJCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7CiAJCQotCQllbnRpdHlNYXBwaW5ncygpLnJlbW92ZU9ybVBlcnNpc3RlbnRUeXBlKDEpOwotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlUGVyc2lzdGVudFR5cGUoMSk7CisJCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlT3JtUGVyc2lzdGVudFR5cGUoMCk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnJlbW92ZVBlcnNpc3RlbnRUeXBlKDApOworCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRhYmxlR2VuZXJhdG9ycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOworCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvckltcGwoKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmFkZCh0YWJsZUdlbmVyYXRvclJlc291cmNlKTsKKwkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlR2VuZXJhdG9yKCk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuYWRkKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UpOwogCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldE5hbWUoIkZPTyIpOwogCQkKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9ycygpLm5leHQoKTsKKwkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9ycygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlMiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlR2VuZXJhdG9ySW1wbCgpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuYWRkKDAsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UyKTsKKwkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZTIgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvcigpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmFkZCgwLCB0YWJsZUdlbmVyYXRvclJlc291cmNlMik7CiAJCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2UyLnNldE5hbWUoIkJBUiIpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9ycygpOworCQlMaXN0SXRlcmF0b3I8T3JtVGFibGVHZW5lcmF0b3I+IHRhYmxlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOworCQlhc3NlcnRFcXVhbHMoMiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGVHZW5lcmF0b3JJbXBsKCk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5hZGQoMSwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZTMpOworCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlMyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlR2VuZXJhdG9yKCk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuYWRkKDEsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UzKTsKIAkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZTMuc2V0TmFtZSgiQkFaIik7CiAJCQotCQl0YWJsZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9ycygpOworCQl0YWJsZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9ycygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZSh0YWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7CisJCWFzc2VydEVxdWFscygzLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdlbmVyYXRvcnNTaXplKCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLm1vdmUoMiwgMCk7Ci0JCXRhYmxlR2VuZXJhdG9ycyA9IGVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzKCk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkubW92ZSgyLCAwKTsKKwkJdGFibGVHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOworCQlhc3NlcnRFcXVhbHMoMywgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5yZW1vdmUoMCk7Ci0JCXRhYmxlR2VuZXJhdG9ycyA9IGVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzKCk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkucmVtb3ZlKDApOworCQl0YWJsZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9ycygpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHRhYmxlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAJCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkucmVtb3ZlKDEpOwotCQl0YWJsZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9ycygpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnJlbW92ZSgxKTsKKwkJdGFibGVHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHRhYmxlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAJCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuY2xlYXIoKTsKLQkJdGFibGVHZW5lcmF0b3JzID0gZW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnMoKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5jbGVhcigpOworCQl0YWJsZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9ycygpOwogCQlhc3NlcnRGYWxzZSh0YWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7CisJCWFzc2VydEVxdWFscygwLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdlbmVyYXRvcnNTaXplKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApLnNldE5hbWUoIkZPTyIpOworCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApLnNldE5hbWUoIkZPTyIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApLnNldE5hbWUoIkJBUiIpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxPcm1UYWJsZUdlbmVyYXRvcj4gdGFibGVHZW5lcmF0b3JzID0gZW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnMoKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybVRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9ycygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHRhYmxlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwogCQkKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CiAJCXRhYmxlR2VuZXJhdG9yLnNldE5hbWUoIkZPTyIpOwotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjIgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDEpOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDEpOwogCQl0YWJsZUdlbmVyYXRvcjIuc2V0TmFtZSgiQkFSIik7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yMyA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMik7CisJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yMyA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMik7CiAJCXRhYmxlR2VuZXJhdG9yMy5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgyKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMywgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwogCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnJlbW92ZVRhYmxlR2VuZXJhdG9yKDApOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxPcm1UYWJsZUdlbmVyYXRvcj4gdGFibGVHZW5lcmF0b3JzID0gZW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnMoKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybVRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9ycygpOwogCQlPcm1UYWJsZUdlbmVyYXRvciB4bWxUYWJsZUdlbmVyYXRvciA9IHRhYmxlR2VuZXJhdG9ycy5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgeG1sVGFibGVHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKHRhYmxlR2VuZXJhdG9yMiwgeG1sVGFibGVHZW5lcmF0b3IpOwpAQCAtNTczLDE2NiArNTcyLDE2NiBAQAogCQlhc3NlcnRGYWxzZSh0YWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKIAogCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigxKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCXRhYmxlR2VuZXJhdG9ycyA9IGVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzKCk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoMSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJdGFibGVHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnMoKTsKIAkJeG1sVGFibGVHZW5lcmF0b3IgPSB0YWJsZUdlbmVyYXRvcnMubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbFRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscyh0YWJsZUdlbmVyYXRvcjIsIHhtbFRhYmxlR2VuZXJhdG9yKTsKIAkJYXNzZXJ0RmFsc2UodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSk7CiAKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJdGFibGVHZW5lcmF0b3JzID0gZW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnMoKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigwKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKKwkJdGFibGVHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnMoKTsKIAkJYXNzZXJ0RmFsc2UodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSk7CQkKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vdmVUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBnZXRFbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9yc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7CiAJCQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CisJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsKIAkJdGFibGVHZW5lcmF0b3Iuc2V0TmFtZSgiRk9PIik7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yMiA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMSk7CisJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMSk7CiAJCXRhYmxlR2VuZXJhdG9yMi5zZXROYW1lKCJCQVIiKTsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IzID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigyKTsKKwkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigyKTsKIAkJdGFibGVHZW5lcmF0b3IzLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDIpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygzLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7CiAJCQotCQllbnRpdHlNYXBwaW5ncygpLm1vdmVUYWJsZUdlbmVyYXRvcigyLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLm1vdmVUYWJsZUdlbmVyYXRvcigyLCAwKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkubW92ZVRhYmxlR2VuZXJhdG9yKDAsIDIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkubW92ZVRhYmxlR2VuZXJhdG9yKDAsIDIpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgyKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMywgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VGFibGVHZW5lcmF0b3JzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBnZXRFbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9yc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7CiAJCQogCQkKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CiAJCXRhYmxlR2VuZXJhdG9yLnNldE5hbWUoIkZPTyIpOwotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjIgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDEpOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDEpOwogCQl0YWJsZUdlbmVyYXRvcjIuc2V0TmFtZSgiQkFSIik7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yMyA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMik7CisJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yMyA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMik7CiAJCXRhYmxlR2VuZXJhdG9yMy5zZXROYW1lKCJCQVoiKTsKIAkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIGdldEVudGl0eU1hcHBpbmdzKCkudGFibGVHZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlNYXBwaW5ncygpLnRhYmxlR2VuZXJhdG9yc1NpemUoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkucmVtb3ZlKDApOworCQlhc3NlcnRFcXVhbHMoMiwgZ2V0RW50aXR5TWFwcGluZ3MoKS50YWJsZUdlbmVyYXRvcnNTaXplKCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTZXF1ZW5jZUdlbmVyYXRvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAJCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5hZGQoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSk7CisJCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvcigpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmFkZChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKTsKIAkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKIAkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5zZXF1ZW5jZUdlbmVyYXRvcnMoKS5uZXh0KCk7CisJCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXF1ZW5jZUdlbmVyYXRvcnMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7CisJCWFzc2VydEVxdWFscygxLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdlbmVyYXRvcnNTaXplKCkpOwogCQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZTIgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvckltcGwoKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmFkZCgwLCBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlMik7CisJCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UyID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5hZGQoMCwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZTIpOwogCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlMi5zZXROYW1lKCJCQVIiKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JzID0gZW50aXR5TWFwcGluZ3MoKS5zZXF1ZW5jZUdlbmVyYXRvcnMoKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybVNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAJCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlMyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCgpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuYWRkKDEsIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UzKTsKKwkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZTMgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvcigpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmFkZCgxLCBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlMyk7CiAJCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UzLnNldE5hbWUoIkJBWiIpOwogCi0JCXNlcXVlbmNlR2VuZXJhdG9ycyA9IGVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzKCk7CisJCXNlcXVlbmNlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAJCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkubW92ZSgyLCAwKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3JzID0gZW50aXR5TWFwcGluZ3MoKS5zZXF1ZW5jZUdlbmVyYXRvcnMoKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5tb3ZlKDIsIDApOworCQlzZXF1ZW5jZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5yZW1vdmUoMCk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9ycyA9IGVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzKCk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkucmVtb3ZlKDApOworCQlzZXF1ZW5jZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnJlbW92ZSgxKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3JzID0gZW50aXR5TWFwcGluZ3MoKS5zZXF1ZW5jZUdlbmVyYXRvcnMoKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5yZW1vdmUoMSk7CisJCXNlcXVlbmNlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzKCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShzZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7CisJCWFzc2VydEVxdWFscygxLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdlbmVyYXRvcnNTaXplKCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmNsZWFyKCk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9ycyA9IGVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzKCk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuY2xlYXIoKTsKKwkJc2VxdWVuY2VHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXF1ZW5jZUdlbmVyYXRvcnMoKTsKIAkJYXNzZXJ0RmFsc2Uoc2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOworCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEFkZFNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCkuc2V0TmFtZSgiRk9PIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCkuc2V0TmFtZSgiRk9PIik7CiAJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwogCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCkuc2V0TmFtZSgiQkFSIik7CisJCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOworCQlMaXN0SXRlcmF0b3I8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoc2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5TWFwcGluZ3MoKS5zZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBnZXRFbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7CiAJCQotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CisJCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsKIAkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZSgiRk9PIik7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yMiA9IGVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMSk7CisJCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMSk7CiAJCXNlcXVlbmNlR2VuZXJhdG9yMi5zZXROYW1lKCJCQVIiKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IzID0gZW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigyKTsKKwkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigyKTsKIAkJc2VxdWVuY2VHZW5lcmF0b3IzLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDIpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygzLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7CiAJCQotCQllbnRpdHlNYXBwaW5ncygpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoMCk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOworCQlMaXN0SXRlcmF0b3I8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzKCk7CiAJCVNlcXVlbmNlR2VuZXJhdG9yIHhtbFNlcXVlbmNlR2VuZXJhdG9yID0gc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxTZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoc2VxdWVuY2VHZW5lcmF0b3IyLCB4bWxTZXF1ZW5jZUdlbmVyYXRvcik7CkBAIC03NDIsMzI2ICs3NDEsMzI2IEBACiAJCWFzc2VydEZhbHNlKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwogCiAJCQotCQllbnRpdHlNYXBwaW5ncygpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKDEpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3JzID0gZW50aXR5TWFwcGluZ3MoKS5zZXF1ZW5jZUdlbmVyYXRvcnMoKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigxKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlzZXF1ZW5jZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOwogCQl4bWxTZXF1ZW5jZUdlbmVyYXRvciA9IHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgeG1sU2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKHNlcXVlbmNlR2VuZXJhdG9yMiwgeG1sU2VxdWVuY2VHZW5lcmF0b3IpOwogCQlhc3NlcnRGYWxzZShzZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKIAogCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQlzZXF1ZW5jZUdlbmVyYXRvcnMgPSBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKDApOworCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOworCQlzZXF1ZW5jZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9ycygpOwogCQlhc3NlcnRGYWxzZShzZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsJCQogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKIAkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsKKwkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwogCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXROYW1lKCJGT08iKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IyID0gZW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigxKTsKKwkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IyID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigxKTsKIAkJc2VxdWVuY2VHZW5lcmF0b3IyLnNldE5hbWUoIkJBUiIpOwotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjMgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDIpOworCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDIpOwogCQlzZXF1ZW5jZUdlbmVyYXRvcjMuc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkubW92ZVNlcXVlbmNlR2VuZXJhdG9yKDIsIDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkubW92ZVNlcXVlbmNlR2VuZXJhdG9yKDIsIDApOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgyKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMywgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOwogCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5tb3ZlU2VxdWVuY2VHZW5lcmF0b3IoMCwgMik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5tb3ZlU2VxdWVuY2VHZW5lcmF0b3IoMCwgMik7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDIpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygzLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7CiAJCQogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5TWFwcGluZ3MoKS5zZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBnZXRFbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7CiAJCQogCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOworCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CiAJCXNlcXVlbmNlR2VuZXJhdG9yLnNldE5hbWUoIkZPTyIpOwotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjIgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDEpOworCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDEpOwogCQlzZXF1ZW5jZUdlbmVyYXRvcjIuc2V0TmFtZSgiQkFSIik7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yMyA9IGVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMik7CisJCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yMyA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMik7CiAJCXNlcXVlbmNlR2VuZXJhdG9yMy5zZXROYW1lKCJCQVoiKTsKIAkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIGdldEVudGl0eU1hcHBpbmdzKCkuc2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlNYXBwaW5ncygpLnNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkucmVtb3ZlKDApOworCQlhc3NlcnRFcXVhbHMoMiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkpOwogCX0KIAogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkTmFtZWRRdWVyeSgwKTsKKwkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7CiAJCW5hbWVkUXVlcnkuc2V0TmFtZSgiRk9PIik7CiAJCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CiAJCQotCQlPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkyID0gZW50aXR5TWFwcGluZ3MoKS5hZGROYW1lZFF1ZXJ5KDApOworCQlPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkyID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7CiAJCW5hbWVkUXVlcnkyLnNldE5hbWUoIkJBUiIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKIAkJCi0JCU9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeTMgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE5hbWVkUXVlcnkoMSk7CisJCU9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeTMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgxKTsKIAkJbmFtZWRRdWVyeTMuc2V0TmFtZSgiQkFaIik7CiAJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWRRdWVyaWVzKCk7CisJCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWRRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5MiwgbmFtZWRRdWVyaWVzLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5MywgbmFtZWRRdWVyaWVzLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5LCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKIAkJCi0JCW5hbWVkUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWRRdWVyaWVzKCk7CisJCW5hbWVkUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGROYW1lZFF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE5hbWVkUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkTmFtZWRRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKIAkJCi0JCWFzc2VydEVxdWFscygzLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZFF1ZXJ5KDApOworCQlhc3NlcnRFcXVhbHMoMiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKIAotCQllbnRpdHlNYXBwaW5ncygpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZFF1ZXJ5KDApOworCQlhc3NlcnRFcXVhbHMoMSwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CiAJCQotCQllbnRpdHlNYXBwaW5ncygpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7CisJCWFzc2VydEVxdWFscygwLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQllbnRpdHlNYXBwaW5ncygpLmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkTmFtZWRRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGROYW1lZFF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMywgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwogCQkKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkubW92ZU5hbWVkUXVlcnkoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBlbnRpdHlNYXBwaW5ncygpLm5hbWVkUXVlcmllcygpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkubW92ZU5hbWVkUXVlcnkoMiwgMCk7CisJCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWRRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKIAogCi0JCWVudGl0eU1hcHBpbmdzKCkubW92ZU5hbWVkUXVlcnkoMCwgMSk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWRRdWVyaWVzKCk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWRRdWVyeSgwLCAxKTsKKwkJbmFtZWRRdWVyaWVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkUXVlcmllcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCi0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lZFF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7CisJCWFzc2VydEVxdWFscygwLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLnF1ZXJpZXNTaXplKCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZFF1ZXJ5KCkpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkUXVlcnkoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7CiAJCQotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5TWFwcGluZ3MoKS5uYW1lZFF1ZXJpZXMoKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOworCQlhc3NlcnRFcXVhbHMoMywgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5xdWVyaWVzU2l6ZSgpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5tb3ZlKDIsIDApOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHlNYXBwaW5ncygpLm5hbWVkUXVlcmllcygpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLm1vdmUoMiwgMCk7CisJCW5hbWVkUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7CiAJCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkubW92ZSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5TWFwcGluZ3MoKS5uYW1lZFF1ZXJpZXMoKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5tb3ZlKDAsIDEpOworCQluYW1lZFF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWRRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLnJlbW92ZSgxKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5TWFwcGluZ3MoKS5uYW1lZFF1ZXJpZXMoKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5yZW1vdmUoMSk7CisJCW5hbWVkUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7CisJCWFzc2VydEVxdWFscygyLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLnF1ZXJpZXNTaXplKCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLnJlbW92ZSgxKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5TWFwcGluZ3MoKS5uYW1lZFF1ZXJpZXMoKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5yZW1vdmUoMSk7CisJCW5hbWVkUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkucXVlcmllc1NpemUoKSk7CiAJCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShlbnRpdHlNYXBwaW5ncygpLm5hbWVkUXVlcmllcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLnJlbW92ZSgwKTsKKwkJYXNzZXJ0RmFsc2UoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkUXVlcmllcygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLnF1ZXJpZXNTaXplKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7CisJCU9ybU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwogCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUoIkZPTyIpOwogCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwogCQkKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5MiA9IGVudGl0eU1hcHBpbmdzKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5MiA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwogCQluYW1lZE5hdGl2ZVF1ZXJ5Mi5zZXROYW1lKCJCQVIiKTsKIAkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CiAJCQotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkzID0gZW50aXR5TWFwcGluZ3MoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpOworCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMSk7CiAJCW5hbWVkTmF0aXZlUXVlcnkzLnNldE5hbWUoIkJBWiIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMgPSBlbnRpdHlNYXBwaW5ncygpLm5hbWVkTmF0aXZlUXVlcmllcygpOworCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkTmF0aXZlUXVlcmllcygpOwogCQlhc3NlcnRFcXVhbHMobmFtZWROYXRpdmVRdWVyeTIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMobmFtZWROYXRpdmVRdWVyeTMsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMobmFtZWROYXRpdmVRdWVyeSwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSk7CiAJCQotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBlbnRpdHlNYXBwaW5ncygpLm5hbWVkTmF0aXZlUXVlcmllcygpOworCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7CiAJCQotCQlhc3NlcnRFcXVhbHMoMywgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygzLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7CiAJCQotCQllbnRpdHlNYXBwaW5ncygpLnJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CiAKLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwogCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOworCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5zaXplKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZU5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKIAkJCi0JCWFzc2VydEVxdWFscygzLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKIAkJCiAJCQotCQllbnRpdHlNYXBwaW5ncygpLm1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzID0gZW50aXR5TWFwcGluZ3MoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDIsIDApOworCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkTmF0aXZlUXVlcmllcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCi0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7CiAKIAotCQllbnRpdHlNYXBwaW5ncygpLm1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDAsIDEpOwotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBlbnRpdHlNYXBwaW5ncygpLm5hbWVkTmF0aXZlUXVlcmllcygpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkubW92ZU5hbWVkTmF0aXZlUXVlcnkoMCwgMSk7CisJCW5hbWVkTmF0aXZlUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZWROYXRpdmVRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOworCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5xdWVyaWVzU2l6ZSgpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWROYXRpdmVRdWVyeSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKSk7CiAJCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7CisJCUxpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkucXVlcmllc1NpemUoKSk7CiAJCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkubW92ZSgyLCAwKTsKLQkJbmFtZWROYXRpdmVRdWVyaWVzID0gZW50aXR5TWFwcGluZ3MoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5tb3ZlKDIsIDApOworCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLm1vdmUoMCwgMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkubW92ZSgwLCAxKTsKKwkJbmFtZWROYXRpdmVRdWVyaWVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkTmF0aXZlUXVlcmllcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5yZW1vdmUoMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkucmVtb3ZlKDEpOworCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UobmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOworCQlhc3NlcnRFcXVhbHMoMiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5xdWVyaWVzU2l6ZSgpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5yZW1vdmUoMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IGVudGl0eU1hcHBpbmdzKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkucmVtb3ZlKDEpOworCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7CisJCWFzc2VydEVxdWFscygxLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLnF1ZXJpZXNTaXplKCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5TWFwcGluZ3MoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5yZW1vdmUoMCk7CisJCWFzc2VydEZhbHNlKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5xdWVyaWVzU2l6ZSgpKTsKIAl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTYwOTA2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKQEAgLTAsMCArMSwzMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBHZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKKwkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKKwkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZU51bGxBdHRyaWJ1dGVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsJCQkKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQ09MVU1OKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQElkIik7CisJCQkJc2IuYXBwZW5kKCJAQ29sdW1uKG5hbWU9XCJGT09cIikiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1ha2VTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdFR5cGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCk7CisJCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCQorCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkTWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZU51bGxBdHRyaWJ1dGVNYXBwaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJLy90YWtlIGEgdmlydHVhbCBtYXBwaW5nIHdpdGggYSBtYXBwaW5nIHR5cGUgYW5kIG1ha2UgaXQgc3BlY2lmaWVkCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBHZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRUcnVlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZyk7CisJCQorCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCk7CisJCQorCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRUcnVlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgR2VuZXJpY09ybUlkTWFwcGluZyk7CisJCQorCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLm1ha2VTcGVjaWZpZWQoKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOworCisJCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCQorCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7CisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJCisJCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7CisJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsJCQorCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwkJCisJCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1ha2VWaXJ0dWFsTm9VbmRlcmx5aW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLm1ha2VTcGVjaWZpZWQoKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOworCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5zZXROYW1lKCJub0phdmFBdHRyaWJ1dGUiKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVZpcnR1YWwoKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nVHlwZVdoZW5NZXRhZGF0YUNvbXBsZXRlKCkgIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgKChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUyKCkgIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKKwkJCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQkJCisJCS8vdmlydHVhbCBvcm0gYXR0cmlidXRlLCBhY2Nlc3MgdHlwZSBtYXRjaGVzIGphdmEgOiBGSUVMRCwgbmFtZSBtYXRjaGVzIGphdmEKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQlhc3NlcnRUcnVlKGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNGaWVsZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkucGVyc2lzdGFibGVGaWVsZHMoKS5uZXh0KCksIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQkKKwkJCisJCS8vc3BlY2lmaWVkIG9ybSBhdHRyaWJ1dGUsIGFjY2VzcyB0eXBlIG1hdGNoZXMgamF2YSA6IEZJRUxELCBuYW1lIG1hdGNoZXMgamF2YQorCQkvL2phdmFQZXJzaXN0ZW50QXR0cmlidXRlIHNob3VsZCBiZSA9PSB0byBqYXZhIGNvbnRleHQgbW9kZWwgb2JqZWN0CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCisJCQorCQkvL3ZpcnR1YWwgb3JtIGF0dHJpYnV0ZSwgamF2YSBhY2Nlc3MgdHlwZSBGSUVMRCwgb3JtIGFjY2VzcyB0eXBlIFBST1BFUlRZLCBuYW1lIG1hdGNoZXMgamF2YQorCQkvL3ZlcmlmeSB0aGUgcHJvcGVydHkgamF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBpcyB1c2VkIGluIG9ybS4KKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlVmlydHVhbCgpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CQkKKwkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnROb3RTYW1lKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwkJamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmlzUHJvcGVydHkoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLnBlcnNpc3RhYmxlUHJvcGVydGllcygpLm5leHQoKSwgamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCQorCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOy8vZGVmYXVsdCBhY2Nlc3Mgd2lsbCBiZSBmaWVsZAorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5zZXROYW1lKCJpZDIiKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5zZXROYW1lKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5zZXROYW1lKCJpZCIpOworCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3N2NkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEKQEAgLTAsMCArMSw1NzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtUGVyc2lzdGVudFR5cGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfVFlQRV9OQU1FID0gIk1vZGVsIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfTU9ERUxfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgTU9ERUxfVFlQRV9OQU1FOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUExPWUVFX1RZUEVfTkFNRSA9ICJFbXBsb3llZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0VNUExPWUVFX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIEVNUExPWUVFX1RZUEVfTkFNRTsKKworCQorCXB1YmxpYyBHZW5lcmljT3JtUGVyc2lzdGVudFR5cGVUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CisJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7CisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCX0JCisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZU1vZGVsVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGFic3RyYWN0IGNsYXNzICIpLmFwcGVuZChNT0RFTF9UWVBFX05BTUUpLmFwcGVuZCgiIHsiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICAiKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIE1PREVMX1RZUEVfTkFNRSArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVFbXBsb3llZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoRU1QTE9ZRUVfVFlQRV9OQU1FKS5hcHBlbmQoIiBleHRlbmRzICIpLmFwcGVuZChNT0RFTF9UWVBFX05BTUUpLmFwcGVuZCgiIHsiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGRlcGFydG1lbnQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkRhdGUgc3RhcnREYXRlOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICAiKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIEVNUExPWUVFX1RZUEVfTkFNRSArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbFR5cGVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJYXNzZXJ0RmFsc2UoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOworLy8JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7CisvLwkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOworLy8JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKKy8vCQkKKy8vCQkvL2FkZCBlbWJlZGRhYmxlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorLy8JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVtYmVkZGFibGUoKTsKKy8vCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5hZGQoZW1iZWRkYWJsZSk7CisvLwkJZW1iZWRkYWJsZS5zZXRDbGFzc05hbWUoIm1vZGVsLkZvbyIpOworLy8JCWFzc2VydFRydWUoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOworLy8JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKKy8vCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOworLy8JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKKy8vCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOworLy8JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKKy8vCQkKKy8vCQkvL2FkZCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCisvLwkJRW50aXR5IGVudGl0eSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVudGl0eSgpOworLy8JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmFkZChlbnRpdHkpOworLy8JCWVudGl0eS5zZXRDbGFzc05hbWUoIm1vZGVsLkZvbzIiKTsKKy8vCQlhc3NlcnRUcnVlKGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzIiLCBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOworLy8JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7CisvLwkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKKy8vCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOworLy8JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7CisvLworLy8JCS8vYWRkIG1hcHBlZC1zdXBlcmNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorLy8JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1hcHBlZFN1cGVyY2xhc3MoKTsKKy8vCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuYWRkKG1hcHBlZFN1cGVyY2xhc3MpOworLy8JCW1hcHBlZFN1cGVyY2xhc3Muc2V0Q2xhc3NOYW1lKCJtb2RlbC5Gb28zIik7CisvLwkJYXNzZXJ0VHJ1ZShlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLmhhc05leHQoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28zIiwgZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKKy8vCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKKy8vCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOworLy8JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28zIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7CisvLwl9CisvLwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhYbWxUeXBlTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRGYWxzZShnZXRFbnRpdHlNYXBwaW5ncygpLnBlcnNpc3RlbnRUeXBlcygpLmhhc05leHQoKSk7CisJCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOworCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOworCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOworCQkKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28zIik7CisJCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5wZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscyhtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUsIG9ybVBlcnNpc3RlbnRUeXBlKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLnNpemUoKSk7CisJCQorCQlJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gb3JtUGVyc2lzdGVudFR5cGVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5wZXJzaXN0ZW50VHlwZXMoKTsKKwkJLy90aGUgc2FtZSBPcm1QZXJzaXN0ZW50VHlwZXMgc2hvdWxkIHN0aWxsIGJlIGluIHRoZSBjb250ZXh0IG1vZGVsCisJCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZXMubmV4dCgpLCBlbnRpdHlQZXJzaXN0ZW50VHlwZSk7CisJCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZXMubmV4dCgpLCBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUpOworCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGVzLm5leHQoKSwgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlKTsKKwkJCisJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7CisJCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7CisJCQorCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljQXR0cmlidXRlIik7CisJCisJCVhtbEVudGl0eSBlbnRpdHkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgYmFzaWMuZ2V0TmFtZSgpKTsKKwkJCisJCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRBdHRyaWJ1dGUiKTsKKwkKKwkJWG1sRW1iZWRkZWQgZW1iZWRkZWQgPSBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIGVtYmVkZGVkLmdldE5hbWUoKSk7CisJCQorCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnRBdHRyaWJ1dGUiKTsKKwkKKwkJWG1sVHJhbnNpZW50IHRyYW5zaWVudFJlc291cmNlID0gZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsIHRyYW5zaWVudFJlc291cmNlLmdldE5hbWUoKSk7CisKKwkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb25BdHRyaWJ1dGUiKTsKKwkKKwkJWG1sVmVyc2lvbiB2ZXJzaW9uID0gZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgdmVyc2lvbi5nZXROYW1lKCkpOworCisJCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRBdHRyaWJ1dGUiKTsKKwkKKwkJWG1sSWQgaWQgPSBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsIGlkLmdldE5hbWUoKSk7CisJCQorCQkKKwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpOworCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgcGVyc2lzdGVudEF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBwZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgcGVyc2lzdGVudEF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBwZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCBwZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOworCQkKKwkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY0F0dHJpYnV0ZSIpOworCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkQXR0cmlidXRlIik7CisJCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ2ZXJzaW9uQXR0cmlidXRlIik7CisJCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRBdHRyaWJ1dGUiKTsKKwkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50QXR0cmlidXRlIik7CisJCisJCVhtbEVudGl0eSBlbnRpdHkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJCisJCWVudGl0eVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImJhc2ljQXR0cmlidXRlIikpOworCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCQorCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbWJlZGRlZEF0dHJpYnV0ZSIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJCisJCWVudGl0eVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInZlcnNpb25BdHRyaWJ1dGUiKSk7CisJCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCQorCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZEF0dHJpYnV0ZSIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCQorCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ0cmFuc2llbnRBdHRyaWJ1dGUiKSk7CisJCWFzc2VydE51bGwoZW50aXR5LmdldEF0dHJpYnV0ZXMoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJZCgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7CisJCVhtbEVudGl0eSBlbnRpdHkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQkKKwkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZEF0dHJpYnV0ZSIpOworCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisKKwkJZW50aXR5UGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWRBdHRyaWJ1dGUiKSk7CQorCQlhc3NlcnROdWxsKGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOworCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNBdHRyaWJ1dGUiKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKS5nZXROYW1lKCkpOworCisJCWVudGl0eVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImJhc2ljQXR0cmlidXRlIikpOwkKKwkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0QXR0cmlidXRlcygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFJlbW92ZVZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOworCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ2ZXJzaW9uQXR0cmlidXRlIik7CisJCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApLmdldE5hbWUoKSk7CisKKwkJZW50aXR5UGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgidmVyc2lvbkF0dHJpYnV0ZSIpKTsJCisJCWFzc2VydE51bGwoZW50aXR5LmdldEF0dHJpYnV0ZXMoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbWJlZGRlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7CisJCVhtbEVudGl0eSBlbnRpdHkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQkKKwkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZEF0dHJpYnV0ZSIpOworCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisKKwkJZW50aXR5UGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1iZWRkZWRBdHRyaWJ1dGUiKSk7CQorCQlhc3NlcnROdWxsKGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVHJhbnNpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKKwkJWG1sRW50aXR5IGVudGl0eSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCQorCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnRBdHRyaWJ1dGUiKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisKKwkJZW50aXR5UGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgidHJhbnNpZW50QXR0cmlidXRlIikpOwkKKwkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0QXR0cmlidXRlcygpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOworCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKworCQllbnRpdHkuc2V0QXR0cmlidXRlcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdHRyaWJ1dGVzKCkpOworCQlYbWxCYXNpYyBiYXNpYyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEJhc2ljKCk7CisJCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuYWRkKGJhc2ljKTsKKwkJYmFzaWMuc2V0TmFtZSgiYmFzaWNBdHRyaWJ1dGUiKTsKKwkJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCQorCQlYbWxFbWJlZGRlZCBlbWJlZGRlZCA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVtYmVkZGVkKCk7CisJCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuYWRkKGVtYmVkZGVkKTsKKwkJZW1iZWRkZWQuc2V0TmFtZSgiZW1iZWRkZWRBdHRyaWJ1dGUiKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwkKKwkJWG1sVmVyc2lvbiB2ZXJzaW9uID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVmVyc2lvbigpOworCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuYWRkKHZlcnNpb24pOworCQl2ZXJzaW9uLnNldE5hbWUoInZlcnNpb25BdHRyaWJ1dGUiKTsKKwkJCisJCWF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7CisKKwkJWG1sSWQgaWQgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxJZCgpOworCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmFkZChpZCk7CisJCWlkLnNldE5hbWUoImlkQXR0cmlidXRlIik7CisJCQorCQlhdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwkJCisJCVhtbFRyYW5zaWVudCB0cmFuc2llbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRyYW5zaWVudCgpOworCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5hZGQodHJhbnNpZW50UmVzb3VyY2UpOworCQl0cmFuc2llbnRSZXNvdXJjZS5zZXROYW1lKCJ0cmFuc2llbnRBdHRyaWJ1dGUiKTsKKwkJCisJCWF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOworCQkKKwkJWG1sTWFueVRvT25lIG1hbnlUb09uZVJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFueVRvT25lKCk7CisJCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmFkZChtYW55VG9PbmVSZXNvdXJjZSk7CisJCW1hbnlUb09uZVJlc291cmNlLnNldE5hbWUoIm1hbnlUb09uZUF0dHJpYnV0ZSIpOworCQkKKwkJYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnlSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hbnlUb01hbnkoKTsKKwkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmFkZChtYW55VG9NYW55UmVzb3VyY2UpOworCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TmFtZSgibWFueVRvTWFueUF0dHJpYnV0ZSIpOworCQkKKwkJYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnlBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7CisJCQorCQlYbWxPbmVUb01hbnkgb25lVG9NYW55UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPbmVUb01hbnkoKTsKKwkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuYWRkKG9uZVRvTWFueVJlc291cmNlKTsKKwkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TmFtZSgib25lVG9NYW55QXR0cmlidXRlIik7CisJCQorCQlhdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygib25lVG9NYW55QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOworCisJCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPbmVUb09uZSgpOworCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmFkZChvbmVUb09uZVJlc291cmNlKTsKKwkJb25lVG9PbmVSZXNvdXJjZS5zZXROYW1lKCJvbmVUb09uZUF0dHJpYnV0ZSIpOworCQkKKwkJYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygib25lVG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygibWFueVRvTWFueUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKworCisJCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW1iZWRkZWRJZCgpOworCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuYWRkKGVtYmVkZGVkSWRSZXNvdXJjZSk7CisJCWVtYmVkZGVkSWRSZXNvdXJjZS5zZXROYW1lKCJlbWJlZGRlZElkQXR0cmlidXRlIik7CisJCQorCQlhdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygib25lVG9NYW55QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOworCisJCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkucmVtb3ZlKDApOworCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLnJlbW92ZSgwKTsKKwkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkucmVtb3ZlKDApOworCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLnJlbW92ZSgwKTsKKwkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLnJlbW92ZSgwKTsKKwkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkucmVtb3ZlKDApOworCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkucmVtb3ZlKDApOworCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5yZW1vdmUoMCk7CisJCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkucmVtb3ZlKDApOworCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkucmVtb3ZlKDApOworCQlhc3NlcnRGYWxzZShlbnRpdHlQZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0Tm90TnVsbChlbnRpdHkuZ2V0QXR0cmlidXRlcygpKTsKKwl9CisJCisJCisKKwlwdWJsaWMgdm9pZCB0ZXN0SW5oZXJpdGVkQXR0cmlidXRlc1Jlc29sdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlTW9kZWxUeXBlKCk7CisJCWNyZWF0ZUVtcGxveWVlVHlwZSgpOworCQkKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW1wbG95ZWVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9FTVBMT1lFRV9UWVBFX05BTUUpOworCisJCQorCQllbXBsb3llZVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKKwkJZW1wbG95ZWVQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm5hbWUiKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzdGFydERhdGVBdHRyaWJ1dGUgPSBlbXBsb3llZVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAic3RhcnREYXRlIik7CisJCSgoT3JtQmFzaWNNYXBwaW5nKSBzdGFydERhdGVBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpICgoT3JtQmFzaWNNYXBwaW5nKSBzdGFydERhdGVBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5EQVRFKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRBdHRyaWJ1dGUgPSBlbXBsb3llZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGlkQXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCWFzc2VydE5vdE51bGwoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkVtcGxveWVlIiwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoInRlc3QuTW9kZWwiLCAoKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCksICJwYXJlbnQiKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0Q29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEKaW5kZXggMmM5OGVkOC4uODgyMTZjNCAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0pwdENvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhCkBAIC0xNywxNyArMTcsMTMgQEAKIHB1YmxpYyBjbGFzcyBKcHRDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQogewogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIHN1aXRlKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoYm9vbGVhbiBhbGwpIHsKIAkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKIAkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybVhtbFRlc3RzLmNsYXNzKTsKIAkJc3VpdGUuYWRkVGVzdFN1aXRlKEVudGl0eU1hcHBpbmdzVGVzdHMuY2xhc3MpOwogCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cy5jbGFzcyk7CiAJCXN1aXRlLmFkZFRlc3RTdWl0ZShQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlVGVzdHMuY2xhc3MpOwogCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmNsYXNzKTsKIAkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuY2xhc3MpOwogCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtQmFzaWNNYXBwaW5nVGVzdHMuY2xhc3MpOwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEKaW5kZXggNWFiNzZmZS4uMmVmMGUyNCAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUFzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cy5qYXZhCkBAIC0xLDIxICsxLDIyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CkBAIC0yNCw2ICsyNSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgT3JtQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwdWJsaWMgT3JtQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0zNSwyMiArMzcsMjMgQEAKIAkJc3VwZXIuc2V0VXAoKTsKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CiAJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKIAkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG9ybUVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0TnVsbCh4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3JtRW50aXR5LmFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0VHJ1ZShvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlcygpLmhhc05leHQoKSk7CiAJCWFzc2VydEZhbHNlKGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaXNFbXB0eSgpKTsKIAkJCiAJCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCkBAIC02OCwxOCArNzEsMTkgQEAKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CiAKIAkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5hc3NvY2lhdGlvbk92ZXJyaWRlcygpLmhhc05leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRlQ29udGFpbmVyLmFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKIAkJYXNzZXJ0VHJ1ZShlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmlzRW1wdHkoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CiAKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKIAkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG9ybUVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CiAKIAkJYXNzZXJ0TnVsbChvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWFzc2VydE51bGwoeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwpAQCAtOTcsOTAgKzEwMSw5NiBAQAogCQogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CiAKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlID0gb3JtRW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOworCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKIAkJCiAJCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwogCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJCQkKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7CiAJCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwogCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKKwkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IGpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwogCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCiAJCWFzc2VydEVxdWFscygiQkFSIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7CiAJCQotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjIsIGpvaW5Db2x1bW5zLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMywgam9pbkNvbHVtbnMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4sIGpvaW5Db2x1bW5zLm5leHQoKSk7CiAJCQotCQlqb2luQ29sdW1ucyA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKCkpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOworCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKIAkJCiAJCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwogCQkKLQkJb3JtQXNzb2NpYXRpb25PdmVycmlkZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCiAJCWFzc2VydEVxdWFscygzLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKIAkJCi0JCW9ybUFzc29jaWF0aW9uT3ZlcnJpZGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJam9pbmluZ1N0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWFzc2VydEVxdWFscygyLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwogCi0JCW9ybUFzc29jaWF0aW9uT3ZlcnJpZGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJam9pbmluZ1N0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWFzc2VydEVxdWFscygxLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7CiAJCQotCQlvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlhc3NlcnRFcXVhbHMoMCwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwoKSk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG9ybUVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7CisJCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwogCQkKIAkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7CiAKLQkJb3JtQXNzb2NpYXRpb25PdmVycmlkZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCiAJCWFzc2VydEVxdWFscygzLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKIAkJCiAJCQotCQlvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWpvaW5pbmdTdHJhdGVneS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigyLCAwKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CkBAIC0xOTAsOCArMjAwLDggQEAKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7CiAKIAotCQlvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJam9pbmluZ1N0cmF0ZWd5Lm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOworCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwpAQCAtMjAyLDU0ICsyMTIsNTYgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlID0gb3JtRW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKKwkJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCU9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CiAJCQogCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKTsKIAkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uSW1wbCgpKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uSW1wbCgpKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uSW1wbCgpKTsKKwkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOworCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7CisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKIAkJCiAJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7CiAJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7CiAJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7CiAKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAkJCiAJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKDIsIDApOwotCQlqb2luQ29sdW1ucyA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAogCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkubW92ZSgwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAKIAkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAKIAkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAJCQogCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKIAl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1BdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuamF2YQppbmRleCBmNTExZDEyLi42MGUxOGI4IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuamF2YQpAQCAtMSwxOCArMSwxOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgT3JtQXR0cmlidXRlT3ZlcnJpZGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAJcHVibGljIE9ybUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTMzLDIyICszNCwyMyBAQAogCQlzdXBlci5zZXRVcCgpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7CisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKIAkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJCiAJCWFzc2VydE51bGwob3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3JtRW50aXR5LmF0dHJpYnV0ZU92ZXJyaWRlcygpLmhhc05leHQoKSk7CisJCWFzc2VydFRydWUob3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKIAkJYXNzZXJ0RmFsc2UoZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuaXNFbXB0eSgpKTsKIAkJCiAJCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCkBAIC02NiwxOCArNjgsMTkgQEAKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7CiAKIAkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuYXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKIAkJYXNzZXJ0VHJ1ZShlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5pc0VtcHR5KCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKIAkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAogCQlhc3NlcnROdWxsKG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWFzc2VydE51bGwoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1CYXNpY01hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1CYXNpY01hcHBpbmdUZXN0cy5qYXZhCmluZGV4IDU4NjlmNjAuLjE1YTdkNTAgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQmFzaWNNYXBwaW5nVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTQsMTUgKzE0LDE4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW51bVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnVtZXJhdGVkQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwpAQCAtMzcsNiArNDAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE9ybUJhc2ljTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwdWJsaWMgT3JtQmFzaWNNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTQ4LDUxICs1MiwxMSBAQAogCQlzdXBlci5zZXRVcCgpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQmFzaWNBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFzaWMiLCAiRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkNvbHVtbiIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJImJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsiICsKLQkJCSJib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJImJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJTdHJpbmcgdGFibGUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OyIgKwotCQkJImludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IiArCi0JCQkiaW50IHNjYWxlKCkgZGVmYXVsdCAwOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVMb2JBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTG9iIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnVtZXJhdGVkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudW1lcmF0ZWQiLCAiRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlbXBvcmFsQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRlbXBvcmFsIiwgIlRlbXBvcmFsVHlwZSB2YWx1ZSgpOyIpOwkJCisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUJhc2ljQW5ub3RhdGlvbigpOwotCQljcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUxvYkFubm90YXRpb24oKTsKLQkJY3JlYXRlVGVtcG9yYWxBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUVudW1lcmF0ZWRBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTExOSwxMCArODMsMTAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwogCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKKwkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKIAkJCiAJCWFzc2VydEVxdWFscygiYmFzaWNNYXBwaW5nIiwgb3JtQmFzaWNNYXBwaW5nLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiYmFzaWNNYXBwaW5nIiwgYmFzaWNSZXNvdXJjZS5nZXROYW1lKCkpOwpAQCAtMTM5LDEwICsxMDMsMTAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwogCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKKwkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKIAkJCiAJCWFzc2VydEVxdWFscygiYmFzaWNNYXBwaW5nIiwgb3JtQmFzaWNNYXBwaW5nLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiYmFzaWNNYXBwaW5nIiwgYmFzaWNSZXNvdXJjZS5nZXROYW1lKCkpOwpAQCAtMTU5LDEwICsxMjMsMTAgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwogCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKKwkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0RmV0Y2goKSk7CkBAIC0xODMsMTAgKzE0NywxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwogCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKKwkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0RmV0Y2goKSk7CkBAIC0yMDcsNTggKzE3MSw1OSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CiAJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOworCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKKwkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOwogCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0RW51bWVyYXRlZCgpKTsKIAkJCQkKIAkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKIAkJYmFzaWNSZXNvdXJjZS5zZXRFbnVtZXJhdGVkKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5PUkRJTkFMKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkpOworCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwsIGJhc2ljUmVzb3VyY2UuZ2V0RW51bWVyYXRlZCgpKTsKIAkKIAkJYmFzaWNSZXNvdXJjZS5zZXRFbnVtZXJhdGVkKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORywgYmFzaWNSZXNvdXJjZS5nZXRFbnVtZXJhdGVkKCkpOwogCiAJCS8vc2V0IGVudW1lcmF0ZWQgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKIAkJYmFzaWNSZXNvdXJjZS5zZXRFbnVtZXJhdGVkKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkpOworCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CiAJCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRFbnVtZXJhdGVkKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CiAJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOworCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKKwkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOwogCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0RW51bWVyYXRlZCgpKTsKIAkJCQkKIAkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7CisJCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLkVOVU1FUkFURURfQ09OVkVSVEVSKTsKKwkJKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLk9SRElOQUwpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwsIGJhc2ljUmVzb3VyY2UuZ2V0RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkpOworCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwogCQotCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5TVFJJTkcpOworCQkoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuU1RSSU5HKTsKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcsIGJhc2ljUmVzb3VyY2UuZ2V0RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSk7CisJCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKIAogCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQobnVsbCk7CisJCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIobnVsbCk7CiAJCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkpOworCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CiAJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOworCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKQEAgLTI3OSwxMCArMjQ0LDEwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CiAJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOworCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKQEAgLTMwMyw5OSArMjY4LDEwMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTG9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CisJCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CiAJCQotCQlhc3NlcnRGYWxzZShvcm1CYXNpY01hcHBpbmcuaXNMb2IoKSk7CisJCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKIAkJYXNzZXJ0RmFsc2UoYmFzaWNSZXNvdXJjZS5pc0xvYigpKTsKIAkJCQkKIAkJLy9zZXQgbG9iIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQliYXNpY1Jlc291cmNlLnNldExvYih0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShvcm1CYXNpY01hcHBpbmcuaXNMb2IoKSk7CisJCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTE9CX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CiAJCWFzc2VydFRydWUoYmFzaWNSZXNvdXJjZS5pc0xvYigpKTsKIAogCQkvL3NldCBsb2IgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKIAkJYmFzaWNSZXNvdXJjZS5zZXRMb2IoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvcm1CYXNpY01hcHBpbmcuaXNMb2IoKSk7CisJCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKIAkJYXNzZXJ0RmFsc2UoYmFzaWNSZXNvdXJjZS5pc0xvYigpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZExvYigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CiAJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOworCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwogCQotCQlhc3NlcnRGYWxzZShvcm1CYXNpY01hcHBpbmcuaXNMb2IoKSk7CisJCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKIAkJYXNzZXJ0RmFsc2UoYmFzaWNSZXNvdXJjZS5pc0xvYigpKTsKIAkJCQkKIAkJLy9zZXQgbG9iIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1CYXNpY01hcHBpbmcuc2V0TG9iKHRydWUpOworCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5MT0JfQ09OVkVSVEVSKTsKIAkJYXNzZXJ0VHJ1ZShiYXNpY1Jlc291cmNlLmlzTG9iKCkpOwotCQlhc3NlcnRUcnVlKG9ybUJhc2ljTWFwcGluZy5pc0xvYigpKTsKKwkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5MT0JfQ09OVkVSVEVSLCBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKIAkKIAkJLy9zZXQgbG9iIHRvIGZhbHNlIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRMb2IoZmFsc2UpOworCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKG51bGwpOwogCQlhc3NlcnRGYWxzZShiYXNpY1Jlc291cmNlLmlzTG9iKCkpOwotCQlhc3NlcnRGYWxzZShvcm1CYXNpY01hcHBpbmcuaXNMb2IoKSk7CisJCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CisJCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CiAJCQotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOwogCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7CiAJCQkJCiAJCS8vc2V0IHRlbXBvcmFsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQliYXNpY1Jlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgb3JtQmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBiYXNpY1Jlc291cmNlLmdldFRlbXBvcmFsKCkpOwogCQogCQliYXNpY1Jlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgb3JtQmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FLCBiYXNpY1Jlc291cmNlLmdldFRlbXBvcmFsKCkpOwogCiAJCWJhc2ljUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVApOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgb3JtQmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7CiAJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgYmFzaWNSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKIAogCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAogCQliYXNpY1Jlc291cmNlLnNldFRlbXBvcmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOwogCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CiAJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOworCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKIAkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldFRlbXBvcmFsKCkpOwogCQkJCQogCQkvL3NldCB0ZW1wb3JhbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5EQVRFKTsKKwkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKTsKKwkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLkRBVEUpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBiYXNpY1Jlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsIG9ybUJhc2ljTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKIAkKLQkJb3JtQmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FLCBiYXNpY1Jlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsIG9ybUJhc2ljTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKIAotCQlvcm1CYXNpY01hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCk7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIGJhc2ljUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCBvcm1CYXNpY01hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKIAogCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChudWxsKTsKKwkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihudWxsKTsKIAkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOwogCX0KIAkKIAkvL1RPRE8gdGVzdCBkZWZhdWx0cwpAQCAtNDA1LDcgKzM3MSw3IEBACiAJcHVibGljIHZvaWQgdGVzdEJhc2ljTWFwcGluZ05vVW5kZXJ5bGluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwogCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZm9vIik7CiAJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CiAJCQpAQCAtNDEzLDE0ICszNzksMTEgQEAKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1CYXNpY01hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKKwkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOwogCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKIAkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUJhc2ljTWFwcGluZy5pc0xvYigpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsIG9ybUJhc2ljTWFwcGluZy5nZXRFbnVtZXJhdGVkKCkpOwogCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1CYXNpY01hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUJhc2ljTWFwcGluZy5nZXRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1CYXNpY01hcHBpbmcuaXNPcHRpb25hbCgpKTsKIAogCQkKIAkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKQEAgLTQzNiwxNSArMzk5LDE1IEBACiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwogCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjU1KSwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMCksIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDApLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKIAl9CiAJCiAJLy9AQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlKQpAQCAtNDU2LDE3ICs0MTksMTYgQEAKIAkvL0BFbnVtZXJhdGVkKEVudW1UeXBlLlNUUklORykKIAlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQkKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUJhc2ljTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG9ybUJhc2ljTWFwcGluZy5pc0xvYigpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSk7CisJCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuRU5VTUVSQVRFRF9DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0RW51bVR5cGUoKSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgb3JtQmFzaWNNYXBwaW5nLmdldFRlbXBvcmFsKCkpOwogCQkKIAkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKIAkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKQEAgLTQ4MywxOCArNDQ1LDE2IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwogCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQkKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUJhc2ljTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShvcm1CYXNpY01hcHBpbmcuaXNMb2IoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwogCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CiAJCQogCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwogCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CkBAIC01MTIsNyArNDcyLDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7CiAKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwogCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwogCQkKQEAgLTUyMCwxNCArNDgwLDExIEBACiAJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydEVxdWFscygiaWQiLCBvcm1CYXNpY01hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRW51bWVyYXRlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwogCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKIAkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUJhc2ljTWFwcGluZy5pc0xvYigpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsIG9ybUJhc2ljTWFwcGluZy5nZXREZWZhdWx0RW51bWVyYXRlZCgpKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtQmFzaWNNYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQmFzaWNNYXBwaW5nLmdldERlZmF1bHRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1CYXNpY01hcHBpbmcuaXNEZWZhdWx0T3B0aW9uYWwoKSk7CiAJCQogCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwogCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwpAQCAtNTQyLDE1ICs0OTksMTUgQEAKIAkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldERlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHRVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHROdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwogCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDI1NSksIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDApLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigwKSwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDI1NSwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7CiAKIAl9CiAJLy8zIHRoaW5ncyB0ZXN0ZWQgYWJvdmUKQEAgLTU2MSwxNSArNTE4LDE0IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWMiKTsKIAkJCiAJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0TG9iKHRydWUpOwotCQliYXNpY01hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5PUkRJTkFMKTsKKwkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKTsKKwkJKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwogCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwpAQCAtNTc5LDIxICs1MzUsMTkgQEAKIAkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwogCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKIAkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRUZW1wb3JhbCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWMiKTsKIAkJCiAJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0TG9iKHRydWUpOwotCQliYXNpY01hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRW51bWVyYXRlZChFbnVtVHlwZS5PUkRJTkFMKTsKKwkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKTsKKwkJKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwogCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwpAQCAtNjAzLDIxICs1NTcsMTkgQEAKIAkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwogCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwogCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0VGVtcG9yYWwoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgKChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOwogCQkKIAkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpOworCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CiAJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CkBAIC02MzEsMTUgKzU4MywxNCBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljIik7CiAJCQogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7CisJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7CiAJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKIAkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKQEAgLTY1MywxNSArNjA0LDE0IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOwogCQkKIAkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpOworCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CiAJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CkBAIC02NzUsMTUgKzYyNSwxNCBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljIik7CiAJCQogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7CisJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7CiAJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKIAkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKQEAgLTY5NywxNSArNjQ2LDE0IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljIik7CiAJCQogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7CisJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7CiAJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKIAkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKQEAgLTcxOSwxNSArNjY3LDE0IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljIik7CiAJCQogCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldExvYih0cnVlKTsKLQkJYmFzaWNNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEVudW1lcmF0ZWQoRW51bVR5cGUuT1JESU5BTCk7CisJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7CiAJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKIAkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKQEAgLTc0MSwxNSArNjg4LDE0IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOwogCQkKIAkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRMb2IodHJ1ZSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpOworCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CiAJCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7CiAJCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUNhc2NhZGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1DYXNjYWRlVGVzdHMuamF2YQppbmRleCA4OGE3NGM0Li5kOWE3YzdiIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUNhc2NhZGVUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQ2FzY2FkZVRlc3RzLmphdmEKQEAgLTEsMTMgKzEsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CkBAIC0yMiw2ICsyMSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgT3JtQ2FzY2FkZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwdWJsaWMgT3JtQ2FzY2FkZVRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0zNCwyMiArMzQsMjIgQEAKIAkJc3VwZXIuc2V0VXAoKTsKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CiAJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhc2NhZGVBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7CiAJCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CiAJCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNBbGwoKSk7CiAJCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKIAkJCiAJCS8vc2V0IGNhc2NhZGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZUltcGwoKSk7CisJCW9uZVRvT25lLnNldENhc2NhZGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2FzY2FkZVR5cGUoKSk7CiAJCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc0FsbCgpKTsKIAkJYXNzZXJ0Tm90TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwogCQkJCQpAQCAtNjUsMTAgKzY1LDEwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCQkKIAkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKIAkJCkBAIC04NywxNyArODcsMTcgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUGVyc2lzdCgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwogCQkKIAkJLy9zZXQgY2FzY2FkZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb09uZS5zZXRDYXNjYWRlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2NhZGVUeXBlSW1wbCgpKTsKKwkJb25lVG9PbmUuc2V0Q2FzY2FkZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUGVyc2lzdCgpKTsKIAkJYXNzZXJ0Tm90TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwogCQkJCQpAQCAtMTEzLDEwICsxMTMsMTAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCQkKIAkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKIAkJCkBAIC0xMzUsMTcgKzEzNSwxNyBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzTWVyZ2UoKSk7CiAJCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKIAkJCiAJCS8vc2V0IGNhc2NhZGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZUltcGwoKSk7CisJCW9uZVRvT25lLnNldENhc2NhZGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2FzY2FkZVR5cGUoKSk7CiAJCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc01lcmdlKCkpOwogCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7CiAJCQkJCkBAIC0xNjEsMTAgKzE2MSwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCQkKIAkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKIAkJCkBAIC0xODMsMTcgKzE4MywxNyBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKIAkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOworCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKIAkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKIAkJCiAJCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1JlbW92ZSgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwogCQkKIAkJLy9zZXQgY2FzY2FkZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb09uZS5zZXRDYXNjYWRlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2NhZGVUeXBlSW1wbCgpKTsKKwkJb25lVG9PbmUuc2V0Q2FzY2FkZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUmVtb3ZlKCkpOwogCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7CiAJCQkJCkBAIC0yMDksMTAgKzIwOSwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKIAkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOworCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKIAkJCiAJCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7CiAJCQpAQCAtMjMxLDE3ICsyMzEsMTcgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhc2NhZGVSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUmVmcmVzaCgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwogCQkKIAkJLy9zZXQgY2FzY2FkZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb09uZS5zZXRDYXNjYWRlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2NhZGVUeXBlSW1wbCgpKTsKKwkJb25lVG9PbmUuc2V0Q2FzY2FkZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUmVmcmVzaCgpKTsKIAkJYXNzZXJ0Tm90TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwogCQkJCQpAQCAtMjU3LDEwICsyNTcsMTAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCQkKIAkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKIAkJCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUNvbHVtblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUNvbHVtblRlc3RzLmphdmEKaW5kZXggYzc3ZGY5Zi4uZjQxMjY0ZiAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Db2x1bW5UZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQ29sdW1uVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0yOCw5ICsyOCw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgT3JtQ29sdW1uVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXB1YmxpYyBPcm1Db2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtNDIsMjIgKzQyLDExIEBACiAJCXN1cGVyLnNldFVwKCk7CiAJCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwogCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVJZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWQiLCAiIik7CQkKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKKwkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTc0LDQwICs2MywyMiBAQAogCQl9KTsKIAl9CiAJCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CiAKIAkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7CiAJCQogCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uSW1wbCgpKTsKKwkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpKTsKIAkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJZ2V0T3JtWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGJhc2ljLmdldENvbHVtbigpLmdldE5hbWUoKSk7CiAJCkBAIC0xMjYsMTIgKzk3LDEyIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CiAKIAkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKQEAgLTE0OSwxOSArMTIwLDE5IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CiAKIAkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKIAkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7CiAJCQogCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uSW1wbCgpKTsKKwkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpKTsKIAkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiRk9PIik7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKQEAgLTE4MSwxMiArMTUyLDEyIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CiAKIAkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKQEAgLTIwNCwxOSArMTc1LDE5IEBACiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CiAKIAkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7CiAJCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwogCQkKIAkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbkltcGwoKSk7CisJCWJhc2ljLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW4oKSk7CiAJCWJhc2ljLmdldENvbHVtbigpLnNldFRhYmxlKCJGT08iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CkBAIC0yMzYsMTIgKzIwNywxMiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwogCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKIAogCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKQEAgLTI1OSwxOSArMjMwLDE5IEBACiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CiAKIAkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7CiAJCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwogCQkKIAkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbkltcGwoKSk7CisJCWJhc2ljLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW4oKSk7CiAJCWJhc2ljLmdldENvbHVtbigpLnNldE51bGxhYmxlKEJvb2xlYW4uVFJVRSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0TnVsbGFibGUoKSk7CkBAIC0yOTEsMTIgKzI2MiwxMiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwogCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKIAogCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKQEAgLTMxNCwxOSArMjg1LDE5IEBACiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CiAJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwogCiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKIAkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7CiAJCQogCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uSW1wbCgpKTsKKwkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpKTsKIAkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0VXBkYXRhYmxlKEJvb2xlYW4uVFJVRSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljLmdldENvbHVtbigpLmdldFVwZGF0YWJsZSgpKTsKQEAgLTM0NiwxMiArMzE3LDEyIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwogCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKIAogCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7CkBAIC0zNjksMTkgKzM0MCwxOSBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CiAKIAkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKIAkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7CiAJCQogCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uSW1wbCgpKTsKKwkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpKTsKIAkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0SW5zZXJ0YWJsZShCb29sZWFuLlRSVUUpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0SW5zZXJ0YWJsZSgpKTsKQEAgLTQwMSwxMiArMzcyLDEyIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CiAKIAkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKQEAgLTQyNCwxOSArMzk1LDE5IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwogCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKIAogCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7CiAJCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwogCQkKIAkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbkltcGwoKSk7CisJCWJhc2ljLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW4oKSk7CiAJCWJhc2ljLmdldENvbHVtbigpLnNldFVuaXF1ZShCb29sZWFuLlRSVUUpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRVbmlxdWUoKSk7CkBAIC00NTYsMTIgKzQyNywxMiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CiAKIAkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwpAQCAtNDc5LDE5ICs0NTAsMTkgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CiAJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwogCiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKIAkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7CiAJCQogCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uSW1wbCgpKTsKKwkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpKTsKIAkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0TGVuZ3RoKEludGVnZXIudmFsdWVPZig4KSk7CiAJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOCksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7CiAJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOCksIGJhc2ljLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKQEAgLTUxMSwxMiArNDgyLDEyIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwogCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKIAogCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7CkBAIC01MzQsMTkgKzUwNSwxOSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkUHJlY2lzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKIAkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CiAKIAkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwogCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKIAkJCiAJCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW5JbXBsKCkpOworCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uKCkpOwogCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDgpKTsKIAkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKIAkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4KSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwpAQCAtNTY2LDEyICs1MzcsMTIgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFByZWNpc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CiAJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwogCiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKQEAgLTU4OSwxOSArNTYwLDE5IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2FsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CiAJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwogCiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKIAkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7CiAJCQogCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uSW1wbCgpKTsKKwkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpKTsKIAkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0U2NhbGUoSW50ZWdlci52YWx1ZU9mKDgpKTsKIAkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwogCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKQEAgLTYyMSwxMiArNTkyLDEyIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTY2FsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CiAJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwogCiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKQEAgLTY0Niw3ICs2MTcsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKIAkJYXR0cmlidXRlcy5uZXh0KCk7CQogCQkKQEAgLTY2MSw5ICs2MzIsOSBAQAogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX0xFTkdUSCwgb3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9TQ0FMRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkuaW50VmFsdWUoKSk7CiAJCiAJCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKIAkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIikuZ2V0TWFwcGluZygpOwpAQCAtNjc0LDkgKzY0NSw5IEBACiAJCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKIAkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCiAJCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CQotCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChuZXcgSW50ZWdlcig0NSkpOwotCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihuZXcgSW50ZWdlcig0NikpOwotCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKG5ldyBJbnRlZ2VyKDQ3KSk7CisJCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOworCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKKwkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKIAogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKQEAgLTY5OSwxMSArNjcwLDExIEBACiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9TQ0FMRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOworCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKS5pbnRWYWx1ZSgpKTsKIAkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CiAJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwogCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwpAQCAtNzEyLDkgKzY4Myw5IEBACiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9TQ0FMRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOworCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkuaW50VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKS5pbnRWYWx1ZSgpKTsKIAkKIAkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CiAJCWFzc2VydEVxdWFscygibmFtZSIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwpAQCAtNzI0LDEyICs2OTUsMTIgQEAKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX0xFTkdUSCwgb3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7CisJCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKS5pbnRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpLmludFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpLmludFZhbHVlKCkpOwogCQkKIAkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgZmFsc2UsIG9ybS54bWwgdmlydHVhbCBjb2x1bW4gZ2V0cyBzZXR0aW5nIGZyb20gamF2YSBhbm5vdGF0aW9uCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwogCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CkBAIC03NDUsNyArNzE2LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0TnVsbENvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJuYW1lIik7CiAKIAkJT3JtQmFzaWNNYXBwaW5nIG5hbWVWaXJ0dWFsTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQpAQCAtNzYwLDE3ICs3MzEsMTcgQEAKIAkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQogCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKIAkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG5ldyBJbnRlZ2VyKDQ1KSk7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG5ldyBJbnRlZ2VyKDQ2KSk7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobmV3IEludGVnZXIoNDcpKTsKKwkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDQ1KSk7CisJCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOworCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwogCiAJCiAJCWFzc2VydEVxdWFscygibmFtZSIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXREZWZhdWx0VW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7CiAJCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwogCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKIAkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwpAQCAtNzg5LDcgKzc2MCw3IEBACiAJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxDb2x1bW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOwogCQlhdHRyaWJ1dGVzLm5leHQoKTsJCiAJCQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmphdmEKaW5kZXggZjAwYTYyOS4uOWRlZmVkMCAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMTEgKzksMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwogCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JDb2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1EaXNjcmltaW5hdG9yQ29sdW1uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKQEAgLTI0LDggKzI1LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE9ybURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAJcHVibGljIE9ybURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtMzcsMzggKzM4LDI4IEBACiAJCXN1cGVyLnNldFVwKCk7CiAJCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwogCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKKwkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CiAJfQogCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOwogCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7CiAJCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOworCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIEZJTEVfTkFNRSwgc291cmNlV3JpdGVyKTsKIAl9CiAJCisJCiAJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewogCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewpAQCAtODgsMTEgKzc5LDExIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKQEAgLTExOCwxMSArMTA5LDExIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKQEAgLTE5NSwxMSArMTg2LDExIEBACiAvLwl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCU9ybURpc2NyaW1pbmF0b3JDb2x1bW4gb3JtQ29sdW1uID0gb3JtRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAogCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKQEAgLTIyNSwxMSArMjE2LDExIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCQlPcm1EaXNjcmltaW5hdG9yQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAKIAkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7CkBAIC0yNDYsMTEgKzIzNywxMSBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKQEAgLTI3NiwxMSArMjY3LDExIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKQEAgLTI5NywxMSArMjg4LDExIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCU9ybURpc2NyaW1pbmF0b3JDb2x1bW4gb3JtQ29sdW1uID0gb3JtRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAogCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKIAkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwpAQCAtMzI3LDExICszMTgsMTEgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7CkBAIC0zNDYsNCArMzM3LDEyMCBAQAogCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKIAkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwogCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHNOb0Rpc2NyaW1pbmF0b3JDb2x1bW5JbkphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5KCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKworCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi4iICsgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCU9ybUVudGl0eSBjaGlsZEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCisJCS8vdGVzdCBkZWZhdWx0cyB3aXRoIHNpbmdsZS10YWJsZSBpbmhlcml0YW5jZSwgbm8gc3BlY2lmaWVkIGRpc2NyaW1pbmF0b3IgY29sdW1uIHNldAorCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTkFNRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX05BTUUsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRSwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKKworCQkKKwkJLy90ZXN0IGRlZmF1bHRzIHdpdGggc2luZ2xlLXRhYmxlIGluaGVyaXRhbmNlLCBzcGVjaWZpZWQgZGlzY3JpbWluYXRvciBjb2x1bW4gc2V0IG9uIHJvb3QKKwkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkRUWVBFMiIpOworCQlhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7CisJCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5DSEFSKTsKKwkJCisJCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBhYnN0cmFjdEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKKwkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9OQU1FLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEUsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiRFRZUEUyIiwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CisJCWFzc2VydEVxdWFscygiRFRZUEUyIiwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoNSwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOworCQkKKwkJCisJCS8vdGVzdCBkZWZhdWx0cyB3aXRoIHRhYmxlLXBlci1jbGFzcyBpbmhlcml0YW5jZSwgZGlzY3JpbWluYXRvciBjb2x1bW4gZG9lcyBub3QgYXBwbHkKKwkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CisJCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7CisJCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShudWxsKTsKKwkJYWJzdHJhY3RFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKKwkJCisJCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBhYnN0cmFjdEVudGl0eS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHNEaXNjcmltaW5hdG9yQ29sdW1uSW5KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eSgpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisKKwkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuIiArICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlPcm1FbnRpdHkgY2hpbGRFbnRpdHkgPSAoT3JtRW50aXR5KSBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJCisJCSgoRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJKChFbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOworCQkoKEVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUuQ0hBUik7CisJCQorCQkvL3Rlc3QgZGVmYXVsdHMgd2l0aCBzaW5nbGUtdGFibGUgaW5oZXJpdGFuY2UsIHNwZWNpZmllZCBkaXNjcmltaW5hdG9yIGNvbHVtbiBzZXQgaW4gamF2YQorCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoNSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuQ0hBUiwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKKworCQkKKwkJLy90ZXN0IGRlZmF1bHRzIHdpdGggc2luZ2xlLXRhYmxlIGluaGVyaXRhbmNlLCBzcGVjaWZpZWQgZGlzY3JpbWluYXRvciBjb2x1bW4gc2V0IGluIGphdmEsIG1ldGFkYXRhLWNvbXBsZXRlIHRydWUKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTkFNRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX05BTUUsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRSwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKKwkJCisJCQorCQkvL3Rlc3QgZGVmYXVsdHMgd2l0aCBzaW5nbGUtdGFibGUgaW5oZXJpdGFuY2UsIHNwZWNpZmllZCBkaXNjcmltaW5hdG9yIGNvbHVtbiBzZXQgaW4gb3JtCisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CisJCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNikpOworCQlhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUik7CisJCQorCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTkFNRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDYsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUiwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKKworCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRhYmxlVGVzdHMuamF2YQppbmRleCBjMWY4MjA3Li45MGVkY2UxIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGVUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkYWJsZVRlc3RzLmphdmEKQEAgLTEsMTMgKzEsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CkBAIC0yNiw2ICsyNSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgT3JtRW1iZWRkYWJsZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwdWJsaWMgT3JtRW1iZWRkYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0zOCwxNCArMzgsMTQgQEAKIAkJc3VwZXIuc2V0VXAoKTsKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CiAJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVtYmVkZGFibGUgb3JtRW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOworCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW1iZWRkYWJsZS5nZXRDbGFzc18oKSk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW1iZWRkYWJsZVJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKIAkJCkBAIC02MSw5ICs2MSw5IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7CisJCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwogCQkKQEAgLTgwLDM4ICs4MCwzNiBAQAogCS8vVE9ETyBhZGQgdGVzdHMgZm9yIHNldHRpbmcgdGhlIGNsYXNzTmFtZSB3aGVuIHRoZSBwYWNrYWdlIGlzIHNldCBvbiBlbnRpdHktbWFwcGluZ3MKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOworCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKIAkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwogCQkKIAkJLy9zZXQgYWNjZXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGVtYmVkZGFibGVSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7CiAJCiAJCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAogCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKIAkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOworCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKIAkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwogCQkKIAkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtRW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVtYmVkZGFibGVSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7CiAJCQogCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbWJlZGRhYmxlLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOworCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKIAkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwogCX0KIAkvL1RPRE8gdGVzdCBkZWZhdWx0IGFjY2VzcyBmcm9tCkBAIC0xMjEsMjAgKzExOSwyMCBAQAogCQkvL3dpdGggeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgc2V0CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVtYmVkZGFibGUgb3JtRW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOworCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7CiAJCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCQogCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW1iZWRkYWJsZVJlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydFRydWUob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOworCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0TWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQogCQkvL3NldCBhY2Nlc3MgdG8gZmFsc2UgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVtYmVkZGFibGVSZXNvdXJjZS5zZXRNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKKwkJZW1iZWRkYWJsZVJlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJCiAJCWVtYmVkZGFibGVSZXNvdXJjZS5zZXRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwogCQlhc3NlcnROdWxsKG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKQEAgLTE0MiwyMCArMTQwLDIwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKKwkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwogCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQkKIAkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKIAkJb3JtRW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydFRydWUob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQkKIAkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKIAkJb3JtRW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCQogCQlvcm1FbWJlZGRhYmxlLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CiAJCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwpAQCAtMTYzLDU0ICsxNjEsNTQgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKKwkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwogCQlhc3NlcnROdWxsKG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0RmFsc2Uob3JtRW1iZWRkYWJsZS5pc0RlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwogCQlhc3NlcnRUcnVlKG9ybUVtYmVkZGFibGUuaXNEZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CiAJCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnRGYWxzZShvcm1FbWJlZGRhYmxlLmlzRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKKwkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwogCQlhc3NlcnROdWxsKG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0RmFsc2Uob3JtRW1iZWRkYWJsZS5pc01ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CiAJCWFzc2VydFRydWUob3JtRW1iZWRkYWJsZS5pc01ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwogCQlhc3NlcnRGYWxzZShvcm1FbWJlZGRhYmxlLmlzTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNYWtlRW1iZWRkYWJsZUVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJZW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CisJCWVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CiAJCWVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwogCQogCQllbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbnRpdHkuZ2V0Q2xhc3NOYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBlbnRpdHkuZ2V0QWNjZXNzKCkpOwpAQCAtMjIwLDIwICsyMTgsMjAgQEAKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKIAl9CiAJCQogCS8vdGVzdCB3aXRoIDIgRW1iZWRkYWJsZXMsIG1ha2UgdGhlIHNlY29uZCBvbmUgYW4gRW50aXR5IHNvIGl0IGhhcyB0byBtb3ZlIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdAogCXB1YmxpYyB2b2lkIHRlc3RNYWtlRW1iZWRkYWJsZUVudGl0eTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJZW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CisJCWVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CiAJCWVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwogCQogCQllbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbnRpdHkuZ2V0Q2xhc3NOYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBlbnRpdHkuZ2V0QWNjZXNzKCkpOwpAQCAtMjQzLDIyICsyNDEsMjIgQEAKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzID0gZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBwZXJzaXN0ZW50VHlwZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnBlcnNpc3RlbnRUeXBlcygpOwogCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRUeXBlcy5uZXh0KCkuZ2V0TWFwcGluZ0tleSgpKTsKIAkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudFR5cGVzLm5leHQoKS5nZXRNYXBwaW5nS2V5KCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TWFrZUVtYmVkZGFibGVNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQllbWJlZGRhYmxlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKKwkJZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKIAkJZW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CiAJCiAJCWVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpOwogCQkKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyAgbWFwcGVkU3VwZXJjbGFzcyA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgIG1hcHBlZFN1cGVyY2xhc3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBtYXBwZWRTdXBlcmNsYXNzLmdldENsYXNzTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGVkU3VwZXJjbGFzcy5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIG1hcHBlZFN1cGVyY2xhc3MuZ2V0QWNjZXNzKCkpOwpAQCAtMjY2LDIwICsyNjQsMjAgQEAKIAkJT3JtTWFwcGVkU3VwZXJjbGFzcyBvcm1NYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKIAl9CiAJCiAJLy90ZXN0IHdpdGggMiBFbWJlZGRhYmxlcywgbWFrZSB0aGUgc2Vjb25kIG9uZSBhIE1hcHBlZFN1cGVyY2xhc3Mgc28gaXQgaGFzIHRvIG1vdmUgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0CiAJcHVibGljIHZvaWQgdGVzdE1ha2VFbWJlZGRhYmxlTWFwcGVkU3VwZXJjbGFzczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJZW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CisJCWVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CiAJCWVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwogCQogCQllbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKTsKIAkJCi0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgIG1hcHBlZFN1cGVyY2xhc3MgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzICBtYXBwZWRTdXBlcmNsYXNzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgbWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc05hbWUoKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBlZFN1cGVyY2xhc3MuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBtYXBwZWRTdXBlcmNsYXNzLmdldEFjY2VzcygpKTsKQEAgLTI4Nyw5ICsyODUsOSBAQAogCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldENsYXNzXygpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBwZXJzaXN0ZW50VHlwZXMgPSBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpOworCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IHBlcnNpc3RlbnRUeXBlcyA9IGdldEVudGl0eU1hcHBpbmdzKCkucGVyc2lzdGVudFR5cGVzKCk7CiAJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50VHlwZXMubmV4dCgpLmdldE1hcHBpbmdLZXkoKSk7CiAJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRUeXBlcy5uZXh0KCkuZ2V0TWFwcGluZ0tleSgpKTsKIAl9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmdUZXN0cy5qYXZhCmluZGV4IDVhMDVmMDguLjA1NmI4ZDMgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmdUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmdUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE2LDYgKzE2LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29sdW1uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CkBAIC0yOCw2ICsyOSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nOwpAQCAtNDIsNiArNDQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE9ybUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSA9ICJjaXR5IjsKQEAgLTU2LDQyICs1OSwxMSBAQAogCQlzdXBlci5zZXRVcCgpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7CisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCX0KIAkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtYmVkZGVkSWRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW1iZWRkZWRJZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJDb2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7IiArCi0JCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJImludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsiICsKLQkJCSJpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyIgKwotCQkJImludCBzY2FsZSgpIGRlZmF1bHQgMDsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNvbHVtbkFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQXR0cmlidXRlT3ZlcnJpZGUiLCAKLQkJCSJTdHJpbmcgbmFtZSgpOyIgKwotCQkJIkNvbHVtbiBjb2x1bW4oKTsiKTsJCQotCX0KIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlRW1iZWRkZWRJZEFubm90YXRpb24oKTsKLQkJY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTMwMSw5ICsyNzMsOSBAQAogLy8JCVhtbEVtYmVkZGVkSWRNYXBwaW5nIHhtbEVtYmVkZGVkSWRNYXBwaW5nID0gKFhtbEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIC8vCQlFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7CiAvLwkJCi0vLwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0vLwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0vLwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7CisvLwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKy8vCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlKCkpOworLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGUoKSk7CiAvLwkJCiAvLwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKIC8vCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwpAQCAtMzQ2LDE0ICszMTgsMTQgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRJZCIpOwogCQkKIAkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOworCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwpAQCAtMzY3LDE0ICszMzksMTQgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkIik7CiAJCQogCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7CisJCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7CkBAIC0zODgsMTQgKzM2MCwxNCBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZElkTW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRJZCIpOwogCQkKIAkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOworCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwpAQCAtNDA5LDE0ICszODEsMTQgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRJZCIpOwogCQkKIAkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOworCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwpAQCAtNDMwLDE0ICs0MDIsMTQgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRJZCIpOwogCQkKIAkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOworCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwpAQCAtNDQ3LDIxICs0MTksMjEgQEAKIAkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwogCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKIAkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZElkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoIm92ZXJyaWRlIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJPVkVSUklERV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRJZCIpOwogCQkKIAkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOworCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwpAQCAtNDc1LDE0ICs0NDcsMTQgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWQiKTsKIAkJCiAJCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKKwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKQEAgLTQ5NiwxNCArNDY4LDE0IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkSWRNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkIik7CiAJCQogCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7CisJCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7CkBAIC01MTUsMTQgKzQ4NywxNCBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZElkTW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWQiKTsKIAkJCiAJCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKKwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKQEAgLTUzNSwxMCArNTA3LDEwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZE1hcHBpbmciKTsKIAkJT3JtRW1iZWRkZWRJZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKKwkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkTWFwcGluZyIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkTWFwcGluZyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKQEAgLTU1NSwxMCArNTI3LDEwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZE1hcHBpbmciKTsKIAkJT3JtRW1iZWRkZWRJZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKKwkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkTWFwcGluZyIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkTWFwcGluZyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKQEAgLTU3NSwxNCArNTQ3LDE1IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwogCQlPcm1FbWJlZGRlZElkTWFwcGluZyBvcm1FbWJlZGRlZElkTWFwcGluZyA9IChPcm1FbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKKwkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwogCi0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7CisJCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CiAJCQogCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwogCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwpAQCAtNTkwLDggKzU2Myw4IEBACiAJCQogCQlhc3NlcnRFcXVhbHMoMywgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CQkKIAkJCi0JCW9ybUVtYmVkZGVkSWRNYXBwaW5nLm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDIsIDApOworCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwpAQCAtNjAxLDggKzU3NCw4IEBACiAJCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwogCiAKLQkJb3JtRW1iZWRkZWRJZE1hcHBpbmcubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDAsIDEpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKQEAgLTYxMyw1MiArNTg2LDUzIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwogCQlPcm1FbWJlZGRlZElkTWFwcGluZyBvcm1FbWJlZGRlZElkTWFwcGluZyA9IChPcm1FbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKKwkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwogCQkKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKKwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKIAkJCiAJCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7CiAJCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7CiAJCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7CiAKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJCQogCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAKIAkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJCQogCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwogCX0KIAkKIAkKQEAgLTY2NiwzMyArNjQwLDM2IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwogCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKIAotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKIAkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJmb28iKTsKIAkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKIAkJCiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCU9ybUVtYmVkZGVkSWRNYXBwaW5nIG9ybUVtYmVkZGVkSWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1FbWJlZGRlZElkTWFwcGluZy5nZXROYW1lKCkpOwogCiAJCQotCQlhc3NlcnRGYWxzZShvcm1FbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvcm1FbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLmhhc05leHQoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwogCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUyID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CiAJCQogCQkvL2VtYmVkZGVkIG1hcHBpbmcgaXMgdmlydHVhbCwgc3BlY2lmaWVkIGF0dHJpYnV0ZSBvdmVycmlkZXMgc2hvdWxkIGV4aXN0Ci0JCU9ybUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkSWRNYXBwaW5nLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7CisJCU9ybUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CkBAIC03MDIsMjAgKzY3OSwzOCBAQAogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZyBqYXZhRW1iZWRkZWRJZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkSWRNYXBwaW5nKSBlbWJlZGRlZElkTWFwcGluZy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7Ci0JCWphdmFFbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PX0NPTFVNTiIpOwotCQlqYXZhRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKKwkJSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGphdmFFbWJlZGRlZElkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7CisJCUNvbHVtbiBqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4gPSBqYXZhRW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0Q29sdW1uKCk7CisJCQorCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PX0NPTFVNTiIpOworCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOworCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOworCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOworCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKKwkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOworCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKKwogCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgcGVyc2lzdGVudFR5cGUyLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJzdGF0ZSIpLmdldE1hcHBpbmcoKTsKIAkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9TVEFURV9DT0xVTU4iKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkSWRNYXBwaW5nLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT09fQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoNSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoNywgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7CiAJCQogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwpAQCAtNzI5LDE3ICs3MjQsMjcgQEAKIAkJCiAJCS8vZW1iZWRkZWQgbWFwcGluZyBpcyBzcGVjaWZpZWQsIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyBzaG91bGQgZXhpc3QKIAkJcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5tYWtlU3BlY2lmaWVkKCk7CisJCWdldE9ybVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAkJZW1iZWRkZWRJZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoNCwgZW1iZWRkZWRJZE1hcHBpbmcuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDI1NSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIk1ZX1NUQVRFX0NPTFVNTiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwpAQCAtNzQ4LDEzICs3NTMsMTMgQEAKIAkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQkKIAkJLy9zZXQgb25lIG9mIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgdG8gc3BlY2lmaWVkLCB2ZXJpZnkgb3RoZXJzIGFyZSBzdGlsbCB2aXJ0dWFsCi0JCWVtYmVkZGVkSWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoNCwgZW1iZWRkZWRJZE1hcHBpbmcuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBlbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRJZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwpAQCAtNzYyLDIzICs3NjcsMjMgQEAKIAkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCX0KLQogCQogCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRJZE1hcHBpbmcoKTsKIAkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7CiAKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CiAJCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCQogCQlPcm1FbWJlZGRlZElkTWFwcGluZyBvcm1FbWJlZGRlZElkTWFwcGluZyA9IChPcm1FbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQorCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9ybUVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CiAJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUVtYmVkZGVkSWRNYXBwaW5nLmdldE5hbWUoKSk7CiAKLQkJYXNzZXJ0RXF1YWxzKDQsIG9ybUVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1FbWJlZGRlZElkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBvcm1BdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBvcm1BdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAogCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CiAJCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKQEAgLTgwNyw4ICs4MTIsOCBAQAogCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRJZE1hcHBpbmcoKTsKIAkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7CiAKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CiAJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CiAJCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CkBAIC04NTYsOCArODYxLDggQEAKIAkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7CiAJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwogCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwogCiAJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwogCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwpAQCAtODY3LDcgKzg3Miw3IEBACiAJCQogCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1FbWJlZGRlZElkTWFwcGluZy5nZXROYW1lKCkpOwogCi0JCWFzc2VydEVxdWFscygwLCBvcm1FbWJlZGRlZElkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwogCQkvL1RPRE8KIC8vCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW1iZWRkZWRJZE1hcHBpbmcuZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpKSk7CiAvLwkJTGlzdEl0ZXJhdG9yPFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBvcm1BdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5kZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCk7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkTWFwcGluZ1Rlc3RzLmphdmEKaW5kZXggYThhYmIzYi4uNmZhMzI0MSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xNSw3ICsxNSw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKQEAgLTI4LDYgKzMwLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CkBAIC00MSw2ICs0NCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgT3JtRW1iZWRkZWRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSA9ICJjaXR5IjsKQEAgLTU1LDQzICs1OSwxMSBAQAogCQlzdXBlci5zZXRVcCgpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbWJlZGRlZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRlZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJDb2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7IiArCi0JCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJImludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsiICsKLQkJCSJpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyIgKwotCQkJImludCBzY2FsZSgpIGRlZmF1bHQgMDsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNvbHVtbkFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQXR0cmlidXRlT3ZlcnJpZGUiLCAKLQkJCSJTdHJpbmcgbmFtZSgpOyIgKwotCQkJIkNvbHVtbiBjb2x1bW4oKTsiKTsJCQorCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVFbWJlZGRlZEFubm90YXRpb24oKTsKLQkJY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTE1MywxMiArMTI1LDEwMSBAQAogCQl9OwogCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwogCX0JCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuSUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFppcENvZGUgemlwQ29kZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiWmlwQ29kZSIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyB6aXA7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHBsdXNmb3VyOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiWmlwQ29kZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRNYXBwaW5nIik7CiAJCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOworCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZE1hcHBpbmciLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZE1hcHBpbmciLCBlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7CkBAIC0xNzUsMTAgKzIzNiwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRNYXBwaW5nIik7CiAJCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOworCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZE1hcHBpbmciLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZE1hcHBpbmciLCBlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7CkBAIC0yNTUsMTQgKzMxNiwxNSBAQAogLy8JfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwogCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKKwkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKIAotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOworCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwogCQkKIAkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7CiAJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwpAQCAtMjcwLDggKzMzMiw4IEBACiAJCQogCQlhc3NlcnRFcXVhbHMoMywgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwkJCiAJCQotCQlvcm1FbWJlZGRlZE1hcHBpbmcubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDIsIDApOworCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwpAQCAtMjgxLDggKzM0Myw4IEBACiAJCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKIAogCi0JCW9ybUVtYmVkZGVkTWFwcGluZy5tb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDAsIDEpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKQEAgLTI5Myw1MiArMzU1LDUzIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwogCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKKwkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKIAkJCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7CisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CiAJCQogCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKIAkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7CiAJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwogCi0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAkJCiAJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAKIAkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwogCQkKIAkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwogCX0KIAkKIAkKQEAgLTM0NiwzMyArNDA5LDM2IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKIAkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7CiAKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CiAJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZm9vIik7CiAJCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CiAJCQogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwogCiAJCQotCQlhc3NlcnRGYWxzZShvcm1FbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwogCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUyID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CiAJCQogCQkvL2VtYmVkZGVkIG1hcHBpbmcgaXMgdmlydHVhbCwgc3BlY2lmaWVkIGF0dHJpYnV0ZSBvdmVycmlkZXMgc2hvdWxkIGV4aXN0Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkTWFwcGluZy5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOworCQlPcm1FbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKQEAgLTM4MiwxOSArNDQ4LDM4IEBACiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQkKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBqYXZhRW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIGVtYmVkZGVkTWFwcGluZy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PX0NPTFVNTiIpOwotCQlqYXZhRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7CisJCUphdmFFbWJlZGRlZE1hcHBpbmcgamF2YUVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOworCQlDb2x1bW4gamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uID0gamF2YUVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5nZXRDb2x1bW4oKTsKKwkJCisJCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT09fQ09MVU1OIik7CisJCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7CisJCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7CisJCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CisJCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOworCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7CisJCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOworCiAJCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50VHlwZTIuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInN0YXRlIikuZ2V0TWFwcGluZygpOwogCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX1NUQVRFX0NPTFVNTiIpOwotCQlhc3NlcnRFcXVhbHMoNCwgZW1iZWRkZWRNYXBwaW5nLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT09fQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoNSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoNywgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7CiAJCQogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwpAQCAtNDA4LDE4ICs0OTMsMjcgQEAKIAkJCiAJCS8vZW1iZWRkZWQgbWFwcGluZyBpcyBzcGVjaWZpZWQsIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyBzaG91bGQgZXhpc3QKIAkJcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5tYWtlU3BlY2lmaWVkKCk7Ci0JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJZ2V0T3JtWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCQllbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGVtYmVkZGVkTWFwcGluZy5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGVtYmVkZGVkTWFwcGluZy52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscygyNTUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJNWV9TVEFURV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKQEAgLTQyOCwxMyArNTIyLDEzIEBACiAJCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJCiAJCS8vc2V0IG9uZSBvZiB0aGUgdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHRvIHNwZWNpZmllZCwgdmVyaWZ5IG90aGVycyBhcmUgc3RpbGwgdmlydHVhbAotCQllbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKIAkJCi0JCWFzc2VydEVxdWFscyg0LCBlbWJlZGRlZE1hcHBpbmcuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gZW1iZWRkZWRNYXBwaW5nLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKQEAgLTQ0OCwxNyArNTQyLDE4IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKIAkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7CiAKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CiAJCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCQogCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQorCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9ybUVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwogCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKIAotCQlhc3NlcnRFcXVhbHMoNCwgb3JtRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1FbWJlZGRlZE1hcHBpbmcudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gb3JtQXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCiAJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIG9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwpAQCAtNDg3LDggKzU4Miw4IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKIAkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7CiAKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CiAJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CiAJCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CkBAIC01MzUsOCArNjMwLDggQEAKIAkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwogCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKIAotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKIAogCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3MiKTsKIAkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKQEAgLTU0Niw3ICs2NDEsNyBAQAogCQkKIAkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7CiAKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKIAkJLy9UT0RPCiAvLwkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVtYmVkZGVkTWFwcGluZy5kZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkpKTsKIC8vCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5kZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCk7CkBAIC01ODQsMTQgKzY3OSwxNCBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7CiAJCQogCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7CisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CkBAIC02MDUsMTQgKzcwMCwxNCBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKIAkJCiAJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKQEAgLTYyNiwxNCArNzIxLDE0IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7CiAJCQogCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7CisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CkBAIC02NDcsMTQgKzc0MiwxNCBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7CiAJCQogCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7CisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CkBAIC02NjgsMTQgKzc2MywxNCBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKIAkJCiAJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKQEAgLTY4NSwyMSArNzgwLDIxIEBACiAJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoKEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJvdmVycmlkZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiT1ZFUlJJREVfQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKIAkJCiAJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZUltcGwoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKIAkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKQEAgLTcxMywxNCArODA4LDE0IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7CiAJCQogCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7CisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CkBAIC03MzQsMTQgKzgyOSwxNCBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZCIpOwogCQkKIAkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOworCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwogCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwpAQCAtNzU1LDE0ICs4NTAsMTQgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7CiAJCQogCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7CisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7CiAJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CkBAIC03NzIsNCArODY3LDY5IEBACiAJCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwogCX0KIAorCS8vMS4wIHByb2plY3RzIGRvIG5vdCBzdXBwb3J0IGRvdC1ub3RhdGlvbiwgdGhpcyB0ZXN0cyB0byBtYWtlIHN1cmUgdGhhdCBzdXBwb3J0IGRvZXMgbm90IGV4aXN0CisJcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUN1c3RvbWVyKCk7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzczIoKTsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHppcENvZGVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKKworCQljdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikubWFrZVNwZWNpZmllZCgpOworCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5tYWtlU3BlY2lmaWVkKCk7CisJCUVtYmVkZGVkTWFwcGluZyBuZXN0ZWRFbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbmVzdGVkRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWFzc2VydEVxdWFscygyLCBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCQorCQl6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikubWFrZVNwZWNpZmllZCgpOworCQlCYXNpY01hcHBpbmcgcGx1c0ZvdXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgemlwQ29kZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwbHVzZm91ciIpLmdldE1hcHBpbmcoKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFIik7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKKworCQkvL2NoZWNrIHRoZSBuZXN0ZWQgZW1iZWRkZWQgKEFkZHJlc3MuemlwQ29kZSkgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gWmlwY29kZS5wbHVzZm91cgorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIik7CisJCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCisJCS8vY2hlY2sgdGhlIHRvcC1sZXZlbCBlbWJlZGRlZCAoQ3VzdG9tZXIuYWRkcmVzcykgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSB0aGVyZSBpcyBubyBhdHRyaWJ1dGUgb3ZlcnJpZGUgbmFtZWQgemlwQ29kZS5wbHVzZm91cgorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoKEVtYmVkZGVkTWFwcGluZykgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKCJ6aXBDb2RlLnBsdXNmb3VyIik7CisJfQorCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbnRpdHlUZXN0cy5qYXZhCmluZGV4IGEwZGIyZGMuLjY0MzllODUgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW50aXR5VGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVudGl0eVRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTUsMTkgKzE1LDM1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlY29uZGFyeVRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkTmF0aXZlUXVlcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVNlY29uZGFyeVRhYmxlOwpAQCAtNDMsNiArNTksNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgT3JtRW50aXR5VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCQpAQCAtNTgsMjUgKzc1LDExIEBACiAJCXN1cGVyLnNldFVwKCk7CiAJCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwogCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVJZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWQiLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFwcGVkU3VwZXJjbGFzcyIsICIiKTsJCQorCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlEZWZhdWx0RmllbGRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC05MCw5ICs5Myw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5RmllbGRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVJZEFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTEwLDkgKzExMCw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5UHJvcGVydHlBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVJZEFubm90YXRpb24oKTsKLQkJCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTE2MSwxMiArMTU4LDIxIEBACiAKIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbigpOwotCQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgSlBBLk9ORV9UT19PTkUpOworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KAorCQkJCQlKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIAorCQkJCQlKUEEuQkFTSUMsCisJCQkJCUpQQS5WRVJTSU9OLAorCQkJCQlKUEEuVFJBTlNJRU5ULAorCQkJCQlKUEEuRU1CRURERUQsCisJCQkJCUpQQS5FTUJFRERFRF9JRCwKKwkJCQkJSlBBLk9ORV9UT19PTkUsCisJCQkJCUpQQS5PTkVfVE9fTUFOWSwKKwkJCQkJSlBBLk1BTllfVE9fT05FLAorCQkJCQlKUEEuTUFOWV9UT19NQU5ZLAorCQkJCQlKUEEuSUQpOwogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKQEAgLTE3NCw2ICsxODAsOTAgQEAKIAkJCX0KIAkJCQogCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEJhc2ljIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBiYXNpYzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQFZlcnNpb24iKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHZlcnNpb247IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBUcmFuc2llbnQiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHRyYW5zaWVudDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBlbWJlZGRlZDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkSWQiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGVtYmVkZGVkSWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgQ0hJTERfVFlQRV9OQU1FICsgIiBvbmVUb09uZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgb25lVG9NYW55OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBtYW55VG9PbmU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBtYW55VG9NYW55OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0QWJzdHJhY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7CisJCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRklMRV9OQU1FLCBzb3VyY2VXcml0ZXIpOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklOSEVSSVRBTkNFLCBKUEEuSU5IRVJJVEFOQ0VfVFlQRSwgSlBBLk9ORV9UT19PTkUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIik7CisJCQkJc2IuYXBwZW5kKCJhYnN0cmFjdCIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKIAkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwogCQkJCXNiLmFwcGVuZChDUik7CkBAIC0xODksMjIgKzI3OSwxMSBAQAogCQkJfQogCQl9KTsKIAl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RBYnN0cmFjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBhYnN0cmFjdCBjbGFzcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBGSUxFX05BTUUsIHNvdXJjZVdyaXRlcik7Ci0JfQogCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKIAkJCkBAIC0yMjAsOSArMjk5LDkgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKIAkJCkBAIC0yNDAsOSArMzE5LDkgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUZpZWxkQWNjZXNzKCk7CiAJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXREZWZhdWx0TmFtZSgpKTsKIAkJCiAJCW9ybUVudGl0eS5nZXRKYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkTmFtZSgiRm9vIik7CkBAIC0yNzAsOSArMzQ5LDkgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldE5hbWUoKSk7CiAJCQogCQkvL3NldCBjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKQEAgLTI5MSw5ICszNzAsOSBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbnRpdHkuZ2V0Q2xhc3NfKCkpOwogCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVudGl0eVJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKIAkJCkBAIC0zMDksOSArMzg4LDkgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybUVudGl0eS5nZXRDbGFzc18oKSk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwogCQkKQEAgLTMyOCwxNTUgKzQwNywxNTAgQEAKIAkvL1RPRE8gYWRkIHRlc3RzIGZvciBzZXR0aW5nIHRoZSBjbGFzc05hbWUgd2hlbiB0aGUgcGFja2FnZSBpcyBzZXQgb24gZW50aXR5LW1hcHBpbmdzCiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKIAkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7CiAJCQogCQkvL3NldCBhY2Nlc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCiAJCWVudGl0eVJlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKIAkKIAkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCiAJCWVudGl0eVJlc291cmNlLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKIAkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwogCQkKIAkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBlbnRpdHlSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7CiAJCQogCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKKwkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdEFjY2Vzc0Zyb21QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZEFjY2VzcygpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZEFjY2VzcygpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhudWxsKTsKKwkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRBY2Nlc3NGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5RGVmYXVsdEZpZWxkQWNjZXNzKCk7CiAKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJLy9qYXZhIGhhcyBubyBhbm5vdGF0aW9ucywgc28gZGVmYXVsdEFjY2VzcyBpbiB4bWwgaXMgbnVsbAotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkvL2phdmEgaGFzIG5vIGFubm90YXRpb25zLCBkZWZhdWx0QWNjZXNzIGluIHhtbCBpcyBGSUVMRCBhbnl3YXkKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7CiAJCQotCQllbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwkJCisJCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CQkKIAkJLy9lbnRpdHlNYXBwaW5ncyBhY2Nlc3Mgd2lucyBvdmVyIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgYWNjZXNzCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7CiAJCQotCQllbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsJCQorCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsJCQogCQkvL3BlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgYWNjZXNzIHVzZWQgbm93Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7CiAJCQotCQllbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7CiAJCQogCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCS8vamF2YSBoYXMgYW5ub3RhdGlvbnMgb24gZmllbGRzIG5vdywgdGhhdCBzaG91bGQgd2luIGluIGFsbCBjYXNlcwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwogCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKIAogCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdEFjY2Vzc0Zyb21KYXZhRmllbGRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUZpZWxkQWNjZXNzKCk7CiAKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKIAkJCiAJCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwogCQkKIAkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7CiAKLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwogCQkKIAkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwogCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRBY2Nlc3NGcm9tSmF2YVByb3BlcnR5QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUFjY2VzcygpOwogCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7CiAJCQogCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKIAkJCiAJCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtRW50aXR5LmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwogCi0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKIAkJCiAJCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0QWNjZXNzTm9VbmRlcmx5aW5nSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwogCX0KIAkJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJCkBAIC00OTYsOSArNTcwLDkgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJCkBAIC01MTgsMjUgKzU5MiwyNSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydEZhbHNlKG9ybUVudGl0eS5pc0RlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CiAJCWFzc2VydFRydWUob3JtRW50aXR5LmlzRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKIAkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmlzRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CiAJCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydFRydWUob3JtRW50aXR5LmlzRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSk7CkBAIC01NDQsMjAgKzYxOCwyMCBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CiAJCWFzc2VydFRydWUob3JtRW50aXR5LmlzTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwogCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CkBAIC01NjUsOSArNjM5LDkgQEAKIAkKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSW5oZXJpdGFuY2VTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIG9ybUVudGl0eS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEluaGVyaXRhbmNlKCkpOwogCkBAIC01ODIsNyArNjU2LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3lGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5RGVmYXVsdEZpZWxkQWNjZXNzKCk7CiAKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJLy9ubyBpbmhlcml0YW5jZSBzdHJhdGVneSBzcGVjaWZpZWQgaW4gamF2YSBzbyBzaW5nbGUtdGFibGUgaXMgZGVmYXVsdAogCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgb3JtRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwpAQCAtNjAzLDcgKzY3Nyw3IEBACiAJCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwogCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgb3JtRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwogCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwogCQkvL3RoaXMgc2V0dGluZyBvdmVycmlkZXMgdGhlIGZhbHNlIG1ldGEtZGF0YSBjb21wbGV0ZSBmb3VuZCBvbiBvcm1FbnRpdHkKIAkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIG9ybUVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKIAl9CkBAIC02MTIsMTAgKzY4NiwxMCBAQAogCQljcmVhdGVUZXN0RW50aXR5RGVmYXVsdEZpZWxkQWNjZXNzKCk7CiAJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CiAJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudFBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBwYXJlbnRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBwYXJlbnRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBzdXBlclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHN1YlBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlPcm1FbnRpdHkgcGFyZW50WG1sRW50aXR5ID0gKE9ybUVudGl0eSkgc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCU9ybUVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChPcm1FbnRpdHkpIHN1YlBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydEVxdWFscyhwYXJlbnRYbWxFbnRpdHksIGNoaWxkWG1sRW50aXR5LmdldFBhcmVudEVudGl0eSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkWG1sRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwpAQCAtNjM0LDE1ICs3MDgsMTUgQEAKIAkJYXNzZXJ0TnVsbChwYXJlbnRYbWxFbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKIAkJYXNzZXJ0TnVsbChjaGlsZFhtbEVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwogCQkKLQkJcGFyZW50UGVyc2lzdGVudFR5cGUuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CiAJCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBwYXJlbnRYbWxFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CiAJCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBjaGlsZFhtbEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKIAkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRJbmhlcml0YW5jZSgpKTsKIAkJCkBAIC02NjcsOSArNzQxLDkgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKSk7CiAJCQpAQCAtNjg1LDkgKzc1OSw5IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAKIAkJT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7CiAJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwpAQCAtNzE5LDE0ICs3OTMsMTQgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAKIAkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CiAJCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7CiAJCQogCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7CkBAIC03NDMsMTQgKzgxNywxNCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAKIAkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CiAJCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7CiAJCQogCQkKQEAgLTc3NywxMyArODUxLDEzIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlSW1wbCgpKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlKCkpOworCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2Vjb25kYXJ5VGFibGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZWNvbmRhcnlUYWJsZSgpKTsKIAkJCiAJCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKIAkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwpAQCAtODI4LDEwICs5MDIsMTAgQEAKIAkJY3JlYXRlVGVzdEVudGl0eUZpZWxkQWNjZXNzKCk7CiAJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CiAJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudFBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBwYXJlbnRPcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwYXJlbnRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVudGl0eSBjaGlsZE9ybUVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBzdXBlclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHN1YlBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlPcm1FbnRpdHkgcGFyZW50T3JtRW50aXR5ID0gKE9ybUVudGl0eSkgc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCU9ybUVudGl0eSBjaGlsZE9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHN1YlBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gY2hpbGRPcm1FbnRpdHkuZ2V0SmF2YUVudGl0eSgpOwogCQkKIAkJSmF2YVNlY29uZGFyeVRhYmxlIGphdmFTZWNvbmRhcnlUYWJsZUZvbyA9IGphdmFFbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7CkBAIC05MDEsNyArOTc1LDcgQEAKIAogCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGVkVGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlGaWVsZEFjY2VzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKIAkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eS5hc3NvY2lhdGVkVGFibGVzKCkpKTsKQEAgLTkyMiw5ICs5OTYsOSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TWFrZUVudGl0eUVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CiAJCWVudGl0eS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoIkRJU0NfVkFMVUUiKTsKIAkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7CiAJCWVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CkBAIC05MzIsNyArMTAwNiw3IEBACiAJCiAJCWVudGl0eVBlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKIAkJCi0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKKwkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbWJlZGRhYmxlLmdldENsYXNzTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW1iZWRkYWJsZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVtYmVkZGFibGUuZ2V0QWNjZXNzKCkpOwpAQCAtOTQwLDE1ICsxMDE0LDE1IEBACiAJCU9ybUVtYmVkZGFibGUgb3JtRW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW1iZWRkYWJsZS5nZXRDbGFzc18oKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwogCX0KIAkKIAkvL1RPRE8gdGVzdCB0aGF0IGF0dHJpYnV0ZSBtYXBwaW5ncyBhcmUgbm90IHJlbW92ZWQgd2hlbiBjaGFuZ2luZyB0eXBlIG1hcHBpbmcuCiAJcHVibGljIHZvaWQgdGVzdE1ha2VFbnRpdHlFbWJlZGRhYmxlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7CiAJCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CisJCWVudGl0eVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKIAkJZW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiRElTQ19WQUxVRSIpOwogCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKIAkJZW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKQEAgLTk1Nyw3ICsxMDMxLDcgQEAKIAkKIAkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwogCQkKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOworCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwogCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVtYmVkZGFibGUuZ2V0Q2xhc3NOYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbWJlZGRhYmxlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW1iZWRkYWJsZS5nZXRBY2Nlc3MoKSk7CkBAIC05NjYsMTQgKzEwNDAsMTQgQEAKIAkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CiAvLwkJYXNzZXJ0RXF1YWxzKCJiYXNpY01hcHBpbmciLCBvcm1FbWJlZGRhYmxlLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXROYW1lKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TWFrZUVudGl0eU1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CiAJCWVudGl0eS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoIkRJU0NfVkFMVUUiKTsKIAkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7CiAJCWVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CkBAIC05ODEsNyArMTA1NSw3IEBACiAJCiAJCWVudGl0eVBlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSk7CiAJCQotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBtYXBwZWRTdXBlcmNsYXNzLmdldENsYXNzTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGVkU3VwZXJjbGFzcy5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIG1hcHBlZFN1cGVyY2xhc3MuZ2V0QWNjZXNzKCkpOwpAQCAtOTg5LDE0ICsxMDYzLDE0IEBACiAJCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TWFrZUVudGl0eU1hcHBlZFN1cGVyY2xhc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKKwkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwogCQllbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCJESVNDX1ZBTFVFIik7CiAJCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwogCQllbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwpAQCAtMTAwNCw3ICsxMDc4LDcgQEAKIAkKIAkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKTsKIAkJCi0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwogCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NOYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwZWRTdXBlcmNsYXNzLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgbWFwcGVkU3VwZXJjbGFzcy5nZXRBY2Nlc3MoKSk7CkBAIC0xMDEyLDI2ICsxMDg2LDI2IEBACiAJCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwogCX0KIAogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGRTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKIAkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKIAkJCi0JCW9ybUVudGl0eS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOworCQlvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJCiAJCWFzc2VydE5vdE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwob3JtRW50aXR5LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROb3ROdWxsKG9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKIAkJCQkKIAkJLy90cnkgYWRkaW5nIGFub3RoZXIgc2VxdWVuY2UgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgogCQl0cnkgewotCQkJb3JtRW50aXR5LmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCQlvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTAzOSwyNSArMTExMywyNSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCQotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CiAKLQkJb3JtRW50aXR5LmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCW9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwogCQlhc3NlcnROb3ROdWxsKGVudGl0eVJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUVudGl0eS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CiAKLQkJb3JtRW50aXR5LnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCW9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CisJCWFzc2VydE51bGwob3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwogCiAJCS8vdHJ5IHJlbW92aW5nIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCiAJCXRyeSB7Ci0JCQlvcm1FbnRpdHkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsJCQorCQkJb3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7CQkKIAkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTA2NSw0NSArMTEzOSw0NSBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKIAkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCi0JCWVudGl0eVJlc291cmNlLnNldFNlcXVlbmNlR2VuZXJhdG9yKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9ySW1wbCgpKTsKKwkJZW50aXR5UmVzb3VyY2Uuc2V0U2VxdWVuY2VHZW5lcmF0b3IoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2VxdWVuY2VHZW5lcmF0b3IoKSk7CiAJCQkJCi0JCWFzc2VydE5vdE51bGwob3JtRW50aXR5LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROb3ROdWxsKG9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKIAkJYXNzZXJ0Tm90TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCi0JCW9ybUVudGl0eS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOworCQlvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAogCQllbnRpdHlSZXNvdXJjZS5zZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CisJCWFzc2VydE51bGwob3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdlbmVyYXRvcnNTaXplKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCQotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CiAJCQotCQlvcm1FbnRpdHkuYWRkVGFibGVHZW5lcmF0b3IoKTsKKwkJb3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7CiAJCQogCQlhc3NlcnROb3ROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUVudGl0eS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CiAJCQkJCiAJCS8vdHJ5IGFkZGluZyBhbm90aGVyIHRhYmxlIGdlbmVyYXRvciwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KIAkJdHJ5IHsKLQkJCW9ybUVudGl0eS5hZGRUYWJsZUdlbmVyYXRvcigpOworCQkJb3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7CiAJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTExMTEsMjUgKzExODUsMjUgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZVRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CisJCWFzc2VydE51bGwob3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwogCi0JCW9ybUVudGl0eS5hZGRUYWJsZUdlbmVyYXRvcigpOworCQlvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKIAkJYXNzZXJ0Tm90TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CisJCWFzc2VydE5vdE51bGwob3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwogCi0JCW9ybUVudGl0eS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOworCQlvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsKIAkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKIAkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKIAogCQkvL3RyeSByZW1vdmluZyB0aGUgdGFibGUgZ2VuZXJhdG9yIGFnYWluLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgogCQl0cnkgewotCQkJb3JtRW50aXR5LnJlbW92ZVRhYmxlR2VuZXJhdG9yKCk7CQkKKwkJCW9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwkJCiAJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTExMzcsMzMgKzEyMTEsMzMgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CisJCWFzc2VydE51bGwob3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdlbmVyYXRvcnNTaXplKCkpOwogCQkKLQkJZW50aXR5UmVzb3VyY2Uuc2V0VGFibGVHZW5lcmF0b3IoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGVHZW5lcmF0b3JJbXBsKCkpOworCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvcigpKTsKIAkJCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CisJCWFzc2VydE5vdE51bGwob3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwogCQlhc3NlcnROb3ROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdlbmVyYXRvcnNTaXplKCkpOwogCi0JCW9ybUVudGl0eS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOworCQlvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXROYW1lKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCiAJCWVudGl0eVJlc291cmNlLnNldFRhYmxlR2VuZXJhdG9yKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7CisJCWFzc2VydEVxdWFscygwLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEaXNjcmltaW5hdG9yQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKIApAQCAtMTE4NCw5ICsxMjU4LDkgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURpc2NyaW1pbmF0b3JWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKIAkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSk7CkBAIC0xMjAzLDkgKzEyNzcsOSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKQEAgLTEyMjEsMTAgKzEyOTUsMzMgQEAKIAkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSk7CiAJfQogCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGaWVsZEFjY2VzcygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKKworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKG9ybUVudGl0eS5nZXROYW1lKCksIG9ybUVudGl0eS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOworCQorCQlqYXZhRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSKTsKKwkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKKwkJCisJCWphdmFFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOworCQlqYXZhRW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiRk9PIik7CisJCQorCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUVudGl0eS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOworCisJCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyhvcm1FbnRpdHkuZ2V0TmFtZSgpLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAKIAkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7CiAJCXByaW1hcnlLZXlKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwpAQCAtMTI1NiwxNCArMTM1MywxNCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAogCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CiAJCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKIAkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKIAkJCiAJCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKQEAgLTEyODAsMTQgKzEzNzcsMTQgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCiAJCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwogCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwogCQkKIAkJCkBAIC0xMzE0LDEzICsxNDExLDEzIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOworCQllbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7CisJCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKIAkJCiAJCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKIAkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwpAQCAtMTM2NSw4ICsxNDYyLDggQEAKIAkJY3JlYXRlVGVzdFR5cGUoKTsKIAkJY3JlYXRlVGVzdFN1YlR5cGVVbm1hcHBlZCgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7CiAJCWNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwogCQkKIAkJcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikubWFrZVNwZWNpZmllZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwpAQCAtMTQwNyw3ICsxNTA0LDcgQEAKIAkJc3BlY2lmaWVkUGtKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsJCQogCQlhc3NlcnRGYWxzZShjaGlsZEVudGl0eS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKIAkJLy9ub3cgcmVtb3ZlIHRoZSBwa0pvaW5Db2x1bW4gZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZXMgYW5kIGhhcyBhIGRlZmF1bHQgcGtKb2luQ29sdW1uCi0JCSgoWG1sRW50aXR5KWNoaWxkRW50aXR5LmdldFR5cGVNYXBwaW5nUmVzb3VyY2UoKSkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOworCQkoKFhtbEVudGl0eSljaGlsZEVudGl0eS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCkpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKIAkJYXNzZXJ0VHJ1ZShjaGlsZEVudGl0eS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNoaWxkRW50aXR5LmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBjaGlsZEVudGl0eS5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKQEAgLTE0MTcsOCArMTUxNCw4IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlGaWVsZEFjY2VzcygpOwogCQljcmVhdGVUZXN0U3ViVHlwZSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7CiAJCQogCQkKIAkJKChKYXZhRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7CkBAIC0xNDYxLDcyICsxNTU4LDE1IEBACiAJCQogCX0KIAkKLS8vCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0vLwotLy8JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotLy8JCQkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZTIgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGUyLnNldE5hbWUoIkJBUiIpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZTMgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMSk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGUzLnNldE5hbWUoIkJBWiIpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotLy8JCQotLy8JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZTIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZTMsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZSwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSk7Ci0vLwkJCi0vLwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwotLy8JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKS5zZXROYW1lKCJGT08iKTsKLS8vCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMSkuc2V0TmFtZSgiQkFSIik7Ci0vLwkJb3JtRW50aXR5LmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDIpLnNldE5hbWUoIkJBWiIpOwotLy8JCQotLy8JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCQkKLS8vCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotLy8KLS8vCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwl9Ci0JCiAJcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwogCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlSW1wbCgpKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKIAkJCiAJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKIAkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwpAQCAtMTUzNSw4ICsxNTc1LDggQEAKIAkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CiAJCQogCQkKLQkJb3JtRW50aXR5Lm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyLCAwKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKQEAgLTE1NDYsOCArMTU4Niw4IEBACiAJCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7CiAKIAotCQlvcm1FbnRpdHkubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwLCAxKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CkBAIC0xNTU4LDIzNCArMTU5OCwzODcgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGVJbXBsKCkpOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwogCQkKIAkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwogCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7CiAJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKIAotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVudGl0eS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJCQogCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDIsIDApOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVudGl0eS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAKIAkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJCQogCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwogCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTIgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKIAkJCiAJCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhDSElMRF9UWVBFX05BTUUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDI1NSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJCiAJCWVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYmFzaWMiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5LnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOworCQorCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKIAkJZW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWVudGl0eS5nZXRKYXZhRW50aXR5KCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKLQkJZW50aXR5LmdldEphdmFFbnRpdHkoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOy8vVE9ETyBzcGVjaWZpZWQgb3IgZGVmYXVsdD8KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJZW50aXR5LmdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCUphdmFDb2x1bW4gamF2YUNvbHVtbiA9IGVudGl0eS5nZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0Q29sdW1uKCk7CisJCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOworCQlqYXZhQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKKwkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKKwkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDcpKTsKKwkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDgpKTsKKwkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoOSkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsvL1RPRE8gc3BlY2lmaWVkIG9yIGRlZmF1bHQ/CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CisJCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOSksIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFNjYWxlKCkpOwogCQkKLQkJcGVyc2lzdGVudFR5cGUyLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIikubWFrZVNwZWNpZmllZCgpOwotCQlPcm1CYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgcGVyc2lzdGVudFR5cGUyLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIikuZ2V0TWFwcGluZygpOworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQkKKwkJcGVyc2lzdGVudFR5cGUyLmdldEF0dHJpYnV0ZU5hbWVkKCJiYXNpYyIpLm1ha2VTcGVjaWZpZWQoKTsKKwkJT3JtQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRUeXBlMi5nZXRBdHRyaWJ1dGVOYW1lZCgiYmFzaWMiKS5nZXRNYXBwaW5nKCk7CiAJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9OQU1FIik7CisJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7CisJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7CisJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CisJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOworCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7CisJCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOworCiAJCQotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJCisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiTVlfTkFNRSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ly9UT0RPIHNwZWNpZmllZCBvciBkZWZhdWx0PworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscyg1LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscyg3LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKKwogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsvL1RPRE8gc3BlY2lmaWVkIG9yIGRlZmF1bHQ/CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CisJCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOSksIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFNjYWxlKCkpOworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNOb0phdmFFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKIAkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCiAJCQogCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwogCQkKIAkJcGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBlbnRpdHkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKIAkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKIAkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJCiAJCQogCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwogCQkKLQkJZW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CiAJCQotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVudGl0eS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscyhDSElMRF9UWVBFX05BTUUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKIAkJCiAJCSgoSmF2YUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwogCQkKIAkJZW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoQ0hJTERfVFlQRV9OQU1FLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CiAJCQogCQllbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKIAkJZW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CiAJfQogCQotLy8JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotLy8KLS8vCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgwKTsKLS8vCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotLy8JCQkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotLy8JCQotLy8JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZTIgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgwKTsKLS8vCQlhc3NvY2lhdGlvbk92ZXJyaWRlMi5zZXROYW1lKCJCQVIiKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotLy8JCQotLy8JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZTMgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgxKTsKLS8vCQlhc3NvY2lhdGlvbk92ZXJyaWRlMy5zZXROYW1lKCJCQVoiKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLS8vCQlhc3NlcnRFcXVhbHMoYXNzb2NpYXRpb25PdmVycmlkZTIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKGFzc29jaWF0aW9uT3ZlcnJpZGUzLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscyhhc3NvY2lhdGlvbk92ZXJyaWRlLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCQotLy8JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3JtRW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8KLS8vCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgwKS5zZXROYW1lKCJGT08iKTsKLS8vCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgxKS5zZXROYW1lKCJCQVIiKTsKLS8vCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgyKS5zZXROYW1lKCJCQVoiKTsKLS8vCQkKLS8vCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCQkKLS8vCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0vLwotLy8JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApOwotLy8JCWFzc2VydEVxdWFscygxLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotLy8JCQotLy8JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApOwotLy8JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwl9CisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uRGVmYXVsdHNOb0phdmFBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZSgpOworCQljcmVhdGVUZXN0U3ViVHlwZVVubWFwcGVkKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwkKKwkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQkoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSkubWFrZVNwZWNpZmllZCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0NPTFVNTiIpOworCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CisKKwkKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiTVlfQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5RGVmYXVsdEZpZWxkQWNjZXNzKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOworCQkKKwkJCisJCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOworCQkKKwkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZW50aXR5Lm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5RGVmYXVsdEZpZWxkQWNjZXNzKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQkKKwkJCisJCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOworCQkKKwkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGVudGl0eS5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsJCQorCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQorCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGVudGl0eS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYmFzaWMiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlc1RhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBhYnN0cmFjdFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CQkKKwkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJT3JtRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKE9ybUVudGl0eSkgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZW50aXR5LmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisJCQorCQkKKwkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gYWJzdHJhY3RFbnRpdHkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNFbnRpdHlIaWVyYWNoeSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQorCQlQZXJzaXN0ZW50VHlwZSBhYnN0cmFjdFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCVBlcnNpc3RlbnRUeXBlIGNvbmNyZXRlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKKwkJRW50aXR5IGNvbmNyZXRlRW50aXR5ID0gKEVudGl0eSkgY29uY3JldGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gY29uY3JldGVFbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhDSElMRF9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKKwkJCisJCQorCQlPcm1CYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCWlkTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkubWFrZVNwZWNpZmllZCgpOworCQlpZE1hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBhYnN0cmFjdFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOworCQkKKworCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CisKKwkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CisJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKKworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKENISUxEX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQkKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKIAotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwoKSk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7CiAJCQogCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKIAkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7CkBAIC0xNzk0LDggKzE5ODcsOCBAQAogCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwogCQkKIAkJCi0JCW9ybUVudGl0eS5tb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3JtRW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDIsIDApOworCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwpAQCAtMTgwNSw4ICsxOTk4LDggQEAKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwogCiAKLQkJb3JtRW50aXR5Lm1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDAsIDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG9ybUVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgwLCAxKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwpAQCAtMTgxNywxMjYgKzIwMTAsMzc0IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZUltcGwoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGVJbXBsKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlSW1wbCgpKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKIAkJCiAJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwogCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKIAkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7CiAKLQkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3JtRW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJCQogCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMiwgMCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3JtRW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMCwgMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3JtRW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKIAogCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvcm1FbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwogCiAJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG9ybUVudGl0eS5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CiAJCQogCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5oYXNOZXh0KCkpOwogCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQkKKwkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5pbmdTdHJhdGVneS5qb2luQ29sdW1uc1NpemUoKSk7CisJCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5pbmdTdHJhdGVneS5qb2luQ29sdW1ucygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZV9pZCIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhDSElMRF9UWVBFX05BTUUsIGpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBqb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKKwkJCisJCQorCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwogCisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJCisJCWVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJZW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7CisJCWVudGl0eS5nZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJCisJCWdldE9ybVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKKworCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eS5nZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlKYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqYXZhSm9pbmluZ1N0cmF0ZWd5ID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luaW5nU3RyYXRlZ3kuam9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGRVJFTkNFIik7CisJCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKKwkJamF2YUpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOworCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOworCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWpvaW5pbmdTdHJhdGVneSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuam9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIlJFRkVSRU5DRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgb3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKKwkJCisJCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlqb2luaW5nU3RyYXRlZ3kgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBqb2luaW5nU3RyYXRlZ3kuam9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJCisJCXBlcnNpc3RlbnRUeXBlMi5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIikubWFrZVNwZWNpZmllZCgpOworCQlPcm1NYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudFR5cGUyLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKS5nZXRNYXBwaW5nKCk7CisJCWpvaW5Db2x1bW4gPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIk1ZX05BTUUiKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiTVlfUkVGRVJOQ0VfTkFNRSIpOworCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJCQVIyIik7CisJCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRjIiKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKKworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJam9pbmluZ1N0cmF0ZWd5ID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlvcm1Kb2luQ29sdW1uID0gam9pbmluZ1N0cmF0ZWd5LmpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIk1ZX05BTUUiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiTVlfUkVGRVJOQ0VfTkFNRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSMiIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7CisJCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRjIiLCBvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOworCQkKKwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWpvaW5pbmdTdHJhdGVneSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlvcm1Kb2luQ29sdW1uID0gam9pbmluZ1N0cmF0ZWd5LmpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJSRUZFUkVOQ0UiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7CisJCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7CisJfQorLy9UT0RPCisvLwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzTm9KYXZhRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKy8vCQljcmVhdGVUZXN0U3ViVHlwZSgpOworLy8JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7CisvLwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUyID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKy8vCQkKKy8vCQlwZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7CisvLwkJcGVyc2lzdGVudFR5cGUyLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKKy8vCQkKKy8vCQlwZXJzaXN0ZW50VHlwZTIuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIikuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisvLwkJcGVyc2lzdGVudFR5cGUyLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisvLwkJCQorLy8JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisvLwkJCisvLwkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworLy8JCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisvLwkJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscygxLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKy8vCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOworLy8JCWFzc2VydEVxdWFscygib25lVG9PbmVfaWQiLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKENISUxEX1RZUEVfTkFNRSwgam9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMobnVsbCwgam9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBqb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW4uaXNVbmlxdWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKKy8vCQkKKy8vCQkKKy8vCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKy8vCisvLwkJCisvLwkJZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKy8vCQkKKy8vCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisvLwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworLy8JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworLy8JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworLy8JCQorLy8JCWVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisvLwkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworLy8JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKy8vCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKy8vCQkKKy8vCQllbnRpdHkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKy8vCQllbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKKy8vCQllbnRpdHkuZ2V0SmF2YUVudGl0eSgpLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKy8vCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eS5nZXRKYXZhRW50aXR5KCkuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisvLwkJSmF2YUpvaW5Db2x1bW4gamF2YUpvaW5Db2x1bW4gPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworLy8JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworLy8JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZFUkVOQ0UiKTsKKy8vCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7CisvLwkJamF2YUpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOworLy8JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CisvLwkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOworLy8JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOworLy8JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOworLy8JCQorLy8JCWFzc2VydEVxdWFscygyLCBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKy8vCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisvLwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisvLwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKy8vCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOworLy8JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscygiUkVGRVJFTkNFIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgb3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOworLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOworLy8JCQorLy8JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworLy8JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscyhudWxsLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7CisvLwkJCisvLwkJcGVyc2lzdGVudFR5cGUyLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKS5tYWtlU3BlY2lmaWVkKCk7CisvLwkJT3JtTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRUeXBlMi5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIikuZ2V0TWFwcGluZygpOworLy8JCWpvaW5Db2x1bW4gPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworLy8JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTVlfTkFNRSIpOworLy8JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIk1ZX1JFRkVSTkNFX05BTUUiKTsKKy8vCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJCQVIyIik7CisvLwkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGMiIpOworLy8JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKy8vCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKKy8vCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOworLy8JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisvLworLy8JCQorLy8JCQorLy8JCWFzc2VydEVxdWFscygyLCBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKy8vCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisvLwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKy8vCQlvcm1Kb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIlJFRkVSRU5DRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKKy8vCisvLwkJCisvLwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisvLwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisvLwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisvLwkJb3JtSm9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKS5uZXh0KCk7CisvLwkJYXNzZXJ0RXF1YWxzKCJNWV9OQU1FIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscygiTVlfUkVGRVJOQ0VfTkFNRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJCQVIyIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYyIiwgb3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOworLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOworLy8JfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAotCQlPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgwKTsKKwkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKIAkJbmFtZWRRdWVyeS5zZXROYW1lKCJGT08iKTsKIAkJCQkKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKIAkJCi0JCU9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeTIgPSBvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgwKTsKKwkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5MiA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7CiAJCW5hbWVkUXVlcnkyLnNldE5hbWUoIkJBUiIpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKIAkJCi0JCU9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeTMgPSBvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgxKTsKKwkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5MyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSk7CiAJCW5hbWVkUXVlcnkzLnNldE5hbWUoIkJBWiIpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkubmFtZWRRdWVyaWVzKCk7CisJCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkyLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkzLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnksIG5hbWVkUXVlcmllcy5uZXh0KCkpOwogCQkKLQkJbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5Lm5hbWVkUXVlcmllcygpOworCQluYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAotCQlvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJb3JtRW50aXR5LmFkZE5hbWVkUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOworCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOworCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOworCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKIAkJCi0JCW9ybUVudGl0eS5yZW1vdmVOYW1lZFF1ZXJ5KDApOworCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZFF1ZXJ5KDApOwogCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKIAotCQlvcm1FbnRpdHkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKKwkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CiAJCQotCQlvcm1FbnRpdHkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKKwkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKIAkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCi0JCW9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQlvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKLQkJb3JtRW50aXR5LmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7CisJCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7CisJCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7CisJCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwogCQkKIAkJCi0JCW9ybUVudGl0eS5tb3ZlTmFtZWRRdWVyeSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5uYW1lZFF1ZXJpZXMoKTsKKwkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubW92ZU5hbWVkUXVlcnkoMiwgMCk7CisJCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKQEAgLTE5NDYsOCArMjM4Nyw4IEBACiAJCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7CiAKIAotCQlvcm1FbnRpdHkubW92ZU5hbWVkUXVlcnkoMCwgMSk7Ci0JCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5uYW1lZFF1ZXJpZXMoKTsKKwkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubW92ZU5hbWVkUXVlcnkoMCwgMSk7CisJCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkUXVlcmllcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwpAQCAtMTk1OCwxMiArMjM5OSwxMiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZWRRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLnF1ZXJpZXNTaXplKCkpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpKTsKIAkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkUXVlcnkoKSk7CiAJCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZFF1ZXJ5KCkpOwpAQCAtMTk3MSwxMTcgKzI0MTIsMTE3IEBACiAJCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKIAkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5uYW1lZFF1ZXJpZXMoKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkUXVlcmllcygpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5xdWVyaWVzU2l6ZSgpKTsKIAkJCiAJCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLm1vdmUoMiwgMCk7Ci0JCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5uYW1lZFF1ZXJpZXMoKTsKKwkJbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWRRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwogCQkKIAkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkubW92ZSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5Lm5hbWVkUXVlcmllcygpOworCQluYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZFF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7CiAJCQogCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5yZW1vdmUoMSk7Ci0JCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5uYW1lZFF1ZXJpZXMoKTsKKwkJbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWRRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkucXVlcmllc1NpemUoKSk7CiAJCQogCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5yZW1vdmUoMSk7Ci0JCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5uYW1lZFF1ZXJpZXMoKTsKKwkJbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWRRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5xdWVyaWVzU2l6ZSgpKTsKIAkJCiAJCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5Lm5hbWVkUXVlcmllcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsUXVlcmllcygpKSk7CisJCWFzc2VydEZhbHNlKG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkUXVlcmllcygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkucXVlcmllc1NpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKIAkJbmFtZWROYXRpdmVRdWVyeS5zZXROYW1lKCJGT08iKTsKIAkJCQkKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKIAkJCi0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeTIgPSBvcm1FbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5MiA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7CiAJCW5hbWVkTmF0aXZlUXVlcnkyLnNldE5hbWUoIkJBUiIpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKIAkJCi0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeTMgPSBvcm1FbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgxKTsKKwkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5MyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMSk7CiAJCW5hbWVkTmF0aXZlUXVlcnkzLnNldE5hbWUoIkJBWiIpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7CisJCUxpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKG5hbWVkTmF0aXZlUXVlcnkyLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKG5hbWVkTmF0aXZlUXVlcnkzLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKG5hbWVkTmF0aXZlUXVlcnksIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkpOwogCQkKLQkJbmFtZWROYXRpdmVRdWVyaWVzID0gb3JtRW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpOworCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAotCQlvcm1FbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJb3JtRW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOworCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOworCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOworCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKIAkJCi0JCW9ybUVudGl0eS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOworCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOwogCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKIAotCQlvcm1FbnRpdHkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CiAJCQotCQlvcm1FbnRpdHkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKIAkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCi0JCW9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQlvcm1FbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKLQkJb3JtRW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7CisJCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7CisJCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7CisJCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5zaXplKCkpOwogCQkKIAkJCi0JCW9ybUVudGl0eS5tb3ZlTmFtZWROYXRpdmVRdWVyeSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKKwkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubW92ZU5hbWVkTmF0aXZlUXVlcnkoMiwgMCk7CisJCUxpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKQEAgLTIwOTEsOCArMjUzMiw4IEBACiAJCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7CiAKIAotCQlvcm1FbnRpdHkubW92ZU5hbWVkTmF0aXZlUXVlcnkoMCwgMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKKwkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubW92ZU5hbWVkTmF0aXZlUXVlcnkoMCwgMSk7CisJCW5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkTmF0aXZlUXVlcmllcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwpAQCAtMjEwMyw2MiArMjU0NCw2MiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZWROYXRpdmVRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLnF1ZXJpZXNTaXplKCkpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWROYXRpdmVRdWVyeSgpKTsKIAkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKSk7CiAJCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkpOwogCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7CiAJCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKIAkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzID0gb3JtRW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpOworCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWROYXRpdmVRdWVyaWVzKCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOworCQlhc3NlcnRFcXVhbHMoMywgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLnF1ZXJpZXNTaXplKCkpOwogCQkKIAkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkubW92ZSgyLCAwKTsKLQkJbmFtZWROYXRpdmVRdWVyaWVzID0gb3JtRW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpOworCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RmFsc2UobmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSk7CiAJCQogCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5tb3ZlKDAsIDEpOwotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCk7CisJCW5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm5hbWVkTmF0aXZlUXVlcmllcygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKIAkJCiAJCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnJlbW92ZSgxKTsKLQkJbmFtZWROYXRpdmVRdWVyaWVzID0gb3JtRW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpOworCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5xdWVyaWVzU2l6ZSgpKTsKIAkJCiAJCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnJlbW92ZSgxKTsKLQkJbmFtZWROYXRpdmVRdWVyaWVzID0gb3JtRW50aXR5Lm5hbWVkTmF0aXZlUXVlcmllcygpOworCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5uYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbFF1ZXJpZXMoKSkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLnF1ZXJpZXNTaXplKCkpOwogCQkKIAkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkubmFtZWROYXRpdmVRdWVyaWVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxRdWVyaWVzKCkpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubmFtZWROYXRpdmVRdWVyaWVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5xdWVyaWVzU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUlkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAogCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRJZENsYXNzKCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldElkQ2xhc3MoKSk7CkBAIC0yMTg3LDEwICsyNjI4LDEwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAKIAkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0SWRDbGFzcygpKTsKIAkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRJZENsYXNzKCkpOwpAQCAtMjIwOCwzOSArMjY0OSwxMDAgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJpbWFyeUtleUNvbHVtbk5hbWVXaXRoQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKIAkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZFBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHN1YlBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlPcm1FbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBzdWJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCQotCQlhc3NlcnROdWxsKGNoaWxkWG1sRW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkpOwotCi0JCXBhcmVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLm1ha2VTcGVjaWZpZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5tYWtlU3BlY2lmaWVkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CiAJCWFzc2VydEVxdWFscygiaWQiLCBjaGlsZFhtbEVudGl0eS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpKTsKIAkJCi0JCSgoT3JtSWRNYXBwaW5nKSBwYXJlbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0lEIik7CisJCSgoT3JtSWRNYXBwaW5nKSBzdXBlclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSUQiKTsKIAkJYXNzZXJ0RXF1YWxzKCJNWV9JRCIsIGNoaWxkWG1sRW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkpOwogCiAJCS8vVE9ETyBvbmNlIGJ1ZyAyMjg3MTggaXMgZml4ZWQKLS8vCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IGNoaWxkWG1sRW50aXR5LnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSAoT3JtQXR0cmlidXRlT3ZlcnJpZGUpIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOwotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIklEIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJJRCIsIGNoaWxkWG1sRW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkpOworCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IGNoaWxkWG1sRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCQorCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IChPcm1BdHRyaWJ1dGVPdmVycmlkZSkgb3JtQXR0cmlidXRlT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCW9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIklEIik7CisJCWFzc2VydEVxdWFscygiSUQiLCBjaGlsZFhtbEVudGl0eS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpKTsKIAl9CiAKIAkKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkQ29uY3JldGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHRlc3REaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZENvbmNyZXRlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuaXNEaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkKCkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKKwkJCisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOworCQlhc3NlcnRGYWxzZShlbnRpdHkuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZEFic3RyYWN0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEFic3RyYWN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbnRpdHkuaXNEaXNjcmltaW5hdG9yVmFsdWVBbGxvd2VkKCkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKKwkJCisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOworCQlhc3NlcnRUcnVlKGVudGl0eS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlQWJzdHJhY3RUZXN0RW50aXR5KCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGNvbmNyZXRlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGFic3RyYWN0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUVudGl0eSBjb25jcmV0ZUVudGl0eSA9IChFbnRpdHkpIGNvbmNyZXRlUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgY29uY3JldGVFbnRpdHkuZ2V0TmFtZSgpKTsKKwkJCisJCUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChFbnRpdHkpIGFic3RyYWN0UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBhYnN0cmFjdEVudGl0eS5nZXROYW1lKCkpOworCisJCQorCQkvL3RhYmxlLXBlci1jbGFzcywgbm8gZGlzY3JpbWluYXRvciBjb2x1bW4gYWxsb3dlZAorCQlhc3NlcnRGYWxzZShjb25jcmV0ZUVudGl0eS5zcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKCkpOworCQlhc3NlcnRGYWxzZShhYnN0cmFjdEVudGl0eS5zcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKCkpOworCisJCQorCQkvL3NpbmdsZS10YWJsZSwgZGlzY3JpbWluYXRvciBjb2x1bW4gYWxsb3dlZCBvbiByb290IGVudGl0eQorCQkoKEphdmFFbnRpdHkpIGFic3RyYWN0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KG51bGwpOworCQlhc3NlcnRGYWxzZShjb25jcmV0ZUVudGl0eS5zcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKCkpOworCQlhc3NlcnRUcnVlKGFic3RyYWN0RW50aXR5LnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdEVudGl0eUdldERlZmF1bHREaXNjcmltaW5hdG9yQ29sdW1uTmFtZVRhYmxlUGVyQ2xhc3NJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRUeXBlIGNvbmNyZXRlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGFic3RyYWN0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUVudGl0eSBjb25jcmV0ZUVudGl0eSA9IChFbnRpdHkpIGNvbmNyZXRlUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgY29uY3JldGVFbnRpdHkuZ2V0TmFtZSgpKTsKKwkJCisJCUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChFbnRpdHkpIGFic3RyYWN0UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBhYnN0cmFjdEVudGl0eS5nZXROYW1lKCkpOworCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CisJCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBhYnN0cmFjdEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGNvbmNyZXRlRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQkKKwkJCisJCWFzc2VydFRydWUoYWJzdHJhY3RFbnRpdHkuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSk7CisJCWFzc2VydEZhbHNlKGNvbmNyZXRlRW50aXR5LnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb25jcmV0ZUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCQorCQlhc3NlcnRUcnVlKGFic3RyYWN0RW50aXR5LmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb25jcmV0ZUVudGl0eS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSk7CiAJfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtR2VuZXJhdGVkVmFsdWVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1HZW5lcmF0ZWRWYWx1ZVRlc3RzLmphdmEKaW5kZXggYTkzNjZjMi4uZWJjYzdlNSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1HZW5lcmF0ZWRWYWx1ZVRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1HZW5lcmF0ZWRWYWx1ZVRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTMsNiArMTMsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkdlbmVyYXRlZFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdGVkVmFsdWU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CkBAIC0yMywxMCArMjYsMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCi1wdWJsaWMgY2xhc3MgT3JtR2VuZXJhdGVkVmFsdWVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKXB1YmxpYyBjbGFzcyBPcm1HZW5lcmF0ZWRWYWx1ZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwdWJsaWMgT3JtR2VuZXJhdGVkVmFsdWVUZXN0cyhTdHJpbmcgbmFtZSkgewogCQlzdXBlcihuYW1lKTsKQEAgLTM3LDIyICs0MCwxMSBAQAogCQlzdXBlci5zZXRVcCgpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwkJCisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUlkQW5ub3RhdGlvbigpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02OSwzMCArNjEsMTIgQEAKIAkJfSk7CiAJfQogCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7CiAJCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJT3JtR2VuZXJhdGVkVmFsdWUgb3JtR2VuZXJhdGVkVmFsdWUgPSBvcm1JZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOworCQlYbWxJZCBpZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwogCQlYbWxHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gaWRSZXNvdXJjZS5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwogCQkKIAkJLy9zZXQgZ2VuZXJhdG9yIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZApAQCAtMTA3LDExICs4MSwxMSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7CiAJCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJT3JtR2VuZXJhdGVkVmFsdWUgb3JtR2VuZXJhdGVkVmFsdWUgPSBvcm1JZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOworCQlYbWxJZCBpZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwogCQlYbWxHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gaWRSZXNvdXJjZS5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwogCQkKIAkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCkBAIC0xMjUsNCArOTksMzcgQEAKIAkJYXNzZXJ0TnVsbChvcm1HZW5lcmF0ZWRWYWx1ZS5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSk7CiAJfQogCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRzRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1JZEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlJZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKElkTWFwcGluZykgb3JtSWRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOworCQkKKwkJSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKKwkJR2VuZXJhdGVkVmFsdWUgamF2YUdlbmVyYXRlZFZhbHVlID0gamF2YUlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOworCQlqYXZhR2VuZXJhdGVkVmFsdWUuc2V0U3BlY2lmaWVkR2VuZXJhdG9yKCJGb28iKTsKKwkJamF2YUdlbmVyYXRlZFZhbHVlLnNldFNwZWNpZmllZFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlLlNFUVVFTkNFKTsKKwkJCisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkpOworCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UsIG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldFNwZWNpZmllZFN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGphdmFHZW5lcmF0ZWRWYWx1ZS5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSk7CisJCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSwgamF2YUdlbmVyYXRlZFZhbHVlLmdldFNwZWNpZmllZFN0cmF0ZWd5KCkpOworCQkKKwkJb3JtSWRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOworCQlvcm1JZEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybUlkTWFwcGluZyA9IChJZE1hcHBpbmcpIG9ybUlkQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBqYXZhR2VuZXJhdGVkVmFsdWUuZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkpOworCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UsIGphdmFHZW5lcmF0ZWRWYWx1ZS5nZXRTcGVjaWZpZWRTdHJhdGVneSgpKTsKKwkJCisJCW9ybUlkQXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7CisJCW9ybUlkQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybUlkTWFwcGluZyA9IChJZE1hcHBpbmcpIG9ybUlkQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSk7CisJCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSwgb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgamF2YUdlbmVyYXRlZFZhbHVlLmdldFNwZWNpZmllZEdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRpb25UeXBlLlNFUVVFTkNFLCBqYXZhR2VuZXJhdGVkVmFsdWUuZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKSk7CisJfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSWRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSWRNYXBwaW5nVGVzdHMuamF2YQppbmRleCA4MTk5ZTZmLi5mNzMxNDc4IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUlkTWFwcGluZ1Rlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1JZE1hcHBpbmdUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE0LDYgKzE0LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5HZW5lcmF0aW9uVHlwZTsKQEAgLTIyLDYgKzIzLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7CkBAIC0zOCw5ICs0MCw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBPcm1JZE1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAJcHVibGljIE9ybUlkTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC01Myw3MyArNTUsMTEgQEAKIAkJc3VwZXIuc2V0VXAoKTsKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CiAJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQ29sdW1uIiwgCi0JCQkiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOyIgKwotCQkJImJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJImJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7IiArCi0JCQkiaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsiICsKLQkJCSJpbnQgc2NhbGUoKSBkZWZhdWx0IDA7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlbXBvcmFsQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRlbXBvcmFsIiwgIlRlbXBvcmFsVHlwZSB2YWx1ZSgpOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJHZW5lcmF0ZWRWYWx1ZSIsIAotCQkJIkdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOyIgKwotCQkJIlN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0IFwiXCI7ICIpOwkJCi0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlNlcXVlbmNlR2VuZXJhdG9yIiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsiICsKLQkJCSJTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwOyAiICsKLQkJCSJpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOyIpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRhYmxlR2VuZXJhdG9yIiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsgIiArCi0JCQkiaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsgIiArCi0JCQkiVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsiKTsJCQorCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUlkQW5ub3RhdGlvbigpOwotCQljcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVRlbXBvcmFsQW5ub3RhdGlvbigpOwotCQljcmVhdGVHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24oKTsKLQkJY3JlYXRlU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xNDgsMTAgKzg4LDEwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKIAkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CisJCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoImlkTWFwcGluZyIsIG9ybUlkTWFwcGluZy5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoImlkTWFwcGluZyIsIGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKQEAgLTE2OCwxMCArMTA4LDEwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKIAkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CisJCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoImlkTWFwcGluZyIsIG9ybUlkTWFwcGluZy5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoImlkTWFwcGluZyIsIGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKQEAgLTE4OCw1OSArMTI4LDYwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7CiAJCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOworCQlYbWxJZCBpZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKIAkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFRlbXBvcmFsKCkpOwogCQkJCQogCQkvL3NldCB0ZW1wb3JhbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKIAkJaWRSZXNvdXJjZS5zZXRUZW1wb3JhbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsIG9ybUlkTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKIAkKIAkJaWRSZXNvdXJjZS5zZXRUZW1wb3JhbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsIG9ybUlkTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKIAogCQlpZFJlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIG9ybUlkTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIGlkUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7CiAKIAkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKIAkJaWRSZXNvdXJjZS5zZXRUZW1wb3JhbChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKIAkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFRlbXBvcmFsKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwogCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKKwkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKIAkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CiAJCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKIAkJCQkKIAkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSk7CisJCW9ybUlkTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5EQVRFKTsKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCBvcm1JZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtSWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7CiAJCi0JCW9ybUlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCBvcm1JZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtSWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7CiAKLQkJb3JtSWRNYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1JZE1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QLCBpZFJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgb3JtSWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtSWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7CiAKIAkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1JZE1hcHBpbmcuc2V0VGVtcG9yYWwobnVsbCk7CisJCW9ybUlkTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIobnVsbCk7CiAJCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKIAl9CiAJCiAJLy9UT0RPIHRlc3QgZGVmYXVsdHMKQEAgLTI0OCwyMiArMTg5LDIyIEBACiAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwogCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKKwkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKIAkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKIAkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwogCQkKLQkJb3JtSWRNYXBwaW5nLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCW9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwogCQkKIAkJYXNzZXJ0Tm90TnVsbChpZFJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CiAJCQkJCiAJCS8vdHJ5IGFkZGluZyBhbm90aGVyIHNlcXVlbmNlIGdlbmVyYXRvciwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KIAkJdHJ5IHsKLQkJCW9ybUlkTWFwcGluZy5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOworCQkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CiAJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTI3MSwyNiArMjEyLDI2IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7CiAJCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOworCQlYbWxJZCBpZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CisJCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwogCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CiAKLQkJb3JtSWRNYXBwaW5nLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCW9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwogCQlhc3NlcnROb3ROdWxsKGlkUmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwob3JtSWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROb3ROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKIAotCQlvcm1JZE1hcHBpbmcucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7CiAJCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CiAJCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKIAogCQkvL3RyeSByZW1vdmluZyB0aGUgc2VxdWVuY2UgZ2VuZXJhdG9yIGFnYWluLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgogCQl0cnkgewotCQkJb3JtSWRNYXBwaW5nLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7CQkKKwkJCW9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOwkJCiAJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTI5OCw0NiArMjM5LDQ2IEBACiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKIAkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CisJCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CiAJCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CiAJCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCi0JCWlkUmVzb3VyY2Uuc2V0U2VxdWVuY2VHZW5lcmF0b3IoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2VxdWVuY2VHZW5lcmF0b3JJbXBsKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKKwkJaWRSZXNvdXJjZS5zZXRTZXF1ZW5jZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CiAJCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCi0JCW9ybUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbEdlbmVyYXRvcnMoKSkpOworCQlvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCQkKIAkJaWRSZXNvdXJjZS5zZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CisJCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwogCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1JZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7CisJCWFzc2VydEVxdWFscygwLCBvcm1JZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGRUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7CiAJCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOworCQlYbWxJZCBpZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CisJCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwogCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CiAJCQotCQlvcm1JZE1hcHBpbmcuYWRkVGFibGVHZW5lcmF0b3IoKTsKKwkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7CiAJCQogCQlhc3NlcnROb3ROdWxsKGlkUmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwob3JtSWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROb3ROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKIAkJCQkKIAkJLy90cnkgYWRkaW5nIGFub3RoZXIgdGFibGUgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgogCQl0cnkgewotCQkJb3JtSWRNYXBwaW5nLmFkZFRhYmxlR2VuZXJhdG9yKCk7CisJCQlvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKIAkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKIAkJCXJldHVybjsKIAkJfQpAQCAtMzQ1LDI2ICsyODYsMjYgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZVRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKIAkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CisJCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CiAJCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CiAJCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKIAotCQlvcm1JZE1hcHBpbmcuYWRkVGFibGVHZW5lcmF0b3IoKTsKKwkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7CiAJCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CisJCWFzc2VydE5vdE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwogCi0JCW9ybUlkTWFwcGluZy5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOworCQlvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsKIAkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKIAkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwogCiAJCS8vdHJ5IHJlbW92aW5nIHRoZSB0YWJsZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCiAJCXRyeSB7Ci0JCQlvcm1JZE1hcHBpbmcucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsJCQorCQkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLnJlbW92ZVRhYmxlR2VuZXJhdG9yKCk7CQkKIAkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKIAkJCXJldHVybjsKIAkJfQpAQCAtMzcyLDM0ICszMTMsMzQgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKIAkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CisJCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CiAJCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CiAJCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZW5lcmF0b3JzU2l6ZSgpKTsKIAkJCi0JCWlkUmVzb3VyY2Uuc2V0VGFibGVHZW5lcmF0b3IoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGVHZW5lcmF0b3JJbXBsKCkpOwkJCi0JCWFzc2VydE5vdE51bGwob3JtSWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCkpOworCQlpZFJlc291cmNlLnNldFRhYmxlR2VuZXJhdG9yKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlR2VuZXJhdG9yKCkpOwkJCisJCWFzc2VydE5vdE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwogCQlhc3NlcnROb3ROdWxsKGlkUmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1JZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1JZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAJCQotCQlvcm1JZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5hbGxHZW5lcmF0b3JzKCkpKTsKKwkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZSgiZm9vIik7CisJCWFzc2VydEVxdWFscygxLCBvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAKIAkJaWRSZXNvdXJjZS5zZXRUYWJsZUdlbmVyYXRvcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CisJCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwogCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1JZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsR2VuZXJhdG9ycygpKSk7CisJCWFzc2VydEVxdWFscygwLCBvcm1JZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2VuZXJhdG9yc1NpemUoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdEFkZEdlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKIAkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CisJCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKIAkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldEdlbmVyYXRlZFZhbHVlKCkpOwpAQCAtNDE5LDEwICszNjAsMTAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZUdlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKIAkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CisJCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKIAkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldEdlbmVyYXRlZFZhbHVlKCkpOwpAQCAtNDQ2LDE1ICszODcsMTUgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlR2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwogCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKKwkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwogCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7CiAJCQotCQlpZFJlc291cmNlLnNldEdlbmVyYXRlZFZhbHVlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEdlbmVyYXRlZFZhbHVlSW1wbCgpKTsKKwkJaWRSZXNvdXJjZS5zZXRHZW5lcmF0ZWRWYWx1ZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxHZW5lcmF0ZWRWYWx1ZSgpKTsKIAkJCQkKIAkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7CiAJCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKQEAgLTQ2OCw3ICs0MDksNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RJZE1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKIAotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImZvbyIpOwogCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwogCQkKQEAgLTQ3NiwxMCArNDE3LDEwIEBACiAJCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CiAJCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CisJCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKIAogCQkKIAkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUlkTWFwcGluZy5nZXRDb2x1bW4oKTsKQEAgLTQ5NSwxNSArNDM2LDE1IEBACiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwogCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjU1KSwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMCksIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDApLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKIAl9CiAJCiAJLy9AQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlKQpAQCAtNTE1LDEzICs0NTYsMTQgQEAKIAkvL0BFbnVtZXJhdGVkKEVudW1UeXBlLlNUUklORykKIAlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQkKIAkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUlkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgb3JtSWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUiwgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKIAkJCiAJCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1JZE1hcHBpbmcuZ2V0Q29sdW1uKCk7CiAJCWFzc2VydEVxdWFscygiTVlfQ09MVU1OIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CkBAIC01MzksNyArNDgxLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKCJteVRhYmxlR2VuZXJhdG9yIiwgb3JtR2VuZXJhdGVkVmFsdWUuZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkpOwogCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGlvblR5cGUuVEFCTEUsIG9ybUdlbmVyYXRlZFZhbHVlLmdldFNwZWNpZmllZFN0cmF0ZWd5KCkpOwogCQkKLQkJT3JtVGFibGVHZW5lcmF0b3Igb3JtVGFibGVHZW5lcmF0b3IgPSBvcm1JZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKTsKKwkJT3JtVGFibGVHZW5lcmF0b3Igb3JtVGFibGVHZW5lcmF0b3IgPSBvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKTsKIAkJYXNzZXJ0RXF1YWxzKCJteVRhYmxlR2VuZXJhdG9yIiwgb3JtVGFibGVHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJteVRhYmxlIiwgb3JtVGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CiAJCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgb3JtVGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKQEAgLTU1MCwxMyArNDkyLDEzIEBACiAJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIG9ybVRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgb3JtVGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7CiAKLQkJT3JtU2VxdWVuY2VHZW5lcmF0b3Igb3JtU2VxdWVuY2VHZW5lcmF0b3IgPSBvcm1JZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJT3JtU2VxdWVuY2VHZW5lcmF0b3Igb3JtU2VxdWVuY2VHZW5lcmF0b3IgPSBvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKIAkJYXNzZXJ0RXF1YWxzKCJteVNlcXVlbmNlR2VuZXJhdG9yIiwgb3JtU2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwogCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwpAQCAtNTY4LDI4ICs1MTAsMjggQEAKIAkJCiAJCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCiAJCWFzc2VydEVxdWFscygiaWQiLCBvcm1JZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKIAkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRUYWJsZUdlbmVyYXRvcigpKTsKKwkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7CisJCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwogCQkKIAkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUlkTWFwcGluZy5nZXRDb2x1bW4oKTsKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFVwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwogCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwogCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjU1KSwgb3JtQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigwKSwgb3JtQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigwKSwgb3JtQ29sdW1uLmdldFNjYWxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCBvcm1Db2x1bW4uZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbHVtbi5nZXRTY2FsZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwogCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKIAkJCkBAIC01OTcsMTAgKzUzOSwxMCBAQAogCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CiAJCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CisJCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOworCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKIAkJCiAJCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1JZE1hcHBpbmcuZ2V0Q29sdW1uKCk7CiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CkBAIC02MTUsMTUgKzU1NywxNSBAQAogCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKIAkJCiAJCWFzc2VydEVxdWFscygiaWQiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwogCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjU1KSwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMCksIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDApLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKIAl9CiAJCiAJLy8zIHRoaW5ncyB0ZXN0ZWQgYWJvdmUKQEAgLTYzMywxMyArNTc1LDE0IEBACiAKIAlwdWJsaWMgdm9pZCB0ZXN0SWRNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwogCQkKIAkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7CisJCWlkTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwpAQCAtNjQ3LDE5ICs1OTAsMTkgQEAKIAkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwogCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRUZW1wb3JhbCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RJZE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKIAkJCiAJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQlpZE1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CiAJCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwpAQCAtNjY3LDE5ICs2MTAsMTkgQEAKIAkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwogCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwogCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0VGVtcG9yYWwoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgKChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RJZE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwogCQkKIAkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7CisJCWlkTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKQEAgLTY4OSwxMyArNjMyLDE0IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdElkTW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKIAkJCiAJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQlpZE1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CiAJCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKQEAgLTcwNywxMyArNjUxLDE0IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdElkTW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwogCQkKIAkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7CisJCWlkTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwpAQCAtNzIzLDEzICs2NjgsMTQgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0SWRNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwogCQkKIAkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7CisJCWlkTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CkBAIC03NDEsMTMgKzY4NywxNCBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RJZE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwogCQkKIAkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7CisJCWlkTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwpAQCAtNzU5LDEzICs3MDYsMTQgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0SWRNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKIAkJCiAJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQlpZE1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CiAJCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKQEAgLTc3NywxMyArNzI1LDE0IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdElkTW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwogCQkKIAkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7CisJCWlkTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUpvaW5Db2x1bW5UZXN0cy5qYXZhCmluZGV4IDI0YTE5ZGIuLmIyZGMwOGEgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtblRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uVGVzdHMuamF2YQpAQCAtMSwxMyArMSwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKQEAgLTI0LDYgKzIzLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBPcm1Kb2luQ29sdW1uVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXB1YmxpYyBPcm1Kb2luQ29sdW1uVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTM1LDE3ICszNSwxNyBAQAogCQlzdXBlci5zZXRVcCgpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7CisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwkJCisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsJCQogCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKIAkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKQEAgLTczLDEyICs3MywxMiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwkJCisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsJCQogCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKIAkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKQEAgLTk4LDEyICs5OCwxMiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsJCQorCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKIAkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7CiAJCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7CkBAIC0xMzEsMTIgKzEzMSwxMiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsJCQorCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKIAkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7CiAJCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7CkBAIC0xNTYsMTIgKzE1NiwxMiBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKIAotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CQkKKwkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCiAJCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwogCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwpAQCAtMTg5LDEyICsxODksMTIgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsJCQorCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKIAkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7CiAJCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7CkBAIC0yMTQsMTIgKzIxNCwxMiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsJCQorCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKIAkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7CiAJCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7CkBAIC0yNDcsMTIgKzI0NywxMiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsJCQorCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKIAkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7CiAJCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7CkBAIC0yNzIsMTIgKzI3MiwxMiBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwkJCisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsJCQogCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKIAkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKQEAgLTMwNSwxMiArMzA1LDEyIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwkJCisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsJCQogCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKIAkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKQEAgLTMzMCwxMiArMzMwLDEyIEBACiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwkJCisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsJCQogCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKIAkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKQEAgLTM2MywxMiArMzYzLDEyIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsJCQorCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKIAkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7CiAJCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7CkBAIC0zODgsMTIgKzM4OCwxMiBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKIAotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CQkKKwkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCiAJCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwogCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwpAQCAtNDIxLDEyICs0MjEsMTIgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsJCQorCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKIAkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7CiAJCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7CkBAIC00NDYsMTIgKzQ0NiwxMiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKIAotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CQkKKwkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCiAJCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwogCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwpAQCAtNDc5LDEyICs0NzksMTIgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwkJCisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsJCQogCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKIAkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSm9pblRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSm9pblRhYmxlVGVzdHMuamF2YQppbmRleCBjMTY3MDk1Li5lYzM5ZGNkIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUpvaW5UYWJsZVRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Kb2luVGFibGVUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTM3LDYgKzM3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBPcm1Kb2luVGFibGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAJcHVibGljIE9ybUpvaW5UYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC00OCwzNiArNDksMTEgQEAKIAkJc3VwZXIuc2V0VXAoKTsKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CiAJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTWFueVRvTWFueUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9NYW55IiwgIiIpOwkJCisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCX0KIAotCXByaXZhdGUgdm9pZCBjcmVhdGVKb2luVGFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJLy9UT0RPCi0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5UYWJsZSIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU1hbnlUb01hbnlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUpvaW5UYWJsZUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewkJCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTEyMiwxOSArOTgsMTkgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOworCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwogCQkKIAkJCiAJCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZUltcGwoKSk7CisJCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKIAkJbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5zZXROYW1lKCJGT08iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldE5hbWUoKSk7CkBAIC0xNTQsMTIgKzEzMCwxMiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOworCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwpAQCAtMTc4LDE3ICsxNTQsMTcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicHJvamVjdHMiKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKKwkJCiAJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CiAJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAogCQljcmVhdGVUYXJnZXRFbnRpdHkoKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Qcm9qZWN0Iik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJvamVjdCIpOwogCiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX1Byb2plY3QiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKQEAgLTIwMyw5ICsxNzksOSBAQAogLy8JCWFzc2VydEVxdWFscygiaWRfcHJvamVjdF9pZCIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwogLy8JCWFzc2VydEVxdWFscygiaWRfcHJvamVjdF9pZCIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKIAkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKIAkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5UYWJsZSBqYXZhSm9pblRhYmxlID0gamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOworCQlKYXZhSm9pblRhYmxlIGphdmFKb2luVGFibGUgPSBqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CiAJCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CiAJCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQ0FUQUxPRyIpOwogCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiU0NIRU1BIik7CkBAIC0yMzIsMTYgKzIwOCwxNiBAQAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnkoKTsKIAotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQkKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAicHJvamVjdHMiKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQkKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOworCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CiAJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJCQogCQljcmVhdGVUYXJnZXRFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgdGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByb2plY3QiKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgdGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByb2plY3QiKTsKIAkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfUHJvamVjdCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKIAogCQkKQEAgLTI1MywyOCArMjI5LDI4IEBACiAJCQogCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicHJvamVjdHMiKS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwogCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9KT0lOX1RBQkxFIik7CisJCWphdmFNYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0pPSU5fVEFCTEUiKTsKIAkJCiAJCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKIAogCQkKIAkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgdG8gdHJ1ZSwgd2lsbCBpZ25vcmUgamF2YSBhbm5vdGF0aW9uIHNldHRpbmdzCi0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwogCQkvL29ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX1Byb2plY3QiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJCQogCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKIAkJLy9yZW1vdmUgbS1tIG1hcHBpbmcgZnJvbSB0aGUgb3JtLnhtbCBmaWxlCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVZpcnR1YWwoKTsKIAkJLy9vcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKIAkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpOwogCQlvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOworCQlvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0pPSU5fVEFCTEUiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOy8vc3BlY2lmaWVkTmFtZSBzaW5jZSB0aGlzIGlzIGEgdmlydHVhbCBtYXBwaW5nIG5vdworCQlhc3NlcnRFcXVhbHMoIkpBVkFfSk9JTl9UQUJMRSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ly9zcGVjaWZpZWROYW1lIHNpbmNlIHRoaXMgaXMgYSB2aXJ0dWFsIG1hcHBpbmcgbm93CiAJCQotCQlqYXZhTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKKwkJamF2YU1hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CiAJCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJCQpAQCAtMjg2LDE4ICsyNjIsMTggQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKIAotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJCiAJCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKIAkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKIAkJCiAJCS8vc2V0IHNjaGVtYSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlSW1wbCgpKTsKKwkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwogCQltYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLnNldFNjaGVtYSgiRk9PIik7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldFNjaGVtYSgpKTsKQEAgLTQwNCwxMiArMzgwLDEyIEBACiAvLwl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKIAotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJCiAJCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKIAkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKQEAgLTQyNiwxOCArNDAyLDE4IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKIAotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJCiAJCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7CiAJCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7CiAJCQogCQkvL3NldCBDYXRhbG9nIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGVJbXBsKCkpOworCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7CiAJCW1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuc2V0Q2F0YWxvZygiRk9PIik7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5nZXRDYXRhbG9nKCkpOwpAQCAtNDU3LDEyICs0MzMsMTIgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKKwkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwogCQkKIAkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKIAkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKQEAgLTU4OSwxMiArNTY1LDEyIEBACiAKIAogCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKIAotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJCiAJCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwpAQCAtNjI3LDEzICs2MDMsMTMgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQorCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CisJCQogCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CiAJCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwpAQCAtNjU1LDEzICs2MzEsMTMgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKIAotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0KKwkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOworCQkKIAkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CiAJCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwogCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKQEAgLTY5MywxOCArNjY5LDE4IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJbnZlcnNlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlSW1wbCgpKTsKKwkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOworCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7CiAJCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7CiAJCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uSW1wbCgpKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW5JbXBsKCkpOwotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbkltcGwoKSk7CisJCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOworCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKKwkJam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7CiAJCQogCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7CiAJCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKQEAgLTc0NiwxMiArNzIyLDEyIEBACiAJfQogCiAJcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKIAotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7CisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJCiAJCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKQEAgLTc4NCwxMyArNzYwLDEzIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKKwkJCiAJCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwogCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CkBAIC04MTIsMTMgKzc4OCwxMyBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKIAotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0KKwkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOworCQkKIAkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CiAJCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKQEAgLTg1MCwxOCArODI2LDE4IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGVJbXBsKCkpOworCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CisJCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKIAkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKIAkKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbkltcGwoKSk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW5JbXBsKCkpOwotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uSW1wbCgpKTsKKwkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKKwkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKKwkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKIAkJCiAJCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwogCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKQEAgLTkwNCwyMyArODgwLDIzIEBACiAJCiAKIAlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlSW1wbCgpKTsKKwkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOworCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7CiAJCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7CiAJCQogCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKIAkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKIAkJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKKwkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7CiAJCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7CiAJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7CiAJCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOworCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7CiAJCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7CiAJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7CiAJCQpAQCAtOTMyLDIyICs5MDgsMjIgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGVJbXBsKCkpOworCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CisJCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKIAkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKIAkJCiAJCWFzc2VydEVxdWFscygwLCAgb3JtSm9pblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKIAkJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKKwkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7CiAJCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7CiAJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7CiAJCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOworCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7CiAJCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDEsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7CiAJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7CiAJCQpAQCAtOTU1LDEzICs5MzEsMTMgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGVJbXBsKCkpOworCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CisJCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKIAkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKIAkJCiAJCW9ybUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwpAQCAtOTc3LDEzICs5NTMsMTMgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKIAotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZUltcGwoKSk7CisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKKwkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwogCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwogCiAJCW9ybUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwpAQCAtOTk5LDEzICs5NzUsMTMgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlSW1wbCgpKTsKKwkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOworCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7CiAJCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7CiAJCQogCQlvcm1Kb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKQEAgLTEwNDUsMTMgKzEwMjEsMTMgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKIAotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZUltcGwoKSk7CisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKKwkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwogCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwogCQkKIAkJb3JtSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7CkBAIC0xMDg2LDI0ICsxMDYyLDI0IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpOwotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGVJbXBsKCkpOworCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CisJCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKIAkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKIAkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOworCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKIAkJam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKIAkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJGT08iKTsKIAotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOworCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7CiAJCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDEsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7CiAJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiQkFSIik7CiAKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKKwkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwogCQlqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgyLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwogCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBWiIpOwogCkBAIC0xMTQ4LDkgKzExMjQsOSBAQAogCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c0Zyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55KCk7CiAJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKTsKKwkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwogCQkKIAkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpOwogCQkKQEAgLTExNTgsMTAgKzExMzQsMTEgQEAKIAkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKIAogCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7CisJCUphdmFKb2luVGFibGUgamF2YUpvaW5UYWJsZSA9IGphdmFNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7CisJCWphdmFKb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKKwkJamF2YUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOworCQlqYXZhSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7CiAKIAkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKIAkJYXNzZXJ0VHJ1ZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwpAQCAtMTE3Myw4ICsxMTUwLDcgQEAKIAkJb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLm1ha2VTcGVjaWZpZWQoKTsKIAkJCiAJCW9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygwLCAgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKIAl9CiAKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmluZGV4IDY1MDdiNDMuLmMyZDM4ZDQgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCkBAIC0xLDE3ICsxLDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CiAKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwpAQCAtMjMsMjIgKzI1LDEwOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAJcHVibGljIE9ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKIAkJc3VwZXIobmFtZSk7CiAJfQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQorCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQorCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQogCQogCQogCUBPdmVycmlkZQpAQCAtNDYsMTUgKzEzNSwxNSBAQAogCQlzdXBlci5zZXRVcCgpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7CisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnlNYXBwaW5nIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55TWFwcGluZyIsIG1hbnlUb01hbnkuZ2V0TmFtZSgpKTsKQEAgLTcxLDEwICsxNjAsMTAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55TWFwcGluZyIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygibWFueVRvTWFueU1hcHBpbmciLCBtYW55VG9NYW55LmdldE5hbWUoKSk7CkBAIC05MSwxMCArMTgwLDEwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7CiAJCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7CkBAIC0xMTEsMTAgKzIwMCwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwpAQCAtMTMxLDEwICsyMjAsMTAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRGZXRjaCgpKTsKQEAgLTE1NSwxMCArMjQ0LDEwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKIAkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7CkBAIC0xNzksMTYyICsyNjgsMTY0IEBACiAJfQogCQkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCU9ybU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAJCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlhc3NlcnROdWxsKHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7CiAJCQkJCiAJCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQltYW55VG9NYW55LnNldE1hcHBlZEJ5KCJuZXdNYXBwZWRCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7CisJCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7CiAJCiAJCS8vc2V0bWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKIAkJbWFueVRvTWFueS5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKKwkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCU9ybU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAJCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlhc3NlcnROdWxsKHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7CiAJCQkJCiAJCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibmV3TWFwcGVkQnkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlzdHJhdGVneS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibmV3TWFwcGVkQnkiKTsKKwkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwogCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5IiwgbWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKIAkKIAkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKKwkJc3RyYXRlZ3kuc2V0TWFwcGVkQnlBdHRyaWJ1dGUobnVsbCk7CisJCWFzc2VydE51bGwoc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKKwkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CiAJCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7CiAJCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7CiAJCQogCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJbWFueVRvTWFueS5zZXRNYXBLZXkoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWFwS2V5SW1wbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7CisJCW1hbnlUb01hbnkuc2V0TWFwS2V5KE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1hcEtleSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7CiAJCWFzc2VydE5vdE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7CiAJCQkJCiAJCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQltYW55VG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7CisJCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7CiAJCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7CiAJCQogCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAogCQltYW55VG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOworCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKIAkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7CiAJCQogCQltYW55VG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUoIm15TWFwS2V5Iik7CiAJCW1hbnlUb01hbnkuc2V0TWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7CiAJCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7CisJCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkpOwogCQkJCQkKIAkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJteU1hcEtleSIpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOworCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm15TWFwS2V5Iik7CisJCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7CiAJCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7CiAJCiAJCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7CisJCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleShudWxsKTsKKwkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7CiAJCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcmRlckJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKIAkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKIAkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0T3JkZXJCeSgpKTsKIAkJCQkKIAkJLy9zZXQgb3JkZXJCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKIAkJbWFueVRvTWFueS5zZXRPcmRlckJ5KCJuZXdPcmRlckJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7CisJCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7CiAJCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG1hbnlUb01hbnkuZ2V0T3JkZXJCeSgpKTsKIAkKIAkJLy9zZXQgb3JkZXJCeSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAogCQltYW55VG9NYW55LnNldE9yZGVyQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0T3JkZXJCeSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeU9yZGVyQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOworCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7CiAJCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRPcmRlckJ5KCkpOwogCQkJCQogCQkvL3NldCBtYXBwZWRCeSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOworCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJuZXdPcmRlckJ5Iik7CisJCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7CiAJCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG1hbnlUb01hbnkuZ2V0T3JkZXJCeSgpKTsKIAkKIAkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7CisJCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkobnVsbCk7CisJCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKIAkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE9yZGVyQnkoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RJc05vT3JkZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnRUcnVlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmlzTm9PcmRlcmluZygpKTsKIAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJmb28iKTsKKwkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiZm9vIik7CiAJCWFzc2VydEZhbHNlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmlzTm9PcmRlcmluZygpKTsKIAkJCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkobnVsbCk7CisJCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkobnVsbCk7CiAJCWFzc2VydFRydWUob3JtTWFueVRvTWFueU1hcHBpbmcuaXNOb09yZGVyaW5nKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0Tm9PcmRlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7CiAJCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydFRydWUob3JtTWFueVRvTWFueU1hcHBpbmcuaXNOb09yZGVyaW5nKCkpOwogCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImZvbyIpOworCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJmb28iKTsKIAkJYXNzZXJ0RmFsc2Uob3JtTWFueVRvTWFueU1hcHBpbmcuaXNOb09yZGVyaW5nKCkpOwogCQkKIAkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0Tm9PcmRlcmluZyh0cnVlKTsKIAkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwogCX0KIC8vVE9ETwogLy8JcHVibGljIGJvb2xlYW4gaXNPcmRlckJ5UGsoKSB7CkBAIC0zNDYsMzcgKzQzNywyOSBAQAogLy8JfQogCiAJcHVibGljIHZvaWQgdGVzdElzQ3VzdG9tT3JkZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwogCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnRGYWxzZShvcm1NYW55VG9NYW55TWFwcGluZy5pc0N1c3RvbU9yZGVyaW5nKCkpOwogCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImZvbyIpOworCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJmb28iKTsKIAkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5pc0N1c3RvbU9yZGVyaW5nKCkpOwogCQkKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeShudWxsKTsKKwkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeShudWxsKTsKIAkJYXNzZXJ0RmFsc2Uob3JtTWFueVRvTWFueU1hcHBpbmcuaXNDdXN0b21PcmRlcmluZygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnkiKTsKIAkJCiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXkoIm1hcEtleSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOworCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJjdXN0b21PcmRlciIpOworCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwogCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQogCQkKIAkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CkBAIC0zODcsMjMgKzQ3MCwxNSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TWFueVRvTWFueU1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7CiAJCQogCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJpbnZlcnNlTmFtZSIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiaW52ZXJzZVJlZmVyZW5jZU5hbWUiKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKIAkJCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CkBAIC00MTQsMjMgKzQ4OSwxNSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TWFueVRvTWFueU1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnkiKTsKIAkJCiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXkoIm1hcEtleSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOworCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJjdXN0b21PcmRlciIpOworCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwogCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQogCQkKIAkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwpAQCAtNDQxLDIzICs1MDgsMTUgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnkiKTsKIAkJCiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXkoIm1hcEtleSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOworCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJjdXN0b21PcmRlciIpOworCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwogCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQogCQkKIAkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CkBAIC00NjgsMjMgKzUyNywxNSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TWFueVRvTWFueU1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7CiAJCQogCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJpbnZlcnNlTmFtZSIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiaW52ZXJzZVJlZmVyZW5jZU5hbWUiKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKIAkJCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwpAQCAtNDk1LDI4ICs1NDYsMjEgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnkiKTsKIAkJCiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXkoIm1hcEtleSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwogCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7CiAJCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJpbnZlcnNlTmFtZSIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiaW52ZXJzZVJlZmVyZW5jZU5hbWUiKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKIAkJCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CkBAIC01MjYsNyArNTcwLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJUYXJnZXRFbnRpdHkiLCAoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYXBwZWRCeSIsICgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0TWFwcGVkQnkoKSk7CisJCWFzc2VydEVxdWFscygibWFwcGVkQnkiLCAoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNBbGwoKSk7CiAJCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNNZXJnZSgpKTsKIAkJYXNzZXJ0VHJ1ZSgoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7CkBAIC01MzUsMjYgKzU3OSwyNSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TWFueVRvTWFueU1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnkiKTsKIAkJCiAJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXkoIm1hcEtleSIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwogCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7CiAJCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7CisJCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKIAkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKIAkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7CiAJCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCkBAIC01NjYsMTMgKzYwOSwxMiBAQAogCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnkiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJUYXJnZXRFbnRpdHkiLCAoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibWFwcGVkQnkiLCAoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRNYXBwZWRCeSgpKTsKIAkJYXNzZXJ0VHJ1ZSgoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNBbGwoKSk7CiAJCWFzc2VydFRydWUoKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7CiAJCWFzc2VydFRydWUoKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUGVyc2lzdCgpKTsKIAkJYXNzZXJ0VHJ1ZSgoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZWZyZXNoKCkpOwogCQlhc3NlcnRUcnVlKCgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9ICgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldEpvaW5UYWJsZSgpOworCQlKb2luVGFibGUgam9pblRhYmxlID0gKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CiAJCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIGpvaW5UYWJsZS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBqb2luVGFibGUuam9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJyZWZlcmVuY2VOYW1lIiwgam9pblRhYmxlLmpvaW5Db2x1bW5zKCkubmV4dCgpLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwpAQCAtNTgxLDI4ICs2MjMsMjAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7CiAJCQogCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7CisJCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7CisJCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibWFwS2V5Iik7CiAJCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7CiAJCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7CiAJCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwogCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7CiAJCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCiAJCQogCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKQEAgLTYyMCwyOCArNjU0LDIwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9NYW55TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7CiAJCQogCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7CisJCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7CisJCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibWFwS2V5Iik7CiAJCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7CiAJCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKIAkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7CiAJCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwogCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7CiAJCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCiAJCQogCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKQEAgLTY1MSw0ICs2NzcsNDYgQEAKIAkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKIC8vVE9ETwlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKElCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKIAl9CisJCisJcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7CisJCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7CisJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOworCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCisJCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKKwkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKwkJCisJCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7CisJCWF0dHJpYnV0ZU5hbWVzID0gCisJCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKwkJCisJCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKKwkJYXR0cmlidXRlTmFtZXMgPSAKKwkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKwkJCisJCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7CisJCWFzc2VydE51bGwoc3RhdGVGb29NYXBwaW5nKTsKKwl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKaW5kZXggNDY3NjJiYS4uNDNlMjVkOCAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE3LDYgKzE3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNhc2NhZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKQEAgLTI4LDYgKzI5LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXB1YmxpYyBPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTM5LDM4ICs0MSwxMSBAQAogCQlzdXBlci5zZXRVcCgpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTWFueVRvT25lQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hbnlUb09uZSIsIAotCQkJIkNsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsiICsKLQkJCSJDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OyIgKwotCQkJIkZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7IiArCi0JCQkiYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgCi0JCQkiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJImJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsiICsKLQkJCSJib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJImJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJTdHJpbmcgdGFibGUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKKwkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU1hbnlUb09uZUFubm90YXRpb24oKTsKLQkJY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTI5LDEwICsxMDQsMTAgQEAKIAl9CQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9PbmVNYXBwaW5nIik7CiAJCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIG1hbnlUb09uZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKKwkJWG1sTWFueVRvT25lIG1hbnlUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZU1hcHBpbmciLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygibWFueVRvT25lTWFwcGluZyIsIG1hbnlUb09uZS5nZXROYW1lKCkpOwpAQCAtMTQ5LDEwICsxMjQsMTAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKIAkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOworCQlYbWxNYW55VG9PbmUgbWFueVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKIAkJCiAJCWFzc2VydEVxdWFscygibWFueVRvT25lTWFwcGluZyIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVNYXBwaW5nIiwgbWFueVRvT25lLmdldE5hbWUoKSk7CkBAIC0xNjksMTAgKzE0NCwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9PbmVNYXBwaW5nIik7CiAJCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIG1hbnlUb09uZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKKwkJWG1sTWFueVRvT25lIG1hbnlUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7CkBAIC0xODksMTAgKzE2NCwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9PbmVNYXBwaW5nIik7CiAJCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIG1hbnlUb09uZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKKwkJWG1sTWFueVRvT25lIG1hbnlUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwogCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7CkBAIC0yMDksMTAgKzE4NCwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKIAkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb09uZSBtYW55VG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CiAJCWFzc2VydE51bGwobWFueVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7CkBAIC0yMzMsMTAgKzIwOCwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKIAkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb09uZSBtYW55VG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CiAJCWFzc2VydE51bGwobWFueVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7CkBAIC0yNTcsMTAgKzIzMiwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKIAkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb09uZSBtYW55VG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCWFzc2VydE51bGwobWFueVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7CkBAIC0yODEsMTAgKzI1NiwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKIAkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb09uZSBtYW55VG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCWFzc2VydE51bGwobWFueVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7CkBAIC0zMDUsODAgKzI4MCw4MyBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvT25lTWFwcGluZyIpOwogCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSBtYW55VG9PbmVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKKwkJT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBzdHJhdGVneSA9IG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlYbWxNYW55VG9PbmUgbWFueVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwogCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtTWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBzdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQkJCQogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7CiAJCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gb3JtTWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CiAJCQogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKIAkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBvcm1NYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7CisJCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBzdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwogCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCiAJCWFzc2VydEVxdWFscygiQkFSIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7CiAJCQotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1NYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMiwgam9pbkNvbHVtbnMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4zLCBqb2luQ29sdW1ucy5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbiwgam9pbkNvbHVtbnMubmV4dCgpKTsKIAkJCi0JCWpvaW5Db2x1bW5zID0gb3JtTWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9PbmVNYXBwaW5nIik7CiAJCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIG1hbnlUb09uZVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOworCQlPcm1Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCVhtbE1hbnlUb09uZSBtYW55VG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CiAKLQkJb3JtTWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1NYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybU1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCiAJCWFzc2VydEVxdWFscygzLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7CiAJCQotCQlvcm1NYW55VG9PbmVNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCXN0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWFzc2VydEVxdWFscygyLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwogCi0JCW9ybU1hbnlUb09uZU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJc3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwogCQkKLQkJb3JtTWFueVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlzdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlhc3NlcnRFcXVhbHMoMCwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKIAkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CisJCU9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgc3RyYXRlZ3kgPSBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJWG1sTWFueVRvT25lIG1hbnlUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKIAotCQlvcm1NYW55VG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybU1hbnlUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtTWFueVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOworCQlzdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlzdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlzdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKDMsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKIAkJCiAJCQotCQlvcm1NYW55VG9PbmVNYXBwaW5nLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1NYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCXN0cmF0ZWd5Lm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOworCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBzdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwpAQCAtMzg4LDggKzM2Niw4IEBACiAJCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKIAogCi0JCW9ybU1hbnlUb09uZU1hcHBpbmcubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtTWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlzdHJhdGVneS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwLCAxKTsKKwkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwpAQCAtNDA0LDEzICszODIsMTQgQEAKIAkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb09uZU1hcHBpbmcoKTsKIAkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKIAotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CiAJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZm9vIik7CiAJCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CiAJCQogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCU9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgc3RyYXRlZ3kgPSBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKIAkJCiAJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwogCkBAIC00MTgsMTEgKzM5NywxMSBAQAogCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0T3B0aW9uYWwoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1NYW55VG9PbmVNYXBwaW5nLmlzT3B0aW9uYWwoKSk7CiAJCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7CiAKIAkJCi0JCWFzc2VydEZhbHNlKG9ybU1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRGYWxzZShzdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7CiAJCS8vVE9ETyBkZWZhdWx0IGpvaW5Db2x1bW5zCiAJCS8vYXNzZXJ0VHJ1ZShvcm1NYW55VG9PbmVNYXBwaW5nLmRlZmF1bHRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7CiAJCkBAIC00MzksOCArNDE4LDggQEAKIAkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb09uZU1hcHBpbmcoKTsKIAkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKIAotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CiAJCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCQpAQCAtNDUwLDcgKzQyOSw3IEBACiAJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwogCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKIAotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1NYW55VG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKIAkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFRF9DT0xVTU4iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKQEAgLTQ3Miw4ICs0NTEsOCBAQAogCQljcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpOwogCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwogCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKIAkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKIAkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKQEAgLTQ4Niw3ICs0NjUsNyBAQAogCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQogCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRPcHRpb25hbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybU1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0T3B0aW9uYWwoKSk7CiAJCS8vVE9ETyBobW0sIGlzIHRoaXMgY29ycmVjdD8KIAkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7CiAJCQpAQCAtNTE0LDggKzQ5Myw4IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9PbmVNYXBwaW5nKCk7CiAJCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7CiAKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwogCiAJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwogCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwpAQCAtNTI4LDEwICs1MDcsMTAgQEAKIAkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwogCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwogCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldE9wdGlvbmFsKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtTWFueVRvT25lTWFwcGluZy5pc09wdGlvbmFsKCkpOwogCQlhc3NlcnRFcXVhbHMoInRlc3QuQWRkcmVzcyIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKIAkJCi0JCWFzc2VydEZhbHNlKG9ybU1hbnlUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRGYWxzZShvcm1NYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLmhhc05leHQoKSk7CiAJCQogCQkvL1RPRE8gZGVmYXVsdCBqb2luIGNvbHVtbnMgZm9yIHNwZWNpZmllZCB4bWxNYW55VG9PbmUgbWFwcGluZwogLy8JCVhtbEpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybU1hbnlUb09uZU1hcHBpbmcuZGVmYXVsdEpvaW5Db2x1bW5zKCkubmV4dCgpOwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKaW5kZXggMTc2YWEwYy4uYmEyMTQwNSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCkBAIC0xLDEzICsxLDEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwpAQCAtMjYsNiArMjUsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAJcHVibGljIE9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtMzgsMTQgKzM4LDE0IEBACiAJCXN1cGVyLnNldFVwKCk7CiAJCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwogCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKKwkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENsYXNzTmFtZSgpKTsKIAkJCkBAIC02MSw5ICs2MSw5IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENsYXNzTmFtZSgpKTsKIAkJCkBAIC04MCwzOCArODAsMzYgQEAKIAkvL1RPRE8gYWRkIHRlc3RzIGZvciBzZXR0aW5nIHRoZSBjbGFzc05hbWUgd2hlbiB0aGUgcGFja2FnZSBpcyBzZXQgb24gZW50aXR5LW1hcHBpbmdzCiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwogCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7CiAJCQogCQkvL3NldCBhY2Nlc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCiAJCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CiAJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldEFjY2VzcygpKTsKIAkKIAkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCiAJCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwogCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBvcm1NYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKIAkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwogCQkKIAkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtTWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7CiAJCQogCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOworCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKIAkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwogCX0KIAkvL1RPRE8gdGVzdCBkZWZhdWx0IGFjY2VzcyBmcm9tCkBAIC0xMjEsMjEgKzExOSwyMSBAQAogCQkvL3dpdGggeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgc2V0CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtTWFwcGVkU3VwZXJjbGFzcyBvcm1NYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwogCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJCiAJCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0TWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydFRydWUobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CisJCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5zZXRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCiAJCS8vc2V0IGFjY2VzcyB0byBmYWxzZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOworCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0TWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQkKIAkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CiAJCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwpAQCAtMTQzLDIwICsxNDEsMjAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtTWFwcGVkU3VwZXJjbGFzcyBvcm1NYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJCiAJCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCiAJCW9ybU1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRUcnVlKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJCiAJCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCiAJCW9ybU1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2Uob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQkKIAkJb3JtTWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwogCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKQEAgLTE2NCw0MiArMTYyLDQyIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CiAJCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0RmFsc2Uob3JtTWFwcGVkU3VwZXJjbGFzcy5pc0RlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQkKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwogCQlhc3NlcnRUcnVlKG9ybU1hcHBlZFN1cGVyY2xhc3MuaXNEZWZhdWx0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CiAJCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnRGYWxzZShvcm1NYXBwZWRTdXBlcmNsYXNzLmlzRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKIAkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnRGYWxzZShvcm1NYXBwZWRTdXBlcmNsYXNzLmlzTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKIAkJYXNzZXJ0VHJ1ZShvcm1NYXBwZWRTdXBlcmNsYXNzLmlzTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCQotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CiAJCWFzc2VydEZhbHNlKG9ybU1hcHBlZFN1cGVyY2xhc3MuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKQEAgLTIwNywxNCArMjA1LDE0IEBACiAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TWFrZU1hcHBlZFN1cGVyY2xhc3NFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CisJCW1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CiAJCW1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwogCQogCQltYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbnRpdHkuZ2V0Q2xhc3NOYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBlbnRpdHkuZ2V0QWNjZXNzKCkpOwpAQCAtMjI0LDIwICsyMjIsMjAgQEAKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKIAl9CiAJCQogCS8vdGVzdCB3aXRoIDIgTWFwcGVkU3VwZXJjbGFzc2VzLCBtYWtlIHRoZSBmaXJzdCBvbmUgYW4gRW50aXR5IHNvIGl0IGhhcyB0byBtb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TWFrZU1hcHBlZFN1cGVyY2xhc3NFbnRpdHkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7CiAJCU9ybU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKKwkJbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKIAkJbWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CiAJCiAJCW1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVudGl0eS5nZXRDbGFzc05hbWUoKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVudGl0eS5nZXRBY2Nlc3MoKSk7CkBAIC0yNDcsMjIgKzI0NSwyMiBAQAogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbnRpdHkuZ2V0Q2xhc3NfKCkpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBwZXJzaXN0ZW50VHlwZXMgPSBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpOworCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IHBlcnNpc3RlbnRUeXBlcyA9IGdldEVudGl0eU1hcHBpbmdzKCkucGVyc2lzdGVudFR5cGVzKCk7CiAJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50VHlwZXMubmV4dCgpLmdldE1hcHBpbmdLZXkoKSk7CiAJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudFR5cGVzLm5leHQoKS5nZXRNYXBwaW5nS2V5KCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TWFrZU1hcHBlZFN1cGVyY2xhc3NFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQltYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwogCQltYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKIAkKIAkJbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKIAkJCi0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKKwkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbWJlZGRhYmxlLmdldENsYXNzTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW1iZWRkYWJsZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVtYmVkZGFibGUuZ2V0QWNjZXNzKCkpOwpAQCAtMjcwLDE5ICsyNjgsMTkgQEAKIAkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW1iZWRkYWJsZS5nZXRDbGFzc18oKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKIAl9CiAJLy90ZXN0IHdpdGggMiBNYXBwZWRTdXBlcmNsYXNzZXMsIG1ha2UgdGhlIGZpcnN0IG9uZSBhbiBFbWJlZGRhYmxlIHNvIGl0IGhhcyB0byBtb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TWFrZU1hcHBlZFN1cGVyY2xhc3NFbWJlZGRhYmxlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOwogCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CisJCW1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CiAJCW1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwogCQogCQltYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwogCQkKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOworCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwogCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVtYmVkZGFibGUuZ2V0Q2xhc3NOYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbWJlZGRhYmxlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7CiAJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW1iZWRkYWJsZS5nZXRBY2Nlc3MoKSk7CkBAIC0yOTAsMTcgKzI4OCwxNyBAQAogCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwogCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBwZXJzaXN0ZW50VHlwZXMgPSBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpOworCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IHBlcnNpc3RlbnRUeXBlcyA9IGdldEVudGl0eU1hcHBpbmdzKCkucGVyc2lzdGVudFR5cGVzKCk7CiAJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50VHlwZXMubmV4dCgpLmdldE1hcHBpbmdLZXkoKSk7CiAJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRUeXBlcy5uZXh0KCkuZ2V0TWFwcGluZ0tleSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUlkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtTWFwcGVkU3VwZXJjbGFzcyBvcm1NYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAogCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzcygpKTsKIAkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0SWRDbGFzcygpKTsKQEAgLTMyOSw5ICszMjcsOSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5SWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsJCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwogCiAJCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRJZENsYXNzKCkpOwogCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRJZENsYXNzKCkpOwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1OYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTmFtZWROYXRpdmVRdWVyeVRlc3RzLmphdmEKaW5kZXggODRiNjgwMC4uODliNGU0YyAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1OYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU5hbWVkTmF0aXZlUXVlcnlUZXN0cy5qYXZhCkBAIC0xLDEzICsxLDEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwpAQCAtMjMsNiArMjIsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE9ybU5hbWVkTmF0aXZlUXVlcnlUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAJcHVibGljIE9ybU5hbWVkTmF0aXZlUXVlcnlUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtMzUsMTYgKzM1LDE2IEBACiAJCXN1cGVyLnNldFVwKCk7CiAJCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwogCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKKwkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKIAkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKKwkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwogCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwpAQCAtNjEsMTEgKzYxLDExIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7CisJCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7CiAJCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7CisJCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKQEAgLTgyLDExICs4MiwxMSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKIAkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKKwkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKIAkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7CkBAIC0xMDMsMTEgKzEwMywxMSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKIAkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKKwkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKIAkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7CkBAIC0xMjQsMTEgKzEyNCwxMSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOworCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwogCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOworCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwogCiAJCU9ybVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMCk7CiAJCXF1ZXJ5SGludC5zZXROYW1lKCJGT08iKTsKQEAgLTE2MCwxMSArMTYwLDExIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7CisJCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7CiAJCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7CisJCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7CiAKIAkJb3JtTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkZPTyIpOwogCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMSkuc2V0TmFtZSgiQkFSIik7CkBAIC0xODYsMTEgKzE4NiwxMSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKKwkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKIAkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKKwkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKIAogCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7CiAJCW9ybU5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgxKS5zZXROYW1lKCJCQVIiKTsKQEAgLTIyMiwxMSArMjIyLDExIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOworCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwogCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOworCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwogCiAJCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxRdWVyeUhpbnQoKSk7CiAJCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxRdWVyeUhpbnQoKSk7CkBAIC0yNzMsMTEgKzI3MywxMSBAQAogCQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZXN1bHRTZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7CisJCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7CiAJCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7CisJCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnRFcXVhbHMobnVsbCwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFJlc3VsdFNldE1hcHBpbmcoKSk7CiAJCWFzc2VydEVxdWFscyhudWxsLCBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7CkBAIC0yOTQsMTEgKzI5NCwxMSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVzdWx0U2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOworCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwogCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOworCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0RXF1YWxzKG51bGwsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwogCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwpAQCAtMzE1LDExICszMTUsMTEgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlc3VsdENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7CisJCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7CiAJCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7CisJCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnRFcXVhbHMobnVsbCwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFJlc3VsdENsYXNzKCkpOwogCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKQEAgLTMzNiwxMSArMzM2LDExIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOworCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwogCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOworCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0RXF1YWxzKG51bGwsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRDbGFzcygpKTsKIAkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU5hbWVkUXVlcnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1OYW1lZFF1ZXJ5VGVzdHMuamF2YQppbmRleCA2ODI1OTM2Li44ZTA2YjU5IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU5hbWVkUXVlcnlUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTmFtZWRRdWVyeVRlc3RzLmphdmEKQEAgLTEsMTMgKzEsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CkBAIC0yMyw2ICsyMiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgT3JtTmFtZWRRdWVyeVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwdWJsaWMgT3JtTmFtZWRRdWVyeVRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0zNSwxNiArMzUsMTYgQEAKIAkJc3VwZXIuc2V0VXAoKTsKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CiAJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDApOworCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwogCQkKLQkJWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOworCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0TnVsbChvcm1OYW1lZFF1ZXJ5LmdldE5hbWUoKSk7CiAJCWFzc2VydE51bGwobmFtZWRRdWVyeVJlc291cmNlLmdldE5hbWUoKSk7CkBAIC02MSwxMSArNjEsMTEgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgwKTsKKwkJT3JtTmFtZWRRdWVyeSBvcm1OYW1lZFF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKIAkJCi0JCVhtbE5hbWVkUXVlcnkgbmFtZWRRdWVyeVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKKwkJWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtTmFtZWRRdWVyeS5nZXROYW1lKCkpOwogCQlhc3NlcnROdWxsKG5hbWVkUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwpAQCAtODIsMTEgKzgyLDExIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDApOworCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwogCQkKLQkJWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOworCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0TnVsbChvcm1OYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwogCQlhc3NlcnROdWxsKG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpKTsKQEAgLTEwMywxMSArMTAzLDExIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDApOworCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwogCQkKLQkJWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOworCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0TnVsbChvcm1OYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwogCQlhc3NlcnROdWxsKG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpKTsKQEAgLTEyNCwxMSArMTI0LDExIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGRIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWRRdWVyeSBvcm1OYW1lZFF1ZXJ5ID0gb3JtRW50aXR5LmFkZE5hbWVkUXVlcnkoMCk7CisJCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7CiAJCQotCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCk7CisJCVhtbE5hbWVkUXVlcnkgbmFtZWRRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCk7CiAKIAkJT3JtUXVlcnlIaW50IHF1ZXJ5SGludCA9IG9ybU5hbWVkUXVlcnkuYWRkSGludCgwKTsKIAkJcXVlcnlIaW50LnNldE5hbWUoIkZPTyIpOwpAQCAtMTYwLDExICsxNjAsMTEgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgwKTsKKwkJT3JtTmFtZWRRdWVyeSBvcm1OYW1lZFF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKIAkJCi0JCVhtbE5hbWVkUXVlcnkgbmFtZWRRdWVyeVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKKwkJWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKIAogCQlvcm1OYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7CiAJCW9ybU5hbWVkUXVlcnkuYWRkSGludCgxKS5zZXROYW1lKCJCQVIiKTsKQEAgLTE4NiwxMSArMTg2LDExIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IG9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDApOworCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwogCQkKLQkJWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOworCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwogCiAJCW9ybU5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKIAkJb3JtTmFtZWRRdWVyeS5hZGRIaW50KDEpLnNldE5hbWUoIkJBUiIpOwpAQCAtMjIyLDExICsyMjIsMTEgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUhpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWRRdWVyeSBvcm1OYW1lZFF1ZXJ5ID0gb3JtRW50aXR5LmFkZE5hbWVkUXVlcnkoMCk7CisJCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7CiAJCQotCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCk7CisJCVhtbE5hbWVkUXVlcnkgbmFtZWRRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCk7CiAKIAkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFF1ZXJ5SGludCgpKTsKIAkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFF1ZXJ5SGludCgpKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmluZGV4IDIyMjI1ZGYuLmRhYmE0NDAgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpAQCAtMSwxNyArMSwxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwogCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKQEAgLTIzLDM4ICsyNSwxMjEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXB1YmxpYyBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKIAkJc3VwZXIobmFtZSk7CiAJfQogCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuSUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0JCiAJCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc3VwZXIuc2V0VXAoKTsKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CiAJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKIAkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOworCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKIAkJCiAJCWFzc2VydEVxdWFscygib25lVG9NYW55TWFwcGluZyIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJvbmVUb01hbnlNYXBwaW5nIiwgb25lVG9NYW55LmdldE5hbWUoKSk7CkBAIC03MSwxMCArMTU2LDEwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7CiAJCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKKwkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueU1hcHBpbmciLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygib25lVG9NYW55TWFwcGluZyIsIG9uZVRvTWFueS5nZXROYW1lKCkpOwpAQCAtOTEsMTAgKzE3NiwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7CiAJCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKKwkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwogCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7CkBAIC0xMTEsMTAgKzE5NiwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7CiAJCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKKwkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwogCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7CkBAIC0xMzEsMTAgKzIxNiwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKIAkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvTWFueSBvbmVUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CiAJCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7CkBAIC0xNTUsMTAgKzI0MCwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKIAkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvTWFueSBvbmVUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CiAJCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7CkBAIC0xNzksMTYzICsyNjQsMTY1IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwogCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7CisJCU9ybU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpOworCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKIAkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKKwkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7CiAJCQkJCiAJCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQlvbmVUb01hbnkuc2V0TWFwcGVkQnkoIm5ld01hcHBlZEJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7CiAJCiAJCS8vc2V0bWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKIAkJb25lVG9NYW55LnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7CisJCWFzc2VydE51bGwoc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKIAkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOworCQlPcm1NYXBwZWRCeUpvaW5pbmdTdHJhdGVneSBzdHJhdGVneSA9IG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKTsKKwkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7CiAJCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7CisJCWFzc2VydE51bGwoc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwogCQkJCQogCQkvL3NldCBtYXBwZWRCeSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibmV3TWFwcGVkQnkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7CisJCXN0cmF0ZWd5LnNldE1hcHBlZEJ5QXR0cmlidXRlKCJuZXdNYXBwZWRCeSIpOworCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7CiAJCiAJCS8vc2V0IG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlzdHJhdGVneS5zZXRNYXBwZWRCeUF0dHJpYnV0ZShudWxsKTsKKwkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7CiAJfQogCQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKIAkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOworCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKIAkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7CisJCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7CiAJCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleSgpKTsKIAkJCiAJCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb01hbnkuc2V0TWFwS2V5KE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1hcEtleUltcGwoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7CisJCW9uZVRvTWFueS5zZXRNYXBLZXkoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWFwS2V5KCkpOworCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwogCQlhc3NlcnROb3ROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKSk7CiAJCQkJCiAJCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQlvbmVUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOworCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7CiAJCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKIAkJCiAJCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCiAJCW9uZVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOworCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwogCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwogCQkKIAkJb25lVG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUoIm15TWFwS2V5Iik7CiAJCW9uZVRvTWFueS5zZXRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7CisJCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7CiAJCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwogCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwogCQkJCQkKIAkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRNYXBLZXkoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKKwkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm15TWFwS2V5Iik7CisJCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwogCQogCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKKwkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7CisJCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7CiAJCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT3JkZXJCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwogCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7CisJCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwogCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRPcmRlckJ5KCkpOwogCQkJCQogCQkvL3NldCBvcmRlckJ5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQlvbmVUb01hbnkuc2V0T3JkZXJCeSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7CisJCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5Iiwgb25lVG9NYW55LmdldE9yZGVyQnkoKSk7CiAJCiAJCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKIAkJb25lVG9NYW55LnNldE9yZGVyQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOworCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0T3JkZXJCeSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeU9yZGVyQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKIAkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOworCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKIAkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOworCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0T3JkZXJCeSgpKTsKIAkJCQkKIAkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7CisJCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgibmV3T3JkZXJCeSIpOworCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7CiAJCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9uZVRvTWFueS5nZXRPcmRlckJ5KCkpOwogCQogCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7CisJCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeShudWxsKTsKKwkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7CiAJCWFzc2VydE51bGwob25lVG9NYW55LmdldE9yZGVyQnkoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RJc05vT3JkZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKIAkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQkKIAkJYXNzZXJ0VHJ1ZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzTm9PcmRlcmluZygpKTsKIAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImZvbyIpOworCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkoImZvbyIpOwogCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzTm9PcmRlcmluZygpKTsKIAkJCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeShudWxsKTsKKwkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KG51bGwpOwogCQlhc3NlcnRUcnVlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNOb09yZGVyaW5nKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0Tm9PcmRlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwogCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnRUcnVlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNOb09yZGVyaW5nKCkpOwogCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiZm9vIik7CisJCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiZm9vIik7CiAJCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNOb09yZGVyaW5nKCkpOwogCQkKIAkJb3JtT25lVG9NYW55TWFwcGluZy5zZXROb09yZGVyaW5nKHRydWUpOwogCQlhc3NlcnRUcnVlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJCeSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7CiAJfQogLy9UT0RPCiAvLwlwdWJsaWMgYm9vbGVhbiBpc09yZGVyQnlQaygpIHsKQEAgLTM0NywzNyArNDM0LDMwIEBACiAvLwl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0SXNDdXN0b21PcmRlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwogCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCQogCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tT3JkZXJpbmcoKSk7CiAKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJmb28iKTsKKwkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJmb28iKTsKIAkJYXNzZXJ0VHJ1ZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tT3JkZXJpbmcoKSk7CiAJCQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkobnVsbCk7CisJCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeShudWxsKTsKIAkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU9yZGVyaW5nKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueSIpOwogCQkKIAkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBLZXkoIm1hcEtleSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE1hcHBlZEJ5KCJtYXBwZWRCeSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7CisJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKKwkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOworCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7CiAJCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKIAkJCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwpAQCAtMzg4LDIxICs0NjgsMjAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueU1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueSIpOwogCQkKIAkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBLZXkoIm1hcEtleSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE1hcHBlZEJ5KCJtYXBwZWRCeSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7CisJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKKwkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7CisJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7CiAJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7CisJCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwogCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJpbnZlcnNlTmFtZSIpOwogCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiaW52ZXJzZVJlZmVyZW5jZU5hbWUiKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQpAQCAtNDE1LDIzICs0OTQsMTYgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueU1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7CiAJCQogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7CiAJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE1hcEtleSgibWFwS2V5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJpbnZlcnNlTmFtZSIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiaW52ZXJzZVJlZmVyZW5jZU5hbWUiKTsKKwkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJjdXN0b21PcmRlciIpOworCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibWFwS2V5Iik7CisJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQogCQkKIAkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwpAQCAtNDQyLDIxICs1MTQsMjAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueU1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKIAkJCiAJCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJjdXN0b21PcmRlciIpOworCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibWFwS2V5Iik7CisJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOworCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKIAkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKIAkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7CiAJCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKQEAgLTQ2OSwyMyArNTQwLDE2IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RPbmVUb01hbnlNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKIAkJCiAJCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOworCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7CisJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKKwkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJtYXBwZWRCeSIpOwogCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCiAJCQogCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKQEAgLTQ5NiwyOCArNTYwLDIxIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RPbmVUb01hbnlNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7CiAJCQogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7CiAJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE1hcEtleSgibWFwS2V5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7CisJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKKwkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOworCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7CiAJCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKIAkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7CiAJCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7CiAJCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7CiAJCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOwogCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCiAJCQogCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwpAQCAtNTI3LDcgKzU4NCw3IEBACiAJCWFzc2VydEVxdWFscygib25lVG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJUYXJnZXRFbnRpdHkiLCAoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYXBwZWRCeSIsICgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0TWFwcGVkQnkoKSk7CisJCWFzc2VydEVxdWFscygibWFwcGVkQnkiLCAoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNBbGwoKSk7CiAJCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNNZXJnZSgpKTsKIAkJYXNzZXJ0VHJ1ZSgoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7CkBAIC01MzYsMjYgKzU5MywyNSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7CiAJCQogCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7CiAJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE1hcEtleSgibWFwS2V5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7CisJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKKwkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwogCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7CiAJCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwogCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwogCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwogCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOworCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKIAkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKIAkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7CiAJCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKQEAgLTU2NywxMyArNjIzLDEyIEBACiAJCWFzc2VydEVxdWFscygib25lVG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnRFcXVhbHMoIlRhcmdldEVudGl0eSIsICgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibWFwcGVkQnkiLCAoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0TWFwcGVkQnkoKSk7CiAJCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKIAkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7CiAJCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7CiAJCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7CiAJCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9ICgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRKb2luVGFibGUoKTsKKwkJSm9pblRhYmxlIGpvaW5UYWJsZSA9ICgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKIAkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgam9pblRhYmxlLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygibmFtZSIsIGpvaW5UYWJsZS5qb2luQ29sdW1ucygpLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoInJlZmVyZW5jZU5hbWUiLCBqb2luVGFibGUuam9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CkBAIC01ODIsMjggKzYzNywyMSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKIAkJCiAJCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKKwkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJjdXN0b21PcmRlciIpOworCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibWFwS2V5Iik7CisJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKIAkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwogCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKIAkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKIAkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKIAkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7CiAJCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKIAkJCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwpAQCAtNjIxLDI4ICs2NjksMjEgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueU1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKIAkJCiAJCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKKwkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRPcmRlckJ5KCJjdXN0b21PcmRlciIpOworCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibWFwS2V5Iik7CisJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKIAkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwogCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKIAkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKIAkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKIAkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7CiAJCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKIAkJCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwpAQCAtNjUyLDQgKzY5Myw0NiBAQAogCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7CiAvL1RPRE8JYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChJQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CiAJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7CisJCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7CisJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7CisKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisKKwkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAorCQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisJCQorCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7CisJCWF0dHJpYnV0ZU5hbWVzID0gCisJCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCQkKKwkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7CisJCWF0dHJpYnV0ZU5hbWVzID0gCisJCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKworCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7CisJCWFzc2VydE51bGwoc3RhdGVGb29NYXBwaW5nKTsKKwl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhCmluZGV4IGNlOWRhNzQuLjExODI4YTEgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTQsNiArMTQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5DYXNjYWRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7CkBAIC0yMywxNSArMjQsMTkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwZWRCeUpvaW5pbmdTdHJhdGVneTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwpAQCAtNDAsNiArNDUsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE9ybU9uZVRvT25lTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwdWJsaWMgT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTUxLDM5ICs1NywxMSBAQAogCQlzdXBlci5zZXRVcCgpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlT25lVG9PbmVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9PbmUiLCAKLQkJCSJDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7IiArCi0JCQkiQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsiICsKLQkJCSJGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOyIgKwotCQkJImJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7IiArCQkKLQkJCSJTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJIlN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7IiArCi0JCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCBcIlwiOyIpOwkJCisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZU9uZVRvT25lQW5ub3RhdGlvbigpOwotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMzEsNyArMTA5LDcgQEAKIAkJCQlzYi5hcHBlbmQoQ1IpOwogCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKIAkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwogCQkJCXNiLmFwcGVuZChDUik7CiAJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7CiAJCQkJc2IuYXBwZW5kKENSKTsKQEAgLTE0MSwxMSArMTE5LDU2IEBACiAJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7CiAJfQogCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7CQkJCQorCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZU1hcHBpbmciLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZU1hcHBpbmciLCBvbmVUb09uZS5nZXROYW1lKCkpOwpAQCAtMTYyLDEwICsxODUsMTAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7CiAJCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lTWFwcGluZyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lTWFwcGluZyIsIG9uZVRvT25lLmdldE5hbWUoKSk7CkBAIC0xODIsMTAgKzIwNSwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwogCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKQEAgLTIwMiwxMCArMjI1LDEwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7CiAJCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7CiAJCWFzc2VydE51bGwob25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwpAQCAtMjIyLDEwICsyNDUsMTAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwogCQlhc3NlcnROdWxsKG9uZVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7CkBAIC0yNDYsMTAgKzI2OSwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7CiAJCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOworCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CiAJCWFzc2VydE51bGwob25lVG9PbmVSZXNvdXJjZS5nZXRGZXRjaCgpKTsKQEAgLTI3MCw1MSArMjkzLDUzIEBACiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7CisJCWFzc2VydE51bGwoc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydE51bGwob25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7CiAJCQkJCiAJCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQlvbmVUb09uZS5zZXRNYXBwZWRCeSgibmV3TWFwcGVkQnkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwogCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgb25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7CiAJCiAJCS8vc2V0IG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCiAJCW9uZVRvT25lLnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKKwkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCU1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7CisJCWFzc2VydE51bGwoc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydE51bGwob25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7CiAJCQkJCiAJCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0TWFwcGVkQnkoIm5ld01hcHBlZEJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7CisJCXN0cmF0ZWd5LnNldE1hcHBlZEJ5QXR0cmlidXRlKCJuZXdNYXBwZWRCeSIpOworCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKIAkKIAkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlzdHJhdGVneS5zZXRNYXBwZWRCeUF0dHJpYnV0ZShudWxsKTsKKwkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKIAkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKIAl9CiAJCiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwogCQlhc3NlcnROdWxsKG9uZVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7CkBAIC0zMzUsMTAgKzM2MCwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7CiAJCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOworCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCWFzc2VydE51bGwob25lVG9PbmVSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKQEAgLTM1OSw4MCArMzg0LDgzIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBzdHJhdGVneSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CiAJCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1PbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKIAkJCQkKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7CiAJCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gb3JtT25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBzdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKIAkJCiAJCWFzc2VydEVxdWFscygiQkFSIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKIAkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBvcm1PbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKKwkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IHN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7CiAJCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybU9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBzdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjIsIGpvaW5Db2x1bW5zLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMywgam9pbkNvbHVtbnMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4sIGpvaW5Db2x1bW5zLm5leHQoKSk7CiAJCQotCQlqb2luQ29sdW1ucyA9IG9ybU9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJT3JtSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBzdHJhdGVneSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CiAKLQkJb3JtT25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybU9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1PbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCiAJCWFzc2VydEVxdWFscygzLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKIAkJCi0JCW9ybU9uZVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlzdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlhc3NlcnRFcXVhbHMoMiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKIAotCQlvcm1PbmVUb09uZU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJc3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKIAkJCi0JCW9ybU9uZVRvT25lTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlzdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlhc3NlcnRFcXVhbHMoMCwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKIAkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCU9ybUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgc3RyYXRlZ3kgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCi0JCW9ybU9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1PbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtT25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CisJCXN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCXN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CisJCXN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CiAJCQogCQlhc3NlcnRFcXVhbHMoMywgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7CiAJCQogCQkKLQkJb3JtT25lVG9PbmVNYXBwaW5nLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1PbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJc3RyYXRlZ3kubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7CisJCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CkBAIC00NDIsOCArNDcwLDggQEAKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7CiAKIAotCQlvcm1PbmVUb09uZU1hcHBpbmcubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtT25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCXN0cmF0ZWd5Lm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOworCQlqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CkBAIC00NTcsOCArNDg1LDggQEAKIAkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwogCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwogCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKIAkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImZvbyIpOwogCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwogCQkKQEAgLTQ3MSwxMSArNDk5LDExIEBACiAJCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwogCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtT25lVG9PbmVNYXBwaW5nLmdldE9wdGlvbmFsKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtT25lVG9PbmVNYXBwaW5nLmlzT3B0aW9uYWwoKSk7CiAJCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKIAogCQkKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmpvaW5Db2x1bW5zU2l6ZSgpID4gMCk7CiAJCS8vVE9ETyBkZWZhdWx0IGpvaW5Db2x1bW5zCiAJCS8vYXNzZXJ0VHJ1ZShvcm1PbmVUb09uZU1hcHBpbmcuZGVmYXVsdEpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKIAkKQEAgLTQ5Myw4ICs1MjEsOCBAQAogCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7CiAJCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7CiAKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwogCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQkKQEAgLTUwMyw5ICs1MzEsMTEgQEAKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7CiAJCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS4KKwkJCWdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAKLQkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtT25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSAKKwkJCW9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiTVlfQ09MVU1OIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRURfQ09MVU1OIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7CkBAIC01MjcsOCArNTU3LDggQEAKIAkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwogCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwogCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKIAkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKIAkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKQEAgLTU0MSw5ICs1NzEsOSBAQAogCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQogCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0T3B0aW9uYWwoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1PbmVUb09uZU1hcHBpbmcuaXNPcHRpb25hbCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKIAogCQkvL1RPRE8gZGVmYXVsdCBqb2luIGNvbHVtbnMgaW4geG1sIG9uZS10by1vbmUKIC8vCQlYbWxKb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1PbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCk7CkBAIC01NjksOCArNTk5LDggQEAKIAkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwogCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwogCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKIAogCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwogCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwpAQCAtNTgyLDEzICs2MTIsMTMgQEAKIAkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CiAJCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwogCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOworCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwogCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRPcHRpb25hbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybU9uZVRvT25lTWFwcGluZy5pc09wdGlvbmFsKCkpOwogCQkvL1RPRE8gZGVmYXVsdCB0YXJnZXQgZW50aXR5IGluIHhtbAogCQkvL2Fzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7CiAJCQotCQlhc3NlcnRGYWxzZShvcm1PbmVUb09uZU1hcHBpbmcuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRUcnVlKG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkuam9pbkNvbHVtbnNTaXplKCkgPiAwKTsKIAkJCiAJCS8vVE9ETyBkZWZhdWx0IGpvaW4gY29sdW1ucyBmb3Igc3BlY2lmaWVkIHhtbE9uZVRvT25lIG1hcHBpbmcKIC8vCQlYbWxKb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1PbmVUb09uZU1hcHBpbmcuZGVmYXVsdEpvaW5Db2x1bW5zKCkubmV4dCgpOwpAQCAtNjIwLDIwICs2NTAsMjAgQEAKIAkKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmVNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwogCQkKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKKwkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwogCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwogCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKIAkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CQpAQCAtNjQ2LDIwICs2NzYsMjAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE9uZVRvT25lTW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwogCQkKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKKwkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwogCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwogCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKIAkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CQpAQCAtNjcyLDIwICs3MDIsMjAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE9uZVRvT25lTW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7CiAKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKKwkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwogCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwogCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKIAkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CQpAQCAtNjk4LDIwICs3MjgsMjAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE9uZVRvT25lTW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKIAogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldE1hcHBlZEJ5KCJtYXBwZWRCeSIpOworCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKIAkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKIAkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwogCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7CiAJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCkBAIC03MjQsMjAgKzc1NCwyMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmVNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7CiAJCQogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldE1hcHBlZEJ5KCJtYXBwZWRCeSIpOworCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKIAkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKIAkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwogCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7CiAJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCkBAIC03NTAsMjAgKzc4MCwyMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmVNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7CiAJCQogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldE1hcHBlZEJ5KCJtYXBwZWRCeSIpOworCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKIAkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKIAkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwogCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7CiAJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCkBAIC03NzUsNyArODA1LDcgQEAKIAkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJUYXJnZXRFbnRpdHkiLCAoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hcHBlZEJ5IiwgKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldE1hcHBlZEJ5KCkpOworCQlhc3NlcnRFcXVhbHMoIm1hcHBlZEJ5IiwgKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CiAJCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKIAkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7CiAJCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7CkBAIC03ODQsMjAgKzgxNCwyMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmVNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKIAkJCiAJCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7CiAJCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0TWFwcGVkQnkoIm1hcHBlZEJ5Iik7CisJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJtYXBwZWRCeSIpOwogCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKIAkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKIAkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwogCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwogCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKQEAgLTgwOSw3ICs4MzksNyBAQAogCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CiAJCWFzc2VydEVxdWFscygiVGFyZ2V0RW50aXR5IiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hcHBlZEJ5IiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0TWFwcGVkQnkoKSk7CisJCWFzc2VydEVxdWFscygibWFwcGVkQnkiLCAoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwogCQlhc3NlcnRUcnVlKCgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKIAkJYXNzZXJ0VHJ1ZSgoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNNZXJnZSgpKTsKIAkJYXNzZXJ0VHJ1ZSgoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNQZXJzaXN0KCkpOwpAQCAtODE4LDIwICs4NDgsMjAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE9uZVRvT25lTW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7CiAJCQogCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwogCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldE1hcHBlZEJ5KCJtYXBwZWRCeSIpOworCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKIAkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKIAkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwogCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKIAkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7CiAJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKIAkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCkBAIC04NDksMjYgKzg3OSwyNiBAQAogCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7CiAJCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwogCQkKLQkJam9pbkNvbHVtbiA9ICgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlqb2luQ29sdW1uID0gKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7CQkKIAkJYXNzZXJ0RXF1YWxzKCJyZWZlcmVuY2VOYW1lIiwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsJCQogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmVNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwogCQkKIAkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKIAkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRNYXBwZWRCeSgibWFwcGVkQnkiKTsKKwkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwogCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwogCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7CiAJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKIAkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CiAJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CQpAQCAtODg2LDgwICs5MTYsODMgQEAKIAkKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7CiAJCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOworCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBzdHJhdGVneSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybU9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKKwkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwogCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQkJCQogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7CiAJCQotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IG9ybU9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKKwkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKIAkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CiAJCQogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKIAkJCi0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gb3JtT25lVG9PbmVNYXBwaW5nLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOworCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IHN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwogCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCiAJCWFzc2VydEVxdWFscygiQkFSIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7CiAJCQotCQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtT25lVG9PbmVNYXBwaW5nLnByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gc3RyYXRlZ3kucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMiwgam9pbkNvbHVtbnMubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4zLCBqb2luQ29sdW1ucy5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbiwgam9pbkNvbHVtbnMubmV4dCgpKTsKIAkJCi0JCWpvaW5Db2x1bW5zID0gb3JtT25lVG9PbmVNYXBwaW5nLnByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCQlqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LnByaW1hcnlLZXlKb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7CiAJCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOworCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBzdHJhdGVneSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwogCi0JCW9ybU9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtT25lVG9PbmVNYXBwaW5nLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1PbmVUb09uZU1hcHBpbmcuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CisJCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CiAJCQogCQlhc3NlcnRFcXVhbHMoMywgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwogCQkKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDApOworCQlzdHJhdGVneS5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKIAkJYXNzZXJ0RXF1YWxzKDIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7CiAKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDApOworCQlzdHJhdGVneS5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwogCQkKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDApOworCQlzdHJhdGVneS5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKIAkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKIAkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CiAKLQkJb3JtT25lVG9PbmVNYXBwaW5nLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1PbmVUb09uZU1hcHBpbmcuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybU9uZVRvT25lTWFwcGluZy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKIAkJCiAJCWFzc2VydEVxdWFscygzLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7CiAJCQogCQkKLQkJb3JtT25lVG9PbmVNYXBwaW5nLm1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybU9uZVRvT25lTWFwcGluZy5wcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKKwkJc3RyYXRlZ3kubW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDIsIDApOworCQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gc3RyYXRlZ3kucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CkBAIC05NjksOCArMTAwMiw4IEBACiAJCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKIAogCi0JCW9ybU9uZVRvT25lTWFwcGluZy5tb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtT25lVG9PbmVNYXBwaW5nLnByaW1hcnlLZXlKb2luQ29sdW1ucygpOworCQlzdHJhdGVneS5tb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oMCwgMSk7CisJCWpvaW5Db2x1bW5zID0gc3RyYXRlZ3kucHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CkBAIC05ODAsNCArMTAxMyw0NSBAQAogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7CiAJfQogCisJcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOworCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOworCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOworCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOworCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCisJCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKKwkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisJCQorCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKKwkJYXR0cmlidXRlTmFtZXMgPSAKKwkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKwkJCisJCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7CisJCWF0dHJpYnV0ZU5hbWVzID0gCisJCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCQkKKwkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7CisJCWFzc2VydE51bGwoc3RhdGVGb29NYXBwaW5nKTsKKwl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZGY4YWMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVOdWxsQXR0cmlidXRlTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVJZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWQiLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU9uZVRvT25lQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPbmVUb09uZSIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUlkQW5ub3RhdGlvbigpOwotCQljcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkZPT1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVPbmVUb09uZUFubm90YXRpb24oKTsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VTcGVjaWZpZWRNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL3Rha2UgYSB2aXJ0dWFsIG1hcHBpbmcgd2l0aCBhIG1hcHBpbmcgdHlwZSBhbmQgbWFrZSBpdCBzcGVjaWZpZWQKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEdlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZyk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBHZW5lcmljT3JtT25lVG9PbmVNYXBwaW5nKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBHZW5lcmljT3JtSWRNYXBwaW5nKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKS5tYWtlU3BlY2lmaWVkKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVZpcnR1YWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVZpcnR1YWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwkJCi0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVZpcnR1YWxOb1VuZGVybHlpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKS5tYWtlU3BlY2lmaWVkKCk7Ci0KLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLnNldE5hbWUoIm5vSmF2YUF0dHJpYnV0ZSIpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ1R5cGVXaGVuTWV0YWRhdGFDb21wbGV0ZTIoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjlkOWRlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBPcm1QZXJzaXN0ZW50VHlwZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0JCi0JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sVHlwZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlhc3NlcnRGYWxzZShlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLmhhc05leHQoKSk7Ci0vLwkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0vLwkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotLy8JCQotLy8JCS8vYWRkIGVtYmVkZGFibGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0vLwkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRW1iZWRkYWJsZSgpOwotLy8JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmFkZChlbWJlZGRhYmxlKTsKLS8vCQllbWJlZGRhYmxlLnNldENsYXNzTmFtZSgibW9kZWwuRm9vIik7Ci0vLwkJYXNzZXJ0VHJ1ZShlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLmhhc05leHQoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOwotLy8JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0vLwkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotLy8JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotLy8JCQotLy8JCS8vYWRkIGVudGl0eSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLS8vCQlFbnRpdHkgZW50aXR5ID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRW50aXR5KCk7Ci0vLwkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuYWRkKGVudGl0eSk7Ci0vLwkJZW50aXR5LnNldENsYXNzTmFtZSgibW9kZWwuRm9vMiIpOwotLy8JCWFzc2VydFRydWUoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMiIsIGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKSk7Ci0vLwkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotLy8JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28yIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLS8vCi0vLwkJLy9hZGQgbWFwcGVkLXN1cGVyY2xhc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0vLwkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWFwcGVkU3VwZXJjbGFzcygpOwotLy8JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5hZGQobWFwcGVkU3VwZXJjbGFzcyk7Ci0vLwkJbWFwcGVkU3VwZXJjbGFzcy5zZXRDbGFzc05hbWUoIm1vZGVsLkZvbzMiKTsKLS8vCQlhc3NlcnRUcnVlKGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzMiLCBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOwotLy8JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotLy8JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0vLwkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzMiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLS8vCX0KLS8vCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFhtbFR5cGVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzMiKTsKLQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSwgb3JtUGVyc2lzdGVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuc2l6ZSgpKTsKLQkJCi0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBvcm1QZXJzaXN0ZW50VHlwZXMgPSBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpOwotCQkvL3RoZSBzYW1lIE9ybVBlcnNpc3RlbnRUeXBlcyBzaG91bGQgc3RpbGwgYmUgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlcy5uZXh0KCksIGVudGl0eVBlcnNpc3RlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlcy5uZXh0KCksIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZXMubmV4dCgpLCBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzMiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljQXR0cmlidXRlIik7Ci0JCi0JCVhtbEVudGl0eSBlbnRpdHkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBiYXNpYy5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZEF0dHJpYnV0ZSIpOwotCQotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZCA9IGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgZW1iZWRkZWQuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInRyYW5zaWVudEF0dHJpYnV0ZSIpOwotCQotCQlYbWxUcmFuc2llbnQgdHJhbnNpZW50UmVzb3VyY2UgPSBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgdHJhbnNpZW50UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidmVyc2lvbkF0dHJpYnV0ZSIpOwotCQotCQlYbWxWZXJzaW9uIHZlcnNpb24gPSBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCB2ZXJzaW9uLmdldE5hbWUoKSk7Ci0KLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZEF0dHJpYnV0ZSIpOwotCQotCQlYbWxJZCBpZCA9IGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgaWQuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gcGVyc2lzdGVudEF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBwZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCBwZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljQXR0cmlidXRlIik7Ci0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRBdHRyaWJ1dGUiKTsKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb25BdHRyaWJ1dGUiKTsKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZEF0dHJpYnV0ZSIpOwotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnRBdHRyaWJ1dGUiKTsKLQkKLQkJWG1sRW50aXR5IGVudGl0eSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJiYXNpY0F0dHJpYnV0ZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1iZWRkZWRBdHRyaWJ1dGUiKSk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ2ZXJzaW9uQXR0cmlidXRlIikpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWRBdHRyaWJ1dGUiKSk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgidHJhbnNpZW50QXR0cmlidXRlIikpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOwotCQlYbWxFbnRpdHkgZW50aXR5ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZEF0dHJpYnV0ZSIpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0KLQkJZW50aXR5UGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWRBdHRyaWJ1dGUiKSk7CQotCQlhc3NlcnROdWxsKGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOwotCQlYbWxFbnRpdHkgZW50aXR5ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY0F0dHJpYnV0ZSIpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0KLQkJZW50aXR5UGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYmFzaWNBdHRyaWJ1dGUiKSk7CQotCQlhc3NlcnROdWxsKGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCVhtbEVudGl0eSBlbnRpdHkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidmVyc2lvbkF0dHJpYnV0ZSIpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInZlcnNpb25BdHRyaWJ1dGUiKSk7CQotCQlhc3NlcnROdWxsKGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRW1iZWRkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOwotCQlYbWxFbnRpdHkgZW50aXR5ID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZEF0dHJpYnV0ZSIpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0KLQkJZW50aXR5UGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1iZWRkZWRBdHRyaWJ1dGUiKSk7CQotCQlhc3NlcnROdWxsKGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVHJhbnNpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJWG1sRW50aXR5IGVudGl0eSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInRyYW5zaWVudEF0dHJpYnV0ZSIpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ0cmFuc2llbnRBdHRyaWJ1dGUiKSk7CQotCQlhc3NlcnROdWxsKGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCVhtbEVudGl0eSBlbnRpdHkgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJZW50aXR5LnNldEF0dHJpYnV0ZXMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0cmlidXRlcygpKTsKLQkJWG1sQmFzaWNJbXBsIGJhc2ljID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQmFzaWNJbXBsKCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuYWRkKGJhc2ljKTsKLQkJYmFzaWMuc2V0TmFtZSgiYmFzaWNBdHRyaWJ1dGUiKTsKLQkJCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCQotCQlYbWxFbWJlZGRlZEltcGwgZW1iZWRkZWQgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbWJlZGRlZEltcGwoKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5hZGQoZW1iZWRkZWQpOwotCQllbWJlZGRlZC5zZXROYW1lKCJlbWJlZGRlZEF0dHJpYnV0ZSIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQotCQlYbWxWZXJzaW9uSW1wbCB2ZXJzaW9uID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVmVyc2lvbkltcGwoKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmFkZCh2ZXJzaW9uKTsKLQkJdmVyc2lvbi5zZXROYW1lKCJ2ZXJzaW9uQXR0cmlidXRlIik7Ci0JCQotCQlhdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCVhtbElkSW1wbCBpZCA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbElkSW1wbCgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmFkZChpZCk7Ci0JCWlkLnNldE5hbWUoImlkQXR0cmlidXRlIik7Ci0JCQotCQlhdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCVhtbFRyYW5zaWVudEltcGwgdHJhbnNpZW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUcmFuc2llbnRJbXBsKCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLmFkZCh0cmFuc2llbnRSZXNvdXJjZSk7Ci0JCXRyYW5zaWVudFJlc291cmNlLnNldE5hbWUoInRyYW5zaWVudEF0dHJpYnV0ZSIpOwotCQkKLQkJYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQlYbWxNYW55VG9PbmVJbXBsIG1hbnlUb09uZVJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFueVRvT25lSW1wbCgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5hZGQobWFueVRvT25lUmVzb3VyY2UpOwotCQltYW55VG9PbmVSZXNvdXJjZS5zZXROYW1lKCJtYW55VG9PbmVBdHRyaWJ1dGUiKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJWG1sTWFueVRvTWFueUltcGwgbWFueVRvTWFueVJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFueVRvTWFueUltcGwoKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmFkZChtYW55VG9NYW55UmVzb3VyY2UpOwotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TmFtZSgibWFueVRvTWFueUF0dHJpYnV0ZSIpOwotCQkKLQkJYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnlBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQlYbWxPbmVUb01hbnlJbXBsIG9uZVRvTWFueVJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT25lVG9NYW55SW1wbCgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5hZGQob25lVG9NYW55UmVzb3VyY2UpOwotCQlvbmVUb01hbnlSZXNvdXJjZS5zZXROYW1lKCJvbmVUb01hbnlBdHRyaWJ1dGUiKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb01hbnlBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnlBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJWG1sT25lVG9PbmVJbXBsIG9uZVRvT25lUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPbmVUb09uZUltcGwoKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5hZGQob25lVG9PbmVSZXNvdXJjZSk7Ci0JCW9uZVRvT25lUmVzb3VyY2Uuc2V0TmFtZSgib25lVG9PbmVBdHRyaWJ1dGUiKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb01hbnlBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnlBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQotCQlYbWxFbWJlZGRlZElkSW1wbCBlbWJlZGRlZElkUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbWJlZGRlZElkSW1wbCgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuYWRkKGVtYmVkZGVkSWRSZXNvdXJjZSk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5zZXROYW1lKCJlbWJlZGRlZElkQXR0cmlidXRlIik7Ci0JCQotCQlhdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9NYW55QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkucmVtb3ZlKDApOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLnJlbW92ZSgwKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkucmVtb3ZlKDApOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLnJlbW92ZSgwKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLnJlbW92ZSgwKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkucmVtb3ZlKDApOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkucmVtb3ZlKDApOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5yZW1vdmUoMCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkucmVtb3ZlKDApOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShlbnRpdHlQZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChlbnRpdHkuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuamF2YQppbmRleCBiMDFmOGVlLi45MTA1NTY3IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDIyICs5LDE4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXB1YmxpYyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0zNiw2MiArMzIsMTYgQEAKIAkJc3VwZXIuc2V0VXAoKTsKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CiAJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUlkQW5ub3RhdGlvbigpOwotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKKwkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CkBAIC0xMTcsMTEgKzY3LDExIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCk7CiAKIAkJYXNzZXJ0TnVsbChvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwpAQCAtMTM5LDExICs4OSwxMSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CkBAIC0xNjksMTEgKzExOSwxMSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKTsKIAogCQlhc3NlcnROdWxsKG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwpAQCAtMjQ4LDExICsxOTgsMTEgQEAKIAkKIAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7CiAJCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CkBAIC0yNzgsMTEgKzIyOCwxMSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApOwogCiAJCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUXVlcnlIaW50VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUXVlcnlIaW50VGVzdHMuamF2YQppbmRleCAxMzIzZDM4Li5hNzQxNDVmIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVF1ZXJ5SGludFRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1RdWVyeUhpbnRUZXN0cy5qYXZhCkBAIC0xLDEzICsxLDEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwpAQCAtMjAsNiArMTksNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE9ybVF1ZXJ5SGludFRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwdWJsaWMgT3JtUXVlcnlIaW50VGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTMyLDE2ICszMiwxNiBAQAogCQlzdXBlci5zZXRVcCgpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7CisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUXVlcnlIaW50IG9ybVF1ZXJ5SGludCA9IG9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDApLmFkZEhpbnQoMCk7CisJCU9ybVF1ZXJ5SGludCBvcm1RdWVyeUhpbnQgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApLmFkZEhpbnQoMCk7CiAJCQotCQlYbWxRdWVyeUhpbnQgcXVlcnlIaW50UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldEhpbnRzKCkuZ2V0KDApOworCQlYbWxRdWVyeUhpbnQgcXVlcnlIaW50UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXRIaW50cygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtUXVlcnlIaW50LmdldE5hbWUoKSk7CiAJCWFzc2VydE51bGwocXVlcnlIaW50UmVzb3VyY2UuZ2V0TmFtZSgpKTsKQEAgLTU4LDExICs1OCwxMSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVF1ZXJ5SGludCBvcm1RdWVyeUhpbnQgPSBvcm1FbnRpdHkuYWRkTmFtZWRRdWVyeSgwKS5hZGRIaW50KDApOworCQlPcm1RdWVyeUhpbnQgb3JtUXVlcnlIaW50ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKS5hZGRIaW50KDApOwogCQkKLQkJWG1sUXVlcnlIaW50IHF1ZXJ5SGludFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXRIaW50cygpLmdldCgwKTsKKwkJWG1sUXVlcnlIaW50IHF1ZXJ5SGludFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0SGludHMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnROdWxsKG9ybVF1ZXJ5SGludC5nZXROYW1lKCkpOwogCQlhc3NlcnROdWxsKHF1ZXJ5SGludFJlc291cmNlLmdldE5hbWUoKSk7CkBAIC03OSwxMSArNzksMTEgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUXVlcnlIaW50IG9ybVF1ZXJ5SGludCA9IG9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDApLmFkZEhpbnQoMCk7CisJCU9ybVF1ZXJ5SGludCBvcm1RdWVyeUhpbnQgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApLmFkZEhpbnQoMCk7CiAJCQotCQlYbWxRdWVyeUhpbnQgcXVlcnlIaW50UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldEhpbnRzKCkuZ2V0KDApOworCQlYbWxRdWVyeUhpbnQgcXVlcnlIaW50UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXRIaW50cygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtUXVlcnlIaW50LmdldFZhbHVlKCkpOwogCQlhc3NlcnROdWxsKHF1ZXJ5SGludFJlc291cmNlLmdldFZhbHVlKCkpOwpAQCAtMTAwLDExICsxMDAsMTEgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUXVlcnlIaW50IG9ybVF1ZXJ5SGludCA9IG9ybUVudGl0eS5hZGROYW1lZFF1ZXJ5KDApLmFkZEhpbnQoMCk7CisJCU9ybVF1ZXJ5SGludCBvcm1RdWVyeUhpbnQgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApLmFkZEhpbnQoMCk7CiAJCQotCQlYbWxRdWVyeUhpbnQgcXVlcnlIaW50UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldEhpbnRzKCkuZ2V0KDApOworCQlYbWxRdWVyeUhpbnQgcXVlcnlIaW50UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXRIaW50cygpLmdldCgwKTsKIAkJCiAJCWFzc2VydE51bGwob3JtUXVlcnlIaW50LmdldFZhbHVlKCkpOwogCQlhc3NlcnROdWxsKHF1ZXJ5SGludFJlc291cmNlLmdldFZhbHVlKCkpOwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1TZWNvbmRhcnlUYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVNlY29uZGFyeVRhYmxlVGVzdHMuamF2YQppbmRleCA1OTFhYzI1Li5jNjczNTVkIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVNlY29uZGFyeVRhYmxlVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVNlY29uZGFyeVRhYmxlVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0zNCw2ICszNCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgT3JtU2Vjb25kYXJ5VGFibGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAJcHVibGljIE9ybVNlY29uZGFyeVRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTQ1LDIyICs0NiwxMSBAQAogCQlzdXBlci5zZXRVcCgpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwkJCisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUlkQW5ub3RhdGlvbigpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC05NiwxMiArODYsMTIgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCQkJCiAJCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZWNvbmRhcnlUYWJsZUltcGwoKSk7CisJCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZWNvbmRhcnlUYWJsZSgpKTsKIAkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwogCQlPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKQEAgLTExOCw5ICsxMDgsOSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJCiAJCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKQEAgLTE0Miw3ICsxMzIsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJCiAJCW9ybUVudGl0eS5nZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CkBAIC0xNjAsMTIgKzE1MCwxMiBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCQkJCiAJCS8vc2V0IHNjaGVtYSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlSW1wbCgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlKCkpOwogCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuc2V0U2NoZW1hKCJGT08iKTsKIAkJT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKQEAgLTE4Miw5ICsxNzIsOSBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCQogCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKQEAgLTIwNiw3ICsxOTYsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKIAkJCkBAIC0yMzAsOCArMjIwLDggQEAKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQljcmVhdGVUZXN0U3ViVHlwZSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKIAkJT3JtRW50aXR5IHBhcmVudE9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtRW50aXR5IGNoaWxkT3JtRW50aXR5ID0gKE9ybUVudGl0eSkgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCQpAQCAtMjUwLDE2ICsyNDAsMTYgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFNjaGVtYUZyb21QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCQlPcm1TZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKIAkJb3JtU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CiAJCWFzc2VydE51bGwob3JtU2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAkJCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkZPTyIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkZPTyIpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRTY2hlbWEoKSk7CiAJCQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAkJCiAJCVNlY29uZGFyeVRhYmxlIGphdmFTZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5nZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7CkBAIC0yNjcsMjAgKzI1NywyMCBAQAogCQlqYXZhU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJKQVZBX1NDSEVNQSIpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRTY2hlbWEoKSk7IC8vc2NoZW1hIGlzIG5vdCBkZWZhdWx0ZWQgZnJvbSB1bmRlcmx5aW5nIGphdmEKIAkJCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7CiAJCWFzc2VydE51bGwob3JtU2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCQkJCiAJCS8vc2V0IGNhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZWNvbmRhcnlUYWJsZUltcGwoKSk7CisJCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZWNvbmRhcnlUYWJsZSgpKTsKIAkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLnNldENhdGFsb2coIkZPTyIpOwogCQlPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKQEAgLTI5Nyw5ICsyODcsOSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJCiAJCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKQEAgLTMyMSw3ICszMTEsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Q2F0YWxvZ0Zyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJCQpAQCAtMzQzLDE2ICszMzMsMTYgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdENhdGFsb2dGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7CiAJCW9ybVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwogCQlhc3NlcnROdWxsKG9ybVNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRDYXRhbG9nKCkpOwogCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZENhdGFsb2coIkZPTyIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJGT08iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKIAkJCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2coIkJBUiIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2coIkJBUiIpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRDYXRhbG9nKCkpOwogCQkKIAkJU2Vjb25kYXJ5VGFibGUgamF2YVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKQEAgLTM2MCwxOCArMzUwLDE4IEBACiAJCWphdmFTZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJKQVZBX0NBVEFMT0ciKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0Q2F0YWxvZygpKTsgLy9zY2hlbWEgaXMgbm90IGRlZmF1bHRlZCBmcm9tIHVuZGVybHlpbmcgamF2YQogCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRDYXRhbG9nKCkpOwogCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwogCQlhc3NlcnROdWxsKG9ybVNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRDYXRhbG9nKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKIAkJCiAJCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uID0gb3JtU2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7CkBAIC00MDQsMTAgKzM5NCwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKIAogCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKQEAgLTQzMCwxMCArNDIwLDEwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKIAogCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKQEAgLTQ2NiwxNSArNDU2LDE1IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKIAkJCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uSW1wbCgpKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5JbXBsKCkpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwoKSk7CisJCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOworCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKKwkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7CiAJCQogCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKIAkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7CkBAIC01MTcsMjAgKzUwNywyMCBAQAogCQogCiAJcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7CiAJCQogCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1TZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwogCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwogCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOworCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKIAkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwogCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwogCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKKwkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwogCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7CiAJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7CiAJCQpAQCAtNTQyLDE5ICs1MzIsMTkgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCQlPcm1TZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0RXF1YWxzKDAsICBvcm1TZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CiAJCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7CisJCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwogCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7CiAJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7CiAJCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOworCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7CiAJCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMSwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKIAkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJiYXIiKTsKIAkJCkBAIC01NjIsMTAgKzU1MiwxMCBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7CiAJCQogCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwpAQCAtNTgxLDEwICs1NzEsMTAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7CiAJCQogCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwpAQCAtNjAwLDEwICs1OTAsMTAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKIAkJCiAJCW9ybVNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7CkBAIC02NDMsMTAgKzYzMywxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKIAkJCiAJCW9ybVNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7CkBAIC02ODEsMjEgKzY3MSwyMSBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKIAkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOworCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKIAkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwogCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkZPTyIpOwogCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7CisJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKIAkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwogCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBUiIpOwogCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7CisJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKIAkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgyLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwogCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBWiIpOwogCkBAIC03MzksNyArNzI5LDcgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCQogCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSAoSmF2YUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1TZXF1ZW5jZUdlbmVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuamF2YQppbmRleCBlN2M1N2M4Li4wOGVhOWZiIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDE4ICs5LDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgT3JtU2VxdWVuY2VHZW5lcmF0b3JUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAJcHVibGljIE9ybVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTMyLDU5ICsyOCwxMyBAQAogCQlzdXBlci5zZXRVcCgpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlSWRBbm5vdGF0aW9uKCk7Ci0JCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKKwkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwogCQkKIAkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKIAkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKQEAgLTk4LDggKzQ4LDggQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKKwkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwogCQkKIAkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCiAJCXNlcXVlbmNlR2VuZXJhdG9yLnNldE5hbWUoIkZPTyIpOwpAQCAtMTEzLDggKzYzLDggQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFNlcXVlbmNlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7CisJCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQorCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7CiAJCQogCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldFNlcXVlbmNlTmFtZSgiRk9PIik7CkBAIC0xMjgsOCArNzgsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKKwkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCisJCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKIAkJCiAJCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoIkZPTyIpOwpAQCAtMTQzLDggKzkzLDggQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKKwkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCisJCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKIAkJCiAJCS8vc2V0IGluaXRpYWwgdmFsdWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCiAJCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxMCkpOwpAQCAtMTYzLDggKzExMyw4IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKKwkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwogCQkKIAkJLy9zZXQgaW5pdGlhbCB2YWx1ZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCiAJCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoMTApKTsKQEAgLTE4Miw4ICsxMzIsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKKwkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwogCQkKIAkJLy9zZXQgYWxsb2NhdGlvbiBzaXplIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigxMCkpOwpAQCAtMjAyLDggKzE1Miw4IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7CisJCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQorCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7CiAJCQogCQkvL3NldCBhbGxvY2F0aW9uIHNpemUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMTApKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVGFibGVHZW5lcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UYWJsZUdlbmVyYXRvclRlc3RzLmphdmEKaW5kZXggMDFkMWRkNi4uMjZkZTI0ZSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UYWJsZUdlbmVyYXRvclRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UYWJsZUdlbmVyYXRvclRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMjksOSArMjksOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE9ybVRhYmxlR2VuZXJhdG9yVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXB1YmxpYyBPcm1UYWJsZUdlbmVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC00MywyMiArNDMsMTEgQEAKIAkJc3VwZXIuc2V0VXAoKTsKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CiAJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsJCQorCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVJZEFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNzUsMjcgKzY0LDkgQEAKIAkJfSk7CiAJfQogCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7CisJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQorCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7CiAJCQogCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldE5hbWUoIkZPTyIpOwpAQCAtMTA5LDggKzgwLDggQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKKwkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwogCQkKIAkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCiAJCXRhYmxlR2VuZXJhdG9yLnNldE5hbWUoIkZPTyIpOwpAQCAtMTI0LDggKzk1LDggQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKKwkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCisJCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKIAkJCiAJCS8vc2V0IGluaXRpYWwgdmFsdWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCiAJCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxMCkpOwpAQCAtMTQ0LDggKzExNSw4IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKKwkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwogCQkKIAkJLy9zZXQgaW5pdGlhbCB2YWx1ZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCiAJCXRhYmxlR2VuZXJhdG9yLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoMTApKTsKQEAgLTE2Myw4ICsxMzQsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKKwkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwogCQkKIAkJLy9zZXQgYWxsb2NhdGlvbiBzaXplIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigxMCkpOwpAQCAtMTgzLDggKzE1NCw4IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7CisJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQorCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7CiAJCQogCQkvL3NldCBhbGxvY2F0aW9uIHNpemUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMTApKTsKQEAgLTIwMiw4ICsxNzMsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKKwkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwogCQkKIAkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKIAkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRUYWJsZSgiRk9PIik7CkBAIC0yMTcsOCArMTg4LDggQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKKwkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCisJCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKIAkJCiAJCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PIik7CkBAIC0yMzIsOCArMjAzLDggQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKKwkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCisJCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKIAkJCiAJCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCiAJCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0U2NoZW1hKCJGT08iKTsKQEAgLTI0Nyw4ICsyMTgsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKKwkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCisJCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKIAkJCiAJCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRTY2hlbWEoIkZPTyIpOwpAQCAtMjYyLDIwICsyMzMsMjAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCisJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQogCQkKIAkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXREZWZhdWx0U2NoZW1hKCkpOwogCQkKLQkJdGFibGVHZW5lcmF0b3IuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXREZWZhdWx0U2NoZW1hKCkpOwogCQkKLQkJdGFibGVHZW5lcmF0b3IuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGVHZW5lcmF0b3IuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7CisJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQorCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7CiAJCQogCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldENhdGFsb2coIkZPTyIpOwpAQCAtMjg5LDggKzI2MCw4IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKKwkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCisJCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKIAkJCiAJCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRDYXRhbG9nKCJGT08iKTsKQEAgLTMwNCw4ICsyNzUsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkUGtDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKKwkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCisJCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKIAkJCiAJCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCiAJCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0UGtDb2x1bW5OYW1lKCJGT08iKTsKQEAgLTMxOSw4ICsyOTAsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKKwkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCisJCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKIAkJCiAJCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoIkZPTyIpOwpAQCAtMzM0LDggKzMwNSw4IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKKwkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwogCQkKIAkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKIAkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRWYWx1ZUNvbHVtbk5hbWUoIkZPTyIpOwpAQCAtMzQ5LDggKzMyMCw4IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKKwkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwogCQkKIAkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCiAJCXRhYmxlR2VuZXJhdG9yLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgiRk9PIik7CkBAIC0zNjQsOCArMzM1LDggQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKKwkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwogCQkKIAkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKIAkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRQa0NvbHVtblZhbHVlKCJGT08iKTsKQEAgLTM3OSw4ICszNTAsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7CisJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQorCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7CiAJCQogCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKIAkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgiRk9PIik7CkBAIC0zOTUsMTcgKzM2NiwxNyBAQAogCQogCiAJcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKKwkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCisJCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKIAkJCiAJCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRzKCk7CiAJCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7CiAJCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7CisJCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwogCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7CiAJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7CiAJCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOworCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7CiAJCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKIAkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJiYXIiKTsKIAkJCkBAIC00MTcsMTYgKzM4OCwxNiBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKKwkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCisJCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKIAkJCiAJCWFzc2VydEVxdWFscygwLCAgdGFibGVHZW5lcmF0b3IudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwogCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOworCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKIAkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwogCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwogCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKKwkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwogCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDEsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7CiAJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7CiAJCQpAQCAtNDM0LDggKzQwNSw4IEBACiAJfQogCiAJcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKKwkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwogCQkKIAkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKIAkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKQEAgLTQ1MCw4ICs0MjEsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKKwkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwogCQkKIAkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKIAkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKQEAgLTQ2Niw4ICs0MzcsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7CisJCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQorCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7CiAKIAkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKIAkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKQEAgLTUwNiw4ICs0NzcsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKKwkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwogCiAJCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7CiAJCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7CkBAIC01NDEsMTggKzUxMiwxOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBlbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOworCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKKwkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwogCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7CisJCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwogCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7CiAJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiRk9PIik7CiAKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKKwkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwogCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDEsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7CiAJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiQkFSIik7CiAKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKKwkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwogCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7CiAJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiQkFaIik7CiAKQEAgLTU5NSwxNSArNTY2LDE1IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCiAJCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAogCQlKYXZhSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcgPSAoSmF2YUlkTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFUYWJsZUdlbmVyYXRvciBqYXZhVGFibGVHZW5lcmF0b3IgPSBqYXZhSWRNYXBwaW5nLmFkZFRhYmxlR2VuZXJhdG9yKCk7CisJCUphdmFUYWJsZUdlbmVyYXRvciBqYXZhVGFibGVHZW5lcmF0b3IgPSBqYXZhSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7CiAJCWphdmFUYWJsZUdlbmVyYXRvci5zZXROYW1lKCJUQUJMRV9HRU5FUkFUT1IiKTsKIAkJCi0JCU9ybVRhYmxlR2VuZXJhdG9yIG9ybVRhYmxlR2VuZXJhdG9yID0gb3JtSWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCk7CisJCU9ybVRhYmxlR2VuZXJhdG9yIG9ybVRhYmxlR2VuZXJhdG9yID0gb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7CiAJCWFzc2VydFRydWUob3JtVGFibGVHZW5lcmF0b3IuaXNWaXJ0dWFsKCkpOwogCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1UYWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50cygpOwogCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwpAQCAtNjIzLDcgKzU5NCw3IEBACiAJCW9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkubWFrZVNwZWNpZmllZCgpOwogCQlvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKIAkKLQkJT3JtVGFibGVHZW5lcmF0b3Igb3JtVGFibGVHZW5lcmF0b3IyID0gb3JtSWRNYXBwaW5nLmFkZFRhYmxlR2VuZXJhdG9yKCk7CisJCU9ybVRhYmxlR2VuZXJhdG9yIG9ybVRhYmxlR2VuZXJhdG9yMiA9IG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwogCQlvcm1UYWJsZUdlbmVyYXRvcjIuc2V0TmFtZSgiVEFCTEVfR0VORVJBVE9SIik7CiAJCQogCQlhc3NlcnRGYWxzZShvcm1UYWJsZUdlbmVyYXRvcjIuaXNWaXJ0dWFsKCkpOwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRhYmxlVGVzdHMuamF2YQppbmRleCAxODE0MDc2Li4zNDdjMTdiIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRhYmxlVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRhYmxlVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgT3JtVGFibGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAJcHVibGljIE9ybVRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTQxLDIyICs0MiwxMSBAQAogCQlzdXBlci5zZXRVcCgpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7CisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCX0KIAkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUlkQW5ub3RhdGlvbigpOwotCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC05MCwxMiArODAsMjcgQEAKIAkJfTsKIAkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7CiAJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUFic3RyYWN0VGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklOSEVSSVRBTkNFLCBKUEEuSU5IRVJJVEFOQ0VfVFlQRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiYWJzdHJhY3QiKTsKKwkJCX0KKwkJfSk7CisJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJT3JtVGFibGUgb3JtVGFibGUgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7CiAJCQpAQCAtMTIwLDkgKzEyNSw5IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKIAkJT3JtVGFibGUgb3JtVGFibGUgPSAoKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKIAkJCkBAIC0xNDAsNyArMTQ1LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwogCQkKQEAgLTE1MCwxNCArMTU1LDE0IEBACiAJCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwogCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKIAkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7CiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwogCQogCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKIAkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJCQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKIAkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKIAkJCiAJCW9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJhciIpOwpAQCAtMTY1LDcgKzE3MCw3IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZU5vSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CiAJfQpAQCAtMTczLDcgKzE3OCw3IEBACiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lRnJvbUVudGl0eU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwpAQCAtMTk1LDggKzIwMCw4IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKIAkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CiAJCU9ybUVudGl0eSBwYXJlbnRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCU9ybUVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCQkKQEAgLTIxMywxMCArMjE4LDEwIEBACiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCU9ybVRhYmxlIG9ybVRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJYXNzZXJ0TnVsbChvcm1UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7CiAJCQpAQCAtMjQzLDcgKzI0OCw3IEBACiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAkJCkBAIC0yNTMsMTQgKzI1OCwxNCBAQAogCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwogCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7CiAKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwogCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKIAkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwogCQogCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKIAkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwogCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CiAJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAkJCiAJCW9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJhciIpOwpAQCAtMjcwLDcgKzI3NSw3IEBACiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFOb0phdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7CiAJfQpAQCAtMjc5LDggKzI4NCw4IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKIAkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CiAJCU9ybUVudGl0eSBwYXJlbnRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCU9ybUVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCQkKQEAgLTI5OSwxNCArMzA0LDE0IEBACiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwogCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAkJCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJCQVIiKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwogCQkKIAkJb3JtRW50aXR5LmdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgiSkFWQV9TQ0hFTUEiKTsKQEAgLTMxNywxMCArMzIyLDEwIEBACiAJCWFzc2VydEVxdWFscygiQkFSIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAogCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwogCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKIAkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwogCQkKIAkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKQEAgLTMyOCwxMCArMzMzLDEwIEBACiAJfQogCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCU9ybVRhYmxlIG9ybVRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJYXNzZXJ0TnVsbChvcm1UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7CiAJCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7CiAJCQpAQCAtMzQ3LDEwICszNTIsMTAgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCQlPcm1UYWJsZSBvcm1UYWJsZSA9IG9ybUVudGl0eS5nZXRUYWJsZSgpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CiAJCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKIAkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKIAkJCkBAIC0zNzUsMTAgKzM4MCwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCU9ybVRhYmxlIG9ybVRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJYXNzZXJ0TnVsbChvcm1UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwogCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkpOwogCQkKQEAgLTM5Niw3ICs0MDEsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Q2F0YWxvZ0Zyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKIAkJCkBAIC00MDYsMTQgKzQxMSwxNCBAQAogCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwogCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwogCi0JCW9ybUVudGl0eS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKIAkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7CiAJCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CiAJCiAJCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwogCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwogCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CiAJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CiAJCQogCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCYXIiKTsKQEAgLTQyMyw3ICs0MjgsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Q2F0YWxvZ05vSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CiAJfQpAQCAtNDMyLDggKzQzNyw4IEBACiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKIAkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CiAJCU9ybUVudGl0eSBwYXJlbnRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCU9ybUVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCQkKQEAgLTQ1MiwxNCArNDU3LDE0IEBACiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nRnJvbVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CiAJCQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRk9PIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZENhdGFsb2coIkZPTyIpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwogCQkKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFSIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFSIik7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CiAJCQogCQlvcm1FbnRpdHkuZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiSkFWQV9DQVRBTE9HIik7CkBAIC00NzAsMTAgKzQ3NSwxMCBAQAogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwogCiAJCQotCQlvcm1FbnRpdHkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CiAKLQkJb3JtRW50aXR5LmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7CiAJCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CiAJCQogCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwpAQCAtNTA1LDIxICs1MTAsMjEgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJCiAJCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUVudGl0eS5nZXRUYWJsZSgpLnVuaXF1ZUNvbnN0cmFpbnRzKCk7CiAJCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7CiAKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxUYWJsZSB0YWJsZVJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGUoKTsKIAkJZW50aXR5UmVzb3VyY2Uuc2V0VGFibGUodGFibGVSZXNvdXJjZSk7CiAJCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnRJbXBsKCk7CisJCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwogCQl0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7CiAJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7CiAJCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOworCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7CiAJCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKIAkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJiYXIiKTsKIAkJCkBAIC01MzMsMjAgKzUzOCwyMCBAQAogCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydEVxdWFscygwLCAgb3JtRW50aXR5LmdldFRhYmxlKCkudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwogCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sVGFibGUgdGFibGVSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlKCk7CiAJCWVudGl0eVJlc291cmNlLnNldFRhYmxlKHRhYmxlUmVzb3VyY2UpOwogCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOworCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKIAkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwogCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwogCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKKwkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwogCQl0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDEsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7CiAJCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7CiAJCQpAQCAtNTU2LDcgKzU2MSw3IEBACiAJcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJCiAJCU9ybVRhYmxlIHRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7CkBAIC01NjQsNyArNTY5LDcgQEAKIAkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKIAkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sVGFibGUgdGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFRhYmxlKCk7CiAJCQogCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7CkBAIC01NzgsNyArNTgzLDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKIAkJCiAJCU9ybVRhYmxlIHRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7CkBAIC01ODYsNyArNTkxLDcgQEAKIAkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKIAkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKIAkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKIAkJWG1sVGFibGUgdGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFRhYmxlKCk7CiAJCQogCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7CkBAIC02MDAsNyArNjA1LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCQkKIAkJT3JtVGFibGUgdGFibGUgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKTsKQEAgLTYwOCw3ICs2MTMsNyBAQAogCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwogCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxUYWJsZSB0YWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKTsKIAkJCiAJCWFzc2VydEVxdWFscygzLCB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKQEAgLTY0Niw3ICs2NTEsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5KCk7CiAJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwogCQkKIAkJT3JtVGFibGUgdGFibGUgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKTsKQEAgLTY1NCw3ICs2NTksNyBAQAogCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwogCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxUYWJsZSB0YWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKTsKIAkJCiAJCWFzc2VydEVxdWFscygzLCB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKQEAgLTY4NywyNCArNjkyLDI0IEBACiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCQogCQlPcm1UYWJsZSB0YWJsZSA9IG9ybUVudGl0eS5nZXRUYWJsZSgpOwogCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwogCQlYbWxUYWJsZSB0YWJsZVJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGUoKTsKIAkJZW50aXR5UmVzb3VyY2Uuc2V0VGFibGUodGFibGVSZXNvdXJjZSk7CiAJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludEltcGwoKTsKKwkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7CiAJCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKIAkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJGT08iKTsKIAotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOworCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7CiAJCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMSwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKIAkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVIiKTsKIAotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50SW1wbCgpOworCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7CiAJCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKIAkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVoiKTsKIApAQCAtNzcxLDggKzc3Niw1MiBAQAogLy8JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKIC8vCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwogLy8JCQotLy8JCWVudGl0eVJlc291cmNlLnNldFRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlSW1wbCgpKTsKKy8vCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZSgpKTsKIC8vCQlhc3NlcnRFcXVhbHMoMCwgIG9ybUVudGl0eS5nZXRUYWJsZSgpLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKIC8vCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RFbnRpdHlHZXREZWZhdWx0TmFtZVRhYmxlUGVyQ2xhc3NJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoT3JtRW50aXR5KSBhYnN0cmFjdFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgY29uY3JldGVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJT3JtRW50aXR5IGNvbmNyZXRlRW50aXR5ID0gKE9ybUVudGl0eSkgY29uY3JldGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CQkKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb25jcmV0ZUVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOworCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgY29uY3JldGVFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CisJCQorCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOworCQkJCisJCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjb25jcmV0ZUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwkJCisJCS8vbWV0YS1kYXRhIGNvbXBsZXRlIHRydWUsIGluaGVyaXRhbmNlIHN0cmF0ZWd5IG5vIHNpbmdsZS10YWJsZQorCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CisJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGFic3RyYWN0RW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwkKKwkJCisJCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlIiwgY29uY3JldGVFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb25jcmV0ZUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7CisJCQorCQkKKwkJLy9zZXQgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgdG8gdGFibGUtcGVyLWNsYXNzIGluIG9ybS54bWwKKwkJYWJzdHJhY3RFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOworCQkJCisJCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjb25jcmV0ZUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwl9CiAKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YQppbmRleCBmOWQ4YmFlLi42MDk0NmE5IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMzIsNiArMzIsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE9ybVRyYW5zaWVudE1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAJcHVibGljIE9ybVRyYW5zaWVudE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtNDMsMjIgKzQ0LDExIEBACiAJCXN1cGVyLnNldFVwKCk7CiAJCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwogCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKKwkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CiAJfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVHJhbnNpZW50QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRyYW5zaWVudCIsICIiKTsJCQotCX0KLQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlVHJhbnNpZW50QW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC03NiwxMCArNjYsMTAgQEAKIAkJfSk7CiAJfQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50TWFwcGluZyIpOwogCQlPcm1UcmFuc2llbnRNYXBwaW5nIHhtbFRyYW5zaWVudG5NYXBwaW5nID0gKE9ybVRyYW5zaWVudE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxUcmFuc2llbnQgdHJhbnNpZW50UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5nZXQoMCk7CisJCVhtbFRyYW5zaWVudCB0cmFuc2llbnRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudE1hcHBpbmciLCB4bWxUcmFuc2llbnRuTWFwcGluZy5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudE1hcHBpbmciLCB0cmFuc2llbnRSZXNvdXJjZS5nZXROYW1lKCkpOwpAQCAtOTYsMTAgKzg2LDEwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50TWFwcGluZyIpOwogCQlPcm1UcmFuc2llbnRNYXBwaW5nIHhtbFRyYW5zaWVudG5NYXBwaW5nID0gKE9ybVRyYW5zaWVudE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxUcmFuc2llbnQgdHJhbnNpZW50UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5nZXQoMCk7CisJCVhtbFRyYW5zaWVudCB0cmFuc2llbnRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5nZXQoMCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudE1hcHBpbmciLCB4bWxUcmFuc2llbnRuTWFwcGluZy5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudE1hcHBpbmciLCB0cmFuc2llbnRSZXNvdXJjZS5nZXROYW1lKCkpOwpAQCAtMTE5LDcgKzEwOSw3IEBACiAJcHVibGljIHZvaWQgdGVzdFRyYW5zaWVudE1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7CiAKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZm9vIik7CiAJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CiAJCQpAQCAtMTM4LDcgKzEyOCw3IEBACiAJLy9ARW51bWVyYXRlZChFbnVtVHlwZS5TVFJJTkcpCiAJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCQpAQCAtMTQ4LDcgKzEzOCw3IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKIAkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKQEAgLTE2NSw3ICsxNTUsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7CiAKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKIAkJCkBAIC0xNzcsNyArMTY3LDcgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5VHJhbnNpZW50TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnQiKTsKIAkJCiAJCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKQEAgLTE5Miw3ICsxODIsNyBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50Iik7CiAJCQogCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CkBAIC0yMDcsNyArMTk3LDcgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50Iik7CiAJCQogCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CkBAIC0yMjIsNyArMjEyLDcgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5VHJhbnNpZW50TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnQiKTsKIAkJCiAJCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKQEAgLTIzNyw3ICsyMjcsNyBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50Iik7CiAJCQogCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CkBAIC0yNTIsNyArMjQyLDcgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5VHJhbnNpZW50TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnQiKTsKIAkJCiAJCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKQEAgLTI2Nyw3ICsyNTcsNyBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5VHJhbnNpZW50TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnQiKTsKIAkJCiAJCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKQEAgLTI4Miw3ICsyNzIsNyBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5VHJhbnNpZW50TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnQiKTsKIAkJCiAJCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKQEAgLTI5Nyw3ICsyODcsNyBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50Iik7CiAJCQogCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhCmluZGV4IGEwNTNiOWYuLjYxODI5YTQgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE0LDYgKzE0LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CkBAIC0yMSw2ICsyMiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwpAQCAtMzUsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE9ybVZlcnNpb25NYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXB1YmxpYyBPcm1WZXJzaW9uTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC00Niw0MSArNDksMTEgQEAKIAkJc3VwZXIuc2V0VXAoKTsKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CiAJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZlcnNpb25Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVmVyc2lvbiIsICIiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkNvbHVtbiIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJImJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsiICsKLQkJCSJib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJImJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCSJTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgXCJcIjsiICsKLQkJCSJTdHJpbmcgdGFibGUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkiaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OyIgKwotCQkJImludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IiArCi0JCQkiaW50IHNjYWxlKCkgZGVmYXVsdCAwOyIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZW1wb3JhbEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUZW1wb3JhbCIsICJUZW1wb3JhbFR5cGUgdmFsdWUoKTsiKTsJCQorCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJY3JlYXRlVmVyc2lvbkFubm90YXRpb24oKTsKLQkJY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpOwotCQljcmVhdGVUZW1wb3JhbEFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTAzLDEwICs3NiwxMCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ2ZXJzaW9uTWFwcGluZyIpOwogCQlPcm1WZXJzaW9uTWFwcGluZyBvcm1WZXJzaW9uTWFwcGluZyA9IChPcm1WZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbFZlcnNpb24gdmVyc2lvblJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKTsKKwkJWG1sVmVyc2lvbiB2ZXJzaW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKTsKIAkJCiAJCWFzc2VydEVxdWFscygidmVyc2lvbk1hcHBpbmciLCBvcm1WZXJzaW9uTWFwcGluZy5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoInZlcnNpb25NYXBwaW5nIiwgdmVyc2lvblJlc291cmNlLmdldE5hbWUoKSk7CkBAIC0xMjMsMTAgKzk2LDEwIEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb25NYXBwaW5nIik7CiAJCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sVmVyc2lvbiB2ZXJzaW9uUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOworCQlYbWxWZXJzaW9uIHZlcnNpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uTWFwcGluZyIsIG9ybVZlcnNpb25NYXBwaW5nLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygidmVyc2lvbk1hcHBpbmciLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKQEAgLTE0Myw1OSArMTE2LDYwIEBACiAJfQkKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidmVyc2lvbk1hcHBpbmciKTsKIAkJT3JtVmVyc2lvbk1hcHBpbmcgb3JtVmVyc2lvbk1hcHBpbmcgPSAoT3JtVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxWZXJzaW9uIHZlcnNpb25SZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCk7CisJCVhtbFZlcnNpb24gdmVyc2lvblJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCk7CiAJCQotCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKIAkJYXNzZXJ0TnVsbCh2ZXJzaW9uUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7CiAJCQkJCiAJCS8vc2V0IHRlbXBvcmFsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAogCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7CiAJCiAJCXZlcnNpb25SZXNvdXJjZS5zZXRUZW1wb3JhbChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsIG9ybVZlcnNpb25NYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7CiAJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIHZlcnNpb25SZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKIAogCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVApOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIHZlcnNpb25SZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKIAogCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAogCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0VGVtcG9yYWwobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOwogCQlhc3NlcnROdWxsKHZlcnNpb25SZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb25NYXBwaW5nIik7CiAJCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sVmVyc2lvbiB2ZXJzaW9uUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOworCQlYbWxWZXJzaW9uIHZlcnNpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CiAJCWFzc2VydE51bGwodmVyc2lvblJlc291cmNlLmdldFRlbXBvcmFsKCkpOwogCQkJCQogCQkvL3NldCB0ZW1wb3JhbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtVmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLkRBVEUpOworCQlvcm1WZXJzaW9uTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybVZlcnNpb25NYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLkRBVEUpOwogCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKIAkKLQkJb3JtVmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1WZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgdmVyc2lvblJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsIG9ybVZlcnNpb25NYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybVZlcnNpb25NYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7CiAKLQkJb3JtVmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCk7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybVZlcnNpb25NYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCk7CiAJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgdmVyc2lvblJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1WZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwogCiAJCS8vc2V0IHRlbXBvcmFsIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtVmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwobnVsbCk7CisJCW9ybVZlcnNpb25NYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihudWxsKTsKIAkJYXNzZXJ0TnVsbCh2ZXJzaW9uUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOwogCX0KIAkKIAkvL1RPRE8gdGVzdCBkZWZhdWx0cwpAQCAtMjA0LDcgKzE3OCw3IEBACiAJcHVibGljIHZvaWQgdGVzdFZlcnNpb25NYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKIAotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZm9vIik7CiAJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CiAJCQpAQCAtMjEyLDcgKzE4Niw3IEBACiAJCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJCiAJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRUZW1wb3JhbCgpKTsKKwkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CiAKIAkJCiAJCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKTsKQEAgLTIyOCwxNSArMjAyLDE1IEBACiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwogCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjU1KSwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMCksIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDApLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKIAl9CiAJCiAJLy9AQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlKQpAQCAtMjQ4LDEzICsyMjIsMTQgQEAKIAkvL0BFbnVtZXJhdGVkKEVudW1UeXBlLlNUUklORykKIAlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCQogCQlPcm1WZXJzaW9uTWFwcGluZyBvcm1WZXJzaW9uTWFwcGluZyA9IChPcm1WZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQogCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIG9ybVZlcnNpb25NYXBwaW5nLmdldFRlbXBvcmFsKCkpOworCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7CiAJCQogCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCk7CiAJCWFzc2VydEVxdWFscygiTVlfQ09MVU1OIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CkBAIC0yNzEsNyArMjQ2LDcgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKIAkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKQEAgLTI4MywyNSArMjU4LDI1IEBACiAKIAkJT3JtVmVyc2lvbk1hcHBpbmcgb3JtVmVyc2lvbk1hcHBpbmcgPSAoT3JtVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVZlcnNpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOwogCQkKIAkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybVZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpOwogCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0VXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7CiAJCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyNTUpLCBvcm1Db2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDApLCBvcm1Db2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDApLCBvcm1Db2x1bW4uZ2V0U2NhbGUoKSk7CisJCWFzc2VydEVxdWFscygyNTUsIG9ybUNvbHVtbi5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldFNjYWxlKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKIAotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKIAkJCkBAIC0zMDksNyArMjg0LDcgQEAKIAkJT3JtVmVyc2lvbk1hcHBpbmcgb3JtVmVyc2lvbk1hcHBpbmcgPSAoT3JtVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVZlcnNpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0VGVtcG9yYWwoKSk7CisJCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOwogCQkKIAkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybVZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpOwogCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwpAQCAtMzI0LDI2ICsyOTksMjcgQEAKIAkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldERlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldERlZmF1bHRVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHROdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwogCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDI1NSksIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDApLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigwKSwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDI1NSwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uTW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKIAkJCiAJCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQl2ZXJzaW9uTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwogCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKQEAgLTM1MSwxOSArMzI3LDE5IEBACiAJCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKIAkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7CiAJCWFzc2VydEVxdWFscygidmVyc2lvbiIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRUZW1wb3JhbCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uTW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKIAkJCiAJCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUUpOworCQl2ZXJzaW9uTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLlRFTVBPUkFMX0NPTlZFUlRFUik7CisJCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwogCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCQogCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKQEAgLTM3MSwxOSArMzQ3LDE5IEBACiAJCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKIAkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7CiAJCWFzc2VydEVxdWFscygidmVyc2lvbiIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRUZW1wb3JhbCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uTW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ2ZXJzaW9uIik7CiAJCQogCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJdmVyc2lvbk1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwpAQCAtMzk1LDEzICszNzEsMTQgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ2ZXJzaW9uIik7CiAJCQogCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJdmVyc2lvbk1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CkBAIC00MTMsMTMgKzM5MCwxNCBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uTW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlWZXJzaW9uTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidmVyc2lvbiIpOwogCQkKIAkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7CisJCXZlcnNpb25NYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKTsKKwkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CiAJCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwpAQCAtNDMxLDEzICs0MDksMTQgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ2ZXJzaW9uIik7CiAJCQogCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJdmVyc2lvbk1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKQEAgLTQ0OSwxMyArNDI4LDE0IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdFZlcnNpb25Nb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKIAkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKIAogCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJdmVyc2lvbk1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CkBAIC00NjcsMTMgKzQ0NywxNCBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uTW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CiAJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ2ZXJzaW9uIik7CiAJCQogCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CiAJCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJdmVyc2lvbk1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKIAkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwogCQkKIAkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CkBAIC00ODUsMTMgKzQ2NiwxNCBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uTW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlWZXJzaW9uTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidmVyc2lvbiIpOwogCQkKIAkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwogCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CiAJCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRSk7CisJCXZlcnNpb25NYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuVEVNUE9SQUxfQ09OVkVSVEVSKTsKKwkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CiAJCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKIAkJCiAJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtWG1sVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtWG1sVGVzdHMuamF2YQppbmRleCBjMjEwZDE0Li44YzVlNWYyIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVhtbFRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1YbWxUZXN0cy5qYXZhCkBAIC0xLDI0ICsxLDI0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBPcm1YbWxUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAJcHVibGljIE9ybVhtbFRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0yOCw4NCArMjgsNDMgQEAKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQlzdXBlci5zZXRVcCgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5zZXROYW1lKCJmb28iKTsKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuc2V0TmFtZSgiZm9vIik7CiAJCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwogCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKKwkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CiAJfQogCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCgpIHsKLQkJcmV0dXJuIHJvb3RDb250ZXh0KCkuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybVhtbCBvcm1YbWwoKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVVuaXQoKS5tYXBwaW5nRmlsZVJlZnMoKS5uZXh0KCkuZ2V0T3JtWG1sKCk7CisJcHJvdGVjdGVkIE9ybVhtbCBnZXRPcm1YbWwoKSB7CisJCXJldHVybiAoT3JtWG1sKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5tYXBwaW5nRmlsZVJlZnMoKS5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFkZEVudGl0eU1hcHBpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVJlc291cmNlIG9ybVJlc291cmNlID0gb3JtUmVzb3VyY2UoKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGdldEpwYVByb2plY3QoKS5qcGFGaWxlc1NpemUoKSk7CisJCUpwYVhtbFJlc291cmNlIG9ybVJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKTsKIAkJb3JtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5jbGVhcigpOwogCQlvcm1SZXNvdXJjZS5zYXZlKG51bGwpOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1YbWwoKS5nZXRFbnRpdHlNYXBwaW5ncygpKTsKKwkJLy90aGUgQ29udGVudFR5cGUgb2YgdGhlIG9ybS54bWwgZmlsZSBpcyBubyBsb25nZXIgb3JtLCBzbyB0aGUganBhIGZpbGUgaXMgcmVtb3ZlZAorCQlhc3NlcnROdWxsKGdldE9ybVhtbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGdldEpwYVByb2plY3QoKS5qcGFGaWxlc1NpemUoKSk7IC8vc2hvdWxkIG9ubHkgYmUgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlCiAJCQotCQlvcm1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpKTsKKwkJWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpOworCQl4bWxFbnRpdHlNYXBwaW5ncy5zZXRWZXJzaW9uKCIxLjAiKTsKKwkJb3JtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoeG1sRW50aXR5TWFwcGluZ3MpOworCQlvcm1SZXNvdXJjZS5zYXZlKG51bGwpOwogCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1YbWwoKS5nZXRFbnRpdHlNYXBwaW5ncygpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBZGRFbnRpdHlNYXBwaW5ncygpIHsKLQkJT3JtUmVzb3VyY2Ugb3JtUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpOwotCQlvcm1SZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZShvcm1SZXNvdXJjZS5nZXRFbnRpdHlNYXBwaW5ncygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZS5nZXRFbnRpdHlNYXBwaW5ncygpKTsKLQkJCi0JCU9ybVhtbCBvcm1YbWwgPSBvcm1YbWwoKTsKLQkJYXNzZXJ0TnVsbChvcm1YbWwuZ2V0RW50aXR5TWFwcGluZ3MoKSk7Ci0JCQotCQlvcm1YbWwuYWRkRW50aXR5TWFwcGluZ3MoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwob3JtWG1sLmdldEVudGl0eU1hcHBpbmdzKCkpOwotCQkKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCW9ybVhtbC5hZGRFbnRpdHlNYXBwaW5ncygpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOworCQlhc3NlcnROb3ROdWxsKGdldE9ybVhtbCgpLmdldEVudGl0eU1hcHBpbmdzKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgZ2V0SnBhUHJvamVjdCgpLmpwYUZpbGVzU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlbW92ZUVudGl0eU1hcHBpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVJlc291cmNlIG9ybVJlc291cmNlID0gb3JtUmVzb3VyY2UoKTsKKwkJSnBhWG1sUmVzb3VyY2Ugb3JtUmVzb3VyY2UgPSBnZXRPcm1YbWxSZXNvdXJjZSgpOwogCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1YbWwoKS5nZXRFbnRpdHlNYXBwaW5ncygpKTsKKwkJYXNzZXJ0Tm90TnVsbChnZXRPcm1YbWwoKS5nZXRSb290KCkpOwogCQkKIAkJb3JtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5jbGVhcigpOwogCQkKLQkJYXNzZXJ0TnVsbChvcm1YbWwoKS5nZXRFbnRpdHlNYXBwaW5ncygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVJlbW92ZUVudGl0eU1hcHBpbmdzKCkgewotCQlPcm1YbWwgb3JtWG1sID0gb3JtWG1sKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKG9ybVhtbC5nZXRFbnRpdHlNYXBwaW5ncygpKTsKLQkJCi0JCW9ybVhtbC5yZW1vdmVFbnRpdHlNYXBwaW5ncygpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1YbWwuZ2V0RW50aXR5TWFwcGluZ3MoKSk7Ci0JCQotCQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJb3JtWG1sLnJlbW92ZUVudGl0eU1hcHBpbmdzKCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7CisJCWFzc2VydE51bGwoZ2V0T3JtWG1sKCkuZ2V0Um9vdCgpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5qYXZhCmluZGV4IDBhYmY5ZmYuLjlhM2Q2YWQgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5qYXZhCkBAIC0xLDI0ICsxLDI0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0zMSwzMzkgKzMxLDMzOSBAQAogCQlzdXBlci5zZXRVcCgpOwogCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJcGVyc2lzdGVuY2VSZXNvdXJjZSgpLnNhdmUobnVsbCk7CisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCX0KIAkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB7Ci0JCXJldHVybiBlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB7CisJCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdElzQWxsRmVhdHVyZXNVbnNldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CiAJCQogCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwogCQkKIAkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwogCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzQWxsRmVhdHVyZXNVbnNldCgpKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7CiAJCQogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzQWxsRmVhdHVyZXNVbnNldCgpKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwogCQkKIAkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc0FsbEZlYXR1cmVzVW5zZXQoKSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwogCQkKIAkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRTY2hlbWEoImFzZGYiKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc0FsbEZlYXR1cmVzVW5zZXQoKSk7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKIAkJCiAJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKIAkJCiAJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0Q2F0YWxvZygiYXNkZiIpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzQWxsRmVhdHVyZXNVbnNldCgpKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwogCQkKIAkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKIAkJCiAJCQogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7CiAJCQogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7CiAJCQogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzQWxsRmVhdHVyZXNVbnNldCgpKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CiAJCQogCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U2NoZW1hKCJNWV9TQ0hFTUEiKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTY2hlbWEoIk1ZX1NDSEVNQSIpOwogCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7CiAJCiAJCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYShudWxsKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U2NoZW1hKG51bGwpOwogCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CiAJCQogCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEoIk1ZX1NDSEVNQSIpOwogCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7CiAJCQogCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7CiAJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2NoZW1hMigpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CiAJCQogCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEoIk1ZX1NDSEVNQSIpOwogCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7CiAJCQogCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7CiAJCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCiAJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2NoZW1hMygpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CiAJCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IHNvIG9ubHkgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IGdldHMgcmVtb3ZlZAotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CiAJCQogCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEoIk1ZX1NDSEVNQSIpOwogCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7CiAJCQogCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7CiAJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CiAJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKIAkJCiAJCS8vc2V0IGNhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKIAkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOworCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwogCQogCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZyhudWxsKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZyhudWxsKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwogCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CiAJCQogCQkvL3NldCBjYXRhbG9nIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKIAkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZygiTVlfQ0FUQUxPRyIpOwogCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7CisJCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7CiAJCQogCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKIAkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CiAJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKIAkJCiAJCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7CiAJCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKIAkJCiAJCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTY2hlbWEoIk1ZX1NDSEVNQSIpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTY2hlbWEoIk1ZX1NDSEVNQSIpOwogCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKIAkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZzMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CiAJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKIAkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKIAkJCiAJCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7CiAJCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKIAkJCiAJCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwogCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CiAJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CiAJCQogCQkvL3NldCBjYXNjYWRlUGVyc2lzdCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwogCQogCQkvL3NldCBjYXNjYWRlUGVyc2lzdCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyB0YWcgbm90IHJlbW92ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOworCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKIAkJCiAJCS8vc2V0IGNhc2NhZGVQZXJzaXN0IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKIAkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7CiAJCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7CisJCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKIAkJCiAJCS8vc2V0IGNhc2NhZGVQZXJzaXN0IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKIAkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwogCQkKIAkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwogCQkKIAkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwogCQkvL3NldCBjYXNjYWRlUGVyc2lzdCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCiAJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOworCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwogCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBvbmx5IHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBnZXRzIHJlbW92ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwogCQkKIAkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwogCQkKIAkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7CiAJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwogCX0KIAkKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwogCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKIAkJCiAJCS8vc2V0IGFjY2VzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7CiAJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwogCQogCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MobnVsbCk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhudWxsKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CiAJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwogCQkKIAkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKIAkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwogCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKIAkJCiAJCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCiAJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldEFjY2VzcyhudWxsKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBY2Nlc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwogCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKIAkJCiAJCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCiAJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKIAkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7CiAJCQogCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwogCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAogCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MobnVsbCk7CiAJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2VzczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CiAJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwogCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBvbmx5IHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBnZXRzIHJlbW92ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwogCQkKIAkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKIAkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwogCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKIAkJCiAJCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCiAJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldEFjY2VzcyhudWxsKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwogCX0KIAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmphdmEKaW5kZXggZmVhZGE1NC4uMWQ5ODUwZSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmphdmEKQEAgLTEsMTMgKzEsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CkBAIC0yOSw3NyArMjgsNzcgQEAKIAkJc3VwZXIuc2V0VXAoKTsKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CiAJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCXBlcnNpc3RlbmNlUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKIAl9CiAKIAlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSB7Ci0JCXJldHVybiBlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7CisJCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RJc0FsbEZlYXR1cmVzVW5zZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc0FsbEZlYXR1cmVzVW5zZXQoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7CiAJCQogCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNBbGxGZWF0dXJlc1Vuc2V0KCkpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwogCQkKIAkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzQWxsRmVhdHVyZXNVbnNldCgpKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwogCQkKIAkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzQWxsRmVhdHVyZXNVbnNldCgpKTsJCQorCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwkJCiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKKwkJUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7CiAJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CiAJCQogCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsJCQorCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CQkKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7CisJCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7CiAKIAkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOworCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBlbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7CisJCVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwogCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwogCQkKIAkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAogCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKIAkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7CisJCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7CiAJCQogCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCiAJCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKIAkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IGVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKKwkJUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7CiAJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CiAJCQogCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCiAJCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwogCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKIAkJCiAJCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKIAkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwogCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CiAJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7CisJCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwogCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2xhc3NSZWZUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0NsYXNzUmVmVGVzdHMuamF2YQppbmRleCA2OWNlNzU2Li4zNzczNTUxIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2xhc3NSZWZUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9DbGFzc1JlZlRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAorICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIAogICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAogICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKICAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKQEAgLTI0LDggKzI0LDggQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNsYXNzTmFtZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7CisJCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwogCQkKIAkJLy8gYWRkIGNsYXNzIHJlZgogCQlYbWxKYXZhQ2xhc3NSZWYgeG1sQ2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwpAQCAtNTYsOCArNTYsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2xhc3NOYW1lKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CiAJCQogCQkvLyBhZGQgY2xhc3MgcmVmCiAJCVhtbEphdmFDbGFzc1JlZiB4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7CkBAIC05MywyMCArOTMsMjAgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0UGVyc2lzdGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdFR5cGUoKTsKIAkJCi0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwogCQkKIAkJWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKIAkJeG1sQ2xhc3NSZWYuc2V0SmF2YUNsYXNzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwogCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZCh4bWxDbGFzc1JlZik7CiAJCQotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmKCk7CisJCUNsYXNzUmVmIGNsYXNzUmVmID0gZ2V0U3BlY2lmaWVkQ2xhc3NSZWYoKTsKIAkJCiAJCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCkpOwogCQkKIAkJLy90ZXN0IHNldHRpbmcgdG8gYSBjbGFzcyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBwcm9qZWN0CiAJCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXIiKTsKIAkJCi0JCWNsYXNzUmVmID0gY2xhc3NSZWYoKTsJCQorCQljbGFzc1JlZiA9IGdldFNwZWNpZmllZENsYXNzUmVmKCk7CQkKIAkJYXNzZXJ0TnVsbChjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKSk7CQkKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvSnB0Q29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmluZGV4IDVkZDg3ZDIuLmRhZWViNDcgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCkBAIC0xNywxMiArMTcsOCBAQAogcHVibGljIGNsYXNzIEpwdENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKIHsKIAlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBzdWl0ZSh0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKGJvb2xlYW4gYWxsKSB7CiAJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJvb3RDb250ZXh0VGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUm9vdENvbnRleHROb2RlVGVzdHMuY2xhc3MpOwogCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGVyc2lzdGVuY2VYbWxUZXN0cy5jbGFzcyk7CiAJCXN1aXRlLmFkZFRlc3RTdWl0ZShQZXJzaXN0ZW5jZVRlc3RzLmNsYXNzKTsKIAkJc3VpdGUuYWRkVGVzdFN1aXRlKFBlcnNpc3RlbmNlVW5pdFRlc3RzLmNsYXNzKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9NYXBwaW5nRmlsZVJlZlRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvTWFwcGluZ0ZpbGVSZWZUZXN0cy5qYXZhCmluZGV4IDE4NTRhMTUuLmNhYWRkNmMgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9NYXBwaW5nRmlsZVJlZlRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL01hcHBpbmdGaWxlUmVmVGVzdHMuamF2YQpAQCAtMjQsMTIgKzI0LDEyIEBACiAJfQogCQogCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZigpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdCgpLm1hcHBpbmdGaWxlUmVmcygpLm5leHQoKTsKKwkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdCgpLm1hcHBpbmdGaWxlUmVmcygpLm5leHQoKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUZpbGVOYW1lKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CiAJCQogCQkvLyBhZGQgbWFwcGluZyBmaWxlIHJlZgogCQlYbWxNYXBwaW5nRmlsZVJlZiB4bWxGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwpAQCAtNjIsOCArNjIsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RmlsZU5hbWUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIGFkZCBtYXBwaW5nIGZpbGUgcmVmCiAJCVhtbE1hcHBpbmdGaWxlUmVmIHhtbEZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVGVzdHMuamF2YQppbmRleCA0ZGMzODRhLi41ZmI3M2Q4IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVRlc3RzLmphdmEKQEAgLTEsMjIgKzEsMjEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCiB7CiAJcHVibGljIFBlcnNpc3RlbmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTI0LDEzICsyMywxMiBAQAogCX0KIAkKIAlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UoKSB7Ci0JCXJldHVybiByb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKTsKKwkJcmV0dXJuIGdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFkZFBlcnNpc3RlbmNlVW5pdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVJlc291cmNlIHBybSA9IHBlcnNpc3RlbmNlUmVzb3VyY2UoKTsKLQkJWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UgPSBwcm0uZ2V0UGVyc2lzdGVuY2UoKTsKLQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSByb290Q29udGV4dCgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKTsKKwkJWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UgPSBnZXRYbWxQZXJzaXN0ZW5jZSgpOworCQlQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IGdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKTsKIAkJCiAJCS8vIGNsZWFyIHhtbCBwZXJzaXN0ZW5jZSB1bml0cywgdGVzdCB0aGF0IGl0J3MgY2xlYXIgaW4gY29udGV4dAogCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuY2xlYXIoKTsKQEAgLTUzLDcgKzUxLDcgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeUFkZFBlcnNpc3RlbmNVbml0KCkgewotCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IHhtbFBlcnNpc3RlbmNlKCk7CisJCVhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlID0gZ2V0WG1sUGVyc2lzdGVuY2UoKTsKIAkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZSgpOwogCQkKIAkJLy8gY2xlYXIgeG1sIHBlcnNpc3RlbmNlIHVuaXRzLCB0ZXN0IHRoYXQgaXQncyBjbGVhciBpbiBjb250ZXh0CkBAIC03OCw5ICs3Niw4IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZW1vdmVQZXJzaXN0ZW5jZVVuaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VSZXNvdXJjZSBwcm0gPSBwZXJzaXN0ZW5jZVJlc291cmNlKCk7Ci0JCVhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlID0gcHJtLmdldFBlcnNpc3RlbmNlKCk7Ci0JCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gcm9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCk7CisJCVhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlID0gZ2V0WG1sUGVyc2lzdGVuY2UoKTsKKwkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBnZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCk7CiAJCQogCQkvLyBhZGQgYSBwZXJzaXN0ZW5jZSB1bml0IGFuZCB0ZXN0IHRoYXQgdGhlcmUgYXJlIHR3byBleGlzdGluZyB4bWwgYW5kIAogCQkvLyBvbmUgY29udGV4dCBwZXJzaXN0ZW5jZSB1bml0CkBAIC0xMDcsNyArMTA0LDcgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVJlbW92ZVBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UgPSB4bWxQZXJzaXN0ZW5jZSgpOworCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IGdldFhtbFBlcnNpc3RlbmNlKCk7CiAJCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2UoKTsKIAkJCiAJCS8vIGFkZCBhIHBlcnNpc3RlbmNlIHVuaXQgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIHhtbCBhbmQgCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0VGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMmU4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0VGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDM1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworCisvKioKKyAqICBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc2lzdGVuY2VVbml0VGVzdENhc2UgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUV2ZW50IHByb3BlcnR5Q2hhbmdlZEV2ZW50OworCisJcHJvdGVjdGVkIGludCBwcm9wZXJ0eUNoYW5nZWRFdmVudENvdW50OworCisJcHJvdGVjdGVkIGludCBwcm9wZXJ0aWVzVG90YWw7CisKKwlwcm90ZWN0ZWQgaW50IG1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKKworCXByb3RlY3RlZCBpbnQgbW9kZWxQcm9wZXJ0aWVzU2l6ZTsKKworCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCS8vICoqKioqKiBhYnN0cmFjdCBtZXRob2RzICoqKioqKioKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpOworCisJLyoqCisJICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIENhbm5vdCB1c2UKKwkgKiBQcm9wZXJ0eSBIb2xkZXIgdG8gaW5pdGlhbGl6ZSBiZWNhdXNlIGl0IGlzIG5vdCBjcmVhdGVkIHlldAorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHBvcHVsYXRlUHUoKTsKKworCS8qKgorCSAqIEdldHMgdGhlIG1vZGVsJ3MgcHJvcGVydHkgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcHJvcGVydHlOYW1lLgorCSAqIAorCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKwkgKiAgICAgICAgICAgIG5hbWUgb2YgcHJvcGVydHkgdG8gZ2V0CisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBFeGNlcHRpb247CisKKworCS8qKgorCSAqIFNldHMgdGhlIG1vZGVsJ3MgcHJvcGVydHkgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcHJvcGVydHlOYW1lLgorCSAqIFVzZWQgaW4gdmVyaWZ5U2V0UHJvcGVydHkoKQorCSAqIAorCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKwkgKiAgICAgICAgICAgIG5hbWUgb2YgcHJvcGVydHkgdG8gYmUgc2V0CisJICogQHBhcmFtIG5ld1ZhbHVlCisJICogICAgICAgICAgICB2YWx1ZSBvZiBwcm9wZXJ0eQorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uOworCisJCisJLy8gKioqKioqIGNvbnZlbmllbmNlIHRlc3QgbWV0aG9kcyAqKioqKioqCisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihPYmplY3QgdmFsdWUpIHsKKwkJcmV0dXJuIEFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YodmFsdWUpOworCX0KKworCS8qKgorCSAqIFB1dCBpbnRvIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzLiBEbyBub3QgYWxsb3dzIHRvIHB1dCBkdXBsaWNhdGUgZW50cnkuCisJICogCisJICogQHBhcmFtIGtleSAtCisJICogICAgICAgICAgICBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkga2V5CisJICogQHBhcmFtIHZhbHVlIC0KKwkgKiAgICAgICAgICAgIHByb3BlcnR5IHZhbHVlCisJICovCisJcHJvdGVjdGVkIHZvaWQgcGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7CisJCQorCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCBrZXksIHZhbHVlLCBmYWxzZSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZXMpIHsKKwkJaWYgKGtleSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkga2V5IGNhbm5vdCBiZSBudWxsIik7CisJCX0KKwkJaWYgKHZhbHVlID09IG51bGwpCisJCQl0aGlzLnNldE51bGxQcm9wZXJ0eShrZXkpOworCQllbHNlCisJCQl0aGlzLnB1dFByb3BlcnR5XyhrZXksIHZhbHVlLCBhbGxvd0R1cGxpY2F0ZXMpOworCX0KKworCXByaXZhdGUgdm9pZCBwdXRQcm9wZXJ0eV8oU3RyaW5nIHB1S2V5LCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gYWxsb3dEdXBsaWNhdGVzKSB7CisJCXRoaXMuY2xlYXJFdmVudCgpOworCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnNldFByb3BlcnR5KHB1S2V5LCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZih2YWx1ZSksIGFsbG93RHVwbGljYXRlcyk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0TnVsbFByb3BlcnR5KFN0cmluZyBwdUtleSkgeworCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXRQcm9wZXJ0eShwdUtleSwgbnVsbCwgZmFsc2UpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNsZWFyRXZlbnQoKSB7CisJCXRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnQgPSBudWxsOworCQl0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50Q291bnQgPSAwOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB0aHJvd01pc3NpbmdEZWZpbml0aW9uKFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24geworCQl0aHJvdyBuZXcgTm9TdWNoRmllbGRFeGNlcHRpb24oIk1pc3NpbmcgRGVmaW5pdGlvbiBmb3I6ICIgKyBtZXRob2ROYW1lICsgIiggIiArIHByb3BlcnR5TmFtZSArICIpIik7CisJfQorCisJcHVibGljIHZvaWQgdGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihMaXN0RXZlbnQgZSkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZS5nZXRMaXN0TmFtZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJUGVyc2lzdGVuY2VVbml0VGVzdENhc2UudGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudCA9IGV2ZW50OworCQkJCVBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLnRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnRDb3VudCsrOworCQkJfQorCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJCXJldHVybiAiUGVyc2lzdGVuY2VVbml0IGxpc3RlbmVyIjsKKwkJCX0KKwkJfTsKKwl9CisJCisJLyoqCisJICogVmVyaWZ5IGlmIHRoZSBwcm9wZXJ0eSBleGlzdHMgaW4gdGhlIHBlc2lzdGVuY2UueG1sCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcHJvcGVydHlFeGlzdHMoU3RyaW5nIHB1UHJvcGVydHlOYW1lKSB7CisJCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHB1UHJvcGVydHlOYW1lKSAhPSBudWxsOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIHByb3BlcnR5VmFsdWVFcXVhbHMoU3RyaW5nIHB1UHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgeworCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwdVByb3BlcnR5TmFtZSkuZ2V0VmFsdWUoKS5lcXVhbHMocHJvcGVydHlWYWx1ZSk7CisJfQorCQorCS8vICoqKioqKiB2ZXJpZnkgUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMgKioqKioqKgorCS8qKgorCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KKwkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgorCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgorCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBQVZhbHVlKEJvb2xlYW4gZXhwZWN0ZWRWYWx1ZSwgQm9vbGVhbiBzdWJqZWN0VmFsdWUsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBhYSwgU3RyaW5nIHBlcnNpc3RlbmNlWG1sS2V5KSB7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBzdWJqZWN0VmFsdWUpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgYWEuZ2V0VmFsdWUoKSk7CisJCWlmIChleHBlY3RlZFZhbHVlICE9IG51bGwpIHsKKwkJCWFzc2VydFRydWUoIlBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZSBub3QgZXF1YWxzIiwgdGhpcy5wcm9wZXJ0eVZhbHVlRXF1YWxzKHBlcnNpc3RlbmNlWG1sS2V5LCBleHBlY3RlZFZhbHVlLnRvU3RyaW5nKCkpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KKwkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgorCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgorCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KKwkgKi8KKwlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBFbnVtPFQ+PiB2b2lkIHZlcmlmeUFBVmFsdWUoVCBleHBlY3RlZFZhbHVlLCBUIHN1YmplY3RWYWx1ZSwgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbnVtPFQ+PiBhYSwgU3RyaW5nIHB1S2V5KSB7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBzdWJqZWN0VmFsdWUpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgYWEuZ2V0VmFsdWUoKSk7CisJCWlmIChleHBlY3RlZFZhbHVlICE9IG51bGwpIHsKKwkJCWFzc2VydFRydWUoIlBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZSBub3QgZXF1YWxzIiwgdGhpcy5wcm9wZXJ0eVZhbHVlRXF1YWxzKHB1S2V5LCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihleHBlY3RlZFZhbHVlKSkpOworCQl9CisJfQorCisJLyoqCisJICogUGVyZm9ybXMgdGhlIGZvbGxvd2luZyB0ZXN0czo8YnI+CisJICogMS4gdmVyaWZ5IHRvdGFsIG51bWJlciBvZiBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllczxicj4KKwkgKiAyLiB2ZXJpZnkgUFUgaGFzIHRoZSBnaXZlbiBwcm9wZXJ0eU5hbWU8YnI+CisJICogMy4gdmVyaWZ5IGxpc3RlbmluZyB0byBwcm9wZXJ0eUxpc3RBZGFwdGVyPGJyPgorCSAqIDQuIHZlcmlmeSB0aGF0IHRoZSBtb2RlbCBjYW4gaWRlbnRpZnkgcHJvcGVydHlOYW1lPGJyPgorCSAqLworCXByb3RlY3RlZCB2b2lkIHZlcmlmeUluaXRpYWxTdGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHVLZXksIExpc3RWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscygiVG90YWwgbm90IHVwZGF0ZWQgaW4gcG9wdWxhdGVQdSgpOiAiLCBwcm9wZXJ0eUxpc3RBZGFwdGVyLnNpemUoKSwgdGhpcy5wcm9wZXJ0aWVzVG90YWwpOworCQl0aGlzLnZlcmlmeVB1SGFzUHJvcGVydHkocHVLZXksICJQcm9wZXJ0eSBub3QgYWRkZWQgdG8gcG9wdWxhdGVQdSgpIik7CisJCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHByb3BlcnR5TGlzdEFkYXB0ZXIpOworCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmdldE1vZGVsKCksIHByb3BlcnR5TmFtZSk7CisJCQorCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHB1S2V5KTsKKwkJYXNzZXJ0VHJ1ZSgibW9kZWwuaXRlbUlzUHJvcGVydHkoKSBpcyBmYWxzZTogIiwgZ2V0TW9kZWwoKS5pdGVtSXNQcm9wZXJ0eShwcm9wZXJ0eSkpOworCQlhc3NlcnRFcXVhbHMoInByb3BlcnR5SWRGb3IoKSBub3QgdXBkYXRlZDogIiwgcHJvcGVydHlOYW1lLCBnZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSkpOworCX0KKworCS8qKgorCSAqIFZlcmlmaWVzIHRoYXQgdGhlIHBlcnNpc3RlbmNlIHVuaXQgaXMgcG9wdWxhdGVkLCBhbmQgdGhhdCB0aGUgbW9kZWwgZm9yCisJICogdGhlIHRlc3RlZCBQcm9wZXJ0eSBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSB2YWx1ZSBmcm9tIHRoZSBwZXJzaXN0ZW5jZQorCSAqIHVuaXQuCisJICogQHRocm93cyBFeGNlcHRpb24gCisJICovCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5TW9kZWxJbml0aWFsaXplZChTdHJpbmcgcHVLZXksIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwdUtleSk7CisJCWFzc2VydFRydWUoIm1vZGVsLml0ZW1Jc1Byb3BlcnR5KCkgaXMgZmFsc2U6ICIsIGdldE1vZGVsKCkuaXRlbUlzUHJvcGVydHkocHJvcGVydHkpKTsKKworCQlhc3NlcnRUcnVlKCJQZXJzaXN0ZW5jZVVuaXQgbm90IHBvcHVsYXRlZCAtIHBvcHVsYXRlZFB1KCkiLCB0aGlzLnByb3BlcnR5VmFsdWVFcXVhbHMocHVLZXksIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKGV4cGVjdGVkVmFsdWUpKSk7CisJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdldE1vZGVsKCkucHJvcGVydHlJZE9mKHByb3BlcnR5KTsKKwkJT2JqZWN0IG1vZGVsVmFsdWUgPSB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisJCWFzc2VydEVxdWFscygKKwkJCSJNb2RlbCBub3QgaW5pdGlhbGl6ZWQgLSBtb2RlbC5pbml0aWFsaXplUHJvcGVydGllcygpIC0gbW9kZWxWYWx1ZSA9ICIgKyBtb2RlbFZhbHVlLCAKKwkJCWV4cGVjdGVkVmFsdWUsIAorCQkJbW9kZWxWYWx1ZSk7CisJfQorCisJLyoqCisJICogUGVyZm9ybXMgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIHdpdGggdGhlIHByb3BlcnR5Ojxicj4KKwkgKiAxLiB2ZXJpZmllcyB0aGUgaW5pdGlhbCBzdGF0ZTxicj4KKwkgKiAyLiBwZXJzaXN0ZW5jZVVuaXQgcHV0UHJvcGVydHk8YnI+CisJICogMy4gYWRhcHRlciBzZXRQcm9wZXJ0eTxicj4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRQcm9wZXJ0eShTdHJpbmcgcHVLZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocHVLZXkpOworCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7CisKKwkJLy8gUmVwbGFjZQorCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KHB1S2V5LCB0ZXN0VmFsdWUyKTsKKwkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTIpOworCQkKKwkJLy8gUmVwbGFjZSBieSBzZXR0aW5nIG1vZGVsIG9iamVjdAorCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEpOworCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMSk7CisJfQorCisJLyoqCisJICogUGVyZm9ybXMgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIHdpdGggdGhlIHByb3BlcnR5Ojxicj4KKwkgKiAxLiBwZXJmb3JtcyBhIHJlbW92ZSBvbiB0aGUgUFU8YnI+CisJICogMi4gcGVyZm9ybXMgYSBhZGQgd2l0aCBwdXRQcm9wZXJ0eTxicj4KKwkgKiAzLiBwZXJmb3JtcyBhIHJlcGxhY2Ugd2l0aCBwdXRQcm9wZXJ0eTxicj4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eShTdHJpbmcgcHVLZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocHVLZXkpOworCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7CisKKwkJLy8gUmVtb3ZlCisJCXRoaXMuY2xlYXJFdmVudCgpOworCQktLXRoaXMucHJvcGVydGllc1RvdGFsOworCQktLXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKKwkJdGhpcy52ZXJpZnlQdUhhc1Byb3BlcnR5KHB1S2V5LCAgInBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzIGRvZXNuJ3QgY29udGFpbnM6ICIpOworCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KHB1S2V5KTsKKwkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHB1S2V5KSk7CisJCWFzc2VydEVxdWFscyh0aGlzLm1vZGVsUHJvcGVydGllc1NpemUsIHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsIC0gMSk7CisJCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKKwkJCisJCS8vIEFkZCBvcmlnaW5hbCBDYWNoZVR5cGVEZWZhdWx0CisJCSsrdGhpcy5wcm9wZXJ0aWVzVG90YWw7CisJCSsrdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KHB1S2V5LCB0ZXN0VmFsdWUxKTsKKwkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEpOworCQkKKwkJLy8gUmVwbGFjZQorCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KHB1S2V5LCB0ZXN0VmFsdWUyKTsKKwkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTIpOworCX0KKwkKKwkvKioKKwkgKiBWZXJpZmllcyB0aGUgbW9kZWwncyBwcm9wZXJ0eSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBwcm9wZXJ0eU5hbWUKKwkgKiBVc2VkIGluIHZlcmlmeVNldFByb3BlcnR5KCkgYW5kIHZlcmlmeUFkZFJlbW92ZVByb3BlcnR5CisJICogCisJICogQHBhcmFtIHByb3BlcnR5TmFtZQorCSAqICAgICAgICAgICAgbmFtZSBvZiBwcm9wZXJ0eSB0byBiZSB2ZXJpZmllZAorCSAqIEBwYXJhbSBleHBlY3RlZFZhbHVlCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJdGhpcy52ZXJpZnlQdXRFdmVudChwcm9wZXJ0eU5hbWUsIHRoaXMuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSwgZXhwZWN0ZWRWYWx1ZSk7CisJfQorCisJLyoqCisJICogVmVyaWZpZXMgdGhlIGV2ZW50IG9mIHRoZSBwdXQoKSBhY3Rpb24uCisJICogCisJICogQHBhcmFtIHByb3BlcnR5TmFtZQorCSAqICAgICAgICAgICAgbmFtZSBvZiBwcm9wZXJ0eSB0byBiZSB2ZXJpZmllZAorCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlCisJICogICAgICAgICAgICB2YWx1ZSBvZiBwcm9wZXJ0eQorCSAqIEBwYXJhbSBleHBlY3RlZFZhbHVlCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKKwkJCisJCXRoaXMudmVyaWZ5RXZlbnQocHJvcGVydHlOYW1lKTsKKwkJdGhpcy52ZXJpZnlFdmVudFZhbHVlKHByb3BlcnR5VmFsdWUsIGV4cGVjdGVkVmFsdWUpOworCX0KKworCS8qKgorCSAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgdGVzdHM6PGJyPgorCSAqIDEuIHZlcmlmaWVzIHRoZSBuZXcgdmFsdWUgb2YgdGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudDxicj4KKwkgKiAyLiB2ZXJpZmllcyB0aGUgZ2l2ZW4gdmFsdWU8YnI+CisJICovCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5RXZlbnRWYWx1ZShPYmplY3QgdmFsdWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7CisJCS8vIHZlcmlmeSBldmVudCB2YWx1ZQorCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgdGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudC5nZXROZXdWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIHRlc3RzOjxicj4KKwkgKiAxLiB2ZXJpZmllcyB0aGF0IGFuIGV2ZW50IGlzIGZpcmVkPGJyPgorCSAqIDIuIHZlcmlmaWVzIHRoYXQgaXQgaXMgdGhlIGNvcnJlY3QgZXZlbnQ8YnI+CisJICogMy4gdmVyaWZpZXMgdGhhdCBhIHNpbmdsZSBldmVudCBpcyBmaXJlZDxicj4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAorCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50KTsKKwkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKKwkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50LmdldFByb3BlcnR5TmFtZSgpLCBwcm9wZXJ0eU5hbWUpOworCQkvLyB2ZXJpZnkgZXZlbnQgb2NjdXJyZW5jZQorCQlhc3NlcnRUcnVlKCJObyBFdmVudCBSZWNlaXZlZC4iLCB0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50Q291bnQgPiAwKTsKKwkJYXNzZXJ0VHJ1ZSgiTXVsdGlwbGUgRXZlbnQgUmVjZWl2ZWQgKCIgKyAgdGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudENvdW50ICsgIikiLAorCQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudENvdW50IDwgMik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDw/PiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIG1vZGVsLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IGFkZGVkIGluIHNldFVwKCkgLSAiICsgcHJvcGVydHlOYW1lLCAoKEFic3RyYWN0TW9kZWwpIG1vZGVsKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHB2bSwgU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBwdm0pLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSkpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1SGFzUHJvcGVydHkoU3RyaW5nIHB1UHJvcGVydHlOYW1lLCBTdHJpbmcgbXNnKSB7CisJCWFzc2VydFRydWUobXNnICsgIiAtICIgKyBwdVByb3BlcnR5TmFtZSwgdGhpcy5wcm9wZXJ0eUV4aXN0cyhwdVByb3BlcnR5TmFtZSkpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1SGFzTm90UHJvcGVydHkoU3RyaW5nIHB1UHJvcGVydHlOYW1lLCBTdHJpbmcgbXNnKSB7CisJCWFzc2VydEZhbHNlKG1zZyArICIgLSAiICsgcHVQcm9wZXJ0eU5hbWUsIHRoaXMucHJvcGVydHlFeGlzdHMocHVQcm9wZXJ0eU5hbWUpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFRlc3RzLmphdmEKaW5kZXggMTEzMTRmOS4uOGM0M2I4MiAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTgsMTIgKzE4LDE1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7CkBAIC0zMSwxMCArMzQsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewogCQpAQCAtNTAsOCArNTcsOCBAQAogCX0KIAkJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIHRlc3QgdGhhdCBuYW1lcyBhcmUgaW5pdGlhbGx5IGVxdWFsCiAJCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKQEAgLTc4LDggKzg1LDggQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIHRlc3QgdGhhdCBuYW1lcyBhcmUgaW5pdGlhbGx5IGVxdWFsCiAJCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKQEAgLTEwNiw4ICsxMTMsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHJhbnNhY3Rpb25UeXBlKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CiAJCQogCQkvLyAxIC0gaW5pdGlhbCB2YWx1ZSBpcyBkZWZhdWx0CiAJCWFzc2VydE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldFRyYW5zYWN0aW9uVHlwZSgpKTsKQEAgLTEyOSw4ICsxMzYsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHJhbnNhY3Rpb25UeXBlKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CiAJCQogCQkvLyAxIC0gaW5pdGlhbCB2YWx1ZSBpcyBkZWZhdWx0CiAJCWFzc2VydE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldFRyYW5zYWN0aW9uVHlwZSgpKTsKQEAgLTE1Myw4ICsxNjAsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVzY3JpcHRpb24oKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIHRlc3QgdGhhdCBkZXNjcmlwdGlvbnMgYXJlIGluaXRpYWxseSBlcXVhbAogCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCksIHBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpKTsKQEAgLTE4MSw4ICsxODgsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGVzY3JpcHRpb24oKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIHRlc3QgdGhhdCBkZXNjcmlwdGlvbnMgYXJlIGluaXRpYWxseSBlcXVhbAogCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCksIHBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpKTsKQEAgLTIwOSw4ICsyMTYsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJvdmlkZXIoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIHRlc3QgdGhhdCBwcm92aWRlcnMgYXJlIGluaXRpYWxseSBlcXVhbAogCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpKTsKQEAgLTIzNyw4ICsyNDQsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJvdmlkZXIoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIHRlc3QgdGhhdCBwcm92aWRlcnMgYXJlIGluaXRpYWxseSBlcXVhbAogCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpKTsKQEAgLTI2NSw4ICsyNzIsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSnRhRGF0YVNvdXJjZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7CisJCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwogCQkKIAkJLy8gdGVzdCB0aGF0IGp0YURhdGFTb3VyY2VzIGFyZSBpbml0aWFsbHkgZXF1YWwKIAkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCkpOwpAQCAtMjkzLDggKzMwMCw4IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlKdGFEYXRhU291cmNlKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CiAJCQogCQkvLyB0ZXN0IHRoYXQganRhRGF0YVNvdXJjZXMgYXJlIGluaXRpYWxseSBlcXVhbAogCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSk7CkBAIC0zMjEsOCArMzI4LDggQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5vbkp0YURhdGFTb3VyY2UoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIHRlc3QgdGhhdCBub25KdGFEYXRhU291cmNlcyBhcmUgaW5pdGlhbGx5IGVxdWFsCiAJCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpKTsKQEAgLTM0OSw4ICszNTYsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Tm9uSnRhRGF0YVNvdXJjZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7CisJCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwogCQkKIAkJLy8gdGVzdCB0aGF0IG5vbkp0YURhdGFTb3VyY2VzIGFyZSBpbml0aWFsbHkgZXF1YWwKIAkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCkpOwpAQCAtMzg1LDI3ICszOTIsMjcgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUltcGxpZWRNYXBwaW5nRmlsZVJlZjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CiAJCQogCQkvLyB0ZXN0IHRoYXQgdGhlcmUgaXMgb25lIGluaXRpYWxseQotCQlPcm1SZXNvdXJjZSBvcm1SZXNvdXJjZSA9IG9ybVJlc291cmNlKCk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UuZXhpc3RzKCkpOworCQlKcGFYbWxSZXNvdXJjZSBvcm1SZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKCk7CisJCWFzc2VydFRydWUob3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKIAkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwogCQkKIAkJLy8gcmVtb3ZlIG9ybS54bWwKIAkJZGVsZXRlUmVzb3VyY2Uob3JtUmVzb3VyY2UpOwogCQkKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UuZXhpc3RzKCkpOworCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZS5maWxlRXhpc3RzKCkpOwogCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJbXBsaWVkTWFwcGluZ0ZpbGVSZWYyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CiAJCQogCQkvLyB0ZXN0IHRoYXQgdGhlcmUgaXMgb25lIGluaXRpYWxseQotCQlPcm1SZXNvdXJjZSBvcm1SZXNvdXJjZSA9IG9ybVJlc291cmNlKCk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UuZXhpc3RzKCkpOworCQlKcGFYbWxSZXNvdXJjZSBvcm1SZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKCk7CisJCWFzc2VydFRydWUob3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKIAkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwogCQkKIAkJLy8gYWRkIHNwZWNpZmllZCBvcm0ueG1sCkBAIC00MTMsMTUgKzQyMCwxNSBAQAogCQl4bWxNYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZSgiTUVUQS1JTkYvb3JtLnhtbCIpOwogCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKHhtbE1hcHBpbmdGaWxlUmVmKTsKIAkJCi0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCkpOwogCQkKLQkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZS5leGlzdHMoKSk7CisJCWFzc2VydFRydWUob3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzMSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7CisJCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwogCQkKIAkJLy8gdGVzdCB0aGVyZSBhcmUgbm9uZSBpbml0aWFsbHkKIAkJYXNzZXJ0RXF1YWxzKDAsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5zaXplKCkpOwpAQCAtNDMyLDE5ICs0MzksMTkgQEAKIAkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoIm9ybS54bWwiKTsKIAkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxNYXBwaW5nRmlsZVJlZik7CiAJCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpKSk7CisJCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpKTsKIAkJCiAJCS8vIGFkZCBhbm90aGVyIC4uLgogCQl4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKIAkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoIm9ybTIueG1sIik7CiAJCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoeG1sTWFwcGluZ0ZpbGVSZWYpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSkpOworCQlhc3NlcnRFcXVhbHMoMiwgcGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CiAJCQogCQkvLyBhZGQgdHdvIG1hcHBpbmcgZmlsZSByZWZzIGFuZCB0ZXN0IHRoYXQgdGhlcmUgYXJlIHR3byBleGlzdGluZyBpbiB4bWwgYW5kIGNvbnRleHQKIAkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CkBAIC00NTUsMjggKzQ2MiwyOCBAQAogCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKHhtbE1hcHBpbmdGaWxlUmVmKTsKIAkJCiAJCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuc2l6ZSgpLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSkpOworCQlhc3NlcnRFcXVhbHMoMiwgcGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKSk7CiAJCQogCQkvLyByZW1vdmUgbWFwcGluZyBmaWxlIHJlZiBmcm9tIHhtbCwgdGVzdCB0aGF0IGl0J3MgcmVtb3ZlZCBmcm9tIGNvbnRleHQKIAkJeG1sTWFwcGluZ0ZpbGVSZWYgPSB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuZ2V0KDApOwogCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkucmVtb3ZlKHhtbE1hcHBpbmdGaWxlUmVmKTsKIAkJCi0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCkpOwogCQkKIAkJLy8gcmVtb3ZlIGFub3RoZXIgb25lIC4uLgogCQl4bWxNYXBwaW5nRmlsZVJlZiA9IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5nZXQoMCk7CiAJCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5yZW1vdmUoeG1sTWFwcGluZ0ZpbGVSZWYpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSkpOworCQlhc3NlcnRFcXVhbHMoMCwgcGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMxKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CiAJCQogCQkvLyB0ZXN0IHRoZXJlIGFyZSBub25lIGluaXRpYWxseQogCQlhc3NlcnRFcXVhbHMoMCwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCkpOwogCQkKIAkJLy8gYWRkIG1hcHBpbmcgZmlsZSByZWYsIHRlc3QgdGhhdCBpdCdzIGFkZGVkIHRvIHJlc291cmNlCiAJCXBlcnNpc3RlbmNlVW5pdC5hZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZigpLnNldEZpbGVOYW1lKCJmb28iKTsKQEAgLTUwMCw4ICs1MDcsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzMigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7CisJCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwogCQkKIAkJLy8gYWRkIHR3byBtYXBwaW5nIGZpbGUgcmVmcyBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSB0d28gZXhpc3RpbmcgaW4geG1sIGFuZCBjb250ZXh0CiAJCVhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwpAQCAtNTEyLDcgKzUxOSw3IEBACiAJCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoeG1sTWFwcGluZ0ZpbGVSZWYpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKDIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpKSk7CisJCWFzc2VydEVxdWFscygyLCBwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpKTsKIAkJCiAJCS8vIHJlbW92ZSBtYXBwaW5nIGZpbGUgcmVmIGZyb20gY29udGV4dCwgdGVzdCB0aGF0IGl0J3MgcmVtb3ZlZCBmcm9tIHhtbAogCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoMCk7CkBAIC01MjYsOCArNTMzLDggQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNsYXNzUmVmczEoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIHRlc3QgdGhlcmUgYXJlIG5vbmUgaW5pdGlhbGx5CiAJCWFzc2VydEVxdWFscygwLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnNpemUoKSk7CkBAIC01NDksOCArNTU2LDggQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNsYXNzUmVmczIoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIGFkZCB0d28gY2xhc3MgcmVmcyBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSB0d28gZXhpc3RpbmcgaW4geG1sIGFuZCBjb250ZXh0CiAJCVhtbEphdmFDbGFzc1JlZiB4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7CkBAIC01NjEsMjQgKzU2OCwyNCBAQAogCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZCh4bWxDbGFzc1JlZik7CiAJCQogCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZENsYXNzUmVmcygpKSk7CisJCWFzc2VydEVxdWFscygyLCBwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKIAkJCiAJCS8vIHJlbW92ZSBjbGFzcyByZWYgZnJvbSB4bWwsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSBjb250ZXh0CiAJCXhtbENsYXNzUmVmID0geG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5nZXQoMCk7CiAJCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkucmVtb3ZlKHhtbENsYXNzUmVmKTsKIAkJCi0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVkQ2xhc3NSZWZzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRDbGFzc1JlZnNTaXplKCkpOwogCQkKIAkJLy8gcmVtb3ZlIGFub3RoZXIgb25lIC4uLgogCQl4bWxDbGFzc1JlZiA9IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuZ2V0KDApOwogCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnJlbW92ZSh4bWxDbGFzc1JlZik7CiAJCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZENsYXNzUmVmcygpKSk7CisJCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNsYXNzUmVmczEoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIHRlc3QgdGhlcmUgYXJlIG5vbmUgaW5pdGlhbGx5CiAJCWFzc2VydEVxdWFscygwLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnNpemUoKSk7CkBAIC01ODgsNyArNTk1LDcgQEAKIAkJcGVyc2lzdGVuY2VVbml0LmFkZFNwZWNpZmllZENsYXNzUmVmKCkuc2V0Q2xhc3NOYW1lKCJGb28iKTsKIAkJCiAJCXRyeSB7Ci0JCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwogCQl9CiAJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCkBAIC02MTQsOCArNjIxLDggQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNsYXNzUmVmczIoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIGFkZCB0d28gY2xhc3MgcmVmcyBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSB0d28gZXhpc3RpbmcgaW4geG1sIGFuZCBjb250ZXh0CiAJCVhtbEphdmFDbGFzc1JlZiB4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7CkBAIC02MjYsNyArNjMzLDcgQEAKIAkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoeG1sQ2xhc3NSZWYpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKDIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRDbGFzc1JlZnMoKSkpOworCQlhc3NlcnRFcXVhbHMoMiwgcGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZENsYXNzUmVmc1NpemUoKSk7CiAJCQogCQkvLyByZW1vdmUgY2xhc3MgcmVmIGZyb20gY29udGV4dCwgdGVzdCB0aGF0IGl0J3MgcmVtb3ZlZCBmcm9tIHhtbAogCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWYoMCk7CkBAIC02MzksNTMgKzY0Niw3NyBAQAogCQlhc3NlcnRFcXVhbHMoMCwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5zaXplKCkpOwogCX0KIAotCXB1YmxpYyB2b2lkIHRlc3RJbXBsaWVkQ2xhc3NSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdEltcGxpZWRDbGFzc1JlZnMxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUGVyc2lzdGVudElubmVyQ2xhc3MoKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBjbGFzc1JlZnMubmV4dCgpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9JTk5FUl9DTEFTU19OQU1FLCBjbGFzc1JlZnMubmV4dCgpLmdldENsYXNzTmFtZSgpKTsKIAkJCi0JCWpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKHRydWUpOwotCQljbGFzc1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCk7CisJCWdldEpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKGZhbHNlKTsKKwkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3Nlcyh0cnVlKTsKKwkJSXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKTsKKwkJYXNzZXJ0RmFsc2UoY2xhc3NSZWZzLmhhc05leHQoKSk7CisJCQorCQlnZXRKcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyh0cnVlKTsKKwkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhmYWxzZSk7CisJCWNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKTsKIAkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIGNsYXNzUmVmcy5uZXh0KCkuZ2V0Q2xhc3NOYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUsIGNsYXNzUmVmcy5uZXh0KCkuZ2V0Q2xhc3NOYW1lKCkpOwogCQkKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKTsKKwkJY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpOwogCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUsIGNsYXNzUmVmcy5uZXh0KCkuZ2V0Q2xhc3NOYW1lKCkpOwogCQlhc3NlcnRGYWxzZShjbGFzc1JlZnMuaGFzTmV4dCgpKTsKIAkJCi0JCQogCQlyZW1vdmVYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpOworCQljbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCk7CiAJCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfSU5ORVJfQ0xBU1NfTkFNRSwgY2xhc3NSZWZzLm5leHQoKS5nZXRDbGFzc05hbWUoKSk7CiAJCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBjbGFzc1JlZnMubmV4dCgpLmdldENsYXNzTmFtZSgpKTsKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljbGFzc1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQljbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCk7CiAJCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfSU5ORVJfQ0xBU1NfTkFNRSwgY2xhc3NSZWZzLm5leHQoKS5nZXRDbGFzc05hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGNsYXNzUmVmcy5oYXNOZXh0KCkpOwogCQkKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUpOwotCQljbGFzc1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCk7CisJCWNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKTsKIAkJYXNzZXJ0RmFsc2UoY2xhc3NSZWZzLmhhc05leHQoKSk7CiAJCQogCQlyZW1vdmVYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfSU5ORVJfQ0xBU1NfTkFNRSk7Ci0JCWNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKTsKKwkJY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpOwogCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUsIGNsYXNzUmVmcy5uZXh0KCkuZ2V0Q2xhc3NOYW1lKCkpOwogCQlhc3NlcnRGYWxzZShjbGFzc1JlZnMuaGFzTmV4dCgpKTsKIAotCQllbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfSU5ORVJfQ0xBU1NfTkFNRSk7Ci0JCWNsYXNzUmVmcyA9IHBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUpOworCQljbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCk7CiAJCWFzc2VydEZhbHNlKGNsYXNzUmVmcy5oYXNOZXh0KCkpOwogCX0KIAkKKwlwdWJsaWMgdm9pZCB0ZXN0SW1wbGllZENsYXNzUmVmczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlnZXRKcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyh0cnVlKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgamF2YVR5cGUgPSAKKwkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0UGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpKSk7CisJCQorCQlqYXZhVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0UGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpKSk7CisJCQorCQlqYXZhVHlwZS5hZGRBbm5vdGF0aW9uKEpQQS5FTUJFRERBQkxFKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldFBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKSkpOworCQkKKwkJamF2YVR5cGUucmVtb3ZlQW5ub3RhdGlvbihKUEEuRU1CRUREQUJMRSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRQZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCkpKTsKKwkJCisJCWphdmFUeXBlLmFkZEFubm90YXRpb24oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldFBlcnNpc3RlbmNlVW5pdCgpLmltcGxpZWRDbGFzc1JlZnMoKSkpOworCX0KKwkKIAlwdWJsaWMgdm9pZCB0ZXN0UmVuYW1lUGVyc2lzdGVudFR5cGVJbXBsaWVkQ2xhc3NSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWdldEphdmFQcm9qZWN0KCkuZ2V0SnBhUHJvamVjdCgpLnNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXModHJ1ZSk7CiAJCUlDb21waWxhdGlvblVuaXQgdGVzdFR5cGUgPSBjcmVhdGVUZXN0RW50aXR5KCk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogCQlJQ29tcGlsYXRpb25Vbml0IG90aGVyVGVzdFR5cGUgPSB0aGlzLmNyZWF0ZVRlc3RPdGhlclR5cGVFbnRpdHkoKTsKIAkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpOworCQlJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpOwogCQlDbGFzc1JlZiB0ZXN0VHlwZUNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKIAkJQ2xhc3NSZWYgb3RoZXJUZXN0VHlwZUNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKIAkJCkBAIC02OTcsNyArNzI4LDcgQEAKIAkJCiAJCXRlc3RUeXBlLmZpbmRQcmltYXJ5VHlwZSgpLnJlbmFtZSgiVGVzdFR5cGUyIiwgZmFsc2UsIG51bGwpOwogCQkKLQkJY2xhc3NSZWZzID0gcGVyc2lzdGVuY2VVbml0KCkuaW1wbGllZENsYXNzUmVmcygpOworCQljbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5pbXBsaWVkQ2xhc3NSZWZzKCk7CiAJCW90aGVyVGVzdFR5cGVDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7CiAJCXRlc3RUeXBlQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwogCQkKQEAgLTcwOSw3NyArNzQwLDc3IEBACiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIDEgLSBpbml0aWFsIHZhbHVlIGlzIGRlZmF1bHQKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0LmlzRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0LmV4Y2x1ZGVzVW5saXN0ZWRDbGFzc2VzKCkpOwogCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwogCQkKIAkJLy8gMiAtIHNldCB2YWx1ZSwgY29udGV4dCBjaGFuZ2VkCiAJCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKEJvb2xlYW4uVFJVRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXQuaXNFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdC5leGNsdWRlc1VubGlzdGVkQ2xhc3NlcygpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7CiAJCQogCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhCb29sZWFuLkZBTFNFKTsKIAkJCiAJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0LmlzRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0LmV4Y2x1ZGVzVW5saXN0ZWRDbGFzc2VzKCkpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7CiAJCQogCQkvLyAzIC0gdW5zZXQgdmFsdWUsIGNvbnRleHQgY2hhbmdlZAogCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhudWxsKTsKIAkJCiAJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdC5pc0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdC5leGNsdWRlc1VubGlzdGVkQ2xhc3NlcygpKTsKIAkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeUV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIDEgLSBpbml0aWFsIHZhbHVlIGlzIGRlZmF1bHQKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0LmlzRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0LmV4Y2x1ZGVzVW5saXN0ZWRDbGFzc2VzKCkpOwogCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwogCQkKIAkJLy8gMiAtIHNldCB2YWx1ZSwgcmVzb3VyY2UgY2hhbmdlZAogCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhCb29sZWFuLlRSVUUpOwogCQkKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0LmlzRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXQuZXhjbHVkZXNVbmxpc3RlZENsYXNzZXMoKSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwogCQkKIAkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoQm9vbGVhbi5GQUxTRSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdC5pc0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdC5leGNsdWRlc1VubGlzdGVkQ2xhc3NlcygpKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwogCQkKIAkJLy8gMyAtIHNldCBjb250ZXh0IHRvIGRlZmF1bHQsIHJlc291cmNlIHVuc2V0CiAJCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKG51bGwpOwogCQkKIAkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0LmlzRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0LmV4Y2x1ZGVzVW5saXN0ZWRDbGFzc2VzKCkpOwogCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJvcGVydGllczEoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIHRlc3QgdGhlcmUgYXJlIG5vbmUgaW5pdGlhbGx5CiAJCWFzc2VydE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllcygpKSk7CisJCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllc1NpemUoKSk7CiAJCQogCQkvLyBhZGQgInByb3BlcnRpZXMiLCB0ZXN0IHRoYXQgdGhlcmUncyBubyByZWFsIGNoYW5nZSB0byBjb250ZXh0CiAJCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydGllcygpOwogCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydGllcyh4bWxQcm9wZXJ0aWVzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzU2l6ZSgpKTsKIAkJCiAJCS8vIGFkZCBwcm9wZXJ0eSwgdGVzdCB0aGF0IGl0J3MgYWRkZWQgdG8gY29udGV4dAogCQlYbWxQcm9wZXJ0eSB4bWxQcm9wZXJ0eSA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydHkoKTsKQEAgLTc4Nyw3ICs4MTgsNyBAQAogCQl4bWxQcm9wZXJ0eS5zZXRWYWx1ZSgiYmFyIik7CiAJCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZCh4bWxQcm9wZXJ0eSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnByb3BlcnRpZXMoKSkpOworCQlhc3NlcnRFcXVhbHMoMSwgcGVyc2lzdGVuY2VVbml0LnByb3BlcnRpZXNTaXplKCkpOwogCQkKIAkJLy8gYWRkIGFub3RoZXIgLi4uCiAJCXhtbFByb3BlcnR5ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0eSgpOwpAQCAtNzk1LDEyICs4MjYsMTIgQEAKIAkJeG1sUHJvcGVydHkuc2V0VmFsdWUoIkJBUiIpOwogCQl4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5hZGQoeG1sUHJvcGVydHkpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByb3BlcnRpZXMyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CiAJCQogCQkvLyBhZGQgdHdvIHByb3BlcnRpZXMgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAogCQlYbWxQcm9wZXJ0aWVzIHhtbFByb3BlcnRpZXMgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnRpZXMoKTsKQEAgLTgxNSwyNCArODQ2LDI0IEBACiAJCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZCh4bWxQcm9wZXJ0eSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzU2l6ZSgpKTsKIAkJCiAJCS8vIHJlbW92ZSBwcm9wZXJ0eSBmcm9tIHhtbCwgdGVzdCB0aGF0IGl0J3MgcmVtb3ZlZCBmcm9tIGNvbnRleHQKIAkJeG1sUHJvcGVydHkgPSB4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoMCk7CiAJCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLnJlbW92ZSh4bWxQcm9wZXJ0eSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnByb3BlcnRpZXMoKSkpOworCQlhc3NlcnRFcXVhbHMoMSwgcGVyc2lzdGVuY2VVbml0LnByb3BlcnRpZXNTaXplKCkpOwogCQkKIAkJLy8gcmVtb3ZlIGFub3RoZXIgb25lIC4uLgogCQl4bWxQcm9wZXJ0eSA9IHhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldCgwKTsKIAkJeG1sUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKHhtbFByb3BlcnR5KTsKIAkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllcygpKSk7CisJCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllc1NpemUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcm9wZXJ0aWVzMSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7CisJCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwogCQkKIAkJLy8gdGVzdCB0aGVyZSBhcmUgbm9uZSBpbml0aWFsbHkKIAkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpKTsKQEAgLTg2Miw4ICs4OTMsOCBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJvcGVydGllczIoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIGFkZCB0d28gcHJvcGVydGllcyBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSB0d28gZXhpc3RpbmcgaW4geG1sIGFuZCBjb250ZXh0CiAJCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydGllcygpOwpAQCAtODc4LDcgKzkwOSw3IEBACiAJCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZCh4bWxQcm9wZXJ0eSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzU2l6ZSgpKTsKIAkJCiAJCS8vIHJlbW92ZSBwcm9wZXJ0eSBmcm9tIGNvbnRleHQsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSByZXNvdXJjZQogCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlUHJvcGVydHkoImZvbyIpOwpAQCAtODkyLDE1ICs5MjMsMTUgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVByb3BlcnRpZXMzKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CiAJCQogCQkvLyBhZGQgdHdvIHByb3BlcnRpZXMgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAotCQlwZXJzaXN0ZW5jZVVuaXQucHV0UHJvcGVydHkoImZvbyIsICJiYXIiLCBmYWxzZSk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5wdXRQcm9wZXJ0eSgiRk9PIiwgIkJBUiIsIGZhbHNlKTsKKwkJcGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnR5KCJmb28iLCAiYmFyIiwgZmFsc2UpOworCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydHkoIkZPTyIsICJCQVIiLCBmYWxzZSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzU2l6ZSgpKTsKIAkJCiAJCS8vIHJlbW92ZSBwcm9wZXJ0eSBmcm9tIGNvbnRleHQsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSByZXNvdXJjZQogCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlUHJvcGVydHkoImZvbyIsICJiYXIiKTsKQEAgLTkxNCwxNzcgKzk0NSwyMTQgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeVByb3BlcnRpZXM0KCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CiAJCQogCQkvLyBhZGQgdHdvIHByb3BlcnRpZXMgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAotCQlwZXJzaXN0ZW5jZVVuaXQucHV0UHJvcGVydHkoImZvbyIsICJiYXIiLCBmYWxzZSk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5wdXRQcm9wZXJ0eSgiRk9PIiwgIkJBUiIsIGZhbHNlKTsKKwkJcGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnR5KCJmb28iLCAiYmFyIiwgZmFsc2UpOworCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydHkoIkZPTyIsICJCQVIiLCBmYWxzZSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDIsIHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzU2l6ZSgpKTsKIAkJCiAJCS8vIG1vZGlmeSBhIHByb3BlcnR5LCB0ZXN0IGl0cyB2YWx1ZQotCQlwZXJzaXN0ZW5jZVVuaXQucHV0UHJvcGVydHkoImZvbyIsICIiLCBmYWxzZSk7CisJCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0eSgiZm9vIiwgIiIsIGZhbHNlKTsKIAkJYXNzZXJ0RXF1YWxzKCIiLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydHkoImZvbyIpLmdldFZhbHVlKCkpOwogCi0JCXBlcnNpc3RlbmNlVW5pdC5wdXRQcm9wZXJ0eSgiZm9vIiwgIkJBUiIsIGZhbHNlKTsKKwkJcGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnR5KCJmb28iLCAiQkFSIiwgZmFsc2UpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0eSgiZm9vIikuZ2V0VmFsdWUoKSk7CiAJCQotCQkvLyByZW1vdmUgcHJvcGVydHkgdGhhdCBkb2Vzbid0IGZyb20gY29udGV4dCwgdGVzdCB0aGF0IHRoZSByZXNvdXJjZSBpcyB1bmNoYW5nZWQKLQkJcGVyc2lzdGVuY2VVbml0LnJlbW92ZVByb3BlcnR5KCJub3RFeGlzdCIpOwotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJCiAJCS8vIHJlbW92ZSBwcm9wZXJ0eSBmcm9tIGNvbnRleHQsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSByZXNvdXJjZQogCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlUHJvcGVydHkoIkZPTyIpOwogCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0eSgiRk9PIikpOwogCQlhc3NlcnRFcXVhbHMoMSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKIAogCQkvLyByZW1vdmUgYnkgc2V0dGluZyB2YWx1ZSB0byBudWxsLCB0ZXN0IHRoYXQgcHJvcGVydGllcyBvYmplY3QgaXMgbnVsbGVkCi0JCXBlcnNpc3RlbmNlVW5pdC5wdXRQcm9wZXJ0eSgibm90RXhpc3QiLCBudWxsLCBmYWxzZSk7CisJCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0eSgibm90RXhpc3QiLCBudWxsLCBmYWxzZSk7CiAJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnR5KCJub3RFeGlzdCIpKTsKIAotCQlwZXJzaXN0ZW5jZVVuaXQucHV0UHJvcGVydHkoImZvbyIsIG51bGwsIGZhbHNlKTsKKwkJcGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnR5KCJmb28iLCBudWxsLCBmYWxzZSk7CiAJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnR5KCJmb28iKSk7CiAJCWFzc2VydE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcm9wZXJ0aWVzNSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7CisJCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwogCQkKIAkJLy8gdGVzdGluZyBkdXBsaWNhdGUga2V5cywgYWRkIGZvdXIgcHJvcGVydGllcyBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSBmb3VyIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAotCQlwZXJzaXN0ZW5jZVVuaXQucHV0UHJvcGVydHkoIkZPTyIsICJCQVIiLCBmYWxzZSk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5wdXRQcm9wZXJ0eSgiZm9vIiwgImJhciAzIiwgdHJ1ZSk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5wdXRQcm9wZXJ0eSgiZm9vIiwgImJhciAyIiwgdHJ1ZSk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5wdXRQcm9wZXJ0eSgiZm9vIiwgImJhciAxIiwgdHJ1ZSk7CisJCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0eSgiRk9PIiwgIkJBUiIsIGZhbHNlKTsKKwkJcGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnR5KCJmb28iLCAiYmFyIDMiLCB0cnVlKTsKKwkJcGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnR5KCJmb28iLCAiYmFyIDIiLCB0cnVlKTsKKwkJcGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnR5KCJmb28iLCAiYmFyIDEiLCB0cnVlKTsKIAkJCiAJCWFzc2VydEVxdWFscyg0LCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnByb3BlcnRpZXMoKSkpOworCQlhc3NlcnRFcXVhbHMoNCwgcGVyc2lzdGVuY2VVbml0LnByb3BlcnRpZXNTaXplKCkpOwogCQkKLQkJLy8gbW9kaWZ5IGEgcHJvcGVydHksIHRlc3QgaXRzIHZhbHVlCi0JCXBlcnNpc3RlbmNlVW5pdC5yZXBsYWNlUHJvcGVydHlWYWx1ZSgiZm9vIiwgImJhciAyIiwgImJhciB0d28iKTsKLQkJCi0JCVByb3BlcnR5IHByb3BlcnR5ID0gcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnR5KCJmb28iLCAiYmFyIHR3byIpOwotCQlhc3NlcnRFcXVhbHMoImJhciB0d28iLCBwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLQogCQkvLyByZW1vdmUgYSBwcm9wZXJ0eSwgdGVzdCB0aGF0IHRoZXJlIGFyZSBmb3VyIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAogCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlUHJvcGVydHkoImZvbyIsICJiYXIgMSIpOwogCQlhc3NlcnRFcXVhbHMoMywgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzU2l6ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEFjY2Vzc1Byb3BlcnR5KCkgewotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIGFkZCB0d28gcHJvcGVydGllcyBhbmQgdHJ5IHRvIGFjY2VzcyBpdC4KLQkJcGVyc2lzdGVuY2VVbml0LnB1dFByb3BlcnR5KCJmb28iLCAiYmFyIiwgZmFsc2UpOwotCQlwZXJzaXN0ZW5jZVVuaXQucHV0UHJvcGVydHkoIkZPTyIsICJCQVIiLCBmYWxzZSk7CisJCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0eSgiZm9vIiwgImJhciIsIGZhbHNlKTsKKwkJcGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnR5KCJGT08iLCAiQkFSIiwgZmFsc2UpOwogCQkKLQkJUHJvcGVydHkgcHJvcGVydHkgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydHkoImZvbyIpOworCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydHkoImZvbyIpOwogCQlhc3NlcnROb3ROdWxsKHByb3BlcnR5KTsKIAkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXQuY29udGFpbnNQcm9wZXJ0eSgiRk9PIikpOworCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0eSgiRk9PIikpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0eSgiRk9PIikuZ2V0VmFsdWUoKSk7CiAJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnR5KCJub3RFeGlzdCIpKTsKIAl9CiAJCisJcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcGVyc2lzdGVuY2VVbml0Rmlyc3RQcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdCgpLnByb3BlcnRpZXMoKS5uZXh0KCk7CisJfQorCiAJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByb3BlcnR5TmFtZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IHhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7CisJCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJCiAJCS8vIGFkZCBwcm9wZXJ0eSBmb3IgdGVzdGluZwogCQlYbWxQcm9wZXJ0aWVzIHhtbFByb3BlcnRpZXMgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnRpZXMoKTsKIAkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnRpZXMoeG1sUHJvcGVydGllcyk7CiAJCVhtbFByb3BlcnR5IHhtbFByb3BlcnR5ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0eSgpOwogCQl4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5hZGQoeG1sUHJvcGVydHkpOwotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IHBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzKCkubmV4dCgpOwogCQkKIAkJLy8gdGVzdCB0aGF0IG5hbWVzIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldE5hbWUoKSwgcGVyc2lzdGVuY2VVbml0Rmlyc3RQcm9wZXJ0eSgpLmdldE5hbWUoKSk7CiAJCQogCQkvLyBzZXQgbmFtZSB0byBkaWZmZXJlbnQgbmFtZSwgdGVzdCBlcXVhbGl0eQogCQl4bWxQcm9wZXJ0eS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUHJvcGVydHkuZ2V0TmFtZSgpLCBwcm9wZXJ0eS5nZXROYW1lKCkpOworCisJCWFzc2VydEVxdWFscyh4bWxQcm9wZXJ0eS5nZXROYW1lKCksIHBlcnNpc3RlbmNlVW5pdEZpcnN0UHJvcGVydHkoKS5nZXROYW1lKCkpOwogCQkKIAkJLy8gc2V0IG5hbWUgdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5CiAJCXhtbFByb3BlcnR5LnNldE5hbWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIHRvIG51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUHJvcGVydHkuc2V0TmFtZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQcm9wZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5LmdldE5hbWUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldE5hbWUoKSwgcGVyc2lzdGVuY2VVbml0Rmlyc3RQcm9wZXJ0eSgpLmdldE5hbWUoKSk7CiAJCQogCQkvLyBzZXQgbmFtZSBiYWNrIHRvIG5vbi1udWxsLCB0ZXN0IGVxdWFsaXR5CiAJCXhtbFByb3BlcnR5LnNldE5hbWUoIm5ld05hbWUiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQcm9wZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5LmdldE5hbWUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldE5hbWUoKSwgcGVyc2lzdGVuY2VVbml0Rmlyc3RQcm9wZXJ0eSgpLmdldE5hbWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcm9wZXJ0eVZhbHVlKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQoKTsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwogCQkKIAkJLy8gYWRkIHByb3BlcnR5IGZvciB0ZXN0aW5nCiAJCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydGllcygpOwogCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydGllcyh4bWxQcm9wZXJ0aWVzKTsKIAkJWG1sUHJvcGVydHkgeG1sUHJvcGVydHkgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnR5KCk7CiAJCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZCh4bWxQcm9wZXJ0eSk7Ci0JCVByb3BlcnR5IHByb3BlcnR5ID0gcGVyc2lzdGVuY2VVbml0LnByb3BlcnRpZXMoKS5uZXh0KCk7CiAJCQogCQkvLyB0ZXN0IHRoYXQgdmFsdWVzIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldFZhbHVlKCksIHByb3BlcnR5LmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoeG1sUHJvcGVydHkuZ2V0VmFsdWUoKSwgcGVyc2lzdGVuY2VVbml0Rmlyc3RQcm9wZXJ0eSgpLmdldFZhbHVlKCkpOwogCQkKIAkJLy8gc2V0IHZhbHVlIHRvIGRpZmZlcmVudCB2YWx1ZSwgdGVzdCBlcXVhbGl0eQogCQl4bWxQcm9wZXJ0eS5zZXRWYWx1ZSgibmV3VmFsdWUiKTsKIAkJCi0JCWFzc2VydEVxdWFscyh4bWxQcm9wZXJ0eS5nZXRWYWx1ZSgpLCBwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldFZhbHVlKCksIHBlcnNpc3RlbmNlVW5pdEZpcnN0UHJvcGVydHkoKS5nZXRWYWx1ZSgpKTsKIAkJCiAJCS8vIHNldCB2YWx1ZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKIAkJeG1sUHJvcGVydHkuc2V0VmFsdWUoIiIpOwogCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldFZhbHVlKCksIHByb3BlcnR5LmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoeG1sUHJvcGVydHkuZ2V0VmFsdWUoKSwgcGVyc2lzdGVuY2VVbml0Rmlyc3RQcm9wZXJ0eSgpLmdldFZhbHVlKCkpOwogCQkKIAkJLy8gc2V0IHZhbHVlIHRvIG51bGwsIHRlc3QgZXF1YWxpdHkKIAkJeG1sUHJvcGVydHkuc2V0VmFsdWUobnVsbCk7CiAJCQotCQlhc3NlcnRFcXVhbHMoeG1sUHJvcGVydHkuZ2V0VmFsdWUoKSwgcHJvcGVydHkuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyh4bWxQcm9wZXJ0eS5nZXRWYWx1ZSgpLCBwZXJzaXN0ZW5jZVVuaXRGaXJzdFByb3BlcnR5KCkuZ2V0VmFsdWUoKSk7CiAJCQogCQkvLyBzZXQgdmFsdWUgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQogCQl4bWxQcm9wZXJ0eS5zZXRWYWx1ZSgibmV3VmFsdWUiKTsKIAkJCi0JCWFzc2VydEVxdWFscyh4bWxQcm9wZXJ0eS5nZXRWYWx1ZSgpLCBwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCisJCWFzc2VydEVxdWFscyh4bWxQcm9wZXJ0eS5nZXRWYWx1ZSgpLCBwZXJzaXN0ZW5jZVVuaXRGaXJzdFByb3BlcnR5KCkuZ2V0VmFsdWUoKSk7CisJfQkKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVPcm1YbWxGaWxlKCk7CQkKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdCgpOworCQlhZGRYbWxNYXBwaW5nRmlsZVJlZihKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOworCQljcmVhdGVPcm0yWG1sRmlsZSgpOworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCUxpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gbWFwcGluZ0ZpbGVSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkubWFwcGluZ0ZpbGVSZWZzKCk7CisJCU9ybVhtbCBvcm1NYXBwaW5nRmlsZSA9IChPcm1YbWwpIG1hcHBpbmdGaWxlUmVmcy5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKTsKKwkJT3JtWG1sIG9ybTJNYXBwaW5nRmlsZSA9IChPcm1YbWwpIG1hcHBpbmdGaWxlUmVmcy5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKTsKIAkJCi0JCWVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcGVyc2lzdGVuY2VVbml0LmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCQorCQlvcm1NYXBwaW5nRmlsZS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CQkKIAkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHBlcnNpc3RlbmNlVW5pdC5nZXREZWZhdWx0QWNjZXNzKCkpOwogCQkKLQkJZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwkKKwkJb3JtTWFwcGluZ0ZpbGUuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwkKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbmNlVW5pdC5nZXREZWZhdWx0QWNjZXNzKCkpOworCQkKKwkJb3JtTWFwcGluZ0ZpbGUuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKG51bGwpOwkKKwkJYXNzZXJ0RmFsc2Uob3JtTWFwcGluZ0ZpbGUuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkucmVzb3VyY2VFeGlzdHMoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdEFjY2VzcygpKTsKKwkJCQkKKwkJb3JtMk1hcHBpbmdGaWxlLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsJCiAJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdEFjY2VzcygpKTsKIAl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPcm1YbWxGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlwZXJzaXN0ZW5jZVJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24geworCQlhZGRYbWxNYXBwaW5nRmlsZVJlZihKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOworCQljcmVhdGVPcm0yWG1sRmlsZSgpOworCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCUxpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gbWFwcGluZ0ZpbGVSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkubWFwcGluZ0ZpbGVSZWZzKCk7CisJCU9ybVhtbCBvcm1NYXBwaW5nRmlsZSA9IChPcm1YbWwpIG1hcHBpbmdGaWxlUmVmcy5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKTsKKwkJT3JtWG1sIG9ybTJNYXBwaW5nRmlsZSA9IChPcm1YbWwpIG1hcHBpbmdGaWxlUmVmcy5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwkJCisJCW9ybU1hcHBpbmdGaWxlLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7CQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwkJCisJCW9ybU1hcHBpbmdGaWxlLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsJCisJCWFzc2VydEZhbHNlKG9ybU1hcHBpbmdGaWxlLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnJlc291cmNlRXhpc3RzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcGVyc2lzdGVuY2VVbml0LmdldERlZmF1bHRTY2hlbWEoKSk7CisJCQkJCisJCW9ybTJNYXBwaW5nRmlsZS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOwkKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKIAl9CiAJCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudGl0eUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CQkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKKwkJY3JlYXRlT3JtMlhtbEZpbGUoKTsKKwkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlMaXN0SXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IG1hcHBpbmdGaWxlUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLm1hcHBpbmdGaWxlUmVmcygpOworCQlPcm1YbWwgb3JtTWFwcGluZ0ZpbGUgPSAoT3JtWG1sKSBtYXBwaW5nRmlsZVJlZnMubmV4dCgpLmdldE1hcHBpbmdGaWxlKCk7CisJCU9ybVhtbCBvcm0yTWFwcGluZ0ZpbGUgPSAoT3JtWG1sKSBtYXBwaW5nRmlsZVJlZnMubmV4dCgpLmdldE1hcHBpbmdGaWxlKCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcGVyc2lzdGVuY2VVbml0LmdldERlZmF1bHRDYXRhbG9nKCkpOworCQkKKwkJb3JtTWFwcGluZ0ZpbGUuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRk9PIik7CQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdENhdGFsb2coKSk7CisJCQorCQlvcm1NYXBwaW5nRmlsZS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwkKKwkJYXNzZXJ0RmFsc2Uob3JtTWFwcGluZ0ZpbGUuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkucmVzb3VyY2VFeGlzdHMoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdENhdGFsb2coKSk7CisJCQkJCisJCW9ybTJNYXBwaW5nRmlsZS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJCQVIiKTsJCisJCWFzc2VydEVxdWFscygiQkFSIiwgcGVyc2lzdGVuY2VVbml0LmdldERlZmF1bHRDYXRhbG9nKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPcm0yWG1sRmlsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJRGF0YU1vZGVsIGNvbmZpZyA9CisJCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CisJCWNvbmZpZy5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXROYW1lKCkpOworCQljb25maWcuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX1BBVEgsICJNRVRBLUlORi9vcm0yLnhtbCIpOworCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7CisJCQorCQlhZGRYbWxNYXBwaW5nRmlsZVJlZigiTUVUQS1JTkYvb3JtMi54bWwiKTsKKwkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMTEyLDggKzExODAsNiBAQAogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFBlcnNpc3RlbnRJbm5lckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTEzMywzNCArMTE5OSwzNSBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0KCk7CisJCWdldEpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKGZhbHNlKTsJCisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQkKIAkJLy9wZXJzaXN0ZW50VHlwZSBub3QgbGlzdGVkIGluIHBlcnNpc3RlbmNlLnhtbCBhbmQgZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzIGlzIGZhbHNlCiAJCS8vc3RpbGwgZmluZCB0aGUgcGVyc2lzdGVudFR5cGUgYmVjYXVzZSBvZiBjaGFuZ2VzIGZvciBidWcgMTkwMzE3Ci0JCWFzc2VydEZhbHNlKGpwYVByb2plY3QoKS5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCkpOworCQlhc3NlcnRGYWxzZShnZXRKcGFQcm9qZWN0KCkuZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcygpKTsKIAkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwogCQkKIAkJLy90ZXN0IHBlcnNpc3RlbnRUeXBlIG5vdCBsaXN0ZWQgaW4gcGVyc2lzdGVuY2UueG1sLCBkaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyBzZXQgdG8gdHJ1ZQotCQlqcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyh0cnVlKTsJCisJCWdldEpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKHRydWUpOwkKIAkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwogCQkKIAkJLy90ZXN0IHBlcnNpc3RlbnRUeXBlIGxpc3QgYXMgY2xhc3MgaW4gcGVyc2lzdGVuY2UueG1sCi0JCWpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKGZhbHNlKTsKKwkJZ2V0SnBhUHJvamVjdCgpLnNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoZmFsc2UpOwogCQlYbWxKYXZhQ2xhc3NSZWYgY2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwogCQljbGFzc1JlZi5zZXRKYXZhQ2xhc3MoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldENsYXNzZXMoKS5hZGQoY2xhc3NSZWYpOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRDbGFzc2VzKCkuYWRkKGNsYXNzUmVmKTsKIAkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwogCiAJCQogCQkvL3Rlc3QgcGVyc2lzdGVudFR5cGUgZnJvbSBvcm0ueG1sIGZpbGUgdGhhdCBpcyBzcGVjaWZpZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotCQljcmVhdGVPcm1YbWxGaWxlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlhZGRYbWxNYXBwaW5nRmlsZVJlZihKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKIAkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoIm1vZGVsLkZvbyIpKTsKIAkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoIm1vZGVsLkZvbyIpKTsKIAogCQkvL3Rlc3QgcGVyc2lzdGVudFR5cGUgZnJvbSBvcm0ueG1sIGZpbGUgdGhhdCBpcyBpbXBsaWVkKG5vdCBzcGVjaWZpZWQpIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwKLQkJeG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkucmVtb3ZlKDApOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5yZW1vdmUoMCk7CiAJCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldFBlcnNpc3RlbnRUeXBlKCJtb2RlbC5Gb28iKSk7CiAJfQogCQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbFRlc3RzLmphdmEKaW5kZXggMzQzZjdmMi4uYzA0YzlmOSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWxUZXN0cy5qYXZhCkBAIC0xLDE4ICsxLDE4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CiAKIHB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbFRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKQEAgLTIxLDcyICsyMSwzNiBAQAogCQlzdXBlcihuYW1lKTsKIAl9CiAJCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sKCkgewotCQlyZXR1cm4gcm9vdENvbnRleHQoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOworCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbCBnZXRQZXJzaXN0ZW5jZVhtbCgpIHsKKwkJcmV0dXJuIGdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBZGRQZXJzaXN0ZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVJlc291cmNlIHBybSA9IHBlcnNpc3RlbmNlUmVzb3VyY2UoKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGdldEpwYVByb2plY3QoKS5qcGFGaWxlc1NpemUoKSk7CisJCUpwYVhtbFJlc291cmNlIHBybSA9IGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKIAkJcHJtLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKIAkJcHJtLnNhdmUobnVsbCk7CiAJCQotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKSk7CisJCS8vdGhlIENvbnRlbnRUeXBlIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSBpcyBubyBsb25nZXIgcGVyc2lzdGVuY2UsIHNvIHRoZSBqcGEgZmlsZSBpcyByZW1vdmVkCisJCWFzc2VydE51bGwoZ2V0UGVyc2lzdGVuY2VYbWwoKSk7CisJCWFzc2VydEVxdWFscygxLCBnZXRKcGFQcm9qZWN0KCkuanBhRmlsZXNTaXplKCkpOyAvL3Nob3VsZCBvbmx5IGJlIHRoZSBvcm0ueG1sIGZpbGUKIAkJCi0JCXBybS5nZXRDb250ZW50cygpLmFkZChQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlKCkpOworCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2UoKTsKKwkJeG1sUGVyc2lzdGVuY2Uuc2V0VmVyc2lvbigiMS4wIik7CisJCXBybS5nZXRDb250ZW50cygpLmFkZCh4bWxQZXJzaXN0ZW5jZSk7CisJCXBybS5zYXZlKG51bGwpOwogCQkKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFkZFBlcnNpc3RlbmNlKCkgewotCQlQZXJzaXN0ZW5jZVJlc291cmNlIHBybSA9IHBlcnNpc3RlbmNlUmVzb3VyY2UoKTsKLQkJcHJtLmdldENvbnRlbnRzKCkucmVtb3ZlKHBybS5nZXRQZXJzaXN0ZW5jZSgpKTsKLQkJYXNzZXJ0TnVsbChwcm0uZ2V0UGVyc2lzdGVuY2UoKSk7Ci0JCQotCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCA9IHBlcnNpc3RlbmNlWG1sKCk7Ci0JCQotCQlwZXJzaXN0ZW5jZVhtbC5hZGRQZXJzaXN0ZW5jZSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpKTsKLQkJCi0JCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlwZXJzaXN0ZW5jZVhtbC5hZGRQZXJzaXN0ZW5jZSgpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7CisJCWFzc2VydE5vdE51bGwoZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGdldEpwYVByb2plY3QoKS5qcGFGaWxlc1NpemUoKSk7CQogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVtb3ZlUGVyc2lzdGVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VSZXNvdXJjZSBwcm0gPSBwZXJzaXN0ZW5jZVJlc291cmNlKCk7CisJCUpwYVhtbFJlc291cmNlIHBybSA9IGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKIAkJCi0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChnZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkpOwogCQkKIAkJcHJtLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKIAkJCi0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVJlbW92ZVBlcnNpc3RlbmNlKCkgewotCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCA9IHBlcnNpc3RlbmNlWG1sKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlWG1sLmdldFBlcnNpc3RlbmNlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VYbWwucmVtb3ZlUGVyc2lzdGVuY2UoKTsKLQkJCi0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKSk7Ci0JCQotCQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJcGVyc2lzdGVuY2VYbWwucmVtb3ZlUGVyc2lzdGVuY2UoKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOworCQlhc3NlcnROdWxsKGdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1Jvb3RDb250ZXh0Tm9kZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUm9vdENvbnRleHROb2RlVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDdlMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1Jvb3RDb250ZXh0Tm9kZVRlc3RzLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CisKK3B1YmxpYyBjbGFzcyBSb290Q29udGV4dE5vZGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHVibGljIFJvb3RDb250ZXh0Tm9kZVRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQWRkUGVyc2lzdGVuY2VYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJZGVsZXRlUmVzb3VyY2UoZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpKTsKKwkJSnBhUm9vdENvbnRleHROb2RlIGJhc2VKcGFDb250ZW50ID0gZ2V0SmF2YVByb2plY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHROb2RlKCk7CisJCQorCQlhc3NlcnRGYWxzZShnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuZmlsZUV4aXN0cygpKTsKKwkJYXNzZXJ0TnVsbChiYXNlSnBhQ29udGVudC5nZXRQZXJzaXN0ZW5jZVhtbCgpKTsKKwkJCisJCUlEYXRhTW9kZWwgY29uZmlnID0KKwkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBQZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOworCQljb25maWcuc2V0UHJvcGVydHkoUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXROYW1lKCkpOworCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7CisJCQorCQlhc3NlcnROb3ROdWxsKGJhc2VKcGFDb250ZW50LmdldFBlcnNpc3RlbmNlWG1sKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVtb3ZlUGVyc2lzdGVuY2VYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSnBhWG1sUmVzb3VyY2UgcHIgPSBnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7CisJCUpwYVJvb3RDb250ZXh0Tm9kZSBiYXNlSnBhQ29udGVudCA9IGdldEphdmFQcm9qZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFJvb3RDb250ZXh0Tm9kZSgpOworCQkKKwkJYXNzZXJ0Tm90TnVsbChiYXNlSnBhQ29udGVudC5nZXRQZXJzaXN0ZW5jZVhtbCgpKTsKKwkJCisJCWRlbGV0ZVJlc291cmNlKHByKTsKKwkJCisJCWFzc2VydE51bGwoYmFzZUpwYUNvbnRlbnQuZ2V0UGVyc2lzdGVuY2VYbWwoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1Jvb3RDb250ZXh0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9Sb290Q29udGV4dFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNzE5MDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1Jvb3RDb250ZXh0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBSb290Q29udGV4dFRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgUm9vdENvbnRleHRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFkZFBlcnNpc3RlbmNlWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcHIgPSBwZXJzaXN0ZW5jZVJlc291cmNlKCk7Ci0JCWRlbGV0ZVJlc291cmNlKHByKTsKLQkJCi0JCWFzc2VydEZhbHNlKHByLmV4aXN0cygpKTsKLQkJCi0JCUpwYVJvb3RDb250ZXh0Tm9kZSBiYXNlSnBhQ29udGVudCA9IGdldEphdmFQcm9qZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFJvb3RDb250ZXh0KCk7Ci0JCWFzc2VydE51bGwoYmFzZUpwYUNvbnRlbnQuZ2V0UGVyc2lzdGVuY2VYbWwoKSk7Ci0JCQotCQliYXNlSnBhQ29udGVudC5hZGRQZXJzaXN0ZW5jZVhtbCgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChiYXNlSnBhQ29udGVudC5nZXRQZXJzaXN0ZW5jZVhtbCgpKTsKLQkJCi0JCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQliYXNlSnBhQ29udGVudC5hZGRQZXJzaXN0ZW5jZVhtbCgpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZW1vdmVQZXJzaXN0ZW5jZVhtbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFSb290Q29udGV4dE5vZGUgYmFzZUpwYUNvbnRlbnQgPSBnZXRKYXZhUHJvamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRSb290Q29udGV4dCgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChiYXNlSnBhQ29udGVudC5nZXRQZXJzaXN0ZW5jZVhtbCgpKTsKLQkJCi0JCWJhc2VKcGFDb250ZW50LnJlbW92ZVBlcnNpc3RlbmNlWG1sKCk7Ci0JCXdhaXRGb3JXb3Jrc3BhY2VKb2JzKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2VKcGFDb250ZW50LmdldFBlcnNpc3RlbmNlWG1sKCkpOwotCQkKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWJhc2VKcGFDb250ZW50LnJlbW92ZVBlcnNpc3RlbmNlWG1sKCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFkZFBlcnNpc3RlbmNlWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcHIgPSBwZXJzaXN0ZW5jZVJlc291cmNlKCk7Ci0JCWRlbGV0ZVJlc291cmNlKHByKTsKLQkJCi0JCWFzc2VydEZhbHNlKHByLmV4aXN0cygpKTsKLQkJCi0JCUpwYVJvb3RDb250ZXh0Tm9kZSBiYXNlSnBhQ29udGVudCA9IGdldEphdmFQcm9qZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFJvb3RDb250ZXh0KCk7Ci0JCWFzc2VydE51bGwoYmFzZUpwYUNvbnRlbnQuZ2V0UGVyc2lzdGVuY2VYbWwoKSk7Ci0JCQotCQlwci5nZXRDb250ZW50cygpLmFkZChQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlKCkpOwotCQlwci5zYXZlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKGJhc2VKcGFDb250ZW50LmdldFBlcnNpc3RlbmNlWG1sKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVtb3ZlUGVyc2lzdGVuY2VYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VSZXNvdXJjZSBwciA9IHBlcnNpc3RlbmNlUmVzb3VyY2UoKTsKLQkJSnBhUm9vdENvbnRleHROb2RlIGJhc2VKcGFDb250ZW50ID0gZ2V0SmF2YVByb2plY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHQoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoYmFzZUpwYUNvbnRlbnQuZ2V0UGVyc2lzdGVuY2VYbWwoKSk7Ci0JCQotCQlkZWxldGVSZXNvdXJjZShwcik7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2VKcGFDb250ZW50LmdldFBlcnNpc3RlbmNlWG1sKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L0dlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4ODRjMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L0dlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMi5HZW5lcmljMl8wSnBhUGxhdGZvcm1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZSBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHJvdGVjdGVkIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSB7CisJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gc3VwZXIuYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKTsKKwkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsIEpwdENvcmVQbHVnaW4uSlBBX0ZBQ0VUX1ZFUlNJT05fMl8wKTsKKwkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STV9JRCwgR2VuZXJpYzJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuSUQpOworCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCwgQm9vbGVhbi5UUlVFKTsKKwkJcmV0dXJuIGRhdGFNb2RlbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWMyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpYzJfMEphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMzQxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWMyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljMl8wSmF2YUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKK3sKKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoR2VuZXJpYzJfMEphdmFDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YUVudGl0eTJfMFRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTJfMFRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cy5jbGFzcyk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwlwcml2YXRlIEdlbmVyaWMyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMoKSB7CisJCXN1cGVyKCk7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmZmZTFmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSA9ICJNWV9BU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FIjsKKworCQkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQorCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuT05FX1RPX09ORSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFubm90YXRpb25UZXN0VHlwZUNoaWxkIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzTWFueVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewkJCisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFubm90YXRpb25UZXN0VHlwZUNoaWxkPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIikiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKKwkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCisKKwkJCisJcHVibGljIEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUob3ZlcnJpZGVDb250YWluZXIuYXNzb2NpYXRpb25PdmVycmlkZXMoKS5oYXNOZXh0KCkpOworCQkKKwkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKKwkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7CisJCisJCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKKwkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnNldE5hbWUobnVsbCk7CisJCWFzc2VydE51bGwoamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCisJCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOworCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2UodHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUykuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKG92ZXJyaWRlQ29udGFpbmVyLmFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKKwkJCisJCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAorCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOworCQkKKwkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCisJCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUobnVsbCk7CisJCWFzc2VydE51bGwoamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCQorCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCisJCQorCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJCQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7CisJCQorCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOworCQkKKwkJSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IGpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOworCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJCisJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7CisJCQorCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOworCQkKKwkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbnNTaXplKCkpOworCisJCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKwkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7CisJCQorCQlhc3NlcnRFcXVhbHMoNCwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJCisJCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlhc3NlcnRFcXVhbHMoMywgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOworCisJCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7CisJCQorCQlqb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uc1NpemUoKSk7CisJCQorCQlqb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQkKKwkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJCQkKKwkJYXNzZXJ0RXF1YWxzKDQsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uc1NpemUoKSk7CisJCQorCQkKKwkJam9pbmluZ1N0cmF0ZWd5Lm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOworCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOworCisKKwkJam9pbmluZ1N0cmF0ZWd5Lm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOworCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQkKKwkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCisJCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDApOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigxKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMik7CisJCQorCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLnNldE5hbWUoIkZPTyIpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLnNldE5hbWUoIkJBUiIpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLnNldE5hbWUoIkJBWiIpOworCisJCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCQkKKwkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLm1vdmVKb2luQ29sdW1uKDIsIDApOworCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKworCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UubW92ZUpvaW5Db2x1bW4oMCwgMSk7CisJCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCisJCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDEpOworCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKworCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigxKTsKKwkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CQkKKwkJCisJCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDApOworCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKworCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigwKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhBc3NvY2lhdGlvbk92ZXJyaWRlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJCisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKKwkJCisJCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKKwkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhBc3NvY2lhdGlvbk92ZXJyaWRlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJCisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKKwkJCisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBlbnRpdHkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdElzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgZW50aXR5LmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRUcnVlKGFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pblRhYmxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCSgoQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCkgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkpLnNldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOworCQlKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gKChBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisKKwkJCisJCUpvaW5UYWJsZSBqb2luVGFibGUgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCk7CisJCWpvaW5UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJCQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCSgoQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCkgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkpLnNldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOworCQlKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gKChBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCisJCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luVGFibGUoKS5zZXROYW1lKCJNWV9KT0lOX1RBQkxFIik7CisJCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOworCisJCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luVGFibGUoKS5hZGRKb2luQ29sdW1uKDApOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkuYWRkSm9pbkNvbHVtbigxKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5UYWJsZSgpLmFkZEpvaW5Db2x1bW4oMik7CisJCQorCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkuam9pbkNvbHVtbkF0KDApLnNldE5hbWUoIkZPTyIpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkuam9pbkNvbHVtbkF0KDEpLnNldE5hbWUoIkJBUiIpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkuam9pbkNvbHVtbkF0KDIpLnNldE5hbWUoIkJBWiIpOworCisJCUxpc3RJdGVyYXRvcjxKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCQkKKwkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5UYWJsZSgpLm1vdmVKb2luQ29sdW1uKDIsIDApOworCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCisJCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luVGFibGUoKS5tb3ZlSm9pbkNvbHVtbigwLCAxKTsKKwkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKworCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkucmVtb3ZlSm9pbkNvbHVtbigxKTsKKwkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKworCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkucmVtb3ZlSm9pbkNvbHVtbigxKTsKKwkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKwkJCisJCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luVGFibGUoKS5yZW1vdmVKb2luQ29sdW1uKDApOworCQlhc3NlcnRGYWxzZShqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5oYXNOZXh0KCkpOworCX0JCisJCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRKb2luVGFibGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzTWFueVRvTWFueSgpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzAgcmVsYXRpb25zaGlwUmVmZXJlbmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzApIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpOworCQlKb2luVGFibGUgam9pblRhYmxlID0gcmVsYXRpb25zaGlwUmVmZXJlbmNlLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZF9Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGpvaW5UYWJsZS5nZXROYW1lKCkpOworCQkKKwkJCisJCWdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlhc3NlcnRFcXVhbHMoIkZPT19GT08iLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKKwkJCisJCVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3MgPSBnZXRKYXZhRW50aXR5KCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCk7CisJCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOworCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKKworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZS5nZXROYW1lKCkpOworCX0JCit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZWU3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMuamF2YQpAQCAtMCwwICsxLDM1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCit7CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHVibGljIEdlbmVyaWNKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQkKKwkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCQorCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CisJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCQorCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQkKKwkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJCisJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJCisJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJCisJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQkKKwkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJCisJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQkKKwkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJfQorCisvLwkKKy8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOworLy8JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworLy8JCQorLy8JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisvLwkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworLy8JCQorLy8JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKy8vCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKy8vCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworLy8JCQorLy8JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKKy8vCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKKy8vCQkJCQorLy8JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCisvLwkJb25lVG9PbmUuc2V0VGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKKy8vCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7CisvLwkKKy8vCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCisvLwkJb25lVG9PbmUuc2V0VGFyZ2V0RW50aXR5KG51bGwpOworLy8JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKKy8vCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKKy8vCX0KKy8vCQorLy8JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworLy8JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7CisvLwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisvLwkJCisvLwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKy8vCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisvLwkJCisvLwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworLy8JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworLy8JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisvLwkJCisvLwkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOworLy8JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOworLy8JCQkJCisvLwkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKKy8vCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKKy8vCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7CisvLwkKKy8vCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKKy8vCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOworLy8JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKKy8vCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKKy8vCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CisJCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7CisJCQkJCisJCS8vc2V0IGZldGNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorCQllbGVtZW50Q29sbGVjdGlvbi5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUik7CisJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKKwkJCisJCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlkpOworCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOworCQkKKwkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKKwkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gobnVsbCk7CisJCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOworCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CisJCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7CisJCQkJCisJCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAorCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKKwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOworCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOworCQorCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOworCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOworCQkKKwkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAorCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2gobnVsbCk7CisJCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOworCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZzJfMFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyMDM1YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcyXzBUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTQ4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREFCTEVfVFlQRV9OQU1FID0gIk15RW1iZWRkYWJsZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgRU1CRUREQUJMRV9UWVBFX05BTUU7CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5FTUJFRERFRCwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIEVNQkVEREFCTEVfVFlQRV9OQU1FICsgIiBteUVtYmVkZGVkOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtYmVkZGFibGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuT05FX1RPX09ORSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5PTkVfVE9fTUFOWSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChFTUJFRERBQkxFX1RZUEVfTkFNRSkuYXBwZW5kKCIgeyIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICAiKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIEVNQkVEREFCTEVfVFlQRV9OQU1FICsgIi5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUFkZHJlc3NFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyBBZGRyZXNzIHsiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICAiKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eUN1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuSUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFppcENvZGUgemlwQ29kZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlppcENvZGUiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgemlwOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBwbHVzZm91cjsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlppcENvZGUuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCisJcHVibGljIEdlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7CisJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKTsKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQkKKwkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpOworCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQkKKwkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0VHJ1ZSgoKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuYXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CisJCisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0RW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKTsKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQkKKwkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKKwkJCisJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRFbWJlZGRlZE1hcHBpbmdHZW5lcmljRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlVGVzdEdlbmVyaWNFbWJlZGRhYmxlKCk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRW50aXR5MSIpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkVtYmVkZGFibGUxIik7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRhYmxlIik7CisJCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOworCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRFbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyBFbnRpdHkxIHsgIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInByaXZhdGUgRW1iZWRkYWJsZTE8SW50ZWdlcj4gbXlFbWJlZGRhYmxlOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW50aXR5MS5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RHZW5lcmljRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgRW1iZWRkYWJsZTE8VD4ge30iKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbWJlZGRhYmxlMS5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIik7CisJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCQorCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOworCQorCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIik7CisJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCQorCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKKwkJCisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIik7CisJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCQorCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7CisJCQorCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpOworCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQkKKwkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7CisJCQorCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7CisJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKTsKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJCisJCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOworCQkKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpOworCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQkKKwkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKKwkJCisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIik7CisJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCQorCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOworCQkKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIik7CisJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCQorCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7CisJCQorCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKKwkJCisJCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOworCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQkKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJCisJCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAorCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAorCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CisJCQorCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUVtYmVkZGVkIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKKwkJCisJCQorCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQljbGFzc1JlZnMubmV4dCgpOworCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCQorCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBlbWJlZGRhYmxlLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImNpdHkiKS5nZXRNYXBwaW5nKCk7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKKwkJCisJCWFzc2VydEVxdWFscygibXlFbWJlZGRlZCIsIGF0dHJpYnV0ZVJlc291cmNlLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCisJCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyg2LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoNywgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUobnVsbCk7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7CisJCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKKwkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG51bGwpOworCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKKwkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCQkKKwkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJYW5ub3RhdGlvbi5zZXROYW1lKCJjaXR5Iik7CisJCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CisJCQorCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisKKwkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCisJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7CisJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOworCQkKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCisJCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAorCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7CisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOworCisJCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQkKKwkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOworCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsJCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKKwkJCisJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisKKwkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCisJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7CisJCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInN0YXRlIik7CisJCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7CisJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOworCQkJCQorCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQkKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkJCisJCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQkKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCQorCQlJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CisJCQorCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUxpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CQorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CisJCQorCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQkKKwkJYXR0cmlidXRlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMSwgMCwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCQorCQorCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJCisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCQorCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7CisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisKKwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAorCQlyZXNvdXJjZUF0dHJpYnV0ZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQkKKwkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBqb2luaW5nU3RyYXRlZ3kuam9pbkNvbHVtbnNTaXplKCkpOworCQlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gam9pbmluZ1N0cmF0ZWd5LmpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHZpcnR1YWxKb2luQ29sdW1uLmdldFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCWNsYXNzUmVmcy5uZXh0KCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhRW1iZWRkYWJsZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAorCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgamF2YUVtYmVkZGFibGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7CisJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX0NPTFVNTiIpOworCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJNWV9SRUZFUkVOQ0VfQ09MVU1OIik7CisJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOworCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCWpvaW5pbmdTdHJhdGVneSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5pbmdTdHJhdGVneS5qb2luQ29sdW1uc1NpemUoKSk7CisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQl2aXJ0dWFsSm9pbkNvbHVtbiA9IGpvaW5pbmdTdHJhdGVneS5qb2luQ29sdW1ucygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX0NPTFVNTiIsIGpvaW5pbmdTdHJhdGVneS5qb2luQ29sdW1ucygpLm5leHQoKS5nZXROYW1lKCkpOworCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCQorCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisKKwkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOworCisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7CisJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CisJCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7CisJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CisJCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJYW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsJCisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7CisJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CisJCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlQXR0cmlidXRlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7CisJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CisJCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSByZXNvdXJjZUF0dHJpYnV0ZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKSk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJCisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcyA9IHJlc291cmNlQXR0cmlidXRlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOworCisJCUl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMgPSByZXNvdXJjZUF0dHJpYnV0ZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKKwkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCUphdmFFbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCQorCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlQXR0cmlidXRlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMpKTsKKwkJCisJCQorCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgxLCAwKTsKKwkJTGlzdEl0ZXJhdG9yPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisKKwkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VBdHRyaWJ1dGUuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCisKKwkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMCwgMSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisKKwkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VBdHRyaWJ1dGUuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQorCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOworCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKDEsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOworCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKDIsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOworCQkJCisJCUxpc3RJdGVyYXRvcjxBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCQorCQlyZXNvdXJjZUF0dHJpYnV0ZS5tb3ZlQW5ub3RhdGlvbigyLCAwLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQlyZXNvdXJjZUF0dHJpYnV0ZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oMSwgIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkJCisJCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oMCwgIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCisJCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCQorCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCisJCisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKKwkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCQlnZXRPcm1YbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CisJCUphdmFFbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLCAxKTsKKwkJSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9ICgoQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOworCQlKb2luVGFibGUgam9pblRhYmxlID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlX0FkZHJlc3MiLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5qb2luQ29sdW1uc1NpemUoKSk7CisJCUpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luVGFibGUuam9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlX2lkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZV9BZGRyZXNzIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOworCQlKb2luQ29sdW1uIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX2lkIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlX0FkZHJlc3MiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7CisJCQorCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQljbGFzc1JlZnMubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YUVtYmVkZGFibGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKKwkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIGphdmFFbWJlZGRhYmxlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7CisJCUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSBqb2luVGFibGVTdHJhdGVneSA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7CisJCWpvaW5UYWJsZVN0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKKwkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pblRhYmxlU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX0NPTFVNTiIpOworCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJNWV9SRUZFUkVOQ0VfQ09MVU1OIik7CisJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOworCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJCisJCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGVTdHJhdGVneS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKKwkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTVlfSU5WRVJTRV9KT0lOX0NPTFVNTiIpOworCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiTVlfSU5WRVJTRV9SRUZFUkVOQ0VfQ09MVU1OIik7CisJCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJJTlZFUlNFX0JBUiIpOworCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJJTlZFUlNFX0NPTFVNTl9ERUYiKTsKKwkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKKwkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gQ29sbGVjdGlvblRvb2xzLmdldChvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSwgMSk7CisJCWpvaW5pbmdTdHJhdGVneSA9ICgoQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOworCQlqb2luVGFibGUgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5qb2luQ29sdW1uc1NpemUoKSk7CisJCXZpcnR1YWxKb2luQ29sdW1uID0gam9pblRhYmxlLmpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9SRUZFUkVOQ0VfQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7CisJCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7CisJCXZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiTVlfSU5WRVJTRV9KT0lOX0NPTFVNTiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIk1ZX0lOVkVSU0VfUkVGRVJFTkNFX0NPTFVNTiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX0JBUiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX0NPTFVNTl9ERUYiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKKworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQkKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUN1c3RvbWVyKCk7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOworCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKKwkJCisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOworCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQlQZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoNSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygic3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCQorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCisJCQorCQlQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlFbWJlZGRlZE1hcHBpbmcgbmVzdGVkRW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG5lc3RlZEVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlhc3NlcnRFcXVhbHMoMiwgbmVzdGVkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQkKKwkJUGVyc2lzdGVudFR5cGUgemlwQ29kZVBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7CisKKwkJLy9jaGVjayB0aGUgbmVzdGVkIGVtYmVkZGVkIChBZGRyZXNzLnppcENvZGUpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpOworCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQorCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKKworCQkvL2NoZWNrIHRoZSB0b3AtbGV2ZWwgZW1iZWRkZWQgKEN1c3RvbWVyLmFkZHJlc3MpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKChFbWJlZGRlZE1hcHBpbmcpIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgiemlwQ29kZS5wbHVzZm91ciIpOworCQlhc3NlcnRFcXVhbHMoInppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCQkKKwkJLy9zZXQgYW4gYXR0cmlidXRlIG92ZXJyaWRlIG9uIEFkZHJlc3MuemlwQ29kZSBlbWJlZGRlZCBtYXBwaW5nCisJCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gKChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpLnNldFZpcnR1YWwoZmFsc2UpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIX09WRVJSSURFIik7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFX09WRVJSSURFIik7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIik7CisJCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRNYXBwaW5nKSBjdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoInppcENvZGUucGx1c2ZvdXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQorCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKKwkJCisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXBDb2RlLnBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJLy9UT0RPIEkgaGF2ZSB0aGUgZGVmYXVsdCB3cm9uZyBpbiB0aGlzIGNhc2UsIGJ1dCB0aGlzIHdhcyB3cm9uZyBiZWZvcmUgYXMgd2VsbC4gIE5lZWQgdG8gZml4IHRoaXMgbGF0ZXIKKy8vCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscyhudWxsLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscyhudWxsLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnRpdHkyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudGl0eTJfMFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2OTA2YwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnRpdHkyXzBUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTU1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlNoYXJlZENhY2hlTW9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbnRpdHkyXzBUZXN0cyBleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQl9UWVBFX05BTUUgPSAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgU1VCX1RZUEVfTkFNRTsKKwkKKwkKKwlwdWJsaWMgR2VuZXJpY0phdmFFbnRpdHkyXzBUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuT05FX1RPX09ORSwgSlBBLk1BTllfVE9fT05FLCBKUEEuT05FX1RPX01BTlksIEpQQS5NQU5ZX1RPX01BTlkpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M0OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICAiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSU5IRVJJVEFOQ0UsIEpQQS5JTkhFUklUQU5DRV9UWVBFLCBKUEEuT05FX1RPX09ORSwgSlBBLk1BTllfVE9fT05FLCBKUEEuT05FX1RPX01BTlksIEpQQS5NQU5ZX1RPX01BTlkpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIik7CisJCQkJc2IuYXBwZW5kKCJhYnN0cmFjdCIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMjsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczM7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzNDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgIik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7CisJCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7CisJCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuSUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkN1c3RvbWVyICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGlkOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkxvbmdUaW1lQ3VzdG9tZXIgZXh0ZW5kcyBDdXN0b21lciAiKTsKKwkJCQlzYi5hcHBlbmQoInt9Iik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiTG9uZ1RpbWVDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisKKworCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFppcENvZGUgemlwQ29kZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlppcENvZGUiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgemlwOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBwbHVzZm91cjsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlppcENvZGUuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CisJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CisJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CisJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQorCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOworCQkKKwkJCisJCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOworCQkKKwkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQorCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisJCQorCQkKKwkJZ2V0SmF2YUVudGl0eSgpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7CisJCQorCQlvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQorCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisJCQorCQkKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJY2xhc3NSZWZzLm5leHQoKTsKKwkJSmF2YUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gYWJzdHJhY3RFbnRpdHkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7CisJCQorCQkKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJY2xhc3NSZWZzLm5leHQoKTsKKwkJSmF2YUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBhYnN0cmFjdEVudGl0eS5hbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzTWFwcGVkU3VwZXJjbGFzc0luT3JtWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCX0KKwkJCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCQorCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCisJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCisJCXR5cGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQkKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJY2xhc3NSZWZzLm5leHQoKTsKKwkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGphdmFFbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQkKKworCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQkKKwkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKKwkJCisJCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKworCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CisKKwkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CisJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQkKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzRW50aXR5SGllcmFjaHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCQorCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQljbGFzc1JlZnMubmV4dCgpOworCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gamF2YUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJCisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CisJCQorCisJCUphdmFFbnRpdHkgc3VwZXJjbGFzcyA9IChKYXZhRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCQorCQlCYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgc3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKKworCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKKwkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CisJCQorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKKwkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOworCisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQkKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlhbm5vdGF0aW9uLnNldE5hbWUoImJhciIpOwkKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoImlkIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJCisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCisJCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKKwkJCisJCUl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQorCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCQorCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKKworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCQorCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQkKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCQorCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFBdHRyaWJ1dGVPdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUF0dHJpYnV0ZU92ZXJyaWRlcykpOworCQkKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyLCAwKTsKKwkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKworCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKworCisJCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwLCAxKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisKKwkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJfQorLy8JCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQorCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCisJCSgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOworCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKKwkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7CisJCQkKKwkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCQorCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMiwgMCwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCXR5cGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCQorCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCAgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkKKwkJQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQkKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCQorCQkKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQkKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gZ2V0SmF2YUVudGl0eSgpLm92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IGdldEphdmFFbnRpdHkoKS5vdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7CisJfQorCQorLy8JLy9UT0RPIGFkZCBhbGwgbWFwcGluZyB0eXBlcyB0byB0aGUgbWFwcGVkIHN1cGVyY2xhc3MgdG8gdGVzdCB3aGljaCBvbmVzIGFyZSBvdmVycmlkYWJsZQorCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IGdldEphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOworCX0KKwkJCisJcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zTWFwcGVkU3VwZXJjbGFzc0luT3JtWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCQorCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKKwkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKKwkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKworCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAorCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQkKKwkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCQorCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQljbGFzc1JlZnMubmV4dCgpOworCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCQorCisJCS8vTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJLy9CYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5wZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKKwkJCisJCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCisJCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CisJCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQkKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQkKKwkJCisvLwkJLy9UT0RPIGpvaW5Db2x1bW5zIGZvciBkZWZhdWx0IGFzc29jaWF0aW9uIG92ZXJyaWRlcworLy8vLwlJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOworLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOworLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOworLy8vLwkKKy8vLy8KKy8vLy8JSU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChJTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworLy8vLwkKKy8vLy8JSU9uZVRvT25lTWFwcGluZyBhZGRyZXNzTWFwcGluZyA9IChJT25lVG9PbmVNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7CisvLy8vCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBhZGRyZXNzTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOworLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsKKy8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFaIik7CisvLy8vCQorLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7CisvLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKKy8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKKy8vLy8KKy8vLy8JYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKKy8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOworLy8vLwlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworLy8vLwlhc3NlcnRFcXVhbHMoIkJBWiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOworLy8vLworLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CisvLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7CisvLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7CisvLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKy8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOworLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOworLy8vLworLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOworLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOworLy8vLwkKKy8vLy8JamF2YUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApLnNldE5hbWUoImFkZHJlc3MiKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKKworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQkKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuYXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlhbm5vdGF0aW9uLnNldE5hbWUoImJhciIpOwkKKwkJYXNzZXJ0RXF1YWxzKDUsIG92ZXJyaWRlQ29udGFpbmVyLmFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQkKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKSk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJCisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOworCisJCUl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQkKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJCisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMpKTsKKwkJCisJCQorCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgxLCAwKTsKKwkJTGlzdEl0ZXJhdG9yPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKworCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisKKworCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgwLCAxKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCisJCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQorCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKKwkJKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7CisJCSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOworCQkJCisJCUxpc3RJdGVyYXRvcjxBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCQorCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMiwgMCwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJdHlwZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDAsIDEsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCQorCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCAgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQkKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0IiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQkKKwkJCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCQorCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJCisJcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpOworCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOworCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7CisJCQorCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7CisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCVBlcnNpc3RlbnRUeXBlIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlQZXJzaXN0ZW50VHlwZSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwkJCisJCVBlcnNpc3RlbnRUeXBlIHppcENvZGVQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscyg3LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnN0YXRlIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCisJCQorCQlCYXNpY01hcHBpbmcgcGx1c0ZvdXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgemlwQ29kZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwbHVzZm91ciIpLmdldE1hcHBpbmcoKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFIik7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKKworCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkvL2NoZWNrIHRoZSB0b3AtbGV2ZWwgZW1iZWRkZWQgKEN1c3RvbWVyLmFkZHJlc3MpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQorCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKKwkJCisJCS8vc2V0IGFuIGF0dHJpYnV0ZSBvdmVycmlkZSBvbiBBZGRyZXNzLnppcENvZGUgZW1iZWRkZWQgbWFwcGluZworCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgicGx1c2ZvdXIiKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSF9PVkVSUklERSIpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRV9PVkVSUklERSIpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIpOworCisKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQorCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKKwkJCisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQkvL1RPRE8gSSBoYXZlIHRoZSBkZWZhdWx0IHdyb25nIGluIHRoaXMgY2FzZSwgYnV0IHRoaXMgd2FzIHdyb25nIGJlZm9yZSBhcyB3ZWxsLiAgTmVlZCB0byBmaXggdGhpcyBsYXRlcgorLy8JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscygyNTUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhRW50aXR5KCkpLmdldENhY2hlYWJsZSgpOworCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7CisJCQorCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOworCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUoZmFsc2UpIiwgY3UpOworCQkKKwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOworCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKKwkJCisJCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUobnVsbCk7CisJCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZWFibGUiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCUNhY2hlYWJsZTJfMEFubm90YXRpb24gY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKKwkJCisJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5hZGRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOworCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7CisKKwkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZShmYWxzZSkiLCBjdSk7CisJCQorCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlKHRydWUpIiwgY3UpOworCQkKKwkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlIiwgY3UpOworCisJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOworCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGVhYmxlIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSAoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJYXNzZXJ0RXF1YWxzKFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRCwgcGVyc2lzdGVuY2VVbml0Ml8wLmdldFNoYXJlZENhY2hlTW9kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQkKKy8vCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5BTEwpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8KKy8vCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJbmhlcml0ZWRJc0RlZmF1bHRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQ2FjaGVhYmxlMl8wIHN1YkNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhRW50aXR5KCkpLmdldENhY2hlYWJsZSgpOworCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKS5nZXRQYXJlbnRFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCisJCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSAoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkJCQorLy8JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJCisvLwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njc5MzIxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wVGVzdHMuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wVGVzdHMKKwlleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBHZW5lcmljSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQorCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQorCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQkKKwlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKKwkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCisJCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKKwkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCQkKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKKwkJYXR0cmlidXRlTmFtZXMgPSAKKwkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCQkKKwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOworCQlhdHRyaWJ1dGVOYW1lcyA9IAorCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisKKwkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nMl8wVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzZhZGIxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwc0lkMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBUZXN0cworCWV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHVibGljIEdlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQorCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5JRCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIEBJZCIpLmFwcGVuZChDUik7CQkJCQorCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgbWFueVRvT25lOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsJCQkJCisJCQl9CisJCX0pOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVyaXZlZElkKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKKwkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKKwkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQkKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKUEEuSUQpOworCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEuSUQpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXREZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlVHlwZSA9IAorCQkJCWdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOworCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5zZXRWYWx1ZShmYWxzZSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5zZXRWYWx1ZSh0cnVlKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlVHlwZSA9IAorCQkJCWdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKKwkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7CisJCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlNYXBzSWQyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKKwkJCQkoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7CisJCWFubm90YXRpb24uc2V0VmFsdWUoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlhbm5vdGF0aW9uLnNldFZhbHVlKCJiYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7CisJCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlVHlwZSA9IAorCQkJCWdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKKwkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7CisJCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5zZXRWYWx1ZSgiZm9vIik7CisJCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IAorCQkJCShNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKKwkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuc2V0VmFsdWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5zZXRWYWx1ZShudWxsKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7CisJCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3JwaE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlVHlwZSA9IAorCQkJCWdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOworCQkKKwkJKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuc2V0VmFsdWUoImZvbyIpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpLmdldFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuZ2V0VmFsdWUoKSk7CisJCWFzc2VydFRydWUoKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFJZE1hcHBpbmcpOworCQkKKwkJY29udGV4dEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJYXNzZXJ0VHJ1ZSgoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUJhc2ljTWFwcGluZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MjkwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZzJfMFRlc3RzLmphdmEKQEAgLTAsMCArMSwzMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBUZXN0cworCWV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHVibGljIEdlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQorCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQorCQkJfQorCQl9KTsKKwl9CisJCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZ09ycGhhblJlbW92YWxTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkob3JwaGFuUmVtb3ZhbD1mYWxzZSkiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQorCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7CisJCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKworCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCisJCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCQkKKwkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOworCQlhdHRyaWJ1dGVOYW1lcyA9IAorCQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKwkJCisJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOworCQlhdHRyaWJ1dGVOYW1lcyA9IAorCQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKworCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7CisJfQorCQorCXByaXZhdGUgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBnZXRPcnBoYW5SZW1vdmFsT2YoT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nKSB7CisJCXJldHVybiAoKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvbmVUb01hbnlNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb01hbnlHZXREZWZhdWx0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZykuaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE9uZVRvTWFueUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKKwkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKS5pc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7CisKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCkpOworCQkKKwkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5pc09ycGhhblJlbW92YWwoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKKwkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKKworCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55Ml8wQW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55Ml8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOworCQlvbmVUb01hbnkuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE9ycGhhblJlbW92YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmdPcnBoYW5SZW1vdmFsU3BlY2lmaWVkKCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7CisKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKKwkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKKwkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKwkJCisJCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb01hbnkuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKKwkJCisJCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKG51bGwpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKSk7IAkvLyAuZ2V0RWxlbWVudCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsMigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7CisJCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCQorCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55Ml8wQW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55Ml8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55LmdldE9ycGhhblJlbW92YWwoKSk7CisJCQorCQlvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKworCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChudWxsKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSkpOworCQkKKwkJb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7CisKKwkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CisJCW9uZVRvTWFueS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOworCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKwkJCisJCW9uZVRvTWFueS5zZXRPcnBoYW5SZW1vdmFsKG51bGwpOworCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCQlhc3NlcnRTYW1lKG9uZVRvTWFueU1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwkJCisJCW9uZVRvTWFueS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihudWxsLCBuZXcgU3RyaW5nWzBdKTsKKwkJCisJCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2NTdmZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcyXzBUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcHNJZDJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9uZVRvT25lMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nMl8wVGVzdHMKKwlleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBHZW5lcmljSmF2YU9uZVRvT25lTWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUgQElkIikuYXBwZW5kKENSKTsJCQkJCisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBvbmVUb09uZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CQkJCQorCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsJCQkJCisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQorCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZ09ycGhhblJlbW92YWxTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lKG9ycGhhblJlbW92YWw9ZmFsc2UpIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aERlcml2ZWRJZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VUeXBlID0gCisJCQkJZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2VUeXBlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKKwkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBLklEKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCXJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oSlBBLklEKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVyaXZlZElkKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKKwkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOworCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQkKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuc2V0VmFsdWUoZmFsc2UpOworCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuc2V0VmFsdWUodHJ1ZSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKKwkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7CisJCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IAorCQkJCShNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKKwkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWFubm90YXRpb24uc2V0VmFsdWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7CisJCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VUeXBlID0gCisJCQkJZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2VUeXBlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOworCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7CisJCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5zZXRWYWx1ZSgiZm9vIik7CisJCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IAorCQkJCShNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKKwkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuc2V0VmFsdWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5zZXRWYWx1ZShudWxsKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7CisJCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3JwaE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlVHlwZSA9IAorCQkJCWdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7CisJCQorCQkoKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5zZXRWYWx1ZSgiZm9vIik7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuZ2V0VmFsdWUoKSk7CisJCWFzc2VydFRydWUoKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFJZE1hcHBpbmcpOworCQkKKwkJY29udGV4dEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnRUcnVlKCgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJY29udGV4dEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFCYXNpY01hcHBpbmcpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7CisJCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKworCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCisJCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisJCQorCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKKwkJYXR0cmlidXRlTmFtZXMgPSAKKwkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKwkJCisJCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7CisJCWF0dHJpYnV0ZU5hbWVzID0gCisJCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisJCQorCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHJpdmF0ZSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nKSB7CisJCXJldHVybiAoKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvbmVUb09uZU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lR2V0RGVmYXVsdE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKS5pc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkT25lVG9PbmVHZXREZWZhdWx0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpLmlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOworCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7CisJCQorCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5pc09ycGhhblJlbW92YWwoKSk7CisJCQorCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmlzT3JwaGFuUmVtb3ZhbCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7CisKKwkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvT25lMl8wQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOworCQlvbmVUb09uZS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nT3JwaGFuUmVtb3ZhbFNwZWNpZmllZCgpOworCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7CisJCSAKKwkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKwkJCisJCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZTJfMEFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lLmdldE9ycGhhblJlbW92YWwoKSk7CisJCQorCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChudWxsKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKSk7IAkvLyAuZ2V0RWxlbWVudCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsMigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKKwkJIAorCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCQkKKwkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvT25lMl8wQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKKwkJCisJCW9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQltYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKworCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChudWxsKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE9ycGhhblJlbW92YWxVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7CisKKwkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZTJfMEFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKKwkJb25lVG9PbmUuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKKworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCQorCQlvbmVUb09uZS5zZXRPcnBoYW5SZW1vdmFsKG51bGwpOworCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCQlhc3NlcnRTYW1lKG9uZVRvT25lTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOworCQkKKwkJb25lVG9PbmUuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKKwkJYXR0cmlidXRlUmVzb3VyY2Uuc2V0UHJpbWFyeUFubm90YXRpb24obnVsbCwgbmV3IFN0cmluZ1swXSk7CisJCQorCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmNmM5YgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wVGVzdHMuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzBUZXN0cyBleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yRGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBjcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuT05FX1RPX09ORSwgSlBBLk1BTllfVE9fT05FKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5U3BlY2lmaWVkQWNjZXNzRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkJBU0lDLCBKUEEuVFJBTlNJRU5ULCBKUEEyXzAuQUNDRVNTLCBKUEEyXzAuQUNDRVNTX1RZUEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCkiKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoInRyYW5zaWVudCIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJASWQiKTsKKwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlTcGVjaWZpZWRBY2Nlc3NQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQkFTSUMsIEpQQTJfMC5BQ0NFU1MsIEpQQTJfMC5BQ0NFU1NfVFlQRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKSIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEJhc2ljIik7CisJCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpIik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJfQorCQl9KTsKKwl9CisKKwkJCisJcHVibGljIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVNwZWNpZmllZEFjY2Vzc0ZpZWxkKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIik7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgbmFtZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBpZFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgaWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBpZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgaWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBpZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVNwZWNpZmllZEFjY2Vzc1Byb3BlcnR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIik7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgbmFtZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBpZFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgaWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBpZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgaWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBpZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVyaXZlZElkTWFwcGluZ0luaXRpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JEZXJpdmVkSWQoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpZCA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQlhc3NlcnRFcXVhbHMoaWQuZ2V0TWFwcGluZ0tleSgpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQkKKwkJaWQuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihKUEEuSUQpOworCQlhc3NlcnRFcXVhbHMoaWQuZ2V0TWFwcGluZ0tleSgpLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQkKKwkJaWQuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCWFzc2VydEVxdWFscyhpZC5nZXRNYXBwaW5nS2V5KCksIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0Tm90TnVsbChpZC5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQkKKwkJaWQuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCWFzc2VydEVxdWFscyhpZC5nZXRNYXBwaW5nS2V5KCksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCQorCQlpZC5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7CisJCWFzc2VydEVxdWFscyhpZC5nZXRNYXBwaW5nS2V5KCksIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydE5vdE51bGwoaWQuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJCisJCWlkLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKKwkJYXNzZXJ0RXF1YWxzKGlkLmdldE1hcHBpbmdLZXkoKSwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJCisJCWlkLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnNldFByaW1hcnlBbm5vdGF0aW9uKG51bGwsIG5ldyBTdHJpbmdbMF0pOworCQlhc3NlcnRFcXVhbHMoaWQuZ2V0TWFwcGluZ0tleSgpLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwkKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlMl8wVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTA4YTdkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlMl8wVGVzdHMuamF2YQpAQCAtMCwwICsxLDg1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwkJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewkKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQElkIik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQorCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQElkIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkQW5kTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJASWQiKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZFByb3BlcnR5U3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEpQQS5JRCwgSlBBMl8wLkFDQ0VTUywgSlBBMl8wLkFDQ0VTU19UWVBFKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKKwkJCX0KKwkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKSIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRQcm9wZXJ0eUZpZWxkU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQTJfMC5BQ0NFU1MsIEpQQTJfMC5BQ0NFU1NfVFlQRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKSIpOworCQkJfQorCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJASWQiKTsKKwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCisJCX0pOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZVdpdGhGaWVsZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQElkIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN1YlR5cGVXaXRoTWV0aG9kQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQElkIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN1YlR5cGVOb25QZXJzaXN0ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdWJUeXBlUGVyc2lzdGVudEV4dGVuZHNOb25QZXJzaXN0ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkMi5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkMiIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoImV4dGVuZHMgQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQgIik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJfQorCQl9KTsKKwl9CisJCQorCXB1YmxpYyBHZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NOb3RoaW5nQW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFjY2Vzc0ZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzRmllbGRBbmRNZXRob2RBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkQW5kTWV0aG9kKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NGaWVsZEFubm90YXRlZFByb3BlcnR5U3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZFByb3BlcnR5U3BlY2lmaWVkKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CisKKwkJamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpLmdldEtleSgpKTsKKwkJCisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFjY2Vzc1Byb3BlcnR5QW5ub3RhdGVkRmllbGRTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZFByb3BlcnR5RmllbGRTcGVjaWZpZWQoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOworCQkKKwkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKKworCQlqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCisJCWphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCQkKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOworCQkKKwkJYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKKwkJYXR0cmlidXRlcy5uZXh0KCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuc2V0UHJpbWFyeUFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIG5ldyBTdHJpbmdbMF0pOworCQlhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOworCQlqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCisJCWphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CisKKwkJamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCWNsYXNzUmVmcy5uZXh0KCk7CisJCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKKwkJCisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKKwkJCisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCX0KKwkJCisJcHVibGljIHZvaWQgdGVzdEFjY2Vzc0luaGVyaXRhbmNlMigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCQorCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQljbGFzc1JlZnMubmV4dCgpOworCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7CisJCQorCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwl9CQorCQkKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2UzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOworCQljcmVhdGVUZXN0U3ViVHlwZVdpdGhNZXRob2RBbm5vdGF0aW9uKCk7CisJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQkKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJY2xhc3NSZWZzLm5leHQoKTsKKwkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOworCQkKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJfQkKKwkJCisJcHVibGljIHZvaWQgdGVzdEFjY2Vzc0luaGVyaXRhbmNlNCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlV2l0aEZpZWxkQW5ub3RhdGlvbigpOworCQkKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCWNsYXNzUmVmcy5uZXh0KCk7CisJCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKKwkJCisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwkvL2luaGVyaXRlZCBjbGFzcyBoYXZpbmcgYW5ub3RhdGlvbnMgc2V0IHdpbnMgb3ZlciB0aGUgZGVmYXVsdCBhY2Nlc3Mgc2V0IG9uIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2VQZXJzaXN0ZW5jZVVuaXREZWZhdWx0QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKKworCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQljbGFzc1JlZnMubmV4dCgpOworCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJCisJCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sTm9BY2Nlc3NOb0Fubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAorCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbEVudGl0eUFjY2Vzc05vQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAorCisJCWVudGl0eVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisKKwkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzQWNjZXNzTm9Bbm5vdGF0aW9ucygpICB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAorCisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbEVudGl0eVByb3BlcnR5QWNjZXNzQW5kRmllbGRBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworCQkvL3htbCBhY2Nlc3Mgc2V0IHRvIHByb3BlcnR5LCBmaWVsZCBhbm5vdGF0aW9ucywgSmF2YVBlcnNpc3RlbnRUeXBlIGFjY2VzcyBpcyBmaWVsZAorCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKKworCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sRW50aXR5RmllbGRBY2Nlc3NBbmRQcm9wZXJ0eUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8veG1sIGFjY2VzcyBzZXQgdG8gZmllbGQsIHByb3BlcnR5IGFubm90YXRpb25zLCBKYXZhUGVyc2lzdGVudFR5cGUgYWNjZXNzIGlzIHByb3BlcnR5CisJCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKKworCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNBY2Nlc3NGaWVsZEFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAorCisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJfQorCisJLy9pbmhlcml0YW5jZSB3aW5zIG92ZXIgZW50aXR5LW1hcHBpbmdzIHNwZWNpZmllZCBhY2Nlc3MKKwlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sRW50aXR5TWFwcGluZ3NBY2Nlc3NXaXRoSW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRFbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJCisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlID0gY2hpbGRFbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCisKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbE1ldGFkYXRhQ29tcGxldGVGaWVsZEFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8veG1sIGFjY2VzcyBzZXQgdG8gcHJvcGVydHksIGphdmEgaGFzIGZpZWxkIGFubm90YXRpb25zIHNvIHRoZSBhY2Nlc3Mgc2hvdWxkIGJlIGZpZWxkCisJCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAorCisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwkJCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NOb1htbEFjY2Vzc1htbE1ldGRhdGFDb21wbGV0ZVByb3BlcnR5QW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy94bWwgYWNjZXNzIG5vdCBzZXQsIG1ldGFkYXRhIGNvbXBsZXRlIHNldC4gIEphdmFQZXJzaXN0ZW50VHlwZSBhY2Nlc3MgaXMgcHJvcGVydHkgYmVjYXVzZSBwcm9wZXJ0aWVzIGFyZSBhbm5vdGF0ZWQKKwkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAorCisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTdXBlclBlcnNpc3RlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGVXaXRoRmllbGRBbm5vdGF0aW9uKCk7CisJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQkKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgcm9vdEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJCisJCWFzc2VydEVxdWFscyhyb290SmF2YVBlcnNpc3RlbnRUeXBlLCBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOworCQlhc3NlcnROdWxsKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFN1cGVyUGVyc2lzdGVudFR5cGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGVXaXRoRmllbGRBbm5vdGF0aW9uKCk7CisJCQorCQkvL3N1cGVyIGlzIG5vdCBhZGRlZCB0byB0aGUgZ2V0UGVyc2lzdGVuY2VVbml0LCBidXQgaXQgc2hvdWxkIHN0aWxsIGJlIGZvdW5kCisJCS8vYXMgdGhlIHN1cGVyUGVyc2lzdGVudFR5cGUgYmVjYXVzZSBvZiBpbXBsaWVkQ2xhc3NSZWZzIGFuZCBjaGFuZ2VzIGZvciBidWcgMTkwMzE3CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJYXNzZXJ0Tm90TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKKwl9CQorCQorCS8vRW50aXR5IGV4dGVuZHMgTm9uLUVudGl0eSBleHRlbmRzIEVudGl0eSAKKwlwdWJsaWMgdm9pZCB0ZXN0U3VwZXJQZXJzaXN0ZW50VHlwZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOworCQljcmVhdGVUZXN0U3ViVHlwZU5vblBlcnNpc3RlbnQoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGVQZXJzaXN0ZW50RXh0ZW5kc05vblBlcnNpc3RlbnQoKTsKKwkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkMiIpOworCQkKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgcm9vdEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJCisJCWFzc2VydEVxdWFscyhyb290SmF2YVBlcnNpc3RlbnRUeXBlLCBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOworCQlhc3NlcnROdWxsKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEluaGVyaXRhbmNlSGllcmFyY2h5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGVOb25QZXJzaXN0ZW50KCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlUGVyc2lzdGVudEV4dGVuZHNOb25QZXJzaXN0ZW50KCk7CisJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZDIiKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSByb290SmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJCisJCUl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlPiBpbmhlcml0YW5jZUhpZXJhcmNoeSA9IGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLmluaGVyaXRhbmNlSGllcmFyY2h5KCk7CQorCQkKKwkJYXNzZXJ0RXF1YWxzKGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLCBpbmhlcml0YW5jZUhpZXJhcmNoeS5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMocm9vdEphdmFQZXJzaXN0ZW50VHlwZSwgaW5oZXJpdGFuY2VIaWVyYXJjaHkubmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEluaGVyaXRhbmNlSGllcmFyY2h5MigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlTm9uUGVyc2lzdGVudCgpOworCQljcmVhdGVUZXN0U3ViVHlwZVBlcnNpc3RlbnRFeHRlbmRzTm9uUGVyc2lzdGVudCgpOworCQkKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZDIiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgcm9vdEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCQorCQlJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4gaW5oZXJpdGFuY2VIaWVyYXJjaHkgPSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5pbmhlcml0YW5jZUhpZXJhcmNoeSgpOwkKKwkJCisJCWFzc2VydEVxdWFscyhjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSwgaW5oZXJpdGFuY2VIaWVyYXJjaHkubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUsIGluaGVyaXRhbmNlSGllcmFyY2h5Lm5leHQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdFR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nS2V5TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7CisKKwkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJCisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldE1hcHBpbmdLZXkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKKworCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwaW5nS2V5TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOworCisJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdLZXlNYXBwaW5nQ2hhbmdlSW5SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJdHlwZVJlc291cmNlLnNldFByaW1hcnlBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgbmV3IFN0cmluZ1swXSk7CisJCQkJCisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nS2V5TWFwcGluZ0NoYW5nZUluUmVzb3VyY2VNb2RlbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdFR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQl0eXBlUmVzb3VyY2Uuc2V0UHJpbWFyeUFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIG5ldyBTdHJpbmdbMF0pOworCQkJCQorCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdElzTWFwcGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5pc01hcHBlZCgpKTsKKwkJCisJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsJCisJCWFzc2VydEZhbHNlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmlzTWFwcGVkKCkpOwkKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZEFuZE1ldGhvZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVzU2l6ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkQW5kTWV0aG9kKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCisJCWFzc2VydEVxdWFscygyLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU5hbWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJCisJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpKTsKKwkJYXNzZXJ0TnVsbChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZm9vIikpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTmFtZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIik7CisJCQorCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJCisJCWFzc2VydE51bGwoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImZvbyIpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFJlbmFtZUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IHRlc3RUeXBlID0gY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpZEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuYW1lQXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCQorCQkKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGlkQXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG5hbWVBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJCisJCUlGaWVsZCBpZEZpZWxkID0gdGVzdFR5cGUuZmluZFByaW1hcnlUeXBlKCkuZ2V0RmllbGQoImlkIik7CisJCWlkRmllbGQucmVuYW1lKCJpZDIiLCBmYWxzZSwgbnVsbCk7CisJCQorCQlhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuYW1lQXR0cmlidXRlMiA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpZDJBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKworCQlhc3NlcnROb3RTYW1lKGlkQXR0cmlidXRlLCBpZDJBdHRyaWJ1dGUpOworCQlhc3NlcnRFcXVhbHMoImlkMiIsIGlkMkF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMobmFtZUF0dHJpYnV0ZSwgbmFtZUF0dHJpYnV0ZTIpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBuYW1lQXR0cmlidXRlMi5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFN1cGVyUGVyc2lzdGVudFR5cGVHZW5lcmljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RHZW5lcmljRW50aXR5KCk7CisJCWNyZWF0ZVRlc3RHZW5lcmljTWFwcGVkU3VwZXJjbGFzcygpOworCQkKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5FbnRpdHkxIik7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRW50aXR5MiIpOworCQkKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlhc3NlcnRFcXVhbHMoInRlc3QuRW50aXR5MSIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOworCQlhc3NlcnROb3ROdWxsKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkVudGl0eTIiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RHZW5lcmljRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgRW50aXR5MSAiKTsKKwkJCQlzYi5hcHBlbmQoImV4dGVuZHMgRW50aXR5MjxJbnRlZ2VyPiB7fSIpLmFwcGVuZChDUik7CisJCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVudGl0eTEuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0R2VuZXJpY01hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyBFbnRpdHkyPEs+IHt9IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW50aXR5Mi5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjhkZDNjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuR2VuZXJhdG9yQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCisvKioKKyAqICBHZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUl9OQU1FID0gIlRFU1RfU0VRVUVOQ0VfR0VORVJBVE9SIjsKKworCXB1YmxpYyBHZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisKKwkJR2VuZXJhdG9yQ29udGFpbmVyIGNjID0gaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpOworCQlTZXF1ZW5jZUdlbmVyYXRvciBzZyA9IGNjLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCQorCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCQorCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldENhdGFsb2coKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCisJCQorCQlhbm5vdGF0aW9uLnNldENhdGFsb2coInRlc3RDYXRhbG9nIik7CisJCQorCQlhc3NlcnRFcXVhbHMoInRlc3RDYXRhbG9nIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0Q2F0YWxvZyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZENhdGFsb2coKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCVNlcXVlbmNlR2VuZXJhdG9yMl8wIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKKworCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldERlZmF1bHRDYXRhbG9nKCkpOworCQkKKwkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQ2F0YWxvZygidGVzdENhdGFsb2ciKTsKKwkJCisJCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0RGVmYXVsdENhdGFsb2coKSk7CisJCWFzc2VydEVxdWFscygidGVzdENhdGFsb2ciLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKKwkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCVNlcXVlbmNlR2VuZXJhdG9yMl8wIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKKworCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRDYXRhbG9nKCJ0ZXN0Q2F0YWxvZyIpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwkKKwkJCisJCWFzc2VydEVxdWFscygidGVzdENhdGFsb2ciLCBhbm5vdGF0aW9uLmdldENhdGFsb2coKSk7CisJCQorCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXROYW1lKG51bGwpOworCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUikpOworCX0KKwkKKwkvLyAqKioqKioqKioqIHNjaGVtYSAqKioqKioqKioqCisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOworCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7CisKKwkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXRTY2hlbWEoKSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCisJCQorCQlhbm5vdGF0aW9uLnNldFNjaGVtYSgidGVzdFNjaGVtYSIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0U2NoZW1hIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U2NoZW1hKCkpOworCQlhc3NlcnRFcXVhbHMoInRlc3RTY2hlbWEiLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7CisKKwkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXREZWZhdWx0U2NoZW1hKCkpOworCQkKKwkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkU2NoZW1hKCJ0ZXN0U2NoZW1hIik7CisJCQorCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldERlZmF1bHRTY2hlbWEoKSk7CisJCWFzc2VydEVxdWFscygidGVzdFNjaGVtYSIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CisJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7CisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOworCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSAgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCQorCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldERlZmF1bHRTY2hlbWEoKSk7CisJCQorCQl0aGlzLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7CisJCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwkJCisJCXRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldERlZmF1bHRTY2hlbWEoKSk7CisJCQorCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIlhNTF9TQ0hFTUEiKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXREZWZhdWx0U2NoZW1hKCkpOworCisJCXRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKKwkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJLy9kZWZhdWx0IHNjaGVtYSB0YWtlbiBmcm9tIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgbm90IGVudGl0eS1tYXBwaW5ncyBzaW5jZSB0aGUgZW50aXR5IGlzIG5vdCBpbiBhbiBvcm0ueG1sIGZpbGUKKwkJaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOworCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJU2VxdWVuY2VHZW5lcmF0b3IyXzAgc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzApIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpOworCQkKKwkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkU2NoZW1hKCJ0ZXN0U2NoZW1hIik7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CQorCQkKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0U2NoZW1hIiwgYW5ub3RhdGlvbi5nZXRTY2hlbWEoKSk7CisJCQorCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXROYW1lKG51bGwpOworCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKSk7CisJfQorCQorCS8vICoqKioqKioqKiogdXRpbGl0eSAqKioqKioqKioqCisKKwlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VRVUVOQ0VfR0VORVJBVE9SLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT1cIiIgKyBTRVFVRU5DRV9HRU5FUkFUT1JfTkFNRSArICJcIikiKTsKKwkJCX0KKwkJfSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWMyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWMyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNzllYzEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpYzJfME9ybUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyaWMyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQorCWV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIGdlbmVyaWMyXzBPcm1YbWxSZXNvdXJjZTsKKwkKKwkKKwlwcm90ZWN0ZWQgR2VuZXJpYzJfME9ybUNvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQl0aGlzLmdlbmVyaWMyXzBPcm1YbWxSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5nZW5lcmljMl8wT3JtWG1sUmVzb3VyY2UgPSBudWxsOworCQlzdXBlci50ZWFyRG93bigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZ2V0T3JtWG1sUmVzb3VyY2UoKSB7CisJCXJldHVybiB0aGlzLmdlbmVyaWMyXzBPcm1YbWxSZXNvdXJjZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFhtbEVudGl0eU1hcHBpbmdzIGdldFhtbEVudGl0eU1hcHBpbmdzKCkgeworCQlyZXR1cm4gKFhtbEVudGl0eU1hcHBpbmdzKSBzdXBlci5nZXRYbWxFbnRpdHlNYXBwaW5ncygpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2M4ZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWMyXzBPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitwdWJsaWMgY2xhc3MgR2VuZXJpYzJfME9ybUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKK3sKKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoR2VuZXJpYzJfME9ybUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtRW50aXR5Ml8wVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybU9uZVRvTWFueU1hcHBpbmcyXzBUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtT25lVG9PbmVNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzBUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtUGVyc2lzdGVudFR5cGUyXzBUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cy5jbGFzcyk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwlwcml2YXRlIEdlbmVyaWMyXzBPcm1Db250ZXh0TW9kZWxUZXN0cygpIHsKKwkJc3VwZXIoKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiNTFkYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzLmphdmEKQEAgLTAsMCArMSw1MjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfME9ybUNvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgPSAiTVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSI7CisKKwkJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc01hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQorCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZD4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7CisJCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7CisJCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKworCisJCQorCXB1YmxpYyBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCisJCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQorCQlvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7CisJCW9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJCisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKG92ZXJyaWRlQ29udGFpbmVyLmFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2UoZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5pc0VtcHR5KCkpOworCQkKKwkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKKwkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQorCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKKwkJYXNzZXJ0TnVsbChvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwoeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQkKKwkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOworCQlhc3NlcnRGYWxzZShvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmhhc05leHQoKSk7CisJCWFzc2VydFRydWUoZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5pc0VtcHR5KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCisJCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQorCQlvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7CisJCW9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJCisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKG92ZXJyaWRlQ29udGFpbmVyLmFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2UoZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5pc0VtcHR5KCkpOworCQkKKwkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCisJCW9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJCisJCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAorCQlvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUobnVsbCk7CisJCWFzc2VydE51bGwob3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7CisJCWFzc2VydE51bGwoeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCisJCW9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOworCQkKKwkJCisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOworCisJCQorCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJCQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCQorCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOworCQkKKwkJSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IGpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOworCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJCisJCWFzc2VydEVxdWFscygiQkFSIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7CisJCQorCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOworCQkKKwkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkKKwkJb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCQorCQkKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7CisKKwkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKKwkJCisJCWFzc2VydEVxdWFscyg0LCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKKwkJCisJCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlhc3NlcnRFcXVhbHMoMywgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKworCQlqb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJCisJCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOworCQlhc3NlcnRFcXVhbHMoMSwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7CisJCQorCQlqb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkKKwkJb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7CisJCQorCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7CisJCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOworCQkJCQorCQlhc3NlcnRFcXVhbHMoNCwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7CisJCQorCQkKKwkJam9pbmluZ1N0cmF0ZWd5Lm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOworCQlMaXN0SXRlcmF0b3I8Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOworCisKKwkJam9pbmluZ1N0cmF0ZWd5Lm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOworCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCisJCWFzc2VydEVxdWFscygiQkFaIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCisJCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQorCQlvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3koKTsKKwkJCisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOworCQkKKwkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwkKKwkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmFkZCgwLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOworCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuYWRkKDEsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7CisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoMiwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKKwkJCisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7CisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7CisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7CisKKwkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCQorCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkubW92ZSgyLCAwKTsKKwkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisKKwkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMCwgMSk7CisJCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7CisJCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7CisJCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwkJCisJCQorCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOworCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKworCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOworCQlhc3NlcnRGYWxzZShqb2luaW5nU3RyYXRlZ3kuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5oYXNOZXh0KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0SXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgb3JtRW50aXR5LmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRUcnVlKGFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pblRhYmxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCSgoQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCkgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSkuc2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7CisJCUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSAoKEFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzApIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOworCQkKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7CisKKwkJCisJCUpvaW5UYWJsZSBqb2luVGFibGUgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCk7CisJCWpvaW5UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJCQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLmdldE5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzApIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkpLnNldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOworCQlKb2luVGFibGVKb2luaW5nU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gKChBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wKSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKKwkJCisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOworCQorCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLnNldE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7CisKKwkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOworCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7CisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKKwkJCisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7CisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7CisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7CisKKwkJTGlzdEl0ZXJhdG9yPEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCQorCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLmdldEpvaW5Db2x1bW5zKCkubW92ZSgyLCAwKTsKKwkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKworCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLmdldEpvaW5Db2x1bW5zKCkubW92ZSgwLCAxKTsKKwkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKworCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOworCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7CisJCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCQorCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOworCQlhc3NlcnRGYWxzZShqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5oYXNOZXh0KCkpOworCX0JCisJCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRKb2luVGFibGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzTWFueVRvTWFueSgpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9ICgoQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCkgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7CisKKwkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKTsKKwkJCisJCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGRfQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKKwkJCisJCQorCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT09fRk9PIiwgam9pblRhYmxlLmdldE5hbWUoKSk7CisJCQorCQlQZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpOworCQkoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpICBtYXBwZWRTdXBlcmNsYXNzLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikpLm1ha2VTcGVjaWZpZWQoKTsKKwkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7CisJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZS5nZXROYW1lKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODc0MjU3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNDE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwdWJsaWMgR2VuZXJpY09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKKwkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0Q29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfRklMRV9QQVRIKTsKKwkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKKwkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuRkVUQ0hfVFlQRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uKGZldGNoPUZldGNoVHlwZS5MQVpZKSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKKwkJCX0KKwkJfSk7CisJfQkKKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7CisJCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lTWFwcGluZyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lTWFwcGluZyIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7CisJCQkJCisJCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCisJCWVsZW1lbnRDb2xsZWN0aW9uLnNldE5hbWUoIm5ld05hbWUiKTsKKwkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7CisJCisJCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKKwkJZWxlbWVudENvbGxlY3Rpb24uc2V0TmFtZShudWxsKTsKKwkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7CisJCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lTWFwcGluZyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lTWFwcGluZyIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7CisJCQkJCisJCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCisJCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7CisJCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lKCkpOworCQorCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKKwkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE5hbWUobnVsbCk7CisJCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKKwkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKKwkJCisJCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOworCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOworCQkJCQorCQkvL3NldCBmZXRjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKKwkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUik7CisJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOworCQorCQllbGVtZW50Q29sbGVjdGlvbi5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlkpOworCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7CisKKwkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKKwkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gobnVsbCk7CisJCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOworCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOworCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CisJCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7CisJCQkJCisJCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAorCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOworCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CisJCisJCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOworCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKKworCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCisJCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKKwkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKKwkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKKwkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKKworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZm9vIik7CisJCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOworCisJCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOworCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRGZXRjaCgpKTsKKwl9CisJCisJCisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKKwkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKKworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJCisJCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOworCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOworCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisKKwkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldEZldGNoKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7CisJCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7CisKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisKKwkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOworCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRGZXRjaCgpKTsKKwl9CisJCisJCisJcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKKwkJCisJCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7CisJCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQorCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKKwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKKwkJCisJCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7CisJCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQorCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7CisJCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKKworCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOworCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKKwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7CisKKwkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKKwkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOworCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOworCQkKKwkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKKwkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7CisJCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7CisJCQorCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOworCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7CisJCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7CisJCQorCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOworCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOworCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7CisJCQorCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOworCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOworCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKKwkJCisJCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7CisJCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQorCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKKwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7CisvL1RPRE8JYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChJQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njg3OWFhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRlZE1hcHBpbmcyXzBUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTY3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX05BTUUgPSAiY2l0eSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSA9ICJFX0NJVFkiOworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERBQkxFX1RZUEVfTkFNRSA9ICJNeUVtYmVkZGFibGUiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBFTUJFRERBQkxFX1RZUEVfTkFNRTsKKworCXB1YmxpYyBHZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU1CRURERUQsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5DT0xVTU4pOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIsIGNvbHVtbj1AQ29sdW1uKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FICsgIlwiKSkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCisJCQl9CisJCX0pOworCX0JCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQorCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkVNQkVEREVELCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRlZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiIG15RW1iZWRkZWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlRW1iZWRkYWJsZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5PTkVfVE9fT05FKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19NQU5ZKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKEVNQkVEREFCTEVfVFlQRV9OQU1FKS5hcHBlbmQoIiB7Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgICIpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlQWRkcmVzc0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuSUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIEFkZHJlc3MgeyIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgICIpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5DT0xVTU4pOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAQ29sdW1uKG5hbWU9XCJBX1NUQVRFXCIpIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eUN1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuSUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBaaXBDb2RlIHppcENvZGU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJaaXBDb2RlIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHppcDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgcGx1c2ZvdXI7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJaaXBDb2RlLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOworCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkTWFwcGluZyIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkTWFwcGluZyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCQkKKwkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKKwkJZW1iZWRkZWRSZXNvdXJjZS5zZXROYW1lKCJuZXdOYW1lIik7CisJCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7CisJCisJCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKKwkJZW1iZWRkZWRSZXNvdXJjZS5zZXROYW1lKG51bGwpOworCQlhc3NlcnROdWxsKG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRNYXBwaW5nIik7CisJCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygiZW1iZWRkZWRNYXBwaW5nIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZW1iZWRkZWRNYXBwaW5nIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOworCQkJCQorCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAorCQlvcm1FbWJlZGRlZE1hcHBpbmcuc2V0TmFtZSgibmV3TmFtZSIpOworCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOworCQorCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKKwkJb3JtRW1iZWRkZWRNYXBwaW5nLnNldE5hbWUobnVsbCk7CisJCWFzc2VydE51bGwob3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwoZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOworCX0KKwkKKy8vCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24geworLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworLy8JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRNYXBwaW5nIik7CisvLwkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworLy8JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKKy8vCQkKKy8vCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUVtYmVkZGVkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKKy8vCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKKy8vCQkJCQorLy8JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKy8vCQkKKy8vCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZTIgPSBvcm1FbWJlZGRlZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7CisvLwkJYXR0cmlidXRlT3ZlcnJpZGUyLnNldE5hbWUoIkJBUiIpOworLy8JCQorLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisvLwkJCisvLwkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUzID0gb3JtRW1iZWRkZWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDEpOworLy8JCWF0dHJpYnV0ZU92ZXJyaWRlMy5zZXROYW1lKCJCQVoiKTsKKy8vCQkKKy8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKKy8vCQkKKy8vCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKy8vCQlhc3NlcnRFcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGUyLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGUzLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGUsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOworLy8JCQorLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKy8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKy8vCX0KKy8vCQorLy8JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisvLwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZE1hcHBpbmciKTsKKy8vCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisvLwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOworLy8KKy8vCQlvcm1FbWJlZGRlZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCkuc2V0TmFtZSgiRk9PIik7CisvLwkJb3JtRW1iZWRkZWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDEpLnNldE5hbWUoIkJBUiIpOworLy8JCW9ybUVtYmVkZGVkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyKS5zZXROYW1lKCJCQVoiKTsKKy8vCQkKKy8vCQlhc3NlcnRFcXVhbHMoMywgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOworLy8JCQorLy8JCW9ybUVtYmVkZGVkTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKKy8vCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOworLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisvLworLy8JCW9ybUVtYmVkZGVkTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKKy8vCQlhc3NlcnRFcXVhbHMoMSwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOworLy8JCWFzc2VydEVxdWFscygiQkFaIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKy8vCQkKKy8vCQlvcm1FbWJlZGRlZE1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7CisvLwkJYXNzZXJ0RXF1YWxzKDAsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKKy8vCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOworCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7CisKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJCisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOworCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMywgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwkJCisJCQorCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMiwgMCk7CisJCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKKworCisJCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwLCAxKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZE1hcHBpbmciKTsKKwkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9ybUVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOworCQkKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJCisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOworCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7CisKKwkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCQorCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMiwgMCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMCwgMSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCQorCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKKwl9CisJCisJCisJcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTWFwcGluZ05vVW5kZXJ5bGluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOworCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKKworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZm9vIik7CisJCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOworCisJCQorCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOworCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUyID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQkKKwkJLy9lbWJlZGRlZCBtYXBwaW5nIGlzIHZpcnR1YWwsIHNwZWNpZmllZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHNob3VsZCBleGlzdAorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOworCQlPcm1FbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQkKKwkJSmF2YUVtYmVkZGVkTWFwcGluZyBqYXZhRW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7CisJCUNvbHVtbiBqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4gPSBqYXZhRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLmdldENvbHVtbigpOworCQkKKwkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPT19DT0xVTU4iKTsKKwkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKKwkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKKwkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKKwkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7CisJCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKKwkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7CisKKwkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRUeXBlMi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgic3RhdGUiKS5nZXRNYXBwaW5nKCk7CisJCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfU1RBVEVfQ09MVU1OIik7CisJCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPT19DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscyg1LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscyg3LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKKwkJCisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiTVlfU1RBVEVfQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCQorCQkKKwkJCisJCS8vZW1iZWRkZWQgbWFwcGluZyBpcyBzcGVjaWZpZWQsIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyBzaG91bGQgZXhpc3QKKwkJcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5tYWtlU3BlY2lmaWVkKCk7CisJCWdldE9ybVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscygyNTUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9TVEFURV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCQorCQkvL3NldCBvbmUgb2YgdGhlIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyB0byBzcGVjaWZpZWQsIHZlcmlmeSBvdGhlcnMgYXJlIHN0aWxsIHZpcnR1YWwKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJCisJCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLmdldE5hbWUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJfQorCisJCisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmdBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7CisKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQkKKwkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKKwkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBvcm1BdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKworCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOworCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKworCQorCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlvcm1Db2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOworCisJCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCW9ybUNvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOworCQlhc3NlcnRFcXVhbHMoIkFfU1RBVEUiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKworCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiemlwIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJb3JtQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7CisJCWFzc2VydEVxdWFscygiemlwIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CisKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOworCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKKworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCQorCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQorCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKKworCQkvL1RPRE8KKy8vCQlhc3NlcnRFcXVhbHMoNCwgb3JtRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVtYmVkZGVkTWFwcGluZy5kZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkpKTsKKy8vCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKy8vCisvLwkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworLy8JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKy8vCQlYbWxDb2x1bW4geG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7CisvLwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CisvLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOworLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKKy8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKKy8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOworLy8vLwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHhtbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworLy8vLwkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKKy8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7CisvLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOworLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOworLy8JCQorLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKy8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKKy8vCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CisvLworLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKy8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKKy8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7CisvLworLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisvLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7CisvLwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOworCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKKworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisKKwkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzIik7CisJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJLy9UT0RPCisvLwkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVtYmVkZGVkTWFwcGluZy5kZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkpKTsKKy8vCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5kZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCk7CisvLworLy8JCVhtbEF0dHJpYnV0ZU92ZXJyaWRlIG9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisvLwkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOworLy8JCWFzc2VydEVxdWFscygiY2l0eSIsIHhtbENvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKKy8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7CisvLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOworLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOworLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7CisvLy8vCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgeG1sQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisvLy8vCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOworLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKKy8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNiksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7CisvLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7CisvLwkJCisvLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworLy8JCXhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOworLy8JCWFzc2VydEVxdWFscygiaWQiLCB4bWxDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7CisvLworLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKy8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKKy8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgeG1sQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOworLy8KKy8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisvLwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworLy8JCXhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOworLy8JCWFzc2VydEVxdWFscygiemlwIiwgeG1sQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmdBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZCIpOworCQkKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOworCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOworCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKKwkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKKwkJCisJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOworCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKKwkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOworCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7CisJCQorCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7CisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7CisJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7CisJCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmdBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZCIpOworCQkKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOworCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOworCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKKwkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKKwkJCisJCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOworCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKKwkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gKChFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm92ZXJyaWRlIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJPVkVSUklERV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmdBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZCIpOworCQkKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOworCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOworCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOworCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7CisJCQorCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7CisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7CisJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKKwkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmdBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZCIpOworCQkKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOworCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOworCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOworCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7CisJCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7CisJCQorCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7CisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7CisJCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7CisJCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKKwkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibXlFbWJlZGRlZCIpOworCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisKKwkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCQorCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7CisJCQorCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKKwkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOworCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOworCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDEsIGFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCisJCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7CisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgYXNzb2NpYXRpb25PdmVycmlkZSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7CisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5tb3ZlKDEsIDApOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKKwkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJCisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7CisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZURlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7CisJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CisJCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJteUVtYmVkZGVkIik7CisJCU9ybUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBqb2luaW5nU3RyYXRlZ3kuam9pbkNvbHVtbnNTaXplKCkpOworCQlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gam9pbmluZ1N0cmF0ZWd5LmpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHZpcnR1YWxKb2luQ29sdW1uLmdldFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKKwkJCisKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFFbWJlZGRhYmxlID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCkubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKKwkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIGphdmFFbWJlZGRhYmxlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOworCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9DT0xVTU4iKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiTVlfUkVGRVJFTkNFX0NPTFVNTiIpOworCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKKwkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7CisJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CisJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlqb2luaW5nU3RyYXRlZ3kgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBqb2luaW5nU3RyYXRlZ3kuam9pbkNvbHVtbnNTaXplKCkpOworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuam9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiTVlfSk9JTl9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOworCisJCWFzc2VydEVxdWFscygiTVlfSk9JTl9DT0xVTU4iLCBqb2luaW5nU3RyYXRlZ3kuam9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKKworCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQkKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKKwkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJteUVtYmVkZGVkIik7CisJCU9ybUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisKKwkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCisJCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgwLCBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm15RW1iZWRkZWQiKTsKKwkJT3JtRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKKwkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJteUVtYmVkZGVkIik7CisJCU9ybUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQkKKwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKKworCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7CisJCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoYXNzb2NpYXRpb25PdmVycmlkZSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiYmFyIik7CQorCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuYXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm15RW1iZWRkZWQiKTsKKwkJT3JtRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJCisJCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKKwkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJteUVtYmVkZGVkIik7CisJCU9ybUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCQorCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7CisJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CisJCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibXlFbWJlZGRlZCIpOworCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOworCisJCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CisJCQorCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOworCisJCUl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJteUVtYmVkZGVkIik7CisJCU9ybUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisKKwkJCisJCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7CisJCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKKwkJCisJCQorCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgxLCAwKTsKKwkJTGlzdEl0ZXJhdG9yPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKworCisJCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDAsIDEpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7CisJCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7CisJCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibXlFbWJlZGRlZCIpOworCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCisJCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7CisJCisJCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgwLCBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgxLCBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgyLCBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKKwkJCQorCQlMaXN0SXRlcmF0b3I8QXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQkKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMiwgMCk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMCwgMSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCQorCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKKwkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKKwkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJteUVtYmVkZGVkIik7CisJCU9ybUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkKKwkJQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCQorCQkKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQorCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOworCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOworCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJZ2V0T3JtWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm15RW1iZWRkZWQiKTsKKwkJT3JtRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gQ29sbGVjdGlvblRvb2xzLmdldChvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSwgMSk7CisJCUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSAoKEFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzApIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKKwkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZV9BZGRyZXNzIiwgam9pblRhYmxlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuam9pbkNvbHVtbnNTaXplKCkpOworCQlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gam9pblRhYmxlLmpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZV9pZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVfQWRkcmVzcyIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJSm9pbkNvbHVtbiB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19pZCIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZV9BZGRyZXNzIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOworCQkKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFFbWJlZGRhYmxlID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCkubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKKwkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIGphdmFFbWJlZGRhYmxlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7CisJCUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSBqb2luVGFibGVTdHJhdGVneSA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7CisJCWpvaW5UYWJsZVN0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKKwkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pblRhYmxlU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX0NPTFVNTiIpOworCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJNWV9SRUZFUkVOQ0VfQ09MVU1OIik7CisJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOworCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKKwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJCisJCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGVTdHJhdGVneS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKKwkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTVlfSU5WRVJTRV9KT0lOX0NPTFVNTiIpOworCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiTVlfSU5WRVJTRV9SRUZFUkVOQ0VfQ09MVU1OIik7CisJCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJJTlZFUlNFX0JBUiIpOworCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJJTlZFUlNFX0NPTFVNTl9ERUYiKTsKKwkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKKwkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLCAxKTsKKwkJam9pbmluZ1N0cmF0ZWd5ID0gKChBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wKSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCk7CisJCWpvaW5UYWJsZSA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luVGFibGUuam9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiTVlfSk9JTl9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOworCisJCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJdmlydHVhbEludmVyc2VKb2luQ29sdW1uID0gam9pblRhYmxlLmludmVyc2VKb2luQ29sdW1ucygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9JTlZFUlNFX0pPSU5fQ09MVU1OIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiTVlfSU5WRVJTRV9SRUZFUkVOQ0VfQ09MVU1OIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfQkFSIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldFRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfQ09MVU1OX0RFRiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOworCisJCQorCQkvL2FkZCB0aGUgamF2YSBhc3NvY2lhdGlvbiBvdmVycmlkZSBhbmQgbWFrZSBzdXJlIHRoZSBzZXR0aW5ncyBhcmUgbm90IHVzZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIGFzc29jaWF0aW9uIG92ZXJyaWRlIGRlZmF1bHRzIGluIHRoZSBzcGVjaWZpZWQgb3JtIGVtYmVkZGVkIG1hcHBpbmcKKwkJSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBqYXZhRW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOworCQlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGphdmFFbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpLmFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlKYXZhSm9pblRhYmxlIGphdmFKb2luVGFibGUgPSAoKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlUmVsYXRpb25zaGlwUmVmZXJlbmNlMl8wKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKSkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CisJCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9GT08iKTsKKwkJSmF2YUpvaW5Db2x1bW4gamF2YUpvaW5Db2x1bW4gPSBqYXZhSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisJCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfSk9JTl9DT0xVTU5fTkFNRSIpOworCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiSkFWQV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX05BTUUiKTsKKwkJSmF2YUpvaW5Db2x1bW4gamF2YUludmVyc2VKb2luQ29sdW1uID0gamF2YUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKKwkJamF2YUludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FIik7CisJCWphdmFJbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiSkFWQV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfTkFNRSIpOworCQkKKwkJZ2V0T3JtWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gQ29sbGVjdGlvblRvb2xzLmdldChvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSwgMSk7CisJCWpvaW5pbmdTdHJhdGVneSA9ICgoQXNzb2NpYXRpb25PdmVycmlkZVJlbGF0aW9uc2hpcFJlZmVyZW5jZTJfMCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpOworCQlqb2luVGFibGUgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgam9pblRhYmxlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuam9pbkNvbHVtbnNTaXplKCkpOworCQl2aXJ0dWFsSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5qb2luQ29sdW1ucygpLm5leHQoKTsKKwkJCisJCWdldE9ybVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKKworCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9SRUZFUkVOQ0VfQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7CisJCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7CisJCXZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiTVlfSU5WRVJTRV9KT0lOX0NPTFVNTiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIk1ZX0lOVkVSU0VfUkVGRVJFTkNFX0NPTFVNTiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX0JBUiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX0NPTFVNTl9ERUYiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKKwkJCisJCQorCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQkKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCWdldE9ybVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKKwkJZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7CisJCW92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLCAxKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlqb2luaW5nU3RyYXRlZ3kgPSAoKEFzc29jaWF0aW9uT3ZlcnJpZGVSZWxhdGlvbnNoaXBSZWZlcmVuY2UyXzApIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKTsKKwkJam9pblRhYmxlID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnRFcXVhbHMoIkpBVkFfRk9PIiwgam9pblRhYmxlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuam9pbkNvbHVtbnNTaXplKCkpOworCQl2aXJ0dWFsSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5qb2luQ29sdW1ucygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJKQVZBX0pPSU5fQ09MVU1OX05BTUUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkpBVkFfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9OQU1FIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiSkFWQV9GT08iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7CisJCXZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiSkFWQV9JTlZFUlNFX0pPSU5fQ09MVU1OX05BTUUiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJKQVZBX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9OQU1FIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkpBVkFfRk9PIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldFRhYmxlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlDdXN0b21lcigpOworCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MyKCk7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOworCQkKKwkJT3JtUGVyc2lzdGVudFR5cGUgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSB6aXBDb2RlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7CisKKwkJY3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLm1ha2VTcGVjaWZpZWQoKTsKKwkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoNSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygic3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCQorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCisJCQorCQlhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5tYWtlU3BlY2lmaWVkKCk7CisJCUVtYmVkZGVkTWFwcGluZyBuZXN0ZWRFbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbmVzdGVkRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCWFzc2VydEVxdWFscygyLCBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCQorCQl6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikubWFrZVNwZWNpZmllZCgpOworCQlCYXNpY01hcHBpbmcgcGx1c0ZvdXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgemlwQ29kZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwbHVzZm91ciIpLmdldE1hcHBpbmcoKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFIik7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKKworCQkvL2NoZWNrIHRoZSBuZXN0ZWQgZW1iZWRkZWQgKEFkZHJlc3MuemlwQ29kZSkgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gWmlwY29kZS5wbHVzZm91cgorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIik7CisJCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCisJCS8vY2hlY2sgdGhlIHRvcC1sZXZlbCBlbWJlZGRlZCAoQ3VzdG9tZXIuYWRkcmVzcykgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gWmlwY29kZS5wbHVzZm91cgorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoKEVtYmVkZGVkTWFwcGluZykgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKCJ6aXBDb2RlLnBsdXNmb3VyIik7CisJCWFzc2VydEVxdWFscygiemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKKwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7CisJCQorCQkvL3NldCBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUgb24gQWRkcmVzcy56aXBDb2RlIGVtYmVkZGVkIG1hcHBpbmcKKwkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSAoKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIikuc2V0VmlydHVhbChmYWxzZSk7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUhfT1ZFUlJJREUiKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEVfT1ZFUlJJREUiKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiKTsKKwkKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKChFbWJlZGRlZE1hcHBpbmcpIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgiemlwQ29kZS5wbHVzZm91ciIpOworCQlhc3NlcnRFcXVhbHMoInppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCQkKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoInppcENvZGUucGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQkvL1RPRE8gSSBoYXZlIHRoZSBkZWZhdWx0IHdyb25nIGluIHRoaXMgY2FzZSwgYnV0IHRoaXMgd2FzIHdyb25nIGJlZm9yZSBhcyB3ZWxsLiAgTmVlZCB0byBmaXggdGhpcyBsYXRlcgorLy8JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscygyNTUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUVudGl0eTJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUVudGl0eTJfMFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4ZjJiYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRW50aXR5Ml8wVGVzdHMuamF2YQpAQCAtMCwwICsxLDE1NDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtRW50aXR5Ml8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7CisJCisJCisJcHVibGljIEdlbmVyaWNPcm1FbnRpdHkyXzBUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuT05FX1RPX09ORSwgSlBBLk1BTllfVE9fT05FLCBKUEEuT05FX1RPX01BTlksIEpQQS5NQU5ZX1RPX01BTlkpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M0OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICAiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSU5IRVJJVEFOQ0UsIEpQQS5JTkhFUklUQU5DRV9UWVBFLCBKUEEuT05FX1RPX09ORSwgSlBBLk1BTllfVE9fT05FLCBKUEEuT05FX1RPX01BTlksIEpQQS5NQU5ZX1RPX01BTlkpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIik7CisJCQkJc2IuYXBwZW5kKCJhYnN0cmFjdCIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMjsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczM7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzNDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgIik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7CisJCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7CisJCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuSUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkN1c3RvbWVyICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGlkOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkxvbmdUaW1lQ3VzdG9tZXIgZXh0ZW5kcyBDdXN0b21lciAiKTsKKwkJCQlzYi5hcHBlbmQoInt9Iik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiTG9uZ1RpbWVDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisKKworCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFppcENvZGUgemlwQ29kZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlppcENvZGUiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgemlwOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBwbHVzZm91cjsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlppcENvZGUuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCisJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CisJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CisJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CisJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBlbnRpdHkub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwkJCisJCQorCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKKwkJCisJCW92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGVudGl0eS5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQorCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBlbnRpdHkub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisJCQorCQkKKwkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7CisJCQorCQlvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZW50aXR5Lm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQorCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gb3JtRW50aXR5LmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisJCQorCQkKKwkJT3JtRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKE9ybUVudGl0eSkgb3JtRW50aXR5LmdldFBhcmVudEVudGl0eSgpOworCQlvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBhYnN0cmFjdEVudGl0eS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnNUYWJsZVBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IG9ybUVudGl0eS5hbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKKwkJCisJCQorCQlPcm1FbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1FbnRpdHkuZ2V0UGFyZW50RW50aXR5KCk7CisJCW92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gYWJzdHJhY3RFbnRpdHkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7CisJfQorLy9UT0RPCisvLwlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzTWFwcGVkU3VwZXJjbGFzc0luT3JtWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKy8vCQljcmVhdGVUZXN0U3ViVHlwZSgpOworLy8JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKy8vCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworLy8JCQorLy8JCUl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKTsKKy8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKy8vCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gb3JtRW50aXR5LmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCX0KKwkJCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCisJCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAorCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgxLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiQkFaIik7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMSwgMCk7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCQorCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKKwkJCisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CisJCQorCisJCU9ybU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQkKKwkJbWFwcGVkU3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLm1ha2VTcGVjaWZpZWQoKTsKKwkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOworCisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKKworCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKKwkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOworCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKKworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKKwkJCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc0VudGl0eUhpZXJhY2h5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQkKKworCQlPcm1FbnRpdHkgc3VwZXJjbGFzcyA9IChPcm1FbnRpdHkpIG9ybUVudGl0eS5nZXRQYXJlbnRFbnRpdHkoKTsKKwkJCisJCXN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5tYWtlU3BlY2lmaWVkKCk7CisJCUJhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBzdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CisKKwkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CisJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CisKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CisJCQorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKworCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7CisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkJBUiIpOworCisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQkKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCQorCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJiYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkJCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJCisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoImlkIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CQkKKwkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJCisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwkJCisJCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CisJCQorCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsJCQorCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKKwkJCisJCUl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCisJCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwkJCisJCWFzc2VydEVxdWFscygxLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOworCisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOworCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CisJCQorCQkKKwkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDIsIDApOworCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCisJCWFzc2VydEVxdWFscygibmFtZSIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7CisKKworCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCwgMSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCisJCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgwLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMSwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDIsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7CisJCQkKKwkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCQorCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDIsIDApOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMCwgMSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQkKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCisJCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQkKKwkJCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gZW50aXR5Lm92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKKwl9CisJCisvLwkvL1RPRE8gYWRkIGFsbCBtYXBwaW5nIHR5cGVzIHRvIHRoZSBtYXBwZWQgc3VwZXJjbGFzcyB0byB0ZXN0IHdoaWNoIG9uZXMgYXJlIG92ZXJyaWRhYmxlCisJcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBvcm1FbnRpdHkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IG9ybUVudGl0eS5hbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCQorCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisKKwkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCisJCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgeG1sQXNzb2NpYXRpb25PdmVycmlkZSk7CisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7CisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDEsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCisJCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAorCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMSwgMCk7CisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7CisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCQorCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKKwkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRUcnVlKGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaXNFbXB0eSgpKTsKKwkJCisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQkKKy8vCisvLwkJLy9NYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworLy8JCS8vQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MucGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisvLwkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisvLwkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOworLy8JCQorLy8JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lKCkpOworLy8JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisvLwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCisvLwkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKKy8vCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKKy8vCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7CisvLwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKy8vCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQkKKwkJCisJCQorLy8JCS8vVE9ETyBqb2luQ29sdW1ucyBmb3IgZGVmYXVsdCBhc3NvY2lhdGlvbiBvdmVycmlkZXMKKy8vLy8JSUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpLm5leHQoKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisvLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKKy8vLy8JCisvLy8vCisvLy8vCUlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoSU1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKy8vLy8JCisvLy8vCUlPbmVUb09uZU1hcHBpbmcgYWRkcmVzc01hcHBpbmcgPSAoSU9uZVRvT25lTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5wZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOworLy8vLwlJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gYWRkcmVzc01hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKy8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKy8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiQkFSIik7CisvLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBWiIpOworLy8vLwkKKy8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOworLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGUuQU5OT1RBVElPTl9OQU1FKSk7CisvLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXMuQU5OT1RBVElPTl9OQU1FKSk7CisvLy8vCisvLy8vCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKSk7CisvLy8vCWRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisvLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisvLy8vCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKCJCQVoiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKKy8vLy8KKy8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG51bGwpOworLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOworLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOworLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7CisvLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKKy8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKKy8vLy8KKy8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisvLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKKy8vLy8JCisvLy8vCWphdmFFbnRpdHkuYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgwKS5zZXROYW1lKCJhZGRyZXNzIik7CisvLy8vCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKSk7CisKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisKKwkJLy9hZGQgdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAorCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiQkFSIik7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQorCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQkKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiYmFyIik7CisJCWFzc2VydEVxdWFscyg1LCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCQorCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCQorCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQkJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJCisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJCisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOworCisJCUl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCQorCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOworCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJCisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7CisJCQorCQkKKwkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMSwgMCk7CisJCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisKKworCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgwLCAxKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCQorCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgwLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMSwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDIsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOworCQkJCisJCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCQorCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMiwgMCk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5tb3ZlKDAsIDEpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCQorCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQkKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0IiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQkKKwkJCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCQorCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpOworCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOworCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHppcENvZGVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKKworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDcsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcy5jaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RhdGUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkxvbmdUaW1lQ3VzdG9tZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQkKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7CisKKwkJCisJCXppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5tYWtlU3BlY2lmaWVkKCk7CisJCUJhc2ljTWFwcGluZyBwbHVzRm91ck1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSB6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuZ2V0TWFwcGluZygpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEUiKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOworCisJCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCS8vY2hlY2sgdGhlIHRvcC1sZXZlbCBlbWJlZGRlZCAoQ3VzdG9tZXIuYWRkcmVzcykgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gWmlwY29kZS5wbHVzZm91cgorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCQkKKwkJLy9zZXQgYW4gYXR0cmlidXRlIG92ZXJyaWRlIG9uIEFkZHJlc3MuemlwQ29kZSBlbWJlZGRlZCBtYXBwaW5nCisJCWFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLm1ha2VTcGVjaWZpZWQoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSAoKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIikuc2V0VmlydHVhbChmYWxzZSk7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUhfT1ZFUlJJREUiKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEVfT1ZFUlJJREUiKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiKTsKKworCisJCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKKwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7CisJCQorCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJLy9UT0RPIEkgaGF2ZSB0aGUgZGVmYXVsdCB3cm9uZyBpbiB0aGlzIGNhc2UsIGJ1dCB0aGlzIHdhcyB3cm9uZyBiZWZvcmUgYXMgd2VsbC4gIE5lZWQgdG8gZml4IHRoaXMgbGF0ZXIKKy8vCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscyhudWxsLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscyhudWxsLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOworCQkKKwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7CisJCQorCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKKwkJCisJCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7CisJCQorCQllbnRpdHlSZXNvdXJjZS5zZXRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOworCisJCWVudGl0eVJlc291cmNlLnNldENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7CisJCQorCQllbnRpdHlSZXNvdXJjZS5zZXRDYWNoZWFibGUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKKwkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IChQZXJzaXN0ZW5jZVVuaXQyXzApIGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlhc3NlcnRFcXVhbHMoU2hhcmVkQ2FjaGVNb2RlLlVOU1BFQ0lGSUVELCBwZXJzaXN0ZW5jZVVuaXQyXzAuZ2V0U2hhcmVkQ2FjaGVNb2RlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCQorCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5BTEwpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8KKy8vCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRDYWNoZWFibGVGcm9tU3VwZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgc3ViT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKKwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQkKKwkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IChQZXJzaXN0ZW5jZVVuaXQyXzApIGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQkJCisvLwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkKKy8vCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgc3ViT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKKwkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOworCQkKKwkJQ2FjaGVhYmxlMl8wIGphdmFDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKKwkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQkKKwkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IChQZXJzaXN0ZW5jZVVuaXQyXzApIGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCQkKKwkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQkKKwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQkKKwkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQkKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCisJCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkKKy8vCQlqYXZhQ2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MmRiOTAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nMl8wVGVzdHMuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtTWFueVRvTWFueU1hcHBpbmcyXzBUZXN0cworCWV4dGVuZHMgR2VuZXJpYzJfME9ybUNvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHVibGljIEdlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKworCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuSUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKKwkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7CisKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisKKwkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAorCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisJCQorCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOworCQlhdHRyaWJ1dGVOYW1lcyA9IAorCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisJCQorCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7CisJCWF0dHJpYnV0ZU5hbWVzID0gCisJCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKwkJCisJCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyNDljZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEKQEAgLTAsMCArMSwyMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxEZXJpdmVkSWRfMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHNJZF8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljT3JtTWFueVRvT25lTWFwcGluZzJfMFRlc3RzCisJZXh0ZW5kcyBHZW5lcmljMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwdWJsaWMgR2VuZXJpY09ybU1hbnlUb09uZU1hcHBpbmcyXzBUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkKKwkJCX0KKwkJfSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKSkpIHsKKwkJCWVhY2gubWFrZVNwZWNpZmllZCgpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CQkJCQorCQkJfQorCQl9KTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpKSkgeworCQkJZWFjaC5tYWtlU3BlY2lmaWVkKCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aERlcml2ZWRJZCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKKwkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKKwkJWG1sRGVyaXZlZElkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCXJlc291cmNlTWFwcGluZy5zZXRJZChCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJcmVzb3VyY2VNYXBwaW5nLnNldElkKG51bGwpOworCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXREZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7CisJCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7CisJCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5zZXRWYWx1ZSh0cnVlKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuc2V0VmFsdWUoZmFsc2UpOworCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7CisJCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7CisJCVhtbE1hcHNJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7CisJCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiYmFyIik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQobnVsbCk7CisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKKwkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKKwkJWG1sTWFwc0lkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLnNldFZhbHVlKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuc2V0VmFsdWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5zZXRWYWx1ZShudWxsKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVyaXZlZElkKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOworCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0UmVzb3VyY2VUeXBlTWFwcGluZygpOworCQkKKwkJWG1sTWFueVRvT25lIHJlc291cmNlTWFueVRvT25lID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CisJCXJlc291cmNlTWFueVRvT25lLnNldElkKEJvb2xlYW4uVFJVRSk7CisJCXJlc291cmNlTWFueVRvT25lLnNldE1hcHNJZCgiZm9vIik7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFueVRvT25lLmdldElkKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFueVRvT25lLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0VHJ1ZSgoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU9uZVRvT25lLmdldElkKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlT25lVG9PbmUuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnRUcnVlKCgoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJcmVzb3VyY2VNYW55VG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0SWQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnRUcnVlKCgoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9NYW55TWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZDE2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEdlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nMl8wVGVzdHMKKwlleHRlbmRzIEdlbmVyaWMyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBHZW5lcmljT3JtT25lVG9NYW55TWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKworCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuSUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOworCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOworCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOworCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOworCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCisJCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKKwkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisJCQorCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7CisJCWF0dHJpYnV0ZU5hbWVzID0gCisJCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCQkKKwkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7CisJCWF0dHJpYnV0ZU5hbWVzID0gCisJCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCQkKKwkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOworCX0KKwkKKwlwcml2YXRlIE9ybU9ycGhhblJlbW92YWJsZTJfMCBnZXRPcnBoYW5SZW1vdmFsT2YoT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nKSB7CisJCXJldHVybiAoKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvTWFueU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOworCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCU9ybU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvcm1PbmVUb01hbnlNYXBwaW5nKTsKKwkJWG1sT25lVG9NYW55IG9uZVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7CisJCQkJCisJCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCisJCW9uZVRvTWFueVJlc291cmNlLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7CisJCisJCW9uZVRvTWFueVJlc291cmNlLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKKwkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlPcm1PcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob3JtT25lVG9NYW55TWFwcGluZyk7CisJCVhtbE9uZVRvTWFueSBvbmVUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOworCQkJCQorCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAorCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKwkKKwkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcyXzBUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTYyMzcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEKQEAgLTAsMCArMSwzODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZzJfMFRlc3RzCisJZXh0ZW5kcyBHZW5lcmljMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwdWJsaWMgR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkKKwkJCX0KKwkJfSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKSkpIHsKKwkJCWVhY2gubWFrZVNwZWNpZmllZCgpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUgQElkIikuYXBwZW5kKENSKTsJCQkJCisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBvbmVUb09uZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CQkJCQorCQkJfQorCQl9KTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpKSkgeworCQkJZWFjaC5tYWtlU3BlY2lmaWVkKCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7CQkJCQorCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKKwkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7CisJCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCXJlc291cmNlTWFwcGluZy5zZXRJZChCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJcmVzb3VyY2VNYXBwaW5nLnNldElkKG51bGwpOworCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXREZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKKwkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7CisJCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLnNldFZhbHVlKHRydWUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7CisJCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5zZXRWYWx1ZShmYWxzZSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKKwkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7CisJCVhtbE1hcHNJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKCJiYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZChudWxsKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOworCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKKwkJWG1sTWFwc0lkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuc2V0VmFsdWUoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5zZXRWYWx1ZSgiYmFyIik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLnNldFZhbHVlKG51bGwpOworCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7CisJCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3JwaE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKKwkJCisJCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOworCQlyZXNvdXJjZU9uZVRvT25lLnNldElkKEJvb2xlYW4uVFJVRSk7CisJCXJlc291cmNlT25lVG9PbmUuc2V0TWFwc0lkKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VPbmVUb09uZS5nZXRJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU9uZVRvT25lLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0VHJ1ZSgoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJY29udGV4dEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hbnlUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hbnlUb09uZS5nZXRJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hbnlUb09uZS5nZXRNYXBzSWQoKSk7CisJCWFzc2VydFRydWUoKChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlyZXNvdXJjZU9uZVRvT25lID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VPbmVUb09uZS5nZXRJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU9uZVRvT25lLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0VHJ1ZSgoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7CisJCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7CisJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzIik7CisKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisKKwkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAorCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCQkKKwkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7CisJCWF0dHJpYnV0ZU5hbWVzID0gCisJCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisJCQorCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOworCQlhdHRyaWJ1dGVOYW1lcyA9IAorCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCQkKKwkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7CisJfQorCQorCXByaXZhdGUgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nKSB7CisJCXJldHVybiAoKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvT25lTWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOworCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCU9ybU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvcm1PbmVUb09uZU1hcHBpbmcpOworCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOworCQkJCQorCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorCQlvbmVUb09uZVJlc291cmNlLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKKwkKKwkJb25lVG9PbmVSZXNvdXJjZS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7CisJCU9ybU9uZVRvT25lTWFwcGluZzJfMCBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9ybU9uZVRvT25lTWFwcGluZyk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7CisKKwkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKKwkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKwkKKwkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlMl8wVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDAzZWZmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlMl8wVGVzdHMuamF2YQpAQCAtMCwwICsxLDU1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzBUZXN0cworCWV4dGVuZHMgR2VuZXJpYzJfME9ybUNvbnRleHRNb2RlbFRlc3RDYXNlCit7CisKKwlwdWJsaWMgR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzBUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVOdWxsQXR0cmlidXRlTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQorCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CQkJCisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkNPTFVNTik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZ1Byb3BlcnR5QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQElkIik7CisJCQkJc2IuYXBwZW5kKCJAQ29sdW1uKG5hbWU9XCJGT09cIikiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkUHJvcGVydHlTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgSlBBLklELCBKUEEyXzAuQUNDRVNTLCBKUEEyXzAuQUNDRVNTX1RZUEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKKwkJCX0KKwkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpOworCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKSIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1ha2VTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdFR5cGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCk7CisJCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCQorCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkV2l0aEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCk7CisJCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQkKKwkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE1ha2VTcGVjaWZpZWRNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCQorCQkvL3Rha2UgYSB2aXJ0dWFsIG1hcHBpbmcgd2l0aCBhIG1hcHBpbmcgdHlwZSBhbmQgbWFrZSBpdCBzcGVjaWZpZWQKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEdlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZyk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPcm1PbmVUb09uZU1hcHBpbmcpOworCQkKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpOworCQkKKwkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0VHJ1ZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9ybUlkTWFwcGluZyk7CisJCQorCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLm1ha2VTcGVjaWZpZWQoKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOworCisJCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCQorCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7CisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJCisJCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7CisJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsJCQorCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwkJCisJCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1ha2VWaXJ0dWFsTm9VbmRlcmx5aW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLm1ha2VTcGVjaWZpZWQoKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOworCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5zZXROYW1lKCJub0phdmFBdHRyaWJ1dGUiKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVZpcnR1YWwoKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nVHlwZVdoZW5NZXRhZGF0YUNvbXBsZXRlKCkgIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgKChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUyKCkgIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKKwkJCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQkJCisJCS8vdmlydHVhbCBvcm0gYXR0cmlidXRlLCBhY2Nlc3MgdHlwZSBtYXRjaGVzIGphdmEgOiBGSUVMRCwgbmFtZSBtYXRjaGVzIGphdmEKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQlhc3NlcnRUcnVlKGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNGaWVsZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkucGVyc2lzdGFibGVGaWVsZHMoKS5uZXh0KCksIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQkKKwkJCisJCS8vc3BlY2lmaWVkIG9ybSBhdHRyaWJ1dGUsIGFjY2VzcyB0eXBlIG1hdGNoZXMgamF2YSA6IEZJRUxELCBuYW1lIG1hdGNoZXMgamF2YQorCQkvL2phdmFQZXJzaXN0ZW50QXR0cmlidXRlIHNob3VsZCBiZSA9PSB0byBqYXZhIGNvbnRleHQgbW9kZWwgb2JqZWN0CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCisJCQorCQkvL3ZpcnR1YWwgb3JtIGF0dHJpYnV0ZSwgamF2YSBhY2Nlc3MgdHlwZSBGSUVMRCwgb3JtIGFjY2VzcyB0eXBlIFBST1BFUlRZLCBuYW1lIG1hdGNoZXMgamF2YQorCQkvL3ZlcmlmeSB0aGUgcHJvcGVydHkgamF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBpcyB1c2VkIGluIG9ybS4KKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlVmlydHVhbCgpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CQkKKwkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnROb3RTYW1lKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQlqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQlhc3NlcnRUcnVlKGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNQcm9wZXJ0eSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkucGVyc2lzdGFibGVQcm9wZXJ0aWVzKCkubmV4dCgpLCBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKKwkJCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ly9kZWZhdWx0IGFjY2VzcyB3aWxsIGJlIGZpZWxkCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLnNldE5hbWUoImlkMiIpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLnNldE5hbWUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLnNldE5hbWUoImlkIik7CisJCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKworCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVNaXhlZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKKwkJCisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1Byb3BlcnR5KCkpOworCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzRmllbGQoKSk7CisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzRmllbGQoKSk7CisJCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJCisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0ZpZWxkKCkpOworCQkKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzRmllbGQoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpKTsKKwkJCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzRmllbGQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NQcm9wZXJ0eUluSmF2YSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nUHJvcGVydHlBY2Nlc3MoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQkKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1Byb3BlcnR5KCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzUHJvcGVydHkoKSk7CisJCQorCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNQcm9wZXJ0eSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1Byb3BlcnR5KCkpOworCQkKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzUHJvcGVydHkoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc1Byb3BlcnR5SW5KYXZhMigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCQorCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzUHJvcGVydHkoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNQcm9wZXJ0eSgpKTsKKworCQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIik7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpOworCQkKKwkJYXNzZXJ0VHJ1ZShuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydFRydWUobmFtZU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0ZpZWxkKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgbmFtZUphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0VHJ1ZShuYW1lSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpKTsKKworCQkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzUHJvcGVydHkoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNQcm9wZXJ0eSgpKTsKKwkJCisJCW5hbWVPcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKKwkJbmFtZU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpOworCQlhc3NlcnRGYWxzZShuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0VHJ1ZShuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzRmllbGQoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBuYW1lSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRUcnVlKG5hbWVKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0ZpZWxkKCkpOworCQlhc3NlcnRFcXVhbHMobmFtZUphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzUHJvcGVydHkoKSk7CisKKwkJYXNzZXJ0RmFsc2UobmFtZU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgbmFtZU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG5hbWVPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgbmFtZUphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0VHJ1ZShuYW1lSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpKTsKKworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudFR5cGUyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZTJfMFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyMWVhOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudFR5cGUyXzBUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZTJfMFRlc3RzCisJZXh0ZW5kcyBHZW5lcmljMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKK3sJCisKKwlwdWJsaWMgR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkNPTFVNTik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkUHJvcGVydHlTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgSlBBLklELCBKUEEyXzAuQUNDRVNTLCBKUEEyXzAuQUNDRVNTX1RZUEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKKwkJCX0KKwkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpOworCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKSIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGaWVsZFNwZWNpZmllZFByb3BlcnR5QW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEpQQS5JRCwgSlBBMl8wLkFDQ0VTUywgSlBBMl8wLkFDQ0VTU19UWVBFKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpIik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQElkIik7CisJCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5UHJvcGVydHlTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5BQ0NFU1MsIEpQQTJfMC5BQ0NFU1NfVFlQRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKSIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzV2l0aEphdmFBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJCisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKKwkJCisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NXaXRoSmF2YUFubm90YXRpb25zUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkUHJvcGVydHlTcGVjaWZpZWQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQkKKwkJCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCQorCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCQorCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOworCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJdmlydHVhbEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCQorCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCQorCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eVNwZWNpZmllZCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCQorCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOworCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJdmlydHVhbEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCQorCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCQorCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOworCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQkKKwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVzMygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5RmllbGRTcGVjaWZpZWRQcm9wZXJ0eUFubm90YXRlZCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisKKwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwkJCisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKKwkJCisJCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisKKwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwkJCisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCQorCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOworCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCisJCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5U3BlY2lmaWVkKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJCisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOworCQkKKwkJamF2YVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7CisJCQorCQlqYXZhUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKKworCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjhmNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3IyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOworCisvKioKKyAqICBHZW5lcmljMl8wT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cworICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMKKwlleHRlbmRzIEdlbmVyaWMyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQoreworCisJcHVibGljIEdlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkvLyAqKioqKioqKioqIGNhdGFsb2cgKioqKioqKioqKgorCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU2VxdWVuY2VHZW5lcmF0b3IyXzAgc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzApIGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKKwkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IChYbWxTZXF1ZW5jZUdlbmVyYXRvcikgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7CisKKwkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKKwkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXRDYXRhbG9nKCJGT08iKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0Q2F0YWxvZygpKTsKKwkKKwkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAorCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldENhdGFsb2cobnVsbCk7CisJCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldENhdGFsb2coKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNlcXVlbmNlR2VuZXJhdG9yMl8wIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCisJCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSAoWG1sU2VxdWVuY2VHZW5lcmF0b3IpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOworCQorCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKKwkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRk9PIik7CisJCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRDYXRhbG9nKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZENhdGFsb2coKSk7CisJCQorCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKKwkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKKwkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKKwl9CisJCisJLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgorCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24geworCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQorCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gKFhtbFNlcXVlbmNlR2VuZXJhdG9yKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKKworCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldFNjaGVtYSgiRk9PIik7CisJCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0U2NoZW1hKCkpOworCQorCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCisJCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0U2NoZW1hKG51bGwpOworCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldFNjaGVtYSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24geworCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQorCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gKFhtbFNlcXVlbmNlR2VuZXJhdG9yKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKKwkKKwkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCisJCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7CisJCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRTY2hlbWEoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOworCQkKKwkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCisJCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKKwkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBDb25uZWN0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBDb25uZWN0aW9uVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDQxY2E2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMENvbm5lY3Rpb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKKworLyoqCisgKiAgR2VuZXJpY0Nvbm5lY3Rpb24yXzBUZXN0cworICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljMl8wQ29ubmVjdGlvblRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMFBlcnNpc3RlbmNlVW5pdFRlc3RzCit7CisJcHJpdmF0ZSBKcGFDb25uZWN0aW9uMl8wIGNvbm5lY3Rpb247CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfS0VZID0gSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX0RSSVZFUjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0tFWSA9IEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VUkw7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1RFU1RfVkFMVUUgPSAidGVzdCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzIiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9LRVkgPSBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVNFUjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1RFU1RfVkFMVUUgPSAidGVzdCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX0tFWSA9IEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9URVNUX1ZBTFVFID0gInRlc3QiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzIiOworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgorCXB1YmxpYyBHZW5lcmljMl8wQ29ubmVjdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXRoaXMuY29ubmVjdGlvbiA9IHRoaXMuc3ViamVjdC5nZXRDb25uZWN0aW9uKCk7CisJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7CisKKwkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSnBhQ29ubmVjdGlvbjJfMC5EUklWRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihKcGFDb25uZWN0aW9uMl8wLlVSTF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEpwYUNvbm5lY3Rpb24yXzAuVVNFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEpwYUNvbm5lY3Rpb24yXzAuUEFTU1dPUkRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQkKKwkJdGhpcy5jbGVhckV2ZW50KCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7CisJCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gNDsgLy8gUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMKKwkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDE7IC8vIDEgbWlzYyBwcm9wZXJ0aWVzCisJCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOworCQkKKwkJLy8gSW5pdGlhbGl6ZXMgUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShEUklWRVJfS0VZLCBEUklWRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShVUkxfS0VZLCBVUkxfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShVU0VSX0tFWSwgVVNFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFBBU1NXT1JEX0tFWSwgUEFTU1dPUkRfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgeworCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKKwkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLkRSSVZFUl9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldERyaXZlcigpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuVVJMX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0VXJsKCk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5VU0VSX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0VXNlcigpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEFTU1dPUkRfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRQYXNzd29yZCgpOworCQllbHNlCisJCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKKwkJcmV0dXJuIG1vZGVsVmFsdWU7CisJfQorCisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24geworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLkRSSVZFUl9QUk9QRVJUWSkpCisJCQl0aGlzLmNvbm5lY3Rpb24uc2V0RHJpdmVyKChTdHJpbmcpIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlVSTF9QUk9QRVJUWSkpCisJCQl0aGlzLmNvbm5lY3Rpb24uc2V0VXJsKChTdHJpbmcpIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlVTRVJfUFJPUEVSVFkpKQorCQkJdGhpcy5jb25uZWN0aW9uLnNldFVzZXIoKFN0cmluZykgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEFTU1dPUkRfUFJPUEVSVFkpKQorCQkJdGhpcy5jb25uZWN0aW9uLnNldFBhc3N3b3JkKChTdHJpbmcpIG5ld1ZhbHVlKTsKKwkJZWxzZQorCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7CisJfQorCisJLy8gKioqKioqKioqKiBEcml2ZXIgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXREcml2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJRFJJVkVSX0tFWSwKKwkJCURSSVZFUl9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCURSSVZFUl9LRVksCisJCQlEUklWRVJfVEVTVF9WQUxVRSwKKwkJCURSSVZFUl9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVEcml2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCURSSVZFUl9LRVksCisJCQlEUklWRVJfVEVTVF9WQUxVRSwKKwkJCURSSVZFUl9URVNUX1ZBTFVFXzIpOworCX0KKworCS8vICoqKioqKioqKiogVXJsIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VXJsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVVSTF9LRVksCisJCQlVUkxfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlVUkxfS0VZLAorCQkJVVJMX1RFU1RfVkFMVUUsCisJCQlVUkxfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVXJsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlVUkxfS0VZLAorCQkJVVJMX1RFU1RfVkFMVUUsCisJCQlVUkxfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFVzZXIgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVVTRVJfS0VZLAorCQkJVVNFUl9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCVVTRVJfS0VZLAorCQkJVVNFUl9URVNUX1ZBTFVFLAorCQkJVVNFUl9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVVc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlVU0VSX0tFWSwKKwkJCVVTRVJfVEVTVF9WQUxVRSwKKwkJCVVTRVJfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFBhc3N3b3JkIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0UGFzc3dvcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJUEFTU1dPUkRfS0VZLAorCQkJUEFTU1dPUkRfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlQQVNTV09SRF9LRVksCisJCQlQQVNTV09SRF9URVNUX1ZBTFVFLAorCQkJUEFTU1dPUkRfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUGFzc3dvcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCVBBU1NXT1JEX0tFWSwKKwkJCVBBU1NXT1JEX1RFU1RfVkFMVUUsCisJCQlQQVNTV09SRF9URVNUX1ZBTFVFXzIpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBPcHRpb25zVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBPcHRpb25zVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmM2ODk1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfME9wdGlvbnNUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkpwYU9wdGlvbnMyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKKworLyoqCisgKiAgR2VuZXJpY09wdGlvbnMyXzBUZXN0cworICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBHZW5lcmljMl8wT3B0aW9uc1Rlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMFBlcnNpc3RlbmNlVW5pdFRlc3RzCit7CisJcHJpdmF0ZSBKcGFPcHRpb25zMl8wIG9wdGlvbnM7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NLX1RJTUVPVVRfS0VZID0gSnBhT3B0aW9uczJfMC5QRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIExPQ0tfVElNRU9VVF9URVNUX1ZBTFVFID0gMTAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRV8yID0gMjAwOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfVElNRU9VVF9LRVkgPSBKcGFPcHRpb25zMl8wLlBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRSA9IDEwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFXzIgPSAyMDA7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVkgPSBKcGFPcHRpb25zMl8wLlBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1Q7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFID0gInRlc3RfcHJlLXBlcnNpc3RfZ3JvdXAiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRV8yID0gInRlc3RfMl9wcmUtcGVyc2lzdF9ncm91cCI7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSA9IEpwYU9wdGlvbnMyXzAuUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFID0gInRlc3RfcHJlLXVwZGF0ZV9ncm91cCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzJfcHJlLXVwZGF0ZV9ncm91cCI7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSA9IEpwYU9wdGlvbnMyXzAuUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFID0gInRlc3RfcHJlLXJlbW92ZV9ncm91cCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzJfcHJlLXJlbW92ZV9ncm91cCI7CisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCisJcHVibGljIEdlbmVyaWMyXzBPcHRpb25zVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJdGhpcy5vcHRpb25zID0gdGhpcy5zdWJqZWN0LmdldE9wdGlvbnMoKTsKKwkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKKworCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihKcGFPcHRpb25zMl8wLkxPQ0tfVElNRU9VVF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEpwYU9wdGlvbnMyXzAuUVVFUllfVElNRU9VVF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCisJCXRoaXMuY2xlYXJFdmVudCgpOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgeworCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDU7IC8vIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzCisJCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyAxOyAvLyAxIG1pc2MgcHJvcGVydGllcworCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKKwkJCisJCS8vIEluaXRpYWxpemVzIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzCisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTE9DS19USU1FT1VUX0tFWSwgTE9DS19USU1FT1VUX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUVVFUllfVElNRU9VVF9LRVksIFFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKKworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZLCBWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSwgVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSwgVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7CisJCXJldHVybiB0aGlzLm9wdGlvbnM7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24geworCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuTE9DS19USU1FT1VUX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0TG9ja1RpbWVvdXQoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlFVRVJZX1RJTUVPVVRfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRRdWVyeVRpbWVvdXQoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KCk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgpOworCQllbHNlCisJCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKKwkJcmV0dXJuIG1vZGVsVmFsdWU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5MT0NLX1RJTUVPVVRfUFJPUEVSVFkpKQorCQkJdGhpcy5vcHRpb25zLnNldExvY2tUaW1lb3V0KChJbnRlZ2VyKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5RVUVSWV9USU1FT1VUX1BST1BFUlRZKSkKKwkJCXRoaXMub3B0aW9ucy5zZXRRdWVyeVRpbWVvdXQoKEludGVnZXIpIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkpKQorCQkJdGhpcy5vcHRpb25zLnNldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoKFN0cmluZykgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKSkKKwkJCXRoaXMub3B0aW9ucy5zZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoKFN0cmluZykgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZKSkKKwkJCXRoaXMub3B0aW9ucy5zZXRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoKFN0cmluZykgbmV3VmFsdWUpOworCQllbHNlCisJCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKKwl9CisJCisJLy8gKioqKioqKioqKiBMb2NrVGltZW91dCB0ZXN0cyAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdFNldExvY2tUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCUxPQ0tfVElNRU9VVF9LRVksCisJCQlMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlMT0NLX1RJTUVPVVRfS0VZLAorCQkJTE9DS19USU1FT1VUX1RFU1RfVkFMVUUsCisJCQlMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTG9ja1RpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCUxPQ0tfVElNRU9VVF9LRVksCisJCQlMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRSwKKwkJCUxPQ0tfVElNRU9VVF9URVNUX1ZBTFVFXzIpOworCX0KKwkKKwkvLyAqKioqKioqKioqIFF1ZXJ5VGltZW91dCB0ZXN0cyAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdFNldFF1ZXJ5VGltZW91dCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlRVUVSWV9USU1FT1VUX0tFWSwKKwkJCVFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlRVUVSWV9USU1FT1VUX0tFWSwKKwkJCVFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRSwKKwkJCVFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUXVlcnlUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlRVUVSWV9USU1FT1VUX0tFWSwKKwkJCVFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRSwKKwkJCVFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSwKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRSwKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSB0ZXN0cyAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdFNldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSwKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSwKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSwKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVksCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSwKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVksCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSwKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFXzIpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNDViZWMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworLyoqCisgKiAgR2VuZXJpYzJfMFBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWMyXzBQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKK3sKKworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShHZW5lcmljMl8wQ29ubmVjdGlvblRlc3RzLmNsYXNzLmdldE5hbWUoKSk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljMl8wT3B0aW9uc1Rlc3RzLmNsYXNzKTsKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCXByaXZhdGUgR2VuZXJpYzJfMFBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMoKSB7CisJCXN1cGVyKCk7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMFBlcnNpc3RlbmNlVW5pdFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2MDg2MwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuR2VuZXJpYzJfMEpwYVBsYXRmb3JtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOworCisvKioKKyAqICBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wVGVzdHMKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyaWMyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0cyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCit7CisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdDJfMCBzdWJqZWN0OworCisJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQyXzA+IHN1YmplY3RIb2xkZXI7CisKKwkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCisJcHJvdGVjdGVkIEdlbmVyaWMyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQl0aGlzLnN1YmplY3QgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpOworCQl0aGlzLnN1YmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdDJfMD4odGhpcy5zdWJqZWN0KTsKKwkJdGhpcy5wb3B1bGF0ZVB1KCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgeworCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7CisJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCBKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzJfMCk7CisJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk1fSUQsIEdlbmVyaWMyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyLklEKTsKKwkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uVFJVRSk7CisJCXJldHVybiBkYXRhTW9kZWw7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQyXzAgZ2V0UGVyc2lzdGVuY2VVbml0KCkgeworCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdDJfMCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQWNjZXNzMl8wQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9BY2Nlc3MyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGIzMWEwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQWNjZXNzMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEFjY2VzczJfMEFubm90YXRpb25UZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UgeworCQorCXB1YmxpYyBBY2Nlc3MyXzBBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBY2Nlc3NPblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5BQ0NFU1MsIEpQQTJfMC5BQ0NFU1NfVFlQRSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QWNjZXNzT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLkFDQ0VTUywgSlBBMl8wLkFDQ0VTU19UWVBFKTsKKwkJCX0KKwkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKSIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFjY2Vzc09uUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5BQ0NFU1MsIEpQQTJfMC5BQ0NFU1NfVFlQRSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKSIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzT25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBY2Nlc3NPblR5cGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCQorCQlBY2Nlc3MyXzBBbm5vdGF0aW9uIGFjY2VzcyA9IChBY2Nlc3MyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQUNDRVNTKTsKKwkJYXNzZXJ0Tm90TnVsbChhY2Nlc3MpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgYWNjZXNzLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRBY2Nlc3NPblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUFjY2VzczJfMEFubm90YXRpb24gYWNjZXNzID0gKEFjY2VzczJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5BQ0NFU1MpOworCQlhc3NlcnROdWxsKGFjY2Vzcyk7CisJCQorCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEyXzAuQUNDRVNTKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBY2Nlc3MiLCBjdSk7CisKKwkJYWNjZXNzID0gKEFjY2VzczJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5BQ0NFU1MpOworCQlhc3NlcnROb3ROdWxsKGFjY2Vzcyk7CisJCQorCQlhY2Nlc3Muc2V0VmFsdWUoQWNjZXNzVHlwZS5GSUVMRCk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBhY2Nlc3MuZ2V0VmFsdWUoKSk7CQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBY2Nlc3MoRklFTEQpIiwgY3UpOworCQkKKwkJYWNjZXNzLnNldFZhbHVlKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgYWNjZXNzLmdldFZhbHVlKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFjY2VzcyhQUk9QRVJUWSkiLCBjdSk7CisJCQorCQlhY2Nlc3Muc2V0VmFsdWUobnVsbCk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBMl8wLkFDQ0VTUykpOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFjY2VzcyIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc09uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFjY2Vzc09uRmllbGQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVGaWVsZHMoKS5uZXh0KCk7CisJCQorCQlBY2Nlc3MyXzBBbm5vdGF0aW9uIGFjY2VzcyA9IChBY2Nlc3MyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5BQ0NFU1MpOworCQlhc3NlcnROb3ROdWxsKGFjY2Vzcyk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBhY2Nlc3MuZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldEFjY2Vzc09uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUZpZWxkcygpLm5leHQoKTsKKwkJCisJCUFjY2VzczJfMEFubm90YXRpb24gYWNjZXNzID0gKEFjY2VzczJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBMl8wLkFDQ0VTUyk7CisJCWFzc2VydE51bGwoYWNjZXNzKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBMl8wLkFDQ0VTUyk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQWNjZXNzIiwgY3UpOworCisJCWFjY2VzcyA9IChBY2Nlc3MyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5BQ0NFU1MpOworCQlhc3NlcnROb3ROdWxsKGFjY2Vzcyk7CisJCQorCQlhY2Nlc3Muc2V0VmFsdWUoQWNjZXNzVHlwZS5GSUVMRCk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBhY2Nlc3MuZ2V0VmFsdWUoKSk7CQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBY2Nlc3MoRklFTEQpIiwgY3UpOworCQkKKwkJYWNjZXNzLnNldFZhbHVlKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgYWNjZXNzLmdldFZhbHVlKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFjY2VzcyhQUk9QRVJUWSkiLCBjdSk7CisJCQorCQlhY2Nlc3Muc2V0VmFsdWUobnVsbCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQUNDRVNTKSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQWNjZXNzIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzT25Qcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QWNjZXNzT25Qcm9wZXJ0eSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZVByb3BlcnRpZXMoKS5uZXh0KCk7CisJCQorCQlBY2Nlc3MyXzBBbm5vdGF0aW9uIGFjY2VzcyA9IChBY2Nlc3MyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5BQ0NFU1MpOworCQlhc3NlcnROb3ROdWxsKGFjY2Vzcyk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBhY2Nlc3MuZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldEFjY2Vzc09uUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZVByb3BlcnRpZXMoKS5uZXh0KCk7CisJCQorCQlBY2Nlc3MyXzBBbm5vdGF0aW9uIGFjY2VzcyA9IChBY2Nlc3MyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5BQ0NFU1MpOworCQlhc3NlcnROdWxsKGFjY2Vzcyk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQTJfMC5BQ0NFU1MpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFjY2VzcyIsIGN1KTsKKworCQlhY2Nlc3MgPSAoQWNjZXNzMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQUNDRVNTKTsKKwkJYXNzZXJ0Tm90TnVsbChhY2Nlc3MpOworCQkKKwkJYWNjZXNzLnNldFZhbHVlKEFjY2Vzc1R5cGUuRklFTEQpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgYWNjZXNzLmdldFZhbHVlKCkpOwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQWNjZXNzKEZJRUxEKSIsIGN1KTsKKwkJCisJCWFjY2Vzcy5zZXRWYWx1ZShBY2Nlc3NUeXBlLlBST1BFUlRZKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGFjY2Vzcy5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBY2Nlc3MoUFJPUEVSVFkpIiwgY3UpOworCQkKKwkJYWNjZXNzLnNldFZhbHVlKG51bGwpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBMl8wLkFDQ0VTUykpOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFjY2VzcyIsIGN1KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZWZjODAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMuamF2YQpAQCAtMCwwICsxLDg4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgPSAiTVlfQVNTT0NJQVRJT05fT1ZFUlJJREUiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX1RBQkxFX05BTUUgPSAiTVlfSk9JTl9UQUJMRSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfTkFNRSA9ICJNWV9DQVRBTE9HIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX05BTUUgPSAiTVlfU0NIRU1BIjsKKwkKKwlwdWJsaWMgQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX0NPTFVNTik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9UQUJMRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUobmFtZSA9IFwiIiArIEpPSU5fVEFCTEVfTkFNRSArICJcIikpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9UQUJMRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoY2F0YWxvZyA9IFwiIiArIENBVEFMT0dfTkFNRSArICJcIikpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX1RBQkxFKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShzY2hlbWEgPSBcIiIgKyBTQ0hFTUFfTkFNRSArICJcIikpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fVEFCTEUsIEpQQS5VTklRVUVfQ09OU1RSQUlOVCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX1RBQkxFLCBKUEEuSk9JTl9DT0xVTU4pOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSkiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fVEFCTEUsIEpQQS5KT0lOX0NPTFVNTik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSkiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCisJCWFzc2VydE5vdE51bGwoYXNzb2NpYXRpb25PdmVycmlkZSk7CisJCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCisJCWFzc2VydE5vdE51bGwoYXNzb2NpYXRpb25PdmVycmlkZSk7CisJCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJGb29cIikiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisKKwkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJCisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKKwkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUiLCBjdSk7CisJfQorCQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisKKwkJCisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDEpOworCQkJCQorCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQkJCQorCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBZGRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCQorCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigxKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOworCisJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7CisKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKKwkJCisJCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOworCQkKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDEpOworCQlqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKKworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMCk7CisJCWpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpOworCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbikiLCBjdSk7CisKKwkJCisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDApOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFzc29jaWF0aW9uT3ZlcnJpZGUiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKTsKKwkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKKwkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOworCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7CisKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5tb3ZlSm9pbkNvbHVtbigyLCAwKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnNTaXplKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCQorCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCk7CisJCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7CisJCWpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKKwkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOworCisJCWFzc29jaWF0aW9uT3ZlcnJpZGUubW92ZUpvaW5Db2x1bW4oMCwgMik7CisJCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKX0pIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQkJCQorCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uc1NpemUoKSk7CisJCQorCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpLm5leHQoKTsKKwkJCisJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOworCQkKKwkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcImZvb1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKKwl9CisJCQorCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25UeXBlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCWFzc2VydE5vdE51bGwoYXNzb2NpYXRpb25PdmVycmlkZSk7CisJCWFzc2VydE51bGwoam9pblRhYmxlKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCWFzc2VydEVxdWFscyhKT0lOX1RBQkxFX05BTUUsIGpvaW5UYWJsZS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0RXF1YWxzKEpPSU5fVEFCTEVfTkFNRSwgam9pblRhYmxlLmdldE5hbWUoKSk7CisJCQorCQlqb2luVGFibGUuc2V0TmFtZSgiRm9vIik7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUobmFtZSA9IFwiRm9vXCIpKSIsIGN1KTsKKwkJCisJCWpvaW5UYWJsZS5zZXROYW1lKG51bGwpOworCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25UeXBlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0TnVsbChqb2luVGFibGUpOworCQkKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luVGFibGUoKTsKKwkJam9pblRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0Tm90TnVsbChqb2luVGFibGUpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25UeXBlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCWFzc2VydE51bGwoam9pblRhYmxlKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUdldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoQ2F0YWxvZygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKKwkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKKwkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOworCisJCXRhYmxlLnNldENhdGFsb2coIkZvbyIpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldENhdGFsb2coKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUobmFtZSA9IFwiTVlfSk9JTl9UQUJMRVwiLCBjYXRhbG9nID0gXCJGb29cIikpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0Q2F0YWxvZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoQ2F0YWxvZygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCB0YWJsZS5nZXRDYXRhbG9nKCkpOworCQkKKwkJdGFibGUuc2V0Q2F0YWxvZyhudWxsKTsKKwkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOworCQkKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoU2NoZW1hKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7CisJCWFzc2VydEVxdWFscyhTQ0hFTUFfTkFNRSwgdGFibGUuZ2V0U2NoZW1hKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVTZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCWFzc2VydE5vdE51bGwodGFibGUpOworCQlhc3NlcnROdWxsKHRhYmxlLmdldFNjaGVtYSgpKTsKKworCQl0YWJsZS5zZXRTY2hlbWEoIkZvbyIpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldFNjaGVtYSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIHNjaGVtYSA9IFwiRm9vXCIpKSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVNldFNjaGVtYU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoU2NoZW1hKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCWFzc2VydEVxdWFscyhTQ0hFTUFfTkFNRSwgdGFibGUuZ2V0U2NoZW1hKCkpOworCQkKKwkJdGFibGUuc2V0U2NoZW1hKG51bGwpOworCQlhc3NlcnROdWxsKHRhYmxlLmdldFNjaGVtYSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVVbmlxdWVDb25zdHJhaW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKworCQkKKwkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKTsKKwkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCB0YWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVVbmlxdWVDb25zdHJhaW50czMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJCQkKKwkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJCisJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7CisJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7CisJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiQkFSIik7CisKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZXNTaXplKCkpOworCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSwgQFVuaXF1ZUNvbnN0cmFpbnR9KSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKKwkJCisJCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pKSIsIGN1KTsKKwkJCisJCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSkpKSIsIGN1KTsKKwkJCisJCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7CisJCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkpIiwgY3UpOworCQkKKwkJdGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pfSkpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlTW92ZVVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSkiLCBjdSk7CisJCQorCQl0YWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAyKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSl9KSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUpvaW5Db2x1bW5zMigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCisJCQorCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApOworCQl0YWJsZS5hZGRKb2luQ29sdW1uKDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUpvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCQkJCisJCWFzc2VydEVxdWFscygyLCB0YWJsZS5qb2luQ29sdW1uc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVBZGRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQkKKwkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKKwkJdGFibGUuYWRkSm9pbkNvbHVtbigxKTsKKwkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJCQVIiKTsKKworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUobmFtZSA9IFwiTVlfSk9JTl9UQUJMRVwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVJlbW92ZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKKwkJCisJCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygzLCB0YWJsZS5qb2luQ29sdW1uc1NpemUoKSk7CisJCQorCQl0YWJsZS5yZW1vdmVKb2luQ29sdW1uKDEpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKKworCQl0YWJsZS5yZW1vdmVKb2luQ29sdW1uKDApOworCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbikpIiwgY3UpOworCisJCQorCQl0YWJsZS5yZW1vdmVKb2luQ29sdW1uKDApOworCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5UYWJsZSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZU1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmpvaW5Db2x1bW5BdCgwKTsKKwkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKKwkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOworCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOworCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOworCisJCXRhYmxlLm1vdmVKb2luQ29sdW1uKDIsIDApOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVNb3ZlSm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQkKKwkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmpvaW5Db2x1bW5BdCgwKTsKKwkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKKwkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOworCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOworCQkKKwkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKKworCisJCXRhYmxlLm1vdmVKb2luQ29sdW1uKDAsIDIpOworCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIil9KSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVTZXRKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCQkJCisJCWFzc2VydEVxdWFscygyLCB0YWJsZS5qb2luQ29sdW1uc1NpemUoKSk7CisJCQorCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuam9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCQorCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKwkJCisJCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcImZvb1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJbnZlcnNlSm9pbkNvbHVtbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisKKwkJCisJCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApOworCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQkJCQorCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFkZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCQorCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKKwkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMSk7CisJCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOworCisJCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmludmVyc2VKb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbCh0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVJlbW92ZUludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDIpLnNldE5hbWUoIkZPTyIpOworCQkKKwkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmludmVyc2VKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShpbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKwkJCisJCXRhYmxlLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKDEpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkpIiwgY3UpOworCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShpbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKworCQl0YWJsZS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigwKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSkpIiwgY3UpOworCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCQkKKwkJdGFibGUucmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMCk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlTW92ZUludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOworCQkKKwkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmludmVyc2VKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQkKKwkJdGFibGUubW92ZUludmVyc2VKb2luQ29sdW1uKDIsIDApOworCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlTW92ZUludmVyc2VKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigxKS5zZXROYW1lKCJGT08iKTsKKwkJCisJCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJCisJCXRhYmxlLm1vdmVJbnZlcnNlSm9pbkNvbHVtbigwLCAyKTsKKwkJaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zKCk7CisJCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVTZXRJbnZlcnNlSm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7CisJCQorCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7CisJCQorCQlqb2luQ29sdW1uLnNldE5hbWUoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiZm9vXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzMl8wVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWQ1YjdhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXMyXzBUZXN0cy5qYXZhCkBAIC0wLDAgKzEsOTg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlczJfMFRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgPSAiTVlfQVNTT0NJQVRJT05fT1ZFUlJJREUiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX1RBQkxFX05BTUUgPSAiTVlfSk9JTl9UQUJMRSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfTkFNRSA9ICJNWV9DQVRBTE9HIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX05BTUUgPSAiTVlfU0NIRU1BIjsKKwkKKwlwdWJsaWMgQXNzb2NpYXRpb25PdmVycmlkZXMyXzBUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIikpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUywgSlBBLkpPSU5fQ09MVU1OKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSkiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9DT0xVTU4pOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSkiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fVEFCTEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCIiICsgSk9JTl9UQUJMRV9OQU1FICsgIlwiKSkpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUywgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9UQUJMRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGNhdGFsb2cgPSBcIiIgKyBDQVRBTE9HX05BTUUgKyAiXCIpKSkiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fVEFCTEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShzY2hlbWEgPSBcIiIgKyBTQ0hFTUFfTkFNRSArICJcIikpKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX1RBQkxFLCBKUEEuVU5JUVVFX0NPTlNUUkFJTlQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkpKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX1RBQkxFLCBKUEEuSk9JTl9DT0xVTU4pOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1ufSkpKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUywgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9UQUJMRSwgSlBBLkpPSU5fQ09MVU1OKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSkpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisKKwkJYXNzZXJ0Tm90TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisKKwkJYXNzZXJ0Tm90TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZvbyIpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJGb29cIikpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQkKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOworCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFkZEFzc29jaWF0aW9uT3ZlcnJpZGVDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKHtAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJGT09cIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJCQVpcIikpLEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKX0pIiwgY3UpOworCQkKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKTsKKwkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkQXNzb2NpYXRpb25PdmVycmlkZVRvQmVnaW5uaW5nT2ZMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyh7QEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSxAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKKwkJCisJCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoe0BBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkJBWlwiKSxAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJGT09cIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJCQVpcIikpLCBAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKKworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKTsKKwkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKSk7CisJCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKSkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBc3NvY2lhdGlvbk92ZXJyaWRlQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyh7QEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSxAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKKwkJCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJGT09cIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJCQVpcIikpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUykubmV4dCgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpLm5leHQoKTsKKwkJCisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUykubmV4dCgpOworCQkJCQorCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBZGRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpLm5leHQoKTsKKwkJCisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDEpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiQkFSIik7CisKKworCQlJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpLm5leHQoKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOworCQkKKwkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKKwkJCisJCWFzc29jaWF0aW9uT3ZlcnJpZGUucmVtb3ZlSm9pbkNvbHVtbigxKTsKKwkJam9pbkNvbHVtbnMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKKworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMCk7CisJCWpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpOworCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4pKSIsIGN1KTsKKworCQkKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMCk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQXNzb2NpYXRpb25PdmVycmlkZSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUykubmV4dCgpOworCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCk7CisJCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7CisJCWpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKKwkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKKworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLm1vdmVKb2luQ29sdW1uKDIsIDApOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMywgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uc1NpemUoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW92ZUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKS5uZXh0KCk7CisJCQorCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCk7CisJCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7CisJCWpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKKwkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUubW92ZUpvaW5Db2x1bW4oMCwgMik7CisJCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIil9KSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpLm5leHQoKTsKKwkJCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnNTaXplKCkpOworCQkKKwkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCQorCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKwkJCisJCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiZm9vXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKKwl9CQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25UeXBlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0Tm90TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJYXNzZXJ0TnVsbChqb2luVGFibGUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlR2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnRFcXVhbHMoSk9JTl9UQUJMRV9OQU1FLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0RXF1YWxzKEpPSU5fVEFCTEVfTkFNRSwgam9pblRhYmxlLmdldE5hbWUoKSk7CisJCQorCQlqb2luVGFibGUuc2V0TmFtZSgiRm9vIik7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUobmFtZSA9IFwiRm9vXCIpKSIsIGN1KTsKKwkJCisJCWpvaW5UYWJsZS5zZXROYW1lKG51bGwpOworCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25UeXBlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnROdWxsKGpvaW5UYWJsZSk7CisJCQorCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5UYWJsZSgpOworCQlqb2luVGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnROb3ROdWxsKGpvaW5UYWJsZSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPblR5cGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnROdWxsKGpvaW5UYWJsZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVHZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aENhdGFsb2coKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKKwkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCWFzc2VydE5vdE51bGwodGFibGUpOworCQlhc3NlcnROdWxsKHRhYmxlLmdldENhdGFsb2coKSk7CisKKwkJdGFibGUuc2V0Q2F0YWxvZygiRm9vIik7CisJCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIGNhdGFsb2cgPSBcIkZvb1wiKSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVTZXRDYXRhbG9nTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhDYXRhbG9nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKKwkJCisJCXRhYmxlLnNldENhdGFsb2cobnVsbCk7CisJCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKKwkJCisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlR2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFNjaGVtYSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7CisJCWFzc2VydEVxdWFscyhTQ0hFTUFfTkFNRSwgdGFibGUuZ2V0U2NoZW1hKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVTZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7CisJCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOworCisJCXRhYmxlLnNldFNjaGVtYSgiRm9vIik7CisJCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0U2NoZW1hKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKG5hbWUgPSBcIk1ZX0pPSU5fVEFCTEVcIiwgc2NoZW1hID0gXCJGb29cIikpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0U2NoZW1hTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhTY2hlbWEoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnRFcXVhbHMoU0NIRU1BX05BTUUsIHRhYmxlLmdldFNjaGVtYSgpKTsKKwkJCisJCXRhYmxlLnNldFNjaGVtYShudWxsKTsKKwkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRTY2hlbWEoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5UYWJsZSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVVbmlxdWVDb25zdHJhaW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCisJCQorCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApOworCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVVuaXF1ZUNvbnN0cmFpbnRzMygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCQkJCisJCWFzc2VydEVxdWFscygzLCB0YWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJCisJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7CisJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7CisJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiQkFSIik7CisKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZXNTaXplKCkpOworCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSwgQFVuaXF1ZUNvbnN0cmFpbnR9KSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZXMoKS5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoMywgdGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOworCQkKKwkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygyLCB0YWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkpIiwgY3UpOworCQkKKwkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoMSwgdGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSkpIiwgY3UpOworCQkKKwkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsJCQorCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5UYWJsZSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZU1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pKSIsIGN1KTsKKwkJCisJCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KX0pKSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZU1vdmVVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSkiLCBjdSk7CisJCQorCQl0YWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAyKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSl9KSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQkJCQorCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlSm9pbkNvbHVtbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKworCQkKKwkJdGFibGUuYWRkSm9pbkNvbHVtbigwKTsKKwkJdGFibGUuYWRkSm9pbkNvbHVtbigxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCB0YWJsZS5qb2luQ29sdW1uc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCQkJCisJCWFzc2VydEVxdWFscygyLCB0YWJsZS5qb2luQ29sdW1uc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVBZGRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCQorCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOworCQl0YWJsZS5hZGRKb2luQ29sdW1uKDEpOworCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOworCisJCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlUmVtb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCXRhYmxlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7CisJCQorCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOworCQkKKwkJdGFibGUucmVtb3ZlSm9pbkNvbHVtbigxKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7CisKKwkJdGFibGUucmVtb3ZlSm9pbkNvbHVtbigwKTsKKwkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4pKSIsIGN1KTsKKworCQkKKwkJdGFibGUucmVtb3ZlSm9pbkNvbHVtbigwKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVNb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmpvaW5Db2x1bW5BdCgwKTsKKwkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKKwkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOworCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOworCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOworCisJCXRhYmxlLm1vdmVKb2luQ29sdW1uKDIsIDApOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVNb3ZlSm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCQorCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuam9pbkNvbHVtbkF0KDApOworCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOworCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKKwkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7CisJCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7CisJCQorCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOworCisKKwkJdGFibGUubW92ZUpvaW5Db2x1bW4oMCwgMik7CisJCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygzLCB0YWJsZS5qb2luQ29sdW1uc1NpemUoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKX0pKSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVNldEpvaW5Db2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQkJCQorCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOworCQkKKwkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmpvaW5Db2x1bW5zKCkubmV4dCgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7CisJCQorCQlqb2luQ29sdW1uLnNldE5hbWUoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJbnZlcnNlSm9pbkNvbHVtbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKworCQkKKwkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMCk7CisJCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtbnMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnZlcnNlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKKwkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7CisJCQorCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKKwkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMSk7CisJCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOworCisJCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmludmVyc2VKb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbCh0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVJlbW92ZUludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOworCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKKwkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMikuc2V0TmFtZSgiRk9PIik7CisJCQorCQlJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCQkKKwkJdGFibGUucmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSkiLCBjdSk7CisJCWludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmludmVyc2VKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOworCisJCXRhYmxlLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKDApOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpKSkiLCBjdSk7CisJCWludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmludmVyc2VKb2luQ29sdW1ucygpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoaW52ZXJzZUpvaW5Db2x1bW5zLmhhc05leHQoKSk7CisJCQorCQl0YWJsZS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigwKTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVNb3ZlSW52ZXJzZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKKwkJCisJCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJCisJCXRhYmxlLm1vdmVJbnZlcnNlSm9pbkNvbHVtbigyLCAwKTsKKwkJaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zKCk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pKSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZU1vdmVJbnZlcnNlSm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigxKS5zZXROYW1lKCJGT08iKTsKKwkJCisJCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJCisJCXRhYmxlLm1vdmVJbnZlcnNlSm9pbkNvbHVtbigwLCAyKTsKKwkJaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zKCk7CisJCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CisKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVTZXRJbnZlcnNlSm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CisJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOworCQkJCQorCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJCisJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCk7CisJCQorCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKwkJCisJCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOworCX0KKwkKKwkKK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0NhY2hlYWJsZTJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQ2FjaGVhYmxlMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzYTQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0NhY2hlYWJsZTJfMEFubm90YXRpb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5DYWNoZWFibGUyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgQ2FjaGVhYmxlMl8wQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7CisJCisJcHVibGljIENhY2hlYWJsZTJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLkNBQ0hFQUJMRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENhY2hlYWJsZSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZWFibGVXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5DQUNIRUFCTEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBDYWNoZWFibGUodmFsdWU9dHJ1ZSkiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCisJCisJcHVibGljIHZvaWQgdGVzdENhY2hlYWJsZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlYWJsZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJCisJCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSkpOworCQkKKwkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CQkKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKSk7CisJCQorCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKKwkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZWFibGVXaXRoVmFsdWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUNhY2hlYWJsZTJfMEFubm90YXRpb24gY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlYWJsZVdpdGhWYWx1ZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiBjYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQkKKwkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSh2YWx1ZT1mYWxzZSkiLCBjdSk7CisJCQorCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOworCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZShmYWxzZSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlYWJsZVdpdGhWYWx1ZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiBjYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQkKKwkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKKwkJYXNzZXJ0TnVsbChjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ2YWx1ZSIsIGN1KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0VsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMjI4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKKwkKKwlwdWJsaWMgRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVsZW1lbnRDb2xsZWN0aW9uIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVsZW1lbnRDb2xsZWN0aW9uV2l0aEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuRkVUQ0hfVFlQRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVsZW1lbnRDb2xsZWN0aW9uKGZldGNoID0gRmV0Y2hUeXBlLkVBR0VSKSIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVsZW1lbnRDb2xsZWN0aW9uV2l0aFRhcmdldENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARWxlbWVudENvbGxlY3Rpb24odGFyZ2V0Q2xhc3MgPSBBbm5vdGF0aW9uVGVzdFR5cGUuY2xhc3MpIik7CisJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RWxlbWVudENvbGxlY3Rpb24oKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKKwkJYXNzZXJ0Tm90TnVsbChlbGVtZW50Q29sbGVjdGlvbik7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RWxlbWVudENvbGxlY3Rpb25XaXRoRmV0Y2goKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOworCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVsZW1lbnRDb2xsZWN0aW9uV2l0aEZldGNoKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7CisJCQorCQllbGVtZW50Q29sbGVjdGlvbi5zZXRGZXRjaChGZXRjaFR5cGUuTEFaWSk7CisJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVsZW1lbnRDb2xsZWN0aW9uKGZldGNoID0gTEFaWSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVsZW1lbnRDb2xsZWN0aW9uV2l0aEZldGNoKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7CisJCQorCQllbGVtZW50Q29sbGVjdGlvbi5zZXRGZXRjaChudWxsKTsKKwkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARWxlbWVudENvbGxlY3Rpb24iLCBjdSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJmZXRjaCIsIGN1KTsKKwl9CisJCisJCisJcHVibGljIHZvaWQgdGVzdEdldFRhcmdldENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbGVtZW50Q29sbGVjdGlvbldpdGhUYXJnZXRDbGFzcygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7CisJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVsZW1lbnRDb2xsZWN0aW9uV2l0aFRhcmdldENsYXNzKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKKwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7CisJCQorCQllbGVtZW50Q29sbGVjdGlvbi5zZXRUYXJnZXRDbGFzcygiRm9vIik7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVsZW1lbnRDb2xsZWN0aW9uKHRhcmdldENsYXNzID0gRm9vLmNsYXNzKSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldFRhcmdldENsYXNzTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RWxlbWVudENvbGxlY3Rpb25XaXRoVGFyZ2V0Q2xhc3MoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOworCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKKwkJCisJCWVsZW1lbnRDb2xsZWN0aW9uLnNldFRhcmdldENsYXNzKG51bGwpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFbGVtZW50Q29sbGVjdGlvbiIsIGN1KTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInRhcmdldENsYXNzIiwgY3UpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RWxlbWVudENvbGxlY3Rpb25XaXRoVGFyZ2V0Q2xhc3MoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOworCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzc05hbWUoKSk7CisJCQorCQllbGVtZW50Q29sbGVjdGlvbi5zZXRUYXJnZXRDbGFzcygiRm9vIik7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVsZW1lbnRDb2xsZWN0aW9uKHRhcmdldENsYXNzID0gRm9vLmNsYXNzKSIsIGN1KTsKKwkJCisJCWFzc2VydEVxdWFscygiRm9vIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0Q2xhc3NOYW1lKCkpOyAvL2J1ZyAxOTYyMDAgY2hhbmdlZCB0aGlzCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZTJfMFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2ZTBlNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZTJfMFRlc3RzLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitwdWJsaWMgY2xhc3MgSmF2YVJlc291cmNlMl8wVGVzdHMgeworCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEphdmFSZXNvdXJjZTJfMFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7CisJCQorCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQWNjZXNzMl8wQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShBc3NvY2lhdGlvbk92ZXJyaWRlczJfMFRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKENhY2hlYWJsZTJfMEFubm90YXRpb25UZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb25UZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShNYXBzSWQyXzBBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cy5jbGFzcyk7CisJCQkKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCXByaXZhdGUgSmF2YVJlc291cmNlMl8wVGVzdHMoKSB7CisJCXN1cGVyKCk7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNGJkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGEyLkdlbmVyaWMyXzBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlCit7CQorCQorCXB1YmxpYyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcigKKwkJCUdlbmVyaWMyXzBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcHNJZDJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwc0lkMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViYjAyNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcHNJZDJfMEFubm90YXRpb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcHNJZDJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK3B1YmxpYyBjbGFzcyBNYXBzSWQyXzBBbm5vdGF0aW9uVGVzdHMKKwlleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UKK3sKKwlwdWJsaWMgTWFwc0lkMl8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUFNfSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBNYXBzSWQiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwc0lkV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQU19JRCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE1hcHNJZChcImZvb1wiKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwc0lkKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChNYXBzSWQyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKKwkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYXBzSWRXaXRoVmFsdWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJTWFwc0lkMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE1hcHNJZDJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwc0lkKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKworCQlNYXBzSWQyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTWFwc0lkMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7CisJCWFubm90YXRpb24uc2V0VmFsdWUoImZvbyIpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcHNJZChcImZvb1wiKSIsIGN1KTsKKwkJCisJCWFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwc0lkIiwgY3UpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWU4ZTUzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpwYTIuR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworLyoqCisgKiAgU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cworICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBTZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX0NBVEFMT0cgPSAiVEVTVF9DQVRBTE9HIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX1NDSEVNQSA9ICJURVNUX1NDSEVNQSI7CisKKwlwdWJsaWMgU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBhbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyKCkgeworCQlyZXR1cm4gR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKTsKKwl9CisJCisJLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKKworCXB1YmxpYyB2b2lkIHRlc3RHZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhDYXRhbG9nKCk7CQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSB0aGlzLmJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCisJCVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CisJCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfQ0FUQUxPRywgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoQ2F0YWxvZygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CisJCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfQ0FUQUxPRywgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKKwkJCisJCXNlcXVlbmNlR2VuZXJhdG9yLnNldENhdGFsb2coImZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldENhdGFsb2coKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlcXVlbmNlR2VuZXJhdG9yKGNhdGFsb2cgPSBcImZvb1wiKSIsIGN1KTsKKwkJCisJCXNlcXVlbmNlR2VuZXJhdG9yLnNldENhdGFsb2cobnVsbCk7CisJCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKKwkJCisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2VxdWVuY2VHZW5lcmF0b3IiLCBjdSk7CisJfQorCQorCS8vICoqKioqKioqKiogc2NoZW1hICoqKioqKioqKioKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTY2hlbWEoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gdGhpcy5idWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CisJCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfU0NIRU1BLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTY2hlbWEoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoU2NoZW1hKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IHRoaXMuYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOworCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1NDSEVNQSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U2NoZW1hKCkpOworCQkKKwkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U2NoZW1hKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTY2hlbWEoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlcXVlbmNlR2VuZXJhdG9yKHNjaGVtYSA9IFwiZm9vXCIpIiwgY3UpOworCQkKKwkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U2NoZW1hKG51bGwpOworCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNjaGVtYSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2VxdWVuY2VHZW5lcmF0b3IiLCBjdSk7CisJfQorCQorCS8vICoqKioqKioqKiogdXRpbGl0eSAqKioqKioqKioqCisJCQorCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KGZpbmFsIFN0cmluZyBlbGVtZW50TmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBTZXF1ZW5jZUdlbmVyYXRvcigiICsgZWxlbWVudE5hbWUgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aFN0cmluZ0VsZW1lbnQoImNhdGFsb2ciLCBHRU5FUkFUT1JfQ0FUQUxPRyk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aFN0cmluZ0VsZW1lbnQoInNjaGVtYSIsIEdFTkVSQVRPUl9TQ0hFTUEpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnBhTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcGFNb2RlbFRlc3RzLmphdmEKaW5kZXggNTU2MTk1ZS4uODE0NWZmMiAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcGFNb2RlbFRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcGFNb2RlbFRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsMjQgKzEwLDI1IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLm1vZGVsOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLlByb2plY3RVdGlsaXR5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RGYWNldGVkUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdFBsYXRmb3JtUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBKcGFNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewogCiAJLyoqIGNhcnJpYWdlIHJldHVybiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwogCisJcHJvdGVjdGVkIFRlc3RGYWNldGVkUHJvamVjdCB0ZXN0UHJvamVjdDsKIAlwdWJsaWMgSnBhTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewogCQlzdXBlcihuYW1lKTsKIAl9CkBAIC0zOCwxNCArMzksMTkgQEAKIAkJaWYgKHRoaXMuZGVidWcoKSkgewogCQkJdGhpcy5wcmludE5hbWUoKTsKIAkJfQotCQlQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOworCQl0aGlzLnRlc3RQcm9qZWN0ID0gdGhpcy5idWlsZFRlc3RQcm9qZWN0KCk7CiAJfQogCiAJcHJpdmF0ZSBib29sZWFuIGRlYnVnKCkgewotCQlCb29sZWFuIGRlYnVnID0gKEJvb2xlYW4pIENsYXNzVG9vbHMuc3RhdGljRmllbGRWYWx1ZShKcGFNb2RlbE1hbmFnZXIuY2xhc3MsICJERUJVRyIpOworCQlCb29sZWFuIGRlYnVnID0gKEJvb2xlYW4pIENsYXNzVG9vbHMuc3RhdGljRmllbGRWYWx1ZSh0aGlzLmdldEdlbmVyaWNKcGFNb2RlbENsYXNzKCksICJERUJVRyIpOwogCQlyZXR1cm4gZGVidWcuYm9vbGVhblZhbHVlKCk7CiAJfQogCisJLy8gR2VuZXJpY0pwYU1vZGVsIGlzIHBhY2thZ2UtcHJpdmF0ZQorCXByaXZhdGUgQ2xhc3M8Pz4gZ2V0R2VuZXJpY0pwYU1vZGVsQ2xhc3MoKSB7CisJCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldEpwYU1vZGVsKCkuZ2V0Q2xhc3MoKTsKKwl9CisKIAlwcml2YXRlIHZvaWQgcHJpbnROYW1lKCkgewogCQlTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpOwogCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKQEAgLTY0LDcgKzcwLDggQEAKIAogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVByb2plY3RVdGlsaXR5LmRlbGV0ZUFsbFByb2plY3RzKCk7CisJCXRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKKwkJdGhpcy50ZXN0UHJvamVjdCA9IG51bGw7CiAJCXN1cGVyLnRlYXJEb3duKCk7CiAJfQogCkBAIC03Myw4MyArODAsNjYgQEAKIAkgKiBwcmUtZXhpc3RpbmcgZW50aXRpZXMgYWRkZWQuCiAJICovCiAJcHJpdmF0ZSBUZXN0RmFjZXRlZFByb2plY3QgYnVpbGRUZXN0UHJvamVjdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0RmFjZXRlZFByb2plY3QgdGVzdFByb2plY3QgPSBUZXN0RmFjZXRlZFByb2plY3QuYnVpbGRGYWNldGVkUHJvamVjdChDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpLCB0cnVlKTsKLQkJdGVzdFByb2plY3QuaW5zdGFsbEZhY2V0KCJqc3QuamF2YSIsICI1LjAiKTsKLQkJdGVzdFByb2plY3QuaW5zdGFsbEZhY2V0KCJqc3QudXRpbGl0eSIsICIxLjAiKTsKLQkJdGVzdFByb2plY3QuY3JlYXRlRmlsZSgKLQkJCW5ldyBQYXRoKCJzcmMvdGVzdC5wa2cvVGVzdEVudGl0eS5qYXZhIiksCi0JCQkicGFja2FnZSB0ZXN0LnBrZzsgQEVudGl0eSBwdWJsaWMgY2xhc3MgVGVzdEVudGl0eSB7fSIpOwotCQl0ZXN0UHJvamVjdC5jcmVhdGVGaWxlKAotCQkJbmV3IFBhdGgoInNyYy90ZXN0LnBrZy9UZXN0RW50aXR5Mi5qYXZhIiksCi0JCQkicGFja2FnZSB0ZXN0LnBrZzsgQEVudGl0eSBwdWJsaWMgY2xhc3MgVGVzdEVudGl0eTIge30iKTsKLQkJcmV0dXJuIHRlc3RQcm9qZWN0OworCQlUZXN0SmF2YVByb2plY3QgdGpwID0gVGVzdEphdmFQcm9qZWN0LmJ1aWxkSmF2YVByb2plY3QoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSwgdHJ1ZSk7CisJCXRqcC5pbnN0YWxsRmFjZXQoImpzdC51dGlsaXR5IiwgIjEuMCIpOworCQl0anAuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJ0ZXN0LnBrZyIsICJUZXN0RW50aXR5LmphdmEiLCAiQEVudGl0eSBwdWJsaWMgY2xhc3MgVGVzdEVudGl0eSB7fSIpOworCQl0anAuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJ0ZXN0LnBrZyIsICJUZXN0RW50aXR5Mi5qYXZhIiwgIkBFbnRpdHkgcHVibGljIGNsYXNzIFRlc3RFbnRpdHkyIHt9Iik7CisJCXJldHVybiB0anA7CiAJfQkKIAotCXByaXZhdGUgSUZpbGUgZmlsZShUZXN0UGxhdGZvcm1Qcm9qZWN0IHAsIFN0cmluZyBwYXRoKSB7CisJcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKFRlc3RQbGF0Zm9ybVByb2plY3QgcCwgU3RyaW5nIHBhdGgpIHsKIAkJcmV0dXJuIHAuZ2V0UHJvamVjdCgpLmdldEZpbGUobmV3IFBhdGgocGF0aCkpOwogCX0KIAorCS8qKgorCSAqIG1ha2Ugc3VyZSB0aGUgREVCVUcgY29uc3RhbnRzIGFyZSAnZmFsc2UnIGJlZm9yZSBjaGVja2luZyBpbiB0aGUgY29kZQorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RERUJVRygpIHsKKwkJdGhpcy52ZXJpZnlERUJVRyh0aGlzLmdldEdlbmVyaWNKcGFNb2RlbENsYXNzKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB2ZXJpZnlERUJVRyhDbGFzczw/PiBjbGF6eikgeworCQlhc3NlcnRGYWxzZSgiUmVjb21waWxlIHdpdGggXCJERUJVRyA9IGZhbHNlXCI6ICIgKyBjbGF6ei5nZXROYW1lKCksCisJCQkJKChCb29sZWFuKSBDbGFzc1Rvb2xzLnN0YXRpY0ZpZWxkVmFsdWUoY2xhenosICJERUJVRyIpKS5ib29sZWFuVmFsdWUoKSk7CisJfQorCQogCXB1YmxpYyB2b2lkIHRlc3RKcGFNb2RlbCgpIHsKIAkJYXNzZXJ0Tm90TnVsbChKcHRDb3JlUGx1Z2luLmdldEpwYU1vZGVsKCkpOwogCX0KIAotCXB1YmxpYyB2b2lkIHRlc3RGYWNldEluc3RhbGxVbmluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEZhY2V0ZWRQcm9qZWN0IHRlc3RQcm9qZWN0ID0gdGhpcy5idWlsZFRlc3RQcm9qZWN0KCk7Ci0JCWFzc2VydE51bGwoSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRlc3RQcm9qZWN0LmdldFByb2plY3QoKSkpOwotCi0JCXRlc3RQcm9qZWN0Lmluc3RhbGxGYWNldCgianB0LmpwYSIsICIxLjAiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEpwdENvcmVQbHVnaW4uZ2V0SnBhTW9kZWwoKS5qcGFQcm9qZWN0c1NpemUoKSk7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotLy8JCWFzc2VydEVxdWFscyg0LCBqcGFQcm9qZWN0LmpwYUZpbGVzU2l6ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5maWxlKHRlc3RQcm9qZWN0LCAic3JjL3Rlc3QucGtnL1Rlc3RFbnRpdHkuamF2YSIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy90ZXN0LnBrZy9UZXN0RW50aXR5Mi5qYXZhIikpKTsKLQkJLy8gcGVyc2lzdGVuY2UueG1sIGFuZCBvcm0ueG1sIGFyZSBjcmVhdGVkIGluIHRoZSBiYWNrZ3JvdW5kLCBzbyB0aGV5IHByb2JhYmx5Ci0JCS8vIHdvbid0IGJlIHRoZXJlIHlldC4uLgotLy8JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5qcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiKSkpOwotLy8JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5qcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9vcm0ueG1sIikpKTsKLQotCQl0ZXN0UHJvamVjdC51bmluc3RhbGxGYWNldCgianB0LmpwYSIsICIxLjAiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEpwdENvcmVQbHVnaW4uZ2V0SnBhTW9kZWwoKS5qcGFQcm9qZWN0c1NpemUoKSk7Ci0JCWpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0TnVsbChqcGFQcm9qZWN0KTsKLQl9Ci0KIAlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdENsb3NlUmVvcGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RGYWNldGVkUHJvamVjdCB0ZXN0UHJvamVjdCA9IHRoaXMuYnVpbGRUZXN0UHJvamVjdCgpOwotCQl0ZXN0UHJvamVjdC5pbnN0YWxsRmFjZXQoImpwdC5qcGEiLCAiMS4wIik7CisJCXRoaXMudGVzdFByb2plY3QuaW5zdGFsbEZhY2V0KEpwdENvcmVQbHVnaW4uRkFDRVRfSUQsICIxLjAiKTsKIAotCQl0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuY2xvc2UobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5pc09wZW4oKSk7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOworCQl0aGlzLnRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5jbG9zZShudWxsKTsKKwkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuaXNPcGVuKCkpOworCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOwogCQlhc3NlcnROdWxsKGpwYVByb2plY3QpOwogCi0JCXRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5vcGVuKG51bGwpOwotCQlqcGFQcm9qZWN0ID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRlc3RQcm9qZWN0LmdldFByb2plY3QoKSk7CisJCXRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLm9wZW4obnVsbCk7CisJCWFzc2VydFRydWUodGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuaXNPcGVuKCkpOworCQlqcGFQcm9qZWN0ID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKIAkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLS8vCQlhc3NlcnRFcXVhbHMoNCwganBhUHJvamVjdC5qcGFGaWxlc1NpemUoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy90ZXN0LnBrZy9UZXN0RW50aXR5LmphdmEiKSkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmZpbGUodGVzdFByb2plY3QsICJzcmMvdGVzdC5wa2cvVGVzdEVudGl0eTIuamF2YSIpKSk7Ci0JCS8vIHBlcnNpc3RlbmNlLnhtbCBhbmQgb3JtLnhtbCBhcmUgY3JlYXRlZCBpbiB0aGUgYmFja2dyb3VuZCwgc28gdGhleSBwcm9iYWJseQotCQkvLyB3b24ndCBiZSB0aGVyZSB5ZXQuLi4KLS8vCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuanBhRmlsZSh0aGlzLmZpbGUodGVzdFByb2plY3QsICJzcmMvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIikpKTsKLS8vCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuanBhRmlsZSh0aGlzLmZpbGUodGVzdFByb2plY3QsICJzcmMvTUVUQS1JTkYvb3JtLnhtbCIpKSk7CisJCWFzc2VydEVxdWFscyg0LCBqcGFQcm9qZWN0LmpwYUZpbGVzU2l6ZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICJzcmMvdGVzdC9wa2cvVGVzdEVudGl0eS5qYXZhIikpKTsKKwkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICJzcmMvdGVzdC9wa2cvVGVzdEVudGl0eTIuamF2YSIpKSk7CisKKwkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICJzcmMvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIikpKTsKKwkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICJzcmMvTUVUQS1JTkYvb3JtLnhtbCIpKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFByb2plY3REZWxldGVSZWltcG9ydCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0RmFjZXRlZFByb2plY3QgdGVzdFByb2plY3QgPSB0aGlzLmJ1aWxkVGVzdFByb2plY3QoKTsKLQkJdGVzdFByb2plY3QuaW5zdGFsbEZhY2V0KCJqcHQuanBhIiwgIjEuMCIpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKKwkJdGhpcy50ZXN0UHJvamVjdC5pbnN0YWxsRmFjZXQoSnB0Q29yZVBsdWdpbi5GQUNFVF9JRCwgIjEuMCIpOworCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOwogCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQlhc3NlcnRFcXVhbHMoMSwgSnB0Q29yZVBsdWdpbi5nZXRKcGFNb2RlbCgpLmpwYVByb2plY3RzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIEpwdENvcmVQbHVnaW4uZ2V0SnBhTW9kZWwoKS5nZXRKcGFQcm9qZWN0c1NpemUoKSk7CiAKLQkJdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmRlbGV0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7Ci0JCWpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKKwkJdGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlKGZhbHNlLCB0cnVlLCBudWxsKTsKKwkJanBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLnRlc3RQcm9qZWN0LmdldFByb2plY3QoKSk7CiAJCWFzc2VydE51bGwoanBhUHJvamVjdCk7Ci0JCWFzc2VydEVxdWFscygwLCBKcHRDb3JlUGx1Z2luLmdldEpwYU1vZGVsKCkuanBhUHJvamVjdHNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgSnB0Q29yZVBsdWdpbi5nZXRKcGFNb2RlbCgpLmdldEpwYVByb2plY3RzU2l6ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDAsIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKS5sZW5ndGgpOwogCi0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7CisJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QodGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKIAkJcHJvamVjdC5jcmVhdGUobnVsbCk7CiAJCWFzc2VydEVxdWFscygxLCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCkubGVuZ3RoKTsKIAkJcHJvamVjdC5vcGVuKG51bGwpOwpAQCAtMTU4LDcwICsxNDgsODIgQEAKIAkJYXNzZXJ0VHJ1ZShKcHRDb3JlUGx1Z2luLnByb2plY3RIYXNKcGFGYWNldChwcm9qZWN0KSk7CiAJCWpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7CiAJCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDQsIGpwYVByb2plY3QuanBhRmlsZXNTaXplKCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmZpbGUodGVzdFByb2plY3QsICJzcmMvdGVzdC5wa2cvVGVzdEVudGl0eS5qYXZhIikpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5maWxlKHRlc3RQcm9qZWN0LCAic3JjL3Rlc3QucGtnL1Rlc3RFbnRpdHkyLmphdmEiKSkpOwotCQkvLyBwZXJzaXN0ZW5jZS54bWwgYW5kIG9ybS54bWwgYXJlIGNyZWF0ZWQgaW4gdGhlIGJhY2tncm91bmQsIHNvIHRoZXkgcHJvYmFibHkKLQkJLy8gd29uJ3QgYmUgdGhlcmUgeWV0Li4uCi0vLwkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmpwYUZpbGUodGhpcy5maWxlKHRlc3RQcm9qZWN0LCAic3JjL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIpKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmpwYUZpbGUodGhpcy5maWxlKHRlc3RQcm9qZWN0LCAic3JjL01FVEEtSU5GL29ybS54bWwiKSkpOworCQlhc3NlcnRFcXVhbHMoNCwganBhUHJvamVjdC5qcGFGaWxlc1NpemUoKSk7CisJCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0LCAic3JjL3Rlc3QvcGtnL1Rlc3RFbnRpdHkuamF2YSIpKSk7CisJCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0LCAic3JjL3Rlc3QvcGtnL1Rlc3RFbnRpdHkyLmphdmEiKSkpOworCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiKSkpOworCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9vcm0ueG1sIikpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0RmFjZXRJbnN0YWxsVW5pbnN0YWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydE51bGwoSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKSk7CisKKwkJdGhpcy50ZXN0UHJvamVjdC5pbnN0YWxsRmFjZXQoSnB0Q29yZVBsdWdpbi5GQUNFVF9JRCwgIjEuMCIpOworCQlhc3NlcnRFcXVhbHMoMSwgSnB0Q29yZVBsdWdpbi5nZXRKcGFNb2RlbCgpLmdldEpwYVByb2plY3RzU2l6ZSgpKTsKKwkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKKwkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKKwkJYXNzZXJ0RXF1YWxzKDQsIGpwYVByb2plY3QuanBhRmlsZXNTaXplKCkpOworCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdCwgInNyYy90ZXN0L3BrZy9UZXN0RW50aXR5LmphdmEiKSkpOworCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdCwgInNyYy90ZXN0L3BrZy9UZXN0RW50aXR5Mi5qYXZhIikpKTsKKworCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiKSkpOworCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9vcm0ueG1sIikpKTsKKworCQl0aGlzLnRlc3RQcm9qZWN0LnVuaW5zdGFsbEZhY2V0KEpwdENvcmVQbHVnaW4uRkFDRVRfSUQsICIxLjAiKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIEpwdENvcmVQbHVnaW4uZ2V0SnBhTW9kZWwoKS5nZXRKcGFQcm9qZWN0c1NpemUoKSk7CisJCWpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOworCQlhc3NlcnROdWxsKGpwYVByb2plY3QpOwogCX0KIAogCS8vVE9ETyAtIENvbW1lbnRlZCBvdXQgdGhpcyB0ZXN0LCBzaW5jZSBpdCB3YXMgZmFpbGluZyBpbiB0aGUgSS1CdWlsZCBhbmQgd2UncmUgbm90IHN1cmUgd2h5LgotCS8vU2VlIGJ1ZyAyMjE3NTcKLS8vCXB1YmxpYyB2b2lkIHRlc3RFZGl0RmFjZXRTZXR0aW5nc0ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlUZXN0RmFjZXRlZFByb2plY3QgdGVzdFByb2plY3QgPSB0aGlzLmJ1aWxkVGVzdFByb2plY3QoKTsKLS8vCQlhc3NlcnROdWxsKEpwdENvcmVQbHVnaW4uanBhUHJvamVjdCh0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpKTsKLS8vCi0vLwkJLy8gYWRkIHRoZSBKUEEgZmFjZXQgYnkgbW9kaWZ5aW5nIHRoZSBmYWNldCBzZXR0aW5ncyBmaWxlIGRpcmVjdGx5Ci0vLwkJSUZpbGUgZmFjZXRTZXR0aW5nc0ZpbGUgPSB0aGlzLmZpbGUodGVzdFByb2plY3QsICIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sIik7Ci0vLwkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmYWNldFNldHRpbmdzRmlsZS5nZXRDb250ZW50cygpKTsKLS8vCQlpbnQgZmlsZVNpemUgPSBpblN0cmVhbS5hdmFpbGFibGUoKTsKLS8vCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbZmlsZVNpemVdOwotLy8JCWluU3RyZWFtLnJlYWQoYnVmKTsKLS8vCQlpblN0cmVhbS5jbG9zZSgpOwotLy8KLS8vCQlTdHJpbmcgb2xkRG9jdW1lbnQgPSBuZXcgU3RyaW5nKGJ1Zik7Ci0vLwkJU3RyaW5nIG9sZFN0cmluZyA9ICI8aW5zdGFsbGVkIGZhY2V0PVwianN0LnV0aWxpdHlcIiB2ZXJzaW9uPVwiMS4wXCIvPiI7Ci0vLwkJU3RyaW5nIG5ld1N0cmluZyA9IG9sZFN0cmluZyArIENSICsgIiAgIiArICI8aW5zdGFsbGVkIGZhY2V0PVwianB0LmpwYVwiIHZlcnNpb249XCIxLjBcIi8+IjsKLS8vCQlTdHJpbmcgbmV3RG9jdW1lbnQgPSBvbGREb2N1bWVudC5yZXBsYWNlQWxsKG9sZFN0cmluZywgbmV3U3RyaW5nKTsKLS8vCi0vLwkJZmFjZXRTZXR0aW5nc0ZpbGUuc2V0Q29udGVudHMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ld0RvY3VtZW50LmdldEJ5dGVzKCkpLCBmYWxzZSwgZmFsc2UsIG51bGwpOwotLy8KLS8vCQlhc3NlcnRFcXVhbHMoMSwgSnB0Q29yZVBsdWdpbi5qcGFNb2RlbCgpLmpwYVByb2plY3RzU2l6ZSgpKTsKLS8vCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmpwYVByb2plY3QodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKKwkvL1NlZSBidWcgMjIxNzU3IGFuZCBidWcgMjg5MTQ5CisvKglwdWJsaWMgdm9pZCB0ZXN0RWRpdEZhY2V0U2V0dGluZ3NGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydE51bGwoSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKSk7CisKKwkJLy8gYWRkIHRoZSBKUEEgZmFjZXQgYnkgbW9kaWZ5aW5nIHRoZSBmYWNldCBzZXR0aW5ncyBmaWxlIGRpcmVjdGx5CisJCUlGaWxlIGZhY2V0U2V0dGluZ3NGaWxlID0gdGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sIik7CisJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmFjZXRTZXR0aW5nc0ZpbGUuZ2V0Q29udGVudHMoKSk7CisJCWludCBmaWxlU2l6ZSA9IGluU3RyZWFtLmF2YWlsYWJsZSgpOworCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbZmlsZVNpemVdOworCQlpblN0cmVhbS5yZWFkKGJ1Zik7CisJCWluU3RyZWFtLmNsb3NlKCk7CisKKwkJU3RyaW5nIG9sZERvY3VtZW50ID0gbmV3IFN0cmluZyhidWYpOworCQlTdHJpbmcgb2xkU3RyaW5nID0gIjxpbnN0YWxsZWQgZmFjZXQ9XCJqc3QudXRpbGl0eVwiIHZlcnNpb249XCIxLjBcIi8+IjsKKwkJU3RyaW5nIG5ld1N0cmluZyA9IG9sZFN0cmluZyArIENSICsgIiAgIiArICI8aW5zdGFsbGVkIGZhY2V0PVwianB0LmpwYVwiIHZlcnNpb249XCIxLjBcIi8+IjsKKwkJU3RyaW5nIG5ld0RvY3VtZW50ID0gb2xkRG9jdW1lbnQucmVwbGFjZUFsbChvbGRTdHJpbmcsIG5ld1N0cmluZyk7CisKKwkJZmFjZXRTZXR0aW5nc0ZpbGUuc2V0Q29udGVudHMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ld0RvY3VtZW50LmdldEJ5dGVzKCkpLCBmYWxzZSwgZmFsc2UsIG51bGwpOworCisJCS8vIFRPRE8gbW92ZWQgbW9yZSBzdHVmZiB0byB0aGUgZXJyb3IgY29uc29sZSB1bnRpbCB3ZSBjYW4gZmlndXJlIG91dCB3aHkgaXQgZmFpbHMgaW50ZXJtaXR0ZW50bHkgIH5rZmIKKy8vCQlhc3NlcnRFcXVhbHMoMSwgSnB0Q29yZVBsdWdpbi5nZXRKcGFNb2RlbCgpLmpwYVByb2plY3RzU2l6ZSgpKTsKKy8vCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOwogLy8JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CiAvLwkJLy8gcGVyc2lzdGVuY2UueG1sIGFuZCBvcm0ueG1sIGRvIG5vdCBnZXQgY3JlYXRlZCBpbiB0aGlzIHNpdHVhdGlvbiAoPykKIC8vCQlhc3NlcnRFcXVhbHMoMiwganBhUHJvamVjdC5qcGFGaWxlc1NpemUoKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmpwYUZpbGUodGhpcy5maWxlKHRlc3RQcm9qZWN0LCAic3JjL3Rlc3QucGtnL1Rlc3RFbnRpdHkuamF2YSIpKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmpwYUZpbGUodGhpcy5maWxlKHRlc3RQcm9qZWN0LCAic3JjL3Rlc3QucGtnL1Rlc3RFbnRpdHkyLmphdmEiKSkpOwotLy8JCS8vIGFzc2VydE5vdE51bGwoanBhUHJvamVjdC5qcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiKSkpOwotLy8JCS8vIGFzc2VydE5vdE51bGwoanBhUHJvamVjdC5qcGFGaWxlKHRoaXMuZmlsZSh0ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9vcm0ueG1sIikpKTsKLS8vCi0vLwkJLy8gbm93IHJlbW92ZSB0aGUgSlBBIGZhY2V0Ci0vLwkJZmFjZXRTZXR0aW5nc0ZpbGUuc2V0Q29udGVudHMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9sZERvY3VtZW50LmdldEJ5dGVzKCkpLCBmYWxzZSwgZmFsc2UsIG51bGwpOwotLy8vLyBUT0RPIG1vdmVkIHRoaXMgc3R1ZmYgdG8gdGhlIGVycm9yIGNvbnNvbGUgdW50aWwgd2UgY2FuIGZpZ3VyZSBvdXQgd2h5IGl0IGZhaWxzIGludGVybWl0dGVudGx5ICB+Ymp2Ci0vLy8vCQlhc3NlcnRFcXVhbHMoMCwgSnB0Q29yZVBsdWdpbi5qcGFNb2RlbCgpLmpwYVByb2plY3RzU2l6ZSgpKTsKLS8vLy8JCWpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmpwYVByb2plY3QodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLS8vLy8JCWFzc2VydE51bGwoanBhUHJvamVjdCk7Ci0vLwkJaW50IHNpemUgPSBKcHRDb3JlUGx1Z2luLmpwYU1vZGVsKCkuanBhUHJvamVjdHNTaXplKCk7Ci0vLwkJaWYgKHNpemUgIT0gMCkgewotLy8JCQlTeXN0ZW0uZXJyLnByaW50bG4oImJvZ3VzIHNpemU6ICIgKyBzaXplKTsKLS8vCQkJU3lzdGVtLmVyci5wcmludGxuKCJib2d1cyBwcm9qZWN0OiAiICsgSnB0Q29yZVBsdWdpbi5qcGFQcm9qZWN0KHRlc3RQcm9qZWN0LmdldFByb2plY3QoKSkpOwotLy8JCX0KLS8vCX0KKy8vCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdCwgInNyYy90ZXN0L3BrZy9UZXN0RW50aXR5LmphdmEiKSkpOworLy8JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0LCAic3JjL3Rlc3QvcGtnL1Rlc3RFbnRpdHkyLmphdmEiKSkpOworLy8vLwkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICJzcmMvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIikpKTsKKy8vLy8JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0LCAic3JjL01FVEEtSU5GL29ybS54bWwiKSkpOworCQlpbnQgc2l6ZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhTW9kZWwoKS5qcGFQcm9qZWN0c1NpemUoKTsKKwkJaWYgKHNpemUgIT0gMSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJib2d1cyBzaXplOiAiICsgc2l6ZSk7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oImJvZ3VzIHByb2plY3Q6ICIgKyBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpKTsKKwkJfQogCi0JLyoqCi0JICogbWFrZSBzdXJlIHRoZSBERUJVRyBjb25zdGFudHMgYXJlICdmYWxzZScgYmVmb3JlIGNoZWNraW5nIGluIHRoZSBjb2RlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERFQlVHKCkgewotCQl0aGlzLnZlcmlmeURFQlVHKEpwYU1vZGVsTWFuYWdlci5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5REVCVUcoR2VuZXJpY0pwYU1vZGVsLmNsYXNzKTsKKwkJLy8gbm93IHJlbW92ZSB0aGUgSlBBIGZhY2V0CisJCWZhY2V0U2V0dGluZ3NGaWxlLnNldENvbnRlbnRzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbGREb2N1bWVudC5nZXRCeXRlcygpKSwgZmFsc2UsIGZhbHNlLCBudWxsKTsKKy8vIFRPRE8gbW92ZWQgdGhpcyBzdHVmZiB0byB0aGUgZXJyb3IgY29uc29sZSB1bnRpbCB3ZSBjYW4gZmlndXJlIG91dCB3aHkgaXQgZmFpbHMgaW50ZXJtaXR0ZW50bHkgIH5ianYKKy8vCQlhc3NlcnRFcXVhbHMoMCwgSnB0Q29yZVBsdWdpbi5qcGFNb2RlbCgpLmpwYVByb2plY3RzU2l6ZSgpKTsKKy8vCQlqcGFQcm9qZWN0ID0gSnB0Q29yZVBsdWdpbi5qcGFQcm9qZWN0KHRlc3RQcm9qZWN0LmdldFByb2plY3QoKSk7CisvLwkJYXNzZXJ0TnVsbChqcGFQcm9qZWN0KTsKKwkJaW50IG5ld1NpemUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYU1vZGVsKCkuanBhUHJvamVjdHNTaXplKCk7CisJCWlmIChuZXdTaXplICE9IDApIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiYm9ndXMgc2l6ZTogIiArIG5ld1NpemUpOworCQkJU3lzdGVtLmVyci5wcmludGxuKCJib2d1cyBwcm9qZWN0OiAiICsgSnB0Q29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKSk7CisJCX0KIAl9CisqLwogCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURFQlVHKENsYXNzPD8+IGNsYXp6KSB7Ci0JCWFzc2VydEZhbHNlKCJSZWNvbXBpbGUgd2l0aCBcIkRFQlVHID0gZmFsc2VcIjogIiArIGNsYXp6LmdldE5hbWUoKSwKLQkJCQkoKEJvb2xlYW4pIENsYXNzVG9vbHMuc3RhdGljRmllbGRWYWx1ZShjbGF6eiwgIkRFQlVHIikpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnB0Q29yZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnB0Q29yZU1vZGVsVGVzdHMuamF2YQppbmRleCA1OWJlMWExLi4xYTkwZGM2IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL21vZGVsL0pwdENvcmVNb2RlbFRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcHRDb3JlTW9kZWxUZXN0cy5qYXZhCkBAIC0xNSwxMCArMTUsNiBAQAogcHVibGljIGNsYXNzIEpwdENvcmVNb2RlbFRlc3RzIHsKIAogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIHN1aXRlKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoYm9vbGVhbiBhbGwpIHsKIAkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRDb3JlTW9kZWxUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKIAkJc3VpdGUuYWRkVGVzdFN1aXRlKEpwYU1vZGVsVGVzdHMuY2xhc3MpOwogCQlyZXR1cm4gc3VpdGU7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0Jhc2VKcGFQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0Jhc2VKcGFQbGF0Zm9ybVRlc3RzLmphdmEKaW5kZXggZThhMGVlOS4uYjI3Y2FhMyAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9CYXNlSnBhUGxhdGZvcm1UZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vQmFzZUpwYVBsYXRmb3JtVGVzdHMuamF2YQpAQCAtMTEsNyArMTEsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5Qcm9qZWN0VXRpbGl0eTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKIAogcHVibGljIGNsYXNzIEJhc2VKcGFQbGF0Zm9ybVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKQEAgLTMxLDggKzMwLDcgQEAKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQlzdXBlci5zZXRVcCgpOwotCQlQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotCQlqcGFQcm9qZWN0ID0gdGhpcy5idWlsZEpwYVByb2plY3QoUFJPSkVDVF9OQU1FLCBmYWxzZSk7ICAvLyBmYWxzZSA9IG5vIGF1dG8tYnVpbGQKKwkJdGhpcy5qcGFQcm9qZWN0ID0gdGhpcy5idWlsZEpwYVByb2plY3QoUFJPSkVDVF9OQU1FLCBmYWxzZSk7ICAvLyBmYWxzZSA9IG5vIGF1dG8tYnVpbGQKIAl9CiAKIAlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNDEsOCArMzksOCBAQAogCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLQkJanBhUHJvamVjdCA9IG51bGw7CisJCXRoaXMuanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOworCQl0aGlzLmpwYVByb2plY3QgPSBudWxsOwogCQlzdXBlci50ZWFyRG93bigpOwogCX0KIAkKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1FeHRlbnNpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybUV4dGVuc2lvblRlc3RzLmphdmEKaW5kZXggNmU2ZWE1Yy4uMjk3ZWQ2NCAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybUV4dGVuc2lvblRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybUV4dGVuc2lvblRlc3RzLmphdmEKQEAgLTksMjIgKzksMzIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnBsYXRmb3JtOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybVJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwYVBsYXRmb3JtUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5FeHRlbnNpb25UZXN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5UZXN0SnBhUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkNvbmZpZ0ZhY3Rvcnk7CiAKLXB1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybUV4dGVuc2lvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEpwYVBsYXRmb3JtRXh0ZW5zaW9uVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQogewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExBVEZPUk1fSUQgPSBUZXN0SnBhUGxhdGZvcm0uSUQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9JRCA9IFRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyLklEOwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExBVEZPUk1fTEFCRUwgPSAiVGVzdCBKcGEgUGxhdGZvcm0iOwogCQorCXByb3RlY3RlZCBUZXN0SnBhUHJvamVjdCB0ZXN0UHJvamVjdDsKKwogCXB1YmxpYyBKcGFQbGF0Zm9ybUV4dGVuc2lvblRlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwogCX0KQEAgLTM0LDYgKzQ0LDE5IEBACiAJCXN1cGVyLnNldFVwKCk7CiAJCXZlcmlmeUV4dGVuc2lvblRlc3RQcm9qZWN0RXhpc3RzKCk7CiAJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgYnVpbGRKYXZhUHJvamVjdChib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBzdXBlci5idWlsZEpwYVByb2plY3QoUFJPSkVDVF9OQU1FLCBhdXRvQnVpbGQsIHRoaXMuYnVpbGRDb25maWcoKSk7CisJfQorCisJcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRDb25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUFjdGlvbkNvbmZpZ0ZhY3RvcnkgY29uZmlnRmFjdG9yeSA9IG5ldyBKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpOworCQlJRGF0YU1vZGVsIGNvbmZpZyA9IChJRGF0YU1vZGVsKSBjb25maWdGYWN0b3J5LmNyZWF0ZSgpOworCQljb25maWcuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgSnB0Q29yZVBsdWdpbi5KUEFfRkFDRVRfVkVSU0lPTl8xXzApOyAvLyROT04tTkxTLTEkCisJCWNvbmZpZy5zZXRQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk1fSUQsIFRFU1RfUExBVEZPUk1fSUQpOworCQlyZXR1cm4gY29uZmlnOworCX0KIAogCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlFeHRlbnNpb25UZXN0UHJvamVjdEV4aXN0cygpIHsKIAkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKQEAgLTU3LDcgKzgwLDcgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEFsbEpwYVBsYXRmb3JtSWRzKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5zaXplKEpwYVBsYXRmb3JtUmVnaXN0cnkuaW5zdGFuY2UoKS5qcGFQbGF0Zm9ybUlkcygpKSA+PSAyKTsKKwkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuc2l6ZShKcGFQbGF0Zm9ybVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1JZHMoKSkgPj0gMik7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RKcGFQbGF0Zm9ybUxhYmVsKCkgewpAQCAtNjUsNyArODgsNyBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0SnBhUGxhdGZvcm0oKSB7Ci0JCWFzc2VydE5vdE51bGwoSnBhUGxhdGZvcm1SZWdpc3RyeS5pbnN0YW5jZSgpLmdldEpwYVBsYXRmb3JtKFRFU1RfUExBVEZPUk1fSUQpKTsJCQorCQlhc3NlcnROb3ROdWxsKEpwYVBsYXRmb3JtUmVnaXN0cnkuaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybSh0aGlzLnRlc3RQcm9qZWN0LmdldFByb2plY3QoKSkpOwkJCiAJfQogCiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1UZXN0cy5qYXZhCmluZGV4IGRlODdmYjMuLjQ5OTA5ZmIgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1UZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1UZXN0cy5qYXZhCkBAIC0xMyw0MyArMTMsNDUgQEAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkV4dGVuc2lvblRlc3RQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkphdmFUZXN0QXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkphdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkphdmFUZXN0VHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkphdmFUZXN0VHlwZU1hcHBpbmdQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKYXZhQmFzaWNNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5UZXN0SmF2YUVudGl0eTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuVGVzdEpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKcGFQbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWdGYWN0b3J5OwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKIHsKIAlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgdGVzdFByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiRXh0ZW5zaW9uVGVzdFByb2plY3QiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJleHRlbnNpb24udGVzdCI7CiAJCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTFVHSU5fQ0xBU1MgPSBFeHRlbnNpb25UZXN0UGx1Z2luLmNsYXNzLmdldE5hbWUoKTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UiOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9DTEFTU19OQU1FID0gVGVzdEpwYVBsYXRmb3JtLmNsYXNzLmdldE5hbWUoKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMQVRGT1JNX0NMQVNTX05BTUUgPSBUZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5jbGFzcy5nZXROYW1lKCk7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9MQUJFTCA9ICJUZXN0IEpwYSBQbGF0Zm9ybSI7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9KUEFfRkFDVE9SWSA9IFRlc3RKcGFGYWN0b3J5LmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RZUEVfTUFQUElOR19QUk9WSURFUl9DTEFTUyA9IEphdmFUZXN0VHlwZU1hcHBpbmdQcm92aWRlci5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BVFRSSUJVVEVfTUFQUElOR19QUk9WSURFUl9DTEFTUyA9IEphdmFUZXN0QXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmNsYXNzLmdldE5hbWUoKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RZUEVfTUFQUElOR19QUk9WSURFUl9DTEFTUyA9IEphdmFUZXN0VHlwZU1hcHBpbmdEZWZpbml0aW9uLmNsYXNzLmdldE5hbWUoKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FUVFJJQlVURV9NQVBQSU5HX1BST1ZJREVSX0NMQVNTID0gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5jbGFzcy5nZXROYW1lKCk7CiAJCiAJcHVibGljIEpwYVBsYXRmb3JtVGVzdHMoU3RyaW5nIG5hbWUpIHsKIAkJc3VwZXIobmFtZSk7CkBAIC02NywyMCArNjksMTQgQEAKIAl9CiAKIAlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZENvbmZpZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQWN0aW9uQ29uZmlnRmFjdG9yeSBjb25maWdGYWN0b3J5ID0gbmV3IEpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIoKTsKKwkJSUFjdGlvbkNvbmZpZ0ZhY3RvcnkgY29uZmlnRmFjdG9yeSA9IG5ldyBKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpOwogCQlJRGF0YU1vZGVsIGNvbmZpZyA9IChJRGF0YU1vZGVsKSBjb25maWdGYWN0b3J5LmNyZWF0ZSgpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNX0lELCBUZXN0SnBhUGxhdGZvcm0uSUQpOworCQljb25maWcuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgSnB0Q29yZVBsdWdpbi5KUEFfRkFDRVRfVkVSU0lPTl8xXzApOworCQljb25maWcuc2V0UHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNX0lELCBUZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5JRCk7CiAJCXJldHVybiBjb25maWc7CiAJfQogCi0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtOTUsNyArOTEsNyBAQAogCiAJCiAJcHJvdGVjdGVkIEpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKTsKKwkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdEpwYUZhY3RvcnkoKSB7CkBAIC0xMDUsMjMgKzEwMSwzMyBAQAogCXB1YmxpYyB2b2lkIHRlc3RCdWlsZEphdmFUeXBlTWFwcGluZ0Zyb21NYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKIAkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YVR5cGVNYXBwaW5nIGphdmFUeXBlTWFwcGluZyA9IGpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpLmJ1aWxkSmF2YVR5cGVNYXBwaW5nRnJvbU1hcHBpbmdLZXkoSmF2YVRlc3RUeXBlTWFwcGluZy5URVNUX1RZUEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50VHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZU1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhVGVzdFR5cGVNYXBwaW5nKTsKIAkJCi0JCWphdmFUeXBlTWFwcGluZyA9IGpwYVBsYXRmb3JtKCkuYnVpbGRKYXZhVHlwZU1hcHBpbmdGcm9tTWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRUeXBlKCkpOwotCQlhc3NlcnRUcnVlKGphdmFUeXBlTWFwcGluZyBpbnN0YW5jZW9mIFRlc3RKYXZhRW50aXR5KTsJCisJCUphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gbWFwcGluZ0RlZmluaXRpb24gPQorCQkJanBhUGxhdGZvcm0oKS5nZXRKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uKEphdmFUZXN0VHlwZU1hcHBpbmcuVEVTVF9UWVBFX01BUFBJTkdfS0VZKTsKKwkJSmF2YVR5cGVNYXBwaW5nIG1hcHBpbmcgPSAKKwkJCW1hcHBpbmdEZWZpbml0aW9uLmJ1aWxkTWFwcGluZyhnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwganBhUGxhdGZvcm0oKS5nZXRKcGFGYWN0b3J5KCkpOworCQlhc3NlcnRUcnVlKG1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhVGVzdFR5cGVNYXBwaW5nKTsKKwkJCisJCW1hcHBpbmdEZWZpbml0aW9uID0gCisJCQlqcGFQbGF0Zm9ybSgpLmdldEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24oTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOworCQltYXBwaW5nID0gbWFwcGluZ0RlZmluaXRpb24uYnVpbGRNYXBwaW5nKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqcGFQbGF0Zm9ybSgpLmdldEpwYUZhY3RvcnkoKSk7CisJCWFzc2VydFRydWUobWFwcGluZyBpbnN0YW5jZW9mIFRlc3RKYXZhRW50aXR5KTsJCiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RCdWlsZEphdmFBdHRyaWJ1dGVNYXBwaW5nRnJvbU1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY3JlYXRlVGVzdEVudGl0eSgpOwogCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZyA9IGpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpLmJ1aWxkSmF2YUF0dHJpYnV0ZU1hcHBpbmdGcm9tTWFwcGluZ0tleShKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuVEVTVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIikpOwkKLQkJYXNzZXJ0VHJ1ZShqYXZhQXR0cmlidXRlTWFwcGluZyBpbnN0YW5jZW9mIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyk7CiAJCQotCQlqYXZhQXR0cmlidXRlTWFwcGluZyA9IGpwYVBsYXRmb3JtKCkuYnVpbGRKYXZhQXR0cmlidXRlTWFwcGluZ0Zyb21NYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKSk7Ci0JCWFzc2VydFRydWUoamF2YUF0dHJpYnV0ZU1hcHBpbmcgaW5zdGFuY2VvZiBUZXN0SmF2YUJhc2ljTWFwcGluZyk7CisJCUphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBtYXBwaW5nRGVmaW5pdGlvbiA9IAorCQkJanBhUGxhdGZvcm0oKS5nZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IAorCQkJbWFwcGluZ0RlZmluaXRpb24uYnVpbGRNYXBwaW5nKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIiksIGpwYVBsYXRmb3JtKCkuZ2V0SnBhRmFjdG9yeSgpKTsJCisJCWFzc2VydFRydWUobWFwcGluZyBpbnN0YW5jZW9mIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyk7CisJCQorCQltYXBwaW5nRGVmaW5pdGlvbiA9IGpwYVBsYXRmb3JtKCkuZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKAorCQkJCU1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCW1hcHBpbmcgPSBtYXBwaW5nRGVmaW5pdGlvbi5idWlsZE1hcHBpbmcoCisJCQkJCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIiksIGpwYVBsYXRmb3JtKCkuZ2V0SnBhRmFjdG9yeSgpKTsKKwkJYXNzZXJ0VHJ1ZShtYXBwaW5nIGluc3RhbmNlb2YgVGVzdEphdmFCYXNpY01hcHBpbmcpOwogCX0KLQkKIH0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEZhY2V0ZWRQcm9qZWN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RGYWNldGVkUHJvamVjdC5qYXZhCmluZGV4IDQ1MTdmMmIuLjE0NjgyYmEgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEZhY2V0ZWRQcm9qZWN0LmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0RmFjZXRlZFByb2plY3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0yNyw3ICsyNyw3IEBACiAJCiAJcHVibGljIHN0YXRpYyBUZXN0RmFjZXRlZFByb2plY3QgYnVpbGRGYWNldGVkUHJvamVjdChTdHJpbmcgYmFzZVByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkKIAkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0RmFjZXRlZFByb2plY3QodW5pcXVlUHJvamVjdE5hbWUoYmFzZVByb2plY3ROYW1lKSwgYXV0b0J1aWxkKTsKKwkJcmV0dXJuIG5ldyBUZXN0RmFjZXRlZFByb2plY3QoYmFzZVByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwogCX0KIAkKIAkKQEAgLTYyLDggKzYyLDggQEAKIAl9CiAKIAkvKioKLQkgKiBpZiAnY29uZmlnJyBpcyBudWxsLCB0aGUgSlBBIHByb2plY3Qgd2lsbCBiZSBidWlsdCB3aXRoIHRoZSBkZWZhdWx0cwotCSAqIGRlZmluZWQgaW4gSnBhRmFjZXREYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nKQorCSAqIGlmICdjb25maWcnIGlzIG51bGwgKGFuZCAnZmFjZXROYW1lJyBpcyAianB0LmpwYSIpLCB0aGUgSlBBIHByb2plY3Qgd2lsbCBiZSBidWlsdCB3aXRoIHRoZSBkZWZhdWx0cworCSAqIGRlZmluZWQgaW4gSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKIAkgKi8KIAlwdWJsaWMgdm9pZCBpbnN0YWxsRmFjZXQoU3RyaW5nIGZhY2V0TmFtZSwgU3RyaW5nIHZlcnNpb25OYW1lLCBJRGF0YU1vZGVsIGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQl0aGlzLmZhY2V0ZWRQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQodGhpcy5mYWNldFZlcnNpb24oZmFjZXROYW1lLCB2ZXJzaW9uTmFtZSksIGNvbmZpZywgbnVsbCk7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0SmF2YVByb2plY3QuamF2YQppbmRleCBkOWY3N2QzLi4yMzA0YzJlIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEphdmFQcm9qZWN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTgsNyArMTgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKIAogLyoqCiAgKiBUaGlzIGJ1aWxkcyBhbmQgaG9sZHMgYSAiSmF2YSIgcHJvamVjdC4KQEAgLTI3LDYgKzI3LDcgQEAKICAqICJKYXZhIiBwcm9qZWN0cyBhcmVuJ3QgcmVxdWlyZWQgdG8gYmUgImZhY2V0ZWQiIHByb2plY3RzLCBidXQgZm9yIEpQQQogICogdGVzdGluZyB0aGV5IGFyZS4KICAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgVGVzdEphdmFQcm9qZWN0IGV4dGVuZHMgVGVzdEZhY2V0ZWRQcm9qZWN0IHsKIAlwcml2YXRlIGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKIAlwcml2YXRlIGZpbmFsIElQYWNrYWdlRnJhZ21lbnRSb290IHNvdXJjZUZvbGRlcjsKQEAgLTM2LDcgKzM3LDcgQEAKIAkKIAlwdWJsaWMgc3RhdGljIFRlc3RKYXZhUHJvamVjdCBidWlsZEphdmFQcm9qZWN0KFN0cmluZyBiYXNlUHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKQogCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRlc3RKYXZhUHJvamVjdCh1bmlxdWVQcm9qZWN0TmFtZShiYXNlUHJvamVjdE5hbWUpLCBhdXRvQnVpbGQpOworCQlyZXR1cm4gbmV3IFRlc3RKYXZhUHJvamVjdChiYXNlUHJvamVjdE5hbWUsIGF1dG9CdWlsZCk7CiAJfQogCQogCQpAQCAtNTMsMTcgKzU0LDIxIEBACiAJCXRoaXMuc291cmNlRm9sZGVyID0gdGhpcy5qYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHRoaXMuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjIikpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIGFkZEphcihTdHJpbmcgamFyUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgYWRkSmFyKFN0cmluZyBqYXJQYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKIAkJdGhpcy5hZGRDbGFzc3BhdGhFbnRyeShKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobmV3IFBhdGgoamFyUGF0aCksIG51bGwsIG51bGwpKTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgYWRkQ2xhc3NwYXRoRW50cnkoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoQ29sbGVjdGlvblRvb2xzLmFkZCh0aGlzLmphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLCBlbnRyeSksIG51bGwpOworCQl0aGlzLmphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChBcnJheVRvb2xzLmFkZCh0aGlzLmphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLCBlbnRyeSksIG51bGwpOwogCX0KIAkKIAogCS8vICoqKioqKioqKiogcHVibGljIG1ldGhvZHMgKioqKioqKioqKgogCisJcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKKwkJcmV0dXJuIHRoaXMuamF2YVByb2plY3Q7CisJfQorCiAJcHVibGljIElQYWNrYWdlRnJhZ21lbnQgY3JlYXRlUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHRoaXMuc291cmNlRm9sZGVyLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSwgZmFsc2UsIG51bGwpOwkvLyBmYWxzZSA9ICJubyBmb3JjZSIKIAl9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RKcGFQcm9qZWN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RKcGFQcm9qZWN0LmphdmEKaW5kZXggZDk2MjJhNC4uN2Y2ZmFiMiAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0SnBhUHJvamVjdC5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEpwYVByb2plY3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMyw2ICsxMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLlN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogCiAvKioKQEAgLTIyLDE3ICsyMywxOSBAQAogICogVGhlIEpQQSBwcm9qZWN0J3Mgc2V0dGluZ3MgKHBsYXRmb3JtLCBkYXRhYmFzZSBjb25uZWN0aW9uLCBldGMuKSBjYW4gYmUKICAqIGNvbnRyb2xsZWQgYnkgYnVpbGRpbmcgYSBkYXRhIG1vZGVsIGFuZCBwYXNzaW5nIGl0IGludG8gdGhlIGNvbnN0cnVjdG9yLgogICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBUZXN0SnBhUHJvamVjdCBleHRlbmRzIFRlc3RKYXZhUHJvamVjdCB7CiAJcHJpdmF0ZSBmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkgPSAib3JnLmVjbGlwc2UuanB0LmpwYS5qYXIiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkgPSAib3JnLmVjbGlwc2UuanB0LmpwYS5qYXIiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSA9ICJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamFyIjsKIAogCiAJLy8gKioqKioqKioqKiBidWlsZGVycyAqKioqKioqKioqCiAKIAlwdWJsaWMgc3RhdGljIFRlc3RKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChTdHJpbmcgYmFzZVByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCwgSURhdGFNb2RlbCBqcGFDb25maWcpCiAJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdEpwYVByb2plY3QodW5pcXVlUHJvamVjdE5hbWUoYmFzZVByb2plY3ROYW1lKSwgYXV0b0J1aWxkLCBqcGFDb25maWcpOworCQlyZXR1cm4gbmV3IFRlc3RKcGFQcm9qZWN0KGJhc2VQcm9qZWN0TmFtZSwgYXV0b0J1aWxkLCBqcGFDb25maWcpOwogCX0KIAogCXB1YmxpYyBzdGF0aWMgVGVzdEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KFN0cmluZyBiYXNlUHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKQpAQCAtNTIsMTkgKzU1LDMxIEBACiAKIAlwdWJsaWMgVGVzdEpwYVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCwgSURhdGFNb2RlbCBqcGFDb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJc3VwZXIocHJvamVjdE5hbWUsIGF1dG9CdWlsZCk7CisJCVN0cmluZyBqcGFGYWNldFZlcnNpb24gPSBKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzFfMDsKKwkJaWYgKGpwYUNvbmZpZyAhPSBudWxsKSB7CisJCQlqcGFGYWNldFZlcnNpb24gPSBqcGFDb25maWcuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUik7CisJCX0KIAkJdGhpcy5pbnN0YWxsRmFjZXQoImpzdC51dGlsaXR5IiwgIjEuMCIpOwotCQl0aGlzLmluc3RhbGxGYWNldCgianB0LmpwYSIsICIxLjAiLCBqcGFDb25maWcpOwotCQl0aGlzLmFkZEphcih0aGlzLmphck5hbWUoKSk7CisJCXRoaXMuaW5zdGFsbEZhY2V0KEpwdENvcmVQbHVnaW4uRkFDRVRfSUQsIGpwYUZhY2V0VmVyc2lvbiwganBhQ29uZmlnKTsKKwkJdGhpcy5hZGRKYXIoanBhSmFyTmFtZSgpKTsKKwkJaWYgKGVjbGlwc2VMaW5rSmFyTmFtZSgpICE9IG51bGwpIHsKKwkJCXRoaXMuYWRkSmFyKGVjbGlwc2VMaW5rSmFyTmFtZSgpKTsKKwkJfQogCQl0aGlzLmpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGhpcy5nZXRQcm9qZWN0KCkpOworCQl0aGlzLmpwYVByb2plY3Quc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyh0cnVlKTsKIAkJdGhpcy5qcGFQcm9qZWN0LnNldFVwZGF0ZXIobmV3IFN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIodGhpcy5qcGFQcm9qZWN0KSk7CiAJfQogCi0JcHJvdGVjdGVkIFN0cmluZyBqYXJOYW1lKCkgewotCQlTdHJpbmcgamFyTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShKQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpOwotCQlpZiAoamFyTmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibWlzc2luZyBKYXZhIHN5c3RlbSBwcm9wZXJ0eTogXCIiICsgSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZICsgIlwiIik7Ci0JCX0KLQkJcmV0dXJuIGphck5hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcganBhSmFyTmFtZSgpIHsKKwkJcmV0dXJuIGdldFN5c3RlbVByb3BlcnR5KEpQQV9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVjbGlwc2VMaW5rSmFyTmFtZSgpIHsKKwkJcmV0dXJuIGdldFN5c3RlbVByb3BlcnR5KEVDTElQU0VMSU5LX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKwkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwogCX0KIAogCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RQbGF0Zm9ybVByb2plY3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdFBsYXRmb3JtUHJvamVjdC5qYXZhCmluZGV4IDhmNmY1NjIuLmMxOTkwYzkgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdFBsYXRmb3JtUHJvamVjdC5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdFBsYXRmb3JtUHJvamVjdC5qYXZhCkBAIC05LDE5ICs5LDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0czsKIAotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKIAogLyoqCiAgKiBUaGlzIGJ1aWxkcyBhbmQgaG9sZHMgYSAiZ2VuZXJhbCIgRWNsaXBzZSBwcm9qZWN0LgpAQCAtMzEsMTggKzI1LDE0IEBACiAJcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwogCiAJLyoqIGNhcnJpYWdlIHJldHVybiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3RyaW5nVG9vbHMuQ1I7CiAKIAkKIAkvLyAqKioqKioqKioqIGJ1aWxkZXJzICoqKioqKioqKioKIAkKIAlwdWJsaWMgc3RhdGljIFRlc3RQbGF0Zm9ybVByb2plY3QgYnVpbGRQbGF0Zm9ybVByb2plY3QoU3RyaW5nIGJhc2VQcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpCiAJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdFBsYXRmb3JtUHJvamVjdCh1bmlxdWVQcm9qZWN0TmFtZShiYXNlUHJvamVjdE5hbWUpLCBhdXRvQnVpbGQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVQcm9qZWN0TmFtZShTdHJpbmcgYmFzZVByb2plY3ROYW1lKSB7Ci0JCXJldHVybiBiYXNlUHJvamVjdE5hbWUgKyBTdHJpbmcudmFsdWVPZihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkuc3Vic3RyaW5nKDcpOworCQlyZXR1cm4gbmV3IFRlc3RQbGF0Zm9ybVByb2plY3QoYmFzZVByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwogCX0KIAkKIAkKQEAgLTc2LDg4ICs2NiwxNCBAQAogCiAJcHVibGljIHZvaWQgYWRkUHJvamVjdE5hdHVyZShTdHJpbmcgbmF0dXJlSUQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHRoaXMucHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMoQ29sbGVjdGlvblRvb2xzLmFkZChkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKSwgbmF0dXJlSUQpKTsKKwkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKEFycmF5VG9vbHMuYWRkKGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpLCBuYXR1cmVJRCkpOwogCQl0aGlzLnByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwogCX0KIAogCXB1YmxpYyB2b2lkIHJlbW92ZVByb2plY3ROYXR1cmUoU3RyaW5nIG5hdHVyZUlEKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB0aGlzLnByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKSwgbmF0dXJlSUQpKTsKKwkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCksIG5hdHVyZUlEKSk7CiAJCXRoaXMucHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7CiAJfQogCi0JLyoqCi0JICogQ3JlYXRlIGEgZm9sZGVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGRpcmVjdGx5IHVuZGVyIHRoZSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBJRm9sZGVyIGNyZWF0ZUZvbGRlcihTdHJpbmcgZm9sZGVyTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVGb2xkZXIodGhpcy5wcm9qZWN0LCBuZXcgUGF0aChmb2xkZXJOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgZm9sZGVyIGluIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqLwotCXB1YmxpYyBJRm9sZGVyIGNyZWF0ZUZvbGRlcihJQ29udGFpbmVyIGNvbnRhaW5lciwgU3RyaW5nIGZvbGRlck5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlRm9sZGVyKGNvbnRhaW5lciwgbmV3IFBhdGgoZm9sZGVyTmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBmb2xkZXIgaW4gdGhlIHNwZWNpZmllZCBjb250YWluZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGguCi0JICovCi0JcHVibGljIElGb2xkZXIgY3JlYXRlRm9sZGVyKElDb250YWluZXIgY29udGFpbmVyLCBJUGF0aCBmb2xkZXJQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGb2xkZXIgZm9sZGVyID0gY29udGFpbmVyLmdldEZvbGRlcihmb2xkZXJQYXRoKTsKLQkJaWYgKCAhIGZvbGRlci5leGlzdHMoKSkgewotCQkJZm9sZGVyLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7CQkvLyBmYWxzZSA9ICJubyBmb3JjZSI7IHRydWUgPSAibG9jYWwiCi0JCX0KLQkJcmV0dXJuIGZvbGRlcjsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgY29udGVudCBkaXJlY3RseSB1bmRlciB0aGUgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgSUZpbGUgY3JlYXRlRmlsZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUZpbGUodGhpcy5wcm9qZWN0LCBmaWxlTmFtZSwgY29udGVudCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGZpbGUgaW4gdGhlIHNwZWNpZmllZCBjb250YWluZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGNvbnRlbnQuCi0JICovCi0JcHVibGljIElGaWxlIGNyZWF0ZUZpbGUoSUNvbnRhaW5lciBjb250YWluZXIsIFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGNvbnRlbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZUZpbGUoY29udGFpbmVyLCBuZXcgUGF0aChmaWxlTmFtZSksIGNvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGZpbGUgaW4gdGhlIHByb2plY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIFtyZWxhdGl2ZV0gcGF0aAotCSAqIGFuZCBjb250ZW50LgotCSAqLwotCXB1YmxpYyBJRmlsZSBjcmVhdGVGaWxlKElQYXRoIGZpbGVQYXRoLCBTdHJpbmcgY29udGVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVGaWxlKHRoaXMucHJvamVjdCwgZmlsZVBhdGgsIGNvbnRlbnQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBmaWxlIGluIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIHdpdGggdGhlIHNwZWNpZmllZCBwYXRoIGFuZCBjb250ZW50LgotCSAqLwotCXB1YmxpYyBJRmlsZSBjcmVhdGVGaWxlKElDb250YWluZXIgY29udGFpbmVyLCBJUGF0aCBmaWxlUGF0aCwgU3RyaW5nIGNvbnRlbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlRmlsZShjb250YWluZXIsIGZpbGVQYXRoLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudC5nZXRCeXRlcygpKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGZpbGUgaW4gdGhlIHNwZWNpZmllZCBjb250YWluZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGggYW5kIGNvbnRlbnRzLgotCSAqLwotCXB1YmxpYyBJRmlsZSBjcmVhdGVGaWxlKElDb250YWluZXIgY29udGFpbmVyLCBJUGF0aCBmaWxlUGF0aCwgSW5wdXRTdHJlYW0gY29udGVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpbnQgcGF0aENvdW50ID0gZmlsZVBhdGguc2VnbWVudENvdW50KCkgLSAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhDb3VudDsgaSsrKSB7Ci0JCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0Rm9sZGVyKG5ldyBQYXRoKGZpbGVQYXRoLnNlZ21lbnQoaSkpKTsKLQkJCWlmICggISBjb250YWluZXIuZXhpc3RzKCkpIHsKLQkJCQkoKElGb2xkZXIpIGNvbnRhaW5lcikuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwkJLy8gdHJ1ZSA9ICJmb3JjZSI7IHRydWUgPSAibG9jYWwiCi0JCQl9Ci0JCX0KLQotCQlJRmlsZSBmaWxlID0gY29udGFpbmVyLmdldEZpbGUobmV3IFBhdGgoZmlsZVBhdGgubGFzdFNlZ21lbnQoKSkpOwotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJZmlsZS5kZWxldGUodHJ1ZSwgbnVsbCk7CQkvLyB0cnVlID0gImZvcmNlIgotCQl9Ci0JCWZpbGUuY3JlYXRlKGNvbnRlbnQsIHRydWUsIG51bGwpOwkJLy8gdHJ1ZSA9ICJmb3JjZSIKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL0pwdENvcmVSZXNvdXJjZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSnB0Q29yZVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCmluZGV4IGNjYzcwNWEuLjZmYzRkZjMgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSnB0Q29yZVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSnB0Q29yZVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiAKICAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKICAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCiAgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCkBAIC0xMywyMSArMTMsMTUgQEAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlMl8wVGVzdHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5KcHRKYXZhUmVzb3VyY2VUZXN0czsKIAogcHVibGljIGNsYXNzIEpwdENvcmVSZXNvdXJjZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQogewogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIHN1aXRlKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoYm9vbGVhbiBhbGwpIHsKIAkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0SmF2YVJlc291cmNlVGVzdHMuc3VpdGUoYWxsKSk7Ci0JCWlmIChhbGwpIHsKLQkJCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1Nb2RlbFRlc3RzLmNsYXNzKTsKLQkJCXN1aXRlLmFkZFRlc3RTdWl0ZShQZXJzaXN0ZW5jZU1vZGVsVGVzdHMuY2xhc3MpOwotCQl9CisJCXN1aXRlLmFkZFRlc3QoSnB0SmF2YVJlc291cmNlVGVzdHMuc3VpdGUoKSk7CisJCXN1aXRlLmFkZFRlc3QoSmF2YVJlc291cmNlMl8wVGVzdHMuc3VpdGUoKSk7CiAJCXJldHVybiBzdWl0ZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvT3JtTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9Pcm1Nb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjg1ZmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9Pcm1Nb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5Pcm1BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLlByb2plY3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotCi1wdWJsaWMgY2xhc3MgT3JtTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1BST0pFQ1RfTkFNRSA9IE9ybU1vZGVsVGVzdHMuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCQotCVRlc3RKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQkKLQlwdWJsaWMgT3JtTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotCQlqcGFQcm9qZWN0ID0gVGVzdEpwYVByb2plY3QuYnVpbGRKcGFQcm9qZWN0KEJBU0VfUFJPSkVDVF9OQU1FLCBmYWxzZSk7IC8vIGZhbHNlID0gbm8gYXV0by1idWlsZAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlqcGFQcm9qZWN0ID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGVsTG9hZCgpIHsKLQkJT3JtQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IE9ybUFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChhcnRpZmFjdEVkaXQpOwotCQlPcm1SZXNvdXJjZSByZXNvdXJjZSA9IGFydGlmYWN0RWRpdC5nZXRSZXNvdXJjZSgiTUVUQS1JTkYvb3JtLnhtbCIpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGVsTG9hZDIoKSB7Ci0JCU9ybUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBPcm1BcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChqcGFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWFzc2VydE5vdE51bGwoYXJ0aWZhY3RFZGl0KTsKLQkJT3JtUmVzb3VyY2UgcmVzb3VyY2UgPSBhcnRpZmFjdEVkaXQuZ2V0UmVzb3VyY2UoIk1FVEEtSU5GL29ybS54bWwiKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9QZXJzaXN0ZW5jZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvUGVyc2lzdGVuY2VNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwM2RlNmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9QZXJzaXN0ZW5jZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5Qcm9qZWN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1BST0pFQ1RfTkFNRSA9IFBlcnNpc3RlbmNlTW9kZWxUZXN0cy5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0JCi0JVGVzdEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLQkJanBhUHJvamVjdCA9IFRlc3RKcGFQcm9qZWN0LmJ1aWxkSnBhUHJvamVjdChCQVNFX1BST0pFQ1RfTkFNRSwgZmFsc2UpOyAvLyBmYWxzZSA9IG5vIGF1dG8tYnVpbGQKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJanBhUHJvamVjdCA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RlbExvYWQoKSB7Ci0JCVBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IFBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnROb3ROdWxsKGFydGlmYWN0RWRpdCk7Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcmVzb3VyY2UgPSBhcnRpZmFjdEVkaXQuZ2V0UmVzb3VyY2UoIk1FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGVsTG9hZDIoKSB7Ci0JCVBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IFBlcnNpc3RlbmNlQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnROb3ROdWxsKGFydGlmYWN0RWRpdCk7Ci0JCVBlcnNpc3RlbmNlUmVzb3VyY2UgcmVzb3VyY2UgPSBhcnRpZmFjdEVkaXQuZ2V0UmVzb3VyY2UoIk1FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEKaW5kZXggZWIyZWU3OC4uZjM0NjNjMyAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3ICsxMCw2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CkBAIC0xOSw2ICsxOCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAJCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgPSAiTVlfQVNTT0NJQVRJT05fT1ZFUlJJREUiOwpAQCAtMjcsMjYgKzI3LDcgQEAKIAkJc3VwZXIobmFtZSk7CiAJfQogCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBc3NvY2lhdGlvbk92ZXJyaWRlIiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCk7ICIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJCSJTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkJImJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsiICsKLQkJCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJCSJib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsiKTsJCi0JfQotCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC01NCwxMyArMzUsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpIik7CisJCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02OCw3ICs0OCw3IEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiKSwgQEpvaW5Db2x1bW59KSIpOworCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSIpOwogCQkJfQogCQl9KTsKIAl9CkBAIC05NCw3ICs3NCw3IEBACiAKIAkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGb28iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiRm9vXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRm9vXCIpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTEwOCw3ICs4OCw3IEBACiAJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKIAkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSIsIGN1KTsKIAkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlIiwgY3UpOwogCX0KIAkKQEAgLTE2Miw3ICsxNDIsNyBAQAogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7CiAJCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKIAotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE3OCwyMCArMTU4LDIwIEBACiAJCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7CiAJCQogCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMSk7CiAJCWpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKIAogCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMCk7CiAJCWpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpOwogCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKSIsIGN1KTsKIAogCQkKIAkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOwpAQCAtMjE1LDE0ICsxOTUsMTQgQEAKIAkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKIAkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwogCiAJCWFzc29jaWF0aW9uT3ZlcnJpZGUubW92ZUpvaW5Db2x1bW4oMiwgMCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yNDIsMTQgKzIyMiwxNCBAQAogCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOwogCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7CiAKIAkJYXNzb2NpYXRpb25PdmVycmlkZS5tb3ZlSm9pbkNvbHVtbigwLCAyKTsKIAkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDMsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpfSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjY4LDYgKzI0OCw2IEBACiAJCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJmb29cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiZm9vXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXNUZXN0cy5qYXZhCmluZGV4IDI3MDM1NjYuLjlmMTM4NWQgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlc1Rlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCwxNyArMTAsMTkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGVzVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAkKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSA9ICJNWV9BU1NPQ0lBVElPTl9PVkVSUklERSI7CkBAIC0yOCwzNCArMzAsOCBAQAogCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlc1Rlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwogCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQXNzb2NpYXRpb25PdmVycmlkZSIsIAotCQkJIlN0cmluZyBuYW1lKCk7ICIgKwotCQkJIkNvbHVtbiBjb2x1bW4oKTsgIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQXNzb2NpYXRpb25PdmVycmlkZXMiLCAKLQkJCSJBc3NvY2lhdGlvbk92ZXJyaWRlW10gdmFsdWUoKTsiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCQkiU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7IiArCi0JCQkJImJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkJImJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7IiArCi0JCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJCSJTdHJpbmcgdGFibGUoKSBkZWZhdWx0IFwiXCI7Iik7Ci0JCQotCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTYzLDEyICszOSwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpKSIpOworCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSkiKTsKIAkJCX0KIAkJfSk7CiAJfQorCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNzYsMTMgKzUyLDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiksIEBKb2luQ29sdW1ufSkpIik7CisJCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSkiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtOTIsNyArNjcsNyBAQAogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CiAJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CiAJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCJGT09cIiwgam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uPVwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPVwiQkFaXCIpKSIpOworCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSIpOwogCQkJfQogCQl9KTsKIAl9CkBAIC0xMjAsNyArOTUsNyBAQAogCiAJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRm9vIik7CiAJCWFzc2VydEVxdWFscygiRm9vIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCJGb29cIikpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkZvb1wiKSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTM0LDcgKzEwOSw3IEBACiAJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKIAkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSIsIGN1KTsKIAkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlIiwgY3UpOwogCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzIiwgY3UpOwogCX0KQEAgLTE0NSw3ICsxMjAsNyBAQAogCQkKIAkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKIAkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyh7QEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIkZPT1wiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJCQVpcIikpLEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyh7QEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSxAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKIAkJCiAJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKSk7CiAJCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUykpOwpAQCAtMTU4LDEzICsxMzMsMTMgQEAKIAkJCiAJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CiAJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoe0BBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCJGT09cIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSxAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoe0BBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIkJBWlwiKSksQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpfSkiLCBjdSk7CiAJCQogCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwogCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKHtAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiQkFaXCIpLEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCJGT09cIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSwgQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIkJBUlwiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKHtAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJCQVpcIiksQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSwgQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpfSkiLCBjdSk7CiAKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwpAQCAtMTgwLDEwICsxNTUsMTAgQEAKIAkJCiAJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CiAJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoe0BBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCJGT09cIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSxAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoe0BBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIkJBWlwiKSksQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpfSkiLCBjdSk7CiAJCQogCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIkZPT1wiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJCQVpcIikpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yMzYsNyArMjExLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiksQEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjUyLDIwICsyMjcsMjAgQEAKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7CiAJCQogCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMSk7CiAJCWpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7CiAKIAkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDApOwogCQlqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKTsKIAkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4pKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbikpIiwgY3UpOwogCiAJCQogCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUobnVsbCk7CkBAIC0yODgsMTQgKzI2MywxNCBAQAogCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKIAkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKIAkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwogCiAJCWFzc29jaWF0aW9uT3ZlcnJpZGUubW92ZUpvaW5Db2x1bW4oMiwgMCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpfSkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vdmVKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzE1LDEzICsyOTAsMTMgQEAKIAkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKIAkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lPVwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKIAkJYXNzb2NpYXRpb25PdmVycmlkZS5tb3ZlSm9pbkNvbHVtbigwLCAyKTsKIAkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDMsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIil9KSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpfSkpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTM0MCw2ICszMTUsNiBAQAogCQlqb2luQ29sdW1uLnNldE5hbWUoImZvbyIpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cImZvb1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcImZvb1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEKaW5kZXggZTA5YzA2Yi4uYTNhOGM3MCAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVPdmVycmlkZVRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAJCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7CkBAIC0yNiwzMCArMjcsOCBAQAogCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZVRlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwogCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkF0dHJpYnV0ZU92ZXJyaWRlIiwgCi0JCQkiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiQ29sdW1uIGNvbHVtbigpOyAiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJDb2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOyAiICsKLQkJCSJib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOyAiICsKLQkJCSJib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7ICIgKwotCQkJImJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOyAiICsKLQkJCSJTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7ICIgKwotCQkJImludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7ICIgKwotCQkJImludCBzY2FsZSgpIGRlZmF1bHQgMDsiKTsKLQl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oKTsKLQkJY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC01NywxNCArMzYsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlV2l0aENvbHVtbk9uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZUNvbHVtbkFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNzIsNyArNDksNyBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWU9XCIiICsgQ09MVU1OX05BTUUgKyAiXCIpKSIpOworCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCIiICsgQ09MVU1OX05BTUUgKyAiXCIpKSIpOwogCQkJfQogCQl9KTsKIAl9CkBAIC0xMDgsNyArODUsNyBAQAogCiAJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGb29cIikiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTQ1LDExICsxMjIsMTEgQEAKIAkJCiAJCWNvbHVtbi5zZXROYW1lKCJGb28iKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uID0gQENvbHVtbihuYW1lPVwiRm9vXCIpKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIsIGNvbHVtbiA9IEBDb2x1bW4obmFtZSA9IFwiRm9vXCIpKSIsIGN1KTsKIAkJCiAJCWNvbHVtbi5zZXROYW1lKG51bGwpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNTksNiArMTM2LDExIEBACiAJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSk7CiAJCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7CiAJCWFzc2VydE51bGwoY29sdW1uKTsKKwkJCisJCWF0dHJpYnV0ZU92ZXJyaWRlLmFkZENvbHVtbigpOworCQljb2x1bW4gPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKKwkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uID0gQENvbHVtbikiLCBjdSk7CQkKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVzVGVzdHMuamF2YQppbmRleCAxNzEyZDkxLi42ZmYyMzRjIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVzVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVzVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCwxNyArMTAsMTkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVPdmVycmlkZXNUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCQogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwpAQCAtMjksMzYgKzMxLDggQEAKIAlwdWJsaWMgQXR0cmlidXRlT3ZlcnJpZGVzVGVzdHMoU3RyaW5nIG5hbWUpIHsKIAkJc3VwZXIobmFtZSk7CiAJfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBdHRyaWJ1dGVPdmVycmlkZSIsIAotCQkJIlN0cmluZyBuYW1lKCk7ICIgKwotCQkJIkNvbHVtbiBjb2x1bW4oKTsgIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBdHRyaWJ1dGVPdmVycmlkZXMiLCAKLQkJCSJBdHRyaWJ1dGVPdmVycmlkZVtdIHZhbHVlKCk7Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbHVtbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQ29sdW1uIiwgCi0JCQkiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJImJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsgIiArCi0JCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsgIiArCi0JCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyAiICsKLQkJCSJib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsgIiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OyAiICsKLQkJCSJpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAiICsKLQkJCSJpbnQgc2NhbGUoKSBkZWZhdWx0IDA7Iik7Ci0JfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZU9uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02NiwxMyArNDAsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXR0cmlidXRlT3ZlcnJpZGVzKEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiKSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIikpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlV2l0aENvbHVtbk9uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC04MCwxMyArNTMsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXR0cmlidXRlT3ZlcnJpZGVzKEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWU9XCIiICsgQ09MVU1OX05BTUUgKyAiXCIpKSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCIiICsgQ09MVU1OX05BTUUgKyAiXCIpKSkiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC05Niw3ICs2OCw3IEBACiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKIAkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKIAkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIiwgY29sdW1uPUBDb2x1bW4obmFtZT1cIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uPVwiQkFSXCIsIHRhYmxlPVwiQkFaXCIsIHVuaXF1ZT1mYWxzZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgbGVuZ3RoPTEsIHByZWNpc2lvbj0xLCBzY2FsZT0xKSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHRhYmxlID0gXCJCQVpcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEsIHByZWNpc2lvbiA9IDEsIHNjYWxlID0gMSkpIik7CiAJCQl9CiAJCX0pOwogCX0KQEAgLTEzNSw3ICsxMDcsNyBAQAogCiAJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRm9vXCIpKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZvb1wiKSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTc3LDExICsxNDksMTEgQEAKIAkJCiAJCWNvbHVtbi5zZXROYW1lKCJGb28iKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWU9XCJGb29cIikpKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCJGb29cIikpKSIsIGN1KTsKIAkJCiAJCWNvbHVtbi5zZXROYW1lKG51bGwpOwogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkQXR0cmlidXRlT3ZlcnJpZGVDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE5MCw3ICsxNjIsNyBAQAogCQkKIAkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIsIGNvbHVtbiA9IEBDb2x1bW4obmFtZT1cIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgdGFibGUgPSBcIkJBWlwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMSwgcHJlY2lzaW9uID0gMSwgc2NhbGUgPSAxKSksQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHRhYmxlID0gXCJCQVpcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEsIHByZWNpc2lvbiA9IDEsIHNjYWxlID0gMSkpLEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKIAkJCiAJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwogCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKSk7CkBAIC0yMDMsMTMgKzE3NSwxMyBAQAogCQkKIAkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIsIGNvbHVtbiA9IEBDb2x1bW4obmFtZT1cIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgdGFibGUgPSBcIkJBWlwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMSwgcHJlY2lzaW9uID0gMSwgc2NhbGUgPSAxKSksQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHRhYmxlID0gXCJCQVpcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEsIHByZWNpc2lvbiA9IDEsIHNjYWxlID0gMSkpLEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKIAkJCiAJCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFaXCIpLEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIsIGNvbHVtbiA9IEBDb2x1bW4obmFtZT1cIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgdGFibGUgPSBcIkJBWlwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMSwgcHJlY2lzaW9uID0gMSwgc2NhbGUgPSAxKSksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFaXCIpLEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHRhYmxlID0gXCJCQVpcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEsIHByZWNpc2lvbiA9IDEsIHNjYWxlID0gMSkpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpfSkiLCBjdSk7CiAKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwpAQCAtMjI1LDEwICsxOTcsMTAgQEAKIAkJCiAJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZPT1wiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWU9XCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHRhYmxlID0gXCJCQVpcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEsIHByZWNpc2lvbiA9IDEsIHNjYWxlID0gMSkpLEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGNvbHVtbiA9IEBDb2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCB0YWJsZSA9IFwiQkFaXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxLCBwcmVjaXNpb24gPSAxLCBzY2FsZSA9IDEpKSxAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpfSkiLCBjdSk7CiAJCQogCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZPT1wiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWU9XCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHRhYmxlID0gXCJCQVpcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEsIHByZWNpc2lvbiA9IDEsIHNjYWxlID0gMSkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgdGFibGUgPSBcIkJBWlwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMSwgcHJlY2lzaW9uID0gMSwgc2NhbGUgPSAxKSkiLCBjdSk7CiAJfQogCS8vbm90IHN1cmUgaSB3YW50IHRvIHRlc3QgdGhpcyBhcGksIGhvdyBjYW4gd2Uga2VlcCBDb250YWluZXJBbm5vdGF0aW9uLmFkZCwgbW92ZSwgcmVtb3ZlIGZyb20gYmVpbmcgcHVibGljPwogCS8vdXNlcnMgc2hvdWxkIGdvIHRocm91Z2h0IEFic3RyYWN0SmF2YXBlcnNpc3RlbmNlUmVzb3VyY2UuIHRoaXMgZ2V0cyBjb25mdXNpbmcgYmVjYXVzZSB5b3Ugd291bGQgaGFuZGxlIGl0IGRpZmZlcmVudGx5CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQmFzaWNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Jhc2ljVGVzdHMuamF2YQppbmRleCA2MDhjNmVmLi44NGU4ZmE0IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQmFzaWNUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9CYXNpY1Rlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIEJhc2ljVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAkKIAlwdWJsaWMgQmFzaWNUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtMjUsNyArMjYsNiBAQAogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFzaWMiLCAiYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsiKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMzksNyArMzksNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEJhc2ljV2l0aE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhc2ljIiwgImJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTQ3LDE0ICs0NiwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyhvcHRpb25hbD10cnVlKSIpOworCQkJCXNiLmFwcGVuZCgiQEJhc2ljKG9wdGlvbmFsID0gdHJ1ZSkiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QmFzaWNXaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFzaWMiLCAiYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBGZXRjaFR5cGUuRUFHRVI7Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkZldGNoVHlwZSIsICJFQUdFUiwgTEFaWSIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02Miw3ICs1OSw3IEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljKGZldGNoPUZldGNoVHlwZS5FQUdFUikiKTsKKwkJCQlzYi5hcHBlbmQoIkBCYXNpYyhmZXRjaCA9IEZldGNoVHlwZS5FQUdFUikiKTsKIAkJCX0KIAkJfSk7CiAJfQpAQCAtNzIsNyArNjksNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpOworCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7CiAJCWFzc2VydE5vdE51bGwoYmFzaWMpOwogCX0KIApAQCAtODEsOCArNzgsOCBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCWFzc2VydFRydWUoYmFzaWMuZ2V0T3B0aW9uYWwoKSk7CisJCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkJBU0lDKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWMuZ2V0T3B0aW9uYWwoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC05MCwxMyArODcsMTMgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQlhc3NlcnRUcnVlKGJhc2ljLmdldE9wdGlvbmFsKCkpOworCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljLmdldE9wdGlvbmFsKCkpOwogCQkKLQkJYmFzaWMuc2V0T3B0aW9uYWwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShiYXNpYy5nZXRPcHRpb25hbCgpKTsKKwkJYmFzaWMuc2V0T3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpYy5nZXRPcHRpb25hbCgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQmFzaWMob3B0aW9uYWw9ZmFsc2UpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEJhc2ljKG9wdGlvbmFsID0gZmFsc2UpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWxOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xMDQsOCArMTAxLDggQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQlhc3NlcnRUcnVlKGJhc2ljLmdldE9wdGlvbmFsKCkpOworCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljLmdldE9wdGlvbmFsKCkpOwogCQkKIAkJYmFzaWMuc2V0T3B0aW9uYWwobnVsbCk7CiAJCWFzc2VydE51bGwoYmFzaWMuZ2V0T3B0aW9uYWwoKSk7CkBAIC0xMTksNyArMTE2LDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpOworCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIGJhc2ljLmdldEZldGNoKCkpOwogCX0KIApAQCAtMTI4LDEzICsxMjUsMTMgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpOworCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIGJhc2ljLmdldEZldGNoKCkpOwogCQkKIAkJYmFzaWMuc2V0RmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwogCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGJhc2ljLmdldEZldGNoKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBCYXNpYyhmZXRjaD1MQVpZKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBCYXNpYyhmZXRjaCA9IExBWlkpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2hOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNDIsNyArMTM5LDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpOworCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIGJhc2ljLmdldEZldGNoKCkpOwogCQkKIAkJYmFzaWMuc2V0RmV0Y2gobnVsbCk7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db2x1bW5UZXN0cy5qYXZhCmluZGV4IGE4MTJkODQuLjUwNTJiMGUgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db2x1bW5UZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db2x1bW5UZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE3LDYgKzE3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBDb2x1bW5UZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCQogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwpAQCAtMjcsMjIgKzI4LDcgQEAKIAkJc3VwZXIobmFtZSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbHVtbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQ29sdW1uIiwgCi0JCQkiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJImJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsgIiArCi0JCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsgIiArCi0JCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyAiICsKLQkJCSJib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsgIiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OyAiICsKLQkJCSJpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAiICsKLQkJCSJpbnQgc2NhbGUoKSBkZWZhdWx0IDA7Iik7Ci0JfQotCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC01Niw3ICs0Miw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02NCwxMyArNDksMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKG5hbWU9XCIiICsgQ09MVU1OX05BTUUgKyAiXCIpIik7CisJCQkJc2IuYXBwZW5kKCJAQ29sdW1uKG5hbWUgPSBcIiIgKyBDT0xVTU5fTkFNRSArICJcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uV2l0aFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNvbHVtbkFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNzgsMTMgKzYyLDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbih0YWJsZT1cIiIgKyBDT0xVTU5fVEFCTEUgKyAiXCIpIik7CisJCQkJc2IuYXBwZW5kKCJAQ29sdW1uKHRhYmxlID0gXCIiICsgQ09MVU1OX1RBQkxFICsgIlwiKSIpOwogCQkJfQogCQl9KTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTkyLDEzICs3NSwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4oY29sdW1uRGVmaW5pdGlvbj1cIiIgKyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gKyAiXCIpIik7CisJCQkJc2IuYXBwZW5kKCJAQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIiIgKyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gKyAiXCIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbldpdGhCb29sZWFuRWxlbWVudChmaW5hbCBTdHJpbmcgYm9vbGVhbkVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDb2x1bW5Bbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTEwNiwxMyArODgsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKCIgKyBib29sZWFuRWxlbWVudCArICI9dHJ1ZSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBDb2x1bW4oIiArIGJvb2xlYW5FbGVtZW50ICsgIiA9IHRydWUpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbldpdGhJbnRFbGVtZW50KGZpbmFsIFN0cmluZyBpbnRFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ29sdW1uQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMjAsNyArMTAxLDcgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKCIgKyBpbnRFbGVtZW50ICsgIj01KSIpOworCQkJCXNiLmFwcGVuZCgiQENvbHVtbigiICsgaW50RWxlbWVudCArICIgPSA1KSIpOwogCQkJfQogCQl9KTsKIAl9CkBAIC0xNjEsNyArMTQyLDcgQEAKIAkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4obmFtZT1cIkZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4obmFtZSA9IFwiRm9vXCIpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE5OCw3ICsxNzksNyBAQAogCQljb2x1bW4uc2V0VGFibGUoIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRUYWJsZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKHRhYmxlPVwiRm9vXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbih0YWJsZSA9IFwiRm9vXCIpIiwgY3UpOwogCiAJCQogCQljb2x1bW4uc2V0VGFibGUobnVsbCk7CkBAIC0yMjUsNyArMjA2LDcgQEAKIAkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4oY29sdW1uRGVmaW5pdGlvbj1cIkZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiRm9vXCIpIiwgY3UpOwogCiAJCQogCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKQEAgLTI1Myw3ICsyMzQsNyBAQAogCQljb2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFVuaXF1ZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKHVuaXF1ZT1mYWxzZSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKHVuaXF1ZSA9IGZhbHNlKSIsIGN1KTsKIAkJCiAJCWNvbHVtbi5zZXRVbmlxdWUobnVsbCk7CiAJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sdW1uIiwgY3UpOwpAQCAtMjgwLDcgKzI2MSw3IEBACiAJCWNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKG51bGxhYmxlPWZhbHNlKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4obnVsbGFibGUgPSBmYWxzZSkiLCBjdSk7CiAJCQogCQljb2x1bW4uc2V0TnVsbGFibGUobnVsbCk7CiAJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sdW1uIiwgY3UpOwpAQCAtMzA3LDcgKzI4OCw3IEBACiAJCWNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldEluc2VydGFibGUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbihpbnNlcnRhYmxlPWZhbHNlKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4oaW5zZXJ0YWJsZSA9IGZhbHNlKSIsIGN1KTsKIAkJCiAJCWNvbHVtbi5zZXRJbnNlcnRhYmxlKG51bGwpOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENvbHVtbiIsIGN1KTsKQEAgLTMzNCw3ICszMTUsNyBAQAogCQljb2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKHVwZGF0YWJsZT1mYWxzZSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKHVwZGF0YWJsZSA9IGZhbHNlKSIsIGN1KTsKIAkJCiAJCWNvbHVtbi5zZXRVcGRhdGFibGUobnVsbCk7CiAJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sdW1uIiwgY3UpOwpAQCAtMzYxLDcgKzM0Miw3IEBACiAJCWNvbHVtbi5zZXRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKIAkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY29sdW1uLmdldExlbmd0aCgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKGxlbmd0aD01KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4obGVuZ3RoID0gNSkiLCBjdSk7CiAJCQogCQljb2x1bW4uc2V0TGVuZ3RoKG51bGwpOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENvbHVtbiIsIGN1KTsKQEAgLTM4OCw3ICszNjksNyBAQAogCQljb2x1bW4uc2V0UHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig1KSk7CiAJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRQcmVjaXNpb24oKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbihwcmVjaXNpb249NSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKHByZWNpc2lvbiA9IDUpIiwgY3UpOwogCQkKIAkJY29sdW1uLnNldFByZWNpc2lvbihudWxsKTsKIAkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDb2x1bW4iLCBjdSk7CkBAIC00MTUsNyArMzk2LDcgQEAKIAkJY29sdW1uLnNldFNjYWxlKEludGVnZXIudmFsdWVPZig1KSk7CiAJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRTY2FsZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKHNjYWxlPTUpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbihzY2FsZSA9IDUpIiwgY3UpOwogCQkKIAkJY29sdW1uLnNldFNjYWxlKG51bGwpOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENvbHVtbiIsIGN1KTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YQppbmRleCA4YWEzMWE1Li4zOGU0N2U4IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE3LDYgKzE3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBEaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAkKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKQEAgLTI1LDE4ICsyNiw4IEBACiAJcHVibGljIERpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewogCQlzdXBlcihuYW1lKTsKIAl9Ci0JCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJEaXNjcmltaW5hdG9yVHlwZSIsICJTVFJJTkcsIENIQVIsIElOVEVHRVIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRGlzY3JpbWluYXRvckNvbHVtbiIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIkRUWVBFXCI7ICIgKwotCQkJIkRpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKCkgZGVmYXVsdCBTVFJJTkc7ICIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsiKTsKLQl9Ci0KKwkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNTAsNyArNDEsNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW5XaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC01OCwxMyArNDgsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARGlzY3JpbWluYXRvckNvbHVtbihuYW1lPVwiIiArIENPTFVNTl9OQU1FICsgIlwiKSIpOworCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZSA9IFwiIiArIENPTFVNTl9OQU1FICsgIlwiKSIpOwogCQkJfQogCQl9KTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3REaXNjcmltaW5hdG9yQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNzIsMTMgKzYxLDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JDb2x1bW4oY29sdW1uRGVmaW5pdGlvbj1cIiIgKyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gKyAiXCIpIik7CisJCQkJc2IuYXBwZW5kKCJARGlzY3JpbWluYXRvckNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCIiICsgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OICsgIlwiKSIpOwogCQkJfQogCQl9KTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3REaXNjcmltaW5hdG9yQ29sdW1uV2l0aERpc2NyaW1pbmF0b3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTg2LDEzICs3NCwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBEaXNjcmltaW5hdG9yQ29sdW1uKGRpc2NyaW1pbmF0b3JUeXBlPURpc2NyaW1pbmF0b3JUeXBlLkNIQVIpIik7CisJCQkJc2IuYXBwZW5kKCJARGlzY3JpbWluYXRvckNvbHVtbihkaXNjcmltaW5hdG9yVHlwZSA9IERpc2NyaW1pbmF0b3JUeXBlLkNIQVIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbldpdGhJbnRFbGVtZW50KGZpbmFsIFN0cmluZyBpbnRFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTAwLDcgKzg3LDcgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARGlzY3JpbWluYXRvckNvbHVtbigiICsgaW50RWxlbWVudCArICI9NSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBEaXNjcmltaW5hdG9yQ29sdW1uKCIgKyBpbnRFbGVtZW50ICsgIiA9IDUpIik7CiAJCQl9CiAJCX0pOwogCX0KQEAgLTEzNCw3ICsxMjEsNyBAQAogCQljb2x1bW4uc2V0TmFtZSgiRm9vIik7CiAJCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldE5hbWUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT1cIkZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBEaXNjcmltaW5hdG9yQ29sdW1uKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNjgsNyArMTU1LDcgQEAKIAkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBEaXNjcmltaW5hdG9yQ29sdW1uKGNvbHVtbkRlZmluaXRpb249XCJGb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARGlzY3JpbWluYXRvckNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCJGb29cIikiLCBjdSk7CiAKIAkJCiAJCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwpAQCAtMTk0LDcgKzE4MSw3IEBACiAJCWNvbHVtbi5zZXRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKIAkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY29sdW1uLmdldExlbmd0aCgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARGlzY3JpbWluYXRvckNvbHVtbihsZW5ndGg9NSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARGlzY3JpbWluYXRvckNvbHVtbihsZW5ndGggPSA1KSIsIGN1KTsKIAkJCiAJCWNvbHVtbi5zZXRMZW5ndGgobnVsbCk7CiAJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARGlzY3JpbWluYXRvckNvbHVtbiIsIGN1KTsKQEAgLTIxNyw3ICsyMDQsNyBAQAogCQljb2x1bW4uc2V0RGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUik7CiAJCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSLCBjb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQERpc2NyaW1pbmF0b3JDb2x1bW4oZGlzY3JpbWluYXRvclR5cGU9SU5URUdFUikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARGlzY3JpbWluYXRvckNvbHVtbihkaXNjcmltaW5hdG9yVHlwZSA9IElOVEVHRVIpIiwgY3UpOwogCQkKIAkJY29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQERpc2NyaW1pbmF0b3JDb2x1bW4iLCBjdSk7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclZhbHVlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yVmFsdWVUZXN0cy5qYXZhCmluZGV4IGRiMzg2YjQuLjU0Mjk2MWMgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yVmFsdWVUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yVmFsdWVUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE2LDYgKzE2LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBEaXNjcmltaW5hdG9yVmFsdWVUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCiAJcHVibGljIERpc2NyaW1pbmF0b3JWYWx1ZVRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0yMyw3ICsyNCw2IEBACiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3REaXNjcmltaW5hdG9yVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRGlzY3JpbWluYXRvclZhbHVlIiwgIlN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgXCJcIjsiKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMzcsNyArMzcsNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JWYWx1ZVdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJEaXNjcmltaW5hdG9yVmFsdWUiLCAiU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCBcIlwiOyIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC00NSw3ICs0NCw3IEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JWYWx1ZSh2YWx1ZT1cImRpc2NyaW1pbmF0b3JcIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBEaXNjcmltaW5hdG9yVmFsdWUodmFsdWUgPSBcImRpc2NyaW1pbmF0b3JcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGFibGVUZXN0cy5qYXZhCmluZGV4IGY0YWI4NTMuLmUxYjY5YTAgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRhYmxlVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZVRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIEVtYmVkZGFibGVUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCiAJcHVibGljIEVtYmVkZGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtMjUsNyArMjYsNiBAQAogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRhYmxlIiwgIiIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0zOSw4ICszOSw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFuZEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRhYmxlIiwgIiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiIik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTU4LDcgKzU2LDcgQEAKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCQotCQlKYXZhUmVzb3VyY2VOb2RlIG1hcHBpbmdBbm5vdGF0aW9uID0gdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgRW1iZWRkYWJsZUFubm90YXRpb24pOwogCX0KIAkKQEAgLTY2LDEwICs2NCwxMCBAQAogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW1iZWRkYWJsZUFuZEVudGl0eSgpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJCi0JCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSB0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydFRydWUobWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBFbWJlZGRhYmxlQW5ub3RhdGlvbik7CiAJCQotCQlFbnRpdHlBbm5vdGF0aW9uIGVudGl0eSA9IChFbnRpdHlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkVOVElUWSk7CisJCUVudGl0eUFubm90YXRpb24gZW50aXR5ID0gKEVudGl0eUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwogCQlhc3NlcnROb3ROdWxsKGVudGl0eSk7CiAJfQogCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJZFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJZFRlc3RzLmphdmEKaW5kZXggYzViOTAzMy4uYmNkODg0ZCAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkSWRUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZElkVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xMCw3ICsxMCw2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CkBAIC0xOSw2ICsxOCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgRW1iZWRkZWRJZFRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAKIAlwdWJsaWMgRW1iZWRkZWRJZFRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0yNiw3ICsyNiw2IEBACiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVtYmVkZGVkSWQiLCAiIik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTQ0LDcgKzQzLDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydFRydWUobWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBFbWJlZGRlZElkQW5ub3RhdGlvbik7CiAJfQogCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkVGVzdHMuamF2YQppbmRleCBkYjkyMmU0Li45ODExN2NhIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZFRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKQEAgLTE5LDYgKzE4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBFbWJlZGRlZFRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAKIAlwdWJsaWMgRW1iZWRkZWRUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtMjYsNyArMjYsNiBAQAogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW1iZWRkZWQiLCAiIik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTQ0LDcgKzQzLDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgRW1iZWRkZWRBbm5vdGF0aW9uKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudGl0eVRlc3RzLmphdmEKaW5kZXggYjJmY2M2OS4uYTk1OGNiZSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudGl0eVRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudGl0eVRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CkBAIC0xOSw2ICsxOCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgRW50aXR5VGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfTkFNRSA9ICJGb28iOwpAQCAtMjgsNyArMjgsNiBAQAogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpOyIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC00Miw3ICs0MSw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCk7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTUwLDE0ICs0OCwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkobmFtZT1cIiIgKyBFTlRJVFlfTkFNRSArICJcIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkobmFtZSA9IFwiIiArIEVOVElUWV9OQU1FICsgIlwiKSIpOwogCQkJfQogCQl9KTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQW5kRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hcHBlZFN1cGVyY2xhc3MiLCAiIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpOyIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC03NSw3ICs3MSw3IEBACiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJCi0JCUVudGl0eUFubm90YXRpb24gZW50aXR5ID0gKEVudGl0eUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuRU5USVRZKTsKKwkJRW50aXR5QW5ub3RhdGlvbiBlbnRpdHkgPSAoRW50aXR5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkVOVElUWSk7CiAJCWFzc2VydFRydWUoZW50aXR5ICE9IG51bGwpOwogCQlhc3NlcnRFcXVhbHMoRU5USVRZX05BTUUsIGVudGl0eS5nZXROYW1lKCkpOwogCX0KQEAgLTg0LDcgKzgwLDcgQEAKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJCi0JCUVudGl0eUFubm90YXRpb24gZW50aXR5ID0gKEVudGl0eUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuRU5USVRZKTsKKwkJRW50aXR5QW5ub3RhdGlvbiBlbnRpdHkgPSAoRW50aXR5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkVOVElUWSk7CiAJCWFzc2VydFRydWUoZW50aXR5ICE9IG51bGwpOwogCQlhc3NlcnROdWxsKGVudGl0eS5nZXROYW1lKCkpOwogCX0KQEAgLTkzLDM2ICs4OSwzNiBAQAogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQkKLQkJRW50aXR5QW5ub3RhdGlvbiBlbnRpdHkgPSAoRW50aXR5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOworCQlFbnRpdHlBbm5vdGF0aW9uIGVudGl0eSA9IChFbnRpdHlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRU5USVRZKTsKIAkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0TmFtZSgpKTsKIAkJZW50aXR5LnNldE5hbWUoIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGVudGl0eS5nZXROYW1lKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFbnRpdHkobmFtZT1cIkZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFbnRpdHkobmFtZSA9IFwiRm9vXCIpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lKCk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQkKLQkJRW50aXR5QW5ub3RhdGlvbiBlbnRpdHkgPSAoRW50aXR5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOworCQlFbnRpdHlBbm5vdGF0aW9uIGVudGl0eSA9IChFbnRpdHlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRU5USVRZKTsKIAkJYXNzZXJ0RXF1YWxzKEVOVElUWV9OQU1FLCBlbnRpdHkuZ2V0TmFtZSgpKTsKIAkJCiAJCWVudGl0eS5zZXROYW1lKG51bGwpOwogCQlhc3NlcnROdWxsKGVudGl0eS5nZXROYW1lKCkpOwogCQkKIAkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFbnRpdHkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARW50aXR5KG5hbWU9XCJGb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARW50aXR5KG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1hcHBlZFN1cGVyY2xhc3NBbmRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NBbmRFbnRpdHkoKTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCQotCQlKYXZhUmVzb3VyY2VOb2RlIG1hcHBpbmdBbm5vdGF0aW9uID0gdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydFRydWUobWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBFbnRpdHlBbm5vdGF0aW9uKTsKIAkJCi0JCU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOworCQlNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbiBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwogCQlhc3NlcnROb3ROdWxsKG1hcHBlZFN1cGVyY2xhc3MpOwogCX0KIApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRUZXN0cy5qYXZhCmluZGV4IGNkN2RkMWUuLmExN2JmNjQgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnVtZXJhdGVkVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW51bWVyYXRlZFRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIEVudW1lcmF0ZWRUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCiAJcHVibGljIEVudW1lcmF0ZWRUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtMjUsOCArMjYsNiBAQAogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnVtZXJhdGVkIiwgIkVudW1UeXBlIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkVudW1UeXBlIiwgIk9SRElOQUwsIFNUUklORyIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC00MCw4ICszOSw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW51bWVyYXRlZFdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnVtZXJhdGVkIiwgIkVudW1UeXBlIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkVudW1UeXBlIiwgIk9SRElOQUwsIFNUUklORyIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC04NSw3ICs4Miw4IEBACiAJCQogCQllbnVtZXJhdGVkLnNldFZhbHVlKG51bGwpOwogCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBFbnVtZXJhdGVkIiwgY3UpOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEVudW1lcmF0ZWQoIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVudW1lcmF0ZWQiLCBjdSk7CiAJfQogCiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkVmFsdWVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0dlbmVyYXRlZFZhbHVlVGVzdHMuamF2YQppbmRleCA3NDIwY2RkLi5lMzJjMGQwIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkVmFsdWVUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9HZW5lcmF0ZWRWYWx1ZVRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTgsMjQgKzE4LDE1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgR2VuZXJhdGVkVmFsdWVUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRPUiA9ICJNWV9HRU5FUkFUT1IiOwogCXB1YmxpYyBHZW5lcmF0ZWRWYWx1ZVRlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwogCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVHZW5lcmF0aW9uVHlwZUVudW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiR2VuZXJhdGlvblR5cGUiLCAiVEFCTEUsIFNFUVVFTkNFLCBJREVOVElUWSwgQVVUTzsiKTsJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiR2VuZXJhdGVkVmFsdWUiLCAiR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IEFVVE87IFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0IFwiXCIiKTsKLQkJY3JlYXRlR2VuZXJhdGlvblR5cGVFbnVtKCk7Ci0JfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0R2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTQ5LDcgKzQwLDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RHZW5lcmF0ZWRWYWx1ZVdpdGhHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTU3LDEzICs0NywxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBHZW5lcmF0ZWRWYWx1ZShnZW5lcmF0b3I9XCIiICsgR0VORVJBVE9SICsgIlwiKSIpOworCQkJCXNiLmFwcGVuZCgiQEdlbmVyYXRlZFZhbHVlKGdlbmVyYXRvciA9IFwiIiArIEdFTkVSQVRPUiArICJcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0R2VuZXJhdGVkVmFsdWVXaXRoU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTcxLDcgKzYwLDcgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3k9R2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UpIik7CisJCQkJc2IuYXBwZW5kKCJAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3kgPSBHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSkiKTsKIAkJCX0KIAkJfSk7CiAJfQpAQCAtMTA1LDcgKzk0LDcgQEAKIAkJZ2VuZXJhdGVkVmFsdWUuc2V0R2VuZXJhdG9yKCJmb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEdlbmVyYXRlZFZhbHVlKGdlbmVyYXRvcj1cImZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBHZW5lcmF0ZWRWYWx1ZShnZW5lcmF0b3IgPSBcImZvb1wiKSIsIGN1KTsKIAkJCiAJCWdlbmVyYXRlZFZhbHVlLnNldEdlbmVyYXRvcihudWxsKTsKIAkJYXNzZXJ0TnVsbChnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSk7CkBAIC0xMzQsNyArMTIzLDcgQEAKIAkJZ2VuZXJhdGVkVmFsdWUuc2V0U3RyYXRlZ3koR2VuZXJhdGlvblR5cGUuVEFCTEUpOwogCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGlvblR5cGUuVEFCTEUsIGdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT1UQUJMRSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3kgPSBUQUJMRSkiLCBjdSk7CiAJCQogCQlnZW5lcmF0ZWRWYWx1ZS5zZXRTdHJhdGVneShudWxsKTsKIAkJYXNzZXJ0TnVsbChnZW5lcmF0ZWRWYWx1ZS5nZXRTdHJhdGVneSgpKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZENsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZENsYXNzVGVzdHMuamF2YQppbmRleCBkODhmNDNiLi5hZjAwNzk3IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRDbGFzc1Rlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkQ2xhc3NUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE2LDYgKzE2LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBJZENsYXNzVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9DTEFTU19WQUxVRSA9ICJNeUNsYXNzIjsKQEAgLTIzLDEzICsyNCw4IEBACiAJcHVibGljIElkQ2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewogCQlzdXBlcihuYW1lKTsKIAl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRDbGFzc0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWRDbGFzcyIsICJDbGFzcyB2YWx1ZSgpOyIpOwotCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdElkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSWRDbGFzc0Fubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNDMsNyArMzksNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdElkQ2xhc3NXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSWRDbGFzc0Fubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtOTksMTIgKzk0LDEyIEBACiAKIAkJSWRDbGFzc0Fubm90YXRpb24gaWRDbGFzcyA9IChJZENsYXNzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLklEX0NMQVNTKTsKIAkJYXNzZXJ0Tm90TnVsbChpZENsYXNzLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk15Q2xhc3MiLCBpZENsYXNzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3MoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKKwkJYXNzZXJ0RXF1YWxzKCJNeUNsYXNzIiwgaWRDbGFzcy5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpKTsgLy9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwogCiAKIAkJaWRDbGFzcy5zZXRWYWx1ZShUWVBFX05BTUUpOwogCQkJCQotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgaWRDbGFzcy5nZXRGdWxseVF1YWxpZmllZENsYXNzKCkpOwkJCQkKKwkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIGlkQ2xhc3MuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSk7CQkJCQogCQlhc3NlcnRTb3VyY2VDb250YWlucygiQElkQ2xhc3MoIiArIFRZUEVfTkFNRSArICIuY2xhc3MpIiwgY3UpOwogCX0KIApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZFRlc3RzLmphdmEKaW5kZXggNzIxNDU0ZC4uOWRkM2M0MSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBJZFRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAKIAlwdWJsaWMgSWRUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtMjUsNyArMjYsNiBAQAogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0SWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSWQiLCAiIik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTQzLDcgKzQzLDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgSWRBbm5vdGF0aW9uKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VUZXN0cy5qYXZhCmluZGV4IGEyMDU4ZTYuLmE0MDc3MGMgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZVRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0luaGVyaXRhbmNlVGVzdHMuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIEluaGVyaXRhbmNlVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAogCXB1YmxpYyBJbmhlcml0YW5jZVRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0yNCw4ICsyNSw2IEBACiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJbmhlcml0YW5jZSIsICJJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IFNJTkdMRV9UQUJMRTsiKTsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiSW5oZXJpdGFuY2VUeXBlIiwgIlNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1MiKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMzksOCArMzgsNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEluaGVyaXRhbmNlV2l0aFN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkluaGVyaXRhbmNlIiwgIkluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJJbmhlcml0YW5jZVR5cGUiLCAiU0lOR0xFX1RBQkxFLCBKT0lORUQsIFRBQkxFX1BFUl9DTEFTUyIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC00OCw3ICs0NSw3IEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5KT0lORUQpIik7CisJCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3kgPSBJbmhlcml0YW5jZVR5cGUuSk9JTkVEKSIpOwogCQkJfQogCQl9KTsKIAl9CkBAIC03Niw3ICs3Myw3IEBACiAJCUluaGVyaXRhbmNlQW5ub3RhdGlvbiBpbmhlcml0YW5jZSA9IChJbmhlcml0YW5jZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5JTkhFUklUQU5DRSk7CiAJCWluaGVyaXRhbmNlLnNldFN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBJbmhlcml0YW5jZShzdHJhdGVneT1UQUJMRV9QRVJfQ0xBU1MpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEluaGVyaXRhbmNlKHN0cmF0ZWd5ID0gVEFCTEVfUEVSX0NMQVNTKSIsIGN1KTsKIAkJCiAJCWluaGVyaXRhbmNlLnNldFN0cmF0ZWd5KG51bGwpOwogCQkKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KUFRUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSlBUVG9vbHNUZXN0cy5qYXZhCmluZGV4IDRkZjBhODcuLjJhMWU3ODYgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KUFRUb29sc1Rlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pQVFRvb2xzVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDE2ICs5LDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwogCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JTWV0aG9kQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVZhcmlhYmxlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KUFRUb29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5GaWVsZEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZXRob2RBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSlBUVG9vbHNUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCiAJcHVibGljIEpQVFRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTExMCwyNyArMTEwLDI3IEBACiAJCX0pOwogCX0KIAkKLS8vCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZUludmFsaWRNZXRob2RSZXR1cm5UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotLy8JCQkKLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0vLwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigiY29tLmZvby5Gb28iKTsKLS8vCQkJfQotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVmZmVyIHNiKSB7Ci0vLwkJCQlzYi5hcHBlbmQoQ1IpOwotLy8JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIEZvbyBnZXRGb28oKSB7IikuYXBwZW5kKENSKTsKLS8vCQkJCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gbnVsbDsiKS5hcHBlbmQoQ1IpOwotLy8JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0vLwkJCQlzYi5hcHBlbmQoQ1IpOwotLy8JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIHZvaWQgc2V0Rm9vKEZvbyBpZCkgeyIpLmFwcGVuZChDUik7Ci0vLwkJCQlzYi5hcHBlbmQoIiAgICAgICAgdGhpcy5pZCA9IGlkOyIpLmFwcGVuZChDUik7Ci0vLwkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLS8vCQkJCXNiLmFwcGVuZChDUik7Ci0vLwkJCX0KLS8vCQl9KTsKLS8vCX0KKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVJbnZhbGlkTWV0aG9kUmV0dXJuVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigiY29tLmZvby5Gb28iKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIEZvbyBnZXRGb28oKSB7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIG51bGw7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIHNldEZvbyhGb28gaWQpIHsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgICAgICB0aGlzLmlkID0gaWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVJc01ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CkBAIC0yMzEsMTU3ICsyMzEsMTM0IEBACiAJcHVibGljIHZvaWQgdGVzdEZpZWxkSXNQZXJzaXN0YWJsZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlRmllbGRXaXRoTW9kaWZpZXIoInByaXZhdGUiKTsKIAkJRmllbGRBdHRyaWJ1dGUgZmllbGRBdHRyaWJ1dGUgPSBmb29GaWVsZChjdSk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gZmllbGRBdHRyaWJ1dGUuZ2V0QmluZGluZyhKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0VHJ1ZShKUFRUb29scy5maWVsZElzUGVyc2lzdGFibGUodmFyaWFibGVCaW5kaW5nKSk7CisJCWFzc2VydFRydWUoZmllbGRBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKIAl9CiAJCiAJLy9wcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9vOyAtIG5vdCBwZXJzaXN0YWJsZQogCXB1YmxpYyB2b2lkIHRlc3RGaWVsZElzUGVyc2lzdGFibGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUZpZWxkV2l0aE1vZGlmaWVyKCJwcml2YXRlIHN0YXRpYyIpOwogCQlGaWVsZEF0dHJpYnV0ZSBmaWVsZEF0dHJpYnV0ZSA9IGZvb0ZpZWxkKGN1KTsKLQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSBmaWVsZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy5maWVsZElzUGVyc2lzdGFibGUodmFyaWFibGVCaW5kaW5nKSk7CisJCWFzc2VydEZhbHNlKGZpZWxkQXR0cmlidXRlLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7CiAJfQogCQogCS8vcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIGZvbzsgLSBub3QgcGVyc2lzdGFibGUKIAlwdWJsaWMgdm9pZCB0ZXN0RmllbGRJc1BlcnNpc3RhYmxlMygpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVGaWVsZFdpdGhNb2RpZmllcigicHJpdmF0ZSB0cmFuc2llbnQiKTsKIAkJRmllbGRBdHRyaWJ1dGUgZmllbGRBdHRyaWJ1dGUgPSBmb29GaWVsZChjdSk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gZmllbGRBdHRyaWJ1dGUuZ2V0QmluZGluZyhKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMuZmllbGRJc1BlcnNpc3RhYmxlKHZhcmlhYmxlQmluZGluZykpOworCQlhc3NlcnRGYWxzZShmaWVsZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwogCX0KIAkKIAkvL3ByaXZhdGUgZmluYWwgU3RyaW5nIGZvbzsgLSBwZXJzaXN0YWJsZQogCXB1YmxpYyB2b2lkIHRlc3RGaWVsZElzUGVyc2lzdGFibGU0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUZpZWxkV2l0aE1vZGlmaWVyKCJwcml2YXRlIGZpbmFsIik7CiAJCUZpZWxkQXR0cmlidXRlIGZpZWxkQXR0cmlidXRlID0gZm9vRmllbGQoY3UpOwotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IGZpZWxkQXR0cmlidXRlLmdldEJpbmRpbmcoSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydFRydWUoSlBUVG9vbHMuZmllbGRJc1BlcnNpc3RhYmxlKHZhcmlhYmxlQmluZGluZykpOworCQlhc3NlcnRUcnVlKGZpZWxkQXR0cmlidXRlLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7CiAJfQogCQogCS8vcHVibGljIFN0cmluZyBmb287IC0gcGVyc2lzdGFibGUKIAlwdWJsaWMgdm9pZCB0ZXN0RmllbGRJc1BlcnNpc3RhYmxlNSgpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVGaWVsZFdpdGhNb2RpZmllcigicHVibGljIik7CiAJCUZpZWxkQXR0cmlidXRlIGZpZWxkQXR0cmlidXRlID0gZm9vRmllbGQoY3UpOwotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IGZpZWxkQXR0cmlidXRlLmdldEJpbmRpbmcoSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydFRydWUoSlBUVG9vbHMuZmllbGRJc1BlcnNpc3RhYmxlKHZhcmlhYmxlQmluZGluZykpOworCQlhc3NlcnRUcnVlKGZpZWxkQXR0cmlidXRlLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7CiAJfQogCQogCiAJLy9wdWJsaWMgaW50IGdldEZvbygpIHt9IC0gcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMSgpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIwMSgpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVHZXRNZXRob2RXaXRoTW9kaWZpZXIoInB1YmxpYyIpOwogCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRUcnVlKEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihtZXRob2RCaW5kaW5nKSk7Ci0JCQorCQlhc3NlcnRUcnVlKG1ldGhvZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwogCX0KIAkKIAkvL3Byb3RlY3RlZCBpbnQgZ2V0Rm9vKCkge30gLSBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUdldE1ldGhvZFdpdGhNb2RpZmllcigicHJvdGVjdGVkIik7CiAJCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gbWV0aG9kQXR0cmlidXRlLmdldEJpbmRpbmcoSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydFRydWUoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKG1ldGhvZEJpbmRpbmcpKTsKKwkJYXNzZXJ0VHJ1ZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKIAl9CiAJCiAJLy9pbnQgZ2V0Rm9vKCkge30gLSBub3QgcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMygpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIwMygpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVHZXRNZXRob2RXaXRoTW9kaWZpZXIoIiIpOwogCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIobWV0aG9kQmluZGluZykpOworCQlhc3NlcnRGYWxzZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKIAl9CiAJCiAJLy9wcml2YXRlIGludCBnZXRGb28oKSB7fSAtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXI0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUdldE1ldGhvZFdpdGhNb2RpZmllcigicHJpdmF0ZSIpOwogCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIobWV0aG9kQmluZGluZykpOworCQlhc3NlcnRGYWxzZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKIAl9CiAJCiAJLy9wdWJsaWMgc3RhdGljIGludCBnZXRGb28oKSB7fSAtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXI1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjA1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUdldE1ldGhvZFdpdGhNb2RpZmllcigicHVibGljIHN0YXRpYyIpOwogCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIobWV0aG9kQmluZGluZykpOworCQlhc3NlcnRGYWxzZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKIAl9CiAKIAkvL3B1YmxpYyBmaW5hbCBpbnQgZ2V0Rm9vKCkge30gLSBub3QgcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyNigpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIwNigpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVHZXRNZXRob2RXaXRoTW9kaWZpZXIoInB1YmxpYyBmaW5hbCIpOwogCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIobWV0aG9kQmluZGluZykpOworCQlhc3NlcnRGYWxzZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKIAl9CiAKIAkvL3B1YmxpYyB2b2lkIHNldEZvbyhpbnQgZm9vKSB7fSAtIHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMDcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlU2V0TWV0aG9kV2l0aE1vZGlmaWVyKCJwdWJsaWMiKTsKIAkJTWV0aG9kQXR0cmlidXRlIG1ldGhvZEF0dHJpYnV0ZSA9IGZvb01ldGhvZChjdSk7Ci0JCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBtZXRob2RBdHRyaWJ1dGUuZ2V0QmluZGluZyhKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0VHJ1ZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIobWV0aG9kQmluZGluZykpOwotCQkKKwkJYXNzZXJ0VHJ1ZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKIAl9CiAJCiAJLy9wcm90ZWN0ZWQgdm9pZCBzZXRGb28oaW50IGZvbykge30gLSBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXI4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjA4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZVNldE1ldGhvZFdpdGhNb2RpZmllcigicHJvdGVjdGVkIik7CiAJCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gbWV0aG9kQXR0cmlidXRlLmdldEJpbmRpbmcoSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydFRydWUoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKG1ldGhvZEJpbmRpbmcpKTsKKwkJYXNzZXJ0VHJ1ZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKIAl9CiAJCiAJLy92b2lkIHNldEZvbyhpbnQgZm9vKSB7fSAtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXI5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjA5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZVNldE1ldGhvZFdpdGhNb2RpZmllcigiIik7CiAJCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gbWV0aG9kQXR0cmlidXRlLmdldEJpbmRpbmcoSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydEZhbHNlKEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihtZXRob2RCaW5kaW5nKSk7CisJCWFzc2VydEZhbHNlKG1ldGhvZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwogCX0KIAkKIAkvL3ByaXZhdGUgdm9pZCBzZXRGb28oaW50IGZvbykge30gLSBub3QgcGVyc2lzdGFibGUKIAlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9ICBjcmVhdGVUZXN0VHlwZVNldE1ldGhvZFdpdGhNb2RpZmllcigicHJpdmF0ZSIpOwogCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIobWV0aG9kQmluZGluZykpOworCQlhc3NlcnRGYWxzZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKIAl9CiAJCiAJLy9wdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKGludCBmb28pIHt9IC0gbm90IHBlcnNpc3RhYmxlCiAJcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZVNldE1ldGhvZFdpdGhNb2RpZmllcigicHVibGljIHN0YXRpYyIpOwogCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIobWV0aG9kQmluZGluZykpOworCQlhc3NlcnRGYWxzZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKIAl9CiAKIAkvL3B1YmxpYyBmaW5hbCB2b2lkIHNldEZvbyhpbnQgZm9vKSB7fSAtIG5vdCBwZXJzaXN0YWJsZQogCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIxMigpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVTZXRNZXRob2RXaXRoTW9kaWZpZXIoInB1YmxpYyBmaW5hbCIpOwogCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEF0dHJpYnV0ZS5nZXRCaW5kaW5nKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIobWV0aG9kQmluZGluZykpOworCQlhc3NlcnRGYWxzZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKIAl9CiAKIAkvL3B1YmxpYyBib29sZWFuIGlzRm9vKCkge30gLSBwZXJzaXN0YWJsZQogCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIxMygpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVJc01ldGhvZCgpOwogCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gIHRoaXMuYnVpbGRNZXRob2QoImlzRm9vIiwgY3UpOwotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gbWV0aG9kQXR0cmlidXRlLmdldEJpbmRpbmcoSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydFRydWUoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKG1ldGhvZEJpbmRpbmcpKTsKLQkJCisJCWFzc2VydFRydWUobWV0aG9kQXR0cmlidXRlLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7CiAJfQogCQogCS8vcHVibGljIGludCBpc0ZvbygpIHt9IC0gbm90IHBlcnNpc3RhYmxlCiAJcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUlzTWV0aG9kUmV0dXJuSW50KCk7CiAJCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSAgdGhpcy5idWlsZE1ldGhvZCgiaXNGb28iLCBjdSk7Ci0JCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBtZXRob2RBdHRyaWJ1dGUuZ2V0QmluZGluZyhKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKG1ldGhvZEJpbmRpbmcpKTsKLQkJCisJCWFzc2VydEZhbHNlKG1ldGhvZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwogCX0KIAkKIAkvL3B1YmxpYyBpbnQgaXNGb28oKSB7fSAtIHBlcnNpc3RhYmxlCkBAIC0zOTEsMTI0ICszNjgsMTA5IEBACiAJCU1ldGhvZEF0dHJpYnV0ZSBpc0Zvb01ldGhvZCA9ICB0aGlzLmJ1aWxkTWV0aG9kKCJpc0ZvbyIsIGN1KTsKIAkJTWV0aG9kQXR0cmlidXRlIGdldEZvb01ldGhvZCA9ICB0aGlzLmJ1aWxkTWV0aG9kKCJnZXRGb28iLCBjdSk7CiAJCQotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydFRydWUoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKGlzRm9vTWV0aG9kLmdldEJpbmRpbmcoYXN0Um9vdCkpKTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKGdldEZvb01ldGhvZC5nZXRCaW5kaW5nKGFzdFJvb3QpKSk7CisJCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOworCQlhc3NlcnRUcnVlKGlzRm9vTWV0aG9kLmlzUGVyc2lzdGFibGUoYXN0Um9vdCkpOworCQlhc3NlcnRGYWxzZShnZXRGb29NZXRob2QuaXNQZXJzaXN0YWJsZShhc3RSb290KSk7CiAJfQogCQogCS8vcHVibGljIGludCBmb28oKSB7fSAtIG5vdCBwZXJzaXN0YWJsZQogCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIxNigpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVJbnZhbGlkTWV0aG9kTmFtZSgpOwogCQlNZXRob2RBdHRyaWJ1dGUgZm9vTWV0aG9kID0gIHRoaXMuYnVpbGRNZXRob2QoImZvbyIsIGN1KTsKLQkJCi0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKGZvb01ldGhvZC5nZXRCaW5kaW5nKGFzdFJvb3QpKSk7CisJCWFzc2VydEZhbHNlKGZvb01ldGhvZC5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwogCX0KIAogCS8vcHVibGljIHZvaWQgZ2V0Rm9vKCkge30gLSBub3QgcGVyc2lzdGFibGUgLSB2b2lkIHJldHVybiB0eXBlCiAJcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjE3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZVZvaWRNZXRob2RSZXR1cm5UeXBlKCk7CiAJCU1ldGhvZEF0dHJpYnV0ZSBmb29NZXRob2QgPSAgdGhpcy5idWlsZE1ldGhvZCgiZ2V0Rm9vIiwgY3UpOwotCQkKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIoZm9vTWV0aG9kLmdldEJpbmRpbmcoYXN0Um9vdCkpKTsKKwkJYXNzZXJ0RmFsc2UoZm9vTWV0aG9kLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7CiAJfQogCQotCS8vVE9ETwotCS8vKipnZXRGb29NZXRob2QuYmluZGluZyhDb21wbGlhdGlvblVuaXQpIGlzIHJldHVybmluZyBudWxsLCBub3Qgc3VyZSB3aHkgYW5kIGRvbid0IGtub3cgaG93IHRvIHRlc3QKLQkvLyoqdGhpcyBpZiBpdCBpcyByZXR1cm5pbmcgbnVsbCB0aGVyZSBpbnN0ZWFkIG9mIHJldHVybmluZyBudWxsIGZvciBJTWV0aG9kQmluZGluZy5nZXRSZXR1cm5UeXBlKCkKLS8vCS8vcHVibGljIEZvbyBnZXRGb28oKSB7fSAtIG5vdCBwZXJzaXN0YWJsZSAtIEZvbyBkb2VzIG5vdCByZXNvbHZlCi0vLwlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVJbnZhbGlkTWV0aG9kUmV0dXJuVHlwZSgpOwotLy8JCU1ldGhvZEF0dHJpYnV0ZSBnZXRGb29NZXRob2QgPSAgdGhpcy5idWlsZE1ldGhvZCgiZ2V0Rm9vIik7Ci0vLwkJCi0vLwkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpOwotLy8JCWFzc2VydEZhbHNlKEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihmb29NZXRob2QuYmluZGluZyhhc3RSb290KSkpOwotLy8JfQorCS8vcHVibGljIEZvbyBnZXRGb28oKSB7fSAtIHBlcnNpc3RhYmxlPz8/IC0gRm9vIGRvZXMgbm90IHJlc29sdmUKKwlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlSW52YWxpZE1ldGhvZFJldHVyblR5cGUoKTsKKwkJTWV0aG9kQXR0cmlidXRlIGdldEZvb01ldGhvZCA9ICB0aGlzLmJ1aWxkTWV0aG9kKCJnZXRGb28iLCBjdSk7CisJCWFzc2VydFRydWUoZ2V0Rm9vTWV0aG9kLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7CisJfQogCQogCS8vbWV0aG9kIHdpdGggcGFyYW1ldGVycyAtIG5vdCBwZXJzaXN0YWJsZQogCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIxOSgpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGUoKTsKIAkJTWV0aG9kQXR0cmlidXRlIHNldElkTWV0aG9kID0gIGlkU2V0TWV0aG9kKGN1KTsKLQkJCi0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKHNldElkTWV0aG9kLmdldEJpbmRpbmcoYXN0Um9vdCkpKTsKKwkJYXNzZXJ0RmFsc2Uoc2V0SWRNZXRob2QuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKIAl9CiAJCiAJLy9jb25zdHJ1Y3RvciAtIG5vdCBwZXJzaXN0YWJsZQogCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIyMCgpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVDb25zdHJ1Y3RvcigpOwogCQlNZXRob2RBdHRyaWJ1dGUgY29uc3RydWN0b3IgPSAgYnVpbGRNZXRob2QoVFlQRV9OQU1FLCBjdSk7Ci0JCQotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydEZhbHNlKEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihjb25zdHJ1Y3Rvci5nZXRCaW5kaW5nKGFzdFJvb3QpKSk7CisJCWFzc2VydEZhbHNlKGNvbnN0cnVjdG9yLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7CiAJfQogCQogCS8vbm8gY29ycmVzcG9uZGluZyBzZXQgbWV0aG9kIC0gbm90IHBlcnNpc3RhYmxlCiAJcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZSgpOwogCQlNZXRob2RBdHRyaWJ1dGUgZ2V0TmFtZU1ldGhvZCA9ICBuYW1lR2V0TWV0aG9kKGN1KTsKLQkJCi0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKGdldE5hbWVNZXRob2QuZ2V0QmluZGluZyhhc3RSb290KSkpOworCQlhc3NlcnRGYWxzZShnZXROYW1lTWV0aG9kLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7CiAJfQogCQogCS8vcHVibGljIGNsYXNzIEFubm90YXRpb25UZXN0VHlwZQotCXB1YmxpYyB2b2lkIGN1SXNQZXJzaXN0YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHRlc3RUeXBlSXNQZXJzaXN0YWJsZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlKCk7CiAJCVR5cGUgdHlwZSA9IHRlc3RUeXBlKGN1KTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpOwotCQlhc3NlcnRUcnVlKEpQVFRvb2xzLnR5cGVJc1BlcnNpc3RhYmxlKHR5cGUuZ2V0QmluZGluZyhhc3RSb290KSkpOworCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKKwkJYXNzZXJ0VHJ1ZSh0eXBlLmlzUGVyc2lzdGFibGUoYXN0Um9vdCkpOwogCX0KIAkKIAkvL3B1YmxpYyBmaW5hbCBjbGFzcyBNeUZpbmFsCi0JcHVibGljIHZvaWQgY3VJc1BlcnNpc3RhYmxlMigpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHRlc3RUeXBlSXNQZXJzaXN0YWJsZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJmaW5hbHMiLCAiTXlGaW5hbC5qYXZhIiwgInB1YmxpYyBmaW5hbCBjbGFzcyBNeUZpbmFsIHsgfSIpOwogCQlUeXBlIHR5cGUgPSBidWlsZFR5cGUoIk15RmluYWwiLCBjdSk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMudHlwZUlzUGVyc2lzdGFibGUodHlwZS5nZXRCaW5kaW5nKGFzdFJvb3QpKSk7CisJCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOworCQlhc3NlcnRGYWxzZSh0eXBlLmlzUGVyc2lzdGFibGUoYXN0Um9vdCkpOwogCX0KIAkKIAkvL3B1YmxpYyBpbnRlcmZhY2UgTXlJbnRlcmZhY2UKLQlwdWJsaWMgdm9pZCBjdUlzUGVyc2lzdGFibGUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdFR5cGVJc1BlcnNpc3RhYmxlMygpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImludGVyZmFjZXMiLCAiTXlJbnRlcmZhY2UuamF2YSIsICJwdWJsaWMgaW50ZXJmYWNlIE15SW50ZXJmYWNlIHsgfSIpOwogCQlUeXBlIHR5cGUgPSBidWlsZFR5cGUoIk15SW50ZXJmYWNlIiwgY3UpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydEZhbHNlKEpQVFRvb2xzLnR5cGVJc1BlcnNpc3RhYmxlKHR5cGUuZ2V0QmluZGluZyhhc3RSb290KSkpOworCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKKwkJYXNzZXJ0RmFsc2UodHlwZS5pc1BlcnNpc3RhYmxlKGFzdFJvb3QpKTsKIAl9CiAJCiAJLy9lbnVtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIGN1SXNQZXJzaXN0YWJsZTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB0ZXN0VHlwZUlzUGVyc2lzdGFibGU0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJUZXN0RW51bSIsICJGT08sIEJBUiwgQkFaIik7CiAJCVR5cGUgdHlwZSA9IGJ1aWxkVHlwZSgiVGVzdEVudW0iLCBjdSk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KTsKLQkJYXNzZXJ0RmFsc2UoSlBUVG9vbHMudHlwZUlzUGVyc2lzdGFibGUodHlwZS5nZXRCaW5kaW5nKGFzdFJvb3QpKSk7CisJCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOworCQlhc3NlcnRGYWxzZSh0eXBlLmlzUGVyc2lzdGFibGUoYXN0Um9vdCkpOwogCX0KIAkKIAkvL2Fubm90YXRpb24gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgY3VJc1BlcnNpc3RhYmxlNSgpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHRlc3RUeXBlSXNQZXJzaXN0YWJsZTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRlc3RBbm5vdGF0aW9uIiwgIlRlc3RFbnVtIGZvbygpOyIpOwogCQlUeXBlIHR5cGUgPSBidWlsZFR5cGUoIlRlc3RBbm5vdGF0aW9uIiwgY3UpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydEZhbHNlKEpQVFRvb2xzLnR5cGVJc1BlcnNpc3RhYmxlKHR5cGUuZ2V0QmluZGluZyhhc3RSb290KSkpOworCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKKwkJYXNzZXJ0RmFsc2UodHlwZS5pc1BlcnNpc3RhYmxlKGFzdFJvb3QpKTsKIAl9CiAJCiAJLy9wdWJsaWMgc3RhdGljIG1lbWJlciB0eXBlIGlzIHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgY3VJc1BlcnNpc3RhYmxlNigpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHRlc3RUeXBlSXNQZXJzaXN0YWJsZTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVXaXRoTWVtYmVyVHlwZXMoKTsKIAkJVHlwZSB0ZXN0VHlwZSA9IHRoaXMudGVzdFR5cGUoY3UpOwogCQlUeXBlIG1lbWJlclR5cGUgPSB0aGlzLmJ1aWxkVHlwZSh0ZXN0VHlwZSwgIkZvb1N0YXRpYyIsIDEsIGN1KTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpOwotCQlhc3NlcnRUcnVlKEpQVFRvb2xzLnR5cGVJc1BlcnNpc3RhYmxlKG1lbWJlclR5cGUuZ2V0QmluZGluZyhhc3RSb290KSkpOworCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKKwkJYXNzZXJ0VHJ1ZShtZW1iZXJUeXBlLmlzUGVyc2lzdGFibGUoYXN0Um9vdCkpOwogCX0KIAkKIAkvL25vbi1zdGF0aWMgbWVtYmVyIHR5cGUgaXMgbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgY3VJc1BlcnNpc3RhYmxlNygpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHRlc3RUeXBlSXNQZXJzaXN0YWJsZTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVXaXRoTWVtYmVyVHlwZXMoKTsKIAkJVHlwZSB0ZXN0VHlwZSA9IHRoaXMudGVzdFR5cGUoY3UpOwogCQlUeXBlIG1lbWJlclR5cGUgPSB0aGlzLmJ1aWxkVHlwZSh0ZXN0VHlwZSwgIkZvb05vdFN0YXRpYyIsIDEsIGN1KTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpOwotCQlhc3NlcnRGYWxzZShKUFRUb29scy50eXBlSXNQZXJzaXN0YWJsZShtZW1iZXJUeXBlLmdldEJpbmRpbmcoYXN0Um9vdCkpKTsKKwkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7CisJCWFzc2VydEZhbHNlKG1lbWJlclR5cGUuaXNQZXJzaXN0YWJsZShhc3RSb290KSk7CiAJfQogCS8vVE9ETyBzdGlsbCBuZWVkIHRvIHRlc3QgdHlwZUlzUGVyc2lzdGFibGUoKSByZXR1cm5zIGZhbHNlIGZvciBsb2NhbCBhbmQgYW5vbnltb3VzIGNsYXNzZXMKIApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKaW5kZXggOWEwMzgwNS4uMDIyMjQ5NiAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTksMzIgKzksMzQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuU2ltcGxlSnBhUHJvamVjdENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1vZGVsSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQml0VG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZQogeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX1BFUlNJU1RFTkNFX1BBQ0tBR0VfTkFNRSA9ICJqYXZheC5wZXJzaXN0ZW5jZSI7IC8vJE5PTi1OTFMtMSQKKwogCXByaXZhdGUgSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lciBqYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyOwotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VNb2RlbCBqYXZhUmVzb3VyY2VNb2RlbDsKKwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKIAkKIAogCXB1YmxpYyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CkBAIC00MywxMCArNDUsMTQgQEAKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQlzdXBlci5zZXRVcCgpOworCQl0aGlzLmphdmFQcm9qZWN0LmFkZEphcihUZXN0SnBhUHJvamVjdC5qcGFKYXJOYW1lKCkpOworCQlpZiAoVGVzdEpwYVByb2plY3QuZWNsaXBzZUxpbmtKYXJOYW1lKCkgIT0gbnVsbCkgeworCQkJdGhpcy5qYXZhUHJvamVjdC5hZGRKYXIoVGVzdEpwYVByb2plY3QuZWNsaXBzZUxpbmtKYXJOYW1lKCkpOworCQl9CiAJCXRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lciA9IG5ldyBKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyKCk7CiAJCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyKTsKIAl9Ci0JCisKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogCQlzdXBlci50ZWFyRG93bigpOwpAQCAtNjIsOSArNjgsNyBAQAogCQkJc3VwZXIoKTsKIAkJfQogCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS50aGlzLmphdmFSZXNvdXJjZU1vZGVsICE9IG51bGwpIHsKLQkJCQlKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLnRoaXMuamF2YVJlc291cmNlTW9kZWwuamF2YUVsZW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KKwkJCUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UudGhpcy5qYXZhRWxlbWVudENoYW5nZWQoZXZlbnQpOwogCQl9CiAJCUBPdmVycmlkZQogCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtNzIsNjcgKzc2LDk2IEBACiAJCX0KIAl9CiAKKwl2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCWlmICh0aGlzLmphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdGhpcy5zeW5jaFdpdGhKYXZhRGVsdGEoZXZlbnQuZ2V0RGVsdGEoKSk7CisJfQorCisJLyoqCisJICogTkI6IHRoaXMgaXMgY29waWVkIGZyb20gR2VuZXJpY0pwYVByb2plY3QsIHNvIGl0IG1pZ2h0IG5lZWQgdG8gYmUKKwkgKiBrZXB0IGluIHN5bmNoIHdpdGggdGhhdCBjb2RlIGlmIGl0IGNoYW5nZXMuLi4geWVjaC4uLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHN5bmNoV2l0aEphdmFEZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgeworCQlzd2l0Y2ggKGRlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50VHlwZSgpKSB7CisJCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX01PREVMIDoKKwkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA6CisJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgOgorCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCA6CisJCQkJdGhpcy5zeW5jaFdpdGhKYXZhRGVsdGFDaGlsZHJlbihkZWx0YSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIDoKKwkJCQl0aGlzLmphdmFDb21waWxhdGlvblVuaXRDaGFuZ2VkKGRlbHRhKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCWJyZWFrOyAvLyBpZ25vcmUgdGhlIGVsZW1lbnRzIGluc2lkZSBhIGNvbXBpbGF0aW9uIHVuaXQKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHN5bmNoV2l0aEphdmFEZWx0YUNoaWxkcmVuKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7CisJCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGQgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKKwkJCXRoaXMuc3luY2hXaXRoSmF2YURlbHRhKGNoaWxkKTsgLy8gcmVjdXJzZQorCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgamF2YUNvbXBpbGF0aW9uVW5pdENoYW5nZWQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKKwkJaWYgKHRoaXMuZGVsdGFJc1JlbGV2YW50KGRlbHRhKSkgeworCQkJdGhpcy5qYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQudXBkYXRlKCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWx0YUlzUmVsZXZhbnQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKKwkJaWYgKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoZGVsdGEuZ2V0RmxhZ3MoKSwgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1dPUktJTkdfQ09QWSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQ7CisJfQorCiAJcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgYW5ub3RhdGlvbkJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImphdmF4LnBlcnNpc3RlbmNlIiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOworCQlyZXR1cm4gY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoSkFWQVhfUEVSU0lTVEVOQ0VfUEFDS0FHRV9OQU1FLCBhbm5vdGF0aW9uTmFtZSwgYW5ub3RhdGlvbkJvZHkpOworCX0KKwkKKwlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHBhY2thZ2VOYW1lLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHsgIiArIGFubm90YXRpb25Cb2R5ICsgIiB9Iik7CiAJfQogCQogCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUVudW1BbmRNZW1iZXJzKFN0cmluZyBlbnVtTmFtZSwgU3RyaW5nIGVudW1Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJqYXZheC5wZXJzaXN0ZW5jZSIsIGVudW1OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBlbnVtICIgKyBlbnVtTmFtZSArICIgeyAiICsgZW51bUJvZHkgKyAiIH0iKTsKKwkJcmV0dXJuIGNyZWF0ZUVudW1BbmRNZW1iZXJzKEpBVkFYX1BFUlNJU1RFTkNFX1BBQ0tBR0VfTkFNRSwgZW51bU5hbWUsIGVudW1Cb2R5KTsKIAl9Ci0KLQkvL2J1aWxkIHVwIGEgZHVtbXkgSnBhUHJvamVjdCB0aGF0IGRvZXMgbm90IGhhdmUgSnBhRmlsZXMgaW4gaXQgYW5kIGRvZXMgbm90IHVwZGF0ZSBmcm9tIGphdmEgY2hhbmdlcwotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0SnBhUHJvamVjdCh0aGlzLmJ1aWxkSnBhUHJvamVjdENvbmZpZyh0aGlzLmphdmFQcm9qZWN0LmdldFByb2plY3QoKSkpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBUZXN0SnBhUHJvamVjdCBleHRlbmRzIEdlbmVyaWNKcGFQcm9qZWN0IHsKLQkJcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0KEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJc3VwZXIoY29uZmlnKTsKLQkJCXRoaXMuc2V0VXBkYXRlcihVcGRhdGVyLk51bGwuaW5zdGFuY2UoKSk7Ly8gaWdub3JlIGFsbCB1cGRhdGVzLCBzaW5jZSB0aGVyZSBpcyBubyBjb250ZXh0IG1vZGVsCi0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElSZXNvdXJjZVByb3h5VmlzaXRvciBidWlsZEluaXRpYWxSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKLQkJCXJldHVybiBuZXcgSVJlc291cmNlUHJveHlWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCXJldHVybiBmYWxzZTsgIC8vIGlnbm9yZSBhbGwgdGhlIGZpbGVzIGluIHRoZSBFY2xpcHNlIHByb2plY3QKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEpwYVJvb3RDb250ZXh0Tm9kZSBidWlsZFJvb3RDb250ZXh0Tm9kZSgpIHsKLQkJCXJldHVybiBudWxsOyAgLy8gbm8gcm9vdCBjb250ZXh0Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEpwYVByb2plY3QuQ29uZmlnIGJ1aWxkSnBhUHJvamVjdENvbmZpZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVNpbXBsZUpwYVByb2plY3RDb25maWcgY29uZmlnID0gbmV3IFNpbXBsZUpwYVByb2plY3RDb25maWcoKTsKLQkJY29uZmlnLnNldFByb2plY3QocHJvamVjdCk7Ci0JCWNvbmZpZy5zZXRKcGFQbGF0Zm9ybShKcHRDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtKHByb2plY3QpKTsKLQkJY29uZmlnLnNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShKcHRDb3JlUGx1Z2luLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZShwcm9qZWN0KSk7Ci0JCWNvbmZpZy5zZXREaXNjb3ZlckFubm90YXRlZENsYXNzZXMoSnB0Q29yZVBsdWdpbi5kaXNjb3ZlckFubm90YXRlZENsYXNzZXMocHJvamVjdCkpOwotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFUeXBlUmVzb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCBjdSkgCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUmVzb3VyY2VNb2RlbCA9IGJ1aWxkSmF2YVJlc291cmNlTW9kZWwoY3UpOwotCQl0aGlzLmphdmFSZXNvdXJjZU1vZGVsLnJlc29sdmVUeXBlcygpOwotCQlyZXR1cm4gdGhpcy5qYXZhUmVzb3VyY2VNb2RlbC5nZXRKcGFDb21waWxhdGlvblVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCX0JCiAJCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZU1vZGVsIGJ1aWxkSmF2YVJlc291cmNlTW9kZWwoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAodGhpcy5qYXZhUmVzb3VyY2VNb2RlbCAhPSBudWxsKSB7CisJcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlRW51bUFuZE1lbWJlcnMoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZW51bU5hbWUsIFN0cmluZyBlbnVtQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChwYWNrYWdlTmFtZSwgZW51bU5hbWUgKyAiLmphdmEiLCAicHVibGljIGVudW0gIiArIGVudW1OYW1lICsgIiB7ICIgKyBlbnVtQm9keSArICIgfSIpOworCX0KKworCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFUeXBlUmVzb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCBjdSkgeworCQl0aGlzLmphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCA9IHRoaXMuYnVpbGRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoY3UpOworCQl0aGlzLmphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5yZXNvbHZlVHlwZXMoKTsKKwkJcmV0dXJuIHRoaXMuaGFja0phdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7CisJfQorCisJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGhhY2tKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpIHsKKwkJcmV0dXJuIChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgQ2xhc3NUb29scy5maWVsZFZhbHVlKHRoaXMuamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCAicGVyc2lzdGVudFR5cGUiKTsKKwl9CisKKwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGJ1aWxkSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgY3UpIHsKKwkJaWYgKHRoaXMuamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0ICE9IG51bGwpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKIAkJfQotCQlJRmlsZSBmaWxlID0gKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBidWlsZEpwYVByb2plY3QoKTsKLQkJcmV0dXJuIG5ldyBKYXZhUmVzb3VyY2VNb2RlbEltcGwoCi0JCQlmaWxlLCAKLQkJCWpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKS5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCUNvbW1hbmRFeGVjdXRvclByb3ZpZGVyLkRlZmF1bHQuaW5zdGFuY2UoKSwKLQkJCU51bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKKwkJcmV0dXJuIG5ldyBTb3VyY2VDb21waWxhdGlvblVuaXQoCisJCQljdSwKKwkJCXRoaXMuYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSwKKwkJCU51bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpLAorCQkJQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKQorCQkpOworCX0KKworCXByb3RlY3RlZCBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcih0aGlzLmFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKSk7CisJfQorCisJcHJvdGVjdGVkIEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIgYW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpIHsKKwkJcmV0dXJuIEdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCk7CiAJfQogCiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKaW5kZXggYjE0ZmViNy4uOTllMjMyOCAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDIyICs5LDIzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwogCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLklkSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk9uZVRvT25lSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VJZEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlT25lVG9PbmVBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyLkVkaXRvcjsKQEAgLTMyLDcgKzMzLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKLQorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAJCiAJcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtNDAsOCArNDEsNiBAQAogCX0KIAkJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0KIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNTUsOCArNTQsNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOb25SZXNvbHZpbmdGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC03NSw4ICs3Miw2IEBACiAJCX0pOwogCX0KIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOb25SZXNvbHZpbmdNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0KIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTA5LDkgKzEwNCw2IEBACiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlNdWx0aXBsZVZhcmlhYmxlRGVjbGFyYXRpb25zUGVyTGluZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTEyOSw3ICsxMjEsNyBAQAogCQkJCXNiLmFwcGVuZCgiQElkIik7CiAJCQkJc2IuYXBwZW5kKENSKTsKIAkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cImJhelwiKSIpOworCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lID0gXCJiYXpcIikiKTsKIAkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb28sIGJhcjsiKS5hcHBlbmQoQ1IpOwogCQkJCXNiLmFwcGVuZChDUik7CiAJCQl9CkBAIC0xMzcsOSArMTI5LDYgQEAKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZEFuZEJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFzaWMiLCAiIik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTE2MCwxMCArMTQ5LDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTE4NSw4ICsxNzAsNiBAQAogCX0JCiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJDb2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsgU3RyaW5nIHRhYmxlKCk7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTE5OSwxNiArMTgyLDEyIEBACiAJCQkKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKG5hbWU9XCJGT09cIiwgdGFibGU9XCJNWV9UQUJMRVwiKSIpOworCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lID0gXCJGT09cIiwgdGFibGUgPSBcIk1ZX1RBQkxFXCIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZENvbHVtbkdlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJDb2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsgU3RyaW5nIHRhYmxlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkdlbmVyYXRlZFZhbHVlIiwgIiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMjMxLDggKzIxMCw2IEBACiAKIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU11bHRpcGxlQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTI0NSwxNiArMjIyLDE0IEBACiAJCQkKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKG5hbWU9XCJGT09cIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZSA9IFwiRk9PXCIpIik7CiAJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkJBUlwiKSIpOworCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lID0gXCJCQVJcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRlZCIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBdHRyaWJ1dGVPdmVycmlkZSIsICJTdHJpbmcgbmFtZSgpOyIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0yNjQsMTQgKzIzOSwxMSBAQAogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CiAJCQkJc2IuYXBwZW5kKCJARW1iZWRkZWQiKTsKIAkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIikiKTsKIAkJCX0KIAkJfSk7CiAJfQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVtYmVkZGVkIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkF0dHJpYnV0ZU92ZXJyaWRlIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkF0dHJpYnV0ZU92ZXJyaWRlcyIsICJBdHRyaWJ1dGVPdmVycmlkZVtdIHZhbHVlKCk7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTI4MSwxMyArMjUzLDExIEBACiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKIAkJCQlzYi5hcHBlbmQoIkBFbWJlZGRlZCIpOwogCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQXR0cmlidXRlT3ZlcnJpZGVzKEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIpKSIpOworCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlcyhAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIpKSIpOwogCQkJfQogCQl9KTsKIAl9CiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRlZCIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJBdHRyaWJ1dGVPdmVycmlkZXMiLCAiQXR0cmlidXRlT3ZlcnJpZGVbXSB2YWx1ZSgpOyIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0zMDMsOSArMjczLDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGgyQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVtYmVkZGVkIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkF0dHJpYnV0ZU92ZXJyaWRlIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkF0dHJpYnV0ZU92ZXJyaWRlcyIsICJBdHRyaWJ1dGVPdmVycmlkZVtdIHZhbHVlKCk7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTMxNSwxNSArMjgyLDEyIEBACiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKIAkJCQlzYi5hcHBlbmQoIkBFbWJlZGRlZCIpOwogCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZPT1wiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVJcIil9KSIpOworCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKX0pIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGVkV2l0aEF0dHJpYnV0ZU92ZXJyaWRlQW5kQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVtYmVkZGVkIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkF0dHJpYnV0ZU92ZXJyaWRlIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkF0dHJpYnV0ZU92ZXJyaWRlcyIsICJBdHRyaWJ1dGVPdmVycmlkZVtdIHZhbHVlKCk7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTMzMyw5ICsyOTcsOSBAQAogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CiAJCQkJc2IuYXBwZW5kKCJARW1iZWRkZWQiKTsKIAkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIikiKTsKIAkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVJcIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFaXCIpfSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVpcIil9KSIpOwogCQkJfQogCQl9KTsKIAl9CkBAIC00MjUsNyArMzg5LDcgQEAKIAogCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtblJlc291cmNlID0gKENvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7CiAJCWNvbHVtblJlc291cmNlLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbihuYW1lPVwiRk9PXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbihuYW1lID0gXCJGT09cIikiLCBjdSk7CiAKIAkJY29sdW1uUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKIAkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDb2x1bW4iLCBjdSk7CkBAIC00MzgsMjAgKzQwMiwxOCBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlUmVzb3VyY2UubWFwcGluZ0Fubm90YXRpb25zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuQkFTSUMpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQykpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLklEKSk7CiAJCQotCQlKYXZhUmVzb3VyY2VOb2RlIGphdmFBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbiA9IGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZU5vZGUgamF2YUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uID0gYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0VHJ1ZShqYXZhQXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBCYXNpY0Fubm90YXRpb24pOwogCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEJhc2ljIiwgY3UpOwogCQlhc3NlcnRTb3VyY2VDb250YWlucygiQElkIiwgY3UpOwogCQkKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9NYW55IiwgIiIpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlUmVzb3VyY2UubWFwcGluZ0Fubm90YXRpb25zU2l6ZSgpKTsKLQkJamF2YUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uID0gYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJYXR0cmlidXRlUmVzb3VyY2Uuc2V0UHJpbWFyeUFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZLCBuZXcgU3RyaW5nWzBdKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKKwkJamF2YUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uID0gYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydFRydWUoamF2YUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgT25lVG9NYW55QW5ub3RhdGlvbik7CiAJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASWQiLCBjdSk7CiAJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55IiwgY3UpOwpAQCAtNDYyLDExICs0MjQsMTAgQEAKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlKCk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZVJlc291cmNlLm1hcHBpbmdBbm5vdGF0aW9uc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9uc1NpemUoKSk7CiAJCQotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKLQkJYXR0cmlidXRlUmVzb3VyY2Uuc2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLklEKTsKLQkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpIGluc3RhbmNlb2YgSWRBbm5vdGF0aW9uKTsKKwkJYXR0cmlidXRlUmVzb3VyY2Uuc2V0UHJpbWFyeUFubm90YXRpb24oSlBBLklELCBuZXcgU3RyaW5nWzBdKTsKKwkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpIGluc3RhbmNlb2YgSWRBbm5vdGF0aW9uKTsKIAkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBJZCIsIGN1KTsKIAl9CiAKQEAgLTQ3NCwxMSArNDM1LDEwIEBACiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aENvbHVtbigpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSk7CisJCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9uc1NpemUoKSk7CiAJCQotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKLQkJYXR0cmlidXRlUmVzb3VyY2Uuc2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLklEKTsKLQkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpIGluc3RhbmNlb2YgSWRBbm5vdGF0aW9uKTsKKwkJYXR0cmlidXRlUmVzb3VyY2Uuc2V0UHJpbWFyeUFubm90YXRpb24oSlBBLklELCBuZXcgU3RyaW5nW10ge0NvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FfSk7CisJCWFzc2VydFRydWUoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSBpbnN0YW5jZW9mIElkQW5ub3RhdGlvbik7CiAJCQogCQlhc3NlcnRTb3VyY2VDb250YWlucygiQElkIiwgY3UpOwogCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbiIsIGN1KTsKQEAgLTQ4OCwxMSArNDQ4LDE0IEBACiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aElkQ29sdW1uR2VuZXJhdGVkVmFsdWUoKTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBJZEFubm90YXRpb24pOworCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkgaW5zdGFuY2VvZiBJZEFubm90YXRpb24pOwogCQkKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFzaWMiLCAiIik7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnNldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCWFzc2VydFRydWUoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSBpbnN0YW5jZW9mIEJhc2ljQW5ub3RhdGlvbik7CisJCWF0dHJpYnV0ZVJlc291cmNlLnNldFByaW1hcnlBbm5vdGF0aW9uKAorCQkJCUpQQS5CQVNJQywgCisJCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkJQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCisJCQkJCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUV9KTsKKwkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpIGluc3RhbmNlb2YgQmFzaWNBbm5vdGF0aW9uKTsKIAkJCiAJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASWQiLCBjdSk7CiAJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAR2VuZXJhdGVkVmFsdWUiLCBjdSk7IC8vbm90IHN1cHBvcnRlZCBieSBCYXNpYwpAQCAtNTAzLDExICs0NjYsMTUgQEAKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRDb2x1bW5HZW5lcmF0ZWRWYWx1ZSgpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUoYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSBpbnN0YW5jZW9mIElkQW5ub3RhdGlvbik7CisJCWFzc2VydFRydWUoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSBpbnN0YW5jZW9mIElkQW5ub3RhdGlvbik7CiAJCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpKTsKKwkJYXR0cmlidXRlUmVzb3VyY2Uuc2V0UHJpbWFyeUFubm90YXRpb24oCisJCQkJbnVsbCwgCisJCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQkJQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCisJCQkJCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUV9KTsKIAkJCisJCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9uc1NpemUoKSk7CiAJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASWQiLCBjdSk7CiAJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAR2VuZXJhdGVkVmFsdWUiLCBjdSk7IC8vbm90IHN1cHBvcnRlZCBieSBCYXNpYwogCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbiIsIGN1KTsgLy9jb21tb24gYmV0d2VlbiBJZCBhbmQgQmFzaWMKQEAgLTU0MSwyMiArNTA4LDIxIEBACiAJCiAJCWlkRmllbGQoY3UpLmVkaXQobmV3IEVkaXRvcigpIHsKIAkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCSgoSWRJbXBsKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpKS5nZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCkucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7CisJCQkJU291cmNlSWRBbm5vdGF0aW9uLkRFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUi5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKIAkJCX0KIAkJfSk7CQkKIAkJCi0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk9uZVRvT25lIiwgIiIpOwogCQljdS5jcmVhdGVJbXBvcnQoImphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lIiwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CiAJCQogCQlpZEZpZWxkKGN1KS5lZGl0KG5ldyBFZGl0b3IoKSB7CiAJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlPbmVUb09uZUltcGwuREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLm5ld01hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOworCQkJCVNvdXJjZU9uZVRvT25lQW5ub3RhdGlvbi5ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7CiAJCQl9CiAJCX0pOwkJCiAJCQogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTikpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKSk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKSk7CiAJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uIiwgY3UpOwogCX0KIApAQCAtNjA3LDIwICs1NzMsMTkgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSIsIGN1KTsKIAl9CiAJCiAJLy8gIEBFbWJlZGRlZCAgICAgCQkJCS0tPj4gICAgQEVtYmVkZGVkCiAJLy8JQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9IkZPTyIpCQlAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT0iRk9PIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPSJCQVIiKX0pCQogCXB1YmxpYyB2b2lkIHRlc3RBZGRKYXZhQXR0cmlidXRlQW5ub3RhdGlvbk5lc3RhYmxlQ29udGFpbmVyMigpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVtYmVkZGVkV2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkF0dHJpYnV0ZU92ZXJyaWRlcyIsICJTdHJpbmcgbmFtZSgpOyIpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCiAJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIpLEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIpLEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKIAkJCiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUykpOwpAQCAtNjQwLDcgKzYwNSw3IEBACiAJCiAJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIpLEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIpLEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKIAkJCiAJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7CiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUykpOwpAQCAtNjU0LDcgKzYxOSw3IEBACiAJCQogCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBUlwiKSxAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZPT1wiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSxAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7CiAJCQogCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERVMpKTsKQEAgLTY3OSw3ICs2NDQsNyBAQAogCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpKSk7CiAKIAkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBUlwiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVpcIiksIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBWlwiKSwiLCBjdSk7CiAJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGV9KSIsIGN1KTsKIAkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQk9PIik7CiAJCQpAQCAtNjg3LDcgKzY1Miw3IEBACiAJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUykpOwogCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpKSk7CiAKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gYXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9ucyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25zID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpOwkKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpOwkKQEAgLTY5NSw4ICs2NjAsOCBAQAogCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpOwkKIAkJYXNzZXJ0RXF1YWxzKCJCT08iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFSXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBWlwiKSwiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJPT1wiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBWlwiKSwiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQk9PXCIpfSkiLCBjdSk7CiAJfQogCiAJLy9ARW50aXR5CkBAIC03MzIsOCArNjk3LDggQEAKIAkKIAkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFICwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBUlwiIiwgY3UpOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiIiwgY3UpOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEF0dHJpYnV0ZU92ZXJyaWRlcyIsIGN1KTsKIAl9CiAJCkBAIC03NDQsMTEgKzcwOSwxMSBAQAogCiAJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbilhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKIAkJbmV3QW5ub3RhdGlvbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBUlwiKSwiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBWlwiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSwiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFaXCIpfSkiLCBjdSk7CiAJCQogCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBWlwiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBWlwiKX0pIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZUphdmFUeXBlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNzU4LDEzICs3MjMsMTMgQEAKIAkKIAkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQluZXdBbm5vdGF0aW9uLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFSXCIpLCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFaXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpLCIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVpcIil9KSIsIGN1KTsKIAkJCiAJCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlKDAsIDIsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFaXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZPT1wiKSwiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJBUlwiKX0pIiwgY3UpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigwLCAyLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFaXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIpLCIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vdmVKYXZhVHlwZUFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC03NzQsMTIgKzczOSwxMiBAQAogCQogCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwogCQluZXdBbm5vdGF0aW9uLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGT09cIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFSXCIpLCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFaXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpLCIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVpcIil9KSIsIGN1KTsKIAkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmUoMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJCQVJcIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiRk9PXCIpLCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiQkFaXCIpfSkiLCBjdSk7CisJCWF0dHJpYnV0ZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiksIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBWlwiKX0pIiwgY3UpOwogCX0JCiAKIAkvL21vcmUgZGV0YWlsZWQgdGVzdHMgaW4gSlBUVG9vbHNUZXN0cwpAQCAtNzk5LDE2ICs3NjQsMTUgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IGF0dHJpYnV0ZXMuZ2V0KDApOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZVJlc291cmNlLmlzRm9yRmllbGQoKSk7CisJCWFzc2VydFRydWUoYXR0cmlidXRlUmVzb3VyY2UuaXNGaWVsZCgpKTsKIAkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVSZXNvdXJjZS5pc1BlcnNpc3RhYmxlKCkpOyAvL2J1ZyAxOTYyMDAgY2hhbmdlZCB0aGlzCiAKIAkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoInRlc3QiLCAiRm9vLmphdmEiLCAicHVibGljIGNsYXNzIEZvbyB7fSIpOwotCQl0aGlzLmphdmFSZXNvdXJjZU1vZGVsLnJlc29sdmVUeXBlcygpOwogCQkKIAkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVSZXNvdXJjZS5pc1BlcnNpc3RhYmxlKCkpOwogCX0KIAkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UXVhbGlmaWVkVHlwZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uUmVzb2x2aW5nRmllbGQoKTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCkBAIC04MTYsMTIgKzc4MCwxMSBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gYXR0cmlidXRlcy5nZXQoMCk7CiAJCQogCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5Gb28iLCBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRRdWFsaWZpZWRUeXBlTmFtZSgpKTsgLy9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcworCQlhc3NlcnRFcXVhbHMoInRlc3QuRm9vIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0VHlwZU5hbWUoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKIAogCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgidGVzdCIsICJGb28uamF2YSIsICJwdWJsaWMgY2xhc3MgRm9vIHt9Iik7Ci0JCXRoaXMuamF2YVJlc291cmNlTW9kZWwucmVzb2x2ZVR5cGVzKCk7CiAJCQotCQlhc3NlcnRFcXVhbHMoInRlc3QuRm9vIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0UXVhbGlmaWVkVHlwZU5hbWUoKSk7CisJCWFzc2VydEVxdWFscygidGVzdC5Gb28iLCBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRUeXBlTmFtZSgpKTsKIAl9CiAJCiAJCkBAIC04MjksNyArNzkyLDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0SXNQZXJzaXN0YWJsZU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnByb3BlcnRpZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVQcm9wZXJ0aWVzKCkubmV4dCgpOwogCQkKIAkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVSZXNvdXJjZS5pc1BlcnNpc3RhYmxlKCkpOwkJCiAJfQpAQCAtODQyLDExICs4MDUsMTAgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IGF0dHJpYnV0ZXMuZ2V0KDApOwogCQkKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZVJlc291cmNlLmlzRm9yUHJvcGVydHkoKSk7CisJCWFzc2VydFRydWUoYXR0cmlidXRlUmVzb3VyY2UuaXNQcm9wZXJ0eSgpKTsKIAkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGVSZXNvdXJjZS5pc1BlcnNpc3RhYmxlKCkpOy8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKIAogCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgidGVzdCIsICJGb28uamF2YSIsICJwdWJsaWMgY2xhc3MgRm9vIHt9Iik7Ci0JCXRoaXMuamF2YVJlc291cmNlTW9kZWwucmVzb2x2ZVR5cGVzKCk7CiAJCQogCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZVJlc291cmNlLmlzUGVyc2lzdGFibGUoKSk7CiAJfQpAQCAtODcyLDMzICs4MzQsMzMgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0SXNQdWJsaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlUHVibGljQXR0cmlidXRlKCk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJCi0JCWFzc2VydFRydWUoYXR0cmlidXRlLmlzUHVibGljKCkpOworCQlhc3NlcnRUcnVlKE1vZGlmaWVyLmlzUHVibGljKGF0dHJpYnV0ZS5nZXRNb2RpZmllcnMoKSkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0SXNQdWJsaWNGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVQYWNrYWdlQXR0cmlidXRlKCk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gdHlwZVJlc291cmNlLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKIAkJCi0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZS5pc1B1YmxpYygpKTsKKwkJYXNzZXJ0RmFsc2UoTW9kaWZpZXIuaXNQdWJsaWMoYXR0cmlidXRlLmdldE1vZGlmaWVycygpKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdElzRmluYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlRmluYWxBdHRyaWJ1dGUoKTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwogCQkKLQkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGUuaXNGaW5hbCgpKTsJCQorCQlhc3NlcnRUcnVlKE1vZGlmaWVyLmlzRmluYWwoYXR0cmlidXRlLmdldE1vZGlmaWVycygpKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RJc0ZpbmFsRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlUGFja2FnZUF0dHJpYnV0ZSgpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CiAJCQotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGUuaXNGaW5hbCgpKTsJCQorCQlhc3NlcnRGYWxzZShNb2RpZmllci5pc0ZpbmFsKGF0dHJpYnV0ZS5nZXRNb2RpZmllcnMoKSkpOwogCX0KIAkKIAkvL1RPRE8gYWRkIHRlc3RzIGZvciBKUFRUb29scyBzdGF0aWMgbWV0aG9kcwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEKaW5kZXggYWM2NGZmOC4uMDZiNmM5MyAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDExICsxMCwxMCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVudGl0eUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRW1iZWRkYWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRW50aXR5QW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFjY2Vzc1R5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247CkBAIC0yMyw0NCArMjIsMjIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyLkVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCQogCXB1YmxpYyBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwogCX0KIAkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsiKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRW1iZWRkYWJsZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRhYmxlIiwgIiIpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hcHBlZFN1cGVyY2xhc3MiLCAiIik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb257Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlNlY29uZGFyeVRhYmxlIiwgIlN0cmluZyBuYW1lKCk7Iik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJTZWNvbmRhcnlUYWJsZXMiLCAiIik7CQkKLQl9Ci0JCi0JCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTc0LDggKzUxLDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RJbnZhbGlkQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0KIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtOTQsOSArNjksNiBAQAogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE1lbWJlckVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVFbWJlZGRhYmxlQW5ub3RhdGlvbigpOwotCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTExOCw4ICs5MCw2IEBACiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlEdXBsaWNhdGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMjcsMTUgKzk3LDEzIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eShuYW1lPVwiRmlyc3RFbnRpdHlcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eShuYW1lPVwiU2Vjb25kRW50aXR5XCIpIik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5KG5hbWUgPSBcIkZpcnN0RW50aXR5XCIpIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkobmFtZSA9IFwiU2Vjb25kRW50aXR5XCIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQljcmVhdGVFbWJlZGRhYmxlQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xNTEsOSArMTE5LDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xNzIsOSArMTM3LDYgQEAKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwotCQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xOTEsMTAgKzE1Myw4IEBACiAJCQl9CiAJCX0pOwogCX0KKwogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRBbmRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMjE4LDkgKzE3OCw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTm9uUGVyc2lzdGFibGVNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZCIsICIiKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMjM4LDEwICsxOTUsNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZFBlcnNpc3RhYmxlTWV0aG9kTm9uUGVyc2lzdGFibGVGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIklkIiwgIiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJDb2x1bW4iLCAiIik7Ci0JCiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTI2Niw4ICsyMTksNiBAQAogCQl9KTsKIAl9CiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlOb1BlcnNpc3RhYmxlRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMzMyLDggKzI4Myw2IEBACiAJCiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUYWJsZSIsICJTdHJpbmcgbmFtZSgpOyBTdHJpbmcgc2NoZW1hKCk7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTM0Myw3ICsyOTIsNyBAQAogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CiAJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CiAJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZShuYW1lPVwiRk9PXCIsIHNjaGVtYT1cIkJBUlwiKSIpOworCQkJCXNiLmFwcGVuZCgiQFRhYmxlKG5hbWUgPSBcIkZPT1wiLCBzY2hlbWEgPSBcIkJBUlwiKSIpOwogCQkJfQogCQl9KTsKIAl9CkBAIC0zNzAsOCArMzE5LDYgQEAKIC8vCiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlNdWx0aXBsZVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRhYmxlIiwgIlN0cmluZyBuYW1lKCk7IFN0cmluZyBzY2hlbWEoKTsiKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMzgxLDE2ICszMjgsMTQgQEAKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewogCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwogCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGUobmFtZT1cIkZPT1wiKSIpOworCQkJCXNiLmFwcGVuZCgiQFRhYmxlKG5hbWUgPSBcIkZPT1wiKSIpOwogCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGUobmFtZT1cIkJBUlwiKSIpOworCQkJCXNiLmFwcGVuZCgiQFRhYmxlKG5hbWUgPSBcIkJBUlwiKSIpOwogCQkJfQogCQl9KTsKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC00MDAsMTQgKzM0NSwxMSBAQAogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CiAJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CiAJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpIik7CisJCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbXB0eVNlY29uZGFyeVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlNlY29uZGFyeVRhYmxlIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlNlY29uZGFyeVRhYmxlcyIsICJTZWNvbmRhcnlUYWJsZVtdIHZhbHVlKCk7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTQyMyw5ICszNjUsNiBAQAogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnRpdHlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlNlY29uZGFyeVRhYmxlIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlNlY29uZGFyeVRhYmxlcyIsICJTZWNvbmRhcnlUYWJsZVtdIHZhbHVlKCk7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTQzNSwxNSArMzc0LDEyIEBACiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKIAkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKIAkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiKSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiKSkiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aDJTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJTZWNvbmRhcnlUYWJsZSIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJTZWNvbmRhcnlUYWJsZXMiLCAiU2Vjb25kYXJ5VGFibGVbXSB2YWx1ZSgpOyIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC00NTMsMTUgKzM4OSwxMiBAQAogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CiAJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CiAJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKX0pIik7CisJCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpfSkiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlQW5kU2Vjb25kYXJ5VGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiU2Vjb25kYXJ5VGFibGUiLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiU2Vjb25kYXJ5VGFibGVzIiwgIlNlY29uZGFyeVRhYmxlW10gdmFsdWUoKTsiKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNDcxLDE2ICs0MDQsMTQgQEAKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewogCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwogCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiKSIpOworCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiKSIpOwogCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVpcIil9KSIpOworCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBWlwiKX0pIik7CiAJCQl9CiAJCX0pOwogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE1lbWJlclR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudGl0eUFubm90YXRpb24oKTsKLQogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC01MDYsNyArNDM3LDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0SmF2YVR5cGVBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlhc3NlcnRFcXVhbHMoMSwgdHlwZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uc1NpemUoKSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdEphdmFUeXBlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNTM5LDM3ICs0NzAsMzUgQEAKIAkKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGFibGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAotCQlUYWJsZUFubm90YXRpb24gdGFibGVSZXNvdXJjZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCXRhYmxlUmVzb3VyY2Uuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKG5hbWU9XCJGT09cIikiLCBjdSk7CisJCVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24gPSAoVGFibGVBbm5vdGF0aW9uKSBqcnB0LmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKKwkJdGFibGVBbm5vdGF0aW9uLnNldFNjaGVtYShudWxsKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZShuYW1lID0gXCJGT09cIikiLCBjdSk7CiAKLQkJdGFibGVSZXNvdXJjZS5zZXROYW1lKG51bGwpOworCQl0YWJsZUFubm90YXRpb24uc2V0TmFtZShudWxsKTsKIAkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZSIsIGN1KTsKIAkJCi0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKSk7CisJCWFzc2VydE51bGwoanJwdC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVUeXBlTWFwcGluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlKCk7Ci0JCWNyZWF0ZU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKCk7CiAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCQotCQlhc3NlcnRFcXVhbHMoMiwgdHlwZVJlc291cmNlLm1hcHBpbmdBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnNTaXplKCkpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuRU1CRUREQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuRU5USVRZKSk7CisJCWFzc2VydEVxdWFscygyLCB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnNTaXplKCkpOworCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5FTUJFRERBQkxFKSk7CisJCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkVOVElUWSkpOwogCQkKLQkJSmF2YVJlc291cmNlTm9kZSBqYXZhVHlwZU1hcHBpbmdBbm5vdGF0aW9uID0gdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZU5vZGUgamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbiA9IHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydFRydWUoamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIEVtYmVkZGFibGVBbm5vdGF0aW9uKTsKIAkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFbnRpdHkiLCBjdSk7CiAJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARW1iZWRkYWJsZSIsIGN1KTsKIAkJCi0JCXR5cGVSZXNvdXJjZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQlhc3NlcnRFcXVhbHMoMSwgdHlwZVJlc291cmNlLm1hcHBpbmdBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCWphdmFUeXBlTWFwcGluZ0Fubm90YXRpb24gPSB0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJdHlwZVJlc291cmNlLnNldFByaW1hcnlBbm5vdGF0aW9uKEpQQS5NQVBQRURfU1VQRVJDTEFTUywgbmV3IFN0cmluZ1swXSk7CisJCWFzc2VydEVxdWFscygxLCB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnNTaXplKCkpOworCQlqYXZhVHlwZU1hcHBpbmdBbm5vdGF0aW9uID0gdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0VHJ1ZShqYXZhVHlwZU1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24pOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEVudGl0eSIsIGN1KTsKIAkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBwZWRTdXBlcmNsYXNzIiwgY3UpOwpAQCAtNTc3LDI5ICs1MDYsMTUgQEAKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldEphdmFUeXBlTWFwcGluZ0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGUoKTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCWFzc2VydEVxdWFscygwLCB0eXBlUmVzb3VyY2UubWFwcGluZ0Fubm90YXRpb25zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uc1NpemUoKSk7CiAJCQotCQl0eXBlUmVzb3VyY2Uuc2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkVOVElUWSk7Ci0JCWFzc2VydFRydWUodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBFbnRpdHlBbm5vdGF0aW9uKTsKKwkJdHlwZVJlc291cmNlLnNldFByaW1hcnlBbm5vdGF0aW9uKEpQQS5FTlRJVFksIG5ldyBTdHJpbmdbMF0pOworCQlhc3NlcnRUcnVlKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSBpbnN0YW5jZW9mIEVudGl0eUFubm90YXRpb24pOwogCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVudGl0eSIsIGN1KTsKIAl9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SmF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZUFubm90YXRpb24oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCWFzc2VydFRydWUodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBFbnRpdHlBbm5vdGF0aW9uKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5zZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuRU1CRUREQUJMRSk7Ci0JCWFzc2VydFRydWUodHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBFbWJlZGRhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEVudGl0eSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSIsIGN1KTsKLQl9Ci0KIAlwdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YVR5cGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IApAQCAtNjI1LDIyICs1NDAsMjEgQEAKIAkJCiAJCXRlc3RUeXBlKGN1KS5lZGl0KG5ldyBFZGl0b3IoKSB7CiAJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkoKEVudGl0eUltcGwpIHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpKS5nZXREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCkucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7CisJCQkJU291cmNlRW50aXR5QW5ub3RhdGlvbi5ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7CiAJCQl9CiAJCX0pOwkKIAotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbWJlZGRhYmxlIiwgIlN0cmluZyBuYW1lKCk7Iik7CiAJCWN1LmNyZWF0ZUltcG9ydCgiamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkYWJsZSIsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwogCQkJCQogCQl0aGlzLnRlc3RUeXBlKGN1KS5lZGl0KG5ldyBFZGl0b3IoKSB7CiAJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFbWJlZGRhYmxlSW1wbC5ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7CisJCQkJU291cmNlRW1iZWRkYWJsZUFubm90YXRpb24uREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLm5ld01hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwogCQkJfQogCQl9KTsJCQogCQkKIAkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkVOVElUWSkpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuRU1CRUREQUJMRSkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpKTsKKwkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRU1CRUREQUJMRSkpOwogCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlIiwgY3UpOwogCX0KIAkKQEAgLTY4OCwxOSArNjAyLDE4IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwogCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJGT09cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpIiwgY3UpOwogCX0KIAkKIAkvLyAgQEVudGl0eSAgICAgCQkJCS0tPj4gICAgQEVudGl0eQogCS8vCUBTZWNvbmRhcnlUYWJsZShuYW1lPSJGT08iKQkJCUBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPSJGT08iKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9IkJBUiIpfSkJCiAJcHVibGljIHZvaWQgdGVzdEFkZEphdmFUeXBlQW5ub3RhdGlvbk5lc3RhYmxlQ29udGFpbmVyMigpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQljcmVhdGVTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKCk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCQogCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKIAkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpLEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpLEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKIAkJCiAJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSkpOwogCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKSk7CkBAIC03MTksNyArNjMyLDcgQEAKIAkJCiAJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwogCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9XCJGT09cIiksQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiksQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKX0pIiwgY3UpOwogCQkKIAkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKSk7CiAJCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpKTsKQEAgLTczMiw3ICs2NDUsNyBAQAogCQkKIAkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7CiAJCXNlY29uZGFyeVRhYmxlUmVzb3VyY2Uuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKSxAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKSxAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7CiAJCQogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKIAkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUykpOwpAQCAtNzQ1LDcgKzY1OCw3IEBACiAJCQogCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKIAkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFSXCIpLEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpLEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIil9KSIsIGN1KTsKIAkJCiAJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSkpOwogCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKSk7CkBAIC03NTMsNyArNjY2LDcgQEAKIAogCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwogCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVpcIiksQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVJcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFaXCIpLEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIil9KSIsIGN1KTsKIAogCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKSkpOwogCX0KQEAgLTc3NSwxNCArNjg4LDE0IEBACiAJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpKSk7CiAKIAkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVpcIiksIEBTZWNvbmRhcnlUYWJsZX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBWlwiKSwgQFNlY29uZGFyeVRhYmxlfSkiLCBjdSk7CiAJCXNlY29uZGFyeVRhYmxlUmVzb3VyY2Uuc2V0TmFtZSgiQk9PIik7CiAJCQogCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKIAkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUykpOwogCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKSkpOwogCi0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbnMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbnMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwogCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9ucy5uZXh0KCk7CQogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKIAkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbnMubmV4dCgpOwkKQEAgLTc5MCw3ICs3MDMsNyBAQAogCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9ucy5uZXh0KCk7CQogCQlhc3NlcnRFcXVhbHMoIkJPTyIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVpcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiQk9PXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFaXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQk9PXCIpfSkiLCBjdSk7CiAJfQogCiAJLy9ARW50aXR5CkBAIC04MjMsOCArNzM2LDggQEAKIAkKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwogCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiIiwgY3UpOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiIiwgY3UpOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlcyIsIGN1KTsKIAl9CiAJCkBAIC04MzQsMTAgKzc0NywxMCBAQAogCQogCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwogCQluZXdBbm5vdGF0aW9uLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9XCJGT09cIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFSXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBWiIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVoiLCBjdSk7CiAJCQogCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVpcIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVpcIil9KSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vdmVKYXZhVHlwZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTg0NiwxMCArNzU5LDEwIEBACiAJCiAJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbil0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7CiAJCW5ld0Fubm90YXRpb24uc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVJcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFaXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFaXCIpfSkiLCBjdSk7CiAJCQotCQl0eXBlUmVzb3VyY2UubW92ZSgwLCAyLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBWlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJGT09cIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCXR5cGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigwLCAyLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFaXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpfSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSmF2YVR5cGVBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtODU4LDM1ICs3NzEsMzAgQEAKIAkKIAkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKXR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDIsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKIAkJbmV3QW5ub3RhdGlvbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBUlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVpcIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVpcIil9KSIsIGN1KTsKIAkJCi0JCXR5cGVSZXNvdXJjZS5tb3ZlKDIsIDAsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFSXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkJBWlwiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJGT09cIil9KSIsIGN1KTsKKwkJdHlwZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVpcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIil9KSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE5lc3RlZFR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aE1lbWJlclR5cGVzKCk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJCi0JCWFzc2VydEVxdWFscygib25seSBwZXJzaXN0YWJsZSB0eXBlcyBzaG91bGQgYmUgcmV0dXJuZWQgYnkgbmVzdGVkVHlwZXMoKSIsIDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbnRUeXBlLm5lc3RlZFR5cGVzKCkpKTsKLQkJCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlMaXN0PEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiBuZXN0ZWRUeXBlcyA9IChMaXN0PEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPikgQ2xhc3NUb29scy5maWVsZFZhbHVlKHBlcnNpc3RlbnRUeXBlLCAibmVzdGVkVHlwZXMiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZW51bXMgYW5kIGludGVyZmFjZXMgc2hvdWxkIGJlIGlnbm9yZWQiLCAyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShuZXN0ZWRUeXBlcykpOwotCQkKKwkJYXNzZXJ0RXF1YWxzKCJvbmx5IHBlcnNpc3RhYmxlIHR5cGVzIHNob3VsZCBiZSByZXR1cm5lZCBieSAjcGVyc2lzdGFibGVUeXBlcygpIiwgMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVudFR5cGUucGVyc2lzdGFibGVUeXBlcygpKSk7CisJCWFzc2VydEVxdWFscygiZW51bXMgYW5kIGludGVyZmFjZXMgc2hvdWxkIGJlIGlnbm9yZWQiLCAyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW50VHlwZS50eXBlcygpKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVFbnRpdHlBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eUR1cGxpY2F0ZXMoKTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwogCQkKLQkJRW50aXR5QW5ub3RhdGlvbiBqYXZhVHlwZU1hcHBpbmdBbm5vdGF0aW9uID0gKEVudGl0eUFubm90YXRpb24pIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOworCQlFbnRpdHlBbm5vdGF0aW9uIGphdmFUeXBlTWFwcGluZ0Fubm90YXRpb24gPSAoRW50aXR5QW5ub3RhdGlvbikgcGVyc2lzdGVudFR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRU5USVRZKTsKIAkJYXNzZXJ0RXF1YWxzKCJGaXJzdEVudGl0eSIsIGphdmFUeXBlTWFwcGluZ0Fubm90YXRpb24uZ2V0TmFtZSgpKTsKIAkJCi0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW50VHlwZS5tYXBwaW5nQW5ub3RhdGlvbnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcGVyc2lzdGVudFR5cGUuYW5ub3RhdGlvbnNTaXplKCkpOwogCQkKLQkJamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbiA9IChFbnRpdHlBbm5vdGF0aW9uKSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOworCQlqYXZhVHlwZU1hcHBpbmdBbm5vdGF0aW9uID0gKEVudGl0eUFubm90YXRpb24pIHBlcnNpc3RlbnRUeXBlLmdldEFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRFcXVhbHMoIkZpcnN0RW50aXR5IiwgamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbi5nZXROYW1lKCkpOwogCQkKIAl9CkBAIC05NjIsMTAgKzg3MCwzOSBAQAogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBwZXJzaXN0ZW50VHlwZS5nZXRTdXBlckNsYXNzUXVhbGlmaWVkTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgcGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKSk7CiAJCQogCX0KIAkKKwlwdWJsaWMgdm9pZCB0ZXN0SXNBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50VHlwZS5pc0Fubm90YXRlZCgpKTsKKwkJCisJCXBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oSlBBLkVOVElUWSk7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRUeXBlLmlzQW5ub3RhdGVkKCkpOworCQkKKwkJcGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbihKUEEuVEFCTEUpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRUeXBlLmlzQW5ub3RhdGVkKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0SXNNYXBwZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50VHlwZS5pc01hcHBlZCgpKTsKKwkJCisJCXBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24oSlBBLkVOVElUWSk7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRUeXBlLmlzTWFwcGVkKCkpOworCQkKKwkJcGVyc2lzdGVudFR5cGUuYWRkQW5ub3RhdGlvbihKUEEuVEFCTEUpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50VHlwZS5pc01hcHBlZCgpKTsKKwkJCisJCXBlcnNpc3RlbnRUeXBlLmFkZEFubm90YXRpb24oSlBBLkVNQkVEREFCTEUpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRUeXBlLmlzTWFwcGVkKCkpOworCX0KKwkKIAkvL21vcmUgZGV0YWlsZWQgdGVzdHMgaW4gSlBUVG9vbHNUZXN0cwogCXB1YmxpYyB2b2lkIHRlc3RJc1BlcnNpc3RhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7CkBAIC05NzcsMjIgKzkxNCwyMiBAQAogCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0ZWRNZW1iZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoTWVtYmVyRW1iZWRkYWJsZSgpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLkVOVElUWSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuRU1CRUREQUJMRSkpOworCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuRU1CRUREQUJMRSkpOwogCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgbmVzdGVkVHlwZSA9IHR5cGVSZXNvdXJjZS5uZXN0ZWRUeXBlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChuZXN0ZWRUeXBlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5FTlRJVFkpKTsKLQkJYXNzZXJ0Tm90TnVsbChuZXN0ZWRUeXBlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5FTUJFRERBQkxFKSk7CQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBuZXN0ZWRUeXBlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlVHlwZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwobmVzdGVkVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpKTsKKwkJYXNzZXJ0Tm90TnVsbChuZXN0ZWRUeXBlLmdldEFubm90YXRpb24oSlBBLkVNQkVEREFCTEUpKTsJCiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEludmFsaWRBbm5vdGF0aW9ucygpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlhc3NlcnRFcXVhbHMoMCwgdHlwZVJlc291cmNlLm1hcHBpbmdBbm5vdGF0aW9uc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnNTaXplKCkpOwogCQlhc3NlcnRFcXVhbHMoMCwgdHlwZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKIAkJCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlUmVzb3VyY2UubWFwcGluZ0Fubm90YXRpb25zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zU2l6ZSgpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uVGVzdHMuamF2YQppbmRleCAxZjRhMTkzLi5jMTdhZmY1IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtblRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5UZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE3LDYgKzE3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBKb2luQ29sdW1uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAkKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKQEAgLTI3LDIxICsyOCw4IEBACiAJcHVibGljIEpvaW5Db2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewogCQlzdXBlcihuYW1lKTsKIAl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7ICIgKwotCQkJImJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7ICIgKwotCQkJImJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsgIiArCi0JCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7ICIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgdGFibGUoKSBkZWZhdWx0IFwiXCI7ICIpOwotCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC01NSw3ICs0Myw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTYzLDEzICs1MCwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1uKG5hbWU9XCIiICsgQ09MVU1OX05BTUUgKyAiXCIpIik7CisJCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbihuYW1lID0gXCIiICsgQ09MVU1OX05BTUUgKyAiXCIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNzcsMTMgKzYzLDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW4odGFibGU9XCIiICsgQ09MVU1OX1RBQkxFICsgIlwiKSIpOworCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW4odGFibGUgPSBcIiIgKyBDT0xVTU5fVEFCTEUgKyAiXCIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtOTEsMTMgKzc2LDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWU9XCIiICsgQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgKyAiXCIpIik7CisJCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbihyZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiIiArIENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FICsgIlwiKSIpOwogCQkJfQogCQl9KTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTA1LDEzICs4OSwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb249XCIiICsgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OICsgIlwiKSIpOworCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudChmaW5hbCBTdHJpbmcgYm9vbGVhbkVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMTksNyArMTAyLDcgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbigiICsgYm9vbGVhbkVsZW1lbnQgKyAiPXRydWUpIik7CisJCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbigiICsgYm9vbGVhbkVsZW1lbnQgKyAiID0gdHJ1ZSkiKTsKIAkJCX0KIAkJfSk7CiAJfQpAQCAtMTYxLDcgKzE0NCw3IEBACiAJCWNvbHVtbi5zZXROYW1lKCJGb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0TmFtZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbihuYW1lPVwiRm9vXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW4obmFtZSA9IFwiRm9vXCIpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE5OCw3ICsxODEsNyBAQAogCQljb2x1bW4uc2V0VGFibGUoIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRUYWJsZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbih0YWJsZT1cIkZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKHRhYmxlID0gXCJGb29cIikiLCBjdSk7CiAKIAkJCiAJCWNvbHVtbi5zZXRUYWJsZShudWxsKTsKQEAgLTIyNSw3ICsyMDgsNyBAQAogCQljb2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbihyZWZlcmVuY2VkQ29sdW1uTmFtZT1cIkZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJGb29cIikiLCBjdSk7CiAKIAkJCiAJCWNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKQEAgLTI1Miw3ICsyMzUsNyBAQAogCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiRm9vIik7CiAJCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbj1cIkZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIkZvb1wiKSIsIGN1KTsKIAogCQkKIAkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7CkBAIC0yNjUsNyArMjQ4LDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwogCi0JCWFzc2VydFRydWUoY29sdW1uLmdldFVuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFVuaXF1ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjc3LDEwICsyNjAsMTAgQEAKIAkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwogCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVbmlxdWUoKSk7CiAKLQkJY29sdW1uLnNldFVuaXF1ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGNvbHVtbi5nZXRVbmlxdWUoKSk7CisJCWNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0VW5pcXVlKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKHVuaXF1ZT1mYWxzZSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbih1bmlxdWUgPSBmYWxzZSkiLCBjdSk7CiAJCQogCQljb2x1bW4uc2V0VW5pcXVlKG51bGwpOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4iLCBjdSk7CkBAIC0yOTIsNyArMjc1LDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwogCi0JCWFzc2VydFRydWUoY29sdW1uLmdldE51bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0TnVsbGFibGUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzA0LDEwICsyODcsMTAgQEAKIAkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwogCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKIAotCQljb2x1bW4uc2V0TnVsbGFibGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0TnVsbGFibGUoKSk7CisJCWNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbihudWxsYWJsZT1mYWxzZSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbihudWxsYWJsZSA9IGZhbHNlKSIsIGN1KTsKIAkJCiAJCWNvbHVtbi5zZXROdWxsYWJsZShudWxsKTsKIAkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uIiwgY3UpOwpAQCAtMzE5LDcgKzMwMiw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKIAotCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTMzMSwxMCArMzE0LDEwIEBACiAJCWFzc2VydE5vdE51bGwoY29sdW1uKTsKIAkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKIAotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOworCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKGluc2VydGFibGU9ZmFsc2UpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW4oaW5zZXJ0YWJsZSA9IGZhbHNlKSIsIGN1KTsKIAkJCiAJCWNvbHVtbi5zZXRJbnNlcnRhYmxlKG51bGwpOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4iLCBjdSk7CkBAIC0zNDYsNyArMzI5LDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwogCi0JCWFzc2VydFRydWUoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzU4LDEwICszNDEsMTAgQEAKIAkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwogCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7CiAKLQkJY29sdW1uLnNldFVwZGF0YWJsZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7CisJCWNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKHVwZGF0YWJsZT1mYWxzZSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbih1cGRhdGFibGUgPSBmYWxzZSkiLCBjdSk7CiAJCQogCQljb2x1bW4uc2V0VXBkYXRhYmxlKG51bGwpOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4iLCBjdSk7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtbnNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5zVGVzdHMuamF2YQppbmRleCBlN2M3MzQzLi42YTQ4OTAyIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtbnNUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uc1Rlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsMTUgKzEwLDE3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSm9pbkNvbHVtbnNUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCQogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwpAQCAtMjksMjcgKzMxLDggQEAKIAlwdWJsaWMgSm9pbkNvbHVtbnNUZXN0cyhTdHJpbmcgbmFtZSkgewogCQlzdXBlcihuYW1lKTsKIAl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAKLQkJCSJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7ICIgKwotCQkJImJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7ICIgKwotCQkJImJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsgIiArCi0JCQkiYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7ICIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgdGFibGUoKSBkZWZhdWx0IFwiXCI7ICIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSm9pbkNvbHVtbnNBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgCi0JCQkiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uc0Fubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNjMsNyArNDYsNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uc0Fubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNzEsMTMgKzUzLDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKG5hbWU9XCIiICsgQ09MVU1OX05BTUUgKyAiXCIpKSIpOworCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKG5hbWUgPSBcIiIgKyBDT0xVTU5fTkFNRSArICJcIikpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbnNBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTg1LDEzICs2NiwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbih0YWJsZT1cIiIgKyBDT0xVTU5fVEFCTEUgKyAiXCIpKSIpOworCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKHRhYmxlID0gXCIiICsgQ09MVU1OX1RBQkxFICsgIlwiKSkiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uc0Fubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtOTksMTMgKzc5LDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lPVwiIiArIENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FICsgIlwiKSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbihyZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiIiArIENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FICsgIlwiKSkiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUpvaW5Db2x1bW5zQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMTMsMTMgKzkyLDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb249XCIiICsgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OICsgIlwiKSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCIiICsgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OICsgIlwiKSkiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudChmaW5hbCBTdHJpbmcgYm9vbGVhbkVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uc0Fubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTI3LDEzICsxMDUsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4oIiArIGJvb2xlYW5FbGVtZW50ICsgIj10cnVlKSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbigiICsgYm9vbGVhbkVsZW1lbnQgKyAiID0gdHJ1ZSkpIik7CiAJCQl9CiAJCX0pOwogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVKb2luQ29sdW1uc0Fubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTQxLDcgKzExOCw3IEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpIik7CisJCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSIpOwogCQkJfQogCQl9KTsKIAl9CkBAIC0xODIsNyArMTU5LDcgQEAKIAkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbihuYW1lPVwiRm9vXCIpKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbihuYW1lID0gXCJGb29cIikpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIxOSw3ICsxOTYsNyBAQAogCQljb2x1bW4uc2V0VGFibGUoIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRUYWJsZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4odGFibGU9XCJGb29cIikpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKHRhYmxlID0gXCJGb29cIikpIiwgY3UpOwogCiAJCQogCQljb2x1bW4uc2V0VGFibGUobnVsbCk7CkBAIC0yNDYsNyArMjIzLDcgQEAKIAkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJGb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lPVwiRm9vXCIpKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbihyZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiRm9vXCIpKSIsIGN1KTsKIAogCQkKIAkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwpAQCAtMjczLDcgKzI1MCw3IEBACiAJCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJGb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbj1cIkZvb1wiKSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiRm9vXCIpKSIsIGN1KTsKIAogCQkKIAkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7CkBAIC0yODYsNyArMjYzLDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKS5uZXh0KCk7CiAKLQkJYXNzZXJ0VHJ1ZShjb2x1bW4uZ2V0VW5pcXVlKCkpOworCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXRVbmlxdWUoKS5ib29sZWFuVmFsdWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTI5OCwxMCArMjc1LDEwIEBACiAJCWFzc2VydE5vdE51bGwoY29sdW1uKTsKIAkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VW5pcXVlKCkpOwogCi0JCWNvbHVtbi5zZXRVbmlxdWUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0VW5pcXVlKCkpOworCQljb2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0VW5pcXVlKCkuYm9vbGVhblZhbHVlKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbih1bmlxdWU9ZmFsc2UpKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbih1bmlxdWUgPSBmYWxzZSkpIiwgY3UpOwogCQkKIAkJY29sdW1uLnNldFVuaXF1ZShudWxsKTsKIAkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uIiwgY3UpOwpAQCAtMzEzLDcgKzI5MCw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUykubmV4dCgpOwogCi0JCWFzc2VydFRydWUoY29sdW1uLmdldE51bGxhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXROdWxsYWJsZSgpLmJvb2xlYW5WYWx1ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0zMjUsMTAgKzMwMiwxMCBAQAogCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7CiAJCWFzc2VydE51bGwoY29sdW1uLmdldE51bGxhYmxlKCkpOwogCi0JCWNvbHVtbi5zZXROdWxsYWJsZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKKwkJY29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0TnVsbGFibGUoKS5ib29sZWFuVmFsdWUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKG51bGxhYmxlPWZhbHNlKSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4obnVsbGFibGUgPSBmYWxzZSkpIiwgY3UpOwogCQkKIAkJY29sdW1uLnNldE51bGxhYmxlKG51bGwpOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4iLCBjdSk7CkBAIC0zNDAsNyArMzE3LDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKS5uZXh0KCk7CiAKLQkJYXNzZXJ0VHJ1ZShjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTM1MiwxMCArMzI5LDEwIEBACiAJCWFzc2VydE5vdE51bGwoY29sdW1uKTsKIAkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKIAotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOworCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RmFsc2UoY29sdW1uLmdldEluc2VydGFibGUoKS5ib29sZWFuVmFsdWUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKGluc2VydGFibGU9ZmFsc2UpKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbihpbnNlcnRhYmxlID0gZmFsc2UpKSIsIGN1KTsKIAkJCiAJCWNvbHVtbi5zZXRJbnNlcnRhYmxlKG51bGwpOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4iLCBjdSk7CkBAIC0zNjcsNyArMzQ0LDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKS5uZXh0KCk7CiAKLQkJYXNzZXJ0VHJ1ZShjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXRVcGRhdGFibGUoKS5ib29sZWFuVmFsdWUoKSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTM3OSwxMCArMzU2LDEwIEBACiAJCWFzc2VydE5vdE51bGwoY29sdW1uKTsKIAkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwogCi0JCWNvbHVtbi5zZXRVcGRhdGFibGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOworCQljb2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0VXBkYXRhYmxlKCkuYm9vbGVhblZhbHVlKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbih1cGRhdGFibGU9ZmFsc2UpKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhASm9pbkNvbHVtbih1cGRhdGFibGUgPSBmYWxzZSkpIiwgY3UpOwogCQkKIAkJY29sdW1uLnNldFVwZGF0YWJsZShudWxsKTsKIAkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uIiwgY3UpOwpAQCAtMzk3LDcgKzM3NCw3IEBACiAJCQogCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUyk7CiAJCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoe0BKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiKSxASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoe0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIpLEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwogCQkKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OUykpOwpAQCAtNDExLDEzICszODgsMTMgQEAKIAkJCiAJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKIAkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyh7QEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIpLEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyh7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiksQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7CiAJCQkJCiAJCWpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKIAkJam9pbkNvbHVtbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyh7QEpvaW5Db2x1bW4obmFtZT1cIkJBWlwiKSxASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiksIEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyh7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFaXCIpLEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSIsIGN1KTsKIAotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VOb2RlPiBqb2luQ29sdW1ucyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUyk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtbnMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwpAQCAtNDM1LDEwICs0MTIsMTAgQEAKIAkJCiAJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKIAkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyh7QEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIpLEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyh7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiksQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7CiAJCQogCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiKSIsIGN1KTsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5UYWJsZVRlc3RzLmphdmEKaW5kZXggNmY3YjQxZi4uNDVhY2JkNSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5UYWJsZVRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5UYWJsZVRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNyArMTAsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CkBAIC0xOSw2ICsxOCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBKb2luVGFibGVUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCQogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gIk1ZX1RBQkxFIjsKQEAgLTI4LDMxICsyOCw4IEBACiAJcHVibGljIEpvaW5UYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwogCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVKb2luQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJCSJTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkJImJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsiICsKLQkJCQkiYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCQkiYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOyIgKwotCQkJCSJib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsiICsKLQkJCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7IiArCi0JCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIjsiKTsKLQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlVuaXF1ZUNvbnN0cmFpbnQiLCAiU3RyaW5nW10gY29sdW1uTmFtZXMoKTsiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvaW5UYWJsZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pbkNvbHVtbkFubm90YXRpb24oKTsKLQkJY3JlYXRlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pblRhYmxlIiwgIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgXCJcIjsgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjtKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OyBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsiKTsKLQl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pblRhYmxlQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02Niw3ICs0Myw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pblRhYmxlV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pblRhYmxlQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC03NCwxMyArNTAsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pblRhYmxlKG5hbWU9XCIiICsgVEFCTEVfTkFNRSArICJcIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBKb2luVGFibGUobmFtZSA9IFwiIiArIFRBQkxFX05BTUUgKyAiXCIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pblRhYmxlQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC04OSwxMyArNjQsMTIgQEAKIAkJCQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luVGFibGUoc2NoZW1hPVwiIiArIFNDSEVNQV9OQU1FICsgIlwiKSIpOworCQkJCXNiLmFwcGVuZCgiQEpvaW5UYWJsZShzY2hlbWEgPSBcIiIgKyBTQ0hFTUFfTkFNRSArICJcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pblRhYmxlV2l0aENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlSm9pblRhYmxlQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMDMsMTMgKzc3LDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5UYWJsZShjYXRhbG9nPVwiIiArIENBVEFMT0dfTkFNRSArICJcIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBKb2luVGFibGUoY2F0YWxvZyA9IFwiIiArIENBVEFMT0dfTkFNRSArICJcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUpvaW5UYWJsZUFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTE3LDEzICs5MCwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSl9KSIpOworCQkJCXNiLmFwcGVuZCgiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUpvaW5UYWJsZUFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTMxLDEzICsxMDMsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pblRhYmxlKGpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLCBASm9pbkNvbHVtbn0pIik7CisJCQkJc2IuYXBwZW5kKCJASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSIpOwogCQkJfQogCQl9KTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUpvaW5UYWJsZUFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTQ1LDcgKzExNiw3IEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiksIEBKb2luQ29sdW1ufSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSIpOwogCQkJfQogCQl9KTsKIAl9CkBAIC0xODQsNyArMTU1LDcgQEAKIAkJdGFibGUuc2V0TmFtZSgiRm9vIik7CiAJCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0TmFtZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKG5hbWU9XCJGb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yMjMsNyArMTk0LDcgQEAKIAkJdGFibGUuc2V0Q2F0YWxvZygiRm9vIik7CiAJCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGNhdGFsb2c9XCJGb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGNhdGFsb2cgPSBcIkZvb1wiKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldENhdGFsb2dOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yNjIsNyArMjMzLDcgQEAKIAkJdGFibGUuc2V0U2NoZW1hKCJGb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXRTY2hlbWEoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShzY2hlbWE9XCJGb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKHNjaGVtYSA9IFwiRm9vXCIpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzI4LDcgKzI5OSw3IEBACiAJCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lc1NpemUoKSk7CiAKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiQkFSXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiRk9PXCIpLCBAVW5pcXVlQ29uc3RyYWludH0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFSXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50fSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0zNDYsMTIgKzMxNywxMiBAQAogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFaXCJ9KX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pIiwgY3UpOwogCQkKIAkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoMSwgdGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPUBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSkiLCBjdSk7CiAJCQogCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwogCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwkJCkBAIC0zNjQsMTAgKzMzNSwxMCBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCiAJCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVpcIn0pfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSIsIGN1KTsKIAkJCiAJCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFSXCJ9KX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pfSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTM3NiwxMCArMzQ3LDEwIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKIAkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSl9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pIiwgY3UpOwogCQkKIAkJdGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJGT09cIn0pfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSl9KSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC00MzAsNyArNDAxLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiksQEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTQ1MCwxMiArNDIxLDEyIEBACiAJCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7CiAJCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygyLCB0YWJsZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7CiAKIAkJdGFibGUucmVtb3ZlSm9pbkNvbHVtbigwKTsKIAkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKSIsIGN1KTsKIAogCQkKIAkJdGFibGUucmVtb3ZlSm9pbkNvbHVtbigwKTsKQEAgLTQ3OSwxNCArNDUwLDE0IEBACiAJCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7CiAJCXRhYmxlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwogCiAJCXRhYmxlLm1vdmVKb2luQ29sdW1uKDIsIDApOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwogCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuam9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC01MDcsNyArNDc4LDcgQEAKIAkJCiAJCXRhYmxlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwogCiAKIAkJdGFibGUubW92ZUpvaW5Db2x1bW4oMCwgMik7CkBAIC01MTUsNyArNDg2LDcgQEAKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoam9pbkNvbHVtbnM9e0BKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIil9KSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldEpvaW5Db2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC01MzQsNyArNTA1LDcgQEAKIAkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cImZvb1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiZm9vXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RJbnZlcnNlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTU4NSw3ICs1NTYsNyBAQAogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmludmVyc2VKb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7CiAJCWFzc2VydE51bGwodGFibGUuaW52ZXJzZUpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnM9e0BKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiksQEpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNjAzLDE0ICs1NzQsMTQgQEAKIAkJYXNzZXJ0RmFsc2UoaW52ZXJzZUpvaW5Db2x1bW5zLmhhc05leHQoKSk7CiAJCQogCQl0YWJsZS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLCBASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwogCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRGYWxzZShpbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKIAogCQl0YWJsZS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9XCJGT09cIikpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIikpIiwgY3UpOwogCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CiAJCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwpAQCAtNjM4LDcgKzYwOSw3IEBACiAJCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucz17QEpvaW5Db2x1bW4obmFtZT1cIkJBUlwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWU9XCJGT09cIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZUludmVyc2VKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNjYwLDcgKzYzMSw3IEBACiAJCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKIAotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnM9e0BKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLCBASm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldEludmVyc2VKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNjc5LDcgKzY1MCw3IEBACiAJCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zPXtASm9pbkNvbHVtbihuYW1lPVwiZm9vXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiZm9vXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwYUNvbXBpbGF0aW9uVW5pdFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnBhQ29tcGlsYXRpb25Vbml0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1ZmQyNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnBhQ29tcGlsYXRpb25Vbml0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSnBhQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKcGFDb21waWxhdGlvblVuaXRUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEpwYUNvbXBpbGF0aW9uVW5pdFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgYnVpbGRKYXZhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0SnBhUHJvamVjdChwcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsgIC8vIGZhbHNlID0gbm8gYXV0by1idWlsZAotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgYW5ub3RhdGlvbkJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiamF2YXgucGVyc2lzdGVuY2UiLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHsgIiArIGFubm90YXRpb25Cb2R5ICsgIiB9Iik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkVudGl0eSIsICJTdHJpbmcgbmFtZSgpOyIpOwotCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhQ29tcGlsYXRpb25Vbml0IGdldEpwYUNvbXBpbGF0aW9uVW5pdFJlc291cmNlKElDb21waWxhdGlvblVuaXQgdGVzdENvbXBpbGF0aW9uVW5pdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSAoKFRlc3RKcGFQcm9qZWN0KSB0aGlzLmphdmFQcm9qZWN0KS5nZXRKcGFQcm9qZWN0KCk7Ci0JCUpwYUZpbGUganBhRmlsZSA9IGpwYVByb2plY3QuZ2V0SnBhRmlsZSgoSUZpbGUpIHRlc3RDb21waWxhdGlvblVuaXQuZ2V0UmVzb3VyY2UoKSk7Ci0JCUphdmFSZXNvdXJjZU1vZGVsIGphdmFSZXNvdXJjZU1vZGVsID0gKEphdmFSZXNvdXJjZU1vZGVsKSBqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKTsKLQkJcmV0dXJuIGphdmFSZXNvdXJjZU1vZGVsLmdldEpwYUNvbXBpbGF0aW9uVW5pdCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGVyc2lzdGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhQ29tcGlsYXRpb25Vbml0IGpwYUNvbXBpbGF0aW9uVW5pdCA9IGdldEpwYUNvbXBpbGF0aW9uVW5pdFJlc291cmNlKGNvbXBpbGF0aW9uVW5pdCk7Ci0JCQotCQlhc3NlcnRUcnVlKGpwYUNvbXBpbGF0aW9uVW5pdC5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBFbnRpdHlBbm5vdGF0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcHRKYXZhUmVzb3VyY2VUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwdEphdmFSZXNvdXJjZVRlc3RzLmphdmEKaW5kZXggNzgxYTA2MC4uMDY1YzRhYyAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwdEphdmFSZXNvdXJjZVRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwdEphdmFSZXNvdXJjZVRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTUsMTQgKzE1LDcgQEAKIHB1YmxpYyBjbGFzcyBKcHRKYXZhUmVzb3VyY2VUZXN0cyB7CiAKIAlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBzdWl0ZSh0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKGJvb2xlYW4gYWxsKSB7CiAJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0SmF2YVJlc291cmNlVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKGFsbCkgewotCQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpwYUNvbXBpbGF0aW9uVW5pdFRlc3RzLmNsYXNzKTsKLQkJfQogCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVUZXN0cy5jbGFzcyk7CiAJCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuY2xhc3MpOwogCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSlBUVG9vbHNUZXN0cy5jbGFzcyk7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTG9iVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Mb2JUZXN0cy5qYXZhCmluZGV4IGRhMjI5OGQuLjdjMDAzYTMgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Mb2JUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Mb2JUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE3LDYgKzE3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIExvYlRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAKIAlwdWJsaWMgTG9iVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTI0LDcgKzI1LDYgQEAKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdExvYigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJMb2IiLCAiIik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYW55VG9NYW55VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYW55VG9NYW55VGVzdHMuamF2YQppbmRleCBmZDZiMWEzLi41YmJiYTg3IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvTWFueVRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBNYW55VG9NYW55VGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAkKIAlwdWJsaWMgTWFueVRvTWFueVRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0yNSw4ICsyNiw2IEBACiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hbnlUb01hbnkiLCAiRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBGZXRjaFR5cGUuTEFaWTsgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNDAsOCArMzksNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFueVRvTWFueSIsICJGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEZldGNoVHlwZS5MQVpZOyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJGZXRjaFR5cGUiLCAiRUFHRVIsIExBWlkiKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNDksMTMgKzQ2LDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkoZmV0Y2g9RmV0Y2hUeXBlLkVBR0VSKSIpOworCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkoZmV0Y2ggPSBGZXRjaFR5cGUuRUFHRVIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hbnlUb01hbnkiLCAiQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOyAiKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNjMsMTQgKzU5LDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkodGFyZ2V0RW50aXR5PUFubm90YXRpb25UZXN0VHlwZS5jbGFzcykiKTsKKwkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KHRhcmdldEVudGl0eSA9IEFubm90YXRpb25UZXN0VHlwZS5jbGFzcykiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvTWFueVdpdGhNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9NYW55IiwgIlN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHRcIlwiOyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNzgsMTQgKzcyLDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkobWFwcGVkQnk9XCJmb29cIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KG1hcHBlZEJ5ID0gXCJmb29cIikiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvTWFueVdpdGhDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hbnlUb01hbnkiLCAiQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtOTMsMTQgKzg1LDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkoY2FzY2FkZT1DYXNjYWRlVHlwZS5BTEwpIik7CisJCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIpOwogCQkJfQogCQl9KTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9NYW55IiwgIkNhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQgPSB7fTsiKTsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiQ2FzY2FkZVR5cGUiLCAiQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIIik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTEwOCwxNCArOTgsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueShjYXNjYWRlPXtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFfSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRX0pIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9NYW55IiwgIkNhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQgPSB7fTsiKTsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiQ2FzY2FkZVR5cGUiLCAiQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIIik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTEyMyw3ICsxMTEsNyBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KGNhc2NhZGU9e0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5NRVJHRX0pIik7CisJCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueShjYXNjYWRlID0ge0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5NRVJHRX0pIik7CiAJCQl9CiAJCX0pOwogCX0KQEAgLTEzMyw3ICsxMjEsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKKwkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKIAkJYXNzZXJ0Tm90TnVsbChtYW55VG9NYW55KTsKIAl9CiAJCkBAIC0xNDIsNyArMTMwLDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKKwkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKIAl9CiAKQEAgLTE1MSwxMyArMTM5LDEzIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CisJCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7CiAJCQogCQltYW55VG9NYW55LnNldEZldGNoKEZldGNoVHlwZS5MQVpZKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBtYW55VG9NYW55LmdldEZldGNoKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGZldGNoPUxBWlkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoZmV0Y2ggPSBMQVpZKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldEZldGNoTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTY1LDcgKzE1Myw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CisJCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7CiAJCQogCQltYW55VG9NYW55LnNldEZldGNoKG51bGwpOwpAQCAtMTgwLDcgKzE2OCw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CisJCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwogCX0KIAkKQEAgLTE4OSwxMiArMTc3LDEyIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CisJCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CiAJCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwogCQkKIAkJbWFueVRvTWFueS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KHRhcmdldEVudGl0eT1Gb28uY2xhc3MpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIwMiw3ICsxOTAsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOworCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwogCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKIAkJCiAJCW1hbnlUb01hbnkuc2V0VGFyZ2V0RW50aXR5KG51bGwpOwpAQCAtMjE3LDE2ICsyMDUsMTYgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIG1hbnlUb01hbnkuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSk7CisJCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CisJCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBtYW55VG9NYW55LmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkpOwogCQkKIAkJbWFueVRvTWFueS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KHRhcmdldEVudGl0eT1Gb28uY2xhc3MpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKIAkJCiAJCWFzc2VydEVxdWFscygiRm9vIiwgbWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG1hbnlUb01hbnkuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBtYW55VG9NYW55LmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkpOyAvL2J1ZyAxOTYyMDAgY2hhbmdlZCB0aGlzCiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjM0LDcgKzIyMiw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOworCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7CiAJfQogCkBAIC0yNDMsNyArMjMxLDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CisJCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CiAJCWFzc2VydEVxdWFscyhudWxsLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwogCX0KIApAQCAtMjUyLDEyICsyNDAsMTIgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CisJCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CiAJCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKIAkJbWFueVRvTWFueS5zZXRNYXBwZWRCeSgiYmFyIik7CiAJCWFzc2VydEVxdWFscygiYmFyIiwgbWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShtYXBwZWRCeT1cImJhclwiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KG1hcHBlZEJ5ID0gXCJiYXJcIikiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwZWRCeU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTI2NSw3ICsyNTMsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKKwkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwogCQkKIAkJbWFueVRvTWFueS5zZXRNYXBwZWRCeShudWxsKTsKQEAgLTI4MCwxMSArMjY4LDExIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOworCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwogCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKIAkKIAkJbWFueVRvTWFueS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZT1BTEwpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZSA9IEFMTCkiLCBjdSk7CiAJCQogCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwogCX0KQEAgLTI5NCwxMSArMjgyLDExIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOworCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwogCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwogCQogCQltYW55VG9NYW55LnNldENhc2NhZGVNZXJnZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGU9TUVSR0UpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZSA9IE1FUkdFKSIsIGN1KTsKIAkJCiAJCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKIAl9CkBAIC0zMDgsMTEgKzI5NiwxMSBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKKwkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwogCQogCQltYW55VG9NYW55LnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZT1QRVJTSVNUKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBQRVJTSVNUKSIsIGN1KTsKIAkJCiAJCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwogCX0KQEAgLTMyMiwxMSArMzEwLDExIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOworCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwogCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZVJlbW92ZSgpKTsKIAkKIAkJbWFueVRvTWFueS5zZXRDYXNjYWRlUmVtb3ZlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZT1SRU1PVkUpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7CiAJCQogCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlUmVtb3ZlKCkpOwogCX0KQEAgLTMzNiwxMSArMzI0LDExIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOworCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwogCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZVJlZnJlc2goKSk7CiAJCiAJCW1hbnlUb01hbnkuc2V0Q2FzY2FkZVJlZnJlc2godHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlPVJFRlJFU0gpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZSA9IFJFRlJFU0gpIiwgY3UpOwogCQkKIAkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZVJlZnJlc2goKSk7CiAJfQpAQCAtMzUwLDEzICszMzgsMTMgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CisJCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7CiAJCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7CiAJCQogCQltYW55VG9NYW55LnNldENhc2NhZGVBbGwodHJ1ZSk7CiAJCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7CiAJCS8vYSBzZWNvbmQgQ2FzY2FkZVR5cGUuQWxsIHNob3VsZCBub3QgaGF2ZSBiZWVuIGFkZGVkCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlPUNhc2NhZGVUeXBlLkFMTCkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIsIGN1KTsKIAkJCiAJCW1hbnlUb01hbnkuc2V0Q2FzY2FkZUFsbChmYWxzZSk7CiAJCWFzc2VydEZhbHNlKG1hbnlUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwpAQCAtMzc1LDcgKzM2Myw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOworCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwogCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7CiAJCQogCQltYW55VG9NYW55LnNldENhc2NhZGVNZXJnZShmYWxzZSk7IC8vVE9ETyBzaG91bGQgdGhlIHJlc291cmNlIG1vZGVsIGhhbmRsZSB0aGlzIGFuZCByZW1vdmUgYm90aCBNRVJHRSAKQEAgLTM5MywxMiArMzgxLDEyIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOworCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwogCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7CiAJCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVSZW1vdmUoKSk7CiAJCQogCQltYW55VG9NYW55LnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlPVJFTU9WRSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlID0gUkVNT1ZFKSIsIGN1KTsKIAkJCiAJCW1hbnlUb01hbnkuc2V0Q2FzY2FkZVJlbW92ZShmYWxzZSk7CQkKIAkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvT25lVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYW55VG9PbmVUZXN0cy5qYXZhCmluZGV4IDUzNTU5NTAuLmU3NjcwM2IgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYW55VG9PbmVUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYW55VG9PbmVUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE1hbnlUb09uZVRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAJCiAJcHVibGljIE1hbnlUb09uZVRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0yNSw4ICsyNiw2IEBACiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFueVRvT25lIiwgIkZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRmV0Y2hUeXBlLkxBWlk7IENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQgPSB7fTsiKTsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiQ2FzY2FkZVR5cGUiLCAiQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIIik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTQwLDggKzM5LDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFueVRvT25lIiwgIkZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRmV0Y2hUeXBlLkxBWlk7Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkZldGNoVHlwZSIsICJFQUdFUiwgTEFaWSIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC00OSwxMyArNDYsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lKGZldGNoPUZldGNoVHlwZS5FQUdFUikiKTsKKwkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUoZmV0Y2ggPSBGZXRjaFR5cGUuRUFHRVIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lV2l0aFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9PbmUiLCAiQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOyIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02MywxMyArNTksMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lKHRhcmdldEVudGl0eT1Bbm5vdGF0aW9uVGVzdFR5cGUuY2xhc3MpIik7CisJCQkJc2IuYXBwZW5kKCJATWFueVRvT25lKHRhcmdldEVudGl0eSA9IEFubm90YXRpb25UZXN0VHlwZS5jbGFzcykiKTsKIAkJCX0KIAkJfSk7CiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTWFueVRvT25lIiwgImJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTc3LDE0ICs3MiwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUob3B0aW9uYWw9dHJ1ZSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUob3B0aW9uYWwgPSB0cnVlKSIpOwogCQkJfQogCQl9KTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9PbmUiLCAiQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtOTIsMTQgKzg1LDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZShjYXNjYWRlPUNhc2NhZGVUeXBlLkFMTCkiKTsKKwkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lV2l0aE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYW55VG9PbmUiLCAiQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTA3LDE0ICs5OCwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUoY2FzY2FkZT17Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRX0pIik7CisJCQkJc2IuYXBwZW5kKCJATWFueVRvT25lKGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRX0pIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhEdXBsaWNhdGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk1hbnlUb09uZSIsICJDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0ID0ge307Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkNhc2NhZGVUeXBlIiwgIkFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSCIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMjIsNyArMTExLDcgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lKGNhc2NhZGU9e0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5NRVJHRX0pIik7CisJCQkJc2IuYXBwZW5kKCJATWFueVRvT25lKGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLk1FUkdFfSkiKTsKIAkJCX0KIAkJfSk7CiAJfQpAQCAtMTMyLDcgKzEyMSw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7CisJCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKIAkJYXNzZXJ0Tm90TnVsbChtYW55VG9PbmUpOwogCX0KIAkKQEAgLTE0MSw3ICsxMzAsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7CisJCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvT25lLmdldEZldGNoKCkpOwogCX0KIApAQCAtMTUwLDEzICsxMzksMTMgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOworCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb09uZS5nZXRGZXRjaCgpKTsKIAkJCiAJCW1hbnlUb09uZS5zZXRGZXRjaChGZXRjaFR5cGUuTEFaWSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgbWFueVRvT25lLmdldEZldGNoKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoZmV0Y2g9TEFaWSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGZldGNoID0gTEFaWSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE2NCw3ICsxNTMsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7CisJCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvT25lLmdldEZldGNoKCkpOwogCQkKIAkJbWFueVRvT25lLnNldEZldGNoKG51bGwpOwpAQCAtMTgwLDcgKzE2OSw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKKwkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwogCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwogCX0KIAkKQEAgLTE4OSwxMiArMTc4LDEyIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKKwkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwogCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwogCQkKIAkJbWFueVRvT25lLnNldFRhcmdldEVudGl0eSgiRm9vIik7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZSh0YXJnZXRFbnRpdHk9Rm9vLmNsYXNzKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIwMiw3ICsxOTEsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7CisJCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKIAkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgbWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKIAkJCiAJCW1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7CkBAIC0yMTcsMTYgKzIwNiwxNiBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBtYW55VG9PbmUuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSk7CisJCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKKwkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIG1hbnlUb09uZS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpKTsKIAkJCiAJCW1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUodGFyZ2V0RW50aXR5PUZvby5jbGFzcykiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKHRhcmdldEVudGl0eSA9IEZvby5jbGFzcykiLCBjdSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG1hbnlUb09uZS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpKTsvL2J1ZyAxOTYyMDAgY2hhbmdlZCB0aGlzCisJCWFzc2VydEVxdWFscygiRm9vIiwgbWFueVRvT25lLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkpOy8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yMzQsNyArMjIzLDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOworCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKIAl9CiAKQEAgLTI0MywxMyArMjMyLDEzIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKKwkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7CiAJCQogCQltYW55VG9PbmUuc2V0T3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShvcHRpb25hbD1mYWxzZSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKG9wdGlvbmFsID0gZmFsc2UpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWxOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yNTcsNyArMjQ2LDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOworCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKIAkJCiAJCW1hbnlUb09uZS5zZXRPcHRpb25hbChudWxsKTsKQEAgLTI3MiwxMSArMjYxLDExIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7CisJCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKIAkKIAkJbWFueVRvT25lLnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGU9QUxMKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoY2FzY2FkZSA9IEFMTCkiLCBjdSk7CiAJCQogCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVBbGwoKSk7CiAJfQpAQCAtMjg2LDExICsyNzUsMTEgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKKwkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwogCQlhc3NlcnRGYWxzZShtYW55VG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7CiAJCiAJCW1hbnlUb09uZS5zZXRDYXNjYWRlTWVyZ2UodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGU9TUVSR0UpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gTUVSR0UpIiwgY3UpOwogCQkKIAkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7CiAJfQpAQCAtMzAwLDExICsyODksMTEgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKKwkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwogCQlhc3NlcnRGYWxzZShtYW55VG9PbmUuaXNDYXNjYWRlUGVyc2lzdCgpKTsKIAkKIAkJbWFueVRvT25lLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlPVBFUlNJU1QpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gUEVSU0lTVCkiLCBjdSk7CiAJCQogCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwogCX0KQEAgLTMxNCwxMSArMzAzLDExIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7CisJCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKIAkKIAkJbWFueVRvT25lLnNldENhc2NhZGVSZW1vdmUodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGU9UkVNT1ZFKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7CiAJCQogCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVSZW1vdmUoKSk7CiAJfQpAQCAtMzI4LDExICszMTcsMTEgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKKwkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwogCQlhc3NlcnRGYWxzZShtYW55VG9PbmUuaXNDYXNjYWRlUmVmcmVzaCgpKTsKIAkKIAkJbWFueVRvT25lLnNldENhc2NhZGVSZWZyZXNoKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlPVJFRlJFU0gpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gUkVGUkVTSCkiLCBjdSk7CiAJCQogCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwogCX0KQEAgLTM0MiwxMyArMzMxLDEzIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7CisJCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKIAkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlQWxsKCkpOwogCQkKIAkJbWFueVRvT25lLnNldENhc2NhZGVBbGwodHJ1ZSk7CiAJCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKIAkJLy9hIHNlY29uZCBDYXNjYWRlVHlwZS5BbGwgc2hvdWxkIG5vdCBoYXZlIGJlZW4gYWRkZWQKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoY2FzY2FkZT1DYXNjYWRlVHlwZS5BTEwpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIsIGN1KTsKIAkJCiAJCW1hbnlUb09uZS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKIAkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKQEAgLTM2Nyw3ICszNTYsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOworCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7CiAJCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwogCQkKIAkJbWFueVRvT25lLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ly9UT0RPIHNob3VsZCB0aGUgcmVzb3VyY2UgbW9kZWwgaGFuZGxlIHRoaXMgYW5kIHJlbW92ZSBib3RoIE1FUkdFIApAQCAtMzg1LDEyICszNzQsMTIgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKKwkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwogCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKIAkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlUmVtb3ZlKCkpOwogCQkKIAkJbWFueVRvT25lLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGU9UkVNT1ZFKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7CiAJCQogCQltYW55VG9PbmUuc2V0Q2FzY2FkZVJlbW92ZShmYWxzZSk7CQkKIAkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwS2V5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBLZXlUZXN0cy5qYXZhCmluZGV4IDNjOGM4OTMuLjBmM2RiOGUgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBLZXlUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBLZXlUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE3LDYgKzE3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE1hcEtleVRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAKIAlwdWJsaWMgTWFwS2V5VGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTI0LDcgKzI1LDYgQEAKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYXBLZXkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTM4LDcgKzM4LDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBLZXlXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYXBLZXkiLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTQ2LDcgKzQ1LDcgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5KG5hbWU9XCJrZXlcIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBNYXBLZXkobmFtZSA9IFwia2V5XCIpIik7CiAJCQl9CiAJCX0pOwogCX0KQEAgLTc4LDEyICs3NywxMiBAQAogCiAJCW1hcEtleS5zZXROYW1lKCJmb28iKTsKIAkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXkobmFtZT1cImZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXkobmFtZSA9IFwiZm9vXCIpIiwgY3UpOwogCQkKIAkJbWFwS2V5LnNldE5hbWUobnVsbCk7CiAJCQogCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXkobmFtZT1cImZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXkobmFtZSA9IFwiZm9vXCIpIiwgY3UpOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCmluZGV4IDRmYTY2Y2YuLjcyNjkwNmEgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCiAJcHVibGljIE1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtMjUsNyArMjYsNiBAQAogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYXBwZWRTdXBlcmNsYXNzIiwgIiIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0zOSw4ICszOSw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0FuZEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJNYXBwZWRTdXBlcmNsYXNzIiwgIiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJFbnRpdHkiLCAiIik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTU4LDcgKzU2LDcgQEAKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCQotCQlKYXZhUmVzb3VyY2VOb2RlIG1hcHBpbmdBbm5vdGF0aW9uID0gdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CisJCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwogCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24pOwogCX0KIAkKQEAgLTY2LDEwICs2NCwxMCBAQAogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0FuZEVudGl0eSgpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJCi0JCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSB0eXBlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0VHJ1ZShtYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIEVudGl0eUFubm90YXRpb24pOwogCQkKLQkJTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24gbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7CisJCU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7CiAJCWFzc2VydE5vdE51bGwobWFwcGVkU3VwZXJjbGFzcyk7CiAJfQogCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyaWVzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNUZXN0cy5qYXZhCmluZGV4IDBhZmQwYzcuLmIxOGEzYmUgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDE1ICsxMCwxNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE5hbWVkTmF0aXZlUXVlcmllc1Rlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfTkFNRSA9ICJteVF1ZXJ5IjsKQEAgLTI5LDI3ICszMSw4IEBACiAJcHVibGljIE5hbWVkTmF0aXZlUXVlcmllc1Rlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwogCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVRdWVyeUhpbnRBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5hbWVkTmF0aXZlUXVlcnkiLCAiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiU3RyaW5nIHF1ZXJ5KCk7IiArIAotCQkJIlF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdHt9OyIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOYW1lZE5hdGl2ZVF1ZXJpZXMiLCAKLQkJCSJOYW1lZE5hdGl2ZVF1ZXJ5W10gdmFsdWUoKTsiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVF1ZXJ5SGludEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUXVlcnlIaW50IiwgIlN0cmluZyBuYW1lKCk7ICIgKwotCQkJIlN0cmluZyB2YWx1ZSgpOyIpOwotCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTc2LDcgKzU5LDYgQEAKIAkKIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhTdHJpbmdFbGVtZW50KGZpbmFsIFN0cmluZyBlbGVtZW50TmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC04NCwxMyArNjYsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyaWVzKEBOYW1lZE5hdGl2ZVF1ZXJ5KCIgKyBlbGVtZW50TmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIpKSIpOworCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcmllcyhATmFtZWROYXRpdmVRdWVyeSgiICsgZWxlbWVudE5hbWUgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpKSIpOwogCQkJfQogCQl9KTsKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC05OCwxMiArNzksMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyaWVzKEBOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdENsYXNzPSIgKyBRVUVSWV9SRVNVTFRfQ0xBU1MgKyAiLmNsYXNzKSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0Q2xhc3MgPSAiICsgUVVFUllfUkVTVUxUX0NMQVNTICsgIi5jbGFzcykpIik7CiAJCQl9CiAJCX0pOwogCX0KKwkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnlIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTExMSwxMyArOTIsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyaWVzKEBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzPXtAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIiksIEBRdWVyeUhpbnR9KSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoQE5hbWVkTmF0aXZlUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgQFF1ZXJ5SGludH0pKSIpOwogCQkJfQogCQl9KTsKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMjUsNyArMTA1LDcgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyeShuYW1lPVwiZm9vXCIsIHF1ZXJ5PVwiYmFyXCIsIGhpbnRzPUBRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZT1cIkZPT1wiKSwgcmVzdWx0Q2xhc3M9Rm9vLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nPVwibWFwcGluZ1wiKSIpOworCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCByZXN1bHRDbGFzcyA9IEZvby5jbGFzcywgcmVzdWx0U2V0TWFwcGluZyA9IFwibWFwcGluZ1wiKSIpOwogCQkJfQogCQl9KTsKIAl9CkBAIC0xNTksNyArMTM5LDcgQEAKIAkJbmFtZWRRdWVyeS5zZXROYW1lKCJmb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkobmFtZT1cImZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWUgPSBcImZvb1wiKSIsIGN1KTsKIAkJCiAJCW5hbWVkUXVlcnkuc2V0TmFtZShudWxsKTsKIAkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7CkBAIC0xODcsNyArMTY3LDcgQEAKIAkJbmFtZWRRdWVyeS5zZXRRdWVyeSgiZm9vIik7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShxdWVyeT1cImZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHF1ZXJ5ID0gXCJmb29cIikiLCBjdSk7CiAJCQogCQluYW1lZFF1ZXJ5LnNldFF1ZXJ5KG51bGwpOwogCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7CkBAIC0yMTUsNyArMTk1LDcgQEAKIAkJbmFtZWRRdWVyeS5zZXRSZXN1bHRDbGFzcygiZm9vIik7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShyZXN1bHRDbGFzcz1mb28uY2xhc3MpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0Q2xhc3MgPSBmb28uY2xhc3MpIiwgY3UpOwogCQkKIAkJbmFtZWRRdWVyeS5zZXRSZXN1bHRDbGFzcyhudWxsKTsKIAkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwpAQCAtMjMwLDEyICsyMTAsMTIgQEAKIAkJTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbiBuYW1lZFF1ZXJpZXMgPSAoTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKTsKIAkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IG5hbWVkUXVlcmllcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKIAkJYXNzZXJ0Tm90TnVsbChuYW1lZFF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJlc3VsdCIsIG5hbWVkUXVlcnkuZ2V0RnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzcygpKTsvL2J1ZyAxOTYyMDAgY2hhbmdlZCB0aGlzCisJCWFzc2VydEVxdWFscygiUmVzdWx0IiwgbmFtZWRRdWVyeS5nZXRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzTmFtZSgpKTsvL2J1ZyAxOTYyMDAgY2hhbmdlZCB0aGlzCiAKIAkJbmFtZWRRdWVyeS5zZXRSZXN1bHRDbGFzcyhUWVBFX05BTUUpOwkJCiAJCQotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgbmFtZWRRdWVyeS5nZXRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzKCkpOwkJCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdENsYXNzPSIgKyBUWVBFX05BTUUgKyAiLmNsYXNzKSIsIGN1KTsKKwkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIG5hbWVkUXVlcnkuZ2V0RnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzc05hbWUoKSk7CQkJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0Q2xhc3MgPSAiICsgVFlQRV9OQU1FICsgIi5jbGFzcykiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXN1bHRTZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yNTgsNyArMjM4LDcgQEAKIAkJbmFtZWRRdWVyeS5zZXRSZXN1bHRTZXRNYXBwaW5nKCJmb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0U2V0TWFwcGluZz1cImZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdFNldE1hcHBpbmcgPSBcImZvb1wiKSIsIGN1KTsKIAkJCiAJCW5hbWVkUXVlcnkuc2V0UmVzdWx0U2V0TWFwcGluZyhudWxsKTsKIAkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7CkBAIC0zMTMsNyArMjkzLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7CiAJCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzPXtAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiksQFF1ZXJ5SGludChuYW1lPVwiRk9PXCIpLCBAUXVlcnlIaW50fSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiKSxAUXVlcnlIaW50KG5hbWUgPSBcIkZPT1wiKSwgQFF1ZXJ5SGludH0pIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzMzLDEyICszMTMsMTIgQEAKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoQE5hbWVkTmF0aXZlUXVlcnkoaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIkJBWlwiKSwgQFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpfSkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcmllcyhATmFtZWROYXRpdmVRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBWlwiKSwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKX0pKSIsIGN1KTsKIAkJCiAJCW5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoMSwgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyaWVzKEBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzPUBRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZT1cIkZPT1wiKSkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcmllcyhATmFtZWROYXRpdmVRdWVyeShoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIikpKSIsIGN1KTsKIAkJCiAJCiAJCW5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKQEAgLTM2Niw3ICszNDYsNyBAQAogCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcmllcyhATmFtZWROYXRpdmVRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpLCBAUXVlcnlIaW50LCBAUXVlcnlIaW50KG5hbWU9XCJCQVpcIil9KSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyaWVzKEBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIEBRdWVyeUhpbnQsIEBRdWVyeUhpbnQobmFtZSA9IFwiQkFaXCIpfSkpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0zODksNyArMzY5LDcgQEAKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoQE5hbWVkTmF0aXZlUXVlcnkoaGludHM9e0BRdWVyeUhpbnQsIEBRdWVyeUhpbnQobmFtZT1cIkJBWlwiKSwgQFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpfSkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcmllcyhATmFtZWROYXRpdmVRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50LCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBWlwiKSwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKX0pKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEFkZE5hbWVkTmF0aXZlUXVlcnlDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTM5OCw3ICszNzgsNyBAQAogCQkKIAkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSwgSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKTsKIAkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoe0BOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCByZXN1bHRDbGFzcyA9IEZvby5jbGFzcywgcmVzdWx0U2V0TWFwcGluZyA9IFwibWFwcGluZ1wiKSxATmFtZWROYXRpdmVRdWVyeShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyaWVzKHtATmFtZWROYXRpdmVRdWVyeShuYW1lID0gXCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIHJlc3VsdENsYXNzID0gRm9vLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nID0gXCJtYXBwaW5nXCIpLEBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWUgPSBcIkJBUlwiKX0pIiwgY3UpOwogCQkKIAkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfTkFUSVZFX1FVRVJZKSk7CiAJCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKSk7CkBAIC00MTEsMTMgKzM5MSwxMyBAQAogCQkKIAkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSwgSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKTsKIAkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoe0BOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCByZXN1bHRDbGFzcyA9IEZvby5jbGFzcywgcmVzdWx0U2V0TWFwcGluZyA9IFwibWFwcGluZ1wiKSxATmFtZWROYXRpdmVRdWVyeShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyaWVzKHtATmFtZWROYXRpdmVRdWVyeShuYW1lID0gXCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIHJlc3VsdENsYXNzID0gRm9vLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nID0gXCJtYXBwaW5nXCIpLEBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWUgPSBcIkJBUlwiKX0pIiwgY3UpOwogCQkKIAkJbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSwgSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKTsKIAkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoe0BOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCJCQVpcIiksQE5hbWVkTmF0aXZlUXVlcnkobmFtZT1cImZvb1wiLCBxdWVyeSA9IFwiYmFyXCIsIGhpbnRzID0gQFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIHJlc3VsdENsYXNzID0gRm9vLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nID0gXCJtYXBwaW5nXCIpLCBATmFtZWROYXRpdmVRdWVyeShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyaWVzKHtATmFtZWROYXRpdmVRdWVyeShuYW1lID0gXCJCQVpcIiksQE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCByZXN1bHRDbGFzcyA9IEZvby5jbGFzcywgcmVzdWx0U2V0TWFwcGluZyA9IFwibWFwcGluZ1wiKSwgQE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiQkFSXCIpfSkiLCBjdSk7CiAKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gbmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5OQU1FRF9OQVRJVkVfUVVFUlksIEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUyk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gbmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5OQU1FRF9OQVRJVkVfUVVFUlksIEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUyk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgbmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBuYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIG5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7CkBAIC00MzMsOSArNDEzLDkgQEAKIAkJCiAJCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlksIEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUyk7CiAJCW5hbWVkUXVlcnkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyaWVzKHtATmFtZWROYXRpdmVRdWVyeShuYW1lPVwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgcmVzdWx0Q2xhc3MgPSBGb28uY2xhc3MsIHJlc3VsdFNldE1hcHBpbmcgPSBcIm1hcHBpbmdcIiksQE5hbWVkTmF0aXZlUXVlcnkobmFtZT1cIkJBUlwiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcmllcyh7QE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCByZXN1bHRDbGFzcyA9IEZvby5jbGFzcywgcmVzdWx0U2V0TWFwcGluZyA9IFwibWFwcGluZ1wiKSxATmFtZWROYXRpdmVRdWVyeShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKIAkJCiAJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlksIEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShuYW1lPVwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgcmVzdWx0Q2xhc3MgPSBGb28uY2xhc3MsIHJlc3VsdFNldE1hcHBpbmcgPSBcIm1hcHBpbmdcIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShuYW1lID0gXCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIHJlc3VsdENsYXNzID0gRm9vLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nID0gXCJtYXBwaW5nXCIpIiwgY3UpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YQppbmRleCAwMDUyOWRmLi5kNDE3ZGUwIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyeVRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcnlUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE2LDYgKzE2LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBOYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIm15UXVlcnkiOwpAQCAtMjYsMjEgKzI3LDggQEAKIAlwdWJsaWMgTmFtZWROYXRpdmVRdWVyeVRlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwogCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVRdWVyeUhpbnRBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5hbWVkTmF0aXZlUXVlcnkiLCAiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiU3RyaW5nIHF1ZXJ5KCk7IiArIAotCQkJIlF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdHt9OyIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUXVlcnlIaW50QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJRdWVyeUhpbnQiLCAiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02Nyw3ICs1NSw2IEBACiAJCiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTc1LDEzICs2MiwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJ5KCIgKyBlbGVtZW50TmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIpIik7CisJCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyeSgiICsgZWxlbWVudE5hbWUgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC04OSwxMiArNzUsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyeShyZXN1bHRDbGFzcz0iICsgUVVFUllfUkVTVUxUX0NMQVNTICsgIi5jbGFzcykiKTsKKwkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdENsYXNzID0gIiArIFFVRVJZX1JFU1VMVF9DTEFTUyArICIuY2xhc3MpIik7CiAJCQl9CiAJCX0pOwogCX0KKwkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnlIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMDIsNyArODgsNyBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzPXtAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIiksIEBRdWVyeUhpbnR9KSIpOworCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgQFF1ZXJ5SGludH0pIik7CiAJCQl9CiAJCX0pOwogCX0KQEAgLTEzMyw3ICsxMTksNyBAQAogCQluYW1lZFF1ZXJ5LnNldE5hbWUoImZvbyIpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShuYW1lPVwiZm9vXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiZm9vXCIpIiwgY3UpOwogCQkKIAkJbmFtZWRRdWVyeS5zZXROYW1lKG51bGwpOwogCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKQEAgLTE1OSw3ICsxNDUsNyBAQAogCQluYW1lZFF1ZXJ5LnNldFF1ZXJ5KCJmb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHF1ZXJ5PVwiZm9vXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocXVlcnkgPSBcImZvb1wiKSIsIGN1KTsKIAkJCiAJCW5hbWVkUXVlcnkuc2V0UXVlcnkobnVsbCk7CiAJCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKQEAgLTE4NSw3ICsxNzEsNyBAQAogCQluYW1lZFF1ZXJ5LnNldFJlc3VsdENsYXNzKCJmb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdENsYXNzPWZvby5jbGFzcykiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShyZXN1bHRDbGFzcyA9IGZvby5jbGFzcykiLCBjdSk7CiAJCQogCQluYW1lZFF1ZXJ5LnNldFJlc3VsdENsYXNzKG51bGwpOwogCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7CkBAIC0xOTksMTIgKzE4NSwxMiBAQAogCiAJCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwogCQlhc3NlcnROb3ROdWxsKG5hbWVkUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiUmVzdWx0IiwgbmFtZWRRdWVyeS5nZXRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzKCkpOy8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKKwkJYXNzZXJ0RXF1YWxzKCJSZXN1bHQiLCBuYW1lZFF1ZXJ5LmdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NOYW1lKCkpOy8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKIAogCQluYW1lZFF1ZXJ5LnNldFJlc3VsdENsYXNzKFRZUEVfTkFNRSk7CQkKIAkJCi0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBuYW1lZFF1ZXJ5LmdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3MoKSk7CQkJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0Q2xhc3M9IiArIFRZUEVfTkFNRSArICIuY2xhc3MpIiwgY3UpOworCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgbmFtZWRRdWVyeS5nZXRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzTmFtZSgpKTsJCQkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShyZXN1bHRDbGFzcyA9ICIgKyBUWVBFX05BTUUgKyAiLmNsYXNzKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldFJlc3VsdFNldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIyNSw3ICsyMTEsNyBAQAogCQluYW1lZFF1ZXJ5LnNldFJlc3VsdFNldE1hcHBpbmcoImZvbyIpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShyZXN1bHRTZXRNYXBwaW5nPVwiZm9vXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0U2V0TWFwcGluZyA9IFwiZm9vXCIpIiwgY3UpOwogCQkKIAkJbmFtZWRRdWVyeS5zZXRSZXN1bHRTZXRNYXBwaW5nKG51bGwpOwogCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKQEAgLTI3Nyw3ICsyNjMsNyBAQAogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkoaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIkJBUlwiKSxAUXVlcnlIaW50KG5hbWU9XCJGT09cIiksIEBRdWVyeUhpbnR9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIpLEBRdWVyeUhpbnQobmFtZSA9IFwiRk9PXCIpLCBAUXVlcnlIaW50fSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yOTYsMTIgKzI4MiwxMiBAQAogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDIsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkoaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIkJBWlwiKSwgQFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBWlwiKSwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKX0pIiwgY3UpOwogCQkKIAkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygxLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzPUBRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZT1cIkZPT1wiKSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIikpIiwgY3UpOwogCQkKIAkKIAkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwpAQCAtMzI4LDcgKzMxNCw3IEBACiAJCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpLCBAUXVlcnlIaW50LCBAUXVlcnlIaW50KG5hbWU9XCJCQVpcIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIEBRdWVyeUhpbnQsIEBRdWVyeUhpbnQobmFtZSA9IFwiQkFaXCIpfSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSGludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTM0OSw3ICszMzUsNyBAQAogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkoaGludHM9e0BRdWVyeUhpbnQsIEBRdWVyeUhpbnQobmFtZT1cIkJBWlwiKSwgQFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50LCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBWlwiKSwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKX0pIiwgY3UpOwogCX0KIAkKIH0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJpZXNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcmllc1Rlc3RzLmphdmEKaW5kZXggNzcyMDg5OS4uMTAzY2JlMyAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcmllc1Rlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcmllc1Rlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsMTUgKzEwLDE3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyaWVzQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgTmFtZWRRdWVyaWVzVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIm15UXVlcnkiOwpAQCAtMjcsMjcgKzI5LDggQEAKIAlwdWJsaWMgTmFtZWRRdWVyaWVzVGVzdHMoU3RyaW5nIG5hbWUpIHsKIAkJc3VwZXIobmFtZSk7CiAJfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU5hbWVkUXVlcnlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVF1ZXJ5SGludEFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTmFtZWRRdWVyeSIsICJTdHJpbmcgbmFtZSgpOyAiICsKLQkJCSJTdHJpbmcgcXVlcnkoKTsiICsgCi0JCQkiUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0e307Iik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU5hbWVkUXVlcnlBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5hbWVkUXVlcmllcyIsIAotCQkJIk5hbWVkUXVlcnlbXSB2YWx1ZSgpOyIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUXVlcnlIaW50QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJRdWVyeUhpbnQiLCAiU3RyaW5nIG5hbWUoKTsgIiArCi0JCQkiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWRRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU5hbWVkUXVlcmllc0Fubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNjksNyArNTIsNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU5hbWVkUXVlcmllc0Fubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNzcsMTMgKzU5LDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcmllcyhATmFtZWRRdWVyeSgiICsgZWxlbWVudE5hbWUgKyAiPVwiIiArIHZhbHVlICsgIlwiKSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJpZXMoQE5hbWVkUXVlcnkoIiArIGVsZW1lbnROYW1lICsgIiA9IFwiIiArIHZhbHVlICsgIlwiKSkiKTsKIAkJCX0KIAkJfSk7CiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5SGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlTmFtZWRRdWVyaWVzQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC05MSwxNCArNzIsMTMgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyaWVzKEBOYW1lZFF1ZXJ5KGhpbnRzPXtAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIiksIEBRdWVyeUhpbnR9KSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJpZXMoQE5hbWVkUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgQFF1ZXJ5SGludH0pKSIpOwogCQkJfQogCQl9KTsKIAl9CiAKIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTEwNiw3ICs4Niw3IEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcnkobmFtZT1cImZvb1wiLCBxdWVyeT1cImJhclwiLCBoaW50cz1AUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIikpIik7CisJCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyeShuYW1lID0gXCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIikpIik7CiAJCQl9CiAJCX0pOwogCX0KQEAgLTE0MCw3ICsxMjAsNyBAQAogCQluYW1lZFF1ZXJ5LnNldE5hbWUoImZvbyIpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShuYW1lPVwiZm9vXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkobmFtZSA9IFwiZm9vXCIpIiwgY3UpOwogCQkKIAkJbmFtZWRRdWVyeS5zZXROYW1lKG51bGwpOwogCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKQEAgLTE2OCw3ICsxNDgsNyBAQAogCQluYW1lZFF1ZXJ5LnNldFF1ZXJ5KCJmb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KHF1ZXJ5PVwiZm9vXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkocXVlcnkgPSBcImZvb1wiKSIsIGN1KTsKIAkJCiAJCW5hbWVkUXVlcnkuc2V0UXVlcnkobnVsbCk7CiAJCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKQEAgLTIyNCw3ICsyMDQsNyBAQAogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7CiAJCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKIAotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkoaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIkJBUlwiKSxAUXVlcnlIaW50KG5hbWU9XCJGT09cIiksIEBRdWVyeUhpbnR9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIpLEBRdWVyeUhpbnQobmFtZSA9IFwiRk9PXCIpLCBAUXVlcnlIaW50fSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yNDQsMTIgKzIyNCwxMiBAQAogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDIsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcmllcyhATmFtZWRRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIil9KSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyaWVzKEBOYW1lZFF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwogCQkKIAkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygxLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJpZXMoQE5hbWVkUXVlcnkoaGludHM9QFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpKSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyaWVzKEBOYW1lZFF1ZXJ5KGhpbnRzID0gQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSkpIiwgY3UpOwogCQkKIAkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwogCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7CkBAIC0yNzUsNyArMjU1LDcgQEAKIAkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJpZXMoQE5hbWVkUXVlcnkoaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZT1cIkZPT1wiKSwgQFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lPVwiQkFaXCIpfSkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcmllcyhATmFtZWRRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCBAUXVlcnlIaW50LCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBWlwiKX0pKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vdmVIaW50MigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjk3LDcgKzI3Nyw3IEBACiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyaWVzKEBOYW1lZFF1ZXJ5KGhpbnRzPXtAUXVlcnlIaW50LCBAUXVlcnlIaW50KG5hbWU9XCJCQVpcIiksIEBRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZT1cIkZPT1wiKX0pKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJpZXMoQE5hbWVkUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVpcIiksIEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIil9KSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZFF1ZXJ5Q29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0zMDYsNyArMjg2LDcgQEAKIAkJCiAJCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5OQU1FRF9RVUVSWSwgSlBBLk5BTUVEX1FVRVJJRVMpOwogCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcmllcyh7QE5hbWVkUXVlcnkobmFtZT1cImZvb1wiLCBxdWVyeSA9IFwiYmFyXCIsIGhpbnRzID0gQFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlID0gXCJGT09cIikpLEBOYW1lZFF1ZXJ5KG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJpZXMoe0BOYW1lZFF1ZXJ5KG5hbWUgPSBcImZvb1wiLCBxdWVyeSA9IFwiYmFyXCIsIGhpbnRzID0gQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSksQE5hbWVkUXVlcnkobmFtZSA9IFwiQkFSXCIpfSkiLCBjdSk7CiAJCQogCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSWSkpOwogCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSSUVTKSk7CkBAIC0zMTksMTQgKzI5OSwxNCBAQAogCQkKIAkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLk5BTUVEX1FVRVJZLCBKUEEuTkFNRURfUVVFUklFUyk7CiAJCW5hbWVkUXVlcnkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyaWVzKHtATmFtZWRRdWVyeShuYW1lPVwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSksQE5hbWVkUXVlcnkobmFtZT1cIkJBUlwiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcmllcyh7QE5hbWVkUXVlcnkobmFtZSA9IFwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpKSxATmFtZWRRdWVyeShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKIAkJCiAJCQogCQluYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlksIEpQQS5OQU1FRF9RVUVSSUVTKTsKIAkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJpZXMoe0BOYW1lZFF1ZXJ5KG5hbWU9XCJCQVpcIiksQE5hbWVkUXVlcnkobmFtZT1cImZvb1wiLCBxdWVyeSA9IFwiYmFyXCIsIGhpbnRzID0gQFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlID0gXCJGT09cIikpLCBATmFtZWRRdWVyeShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyaWVzKHtATmFtZWRRdWVyeShuYW1lID0gXCJCQVpcIiksQE5hbWVkUXVlcnkobmFtZSA9IFwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpKSwgQE5hbWVkUXVlcnkobmFtZSA9IFwiQkFSXCIpfSkiLCBjdSk7CiAKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gbmFtZWRRdWVyaWVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5OQU1FRF9RVUVSWSwgSlBBLk5BTUVEX1FVRVJJRVMpOworCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IG5hbWVkUXVlcmllcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuTkFNRURfUVVFUlksIEpQQS5OQU1FRF9RVUVSSUVTKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBuYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoTmFtZWRRdWVyeUFubm90YXRpb24pIG5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgbmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKQEAgLTM0MiwxMCArMzIyLDEwIEBACiAJCQogCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuTkFNRURfUVVFUlksIEpQQS5OQU1FRF9RVUVSSUVTKTsKIAkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJpZXMoe0BOYW1lZFF1ZXJ5KG5hbWU9XCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpKSxATmFtZWRRdWVyeShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyaWVzKHtATmFtZWRRdWVyeShuYW1lID0gXCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIikpLEBOYW1lZFF1ZXJ5KG5hbWUgPSBcIkJBUlwiKX0pIiwgY3UpOwogCQkKIAkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLk5BTUVEX1FVRVJZLCBKUEEuTkFNRURfUVVFUklFUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShuYW1lPVwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShuYW1lID0gXCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIikpIiwgY3UpOwogCX0KIAkKIH0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJ5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJ5VGVzdHMuamF2YQppbmRleCA1MWZkOTBlLi4yNTRhNjJkIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeVRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcnlUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlF1ZXJ5SGludEFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE5hbWVkUXVlcnlUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX05BTUUgPSAibXlRdWVyeSI7CkBAIC0yNiwyMSArMjcsOCBAQAogCXB1YmxpYyBOYW1lZFF1ZXJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKIAkJc3VwZXIobmFtZSk7CiAJfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU5hbWVkUXVlcnlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVF1ZXJ5SGludEFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTmFtZWRRdWVyeSIsICJTdHJpbmcgbmFtZSgpOyAiICsKLQkJCSJTdHJpbmcgcXVlcnkoKTsiICsgCi0JCQkiUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0e307Iik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVRdWVyeUhpbnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlF1ZXJ5SGludCIsICJTdHJpbmcgbmFtZSgpOyAiICsKLQkJCSJTdHJpbmcgdmFsdWUoKTsiKTsKLQl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU5hbWVkUXVlcnlBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTYyLDcgKzUwLDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC03MCwxMyArNTcsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyeSgiICsgZWxlbWVudE5hbWUgKyAiPVwiIiArIHZhbHVlICsgIlwiKSIpOworCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcnkoIiArIGVsZW1lbnROYW1lICsgIiA9IFwiIiArIHZhbHVlICsgIlwiKSIpOwogCQkJfQogCQl9KTsKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC04NCw3ICs3MCw3IEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcnkoaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZT1cIkZPT1wiKSwgQFF1ZXJ5SGludH0pIik7CisJCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCBAUXVlcnlIaW50fSkiKTsKIAkJCX0KIAkJfSk7CiAJfQpAQCAtMTE1LDcgKzEwMSw3IEBACiAJCW5hbWVkUXVlcnkuc2V0TmFtZSgiZm9vIik7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KG5hbWU9XCJmb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShuYW1lID0gXCJmb29cIikiLCBjdSk7CiAJCQogCQluYW1lZFF1ZXJ5LnNldE5hbWUobnVsbCk7CiAJCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXROYW1lKCkpOwpAQCAtMTQxLDcgKzEyNyw3IEBACiAJCW5hbWVkUXVlcnkuc2V0UXVlcnkoImZvbyIpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkocXVlcnk9XCJmb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShxdWVyeSA9IFwiZm9vXCIpIiwgY3UpOwogCQkKIAkJbmFtZWRRdWVyeS5zZXRRdWVyeShudWxsKTsKIAkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwpAQCAtMTk3LDcgKzE4Myw3IEBACiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwogCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFSXCIpLEBRdWVyeUhpbnQobmFtZT1cIkZPT1wiKSwgQFF1ZXJ5SGludH0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiksQFF1ZXJ5SGludChuYW1lID0gXCJGT09cIiksIEBRdWVyeUhpbnR9KSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIxNiwxMiArMjAyLDEyIEBACiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5oaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShoaW50cz17QFF1ZXJ5SGludChuYW1lPVwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWU9XCJCQVJcIiwgdmFsdWU9XCJGT09cIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpfSkiLCBjdSk7CiAJCQogCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7CiAJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkoaGludHM9QFF1ZXJ5SGludChuYW1lPVwiQkFSXCIsIHZhbHVlPVwiRk9PXCIpKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KGhpbnRzID0gQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSkiLCBjdSk7CiAJCQogCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7CiAJCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKQEAgLTI0Niw3ICsyMzIsNyBAQAogCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuaGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkoaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZT1cIkZPT1wiKSwgQFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lPVwiQkFaXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCBAUXVlcnlIaW50LCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBWlwiKX0pIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yNjcsNyArMjUzLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KGhpbnRzPXtAUXVlcnlIaW50LCBAUXVlcnlIaW50KG5hbWU9XCJCQVpcIiksIEBRdWVyeUhpbnQobmFtZT1cIkJBUlwiLCB2YWx1ZT1cIkZPT1wiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVpcIiksIEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIil9KSIsIGN1KTsKIAl9CiAJCiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9NYW55VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb01hbnlUZXN0cy5qYXZhCmluZGV4IGVkYTBiMGUuLjNiNTI5ZmUgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb01hbnlUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb01hbnlUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE9uZVRvTWFueVRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAJCiAJcHVibGljIE9uZVRvTWFueVRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0yNSw4ICsyNiw2IEBACiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9NYW55IiwgIkZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRmV0Y2hUeXBlLkxBWlk7IENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQgPSB7fTsiKTsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiQ2FzY2FkZVR5cGUiLCAiQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIIik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTQwLDggKzM5LDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9NYW55IiwgIkZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRmV0Y2hUeXBlLkxBWlk7Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkZldGNoVHlwZSIsICJFQUdFUiwgTEFaWSIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC00OSwxMyArNDYsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KGZldGNoPUZldGNoVHlwZS5FQUdFUikiKTsKKwkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkoZmV0Y2ggPSBGZXRjaFR5cGUuRUFHRVIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9NYW55IiwgIkNsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsiKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNjMsMTMgKzU5LDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueSh0YXJnZXRFbnRpdHk9QW5ub3RhdGlvblRlc3RUeXBlLmNsYXNzKSIpOworCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueSh0YXJnZXRFbnRpdHkgPSBBbm5vdGF0aW9uVGVzdFR5cGUuY2xhc3MpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPbmVUb01hbnkiLCAiU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdFwiXCI7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTc3LDE0ICs3MiwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkobWFwcGVkQnk9XCJmb29cIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkobWFwcGVkQnkgPSBcImZvb1wiKSIpOwogCQkJfQogCQl9KTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPbmVUb01hbnkiLCAiQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtOTIsMTQgKzg1LDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueShjYXNjYWRlPUNhc2NhZGVUeXBlLkFMTCkiKTsKKwkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9NYW55V2l0aE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPbmVUb01hbnkiLCAiQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTA3LDE0ICs5OCwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkoY2FzY2FkZT17Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRX0pIik7CisJCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRX0pIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhEdXBsaWNhdGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk9uZVRvTWFueSIsICJDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0ID0ge307Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkNhc2NhZGVUeXBlIiwgIkFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSCIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMjIsNyArMTExLDcgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KGNhc2NhZGU9e0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5NRVJHRX0pIik7CisJCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLk1FUkdFfSkiKTsKIAkJCX0KIAkJfSk7CiAJfQpAQCAtMTMyLDcgKzEyMSw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CisJCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKIAkJYXNzZXJ0Tm90TnVsbChvbmVUb01hbnkpOwogCX0KIAkKQEAgLTE0MSw3ICsxMzAsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CisJCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9NYW55LmdldEZldGNoKCkpOwogCX0KIApAQCAtMTUwLDEzICsxMzksMTMgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOworCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKIAkJCiAJCW9uZVRvTWFueS5zZXRGZXRjaChGZXRjaFR5cGUuTEFaWSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9NYW55LmdldEZldGNoKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoZmV0Y2g9TEFaWSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGZldGNoID0gTEFaWSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE2NCw3ICsxNTMsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CisJCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9NYW55LmdldEZldGNoKCkpOwogCQkKIAkJb25lVG9NYW55LnNldEZldGNoKG51bGwpOwpAQCAtMTgwLDcgKzE2OSw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKKwkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwogCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwogCX0KIAkKQEAgLTE4OSwxMiArMTc4LDEyIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKKwkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwogCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwogCQkKIAkJb25lVG9NYW55LnNldFRhcmdldEVudGl0eSgiRm9vIik7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueSh0YXJnZXRFbnRpdHk9Rm9vLmNsYXNzKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIwMiw3ICsxOTEsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CisJCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKIAkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKIAkJCiAJCW9uZVRvTWFueS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7CkBAIC0yMTcsMTYgKzIwNiwxNiBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBvbmVUb01hbnkuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSk7CisJCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKKwkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIG9uZVRvTWFueS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpKTsKIAkJCiAJCW9uZVRvTWFueS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkodGFyZ2V0RW50aXR5PUZvby5jbGFzcykiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KHRhcmdldEVudGl0eSA9IEZvby5jbGFzcykiLCBjdSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7CiAJCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9uZVRvTWFueS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpKTsgLy9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9uZVRvTWFueS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpKTsgLy9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIzNCw3ICsyMjMsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOworCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwogCX0KIApAQCAtMjQ0LDcgKzIzMyw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CisJCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKIAkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKIAl9CiAKQEAgLTI1MywxMiArMjQyLDEyIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CisJCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKIAkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7CiAJCW9uZVRvTWFueS5zZXRNYXBwZWRCeSgiYmFyIik7CiAJCWFzc2VydEVxdWFscygiYmFyIiwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkobWFwcGVkQnk9XCJiYXJcIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KG1hcHBlZEJ5ID0gXCJiYXJcIikiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwZWRCeU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTI2Niw3ICsyNTUsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOworCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwogCQkKIAkJb25lVG9NYW55LnNldE1hcHBlZEJ5KG51bGwpOwpAQCAtMjgxLDExICsyNzAsMTEgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKKwkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwogCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwogCQogCQlvbmVUb01hbnkuc2V0Q2FzY2FkZUFsbCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZT1BTEwpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShjYXNjYWRlID0gQUxMKSIsIGN1KTsKIAkJCiAJCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKIAl9CkBAIC0yOTUsMTEgKzI4NCwxMSBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOworCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CiAJCWFzc2VydEZhbHNlKG9uZVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKIAkKIAkJb25lVG9NYW55LnNldENhc2NhZGVNZXJnZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZT1NRVJHRSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBNRVJHRSkiLCBjdSk7CiAJCQogCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKIAl9CkBAIC0zMDksMTEgKzI5OCwxMSBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOworCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CiAJCWFzc2VydEZhbHNlKG9uZVRvTWFueS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwogCQogCQlvbmVUb01hbnkuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGU9UEVSU0lTVCkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBQRVJTSVNUKSIsIGN1KTsKIAkJCiAJCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZVBlcnNpc3QoKSk7CiAJfQpAQCAtMzIzLDExICszMTIsMTEgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKKwkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwogCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlUmVtb3ZlKCkpOwogCQogCQlvbmVUb01hbnkuc2V0Q2FzY2FkZVJlbW92ZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZT1SRU1PVkUpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShjYXNjYWRlID0gUkVNT1ZFKSIsIGN1KTsKIAkJCiAJCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZVJlbW92ZSgpKTsKIAl9CkBAIC0zMzcsMTEgKzMyNiwxMSBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOworCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CiAJCWFzc2VydEZhbHNlKG9uZVRvTWFueS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwogCQogCQlvbmVUb01hbnkuc2V0Q2FzY2FkZVJlZnJlc2godHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGU9UkVGUkVTSCkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBSRUZSRVNIKSIsIGN1KTsKIAkJCiAJCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZVJlZnJlc2goKSk7CiAJfQpAQCAtMzUxLDEzICszNDAsMTMgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKKwkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwogCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7CiAJCQogCQlvbmVUb01hbnkuc2V0Q2FzY2FkZUFsbCh0cnVlKTsKIAkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwogCQkvL2Egc2Vjb25kIENhc2NhZGVUeXBlLkFsbCBzaG91bGQgbm90IGhhdmUgYmVlbiBhZGRlZAotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShjYXNjYWRlPUNhc2NhZGVUeXBlLkFMTCkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpIiwgY3UpOwogCQkKIAkJb25lVG9NYW55LnNldENhc2NhZGVBbGwoZmFsc2UpOwogCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwpAQCAtMzc2LDcgKzM2NSw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CisJCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKIAkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7CiAJCQogCQlvbmVUb01hbnkuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsvL1RPRE8gc2hvdWxkIHRoZSByZXNvdXJjZSBtb2RlbCBoYW5kbGUgdGhpcyBhbmQgcmVtb3ZlIGJvdGggTUVSR0UgCkBAIC0zOTQsMTIgKzM4MywxMiBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOworCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CiAJCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwogCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVSZW1vdmUoKSk7CiAJCQogCQlvbmVUb01hbnkuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZT1SRU1PVkUpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShjYXNjYWRlID0gUkVNT1ZFKSIsIGN1KTsKIAkJCiAJCW9uZVRvTWFueS5zZXRDYXNjYWRlUmVtb3ZlKGZhbHNlKTsJCQogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb09uZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9PbmVUZXN0cy5qYXZhCmluZGV4IGRkMGUwNDQuLjA5OTc3OTcgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb09uZVRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09uZVRvT25lVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE9uZVRvT25lVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAkKIAlwdWJsaWMgT25lVG9PbmVUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtMjUsOCArMjYsNiBAQAogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9PbmUiLCAiRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBGZXRjaFR5cGUuTEFaWTsgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNDAsOCArMzksNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk9uZVRvT25lIiwgIkZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRmV0Y2hUeXBlLkxBWlk7Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkZldGNoVHlwZSIsICJFQUdFUiwgTEFaWSIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC00OSwxMyArNDYsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkVBR0VSKSIpOworCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lKGZldGNoID0gRmV0Y2hUeXBlLkVBR0VSKSIpOwogCQkJfQogCQl9KTsKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPbmVUb09uZSIsICJDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTYzLDEzICs1OSwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSh0YXJnZXRFbnRpdHk9QW5ub3RhdGlvblRlc3RUeXBlLmNsYXNzKSIpOworCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lKHRhcmdldEVudGl0eSA9IEFubm90YXRpb25UZXN0VHlwZS5jbGFzcykiKTsKIAkJCX0KIAkJfSk7CiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb09uZVdpdGhPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPbmVUb09uZSIsICJib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOyIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC03NywxMyArNzIsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUob3B0aW9uYWw9dHJ1ZSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZShvcHRpb25hbCA9IHRydWUpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk9uZVRvT25lIiwgIlN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHRcIlwiOyIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC05MSwxNCArODUsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUobWFwcGVkQnk9XCJmb29cIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZShtYXBwZWRCeSA9IFwiZm9vXCIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aENhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9PbmUiLCAiQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTA2LDE0ICs5OCwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZShjYXNjYWRlPUNhc2NhZGVUeXBlLkFMTCkiKTsKKwkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIpOwogCQkJfQogCQl9KTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb09uZVdpdGhNdWx0aXBsZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT25lVG9PbmUiLCAiQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCA9IHt9OyIpOwotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJDYXNjYWRlVHlwZSIsICJBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0giKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTIxLDE0ICsxMTEsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUoY2FzY2FkZT17Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRX0pIik7CisJCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUoY2FzY2FkZSA9IHtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFfSkiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmVXaXRoRHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPbmVUb09uZSIsICJDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0ID0ge307Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIkNhc2NhZGVUeXBlIiwgIkFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSCIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMzYsNyArMTI0LDcgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUoY2FzY2FkZT17Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLk1FUkdFfSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZShjYXNjYWRlID0ge0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5NRVJHRX0pIik7CiAJCQl9CiAJCX0pOwogCX0KQEAgLTE0Niw3ICsxMzQsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwogCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lKTsKIAl9CiAJCkBAIC0xNTUsNyArMTQzLDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwogCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb09uZS5nZXRGZXRjaCgpKTsKIAl9CiAKQEAgLTE2NCwxMyArMTUyLDEzIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOworCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKIAkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7CiAJCQogCQlvbmVUb09uZS5zZXRGZXRjaChGZXRjaFR5cGUuTEFaWSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGZldGNoPUxBWlkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGZldGNoID0gTEFaWSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE3OCw3ICsxNjYsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKKwkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CiAJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvT25lLmdldEZldGNoKCkpOwogCQkKIAkJb25lVG9PbmUuc2V0RmV0Y2gobnVsbCk7CkBAIC0xOTQsNyArMTgyLDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwogCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7CiAJfQogCQpAQCAtMjAzLDEyICsxOTEsMTIgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwogCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7CiAJCQogCQlvbmVUb09uZS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZSh0YXJnZXRFbnRpdHk9Rm9vLmNsYXNzKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZSh0YXJnZXRFbnRpdHkgPSBGb28uY2xhc3MpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RW50aXR5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjE2LDcgKzIwNCw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOworCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKIAkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwogCQkKIAkJb25lVG9PbmUuc2V0VGFyZ2V0RW50aXR5KG51bGwpOwpAQCAtMjMxLDE2ICsyMTksMTYgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBvbmVUb09uZS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpKTsKKwkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBvbmVUb09uZS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpKTsKIAkJCiAJCW9uZVRvT25lLnNldFRhcmdldEVudGl0eSgiRm9vIik7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKHRhcmdldEVudGl0eT1Gb28uY2xhc3MpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKHRhcmdldEVudGl0eSA9IEZvby5jbGFzcykiLCBjdSk7CiAJCQogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKIAkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgb25lVG9PbmUuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvbmVUb09uZS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpKTsgLy9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTI0OCw3ICsyMzYsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKKwkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CiAJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwogCX0KIApAQCAtMjU3LDEzICsyNDUsMTMgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKIAkJCiAJCW9uZVRvT25lLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwogCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKG9wdGlvbmFsPWZhbHNlKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShvcHRpb25hbCA9IGZhbHNlKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjcxLDcgKzI1OSw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOworCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKIAkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7CiAJCQogCQlvbmVUb09uZS5zZXRPcHRpb25hbChudWxsKTsKQEAgLTI4Niw3ICsyNzQsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwogCX0KIApAQCAtMjk1LDcgKzI4Myw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKKwkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CiAJCWFzc2VydEVxdWFscyhudWxsLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKIAl9CiAKQEAgLTMwNCwxMiArMjkyLDEyIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKKwkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CiAJCWFzc2VydE51bGwob25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7CiAJCW9uZVRvT25lLnNldE1hcHBlZEJ5KCJiYXIiKTsKIAkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUobWFwcGVkQnk9XCJiYXJcIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUobWFwcGVkQnkgPSBcImJhclwiKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldE1hcHBlZEJ5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzE3LDcgKzMwNSw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKKwkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7CiAJCQogCQlvbmVUb09uZS5zZXRNYXBwZWRCeShudWxsKTsKQEAgLTMzMiwxMSArMzIwLDExIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKKwkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKIAkKIAkJb25lVG9PbmUuc2V0Q2FzY2FkZUFsbCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlPUFMTCkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZSA9IEFMTCkiLCBjdSk7CiAJCQogCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKIAl9CkBAIC0zNDYsMTEgKzMzNCwxMSBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwogCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKIAkKIAkJb25lVG9PbmUuc2V0Q2FzY2FkZU1lcmdlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGU9TUVSR0UpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGUgPSBNRVJHRSkiLCBjdSk7CiAJCQogCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwogCX0KQEAgLTM2MCwxMSArMzQ4LDExIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKKwkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lLmlzQ2FzY2FkZVBlcnNpc3QoKSk7CiAJCiAJCW9uZVRvT25lLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGU9UEVSU0lTVCkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZSA9IFBFUlNJU1QpIiwgY3UpOwogCQkKIAkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwogCX0KQEAgLTM3NCwxMSArMzYyLDExIEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldE1hcHBpbmdBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKKwkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CiAJCWFzc2VydEZhbHNlKG9uZVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKIAkKIAkJb25lVG9PbmUuc2V0Q2FzY2FkZVJlbW92ZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlPVJFTU9WRSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7CiAJCQogCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKIAl9CkBAIC0zODgsMTEgKzM3NiwxMSBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwogCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwogCQogCQlvbmVUb09uZS5zZXRDYXNjYWRlUmVmcmVzaCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlPVJFRlJFU0gpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGUgPSBSRUZSRVNIKSIsIGN1KTsKIAkJCiAJCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlUmVmcmVzaCgpKTsKIAl9CkBAIC00MDIsMTMgKzM5MCwxMyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwogCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKIAkJCiAJCW9uZVRvT25lLnNldENhc2NhZGVBbGwodHJ1ZSk7CiAJCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlQWxsKCkpOwogCQkvL2Egc2Vjb25kIENhc2NhZGVUeXBlLkFsbCBzaG91bGQgbm90IGhhdmUgYmVlbiBhZGRlZAotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGU9Q2FzY2FkZVR5cGUuQUxMKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIsIGN1KTsKIAkJCiAJCW9uZVRvT25lLnNldENhc2NhZGVBbGwoZmFsc2UpOwogCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVBbGwoKSk7CkBAIC00MjcsNyArNDE1LDcgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOworCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKIAkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKIAkJCiAJCW9uZVRvT25lLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ly9UT0RPIHNob3VsZCB0aGUgcmVzb3VyY2UgbW9kZWwgaGFuZGxlIHRoaXMgYW5kIHJlbW92ZSBib3RoIE1FUkdFIApAQCAtNDQ1LDEyICs0MzMsMTIgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOworCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKIAkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKIAkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVSZW1vdmUoKSk7CiAJCQogCQlvbmVUb09uZS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGU9UkVNT1ZFKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlID0gUkVNT1ZFKSIsIGN1KTsKIAkJCiAJCW9uZVRvT25lLnNldENhc2NhZGVSZW1vdmUoZmFsc2UpOwkJCiAJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09yZGVyQnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09yZGVyQnlUZXN0cy5qYXZhCmluZGV4IGUwYzY3OTkuLmQ0MDMxNjAgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PcmRlckJ5VGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT3JkZXJCeVRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE9yZGVyQnlUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCiAJcHVibGljIE9yZGVyQnlUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtMjQsNyArMjUsNiBAQAogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T3JkZXJCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJPcmRlckJ5IiwgIlN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgXCJcIjsiKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMzgsNyArMzgsNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9yZGVyQnlXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiT3JkZXJCeSIsICJTdHJpbmcgdmFsdWUoKSBkZWZhdWx0IFwiXCI7Iik7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTQ2LDcgKzQ1LDcgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT3JkZXJCeSh2YWx1ZT1cImtleVwiKSIpOworCQkJCXNiLmFwcGVuZCgiQE9yZGVyQnkodmFsdWUgPSBcImtleVwiKSIpOwogCQkJfQogCQl9KTsKIAl9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuamF2YQppbmRleCA0MDgxOTUxLi40MjE3NzU0IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAJCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7CkBAIC0yNiwxNiArMjcsOCBAQAogCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwogCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlByaW1hcnlLZXlKb2luQ29sdW1uIiwgCi0JCQkiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkiU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0IFwiXCI7ICIpOwotCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTQ5LDcgKzQyLDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC01NywxMyArNDksMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIiIgKyBDT0xVTU5fTkFNRSArICJcIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCIiICsgQ09MVU1OX05BTUUgKyAiXCIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC03MSwxMyArNjIsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWU9XCIiICsgQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgKyAiXCIpIik7CisJCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIiIgKyBDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSArICJcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtODUsNyArNzUsNyBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uPVwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCIiICsgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OICsgIlwiKSIpOwogCQkJfQogCQl9KTsKIAl9CkBAIC0xMjEsNyArMTExLDcgQEAKIAkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiRm9vXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNjAsNyArMTUwLDcgQEAKIAkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJGb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lPVwiRm9vXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJGb29cIikiLCBjdSk7CiAKIAkJCiAJCWNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKQEAgLTE4Nyw3ICsxNzcsNyBAQAogCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiRm9vIik7CiAJCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb249XCJGb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiRm9vXCIpIiwgY3UpOwogCiAJCQogCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uc1Rlc3RzLmphdmEKaW5kZXggYTBhMmQwMC4uNzRmMDgzMCAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uc1Rlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uc1Rlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsMTUgKzEwLDE3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uc1Rlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAJCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7CkBAIC0yOSwyMSArMzEsNyBAQAogCQlzdXBlcihuYW1lKTsKIAl9CiAJCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJQcmltYXJ5S2V5Sm9pbkNvbHVtbiIsIAotCQkJIlN0cmluZyBuYW1lKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCSJTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCI7ICIgKwotCQkJIlN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUHJpbWFyeUtleUpvaW5Db2x1bW5zIiwgCi0JCQkiUHJpbWFyeUtleUpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCX0KLQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNTcsNyArNDUsNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02NSwxMyArNTIsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleUpvaW5Db2x1bW5zKEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiIiArIENPTFVNTl9OQU1FICsgIlwiKSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIiIgKyBDT0xVTU5fTkFNRSArICJcIikpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNzksMTMgKzY1LDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFByaW1hcnlLZXlKb2luQ29sdW1ucyhAUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWU9XCIiICsgQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgKyAiXCIpKSIpOworCQkJCXNiLmFwcGVuZCgiQFByaW1hcnlLZXlKb2luQ29sdW1ucyhAUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIiIgKyBDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSArICJcIikpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC05MywxMyArNzgsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleUpvaW5Db2x1bW5zKEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uPVwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikpIik7CisJCQkJc2IuYXBwZW5kKCJAUHJpbWFyeUtleUpvaW5Db2x1bW5zKEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCIiICsgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OICsgIlwiKSkiKTsKIAkJCX0KIAkJfSk7CiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTEwNyw3ICs5MSw3IEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQpAQCAtMTQ0LDcgKzEyOCw3IEBACiAJCWNvbHVtbi5zZXROYW1lKCJGb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0TmFtZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUHJpbWFyeUtleUpvaW5Db2x1bW5zKEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiRm9vXCIpKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZvb1wiKSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTgxLDcgKzE2NSw3IEBACiAJCWNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRm9vIik7CiAJCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoQFByaW1hcnlLZXlKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lPVwiRm9vXCIpKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoQFByaW1hcnlLZXlKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJGb29cIikpIiwgY3UpOwogCiAJCQogCQljb2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7CkBAIC0yMDgsNyArMTkyLDcgQEAKIAkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoQFByaW1hcnlLZXlKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb249XCJGb29cIikpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1ucyhAUHJpbWFyeUtleUpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiRm9vXCIpKSIsIGN1KTsKIAogCQkKIAkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7CkBAIC0yMjMsNyArMjA3LDcgQEAKIAkJCiAJCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwogCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1ucyh7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiksQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJGT09cIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoe0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiksQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwogCQkKIAkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwogCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUykpOwpAQCAtMjM2LDEzICsyMjAsMTMgQEAKIAkJCiAJCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4sIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwogCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1ucyh7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiksQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJGT09cIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoe0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiksQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwogCQkKIAkJam9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKIAkJam9pbkNvbHVtbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoe0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFaXCIpLEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1ucyh7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKSxAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7CiAKLQkJSXRlcmF0b3I8SmF2YVJlc291cmNlTm9kZT4gcGtKb2luQ29sdW1ucyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gcGtKb2luQ29sdW1ucyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7CiAJCWFzc2VydEVxdWFscygiQkFaIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7CkBAIC0yNTksMTAgKzI0MywxMCBAQAogCQkKIAkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7CiAJCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUHJpbWFyeUtleUpvaW5Db2x1bW5zKHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiKSxAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1ucyh7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiKSxAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7CiAJCQogCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIikiLCBjdSk7CiAJfQogCiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUXVlcnlIaW50VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9RdWVyeUhpbnRUZXN0cy5qYXZhCmluZGV4IDY1ZDcyMTEuLjFhNjFhMmEgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9RdWVyeUhpbnRUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9RdWVyeUhpbnRUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE3LDYgKzE3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlF1ZXJ5SGludEFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIFF1ZXJ5SGludFRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSElOVF9OQU1FID0gIm15SGludCI7CkBAIC0yNSwyMSArMjYsOCBAQAogCXB1YmxpYyBRdWVyeUhpbnRUZXN0cyhTdHJpbmcgbmFtZSkgewogCQlzdXBlcihuYW1lKTsKIAl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTmFtZWRRdWVyeUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUXVlcnlIaW50QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOYW1lZFF1ZXJ5IiwgIlN0cmluZyBuYW1lKCk7ICIgKwotCQkJIlN0cmluZyBxdWVyeSgpOyIgKyAKLQkJCSJRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHR7fTsiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVF1ZXJ5SGludEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUXVlcnlIaW50IiwgIlN0cmluZyBuYW1lKCk7ICIgKwotCQkJIlN0cmluZyB2YWx1ZSgpOyIpOwotCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVOYW1lZFF1ZXJ5QW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC00Nyw3ICszNSw3IEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcnkoaGludHM9e0BRdWVyeUhpbnQobmFtZT1cIiIgKyBRVUVSWV9ISU5UX05BTUUgKyAiXCIsIHZhbHVlPVwiIiArIFFVRVJZX0hJTlRfVkFMVUUgKyAiXCIpLCBAUXVlcnlIaW50fSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiIiArIFFVRVJZX0hJTlRfTkFNRSArICJcIiwgdmFsdWUgPSBcIiIgKyBRVUVSWV9ISU5UX1ZBTFVFICsgIlwiKSwgQFF1ZXJ5SGludH0pIik7CiAJCQl9CiAJCX0pOwogCX0KQEAgLTcyLDYgKzYwLDYgQEAKIAkJcXVlcnlIaW50LnNldE5hbWUoImZvbyIpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIHF1ZXJ5SGludC5nZXROYW1lKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBRdWVyeUhpbnQobmFtZT1cImZvb1wiLCB2YWx1ZT1cIiIgKyBRVUVSWV9ISU5UX1ZBTFVFICsgIlwiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBRdWVyeUhpbnQobmFtZSA9IFwiZm9vXCIsIHZhbHVlID0gXCIiICsgUVVFUllfSElOVF9WQUxVRSArICJcIikiLCBjdSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZVRlc3RzLmphdmEKaW5kZXggOTEyODM1Ni4uM2VkNjU3YyAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBTZWNvbmRhcnlUYWJsZVRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CiAJCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAiTVlfVEFCTEUiOwpAQCAtMjgsMjYgKzI5LDcgQEAKIAkJc3VwZXIobmFtZSk7CiAJfQogCQotCXByaXZhdGUgdm9pZCBjcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVW5pcXVlQ29uc3RyYWludCIsICJTdHJpbmdbXSBjb2x1bW5OYW1lcygpOyIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkgIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJQcmltYXJ5S2V5Sm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCBcIlwiO1N0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCBcIlwiOyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJTZWNvbmRhcnlUYWJsZSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkJIlN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJCSJTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCBcIlwiOyIgKwotCQkJCSJQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHBrSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OyIgKwotCQkJCSJVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OyIpOwotCX0KLQkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02MSw3ICs0Myw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNjksMTMgKzUwLDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlKG5hbWU9XCIiICsgVEFCTEVfTkFNRSArICJcIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCIiICsgVEFCTEVfTkFNRSArICJcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC04MywxMiArNjMsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUoc2NoZW1hPVwiIiArIFNDSEVNQV9OQU1FICsgIlwiKSIpOworCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlKHNjaGVtYSA9IFwiIiArIFNDSEVNQV9OQU1FICsgIlwiKSIpOwogCQkJfQogCQl9KTsKIAl9CisJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC05NiwxNCArNzYsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUoY2F0YWxvZz1cIiIgKyBDQVRBTE9HX05BTUUgKyAiXCIpIik7CisJCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUoY2F0YWxvZyA9IFwiIiArIENBVEFMT0dfTkFNRSArICJcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQotCiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTExLDEzICs4OSwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFaXCJ9KX0pIik7CisJCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFBrSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTEyNSw3ICsxMDIsNyBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zPXtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBUlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFaXCIpfSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0ge0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVpcIil9KSIpOwogCQkJfQogCQl9KTsKIAl9CkBAIC0xNjEsNyArMTM4LDcgQEAKIAkJdGFibGUuc2V0TmFtZSgiRm9vIik7CiAJCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0TmFtZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGb29cIikiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTk3LDcgKzE3NCw3IEBACiAJCXRhYmxlLnNldENhdGFsb2coIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldENhdGFsb2coKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKGNhdGFsb2c9XCJGb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUoY2F0YWxvZyA9IFwiRm9vXCIpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIzMyw3ICsyMTAsNyBAQAogCQl0YWJsZS5zZXRTY2hlbWEoIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldFNjaGVtYSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUoc2NoZW1hPVwiRm9vXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHNjaGVtYSA9IFwiRm9vXCIpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjkwLDcgKzI2Nyw3IEBACiAJCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lc1NpemUoKSk7CiAKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50fSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBUlwiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiRk9PXCIpLCBAVW5pcXVlQ29uc3RyYWludH0pIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzAzLDEzICsyODAsMTMgQEAKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CiAJCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSl9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pIiwgY3UpOwogCQkKIAkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKIAkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50cygpOwogCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CiAJCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHM9QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFaXCJ9KSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSkpIiwgY3UpOwogCQkKIAkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKIAkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50cygpOwpAQCAtMzMyLDcgKzMwOSw3IEBACiAJCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoMywgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KX0pIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0zNTAsNyArMzI3LDcgQEAKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkZPT1wifSl9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pfSkiLCBjdSk7CiAJfQogCQogCQpAQCAtMzk2LDcgKzM3Myw3IEBACiAJCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUucGtKb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKIAogCQlhc3NlcnRFcXVhbHMoMywgdGFibGUucGtKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucz17QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiksQFByaW1hcnlLZXlKb2luQ29sdW1uLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxAUHJpbWFyeUtleUpvaW5Db2x1bW4sIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZVBrSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNDA1LDEwICszODIsMTAgQEAKIAkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRSk7CiAJCQogCQl0YWJsZS5yZW1vdmVQa0pvaW5Db2x1bW4oMSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucz17QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFaXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucyA9IHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFaXCIpfSkiLCBjdSk7CiAKIAkJdGFibGUucmVtb3ZlUGtKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnM9QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVpcIikpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFaXCIpKSIsIGN1KTsKIAogCQkKIAkJdGFibGUucmVtb3ZlUGtKb2luQ29sdW1uKDApOwpAQCAtNDIzLDcgKzQwMCw3IEBACiAJCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7CiAJCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwogCQl0YWJsZS5tb3ZlUGtKb2luQ29sdW1uKDIsIDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnM9e0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBWlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0ge0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVpcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIil9KSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vdmVQa0pvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC00MzYsNyArNDEzLDcgQEAKIAkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKIAkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7CiAJCXRhYmxlLm1vdmVQa0pvaW5Db2x1bW4oMCwgMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucz17QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVpcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0UGtKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNDUzLDcgKzQzMCw3IEBACiAJCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zPXtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cImZvb1wiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFaXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucyA9IHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiZm9vXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFaXCIpfSkiLCBjdSk7CiAJfQogCiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZXNUZXN0cy5qYXZhCmluZGV4IDgwN2RhZWYuLjFjYzlhNDcgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZXNUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZXNUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDE2ICsxMCwxOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlc0Fubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBTZWNvbmRhcnlUYWJsZXNUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCQogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gIk1ZX1RBQkxFIjsKQEAgLTI5LDMzICszMSw4IEBACiAJcHVibGljIFNlY29uZGFyeVRhYmxlc1Rlc3RzKFN0cmluZyBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwogCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlVuaXF1ZUNvbnN0cmFpbnQiLCAiU3RyaW5nW10gY29sdW1uTmFtZXMoKTsiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiUHJpbWFyeUtleUpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKSBkZWZhdWx0IFwiXCI7IFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgXCJcIjtTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgXCJcIjsiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpOwotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJTZWNvbmRhcnlUYWJsZSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsgIiArCi0JCQkJIlN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCBcIlwiOyAiICsKLQkJCQkiU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIjsiICsKLQkJCQkiUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsiICsKLQkJCQkiVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsiKTsKLQkJCi0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJTZWNvbmRhcnlUYWJsZXMiLCAiU2Vjb25kYXJ5VGFibGVbXSB2YWx1ZSgpIik7CQkKLQl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC02OSw3ICs0Niw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTc3LDEzICs1MywxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKG5hbWU9XCIiICsgVEFCTEVfTkFNRSArICJcIikpIik7CisJCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCIiICsgVEFCTEVfTkFNRSArICJcIikpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTkxLDEyICs2NiwxMSBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHNjaGVtYT1cIiIgKyBTQ0hFTUFfTkFNRSArICJcIikpIik7CisJCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShzY2hlbWEgPSBcIiIgKyBTQ0hFTUFfTkFNRSArICJcIikpIik7CiAJCQl9CiAJCX0pOwogCX0KIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMDQsMTQgKzc4LDEzIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUoY2F0YWxvZz1cIiIgKyBDQVRBTE9HX05BTUUgKyAiXCIpKSIpOworCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUoY2F0YWxvZyA9IFwiIiArIENBVEFMT0dfTkFNRSArICJcIikpIik7CiAJCQl9CiAJCX0pOwogCX0KIAogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMTksMTMgKzkyLDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50fSkpIik7CisJCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50fSkpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTM1LDEzICsxMDcsMTIgQEAKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewogCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwogCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiLCBjYXRhbG9nPVwiQkFSXCIsIHNjaGVtYT1cIkJBWlwiLCB1bmlxdWVDb25zdHJhaW50cz1AVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pKSIpOworCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiLCBjYXRhbG9nID0gXCJCQVJcIiwgc2NoZW1hID0gXCJCQVpcIiwgdW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSkpIik7CiAJCQl9CiAJCX0pOwogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzV2l0aFBrSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xNDksNyArMTIwLDcgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zPXtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBUlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFaXCIpfSkpIik7CisJCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0ge0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVpcIil9KSkiKTsKIAkJCX0KIAkJfSk7CiAJfQpAQCAtMTYzLDcgKzEzNCw3IEBACiAJCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24gc2Vjb25kYXJ5VGFibGVzID0gKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKIAkJYXNzZXJ0Tm90TnVsbChzZWNvbmRhcnlUYWJsZXMpOwogCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25BdCgwKTsKKwkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpKTsKIAl9CiAKQEAgLTE3Miw3ICsxNDMsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJCiAJCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24gc2Vjb25kYXJ5VGFibGVzID0gKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25BdCgwKTsKKwkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwogCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7CiAJCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0Q2F0YWxvZygpKTsKIAkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXRTY2hlbWEoKSk7CkBAIC0xODMsMTQgKzE1NCwxNCBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJCiAJCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24gc2Vjb25kYXJ5VGFibGVzID0gKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25BdCgwKTsKKwkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwogCQogCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7CiAKIAkJc2Vjb25kYXJ5VGFibGUuc2V0TmFtZSgiRm9vIik7CiAJCWFzc2VydEVxdWFscygiRm9vIiwgc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRm9vXCIpKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZvb1wiKSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTk4LDcgKzE2OSw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQkKIAkJU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZXMgPSAoU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZXMubmVzdGVkQW5ub3RhdGlvbkF0KDApOworCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CiAJCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBzZWNvbmRhcnlUYWJsZS5nZXROYW1lKCkpOwogCQkKIAkJc2Vjb25kYXJ5VGFibGUuc2V0TmFtZShudWxsKTsKQEAgLTIxMiw3ICsxODMsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJCiAJCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24gc2Vjb25kYXJ5VGFibGVzID0gKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25BdCgwKTsKKwkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCBzZWNvbmRhcnlUYWJsZS5nZXRDYXRhbG9nKCkpOwogCX0KIApAQCAtMjIxLDEzICsxOTIsMTMgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCQogCQlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlcyA9IChTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9uQXQoMCk7CisJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKIAkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXRDYXRhbG9nKCkpOwogCiAJCXNlY29uZGFyeVRhYmxlLnNldENhdGFsb2coIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHNlY29uZGFyeVRhYmxlLmdldENhdGFsb2coKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUoY2F0YWxvZz1cIkZvb1wiKSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShjYXRhbG9nID0gXCJGb29cIikpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIzNSw3ICsyMDYsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJCiAJCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24gc2Vjb25kYXJ5VGFibGVzID0gKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25BdCgwKTsKKwkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCBzZWNvbmRhcnlUYWJsZS5nZXRDYXRhbG9nKCkpOwogCQkKIAkJc2Vjb25kYXJ5VGFibGUuc2V0Q2F0YWxvZyhudWxsKTsKQEAgLTI0OSw3ICsyMjAsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJCiAJCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24gc2Vjb25kYXJ5VGFibGVzID0gKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25BdCgwKTsKKwkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwogCQlhc3NlcnROb3ROdWxsKHNlY29uZGFyeVRhYmxlKTsKIAkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCBzZWNvbmRhcnlUYWJsZS5nZXRTY2hlbWEoKSk7CiAJfQpAQCAtMjU5LDEzICsyMzAsMTMgQEAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCQogCQlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlcyA9IChTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9uQXQoMCk7CisJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKIAkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXRTY2hlbWEoKSk7CiAKIAkJc2Vjb25kYXJ5VGFibGUuc2V0U2NoZW1hKCJGb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGb28iLCBzZWNvbmRhcnlUYWJsZS5nZXRTY2hlbWEoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUoc2NoZW1hPVwiRm9vXCIpKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHNjaGVtYSA9IFwiRm9vXCIpKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldFNjaGVtYU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTI3Myw3ICsyNDQsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJCiAJCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24gc2Vjb25kYXJ5VGFibGVzID0gKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25BdCgwKTsKKwkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwogCQlhc3NlcnRFcXVhbHMoU0NIRU1BX05BTUUsIHNlY29uZGFyeVRhYmxlLmdldFNjaGVtYSgpKTsKIAkJCiAJCXNlY29uZGFyeVRhYmxlLnNldFNjaGVtYShudWxsKTsKQEAgLTI4Nyw3ICsyNTgsNyBAQAogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzKCk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlcyA9IChTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9uQXQoMCk7CisJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKIAkJCiAJCWFzc2VydEVxdWFscygwLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7CiAJfQpAQCAtMjk2LDcgKzI2Nyw3IEBACiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZXMoKTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24gc2Vjb25kYXJ5VGFibGVzID0gKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25BdCgwKTsKKwkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwogCQkKIAkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKTsKIAkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKTsKQEAgLTMwOCw3ICsyNzksNyBAQAogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24gc2Vjb25kYXJ5VGFibGVzID0gKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25BdCgwKTsKKwkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwogCQkJCQogCQlhc3NlcnRFcXVhbHMoMiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwogCX0KQEAgLTMxNyw3ICsyODgsNyBAQAogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzKCk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlcyA9IChTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9uQXQoMCk7CisJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKIAkJCiAJCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7CiAJCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7CkBAIC0zMjcsMjEgKzI5OCwyMSBAQAogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscygwLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZXNTaXplKCkpOwogCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50fSkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBUlwiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiRk9PXCIpLCBAVW5pcXVlQ29uc3RyYWludH0pKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7CiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlcyA9IChTZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9uQXQoMCk7CisJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXN0ZWRBbm5vdGF0aW9ucygpLm5leHQoKTsKIAkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKIAkJCiAJCXNlY29uZGFyeVRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSl9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KX0pIiwgY3UpOwogCQkKIAkJc2Vjb25kYXJ5VGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPUBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSkpIiwgY3UpOwogCQkKIAkJc2Vjb25kYXJ5VGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKIAkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZSIsIGN1KTsKQEAgLTM1MSw3ICszMjIsNyBAQAogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24gc2Vjb25kYXJ5VGFibGVzID0gKFNlY29uZGFyeVRhYmxlc0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25BdCgwKTsKKwkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGVzLm5lc3RlZEFubm90YXRpb25zKCkubmV4dCgpOwogCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwogCQogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CkBAIC0zNjIsMTQgKzMzMywxNCBAQAogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CiAJCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLmhhc05leHQoKSk7CiAJCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludCwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJGT09cIil9KSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50LCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiRk9PXCIpfSkpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZXMgPSAoU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZXMubmVzdGVkQW5ub3RhdGlvbkF0KDApOworCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZXMubmVzdGVkQW5ub3RhdGlvbnMoKS5uZXh0KCk7CiAJCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7CiAJCQogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CkBAIC0zODAsNyArMzUxLDcgQEAKIAkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVzKCkuaGFzTmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQsIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiRk9PXCIpLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pfSkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQsIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KX0pKSIsIGN1KTsKIAl9CiAJCiAJCkBAIC0zOTIsNyArMzYzLDcgQEAKIAkJCiAJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKIAkJc2Vjb25kYXJ5VGFibGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cIkZPT1wiLCBjYXRhbG9nID0gXCJCQVJcIiwgc2NoZW1hID0gXCJCQVpcIiwgdW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkJBUlwiKSksQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiwgc2NoZW1hID0gXCJCQVpcIiwgY2F0YWxvZyA9IFwiQkFSXCIsIHVuaXF1ZUNvbnN0cmFpbnRzID0gQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBUlwiKSksQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKX0pIiwgY3UpOwogCQkKIAkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFKSk7CiAJCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlNFQ09OREFSWV9UQUJMRVMpKTsKQEAgLTQwNSwxMyArMzc2LDEzIEBACiAJCQogCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7CiAJCXNlY29uZGFyeVRhYmxlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9XCJGT09cIiwgY2F0YWxvZyA9IFwiQkFSXCIsIHNjaGVtYSA9IFwiQkFaXCIsIHVuaXF1ZUNvbnN0cmFpbnRzID0gQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJCQVJcIikpLEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIsIHNjaGVtYSA9IFwiQkFaXCIsIGNhdGFsb2cgPSBcIkJBUlwiLCB1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVJcIikpLEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKIAkJCiAJCXNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwogCQlzZWNvbmRhcnlUYWJsZS5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFaXCIpLEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIsIGNhdGFsb2cgPSBcIkJBUlwiLCBzY2hlbWEgPSBcIkJBWlwiLCB1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiQkFSXCIpKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJCQVJcIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVpcIiksQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiLCBzY2hlbWEgPSBcIkJBWlwiLCBjYXRhbG9nID0gXCJCQVJcIiwgdW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFSXCIpKSwgQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKX0pIiwgY3UpOwogCi0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZU5vZGU+IHNlY29uZGFyeVRhYmxlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gc2Vjb25kYXJ5VGFibGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKQEAgLTQyNywxMCArMzk4LDEwIEBACiAJCQogCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7CiAJCXNlY29uZGFyeVRhYmxlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWU9XCJGT09cIiwgY2F0YWxvZyA9IFwiQkFSXCIsIHNjaGVtYSA9IFwiQkFaXCIsIHVuaXF1ZUNvbnN0cmFpbnRzID0gQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJCQVJcIikpLEBTZWNvbmRhcnlUYWJsZShuYW1lPVwiQkFSXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIsIHNjaGVtYSA9IFwiQkFaXCIsIGNhdGFsb2cgPSBcIkJBUlwiLCB1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVJcIikpLEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKIAkJCiAJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShuYW1lPVwiRk9PXCIsIGNhdGFsb2cgPSBcIkJBUlwiLCBzY2hlbWEgPSBcIkJBWlwiLCB1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiQkFSXCIpKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiwgc2NoZW1hID0gXCJCQVpcIiwgY2F0YWxvZyA9IFwiQkFSXCIsIHVuaXF1ZUNvbnN0cmFpbnRzID0gQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBUlwiKSkiLCBjdSk7CiAJfQogCiAJCkBAIC00NzAsNyArNDQxLDcgQEAKIAkJdGFibGUuYWRkUGtKb2luQ29sdW1uKDEpOwogCQl0YWJsZS5hZGRQa0pvaW5Db2x1bW4oMCkuc2V0TmFtZSgiQkFSIik7CiAKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnM9e0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW59KSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0ge0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1ufSkpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUGtKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC00NzksMTAgKzQ1MCwxMCBAQAogCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpLm5leHQoKTsKIAkJCiAJCXRhYmxlLnJlbW92ZVBrSm9pbkNvbHVtbigxKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnM9e0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFSXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBWlwiKX0pKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKX0pKSIsIGN1KTsKIAogCQl0YWJsZS5yZW1vdmVQa0pvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zPUBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFaXCIpKSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0gQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKSkpIiwgY3UpOwogCQkKIAkJdGFibGUucmVtb3ZlUGtKb2luQ29sdW1uKDApOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlIiwgY3UpOwpAQCAtNDk2LDcgKzQ2Nyw3IEBACiAJCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7CiAJCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwogCQl0YWJsZS5tb3ZlUGtKb2luQ29sdW1uKDIsIDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucz17QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJGT09cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiQkFaXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiKX0pKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiKX0pKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdE1vdmVQa0pvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC01MDksNyArNDgwLDcgQEAKIAkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKIAkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7CiAJCXRhYmxlLm1vdmVQa0pvaW5Db2x1bW4oMCwgMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zPXtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkJBWlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiRk9PXCIpfSkpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucyA9IHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFaXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0UGtKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNTI2LDcgKzQ5Nyw3IEBACiAJCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnM9e0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiZm9vXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT1cIkZPT1wiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWU9XCJCQVpcIil9KSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0ge0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVpcIil9KSkiLCBjdSk7CiAJfQogCiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9yVGVzdHMuamF2YQppbmRleCBlMjA5YzRjLi5kNjYwZGY2IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvclRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtMTAsNiArMTAsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CkBAIC0xNyw2ICsxOCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIFNlcXVlbmNlR2VuZXJhdG9yVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfTkFNRSA9ICJNWV9HRU5FUkFUT1IiOwpAQCAtMjcsMTYgKzI5LDggQEAKIAlwdWJsaWMgU2VxdWVuY2VHZW5lcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewogCQlzdXBlcihuYW1lKTsKIAl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlNlcXVlbmNlR2VuZXJhdG9yIiwgIlN0cmluZyBuYW1lKCk7ICIgKwotCQkJIlN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0IFwiXCIiICsKLQkJCSJpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxIiArCi0JCQkiaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MCIpOwotCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNTAsNyArNDQsNiBAQAogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yT25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC03MSw4ICs2NCw3IEBACiAJCXJldHVybiBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudCgic2VxdWVuY2VOYW1lIiwgR0VORVJBVE9SX1NFUVVFTkNFX05BTUUpOwogCX0KIAkJCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KGZpbmFsIFN0cmluZyBlbGVtZW50TmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKCk7CisJcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC04MCwyMSArNzIsMjAgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2VxdWVuY2VHZW5lcmF0b3IoIiArIGVsZW1lbnROYW1lICsgIj1cIiIgKyB2YWx1ZSArICJcIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBTZXF1ZW5jZUdlbmVyYXRvcigiICsgZWxlbWVudE5hbWUgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoSW50RWxlbWVudCgiYWxsb2NhdGlvblNpemUiLCBHRU5FUkFUT1JfQUxMT0NBVElPTl9TSVpFKTsKKwkJcmV0dXJuIGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhJbnRFbGVtZW50KCJhbGxvY2F0aW9uU2l6ZSIsIEdFTkVSQVRPUl9BTExPQ0FUSU9OX1NJWkUuaW50VmFsdWUoKSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoSW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoSW50RWxlbWVudCgiaW5pdGlhbFZhbHVlIiwgR0VORVJBVE9SX0lOSVRJQUxfVkFMVUUpOworCQlyZXR1cm4gY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEludEVsZW1lbnQoImluaXRpYWxWYWx1ZSIsIEdFTkVSQVRPUl9JTklUSUFMX1ZBTFVFLmludFZhbHVlKCkpOwogCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEludEVsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTAyLDcgKzkzLDcgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2VxdWVuY2VHZW5lcmF0b3IoIiArIGVsZW1lbnROYW1lICsgIj0iICsgdmFsdWUgKyAiKSIpOworCQkJCXNiLmFwcGVuZCgiQFNlcXVlbmNlR2VuZXJhdG9yKCIgKyBlbGVtZW50TmFtZSArICIgPSAiICsgdmFsdWUgKyAiKSIpOwogCQkJfQogCQl9KTsKIAl9CkBAIC0xNDQsNyArMTM1LDcgQEAKIAkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZSgiZm9vIik7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT1cImZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lID0gXCJmb29cIikiLCBjdSk7CiAJCQogCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXROYW1lKG51bGwpOwogCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldE5hbWUoKSk7CkBAIC0xNzIsNyArMTYzLDcgQEAKIAkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U2VxdWVuY2VOYW1lKCJmb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTZXF1ZW5jZU5hbWUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlcXVlbmNlR2VuZXJhdG9yKHNlcXVlbmNlTmFtZT1cImZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZXF1ZW5jZUdlbmVyYXRvcihzZXF1ZW5jZU5hbWUgPSBcImZvb1wiKSIsIGN1KTsKIAkJCiAJCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNlcXVlbmNlTmFtZShudWxsKTsKIAkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXRTZXF1ZW5jZU5hbWUoKSk7CkBAIC0yMDAsMTQgKzE5MSwxNCBAQAogCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoNTAwKSk7CiAJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTAwKSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlcXVlbmNlR2VuZXJhdG9yKGFsbG9jYXRpb25TaXplPTUwMCkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2VxdWVuY2VHZW5lcmF0b3IoYWxsb2NhdGlvblNpemUgPSA1MDApIiwgY3UpOwogCQkKIAkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0QWxsb2NhdGlvblNpemUobnVsbCk7CiAJCQogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlcXVlbmNlR2VuZXJhdG9yIiwgY3UpOwogCiAJCXNlcXVlbmNlR2VuZXJhdG9yLnNldEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigwKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2VxdWVuY2VHZW5lcmF0b3IoYWxsb2NhdGlvblNpemU9MCkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2VxdWVuY2VHZW5lcmF0b3IoYWxsb2NhdGlvblNpemUgPSAwKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdEdldEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjMwLDEzICsyMjEsMTQgQEAKIAkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZig1MDApKTsKIAkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MDApLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRJbml0aWFsVmFsdWUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlcXVlbmNlR2VuZXJhdG9yKGluaXRpYWxWYWx1ZT01MDApIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlcXVlbmNlR2VuZXJhdG9yKGluaXRpYWxWYWx1ZSA9IDUwMCkiLCBjdSk7CiAJCQogCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRJbml0aWFsVmFsdWUobnVsbCk7CiAJCQogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlcXVlbmNlR2VuZXJhdG9yIiwgY3UpOwogCiAJCXNlcXVlbmNlR2VuZXJhdG9yLnNldEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoMCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlcXVlbmNlR2VuZXJhdG9yKGluaXRpYWxWYWx1ZT0wKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZXF1ZW5jZUdlbmVyYXRvcihpbml0aWFsVmFsdWUgPSAwKSIsIGN1KTsKIAl9CisKIH0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZUdlbmVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGFibGVHZW5lcmF0b3JUZXN0cy5qYXZhCmluZGV4IGIxMmM2MzguLmY1YzVmMDQgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZUdlbmVyYXRvclRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9yVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIFRhYmxlR2VuZXJhdG9yVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfTkFNRSA9ICJNWV9HRU5FUkFUT1IiOwpAQCAtMzIsMjIgKzMzLDggQEAKIAlwdWJsaWMgVGFibGVHZW5lcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewogCQlzdXBlcihuYW1lKTsKIAl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRhYmxlR2VuZXJhdG9yIiwgIlN0cmluZyBuYW1lKCk7ICIgKwotCQkJIlN0cmluZyB0YWJsZSgpIGRlZmF1bHQgXCJcIiIgKwotCQkJIlN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCBcIlwiIiArCi0JCQkiU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgXCJcIiIgKwotCQkJIlN0cmluZyBwa0NvbHVtbk5hbWUoKSBkZWZhdWx0IFwiXCIiICsKLQkJCSJTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCBcIlwiIiArCi0JCQkiU3RyaW5nIHBrQ29sdW1uVmFsdWUoKSBkZWZhdWx0IFwiXCIiICsKLQkJCSJpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwIiArCi0JCQkiaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MCIgKyAKLQkJCSJVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0e30iKTsKLQl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvck9uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTYxLDcgKzQ4LDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvck9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUYWJsZUdlbmVyYXRvckFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTAyLDcgKzg4LDYgQEAKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUYWJsZUdlbmVyYXRvckFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTEwLDIxICs5NSwyMCBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZUdlbmVyYXRvcigiICsgZWxlbWVudE5hbWUgKyAiPVwiIiArIHZhbHVlICsgIlwiKSIpOworCQkJCXNiLmFwcGVuZCgiQFRhYmxlR2VuZXJhdG9yKCIgKyBlbGVtZW50TmFtZSArICIgPSBcIiIgKyB2YWx1ZSArICJcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoQWxsb2NhdGlvblNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhJbnRFbGVtZW50KCJhbGxvY2F0aW9uU2l6ZSIsIEdFTkVSQVRPUl9BTExPQ0FUSU9OX1NJWkUpOworCQlyZXR1cm4gY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aEludEVsZW1lbnQoImFsbG9jYXRpb25TaXplIiwgR0VORVJBVE9SX0FMTE9DQVRJT05fU0laRS5pbnRWYWx1ZSgpKTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhJbnRFbGVtZW50KCJpbml0aWFsVmFsdWUiLCBHRU5FUkFUT1JfSU5JVElBTF9WQUxVRSk7CisJCXJldHVybiBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoSW50RWxlbWVudCgiaW5pdGlhbFZhbHVlIiwgR0VORVJBVE9SX0lOSVRJQUxfVkFMVUUuaW50VmFsdWUoKSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoSW50RWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC0xMzIsMTQgKzExNiwxMiBAQAogCQkJfQogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZUdlbmVyYXRvcigiICsgZWxlbWVudE5hbWUgKyAiPSIgKyB2YWx1ZSArICIpIik7CisJCQkJc2IuYXBwZW5kKCJAVGFibGVHZW5lcmF0b3IoIiArIGVsZW1lbnROYW1lICsgIiA9ICIgKyB2YWx1ZSArICIpIik7CiAJCQl9CiAJCX0pOwogCX0KIAogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlVuaXF1ZUNvbnN0cmFpbnQiLCAiU3RyaW5nW10gY29sdW1uTmFtZXMoKTsiKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtMTQ3LDcgKzEyOSw3IEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRhYmxlR2VuZXJhdG9yKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVpcIn0pfSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBUYWJsZUdlbmVyYXRvcih1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkiKTsKIAkJCX0KIAkJfSk7CiAJfQpAQCAtMTg5LDcgKzE3MSw3IEBACiAJCXRhYmxlR2VuZXJhdG9yLnNldE5hbWUoImZvbyIpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKG5hbWU9XCJmb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IobmFtZSA9IFwiZm9vXCIpIiwgY3UpOwogCQkKIAkJdGFibGVHZW5lcmF0b3Iuc2V0TmFtZShudWxsKTsKIAkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwpAQCAtMjE3LDcgKzE5OSw3IEBACiAJCXRhYmxlR2VuZXJhdG9yLnNldFRhYmxlKCJmb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0YWJsZUdlbmVyYXRvci5nZXRUYWJsZSgpKTsKIAkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodGFibGU9XCJmb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodGFibGUgPSBcImZvb1wiKSIsIGN1KTsKIAkJCiAJCXRhYmxlR2VuZXJhdG9yLnNldFRhYmxlKG51bGwpOwogCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFRhYmxlKCkpOwpAQCAtMjQ1LDcgKzIyNyw3IEBACiAJCXRhYmxlR2VuZXJhdG9yLnNldENhdGFsb2coImZvbyIpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlR2VuZXJhdG9yLmdldENhdGFsb2coKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKGNhdGFsb2c9XCJmb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IoY2F0YWxvZyA9IFwiZm9vXCIpIiwgY3UpOwogCQkKIAkJdGFibGVHZW5lcmF0b3Iuc2V0Q2F0YWxvZyhudWxsKTsKIAkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRDYXRhbG9nKCkpOwpAQCAtMjczLDcgKzI1NSw3IEBACiAJCXRhYmxlR2VuZXJhdG9yLnNldFNjaGVtYSgiZm9vIik7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGVHZW5lcmF0b3IuZ2V0U2NoZW1hKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihzY2hlbWE9XCJmb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3Ioc2NoZW1hID0gXCJmb29cIikiLCBjdSk7CiAJCQogCQl0YWJsZUdlbmVyYXRvci5zZXRTY2hlbWEobnVsbCk7CiAJCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U2NoZW1hKCkpOwpAQCAtMzAxLDcgKzI4Myw3IEBACiAJCXRhYmxlR2VuZXJhdG9yLnNldFBrQ29sdW1uTmFtZSgiZm9vIik7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5OYW1lKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihwa0NvbHVtbk5hbWU9XCJmb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IocGtDb2x1bW5OYW1lID0gXCJmb29cIikiLCBjdSk7CiAJCQogCQl0YWJsZUdlbmVyYXRvci5zZXRQa0NvbHVtbk5hbWUobnVsbCk7CiAJCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5OYW1lKCkpOwpAQCAtMzI5LDcgKzMxMSw3IEBACiAJCXRhYmxlR2VuZXJhdG9yLnNldFZhbHVlQ29sdW1uTmFtZSgiZm9vIik7CiAJCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGVHZW5lcmF0b3IuZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcih2YWx1ZUNvbHVtbk5hbWU9XCJmb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodmFsdWVDb2x1bW5OYW1lID0gXCJmb29cIikiLCBjdSk7CiAJCQogCQl0YWJsZUdlbmVyYXRvci5zZXRWYWx1ZUNvbHVtbk5hbWUobnVsbCk7CiAJCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwpAQCAtMzU3LDcgKzMzOSw3IEBACiAJCXRhYmxlR2VuZXJhdG9yLnNldFBrQ29sdW1uVmFsdWUoImZvbyIpOwogCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlR2VuZXJhdG9yLmdldFBrQ29sdW1uVmFsdWUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKHBrQ29sdW1uVmFsdWU9XCJmb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IocGtDb2x1bW5WYWx1ZSA9IFwiZm9vXCIpIiwgY3UpOwogCQkKIAkJdGFibGVHZW5lcmF0b3Iuc2V0UGtDb2x1bW5WYWx1ZShudWxsKTsKIAkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtblZhbHVlKCkpOwpAQCAtMzg1LDE0ICszNjcsMTQgQEAKIAkJdGFibGVHZW5lcmF0b3Iuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDUwMCkpOwogCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUwMCksIHRhYmxlR2VuZXJhdG9yLmdldEFsbG9jYXRpb25TaXplKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihhbGxvY2F0aW9uU2l6ZT01MDApIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKGFsbG9jYXRpb25TaXplID0gNTAwKSIsIGN1KTsKIAkJCiAJCXRhYmxlR2VuZXJhdG9yLnNldEFsbG9jYXRpb25TaXplKG51bGwpOwogCQkKIAkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZUdlbmVyYXRvciIsIGN1KTsKIAogCQl0YWJsZUdlbmVyYXRvci5zZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKGFsbG9jYXRpb25TaXplPTApIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKGFsbG9jYXRpb25TaXplID0gMCkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RHZXRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTQxNSwxNCArMzk3LDE0IEBACiAJCXRhYmxlR2VuZXJhdG9yLnNldEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoNTAwKSk7CiAJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTAwKSwgdGFibGVHZW5lcmF0b3IuZ2V0SW5pdGlhbFZhbHVlKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihpbml0aWFsVmFsdWU9NTAwKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihpbml0aWFsVmFsdWUgPSA1MDApIiwgY3UpOwogCQkKIAkJdGFibGVHZW5lcmF0b3Iuc2V0SW5pdGlhbFZhbHVlKG51bGwpOwogCQkKIAkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZUdlbmVyYXRvciIsIGN1KTsKIAogCQl0YWJsZUdlbmVyYXRvci5zZXRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDApKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihpbml0aWFsVmFsdWU9MCkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IoaW5pdGlhbFZhbHVlID0gMCkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNDM3LDcgKzQxOSw2IEBACiAJCiAJcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JPbkZpZWxkKCk7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlVuaXF1ZUNvbnN0cmFpbnQiLCAiU3RyaW5nW10gY29sdW1uTmFtZXMoKTsiKTsKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwogCQkKQEAgLTQ2MSw3ICs0NDIsNiBAQAogCQogCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvck9uRmllbGQoKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVW5pcXVlQ29uc3RyYWludCIsICJTdHJpbmdbXSBjb2x1bW5OYW1lcygpOyIpOwogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQpAQCAtNDc2LDcgKzQ1Niw3IEBACiAJCWFzc2VydEVxdWFscygwLCB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZXNTaXplKCkpOwogCiAJCWFzc2VydEVxdWFscygzLCB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiQkFSXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiRk9PXCIpLCBAVW5pcXVlQ29uc3RyYWludH0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSwgQFVuaXF1ZUNvbnN0cmFpbnR9KSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTQ4NywxMCArNDY3LDEwIEBACiAJCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CiAJCQogCQl0YWJsZUdlbmVyYXRvci5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVpcIn0pfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSIsIGN1KTsKIAkJCiAJCXRhYmxlR2VuZXJhdG9yLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHM9QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFaXCJ9KSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSkpIiwgY3UpOwogCQkKIAkJdGFibGVHZW5lcmF0b3IucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKIAkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZUdlbmVyYXRvciIsIGN1KTsKQEAgLTUwNCw3ICs0ODQsNyBAQAogCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwogCQkKIAkJdGFibGVHZW5lcmF0b3IubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSl9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcih1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pfSkiLCBjdSk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTUxNSw3ICs0OTUsNyBAQAogCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwogCQkKIAkJdGFibGVHZW5lcmF0b3IubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPXtcIkZPT1wifSl9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcih1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pfSkiLCBjdSk7CiAJfQogCQogfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZVRlc3RzLmphdmEKaW5kZXggNTQ5NWM0ZC4uMmZjZTZmYiAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGFibGVUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE3LDYgKzE3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgVGFibGVUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCQogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gIk1ZX1RBQkxFIjsKQEAgLTI2LDE4ICsyNyw4IEBACiAJcHVibGljIFRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKIAkJc3VwZXIobmFtZSk7CiAJfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUYWJsZSIsICJTdHJpbmcgbmFtZSgpIGRlZmF1bHQgXCJcIjsgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0IFwiXCI7IFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0IFwiXCI7IFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Iik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVW5pcXVlQ29uc3RyYWludCIsICJTdHJpbmdbXSBjb2x1bW5OYW1lcygpOyIpOwotCX0KIAkKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRhYmxlQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC01MSw3ICs0Miw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUYWJsZUFubm90YXRpb24oKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNTksMTMgKzQ5LDEyIEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRhYmxlKG5hbWU9XCIiICsgVEFCTEVfTkFNRSArICJcIikiKTsKKwkJCQlzYi5hcHBlbmQoIkBUYWJsZShuYW1lID0gXCIiICsgVEFCTEVfTkFNRSArICJcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVXaXRoU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRhYmxlQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC03MywxMyArNjIsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGUoc2NoZW1hPVwiIiArIFNDSEVNQV9OQU1FICsgIlwiKSIpOworCQkJCXNiLmFwcGVuZCgiQFRhYmxlKHNjaGVtYSA9IFwiIiArIFNDSEVNQV9OQU1FICsgIlwiKSIpOwogCQkJfQogCQl9KTsKIAl9CiAJCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZVdpdGhDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRhYmxlQW5ub3RhdGlvbigpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC04NywxMyArNzUsMTIgQEAKIAkJCX0KIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGUoY2F0YWxvZz1cIiIgKyBDQVRBTE9HX05BTUUgKyAiXCIpIik7CisJCQkJc2IuYXBwZW5kKCJAVGFibGUoY2F0YWxvZyA9IFwiIiArIENBVEFMT0dfTkFNRSArICJcIikiKTsKIAkJCX0KIAkJfSk7CiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGFibGVBbm5vdGF0aW9uKCk7CiAJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKQEAgLTEwMSw3ICs4OCw3IEBACiAJCQl9CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVpcIn0pfSkiKTsKKwkJCQlzYi5hcHBlbmQoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkiKTsKIAkJCX0KIAkJfSk7CiAJfQpAQCAtMTM3LDcgKzEyNCw3IEBACiAJCXRhYmxlLnNldE5hbWUoIkZvbyIpOwogCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldE5hbWUoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKG5hbWU9XCJGb29cIikiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUobmFtZSA9IFwiRm9vXCIpIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE3Myw3ICsxNjAsNyBAQAogCQl0YWJsZS5zZXRDYXRhbG9nKCJGb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZShjYXRhbG9nPVwiRm9vXCIpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKGNhdGFsb2cgPSBcIkZvb1wiKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldENhdGFsb2dOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0yMDksNyArMTk2LDcgQEAKIAkJdGFibGUuc2V0U2NoZW1hKCJGb28iKTsKIAkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXRTY2hlbWEoKSk7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHNjaGVtYT1cIkZvb1wiKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZShzY2hlbWEgPSBcIkZvb1wiKSIsIGN1KTsKIAl9CiAJCiAJcHVibGljIHZvaWQgdGVzdFNldFNjaGVtYU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTI2NSw3ICsyNTIsNyBAQAogCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CiAJCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZXNTaXplKCkpOwogCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50fSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBUlwiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiRk9PXCIpLCBAVW5pcXVlQ29uc3RyYWludH0pIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTI3OCw3ICsyNjUsNyBAQAogCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoIkJBUiIpOwogCQl0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuYWRkQ29sdW1uTmFtZSgiQkFaIik7CiAJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludCxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17IFwiQkFSXCIsIFwiQkFaXCIgfSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiRk9PXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQsQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7IFwiQkFSXCIsIFwiQkFaXCIgfSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIil9KSIsIGN1KTsKIAkJCiAJCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKIAkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMgPSB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZXMoKTsKQEAgLTI5MSwxMCArMjc4LDEwIEBACiAJCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7CiAJCQogCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVpcIn0pfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSIsIGN1KTsKIAkJCiAJCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHM9QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9e1wiQkFaXCJ9KSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSkpIiwgY3UpOwogCQkKIAkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKIAkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZSIsIGN1KTsKQEAgLTMwNywxMyArMjk0LDEzIEBACiAJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7CiAJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgiQkFSIik7CiAJCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHM9e0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiRk9PXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiQkFSXCIpLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkJBWlwiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBUlwiKSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBWlwiKX0pIiwgY3UpOwogCQkKIAkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJCQVpcIil9KSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFSXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVpcIil9KSIsIGN1KTsKIAkJCiAJCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHM9QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJCQVpcIikpIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0gQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBWlwiKSkiLCBjdSk7CiAJCQogCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwogCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlIiwgY3UpOwpAQCAtMzI2LDEzICszMTMsMTMgQEAKIAkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKIAkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKCJCQVIiKTsKIAkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cz17QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJGT09cIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXM9XCJCQVJcIiksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzPVwiQkFaXCIpfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFSXCIpLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFaXCIpfSkiLCBjdSk7CiAJCQogCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkZPT1wiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkJBUlwiKX0pIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBUlwiKX0pIiwgY3UpOwogCQkKIAkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cz1AVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz1cIkZPT1wiKSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiRk9PXCIpKSIsIGN1KTsKIAkJCiAJCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7CiAJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGUiLCBjdSk7CkBAIC0zNDQsNyArMzMxLDcgQEAKIAkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKIAkJCiAJCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KX0pIiwgY3UpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0zNTMsNyArMzQwLDcgQEAKIAkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKIAkJCiAJCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzPXtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcz17XCJGT09cIn0pfSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KX0pIiwgY3UpOwogCX0KIAkKIH0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UZW1wb3JhbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGVtcG9yYWxUZXN0cy5qYXZhCmluZGV4IDlhY2E4NzguLmE3NTc3MWIgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UZW1wb3JhbFRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RlbXBvcmFsVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIFRlbXBvcmFsVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAogCXB1YmxpYyBUZW1wb3JhbFRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0yNSw4ICsyNiw2IEBACiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUZW1wb3JhbCIsICJUZW1wb3JhbFR5cGUgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiVGVtcG9yYWxUeXBlIiwgIkRBVEUsIFRJTUUsIFRJTUVTVEFNUCIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC00MCw4ICszOSw2IEBACiAJfQogCQogCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGVtcG9yYWxXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVtcG9yYWwiLCAiVGVtcG9yYWxUeXBlIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIlRlbXBvcmFsVHlwZSIsICJEQVRFLCBUSU1FLCBUSU1FU1RBTVAiKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RyYW5zaWVudFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNpZW50VGVzdHMuamF2YQppbmRleCA4OWM3ZGI1Li5kMTI1MjJmIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNpZW50VGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNpZW50VGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBUcmFuc2llbnRUZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewogCiAJcHVibGljIFRyYW5zaWVudFRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC0yNSw3ICsyNiw2IEBACiAJfQogCiAJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUcmFuc2llbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVHJhbnNpZW50IiwgIiIpOwogCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CkBAIC00Myw3ICs0Myw3IEBACiAJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKIAkJCi0JCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOworCQlKYXZhUmVzb3VyY2VOb2RlIG1hcHBpbmdBbm5vdGF0aW9uID0gYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CiAJCWFzc2VydFRydWUobWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBUcmFuc2llbnRBbm5vdGF0aW9uKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9WZXJzaW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9WZXJzaW9uVGVzdHMuamF2YQppbmRleCBlZWY2NGU5Li44MmU1Mjg4IDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVmVyc2lvblRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ZlcnNpb25UZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBWZXJzaW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKIAogCXB1YmxpYyBWZXJzaW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTI1LDcgKzI2LDYgQEAKIAl9CiAKIAlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVmVyc2lvbiIsICIiKTsKIAkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewpAQCAtNDMsNyArNDMsNyBAQAogCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKIAkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CiAJCQotCQlKYXZhUmVzb3VyY2VOb2RlIG1hcHBpbmdBbm5vdGF0aW9uID0gYXR0cmlidXRlUmVzb3VyY2UuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKKwkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKIAkJYXNzZXJ0VHJ1ZShtYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIFZlcnNpb25Bbm5vdGF0aW9uKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRpb25UZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uVGVzdENhc2UuamF2YQppbmRleCAxYjhkN2E1Li44MWM4ZDdmIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRpb25UZXN0Q2FzZS5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQW5ub3RhdGlvblRlc3RDYXNlLmphdmEKQEAgLTEyLDcgKzEyLDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKQEAgLTMyLDcgKzMyLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRNZXRob2RBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5Qcm9qZWN0VXRpbGl0eTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5UeXBlOwpAQCAtNDAsMTQgKzM5LDEzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KIC8qKgogICogUHJvdmlkZSBhbiBlYXN5KD8pIHdheSB0byBidWlsZCBhbiBhbm5vdGF0ZWQgc291cmNlIGZpbGUuCiAgKiBUaGUgdHlwZSBtdXN0IGJlIGNyZWF0ZWQgYnkgY2FsbGluZyBvbmUgb2YgdGhlICNjcmVhdGVUeXBlKCkgbWV0aG9kcwogICogYmVmb3JlIGNhbGxpbmcgYW55IG9mIHRoZSB2YXJpb3VzIGhlbHBlciBtZXRob2RzIChpLmUuIHRoZSB0eXBlIGlzICpub3QqCiAgKiBjcmVhdGVkIGR1cmluZyAjc2V0VXAoKSkuCiAgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGFic3RyYWN0IGNsYXNzIEFubm90YXRpb25UZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKIAlwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwogCkBAIC03MiwxNCArNzAsOSBAQAogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZGVsZXRlQWxsUHJvamVjdHMoKTsKIAkJdGhpcy5qYXZhUHJvamVjdCA9IHRoaXMuYnVpbGRKYXZhUHJvamVjdChmYWxzZSk7ICAvLyBmYWxzZSA9IG5vIGF1dG8tYnVpbGQKIAl9CiAJCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlQWxsUHJvamVjdHMoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVByb2plY3RVdGlsaXR5LmRlbGV0ZUFsbFByb2plY3RzKCk7IAkJCi0JfQotCQogCXByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgYnVpbGRKYXZhUHJvamVjdChib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiB0aGlzLmJ1aWxkSmF2YVByb2plY3QoUFJPSkVDVF9OQU1FLCBhdXRvQnVpbGQpOwogCX0KQEAgLTkxLDcgKzg0LDcgQEAKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewogLy8JCXRoaXMuZHVtcFNvdXJjZSgpOwotLy8JCXRoaXMuamF2YVByb2plY3QuZGlzcG9zZSgpOworCQl0aGlzLmphdmFQcm9qZWN0LmdldFByb2plY3QoKS5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7CiAJCVRlc3RUb29scy5jbGVhcih0aGlzKTsKIAkJc3VwZXIudGVhckRvd24oKTsKIAl9CkBAIC0yMzEsNyArMjI0LDcgQEAKIAl9CiAKIAlwcm90ZWN0ZWQgSkRUVHlwZSBidWlsZFR5cGUoU3RyaW5nIG5hbWUsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHlwZShudWxsLCBuYW1lLCAxLCBjdSk7CisJCXJldHVybiB0aGlzLmJ1aWxkVHlwZShudWxsLCBuYW1lLCBvY2N1cnJlbmNlLCBjdSk7CiAJfQogCiAJcHJvdGVjdGVkIEpEVFR5cGUgYnVpbGRUeXBlKFR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG5hbWUsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0NvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQppbmRleCAxMDk0N2Q5Li5mZWI0MWJkIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0NvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgpAQCAtOSwyMCArOSwyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwogCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKIHB1YmxpYyBjbGFzcyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewogCiAJcHVibGljIENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewpAQCAtNDAsNyArNDIsNyBAQAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAogCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMCk7CiAJCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKIAkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKIAkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5Kb2luQ29sdW1uIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKIAkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKTsKQEAgLTUzLDcgKzU1LDcgQEAKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKIAkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDEpOwogCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE51bGwoYW5ub3RhdGlvbik7CiAJfQogCkBAIC02NCw3ICs2Niw3IEBACiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCiAJCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAwKTsKIAkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwogCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwogCQlhc3NlcnRFcXVhbHMoImFubm90LkpvaW5Db2x1bW4iLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwogCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpOwpAQCAtNzcsNyArNzksNyBAQAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAogCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMSk7CiAJCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKIAkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKIAl9CiAKQEAgLTg4LDcgKzkwLDcgQEAKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKIAkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDEpOwogCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CiAJCWFzc2VydEVxdWFscygiYW5ub3QuSm9pbkNvbHVtbiIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7CiAJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSk7CkBAIC0xMDMsNyArMTA1LDcgQEAKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKIAkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7CiAJCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKIAkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKIAl9CiAKQEAgLTExNCw3ICsxMTYsNyBAQAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAogCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKIAkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwogCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwogCQlhc3NlcnRFcXVhbHMoImFubm90LkpvaW5Db2x1bW4iLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwogCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpOwpAQCAtMTI5LDcgKzEzMSw3IEBACiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCiAJCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAxKTsKIAkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwogCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwogCX0KIApAQCAtMjEyLDcgKzIxNCw3IEBACiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCiAJCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKIAkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwogCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwogCiAJCWFhLnJlbW92ZUFubm90YXRpb24oKTsKQEAgLTIyOCw3ICsyMzAsNyBAQAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAogCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMSk7CiAJCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKIAkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKIAogCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7CkBAIC0yNDMsNyArMjQ1LDcgQEAKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKIAkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDIpOwogCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CiAKIAkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwpAQCAtMjU4LDcgKzI2MCw3IEBACiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCiAJCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKIAkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwogCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwogCiAJCWFhLnJlbW92ZUFubm90YXRpb24oKTsKQEAgLTI3Myw3ICsyNzUsNyBAQAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAogCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMyk7CiAJCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKIAkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKIAogCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7CkBAIC0yODgsNyArMjkwLDcgQEAKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKIAkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDIpOwogCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CiAKIAkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwpAQCAtMzAzLDcgKzMwNSw3IEBACiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCiAJCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDApOwogCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE51bGwoYW5ub3RhdGlvbik7CiAKIAkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwpAQCAtMzE5LDExICszMjEsMTEgQEAKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKIAkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7CiAJCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKIAkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKIAogCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhjb2x1bW5zPXtASm9pbkNvbHVtbixASm9pbkNvbHVtbn0pIiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoY29sdW1ucyA9IHsgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uIH0pIiwgY3UpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMzMzLDcgKzMzNSw3IEBACiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCiAJCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDIpOwogCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE51bGwoYW5ub3RhdGlvbik7CiAKIAkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwpAQCAtMzQ3LDcgKzM0OSw3IEBACiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCiAJCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDApOwogCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CiAKIAkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwpAQCAtMzYzLDcgKzM2NSw3IEBACiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCiAJCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDApOwogCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CiAKIAkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwpAQCAtMzc4LDcgKzM4MCw3IEBACiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCiAJCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwogCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE51bGwoYW5ub3RhdGlvbik7CiAKIAkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwpAQCAtMzkyLDExICszOTQsMTEgQEAKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKIAkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7CiAJCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKIAkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKIAogCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhjb2x1bW5zPXtASm9pbkNvbHVtbig3NyksQEpvaW5Db2x1bW59KSIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKGNvbHVtbnMgPSB7IEBKb2luQ29sdW1uKDc3KSwgQEpvaW5Db2x1bW4gfSkiLCBjdSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC00MDYsNyArNDA4LDcgQEAKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKIAkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7CiAJCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKIAkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKIAogCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7CkBAIC00MjAsMzMgKzQyMiw0NyBAQAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAogCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKIAkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwogCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwogCiAJCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKGNvbHVtbnM9e0BKb2luQ29sdW1uKHRleHQ9XCJibGFoXCIsIG51bT00MiksQEpvaW5Db2x1bW59KSIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKGNvbHVtbnMgPSB7IEBKb2luQ29sdW1uKHRleHQgPSBcImJsYWhcIiwgbnVtID0gNDIpLCBASm9pbkNvbHVtbiB9KSIsIGN1KTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsgU3RyaW5nIHRleHQoKTsgaW50IG51bSgpOyIpOwogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4odGV4dD1cImJsYWhcIixudW09NDIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJASm9pbkNvbHVtbnMoY29sdW1ucz17QEpvaW5Db2x1bW4odGV4dD1cImJsYWhcIiwgbnVtPTQyKSxudWxsLEBKb2luQ29sdW1ufSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbih0ZXh0PVwiYlwiLG51bT00KSIpOworCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBKb2luQ29sdW1ucyhjb2x1bW5zID0geyBASm9pbkNvbHVtbih0ZXh0ID0gXCJiXCIsIG51bSA9IDQpLCBudWxsLCI7CisJCVN0cmluZyBleHBlY3RlZDIgPSAiQEpvaW5Db2x1bW4gfSkiOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMSwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMiwgY3UpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAogCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAyKTsKIAkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKIAkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yNCgpIHRocm93cyBFeGNlcHRpb24gewogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7IFN0cmluZyB0ZXh0KCk7IGludCBudW0oKTsiKTsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbih0ZXh0PVwiYmxhaFwiLG51bT00MikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJASm9pbkNvbHVtbnMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEpvaW5Db2x1bW4odGV4dD1cImJsYWhcIiwgbnVtPTQyKSxudWxsLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQEpvaW5Db2x1bW4iICsgQ1IgKyAiICAgIH0pIjsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKHRleHQ9XCJibGFoXCIsbnVtPTQyKSIpOwkKKwkJCisJCS8vVXNlIG9sZCBmb3JtYXR0aW5nIGlmIGpkdCBjb3JlIHZlcnNpb24gaXMgMy41IG9yIGJlbG93IC0gc2VlIGJ1ZyAyODU2MDQKKwkJVmVyc2lvbiB2ZXJzaW9uID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qZHQuY29yZSIpLmdldFZlcnNpb24oKTsKKwkJaW50IG1ham9yVmVyc2lvbiA9IHZlcnNpb24uZ2V0TWFqb3IoKTsKKwkJaW50IG1pbm9yVmVyc2lvbiA9IHZlcnNpb24uZ2V0TWlub3IoKTsKKwkJLy9UaGlzIGNvbmRpdGlvbiBzaG91bGQgYmUgcmVtb3ZlZCBhbmQgdGVzdCB1cGRhdGVkIGFmdGVyIERhbGkgMy4wIGJyYW5jaGVzIAorCQlTdHJpbmcgZXhwZWN0ZWQxOworCQlpZiAobWFqb3JWZXJzaW9uID09IDMgJiYgbWlub3JWZXJzaW9uIDw9IDUpIHsKKwkJCWV4cGVjdGVkMSA9ICJASm9pbkNvbHVtbnMoIHsiOworCQl9CisJCWVsc2UgZXhwZWN0ZWQxID0gIkBKb2luQ29sdW1ucyh7IjsKKwkJCisJCVN0cmluZyBleHBlY3RlZDIgPSAiQEpvaW5Db2x1bW4odGV4dCA9IFwiYmxhaFwiLCBudW0gPSA0MiksIG51bGwsIjsKKwkJU3RyaW5nIGV4cGVjdGVkMyA9ICJASm9pbkNvbHVtbiAiICsgQ1IgKyAiICAgIH0pIjsKIAkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDEsIGN1KTsKIAkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDIsIGN1KTsKIAkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDMsIGN1KTsKQEAgLTQ5NSwxMiArNTExLDEyIEBACiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEpvaW5Db2x1bW5zKGNvbHVtbnM9e251bGwsQEpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpfSkiOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEpvaW5Db2x1bW5zKGNvbHVtbnMgPSB7IG51bGwsIEBKb2luQ29sdW1uKG5hbWUgPSBcIkFERFJFU1NfSUQwXCIpIH0pIjsKIAkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwogCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAogCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKIAkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CiAKIAkJaWFhLm1vdmVBbm5vdGF0aW9uKDEpOwpAQCAtNTE1LDcgKzUzMSw3IEBACiAJCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCiAJCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwogCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKIAkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKIAogCQlpYWEubW92ZUFubm90YXRpb24oMCk7CkBAIC01MzEsNyArNTQ3LDcgQEAKIAkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKIAkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDEpOwogCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKIAkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKIAogCQlpYWEubW92ZUFubm90YXRpb24oMCk7CkBAIC01NDgsNyArNTY0LDcgQEAKIAkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKIAkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMyk7CiAJCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwogCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwogCiAJCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKQEAgLTU2NCw3ICs1ODAsNyBAQAogCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAogCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAzKTsKIAkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CiAKIAkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwpAQCAtNTgwLDcgKzU5Niw3IEBACiAJCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCiAJCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDIpOwogCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKIAkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKIAogCQlpYWEubW92ZUFubm90YXRpb24oMyk7CkBAIC01OTYsNyArNjEyLDcgQEAKIAkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKIAkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMCk7CiAJCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwogCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwogCiAJCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKQEAgLTYxMiw3ICs2MjgsNyBAQAogCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAogCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAzKTsKIAkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE51bGwoYW5ub3RhdGlvbik7CiAKIAkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwpAQCAtNjI4LDcgKzY0NCw3IEBACiAJCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCiAJCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDMpOwogCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKIAkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKIAogCQlpYWEubW92ZUFubm90YXRpb24oMCk7CkBAIC02NDMsNyArNjU5LDcgQEAKIAkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKIAkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMCk7CiAJCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwogCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwogCiAJCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKQEAgLTY1OCw3ICs2NzQsNyBAQAogCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAogCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAyKTsKIAkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE51bGwoYW5ub3RhdGlvbik7CiAKIAkJaWFhLm1vdmVBbm5vdGF0aW9uKDEpOwpAQCAtNjc0LDcgKzY5MCw3IEBACiAJCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCiAJCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKIAkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE51bGwoYW5ub3RhdGlvbik7CiAKIAkJaWFhLm1vdmVBbm5vdGF0aW9uKDEpOwpAQCAtNjg5LDcgKzcwNSw3IEBACiAJCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCiAJCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwogCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbihKRFRUb29scy5idWlsZEFTVFJvb3QoY3UpKTsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKIAkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKIAogCQlpYWEubW92ZUFubm90YXRpb24oMCk7CkBAIC03MDQsNyArNzIwLDcgQEAKIAkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKIAkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMik7CiAJCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKEpEVFRvb2xzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwogCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwogCiAJCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKQEAgLTcyMCw3ICs3MzYsNyBAQAogCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAogCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAzKTsKIAkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oSkRUVG9vbHMuYnVpbGRBU1RSb290KGN1KSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CiAJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CiAKIAkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9KcHRDb3JlVXRpbGl0eUpkdFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0pwdENvcmVVdGlsaXR5SmR0VGVzdHMuamF2YQppbmRleCBlOTUyNTZmLi41ODEwZGMxIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0pwdENvcmVVdGlsaXR5SmR0VGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0pwdENvcmVVdGlsaXR5SmR0VGVzdHMuamF2YQpAQCAtMTUsMTAgKzE1LDYgQEAKIHB1YmxpYyBjbGFzcyBKcHRDb3JlVXRpbGl0eUpkdFRlc3RzIHsKIAogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIHN1aXRlKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoYm9vbGVhbiBhbGwpIHsKIAkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRDb3JlVXRpbGl0eUpkdFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwogCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmNsYXNzKTsKIAkJc3VpdGUuYWRkVGVzdFN1aXRlKERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlclRlc3RzLmNsYXNzKTsKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMuamF2YQppbmRleCAwZjI1ZjliLi4wZjBmMzVlIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L01lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlclRlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9NZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTEwLDcgKzEwLDYgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1ROb2RlVGV4dFJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXI7CkBAIC0yNywxMiArMjYsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewogCiAJcHVibGljIE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7CkBAIC00NCw3ICs0NSwxMSBAQAogCX0KIAogCXByaXZhdGUgdm9pZCBjcmVhdGVFbnVtKFN0cmluZyBlbnVtTmFtZSwgU3RyaW5nIGVudW1Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImVudW1zIiwgZW51bU5hbWUgKyAiLmphdmEiLCAicHVibGljIGVudW0gIiArIGVudW1OYW1lICsgIiB7ICIgKyBlbnVtQm9keSArICIgfSIpOworCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zIiwgZW51bU5hbWUsIGVudW1Cb2R5KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlRW51bShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBlbnVtTmFtZSwgU3RyaW5nIGVudW1Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQocGFja2FnZU5hbWUsIGVudW1OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBlbnVtICIgKyBlbnVtTmFtZSArICIgeyAiICsgZW51bUJvZHkgKyAiIH0iKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC00NjAsNyArNDY1LDcgQEAKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwogCiAJCWFlYS5zZXRWYWx1ZSgieHh4Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyPVwieHh4XCIpIiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKGJhciA9IFwieHh4XCIpIiwgY3UpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTQ5Myw3ICs0OTgsNyBAQAogCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKIAogCQlhZWEuc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhAQmFyKGppbW15PUBCYXooZnJlZD10cnVlKSkpIiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKEBCYXIoamltbXkgPSBAQmF6KGZyZWQgPSB0cnVlKSkpIiwgY3UpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTUyMCw3ICs1MjUsNyBAQAogCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7CiAKIAkJYWVhLnNldFZhbHVlKCJ4eHgiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXI9XCJ4eHhcIikiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyID0gXCJ4eHhcIikiLCBjdSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlOSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNTM0LDcgKzUzOSw3IEBACiAKIAkJYWVhLnNldFZhbHVlKCJ4eHgiKTsKIAkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28odmFsdWU9XCJ6enpcIiwgYmFyPVwieHh4XCIpIiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKHZhbHVlID0gXCJ6enpcIiwgYmFyID0gXCJ4eHhcIikiLCBjdSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTYxMiw3ICs2MTcsNyBAQAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CiAJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKIAkJYWVhLnNldFZhbHVlKCJqYXZhLmxhbmcuT2JqZWN0Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyPWphdmEubGFuZy5PYmplY3QuY2xhc3MpIiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKGJhciA9IGphdmEubGFuZy5PYmplY3QuY2xhc3MpIiwgY3UpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVUeXBlTGl0ZXJhbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTY0OSw3ICs2NTQsNyBAQAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CiAJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKIAkJYWVhLnNldFZhbHVlKCJpbnQiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXI9aW50LmNsYXNzKSIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXIgPSBpbnQuY2xhc3MpIiwgY3UpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVUeXBlTGl0ZXJhbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTY3MCw2ICs2NzUsNjIgQEAKIAkJYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgYWVhLmdldFZhbHVlKCkpOwogCX0KIAorCXB1YmxpYyB2b2lkIHRlc3RUeXBlTGl0ZXJhbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9amF2YS5sYW5nLk9iamVjdC5jbGFzcykiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOworCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBhZWEuZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFR5cGVMaXRlcmFsMigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKKwkJYWVhLnNldFZhbHVlKCJqYXZhLmxhbmcuT2JqZWN0Iik7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyID0gamF2YS5sYW5nLk9iamVjdC5jbGFzcykiLCBjdSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFR5cGVMaXRlcmFsMygpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1qYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKSIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7CisJCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcC5FbnRyeSIsIGFlYS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VHlwZUxpdGVyYWwxNCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1pbnQuY2xhc3MpIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKKwkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBhZWEuZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFR5cGVMaXRlcmFsNSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKKwkJYWVhLnNldFZhbHVlKCJpbnQiKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXIgPSBpbnQuY2xhc3MpIiwgY3UpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RUeXBlTGl0ZXJhbDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9dm9pZC5jbGFzcykiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOworCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBhZWEuZ2V0VmFsdWUoKSk7CisJfQorCiAJcHVibGljIHZvaWQgdGVzdFZhbHVlRW51bTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKQEAgLTcxMyw5ICs3NzQsOSBAQAogCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW0xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0gYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oYmFyPVhYWCkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgic3RhdGljIGVudW1zLlRlc3RFbnVtLlhYWCIsIGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oYmFyPVhYWCkiOworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgic3RhdGljIGVudW1zLlRlc3RFbnVtLlhYWCIsIGV4cGVjdGVkKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwpAQCAtNzI2LDE1ICs3ODcsMTY4IEBACiAJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXI9WFhYKSI7CisJCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKGJhciA9IFhYWCkiOwogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwogCQlhZWEuc2V0VmFsdWUoImVudW1zLlRlc3RFbnVtLlhYWCIpOwogCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUltcG9ydENvbGxpc2lvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczEiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOworCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMiIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtczEuVGVzdEVudW0gYmFyMSgpOyAgZW51bXMyLlRlc3RFbnVtIGJhcjIoKTsiKTsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyMSA9IFhYWCwgYmFyMiA9IFRlc3RFbnVtLlhYWCkiOworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CisKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWExID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWExKTsKKwkJYWVhMS5zZXRWYWx1ZSgiZW51bXMxLlRlc3RFbnVtLlhYWCIpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTIgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMiA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7CisJCWFlYTIuc2V0VmFsdWUoImVudW1zMi5UZXN0RW51bS5YWFgiKTsKKworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zMS5UZXN0RW51bS5YWFg7IiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zMi5UZXN0RW51bS5YWFg7IiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMyLlRlc3RFbnVtOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1JbXBvcnRDb2xsaXNpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlRW51bSgiZW51bXMxIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKKwkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczIiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOworCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMxLlRlc3RFbnVtIGJhcjEoKTsgIGVudW1zMi5UZXN0RW51bSBiYXIyKCk7Iik7CisJCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKGJhcjE9WFhYLCBiYXIyID0gVGVzdEVudW0uWFhYKSI7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJzdGF0aWMgZW51bXMxLlRlc3RFbnVtLioiLCAiQGFubm90LkZvbyhiYXIxPVhYWCkiKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjEiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7CisJCWFzc2VydE5vdE51bGwoYWVhMS5nZXRWYWx1ZSgpKTsKKworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEyID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTIpOworCQlhZWEyLnNldFZhbHVlKCJlbnVtczIuVGVzdEVudW0uWFhYIik7CisKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtczEuVGVzdEVudW0uKjsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMyLlRlc3RFbnVtLlhYWDsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBlbnVtczIuVGVzdEVudW07IiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUltcG9ydENvbGxpc2lvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bTEiLCAiWFhYLCBZWVksIFpaWiIpOworCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMiIsICJYWFgsIFlZWSwgWlpaIik7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bTEgYmFyMSgpOyAgZW51bXMuVGVzdEVudW0yIGJhcjIoKTsiKTsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyMSA9IFhYWCwgYmFyMiA9IFRlc3RFbnVtMi5YWFgpIjsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjEiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7CisJCWFlYTEuc2V0VmFsdWUoImVudW1zLlRlc3RFbnVtMS5YWFgiKTsKKworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEyID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTIpOworCQlhZWEyLnNldFZhbHVlKCJlbnVtcy5UZXN0RW51bTIuWFhYIik7CisKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bTEuWFhYOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGVudW1zLlRlc3RFbnVtMjsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtSW1wb3J0Q29sbGlzaW9uNCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMSIsICJYWFgsIFlZWSwgWlpaIik7CisJCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0yIiwgIlhYWCwgWVlZLCBaWloiKTsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtMSBiYXIxKCk7ICBlbnVtcy5UZXN0RW51bTIgYmFyMigpOyIpOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhiYXIxPVhYWCwgYmFyMiA9IFRlc3RFbnVtMi5YWFgpIjsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInN0YXRpYyBlbnVtcy5UZXN0RW51bTEuKiIsICJAYW5ub3QuRm9vKGJhcjE9WFhYKSIpOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CisKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWExID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWExKTsKKwkJYXNzZXJ0Tm90TnVsbChhZWExLmdldFZhbHVlKCkpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTIgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMiA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7CisJCWFlYTIuc2V0VmFsdWUoImVudW1zLlRlc3RFbnVtMi5YWFgiKTsKKworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtMS4qOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGVudW1zLlRlc3RFbnVtMjsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKKwl9CisKKwkvKioKKwkgKiBub3Qgc3VyZSB0aGlzIGlzIGV4YWN0bHkgd2hhdCB3ZSB3YW50Li4uCisJICogaXQgd291bGQgYmUgbmljZSBpZiB3ZSBqdXN0IHNraXAgdGhlIHN0YXRpYyBpbXBvcnQ7IGJ1dCBpdCdzIGEgbWF0dGVyIG9mIHRhc3RlLi4uCisJICovCisJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUltcG9ydENvbGxpc2lvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bTEiLCAiWFhYLCBZWVksIFpaWiIpOworCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMiIsICJYWFgsIFlZWSwgWlpaIik7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bTEgYmFyMSgpOyAgZW51bXMuVGVzdEVudW0yIGJhcjIoKTsiKTsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyMSA9IFhYWCwgYmFyMiA9IFRlc3RFbnVtMi5YWFgpIjsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoImVudW1zLioiLCAiIik7CisJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKKworCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKKworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWExID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOworCQlhZWExLnNldFZhbHVlKCJlbnVtcy5UZXN0RW51bTEuWFhYIik7CisKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMiA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMiIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEyID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKKwkJYWVhMi5zZXRWYWx1ZSgiZW51bXMuVGVzdEVudW0yLlhYWCIpOworCisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBlbnVtcy4qOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bTEuWFhYOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IGVudW1zLlRlc3RFbnVtMjsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtSW1wb3J0Q29sbGlzaW9uNigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMSIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7CisJCXRoaXMuY3JlYXRlRW51bSgiZW51bXMyIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKKwkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczMiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOworCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMxLlRlc3RFbnVtIGJhcjEoKTsgIGVudW1zMi5UZXN0RW51bSBiYXIyKCk7ICBlbnVtczMuVGVzdEVudW0gYmFyMygpOyIpOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIxID0gWFhYLCBiYXIyID0gVGVzdEVudW0uWFhYLCBiYXIzID0gZW51bXMzLlRlc3RFbnVtLlhYWCkiOworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CisKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWExID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWExKTsKKwkJYWVhMS5zZXRWYWx1ZSgiZW51bXMxLlRlc3RFbnVtLlhYWCIpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTIgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMiA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7CisJCWFlYTIuc2V0VmFsdWUoImVudW1zMi5UZXN0RW51bS5YWFgiKTsKKworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEzID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIzIik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTMgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTMpOworCQlhZWEzLnNldFZhbHVlKCJlbnVtczMuVGVzdEVudW0uWFhYIik7CisKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtczEuVGVzdEVudW0uWFhYOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IHN0YXRpYyBlbnVtczIuVGVzdEVudW0uWFhYOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGVudW1zMi5UZXN0RW51bTsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMzIiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgZW51bXMzIiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFZhbHVlU3RyaW5nQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTc4NCw0NCArOTk4LDQ0IEBACiAKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTdHJpbmdBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBGb28oYmFyPXtcInN0cmluZzBcIixcInN0cmluZzFcIn0pIjsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyID0geyBcInN0cmluZzBcIiwgXCJzdHJpbmcxXCIgfSkiOwogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7CiAJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7CiAJCWFlYS5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJzdHJpbmcwIiwgInN0cmluZzEifSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3RyaW5nQXJyYXlFbXB0eVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBGb28iOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyI7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKIAkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbMF0pOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVN0cmluZ0FycmF5RW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJARm9vKGJhcj17fSkiOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIgPSB7fSkiOwogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKIAkJRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmdbXT4gZXhwcmVzc2lvbkNvbnZlcnRlciA9IG5ldyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSwgZmFsc2UpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIGV4cHJlc3Npb25Db252ZXJ0ZXIpOwogCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwogCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1swXSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3RyaW5nQXJyYXlTaW5nbGVFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXI9XCJzdHJpbmcwXCIpIjsKKwkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXIgPSBcInN0cmluZzBcIikiOwogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CkBAIC04OTQsNTYgKzExMDgsMTkwIEBACiAJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW1bXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXI9e1hYWCxZWVl9KSI7CisJCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKGJhciA9IHsgWFhYLCBZWVkgfSkiOwogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7CiAJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7CiAJCWFlYS5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJlbnVtcy5UZXN0RW51bS5YWFgiLCAiZW51bXMuVGVzdEVudW0uWVlZIn0pOwogCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtLlhYWDsiLCBjdSk7CiAJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0uWVlZOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlFbXB0eVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBGb28iOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyI7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKIAkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbMF0pOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1BcnJheUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW1bXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXI9e30pIjsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyID0ge30pIjsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIsIHRydWUsIGZhbHNlKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKIAkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbMF0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1BcnJheVNpbmdsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJARm9vKGJhcj1YWFgpIjsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyID0gWFhYKSI7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKIAkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zLlRlc3RFbnVtLlhYWCJ9KTsKIAkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1BcnJheUltcG9ydENvbGxpc2lvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczEiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOworCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMiIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtczEuVGVzdEVudW1bXSBiYXIxKCk7ICBlbnVtczIuVGVzdEVudW1bXSBiYXIyKCk7Iik7CisJCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKGJhcjEgPSB7IFhYWCwgWVlZIH0sIGJhcjIgPSB7IFRlc3RFbnVtLlhYWCwgVGVzdEVudW0uWVlZIH0pIjsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWExKTsKKwkJYWVhMS5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJlbnVtczEuVGVzdEVudW0uWFhYIiwgImVudW1zMS5UZXN0RW51bS5ZWVkifSk7CisKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEyID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEyID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTIpOworCQlhZWEyLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zMi5UZXN0RW51bS5YWFgiLCAiZW51bXMyLlRlc3RFbnVtLllZWSJ9KTsKKworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zMS5UZXN0RW51bS5YWFg7IiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zMS5UZXN0RW51bS5ZWVk7IiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zMi5UZXN0RW51bS5YWFg7IiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zMi5UZXN0RW51bS5ZWVk7IiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMyLlRlc3RFbnVtOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1BcnJheUltcG9ydENvbGxpc2lvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczEiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOworCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMiIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtczEuVGVzdEVudW1bXSBiYXIxKCk7ICBlbnVtczIuVGVzdEVudW1bXSBiYXIyKCk7Iik7CisJCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKGJhcjE9e1hYWCxZWVl9LCBiYXIyID0geyBUZXN0RW51bS5YWFgsIFRlc3RFbnVtLllZWSB9KSI7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJzdGF0aWMgZW51bXMxLlRlc3RFbnVtLioiLCAiQGFubm90LkZvbyhiYXIxPXtYWFgsWVlZfSkiKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWExKTsKKwkJYXNzZXJ0Tm90TnVsbChhZWExLmdldFZhbHVlKCkpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMiA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMiA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKKwkJYWVhMi5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJlbnVtczIuVGVzdEVudW0uWFhYIiwgImVudW1zMi5UZXN0RW51bS5ZWVkifSk7CisKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtczEuVGVzdEVudW0uKjsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMyLlRlc3RFbnVtLlhYWDsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMyLlRlc3RFbnVtLllZWTsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBlbnVtczIuVGVzdEVudW07IiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUFycmF5SW1wb3J0Q29sbGlzaW9uMygpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMSIsICJYWFgsIFlZWSwgWlpaIik7CisJCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0yIiwgIlhYWCwgWVlZLCBaWloiKTsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtMVtdIGJhcjEoKTsgIGVudW1zLlRlc3RFbnVtMltdIGJhcjIoKTsiKTsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyMSA9IHsgWFhYLCBZWVkgfSwgYmFyMiA9IHsgVGVzdEVudW0yLlhYWCwgVGVzdEVudW0yLllZWSB9KSI7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7CisJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKKworCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKKworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7CisJCWFlYTEuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0xLlhYWCIsICJlbnVtcy5UZXN0RW51bTEuWVlZIn0pOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMiA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMiA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKKwkJYWVhMi5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJlbnVtcy5UZXN0RW51bTIuWFhYIiwgImVudW1zLlRlc3RFbnVtMi5ZWVkifSk7CisKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bTEuWFhYOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bTEuWVlZOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bTIuWFhYOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bTIuWVlZOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGVudW1zLlRlc3RFbnVtMjsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlJbXBvcnRDb2xsaXNpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0xIiwgIlhYWCwgWVlZLCBaWloiKTsKKwkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bTIiLCAiWFhYLCBZWVksIFpaWiIpOworCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0xW10gYmFyMSgpOyAgZW51bXMuVGVzdEVudW0yW10gYmFyMigpOyIpOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhiYXIxPXtYWFgsWVlZfSwgYmFyMiA9IHsgVGVzdEVudW0yLlhYWCwgVGVzdEVudW0yLllZWSB9KSI7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJzdGF0aWMgZW51bXMuVGVzdEVudW0xLioiLCAiQGFubm90LkZvbyhiYXIxPXtYWFgsWVlZfSkiKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWExKTsKKwkJYXNzZXJ0Tm90TnVsbChhZWExLmdldFZhbHVlKCkpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMiA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMiA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKKwkJYWVhMi5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJlbnVtcy5UZXN0RW51bTIuWFhYIiwgImVudW1zLlRlc3RFbnVtMi5ZWVkifSk7CisKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bTEuKjsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0yLlhYWDsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0yLllZWTsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBlbnVtcy5UZXN0RW51bTI7IiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUFycmF5SW1wb3J0Q29sbGlzaW9uNigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMSIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7CisJCXRoaXMuY3JlYXRlRW51bSgiZW51bXMyIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKKwkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczMiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOworCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMxLlRlc3RFbnVtW10gYmFyMSgpOyAgZW51bXMyLlRlc3RFbnVtW10gYmFyMigpOyAgZW51bXMzLlRlc3RFbnVtW10gYmFyMygpOyIpOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIxID0geyBYWFgsIFlZWSB9LCBiYXIyID0geyBUZXN0RW51bS5YWFgsIFRlc3RFbnVtLllZWSB9LCBiYXIzID0geyBlbnVtczMuVGVzdEVudW0uWFhYLCBlbnVtczMuVGVzdEVudW0uWVlZIH0pIjsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWExKTsKKwkJYWVhMS5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJlbnVtczEuVGVzdEVudW0uWFhYIiwgImVudW1zMS5UZXN0RW51bS5ZWVkifSk7CisKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEyID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEyID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTIpOworCQlhZWEyLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zMi5UZXN0RW51bS5YWFgiLCAiZW51bXMyLlRlc3RFbnVtLllZWSJ9KTsKKworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTMgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMyIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTMgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMyk7CisJCWFlYTMuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMzLlRlc3RFbnVtLlhYWCIsICJlbnVtczMuVGVzdEVudW0uWVlZIn0pOworCisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMxLlRlc3RFbnVtLlhYWDsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMxLlRlc3RFbnVtLllZWTsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMyIiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMyLlRlc3RFbnVtOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IHN0YXRpYyBlbnVtczMiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBlbnVtczMiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTWlzY1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L01pc2NUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MWUwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L01pc2NUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBNaXNjVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgeworCisJcHVibGljIE1pc2NUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvKgorCSAqIFNpZ25hdHVyZS50b1N0cmluZyguLi4pIHJldHVybnMgYSBkb3QtcXVhbGlmaWVkIG5hbWUgZm9yIG1lbWJlciB0eXBlcworCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTaWduYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSVR5cGUgaGFzaFRhYmxlVHlwZSA9IHRoaXMuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKCJqYXZhLnV0aWwuSGFzaHRhYmxlIik7CisJCUlGaWVsZCB0YWJsZUZpZWxkID0gaGFzaFRhYmxlVHlwZS5nZXRGaWVsZCgidGFibGUiKTsKKwkJU3RyaW5nIHRhYmxlRmllbGRUeXBlU2lnbmF0dXJlID0gdGFibGVGaWVsZC5nZXRUeXBlU2lnbmF0dXJlKCk7CisJCVN0cmluZyB0YWJsZUZpZWxkVHlwZU5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcodGFibGVGaWVsZFR5cGVTaWduYXR1cmUpOworCQlhc3NlcnRFcXVhbHModGFibGVGaWVsZFR5cGVOYW1lLCAiamF2YS51dGlsLkhhc2h0YWJsZS5FbnRyeVtdIik7CisJfQorCisJLyoKKwkgKiBJVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSByZXR1cm5zIGEgZG9sbGFyLXF1YWxpZmllZCBuYW1lIGZvciBtZW1iZXIgdHlwZXMKKwkgKiAoYnV0IHRoZSBsb29rdXAgb24gSUphdmFQcm9qZWN0IHRha2VzIGEgZG90LXF1YWxpZmllZCBuYW1lISkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0SVR5cGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlUeXBlIGhhc2hUYWJsZUVudHJ5VHlwZSA9IHRoaXMuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKCJqYXZhLnV0aWwuSGFzaHRhYmxlLkVudHJ5Iik7CisJCWFzc2VydEVxdWFscyhoYXNoVGFibGVFbnRyeVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksICJqYXZhLnV0aWwuSGFzaHRhYmxlJEVudHJ5Iik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdElUeXBlUGFyYW1ldGVyaXplZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSVR5cGUgbWFwVHlwZSA9IHRoaXMuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKCJqYXZhLnV0aWwuTWFwIik7CisJCWFzc2VydEVxdWFscyhtYXBUeXBlLmdldEZ1bGx5UXVhbGlmaWVkUGFyYW1ldGVyaXplZE5hbWUoKSwgImphdmEudXRpbC5NYXA8SyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QsIFYgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PiIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEKaW5kZXggZmY0NmFhMy4uYTY2ODdlMyAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKIAogCXB1YmxpYyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTI1Myw3ICsyNTQsNyBAQAogCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwogCiAJCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBCYXIpIiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb24gPSBAQmFyKSIsIGN1KTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTI3Niw3ICsyNzcsNyBAQAogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBCYXIpIjsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbiA9IEBCYXIpIjsKIAkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwogCiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCkBAIC0zMTAsNyArMzExLDcgQEAKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsgU3RyaW5nIHZhbHVlKCk7Iik7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKHZhbHVlPVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb249QEJhcikiOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb24gPSBAQmFyKSI7CiAJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKIAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKApAQCAtMzg0LDcgKzM4NSw3IEBACiAJCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xKGRlY2xhcmF0aW9uKTsKIAkJCX0KIAkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbj1AQmFyKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbiA9IEBCYXIoXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSIsIGN1KTsKIAl9CiAKIAl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CkBAIC00MzMsNyArNDM0LDcgQEAKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbj1AQmFyKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKIAkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwogCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7CiAJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKQEAgLTQ4Myw3ICs0ODQsNyBAQAogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyBTdHJpbmcgdmFsdWUoKTsiKTsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWU9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbj1AQmFyKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb24gPSBAQmFyKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAJCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKIAkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewpAQCAtNTg5LDcgKzU5MCw3IEBACiAJCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xKGRlY2xhcmF0aW9uKTsKIAkJCX0KIAkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbj1AQmFyKHl5eT1cInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb24gPSBAQmFyKHl5eSA9IFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiLCBjdSk7CiAJfQogCiAJdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjEoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewpAQCAtNjExLDcgKzYxMiw3IEBACiAJCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24yKGRlY2xhcmF0aW9uKTsKIAkJCX0KIAkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcih5eXk9XCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhAQmFyKHl5eSA9IFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiLCBjdSk7CiAJfQogCiAJdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewpAQCAtNjI3LDcgKzYyOCw3IEBACiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBCYXIoeXl5PVwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcih5eXkgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKIAkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwogCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7CiAJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKQEAgLTY1MCw3ICs2NTEsNyBAQAogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHl5eSgpOyIpOwogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKEBCYXIoeXl5PVwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhAQmFyKHl5eSA9IFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAJCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKIAkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewpAQCAtNjczLDcgKzY3NCw3IEBACiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyBTdHJpbmcgdmFsdWUoKTsiKTsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWU9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbj1AQmFyKHl5eT1cInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWUgPSBcInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcih5eXkgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKIAkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwogCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7CiAJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKQEAgLTY5Niw3ICs2OTcsNyBAQAogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHl5eSgpOyIpOwogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0IHZhbHVlKCk7Iik7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoeXl5PVwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKHl5eSA9IFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAJCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKIAkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQppbmRleCA1MGM4YTgzLi4zODNhZDczIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC0yNyw2ICsyNyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247CiAKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogcHVibGljIGNsYXNzIE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewogCiAJcHVibGljIE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTYzMSw3ICs2MzIsNyBAQAogCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwogCiAJCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKSIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIpIiwgY3UpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNjU0LDcgKzY1NSw3IEBACiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIpIjsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKSI7CiAJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKIAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKQEAgLTY4OCw3ICs2ODksNyBAQAogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgdmFsdWUoKTsgYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWU9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnM9QEJhcikiOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0gQEJhcikiOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCkBAIC03NjMsMTMgKzc2NCwxNSBAQAogCQlhc3NlcnROdWxsKGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7CiAKIAkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb25zPXtudWxsLG51bGwsbnVsbCxudWxsLG51bGwsQEJhcn0pIiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb25zID0geyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBAQmFyIH0pIiwgY3UpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7CisJCVN0cmluZyBleHBlY3RlZDEgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0geyBudWxsLCBudWxsLCBudWxsLCBudWxsLCI7CisJCVN0cmluZyBleHBlY3RlZDIgPSAibnVsbCwgQEJhciB9KSI7CiAJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkJhciIsIGN1KTsKIAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKQEAgLTc3OSw3ICs3ODIsOCBAQAogCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwogCiAJCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyh2YWx1ZT1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucz17bnVsbCxudWxsLG51bGwsbnVsbCxudWxsLEBCYXJ9KSIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xMDU0LDcgKzEwNTgsNyBAQAogCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEoZGVjbGFyYXRpb24pOwogCQkJfQogCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKDg4KSkiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKDg4KSkiLCBjdSk7CiAJfQogCiAJdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewpAQCAtMTA5Niw3ICsxMTAwLDcgQEAKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcig4OCkpIjsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKDg4KSkiOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAJCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKIAkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewpAQCAtMTE0Niw3ICsxMTUwLDcgQEAKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKHZhbHVlPVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zPUBCYXIoODgpKSI7CisJCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKHZhbHVlID0gXCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKDg4KSkiOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAJCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKIAkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewpAQCAtMTI1NSwxMyArMTI1OSwxNSBAQAogCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwogCiAJCWFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17bnVsbCxudWxsLG51bGwsbnVsbCxudWxsLEBCYXIoTUlTU0lORyl9KSIsIGN1KTsgIC8vID8/PworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb25zID0geyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBAQmFyKE1JU1NJTkcpIH0pIiwgY3UpOyAgLy8gPz8/CiAJfQogCiAJcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xMCgpIHRocm93cyBFeGNlcHRpb24gewogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgdmFsdWUoKTsgYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKKwkJU3RyaW5nIGV4cGVjdGVkMSA9ICJARm9vKHZhbHVlID0gXCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnMgPSB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIjsKKwkJU3RyaW5nIGV4cGVjdGVkMiA9ICJudWxsLCBAQmFyKE1JU1NJTkcpIH0pIjsgIC8vID8/PwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwogCiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKApAQCAtMTI3MSw3ICsxMjc3LDggQEAKIAkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKIAogCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28odmFsdWU9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnM9e251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyKE1JU1NJTkcpfSkiLCBjdSk7ICAvLyA/Pz8KKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xNTQ5LDcgKzE1NTYsNyBAQAogCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjEoZGVjbGFyYXRpb24pOwogCQkJfQogCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKHh4eD04OCkpIiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb25zID0gQEJhcih4eHggPSA4OCkpIiwgY3UpOwogCX0KIAogCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKQEAgLTE1NzEsNyArMTU3OCw3IEBACiAJCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMihkZWNsYXJhdGlvbik7CiAJCQl9CiAJCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKEBCYXIoeHh4PTg4KSkiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcih4eHggPSA4OCkpIiwgY3UpOwogCX0KIAogCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24yKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKQEAgLTE1ODcsNyArMTU5NCw3IEBACiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKHh4eD04OCkpIjsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKHh4eCA9IDg4KSkiOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAJCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKIAkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewpAQCAtMTYxMCw3ICsxNjE3LDcgQEAKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKEBCYXIoeHh4PTg4KSkiOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhAQmFyKHh4eCA9IDg4KSkiOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAJCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKIAkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewpAQCAtMTYzMyw3ICsxNjQwLDcgQEAKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7IFN0cmluZyB2YWx1ZSgpOyIpOwogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZT1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKHh4eD04OCkpIjsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWUgPSBcInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIoeHh4ID0gODgpKSI7CiAJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKIAkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewogCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CkBAIC0xNjU2LDcgKzE2NjMsNyBAQAogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcih4eHg9ODgpKSI7CisJCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoeHh4ID0gODgpKSI7CiAJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKIAkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewogCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CkBAIC0xNzM0LDEzICsxNzQxLDE1IEBACiAJCWFzc2VydE51bGwoYW5ub3RhdGlvbik7CiAKIAkJYWEubmV3Tm9ybWFsQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb25zPXtudWxsLG51bGwsbnVsbCxudWxsLG51bGwsQEJhcigpfSkiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbnMgPSB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIEBCYXIoKSB9KSIsIGN1KTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyBTdHJpbmcgdmFsdWUoKTsiKTsKIAkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKKwkJU3RyaW5nIGV4cGVjdGVkMSA9ICJARm9vKHZhbHVlID0gXCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnMgPSB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIjsKKwkJU3RyaW5nIGV4cGVjdGVkMiA9ICJudWxsLCBAQmFyKCkgfSkiOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwogCiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKApAQCAtMTc1MCwxNCArMTc1OSwxNSBAQAogCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwogCiAJCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyh2YWx1ZT1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucz17bnVsbCxudWxsLG51bGwsbnVsbCxudWxsLEBCYXIoKX0pIiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwogCX0KIAogCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtcIm9uZVwiLCBcInR3b1wifSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0BCYXIoeHh4PTg4KSwgXCJ0d29cIn0pIjsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeyBcIm9uZVwiLCBcInR3b1wiIH0pIik7CisJCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHsgQEJhcih4eHggPSA4OCksIFwidHdvXCIgfSkiOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAJCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKIAkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewpAQCAtMTc5Niw3ICsxODA2LDcgQEAKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDcpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoeHh4PTg4KSkiOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKHh4eCA9IDg4KSkiOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAJCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKIAkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewpAQCAtMTgzNiw3ICsxODQ2LDcgQEAKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7CiAJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5Ob3RCYXIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoeHh4PTg4KSkiOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKHh4eCA9IDg4KSkiOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAJCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKIAkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewpAQCAtMTg4MSw4ICsxODkxLDggQEAKIAlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjE3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17XCJzb21ldGhpbmdcIn0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAQmFyKHh4eD04OCl9KSI7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zID0geyBcInNvbWV0aGluZ1wiIH0pIik7CisJCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zID0geyBAQmFyKHh4eCA9IDg4KSB9KSI7CiAJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKIAkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewogCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CkBAIC0xOTIwLDggKzE5MzAsOCBAQAogCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIoeHh4PTg4KSkiOworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IFwic29tZXRoaW5nXCIpIik7CisJCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zID0gQEJhcih4eHggPSA4OCkpIjsKIAkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwogCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7CiAJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKQEAgLTE5NDQsOCArMTk1NCw4IEBACiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgeHh4KCk7Iik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuTm90QmFyKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKHh4eD04OCkpIjsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAYW5ub3QuTm90QmFyKSIpOworCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIoeHh4ID0gODgpKSI7CiAJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKIAkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewogCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CkBAIC0xOTg0LDggKzE5OTQsOCBAQAogCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoNzcpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKHh4eD04OCkpIjsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAYW5ub3QuQmFyKDc3KSkiKTsKKwkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKHh4eCA9IDg4KSkiOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7CiAJCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKIAkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEKaW5kZXggYTA5MWZmMy4uNTg4NDYzNSAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgogICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKIAorQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKIAogCXB1YmxpYyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKQEAgLTMyLDcgKzMzLDExIEBACiAJfQogCiAJcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImFubm90IiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7fSIpOworCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oImFubm90IiwgYW5ub3RhdGlvbk5hbWUpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQocGFja2FnZU5hbWUsIGFubm90YXRpb25OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBAaW50ZXJmYWNlICIgKyBhbm5vdGF0aW9uTmFtZSArICIge30iKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTEzMiw3ICsxMzcsOCBAQAogCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewogCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwogCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuRm9vIiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgYW5ub3QuRm9vOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEZvbyIsIGN1KTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CiAJCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7CiAJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKQEAgLTE5MCw3ICsxOTYsNyBAQAogCQkJfQogCQl9KTsKIAkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGFubm90LkZvbzsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyPVwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXIgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikiLCBjdSk7CiAJfQogCiAJdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CkBAIC0yMDIsNCArMjA4LDY3IEBACiAJCXRoaXMudmFsdWVzKGFubm90YXRpb24pLmFkZChtdnApOwogCX0KIAorCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRDb2xsaXNpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3QxIiwgIkZvbyIpOworCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oImFubm90MiIsICJGb28iKTsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEZvbyIsIGN1KTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90MS5Gb28iKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90Mi5Gb28iKTsKKworCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbjEgPSBhYTEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlhc3NlcnROdWxsKGFubm90YXRpb24xKTsKKworCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7CisJCUFubm90YXRpb24gYW5ub3RhdGlvbjIgPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOworCQlhc3NlcnROdWxsKGFubm90YXRpb24yKTsKKworCQlhYTEubmV3TWFya2VyQW5ub3RhdGlvbigpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgYW5ub3QxLkZvbzsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28iLCBjdSk7CisKKwkJYWEyLm5ld01hcmtlckFubm90YXRpb24oKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IGFubm90Mi5Gb287IiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QyLkZvbyIsIGN1KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0Q29sbGlzaW9uMigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oImFubm90MSIsICJGb28iKTsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdDIiLCAiRm9vIik7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJhbm5vdDEuKiIsICJARm9vIik7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdDEuKjsiLCBjdSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28iLCBjdSk7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdDEuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdDIuRm9vIik7CisKKwkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24xID0gYWExLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKKwkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uMSk7CisKKwkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOworCQlBbm5vdGF0aW9uIGFubm90YXRpb24yID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKKwkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uMik7CisKKwkJYWEyLm5ld01hcmtlckFubm90YXRpb24oKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IGFubm90Mi5Gb287IiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QyLkZvbyIsIGN1KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0V2lsZENhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoImFubm90LioiLCAiIik7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdC4qOyIsIGN1KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEZvbyIsIGN1KTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCisJCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKKwkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uMSA9IGFhMS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7CisJCWFzc2VydE51bGwoYW5ub3RhdGlvbjEpOworCisJCWFhMS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7CisJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBhbm5vdC5Gb287IiwgY3UpOworCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vIiwgY3UpOworCX0KKwogfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3Rlc3QueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3Rlc3QueG1sCmluZGV4IGM5MzVhZTMuLmE2NzBjMGYgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy90ZXN0LnhtbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvdGVzdC54bWwKQEAgLTYsNiArNiw4IEBACiAJPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+CiAJPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lIC0tPgogCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzIi8+CisgICAgPGVjaG8gbGV2ZWw9ImRlYnVnIiBtZXNzYWdlPSJ0ZXN0Um9vdDogJHt0ZXN0Um9vdH0iIC8+CisgICAgPGZhaWwgbWVzc2FnZT0idGVzdFJvb3QgbXVzdCBiZSBzZXQiIHVubGVzcz0idGVzdFJvb3QiIC8+CiAKIAk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+CiAJPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KQEAgLTE5LDExICsyMSwxNiBAQAogCiAJPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KIAk8dGFyZ2V0IG5hbWU9InN1aXRlIj4KKyAgICAJPHByb3BlcnR5IGZpbGU9IiR7dGVzdFJvb3R9L3Rlc3RTZXJ2ZXIucHJvcGVydGllcyIvPgorCSAgICA8cHJvcGVydHkgbmFtZT0ianB0LWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qcHRfZm9sZGVyIi8+CisJICAgIDxkZWxldGUgZGlyPSIke2pwdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgorCiAJCTxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgorCQkgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtqcHQtZm9sZGVyfSIvPgogCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KIAkJCTxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5KcHRDb3JlVGVzdHMiIC8+CiAJCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iIi8+CisJCQk8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSItRG9yZy5lY2xpcHNlLmpwdC5qcGEuamFyPSR7dGVzdERpcn0vJHtqcHQtcGVyc2lzdGVuY2UtamFyfSIvPgogCQk8L2FudD4KIAk8L3RhcmdldD4KIApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjhkOTFjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLmN2c2lnbm9yZSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWIwMTI3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzZDBjNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBKYW4gMTUgMTE6MTE6MTEgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzY2FkZmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5KcHREYlRlc3RzUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUVjbGlwc2UtTGF6eVN0YXJ0OiBmYWxzZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbMy44LjIsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmdlbmVyaWM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuZGI7YnVuZGxlLXZlcnNpb249IlsxLjEuMSwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3Jtczt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2Fib3V0Lmh0bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QwZDAxMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotIyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgCi0jICBDb250cmlidXRvcnM6IAotIyAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9kZXJieTEwMS5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvZGVyYnkxMDEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ5N2FkZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9kZXJieTEwMS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyAgUGxhdGZvcm0gUHJvcGVydHkgbmFtZXMgJiBEZWZhdWx0Ci0jCi0jICBwcm9maWxlTmFtZSAgLSBqcGF0ZXN0Ci0jICBwcm9maWxlRGVzY3JpcHRpb24gIC0gSkRCQyBQcm9maWxlIGZvciBKUEEgVGVzdGluZwotIyAgdXNlck5hbWUgIC0ganBhdGVzdAotIyAgdXNlclBhc3N3b3JkICAtIChlbXB0eSkKLSMgIGRhdGFiYXNlZHJpdmVySmFyTGlzdCAgLSAobWFuZGF0b3J5KQotIyAgZGF0YWJhc2VOYW1lICAtIHRlc3RkYgotIyAgZGF0YWJhc2VVcmwgIC0gKG1hbmRhdG9yeSkKLSMgIERyaXZlciBjbGFzcyBuYW1lIC0gb3JnLmFwYWNoZS5kZXJieS5qZGJjLkVtYmVkZGVkRHJpdmVyCi0jIAotcHJvZmlsZU5hbWUgPSBkZXJieTEwMQotcHJvZmlsZURlc2NyaXB0aW9uID0gRGVyYnkgRW1iZWRkZWQgSkRCQyBQcm9maWxlIGZvciBUZXN0aW5nCi0jIHNldCB1c2VyIG5hbWUKLXVzZXJOYW1lID0gCi11c2VyUGFzc3dvcmQgPQotIyBzZXQgcGF0aCB0byBEZXJieSBkcml2ZXIgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2Vkcml2ZXJKYXJMaXN0ID0gYzovZGVyYnlkYi9saWIvZGVyYnkuamFyICkKLWRhdGFiYXNlZHJpdmVySmFyTGlzdCA9IAotZGF0YWJhc2VOYW1lID0gdGVzdGRiCi0jIHNldCBkYXRhYmFzZSBVUkwgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2VVcmwgPSBqZGJjOmRlcmJ5OmM6L2RlcmJ5ZGIvdGVzdGRiO2NyZWF0ZT10cnVlICkgIAotZGF0YWJhc2VVcmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL215c3FsNDEucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL215c3FsNDEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjOTQ3OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9teXNxbDQxLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jICBQbGF0Zm9ybSBQcm9wZXJ0eSBuYW1lcyAmIERlZmF1bHQKLSMKLSMgIHByb2ZpbGVOYW1lICAtIGpwYXRlc3QKLSMgIHByb2ZpbGVEZXNjcmlwdGlvbiAgLSBKREJDIFByb2ZpbGUgZm9yIEpQQSBUZXN0aW5nCi0jICB1c2VyTmFtZSAgLSBqcGF0ZXN0Ci0jICB1c2VyUGFzc3dvcmQgIC0gKGVtcHR5KQotIyAgZGF0YWJhc2Vkcml2ZXJKYXJMaXN0ICAtIChtYW5kYXRvcnkpCi0jICBkYXRhYmFzZU5hbWUgIC0gdGVzdGRiCi0jICBkYXRhYmFzZVVybCAgLSAobWFuZGF0b3J5KQotIwotIyAgRHJpdmVyIGNsYXNzIChqY29ubjMuamFyKSAtIGNvbS5teXNxbC5qZGJjLkRyaXZlcgotIyAKLXByb2ZpbGVOYW1lID0gbXlzcTQxCi1wcm9maWxlRGVzY3JpcHRpb24gPSBNeVNxbCA0LjEuMTYgSkRCQyBQcm9maWxlIGZvciBUZXN0aW5nCi0jIHNldCB1c2VyIG5hbWUKLXVzZXJOYW1lID0gCi11c2VyUGFzc3dvcmQgPSAKLSMgc2V0IHBhdGggdG8gRGVyYnkgZHJpdmVyIGhlcmUgKGV4YW1wbGU6IGRhdGFiYXNlZHJpdmVySmFyTGlzdCA9IEM6L2psaWIvbXlzcWwtY29ubmVjdG9yLWphdmEtMy4xLjctYmluLmphciApCi1kYXRhYmFzZWRyaXZlckphckxpc3QgPSAKLWRhdGFiYXNlTmFtZSA9IHRlc3RkYgotIyBzZXQgZGF0YWJhc2UgVVJMIGhlcmUgKGV4YW1wbGU6IGRhdGFiYXNlVXJsID0gamRiYzpzeWJhc2U6VGRzOmxvY2FsaG9zdDo1MDAwL3Rlc3RkYiApICAKLWRhdGFiYXNlVXJsID0gCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGcucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDNlNTZkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyAgUGxhdGZvcm0gUHJvcGVydHkgbmFtZXMgJiBEZWZhdWx0Ci0jCi0jICBwcm9maWxlTmFtZSAgLSBqcGF0ZXN0Ci0jICBwcm9maWxlRGVzY3JpcHRpb24gIC0gSkRCQyBQcm9maWxlIGZvciBKUEEgVGVzdGluZwotIyAgdXNlck5hbWUgIC0ganBhdGVzdAotIyAgdXNlclBhc3N3b3JkICAtIChlbXB0eSkKLSMgIGRhdGFiYXNlZHJpdmVySmFyTGlzdCAgLSBqYXIgbGlzdCBzZXBhcmF0ZSBieSBjb21tYSAobWFuZGF0b3J5KSAKLSMgIGRhdGFiYXNlTmFtZSAgLSB0ZXN0ZGIKLSMgIGRhdGFiYXNlVXJsICAtIChtYW5kYXRvcnkpCi0jICBEcml2ZXI6IG9yYWNsZS5qZGJjLk9yYWNsZURyaXZlcgotIwotcHJvZmlsZU5hbWUgPSBPcmFjbGUxMGdfMTBfMV8wXzQKLXByb2ZpbGVEZXNjcmlwdGlvbiA9IE9yYWNsZTEwZyAoMTAuMS4wLjQpIFRoaW4gSkRCQyBQcm9maWxlIGZvciBUZXN0aW5nCi11c2VyTmFtZSA9IAotdXNlclBhc3N3b3JkID0gCi0jIHNldCBwYXRoIHRvIE9yYWNsZSBkcml2ZXIgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2Vkcml2ZXJKYXJMaXN0ID0gYzovb3JhY2xlL2pkYmMvbGliL29qZGJjMTQuamFyICkKLWRhdGFiYXNlZHJpdmVySmFyTGlzdCA9IAotZGF0YWJhc2VOYW1lID0gCi0jIHNldCBkYXRhYmFzZSBVUkwgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2VVcmwgPSBqZGJjOm9yYWNsZTp0aGluOkBsb2NhbGhvc3Q6MTUyMTp0ZXN0ZGIgKSAgCi1kYXRhYmFzZVVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnWEUucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZ1hFLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNzI5NDYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnWEUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgIFBsYXRmb3JtIFByb3BlcnR5IG5hbWVzICYgRGVmYXVsdAotIwotIyAgcHJvZmlsZU5hbWUgIC0ganBhdGVzdAotIyAgcHJvZmlsZURlc2NyaXB0aW9uICAtIEpEQkMgUHJvZmlsZSBmb3IgSlBBIFRlc3RpbmcKLSMgIHVzZXJOYW1lICAtIGpwYXRlc3QKLSMgIHVzZXJQYXNzd29yZCAgLSAoZW1wdHkpCi0jICBkYXRhYmFzZWRyaXZlckphckxpc3QgIC0gamFyIGxpc3Qgc2VwYXJhdGUgYnkgY29tbWEgKG1hbmRhdG9yeSkgCi0jICBkYXRhYmFzZU5hbWUgIC0gdGVzdGRiCi0jICBkYXRhYmFzZVVybCAgLSAobWFuZGF0b3J5KQotIyAgRHJpdmVyOiBvcmFjbGUuamRiYy5PcmFjbGVEcml2ZXIKLSMKLXByb2ZpbGVOYW1lID0gb3JhY2xlWEUxMGcKLXByb2ZpbGVEZXNjcmlwdGlvbiA9IE9yYWNsZTEwZyBYRSBSZWxlYXNlIDIgKDEwLjIpIFRoaW4gSkRCQyBQcm9maWxlIGZvciBUZXN0aW5nCi11c2VyTmFtZSA9IHNjb3R0Ci11c2VyUGFzc3dvcmQgPSB0aWdlcgotIyBzZXQgcGF0aCB0byBPcmFjbGUgZHJpdmVyIGhlcmUgKGV4YW1wbGU6IGRhdGFiYXNlZHJpdmVySmFyTGlzdCA9IGM6L29yYWNsZS9qZGJjL2xpYi9vamRiYzE0LmphciApCi1kYXRhYmFzZWRyaXZlckphckxpc3QgPSAKLWRhdGFiYXNlTmFtZSA9IFhFCi0jIHNldCBkYXRhYmFzZSBVUkwgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2VVcmwgPSBqZGJjOm9yYWNsZTp0aGluOkBsb2NhbGhvc3Q6MTUyMTpYRSApICAKLWRhdGFiYXNlVXJsID0gCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGU5aS5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlOWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1N2UxNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGU5aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyAgUGxhdGZvcm0gUHJvcGVydHkgbmFtZXMgJiBEZWZhdWx0Ci0jCi0jICBwcm9maWxlTmFtZSAgLSBqcGF0ZXN0Ci0jICBwcm9maWxlRGVzY3JpcHRpb24gIC0gSkRCQyBQcm9maWxlIGZvciBKUEEgVGVzdGluZwotIyAgdXNlck5hbWUgIC0ganBhdGVzdAotIyAgdXNlclBhc3N3b3JkICAtIChlbXB0eSkKLSMgIGRhdGFiYXNlZHJpdmVySmFyTGlzdCAgLSBqYXIgbGlzdCBzZXBhcmF0ZSBieSBjb21tYSAobWFuZGF0b3J5KSAKLSMgIGRhdGFiYXNlTmFtZSAgLSB0ZXN0ZGIKLSMgIGRhdGFiYXNlVXJsICAtIChtYW5kYXRvcnkpCi0jICBEcml2ZXI6IG9yYWNsZS5qZGJjLk9yYWNsZURyaXZlcgotIwotcHJvZmlsZU5hbWUgPSBvcmFjbGU5aQotcHJvZmlsZURlc2NyaXB0aW9uID0gT3JhY2xlIFRoaW4gSkRCQyBQcm9maWxlIGZvciBUZXN0aW5nCi11c2VyTmFtZSA9IAotdXNlclBhc3N3b3JkID0gCi0jIHNldCBwYXRoIHRvIE9yYWNsZSBkcml2ZXIgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2Vkcml2ZXJKYXJMaXN0ID0gYzovb3JhY2xlL2pkYmMvbGliL29qZGJjMTQuamFyICkKLWRhdGFiYXNlZHJpdmVySmFyTGlzdCA9IAotZGF0YWJhc2VOYW1lID0gdGVzdGRiCi0jIHNldCBkYXRhYmFzZSBVUkwgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2VVcmwgPSBqZGJjOm9yYWNsZTp0aGluOkBzZXJ2ZXI6MTUyMTp0ZXN0ZGIgKSAgCi1kYXRhYmFzZVVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvcG9zdGdyZXNxbDgyNC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvcG9zdGdyZXNxbDgyNC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTI5MzU5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3Bvc3RncmVzcWw4MjQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgIFBsYXRmb3JtIFByb3BlcnR5IG5hbWVzICYgRGVmYXVsdAotIwotIyAgcHJvZmlsZU5hbWUgIC0ganBhdGVzdAotIyAgcHJvZmlsZURlc2NyaXB0aW9uICAtIEpEQkMgUHJvZmlsZSBmb3IgSlBBIFRlc3RpbmcKLSMgIHVzZXJOYW1lICAtIGpwYXRlc3QKLSMgIHVzZXJQYXNzd29yZCAgLSAoZW1wdHkpCi0jICBkYXRhYmFzZWRyaXZlckphckxpc3QgIC0gKG1hbmRhdG9yeSkKLSMgIGRhdGFiYXNlTmFtZSAgLSB0ZXN0ZGIKLSMgIGRhdGFiYXNlVXJsICAtIChtYW5kYXRvcnkpCi0jICBEcml2ZXIgY2xhc3MgKHBvc3RncmVzcWwtOC4yLTUwNS5qZGJjMi5qYXIpIC0gb3JnLnBvc3RncmVzcWwuRHJpdmVyCi0jIAotcHJvZmlsZU5hbWUgPSBwb3N0Z3Jlc3FsCi1wcm9maWxlRGVzY3JpcHRpb24gPSBQb3N0Z3JlU1FMIDguMi40IEpEQkMgUHJvZmlsZSBmb3IgVGVzdGluZwotIyBzZXQgdXNlciBuYW1lCi11c2VyTmFtZSA9IAotdXNlclBhc3N3b3JkID0gCi0jIHNldCBwYXRoIHRvIERlcmJ5IGRyaXZlciBoZXJlIChleGFtcGxlOiBkYXRhYmFzZWRyaXZlckphckxpc3QgPSBjOi9qbGliL3Bvc3RncmVzcWwtOC4yLTUwNS5qZGJjMi5qYXIpCi1kYXRhYmFzZWRyaXZlckphckxpc3QgPSAKLWRhdGFiYXNlTmFtZSA9IHBvc3RncmVzCi0jIHNldCBkYXRhYmFzZSBVUkwgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2VVcmwgPSBqZGJjOnBvc3RncmVzcWw6cG9zdGdyZXMgKSAgCi1kYXRhYmFzZVVybCA9IGpkYmM6cG9zdGdyZXNxbDpwb3N0Z3JlcwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvc3Fsc2VydmVyMjAwNS5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvc3Fsc2VydmVyMjAwNS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDUxMzUxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3NxbHNlcnZlcjIwMDUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotIyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0jICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAKLSMgIENvbnRyaWJ1dG9yczogCi0jICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBQbGF0Zm9ybSBQcm9wZXJ0eSBuYW1lcyAmIERlZmF1bHQKLSMKLSMgIHByb2ZpbGVOYW1lICAtIGpwYXRlc3QKLSMgIHByb2ZpbGVEZXNjcmlwdGlvbiAgLSBKREJDIFByb2ZpbGUgZm9yIEpQQSBUZXN0aW5nCi0jICB1c2VyTmFtZSAgLSBqcGF0ZXN0Ci0jICB1c2VyUGFzc3dvcmQgIC0gKGVtcHR5KQotIyAgZGF0YWJhc2Vkcml2ZXJKYXJMaXN0ICAtIChtYW5kYXRvcnkpCi0jICBkYXRhYmFzZU5hbWUgIC0gdGVzdGRiCi0jICBkYXRhYmFzZVVybCAgLSAobWFuZGF0b3J5KQotIyAKLXByb2ZpbGVOYW1lID0gc3Fsc2VydmVyMjAwNQotcHJvZmlsZURlc2NyaXB0aW9uID0gTVMgU1FMIFNlcnZlciAyMDA1IEpEQkMgUHJvZmlsZSBmb3IgVGVzdGluZwotIyBzZXQgdXNlciBuYW1lCi11c2VyTmFtZSA9IAotdXNlclBhc3N3b3JkID0gCi0jIHNldCBwYXRoIHRvIERlcmJ5IGRyaXZlciBoZXJlIChleGFtcGxlOiBkYXRhYmFzZWRyaXZlckphckxpc3QgPSBjOi9zcWxzZXJ2ZXIvbGliL3NxbGpkYmMuamFyICkKLWRhdGFiYXNlZHJpdmVySmFyTGlzdCA9IAotZGF0YWJhc2VOYW1lID0gdGVzdGRiCi0jIHNldCBkYXRhYmFzZSBVUkwgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2VVcmwgPSBqZGJjOnNxbHNlcnZlcjovL2xvY2FsaG9zdDoxNDMzO2RhdGFiYXNlTmFtZT10ZXN0ZGIgKSAgCi1kYXRhYmFzZVVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvc3liYXNlMTIucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3N5YmFzZTEyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YWFiMjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvc3liYXNlMTIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgIFBsYXRmb3JtIFByb3BlcnR5IG5hbWVzICYgRGVmYXVsdAotIwotIyAgcHJvZmlsZU5hbWUgIC0ganBhdGVzdAotIyAgcHJvZmlsZURlc2NyaXB0aW9uICAtIEpEQkMgUHJvZmlsZSBmb3IgSlBBIFRlc3RpbmcKLSMgIHVzZXJOYW1lICAtIGpwYXRlc3QKLSMgIHVzZXJQYXNzd29yZCAgLSAoZW1wdHkpCi0jICBkYXRhYmFzZWRyaXZlckphckxpc3QgIC0gKG1hbmRhdG9yeSkKLSMgIGRhdGFiYXNlTmFtZSAgLSB0ZXN0ZGIKLSMgIGRhdGFiYXNlVXJsICAtIChtYW5kYXRvcnkpCi0jICBEcml2ZXIgY2xhc3MgKGpjb25uMy5qYXIpIC0gY29tLnN5YmFzZS5qZGJjMy5qZGJjLlN5YkRyaXZlcgotIyAKLXByb2ZpbGVOYW1lID0gamNvbm5lY3Q2Ci1wcm9maWxlRGVzY3JpcHRpb24gPSBTeWJhc2UgMTIueCBqQ29ubmVjdCBKREJDIFByb2ZpbGUgZm9yIFRlc3RpbmcKLSMgc2V0IHVzZXIgbmFtZQotdXNlck5hbWUgPSAKLXVzZXJQYXNzd29yZCA9IAotIyBzZXQgcGF0aCB0byBEZXJieSBkcml2ZXIgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2Vkcml2ZXJKYXJMaXN0ID0gYzovc3liYXNlL2xpYi9qY29ubjMuamFyICkKLWRhdGFiYXNlZHJpdmVySmFyTGlzdCA9IAotZGF0YWJhc2VOYW1lID0gdGVzdGRiCi0jIHNldCBkYXRhYmFzZSBVUkwgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2VVcmwgPSBqZGJjOnN5YmFzZTpUZHM6bG9jYWxob3N0OjUwMDAvdGVzdGRiICkgIAotZGF0YWJhc2VVcmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRmZTI3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotIyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgCi0jICBDb250cmlidXRvcnM6IAotIyAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSlBBIERCIFRlc3RzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSnB0RGJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiMmI4NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSnB0RGJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zLkFsbFBsYXRmb3JtVGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotLyoqCi0gKiAgSnB0RGJUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgSnB0RGJUZXN0cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0UnVubmVyLm1haW4oIG5ldyBTdHJpbmdbXSB7ICItYyIsIEpwdERiVGVzdHMuY2xhc3MuZ2V0TmFtZSgpfSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHREYlRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgIAotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBBbGxQbGF0Zm9ybVRlc3RzLnN1aXRlKCkpOwotICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSnB0RGJUZXN0cygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHNQbHVnaW4uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KcHREYlRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZmUzODIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqICBKcHREYlRlc3RzUGx1Z2luCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHREYlRlc3RzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKcHREYlRlc3RzUGx1Z2luIHBsdWdpbjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdERiVGVzdHNQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEpwdERiVGVzdHNQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0FsbFBsYXRmb3JtVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvQWxsUGxhdGZvcm1UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTFiMjk2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvQWxsUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiAgQWxsUGxhdGZvcm1UZXN0cwotICovCi1wdWJsaWMgY2xhc3MgQWxsUGxhdGZvcm1UZXN0cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsUGxhdGZvcm1UZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotLy8gVE9ETyAtIFVuY29tbWVudCB0aGUgcGxhdGZvcm0gdG8gdGVzdC4KLS8vCQkJc3VpdGUuYWRkVGVzdFN1aXRlKERlcmJ5MTAxVGVzdHMuY2xhc3MpOwotLy8JCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JhY2xlOWlUZXN0cy5jbGFzcyk7Ci0vLwkJCXN1aXRlLmFkZFRlc3RTdWl0ZShPcmFjbGUxMGdUZXN0cy5jbGFzcyk7Ci0vLwkJCXN1aXRlLmFkZFRlc3RTdWl0ZShPcmFjbGUxMGdYRVRlc3RzLmNsYXNzKTsKLS8vCQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNRTFNlcnZlcjIwMDVUZXN0cy5jbGFzcyk7Ci0vLwkJCXN1aXRlLmFkZFRlc3RTdWl0ZShNeVNRTDQxVGVzdHMuY2xhc3MpOwotLy8JCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUG9zdGdyZVNRTDgyNFRlc3RzLmNsYXNzKTsKLS8vCQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5YmFzZTEyVGVzdHMuY2xhc3MpOwotCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFsbFBsYXRmb3JtVGVzdHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EVFBQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RUUFBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwNDI0ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RUUFBsYXRmb3JtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5Db25uZWN0aW9uUHJvZmlsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklDb25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LlByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5JRHJpdmVyTWdtdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuSVByb3BlcnR5U2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5Qcm9wZXJ0eVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLlhNTEZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5qZGJjLklKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmludGVybmFsLkNvbm5lY3Rpdml0eVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkpwdERiUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5KcHREYlRlc3RzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqICBCYXNlIGNsYXNzIGZvciBhbGwgc3VwcG9ydGVkIERUUCBwbGF0Zm9ybS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERUUFBsYXRmb3JtVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5IGNvbm5lY3Rpb25SZXBvc2l0b3J5OwotICAgIAotICAgIHByaXZhdGUgUHJvcGVydGllcyBwbGF0Zm9ybVByb3BlcnRpZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudERiVmVuZG9yOwotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnREYlZlcnNpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fQ09ORklHX0RJUkVDVE9SWSA9ICJjb25maWciOwkvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfTkFNRV9QUk9QRVJUWSA9ICJwcm9maWxlTmFtZSI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRV9ERVNDUklQVElPTl9QUk9QRVJUWSA9ICJwcm9maWxlRGVzY3JpcHRpb24iOwkvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfTkFNRV9QUk9QRVJUWSA9ICJ1c2VyTmFtZSI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9QQVNTV09SRF9QUk9QRVJUWSA9ICJ1c2VyUGFzc3dvcmQiOwkvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX0RSSVZFUl9KQVJfUFJPUEVSVFkgPSAiZGF0YWJhc2Vkcml2ZXJKYXJMaXN0IjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9OQU1FX1BST1BFUlRZID0gImRhdGFiYXNlTmFtZSI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfVVJMX1BST1BFUlRZID0gImRhdGFiYXNlVXJsIjsJLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX05BTUVfREVGQVVMVCA9ICJqcGF0ZXN0IjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX0RFU0NSSVBUSU9OX0RFRkFVTFQgPSAiSkRCQyBQcm9maWxlIGZvciBKUEEgVGVzdGluZyI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9OQU1FX0RFRkFVTFQgPSAidXNlck5hbWUiOwkvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfUEFTU1dPUkRfREVGQVVMVCA9ICIiOwkvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX05BTUVfREVGQVVMVCA9ICJ0ZXN0ZGIiOwkvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfUFJPUEVSVFlfTUVTU0FHRSA9ICJFbnRlciBtaXNzaW5nIHByb3BlcnR5IGluIHBsYXRmb3JtIGNvbmZpZyBmaWxlIChjb25maWcvZGF0YWJhc2UucHJvcGVydGllcykiOwkKLQotICAgIHB1YmxpYyBEVFBQbGF0Zm9ybVRlc3RzKCBTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlciggbmFtZSk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXBvc2l0b3J5ID0gSnB0RGJQbHVnaW4uaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMucGxhdGZvcm1Jc05ldygpKSB7Ci0gICAgICAgIAl0aGlzLmxvYWRQbGF0Zm9ybVByb3BlcnRpZXMoKTsKLSAgICAgICAgCQotICAgICAgICAJdGhpcy5idWlsZERyaXZlckRlZmluaXRpb25GaWxlKCBJRHJpdmVyTWdtdENvbnN0YW50cy5EUklWRVJfRklMRSk7Ci0gICAgICAgIAl0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoIHRoaXMucHJvZmlsZU5hbWUoKSk7Ci0gICAgICAgIAl0aGlzLmN1cnJlbnREYlZlbmRvciA9IHRoaXMuZGF0YWJhc2VWZW5kb3IoKTsKLSAgICAgICAgCXRoaXMuY3VycmVudERiVmVyc2lvbiA9IHRoaXMuZGF0YWJhc2VWZXJzaW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy52ZXJpZnlQcm9maWxlTmFtZWQoIHRoaXMucHJvZmlsZU5hbWUoKSk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQl0aGlzLmNvbm5lY3QoKTsKLQkJCi0gICAgICAgIHRoaXMudmVyaWZ5RGF0YWJhc2VWZXJzaW9uTnVtYmVyKCk7Ci0gICAgICAgIHRoaXMudmVyaWZ5RGF0YWJhc2VDb250ZW50KCk7Ci0KLSAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9maWxlcygpIHsKLQkJLy8gR2V0dGluZyB0aGUgcHJvZmlsZSBkaXJlY3RseSBmcm9tIERUUCBQcm9maWxlTWFuYWdlcgotCQlJQ29ubmVjdGlvblByb2ZpbGVbXSBwcm9maWxlcyA9IFByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UHJvZmlsZXMoKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHByb2ZpbGVzKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoIHByb2ZpbGVzLmxlbmd0aCA+IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9maWxlc0J5UHJvdmlkZXIoKSB7Ci0JCS8vIEdldCBQcm9maWxlcyBCeSBQcm92aWRlcklECi0JCUlDb25uZWN0aW9uUHJvZmlsZVtdIHByb2ZpbGVzID0gUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9maWxlQnlQcm92aWRlcklEKCB0aGlzLmdldFByb2ZpbGUoKS5nZXRQcm92aWRlcklEKCkpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggcHJvZmlsZXMpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggcHJvZmlsZXMubGVuZ3RoID4gMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9maWxlQnlOYW1lKCkgewotCQkvLyBHZXQgUHJvZmlsZSBCeSBOYW1lCi0JCUlDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlID0gdGhpcy5nZXREVFBQcm9maWxlKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCBkdHBQcm9maWxlKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoIGR0cFByb2ZpbGUuZ2V0TmFtZSgpLmVxdWFscyggdGhpcy5wcm9maWxlTmFtZSgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9maWxlQnlJbnN0YW5jZUlkKCkgewotCQkvLyBHZXQgUHJvZmlsZSBCeSBJbnN0YW5jZUlECi0JCUlDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlID0gUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9maWxlQnlJbnN0YW5jZUlEKCB0aGlzLmdldFByb2ZpbGUoKS5nZXRJbnN0YW5jZUlEKCkpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggZHRwUHJvZmlsZSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKCBkdHBQcm9maWxlLmdldE5hbWUoKS5lcXVhbHMoIHRoaXMucHJvZmlsZU5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXb3JraW5nT2ZmbGluZSgpIHsKLQkJCi0JCWlmKCB0aGlzLmdldFByb2ZpbGUoKS5zdXBwb3J0c1dvcmtPZmZsaW5lTW9kZSgpKSB7Ci0KLQkJCWlmKCAhIHRoaXMuZ2V0UHJvZmlsZSgpLmNhbldvcmtPZmZsaW5lKCkpIHsKLQkJCQl0aGlzLmNvbm5lY3QoKTsKLQkJCQl0aGlzLnNhdmVXb3JrT2ZmbGluZURhdGEoKTsKLQkJCQl0aGlzLmRpc2Nvbm5lY3QoKTsKLQkJCQkKLQkJCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggdGhpcy5nZXRQcm9maWxlKCkuY2FuV29ya09mZmxpbmUoKSk7Ci0JCQl9Ci0JCQl0aGlzLndvcmtPZmZsaW5lKCk7Ci0JCQkKLQkJCUFzc2VydC5hc3NlcnRUcnVlKCB0aGlzLmdldFByb2ZpbGUoKS5pc0FjdGl2ZSgpKTsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKCB0aGlzLmdldFByb2ZpbGUoKS5pc1dvcmtpbmdPZmZsaW5lKCkpOwotCi0JCQl0aGlzLmRpc2Nvbm5lY3QoKTsKLQkJfQotCX0KLQkJCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCB0ZXN0cyAqKioqKioqKioqCi0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RGF0YWJhc2VWZXJzaW9uTnVtYmVyKCkgewotICAgIAlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuZ2V0UHJvZmlsZSgpLmdldERhdGFiYXNlKCk7Ci0gICAgCUFzc2VydC5hc3NlcnROb3ROdWxsKCBkYXRhYmFzZSk7Ci0gICAgCQotICAgICAgICBTdHJpbmcgYWN0dWFsVmVyc2lvbk51bWJlciA9IGRhdGFiYXNlLmdldFZlcnNpb24oKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkVmVyc2lvbk51bWJlciA9IHRoaXMuZGF0YWJhc2VWZXJzaW9uKCk7Ci0gICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSAiRXhwZWN0ZWQgdmVyc2lvbiBudW1iZXI6ICIgKyBleHBlY3RlZFZlcnNpb25OdW1iZXIgKyAiIGJ1dCB0aGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIHdhczogIiArIGFjdHVhbFZlcnNpb25OdW1iZXI7Ci0gICAgICAgIGFzc2VydFRydWUoIGVycm9yTWVzc2FnZSwgYWN0dWFsVmVyc2lvbk51bWJlci5pbmRleE9mKCBleHBlY3RlZFZlcnNpb25OdW1iZXIpICE9IC0xKTsKLQotICAgICAgICBTdHJpbmcgYWN0dWFsVmVuZG9yID0gZGF0YWJhc2UuZ2V0VmVuZG9yKCk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFZlbmRvciA9IHRoaXMuZGF0YWJhc2VWZW5kb3IoKTsKLSAgICAgICAgZXJyb3JNZXNzYWdlID0gIkV4cGVjdGVkIHZlbmRvcjogIiArIGV4cGVjdGVkVmVuZG9yICsgIiBidXQgdGhlIGFjdHVhbCB2ZW5kb3Igd2FzOiAiICsgYWN0dWFsVmVuZG9yOwotICAgICAgICBhc3NlcnRFcXVhbHMoIGVycm9yTWVzc2FnZSwgYWN0dWFsVmVuZG9yLCBleHBlY3RlZFZlbmRvcik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlEYXRhYmFzZUNvbnRlbnQoKSB7Ci0gICAgCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5nZXRQcm9maWxlKCkuZ2V0RGF0YWJhc2UoKTsKLSAgICAJQXNzZXJ0LmFzc2VydFRydWUoIGRhdGFiYXNlLnNjaGVtYXRhU2l6ZSgpID4gMCk7Ci0JCQotICAgICAgICBTY2hlbWEgc2NoZW1hID0gZGF0YWJhc2Uuc2NoZW1hTmFtZWQoIHRoaXMuZ2V0UHJvZmlsZSgpLmdldFVzZXJOYW1lKCkpOwotCQlpZiggc2NoZW1hICE9IG51bGwpIHsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKCBzY2hlbWEuc2VxdWVuY2VzU2l6ZSgpID49IDApOwotCQkJCi0JCQlPYmplY3RbXSB0YWJsZU5hbWVzID0gQ29sbGVjdGlvblRvb2xzLmFycmF5KCBzY2hlbWEudGFibGVOYW1lcygpKTsKLQkJCWlmKCB0YWJsZU5hbWVzLmxlbmd0aCA+PSAxKSB7Ci0JCQkJVGFibGUgdGFibGUgPSBzY2hlbWEudGFibGVOYW1lZCgoIFN0cmluZyl0YWJsZU5hbWVzWyAwXSk7Ci0JCQkJQXNzZXJ0LmFzc2VydFRydWUoIHRhYmxlLmNvbHVtbnNTaXplKCkgPj0gMCk7Ci0JCQkJQXNzZXJ0LmFzc2VydFRydWUoIHRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpID49IDApOwotCQkJCUFzc2VydC5hc3NlcnRUcnVlKCB0YWJsZS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA+PSAwKTsKLQkJCX0KLQkJfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlQcm9maWxlTmFtZWQoIFN0cmluZyBwcm9maWxlTmFtZSkgewotICAgIAkKLSAgICAJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSA9IHRoaXMuZ2V0UHJvZmlsZU5hbWVkKCBwcm9maWxlTmFtZSk7Ci0gICAgCUFzc2VydC5hc3NlcnRUcnVlKCAiQ29ubmVjdGlvblByb2ZpbGUgbm90IGZvdW5kIiwgcHJvZmlsZU5hbWUuZXF1YWxzKCBwcm9maWxlLmdldE5hbWUoKSkpOwotICAgIH0KLQotCS8vICoqKioqIFBsYXRmb3JtIHNwZWNpZmljIGJlaGF2aW9yICoqKioqCi0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRhdGFiYXNlVmVuZG9yKCk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkYXRhYmFzZVZlcnNpb24oKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZHJpdmVyTmFtZSgpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZHJpdmVyRGVmaW5pdGlvblR5cGUoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRyaXZlckRlZmluaXRpb25JZCgpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZHJpdmVyQ2xhc3MoKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29uZmlnTmFtZSgpOwotCi0JLy8gKioqKiogQmVoYXZpb3IgKioqKioKLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbm5lY3QoKSB7Ci0KLSAgICAgICAgdGhpcy5nZXRQcm9maWxlKCkuY29ubmVjdCgpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggIkNvdWxkIG5vdCBjb25uZWN0LiIsIHRoaXMuZ2V0UHJvZmlsZSgpLmlzQWN0aXZlKCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoICJDb25uZWN0aW9uIGNvcnJ1cHRlZC4iLCB0aGlzLmdldFByb2ZpbGUoKS5pc1dvcmtpbmdPZmZsaW5lKCkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBkaXNjb25uZWN0KCkgewotICAgIAkKLSAgICAJdGhpcy5nZXRQcm9maWxlKCkuZGlzY29ubmVjdCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoICJEaXNjb25uZWN0IGZhaWxlZC4iLCB0aGlzLmdldFByb2ZpbGUoKS5pc0FjdGl2ZSgpKTsKLSAgICB9Ci0KLQlwcml2YXRlIHZvaWQgd29ya09mZmxpbmUoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gdGhpcy5nZXRQcm9maWxlKCkud29ya09mZmxpbmUoKTsKLQotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggIkNvdWxkIG5vdCB3b3JrIG9mZmxpbmUuIiwgc3RhdHVzLmlzT0soKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVXb3JrT2ZmbGluZURhdGEoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gdGhpcy5nZXRQcm9maWxlKCkuc2F2ZVdvcmtPZmZsaW5lRGF0YSgpOwotCi0JCUFzc2VydC5hc3NlcnRUcnVlKCAiQ291bGQgbm90IHNhdmUgb2ZmbGluZSBkYXRhLiIsIHN0YXR1cy5pc09LKCkpOwotCX0KLSAgICAKLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0gICAgcHJvdGVjdGVkIFNjaGVtYSBnZXRTY2hlbWFOYW1lZCggU3RyaW5nIHNjaGVtYU5hbWUpIHsgCi0KLQkgICAgcmV0dXJuIHRoaXMuZ2V0UHJvZmlsZSgpLmdldERhdGFiYXNlKCkuc2NoZW1hTmFtZWQoIHNjaGVtYU5hbWUpOwotICAgIH0KLQkKLSAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbjxUYWJsZT4gZ2V0VGFibGVzKCkgewotCQkKLSAgICAgICAgU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hTmFtZWQoIHRoaXMuZ2V0UHJvZmlsZSgpLmdldFVzZXJOYW1lKCkpOwotCQlpZiggc2NoZW1hID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0PFRhYmxlPigpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbiggc2NoZW1hLnRhYmxlcygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgVGFibGUgZ2V0VGFibGVOYW1lZCggU3RyaW5nIHRhYmxlTmFtZSkgeyAKLQotCSAgICBTY2hlbWEgc2NoZW1hID0gIHRoaXMuZ2V0U2NoZW1hTmFtZWQoIHRoaXMuZ2V0UHJvZmlsZSgpLmdldFVzZXJOYW1lKCkpOwotCSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCggc2NoZW1hKTsKLQkKLQkJcmV0dXJuIHNjaGVtYS50YWJsZU5hbWVkKCB0YWJsZU5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvdmlkZXJJZCgpIHsKLSAgICAgICAgcmV0dXJuIENvbm5lY3Rpb25Qcm9maWxlLkNPTk5FQ1RJT05fUFJPRklMRV9UWVBFOwotICAgIH0KLSAgICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZElzU2F2ZWQoKSB7Ci0gICAgICAgIHJldHVybiAidHJ1ZSI7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgSUNvbm5lY3Rpb25Qcm9maWxlIGdldERUUFByb2ZpbGUoKSB7Ci0JCXJldHVybiBQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb2ZpbGVCeU5hbWUoIHRoaXMucHJvZmlsZU5hbWUoKSk7Ci0gICAgfQotCQotICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvZmlsZU5hbWUoKSB7Ci0gICAgCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eSggUFJPRklMRV9OQU1FX1BST1BFUlRZLCBQUk9GSUxFX05BTUVfREVGQVVMVCk7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLSAgICAJcmV0dXJuIHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KCBQUk9GSUxFX0RFU0NSSVBUSU9OX1BST1BFUlRZLCBQUk9GSUxFX0RFU0NSSVBUSU9OX0RFRkFVTFQpOwotICAgIH0gICAgCi0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyTmFtZSgpIHsKLSAgICAJcmV0dXJuIHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KCBVU0VSX05BTUVfUFJPUEVSVFksIFVTRVJfTkFNRV9ERUZBVUxUKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyUGFzc3dvcmQoKSB7Ci0gICAgCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eSggVVNFUl9QQVNTV09SRF9QUk9QRVJUWSwgVVNFUl9QQVNTV09SRF9ERUZBVUxUKTsKLSAgICB9ICAgIAotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VOYW1lKCkgewotICAgIAlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIERCX05BTUVfUFJPUEVSVFksIERCX05BTUVfREVGQVVMVCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2Vkcml2ZXJKYXJMaXN0KCkgewotICAgIAlTdHJpbmcgZGJEcml2ZXJKYXJMaXN0ID0gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIERCX0RSSVZFUl9KQVJfUFJPUEVSVFkpOwotICAgIAlpZiAoIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIGRiRHJpdmVySmFyTGlzdCkpIHsKLSAgICAJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCBNSVNTSU5HX1BST1BFUlRZX01FU1NBR0UpOwotICAgIAl9Ci0gICAgCXJldHVybiBkYkRyaXZlckphckxpc3Q7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VVcmwoKSB7Ci0gICAgCVN0cmluZyBkYlVybCA9IHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KCBEQl9VUkxfUFJPUEVSVFkpOwotICAgIAlpZiAoIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIGRiVXJsKSkgewotICAgIAkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIE1JU1NJTkdfUFJPUEVSVFlfTUVTU0FHRSk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIGRiVXJsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZSBnZXRQcm9maWxlKCkgewotCi0gICAgCXJldHVybiB0aGlzLmdldFByb2ZpbGVOYW1lZCggdGhpcy5wcm9maWxlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGUgZ2V0UHJvZmlsZU5hbWVkKCBTdHJpbmcgcHJvZmlsZU5hbWUpIHsKLSAgICAJCi0gICAgCXJldHVybiB0aGlzLmNvbm5lY3Rpb25SZXBvc2l0b3J5LmNvbm5lY3Rpb25Qcm9maWxlTmFtZWQoIHByb2ZpbGVOYW1lKTsKLSAgICB9Ci0gICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRUZXN0UGx1Z2luQnVuZGxlSWQoKSB7Ci0JCXJldHVybiBKcHREYlRlc3RzUGx1Z2luLkJVTkRMRV9JRDsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGdldERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIENvbm5lY3Rpdml0eVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRDb25maWdQYXRoKCkgewotICAgIAlyZXR1cm4gdGhpcy5nZXRDb25maWdEaXIoKSArICIvIiArIHRoaXMuZ2V0Q29uZmlnTmFtZSgpOwotICAgIH0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRDb25maWdEaXIoKSB7Ci0gICAgCXJldHVybiBQTEFURk9STV9DT05GSUdfRElSRUNUT1JZOwotICAgIH0KLQotCXByaXZhdGUgYm9vbGVhbiBwbGF0Zm9ybUlzTmV3KCkgewotCQlyZXR1cm4oICF0aGlzLmRhdGFiYXNlVmVuZG9yKCkuZXF1YWxzKCB0aGlzLmN1cnJlbnREYlZlbmRvcikgfHwgdGhpcy5kYXRhYmFzZVZlcnNpb24oKS5lcXVhbHMoIHRoaXMuY3VycmVudERiVmVyc2lvbikpOwotCX0KLQkKLSAgICBwcml2YXRlIHZvaWQgbG9hZFBsYXRmb3JtUHJvcGVydGllcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQotCQlpZiggdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJVVJMIGNvbmZpZ1VybCA9IFBsYXRmb3JtLmdldEJ1bmRsZSggdGhpcy5nZXRUZXN0UGx1Z2luQnVuZGxlSWQoKSkuZ2V0RW50cnkoIHRoaXMuZ2V0Q29uZmlnUGF0aCgpKTsKLQotCQkJdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMubG9hZCggY29uZmlnVXJsLm9wZW5TdHJlYW0oKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGJ1aWxkRHJpdmVyUHJvcGVydGllcygpIHsKLQkJUHJvcGVydGllcyBkcml2ZXJQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJZHJpdmVyUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggQ29ubmVjdGlvblByb2ZpbGUuRFJJVkVSX0RFRklOSVRJT05fVFlQRV9QUk9QX0lELCB0aGlzLmRyaXZlckRlZmluaXRpb25UeXBlKCkpOwotCQlkcml2ZXJQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBDb25uZWN0aW9uUHJvZmlsZS5EUklWRVJfSkFSX0xJU1RfUFJPUF9JRCwgdGhpcy5kYXRhYmFzZWRyaXZlckphckxpc3QoKSk7Ci0JCWRyaXZlclByb3BlcnRpZXMuc2V0UHJvcGVydHkoIElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VU0VSTkFNRV9QUk9QX0lELCB0aGlzLnVzZXJOYW1lKCkpOwotCQlkcml2ZXJQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuRFJJVkVSX0NMQVNTX1BST1BfSUQsIHRoaXMuZHJpdmVyQ2xhc3MoKSk7Ci0JCWRyaXZlclByb3BlcnRpZXMuc2V0UHJvcGVydHkoIElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9OQU1FX1BST1BfSUQsIHRoaXMuZGF0YWJhc2VOYW1lKCkpOwotCQlkcml2ZXJQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuUEFTU1dPUkRfUFJPUF9JRCwgdGhpcy51c2VyUGFzc3dvcmQoKSk7Ci0JCWRyaXZlclByb3BlcnRpZXMuc2V0UHJvcGVydHkoIElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VUkxfUFJPUF9JRCwgdGhpcy5kYXRhYmFzZVVybCgpKTsKLQkJZHJpdmVyUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFTkRPUl9QUk9QX0lELCB0aGlzLmRhdGFiYXNlVmVuZG9yKCkpOwotCQlkcml2ZXJQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVSU0lPTl9QUk9QX0lELCB0aGlzLmRhdGFiYXNlVmVyc2lvbigpKTsKLQkJcmV0dXJuIGRyaXZlclByb3BlcnRpZXM7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGJ1aWxkQmFzaWNQcm9wZXJ0aWVzKCkgewotCQlQcm9wZXJ0aWVzIGJhc2ljUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWJhc2ljUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX05BTUVfUFJPUF9JRCwgdGhpcy5kYXRhYmFzZU5hbWUoKSk7Ci0JCWJhc2ljUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVTRVJOQU1FX1BST1BfSUQsIHRoaXMudXNlck5hbWUoKSk7Ci0JCWJhc2ljUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlBBU1NXT1JEX1BST1BfSUQsIHRoaXMudXNlclBhc3N3b3JkKCkpOwotCQliYXNpY1Byb3BlcnRpZXMuc2V0UHJvcGVydHkoIENvbm5lY3Rpb25Qcm9maWxlLkRSSVZFUl9ERUZJTklUSU9OX1BST1BfSUQsIHRoaXMuZHJpdmVyRGVmaW5pdGlvbklkKCkpOwotCQkKLQkJYmFzaWNQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuRFJJVkVSX0NMQVNTX1BST1BfSUQsIHRoaXMuZHJpdmVyQ2xhc3MoKSk7Ci0JCWJhc2ljUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVSTF9QUk9QX0lELCB0aGlzLmRhdGFiYXNlVXJsKCkpOwotCQliYXNpY1Byb3BlcnRpZXMuc2V0UHJvcGVydHkoIElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRU5ET1JfUFJPUF9JRCwgdGhpcy5kYXRhYmFzZVZlbmRvcigpKTsKLQkJYmFzaWNQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVSU0lPTl9QUk9QX0lELCB0aGlzLmRhdGFiYXNlVmVyc2lvbigpKTsKLQkJCi0JCWJhc2ljUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggQ29ubmVjdGlvblByb2ZpbGUuREFUQUJBU0VfU0FWRV9QV0RfUFJPUF9JRCwgdGhpcy5wYXNzd29yZElzU2F2ZWQoKSk7Ci0JCXJldHVybiBiYXNpY1Byb3BlcnRpZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoIFN0cmluZyBwcm9maWxlTmFtZSkgdGhyb3dzIENvbm5lY3Rpb25Qcm9maWxlRXhjZXB0aW9uIHsKLQkJCi0JCVByb2ZpbGVNYW5hZ2VyIHByb2ZpbGVNYW5hZ2VyID0gUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHByb2ZpbGVNYW5hZ2VyKTsKLQkJCi0JCUlDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlID0gdGhpcy5nZXREVFBQcm9maWxlKCk7Ci0JCWlmKCBkdHBQcm9maWxlID09IG51bGwpIHsKLQkJCVByb3BlcnRpZXMgYmFzaWNQcm9wZXJ0aWVzID0gYnVpbGRCYXNpY1Byb3BlcnRpZXMoKTsKLQkJCVByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlUHJvZmlsZSggcHJvZmlsZU5hbWUsIHRoaXMucHJvZmlsZURlc2NyaXB0aW9uKCksIHRoaXMucHJvdmlkZXJJZCgpLCBiYXNpY1Byb3BlcnRpZXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRHJpdmVyRGVmaW5pdGlvbkZpbGUoIFN0cmluZyBkcml2ZXJGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJWE1MRmlsZU1hbmFnZXIuc2V0U3RvcmFnZUxvY2F0aW9uKCB0aGlzLmdldERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpKTsKLQkJWE1MRmlsZU1hbmFnZXIuc2V0RmlsZU5hbWUoIGRyaXZlckZpbGVOYW1lKTsKLQkJSVByb3BlcnR5U2V0W10gcHJvcHNldHMgPSBuZXcgSVByb3BlcnR5U2V0WyAxXTsKLQkJU3RyaW5nIGRyaXZlck5hbWUgPSB0aGlzLmRyaXZlck5hbWUoKTsKLQkJU3RyaW5nIGRyaXZlcklkID0gdGhpcy5kcml2ZXJEZWZpbml0aW9uSWQoKTsKLQkJUHJvcGVydHlTZXRJbXBsIHByb3BlcnR5U2V0ID0gbmV3IFByb3BlcnR5U2V0SW1wbCggZHJpdmVyTmFtZSwgZHJpdmVySWQpOwotCQlwcm9wZXJ0eVNldC5zZXRQcm9wZXJ0aWVzKCBkcml2ZXJJZCwgdGhpcy5idWlsZERyaXZlclByb3BlcnRpZXMoKSk7Ci0JCXByb3BzZXRzWyAwXSA9IHByb3BlcnR5U2V0OwotCi0JCVhNTEZpbGVNYW5hZ2VyLnNhdmVOYW1lZFByb3BlcnR5U2V0KCBwcm9wc2V0cyk7Ci0JCQotCQlGaWxlIGRyaXZlckRlZmluaXRpb25lRmlsZSA9ICB0aGlzLmdldERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpLmFwcGVuZCggZHJpdmVyRmlsZU5hbWUpLnRvRmlsZSgpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggZHJpdmVyRGVmaW5pdGlvbmVGaWxlLmV4aXN0cygpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RlcmJ5MTAxVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRGVyYnkxMDFUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjQ0YjBlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRGVyYnkxMDFUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi0KLS8qKgotICogIERlcmJ5IDEwLjEgRW1iZWRkZWQgRHJpdmVyIFRlc3QKLSAqLwotcHVibGljIGNsYXNzIERlcmJ5MTAxVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQkKLSAgICBwdWJsaWMgRGVyYnkxMDFUZXN0cyggU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIoIG5hbWUpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFiYXNlVmVuZG9yKCkgewotICAgICAgICByZXR1cm4gIkRlcmJ5IjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRhdGFiYXNlVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuICIxMC4xIjsKLSAgICB9Ci0JCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwcm92aWRlcklkKCkgewotICAgICAgICByZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZGVyYnkuZW1iZWRkZWQuY29ubmVjdGlvblByb2ZpbGUiOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiRGVyYnkgRW1iZWRkZWQgSkRCQyBEcml2ZXIiOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckRlZmluaXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZGVyYnkxMDEuZ2VuZXJpY0RyaXZlclRlbXBsYXRlIjsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJEZWZpbml0aW9uSWQoKSB7Ci0gICAgICAgIHJldHVybiAiRHJpdmVyRGVmbi5EZXJieSBFbWJlZGRlZCBKREJDIERyaXZlciI7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZHJpdmVyQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiAib3JnLmFwYWNoZS5kZXJieS5qZGJjLkVtYmVkZGVkRHJpdmVyIjsKLSAgICB9Ci0JCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdOYW1lKCkgewotICAgIAlyZXR1cm4gImRlcmJ5MTAxLnByb3BlcnRpZXMiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9NeVNRTDQxVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvTXlTUUw0MVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YzE5MGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9NeVNRTDQxVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotCi0vKioKLSAqICBTUUwgU2VydmVyIDIwMDUgRHJpdmVyIFRlc3QKLSAqLwotcHVibGljIGNsYXNzIE15U1FMNDFUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCQotICAgIHB1YmxpYyBNeVNRTDQxVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKCBuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZVZlbmRvcigpIHsKLSAgICAgICAgcmV0dXJuICJNeVNxbCI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZVZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiAiNC4xIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gImNvbS5teXNxbC5qZGJjLkRyaXZlciI7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJEZWZpbml0aW9uSWQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5NeVNRTCBKREJDIERyaXZlciI7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5teXNxbC40XzEuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJNeVNRTCBKREJDIERyaXZlciI7Ci0JfQotCQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnTmFtZSgpIHsKLSAgICAJcmV0dXJuICJteXNxbDQxLnByb3BlcnRpZXMiOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZhODViNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLQotLyoqCi0gKiAgT3JhY2xlIDEwZyBUaGluIERyaXZlciBUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBPcmFjbGUxMGdUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0gICAgcHVibGljIE9yYWNsZTEwZ1Rlc3RzKCBTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlciggbmFtZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJPcmFjbGUiOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjEwIjsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yYWNsZS5qZGJjLk9yYWNsZURyaXZlciI7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJEZWZpbml0aW9uSWQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5PcmFjbGUgVGhpbiBEcml2ZXIiOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQub3JhY2xlLjEwLmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlIDEwZyBUaGluIERyaXZlciI7Ci0JfQotCQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnTmFtZSgpIHsKLSAgICAJcmV0dXJuICJvcmFjbGUxMGcucHJvcGVydGllcyI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1hFVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnWEVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGUwNTQ4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnWEVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi0KLS8qKgotICogIE9yYWNsZSAxMGcgVGhpbiBEcml2ZXIgVGVzdAotICovCi1wdWJsaWMgY2xhc3MgT3JhY2xlMTBnWEVUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0gICAgcHVibGljIE9yYWNsZTEwZ1hFVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKCBuYW1lKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk9yYWNsZSI7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiMTAiOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyIjsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckRlZmluaXRpb25JZCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk9yYWNsZSBUaGluIERyaXZlciI7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vcmFjbGUuMTAuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIjsKLQl9Ci0JCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdOYW1lKCkgewotICAgIAlyZXR1cm4gIm9yYWNsZTEwZ1hFLnByb3BlcnRpZXMiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGU5aVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTlpVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxNzk1ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTlpVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotCi0vKioKLSAqICBPcmFjbGUgOWkgVGhpbiBEcml2ZXIgVGVzdAotICovCi1wdWJsaWMgY2xhc3MgT3JhY2xlOWlUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0gICAgcHVibGljIE9yYWNsZTlpVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKCBuYW1lKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk9yYWNsZSI7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiOSI7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmFjbGUuamRiYy5PcmFjbGVEcml2ZXIiOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZHJpdmVyRGVmaW5pdGlvbklkKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uT3JhY2xlIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm9yYWNsZS45LmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlIDlpIFRoaW4gRHJpdmVyIjsKLQl9Ci0JCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdOYW1lKCkgewotICAgIAlyZXR1cm4gIm9yYWNsZTlpLnByb3BlcnRpZXMiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9Qb3N0Z3JlU1FMODI0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvUG9zdGdyZVNRTDgyNFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDExYWQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9Qb3N0Z3JlU1FMODI0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotCi0vKioKLSAqICBPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIFRlc3QKLSAqLwotcHVibGljIGNsYXNzIFBvc3RncmVTUUw4MjRUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0gICAgcHVibGljIFBvc3RncmVTUUw4MjRUZXN0cyggU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIoIG5hbWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAicG9zdGdyZXMiOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjgueCI7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmcucG9zdGdyZXNxbC5Ecml2ZXIiOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZHJpdmVyRGVmaW5pdGlvbklkKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uUG9zdGdyZVNRTCBKREJDIERyaXZlciI7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5wb3N0Z3Jlc3FsLnBvc3RncmVzcWxEcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIlBvc3RncmVTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQkKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ05hbWUoKSB7Ci0gICAgCXJldHVybiAicG9zdGdyZXNxbDgyNC5wcm9wZXJ0aWVzIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU1FMU2VydmVyMjAwNVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1NRTFNlcnZlcjIwMDVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTBkODQ0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU1FMU2VydmVyMjAwNVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLQotLyoqCi0gKiAgU1FMIFNlcnZlciAyMDA1IERyaXZlciBUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTUUxTZXJ2ZXIyMDA1VGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQkKLSAgICBwdWJsaWMgU1FMU2VydmVyMjAwNVRlc3RzKCBTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlciggbmFtZSk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VWZW5kb3IoKSB7Ci0gICAgICAgIHJldHVybiAiU1FMU2VydmVyIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRhdGFiYXNlVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuICIyMDA1IjsKLSAgICB9Ci0JCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwcm92aWRlcklkKCkgewotICAgICAgICByZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYy5jb25uZWN0aW9uUHJvZmlsZSI7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZHJpdmVyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNaWNyb3NvZnQgU1FMIFNlcnZlciAyMDA1IEpEQkMgRHJpdmVyIjsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5tc2Z0LnNxbHNlcnZlci4yMDA1LmRyaXZlclRlbXBsYXRlIjsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJEZWZpbml0aW9uSWQoKSB7Ci0gICAgICAgIHJldHVybiAiRHJpdmVyRGVmbi5NaWNyb3NvZnQgU1FMIFNlcnZlciAyMDA1IEpEQkMgRHJpdmVyIjsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuICJjb20ubWljcm9zb2Z0LnNxbHNlcnZlci5qZGJjLlNRTFNlcnZlckRyaXZlciI7Ci0gICAgfQotCQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnTmFtZSgpIHsKLSAgICAJcmV0dXJuICJzcWxzZXJ2ZXIyMDA1LnByb3BlcnRpZXMiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9TeWJhc2UxMlRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1N5YmFzZTEyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjN2ViMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1N5YmFzZTEyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotCi0vKioKLSAqICBPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIFRlc3QKLSAqLwotcHVibGljIGNsYXNzIFN5YmFzZTEyVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotICAgIHB1YmxpYyBTeWJhc2UxMlRlc3RzKCBTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlciggbmFtZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJTeWJhc2UiOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjEyLngiOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAiY29tLnN5YmFzZS5qZGJjMy5qZGJjLlN5YkRyaXZlciI7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJEZWZpbml0aW9uSWQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5TeWJhc2UgSkRCQyBEcml2ZXIiOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuc3liYXNlLmFzZS4xMl94LmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiU3liYXNlIEpEQkMgRHJpdmVyIjsKLQl9Ci0JCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdOYW1lKCkgewotICAgIAlyZXR1cm4gInN5YmFzZTEyLnByb3BlcnRpZXMiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDA3ODE5MDUuLmQwMWJiM2EgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMTkgKzMsMzcgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAorQnVuZGxlLVZlcnNpb246IDEuMy4wLnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IjIuNC4wIiwKICBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjIwMCwzLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKICBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAxLDIuMC4wKSIsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IjEuMS4yMDEiLAorIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4zLjApIiwKICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzMuOC4yLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiCisgb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbMy44LjIsNC4wLjApIgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmdlbmVyYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8xLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazFfMS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwppbmRleCAwNmRiZjliLi44ZmRkMWQzIDEwMDY0NAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0xOCw1ICsxOCw1IEBACiAjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1wbHVnaW5OYW1lPUVjbGlwc2VMaW5rIENvcmUgVGVzdHMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZworcGx1Z2luTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IC0gQ29yZSBUZXN0cworcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rQ29yZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rQ29yZVRlc3RzLmphdmEKaW5kZXggODRhMzIzMC4uNTZjNjk1ZCAxMDA2NDQKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9KcHRFY2xpcHNlTGlua0NvcmVUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0RWNsaXBzZUxpbmtDb3JlVGVzdHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KICAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCkBAIC05LDM0ICs5LDkzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbDsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY2FjaGluZy5KcHRFY2xpcHNlTGlua0NvcmVDYWNoaW5nVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29ubmVjdGlvbi5KcHRFY2xpcHNlTGlua0NvcmVDb25uZWN0aW9uVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY3VzdG9taXphdGlvbi5KcHRFY2xpcHNlTGlua0NvcmVDdXN0b21pemF0aW9uVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwubG9nZ2luZy5KcHRFY2xpcHNlTGlua0NvcmVMb2dnaW5nVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwub3B0aW9ucy5KcHRFY2xpcHNlTGlua0NvcmVPcHRpb25zVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuc2NoZW1hLmdlbmVyYXRpb24uSnB0RWNsaXBzZUxpbmtDb3JlU2NoZW1hR2VuZXJhdGlvblRlc3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSnB0RWNsaXBzZUxpbmtDb3JlQ29udGV4dE1vZGVsVGVzdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuSnB0RWNsaXBzZWxpbmtDb3JlUmVzb3VyY2VNb2RlbFRlc3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazFfMS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSnB0RWNsaXBzZUxpbmsxXzFDb3JlQ29udGV4dE1vZGVsVGVzdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KcHRFY2xpcHNlTGluazJfMENvcmVDb250ZXh0TW9kZWxUZXN0czsKIAogLyoqCiAgKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCisgKiAKKyAqIFJlcXVpcmVkIEphdmEgc3lzdGVtIHByb3BlcnR5OgorICogICAgLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj08anBhLmphciBwYXRoPgorICogICAgLURvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamFyPTxlY2xpcHNlbGluay5qYXIgcGF0aD4KICAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiBwdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtDb3JlVGVzdHMKIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX0pBUl9QUk9QRVJUWSA9IFRlc3RKcGFQcm9qZWN0LkpQQV9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0pBUl9QUk9QRVJUWSA9IFRlc3RKcGFQcm9qZWN0LkVDTElQU0VMSU5LX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWTsKKwogCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKIAkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGlua0NvcmVUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKIAkJCi0JCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmtDb3JlQ29ubmVjdGlvblRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rQ29yZU9wdGlvbnNUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVMb2dnaW5nVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmtDb3JlQ3VzdG9taXphdGlvblRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rQ29yZUNhY2hpbmdUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVTY2hlbWFHZW5lcmF0aW9uVGVzdHMuc3VpdGUoKSk7Ci0JCQorCQlpZihyZXF1aXJlZEphcnNFeGlzdHMoKSkgeworCQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMuc3VpdGUoKSk7CisJCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOworCQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGluazFfMUNvcmVDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKKwkJCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmsyXzBDb3JlQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7CisJCX0KKwkJZWxzZSB7CisJCQlzdWl0ZS5hZGRUZXN0KFRlc3RTdWl0ZS53YXJuaW5nKGJ1aWxkTWlzc2luZ0phckVycm9yTWVzc2FnZSgpKSk7CisJCX0KIAkJcmV0dXJuIHN1aXRlOwogCX0KIAorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXF1aXJlZEphcnNFeGlzdHMoKSB7CisJCXJldHVybiBqcGFKYXJQcm9wZXJ0eUV4aXN0cygpCisJCQkmJiBqcGFKYXJGaWxlRXhpc3RzKCkKKwkJCSYmIGVjbGlwc2VsaW5rSmFyUHJvcGVydHlFeGlzdHMoKQorCQkJJiYgZWNsaXBzZWxpbmtKYXJGaWxlRXhpc3RzKCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBqcGFKYXJQcm9wZXJ0eUV4aXN0cygpIHsKKwkJcmV0dXJuIGdldFN5c3RlbVByb3BlcnR5KEpQQV9KQVJfUFJPUEVSVFkpICE9IG51bGw7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBqcGFKYXJGaWxlRXhpc3RzKCkgeworCQlyZXR1cm4gKG5ldyBGaWxlKGdldFN5c3RlbVByb3BlcnR5KEpQQV9KQVJfUFJPUEVSVFkpKSkuZXhpc3RzKCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlY2xpcHNlbGlua0phclByb3BlcnR5RXhpc3RzKCkgeworCQlyZXR1cm4gZ2V0U3lzdGVtUHJvcGVydHkoRUNMSVBTRUxJTktfSkFSX1BST1BFUlRZKSAhPSBudWxsOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWNsaXBzZWxpbmtKYXJGaWxlRXhpc3RzKCkgeworCQlyZXR1cm4gKG5ldyBGaWxlKGdldFN5c3RlbVByb3BlcnR5KEVDTElQU0VMSU5LX0pBUl9QUk9QRVJUWSkpKS5leGlzdHMoKTsKKwl9CisKKwkvKioqKioqKioqKiogcHJpdmF0ZSAqKioqKioqKioqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBidWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSB7CisKKwkJaWYoICEganBhSmFyUHJvcGVydHlFeGlzdHMoKSkgeworCQkJcmV0dXJuIGVycm9yTWlzc2luZ1Byb3BlcnR5KEpQQV9KQVJfUFJPUEVSVFkpOworCQl9CisJCWVsc2UgaWYoICEganBhSmFyRmlsZUV4aXN0cygpKSB7CisJCQlyZXR1cm4gZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KGdldFN5c3RlbVByb3BlcnR5KEpQQV9KQVJfUFJPUEVSVFkpKTsKKwkJfQorCQllbHNlIGlmKCAhIGVjbGlwc2VsaW5rSmFyUHJvcGVydHlFeGlzdHMoKSkgeworCQkJcmV0dXJuIGVycm9yTWlzc2luZ1Byb3BlcnR5KEVDTElQU0VMSU5LX0pBUl9QUk9QRVJUWSk7CisJCX0KKwkJcmV0dXJuIGVycm9ySmFyRmlsZURvZXNOb3RFeGlzdChnZXRTeXN0ZW1Qcm9wZXJ0eShFQ0xJUFNFTElOS19KQVJfUFJPUEVSVFkpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXJyb3JNaXNzaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlyZXR1cm4gIm1pc3NpbmcgSmF2YSBzeXN0ZW0gcHJvcGVydHk6IFwiIiArIHByb3BlcnR5TmFtZSArICJcIiI7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVycm9ySmFyRmlsZURvZXNOb3RFeGlzdChTdHJpbmcgcHJvcGVydHlWYWx1ZSkgeworCQlyZXR1cm4gIkpBUiBmaWxlIGRvZXNuJ3QgZXhpc3Q6IFwiIiArIHByb3BlcnR5VmFsdWUgKyAiXCIiOworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTeXN0ZW1Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKKwl9CisJCiAJcHJpdmF0ZSBKcHRFY2xpcHNlTGlua0NvcmVUZXN0cygpIHsKIAkJc3VwZXIoKTsKIAkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Zjg5ZjAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9QZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc2lzdGVuY2VVbml0VGVzdENhc2UgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgc3ViamVjdDsKLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyOwotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUHJvcGVydGllcyBwZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlRXZlbnQgcHJvcGVydHlDaGFuZ2VkRXZlbnQ7Ci0KLQlwcm90ZWN0ZWQgaW50IHByb3BlcnR5Q2hhbmdlZEV2ZW50Q291bnQ7Ci0KLQlwcm90ZWN0ZWQgaW50IHByb3BlcnRpZXNUb3RhbDsKLQotCXByb3RlY3RlZCBpbnQgbW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOwotCi0JcHJvdGVjdGVkIGludCBtb2RlbFByb3BlcnRpZXNTaXplOwotCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdCA9IHRoaXMucGVyc2lzdGVuY2VVbml0KCk7Ci0JCXRoaXMuc3ViamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0Pih0aGlzLnN1YmplY3QpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgPSBuZXcgRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzKHRoaXMuc3ViamVjdCk7Ci0JCXRoaXMucG9wdWxhdGVQdSgpOwotCX0KLQotCS8vICoqKioqKiBhYnN0cmFjdCBtZXRob2RzICoqKioqKioKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBtb2RlbCgpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIENhbm5vdCB1c2UKLQkgKiBQcm9wZXJ0eSBIb2xkZXIgdG8gaW5pdGlhbGl6ZSBiZWNhdXNlIGl0IGlzIG5vdCBjcmVhdGVkIHlldAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHBvcHVsYXRlUHUoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIG1vZGVsJ3MgcHJvcGVydHkgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcHJvcGVydHlOYW1lLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIG5hbWUgb2YgcHJvcGVydHkgdG8gZ2V0Ci0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBFeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGVsJ3MgcHJvcGVydHkgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcHJvcGVydHlOYW1lLgotCSAqIFVzZWQgaW4gdmVyaWZ5U2V0UHJvcGVydHkoKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIG5hbWUgb2YgcHJvcGVydHkgdG8gYmUgc2V0Ci0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICB2YWx1ZSBvZiBwcm9wZXJ0eQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIHRlc3QgbWV0aG9kcyAqKioqKioqCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVjbGlwc2VMaW5rU3RyaW5nVmFsdWVPZihPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5nZXRFY2xpcHNlTGlua1N0cmluZ1ZhbHVlT2YodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFB1dCBpbnRvIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzLiBEbyBub3QgYWxsb3dzIHRvIHB1dCBkdXBsaWNhdGUgZW50cnkuCi0JICogCi0JICogQHBhcmFtIGtleSAtCi0JICogICAgICAgICAgICBFY2xpcHNlTGluayBLZXkKLQkgKiBAcGFyYW0gdmFsdWUgLQotCSAqICAgICAgICAgICAgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJzaXN0ZW5jZVVuaXRQdXQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRWNsaXBzZUxpbmsgS2V5IGNhbm5vdCBiZSBudWxsIik7Ci0JCX0KLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQl0aGlzLnB1dE51bGxQcm9wZXJ0eShrZXkpOwotCQllbHNlCi0JCQl0aGlzLnB1dFByb3BlcnR5XyhrZXksIHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHV0UHJvcGVydHlfKFN0cmluZyBlbEtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLnB1dFByb3BlcnR5KGVsS2V5LCB0aGlzLmdldEVjbGlwc2VMaW5rU3RyaW5nVmFsdWVPZih2YWx1ZSksIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXROdWxsUHJvcGVydHkoU3RyaW5nIGVsS2V5KSB7Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLnB1dFByb3BlcnR5KGVsS2V5LCBudWxsLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJFdmVudCgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnRDb3VudCA9IDA7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRocm93TWlzc2luZ0RlZmluaXRpb24oU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbigiTWlzc2luZyBEZWZpbml0aW9uIGZvcjogIiArIG1ldGhvZE5hbWUgKyAiKCAiICsgcHJvcGVydHlOYW1lICsgIikiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlLmdldEFzcGVjdE5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLnRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnQgPSBldmVudDsKLQkJCQlQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS50aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50Q291bnQrKzsKLQkJCX0KLQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkNvbm5lY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQkKLQkvLyAqKioqKiogdmVyaWZ5IEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKgotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBQVZhbHVlKEJvb2xlYW4gZXhwZWN0ZWRWYWx1ZSwgQm9vbGVhbiBzdWJqZWN0VmFsdWUsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBhYSwgU3RyaW5nIHBlcnNpc3RlbmNlWG1sS2V5KSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBzdWJqZWN0VmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgYWEuZ2V0VmFsdWUoKSk7Ci0JCWlmIChleHBlY3RlZFZhbHVlICE9IG51bGwpIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLnRvU3RyaW5nKCksIHRoaXMucGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocGVyc2lzdGVuY2VYbWxLZXkpLmdldFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCA8VCBleHRlbmRzIEVudW08VD4+IHZvaWQgdmVyaWZ5QUFWYWx1ZShUIGV4cGVjdGVkVmFsdWUsIFQgc3ViamVjdFZhbHVlLCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVudW08VD4+IGFhLCBTdHJpbmcgZWxLZXkpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHN1YmplY3RWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBhYS5nZXRWYWx1ZSgpKTsKLQkJaWYgKGV4cGVjdGVkVmFsdWUgIT0gbnVsbCkgewotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0RWNsaXBzZUxpbmtTdHJpbmdWYWx1ZU9mKGV4cGVjdGVkVmFsdWUpLCB0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KS5nZXRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgdGVzdHM6PGJyPgotCSAqIDEuIHZlcmlmeSB0b3RhbCBudW1iZXIgb2YgRWNsaXBzZUxpbmsgcHJvcGVydGllczxicj4KLQkgKiAyLiB2ZXJpZnkgUFUgaGFzIHRoZSBnaXZlbiBwcm9wZXJ0eU5hbWU8YnI+Ci0JICogMy4gdmVyaWZ5IGxpc3RlbmluZyB0byBwcm9wZXJ0eUxpc3RBZGFwdGVyPGJyPgotCSAqIDQuIHZlcmlmeSB0aGF0IHRoZSBtb2RlbCBjYW4gaWRlbnRpZnkgcHJvcGVydHlOYW1lPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUluaXRpYWxTdGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgZWxLZXksIExpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBwcm9wZXJ0eUxpc3RBZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCJUb3RhbCBub3QgdXBkYXRlZCBpbiBwb3B1bGF0ZVB1KCk6ICIsIHByb3BlcnR5TGlzdEFkYXB0ZXIuc2l6ZSgpLCB0aGlzLnByb3BlcnRpZXNUb3RhbCk7Ci0JCXRoaXMudmVyaWZ5UHVIYXNQcm9wZXJ0eShlbEtleSwgIlByb3BlcnR5IG5vdCBhZGRlZCB0byBwb3B1bGF0ZVB1KCkiKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMocHJvcGVydHlMaXN0QWRhcHRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMubW9kZWwoKSwgcHJvcGVydHlOYW1lKTsKLQkJCi0JCVByb3BlcnR5IHByb3BlcnR5ID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSk7Ci0JCWFzc2VydFRydWUoIm1vZGVsLml0ZW1Jc1Byb3BlcnR5KCkgaXMgZmFsc2U6ICIsIG1vZGVsKCkuaXRlbUlzUHJvcGVydHkocHJvcGVydHkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eUlkRm9yKCkgbm90IHVwZGF0ZWQ6ICIsIHByb3BlcnR5TmFtZSwgbW9kZWwoKS5wcm9wZXJ0eUlkRm9yKHByb3BlcnR5KSk7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCB0aGUgcGVyc2lzdGVuY2UgdW5pdCBpcyBwb3B1bGF0ZWQsIGFuZCB0aGF0IHRoZSBtb2RlbCBmb3IKLQkgKiB0aGUgdGVzdGVkIFByb3BlcnR5IGlzIGluaXRpYWxpemVkIHdpdGggdGhlIHZhbHVlIGZyb20gdGhlIHBlcnNpc3RlbmNlCi0JICogdW5pdC4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlNb2RlbEluaXRpYWxpemVkKFN0cmluZyBlbEtleSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMucGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpOwotCQlhc3NlcnRUcnVlKCJtb2RlbC5pdGVtSXNQcm9wZXJ0eSgpIGlzIGZhbHNlOiAiLCBtb2RlbCgpLml0ZW1Jc1Byb3BlcnR5KHByb3BlcnR5KSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJQZXJzaXN0ZW5jZVVuaXQgbm90IHBvcHVsYXRlZCAtIHBvcHVsYXRlZFB1KCkiLCB0aGlzLmdldEVjbGlwc2VMaW5rU3RyaW5nVmFsdWVPZihleHBlY3RlZFZhbHVlKSwgcHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLm1vZGVsKCkucHJvcGVydHlJZEZvcihwcm9wZXJ0eSk7Ci0JCU9iamVjdCBtb2RlbFZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiTW9kZWwgbm90IGluaXRpYWxpemVkIC0gbW9kZWwuaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSAtIG1vZGVsVmFsdWUgPSAiICsgbW9kZWxWYWx1ZSwgCi0JCQlleHBlY3RlZFZhbHVlLCAKLQkJCW1vZGVsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyB3aXRoIHRoZSBwcm9wZXJ0eTo8YnI+Ci0JICogMS4gdmVyaWZpZXMgdGhlIGluaXRpYWwgc3RhdGU8YnI+Ci0JICogMi4gcGVyc2lzdGVuY2VVbml0IHB1dFByb3BlcnR5PGJyPgotCSAqIDMuIGFkYXB0ZXIgc2V0UHJvcGVydHk8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0UHJvcGVydHkoU3RyaW5nIGVsS2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlciA9ICgoRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzKSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMpLnByb3BlcnR5TGlzdEFkYXB0ZXIoKTsKLQkJUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMubW9kZWwoKS5wcm9wZXJ0eUlkRm9yKHByb3BlcnR5KTsKLQotCQkvLyBCYXNpYwotCQl0aGlzLnZlcmlmeUluaXRpYWxTdGF0ZShwcm9wZXJ0eU5hbWUsIGVsS2V5LCBwcm9wZXJ0eUxpc3RBZGFwdGVyKTsKLQkJCi0JCS8vIFJlcGxhY2UKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoZWxLZXksIHRlc3RWYWx1ZTIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5wcm9wZXJ0aWVzVG90YWwsIHByb3BlcnR5TGlzdEFkYXB0ZXIuc2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTIpOwotCQkKLQkJLy8gUmVwbGFjZSBieSBzZXR0aW5nIG1vZGVsIG9iamVjdAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5wcm9wZXJ0aWVzVG90YWwsIHByb3BlcnR5TGlzdEFkYXB0ZXIuc2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyB3aXRoIHRoZSBwcm9wZXJ0eTo8YnI+Ci0JICogMS4gcGVyZm9ybXMgYSByZW1vdmUgb24gdGhlIFBVPGJyPgotCSAqIDIuIHBlcmZvcm1zIGEgYWRkIHdpdGggcHV0UHJvcGVydHk8YnI+Ci0JICogMy4gcGVyZm9ybXMgYSByZXBsYWNlIHdpdGggcHV0UHJvcGVydHk8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoU3RyaW5nIGVsS2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlciA9ICgoRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzKSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMpLnByb3BlcnR5TGlzdEFkYXB0ZXIoKTsKLQkJUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMubW9kZWwoKS5wcm9wZXJ0eUlkRm9yKHByb3BlcnR5KTsKLQotCQkvLyBSZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCS0tdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCS0tdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQlhc3NlcnRUcnVlKCJwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllcyBkb2Vzbid0IGNvbnRhaW5zOiAiICsgZWxLZXksIHRoaXMucGVyc2lzdGVuY2VVbml0KCkuY29udGFpbnNQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KGVsS2V5KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5jb250YWluc1Byb3BlcnR5KGVsS2V5KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vZGVsUHJvcGVydGllc1NpemUsIHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsIC0gMSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnByb3BlcnRpZXNUb3RhbCwgcHJvcGVydHlMaXN0QWRhcHRlci5zaXplKCkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCQotCQkvLyBBZGQgb3JpZ2luYWwgQ2FjaGVUeXBlRGVmYXVsdAotCQkrK3RoaXMucHJvcGVydGllc1RvdGFsOwotCQkrK3RoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoZWxLZXksIHRlc3RWYWx1ZTEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5wcm9wZXJ0aWVzVG90YWwsIHByb3BlcnR5TGlzdEFkYXB0ZXIuc2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEpOwotCQkKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChlbEtleSwgdGVzdFZhbHVlMik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnByb3BlcnRpZXNUb3RhbCwgcHJvcGVydHlMaXN0QWRhcHRlci5zaXplKCkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHRoZSBtb2RlbCdzIHByb3BlcnR5IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHByb3BlcnR5TmFtZQotCSAqIFVzZWQgaW4gdmVyaWZ5U2V0UHJvcGVydHkoKSBhbmQgdmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIHByb3BlcnR5IHRvIGJlIHZlcmlmaWVkCi0JICogQHBhcmFtIGV4cGVjdGVkVmFsdWUKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1dFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQl0aGlzLnZlcmlmeVB1dEV2ZW50KHByb3BlcnR5TmFtZSwgdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpLCBleHBlY3RlZFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyB0aGUgZXZlbnQgb2YgdGhlIHB1dCgpIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIHByb3BlcnR5IHRvIGJlIHZlcmlmaWVkCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHZhbHVlIG9mIHByb3BlcnR5Ci0JICogQHBhcmFtIGV4cGVjdGVkVmFsdWUKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1dEV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQkKLQkJdGhpcy52ZXJpZnlFdmVudChwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLnZlcmlmeUV2ZW50VmFsdWUocHJvcGVydHlWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGZvbGxvd2luZyB0ZXN0czo8YnI+Ci0JICogMS4gdmVyaWZpZXMgdGhlIG5ldyB2YWx1ZSBvZiB0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50PGJyPgotCSAqIDIuIHZlcmlmaWVzIHRoZSBnaXZlbiB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlFdmVudFZhbHVlKE9iamVjdCB2YWx1ZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJLy8gdmVyaWZ5IGV2ZW50IHZhbHVlCi0JCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCB0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgdGVzdHM6PGJyPgotCSAqIDEuIHZlcmlmaWVzIHRoYXQgYW4gZXZlbnQgaXMgZmlyZWQ8YnI+Ci0JICogMi4gdmVyaWZpZXMgdGhhdCBpdCBpcyB0aGUgY29ycmVjdCBldmVudDxicj4KLQkgKiAzLiB2ZXJpZmllcyB0aGF0IGEgc2luZ2xlIGV2ZW50IGlzIGZpcmVkPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBwcm9wZXJ0eU5hbWUpOwotCQkvLyB2ZXJpZnkgZXZlbnQgb2NjdXJlbmNlCi0JCWFzc2VydFRydWUoIk5vIEV2ZW50IFJlY2VpdmVkLiIsIHRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnRDb3VudCA+IDApOwotCQlhc3NlcnRUcnVlKCJNdWx0aXBsZSBFdmVudCBSZWNlaXZlZCAoIiArICB0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50Q291bnQgKyAiKSIsCi0JCQl0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50Q291bnQgPCAyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbCBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsIGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgbW9kZWwsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgYWRkZWQgaW4gc2V0VXAoKSAtICIgKyBwcm9wZXJ0eU5hbWUsICgoQWJzdHJhY3RNb2RlbCkgbW9kZWwpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwgcHZtLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHB2bSkuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHVIYXNQcm9wZXJ0eShTdHJpbmcgZWNsaXBzZUxpbmtQcm9wZXJ0eU5hbWUsIFN0cmluZyBtc2cpIHsKLQkJYXNzZXJ0Tm90TnVsbChtc2cgKyAiIC0gIiArIGVjbGlwc2VMaW5rUHJvcGVydHlOYW1lLCB0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVjbGlwc2VMaW5rUHJvcGVydHlOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShTdHJpbmcgZWNsaXBzZUxpbmtQcm9wZXJ0eU5hbWUsIFN0cmluZyBtc2cpIHsKLQkJYXNzZXJ0TnVsbChtc2cgKyAiIC0gIiArIGVjbGlwc2VMaW5rUHJvcGVydHlOYW1lLCB0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVjbGlwc2VMaW5rUHJvcGVydHlOYW1lKSk7Ci0JfQotCi0JLy8gKioqKioqIHZlcmlmeSBQZXJzaXN0ZW5jZSBVbml0IHByb3BlcnRpZXMgKioqKioqKgotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGZvbGxvd2luZyB0ZXN0czo8YnI+Ci0JICogMS4gdmVyaWZ5IFBlcnNpc3RlbmNlIFVuaXQgc3BlY2lmaWVkIHByb3BlcnR5IGluaXRpYWxpemVkPGJyPgotCSAqIDIuIHNldCB0aGUgUFUgcHJvcGVydHkgYW5kIHZlcmlmeSBQVSBpdHMgdmFsdWU8YnI+Ci0JICogMy4gc2V0IHRoZSBQVSBwcm9wZXJ0eSB0byBudWxsIGFuZCB2ZXJpZnkgUFUgaXRzIHZhbHVlPGJyPgotCSAqIDQuIHNldCBtb2RlbCB2YWx1ZSBwcm9wZXJ0eSBhbmQgdmVyaWZ5IFBVIG1vZGlmaWVkPGJyPgotCSAqIDUuIHNldCBtb2RlbCB2YWx1ZSBwcm9wZXJ0eSB0byBudWxsIGFuZCB2ZXJpZnkgUFUgbW9kaWZpZWQ8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gQmFzaWMKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5tb2RlbCgpLCBwcm9wZXJ0eU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoIlBlcnNpc3RlbmNlIFVuaXQgbm90IGluaXRpYWxpemVkLiIsIHRlc3RWYWx1ZTEsIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkocHJvcGVydHlOYW1lKSk7Ci0JCU9iamVjdCBpbml0aWFsTW9kZWxWYWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIk1vZGVsIG5vdCBpbml0aWFsaXplZCAtIG1vZGVsLmluaXRpYWxpemVQcm9wZXJ0aWVzKCkgLSBtb2RlbFZhbHVlID0gIiArIGluaXRpYWxNb2RlbFZhbHVlLCAKLQkJCXRlc3RWYWx1ZTEsIAotCQkJaW5pdGlhbE1vZGVsVmFsdWUpOwotCQkKLQkJLy8gTW9kaWZ5aW5nIHZhbHVlIGJ5IHNldHRpbmcgUFUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQkJdGhpcy52ZXJpZnlNb2RlbE1vZGlmaWVkKHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0JCQotCQkvLyBTZXR0aW5nIFBVIHRvIG51bGwKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKLQkJdGhpcy52ZXJpZnlNb2RlbE1vZGlmaWVkKHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCQotCQkvLyBNb2RpZnlpbmcgdmFsdWUgYnkgc2V0dGluZyBtb2RlbCBvYmplY3QKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxKTsKLQkJdGhpcy52ZXJpZnlQZXJzaXN0ZW5jZVVuaXRNb2RpZmllZChwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEpOwotCi0JCS8vIFNldHRpbmcgbW9kZWwgdG8gbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQl0aGlzLnZlcmlmeVBlcnNpc3RlbmNlVW5pdE1vZGlmaWVkKHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UGVyc2lzdGVuY2VVbml0TW9kaWZpZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoIlBlcnNpc3RlbmNlIFVuaXQgbm90IG1vZGlmaWVkLiIsIGV4cGVjdGVkVmFsdWUsIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkocHJvcGVydHlOYW1lKSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBleHBlY3RlZFZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlNb2RlbE1vZGlmaWVkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWFzc2VydEVxdWFscygiY29ubmVjdGlvbiB2YWx1ZSBub3QgbW9kaWZpZWQuIiwgZXhwZWN0ZWRWYWx1ZSwgbW9kZWxWYWx1ZSk7Ci0JCXRoaXMudmVyaWZ5UHV0RXZlbnQocHJvcGVydHlOYW1lLCBtb2RlbFZhbHVlLCBleHBlY3RlZFZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXJyb3IoIk1pc3NpbmcgaW1wbGVtZW50YXRpb24gZm9yIHNldFBlcnNpc3RlbmNlVW5pdFByb3BlcnR5Iik7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEVycm9yKCJNaXNzaW5nIGltcGxlbWVudGF0aW9uIGZvciBnZXRQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eSIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY2FjaGluZy9DYWNoaW5nQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NhY2hpbmcvQ2FjaGluZ0FkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTUzZGQ0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY2FjaGluZy9DYWNoaW5nQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rSnBhUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eUxpc3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNhY2hpbmcuQ2FjaGVQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jYWNoaW5nLkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5QZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBtb2RlbCBvYmplY3RzIGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbiB0aGUKLSAqIFBlcnNpc3RlbmNlVW5pdCBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGluZ0FkYXB0ZXJUZXN0cyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDYWNoaW5nIGNhY2hpbmc7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgZW50aXRpZXNFdmVudDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9URVNUID0gIkVtcGxveWVlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEVTVF8yID0gIkFkZHJlc3MiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVFlQRV9ERUZBVUxUX0tFWSA9IENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIENBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFID0gQ2FjaGVUeXBlLnNvZnRfd2VhazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENhY2hlVHlwZSBDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRV8yID0gQ2FjaGVUeXBlLmZ1bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX0RFRkFVTFRfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSVpFX0RFRkFVTFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFID0gMTIzNDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFXzIgPSA2Nzg5MDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJFRF9DQUNIRV9ERUZBVUxUX0tFWSA9IENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRV8yID0gdHJ1ZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1RZUEVfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFICsgRU5USVRZX1RFU1Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgQ0FDSEVfVFlQRV9URVNUX1ZBTFVFID0gQ2FjaGVUeXBlLnNvZnRfd2VhazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENhY2hlVHlwZSBDQUNIRV9UWVBFX1RFU1RfVkFMVUVfMiA9IENhY2hlVHlwZS5mdWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX0NBQ0hFX0tFWSA9IENhY2hpbmcuRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFICsgRU5USVRZX1RFU1Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFXzIgPSB0cnVlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU0laRV9LRVkgPSBDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1NJWkUgKyBFTlRJVFlfVEVTVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FDSEVfU0laRV9URVNUX1ZBTFVFID0gMTIzNDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENBQ0hFX1NJWkVfVEVTVF9WQUxVRV8yID0gNjc4OTA7Ci0KLQlwdWJsaWMgQ2FjaGluZ0FkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNhY2hpbmcgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuZ2V0Q2FjaGluZygpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQkKLQkJdGhpcy5jYWNoaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ2FjaGluZy5DQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nLkNBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2FjaGluZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nLkNBQ0hFX1RZUEVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nLkNBQ0hFX1NJWkVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nLlNIQVJFRF9DQUNIRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgZW50aXRpZXNDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRFbnRpdGllc0NoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY2FjaGluZy5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoQ2FjaGluZy5FTlRJVElFU19MSVNUX1BST1BFUlRZLCBlbnRpdGllc0NoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gNjsKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDQ7IC8vIDQgbWlzYyBwcm9wZXJ0aWVzCi0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOwotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KENBQ0hFX1RZUEVfREVGQVVMVF9LRVksIENBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoIm1pc2MucHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KENBQ0hFX1NJWkVfREVGQVVMVF9LRVksIENBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoU0hBUkVEX0NBQ0hFX0RFRkFVTFRfS0VZLCBTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KCJtaXNjLnByb3BlcnR5LjQiLCAidmFsdWUuNCIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChDQUNIRV9TSVpFX0tFWSwgQ0FDSEVfU0laRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoQ0FDSEVfVFlQRV9LRVksIENBQ0hFX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KFNIQVJFRF9DQUNIRV9LRVksIFNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vICoqKioqKioqKiogTGlzdGVuZXJzICoqKioqKioqKioKLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZEVudGl0aWVzQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdBZGFwdGVyVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdBZGFwdGVyVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLmVudGl0eUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJFdmVudCgpIHsKLQkJc3VwZXIuY2xlYXJFdmVudCgpOwotCQl0aGlzLmVudGl0aWVzRXZlbnQgPSBudWxsOwotCX0KLQotCXZvaWQgZW50aXR5Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmVudGl0aWVzRXZlbnQgPSBlOwotCX0KLQotCS8vICoqKioqKioqKiogZW50aXRpZXMgbGlzdCAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdEVudGl0aWVzTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBhZGQKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuY2FjaGluZy5hZGRFbnRpdHkoRU5USVRZX1RFU1RfMik7Ci0JCQotCQkvLyB2ZXJpZnkgZXZlbnQgcmVjZWl2ZWQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gRXZlbnQgRmlyZWQuIiwgdGhpcy5lbnRpdGllc0V2ZW50KTsKLQkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLmVudGl0aWVzRXZlbnQuZ2V0QXNwZWN0TmFtZSgpLCBDYWNoaW5nLkVOVElUSUVTX0xJU1RfUFJPUEVSVFkpOwotCi0JCS8vIHJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5jYWNoaW5nLnJlbW92ZUVudGl0eShFTlRJVFlfVEVTVF8yKTsKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuZW50aXRpZXNFdmVudCk7Ci0JCS8vIHZlcmlmeSBldmVudCBmb3IgdGhlIGV4cGVjdGVkIHByb3BlcnR5Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgRXZlbnQuIiwgdGhpcy5lbnRpdGllc0V2ZW50LmdldEFzcGVjdE5hbWUoKSwgQ2FjaGluZy5FTlRJVElFU19MSVNUX1BST1BFUlRZKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExpc3RlbmVycyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBuZXcKLQkJTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQcm9wZXJ0eT4gcHJvcGVydGllc0FkYXB0ZXIgPSAKLQkJCShMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFByb3BlcnR5PikgKChFY2xpcHNlTGlua0pwYVByb3BlcnRpZXMpIHRoaXMucGVyc2lzdGVuY2VVbml0UHJvcGVydGllcykucHJvcGVydGllc0FkYXB0ZXIoKTsKLQkJR2VuZXJpY1Byb3BlcnR5IGN0ZFByb3BlcnR5ID0gKEdlbmVyaWNQcm9wZXJ0eSkgdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShDQUNIRV9UWVBFX0RFRkFVTFRfS0VZKTsKLQkJTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIgPSAoKEVjbGlwc2VMaW5rSnBhUHJvcGVydGllcykgdGhpcy5wZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzKS5wcm9wZXJ0eUxpc3RBZGFwdGVyKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHByb3BlcnRpZXNBZGFwdGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShjdGRQcm9wZXJ0eS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmNhY2hpbmcsIENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMocHJvcGVydHlMaXN0QWRhcHRlcik7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hpbmcgZWxDYWNoaW5nID0gKEVjbGlwc2VMaW5rQ2FjaGluZykgdGhpcy5jYWNoaW5nOwotCQlQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eUxpc3RMaXN0ZW5lciBwcm9wZXJ0eUxpc3RMaXN0ZW5lciA9IGVsQ2FjaGluZy5wcm9wZXJ0eUxpc3RMaXN0ZW5lcigpOwotCQlwcm9wZXJ0eUxpc3RBZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgcHJvcGVydHlMaXN0TGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHByb3BlcnRpZXNBZGFwdGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsgLy8gb3RoZXIgcHJvcGVydGllcyBhcmUgc3RpbGwgbGlzdGVuaW5nCi0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY2FjaGluZywgQ2FjaGluZy5DQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBDYWNoZVR5cGVEZWZhdWx0IHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbgotCSAqIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVUeXBlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfS0VZLAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX0tFWSwKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFLAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlVHlwZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9LRVksCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTaXplRGVmYXVsdCAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBDYWNoZVNpemVEZWZhdWx0IHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbgotCSAqIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVTaXplRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9TSVpFX0RFRkFVTFRfS0VZLAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX0tFWSwKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFLAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlU2l6ZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9LRVksCi0JCQlDQUNIRV9TSVpFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX0tFWSwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfS0VZLAotCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNoYXJlZENhY2hlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfS0VZLAotCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVR5cGUgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ2FjaGVUeXBlIHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbiB0aGUgUFUKLQkgKiBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUNBQ0hFX1RZUEVfS0VZLAotCQkJQ0FDSEVfVFlQRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRDYWNoaW5nUHJvcGVydHkoCi0JCQlDYWNoaW5nLkNBQ0hFX1RZUEVfUFJPUEVSVFksCi0JCQlDQUNIRV9UWVBFX0tFWSwKLQkJCUNBQ0hFX1RZUEVfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1RZUEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlQ2FjaGluZ1Byb3BlcnR5KAotCQkJQ2FjaGluZy5DQUNIRV9UWVBFX1BST1BFUlRZLAotCQkJQ0FDSEVfVFlQRV9LRVksCi0JCQlDQUNIRV9UWVBFX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9UWVBFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVNpemUgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ2FjaGVTaXplIHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbiB0aGUgUFUKLQkgKiBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUNBQ0hFX1NJWkVfS0VZLAotCQkJQ0FDSEVfU0laRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRDYWNoaW5nUHJvcGVydHkoCi0JCQlDYWNoaW5nLkNBQ0hFX1NJWkVfUFJPUEVSVFksCi0JCQlDQUNIRV9TSVpFX0tFWSwKLQkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlQ2FjaGluZ1Byb3BlcnR5KAotCQkJQ2FjaGluZy5DQUNIRV9TSVpFX1BST1BFUlRZLAotCQkJQ0FDSEVfU0laRV9LRVksCi0JCQlDQUNIRV9TSVpFX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9TSVpFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTaGFyZWRDYWNoZSAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBTaGFyZWRDYWNoZSBwcm9wZXJ0eSBieSB0aGUgQ2FjaGluZyBhZGFwdGVyIHdoZW4gdGhlCi0JICogUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldFNoYXJlZENhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNIQVJFRF9DQUNIRV9LRVksCi0JCQlTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0Q2FjaGluZ1Byb3BlcnR5KAotCQkJQ2FjaGluZy5TSEFSRURfQ0FDSEVfUFJPUEVSVFksCi0JCQlTSEFSRURfQ0FDSEVfS0VZLAotCQkJU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUsCi0JCQlTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU2hhcmVkQ2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVDYWNoaW5nUHJvcGVydHkoCi0JCQlDYWNoaW5nLlNIQVJFRF9DQUNIRV9QUk9QRVJUWSwKLQkJCVNIQVJFRF9DQUNIRV9LRVksCi0JCQlTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRSwKLQkJCVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBtb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRDYWNoaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIgPSAoKEVjbGlwc2VMaW5rSnBhUHJvcGVydGllcykgdGhpcy5wZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzKS5wcm9wZXJ0eUxpc3RBZGFwdGVyKCk7Ci0JCS8vIEJhc2ljCi0JCXRoaXMudmVyaWZ5SW5pdGlhbFN0YXRlKHByb3BlcnR5TmFtZSwga2V5LCBwcm9wZXJ0eUxpc3RBZGFwdGVyKTsKLQkJCi0JCS8vIFJlcGxhY2UKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoa2V5LCB0ZXN0VmFsdWUyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJvcGVydGllc1RvdGFsLCBwcm9wZXJ0eUxpc3RBZGFwdGVyLnNpemUoKSk7Ci0JCXRoaXMudmVyaWZ5UHV0Q2FjaGluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTIpOwotCQkKLQkJLy8gUmVwbGFjZSBieSBzZXR0aW5nIG1vZGVsIG9iamVjdAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5zZXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnByb3BlcnRpZXNUb3RhbCwgcHJvcGVydHlMaXN0QWRhcHRlci5zaXplKCkpOwotCQl0aGlzLnZlcmlmeVB1dENhY2hpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBZGRSZW1vdmVDYWNoaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIgPSAoKEVjbGlwc2VMaW5rSnBhUHJvcGVydGllcykgdGhpcy5wZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzKS5wcm9wZXJ0eUxpc3RBZGFwdGVyKCk7Ci0JCS8vIFJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJLS10aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJLS10aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkoa2V5KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5jb250YWluc1Byb3BlcnR5KGtleSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb2RlbFByb3BlcnRpZXNTaXplLCB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCAtIDEpOwotCQl0aGlzLnZlcmlmeVB1dENhY2hpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJvcGVydGllc1RvdGFsLCBwcm9wZXJ0eUxpc3RBZGFwdGVyLnNpemUoKSk7Ci0JCQotCQkvLyBBZGQgb3JpZ2luYWwgUHJvcGVydHkKLQkJKyt0aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJKyt0aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KGtleSwgdGVzdFZhbHVlMSk7Ci0JCXRoaXMudmVyaWZ5UHV0Q2FjaGluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5wcm9wZXJ0aWVzVG90YWwsIHByb3BlcnR5TGlzdEFkYXB0ZXIuc2l6ZSgpKTsKLQkJCi0JCS8vIFJlcGxhY2UKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoa2V5LCB0ZXN0VmFsdWUyKTsKLQkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0Q2FjaGluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQocHJvcGVydHlOYW1lKTsKLQkJdGhpcy52ZXJpZnlDYWNoaW5nRXZlbnQocHJvcGVydHlOYW1lLCBlbnRpdHlOYW1lLCBleHBlY3RlZFZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlDYWNoaW5nRXZlbnQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGVudGl0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdmVyaWZ5IGV2ZW50IHZhbHVlCi0JCUNhY2hlUHJvcGVydGllcyBjYWNoZSA9IChDYWNoZVByb3BlcnRpZXMpIHRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5DQUNIRV9UWVBFX1BST1BFUlRZKSkgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGNhY2hlLmdldFR5cGUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgdGhpcy5jYWNoaW5nLmdldENhY2hlVHlwZShlbnRpdHlOYW1lKSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nLkNBQ0hFX1NJWkVfUFJPUEVSVFkpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgY2FjaGUuZ2V0U2l6ZSgpKTsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCB0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVTaXplKGVudGl0eU5hbWUpKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSkgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGNhY2hlLmlzU2hhcmVkKCkpOwotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZShlbnRpdHlOYW1lKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInZlcmlmeUNhY2hpbmdFdmVudCIsIHByb3BlcnR5TmFtZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSkKLQkJCXRoaXMuY2FjaGluZy5zZXRDYWNoZVR5cGVEZWZhdWx0KChDYWNoZVR5cGUpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nLkNBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNhY2hpbmcuc2V0Q2FjaGVTaXplRGVmYXVsdCgoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpKQotCQkJdGhpcy5jYWNoaW5nLnNldFNoYXJlZENhY2hlRGVmYXVsdCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDYWNoaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGVudGl0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5DQUNIRV9UWVBFX1BST1BFUlRZKSkKLQkJCXRoaXMuY2FjaGluZy5zZXRDYWNoZVR5cGUoKENhY2hlVHlwZSkgbmV3VmFsdWUsIGVudGl0eU5hbWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuQ0FDSEVfU0laRV9QUk9QRVJUWSkpCi0JCQl0aGlzLmNhY2hpbmcuc2V0Q2FjaGVTaXplKChJbnRlZ2VyKSBuZXdWYWx1ZSwgZW50aXR5TmFtZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfUFJPUEVSVFkpKQotCQkJdGhpcy5jYWNoaW5nLnNldFNoYXJlZENhY2hlKChCb29sZWFuKSBuZXdWYWx1ZSwgZW50aXR5TmFtZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0Q2FjaGluZ1Byb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5DQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVEZWZhdWx0KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5DQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY2FjaGluZy5nZXRDYWNoZVNpemVEZWZhdWx0KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuQ0FDSEVfU0laRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldENhY2hlU2l6ZShFTlRJVFlfVEVTVCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5DQUNIRV9UWVBFX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVUeXBlKEVOVElUWV9URVNUKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nLlNIQVJFRF9DQUNIRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldFNoYXJlZENhY2hlKEVOVElUWV9URVNUKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY2FjaGluZy9DYWNoaW5nVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NhY2hpbmcvQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGY3ZDdhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY2FjaGluZy9DYWNoaW5nVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNhY2hpbmcuQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLlBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIENhY2hpbmdWYWx1ZU1vZGVsVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIENhY2hpbmdWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgQ2FjaGluZyBjYWNoaW5nOwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IGNhY2hpbmdIb2xkZXI7Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZVR5cGU+IGNhY2hlVHlwZUhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY2FjaGVUeXBlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGNhY2hlVHlwZUV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBzaGFyZWRDYWNoZUhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2hhcmVkQ2FjaGVMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgc2hhcmVkQ2FjaGVFdmVudDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVUeXBlPiBjYWNoZVR5cGVEZWZhdWx0SG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjYWNoZVR5cGVEZWZhdWx0TGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGNhY2hlVHlwZURlZmF1bHRFdmVudDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzaGFyZWRDYWNoZURlZmF1bHRMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFID0gIkVtcGxveWVlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENhY2hlVHlwZSBDQUNIRV9UWVBFX1RFU1RfVkFMVUUgPSBDYWNoZVR5cGUuaGFyZF93ZWFrOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUgPSBDYWNoZVR5cGUud2VhazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlwdWJsaWMgQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNhY2hpbmcgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuZ2V0Q2FjaGluZygpOyAvLyBTdWJqZWN0Ci0JCXRoaXMuY2FjaGluZ0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4odGhpcy5jYWNoaW5nKTsKLQkJCi0JCXRoaXMuY2FjaGVUeXBlSG9sZGVyID0gdGhpcy5idWlsZENhY2hlVHlwZUFBKHRoaXMuY2FjaGluZ0hvbGRlcik7Ci0JCXRoaXMuY2FjaGVUeXBlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2FjaGVUeXBlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5jYWNoZVR5cGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2FjaGVUeXBlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hlVHlwZUV2ZW50ID0gbnVsbDsKLQkJCi0JCXRoaXMuc2hhcmVkQ2FjaGVIb2xkZXIgPSB0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVBQSh0aGlzLmNhY2hpbmdIb2xkZXIpOwotCQl0aGlzLnNoYXJlZENhY2hlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNoYXJlZENhY2hlTGlzdGVuZXIpOwotCQl0aGlzLnNoYXJlZENhY2hlRXZlbnQgPSBudWxsOwotCQkKLQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyID0gdGhpcy5idWlsZENhY2hlVHlwZURlZmF1bHRBQSh0aGlzLmNhY2hpbmdIb2xkZXIpOwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRMaXN0ZW5lciA9IHRoaXMuYnVpbGRDYWNoZVR5cGVEZWZhdWx0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNhY2hlVHlwZURlZmF1bHRMaXN0ZW5lcik7Ci0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEV2ZW50ID0gbnVsbDsKLQkJCi0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyID0gdGhpcy5idWlsZFNoYXJlZENhY2hlRGVmYXVsdEFBKHRoaXMuY2FjaGluZ0hvbGRlcik7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0TGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVEZWZhdWx0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0TGlzdGVuZXIpOwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlBYnN0cmFjdE1vZGVsIHN1YmplY3RDYWNoaW5nID0gKEFic3RyYWN0TW9kZWwpIHRoaXMuY2FjaGluZzsgLy8gU3ViamVjdAotCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPiBjYWNoZVR5cGVBQSA9IAotCQkJKFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBDYWNoZVR5cGU+KSB0aGlzLmNhY2hlVHlwZUhvbGRlcjsKLQkJYXNzZXJ0VHJ1ZShjYWNoZVR5cGVBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLkNBQ0hFX1RZUEVfUFJPUEVSVFkpKTsKLQkJCi0JCWNhY2hlVHlwZUFBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNhY2hlVHlwZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2Uoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5DQUNIRV9UWVBFX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKGNhY2hlVHlwZUFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQkKLQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+IHNoYXJlZENhY2hlQUEgPSAKLQkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4pIHRoaXMuc2hhcmVkQ2FjaGVIb2xkZXI7Ci0JCWFzc2VydFRydWUoc2hhcmVkQ2FjaGVBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLlNIQVJFRF9DQUNIRV9QUk9QRVJUWSkpOwotCQkKLQkJc2hhcmVkQ2FjaGVBQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zaGFyZWRDYWNoZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2Uoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2Uoc2hhcmVkQ2FjaGVBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJCi0JCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBDYWNoZVR5cGU+IGNhY2hlVHlwZURlZmF1bHRBQSA9IAotCQkJKFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBDYWNoZVR5cGU+KSB0aGlzLmNhY2hlVHlwZURlZmF1bHRIb2xkZXI7Ci0JCWFzc2VydFRydWUoY2FjaGVUeXBlRGVmYXVsdEFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSk7Ci0JCQotCQljYWNoZVR5cGVEZWZhdWx0QUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2FjaGVUeXBlRGVmYXVsdExpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2Uoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5DQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UoY2FjaGVUeXBlRGVmYXVsdEFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQkKLQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+IHNoYXJlZENhY2hlRGVmYXVsdEFBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KSB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEhvbGRlcjsKLQkJYXNzZXJ0VHJ1ZShzaGFyZWRDYWNoZURlZmF1bHRBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSk7Ci0JCQotCQlzaGFyZWRDYWNoZURlZmF1bHRBQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2Uoc2hhcmVkQ2FjaGVEZWZhdWx0QUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoCi0JCQlDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCAKLQkJCUNBQ0hFX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KAotCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCAKLQkJCVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoCi0JCQlDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCwgCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KAotCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCwgCi0JCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIG1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nOwotCX0KLQotCS8qKiAqKioqKiogQ2FjaGVUeXBlICoqKioqKiogKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gYnVpbGRDYWNoZVR5cGVBQShQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBDYWNoZVR5cGU+KHN1YmplY3RIb2xkZXIsIENhY2hpbmcuQ0FDSEVfVFlQRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q2FjaGVUeXBlKEVOVElUWV9OQU1FX1RFU1RfVkFMVUUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhDYWNoZVR5cGUgZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldENhY2hlVHlwZShlbnVtVmFsdWUsIEVOVElUWV9OQU1FX1RFU1RfVkFMVUUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENhY2hlVHlwZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy50aGlzLmNhY2hlVHlwZUV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKiogKioqKioqIFNoYXJlZENhY2hlICoqKioqKiogKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2hhcmVkQ2FjaGVBQShQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBDYWNoaW5nLlNIQVJFRF9DQUNIRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNoYXJlZENhY2hlKEVOVElUWV9OQU1FX1RFU1RfVkFMVUUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIGVudW1WYWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTaGFyZWRDYWNoZShlbnVtVmFsdWUsIEVOVElUWV9OQU1FX1RFU1RfVkFMVUUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNoYXJlZENhY2hlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2hhcmVkQ2FjaGVFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqICoqKioqKiBDYWNoZVR5cGVEZWZhdWx0ICoqKioqKiogKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gYnVpbGRDYWNoZVR5cGVEZWZhdWx0QUEoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPihzdWJqZWN0SG9sZGVyLCBDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhDYWNoZVR5cGUgZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldENhY2hlVHlwZURlZmF1bHQoZW51bVZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDYWNoZVR5cGVEZWZhdWx0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMuY2FjaGVUeXBlRGVmYXVsdEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKiogKioqKioqIFNoYXJlZENhY2hlRGVmYXVsdCAqKioqKioqICovCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNoYXJlZENhY2hlRGVmYXVsdEFBKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U2hhcmVkQ2FjaGVEZWZhdWx0KGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2hhcmVkQ2FjaGVEZWZhdWx0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKiAqKioqKiogVGVzdHMgKioqKioqKiAqLwotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJLyoqICoqKioqKiBDYWNoZVR5cGUgLSBkZWZhdWx0cyBmb3IgZW50aXR5IGxldmVsIGNhY2hpbmcgYXJlIGVxdWFsIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHNldHRpbmdzICoqKioqKiogKi8KLQkJdGhpcy52ZXJpZnlDYWNoZVR5cGVBQVZhbHVlKENBQ0hFX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpLCB0aGlzLmNhY2hpbmcuZ2V0RGVmYXVsdENhY2hlVHlwZSgpKTsKLQkJLyoqICoqKioqKiBTaGFyZWRDYWNoZSAtIGRlZmF1bHRzIGZvciBlbnRpdHkgbGV2ZWwgY2FjaGluZyBhcmUgZXF1YWwgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgc2V0dGluZ3MgKioqKioqKiAqLwotCQl0aGlzLnZlcmlmeVNoYXJlZENhY2hlQUFWYWx1ZShTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmNhY2hpbmcuZ2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCksIHRoaXMuY2FjaGluZy5nZXREZWZhdWx0U2hhcmVkQ2FjaGUoKSk7Ci0JCS8qKiAqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqICovCi0JCXRoaXMudmVyaWZ5Q2FjaGVUeXBlRGVmYXVsdEFBVmFsdWUoQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoQ2FjaGluZy5ERUZBVUxUX0NBQ0hFX1RZUEVfREVGQVVMVCwgdGhpcy5jYWNoaW5nLmdldERlZmF1bHRDYWNoZVR5cGVEZWZhdWx0KCkpOwotCQkvKiogKioqKioqIFNoYXJlZENhY2hlRGVmYXVsdCAqKioqKioqICovCi0JCXRoaXMudmVyaWZ5U2hhcmVkQ2FjaGVEZWZhdWx0QUFWYWx1ZShTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hpbmcuREVGQVVMVF9TSEFSRURfQ0FDSEVfREVGQVVMVCwgdGhpcy5jYWNoaW5nLmdldERlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8qKiAqKioqKiogQ2FjaGVUeXBlICoqKioqKiogKi8KLQkJdGhpcy5jYWNoZVR5cGVFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY2FjaGVUeXBlSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlDYWNoZVR5cGUgbmV3Q2FjaGVUeXBlID0gQ2FjaGVUeXBlLmZ1bGw7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuY2FjaGVUeXBlSG9sZGVyLnNldFZhbHVlKG5ld0NhY2hlVHlwZSk7Ci0JCXRoaXMudmVyaWZ5Q2FjaGVUeXBlQUFWYWx1ZShuZXdDYWNoZVR5cGUpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuY2FjaGVUeXBlRXZlbnQpOwotCQkvKiogKioqKioqIFNoYXJlZENhY2hlICoqKioqKiogKi8KLQkJdGhpcy5zaGFyZWRDYWNoZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5zaGFyZWRDYWNoZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJQm9vbGVhbiBuZXdTaGFyZWRDYWNoZSA9ICFTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRTsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5zaGFyZWRDYWNoZUhvbGRlci5zZXRWYWx1ZShuZXdTaGFyZWRDYWNoZSk7Ci0JCXRoaXMudmVyaWZ5U2hhcmVkQ2FjaGVBQVZhbHVlKG5ld1NoYXJlZENhY2hlKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnNoYXJlZENhY2hlRXZlbnQpOwotCQkvKiogKioqKioqIENhY2hlVHlwZURlZmF1bHQgKioqKioqKiAqLwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJQ2FjaGVUeXBlIG5ld0NhY2hlVHlwZURlZmF1bHQgPSBDYWNoZVR5cGUubm9uZTsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyLnNldFZhbHVlKG5ld0NhY2hlVHlwZURlZmF1bHQpOwotCQl0aGlzLnZlcmlmeUNhY2hlVHlwZURlZmF1bHRBQVZhbHVlKG5ld0NhY2hlVHlwZURlZmF1bHQpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuY2FjaGVUeXBlRGVmYXVsdEV2ZW50KTsKLQkJLyoqICoqKioqKiBTaGFyZWRDYWNoZURlZmF1bHQgKioqKioqKiAqLwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JCUJvb2xlYW4gbmV3U2hhcmVkQ2FjaGVEZWZhdWx0ID0gIVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUU7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyLnNldFZhbHVlKG5ld1NoYXJlZENhY2hlRGVmYXVsdCk7Ci0JCXRoaXMudmVyaWZ5U2hhcmVkQ2FjaGVEZWZhdWx0QUFWYWx1ZShuZXdTaGFyZWRDYWNoZURlZmF1bHQpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsVmFsdWUoKSB7Ci0JCVN0cmluZyBub3REZWxldGVkID0gIlByb3BlcnR5IG5vdCBkZWxldGVkIjsKLQkJLyoqICoqKioqKiBDYWNoZVR5cGUgKioqKioqKiAqLwotCQl0aGlzLmNhY2hlVHlwZUV2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuY2FjaGVUeXBlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeUNhY2hlVHlwZUFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5jYWNoZVR5cGVFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFICsgRU5USVRZX05BTUVfVEVTVF9WQUxVRSwgbm90RGVsZXRlZCk7Ci0JCS8qKiAqKioqKiogU2hhcmVkQ2FjaGUgKioqKioqKiAqLwotCQl0aGlzLnNoYXJlZENhY2hlRXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5zaGFyZWRDYWNoZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlTaGFyZWRDYWNoZUFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5zaGFyZWRDYWNoZUV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShDYWNoaW5nLkVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSArIEVOVElUWV9OQU1FX1RFU1RfVkFMVUUsIG5vdERlbGV0ZWQpOwotCQkvKiogKioqKioqIENhY2hlVHlwZURlZmF1bHQgKioqKioqKiAqLwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRFdmVudCA9IG51bGw7Ci0JCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5Q2FjaGVUeXBlRGVmYXVsdEFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5jYWNoZVR5cGVEZWZhdWx0RXZlbnQpOwotCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxULCBub3REZWxldGVkKTsKLQkJLyoqICoqKioqKiBTaGFyZWRDYWNoZURlZmF1bHQgKioqKioqKiAqLwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEV2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeVNoYXJlZENhY2hlRGVmYXVsdEFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5zaGFyZWRDYWNoZURlZmF1bHRFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCwgbm90RGVsZXRlZCk7Ci0JfQotCi0JLyoqICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKiogKi8KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5Q2FjaGVUeXBlQUFWYWx1ZShDYWNoZVR5cGUgdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwgCi0JCQl0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVUeXBlKEVOVElUWV9OQU1FX1RFU1RfVkFMVUUpLCAKLQkJCXRoaXMuY2FjaGVUeXBlSG9sZGVyLCAKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSArIEVOVElUWV9OQU1FX1RFU1RfVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTaGFyZWRDYWNoZUFBVmFsdWUoQm9vbGVhbiB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLCAKLQkJCXRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZShFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKSwgCi0JCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyLCAKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFICsgRU5USVRZX05BTUVfVEVTVF9WQUxVRSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUNhY2hlVHlwZURlZmF1bHRBQVZhbHVlKENhY2hlVHlwZSB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLCAKLQkJCXRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVEZWZhdWx0KCksIAotCQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyLCAKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxUKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2hhcmVkQ2FjaGVEZWZhdWx0QUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsIAotCQkJdGhpcy5jYWNoaW5nLmdldFNoYXJlZENhY2hlRGVmYXVsdCgpLCAKLQkJCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyLCAKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY2FjaGluZy9KcHRFY2xpcHNlTGlua0NvcmVDYWNoaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY2FjaGluZy9KcHRFY2xpcHNlTGlua0NvcmVDYWNoaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2ZDYyYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NhY2hpbmcvSnB0RWNsaXBzZUxpbmtDb3JlQ2FjaGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNhY2hpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZUNhY2hpbmdUZXN0cwotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGlua0NvcmVDYWNoaW5nVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDYWNoaW5nQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZUNhY2hpbmdUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb25uZWN0aW9uL0Nvbm5lY3Rpb25BZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29ubmVjdGlvbi9Db25uZWN0aW9uQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZWExZWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb25uZWN0aW9uL0Nvbm5lY3Rpb25BZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0pwYVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVuY2VVbml0UHJvcGVydHlMaXN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jb25uZWN0aW9uLkJhdGNoV3JpdGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmNvbm5lY3Rpb24uRWNsaXBzZUxpbmtDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLlBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogIENvbm5lY3Rpb25BZGFwdGVyVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgQ29ubmVjdGlvbiBjb25uZWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgVFJBTlNBQ1RJT05fVFlQRV9URVNUX1ZBTFVFID0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIFRSQU5TQUNUSU9OX1RZUEVfVEVTVF9WQUxVRV8yID0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLkpUQTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpUQV9EQVRBX1NPVVJDRV9URVNUX1ZBTFVFID0gIlRlc3RfSlRBIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKVEFfREFUQV9TT1VSQ0VfVEVTVF9WQUxVRV8yID0gIlRlc3RfSlRBXzIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX0pUQV9EQVRBX1NPVVJDRV9URVNUX1ZBTFVFID0gIlRlc3RfTm9uX0pUQSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX0pUQV9EQVRBX1NPVVJDRV9URVNUX1ZBTFVFXzIgPSAiVGVzdF9Ob25fSlRBXzIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRV9TUUxfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19OQVRJVkVfU1FMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBOQVRJVkVfU1FMX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gTkFUSVZFX1NRTF9URVNUX1ZBTFVFXzIgPSAhIE5BVElWRV9TUUxfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBVENIX1dSSVRJTkdfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19CQVRDSF9XUklUSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQmF0Y2hXcml0aW5nIEJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRSA9IEJhdGNoV3JpdGluZy5vcmFjbGVfamRiYzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJhdGNoV3JpdGluZyBCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUVfMiA9IEJhdGNoV3JpdGluZy5idWZmZXJlZDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TVEFURU1FTlRTX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gQ0FDSEVfU1RBVEVNRU5UU19URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIENBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRV8yID0gISBDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU1RBVEVNRU5UU19TSVpFX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUVfMiA9IDIwMDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19EUklWRVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX1RFU1RfVkFMVUUgPSAidGVzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1VSTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfVVNFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1RFU1RfVkFMVUUgPSAidGVzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfUEFTU1dPUkQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5EX1BBUkFNRVRFUlNfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFXzIgPSAhIEJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19TSEFSRUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRV8yID0gISBSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfTUlOX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19NSU47Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUgPSAxMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUVfMiA9IDIwMDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0NPTk5FQ1RJT05TX01BWF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFXzIgPSAyMDA7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfQ09OTkVDVElPTlNfTUlOX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUlOOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBXUklURV9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUVfMiA9IDIwMDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUklURV9DT05ORUNUSU9OU19NQVhfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NQVg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yID0gMjAwOwotCi0JcHVibGljIENvbm5lY3Rpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb25uZWN0aW9uID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmdldENvbm5lY3Rpb24oKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCi0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5OT05fSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5OQVRJVkVfU1FMX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5CQVRDSF9XUklUSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLkRSSVZFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uVVJMX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5VU0VSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5QQVNTV09SRF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uQklORF9QQVJBTUVURVJTX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLldSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDE0OyAvLyBFY2xpcHNlTGluayBwcm9wZXJ0aWVzCi0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyA0OyAvLyA0IG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCS8vIEluaXRpYWxpemVzIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KE5BVElWRV9TUUxfS0VZLCBOQVRJVkVfU1FMX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KEJBVENIX1dSSVRJTkdfS0VZLCBCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChDQUNIRV9TVEFURU1FTlRTX0tFWSwgQ0FDSEVfU1RBVEVNRU5UU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChDQUNIRV9TVEFURU1FTlRTX1NJWkVfS0VZLCBDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoRFJJVkVSX0tFWSwgRFJJVkVSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KFVSTF9LRVksIFVSTF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChVU0VSX0tFWSwgVVNFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChQQVNTV09SRF9LRVksIFBBU1NXT1JEX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KEJJTkRfUEFSQU1FVEVSU19LRVksIEJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dCgibWlzYy5wcm9wZXJ0eS4yIiwgInZhbHVlLjIiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX0tFWSwgUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoUkVBRF9DT05ORUNUSU9OU19NSU5fS0VZLCBSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChSRUFEX0NPTk5FQ1RJT05TX01BWF9LRVksIFJFQURfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KFdSSVRFX0NPTk5FQ1RJT05TX01JTl9LRVksIFdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChXUklURV9DT05ORUNUSU9OU19NQVhfS0VZLCBXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoIm1pc2MucHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCQotCQkvLyBJbml0aWFsaXplcyBQVSBwcm9wZXJ0eSBUcmFuc2FjdGlvblR5cGUKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5zZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoVFJBTlNBQ1RJT05fVFlQRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5zZXRKdGFEYXRhU291cmNlKEpUQV9EQVRBX1NPVVJDRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5zZXROb25KdGFEYXRhU291cmNlKE5PTl9KVEFfREFUQV9TT1VSQ0VfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBMaXN0ZW5lcnMgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gbmV3Ci0JCUxpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgUHJvcGVydHk+IHByb3BlcnRpZXNBZGFwdGVyID0gCi0JCQkoTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQcm9wZXJ0eT4pICgoRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzKSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMpLnByb3BlcnRpZXNBZGFwdGVyKCk7Ci0JCUdlbmVyaWNQcm9wZXJ0eSBjdGRQcm9wZXJ0eSA9IChHZW5lcmljUHJvcGVydHkpIHRoaXMucGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoTkFUSVZFX1NRTF9LRVkpOwotCQlMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlciA9ICgoRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzKSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMpLnByb3BlcnR5TGlzdEFkYXB0ZXIoKTsKLQkJCi0JCWFzc2VydFRydWUocHJvcGVydGllc0FkYXB0ZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKGN0ZFByb3BlcnR5Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5LlZBTFVFX1BST1BFUlRZKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY29ubmVjdGlvbiwgQ29ubmVjdGlvbi5OQVRJVkVfU1FMX1BST1BFUlRZKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5jb25uZWN0aW9uLCBDb25uZWN0aW9uLkJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY29ubmVjdGlvbiwgQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5jb25uZWN0aW9uLCBDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5jb25uZWN0aW9uLCBDb25uZWN0aW9uLkJBVENIX1dSSVRJTkdfUFJPUEVSVFkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmNvbm5lY3Rpb24sIENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY29ubmVjdGlvbiwgQ29ubmVjdGlvbi5KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmNvbm5lY3Rpb24sIENvbm5lY3Rpb24uTk9OX0pUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHByb3BlcnR5TGlzdEFkYXB0ZXIpOwotCQkKLQkJRWNsaXBzZUxpbmtDb25uZWN0aW9uIGVsQ29ubmVjdGlvbiA9IChFY2xpcHNlTGlua0Nvbm5lY3Rpb24pIHRoaXMuY29ubmVjdGlvbjsKLQkJUGVyc2lzdGVuY2VVbml0UHJvcGVydHlMaXN0TGlzdGVuZXIgcHJvcGVydHlMaXN0TGlzdGVuZXIgPSBlbENvbm5lY3Rpb24ucHJvcGVydHlMaXN0TGlzdGVuZXIoKTsKLQkJcHJvcGVydHlMaXN0QWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHByb3BlcnR5TGlzdExpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0aWVzQWRhcHRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7IC8vIG90aGVyIHByb3BlcnRpZXMgYXJlIHN0aWxsIGxpc3RlbmluZwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmNvbm5lY3Rpb24sIENvbm5lY3Rpb24uTkFUSVZFX1NRTF9QUk9QRVJUWSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY29ubmVjdGlvbiwgQ29ubmVjdGlvbi5CSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmNvbm5lY3Rpb24sIENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY29ubmVjdGlvbiwgQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY29ubmVjdGlvbiwgQ29ubmVjdGlvbi5CQVRDSF9XUklUSU5HX1BST1BFUlRZKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5jb25uZWN0aW9uLCBDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmNvbm5lY3Rpb24sIENvbm5lY3Rpb24uSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5jb25uZWN0aW9uLCBDb25uZWN0aW9uLk5PTl9KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkpOwotCX0KLQotCS8vICoqKioqKioqKiogVHJhbnNhY3Rpb25UeXBlIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJhbnNhY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5U2V0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkoQ29ubmVjdGlvbi5UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZLAotCQkJVFJBTlNBQ1RJT05fVFlQRV9URVNUX1ZBTFVFLAotCQkJVFJBTlNBQ1RJT05fVFlQRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogSnRhRGF0YVNvdXJjZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEp0YURhdGFTb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlTZXRQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eShDb25uZWN0aW9uLkpUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSwKLQkJCUpUQV9EQVRBX1NPVVJDRV9URVNUX1ZBTFVFLAotCQkJSlRBX0RBVEFfU09VUkNFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBOb25KdGFEYXRhU291cmNlIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Tm9uSnRhRGF0YVNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVNldFBlcnNpc3RlbmNlVW5pdFByb3BlcnR5KENvbm5lY3Rpb24uTk9OX0pUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSwKLQkJCU5PTl9KVEFfREFUQV9TT1VSQ0VfVEVTVF9WQUxVRSwKLQkJCU5PTl9KVEFfREFUQV9TT1VSQ0VfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIE5hdGl2ZVNxbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldE5hdGl2ZVNxbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlOQVRJVkVfU1FMX0tFWSwKLQkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlOQVRJVkVfU1FMX0tFWSwKLQkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRSwKLQkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTmF0aXZlU3FsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlOQVRJVkVfU1FMX0tFWSwKLQkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRSwKLQkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEJhdGNoV3JpdGluZyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEJhdGNoV3JpdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlCQVRDSF9XUklUSU5HX0tFWSwKLQkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlCQVRDSF9XUklUSU5HX0tFWSwKLQkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRSwKLQkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQmF0Y2hXcml0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlCQVRDSF9XUklUSU5HX0tFWSwKLQkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRSwKLQkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENhY2hlU3RhdGVtZW50cyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldENhY2hlU3RhdGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9TVEFURU1FTlRTX0tFWSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlDQUNIRV9TVEFURU1FTlRTX0tFWSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ2FjaGVTdGF0ZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlDQUNIRV9TVEFURU1FTlRTX0tFWSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBDYWNoZVN0YXRlbWVudHNTaXplIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfS0VZLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX0tFWSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlU3RhdGVtZW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9LRVksCi0JCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogRHJpdmVyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RHJpdmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCURSSVZFUl9LRVksCi0JCQlEUklWRVJfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlEUklWRVJfS0VZLAotCQkJRFJJVkVSX1RFU1RfVkFMVUUsCi0JCQlEUklWRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRHJpdmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlEUklWRVJfS0VZLAotCQkJRFJJVkVSX1RFU1RfVkFMVUUsCi0JCQlEUklWRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFVybCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFVybCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlVUkxfS0VZLAotCQkJVVJMX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVVJMX0tFWSwKLQkJCVVSTF9URVNUX1ZBTFVFLAotCQkJVVJMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVVybCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVVJMX0tFWSwKLQkJCVVSTF9URVNUX1ZBTFVFLAotCQkJVVJMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBVc2VyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VXNlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlVU0VSX0tFWSwKLQkJCVVTRVJfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlVU0VSX0tFWSwKLQkJCVVTRVJfVEVTVF9WQUxVRSwKLQkJCVVTRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVXNlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVVNFUl9LRVksCi0JCQlVU0VSX1RFU1RfVkFMVUUsCi0JCQlVU0VSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBQYXNzd29yZCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFBhc3N3b3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVBBU1NXT1JEX0tFWSwKLQkJCVBBU1NXT1JEX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUEFTU1dPUkRfS0VZLAotCQkJUEFTU1dPUkRfVEVTVF9WQUxVRSwKLQkJCVBBU1NXT1JEX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVBhc3N3b3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlQQVNTV09SRF9LRVksCi0JCQlQQVNTV09SRF9URVNUX1ZBTFVFLAotCQkJUEFTU1dPUkRfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEJpbmRQYXJhbWV0ZXJzIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0QmluZFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQklORF9QQVJBTUVURVJTX0tFWSwKLQkJCUJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUJJTkRfUEFSQU1FVEVSU19LRVksCi0JCQlCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRSwKLQkJCUJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVCaW5kUGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQklORF9QQVJBTUVURVJTX0tFWSwKLQkJCUJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFLAotCQkJQklORF9QQVJBTUVURVJTX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNTaGFyZWQgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFLAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUmVhZENvbm5lY3Rpb25zU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFLAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNNaW4gdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWFkQ29ubmVjdGlvbnNNaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUmVhZENvbm5lY3Rpb25zTWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNNYXggdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWFkQ29ubmVjdGlvbnNNYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUmVhZENvbm5lY3Rpb25zTWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBXcml0ZUNvbm5lY3Rpb25zTWluIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0V3JpdGVDb25uZWN0aW9uc01pbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fS0VZLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX0tFWSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdyaXRlQ29ubmVjdGlvbnNNaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9LRVksCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFdyaXRlQ29ubmVjdGlvbnNNYXggdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRXcml0ZUNvbm5lY3Rpb25zTWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9LRVksCi0JCQlXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXUklURV9DT05ORUNUSU9OU19NQVhfS0VZLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUsCi0JCQlXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV3JpdGVDb25uZWN0aW9uc01heCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX0tFWSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKChQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUpIG5ld1ZhbHVlKTsKLQkJIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkpKQotCQkJIHRoaXMuY29ubmVjdGlvbi5zZXRKdGFEYXRhU291cmNlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5OT05fSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZKSkKLQkJCSB0aGlzLmNvbm5lY3Rpb24uc2V0Tm9uSnRhRGF0YVNvdXJjZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5OQVRJVkVfU1FMX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXROYXRpdmVTcWwoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkJBVENIX1dSSVRJTkdfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldEJhdGNoV3JpdGluZygoQmF0Y2hXcml0aW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRDYWNoZVN0YXRlbWVudHMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkNBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uRFJJVkVSX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXREcml2ZXIoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVJMX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRVcmwoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0VXNlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5QQVNTV09SRF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0UGFzc3dvcmQoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQklORF9QQVJBTUVURVJTX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRCaW5kUGFyYW1ldGVycygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc01pbigoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc01heCgoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRXcml0ZUNvbm5lY3Rpb25zTWluKChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFdyaXRlQ29ubmVjdGlvbnNNYXgoKEludGVnZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRUcmFuc2FjdGlvblR5cGUoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkpUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldEp0YURhdGFTb3VyY2UoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLk5PTl9KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXROb25KdGFEYXRhU291cmNlKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5OQVRJVkVfU1FMX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0TmF0aXZlU3FsKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5CQVRDSF9XUklUSU5HX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0QmF0Y2hXcml0aW5nKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0Q2FjaGVTdGF0ZW1lbnRzKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRDYWNoZVN0YXRlbWVudHNTaXplKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXREcml2ZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFVybCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFVzZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlBBU1NXT1JEX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0UGFzc3dvcmQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldEJpbmRQYXJhbWV0ZXJzKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRSZWFkQ29ubmVjdGlvbnNNaW4oKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0UmVhZENvbm5lY3Rpb25zTWF4KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRXcml0ZUNvbm5lY3Rpb25zTWluKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRXcml0ZUNvbm5lY3Rpb25zTWF4KCk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gbW9kZWxWYWx1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpKSB7Ci0JCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZKSkgewotCQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0KCkuZ2V0SnRhRGF0YVNvdXJjZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5OT05fSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZKSkgewotCQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0KCkuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpOwotCQl9Ci0JCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlRSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpKQotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5zZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSkgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZKSkKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0KCkuc2V0SnRhRGF0YVNvdXJjZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5OT05fSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZKSkKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0KCkuc2V0Tm9uSnRhRGF0YVNvdXJjZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBtb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2Nvbm5lY3Rpb24vSnB0RWNsaXBzZUxpbmtDb3JlQ29ubmVjdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2Nvbm5lY3Rpb24vSnB0RWNsaXBzZUxpbmtDb3JlQ29ubmVjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZDg5YTEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb25uZWN0aW9uL0pwdEVjbGlwc2VMaW5rQ29yZUNvbm5lY3Rpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb25uZWN0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua0NvcmVDb25uZWN0aW9uVGVzdHMKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmtDb3JlQ29ubmVjdGlvblRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkKLS8vCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29ubmVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb25uZWN0aW9uQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZUNvbm5lY3Rpb25UZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiOGZhMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCisgKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCisgKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKKwlleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgeworCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7CisJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNX0lELCBFY2xpcHNlTGlua0pwYVBsYXRmb3JtUHJvdmlkZXIuSUQpOworCQlyZXR1cm4gZGF0YU1vZGVsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7CisJCXJldHVybiAoRWNsaXBzZUxpbmtKcGFQcm9qZWN0KSBzdXBlci5nZXRKcGFQcm9qZWN0KCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7CisJCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rRW50aXR5IGdldEphdmFFbnRpdHkoKSB7CisJCXJldHVybiAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rSnBhUHJvamVjdFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtKcGFQcm9qZWN0VGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWM3YjhiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rSnBhUHJvamVjdFRlc3RzLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwdENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pwYVByb2plY3RUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtKcGFQcm9qZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgeworCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7CisJCS8vIGRvbid0IGJ1aWxkIG9ybS54bWwKKwkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uRkFMU0UpOworCQlyZXR1cm4gZGF0YU1vZGVsOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7CisJCWFzc2VydE51bGwocmVzb3VyY2UpOworCQkKKwkJLy9hZGQgdGhlIG9ybS54bWwgZmlsZSB3aXRoIGVjbGlwc2VsaW5rIG9ybSBjb250ZW50IHR5cGUKKwkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmtDb250ZW50VHlwZSgpOworCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKKwkJYXNzZXJ0RXF1YWxzKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOworCQkKKwkJCisJCS8vZGVsZXRlIHRoZSBvcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKQorCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7CisJCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7CisJCWFzc2VydE51bGwocmVzb3VyY2UpOworCQkKKwkJCisJCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgdGhpcyB0aW1lIHdpdGggb3JtIGNvbnRlbnQgdHlwZQorCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZSgpOworCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKKwkJYXNzZXJ0RXF1YWxzKEpwdENvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7CisJCQorCQkvL2FkZCB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlCisJCWNyZWF0ZURlZmF1bHRFY2xpcHNlTGlua09ybVhtbEZpbGUoKTsKKwkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKKwkJYXNzZXJ0RXF1YWxzKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOworCQkKKwkJCisJCS8vZGVsZXRlIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKQorCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7CisJCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0T3JtWG1sRmlsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJRGF0YU1vZGVsIGNvbmZpZyA9CisJCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CisJCWNvbmZpZy5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXROYW1lKCkpOworCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0T3JtWG1sRmlsZVdpdGhFY2xpcHNlTGlua0NvbnRlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZUVjbGlwc2VMaW5rT3JtWG1sRmlsZShKcHRDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9GSUxFX1BBVEgpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sRmlsZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVFY2xpcHNlTGlua09ybVhtbEZpbGUoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9GSUxFX1BBVEgpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlRWNsaXBzZUxpbmtPcm1YbWxGaWxlKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlEYXRhTW9kZWwgY29uZmlnID0KKwkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOworCQljb25maWcuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIGdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKKwkJY29uZmlnLnNldFByb3BlcnR5KE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9QQVRILCBmaWxlUGF0aCk7CisJCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfRklMRV9QQVRIKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7CisJCQorCQkvL2FkZCB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlCisJCWNyZWF0ZURlZmF1bHRFY2xpcHNlTGlua09ybVhtbEZpbGUoKTsKKwkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfRklMRV9QQVRIKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7CisJCWFzc2VydEVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKKwkJCisJCS8vZGVsZXRlIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXRNYXBwaW5nRmlsZVJlc291cmNlKCkKKwkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOworCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9GSUxFX1BBVEgpOworCQlhc3NlcnROdWxsKHJlc291cmNlKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldERpZmZlcmVudGx5TmFtZWRNYXBwaW5nRmlsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZSgiTUVUQS1JTkYvb3JtMi54bWwiKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7CisKKwkJLy9jcmVhdGUgdGhlIG9ybTIueG1sIGZpbGUKKwkJY3JlYXRlRWNsaXBzZUxpbmtPcm1YbWxGaWxlKCJNRVRBLUlORi9vcm0yLnhtbCIpOworCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoIk1FVEEtSU5GL29ybTIueG1sIik7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOworCQlhc3NlcnRFcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtMi54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOworCQkKKwkJLy9kZWxldGUgdGhlIG9ybTIueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXRNYXBwaW5nRmlsZVJlc291cmNlKCkKKwkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOworCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoIk1FVEEtSU5GL29ybTIueG1sIik7CisJCWFzc2VydE51bGwocmVzb3VyY2UpOworCQkKKwkJLy9hZGQgdGhlIG9ybTIueG1sIGZpbGUgYmFjaworCQljcmVhdGVFY2xpcHNlTGlua09ybVhtbEZpbGUoIk1FVEEtSU5GL29ybTIueG1sIik7CisJCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZSgiTUVUQS1JTkYvb3JtMi54bWwiKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7CisJCWFzc2VydEVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0yLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnB0RWNsaXBzZUxpbmtDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTNlOWVjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhLkpwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybS5KcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkpwdEVjbGlwc2VMaW5rQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHM7CisKK3B1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua0NvcmVDb250ZXh0TW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCit7CisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0pwYVByb2plY3RUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmtDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVKYXZhQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7CisJCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmtDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7CisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzKCkgeworCQlzdXBlcigpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFCYXNpY01hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTU1YjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nVGVzdHMuamF2YQpAQCAtMCwwICsxLDMxNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQorewkKKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQyk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisKKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJUKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiY2xhc3MtaW5zdGFuY2VcIikiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEVjbGlwc2VMaW5rLk1VVEFCTEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBNdXRhYmxlIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpY0RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuTVVUQUJMRSwgImphdmEudXRpbC5EYXRlIik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNdXRhYmxlIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIERhdGUgbXlEYXRlOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICAiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHVibGljIEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCisJcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuQ0xBU1NfSU5TVEFOQ0VfQ09OVkVSVEVSLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCQorCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwgPSAoVGVtcG9yYWxBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUUsIHRlbXBvcmFsLmdldFZhbHVlKCkpOworCQkKKwkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihudWxsKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisKKwkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQkKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJY29udmVydC5zZXRWYWx1ZSgiZm9vIik7CisJCQorCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlck5hbWUoKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJYXNzZXJ0U2FtZShiYXNpY01hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlQmFzaWMoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisKKwkJbXV0YWJsZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKworCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQkKKwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlQmFzaWMoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJCisJCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCisJCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShudWxsKTsKKwkJbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbik7CisJCQorCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CQorCQltdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQkKKwkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQorCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBiYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpOworCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJCisJCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsJCisJCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQkKKwkJLy9zZXQgbXV0YWJsZSBkZWZhdWx0IHRvIGZhbHNlIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHByb3BlcnRpZXMsIHZlcmlmeSBkZWZhdWx0IGluIGphdmEgc3RpbGwgdHJ1ZSBzaW5jZSB0aGlzIGlzIG5vdCBhIERhdGUvQ2FsZW5kYXIKKwkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRNdXRhYmxlRm9yRGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpY0RhdGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCk7CisJCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCQorCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCisJCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJCisJCS8vc2V0IG11dGFibGUgZGVmYXVsdCB0byBmYWxzZSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBwcm9wZXJ0aWVzLCB2ZXJpZnkgZGVmYXVsdCBpbiBqYXZhIHN0aWxsIHRydWUgc2luY2UgdGhpcyBpcyBub3QgYSBEYXRlL0NhbGVuZGFyCisJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCQorCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCQorCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKG51bGwpOworCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJc011dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlQmFzaWMoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCk7CisJCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzTXV0YWJsZSgpKTsKKwkJCisJCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKKwkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzTXV0YWJsZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFDYWNoaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNhY2hpbmdUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDEwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFDYWNoaW5nVGVzdHMuamF2YQpAQCAtMCwwICsxLDYzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFDYWNoaW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCit7CQorCXB1YmxpYyBFY2xpcHNlTGlua0phdmFDYWNoaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoaW5nLmlzU2hhcmVkKCkpOworCQkKKwkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7CisJCQorCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNTaGFyZWQoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZUFubm90YXRpb24uZ2V0U2hhcmVkKCkpOwkJCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTaGFyZWRGYWxzZVVuc2V0c090aGVyQ2FjaGVTZXR0aW5ncygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKKwkJCisJCWNhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUspOworCQljYWNoaW5nLnNldFNwZWNpZmllZFNpemUoSW50ZWdlci52YWx1ZU9mKDUwMCkpOworCQljYWNoaW5nLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5GQUxTRSk7CisJCWNhY2hpbmcuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uRkFMU0UpOworCQljYWNoaW5nLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uRkFMU0UpOworCQljYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOworCQljYWNoaW5nLnNldEV4aXN0ZW5jZUNoZWNraW5nKHRydWUpOworCQljYWNoaW5nLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFKTsKKwkJY2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDgwMDApKTsKKwkJCisJCWNhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0RXhwaXJ5KCkpOworCQkKKwkJCisJCS8vZXhpc3RlbmNlIGNoZWNraW5nIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgaXNuJ3QgdW5zZXQgd2hlbiBzaGFyZWQgaXMgc2V0IHRvIGZhbHNlCisJCWFzc2VydFRydWUoY2FjaGluZy5oYXNFeGlzdGVuY2VDaGVja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRSwgY2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOworCQkKKwkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7CisJCUVjbGlwc2VMaW5rRXhwaXJ5VGltZU9mRGF5IHRpbWVPZkRheUV4cGlyeSA9IGNhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7CisJCXRpbWVPZkRheUV4cGlyeS5zZXRIb3VyKEludGVnZXIudmFsdWVPZig1KSk7CisJCQorCQljYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKKwkJCisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlQW5ub3RhdGlvbi5nZXRTaGFyZWQoKSk7CisJCWFzc2VydE51bGwoY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoaW5nLmlzU2hhcmVkKCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJY2FjaGVBbm5vdGF0aW9uLnNldFNoYXJlZChCb29sZWFuLkZBTFNFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZUFubm90YXRpb24uZ2V0U2hhcmVkKCkpOwkJCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNTaGFyZWQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgY2FjaGluZy5nZXRUeXBlKCkpOworCQkKKwkJY2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSyk7CisJCQorCQkKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFR5cGUoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5IQVJEX1dFQUssIGNhY2hlQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwkJCisKKwkKKwkJLy9zZXQgc3BlY2lmaWVkIHR5cGUgdG8gdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQsIHZlcmlmeSBpdCBpcyBub3Qgc2V0IHRvIGRlZmF1bHQKKwkJY2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSyk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGNhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLlNPRlRfV0VBSywgY2FjaGVBbm5vdGF0aW9uLmdldFR5cGUoKSk7CQkKKwkJCisJCWNhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKKwkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGNhY2hpbmcuZ2V0VHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBjYWNoaW5nLmdldFR5cGUoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQljYWNoZUFubm90YXRpb24uc2V0VHlwZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5IQVJEX1dFQUspOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLkhBUkRfV0VBSywgY2FjaGVBbm5vdGF0aW9uLmdldFR5cGUoKSk7CQkJCQorCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0VHlwZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCQorCQljYWNoaW5nLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5GQUxTRSk7CisJCQorCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlQW5ub3RhdGlvbi5nZXRBbHdheXNSZWZyZXNoKCkpOwkJCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOworCQkKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCWNhY2hlQW5ub3RhdGlvbi5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZUFubm90YXRpb24uZ2V0QWx3YXlzUmVmcmVzaCgpKTsJCQkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNBbHdheXNSZWZyZXNoKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOworCQkKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQkKKwkJY2FjaGluZy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKKwkJCisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlQW5ub3RhdGlvbi5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CQkKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCWNhY2hlQW5ub3RhdGlvbi5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlQW5ub3RhdGlvbi5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CQkJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZERpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOworCQkKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCQorCQljYWNoaW5nLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7CisJCQorCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNEaXNhYmxlSGl0cygpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVBbm5vdGF0aW9uLmdldERpc2FibGVIaXRzKCkpOwkJCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJY2FjaGVBbm5vdGF0aW9uLnNldERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZUFubm90YXRpb24uZ2V0RGlzYWJsZUhpdHMoKSk7CQkJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc0Rpc2FibGVIaXRzKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGNhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJCisJCWNhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyk7CisJCQorCQkKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIGNhY2hlQW5ub3RhdGlvbi5nZXRDb29yZGluYXRpb25UeXBlKCkpOwkJCisKKwkKKwkJLy9zZXQgc3BlY2lmaWVkIGNvb3JkaW5hdGlvbiB0eXBlIHRvIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0LCB2ZXJpZnkgaXQgaXMgbm90IHNldCB0byBkZWZhdWx0CisJCWNhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGNhY2hlQW5ub3RhdGlvbi5nZXRDb29yZGluYXRpb25UeXBlKCkpOwkJCisJCQorCQljYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUobnVsbCk7CisJCWFzc2VydE51bGwoY2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgY2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBjYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQljYWNoZUFubm90YXRpb24uc2V0Q29vcmRpbmF0aW9uVHlwZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIGNhY2hlQW5ub3RhdGlvbi5nZXRDb29yZGluYXRpb25UeXBlKCkpOwkJCQkKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0SGFzRXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaGFzRXhpc3RlbmNlQ2hlY2tpbmcoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCXR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORyk7CQorCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGluZy5oYXNFeGlzdGVuY2VDaGVja2luZygpKTsKKwkKKwkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmhhc0V4aXN0ZW5jZUNoZWNraW5nKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5oYXNFeGlzdGVuY2VDaGVja2luZygpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpKTsKKwkJCisJCWNhY2hpbmcuc2V0RXhpc3RlbmNlQ2hlY2tpbmcodHJ1ZSk7CisJCQorCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGluZy5oYXNFeGlzdGVuY2VDaGVja2luZygpKTsKKwkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgY2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKKworCQljYWNoaW5nLnNldEV4aXN0ZW5jZUNoZWNraW5nKHRydWUpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFLCBjYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIGNhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpOworCQlleGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsJCQkJCisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRFeGlzdGVuY2VUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIGNhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJCisJCWNhY2hpbmcuc2V0RXhpc3RlbmNlQ2hlY2tpbmcodHJ1ZSk7CisJCWNhY2hpbmcuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UpOworCQkKKwkJCisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRFeGlzdGVuY2VUeXBlKCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwkJCisKKwkKKwkJLy9zZXQgc3BlY2lmaWVkIGNvb3JkaW5hdGlvbiB0eXBlIHRvIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0LCB2ZXJpZnkgaXQgaXMgbm90IHNldCB0byBkZWZhdWx0CisJCWNhY2hpbmcuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBjYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIGV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsJCQorCQkKKwkJY2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKG51bGwpOworCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRSwgY2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnROdWxsKGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0RXhwaXJ5KCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0Q2FjaGluZygpLmdldEV4cGlyeSgpKTsKKwkJCisJCWNhY2hlQW5ub3RhdGlvbi5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDU3KSk7CisJCQorCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDU3KSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRFeHBpcnkoKSk7CisJCQorCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCWFzc2VydE51bGwoZW50aXR5LmdldENhY2hpbmcoKS5nZXRFeHBpcnkoKSk7CQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJY2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDU4KSk7CisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDU4KSwgY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeSgpKTsKKwkJCisJCQorCQljYWNoaW5nLnNldEV4cGlyeShudWxsKTsKKwkJY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCWFzc2VydE51bGwoY2FjaGVBbm5vdGF0aW9uKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldEV4cGlyeVVuc2V0c0V4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCWNhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7CisJCWNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuc2V0SG91cihJbnRlZ2VyLnZhbHVlT2YoNSkpOworCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7CisJCQorCQljYWNoaW5nLnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoOTAwKSk7CisJCQorCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOworCQlhc3NlcnROdWxsKGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOTAwKSwgY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeSgpKTsJCisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOTAwKSwgY2FjaGluZy5nZXRFeHBpcnkoKSk7CQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VGltZU9mRGF5RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOworCQkKKwkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisKKwkJY2FjaGVBbm5vdGF0aW9uLmFkZEV4cGlyeVRpbWVPZkRheSgpOworCQkKKwkJYXNzZXJ0Tm90TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFkZFRpbWVPZkRheUV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKKwkJCisJCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJRWNsaXBzZUxpbmtFeHBpcnlUaW1lT2ZEYXkgdGltZU9mRGF5RXhwaXJ5ID0gY2FjaGluZy5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJCisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQlhc3NlcnROb3ROdWxsKGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7CisJCWFzc2VydE5vdE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7CisJCWFzc2VydEVxdWFscyh0aW1lT2ZEYXlFeHBpcnksIGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGltZU9mRGF5RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOworCQkKKwkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCWNhY2hlQW5ub3RhdGlvbi5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKKworCQlhc3NlcnROb3ROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOworCQkKKwkJY2FjaGluZy5yZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkVGltZU9mRGF5RXhwaXJ5VW5zZXRzRXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQljYWNoaW5nLnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoODAwKSk7CisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgwMCksIGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnkoKSk7CQorCQkKKwkJCisJCWNhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7CisKKwkJCisJCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnkoKSk7CisJCWFzc2VydE51bGwoY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOworCX0KKworCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgY2FjaGluZy5nZXRTaXplKCkpOworCQkKKwkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaXplKG5ldyBJbnRlZ2VyKDUwKSk7CisJCQorCQkKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUwKSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNTAsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U2l6ZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUwKSwgY2FjaGVBbm5vdGF0aW9uLmdldFNpemUoKSk7CQkKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMTAwLCBjYWNoaW5nLmdldFNpemUoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQljYWNoZUFubm90YXRpb24uc2V0U2l6ZShuZXcgSW50ZWdlcig1MCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUwKSwgY2FjaGVBbm5vdGF0aW9uLmdldFNpemUoKSk7CQkJCQorCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZFNpemUoKSk7CisJCWFzc2VydEVxdWFscyg1MCwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTaXplKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ29udmVydFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFDb252ZXJ0VGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGQ1NWQyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ29udmVydFRlc3RzLmphdmEKQEAgLTAsMCArMSwyMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhQ29udmVydFRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImNsYXNzLWluc3RhbmNlXCIpIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRUeXBlQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJjbGFzcy1pbnN0YW5jZVwiKSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQFR5cGVDb252ZXJ0ZXIiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0phdmFDb252ZXJ0VGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5OT19DT05WRVJURVIsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXJOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0Lk5PX0NPTlZFUlRFUiwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldERlZmF1bHRDb252ZXJ0ZXJOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0TmFtZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuQ0xBU1NfSU5TVEFOQ0VfQ09OVkVSVEVSLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyTmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKKwkJCisJCWVjbGlwc2VMaW5rQ29udmVydC5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJmb28iKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQkKKwkJZWNsaXBzZUxpbmtDb252ZXJ0LnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUobnVsbCk7CisJCWNvbnZlcnRBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnROb3ROdWxsKGNvbnZlcnRBbm5vdGF0aW9uKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyTmFtZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKworCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCQorCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiBjb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQljb252ZXJ0LnNldFZhbHVlKCJmb28iKTsKKwkJCisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyTmFtZSgpKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOworCQlhc3NlcnRTYW1lKGJhc2ljTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOworCX0KKwkKKworCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kVHlwZUNvbnZlcnRlcigpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUiwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7CisJCQorCQllY2xpcHNlTGlua0NvbnZlcnQuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKTsJCisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUiwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQkKKwkJZWNsaXBzZUxpbmtDb252ZXJ0LnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVIsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKworCQllY2xpcHNlTGlua0NvbnZlcnQuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLk5PX0NPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscyhudWxsLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJCisJCWVjbGlwc2VMaW5rQ29udmVydC5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKworCQkKKwkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihudWxsKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCQorCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ29udmVydGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRlclRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3MGNkNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRlclRlc3RzLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUNvbnZlcnRlclRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZENvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQENvbnZlcnRlcihuYW1lPVwiZm9vXCIiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQENvbnZlcnRlcihjb252ZXJ0ZXJDbGFzcz1Gb28uY2xhc3MiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0phdmFDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKworCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZENvbnZlcnRlcigpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKKwkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZENvbnZlcnRlcigpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKKwkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7CisJCQorCQljb252ZXJ0ZXIuc2V0TmFtZSgiYmFyIik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7CisJCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOworCisJCQorCQljb252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOworCisKKwkJY29udmVydGVyLnNldE5hbWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldE5hbWVVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ29udmVydGVyKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWNvbnZlcnRlckFubm90YXRpb24uc2V0TmFtZSgiYmFyIik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKKwkJCisJCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydE5vdE51bGwoZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKKwkJCisJCWNvbnZlcnRlckFubm90YXRpb24uc2V0TmFtZSgiRk9PIik7CisJCWFzc2VydEVxdWFscygiRk9PIiwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpLmdldE5hbWUoKSk7CQorCX0KKwkKKworCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXJDbGFzcygpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKKwkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ29udmVydGVyQ2xhc3MoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJCisJCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisKKwkJCisJCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcyhudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisKKworCQljb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnRlckNsYXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyQ2xhc3NVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ29udmVydGVyQ2xhc3MoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKKwkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWNvbnZlcnRlckFubm90YXRpb24uc2V0Q29udmVydGVyQ2xhc3MoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOworCQkKKwkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0Tm90TnVsbChlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOworCQkKKwkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vQmFyIik7CisJCWFzc2VydEVxdWFscygiRm9vQmFyIiwgKChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJDbGFzcygpKTsJCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWUwNGYwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZVRlc3RzLmphdmEKQEAgLTAsMCArMSwyNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERBQkxFLCBFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEN1c3RvbWl6ZXIoRm9vLmNsYXNzIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGFibGVXaXRoQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERBQkxFLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAQ2hhbmdlVHJhY2tpbmciKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisKKwlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCisJcHVibGljIHZvaWQgdGVzdEdldEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW1iZWRkYWJsZVdpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSAoKEVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gKChFY2xpcHNlTGlua0VtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q3VzdG9taXplcigpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCQkKKwkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCQkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKworCQkKKwkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyQW5ub3RhdGlvbik7CisKKworCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9IGVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpOworCisJCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQljdXN0b21pemVyQW5ub3RhdGlvbi5zZXRWYWx1ZSgiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJCisJCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQljdXN0b21pemVyQW5ub3RhdGlvbi5zZXRWYWx1ZSgiRm9vQmFyIik7CisJCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVXaXRoQ2hhbmdlVHJhY2tpbmcoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua0VtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFY2xpcHNlTGlua0VtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjb250ZXh0Q2hhbmdlVHJhY2tpbmcgPSBlbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gQVRUUklCVVRFIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0CisJCQorCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gT0JKRUNUIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0CisJCQorCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gREVGRVJSRUQgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKKwkJCisJCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIHJlc291cmNlIHRvIEFVVE8gc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKKwkJCisJCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0CisJCQorCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG51bGwpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKKwkJCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlV2l0aENoYW5nZVRyYWNraW5nKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY29udGV4dENoYW5nZVRyYWNraW5nID0gZW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCByZXNvdXJjZSB2YWx1ZQorCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVVRPIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFUVFJJQlVURSBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIGNoYW5nZSBjb250ZXh0IHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUobnVsbCk7CisJCQorCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVVUTyBzcGVjaWZpY2FsbHkgKHRoaXMgdGltZSBmcm9tIG5vIGFubm90YXRpb24pLCB0ZXN0IHJlc291cmNlCisJCQorCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKKwkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVudGl0eVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbnRpdHlUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOWE4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbnRpdHlUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFFbnRpdHlUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBDdXN0b21pemVyKEZvby5jbGFzcyIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQorCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAQ2hhbmdlVHJhY2tpbmciKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBSZWFkT25seSIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyBFY2xpcHNlTGlua0phdmFFbnRpdHlUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CisJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CisJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX01BUF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5WQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCX0KKworCisJcHVibGljIHZvaWQgdGVzdEdldEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9ICgoRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q3VzdG9taXplcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gKChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCisJCQorCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uKTsKKworCisJCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplckFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXN0b21pemVyQ2xhc3NVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBlbnRpdHkuZ2V0Q3VzdG9taXplcigpOworCisJCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQljdXN0b21pemVyQW5ub3RhdGlvbi5zZXRWYWx1ZSgiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJCisJCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQljdXN0b21pemVyQW5ub3RhdGlvbi5zZXRWYWx1ZSgiRm9vQmFyIik7CisJCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhDaGFuZ2VUcmFja2luZygpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IGVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCBjb250ZXh0IHZhbHVlCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIHJlc291cmNlIHRvIEFUVFJJQlVURSBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAorCQkKKwkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAorCQkKKwkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIHJlc291cmNlIHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0CisJCQorCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVVRPIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0CisJCQorCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAorCQkKKwkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShudWxsKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyByZW1vdmUgYW5ub3RhdGlvbiwgdGV4dCBjb250ZXh0CisJCQorCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENoYW5nZVRyYWNraW5nKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY29udGV4dENoYW5nZVRyYWNraW5nID0gZW50aXR5LmdldENoYW5nZVRyYWNraW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCisJCQorCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVRUUklCVVRFIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT0JKRUNUIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIGNvbnRleHQgdG8gREVGRVJSRUQgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCisJCQorCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjaGFuZ2UgY29udGV4dCB0byBudWxsLCB0ZXN0IHJlc291cmNlCisJCQorCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKKwkJCisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVVRPIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOworCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUmVhZE9ubHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua0VudGl0eSBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7CisJCWFzc2VydEVxdWFscyh0cnVlLCByZWFkT25seS5pc1JlYWRPbmx5KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aFJlYWRPbmx5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtFbnRpdHkgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKwl9CisKKwkvL1RPRE8gdGVzdCBpbmhlcml0aW5nIGEgZGVmYXVsdCByZWFkb25seSBmcm9tIHlvdSBzdXBlcmNsYXNzCisJcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aFJlYWRPbmx5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtFbnRpdHkgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRPbmx5LmlzRGVmYXVsdFJlYWRPbmx5KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aFJlYWRPbmx5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtFbnRpdHkgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZE9ubHkuaXNSZWFkT25seSgpKTsKKwkJCisJCXJlYWRPbmx5LnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ly9Cb29sZWFuLkZBTFNFIGFuZCBudWxsIHJlYWxseSBtZWFuIHRoZSBzYW1lIHRoaW5nIHNpbmNlIHRoZXJlIGFyZSBvbmx5IDIgc3RhdGVzIGluIHRoZSBqYXZhIHJlc291cmNlIG1vZGVsCisKKwkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisKKwkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkobnVsbCk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsvL0Jvb2xlYW4uRkFMU0UgYW5kIG51bGwgcmVhbGx5IG1lYW4gdGhlIHNhbWUgdGhpbmcgc2luY2UgdGhlcmUgYXJlIG9ubHkgMiBzdGF0ZXMgaW4gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZFJlYWRPbmx5VXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUmVhZE9ubHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua0VudGl0eSBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCQkKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkT25seS5pc0RlZmF1bHRSZWFkT25seSgpKTsKKwkJCisJCXR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCX0KKworCit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFJZE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjNjMzg3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nVGVzdHMuamF2YQpAQCAtMCwwICsxLDMxNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewkJCisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBFY2xpcHNlTGluay5DT05WRVJUKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImNsYXNzLWluc3RhbmNlXCIpIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVJZCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBFY2xpcHNlTGluay5NVVRBQkxFKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJATXV0YWJsZSIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWREYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEVjbGlwc2VMaW5rLk1VVEFCTEUsICJqYXZhLnV0aWwuRGF0ZSIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBATXV0YWJsZSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBEYXRlIG15RGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgIik7CisJCQl9CisJCX0pOworCX0KKwkJCisJcHVibGljIEVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCisJcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuQ0xBU1NfSU5TVEFOQ0VfQ09OVkVSVEVSLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCQorCQlpZE1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwgPSAoVGVtcG9yYWxBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUUsIHRlbXBvcmFsLmdldFZhbHVlKCkpOworCQkKKwkJaWRNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihudWxsKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisKKwkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQkKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJY29udmVydC5zZXRWYWx1ZSgiZm9vIik7CisJCQorCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlck5hbWUoKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKKwkJYXNzZXJ0U2FtZShpZE1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWQoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua0lkTWFwcGluZyBpZE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGlkTWFwcGluZy5nZXRNdXRhYmxlKCk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisKKwkJbXV0YWJsZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKworCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQkKKwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWQoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua0lkTWFwcGluZyBpZE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGlkTWFwcGluZy5nZXRNdXRhYmxlKCk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJCisJCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCisJCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShudWxsKTsKKwkJbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbik7CisJCQorCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CQorCQltdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQkKKwkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQorCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUlkKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgaWRNYXBwaW5nID0gKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBpZE1hcHBpbmcuZ2V0TXV0YWJsZSgpOworCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJCisJCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsJCisJCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQkKKwkJLy9zZXQgbXV0YWJsZSBkZWZhdWx0IHRvIGZhbHNlIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHByb3BlcnRpZXMsIHZlcmlmeSBkZWZhdWx0IGluIGphdmEgc3RpbGwgdHJ1ZSBzaW5jZSB0aGlzIGlzIG5vdCBhIERhdGUvQ2FsZW5kYXIKKwkJKGdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdE11dGFibGVGb3JEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUlkRGF0ZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rSWRNYXBwaW5nIGlkTWFwcGluZyA9IChFY2xpcHNlTGlua0lkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gaWRNYXBwaW5nLmdldE11dGFibGUoKTsKKwkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJCisJCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKKwkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQkKKwkJLy9zZXQgbXV0YWJsZSBkZWZhdWx0IHRvIGZhbHNlIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHByb3BlcnRpZXMsIHZlcmlmeSBkZWZhdWx0IGluIGphdmEgc3RpbGwgdHJ1ZSBzaW5jZSB0aGlzIGlzIG5vdCBhIERhdGUvQ2FsZW5kYXIKKwkJKGdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQkKKwkJKGdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCQorCQkoZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUobnVsbCk7CisJCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdElzTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVJZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rSWRNYXBwaW5nIGlkTWFwcGluZyA9IChFY2xpcHNlTGlua0lkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gaWRNYXBwaW5nLmdldE11dGFibGUoKTsKKwkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzTXV0YWJsZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOworCQkKKwkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQorCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDdmYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE1hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEpvaW5GZXRjaCIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyBFY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9NYW55KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgY29udGV4dCB2YWx1ZQorCQkKKwkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCQkKKwkJLy8gY2hhbmdlIHJlc291cmNlIHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0CisJCQorCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUik7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCQkKKwkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9VVEVSLCB0ZXN0IGNvbnRleHQKKwkJCisJCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJCQorCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0CisJCQorCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOworCQkKKwkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCQkKKwkJLy8gcmVtb3ZlIGFubm90YXRpb24sIHRleHQgY29udGV4dAorCQkKKwkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9NYW55KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKKwkJCisJCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOworCQkKKwkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCQkKKwkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT1VURVIsIHRlc3QgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCB0byBudWxsLCB0ZXN0IHJlc291cmNlCisJCQorCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKG51bGwpOworCQkKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCQkKKwkJLy8gY2hhbmdlIGNvbnRleHQgdG8gSU5ORVIgc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOworCQlqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTk2NWY5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwkJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoTWFueVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJASm9pbkZldGNoIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHVibGljIEVjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9PbmUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtKb2luRmV0Y2ggY29udGV4dEpvaW5GZXRjaCA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCBjb250ZXh0IHZhbHVlCisJCQorCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gSU5ORVIgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKKwkJCisJCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gT1VURVIsIHRlc3QgY29udGV4dAorCQkKKwkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIHJlbW92ZSB2YWx1ZSBmcm9tIHJlc291cmNlLCB0ZXN0IGNvbnRleHQKKwkJCisJCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7CisJCQorCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJCQorCQkvLyByZW1vdmUgYW5ub3RhdGlvbiwgdGV4dCBjb250ZXh0CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE1hbnlUb09uZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCisJCQorCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKKwkJCisJCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9VVEVSLCB0ZXN0IHJlc291cmNlCisJCQorCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKKwkJCisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKKwkJam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwOWQxZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5SRUFEX09OTFkpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBSZWFkT25seSIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEN1c3RvbWl6ZXIoRm9vLmNsYXNzIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQENoYW5nZVRyYWNraW5nIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHVibGljIEVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKworCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZE9ubHkuaXNSZWFkT25seSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJfQorCisJLy9UT0RPIHRlc3QgaW5oZXJpdGluZyBhIGRlZmF1bHQgcmVhZG9ubHkgZnJvbSB5b3Ugc3VwZXJjbGFzcworCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkT25seS5pc0RlZmF1bHRSZWFkT25seSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRPbmx5LmlzUmVhZE9ubHkoKSk7CisJCQorCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOy8vQm9vbGVhbi5GQUxTRSBhbmQgbnVsbCByZWFsbHkgbWVhbiB0aGUgc2FtZSB0aGluZyBzaW5jZSB0aGVyZSBhcmUgb25seSAyIHN0YXRlcyBpbiB0aGUgamF2YSByZXNvdXJjZSBtb2RlbAorCisJCXJlYWRPbmx5LnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCisJCXJlYWRPbmx5LnNldFNwZWNpZmllZFJlYWRPbmx5KG51bGwpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ly9Cb29sZWFuLkZBTFNFIGFuZCBudWxsIHJlYWxseSBtZWFuIHRoZSBzYW1lIHRoaW5nIHNpbmNlIHRoZXJlIGFyZSBvbmx5IDIgc3RhdGVzIGluIHRoZSBqYXZhIHJlc291cmNlIG1vZGVsCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRSZWFkT25seVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKwkJCisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgcmVhZE9ubHkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCQorCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9ICgoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldEN1c3RvbWl6ZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSAoKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCisJCQorCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uKTsKKworCisJCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplckFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXN0b21pemVyQ2xhc3NVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJCYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCQkKKwkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJCisJCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJGb29CYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsJCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDaGFuZ2VUcmFja2luZygpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiByZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgY29udGV4dCB2YWx1ZQorCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVFRSSUJVVEUgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKKwkJCisJCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPQkpFQ1Qgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKKwkJCisJCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIGNoYW5nZSByZXNvdXJjZSB0byBERUZFUlJFRCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAorCQkKKwkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gQVVUTyBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAorCQkKKwkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIHJlbW92ZSB2YWx1ZSBmcm9tIHJlc291cmNlLCB0ZXN0IGNvbnRleHQKKwkJCisJCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUobnVsbCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gcmVtb3ZlIGFubm90YXRpb24sIHRleHQgY29udGV4dAorCQkKKwkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ2hhbmdlVHJhY2tpbmcoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjb250ZXh0Q2hhbmdlVHJhY2tpbmcgPSBtYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCisJCQorCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVRUUklCVVRFIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT0JKRUNUIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIGNvbnRleHQgdG8gREVGRVJSRUQgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCisJCQorCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjaGFuZ2UgY29udGV4dCB0byBudWxsLCB0ZXN0IHJlc291cmNlCisJCQorCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKKwkJCisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVVRPIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOworCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPYmplY3RUeXBlQ29udmVydGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNjk1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPYmplY3RUeXBlQ29udmVydGVyVGVzdHMuamF2YQpAQCAtMCwwICsxLDYyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9iamVjdFR5cGVDb252ZXJ0ZXIobmFtZT1cImZvb1wiLCBkZWZhdWx0T2JqZWN0VmFsdWU9XCJiYXJcIikiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmREYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9iamVjdFR5cGVDb252ZXJ0ZXIoZGF0YVR5cGU9Rm9vLmNsYXNzKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPYmplY3RUeXBlQ29udmVydGVyKG9iamVjdFR5cGU9Rm9vLmNsYXNzKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXJDb252ZXJzaW9uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPYmplY3RUeXBlQ29udmVydGVyKG5hbWU9XCJmb29cIiwgZGVmYXVsdE9iamVjdFZhbHVlPVwiYmFyXCIsIGNvbnZlcnNpb25WYWx1ZXMgPSBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZT1cImZcIiwgb2JqZWN0VmFsdWU9XCJmZW1hbGVcIikpIik7CisJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyBFY2xpcHNlTGlua0phdmFPYmplY3RUeXBlQ29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQkKKwkJY29udmVydGVyLnNldE5hbWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKKworCQkKKwkJY29udmVydGVyLnNldE5hbWUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOworCisKKwkJY29udmVydGVyLnNldE5hbWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKKwkJCisJCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0Tm90TnVsbChlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOworCQkKKwkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJGT08iKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkuZ2V0TmFtZSgpKTsJCisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJCisJCWNvbnZlcnRlci5zZXREYXRhVHlwZSgiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGF0YVR5cGUoKSk7CisKKwkJCisJCWNvbnZlcnRlci5zZXREYXRhVHlwZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXREYXRhVHlwZSgpKTsKKworCisJCWNvbnZlcnRlci5zZXREYXRhVHlwZSgiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXREYXRhVHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldERhdGFUeXBlVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWNvbnZlcnRlckFubm90YXRpb24uc2V0RGF0YVR5cGUoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKKwkJCisJCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0Tm90TnVsbChlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOworCQkKKwkJY29udmVydGVyQW5ub3RhdGlvbi5zZXREYXRhVHlwZSgiRm9vQmFyIik7CisJCWFzc2VydEVxdWFscygiRm9vQmFyIiwgKChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSkuZ2V0RGF0YVR5cGUoKSk7CQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOworCQkKKwkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOworCQkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0T2JqZWN0VHlwZSgpKTsKKworCQkKKwkJY29udmVydGVyLnNldE9iamVjdFR5cGUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOworCisKKwkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOworCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0VHlwZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKCJCYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKKwkJCisJCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0Tm90TnVsbChlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOworCQkKKwkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKCJGb29CYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCAoKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKS5nZXRPYmplY3RUeXBlKCkpOwkKKwl9CisJCisJCisJcHVibGljIHZvaWQgdGVzdEFkZENvbnZlcnNpb25WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlID0gY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKTsKKwkJY29udmVyc2lvblZhbHVlLnNldERhdGFWYWx1ZSgiRiIpOworCQljb252ZXJzaW9uVmFsdWUuc2V0T2JqZWN0VmFsdWUoImZlbWFsZSIpOworCQkKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5jb252ZXJzaW9uVmFsdWVzKCk7CisJCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRiIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmZW1hbGUiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKKwkJCisJCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZTIgPSBjb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApOworCQljb252ZXJzaW9uVmFsdWUyLnNldERhdGFWYWx1ZSgiTSIpOworCQljb252ZXJzaW9uVmFsdWUyLnNldE9iamVjdFZhbHVlKCJtYWxlIik7CisJCQorCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmNvbnZlcnNpb25WYWx1ZXMoKTsKKwkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIk0iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygibWFsZSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOworCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRiIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmZW1hbGUiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKKwkJCisJCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZTMgPSBjb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDEpOworCQljb252ZXJzaW9uVmFsdWUzLnNldERhdGFWYWx1ZSgiTyIpOworCQljb252ZXJzaW9uVmFsdWUzLnNldE9iamVjdFZhbHVlKCJtYWxlIik7CisJCQorCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmNvbnZlcnNpb25WYWx1ZXMoKTsKKwkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIk0iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygibWFsZSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOworCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiTyIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJtYWxlIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7CisJCXJlc291cmNlQ29udmVyc2lvblZhbHVlID0gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImZlbWFsZSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOworCQkKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBjb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKGNvbnZlcnNpb25WYWx1ZTIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGNvbnZlcnNpb25WYWx1ZTMsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGNvbnZlcnNpb25WYWx1ZSwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkpOworCQkKKwkJY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJPIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb252ZXJzaW9uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApLnNldERhdGFWYWx1ZSgiRiIpOworCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDEpLnNldERhdGFWYWx1ZSgiTSIpOworCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDIpLnNldERhdGFWYWx1ZSgiTyIpOworCQkKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMpKTsKKwkJCisJCWNvbnZlcnRlci5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMCk7CisJCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzKSk7CisJCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOworCQlhc3NlcnRFcXVhbHMoIk0iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJPIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7CisKKwkJY29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKKwkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMpKTsKKwkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWFzc2VydEVxdWFscygiTyIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOworCQkKKwkJY29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKKwkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0TW92ZUNvbnZlcnNpb25WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKworCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApLnNldERhdGFWYWx1ZSgiRiIpOworCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDEpLnNldERhdGFWYWx1ZSgiTSIpOworCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDIpLnNldERhdGFWYWx1ZSgiTyIpOworCQkKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMpKTsKKwkJCisJCWNvbnZlcnRlci5tb3ZlQ29udmVyc2lvblZhbHVlKDIsMCk7CisJCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOworCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzKSk7CisJCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOworCQlhc3NlcnRFcXVhbHMoIk0iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJPIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiRiIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOworCQkKKwkJY29udmVydGVyLm1vdmVDb252ZXJzaW9uVmFsdWUoMCwxKTsKKwkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMpKTsKKwkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWFzc2VydEVxdWFscygiTyIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIk0iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb252ZXJzaW9uVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJY29udmVydGVyQW5ub3RhdGlvbi5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0RGF0YVZhbHVlKCJGIik7CisJCWNvbnZlcnRlckFubm90YXRpb24uYWRkQ29udmVyc2lvblZhbHVlKDEpLnNldERhdGFWYWx1ZSgiTSIpOworCQljb252ZXJ0ZXJBbm5vdGF0aW9uLmFkZENvbnZlcnNpb25WYWx1ZSgyKS5zZXREYXRhVmFsdWUoIk8iKTsKKworCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOworCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJPIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7CisJCQorCQljb252ZXJ0ZXJBbm5vdGF0aW9uLm1vdmVDb252ZXJzaW9uVmFsdWUoMiwgMCk7CisJCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOworCQlhc3NlcnRFcXVhbHMoIk0iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7CisJCQorCQljb252ZXJ0ZXJBbm5vdGF0aW9uLm1vdmVDb252ZXJzaW9uVmFsdWUoMCwgMSk7CisJCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOworCQlhc3NlcnRFcXVhbHMoIk8iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7CisJCQorCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgxKTsKKwkJY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWFzc2VydEVxdWFscygiTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7CisJCQorCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgxKTsKKwkJY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWFzc2VydEVxdWFscygiTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOworCQkKKwkJY29udmVydGVyQW5ub3RhdGlvbi5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMCk7CisJCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOworCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJzaW9uVmFsdWVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCisKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQorCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOworCQkKKwkJY29udmVydGVyQW5ub3RhdGlvbi5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0RGF0YVZhbHVlKCJGIik7CisJCWNvbnZlcnRlckFubm90YXRpb24uYWRkQ29udmVyc2lvblZhbHVlKDEpLnNldERhdGFWYWx1ZSgiTSIpOworCQljb252ZXJ0ZXJBbm5vdGF0aW9uLmFkZENvbnZlcnNpb25WYWx1ZSgyKS5zZXREYXRhVmFsdWUoIk8iKTsKKwkJCisJCWFzc2VydEVxdWFscygzLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7CisJfQorCisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldERlZmF1bHRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJCQorCQljb252ZXJ0ZXIuc2V0RGVmYXVsdE9iamVjdFZhbHVlKCJiYXoiKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOworCQkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMoImJheiIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOworCisJCQorCQljb252ZXJ0ZXIuc2V0RGVmYXVsdE9iamVjdFZhbHVlKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisKKworCQljb252ZXJ0ZXIuc2V0RGVmYXVsdE9iamVjdFZhbHVlKCJiYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOworCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0T2JqZWN0VmFsdWVVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbi5zZXREZWZhdWx0T2JqZWN0VmFsdWUoImJheiIpOworCQlhc3NlcnRFcXVhbHMoImJheiIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7CisJCQorCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydE5vdE51bGwoZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKKwkJCisJCWNvbnZlcnRlckFubm90YXRpb24uc2V0RGVmYXVsdE9iamVjdFZhbHVlKCJGT08iKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZUNvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlckNvbnZlcnNpb25WYWx1ZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCisJCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygiZiIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCkubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmZW1hbGUiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODIwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpAQCAtMCwwICsxLDQ0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBFY2xpcHNlTGluay5QUklWQVRFX09XTkVEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQFByaXZhdGVPd25lZCIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hPbmVUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIik7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoInByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248IiArIFRZUEVfTkFNRSArICI+IG15VHlwZXM7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisKKwlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCisJcHVibGljIHZvaWQgdGVzdEdldFByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvTWFueSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25hYmxlID0gb25lVG9NYW55TWFwcGluZy5nZXRQcml2YXRlT3duZWQoKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRQcml2YXRlT3duZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcml2YXRlT3duZWRPbmVUb01hbnkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duYWJsZSA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UHJpdmF0ZU93bmVkKCk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKKwkJCisJCXByaXZhdGVPd25hYmxlLnNldFByaXZhdGVPd25lZChmYWxzZSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOworCisJCXByaXZhdGVPd25hYmxlLnNldFByaXZhdGVPd25lZCh0cnVlKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0UHJpdmF0ZU93bmVkVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpdmF0ZU93bmVkT25lVG9NYW55KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgcHJpdmF0ZU93bmFibGUgPSBvbmVUb01hbnlNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7CisJCQorCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhmYWxzZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE9uZVRvTWFueSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKKwkJCisJCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIGNoYW5nZSByZXNvdXJjZSB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAorCQkKKwkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPVVRFUiwgdGVzdCBjb250ZXh0CisJCQorCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUik7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCQkKKwkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAorCQkKKwkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKKwkJCisJCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldEpvaW5GZXRjaFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoT25lVG9NYW55KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKKwkJCisJCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOworCQkKKwkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCQkKKwkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT1VURVIsIHRlc3QgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCB0byBudWxsLCB0ZXN0IHJlc291cmNlCisJCQorCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKG51bGwpOworCQkKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCQkKKwkJLy8gY2hhbmdlIGNvbnRleHQgdG8gSU5ORVIgc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOworCQlqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJfQorCQorCQorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb01hbnlTZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOworCQkKKwkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7CisJCQorCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0RmV0Y2goKSk7CisKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCisJCQkJKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOworCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgYW5ub3RhdGlvbi5nZXRGZXRjaCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb01hbnlTZXRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCisJCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKKwkJCisJCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJGb28iKTsKKwkJCisJCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7CisKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCisJCQkJKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0VGFyZ2V0RW50aXR5KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueVNldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7CisJCQorCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIkZvbyIpOworCQkKKwkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7CisKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCisJCQkJKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0Q2FzY2FkZUFsbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOworCQkKKwkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOworCQkKKwkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzQWxsKCkpOworCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAorCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGFubm90YXRpb24uaXNDYXNjYWRlQWxsKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueVNldENhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOworCQkKKwkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7CisJCQorCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuaXNNZXJnZSgpKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKKwkJCQkoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CisJCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZU1lcmdlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueVNldENhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7CisJCQorCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOworCQkKKwkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzUGVyc2lzdCgpKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKKwkJCQkoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CisJCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZVBlcnNpc3QoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCisJCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKKwkJCisJCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7CisJCQorCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuaXNSZWZyZXNoKCkpOworCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAorCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGFubm90YXRpb24uaXNDYXNjYWRlUmVmcmVzaCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb01hbnlTZXRDYXNjYWRlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7CisJCQorCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7CisJCQorCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuaXNSZW1vdmUoKSk7CisKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCisJCQkJKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZW1vdmUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5NWM1YgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKQEAgLTAsMCArMSw0NDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKK3sJCisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhQcml2YXRlT3duZWRPbmVUb09uZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBQcml2YXRlT3duZWQiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoT25lVG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJASm9pbkZldGNoIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoInByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgbXlUeXBlOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHVibGljIEVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCisJcHVibGljIHZvaWQgdGVzdEdldFByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvT25lKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgcHJpdmF0ZU93bmFibGUgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UHJpdmF0ZU93bmVkKCk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0UHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpdmF0ZU93bmVkT25lVG9PbmUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duYWJsZSA9IG9uZVRvT25lTWFwcGluZy5nZXRQcml2YXRlT3duZWQoKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOworCQkKKwkJcHJpdmF0ZU93bmFibGUuc2V0UHJpdmF0ZU93bmVkKGZhbHNlKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7CisKKwkJcHJpdmF0ZU93bmFibGUuc2V0UHJpdmF0ZU93bmVkKHRydWUpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RQcml2YXRlT3duZWRVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcml2YXRlT3duZWRPbmVUb09uZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25hYmxlID0gb25lVG9PbmVNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7CisJCQorCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhmYWxzZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE9uZVRvT25lKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgY29udGV4dCB2YWx1ZQorCQkKKwkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCQkKKwkJLy8gY2hhbmdlIHJlc291cmNlIHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0CisJCQorCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUik7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCQkKKwkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9VVEVSLCB0ZXN0IGNvbnRleHQKKwkJCisJCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJCQorCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0CisJCQorCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOworCQkKKwkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCQkKKwkJLy8gcmVtb3ZlIGFubm90YXRpb24sIHRleHQgY29udGV4dAorCQkKKwkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hPbmVUb09uZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCisJCQorCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKKwkJCisJCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9VVEVSLCB0ZXN0IHJlc291cmNlCisJCQorCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKKwkJCisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKKwkJam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7CQorCQkKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKKwkJCisJCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7CisJCQorCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZy5nZXRGZXRjaCgpKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAorCQkJCShPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBhbm5vdGF0aW9uLmdldEZldGNoKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCisJCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOworCQkKKwkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiRm9vIik7CisJCQorCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7CisKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKKwkJCQkoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0VGFyZ2V0RW50aXR5KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7CisJCQorCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgiRm9vIik7CisJCQorCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKKwkJCQkoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCisJCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOworCQkKKwkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7CisJCQorCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAorCQkJCShPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CisJCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZUFsbCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb09uZVNldENhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKKwkJCisJCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7CisJCQorCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5pc01lcmdlKCkpOworCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCisJCQkJKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGFubm90YXRpb24uaXNDYXNjYWRlTWVyZ2UoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKKwkJCisJCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKKwkJCisJCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzUGVyc2lzdCgpKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAorCQkJCShPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CisJCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZVBlcnNpc3QoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRDYXNjYWRlUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKKwkJCisJCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKKwkJCisJCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzUmVmcmVzaCgpKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAorCQkJCShPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CisJCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZVJlZnJlc2goKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRDYXNjYWRlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCisJCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOworCQkKKwkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7CisJCQorCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAorCQkJCShPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7CisJCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZVJlbW92ZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFTdHJ1Y3RDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhU3RydWN0Q29udmVydGVyVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWE4MGZiCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhU3RydWN0Q29udmVydGVyVGVzdHMuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhU3RydWN0Q29udmVydGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBTdHJ1Y3RDb252ZXJ0ZXIobmFtZT1cImZvb1wiIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kU3RydWN0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAU3RydWN0Q29udmVydGVyKGNvbnZlcnRlcj1cIkZvb1wiIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhU3RydWN0Q29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQkKKwkJY29udmVydGVyLnNldE5hbWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKKworCQkKKwkJY29udmVydGVyLnNldE5hbWUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKKworCisJCWNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlcigpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKKworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQkKKwkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7CisJCQorCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnROb3ROdWxsKGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7CisJCQorCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoIkZPTyIpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKS5nZXROYW1lKCkpOwkKKwl9CisJCisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kU3RydWN0Q29udmVydGVyQ2xhc3MoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlckNsYXNzKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCQorCQljb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnRlcigpKTsKKworCQkKKwkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJ0ZXIoKSk7CisKKworCQljb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnRlcigpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRlckNsYXNzVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlckNsYXNzKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCisJCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldENvbnZlcnRlcigiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQkKKwkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7CisJCQorCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnROb3ROdWxsKGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7CisJCQorCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldENvbnZlcnRlcigiRm9vQmFyIik7CisJCWFzc2VydEVxdWFscygiRm9vQmFyIiwgKChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJDbGFzcygpKTsJCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVHlwZUNvbnZlcnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFUeXBlQ29udmVydGVyVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGNhN2RhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVHlwZUNvbnZlcnRlclRlc3RzLmphdmEKQEAgLTAsMCArMSwzMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhVHlwZUNvbnZlcnRlclRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRUeXBlQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBUeXBlQ29udmVydGVyKG5hbWU9XCJmb29cIiIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBUeXBlQ29udmVydGVyKGRhdGFUeXBlPUZvby5jbGFzcyIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQFR5cGVDb252ZXJ0ZXIob2JqZWN0VHlwZT1Gb28uY2xhc3MiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0phdmFUeXBlQ29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRUeXBlQ29udmVydGVyKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRUeXBlQ29udmVydGVyKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQkKKwkJY29udmVydGVyLnNldE5hbWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKKworCQkKKwkJY29udmVydGVyLnNldE5hbWUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOworCisKKwkJY29udmVydGVyLnNldE5hbWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRUeXBlQ29udmVydGVyKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKKwkJCisJCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0Tm90TnVsbChlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOworCQkKKwkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJGT08iKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkuZ2V0TmFtZSgpKTsJCisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJCisJCWNvbnZlcnRlci5zZXREYXRhVHlwZSgiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGF0YVR5cGUoKSk7CisKKwkJCisJCWNvbnZlcnRlci5zZXREYXRhVHlwZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXREYXRhVHlwZSgpKTsKKworCisJCWNvbnZlcnRlci5zZXREYXRhVHlwZSgiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXREYXRhVHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldERhdGFUeXBlVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWNvbnZlcnRlckFubm90YXRpb24uc2V0RGF0YVR5cGUoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKKwkJCisJCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0Tm90TnVsbChlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOworCQkKKwkJY29udmVydGVyQW5ub3RhdGlvbi5zZXREYXRhVHlwZSgiRm9vQmFyIik7CisJCWFzc2VydEVxdWFscygiRm9vQmFyIiwgKChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSkuZ2V0RGF0YVR5cGUoKSk7CQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOworCQkKKwkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOworCQkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0T2JqZWN0VHlwZSgpKTsKKworCQkKKwkJY29udmVydGVyLnNldE9iamVjdFR5cGUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOworCisKKwkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOworCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0VHlwZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7CisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKCJCYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKKwkJCisJCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0Tm90TnVsbChlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOworCQkKKwkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKCJGb29CYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCAoKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKS5nZXRPYmplY3RUeXBlKCkpOwkKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllOTZkZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YQpAQCAtMCwwICsxLDMxNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVkVSU0lPTik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAVmVyc2lvbiIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKworCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OLCBFY2xpcHNlTGluay5DT05WRVJUKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiY2xhc3MtaW5zdGFuY2VcIikiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZVZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OLCBFY2xpcHNlTGluay5NVVRBQkxFKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBNdXRhYmxlIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVWZXJzaW9uRGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlZFUlNJT04sIEVjbGlwc2VMaW5rLk1VVEFCTEUsICJqYXZhLnV0aWwuRGF0ZSIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQFZlcnNpb24iKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNdXRhYmxlIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIERhdGUgbXlEYXRlOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICAiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0MigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnQoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSLCB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkNMQVNTX0lOU1RBTkNFX0NPTlZFUlRFUiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQkKKwkJdmVyc2lvbk1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKENvbnZlcnRlci5URU1QT1JBTF9DT05WRVJURVIpOworCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7CisJCQorCQl2ZXJzaW9uTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIobnVsbCk7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0VXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisKKwkJYXNzZXJ0RXF1YWxzKENvbnZlcnRlci5OT19DT05WRVJURVIsIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCQorCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiBjb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQljb252ZXJ0LnNldFZhbHVlKCJmb28iKTsKKwkJCisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlck5hbWUoKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CisJCWFzc2VydFNhbWUodmVyc2lvbk1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbigpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gdmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIG11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCisJCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisKKwkJbXV0YWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZVZlcnNpb24oKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IHZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQkKKwkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQorCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisKKwkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKG51bGwpOworCQltdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uKTsKKwkJCisJCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsJCisJCW11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCQorCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCisJCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbigpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gdmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpOworCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJCisJCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsJCisJCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQkKKwkJLy9zZXQgbXV0YWJsZSBkZWZhdWx0IHRvIGZhbHNlIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHByb3BlcnRpZXMsIHZlcmlmeSBkZWZhdWx0IGluIGphdmEgc3RpbGwgdHJ1ZSBzaW5jZSB0aGlzIGlzIG5vdCBhIERhdGUvQ2FsZW5kYXIKKwkJKGdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdE11dGFibGVGb3JEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZVZlcnNpb25EYXRlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSB2ZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCk7CisJCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCQorCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCisJCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJCisJCS8vc2V0IG11dGFibGUgZGVmYXVsdCB0byBmYWxzZSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBwcm9wZXJ0aWVzLCB2ZXJpZnkgZGVmYXVsdCBpbiBqYXZhIHN0aWxsIHRydWUgc2luY2UgdGhpcyBpcyBub3QgYSBEYXRlL0NhbGVuZGFyCisJCShnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLlRSVUUpOworCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJCisJCShnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQkKKwkJKGdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKG51bGwpOworCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJc011dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbigpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gdmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpOworCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7CisJCQorCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCisJCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KcHRFY2xpcHNlTGlua0NvcmVKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjJjNmZlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCit7CisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwkKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUNhY2hpbmdUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFDb252ZXJ0VGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhQ29udmVydGVyVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZVRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUVudGl0eVRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ1Rlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFPYmplY3RUeXBlQ29udmVydGVyVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsJCQorCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5jbGFzcyk7CQkKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7CQkKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YVN0cnVjdENvbnZlcnRlclRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YVR5cGVDb252ZXJ0ZXJUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmNsYXNzKTsKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzKCkgeworCQlzdXBlcigpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTRlOWYwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVzdHMuamF2YQpAQCAtMCwwICsxLDY3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGNvbnRleHRFbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBjb250ZXh0RW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVySG9sZGVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKKwkJCisJCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOworCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VDb252ZXJ0ZXIpOworCQlyZXNvdXJjZUNvbnZlcnRlci5zZXRDbGFzc05hbWUoIkZvbyIpOworCQlyZXNvdXJjZUNvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQorCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOworCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VDb252ZXJ0ZXIyKTsKKwkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldENsYXNzTmFtZSgiRm9vMiIpOworCQlyZXNvdXJjZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKKwkJCisJCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQorCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQorCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlQ29udmVydGVyMik7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGNvbnRleHRFbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBjb250ZXh0RW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVySG9sZGVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKKwkJCisJCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7CisJCWNvbnRleHRDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOworCQljb250ZXh0Q29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQorCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7CisJCWNvbnRleHRDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7CisJCWNvbnRleHRDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQorCQkKKwkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVDdXN0b21Db252ZXJ0ZXIoMCwgMSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZUN1c3RvbUNvbnZlcnRlcigwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKGNvbnRleHRDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOworCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBjb250ZXh0RW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOworCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gY29udGV4dEVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckhvbGRlcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQorCQkKKwkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7CisJCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VUeXBlQ29udmVydGVyKTsKKwkJcmVzb3VyY2VUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKKwkJcmVzb3VyY2VUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKKwkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOworCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOworCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7CisJCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQorCQkKKwkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VUeXBlQ29udmVydGVyMik7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQorCX0KKworCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQlYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZUVudGl0eU1hcHBpbmdzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKKwkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgY29udGV4dEVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IGNvbnRleHRFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKKwkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOworCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOworCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKKwkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlcjIiKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVR5cGVDb252ZXJ0ZXIoMCwgMSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVUeXBlQ29udmVydGVyKDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVUeXBlQ29udmVydGVyKGNvbnRleHRUeXBlQ29udmVydGVyMik7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQlYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZUVudGl0eU1hcHBpbmdzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKKwkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgY29udGV4dEVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IGNvbnRleHRFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIpOworCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOworCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKKwkJCisJCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKKwkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOworCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGNvbnRleHRFbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBjb250ZXh0RW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVySG9sZGVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7CisJCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKKwkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKKwkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7CisJCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVPYmplY3RUeXBlQ29udmVydGVyKDAsIDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQlYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZUVudGl0eU1hcHBpbmdzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKKwkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgY29udGV4dEVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IGNvbnRleHRFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlU3RydWN0Q29udmVydGVyKTsKKwkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyKCJGb28iKTsKKwkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQorCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOworCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKKwkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlcigiRm9vMiIpOworCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQorCQkKKwkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZSgwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQorCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlU3RydWN0Q29udmVydGVyMik7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQorCX0KKworCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOworCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBjb250ZXh0RW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOworCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gY29udGV4dEVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckhvbGRlcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKKwkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7CisJCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7CisJCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7CisJCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlU3RydWN0Q29udmVydGVyKDAsIDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQmFzaWNNYXBwaW5nVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjNjNTE2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKQEAgLTAsMCArMSwzODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUJhc2ljTWFwcGluZ1Rlc3RzCisJZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpY0RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuTVVUQUJMRSwgImphdmEudXRpbC5EYXRlIik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNdXRhYmxlIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIERhdGUgbXlEYXRlOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICAiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXB1YmxpYyBFY2xpcHNlTGlua09ybUJhc2ljTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAorCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9CisJCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7CisJCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGNvbnRleHRCYXNpYyA9IAorCQkJKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCisJCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbEJhc2ljIHJlc291cmNlQmFzaWMgPSAKKwkJCShYbWxCYXNpYykgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKKwkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gZmFsc2UsIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlQmFzaWMuc2V0TXV0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgbXV0YWJsZSB0byB0cnVlLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZUJhc2ljLnNldE11dGFibGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIGNsZWFyIHhtbCBtdXRhYmxlLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZUJhc2ljLnNldE11dGFibGUobnVsbCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gVE9ETyAtIHRlc3QgZGVmYXVsdHMgZm9yIGphdmEgc2VyaWFsaXphYmxlIGFuZCBkYXRlL3RpbWUgdHlwZXMsIAorCQkvLyB3aXRoIGFuZCB3aXRob3V0IHBlcnNpc3RlbmNlIHByb3BlcnR5CisJCQorCQkvLyBzZXQgbXV0YWJsZSBvbiBqYXZhIGJhc2ljIG1hcHBpbmcKKwkJCisJCWphdmFCYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGphdmFCYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIHJlbW92ZSBhdHRyaWJ1dGUgZnJvbSB4bWwsIHRlc3QgZGVmYXVsdCBtdXRhYmxlIGZyb20gamF2YQorCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQljb250ZXh0QmFzaWMgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJY29udGV4dEJhc2ljID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGphdmFCYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU11dGFibGVEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljRGF0ZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAorCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9CisJCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm15RGF0ZSIpOworCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBjb250ZXh0QmFzaWMgPSAKKwkJCShPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAorCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxCYXNpYyByZXNvdXJjZUJhc2ljID0gCisJCQkoWG1sQmFzaWMpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CisJCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteURhdGUiKS5nZXRNYXBwaW5nKCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZUJhc2ljLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIHRydWUsIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlQmFzaWMuc2V0TXV0YWJsZShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIGNsZWFyIHhtbCBtdXRhYmxlLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZUJhc2ljLnNldE11dGFibGUobnVsbCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkKKwkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLlRSVUUpOworCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShudWxsKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gc2V0IG11dGFibGUgb24gamF2YSBiYXNpYyBtYXBwaW5nCisJCQorCQlqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJY29udGV4dEJhc2ljID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkvLyBzZXQgbWV0YWRhdGEgY29tcGxldGUKKwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQljb250ZXh0QmFzaWMgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeU11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKKwkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQorCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOworCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBjb250ZXh0QmFzaWMgPSAKKwkJCShPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAorCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxCYXNpYyByZXNvdXJjZUJhc2ljID0gCisJCQkoWG1sQmFzaWMpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgbXV0YWJsZSB0byB0cnVlLCBjaGVjayByZXNvdXJjZQorCQkKKwkJY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgbXV0YWJsZSB0byBmYWxzZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBtdXRhYmxlIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCisJCQorCQljb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUobnVsbCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7CisJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOworCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7CisJCQkJCisJCS8vc2V0IGxvYiBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKKwkJYmFzaWNSZXNvdXJjZS5zZXRDb252ZXJ0KCJteUNvbnZlcnQiKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSLCBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7CisKKwkJLy9zZXQgbG9iIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCisJCWJhc2ljUmVzb3VyY2Uuc2V0Q29udmVydChudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7CisJCQorCQkKKwkJamF2YUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOworCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiZm9vIik7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKKwkJCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOworCQkKKwkJKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7CisKKwkJamF2YUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoQ29udmVydGVyLk5PX0NPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOworCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSAoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKKwkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7CisJCQkJCisJCS8vc2V0IGxvYiBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKKwkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscygiIiwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQorCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJiYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKKworCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOworCisJCS8vc2V0IGxvYiB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAorCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODg1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtKcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKKwlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZTsKKwkKKwkKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rSnBhUHJvamVjdCkgc3VwZXIuZ2V0SnBhUHJvamVjdCgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQl0aGlzLmVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkLCBJRGF0YU1vZGVsIGpwYUNvbmZpZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRlc3RKcGFQcm9qZWN0IHRlc3RKcGFQcm9qZWN0ID0gc3VwZXIuYnVpbGRKcGFQcm9qZWN0KHByb2plY3ROYW1lLCBhdXRvQnVpbGQsIGpwYUNvbmZpZyk7CisJCQorCQlFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbiBvcGVyYXRpb24gPSAKKwkJCW5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbihidWlsZEVjbGlwc2VMaW5rT3JtQ29uZmlnKHRlc3RKcGFQcm9qZWN0KSk7CisJCW9wZXJhdGlvbi5leGVjdXRlKG51bGwsIG51bGwpOworCQkKKwkJcmV0dXJuIHRlc3RKcGFQcm9qZWN0OworCX0KKwkKKwlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEVjbGlwc2VMaW5rT3JtQ29uZmlnKFRlc3RKcGFQcm9qZWN0IHRlc3RKcGFQcm9qZWN0KSB7CisJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gCisJCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsJCQorCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHRlc3RKcGFQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOworCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5WRVJTSU9OLCBFY2xpcHNlTGluay5TQ0hFTUFfVkVSU0lPTik7CisJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19QRVJTSVNURU5DRV9VTklULCBCb29sZWFuLlRSVUUpOworCQlyZXR1cm4gZGF0YU1vZGVsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UgPSBudWxsOworCQlzdXBlci50ZWFyRG93bigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZ2V0T3JtWG1sUmVzb3VyY2UoKSB7CisJCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2U7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBYbWxFbnRpdHlNYXBwaW5ncyBnZXRYbWxFbnRpdHlNYXBwaW5ncygpIHsKKwkJcmV0dXJuIChYbWxFbnRpdHlNYXBwaW5ncykgc3VwZXIuZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7CisJCXJldHVybiAoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgc3VwZXIuZ2V0RW50aXR5TWFwcGluZ3MoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQ29udmVydGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1Db252ZXJ0ZXJUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwODYzZWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQ29udmVydGVyVGVzdHMuamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1Db252ZXJ0ZXJUZXN0cworCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQoreworCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5DT05WRVJURVIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAQ29udmVydChuYW1lPVwiZm9vXCIpIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAQ29udmVydGVyIik7CisJCQl9CisJCX0pOworCX0KKworCQorCXB1YmxpYyBFY2xpcHNlTGlua09ybUNvbnZlcnRlclRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKKwkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKKwkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7CisJCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSKTsKKwkJT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJWG1sQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRDb252ZXJ0ZXIoKTsKKwkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7CisJCQkJCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRDbGFzc05hbWUoIm15Q29udmVydCIpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7CisKKwkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKKwkJY29udmVydGVyUmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOworCQkKKwkJLy9yZW1vdmUgdGhlIHNwZWNpZmllZCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlvcm1Db252ZXJ0ZXIgPSAoT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQkKKwkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7CisJCWphdmFDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQkKKwkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKKwkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9ICgoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7IAorCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKKwkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLkNVU1RPTV9DT05WRVJURVIpOworCQlPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQlYbWxDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldENvbnZlcnRlcigpOworCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOworCQkJCQorCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCisJCW9ybUNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKKwkKKwkJb3JtQ29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOworCQkKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOworCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCisJCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOworCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQ1VTVE9NX0NPTlZFUlRFUik7CisJCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7CisJCVhtbENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0Q29udmVydGVyKCk7CisJCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOworCQkJCQorCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKKwkJY29udmVydGVyUmVzb3VyY2Uuc2V0TmFtZSgibXlDb252ZXJ0Iik7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKworCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAorCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOworCQkKKwkJLy9yZW1vdmUgdGhlIHNwZWNpZmllZCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlvcm1Db252ZXJ0ZXIgPSAoT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQkKKwkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7CisJCWphdmFDb252ZXJ0ZXIuc2V0TmFtZSgiYmFyIik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXROYW1lKCkpOworCQkKKwkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CisJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKKwkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7CisJCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5DVVNUT01fQ09OVkVSVEVSKTsKKwkJT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJWG1sQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRDb252ZXJ0ZXIoKTsKKwkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJCQkKKwkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAorCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZSgiZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkKKwkJb3JtQ29udmVydGVyLnNldE5hbWUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUVtYmVkZGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUVtYmVkZGFibGVUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YmE3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtRW1iZWRkYWJsZVRlc3RzLmphdmEKQEAgLTAsMCArMSwxMDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1FbWJlZGRhYmxlVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHVibGljIEVjbGlwc2VMaW5rT3JtRW1iZWRkYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZUZvckN1c3RvbWl6ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERBQkxFLCBFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCQkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0JCisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yQ3VzdG9tQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yVHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERBQkxFKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZUZvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvckN1c3RvbWl6ZXIoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUgamF2YUNvbnRleHRFbWJlZGRhYmxlID0gKEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOworCisKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKSk7CisJCWFzc2VydE51bGwoamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCQkKKwkJLy8gc2V0IHhtbCBjdXN0b21pemVyLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZUVtYmVkZGFibGUuc2V0Q3VzdG9taXplcihFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEN1c3RvbWl6ZXIoKSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkpOworCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKworCQkKKwkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQorCQkKKwkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRDdXN0b21pemVyQ2xhc3NOYW1lKCJmb28iKTsKKwkJCisJCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkpOworCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJCisJCS8vIGNsZWFyIHhtbCBjdXN0b21pemVyIGNsYXNzLCBzZXQgamF2YSBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBkZWZhdWx0cworCQkKKwkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRDdXN0b21pemVyQ2xhc3NOYW1lKG51bGwpOworCQlqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiYmFyIik7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisKKwkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQorCisJCW9ybUNvbnRleHRFbWJlZGRhYmxlLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKworCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOworCQkKKwkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQorCQkKKwkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRDdXN0b21pemVyQ2xhc3NOYW1lKCJmb28iKTsKKwkJCisJCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKworCQkvL3NldCB4bWwgY3VzdG9taXplciBudWxsCisJCWphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOworCQlyZXNvdXJjZUVtYmVkZGFibGUuc2V0Q3VzdG9taXplcihudWxsKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpKTsKKwkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvckN1c3RvbWl6ZXIoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBvcm1Db250ZXh0RW1iZWRkYWJsZSA9IChPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJmb28iKTsKKwkJCisJCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJCQkKKwkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDaGFuZ2VUcmFja2luZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBqYXZhQ29udGV4dEVtYmVkZGFibGUgPSAoSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVRUUklCVVRFLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZUVtYmVkZGFibGUuc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKKwkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gc2V0IHhtbCB0eXBlIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAorCQkKKwkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gc2V0IHhtbCB0eXBlIHRvIERFRkVSUkVELCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgdHlwZSB0byBBVVRPLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2xlYXIgeG1sIGNoYW5nZSB0cmFja2luZywgc2V0IGphdmEgY2hhbmdlIHRyYWNraW5nLCBjaGVjayBkZWZhdWx0cworCQkKKwkJcmVzb3VyY2VFbWJlZGRhYmxlLnNldENoYW5nZVRyYWNraW5nKG51bGwpOworCQlqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKKworCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gdW5zZXQgbWV0YWRhdGFDb21wbGV0ZSwgc2V0IHhtbCBjaGFuZ2UgdHJhY2tpbmcgdG8gT0JKRUNULCBjaGVjayBjb250ZXh0CisJCQorCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOworCQlyZXNvdXJjZUVtYmVkZGFibGUuc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKKwkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiAgeworCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvckNoYW5nZVRyYWNraW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBBVFRSSUJVVEUsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBPQkpFQ1QsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBERUZFUlJFRCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkJCQorCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gQVVUTywgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDdXN0b21Db252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q29udmVydGVySG9sZGVyKCk7CisJCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOworCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmFkZChyZXNvdXJjZUNvbnZlcnRlcik7CisJCXJlc291cmNlQ29udmVydGVyLnNldENsYXNzTmFtZSgiRm9vIik7CisJCXJlc291cmNlQ29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7CisJCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlQ29udmVydGVyMik7CisJCXJlc291cmNlQ29udmVydGVyMi5zZXRDbGFzc05hbWUoIkZvbzIiKTsKKwkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZUNvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDdXN0b21Db252ZXJ0ZXJzKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQkKKwkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKKwkJY29udGV4dENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7CisJCWNvbnRleHRDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQorCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKKwkJY29udGV4dENvbnZlcnRlcjIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbzIiKTsKKwkJY29udGV4dENvbnZlcnRlcjIuc2V0TmFtZSgibXlDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkKKwkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVDdXN0b21Db252ZXJ0ZXIoMCwgMSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZUN1c3RvbUNvbnZlcnRlcihjb250ZXh0Q29udmVydGVyMik7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yVHlwZUNvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKKwkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlVHlwZUNvbnZlcnRlcik7CisJCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7CisJCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOworCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VUeXBlQ29udmVydGVyMik7CisJCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKKwkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JUeXBlQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBvcm1Db250ZXh0RW1iZWRkYWJsZSA9IChPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7CisJCWNvbnRleHRUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKKwkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKKwkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7CisJCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlVHlwZUNvbnZlcnRlcigwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVUeXBlQ29udmVydGVyKDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVUeXBlQ29udmVydGVyKGNvbnRleHRUeXBlQ29udmVydGVyMik7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcik7CisJCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7CisJCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7CisJCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKKwkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q29udmVydGVySG9sZGVyKCk7CisJCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKKwkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOworCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOworCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKKwkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVPYmplY3RUeXBlQ29udmVydGVyKDAsIDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvclN0cnVjdENvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7CisJCXJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlU3RydWN0Q29udmVydGVyKTsKKwkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyKCJGb28iKTsKKwkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKKwkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlcigiRm9vMiIpOworCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZSgwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlU3RydWN0Q29udmVydGVyMik7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvclN0cnVjdENvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKKwkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7CisJCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7CisJCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7CisJCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVN0cnVjdENvbnZlcnRlcigwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoY29udGV4dFN0cnVjdENvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1FbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUVudGl0eVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2Njc4ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1FbnRpdHlUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjM5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtRW50aXR5VGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCit7CisKKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmtPcm1FbnRpdHlUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yQ3VzdG9taXplcigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZvclN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JSZWFkT25seSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgamF2YUNvbnRleHRFbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCQkKKwkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIG92ZXJyaWRlCisJCQorCQlyZXNvdXJjZUVudGl0eS5zZXRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCQkKKwkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgb3ZlcnJpZGUKKwkJCisJCXJlc291cmNlRW50aXR5LnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKwkJCisJCS8vIGNsZWFyIHhtbCByZWFkIG9ubHksIHNldCBqYXZhIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBkZWZhdWx0cworCQkKKwkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkobnVsbCk7CisJCWphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydFRydWUoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisKKwkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQorCisJCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCisJCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKKwkJCisJCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQorCQkKKwkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydFRydWUoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCQorCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQorCQkKKwkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOworCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKwkJCQkKKwkJLy8gY2xlYXIgeG1sIHJlYWQgb25seSwgc2V0IGphdmEgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBkZWZhdWx0cworCQkKKwkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkobnVsbCk7CisJCWphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCQkKKwkJCisJCQorCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgb3ZlcnJpZGUKKwkJCisJCXJlc291cmNlRW50aXR5LnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCQorCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQorCQkKKwkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydFRydWUob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUZvclJlYWRPbmx5KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IHJlYWQgb25seSB0byB0cnVlLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShudWxsKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwkKKwl9CisJCisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5Rm9yQ3VzdG9taXplcigpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgamF2YUNvbnRleHRFbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKworCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKSk7CisJCWFzc2VydE51bGwoamF2YUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlRW50aXR5LnNldEN1c3RvbWl6ZXIoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDdXN0b21pemVyKCkpOworCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkpOworCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCisJCQorCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCisJCQorCQlyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkuc2V0Q3VzdG9taXplckNsYXNzTmFtZSgiZm9vIik7CisJCQorCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkpOworCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCQkKKwkJLy8gY2xlYXIgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIHNldCBqYXZhIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIGRlZmF1bHRzCisJCQorCQlyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkuc2V0Q3VzdG9taXplckNsYXNzTmFtZShudWxsKTsKKwkJamF2YUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiYmFyIik7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKKworCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzc05hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisKKwkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOworCQkKKwkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQorCQkKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLnNldEN1c3RvbWl6ZXJDbGFzc05hbWUoImZvbyIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKworCQkvL3NldCB4bWwgY3VzdG9taXplciBudWxsCisJCWphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7CisJCXJlc291cmNlRW50aXR5LnNldEN1c3RvbWl6ZXIobnVsbCk7CisJCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpKTsKKwkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JDdXN0b21pemVyKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiZm9vIik7CisJCQorCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJCQkKKwkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JDaGFuZ2VUcmFja2luZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgamF2YUNvbnRleHRFbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVRUUklCVVRFLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZUVudGl0eS5zZXRDaGFuZ2VUcmFja2luZyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENoYW5nZVRyYWNraW5nKCkpOworCQlyZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBzZXQgeG1sIHR5cGUgdG8gT0JKRUNULCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBzZXQgeG1sIHR5cGUgdG8gREVGRVJSRUQsIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gc2V0IHhtbCB0eXBlIHRvIEFVVE8sIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjbGVhciB4bWwgY2hhbmdlIHRyYWNraW5nLCBzZXQgamF2YSBjaGFuZ2UgdHJhY2tpbmcsIGNoZWNrIGRlZmF1bHRzCisJCQorCQlyZXNvdXJjZUVudGl0eS5zZXRDaGFuZ2VUcmFja2luZyhudWxsKTsKKwkJamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCisKKwkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIHVuc2V0IG1ldGFkYXRhQ29tcGxldGUsIHNldCB4bWwgY2hhbmdlIHRyYWNraW5nIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAorCQkKKwkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOworCQlyZXNvdXJjZUVudGl0eS5zZXRDaGFuZ2VUcmFja2luZyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENoYW5nZVRyYWNraW5nKCkpOworCQlyZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uICB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JDaGFuZ2VUcmFja2luZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIEFUVFJJQlVURSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBPQkpFQ1QsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkJCQorCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gREVGRVJSRUQsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBBVVRPLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUobnVsbCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7CisJCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisKKworCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSB0eXBlLCBjaGVjayBzZXR0aW5ncworCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldFR5cGUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5GVUxMKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKworCQkJCisJCS8vIHNldCBqYXZhIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCisJCQorCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCisJCS8vIGNsZWFyIHhtbCBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldFR5cGUobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCisJCQorCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlRW50aXR5LnNldENhY2hlKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKKworCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisKKwkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBjYWNoZSB0eXBlLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUspOworCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5IQVJEX1dFQUssIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFR5cGUobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVDb29yZGluYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOworCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOworCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCisKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgc2V0dGluZ3MKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOworCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisKKwkJCQorCQkvLyBzZXQgamF2YSBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cworCQkKKwkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKKworCQkvLyBjbGVhciB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOworCQorCQkKKwkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisJCisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCisKKwkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOworCisJCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOworCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBjYWNoZSBjb29yZGluYXRpb24gdHlwZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOworCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOworCQkJCQorCQkvLyBzZXQgY29udGV4dCBjb29yZGluYXRpb24gdHlwZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShudWxsKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisJfQorCisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKKwkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKworCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7CisJCQorCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMTAwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOworCisJCQorCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCisJCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0U2l6ZShuZXcgSW50ZWdlcigxMDUpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKKworCQkJCisJCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCisJCQorCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwNSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7CisKKwkJLy8gY2xlYXIgeG1sIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0U2l6ZShudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOworCQorCQkKKwkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7CisJCisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCisKKwkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKKworCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaXplKG5ldyBJbnRlZ2VyKDUwKSk7CisJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUwKSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKKwkJCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2l6ZShudWxsKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZUFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7CisJCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisKKworCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgc2V0dGluZ3MKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7CisKKwkJCQorCQkvLyBzZXQgamF2YSBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKKwkJCisJCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7CisKKwkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQorCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldEFsd2F5c1JlZnJlc2goQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKworCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7CisJCisJCQorCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlRW50aXR5LnNldENhY2hlKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKwkKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKKworCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOworCisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQorCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZUFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2gobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7CisJCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisKKworCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCQorCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncworCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKworCQkJCisJCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCisJCQorCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCisJCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisKKwkJLy8gY2xlYXIgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQorCQkKKwkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKKworCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCisJCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQkJCQorCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVEaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKKwkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKworCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOworCisJCQorCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCisJCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0RGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOworCisJCQkKKwkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKKwkJCisJCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7CisKKwkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQorCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKKworCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0RGlzYWJsZUhpdHMobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7CisJCisJCQorCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlRW50aXR5LnNldENhY2hlKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7CisJCisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCisKKwkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7CisKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCisJCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZURpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZERpc2FibGVIaXRzKG51bGwpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOworCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOworCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCisKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7CisKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKKworCQkJCisJCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCisJCQorCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKKworCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCisJCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0U2hhcmVkKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7CisKKwkJLy8gY2xlYXIgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldFNoYXJlZChudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7CisJCisJCQorCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlRW50aXR5LnNldENhY2hlKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOworCQorCQkKKwkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQorCisJCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOworCisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQorCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOworCX0KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2hhcmVkRmFsc2VVbnNldHNPdGhlckNhY2hlU2V0dGluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLKTsKKwkJb3JtQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkU2l6ZShJbnRlZ2VyLnZhbHVlT2YoNTAwKSk7CisJCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5GQUxTRSk7CisJCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLkZBTFNFKTsKKwkJb3JtQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5GQUxTRSk7CisJCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOworCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7CisJCW9ybUNvbnRleHRDYWNoaW5nLnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoODAwMCkpOworCQkKKwkJb3JtQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKKwkJCisJCQorCQkvL2V4aXN0ZW5jZSBjaGVja2luZyBpcyB0aGUgb25seSB0aGluZyB0aGF0IGlzbid0IHVuc2V0IHdoZW4gc2hhcmVkIGlzIHNldCB0byBmYWxzZQorCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOworCQkKKwkJb3JtQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOworCQlFY2xpcHNlTGlua0V4cGlyeVRpbWVPZkRheSB0aW1lT2ZEYXlFeHBpcnkgPSBvcm1Db250ZXh0Q2FjaGluZy5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJdGltZU9mRGF5RXhwaXJ5LnNldEhvdXIoSW50ZWdlci52YWx1ZU9mKDUpKTsKKwkJCisJCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7CQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOworCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKKwkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKworCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7CisJCQorCQkvLyBzZXQgeG1sIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgc2V0dGluZ3MKKwkJcmVzb3VyY2VFbnRpdHkuc2V0RXhpc3RlbmNlQ2hlY2tpbmcob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCByZXNvdXJjZUVudGl0eS5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKKworCQkJCisJCS8vIHNldCBqYXZhIGNhY2hlIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgZGVmYXVsdHMKKwkJCisJCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VFbnRpdHkuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7CisKKwkJLy8gY2xlYXIgeG1sIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VFbnRpdHkuc2V0RXhpc3RlbmNlQ2hlY2tpbmcobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwkKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKKworCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKKworCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOworCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCByZXNvdXJjZUVudGl0eS5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOworCQkJCQorCQkvLyBzZXQgY29udGV4dCBleGlzdGVuY2UgY2hlY2tpbmcgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlRXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOworCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOworCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCisKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7CisJCQorCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnkoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOworCisJCQorCQkvLyBzZXQgeG1sIGNhY2hlIGV4cGlyeSwgY2hlY2sgc2V0dGluZ3MKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRFeHBpcnkobmV3IEludGVnZXIoNDUpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDQ1KSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnkoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOworCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNDUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7CisKKwkJCQorCQkvLyBzZXQgamF2YSBjYWNoZSBleHBpcnksIGNoZWNrIGRlZmF1bHRzCisJCQorCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0RXhwaXJ5KG5ldyBJbnRlZ2VyKDU1KSk7CisJCQorCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNDUpLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDU1KSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDQ1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOworCisJCS8vIGNsZWFyIHhtbCBjYWNoZSBleHBpcnkgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRFeHBpcnkobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5KCkpOworCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTUpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOworCQorCQkKKwkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1NSksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7CisJCisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCisKKwkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1NSksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7CisKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCisJCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDU1KSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlRXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgZXhwaXJ5LCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0RXhwaXJ5KG5ldyBJbnRlZ2VyKDYwKSk7CisJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig2MCksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5KCkpOworCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNjApLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldEV4cGlyeShudWxsKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlRXhwaXJ5VGltZU9mRGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOworCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOworCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCisKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7CisJCQorCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOworCisJCQorCQkvLyBzZXQgeG1sIGNhY2hlIGV4cGlyeSwgY2hlY2sgc2V0dGluZ3MKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRFeHBpcnlUaW1lT2ZEYXkoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUaW1lT2ZEYXkoKSk7CisJCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuc2V0SG91cihuZXcgSW50ZWdlcigxMCkpOworCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTApLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOworCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTApLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOworCisJCQkKKwkJLy8gc2V0IGphdmEgY2FjaGUgZXhwaXJ5LCBjaGVjayBkZWZhdWx0cworCQkKKwkJamF2YUNvbnRleHRDYWNoaW5nLmFkZEV4cGlyeVRpbWVPZkRheSgpOworCQlqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuc2V0SG91cihuZXcgSW50ZWdlcigxMikpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwKSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOworCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwKSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKKworCQkvLyBjbGVhciB4bWwgY2FjaGUgZXhwaXJ5IHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0RXhwaXJ5VGltZU9mRGF5KG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7CisJCisJCQorCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlRW50aXR5LnNldENhY2hlKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7CisJCisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCisKKwkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMiksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOworCisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQorCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMiksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVFeHBpcnlUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBjYWNoZSBleHBpcnksIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5hZGRFeHBpcnlUaW1lT2ZEYXkoKS5zZXRIb3VyKG5ldyBJbnRlZ2VyKDEyKSk7CisJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMiksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKKwkJCQkKKwkJLy8gc2V0IGNvbnRleHQgZXhwaXJ5IHRpbWUgb2YgZGF5IG1pbnV0ZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLmdldEV4cGlyeVRpbWVPZkRheSgpLnNldE1pbnV0ZShuZXcgSW50ZWdlcigzNSkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOworCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOworCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMzUpLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldE1pbnV0ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDM1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0TWludXRlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgZXhwaXJ5IHRpbWUgb2YgZGF5IG51bGwsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5yZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOworCQlyZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlQ29udmVydGVyKTsKKwkJcmVzb3VyY2VDb252ZXJ0ZXIuc2V0Q2xhc3NOYW1lKCJGb28iKTsKKwkJcmVzb3VyY2VDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOworCQlyZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlQ29udmVydGVyMik7CisJCXJlc291cmNlQ29udmVydGVyMi5zZXRDbGFzc05hbWUoIkZvbzIiKTsKKwkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLm1vdmUoMCwgMSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnJlbW92ZSgwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZUNvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q3VzdG9tQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5Rm9yQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVudGl0eS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkQ3VzdG9tQ29udmVydGVyKDApOworCQljb250ZXh0Q29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJGb28iKTsKKwkJY29udGV4dENvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKKwkJY29udGV4dENvbnZlcnRlcjIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbzIiKTsKKwkJY29udGV4dENvbnZlcnRlcjIuc2V0TmFtZSgibXlDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZUN1c3RvbUNvbnZlcnRlcigwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKGNvbnRleHRDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5Rm9yVHlwZUNvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q29udmVydGVySG9sZGVyKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VUeXBlQ29udmVydGVyKTsKKwkJcmVzb3VyY2VUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKKwkJcmVzb3VyY2VUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlYbWxUeXBlQ29udmVydGVyIHJlc291cmNlVHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VUeXBlQ29udmVydGVyMik7CisJCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKKwkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeVR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JUeXBlQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVudGl0eS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7CisJCWNvbnRleHRUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKKwkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKKwkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7CisJCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVR5cGVDb252ZXJ0ZXIoMCwgMSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoY29udGV4dFR5cGVDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5Rm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q29udmVydGVySG9sZGVyKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyKTsKKwkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKKwkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7CisJCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKKwkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JPYmplY3RUeXBlQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVudGl0eS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7CisJCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKKwkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKKwkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7CisJCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCwgMSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOworCQlyZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlU3RydWN0Q29udmVydGVyKTsKKwkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyKCJGb28iKTsKKwkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOworCQlyZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlU3RydWN0Q29udmVydGVyMik7CisJCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXIoIkZvbzIiKTsKKwkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLm1vdmUoMCwgMSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZSgwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5Rm9yU3RydWN0Q29udmVydGVycygpOworCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVudGl0eS5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkU3RydWN0Q29udmVydGVyKDApOworCQljb250ZXh0U3RydWN0Q29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJGb28iKTsKKwkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlciIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOworCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udGV4dFN0cnVjdENvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKKwkJY29udGV4dFN0cnVjdENvbnZlcnRlcjIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbzIiKTsKKwkJY29udGV4dFN0cnVjdENvbnZlcnRlcjIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVN0cnVjdENvbnZlcnRlcigwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQorCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1JZE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUlkTWFwcGluZ1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4ZTY4MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1JZE1hcHBpbmdUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1JZE1hcHBpbmdUZXN0cworCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBFY2xpcHNlTGlua09ybUlkTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUlkRGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBFY2xpcHNlTGluay5NVVRBQkxFLCAiamF2YS51dGlsLkRhdGUiKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE11dGFibGUiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgRGF0ZSBteURhdGU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgICIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAorCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9CisJCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7CisJCU9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nIGNvbnRleHRJZCA9IAorCQkJKE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCisJCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbElkIHJlc291cmNlSWQgPSAKKwkJCShYbWxJZCkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKKwkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgamF2YUlkTWFwcGluZyA9IChFY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gZmFsc2UsIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlSWQuc2V0TXV0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgbXV0YWJsZSB0byB0cnVlLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZUlkLnNldE11dGFibGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIGNsZWFyIHhtbCBtdXRhYmxlLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZUlkLnNldE11dGFibGUobnVsbCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gVE9ETyAtIHRlc3QgZGVmYXVsdHMgZm9yIGphdmEgc2VyaWFsaXphYmxlIGFuZCBkYXRlL3RpbWUgdHlwZXMsIAorCQkvLyB3aXRoIGFuZCB3aXRob3V0IHBlcnNpc3RlbmNlIHByb3BlcnR5CisJCQorCQkvLyBzZXQgbXV0YWJsZSBvbiBqYXZhIGJhc2ljIG1hcHBpbmcKKwkJCisJCWphdmFJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGphdmFJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIHJlbW92ZSBhdHRyaWJ1dGUgZnJvbSB4bWwsIHRlc3QgZGVmYXVsdCBtdXRhYmxlIGZyb20gamF2YQorCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQljb250ZXh0SWQgPSAoT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoamF2YUlkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgY29udGV4dEJhc2ljID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGphdmFJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU11dGFibGVEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUlkRGF0ZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAorCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9CisJCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm15RGF0ZSIpOworCQlPcm1FY2xpcHNlTGlua0lkTWFwcGluZyBjb250ZXh0SWQgPSAKKwkJCShPcm1FY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAorCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxJZCByZXNvdXJjZUlkID0gCisJCQkoWG1sSWQpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CisJCUVjbGlwc2VMaW5rSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteURhdGUiKS5nZXRNYXBwaW5nKCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZUlkLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIHRydWUsIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlSWQuc2V0TXV0YWJsZShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIGNsZWFyIHhtbCBtdXRhYmxlLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZUlkLnNldE11dGFibGUobnVsbCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkKKwkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLlRSVUUpOworCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShudWxsKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gc2V0IG11dGFibGUgb24gamF2YSBpZCBtYXBwaW5nCisJCQorCQlqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJY29udGV4dElkID0gKE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkvLyBzZXQgbWV0YWRhdGEgY29tcGxldGUKKwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBjb250ZXh0QmFzaWMgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeU11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKKwkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQorCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOworCQlPcm1FY2xpcHNlTGlua0lkTWFwcGluZyBjb250ZXh0SWQgPSAKKwkJCShPcm1FY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAorCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxJZCByZXNvdXJjZUlkID0gCisJCQkoWG1sSWQpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgbXV0YWJsZSB0byB0cnVlLCBjaGVjayByZXNvdXJjZQorCQkKKwkJY29udGV4dElkLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgbXV0YWJsZSB0byBmYWxzZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRJZC5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRJZC5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShudWxsKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKKwkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlYbWxJZCBiYXNpY1Jlc291cmNlID0gKFhtbElkKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7CisJCUphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZyA9IChKYXZhSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKKwkJCQkKKwkJLy9zZXQgbG9iIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorCQliYXNpY1Jlc291cmNlLnNldENvbnZlcnQoIm15Q29udmVydCIpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKKworCQkvL3NldCBsb2IgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKKwkJYmFzaWNSZXNvdXJjZS5zZXRDb252ZXJ0KG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKKwkJCisJCQorCQlqYXZhSWRNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7CisJCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhSWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJmb28iKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1JZE1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhSWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOworCQkKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIG9ybUlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1JZE1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFJZE1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7CisJCQorCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiYmFyIik7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgb3JtSWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKKworCQlqYXZhSWRNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBqYXZhSWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CisJCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sSWQgYmFzaWNSZXNvdXJjZSA9IChYbWxJZCkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOworCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSWRNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKKwkJCQkKKwkJLy9zZXQgbG9iIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAorCQlvcm1JZE1hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCisJCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1JZE1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSLCBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOworCisJCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1JZE1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUlkTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7CisKKwkJLy9zZXQgbG9iIHRvIGZhbHNlIGluIHRoZSBjb250ZXh0IG1vZGVsCisJCW9ybUlkTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1JZE1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiODk1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMKKwlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwdWJsaWMgRWNsaXBzZUxpbmtPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdERlcGFydG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKS5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX1RBQkxFKS5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX0NPTFVNTikuYXBwZW5kKCI7Iik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkRlcGFydG1lbnQiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luVGFibGUobmFtZT1cIkRFUF9FTVBcIiwgam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT1cIkRFUFRfSURcIiksIGludmVyc2VKb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPVwiRU1QX0lEXCIpKSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXM7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRGVwYXJ0bWVudC5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtcGxveWVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuRU5USVRZKS5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5JRCkuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRW1wbG95ZWUiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBlbXBJZDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbXBsb3llZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKKwkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQorCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueSIpOworCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgY29udGV4dE1hbnlUb01hbnkgPSAKKwkJCShFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKKwkJCShYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgcmVzb3VyY2VNYW55VG9NYW55ID0gCisJCQkoWG1sTWFueVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBJTk5FUiwgY2hlY2sgY29udGV4dAorCQkKKwkJcmVzb3VyY2VNYW55VG9NYW55LnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLklOTkVSKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLklOTkVSLCByZXNvdXJjZU1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgY29udGV4dAorCQkKKwkJcmVzb3VyY2VNYW55VG9NYW55LnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLk9VVEVSKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLk9VVEVSLCByZXNvdXJjZU1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBudWxsLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZU1hbnlUb01hbnkuc2V0Sm9pbkZldGNoKG51bGwpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Sm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCisJCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KKwkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnkiKTsKKwkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGNvbnRleHRNYW55VG9NYW55ID0gCisJCQkoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCisJCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbE1hbnlUb01hbnkgcmVzb3VyY2VNYW55VG9NYW55ID0gCisJCQkoWG1sTWFueVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIHJlc291cmNlCisJCQorCQljb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlTWFueVRvTWFueS5nZXRKb2luRmV0Y2goKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCisJCQorCQljb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShudWxsKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEpvaW5GZXRjaERlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVtcGxveWVlKCk7CisJCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnBlcnNpc3RlbnRUeXBlcygpLm5leHQoKTsKKwkJT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55ID0gKE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOworCisJCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueSA9IChPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOworCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwkJCisJCQorCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKKwkJamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKKwkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOworCQltYW55VG9NYW55ID0gKE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBtYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW1wbG95ZWUoKTsKKwkJY3JlYXRlVGVzdERlcGFydG1lbnQoKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5EZXBhcnRtZW50Iik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRW1wbG95ZWUiKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRUeXBlIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkucGVyc2lzdGVudFR5cGVzKCkubmV4dCgpOworCQlPcm1NYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55ID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyh0cnVlLCBtYW55VG9NYW55LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSk7CisJCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBtYW55VG9NYW55LmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnRFcXVhbHMoIkRFUF9FTVAiLCBvcm1Kb2luVGFibGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJERVBUX0lEIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRU1QX0lEIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImVtcElkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKworCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSBhbmQgdmVyaWZ5IEpvaW5UYWJsZSBpbmZvIGlzIG5vdCB0YWtlbiBmcm9tIHRoZSBqYXZhCisJCWRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQlkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOworCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueSA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb01hbnkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKTsKKwkJb3JtSm9pblRhYmxlID0gb25lVG9NYW55LmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfRW1wbG95ZWUiLCBvcm1Kb2luVGFibGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X2lkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZW1wbG95ZWVzX2VtcElkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImVtcElkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwkJCisJCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIHRvIGZhbHNlLCBhZGQgbWFwcGluZyB0byBvcm0ueG1sIHZlcmlmeSBKb2luVGFibGUgaW5mbyBpcyBub3QgdGFrZW4gZnJvbSB0aGUgamF2YQorCQlkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7CisJCW1hbnlUb01hbnkgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgbWFueVRvTWFueS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpOworCQlvcm1Kb2luVGFibGUgPSBtYW55VG9NYW55LmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnRFcXVhbHMoIkRFUF9FTVAiLCBvcm1Kb2luVGFibGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJERVBUX0lEIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRU1QX0lEIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImVtcElkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKworCQkKKwkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtcGxveWVlcyIpOworCQltYW55VG9NYW55ID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYW55VG9NYW55LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSk7CisJCW9ybUpvaW5UYWJsZSA9IG1hbnlUb01hbnkuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CisJCWFzc2VydEVxdWFscygiRGVwYXJ0bWVudF9FbXBsb3llZSIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X2lkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygiZW1wbG95ZWVzX2VtcElkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZW1wSWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MTg5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzCisJZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHVibGljIEVjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdERlcGFydG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5NQU5ZX1RPX09ORSkuYXBwZW5kKCI7Iik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkRlcGFydG1lbnQiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBFbXBsb3llZSBlbXBsb3llZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJEZXBhcnRtZW50LmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1wbG95ZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJFbXBsb3llZSIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGVtcElkOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVtcGxveWVlLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCisJCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KKwkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvT25lIik7CisJCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBjb250ZXh0TWFueVRvT25lID0gCisJCQkoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCisJCQkoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxNYW55VG9PbmUgcmVzb3VyY2VNYW55VG9PbmUgPSAKKwkJCShYbWxNYW55VG9PbmUpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlTWFueVRvT25lLnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLklOTkVSKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLklOTkVSLCByZXNvdXJjZU1hbnlUb09uZS5nZXRKb2luRmV0Y2goKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlTWFueVRvT25lLnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLk9VVEVSKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLk9VVEVSLCByZXNvdXJjZU1hbnlUb09uZS5nZXRKb2luRmV0Y2goKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgY29udGV4dAorCQkKKwkJcmVzb3VyY2VNYW55VG9PbmUuc2V0Sm9pbkZldGNoKG51bGwpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hbnlUb09uZS5nZXRKb2luRmV0Y2goKSk7CisJCWFzc2VydE51bGwoY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAorCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9CisJCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZSIpOworCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgY29udGV4dE1hbnlUb09uZSA9IAorCQkJKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAorCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxNYW55VG9PbmUgcmVzb3VyY2VNYW55VG9PbmUgPSAKKwkJCShYbWxNYW55VG9PbmUpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIElOTkVSLCBjaGVjayByZXNvdXJjZQorCQkKKwkJY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIHJlc291cmNlCisJCQorCQljb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShudWxsKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luRmV0Y2hEZWZhdWx0RnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVtcGxveWVlKCk7CisJCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnBlcnNpc3RlbnRUeXBlcygpLm5leHQoKTsKKwkJT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZSA9IChPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7CisKKwkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CisJCU9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lID0gKE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlIikuZ2V0TWFwcGluZygpOworCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOworCQkKKwkJCisJCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBqYXZhUmVsYXRpb25zaGlwTWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7CisJCWphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7CisJCWFzc2VydE51bGwobWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOworCQkKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKKwkJbWFueVRvT25lID0gKE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZSIpLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgbWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ODdhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKQEAgLTAsMCArMSwyMTQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBFY2xpcHNlTGlua09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDdXN0b21pemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclJlYWRPbmx5KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKwkJCisJCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQorCQkKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKwkJCisJCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIG92ZXJyaWRlCisJCQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCQorCQkvLyBjbGVhciB4bWwgcmVhZCBvbmx5LCBzZXQgamF2YSByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgZGVmYXVsdHMKKwkJCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShudWxsKTsKKwkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOworCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKKworCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKworCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOworCisJCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQorCQkKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCQorCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQorCQkKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydFRydWUoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKwkJCisJCS8vIGNsZWFyIHhtbCByZWFkIG9ubHksIHNldCBqYXZhIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgZGVmYXVsdHMKKwkJCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShudWxsKTsKKwkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCQorCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgb3ZlcnJpZGUKKwkJCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCQorCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQorCQkKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JSZWFkT25seSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkobnVsbCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ3VzdG9taXplcigpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKworCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOworCQlhc3NlcnROdWxsKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJCisJCS8vIHNldCB4bWwgY3VzdG9taXplciwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldEN1c3RvbWl6ZXIoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDdXN0b21pemVyKCkpOworCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisKKwkJCisJCS8vIHNldCB4bWwgY3VzdG9taXplciBjbGFzcywgY2hlY2sgb3ZlcnJpZGUKKwkJCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0Q3VzdG9taXplckNsYXNzTmFtZSgiZm9vIik7CisJCQorCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQkvLyBjbGVhciB4bWwgY3VzdG9taXplciBjbGFzcywgc2V0IGphdmEgY3VzdG9taXplciBjbGFzcywgY2hlY2sgZGVmYXVsdHMKKwkJCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0Q3VzdG9taXplckNsYXNzTmFtZShudWxsKTsKKwkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoImJhciIpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzc05hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKKworCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKKwkJCisJCS8vIHNldCB4bWwgY3VzdG9taXplciBjbGFzcywgY2hlY2sgb3ZlcnJpZGUKKwkJCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0Q3VzdG9taXplckNsYXNzTmFtZSgiZm9vIik7CisJCQorCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisKKwkJLy9zZXQgeG1sIGN1c3RvbWl6ZXIgbnVsbAorCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldEN1c3RvbWl6ZXIobnVsbCk7CisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKSk7CisJCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDdXN0b21pemVyKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJmb28iKTsKKwkJCisJCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJCQkKKwkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDaGFuZ2VUcmFja2luZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgdHlwZSB0byBBVFRSSUJVVEUsIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDaGFuZ2VUcmFja2luZyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENoYW5nZVRyYWNraW5nKCkpOworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBzZXQgeG1sIHR5cGUgdG8gT0JKRUNULCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBzZXQgeG1sIHR5cGUgdG8gREVGRVJSRUQsIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gc2V0IHhtbCB0eXBlIHRvIEFVVE8sIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOworCQkKKwkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjbGVhciB4bWwgY2hhbmdlIHRyYWNraW5nLCBzZXQgamF2YSBjaGFuZ2UgdHJhY2tpbmcsIGNoZWNrIGRlZmF1bHRzCisJCQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2hhbmdlVHJhY2tpbmcobnVsbCk7CisJCWphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQorCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyB1bnNldCBtZXRhZGF0YUNvbXBsZXRlLCBzZXQgeG1sIGNoYW5nZSB0cmFja2luZyB0byBPQkpFQ1QsIGNoZWNrIGNvbnRleHQKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDaGFuZ2VUcmFja2luZyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENoYW5nZVRyYWNraW5nKCkpOworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uICB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2hhbmdlVHJhY2tpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gQVRUUklCVVRFLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkJCQorCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gT0JKRUNULCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkJCQorCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gREVGRVJSRUQsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCQkKKwkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIEFVVE8sIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkJCQorCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisKKworCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSB0eXBlLCBjaGVjayBzZXR0aW5ncworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRUeXBlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTCk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCisJCQkKKwkJLy8gc2V0IGphdmEgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKKwkJCisJCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUspOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCisJCS8vIGNsZWFyIHhtbCBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRUeXBlKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkKKwkJCisJCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCisKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgdHlwZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSyk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkhBUkRfV0VBSywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZUNvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisKKworCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKKworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSB0eXBlLCBjaGVjayBzZXR0aW5ncworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOworCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOworCisJCQkKKwkJLy8gc2V0IGphdmEgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKKwkJCisJCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOworCisJCS8vIGNsZWFyIHhtbCBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKKwkKKwkJCisJCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisJCisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCisKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBjYWNoZSBjb29yZGluYXRpb24gdHlwZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNvb3JkaW5hdGlvbiB0eXBlIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShudWxsKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOworCX0KKworCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisKKworCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKKworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRTaXplKG5ldyBJbnRlZ2VyKDEwNSkpOworCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKKworCQkJCisJCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCisJCQorCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7CisJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOworCisJCS8vIGNsZWFyIHhtbCBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRTaXplKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOworCQorCQkKKwkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKKwkKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKKworCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7CisKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaXplKG5ldyBJbnRlZ2VyKDUwKSk7CisJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7CisJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaXplKG51bGwpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZUFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisKKworCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgc2V0dGluZ3MKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKworCQkJCisJCS8vIHNldCBqYXZhIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cworCQkKKwkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7CisKKwkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOworCisJCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOworCQorCQkKKwkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKwkKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKKworCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7CisKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKG51bGwpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKworCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCQorCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCisJCQorCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisKKwkJCQorCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cworCQkKKwkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisKKwkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCisJCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQorCQkKKwkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQorCQkKKwkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQorCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisKKworCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7CisJCQorCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKKworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOworCisJCQkKKwkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKKwkJCisJCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOworCisJCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0RGlzYWJsZUhpdHMoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKKworCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKKwkKKwkJCisJCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOworCQorCQkKKwkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQorCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7CisKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOworCQkJCQorCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKKwkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCisKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7CisKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2hhcmVkKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOworCisJCQkKKwkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKKwkJCisJCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKKworCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKKworCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOworCQorCQkKKwkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOworCQorCQkKKwkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQorCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7CisKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKworCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOworCQkKKwkJLy8gc2V0IHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIHNldHRpbmdzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRFeGlzdGVuY2VDaGVja2luZyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKKworCQkJCisJCS8vIHNldCBqYXZhIGNhY2hlIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgZGVmYXVsdHMKKwkJCisJCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOworCisJCS8vIGNsZWFyIHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRFeGlzdGVuY2VDaGVja2luZyhudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwkKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKKworCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOworCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOworCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGV4aXN0ZW5jZSBjaGVja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7CisJfQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmFkZChyZXNvdXJjZUNvbnZlcnRlcik7CisJCXJlc291cmNlQ29udmVydGVyLnNldENsYXNzTmFtZSgiRm9vIik7CisJCXJlc291cmNlQ29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7CisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlQ29udmVydGVyMik7CisJCXJlc291cmNlQ29udmVydGVyMi5zZXRDbGFzc05hbWUoIkZvbzIiKTsKKwkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZUNvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKKwkJY29udGV4dENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7CisJCWNvbnRleHRDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7CisJCWNvbnRleHRDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7CisJCWNvbnRleHRDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZUN1c3RvbUNvbnZlcnRlcigwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoY29udGV4dENvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclR5cGVDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlVHlwZUNvbnZlcnRlcik7CisJCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7CisJCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VUeXBlQ29udmVydGVyMik7CisJCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKKwkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclR5cGVDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOworCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7CisJCWNvbnRleHRUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7CisJCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOworCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVR5cGVDb252ZXJ0ZXIoMCwgMSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcigwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcihjb250ZXh0VHlwZUNvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0Zvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcik7CisJCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7CisJCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7CisJCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKKwkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0Zvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOworCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7CisJCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7CisJCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOworCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCwgMSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yU3RydWN0Q29udmVydGVycygpOworCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZChyZXNvdXJjZVN0cnVjdENvbnZlcnRlcik7CisJCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldENvbnZlcnRlcigiRm9vIik7CisJCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOworCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7CisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlU3RydWN0Q29udmVydGVyMik7CisJCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXIoIkZvbzIiKTsKKwkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKKwkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7CisJCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7CisJCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7CisJCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVN0cnVjdENvbnZlcnRlcigwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoY29udGV4dFN0cnVjdENvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNGJlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzLmphdmEKQEAgLTAsMCArMSw1NzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1PYmplY3RUeXBlQ29udmVydGVyVGVzdHMKKwlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQENvbnZlcnQobmFtZT1cImZvb1wiKSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXJDb252ZXJzaW9uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPYmplY3RUeXBlQ29udmVydGVyKG5hbWU9XCJmb29cIiwgZGVmYXVsdE9iamVjdFZhbHVlPVwiYmFyXCIsIGNvbnZlcnNpb25WYWx1ZXMgPSBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZT1cImZcIiwgb2JqZWN0VmFsdWU9XCJmZW1hbGVcIikpIik7CisJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyBFY2xpcHNlTGlua09ybU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7CisJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCisJCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOworCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVyKCk7CisJCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7CisJCQkJCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXREYXRhVHlwZSgibXlDb252ZXJ0Iik7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOworCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCisJCWNvbnZlcnRlclJlc291cmNlLnNldERhdGFUeXBlKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7CisJCQorCQkJCQorCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKKwkJb3JtUGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCW9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQkKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKKwkJamF2YUNvbnZlcnRlci5zZXREYXRhVHlwZSgiYmFyIik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCQorCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcJCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyhudWxsLCAgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeURhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOworCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCisJCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOworCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVyKCk7CisJCisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKKwkJCQkKKwkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAorCQlvcm1Db252ZXJ0ZXIuc2V0RGF0YVR5cGUoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKKwkKKwkJb3JtQ29udmVydGVyLnNldERhdGFUeXBlKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7CisJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCisJCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOworCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVyKCk7CisJCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOworCQkJCQorCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKKwkJY29udmVydGVyUmVzb3VyY2Uuc2V0T2JqZWN0VHlwZSgibXlDb252ZXJ0Iik7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKKworCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAorCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRPYmplY3RUeXBlKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOworCQkKKwkJCQkKKwkJLy9yZW1vdmUgdGhlIHNwZWNpZmllZCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlvcm1Db252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gKChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7CisJCWphdmFDb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiYmFyIik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOworCQkKKwkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeU9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CisJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKKwkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7CisJCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7CisJCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJCQkKKwkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAorCQlvcm1Db252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKKwkKKwkJb3JtQ29udmVydGVyLnNldE9iamVjdFR5cGUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7CisJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKKwkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7CisJCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOworCQlPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7CisJCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKCJteUNvbnZlcnQiKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOworCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCisJCWNvbnZlcnRlclJlc291cmNlLnNldE5hbWUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7CisJCQorCisJCS8vcmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGVyc2lzdGVudCBhdHRyaWJ1dGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQorCQkJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7CisJCQorCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOworCQlqYXZhQ29udmVydGVyLnNldE5hbWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCQorCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyhudWxsLCAgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKKwkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9ICgoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7IAorCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKKwkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCU9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOworCQkJCQorCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCisJCW9ybUNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOworCQorCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOworCQkKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOworCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAorCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKKwkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJCQkJCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXREZWZhdWx0T2JqZWN0VmFsdWUoIm15Q29udmVydCIpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOworCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCisJCWNvbnZlcnRlclJlc291cmNlLnNldERlZmF1bHRPYmplY3RWYWx1ZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJCQorCQkJCQorCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKKwkJb3JtUGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCW9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQkKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKKwkJamF2YUNvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJCQorCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcJCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyhudWxsLCAgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlEZWZhdWx0T2JqZWN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CisJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKKwkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7CisJCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7CisJCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJCQkJCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKKwkJb3JtQ29udmVydGVyLnNldERlZmF1bHRPYmplY3RWYWx1ZSgiZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJCisJCW9ybUNvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOworCX0KKworCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb252ZXJzaW9uVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7CisJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCisJCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOworCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVyKCk7CisJCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOworCQkKKwkJLy9hZGQgY29udmVyc2lvbiB2YWx1ZSB0byByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlYbWxDb252ZXJzaW9uVmFsdWUgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnNpb25WYWx1ZSgpOworCQljb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuYWRkKHJlc291cmNlQ29udmVyc2lvblZhbHVlKTsKKwkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuc2V0RGF0YVZhbHVlKCJmb28iKTsKKwkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuc2V0T2JqZWN0VmFsdWUoImJhciIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBjb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7CisJCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnNpb24gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVzb3VyY2UgbW9kZWwgbGlzdAorCQlYbWxDb252ZXJzaW9uVmFsdWUgeG1sQ29udmVyc2lvblZhbHVlMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVyc2lvblZhbHVlKCk7CisJCWNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5hZGQoMCwgeG1sQ29udmVyc2lvblZhbHVlMik7CisJCXhtbENvbnZlcnNpb25WYWx1ZTIuc2V0RGF0YVZhbHVlKCJmb28yIik7CisJCXhtbENvbnZlcnNpb25WYWx1ZTIuc2V0T2JqZWN0VmFsdWUoImJhcjIiKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOworCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOworCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKKworCQkvL21vdmUgYSBjb252ZXJzaW9uIHZhbHVlIGluIHRoZSByZXNvdXJjZSBtb2RlbCBsaXN0CisJCQorCQljb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkubW92ZSgwLCAxKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKKwkJY29udGV4dENvbnZlcnNpb25WYWx1ZXMgPSBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOworCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7CisJCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMSkuZ2V0T2JqZWN0VmFsdWUoKSk7CisKKwkJLy9yZW1vdmUgYSBjb252ZXJzaW9uIHZhbHVlIGZyb20gdGhlIHJlc291cmNlIG1vZGVsIGxpc3QKKworCQljb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkucmVtb3ZlKDApOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOworCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldE9iamVjdFZhbHVlKCkpOworCisJCS8vY2xlYXIgdGhlIGNvbnZlcnNpb24gdmFsdWUgcmVzb3VyY2UgbW9kZWwgbGlzdAorCQljb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuY2xlYXIoKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOworCQkKKwkJLy9hZGQgY29udmVyc2lvbiB2YWx1ZSB0byBqYXZhIGNvbnRleHQgbW9kZWwsIHZlcmlmeSBkb2VzIG5vdCBhZmZlY3Qgb3JtIGNvbnRleHQgbW9kZWwKKwkKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEphdmFFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBqYXZhQ29udmVyc2lvblZhbHVlID0gamF2YUNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoKTsKKwkJamF2YUNvbnZlcnNpb25WYWx1ZS5zZXREYXRhVmFsdWUoImJheiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgamF2YUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKKwkJCisJCS8vcmVtb3ZlIG9ybSBhdHRyaWJ1dGUgbWFwcGluZywgdmVyaWZ5IHZpcnR1YWwgbWFwcGluZyBoYXMgY29udmVyc2lvbiB2YWx1ZXMgZnJvbSBqYXZhCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlvcm1Db252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7CisJCWNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKKwkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgamF2YUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKKwkJCisJCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIHRvIHRydWUsIHZlcmlmeSB2aXJ0dWFsIG1hcHBpbmcgaWdub3JlcyB0aGUgY29udmVyc2lvbiB2YWx1ZXMgZnJvbSBqYXZhCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOworCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAorCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKKwkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOworCQkKKwkJLy9hZGQgY29udmVyc2lvbiB2YWx1ZSB0byBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAorCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb250ZXh0Q29udmVyc2lvblZhbHVlID0gb3JtQ29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgpOworCQljb250ZXh0Q29udmVyc2lvblZhbHVlLnNldERhdGFWYWx1ZSgiZm9vIik7CisJCWNvbnRleHRDb252ZXJzaW9uVmFsdWUuc2V0T2JqZWN0VmFsdWUoImJhciIpOworCisJCWFzc2VydEVxdWFscygxLCBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gY29udGV4dENvbnZlcnNpb25WYWx1ZXMgPSBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOworCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldE9iamVjdFZhbHVlKCkpOworCisJCS8vYWRkIGEgY29udmVyc2lvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZXh0IG1vZGVsIGxpc3QKKwkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udGV4dENvbnZlcnNpb25WYWx1ZTIgPSBvcm1Db252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApOworCQljb250ZXh0Q29udmVyc2lvblZhbHVlMi5zZXREYXRhVmFsdWUoImZvbzIiKTsKKwkJY29udGV4dENvbnZlcnNpb25WYWx1ZTIuc2V0T2JqZWN0VmFsdWUoImJhcjIiKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOworCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOworCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKKworCQkvL21vdmUgYSBjb252ZXJzaW9uIHZhbHVlIGluIHRoZSBjb250ZXh0IG1vZGVsIGxpc3QKKwkJCisJCW9ybUNvbnZlcnRlci5tb3ZlQ29udmVyc2lvblZhbHVlKDAsIDEpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOworCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKKwkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldE9iamVjdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKKworCQkvL3JlbW92ZSBhIGNvbnZlcnNpb24gdmFsdWUgZnJvbSB0aGUgY29udGV4dCBtb2RlbCBsaXN0CisKKwkJb3JtQ29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKKwkJY29udGV4dENvbnZlcnNpb25WYWx1ZXMgPSBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOworCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKKworCQkvL2NsZWFyIHRoZSBjb252ZXJzaW9uIHZhbHVlIHJlc291cmNlIG1vZGVsIGxpc3QKKwkJb3JtQ29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplQ29udmVyc2lvblZhbHVlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyQ29udmVyc2lvblZhbHVlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAorCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOworCisJCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygiZiIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCkubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmZW1hbGUiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllNjRhYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpAQCAtMCwwICsxLDMwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMKKwlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwdWJsaWMgRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RGVwYXJ0bWVudCgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX1RBQkxFKS5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX0NPTFVNTikuYXBwZW5kKCI7Iik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkRlcGFydG1lbnQiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEpvaW5UYWJsZShuYW1lPVwiREVQX0VNUFwiLCBqb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPVwiREVQVF9JRFwiKSwgaW52ZXJzZUpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9XCJFTVBfSURcIikpIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248RW1wbG95ZWU+IGVtcGxveWVlczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJEZXBhcnRtZW50LmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1wbG95ZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJFbXBsb3llZSIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGVtcElkOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVtcGxveWVlLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCisJCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KKwkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7CisJCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0T25lVG9NYW55ID0gCisJCQkoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCisJCQkoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxPbmVUb01hbnkgcmVzb3VyY2VPbmVUb01hbnkgPSAKKwkJCShYbWxPbmVUb01hbnkpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEZhbHNlKHJlc291cmNlT25lVG9NYW55LmlzUHJpdmF0ZU93bmVkKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0T25lVG9NYW55LmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOworCQkKKwkJLy8gc2V0IHhtbCBwcml2YXRlIG93bmVkIHRvIHRydWUsIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlT25lVG9NYW55LnNldFByaXZhdGVPd25lZCh0cnVlKTsKKwkJCisJCWFzc2VydFRydWUocmVzb3VyY2VPbmVUb01hbnkuaXNQcml2YXRlT3duZWQoKSk7CisJCWFzc2VydFRydWUoY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKKwkJCisJCS8vIHNldCB4bWwgcHJpdmF0ZSBvd25lZCBiYWNrIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZU9uZVRvTWFueS5zZXRQcml2YXRlT3duZWQoZmFsc2UpOworCQkKKwkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb01hbnkuaXNQcml2YXRlT3duZWQoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcml2YXRlT3duZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKKwkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQorCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKKwkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIGNvbnRleHRPbmVUb01hbnkgPSAKKwkJCShFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKKwkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJWG1sT25lVG9NYW55IHJlc291cmNlT25lVG9NYW55ID0gCisJCQkoWG1sT25lVG9NYW55KSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRGYWxzZShyZXNvdXJjZU9uZVRvTWFueS5pc1ByaXZhdGVPd25lZCgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IHByaXZhdGUgb3duZWQgIHRvIHRydWUsIGNoZWNrIHJlc291cmNlCisJCQorCQljb250ZXh0T25lVG9NYW55LmdldFByaXZhdGVPd25lZCgpLnNldFByaXZhdGVPd25lZCh0cnVlKTsKKwkJCisJCWFzc2VydFRydWUocmVzb3VyY2VPbmVUb01hbnkuaXNQcml2YXRlT3duZWQoKSk7CisJCWFzc2VydFRydWUoY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IHByaXZhdGUgb3duZWQgYmFjayB0byBmYWxzZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkKCkuc2V0UHJpdmF0ZU93bmVkKGZhbHNlKTsKKwkJCisJCWFzc2VydEZhbHNlKHJlc291cmNlT25lVG9NYW55LmlzUHJpdmF0ZU93bmVkKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0T25lVG9NYW55LmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCisJCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KKwkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7CisJCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0T25lVG9NYW55ID0gCisJCQkoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCisJCQkoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxPbmVUb01hbnkgcmVzb3VyY2VPbmVUb01hbnkgPSAKKwkJCShYbWxPbmVUb01hbnkpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlT25lVG9NYW55LnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLklOTkVSKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLklOTkVSLCByZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlT25lVG9NYW55LnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLk9VVEVSKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLk9VVEVSLCByZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgY29udGV4dAorCQkKKwkJcmVzb3VyY2VPbmVUb01hbnkuc2V0Sm9pbkZldGNoKG51bGwpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7CisJCWFzc2VydE51bGwoY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAorCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9CisJCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueSIpOworCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgY29udGV4dE9uZVRvTWFueSA9IAorCQkJKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAorCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxPbmVUb01hbnkgcmVzb3VyY2VPbmVUb01hbnkgPSAKKwkJCShYbWxPbmVUb01hbnkpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIElOTkVSLCBjaGVjayByZXNvdXJjZQorCQkKKwkJY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlT25lVG9NYW55LmdldEpvaW5GZXRjaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIHJlc291cmNlCisJCQorCQljb250ZXh0T25lVG9NYW55LmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0T25lVG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShudWxsKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luRmV0Y2hEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbXBsb3llZSgpOworCQljcmVhdGVUZXN0RGVwYXJ0bWVudCgpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkRlcGFydG1lbnQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIpOworCQkKKwkJT3JtUGVyc2lzdGVudFR5cGUgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5wZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCk7CisJCU9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnkgPSAoT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKKworCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJb25lVG9NYW55ID0gKE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydE51bGwob25lVG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwkJCisJCQorCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKKwkJamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKKwkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOworCQlvbmVUb01hbnkgPSAoT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgb25lVG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW1wbG95ZWUoKTsKKwkJY3JlYXRlVGVzdERlcGFydG1lbnQoKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5EZXBhcnRtZW50Iik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRW1wbG95ZWUiKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRUeXBlIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkucGVyc2lzdGVudFR5cGVzKCkubmV4dCgpOworCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueSA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb01hbnkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKTsKKwkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9uZVRvTWFueS5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCJERVBfRU1QIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiREVQVF9JRCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkVNUF9JRCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJlbXBJZCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisKKwkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgYW5kIHZlcmlmeSBKb2luVGFibGUgaW5mbyBpcyBub3QgdGFrZW4gZnJvbSB0aGUgamF2YQorCQlkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsJCisJCW9uZVRvTWFueSA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb01hbnkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKTsKKwkJb3JtSm9pblRhYmxlID0gb25lVG9NYW55LmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOworCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfRW1wbG95ZWUiLCBvcm1Kb2luVGFibGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X2lkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZW1wbG95ZWVzX2VtcElkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImVtcElkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwkJCisJCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIHRvIGZhbHNlLCBhZGQgbWFwcGluZyB0byBvcm0ueG1sIHZlcmlmeSBKb2luVGFibGUgaW5mbyBpcyBub3QgdGFrZW4gZnJvbSB0aGUgamF2YQorCQlkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7CisJCW9uZVRvTWFueSA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9uZVRvTWFueS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpOworCQlvcm1Kb2luVGFibGUgPSBvbmVUb01hbnkuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CisJCWFzc2VydEVxdWFscygiREVQX0VNUCIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkRFUFRfSUQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJFTVBfSUQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZW1wSWQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworCisJCQorCQlkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbXBsb3llZXMiKTsKKwkJb25lVG9NYW55ID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9uZVRvTWFueS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpOworCQlvcm1Kb2luVGFibGUgPSBvbmVUb01hbnkuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0Sm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CisJCWFzc2VydEVxdWFscygiRGVwYXJ0bWVudF9FbXBsb3llZSIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X2lkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygiZW1wbG95ZWVzX2VtcElkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiZW1wSWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWMzYmFlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMKKwlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwdWJsaWMgRWNsaXBzZUxpbmtPcm1PbmVUb09uZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3REZXBhcnRtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuRU5USVRZKS5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5JRCkuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuT05FX1RPX09ORSkuYXBwZW5kKCI7Iik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkRlcGFydG1lbnQiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEVtcGxveWVlIGVtcGxveWVlOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkRlcGFydG1lbnQuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbXBsb3llZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkVtcGxveWVlIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgZW1wSWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW1wbG95ZWUuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCisJCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KKwkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOworCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBjb250ZXh0T25lVG9PbmUgPSAKKwkJCShFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAorCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxPbmVUb09uZSByZXNvdXJjZU9uZVRvT25lID0gCisJCQkoWG1sT25lVG9PbmUpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb09uZS5pc1ByaXZhdGVPd25lZCgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvT25lLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOworCQkKKwkJLy8gc2V0IHhtbCBwcml2YXRlIG93bmVkIHRvIHRydWUsIGNoZWNrIGNvbnRleHQKKwkJCisJCXJlc291cmNlT25lVG9PbmUuc2V0UHJpdmF0ZU93bmVkKHRydWUpOworCQkKKwkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU9uZVRvT25lLmlzUHJpdmF0ZU93bmVkKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRPbmVUb09uZS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKKwkJCisJCS8vIHNldCB4bWwgcHJpdmF0ZSBvd25lZCBiYWNrIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZU9uZVRvT25lLnNldFByaXZhdGVPd25lZChmYWxzZSk7CisJCQorCQlhc3NlcnRGYWxzZShyZXNvdXJjZU9uZVRvT25lLmlzUHJpdmF0ZU93bmVkKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0T25lVG9PbmUuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcml2YXRlT3duZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKKwkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQorCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7CisJCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIGNvbnRleHRPbmVUb09uZSA9IAorCQkJKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCisJCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSAKKwkJCShYbWxPbmVUb09uZSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRGYWxzZShyZXNvdXJjZU9uZVRvT25lLmlzUHJpdmF0ZU93bmVkKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0T25lVG9PbmUuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBwcml2YXRlIG93bmVkICB0byB0cnVlLCBjaGVjayByZXNvdXJjZQorCQkKKwkJY29udGV4dE9uZVRvT25lLmdldFByaXZhdGVPd25lZCgpLnNldFByaXZhdGVPd25lZCh0cnVlKTsKKwkJCisJCWFzc2VydFRydWUocmVzb3VyY2VPbmVUb09uZS5pc1ByaXZhdGVPd25lZCgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0T25lVG9PbmUuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBwcml2YXRlIG93bmVkIGJhY2sgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCisJCQorCQljb250ZXh0T25lVG9PbmUuZ2V0UHJpdmF0ZU93bmVkKCkuc2V0UHJpdmF0ZU93bmVkKGZhbHNlKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAorCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9CisJCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKKwkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgY29udGV4dE9uZVRvT25lID0gCisJCQkoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKKwkJCShYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSAKKwkJCShYbWxPbmVUb09uZSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBJTk5FUiwgY2hlY2sgY29udGV4dAorCQkKKwkJcmVzb3VyY2VPbmVUb09uZS5zZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZS5JTk5FUik7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5JTk5FUiwgcmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgY29udGV4dAorCQkKKwkJcmVzb3VyY2VPbmVUb09uZS5zZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZS5PVVRFUik7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBudWxsLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZU9uZVRvT25lLnNldEpvaW5GZXRjaChudWxsKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7CisJCWFzc2VydE51bGwoY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Sm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCisJCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KKwkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOworCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBjb250ZXh0T25lVG9PbmUgPSAKKwkJCShFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAorCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxPbmVUb09uZSByZXNvdXJjZU9uZVRvT25lID0gCisJCQkoWG1sT25lVG9PbmUpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvT25lLmdldEpvaW5GZXRjaCgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIElOTkVSLCBjaGVjayByZXNvdXJjZQorCQkKKwkJY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUik7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5JTk5FUiwgcmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIHJlc291cmNlCisJCQorCQljb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLk9VVEVSLCByZXNvdXJjZU9uZVRvT25lLmdldEpvaW5GZXRjaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKG51bGwpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvT25lLmdldEpvaW5GZXRjaCgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RKb2luRmV0Y2hEZWZhdWx0RnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVtcGxveWVlKCk7CisJCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLnBlcnNpc3RlbnRUeXBlcygpLm5leHQoKTsKKwkJT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmUgPSAoT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7CisKKwkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJb25lVG9PbmUgPSAoT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CQkKKwkJCisJCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBqYXZhUmVsYXRpb25zaGlwTWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7CisJCWphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7CisJCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOworCQlvbmVUb09uZSA9IChPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZSIpLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgb25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2UzMDA0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5JZE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cworCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7CisJCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7CisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVOdWxsQXR0cmlidXRlTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQorCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CQkJCisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkNPTFVNTik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpOworCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQkKKwkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TWFrZVNwZWNpZmllZE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdFR5cGVOdWxsQXR0cmlidXRlTWFwcGluZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJCisJCS8vdGFrZSBhIHZpcnR1YWwgbWFwcGluZyB3aXRoIGEgbWFwcGluZyB0eXBlIGFuZCBtYWtlIGl0IHNwZWNpZmllZAorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgR2VuZXJpY09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyk7CisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKTsKKwkJCisJCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPcm1FY2xpcHNlTGlua0lkTWFwcGluZyk7CisJCQorCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLm1ha2VTcGVjaWZpZWQoKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOworCisJCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCQorCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7CisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJCisJCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7CisJCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsJCQorCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwkJCisJCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1ha2VWaXJ0dWFsTm9VbmRlcmx5aW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLm1ha2VTcGVjaWZpZWQoKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOworCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5zZXROYW1lKCJub0phdmFBdHRyaWJ1dGUiKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVZpcnR1YWwoKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nVHlwZVdoZW5NZXRhZGF0YUNvbXBsZXRlKCkgIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgKChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUyKCkgIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKKwkJCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQkJCisJCS8vdmlydHVhbCBvcm0gYXR0cmlidXRlLCBhY2Nlc3MgdHlwZSBtYXRjaGVzIGphdmEgOiBGSUVMRCwgbmFtZSBtYXRjaGVzIGphdmEKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQlhc3NlcnRUcnVlKGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNGaWVsZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkucGVyc2lzdGFibGVGaWVsZHMoKS5uZXh0KCksIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQkKKwkJCisJCS8vc3BlY2lmaWVkIG9ybSBhdHRyaWJ1dGUsIGFjY2VzcyB0eXBlIG1hdGNoZXMgamF2YSA6IEZJRUxELCBuYW1lIG1hdGNoZXMgamF2YQorCQkvL2phdmFQZXJzaXN0ZW50QXR0cmlidXRlIHNob3VsZCBiZSA9PSB0byBqYXZhIGNvbnRleHQgbW9kZWwgb2JqZWN0CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCisJCQorCQkvL3ZpcnR1YWwgb3JtIGF0dHJpYnV0ZSwgamF2YSBhY2Nlc3MgdHlwZSBGSUVMRCwgb3JtIGFjY2VzcyB0eXBlIFBST1BFUlRZLCBuYW1lIG1hdGNoZXMgamF2YQorCQkvL3ZlcmlmeSB0aGUgcHJvcGVydHkgamF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBpcyB1c2VkIGluIG9ybS4KKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlVmlydHVhbCgpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CQkKKwkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnROb3RTYW1lKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQlqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpOworCQlhc3NlcnRUcnVlKGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNQcm9wZXJ0eSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkucGVyc2lzdGFibGVQcm9wZXJ0aWVzKCkubmV4dCgpLCBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKKwkJCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ly9kZWZhdWx0IGFjY2VzcyB3aWxsIGJlIGZpZWxkCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLnNldE5hbWUoImlkMiIpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLnNldE5hbWUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLnNldE5hbWUoImlkIik7CisJCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKworCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1TdHJ1Y3RDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVN0cnVjdENvbnZlcnRlclRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4MWI1NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1TdHJ1Y3RDb252ZXJ0ZXJUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVN0cnVjdENvbnZlcnRlclRlc3RzCisJZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAQ29udmVydChuYW1lPVwiZm9vXCIpIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAU3RydWN0Q29udmVydGVyIik7CisJCQl9CisJCX0pOworCX0KKworCQorCXB1YmxpYyBFY2xpcHNlTGlua09ybVN0cnVjdENvbnZlcnRlclRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7CisJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCisJCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOworCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUik7CisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7CisJCVhtbFN0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0U3RydWN0Q29udmVydGVyKCk7CisJCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVydGVyKCkpOworCQkJCQorCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKKwkJY29udmVydGVyUmVzb3VyY2Uuc2V0Q29udmVydGVyKCJteUNvbnZlcnQiKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVydGVyKCkpOworCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCisJCWNvbnZlcnRlclJlc291cmNlLnNldENvbnZlcnRlcihudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnRlcigpKTsKKwkJCisJCQkJCisJCS8vcmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGVyc2lzdGVudCBhdHRyaWJ1dGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJCisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOworCQlqYXZhQ29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJiYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJCisJCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKKwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsICBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Db252ZXJ0ZXIuTk9fQ09OVkVSVEVSLCBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOworCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCisJCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOworCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuU1RSVUNUX0NPTlZFUlRFUik7CisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7CisJCVhtbFN0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0U3RydWN0Q29udmVydGVyKCk7CisJCisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJ0ZXIoKSk7CisJCQkJCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKKwkJb3JtQ29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVydGVyKCkpOworCQorCQlvcm1Db252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJ0ZXIoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7CisJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKKwkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7CisJCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5TVFJVQ1RfQ09OVkVSVEVSKTsKKwkJT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJWG1sU3RydWN0Q29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKKwkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKCJteUNvbnZlcnQiKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOworCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCisJCWNvbnZlcnRlclJlc291cmNlLnNldE5hbWUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7CisJCQorCisJCS8vcmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGVyc2lzdGVudCBhdHRyaWJ1dGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQorCQkJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJCisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOworCQlqYXZhQ29udmVydGVyLnNldE5hbWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCQorCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyhudWxsLCAgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKKwkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9ICgoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7IAorCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKKwkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLlNUUlVDVF9DT05WRVJURVIpOworCQlPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFN0cnVjdENvbnZlcnRlcigpOworCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOworCQkJCQorCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCisJCW9ybUNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOworCQorCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyZTc3NQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzCisJZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHVibGljIEVjbGlwc2VMaW5rT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVFJBTlNJRU5UKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBUcmFuc2llbnQiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdENyZWF0ZVRyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCisJCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKKworCQlwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkuZ2V0S2V5KCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YmI0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVHlwZUNvbnZlcnRlclRlc3RzLmphdmEKQEAgLTAsMCArMSwyNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVHlwZUNvbnZlcnRlclRlc3RzCisJZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQENvbnZlcnQobmFtZT1cImZvb1wiKSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQFR5cGVDb252ZXJ0ZXIiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJCisJcHVibGljIEVjbGlwc2VMaW5rT3JtVHlwZUNvbnZlcnRlclRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKKwkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKKwkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7CisJCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnRlci5UWVBFX0NPTlZFUlRFUik7CisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJWG1sVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0VHlwZUNvbnZlcnRlcigpOworCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOworCQkJCQorCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKKwkJY29udmVydGVyUmVzb3VyY2Uuc2V0RGF0YVR5cGUoIm15Q29udmVydCIpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKKworCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAorCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXREYXRhVHlwZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOworCQkKKwkJCQkKKwkJLy9yZW1vdmUgdGhlIHNwZWNpZmllZCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlvcm1Db252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKKwkJCisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gKChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7CisJCWphdmFDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQkKKwkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkNvbnZlcnRlci5OT19DT05WRVJURVIsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlEYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKKwkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9ICgoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7IAorCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKKwkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKTsKKwkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQlYbWxUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRUeXBlQ29udmVydGVyKCk7CisJCisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKKwkJCQkKKwkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAorCQlvcm1Db252ZXJ0ZXIuc2V0RGF0YVR5cGUoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKKwkKKwkJb3JtQ29udmVydGVyLnNldERhdGFUeXBlKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7CisJCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCisJCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOworCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7CisJCVhtbFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFR5cGVDb252ZXJ0ZXIoKTsKKwkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7CisJCQkJCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRPYmplY3RUeXBlKCJteUNvbnZlcnQiKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOworCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCisJCWNvbnZlcnRlclJlc291cmNlLnNldE9iamVjdFR5cGUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7CisJCQorCQkJCQorCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKKwkJb3JtUGVyc2lzdGVudFR5cGUucmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCW9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQkKKwkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKKwkJamF2YUNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJiYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7CisJCQorCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcJCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyhudWxsLCAgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKKwkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9ICgoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7IAorCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKKwkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKTsKKwkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQlYbWxUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRUeXBlQ29udmVydGVyKCk7CisJCisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7CisJCQkJCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKKwkJb3JtQ29udmVydGVyLnNldE9iamVjdFR5cGUoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7CisJCisJCW9ybUNvbnZlcnRlci5zZXRPYmplY3RUeXBlKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOworCQkKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOworCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCisJCW9ybUJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOworCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRV9DT05WRVJURVIpOworCQlPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7CisJCVhtbFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFR5cGVDb252ZXJ0ZXIoKTsKKwkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKCJteUNvbnZlcnQiKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOworCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCisJCWNvbnZlcnRlclJlc291cmNlLnNldE5hbWUobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7CisJCQorCisJCS8vcmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGVyc2lzdGVudCBhdHRyaWJ1dGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQorCQkJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7CisJCQorCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9ICgoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOworCQlqYXZhQ29udmVydGVyLnNldE5hbWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCQorCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyhudWxsLCAgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyLk5PX0NPTlZFUlRFUiwgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKKwkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9ICgoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7IAorCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkQ29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSKTsKKwkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyLlRZUEVfQ09OVkVSVEVSKTsKKwkJT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOworCQlYbWxUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRUeXBlQ29udmVydGVyKCk7CisJCisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJCisJCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKKwkJb3JtQ29udmVydGVyLnNldE5hbWUoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7CisJCisJCW9ybUNvbnZlcnRlci5zZXROYW1lKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3Y2M5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdUZXN0cworCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBFY2xpcHNlTGlua09ybVZlcnNpb25NYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVkVSU0lPTik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAVmVyc2lvbiIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbkRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OLCBFY2xpcHNlTGluay5NVVRBQkxFLCAiamF2YS51dGlsLkRhdGUiKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBATXV0YWJsZSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBEYXRlIG15RGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCisJCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KKwkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOworCQlPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIGNvbnRleHRWZXJzaW9uID0gCisJCQkoT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAorCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxWZXJzaW9uIHJlc291cmNlVmVyc2lvbiA9IAorCQkJKFhtbFZlcnNpb24pIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKTsKKwkJRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZyBqYXZhVmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgbXV0YWJsZSB0byBmYWxzZSwgY2hlY2sgY29udGV4dAorCQkKKwkJcmVzb3VyY2VWZXJzaW9uLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgbXV0YWJsZSB0byB0cnVlLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZVZlcnNpb24uc2V0TXV0YWJsZShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkvLyBjbGVhciB4bWwgbXV0YWJsZSwgY2hlY2sgY29udGV4dAorCQkKKwkJcmVzb3VyY2VWZXJzaW9uLnNldE11dGFibGUobnVsbCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkvLyBUT0RPIC0gdGVzdCBkZWZhdWx0cyBmb3IgamF2YSBzZXJpYWxpemFibGUgYW5kIGRhdGUvdGltZSB0eXBlcywgCisJCS8vIHdpdGggYW5kIHdpdGhvdXQgcGVyc2lzdGVuY2UgcHJvcGVydHkKKwkJCisJCS8vIHNldCBtdXRhYmxlIG9uIGphdmEgYmFzaWMgbWFwcGluZworCQkKKwkJamF2YVZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGphdmFWZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJLy8gcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIHhtbCwgdGVzdCBkZWZhdWx0IG11dGFibGUgZnJvbSBqYXZhCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWNvbnRleHRWZXJzaW9uID0gKE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIHNldCBtZXRhZGF0YSBjb21wbGV0ZQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGNvbnRleHRCYXNpYyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGphdmFWZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZURhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbkRhdGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKKwkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQorCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm15RGF0ZSIpOworCQlPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIGNvbnRleHRWZXJzaW9uID0gCisJCQkoT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAorCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxWZXJzaW9uIHJlc291cmNlVmVyc2lvbiA9IAorCQkJKFhtbFZlcnNpb24pIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKTsKKwkJRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZyBqYXZhVmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpLmdldE1hcHBpbmcoKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgbXV0YWJsZSB0byBmYWxzZSwgY2hlY2sgY29udGV4dAorCQkKKwkJcmVzb3VyY2VWZXJzaW9uLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAorCQkKKwkJcmVzb3VyY2VWZXJzaW9uLnNldE11dGFibGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIGNsZWFyIHhtbCBtdXRhYmxlLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZVZlcnNpb24uc2V0TXV0YWJsZShudWxsKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJCisJCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOworCQkKKwkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKG51bGwpOworCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIHNldCBtdXRhYmxlIG9uIGphdmEgdmVyc2lvbiBtYXBwaW5nCisJCQorCQlqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCWFzc2VydFRydWUoamF2YVZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnJlbW92ZVNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJY29udGV4dFZlcnNpb24gPSAoT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIHNldCBtZXRhZGF0YSBjb21wbGV0ZQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGNvbnRleHRCYXNpYyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCWFzc2VydFRydWUoamF2YVZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCisJCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KKwkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOworCQlPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIGNvbnRleHRWZXJzaW9uID0gCisJCQkoT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAorCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlYbWxWZXJzaW9uIHJlc291cmNlVmVyc2lvbiA9IAorCQkJKFhtbFZlcnNpb24pIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayByZXNvdXJjZQorCQkKKwkJY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKG51bGwpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7CisJCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOworCQlPcm1WZXJzaW9uTWFwcGluZyBvcm1WZXJzaW9uTWFwcGluZyA9IChPcm1WZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbFZlcnNpb24gYmFzaWNSZXNvdXJjZSA9IChYbWxWZXJzaW9uKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKTsKKwkJSmF2YVZlcnNpb25NYXBwaW5nIGphdmFWZXJzaW9uTWFwcGluZyA9IChKYXZhVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7CisJCQkJCisJCS8vc2V0IGxvYiBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKKwkJYmFzaWNSZXNvdXJjZS5zZXRDb252ZXJ0KCJteUNvbnZlcnQiKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5FQ0xJUFNFX0xJTktfQ09OVkVSVEVSLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKKworCQkvL3NldCBsb2IgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKKwkJYmFzaWNSZXNvdXJjZS5zZXRDb252ZXJ0KG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOworCQkKKwkJCisJCWphdmFWZXJzaW9uTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIpOworCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YVZlcnNpb25NYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJmb28iKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFWZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKKwkJCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5yZW1vdmVTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCW9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFWZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKKwkJCisJCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIG9ybVZlcnNpb25NYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybVZlcnNpb25NYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7CisKKwkJamF2YVZlcnNpb25NYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihDb252ZXJ0ZXIuTk9fQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybVZlcnNpb25NYXBwaW5nLmdldFNwZWNpZmllZENvbnZlcnRlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFWZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7CisJCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sVmVyc2lvbiBiYXNpY1Jlc291cmNlID0gKFhtbFZlcnNpb24pIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOworCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOworCQkJCQorCQkvL3NldCBsb2IgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCisJCW9ybVZlcnNpb25NYXBwaW5nLnNldFNwZWNpZmllZENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuRUNMSVBTRV9MSU5LX0NPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscygiIiwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCisJCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1WZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiYmFyIik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkVDTElQU0VfTElOS19DT05WRVJURVIsIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOworCisJCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1WZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZShudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkQ29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOworCisJCS8vc2V0IGxvYiB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAorCQlvcm1WZXJzaW9uTWFwcGluZy5zZXRTcGVjaWZpZWRDb252ZXJ0ZXIobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRTcGVjaWZpZWRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2N2EwNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzLmphdmEKQEAgLTAsMCArMSwzNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRFY2xpcHNlTGlua0NvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOworCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX0ZJTEVfUEFUSCk7CisJCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7CisJCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOworCX0KKwkKKwlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB7CisJCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdElzQWxsRmVhdHVyZXNVbnNldCgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCQorCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNVbnNldCgpKTsKKwkJCisJCW9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOworCQkKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOworCQkKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOworCQkKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRTY2hlbWEoImFzZGYiKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOworCQkKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRTY2hlbWEobnVsbCk7CisJCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOworCQkKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXRhbG9nKCJhc2RmIik7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKKwkJCisJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0Q2F0YWxvZyhudWxsKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7CisJCQorCQkKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7CisJCQorCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKKwkJCisJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0QWNjZXNzKG51bGwpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJCisJCS8vc2V0IHNjaGVtYSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYSgiTVlfU0NIRU1BIik7CisJCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOworCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKKwkKKwkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYShudWxsKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKKwkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQkKKwkJLy9zZXQgc2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKCJNWV9TQ0hFTUEiKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7CisJCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOworCQkKKwkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2NoZW1hMigpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCQorCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAorCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEoIk1ZX1NDSEVNQSIpOworCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7CisJCQorCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKKwkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTY2hlbWEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQkKKwkJLy9zZXQgc2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKCJNWV9TQ0hFTUEiKTsKKwkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7CisJCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOworCQkKKwkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCQorCQkvL3NldCBjYXRhbG9nIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOworCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOworCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOworCQorCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhdGFsb2cobnVsbCk7CisJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewkJCisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCQorCQkvL3NldCBjYXRhbG9nIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZygiTVlfQ0FUQUxPRyIpOworCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOworCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOworCQkKKwkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCisJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7CisJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJCisJCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAorCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7CisJCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7CisJCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7CisJCQorCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYSgiTVlfU0NIRU1BIik7CisJCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAorCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhdGFsb2czKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IHNvIG9ubHkgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IGdldHMgcmVtb3ZlZAorCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJCisJCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAorCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7CisJCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7CisJCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7CisJCQorCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQkKKwkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOworCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7CisJCisJCS8vc2V0IGNhc2NhZGVQZXJzaXN0IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIHRhZyBub3QgcmVtb3ZlZAorCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7CisJCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewkJCisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQkKKwkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAorCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOworCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7CisJCQorCQkvL3NldCBjYXNjYWRlUGVyc2lzdCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCisJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQkKKwkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAorCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOworCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7CisJCQorCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKKwkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAorCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7CisJCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXNjYWRlUGVyc2lzdDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IHNvIG9ubHkgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IGdldHMgcmVtb3ZlZAorCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJCisJCS8vc2V0IGNhc2NhZGVQZXJzaXN0IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7CisJCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKKwkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOworCQkKKwkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAorCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJCisJCS8vc2V0IGFjY2VzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOworCQorCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKG51bGwpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQorCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCQorCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAorCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOworCQkKKwkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0QWNjZXNzKG51bGwpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5QWNjZXNzMigpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7CisJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCQorCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAorCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOworCQkKKwkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAorCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKKwkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0QWNjZXNzKG51bGwpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBY2Nlc3MzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOworCQkKKwkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKKwkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKKwkJCisJCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCisJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldEFjY2VzcyhudWxsKTsKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNzVlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKKwkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9GSUxFX1BBVEgpOworCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOworCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKKwl9CisKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSB7CisJCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJc0FsbEZlYXR1cmVzVW5zZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7CisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpOworCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7CisJCQorCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNVbnNldCgpKTsKKwkJCisJCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOworCQkKKwkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7CQkKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOworCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7CisJCQorCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKKwkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CQkKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOworCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOworCisJCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7CisJCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQorCQlQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQkKKwkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAorCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOworCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOworCQkKKwkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAorCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7CisJCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7CisJCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlMigpIHRocm93cyBFeGNlcHRpb24geworCQlQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKKwkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOworCQkKKwkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAorCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKwkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOworCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOworCQkKKwkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAorCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCisJCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKKwkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOworCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOworCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNjIxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0pwdEVjbGlwc2VMaW5rQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6IAorICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitwdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQorewkKKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmtDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtRW1iZWRkYWJsZVRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtRW50aXR5VGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1CYXNpY01hcHBpbmdUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybUlkTWFwcGluZ1Rlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybU9uZVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybUNvbnZlcnRlclRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtU3RydWN0Q29udmVydGVyVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1UeXBlQ29udmVydGVyVGVzdHMuY2xhc3MpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCQorCQorCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjllNGMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CisKKy8qKgorICogUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZSBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCit7CisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHN1YmplY3Q7CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyOworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgorCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXRoaXMuc3ViamVjdCA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCXRoaXMuc3ViamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+KHRoaXMuc3ViamVjdCk7CisJCXRoaXMucG9wdWxhdGVQdSgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgeworCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7CisJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNX0lELCBFY2xpcHNlTGlua0pwYVBsYXRmb3JtUHJvdmlkZXIuSUQpOworCQlyZXR1cm4gZGF0YU1vZGVsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBzdXBlci5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjBhNzU0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdHMuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RzCisJZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgeworCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7CisJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9PUk1fWE1MLCBCb29sZWFuLlRSVUUpOworCQlyZXR1cm4gZGF0YU1vZGVsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEVjbGlwc2VMaW5rT3JtQ29uZmlnKFRlc3RKcGFQcm9qZWN0IHRlc3RKcGFQcm9qZWN0KSB7CisJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gCisJCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsJCQorCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHRlc3RKcGFQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOworCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCwgQm9vbGVhbi5GQUxTRSk7CisJCXJldHVybiBkYXRhTW9kZWw7CisJfQorCQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFY2xpcHNlTGlua0ltcGxpZWRNYXBwaW5nRmlsZVJlZjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCQorCQkvLyB0ZXN0IHRoYXQgdGhlcmUgaXMgb25lIGluaXRpYWxseQorCQlKcGFYbWxSZXNvdXJjZSBlY2xpcHNlTGlua09ybVJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKTsKKwkJYXNzZXJ0VHJ1ZShlY2xpcHNlTGlua09ybVJlc291cmNlLmZpbGVFeGlzdHMoKSk7CisJCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKKwkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSk7CisJCQorCQkvLyByZW1vdmUgZWNsaXBzZWxpbmstb3JtLnhtbAorCQlkZWxldGVSZXNvdXJjZShlY2xpcHNlTGlua09ybVJlc291cmNlKTsKKwkJCisJCWFzc2VydEZhbHNlKGVjbGlwc2VMaW5rT3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKKwkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUVjbGlwc2VMaW5rSW1wbGllZE1hcHBpbmdGaWxlUmVmMigpIHsKKwkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOworCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJCisJCS8vIHRlc3QgdGhhdCB0aGVyZSBpcyBvbmUgaW5pdGlhbGx5CisJCUpwYVhtbFJlc291cmNlIGVjbGlwc2VMaW5rT3JtUmVzb3VyY2UgPSBnZXRPcm1YbWxSZXNvdXJjZSgpOworCQlhc3NlcnRUcnVlKGVjbGlwc2VMaW5rT3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKKwkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOworCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpKTsKKwkJCisJCS8vIGFkZCBzcGVjaWZpZWQgZWNsaXBzZWxpbmstb3JtLnhtbAorCQlYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKKwkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoIk1FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiKTsKKwkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxNYXBwaW5nRmlsZVJlZik7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpKSk7CisJCQorCQlhc3NlcnRUcnVlKGVjbGlwc2VMaW5rT3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKKwkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOworCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUVjbGlwc2VMaW5rSW1wbGllZE1hcHBpbmdGaWxlUmVmMygpIHsKKwkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCQorCQkvLyB0ZXN0IHRoYXQgdGhlcmUgaXMgb25lIGluaXRpYWxseQorCQlKcGFYbWxSZXNvdXJjZSBlY2xpcHNlTGlua09ybVJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKTsKKwkJYXNzZXJ0VHJ1ZShlY2xpcHNlTGlua09ybVJlc291cmNlLmZpbGVFeGlzdHMoKSk7CisJCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKKwkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSk7CisJCQorCQkvLyBpZ25vcmUgaW4gcGVyc2lzdGVuY2UgdW5pdAorCQlwZXJzaXN0ZW5jZVVuaXQuZ2V0R2VuZXJhbFByb3BlcnRpZXMoKS5zZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydFRydWUoZWNsaXBzZUxpbmtPcm1SZXNvdXJjZS5maWxlRXhpc3RzKCkpOworCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSk7CisJCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRFY2xpcHNlTGlua0NvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvSnB0RWNsaXBzZUxpbmtDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNjI1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvSnB0RWNsaXBzZUxpbmtDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ2FjaGluZ1Rlc3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ29ubmVjdGlvblRlc3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ3VzdG9taXphdGlvblRlc3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbC5KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlR2VuZXJhbFRlc3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlTG9nZ2luZ1Rlc3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlT3B0aW9uc1Rlc3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVNjaGVtYUdlbmVyYXRpb25UZXN0czsKKworcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQoreworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGlua0NvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlR2VuZXJhbFRlc3RzLnN1aXRlKCkpOworCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDb25uZWN0aW9uVGVzdHMuc3VpdGUoKSk7CisJCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUN1c3RvbWl6YXRpb25UZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ2FjaGluZ1Rlc3RzLnN1aXRlKCkpOworCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VMb2dnaW5nVGVzdHMuc3VpdGUoKSk7CisJCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZU9wdGlvbnNUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlU2NoZW1hR2VuZXJhdGlvblRlc3RzLnN1aXRlKCkpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJcHJpdmF0ZSBKcHRFY2xpcHNlTGlua0NvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzKCkgeworCQlzdXBlcigpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoaW5nQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoaW5nQWRhcHRlclRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkYjA1YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hpbmdBZGFwdGVyVGVzdHMuamF2YQpAQCAtMCwwICsxLDQ0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuRmx1c2hDbGVhckNhY2hlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKKworLyoqCisgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIG1vZGVsIG9iamVjdHMgYnkgdGhlIENhY2hpbmcgYWRhcHRlciB3aGVuIHRoZQorICogUGVyc2lzdGVuY2VVbml0IGNoYW5nZXMuCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIENhY2hpbmdBZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCit7CisJcHJpdmF0ZSBDYWNoaW5nIGNhY2hpbmc7CisJcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgZW50aXRpZXNFdmVudDsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9URVNUID0gIkVtcGxveWVlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEVTVF8yID0gIkFkZHJlc3MiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVFlQRV9ERUZBVUxUX0tFWSA9IENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxUOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIENBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFID0gQ2FjaGVUeXBlLnNvZnRfd2VhazsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENhY2hlVHlwZSBDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRV8yID0gQ2FjaGVUeXBlLmZ1bGw7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX0RFRkFVTFRfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSVpFX0RFRkFVTFQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFID0gMTIzNDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFXzIgPSA2Nzg5MDsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJFRF9DQUNIRV9ERUZBVUxUX0tFWSA9IENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUgPSBmYWxzZTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRV8yID0gdHJ1ZTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1RZUEVfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFICsgRU5USVRZX1RFU1Q7CisJcHVibGljIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgQ0FDSEVfVFlQRV9URVNUX1ZBTFVFID0gQ2FjaGVUeXBlLnNvZnRfd2VhazsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENhY2hlVHlwZSBDQUNIRV9UWVBFX1RFU1RfVkFMVUVfMiA9IENhY2hlVHlwZS5mdWxsOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX0NBQ0hFX0tFWSA9IENhY2hpbmcuRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFICsgRU5USVRZX1RFU1Q7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFID0gZmFsc2U7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFXzIgPSB0cnVlOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU0laRV9LRVkgPSBDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1NJWkUgKyBFTlRJVFlfVEVTVDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FDSEVfU0laRV9URVNUX1ZBTFVFID0gMTIzNDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENBQ0hFX1NJWkVfVEVTVF9WQUxVRV8yID0gNjc4OTA7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxVU0hfQ0xFQVJfQ0FDSEVfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19GTFVTSF9DTEVBUl9DQUNIRTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEZsdXNoQ2xlYXJDYWNoZSBGTFVTSF9DTEVBUl9DQUNIRV9URVNUX1ZBTFVFID0gRmx1c2hDbGVhckNhY2hlLmRyb3A7CisJcHVibGljIHN0YXRpYyBmaW5hbCBGbHVzaENsZWFyQ2FjaGUgRkxVU0hfQ0xFQVJfQ0FDSEVfVEVTVF9WQUxVRV8yID0gRmx1c2hDbGVhckNhY2hlLm1lcmdlOworCisJcHVibGljIENhY2hpbmdBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJdGhpcy5jYWNoaW5nID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRDYWNoaW5nKCk7CisJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7CisJCQorCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY2FjaGluZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENhY2hpbmcuQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5jYWNoaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY2FjaGluZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEVudGl0eS5DQUNIRV9UWVBFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5jYWNoaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihFbnRpdHkuU0hBUkVEX0NBQ0hFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5jYWNoaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ2FjaGluZy5GTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCQorCQlMaXN0Q2hhbmdlTGlzdGVuZXIgZW50aXRpZXNDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRFbnRpdGllc0NoYW5nZUxpc3RlbmVyKCk7CisJCXRoaXMuY2FjaGluZy5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoQ2FjaGluZy5FTlRJVElFU19MSVNULCBlbnRpdGllc0NoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5jbGVhckV2ZW50KCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7CisJCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gNzsKKwkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDQ7IC8vIDQgbWlzYyBwcm9wZXJ0aWVzCisJCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOworCQkKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDQUNIRV9UWVBFX0RFRkFVTFRfS0VZLCBDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ0FDSEVfU0laRV9ERUZBVUxUX0tFWSwgQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUUpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNIQVJFRF9DQUNIRV9ERUZBVUxUX0tFWSwgU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ0FDSEVfU0laRV9LRVksIENBQ0hFX1NJWkVfVEVTVF9WQUxVRSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ0FDSEVfVFlQRV9LRVksIENBQ0hFX1RZUEVfVEVTVF9WQUxVRSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0hBUkVEX0NBQ0hFX0tFWSwgU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEZMVVNIX0NMRUFSX0NBQ0hFX0tFWSwgRkxVU0hfQ0xFQVJfQ0FDSEVfVEVTVF9WQUxVRSk7CisJCXJldHVybjsKKwl9CisKKwkvLyAqKioqKioqKioqIExpc3RlbmVycyAqKioqKioqKioqCisJcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRFbnRpdGllc0NoYW5nZUxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKKwkJCQlDYWNoaW5nQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7CisJCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7CisJCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7CisJCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKKwkJCQlDYWNoaW5nQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKKwkJCQlDYWNoaW5nQWRhcHRlclRlc3RzLnRoaXMuZW50aXR5Q2hhbmdlZChlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjbGVhckV2ZW50KCkgeworCQlzdXBlci5jbGVhckV2ZW50KCk7CisJCXRoaXMuZW50aXRpZXNFdmVudCA9IG51bGw7CisJfQorCisJdm9pZCBlbnRpdHlDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7CisJCXRoaXMuZW50aXRpZXNFdmVudCA9IGU7CisJfQorCisJLy8gKioqKioqKioqKiBlbnRpdGllcyBsaXN0ICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0RW50aXRpZXNMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGFkZAorCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJaW50IG9yaWdpbmFsTnVtYmVyT2ZFbnRpdGllcyA9IHRoaXMuY2FjaGluZy5lbnRpdGllc1NpemUoKTsKKwkJCisJCXRoaXMuY2FjaGluZy5hZGRFbnRpdHkoRU5USVRZX1RFU1RfMik7CisJCWFzc2VydEVxdWFscygiRW50aXR5IG5vdCBhZGRlZCIsIHRoaXMuY2FjaGluZy5lbnRpdGllc1NpemUoKSwgb3JpZ2luYWxOdW1iZXJPZkVudGl0aWVzICsgMSk7CisJCQorCQkvLyB2ZXJpZnkgZXZlbnQgcmVjZWl2ZWQKKwkJYXNzZXJ0Tm90TnVsbCgiTm8gRXZlbnQgRmlyZWQuIiwgdGhpcy5lbnRpdGllc0V2ZW50KTsKKwkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKKwkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLmVudGl0aWVzRXZlbnQuZ2V0TGlzdE5hbWUoKSwgQ2FjaGluZy5FTlRJVElFU19MSVNUKTsKKworCQkvLyByZW1vdmUKKwkJdGhpcy5jbGVhckV2ZW50KCk7CisJCXRoaXMuY2FjaGluZy5yZW1vdmVFbnRpdHkoRU5USVRZX1RFU1RfMik7CisJCWFzc2VydEVxdWFscygiRW50aXR5IG5vdCByZW1vdmVkIiwgdGhpcy5jYWNoaW5nLmVudGl0aWVzU2l6ZSgpLCBvcmlnaW5hbE51bWJlck9mRW50aXRpZXMpOworCisJCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAorCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmVudGl0aWVzRXZlbnQpOworCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQorCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuZW50aXRpZXNFdmVudC5nZXRMaXN0TmFtZSgpLCBDYWNoaW5nLkVOVElUSUVTX0xJU1QpOworCX0KKworCS8vICoqKioqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqKioqCisJLyoqCisJICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBDYWNoZVR5cGVEZWZhdWx0IHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbgorCSAqIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVUeXBlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlDQUNIRV9UWVBFX0RFRkFVTFRfS0VZLAorCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX0tFWSwKKwkJCUNBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFLAorCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlVHlwZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCUNBQ0hFX1RZUEVfREVGQVVMVF9LRVksCisJCQlDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSwKKwkJCUNBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOworCX0KKworCS8vICoqKioqKioqKiogQ2FjaGVTaXplRGVmYXVsdCAqKioqKioqKioqCisJLyoqCisJICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBDYWNoZVNpemVEZWZhdWx0IHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbgorCSAqIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVTaXplRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlDQUNIRV9TSVpFX0RFRkFVTFRfS0VZLAorCQkJQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJQ0FDSEVfU0laRV9ERUZBVUxUX0tFWSwKKwkJCUNBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFLAorCQkJQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlU2l6ZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCUNBQ0hFX1NJWkVfREVGQVVMVF9LRVksCisJCQlDQUNIRV9TSVpFX0RFRkFVTFRfVEVTVF9WQUxVRSwKKwkJCUNBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOworCX0KKworCS8vICoqKioqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX0tFWSwKKwkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfS0VZLAorCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSwKKwkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNoYXJlZENhY2hlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfS0VZLAorCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSwKKwkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBDYWNoZVR5cGUgKioqKioqKioqKgorCS8qKgorCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ2FjaGVUeXBlIHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbiB0aGUgUFUKKwkgKiBvciB0aGUgbW9kZWwgY2hhbmdlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCUNBQ0hFX1RZUEVfS0VZLAorCQkJQ0FDSEVfVFlQRV9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRDYWNoaW5nUHJvcGVydHkoCisJCQlFbnRpdHkuQ0FDSEVfVFlQRV9QUk9QRVJUWSwKKwkJCUNBQ0hFX1RZUEVfS0VZLAorCQkJQ0FDSEVfVFlQRV9URVNUX1ZBTFVFLAorCQkJQ0FDSEVfVFlQRV9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDYWNoZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVDYWNoaW5nUHJvcGVydHkoCisJCQlFbnRpdHkuQ0FDSEVfVFlQRV9QUk9QRVJUWSwKKwkJCUNBQ0hFX1RZUEVfS0VZLAorCQkJQ0FDSEVfVFlQRV9URVNUX1ZBTFVFLAorCQkJQ0FDSEVfVFlQRV9URVNUX1ZBTFVFXzIpOworCX0KKworCS8vICoqKioqKioqKiogQ2FjaGVTaXplICoqKioqKioqKioKKwkvKioKKwkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIENhY2hlU2l6ZSBwcm9wZXJ0eSBieSB0aGUgQ2FjaGluZyBhZGFwdGVyIHdoZW4gdGhlIFBVCisJICogb3IgdGhlIG1vZGVsIGNoYW5nZXMuCisJICovCisJcHVibGljIHZvaWQgdGVzdFNldENhY2hlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlDQUNIRV9TSVpFX0tFWSwKKwkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0Q2FjaGluZ1Byb3BlcnR5KAorCQkJRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFksCisJCQlDQUNIRV9TSVpFX0tFWSwKKwkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRSwKKwkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlQ2FjaGluZ1Byb3BlcnR5KAorCQkJRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFksCisJCQlDQUNIRV9TSVpFX0tFWSwKKwkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRSwKKwkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFNoYXJlZENhY2hlICoqKioqKioqKioKKwkvKioKKwkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIFNoYXJlZENhY2hlIHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbiB0aGUKKwkgKiBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U2hhcmVkQ2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJU0hBUkVEX0NBQ0hFX0tFWSwKKwkJCVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRDYWNoaW5nUHJvcGVydHkoCisJCQlFbnRpdHkuU0hBUkVEX0NBQ0hFX1BST1BFUlRZLAorCQkJU0hBUkVEX0NBQ0hFX0tFWSwKKwkJCVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFLAorCQkJU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNoYXJlZENhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlQ2FjaGluZ1Byb3BlcnR5KAorCQkJRW50aXR5LlNIQVJFRF9DQUNIRV9QUk9QRVJUWSwKKwkJCVNIQVJFRF9DQUNIRV9LRVksCisJCQlTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRSwKKwkJCVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFXzIpOworCX0KKworCS8vICoqKioqKioqKiogRmx1c2hDbGVhckNhY2hlIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Rmx1c2hDbGVhckNhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCUZMVVNIX0NMRUFSX0NBQ0hFX0tFWSwKKwkJCUZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJRkxVU0hfQ0xFQVJfQ0FDSEVfS0VZLAorCQkJRkxVU0hfQ0xFQVJfQ0FDSEVfVEVTVF9WQUxVRSwKKwkJCUZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUZsdXNoQ2xlYXJDYWNoZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJRkxVU0hfQ0xFQVJfQ0FDSEVfS0VZLAorCQkJRkxVU0hfQ0xFQVJfQ0FDSEVfVEVTVF9WQUxVRSwKKwkJCUZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgeworCQlyZXR1cm4gdGhpcy5jYWNoaW5nOworCX0KKworCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNldENhY2hpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBSZXBsYWNlCisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUyKTsKKwkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMik7CisJCQorCQkvLyBSZXBsYWNlIGJ5IHNldHRpbmcgbW9kZWwgb2JqZWN0CisJCXRoaXMuY2xlYXJFdmVudCgpOworCQl0aGlzLnNldENhY2hpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUxKTsKKwkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5QWRkUmVtb3ZlQ2FjaGluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFJlbW92ZQorCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJLS10aGlzLnByb3BlcnRpZXNUb3RhbDsKKwkJLS10aGlzLm1vZGVsUHJvcGVydGllc1NpemU7CisJCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkoa2V5KTsKKwkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGtleSkpOworCQlhc3NlcnRFcXVhbHModGhpcy5tb2RlbFByb3BlcnRpZXNTaXplLCB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCAtIDEpOworCQl0aGlzLnZlcmlmeVB1dENhY2hpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCBudWxsKTsKKwkJCisJCS8vIEFkZCBvcmlnaW5hbCBQcm9wZXJ0eQorCQkrK3RoaXMucHJvcGVydGllc1RvdGFsOworCQkrK3RoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShrZXksIHRlc3RWYWx1ZTEpOworCQl0aGlzLnZlcmlmeVB1dENhY2hpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUxKTsKKwkJCisJCS8vIFNldCB0byBudWxsCisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCBudWxsKTsKKwkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgbnVsbCk7CisJCQorCQkvLyBSZXBsYWNlCisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUyKTsKKwkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0Q2FjaGluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5RXZlbnQocHJvcGVydHlOYW1lKTsKKwkJdGhpcy52ZXJpZnlDYWNoaW5nRXZlbnQocHJvcGVydHlOYW1lLCBlbnRpdHlOYW1lLCBleHBlY3RlZFZhbHVlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlDYWNoaW5nRXZlbnQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGVudGl0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gdmVyaWZ5IGV2ZW50IHZhbHVlCisJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSB0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50LmdldE5ld1ZhbHVlKCk7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVudGl0eS5DQUNIRV9UWVBFX1BST1BFUlRZKSkgeworCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGVudGl0eS5nZXRQYXJlbnQoKS5nZXRDYWNoZVR5cGVPZihlbnRpdHlOYW1lKSk7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgdGhpcy5jYWNoaW5nLmdldENhY2hlVHlwZU9mKGVudGl0eU5hbWUpKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVudGl0eS5DQUNIRV9TSVpFX1BST1BFUlRZKSkgeworCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGVudGl0eS5nZXRQYXJlbnQoKS5nZXRDYWNoZVNpemVPZihlbnRpdHlOYW1lKSk7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgdGhpcy5jYWNoaW5nLmdldENhY2hlU2l6ZU9mKGVudGl0eU5hbWUpKTsKKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVudGl0eS5TSEFSRURfQ0FDSEVfUFJPUEVSVFkpKSB7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgZW50aXR5LmdldFBhcmVudCgpLmdldFNoYXJlZENhY2hlT2YoZW50aXR5TmFtZSkpOworCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZU9mKGVudGl0eU5hbWUpKTsKKwkJfQorCQllbHNlIHsKKwkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigidmVyaWZ5Q2FjaGluZ0V2ZW50IiwgcHJvcGVydHlOYW1lKTsKKwkJfQorCX0KKworCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5DQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpKQorCQkJdGhpcy5jYWNoaW5nLnNldENhY2hlVHlwZURlZmF1bHQoKENhY2hlVHlwZSkgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZKSkKKwkJCXRoaXMuY2FjaGluZy5zZXRDYWNoZVNpemVEZWZhdWx0KChJbnRlZ2VyKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkpCisJCQl0aGlzLmNhY2hpbmcuc2V0U2hhcmVkQ2FjaGVEZWZhdWx0KChCb29sZWFuKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5GTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSkpCisJCQl0aGlzLmNhY2hpbmcuc2V0Rmx1c2hDbGVhckNhY2hlKChGbHVzaENsZWFyQ2FjaGUpIG5ld1ZhbHVlKTsKKwkJZWxzZQorCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0Q2FjaGluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVudGl0eS5DQUNIRV9UWVBFX1BST1BFUlRZKSkKKwkJCXRoaXMuY2FjaGluZy5zZXRDYWNoZVR5cGVPZihlbnRpdHlOYW1lLCAoQ2FjaGVUeXBlKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFkpKQorCQkJdGhpcy5jYWNoaW5nLnNldENhY2hlU2l6ZU9mKGVudGl0eU5hbWUsIChJbnRlZ2VyKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRW50aXR5LlNIQVJFRF9DQUNIRV9QUk9QRVJUWSkpCisJCQl0aGlzLmNhY2hpbmcuc2V0U2hhcmVkQ2FjaGVPZihlbnRpdHlOYW1lLCAoQm9vbGVhbikgbmV3VmFsdWUpOworCQllbHNlCisJCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldENhY2hpbmdQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24geworCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLmNhY2hpbmcuZ2V0Q2FjaGVTaXplRGVmYXVsdCgpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFbnRpdHkuQ0FDSEVfU0laRV9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldENhY2hlU2l6ZU9mKEVOVElUWV9URVNUKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFbnRpdHkuQ0FDSEVfVFlQRV9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldENhY2hlVHlwZU9mKEVOVElUWV9URVNUKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFbnRpdHkuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLmNhY2hpbmcuZ2V0U2hhcmVkQ2FjaGVPZihFTlRJVFlfVEVTVCk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5GTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldEZsdXNoQ2xlYXJDYWNoZSgpOworCQllbHNlCisJCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKKwkJcmV0dXJuIG1vZGVsVmFsdWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTRjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoaW5nVmFsdWVNb2RlbFRlc3RzLmphdmEKQEAgLTAsMCArMSw0NDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworCisvKioKKyAqIENhY2hpbmdWYWx1ZU1vZGVsVGVzdHMKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKK3sKKwlwcml2YXRlIENhY2hpbmcgY2FjaGluZzsKKwlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBjYWNoaW5nSG9sZGVyOworCQorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVUeXBlPiBjYWNoZVR5cGVIb2xkZXI7CisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNhY2hlVHlwZUxpc3RlbmVyOworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBjYWNoZVR5cGVFdmVudDsKKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gc2hhcmVkQ2FjaGVIb2xkZXI7CisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNoYXJlZENhY2hlTGlzdGVuZXI7CisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IHNoYXJlZENhY2hlRXZlbnQ7CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gY2FjaGVUeXBlRGVmYXVsdEhvbGRlcjsKKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY2FjaGVUeXBlRGVmYXVsdExpc3RlbmVyOworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBjYWNoZVR5cGVEZWZhdWx0RXZlbnQ7CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHNoYXJlZENhY2hlRGVmYXVsdEhvbGRlcjsKKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2hhcmVkQ2FjaGVEZWZhdWx0TGlzdGVuZXI7CisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IHNoYXJlZENhY2hlRGVmYXVsdEV2ZW50OworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUVfVEVTVF9WQUxVRSA9ICJFbXBsb3llZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgQ0FDSEVfVFlQRV9URVNUX1ZBTFVFID0gQ2FjaGVUeXBlLmhhcmRfd2VhazsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIENBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFID0gQ2FjaGVUeXBlLndlYWs7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOworCisJcHVibGljIENhY2hpbmdWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJdGhpcy5jYWNoaW5nID0gdGhpcy5zdWJqZWN0LmdldENhY2hpbmcoKTsgLy8gU3ViamVjdAorCQl0aGlzLmNhY2hpbmdIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+KHRoaXMuY2FjaGluZyk7CisJCQorCQl0aGlzLmNhY2hlVHlwZUhvbGRlciA9IHRoaXMuYnVpbGRDYWNoZVR5cGVBQSh0aGlzLmNhY2hpbmdIb2xkZXIpOworCQl0aGlzLmNhY2hlVHlwZUxpc3RlbmVyID0gdGhpcy5idWlsZENhY2hlVHlwZUNoYW5nZUxpc3RlbmVyKCk7CisJCXRoaXMuY2FjaGVUeXBlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNhY2hlVHlwZUxpc3RlbmVyKTsKKwkJdGhpcy5jYWNoZVR5cGVFdmVudCA9IG51bGw7CisJCQorCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyID0gdGhpcy5idWlsZFNoYXJlZENhY2hlQUEodGhpcy5jYWNoaW5nSG9sZGVyKTsKKwkJdGhpcy5zaGFyZWRDYWNoZUxpc3RlbmVyID0gdGhpcy5idWlsZFNoYXJlZENhY2hlQ2hhbmdlTGlzdGVuZXIoKTsKKwkJdGhpcy5zaGFyZWRDYWNoZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zaGFyZWRDYWNoZUxpc3RlbmVyKTsKKwkJdGhpcy5zaGFyZWRDYWNoZUV2ZW50ID0gbnVsbDsKKwkJCisJCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlciA9IHRoaXMuYnVpbGRDYWNoZVR5cGVEZWZhdWx0QUEodGhpcy5jYWNoaW5nSG9sZGVyKTsKKwkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0TGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2FjaGVUeXBlRGVmYXVsdENoYW5nZUxpc3RlbmVyKCk7CisJCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYWNoZVR5cGVEZWZhdWx0TGlzdGVuZXIpOworCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRFdmVudCA9IG51bGw7CisJCQorCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEhvbGRlciA9IHRoaXMuYnVpbGRTaGFyZWRDYWNoZURlZmF1bHRBQSh0aGlzLmNhY2hpbmdIb2xkZXIpOworCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdExpc3RlbmVyID0gdGhpcy5idWlsZFNoYXJlZENhY2hlRGVmYXVsdENoYW5nZUxpc3RlbmVyKCk7CisJCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdExpc3RlbmVyKTsKKwkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRFdmVudCA9IG51bGw7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKKwkJQWJzdHJhY3RNb2RlbCBzdWJqZWN0Q2FjaGluZyA9IChBYnN0cmFjdE1vZGVsKSB0aGlzLmNhY2hpbmc7IC8vIFN1YmplY3QKKwkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIENhY2hlVHlwZT4gY2FjaGVUeXBlQUEgPSAKKwkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPikgdGhpcy5jYWNoZVR5cGVIb2xkZXI7CisJCWFzc2VydFRydWUoY2FjaGVUeXBlQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7CisJCWFzc2VydFRydWUoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5DQUNIRV9UWVBFX1BST1BFUlRZKSk7CisJCQorCQljYWNoZVR5cGVBQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYWNoZVR5cGVMaXN0ZW5lcik7CisJCWFzc2VydEZhbHNlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuQ0FDSEVfVFlQRV9QUk9QRVJUWSkpOworCQlhc3NlcnRGYWxzZShjYWNoZVR5cGVBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKKwkJCisJCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPiBzaGFyZWRDYWNoZUFBID0gCisJCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KSB0aGlzLnNoYXJlZENhY2hlSG9sZGVyOworCQlhc3NlcnRUcnVlKHNoYXJlZENhY2hlQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7CisJCWFzc2VydFRydWUoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfUFJPUEVSVFkpKTsKKwkJCisJCXNoYXJlZENhY2hlQUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2hhcmVkQ2FjaGVMaXN0ZW5lcik7CisJCWFzc2VydEZhbHNlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSk7CisJCWFzc2VydEZhbHNlKHNoYXJlZENhY2hlQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7CisJCQorCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPiBjYWNoZVR5cGVEZWZhdWx0QUEgPSAKKwkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPikgdGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyOworCQlhc3NlcnRUcnVlKGNhY2hlVHlwZURlZmF1bHRBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKKwkJYXNzZXJ0VHJ1ZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSkpOworCQkKKwkJY2FjaGVUeXBlRGVmYXVsdEFBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNhY2hlVHlwZURlZmF1bHRMaXN0ZW5lcik7CisJCWFzc2VydEZhbHNlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSk7CisJCWFzc2VydEZhbHNlKGNhY2hlVHlwZURlZmF1bHRBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKKwkJCisJCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPiBzaGFyZWRDYWNoZURlZmF1bHRBQSA9IAorCQkJKFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPikgdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXI7CisJCWFzc2VydFRydWUoc2hhcmVkQ2FjaGVEZWZhdWx0QUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7CisJCWFzc2VydFRydWUoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkpOworCQkKKwkJc2hhcmVkQ2FjaGVEZWZhdWx0QUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0TGlzdGVuZXIpOworCQlhc3NlcnRGYWxzZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSk7CisJCWFzc2VydEZhbHNlKHNoYXJlZENhY2hlRGVmYXVsdEFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCisJCQlDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCAKKwkJCUNBQ0hFX1RZUEVfVEVTVF9WQUxVRSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCisJCQlDYWNoaW5nLkVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSArIEVOVElUWV9OQU1FX1RFU1RfVkFMVUUsIAorCQkJU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAorCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQsIAorCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAorCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCwgCisJCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKKwkJcmV0dXJuOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgeworCQlyZXR1cm4gdGhpcy5jYWNoaW5nOworCX0KKworCS8qKiAqKioqKiogQ2FjaGVUeXBlICoqKioqKiogKi8KKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gYnVpbGRDYWNoZVR5cGVBQShQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gc3ViamVjdEhvbGRlcikgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBDYWNoZVR5cGU+KHN1YmplY3RIb2xkZXIsIENhY2hpbmcuQ0FDSEVfVFlQRV9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q2FjaGVUeXBlT2YoRU5USVRZX05BTUVfVEVTVF9WQUxVRSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKENhY2hlVHlwZSBlbnVtVmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0Q2FjaGVUeXBlT2YoRU5USVRZX05BTUVfVEVTVF9WQUxVRSwgZW51bVZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDYWNoZVR5cGVDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgeworCQkJCUNhY2hpbmdWYWx1ZU1vZGVsVGVzdHMudGhpcy5jYWNoZVR5cGVFdmVudCA9IGU7CisJCQl9CisJCX07CisJfQorCisJLyoqICoqKioqKiBTaGFyZWRDYWNoZSAqKioqKioqICovCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNoYXJlZENhY2hlQUEoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IHN1YmplY3RIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgQ2FjaGluZy5TSEFSRURfQ0FDSEVfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTaGFyZWRDYWNoZU9mKEVOVElUWV9OQU1FX1RFU1RfVkFMVUUpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIGVudW1WYWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRTaGFyZWRDYWNoZU9mKEVOVElUWV9OQU1FX1RFU1RfVkFMVUUsIGVudW1WYWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2hhcmVkQ2FjaGVDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgeworCQkJCUNhY2hpbmdWYWx1ZU1vZGVsVGVzdHMudGhpcy5zaGFyZWRDYWNoZUV2ZW50ID0gZTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvKiogKioqKioqIENhY2hlVHlwZURlZmF1bHQgKioqKioqKiAqLworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVUeXBlPiBidWlsZENhY2hlVHlwZURlZmF1bHRBQShQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gc3ViamVjdEhvbGRlcikgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBDYWNoZVR5cGU+KHN1YmplY3RIb2xkZXIsIENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBDYWNoZVR5cGUgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDYWNoZVR5cGVEZWZhdWx0KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKENhY2hlVHlwZSBlbnVtVmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0Q2FjaGVUeXBlRGVmYXVsdChlbnVtVmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENhY2hlVHlwZURlZmF1bHRDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgeworCQkJCUNhY2hpbmdWYWx1ZU1vZGVsVGVzdHMudGhpcy5jYWNoZVR5cGVEZWZhdWx0RXZlbnQgPSBlOworCQkJfQorCQl9OworCX0KKworCS8qKiAqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKiogKi8KKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2hhcmVkQ2FjaGVEZWZhdWx0QUEoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IHN1YmplY3RIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNoYXJlZENhY2hlRGVmYXVsdCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIGVudW1WYWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRTaGFyZWRDYWNoZURlZmF1bHQoZW51bVZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTaGFyZWRDYWNoZURlZmF1bHRDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgeworCQkJCUNhY2hpbmdWYWx1ZU1vZGVsVGVzdHMudGhpcy5zaGFyZWRDYWNoZURlZmF1bHRFdmVudCA9IGU7CisJCQl9CisJCX07CisJfQorCisJLyoqICoqKioqKiBCYXNpYyBFbnRpdHkncyBQcm9wZXJ0aWVzIFRlc3RzICoqKioqKiogKi8KKworCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKKwkJRW50aXR5IGVudGl0eSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHkiLCBDYWNoZVR5cGUuZnVsbCwgMTAwLCB0cnVlKTsKKworCQl0aGlzLnZlcmlmeUNsb25lKGVudGl0eSwgZW50aXR5LmNsb25lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgeworCQlFbnRpdHkgZW50aXR5MSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHlBIiwgQ2FjaGVUeXBlLmZ1bGwsIDEwMCwgdHJ1ZSk7CisJCUVudGl0eSBlbnRpdHkyID0gdGhpcy5idWlsZEVudGl0eSgiVGVzdEVudGl0eUIiLCBDYWNoZVR5cGUuZnVsbCwgMTAwLCB0cnVlKTsKKwkJYXNzZXJ0RXF1YWxzKGVudGl0eTEsIGVudGl0eTIpOworCQlFbnRpdHkgZW50aXR5MyA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHlDIiwgQ2FjaGVUeXBlLmZ1bGwsIDEwMCwgdHJ1ZSk7CisJCWFzc2VydEVxdWFscyhlbnRpdHkxLCBlbnRpdHkzKTsKKwkJYXNzZXJ0RXF1YWxzKGVudGl0eTIsIGVudGl0eTMpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKKwkJRW50aXR5IGVudGl0eSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHkiKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuaXNFbXB0eSgpKTsKKwkJdGhpcy5jYWNoaW5nLnNldENhY2hlU2l6ZU9mKGVudGl0eS5nZXROYW1lKCksIDEwMCk7CisJCWFzc2VydEZhbHNlKGVudGl0eS5pc0VtcHR5KCkpOworCX0KKworCXByaXZhdGUgdm9pZCB2ZXJpZnlDbG9uZShFbnRpdHkgb3JpZ2luYWwsIEVudGl0eSBjbG9uZSkgeworCQlhc3NlcnROb3RTYW1lKG9yaWdpbmFsLCBjbG9uZSk7CisJCWFzc2VydEVxdWFscyhvcmlnaW5hbCwgb3JpZ2luYWwpOworCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwsIGNsb25lKTsKKwl9CisKKwlwcml2YXRlIEVudGl0eSBidWlsZEVudGl0eShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gdGhpcy5jYWNoaW5nLmFkZEVudGl0eShuYW1lKTsKKwl9CisKKwlwcml2YXRlIEVudGl0eSBidWlsZEVudGl0eShTdHJpbmcgbmFtZSwgQ2FjaGVUeXBlIGNhY2hlVHlwZSwgSW50ZWdlciBzaXplLCBCb29sZWFuIGlzU2hhcmVkKSB7CisJCUVudGl0eSBlbnRpdHkgPSB0aGlzLmNhY2hpbmcuYWRkRW50aXR5KG5hbWUpOworCQl0aGlzLmNhY2hpbmcuc2V0Q2FjaGVUeXBlT2YoZW50aXR5LmdldE5hbWUoKSwgY2FjaGVUeXBlKTsKKwkJdGhpcy5jYWNoaW5nLnNldENhY2hlU2l6ZU9mKGVudGl0eS5nZXROYW1lKCksIHNpemUpOworCQl0aGlzLmNhY2hpbmcuc2V0U2hhcmVkQ2FjaGVPZihlbnRpdHkuZ2V0TmFtZSgpLCBpc1NoYXJlZCk7CisJCXJldHVybiBlbnRpdHk7CisJfQorCQorCS8qKiAqKioqKiogQ2FjaGluZyBUZXN0cyAqKioqKioqICovCisJcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgeworCQkvKiogKioqKioqIENhY2hlVHlwZSAtIGRlZmF1bHRzIGZvciBlbnRpdHkgbGV2ZWwgY2FjaGluZyBhcmUgZXF1YWwgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgc2V0dGluZ3MgKioqKioqKiAqLworCQl0aGlzLnZlcmlmeUNhY2hlVHlwZUFBVmFsdWUoQ0FDSEVfVFlQRV9URVNUX1ZBTFVFKTsKKwkJYXNzZXJ0RXF1YWxzKHRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVEZWZhdWx0KCksIHRoaXMuY2FjaGluZy5nZXREZWZhdWx0Q2FjaGVUeXBlKCkpOworCQkvKiogKioqKioqIFNoYXJlZENhY2hlIC0gZGVmYXVsdHMgZm9yIGVudGl0eSBsZXZlbCBjYWNoaW5nIGFyZSBlcXVhbCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBzZXR0aW5ncyAqKioqKioqICovCisJCXRoaXMudmVyaWZ5U2hhcmVkQ2FjaGVBQVZhbHVlKFNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFKTsKKwkJYXNzZXJ0RXF1YWxzKHRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKSwgdGhpcy5jYWNoaW5nLmdldERlZmF1bHRTaGFyZWRDYWNoZSgpKTsKKwkJLyoqICoqKioqKiBDYWNoZVR5cGVEZWZhdWx0ICoqKioqKiogKi8KKwkJdGhpcy52ZXJpZnlDYWNoZVR5cGVEZWZhdWx0QUFWYWx1ZShDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSk7CisJCWFzc2VydEVxdWFscyhDYWNoaW5nLkRFRkFVTFRfQ0FDSEVfVFlQRV9ERUZBVUxULCB0aGlzLmNhY2hpbmcuZ2V0RGVmYXVsdENhY2hlVHlwZURlZmF1bHQoKSk7CisJCS8qKiAqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKiogKi8KKwkJdGhpcy52ZXJpZnlTaGFyZWRDYWNoZURlZmF1bHRBQVZhbHVlKFNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUpOworCQlhc3NlcnRFcXVhbHMoQ2FjaGluZy5ERUZBVUxUX1NIQVJFRF9DQUNIRV9ERUZBVUxULCB0aGlzLmNhY2hpbmcuZ2V0RGVmYXVsdFNoYXJlZENhY2hlRGVmYXVsdCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLyoqICoqKioqKiBDYWNoZVR5cGUgKioqKioqKiAqLworCQl0aGlzLmNhY2hlVHlwZUV2ZW50ID0gbnVsbDsKKwkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5jYWNoZVR5cGVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7CisJCUNhY2hlVHlwZSBuZXdDYWNoZVR5cGUgPSBDYWNoZVR5cGUuZnVsbDsKKwkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKKwkJdGhpcy5jYWNoZVR5cGVIb2xkZXIuc2V0VmFsdWUobmV3Q2FjaGVUeXBlKTsKKwkJdGhpcy52ZXJpZnlDYWNoZVR5cGVBQVZhbHVlKG5ld0NhY2hlVHlwZSk7CisJCWFzc2VydE5vdE51bGwodGhpcy5jYWNoZVR5cGVFdmVudCk7CisJCS8qKiAqKioqKiogU2hhcmVkQ2FjaGUgKioqKioqKiAqLworCQl0aGlzLnNoYXJlZENhY2hlRXZlbnQgPSBudWxsOworCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNoYXJlZENhY2hlSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOworCQlCb29sZWFuIG5ld1NoYXJlZENhY2hlID0gIVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFOworCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgorCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyLnNldFZhbHVlKG5ld1NoYXJlZENhY2hlKTsKKwkJdGhpcy52ZXJpZnlTaGFyZWRDYWNoZUFBVmFsdWUobmV3U2hhcmVkQ2FjaGUpOworCQlhc3NlcnROb3ROdWxsKHRoaXMuc2hhcmVkQ2FjaGVFdmVudCk7CisJCS8qKiAqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqICovCisJCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEV2ZW50ID0gbnVsbDsKKwkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOworCQlDYWNoZVR5cGUgbmV3Q2FjaGVUeXBlRGVmYXVsdCA9IENhY2hlVHlwZS5ub25lOworCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgorCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRIb2xkZXIuc2V0VmFsdWUobmV3Q2FjaGVUeXBlRGVmYXVsdCk7CisJCXRoaXMudmVyaWZ5Q2FjaGVUeXBlRGVmYXVsdEFBVmFsdWUobmV3Q2FjaGVUeXBlRGVmYXVsdCk7CisJCWFzc2VydE5vdE51bGwodGhpcy5jYWNoZVR5cGVEZWZhdWx0RXZlbnQpOworCQkvKiogKioqKioqIFNoYXJlZENhY2hlRGVmYXVsdCAqKioqKioqICovCisJCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQgPSBudWxsOworCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKKwkJQm9vbGVhbiBuZXdTaGFyZWRDYWNoZURlZmF1bHQgPSAhU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRTsKKwkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKKwkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXIuc2V0VmFsdWUobmV3U2hhcmVkQ2FjaGVEZWZhdWx0KTsKKwkJdGhpcy52ZXJpZnlTaGFyZWRDYWNoZURlZmF1bHRBQVZhbHVlKG5ld1NoYXJlZENhY2hlRGVmYXVsdCk7CisJCWFzc2VydE5vdE51bGwodGhpcy5zaGFyZWRDYWNoZURlZmF1bHRFdmVudCk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldE51bGxWYWx1ZSgpIHsKKwkJU3RyaW5nIG5vdERlbGV0ZWQgPSAiUHJvcGVydHkgbm90IGRlbGV0ZWQiOworCQkvKiogKioqKioqIENhY2hlVHlwZSAqKioqKioqICovCisJCXRoaXMuY2FjaGVUeXBlRXZlbnQgPSBudWxsOworCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKKwkJdGhpcy5jYWNoZVR5cGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7CisJCS8vIHRlc3RpbmcgSG9sZGVyCisJCXRoaXMudmVyaWZ5Q2FjaGVUeXBlQUFWYWx1ZShudWxsKTsKKwkJYXNzZXJ0Tm90TnVsbCh0aGlzLmNhY2hlVHlwZUV2ZW50KTsKKwkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCisJCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCBub3REZWxldGVkKTsKKwkJLyoqICoqKioqKiBTaGFyZWRDYWNoZSAqKioqKioqICovCisJCXRoaXMuc2hhcmVkQ2FjaGVFdmVudCA9IG51bGw7CisJCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgorCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyLnNldFZhbHVlKG51bGwpOworCQkvLyB0ZXN0aW5nIEhvbGRlcgorCQl0aGlzLnZlcmlmeVNoYXJlZENhY2hlQUFWYWx1ZShudWxsKTsKKwkJYXNzZXJ0Tm90TnVsbCh0aGlzLnNoYXJlZENhY2hlRXZlbnQpOworCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKKwkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFICsgRU5USVRZX05BTUVfVEVTVF9WQUxVRSwgbm90RGVsZXRlZCk7CisJCS8qKiAqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqICovCisJCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEV2ZW50ID0gbnVsbDsKKwkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCisJCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKKwkJLy8gdGVzdGluZyBIb2xkZXIKKwkJdGhpcy52ZXJpZnlDYWNoZVR5cGVEZWZhdWx0QUFWYWx1ZShudWxsKTsKKwkJYXNzZXJ0Tm90TnVsbCh0aGlzLmNhY2hlVHlwZURlZmF1bHRFdmVudCk7CisJCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcworCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQsIG5vdERlbGV0ZWQpOworCQkvKiogKioqKioqIFNoYXJlZENhY2hlRGVmYXVsdCAqKioqKioqICovCisJCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQgPSBudWxsOworCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKKwkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXIuc2V0VmFsdWUobnVsbCk7CisJCS8vIHRlc3RpbmcgSG9sZGVyCisJCXRoaXMudmVyaWZ5U2hhcmVkQ2FjaGVEZWZhdWx0QUFWYWx1ZShudWxsKTsKKwkJYXNzZXJ0Tm90TnVsbCh0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEV2ZW50KTsKKwkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCisJCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1NIQVJFRF9ERUZBVUxULCBub3REZWxldGVkKTsKKwl9CisKKwkvKiogKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKiAqLworCS8qKgorCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KKwkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgorCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgorCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlDYWNoZVR5cGVBQVZhbHVlKENhY2hlVHlwZSB0ZXN0VmFsdWUpIHsKKwkJdGhpcy52ZXJpZnlBQVZhbHVlKAorCQkJdGVzdFZhbHVlLCAKKwkJCXRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVPZihFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKSwgCisJCQl0aGlzLmNhY2hlVHlwZUhvbGRlciwgCisJCQlDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKTsKKwl9CisKKwkvKioKKwkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+CisJICogMS4gc3ViamVjdCB2YWx1ZTxicj4KKwkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KKwkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+CisJICovCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2hhcmVkQ2FjaGVBQVZhbHVlKEJvb2xlYW4gdGVzdFZhbHVlKSB7CisJCXRoaXMudmVyaWZ5QUFWYWx1ZSgKKwkJCXRlc3RWYWx1ZSwgCisJCQl0aGlzLmNhY2hpbmcuZ2V0U2hhcmVkQ2FjaGVPZihFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKSwgCisJCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyLCAKKwkJCUNhY2hpbmcuRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFICsgRU5USVRZX05BTUVfVEVTVF9WQUxVRSk7CisJfQorCisJLyoqCisJICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgorCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+CisJICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+CisJICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgorCSAqLworCXByb3RlY3RlZCB2b2lkIHZlcmlmeUNhY2hlVHlwZURlZmF1bHRBQVZhbHVlKENhY2hlVHlwZSB0ZXN0VmFsdWUpIHsKKwkJdGhpcy52ZXJpZnlBQVZhbHVlKAorCQkJdGVzdFZhbHVlLCAKKwkJCXRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVEZWZhdWx0KCksIAorCQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyLCAKKwkJCUNhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxUKTsKKwl9CisKKwkvKioKKwkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+CisJICogMS4gc3ViamVjdCB2YWx1ZTxicj4KKwkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KKwkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+CisJICovCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2hhcmVkQ2FjaGVEZWZhdWx0QUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgeworCQl0aGlzLnZlcmlmeUFBVmFsdWUoCisJCQl0ZXN0VmFsdWUsIAorCQkJdGhpcy5jYWNoaW5nLmdldFNoYXJlZENhY2hlRGVmYXVsdCgpLCAKKwkJCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyLCAKKwkJCUNhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQpOworCX0KKworCisJLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24geworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDYWNoaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDYWNoaW5nVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmRhMWJhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNhY2hpbmdUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworLyoqCisgKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCisgKi8KK3B1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ2FjaGluZ1Rlc3RzCit7CisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDYWNoaW5nVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CisJCQorCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShDYWNoaW5nQWRhcHRlclRlc3RzLmNsYXNzKTsKKwkJCisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwlwcml2YXRlIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDYWNoaW5nVGVzdHMoKSB7CisJCXN1cGVyKCk7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb25BZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb25BZGFwdGVyVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjRiMThmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5CYXRjaFdyaXRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CisKKy8qKgorICogIENvbm5lY3Rpb25BZGFwdGVyVGVzdHMKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkFkYXB0ZXJUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKK3sKKwlwcml2YXRlIENvbm5lY3Rpb24gY29ubmVjdGlvbjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIFRSQU5TQUNUSU9OX1RZUEVfVEVTVF9WQUxVRSA9IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBUUkFOU0FDVElPTl9UWVBFX1RFU1RfVkFMVUVfMiA9IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5KVEE7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKVEFfREFUQV9TT1VSQ0VfVEVTVF9WQUxVRSA9ICJUZXN0X0pUQSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlRBX0RBVEFfU09VUkNFX1RFU1RfVkFMVUVfMiA9ICJUZXN0X0pUQV8yIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTl9KVEFfREFUQV9TT1VSQ0VfVEVTVF9WQUxVRSA9ICJUZXN0X05vbl9KVEEiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTl9KVEFfREFUQV9TT1VSQ0VfVEVTVF9WQUxVRV8yID0gIlRlc3RfTm9uX0pUQV8yIjsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVfU1FMX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfTkFUSVZFX1NRTDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gTkFUSVZFX1NRTF9URVNUX1ZBTFVFID0gZmFsc2U7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIE5BVElWRV9TUUxfVEVTVF9WQUxVRV8yID0gISBOQVRJVkVfU1FMX1RFU1RfVkFMVUU7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVRDSF9XUklUSU5HX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJhdGNoV3JpdGluZyBCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUUgPSBCYXRjaFdyaXRpbmcub3JhY2xlX2pkYmM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCYXRjaFdyaXRpbmcgQkFUQ0hfV1JJVElOR19URVNUX1ZBTFVFXzIgPSBCYXRjaFdyaXRpbmcuYnVmZmVyZWQ7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU1RBVEVNRU5UU19LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIENBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRSA9IGZhbHNlOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUVfMiA9ICEgQ0FDSEVfU1RBVEVNRU5UU19URVNUX1ZBTFVFOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NUQVRFTUVOVFNfU0laRV9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFNfU0laRTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUUgPSAxMDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFXzIgPSAyMDA7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfRFJJVkVSOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9URVNUX1ZBTFVFID0gImNvbm5lY3Rpb24uZHJpdmVyIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfVEVTVF9WQUxVRV8yID0gImNvbm5lY3Rpb24uZHJpdmVyLjIiOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1VSTDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfVVNFUjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1RFU1RfVkFMVUUgPSAidGVzdCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfUEFTU1dPUkQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5EX1BBUkFNRVRFUlNfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFID0gZmFsc2U7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFXzIgPSAhIEJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19TSEFSRUQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUUgPSBmYWxzZTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRV8yID0gISBSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfTUlOX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19NSU47CisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUgPSAxMDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUVfMiA9IDIwMDsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0NPTk5FQ1RJT05TX01BWF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFID0gMTAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFXzIgPSAyMDA7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfQ09OTkVDVElPTlNfTUlOX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUlOOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBXUklURV9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSA9IDEwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUVfMiA9IDIwMDsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUklURV9DT05ORUNUSU9OU19NQVhfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NQVg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFID0gMTAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yID0gMjAwOworCisJcHVibGljIENvbm5lY3Rpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJdGhpcy5jb25uZWN0aW9uID0gdGhpcy5zdWJqZWN0LmdldENvbm5lY3Rpb24oKTsKKwkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKKwkJCisJCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uTkFUSVZFX1NRTF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uQkFUQ0hfV1JJVElOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLkJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQkKKwkJdGhpcy5jbGVhckV2ZW50KCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKKwkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSAxNDsgLy8gRWNsaXBzZUxpbmsgcHJvcGVydGllcworCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgNDsgLy8gNCBtaXNjIHByb3BlcnRpZXMKKwkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7CisJCQorCQkvLyBJbml0aWFsaXplcyBFY2xpcHNlTGluayBwcm9wZXJ0aWVzCisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTkFUSVZFX1NRTF9LRVksIE5BVElWRV9TUUxfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShCQVRDSF9XUklUSU5HX0tFWSwgQkFUQ0hfV1JJVElOR19URVNUX1ZBTFVFKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDQUNIRV9TVEFURU1FTlRTX0tFWSwgQ0FDSEVfU1RBVEVNRU5UU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KENBQ0hFX1NUQVRFTUVOVFNfU0laRV9LRVksIENBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KERSSVZFUl9LRVksIERSSVZFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFVSTF9LRVksIFVSTF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFVTRVJfS0VZLCBVU0VSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUEFTU1dPUkRfS0VZLCBQQVNTV09SRF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEJJTkRfUEFSQU1FVEVSU19LRVksIEJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjIiLCAidmFsdWUuMiIpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjMiLCAidmFsdWUuMyIpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX0tFWSwgUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShSRUFEX0NPTk5FQ1RJT05TX01JTl9LRVksIFJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUkVBRF9DT05ORUNUSU9OU19NQVhfS0VZLCBSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFdSSVRFX0NPTk5FQ1RJT05TX01JTl9LRVksIFdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFdSSVRFX0NPTk5FQ1RJT05TX01BWF9LRVksIFdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjQiLCAidmFsdWUuNCIpOworCQkKKwkJLy8gSW5pdGlhbGl6ZXMgUFUgZWxlbWVudHMKKwkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoVFJBTlNBQ1RJT05fVFlQRV9URVNUX1ZBTFVFKTsKKwkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXRKdGFEYXRhU291cmNlKEpUQV9EQVRBX1NPVVJDRV9URVNUX1ZBTFVFKTsKKwkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXROb25KdGFEYXRhU291cmNlKE5PTl9KVEFfREFUQV9TT1VSQ0VfVEVTVF9WQUxVRSk7CisJCXJldHVybjsKKwl9CisKKwkvLyAqKioqKioqKioqIE5hdGl2ZVNxbCB0ZXN0cyAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdFNldE5hdGl2ZVNxbCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlOQVRJVkVfU1FMX0tFWSwKKwkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlOQVRJVkVfU1FMX0tFWSwKKwkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRSwKKwkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTmF0aXZlU3FsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlOQVRJVkVfU1FMX0tFWSwKKwkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRSwKKwkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIEJhdGNoV3JpdGluZyB0ZXN0cyAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdFNldEJhdGNoV3JpdGluZygpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlCQVRDSF9XUklUSU5HX0tFWSwKKwkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlCQVRDSF9XUklUSU5HX0tFWSwKKwkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRSwKKwkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQmF0Y2hXcml0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlCQVRDSF9XUklUSU5HX0tFWSwKKwkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRSwKKwkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIENhY2hlU3RhdGVtZW50cyB0ZXN0cyAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdFNldENhY2hlU3RhdGVtZW50cygpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlDQUNIRV9TVEFURU1FTlRTX0tFWSwKKwkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlDQUNIRV9TVEFURU1FTlRTX0tFWSwKKwkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRSwKKwkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ2FjaGVTdGF0ZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlDQUNIRV9TVEFURU1FTlRTX0tFWSwKKwkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRSwKKwkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRV8yKTsKKwl9CisJCisJLy8gKioqKioqKioqKiBDYWNoZVN0YXRlbWVudHNTaXplIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfS0VZLAorCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX0tFWSwKKwkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFLAorCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlU3RhdGVtZW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9LRVksCisJCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRSwKKwkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFXzIpOworCX0KKworCS8vICoqKioqKioqKiogRHJpdmVyIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RHJpdmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCURSSVZFUl9LRVksCisJCQlEUklWRVJfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlEUklWRVJfS0VZLAorCQkJRFJJVkVSX1RFU1RfVkFMVUUsCisJCQlEUklWRVJfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRHJpdmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlEUklWRVJfS0VZLAorCQkJRFJJVkVSX1RFU1RfVkFMVUUsCisJCQlEUklWRVJfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFVybCB0ZXN0cyAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdFNldFVybCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlVUkxfS0VZLAorCQkJVVJMX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJVVJMX0tFWSwKKwkJCVVSTF9URVNUX1ZBTFVFLAorCQkJVVJMX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVVybCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJVVJMX0tFWSwKKwkJCVVSTF9URVNUX1ZBTFVFLAorCQkJVVJMX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBVc2VyIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VXNlcigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlVU0VSX0tFWSwKKwkJCVVTRVJfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlVU0VSX0tFWSwKKwkJCVVTRVJfVEVTVF9WQUxVRSwKKwkJCVVTRVJfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVXNlcigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJVVNFUl9LRVksCisJCQlVU0VSX1RFU1RfVkFMVUUsCisJCQlVU0VSX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBQYXNzd29yZCB0ZXN0cyAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdFNldFBhc3N3b3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVBBU1NXT1JEX0tFWSwKKwkJCVBBU1NXT1JEX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJUEFTU1dPUkRfS0VZLAorCQkJUEFTU1dPUkRfVEVTVF9WQUxVRSwKKwkJCVBBU1NXT1JEX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVBhc3N3b3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlQQVNTV09SRF9LRVksCisJCQlQQVNTV09SRF9URVNUX1ZBTFVFLAorCQkJUEFTU1dPUkRfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIEJpbmRQYXJhbWV0ZXJzIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0QmluZFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJQklORF9QQVJBTUVURVJTX0tFWSwKKwkJCUJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCUJJTkRfUEFSQU1FVEVSU19LRVksCisJCQlCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRSwKKwkJCUJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVCaW5kUGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJQklORF9QQVJBTUVURVJTX0tFWSwKKwkJCUJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFLAorCQkJQklORF9QQVJBTUVURVJTX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNTaGFyZWQgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfS0VZLAorCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9LRVksCisJCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFLAorCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUmVhZENvbm5lY3Rpb25zU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9LRVksCisJCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFLAorCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRV8yKTsKKwl9CisJCisJLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNNaW4gdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWFkQ29ubmVjdGlvbnNNaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fS0VZLAorCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9LRVksCisJCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLAorCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUmVhZENvbm5lY3Rpb25zTWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9LRVksCisJCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLAorCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRV8yKTsKKwl9CisJCisJLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNNYXggdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWFkQ29ubmVjdGlvbnNNYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfS0VZLAorCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9LRVksCisJCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLAorCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUmVhZENvbm5lY3Rpb25zTWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9LRVksCisJCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLAorCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yKTsKKwl9CisJCisJLy8gKioqKioqKioqKiBXcml0ZUNvbm5lY3Rpb25zTWluIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0V3JpdGVDb25uZWN0aW9uc01pbigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlXUklURV9DT05ORUNUSU9OU19NSU5fS0VZLAorCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX0tFWSwKKwkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLAorCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdyaXRlQ29ubmVjdGlvbnNNaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9LRVksCisJCQlXUklURV9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSwKKwkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFXzIpOworCX0KKwkKKwkvLyAqKioqKioqKioqIFdyaXRlQ29ubmVjdGlvbnNNYXggdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRXcml0ZUNvbm5lY3Rpb25zTWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9LRVksCisJCQlXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlXUklURV9DT05ORUNUSU9OU19NQVhfS0VZLAorCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUsCisJCQlXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV3JpdGVDb25uZWN0aW9uc01heCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX0tFWSwKKwkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLAorCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24geworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLk5BVElWRV9TUUxfUFJPUEVSVFkpKQorCQkJdGhpcy5jb25uZWN0aW9uLnNldE5hdGl2ZVNxbCgoQm9vbGVhbikgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQkFUQ0hfV1JJVElOR19QUk9QRVJUWSkpCisJCQl0aGlzLmNvbm5lY3Rpb24uc2V0QmF0Y2hXcml0aW5nKChCYXRjaFdyaXRpbmcpIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkNBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFkpKQorCQkJdGhpcy5jb25uZWN0aW9uLnNldENhY2hlU3RhdGVtZW50cygoQm9vbGVhbikgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZKSkKKwkJCXRoaXMuY29ubmVjdGlvbi5zZXRDYWNoZVN0YXRlbWVudHNTaXplKChJbnRlZ2VyKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFkpKQorCQkJdGhpcy5jb25uZWN0aW9uLnNldERyaXZlcigoU3RyaW5nKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VUkxfUFJPUEVSVFkpKQorCQkJdGhpcy5jb25uZWN0aW9uLnNldFVybCgoU3RyaW5nKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VU0VSX1BST1BFUlRZKSkKKwkJCXRoaXMuY29ubmVjdGlvbi5zZXRVc2VyKChTdHJpbmcpIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlBBU1NXT1JEX1BST1BFUlRZKSkKKwkJCXRoaXMuY29ubmVjdGlvbi5zZXRQYXNzd29yZCgoU3RyaW5nKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5CSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFkpKQorCQkJdGhpcy5jb25uZWN0aW9uLnNldEJpbmRQYXJhbWV0ZXJzKChCb29sZWFuKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSkpCisJCQl0aGlzLmNvbm5lY3Rpb24uc2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKChCb29sZWFuKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSkpCisJCQl0aGlzLmNvbm5lY3Rpb24uc2V0UmVhZENvbm5lY3Rpb25zTWluKChJbnRlZ2VyKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSkpCisJCQl0aGlzLmNvbm5lY3Rpb24uc2V0UmVhZENvbm5lY3Rpb25zTWF4KChJbnRlZ2VyKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpKQorCQkJdGhpcy5jb25uZWN0aW9uLnNldFdyaXRlQ29ubmVjdGlvbnNNaW4oKEludGVnZXIpIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLldSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSkpCisJCQl0aGlzLmNvbm5lY3Rpb24uc2V0V3JpdGVDb25uZWN0aW9uc01heCgoSW50ZWdlcikgbmV3VmFsdWUpOworCQllbHNlCisJCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24geworCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uTkFUSVZFX1NRTF9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldE5hdGl2ZVNxbCgpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQkFUQ0hfV1JJVElOR19QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldEJhdGNoV3JpdGluZygpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldENhY2hlU3RhdGVtZW50cygpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uRFJJVkVSX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0RHJpdmVyKCk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VUkxfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRVcmwoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlVTRVJfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRVc2VyKCk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5QQVNTV09SRF9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFBhc3N3b3JkKCk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5CSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRCaW5kUGFyYW1ldGVycygpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0UmVhZENvbm5lY3Rpb25zTWluKCk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFJlYWRDb25uZWN0aW9uc01heCgpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0V3JpdGVDb25uZWN0aW9uc01pbigpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0V3JpdGVDb25uZWN0aW9uc01heCgpOworCQllbHNlCisJCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKKwkJcmV0dXJuIG1vZGVsVmFsdWU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7CisJCXJldHVybiB0aGlzLmNvbm5lY3Rpb247CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNvbm5lY3Rpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNvbm5lY3Rpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MjlhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ29ubmVjdGlvblRlc3RzLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisvKioKKyAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKKyAqLworcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDb25uZWN0aW9uVGVzdHMKK3sKKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNvbm5lY3Rpb25UZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKwkJCisvLwkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbm5lY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29ubmVjdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7CisJCQorCQlyZXR1cm4gc3VpdGU7CisJfQorCisJcHJpdmF0ZSBKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ29ubmVjdGlvblRlc3RzKCkgeworCQlzdXBlcigpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9DdXN0b21pemF0aW9uQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9DdXN0b21pemF0aW9uQWRhcHRlclRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxZTg4ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0N1c3RvbWl6YXRpb25BZGFwdGVyVGVzdHMuamF2YQpAQCAtMCwwICsxLDcxMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5Qcm9maWxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uV2VhdmluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKKworLyoqCisgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIG1vZGVsIG9iamVjdHMgYnkgdGhlIEN1c3RvbWl6YXRpb24gYWRhcHRlciB3aGVuIHRoZQorICogUGVyc2lzdGVuY2VVbml0IGNoYW5nZXMuCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEN1c3RvbWl6YXRpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCit7CisJcHJpdmF0ZSBDdXN0b21pemF0aW9uIGN1c3RvbWl6YXRpb247CisJcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgZW50aXRpZXNFdmVudDsKKwlwcml2YXRlIExpc3RDaGFuZ2VFdmVudCBzZXNzaW9uQ3VzdG9taXplcnNFdmVudDsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9URVNUID0gIkVtcGxveWVlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEVTVF8yID0gIkFkZHJlc3MiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhST1dfRVhDRVBUSU9OU19LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRSA9IGZhbHNlOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUVfMiA9ICEgVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19MQVpZX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklOR19MQVpZOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRSA9IGZhbHNlOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRV8yID0gISBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUUgPSBmYWxzZTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRV8yID0gISBXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRSA9IGZhbHNlOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFXzIgPSAhIFdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUU7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0lOVEVSTkFMX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklOR19JTlRFUk5BTDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19JTlRFUk5BTF9URVNUX1ZBTFVFID0gZmFsc2U7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRV8yID0gISBXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUU7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0VBR0VSX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklOR19FQUdFUjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19FQUdFUl9URVNUX1ZBTFVFID0gdHJ1ZTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19FQUdFUl9URVNUX1ZBTFVFXzIgPSAhIFdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fT05MWV9LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1ZBTElEQVRJT05fT05MWTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUUgPSBmYWxzZTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUVfMiA9ICEgVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUU7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DVVNUT01JWkVSX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUVfMiA9ICJqYXZhLmxhbmcuQm9vbGVhbiI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklORzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFdlYXZpbmcgV0VBVklOR19URVNUX1ZBTFVFID0gV2VhdmluZy5mYWxzZV87CisJcHVibGljIHN0YXRpYyBmaW5hbCBXZWF2aW5nIFdFQVZJTkdfVEVTVF9WQUxVRV8yID0gV2VhdmluZy5zdGF0aWNfOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NSVpFUl9LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiArIEVOVElUWV9URVNUOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTUlaRVJfVEVTVF9WQUxVRSA9ICJhY21lLnNlc3Npb25zLkRlc2NyaXB0b3JDdXN0b21pemVyIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01JWkVSX1RFU1RfVkFMVUVfMiA9ICJhY21lLnNlc3Npb25zLkN1c3RvbWl6ZXIiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVSX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfUFJPRklMRVI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvZmlsZXIgUFJPRklMRVJfVEVTVF9WQUxVRSA9IFByb2ZpbGVyLnF1ZXJ5X21vbml0b3I7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVSX1RFU1RfVkFMVUVfMiA9ICJjdXN0b20ucHJvZmlsZXIudGVzdCI7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX0hBTkRMRVJfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFID0gImFjbWUuQ3VzdG9tU2Vzc2lvbkV2ZW50TGlzdGVuZXIiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9IQU5ETEVSX1RFU1RfVkFMVUVfMiA9ICJvcmFjbGUuc2Vzc2lvbnMuQ3VzdG9tU2Vzc2lvbkV2ZW50TGlzdGVuZXIiOworCQorCXB1YmxpYyBDdXN0b21pemF0aW9uQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXRoaXMuY3VzdG9taXphdGlvbiA9IHRoaXMuc3ViamVjdC5nZXRDdXN0b21pemF0aW9uKCk7CisJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7CisJCQorCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLlRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLldFQVZJTkdfTEFaWV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLldFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0lOVEVSTkFMX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0VBR0VSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5XRUFWSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5WQUxJREFUSU9OX09OTFlfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihFbnRpdHkuREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLlBST0ZJTEVSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5FWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisKKwkJTGlzdENoYW5nZUxpc3RlbmVyIHNlc3Npb25DdXN0b21pemVyc0NoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFNlc3Npb25DdXN0b21pemVyc0NoYW5nZUxpc3RlbmVyKCk7CisJCXRoaXMuY3VzdG9taXphdGlvbi5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfTElTVCwgc2Vzc2lvbkN1c3RvbWl6ZXJzQ2hhbmdlTGlzdGVuZXIpOworCQkKKwkJTGlzdENoYW5nZUxpc3RlbmVyIGVudGl0aWVzQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRW50aXRpZXNDaGFuZ2VMaXN0ZW5lcigpOworCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkTGlzdENoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uRU5USVRJRVNfTElTVCwgZW50aXRpZXNDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY2xlYXJFdmVudCgpOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7CisJCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gMTI7CisJCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyA0OyAvLyA0IG1pc2MgcHJvcGVydGllcworCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKKwkJCisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVEhST1dfRVhDRVBUSU9OU19LRVksIFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXRUFWSU5HX0xBWllfS0VZLCBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19LRVksIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZLCBXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFdFQVZJTkdfSU5URVJOQUxfS0VZLCBXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV0VBVklOR19FQUdFUl9LRVksIFdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShWQUxJREFUSU9OX09OTFlfS0VZLCBWQUxJREFUSU9OX09OTFlfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4yIiwgInZhbHVlLjIiKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTRVNTSU9OX0NVU1RPTUlaRVJfS0VZLCBTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXRUFWSU5HX0tFWSwgV0VBVklOR19URVNUX1ZBTFVFKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS40IiwgInZhbHVlLjQiKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDVVNUT01JWkVSX0tFWSwgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShQUk9GSUxFUl9LRVksIFBST0ZJTEVSX1RFU1RfVkFMVUUpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEVYQ0VQVElPTl9IQU5ETEVSX0tFWSwgRVhDRVBUSU9OX0hBTkRMRVJfVEVTVF9WQUxVRSk7CisJCXJldHVybjsKKwl9CisKKwkvLyAqKioqKioqKioqIExpc3RlbmVycyAqKioqKioqKioqCisJcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRFbnRpdGllc0NoYW5nZUxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKKwkJCQlDdXN0b21pemF0aW9uQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7CisJCQkJQ3VzdG9taXphdGlvbkFkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7CisJCQkJQ3VzdG9taXphdGlvbkFkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7CisJCQkJQ3VzdG9taXphdGlvbkFkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKKwkJCQlDdXN0b21pemF0aW9uQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKKwkJCQlDdXN0b21pemF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZW50aXR5Q2hhbmdlZChlKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZXNzaW9uQ3VzdG9taXplcnNDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7CisJCQkJQ3VzdG9taXphdGlvbkFkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgeworCQkJCUN1c3RvbWl6YXRpb25BZGFwdGVyVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgeworCQkJCUN1c3RvbWl6YXRpb25BZGFwdGVyVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgeworCQkJCUN1c3RvbWl6YXRpb25BZGFwdGVyVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7CisJCQkJQ3VzdG9taXphdGlvbkFkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7CisJCQkJQ3VzdG9taXphdGlvbkFkYXB0ZXJUZXN0cy50aGlzLnNlc3Npb25DdXN0b21pemVyQ2hhbmdlZChlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjbGVhckV2ZW50KCkgeworCQlzdXBlci5jbGVhckV2ZW50KCk7CisJCXRoaXMuZW50aXRpZXNFdmVudCA9IG51bGw7CisJCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQgPSBudWxsOworCX0KKworCXZvaWQgZW50aXR5Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgeworCQl0aGlzLmVudGl0aWVzRXZlbnQgPSBlOworCX0KKworCXZvaWQgc2Vzc2lvbkN1c3RvbWl6ZXJDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7CisJCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQgPSBlOworCX0KKworCS8vICoqKioqKioqKiogZW50aXRpZXMgbGlzdCAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdEVudGl0aWVzTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBhZGQKKwkJdGhpcy5jbGVhckV2ZW50KCk7CisJCXRoaXMuY3VzdG9taXphdGlvbi5hZGRFbnRpdHkoRU5USVRZX1RFU1RfMik7CisJCQorCQkvLyB2ZXJpZnkgZXZlbnQgcmVjZWl2ZWQKKwkJYXNzZXJ0Tm90TnVsbCgiTm8gRXZlbnQgRmlyZWQuIiwgdGhpcy5lbnRpdGllc0V2ZW50KTsKKwkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKKwkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLmVudGl0aWVzRXZlbnQuZ2V0TGlzdE5hbWUoKSwgQ3VzdG9taXphdGlvbi5FTlRJVElFU19MSVNUKTsKKwkJCisJCS8vIHJlbW92ZQorCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJdGhpcy5jdXN0b21pemF0aW9uLnJlbW92ZUVudGl0eShFTlRJVFlfVEVTVF8yKTsKKwkJCisJCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAorCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmVudGl0aWVzRXZlbnQpOworCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQorCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuZW50aXRpZXNFdmVudC5nZXRMaXN0TmFtZSgpLCBDdXN0b21pemF0aW9uLkVOVElUSUVTX0xJU1QpOworCX0KKworCS8vICoqKioqKioqKiogc2Vzc2lvbkN1c3RvbWl6ZXJzIGxpc3QgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXNzaW9uQ3VzdG9taXplcnNMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGFkZAorCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXMuY3VzdG9taXphdGlvbi5hZGRTZXNzaW9uQ3VzdG9taXplcihTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKKwkJCisJCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAorCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50KTsKKwkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKKwkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50LmdldExpc3ROYW1lKCksIEN1c3RvbWl6YXRpb24uU0VTU0lPTl9DVVNUT01JWkVSX0xJU1QpOworCQkKKwkJLy8gcmVtb3ZlCisJCXRoaXMuY2xlYXJFdmVudCgpOworCQkKKwkJdGhpcy5jdXN0b21pemF0aW9uLnJlbW92ZVNlc3Npb25DdXN0b21pemVyKGNsYXNzTmFtZSk7CisJCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAorCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50KTsKKwkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKKwkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50LmdldExpc3ROYW1lKCksIEN1c3RvbWl6YXRpb24uU0VTU0lPTl9DVVNUT01JWkVSX0xJU1QpOworCX0KKworCS8vICoqKioqKioqKiogVGhyb3dFeGNlcHRpb25zIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VGhyb3dFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVRIUk9XX0VYQ0VQVElPTlNfS0VZLAorCQkJVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCVRIUk9XX0VYQ0VQVElPTlNfS0VZLAorCQkJVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFLAorCQkJVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUaHJvd0V4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCVRIUk9XX0VYQ0VQVElPTlNfS0VZLAorCQkJVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFLAorCQkJVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFXzIpOworCX0KKworCS8vICoqKioqKioqKiogV2VhdmluZ0xhenkgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRXZWF2aW5nTGF6eSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlXRUFWSU5HX0xBWllfS0VZLAorCQkJV0VBVklOR19MQVpZX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJV0VBVklOR19MQVpZX0tFWSwKKwkJCVdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFLAorCQkJV0VBVklOR19MQVpZX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmdMYXp5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlXRUFWSU5HX0xBWllfS0VZLAorCQkJV0VBVklOR19MQVpZX1RFU1RfVkFMVUUsCisJCQlXRUFWSU5HX0xBWllfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFdlYXZpbmdDaGFuZ2VUcmFja2luZyB0ZXN0cyAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmdDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19LRVksCisJCQlXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX0tFWSwKKwkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUUsCisJCQlXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX0tFWSwKKwkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUUsCisJCQlXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFXzIpOworCX0KKworCS8vICoqKioqKioqKiogV2VhdmluZ0ZldGNoR3JvdXBzIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0V2VhdmluZ0ZldGNoR3JvdXBzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVdFQVZJTkdfRkVUQ0hfR1JPVVBTX0tFWSwKKwkJCVdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZLAorCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRSwKKwkJCVdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmdGZXRjaEdyb3VwcygpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZLAorCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRSwKKwkJCVdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBXZWF2aW5nSW50ZXJuYWwgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRXZWF2aW5nSW50ZXJuYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJV0VBVklOR19JTlRFUk5BTF9LRVksCisJCQlXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJV0VBVklOR19JTlRFUk5BTF9LRVksCisJCQlXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUUsCisJCQlXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmdJbnRlcm5hbCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJV0VBVklOR19JTlRFUk5BTF9LRVksCisJCQlXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUUsCisJCQlXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBXZWF2aW5nRWFnZXIgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRXZWF2aW5nRWFnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJV0VBVklOR19FQUdFUl9LRVksCisJCQlXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJV0VBVklOR19FQUdFUl9LRVksCisJCQlXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUUsCisJCQlXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmdFYWdlcigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJV0VBVklOR19FQUdFUl9LRVksCisJCQlXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUUsCisJCQlXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBTZXNzaW9uQ3VzdG9taXplciB0ZXN0cyAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdFNldFNlc3Npb25DdXN0b21pemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVNFU1NJT05fQ1VTVE9NSVpFUl9LRVksCisJCQlTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0U2Vzc2lvbkN1c3RvbWl6YXRpb25Qcm9wZXJ0eSgKKwkJCUN1c3RvbWl6YXRpb24uU0VTU0lPTl9DVVNUT01JWkVSX1BST1BFUlRZLAorCQkJU0VTU0lPTl9DVVNUT01JWkVSX0tFWSwKKwkJCVNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFLAorCQkJU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlc3Npb25DdXN0b21pemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlU2Vzc2lvbkN1c3RvbWl6YXRpb25Qcm9wZXJ0eSgKKwkJCUN1c3RvbWl6YXRpb24uU0VTU0lPTl9DVVNUT01JWkVSX1BST1BFUlRZLAorCQkJU0VTU0lPTl9DVVNUT01JWkVSX0tFWSwKKwkJCVNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFLAorCQkJU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBXZWF2aW5nIHRlc3RzICoqKioqKioqKioKKwkvKioKKwkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIFdlYXZpbmcgcHJvcGVydHkgYnkgdGhlIEN1c3RvbWl6YXRpb24gYWRhcHRlciB3aGVuCisJICogdGhlIFBVIG9yIHRoZSBtb2RlbCBjaGFuZ2VzLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTZXRXZWF2aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVdFQVZJTkdfS0VZLAorCQkJV0VBVklOR19URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCVdFQVZJTkdfS0VZLAorCQkJV0VBVklOR19URVNUX1ZBTFVFLAorCQkJV0VBVklOR19URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVXZWF2aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlXRUFWSU5HX0tFWSwKKwkJCVdFQVZJTkdfVEVTVF9WQUxVRSwKKwkJCVdFQVZJTkdfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Pbmx5IHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRhdGlvbk9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJVkFMSURBVElPTl9PTkxZX0tFWSwKKwkJCVZBTElEQVRJT05fT05MWV9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCVZBTElEQVRJT05fT05MWV9LRVksCisJCQlWQUxJREFUSU9OX09OTFlfVEVTVF9WQUxVRSwKKwkJCVZBTElEQVRJT05fT05MWV9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVWYWxpZGF0aW9uT25seSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJVkFMSURBVElPTl9PTkxZX0tFWSwKKwkJCVZBTElEQVRJT05fT05MWV9URVNUX1ZBTFVFLAorCQkJVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBFeGNlcHRpb25IYW5kbGVyIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RXhjZXB0aW9uSGFuZGxlcigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlFWENFUFRJT05fSEFORExFUl9LRVksCisJCQlFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCUVYQ0VQVElPTl9IQU5ETEVSX0tFWSwKKwkJCUVYQ0VQVElPTl9IQU5ETEVSX1RFU1RfVkFMVUUsCisJCQlFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFeGNlcHRpb25IYW5kbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlFWENFUFRJT05fSEFORExFUl9LRVksCisJCQlFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFLAorCQkJRVhDRVBUSU9OX0hBTkRMRVJfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIEN1c3RvbWl6YXRpb24gY2xhc3MgKioqKioqKioqKgorCS8qKgorCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ3VzdG9taXphdGlvbiBwcm9wZXJ0eSBieSB0aGUgQ3VzdG9taXphdGlvbiBhZGFwdGVyIHdoZW4gdGhlCisJICogUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCisJICovCisJcHVibGljIHZvaWQgdGVzdFNldEN1c3RvbWl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJQ1VTVE9NSVpFUl9LRVksCisJCQlDVVNUT01JWkVSX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldEN1c3RvbWl6YXRpb25Qcm9wZXJ0eSgKKwkJCUVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFksCisJCQlDVVNUT01JWkVSX0tFWSwKKwkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRSwKKwkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ3VzdG9taXphdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZUN1c3RvbWl6YXRpb25Qcm9wZXJ0eSgKKwkJCUVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFksCisJCQlDVVNUT01JWkVSX0tFWSwKKwkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRSwKKwkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKKwl9CisJCisJLy8gKioqKioqKioqKiBQcm9maWxlciB0ZXN0cyAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdFNldFByb2ZpbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVBST0ZJTEVSX0tFWSwKKwkJCXRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKFBST0ZJTEVSX1RFU1RfVkFMVUUpKTsgLy8gbW9kZWwgaXMgc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlCisJCS8vIHZlcmlmeSBzZXQgZW51bSB2YWx1ZQorCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJUFJPRklMRVJfS0VZLAorCQkJUFJPRklMRVJfVEVTVF9WQUxVRSwKKwkJCVBST0ZJTEVSX1RFU1RfVkFMVUVfMik7CisJCS8vIHZlcmlmeSBzZXQgY3VzdG9tIGFuZCBsaXRlcmFsIHZhbHVlCisJCXRoaXMudmVyaWZ5U2V0UHJvZmlsZXIoCisJCQlQUk9GSUxFUl9LRVksCisJCQlQUk9GSUxFUl9URVNUX1ZBTFVFLAorCQkJUFJPRklMRVJfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUHJvZmlsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCVBST0ZJTEVSX0tFWSwKKwkJCVBST0ZJTEVSX1RFU1RfVkFMVUUsCisJCQlQUk9GSUxFUl9URVNUX1ZBTFVFXzIpOworCX0KKwkKKwkvKioKKwkgKiBWZXJpZmllcyBzZXR0aW5nIGN1c3RvbSBwcm9maWxlciBhbmQgbGl0ZXJhbHMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0UHJvZmlsZXIoU3RyaW5nIGVsS2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24geworCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KTsKKwkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOworCQkvLyB0ZXN0IHNldCBjdXN0b20gcHJvZmlsZXIuCisJCXRoaXMuY2xlYXJFdmVudCgpOworCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7CisJCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKKworCQkvLyB0ZXN0IHNldCAoUHJvZmlsZXIpIG51bGwKKwkJdGhpcy5jbGVhckV2ZW50KCk7CisJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRQcm9maWxlcigoUHJvZmlsZXIpIG51bGwpOworCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKKwkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOworCQkKKwkJLy8gdGVzdCBzZXQgZW51bSBsaXRlcmFsCisJCXRoaXMuY2xlYXJFdmVudCgpOworCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMS50b1N0cmluZygpKTsKKwkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7CisJCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZih0ZXN0VmFsdWUxKSk7CisKKwkJLy8gdGVzdCBzZXQgKFN0cmluZykgbnVsbAorCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJdGhpcy5jdXN0b21pemF0aW9uLnNldFByb2ZpbGVyKChTdHJpbmcpIG51bGwpOworCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKKwkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOworCX0KKworCisKKwkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCisKKwkvLyAqKioqKioqKioqIHZlcmlmeSBTZXNzaW9uQ3VzdG9taXplciBwcm9wZXJ0eSAqKioqKioqKioqCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0U2Vzc2lvbkN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBSZXBsYWNlCisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUyLCB0cnVlKTsgCisJCXRoaXMucHJvcGVydGllc1RvdGFsKys7CisJCXRoaXMudmVyaWZ5UHV0U2Vzc2lvbkN1c3RvbWl6ZXJQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBZGRSZW1vdmVTZXNzaW9uQ3VzdG9taXphdGlvblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFJlbW92ZQorCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJLS10aGlzLnByb3BlcnRpZXNUb3RhbDsKKwkJLS10aGlzLm1vZGVsUHJvcGVydGllc1NpemU7CisJCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkoa2V5LCAoU3RyaW5nKSB0ZXN0VmFsdWUxKTsKKwkJYXNzZXJ0RmFsc2UodGhpcy5jdXN0b21pemF0aW9uLnNlc3Npb25DdXN0b21pemVyRXhpc3RzKGtleSkpOworCQlhc3NlcnRFcXVhbHModGhpcy5tb2RlbFByb3BlcnRpZXNTaXplLCB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCAtIDEpOworCQkKKwkJLy8gQWRkIG9yaWdpbmFsIFByb3BlcnR5CisJCSsrdGhpcy5wcm9wZXJ0aWVzVG90YWw7CisJCSsrdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMSwgdHJ1ZSk7IAorCQl0aGlzLnZlcmlmeVB1dFNlc3Npb25DdXN0b21pemVyUHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRTZXNzaW9uQ3VzdG9taXplclByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCisJCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQpOworCQl0aGlzLnZlcmlmeVNlc3Npb25DdXN0b21pemVyRXZlbnQocHJvcGVydHlOYW1lLCBleHBlY3RlZFZhbHVlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXNzaW9uQ3VzdG9taXplckV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gdmVyaWZ5IGV2ZW50IHZhbHVlCisJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbiBjdXN0b21pemF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbikgdGhpcy5zZXNzaW9uQ3VzdG9taXplcnNFdmVudC5nZXRTb3VyY2UoKTsKKwkJYXNzZXJ0VHJ1ZShjdXN0b21pemF0aW9uLnNlc3Npb25DdXN0b21pemVyRXhpc3RzKChTdHJpbmcpIGV4cGVjdGVkVmFsdWUpKTsKKwkJIHJldHVybjsKKwl9CisJCisJLy8gKioqKioqKioqKiB2ZXJpZnkgZW50aXR5IHByb3BlcnR5ICoqKioqKioqKioKKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRDdXN0b21pemF0aW9uUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gUmVwbGFjZQorCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMik7CisJCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTIpOworCQkKKwkJLy8gUmVwbGFjZSBieSBzZXR0aW5nIG1vZGVsIG9iamVjdAorCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJdGhpcy5zZXRDdXN0b21pemF0aW9uUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMSk7CisJCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTEpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHZlcmlmeUFkZFJlbW92ZUN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBSZW1vdmUKKwkJdGhpcy5jbGVhckV2ZW50KCk7CisJCS0tdGhpcy5wcm9wZXJ0aWVzVG90YWw7CisJCS0tdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOworCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KGtleSk7CisJCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShrZXkpKTsKKwkJYXNzZXJ0RXF1YWxzKHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSwgdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgLSAxKTsKKwkJdGhpcy52ZXJpZnlQdXRDdXN0b21pemF0aW9uUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgbnVsbCk7CisJCQorCQkvLyBBZGQgb3JpZ2luYWwgUHJvcGVydHkKKwkJKyt0aGlzLnByb3BlcnRpZXNUb3RhbDsKKwkJKyt0aGlzLm1vZGVsUHJvcGVydGllc1NpemU7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUxKTsKKwkJdGhpcy52ZXJpZnlQdXRDdXN0b21pemF0aW9uUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMSk7CisJCQorCQkvLyBSZXBsYWNlCisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUyKTsKKwkJdGhpcy52ZXJpZnlQdXRDdXN0b21pemF0aW9uUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5RXZlbnQocHJvcGVydHlOYW1lKTsKKwkJdGhpcy52ZXJpZnlDdXN0b21pemF0aW9uRXZlbnQocHJvcGVydHlOYW1lLCBlbnRpdHlOYW1lLCBleHBlY3RlZFZhbHVlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlDdXN0b21pemF0aW9uRXZlbnQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGVudGl0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gdmVyaWZ5IGV2ZW50IHZhbHVlCisJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSB0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50LmdldE5ld1ZhbHVlKCk7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkpKSB7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgZW50aXR5LmdldFBhcmVudCgpLmdldERlc2NyaXB0b3JDdXN0b21pemVyT2YoZW50aXR5TmFtZSkpOworCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHRoaXMuY3VzdG9taXphdGlvbi5nZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eU5hbWUpKTsKKwkJfQorCQllbHNlIHsKKwkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigidmVyaWZ5Q3VzdG9taXphdGlvbkV2ZW50IiwgcHJvcGVydHlOYW1lKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgZW50aXR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24geworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFbnRpdHkuREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZKSkKKwkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eU5hbWUsIChTdHJpbmcpIG5ld1ZhbHVlKTsKKwkJZWxzZQorCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRDdXN0b21pemF0aW9uUHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOworCX0KKworCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSkKKwkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRUaHJvd0V4Y2VwdGlvbnMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfTEFaWV9QUk9QRVJUWSkpCisJCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0V2VhdmluZ0xhenkoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZKSkKKwkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZKSkKKwkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRXZWF2aW5nRmV0Y2hHcm91cHMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFkpKQorCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFdlYXZpbmdJbnRlcm5hbCgoQm9vbGVhbikgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19FQUdFUl9QUk9QRVJUWSkpCisJCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0V2VhdmluZ0VhZ2VyKChCb29sZWFuKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5WQUxJREFUSU9OX09OTFlfUFJPUEVSVFkpKQorCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFZhbGlkYXRpb25Pbmx5KChCb29sZWFuKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5FWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSkpCisJCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0RXhjZXB0aW9uSGFuZGxlcigoU3RyaW5nKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFkpKQorCQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFNlc3Npb25DdXN0b21pemVyKChTdHJpbmcpIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfUFJPUEVSVFkpKQorCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFdlYXZpbmcoKFdlYXZpbmcpIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlBST0ZJTEVSX1BST1BFUlRZKSkgeworCQkJaWYgKG5ld1ZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpCisJCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFByb2ZpbGVyKChQcm9maWxlcikgbmV3VmFsdWUpOworCQkJZWxzZQorCQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRQcm9maWxlcigoU3RyaW5nKSBuZXdWYWx1ZSk7CisJCX0KKwkJZWxzZQorCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24geworCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFRocm93RXhjZXB0aW9ucygpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmcoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfTEFaWV9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdMYXp5KCk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdDaGFuZ2VUcmFja2luZygpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXRXZWF2aW5nRmV0Y2hHcm91cHMoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXRXZWF2aW5nSW50ZXJuYWwoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfRUFHRVJfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXRXZWF2aW5nRWFnZXIoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlZBTElEQVRJT05fT05MWV9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFZhbGlkYXRpb25Pbmx5KCk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5FWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldEV4Y2VwdGlvbkhhbmRsZXIoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlBST0ZJTEVSX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0UHJvZmlsZXIoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSkpIHsKKwkJCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5jdXN0b21pemF0aW9uLnNlc3Npb25DdXN0b21pemVycygpOworCQkJaWYoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJbW9kZWxWYWx1ZSA9IGl0ZXJhdG9yLm5leHQoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKEVOVElUWV9URVNUKTsKKwkJZWxzZQorCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7CisJCXJldHVybiBtb2RlbFZhbHVlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9iamVjdCBleHBlY3RlZFZhbHVlXyA9IGV4cGVjdGVkVmFsdWU7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uUFJPRklMRVJfUFJPUEVSVFkpKSB7CisJCQkKKwkJCWV4cGVjdGVkVmFsdWVfID0gKGV4cGVjdGVkVmFsdWUgIT0gbnVsbCAmJiBleHBlY3RlZFZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpID8KKwkJCQl0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihQUk9GSUxFUl9URVNUX1ZBTFVFKSA6IC8vIG1vZGVsIGlzIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZQorCQkJCWV4cGVjdGVkVmFsdWU7CisJCX0KKwkJc3VwZXIudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBleHBlY3RlZFZhbHVlXyk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7CisJCXJldHVybiB0aGlzLmN1c3RvbWl6YXRpb247CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTVmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9DdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKKworLyoqCisgKiBDdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQoreworCXByaXZhdGUgQ3VzdG9taXphdGlvbiBjdXN0b21pemF0aW9uOworCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB0aHJvd0V4Y2VwdGlvbnNIb2xkZXI7CisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRocm93RXhjZXB0aW9uc0xpc3RlbmVyOworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCB0aHJvd0V4Y2VwdGlvbnNFdmVudDsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9OQU1FX1RFU1RfVkFMVUUgPSAiRW1wbG95ZWUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTUlaRVJfVEVTVF9WQUxVRSA9ICJhY21lLnNlc3Npb25zLkN1c3RvbWl6ZXIiOworCisJcHVibGljIEN1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJdGhpcy5jdXN0b21pemF0aW9uID0gdGhpcy5zdWJqZWN0LmdldEN1c3RvbWl6YXRpb24oKTsgLy8gU3ViamVjdAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbj4gY3VzdG9taXphdGlvbkhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbj4odGhpcy5jdXN0b21pemF0aW9uKTsKKwkJCisJCXRoaXMudGhyb3dFeGNlcHRpb25zSG9sZGVyID0gdGhpcy5idWlsZFRocm93RXhjZXB0aW9uc0FBKGN1c3RvbWl6YXRpb25Ib2xkZXIpOworCQl0aGlzLnRocm93RXhjZXB0aW9uc0xpc3RlbmVyID0gdGhpcy5idWlsZFRocm93RXhjZXB0aW9uc0NoYW5nZUxpc3RlbmVyKCk7CisJCXRoaXMudGhyb3dFeGNlcHRpb25zSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnRocm93RXhjZXB0aW9uc0xpc3RlbmVyKTsKKwkJdGhpcy50aHJvd0V4Y2VwdGlvbnNFdmVudCA9IG51bGw7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKKwkJQWJzdHJhY3RNb2RlbCBzdWJqZWN0Q3VzdG9taXphdGlvbiA9IChBYnN0cmFjdE1vZGVsKSB0aGlzLmN1c3RvbWl6YXRpb247IC8vIFN1YmplY3QKKwkJCisJCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPiB0aHJvd0V4Y2VwdGlvbnNBQSA9IAorCQkJKFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPikgdGhpcy50aHJvd0V4Y2VwdGlvbnNIb2xkZXI7CisJCWFzc2VydFRydWUodGhyb3dFeGNlcHRpb25zQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7CisJCWFzc2VydFRydWUoc3ViamVjdEN1c3RvbWl6YXRpb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSk7CisJCQorCQl0aHJvd0V4Y2VwdGlvbnNBQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy50aHJvd0V4Y2VwdGlvbnNMaXN0ZW5lcik7CisJCWFzc2VydEZhbHNlKHN1YmplY3RDdXN0b21pemF0aW9uLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEN1c3RvbWl6YXRpb24uVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSkpOworCQlhc3NlcnRGYWxzZSh0aHJvd0V4Y2VwdGlvbnNBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4gCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgKKwkJCUN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUywgCisJCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUpOworCQlyZXR1cm47CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7CisJCXJldHVybiB0aGlzLmN1c3RvbWl6YXRpb247CisJfQorCisJLy8gKioqKioqIFRocm93RXhjZXB0aW9ucyAqKioqKioqCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRocm93RXhjZXB0aW9uc0FBKFByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPiBzdWJqZWN0SG9sZGVyKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIEN1c3RvbWl6YXRpb24uVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSkgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFRocm93RXhjZXB0aW9ucygpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIGVudW1WYWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXRUaHJvd0V4Y2VwdGlvbnMoZW51bVZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUaHJvd0V4Y2VwdGlvbnNDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgeworCQkJCUN1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy50aHJvd0V4Y2VwdGlvbnNFdmVudCA9IGU7CisJCQl9CisJCX07CisJfQorCisJLyoqICoqKioqKiBCYXNpYyBFbnRpdHkncyBQcm9wZXJ0aWVzIFRlc3RzICoqKioqKiogKi8KKworCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKKwkJRW50aXR5IGVudGl0eSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHkiLCBDVVNUT01JWkVSX1RFU1RfVkFMVUUpOworCisJCXRoaXMudmVyaWZ5Q2xvbmUoZW50aXR5LCBlbnRpdHkuY2xvbmUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CisJCUVudGl0eSBlbnRpdHkxID0gdGhpcy5idWlsZEVudGl0eSgiVGVzdEVudGl0eUEiLCBDVVNUT01JWkVSX1RFU1RfVkFMVUUpOworCQlFbnRpdHkgZW50aXR5MiA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHlCIiwgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKKwkJYXNzZXJ0RXF1YWxzKGVudGl0eTEsIGVudGl0eTIpOworCQlFbnRpdHkgZW50aXR5MyA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHlDIiwgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKKwkJYXNzZXJ0RXF1YWxzKGVudGl0eTEsIGVudGl0eTMpOworCQlhc3NlcnRFcXVhbHMoZW50aXR5MiwgZW50aXR5Myk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgeworCQlFbnRpdHkgZW50aXR5ID0gdGhpcy5idWlsZEVudGl0eSgiVGVzdEVudGl0eSIpOworCQlhc3NlcnRUcnVlKGVudGl0eS5pc0VtcHR5KCkpOworCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHkuZ2V0TmFtZSgpLCBDVVNUT01JWkVSX1RFU1RfVkFMVUUpOworCQlhc3NlcnRGYWxzZShlbnRpdHkuaXNFbXB0eSgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdmVyaWZ5Q2xvbmUoRW50aXR5IG9yaWdpbmFsLCBFbnRpdHkgY2xvbmUpIHsKKwkJYXNzZXJ0Tm90U2FtZShvcmlnaW5hbCwgY2xvbmUpOworCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwsIG9yaWdpbmFsKTsKKwkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLCBjbG9uZSk7CisJfQorCisJcHJpdmF0ZSBFbnRpdHkgYnVpbGRFbnRpdHkoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIHRoaXMuY3VzdG9taXphdGlvbi5hZGRFbnRpdHkobmFtZSk7CisJfQorCisJcHJpdmF0ZSBFbnRpdHkgYnVpbGRFbnRpdHkoU3RyaW5nIG5hbWUsIFN0cmluZyBhQ2xhc3NOYW1lKSB7CisJCUVudGl0eSBlbnRpdHkgPSB0aGlzLmN1c3RvbWl6YXRpb24uYWRkRW50aXR5KG5hbWUpOworCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHkuZ2V0TmFtZSgpLCBhQ2xhc3NOYW1lKTsKKwkJcmV0dXJuIGVudGl0eTsKKwl9CisKKwkvLyAqKioqKiogVGVzdHMgKioqKioqKiAKKwlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7CisJCS8vICoqKioqKiBUaHJvd0V4Y2VwdGlvbnMgKioqKioqKiAKKwkJdGhpcy52ZXJpZnlUaHJvd0V4Y2VwdGlvbnNBQVZhbHVlKFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRSk7CisJCWFzc2VydEVxdWFscyhDdXN0b21pemF0aW9uLkRFRkFVTFRfVEhST1dfRVhDRVBUSU9OUywgdGhpcy5jdXN0b21pemF0aW9uLmdldERlZmF1bHRUaHJvd0V4Y2VwdGlvbnMoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vICoqKioqKiBUaHJvd0V4Y2VwdGlvbnMgKioqKioqKiAKKwkJdGhpcy50aHJvd0V4Y2VwdGlvbnNFdmVudCA9IG51bGw7CisJCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMudGhyb3dFeGNlcHRpb25zSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOworCQlCb29sZWFuIG5ld1Rocm93RXhjZXB0aW9ucyA9ICFUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUU7CisJCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCisJCXRoaXMudGhyb3dFeGNlcHRpb25zSG9sZGVyLnNldFZhbHVlKG5ld1Rocm93RXhjZXB0aW9ucyk7CisJCXRoaXMudmVyaWZ5VGhyb3dFeGNlcHRpb25zQUFWYWx1ZShuZXdUaHJvd0V4Y2VwdGlvbnMpOworCQlhc3NlcnROb3ROdWxsKHRoaXMudGhyb3dFeGNlcHRpb25zRXZlbnQpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsVmFsdWUoKSB7CisJCVN0cmluZyBub3REZWxldGVkID0gIlByb3BlcnR5IG5vdCBkZWxldGVkIjsKKwkJLy8gKioqKioqIFRocm93RXhjZXB0aW9ucyAqKioqKioqCisJCXRoaXMudGhyb3dFeGNlcHRpb25zRXZlbnQgPSBudWxsOworCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKKwkJdGhpcy50aHJvd0V4Y2VwdGlvbnNIb2xkZXIuc2V0VmFsdWUobnVsbCk7CisJCS8vIHRlc3RpbmcgSG9sZGVyCisJCXRoaXMudmVyaWZ5VGhyb3dFeGNlcHRpb25zQUFWYWx1ZShudWxsKTsKKwkJYXNzZXJ0Tm90TnVsbCh0aGlzLnRocm93RXhjZXB0aW9uc0V2ZW50KTsKKwkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCisJCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlMsIG5vdERlbGV0ZWQpOworCX0KKworCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKKworCS8qKgorCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KKwkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgorCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgorCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlUaHJvd0V4Y2VwdGlvbnNBQVZhbHVlKEJvb2xlYW4gdGVzdFZhbHVlKSB7CisJCXRoaXMudmVyaWZ5QUFWYWx1ZSgKKwkJCXRlc3RWYWx1ZSwgCisJCQl0aGlzLmN1c3RvbWl6YXRpb24uZ2V0VGhyb3dFeGNlcHRpb25zKCksIAorCQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNIb2xkZXIsIAorCQkJQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TKTsKKwl9CisKKwkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUN1c3RvbWl6YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUN1c3RvbWl6YXRpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNjRjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ3VzdG9taXphdGlvblRlc3RzLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisvKioKKyAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKKyAqLworcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDdXN0b21pemF0aW9uVGVzdHMKK3sKKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUN1c3RvbWl6YXRpb25UZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKwkJCisJCXN1aXRlLmFkZFRlc3RTdWl0ZShDdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEN1c3RvbWl6YXRpb25BZGFwdGVyVGVzdHMuY2xhc3MpOworCQkKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUN1c3RvbWl6YXRpb25UZXN0cygpIHsKKwkJc3VwZXIoKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2dlbmVyYWwvR2VuZXJhbFByb3BlcnRpZXNBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0dlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5YzhlZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0dlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmdlbmVyYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsLkdlbmVyYWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworCisvKioKKyAqICBHZW5lcmFsQWRhcHRlclRlc3RzCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEdlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQoreworCXByaXZhdGUgR2VuZXJhbFByb3BlcnRpZXMgZ2VuZXJhbFByb3BlcnRpZXM7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFX0VDTElQU0VMSU5LX09STV9LRVkgPSBHZW5lcmFsUHJvcGVydGllcy5FQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRSA9IGZhbHNlOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFXzIgPSAhIEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUU7CisKKwkKKwlwdWJsaWMgR2VuZXJhbFByb3BlcnRpZXNBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJdGhpcy5nZW5lcmFsUHJvcGVydGllcyA9IHRoaXMuc3ViamVjdC5nZXRHZW5lcmFsUHJvcGVydGllcygpOworCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOworCQkKKwkJdGhpcy5nZW5lcmFsUHJvcGVydGllcy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKworCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgeworCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDE7CisJCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyAyOyAvLyBtaXNjIHByb3BlcnRpZXMKKwkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7CisJCQorCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjEiLCAidmFsdWUuMSIpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX0tFWSwgRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4yIiwgInZhbHVlLjIiKTsKKworCQlyZXR1cm47CisJfQorCisJCisJLy8gKioqKioqKioqKiBFeGNsdWRlRWNsaXBzZWxpbmtPcm0gdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fS0VZLAorCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9LRVksCisJCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFLAorCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRXhjbHVkZUVjbGlwc2VsaW5rT3JtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9LRVksCisJCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFLAorCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRV8yKTsKKwl9CisKKworCisJLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7CisJCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoR2VuZXJhbFByb3BlcnRpZXMuRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMuZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCk7CisJCWVsc2UKKwkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOworCQlyZXR1cm4gbW9kZWxWYWx1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24geworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhHZW5lcmFsUHJvcGVydGllcy5FWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSkpCisJCQl0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLnNldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgoQm9vbGVhbikgbmV3VmFsdWUpOworCQllbHNlCisJCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7CisJCXJldHVybiB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0dlbmVyYWxQcm9wZXJ0aWVzVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvZ2VuZXJhbC9HZW5lcmFsUHJvcGVydGllc1ZhbHVlTW9kZWxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNmNjMDcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvZ2VuZXJhbC9HZW5lcmFsUHJvcGVydGllc1ZhbHVlTW9kZWxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmdlbmVyYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsLkdlbmVyYWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKKworLyoqCisgKiBHZW5lcmFsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCit7CisJcHJpdmF0ZSBHZW5lcmFsUHJvcGVydGllcyBnZW5lcmFsUHJvcGVydHk7CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlcjsKKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZXhjbHVkZUVjbGlwc2VsaW5rT3JtTGlzdGVuZXI7CisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV4Y2x1ZGVFY2xpcHNlbGlua09ybUV2ZW50OworCisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOworCisJcHVibGljIEdlbmVyYWxQcm9wZXJ0aWVzVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXRoaXMuZ2VuZXJhbFByb3BlcnR5ID0gdGhpcy5zdWJqZWN0LmdldEdlbmVyYWxQcm9wZXJ0aWVzKCk7IC8vIFN1YmplY3QKKwkJUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYWxQcm9wZXJ0aWVzPiBnZW5lcmFsUHJvcGVydHlIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYWxQcm9wZXJ0aWVzPih0aGlzLmdlbmVyYWxQcm9wZXJ0eSk7CisJCQorCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlciA9IHRoaXMuYnVpbGRFeGNsdWRlRWNsaXBzZWxpbmtPcm1BQShnZW5lcmFsUHJvcGVydHlIb2xkZXIpOworCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUxpc3RlbmVyID0gdGhpcy5idWlsZEV4Y2x1ZGVFY2xpcHNlbGlua09ybUNoYW5nZUxpc3RlbmVyKCk7CisJCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUxpc3RlbmVyKTsKKwkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1FdmVudCA9IG51bGw7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKKwkJQWJzdHJhY3RNb2RlbCBzdWJqZWN0R2VuZXJhbFByb3BlcnR5ID0gKEFic3RyYWN0TW9kZWwpIHRoaXMuZ2VuZXJhbFByb3BlcnR5OyAvLyBTdWJqZWN0CisJCQorCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhbFByb3BlcnRpZXMsIEJvb2xlYW4+IGV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBID0gCisJCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYWxQcm9wZXJ0aWVzLCBCb29sZWFuPikgdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXI7CisJCWFzc2VydFRydWUoZXhjbHVkZUVjbGlwc2VsaW5rT3JtQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7CisJCWFzc2VydFRydWUoc3ViamVjdEdlbmVyYWxQcm9wZXJ0eS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhHZW5lcmFsUHJvcGVydGllcy5FWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSkpOworCQkKKwkJZXhjbHVkZUVjbGlwc2VsaW5rT3JtQUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtTGlzdGVuZXIpOworCQlhc3NlcnRGYWxzZShzdWJqZWN0R2VuZXJhbFByb3BlcnR5Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKSk7CisJCWFzc2VydEZhbHNlKGV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiAKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgeworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAorCQkJR2VuZXJhbFByb3BlcnRpZXMuRUNMSVBTRUxJTktfRVhDTFVERV9FQ0xJUFNFTElOS19PUk0sIAorCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRSk7CisJCXJldHVybjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKKwkJcmV0dXJuIHRoaXMuZ2VuZXJhbFByb3BlcnR5OworCX0KKworCS8vICoqKioqKiBFeGNsdWRlRWNsaXBzZWxpbmtPcm0gKioqKioqKgorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFeGNsdWRlRWNsaXBzZWxpbmtPcm1BQShQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhbFByb3BlcnRpZXM+IHN1YmplY3RIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhbFByb3BlcnRpZXMsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIEdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgeworCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gZW51bVZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldEV4Y2x1ZGVFY2xpcHNlbGlua09ybShlbnVtVmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEV4Y2x1ZGVFY2xpcHNlbGlua09ybUNoYW5nZUxpc3RlbmVyKCkgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7CisJCQkJR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMudGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1FdmVudCA9IGU7CisJCQl9CisJCX07CisJfQorCisJLy8gKioqKioqIFRlc3RzICoqKioqKiogCisJcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgeworCQkvLyAqKioqKiogRXhjbHVkZUVjbGlwc2VsaW5rT3JtICoqKioqKiogCisJCXRoaXMudmVyaWZ5RXhjbHVkZUVjbGlwc2VsaW5rT3JtQUFWYWx1ZShFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFKTsKKwkJYXNzZXJ0RXF1YWxzKEdlbmVyYWxQcm9wZXJ0aWVzLkRFRkFVTFRfRVhDTFVERV9FQ0xJUFNFTElOS19PUk0sIHRoaXMuZ2VuZXJhbFByb3BlcnR5LmdldERlZmF1bHRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vICoqKioqKiBFeGNsdWRlRWNsaXBzZWxpbmtPcm0gKioqKioqKiAKKwkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1FdmVudCA9IG51bGw7CisJCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOworCQlCb29sZWFuIG5ld0V4Y2x1ZGVFY2xpcHNlbGlua09ybSA9ICFFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFOworCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgorCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlci5zZXRWYWx1ZShuZXdFeGNsdWRlRWNsaXBzZWxpbmtPcm0pOworCQl0aGlzLnZlcmlmeUV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBVmFsdWUobmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtKTsKKwkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUV2ZW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbFZhbHVlKCkgeworCQlTdHJpbmcgbm90RGVsZXRlZCA9ICJQcm9wZXJ0eSBub3QgZGVsZXRlZCI7CisJCS8vICoqKioqKiBFeGNsdWRlRWNsaXBzZWxpbmtPcm0gKioqKioqKgorCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUV2ZW50ID0gbnVsbDsKKwkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCisJCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyLnNldFZhbHVlKG51bGwpOworCQkvLyB0ZXN0aW5nIEhvbGRlcgorCQl0aGlzLnZlcmlmeUV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBVmFsdWUobnVsbCk7CisJCWFzc2VydE5vdE51bGwodGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1FdmVudCk7CisJCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcworCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoR2VuZXJhbFByb3BlcnRpZXMuRUNMSVBTRUxJTktfRVhDTFVERV9FQ0xJUFNFTElOS19PUk0sIG5vdERlbGV0ZWQpOworCX0KKworCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKKworCS8qKgorCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KKwkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgorCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgorCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlFeGNsdWRlRWNsaXBzZWxpbmtPcm1BQVZhbHVlKEJvb2xlYW4gdGVzdFZhbHVlKSB7CisJCXRoaXMudmVyaWZ5QUFWYWx1ZSgKKwkJCXRlc3RWYWx1ZSwgCisJCQl0aGlzLmdlbmVyYWxQcm9wZXJ0eS5nZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKSwgCisJCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlciwgCisJCQlHZW5lcmFsUHJvcGVydGllcy5FQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSk7CisJfQorCisJLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24geworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VHZW5lcmFsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VHZW5lcmFsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmE4NDgzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2dlbmVyYWwvSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUdlbmVyYWxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworLyoqCisgKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCisgKi8KK3B1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlR2VuZXJhbFRlc3RzCit7CisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VHZW5lcmFsVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CisJCQorCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJhbFByb3BlcnRpZXNBZGFwdGVyVGVzdHMuY2xhc3MpOworCQkKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUdlbmVyYWxUZXN0cygpIHsKKwkJc3VwZXIoKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUxvZ2dpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUxvZ2dpbmdUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZGM3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlTG9nZ2luZ1Rlc3RzLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisvKioKKyAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKKyAqLworcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VMb2dnaW5nVGVzdHMKK3sKKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUxvZ2dpbmdUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKwkJCisJCXN1aXRlLmFkZFRlc3RTdWl0ZShMb2dnaW5nVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKExvZ2dpbmdBZGFwdGVyVGVzdHMuY2xhc3MpOworCQkKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUxvZ2dpbmdUZXN0cygpIHsKKwkJc3VwZXIoKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ0FkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ0FkYXB0ZXJUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNmU5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nQWRhcHRlclRlc3RzLmphdmEKQEAgLTAsMCArMSwzMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZ0xldmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworCisvKioKKyAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgbW9kZWwgb2JqZWN0cyBieSB0aGUgTG9nZ2luZyBhZGFwdGVyIHdoZW4gdGhlCisgKiBQZXJzaXN0ZW5jZVVuaXQgY2hhbmdlcy4KKyAqLworcHVibGljIGNsYXNzIExvZ2dpbmdBZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCit7CisJcHJpdmF0ZSBMb2dnaW5nIGxvZ2dpbmc7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTF9LRVkgPSBMb2dnaW5nLkVDTElQU0VMSU5LX0xFVkVMOworCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIExFVkVMX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuZmluZTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBMRVZFTF9URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuZmluZXN0OworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVNUQU1QX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfVElNRVNUQU1QOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSU1FU1RBTVBfVEVTVF9WQUxVRSA9IGZhbHNlOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSU1FU1RBTVBfVEVTVF9WQUxVRV8yID0gISBUSU1FU1RBTVBfVEVTVF9WQUxVRTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9LRVkgPSBMb2dnaW5nLkVDTElQU0VMSU5LX1RIUkVBRDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVEhSRUFEX1RFU1RfVkFMVUUgPSBmYWxzZTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVEhSRUFEX1RFU1RfVkFMVUVfMiA9ICEgVEhSRUFEX1RFU1RfVkFMVUU7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfU0VTU0lPTjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0VTU0lPTl9URVNUX1ZBTFVFID0gZmFsc2U7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNFU1NJT05fVEVTVF9WQUxVRV8yID0gISBTRVNTSU9OX1RFU1RfVkFMVUU7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05TX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfRVhDRVBUSU9OUzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDRVBUSU9OU19URVNUX1ZBTFVFID0gZmFsc2U7CisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0VQVElPTlNfVEVTVF9WQUxVRV8yID0gISBFWENFUFRJT05TX1RFU1RfVkFMVUU7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEVfTE9DQVRJT05fS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19MT0dfRklMRV9MT0NBVElPTjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRSA9ICJDOi90ZW1wIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRV8yID0gIkM6L3RtcCI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0VSX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfTE9HR0VSOworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVJfVEVTVF9WQUxVRSA9IExvZ2dlci5qYXZhX2xvZ2dlcjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0VSX1RFU1RfVkFMVUVfMiA9ICJjdXN0b20ubG9nZ2VyLnRlc3QiOworCQorCXB1YmxpYyBMb2dnaW5nQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXRoaXMubG9nZ2luZyA9IHRoaXMuc3ViamVjdC5nZXRMb2dnaW5nKCk7CisJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7CisJCQorCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nLkxFVkVMX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nLlRIUkVBRF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuU0VTU0lPTl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuRVhDRVBUSU9OU19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nLkxPR0dFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisKKwkJdGhpcy5jbGVhckV2ZW50KCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKKwkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSA3OworCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgNDsgLy8gNCBtaXNjIHByb3BlcnRpZXMKKwkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7CisJCQorCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjEiLCAidmFsdWUuMSIpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFRJTUVTVEFNUF9LRVksIFRJTUVTVEFNUF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjIiLCAidmFsdWUuMiIpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KExFVkVMX0tFWSwgTEVWRUxfVEVTVF9WQUxVRSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVEhSRUFEX0tFWSwgVEhSRUFEX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0VTU0lPTl9LRVksIFNFU1NJT05fVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShFWENFUFRJT05TX0tFWSwgRVhDRVBUSU9OU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjQiLCAidmFsdWUuNCIpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KExPR19GSUxFX0xPQ0FUSU9OX0tFWSwgTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTE9HR0VSX0tFWSwgTE9HR0VSX1RFU1RfVkFMVUUpOworCQlyZXR1cm47CisJfQorCQorCS8vICoqKioqKioqKiogTGV2ZWwgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRMZXZlbCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlMRVZFTF9LRVksCisJCQlMRVZFTF9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCUxFVkVMX0tFWSwKKwkJCUxFVkVMX1RFU1RfVkFMVUUsCisJCQlMRVZFTF9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMZXZlbCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJTEVWRUxfS0VZLAorCQkJTEVWRUxfVEVTVF9WQUxVRSwKKwkJCUxFVkVMX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBUaW1lc3RhbXAgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRUaW1lc3RhbXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJVElNRVNUQU1QX0tFWSwKKwkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCVRJTUVTVEFNUF9LRVksCisJCQlUSU1FU1RBTVBfVEVTVF9WQUxVRSwKKwkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUaW1lc3RhbXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCVRJTUVTVEFNUF9LRVksCisJCQlUSU1FU1RBTVBfVEVTVF9WQUxVRSwKKwkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFXzIpOworCX0KKworCS8vICoqKioqKioqKiogVGhyZWFkIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VGhyZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVRIUkVBRF9LRVksCisJCQlUSFJFQURfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlUSFJFQURfS0VZLAorCQkJVEhSRUFEX1RFU1RfVkFMVUUsCisJCQlUSFJFQURfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVGhyZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlUSFJFQURfS0VZLAorCQkJVEhSRUFEX1RFU1RfVkFMVUUsCisJCQlUSFJFQURfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFNlc3Npb24gdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRTZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVNFU1NJT05fS0VZLAorCQkJU0VTU0lPTl9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCVNFU1NJT05fS0VZLAorCQkJU0VTU0lPTl9URVNUX1ZBTFVFLAorCQkJU0VTU0lPTl9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVTZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlTRVNTSU9OX0tFWSwKKwkJCVNFU1NJT05fVEVTVF9WQUxVRSwKKwkJCVNFU1NJT05fVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIEV4Y2VwdGlvbnMgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCUVYQ0VQVElPTlNfS0VZLAorCQkJRVhDRVBUSU9OU19URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCUVYQ0VQVElPTlNfS0VZLAorCQkJRVhDRVBUSU9OU19URVNUX1ZBTFVFLAorCQkJRVhDRVBUSU9OU19URVNUX1ZBTFVFXzIpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRXhjZXB0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJRVhDRVBUSU9OU19LRVksCisJCQlFWENFUFRJT05TX1RFU1RfVkFMVUUsCisJCQlFWENFUFRJT05TX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBMb2dGaWxlTG9jYXRpb24gKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRMb2dGaWxlTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJTE9HX0ZJTEVfTE9DQVRJT05fS0VZLAorCQkJTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlMT0dfRklMRV9MT0NBVElPTl9LRVksCisJCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFLAorCQkJTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTG9nRmlsZUxvY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlMT0dfRklMRV9MT0NBVElPTl9LRVksCisJCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFLAorCQkJTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRV8yKTsKKwl9CisJCisJLy8gKioqKioqKioqKiBMb2dnZXIgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRMb2dnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJTE9HR0VSX0tFWSwKKwkJCXRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKExPR0dFUl9URVNUX1ZBTFVFKSk7IC8vIG1vZGVsIGlzIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZQorCQkvLyB2ZXJpZnkgc2V0IGVudW0gdmFsdWUKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCUxPR0dFUl9LRVksCisJCQlMT0dHRVJfVEVTVF9WQUxVRSwKKwkJCUxPR0dFUl9URVNUX1ZBTFVFXzIpOworCQkvLyB2ZXJpZnkgc2V0IGN1c3RvbSBhbmQgbGl0ZXJhbCB2YWx1ZQorCQl0aGlzLnZlcmlmeVNldExvZ2dlcigKKwkJCUxPR0dFUl9LRVksCisJCQlMT0dHRVJfVEVTVF9WQUxVRSwKKwkJCUxPR0dFUl9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMb2dnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCUxPR0dFUl9LRVksCisJCQlMT0dHRVJfVEVTVF9WQUxVRSwKKwkJCUxPR0dFUl9URVNUX1ZBTFVFXzIpOworCX0KKwkKKwkvKioKKwkgKiBWZXJpZmllcyBzZXR0aW5nIGN1c3RvbSBsb2dnZXIgYW5kIGxpdGVyYWxzLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNldExvZ2dlcihTdHJpbmcgZWxLZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpOworCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7CisJCS8vIHRlc3Qgc2V0IGN1c3RvbSBsb2dnZXIuCisJCXRoaXMuY2xlYXJFdmVudCgpOworCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7CisJCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKKworCQkvLyB0ZXN0IHNldCAoTG9nZ2VyKSBudWxsCisJCXRoaXMuY2xlYXJFdmVudCgpOworCQl0aGlzLmxvZ2dpbmcuc2V0TG9nZ2VyKChMb2dnZXIpIG51bGwpOworCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKKwkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOworCQkKKwkJLy8gdGVzdCBzZXQgZW51bSBsaXRlcmFsCisJCXRoaXMuY2xlYXJFdmVudCgpOworCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMS50b1N0cmluZygpKTsKKwkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7CisJCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZih0ZXN0VmFsdWUxKSk7CisKKwkJLy8gdGVzdCBzZXQgKFN0cmluZykgbnVsbAorCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJdGhpcy5sb2dnaW5nLnNldExvZ2dlcigoU3RyaW5nKSBudWxsKTsKKwkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7CisJCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKKwl9CisKKwkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuTEVWRUxfUFJPUEVSVFkpKQorCQkJdGhpcy5sb2dnaW5nLnNldExldmVsKChMb2dnaW5nTGV2ZWwpIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLlRJTUVTVEFNUF9QUk9QRVJUWSkpCisJCQl0aGlzLmxvZ2dpbmcuc2V0VGltZXN0YW1wKChCb29sZWFuKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5USFJFQURfUFJPUEVSVFkpKQorCQkJdGhpcy5sb2dnaW5nLnNldFRocmVhZCgoQm9vbGVhbikgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuU0VTU0lPTl9QUk9QRVJUWSkpCisJCQl0aGlzLmxvZ2dpbmcuc2V0U2Vzc2lvbigoQm9vbGVhbikgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuRVhDRVBUSU9OU19QUk9QRVJUWSkpCisJCQl0aGlzLmxvZ2dpbmcuc2V0RXhjZXB0aW9ucygoQm9vbGVhbikgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFkpKQorCQkJdGhpcy5sb2dnaW5nLnNldExvZ0ZpbGVMb2NhdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5MT0dHRVJfUFJPUEVSVFkpKSB7CisJCQlpZiAobmV3VmFsdWUuZ2V0Q2xhc3MoKS5pc0VudW0oKSkKKwkJCQl0aGlzLmxvZ2dpbmcuc2V0TG9nZ2VyKChMb2dnZXIpIG5ld1ZhbHVlKTsKKwkJCWVsc2UKKwkJCQl0aGlzLmxvZ2dpbmcuc2V0TG9nZ2VyKChTdHJpbmcpIG5ld1ZhbHVlKTsKKwkJfQorCQllbHNlCisJCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7CisJCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5MRVZFTF9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5sb2dnaW5nLmdldExldmVsKCk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRUaW1lc3RhbXAoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLlRIUkVBRF9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5sb2dnaW5nLmdldFRocmVhZCgpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuU0VTU0lPTl9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5sb2dnaW5nLmdldFNlc3Npb24oKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkVYQ0VQVElPTlNfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRFeGNlcHRpb25zKCk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5MT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5sb2dnaW5nLmdldExvZ0ZpbGVMb2NhdGlvbigpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuTE9HR0VSX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0TG9nZ2VyKCk7CisJCWVsc2UKKwkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOworCQlyZXR1cm4gbW9kZWxWYWx1ZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24geworCQlPYmplY3QgZXhwZWN0ZWRWYWx1ZV8gPSBleHBlY3RlZFZhbHVlOworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxPR0dFUl9QUk9QRVJUWSkpIHsKKwkJCQorCQkJZXhwZWN0ZWRWYWx1ZV8gPSAoZXhwZWN0ZWRWYWx1ZSAhPSBudWxsICYmIGV4cGVjdGVkVmFsdWUuZ2V0Q2xhc3MoKS5pc0VudW0oKSkgPworCQkJCXRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKExPR0dFUl9URVNUX1ZBTFVFKSA6IC8vIG1vZGVsIGlzIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZQorCQkJCWV4cGVjdGVkVmFsdWU7CisJCX0KKwkJc3VwZXIudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBleHBlY3RlZFZhbHVlXyk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgeworCQlyZXR1cm4gdGhpcy5sb2dnaW5nOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjQ5MzY4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworCisvKioKKyAqIExvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKK3sKKwlwcml2YXRlIExvZ2dpbmcgbG9nZ2luZzsKKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdGltZXN0YW1wSG9sZGVyOworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0aW1lc3RhbXBMaXN0ZW5lcjsKKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgdGltZXN0YW1wRXZlbnQ7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVElNRVNUQU1QX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOworCisJcHVibGljIExvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJdGhpcy5sb2dnaW5nID0gdGhpcy5zdWJqZWN0LmdldExvZ2dpbmcoKTsgLy8gU3ViamVjdAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8TG9nZ2luZz4gbG9nZ2luZ0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TG9nZ2luZz4odGhpcy5sb2dnaW5nKTsKKwkJCisJCXRoaXMudGltZXN0YW1wSG9sZGVyID0gdGhpcy5idWlsZFRpbWVzdGFtcEFBKGxvZ2dpbmdIb2xkZXIpOworCQl0aGlzLnRpbWVzdGFtcExpc3RlbmVyID0gdGhpcy5idWlsZFRpbWVzdGFtcENoYW5nZUxpc3RlbmVyKCk7CisJCXRoaXMudGltZXN0YW1wSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnRpbWVzdGFtcExpc3RlbmVyKTsKKwkJdGhpcy50aW1lc3RhbXBFdmVudCA9IG51bGw7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKKwkJQWJzdHJhY3RNb2RlbCBzdWJqZWN0TG9nZ2luZyA9IChBYnN0cmFjdE1vZGVsKSB0aGlzLmxvZ2dpbmc7IC8vIFN1YmplY3QKKwkJCisJCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPiB0aW1lc3RhbXBBQSA9IAorCQkJKFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPikgdGhpcy50aW1lc3RhbXBIb2xkZXI7CisJCWFzc2VydFRydWUodGltZXN0YW1wQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7CisJCWFzc2VydFRydWUoc3ViamVjdExvZ2dpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpKTsKKwkJCisJCXRpbWVzdGFtcEFBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnRpbWVzdGFtcExpc3RlbmVyKTsKKwkJYXNzZXJ0RmFsc2Uoc3ViamVjdExvZ2dpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpKTsKKwkJYXNzZXJ0RmFsc2UodGltZXN0YW1wQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCisJCQlMb2dnaW5nLkVDTElQU0VMSU5LX1RJTUVTVEFNUCwgCisJCQlUSU1FU1RBTVBfVEVTVF9WQUxVRSk7CisJCXJldHVybjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKKwkJcmV0dXJuIHRoaXMubG9nZ2luZzsKKwl9CisKKwkvLyAqKioqKiogVGltZXN0YW1wICoqKioqKioKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGltZXN0YW1wQUEoUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+IHN1YmplY3RIb2xkZXIpIHsKKwkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUaW1lc3RhbXAoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiBlbnVtVmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0VGltZXN0YW1wKGVudW1WYWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVGltZXN0YW1wQ2hhbmdlTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKKwkJCQlMb2dnaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMudGltZXN0YW1wRXZlbnQgPSBlOworCQkJfQorCQl9OworCX0KKworCS8vICoqKioqKiBUZXN0cyAqKioqKioqIAorCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKKwkJLy8gKioqKioqIFRpbWVzdGFtcCAqKioqKioqIAorCQl0aGlzLnZlcmlmeVRpbWVzdGFtcEFBVmFsdWUoVElNRVNUQU1QX1RFU1RfVkFMVUUpOworCQlhc3NlcnRFcXVhbHMoTG9nZ2luZy5ERUZBVUxUX1RJTUVTVEFNUCwgdGhpcy5sb2dnaW5nLmdldERlZmF1bHRUaW1lc3RhbXAoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vICoqKioqKiBUaW1lc3RhbXAgKioqKioqKiAKKwkJdGhpcy50aW1lc3RhbXBFdmVudCA9IG51bGw7CisJCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMudGltZXN0YW1wSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOworCQlCb29sZWFuIG5ld1RpbWVzdGFtcCA9ICFUSU1FU1RBTVBfVEVTVF9WQUxVRTsKKwkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKKwkJdGhpcy50aW1lc3RhbXBIb2xkZXIuc2V0VmFsdWUobmV3VGltZXN0YW1wKTsKKwkJdGhpcy52ZXJpZnlUaW1lc3RhbXBBQVZhbHVlKG5ld1RpbWVzdGFtcCk7CisJCWFzc2VydE5vdE51bGwodGhpcy50aW1lc3RhbXBFdmVudCk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldE51bGxWYWx1ZSgpIHsKKwkJU3RyaW5nIG5vdERlbGV0ZWQgPSAiUHJvcGVydHkgbm90IGRlbGV0ZWQiOworCQkvLyAqKioqKiogVGltZXN0YW1wICoqKioqKioKKwkJdGhpcy50aW1lc3RhbXBFdmVudCA9IG51bGw7CisJCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgorCQl0aGlzLnRpbWVzdGFtcEhvbGRlci5zZXRWYWx1ZShudWxsKTsKKwkJLy8gdGVzdGluZyBIb2xkZXIKKwkJdGhpcy52ZXJpZnlUaW1lc3RhbXBBQVZhbHVlKG51bGwpOworCQlhc3NlcnROb3ROdWxsKHRoaXMudGltZXN0YW1wRXZlbnQpOworCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKKwkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KExvZ2dpbmcuRUNMSVBTRUxJTktfVElNRVNUQU1QLCBub3REZWxldGVkKTsKKwl9CisKKwkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCisKKwkvKioKKwkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+CisJICogMS4gc3ViamVjdCB2YWx1ZTxicj4KKwkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KKwkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+CisJICovCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5VGltZXN0YW1wQUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgeworCQl0aGlzLnZlcmlmeUFBVmFsdWUoCisJCQl0ZXN0VmFsdWUsIAorCQkJdGhpcy5sb2dnaW5nLmdldFRpbWVzdGFtcCgpLCAKKwkJCXRoaXMudGltZXN0YW1wSG9sZGVyLCAKKwkJCUxvZ2dpbmcuRUNMSVBTRUxJTktfVElNRVNUQU1QKTsKKwl9CisKKwkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZU9wdGlvbnNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZU9wdGlvbnNUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTIxZGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlT3B0aW9uc1Rlc3RzLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisvKioKKyAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKKyAqLworcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VPcHRpb25zVGVzdHMKK3sKKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZU9wdGlvbnNUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKwkJCisJCXN1aXRlLmFkZFRlc3RTdWl0ZShPcHRpb25zVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKE9wdGlvbnNBZGFwdGVyVGVzdHMuY2xhc3MpOworCQkKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZU9wdGlvbnNUZXN0cygpIHsKKwkJc3VwZXIoKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvT3B0aW9uc0FkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvT3B0aW9uc0FkYXB0ZXJUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODUwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9PcHRpb25zQWRhcHRlclRlc3RzLmphdmEKQEAgLTAsMCArMSwzNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlRhcmdldERhdGFiYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5UYXJnZXRTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CisKKy8qKgorICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBtb2RlbCBvYmplY3RzIGJ5IHRoZSBPcHRpb24gYWRhcHRlciB3aGVuIHRoZQorICogUGVyc2lzdGVuY2VVbml0IGNoYW5nZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBPcHRpb25zQWRhcHRlclRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQoreworCXByaXZhdGUgT3B0aW9ucyBvcHRpb25zOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fTkFNRV9LRVkgPSBPcHRpb25zLkVDTElQU0VMSU5LX1NFU1NJT05fTkFNRTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUUgPSAic2Vzc2lvbi1uYW1lLnRlc3QiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX05BTUVfVEVTVF9WQUxVRV8yID0gInNlc3Npb24tbmFtZS0yLnRlc3QiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05TX1hNTF9LRVkgPSBPcHRpb25zLkVDTElQU0VMSU5LX1NFU1NJT05TX1hNTDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUUgPSAic2Vzc2lvbnMteG1sLnRlc3QiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OU19YTUxfVEVTVF9WQUxVRV8yID0gInNlc3Npb25zLXhtbC0yLnRlc3QiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0RBVEFCQVNFX0tFWSA9IE9wdGlvbnMuRUNMSVBTRUxJTktfVEFSR0VUX0RBVEFCQVNFOworCXB1YmxpYyBzdGF0aWMgZmluYWwgVGFyZ2V0RGF0YWJhc2UgVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUgPSBUYXJnZXREYXRhYmFzZS5jbG91ZHNjYXBlOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9EQVRBQkFTRV9URVNUX1ZBTFVFXzIgPSAiY3VzdG9tLnRhcmdldERhdGFiYXNlLnRlc3QiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9TRVJWRVJfS0VZID0gT3B0aW9ucy5FQ0xJUFNFTElOS19UQVJHRVRfU0VSVkVSOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFRhcmdldFNlcnZlciBUQVJHRVRfU0VSVkVSX1RFU1RfVkFMVUUgPSBUYXJnZXRTZXJ2ZXIud2VibG9naWNfOTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFXzIgPSAiY3VzdG9tLnRhcmdldFNlcnZlci50ZXN0IjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX0tFWSA9IE9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRSA9IGZhbHNlOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFXzIgPSAhIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUU7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX0tFWSA9IE9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9FVkVOVF9MSVNURU5FUjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1RFU1RfVkFMVUUgPSAiYWNtZS5DdXN0b21TZXNzaW9uRXZlbnRMaXN0ZW5lciI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFXzIgPSAib3JhY2xlLnNlc3Npb25zLkN1c3RvbVNlc3Npb25FdmVudExpc3RlbmVyIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBPUkFMX01VVEFCTEVfS0VZID0gT3B0aW9ucy5FQ0xJUFNFTElOS19URU1QT1JBTF9NVVRBQkxFOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUUgPSB0cnVlOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUVfMiA9ICEgVEVNUE9SQUxfTVVUQUJMRV9URVNUX1ZBTFVFOworCisJcHVibGljIE9wdGlvbnNBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJdGhpcy5vcHRpb25zID0gdGhpcy5zdWJqZWN0LmdldE9wdGlvbnMoKTsKKwkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKKworCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zLlNFU1NJT05fTkFNRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuU0VTU0lPTlNfWE1MX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9ucy5UQVJHRVRfREFUQUJBU0VfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zLlRBUkdFVF9TRVJWRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zLlNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKKwkJCU9wdGlvbnMuU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuVEVNUE9SQUxfTVVUQUJMRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisKKwkJdGhpcy5jbGVhckV2ZW50KCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKKwkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSA3OworCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgNDsgLy8gNCBtaXNjIHByb3BlcnRpZXMKKwkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7CisJCQorCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNFU1NJT05fTkFNRV9LRVksIFNFU1NJT05fTkFNRV9URVNUX1ZBTFVFKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTRVNTSU9OU19YTUxfS0VZLCBTRVNTSU9OU19YTUxfVEVTVF9WQUxVRSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfS0VZLCBJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjIiLCAidmFsdWUuMiIpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjMiLCAidmFsdWUuMyIpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFRBUkdFVF9EQVRBQkFTRV9LRVksIFRBUkdFVF9EQVRBQkFTRV9URVNUX1ZBTFVFKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShUQVJHRVRfU0VSVkVSX0tFWSwgVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX0tFWSwgU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS40IiwgInZhbHVlLjQiKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShURU1QT1JBTF9NVVRBQkxFX0tFWSwgVEVNUE9SQUxfTVVUQUJMRV9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQlyZXR1cm47CisJfQorCQorCS8vICoqKioqKioqKiogTGlzdGVuZXJzICoqKioqKioqKioKKworCS8vICoqKioqKioqKiogU2Vzc2lvbk5hbWUgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRTZXNzaW9uTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlTRVNTSU9OX05BTUVfS0VZLAorCQkJU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJU0VTU0lPTl9OQU1FX0tFWSwKKwkJCVNFU1NJT05fTkFNRV9URVNUX1ZBTFVFLAorCQkJU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlc3Npb25OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlTRVNTSU9OX05BTUVfS0VZLAorCQkJU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUUsCisJCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFNlc3Npb25zWG1sIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U2Vzc2lvbnNYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJU0VTU0lPTlNfWE1MX0tFWSwKKwkJCVNFU1NJT05TX1hNTF9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCVNFU1NJT05TX1hNTF9LRVksCisJCQlTRVNTSU9OU19YTUxfVEVTVF9WQUxVRSwKKwkJCVNFU1NJT05TX1hNTF9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVTZXNzaW9uc1htbCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJU0VTU0lPTlNfWE1MX0tFWSwKKwkJCVNFU1NJT05TX1hNTF9URVNUX1ZBTFVFLAorCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfS0VZLAorCQkJSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19LRVksCisJCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFLAorCQkJSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19LRVksCisJCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFLAorCQkJSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFRhcmdldERhdGFiYXNlIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RGF0YWJhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJVEFSR0VUX0RBVEFCQVNFX0tFWSwKKwkJCXRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKFRBUkdFVF9EQVRBQkFTRV9URVNUX1ZBTFVFKSk7IC8vIG1vZGVsIGlzIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZQorCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJVEFSR0VUX0RBVEFCQVNFX0tFWSwKKwkJCVRBUkdFVF9EQVRBQkFTRV9URVNUX1ZBTFVFLAorCQkJVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUVfMik7CisJCS8vIHZlcmlmeSBzZXQgY3VzdG9tIGFuZCBsaXRlcmFsIHZhbHVlCisJCXRoaXMudmVyaWZ5U2V0VGFyZ2V0RGF0YWJhc2UoCisJCQlUQVJHRVRfREFUQUJBU0VfS0VZLAorCQkJVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUsCisJCQlUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVGFyZ2V0RGF0YWJhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCVRBUkdFVF9EQVRBQkFTRV9LRVksCisJCQlUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRSwKKwkJCVRBUkdFVF9EQVRBQkFTRV9URVNUX1ZBTFVFXzIpOworCX0KKwkKKwkvKioKKwkgKiBWZXJpZmllcyBzZXR0aW5nIGN1c3RvbSB0YXJnZXREYXRhYmFzZSBhbmQgbGl0ZXJhbHMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0VGFyZ2V0RGF0YWJhc2UoU3RyaW5nIGVsS2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24geworCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KTsKKwkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOworCQkvLyB0ZXN0IHNldCBjdXN0b20gdGFyZ2V0RGF0YWJhc2UuCisJCXRoaXMuY2xlYXJFdmVudCgpOworCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7CisJCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKKworCQkvLyB0ZXN0IHNldCAoVGFyZ2V0RGF0YWJhc2UpIG51bGwKKwkJdGhpcy5jbGVhckV2ZW50KCk7CisJCXRoaXMub3B0aW9ucy5zZXRUYXJnZXREYXRhYmFzZSgoVGFyZ2V0RGF0YWJhc2UpIG51bGwpOworCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKKwkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOworCQkKKwkJLy8gdGVzdCBzZXQgZW51bSBsaXRlcmFsCisJCXRoaXMuY2xlYXJFdmVudCgpOworCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMS50b1N0cmluZygpKTsKKwkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7CisJCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZih0ZXN0VmFsdWUxKSk7CisKKwkJLy8gdGVzdCBzZXQgKFN0cmluZykgbnVsbAorCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJdGhpcy5vcHRpb25zLnNldFRhcmdldERhdGFiYXNlKChTdHJpbmcpIG51bGwpOworCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKKwkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOworCX0KKwkKKwkvLyAqKioqKioqKioqIFRhcmdldFNlcnZlciB0ZXN0cyAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdFNldFRhcmdldFNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlUQVJHRVRfU0VSVkVSX0tFWSwKKwkJCXRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKFRBUkdFVF9TRVJWRVJfVEVTVF9WQUxVRSkpOyAvLyBtb2RlbCBpcyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKKwkJLy8gdmVyaWZ5IHNldCBlbnVtIHZhbHVlCisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlUQVJHRVRfU0VSVkVSX0tFWSwKKwkJCVRBUkdFVF9TRVJWRVJfVEVTVF9WQUxVRSwKKwkJCVRBUkdFVF9TRVJWRVJfVEVTVF9WQUxVRV8yKTsKKwkJLy8gdmVyaWZ5IHNldCBjdXN0b20gYW5kIGxpdGVyYWwgdmFsdWUKKwkJdGhpcy52ZXJpZnlTZXRUYXJnZXRTZXJ2ZXIoCisJCQlUQVJHRVRfU0VSVkVSX0tFWSwKKwkJCVRBUkdFVF9TRVJWRVJfVEVTVF9WQUxVRSwKKwkJCVRBUkdFVF9TRVJWRVJfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVGFyZ2V0U2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlUQVJHRVRfU0VSVkVSX0tFWSwKKwkJCVRBUkdFVF9TRVJWRVJfVEVTVF9WQUxVRSwKKwkJCVRBUkdFVF9TRVJWRVJfVEVTVF9WQUxVRV8yKTsKKwl9CisJCisJLyoqCisJICogVmVyaWZpZXMgc2V0dGluZyBjdXN0b20gdGFyZ2V0U2VydmVyIGFuZCBsaXRlcmFscy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRUYXJnZXRTZXJ2ZXIoU3RyaW5nIGVsS2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24geworCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KTsKKwkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOworCQkvLyB0ZXN0IHNldCBjdXN0b20gdGFyZ2V0U2VydmVyLgorCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTIpOworCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7CisKKwkJLy8gdGVzdCBzZXQgKFRhcmdldFNlcnZlcikgbnVsbAorCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJdGhpcy5vcHRpb25zLnNldFRhcmdldFNlcnZlcigoVGFyZ2V0U2VydmVyKSBudWxsKTsKKwkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7CisJCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKKwkJCisJCS8vIHRlc3Qgc2V0IGVudW0gbGl0ZXJhbAorCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEudG9TdHJpbmcoKSk7CisJCWFzc2VydE5vdE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOworCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YodGVzdFZhbHVlMSkpOworCisJCS8vIHRlc3Qgc2V0IChTdHJpbmcpIG51bGwKKwkJdGhpcy5jbGVhckV2ZW50KCk7CisJCXRoaXMub3B0aW9ucy5zZXRUYXJnZXRTZXJ2ZXIoKFN0cmluZykgbnVsbCk7CisJCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOworCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7CisJfQorCisJLy8gKioqKioqKioqKiBFdmVudExpc3RlbmVyIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RXZlbnRMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX0tFWSwKKwkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX0tFWSwKKwkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRSwKKwkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRXZlbnRMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9LRVksCisJCQlTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1RFU1RfVkFMVUUsCisJCQlTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBUZW1wb3JhbE11dGFibGUgdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3RTZXRUZW1wb3JhbE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJVEVNUE9SQUxfTVVUQUJMRV9LRVksCisJCQlURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJVEVNUE9SQUxfTVVUQUJMRV9LRVksCisJCQlURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUUsCisJCQlURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVRlbXBvcmFsTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJVEVNUE9SQUxfTVVUQUJMRV9LRVksCisJCQlURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUUsCisJCQlURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUVfMik7CisJfQorCisJLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24geworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05fTkFNRV9QUk9QRVJUWSkpCisJCQl0aGlzLm9wdGlvbnMuc2V0U2Vzc2lvbk5hbWUoKFN0cmluZykgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTlNfWE1MX1BST1BFUlRZKSkKKwkJCXRoaXMub3B0aW9ucy5zZXRTZXNzaW9uc1htbCgoU3RyaW5nKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKSkKKwkJCXRoaXMub3B0aW9ucy5zZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSkpCisJCQl0aGlzLnNldFRhcmdldERhdGFiYXNlUHJvcGVydHkobmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSkpCisJCQl0aGlzLnNldFRhcmdldFNlcnZlclByb3BlcnR5KG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFkpKQorCQkJdGhpcy5vcHRpb25zLnNldEV2ZW50TGlzdGVuZXIoKFN0cmluZykgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEVNUE9SQUxfTVVUQUJMRV9QUk9QRVJUWSkpCisJCQl0aGlzLm9wdGlvbnMuc2V0VGVtcG9yYWxNdXRhYmxlKChCb29sZWFuKSBuZXdWYWx1ZSk7CisJCWVsc2UKKwkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRUYXJnZXREYXRhYmFzZVByb3BlcnR5KE9iamVjdCBuZXdWYWx1ZSkgeworCQlpZiAobmV3VmFsdWUuZ2V0Q2xhc3MoKS5pc0VudW0oKSkKKwkJCXRoaXMub3B0aW9ucy5zZXRUYXJnZXREYXRhYmFzZSgoVGFyZ2V0RGF0YWJhc2UpIG5ld1ZhbHVlKTsKKwkJZWxzZQorCQkJdGhpcy5vcHRpb25zLnNldFRhcmdldERhdGFiYXNlKChTdHJpbmcpIG5ld1ZhbHVlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0VGFyZ2V0U2VydmVyUHJvcGVydHkoT2JqZWN0IG5ld1ZhbHVlKSB7CisJCWlmIChuZXdWYWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKQorCQkJdGhpcy5vcHRpb25zLnNldFRhcmdldFNlcnZlcigoVGFyZ2V0U2VydmVyKSBuZXdWYWx1ZSk7CisJCWVsc2UKKwkJCXRoaXMub3B0aW9ucy5zZXRUYXJnZXRTZXJ2ZXIoKFN0cmluZykgbmV3VmFsdWUpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKKwkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05fTkFNRV9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFNlc3Npb25OYW1lKCk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5TRVNTSU9OU19YTUxfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRTZXNzaW9uc1htbCgpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0VGFyZ2V0RGF0YWJhc2UoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlRBUkdFVF9TRVJWRVJfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRUYXJnZXRTZXJ2ZXIoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRFdmVudExpc3RlbmVyKCk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5URU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0VGVtcG9yYWxNdXRhYmxlKCk7CisJCWVsc2UKKwkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOworCQlyZXR1cm4gbW9kZWxWYWx1ZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24geworCQlPYmplY3QgZXhwZWN0ZWRWYWx1ZV8gPSBleHBlY3RlZFZhbHVlOworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSkgfHwKKwkJCXByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5UQVJHRVRfU0VSVkVSX1BST1BFUlRZKSkgeworCQkJCisJCQlleHBlY3RlZFZhbHVlXyA9IHRoaXMuY29udmVydFRvRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZShleHBlY3RlZFZhbHVlKTsKKwkJfQorCQkKKwkJc3VwZXIudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBleHBlY3RlZFZhbHVlXyk7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRUb0VjbGlwc2VMaW5rU3RyaW5nVmFsdWUoT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKKwkJcmV0dXJuIChTdHJpbmcpICgoZXhwZWN0ZWRWYWx1ZSAhPSBudWxsICYmIGV4cGVjdGVkVmFsdWUuZ2V0Q2xhc3MoKS5pc0VudW0oKSkgPworCQkJCXRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKGV4cGVjdGVkVmFsdWUpIDogLy8gbW9kZWwgaXMgc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlCisJCQkJZXhwZWN0ZWRWYWx1ZSk7IC8vIGFscmVhZHkgYSBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlCisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgeworCQlyZXR1cm4gdGhpcy5vcHRpb25zOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL09wdGlvbnNWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL09wdGlvbnNWYWx1ZU1vZGVsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjZiOGEyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworCisvKioKKyAqIE9wdGlvbnNWYWx1ZU1vZGVsVGVzdHMKKyAqLworcHVibGljIGNsYXNzIE9wdGlvbnNWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCit7CisJcHJpdmF0ZSBPcHRpb25zIG9wdGlvbnM7CisKKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlcjsKKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGlzdGVuZXI7CisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50OworCisJcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOworCisJcHVibGljIE9wdGlvbnNWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJdGhpcy5vcHRpb25zID0gdGhpcy5zdWJqZWN0LmdldE9wdGlvbnMoKTsgLy8gU3ViamVjdAorCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gb3B0aW9uc0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4odGhpcy5vcHRpb25zKTsKKwkJCisJCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyID0gdGhpcy5idWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBKG9wdGlvbnNIb2xkZXIpOworCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xpc3RlbmVyID0gdGhpcy5idWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NoYW5nZUxpc3RlbmVyKCk7CisJCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xpc3RlbmVyKTsKKwkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNFdmVudCA9IG51bGw7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKKwkJQWJzdHJhY3RNb2RlbCBzdWJqZWN0T3B0aW9ucyA9IChBYnN0cmFjdE1vZGVsKSB0aGlzLm9wdGlvbnM7IC8vIFN1YmplY3QKKwkJCisJCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPiBpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQSA9IAorCQkJKFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPikgdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXI7CisJCWFzc2VydFRydWUoaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7CisJCWFzc2VydFRydWUoc3ViamVjdE9wdGlvbnMuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKSk7CisJCQorCQlpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMaXN0ZW5lcik7CisJCWFzc2VydEZhbHNlKHN1YmplY3RPcHRpb25zLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKE9wdGlvbnMuU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSkpOworCQlhc3NlcnRGYWxzZShpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4gCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgKKwkJCU9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUywgCisJCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFKTsKKwkJcmV0dXJuOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgeworCQlyZXR1cm4gdGhpcy5vcHRpb25zOworCX0KKworCS8vICoqKioqKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgKioqKioqKgorCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQShQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gc3ViamVjdEhvbGRlcikgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiBlbnVtVmFsdWUpIHsKKwkJCQl0aGlzLnN1YmplY3Quc2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKGVudW1WYWx1ZSk7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ2hhbmdlTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKKwkJCQlPcHRpb25zVmFsdWVNb2RlbFRlc3RzLnRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzRXZlbnQgPSBlOworCQkJfQorCQl9OworCX0KKworCS8vICoqKioqKiBUZXN0cyAqKioqKioqIAorCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKKwkJLy8gKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyAqKioqKioqIAorCQl0aGlzLnZlcmlmeUluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBVmFsdWUoSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRSk7CisJCWFzc2VydEVxdWFscyhPcHRpb25zLkRFRkFVTFRfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUywgdGhpcy5vcHRpb25zLmdldERlZmF1bHRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vICoqKioqKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgKioqKioqKiAKKwkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNFdmVudCA9IG51bGw7CisJCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOworCQlCb29sZWFuIG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyA9ICFJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFOworCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgorCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlci5zZXRWYWx1ZShuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOworCQl0aGlzLnZlcmlmeUluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBVmFsdWUobmV3SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKTsKKwkJYXNzZXJ0Tm90TnVsbCh0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbFZhbHVlKCkgeworCQlTdHJpbmcgbm90RGVsZXRlZCA9ICJQcm9wZXJ0eSBub3QgZGVsZXRlZCI7CisJCS8vICoqKioqKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgKioqKioqKgorCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50ID0gbnVsbDsKKwkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCisJCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLnNldFZhbHVlKG51bGwpOworCQkvLyB0ZXN0aW5nIEhvbGRlcgorCQl0aGlzLnZlcmlmeUluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBVmFsdWUobnVsbCk7CisJCWFzc2VydE5vdE51bGwodGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNFdmVudCk7CisJCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcworCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTLCBub3REZWxldGVkKTsKKwl9CisKKwkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCisKKwkvKioKKwkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+CisJICogMS4gc3ViamVjdCB2YWx1ZTxicj4KKwkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KKwkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+CisJICovCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgeworCQl0aGlzLnZlcmlmeUFBVmFsdWUoCisJCQl0ZXN0VmFsdWUsIAorCQkJdGhpcy5vcHRpb25zLmdldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpLCAKKwkJCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLCAKKwkJCU9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUyk7CisJfQorCisJLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24geworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlU2NoZW1hR2VuZXJhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVNjaGVtYUdlbmVyYXRpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZTZjNTUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVNjaGVtYUdlbmVyYXRpb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKy8qKgorICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQorICovCitwdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVNjaGVtYUdlbmVyYXRpb25UZXN0cyB7CisKKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVNjaGVtYUdlbmVyYXRpb25UZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShTY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2NoZW1hR2VuZXJhdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7CisKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVNjaGVtYUdlbmVyYXRpb25UZXN0cygpIHsKKwkJc3VwZXIoKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmIyM2UyCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMuamF2YQpAQCAtMCwwICsxLDIzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uRGRsR2VuZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5PdXRwdXRNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKKworLyoqCisgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIE91dHB1dE1vZGUgbW9kZWwgb2JqZWN0IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uIGFkYXB0ZXIKKyAqIHdoZW4gdGhlIFBlcnNpc3RlbmNlVW5pdCBjaGFuZ2VzLgorICovCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBTY2hlbWFHZW5lcmF0aW9uQWRhcHRlclRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQoreworCXByaXZhdGUgU2NoZW1hR2VuZXJhdGlvbiBzY2hlbWFHZW5lcmF0aW9uOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRERMX0dFTkVSQVRJT05fVFlQRV9LRVkgPSBTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBEZGxHZW5lcmF0aW9uVHlwZSBERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUgPSBEZGxHZW5lcmF0aW9uVHlwZS5kcm9wX2FuZF9jcmVhdGVfdGFibGVzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgRGRsR2VuZXJhdGlvblR5cGUgRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFXzIgPSBEZGxHZW5lcmF0aW9uVHlwZS5ub25lOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX01PREVfS0VZID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE91dHB1dE1vZGUgT1VUUFVUX01PREVfVEVTVF9WQUxVRSA9IE91dHB1dE1vZGUuc3FsX3NjcmlwdDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE91dHB1dE1vZGUgT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yID0gT3V0cHV0TW9kZS5kYXRhYmFzZTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRklMRV9OQU1FX0tFWSA9IFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFID0gImNyZWF0ZS1maWxlLW5hbWUudGVzdCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9GSUxFX05BTUVfVEVTVF9WQUxVRV8yID0gImNyZWF0ZS1maWxlLW5hbWUtMi50ZXN0IjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QX0ZJTEVfTkFNRV9LRVkgPSBTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFID0gImRyb3AtZmlsZS1uYW1lLnRlc3QiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFXzIgPSAiZHJvcC1maWxlLW5hbWUtMi50ZXN0IjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9MT0NBVElPTl9LRVkgPSBTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0FQUExJQ0FUSU9OX0xPQ0FUSU9OOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9MT0NBVElPTl9URVNUX1ZBTFVFID0gIkM6L3RlbXAiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9MT0NBVElPTl9URVNUX1ZBTFVFXzIgPSAiQzovdG1wIjsKKworCXB1YmxpYyBTY2hlbWFHZW5lcmF0aW9uQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXRoaXMuc2NoZW1hR2VuZXJhdGlvbiA9IHRoaXMuc3ViamVjdC5nZXRTY2hlbWFHZW5lcmF0aW9uKCk7CisJCQorCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOworCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2NoZW1hR2VuZXJhdGlvbi5ERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2NoZW1hR2VuZXJhdGlvbi5DUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2NoZW1hR2VuZXJhdGlvbi5EUk9QX0ZJTEVfTkFNRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4gQ2Fubm90IHVzZQorCSAqIFByb3BlcnR5IEhvbGRlciB0byBpbml0aWFsaXplIGJlY2F1c2UgaXQgaXMgbm90IGNyZWF0ZWQgeWV0CisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKKwkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSA5OworCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDU7CisJCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOworCQkKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgicHJvcGVydHkuMCIsICJ2YWx1ZS4wIik7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoT1VUUFVUX01PREVfS0VZLCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihPVVRQVVRfTU9ERV9URVNUX1ZBTFVFKSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoInByb3BlcnR5LjIiLCAidmFsdWUuMiIpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgicHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRERMX0dFTkVSQVRJT05fVFlQRV9LRVksIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKERETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KENSRUFURV9GSUxFX05BTUVfS0VZLCBDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUUpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KERST1BfRklMRV9OQU1FX0tFWSwgRFJPUF9GSUxFX05BTUVfVEVTVF9WQUxVRSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQVBQTElDQVRJT05fTE9DQVRJT05fS0VZLCBBUFBMSUNBVElPTl9MT0NBVElPTl9URVNUX1ZBTFVFKTsKKwkJcmV0dXJuOworCX0KKworCS8vICoqKioqKioqKiogQ3JlYXRlRmlsZU5hbWUgKioqKioqKioqKgorCS8qKgorCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ3JlYXRlRmlsZU5hbWUgcHJvcGVydHkgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24KKwkgKiBhZGFwdGVyIHdoZW4gdGhlIFBVIG9yIHRoZSBtb2RlbCBjaGFuZ2VzLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTZXRDcmVhdGVGaWxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlDUkVBVEVfRklMRV9OQU1FX0tFWSwKKwkJCUNSRUFURV9GSUxFX05BTUVfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlDUkVBVEVfRklMRV9OQU1FX0tFWSwKKwkJCUNSRUFURV9GSUxFX05BTUVfVEVTVF9WQUxVRSwKKwkJCUNSRUFURV9GSUxFX05BTUVfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ3JlYXRlRmlsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCUNSRUFURV9GSUxFX05BTUVfS0VZLAorCQkJQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFLAorCQkJQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFXzIpOworCX0KKwkKKwkvLyAqKioqKioqKioqIERyb3BGaWxlTmFtZSAqKioqKioqKioqCisJLyoqCisJICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBEcm9wRmlsZU5hbWUgcHJvcGVydHkgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24gYWRhcHRlcgorCSAqIHdoZW4gdGhlIFBVIG9yIHRoZSBtb2RlbCBjaGFuZ2VzLgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTZXREcm9wRmlsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJRFJPUF9GSUxFX05BTUVfS0VZLAorCQkJRFJPUF9GSUxFX05BTUVfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlEUk9QX0ZJTEVfTkFNRV9LRVksCisJCQlEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFLAorCQkJRFJPUF9GSUxFX05BTUVfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRHJvcEZpbGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlEUk9QX0ZJTEVfTkFNRV9LRVksIAorCQkJRFJPUF9GSUxFX05BTUVfVEVTVF9WQUxVRSwgCisJCQlEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFXzIpOworCX0KKworCS8vICoqKioqKioqKiogQXBwbGljYXRpb25Mb2NhdGlvbiAqKioqKioqKioqCisJLyoqCisJICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBBcHBsaWNhdGlvbkxvY2F0aW9uIHByb3BlcnR5IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uCisJICogYWRhcHRlciB3aGVuIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0QXBwbGljYXRpb25Mb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlBUFBMSUNBVElPTl9MT0NBVElPTl9LRVksCisJCQlBUFBMSUNBVElPTl9MT0NBVElPTl9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX0tFWSwKKwkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUUsCisJCQlBUFBMSUNBVElPTl9MT0NBVElPTl9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVBcHBsaWNhdGlvbkxvY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlBUFBMSUNBVElPTl9MT0NBVElPTl9LRVksCisJCQlBUFBMSUNBVElPTl9MT0NBVElPTl9URVNUX1ZBTFVFLAorCQkJQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIE91dHB1dE1vZGUgKioqKioqKioqKgorCS8qKgorCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgT3V0cHV0TW9kZSBwcm9wZXJ0eSBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbiBhZGFwdGVyCisJICogd2hlbiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCisJICovCisJcHVibGljIHZvaWQgdGVzdFNldE91dHB1dE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJT1VUUFVUX01PREVfS0VZLAorCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlPVVRQVVRfTU9ERV9LRVksCisJCQlPVVRQVVRfTU9ERV9URVNUX1ZBTFVFLAorCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlT3V0cHV0TW9kZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJT1VUUFVUX01PREVfS0VZLCAKKwkJCU9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIAorCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIERkbEdlbmVyYXRpb25UeXBlICoqKioqKioqKioKKwkvKioKKwkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIERkbEdlbmVyYXRpb25UeXBlIHByb3BlcnR5IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uCisJICogYWRhcHRlciB3aGVuIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RGRsR2VuZXJhdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJRERMX0dFTkVSQVRJT05fVFlQRV9LRVksCisJCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJRERMX0dFTkVSQVRJT05fVFlQRV9LRVksCisJCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUsCisJCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZURkbEdlbmVyYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlERExfR0VORVJBVElPTl9UWVBFX0tFWSwgCisJCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUsIAorCQkJRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFXzIpOworCX0KKworCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24geworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZKSkKKwkJCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5zZXRPdXRwdXRNb2RlKChPdXRwdXRNb2RlKSBuZXdWYWx1ZSk7CisJCS8vIGVsc2UgaWYoIHByb3BlcnR5TmFtZS5lcXVhbHMoIENhY2hpbmcuQ0FDSEVfU0laRV9QUk9QRVJUWSkpCisJCS8vIFRPRE8KKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLkRETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFkpKQorCQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldERkbEdlbmVyYXRpb25UeXBlKChEZGxHZW5lcmF0aW9uVHlwZSkgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkpKQorCQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldEFwcGxpY2F0aW9uTG9jYXRpb24oKFN0cmluZykgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSkpCisJCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uc2V0Q3JlYXRlRmlsZU5hbWUoKFN0cmluZykgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpKQorCQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldERyb3BGaWxlTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7CisJCWVsc2UKKwkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKKwkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0T3V0cHV0TW9kZSgpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldERkbEdlbmVyYXRpb25UeXBlKCk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU2NoZW1hR2VuZXJhdGlvbi5BUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldEFwcGxpY2F0aW9uTG9jYXRpb24oKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLkNSRUFURV9GSUxFX05BTUVfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRDcmVhdGVGaWxlTmFtZSgpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXREcm9wRmlsZU5hbWUoKTsKKwkJZWxzZQorCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7CisJCXJldHVybiBtb2RlbFZhbHVlOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgeworCQlyZXR1cm4gdGhpcy5zY2hlbWFHZW5lcmF0aW9uOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2FhYjEwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb25CYXNpY0FkYXB0ZXJUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uRGRsR2VuZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5PdXRwdXRNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7CisKKy8qKgorICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBPdXRwdXRNb2RlIG1vZGVsIG9iamVjdCBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbiBhZGFwdGVyCisgKiB3aGVuIHRoZSBQZXJzaXN0ZW5jZVVuaXQgY2hhbmdlcy4KKyAqLworcHVibGljIGNsYXNzIFNjaGVtYUdlbmVyYXRpb25CYXNpY0FkYXB0ZXJUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKK3sKKwlwcml2YXRlIFNjaGVtYUdlbmVyYXRpb24gc2NoZW1hR2VuZXJhdGlvbjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG91dHB1dE1vZGVLZXkgPSBTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRkbEdlblR5cGVLZXkgPSBTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEU7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE91dHB1dE1vZGUgT1VUUFVUX01PREVfVEVTVF9WQUxVRSA9IE91dHB1dE1vZGUuc3FsX3NjcmlwdDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE91dHB1dE1vZGUgT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yID0gT3V0cHV0TW9kZS5kYXRhYmFzZTsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIERkbEdlbmVyYXRpb25UeXBlIERETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSA9IERkbEdlbmVyYXRpb25UeXBlLmRyb3BfYW5kX2NyZWF0ZV90YWJsZXM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBEZGxHZW5lcmF0aW9uVHlwZSBERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUVfMiA9IERkbEdlbmVyYXRpb25UeXBlLm5vbmU7CisKKwlwdWJsaWMgU2NoZW1hR2VuZXJhdGlvbkJhc2ljQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCQorCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24gPSB0aGlzLnN1YmplY3QuZ2V0U2NoZW1hR2VuZXJhdGlvbigpOworCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOworCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2NoZW1hR2VuZXJhdGlvbi5ERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5jbGVhckV2ZW50KCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIENhbm5vdCB1c2UKKwkgKiBQcm9wZXJ0eSBIb2xkZXIgdG8gaW5pdGlhbGl6ZSBiZWNhdXNlIGl0IGlzIG5vdCBjcmVhdGVkIHlldAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7CisJCXRoaXMucHJvcGVydGllc1RvdGFsID0gNjsKKwkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSAyOworCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKKwkJCisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoInByb3BlcnR5LjAiLCAidmFsdWUuMCIpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KG91dHB1dE1vZGVLZXksIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgicHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoInByb3BlcnR5LjMiLCAidmFsdWUuMyIpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS40IiwgInZhbHVlLjQiKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShkZGxHZW5UeXBlS2V5LCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUpKTsKKwkJcmV0dXJuOworCX0KKworCS8qKiAqKioqKiogdGVzdCBtZXRob2RzICoqKioqKiogKi8KKworCS8qKgorCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgT3V0cHV0TW9kZSBwcm9wZXJ0eSBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbiBhZGFwdGVyCisJICogd2hlbiB0aGUgUFUgY2hhbmdlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0T3V0cHV0TW9kZVVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlMaXN0VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IHByb3BlcnRpZXNBZGFwdGVyID0gdGhpcy5idWlsZFByb3BlcnRpZXNBZGFwdGVyKHRoaXMuc3ViamVjdEhvbGRlcik7CisJCUxpc3RWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlciA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5Pihwcm9wZXJ0aWVzQWRhcHRlciwgUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5LlZBTFVFX1BST1BFUlRZKTsKKwkJCisJCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc2NoZW1hR2VuZXJhdGlvbiwgU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSk7CisJCQorCQkvLyBCYXNpYworCQlhc3NlcnRUcnVlKHNjaGVtYUdlbmVyYXRpb24uaXRlbUlzUHJvcGVydHkodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShvdXRwdXRNb2RlS2V5KSkpOworCQlhc3NlcnRFcXVhbHMoT1VUUFVUX01PREVfVEVTVF9WQUxVRSwgdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldE91dHB1dE1vZGUoKSk7CisJCQorCQkvLyBSZXBsYWNlCisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkob3V0cHV0TW9kZUtleSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yKTsKKwkJdGhpcy52ZXJpZnlQdXRFdmVudChTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZLCBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFXzIsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOworCQkKKwkJLy8gUmVtb3ZlCisJCXRoaXMuY2xlYXJFdmVudCgpOworCQktLXRoaXMucHJvcGVydGllc1RvdGFsOworCQktLXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKKwkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShvdXRwdXRNb2RlS2V5KTsKKwkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KG91dHB1dE1vZGVLZXkpKTsKKwkJYXNzZXJ0RXF1YWxzKHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSwgdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgLSAxKTsKKwkJYXNzZXJ0Tm90TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50KTsKKwkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50LmdldE5ld1ZhbHVlKCkpOworCQkKKwkJLy8gQWRkIG9yaWdpbmFsIE91dHB1dE1vZGUKKwkJKyt0aGlzLnByb3BlcnRpZXNUb3RhbDsKKwkJKyt0aGlzLm1vZGVsUHJvcGVydGllc1NpemU7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkob3V0cHV0TW9kZUtleSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5UHV0RXZlbnQoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRSwgdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldE91dHB1dE1vZGUoKSk7CisJCQorCQkvLyBSZXBsYWNlIGFnYWluCisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkob3V0cHV0TW9kZUtleSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yKTsKKwkJdGhpcy52ZXJpZnlQdXRFdmVudChTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZLCBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFXzIsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOworCQkKKwkJLy8gUmVwbGFjZSBieSBzZXR0aW5nIG1vZGVsIG9iamVjdAorCQl0aGlzLmNsZWFyRXZlbnQoKTsKKwkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldE91dHB1dE1vZGUoT1VUUFVUX01PREVfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5UHV0RXZlbnQoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRSwgdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldE91dHB1dE1vZGUoKSk7CisJfQorCisJLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgorCUBPdmVycmlkZQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgeworCQlyZXR1cm4gdGhpcy5zY2hlbWFHZW5lcmF0aW9uOworCX0KKworCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBidWlsZFByb3BlcnRpZXNBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgeworCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+KHN1YmplY3RIb2xkZXIsIFBlcnNpc3RlbmNlVW5pdC5QUk9QRVJUSUVTX0xJU1QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IGxpc3RJdGVyYXRvcl8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wcm9wZXJ0aWVzKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnByb3BlcnRpZXNTaXplKCk7CisJCQl9CisJCX07CisJfQorCisJLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24geworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NmFiOTYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uRGRsR2VuZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5PdXRwdXRNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOworCisvKioKKyAqIFNjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMKKyAqIAorICogVGVzdHMgdGhlIFByb3BlcnR5VmFsdWVNb2RlbCBvZiBTY2hlbWFHZW5lcmF0aW9uIG1vZGVsIGFuZCB0aGUgdXBkYXRlIG9mIHRoZQorICogUGVyc2lzdGVuY2VVbml0LgorICovCitwdWJsaWMgY2xhc3MgU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKK3sKKwlwcml2YXRlIFNjaGVtYUdlbmVyYXRpb24gc2NoZW1hR2VuOworCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+IHNjaGVtYUdlbkhvbGRlcjsKKworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGRsR2VuZXJhdGlvblR5cGU+IGRkbEdlbmVyYXRpb25UeXBlSG9sZGVyOworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBkZGxHZW5lcmF0aW9uVHlwZUV2ZW50OworCisJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPdXRwdXRNb2RlPiBvdXRwdXRNb2RlSG9sZGVyOworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBvdXRwdXRNb2RlRXZlbnQ7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIERkbEdlbmVyYXRpb25UeXBlIERETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSA9IERkbEdlbmVyYXRpb25UeXBlLmRyb3BfYW5kX2NyZWF0ZV90YWJsZXM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUgPSBPdXRwdXRNb2RlLnNxbF9zY3JpcHQ7CisKKwlwdWJsaWMgU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQl0aGlzLnNjaGVtYUdlbiA9IHRoaXMuc3ViamVjdC5nZXRTY2hlbWFHZW5lcmF0aW9uKCk7IC8vIFN1YmplY3QKKwkJdGhpcy5zY2hlbWFHZW5Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+KHRoaXMuc2NoZW1hR2VuKTsKKwkJCisJCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVIb2xkZXIgPSB0aGlzLmJ1aWxkRGRsR2VuZXJhdGlvblR5cGVBQSh0aGlzLnNjaGVtYUdlbkhvbGRlcik7CisJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZGRsR2VuZXJhdGlvblR5cGVMaXN0ZW5lciA9IHRoaXMuYnVpbGREZGxHZW5lcmF0aW9uVHlwZUNoYW5nZUxpc3RlbmVyKCk7CisJCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGRkbEdlbmVyYXRpb25UeXBlTGlzdGVuZXIpOworCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlRXZlbnQgPSBudWxsOworCQkKKwkJdGhpcy5vdXRwdXRNb2RlSG9sZGVyID0gdGhpcy5idWlsZE91dHB1dE1vZGVBQSh0aGlzLnNjaGVtYUdlbkhvbGRlcik7CisJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgb3V0cHV0TW9kZUxpc3RlbmVyID0gdGhpcy5idWlsZE91dHB1dE1vZGVDaGFuZ2VMaXN0ZW5lcigpOworCQl0aGlzLm91dHB1dE1vZGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIG91dHB1dE1vZGVMaXN0ZW5lcik7CisJCXRoaXMub3V0cHV0TW9kZUV2ZW50ID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4gQ2Fubm90IHVzZQorCSAqIFByb3BlcnR5IEhvbGRlciB0byBpbml0aWFsaXplIGJlY2F1c2UgaXQgaXMgbm90IGNyZWF0ZWQgeWV0CisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgKKwkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSwKKwkJCURETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCisJCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFLAorCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRSk7CisJCXJldHVybjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKKwkJcmV0dXJuIHRoaXMuc2NoZW1hR2VuOworCX0KKworCS8qKiAqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKiAqLworCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGRsR2VuZXJhdGlvblR5cGU+IGJ1aWxkRGRsR2VuZXJhdGlvblR5cGVBQShQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gc3ViamVjdEhvbGRlcikgeworCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBEZGxHZW5lcmF0aW9uVHlwZT4oc3ViamVjdEhvbGRlciwgU2NoZW1hR2VuZXJhdGlvbi5ERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBEZGxHZW5lcmF0aW9uVHlwZSBidWlsZFZhbHVlXygpIHsKKwkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERkbEdlbmVyYXRpb25UeXBlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKERkbEdlbmVyYXRpb25UeXBlIGVudW1WYWx1ZSkgeworCQkJCXRoaXMuc3ViamVjdC5zZXREZGxHZW5lcmF0aW9uVHlwZShlbnVtVmFsdWUpOworCQkJfQorCQl9OworCX0KKworCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERkbEdlbmVyYXRpb25UeXBlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKKwkJCQlTY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZGRsR2VuZXJhdGlvblR5cGVFdmVudCA9IGU7CisJCQl9CisJCX07CisJfQorCisJLyoqICoqKioqKiBPdXRwdXRNb2RlICoqKioqKiogKi8KKwlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE91dHB1dE1vZGU+IGJ1aWxkT3V0cHV0TW9kZUFBKFByb3BlcnR5VmFsdWVNb2RlbDxTY2hlbWFHZW5lcmF0aW9uPiBzdWJqZWN0SG9sZGVyKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIE91dHB1dE1vZGU+KHN1YmplY3RIb2xkZXIsIFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIE91dHB1dE1vZGUgYnVpbGRWYWx1ZV8oKSB7CisJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRPdXRwdXRNb2RlKCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE91dHB1dE1vZGUgZW51bVZhbHVlKSB7CisJCQkJdGhpcy5zdWJqZWN0LnNldE91dHB1dE1vZGUoZW51bVZhbHVlKTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRPdXRwdXRNb2RlQ2hhbmdlTGlzdGVuZXIoKSB7CisJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKKwkJCQlTY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMub3V0cHV0TW9kZUV2ZW50ID0gZTsKKwkJCX0KKwkJfTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7CisJCS8qKiAqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKiAqLworCQl0aGlzLnZlcmlmeURkbEdlbmVyYXRpb25UeXBlQUFWYWx1ZShERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUpOworCQlhc3NlcnRFcXVhbHMoCisJCQlTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRERMX0dFTkVSQVRJT05fVFlQRSwKKwkJCXRoaXMuc2NoZW1hR2VuLmdldERlZmF1bHREZGxHZW5lcmF0aW9uVHlwZSgpKTsKKwkJLyoqICoqKioqKiBPdXRwdXRNb2RlICoqKioqKiogKi8KKwkJdGhpcy52ZXJpZnlPdXRwdXRNb2RlQUFWYWx1ZShPVVRQVVRfTU9ERV9URVNUX1ZBTFVFKTsKKwkJYXNzZXJ0RXF1YWxzKAorCQkJU2NoZW1hR2VuZXJhdGlvbi5ERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX09VVFBVVF9NT0RFLAorCQkJdGhpcy5zY2hlbWFHZW4uZ2V0RGVmYXVsdE91dHB1dE1vZGUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8qKiAqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKiAqLworCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlRXZlbnQgPSBudWxsOworCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmRkbEdlbmVyYXRpb25UeXBlSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOworCQlEZGxHZW5lcmF0aW9uVHlwZSBuZXdEZGxHZW5lcmF0aW9uVHlwZSA9IERkbEdlbmVyYXRpb25UeXBlLmNyZWF0ZV90YWJsZXM7CisJCS8vIE1vZGlmeSB0aGUgcGVyc2lzdGVuY2VVbml0IGRpcmVjdGx5CisJCXRoaXMuc3ViamVjdC5zZXRQcm9wZXJ0eSgKKwkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSwKKwkJCXRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKG5ld0RkbEdlbmVyYXRpb25UeXBlKSwKKwkJCWZhbHNlKTsKKwkJdGhpcy52ZXJpZnlEZGxHZW5lcmF0aW9uVHlwZUFBVmFsdWUobmV3RGRsR2VuZXJhdGlvblR5cGUpOworCQlhc3NlcnROb3ROdWxsKHRoaXMuZGRsR2VuZXJhdGlvblR5cGVFdmVudCk7CisJCQorCQkvKiogKioqKioqIE91dHB1dE1vZGUgKioqKioqKiAqLworCQl0aGlzLm91dHB1dE1vZGVFdmVudCA9IG51bGw7CisJCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMub3V0cHV0TW9kZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKKwkJT3V0cHV0TW9kZSBuZXdPdXRwdXRNb2RlID0gT3V0cHV0TW9kZS5kYXRhYmFzZTsKKwkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKKwkJdGhpcy5vdXRwdXRNb2RlSG9sZGVyLnNldFZhbHVlKG5ld091dHB1dE1vZGUpOworCQl0aGlzLnZlcmlmeU91dHB1dE1vZGVBQVZhbHVlKG5ld091dHB1dE1vZGUpOworCQlhc3NlcnROb3ROdWxsKHRoaXMub3V0cHV0TW9kZUV2ZW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbFZhbHVlKCkgeworCQkvKiogKioqKioqIERkbEdlbmVyYXRpb25UeXBlICoqKioqKiogKi8KKwkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZUV2ZW50ID0gbnVsbDsKKwkJLy8gU2V0dGluZyB0aGUgcGVyc2lzdGVuY2VVbml0IGRpcmVjdGx5CisJCXRoaXMuc3ViamVjdC5zZXRQcm9wZXJ0eShTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUsIG51bGwsIGZhbHNlKTsKKwkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKKwkJLy8gdGVzdGluZyBIb2xkZXIKKwkJdGhpcy52ZXJpZnlEZGxHZW5lcmF0aW9uVHlwZUFBVmFsdWUobnVsbCk7CisJCWFzc2VydE5vdE51bGwodGhpcy5kZGxHZW5lcmF0aW9uVHlwZUV2ZW50KTsKKwkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCisJCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFKTsKKwkJYXNzZXJ0TnVsbChwcm9wZXJ0eSk7CisJCQorCQkvKiogKioqKioqIE91dHB1dE1vZGUgKioqKioqKiAqLworCQl0aGlzLm91dHB1dE1vZGVFdmVudCA9IG51bGw7CisJCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgorCQl0aGlzLm91dHB1dE1vZGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7CisJCS8vIHRlc3RpbmcgSG9sZGVyCisJCXRoaXMudmVyaWZ5T3V0cHV0TW9kZUFBVmFsdWUobnVsbCk7CisJCWFzc2VydE5vdE51bGwodGhpcy5vdXRwdXRNb2RlRXZlbnQpOworCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKKwkJcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUpOworCQlhc3NlcnROdWxsKHByb3BlcnR5KTsKKwl9CisKKwkvKiogKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKiAqLworCS8qKgorCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KKwkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgorCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgorCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlEZGxHZW5lcmF0aW9uVHlwZUFBVmFsdWUoRGRsR2VuZXJhdGlvblR5cGUgdGVzdFZhbHVlKSB7CisJCXRoaXMudmVyaWZ5QUFWYWx1ZSgKKwkJCXRlc3RWYWx1ZSwKKwkJCXRoaXMuc2NoZW1hR2VuLmdldERkbEdlbmVyYXRpb25UeXBlKCksCisJCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlSG9sZGVyLAorCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFKTsKKwl9CisKKwkvKioKKwkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+CisJICogMS4gc3ViamVjdCB2YWx1ZTxicj4KKwkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KKwkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+CisJICovCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5T3V0cHV0TW9kZUFBVmFsdWUoT3V0cHV0TW9kZSB0ZXN0VmFsdWUpIHsKKwkJdGhpcy52ZXJpZnlBQVZhbHVlKAorCQkJdGVzdFZhbHVlLAorCQkJdGhpcy5zY2hlbWFHZW4uZ2V0T3V0cHV0TW9kZSgpLAorCQkJdGhpcy5vdXRwdXRNb2RlSG9sZGVyLAorCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSk7CisJfQorCisJLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24geworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9DdXN0b21pemF0aW9uQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2N1c3RvbWl6YXRpb24vQ3VzdG9taXphdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2U1OWI3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9DdXN0b21pemF0aW9uQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rSnBhUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eUxpc3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb24uQ3VzdG9taXplclByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmN1c3RvbWl6YXRpb24uV2VhdmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5QZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBtb2RlbCBvYmplY3RzIGJ5IHRoZSBDdXN0b21pemF0aW9uIGFkYXB0ZXIgd2hlbiB0aGUKLSAqIFBlcnNpc3RlbmNlVW5pdCBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9taXphdGlvbkFkYXB0ZXJUZXN0cyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDdXN0b21pemF0aW9uIGN1c3RvbWl6YXRpb247Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgZW50aXRpZXNFdmVudDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9URVNUID0gIkVtcGxveWVlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEVTVF8yID0gIkFkZHJlc3MiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhST1dfRVhDRVBUSU9OU19LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUVfMiA9ICEgVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19MQVpZX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklOR19MQVpZOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRV8yID0gISBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRV8yID0gISBXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFXzIgPSAhIFdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DVVNUT01JWkVSX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRSA9ICJzZXNzaW9uLmN1c3RvbWl6ZXIudGVzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFXzIgPSAic2Vzc2lvbi5jdXN0b21pemVyLTIudGVzdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdlYXZpbmcgV0VBVklOR19URVNUX1ZBTFVFID0gV2VhdmluZy5mYWxzZV87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBXZWF2aW5nIFdFQVZJTkdfVEVTVF9WQUxVRV8yID0gV2VhdmluZy5zdGF0aWNfOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NSVpFUl9LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiArIEVOVElUWV9URVNUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTUlaRVJfVEVTVF9WQUxVRSA9ICJhY21lLnNlc3Npb25zLkRlc2NyaXB0b3JDdXN0b21pemVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01JWkVSX1RFU1RfVkFMVUVfMiA9ICJhY21lLnNlc3Npb25zLkN1c3RvbWl6ZXIiOwotCi0JcHVibGljIEN1c3RvbWl6YXRpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmdldEN1c3RvbWl6YXRpb24oKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCi0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uV0VBVklOR19MQVpZX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLlNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uV0VBVklOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgZW50aXRpZXNDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRFbnRpdGllc0NoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5FTlRJVElFU19MSVNUX1BST1BFUlRZLCBlbnRpdGllc0NoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSA3OwotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgNDsgLy8gNCBtaXNjIHByb3BlcnRpZXMKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dCgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoVEhST1dfRVhDRVBUSU9OU19LRVksIFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoV0VBVklOR19MQVpZX0tFWSwgV0VBVklOR19MQVpZX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX0tFWSwgV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZLCBXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dCgibWlzYy5wcm9wZXJ0eS4yIiwgInZhbHVlLjIiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoU0VTU0lPTl9DVVNUT01JWkVSX0tFWSwgU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KFdFQVZJTkdfS0VZLCBXRUFWSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dCgibWlzYy5wcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoIm1pc2MucHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KENVU1RPTUlaRVJfS0VZLCBDVVNUT01JWkVSX1RFU1RfVkFMVUUpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gKioqKioqKioqKiBMaXN0ZW5lcnMgKioqKioqKioqKgotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkRW50aXRpZXNDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ3VzdG9taXphdGlvbkFkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUN1c3RvbWl6YXRpb25BZGFwdGVyVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ3VzdG9taXphdGlvbkFkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlDdXN0b21pemF0aW9uQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlDdXN0b21pemF0aW9uQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlDdXN0b21pemF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZW50aXR5Q2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckV2ZW50KCkgewotCQlzdXBlci5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuZW50aXRpZXNFdmVudCA9IG51bGw7Ci0JfQotCi0Jdm9pZCBlbnRpdHlDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuZW50aXRpZXNFdmVudCA9IGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBlbnRpdGllcyBsaXN0ICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0RW50aXRpZXNMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGFkZAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZEVudGl0eShFTlRJVFlfVEVTVF8yKTsKLQkJCi0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmVudGl0aWVzRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuZW50aXRpZXNFdmVudC5nZXRBc3BlY3ROYW1lKCksIEN1c3RvbWl6YXRpb24uRU5USVRJRVNfTElTVF9QUk9QRVJUWSk7Ci0JCQotCQkvLyByZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5yZW1vdmVFbnRpdHkoRU5USVRZX1RFU1RfMik7Ci0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmVudGl0aWVzRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuZW50aXRpZXNFdmVudC5nZXRBc3BlY3ROYW1lKCksIEN1c3RvbWl6YXRpb24uRU5USVRJRVNfTElTVF9QUk9QRVJUWSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBMaXN0ZW5lcnMgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gbmV3Ci0JCUxpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgUHJvcGVydHk+IHByb3BlcnRpZXNBZGFwdGVyID0gCi0JCQkoTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQcm9wZXJ0eT4pICgoRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzKSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMpLnByb3BlcnRpZXNBZGFwdGVyKCk7Ci0JCUdlbmVyaWNQcm9wZXJ0eSBjdGRQcm9wZXJ0eSA9IChHZW5lcmljUHJvcGVydHkpIHRoaXMucGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoVEhST1dfRVhDRVBUSU9OU19LRVkpOwotCQlMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlciA9ICgoRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzKSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMpLnByb3BlcnR5TGlzdEFkYXB0ZXIoKTsKLQkJCi0JCWFzc2VydFRydWUocHJvcGVydGllc0FkYXB0ZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKGN0ZFByb3BlcnR5Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5LlZBTFVFX1BST1BFUlRZKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY3VzdG9taXphdGlvbiwgQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5jdXN0b21pemF0aW9uLCBDdXN0b21pemF0aW9uLldFQVZJTkdfTEFaWV9QUk9QRVJUWSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY3VzdG9taXphdGlvbiwgQ3VzdG9taXphdGlvbi5XRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY3VzdG9taXphdGlvbiwgQ3VzdG9taXphdGlvbi5XRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHByb3BlcnR5TGlzdEFkYXB0ZXIpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uIGVsQ3VzdG9taXphdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24pIHRoaXMuY3VzdG9taXphdGlvbjsKLQkJUGVyc2lzdGVuY2VVbml0UHJvcGVydHlMaXN0TGlzdGVuZXIgcHJvcGVydHlMaXN0TGlzdGVuZXIgPSBlbEN1c3RvbWl6YXRpb24ucHJvcGVydHlMaXN0TGlzdGVuZXIoKTsKLQkJcHJvcGVydHlMaXN0QWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHByb3BlcnR5TGlzdExpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0aWVzQWRhcHRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7IC8vIG90aGVyIHByb3BlcnRpZXMgYXJlIHN0aWxsIGxpc3RlbmluZwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmN1c3RvbWl6YXRpb24sIEN1c3RvbWl6YXRpb24uVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuY3VzdG9taXphdGlvbiwgQ3VzdG9taXphdGlvbi5XRUFWSU5HX0xBWllfUFJPUEVSVFkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmN1c3RvbWl6YXRpb24sIEN1c3RvbWl6YXRpb24uV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmN1c3RvbWl6YXRpb24sIEN1c3RvbWl6YXRpb24uV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkpOwotCX0KLQotCi0KLQkvLyAqKioqKioqKioqIFRocm93RXhjZXB0aW9ucyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFRocm93RXhjZXB0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlUSFJPV19FWENFUFRJT05TX0tFWSwKLQkJCVRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlUSFJPV19FWENFUFRJT05TX0tFWSwKLQkJCVRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRSwKLQkJCVRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVGhyb3dFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlUSFJPV19FWENFUFRJT05TX0tFWSwKLQkJCVRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRSwKLQkJCVRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdMYXp5IHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0V2VhdmluZ0xhenkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV0VBVklOR19MQVpZX0tFWSwKLQkJCVdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVdFQVZJTkdfTEFaWV9LRVksCi0JCQlXRUFWSU5HX0xBWllfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVXZWF2aW5nTGF6eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJV0VBVklOR19MQVpZX0tFWSwKLQkJCVdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFLAotCQkJV0VBVklOR19MQVpZX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nQ2hhbmdlVHJhY2tpbmcgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfS0VZLAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19LRVksCi0JCQlXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFLAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV2VhdmluZ0NoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19LRVksCi0JCQlXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFLAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdGZXRjaEdyb3VwcyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmdGZXRjaEdyb3VwcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19LRVksCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVdFQVZJTkdfRkVUQ0hfR1JPVVBTX0tFWSwKLQkJCVdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVXZWF2aW5nRmV0Y2hHcm91cHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdFQVZJTkdfRkVUQ0hfR1JPVVBTX0tFWSwKLQkJCVdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogU2Vzc2lvbkN1c3RvbWl6ZXIgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZXNzaW9uQ3VzdG9taXplcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfS0VZLAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX0tFWSwKLQkJCVNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlc3Npb25DdXN0b21pemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfS0VZLAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmcgdGVzdHMgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgV2VhdmluZyBwcm9wZXJ0eSBieSB0aGUgQ3VzdG9taXphdGlvbiBhZGFwdGVyIHdoZW4KLQkgKiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV0VBVklOR19LRVksCi0JCQlXRUFWSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV0VBVklOR19LRVksCi0JCQlXRUFWSU5HX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdFQVZJTkdfS0VZLAotCQkJV0VBVklOR19URVNUX1ZBTFVFLAotCQkJV0VBVklOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogQ3VzdG9taXphdGlvbiBjbGFzcyAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBDdXN0b21pemF0aW9uIHByb3BlcnR5IGJ5IHRoZSBDdXN0b21pemF0aW9uIGFkYXB0ZXIgd2hlbiB0aGUKLQkgKiBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q3VzdG9taXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDVVNUT01JWkVSX0tFWSwKLQkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0Q3VzdG9taXphdGlvblByb3BlcnR5KAotCQkJQ3VzdG9taXphdGlvbi5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFksCi0JCQlDVVNUT01JWkVSX0tFWSwKLQkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRSwKLQkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ3VzdG9taXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZUN1c3RvbWl6YXRpb25Qcm9wZXJ0eSgKLQkJCUN1c3RvbWl6YXRpb24uREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZLAotCQkJQ1VTVE9NSVpFUl9LRVksCi0JCQlDVVNUT01JWkVSX1RFU1RfVkFMVUUsCi0JCQlDVVNUT01JWkVSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvLyAqKioqKioqKioqIHZlcmlmeSBlbnRpdHkgcHJvcGVydHkgKioqKioqKioqKgotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNldEN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlciA9ICgoRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzKSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMpLnByb3BlcnR5TGlzdEFkYXB0ZXIoKTsKLQkJLy8gQmFzaWMKLQkJdGhpcy52ZXJpZnlJbml0aWFsU3RhdGUocHJvcGVydHlOYW1lLCBrZXksIHByb3BlcnR5TGlzdEFkYXB0ZXIpOwotCQkKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChrZXksIHRlc3RWYWx1ZTIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5wcm9wZXJ0aWVzVG90YWwsIHByb3BlcnR5TGlzdEFkYXB0ZXIuc2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlQdXRDdXN0b21pemF0aW9uUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMik7Ci0JCQotCQkvLyBSZXBsYWNlIGJ5IHNldHRpbmcgbW9kZWwgb2JqZWN0Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldEN1c3RvbWl6YXRpb25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJvcGVydGllc1RvdGFsLCBwcm9wZXJ0eUxpc3RBZGFwdGVyLnNpemUoKSk7Ci0JCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUFkZFJlbW92ZUN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlciA9ICgoRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzKSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMpLnByb3BlcnR5TGlzdEFkYXB0ZXIoKTsKLQkJLy8gUmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQktLXRoaXMucHJvcGVydGllc1RvdGFsOwotCQktLXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShrZXkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmNvbnRhaW5zUHJvcGVydHkoa2V5KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vZGVsUHJvcGVydGllc1NpemUsIHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsIC0gMSk7Ci0JCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIG51bGwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5wcm9wZXJ0aWVzVG90YWwsIHByb3BlcnR5TGlzdEFkYXB0ZXIuc2l6ZSgpKTsKLQkJCi0JCS8vIEFkZCBvcmlnaW5hbCBQcm9wZXJ0eQotCQkrK3RoaXMucHJvcGVydGllc1RvdGFsOwotCQkrK3RoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoa2V5LCB0ZXN0VmFsdWUxKTsKLQkJdGhpcy52ZXJpZnlQdXRDdXN0b21pemF0aW9uUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnByb3BlcnRpZXNUb3RhbCwgcHJvcGVydHlMaXN0QWRhcHRlci5zaXplKCkpOwotCQkKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChrZXksIHRlc3RWYWx1ZTIpOwotCQl0aGlzLnZlcmlmeVB1dEN1c3RvbWl6YXRpb25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRDdXN0b21pemF0aW9uUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGVudGl0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlFdmVudChwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLnZlcmlmeUN1c3RvbWl6YXRpb25FdmVudChwcm9wZXJ0eU5hbWUsIGVudGl0eU5hbWUsIGV4cGVjdGVkVmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUN1c3RvbWl6YXRpb25FdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgZW50aXR5TmFtZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyB2ZXJpZnkgZXZlbnQgdmFsdWUKLQkJQ3VzdG9taXplclByb3BlcnRpZXMgY3VzdG9taXplciA9IChDdXN0b21pemVyUHJvcGVydGllcykgdGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudC5nZXROZXdWYWx1ZSgpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSkpIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBjdXN0b21pemVyLmdldENsYXNzTmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXIoZW50aXR5TmFtZSkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJ2ZXJpZnlDdXN0b21pemF0aW9uRXZlbnQiLCBwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VzdG9taXphdGlvblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZKSkKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXREZXNjcmlwdG9yQ3VzdG9taXplcigoU3RyaW5nKSBuZXdWYWx1ZSwgZW50aXR5TmFtZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0Q3VzdG9taXphdGlvblByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0VGhyb3dFeGNlcHRpb25zKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0xBWllfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFdlYXZpbmdMYXp5KChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0V2VhdmluZ0ZldGNoR3JvdXBzKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFNlc3Npb25DdXN0b21pemVyKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFdlYXZpbmcoKFdlYXZpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFRocm93RXhjZXB0aW9ucygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmcoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfTEFaWV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdMYXp5KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdDaGFuZ2VUcmFja2luZygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXRXZWF2aW5nRmV0Y2hHcm91cHMoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFNlc3Npb25DdXN0b21pemVyKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXREZXNjcmlwdG9yQ3VzdG9taXplcihFTlRJVFlfVEVTVCk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gbW9kZWxWYWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBtb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXphdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2N1c3RvbWl6YXRpb24vQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jdXN0b21pemF0aW9uL0N1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2YmIxZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2N1c3RvbWl6YXRpb24vQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDdXN0b21pemF0aW9uIGN1c3RvbWl6YXRpb247Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRocm93RXhjZXB0aW9uc0hvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGhyb3dFeGNlcHRpb25zTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IHRocm93RXhjZXB0aW9uc0V2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUVfVEVTVF9WQUxVRSA9ICJFbXBsb3llZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlwdWJsaWMgQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24gPSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuZ2V0Q3VzdG9taXphdGlvbigpOyAvLyBTdWJqZWN0Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPiBjdXN0b21pemF0aW9uSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPih0aGlzLmN1c3RvbWl6YXRpb24pOwotCQkKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNIb2xkZXIgPSB0aGlzLmJ1aWxkVGhyb3dFeGNlcHRpb25zQUEoY3VzdG9taXphdGlvbkhvbGRlcik7Ci0JCXRoaXMudGhyb3dFeGNlcHRpb25zTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGhyb3dFeGNlcHRpb25zQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudGhyb3dFeGNlcHRpb25zTGlzdGVuZXIpOwotCQl0aGlzLnRocm93RXhjZXB0aW9uc0V2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlBYnN0cmFjdE1vZGVsIHN1YmplY3RDdXN0b21pemF0aW9uID0gKEFic3RyYWN0TW9kZWwpIHRoaXMuY3VzdG9taXphdGlvbjsgLy8gU3ViamVjdAotCQkKLQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+IHRocm93RXhjZXB0aW9uc0FBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KSB0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlcjsKLQkJYXNzZXJ0VHJ1ZSh0aHJvd0V4Y2VwdGlvbnNBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0Q3VzdG9taXphdGlvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDdXN0b21pemF0aW9uLlRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkpKTsKLQkJCi0JCXRocm93RXhjZXB0aW9uc0FBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnRocm93RXhjZXB0aW9uc0xpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2Uoc3ViamVjdEN1c3RvbWl6YXRpb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRocm93RXhjZXB0aW9uc0FBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dCgKLQkJCUN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUywgCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgbW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6YXRpb247Ci0JfQotCi0JLy8gKioqKioqIFRocm93RXhjZXB0aW9ucyAqKioqKioqCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRocm93RXhjZXB0aW9uc0FBKFByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIEN1c3RvbWl6YXRpb24uVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFRocm93RXhjZXB0aW9ucygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIGVudW1WYWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRUaHJvd0V4Y2VwdGlvbnMoZW51bVZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUaHJvd0V4Y2VwdGlvbnNDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUN1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy50aHJvd0V4Y2VwdGlvbnNFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqIFRlc3RzICoqKioqKiogCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQkvLyAqKioqKiogVGhyb3dFeGNlcHRpb25zICoqKioqKiogCi0JCXRoaXMudmVyaWZ5VGhyb3dFeGNlcHRpb25zQUFWYWx1ZShUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoQ3VzdG9taXphdGlvbi5ERUZBVUxUX1RIUk9XX0VYQ0VQVElPTlMsIHRoaXMuY3VzdG9taXphdGlvbi5nZXREZWZhdWx0VGhyb3dFeGNlcHRpb25zKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyAqKioqKiogVGhyb3dFeGNlcHRpb25zICoqKioqKiogCi0JCXRoaXMudGhyb3dFeGNlcHRpb25zRXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJQm9vbGVhbiBuZXdUaHJvd0V4Y2VwdGlvbnMgPSAhVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFOwotCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlci5zZXRWYWx1ZShuZXdUaHJvd0V4Y2VwdGlvbnMpOwotCQl0aGlzLnZlcmlmeVRocm93RXhjZXB0aW9uc0FBVmFsdWUobmV3VGhyb3dFeGNlcHRpb25zKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnRocm93RXhjZXB0aW9uc0V2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbFZhbHVlKCkgewotCQlTdHJpbmcgbm90RGVsZXRlZCA9ICJQcm9wZXJ0eSBub3QgZGVsZXRlZCI7Ci0JCS8vICoqKioqKiBUaHJvd0V4Y2VwdGlvbnMgKioqKioqKgotCQl0aGlzLnRocm93RXhjZXB0aW9uc0V2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMudGhyb3dFeGNlcHRpb25zSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeVRocm93RXhjZXB0aW9uc0FBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy50aHJvd0V4Y2VwdGlvbnNFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TLCBub3REZWxldGVkKTsKLQl9Ci0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5VGhyb3dFeGNlcHRpb25zQUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsIAotCQkJdGhpcy5jdXN0b21pemF0aW9uLmdldFRocm93RXhjZXB0aW9ucygpLCAKLQkJCXRoaXMudGhyb3dFeGNlcHRpb25zSG9sZGVyLCAKLQkJCUN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9KcHRFY2xpcHNlTGlua0NvcmVDdXN0b21pemF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY3VzdG9taXphdGlvbi9KcHRFY2xpcHNlTGlua0NvcmVDdXN0b21pemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzYTY3Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2N1c3RvbWl6YXRpb24vSnB0RWNsaXBzZUxpbmtDb3JlQ3VzdG9taXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZUN1c3RvbWl6YXRpb25UZXN0cwotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGlua0NvcmVDdXN0b21pemF0aW9uVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDdXN0b21pemF0aW9uQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZUN1c3RvbWl6YXRpb25UZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9sb2dnaW5nL0pwdEVjbGlwc2VMaW5rQ29yZUxvZ2dpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9sb2dnaW5nL0pwdEVjbGlwc2VMaW5rQ29yZUxvZ2dpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDk4MzkxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvbG9nZ2luZy9KcHRFY2xpcHNlTGlua0NvcmVMb2dnaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwubG9nZ2luZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtDb3JlTG9nZ2luZ1Rlc3RzCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZUxvZ2dpbmdUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMb2dnaW5nVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExvZ2dpbmdBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtDb3JlTG9nZ2luZ1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2xvZ2dpbmcvTG9nZ2luZ0FkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9sb2dnaW5nL0xvZ2dpbmdBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlMzRlYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2xvZ2dpbmcvTG9nZ2luZ0FkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rSnBhUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eUxpc3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmxvZ2dpbmcuRWNsaXBzZUxpbmtMb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5sb2dnaW5nLkxvZ2dpbmdMZXZlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5QZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgbW9kZWwgb2JqZWN0cyBieSB0aGUgTG9nZ2luZyBhZGFwdGVyIHdoZW4gdGhlCi0gKiBQZXJzaXN0ZW5jZVVuaXQgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dpbmdBZGFwdGVyVGVzdHMgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgTG9nZ2luZyBsb2dnaW5nOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxfS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBMRVZFTF9URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmZpbmU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgTEVWRUxfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLmZpbmVzdDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTVEFNUF9LRVkgPSBMb2dnaW5nLkVDTElQU0VMSU5LX1RJTUVTVEFNUDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVElNRVNUQU1QX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVElNRVNUQU1QX1RFU1RfVkFMVUVfMiA9ICEgVElNRVNUQU1QX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFJFQURfS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19USFJFQUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRIUkVBRF9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRIUkVBRF9URVNUX1ZBTFVFXzIgPSAhIFRIUkVBRF9URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9LRVkgPSBMb2dnaW5nLkVDTElQU0VMSU5LX1NFU1NJT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNFU1NJT05fVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBTRVNTSU9OX1RFU1RfVkFMVUVfMiA9ICEgU0VTU0lPTl9URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OU19LRVkgPSBMb2dnaW5nLkVDTElQU0VMSU5LX0VYQ0VQVElPTlM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0VQVElPTlNfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBFWENFUFRJT05TX1RFU1RfVkFMVUVfMiA9ICEgRVhDRVBUSU9OU19URVNUX1ZBTFVFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19GSUxFX0xPQ0FUSU9OX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfTE9HX0ZJTEVfTE9DQVRJT047Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19GSUxFX0xPQ0FUSU9OX1RFU1RfVkFMVUUgPSAiQzovdGVtcCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19GSUxFX0xPQ0FUSU9OX1RFU1RfVkFMVUVfMiA9ICJDOi90bXAiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dFUl9LRVkgPSBMb2dnaW5nLkVDTElQU0VMSU5LX0xPR0dFUjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSX1RFU1RfVkFMVUUgPSBMb2dnZXIuamF2YV9sb2dnZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dFUl9URVNUX1ZBTFVFXzIgPSAiY3VzdG9tLmxvZ2dlci50ZXN0IjsKLQkKLQlwdWJsaWMgTG9nZ2luZ0FkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxvZ2dpbmcgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuZ2V0TG9nZ2luZygpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQkKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZy5MRVZFTF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZy5USFJFQURfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nLlNFU1NJT05fUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nLkVYQ0VQVElPTlNfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nLkxPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZy5MT0dHRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gNzsKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDQ7IC8vIDQgbWlzYyBwcm9wZXJ0aWVzCi0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOwotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KFRJTUVTVEFNUF9LRVksIFRJTUVTVEFNUF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dCgibWlzYy5wcm9wZXJ0eS4yIiwgInZhbHVlLjIiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoTEVWRUxfS0VZLCBMRVZFTF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KFRIUkVBRF9LRVksIFRIUkVBRF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChTRVNTSU9OX0tFWSwgU0VTU0lPTl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChFWENFUFRJT05TX0tFWSwgRVhDRVBUSU9OU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dCgibWlzYy5wcm9wZXJ0eS40IiwgInZhbHVlLjQiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoTE9HX0ZJTEVfTE9DQVRJT05fS0VZLCBMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoTE9HR0VSX0tFWSwgTE9HR0VSX1RFU1RfVkFMVUUpOwotCQlyZXR1cm47Ci0JfQotCQotCS8vICoqKioqKioqKiogTGlzdGVuZXJzICoqKioqKioqKioKLQotCS8vICoqKioqKioqKiogTGlzdGVuZXJzIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIG5ldwotCQlMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFByb3BlcnR5PiBwcm9wZXJ0aWVzQWRhcHRlciA9IAotCQkJKExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgUHJvcGVydHk+KSAoKEVjbGlwc2VMaW5rSnBhUHJvcGVydGllcykgdGhpcy5wZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzKS5wcm9wZXJ0aWVzQWRhcHRlcigpOwotCQlHZW5lcmljUHJvcGVydHkgY3RkUHJvcGVydHkgPSAoR2VuZXJpY1Byb3BlcnR5KSB0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KFRJTUVTVEFNUF9LRVkpOwotCQlMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlciA9ICgoRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzKSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMpLnByb3BlcnR5TGlzdEFkYXB0ZXIoKTsKLQkJCi0JCWFzc2VydFRydWUocHJvcGVydGllc0FkYXB0ZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKGN0ZFByb3BlcnR5Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5LlZBTFVFX1BST1BFUlRZKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMubG9nZ2luZywgTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpOwotLy9UT0RPIEFERCBPVEhFUiBQUk9QRVJUSUVTCi0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHByb3BlcnR5TGlzdEFkYXB0ZXIpOwotCQkKLQkJRWNsaXBzZUxpbmtMb2dnaW5nIGVsTG9nZ2luZyA9IChFY2xpcHNlTGlua0xvZ2dpbmcpIHRoaXMubG9nZ2luZzsKLQkJUGVyc2lzdGVuY2VVbml0UHJvcGVydHlMaXN0TGlzdGVuZXIgcHJvcGVydHlMaXN0TGlzdGVuZXIgPSBlbExvZ2dpbmcucHJvcGVydHlMaXN0TGlzdGVuZXIoKTsKLQkJcHJvcGVydHlMaXN0QWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHByb3BlcnR5TGlzdExpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0aWVzQWRhcHRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7IC8vIG90aGVyIHByb3BlcnRpZXMgYXJlIHN0aWxsIGxpc3RlbmluZwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmxvZ2dpbmcsIExvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlMRVZFTF9LRVksCi0JCQlMRVZFTF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUxFVkVMX0tFWSwKLQkJCUxFVkVMX1RFU1RfVkFMVUUsCi0JCQlMRVZFTF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJTEVWRUxfS0VZLAotCQkJTEVWRUxfVEVTVF9WQUxVRSwKLQkJCUxFVkVMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUaW1lc3RhbXAgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRUaHJvd0V4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVElNRVNUQU1QX0tFWSwKLQkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVRJTUVTVEFNUF9LRVksCi0JCQlUSU1FU1RBTVBfVEVTVF9WQUxVRSwKLQkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUaHJvd0V4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVRJTUVTVEFNUF9LRVksCi0JCQlUSU1FU1RBTVBfVEVTVF9WQUxVRSwKLQkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVGhyZWFkIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGhyZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVRIUkVBRF9LRVksCi0JCQlUSFJFQURfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlUSFJFQURfS0VZLAotCQkJVEhSRUFEX1RFU1RfVkFMVUUsCi0JCQlUSFJFQURfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVGhyZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlUSFJFQURfS0VZLAotCQkJVEhSRUFEX1RFU1RfVkFMVUUsCi0JCQlUSFJFQURfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNlc3Npb24gdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFU1NJT05fS0VZLAotCQkJU0VTU0lPTl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVNFU1NJT05fS0VZLAotCQkJU0VTU0lPTl9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVTZXNzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVNTSU9OX0tFWSwKLQkJCVNFU1NJT05fVEVTVF9WQUxVRSwKLQkJCVNFU1NJT05fVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV4Y2VwdGlvbnMgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUVYQ0VQVElPTlNfS0VZLAotCQkJRVhDRVBUSU9OU19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUVYQ0VQVElPTlNfS0VZLAotCQkJRVhDRVBUSU9OU19URVNUX1ZBTFVFLAotCQkJRVhDRVBUSU9OU19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRXhjZXB0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRVhDRVBUSU9OU19LRVksCi0JCQlFWENFUFRJT05TX1RFU1RfVkFMVUUsCi0JCQlFWENFUFRJT05TX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBMb2dGaWxlTG9jYXRpb24gKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRMb2dGaWxlTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJTE9HX0ZJTEVfTE9DQVRJT05fS0VZLAotCQkJTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlMT0dfRklMRV9MT0NBVElPTl9LRVksCi0JCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFLAotCQkJTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTG9nRmlsZUxvY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlMT0dfRklMRV9MT0NBVElPTl9LRVksCi0JCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFLAotCQkJTE9HX0ZJTEVfTE9DQVRJT05fVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBMb2dnZXIgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRMb2dnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJTE9HR0VSX0tFWSwKLQkJCXRoaXMuZ2V0RWNsaXBzZUxpbmtTdHJpbmdWYWx1ZU9mKExPR0dFUl9URVNUX1ZBTFVFKSk7IC8vIG1vZGVsIGlzIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZQotCQkvLyB2ZXJpZnkgc2V0IGVudW0gdmFsdWUKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUxPR0dFUl9LRVksCi0JCQlMT0dHRVJfVEVTVF9WQUxVRSwKLQkJCUxPR0dFUl9URVNUX1ZBTFVFXzIpOwotCQkvLyB2ZXJpZnkgc2V0IGN1c3RvbSBhbmQgbGl0ZXJhbCB2YWx1ZQotCQl0aGlzLnZlcmlmeVNldExvZ2dlcigKLQkJCUxPR0dFUl9LRVksCi0JCQlMT0dHRVJfVEVTVF9WQUxVRSwKLQkJCUxPR0dFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMb2dnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUxPR0dFUl9LRVksCi0JCQlMT0dHRVJfVEVTVF9WQUxVRSwKLQkJCUxPR0dFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyBzZXR0aW5nIGN1c3RvbSBsb2dnZXIgYW5kIGxpdGVyYWxzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNldExvZ2dlcihTdHJpbmcgZWxLZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVByb3BlcnR5IHByb3BlcnR5ID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSk7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLm1vZGVsKCkucHJvcGVydHlJZEZvcihwcm9wZXJ0eSk7Ci0JCS8vIHRlc3Qgc2V0IGN1c3RvbSBsb2dnZXIuCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQotCQkvLyB0ZXN0IHNldCAoTG9nZ2VyKSBudWxsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLmxvZ2dpbmcuc2V0TG9nZ2VyKChMb2dnZXIpIG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmNvbnRhaW5zUHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQkKLQkJLy8gdGVzdCBzZXQgZW51bSBsaXRlcmFsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMS50b1N0cmluZygpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmNvbnRhaW5zUHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRoaXMuZ2V0RWNsaXBzZUxpbmtTdHJpbmdWYWx1ZU9mKHRlc3RWYWx1ZTEpKTsKLQotCQkvLyB0ZXN0IHNldCAoU3RyaW5nKSBudWxsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLmxvZ2dpbmcuc2V0TG9nZ2VyKChTdHJpbmcpIG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmNvbnRhaW5zUHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5MRVZFTF9QUk9QRVJUWSkpCi0JCQl0aGlzLmxvZ2dpbmcuc2V0TGV2ZWwoKExvZ2dpbmdMZXZlbCkgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRUaW1lc3RhbXAoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLlRIUkVBRF9QUk9QRVJUWSkpCi0JCQl0aGlzLmxvZ2dpbmcuc2V0VGhyZWFkKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5TRVNTSU9OX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRTZXNzaW9uKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5FWENFUFRJT05TX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRFeGNlcHRpb25zKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5MT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSkpCi0JCQl0aGlzLmxvZ2dpbmcuc2V0TG9nRmlsZUxvY2F0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxPR0dFUl9QUk9QRVJUWSkpIHsKLQkJCWlmIChuZXdWYWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKQotCQkJCXRoaXMubG9nZ2luZy5zZXRMb2dnZXIoKExvZ2dlcikgbmV3VmFsdWUpOwotCQkJZWxzZQotCQkJCXRoaXMubG9nZ2luZy5zZXRMb2dnZXIoKFN0cmluZykgbmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxFVkVMX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0TGV2ZWwoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLlRJTUVTVEFNUF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5sb2dnaW5nLmdldFRpbWVzdGFtcCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuVEhSRUFEX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0VGhyZWFkKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5TRVNTSU9OX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0U2Vzc2lvbigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuRVhDRVBUSU9OU19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5sb2dnaW5nLmdldEV4Y2VwdGlvbnMoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0TG9nRmlsZUxvY2F0aW9uKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5MT0dHRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRMb2dnZXIoKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBleHBlY3RlZFZhbHVlXyA9IGV4cGVjdGVkVmFsdWU7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuTE9HR0VSX1BST1BFUlRZKSkgewotCQkJCi0JCQlleHBlY3RlZFZhbHVlXyA9IChleHBlY3RlZFZhbHVlICE9IG51bGwgJiYgZXhwZWN0ZWRWYWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKSA/Ci0JCQkJdGhpcy5nZXRFY2xpcHNlTGlua1N0cmluZ1ZhbHVlT2YoTE9HR0VSX1RFU1RfVkFMVUUpIDogLy8gbW9kZWwgaXMgc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlCi0JCQkJZXhwZWN0ZWRWYWx1ZTsKLQkJfQotCQlzdXBlci52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGV4cGVjdGVkVmFsdWVfKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgbW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxvZ2dpbmc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9sb2dnaW5nL0xvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvbG9nZ2luZy9Mb2dnaW5nVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZDliZGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9sb2dnaW5nL0xvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLlBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIExvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIExvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgTG9nZ2luZyBsb2dnaW5nOwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB0aW1lc3RhbXBIb2xkZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRpbWVzdGFtcExpc3RlbmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCB0aW1lc3RhbXBFdmVudDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSU1FU1RBTVBfVEVTVF9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlwdWJsaWMgTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxvZ2dpbmcgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuZ2V0TG9nZ2luZygpOyAvLyBTdWJqZWN0Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxMb2dnaW5nPiBsb2dnaW5nSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxMb2dnaW5nPih0aGlzLmxvZ2dpbmcpOwotCQkKLQkJdGhpcy50aW1lc3RhbXBIb2xkZXIgPSB0aGlzLmJ1aWxkVGltZXN0YW1wQUEobG9nZ2luZ0hvbGRlcik7Ci0JCXRoaXMudGltZXN0YW1wTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGltZXN0YW1wQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy50aW1lc3RhbXBIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudGltZXN0YW1wTGlzdGVuZXIpOwotCQl0aGlzLnRpbWVzdGFtcEV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlBYnN0cmFjdE1vZGVsIHN1YmplY3RMb2dnaW5nID0gKEFic3RyYWN0TW9kZWwpIHRoaXMubG9nZ2luZzsgLy8gU3ViamVjdAotCQkKLQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+IHRpbWVzdGFtcEFBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KSB0aGlzLnRpbWVzdGFtcEhvbGRlcjsKLQkJYXNzZXJ0VHJ1ZSh0aW1lc3RhbXBBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0TG9nZ2luZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhMb2dnaW5nLlRJTUVTVEFNUF9QUk9QRVJUWSkpOwotCQkKLQkJdGltZXN0YW1wQUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudGltZXN0YW1wTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShzdWJqZWN0TG9nZ2luZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhMb2dnaW5nLlRJTUVTVEFNUF9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aW1lc3RhbXBBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4gCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoCi0JCQlMb2dnaW5nLkVDTElQU0VMSU5LX1RJTUVTVEFNUCwgCi0JCQlUSU1FU1RBTVBfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBtb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubG9nZ2luZzsKLQl9Ci0KLQkvLyAqKioqKiogVGltZXN0YW1wICoqKioqKioKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGltZXN0YW1wQUEoUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUaW1lc3RhbXAoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0VGltZXN0YW1wKGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVGltZXN0YW1wQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlMb2dnaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMudGltZXN0YW1wRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqKiBUZXN0cyAqKioqKioqIAotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJLy8gKioqKioqIFRpbWVzdGFtcCAqKioqKioqIAotCQl0aGlzLnZlcmlmeVRpbWVzdGFtcEFBVmFsdWUoVElNRVNUQU1QX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoTG9nZ2luZy5ERUZBVUxUX1RJTUVTVEFNUCwgdGhpcy5sb2dnaW5nLmdldERlZmF1bHRUaW1lc3RhbXAoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vICoqKioqKiBUaW1lc3RhbXAgKioqKioqKiAKLQkJdGhpcy50aW1lc3RhbXBFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMudGltZXN0YW1wSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlCb29sZWFuIG5ld1RpbWVzdGFtcCA9ICFUSU1FU1RBTVBfVEVTVF9WQUxVRTsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy50aW1lc3RhbXBIb2xkZXIuc2V0VmFsdWUobmV3VGltZXN0YW1wKTsKLQkJdGhpcy52ZXJpZnlUaW1lc3RhbXBBQVZhbHVlKG5ld1RpbWVzdGFtcCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy50aW1lc3RhbXBFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE51bGxWYWx1ZSgpIHsKLQkJU3RyaW5nIG5vdERlbGV0ZWQgPSAiUHJvcGVydHkgbm90IGRlbGV0ZWQiOwotCQkvLyAqKioqKiogVGltZXN0YW1wICoqKioqKioKLQkJdGhpcy50aW1lc3RhbXBFdmVudCA9IG51bGw7Ci0JCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLnRpbWVzdGFtcEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlUaW1lc3RhbXBBQVZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMudGltZXN0YW1wRXZlbnQpOwotCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KExvZ2dpbmcuRUNMSVBTRUxJTktfVElNRVNUQU1QLCBub3REZWxldGVkKTsKLQl9Ci0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5VGltZXN0YW1wQUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsIAotCQkJdGhpcy5sb2dnaW5nLmdldFRpbWVzdGFtcCgpLCAKLQkJCXRoaXMudGltZXN0YW1wSG9sZGVyLCAKLQkJCUxvZ2dpbmcuRUNMSVBTRUxJTktfVElNRVNUQU1QKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9vcHRpb25zL0pwdEVjbGlwc2VMaW5rQ29yZU9wdGlvbnNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9vcHRpb25zL0pwdEVjbGlwc2VMaW5rQ29yZU9wdGlvbnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjJiNDBiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvb3B0aW9ucy9KcHRFY2xpcHNlTGlua0NvcmVPcHRpb25zVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwub3B0aW9uczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtDb3JlT3B0aW9uc1Rlc3RzCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZU9wdGlvbnNUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcHRpb25zVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9wdGlvbnNBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtDb3JlT3B0aW9uc1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL29wdGlvbnMvT3B0aW9uc0FkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9vcHRpb25zL09wdGlvbnNBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmYzExMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL29wdGlvbnMvT3B0aW9uc0FkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rSnBhUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eUxpc3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnMuRWNsaXBzZUxpbmtPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3B0aW9ucy5UYXJnZXREYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5QZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgbW9kZWwgb2JqZWN0cyBieSB0aGUgTG9nZ2luZyBhZGFwdGVyIHdoZW4gdGhlCi0gKiBQZXJzaXN0ZW5jZVVuaXQgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIE9wdGlvbnNBZGFwdGVyVGVzdHMgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgT3B0aW9ucyBvcHRpb25zOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fTkFNRV9LRVkgPSBPcHRpb25zLkVDTElQU0VMSU5LX1NFU1NJT05fTkFNRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUUgPSAic2Vzc2lvbi1uYW1lLnRlc3QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX05BTUVfVEVTVF9WQUxVRV8yID0gInNlc3Npb24tbmFtZS0yLnRlc3QiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05TX1hNTF9LRVkgPSBPcHRpb25zLkVDTElQU0VMSU5LX1NFU1NJT05TX1hNTDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUUgPSAic2Vzc2lvbnMteG1sLnRlc3QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OU19YTUxfVEVTVF9WQUxVRV8yID0gInNlc3Npb25zLXhtbC0yLnRlc3QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0RBVEFCQVNFX0tFWSA9IE9wdGlvbnMuRUNMSVBTRUxJTktfVEFSR0VUX0RBVEFCQVNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVGFyZ2V0RGF0YWJhc2UgVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUgPSBUYXJnZXREYXRhYmFzZS5jbG91ZHNjYXBlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVGFyZ2V0RGF0YWJhc2UgVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUVfMiA9IFRhcmdldERhdGFiYXNlLm9yYWNsZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX0tFWSA9IE9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFXzIgPSAhIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX0tFWSA9IE9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9FVkVOVF9MSVNURU5FUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1RFU1RfVkFMVUUgPSAiYWNtZS5DdXN0b21TZXNzaW9uRXZlbnRMaXN0ZW5lciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFXzIgPSAib3JhY2xlLnNlc3Npb25zLkN1c3RvbVNlc3Npb25FdmVudExpc3RlbmVyIjsKLQotCXB1YmxpYyBPcHRpb25zQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub3B0aW9ucyA9IHRoaXMucGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5nZXRPcHRpb25zKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0KLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9ucy5TRVNTSU9OX05BTUVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zLlNFU1NJT05TX1hNTF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9ucy5TRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gNTsKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDQ7IC8vIDQgbWlzYyBwcm9wZXJ0aWVzCi0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOwotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoU0VTU0lPTl9OQU1FX0tFWSwgU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChTRVNTSU9OU19YTUxfS0VZLCBTRVNTSU9OU19YTUxfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KCJtaXNjLnByb3BlcnR5LjEiLCAidmFsdWUuMSIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19LRVksIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KCJtaXNjLnByb3BlcnR5LjIiLCAidmFsdWUuMiIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dCgibWlzYy5wcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoVEFSR0VUX0RBVEFCQVNFX0tFWSwgVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX0tFWSwgU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoIm1pc2MucHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXJldHVybjsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBMaXN0ZW5lcnMgKioqKioqKioqKgotCi0JLy8gKioqKioqKioqKiBMaXN0ZW5lcnMgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gbmV3Ci0JCUxpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgUHJvcGVydHk+IHByb3BlcnRpZXNBZGFwdGVyID0gCi0JCQkoTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQcm9wZXJ0eT4pICgoRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzKSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMpLnByb3BlcnRpZXNBZGFwdGVyKCk7Ci0JCUdlbmVyaWNQcm9wZXJ0eSBjdGRQcm9wZXJ0eSA9IChHZW5lcmljUHJvcGVydHkpIHRoaXMucGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfS0VZKTsKLQkJTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIgPSAoKEVjbGlwc2VMaW5rSnBhUHJvcGVydGllcykgdGhpcy5wZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzKS5wcm9wZXJ0eUxpc3RBZGFwdGVyKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHByb3BlcnRpZXNBZGFwdGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShjdGRQcm9wZXJ0eS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLm9wdGlvbnMsIE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5vcHRpb25zLCBPcHRpb25zLlNFU1NJT05TX1hNTF9QUk9QRVJUWSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMub3B0aW9ucywgT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5vcHRpb25zLCBPcHRpb25zLlRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMub3B0aW9ucywgT3B0aW9ucy5TRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMocHJvcGVydHlMaXN0QWRhcHRlcik7Ci0JCQotCQlFY2xpcHNlTGlua09wdGlvbnMgZWxPcHRpb25zID0gKEVjbGlwc2VMaW5rT3B0aW9ucykgdGhpcy5vcHRpb25zOwotCQlQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eUxpc3RMaXN0ZW5lciBwcm9wZXJ0eUxpc3RMaXN0ZW5lciA9IGVsT3B0aW9ucy5wcm9wZXJ0eUxpc3RMaXN0ZW5lcigpOwotCQlwcm9wZXJ0eUxpc3RBZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgcHJvcGVydHlMaXN0TGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHByb3BlcnRpZXNBZGFwdGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsgLy8gb3RoZXIgcHJvcGVydGllcyBhcmUgc3RpbGwgbGlzdGVuaW5nCi0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMub3B0aW9ucywgT3B0aW9ucy5TRVNTSU9OX05BTUVfUFJPUEVSVFkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLm9wdGlvbnMsIE9wdGlvbnMuU0VTU0lPTlNfWE1MX1BST1BFUlRZKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5vcHRpb25zLCBPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLm9wdGlvbnMsIE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5vcHRpb25zLCBPcHRpb25zLlNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uTmFtZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNlc3Npb25OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFU1NJT05fTkFNRV9LRVksCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlTRVNTSU9OX05BTUVfS0VZLAotCQkJU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU2Vzc2lvbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVNFU1NJT05fTkFNRV9LRVksCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRSwKLQkJCVNFU1NJT05fTkFNRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogU2Vzc2lvbnNYbWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZXNzaW9uc1htbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlTRVNTSU9OU19YTUxfS0VZLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0VTU0lPTlNfWE1MX0tFWSwKLQkJCVNFU1NJT05TX1hNTF9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlc3Npb25zWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVNTSU9OU19YTUxfS0VZLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OU19YTUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19LRVksCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX0tFWSwKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUsCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX0tFWSwKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUsCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVGFyZ2V0RGF0YWJhc2UgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXREYXRhYmFzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlUQVJHRVRfREFUQUJBU0VfS0VZLAotCQkJVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVEFSR0VUX0RBVEFCQVNFX0tFWSwKLQkJCVRBUkdFVF9EQVRBQkFTRV9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVRhcmdldERhdGFiYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlUQVJHRVRfREFUQUJBU0VfS0VZLAotCQkJVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUsCi0JCQlUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV2ZW50TGlzdGVuZXIgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFdmVudExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFdmVudExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX0tFWSwKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRSwKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRTZXNzaW9uTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5TRVNTSU9OU19YTUxfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnNldFNlc3Npb25zWG1sKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRUYXJnZXREYXRhYmFzZSgoVGFyZ2V0RGF0YWJhc2UpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnNldEV2ZW50TGlzdGVuZXIoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5TRVNTSU9OX05BTUVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRTZXNzaW9uTmFtZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTlNfWE1MX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0U2Vzc2lvbnNYbWwoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFRhcmdldERhdGFiYXNlKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5TRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0RXZlbnRMaXN0ZW5lcigpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIG1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvb3B0aW9ucy9PcHRpb25zVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL29wdGlvbnMvT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWFhYjMxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvb3B0aW9ucy9PcHRpb25zVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5QZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBPcHRpb25zVmFsdWVNb2RlbFRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHRpb25zVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIE9wdGlvbnMgb3B0aW9uczsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzRXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlwdWJsaWMgT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9wdGlvbnMgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuZ2V0T3B0aW9ucygpOyAvLyBTdWJqZWN0Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zPiBvcHRpb25zSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zPih0aGlzLm9wdGlvbnMpOwotCQkKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIgPSB0aGlzLmJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUEob3B0aW9uc0hvbGRlcik7Ci0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGlzdGVuZXIpOwotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlBYnN0cmFjdE1vZGVsIHN1YmplY3RPcHRpb25zID0gKEFic3RyYWN0TW9kZWwpIHRoaXMub3B0aW9uczsgLy8gU3ViamVjdAotCQkKLQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+IGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+KSB0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlcjsKLQkJYXNzZXJ0VHJ1ZShpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0T3B0aW9ucy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpKTsKLQkJCi0JCWluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2Uoc3ViamVjdE9wdGlvbnMuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dCgKLQkJCU9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUywgCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIG1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zOwotCX0KLQotCS8vICoqKioqKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgKioqKioqKgotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQShQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlPcHRpb25zVmFsdWVNb2RlbFRlc3RzLnRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqKiBUZXN0cyAqKioqKioqIAotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJLy8gKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyAqKioqKioqIAotCQl0aGlzLnZlcmlmeUluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBVmFsdWUoSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhPcHRpb25zLkRFRkFVTFRfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUywgdGhpcy5vcHRpb25zLmdldERlZmF1bHRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vICoqKioqKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgKioqKioqKiAKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlCb29sZWFuIG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyA9ICFJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFOwotCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlci5zZXRWYWx1ZShuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOwotCQl0aGlzLnZlcmlmeUluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBVmFsdWUobmV3SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbFZhbHVlKCkgewotCQlTdHJpbmcgbm90RGVsZXRlZCA9ICJQcm9wZXJ0eSBub3QgZGVsZXRlZCI7Ci0JCS8vICoqKioqKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgKioqKioqKgotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeUluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTLCBub3REZWxldGVkKTsKLQl9Ci0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsIAotCQkJdGhpcy5vcHRpb25zLmdldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpLCAKLQkJCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLCAKLQkJCU9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSnB0RWNsaXBzZWxpbmtDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL0pwdEVjbGlwc2VsaW5rQ29yZVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNzJmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL0pwdEVjbGlwc2VsaW5rQ29yZVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2U7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkpwdEVjbGlwc2VMaW5rQ29yZUphdmFSZXNvdXJjZU1vZGVsVGVzdHM7CisKK3B1YmxpYyBjbGFzcyBKcHRFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQoreworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLnN1aXRlKCkpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJcHJpdmF0ZSBKcHRFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMoKSB7CisJCXN1cGVyKCk7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DYWNoZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ2FjaGVUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYzY1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ2FjaGVUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNDQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgQ2FjaGVUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CisKKwlwdWJsaWMgQ2FjaGVUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLkNBQ0hFX1RZUEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBDYWNoZSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZVdpdGhDYWNoZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGluay5DQUNIRV9UWVBFKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQ2FjaGUodHlwZSA9IENhY2hlVHlwZS5TT0ZUKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZVdpdGhTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENhY2hlKHNpemUgPSA1MCkiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoRXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENhY2hlKGV4cGlyeSA9IDUwKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZVdpdGhFeHBpcnlUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGluay5USU1FX09GX0RBWSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENhY2hlKGV4cGlyeVRpbWVPZkRheSA9IEBUaW1lT2ZEYXkpIik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENhY2hlKHNoYXJlZD10cnVlKSIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aEFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQ2FjaGUoYWx3YXlzUmVmcmVzaD10cnVlKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZVdpdGhSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQ2FjaGUocmVmcmVzaE9ubHlJZk5ld2VyPXRydWUpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aERpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENhY2hlKGRpc2FibGVIaXRzPXRydWUpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nV2l0aENvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGluay5DQUNIRV9DT09SRElOQVRJT05fVFlQRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENhY2hlKGNvb3JkaW5hdGlvblR5cGUgPSBDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Q2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJYXNzZXJ0Tm90TnVsbChjYWNoZSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aENhY2hlVHlwZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJYXNzZXJ0RXF1YWxzKENhY2hlVHlwZS5TT0ZULCBjYWNoZS5nZXRUeXBlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhDYWNoZVR5cGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCWFzc2VydEVxdWFscyhDYWNoZVR5cGUuU09GVCwgY2FjaGUuZ2V0VHlwZSgpKTsKKwkJCisJCWNhY2hlLnNldFR5cGUoQ2FjaGVUeXBlLldFQUspOworCQlhc3NlcnRFcXVhbHMoQ2FjaGVUeXBlLldFQUssIGNhY2hlLmdldFR5cGUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKHR5cGUgPSBXRUFLKSIsIGN1KTsKKwkJCisJCWNhY2hlLnNldFR5cGUobnVsbCk7CisJCWFzc2VydE51bGwoY2FjaGUuZ2V0VHlwZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIodHlwZSA9IFdFQUspIiwgY3UpOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoU2l6ZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MCksIGNhY2hlLmdldFNpemUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFNpemUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBjYWNoZS5nZXRTaXplKCkpOworCQkKKwkJY2FjaGUuc2V0U2l6ZShJbnRlZ2VyLnZhbHVlT2YoODApKTsKKwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MCksIGNhY2hlLmdldFNpemUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKHNpemUgPSA4MCkiLCBjdSk7CisJCQorCQljYWNoZS5zZXRTaXplKG51bGwpOworCQlhc3NlcnROdWxsKGNhY2hlLmdldFNpemUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKHNpemUgPSA4MCkiLCBjdSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFNoYXJlZCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0U2hhcmVkKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFNoYXJlZCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0U2hhcmVkKCkpOworCQkKKwkJY2FjaGUuc2V0U2hhcmVkKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGUuZ2V0U2hhcmVkKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZShzaGFyZWQ9ZmFsc2UpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U2hhcmVkTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoU2hhcmVkKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXRTaGFyZWQoKSk7CisJCQorCQljYWNoZS5zZXRTaGFyZWQobnVsbCk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpKTsKKwkJCisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aEV4cGlyeSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MCksIGNhY2hlLmdldEV4cGlyeSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhFeHBpcnkoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBjYWNoZS5nZXRFeHBpcnkoKSk7CisJCQorCQljYWNoZS5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDgwKSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODApLCBjYWNoZS5nZXRFeHBpcnkoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKGV4cGlyeSA9IDgwKSIsIGN1KTsKKwkJCisJCWNhY2hlLnNldEV4cGlyeShudWxsKTsKKwkJYXNzZXJ0TnVsbChjYWNoZS5nZXRFeHBpcnkoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKGV4cGlyeSA9IDgwKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldEV4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRXhwaXJ5VGltZU9mRGF5KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5ID0gY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCk7CisJCWFzc2VydE5vdE51bGwodGltZU9mRGF5KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkRXhwaXJ5VGltZU9mRGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJY2FjaGUuYWRkRXhwaXJ5VGltZU9mRGF5KCk7CisJCQorCQlhc3NlcnROb3ROdWxsKGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aEV4cGlyeVRpbWVPZkRheSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJCisJCWFzc2VydE5vdE51bGwoY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOworCisJCWNhY2hlLnJlbW92ZUV4cGlyeVRpbWVPZkRheSgpOworCQlhc3NlcnROdWxsKGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZShleHBpcnlUaW1lT2ZEYXkgPSBAVGltZU9mRGF5KSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldEFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aEFsd2F5c1JlZnJlc2goKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhBbHdheXNSZWZyZXNoKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXRBbHdheXNSZWZyZXNoKCkpOworCQkKKwkJY2FjaGUuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKGFsd2F5c1JlZnJlc2g9ZmFsc2UpIiwgY3UpOwkJCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRBbHdheXNSZWZyZXNoTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoQWx3YXlzUmVmcmVzaCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKKwkJCisJCWNhY2hlLnNldEFsd2F5c1JlZnJlc2gobnVsbCk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpKTsKKwkJCisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUiLCBjdSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldFJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoUmVmcmVzaE9ubHlJZk5ld2VyKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CQkKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldFJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoUmVmcmVzaE9ubHlJZk5ld2VyKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCQorCQljYWNoZS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKHJlZnJlc2hPbmx5SWZOZXdlcj1mYWxzZSkiLCBjdSk7CQkJCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWZyZXNoT25seUlmTmV3ZXJOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhSZWZyZXNoT25seUlmTmV3ZXIoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJCisJCWNhY2hlLnNldFJlZnJlc2hPbmx5SWZOZXdlcihudWxsKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSkpOworCQkKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZSIsIGN1KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aERpc2FibGVIaXRzKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXREaXNhYmxlSGl0cygpKTsJCQkJCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXREaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRGlzYWJsZUhpdHMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldERpc2FibGVIaXRzKCkpOworCQkKKwkJY2FjaGUuc2V0RGlzYWJsZUhpdHMoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZS5nZXREaXNhYmxlSGl0cygpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGUoZGlzYWJsZUhpdHM9ZmFsc2UpIiwgY3UpOwkJCQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RGlzYWJsZUhpdHNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhEaXNhYmxlSGl0cygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0RGlzYWJsZUhpdHMoKSk7CisJCQorCQljYWNoZS5zZXREaXNhYmxlSGl0cyhudWxsKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSkpOworCQkKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZSIsIGN1KTsKKwl9CisKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RXhpc3RlbmNlQ2hlY2tpbmdXaXRoQ29vcmRpbmF0aW9uVHlwZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJYXNzZXJ0RXF1YWxzKENhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgY2FjaGUuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RXhpc3RlbmNlQ2hlY2tpbmdXaXRoQ29vcmRpbmF0aW9uVHlwZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJYXNzZXJ0RXF1YWxzKENhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgY2FjaGUuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJCisJCWNhY2hlLnNldENvb3JkaW5hdGlvblR5cGUoQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKTsKKwkJYXNzZXJ0RXF1YWxzKENhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgY2FjaGUuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGUoY29vcmRpbmF0aW9uVHlwZSA9IFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKSIsIGN1KTsKKwkJCisJCWNhY2hlLnNldENvb3JkaW5hdGlvblR5cGUobnVsbCk7CisJCWFzc2VydE51bGwoY2FjaGUuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoY29vcmRpbmF0aW9uVHlwZSA9IFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZSIsIGN1KTsKKwl9CisJCisKK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DaGFuZ2VUcmFja2luZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ2hhbmdlVHJhY2tpbmdUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZWMxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ2hhbmdlVHJhY2tpbmdUZXN0cy5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBDaGFuZ2VUcmFja2luZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKKworCXB1YmxpYyBDaGFuZ2VUcmFja2luZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lOR19UWVBFKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQ2hhbmdlVHJhY2tpbmciKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2hhbmdlVHJhY2tpbmdXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORywgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HX1RZUEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBDaGFuZ2VUcmFja2luZyhDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpIik7CisJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2hhbmdlVHJhY2tpbmcoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCQorCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBleGlzdGVuY2VDaGVja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKKwkJYXNzZXJ0Tm90TnVsbChleGlzdGVuY2VDaGVja2luZyk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDaGFuZ2VUcmFja2luZ1dpdGhWYWx1ZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7CisJCWFzc2VydEVxdWFscyhDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2hhbmdlVHJhY2tpbmdXaXRoVmFsdWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcpOworCQlhc3NlcnRFcXVhbHMoQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBleGlzdGVuY2VDaGVja2luZy5nZXRWYWx1ZSgpKTsKKwkJCisJCWV4aXN0ZW5jZUNoZWNraW5nLnNldFZhbHVlKENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOworCQlhc3NlcnRFcXVhbHMoQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgZXhpc3RlbmNlQ2hlY2tpbmcuZ2V0VmFsdWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENoYW5nZVRyYWNraW5nKEFUVFJJQlVURSkiLCBjdSk7CisJCQorCQlleGlzdGVuY2VDaGVja2luZy5zZXRWYWx1ZShudWxsKTsKKwkJYXNzZXJ0TnVsbChleGlzdGVuY2VDaGVja2luZy5nZXRWYWx1ZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoQVRUUklCVVRFKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDaGFuZ2VUcmFja2luZyIsIGN1KTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDaGFuZ2VUcmFja2luZygiLCBjdSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMDBlMDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvblRlc3RzLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgeworCQorCXB1YmxpYyBDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIpOworCQkJfQorCQl9KTsKKwl9CQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIkZcIiwgb2JqZWN0VmFsdWUgPSBcIkZlbWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIil9KSIpOworCQkJfQorCQl9KTsKKwl9CisKKworCXB1YmxpYyB2b2lkIHRlc3RHZXREYXRhVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoQ29udmVyc2lvblZhbHVlcygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldERhdGFWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscygiRiIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXREYXRhVmFsdWUoKSk7CisJCQorCQljb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuc2V0RGF0YVZhbHVlKCJGT08iKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0RGF0YVZhbHVlKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIkZPT1wiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVZhbHVlTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKKwkJCisJCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0RGF0YVZhbHVlKCJGT08iKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRk9PXCIpKSIsIGN1KTsKKwkJCisJCWNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5zZXREYXRhVmFsdWUobnVsbCk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0gQENvbnZlcnNpb25WYWx1ZSkiLCBjdSk7CisJCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOworCQlhc3NlcnRFcXVhbHMoIkZlbWFsZSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoQ29udmVyc2lvblZhbHVlcygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJGZW1hbGUiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7CisJCQorCQljb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuc2V0T2JqZWN0VmFsdWUoIkZPTyIpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGXCIsIG9iamVjdFZhbHVlID0gXCJGT09cIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpfSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RWYWx1ZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscygwLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7CisJCQorCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApLnNldE9iamVjdFZhbHVlKCJGT08iKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSBAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIikpIiwgY3UpOworCQkKKwkJY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLnNldE9iamVjdFZhbHVlKG51bGwpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IEBDb252ZXJzaW9uVmFsdWUpIiwgY3UpOworCQlhc3NlcnRFcXVhbHMoMSwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db252ZXJ0QW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydEFubm90YXRpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYzk0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydEFubm90YXRpb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgQ29udmVydEFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CisJCisJcHVibGljIENvbnZlcnRBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DT05WRVJUKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQ29udmVydCIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNPTlZFUlQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KHZhbHVlPVwibXlDb252ZXJ0ZXJcIikiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdENvbnZlcnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVCkpOworCQkKKwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhWYWx1ZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgY29udmVydC5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhWYWx1ZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgY29udmVydC5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnZlcnQuc2V0VmFsdWUoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnQuZ2V0VmFsdWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbnZlcnQodmFsdWU9XCJCYXJcIikiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhWYWx1ZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgY29udmVydC5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnZlcnQuc2V0VmFsdWUobnVsbCk7CisJCWFzc2VydE51bGwoY29udmVydC5nZXRWYWx1ZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29udmVydCIsIGN1KTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInZhbHVlIiwgY3UpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNTczODkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIENvbnZlcnRlckFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CisJCisJcHVibGljIENvbnZlcnRlckFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQ29udmVydGVyIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbnZlcnRlcldpdGhDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQ29udmVydGVyKGNvbnZlcnRlckNsYXNzPUZvby5jbGFzcykiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29udmVydGVyV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENvbnZlcnRlcihuYW1lPVwiYmFyXCIpIik7CisJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXIoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlRFUikpOworCQkKKwkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJURVIpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVEVSKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJURVIpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhDb252ZXJ0ZXJDbGFzcygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyV2l0aENvbnZlcnRlckNsYXNzKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCQorCQljb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29udmVydGVyKGNvbnZlcnRlckNsYXNzPUJhci5jbGFzcykiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0ZXJDbGFzc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhDb252ZXJ0ZXJDbGFzcygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQkKKwkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKG51bGwpOworCQlhc3NlcnROdWxsKGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29udmVydGVyIiwgY3UpOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY29udmVydGVyQ2xhc3MiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoTmFtZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhOYW1lKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCWNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29udmVydGVyKG5hbWU9XCJmb29cIikiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyV2l0aE5hbWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJURVIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQkKKwkJY29udmVydGVyLnNldE5hbWUobnVsbCk7CisJCWFzc2VydE51bGwoY29udmVydGVyLmdldE5hbWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbnZlcnRlciIsIGN1KTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm5hbWU9IiwgY3UpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DdXN0b21pemVyQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ3VzdG9taXplckFubm90YXRpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjQzOTkKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ3VzdG9taXplckFubm90YXRpb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEN1c3RvbWl6ZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgeworCQorCXB1YmxpYyBDdXN0b21pemVyQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q3VzdG9taXplcigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEN1c3RvbWl6ZXIiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q3VzdG9taXplcldpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEN1c3RvbWl6ZXIoRm9vLmNsYXNzKSIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9taXplckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEN1c3RvbWl6ZXIoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCQorCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpKTsKKwkJCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpKTsKKwkJCisJCXR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOworCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEN1c3RvbWl6ZXJXaXRoVmFsdWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEN1c3RvbWl6ZXJXaXRoVmFsdWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnZlcnRlci5zZXRWYWx1ZSgiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldFZhbHVlKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDdXN0b21pemVyKEJhci5jbGFzcykiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0ZXJDbGFzc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEN1c3RvbWl6ZXJXaXRoVmFsdWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnZlcnRlci5zZXRWYWx1ZShudWxsKTsKKwkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0VmFsdWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEN1c3RvbWl6ZXIiLCBjdSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28uY2xhc3MiLCBjdSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZmNkNjIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnBhQW5ub3RhdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKKworcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UKK3sJCisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19BTk5PVEFUSU9OU19QQUNLQUdFX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMiOyAvLyROT04tTkxTLTEkCisJCisJcHVibGljIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCkgeworCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIoCisJCQlHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpLAorCQkJRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0V4aXN0ZW5jZUNoZWNraW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FeGlzdGVuY2VDaGVja2luZ1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxZDUzNQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FeGlzdGVuY2VDaGVja2luZ1Rlc3RzLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFeGlzdGVuY2VDaGVja2luZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKKworCXB1YmxpYyBFeGlzdGVuY2VDaGVja2luZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcsIEVjbGlwc2VMaW5rLkVYSVNURU5DRV9UWVBFKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARXhpc3RlbmNlQ2hlY2tpbmciKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RXhpc3RlbmNlQ2hlY2tpbmdXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORywgRWNsaXBzZUxpbmsuRVhJU1RFTkNFX1RZUEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFeGlzdGVuY2VDaGVja2luZyhFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpIik7CisJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RXhpc3RlbmNlQ2hlY2tpbmcoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCQorCQlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBleGlzdGVuY2VDaGVja2luZyA9IChFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HKTsKKwkJYXNzZXJ0Tm90TnVsbChleGlzdGVuY2VDaGVja2luZyk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFeGlzdGVuY2VDaGVja2luZ1dpdGhWYWx1ZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORyk7CisJCWFzc2VydEVxdWFscyhFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RXhpc3RlbmNlQ2hlY2tpbmdXaXRoVmFsdWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nID0gKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpOworCQlhc3NlcnRFcXVhbHMoRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBleGlzdGVuY2VDaGVja2luZy5nZXRWYWx1ZSgpKTsKKwkJCisJCWV4aXN0ZW5jZUNoZWNraW5nLnNldFZhbHVlKEV4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UpOworCQlhc3NlcnRFcXVhbHMoRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZXhpc3RlbmNlQ2hlY2tpbmcuZ2V0VmFsdWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEV4aXN0ZW5jZUNoZWNraW5nKEFTU1VNRV9OT05fRVhJU1RFTkNFKSIsIGN1KTsKKwkJCisJCWV4aXN0ZW5jZUNoZWNraW5nLnNldFZhbHVlKG51bGwpOworCQlhc3NlcnROdWxsKGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOworCQkKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihBU1NVTUVfTk9OX0VYSVNURU5DRSkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARXhpc3RlbmNlQ2hlY2tpbmciLCBjdSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARXhpc3RlbmNlQ2hlY2tpbmcoIiwgY3UpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luRmV0Y2hUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5GZXRjaFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhMDg4MQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luRmV0Y2hUZXN0cy5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBKb2luRmV0Y2hUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CisKKwlwdWJsaWMgSm9pbkZldGNoVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkZldGNoV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5PVVRFUikiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkZldGNoKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKworCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKKwkJYXNzZXJ0Tm90TnVsbChqb2luRmV0Y2gpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkZldGNoV2l0aFZhbHVlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaCA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7CisJCWFzc2VydEVxdWFscyhKb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luRmV0Y2hXaXRoVmFsdWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKKwkJYXNzZXJ0RXF1YWxzKEpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKKwkJCisJCWpvaW5GZXRjaC5zZXRWYWx1ZShKb2luRmV0Y2hUeXBlLklOTkVSKTsKKwkJYXNzZXJ0RXF1YWxzKEpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkZldGNoKElOTkVSKSIsIGN1KTsKKwkJCisJCWpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKKwkJYXNzZXJ0TnVsbChqb2luRmV0Y2guZ2V0VmFsdWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKElOTkVSKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luRmV0Y2giLCBjdSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkZldGNoKCIsIGN1KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnB0RWNsaXBzZUxpbmtDb3JlSmF2YVJlc291cmNlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwdEVjbGlwc2VMaW5rQ29yZUphdmFSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmNiNzkxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwdEVjbGlwc2VMaW5rQ29yZUphdmFSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitwdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtDb3JlSmF2YVJlc291cmNlTW9kZWxUZXN0cyB7CisKKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmtDb3JlSmF2YVJlc291cmNlTW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2FjaGVUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShDaGFuZ2VUcmFja2luZ1Rlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShDb252ZXJ0QW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbnZlcnRlckFubm90YXRpb25UZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShDdXN0b21pemVyQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEV4aXN0ZW5jZUNoZWNraW5nVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSm9pbkZldGNoVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTXV0YWJsZUFubm90YXRpb25UZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFByaXZhdGVPd25lZFRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5VGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0cnVjdENvbnZlcnRlckFubm90YXRpb25UZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShUaW1lT2ZEYXlUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShUeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKFdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOworCQkKKwkJcmV0dXJuIHN1aXRlOworCX0KKworCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtDb3JlSmF2YVJlc291cmNlTW9kZWxUZXN0cygpIHsKKwkJc3VwZXIoKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTXV0YWJsZUFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL011dGFibGVBbm5vdGF0aW9uVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDRjMjRkCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL011dGFibGVBbm5vdGF0aW9uVGVzdHMuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIE11dGFibGVBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgeworCQorCXB1YmxpYyBNdXRhYmxlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuTVVUQUJMRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE11dGFibGUiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TXV0YWJsZVdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuTVVUQUJMRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE11dGFibGUodmFsdWU9dHJ1ZSkiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCisJCisJcHVibGljIHZvaWQgdGVzdE11dGFibGVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNdXRhYmxlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NVVRBQkxFKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpOwkJCisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NVVRBQkxFKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTVVUQUJMRSkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TXV0YWJsZVdpdGhWYWx1ZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NVVRBQkxFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNdXRhYmxlV2l0aFZhbHVlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJCisJCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE11dGFibGUodmFsdWU9ZmFsc2UpIiwgY3UpOworCQkKKwkJbXV0YWJsZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7CisJCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE11dGFibGUoZmFsc2UpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNdXRhYmxlV2l0aFZhbHVlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJCisJCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOworCQlhc3NlcnROdWxsKG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNdXRhYmxlIiwgY3UpOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidmFsdWUiLCBjdSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWRkYmE0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQpAQCAtMCwwICsxLDQyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CisJCisJcHVibGljIE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyKGRhdGFUeXBlPUZvby5jbGFzcykiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyKG9iamVjdFR5cGU9Rm9vLmNsYXNzKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIobmFtZSA9IFwiYmFyXCIpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoRGVmYXVsdE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyKGRlZmF1bHRPYmplY3RWYWx1ZSA9IFwiZlwiKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIik7CisJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXREYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhEYXRhVHlwZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJCisJCWNvbnZlcnRlci5zZXREYXRhVHlwZSgiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGRhdGFUeXBlPUJhci5jbGFzcykiLCBjdSk7CisJCQorCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUoImludCIpOworCQlhc3NlcnRFcXVhbHMoImludCIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGRhdGFUeXBlPWludC5jbGFzcykiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXREYXRhVHlwZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoRGF0YVR5cGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQkKKwkJY29udmVydGVyLnNldERhdGFUeXBlKG51bGwpOworCQlhc3NlcnROdWxsKGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIsIGN1KTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImRhdGFUeXBlIiwgY3UpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE9iamVjdFR5cGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJCisJCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJCYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihvYmplY3RUeXBlPUJhci5jbGFzcykiLCBjdSk7CisJCQorCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiaW50Iik7CisJCWFzc2VydEVxdWFscygiaW50IiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihvYmplY3RUeXBlPWludC5jbGFzcykiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RUeXBlTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhPYmplY3RUeXBlKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOworCQkKKwkJY29udmVydGVyLnNldE9iamVjdFR5cGUobnVsbCk7CisJCWFzc2VydE51bGwoY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIiLCBjdSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJvYmplY3RUeXBlIiwgY3UpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCWNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihuYW1lID0gXCJmb29cIikiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQkKKwkJY29udmVydGVyLnNldE5hbWUobnVsbCk7CisJCWFzc2VydE51bGwoY29udmVydGVyLmdldE5hbWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIiLCBjdSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuYW1lPSIsIGN1KTsKKwl9CisJCisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERlZmF1bHRPYmplY3RWYWx1ZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJmIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERlZmF1bHRPYmplY3RWYWx1ZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJmIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKKwkJCisJCWNvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoZGVmYXVsdE9iamVjdFZhbHVlID0gXCJmb29cIikiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXREZWZhdWx0T2JqZWN0VmFsdWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERlZmF1bHRPYmplY3RWYWx1ZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJmIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKKwkJCisJCWNvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUobnVsbCk7CisJCWFzc2VydE51bGwoY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIsIGN1KTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImRlZmF1bHRPYmplY3RWYWx1ZSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdENvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOworCQlhc3NlcnRGYWxzZShjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpLmhhc05leHQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJzaW9uVmFsdWVzMigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKKworCQkKKwkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKTsKKwkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgxKTsKKwkJCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWFzc2VydFRydWUoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOworCQlhc3NlcnROb3ROdWxsKGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpKTsKKwkJYXNzZXJ0Tm90TnVsbChjb252ZXJzaW9uVmFsdWVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdENvbnZlcnNpb25WYWx1ZXMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOworCQkJCQorCQlhc3NlcnRFcXVhbHMoMiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOworCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZSA9IGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIkZlbWFsZSIsIGNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKKwkJY29udmVyc2lvblZhbHVlID0gY29udmVyc2lvblZhbHVlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiTWFsZSIsIGNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOworCQkKKwkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXRPYmplY3RWYWx1ZSgiRk9PIik7CisJCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMSk7CisJCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0RGF0YVZhbHVlKCJCQVIiKTsKKworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydE51bGwoY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldE9iamVjdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKKwkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMSkuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnROdWxsKGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgyKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydE51bGwoY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDIpLmdldE9iamVjdFZhbHVlKCkpOworCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihuYW1lID0gXCJiYXJcIiwgY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiQkFSXCIpLEBDb252ZXJzaW9uVmFsdWUob2JqZWN0VmFsdWUgPSBcIkZPT1wiKSwgQENvbnZlcnNpb25WYWx1ZX0pIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOworCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApLnNldE9iamVjdFZhbHVlKCJGT08iKTsKKwkJCisJCUl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiRmVtYWxlIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiTWFsZSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOworCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUob2JqZWN0VmFsdWUgPSBcIkZPT1wiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIkZcIiwgb2JqZWN0VmFsdWUgPSBcIkZlbWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIil9KSIsIGN1KTsKKwkJCisJCWNvbnZlcnRlci5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMSk7CisJCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIk1hbGUiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpfSkiLCBjdSk7CisKKwkJY29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKKwkJY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7CisJCWFzc2VydEVxdWFscygiTWFsZSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOworCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0gQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIikpIiwgY3UpOworCisJCQorCQljb252ZXJ0ZXIucmVtb3ZlQ29udmVyc2lvblZhbHVlKDApOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQGNvbnZlcnNpb25WYWx1ZXMiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vdmVDb252ZXJzaW9uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoQ29udmVyc2lvblZhbHVlcygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0T2JqZWN0VmFsdWUoIkZPTyIpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShvYmplY3RWYWx1ZSA9IFwiRk9PXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIiwgY3UpOworCisJCWNvbnZlcnRlci5tb3ZlQ29udmVyc2lvblZhbHVlKDIsIDApOworCQlhc3NlcnRFcXVhbHMoIkZlbWFsZSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJNYWxlIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDEpLmdldE9iamVjdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIk0iLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMSkuZ2V0RGF0YVZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgyKS5nZXRPYmplY3RWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgyKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygzLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGXCIsIG9iamVjdFZhbHVlID0gXCJGZW1hbGVcIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIil9KSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vdmVDb252ZXJzaW9uVmFsdWUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7CisJCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0T2JqZWN0VmFsdWUoIkZPTyIpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShvYmplY3RWYWx1ZSA9IFwiRk9PXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIiwgY3UpOworCisJCWNvbnZlcnRlci5tb3ZlQ29udmVyc2lvblZhbHVlKDAsIDIpOworCQlhc3NlcnRFcXVhbHMoIk1hbGUiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDEpLmdldE9iamVjdFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDEpLmdldERhdGFWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGZW1hbGUiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMikuZ2V0T2JqZWN0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiRiIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgyKS5nZXREYXRhVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygzLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGXCIsIG9iamVjdFZhbHVlID0gXCJGZW1hbGVcIil9KSIsIGN1KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpdmF0ZU93bmVkVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Qcml2YXRlT3duZWRUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzUzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpdmF0ZU93bmVkVGVzdHMuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBQcml2YXRlT3duZWRUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CisKKwlwdWJsaWMgUHJpdmF0ZU93bmVkVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQcml2YXRlT3duZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBQcml2YXRlT3duZWQiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RQcml2YXRlT3duZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaXZhdGVPd25lZCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24gcHJpdmF0ZU93bmVkID0gKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5QUklWQVRFX09XTkVEKTsKKwkJYXNzZXJ0Tm90TnVsbChwcml2YXRlT3duZWQpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1JlYWRPbmx5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9SZWFkT25seVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkNmJjYwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9SZWFkT25seVRlc3RzLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIFJlYWRPbmx5VGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgeworCisJcHVibGljIFJlYWRPbmx5VGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlJFQURfT05MWSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQFJlYWRPbmx5Iik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRPbmx5KCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQkKKwkJRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24gcmVhZE9ubHkgPSAoRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfT05MWSk7CisJCWFzc2VydE5vdE51bGwocmVhZE9ubHkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNDMwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIFJlYWRUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CisJCisJcHVibGljIFJlYWRUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQFJlYWRUcmFuc2Zvcm1lciIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQFJlYWRUcmFuc2Zvcm1lcih0cmFuc2Zvcm1lckNsYXNzPUZvby5jbGFzcykiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UmVhZFRyYW5zZm9ybWVyV2l0aE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQFJlYWRUcmFuc2Zvcm1lcihtZXRob2Q9XCJ0cmFuc2Zvcm1lck1ldGhvZFwiKSIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UmVhZFRyYW5zZm9ybWVyKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpCTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldFRyYW5zZm9ybWVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhUcmFuc2Zvcm1lckNsYXNzKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHJlYWRUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVhZFRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFRyYW5zZm9ybWVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhUcmFuc2Zvcm1lckNsYXNzKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHJlYWRUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVhZFRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7CisJCQorCQlyZWFkVHJhbnNmb3JtZXIuc2V0VHJhbnNmb3JtZXJDbGFzcygiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgcmVhZFRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFJlYWRUcmFuc2Zvcm1lcih0cmFuc2Zvcm1lckNsYXNzPUJhci5jbGFzcykiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRUcmFuc2Zvcm1lckNsYXNzTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UmVhZFRyYW5zZm9ybWVyV2l0aFRyYW5zZm9ybWVyQ2xhc3MoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24gcmVhZFRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZWFkVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKKwkJCisJCXJlYWRUcmFuc2Zvcm1lci5zZXRUcmFuc2Zvcm1lckNsYXNzKG51bGwpOworCQlhc3NlcnROdWxsKHJlYWRUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBSZWFkVHJhbnNmb3JtZXIiLCBjdSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ0cmFuc2Zvcm1lckNsYXNzIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHJlYWRUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7CisJCWFzc2VydEVxdWFscygidHJhbnNmb3JtZXJNZXRob2QiLCByZWFkVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhNZXRob2QoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24gcmVhZFRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2Zvcm1lck1ldGhvZCIsIHJlYWRUcmFuc2Zvcm1lci5nZXRNZXRob2QoKSk7CisJCQorCQlyZWFkVHJhbnNmb3JtZXIuc2V0TWV0aG9kKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZWFkVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBSZWFkVHJhbnNmb3JtZXIobWV0aG9kPVwiZm9vXCIpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TWV0aG9kTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UmVhZFRyYW5zZm9ybWVyV2l0aE1ldGhvZCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbiByZWFkVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOworCQlhc3NlcnRFcXVhbHMoInRyYW5zZm9ybWVyTWV0aG9kIiwgcmVhZFRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKKwkJCisJCXJlYWRUcmFuc2Zvcm1lci5zZXRNZXRob2QobnVsbCk7CisJCWFzc2VydE51bGwocmVhZFRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUmVhZFRyYW5zZm9ybWVyIiwgY3UpOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibWV0aG9kIiwgY3UpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTJmNDcxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1N0cnVjdENvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgeworCQorCXB1YmxpYyBTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBTdHJ1Y3RDb252ZXJ0ZXIiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aENvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQFN0cnVjdENvbnZlcnRlcihjb252ZXJ0ZXI9XCJGb29cIikiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBTdHJ1Y3RDb252ZXJ0ZXIobmFtZT1cImJhclwiKSIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U3RydWN0Q29udmVydGVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U3RydWN0Q29udmVydGVyKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOworCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUikpOworCQkKKwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlcigpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlcigpKTsKKwkJCisJCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXIoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXIoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFN0cnVjdENvbnZlcnRlcihjb252ZXJ0ZXI9XCJCYXJcIikiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0ZXJOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlcigpKTsKKwkJCisJCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXIobnVsbCk7CisJCWFzc2VydE51bGwoY29udmVydGVyLmdldENvbnZlcnRlcigpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU3RydWN0Q29udmVydGVyIiwgY3UpOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY29udmVydGVyIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aE5hbWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aE5hbWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCWNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU3RydWN0Q29udmVydGVyKG5hbWU9XCJmb29cIikiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aE5hbWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJCisJCWNvbnZlcnRlci5zZXROYW1lKG51bGwpOworCQlhc3NlcnROdWxsKGNvbnZlcnRlci5nZXROYW1lKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTdHJ1Y3RDb252ZXJ0ZXIiLCBjdSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuYW1lPSIsIGN1KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGltZU9mRGF5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UaW1lT2ZEYXlUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMTZiNTAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGltZU9mRGF5VGVzdHMuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIFRpbWVPZkRheVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKKworCXB1YmxpYyBUaW1lT2ZEYXlUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGluay5USU1FX09GX0RBWSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENhY2hlKGV4cGlyeVRpbWVPZkRheSA9IEBUaW1lT2ZEYXkpIik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGltZU9mRGF5V2l0aEhvdXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGluay5USU1FX09GX0RBWSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENhY2hlKGV4cGlyeVRpbWVPZkRheSA9IEBUaW1lT2ZEYXkoaG91cj01KSkiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGltZU9mRGF5V2l0aE1pbnV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheShtaW51dGU9NSkpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhTZWNvbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGluay5USU1FX09GX0RBWSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENhY2hlKGV4cGlyeVRpbWVPZkRheSA9IEBUaW1lT2ZEYXkoc2Vjb25kPTUpKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoTWlsbGlzZWNvbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGluay5USU1FX09GX0RBWSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQENhY2hlKGV4cGlyeVRpbWVPZkRheSA9IEBUaW1lT2ZEYXkobWlsbGlzZWNvbmQ9NSkpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RXhwaXJ5VGltZU9mRGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUaW1lT2ZEYXkoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCQorCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQkKKwkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOworCQkKKwkJYXNzZXJ0Tm90TnVsbCh0aW1lT2ZEYXkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0SG91cigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aEhvdXIoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldEhvdXIoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldEhvdXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhIb3VyKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5ID0gY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHRpbWVPZkRheS5nZXRIb3VyKCkpOworCQkKKwkJdGltZU9mRGF5LnNldEhvdXIoSW50ZWdlci52YWx1ZU9mKDgwKSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODApLCB0aW1lT2ZEYXkuZ2V0SG91cigpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGltZU9mRGF5KGhvdXI9ODApIiwgY3UpOworCQkKKwkJdGltZU9mRGF5LnNldEhvdXIobnVsbCk7CisJCWFzc2VydE51bGwodGltZU9mRGF5LmdldEhvdXIoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKGhvdXI9ODApIiwgY3UpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRpbWVPZkRheSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldE1pbnV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aE1pbnV0ZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOworCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0TWludXRlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRNaW51dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhNaW51dGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldE1pbnV0ZSgpKTsKKwkJCisJCXRpbWVPZkRheS5zZXRNaW51dGUoSW50ZWdlci52YWx1ZU9mKDgwKSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODApLCB0aW1lT2ZEYXkuZ2V0TWludXRlKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkobWludXRlPTgwKSIsIGN1KTsKKwkJCisJCXRpbWVPZkRheS5zZXRNaW51dGUobnVsbCk7CisJCWFzc2VydE51bGwodGltZU9mRGF5LmdldE1pbnV0ZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIobWludXRlPTgwKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkiLCBjdSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldFNlY29uZCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aFNlY29uZCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOworCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0U2Vjb25kKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRTZWNvbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhTZWNvbmQoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJCisJCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7CisJCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKKwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldFNlY29uZCgpKTsKKwkJCisJCXRpbWVPZkRheS5zZXRTZWNvbmQoSW50ZWdlci52YWx1ZU9mKDgwKSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODApLCB0aW1lT2ZEYXkuZ2V0U2Vjb25kKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkoc2Vjb25kPTgwKSIsIGN1KTsKKwkJCisJCXRpbWVPZkRheS5zZXRTZWNvbmQobnVsbCk7CisJCWFzc2VydE51bGwodGltZU9mRGF5LmdldFNlY29uZCgpKTsKKwkJCisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoc2Vjb25kPTgwKSIsIGN1KTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRNaWxsaXNlY29uZCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aE1pbGxpc2Vjb25kKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCQorCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOworCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5ID0gY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHRpbWVPZkRheS5nZXRNaWxsaXNlY29uZCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TWlsbGlzZWNvbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhNaWxsaXNlY29uZCgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQkKKwkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKKwkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOworCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0TWlsbGlzZWNvbmQoKSk7CisJCQorCQl0aW1lT2ZEYXkuc2V0TWlsbGlzZWNvbmQoSW50ZWdlci52YWx1ZU9mKDgwKSk7CisJCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODApLCB0aW1lT2ZEYXkuZ2V0TWlsbGlzZWNvbmQoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRpbWVPZkRheShtaWxsaXNlY29uZD04MCkiLCBjdSk7CisJCQorCQl0aW1lT2ZEYXkuc2V0TWlsbGlzZWNvbmQobnVsbCk7CisJCWFzc2VydE51bGwodGltZU9mRGF5LmdldE1pbGxpc2Vjb25kKCkpOworCQkKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihtaWxsaXNlY29uZD04MCkiLCBjdSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGltZU9mRGF5IiwgY3UpOworCX0KKworCit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNzViNDYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMuamF2YQpAQCAtMCwwICsxLDE1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CisJCisJcHVibGljIFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHJhbnNmb3JtYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAVHJhbnNmb3JtYXRpb24iKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHJhbnNmb3JtYXRpb25XaXRoT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAVHJhbnNmb3JtYXRpb24ob3B0aW9uYWwgPSB0cnVlKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbldpdGhGZXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04sIEpQQS5GRVRDSF9UWVBFKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAVHJhbnNmb3JtYXRpb24oZmV0Y2ggPSBGZXRjaFR5cGUuRUFHRVIpIik7CisJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTikpOworCQkKKwkJYXR0cmlidXRlUmVzb3VyY2Uuc2V0UHJpbWFyeUFubm90YXRpb24obnVsbCwgbmV3IFN0cmluZ1swXSk7CQkKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTiwgbmV3IFN0cmluZ1swXSk7CisJCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTikpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHJhbnNmb3JtYXRpb25XaXRoT3B0aW9uYWwoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IChFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHRyYW5zZm9ybWF0aW9uLmdldE9wdGlvbmFsKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHJhbnNmb3JtYXRpb25XaXRoT3B0aW9uYWwoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IChFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHRyYW5zZm9ybWF0aW9uLmdldE9wdGlvbmFsKCkpOworCQkKKwkJdHJhbnNmb3JtYXRpb24uc2V0T3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB0cmFuc2Zvcm1hdGlvbi5nZXRPcHRpb25hbCgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHJhbnNmb3JtYXRpb24ob3B0aW9uYWwgPSBmYWxzZSkiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRPcHRpb25hbE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uV2l0aE9wdGlvbmFsKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gdHJhbnNmb3JtYXRpb24gPSAoRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB0cmFuc2Zvcm1hdGlvbi5nZXRPcHRpb25hbCgpKTsKKwkJCisJCXRyYW5zZm9ybWF0aW9uLnNldE9wdGlvbmFsKG51bGwpOworCQlhc3NlcnROdWxsKHRyYW5zZm9ybWF0aW9uLmdldE9wdGlvbmFsKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUcmFuc2Zvcm1hdGlvbiIsIGN1KTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm9wdGlvbmFsIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uV2l0aEZldGNoKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gdHJhbnNmb3JtYXRpb24gPSAoRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pOworCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCB0cmFuc2Zvcm1hdGlvbi5nZXRGZXRjaCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uV2l0aEZldGNoKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gdHJhbnNmb3JtYXRpb24gPSAoRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pOworCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCB0cmFuc2Zvcm1hdGlvbi5nZXRGZXRjaCgpKTsKKwkJCisJCXRyYW5zZm9ybWF0aW9uLnNldEZldGNoKEZldGNoVHlwZS5MQVpZKTsKKwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCB0cmFuc2Zvcm1hdGlvbi5nZXRGZXRjaCgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHJhbnNmb3JtYXRpb24oZmV0Y2ggPSBMQVpZKSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldEZldGNoTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHJhbnNmb3JtYXRpb25XaXRoRmV0Y2goKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IChFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7CisJCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHRyYW5zZm9ybWF0aW9uLmdldEZldGNoKCkpOworCQkKKwkJdHJhbnNmb3JtYXRpb24uc2V0RmV0Y2gobnVsbCk7CisJCWFzc2VydE51bGwodHJhbnNmb3JtYXRpb24uZ2V0RmV0Y2goKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRyYW5zZm9ybWF0aW9uIiwgY3UpOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiZmV0Y2giLCBjdSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhMzRlMgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBUeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKKwkKKwlwdWJsaWMgVHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAVHlwZUNvbnZlcnRlciIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQFR5cGVDb252ZXJ0ZXIoZGF0YVR5cGUgPSBGb28uY2xhc3MpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBUeXBlQ29udmVydGVyKG9iamVjdFR5cGUgPSBGb28uY2xhc3MpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBUeXBlQ29udmVydGVyKG5hbWUgPSBcImJhclwiKSIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VHlwZUNvbnZlcnRlckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXIoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldFR5cGVEYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhEYXRhVHlwZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoRGF0YVR5cGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCQorCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHlwZUNvbnZlcnRlcihkYXRhVHlwZSA9IEJhci5jbGFzcykiLCBjdSk7CisJCQorCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUoImludCIpOworCQlhc3NlcnRFcXVhbHMoImludCIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUeXBlQ29udmVydGVyKGRhdGFUeXBlID0gaW50LmNsYXNzKSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldERhdGFUeXBlTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhEYXRhVHlwZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJCisJCWNvbnZlcnRlci5zZXREYXRhVHlwZShudWxsKTsKKwkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIiLCBjdSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJkYXRhVHlwZSIsIGN1KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZU9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aE9iamVjdFR5cGUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJCisJCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJCYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHlwZUNvbnZlcnRlcihvYmplY3RUeXBlID0gQmFyLmNsYXNzKSIsIGN1KTsKKwkJCisJCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJpbnQiKTsKKwkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUeXBlQ29udmVydGVyKG9iamVjdFR5cGUgPSBpbnQuY2xhc3MpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VHlwZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOworCQkKKwkJY29udmVydGVyLnNldE9iamVjdFR5cGUobnVsbCk7CisJCWFzc2VydE51bGwoY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIiLCBjdSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJvYmplY3RUeXBlIiwgY3UpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7CisJCQorCQljb252ZXJ0ZXIuc2V0TmFtZSgiZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIobmFtZSA9IFwiZm9vXCIpIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOworCQkKKwkJY29udmVydGVyLnNldE5hbWUobnVsbCk7CisJCWFzc2VydE51bGwoY29udmVydGVyLmdldE5hbWUoKSk7CisJCQorCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIiLCBjdSk7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuYW1lPSIsIGN1KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGU2OGVjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMuamF2YQpAQCAtMCwwICsxLDIxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIFdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgeworCQorCXB1YmxpYyBXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBXcml0ZVRyYW5zZm9ybWVyIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBXcml0ZVRyYW5zZm9ybWVyKHRyYW5zZm9ybWVyQ2xhc3MgPSBGb28uY2xhc3MpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQFdyaXRlVHJhbnNmb3JtZXIobWV0aG9kID0gXCJ0cmFuc2Zvcm1lck1ldGhvZFwiKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aENvbHVtbigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIsIEpQQS5DT0xVTU4pOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBXcml0ZVRyYW5zZm9ybWVyKGNvbHVtbiA9IEBDb2x1bW4obmFtZSA9IFwiRk9PXCIpKSIpOworCQkJfQorCQl9KTsKKwl9CisKKworCXB1YmxpYyB2b2lkIHRlc3RXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpKTsKKwkJCisJCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpCTsKKwkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKSk7CisJCQorCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldFRyYW5zZm9ybWVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCB3cml0ZVRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFRyYW5zZm9ybWVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCB3cml0ZVRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7CisJCQorCQl3cml0ZVRyYW5zZm9ybWVyLnNldFRyYW5zZm9ybWVyQ2xhc3MoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIHdyaXRlVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAV3JpdGVUcmFuc2Zvcm1lcih0cmFuc2Zvcm1lckNsYXNzID0gQmFyLmNsYXNzKSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldFRyYW5zZm9ybWVyQ2xhc3NOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aFRyYW5zZm9ybWVyQ2xhc3MoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7CisJCWFzc2VydEVxdWFscygiRm9vIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOworCQkKKwkJd3JpdGVUcmFuc2Zvcm1lci5zZXRUcmFuc2Zvcm1lckNsYXNzKG51bGwpOworCQlhc3NlcnROdWxsKHdyaXRlVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAV3JpdGVUcmFuc2Zvcm1lciIsIGN1KTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInRyYW5zZm9ybWVyQ2xhc3MiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOworCQlhc3NlcnRFcXVhbHMoInRyYW5zZm9ybWVyTWV0aG9kIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRNZXRob2QoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhNZXRob2QoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7CisJCWFzc2VydEVxdWFscygidHJhbnNmb3JtZXJNZXRob2QiLCB3cml0ZVRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKKwkJCisJCXdyaXRlVHJhbnNmb3JtZXIuc2V0TWV0aG9kKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCB3cml0ZVRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAV3JpdGVUcmFuc2Zvcm1lcihtZXRob2QgPSBcImZvb1wiKSIsIGN1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldE1ldGhvZE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOworCQlhc3NlcnRFcXVhbHMoInRyYW5zZm9ybWVyTWV0aG9kIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRNZXRob2QoKSk7CisJCQorCQl3cml0ZVRyYW5zZm9ybWVyLnNldE1ldGhvZChudWxsKTsKKwkJYXNzZXJ0TnVsbCh3cml0ZVRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKKwkJCisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAV3JpdGVUcmFuc2Zvcm1lciIsIGN1KTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm1ldGhvZCIsIGN1KTsKKwl9CisJCisJCisJcHVibGljIHZvaWQgdGVzdEdldENvbHVtbigpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhDb2x1bW4oKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7CisJCQorCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7CisJCWFzc2VydE5vdE51bGwod3JpdGVUcmFuc2Zvcm1lci5nZXRDb2x1bW4oKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOworCQkKKwkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOworCQlhc3NlcnROdWxsKHdyaXRlVHJhbnNmb3JtZXIuZ2V0Q29sdW1uKCkpOworCQkKKwkJd3JpdGVUcmFuc2Zvcm1lci5hZGRDb2x1bW4oKTsKKwkJCisJCWFzc2VydE5vdE51bGwod3JpdGVUcmFuc2Zvcm1lci5nZXRDb2x1bW4oKSk7CQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBXcml0ZVRyYW5zZm9ybWVyKG1ldGhvZCA9IFwidHJhbnNmb3JtZXJNZXRob2RcIiwgY29sdW1uID0gQENvbHVtbikiLCBjdSk7CisJCQorCQl3cml0ZVRyYW5zZm9ybWVyLmdldENvbHVtbigpLnNldE5hbWUoIkJBUiIpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFdyaXRlVHJhbnNmb3JtZXIobWV0aG9kID0gXCJ0cmFuc2Zvcm1lck1ldGhvZFwiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSkiLCBjdSk7CisJCQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aENvbHVtbigpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKKwkJCisJCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKKwkJYXNzZXJ0Tm90TnVsbCh3cml0ZVRyYW5zZm9ybWVyLmdldENvbHVtbigpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB3cml0ZVRyYW5zZm9ybWVyLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCQorCQl3cml0ZVRyYW5zZm9ybWVyLnJlbW92ZUNvbHVtbigpOworCQlhc3NlcnROdWxsKHdyaXRlVHJhbnNmb3JtZXIuZ2V0Q29sdW1uKCkpOworCQkKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBXcml0ZVRyYW5zZm9ybWVyIiwgY3UpOworCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY29sdW1uIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBnZXROb25OdWxsQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL0pwdEVjbGlwc2VMaW5rQ29yZVNjaGVtYUdlbmVyYXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9KcHRFY2xpcHNlTGlua0NvcmVTY2hlbWFHZW5lcmF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ3NWY5Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL0pwdEVjbGlwc2VMaW5rQ29yZVNjaGVtYUdlbmVyYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtDb3JlU2NoZW1hR2VuZXJhdGlvblRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGlua0NvcmVTY2hlbWFHZW5lcmF0aW9uVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2NoZW1hR2VuZXJhdGlvbkJhc2ljQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZVNjaGVtYUdlbmVyYXRpb25UZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2NmMDlhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpY1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtKcGFQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbmNlVW5pdFByb3BlcnR5TGlzdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uRGRsR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbi5FY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5zY2hlbWEuZ2VuZXJhdGlvbi5PdXRwdXRNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5QZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgT3V0cHV0TW9kZSBtb2RlbCBvYmplY3QgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24gYWRhcHRlcgotICogd2hlbiB0aGUgUGVyc2lzdGVuY2VVbml0IGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFHZW5lcmF0aW9uQWRhcHRlclRlc3RzIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIFNjaGVtYUdlbmVyYXRpb24gc2NoZW1hR2VuZXJhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERETF9HRU5FUkFUSU9OX1RZUEVfS0VZID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGRsR2VuZXJhdGlvblR5cGUgRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFID0gRGRsR2VuZXJhdGlvblR5cGUuZHJvcF9hbmRfY3JlYXRlX3RhYmxlczsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERkbEdlbmVyYXRpb25UeXBlIERETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRV8yID0gRGRsR2VuZXJhdGlvblR5cGUubm9uZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9NT0RFX0tFWSA9IFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUgPSBPdXRwdXRNb2RlLnNxbF9zY3JpcHQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMiA9IE91dHB1dE1vZGUuZGF0YWJhc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0ZJTEVfTkFNRV9LRVkgPSBTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0NSRUFURV9GSUxFX05BTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9GSUxFX05BTUVfVEVTVF9WQUxVRSA9ICJjcmVhdGUtZmlsZS1uYW1lLnRlc3QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUVfMiA9ICJjcmVhdGUtZmlsZS1uYW1lLTIudGVzdCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUF9GSUxFX05BTUVfS0VZID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19EUk9QX0ZJTEVfTkFNRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUF9GSUxFX05BTUVfVEVTVF9WQUxVRSA9ICJkcm9wLWZpbGUtbmFtZS50ZXN0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUF9GSUxFX05BTUVfVEVTVF9WQUxVRV8yID0gImRyb3AtZmlsZS1uYW1lLTIudGVzdCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fTE9DQVRJT05fS0VZID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19BUFBMSUNBVElPTl9MT0NBVElPTjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRSA9ICJDOi90ZW1wIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRV8yID0gIkM6L3RtcCI7Ci0KLQlwdWJsaWMgU2NoZW1hR2VuZXJhdGlvbkFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24gPSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuZ2V0U2NoZW1hR2VuZXJhdGlvbigpOwotCQkKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uRFJPUF9GSUxFX05BTUVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTY2hlbWFHZW5lcmF0aW9uLkFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIENhbm5vdCB1c2UKLQkgKiBQcm9wZXJ0eSBIb2xkZXIgdG8gaW5pdGlhbGl6ZSBiZWNhdXNlIGl0IGlzIG5vdCBjcmVhdGVkIHlldAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gOTsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSA1OwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KCJwcm9wZXJ0eS4wIiwgInZhbHVlLjAiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoT1VUUFVUX01PREVfS0VZLCB0aGlzLmdldEVjbGlwc2VMaW5rU3RyaW5nVmFsdWVPZihPVVRQVVRfTU9ERV9URVNUX1ZBTFVFKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KCJwcm9wZXJ0eS4yIiwgInZhbHVlLjIiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoInByb3BlcnR5LjMiLCAidmFsdWUuMyIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dCgicHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KERETF9HRU5FUkFUSU9OX1RZUEVfS0VZLCB0aGlzLmdldEVjbGlwc2VMaW5rU3RyaW5nVmFsdWVPZihERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoQ1JFQVRFX0ZJTEVfTkFNRV9LRVksIENSRUFURV9GSUxFX05BTUVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KERST1BfRklMRV9OQU1FX0tFWSwgRFJPUF9GSUxFX05BTUVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KEFQUExJQ0FUSU9OX0xPQ0FUSU9OX0tFWSwgQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgUHJvcGVydHk+IHByb3BlcnRpZXNBZGFwdGVyID0gKExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgUHJvcGVydHk+KSAoKEVjbGlwc2VMaW5rSnBhUHJvcGVydGllcykgdGhpcy5wZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzKS5wcm9wZXJ0aWVzQWRhcHRlcigpOwotCQlHZW5lcmljUHJvcGVydHkgb3V0cHV0TW9kZVByb3BlcnR5ID0gKEdlbmVyaWNQcm9wZXJ0eSkgdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShPVVRQVVRfTU9ERV9LRVkpOwotCQlHZW5lcmljUHJvcGVydHkgZGRsR2VuVHlwZVByb3BlcnR5ID0gKEdlbmVyaWNQcm9wZXJ0eSkgdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShERExfR0VORVJBVElPTl9UWVBFX0tFWSk7Ci0JCUxpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBwcm9wZXJ0eUxpc3RBZGFwdGVyID0gKChFY2xpcHNlTGlua0pwYVByb3BlcnRpZXMpIHRoaXMucGVyc2lzdGVuY2VVbml0UHJvcGVydGllcykucHJvcGVydHlMaXN0QWRhcHRlcigpOwotCi0JCWFzc2VydFRydWUocHJvcGVydGllc0FkYXB0ZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKG91dHB1dE1vZGVQcm9wZXJ0eS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKGRkbEdlblR5cGVQcm9wZXJ0eS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNjaGVtYUdlbmVyYXRpb24sIFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNjaGVtYUdlbmVyYXRpb24sIFNjaGVtYUdlbmVyYXRpb24uRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHByb3BlcnR5TGlzdEFkYXB0ZXIpOwotCi0JCUVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbiBzY2hlbWFHZW4gPSAoRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uKSB0aGlzLnNjaGVtYUdlbmVyYXRpb247Ci0JCVBlcnNpc3RlbmNlVW5pdFByb3BlcnR5TGlzdExpc3RlbmVyIHByb3BlcnR5TGlzdExpc3RlbmVyID0gc2NoZW1hR2VuLnByb3BlcnR5TGlzdExpc3RlbmVyKCk7Ci0JCXByb3BlcnR5TGlzdEFkYXB0ZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBwcm9wZXJ0eUxpc3RMaXN0ZW5lcik7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc2NoZW1hR2VuZXJhdGlvbiwgU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc2NoZW1hR2VuZXJhdGlvbiwgU2NoZW1hR2VuZXJhdGlvbi5ERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENyZWF0ZUZpbGVOYW1lICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIENyZWF0ZUZpbGVOYW1lIHByb3BlcnR5IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uCi0JICogYWRhcHRlciB3aGVuIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q3JlYXRlRmlsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9LRVksCi0JCQlDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9LRVksCi0JCQlDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUUsCi0JCQlDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNyZWF0ZUZpbGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlDUkVBVEVfRklMRV9OQU1FX0tFWSwKLQkJCUNSRUFURV9GSUxFX05BTUVfVEVTVF9WQUxVRSwKLQkJCUNSRUFURV9GSUxFX05BTUVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBEcm9wRmlsZU5hbWUgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgRHJvcEZpbGVOYW1lIHByb3BlcnR5IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uIGFkYXB0ZXIKLQkgKiB3aGVuIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RHJvcEZpbGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCURST1BfRklMRV9OQU1FX0tFWSwKLQkJCURST1BfRklMRV9OQU1FX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRFJPUF9GSUxFX05BTUVfS0VZLAotCQkJRFJPUF9GSUxFX05BTUVfVEVTVF9WQUxVRSwKLQkJCURST1BfRklMRV9OQU1FX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZURyb3BGaWxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRFJPUF9GSUxFX05BTUVfS0VZLCAKLQkJCURST1BfRklMRV9OQU1FX1RFU1RfVkFMVUUsIAotCQkJRFJPUF9GSUxFX05BTUVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEFwcGxpY2F0aW9uTG9jYXRpb24gKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQXBwbGljYXRpb25Mb2NhdGlvbiBwcm9wZXJ0eSBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbgotCSAqIGFkYXB0ZXIgd2hlbiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldEFwcGxpY2F0aW9uTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fS0VZLAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlBUFBMSUNBVElPTl9MT0NBVElPTl9LRVksCi0JCQlBUFBMSUNBVElPTl9MT0NBVElPTl9URVNUX1ZBTFVFLAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQXBwbGljYXRpb25Mb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fS0VZLAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRSwKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBPdXRwdXRNb2RlICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIE91dHB1dE1vZGUgcHJvcGVydHkgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24gYWRhcHRlcgotCSAqIHdoZW4gdGhlIFBVIG9yIHRoZSBtb2RlbCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTZXRPdXRwdXRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCU9VVFBVVF9NT0RFX0tFWSwKLQkJCU9VVFBVVF9NT0RFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJT1VUUFVUX01PREVfS0VZLAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRSwKLQkJCU9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZU91dHB1dE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCU9VVFBVVF9NT0RFX0tFWSwgCi0JCQlPVVRQVVRfTU9ERV9URVNUX1ZBTFVFLCAKLQkJCU9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBEZGxHZW5lcmF0aW9uVHlwZSAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBEZGxHZW5lcmF0aW9uVHlwZSBwcm9wZXJ0eSBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbgotCSAqIGFkYXB0ZXIgd2hlbiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldERkbEdlbmVyYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCURETF9HRU5FUkFUSU9OX1RZUEVfS0VZLAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCURETF9HRU5FUkFUSU9OX1RZUEVfS0VZLAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFLAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVEZGxHZW5lcmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9LRVksIAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFLCAKLQkJCURETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSkpCi0JCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uc2V0T3V0cHV0TW9kZSgoT3V0cHV0TW9kZSkgbmV3VmFsdWUpOwotCQkvLyBlbHNlIGlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBDYWNoaW5nLkNBQ0hFX1NJWkVfUFJPUEVSVFkpKQotCQkvLyBUT0RPCi0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU2NoZW1hR2VuZXJhdGlvbi5ERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZKSkKLQkJCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5zZXREZGxHZW5lcmF0aW9uVHlwZSgoRGRsR2VuZXJhdGlvblR5cGUpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLkFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZKSkKLQkJCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5zZXRBcHBsaWNhdGlvbkxvY2F0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLkNSRUFURV9GSUxFX05BTUVfUFJPUEVSVFkpKQotCQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldENyZWF0ZUZpbGVOYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLkRST1BfRklMRV9OQU1FX1BST1BFUlRZKSkKLQkJCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5zZXREcm9wRmlsZU5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldE91dHB1dE1vZGUoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLkRETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXREZGxHZW5lcmF0aW9uVHlwZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRBcHBsaWNhdGlvbkxvY2F0aW9uKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU2NoZW1hR2VuZXJhdGlvbi5DUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0Q3JlYXRlRmlsZU5hbWUoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLkRST1BfRklMRV9OQU1FX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0RHJvcEZpbGVOYW1lKCk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gbW9kZWxWYWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBtb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hR2VuZXJhdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb25CYXNpY0FkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxMzM3NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb25CYXNpY0FkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eUxpc3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLkRkbEdlbmVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uT3V0cHV0TW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgT3V0cHV0TW9kZSBtb2RlbCBvYmplY3QgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24gYWRhcHRlcgotICogd2hlbiB0aGUgUGVyc2lzdGVuY2VVbml0IGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgU2NoZW1hR2VuZXJhdGlvbiBzY2hlbWFHZW5lcmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgb3V0cHV0TW9kZUtleSA9IFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGRsR2VuVHlwZUtleSA9IFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3V0cHV0TW9kZSBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFID0gT3V0cHV0TW9kZS5zcWxfc2NyaXB0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3V0cHV0TW9kZSBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFXzIgPSBPdXRwdXRNb2RlLmRhdGFiYXNlOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGRsR2VuZXJhdGlvblR5cGUgRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFID0gRGRsR2VuZXJhdGlvblR5cGUuZHJvcF9hbmRfY3JlYXRlX3RhYmxlczsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERkbEdlbmVyYXRpb25UeXBlIERETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRV8yID0gRGRsR2VuZXJhdGlvblR5cGUubm9uZTsKLQotCXB1YmxpYyBTY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJCi0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbiA9IHRoaXMucGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5nZXRTY2hlbWFHZW5lcmF0aW9uKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTY2hlbWFHZW5lcmF0aW9uLkRETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4gQ2Fubm90IHVzZQotCSAqIFByb3BlcnR5IEhvbGRlciB0byBpbml0aWFsaXplIGJlY2F1c2UgaXQgaXMgbm90IGNyZWF0ZWQgeWV0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSA2OwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDI7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOwotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoInByb3BlcnR5LjAiLCAidmFsdWUuMCIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChvdXRwdXRNb2RlS2V5LCB0aGlzLmdldEVjbGlwc2VMaW5rU3RyaW5nVmFsdWVPZihPVVRQVVRfTU9ERV9URVNUX1ZBTFVFKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KCJwcm9wZXJ0eS4yIiwgInZhbHVlLjIiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoInByb3BlcnR5LjMiLCAidmFsdWUuMyIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dCgicHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KGRkbEdlblR5cGVLZXksIHRoaXMuZ2V0RWNsaXBzZUxpbmtTdHJpbmdWYWx1ZU9mKERETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSkpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoqICoqKioqKiB0ZXN0IG1ldGhvZHMgKioqKioqKiAqLwotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQcm9wZXJ0eT4gcHJvcGVydGllc0FkYXB0ZXIgPSAKLQkJCShMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFByb3BlcnR5PikgdGhpcy5idWlsZFByb3BlcnRpZXNBZGFwdGVyKHRoaXMuc3ViamVjdEhvbGRlcik7Ci0JCWFzc2VydEZhbHNlKHByb3BlcnRpZXNBZGFwdGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJR2VuZXJpY1Byb3BlcnR5IG91dHB1dE1vZGVQcm9wZXJ0eSA9IChHZW5lcmljUHJvcGVydHkpIHRoaXMucGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkob3V0cHV0TW9kZUtleSk7Ci0JCUdlbmVyaWNQcm9wZXJ0eSBkZGxHZW5UeXBlUHJvcGVydHkgPSAoR2VuZXJpY1Byb3BlcnR5KSB0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGRkbEdlblR5cGVLZXkpOwotCQlhc3NlcnRUcnVlKG91dHB1dE1vZGVQcm9wZXJ0eS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSkpOwotCQkKLQkJTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIgPSAKLQkJCW5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UHJvcGVydHk+KHByb3BlcnRpZXNBZGFwdGVyLCBQcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSwgUHJvcGVydHkuTkFNRV9QUk9QRVJUWSk7Ci0JCWFzc2VydEZhbHNlKHByb3BlcnRpZXNBZGFwdGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShvdXRwdXRNb2RlUHJvcGVydHkuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHkuVkFMVUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShkZGxHZW5UeXBlUHJvcGVydHkuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHkuVkFMVUVfUFJPUEVSVFkpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5zY2hlbWFHZW5lcmF0aW9uLCBTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5zY2hlbWFHZW5lcmF0aW9uLCBTY2hlbWFHZW5lcmF0aW9uLkRETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHByb3BlcnR5TGlzdEFkYXB0ZXIpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0UHJvcGVydHlMaXN0TGlzdGVuZXIgcHJvcGVydHlMaXN0TGlzdGVuZXIgPSAKLQkJCW5ldyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eUxpc3RMaXN0ZW5lcih0aGlzLnNjaGVtYUdlbmVyYXRpb24pOwotCQlwcm9wZXJ0eUxpc3RBZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgcHJvcGVydHlMaXN0TGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHByb3BlcnRpZXNBZGFwdGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShvdXRwdXRNb2RlUHJvcGVydHkuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHkuVkFMVUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShkZGxHZW5UeXBlUHJvcGVydHkuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHkuVkFMVUVfUFJPUEVSVFkpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMocHJvcGVydHlMaXN0QWRhcHRlcik7Ci0JCQotCQlwcm9wZXJ0eUxpc3RBZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgcHJvcGVydHlMaXN0TGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShwcm9wZXJ0aWVzQWRhcHRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUob3V0cHV0TW9kZVByb3BlcnR5Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5LlZBTFVFX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUoZGRsR2VuVHlwZVByb3BlcnR5Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5LlZBTFVFX1BST1BFUlRZKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMocHJvcGVydHlMaXN0QWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBPdXRwdXRNb2RlIHByb3BlcnR5IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uIGFkYXB0ZXIKLQkgKiB3aGVuIHRoZSBQVSBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RPdXRwdXRNb2RlVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RWYWx1ZU1vZGVsPFByb3BlcnR5PiBwcm9wZXJ0aWVzQWRhcHRlciA9IHRoaXMuYnVpbGRQcm9wZXJ0aWVzQWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIpOwotCQlMaXN0VmFsdWVNb2RlbDxQcm9wZXJ0eT4gcHJvcGVydHlMaXN0QWRhcHRlciA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UHJvcGVydHk+KHByb3BlcnRpZXNBZGFwdGVyLCBQcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSk7Ci0JCVBlcnNpc3RlbmNlVW5pdFByb3BlcnR5TGlzdExpc3RlbmVyIHByb3BlcnR5TGlzdExpc3RlbmVyID0gKChFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb24pIHRoaXMuc2NoZW1hR2VuZXJhdGlvbikucHJvcGVydHlMaXN0TGlzdGVuZXIoKTsKLQkJcHJvcGVydHlMaXN0QWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHByb3BlcnR5TGlzdExpc3RlbmVyKTsKLQkJCi0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHByb3BlcnR5TGlzdEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNjaGVtYUdlbmVyYXRpb24sIFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpOwotCQkKLQkJLy8gQmFzaWMKLQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJvcGVydGllc1RvdGFsLCBwcm9wZXJ0eUxpc3RBZGFwdGVyLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2NoZW1hR2VuZXJhdGlvbi5pdGVtSXNQcm9wZXJ0eSh0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KG91dHB1dE1vZGVLZXkpKSk7Ci0JCWFzc2VydEVxdWFscyhPVVRQVVRfTU9ERV9URVNUX1ZBTFVFLCB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0T3V0cHV0TW9kZSgpKTsKLQkJCi0JCS8vIFJlcGxhY2UKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQob3V0cHV0TW9kZUtleSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yKTsKLQkJdGhpcy52ZXJpZnlQdXRFdmVudChTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZLCBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFXzIsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOwotCQkKLQkJLy8gUmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQktLXRoaXMucHJvcGVydGllc1RvdGFsOwotCQktLXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShvdXRwdXRNb2RlS2V5KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wZXJzaXN0ZW5jZVVuaXQoKS5jb250YWluc1Byb3BlcnR5KG91dHB1dE1vZGVLZXkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJvcGVydGllc1RvdGFsLCBwcm9wZXJ0eUxpc3RBZGFwdGVyLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vZGVsUHJvcGVydGllc1NpemUsIHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsIC0gMSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCi0JCS8vIEFkZCBvcmlnaW5hbCBPdXRwdXRNb2RlCi0JCSsrdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCSsrdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFB1dChvdXRwdXRNb2RlS2V5LCBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlQdXRFdmVudChTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZLCBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFLCB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0T3V0cHV0TW9kZSgpKTsKLQkJCi0JCS8vIFJlcGxhY2UgYWdhaW4KLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQob3V0cHV0TW9kZUtleSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yKTsKLQkJdGhpcy52ZXJpZnlQdXRFdmVudChTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZLCBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFXzIsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOwotCQkKLQkJLy8gUmVwbGFjZSBieSBzZXR0aW5nIG1vZGVsIG9iamVjdAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldE91dHB1dE1vZGUoT1VUUFVUX01PREVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5UHV0RXZlbnQoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRSwgdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldE91dHB1dE1vZGUoKSk7Ci0JfQotCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIG1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFHZW5lcmF0aW9uOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UHJvcGVydHk+IGJ1aWxkUHJvcGVydGllc0FkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgUHJvcGVydHk+KHN1YmplY3RIb2xkZXIsIFBlcnNpc3RlbmNlVW5pdC5QUk9QRVJUSUVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxQcm9wZXJ0eT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnByb3BlcnRpZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucHJvcGVydGllc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI4Y2ViMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLkRkbEdlbmVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuc2NoZW1hLmdlbmVyYXRpb24uT3V0cHV0TW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFNjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMKLSAqIAotICogVGVzdHMgdGhlIFByb3BlcnR5VmFsdWVNb2RlbCBvZiBTY2hlbWFHZW5lcmF0aW9uIG1vZGVsIGFuZCB0aGUgdXBkYXRlIG9mIHRoZQotICogUGVyc2lzdGVuY2VVbml0LgotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBTY2hlbWFHZW5lcmF0aW9uIHNjaGVtYUdlbjsKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTY2hlbWFHZW5lcmF0aW9uPiBzY2hlbWFHZW5Ib2xkZXI7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPERkbEdlbmVyYXRpb25UeXBlPiBkZGxHZW5lcmF0aW9uVHlwZUhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgZGRsR2VuZXJhdGlvblR5cGVFdmVudDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T3V0cHV0TW9kZT4gb3V0cHV0TW9kZUhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgb3V0cHV0TW9kZUV2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZGxHZW5lcmF0aW9uVHlwZSBERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUgPSBEZGxHZW5lcmF0aW9uVHlwZS5kcm9wX2FuZF9jcmVhdGVfdGFibGVzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3V0cHV0TW9kZSBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFID0gT3V0cHV0TW9kZS5zcWxfc2NyaXB0OwotCi0JcHVibGljIFNjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zY2hlbWFHZW4gPSB0aGlzLnBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuZ2V0U2NoZW1hR2VuZXJhdGlvbigpOyAvLyBTdWJqZWN0Ci0JCXRoaXMuc2NoZW1hR2VuSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTY2hlbWFHZW5lcmF0aW9uPih0aGlzLnNjaGVtYUdlbik7Ci0JCQotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlSG9sZGVyID0gdGhpcy5idWlsZERkbEdlbmVyYXRpb25UeXBlQUEodGhpcy5zY2hlbWFHZW5Ib2xkZXIpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGRkbEdlbmVyYXRpb25UeXBlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRGRsR2VuZXJhdGlvblR5cGVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBkZGxHZW5lcmF0aW9uVHlwZUxpc3RlbmVyKTsKLQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZUV2ZW50ID0gbnVsbDsKLQkJCi0JCXRoaXMub3V0cHV0TW9kZUhvbGRlciA9IHRoaXMuYnVpbGRPdXRwdXRNb2RlQUEodGhpcy5zY2hlbWFHZW5Ib2xkZXIpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG91dHB1dE1vZGVMaXN0ZW5lciA9IHRoaXMuYnVpbGRPdXRwdXRNb2RlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5vdXRwdXRNb2RlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBvdXRwdXRNb2RlTGlzdGVuZXIpOwotCQl0aGlzLm91dHB1dE1vZGVFdmVudCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIENhbm5vdCB1c2UKLQkgKiBQcm9wZXJ0eSBIb2xkZXIgdG8gaW5pdGlhbGl6ZSBiZWNhdXNlIGl0IGlzIG5vdCBjcmVhdGVkIHlldAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0UHV0KAotCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFLAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRQdXQoCi0JCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFLAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBtb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hR2VuOwotCX0KLQotCS8qKiAqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKiAqLwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGRsR2VuZXJhdGlvblR5cGU+IGJ1aWxkRGRsR2VuZXJhdGlvblR5cGVBQShQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBEZGxHZW5lcmF0aW9uVHlwZT4oc3ViamVjdEhvbGRlciwgU2NoZW1hR2VuZXJhdGlvbi5ERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEZGxHZW5lcmF0aW9uVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERkbEdlbmVyYXRpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKERkbEdlbmVyYXRpb25UeXBlIGVudW1WYWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXREZGxHZW5lcmF0aW9uVHlwZShlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERkbEdlbmVyYXRpb25UeXBlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZGRsR2VuZXJhdGlvblR5cGVFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqICoqKioqKiBPdXRwdXRNb2RlICoqKioqKiogKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE91dHB1dE1vZGU+IGJ1aWxkT3V0cHV0TW9kZUFBKFByb3BlcnR5VmFsdWVNb2RlbDxTY2hlbWFHZW5lcmF0aW9uPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIE91dHB1dE1vZGU+KHN1YmplY3RIb2xkZXIsIFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE91dHB1dE1vZGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRPdXRwdXRNb2RlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE91dHB1dE1vZGUgZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE91dHB1dE1vZGUoZW51bVZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRPdXRwdXRNb2RlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMub3V0cHV0TW9kZUV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCS8qKiAqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKiAqLwotCQl0aGlzLnZlcmlmeURkbEdlbmVyYXRpb25UeXBlQUFWYWx1ZShERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQlTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRERMX0dFTkVSQVRJT05fVFlQRSwKLQkJCXRoaXMuc2NoZW1hR2VuLmdldERlZmF1bHREZGxHZW5lcmF0aW9uVHlwZSgpKTsKLQkJLyoqICoqKioqKiBPdXRwdXRNb2RlICoqKioqKiogKi8KLQkJdGhpcy52ZXJpZnlPdXRwdXRNb2RlQUFWYWx1ZShPVVRQVVRfTU9ERV9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJU2NoZW1hR2VuZXJhdGlvbi5ERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX09VVFBVVF9NT0RFLAotCQkJdGhpcy5zY2hlbWFHZW4uZ2V0RGVmYXVsdE91dHB1dE1vZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8qKiAqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKiAqLwotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlRXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmRkbEdlbmVyYXRpb25UeXBlSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlEZGxHZW5lcmF0aW9uVHlwZSBuZXdEZGxHZW5lcmF0aW9uVHlwZSA9IERkbEdlbmVyYXRpb25UeXBlLmNyZWF0ZV90YWJsZXM7Ci0JCS8vIE1vZGlmeSB0aGUgcGVyc2lzdGVuY2VVbml0IGRpcmVjdGx5Ci0JCXRoaXMuc3ViamVjdC5wdXRQcm9wZXJ0eSgKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSwKLQkJCXRoaXMuZ2V0RWNsaXBzZUxpbmtTdHJpbmdWYWx1ZU9mKG5ld0RkbEdlbmVyYXRpb25UeXBlKSwKLQkJCWZhbHNlKTsKLQkJdGhpcy52ZXJpZnlEZGxHZW5lcmF0aW9uVHlwZUFBVmFsdWUobmV3RGRsR2VuZXJhdGlvblR5cGUpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZGRsR2VuZXJhdGlvblR5cGVFdmVudCk7Ci0JCQotCQkvKiogKioqKioqIE91dHB1dE1vZGUgKioqKioqKiAqLwotCQl0aGlzLm91dHB1dE1vZGVFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMub3V0cHV0TW9kZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJT3V0cHV0TW9kZSBuZXdPdXRwdXRNb2RlID0gT3V0cHV0TW9kZS5kYXRhYmFzZTsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5vdXRwdXRNb2RlSG9sZGVyLnNldFZhbHVlKG5ld091dHB1dE1vZGUpOwotCQl0aGlzLnZlcmlmeU91dHB1dE1vZGVBQVZhbHVlKG5ld091dHB1dE1vZGUpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMub3V0cHV0TW9kZUV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbFZhbHVlKCkgewotCQkvKiogKioqKioqIERkbEdlbmVyYXRpb25UeXBlICoqKioqKiogKi8KLQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZUV2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcGVyc2lzdGVuY2VVbml0IGRpcmVjdGx5Ci0JCXRoaXMuc3ViamVjdC5wdXRQcm9wZXJ0eShTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUsIG51bGwsIGZhbHNlKTsKLQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlEZGxHZW5lcmF0aW9uVHlwZUFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5kZGxHZW5lcmF0aW9uVHlwZUV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCWJvb2xlYW4gY29udGFpbnNEZGxHZW5lcmF0aW9uVHlwZVByb3BlcnR5ID0gCi0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmNvbnRhaW5zUHJvcGVydHkoU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFKTsKLQkJYXNzZXJ0RmFsc2UoY29udGFpbnNEZGxHZW5lcmF0aW9uVHlwZVByb3BlcnR5KTsKLQkJCi0JCS8qKiAqKioqKiogT3V0cHV0TW9kZSAqKioqKioqICovCi0JCXRoaXMub3V0cHV0TW9kZUV2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMub3V0cHV0TW9kZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlPdXRwdXRNb2RlQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLm91dHB1dE1vZGVFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQlib29sZWFuIGNvbnRhaW5zT3V0cHV0TW9kZVByb3BlcnR5ID0gCi0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCgpLmNvbnRhaW5zUHJvcGVydHkoU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRhaW5zT3V0cHV0TW9kZVByb3BlcnR5KTsKLQl9Ci0KLQkvKiogKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKiAqLwotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlEZGxHZW5lcmF0aW9uVHlwZUFBVmFsdWUoRGRsR2VuZXJhdGlvblR5cGUgdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwKLQkJCXRoaXMuc2NoZW1hR2VuLmdldERkbEdlbmVyYXRpb25UeXBlKCksCi0JCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlSG9sZGVyLAotCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5T3V0cHV0TW9kZUFBVmFsdWUoT3V0cHV0TW9kZSB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLAotCQkJdGhpcy5zY2hlbWFHZW4uZ2V0T3V0cHV0TW9kZSgpLAotCQkJdGhpcy5vdXRwdXRNb2RlSG9sZGVyLAotCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8xL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYWRjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazFfMS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9BTk5PVEFUSU9OU19QQUNLQUdFX05BTUUgPSAiamF2YXgucGVyc2lzdGVuY2UiOyAvLyROT04tTkxTLTEkCisKKwlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSB7CisJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gc3VwZXIuYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKTsKKwkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk1fSUQsIEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlci5JRCk7CisJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9PUk1fWE1MLCBCb29sZWFuLlRSVUUpOworCQlyZXR1cm4gZGF0YU1vZGVsOworCX0JCit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsxXzFKcGFQcm9qZWN0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8xL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazFfMUpwYVByb2plY3RUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OGFhMjYKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsxXzFKcGFQcm9qZWN0VGVzdHMuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsxXzEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuSnB0Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMUpwYVByb2plY3RUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMV8xQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwkKKwlwdWJsaWMgRWNsaXBzZUxpbmsxXzFKcGFQcm9qZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7CisJCWFzc2VydEVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7CQorCQkKKwkJLy9kZWxldGUgdGhlIG9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpCisJCXJlc291cmNlLmRlbGV0ZShudWxsKTsKKwkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7CisJCQorCQkvL2FkZCB0aGUgb3JtLnhtbCBmaWxlIHdpdGggZWNsaXBzZWxpbmsgMS4xIG9ybSBjb250ZW50IHR5cGUKKwkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmsxXzFDb250ZW50VHlwZSgpOworCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKKwkJYXNzZXJ0RXF1YWxzKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFLCByZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOworCQkKKwkJCisJCS8vZGVsZXRlIHRoZSBvcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKQorCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7CisJCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7CisJCWFzc2VydE51bGwocmVzb3VyY2UpOworCQkKKwkJCisJCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgd2l0aCBlY2xpcHNlbGluayBvcm0gY29udGVudCB0eXBlCisJCWNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlV2l0aEVjbGlwc2VMaW5rQ29udGVudFR5cGUoKTsKKwkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7CisJCWFzc2VydEVxdWFscyhKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKKwkJCisJCQorCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKKwkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOworCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOworCQlhc3NlcnROdWxsKHJlc291cmNlKTsKKwkJCisJCQorCQkvL2FkZCB0aGUgb3JtLnhtbCBmaWxlIHRoaXMgdGltZSB3aXRoIG9ybSBjb250ZW50IHR5cGUKKwkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKTsKKwkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7CisJCWFzc2VydEVxdWFscyhKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7CisJCWFzc2VydE51bGwocmVzb3VyY2UpOworCQkKKwkJLy9hZGQgdGhlIGVjbGlwc2VsaW5rLW9ybS54bWwgMS4xIGZpbGUKKwkJY3JlYXRlRGVmYXVsdEVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZSgpOworCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOworCQlhc3NlcnRFcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7CisJCQorCQkKKwkJLy9kZWxldGUgdGhlIGVjbGlwc2VsaW5rLW9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpCisJCXJlc291cmNlLmRlbGV0ZShudWxsKTsKKwkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOworCQlhc3NlcnROdWxsKHJlc291cmNlKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlEYXRhTW9kZWwgY29uZmlnID0KKwkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKKwkJY29uZmlnLnNldFByb3BlcnR5KE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7CisJCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlV2l0aEVjbGlwc2VMaW5rQ29udGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSURhdGFNb2RlbCBjb25maWcgPQorCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CisJCWNvbmZpZy5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXROYW1lKCkpOworCQljb25maWcuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX1BBVEgsIEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7CisJCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlV2l0aEVjbGlwc2VMaW5rMV8xQ29udGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlRWNsaXBzZUxpbmsxXzFPcm1YbWxGaWxlKEpwdENvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX0ZJTEVfUEFUSCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmsxXzFPcm1YbWxGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZUVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZShKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX0ZJTEVfUEFUSCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVFY2xpcHNlTGluazFfMU9ybVhtbEZpbGUoU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSURhdGFNb2RlbCBjb25maWcgPQorCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CisJCWNvbmZpZy5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXROYW1lKCkpOworCQljb25maWcuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5WRVJTSU9OLCBFY2xpcHNlTGluazFfMS5TQ0hFTUFfVkVSU0lPTik7CisJCWNvbmZpZy5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfUEFUSCwgZmlsZVBhdGgpOworCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfRklMRV9QQVRIKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7CisJCQorCQkvL2FkZCB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCAxLjEgZmlsZQorCQljcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmsxXzFPcm1YbWxGaWxlKCk7CisJCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShKcHRFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX0ZJTEVfUEFUSCk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOworCQlhc3NlcnRFcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7CisJCQorCQkvL2RlbGV0ZSB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpCisJCXJlc291cmNlLmRlbGV0ZShudWxsKTsKKwkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfRklMRV9QQVRIKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXREaWZmZXJlbnRseU5hbWVkTWFwcGluZ0ZpbGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoIk1FVEEtSU5GL29ybTIueG1sIik7CisJCWFzc2VydE51bGwocmVzb3VyY2UpOworCisJCS8vY3JlYXRlIHRoZSBvcm0yLnhtbCBmaWxlCisJCWNyZWF0ZUVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZSgiTUVUQS1JTkYvb3JtMi54bWwiKTsKKwkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKCJNRVRBLUlORi9vcm0yLnhtbCIpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKKwkJYXNzZXJ0RXF1YWxzKEpwdEVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFLCByZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybTIueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKKwkJCisJCS8vZGVsZXRlIHRoZSBvcm0yLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpCisJCXJlc291cmNlLmRlbGV0ZShudWxsKTsKKwkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKCJNRVRBLUlORi9vcm0yLnhtbCIpOworCQlhc3NlcnROdWxsKHJlc291cmNlKTsKKwkJCisJCS8vYWRkIHRoZSBvcm0yLnhtbCBmaWxlIGJhY2sKKwkJY3JlYXRlRWNsaXBzZUxpbmsxXzFPcm1YbWxGaWxlKCJNRVRBLUlORi9vcm0yLnhtbCIpOworCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoIk1FVEEtSU5GL29ybTIueG1sIik7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOworCQlhc3NlcnRFcXVhbHMoSnB0RWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtMi54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8xL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcHRFY2xpcHNlTGluazFfMUNvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEVjbGlwc2VMaW5rMV8xQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1NmE0YQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8xL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcHRFY2xpcHNlTGluazFfMUNvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8xLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazFfMS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtLkpwdEVjbGlwc2VMaW5rMV8xQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzOworCitwdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmsxXzFDb3JlQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQoreworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGluazFfMUNvcmVDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsxXzFKcGFQcm9qZWN0VGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rMV8xQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJcHJpdmF0ZSBKcHRFY2xpcHNlTGluazFfMUNvcmVDb250ZXh0TW9kZWxUZXN0cygpIHsKKwkJc3VwZXIoKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDYyNTNhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8xLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmsxXzE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8xLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGluazFfMU9ybUNvbnRleHRNb2RlbFRlc3RDYXNlCisJZXh0ZW5kcyBFY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIGVjbGlwc2VMaW5rMV8xT3JtWG1sUmVzb3VyY2U7CisJCisJCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rMV8xT3JtQ29udGV4dE1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXRoaXMuZWNsaXBzZUxpbmsxXzFPcm1YbWxSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOworCX0KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKKwkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBzdXBlci5idWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpOworCQkvLyBkb24ndCBjcmVhdGUgZGVmYXVsdCBvcm0ueG1sIC0gaW5zdGVhZCBidWlsZCBlY2xpcHNlbGluay1vcm0ueG1sCisJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9PUk1fWE1MLCBCb29sZWFuLkZBTFNFKTsKKwkJcmV0dXJuIGRhdGFNb2RlbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkLCBJRGF0YU1vZGVsIGpwYUNvbmZpZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRlc3RKcGFQcm9qZWN0IHRlc3RKcGFQcm9qZWN0ID0gc3VwZXIuYnVpbGRKcGFQcm9qZWN0KHByb2plY3ROYW1lLCBhdXRvQnVpbGQsIGpwYUNvbmZpZyk7CisJCQorCQlFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbiBvcGVyYXRpb24gPSAKKwkJCW5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbihidWlsZEVjbGlwc2VMaW5rT3JtQ29uZmlnKHRlc3RKcGFQcm9qZWN0KSk7CisJCW9wZXJhdGlvbi5leGVjdXRlKG51bGwsIG51bGwpOworCQkKKwkJcmV0dXJuIHRlc3RKcGFQcm9qZWN0OworCX0KKwkKKwlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEVjbGlwc2VMaW5rT3JtQ29uZmlnKFRlc3RKcGFQcm9qZWN0IHRlc3RKcGFQcm9qZWN0KSB7CisJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gCisJCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsJCQorCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHRlc3RKcGFQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOworCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5WRVJTSU9OLCBFY2xpcHNlTGluazFfMS5TQ0hFTUFfVkVSU0lPTik7CisJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19QRVJTSVNURU5DRV9VTklULCBCb29sZWFuLlRSVUUpOworCQlyZXR1cm4gZGF0YU1vZGVsOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmVjbGlwc2VMaW5rMV8xT3JtWG1sUmVzb3VyY2UgPSBudWxsOworCQlzdXBlci50ZWFyRG93bigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZ2V0T3JtWG1sUmVzb3VyY2UoKSB7CisJCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rMV8xT3JtWG1sUmVzb3VyY2U7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBYbWxFbnRpdHlNYXBwaW5ncyBnZXRYbWxFbnRpdHlNYXBwaW5ncygpIHsKKwkJcmV0dXJuIChYbWxFbnRpdHlNYXBwaW5ncykgc3VwZXIuZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7CisJCXJldHVybiAoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgc3VwZXIuZ2V0RW50aXR5TWFwcGluZ3MoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3OWE5ZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8xL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YQpAQCAtMCwwICsxLDQzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8xLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LklkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMgCisJZXh0ZW5kcyBFY2xpcHNlTGluazFfMU9ybUNvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHVibGljIEVjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKKwkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBzdXBlci5idWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpOworCQkvLyBjcmVhdGUgYm90aCBvcm0ueG1sIGFuZCBlY2xpcHNlbGluay1vcm0ueG1sCisJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9PUk1fWE1MLCBCb29sZWFuLlRSVUUpOworCQlyZXR1cm4gZGF0YU1vZGVsOworCX0JCisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOwkJCQorCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJASWQiKTsKKwkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkZPT1wiKSIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmdQcm9wZXJ0eUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQ09MVU1OKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpOworCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQkKKwkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkTWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZU51bGxBdHRyaWJ1dGVNYXBwaW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJLy90YWtlIGEgdmlydHVhbCBtYXBwaW5nIHdpdGggYSBtYXBwaW5nIHR5cGUgYW5kIG1ha2UgaXQgc3BlY2lmaWVkCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBHZW5lcmljT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRUcnVlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpOworCQkKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpOworCQkKKwkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0VHJ1ZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nKTsKKwkJCisJCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1ha2VWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOworCQlvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKS5tYWtlU3BlY2lmaWVkKCk7CisKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJCisJCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVZpcnR1YWwoKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVZpcnR1YWwoKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwkJCisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TWFrZVZpcnR1YWxOb1VuZGVybHlpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkubWFrZVNwZWNpZmllZCgpOworCQlvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKS5tYWtlU3BlY2lmaWVkKCk7CisKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLnNldE5hbWUoIm5vSmF2YUF0dHJpYnV0ZSIpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7CisJCQorCQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKKwkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlVmlydHVhbCgpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQkKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCAoKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ1R5cGVXaGVuTWV0YWRhdGFDb21wbGV0ZTIoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCQkKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCQkKKwkJLy92aXJ0dWFsIG9ybSBhdHRyaWJ1dGUsIGFjY2VzcyB0eXBlIG1hdGNoZXMgamF2YSA6IEZJRUxELCBuYW1lIG1hdGNoZXMgamF2YQorCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCWFzc2VydFRydWUoamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5pc0ZpZWxkKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5wZXJzaXN0YWJsZUZpZWxkcygpLm5leHQoKSwgamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7CisJCQorCQkKKwkJLy9zcGVjaWZpZWQgb3JtIGF0dHJpYnV0ZSwgYWNjZXNzIHR5cGUgbWF0Y2hlcyBqYXZhIDogRklFTEQsIG5hbWUgbWF0Y2hlcyBqYXZhCisJCS8vamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgc2hvdWxkIGJlID09IHRvIGphdmEgY29udGV4dCBtb2RlbCBvYmplY3QKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkKKwkJCisJCS8vdmlydHVhbCBvcm0gYXR0cmlidXRlLCBqYXZhIGFjY2VzcyB0eXBlIEZJRUxELCBvcm0gYWNjZXNzIHR5cGUgUFJPUEVSVFksIG5hbWUgbWF0Y2hlcyBqYXZhCisJCS8vdmVyaWZ5IHRoZSBwcm9wZXJ0eSBqYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgYXR0cmlidXRlIGlzIHVzZWQgaW4gb3JtLgorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VWaXJ0dWFsKCk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7CisJCWFzc2VydE5vdFNhbWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCWphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7CisJCWFzc2VydFRydWUoamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1Byb3BlcnR5KCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5wZXJzaXN0YWJsZVByb3BlcnRpZXMoKS5uZXh0KCksIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOworCQkKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsvL2RlZmF1bHQgYWNjZXNzIHdpbGwgYmUgZmllbGQKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiaWQyIik7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuc2V0TmFtZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiaWQiKTsKKwkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOworCisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZU1peGVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCQorCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOworCQkKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzUHJvcGVydHkoKSk7CisJCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpKTsKKwkJCisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOworCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0ZpZWxkKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQkKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0ZpZWxkKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzRmllbGQoKSk7CisJCQorCQkKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5tYWtlU3BlY2lmaWVkKCk7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0ZpZWxkKCkpOworCQkKKwkJCisJCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc1Byb3BlcnR5SW5KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmdQcm9wZXJ0eUFjY2VzcygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCQorCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzUHJvcGVydHkoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNQcm9wZXJ0eSgpKTsKKwkJCisJCQorCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKKwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOworCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1Byb3BlcnR5KCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzUHJvcGVydHkoKSk7CisJCQorCQkKKwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisJCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNQcm9wZXJ0eSgpKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTJlNzFmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YQpAQCAtMCwwICsxLDMwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMV8xLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGluazFfMU9ybUNvbnRleHRNb2RlbFRlc3RDYXNlCit7CisJcHVibGljIEVjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudFR5cGVUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSB7CisJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gc3VwZXIuYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKTsKKwkJLy8gY3JlYXRlIGJvdGggb3JtLnhtbCBhbmQgZWNsaXBzZWxpbmstb3JtLnhtbAorCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCwgQm9vbGVhbi5UUlVFKTsKKwkJcmV0dXJuIGRhdGFNb2RlbDsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkNPTFVNTik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBJZCIpOworCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7CisJCQl9CisJCX0pOworCX0KKy8vCQorLy8JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFjY2Vzc1R5cGVFbnVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycyhKUEFfQU5OT1RBVElPTlNfUEFDS0FHRV9OQU1FLCAiQWNjZXNzVHlwZSIsICJGSUVMRCwgUFJPUEVSVFk7Iik7CQorLy8JfQorLy8JCisvLwlwcml2YXRlIHZvaWQgY3JlYXRlQWNjZXNzQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworLy8JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoSlBBX0FOTk9UQVRJT05TX1BBQ0tBR0VfTkFNRSwgIkFjY2VzcyIsICJBY2Nlc3NUeXBlIHZhbHVlKCk7Iik7CisvLwkJY3JlYXRlQWNjZXNzVHlwZUVudW0oKTsKKy8vCX0KKy8vCQorLy8JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZFByb3BlcnR5U3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJY3JlYXRlQWNjZXNzQW5ub3RhdGlvbigpOworLy8JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKy8vCQkJQE92ZXJyaWRlCisvLwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisvLwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEpQQS5JRCwgSlBBLkFDQ0VTUywgSlBBLkFDQ0VTU19UWVBFKTsKKy8vCQkJfQorLy8JCQlAT3ZlcnJpZGUKKy8vCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisvLwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKy8vCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKSIpOworLy8JCQl9CisvLwkKKy8vCQkJQE92ZXJyaWRlCisvLwkJCXB1YmxpYyB2b2lkIGFwcGVuZE5hbWVGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisvLwkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpOworLy8JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpIik7CisvLwkJCX0KKy8vCQkJCisvLwkJCUBPdmVycmlkZQorLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisvLwkJCQlzYi5hcHBlbmQoIkBJZCIpOworLy8JCQl9CisvLwkJfSk7CisvLwl9CisvLwkKKy8vCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5RmllbGRTcGVjaWZpZWRQcm9wZXJ0eUFubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24geworLy8JCWNyZWF0ZUFjY2Vzc0Fubm90YXRpb24oKTsKKy8vCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisvLwkJCUBPdmVycmlkZQorLy8JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworLy8JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBKUEEuSUQsIEpQQS5BQ0NFU1MsIEpQQS5BQ0NFU1NfVFlQRSk7CisvLwkJCX0KKy8vCQkJQE92ZXJyaWRlCisvLwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworLy8JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisvLwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCkiKTsKKy8vCQkJfQorLy8JCQkKKy8vCQkJQE92ZXJyaWRlCisvLwkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKy8vCQkJCXNiLmFwcGVuZCgiQElkIik7CisvLwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKKy8vCQkJfQorLy8JCX0pOworLy8JfQorLy8KKy8vCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5UHJvcGVydHlTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQljcmVhdGVBY2Nlc3NBbm5vdGF0aW9uKCk7CisvLwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworLy8JCQlAT3ZlcnJpZGUKKy8vCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKy8vCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5BQ0NFU1MsIEpQQS5BQ0NFU1NfVFlQRSk7CisvLwkJCX0KKy8vCQkJQE92ZXJyaWRlCisvLwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworLy8JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisvLwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKKy8vCQkJfQorLy8JCX0pOworLy8JfQorCisJcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc1dpdGhKYXZhQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCQorCQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7CisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKwl9CisKKy8vVE9ETyBBY2Nlc3MgYW5ub3RhdGlvbiB0ZXN0CQorLy8JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc1dpdGhKYXZhQW5ub3RhdGlvbnNQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24geworLy8JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZFByb3BlcnR5U3BlY2lmaWVkKCk7CisvLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKy8vCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisvLwkJCisvLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKy8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKy8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKKy8vCQkKKy8vCQkKKy8vCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKy8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOworLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOworLy8JCQorLy8JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisvLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKy8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKKy8vCX0KKy8vCQorLy8JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkUHJvcGVydHlTcGVjaWZpZWQoKTsKKy8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworLy8JCQorLy8JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7CisvLwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOworLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworLy8JCQorLy8JCQorLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CisvLwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKy8vCQkKKy8vCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOworLy8JCQorLy8JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisvLwkJdmlydHVhbEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOworLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CisvLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisvLwkJCisvLwkJCisvLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworLy8JCQorLy8JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisvLwl9CisvLwkKKy8vCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlTcGVjaWZpZWQoKTsKKy8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworLy8JCQorLy8JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7CisvLwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOworLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworLy8JCQorLy8JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisvLwkJCisvLwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKy8vCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7CisvLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKy8vCQkKKy8vCQkKKy8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOworLy8JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisvLwkJCisvLwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKy8vCQkKKy8vCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKKy8vCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7CisvLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKy8vCQkKKy8vCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOworLy8JfQorLy8JCisvLwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZXMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLwkJY3JlYXRlVGVzdEVudGl0eUZpZWxkU3BlY2lmaWVkUHJvcGVydHlBbm5vdGF0ZWQoKTsKKy8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworLy8JCQorLy8JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7CisvLwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOworLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOworLy8JCQorLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CisvLwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKy8vCisvLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKy8vCisvLwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKy8vCQkKKy8vCQkKKy8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLm1ha2VTcGVjaWZpZWQoKTsKKy8vCQkKKy8vCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7CisvLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKy8vCQkKKy8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOworLy8JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7CisvLworLy8JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisvLwkJCisvLwkJCisvLwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKKy8vCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBzcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKKy8vCQkKKy8vCQkKKy8vCQlvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKS5tYWtlU3BlY2lmaWVkKCk7CisvLwkJdmlydHVhbEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpOworLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CisvLwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKKy8vCisvLwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKy8vCX0KKy8vCisvLwlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworLy8JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eVNwZWNpZmllZCgpOworLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisvLwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworLy8JCQorLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOworLy8JCQorLy8JCWphdmFQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7CisvLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7CisvLwkJCisvLwkJamF2YVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKKy8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKKy8vCisvLwkJCisvLwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKy8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKKy8vCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8xL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8xL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmVmYjZhCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsxXzEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazFfMS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMKKwlleHRlbmRzIEVjbGlwc2VMaW5rMV8xT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwdWJsaWMgRWNsaXBzZUxpbmsxXzFPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5UUkFOU0lFTlQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQFRyYW5zaWVudCIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKKwkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CisJCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CisJCQorCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOworCisJCXBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKKwkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7CisJCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKS5nZXRLZXkoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0pwdEVjbGlwc2VMaW5rMV8xQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazFfMS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0pwdEVjbGlwc2VMaW5rMV8xQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzODg1MQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMV8xL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0RWNsaXBzZUxpbmsxXzFDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazFfMS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK3B1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGluazFfMUNvcmVPcm1Db250ZXh0TW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCit7CisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rMV8xQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7CisJCQorCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuY2xhc3MpOwkJCisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMuY2xhc3MpOwkKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMV8xT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmNsYXNzKTsJCisJCQorCQlyZXR1cm4gc3VpdGU7CisJfQorCQorCQorCXByaXZhdGUgSnB0RWNsaXBzZUxpbmsxXzFDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMoKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOTBhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXByb3RlY3RlZCBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKKwkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBzdXBlci5idWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpOworCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgSnB0Q29yZVBsdWdpbi5KUEFfRkFDRVRfVkVSU0lPTl8yXzApOworCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNX0lELCBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuSUQpOworCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCwgQm9vbGVhbi5UUlVFKTsKKwkJcmV0dXJuIGRhdGFNb2RlbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnB0RWNsaXBzZUxpbmsyXzBDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcHRFY2xpcHNlTGluazJfMENvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmU0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnB0RWNsaXBzZUxpbmsyXzBDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhLkpwdEVjbGlwc2VMaW5rMl8wSmF2YUNvbnRleHRNb2RlbFRlc3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtLkpwdEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5KcHRFY2xpcHNlTGluazJfMENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzOworCisvKioKKyAqICBKcHRFY2xpcHNlTGluazJfMENvcmVDb250ZXh0TW9kZWxUZXN0cworICovCitwdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmsyXzBDb3JlQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQoreworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGluazJfMENvcmVDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOworCisJCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmsyXzBDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGluazJfMEphdmFDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOworCisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwlwcml2YXRlIEpwdEVjbGlwc2VMaW5rMl8wQ29yZUNvbnRleHRNb2RlbFRlc3RzKCkgeworCQlzdXBlcigpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9Cit9CQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YUVudGl0eVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFFbnRpdHlUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTY0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFFbnRpdHlUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTU4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNhY2hlYWJsZTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFFbnRpdHlUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7CisJCisJCisJcHVibGljIEVjbGlwc2VMaW5rMl8wSmF2YUVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczI7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgICIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykiKTsKKwkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M0OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICAiKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKKwkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuSUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiTG9uZ1RpbWVDdXN0b21lciBleHRlbmRzIEN1c3RvbWVyICIpOworCQkJCXNiLmFwcGVuZCgie30iKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJMb25nVGltZUN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKworCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdHJlZXQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgWmlwQ29kZSB6aXBDb2RlOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiWmlwQ29kZSIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyB6aXA7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHBsdXNmb3VyOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiWmlwQ29kZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKworCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CisJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CisJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CisJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLlRSQU5TRk9STUFUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLlZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwkJCisJCQorCQlnZXRKYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKKwkJCisJCW92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCQkKKwkJCisJCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOworCQkKKwkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGdldEphdmFFbnRpdHkoKS5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlc1RhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQorCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOworCQkKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCWNsYXNzUmVmcy5uZXh0KCk7CisJCUphdmFFbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCW92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGFic3RyYWN0RW50aXR5LmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uc1RhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQorCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOworCQkKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCWNsYXNzUmVmcy5uZXh0KCk7CisJCUphdmFFbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCW92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gYWJzdHJhY3RFbnRpdHkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlc01hcHBlZFN1cGVyY2xhc3NJbk9ybVhtbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGdldEphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKwl9CisJCQorCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQkKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCisJCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAorCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisKKwkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAorCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCQorCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQkKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7CisJCWNsYXNzUmVmcy5uZXh0KCk7CisJCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKKwkJCisKKwkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJCisJCUJhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7CisJCQorCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCisJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOworCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7CisJCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKKwkJCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc0VudGl0eUhpZXJhY2h5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQkKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJY2xhc3NSZWZzLm5leHQoKTsKKwkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGphdmFFbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQkKKworCQlKYXZhRW50aXR5IHN1cGVyY2xhc3MgPSAoSmF2YUVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQkKKwkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKwkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKKwkJCisJCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKworCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CisKKwkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CisJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQkKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCisJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7CisJCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOworCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuYXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKKwkJYW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsJCisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQkKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKSk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CisJCQorCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQorCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7CisJCQorCQlJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQkKKwkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7CisKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQkKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFBdHRyaWJ1dGVPdmVycmlkZXMpKTsKKwkJCisJCQorCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMiwgMCk7CisJCUxpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisKKwkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisKKworCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCwgMSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCisJCWphdmFBdHRyaWJ1dGVPdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCX0KKy8vCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQorCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKKwkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7CisJCSgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOworCQkJCisJCUxpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQkKKwkJdHlwZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMCwgMSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQkKKwkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCisJCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQkKKwkJCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJCisJcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGdldEphdmFFbnRpdHkoKS5vdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkub3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOworCX0KKwkKKy8vCS8vVE9ETyBhZGQgYWxsIG1hcHBpbmcgdHlwZXMgdG8gdGhlIG1hcHBlZCBzdXBlcmNsYXNzIHRvIHRlc3Qgd2hpY2ggb25lcyBhcmUgb3ZlcnJpZGFibGUKKwlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKKwl9CisJCQorCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uc01hcHBlZFN1cGVyY2xhc3NJbk9ybVhtbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQkKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCisJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7CisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7CisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisKKwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKKwkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKKwkJdHlwZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7CisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQkKKwkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKKwkJY2xhc3NSZWZzLm5leHQoKTsKKwkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gamF2YUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJCisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQkKKworCQkvL01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCS8vQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MucGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7CisJCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7CisJCQorCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKworCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOworCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQkKKwkJCisJCQorLy8JCS8vVE9ETyBqb2luQ29sdW1ucyBmb3IgZGVmYXVsdCBhc3NvY2lhdGlvbiBvdmVycmlkZXMKKy8vLy8JSUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpLm5leHQoKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisvLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKKy8vLy8JCisvLy8vCisvLy8vCUlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoSU1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKy8vLy8JCisvLy8vCUlPbmVUb09uZU1hcHBpbmcgYWRkcmVzc01hcHBpbmcgPSAoSU9uZVRvT25lTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5wZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOworLy8vLwlJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gYWRkcmVzc01hcHBpbmcuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKKy8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKKy8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiQkFSIik7CisvLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBWiIpOworLy8vLwkKKy8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOworLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGUuQU5OT1RBVElPTl9OQU1FKSk7CisvLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXMuQU5OT1RBVElPTl9OQU1FKSk7CisvLy8vCisvLy8vCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKSk7CisvLy8vCWRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisvLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisvLy8vCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKCJCQVoiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKKy8vLy8KKy8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG51bGwpOworLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOworLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOworLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7CisvLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKKy8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKKy8vLy8KKy8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisvLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKKy8vLy8JCisvLy8vCWphdmFFbnRpdHkuYWRkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgwKS5zZXROYW1lKCJhZGRyZXNzIik7CisvLy8vCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKSk7CisKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCisJCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOworCisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKKwkJYW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsJCisJCWFzc2VydEVxdWFscyg1LCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQkKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQorCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQkJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkpOworCisJCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CisJCQorCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKKworCQlJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkJCisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCQorCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzKSk7CisJCQorCQkKKwkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMSwgMCk7CisJCUxpc3RJdGVyYXRvcjxBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisKKwkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOworCisKKwkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMCwgMSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKworCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkKKwkJKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7CisJCSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOworCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKKwkJCQorCQlMaXN0SXRlcmF0b3I8QXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQkKKwkJdHlwZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCXR5cGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQkKKwkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCQorCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCQorCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQkKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCQorCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCQorCQorCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXIoKTsKKwkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOworCQkKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkxvbmdUaW1lQ3VzdG9tZXIiKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOworCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOworCQlQZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsJCQorCQlQZXJzaXN0ZW50VHlwZSB6aXBDb2RlUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoNywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnN0cmVldCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLmNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdGF0ZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUuemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCQorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkxvbmdUaW1lQ3VzdG9tZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQorCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKKworCQkKKwkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7CisKKwkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKKwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7CisJCQorCQkvL3NldCBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUgb24gQWRkcmVzcy56aXBDb2RlIGVtYmVkZGVkIG1hcHBpbmcKKwkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSAoKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIikuc2V0VmlydHVhbChmYWxzZSk7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUhfT1ZFUlJJREUiKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEVfT1ZFUlJJREUiKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiKTsKKworCisJCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldEF0dHJpYnV0ZU92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKKwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7CisJCQorCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJLy9UT0RPIEkgaGF2ZSB0aGUgZGVmYXVsdCB3cm9uZyBpbiB0aGlzIGNhc2UsIGJ1dCB0aGlzIHdhcyB3cm9uZyBiZWZvcmUgYXMgd2VsbC4gIE5lZWQgdG8gZml4IHRoaXMgbGF0ZXIKKy8vCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscyhudWxsLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscyhudWxsLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoMjU1LCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7CisJCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YUVudGl0eSgpKS5nZXRDYWNoZWFibGUoKTsKKwkJQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiBjYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24pOworCQkKKwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlKGZhbHNlKSIsIGN1KTsKKwkJCisJCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKKwkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7CisJCQorCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKG51bGwpOworCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7CisJCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGVhYmxlIiwgY3UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhRW50aXR5KCkpLmdldENhY2hlYWJsZSgpOworCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7CisJCQorCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuYWRkQW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKKwkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlIiwgY3UpOworCisJCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUoZmFsc2UpIiwgY3UpOworCQkKKwkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSh0cnVlKSIsIGN1KTsKKwkJCisJCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKKworCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKKwkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZWFibGUiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YUVudGl0eSgpKS5nZXRDYWNoZWFibGUoKTsKKwkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdCA9IChQZXJzaXN0ZW5jZVVuaXQyXzApIGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlhc3NlcnRFcXVhbHMoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U2hhcmVkQ2FjaGVNb2RlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCisJCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkFMTCk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQkKKwkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8KKy8vCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLworLy8JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkKKy8vCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRCk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJbmhlcml0ZWRJc0RlZmF1bHRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQ2FjaGVhYmxlMl8wIHN1YkNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhRW50aXR5KCkpLmdldENhY2hlYWJsZSgpOworCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKS5nZXRQYXJlbnRFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKworCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0Ml8wID0gKFBlcnNpc3RlbmNlVW5pdDJfMCkgZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLworLy8JCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUobnVsbCk7CisvLwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkJCQorLy8JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJCisvLwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkKKy8vCQkKKy8vCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGQ4ZjIzCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKQEAgLTAsMCArMSwyMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKKyAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKKyAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwc0lkMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cworCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUgQElkIikuYXBwZW5kKENSKTsJCQkJCisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBtYW55VG9PbmU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKKwkJCX0KKwkJfSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlVHlwZSA9IAorCQkJCWdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOworCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5JRCk7CisJCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlyZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKEpQQS5JRCk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aERlcml2ZWRJZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VUeXBlID0gCisJCQkJZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2VUeXBlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7CisJCUphdmFNYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLnNldFZhbHVlKGZhbHNlKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLnNldFZhbHVlKHRydWUpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VUeXBlID0gCisJCQkJZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2VUeXBlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOworCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IAorCQkJCShNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKKwkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWFubm90YXRpb24uc2V0VmFsdWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7CisJCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VUeXBlID0gCisJCQkJZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2VUeXBlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOworCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLnNldFZhbHVlKCJmb28iKTsKKwkJTWFwc0lkMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCisJCQkJKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOworCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5zZXRWYWx1ZSgiYmFyIik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLnNldFZhbHVlKG51bGwpOworCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vcnBoTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aERlcml2ZWRJZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VUeXBlID0gCisJCQkJZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2VUeXBlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7CisJCQorCQkoKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5zZXRWYWx1ZSgiZm9vIik7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuZ2V0VmFsdWUoKSk7CisJCWFzc2VydFRydWUoKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJY29udGV4dEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUlkTWFwcGluZyk7CisJCQorCQljb250ZXh0QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnRUcnVlKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydFRydWUoY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhQmFzaWNNYXBwaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWM5N2UKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQpAQCAtMCwwICsxLDUxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNhY2hlYWJsZTJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOworCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJAUmVhZE9ubHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBDdXN0b21pemVyKEZvby5jbGFzcyIpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBDaGFuZ2VUcmFja2luZyIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKworCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRPbmx5LmlzUmVhZE9ubHkoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCX0KKworCS8vVE9ETyB0ZXN0IGluaGVyaXRpbmcgYSBkZWZhdWx0IHJlYWRvbmx5IGZyb20geW91IHN1cGVyY2xhc3MKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgcmVhZE9ubHkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7CisJCWFzc2VydEVxdWFscyh0cnVlLCByZWFkT25seS5pc1JlYWRPbmx5KCkpOworCQkKKwkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsvL0Jvb2xlYW4uRkFMU0UgYW5kIG51bGwgcmVhbGx5IG1lYW4gdGhlIHNhbWUgdGhpbmcgc2luY2UgdGhlcmUgYXJlIG9ubHkgMiBzdGF0ZXMgaW4gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKKworCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLlRSVUUpOworCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKworCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShudWxsKTsKKwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOy8vQm9vbGVhbi5GQUxTRSBhbmQgbnVsbCByZWFsbHkgbWVhbiB0aGUgc2FtZSB0aGluZyBzaW5jZSB0aGVyZSBhcmUgb25seSAyIHN0YXRlcyBpbiB0aGUgamF2YSByZXNvdXJjZSBtb2RlbAorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkUmVhZE9ubHlVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCQorCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRPbmx5LmlzRGVmYXVsdFJlYWRPbmx5KCkpOworCQkKKwkJdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSAoKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gKChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q3VzdG9taXplcigpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCQkKKwkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoIkJhciIpOworCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCQkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKworCQkKKwkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCisJCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyQW5ub3RhdGlvbik7CisKKworCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpOworCisJCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOworCQljdXN0b21pemVyQW5ub3RhdGlvbi5zZXRWYWx1ZSgiQmFyIik7CisJCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJCisJCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQljdXN0b21pemVyQW5ub3RhdGlvbi5zZXRWYWx1ZSgiRm9vQmFyIik7CisJCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ2hhbmdlVHJhY2tpbmcoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjb250ZXh0Q2hhbmdlVHJhY2tpbmcgPSBtYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gQVRUUklCVVRFIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0CisJCQorCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gT0JKRUNUIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0CisJCQorCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gREVGRVJSRUQgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKKwkJCisJCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIHJlc291cmNlIHRvIEFVVE8gc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKKwkJCisJCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0CisJCQorCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG51bGwpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKKwkJCisJCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENoYW5nZVRyYWNraW5nKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY29udGV4dENoYW5nZVRyYWNraW5nID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CisJCQorCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCByZXNvdXJjZSB2YWx1ZQorCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVVRPIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFUVFJJQlVURSBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKKwkJCisJCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIGNoYW5nZSBjb250ZXh0IHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQorCQkKKwkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUobnVsbCk7CisJCQorCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCQlhc3NlcnROdWxsKGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVVUTyBzcGVjaWZpY2FsbHkgKHRoaXMgdGltZSBmcm9tIG5vIGFubm90YXRpb24pLCB0ZXN0IHJlc291cmNlCisJCQorCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKKwkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKKwkJCisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJfQorCQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOworCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7CisJCQorCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOworCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUoZmFsc2UpIiwgY3UpOworCQkKKwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOworCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKKwkJCisJCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUobnVsbCk7CisJCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZWFibGUiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOworCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7CisJCQorCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuYWRkQW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKKwkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlIiwgY3UpOworCisJCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUoZmFsc2UpIiwgY3UpOworCQkKKwkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSh0cnVlKSIsIGN1KTsKKwkJCisJCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKKworCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKKwkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKKwkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZWFibGUiLCBjdSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQgPSAoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJYXNzZXJ0RXF1YWxzKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSwgcGVyc2lzdGVuY2VVbml0LmdldFNoYXJlZENhY2hlTW9kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCQorCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5BTEwpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCisJCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCisvLwkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8KKy8vCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJCisvLwkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuVU5TUEVDSUZJRUQpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0SW5oZXJpdGVkSXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKworCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0Ml8wID0gKFBlcnNpc3RlbmNlVW5pdDJfMCkgZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLworLy8JCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUobnVsbCk7CisvLwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkJCQorLy8JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJCisvLwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkKKy8vCQkKKy8vCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjU0Yzc5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKQEAgLTAsMCArMSwyMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb01hbnkyXzBBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSlBBOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworLyoqCisgKiAgRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMKKwlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCisJCQl9CisJCX0pOworCX0KKwkJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nT3JwaGFuUmVtb3ZhbFNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueShvcnBoYW5SZW1vdmFsPWZhbHNlKSIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbE9mKE9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZykgeworCQlyZXR1cm4gKChKYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgb25lVG9NYW55TWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55R2V0RGVmYXVsdE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZykuaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE9uZVRvTWFueUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOworCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpLmlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOworCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOworCisKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCkpOworCQkKKwkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5pc09ycGhhblJlbW92YWwoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOworCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOworCisJCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCQorCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7CisJCW9uZVRvTWFueS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZ09ycGhhblJlbW92YWxTcGVjaWZpZWQoKTsKKwkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKKworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7CisJCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCQorCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55Ml8wQW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55Ml8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55LmdldE9ycGhhblJlbW92YWwoKSk7CisJCQorCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChudWxsKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSkpOyAJLy8gLmdldEVsZW1lbnQpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7CisJCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCQorCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9NYW55Ml8wQW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55Ml8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55LmdldE9ycGhhblJlbW92YWwoKSk7CisJCQorCQlvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKworCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChudWxsKTsKKwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSkpOworCQkKKwkJb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKKworCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvTWFueTJfMEFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKKwkJb25lVG9NYW55LnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7CisKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCQkKKwkJb25lVG9NYW55LnNldE9ycGhhblJlbW92YWwobnVsbCk7CisJCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCWFzc2VydFNhbWUob25lVG9NYW55TWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCkpOworCQkKKwkJb25lVG9NYW55LnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7CisJCWF0dHJpYnV0ZVJlc291cmNlLnNldFByaW1hcnlBbm5vdGF0aW9uKG51bGwsIG5ldyBTdHJpbmdbMF0pOworCQkKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkNTMyOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKQEAgLTAsMCArMSw1MTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcHNJZDJfMEFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9uZVRvT25lMl8wQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMKKwlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQorCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZ09ycGhhblJlbW92YWxTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lKG9ycGhhblJlbW92YWw9ZmFsc2UpIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIEBJZCIpLmFwcGVuZChDUik7CQkJCQorCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgb25lVG9PbmU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7CQkJCQorCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuSUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOworCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVyaXZlZElkKCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKKwkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOworCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQkKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKUEEuSUQpOworCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEuSUQpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXREZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlVHlwZSA9IAorCQkJCWdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7CisJCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5zZXRWYWx1ZShmYWxzZSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5zZXRWYWx1ZSh0cnVlKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlVHlwZSA9IAorCQkJCWdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOworCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKKwkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJTWFwc0lkMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCisJCQkJKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOworCQlhbm5vdGF0aW9uLnNldFZhbHVlKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiYmFyIik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOworCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKKwkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOworCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7CisJCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLnNldFZhbHVlKCJmb28iKTsKKwkJTWFwc0lkMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCisJCQkJKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOworCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5zZXRWYWx1ZSgiYmFyIik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLnNldFZhbHVlKG51bGwpOworCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vcnBoTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aERlcml2ZWRJZCgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VUeXBlID0gCisJCQkJZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2VUeXBlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CisJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKKwkJCisJCSgoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpLnNldFZhbHVlKCJmb28iKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5nZXRWYWx1ZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpLmdldFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUlkTWFwcGluZyk7CisJCQorCQljb250ZXh0QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7CisJCWFzc2VydFRydWUoKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUJhc2ljTWFwcGluZyk7CisJfQorCQorCQorCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKKwkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCisJCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKKwkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKwkJCisJCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOworCQlhdHRyaWJ1dGVOYW1lcyA9IAorCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCQkKKwkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKKwkJYXR0cmlidXRlTmFtZXMgPSAKKwkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXBSZWZlcmVuY2UoKS5nZXRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKwkJCisJCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOworCX0KKwkKKwlwcml2YXRlIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbE9mKE9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcpIHsKKwkJcmV0dXJuICgoSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvT25lTWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVHZXREZWZhdWx0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpLmlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRPbmVUb09uZUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOworCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZykuaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKKworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5pc09ycGhhblJlbW92YWwoKSk7CisJCQorCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmlzT3JwaGFuUmVtb3ZhbCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisJCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKKworCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9PbmUyXzBBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCW9uZVRvT25lLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsMigpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmdPcnBoYW5SZW1vdmFsU3BlY2lmaWVkKCk7CisJCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRNYXBwaW5nKCk7CisKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZykuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpOworCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCQkKKwkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKKwkJCisJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvT25lMl8wQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKKwkJCisJCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKG51bGwpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpKTsgCS8vIC5nZXRFbGVtZW50KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE9ycGhhblJlbW92YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOworCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7CisJCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCQorCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOworCQkKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9PbmUyXzBBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZS5nZXRPcnBoYW5SZW1vdmFsKCkpOworCQkKKwkJb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCisJCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKG51bGwpOworCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7CisJCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKTsKKwkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpOworCisJCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisKKwkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKKwkJT25lVG9PbmUyXzBBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7CisJCW9uZVRvT25lLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7CisKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCQkKKwkJb25lVG9PbmUuc2V0T3JwaGFuUmVtb3ZhbChudWxsKTsKKwkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKwkJYXNzZXJ0U2FtZShvbmVUb09uZU1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkTWFwcGluZygpKTsKKwkJCisJCW9uZVRvT25lLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7CisJCWF0dHJpYnV0ZVJlc291cmNlLnNldFByaW1hcnlBbm5vdGF0aW9uKG51bGwsIG5ldyBTdHJpbmdbMF0pOworCQkKKwkJYXNzZXJ0TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZE1hcHBpbmcoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KcHRFY2xpcHNlTGluazJfMEphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0RWNsaXBzZUxpbmsyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWJmYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0RWNsaXBzZUxpbmsyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitwdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmsyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQoreworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGluazJfMEphdmFDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBKYXZhRW50aXR5VGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMEphdmFPbmVUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJcHJpdmF0ZSBKcHRFY2xpcHNlTGluazJfMEphdmFDb250ZXh0TW9kZWxUZXN0cygpIHsKKwkJc3VwZXIoKTsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWE2OGU3Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQorCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBlY2xpcHNlTGluazJfME9ybVhtbFJlc291cmNlOworCQorCQorCXByb3RlY3RlZCBFY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQl0aGlzLmVjbGlwc2VMaW5rMl8wT3JtWG1sUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKKwl9CisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSB7CisJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gc3VwZXIuYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKTsKKwkJLy8gZG9uJ3QgY3JlYXRlIGRlZmF1bHQgb3JtLnhtbCAtIGluc3RlYWQgYnVpbGQgZWNsaXBzZWxpbmstb3JtLnhtbAorCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCwgQm9vbGVhbi5GQUxTRSk7CisJCXJldHVybiBkYXRhTW9kZWw7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBUZXN0SnBhUHJvamVjdCBidWlsZEpwYVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCwgSURhdGFNb2RlbCBqcGFDb25maWcpIHRocm93cyBFeGNlcHRpb24geworCQlUZXN0SnBhUHJvamVjdCB0ZXN0SnBhUHJvamVjdCA9IHN1cGVyLmJ1aWxkSnBhUHJvamVjdChwcm9qZWN0TmFtZSwgYXV0b0J1aWxkLCBqcGFDb25maWcpOworCQkKKwkJRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24gb3BlcmF0aW9uID0gCisJCQluZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24oYnVpbGRFY2xpcHNlTGlua09ybUNvbmZpZyh0ZXN0SnBhUHJvamVjdCkpOworCQlvcGVyYXRpb24uZXhlY3V0ZShudWxsLCBudWxsKTsKKwkJCisJCXJldHVybiB0ZXN0SnBhUHJvamVjdDsKKwl9CisJCisJcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRFY2xpcHNlTGlua09ybUNvbmZpZyhUZXN0SnBhUHJvamVjdCB0ZXN0SnBhUHJvamVjdCkgeworCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IAorCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CQkKKwkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCB0ZXN0SnBhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKKwkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVkVSU0lPTiwgRWNsaXBzZUxpbmsyXzAuU0NIRU1BX1ZFUlNJT04pOworCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCwgQm9vbGVhbi5UUlVFKTsKKwkJcmV0dXJuIGRhdGFNb2RlbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5lY2xpcHNlTGluazJfME9ybVhtbFJlc291cmNlID0gbnVsbDsKKwkJc3VwZXIudGVhckRvd24oKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIGdldE9ybVhtbFJlc291cmNlKCkgeworCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGluazJfME9ybVhtbFJlc291cmNlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgWG1sRW50aXR5TWFwcGluZ3MgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKSB7CisJCXJldHVybiAoWG1sRW50aXR5TWFwcGluZ3MpIHN1cGVyLmdldFhtbEVudGl0eU1hcHBpbmdzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCkgeworCQlyZXR1cm4gKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MpIHN1cGVyLmdldEVudGl0eU1hcHBpbmdzKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVudGl0eVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtRW50aXR5VGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzE1ZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVudGl0eVRlc3RzLmphdmEKQEAgLTAsMCArMSwxNjEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5NYXBwaW5nS2V5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlNoYXJlZENhY2hlTW9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0VudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBPcm1FbnRpdHlUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7CisJCisJCisJcHVibGljIEVjbGlwc2VMaW5rMl8wT3JtRW50aXR5VGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgSlBBLk9ORV9UT19PTkUsIEpQQS5NQU5ZX1RPX09ORSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuTUFOWV9UT19NQU5ZKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMjsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczM7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzNDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgIik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklOSEVSSVRBTkNFLCBKUEEuSU5IRVJJVEFOQ0VfVFlQRSwgSlBBLk9ORV9UT19PTkUsIEpQQS5NQU5ZX1RPX09ORSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuTUFOWV9UT19NQU5ZKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKSIpOworCQkJCXNiLmFwcGVuZCgiYWJzdHJhY3QiKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczI7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczQ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgICIpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7CisJCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOworCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJDdXN0b21lciAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJMb25nVGltZUN1c3RvbWVyIGV4dGVuZHMgQ3VzdG9tZXIgIik7CisJCQkJc2IuYXBwZW5kKCJ7fSIpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkxvbmdUaW1lQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCisKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBaaXBDb2RlIHppcENvZGU7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKKwkJCQkJc2IuYXBwZW5kKCI7Iik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJaaXBDb2RlIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHppcDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgcGx1c2ZvdXI7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKKwkJfQorCQl9OworCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJaaXBDb2RlLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CisJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOworCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7CisJCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZW50aXR5Lm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisJCQorCQkKKwkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7CisJCQorCQlvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBlbnRpdHkub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwkJCisJCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZW50aXR5Lm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCQkKKwkJCisJCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOworCQkKKwkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGVudGl0eS5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkKKwkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlc1RhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQorCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IG9ybUVudGl0eS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOworCQkKKwkJCisJCU9ybUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChPcm1FbnRpdHkpIG9ybUVudGl0eS5nZXRQYXJlbnRFbnRpdHkoKTsKKwkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gYWJzdHJhY3RFbnRpdHkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBvcm1FbnRpdHkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7CisJCQorCQkKKwkJT3JtRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKE9ybUVudGl0eSkgb3JtRW50aXR5LmdldFBhcmVudEVudGl0eSgpOworCQlvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGFic3RyYWN0RW50aXR5LmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOworCX0KKy8vVE9ETworLy8JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlc01hcHBlZFN1cGVyY2xhc3NJbk9ybVhtbCgpIHRocm93cyBFeGNlcHRpb24geworLy8JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisvLwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKy8vCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisvLwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKy8vCQkKKy8vCQlJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCk7CisvLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7CisvLwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7CisvLwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IG9ybUVudGl0eS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKKwl9CisJCQorCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKworCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMSwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgwLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkJBWiIpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkKKwkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAorCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDEsIDApOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQkKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsJCQorCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQkKKworCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtRW50aXR5LmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJCisJCW1hcHBlZFN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5tYWtlU3BlY2lmaWVkKCk7CisJCUJhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CisKKwkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CisJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CisKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CisJCQorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNFbnRpdHlIaWVyYWNoeSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKKwkJCisKKwkJT3JtRW50aXR5IHN1cGVyY2xhc3MgPSAoT3JtRW50aXR5KSBvcm1FbnRpdHkuZ2V0UGFyZW50RW50aXR5KCk7CisJCQorCQlzdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikubWFrZVNwZWNpZmllZCgpOworCQlCYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgc3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKKwkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCisJCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOworCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7CisJCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOworCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOworCQkKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisKKwkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJCQVIiKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkJCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7CisJCQorCQkKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiYmFyIik7CisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5hdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCQorCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCQorCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwkJCisJCWFzc2VydEVxdWFscygibmFtZSIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwkJCisJCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCQorCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiaWQiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsJCQorCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJCisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOworCisJCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKHRydWUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CisJCQorCQlJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQorCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCQorCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsJCQorCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKKworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCisJCQorCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CisJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQkKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOworCQkKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyLCAwKTsKKwkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOworCisKKwkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDAsIDEpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQorCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDEsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7CisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgyLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOworCQkJCisJCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQkKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDAsIDEpOworCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKKwkJCisJCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKKwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCk7CQorCQlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCQorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCQorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOwkKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCQorCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKworCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IGVudGl0eS5vdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7CisJfQorCQorLy8JLy9UT0RPIGFkZCBhbGwgbWFwcGluZyB0eXBlcyB0byB0aGUgbWFwcGVkIHN1cGVyY2xhc3MgdG8gdGVzdCB3aGljaCBvbmVzIGFyZSBvdmVycmlkYWJsZQorCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gb3JtRW50aXR5LmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCisJCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBvcm1FbnRpdHkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7CisJCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQkKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCisJCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAorCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpOworCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgxLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKKwkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisKKworCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgwLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlKTsKKwkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKKwkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5tb3ZlKDEsIDApOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKKwkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwkJCisJCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOworCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQkKKwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQkKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7CisJCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCQorCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIGVudGl0eVJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZShlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmlzRW1wdHkoKSk7CisJCQorCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJCisvLworLy8JCS8vTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKy8vCQkvL0Jhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOworLy8JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOworLy8JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKKy8vCQkKKy8vCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKKy8vCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworLy8JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOworCisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKworLy8JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7CisvLwkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7CisvLwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOworLy8JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisvLwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7CisKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCQorCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCQorCQkKKy8vCQkvL1RPRE8gam9pbkNvbHVtbnMgZm9yIGRlZmF1bHQgYXNzb2NpYXRpb24gb3ZlcnJpZGVzCisvLy8vCUlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKS5uZXh0KCk7CisvLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKSk7CisvLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7CisvLy8vCQorLy8vLworLy8vLwlJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKElNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisvLy8vCQorLy8vLwlJT25lVG9PbmVNYXBwaW5nIGFkZHJlc3NNYXBwaW5nID0gKElPbmVUb09uZU1hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MucGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKKy8vLy8JSUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGFkZHJlc3NNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7CisvLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CisvLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIkJBUiIpOworLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJCQVoiKTsKKy8vLy8JCisvLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKy8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOworLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOworLy8vLworLy8vLwlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkpOworLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworLy8vLwlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKSk7CisvLy8vCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CisvLy8vCWFzc2VydEVxdWFscygiQkFaIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7CisvLy8vCisvLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKKy8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKKy8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKKy8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOworLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGUuQU5OT1RBVElPTl9OQU1FKSk7CisvLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXMuQU5OT1RBVElPTl9OQU1FKSk7CisvLy8vCisvLy8vCWRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7CisvLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKSk7CisvLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOworLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7CisvLy8vCQorLy8vLwlqYXZhRW50aXR5LmFkZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMCkuc2V0TmFtZSgiYWRkcmVzcyIpOworLy8vLwlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkpOworCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCisJCS8vYWRkIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkJBUiIpOworCisJCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisJCQorCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5hc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7CisKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuYXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuYXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCQkKKwkJCisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIuYXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQkJCisJCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5zZXRWaXJ0dWFsKGZhbHNlKTsKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQkKKwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOworCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCQorCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOworCisJCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7CisJCQorCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKKworCQlJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbCh0cnVlKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQkKKwkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwoZmFsc2UpOworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCQorCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOworCQkKKwkJCisJCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDEsIDApOworCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOworCisKKwkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMCwgMSk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQkKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDEsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7CisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgyLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOworCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKKwkJCQorCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQkKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5tb3ZlKDIsIDApOworCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CisJCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7CisJCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJCisJCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubW92ZSgwLCAxKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQorCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKKwkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOworCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOworCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOworCQkKKwkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7CisJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKKwkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQljcmVhdGVUZXN0U3ViVHlwZSgpOworCisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7CisJCQorCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7CQorCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCQorCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKKworCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuc2V0VmlydHVhbChmYWxzZSk7CisJCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOworCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJCisJCQorCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsJCisJCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQkKKwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7CisJCQorCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKKwkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXIoKTsKKwkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKKwkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOworCQkKKwkJT3JtUGVyc2lzdGVudFR5cGUgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkxvbmdUaW1lQ3VzdG9tZXIiKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlPcm1QZXJzaXN0ZW50VHlwZSB6aXBDb2RlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7CisKKwkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKKwkJCisJCWFzc2VydEVxdWFscyg3LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpOworCQlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnN0YXRlIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCisJCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCisJCQorCQl6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikubWFrZVNwZWNpZmllZCgpOworCQlCYXNpY01hcHBpbmcgcGx1c0ZvdXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgemlwQ29kZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwbHVzZm91ciIpLmdldE1hcHBpbmcoKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFIik7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CisJCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKKwkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOworCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKKworCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQkvL2NoZWNrIHRoZSB0b3AtbGV2ZWwgZW1iZWRkZWQgKEN1c3RvbWVyLmFkZHJlc3MpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKKwkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0QXR0cmlidXRlT3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7CisJCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQorCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKKwkJCisJCS8vc2V0IGFuIGF0dHJpYnV0ZSBvdmVycmlkZSBvbiBBZGRyZXNzLnppcENvZGUgZW1iZWRkZWQgbWFwcGluZworCQlhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5tYWtlU3BlY2lmaWVkKCk7CisJCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gKChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpLnNldFZpcnR1YWwoZmFsc2UpOworCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIX09WRVJSSURFIik7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFX09WRVJSSURFIik7CisJCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIik7CisKKworCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOworCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCisJCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7CisJCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CisJCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOworCQkKKwkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuc2V0VmlydHVhbChmYWxzZSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOworCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7CisJCS8vVE9ETyBJIGhhdmUgdGhlIGRlZmF1bHQgd3JvbmcgaW4gdGhpcyBjYXNlLCBidXQgdGhpcyB3YXMgd3JvbmcgYmVmb3JlIGFzIHdlbGwuICBOZWVkIHRvIGZpeCB0aGlzIGxhdGVyCisvLwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOworLy8JCWFzc2VydEVxdWFscygiQ3VzdG9tZXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CQorCQlhc3NlcnRFcXVhbHMobnVsbCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CQorCQlhc3NlcnRFcXVhbHMobnVsbCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDI1NSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZTJfMCA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOworCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlMl8wLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKKwkJCisJCWNhY2hlYWJsZTJfMC5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOworCQkKKwkJY2FjaGVhYmxlMl8wLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7CisJCQorCQljYWNoZWFibGUyXzAuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlMl8wLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOworCQkKKwkJZW50aXR5UmVzb3VyY2Uuc2V0Q2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKKworCQllbnRpdHlSZXNvdXJjZS5zZXRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOworCQkKKwkJZW50aXR5UmVzb3VyY2Uuc2V0Q2FjaGVhYmxlKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSAoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJYXNzZXJ0RXF1YWxzKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSwgcGVyc2lzdGVuY2VVbml0Ml8wLmdldFNoYXJlZENhY2hlTW9kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCQorCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5BTEwpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCisJCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8KKy8vCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuVU5TUEVDSUZJRUQpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlRnJvbVN1cGVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHN1Yk9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJRWNsaXBzZUxpbmtFbnRpdHkgc3ViRW50aXR5ID0gKEVjbGlwc2VMaW5rRW50aXR5KSBzdWJPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1YkVudGl0eSkuZ2V0Q2FjaGVhYmxlKCk7CisJCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZW50aXR5KS5nZXRDYWNoZWFibGUoKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQkKKwkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IChQZXJzaXN0ZW5jZVVuaXQyXzApIGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShudWxsKTsKKy8vCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkKKy8vCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQkJCisvLwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkKKy8vCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgc3ViT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKKwkJCisJCUNhY2hlYWJsZTJfMCBqYXZhQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCisJCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSAoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCQkJCisJCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCisJCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCisJCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkKKy8vCQlqYXZhQ2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21NYXBwZWRTdXBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHN1Yk9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua0VudGl0eSBzdWJFbnRpdHkgPSAoRWNsaXBzZUxpbmtFbnRpdHkpIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgc3ViRW50aXR5KS5nZXRDYWNoZWFibGUoKTsKKwkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBtYXBwZWRTdXBlcmNsYXNzKS5nZXRDYWNoZWFibGUoKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQkKKwkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IChQZXJzaXN0ZW5jZVVuaXQyXzApIGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShudWxsKTsKKy8vCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkKKy8vCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQkJCisvLwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkKKy8vCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk1OTY1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjM3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLk1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlNoYXJlZENhY2hlTW9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0NvbnZlcnRlckhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKK3sKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7CisKKwlwdWJsaWMgRWNsaXBzZUxpbmsyXzBPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLlJFQURfT05MWSk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ3VzdG9taXplcigpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzU3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7CisJCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7CisJCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0Zvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7CisJCQl9CisJCX0pOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JSZWFkT25seSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKKwkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCQorCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgb3ZlcnJpZGUKKwkJCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCQorCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQorCQkKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCQkKKwkJLy8gY2xlYXIgeG1sIHJlYWQgb25seSwgc2V0IGphdmEgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIGRlZmF1bHRzCisJCQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkobnVsbCk7CisJCWphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKKwkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCisKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydFRydWUoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKKworCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgb3ZlcnJpZGUKKwkJCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydFRydWUoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCQkKKwkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgb3ZlcnJpZGUKKwkJCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOworCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CisJCQorCQkvLyBjbGVhciB4bWwgcmVhZCBvbmx5LCBzZXQgamF2YSByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIGRlZmF1bHRzCisJCQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkobnVsbCk7CisJCWphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCQkKKwkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIG92ZXJyaWRlCisJCQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCQkKKwkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgb3ZlcnJpZGUKKwkJCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOworCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeVJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yUmVhZE9ubHkoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IHJlYWQgb25seSB0byB0cnVlLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOworCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIG51bGwsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KG51bGwpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwkKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckN1c3RvbWl6ZXIoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisKKworCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpKTsKKwkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDdXN0b21pemVyKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ3VzdG9taXplcigpKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzc05hbWUoKSk7CisJCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCisJCQorCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCisJCQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldEN1c3RvbWl6ZXJDbGFzc05hbWUoImZvbyIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzc05hbWUoKSk7CisJCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCQkKKwkJLy8gY2xlYXIgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIHNldCBqYXZhIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIGRlZmF1bHRzCisJCQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldEN1c3RvbWl6ZXJDbGFzc05hbWUobnVsbCk7CisJCWphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJiYXIiKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKworCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCisKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzc05hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CisJCQorCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCisJCQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldEN1c3RvbWl6ZXJDbGFzc05hbWUoImZvbyIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzc05hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOworCisJCS8vc2V0IHhtbCBjdXN0b21pemVyIG51bGwKKwkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7CisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDdXN0b21pemVyKG51bGwpOworCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOworCQlhc3NlcnROdWxsKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ3VzdG9taXplcigpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiZm9vIik7CisJCQorCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzTmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2hhbmdlVHJhY2tpbmcoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVRUUklCVVRFLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gc2V0IHhtbCB0eXBlIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAorCQkKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gc2V0IHhtbCB0eXBlIHRvIERFRkVSUkVELCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7CisJCQorCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgdHlwZSB0byBBVVRPLCBjaGVjayBjb250ZXh0CisJCQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gY2xlYXIgeG1sIGNoYW5nZSB0cmFja2luZywgc2V0IGphdmEgY2hhbmdlIHRyYWNraW5nLCBjaGVjayBkZWZhdWx0cworCQkKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENoYW5nZVRyYWNraW5nKG51bGwpOworCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKKworCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gdW5zZXQgbWV0YWRhdGFDb21wbGV0ZSwgc2V0IHhtbCBjaGFuZ2UgdHJhY2tpbmcgdG8gT0JKRUNULCBjaGVjayBjb250ZXh0CisJCQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiAgeworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNoYW5nZVRyYWNraW5nKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIEFUVFJJQlVURSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCQkKKwkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIE9CSkVDVCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOworCQkKKwkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCQkKKwkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIERFRkVSUkVELCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKKwkJCisJCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBBVVRPLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOworCQkKKwkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCQkKKwkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUobnVsbCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisKKworCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSB0eXBlLCBjaGVjayBzZXR0aW5ncworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRUeXBlKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTCk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCisJCQkKKwkJLy8gc2V0IGphdmEgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKKwkJCisJCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUspOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOworCisJCS8vIGNsZWFyIHhtbCBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRUeXBlKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkKKwkJCisJCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCisKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBjYWNoZSB0eXBlLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuSEFSRF9XRUFLLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKKwkJCQkKKwkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFR5cGUobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKKwkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCisKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisJCQorCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgc2V0dGluZ3MKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0Q29vcmRpbmF0aW9uVHlwZShvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKKworCQkJCisJCS8vIHNldCBqYXZhIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCisJCQorCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyk7CisJCQorCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKKworCQkvLyBjbGVhciB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0Q29vcmRpbmF0aW9uVHlwZShudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisJCisJCQorCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOworCQorCQkKKwkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQorCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOworCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZUNvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBjYWNoZSBjb29yZGluYXRpb24gdHlwZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKTsKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNvb3JkaW5hdGlvbiB0eXBlIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShudWxsKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOworCX0KKworCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKworCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoMTAwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMTAwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOworCisJCQorCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNpemUobmV3IEludGVnZXIoMTA1KSk7CisJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMTAwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwNSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7CisJCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOworCisJCQkKKwkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKKwkJCisJCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaXplKG5ldyBJbnRlZ2VyKDUwKSk7CisJCQorCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEwNSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7CisKKwkJLy8gY2xlYXIgeG1sIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNpemUobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7CisJCisJCQorCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOworCQorCQkKKwkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQorCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKKworCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOworCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOworCQkJCQorCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2l6ZShudWxsKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7CisJCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisKKworCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgc2V0dGluZ3MKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKworCQkJCisJCS8vIHNldCBqYXZhIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cworCQkKKwkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7CisKKwkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOworCisJCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOworCQorCQkKKwkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKwkKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKKworCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7CisKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKwkJCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2gobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisKKworCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKworCQkKKwkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCisJCQkKKwkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKKwkJCisJCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCisJCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKworCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkKKwkJCisJCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOworCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKKworCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKworCQkKKwkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCQkKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKKwkJCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKworCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOworCisJCQorCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7CisKKwkJCQorCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cworCQkKKwkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7CisKKwkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOworCisJCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0RGlzYWJsZUhpdHMobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOworCQorCQkKKwkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7CisJCisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCisKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKKworCQkKKwkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVEaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKKwkJCisJCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCisJCQorCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKKwkJCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZERpc2FibGVIaXRzKG51bGwpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKKwkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7CisJCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOworCisKKwkJLy8gY2hlY2sgZGVmYXVsdHMKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7CisKKwkJCisJCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2hhcmVkKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOworCisJCQkKKwkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKKwkJCisJCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7CisJCQorCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKKworCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKKworCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChudWxsKTsKKworCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOworCQorCQkKKwkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOworCQorCQkKKwkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQorCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7CisKKwkJCisJCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCisJCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCS8vIGNoZWNrIGRlZmF1bHRzCisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7CisJCQorCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKKwkJCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKKwkJCisJCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZUV4aXN0ZW5jZUNoZWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisKKworCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKKwkJCisJCS8vIHNldCB4bWwgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayBzZXR0aW5ncworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0RXhpc3RlbmNlQ2hlY2tpbmcob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSk7CisJCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7CisKKwkJCQorCQkvLyBzZXQgamF2YSBjYWNoZSBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIGRlZmF1bHRzCisJCQorCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKKworCQkvLyBjbGVhciB4bWwgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayBkZWZhdWx0cworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0RXhpc3RlbmNlQ2hlY2tpbmcobnVsbCk7CisKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsJCisJCQorCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCisKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKKworCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCQorCQkvLyBjaGVjayBkZWZhdWx0cworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOworCQkKKwkJLy8gc2V0IGNvbnRleHQgY2FjaGUgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOworCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7CisJCQkJCisJCS8vIHNldCBjb250ZXh0IGV4aXN0ZW5jZSBjaGVja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQorCQkKKwkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUobnVsbCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7CisJfQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmFkZChyZXNvdXJjZUNvbnZlcnRlcik7CisJCXJlc291cmNlQ29udmVydGVyLnNldENsYXNzTmFtZSgiRm9vIik7CisJCXJlc291cmNlQ29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7CisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlQ29udmVydGVyMik7CisJCXJlc291cmNlQ29udmVydGVyMi5zZXRDbGFzc05hbWUoIkZvbzIiKTsKKwkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZUNvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKKwkJY29udGV4dENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7CisJCWNvbnRleHRDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7CisJCWNvbnRleHRDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7CisJCWNvbnRleHRDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZUN1c3RvbUNvbnZlcnRlcigwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOworCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoY29udGV4dENvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclR5cGVDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlVHlwZUNvbnZlcnRlcik7CisJCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7CisJCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VUeXBlQ29udmVydGVyMik7CisJCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKKwkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclR5cGVDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOworCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7CisJCWNvbnRleHRUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7CisJCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOworCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVR5cGVDb252ZXJ0ZXIoMCwgMSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcigwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcihjb250ZXh0VHlwZUNvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0Zvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcik7CisJCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7CisJCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOworCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7CisJCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKKwkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0Zvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOworCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7CisJCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7CisJCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOworCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCwgMSk7CisJCQorCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOworCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7CisJCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yU3RydWN0Q29udmVydGVycygpOworCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJIb2xkZXIoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKKwkJCisJCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOworCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZChyZXNvdXJjZVN0cnVjdENvbnZlcnRlcik7CisJCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldENvbnZlcnRlcigiRm9vIik7CisJCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOworCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7CisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlU3RydWN0Q29udmVydGVyMik7CisJCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXIoIkZvbzIiKTsKKwkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCisJCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKKwkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKKwkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAorCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE1vZGlmeVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckhvbGRlcigpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJCisJCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKKwkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7CisJCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKKwkJCisJCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKKwkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7CisJCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7CisJCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJCQorCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCisJCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVN0cnVjdENvbnZlcnRlcigwLCAxKTsKKwkJCisJCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOworCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOworCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOworCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7CisJCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7CisJCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7CisJCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOworCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOworCQkKKwkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKKwkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoY29udGV4dFN0cnVjdENvbnZlcnRlcjIpOworCQkKKwkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7CisJCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpLmhhc05leHQoKSk7CisJCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZTJfMCA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOworCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZTJfMC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOworCQkKKwkJY2FjaGVhYmxlMl8wLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZTJfMC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOworCQkKKwkJY2FjaGVhYmxlMl8wLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOworCQkKKwkJY2FjaGVhYmxlMl8wLnNldFNwZWNpZmllZENhY2hlYWJsZShudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZTJfMC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKKwkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7CisJCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKKwkJCisJCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5zZXRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKKworCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0Q2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7CisJCQorCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0Q2FjaGVhYmxlKG51bGwpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQkKKwkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOworCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0Ml8wID0gKFBlcnNpc3RlbmNlVW5pdDJfMCkgZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCWFzc2VydEVxdWFscyhTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUsIHBlcnNpc3RlbmNlVW5pdDJfMC5nZXRTaGFyZWRDYWNoZU1vZGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQkKKwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuQUxMKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCQorCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLworLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLlVOU1BFQ0lGSUVEKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21TdXBlclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKKwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NTdWJUeXBlKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIHN1Yk9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJCisJCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBzdWJNYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgc3ViT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOworCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJQ2FjaGVhYmxlMl8wIHN1YkNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBzdWJNYXBwZWRTdXBlcmNsYXNzKS5nZXRDYWNoZWFibGUoKTsKKwkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBtYXBwZWRTdXBlcmNsYXNzKS5nZXRDYWNoZWFibGUoKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQkKKwkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IChQZXJzaXN0ZW5jZVVuaXQyXzApIGdldFBlcnNpc3RlbmNlVW5pdCgpOworCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShudWxsKTsKKy8vCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkKKy8vCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQkJCisvLwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkKKy8vCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzU3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKKwkJCisJCUNhY2hlYWJsZTJfMCBqYXZhQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7CisJCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCisJCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSAoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCQkJCisJCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCisJCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCisJCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCisJCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkKKy8vCQlqYXZhQ2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21NYXBwZWRTdXBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7CisJCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzU3ViVHlwZSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCQorCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgc3ViTWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKKwkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CisJCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgc3ViTWFwcGVkU3VwZXJjbGFzcykuZ2V0Q2FjaGVhYmxlKCk7CisJCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgbWFwcGVkU3VwZXJjbGFzcykuZ2V0Q2FjaGVhYmxlKCk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKwkJCisJCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSAoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUobnVsbCk7CisvLwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJCisvLwkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkJCQorLy8JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7CisvLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCQorLy8JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisvLwkJCisvLwkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOworLy8JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOworLy8JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQkKKy8vCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKKy8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKKy8vCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMGFhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFibGUyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7CisKKy8qKgorICogIEVjbGlwc2VMaW5rMl8wT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cworCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJcHJpdmF0ZSBPcm1PcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbE9mKE9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZykgeworCQlyZXR1cm4gKChPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvbmVUb01hbnlNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKKwkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOworCQlPcm1PcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7CisJCVhtbE9uZVRvTWFueSBvbmVUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOworCQkJCQorCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorCQlvbmVUb01hbnlSZXNvdXJjZS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOworCQorCQlvbmVUb01hbnlSZXNvdXJjZS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7CisJCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOworCQlYbWxPbmVUb01hbnkgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKKwkJCQkKKwkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKKwkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCisJCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1ODBlYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhYmxlMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cworCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybU9uZVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkKKwkJCX0KKwkJfSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKSkpIHsKKwkJCWVhY2gubWFrZVNwZWNpZmllZCgpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUgQElkIikuYXBwZW5kKENSKTsJCQkJCisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBvbmVUb09uZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CQkJCQorCQkJfQorCQl9KTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpKSkgeworCQkJZWFjaC5tYWtlU3BlY2lmaWVkKCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKKwkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7CisJCQkJCXNiLmFwcGVuZCgiOyIpOworCQkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKKwkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOworCQl9CisJCX07CisJCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKKwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBLklEKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7CQkJCQorCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKKwkJCX0KKwkJfSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgeworCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOworCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOworCQkJCQlzYi5hcHBlbmQoIjsiKTsKKwkJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7CisJCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7CisJCX0KKwkJfTsKKwkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKKwkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7CisJCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCXJlc291cmNlTWFwcGluZy5zZXRJZChCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJcmVzb3VyY2VNYXBwaW5nLnNldElkKG51bGwpOworCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXREZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKKwkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7CisJCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLnNldFZhbHVlKHRydWUpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7CisJCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5zZXRWYWx1ZShmYWxzZSk7CisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKKwkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7CisJCVhtbE1hcHNJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKCJiYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZChudWxsKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHkoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOworCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKKwkJWG1sTWFwc0lkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuc2V0VmFsdWUoImZvbyIpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5zZXRWYWx1ZSgiYmFyIik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLnNldFZhbHVlKG51bGwpOworCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7CisJCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb3JwaE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKKwkJCisJCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOworCQlyZXNvdXJjZU9uZVRvT25lLnNldElkKEJvb2xlYW4uVFJVRSk7CisJCXJlc291cmNlT25lVG9PbmUuc2V0TWFwc0lkKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VPbmVUb09uZS5nZXRJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU9uZVRvT25lLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0VHJ1ZSgoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJY29udGV4dEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hbnlUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hbnlUb09uZS5nZXRJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hbnlUb09uZS5nZXRNYXBzSWQoKSk7CisJCWFzc2VydFRydWUoKChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOworCQlyZXNvdXJjZU9uZVRvT25lID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VPbmVUb09uZS5nZXRJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU9uZVRvT25lLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0VHJ1ZSgoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7CisJCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7CisJCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7CisJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7CisJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzIik7CisKKwkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOworCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7CisJCQorCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkubmV4dCgpOworCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisKKwkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAorCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCQkKKwkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7CisJCWF0dHJpYnV0ZU5hbWVzID0gCisJCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwUmVmZXJlbmNlKCkuZ2V0TWFwcGVkQnlKb2luaW5nU3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7CisJCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7CisJCQorCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOworCQlhdHRyaWJ1dGVOYW1lcyA9IAorCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcFJlZmVyZW5jZSgpLmdldE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOworCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7CisJCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOworCQkKKwkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7CisJCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7CisJfQorCQorCXByaXZhdGUgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nKSB7CisJCXJldHVybiAoKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvT25lTWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24geworCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOworCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCU9ybU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvcm1PbmVUb09uZU1hcHBpbmcpOworCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOworCQkKKwkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOworCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOworCQkJCQorCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAorCQlvbmVUb09uZVJlc291cmNlLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKKwkKKwkJb25lVG9PbmVSZXNvdXJjZS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7CisJCU9ybU9uZVRvT25lTWFwcGluZzJfMCBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9ybU9uZVRvT25lTWFwcGluZyk7CisJCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7CisKKwkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKKwkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKwkKKwkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VsaW5rMl8wT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VsaW5rMl8wT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzMmUwOQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZWxpbmsyXzBPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAorICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAorICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAKKyAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuTWFwcGluZ0tleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmcyXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2UuamF2YS5KUEE7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxEZXJpdmVkSWRfMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHNJZF8yXzA7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOworCitAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKK3B1YmxpYyBjbGFzcyBFY2xpcHNlbGluazJfME9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cworCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQoreworCXB1YmxpYyBFY2xpcHNlbGluazJfME9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgeworCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSk7CisJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7CisJCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCX0KKwkJCQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKKwkJCQlzYi5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpOworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKENSKTsKKwkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkKKwkJCX0KKwkJfSk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKSkpIHsKKwkJCWVhY2gubWFrZVNwZWNpZmllZCgpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7CisJCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSUQpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKKwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOworCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgeworCQkJCXNiLmFwcGVuZChDUik7CisJCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKKwkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOworCQkJCXNiLmFwcGVuZChDUik7CQkJCQorCQkJfQorCQl9KTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpKSkgeworCQkJZWFjaC5tYWtlU3BlY2lmaWVkKCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5V2l0aERlcml2ZWRJZCgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKKwkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKKwkJWG1sRGVyaXZlZElkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOworCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCXJlc291cmNlTWFwcGluZy5zZXRJZChCb29sZWFuLkZBTFNFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5UUlVFKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJcmVzb3VyY2VNYXBwaW5nLnNldElkKG51bGwpOworCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTZXREZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZXJpdmVkSWQoKTsKKwkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOworCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7CisJCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7CisJCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWQoKS5zZXRWYWx1ZSh0cnVlKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOworCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuc2V0VmFsdWUoZmFsc2UpOworCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKKwkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVGVzdEVudGl0eSgpOworCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CisJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7CisJCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CisJCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZVR5cGVNYXBwaW5nKCk7CisJCVhtbE1hcHNJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CisJCQorCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7CisJCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiYmFyIik7CisJCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQobnVsbCk7CisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNldE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVUZXN0RW50aXR5KCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKKwkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKKwkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFJlc291cmNlVHlwZU1hcHBpbmcoKTsKKwkJWG1sTWFwc0lkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKKwkJCisJCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLnNldFZhbHVlKCJmb28iKTsKKwkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCQkKKwkJY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuc2V0VmFsdWUoImJhciIpOworCQlhc3NlcnRFcXVhbHMoImJhciIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7CisJCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0TWFwc0lkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0TWFwcGluZy5nZXRNYXBzSWQoKS5zZXRWYWx1ZShudWxsKTsKKwkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldE1hcHNJZCgpLmdldFZhbHVlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVyaXZlZElkKCk7CisJCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKKwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOworCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0UmVzb3VyY2VUeXBlTWFwcGluZygpOworCQkKKwkJWG1sTWFueVRvT25lIHJlc291cmNlTWFueVRvT25lID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7CisJCXJlc291cmNlTWFueVRvT25lLnNldElkKEJvb2xlYW4uVFJVRSk7CisJCXJlc291cmNlTWFueVRvT25lLnNldE1hcHNJZCgiZm9vIik7CisJCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFueVRvT25lLmdldElkKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFueVRvT25lLmdldE1hcHNJZCgpKTsKKwkJYXNzZXJ0VHJ1ZSgoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXREZXJpdmVkSWQoKS5nZXRWYWx1ZSgpKTsKKwkJCisJCWNvbnRleHRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7CisJCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOworCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU9uZVRvT25lLmdldElkKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlT25lVG9PbmUuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnRUcnVlKCgoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0RGVyaXZlZElkKCkuZ2V0VmFsdWUoKSk7CisJCQorCQljb250ZXh0QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKKwkJcmVzb3VyY2VNYW55VG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKKwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0SWQoKSk7CisJCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0TWFwc0lkKCkpOworCQlhc3NlcnRUcnVlKCgoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldERlcml2ZWRJZCgpLmdldFZhbHVlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0RWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRFY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM2YmRiNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0RWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQoreworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7CisJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfME9ybUVudGl0eVRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VsaW5rMl8wT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOworCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOworCQlyZXR1cm4gc3VpdGU7CisJfQorCisJcHJpdmF0ZSBKcHRFY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RzKCkgeworCQlzdXBlcigpOworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBDb25uZWN0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMENvbm5lY3Rpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZTZkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBDb25uZWN0aW9uVGVzdHMuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CisKKy8qKgorICogIEVjbGlwc2VMaW5rMl8wQ29ubmVjdGlvblRlc3RzCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMENvbm5lY3Rpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKK3sKKwlwcml2YXRlIENvbm5lY3Rpb24yXzAgY29ubmVjdGlvbjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRV9TUUxfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19OQVRJVkVfU1FMOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBOQVRJVkVfU1FMX1RFU1RfVkFMVUUgPSBmYWxzZTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gTkFUSVZFX1NRTF9URVNUX1ZBTFVFXzIgPSAhIE5BVElWRV9TUUxfVEVTVF9WQUxVRTsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfS0VZID0gSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX0RSSVZFUjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfVEVTVF9WQUxVRSA9ICJjb25uZWN0aW9uLmRyaXZlciI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX1RFU1RfVkFMVUVfMiA9ICJjb25uZWN0aW9uLmRyaXZlci4yIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfRFJJVkVSX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfRFJJVkVSOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9EUklWRVJfVEVTVF9WQUxVRSA9ICJsZWdhY3kuY29ubmVjdGlvbi5kcml2ZXIiOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9LRVkgPSBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVJMOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9URVNUX1ZBTFVFID0gInRlc3QiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfVVJMX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfVVJMOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9VUkxfVEVTVF9WQUxVRSA9ICJsZWdhY3kuY29ubmVjdGlvbi51cmwiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9LRVkgPSBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVNFUjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1RFU1RfVkFMVUUgPSAidGVzdCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfVVNFUl9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1VTRVI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1VTRVJfVEVTVF9WQUxVRSA9ICJsZWdhY3kuY29ubmVjdGlvbi51c2VyIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX0tFWSA9IEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9URVNUX1ZBTFVFID0gInRlc3QiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzIiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9QQVNTV09SRF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1BBU1NXT1JEOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9QQVNTV09SRF9URVNUX1ZBTFVFID0gImxlZ2FjeS5jb25uZWN0aW9uLnBhc3N3b3JkIjsKKworCXB1YmxpYyBFY2xpcHNlTGluazJfMENvbm5lY3Rpb25UZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQl0aGlzLmNvbm5lY3Rpb24gPSB0aGlzLnN1YmplY3QuZ2V0Q29ubmVjdGlvbigpOworCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOworCQkKKwkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisJCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQkKKwkJdGhpcy5jbGVhckV2ZW50KCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKKwkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSA4OyAvLyBFY2xpcHNlTGluayBwcm9wZXJ0aWVzCisJCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyAxOyAvLyA0IG1pc2MgcHJvcGVydGllcworCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKKwkJCisJCS8vIEluaXRpYWxpemVzIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShMRUdBQ1lfRFJJVkVSX0tFWSwgTEVHQUNZX0RSSVZFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KERSSVZFUl9LRVksIERSSVZFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KExFR0FDWV9VUkxfS0VZLCBMRUdBQ1lfVVJMX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVVJMX0tFWSwgVVJMX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTEVHQUNZX1VTRVJfS0VZLCBMRUdBQ1lfVVNFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFVTRVJfS0VZLCBVU0VSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTEVHQUNZX1BBU1NXT1JEX0tFWSwgTEVHQUNZX1BBU1NXT1JEX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7CisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUEFTU1dPUkRfS0VZLCBQQVNTV09SRF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCQkKKwkJcmV0dXJuOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgeworCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uOworCX0KKworCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24geworCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7CisKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXREcml2ZXIoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFVybCgpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFVzZXIoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlBBU1NXT1JEX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0UGFzc3dvcmQoKTsKKwkJZWxzZQorCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7CisJCXJldHVybiBtb2RlbFZhbHVlOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uRFJJVkVSX1BST1BFUlRZKSkKKwkJCXRoaXMuY29ubmVjdGlvbi5zZXREcml2ZXIoKFN0cmluZykgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVJMX1BST1BFUlRZKSkKKwkJCXRoaXMuY29ubmVjdGlvbi5zZXRVcmwoKFN0cmluZykgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSkpCisJCQl0aGlzLmNvbm5lY3Rpb24uc2V0VXNlcigoU3RyaW5nKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5QQVNTV09SRF9QUk9QRVJUWSkpCisJCQl0aGlzLmNvbm5lY3Rpb24uc2V0UGFzc3dvcmQoKFN0cmluZykgbmV3VmFsdWUpOworCQllbHNlCisJCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKKwl9CisJCisKKwkvLyAqKioqKioqKioqIFByb3BlcnRpZXMgTmFtZSBNaWdyYXRpb24gdGVzdHMgKioqKioqKioqKgorCXB1YmxpYyB2b2lkIHRlc3REcml2ZXJQcm9wZXJ0eU5hbWVNaWdyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBWZXJpZnkgbGVnYWN5IGRyaXZlciBleGlzdHMKKwkJYXNzZXJ0VHJ1ZSgiTGVnYWN5IGRyaXZlciBub3QgZXhpc3RzIiwgdGhpcy5wcm9wZXJ0eVZhbHVlRXF1YWxzKExFR0FDWV9EUklWRVJfS0VZLCBMRUdBQ1lfRFJJVkVSX1RFU1RfVkFMVUUpKTsKKwkJCisJCS8vIFZlcmlmeSBkcml2ZXIgcmVhZCBpbgorCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBkcml2ZXIgcmVhZCIsIHRoaXMuY29ubmVjdGlvbi5nZXREcml2ZXIoKSwgRFJJVkVSX1RFU1RfVkFMVUUpOworCisJCS8vIENoYW5nZSBkcml2ZXIgdmFsdWUKKwkJdGhpcy5jb25uZWN0aW9uLnNldERyaXZlcihEUklWRVJfVEVTVF9WQUxVRV8yKTsKKwkJLy8gVmVyaWZ5IGRyaXZlciB2YWx1ZSBjaGFuZ2VkCisJCWFzc2VydEVxdWFscygiRHJpdmVyIG5vdCBzZXQiLCB0aGlzLmNvbm5lY3Rpb24uZ2V0RHJpdmVyKCksIERSSVZFUl9URVNUX1ZBTFVFXzIpOworCQlhc3NlcnRUcnVlKCJQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgbm90IHNldCIsIHRoaXMucHJvcGVydHlWYWx1ZUVxdWFscyhEUklWRVJfS0VZLCBEUklWRVJfVEVTVF9WQUxVRV8yKSk7CisJCQorCQkvLyBWZXJpZnkgbGVnYWN5IGVudHJ5IGhhcyBiZWVuIGRlbGV0ZWQKKwkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KExFR0FDWV9EUklWRVJfS0VZLCAgIkxlZ2FjeSBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gZGVsZXRlZCIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0aWVzTmFtZXNNaWdyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gY29ubmVjdGlvbi5pbml0aWFsaXplUHJvcGVydGllcygpIG9jY3VycmVkIGJlZm9yZSB0ZXN0LnB1UG9wdWxhdGUoKSB0aGVyZWZvcmUKKwkJLy8gd2UgY2Fubm90IHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgYXJlIGxlZ2FjeSBwcm9wZXJ0aWVzIG9ubHkgZXhpc3QgaW4gdGhlIHhtbAorCQkvLyBWZXJpZnkgdGhhdCBVc2VyICYgUGFzc3dvcmQgZXhpc3QgaW4gYm90aCBmb3JtcworCQl0aGlzLnZlcmlmeVB1SGFzUHJvcGVydHkoVVNFUl9LRVksICAiUHJvcGVydHkgbm90IGV4aXN0cyIpOworCQl0aGlzLnZlcmlmeVB1SGFzUHJvcGVydHkoUEFTU1dPUkRfS0VZLCAgIlByb3BlcnR5IG5vdCBleGlzdHMiKTsKKwkJdGhpcy52ZXJpZnlQdUhhc1Byb3BlcnR5KExFR0FDWV9VU0VSX0tFWSwgICJMZWdhY3kgcHJvcGVydHkgbm90IGV4aXN0cyIpOworCQl0aGlzLnZlcmlmeVB1SGFzUHJvcGVydHkoTEVHQUNZX1BBU1NXT1JEX0tFWSwgICJMZWdhY3kgcHJvcGVydHkgbm90IGV4aXN0cyIpOworCQkKKwkJLy8gQ2hhbmdlIGEgcHJvcGVydHkgdmFsdWUgdG8gdHJpZ2dlciBtaWdyYXRpb24gcm91dGluZQorCQl0aGlzLmNvbm5lY3Rpb24uc2V0TmF0aXZlU3FsKE5BVElWRV9TUUxfVEVTVF9WQUxVRSk7CisJCQorCQkvLyBWZXJpZnkgdGhhdCBhbGwgbGVnYWN5IGVudHJ5IGhhcyBiZWVuIGRlbGV0ZWQKKwkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KExFR0FDWV9EUklWRVJfS0VZLCAgIkxlZ2FjeSBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gZGVsZXRlZCIpOworCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoTEVHQUNZX1VSTF9LRVksICAiTGVnYWN5IHByb3BlcnR5IGhhcyBub3QgYmVlbiBkZWxldGVkIik7CisJCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShMRUdBQ1lfVVNFUl9LRVksICAiTGVnYWN5IHByb3BlcnR5IGhhcyBub3QgYmVlbiBkZWxldGVkIik7CisJCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShMRUdBQ1lfUEFTU1dPUkRfS0VZLCAgIkxlZ2FjeSBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gZGVsZXRlZCIpOworCX0KKworCQorCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0OGUwNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyogCisqIENvbnRyaWJ1dG9yczoKKyogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rMl8wLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zMl8wOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CisKKy8qKgorICogIEVjbGlwc2VMaW5rT3B0aW9uczJfMFRlc3RzCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKK3sKKwlwcml2YXRlIE9wdGlvbnMyXzAgb3B0aW9uczsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0tfVElNRU9VVF9LRVkgPSBPcHRpb25zMl8wLlBFUlNJU1RFTkNFX0xPQ0tfVElNRU9VVDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgTE9DS19USU1FT1VUX1RFU1RfVkFMVUUgPSAxMDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIExPQ0tfVElNRU9VVF9URVNUX1ZBTFVFXzIgPSAyMDA7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9USU1FT1VUX0tFWSA9IE9wdGlvbnMyXzAuUEVSU0lTVEVOQ0VfUVVFUllfVElNRU9VVDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFID0gMTAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUVfMiA9IDIwMDsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZID0gT3B0aW9uczJfMC5QRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRSA9ICJ0ZXN0X3ByZS1wZXJzaXN0X2dyb3VwIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzJfcHJlLXBlcnNpc3RfZ3JvdXAiOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVkgPSBPcHRpb25zMl8wLlBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSA9ICJ0ZXN0X3ByZS11cGRhdGVfZ3JvdXAiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFXzIgPSAidGVzdF8yX3ByZS11cGRhdGVfZ3JvdXAiOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVkgPSBPcHRpb25zMl8wLlBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSA9ICJ0ZXN0X3ByZS1yZW1vdmVfZ3JvdXAiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFXzIgPSAidGVzdF8yX3ByZS1yZW1vdmVfZ3JvdXAiOworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgorCXB1YmxpYyBFY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQl0aGlzLm9wdGlvbnMgPSB0aGlzLnN1YmplY3QuZ2V0T3B0aW9ucygpOworCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOworCisJCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMyXzAuTE9DS19USU1FT1VUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uczJfMC5RVUVSWV9USU1FT1VUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7CisKKwkJdGhpcy5jbGVhckV2ZW50KCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7CisJCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gNTsgLy8gUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMKKwkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDE7IC8vIDEgbWlzYyBwcm9wZXJ0aWVzCisJCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOworCQkKKwkJLy8gSW5pdGlhbGl6ZXMgUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShMT0NLX1RJTUVPVVRfS0VZLCBMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShRVUVSWV9USU1FT1VUX0tFWSwgUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOworCisJCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksIFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZLCBWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLCBWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKKwkJcmV0dXJuIHRoaXMub3B0aW9uczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7CisJCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5MT0NLX1RJTUVPVVRfUFJPUEVSVFkpKQorCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRMb2NrVGltZW91dCgpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuUVVFUllfVElNRU9VVF9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFF1ZXJ5VGltZW91dCgpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSkpCisJCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZKSkKKwkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKCk7CisJCWVsc2UKKwkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOworCQlyZXR1cm4gbW9kZWxWYWx1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24geworCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLkxPQ0tfVElNRU9VVF9QUk9QRVJUWSkpCisJCQl0aGlzLm9wdGlvbnMuc2V0TG9ja1RpbWVvdXQoKEludGVnZXIpIG5ld1ZhbHVlKTsKKwkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlFVRVJZX1RJTUVPVVRfUFJPUEVSVFkpKQorCQkJdGhpcy5vcHRpb25zLnNldFF1ZXJ5VGltZW91dCgoSW50ZWdlcikgbmV3VmFsdWUpOworCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSkpCisJCQl0aGlzLm9wdGlvbnMuc2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCgoU3RyaW5nKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKQorCQkJdGhpcy5vcHRpb25zLnNldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7CisJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpKQorCQkJdGhpcy5vcHRpb25zLnNldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7CisJCWVsc2UKKwkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOworCX0KKwkKKwkvLyAqKioqKioqKioqIExvY2tUaW1lb3V0IHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0TG9ja1RpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJTE9DS19USU1FT1VUX0tFWSwKKwkJCUxPQ0tfVElNRU9VVF9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCUxPQ0tfVElNRU9VVF9LRVksCisJCQlMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRSwKKwkJCUxPQ0tfVElNRU9VVF9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMb2NrVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJTE9DS19USU1FT1VUX0tFWSwKKwkJCUxPQ0tfVElNRU9VVF9URVNUX1ZBTFVFLAorCQkJTE9DS19USU1FT1VUX1RFU1RfVkFMVUVfMik7CisJfQorCQorCS8vICoqKioqKioqKiogUXVlcnlUaW1lb3V0IHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0UXVlcnlUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVFVRVJZX1RJTUVPVVRfS0VZLAorCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFKTsKKwkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKKwkJCVFVRVJZX1RJTUVPVVRfS0VZLAorCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFLAorCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFXzIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVRdWVyeVRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCVFVRVJZX1RJTUVPVVRfS0VZLAorCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFLAorCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFXzIpOworCX0KKworCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCB0ZXN0cyAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdFNldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUsCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFXzIpOworCX0KKworCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlIHRlc3RzICoqKioqKioqKioKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSk7CisJCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUUsCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUUsCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRV8yKTsKKwl9CisKKwkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSB0ZXN0cyAqKioqKioqKioqCisJcHVibGljIHZvaWQgdGVzdFNldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCisJCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUpOworCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSwKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUVfMik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSwKKwkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFLAorCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUVfMik7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZWNsaXBzZWxpbmsyXzAvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyZWQ0MwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisqIAorKiBDb250cmlidXRvcnM6CisqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluazJfMC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcHRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDJfMDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKKworLyoqCisgKiAgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZSBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCit7CisJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0Ml8wIHN1YmplY3Q7CisKKwlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0Ml8wPiBzdWJqZWN0SG9sZGVyOworCisJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgorCXByb3RlY3RlZCBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCXRoaXMuc3ViamVjdCA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisJCXRoaXMuc3ViamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQyXzA+KHRoaXMuc3ViamVjdCk7CisJCXRoaXMucG9wdWxhdGVQdSgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgeworCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7CisJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCBKcHRDb3JlUGx1Z2luLkpQQV9GQUNFVF9WRVJTSU9OXzJfMCk7CQorCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNX0lELCBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuSUQpOworCQlyZXR1cm4gZGF0YU1vZGVsOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDJfMCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7CisJCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQyXzApIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2VjbGlwc2VsaW5rMl8wL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRFY2xpcHNlTGluazJfMENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvSnB0RWNsaXBzZUxpbmsyXzBDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZjlkZTQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9lY2xpcHNlbGluazJfMC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvSnB0RWNsaXBzZUxpbmsyXzBDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorKiAKKyogQ29udHJpYnV0b3JzOgorKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsyXzAuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworLyoqCisgKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCisgKi8KK3B1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGluazJfMENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzCit7CisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rMl8wQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CisKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wQ29ubmVjdGlvblRlc3RzLmNsYXNzKTsKKwkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLmNsYXNzKTsKKwkJCisJCXJldHVybiBzdWl0ZTsKKwl9CisKKwlwcml2YXRlIEpwdEVjbGlwc2VMaW5rMl8wQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMoKSB7CisJCXN1cGVyKCk7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy90ZXN0LWRpc2FibGVkLnhtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy90ZXN0LWRpc2FibGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViZGU2Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvdGVzdC1kaXNhYmxlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLQk8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotCTwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0JPGVjaG8gbWVzc2FnZT0iYmFzZWRpciAke2Jhc2VkaXJ9IiAvPgotCTxlY2hvIG1lc3NhZ2U9ImVjbGlwc2UgcGxhY2UgJHtlY2xpcHNlLWhvbWV9IiAvPgotCTwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBwbHVnaW4tbmFtZSAtLT4KLQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cyIvPgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotCTwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0JPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcC8+Ci0JCTxkZWxldGU+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0JCTwvZGVsZXRlPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLQkJPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVRlc3RzIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiIvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLQk8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLQk8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsIHN1aXRlLCBjbGVhbnVwIj4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvdGVzdC54bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliMGM2MQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy90ZXN0LnhtbApAQCAtMCwwICsxLDQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KKwk8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgorCTwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+CisJPGVjaG8gbWVzc2FnZT0iYmFzZWRpciAke2Jhc2VkaXJ9IiAvPgorCTxlY2hvIG1lc3NhZ2U9ImVjbGlwc2UgcGxhY2UgJHtlY2xpcHNlLWhvbWV9IiAvPgorCTwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBwbHVnaW4tbmFtZSAtLT4KKwk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cyIvPgorICAgIDxlY2hvIGxldmVsPSJkZWJ1ZyIgbWVzc2FnZT0idGVzdFJvb3Q6ICR7dGVzdFJvb3R9IiAvPgorICAgIDxmYWlsIG1lc3NhZ2U9InRlc3RSb290IG11c3QgYmUgc2V0IiB1bmxlc3M9InRlc3RSb290IiAvPgorCisJPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgorCTwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+CisJPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+CisJPHRhcmdldCBuYW1lPSJpbml0Ij4KKwkJPHRzdGFtcC8+CisJCTxkZWxldGU+CisJCQk8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+CisJCTwvZGVsZXRlPgorCTwvdGFyZ2V0PgorCisJPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KKwk8dGFyZ2V0IG5hbWU9InN1aXRlIj4KKyAgICAJPHByb3BlcnR5IGZpbGU9IiR7dGVzdFJvb3R9L3Rlc3RTZXJ2ZXIucHJvcGVydGllcyIvPgorCSAgICA8cHJvcGVydHkgbmFtZT0ianB0LWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qcHRfZm9sZGVyIi8+CisJICAgIDxkZWxldGUgZGlyPSIke2pwdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgorCQkKKwkJPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+CisJCSAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2pwdC1mb2xkZXJ9Ii8+CisJCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgorCQkJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLkpwdEVjbGlwc2VMaW5rQ29yZVRlc3RzIiAvPgorCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KKwkJCTxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9Ii1Eb3JnLmVjbGlwc2UuanB0LmpwYS5qYXI9JHt0ZXN0RGlyfS8ke2pwdC1wZXJzaXN0ZW5jZS1qYXJ9IC1Eb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmphcj0ke3Rlc3REaXJ9LyR7anB0LWVjbGlwc2VsaW5rLWphcn0iLz4KKwkJPC9hbnQ+CisJPC90YXJnZXQ+CisKKwk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KKwk8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+CisJPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgorCTx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisJPC90YXJnZXQ+CisKKwk8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+CisJPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgorCTx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LCBzdWl0ZSwgY2xlYW51cCI+CisJPC90YXJnZXQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzA4NzdiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC91aS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNDA3NzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC51aS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzY0YTBmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAwNyAxNDoyNzoxNiBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxYTUwMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0LAotIG9yZy5qdW5pdDQ7YnVuZGxlLXZlcnNpb249IjQuMy4xIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC51aSwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iMy4zLjEwMCIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLmpmYWNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnBsYXRmb3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkMmU0ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOGFiODcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSMgIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSMgIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotIyAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAKLSMgIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lPUphdmEgUGVyc2lzdGVuY2UgQVBJIFVJIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9KcHRVaVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvSnB0VWlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTBhYmI3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9KcHRVaVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwucGxhdGZvcm0uSnB0VWlQbGF0Zm9ybVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5zd3QuSnB0VWlTV1RUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbC5KcHRVaVV0aWxUZXN0czsKLQotLyoqCi0gKiBSdW5zIGFsbCBKUFQgVUkgVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEpwdFVpVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFVpVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VWlQbGF0Zm9ybVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFVpU1dUVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VWlVdGlsVGVzdHMuc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFVpVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXJVaVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhN2VjNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXJVaVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5OdWxsTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXJVaVRlc3QgZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlOwotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VmVoaWNsZT4gc2VsZWN0ZWRWZWhpY2xlOwotCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBEZWxlZ2F0aW5nTGFiZWxQcm92aWRlclVpVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQkKLQkKLQlwcml2YXRlIERlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuc2VsZWN0ZWRWZWhpY2xlID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxWZWhpY2xlPigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dChDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJcGFyZW50LnNldFNpemUoNDAwLCA0MDApOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidWlsZFRyZWVQYW5lbChtYWluUGFuZWwpOwotCQlidWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRUcmVlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQlsYWJlbC5zZXRUZXh0KCJNeSBWZWhpY2xlcyIpOwotCQkKLQkJdHJlZSA9IG5ldyBUcmVlVmlld2VyKHBhbmVsLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCXRyZWUuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUpKTsKLQkJRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyID0gCi0JCQluZXcgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcigKLQkJCQluZXcgVmVoaWNsZUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSwKLQkJCQluZXcgVmVoaWNsZUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkpOwotCQl0cmVlLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCXRyZWUuc2V0TGFiZWxQcm92aWRlcihjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCXRyZWUuc2V0SW5wdXQobmV3IFJvb3QoKSk7Ci0JCXRyZWUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGJ1aWxkVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGJ1aWxkVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlzZWxlY3RlZFZlaGljbGUuc2V0VmFsdWUoKFZlaGljbGUpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidWlsZFVwcGVyQ29udHJvbFBhbmVsKHBhbmVsKTsKLQkJYnVpbGRMb3dlckNvbnRyb2xQYW5lbChwYW5lbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFVwcGVyQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQlidWlsZFZlaGljbGVDb21ibyhwYW5lbCk7Ci0JCWJ1aWxkQ29sb3JDb21ibyhwYW5lbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFZlaGljbGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbWJvVmlld2VyIGNvbWJvID0gbmV3IENvbWJvVmlld2VyKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWNvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQljb21iby5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQljb21iby5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWZWhpY2xlVHlwZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWNvbWJvLnNldElucHV0KAotCQkJbmV3IFZlaGljbGVUeXBlW10gewotCQkJCVZlaGljbGVUeXBlLkJJQ1lDTEUsIFZlaGljbGVUeXBlLkNBUiwgCi0JCQkJVmVoaWNsZVR5cGUuVFJVQ0ssIFZlaGljbGVUeXBlLkJPQVQKLQkJCX0pOwotCQljb21iby5nZXRDb21ibygpLnNldEVuYWJsZWQoZmFsc2UpOwotCQljb21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlzZWxlY3RlZFZlaGljbGUoKS5zZXRWZWhpY2xlVHlwZSgoVmVoaWNsZVR5cGUpICgoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKTsgCi0JCQkJfQotCQkJfSk7Ci0JCXNlbGVjdGVkVmVoaWNsZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAKLQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVZlaGljbGUgdmVoaWNsZSA9IHNlbGVjdGVkVmVoaWNsZSgpOwotCQkJCQljb21iby5nZXRDb21ibygpLnNldEVuYWJsZWQodmVoaWNsZSAhPSBudWxsKTsKLQkJCQkJY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCh2ZWhpY2xlID09IG51bGwpID8gbnVsbCA6IHZlaGljbGUudmVoaWNsZVR5cGUoKSkpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRDb2xvckNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQ29tYm9WaWV3ZXIgY29tYm8gPSBuZXcgQ29tYm9WaWV3ZXIocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm8uZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWNvbWJvLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWNvbWJvLnNldExhYmVsUHJvdmlkZXIobmV3IENvbG9yTGFiZWxQcm92aWRlcigpKTsKLQkJY29tYm8uc2V0SW5wdXQobmV3IENvbG9yW10ge0NvbG9yLlJFRCwgQ29sb3IuQkxVRSwgQ29sb3IuWUVMTE9XLCBDb2xvci5HUkVFTn0pOwotCQljb21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlzZWxlY3RlZFZlaGljbGUoKS5zZXRDb2xvcigoQ29sb3IpICgoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKTsgCi0JCQkJfQotCQkJfSk7Ci0JCXNlbGVjdGVkVmVoaWNsZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAKLQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVZlaGljbGUgdmVoaWNsZSA9IHNlbGVjdGVkVmVoaWNsZSgpOwotCQkJCQljb21iby5nZXRDb21ibygpLnNldEVuYWJsZWQodmVoaWNsZSAhPSBudWxsKTsKLQkJCQkJY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCh2ZWhpY2xlID09IG51bGwpID8gbnVsbCA6IHZlaGljbGUuY29sb3IoKSkpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRMb3dlckNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWJ1aWxkRWZmZWN0c0xhYmVsKHBhbmVsKTsKLQkJYnVpbGRHcmV5ZWRDaGVja0JveChwYW5lbCk7Ci0JCWJ1aWxkVHJhbnNsdWNlbnRDaGVja0JveChwYW5lbCk7Ci0JCWJ1aWxkQWN0aW9uUGFuZWwocGFuZWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRFZmZlY3RzTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCgiQ29sb3IgZWZmZWN0czogIik7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDMsIDEpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkR3JleWVkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJncmV5ZWQiKTsKLQkJYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXNlbGVjdGVkVmVoaWNsZSgpLnNldEdyZXllZChidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0pOwotCQlzZWxlY3RlZFZlaGljbGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgCi0JCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlWZWhpY2xlIHZlaGljbGUgPSBzZWxlY3RlZFZlaGljbGUoKTsKLQkJCQkJYnV0dG9uLnNldEVuYWJsZWQodmVoaWNsZSAhPSBudWxsKTsKLQkJCQkJYnV0dG9uLnNldFNlbGVjdGlvbih2ZWhpY2xlICE9IG51bGwgJiYgdmVoaWNsZS5pc0dyZXllZCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVHJhbnNsdWNlbnRDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlidXR0b24uc2V0VGV4dCgidHJhbnNsdWNlbnQiKTsKLQkJYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXNlbGVjdGVkVmVoaWNsZSgpLnNldFRyYW5zbHVjZW50KGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCXNlbGVjdGVkVmVoaWNsZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAKLQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVZlaGljbGUgdmVoaWNsZSA9IHNlbGVjdGVkVmVoaWNsZSgpOwotCQkJCQlidXR0b24uc2V0RW5hYmxlZCh2ZWhpY2xlICE9IG51bGwpOwotCQkJCQlidXR0b24uc2V0U2VsZWN0aW9uKHZlaGljbGUgIT0gbnVsbCAmJiB2ZWhpY2xlLmlzVHJhbnNsdWNlbnQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZEFjdGlvblBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidWlsZFJlZnJlc2hUcmVlQUNJKCkuZmlsbChwYW5lbCk7Ci0JfQotCQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlZnJlc2hUcmVlQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiUmVmcmVzaCB0cmVlIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmVmcmVzaFRyZWUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJSZWZyZXNoIHRoZSB0cmVlJ3MgbGFiZWxzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQkKLQl2b2lkIHJlZnJlc2hUcmVlKCkgewotCQl0cmVlLnJlZnJlc2goKTsKLQl9Ci0JCi0JcHJpdmF0ZSBWZWhpY2xlIHNlbGVjdGVkVmVoaWNsZSgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkVmVoaWNsZS5nZXRWYWx1ZSgpOwotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWZWhpY2xlVHlwZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyCi0JewotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiAoKFZlaGljbGVUeXBlKSBlbGVtZW50KS5kZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbG9yTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuICgoQ29sb3IpIGVsZW1lbnQpLmRlc2NyaXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQl7Ci0JCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb290KSB7Ci0JCQkJcmV0dXJuIG5ldyBSb290Q29udGVudFByb3ZpZGVyKAotCQkJCQkoUm9vdCkgaXRlbSwgKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgVmVoaWNsZUNvbnRlbnRQcm92aWRlcigKLQkJCQkoVmVoaWNsZSkgaXRlbSwgKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSb290Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxWZWhpY2xlPgotCXsKLQkJcHVibGljIFJvb3RDb250ZW50UHJvdmlkZXIoUm9vdCBpdGVtLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCQlzdXBlcihpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFZlaGljbGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8VmVoaWNsZT4oQ29sbGVjdGlvblRvb2xzLmxpc3QoKChSb290KSBtb2RlbCgpKS52ZWhpY2xlcygpKSk7Ci0JCX0KLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBWZWhpY2xlQ29udGVudFByb3ZpZGVyKFZlaGljbGUgaXRlbSwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIoaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gKChWZWhpY2xlKSBtb2RlbCgpKS5wYXJlbnQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbCBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IE51bGxMaXN0VmFsdWVNb2RlbCgpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGVMYWJlbFByb3ZpZGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotCXsKLQkJcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoT2JqZWN0IGVsZW1lbnQsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gbmV3IFZlaGljbGVMYWJlbFByb3ZpZGVyKChWZWhpY2xlKSBlbGVtZW50LCBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWZWhpY2xlTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBWZWhpY2xlTGFiZWxQcm92aWRlcihWZWhpY2xlIHZlaGljbGUsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCQlzdXBlcih2ZWhpY2xlLCBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFZlaGljbGUsIFN0cmluZz4oCi0JCQkJCW5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8VmVoaWNsZT4oKFZlaGljbGUpIG1vZGVsKCkpLCAKLQkJCQkJVmVoaWNsZS5WRUhJQ0xFX1RZUEVfUFJPUEVSVFksIFZlaGljbGUuQ09MT1JfUFJPUEVSVFkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5jb2xvcigpLmRlc2NyaXB0aW9uKCkgKyAnICcgKyBzdWJqZWN0LnZlaGljbGVUeXBlKCkuZGVzY3JpcHRpb24oKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VmVoaWNsZSwgSW1hZ2U+KAotCQkJCQluZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFZlaGljbGU+KChWZWhpY2xlKSBtb2RlbCgpKSwgCi0JCQkJCVZlaGljbGUuQ09MT1JfUFJPUEVSVFksIFZlaGljbGUuR1JFWUVEX1BST1BFUlRZLCBWZWhpY2xlLlRSQU5TTFVDRU5UX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEltYWdlIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5pbWFnZSgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVHJlZU5vZGUgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JewotCQlwcml2YXRlIFRyZWVOb2RlIHBhcmVudDsKLQkJCi0JCQotCQlwdWJsaWMgVHJlZU5vZGUoVHJlZU5vZGUgcGFyZW50KSB7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBUcmVlTm9kZSBwYXJlbnQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJvb3QgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHJvdGVjdGVkIGZpbmFsIFZlaGljbGVbXSB2ZWhpY2xlczsKLQkJCi0JCQotCQlwdWJsaWMgUm9vdCgpIHsKLQkJCXN1cGVyKG51bGwpOwotCQkJdmVoaWNsZXMgPSBuZXcgVmVoaWNsZVtdIHsKLQkJCQluZXcgVmVoaWNsZSh0aGlzLCBWZWhpY2xlVHlwZS5CSUNZQ0xFLCBDb2xvci5CTFVFKSwKLQkJCQluZXcgVmVoaWNsZSh0aGlzLCBWZWhpY2xlVHlwZS5DQVIsIENvbG9yLllFTExPVyksCi0JCQkJbmV3IFZlaGljbGUodGhpcywgVmVoaWNsZVR5cGUuVFJVQ0ssIENvbG9yLlJFRCksCi0JCQkJbmV3IFZlaGljbGUodGhpcywgVmVoaWNsZVR5cGUuQk9BVCwgQ29sb3IuR1JFRU4pfTsKLQkJfQotCQkKLQkJcHVibGljIFZlaGljbGVbXSB2ZWhpY2xlcygpIHsKLQkJCXJldHVybiB2ZWhpY2xlczsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWZWhpY2xlIGV4dGVuZHMgVHJlZU5vZGUKLQl7Ci0JCXByaXZhdGUgVmVoaWNsZVR5cGUgdmVoaWNsZVR5cGU7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZFSElDTEVfVFlQRV9QUk9QRVJUWSA9ICJ2ZWhpY2xlVHlwZSI7Ci0JCQotCQlwcml2YXRlIENvbG9yIGNvbG9yOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xPUl9QUk9QRVJUWSA9ICJjb2xvciI7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gZ3JleWVkID0gZmFsc2U7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEdSRVlFRF9QUk9QRVJUWSA9ICJncmV5ZWQiOwotCQkKLQkJcHJpdmF0ZSBib29sZWFuIHRyYW5zbHVjZW50ID0gZmFsc2U7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRSQU5TTFVDRU5UX1BST1BFUlRZID0gInRyYW5zbHVjZW50IjsKLQkJCi0JCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0JCQotCQkJCi0JCXB1YmxpYyBWZWhpY2xlKFRyZWVOb2RlIHBhcmVudCwgVmVoaWNsZVR5cGUgdmVoaWNsZVR5cGUsIENvbG9yIGNvbG9yKSB7Ci0JCQlzdXBlcihwYXJlbnQpOwotCQkJdGhpcy52ZWhpY2xlVHlwZSA9IHZlaGljbGVUeXBlOwotCQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQl9Ci0JCQotCQlwdWJsaWMgVmVoaWNsZVR5cGUgdmVoaWNsZVR5cGUoKSB7Ci0JCQlyZXR1cm4gdmVoaWNsZVR5cGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFZlaGljbGVUeXBlKFZlaGljbGVUeXBlIG5ld1ZlaGljbGVUeXBlKSB7Ci0JCQlWZWhpY2xlVHlwZSBvbGRWZWhpY2xlVHlwZSA9IHZlaGljbGVUeXBlOwotCQkJdmVoaWNsZVR5cGUgPSBuZXdWZWhpY2xlVHlwZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVkVISUNMRV9UWVBFX1BST1BFUlRZLCBvbGRWZWhpY2xlVHlwZSwgbmV3VmVoaWNsZVR5cGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgQ29sb3IgY29sb3IoKSB7Ci0JCQlyZXR1cm4gY29sb3I7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldENvbG9yKENvbG9yIG5ld0NvbG9yKSB7Ci0JCQlDb2xvciBvbGRDb2xvciA9IGNvbG9yOwotCQkJY29sb3IgPSBuZXdDb2xvcjsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MT1JfUFJPUEVSVFksIG9sZENvbG9yLCBuZXdDb2xvcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzR3JleWVkKCkgewotCQkJcmV0dXJuIGdyZXllZDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0R3JleWVkKGJvb2xlYW4gbmV3R3JleWVkKSB7Ci0JCQlib29sZWFuIG9sZEdyZXllZCA9IGdyZXllZDsKLQkJCWdyZXllZCA9IG5ld0dyZXllZDsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoR1JFWUVEX1BST1BFUlRZLCBvbGRHcmV5ZWQsIG5ld0dyZXllZCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzVHJhbnNsdWNlbnQoKSB7Ci0JCQlyZXR1cm4gdHJhbnNsdWNlbnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFRyYW5zbHVjZW50KGJvb2xlYW4gbmV3VHJhbnNsdWNlbnQpIHsKLQkJCWJvb2xlYW4gb2xkVHJhbnNsdWNlbnQgPSB0cmFuc2x1Y2VudDsKLQkJCXRyYW5zbHVjZW50ID0gbmV3VHJhbnNsdWNlbnQ7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRSQU5TTFVDRU5UX1BST1BFUlRZLCBvbGRUcmFuc2x1Y2VudCwgbmV3VHJhbnNsdWNlbnQpOwotCQl9Ci0JCQotCQlwdWJsaWMgSW1hZ2UgaW1hZ2UoKSB7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIEltYWdlRmFjdG9yeS5pbWFnZShjb2xvcigpLCBncmV5ZWQsIHRyYW5zbHVjZW50KTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBlbnVtIFZlaGljbGVUeXBlCi0JewotCQlCSUNZQ0xFKCJiaWN5Y2xlIiksCi0JCUNBUigiY2FyIiksCi0JCVRSVUNLKCJ0cnVjayIpLAotCQlCT0FUKCJib2F0Iik7Ci0JCQotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKLQkJCi0JCXByaXZhdGUgVmVoaWNsZVR5cGUoU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZW51bSBDb2xvcgotCXsKLQkJUkVEKCJyZWQiLCBuZXcgUkdCKDI1NSwgMCwgMCkpLAotCQlCTFVFKCJibHVlIiwgbmV3IFJHQigwLCAwLCAyNTUpKSwKLQkJWUVMTE9XKCJ5ZWxsb3ciLCBuZXcgUkdCKDI1NSwgMjU1LCAwKSksCi0JCUdSRUVOKCJncmVlbiIsIG5ldyBSR0IoMCwgMjU1LCAwKSk7Ci0JCQotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKLQkJCi0JCXByaXZhdGUgZmluYWwgUkdCIHJnYjsKLQkJCi0JCXByaXZhdGUgQ29sb3IoU3RyaW5nIGRlc2NyaXB0aW9uLCBSR0IgcmdiKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCQl0aGlzLnJnYiA9IHJnYjsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbjsKLQkJfQotCQkKLQkJcHVibGljIFJHQiByZ2IoKSB7Ci0JCQlyZXR1cm4gcmdiOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEltYWdlRmFjdG9yeQotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgUkdCIHJnYihDb2xvciBjb2xvciwgYm9vbGVhbiBncmV5ZWQsIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKLQkJCVJHQiByZ2IgPSAoZ3JleWVkKSA/IG5ldyBSR0IoMTI3LCAxMjcsIDEyNykgOiBjb2xvci5yZ2IoKTsKLQkJCWlmICh0cmFuc2x1Y2VudCkgewotCQkJCXJnYiA9IG5ldyBSR0IodHJhbnNsdWNpZnkocmdiLnJlZCksIHRyYW5zbHVjaWZ5KHJnYi5ncmVlbiksIHRyYW5zbHVjaWZ5KHJnYi5ibHVlKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmdiOwotCQl9Ci0JCQotCQlwcml2YXRlIHN0YXRpYyBpbnQgdHJhbnNsdWNpZnkoaW50IGNvbG9yKSB7Ci0JCQlyZXR1cm4gMjU1IC0gKGludCkgKCgyNTUgLSBjb2xvcikgKiAwLjMpOwotCQl9Ci0JCQotCQlwdWJsaWMgc3RhdGljIEltYWdlIGltYWdlKENvbG9yIGNvbG9yLCBib29sZWFuIGdyZXllZCwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgewotCQkJUGFsZXR0ZURhdGEgcGQgPSBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtyZ2IoY29sb3IsIGdyZXllZCwgdHJhbnNsdWNlbnQpfSk7Ci0JCQlJbWFnZURhdGEgaWQgPSBuZXcgSW1hZ2VEYXRhKDIwLCAyMCwgMSwgcGQpOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCAyMDsgeCArKykgewotCQkJCWZvciAoaW50IHkgPSAwOyB5IDwgMjA7IHkgKyspIHsKLQkJCQkJaWQuc2V0UGl4ZWwoeCwgeSwgMCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgaWQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyMDNkYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QgZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgZmluYWwgUm9vdCByb290OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZT4gc2VsZWN0ZWROb2RlOwotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIGNvbnRyb2xUcmVlOwotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHZpZXdUcmVlOwotCi0JcHJpdmF0ZSBUZXh0IG5vZGVOYW1lVGV4dDsKLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlXaW5kb3cgd2luZG93ID0gbmV3IERlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlclVpVGVzdChTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnJvb3QgPSBuZXcgUm9vdCgpOwotCQl0aGlzLnJvb3QuYWRkQ2hpbGQoIlBhcmVudF8xIik7Ci0JCXRoaXMuc2VsZWN0ZWROb2RlID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZT4odGhpcy5yb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dChDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJcGFyZW50LnNldFNpemUoODAwLCA0MDApOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidWlsZFRyZWVQYW5lbChtYWluUGFuZWwpOwotCQlidWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFRyZWVQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQlidWlsZENvbnRyb2xUcmVlUGFuZWwocGFuZWwpOwotCQlidWlsZFZpZXdUcmVlUGFuZWwocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xUcmVlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb250cm9sVHJlZSA9IGJ1aWxkVHJlZVBhbmVsKAotCQkJCXBhcmVudCwgIkNvbnRyb2wgdHJlZSIsCi0JCQkJbmV3IERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIobmV3IENvbnRyb2xUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSksCi0JCQkJbmV3IExhYmVsUHJvdmlkZXIoKSk7Ci0JCWNvbnRyb2xUcmVlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihidWlsZFRyZWVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSk7Ci0JCXNlbGVjdGVkTm9kZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWNvbnRyb2xUcmVlLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihldmVudC5nZXROZXdWYWx1ZSgpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFZpZXdUcmVlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl2aWV3VHJlZSA9IGJ1aWxkVHJlZVBhbmVsKAotCQkJCXBhcmVudCwgIlZpZXcgdHJlZSIsCi0JCQkJbmV3IERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIobmV3IFZpZXdUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSksCi0JCQkJbmV3IExhYmVsUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIGJ1aWxkVHJlZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQsIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciwgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJbGFiZWwuc2V0VGV4dChsYWJlbFRleHQpOwotCi0JCWZpbmFsIFRyZWVWaWV3ZXIgdHJlZSA9IG5ldyBUcmVlVmlld2VyKHBhbmVsLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCXRyZWUuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdHJlZS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdHJlZS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl0cmVlLnNldElucHV0KHJvb3QpOwotCi0JCXJldHVybiB0cmVlOwotCX0KLQotCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBidWlsZFRyZWVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU5vZGUgc2VsZWN0aW9uID0gKFRyZWVOb2RlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJc2VsZWN0ZWROb2RlLnNldFZhbHVlKChzZWxlY3Rpb24gPT0gbnVsbCkgPyByb290IDogc2VsZWN0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNiwgZmFsc2UpKTsKLQkJYnVpbGROb2RlTmFtZVRleHQocGFuZWwpOwotCQlidWlsZEFkZENoaWxkQUNJKCkuZmlsbChwYW5lbCk7Ci0JCWJ1aWxkQWRkTmVzdGVkQ2hpbGRBQ0koKS5maWxsKHBhbmVsKTsKLQkJYnVpbGRSZW1vdmVBQ0koKS5maWxsKHBhbmVsKTsKLQkJYnVpbGRDbGVhck1vZGVsQUNJKCkuZmlsbChwYW5lbCk7Ci0JCWJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTm9kZU5hbWVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbm9kZU5hbWVUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCW5vZGVOYW1lVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQWRkQ2hpbGRBQ0koKSB7Ci0JCWZpbmFsIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJBZGQgY2hpbGQiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlhZGRDaGlsZCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIkFkZCBhIGNoaWxkIHdpdGggdGhlIGdpdmVuIG5hbWUiKTsKLQkJc2VsZWN0ZWROb2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoKChUcmVlTm9kZSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuY2FuSGF2ZUNoaWxkcmVuKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQWRkTmVzdGVkQ2hpbGRBQ0koKSB7Ci0JCWZpbmFsIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJBZGQgbmVzdGVkIGNoaWxkIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYWRkTmVzdGVkQ2hpbGQoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJBZGQgYSBuZXN0ZWQgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSIpOwotCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNlbGVjdGVkTm9kZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKCgoVHJlZU5vZGUpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmNhbkhhdmVOZXN0ZWRDaGlsZHJlbigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlbW92ZUFDSSgpIHsKLQkJZmluYWwgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIlJlbW92ZSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJlbW92ZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIlJlbW92ZSB0aGUgc2VsZWN0ZWQgbm9kZSIpOwotCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNlbGVjdGVkTm9kZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKGV2ZW50LmdldE5ld1ZhbHVlKCkgIT0gcm9vdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiQ2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQljbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiQ2xlYXIgdGhlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlc3RvcmVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIlJlc3RvcmUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJSZXN0b3JlIHRoZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIGFkZENoaWxkKCkgewotCQlTdHJpbmcgbm9kZU5hbWUgPSBub2RlTmFtZVRleHQuZ2V0VGV4dCgpOwotCQlpZiAobm9kZU5hbWUubGVuZ3RoKCkgIT0gMCkgewotCQkJc2VsZWN0ZWROb2RlLmdldFZhbHVlKCkuYWRkQ2hpbGQobm9kZU5hbWUpOwotCQl9Ci0JfQotCi0Jdm9pZCBhZGROZXN0ZWRDaGlsZCgpIHsKLQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZU5hbWVUZXh0LmdldFRleHQoKTsKLQkJaWYgKG5vZGVOYW1lLmxlbmd0aCgpICE9IDApIHsKLQkJCXNlbGVjdGVkTm9kZS5nZXRWYWx1ZSgpLmFkZE5lc3RlZENoaWxkKG5vZGVOYW1lKTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlKCkgewotCQlUcmVlTm9kZSBub2RlID0gc2VsZWN0ZWROb2RlLmdldFZhbHVlKCk7Ci0JCW5vZGUucGFyZW50KCkucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQljb250cm9sVHJlZS5zZXRJbnB1dChudWxsKTsKLQkJdmlld1RyZWUuc2V0SW5wdXQobnVsbCk7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCWNvbnRyb2xUcmVlLnNldElucHV0KHJvb3QpOwotCQl2aWV3VHJlZS5zZXRJbnB1dChyb290KTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJcmV0dXJuIG5ldyBHZW5lcmljVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJKFRyZWVOb2RlKSBpdGVtLCAoRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250cm9sVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQl7Ci0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZpZXdUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQkJZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBQYXJlbnQpIHsKLQkJCQlyZXR1cm4gbmV3IFZpZXdUcmVlUGFyZW50SXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQkJCShQYXJlbnQpIGl0ZW0sIChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR2VuZXJpY1RyZWVJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxUcmVlTm9kZT4KLQl7Ci0JCXB1YmxpYyBHZW5lcmljVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJVHJlZU5vZGUgdHJlZU5vZGUsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCQlzdXBlcih0cmVlTm9kZSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCi0JCXByb3RlY3RlZCBUcmVlTm9kZSB0cmVlTm9kZSgpIHsKLQkJCXJldHVybiAoVHJlZU5vZGUpIG1vZGVsKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFRyZWVOb2RlIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiB0cmVlTm9kZSgpLnBhcmVudCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUcmVlTm9kZSwgVHJlZU5vZGU+KFRyZWVOb2RlLkNISUxEUkVOX0xJU1QsIHRyZWVOb2RlKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRyZWVOb2RlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQlyZXR1cm4gdHJlZU5vZGUoKS5jaGlsZHJlbigpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWaWV3VHJlZVBhcmVudEl0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBHZW5lcmljVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBWaWV3VHJlZVBhcmVudEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJVHJlZU5vZGUgdHJlZU5vZGUsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCQlzdXBlcih0cmVlTm9kZSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgVHJlZU5vZGUgZ2V0UGFyZW50KCkgewotCQkJVHJlZU5vZGUgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KCk7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTmVzdCkgewotCQkJCXBhcmVudCA9IHBhcmVudC5wYXJlbnQoKTsKLQkJCX0KLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlyZXR1cm4gYnVpbGRDaGlsZHJlbk1vZGVsKAotCQkJCQluZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGUsIFRyZWVOb2RlPihzdXBlci5idWlsZENoaWxkcmVuTW9kZWwoKSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGU+IHRyYW5zZm9ybShUcmVlTm9kZSB2YWx1ZSkgewotCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIE5lc3QpIHsKLQkJCQkJCQkJZmluYWwgTmVzdCBuZXN0ID0gKE5lc3QpIHZhbHVlOwotCQkJCQkJCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8VHJlZU5vZGU+KAotCQkJCQkJCQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUcmVlTm9kZSwgVHJlZU5vZGU+KFRyZWVOb2RlLkNISUxEUkVOX0xJU1QsIG5lc3QpIHsKLQkJCQkJCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8VHJlZU5vZGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJCQkJCQkJCQlyZXR1cm4gbmVzdC5jaGlsZHJlbigpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXJldHVybiBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGU+KENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHZhbHVlKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiAoKFRyZWVOb2RlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFRyZWVOb2RlIGV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCXsKLQkJcHJpdmF0ZSBUcmVlTm9kZSBwYXJlbnQ7Ci0KLQkJcHJvdGVjdGVkIGZpbmFsIExpc3Q8VHJlZU5vZGU+IGNoaWxkcmVuOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDSElMRFJFTl9MSVNUID0gImNoaWxkcmVuIjsKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQotCQlwdWJsaWMgVHJlZU5vZGUoVHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxUcmVlTm9kZT4oKTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgVHJlZU5vZGUgcGFyZW50KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxUcmVlTm9kZT4oY2hpbGRyZW4pOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGQoVHJlZU5vZGUgY2hpbGQpIHsKLQkJCWFkZEl0ZW1Ub0xpc3QoY2hpbGQsIGNoaWxkcmVuLCBDSElMRFJFTl9MSVNUKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKFRyZWVOb2RlIGNoaWxkKSB7Ci0JCQlyZW1vdmVJdGVtRnJvbUxpc3QoY2hpbGQsIGNoaWxkcmVuLCBDSElMRFJFTl9MSVNUKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKGludCBpbmRleCkgewotCQkJcmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCBjaGlsZHJlbiwgQ0hJTERSRU5fTElTVCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJCW5hbWUgPSBuZXdOYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVOZXN0ZWRDaGlsZHJlbigpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZE5lc3RlZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm9vdCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwdWJsaWMgUm9vdCgpIHsKLQkJCXN1cGVyKG51bGwsIG51bGwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQlhZGRDaGlsZChuZXcgUGFyZW50KHRoaXMsIG5hbWUpKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFyZW50IGV4dGVuZHMgVHJlZU5vZGUKLQl7Ci0JCXB1YmxpYyBQYXJlbnQoVHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIocGFyZW50LCBuYW1lKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5IYXZlQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhZGRDaGlsZChTdHJpbmcgbmFtZSkgewotCQkJYWRkQ2hpbGQobmV3IENoaWxkKHRoaXMsIG5hbWUpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5IYXZlTmVzdGVkQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhZGROZXN0ZWRDaGlsZChTdHJpbmcgbmFtZSkgewotCQkJVHJlZU5vZGUgbmVzdCA9IG5ldyBOZXN0KHRoaXMpOwotCQkJYWRkQ2hpbGQobmVzdCk7Ci0JCQluZXN0LmFkZENoaWxkKG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPENoaWxkPiBuZXN0bGVzc0NoaWxkcmVuKCkgewotCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxDaGlsZCwgQ2hpbGQ+KAotCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUcmVlTm9kZSwgQ2hpbGQ+KGNoaWxkcmVuKCkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIENoaWxkIHRyYW5zZm9ybShUcmVlTm9kZSBuZXh0KSB7Ci0JCQkJCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBOZXN0KSB7Ci0JCQkJCQkJCXJldHVybiAoKE5lc3QpIG5leHQpLmNoaWxkKCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiAoQ2hpbGQpIG5leHQ7Ci0JCQkJCQl9Ci0JCQkJCX0pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoQ2hpbGQgYykgewotCQkJCQlyZXR1cm4gYyAhPSBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5lc3QgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHVibGljIE5lc3QoVHJlZU5vZGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsICJuZXN0Iik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gY2FuSGF2ZUNoaWxkcmVuKCkgewotCQkJcmV0dXJuIGNoaWxkcmVuLnNpemUoKSA9PSAwOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQlhZGRDaGlsZChuZXcgQ2hpbGQodGhpcywgbmFtZSkpOwotCQl9Ci0KLQkJLyogY2FuIG9ubHkgaGF2ZSBvbmUgY2hpbGQgKi8KLQkJcHVibGljIENoaWxkIGNoaWxkKCkgewotCQkJcmV0dXJuIChjaGlsZHJlbi5pc0VtcHR5KCkpID8gbnVsbCA6IChDaGlsZCkgY2hpbGRyZW4uZ2V0KDApOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGlsZCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwdWJsaWMgQ2hpbGQoVHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIocGFyZW50LCBuYW1lKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0MjhhMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkV4dGVuc2lvblRlc3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuVGVzdEpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuUHJvamVjdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci0KLXB1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXByb3RlY3RlZCBUZXN0SnBhUHJvamVjdCB0ZXN0UHJvamVjdDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJFeHRlbnNpb25UZXN0UHJvamVjdCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gImV4dGVuc2lvbi50ZXN0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExVR0lOX0NMQVNTID0gRXh0ZW5zaW9uVGVzdFBsdWdpbi5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTFVHSU5fSUQgPSBFeHRlbnNpb25UZXN0UGx1Z2luLlBMVUdJTl9JRDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExBVEZPUk1fSUQgPSBUZXN0SnBhUGxhdGZvcm0uSUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9DTEFTUyA9IFRlc3RKcGFQbGF0Zm9ybS5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9MQUJFTCA9ICJUZXN0IEpwYSBQbGF0Zm9ybSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1VJX1BMQVRGT1JNX0lEID0gVEVTVF9QTEFURk9STV9JRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1VJX1BMQVRGT1JNX0NMQVNTID0gVGVzdEpwYVBsYXRmb3JtVWkuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIEpwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnRlc3RQcm9qZWN0ID0gdGhpcy5idWlsZEpwYVByb2plY3QoUFJPSkVDVF9OQU1FLCBmYWxzZSk7ICAvLyBmYWxzZSA9IG5vIGF1dG8tYnVpbGQKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRlc3RKcGFQcm9qZWN0KHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOyAgLy8gZmFsc2UgPSBubyBhdXRvLWJ1aWxkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy90ZXN0UHJvamVjdC5kaXNwb3NlKCk7Ci0JCVByb2plY3RVdGlsaXR5LmRlbGV0ZUFsbFByb2plY3RzKCk7Ci0JCXRoaXMudGVzdFByb2plY3QgPSBudWxsOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGpwYVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLnRlc3RQcm9qZWN0LmdldEpwYVByb2plY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SnBhUGxhdGZvcm0oKSB7Ci0JCWFzc2VydE5vdE51bGwoSnBhUGxhdGZvcm1SZWdpc3RyeS5pbnN0YW5jZSgpLmdldEpwYVBsYXRmb3JtKGpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpLmdldElkKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcHRVaVBsYXRmb3JtVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcHRVaVBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiY2M5OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnB0VWlQbGF0Zm9ybVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVaVBsYXRmb3JtVGVzdHMKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VWlQbGF0Zm9ybVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VWlQbGF0Zm9ybVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0Fic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0Fic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNGMxNzUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZURpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdCB7Ci0KLQlwcml2YXRlIE1vZGVsIG1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U2ltcGxlRGlzcGxheWFibGU+IHNlbGVjdGVkSXRlbUhvbGRlcjsKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+IHN1YmplY3RIb2xkZXI7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkRW1wdHlMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQkJcG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxNb2RlbCwgU2ltcGxlRGlzcGxheWFibGU+KHN1YmplY3RIb2xkZXIsIE1vZGVsLklURU1TX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pdGVtcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaXRlbXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBTaW1wbGVEaXNwbGF5YWJsZSBidWlsZFNlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiYmF6Iik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1vZGVsLCBTaW1wbGVEaXNwbGF5YWJsZT4oc3ViamVjdEhvbGRlciwgTW9kZWwuSVRFTV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2ltcGxlRGlzcGxheWFibGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0SXRlbSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTaW1wbGVEaXNwbGF5YWJsZSB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0SXRlbSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0NvbnZlcnRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFNpbXBsZURpc3BsYXlhYmxlPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFNpbXBsZURpc3BsYXlhYmxlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/ICIiIDogdmFsdWUuZGlzcGxheVN0cmluZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+IGJ1aWxkU3ViamVjdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+KCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBjb21ib1NlbGVjdGVkSXRlbSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZW1wdHlDb21ib0NhbkhhdmVTZWxlY3RlZFZhbHVlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGl0ZW1BdChpbnQgaW5kZXgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGludCBpdGVtQ291bnRzKCk7Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248U2ltcGxlRGlzcGxheWFibGU+IGMpIHsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJmb28iKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiYmFyIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImJheiIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqb28iKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiamFyIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImpheiIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U2ltcGxlRGlzcGxheWFibGU+IHNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJcmV0dXJuIHNlbGVjdGVkSXRlbUhvbGRlcjsKLQl9Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzaGVsbCAgICAgICAgICAgICAgPSBuZXcgU2hlbGwoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQltb2RlbCAgICAgICAgICAgICAgPSBuZXcgTW9kZWwoKTsKLQkJc3ViamVjdEhvbGRlciAgICAgID0gYnVpbGRTdWJqZWN0SG9sZGVyKCk7Ci0JCXNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFNoZWxsIHNoZWxsKCkgewotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBzdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gc3ViamVjdEhvbGRlcjsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzaGVsbCAgICAgICAgICAgICAgPSBudWxsOwotCQlzdWJqZWN0SG9sZGVyICAgICAgPSBudWxsOwotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0SXRlbXMoKSB7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBjb3VudCBvZiBpdGVtcyBpcyBub3QgaW4gc3luYyB3aXRoIHRoZSBtb2RlbCIsCi0JCQltb2RlbC5pdGVtc1NpemUoKSwKLQkJCWl0ZW1Db3VudHMoKQotCQkpOwotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBtb2RlbC5pdGVtc1NpemUoKTsgaW5kZXgrKykgewotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgaXRlbSBhdCBpbmRleCAiICsgaW5kZXggKyAiIGlzIG5vdCB0aGUgc2FtZSBiZXR3ZWVuIHRoZSBtb2RlbCBhbmQgdGhlIGNvbWJvIiwKLQkJCQltb2RlbC5pdGVtQXQoaW5kZXgpLmRpc3BsYXlTdHJpbmcoKSwKLQkJCQlpdGVtQXQoaW5kZXgpCi0JCQkpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9BZGRlZEFmdGVyX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3RSZW1vdmVJdGVtc19BZGRlZEFmdGVyKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9BZGRlZEFmdGVyX1JlbW92ZUl0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3RSZW1vdmVJdGVtc19BZGRlZEFmdGVyKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9BZGRlZEJlZm9yZV9SZW1vdmVJdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCi0JCUFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPigpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDApKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgzKSk7Ci0JCW1vZGVsLnJlbW92ZUl0ZW1zKGl0ZW1zLml0ZXJhdG9yKCkpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX0FkZGVkQmVmb3JlX1JlbW92ZUl0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0KLQkJQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMCkpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDMpKTsKLQkJbW9kZWwucmVtb3ZlSXRlbXMoaXRlbXMuaXRlcmF0b3IoKSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0FmdGVyQWZ0ZXJfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0FmdGVyQWZ0ZXJfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0FmdGVyQmVmb3JlX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNBZnRlckJlZm9yZV9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQmVmb3JlX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQmVmb3JlX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9TZWxlY3RlZEl0ZW1DaGFuZ2VkX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMCk7Ci0KLQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYWRhcHRlciA9IGJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlhZGFwdGVyLmFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW1DaGFuZ2VkKHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1BZnRlcl9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGJ1aWxkU2VsZWN0ZWRJdGVtKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUFmdGVyX0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gYnVpbGRTZWxlY3RlZEl0ZW0oKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQWZ0ZXJfSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0ID0gYnVpbGRMaXN0KCk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGxpc3QuZ2V0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1BZnRlcl9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGxpc3QgPSBidWlsZExpc3QoKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbGlzdC5nZXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUJlZm9yZV9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUJlZm9yZV9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUJlZm9yZV9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGxpc3QgPSBidWlsZExpc3QoKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbGlzdC5nZXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQmVmb3JlX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdCA9IGJ1aWxkTGlzdCgpOwotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBsaXN0LmdldCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSBpcyBzdXBwb3NlZCB0byByZW1haW4gbnVsbCIsIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSBpcyBzdXBwb3NlZCB0byByZW1haW4gbnVsbCIsIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCWFzc2VydEZhbHNlKCJUaGUgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydE51bGwoIlRoZSBzZWxlY3RlZCBpdGVtIGlzIHN1cHBvc2VkIHRvIHJlbWFpbiBudWxsIiwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gaXMgc3VwcG9zZWQgdG8gcmVtYWluIG51bGwiLCBtb2RlbC5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9TZWxlY3RlZEl0ZW1DaGFuZ2VkX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgzKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYWRhcHRlciA9IGJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlhZGFwdGVyLmFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW1DaGFuZ2VkKHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0TnVsbFN1YmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSBzaG91bGQgYmUgbnVsbCIsIHNlbGVjdGVkSXRlbUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUoYnVpbGRTZWxlY3RlZEl0ZW0oKSk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJLy8gTnVsbCBiZWNhdXNlIHRoZSBzdWJqZWN0IGhvbGRlciBkb2Vzbid0IGhhdmUgdGhlIHN1YmplY3Qgc2V0Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE51bGxTdWJqZWN0X051bGxTZWxlY3RlZEl0ZW1fSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3ROdWxsU3ViamVjdCgpOwotCQl0ZXN0SXRlbXMoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3ViamVjdF9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0TnVsbFN1YmplY3QoKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN1YmplY3RfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0TnVsbFN1YmplY3QoKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN1YmplY3RfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0TnVsbFN1YmplY3QoKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RSZW1vdmVJdGVtc19BZGRlZEFmdGVyKCkgewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0KLQkJQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMCkpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDMpKTsKLQkJbW9kZWwucmVtb3ZlSXRlbXMoaXRlbXMuaXRlcmF0b3IoKSk7Ci0KLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RTZWxlY3RlZEl0ZW0oU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtKSB7Ci0KLQkJaWYgKHNlbGVjdGVkSXRlbSA9PSBudWxsKSB7Ci0KLQkJCWFzc2VydE51bGwoCi0JCQkJIlRoZSBzZWxlY3RlZCBpdGVtIGlzIHN1cHBvc2VkIHRvIGJlIG51bGwiLAotCQkJCW1vZGVsLmdldEl0ZW0oKQotCQkJKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgY29tYm8ncyBzZWxlY3RlZCBpdGVtIHNob3VsZCBiZSBudWxsIiwKLQkJCQkiIiwKLQkJCQljb21ib1NlbGVjdGVkSXRlbSgpCi0JCQkpOwotCQl9Ci0JCWVsc2UgaWYgKCFlbXB0eUNvbWJvQ2FuSGF2ZVNlbGVjdGVkVmFsdWUoKSkgewotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgY29ycmVjdGx5IiwKLQkJCQlzZWxlY3RlZEl0ZW0sCi0JCQkJbW9kZWwuZ2V0SXRlbSgpCi0JCQkpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBjb21ibydzIHNlbGVjdGVkIGl0ZW0gc2hvdWxkIGJlIG51bGwiLAotCQkJCSIiLAotCQkJCWNvbWJvU2VsZWN0ZWRJdGVtKCkKLQkJCSk7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBjb3JyZWN0bHkiLAotCQkJCXNlbGVjdGVkSXRlbSwKLQkJCQltb2RlbC5nZXRJdGVtKCkKLQkJCSk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBjb3JyZWN0bHkiLAotCQkJCXNlbGVjdGVkSXRlbS5kaXNwbGF5U3RyaW5nKCksCi0JCQkJY29tYm9TZWxlY3RlZEl0ZW0oKQotCQkJKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0U2VsZWN0ZWRJdGVtQ2hhbmdlZChTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0KLQkJLy8gVGVzdCAxCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0aW9uTGlzdGVuZXIuaXNMaXN0ZW5lck5vdGlmaWVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0ZWRJdGVtLCBzZWxlY3Rpb25MaXN0ZW5lci5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0KLQkJLy8gVGVzdCAyCi0JCXNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgxKTsKLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlzZWxlY3Rpb25MaXN0ZW5lci5jbGVhckluZm8oKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGlvbkxpc3RlbmVyLmlzTGlzdGVuZXJOb3RpZmllZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCi0JCS8vIFRlc3QgMwotCQlzZWxlY3RlZEl0ZW0gPSBudWxsOwotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCXNlbGVjdGlvbkxpc3RlbmVyLmNsZWFySW5mbygpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5IiwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGlvbkxpc3RlbmVyLmlzTGlzdGVuZXJOb3RpZmllZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCi0JCS8vIFRlc3QgMwotCQlzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMik7Ci0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJc2VsZWN0aW9uTGlzdGVuZXIuY2xlYXJJbmZvKCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3Rpb25MaXN0ZW5lci5pc0xpc3RlbmVyTm90aWZpZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgU2ltcGxlRGlzcGxheWFibGUgaXRlbTsKLQkJcHJpdmF0ZSBMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtczsKLQkJcHJpdmF0ZSBib29sZWFuIHNldEl0ZW1DYWxsZWQ7Ci0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNX1BST1BFUlRZID0gIml0ZW0iOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIElURU1TX0xJU1QgPSAiaXRlbXMiOwotCi0JCXZvaWQgYWRkSXRlbXMoSXRlcmF0b3I8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zKSB7Ci0JCQlhZGRJdGVtc1RvTGlzdChpdGVtcywgdGhpcy5pdGVtcywgSVRFTVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIGFkZEl0ZW1zKExpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zKSB7Ci0JCQlhZGRJdGVtc1RvTGlzdChpdGVtcywgdGhpcy5pdGVtcywgSVRFTVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIGNsZWFySXRlbUNhbGxlZEZsYWcoKSB7Ci0JCQlzZXRJdGVtQ2FsbGVkID0gZmFsc2U7Ci0JCX0KLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBnZXRJdGVtKCkgewotCQkJcmV0dXJuIGl0ZW07Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJCWl0ZW1zID0gbmV3IEFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQkJfQotCi0JCWJvb2xlYW4gaXNTZXRJdGVtQ2FsbGVkKCkgewotCQkJcmV0dXJuIHNldEl0ZW1DYWxsZWQ7Ci0JCX0KLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBpdGVtQXQoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVtcy5nZXQoaW5kZXgpOwotCQl9Ci0KLQkJTGlzdEl0ZXJhdG9yPFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcygpIHsKLQkJCXJldHVybiBpdGVtcy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCi0JCWludCBpdGVtc1NpemUoKSB7Ci0JCQlyZXR1cm4gaXRlbXMuc2l6ZSgpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVJdGVtcyhJdGVyYXRvcjxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMpIHsKLQkJCXJlbW92ZUl0ZW1zRnJvbUxpc3QoaXRlbXMsIHRoaXMuaXRlbXMsIElURU1TX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCBzZXRJdGVtKFNpbXBsZURpc3BsYXlhYmxlIGl0ZW0pIHsKLQkJCXNldEl0ZW1DYWxsZWQgPSB0cnVlOwotCi0JCQlTaW1wbGVEaXNwbGF5YWJsZSBvbGRJdGVtID0gdGhpcy5pdGVtOwotCQkJdGhpcy5pdGVtID0gaXRlbTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSVRFTV9QUk9QRVJUWSwgb2xkSXRlbSwgaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8U2ltcGxlRGlzcGxheWFibGU+IHsKLQotCQlwcml2YXRlIFNpbXBsZURpc3BsYXlhYmxlIGl0ZW07Ci0JCXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5lck5vdGlmaWVkOwotCi0JCXZvaWQgY2xlYXJJbmZvKCkgewotCQkJdGhpcy5saXN0ZW5lck5vdGlmaWVkID0gZmFsc2U7Ci0JCQl0aGlzLml0ZW0gPSBudWxsOwotCQl9Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgZ2V0SXRlbSgpIHsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNMaXN0ZW5lck5vdGlmaWVkKCkgewotCQkJcmV0dXJuIGxpc3RlbmVyTm90aWZpZWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PFNpbXBsZURpc3BsYXlhYmxlPiBlKSB7Ci0JCQlsaXN0ZW5lck5vdGlmaWVkID0gdHJ1ZTsKLQkJCWl0ZW0gPSBlLnNlbGVjdGVkSXRlbSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9DQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0NDb21ib01vZGVsQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNmMTQzZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0NDb21ib01vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQ0NvbWJvTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZURpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotCi1wdWJsaWMgY2xhc3MgQ0NvbWJvTW9kZWxBZGFwdGVyVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXJUZXN0IHsKLQotCXByaXZhdGUgQ0NvbWJvIGNvbWJvOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpIHsKLQotCQljb21ibyA9IG5ldyBDQ29tYm8oc2hlbGwoKSwgU1dULk5VTEwpOwotCi0JCXJldHVybiBDQ29tYm9Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlidWlsZExpc3RIb2xkZXIoKSwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJY29tYm8sCi0JCQlidWlsZFN0cmluZ0NvbnZlcnRlcigpCi0JCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpIHsKLQotCQljb21ibyA9IG5ldyBDQ29tYm8oc2hlbGwoKSwgU1dULlJFQURfT05MWSk7Ci0KLQkJcmV0dXJuIENDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWJ1aWxkTGlzdEhvbGRlcigpLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQljb21ibywKLQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbWJvU2VsZWN0ZWRJdGVtKCkgewotCQlyZXR1cm4gY29tYm8uZ2V0VGV4dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGVtcHR5Q29tYm9DYW5IYXZlU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBpdGVtQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvLmdldEl0ZW0oaW5kZXgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgaXRlbUNvdW50cygpIHsKLQkJcmV0dXJuIGNvbWJvLmdldEl0ZW1Db3VudCgpOwotCX0KLQotCUBBZnRlcgotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWNvbWJvID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0NoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0NoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyY2YxMzkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9DaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5Cb29sZWFuQnV0dG9uTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGNoZWNrIGJveGVzLgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMUhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcySG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbm90RmxhZzJIb2xkZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QoU3RyaW5nW10gYXJncykgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKHRydWUsIHRydWUpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuZmxhZzFIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzFIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcySG9sZGVyID0gdGhpcy5idWlsZEZsYWcySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5ub3RGbGFnMkhvbGRlciA9IHRoaXMuYnVpbGROb3RGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcxSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuRkxBRzFfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzEodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLkZMQUcyX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRmxhZzIoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEZsYWcyKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTm90RmxhZzJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5OT1RfRkxBRzJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNOb3RGbGFnMigpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Tm90RmxhZzIodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcykpOwotCQlwYXJlbnQuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIGNoZWNrQm94UGFuZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgY2hlY2tCb3hQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQ2hlY2tCb3hQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zNSk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxhZzFDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRGbGFnMkNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZE5vdEZsYWcyQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkVW5hdHRhY2hlZENoZWNrQm94KHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxhZzFDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBjaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQljaGVja0JveC5zZXRUZXh0KCJmbGFnIDEiKTsKLQkJQm9vbGVhbkJ1dHRvbk1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLmZsYWcxSG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxhZzJDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBjaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQljaGVja0JveC5zZXRUZXh0KCJmbGFnIDIiKTsKLQkJQm9vbGVhbkJ1dHRvbk1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLmZsYWcySG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTm90RmxhZzJDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBjaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQljaGVja0JveC5zZXRUZXh0KCJub3QgZmxhZyAyIik7Ci0JCUJvb2xlYW5CdXR0b25Nb2RlbEFkYXB0ZXIuYWRhcHQodGhpcy5ub3RGbGFnMkhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuYXR0YWNoZWRDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBjaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQljaGVja0JveC5zZXRUZXh0KCJ1bmF0dGFjaGVkIik7Ci0JCWNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRVbmF0dGFjaGVkU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFVuYXR0YWNoZWRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIGRlZmF1bHQgc2VsZWN0ZWQ6ICIgKyBlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYXR0YWNoZWQgc2VsZWN0ZWQ6ICIgKyBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBjaGVja0JveFBhbmVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2hlY2tCb3hQYW5lbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRGbGlwRmxhZzFCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkTm90RmxhZzJUb2dnbGVCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxpcEZsYWcxQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZEZsaXBGbGFnMUFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRGbGlwRmxhZzFBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJmbGlwIGZsYWcgMSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuZmxpcEZsYWcxKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiZmxpcCBmbGFnIDEiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBmbGlwRmxhZzEoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldEZsYWcxKCAhIHRoaXMudGVzdE1vZGVsLmlzRmxhZzEoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTm90RmxhZzJUb2dnbGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlRPR0dMRSk7Ci0JCWNoZWNrQm94LnNldFRleHQoIm5vdCBmbGFnIDIiKTsKLQkJQm9vbGVhbkJ1dHRvbk1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLm5vdEZsYWcySG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZXN0b3JlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRQcmludE1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFByaW50TW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJwcmludCBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInByaW50IG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJmbGFnIDE6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcxKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImZsYWcgMjogIiArIHRoaXMudGVzdE1vZGVsLmlzRmxhZzIoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibm90IGZsYWcgMjogIiArIHRoaXMudGVzdE1vZGVsLmlzTm90RmxhZzIoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiKioqIik7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGJvb2xlYW4gZmxhZzE7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHMV9QUk9QRVJUWSA9ICJmbGFnMSI7Ci0JCXByaXZhdGUgYm9vbGVhbiBmbGFnMjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUcyX1BST1BFUlRZID0gImZsYWcyIjsKLQkJcHJpdmF0ZSBib29sZWFuIG5vdEZsYWcyOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0ZMQUcyX1BST1BFUlRZID0gIm5vdEZsYWcyIjsKLQkKLQkJcHVibGljIFRlc3RNb2RlbChib29sZWFuIGZsYWcxLCBib29sZWFuIGZsYWcyKSB7Ci0JCQl0aGlzLmZsYWcxID0gZmxhZzE7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLm5vdEZsYWcyID0gISBmbGFnMjsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZsYWcxKCkgewotCQkJcmV0dXJuIHRoaXMuZmxhZzE7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RmxhZzEoYm9vbGVhbiBmbGFnMSkgewotCQkJYm9vbGVhbiBvbGQgPSB0aGlzLmZsYWcxOwotCQkJdGhpcy5mbGFnMSA9IGZsYWcxOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZMQUcxX1BST1BFUlRZLCBvbGQsIGZsYWcxKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMuZmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RmxhZzIoYm9vbGVhbiBmbGFnMikgewotCQkJYm9vbGVhbiBvbGQgPSB0aGlzLmZsYWcyOwotCQkJdGhpcy5mbGFnMiA9IGZsYWcyOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZMQUcyX1BST1BFUlRZLCBvbGQsIGZsYWcyKTsKLQkKLQkJCW9sZCA9IHRoaXMubm90RmxhZzI7Ci0JCQl0aGlzLm5vdEZsYWcyID0gISBmbGFnMjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOT1RfRkxBRzJfUFJPUEVSVFksIG9sZCwgdGhpcy5ub3RGbGFnMik7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNOb3RGbGFnMigpIHsKLQkJCXJldHVybiB0aGlzLm5vdEZsYWcyOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5vdEZsYWcyKGJvb2xlYW4gbm90RmxhZzIpIHsKLQkJCXRoaXMuc2V0RmxhZzIoICEgbm90RmxhZzIpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoIiArIHRoaXMuaXNGbGFnMSgpICsgIiAtICIgKyB0aGlzLmlzRmxhZzIoKSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9Db21ib01vZGVsQWRhcHRlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYjE1MmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9Db21ib01vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuQ29tYm9Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuU2ltcGxlRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21ib01vZGVsQWRhcHRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdCB7Ci0KLQlwcml2YXRlIENvbWJvIGNvbWJvOwotCXByaXZhdGUgYm9vbGVhbiBlZGl0YWJsZTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKSB7Ci0KLQkJY29tYm8gPSBuZXcgQ29tYm8oc2hlbGwoKSwgU1dULk5VTEwpOwotCQllZGl0YWJsZSA9IHRydWU7Ci0KLQkJcmV0dXJuIENvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJYnVpbGRMaXN0SG9sZGVyKCksCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCWNvbWJvLAotCQkJYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKSB7Ci0KLQkJY29tYm8gPSBuZXcgQ29tYm8oc2hlbGwoKSwgU1dULlJFQURfT05MWSk7Ci0JCWVkaXRhYmxlID0gZmFsc2U7Ci0KLQkJcmV0dXJuIENvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJYnVpbGRMaXN0SG9sZGVyKCksCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCWNvbWJvLAotCQkJYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29tYm9TZWxlY3RlZEl0ZW0oKSB7Ci0JCXJldHVybiBjb21iby5nZXRUZXh0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW1wdHlDb21ib0NhbkhhdmVTZWxlY3RlZFZhbHVlKCkgewotCQlyZXR1cm4gZWRpdGFibGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBpdGVtQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvLmdldEl0ZW0oaW5kZXgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgaXRlbUNvdW50cygpIHsKLQkJcmV0dXJuIGNvbWJvLmdldEl0ZW1Db3VudCgpOwotCX0KLQotCUBBZnRlcgotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWNvbWJvID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0pwdFVpU1dUVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvSnB0VWlTV1RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmE4YzJmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvSnB0VWlTV1RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuSlVuaXQ0VGVzdEFkYXB0ZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGUuU3VpdGVDbGFzc2VzOwotCi1AU3VpdGVDbGFzc2VzCi0oewotCUNDb21ib01vZGVsQWRhcHRlclRlc3QuY2xhc3MsCi0JQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmNsYXNzLAotCVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0LmNsYXNzLAotCVRhYmxlTW9kZWxBZGFwdGVyVGVzdC5jbGFzcwotfSkKLUBSdW5XaXRoKFN1aXRlLmNsYXNzKQotcHVibGljIGZpbmFsIGNsYXNzIEpwdFVpU1dUVGVzdHMgewotCi0JcHJpdmF0ZSBKcHRVaVNXVFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgSlVuaXQ0VGVzdEFkYXB0ZXIoSnB0VWlTV1RUZXN0cy5jbGFzcykpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9MaXN0Qm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0xpc3RCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlZmM1MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0xpc3RCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5MaXN0Qm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuTGlzdEJveE1vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBhbiBleGFtcGxlIFVJIGZvciB0ZXN0aW5nIHZhcmlvdXMgcGVybXV0YXRpb25zIG9mIHRoZQotICogU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIExpc3RCb3hNb2RlbEFkYXB0ZXJVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JZmluYWwgVGFza0xpc3QgdGFza0xpc3Q7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBUZXh0IHRhc2tUZXh0RmllbGQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBMaXN0Qm94TW9kZWxBZGFwdGVyVUlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Qm94TW9kZWxBZGFwdGVyVUlUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMudGFza0xpc3QgPSBuZXcgVGFza0xpc3QoKTsKLQkJdGhpcy50YXNrTGlzdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+KHRoaXMudGFza0xpc3QpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soInN3aW0iKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJiaWtlIik7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygicnVuIik7Ci0JCVRhc2sgcmVzdCA9IHRoaXMudGFza0xpc3QuYWRkVGFzaygicmVzdCIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFByaW9yaXR5VGFzayhyZXN0KTsKLQkJVGFzayByZXBlYXQgPSB0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJlcGVhdCIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFByaW9yaXR5VGFzayhyZXBlYXQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcykpOwotCQlwYXJlbnQuc2V0U2l6ZSg4MDAsIDQwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIHRhc2tMaXN0UGFuZWwgPSB0aGlzLmJ1aWxkVGFza0xpc3RQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgdGFza0xpc3RQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdFBhbmVsKHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRPYmplY3RUYXNrTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDUwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFVuc29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgInByaW1pdGl2ZSB1bnNvcnRlZCIsIHRoaXMuYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpLCBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRMaXN0UGFuZWwocGFyZW50LCAicHJpbWl0aXZlIHNvcnRlZCIsIHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpLCBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgInByaW1pdGl2ZSByZXZlcnNlIHNvcnRlZCIsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsMihwYXJlbnQsICJvYmplY3QgdW5zb3J0ZWQiLCB0aGlzLmJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbDIocGFyZW50LCAib2JqZWN0IHNvcnRlZCIsIHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbDIocGFyZW50LCAib2JqZWN0IHJldmVyc2Ugc29ydGVkIiwgdGhpcy5idWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpLCB0aGlzLmJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxUYXNrPih0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFRhc2s+KHRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVRhc2tDb21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgPEU+IExpc3RCb3hNb2RlbEFkYXB0ZXI8RT4gYnVpbGRMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBMaXN0VmFsdWVNb2RlbDxFPiBtb2RlbCwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc01vZGVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQotCQlMYWJlbCBsaXN0TGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5MRUZUIHwgU1dULlZFUlRJQ0FMKTsKLQkJbGlzdExhYmVsLnNldFRleHQobGFiZWwpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDMpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDIwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlsaXN0TGFiZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBsaXN0Qm94ID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QocGFuZWwsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCQlmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxpc3RMYWJlbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlsaXN0Qm94LnNldExheW91dERhdGEoZmQpOwotCQlyZXR1cm4gTGlzdEJveE1vZGVsQWRhcHRlci5hZGFwdChtb2RlbCwgc2VsZWN0ZWRJdGVtc01vZGVsLCBsaXN0Qm94KTsgIC8vIHVzZSAjdG9TdHJpbmcoKQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZExpc3RQYW5lbDIoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBMaXN0VmFsdWVNb2RlbDxUYXNrPiBtb2RlbCwgQ29sbGVjdGlvblZhbHVlTW9kZWw8VGFzaz4gc2VsZWN0ZWRJdGVtc01vZGVsKSB7Ci0JCUxpc3RCb3hNb2RlbEFkYXB0ZXI8VGFzaz4gYWRhcHRlciA9IHRoaXMuYnVpbGRMaXN0UGFuZWwocGFyZW50LCBsYWJlbCwgbW9kZWwsIHNlbGVjdGVkSXRlbXNNb2RlbCk7Ci0JCWFkYXB0ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcih0aGlzLmJ1aWxkRG91YmxlQ2xpY2tMaXN0ZW5lcigpKTsKLQkJYWRhcHRlci5hZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Qm94TW9kZWxBZGFwdGVyLkRvdWJsZUNsaWNrTGlzdGVuZXI8VGFzaz4gYnVpbGREb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RCb3hNb2RlbEFkYXB0ZXIuRG91YmxlQ2xpY2tMaXN0ZW5lcjxUYXNrPigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKExpc3RCb3hNb2RlbEFkYXB0ZXIuRG91YmxlQ2xpY2tFdmVudDxUYXNrPiBldmVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZG91YmxlLWNsaWNrOiAiICsgZXZlbnQuc2VsZWN0aW9uKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdEJveE1vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxUYXNrPiBidWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RCb3hNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8VGFzaz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PFRhc2s+IGV2ZW50KSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnRhc2tMaXN0LnNldFByaW9yaXR5VGFza3MoZXZlbnQuc2VsZWN0aW9uKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJCQlyZXR1cm4gczIuY29tcGFyZVRvKHMxKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8VGFzaz4gYnVpbGRDdXN0b21UYXNrQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFRhc2s+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFRhc2sgdG8xLCBUYXNrIHRvMikgewotCQkJCXJldHVybiB0bzIuY29tcGFyZVRvKHRvMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBTdHJpbmc+KHRoaXMudGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlRBU0tfTkFNRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhc2tOYW1lcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+KHRoaXMudGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlRBU0tTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxUYXNrPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFza3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+KHRoaXMudGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFRhc2s+IGl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnByaW9yaXR5VGFza3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCB0YXNrTGlzdFBhbmVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGFza0xpc3RQYW5lbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgbWlzYyA9IHRoaXMuYnVpbGRNaXNjVGFza1BhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEFkZFJlbW92ZVRhc2tQYW5lbChwYW5lbCwgbWlzYyk7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkTWlzY1Rhc2tQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNDAwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZENsZWFyTGlzdEFDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRBZGRQcmlvcml0eVRhc2tBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlbW92ZVByaW9yaXR5VGFza0FDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJQcmlvcml0eVRhc2tzQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhckxpc3RBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBsaXN0IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyVGFza3MoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciBhbGwgdGhlIHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdGhlIHRhc2sgbGlzdCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc3RvcmUgdGhlIHRhc2sgbGlzdCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGRQcmlvcml0eVRhc2tBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJhZGQgcHJpb3JpdHkiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuYWRkUHJpb3JpdHlUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiYWRkIGEgdGFzayB0byB0aGUgcHJpb3JpdHkgdGFza3MiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlUHJpb3JpdHlUYXNrQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVtb3ZlIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlbW92ZVByaW9yaXR5VGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlbW92ZSBhIHRhc2sgZnJvbSB0aGUgcHJpb3JpdHkgdGFza3MiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJQcmlvcml0eVRhc2tzQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgcHJpb3JpdHkiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJQcmlvcml0eVRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdGhlIHByaW9yaXR5IHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEFkZFJlbW92ZVRhc2tQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGNsZWFyQnV0dG9uKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChjbGVhckJ1dHRvbik7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCBhZGRCdXR0b24gPSB0aGlzLmJ1aWxkQWRkQnV0dG9uKHBhbmVsKTsKLQkJQ29udHJvbCByZW1vdmVCdXR0b24gPSB0aGlzLmJ1aWxkUmVtb3ZlQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFRhc2tUZXh0RmllbGQocGFuZWwsIGFkZEJ1dHRvbiwgcmVtb3ZlQnV0dG9uKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRBZGRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNTApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRBZGRBQ0koKS5maWxsKHBhbmVsKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEFkZEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImFkZCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5hZGRUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiYWRkIGEgdGFzayB3aXRoIHRoZSBuYW1lIGluIHRoZSBlbnRyeSBmaWVsZCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRSZW1vdmVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFJlbW92ZUFDSSgpLmZpbGwocGFuZWwpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVtb3ZlIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlbW92ZVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZW1vdmUgdGhlIHRhc2sgd2l0aCB0aGUgbmFtZSBpbiB0aGUgZW50cnkgZmllbGQiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVGFza1RleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGFkZEJ1dHRvbiwgQ29udHJvbCByZW1vdmVCdXR0b24pIHsKLQkJdGhpcy50YXNrVGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHJlbW92ZUJ1dHRvbik7Ci0JCXRoaXMudGFza1RleHRGaWVsZC5zZXRMYXlvdXREYXRhKGZkKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyB0YXNrVGV4dEZpZWxkVGV4dCgpIHsKLQkJcmV0dXJuIHRoaXMudGFza1RleHRGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0Jdm9pZCBhZGRUYXNrKCkgewotCQlTdHJpbmcgdGFza1RleHQgPSB0aGlzLnRhc2tUZXh0RmllbGRUZXh0KCk7Ci0JCWlmICh0YXNrVGV4dC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2sodGFza1RleHQpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVUYXNrKCkgewotCQlTdHJpbmcgdGFzayA9IHRoaXMudGFza1RleHRGaWVsZFRleHQoKTsKLQkJaWYgKHRhc2subGVuZ3RoKCkgIT0gMCkgewotCQkJdGhpcy50YXNrTGlzdC5yZW1vdmVUYXNrKHRhc2spOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclRhc2tzKCkgewotCQl0aGlzLnRhc2tMaXN0LmNsZWFyVGFza3MoKTsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIuc2V0VmFsdWUodGhpcy50YXNrTGlzdCk7Ci0JfQotCi0Jdm9pZCBhZGRQcmlvcml0eVRhc2soKSB7Ci0JCUl0ZXJhdG9yPFRhc2s+IHRhc2tzID0gdGhpcy50YXNrTGlzdC50YXNrcygpOwotCQl3aGlsZSAodGFza3MuaGFzTmV4dCgpKSB7Ci0JCQlpZiAodGhpcy50YXNrTGlzdC5hZGRQcmlvcml0eVRhc2sodGFza3MubmV4dCgpKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlUHJpb3JpdHlUYXNrKCkgewotCQlJdGVyYXRvcjxUYXNrPiBwVGFza3MgPSB0aGlzLnRhc2tMaXN0LnByaW9yaXR5VGFza3MoKTsKLQkJaWYgKHBUYXNrcy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMudGFza0xpc3QucmVtb3ZlUHJpb3JpdHlUYXNrKHBUYXNrcy5uZXh0KCkpOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclByaW9yaXR5VGFza3MoKSB7Ci0JCXRoaXMudGFza0xpc3QuY2xlYXJQcmlvcml0eVRhc2tzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2tMaXN0ICoqKioqKioqKioKLQotCS8vIG5vdGUgYWJzZW5jZSBvZiB2YWxpZGF0aW9uLi4uCi0JcHJpdmF0ZSBjbGFzcyBUYXNrTGlzdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiB0YXNrTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTkFNRVNfTElTVCA9ICJ0YXNrTmFtZXMiOwotCQlwcml2YXRlIGZpbmFsIExpc3Q8VGFzaz4gdGFza3MgPSBuZXcgQXJyYXlMaXN0PFRhc2s+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU19MSVNUID0gInRhc2tzIjsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFRhc2s+IHByaW9yaXR5VGFza3MgPSBuZXcgSGFzaFNldDxUYXNrPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTiA9ICJwcmlvcml0eVRhc2tzIjsKLQkJVGFza0xpc3QoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YXNrTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrTmFtZXMubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxUYXNrPiB0YXNrcygpIHsKLQkJCXJldHVybiB0aGlzLnRhc2tzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxUYXNrPiBwcmlvcml0eVRhc2tzKCkgewotCQkJcmV0dXJuIHRoaXMucHJpb3JpdHlUYXNrcy5pdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBUYXNrIGFkZFRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QodGFza05hbWUsIHRoaXMudGFza05hbWVzLCBUQVNLX05BTUVTX0xJU1QpOwotCQkJVGFzayB0YXNrID0gbmV3IFRhc2sodGFza05hbWUpOwotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHRhc2ssIHRoaXMudGFza3MsIFRBU0tTX0xJU1QpOwotCQkJcmV0dXJuIHRhc2s7Ci0JCX0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJaW50IGluZGV4ID0gdGhpcy50YXNrTmFtZXMuaW5kZXhPZih0YXNrTmFtZSk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy50YXNrTmFtZXMsIFRBU0tfTkFNRVNfTElTVCk7Ci0JCQkJLy8gYXNzdW1lIHRoZSBpbmRleGVzIG1hdGNoLi4uCi0JCQkJVGFzayByZW1vdmVkVGFzayA9IHRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLnRhc2tzLCBUQVNLU19MSVNUKTsKLQkJCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihyZW1vdmVkVGFzaywgdGhpcy5wcmlvcml0eVRhc2tzLCBQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBjbGVhclRhc2tzKCkgewotCQkJdGhpcy50YXNrTmFtZXMuY2xlYXIoKTsKLQkJCXRoaXMuZmlyZUxpc3RDbGVhcmVkKFRBU0tfTkFNRVNfTElTVCk7Ci0JCQl0aGlzLnRhc2tzLmNsZWFyKCk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChUQVNLU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBhZGRQcmlvcml0eVRhc2soVGFzayB0YXNrKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHRhc2ssIHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCX0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVQcmlvcml0eVRhc2soVGFzayB0YXNrKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbih0YXNrLCB0aGlzLnByaW9yaXR5VGFza3MsIFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsZWFyUHJpb3JpdHlUYXNrcygpIHsKLQkJCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0UHJpb3JpdHlUYXNrcyhJdGVyYXRvcjxUYXNrPiB0YXNrcykgewotCQkJdGhpcy5wcmlvcml0eVRhc2tzLmNsZWFyKCk7Ci0JCQl3aGlsZSAodGFza3MuaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5wcmlvcml0eVRhc2tzLmFkZCh0YXNrcy5uZXh0KCkpOwotCQkJfQotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFzayAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIFRhc2sgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIERhdGUgY3JlYXRpb25UaW1lU3RhbXA7Ci0JCXB1YmxpYyBUYXNrKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5jcmVhdGlvblRpbWVTdGFtcCA9IG5ldyBEYXRlKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZSArICI6ICIgKyB0aGlzLmNyZWF0aW9uVGltZVN0YW1wLmdldFRpbWUoKTsKLQkJfQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhEaXNwbGF5YWJsZSBvKSB7Ci0JCQlyZXR1cm4gREVGQVVMVF9DT01QQVJBVE9SLmNvbXBhcmUodGhpcywgbyk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLmRpc3BsYXlTdHJpbmcoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgRGlzcGxheWFibGUgZXh0ZW5kcyBNb2RlbCwgQ29tcGFyYWJsZTxEaXNwbGF5YWJsZT4gewotCQotCQlTdHJpbmcgZGlzcGxheVN0cmluZygpOwotCQkJU3RyaW5nIERJU1BMQVlfU1RSSU5HX1BST1BFUlRZID0gImRpc3BsYXlTdHJpbmciOwotCQotCQotCQkvLyAqKioqKioqKioqIGhlbHBlciBpbXBsZW1lbnRhdGlvbnMgKioqKioqKioqKgotCQotCQlDb2xsYXRvciBERUZBVUxUX0NPTExBVE9SID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkKLQkJQ29tcGFyYXRvcjxEaXNwbGF5YWJsZT4gREVGQVVMVF9DT01QQVJBVE9SID0KLQkJCW5ldyBDb21wYXJhdG9yPERpc3BsYXlhYmxlPigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoRGlzcGxheWFibGUgZDEsIERpc3BsYXlhYmxlIGQyKSB7Ci0JCQkJCS8vIGRpc2FsbG93IGR1cGxpY2F0ZXMgYmFzZWQgb24gb2JqZWN0IGlkZW50aXR5Ci0JCQkJCWlmIChkMSA9PSBkMikgewotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gZmlyc3QgY29tcGFyZSBkaXNwbGF5IHN0cmluZ3MgdXNpbmcgdGhlIGRlZmF1bHQgY29sbGF0b3IKLQkJCQkJaW50IHJlc3VsdCA9IERFRkFVTFRfQ09MTEFUT1IuY29tcGFyZShkMS5kaXNwbGF5U3RyaW5nKCksIGQyLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkgewotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJfQotCQotCQkJCQkvLyB0aGVuIGNvbXBhcmUgdXNpbmcgb2JqZWN0LWlkCi0JCQkJCXJlc3VsdCA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKGQxKSAtIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKGQyKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCi0JCQkJCS8vIEl0J3MgdW5saWtlbHkgdGhhdCB3ZSBnZXQgdG8gdGhpcyBwb2ludDsgYnV0LCBqdXN0IGluIGNhc2UsIHdlIHdpbGwgcmV0dXJuIC0xLgotCQkJCQkvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIGludHJvZHVjZXMgc29tZSBtaWxkIHVucHJlZGljdGFiaWxpdHkgdG8gdGhlIHNvcnQgb3JkZXIKLQkJCQkJLy8gKHVubGVzcyB0aGUgb2JqZWN0cyBhcmUgYWx3YXlzIHBhc3NlZCBpbnRvIHRoaXMgbWV0aG9kIGluIHRoZSBzYW1lIG9yZGVyKS4KLQkJCQkJcmV0dXJuIC0xOwkJLy8gaWYgYWxsIGVsc2UgZmFpbHMsIGluZGljYXRlIHRoYXQgbzEgPCBvMgotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkRpc3BsYXlhYmxlLkRFRkFVTFRfQ09NUEFSQVRPUiI7Ci0JCQkJfQotCQkJfTsKLQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1NwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1NwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzQzNzcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5TcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0IHsKLQotCXByaXZhdGUgTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBzdWJqZWN0SG9sZGVyOwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4gYnVpbGRTdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4oKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkVmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1vZGVsLCBJbnRlZ2VyPihzdWJqZWN0SG9sZGVyLCBNb2RlbC5WQUxVRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRWYWx1ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc2hlbGwgICAgICAgICAgICAgID0gbmV3IFNoZWxsKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJbW9kZWwgICAgICAgICAgICAgID0gbmV3IE1vZGVsKCk7Ci0JCXN1YmplY3RIb2xkZXIgICAgICA9IGJ1aWxkU3ViamVjdEhvbGRlcigpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXNoZWxsICAgICAgICAgPSBudWxsOwotCQlzdWJqZWN0SG9sZGVyID0gbnVsbDsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3REaXNwb3NlZCgpIHsKLQotCQlpbnQgdmFsdWUgPSAyOwotCQltb2RlbC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCW1vZGVsLmNsZWFyU2V0VmFsdWVDYWxsZWRGbGFnKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciA9IGJ1aWxkVmFsdWVIb2xkZXIoKTsKLQkJaW50IGRlZmF1bHRWYWx1ZSA9IDE7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCW51bWJlckhvbGRlciwKLQkJCXNwaW5uZXIsCi0JCQlkZWZhdWx0VmFsdWUKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgY29taW5nIGZyb20gdGhlIG1vZGVsIiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgbW9kZWwncyB2YWx1ZSIsCi0JCQltb2RlbC5nZXRWYWx1ZSgpLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgbW9kZWwgc2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIHRoZSB2YWx1ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24iLAotCQkJbW9kZWwuaXNTZXRWYWx1ZUNhbGxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB2YWx1ZSBpbiB0aGUgbW9kZWwKLQkJc3Bpbm5lci5kaXNwb3NlKCk7Ci0KLQkJdmFsdWUgPSA0OwotCQltb2RlbC5zZXRWYWx1ZSh2YWx1ZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBtb2RlbCdzIHZhbHVlIHdhcyBzb21laG93IGNoYW5nZWQiLAotCQkJdmFsdWUsCi0JCQltb2RlbC5nZXRWYWx1ZSgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6YXRpb25fMSgpIHsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IHZhbHVlIiwKLQkJCWRlZmF1bHRWYWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnROdWxsKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlIG51bGwiLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbl8yKCkgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciA9IGJ1aWxkVmFsdWVIb2xkZXIoKTsKLQkJaW50IGRlZmF1bHRWYWx1ZSA9IDE7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCW51bWJlckhvbGRlciwKLQkJCXNwaW5uZXIsCi0JCQlkZWZhdWx0VmFsdWUKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdmFsdWUiLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydE51bGwoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgbnVsbCIsCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uXzMoKSB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gYnVpbGRWYWx1ZUhvbGRlcigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0TnVsbCgKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSBudWxsIiwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIG1vZGVsIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgdmFsdWUgZHVyaW5nIGluaXRpYWxpemF0aW9uIiwKLQkJCW1vZGVsLmlzU2V0VmFsdWVDYWxsZWQoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uXzQoKSB7Ci0KLQkJaW50IHZhbHVlID0gMjsKLQkJbW9kZWwuc2V0VmFsdWUodmFsdWUpOwotCQltb2RlbC5jbGVhclNldFZhbHVlQ2FsbGVkRmxhZygpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBidWlsZFZhbHVlSG9sZGVyKCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSB2YWx1ZSBjb21pbmcgZnJvbSB0aGUgbW9kZWwiLAotCQkJdmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlICIgKyB2YWx1ZSwKLQkJCXZhbHVlLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgbW9kZWwgc2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIHRoZSB2YWx1ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24iLAotCQkJbW9kZWwuaXNTZXRWYWx1ZUNhbGxlZCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVDaGFuZ2VkKCkgewotCi0JCWludCB2YWx1ZSA9IDI7Ci0JCW1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQkJbW9kZWwuY2xlYXJTZXRWYWx1ZUNhbGxlZEZsYWcoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gYnVpbGRWYWx1ZUhvbGRlcigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSBjb21pbmcgZnJvbSB0aGUgbW9kZWwiLAotCQkJdmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBtb2RlbCdzIHZhbHVlIiwKLQkJCW1vZGVsLmdldFZhbHVlKCksCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBtb2RlbCBzaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgdGhlIHZhbHVlIGR1cmluZyBpbml0aWFsaXphdGlvbiIsCi0JCQltb2RlbC5pc1NldFZhbHVlQ2FsbGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBtb2RlbAotCQl2YWx1ZSA9IDQ7Ci0JCW1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgY29taW5nIGZyb20gdGhlIG1vZGVsIiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbW9kZWwncyB2YWx1ZSB3YXMgc29tZWhvdyBjaGFuZ2VkIiwKLQkJCXZhbHVlLAotCQkJbW9kZWwuZ2V0VmFsdWUoKQotCQkpOwotCi0JCS8vIENoYW5nZSB0aGUgdmFsdWUgZnJvbSB0aGUgc3Bpbm5lcgotCQl2YWx1ZSA9IDY7Ci0JCXNwaW5uZXIuc2V0U2VsZWN0aW9uKHZhbHVlKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIG5ldyB2YWx1ZSBzZXQiLAotCQkJdmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBtb2RlbCdzIHZhbHVlIHdhcyBzdXBwb3NlZCB0byBiZSB1cGRhdGVkIiwKLQkJCXZhbHVlLAotCQkJbW9kZWwuZ2V0VmFsdWUoKQotCQkpOwotCi0JCS8vIERpc2Nvbm5lY3QgZnJvbSBtb2RlbAotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQotCQlwcml2YXRlIGJvb2xlYW4gc2V0VmFsdWVDYWxsZWQ7Ci0JCXByaXZhdGUgSW50ZWdlciB2YWx1ZTsKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsKLQotCQl2b2lkIGNsZWFyU2V0VmFsdWVDYWxsZWRGbGFnKCkgewotCQkJc2V0VmFsdWVDYWxsZWQgPSBmYWxzZTsKLQkJfQotCi0JCUludGVnZXIgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQlib29sZWFuIGlzU2V0VmFsdWVDYWxsZWQoKSB7Ci0JCQlyZXR1cm4gc2V0VmFsdWVDYWxsZWQ7Ci0JCX0KLQotCQl2b2lkIHNldFZhbHVlKEludGVnZXIgdmFsdWUpIHsKLQkJCXNldFZhbHVlQ2FsbGVkID0gdHJ1ZTsKLQotCQkJSW50ZWdlciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGRWYWx1ZSwgdmFsdWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZGE5OTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUYWJsZU1vZGVsQWRhcHRlclRlc3QgewotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1hbmFnZXI+IHN1YmplY3RIb2xkZXI7Ci0KLQlwcml2YXRlIENvbHVtbkFkYXB0ZXI8RW1wbG95ZWU+IGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUNvbHVtbkFkYXB0ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBidWlsZEVtcGxveWVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4oKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEVtcGxveWVlPiBidWlsZEVtcGxveWVlSG9sZGVycygpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxNYW5hZ2VyLCBFbXBsb3llZT4oc3ViamVjdEhvbGRlciwgTWFuYWdlci5FTVBMT1lFRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEVtcGxveWVlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmVtcGxveWVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZW1wbG95ZWVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSVRhYmxlTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFbXBsb3llZT4gYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihmaW5hbCBDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXMpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFbXBsb3llZT4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PEVtcGxveWVlPiBlKSB7Ci0JCQkJZW1wbG95ZWVzLmNsZWFyKCk7Ci0JCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChlbXBsb3llZXMsIGUuc2VsZWN0aW9uKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TWFuYWdlcj4gYnVpbGRTdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxNYW5hZ2VyPigpOwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXNoZWxsICAgICAgICAgPSBuZXcgU2hlbGwoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQlzdWJqZWN0SG9sZGVyID0gYnVpbGRTdWJqZWN0SG9sZGVyKCk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc2hlbGwgICAgICAgICA9IG51bGw7Ci0JCXN1YmplY3RIb2xkZXIgPSBudWxsOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENoYW5nZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBUYWJsZSB3YXMgcG9wdWxhdGVkCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtcyBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBDaGFuZ2UgdGhlIGxpc3Qgb2YgRW1wbG95ZWVzCi0JCUFycmF5TGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oMyk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuY2hhbmdlRW1wbG95ZWVzKGVtcGxveWVlcyk7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW1zIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAwLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAxLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAyLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQluZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIFRhYmxlIHdhcyBwb3B1bGF0ZWQKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW1zIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIFRlc3QgcmVtb3ZpbmcgdGhlbSBhbGwKLQkJbWFuYWdlci5yZW1vdmVBbGxFbXBsb3llZXMoKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbGlzdCBob2xkZXIgc2hvdWxkIGhhdmUgYmVlbiBjbGVhcmVkIiwgMCwgbGlzdEhvbGRlci5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgVGFibGUgc2hvdWxkIGhhdmUgYmVlbiBjbGVhcmVkIiwgMCwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgYSBuZXcgRW1wbG95ZWUKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZSAgICA9ICJEYWxpIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlciA9ICJXVFAiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZSAgID0gInBsdWctaW4iOwotCi0JCUVtcGxveWVlIGVtcGxveWVlID0gbWFuYWdlci5hZGRFbXBsb3llZShleHBlY3RlZE5hbWUsIGV4cGVjdGVkVGl0bGUsIGV4cGVjdGVkTWFuYWdlcik7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgY3JlYXRlZCIsIGVtcGxveWVlKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtIHJlcHJlc2VudGluZyB0aGUgbmV3IEVtcGxveWVlCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleCwgZXhwZWN0ZWROYW1lLCBleHBlY3RlZE1hbmFnZXIsIGV4cGVjdGVkVGl0bGUpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1Nb3ZlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIEVtcGxveWVlcyB3ZXJlIGFkZGVkIHRvIHRoZSBUYWJsZQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBNb3ZlIGFuIEVtcGxveWVlIHVwIHRoZSBsaXN0Ci0JCW1hbmFnZXIubW92ZUVtcGxveWVlVXAoZW1wbG95ZWUyKTsKLQotCQlpbnQgaW5kZXgxID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAxIHdhcyBub3QgbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMSwgaW5kZXgxKTsKLQotCQlpbnQgaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIHdhcyBub3QgbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgyKTsKLQotCQlpbnQgaW5kZXgzID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIHNob3VsZCBub3QgaGF2ZSBiZWVuIG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4Myk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MSwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgyLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDMsIGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkTWFuYWdlcjMsIGV4cGVjdGVkVGl0bGUzKTsKLQotCQkvLyBNb3ZlIGFuIEVtcGxveWVlIGRvd24gdGhlIGxpc3QKLQkJbWFuYWdlci5tb3ZlRW1wbG95ZWVEb3duKGVtcGxveWVlMSk7Ci0KLQkJaW5kZXgxID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAxIHNob3VsZCBub3QgaGF2ZSBiZWVuIG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4MSk7Ci0KLQkJaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIHdhcyBub3QgbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgyKTsKLQotCQlpbmRleDMgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDMgd2FzIG5vdCBtb3ZlZCBpbiB0aGUgdGFibGUgbW9kZWwiLCAxLCBpbmRleDMpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgzLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIGEgbmV3IEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUgICAgPSAiRGFsaSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIgPSAiV1RQIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUgICA9ICJwbHVnLWluIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZSA9IG1hbmFnZXIuYWRkRW1wbG95ZWUoZXhwZWN0ZWROYW1lLCBleHBlY3RlZFRpdGxlLCBleHBlY3RlZE1hbmFnZXIpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGNyZWF0ZWQiLCBlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIE1ha2Ugc3VyZSBpdCB3YXMgYWRkZWQgdG8gdGhlIG1vZGVsCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleCwgZXhwZWN0ZWROYW1lLCBleHBlY3RlZE1hbmFnZXIsIGV4cGVjdGVkVGl0bGUpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW0gcmVwcmVzZW50aW5nIHRoZSBuZXcgRW1wbG95ZWUKLQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlLmdldEl0ZW0oaW5kZXgpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTm8gVGFibGVJdGVtIHdhcyBmb3VuZCBmb3IgdGhlIG5ldyBFbXBsb3llZSIsIHRhYmxlSXRlbSk7Ci0KLQkJLy8gTm93IHRlc3QgdGhlIGl0ZW0gYmVpbmcgcmVtb3ZlZAotCQltYW5hZ2VyLnJlbW92ZUVtcGxveWVlKGVtcGxveWVlKTsKLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgd2FzIG5vdCByZW1vdmVkIGZyb20gdGhlIHRhYmxlIG1vZGVsIiwgLTEsIGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDAiLCAwLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlcGxhY2VkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBhIG5ldyBFbXBsb3llZQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbWFuYWdlci5hZGRFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgY3JlYXRlZCIsIGVtcGxveWVlMSk7Ci0KLQkJLy8gTWFrZSBzdXJlIGl0IHdhcyBhZGRlZCB0byB0aGUgbW9kZWwKLQkJaW50IGluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbSByZXByZXNlbnRpbmcgdGhlIG5ldyBFbXBsb3llZQotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleDEpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTm8gVGFibGVJdGVtIHdhcyBmb3VuZCBmb3IgdGhlIG5ldyBFbXBsb3llZSIsIHRhYmxlSXRlbSk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MSwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCi0JCS8vIFJlcGxhY2UgdGhlIEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQltYW5hZ2VyLnJlcGxhY2UoZW1wbG95ZWUxLCBlbXBsb3llZTIpOwotCi0JCWludCBpbmRleDIgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydFNhbWUoIlRoZSBFbXBsb3llZSB0aGF0IGdvdCByZXBsYWNlZCBzaG91bGQgYmUgYXQgaW5kZXggIiArIGluZGV4MSwgaW5kZXgxLCBpbmRleDIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgyLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbXNBZGRlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtcyByZXByZXNlbnRpbmcgdGhlIGVtcGxveWVlcwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQlpbnQgaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0KLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAxLCBpbmRleCk7Ci0KLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDMgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAyLCBpbmRleCk7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBUYWJsZUl0ZW0gd2FzIGNvcnJlY3RseSBwb3B1bGF0ZWQKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDAsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDEsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDIsIGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkTWFuYWdlcjMsIGV4cGVjdGVkVGl0bGUzKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJdGVtc01vdmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTQgICAgPSAiRGFsaV80IjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjQgPSAiV1RQXzQiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTQgICA9ICJwbHVnLWluXzQiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWU1ICAgID0gIkRhbGlfNSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXI1ID0gIldUUF81IjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGU1ICAgPSAicGx1Zy1pbl81IjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lNiAgICA9ICJEYWxpXzYiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyNiA9ICJXVFBfNiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlNiAgID0gInBsdWctaW5fNiI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWU0ID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTQsIGV4cGVjdGVkVGl0bGU0LCBleHBlY3RlZE1hbmFnZXI0KTsKLQkJRW1wbG95ZWUgZW1wbG95ZWU1ID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTUsIGV4cGVjdGVkVGl0bGU1LCBleHBlY3RlZE1hbmFnZXI1KTsKLQkJRW1wbG95ZWUgZW1wbG95ZWU2ID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTYsIGV4cGVjdGVkVGl0bGU2LCBleHBlY3RlZE1hbmFnZXI2KTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlNCk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWU1KTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTYpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgRW1wbG95ZWVzIHdlcmUgYWRkZWQgdG8gdGhlIFRhYmxlCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSA2IiwgNiwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIE1vdmUgYW4gRW1wbG95ZWUgdXAgdGhlIGxpc3QKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigzKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTMpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlNCk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWU1KTsKLQkJbWFuYWdlci5tb3ZlRW1wbG95ZWVzKGVtcGxveWVlcywgMCk7Ci0KLQkJaW50IGluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlpbnQgaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCWludCBpbmRleDMgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJaW50IGluZGV4NCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTQpOwotCQlpbnQgaW5kZXg1ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNSk7Ci0JCWludCBpbmRleDYgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU2KTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMywgaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDQsIGluZGV4Mik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAwLCBpbmRleDMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNCBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMSwgaW5kZXg0KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDUgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDIsIGluZGV4NSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA2IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCA1LCBpbmRleDYpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgzLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDQsIGV4cGVjdGVkTmFtZTQsIGV4cGVjdGVkTWFuYWdlcjQsIGV4cGVjdGVkVGl0bGU0KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NSwgZXhwZWN0ZWROYW1lNSwgZXhwZWN0ZWRNYW5hZ2VyNSwgZXhwZWN0ZWRUaXRsZTUpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg2LCBleHBlY3RlZE5hbWU2LCBleHBlY3RlZE1hbmFnZXI2LCBleHBlY3RlZFRpdGxlNik7Ci0KLQkJLy8gTW92ZSBhbiBFbXBsb3llZSBkb3duIHRoZSBsaXN0Ci0JCWVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5tb3ZlRW1wbG95ZWVzKGVtcGxveWVlcywgNCk7Ci0KLQkJaW5kZXgxID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCWluZGV4MiA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlpbmRleDMgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJaW5kZXg0ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNCk7Ci0JCWluZGV4NSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTUpOwotCQlpbmRleDYgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU2KTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgNCwgaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDUsIGluZGV4Mik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAwLCBpbmRleDMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNCBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMSwgaW5kZXg0KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDUgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDIsIGluZGV4NSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA2IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAzLCBpbmRleDYpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgzLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDQsIGV4cGVjdGVkTmFtZTQsIGV4cGVjdGVkTWFuYWdlcjQsIGV4cGVjdGVkVGl0bGU0KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NSwgZXhwZWN0ZWROYW1lNSwgZXhwZWN0ZWRNYW5hZ2VyNSwgZXhwZWN0ZWRUaXRsZTUpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg2LCBleHBlY3RlZE5hbWU2LCBleHBlY3RlZE1hbmFnZXI2LCBleHBlY3RlZFRpdGxlNik7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbXNSZW1vdmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW1zIHJlcHJlc2VudGluZyB0aGUgZW1wbG95ZWVzCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4KTsKLQotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMiB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDEsIGluZGV4KTsKLQotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4KTsKLQotCQkvLyBSZW1vdmUgMiBpdGVtcwotCQlBcnJheUxpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJbWFuYWdlci5yZW1vdmVFbXBsb3llZXMoZW1wbG95ZWVzKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIGEgbmV3IEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUgICAgPSAiRGFsaSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIgPSAiV1RQIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUgICA9ICJwbHVnLWluIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZSA9IG1hbmFnZXIuYWRkRW1wbG95ZWUoZXhwZWN0ZWROYW1lLCBleHBlY3RlZFRpdGxlLCBleHBlY3RlZE1hbmFnZXIpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGNyZWF0ZWQiLCBlbXBsb3llZSk7Ci0KLQkJLy8gTWFrZSBzdXJlIGl0IHdhcyBhZGRlZCB0byB0aGUgbW9kZWwKLQkJaW50IGluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbSByZXByZXNlbnRpbmcgdGhlIG5ldyBFbXBsb3llZQotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJObyBUYWJsZUl0ZW0gd2FzIGZvdW5kIGZvciB0aGUgbmV3IEVtcGxveWVlIiwgdGFibGVJdGVtKTsKLQotCQkvLyBOYW1lIHByb3BlcnR5Ci0JCVN0cmluZyBhY3R1YWxOYW1lID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW05BTUVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE5hbWUsIGFjdHVhbE5hbWUpOwotCi0JCWV4cGVjdGVkTmFtZSA9ICJKcHQiOwotCQllbXBsb3llZS5zZXROYW1lKGV4cGVjdGVkTmFtZSk7Ci0KLQkJYWN0dWFsTmFtZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtOQU1FX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWROYW1lLCBhY3R1YWxOYW1lKTsKLQotCQkvLyBNYW5hZ2VyIHByb3BlcnR5Ci0JCVN0cmluZyBhY3R1YWxNYW5hZ2VyID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk1BTkFHRVJfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW01BTkFHRVJfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE1hbmFnZXIsIGFjdHVhbE1hbmFnZXIpOwotCi0JCWV4cGVjdGVkTWFuYWdlciA9ICJib3NzIjsKLQkJZW1wbG95ZWUuc2V0TWFuYWdlcihleHBlY3RlZE1hbmFnZXIpOwotCi0JCWFjdHVhbE1hbmFnZXIgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTUFOQUdFUl9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTUFOQUdFUl9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTWFuYWdlciwgYWN0dWFsTWFuYWdlcik7Ci0KLQkJLy8gVGl0bGUgcHJvcGVydHkKLQkJU3RyaW5nIGFjdHVhbFRpdGxlID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLlRJVExFX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtUSVRMRV9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkVGl0bGUsIGFjdHVhbFRpdGxlKTsKLQotCQlleHBlY3RlZFRpdGxlID0gIkVjbGlwc2VMaW5rIjsKLQkJZW1wbG95ZWUuc2V0VGl0bGUoZXhwZWN0ZWRUaXRsZSk7Ci0KLQkJYWN0dWFsVGl0bGUgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuVElUTEVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW1RJVExFX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWRUaXRsZSwgYWN0dWFsVGl0bGUpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNlbGVjdGVkSXRlbXNBZGRlZFJlbW92ZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtc0hvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXJzKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gVGVzdCBhZGRpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCXNlbGVjdGVkSXRlbXNIb2xkZXIuYWRkQWxsKGVtcGxveWVlcyk7Ci0KLQkJQ29sbGVjdGlvbjxFbXBsb3llZT4gYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAyIiwgMiwgYWN0dWFsRW1wbG95ZWVzLnNpemUoKSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTEpOwotCQlhY3R1YWxFbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMyk7Ci0KLQkJQXNzZXJ0LmFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtcyB3YXMgbm90IHJldHJpZXZlZCBjb3JyZWN0bHkiLCBhY3R1YWxFbXBsb3llZXMuaXNFbXB0eSgpKTsKLQotCQkvLyBUZXN0IHJlbW92aW5nIHNlbGVjdGVkIGl0ZW1zCi0JCXNlbGVjdGVkSXRlbXNIb2xkZXIucmVtb3ZlKGVtcGxveWVlMSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAxIiwgMSwgYWN0dWFsRW1wbG95ZWVzLnNpemUoKSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTMpOwotCi0JCUFzc2VydC5hc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbXMgd2FzIG5vdCByZXRyaWV2ZWQgY29ycmVjdGx5IiwgYWN0dWFsRW1wbG95ZWVzLmlzRW1wdHkoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRJdGVtc0NsZWFyZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtc0hvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXJzKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gVGVzdCBhZGRpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCXNlbGVjdGVkSXRlbXNIb2xkZXIuYWRkQWxsKGVtcGxveWVlcyk7Ci0KLQkJQ29sbGVjdGlvbjxFbXBsb3llZT4gYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAyIiwgMiwgYWN0dWFsRW1wbG95ZWVzLnNpemUoKSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTEpOwotCQlhY3R1YWxFbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbXMgd2FzIG5vdCByZXRyaWV2ZWQgY29ycmVjdGx5IiwgYWN0dWFsRW1wbG95ZWVzLmlzRW1wdHkoKSk7Ci0KLQkJLy8gVGVzdCByZW1vdmluZyBzZWxlY3RlZCBpdGVtcwotCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLmNsZWFyKCk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAiLCAwLCBhY3R1YWxFbXBsb3llZXMuc2l6ZSgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKSwKLQkJCWJ1aWxkRW1wbG95ZWVIb2xkZXIoKSwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCUNvbGxlY3Rpb248RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KCk7Ci0JCXRhYmxlTW9kZWwuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihlbXBsb3llZXMpKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBUZXN0IGFkZGluZyBzZWxlY3RlZCBpdGVtcwotCQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdIHsgMCwgMiB9KTsKLQotCQkvLyBJdCBzZWVtcyBhIG1hbnVhbCBzZWxlY3Rpb24gZG9lc24ndCBzZW5kIGFueSBzZWxlY3Rpb24gZXZlbnQKLQkJdGFibGVNb2RlbC50YWJsZVNlbGVjdGlvbkNoYW5nZWQobnVsbCk7Ci0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBlbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIDIiLCAyLCBlbXBsb3llZXMuc2l6ZSgpKTsKLQotCQllbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtcyB3YXMgbm90IHJldHJpZXZlZCBjb3JyZWN0bHkiLCBlbXBsb3llZXMuaXNFbXB0eSgpKTsKLQotCQkvLyBUZXN0IGFkZGluZyBzZWxlY3RlZCBpdGVtcwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJdGFibGUuZGVzZWxlY3RBbGwoKTsKLQotCQkvLyBJdCBzZWVtcyBhIG1hbnVhbCBzZWxlY3Rpb24gZG9lc24ndCBzZW5kIGFueSBzZWxlY3Rpb24gZXZlbnQKLQkJdGFibGVNb2RlbC50YWJsZVNlbGVjdGlvbkNoYW5nZWQobnVsbCk7Ci0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBlbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIDAiLCAwLCBlbXBsb3llZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdFRhYmxlSXRlbVByb3BlcnRpZXMoVGFibGUgdGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTWFuYWdlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkVGl0bGUpCi0JewotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJObyBUYWJsZUl0ZW0gd2FzIGZvdW5kIGZvciB0aGUgRW1wbG95ZWUiLCB0YWJsZUl0ZW0pOwotCi0JCVN0cmluZyBhY3R1YWxOYW1lID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW05BTUVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE5hbWUsIGFjdHVhbE5hbWUpOwotCi0JCVN0cmluZyBhY3R1YWxUaXRsZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5USVRMRV9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bVElUTEVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZFRpdGxlLCBhY3R1YWxUaXRsZSk7Ci0KLQkJU3RyaW5nIGFjdHVhbE1hbmFnZXIgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTUFOQUdFUl9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTUFOQUdFUl9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTWFuYWdlciwgYWN0dWFsTWFuYWdlcik7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBFbXBsb3llZSBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgU3RyaW5nIG1hbmFnZXI7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFUl9QUk9QRVJUWSA9ICJtYW5hZ2VyIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFX1BST1BFUlRZID0gInRpdGxlIjsKLQotCQlFbXBsb3llZShTdHJpbmcgbmFtZSwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWFuYWdlcikgewotCQkJc3VwZXIoKTsKLQotCQkJdGhpcy5uYW1lICAgID0gbmFtZTsKLQkJCXRoaXMudGl0bGUgICA9IHRpdGxlOwotCQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJfQotCi0JCVN0cmluZyBnZXRNYW5hZ2VyKCkgewotCQkJcmV0dXJuIG1hbmFnZXI7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0KLQkJU3RyaW5nIGdldFRpdGxlKCkgewotCQkJcmV0dXJuIHRpdGxlOwotCQl9Ci0KLQkJdm9pZCBzZXRNYW5hZ2VyKFN0cmluZyBtYW5hZ2VyKSB7Ci0JCQlTdHJpbmcgb2xkTWFuYWdlciA9IHRoaXMubWFuYWdlcjsKLQkJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1BTkFHRVJfUFJPUEVSVFksIG9sZE1hbmFnZXIsIG1hbmFnZXIpOwotCQl9Ci0KLQkJdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5hbWUpOwotCQl9Ci0KLQkJdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJCVN0cmluZyBvbGRUaXRsZSA9IHRoaXMudGl0bGU7Ci0JCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRJVExFX1BST1BFUlRZLCBvbGRUaXRsZSwgdGl0bGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQkJcHJpdmF0ZSBMaXN0PEVtcGxveWVlPiBlbXBsb3llZXM7Ci0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFTVBMT1lFRVNfTElTVCA9ICJlbXBsb3llZXMiOwotCi0JCU1hbmFnZXIoKSB7Ci0JCQlzdXBlcigpOwotCQkJZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oKTsKLQkJfQotCi0JCUVtcGxveWVlIGFkZEVtcGxveWVlKEVtcGxveWVlIGVtcGxveWVlKSB7Ci0JCQlhZGRJdGVtVG9MaXN0KGVtcGxveWVlLCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJCXJldHVybiBlbXBsb3llZTsKLQkJfQotCi0JCUVtcGxveWVlIGFkZEVtcGxveWVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtYW5hZ2VyKSB7Ci0JCQlFbXBsb3llZSBlbXBsb3llZSA9IG5ldyBFbXBsb3llZShuYW1lLCB0aXRsZSwgbWFuYWdlcik7Ci0JCQlyZXR1cm4gYWRkRW1wbG95ZWUoZW1wbG95ZWUpOwotCQl9Ci0KLQkJdm9pZCBjaGFuZ2VFbXBsb3llZXMoTGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzKSB7Ci0JCQl0aGlzLmVtcGxveWVlcy5jbGVhcigpOwotCQkJdGhpcy5lbXBsb3llZXMuYWRkQWxsKGVtcGxveWVlcyk7Ci0JCQlmaXJlTGlzdENoYW5nZWQoRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJTGlzdEl0ZXJhdG9yPEVtcGxveWVlPiBlbXBsb3llZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEVtcGxveWVlPihlbXBsb3llZXMpOwotCQl9Ci0KLQkJaW50IGVtcGxveWVlc1NpemUoKSB7Ci0JCQlyZXR1cm4gZW1wbG95ZWVzLnNpemUoKTsKLQkJfQotCi0JCXZvaWQgbW92ZUVtcGxveWVlRG93bihFbXBsb3llZSBlbXBsb3llZSkgewotCQkJaW50IGluZGV4ID0gZW1wbG95ZWVzLmluZGV4T2YoZW1wbG95ZWUpOwotCQkJbW92ZUl0ZW1Jbkxpc3QoaW5kZXggKyAxLCBpbmRleCwgZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIG1vdmVFbXBsb3llZXMoQ29sbGVjdGlvbjxFbXBsb3llZT4gZW1wbG95ZWVzLCBpbnQgdGFyZ2V0SW5kZXgpIHsKLQotCQkJaW50IHNvdXJjZUluZGV4ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLQkJCWZvciAoRW1wbG95ZWUgZW1wbG95ZWUgOiBlbXBsb3llZXMpIHsKLQkJCQlzb3VyY2VJbmRleCA9IE1hdGgubWluKHNvdXJjZUluZGV4LCB0aGlzLmVtcGxveWVlcy5pbmRleE9mKGVtcGxveWVlKSk7Ci0JCQl9Ci0KLQkJCW1vdmVJdGVtc0luTGlzdCgKLQkJCQl0YXJnZXRJbmRleCwKLQkJCQlzb3VyY2VJbmRleCwKLQkJCQllbXBsb3llZXMuc2l6ZSgpLAotCQkJCXRoaXMuZW1wbG95ZWVzLAotCQkJCUVNUExPWUVFU19MSVNUCi0JCQkpOwotCQl9Ci0KLQkJdm9pZCBtb3ZlRW1wbG95ZWVVcChFbXBsb3llZSBlbXBsb3llZSkgewotCQkJaW50IGluZGV4ID0gZW1wbG95ZWVzLmluZGV4T2YoZW1wbG95ZWUpOwotCQkJbW92ZUl0ZW1Jbkxpc3QoaW5kZXggLSAxLCBpbmRleCwgZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUFsbEVtcGxveWVlcygpIHsKLQkJCWNsZWFyTGlzdChlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlRW1wbG95ZWUoRW1wbG95ZWUgZW1wbG95ZWUpIHsKLQkJCXJlbW92ZUl0ZW1Gcm9tTGlzdChlbXBsb3llZSwgZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUVtcGxveWVlcyhDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXMpIHsKLQkJCXJlbW92ZUl0ZW1zRnJvbUxpc3QoZW1wbG95ZWVzLml0ZXJhdG9yKCksIHRoaXMuZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIHJlcGxhY2UoRW1wbG95ZWUgb2xkRW1wbG95ZWUsIEVtcGxveWVlIG5ld0VtcGxveWVlKSB7Ci0JCQlyZXBsYWNlSXRlbUluTGlzdChvbGRFbXBsb3llZSwgbmV3RW1wbG95ZWUsIGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZUNvbHVtbkFkYXB0ZXIgaW1wbGVtZW50cyBDb2x1bW5BZGFwdGVyPEVtcGxveWVlPiB7Ci0KLQkJc3RhdGljIGZpbmFsIGludCBDT0xVTU5fQ09VTlQgPSAzOwotCQlzdGF0aWMgZmluYWwgaW50IE1BTkFHRVJfQ09MVU1OID0gMjsKLQkJc3RhdGljIGZpbmFsIGludCBOQU1FX0NPTFVNTiA9IDA7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgVElUTEVfQ09MVU1OID0gMTsKLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRNYW5hZ2VySG9sZGVyKEVtcGxveWVlIHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtcGxveWVlLCBTdHJpbmc+KEVtcGxveWVlLk1BTkFHRVJfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRNYW5hZ2VyKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlzdWJqZWN0LnNldE1hbmFnZXIodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKEVtcGxveWVlIHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtcGxveWVlLCBTdHJpbmc+KEVtcGxveWVlLk5BTUVfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUaXRsZUhvbGRlcihFbXBsb3llZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbXBsb3llZSwgU3RyaW5nPihFbXBsb3llZS5USVRMRV9QUk9QRVJUWSwgc3ViamVjdCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmdldFRpdGxlKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlzdWJqZWN0LnNldFRpdGxlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHVibGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gY2VsbE1vZGVscyhFbXBsb3llZSBzdWJqZWN0KSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGhvbGRlcnMgPSBuZXcgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bM107Ci0JCQlob2xkZXJzW05BTUVfQ09MVU1OXSA9IGJ1aWxkTmFtZUhvbGRlcihzdWJqZWN0KTsKLQkJCWhvbGRlcnNbVElUTEVfQ09MVU1OXSA9IGJ1aWxkVGl0bGVIb2xkZXIoc3ViamVjdCk7Ci0JCQlob2xkZXJzW01BTkFHRVJfQ09MVU1OXSA9IGJ1aWxkTWFuYWdlckhvbGRlcihzdWJqZWN0KTsKLQkJCXJldHVybiBob2xkZXJzOwotCQl9Ci0KLQkJcHVibGljIGludCBjb2x1bW5Db3VudCgpIHsKLQkJCXJldHVybiBDT0xVTU5fQ09VTlQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGNvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoY29sdW1uSW5kZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlFbXBsb3llZSBlbXBsb3llZSA9IChFbXBsb3llZSkgZWxlbWVudDsKLQotCQkJaWYgKGNvbHVtbkluZGV4ID09IFRhYmxlQ29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTikgewotCQkJCXJldHVybiBlbXBsb3llZS5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCWlmIChjb2x1bW5JbmRleCA9PSBUYWJsZUNvbHVtbkFkYXB0ZXIuVElUTEVfQ09MVU1OKSB7Ci0JCQkJcmV0dXJuIGVtcGxveWVlLmdldFRpdGxlKCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBlbXBsb3llZS5nZXRNYW5hZ2VyKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhYmxlTW9kZWwgZXh0ZW5kcyBUYWJsZU1vZGVsQWRhcHRlcjxFbXBsb3llZT4gewotCi0JCVRhYmxlTW9kZWwoTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIsCi0JCSAgICAgICAgICAgQ29sbGVjdGlvblZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbXNIb2xkZXIsCi0JCSAgICAgICAgICAgVGFibGUgdGFibGUsCi0JCSAgICAgICAgICAgQ29sdW1uQWRhcHRlcjxFbXBsb3llZT4gY29sdW1uQWRhcHRlciwKLQkJICAgICAgICAgICBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQkJc3VwZXIobGlzdEhvbGRlciwKLQkJCSAgICAgIHNlbGVjdGVkSXRlbXNIb2xkZXIsCi0JCQkgICAgICB0YWJsZSwKLQkJCSAgICAgIGNvbHVtbkFkYXB0ZXIsCi0JCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCi0JCVRhYmxlTW9kZWwoTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIsCi0JCSAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgICAgICBUYWJsZSB0YWJsZSwKLQkJICAgICAgICAgICBDb2x1bW5BZGFwdGVyPEVtcGxveWVlPiBjb2x1bW5BZGFwdGVyLAotCQkgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCQlzdXBlcihsaXN0SG9sZGVyLAotCQkJCQluZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RW1wbG95ZWU+KHNlbGVjdGVkSXRlbUhvbGRlciksCi0JCQkgICAgICB0YWJsZSwKLQkJCSAgICAgIGNvbHVtbkFkYXB0ZXIsCi0JCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgaW50IGluZGV4T2YoRW1wbG95ZWUgaXRlbSkgewotCQkJcmV0dXJuIHN1cGVyLmluZGV4T2YoaXRlbSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb248RW1wbG95ZWU+IHNlbGVjdGVkSXRlbXMoKSB7Ci0JCQlyZXR1cm4gc3VwZXIuc2VsZWN0ZWRJdGVtcygpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHRhYmxlU2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJc3VwZXIudGFibGVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVGV4dEZpZWxkTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RleHRGaWVsZE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjgxMjgwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVGV4dEZpZWxkTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRleHRGaWVsZE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiBlbnRyeSBmaWVsZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0RmllbGRNb2RlbEFkYXB0ZXJVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9OQU1FID0gIlNjb29ieSBEb28iOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG5hbWVIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGFsbENhcHNOYW1lSG9sZGVyOwotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBUZXh0RmllbGRNb2RlbEFkYXB0ZXJVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIFRleHRGaWVsZE1vZGVsQWRhcHRlclVJVGVzdChTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoREVGQVVMVF9OQU1FKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCQl0aGlzLm5hbWVIb2xkZXIgPSB0aGlzLmJ1aWxkTmFtZUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuYWxsQ2Fwc05hbWVIb2xkZXIgPSB0aGlzLmJ1aWxkQWxsQ2Fwc05hbWVIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBTdHJpbmc+KHZtLCBUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEFsbENhcHNOYW1lSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPih2bSwgVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWUoKS50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcykpOwotCQlwYXJlbnQuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIHRleHRGaWVsZFBhbmVsID0gdGhpcy5idWlsZFRleHRGaWVsZFBhbmVsKG1haW5QYW5lbCk7Ci0JCXRoaXMuYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsLCB0ZXh0RmllbGRQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVGV4dEZpZWxkUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMzUpOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZE5hbWVUZXh0RmllbGQocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVhZE9ubHlOYW1lVGV4dEZpZWxkKHBhbmVsKTsKLQkJdGhpcy5idWlsZEFsbENhcHNOYW1lVGV4dEZpZWxkKHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTmFtZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFKTsKLQkJVGV4dEZpZWxkTW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMubmFtZUhvbGRlciwgdGV4dEZpZWxkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZWFkT25seU5hbWVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUZXh0IHRleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSk7Ci0JCXRleHRGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJVGV4dEZpZWxkTW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMubmFtZUhvbGRlciwgdGV4dEZpZWxkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRBbGxDYXBzTmFtZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFKTsKLQkJdGV4dEZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQlUZXh0RmllbGRNb2RlbEFkYXB0ZXIuYWRhcHQodGhpcy5hbGxDYXBzTmFtZUhvbGRlciwgdGV4dEZpZWxkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBjaGVja0JveFBhbmVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2hlY2tCb3hQYW5lbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRSZXNldE5hbWVCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzZXROYW1lQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFJlc2V0TmFtZUFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXNldE5hbWVBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXNldCBuYW1lIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzZXQgbmFtZSIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlc2V0TmFtZSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0TmFtZShERUZBVUxUX05BTUUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENsZWFyTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlc3RvcmVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlc3RvcmUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZXN0b3JlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRQcmludE1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFByaW50TW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJwcmludCBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRleHRGaWVsZE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJwcmludCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibmFtZTogIiArIHRoaXMudGVzdE1vZGVsLm5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vZGVsIGNsYXNzICoqKioqKioqKioKLQotCWNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCQlwdWJsaWMgVGVzdE1vZGVsKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYjg4NDAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3d0LlRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuRGVmYXVsdFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuVHJpU3RhdGVDaGVja0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIHRyaS1zdGF0ZSBjaGVjayBib3hlcy4KLSAqLwotcHVibGljIGNsYXNzIFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMUhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcySG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbm90RmxhZzJIb2xkZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbChCb29sZWFuLlRSVUUsIEJvb2xlYW4uRkFMU0UpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuZmxhZzFIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzFIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcySG9sZGVyID0gdGhpcy5idWlsZEZsYWcySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5ub3RGbGFnMkhvbGRlciA9IHRoaXMuYnVpbGROb3RGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcxSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuRkxBRzFfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5pc0ZsYWcxKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEZsYWcxKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRmxhZzJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmlzRmxhZzIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb3RGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLk5PVF9GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmlzTm90RmxhZzIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Tm90RmxhZzIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcykpOwotCQlwYXJlbnQuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIGNoZWNrQm94UGFuZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgY2hlY2tCb3hQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQ2hlY2tCb3hQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zNSk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxhZzFDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRGbGFnMkNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZE5vdEZsYWcyQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkVW5hdHRhY2hlZENoZWNrQm94KHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxhZzFDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJmbGFnIDEiLCBEZWZhdWx0V2lkZ2V0RmFjdG9yeS5pbnN0YW5jZSgpKTsKLQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLmZsYWcxSG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxhZzJDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJmbGFnIDIiLCBEZWZhdWx0V2lkZ2V0RmFjdG9yeS5pbnN0YW5jZSgpKTsKLQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLmZsYWcySG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTm90RmxhZzJDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJuZXh0IGZsYWcgMiIsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMubm90RmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3gocGFyZW50LCAidW5hdHRhY2hlZCIsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkVW5hdHRhY2hlZFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRVbmF0dGFjaGVkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hdHRhY2hlZCBkZWZhdWx0IHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgY2hlY2tCb3hQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxpcEZsYWcxQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24ocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsaXBGbGFnMUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRGbGlwRmxhZzFBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkRmxpcEZsYWcxQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigibmV4dCBmbGFnIDEiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMubmV4dEZsYWcxKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgibmV4dCBmbGFnIDEiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBuZXh0RmxhZzEoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLm5leHRGbGFnMSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENsZWFyTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc3RvcmUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcmludE1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUHJpbnRNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInByaW50IG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJwcmludCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAxOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc05vdEZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiIpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBCb29sZWFuIGZsYWcxOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzFfUFJPUEVSVFkgPSAiZmxhZzEiOwotCQlwcml2YXRlIEJvb2xlYW4gZmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHMl9QUk9QRVJUWSA9ICJmbGFnMiI7Ci0JCXByaXZhdGUgQm9vbGVhbiBub3RGbGFnMjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9GTEFHMl9QUk9QRVJUWSA9ICJub3RGbGFnMiI7Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoQm9vbGVhbiBmbGFnMSwgQm9vbGVhbiBmbGFnMikgewotCQkJdGhpcy5mbGFnMSA9IGZsYWcxOwotCQkJdGhpcy5mbGFnMiA9IGZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9IHRoaXMubmV4dChmbGFnMik7Ci0JCX0KLQkJcHJpdmF0ZSBCb29sZWFuIG5leHQoQm9vbGVhbiBiKSB7Ci0JCQlyZXR1cm4gKGIgPT0gbnVsbCkgPyBCb29sZWFuLlRSVUUgOiBiLmJvb2xlYW5WYWx1ZSgpID8gQm9vbGVhbi5GQUxTRSA6IG51bGw7Ci0JCX0KLQkJcHVibGljIEJvb2xlYW4gaXNGbGFnMSgpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcxOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcxKEJvb2xlYW4gZmxhZzEpIHsKLQkJCUJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMTsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMV9QUk9QRVJUWSwgb2xkLCBmbGFnMSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbmV4dEZsYWcxKCkgewotCQkJdGhpcy5zZXRGbGFnMSh0aGlzLm5leHQodGhpcy5mbGFnMSkpOwotCQl9Ci0JCXB1YmxpYyBCb29sZWFuIGlzRmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMihCb29sZWFuIGZsYWcyKSB7Ci0JCQlCb29sZWFuIG9sZCA9IHRoaXMuZmxhZzI7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzJfUFJPUEVSVFksIG9sZCwgZmxhZzIpOwotCi0JCQlvbGQgPSB0aGlzLm5vdEZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9IHRoaXMubmV4dChmbGFnMik7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9UX0ZMQUcyX1BST1BFUlRZLCBvbGQsIHRoaXMubm90RmxhZzIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG5leHRGbGFnMigpIHsKLQkJCXRoaXMuc2V0RmxhZzIodGhpcy5uZXh0KHRoaXMuZmxhZzIpKTsKLQkJfQotCQlwdWJsaWMgQm9vbGVhbiBpc05vdEZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMubm90RmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Tm90RmxhZzIoQm9vbGVhbiBub3RGbGFnMikgewotCQkJdGhpcy5zZXRGbGFnMih0aGlzLm5leHQoZmxhZzIpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBuZXh0Tm90RmxhZzIoKSB7Ci0JCQl0aGlzLnNldE5vdEZsYWcyKHRoaXMubmV4dCh0aGlzLm5vdEZsYWcyKSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5pc0ZsYWcxKCkgKyAiIC0gIiArIHRoaXMuaXNGbGFnMigpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sQWxpZ25lclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzA5YjFlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xBbGlnbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sQWxpZ25lclRlc3QgewotCi0JcHJpdmF0ZSBDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByaXZhdGUgTGF5b3V0IGJ1aWxkU3BhY2VyTGF5b3V0KCkgewotCQlyZXR1cm4gbmV3IExheW91dCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoSGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0SGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQotCQkJCXJldHVybiBuZXcgUG9pbnQod2lkdGhIaW50LCBoZWlnaHRIaW50KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLQkJCQljb21wb3NpdGUuc2V0Qm91bmRzKDAsIDAsIGRhdGEud2lkdGhIaW50LCBkYXRhLmhlaWdodEhpbnQpOwotCQkJfQotCQl9OwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQotCQljb250cm9sQWxpZ25lciA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCi0JCXNoZWxsICA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQotCQlpZiAoY29udHJvbEFsaWduZXIgIT0gbnVsbCkgewotCQkJY29udHJvbEFsaWduZXIuZGlzcG9zZSgpOwotCQkJY29udHJvbEFsaWduZXIgPSBudWxsOwotCQl9Ci0KLQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCXNoZWxsID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2wxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBiZSAwLCIsCi0JCQkwLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUgPSBsYWJlbC5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemUueCArICIsIiwKLQkJCXNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQlidXR0b24uc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemUueCArICIsIiwKLQkJCXNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChidXR0b24pOwotCi0JCVBvaW50IGxhYmVsU2l6ZSAgPSBsYWJlbC5nZXRTaXplKCk7Ci0JCVBvaW50IGJ1dHRvblNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLngsIGJ1dHRvblNpemUueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIG1heCArICIsIiwKLQkJCW1heCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbEFsaWduZXIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCWxhYmVsMi5zZXRUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIENvbnRyb2xBbGlnbmVyIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplMSA9IGxhYmVsMS5nZXRTaXplKCk7Ci0JCVBvaW50IHNpemUyID0gbGFiZWwyLmdldFNpemUoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5tYXgoc2l6ZTEueCwgc2l6ZTIueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbEFsaWduZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIyLmFkZChsYWJlbDIpOwotCi0JCWxhYmVsMS5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJbGFiZWwyLnNldFRleHQoIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgQ29udHJvbEFsaWduZXIiKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQoY29udHJvbEFsaWduZXIyKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUxID0gbGFiZWwxLmdldFNpemUoKTsKLQkJUG9pbnQgc2l6ZTIgPSBsYWJlbDIuZ2V0U2l6ZSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLm1heChzaXplMS54LCBzaXplMi54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdChleHBlY3RlZD1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2xBbGlnbmVyVG9JdHNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyKTsKLQkJZmFpbCgiQSBDb250cm9sQWxpZ25lciBjYW4ndCBiZSBhZGRlZCB0byBpdHNlbGYiKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3REaWFsb2dfQWRkQ29udHJvbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlmaW5hbCBpbnRbXSBtYXhpbXVtV2lkdGggPSBuZXcgaW50WzFdOwotCQlmaW5hbCBpbnRbXSBzaXplID0gbmV3IGludFsxXTsKLQotCQlUaXRsZUFyZWFEaWFsb2cgZGlhbG9nID0gbmV3IFRpdGxlQXJlYURpYWxvZyhTV1RVdGlsLmdldFNoZWxsKCkpIHsKLQotCQkJcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQkJCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCQlsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTEVGVCk7Ci0JCQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQotCQkJCXJldHVybiBwYXJlbnQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJvdW5kcygpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplQm91bmRzKCk7Ci0JCQkJc2l6ZVswXSA9IGxhYmVsLmdldFNpemUoKS54OwotCQkJCW1heGltdW1XaWR0aFswXSA9IGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpOwotCQkJfQotCQl9OwotCi0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmNsb3NlKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemVbMF0gKyAiLCIsCi0JCQlzaXplWzBdLAotCQkJbWF4aW11bVdpZHRoWzBdCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlhbG9nX0FkZENvbnRyb2wyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJZmluYWwgaW50W10gbWF4aW11bVdpZHRoID0gbmV3IGludFsxXTsKLQkJZmluYWwgaW50W10gc2l6ZXMgPSBuZXcgaW50WzJdOwotCi0JCVRpdGxlQXJlYURpYWxvZyBkaWFsb2cgPSBuZXcgVGl0bGVBcmVhRGlhbG9nKFNXVFV0aWwuZ2V0U2hlbGwoKSkgewotCi0JCQlwcml2YXRlIEJ1dHRvbiBidXR0b247Ci0JCQlwcml2YXRlIExhYmVsIGxhYmVsOwotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkJCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJCWxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJCQl1cGRhdGVHcmlkRGF0YShsYWJlbCk7Ci0KLQkJCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCi0JCQkJYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJCQl1cGRhdGVHcmlkRGF0YShidXR0b24pOwotCi0JCQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCb3VuZHMoKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZUJvdW5kcygpOwotCQkJCXNpemVzWzBdID0gbGFiZWwuZ2V0U2l6ZSgpLng7Ci0JCQkJc2l6ZXNbMV0gPSBidXR0b24uZ2V0U2l6ZSgpLng7Ci0JCQkJbWF4aW11bVdpZHRoWzBdID0gY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuY2xvc2UoKTsKLQotCQlpbnQgbGFiZWxTaXplICA9IHNpemVzWzBdOwotCQlpbnQgYnV0dG9uU2l6ZSA9IHNpemVzWzFdOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLCBidXR0b25TaXplKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJbWF4aW11bVdpZHRoWzBdCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoIlRoaXMgaXMgdmVyeSBsb25nIHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhbmUsIFNXVC5OVUxMKTsKLQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQotCQlQb2ludCBsYWJlbFNpemUgID0gbGFiZWwuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBtYXggKyAiLCIsCi0JCQltYXgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWxhYmVsLmRpc3Bvc2UoKTsKLQotCQlQb2ludCBuZXdCdXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQotCQlhc3NlcnROb3RTYW1lKAotCQkJIlRoZSBvbGQgbWF4IGFuZCBuZXcgbWF4IHNob3VsZCBub3QgYmUgdGhlIHNhbWUiLAotCQkJbWF4LAotCQkJbmV3QnV0dG9uU2l6ZS54Ci0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBDb250cm9sQWxpZ25lciBkb2Vzbid0IGhhdmUgdGhlIHJpZ2h0IG1heGltdW0gd2lkdGgiLAotCQkJbmV3QnV0dG9uU2l6ZS54LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RIaWVyYXJjaHlPZkNvbnRyb2xBbGlnbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIEFsaWduZXIxCi0JCS8vICBeCi0JCS8vICB8LUFsaWduZXIyCi0JCS8vICAgICBeCi0JCS8vICAgICB8LUFsaWduZXIzCi0JCUNvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyMiA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCQljb250cm9sQWxpZ25lci5hZGQoY29udHJvbEFsaWduZXIyKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjMgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIyLmFkZChjb250cm9sQWxpZ25lcjMpOwotCi0JCS8vIFRlc3QgMQotCQlMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsMS5zZXRUZXh0KCJUaGlzIGlzIGEgbGFiZWwgd2lkZ2V0Iik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJaW50IGxhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQljb250cm9sQWxpZ25lcjMuYWRkKGxhYmVsMSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgbGFiZWxXaWR0aDEpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBsYWJlbFdpZHRoMSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSwgbGFiZWxXaWR0aDEpOwotCi0JCS8vIFRlc3QgMgotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsMi5zZXRUZXh0KCJTaG9ydExhYmVsIik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQlpbnQgbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCWludCBuZXdMYWJlbFdpZHRoMiA9IGxhYmVsMi5nZXRTaXplKCkueDsKLQotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIzLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgbmV3TGFiZWxXaWR0aDIpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQotCQkvLyBUZXN0IDMKLQkJTGFiZWwgbGFiZWwzID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbDMuc2V0VGV4dCgiQSB2ZXJ5IGxvbmcgbGFiZWwgdGhhdCB0YWtlcyBhIGxvdCBvZiBob3Jpem9udGFsIHNwYWNlIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMyk7Ci0KLQkJbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgyID0gbGFiZWwyLmdldFNpemUoKS54OwotCQlpbnQgbmV3TGFiZWxXaWR0aDMgPSBsYWJlbDMuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIG5ld0xhYmVsV2lkdGgyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgyLCBuZXdMYWJlbFdpZHRoMyk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCi0JCS8vIE1ha2Ugc3VyZSBhbGwgdGhlIGxvY2tlZCBhcmUgcmVtb3ZlZAotCQlhc3NlcnRFcXVhbHMoQ2xhc3NUb29scy5hdHRlbXB0VG9HZXRGaWVsZFZhbHVlKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQ2xhc3NUb29scy5hdHRlbXB0VG9HZXRGaWVsZFZhbHVlKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0IG9mIGxhYmVsMgotCQlsYWJlbDIuc2V0VGV4dCgibW0iKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUpOwotCi0JCW5ld0xhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQluZXdMYWJlbFdpZHRoMiA9IGxhYmVsMi5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDMgPSBsYWJlbDMuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIG5ld0xhYmVsV2lkdGgyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgyLCBuZXdMYWJlbFdpZHRoMyk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCi0JCWFzc2VydEVxdWFscyhDbGFzc1Rvb2xzLmF0dGVtcHRUb0dldEZpZWxkVmFsdWUoY29udHJvbEFsaWduZXIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhDbGFzc1Rvb2xzLmF0dGVtcHRUb0dldEZpZWxkVmFsdWUoY29udHJvbEFsaWduZXIyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQ2xhc3NUb29scy5hdHRlbXB0VG9HZXRGaWVsZFZhbHVlKGNvbnRyb2xBbGlnbmVyMywgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHRleHQgb2YgbGFiZWwxCi0JCWxhYmVsMS5zZXRUZXh0KCJhIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQlDb21wb3NpdGUgcGFyZW50MSA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTlVMTCk7Ci0JCXBhcmVudDEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUxhYmVsIHRlbXBMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQxLCBTV1QuTlVMTCk7Ci0JCXRlbXBMYWJlbC5zZXRUZXh0KCJhIik7Ci0vLwkJcGFyZW50MS5sYXlvdXQodHJ1ZSk7Ci0KLQkJaW50IHJlYWxXaWR0aCA9IHRlbXBMYWJlbC5nZXRTaXplKCkueDsKLQotCQluZXdMYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RmFsc2UobmV3TGFiZWxXaWR0aDEgPT0gcmVhbFdpZHRoKTsKLQotCQlhc3NlcnRFcXVhbHMoQ2xhc3NUb29scy5hdHRlbXB0VG9HZXRGaWVsZFZhbHVlKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQ2xhc3NUb29scy5hdHRlbXB0VG9HZXRGaWVsZFZhbHVlKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0IG9mIGxhYmVsMQotCQlsYWJlbDEuc2V0VGV4dCgiWWVzIGFub3RoZXIgYmlnIGxvbmcgbG9uZyB0ZXh0IHNvIHRoYXQgYWxsIHRoZSBsYWJlbHMgd2lsbCBoYXZlIHRvIHRha2UgdGhlIHNpemUgb2YgdGhpcyBsYWJlbCB0byBtYWtlIHN1cmUgQ29udHJvbEFsaWduZXIgd29ya3MgY29ycmVjdGx5Iik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQkvLyBXZWlyZDogSXQgc2VlbXMgbm8gbm90aWZpY2F0aW9uIGlzIHNlbnQsIGZpcmUgb25lIG1hbnVhbGx5Ci0JCUV2ZW50IGV2ZW50ICA9IG5ldyBFdmVudCgpOwotCQlldmVudC53aWRnZXQgPSBsYWJlbDE7Ci0JCWV2ZW50LnR5cGUgICA9IFNXVC5SZXNpemU7Ci0JCWxhYmVsMS5ub3RpZnlMaXN0ZW5lcnMoU1dULlJlc2l6ZSwgZXZlbnQpOwotCi0JCUNvbXBvc2l0ZSBwYXJlbnQyID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OVUxMKTsKLQkJcGFyZW50Mi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJdGVtcExhYmVsID0gbmV3IExhYmVsKHBhcmVudDIsIFNXVC5OVUxMKTsKLQkJdGVtcExhYmVsLnNldFRleHQobGFiZWwxLmdldFRleHQoKSk7Ci0JCXBhcmVudDIubGF5b3V0KHRydWUpOwotCi0JCXJlYWxXaWR0aCA9IHRlbXBMYWJlbC5nZXRTaXplKCkueDsKLQotCQluZXdMYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCksIG5ld0xhYmVsV2lkdGgxKTsKLQkJYXNzZXJ0RXF1YWxzKHJlYWxXaWR0aCwgbmV3TGFiZWxXaWR0aDEpOwotCi0JCWFzc2VydEVxdWFscyhDbGFzc1Rvb2xzLmF0dGVtcHRUb0dldEZpZWxkVmFsdWUoY29udHJvbEFsaWduZXIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhDbGFzc1Rvb2xzLmF0dGVtcHRUb0dldEZpZWxkVmFsdWUoY29udHJvbEFsaWduZXIyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQ2xhc3NUb29scy5hdHRlbXB0VG9HZXRGaWVsZFZhbHVlKGNvbnRyb2xBbGlnbmVyMywgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb250cm9sMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgc2l6ZS54ICsgIiwiLAotCQkJc2l6ZS54LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQljb250cm9sQWxpZ25lci5yZW1vdmUoYnV0dG9uKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAwLCAiLAotCQkJMCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQotCQlQb2ludCBsYWJlbFNpemUgID0gbGFiZWwuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBtYXggKyAiLCIsCi0JCQltYXgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWNvbnRyb2xBbGlnbmVyLnJlbW92ZShsYWJlbCk7Ci0KLQkJUG9pbnQgbmV3QnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZSgKLQkJCSJUaGUgb2xkIG1heCBhbmQgbmV3IG1heCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwKLQkJCW1heCwKLQkJCW5ld0J1dHRvblNpemUueAotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgQ29udHJvbEFsaWduZXIgZG9lc24ndCBoYXZlIHRoZSByaWdodCBtYXhpbXVtIHdpZHRoIiwKLQkJCW5ld0J1dHRvblNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gV2lkZ2V0IDEKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQotCQkvLyBXaWRnZXQgMgotCQlDb21wb3NpdGUgc3BhY2VyID0gbmV3IENvbXBvc2l0ZShwYW5lLCBTV1QuTlVMTCk7Ci0JCXNwYWNlci5zZXRMYXlvdXQoYnVpbGRTcGFjZXJMYXlvdXQoKSk7Ci0JCXVwZGF0ZUdyaWREYXRhKHNwYWNlcik7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChzcGFjZXIpOwotCi0JCS8vIFdpZGdldCAzCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhbmUsIFNXVC5OVUxMKTsKLQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgMyB3aWRnZXRzIGhhdmUgdGhlIHNhbWUgd2lkdGgKLQkJUG9pbnQgbGFiZWxTaXplICA9IGxhYmVsLmdldFNpemUoKTsKLQkJUG9pbnQgc3BhY2VyU2l6ZSA9IHNwYWNlci5nZXRTaXplKCk7Ci0JCVBvaW50IGJ1dHRvblNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLngsIGJ1dHRvblNpemUueCk7Ci0JCW1heCA9IE1hdGgubWF4KG1heCwgc3BhY2VyU2l6ZS54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwYWNlcidzIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJc3BhY2VyU2l6ZS54Ci0JCSk7Ci0KLQkJLy8gUmVtb3ZlIHRoZSBsYWJlbCAodGhlIHdpZGVzdCB3aWRnZXQpIGFuZCBtYWtlIHN1cmUgdGhlIHdpZHRoIHdhcwotCQkvLyBjb3JyZWN0bHkgY2FsY3VsYXRlZAotCQljb250cm9sQWxpZ25lci5yZW1vdmUobGFiZWwpOwotCi0JCXNwYWNlclNpemUgPSBzcGFjZXIuZ2V0U2l6ZSgpOwotCQlidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heDIgPSBNYXRoLm1heChzcGFjZXJTaXplLngsIGJ1dHRvblNpemUueCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZSgKLQkJCSJUaGUgb2xkIG1heCBhbmQgbmV3IG1heCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwKLQkJCW1heCwKLQkJCW1heDIKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIENvbnRyb2xBbGlnbmVyIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgbWF4aW11bSB3aWR0aCIsCi0JCQltYXgyLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwYWNlcidzIHdpZHRoIHNob3VsZCBoYXZlIGJlZW4gYWRqdXN0ZWQiLAotCQkJbWF4MiwKLQkJCXNwYWNlclNpemUueAotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRyb2xBbGlnbmVyMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMSk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMSk7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIyID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sQWxpZ25lcjIpOwotCQljb250cm9sQWxpZ25lcjIuYWRkKGxhYmVsMik7Ci0KLQkJbGFiZWwxLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQlsYWJlbDIuc2V0VGV4dCgiVGhpcyBpcyBhIHZlcnkgbG9uZyBDb250cm9sQWxpZ25lciIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZTEgPSBsYWJlbDEuZ2V0U2l6ZSgpOwotCQlQb2ludCBzaXplMiA9IGxhYmVsMi5nZXRTaXplKCk7Ci0JCWludCB3aWR0aCA9IE1hdGgubWF4KHNpemUxLngsIHNpemUyLngpOwotCi0JCS8vIFRlc3QgMQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQkvLyBUZXN0IDIKLQkJY29udHJvbEFsaWduZXIucmVtb3ZlKGxhYmVsMSk7Ci0KLQkJd2lkdGggPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbEFsaWduZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCWxhYmVsMi5zZXRUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIENvbnRyb2xBbGlnbmVyIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplMSA9IGxhYmVsMS5nZXRTaXplKCk7Ci0JCVBvaW50IHNpemUyID0gbGFiZWwyLmdldFNpemUoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5tYXgoc2l6ZTEueCwgc2l6ZTIueCk7Ci0KLQkJLy8gVGVzdCAxCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCS8vIFRlc3QgMgotCQljb250cm9sQWxpZ25lcjIucmVtb3ZlKGxhYmVsMik7Ci0KLQkJd2lkdGggPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbnRyb2wgY29udHJvbCkgewotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQljb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xFbmFibGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEVuYWJsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNjJjYzkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEVuYWJsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sRW5hYmxlclRlc3QgewotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoU3RhdGUoKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIgPQotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPih0cnVlKTsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCi0JCW5ldyBDb250cm9sRW5hYmxlcihib29sZWFuSG9sZGVyLCBjb21ibyk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIGJlIGVuYWJsZWQiLAotCQkJY29tYm8uaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKG51bGwpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBub3QgYmUgZW5hYmxlZCIsCi0JCQljb21iby5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAodHJ1ZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgYmUgZW5hYmxlZCIsCi0JCQljb21iby5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAoZmFsc2UpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoZmFsc2UpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgbm90IGJlIGVuYWJsZWQiLAotCQkJY29tYm8uaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBEaXNwb3NlCi0JCWNvbWJvLmRpc3Bvc2UoKTsKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0M2UyYmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbFN3aXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xTd2l0Y2hlclRlc3QgewotCi0JcHJpdmF0ZSBQYWdlQm9vayBwYWdlQm9vazsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYW5lMTsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYW5lMjsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZFBhbmUxKCkgewotCi0JCWlmIChwYW5lMSA9PSBudWxsKSB7Ci0KLQkJCXBhbmUxID0gbmV3IENvbXBvc2l0ZShwYWdlQm9vaywgU1dULk5VTEwpOwotCQkJcGFuZTEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUxLCBTV1QuTlVMTCk7Ci0JCQlsYWJlbC5zZXRUZXh0KCImVGVzdDI6Iik7Ci0KLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhbmUxLCBTV1QuQk9SREVSKTsKLQkJCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhbmUxLCBTV1QuQk9SREVSKTsKLQotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl9Ci0KLQkJcmV0dXJuIHBhbmUxOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGJ1aWxkUGFuZTIoKSB7Ci0KLQkJaWYgKHBhbmUyID09IG51bGwpIHsKLQotCQkJcGFuZTIgPSBuZXcgQ29tcG9zaXRlKHBhZ2VCb29rLCBTV1QuTlVMTCk7Ci0JCQlwYW5lMi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZTIsIFNXVC5OVUxMKTsKLQkJCWxhYmVsLnNldFRleHQoIiZUZXN0MToiKTsKLQotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFuZTIsIFNXVC5CT1JERVIpOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJfQotCi0JCXJldHVybiBwYW5lMjsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPEJvb2xlYW4sIENvbnRyb2w+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQ29udHJvbD4oKSB7Ci0JCQlwdWJsaWMgQ29udHJvbCB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyBudWxsIDogKHZhbHVlID8gcGFuZTEgOiBwYW5lMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQotCQkJcGFyZW50ICAgPSBudWxsOwotCQkJcGFnZUJvb2sgPSBudWxsOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoKCkgewotCi0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBzd2l0Y2hIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KCk7Ci0JCVRyYW5zZm9ybWVyPEJvb2xlYW4sIENvbnRyb2w+IHRyYW5zZm9ybWVyID0gYnVpbGRUcmFuc2Zvcm1lcigpOwotCi0JCXBhbmUxID0gYnVpbGRQYW5lMSgpOwotCQlwYW5lMS5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQlwYW5lMiA9IGJ1aWxkUGFuZTIoKTsKLQkJcGFuZTIuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJbmV3IENvbnRyb2xTd2l0Y2hlcigKLQkJCXN3aXRjaEhvbGRlciwKLQkJCXRyYW5zZm9ybWVyLAotCQkJcGFnZUJvb2sKLQkJKTsKLQotCQkvLyBUZXN0IDEKLQkJc3dpdGNoSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCQlDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgQ2xhc3NUb29scy5maWVsZFZhbHVlKHBhZ2VCb29rLCAiY3VycmVudFBhZ2UiKTsKLQotCQlhc3NlcnROb3ROdWxsKAotCQkJIlRoZSBwYWdlIGJvb2sncyBwYWdlIHNob3VsZG4ndCBiZSBudWxsIiwKLQkJCWNvbnRyb2wKLQkJKTsKLQotCQlhc3NlcnRTYW1lKAotCQkJIlRoZSBjdXJyZW50IHBhbmUgc2hvdWxkIGJlIHBhbmUxIiwKLQkJCXBhbmUxLAotCQkJY29udHJvbAotCQkpOwotCi0JCVBvaW50IHBhbmUxU2l6ZSA9IHBhbmUxLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCVBvaW50IHBhZ2VCb29rU2l6ZSA9IHBhZ2VCb29rLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBvZiB0aGUgUGFnZUJvb2sgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSB3aWR0aCBvZiBwYW5lMSIsCi0JCQlwYW5lMVNpemUueCwKLQkJCXBhZ2VCb29rU2l6ZS54Ci0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBoZWlnaHQgb2YgdGhlIFBhZ2VCb29rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgaGVpZ2h0IG9mIHBhbmUxIiwKLQkJCXBhbmUxU2l6ZS55LAotCQkJcGFnZUJvb2tTaXplLnkKLQkJKTsKLQotCQkvLyBUZXN0IDIKLQkJc3dpdGNoSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQkJY29udHJvbCA9IChDb250cm9sKSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUocGFnZUJvb2ssICJjdXJyZW50UGFnZSIpOwotCi0JCWFzc2VydE5vdE51bGwoCi0JCQkiVGhlIHBhZ2UgYm9vaydzIHBhZ2Ugc2hvdWxkbid0IGJlIG51bGwiLAotCQkJY29udHJvbAotCQkpOwotCi0JCWFzc2VydFNhbWUoCi0JCQkiVGhlIGN1cnJlbnQgcGFuZSBzaG91bGQgYmUgcGFuZTIiLAotCQkJcGFuZTIsCi0JCQljb250cm9sCi0JCSk7Ci0KLQkJUG9pbnQgcGFuZTJTaXplID0gcGFuZTIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJcGFnZUJvb2tTaXplID0gcGFnZUJvb2suY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIG9mIHRoZSBQYWdlQm9vayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHdpZHRoIG9mIHBhbmUyIiwKLQkJCXBhbmUyU2l6ZS54LAotCQkJcGFnZUJvb2tTaXplLngKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIGhlaWdodCBvZiB0aGUgUGFnZUJvb2sgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBoZWlnaHQgb2YgcGFuZTIiLAotCQkJcGFuZTJTaXplLnksCi0JCQlwYWdlQm9va1NpemUueQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhZmYzNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5Db250cm9sVmlzaWJpbGl0eUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udHJvbFZpc2liaWxpdHlFbmFibGVyVGVzdCB7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hTdGF0ZSgpIHsKLQotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciA9Ci0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KHRydWUpOwotCi0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUik7Ci0KLQkJbmV3IENvbnRyb2xWaXNpYmlsaXR5RW5hYmxlcihib29sZWFuSG9sZGVyLCBjb21ibyk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIGJlIHZpc2libGUiLAotCQkJY29tYm8uaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKG51bGwpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBub3QgYmUgdmlzaWJsZSIsCi0JCQljb21iby5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAodHJ1ZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgYmUgdmlzaWJsZSIsCi0JCQljb21iby5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAoZmFsc2UpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoZmFsc2UpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgbm90IGJlIHZpc2libGUiLAotCQkJY29tYm8uaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBEaXNwb3NlCi0JCWNvbWJvLmRpc3Bvc2UoKTsKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9KcHRVaVV0aWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSnB0VWlVdGlsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjZmIwOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9KcHRVaVV0aWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkpVbml0NFRlc3RBZGFwdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlLlN1aXRlQ2xhc3NlczsKLQotQFN1aXRlQ2xhc3NlcwotKHsKLQlDb250cm9sQWxpZ25lclRlc3QuY2xhc3MsCi0JQ29udHJvbFN3aXRjaGVyVGVzdC5jbGFzcywKLQlDb250cm9sRW5hYmxlclRlc3QuY2xhc3MsCi0JQ29udHJvbFZpc2liaWxpdHlFbmFibGVyVGVzdC5jbGFzcywKLQlMYWJlbGVkQnV0dG9uVGVzdC5jbGFzcywKLQlMYWJlbGVkTGFiZWxUZXN0LmNsYXNzLAotCUxhYmVsZWRDb250cm9sVXBkYXRlclRlc3QuY2xhc3MsCi0JUGFuZUVuYWJsZXJUZXN0LmNsYXNzLAotCVBhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QuY2xhc3MsCi19KQotQFJ1bldpdGgoU3VpdGUuY2xhc3MpCi1wdWJsaWMgZmluYWwgY2xhc3MgSnB0VWlVdGlsVGVzdHMgewotCi0JcHJpdmF0ZSBKcHRVaVV0aWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEpVbml0NFRlc3RBZGFwdGVyKEpwdFVpVXRpbFRlc3RzLmNsYXNzKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQnV0dG9uVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1N2QxYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQnV0dG9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZEJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZEJ1dHRvblRlc3QgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCQlwYXJlbnQgPSBudWxsOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZEJ1dHRvbjEoKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5VTEwpOwotCQluZXcgTGFiZWxlZEJ1dHRvbihidXR0b24pOwotCX0KLQotCUBUZXN0KGV4cGVjdGVkPUFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5jbGFzcykKLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZEJ1dHRvbjIoKSB7Ci0JCW5ldyBMYWJlbGVkQnV0dG9uKG51bGwpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlKCkgewotCi0JCUltYWdlIGV4cGVjdGVkID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIDE2LCAxNik7Ci0KLQkJdHJ5IHsKLQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5VTEwpOwotCQkJTGFiZWxlZEJ1dHRvbiBsYWJlbGVkQnV0dG9uID0gbmV3IExhYmVsZWRCdXR0b24oYnV0dG9uKTsKLQotCQkJbGFiZWxlZEJ1dHRvbi5zZXRJbWFnZShleHBlY3RlZCk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIEJ1dHRvbiBkaWRuJ3QgcmVjZWl2ZSB0aGUgSW1hZ2UiLAotCQkJCWV4cGVjdGVkLAotCQkJCWJ1dHRvbi5nZXRJbWFnZSgpCi0JCQkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2VEaXNwb3NlKCkgewotCi0JCUltYWdlIGV4cGVjdGVkID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIDE2LCAxNik7Ci0KLQkJdHJ5IHsKLQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5VTEwpOwotCQkJTGFiZWxlZEJ1dHRvbiBsYWJlbGVkQnV0dG9uID0gbmV3IExhYmVsZWRCdXR0b24oYnV0dG9uKTsKLQotCQkJYnV0dG9uLmRpc3Bvc2UoKTsKLQotCQkJLy8gVGhpcyBzaG91bGQgbm90IGZhaWwgYnV0IHNpbXBseSBkbyBub3RoaW5nCi0JCQlsYWJlbGVkQnV0dG9uLnNldEltYWdlKGV4cGVjdGVkKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldFRleHQoKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbGVkQnV0dG9uIGxhYmVsZWRCdXR0b24gPSBuZXcgTGFiZWxlZEJ1dHRvbihidXR0b24pOwotCi0JCVN0cmluZyBleHBlY3RlZCA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0JCWxhYmVsZWRCdXR0b24uc2V0VGV4dChleHBlY3RlZCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBCdXR0b24gZGlkbid0IHJlY2VpdmUgdGhlIHRleHQiLAotCQkJZXhwZWN0ZWQsCi0JCQlidXR0b24uZ2V0VGV4dCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dERpc3Bvc2UoKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbGVkQnV0dG9uIGxhYmVsZWRCdXR0b24gPSBuZXcgTGFiZWxlZEJ1dHRvbihidXR0b24pOwotCi0JCWJ1dHRvbi5kaXNwb3NlKCk7Ci0KLQkJLy8gVGhpcyBzaG91bGQgbm90IGZhaWwgYnV0IHNpbXBseSBkbyBub3RoaW5nCi0JCVN0cmluZyBleHBlY3RlZCA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0JCWxhYmVsZWRCdXR0b24uc2V0VGV4dChleHBlY3RlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2xVcGRhdGVyVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2xVcGRhdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjEzODUyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMYWJlbGVkQ29udHJvbFVwZGF0ZXJUZXN0IHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQkJcGFyZW50ID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlKCkgewotCi0JCUltYWdlIGV4cGVjdGVkID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIDE2LCAxNik7Ci0KLQkJdHJ5IHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gaW1hZ2VIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPigpOwotCQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcihsYWJlbGVkTGFiZWwsIG51bGwsIGltYWdlSG9sZGVyKTsKLQotCQkJbGFiZWxlZExhYmVsLnNldEltYWdlKGV4cGVjdGVkKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgTGFiZWwgZGlkbid0IHJlY2VpdmUgdGhlIEltYWdlIiwKLQkJCQlleHBlY3RlZCwKLQkJCQlsYWJlbC5nZXRJbWFnZSgpCi0JCQkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2VEaXNwb3NlKCkgewotCi0JCUltYWdlIGV4cGVjdGVkID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIDE2LCAxNik7Ci0KLQkJdHJ5IHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gaW1hZ2VIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPigpOwotCQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcihsYWJlbGVkTGFiZWwsIG51bGwsIGltYWdlSG9sZGVyKTsKLQotCQkJbGFiZWwuZGlzcG9zZSgpOwotCQkJbGFiZWxlZExhYmVsLnNldEltYWdlKGV4cGVjdGVkKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldFRleHQoKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcihsYWJlbGVkTGFiZWwsIHRleHRIb2xkZXIpOwotCi0JCVN0cmluZyBleHBlY3RlZCA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0JCXRleHRIb2xkZXIuc2V0VmFsdWUoZXhwZWN0ZWQpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgTGFiZWwgZGlkbid0IHJlY2VpdmUgdGhlIHRleHQiLAotCQkJZXhwZWN0ZWQsCi0JCQlsYWJlbC5nZXRUZXh0KCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0RGlzcG9zZSgpIHsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKGxhYmVsZWRMYWJlbCwgdGV4dEhvbGRlcik7Ci0KLQkJbGFiZWwuZGlzcG9zZSgpOwotCi0JCVN0cmluZyBleHBlY3RlZCA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0JCXRleHRIb2xkZXIuc2V0VmFsdWUoZXhwZWN0ZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRMYWJlbFRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRMYWJlbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0MGQzYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZExhYmVsVGVzdCB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJCXBhcmVudCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkQnV0dG9uMSgpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCW5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCX0KLQotCUBUZXN0KGV4cGVjdGVkPUFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5jbGFzcykKLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZEJ1dHRvbjIoKSB7Ci0JCW5ldyBMYWJlbGVkTGFiZWwobnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJCWxhYmVsZWRMYWJlbC5zZXRJbWFnZShleHBlY3RlZCk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIExhYmVsIGRpZG4ndCByZWNlaXZlIHRoZSBJbWFnZSIsCi0JCQkJZXhwZWN0ZWQsCi0JCQkJbGFiZWwuZ2V0SW1hZ2UoKQotCQkJKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlRGlzcG9zZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQkJbGFiZWwuZGlzcG9zZSgpOwotCi0JCQkvLyBUaGlzIHNob3VsZCBub3QgZmFpbCBidXQgc2ltcGx5IGRvIG5vdGhpbmcKLQkJCWxhYmVsZWRMYWJlbC5zZXRJbWFnZShleHBlY3RlZCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0KCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCVN0cmluZyBleHBlY3RlZCA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0JCWxhYmVsZWRMYWJlbC5zZXRUZXh0KGV4cGVjdGVkKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIExhYmVsIGRpZG4ndCByZWNlaXZlIHRoZSB0ZXh0IiwKLQkJCWV4cGVjdGVkLAotCQkJbGFiZWwuZ2V0VGV4dCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dERpc3Bvc2UoKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJbGFiZWwuZGlzcG9zZSgpOwotCi0JCS8vIFRoaXMgc2hvdWxkIG5vdCBmYWlsIGJ1dCBzaW1wbHkgZG8gbm90aGluZwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQlsYWJlbGVkTGFiZWwuc2V0VGV4dChleHBlY3RlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXJUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lRW5hYmxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM2MzcyNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lRW5hYmxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQWJzdHJhY3REaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgUGFuZUVuYWJsZXJUZXN0IHsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFN3aXRjaFN0YXRlKCkgewotCi0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyID0KLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4odHJ1ZSk7Ci0KLQkJQWJzdHJhY3REaWFsb2dQYW5lPE5vZGU+IHBhbmUgPSBuZXcgQWJzdHJhY3REaWFsb2dQYW5lPE5vZGU+KAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOb2RlPigpLAotCQkJcGFyZW50KQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJfQotCQl9OwotCi0JCXBhbmUucG9wdWxhdGUoKTsKLQkJbmV3IFBhbmVFbmFibGVyKGJvb2xlYW5Ib2xkZXIsIHBhbmUpOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIGJlIGVuYWJsZWQiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKG51bGwpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIG5vdCBiZSBlbmFibGVkIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlICh0cnVlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIGJlIGVuYWJsZWQiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKGZhbHNlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgbm90IGJlIGVuYWJsZWQiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBEaXNwb3NlCi0JCXBhbmUuZGlzcG9zZSgpOwotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ4OGM5Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5QYW5lVmlzaWJpbGl0eUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5BYnN0cmFjdERpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBQYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0IHsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFN3aXRjaFN0YXRlKCkgewotCi0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyID0KLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4odHJ1ZSk7Ci0KLQkJQWJzdHJhY3REaWFsb2dQYW5lPE5vZGU+IHBhbmUgPSBuZXcgQWJzdHJhY3REaWFsb2dQYW5lPE5vZGU+KAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOb2RlPigpLAotCQkJcGFyZW50KQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJfQotCQl9OwotCi0JCXBhbmUucG9wdWxhdGUoKTsKLQkJbmV3IFBhbmVWaXNpYmlsaXR5RW5hYmxlcihib29sZWFuSG9sZGVyLCBwYW5lKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBiZSB2aXNpYmxlIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBub3QgYmUgdmlzaWJsZSIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAodHJ1ZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBiZSB2aXNpYmxlIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChmYWxzZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQlwYW5lLmRpc3Bvc2UoKTsKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjhkOTFjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5jdnNpZ25vcmUgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiYTYxMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTUyNzFlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjhmOWMyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjEyOjI2IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGI1YzRjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjU1OjU4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYyOGNmYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanB0LnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm5vZGU7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL2Fib3V0Lmh0bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmU5YzA4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTk1NzY4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgVXRpbGl0eSBUZXN0cwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3Jlc291cmNlL0NsYXNzVG9vbHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9yZXNvdXJjZS9DbGFzc1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzE3YjYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3Jlc291cmNlL0NsYXNzVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSB0ZXN0OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2RzIHJlbGF0ZWQgdG8gdGhlIGphdmEubGFuZy5yZWZsZWN0IHBhY2thZ2UuCi0gKiBUaGVzZSBtZXRob2RzIHByb3ZpZGUgc2hvcnRjdXRzIGZvciBtYW5pcHVsYXRpbmcgb2JqZWN0cyB2aWEKLSAqIHJlZmxlY3Rpb247IHBhcnRpY3VsYXJseSB3aGVuIGRlYWxpbmcgd2l0aCBmaWVsZHMgYW5kL29yIG1ldGhvZHMgdGhhdAotICogYXJlIG5vdCBwdWJsaWNseSBhY2Nlc3NpYmxlIG9yIGFyZSBpbmhlcml0ZWQuCi0gKiAKLSAqIEluIG1vc3QgY2FzZXMsIGFsbCB0aGUgZXhjZXB0aW9ucyBhcmUgaGFuZGxlZCBhbmQKLSAqIHdyYXBwZWQgaW4gamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb25zOyBzbyB0aGVzZSBtZXRob2RzIHNob3VsZAotICogYmUgdXNlZCB3aGVuIHlvdSBhcmUgY29uZmlkZW50IHRoYXQgeW91IHdpbGwgbm90IGhhdmluZyBhbnkgcHJvYmxlbXMKLSAqIHVzaW5nIHJlZmxlY3Rpb24uCi0gKiAKLSAqIFRoZXJlIGFyZSBhbHNvIGEgbnVtYmVyIG9mIG1ldGhvZHMgd2hvc2UgbmFtZXMKLSAqIGJlZ2luIHdpdGggImF0dGVtcHQiLiBUaGVzZSBtZXRob2RzIHdpbGwgdGhyb3cgYSBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAqIG9yIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHdoZW4gYXBwcm9wcmlhdGUsIGFsbG93aW5nIHlvdSB0byBwcm9iZQotICogZm9yIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgcHJlc2VudCBidXQgbWlnaHQgbm90LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NUb29scyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gWkVST19QQVJBTUVURVJfVFlQRVMgPSBuZXcgQ2xhc3NbMF07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBaRVJPX1BBUkFNRVRFUlMgPSBuZXcgT2JqZWN0WzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN0cmluZ1Rvb2xzLkNSOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUiA9ICckJzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBBUlJBWV9JTkRJQ0FUT1IgPSAnWyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFRZUEVfREVDTEFSQVRJT05fQVJSQVlfT1BFTiA9ICdbJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgVFlQRV9ERUNMQVJBVElPTl9BUlJBWV9DTE9TRSA9ICddJzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBSRUZFUkVOQ0VfQ0xBU1NfQ09ERSA9ICdMJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUkVGRVJFTkNFX0NMQVNTX05BTUVfREVMSU1JVEVSID0gJzsnOwotCQotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZVtdIFBSSU1JVElWRVM7ICAvLyBwc2V1ZG8tJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQllURV9DT0RFID0gJ0InOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDSEFSX0NPREUgPSAnQyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9DT0RFID0gJ0QnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBGTE9BVF9DT0RFID0gJ0YnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBJTlRfQ09ERSA9ICdJJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTE9OR19DT0RFID0gJ0onOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTSE9SVF9DT0RFID0gJ1MnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBCT09MRUFOX0NPREUgPSAnWic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFZPSURfQ09ERSA9ICdWJzsKLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCA9IC0xOyAgLy8gcHNldWRvLSdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSCA9IC0xOyAgLy8gcHNldWRvLSdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEX0NMQVNTX05BTUUgPSB2b2lkLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEX1dSQVBQRVJfQ0xBU1NfTkFNRSA9IGphdmEubGFuZy5Wb2lkLmNsYXNzLmdldE5hbWUoKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgZmllbGRzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY2xhc3MsIGluY2x1ZGluZyBpbmhlcml0ZWQgZmllbGRzLgotCSAqIENsYXNzI2FsbEZpZWxkcygpCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIEZpZWxkW10gYWxsRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlTdGFjazxGaWVsZD4gc3RhY2sgPSBuZXcgU3RhY2s8RmllbGQ+KCk7Ci0JCWZvciAoQ2xhc3M8Pz4gdGVtcENsYXNzID0gamF2YUNsYXNzOyB0ZW1wQ2xhc3MgIT0gbnVsbDsgdGVtcENsYXNzID0gdGVtcENsYXNzLmdldFN1cGVyY2xhc3MoKSkgewotCQkJcHVzaERlY2xhcmVkRmllbGRzKHRlbXBDbGFzcywgc3RhY2spOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2Uoc3RhY2spOwotCQlyZXR1cm4gc3RhY2sudG9BcnJheShuZXcgRmllbGRbc3RhY2suc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIG1ldGhvZHMgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBjbGFzcywgaW5jbHVkaW5nIGluaGVyaXRlZCBtZXRob2RzLgotCSAqIENsYXNzI2FsbE1ldGhvZHMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kW10gYWxsTWV0aG9kcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RhY2s8TWV0aG9kPiBzdGFjayA9IG5ldyBTdGFjazxNZXRob2Q+KCk7Ci0JCWZvciAoQ2xhc3M8Pz4gdGVtcENsYXNzID0gamF2YUNsYXNzOyB0ZW1wQ2xhc3MgIT0gbnVsbDsgdGVtcENsYXNzID0gdGVtcENsYXNzLmdldFN1cGVyY2xhc3MoKSkgewotCQkJcHVzaERlY2xhcmVkTWV0aG9kcyh0ZW1wQ2xhc3MsIHN0YWNrKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHN0YWNrKTsKLQkJcmV0dXJuIHN0YWNrLnRvQXJyYXkobmV3IE1ldGhvZFtzdGFjay5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZSgpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgYXR0ZW1wdE5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0TmV3SW5zdGFuY2UoamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIGF0dGVtcHROZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLm5ld0luc3RhbmNlKHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSArIENSICsgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgaWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBpYWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSArIENSICsgaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpLCBpdGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIGF0dGVtcHROZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdE5ld0luc3RhbmNlKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGdldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIE9iamVjdCNnZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0dldEZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmaWVsZChvYmplY3QsIGZpZWxkTmFtZSkuZ2V0KG9iamVjdCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgaWFlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGdldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNnZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0dldFN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGZpZWxkKGphdmFDbGFzcywgZmllbGROYW1lKS5nZXQobnVsbCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgaWFlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgemVyby1hcmd1bWVudCBtZXRob2QsCi0JICogZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QobWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIElmIHRoZSBleGVjdXRlZCBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgCi0JCXRocm93cyBUaHJvd2FibGUsIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiAKLQl7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihtZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgcmVjZWl2ZXIsIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogQXR0ZW1wdCB0byBleGVjdXRlIGEgemVyby1hcmd1bWVudCBzdGF0aWMgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSBjbGFzcyBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2Qoc3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIHNldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUKLQkgKiBjb250YWluaW5nIG9iamVjdCwgZmllbGQgbmFtZSwgYW5kIG5ldyBmaWVsZCB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQuCi0JICogT2JqZWN0I3NldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhdHRlbXB0VG9TZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJZmllbGQob2JqZWN0LCBmaWVsZE5hbWUpLnNldChvYmplY3QsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBzZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZQotCSAqIGNvbnRhaW5pbmcgY2xhc3MsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIENsYXNzI3NldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhdHRlbXB0VG9TZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlmaWVsZChqYXZhQ2xhc3MsIGZpZWxkTmFtZSkuc2V0KG51bGwsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IKLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcnMuCi0JICogQ2xhc3MjY29uc3RydWN0b3IoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2NvbnN0cnVjdG9yKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvciA9IGphdmFDbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKHBhcmFtZXRlclR5cGVzKTsKLQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2NvbnN0cnVjdG9yKENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gY29uc3RydWN0b3IoamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIGZpZWxkcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMuCi0JICogQ2xhc3MjYWNjZXNzaWJsZURlY2xhcmVkRmllbGRzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkW10gZGVjbGFyZWRGaWVsZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCUZpZWxkW10gZmllbGRzID0gamF2YUNsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCWZvciAoRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKLQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBtZXRob2RzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNhY2Nlc3NpYmxlRGVjbGFyZWRNZXRob2RzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFtdIGRlY2xhcmVkTWV0aG9kcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGphdmFDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotCQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IKLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcnMuCi0JICogQ2xhc3MjZGVmYXVsdENvbnN0cnVjdG9yKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBkZWZhdWx0Q29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGFuZCBmaWVsZCBuYW1lLgotCSAqIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGRlZmluZSB0aGUgZmllbGQsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBmaWVsZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCUZpZWxkIGZpZWxkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpZWxkID0gamF2YUNsYXNzLmdldERlY2xhcmVkRmllbGQoZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCUNsYXNzPD8+IHN1cGVyY2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewotCQkJCXRocm93IGV4OwotCQkJfQotCQkJLy8gcmVjdXJzZQotCQkJcmV0dXJuIGZpZWxkKHN1cGVyY2xhc3MsIGZpZWxkTmFtZSk7Ci0JCX0KLQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIGZpZWxkOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGRlZmluZSB0aGUgZmllbGQsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBmaWVsZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlyZXR1cm4gZmllbGQob2JqZWN0LmdldENsYXNzKCksIGZpZWxkTmFtZSk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG51bGwsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgnLicpOwotCQlzYi5hcHBlbmQoZmllbGROYW1lKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJcmV0dXJuIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdC5nZXRDbGFzcygpLCBmaWVsZE5hbWUpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCQkvLyB0aGlzIGNoZWNrIGFsbG93cyB1cyB0byB1c2UgdGhpcyBjb2RlIGZvciBjb25zdHJ1Y3RvcnMsIHdoZXJlIHRoZSBtZXRob2ROYW1lIGlzIG51bGwKLQkJaWYgKG1ldGhvZE5hbWUgIT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKCcuJyk7Ci0JCQlzYi5hcHBlbmQobWV0aG9kTmFtZSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCWludCBtYXggPSBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggLSAxOwotCQlpZiAobWF4ICE9IC0xKSB7Ci0JCQkvLyBzdG9wIG9uZSBzaG9ydCBvZiB0aGUgZW5kIG9mIHRoZSBhcnJheQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJCXNiLmFwcGVuZChwYXJhbWV0ZXJUeXBlc1tpXS5nZXROYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgiLCAiKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChwYXJhbWV0ZXJUeXBlc1ttYXhdLmdldE5hbWUoKSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUocmVjZWl2ZXIuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogT2JqZWN0I2dldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBmaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9HZXRGaWVsZFZhbHVlKG9iamVjdCwgZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gbnNmZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNmZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBuc2ZlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIGNsYXNzIGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogQ2xhc3MjZ2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvR2V0U3RhdGljRmllbGRWYWx1ZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zbWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIG5zbWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgb25lLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIAotCQl0aHJvd3MgVGhyb3dhYmxlCi0JewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24ocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIG9uZS1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogSWYgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgCi0JCXRocm93cyBUaHJvd2FibGUKLQl7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogSWYgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgCi0JCXRocm93cyBUaHJvd2FibGUKLQl7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24ocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zbWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIG5zbWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogQ29udmVydCBleGNlcHRpb25zIHRvIFJ1bnRpbWVFeGNlcHRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoTWV0aG9kIG1ldGhvZCwgT2JqZWN0IHJlY2VpdmVyLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWV0aG9kLmludm9rZShyZWNlaXZlciwgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIG1ldGhvZCwgaWFlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1ldGhvZCArIENSICsgaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpLCBpdGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogSWYgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIENvbnZlcnQgYWxsIG90aGVyIGV4Y2VwdGlvbnMgdG8gUnVudGltZUV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oTWV0aG9kIG1ldGhvZCwgT2JqZWN0IHJlY2VpdmVyLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCQl0aHJvd3MgVGhyb3dhYmxlCi0JewotCQl0cnkgewotCQkJcmV0dXJuIG1ldGhvZC5pbnZva2UocmVjZWl2ZXIsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBtZXRob2QsIGlhZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0JCQlUaHJvd2FibGUgY2F1c2UgPSBpdGUuZ2V0Q2F1c2UoKTsKLQkJCWlmIChjYXVzZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWV0aG9kLnRvU3RyaW5nKCksIGl0ZSk7Ci0JCQl9Ci0JCQl0aHJvdyBjYXVzZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgc3RhdGljIG1ldGhvZCwKLQkgKiBnaXZlbiB0aGUgY2xhc3MgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zbWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIHN0YXRpYyBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogQ29udmVydCBleGNlcHRpb25zIHRvIFJ1bnRpbWVFeGNlcHRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChtZXRob2QsIG51bGwsIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQl0cnkgewotCQkJbWV0aG9kID0gamF2YUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQlDbGFzczw/PiBzdXBlcmNsYXNzID0gamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJCS8vIHJlY3Vyc2UKLQkJCXJldHVybiBtZXRob2Qoc3VwZXJjbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9Ci0JCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlyZXR1cm4gbWV0aG9kOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdAotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2Qob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCwgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcyAod2l0aG91dCB0aGUgY2hlY2tlZCBleGNlcHRpb24pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGNsYXNzTmFtZSwgZXgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIENsYXNzI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGNsYXNzTG9hZGVyKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHROZXdJbnN0YW5jZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zbWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyksIG5zbWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc05hbWUsIHBhcmFtZXRlclR5cGVzLCBwYXJhbWV0ZXJzLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgY2xhc3NMb2FkZXIpLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc05hbWUsIHBhcmFtZXRlclR5cGUsIHBhcmFtZXRlciwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgcGFyYW1ldGVyLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlciwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpLCBwYXJhbWV0ZXJUeXBlLCBwYXJhbWV0ZXIpOwotCX0KLQkKLQkvKgotCSAqIFB1c2ggdGhlIGRlY2xhcmVkIGZpZWxkcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIG9udG8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXNoRGVjbGFyZWRGaWVsZHMoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdGFjazxGaWVsZD4gc3RhY2spIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBkZWNsYXJlZEZpZWxkcyhqYXZhQ2xhc3MpOwotCQlmb3IgKGludCBpID0gZmllbGRzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlzdGFjay5wdXNoKGZpZWxkc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBQdXNoIHRoZSBkZWNsYXJlZCBtZXRob2RzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogb250byB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHB1c2hEZWNsYXJlZE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdGFjazxNZXRob2Q+IHN0YWNrKSB7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBkZWNsYXJlZE1ldGhvZHMoamF2YUNsYXNzKTsKLQkJZm9yIChpbnQgaSA9IG1ldGhvZHMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCXN0YWNrLnB1c2gobWV0aG9kc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCwgZmllbGQgbmFtZSwgYW5kIG5ldyBmaWVsZCB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIE9iamVjdCNzZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlhdHRlbXB0VG9TZXRGaWVsZFZhbHVlKG9iamVjdCwgZmllbGROYW1lLCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gbnNmZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNmZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBuc2ZlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIGNsYXNzLCBmaWVsZCBuYW1lLCBhbmQgbmV3IGZpZWxkIHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogQ2xhc3Mjc2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlhdHRlbXB0VG9TZXRTdGF0aWNGaWVsZFZhbHVlKGphdmFDbGFzcywgZmllbGROYW1lLCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gbnNmZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNmZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBuc2ZlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIG9iamVjdCdzIGNsYXNzLgotCSAqIENsYXNzI2dldFNob3J0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnRDbGFzc05hbWVGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc2hvcnROYW1lRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiT2JqZWN0IikuCi0JICogQ2xhc3MjZ2V0U2hvcnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydE5hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiT2JqZWN0IikuCi0JICogQ2xhc3MjZ2V0U2hvcnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydE5hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBzaG9ydE5hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lc3RlZCBuYW1lIG9mIHRoZSBvYmplY3QncyBjbGFzcy4KLQkgKiBDbGFzcyNnZXROZXN0ZWROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXN0ZWRDbGFzc05hbWVGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbmVzdGVkTmFtZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmVzdGVkIG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJFbnRyeSIpLgotCSAqIENsYXNzI2dldE5lc3RlZE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5lc3RlZE5hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUikgKyAxKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXN0ZWQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIkVudHJ5IikuCi0JICogQ2xhc3MjZ2V0TmVzdGVkTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmVzdGVkTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIG5lc3RlZE5hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJ0b1N0cmluZygpIiBuYW1lIG9mIHRoZSBvYmplY3QncyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ0NsYXNzTmFtZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0b1N0cmluZ05hbWVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJ0b1N0cmluZygpIiBuYW1lIG9mIHRoZSBjbGFzcy4KLQkgKiAiTWVtYmVyIiBjbGFzc2VzIHdpbGwgcmV0dXJuIG9ubHkgdGhlIGZpbmFsIG5hbWU6Ci0JICogICAgICJjb20uZm9vLmJhci5Ub3BMZXZlbENsYXNzJE1lbWJlckNsYXNzJE5lc3RlZE1lbWJlckNsYXNzIgotCSAqICAgICAgICAgPT4gIk5lc3RlZE1lbWJlckNsYXNzIgotCSAqICJMb2NhbCIgYW5kICJhbm9ueW1vdXMiIGNsYXNzZXMgd2lsbCBzdGlsbCByZXR1cm4gdGhlIGVtYmVkZGVkICckJ3M6Ci0JICogICAgICJjb20uZm9vLmJhci5Ub3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIgotCSAqICAgICAgICAgPT4gIlRvcExldmVsQ2xhc3MkMUxvY2FsQ2xhc3MiCi0JICogICAgICJjb20uZm9vLmJhci5Ub3BMZXZlbENsYXNzJDEiCi0JICogICAgICAgICA9PiAiVG9wTGV2ZWxDbGFzcyQxIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lZElzTWVtYmVyKGNsYXNzTmFtZSkgPwotCQkJY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKSArIDEpCi0JCToKLQkJCWNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAidG9TdHJpbmcoKSIgbmFtZSBvZiB0aGUgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdOYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gdG9TdHJpbmdOYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJqYXZhLmxhbmciKS4KLQkgKiBDbGFzcyNnZXRQYWNrYWdlTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2FnZU5hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBwYWNrYWdlTmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiamF2YS5sYW5nIikuCi0JICogQ2xhc3MjZ2V0UGFja2FnZU5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2thZ2VOYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBsYXN0UGVyaW9kID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChsYXN0UGVyaW9kID09IC0xKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgbGFzdFBlcmlvZCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgY2xhc3MsCi0JICogZm9sbG93ZWQgYnkgaXRzIHBhY2thZ2UgbmFtZSAoZS5nLiAiT2JqZWN0IChqYXZhLmxhbmcpIikuCi0JICogQ2xhc3MjZ2V0U2hvcnROYW1lV2l0aFBhY2thZ2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0TmFtZVdpdGhQYWNrYWdlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKHNob3J0TmFtZUZvcihqYXZhQ2xhc3MpKTsKLQkJaWYgKCAhIGphdmFDbGFzcy5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlzYi5hcHBlbmQoIiAoIik7Ci0JCQlzYi5hcHBlbmQocGFja2FnZU5hbWVGb3IoamF2YUNsYXNzKSk7Ci0JCQlzYi5hcHBlbmQoJyknKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQsIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBzdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2Qgc3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMobWV0aG9kLmdldE1vZGlmaWVycygpKSkgewotCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBzdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gc3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGVzfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBjYW4gYmUgImRlY2xhcmVkIiBpbiBjb2RlOwotCSAqIGkuZS4gaXQgaXMgZWl0aGVyIGEgInRvcC1sZXZlbCIgY2xhc3Mgb3IgYSAibWVtYmVyIiBjbGFzcywgYnV0IGl0Ci0JICogaXMgbm90IGFuICJhcnJheSIgY2xhc3MuIFRoaXMgbWV0aG9kIHJvbGxzIHRvZ2V0aGVyIGFsbCB0aGUgY2hlY2tzCi0JICogZnJvbSB0aGUgb3RoZXIgbWV0aG9kcyBmb3IgYSBiaXQgb2YgYSBwZXJmb3JtYW5jZSB0d2Vhay4KLQkgKiBDbGFzcyNpc0RlY2xhcmFibGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNEZWNsYXJhYmxlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZS5jaGFyQXQoMCkgPT0gQVJSQVlfSU5ESUNBVE9SKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CQkvLyBpdCBpcyBhbiAiYXJyYXkiIGNsYXNzCi0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJCS8vIGl0IGlzIGEgInRvcC1sZXZlbCIgY2xhc3MKLQkJfQotCQlkbyB7Ci0JCQkvLyB0aGUgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggZG9sbGFyIHNpZ24gY2Fubm90IGJlIGEgZGlnaXQKLQkJCWluZGV4Kys7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpbmRleCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IsIGluZGV4KTsKLQkJfSB3aGlsZSAoaW5kZXggIT0gLTEpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAibWVtYmVyIiwgImxvY2FsIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBkb2VzIE5PVCBjb250YWluIGEgJyQnOiAiVG9wTGV2ZWxDbGFzcyIpLgotCSAqIENsYXNzI2lzVG9wTGV2ZWwoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNUb3BMZXZlbChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUikgPT0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJtZW1iZXIiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAidG9wLWxldmVsIiwgImxvY2FsIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBjb250YWlucyBhdCBsZWFzdCBvbmUgJyQnIGFuZCBhbGwgdGhlIG5hbWVzIGJldHdlZW4KLQkgKiBlYWNoICckJyBhcmUgbGVnYWwgY2xhc3MgbmFtZXM6Ci0JICogIlRvcExldmVsQ2xhc3MkTWVtYmVyQ2xhc3MkTmVzdGVkTWVtYmVyQ2xhc3MiKS4KLQkgKiBDbGFzcyNpc01lbWJlcigpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc01lbWJlcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CS8vIGl0IGlzIGEgInRvcC1sZXZlbCIgY2xhc3MKLQkJfQotCQlkbyB7Ci0JCQkvLyB0aGUgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggZG9sbGFyIHNpZ24gY2Fubm90IGJlIGEgZGlnaXQKLQkJCWluZGV4Kys7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpbmRleCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IsIGluZGV4KTsKLQkJfSB3aGlsZSAoaW5kZXggIT0gLTEpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgImxvY2FsIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJtZW1iZXIiLCBvciAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgamRrIChvciBFY2xpcHNlKSBuYW1pbmcgY29udmVudGlvbnMuCi0JICogSW4gdGhlIGpkaywgdGhlIGNsYXNzIG5hbWUgZW5kcyB3aXRoICckbm5uWFhYJyB3aGVyZSB0aGUgJyQnIGlzCi0JICogZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgbnVtZXJpYyBkaWdpdHMgd2hpY2ggYXJlIGZvbGxvd2VkIGJ5IHRoZQotCSAqIGxvY2FsIGNsYXNzIG5hbWU6ICJUb3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIi4KLQkgKiBJbiBFY2xpcHNlLCB0aGUgY2xhc3MgbmFtZSBlbmRzIHdpdGggJyRubm4kWFhYJyB3aGVyZSB0aGUgJyQnIGlzCi0JICogZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgbnVtZXJpYyBkaWdpdHMgd2hpY2ggYXJlIHNlcGFyYXRlZCBmcm9tCi0JICogdGhlIGxvY2FsIGNsYXNzIG5hbWUgYnkgYW5vdGhlciAnJCc6ICJUb3BMZXZlbENsYXNzJDEkTG9jYWxDbGFzcyIuCi0JICogQ2xhc3MjaXNMb2NhbCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0xvY2FsKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgZG9sbGFyID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGRvbGxhciA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICggISBDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc05hbWUuY2hhckF0KGRvbGxhciArIDEpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBsZW4gPSBjbGFzc05hbWUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSBkb2xsYXIgKyAyOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNsYXNzTmFtZS5jaGFyQXQoaSkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlICQgYXJlIGRpZ2l0cyAoYW5vbnltb3VzKQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhbiAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJtZW1iZXIiLCBvciAibG9jYWwiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgbmFtaW5nIGNvbnZlbnRpb25zIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgZW5kcyB3aXRoICckbm5uJyB3aGVyZSBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUKLQkgKiBsYXN0ICckJyBhcmUgbnVtZXJpYyBkaWdpdHM6ICJUb3BMZXZlbENsYXNzJDEiKS4KLQkgKiBDbGFzcyNpc0Fub255bW91cygpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0Fub255bW91cyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGRvbGxhciA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChkb2xsYXIgPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgc3RhcnQgPSBkb2xsYXIgKyAxOwotCQlmb3IgKGludCBpID0gY2xhc3NOYW1lLmxlbmd0aCgpOyBpLS0gPiBzdGFydDsgKSB7Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlICQgYXJlIGRpZ2l0cwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiBDbGFzcyNnZXRBcnJheURlcHRoKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpbnQgZGVwdGggPSAwOwotCQl3aGlsZSAoamF2YUNsYXNzLmlzQXJyYXkoKSkgewotCQkJZGVwdGgrKzsKLQkJCWphdmFDbGFzcyA9IGphdmFDbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogVGhlIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkuCi0JICogTm9uLWFycmF5cyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGFycmF5RGVwdGhGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKiBDbGFzcyNnZXRBcnJheURlcHRoKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCXdoaWxlIChjbGFzc05hbWUuY2hhckF0KGRlcHRoKSA9PSBBUlJBWV9JTkRJQ0FUT1IpIHsKLQkJCWRlcHRoKys7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYW4gYXJyYXkgdHlwZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzQXJyYXkoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLmNoYXJBdCgwKSA9PSBBUlJBWV9JTkRJQ0FUT1I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogQSBub24tYXJyYXkgdHlwZSBzaW1wbHkgcmV0dXJucyBpdHNlbGYuCi0JICogQ2xhc3MjZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZWxlbWVudFR5cGVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXdoaWxlIChqYXZhQ2xhc3MuaXNBcnJheSgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBqYXZhQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheS4KLQkgKiBBIG5vbi1hcnJheSBzaW1wbHkgcmV0dXJucyBpdHMgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBlbGVtZW50VHlwZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBlbGVtZW50VHlwZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIHNpbXBseSByZXR1cm4gdGhlbXNlbHZlcy4KLQkgKiBDbGFzcyNnZXRFbGVtZW50VHlwZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFR5cGVOYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gZWxlbWVudFR5cGVGb3IoamF2YUNsYXNzKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIHNpbXBseSByZXR1cm4gdGhlbXNlbHZlcy4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKiBDbGFzcyNnZXRFbGVtZW50VHlwZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBkZXB0aCA9IGFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGNsYXNzTmFtZSk7Ci0JCWlmIChkZXB0aCA9PSAwKSB7Ci0JCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogImphdmEubGFuZy5PYmplY3QiIG9yICJpbnQiCi0JCQlyZXR1cm4gY2xhc3NOYW1lOwotCQl9Ci0JCWludCBsYXN0ID0gY2xhc3NOYW1lLmxlbmd0aCgpIC0gMTsKLQkJaWYgKGNsYXNzTmFtZS5jaGFyQXQoZGVwdGgpID09IFJFRkVSRU5DRV9DTEFTU19DT0RFKSB7Ci0JCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogIltbW0xqYXZhLmxhbmcuT2JqZWN0OyIKLQkJCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGRlcHRoICsgMSwgbGFzdCk7CS8vIGRyb3AgdGhlIHRyYWlsaW5nICc7JwotCQl9Ci0JCS8vIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtOiAiW1tbSSIKLQkJcmV0dXJuIGNsYXNzTmFtZUZvckNvZGUoY2xhc3NOYW1lLmNoYXJBdChsYXN0KSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAicmVmZXJlbmNlIgotCSAqIGNsYXNzIChpLmUuIG5laXRoZXIgJ3ZvaWQnIG5vciBvbmUgb2YgdGhlIHByaW1pdGl2ZSB2YXJpYWJsZSBjbGFzc2VzLAotCSAqIFsnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuXSkuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1JlZmVyZW5jZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiAhIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZShjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiAndm9pZCcgb3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgY2xhc3NlcywKLQkgKiBbJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNQcmltaXRpdmUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSB8fCAoY2xhc3NOYW1lLmxlbmd0aCgpID4gbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuICdib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy4sIGJ1dCBub3QgJ3ZvaWQnKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lZElzUHJpbWl0aXZlKGNsYXNzTmFtZSkKLQkJCSYmICggISBjbGFzc05hbWUuZXF1YWxzKFZPSURfQ0xBU1NfTkFNRSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuICdqYXZhLmxhbmcuVm9pZCcgb3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgd3JhcHBlciBjbGFzc2VzLAotCSAqIFsnamF2YS5sYW5nLkJvb2xlYW4nLCAnamF2YS5sYW5nLkludGVnZXInLCAnamF2YS5sYW5nLkZsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSB8fCAoY2xhc3NOYW1lLmxlbmd0aCgpID4gbWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJfQotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoY29kZXNbaV0ud3JhcHBlckNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiAnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuLCBidXQgbm90ICd2b2lkJykuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhjbGFzc05hbWUpCi0JCQkmJiAoICEgY2xhc3NOYW1lLmVxdWFscyhWT0lEX1dSQVBQRVJfQ0xBU1NfTkFNRSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuICdqYXZhLmxhbmcuVm9pZCcgb3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgd3JhcHBlciBjbGFzc2VzLAotCSAqIFsnamF2YS5sYW5nLkJvb2xlYW4nLCAnamF2YS5sYW5nLkludGVnZXInLCAnamF2YS5sYW5nLkZsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc0lzUHJpbWl0aXZlV3JhcHBlckNsYXNzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpZiAoamF2YUNsYXNzLmlzQXJyYXkoKSB8fCAoamF2YUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKSA+IG1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGNvZGVzW2ldLndyYXBwZXJDbGFzcyA9PSBqYXZhQ2xhc3MpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLiwgYnV0IG5vdCAndm9pZCcpLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjbGFzc0lzUHJpbWl0aXZlV3JhcHBlckNsYXNzKGphdmFDbGFzcykKLQkJCSYmIChqYXZhQ2xhc3MgIT0gamF2YS5sYW5nLlZvaWQuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvckNvZGUoY2hhciBjbGFzc0NvZGUpIHsKLQkJcmV0dXJuIGNsYXNzRm9yQ29kZShjbGFzc0NvZGUpLmdldE5hbWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lRm9yQ29kZShpbnQgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBjbGFzc05hbWVGb3JDb2RlKChjaGFyKSBjbGFzc0NvZGUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvckNvZGUoY2hhciBjbGFzc0NvZGUpIHsKLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGNvZGVzW2ldLmNvZGUgPT0gY2xhc3NDb2RlKSB7Ci0JCQkJcmV0dXJuIGNvZGVzW2ldLmphdmFDbGFzczsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKGNsYXNzQ29kZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yQ29kZShpbnQgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBjbGFzc0ZvckNvZGUoKGNoYXIpIGNsYXNzQ29kZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXIgY29kZUZvckNsYXNzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpZiAoKCAhIGphdmFDbGFzcy5pc0FycmF5KCkpICYmIChqYXZhQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpIDw9IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzID09IGphdmFDbGFzcykgewotCQkJCQlyZXR1cm4gY29kZXNbaV0uY29kZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsJCQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGNvZGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIGNvZGVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKCggISBjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSAmJiAoY2xhc3NOYW1lLmxlbmd0aCgpIDw9IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCQlyZXR1cm4gY29kZXNbaV0uY29kZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjbGFzc05hbWUpOwkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24sIENsYXNzVG9vbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLAotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJVHlwZURlY2xhcmF0aW9uIHRkID0gdHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXJldHVybiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbih0ZC5lbGVtZW50VHlwZU5hbWUsIHRkLmFycmF5RGVwdGgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQl0eXBlRGVjbGFyYXRpb24gPSBTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHR5cGVEZWNsYXJhdGlvbik7Ci0JCWludCBhcnJheURlcHRoID0gYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbl8odHlwZURlY2xhcmF0aW9uKTsKLQkJU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSA9IHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcoMCwgdHlwZURlY2xhcmF0aW9uLmxlbmd0aCgpIC0gKGFycmF5RGVwdGggKiAyKSk7Ci0JCXJldHVybiBuZXcgVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIsCi0JICogdXNpbmcgdGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIuCi0JICovCi0JLy8gc2VlIHRoZSAiRXZhbHVhdGlvbiIgb2YgamRrIGJ1ZyA2NDQ2NjI3IGZvciBhIGRpc2N1c3Npb24gb2YgbG9hZGluZyBjbGFzc2VzCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJLy8gcHJpbWl0aXZlcyBjYW5ub3QgYmUgbG9hZGVkIHZpYSBDbGFzcyNmb3JOYW1lKCksCi0JCS8vIHNvIGNoZWNrIGZvciBhIHByaW1pdGl2ZSBjbGFzcyBuYW1lIGZpcnN0Ci0JCVByaW1pdGl2ZSBwY2MgPSBudWxsOwotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmxlbmd0aCgpIDw9IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSB7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lKSkgewotCQkJCQlwY2MgPSBjb2Rlc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gbm9uLWFycmF5Ci0JCWlmIChhcnJheURlcHRoID09IDApIHsKLQkJCXJldHVybiAocGNjID09IG51bGwpID8gQ2xhc3MuZm9yTmFtZShlbGVtZW50VHlwZU5hbWUsIGZhbHNlLCBjbGFzc0xvYWRlcikgOiBwY2MuamF2YUNsYXNzOwotCQl9Ci0KLQkJLy8gYXJyYXkKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7Ci0JCWZvciAoaW50IGkgPSBhcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZChBUlJBWV9JTkRJQ0FUT1IpOwotCQl9Ci0JCWlmIChwY2MgPT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19DT0RFKTsKLQkJCXNiLmFwcGVuZChlbGVtZW50VHlwZU5hbWUpOwotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0JCXJldHVybiBDbGFzcy5mb3JOYW1lKHNiLnRvU3RyaW5nKCksIGZhbHNlLCBjbGFzc0xvYWRlcik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiI7IGUuZy4KLQkgKiAgICAgImludFtdIiAtPiAiW0kiCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJVHlwZURlY2xhcmF0aW9uIHRkID0gdHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXJldHVybiBjbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24odGQuZWxlbWVudFR5cGVOYW1lLCB0ZC5hcnJheURlcHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGRlcHRoIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIjsgZS5nLgotCSAqICAgICAiaW50W10iIC0+IDEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2UodHlwZURlY2xhcmF0aW9uKSk7Ci0JfQotCi0JLyoKLQkgKiBBc3N1bWUgbm8gd2hpdGVzcGFjZSBpbiB0aGUgdHlwZSBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlpbnQgbGFzdCA9IHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSAtIDE7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCWludCBjbG9zZSA9IGxhc3Q7Ci0JCXdoaWxlICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KGNsb3NlKSA9PSBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX0NMT1NFKSB7Ci0JCQlpZiAodHlwZURlY2xhcmF0aW9uLmNoYXJBdChjbG9zZSAtIDEpID09IFRZUEVfREVDTEFSQVRJT05fQVJSQVlfT1BFTikgewotCQkJCWRlcHRoKys7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgdHlwZSBkZWNsYXJhdGlvbjogIiArIHR5cGVEZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCQljbG9zZSA9IGxhc3QgLSAoZGVwdGggKiAyKTsKLQkJfQotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCS8vIG5vbi1hcnJheQotCQlpZiAoYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZWxlbWVudFR5cGVOYW1lOwotCQl9Ci0KLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5lcXVhbHMoVk9JRF9DTEFTU19OQU1FKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJyIgKyBWT0lEX0NMQVNTX05BTUUgKyAiJyBtdXN0IGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybzogIiArIGFycmF5RGVwdGggKyAnLicpOwotCQl9Ci0JCS8vIGFycmF5Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOwotCQlmb3IgKGludCBpID0gYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlzYi5hcHBlbmQoQVJSQVlfSU5ESUNBVE9SKTsKLQkJfQotCi0JCS8vIGxvb2sgZm9yIGEgcHJpbWl0aXZlIGZpcnN0Ci0JCVByaW1pdGl2ZSBwY2MgPSBudWxsOwotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmxlbmd0aCgpIDw9IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSB7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lKSkgewotCQkJCQlwY2MgPSBjb2Rlc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHBjYyA9PSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoUkVGRVJFTkNFX0NMQVNTX0NPREUpOwotCQkJc2IuYXBwZW5kKGVsZW1lbnRUeXBlTmFtZSk7Ci0JCQlzYi5hcHBlbmQoUkVGRVJFTkNFX0NMQVNTX05BTUVfREVMSU1JVEVSKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChwY2MuY29kZSk7Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpZiAoTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCA9PSAtMSkgewotCQkJTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCA9IGNhbGN1bGF0ZU1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpOwotCQl9Ci0JCXJldHVybiBNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBjYWxjdWxhdGVNYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSB7Ci0JCWludCBtYXggPSAtMTsKLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaW50IGxlbiA9IGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQlpZiAobGVuID4gbWF4KSB7Ci0JCQkJbWF4ID0gbGVuOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSB7Ci0JCWlmIChNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEggPT0gLTEpIHsKLQkJCU1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSCA9IGNhbGN1bGF0ZU1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gTUFYX1BSSU1JVElWRV9XUkFQUEVSX0NMQVNTX05BTUVfTEVOR1RIOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBjYWxjdWxhdGVNYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpbnQgbWF4ID0gLTE7Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWludCBsZW4gPSBjb2Rlc1tpXS53cmFwcGVyQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA+IG1heCkgewotCQkJCW1heCA9IGxlbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZVtdIHByaW1pdGl2ZXMoKSB7Ci0JCWlmIChQUklNSVRJVkVTID09IG51bGwpIHsKLQkJCVBSSU1JVElWRVMgPSBidWlsZFByaW1pdGl2ZXMoKTsKLQkJfQotCQlyZXR1cm4gUFJJTUlUSVZFUzsKLQl9Ci0JCi0JLyoqCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUHJpbWl0aXZlW10gYnVpbGRQcmltaXRpdmVzKCkgewotCQlQcmltaXRpdmVbXSByZXN1bHQgPSBuZXcgUHJpbWl0aXZlWzldOwotCQlyZXN1bHRbMF0gPSBuZXcgUHJpbWl0aXZlKEJZVEVfQ09ERSwgamF2YS5sYW5nLkJ5dGUuY2xhc3MpOwotCQlyZXN1bHRbMV0gPSBuZXcgUHJpbWl0aXZlKENIQVJfQ09ERSwgamF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzcyk7Ci0JCXJlc3VsdFsyXSA9IG5ldyBQcmltaXRpdmUoRE9VQkxFX0NPREUsIGphdmEubGFuZy5Eb3VibGUuY2xhc3MpOwotCQlyZXN1bHRbM10gPSBuZXcgUHJpbWl0aXZlKEZMT0FUX0NPREUsIGphdmEubGFuZy5GbG9hdC5jbGFzcyk7Ci0JCXJlc3VsdFs0XSA9IG5ldyBQcmltaXRpdmUoSU5UX0NPREUsIGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzKTsKLQkJcmVzdWx0WzVdID0gbmV3IFByaW1pdGl2ZShMT05HX0NPREUsIGphdmEubGFuZy5Mb25nLmNsYXNzKTsKLQkJcmVzdWx0WzZdID0gbmV3IFByaW1pdGl2ZShTSE9SVF9DT0RFLCBqYXZhLmxhbmcuU2hvcnQuY2xhc3MpOwotCQlyZXN1bHRbN10gPSBuZXcgUHJpbWl0aXZlKEJPT0xFQU5fQ09ERSwgamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MpOwotCQlyZXN1bHRbOF0gPSBuZXcgUHJpbWl0aXZlKFZPSURfQ09ERSwgamF2YS5sYW5nLlZvaWQuY2xhc3MpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBDbGFzc1Rvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJpbWl0aXZlIHsKLQkJZmluYWwgY2hhciBjb2RlOwotCQlmaW5hbCBDbGFzczw/PiBqYXZhQ2xhc3M7Ci0JCWZpbmFsIENsYXNzPD8+IHdyYXBwZXJDbGFzczsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdSQVBQRVJfQ0xBU1NfVFlQRV9GSUVMRF9OQU1FID0gIlRZUEUiOwotCQkvLyBlLmcuIGphdmEubGFuZy5Cb29sZWFuLlRZUEUgPT4gYm9vbGVhbi5jbGFzcwotCQlQcmltaXRpdmUoY2hhciBjb2RlLCBDbGFzczw/PiB3cmFwcGVyQ2xhc3MpIHsKLQkJCXRoaXMuY29kZSA9IGNvZGU7Ci0JCQl0aGlzLndyYXBwZXJDbGFzcyA9IHdyYXBwZXJDbGFzczsKLQkJCXRoaXMuamF2YUNsYXNzID0gKENsYXNzPD8+KSBzdGF0aWNGaWVsZFZhbHVlKHdyYXBwZXJDbGFzcywgV1JBUFBFUl9DTEFTU19UWVBFX0ZJRUxEX05BTUUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZURlY2xhcmF0aW9uIHsKLQkJZmluYWwgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZTsKLQkJZmluYWwgaW50IGFycmF5RGVwdGg7Ci0JCVR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQkJdGhpcy5lbGVtZW50VHlwZU5hbWUgPSBlbGVtZW50VHlwZU5hbWU7Ci0JCQl0aGlzLmFycmF5RGVwdGggPSBhcnJheURlcHRoOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpdFRvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQml0VG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjJlOWI4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQml0VG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQml0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBCaXRUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEJpdFRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZsYWdJc1NldEludEludCgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDAxMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDExMDMpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDAwMCwgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZsYWdJc09mZkludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmZsYWdJc09mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5mbGFnSXNPZmYoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNPZmYoMHgyMjA0LCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNPZmYoMHgwMDAwLCAweDExMDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25seUZsYWdJc1NldEludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMDAxLCAweDAwMDEpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAwMDEsIDB4MDAwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDEwMSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAzMDMsIDB4MDEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMTAzLCAweDAxMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDMwMywgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdJc1NldCgweDExMDMsIDB4MTEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMDAwLCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnSXNPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRkZGRSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MDEwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRkVGRSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MDEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRkVGQywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRUVGQywgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZsYWdzQXJlU2V0SW50SW50KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIDB4MDEwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCAweDExMDMpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMDAwLCAweDExMDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmxhZ3NBcmVPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDIyMDQsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDAwMCwgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnc0FyZVNldEludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MTEwMywgMHgxMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMCwgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnc0FyZU9mZkludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRkZFLCAweDAwMDEpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHhGRkZGRkVGRSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkMsIDB4MDEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZFRUZDLCAweDExMDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW55RmxhZ3NBcmVTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweEZGRkYsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMywgMHhGRkZGKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMzAzLCAweDEwMTApKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMDAwLCAweEZGRkYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW55RmxhZ3NBcmVPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHgzMzNFLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweEZGRkUsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4MDAwMywgMHhGRkZGKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHg3MzczLCAweDEwMTApKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHhGRkZGLCAweEZGRkYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmxhZ3NBcmVTZXRJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMTAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDEwMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAwMDAsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZsYWdzQXJlT2ZmSW50SW50QXJyYXkoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgxMDAwLCAweDA0MDAsIDB4MDAyMCwgMHgwMDAwIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAwMDAsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnc0FyZVNldEludEludEFycmF5KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMDAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMDAxLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDEsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDExLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgxMTAzLCBuZXcgaW50W10geyAweDExMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDAsIG5ldyBpbnRbXSB7IDB4MDExLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMTAzLCBuZXcgaW50W10geyAweDAxMDEsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ3NBcmVPZmZJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZGRkUsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkUsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDExMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZFRUZDLCBuZXcgaW50W10geyAweDExMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbnlGbGFnc0FyZVNldEludEludEFycmF5KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweEZGRkYsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweEYwMDAsIDB4MEYwMCwgMHgwMEYwLCAweDAwMEYgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgxMDAwLCAweDAwMTAgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAwMDAsIG5ldyBpbnRbXSB7IDB4RjAwMCwgMHgwRjAwLCAweDAwRjAsIDB4MDAwRiB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFueUZsYWdzQXJlT2ZmSW50SW50QXJyYXkoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHhGRkZGLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMjAwLCAweDAwMDMsIDB4MDAwMiB9KSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMDEwIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAwMDAsIG5ldyBpbnRbXSB7IDB4RjAwMCwgMHgwRjAwLCAweDAwRjAsIDB4MDAwRiB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yRmxhZ3MoKSB7Ci0JCWFzc2VydEVxdWFscygweDAwMDEsIEJpdFRvb2xzLm9yRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMDAgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHgwMDExLCBCaXRUb29scy5vckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4RjAxMSwgQml0VG9vbHMub3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSwgMHhGMDAwIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5kRmxhZ3MoKSB7Ci0JCWFzc2VydEVxdWFscygweDAwMDEsIEJpdFRvb2xzLmFuZEZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAwMSwgQml0VG9vbHMuYW5kRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHgwMDAwLCBCaXRUb29scy5hbmRGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSwgMHhGMDAwIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAwMSwgQml0VG9vbHMuYW5kRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEsIDB4RjAwMSB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFhvckZsYWdzKCkgewotCQlhc3NlcnRFcXVhbHMoMHgwMDAxLCBCaXRUb29scy54b3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAwMCB9KSk7Ci0JCWFzc2VydEVxdWFscygweDAwMTAsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4RjAxMCwgQml0VG9vbHMueG9yRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEsIDB4RjAwMCB9KSk7Ci0JCWFzc2VydEVxdWFscygweEZGMTEsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExLCAweEYwMDAsIDB4MEYwMSB9KSk7Ci0JCWFzc2VydEVxdWFscygweEYwMTAsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExLCAweEYwMDAsIDB4MEYwMSwgMHgwRjAxIH0pKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ2xhc3NUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NsYXNzVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmU0ZWFlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ2xhc3NUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlc3RTdGF0aWNGaWVsZDsKLQotCXB1YmxpYyBDbGFzc1Rvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb21waWxlci1nZW5lcmF0ZWQgY2xhc3MgbmFtZS4gVGhlIEVjbGlwc2UgY29tcGlsZXIgZ2VuZXJhdGVzCi0JICogImxvY2FsIiBjbGFzc2VzIHdpdGggbmFtZXMgaW4gdGhlIGZvcm0gImNvbS5mb28uT3V0ZXIkMSRMb2NhbCI7IHdoaWxlIHRoZQotCSAqIEpESyBjb21waWxlciBnZW5lcmF0ZXMgImNvbS5mb28uT3V0ZXIkMUxvY2FsIi4gVGhlcmUgbWlnaHQgYmUgb3RoZXIKLQkgKiBkaWZmZXJlbmNlcy4uLi4gfmJqdgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBpbGVyRGVwZW5kZW50Q2xhc3NOYW1lRm9yKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoIiQxJCIpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBjbGFzc05hbWU7Ci0JCX0KLQkJdHJ5IHsKLQkJCUNsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXggKyAyKSArIGNsYXNzTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAzKTsKLQkJfQotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtdW5nZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjb21waWxlckRlcGVuZGVudENsYXNzTmFtZUZvcihjbGFzc05hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxGaWVsZHMoKSB7Ci0JCWludCBmaWVsZENvdW50ID0gMDsKLQkJZmllbGRDb3VudCArPSBqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoOwotCQlmaWVsZENvdW50ICs9IGphdmEudXRpbC5BYnN0cmFjdExpc3QuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGg7Ci0JCWZpZWxkQ291bnQgKz0gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpLmxlbmd0aDsKLQkJZmllbGRDb3VudCArPSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoOwotCQlGaWVsZFtdIGZpZWxkcyA9IENsYXNzVG9vbHMuYWxsRmllbGRzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoZmllbGRDb3VudCwgZmllbGRzLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubmFtZXMoZmllbGRzKSwgIm1vZENvdW50IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm5hbWVzKGZpZWxkcyksICJzZXJpYWxWZXJzaW9uVUlEIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm5hbWVzKGZpZWxkcyksICJjYXBhY2l0eUluY3JlbWVudCIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5uYW1lcyhmaWVsZHMpLCAiZWxlbWVudENvdW50IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm5hbWVzKGZpZWxkcyksICJlbGVtZW50RGF0YSIpKTsKLQkJYXNzZXJ0VHJ1ZShmaWVsZHNbMF0uaXNBY2Nlc3NpYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxNZXRob2RzKCkgewotCQlpbnQgbWV0aG9kQ291bnQgPSAwOwotCQltZXRob2RDb3VudCArPSBqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpLmxlbmd0aDsKLQkJbWV0aG9kQ291bnQgKz0gamF2YS51dGlsLkFic3RyYWN0TGlzdC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKS5sZW5ndGg7Ci0JCW1ldGhvZENvdW50ICs9IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkubGVuZ3RoOwotCQltZXRob2RDb3VudCArPSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpLmxlbmd0aDsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IENsYXNzVG9vbHMuYWxsTWV0aG9kcyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZENvdW50LCBtZXRob2RzLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubmFtZXMobWV0aG9kcyksICJ3YWl0IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm5hbWVzKG1ldGhvZHMpLCAiYWRkRWxlbWVudCIpKTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2RzWzBdLmlzQWNjZXNzaWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3SW5zdGFuY2VDbGFzcygpIHsKLQkJVmVjdG9yPD8+IHYgPSBDbGFzc1Rvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdJbnN0YW5jZUNsYXNzQ2xhc3NPYmplY3QoKSB7Ci0JCWludCBpbml0aWFsQ2FwYWNpdHkgPSAyMDA7Ci0JCVZlY3Rvcjw/PiB2ID0gQ2xhc3NUb29scy5uZXdJbnN0YW5jZShqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBpbnQuY2xhc3MsIG5ldyBJbnRlZ2VyKGluaXRpYWxDYXBhY2l0eSkpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotCQlPYmplY3RbXSBlbGVtZW50RGF0YSA9IChPYmplY3RbXSkgQ2xhc3NUb29scy5maWVsZFZhbHVlKHYsICJlbGVtZW50RGF0YSIpOwotCQlhc3NlcnRFcXVhbHMoaW5pdGlhbENhcGFjaXR5LCBlbGVtZW50RGF0YS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdJbnN0YW5jZUNsYXNzQ2xhc3NBcnJheU9iamVjdEFycmF5KCkgewotCQlpbnQgaW5pdGlhbENhcGFjaXR5ID0gMjAwOwotCQlDbGFzczw/PltdIHBhcm1UeXBlcyA9IG5ldyBDbGFzc1sxXTsKLQkJcGFybVR5cGVzWzBdID0gaW50LmNsYXNzOwotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbMV07Ci0JCXBhcm1zWzBdID0gbmV3IEludGVnZXIoaW5pdGlhbENhcGFjaXR5KTsKLQkJVmVjdG9yPD8+IHYgPSBDbGFzc1Rvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIHBhcm1UeXBlcywgcGFybXMpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotCQlPYmplY3RbXSBlbGVtZW50RGF0YSA9IChPYmplY3RbXSkgQ2xhc3NUb29scy5maWVsZFZhbHVlKHYsICJlbGVtZW50RGF0YSIpOwotCQlhc3NlcnRFcXVhbHMoaW5pdGlhbENhcGFjaXR5LCBlbGVtZW50RGF0YS5sZW5ndGgpOwotCi0JCXBhcm1zWzBdID0gbmV3IEludGVnZXIoLTEpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl2ID0gQ2xhc3NUb29scy5uZXdJbnN0YW5jZShqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBwYXJtVHlwZXMsIHBhcm1zKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIlJ1bnRpbWVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQotCQlwYXJtVHlwZXNbMF0gPSBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzOwotCQlwYXJtc1swXSA9ICJmb28iOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdiA9IENsYXNzVG9vbHMuYXR0ZW1wdE5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIHBhcm1UeXBlcywgcGFybXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hNZXRob2RFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRWYWx1ZSgpIHsKLQkJaW50IGluaXRpYWxDYXBhY2l0eSA9IDIwMDsKLQkJVmVjdG9yPD8+IHYgPSBuZXcgVmVjdG9yPE9iamVjdD4oaW5pdGlhbENhcGFjaXR5KTsKLQkJT2JqZWN0W10gZWxlbWVudERhdGEgPSAoT2JqZWN0W10pIENsYXNzVG9vbHMuZmllbGRWYWx1ZSh2LCAiZWxlbWVudERhdGEiKTsKLQkJYXNzZXJ0RXF1YWxzKGluaXRpYWxDYXBhY2l0eSwgZWxlbWVudERhdGEubGVuZ3RoKTsKLQotCQkvLyB0ZXN0IGluaGVyaXRlZCBmaWVsZAotCQlJbnRlZ2VyIG1vZENvdW50SW50ZWdlciA9IChJbnRlZ2VyKSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUodiwgIm1vZENvdW50Iik7Ci0JCWludCBtb2RDb3VudCA9IG1vZENvdW50SW50ZWdlci5pbnRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgbW9kQ291bnQpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGJvZ3VzRmllbGRWYWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlib2d1c0ZpZWxkVmFsdWUgPSBDbGFzc1Rvb2xzLmF0dGVtcHRUb0dldEZpZWxkVmFsdWUodiwgImJvZ3VzRmllbGQiKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgYm9ndXNGaWVsZFZhbHVlLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVNZXRob2RPYmplY3RTdHJpbmcoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJaW50IHNpemUgPSAoKEludGVnZXIpIENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZCh2LCAic2l6ZSIpKS5pbnRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgc2l6ZSk7Ci0KLQkJdi5hZGRFbGVtZW50KCJmb28iKTsKLQkJc2l6ZSA9ICgoSW50ZWdlcikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKHYsICJzaXplIikpLmludFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygxLCBzaXplKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU1ldGhvZE9iamVjdFN0cmluZ0NsYXNzT2JqZWN0KCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCWJvb2xlYW4gYm9vbGVhblJlc3VsdCA9ICgoQm9vbGVhbikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKHYsICJhZGQiLCBPYmplY3QuY2xhc3MsICJmb28iKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoYm9vbGVhblJlc3VsdCk7Ci0JCWFzc2VydFRydWUodi5jb250YWlucygiZm9vIikpOwotCQlPYmplY3Qgdm9pZFJlc3VsdCA9IENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZCh2LCAiYWRkRWxlbWVudCIsIE9iamVjdC5jbGFzcywgImJhciIpOwotCQlhc3NlcnROdWxsKHZvaWRSZXN1bHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlTWV0aG9kT2JqZWN0U3RyaW5nQ2xhc3NBcnJheU9iamVjdEFycmF5KCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCUNsYXNzPD8+W10gcGFybVR5cGVzID0gbmV3IENsYXNzWzFdOwotCQlwYXJtVHlwZXNbMF0gPSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzOwotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbMV07Ci0JCXBhcm1zWzBdID0gImZvbyI7Ci0JCWJvb2xlYW4gYm9vbGVhblJlc3VsdCA9ICgoQm9vbGVhbikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKHYsICJhZGQiLCBwYXJtVHlwZXMsIHBhcm1zKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoYm9vbGVhblJlc3VsdCk7Ci0JCWFzc2VydFRydWUodi5jb250YWlucygiZm9vIikpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGJvZ3VzTWV0aG9kUmV0dXJuVmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJYm9ndXNNZXRob2RSZXR1cm5WYWx1ZSA9IENsYXNzVG9vbHMuYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZCh2LCAiYm9ndXNNZXRob2QiLCBwYXJtVHlwZXMsIHBhcm1zKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBib2d1c01ldGhvZFJldHVyblZhbHVlLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVTdGF0aWNNZXRob2RDbGFzc1N0cmluZygpIHsKLQkJRG91YmxlIHJhbmRvbU9iamVjdCA9IChEb3VibGUpIENsYXNzVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuTWF0aC5jbGFzcywgInJhbmRvbSIpOwotCQlhc3NlcnROb3ROdWxsKHJhbmRvbU9iamVjdCk7Ci0JCWRvdWJsZSByYW5kb20gPSByYW5kb21PYmplY3QuZG91YmxlVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShyYW5kb20gPj0gMCk7Ci0JCWFzc2VydFRydWUocmFuZG9tIDwgMSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVTdGF0aWNNZXRob2RDbGFzc1N0cmluZ0NsYXNzT2JqZWN0KCkgewotCQlTdHJpbmcgcyA9IChTdHJpbmcpIENsYXNzVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAidmFsdWVPZiIsIGJvb2xlYW4uY2xhc3MsIEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE5vdE51bGwocyk7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsIHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlU3RhdGljTWV0aG9kQ2xhc3NTdHJpbmdDbGFzc0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCUNsYXNzPD8+W10gcGFybVR5cGVzID0gbmV3IENsYXNzWzFdOwotCQlwYXJtVHlwZXNbMF0gPSBib29sZWFuLmNsYXNzOwotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbMV07Ci0JCXBhcm1zWzBdID0gQm9vbGVhbi5UUlVFOwotCQlTdHJpbmcgcyA9IChTdHJpbmcpIENsYXNzVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAidmFsdWVPZiIsIHBhcm1UeXBlcywgcGFybXMpOwotCQlhc3NlcnROb3ROdWxsKHMpOwotCQlhc3NlcnRFcXVhbHMoInRydWUiLCBzKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBib2d1c1N0YXRpY01ldGhvZFJldHVyblZhbHVlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJvZ3VzU3RhdGljTWV0aG9kUmV0dXJuVmFsdWUgPSBDbGFzc1Rvb2xzLmF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgImJvZ3VzU3RhdGljTWV0aG9kIiwgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSwgZXhDYXVnaHQpOwotCi0JCS8vIHRlc3Qgbm9uLXN0YXRpYyBtZXRob2QKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWJvZ3VzU3RhdGljTWV0aG9kUmV0dXJuVmFsdWUgPSBDbGFzc1Rvb2xzLmF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgInRvU3RyaW5nIik7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGaWVsZFZhbHVlKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCU9iamVjdFtdIG5ld0VsZW1lbnREYXRhID0gbmV3IE9iamVjdFs1XTsKLQkJbmV3RWxlbWVudERhdGFbMF0gPSAiZm9vIjsKLQkJQ2xhc3NUb29scy5zZXRGaWVsZFZhbHVlKHYsICJlbGVtZW50RGF0YSIsIG5ld0VsZW1lbnREYXRhKTsKLQkJQ2xhc3NUb29scy5zZXRGaWVsZFZhbHVlKHYsICJlbGVtZW50Q291bnQiLCBuZXcgSW50ZWdlcigxKSk7Ci0JCS8vIHRlc3QgaW5oZXJpdGVkIGZpZWxkCi0JCUNsYXNzVG9vbHMuc2V0RmllbGRWYWx1ZSh2LCAibW9kQ291bnQiLCBuZXcgSW50ZWdlcigxKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWlucygiZm9vIikpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNsYXNzVG9vbHMuYXR0ZW1wdFRvU2V0RmllbGRWYWx1ZSh2LCAiYm9ndXNGaWVsZCIsICJmb28iKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTdGF0aWNGaWVsZFZhbHVlKCkgewotCQlDbGFzc1Rvb2xzLnNldFN0YXRpY0ZpZWxkVmFsdWUodGhpcy5nZXRDbGFzcygpLCAidGVzdFN0YXRpY0ZpZWxkIiwgIm5ldyB2YWx1ZSIpOwotCQlhc3NlcnRFcXVhbHModGVzdFN0YXRpY0ZpZWxkLCAibmV3IHZhbHVlIik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ2xhc3NUb29scy5hdHRlbXB0VG9TZXRTdGF0aWNGaWVsZFZhbHVlKHRoaXMuZ2V0Q2xhc3MoKSwgImJvZ3VzU3RhdGljRmllbGQiLCAibmV3IHZhbHVlIik7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRmllbGRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnROYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoIlZlY3RvciIsIENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3I8T2JqZWN0PigpKSk7Ci0JCWFzc2VydEVxdWFscygiVmVjdG9yIiwgQ2xhc3NUb29scy5zaG9ydE5hbWVGb3IoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWROYW1lKCkgewotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQltYXAucHV0KCJmb28iLCAiYmFyIik7Ci0JCUVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkVudHJ5IiwgQ2xhc3NUb29scy5uZXN0ZWRDbGFzc05hbWVGb3JPYmplY3QoZW50cnkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFbnRyeSIsIENsYXNzVG9vbHMubmVzdGVkTmFtZUZvcihqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhY2thZ2VOYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbCIsIENsYXNzVG9vbHMucGFja2FnZU5hbWVGb3IoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbCIsIENsYXNzVG9vbHMucGFja2FnZU5hbWVGb3IoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheURlcHRoRm9yKCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvcihpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvcih2b2lkLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3IoamF2YS51dGlsLlZlY3RvcltdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3IoaW50W10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvcihqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3IoaW50W11bXVtdLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5RGVwdGhGb3JPYmplY3QoKSB7Ci0JCWFzc2VydEVxdWFscygwLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3I8T2JqZWN0PigpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3JbMF0pKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvck9iamVjdChuZXcgaW50WzBdKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3JbMF1bMF1bMF0pKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvck9iamVjdChuZXcgaW50WzBdWzBdWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5RGVwdGhGb3JDbGFzc05hbWVkKCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yQ2xhc3NOYW1lZChqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yQ2xhc3NOYW1lZChpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoaW50W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGphdmEudXRpbC5WZWN0b3JbXVtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGludFtdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVGb3IoKSB7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlRm9yKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvcihpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVGb3Iodm9pZC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvcihqYXZhLnV0aWwuVmVjdG9yW10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvcihpbnRbXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvcihqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVGb3IoaW50W11bXVtdLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRUeXBlRm9yT2JqZWN0KCkgewotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvck9iamVjdChuZXcgamF2YS51dGlsLlZlY3RvcjxPYmplY3Q+KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3JbMF0pKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvck9iamVjdChuZXcgaW50WzBdKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlRm9yT2JqZWN0KG5ldyBqYXZhLnV0aWwuVmVjdG9yWzBdWzBdWzBdKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVGb3JPYmplY3QobmV3IGludFswXVswXVswXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50VHlwZU5hbWVGb3IoKSB7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3IoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3IoaW50LmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3Iodm9pZC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3IoaW50W10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvcihqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvcihpbnRbXVtdW10uY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChpbnRbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQoamF2YS51dGlsLlZlY3RvcltdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChpbnRbXVtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzQ29kZXMoKSB7Ci0JCWFzc2VydEVxdWFscygiYnl0ZSIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnQicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaGFyIiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JDb2RlKCdDJykpOwotCQlhc3NlcnRFcXVhbHMoImRvdWJsZSIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnRCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmbG9hdCIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnRicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvckNvZGUoJ0knKSk7Ci0JCWFzc2VydEVxdWFscygibG9uZyIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnSicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzaG9ydCIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnUycpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JDb2RlKCdaJykpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvckNvZGUoJ1YnKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ2xhc3NUb29scy5jbGFzc05hbWVGb3JDb2RlKCdYJyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVkSXNUb3BMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoQ2xhc3MuZm9yTmFtZShtdW5nZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxJExvY2FsQ2xhc3MiKSkuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIikuZ2V0TmFtZSgpKSk7IC8vIGFub255bW91cwotCi0JCU9iamVjdFtdIGFycmF5ID0gbmV3IGphdmEudXRpbC5NYXBbMF07IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1RvcExldmVsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCWFycmF5ID0gbmV3IGphdmEudXRpbC5NYXAuRW50cnlbMF07IC8vIG1lbWJlcgotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1RvcExldmVsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKG11bmdlKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDEkTG9jYWxDbGFzcyIpKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1RvcExldmVsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGFub25DbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpOyAvLyBsb2NhbAotCQlhcnJheSA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UoYW5vbkNsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNUb3BMZXZlbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVkSXNNZW1iZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKENsYXNzLmZvck5hbWUobXVuZ2UodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMSRMb2NhbENsYXNzIikpLmdldE5hbWUoKSkpOyAvLyBsb2NhbAotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcihDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKS5nZXROYW1lKCkpKTsgLy8gYW5vbnltb3VzCi0KLQkJT2JqZWN0W10gYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcFswXTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCWFycmF5ID0gbmV3IGphdmEudXRpbC5NYXAuRW50cnlbMF07IC8vIG1lbWJlcgotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcihhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBsb2NhbENsYXNzID0gQ2xhc3MuZm9yTmFtZShtdW5nZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxJExvY2FsQ2xhc3MiKSk7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gYW5vbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhbm9uQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcihhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCi0JCS8vIHRlc3QgYSBmZXcgZWRnZSBjYXNlcwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExIikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExJGFhYSRiYmIiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDFhMSRhYWEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDFhIikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExMjM0NSRiMTIzNDUiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDEyMzQ1YSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoImphdmEudXRpbC5NYXAkMzMzIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcigiamF2YS51dGlsLk1hcDMkMzMzIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVkSXNMb2NhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljbGFzcyBMb2NhbENsYXNzIHsKLQkJCXZvaWQgZm9vKCkgewotCQkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgiZm9vIik7Ci0JCQl9Ci0JCX0KLQkJbmV3IExvY2FsQ2xhc3MoKS5mb28oKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldE5hbWUoKSkpOyAvLyBtZW1iZXIKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKENsYXNzLmZvck5hbWUobXVuZ2UodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMSRMb2NhbENsYXNzIikpLmdldE5hbWUoKSkpOyAvLyBsb2NhbAotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwLkVudHJ5WzBdOyAvLyBtZW1iZXIKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBsb2NhbENsYXNzID0gQ2xhc3MuZm9yTmFtZShtdW5nZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxJExvY2FsQ2xhc3MiKSk7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBhbm9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFub25DbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQotCQkvLyB0ZXN0IGEgZmV3IGVkZ2UgY2FzZXMKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCRhMSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCRhMSRhYWEkYmJiIikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMTEkYWFhIikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMSRhIikpOyAvLyBlY2xpcHNlIG5hbWluZyBjb252ZW50aW9uCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCQyJGFiYyIpKTsgLy8gZWNsaXBzZSBuYW1pbmcgY29udmVudGlvbgotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMiRhYmMxIikpOyAvLyBlY2xpcHNlIG5hbWluZyBjb252ZW50aW9uCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCQxYSIpKTsgLy8gamRrIG5hbWluZyBjb252ZW50aW9uCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCQyYWJjIikpOyAvLyBqZGsgbmFtaW5nIGNvbnZlbnRpb24KLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDJhYmMxIikpOyAvLyBqZGsgbmFtaW5nIGNvbnZlbnRpb24KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCRhMTIzNDUkYjEyMzQ1IikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMTIzNDUkYTEyMzQiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMzMzIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKCJqYXZhLnV0aWwuTWFwMyQzMzMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZWRJc0Fub255bW91cygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cyhqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKENsYXNzLmZvck5hbWUobXVuZ2UodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMSRMb2NhbENsYXNzIikpLmdldE5hbWUoKSkpOyAvLyBsb2NhbAotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcC5FbnRyeVswXTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKG11bmdlKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDEkTG9jYWxDbGFzcyIpKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cyhhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBhbm9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFub25DbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0KLQkJLy8gdGVzdCBhIGZldyBlZGdlIGNhc2VzCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJGExIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCRhMSRhYWEkYmJiIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxYTEkYWFhIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxJGEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJDFhIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCRhMTIzNDUkYjEyMzQ1IikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxMjM0NSRhMTIzNCIpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcCQzMzMiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAzJDMzMyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29kZUZvckNsYXNzKCkgewotCQlhc3NlcnRFcXVhbHMoJ0knLCBDbGFzc1Rvb2xzLmNvZGVGb3JDbGFzcyhpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCdCJywgQ2xhc3NUb29scy5jb2RlRm9yQ2xhc3MoYnl0ZS5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2RlRm9yQ2xhc3NOYW1lZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCdJJywgQ2xhc3NUb29scy5jb2RlRm9yQ2xhc3NOYW1lZChpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygnSScsIENsYXNzVG9vbHMuY29kZUZvckNsYXNzTmFtZWQoImludCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCdCJywgQ2xhc3NUb29scy5jb2RlRm9yQ2xhc3NOYW1lZChieXRlLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoJ0InLCBDbGFzc1Rvb2xzLmNvZGVGb3JDbGFzc05hbWVkKCJieXRlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0lzUHJpbWl0aXZlV3JhcHBlckNsYXNzKCkgewotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuVm9pZC5jbGFzcykpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcykpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuSW50ZWdlci5jbGFzcykpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuRmxvYXQuY2xhc3MpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLlN0cmluZy5jbGFzcykpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3Modm9pZC5jbGFzcykpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoaW50LmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcygpIHsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLlZvaWQuY2xhc3MpKTsKLQotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKGphdmEubGFuZy5Cb29sZWFuLmNsYXNzKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLkludGVnZXIuY2xhc3MpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuRmxvYXQuY2xhc3MpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKHZvaWQuY2xhc3MpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoaW50LmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZWRJc1ByaW1pdGl2ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkpOwotCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmUodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ByaW1pdGl2ZShpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmUoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmUoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ByaW1pdGl2ZShqYXZhLmxhbmcuTnVtYmVyLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ByaW1pdGl2ZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ByaW1pdGl2ZShqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNQcmltaXRpdmUoamF2YS5sYW5nLkludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKCkgewotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKGZsb2F0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmUoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKGphdmEubGFuZy5OdW1iZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZShqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoKSB7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLlZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLkZsb2F0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuTnVtYmVyLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb25TdHJpbmdJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgQ2xhc3NUb29scy5jbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoaW50W10uY2xhc3MsIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDEpKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdW11bXS5jbGFzcywgQ2xhc3NUb29scy5jbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMykpOwotCi0JCWFzc2VydEVxdWFscyhPYmplY3QuY2xhc3MsIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAwKSk7Ci0JCWFzc2VydEVxdWFscyhPYmplY3RbXVtdW10uY2xhc3MsIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MsIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oInZvaWQiLCAwKSk7Ci0JCXRyeSB7Ci0JCQlDbGFzc1Rvb2xzLmNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCAxKTsKLQkJCWZhaWwoInNob3VsZCBub3QgZ2V0IGhlcmUuLi4iKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb25TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50IikpOwotCQlhc3NlcnRFcXVhbHMoIltJIiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludFtdIikpOwotCQlhc3NlcnRFcXVhbHMoIltbSSIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQgWyBdIFsgXSIpKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbTGphdmEubGFuZy5PYmplY3Q7IiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RcdFtdIikpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEubGFuZy5PYmplY3Q7IiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RcdFtdXHRbXSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvblN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IikpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0W10iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RbXVtdW10iKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiaW50IikpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJpbnRbXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiaW50W11bXVtdIikpOwotCi0JCWFzc2VydEVxdWFscygwLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0IikpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJmbG9hdCBbIF0iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0W10gW10gW10iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvblN0cmluZ0ludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDApKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDEpKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdW11bXS5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiLCAzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE9iamVjdC5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoT2JqZWN0W11bXVtdLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigidm9pZCIsIDApKTsKLQkJdHJ5IHsKLQkJCUNsYXNzVG9vbHMuY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCAxKTsKLQkJCWZhaWwoInNob3VsZCBub3QgZ2V0IGhlcmUuLi4iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKEZpZWxkW10gZmllbGRzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGaWVsZCwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoZmllbGRzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShGaWVsZCBmaWVsZCkgewotCQkJCXJldHVybiBmaWVsZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKE1ldGhvZFtdIG1ldGhvZHMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE1ldGhvZCwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IobWV0aG9kcykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE5ZGFjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ2xhc3NwYXRoVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc3BhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfSE9NRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7Ci0KLQlwdWJsaWMgQ2xhc3NwYXRoVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzZWQoKSB7Ci0JCVN0cmluZyBwYXRoID0gIiI7Ci0KLQkJLy8gbm8gY2hhbmdlcwotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLnBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkucGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLnBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyOzs7O0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXHJ0Lmphcjs7OyIpKS5jb21wcmVzc2VkKCkucGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCS8vIG5vIGNoYW5nZXMKLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkucGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFwuLlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkucGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGsxXFxqZGsyXFxqZGszXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpkazFcXGpkazJcXGpkazNcXC4uXFwuLlxcLi5cXGpkazFcXGpkazJcXGpkazNcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrMVxcamRrMlxcamRrM1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzTmFtZSgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCksIGNsYXNzTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZU5hbWUgPSAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyI7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJQ2xhc3M8Pz4gamF2YUNsYXNzID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0NsYXNzKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZSgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS9sYW5nL1N0cmluZy5jbGFzcyIsIGZpbGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQ2xhc3NGaWxlTmFtZSgpIHsKLQkJY2hhciBzYyA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJU3RyaW5nIGZpbGVOYW1lID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YSIgKyBzYyArICJsYW5nIiArIHNjICsgIlN0cmluZy5jbGFzcyIsIGZpbGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvSmF2YUZpbGVOYW1lKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBDbGFzc3BhdGguY29udmVydFRvSmF2YUZpbGVOYW1lKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhIiArIHNjICsgImxhbmciICsgc2MgKyAiU3RyaW5nLmphdmEiLCBmaWxlTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VSTHMoKSB7Ci0JCVVSTFtdIGVudHJpZXMgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkudXJscygpOwotCQlpbnQgaSA9IDA7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovamRrL3J0LmphciIpLCBlbnRyaWVzW2krK10uZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9qZGsvaTE4bi5qYXIiKSwgZW50cmllc1tpKytdLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovamRrL2phd3MuamFyIiksIGVudHJpZXNbaSsrXS5nZXRQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaFVSTCgiL0M6L2Zvby9jbGFzc2VzIiksIGVudHJpZXNbaSsrXS5nZXRQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaFVSTCgiL0M6L2Jhci9iYXIuamFyIiksIGVudHJpZXNbaSsrXS5nZXRQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHMoaSwgZW50cmllcy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRyaWVzKCkgewotCQlDbGFzc3BhdGggY3AgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0Lmphcjs7LjtDOlxcamRrXFxpMThuLmphcjs7O0M6XFxqZGtcXGphd3MuamFyOztDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7QzpcXGJhclxcYmFyLmphcjsiKSk7Ci0JCUNsYXNzcGF0aC5FbnRyeVtdIGVudHJpZXMgPSBjcC5lbnRyaWVzKCk7Ci0JCWludCBpID0gMDsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCIuIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGphd3MuamFyIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxmb29cXGNsYXNzZXMiKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGJhclxcYmFyLmphciIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcYmFyXFxiYXIuamFyIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGksIGVudHJpZXMubGVuZ3RoKTsKLQotCQljcCA9IGNwLmNvbXByZXNzZWQoKTsKLQkJZW50cmllcyA9IGNwLmVudHJpZXMoKTsKLQkJaSA9IDA7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiLiIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphciIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxqYXdzLmphciIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcZm9vXFxjbGFzc2VzIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxiYXJcXGJhci5qYXIiKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaSwgZW50cmllcy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRyeUZvckZpbGVOYW1lZCgpIHsKLQkJQ2xhc3NwYXRoLkVudHJ5IGVudHJ5ID0gbnVsbDsKLQotCQkvLyBpbiB0aGUgbWlkZGxlIC0gcXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5maWxlTmFtZSgpKTsKLQotCQkvLyBpbiB0aGUgbWlkZGxlIC0gdW5xdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO3J0LmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHMoInJ0LmphciIsIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIGF0IHRoZSBiZWdpbm5pbmcgLSBxdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIGF0IHRoZSBiZWdpbm5pbmcgLSB1bnF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicnQuamFyIiwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gYXQgdGhlIGVuZCAtIHF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyO0M6XFxqZGtcXHJ0LmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gYXQgdGhlIGVuZCAtIHVucXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7cnQuamFyIikpLmVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJydC5qYXIiLCBlbnRyeS5maWxlTmFtZSgpKTsKLQotCQkvLyBhbG9uZSAtIHF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIikpLmVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5maWxlTmFtZSgpKTsKLQotCQkvLyBhbG9uZSAtIHVucXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCgicnQuamFyIikuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHMoInJ0LmphciIsIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIHRyaWNrIGVudHJ5IGF0IHRoZSBiZWdpbm5pbmcKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoInJ0Lmphci5uZXc7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gdHJpY2sgZW50cnkgaW4gdGhlIG1pZGRsZQotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydHJ0cnQuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIHRyaWNrIGVudHJ5IGF0IHRoZSBlbmQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoInJ0Lmphci5uZXc7QzpcXGpka1xccnRydHJ0LmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyO0M6XFxqZGtcXHJ0cnRydC5qYXIiKSkuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIG1pc3NpbmcKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoInJ0Lmphci5uZXc7QzpcXGpka1xccnRydHJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7QzpcXGpka1xccnRydHJ0LmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicGF0aCBlbnRyeSBzaG91bGQgbm90IGJlIGZvdW5kIiwgbnVsbCwgZW50cnkpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvY2F0aW9uRm9yQ2xhc3MoKSB7Ci0JCUNsYXNzPD8+IGphdmFDbGFzcyA9IENsYXNzcGF0aC5jbGFzczsKLQkJRmlsZSBlbnRyeSA9IG5ldyBGaWxlKENsYXNzcGF0aC5sb2NhdGlvbkZvcihqYXZhQ2xhc3MpKTsKLQkJaWYgKGVudHJ5LmlzRmlsZSgpIHx8IGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCWFzc2VydFRydWUoZW50cnkuZXhpc3RzKCkpOwotCQl9Ci0JCWlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlhc3NlcnRUcnVlKG5ldyBGaWxlKGVudHJ5LCBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhQ2xhc3MpKS5leGlzdHMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnRKYXJOYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBydEZpbGUgPSBuZXcgRmlsZShDbGFzc3BhdGgucnRKYXJOYW1lKCkpOwotCQlhc3NlcnRUcnVlKCJydC5qYXIgZG9lcyBub3QgZXhpc3QiLCBydEZpbGUuZXhpc3RzKCkpOwotCi0JCUphckZpbGUgcnRKYXJGaWxlID0gbmV3IEphckZpbGUocnRGaWxlKTsKLQkJSmFyRW50cnkgZW50cnkgPSBydEphckZpbGUuZ2V0SmFyRW50cnkoImphdmEvbGFuZy9PYmplY3QuY2xhc3MiKTsKLQkJcnRKYXJGaWxlLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoImJvZ3VzIHJ0LmphciIsIGVudHJ5ICE9IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKUkVDbGFzc05hbWVzKCkgewotCQlhc3NlcnRUcnVlKCJWZWN0b3IgaXMgbWlzc2luZyBmcm9tIEpSRSBjbGFzcyBuYW1lcyIsIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmNsYXNzTmFtZXMoKSwgamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiRmlsZSBpcyBtaXNzaW5nIGZyb20gSlJFIGNsYXNzIG5hbWVzIiwgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuY2xhc3NOYW1lcygpLCBqYXZhLmlvLkZpbGUuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25EaXJlY3RvcnlOYW1lcygpIHsKLQkJY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCVN0cmluZyBzdGRFeHREaXJOYW1lID0gSkFWQV9IT01FICsgc2VwICsgImxpYiIgKyBzZXAgKyAiZXh0IjsKLQkJYXNzZXJ0VHJ1ZSgic3RhbmRhcmQgZXh0ZW5zaW9uIGRpciBuYW1lIG1pc3Npbmc6ICIgKyBzdGRFeHREaXJOYW1lLCBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmphdmFFeHRlbnNpb25EaXJlY3RvcnlOYW1lcygpLCBzdGRFeHREaXJOYW1lKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25EaXJlY3RvcmllcygpIHsKLQkJY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCUZpbGUgc3RkRXh0RGlyID0gbmV3IEZpbGUoSkFWQV9IT01FICsgc2VwICsgImxpYiIgKyBzZXAgKyAiZXh0Iik7Ci0JCWFzc2VydFRydWUoInN0YW5kYXJkIGV4dGVuc2lvbiBkaXIgbWlzc2luZzogIiArIHN0ZEV4dERpci5nZXRQYXJlbnQoKSwgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uRGlyZWN0b3JpZXMoKSwgc3RkRXh0RGlyKSk7Ci0JfQotCi0JLy9Db21tZW50ZWQgb3V0IGR1ZSB0byBpbmNvbXBhdGliaWxpdHkgd2l0aCBJQk0gSkRLICh1c2VkIGluIEVjbGlwc2UgV1RQIEJ1aWxkKQotCS8vVE9ETyBUZXN0IHNob3VsZCBiZSByZXZpc2VkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBJQk0gSkRLCi0JLy8JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25DbGFzc3BhdGhFbnRyaWVzKCkgewotCS8vCQljaGFyIHNlcCA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkvLwkJU3RyaW5nIGpkayA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIik7Ci0JLy8JCWlmIChqZGsuc3RhcnRzV2l0aCgiMS40IikgfHwgamRrLnN0YXJ0c1dpdGgoIjEuNSIpKSB7Ci0JLy8JCQlDb2xsZWN0aW9uIGphck5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vCQkJQ2xhc3NwYXRoLkVudHJ5W10gZW50cmllcyA9IENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCkuZ2V0RW50cmllcygpOwotCS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JLy8JCQkJamFyTmFtZXMuYWRkKGVudHJpZXNbaV0uZmlsZU5hbWUoKSk7Ci0JLy8JCQl9Ci0JLy8JCQlTdHJpbmcgc3RkRXh0SmFyTmFtZSA9IEpBVkFfSE9NRSArIHNlcCArICJsaWIiICsgc2VwICsgImV4dCIgKyBzZXAgKyAiZG5zbnMuamFyIjsKLQkvLwkJCWFzc2VydFRydWUoImpkayAxLjQueCBzdGFuZGFyZCBleHRlbnNpb24gamFyIG1pc3Npbmc6ICIgKyBzdGRFeHRKYXJOYW1lLCBqYXJOYW1lcy5jb250YWlucyhzdGRFeHRKYXJOYW1lKSk7Ci0JLy8JCX0gZWxzZSB7Ci0JLy8JCQlmYWlsKCJ3ZSBuZWVkIHRvIHVwZGF0ZSB0aGlzIHRlc3QgZm9yIHRoZSBjdXJyZW50IGpkayIpOwotCS8vCQl9Ci0JLy8JfQotCi0JLy9Db21tZW50ZWQgb3V0IGR1ZSB0byBpbmNvbXBhdGliaWxpdHkgd2l0aCBJQk0gSkRLICh1c2VkIGluIEVjbGlwc2UgV1RQIEJ1aWxkKQotCS8vVE9ETyBUZXN0IHNob3VsZCBiZSByZXZpc2VkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBJQk0gSkRLCi0JLy8JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25DbGFzc05hbWVzKCkgewotCS8vCQlTdHJpbmcgamRrID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsKLQkvLwkJaWYgKGpkay5zdGFydHNXaXRoKCIxLjQiKSB8fCBqZGsuc3RhcnRzV2l0aCgiMS41IikpIHsKLQkvLwkJCVN0cmluZyBjbGFzc05hbWUgPSAic3VuLm5ldC5zcGkubmFtZXNlcnZpY2UuZG5zLkROU05hbWVTZXJ2aWNlIjsKLQkvLwkJCWFzc2VydFRydWUoImpkayAxLjQueCBzdGFuZGFyZCBleHRlbnNpb24gY2xhc3MgbWlzc2luZzogIiArIGNsYXNzTmFtZSwKLQkvLwkJCQkJQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCkuY2xhc3NOYW1lcygpLCBjbGFzc05hbWUpKTsKLQkvLwkJfSBlbHNlIHsKLQkvLwkJCWZhaWwoIndlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdGVzdCBmb3IgdGhlIGN1cnJlbnQgamRrIik7Ci0JLy8JCX0KLQkvLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUNsYXNzcGF0aENsYXNzTmFtZXMoKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlDbGFzc0xvYWRlciBjbCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQkvLyBtYWtlIHN1cmUgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlICJub3JtYWwiIGNsYXNzIGxvYWRlcjsKLQkJLy8gd2hlbiB0aGUgdGVzdHMgYXJlIGV4ZWN1dGVkIGFzIGFuIEFOVCB0YXNrLCB0aGV5IGFyZSBydW4gdW5kZXIKLQkJLy8gYW4gQU5UIGNsYXNzIGxvYWRlciBhbmQgdGhlICJKYXZhIiBjbGFzc3BhdGggZG9lcyBub3QgaW5jbHVkZSB0aGlzIGNsYXNzCi0JCWlmIChjbC5nZXRDbGFzcygpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJzdW4ubWlzYyIpKSB7Ci0JCQlhc3NlcnRUcnVlKCJjbGFzcyBtaXNzaW5nOiAiICsgY2xhc3NOYW1lLCBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmphdmFDbGFzc3BhdGgoKS5jbGFzc05hbWVzKCksIGNsYXNzTmFtZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbW9ycGggdGhlIHNwZWNpZmllZCBwYXRoIHRvIGEgcGxhdGZvcm0taW5kZXBlbmRlbnQgcGF0aAotCSAqLwotCXByaXZhdGUgU3RyaW5nIG1vcnBoKFN0cmluZyBwYXRoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBwYXRoOwotCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZSgnXFwnLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZSgnOycsIEZpbGUucGF0aFNlcGFyYXRvckNoYXIpOwotCQlpZiAoIUNvbGxlY3Rpb25Ub29scy5jb250YWlucyhGaWxlLmxpc3RSb290cygpLCBuZXcgRmlsZSgiQzpcXCIpKSkgewotCQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoIkM6IiwgIiIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogbW9ycGggdGhlIHNwZWNpZmllZCBVUkwgdG8gYSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBwYXRoCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbW9ycGhVUkwoU3RyaW5nIHVybCkgewotCQlTdHJpbmcgcmVzdWx0ID0gdXJsOwotCQlpZiAoIUNvbGxlY3Rpb25Ub29scy5jb250YWlucyhGaWxlLmxpc3RSb290cygpLCBuZXcgRmlsZSgiQzpcXCIpKSkgewotCQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoIi9DOiIsICIiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db2xsZWN0aW9uVG9vbHNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db2xsZWN0aW9uVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWM0ZWYzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJldmVyc2VDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvblRvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvblRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5T2JqZWN0X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IENvbGxlY3Rpb25Ub29scy5hZGQodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCAidHdlbnR5Iik7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0d2VudHkiKSk7Ci0JCWFzc2VydEVxdWFscygidHdlbnR5IiwgYVthLmxlbmd0aC0xXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5T2JqZWN0X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IENvbGxlY3Rpb25Ub29scy5hZGQodGhpcy5idWlsZFN0cmluZ0FycmF5MSgpLCAidHdlbnR5Iik7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0d2VudHkiKSk7Ci0JCWFzc2VydEVxdWFscygidHdlbnR5IiwgYVthLmxlbmd0aC0xXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5T2JqZWN0X0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAidHdlbnR5Iik7Ci0JCWFzc2VydEVxdWFscygxLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0d2VudHkiKSk7Ci0JCWFzc2VydEVxdWFscygidHdlbnR5IiwgYVswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAyLCAiWCIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiWCIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlJbnRPYmplY3RfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDIsICJYIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheUludE9iamVjdF9FbmQoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgNCwgIlgiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIsICJYIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X1plcm8oKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgMCwgIlgiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiWCIsICJhIiwgImIiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X0V4Y2VwdGlvbigpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAzMywgIlgiKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IENvbGxlY3Rpb25Ub29scy5hZGQodGhpcy5idWlsZENoYXJBcnJheSgpLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAnZCcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5Q2hhcl9FbXB0eSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgJ2QnKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5SW50Q2hhcigpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDIsICdYJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnWCcsICdjJywgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5SW50Q2hhcl9aZXJvKCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgMCwgJ1gnKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ1gnLCAnYScsICdiJywgJ2MnLCAnZCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDaGFyQXJyYXlJbnRDaGFyX0VuZCgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDQsICdYJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ1gnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKHRoaXMuYnVpbGRJbnRBcnJheSgpLCAzMCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludEFycmF5SW50X0VtcHR5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFswXTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgMzApOwotCQlhc3NlcnRFcXVhbHMoMSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAzMCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMzAgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgMiwgOTkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCA5OSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMiwgOTksIDMsIDQgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludEludF9aZXJvKCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMSwgMiwgMywgNCB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAwLCA5OSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA5OSwgMSwgMiwgMywgNCB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludEFycmF5SW50SW50X0VuZCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgNCwgOTkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCA5OSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMiwgMywgNCwgOTkgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfU3RyaW5nTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGl0ZXJhYmxlMi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9TdHJpbmdVbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQxID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzZXQxCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0MSwgaXRlcmFibGUzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9PYmplY3RNb2RpZmllZCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QxID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgaXRlcmFibGUyKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKChMaXN0PFN0cmluZz4pIGl0ZXJhYmxlMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfT2JqZWN0VW5tb2RpZmllZCgpIHsKLQkJU2V0PE9iamVjdD4gc2V0MSA9IHRoaXMuYnVpbGRPYmplY3RTZXQxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgc2V0MQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGl0ZXJhYmxlMykpOwotCQlhc3NlcnRFcXVhbHMoMywgc2V0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHNldDEuY29udGFpbnNBbGwoKExpc3Q8U3RyaW5nPikgaXRlcmFibGUzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9FbXB0eUl0ZXJhYmxlKCkgewotCQlTZXQ8T2JqZWN0PiBzZXQxID0gdGhpcy5idWlsZE9iamVjdFNldDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50X01vZGlmaWVkKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gbGlzdDI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgaXRlcmFibGUyLml0ZXJhdG9yKCksIGxpc3QyLnNpemUoKSkpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0MS5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVJbnRfVW5tb2RpZmllZCgpIHsKLQkJU2V0PFN0cmluZz4gc2V0MSA9IHRoaXMuYnVpbGRTdHJpbmdTZXQxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOyAvLyBzYW1lIGVsZW1lbnRzIGFzIHNldDEKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTMgPSBsaXN0MTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBpdGVyYWJsZTMuaXRlcmF0b3IoKSwgbGlzdDEuc2l6ZSgpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0MS5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JfU3RyaW5nTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QxLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9TdHJpbmdVbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQxID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgczEKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBsaXN0My5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0MS5jb250YWluc0FsbChsaXN0MykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JfT2JqZWN0TW9kaWZpZWQoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBsaXN0MSA9IHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QxLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RVbm1vZGlmaWVkKCkgewotCQlTZXQ8T2JqZWN0PiBzZXQxID0gdGhpcy5idWlsZE9iamVjdFNldDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgczEKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBsaXN0My5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0MS5jb250YWluc0FsbChsaXN0MykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JfRW1wdHlJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpKSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0MS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JJbnRfTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QxLCBsaXN0Mi5pdGVyYXRvcigpLCAzKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvckludF9Vbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQxID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgczEKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBsaXN0My5pdGVyYXRvcigpLCAzKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0MS5jb250YWluc0FsbChsaXN0MykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmF0b3JJbnRfRW1wdHlJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpLCAwKSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0MS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCBhKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWluc0FsbChDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihhKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nTGlzdEVtcHR5QXJyYXkoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgbmV3IFN0cmluZ1swXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nVW5tb2RpZmllZCgpIHsKLQkJU2V0PFN0cmluZz4gc2V0ID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQsIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHNldC5jb250YWluc0FsbChDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihhKSkpOwotCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0LCBuZXcgU3RyaW5nWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdTZXRFbXB0eUFycmF5KCkgewotCQlTZXQ8U3RyaW5nPiBzZXQgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldCwgbmV3IFN0cmluZ1swXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfT2JqZWN0TW9kaWZpZWQoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBsaXN0ID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9PYmplY3RVbm1vZGlmaWVkKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTZXQ8T2JqZWN0PiBzZXQgPSB0aGlzLmJ1aWxkT2JqZWN0U2V0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldCwgYSkpOwotCQlhc3NlcnRFcXVhbHMoMywgc2V0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0LmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRPYmplY3RBcnJheSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAiWCIsICJYIiwgIlgiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50T2JqZWN0QXJyYXlfWmVybygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAwLCBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRPYmplY3RBcnJheV9FbXB0eUFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgIlgiLCAiWCIsICJYIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlX1plcm8oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMCwgaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYWJsZV9FbXB0eUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYWJsZUludCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJYIiwgIlgiLCAiWCIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYWJsZUludF9aZXJvKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDAsIGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgIlgiLCAiWCIsICJYIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmFibGVJbnRfRW1wdHlJdGVyYWJsZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBpdGVyYWJsZSwgMCk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSkuaXRlcmF0b3IoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBpdGVyYXRvcik7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJYIiwgIlgiLCAiWCIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYXRvcl9aZXJvKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pLml0ZXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMCwgaXRlcmF0b3IpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYXRvckludCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KS5pdGVyYXRvcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhdG9yLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgIlgiLCAiWCIsICJYIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9ySW50X1plcm8oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSkuaXRlcmF0b3IoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAwLCBpdGVyYXRvciwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9ySW50X0VtcHR5SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmF0b3IsIDApOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIGMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fT2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIGMpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fRW1wdHlDb2xsZWN0aW9uKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAxLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRDb2xsZWN0aW9uX0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMCwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAxLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYWJsZV9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVfRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDAsIGl0ZXJhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVfRW1wdHlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMSwgaXRlcmFibGUpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhYmxlSW50X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMSwgaXRlcmFibGUsIDMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYWJsZUludF9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMCwgaXRlcmFibGUsIDMpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYWJsZUludF9FbXB0eUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAxLCBpdGVyYWJsZSwgMCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmF0b3JfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmF0b3JfRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMCwgaXRlcmF0b3IpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvcl9FbXB0eUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMSwgaXRlcmF0b3IpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhdG9ySW50X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAxLCBpdGVyYXRvciwgMyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhdG9ySW50X0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDAsIGl0ZXJhdG9yLCAzKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmF0b3JJbnRfRW1wdHlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yLCAwKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgaXRlcmFibGUpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYWJsZUludCgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgaXRlcmFibGUsIDMzKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JfT2JqZWN0KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JfRW1wdHlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkT2JqZWN0TGlzdDEoKS5pdGVyYXRvcigpOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgaXRlcmF0b3IsIDMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZE9iamVjdExpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgaXRlcmF0b3IsIDApOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGExID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlPYmplY3RbXSBhMiA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGExID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9PYmplY3RTdHJpbmcoKSB7Ci0JCU9iamVjdFtdIGExID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJT2JqZWN0W10gYTEgPSBuZXcgT2JqZWN0WzBdOwotCQlPYmplY3RbXSBhMiA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0VtcHR5QXJyYXkyKCkgewotCQlPYmplY3RbXSBhMSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJT2JqZWN0W10gYTIgPSBuZXcgT2JqZWN0WzBdOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYTEsIGEyKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGExKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfT2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJYIiwgIlgiLCAiWCIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMiwgbmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgIlgiLCAiWCIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X09iamVjdFN0cmluZygpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAyLCBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiWCIsICJYIiwgIlgiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfRW5kKCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDQsIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiLCAiWCIsICJYIiwgIlgiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9aZXJvKCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFswXTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMCwgbmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCA0LCBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfRW1wdHlBcnJheTEoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAwLCBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmJ1aWxkQ2hhckFycmF5KCksIG5ldyBjaGFyW10geyAnZCcsICdlJyB9KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdlJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlDaGFyQXJyYXlfRW1wdHlBcnJheTIoKSB7Ci0JCWNoYXJbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmJ1aWxkQ2hhckFycmF5KCksIG5ldyBjaGFyWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5Q2hhckFycmF5RW1wdHlBcnJheTEoKSB7Ci0JCWNoYXJbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChuZXcgY2hhclswXSwgbmV3IGNoYXJbXSB7ICdkJywgJ2UnIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAnZCcpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgJ2UnKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUludENoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBjaGFyW10geyAnWCcsICdYJywgJ1gnIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAnWCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ1gnLCAnWCcsICdYJywgJ2MnLCAnZCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlJbnRDaGFyQXJyYXlfRW5kKCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgNCwgbmV3IGNoYXJbXSB7ICdYJywgJ1gnLCAnWCcgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ1gnLCAnWCcsICdYJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUludENoYXJBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMCwgbmV3IGNoYXJbXSB7ICdYJywgJ1gnLCAnWCcgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdYJywgJ1gnLCAnWCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlJbnRDaGFyQXJyYXlfRW1wdHlBcnJheTIoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJyB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAyLCBuZXcgY2hhclswXSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRBcnJheSgpIHsKLQkJaW50W10gYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5idWlsZEludEFycmF5KCksIG5ldyBpbnRbXSB7IDMwLCA0MCB9KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgMzApKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgNDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJaW50W10gYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5idWlsZEludEFycmF5KCksIG5ldyBpbnRbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRBcnJheUludEFycmF5X0VtcHR5QXJyYXkxKCkgewotCQlpbnRbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChuZXcgaW50WzBdLCBuZXcgaW50W10geyAzMCwgNDAgfSk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDQwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbEludEFycmF5SW50SW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBpbnRbXSB7IDk5LCA5OSwgOTkgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCA5OSwgOTksIDk5LCAzLCA0IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRJbnRBcnJheV9FbmQoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDQsIG5ldyBpbnRbXSB7IDk5LCA5OSwgOTkgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCAzLCA0LCA5OSwgOTksIDk5IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRJbnRBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMiwgbmV3IGludFswXSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCAzLCA0IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRJbnRBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbMF07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDAsIG5ldyBpbnRbXSB7IDk5LCA5OSwgOTkgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA5OSwgOTksIDk5IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlPYmplY3RbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFycmF5KGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhYmxlSW50KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCU9iamVjdFtdIGEgPSBDb2xsZWN0aW9uVG9vbHMuYXJyYXkoaXRlcmFibGUsIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmFibGVPYmplY3RBcnJheV9TdHJpbmcoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IENvbGxlY3Rpb25Ub29scy5hcnJheShpdGVyYWJsZSwgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYWJsZU9iamVjdEFycmF5X09iamVjdCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlPYmplY3RbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFycmF5KGl0ZXJhYmxlLCBuZXcgT2JqZWN0WzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhYmxlSW50T2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IENvbGxlY3Rpb25Ub29scy5hcnJheShpdGVyYWJsZSwgMywgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvcigpIHsKLQkJT2JqZWN0W10gYSA9IENvbGxlY3Rpb25Ub29scy5hcnJheSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9yX0VtcHR5KCkgewotCQlPYmplY3RbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFycmF5KEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCU9iamVjdFtdIGEgPSBDb2xsZWN0aW9uVG9vbHMuYXJyYXkodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvckludF9FbXB0eSgpIHsKLQkJT2JqZWN0W10gYSA9IENvbGxlY3Rpb25Ub29scy5hcnJheShFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9yT2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYSA9IENvbGxlY3Rpb25Ub29scy5hcnJheShFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSwgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBDb2xsZWN0aW9uVG9vbHMuYXJyYXkodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgbmV3IE9iamVjdFswXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvckludE9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMsIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JJbnRPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYSA9IENvbGxlY3Rpb25Ub29scy5hcnJheShFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSwgMywgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uX1N0cmluZygpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnRW51bWVyYXRpb25fT2JqZWN0KCkgewotCQlCYWc8T2JqZWN0PiBiID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+YmFnKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uX0VtcHR5KCkgewotCQlCYWc8T2JqZWN0PiBiID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+YmFnKEVtcHR5RW51bWVyYXRpb24uaW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uSW50KCkgewotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdFbnVtZXJhdGlvbkludF9FbXB0eSgpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoRW1wdHlFbnVtZXJhdGlvbi48U3RyaW5nPmluc3RhbmNlKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYi5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyhpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyhpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JfU3RyaW5nT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCUJhZzxPYmplY3Q+IGIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5iYWcoYy5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JJbnQoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JJbnRfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnT2JqZWN0QXJyYXkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGIsIHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdPYmplY3RBcnJheV9WYXJhcmcoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKCJmb28iLCAiYmFyIiwgImJheiIpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChiLCBuZXcgT2JqZWN0W117ImZvbyIsICJiYXIiLCAiYmF6In0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnT2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEJhZy5FbXB0eS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYi5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uRW51bWVyYXRpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkVudW1lcmF0aW9uX09iamVjdFN0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGMgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5jb2xsZWN0aW9uKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25FbnVtZXJhdGlvbkludCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmFibGVJbnQoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmF0b3JfT2JqZWN0U3RyaW5nKCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYyA9IENvbGxlY3Rpb25Ub29scy48T2JqZWN0PmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmF0b3JJbnQoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uT2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ0FycmF5MSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYywgdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zRW51bWVyYXRpb25PYmplY3RfU3RyaW5nKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gdGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModi5lbGVtZW50cygpLCAib25lIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModi5lbGVtZW50cygpLCBudWxsKSk7Ci0JCXYuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh2LmVsZW1lbnRzKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNFbnVtZXJhdGlvbk9iamVjdF9PYmplY3QoKSB7Ci0JCVZlY3RvcjxPYmplY3Q+IGMgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlTdHJpbmcgb25lID0gIm9uZSI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuZWxlbWVudHMoKSwgb25lKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjLmVsZW1lbnRzKCksIG51bGwpKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuZWxlbWVudHMoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0l0ZXJhYmxlT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gYzsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoaXRlcmFibGUsICJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhpdGVyYWJsZSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoaXRlcmFibGUsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJdGVyYXRvck9iamVjdF9TdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zSXRlcmF0b3JPYmplY3RfT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYyA9IG5ldyBIYXNoQmFnPE9iamVjdD4oKTsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlTdHJpbmcgb25lID0gIm9uZSI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgb25lKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjLml0ZXJhdG9yKCksIG51bGwpKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc09iamVjdEFycmF5T2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAib25lIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCQlPYmplY3RbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEyLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdhJykpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgJ3onKSk7Ci0JCWNoYXJbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgJ3onKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYTIsICd6JykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0ludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDEwKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCA1NSkpOwotCQlpbnRbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgNTUpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhMiwgNTUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uSXRlcmF0b3JfT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYzEgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJYzEuYWRkKCJ6ZXJvIik7Ci0JCWMxLmFkZCgib25lIik7Ci0JCWMxLmFkZCgidHdvIik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoInR3byIpOwotCQljMi5hZGQoInplcm8iKTsKLQkJYzIuYWRkKCJvbmUiKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYzEsIGMyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nT2JqZWN0KCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5KCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZUNvbGxlY3Rpb24oKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRDb2xsZWN0aW9uKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCAzLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUxLCAzLCBpdGVyYWJsZTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZUl0ZXJhdG9yKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRJdGVyYXRvcigpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChpdGVyYWJsZSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlT2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSW50T2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIDMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIDMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yQ29sbGVjdGlvbl9TdHJpbmdTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yQ29sbGVjdGlvbl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMS5pdGVyYXRvcigpLCBjMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySW50Q29sbGVjdGlvbigpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgNSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDUsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCBpdGVyYWJsZSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYXRvckludEl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMsIGl0ZXJhYmxlKSk7Ci0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzLCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySXRlcmF0b3JfU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMS5pdGVyYXRvcigpLCBjMi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJbnRJdGVyYXRvcigpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJbnRPYmplY3RBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheUNvbGxlY3Rpb24oKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheUl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgaXRlcmFibGUpKTsKLQkJaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheUl0ZXJhdG9yKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbE9iamVjdEFycmF5SXRlcmF0b3JfRW1wdHkoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkQ2hhckFycmF5KCksIHRoaXMuYnVpbGRDaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZENoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsgJ3gnLCAneScgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEludEFycmF5SW50QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRJbnRBcnJheSgpLCB0aGlzLmJ1aWxkSW50QXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZEludEFycmF5KCksIG5ldyBpbnRbXSB7IDQ0NCwgODg4IH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlmZkVuZCgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBuZXcgU3RyaW5nKCJhIik7Ci0JCVN0cmluZyBiXyA9IG5ldyBTdHJpbmcoImIiKTsKLQkJU3RyaW5nIGNfID0gbmV3IFN0cmluZygiYyIpOwotCQlTdHJpbmcgZF8gPSBuZXcgU3RyaW5nKCJkIik7Ci0JCVN0cmluZyBlXyA9IG5ldyBTdHJpbmcoImUiKTsKLQkJYXNzZXJ0VHJ1ZSgoYSAhPSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiAhPSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCAhPSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSAhPSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBhXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIENvbGxlY3Rpb25Ub29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIG51bGwsIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIENvbGxlY3Rpb25Ub29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpZmZSYW5nZSgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgxLCAtMSksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBhXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgMiksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgMCksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgMyksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMiwgMiksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoNSwgLTEpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpZmZTdGFydCgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBuZXcgU3RyaW5nKCJhIik7Ci0JCVN0cmluZyBiXyA9IG5ldyBTdHJpbmcoImIiKTsKLQkJU3RyaW5nIGNfID0gbmV3IFN0cmluZygiYyIpOwotCQlTdHJpbmcgZF8gPSBuZXcgU3RyaW5nKCJkIik7Ci0JCVN0cmluZyBlXyA9IG5ldyBTdHJpbmcoImUiKTsKLQkJYXNzZXJ0VHJ1ZSgoYSAhPSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiAhPSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCAhPSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSAhPSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIENvbGxlY3Rpb25Ub29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfIH07Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGVfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY19fKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIG51bGwsIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNJdGVyYXRvckl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIxMDAwIik7Ci0JCWxpc3QxLmFkZCgiMjAwMCIpOwotCQlsaXN0MS5hZGQoIjMwMDAiKTsKLQkJbGlzdDEuYWRkKCI0MDAwIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdDEuc2l6ZSgpOyBpKyspIHsKLQkJCWxpc3QyLmFkZChTdHJpbmcudmFsdWVPZigoaSArIDEpICogMTAwMCkpOwotCQl9Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pZGVudGljYWwobGlzdDEubGlzdEl0ZXJhdG9yKCksIGxpc3QyLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVxdWFscyhsaXN0MS5saXN0SXRlcmF0b3IoKSwgbGlzdDIubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGlzdEl0ZXJhdG9ySW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTdHJpbmcgbyA9IENvbGxlY3Rpb25Ub29scy5nZXQobGlzdC5saXN0SXRlcmF0b3IoKSwgMSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbyk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlvID0gQ29sbGVjdGlvblRvb2xzLmdldChsaXN0Lmxpc3RJdGVyYXRvcigpLCBsaXN0LnNpemUoKSAtIDEpOwotCQlhc3NlcnROdWxsKG8pOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNvbGxlY3Rpb25Ub29scy5nZXQobGlzdC5saXN0SXRlcmF0b3IoKSwgbGlzdC5zaXplKCkpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aWNhbE9iamVjdEFycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCU9iamVjdFtdIGExID0gbmV3IE9iamVjdFs0XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJYTFbaV0gPSBTdHJpbmcudmFsdWVPZihpICogMTAwMCk7Ci0JCX0KLQotCQlPYmplY3RbXSBhMiA9IG5ldyBPYmplY3RbYTEubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMi5sZW5ndGg7IGkrKykgewotCQkJYTJbaV0gPSBhMVtpXTsKLQkJfQotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlkZW50aWNhbChhMSwgYTIpKTsKLQkJYTJbMl0gPSAiMjAwMCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pZGVudGljYWwoYTEsIGEyKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpY2FsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9Cb3RoTnVsbCgpIHsKLQkJT2JqZWN0W10gYTEgPSBudWxsOwotCQlPYmplY3RbXSBhMiA9IG51bGw7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlkZW50aWNhbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpY2FsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9PbmVOdWxsKCkgewotCQlPYmplY3RbXSBhMSA9IG51bGw7Ci0JCU9iamVjdFtdIGEyID0gbmV3IE9iamVjdFswXTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmlkZW50aWNhbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpY2FsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9EaWZmZXJlbnRMZW5ndGhzKCkgewotCQlPYmplY3RbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIifTsKLQkJT2JqZWN0W10gYTIgPSBuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIiwgImJheiJ9OwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaWRlbnRpY2FsKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGljYWxMaXN0SXRlcmF0b3JMaXN0SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QxKSB7Ci0JCQlsaXN0Mi5hZGQocyk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaWRlbnRpY2FsKGxpc3QxLmxpc3RJdGVyYXRvcigpLCBsaXN0Mi5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lcXVhbHMobGlzdDEubGlzdEl0ZXJhdG9yKCksIGxpc3QyLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aWNhbExpc3RJdGVyYXRvckxpc3RJdGVyYXRvcl9Ob3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QxKSB7Ci0JCQlsaXN0Mi5hZGQocyk7Ci0JCX0KLQkJbGlzdDIucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaWRlbnRpY2FsKGxpc3QxLmxpc3RJdGVyYXRvcigpLCBsaXN0Mi5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZXF1YWxzKGxpc3QxLmxpc3RJdGVyYXRvcigpLCBsaXN0Mi5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGljYWxMaXN0SXRlcmF0b3JMaXN0SXRlcmF0b3JfRGlmZmVyZW50U2l6ZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QxKSB7Ci0JCQlsaXN0Mi5hZGQocyk7Ci0JCX0KLQkJbGlzdDIucmVtb3ZlKDMpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaWRlbnRpY2FsKGxpc3QxLmxpc3RJdGVyYXRvcigpLCBsaXN0Mi5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZXF1YWxzKGxpc3QxLmxpc3RJdGVyYXRvcigpLCBsaXN0Mi5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZFbmQoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gYTsKLQkJU3RyaW5nIGJfID0gYjsKLQkJU3RyaW5nIGNfID0gYzsKLQkJU3RyaW5nIGRfID0gZDsKLQkJU3RyaW5nIGVfID0gZTsKLQkJYXNzZXJ0VHJ1ZSgoYSA9PSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiA9PSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyA9PSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCA9PSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSA9PSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGFfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZSYW5nZSgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDEsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGFfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCAyKSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDApLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgMyksIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMiwgMiksIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMiwgMiksIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSg1LCAtMSksIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZTdGFydCgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBlXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mTGlzdEl0ZXJhdG9yT2JqZWN0X1N0cmluZygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QubGlzdEl0ZXJhdG9yKCksICJvbmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZMaXN0SXRlcmF0b3JPYmplY3RfTnVsbCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhsaXN0LnNpemUoKSAtIDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QubGlzdEl0ZXJhdG9yKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkxpc3RJdGVyYXRvck9iamVjdF9PYmplY3QoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0KLQkJU3RyaW5nIG9uZSA9ICIxIjsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QubGlzdEl0ZXJhdG9yKCksIG9uZSkpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpIC0gMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5saXN0SXRlcmF0b3IoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihhLCAib25lIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTnVsbCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGEsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkNoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YoYSwgJ2InKSk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGEsICdkJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGEsIDEwKSk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDMwKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YoYSwgMzApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0aW9uSW5kZXhPZkxpc3RDb21wYXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoNiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkUiKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQSIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZMaXN0T2JqZWN0Q29tcGFyYXRvcigpIHsKLQkJQ29tcGFyYXRvcjxTdHJpbmc+IGMgPSBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpOwotCQlMaXN0PFN0cmluZz4gbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIiwgYykpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIiwgYykpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiLCAiQSIgfSk7Ci0JCWFzc2VydEVxdWFscyg1LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiwgIkEiIH0pOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkUiLCBjKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIgfSk7Ci0JCWFzc2VydEVxdWFscyg1LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQSIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJBIiwgIkEiIH0pOwotCQlhc3NlcnRFcXVhbHMoNiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiLCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZPYmplY3RBcnJheUNvbXBhcmFibGUoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJCIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDYsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGEsICJFIikpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkEiKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGEsICJBIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRpb25JbmRleE9mT2JqZWN0QXJyYXlPYmplY3RDb21wYXJhdG9yKCkgewotCQlDb21wYXJhdG9yPFN0cmluZz4gYyA9IG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIsICJBIiB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiLCBjKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGEsICJFIiwgYykpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkEiLCBjKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkEiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDYsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGEsICJBIiwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYWJsZUl0ZXJhdG9yKCkgewotCQlJdGVyYXRvcjxPYmplY3Q+IGVtcHR5SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUl0ZXJhYmxlPE9iamVjdD4gZW1wdHlJdGVyYWJsZSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbXB0eUl0ZXJhdG9yKTsKLQkJCi0JCWFzc2VydEZhbHNlKGVtcHR5SXRlcmFibGUuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWVtcHR5SXRlcmF0b3IgPSBlbXB0eUl0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGl0ZXJhdG9yOiAiICsgZW1wdHlJdGVyYXRvcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24uIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhYmxlT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIHN0cmluZ3MgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHN0cmluZ3MpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyaW5nc1tpKytdLCBzdHJpbmcpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihhKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJdGVyYXRvck9iamVjdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihsaXN0Lmxpc3RJdGVyYXRvcigpLCAib25lIikpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpIC0gMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGxpc3QubGlzdEl0ZXJhdG9yKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJdGVyYXRvck9iamVjdF9FbXB0eSgpIHsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGEsICJvbmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTnVsbCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihhLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YoYSwgJ2InKSk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihhLCAnZCcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGEsIDEwKSk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDMwKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGEsIDMwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlLCAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcl9TdHJpbmdPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PE9iamVjdD4gbGlzdDIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5saXN0KGxpc3QxLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMobGlzdDEsIGxpc3QyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yX0VtcHR5KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmxpc3QoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMyk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvckludF9FbXB0eSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5saXN0KEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNSkuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdE9iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvck9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLmxpc3RJdGVyYXRvcihhKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yT2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMubGlzdEl0ZXJhdG9yKGEsIDEpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhhW2ldLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygnYycsIENvbGxlY3Rpb25Ub29scy5tYXgodGhpcy5idWlsZENoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1heEludEFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoMjAsIENvbGxlY3Rpb25Ub29scy5tYXgodGhpcy5idWlsZEludEFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWluQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoJ2EnLCBDb2xsZWN0aW9uVG9vbHMubWluKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaW5JbnRBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5taW4odGhpcy5idWlsZEludEFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU9iamVjdEFycmF5SW50SW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIgfTsKLQotCQlTdHJpbmdbXSByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgNCwgMik7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjMiLCAiNCIsICIyIiwgIjUiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAwLCA1KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgNCwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjQiLCAiMSIsICIzIiwgIjIiIH0sIHJlc3VsdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlT2JqZWN0QXJyYXlJbnRJbnRJbnQoKSB7Ci0JCVN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiB9OwotCi0JCVN0cmluZ1tdIHJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCA0LCAyLCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIxIiwgIjMiLCAiNCIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgMiwgNCwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjQiLCAiMSIsICIzIiwgIjIiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAyLCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMyIsICIyIiwgIjQiLCAiNSIsICIxIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgMSwgMCwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAxLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMsIDQsIDUgfTsKLQotCQlpbnRbXSByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgNCwgMik7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAwLCAxLCAzLCA0LCAyLCA1IH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAwLCA1KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDEsIDMsIDQsIDIgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgNCwgMSwgMywgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgMiwgMik7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCA0LCAxLCAzLCAyIH0sIHJlc3VsdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSW50QXJyYXlJbnRJbnRJbnQoKSB7Ci0JCWludFtdIGFycmF5ID0gbmV3IGludFtdIHsgMCwgMSwgMiwgMywgNCwgNSB9OwotCi0JCWludFtdIHJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCA0LCAyLCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDAsIDEsIDMsIDQsIDIsIDUgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMSwgMywgNCwgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgMiwgNCwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCA0LCAxLCAzLCAyIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAyLCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDMsIDIsIDQsIDEgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMCwgMywgMiwgNCwgNSwgMSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShhcnJheSwgMSwgMCwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA1LCAwLCAzLCAyLCA0LCAxIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAxLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDUsIDAsIDMsIDIsIDQsIDEgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMywgMiwgNCwgMSB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUNoYXJBcnJheUludEludCgpIHsKLQkJY2hhcltdIGFycmF5ID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKLQotCQljaGFyW10gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnZCcsICdlJywgJ2MnLCAnZicgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDAsIDUpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdmJywgJ2EnLCAnYicsICdkJywgJ2UnLCAnYycgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdmJywgJ2EnLCAnZScsICdiJywgJ2QnLCAnYycgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUoYXJyYXksIDIsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdmJywgJ2EnLCAnZScsICdiJywgJ2QnLCAnYycgfSwgcmVzdWx0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVDaGFyQXJyYXlJbnRJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhcnJheSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2InLCAnYycsICdkJywgJ2UnIH07Ci0KLQkJY2hhcltdIHJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCA0LCAyLCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcsICdiJywgJ2UnIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAwLCA1LCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2InLCAnYycsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2QnLCAnYicsICdjJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAyLCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2MnLCAnYicsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAwLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdjJywgJ2InLCAnZCcsICdlJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2MnLCAnYicsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAxLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2MnLCAnYicsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGFycmF5LCAxLCAwLCAwKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2MnLCAnYicsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTGlzdEludEludFJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCBuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pOwotCi0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIsICI1IiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMCwgNSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDIsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjQiLCAiMSIsICIzIiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCAyKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVMaXN0SW50SW50U2VxdWVudGlhbEFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgbmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiB9KTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiNCIsICIxIiwgIjMiLCAiMiIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTGlzdEludEludEludFJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pKTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUxpc3RJbnRJbnRJbnRTZXF1ZW50aWFsQWNjZXNzKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pKTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfTsKLQkJU3RyaW5nW10gYTMgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGExLCBhMik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJU3RyaW5nW10gYTIgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYTEsIGEyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X05vTWF0Y2hlcygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1tdIHsgIlgiLCAiWSIsICJaIiB9OwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYTEsIGEyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8Pz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYTEsIGl0ZXJhYmxlKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJGIiwgIkYiIH0sIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5SXRlcmFibGVJbnQoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYWJsZTw/PiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChhMSwgaXRlcmFibGUsIDcpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkYiLCAiRiIgfSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhYmxlPD8+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGExLCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJGIiwgIkYiIH0sIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYWJsZTw/PiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChhMSwgaXRlcmFibGUuaXRlcmF0b3IoKSwgNyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYTEsIGNvbGxlY3Rpb24pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9Ob01hdGNoZXMoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWSIsICJaIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGExLCBjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnQScsICdBJywgJ0InLCAnQicsICdDJywgJ0MnLCAnRCcsICdEJywgJ0UnLCAnRScsICdGJywgJ0YnIH07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyW10geyAnRScsICdCJyB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdBJywgJ0EnLCAnQycsICdDJywgJ0QnLCAnRCcsICdGJywgJ0YnIH0sIENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDaGFyQXJyYXlDaGFyQXJyYXlfRW1wdHkoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnQScsICdBJywgJ0InLCAnQicsICdDJywgJ0MnLCAnRCcsICdEJywgJ0UnLCAnRScsICdGJywgJ0YnIH07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyWzBdOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDaGFyQXJyYXlDaGFyQXJyYXlfTm9NYXRjaGVzKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQScsICdCJywgJ0InLCAnQycsICdDJywgJ0QnLCAnRCcsICdFJywgJ0UnLCAnRicsICdGJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ1gnLCAnWicgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsSW50QXJyYXlJbnRBcnJheSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2IH07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMSwgMywgMywgNCwgNCwgNiwgNiB9LCBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2IH07Ci0JCWludFtdIGEyID0gbmV3IGludFswXTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsSW50QXJyYXlJbnRBcnJheV9Ob01hdGNoZXMoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiB9OwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbXSB7IDUyLCA2NyB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVPYmplY3RBcnJheU9iamVjdF9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsICJ0aHJlZSIpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAiZm91ciIpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAiZml2ZSIpOwotCi0JCWFzc2VydEVxdWFscyg2LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmUoYSwgInRocmVlIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJmb3VyIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAiZml2ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlT2JqZWN0QXJyYXlPYmplY3RfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAidGhyZWUiKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgImZvdXIiKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgImZpdmUiKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAidGhyZWUiKSk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAnZCcpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAnZScpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAnZicpOwotCi0JCWFzc2VydEVxdWFscyg2LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdkJykpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZShhLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdlJykpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAnZicpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgMzApOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCA0MCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDUwKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAzMCkpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZShhLCAzMCk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAzMCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCA0MCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCA1MCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uSXRlcmFibGUoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhYmxlKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQotCQljID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmFibGUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uSXRlcmFibGVJbnQoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhYmxlLCAzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQotCQljID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmFibGUsIDMpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uSXRlcmF0b3JfRW1wdHkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQotCQljID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25JdGVyYXRvcl9EdXBsaWNhdGVzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiYSIpOwotCQljLmFkZCgiYSIpOwotCQljLmFkZCgiYiIpOwotCQljLmFkZCgiYyIpOwotCQljLmFkZCgiZCIpOwotCQljLmFkZCgiZCIpOwotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiZCIgfTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oYSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYXRvcikpOwotCQlhc3NlcnRFcXVhbHMoMiwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJhIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImIiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYyIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiZCIpKTsKLQotCQlpdGVyYXRvciA9IG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oYSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmF0b3IpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX09iamVjdFN0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmF0b3IpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25JdGVyYXRvdEludCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmF0b3IsIDIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTIoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9EdXBsaWNhdGVzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiYSIpOwotCQljLmFkZCgiYSIpOwotCQljLmFkZCgiYiIpOwotCQljLmFkZCgiYyIpOwotCQljLmFkZCgiZCIpOwotCQljLmFkZCgiZCIpOwotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiZCIgfTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9Nb3JlRHVwbGljYXRlcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImMiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBhKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImEiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYiIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJjIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJkIikpOwotCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0NvbGxlY3Rpb25PYmplY3QoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsICJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAidHdvIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgYy5zaXplKCkpOwotCi0JCWMuYWRkKCJmaXZlIik7Ci0JCWMuYWRkKCJmaXZlIik7Ci0JCWMuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEVxdWFscyg1LCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsICJmaXZlIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgImZpdmUiKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjLnNpemUoKSk7Ci0KLQkJYy5hZGQobnVsbCk7Ci0JCWMuYWRkKG51bGwpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgbnVsbCkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc09iamVjdEFycmF5T2JqZWN0KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJ0d28iKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAidHdvIik7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0KLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgImZpdmUiKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgImZpdmUiKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgImZpdmUiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJmaXZlIik7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0KLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgbnVsbCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIG51bGwpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdiJyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgJ2InKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAnZycpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAnZycpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAnZycpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdnJyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgJ2cnKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDU1KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAxMCk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgMTApOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCi0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDc3KTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgNzcpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCA3Nyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgNzcpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDc3KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudEF0SW5kZXhPYmplY3RBcnJheUludCgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50QXRJbmRleChhLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJBIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudEF0SW5kZXhDaGFyQXJyYXlJbnQoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50QXRJbmRleChhLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQScsICdEJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRBdEluZGV4SW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiwgMTEgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMywgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA4LCA2LCA3IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4TGlzdEludEludCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH0pKTsKLQkJTGlzdDxTdHJpbmc+IHJlbW92ZWQgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGxpc3QsIDMsIDIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkQiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQyIsICJBIiB9LCByZW1vdmVkLnRvQXJyYXkoKSkpOwotCi0JCWxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiIH0pKTsKLQkJcmVtb3ZlZCA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgobGlzdCwgMywgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkMiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiRCIsICJFIiwgIkYiIH0sIHJlbW92ZWQudG9BcnJheSgpKSk7Ci0KLQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIgfSkpOwotCQlyZW1vdmVkID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChsaXN0LCAwLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJEIiwgIkUiLCAiRiIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIgfSwgcmVtb3ZlZC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4T2JqZWN0QXJyYXlJbnRJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDMsIDIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4T2JqZWN0QXJyYXlJbnRJbnRfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDAsIDYpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhDaGFyQXJyYXlJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMCwgNSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4Q2hhckFycmF5SW50SW50X0VtcHR5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDAsIDYpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyLCAxMSB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhLCAzLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDgsIDYsIDcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhJbnRBcnJheUludEludF9FbXB0eSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyLCAxMSB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhLCAwLCA2KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbE9iamVjdEFycmF5T2JqZWN0T2JqZWN0X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZXBsYWNlQWxsKGEsICJBIiwgIloiKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJaIiwgIkIiLCAiWiIsICJDIiwgIloiLCAiRCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsT2JqZWN0QXJyYXlPYmplY3RPYmplY3RfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlcGxhY2VBbGwoYSwgIkEiLCAiWiIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIloiLCAiQiIsICJaIiwgIkMiLCAiWiIsICJEIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VBbGxPYmplY3RBcnJheU9iamVjdE9iamVjdF9OdWxsKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgbnVsbCwgIkIiLCBudWxsLCAiQyIsIG51bGwsICJEIiB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlcGxhY2VBbGwoYSwgbnVsbCwgIloiKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJaIiwgIkIiLCAiWiIsICJDIiwgIloiLCAiRCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsQ2hhckFycmF5Q2hhckNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZXBsYWNlQWxsKGEsICdBJywgJ1onKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnWicsICdCJywgJ1onLCAnQycsICdaJywgJ0QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbEludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMCwgMSwgMCwgNywgMCwgOTkgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZXBsYWNlQWxsKGEsIDAsIDEzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDEzLCAxLCAxMywgNywgMTMsIDk5IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhYmxlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgaXRlcmFibGUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBpdGVyYWJsZSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYWJsZUludCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIGl0ZXJhYmxlKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgaXRlcmFibGUsIDcpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0KLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmF0b3JfT2JqZWN0U3RyaW5nKCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYzEgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJYzEuYWRkKCJ6ZXJvIik7Ci0JCWMxLmFkZCgib25lIik7Ci0JCWMxLmFkZCgidHdvIik7Ci0JCQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCJ6ZXJvIik7Ci0JCWMyLmFkZCgib25lIik7Ci0JCWMyLmFkZCgidHdvIik7Ci0JCQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMxLCBjMi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyhjMi5zaXplKCksIGMxLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhjMiwgYzEpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMy5hZGQoInRocmVlIik7Ci0JCWMzLmFkZCgiZm91ciIpOwotCQljMy5hZGQoImZpdmUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX0VtcHR5SXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX0VtcHR5Q29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvckludCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCA4KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKSwgOSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpLCAwKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvckludF9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMykpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBuZXcgT2JqZWN0WzBdKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgbmV3IFN0cmluZ1tdIHsgImZvbyIgfSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJT2JqZWN0W10gYTIgPSBuZXcgT2JqZWN0W10geyAiRSIsICJCIiwgbmV3IEludGVnZXIoNykgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9FbXB0eU9iamVjdEFycmF5MSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMiA9IG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9OwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGEyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfRW1wdHlPYmplY3RBcnJheTIoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gYTMgPSBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBhMik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0JvdGhFbXB0eSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMiA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEzID0gQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChhMSwgYTIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBpdGVyYWJsZSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYWJsZV9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhYmxlSW50KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJFIiwgIkUiIH0sIENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhYmxlLCAzKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhYmxlSW50X0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmF0b3IoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBpdGVyYXRvcikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvcl9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBpdGVyYXRvciwgMykpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludF9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhdG9yLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5Q29sbGVjdGlvbigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkUiLCAiRSIgfSwgQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChhMSwgY29sbGVjdGlvbikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBhMyA9IENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX0FsbCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiIH0pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGNvbGxlY3Rpb24pKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdBJywgJ0EnLCAnQicsICdCJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRScsICdFJywgJ0YnLCAnRicgfTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0InLCAnQicsICdFJywgJ0UnIH0sIENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDaGFyQXJyYXlDaGFyQXJyYXlfRW1wdHlDaGFyQXJyYXkxKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhclswXTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWFzc2VydFNhbWUoYTEsIENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENoYXJBcnJheUNoYXJBcnJheV9FbXB0eUNoYXJBcnJheTIoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnRScsICdCJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhclswXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGEyKS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDaGFyQXJyYXlDaGFyQXJyYXlfUmV0YWluQWxsKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicsICdFJywgJ0InLCAnRScsICdCJywgJ0UnLCAnQicsICdFJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJYXNzZXJ0U2FtZShhMSwgQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsSW50QXJyYXlJbnRBcnJheSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2IH07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMiwgMiwgNSwgNSB9LCBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUludEFycmF5MSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50WzBdOwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbXSB7IDUsIDIgfTsKLQkJYXNzZXJ0U2FtZShhMSwgQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUludEFycmF5MigpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWludFtdIGEyID0gbmV3IGludFswXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGEyKS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxJbnRBcnJheUludEFycmF5X1JldGFpbkFsbCgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA1LCAyLCA1LCAyLCA1LCAyLCA1LCAyLCA1LCAyLCA1IH07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlhc3NlcnRTYW1lKGExLCBDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlT2JqZWN0QXJyYXlfT2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlT2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlQ2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlKGEpOwotCQlhc3NlcnRFcXVhbHMoJ2MnLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygnYScsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlSW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlKGEpOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGFjdHVhbCA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlTGlzdChpdGVyYWJsZSk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKGV4cGVjdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlTGlzdEl0ZXJhYmxlSW50KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QoaXRlcmFibGUsIDEwKTsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3JfU3RyaW5nKCkgewotCQlMaXN0PFN0cmluZz4gYWN0dWFsID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUxpc3RJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5yZXZlcnNlTGlzdCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJTGlzdDxPYmplY3Q+IGV4cGVjdGVkID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMzMpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGEpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlfWmVybygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5X09uZSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiZm9vICAiIH07Ci0JCVN0cmluZ1tdIGEyID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZShhMSk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGEsIDIpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlJbnRfWmVyb0Rpc3RhbmNlKCkgewotCQlTdHJpbmdbXSBhMSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJU3RyaW5nW10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExLCAwKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheUludF9aZXJvKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEyID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZShhMSwgNyk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlJbnRfT25lKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJmb28gICIgfTsKLQkJU3RyaW5nW10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExLCA4KTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZShhKTsKLQkJYXNzZXJ0RXF1YWxzKCdjJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYScsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2InLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5X1plcm8oKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzBdOwotCQljaGFyW10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXlfT25lKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ2EnIH07Ci0JCWNoYXJbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheUludCgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGEsIDIpOwotCQlhc3NlcnRFcXVhbHMoJ2InLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCdjJywgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygnYScsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXlJbnRfWmVyb0Rpc3RhbmNlKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJyB9OwotCQljaGFyW10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExLCAwKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXlJbnRfWmVybygpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbMF07Ci0JCWNoYXJbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5yb3RhdGUoYTEsIDIwMDEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheUludF9PbmUoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnYScgfTsKLQkJY2hhcltdIGEyID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZShhMSwgMjIpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGEpOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygxMCwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5X1plcm8oKSB7Ci0JCWludFtdIGExID0gbmV3IGludFswXTsKLQkJaW50W10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheV9PbmUoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgNzcgfTsKLQkJaW50W10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZShhLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheUludF9aZXJvRGlzdGFuY2UoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgMywgMiwgMSB9OwotCQlpbnRbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5yb3RhdGUoYTEsIDApOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5SW50X1plcm8oKSB7Ci0JCWludFtdIGExID0gbmV3IGludFswXTsKLQkJaW50W10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExLCAzKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheUludF9PbmUoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgNzcgfTsKLQkJaW50W10gYTIgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGExLCA0NCk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldChpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdTZXQxKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhYmxlLCAyMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTdHJpbmdTZXQxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCVNldDxTdHJpbmc+IHNldDEgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCXNldDEuYWRkKCIwIik7Ci0JCXNldDEuYWRkKCIxIik7Ci0JCXNldDEuYWRkKCIyIik7Ci0JCXNldDEuYWRkKCIzIik7Ci0KLQkJU2V0PE9iamVjdD4gc2V0MiA9IENvbGxlY3Rpb25Ub29scy48T2JqZWN0PnNldChzZXQxLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoc2V0MSwgc2V0Mik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEl0ZXJhdG9ySW50KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLml0ZXJhdG9yKCksIDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTdHJpbmdTZXQxKCkudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYXJyYXkxID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTdHJpbmdbXSBhcnJheTIgPSBDb2xsZWN0aW9uVG9vbHMuc2h1ZmZsZSh0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCkpOwotCQlhc3NlcnRFcXVhbHMoYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhcnJheTEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWNoYXJbXSBhcnJheTIgPSBDb2xsZWN0aW9uVG9vbHMuc2h1ZmZsZSh0aGlzLmJ1aWxkQ2hhckFycmF5KCkpOwotCQlhc3NlcnRFcXVhbHMoYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVJbnRBcnJheSgpIHsKLQkJaW50W10gYXJyYXkxID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWludFtdIGFycmF5MiA9IENvbGxlY3Rpb25Ub29scy5zaHVmZmxlKHRoaXMuYnVpbGRJbnRBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25JdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShzdHJlYW0uaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uSXRlcmF0b3JfT2JqZWN0KCkgewotCQlJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy48T2JqZWN0PnNpbmdsZXRvbkl0ZXJhdG9yKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShzdHJlYW0uaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uSXRlcmF0b3JfQ2FzdCgpIHsKLQkJSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc2luZ2xldG9uSXRlcmF0b3IoKE9iamVjdCkgImZvbyIpOwotCQlhc3NlcnRUcnVlKHN0cmVhbS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0cmVhbS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPE9iamVjdD4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkT2JqZWN0TGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemVJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmFibGUoKSB7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MxLmFkZCgiMCIpOwotCQlzczEuYWRkKCIyIik7Ci0JCXNzMS5hZGQoIjMiKTsKLQkJc3MxLmFkZCgiMSIpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBzczE7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNldDIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0ZWRTZXQoaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoc3MxLCBzZXQyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmFibGVJbnQoKSB7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MxLmFkZCgiMCIpOwotCQlzczEuYWRkKCIyIik7Ci0JCXNzMS5hZGQoIjMiKTsKLQkJc3MxLmFkZCgiMSIpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBzczE7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNldDIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0ZWRTZXQoaXRlcmFibGUsIDUpOwotCQlhc3NlcnRFcXVhbHMoc3MxLCBzZXQyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc29ydGVkU2V0KHRoaXMuYnVpbGRTb3J0ZWRTdHJpbmdTZXQxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYXRvcl9UcmVlU2V0KCkgewotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzczEgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0JCXNzMS5hZGQoIjAiKTsKLQkJc3MxLmFkZCgiMiIpOwotCQlzczEuYWRkKCIzIik7Ci0JCXNzMS5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzZXQyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydGVkU2V0KHNzMS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHNzMSwgc2V0Mik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhdG9ySW50KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCh0aGlzLmJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpLml0ZXJhdG9yKCksIDgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0T2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTb3J0ZWRTdHJpbmdTZXQxKCkudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YkFycmF5T2JqZWN0QXJyYXlJbnRJbnQoKSB7Ci0JCVN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciIsICJiYXoiLCAiam9vIiwgImphciIsICJqYXoifTsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciIsICJiYXoiLCAiam9vIn07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIENvbGxlY3Rpb25Ub29scy5zdWJBcnJheShhcnJheSwgMCwgNCkpKTsKLQotCQlyZXN1bHQgPSBuZXcgU3RyaW5nW10geyJqYXIifTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQ29sbGVjdGlvblRvb2xzLnN1YkFycmF5KGFycmF5LCA0LCAxKSkpOwotCi0JCXJlc3VsdCA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIENvbGxlY3Rpb25Ub29scy5zdWJBcnJheShhcnJheSwgNSwgMCkpKTsKLQotCQlyZXN1bHQgPSBuZXcgU3RyaW5nW10geyJqb28iLCAiamFyIiwgImpheiJ9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBDb2xsZWN0aW9uVG9vbHMuc3ViQXJyYXkoYXJyYXksIDMsIDMpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YkFycmF5SW50QXJyYXlJbnRJbnQoKSB7Ci0JCWludFtdIGFycmF5ID0gbmV3IGludFtdIHs3NywgOTksIDMzMywgNCwgOTA5MCwgNDJ9OwotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W10gezc3LCA5OSwgMzMzLCA0fTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQ29sbGVjdGlvblRvb2xzLnN1YkFycmF5KGFycmF5LCAwLCA0KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBpbnRbXSB7OTA5MH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIENvbGxlY3Rpb25Ub29scy5zdWJBcnJheShhcnJheSwgNCwgMSkpKTsKLQotCQlyZXN1bHQgPSBuZXcgaW50WzBdOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBDb2xsZWN0aW9uVG9vbHMuc3ViQXJyYXkoYXJyYXksIDUsIDApKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IGludFtdIHs0LCA5MDkwLCA0Mn07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIENvbGxlY3Rpb25Ub29scy5zdWJBcnJheShhcnJheSwgMywgMykpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViQXJyYXlDaGFyQXJyYXlJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhcnJheSA9IG5ldyBjaGFyW10geydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZid9OwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbXSB7J2EnLCAnYicsICdjJywgJ2QnfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQ29sbGVjdGlvblRvb2xzLnN1YkFycmF5KGFycmF5LCAwLCA0KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBjaGFyW10geydlJ307Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIENvbGxlY3Rpb25Ub29scy5zdWJBcnJheShhcnJheSwgNCwgMSkpKTsKLQotCQlyZXN1bHQgPSBuZXcgY2hhclswXTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQ29sbGVjdGlvblRvb2xzLnN1YkFycmF5KGFycmF5LCA1LCAwKSkpOwotCi0JCXJlc3VsdCA9IG5ldyBjaGFyW10geydkJywgJ2UnLCAnZid9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBDb2xsZWN0aW9uVG9vbHMuc3ViQXJyYXkoYXJyYXksIDMsIDMpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5zd2FwKGEsIDEsIDIpOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcENoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuc3dhcChhLCAxLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2InLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcEludEFycmF5KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuc3dhcChhLCAxLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJbGlzdC5hZGQoInR3byIpOwotCQlsaXN0LmFkZCgiemVybyIpOwotCQlsaXN0ID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QpOwotCQlpbnQgaSA9IDA7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoaSwgbGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3RfRW1wdHkoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobGlzdCk7Ci0JCWFzc2VydEVxdWFscygwLCBsaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzTGlzdF9TaW5nbGVFbGVtZW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiemVybyIpOwotCQlsaXN0ID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QpOwotCQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c09iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ0d28iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJU3RyaW5nW10gYXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKSk7Ci0JCWludCBpID0gMDsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgYXJyYXlbaSsrXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYXJyYXlbaSsrXSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYXJyYXlbaSsrXSk7Ci0JCWFzc2VydEVxdWFscyhpLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c09iamVjdEFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzT2JqZWN0QXJyYXlfU2luZ2xlRWxlbWVudCgpIHsKLQkJU3RyaW5nW10gYXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobmV3IFN0cmluZ1tdIHsgImZvbyIgfSk7Ci0JCWFzc2VydEVxdWFscygxLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3RvcihpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3RvcihpdGVyYWJsZSwgOCk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmF0b3JfT2JqZWN0KCkgewotCQlWZWN0b3I8T2JqZWN0PiB2ID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+dmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmF0b3JJbnQoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDcpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gYnVpbGRPYmplY3RBcnJheTEoKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAidHdvIiB9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gYnVpbGRTdHJpbmdBcnJheTEoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAiemVybyIsICJvbmUiLCAidHdvIiB9OwotCX0KLQotCXByaXZhdGUgY2hhcltdIGJ1aWxkQ2hhckFycmF5KCkgewotCQlyZXR1cm4gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycgfTsKLQl9Ci0KLQlwcml2YXRlIGludFtdIGJ1aWxkSW50QXJyYXkoKSB7Ci0JCXJldHVybiBuZXcgaW50W10geyAwLCAxMCwgMjAgfTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkyKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInRocmVlIiwgImZvdXIiLCAiZml2ZSIgfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkU3RyaW5nQXJyYXkyKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgInRocmVlIiwgImZvdXIiLCAiZml2ZSIgfTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkU3RyaW5nVmVjdG9yMSgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEodik7Ci0JCXJldHVybiB2OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMShsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PE9iamVjdD4gYnVpbGRPYmplY3RMaXN0MSgpIHsKLQkJTGlzdDxPYmplY3Q+IGwgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db2xsZWN0aW9uMShDb2xsZWN0aW9uPD8gc3VwZXIgU3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJ6ZXJvIik7Ci0JCWMuYWRkKCJvbmUiKTsKLQkJYy5hZGQoInR3byIpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMihsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRvQ29sbGVjdGlvbjIoQ29sbGVjdGlvbjw/IHN1cGVyIFN0cmluZz4gYykgewotCQljLmFkZCgidGhyZWUiKTsKLQkJYy5hZGQoImZvdXIiKTsKLQkJYy5hZGQoImZpdmUiKTsKLQl9Ci0KLQlwcml2YXRlIFNldDxTdHJpbmc+IGJ1aWxkU3RyaW5nU2V0MSgpIHsKLQkJU2V0PFN0cmluZz4gcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIFNldDxPYmplY3Q+IGJ1aWxkT2JqZWN0U2V0MSgpIHsKLQkJU2V0PE9iamVjdD4gcyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIFNvcnRlZFNldDxTdHJpbmc+IGJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpIHsKLQkJU29ydGVkU2V0PFN0cmluZz4gcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ291bnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvdW50ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDMxNDljLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ291bnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ291bnRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIENvdW50ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDb3VudGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN0b3JzKCkgewotCQlDb3VudGVyIGNvdW50ZXI7Ci0JCWNvdW50ZXIgPSBuZXcgQ291bnRlcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgY291bnRlci5jb3VudCgpKTsKLQkJY291bnRlciA9IG5ldyBDb3VudGVyKDcpOwotCQlhc3NlcnRFcXVhbHMoNywgY291bnRlci5jb3VudCgpKTsKLQkJY291bnRlciA9IG5ldyBDb3VudGVyKC03KTsKLQkJYXNzZXJ0RXF1YWxzKC03LCBjb3VudGVyLmNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmNyZW1lbnQoKSB7Ci0JCUNvdW50ZXIgY291bnRlcjsKLQkJaW50IGNvdW50OwotCQljb3VudGVyID0gbmV3IENvdW50ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvdW50ZXIuY291bnQoKSk7Ci0KLQkJY291bnQgPSBjb3VudGVyLmluY3JlbWVudCgzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGNvdW50ZXIuY291bnQoKSk7Ci0KLQkJY291bnQgPSBjb3VudGVyLmluY3JlbWVudCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgY291bnQpOwotCQlhc3NlcnRFcXVhbHMoNCwgY291bnRlci5jb3VudCgpKTsKLQotCQljb3VudCA9IGNvdW50ZXIuaW5jcmVtZW50KC03KTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBjb3VudCk7Ci0JCWFzc2VydEVxdWFscygtMywgY291bnRlci5jb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVjcmVtZW50KCkgewotCQlDb3VudGVyIGNvdW50ZXI7Ci0JCWludCBjb3VudDsKLQkJY291bnRlciA9IG5ldyBDb3VudGVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCBjb3VudGVyLmNvdW50KCkpOwotCi0JCWNvdW50ID0gY291bnRlci5kZWNyZW1lbnQoMyk7Ci0JCWFzc2VydEVxdWFscygtMywgY291bnQpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGNvdW50ZXIuY291bnQoKSk7Ci0KLQkJY291bnQgPSBjb3VudGVyLmRlY3JlbWVudCgpOwotCQlhc3NlcnRFcXVhbHMoLTQsIGNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKC00LCBjb3VudGVyLmNvdW50KCkpOwotCi0JCWNvdW50ID0gY291bnRlci5kZWNyZW1lbnQoLTcpOwotCQlhc3NlcnRFcXVhbHMoMywgY291bnQpOwotCQlhc3NlcnRFcXVhbHMoMywgY291bnRlci5jb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCUNvdW50ZXIgY291bnRlciA9IG5ldyBDb3VudGVyKDQ0KTsKLQkJQ291bnRlciBjb3VudGVyMiA9IChDb3VudGVyKSBjb3VudGVyLmNsb25lKCk7Ci0JCWFzc2VydEVxdWFscyg0NCwgY291bnRlcjIuY291bnQoKSk7Ci0JCWFzc2VydEVxdWFscyhjb3VudGVyLCBjb3VudGVyMik7Ci0JCWFzc2VydE5vdFNhbWUoY291bnRlciwgY291bnRlcjIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCUNvdW50ZXIgY291bnRlciA9IG5ldyBDb3VudGVyKDQ0KTsKLQkJQ291bnRlciBjb3VudGVyMiA9IG5ldyBDb3VudGVyKDQ0KTsKLQkJYXNzZXJ0RXF1YWxzKGNvdW50ZXIsIGNvdW50ZXIyKTsKLQkJYXNzZXJ0RXF1YWxzKGNvdW50ZXIuaGFzaENvZGUoKSwgY291bnRlcjIuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ291bnRlciBjb3VudGVyID0gbmV3IENvdW50ZXIoNDQpOwotCQlDb3VudGVyIGNvdW50ZXIyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShjb3VudGVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQ0LCBjb3VudGVyMi5jb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvdW50ZXIsIGNvdW50ZXIyKTsKLQkJYXNzZXJ0Tm90U2FtZShjb3VudGVyLCBjb3VudGVyMik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0VtcHR5SXRlcmFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9FbXB0eUl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU2OTIwNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0VtcHR5SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkVtcHR5SXRlcmFibGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBFbXB0eUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW1wdHlJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSkgewotCQkJZmFpbCgiYm9ndXMgc3RyaW5nOiAiICsgc3RyaW5nKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0ZpbGVUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0ZpbGVUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkY2NjZjAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9GaWxlVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkZpbGVUb29sczsKLQotcHVibGljIGNsYXNzIEZpbGVUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgRmlsZSB0ZW1wRGlyOwotCi0JcHVibGljIEZpbGVUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudGVtcERpciA9IHRoaXMuYnVpbGRUZW1wRGlyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJdGhpcy5kZWxldGVEaXIodGhpcy50ZW1wRGlyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZXNJbigpIHsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWxlcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKEZpbGVUb29scy5maWxlc0luKHRoaXMudGVtcERpci5nZXRQYXRoKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGZpbGUgY291bnQiLCAzLCBmaWxlcy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJlY3Rvcmllc0luKCkgewotCQlDb2xsZWN0aW9uPEZpbGU+IGZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW4odGhpcy50ZW1wRGlyLmdldFBhdGgoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgZGlyZWN0b3J5IGNvdW50IiwgMiwgZmlsZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZXNJblRyZWUoKSB7Ci0JCUNvbGxlY3Rpb248RmlsZT4gZmlsZXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihGaWxlVG9vbHMuZmlsZXNJblRyZWUodGhpcy50ZW1wRGlyLmdldFBhdGgoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgZmlsZSBjb3VudCIsIDksIGZpbGVzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcmVjdG9yaWVzSW5UcmVlKCkgewotCQlDb2xsZWN0aW9uPEZpbGU+IGZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW5UcmVlKHRoaXMudGVtcERpci5nZXRQYXRoKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGRpcmVjdG9yeSBjb3VudCIsIDMsIGZpbGVzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZURpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGJ1aWxkIGFub3RoZXIgdGVtcG9yYXJ5IGRpcmVjdG9yeSBqdXN0IGZvciB0aGlzIHRlc3QKLQkJRmlsZSBkaXIgPSB0aGlzLmJ1aWxkVGVtcERpcigpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IG5vdCBjcmVhdGVkIiwgZGlyLmV4aXN0cygpKTsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeShkaXIuZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RmFsc2UoInRlbXBvcmFyeSBkaXJlY3Rvcnkgbm90IGRlbGV0ZWQiLCBkaXIuZXhpc3RzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVEaXJlY3RvcnlDb250ZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGJ1aWxkIGFub3RoZXIgdGVtcG9yYXJ5IGRpcmVjdG9yeSBqdXN0IGZvciB0aGlzIHRlc3QKLQkJRmlsZSBkaXIgPSB0aGlzLmJ1aWxkVGVtcERpcigpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IG5vdCBjcmVhdGVkIiwgZGlyLmV4aXN0cygpKTsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpci5nZXRQYXRoKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IHNob3VsZCBub3QgaGF2ZSBiZWVuIGRlbGV0ZWQiLCBkaXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGNvbnRlbnRzIG5vdCBkZWxldGVkIiwgZGlyLmxpc3RGaWxlcygpLmxlbmd0aCA9PSAwKTsKLQkJZGlyLmRlbGV0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9GaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgImRlc3RmaWxlLnR4dCIpOwotCQl0aGlzLmNvcHlUb0ZpbGUoZGVzdEZpbGUsICJ0ZXN0Q29weVRvRmlsZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9QcmVFeGlzdGluZ0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAiZGVzdGZpbGUudHh0Iik7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKSk7Ci0JCXdyaXRlci53cml0ZSgidGhpcyB0ZXh0IHNob3VsZCBiZSByZXBsYWNlZC4uLiIpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQkJdGhpcy5jb3B5VG9GaWxlKGRlc3RGaWxlLCAidGVzdENvcHlUb1ByZUV4aXN0aW5nRmlsZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5VG9GaWxlKEZpbGUgZGVzdEZpbGUsIFN0cmluZyB3cml0ZVN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAic291cmNlZmlsZS50eHQiKTsKLQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclt3cml0ZVN0cmluZy5sZW5ndGgoKV07Ci0KLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oc291cmNlRmlsZSkpOwotCQl3cml0ZXIud3JpdGUod3JpdGVTdHJpbmcpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQotCQlGaWxlVG9vbHMuY29weVRvRmlsZShzb3VyY2VGaWxlLCBkZXN0RmlsZSk7Ci0KLQkJUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGRlc3RGaWxlKSk7Ci0JCXJlYWRlci5yZWFkKHJlYWRCdWZmZXIpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJU3RyaW5nIHJlYWRTdHJpbmcgPSBuZXcgU3RyaW5nKHJlYWRCdWZmZXIpOwotCQlhc3NlcnRFcXVhbHMod3JpdGVTdHJpbmcsIHJlYWRTdHJpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9EaXJlY3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZSh0aGlzLnRlbXBEaXIsICJzb3VyY2VmaWxlLnR4dCIpOwotCQlTdHJpbmcgd3JpdGVTdHJpbmcgPSAidGVzdENvcHlUb0RpcmVjdG9yeSI7Ci0KLQkJRmlsZSBkZXN0RGlyID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAiZGVzdGRpciIpOwotCQlkZXN0RGlyLm1rZGlyKCk7Ci0JCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCAic291cmNlZmlsZS50eHQiKTsKLQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclt3cml0ZVN0cmluZy5sZW5ndGgoKV07Ci0KLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oc291cmNlRmlsZSkpOwotCQl3cml0ZXIud3JpdGUod3JpdGVTdHJpbmcpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQotCQlGaWxlVG9vbHMuY29weVRvRGlyZWN0b3J5KHNvdXJjZUZpbGUsIGRlc3REaXIpOwotCi0JCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShkZXN0RmlsZSkpOwotCQlyZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCVN0cmluZyByZWFkU3RyaW5nID0gbmV3IFN0cmluZyhyZWFkQnVmZmVyKTsKLQkJYXNzZXJ0RXF1YWxzKHdyaXRlU3RyaW5nLCByZWFkU3RyaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHByZWZpeCA9ICJYWFh0ZXN0RmlsZVhYWCI7Ci0JCUZpbGUgdGVzdEZpbGUxID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCBwcmVmaXggKyAiMSIpOwotCQl0ZXN0RmlsZTEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIHRlc3RGaWxlMiA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgcHJlZml4ICsgIjIiKTsKLQkJdGVzdEZpbGUyLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlGaWxlRmlsdGVyIGZpbHRlciA9IHRoaXMuYnVpbGRGaWxlRmlsdGVyKHByZWZpeCk7Ci0JCUl0ZXJhdG9yPEZpbGU+IGZpbHRlcmVkRmlsZXNJdGVyYXRvciA9IEZpbGVUb29scy5maWx0ZXIoRmlsZVRvb2xzLmZpbGVzSW4odGhpcy50ZW1wRGlyKSwgZmlsdGVyKTsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWx0ZXJlZEZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oZmlsdGVyZWRGaWxlc0l0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZpbHRlcmVkRmlsZXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZEZpbGVzLmNvbnRhaW5zKHRlc3RGaWxlMSkpOwotCQlhc3NlcnRUcnVlKGZpbHRlcmVkRmlsZXMuY29udGFpbnModGVzdEZpbGUyKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlRmlsdGVyIGJ1aWxkRmlsZUZpbHRlcihmaW5hbCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLQkJCQlyZXR1cm4gZmlsZS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpcEV4dGVuc2lvbigpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBGaWxlVG9vbHMuc3RyaXBFeHRlbnNpb24oImZvby54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vLmJhciIsIEZpbGVUb29scy5zdHJpcEV4dGVuc2lvbigiZm9vLmJhci54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKCJmb28uIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb24oKSB7Ci0JCWFzc2VydEVxdWFscygiLnhtbCIsIEZpbGVUb29scy5leHRlbnNpb24oImZvby54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiLnhtbCIsIEZpbGVUb29scy5leHRlbnNpb24oImZvby5iYXIueG1sIikpOwotCQlhc3NlcnRFcXVhbHMoIiIsIEZpbGVUb29scy5leHRlbnNpb24oImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28seG1sIikpOwotCQlhc3NlcnRFcXVhbHMoIi4iLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28uIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVRlbXBvcmFyeURpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgdGVtcERpcjEgPSBGaWxlVG9vbHMudGVtcG9yYXJ5RGlyZWN0b3J5KCk7Ci0JCUZpbGUgdGVzdEZpbGUxID0gbmV3IEZpbGUodGVtcERpcjEsICJqdW5rIik7Ci0JCXRlc3RGaWxlMS5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZSB0ZW1wRGlyMiA9IEZpbGVUb29scy5lbXB0eVRlbXBvcmFyeURpcmVjdG9yeSgpOwotCQlhc3NlcnRFcXVhbHModGVtcERpcjEsIHRlbXBEaXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wRGlyMi5pc0RpcmVjdG9yeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRlbXBEaXIyLmxpc3RGaWxlcygpLmxlbmd0aCk7Ci0JCXRlbXBEaXIyLmRlbGV0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5vbmljYWxGaWxlTmFtZSgpIHsKLQkJRmlsZSBmaWxlMSA9IG5ldyBGaWxlKCJmb28iKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgImJhciIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiYmF6Iik7Ci0JCWZpbGUxID0gbmV3IEZpbGUoZmlsZTEsICIuLiIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiLi4iKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgImJhciIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiYmF6Iik7Ci0JCUZpbGUgZmlsZTIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwotCQlmaWxlMiA9IG5ldyBGaWxlKGZpbGUyLCAiZm9vIik7Ci0JCWZpbGUyID0gbmV3IEZpbGUoZmlsZTIsICJiYXIiKTsKLQkJZmlsZTIgPSBuZXcgRmlsZShmaWxlMiwgImJheiIpOwotCQlGaWxlIGZpbGUzID0gRmlsZVRvb2xzLmNhbm9uaWNhbEZpbGUoZmlsZTEpOwotCQlhc3NlcnRFcXVhbHMoZmlsZTIsIGZpbGUzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPbldpbmRvd3MoKSB7Ci0JCXJldHVybiB0aGlzLmlzRXhlY3V0aW5nT24oIldpbmRvd3MiKTsKLQl9Ci0KLQkvLwlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPbkxpbnV4KCkgewotCS8vCQlyZXR1cm4gdGhpcy5pc0V4ZWN1dGluZ09uKCJMaW51eCIpOwotCS8vCX0KLQkvLwotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uKFN0cmluZyBvc05hbWUpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmluZGV4T2Yob3NOYW1lKSAhPSAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGF0aEZpbGVzKCkgewotCQlGaWxlW10gZXhwZWN0ZWQ7Ci0JCUZpbGVbXSBhY3R1YWw7Ci0KLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPbldpbmRvd3MoKSkgewotCQkJZXhwZWN0ZWQgPSBuZXcgRmlsZVtdIHsgbmV3IEZpbGUoIkM6LyIpLCBuZXcgRmlsZSgiQzovZm9vIiksIG5ldyBGaWxlKCJDOi9mb28vYmFyIiksIG5ldyBGaWxlKCJDOi9mb28vYmFyL2Jhei50eHQiKSB9OwotCQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoIkM6L2Zvby9iYXIvYmF6LnR4dCIpKTsKLQkJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JCX0KLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiLyIpLCBuZXcgRmlsZSgiL2ZvbyIpLCBuZXcgRmlsZSgiL2Zvby9iYXIiKSwgbmV3IEZpbGUoIi9mb28vYmFyL2Jhei50eHQiKSB9OwotCQlhY3R1YWwgPSB0aGlzLnBhdGhGaWxlcyhuZXcgRmlsZSgiL2Zvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiZm9vIiksIG5ldyBGaWxlKCJmb28vYmFyIiksIG5ldyBGaWxlKCJmb28vYmFyL2Jhei50eHQiKSB9OwotCQlhY3R1YWwgPSB0aGlzLnBhdGhGaWxlcyhuZXcgRmlsZSgiZm9vL2Jhci9iYXoudHh0IikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCi0JCWV4cGVjdGVkID0gbmV3IEZpbGVbXSB7IG5ldyBGaWxlKCIuLiIpLCBuZXcgRmlsZSgiLi4vZm9vIiksIG5ldyBGaWxlKCIuLi9mb28vYmFyIiksIG5ldyBGaWxlKCIuLi9mb28vYmFyL2Jhei50eHQiKSB9OwotCQlhY3R1YWwgPSB0aGlzLnBhdGhGaWxlcyhuZXcgRmlsZSgiLi4vZm9vL2Jhci9iYXoudHh0IikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCi0JCWV4cGVjdGVkID0gbmV3IEZpbGVbXSB7IG5ldyBGaWxlKCIuIiksIG5ldyBGaWxlKCIuL2ZvbyIpLCBuZXcgRmlsZSgiLi9mb28vYmFyIiksIG5ldyBGaWxlKCIuL2Zvby9iYXIvYmF6LnR4dCIpIH07Ci0JCWFjdHVhbCA9IHRoaXMucGF0aEZpbGVzKG5ldyBGaWxlKCIuL2Zvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGVbXSBwYXRoRmlsZXMoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiAoRmlsZVtdKSBDbGFzc1Rvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoRmlsZVRvb2xzLmNsYXNzLCAicGF0aEZpbGVzIiwgRmlsZS5jbGFzcywgZmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbGF0aXZlUGFyZW50RmlsZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLiIpLCB0aGlzLnJlbGF0aXZlUGFyZW50RmlsZSgxKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vLi4iKSwgdGhpcy5yZWxhdGl2ZVBhcmVudEZpbGUoMikpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uLy4uIiksIHRoaXMucmVsYXRpdmVQYXJlbnRGaWxlKDMpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSB0aGlzLnJlbGF0aXZlUGFyZW50RmlsZSgwKTsKLQkJCWZhaWwoImludmFsaWQgcmV0dXJuOiAiICsgZmlsZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJCUludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlID0gKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGV4LmdldENhdXNlKCk7Ci0JCQkJaWYgKGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgRmlsZSByZWxhdGl2ZVBhcmVudEZpbGUoaW50IGxlbikgewotCQlyZXR1cm4gKEZpbGUpIENsYXNzVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChGaWxlVG9vbHMuY2xhc3MsICJyZWxhdGl2ZVBhcmVudEZpbGUiLCBpbnQuY2xhc3MsIG5ldyBJbnRlZ2VyKGxlbikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9SZWxhdGl2ZUZpbGUoKSB7Ci0JCVN0cmluZyBwcmVmaXggPSB0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCkgPyAiQzoiIDogIiI7Ci0JCUZpbGUgZmlsZTsKLQkJRmlsZSBkaXI7Ci0JCUZpbGUgcmVsYXRpdmVGaWxlOwotCi0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCkpIHsKLQkJCS8vIG9uIFdpbmRvd3MsIGEgZHJpdmUgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGEgZmlsZSB0byBiZSBhYnNvbHV0ZSAoaS5lLiBub3QgcmVsYXRpdmUpCi0JCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiL2RpcjEvZGlyMi9maWxlLnR4dCIsICJDOi9kaXIxL2RpcjIiKTsKLQkJCS8vIGRpZmZlcmVudCBkcml2ZXMKLQkJCXRoaXMudmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKCJEOi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCX0KLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRSZWxhdGl2ZUZpbGUoImRpcjEvZGlyMi9maWxlLnR4dCIsIHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKCIuL2RpcjEvZGlyMi9maWxlLnR4dCIsIHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKCIuLi8uLi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLiIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvLi4vZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImRpcjMvZGlyNC9kaXI1L2ZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1Iik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLi8uLi8uLi9maWxlLnR4dCIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzIik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLi9maWxlLnR4dCIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXJBL2RpckIvZGlyQy9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vLi4vLi4vZGlyQS9kaXJCL2RpckMvZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uLy4uIiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvTXkgRG9jdW1lbnRzL015IFdvcmtzcGFjZS9Qcm9qZWN0IDEvbGliL3RvcGxpbmsuamFyIik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvTXkgRG9jdW1lbnRzL015IFdvcmtzcGFjZS9Qcm9qZWN0IDEiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImxpYi90b3BsaW5rLmphciIpLCByZWxhdGl2ZUZpbGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNoYW5nZWRSZWxhdGl2ZUZpbGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZGlyTmFtZSkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCUZpbGUgcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMoZmlsZSwgcmVsYXRpdmVGaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQWJzb2x1dGVGaWxlKCkgewotCQlTdHJpbmcgcHJlZml4ID0gdGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpID8gIkM6IiA6ICIiOwotCQlGaWxlIGZpbGU7Ci0JCUZpbGUgZGlyOwotCQlGaWxlIGFic29sdXRlRmlsZTsKLQotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpKSB7Ci0JCQkvLyBvbiBXaW5kb3dzLCBhIGRyaXZlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIGZpbGUgdG8gYmUgYWJzb2x1dGUgKGkuZS4gbm90IHJlbGF0aXZlKQotCQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUoIkM6L2RpcjEvZGlyMi9maWxlLnR4dCIsICJDOi9kaXIxL2RpcjIiKTsKLQkJCS8vIGRpZmZlcmVudCBkcml2ZXMKLQkJCXRoaXMudmVyaWZ5VW5jaGFuZ2VkQWJzb2x1dGVGaWxlKCJEOi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCX0KLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZEFic29sdXRlRmlsZShwcmVmaXggKyAiLy4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvLi4vLi4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4iKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4vZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoImZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi9kaXIyL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCJkaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vLi4vLi4vZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQkvLyB0b28gbWFueSAiLi4iIGRpcmVjdG9yaWVzIHdpbGwgcmVzb2x2ZSB0byB0aGUgcm9vdDsKLQkJLy8gdGhpcyBpcyBjb25zaXN0ZW50IHdpdGggV2luZG93cyBhbmQgTGludXggY29tbWFuZCBzaGVsbHMKLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi8uLi8uLi9kaXJBL2RpckIvZGlyQy9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXJBL2RpckIvZGlyQy9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vLi4vLi4iKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoImxpYi90b3BsaW5rLmphciIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvTXkgRG9jdW1lbnRzL015IFdvcmtzcGFjZS9Qcm9qZWN0IDEvbGliL3RvcGxpbmsuamFyIiksIGFic29sdXRlRmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVOYW1lSXNSZXNlcnZlZCgpIHsKLQkJYm9vbGVhbiBleHBlY3RlZCA9IHRoaXMuaXNFeGVjdXRpbmdPbldpbmRvd3MoKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJDT04iKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiY29uIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoImNPTiIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJBVVgiKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiQ09NMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJMUFQzIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoIm5VTCIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJQcm4iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMoKSB7Ci0JCWJvb2xlYW4gZXhwZWN0ZWQgPSB0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoIkM6L0NPTiIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoIi9jb24vZm9vIikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiYzovdGVtcC9jT04iKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJiYXIvL2Jhei8vQVVYIikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiQ09NMy8vdHR0IikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiZDovTFBUMy94eHgiKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJjOi9teSBkb2NzIGFuZCBzdHVmZi90dWVzZGF5L25VTCIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoIlBybiIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNob3J0ZW5GaWxlTmFtZUZpbGUoKSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZVdpbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlTm9uV2luKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZVdpbigpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFxBZG1pbmlzdHJhdG9yXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFwuLi5cXERlc2t0b3BcXFByb2plY3RcXFRleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIkM6LyIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscygiQzpcXCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVOb25XaW4oKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCIvaG9tZS9hZG1pbmlzdHJhdG9yL2RvY3VtZW50cyBhbmQgc2V0dGluZ3MvZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUvYWRtaW5pc3RyYXRvci8uLi4vZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi9ob21lIik7Ci0JCWZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlKTsKLQkJYXNzZXJ0RXF1YWxzKCIvaG9tZSIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNob3J0ZW5GaWxlTmFtZUZpbGVJbnQoKSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludFdpbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlSW50Tm9uV2luKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludFdpbigpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFxBZG1pbmlzdHJhdG9yXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUsIDMxKTsKLQkJYXNzZXJ0RXF1YWxzKCJDOlxcLi4uXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKDMxLCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCJDOi9UaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0Iik7Ci0JCWZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAxMCk7Ci0JCWFzc2VydEVxdWFscygiQzpcXFRoaXMgaXMgdGhlIGZpbGUgbmFtZS50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygyOCwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlSW50Tm9uV2luKCkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSgiL2hvbWUvYWRtaW5pc3RyYXRvci9kb2N1bWVudHMgYW5kIHNldHRpbmdzL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUsIDMxKTsKLQkJYXNzZXJ0RXF1YWxzKCIvaG9tZS8uLi4vZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMzQsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi9UaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0Iik7Ci0JCWZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAxMCk7Ci0JCWFzc2VydEVxdWFscygiL1RoaXMgaXMgdGhlIGZpbGUgbmFtZS50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygyNiwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydGVuRmlsZU5hbWVVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPbldpbmRvd3MoKSkgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxXaW4oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMTm9uV2luKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMV2luKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsICJDOi9Eb2N1bWVudHMgYW5kIFNldHRpbmdzL0FkbWluaXN0cmF0b3IvRGVza3RvcC9Qcm9qZWN0L1RleHQudHh0Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUodXJsKTsKLQkJYXNzZXJ0RXF1YWxzKCJDOlxcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xcLi4uXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTE5vbldpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiL2hvbWUvYWRtaW5pc3RyYXRvci9kb2N1bWVudHMgYW5kIHNldHRpbmdzL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKHVybCk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUvYWRtaW5pc3RyYXRvci8uLi4vZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnRlbkZpbGVOYW1lVVJMSW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMSW50V2luKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludE5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludFdpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiL0M6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9EZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZSh1cmwsIDMxKTsKLQkJYXNzZXJ0RXF1YWxzKCJDOlxcLi4uXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKDMxLCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludE5vbldpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiL2hvbWUvYWRtaW5pc3RyYXRvci9kb2N1bWVudHMgYW5kIHNldHRpbmdzL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKHVybCwgMzEpOwotCQlhc3NlcnRFcXVhbHMoIi9ob21lLy4uLi9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygzNCwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZGlyTmFtZSkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCUZpbGUgYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMoZmlsZSwgYWJzb2x1dGVGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgYnVpbGRUZW1wRGlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gYnVpbGQgYSBuZXcgZGlyZWN0b3J5IGZvciBlYWNoIHRlc3QsIHRvIHByZXZlbnQgYW55IGNyb3NzLXRlc3QgZWZmZWN0cwotCQlGaWxlIGRpciA9IEZpbGVUb29scy5uZXdUZW1wb3JhcnlEaXJlY3RvcnkoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSArICIuIiArIHRoaXMuZ2V0TmFtZSgpKTsKLQotCQlGaWxlIGZpbGUwYSA9IG5ldyBGaWxlKGRpciwgImZpbGUwYSIpOwotCQlmaWxlMGEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUwYiA9IG5ldyBGaWxlKGRpciwgImZpbGUwYiIpOwotCQlmaWxlMGIuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUwYyA9IG5ldyBGaWxlKGRpciwgImZpbGUwYyIpOwotCQlmaWxlMGMuY3JlYXRlTmV3RmlsZSgpOwotCi0JCUZpbGUgc3ViZGlyMSA9IG5ldyBGaWxlKGRpciwgInN1YmRpcjEiKTsKLQkJc3ViZGlyMS5ta2RpcigpOwotCQlGaWxlIGZpbGUxYSA9IG5ldyBGaWxlKHN1YmRpcjEsICJmaWxlMWEiKTsKLQkJZmlsZTFhLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSBmaWxlMWIgPSBuZXcgRmlsZShzdWJkaXIxLCAiZmlsZTFiIik7Ci0JCWZpbGUxYi5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZSBzdWJkaXIyID0gbmV3IEZpbGUoZGlyLCAic3ViZGlyMiIpOwotCQlzdWJkaXIyLm1rZGlyKCk7Ci0JCUZpbGUgZmlsZTJhID0gbmV3IEZpbGUoc3ViZGlyMiwgImZpbGUyYSIpOwotCQlmaWxlMmEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUyYiA9IG5ldyBGaWxlKHN1YmRpcjIsICJmaWxlMmIiKTsKLQkJZmlsZTJiLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlGaWxlIHN1YmRpcjMgPSBuZXcgRmlsZShzdWJkaXIyLCAic3ViZGlyMyIpOwotCQlzdWJkaXIzLm1rZGlyKCk7Ci0JCUZpbGUgZmlsZTNhID0gbmV3IEZpbGUoc3ViZGlyMywgImZpbGUzYSIpOwotCQlmaWxlM2EuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUzYiA9IG5ldyBGaWxlKHN1YmRpcjMsICJmaWxlM2IiKTsKLQkJZmlsZTNiLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlyZXR1cm4gZGlyOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxldGVEaXIoRmlsZSBkaXIpIHsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeShkaXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9IYXNoQmFnVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSGFzaEJhZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZGY3YjYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9IYXNoQmFnVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBIYXNoQmFnVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBIYXNoQmFnPFN0cmluZz4gYmFnOwotCi0JcHVibGljIEhhc2hCYWdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmJhZyA9IHRoaXMuYnVpbGRCYWcoKTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hCYWc8U3RyaW5nPiBidWlsZEJhZygpIHsKLQkJSGFzaEJhZzxTdHJpbmc+IGIgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCWIuYWRkKG51bGwpOwotCQliLmFkZChuZXcgU3RyaW5nKCJvbmUiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoInR3byIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidHdvIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJ0aHJlZSIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidGhyZWUiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoInRocmVlIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQlyZXR1cm4gYjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChuZXcgU3RyaW5nKCJmb28iKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImZvbyIpKTsKLQkJYy5hZGQobmV3IFN0cmluZygiYmFyIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJiYXIiKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImJhciIpKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN0b3JDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCUJhZzxTdHJpbmc+IGIgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KGMpOwotCQlmb3IgKFN0cmluZyBzIDogYykgewotCQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdG9ySW50RmxvYXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQ7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigtMjAsIDAuNjZmKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigyMCwgLTAuNjZmKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJLy8gdGhlIG90aGVyIGFkZHMgdG9vayBwbGFjZSBpbiBzZXRVcAotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZCgiZml2ZSIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvdXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENvdW50KCkgewotCQkvLyB0aGUgb3RoZXIgYWRkcyB0b29rIHBsYWNlIGluIHNldFVwCi0JCXRoaXMuYmFnLmFkZCgibWludXMzIiwgLTMpOwotCQl0aGlzLmJhZy5hZGQoInplcm8iLCAwKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIiwgNSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoIm1pbnVzMyIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInplcm8iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmJhZy5jb3VudCgib25lIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5iYWcuY291bnQoInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYmFnLmNvdW50KCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuYmFnLmNvdW50KCJmb3VyIikpOwotCQlhc3NlcnRFcXVhbHMoNSwgdGhpcy5iYWcuY291bnQoImZpdmUiKSk7Ci0KLQkJdGhpcy5iYWcuYWRkKCJ0aHJlZSIsIDIpOwotCQlhc3NlcnRFcXVhbHMoNSwgdGhpcy5iYWcuY291bnQoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5hZGRBbGwoYykpOwotCQlmb3IgKFN0cmluZyBzIDogYykgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhzKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgdGhpcy5iYWcuc2l6ZSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJhZy5jbG9uZSgpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnICE9IGJhZzIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmhhc2hDb2RlKCkgPT0gYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvdXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMobmV3IFN0cmluZygiZm91ciIpKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvIiArICJ1ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChudWxsKTsKLQkJYy5hZGQobmV3IFN0cmluZygib25lIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJ0d28iKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoInRocmVlIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q291bnQoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5jb3VudCgiemVybyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuYmFnLmNvdW50KCJvbmUiKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmJhZy5jb3VudCgidHdvIikpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5iYWcuY291bnQoInRocmVlIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5iYWcuY291bnQoImZvdXIiKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5jb3VudCgiZml2ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQliYWcyLmFkZCgiZml2ZSIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5lcXVhbHMoYmFnMikpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmJhZyk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmVxdWFscyhjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcuaGFzaENvZGUoKSwgYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCQl0aGlzLmJhZy5hZGQoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUl0ZXJhdG9yKCkgewotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDExLCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLml0ZXJhdG9yKCk7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNSwgaSk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbChlbGVtZW50LnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSAmJiAhImZvdXIiLmVxdWFscyhuZXh0KSkgewotCQkJbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLS8vVE9ETyAtIHBvb3IgbG9hZCBmYWN0b3IgaXMgc2VlbiBpbiB0aGUgRWNsaXBzZSBidWlsZCBlbnZpcm9ubWVudCBmb3Igc29tZSByZWFzb24KLS8vCXB1YmxpYyB2b2lkIHRlc3RIYXNoaW5nRGlzdHJpYnV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJQmFnPFN0cmluZz4gYmlnQmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotLy8JCQliaWdCYWcuYWRkKCJvYmplY3QiICsgaSk7Ci0vLwkJfQotLy8KLS8vCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IGJpZ0JhZy5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoInRhYmxlIik7Ci0vLwkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLS8vCQlPYmplY3RbXSB0YWJsZSA9IChPYmplY3RbXSkgZmllbGQuZ2V0KGJpZ0JhZyk7Ci0vLwkJaW50IGJ1Y2tldENvdW50ID0gdGFibGUubGVuZ3RoOwotLy8JCWludCBmaWxsZWRCdWNrZXRDb3VudCA9IDA7Ci0vLwkJZm9yIChPYmplY3QgbyA6IHRhYmxlKSB7Ci0vLwkJCWlmIChvICE9IG51bGwpIHsKLS8vCQkJCWZpbGxlZEJ1Y2tldENvdW50Kys7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJZmxvYXQgbG9hZEZhY3RvciA9ICgoZmxvYXQpIGZpbGxlZEJ1Y2tldENvdW50KSAvICgoZmxvYXQpIGJ1Y2tldENvdW50KTsKLS8vCQlhc3NlcnRUcnVlKCJXQVJOSU5HIC0gcG9vciBsb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3IsIGxvYWRGYWN0b3IgPiAwLjIwKTsKLS8vCQlhc3NlcnRUcnVlKCJXQVJOSU5HIC0gcG9vciBsb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3IsIGxvYWRGYWN0b3IgPCAwLjc1KTsKLS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgib25lIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgidHdvIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb3VudCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJvbmUiLCAwKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgib25lIiwgMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoIm9uZSIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoInR3byIsIC0zKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iLCAxKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgidHdvIiwgMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoInR3byIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgidGhyZWUiLCAzKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgidGhyZWUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidGhyZWUiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZXRhaW5BbGwoYykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmV0YWluQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5zaXplKCkgPT0gMTEpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEVxdWFscygxNiwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCYWc8U3RyaW5nPiBiYWcyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZSh0aGlzLmJhZyk7Ci0KLQkJYXNzZXJ0VHJ1ZSgic2FtZSBvYmplY3Q/IiwgdGhpcy5iYWcgIT0gYmFnMik7Ci0JCWFzc2VydEVxdWFscygxMSwgYmFnMi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQkvLyBsb29rIGZvciBzaW1pbGFyIGVsZW1lbnRzCi0JCWFzc2VydFRydWUoYmFnMi5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUoYmFnMi5jb250YWlucygib25lIikpOwotCQlhc3NlcnRUcnVlKGJhZzIuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShiYWcyLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShiYWcyLmNvbnRhaW5zKCJmb3VyIikpOwotCi0JCWludCBudWxsQ291bnQgPSAwLCBvbmVDb3VudCA9IDAsIHR3b0NvdW50ID0gMCwgdGhyZWVDb3VudCA9IDAsIGZvdXJDb3VudCA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBiYWcyKSB7Ci0JCQlpZiAocyA9PSBudWxsKSB7Ci0JCQkJbnVsbENvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJvbmUiKSkgewotCQkJCW9uZUNvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJ0d28iKSkgewotCQkJCXR3b0NvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdGhyZWVDb3VudCsrOwotCQkJfSBlbHNlIGlmIChzLmVxdWFscygiZm91ciIpKSB7Ci0JCQkJZm91ckNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIG51bGxDb3VudCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVDb3VudCk7Ci0JCWFzc2VydEVxdWFscygyLCB0d29Db3VudCk7Ci0JCWFzc2VydEVxdWFscygzLCB0aHJlZUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGZvdXJDb3VudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJhZy50b0FycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxMSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJvbmUiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0d28iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgImZvdXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMTJdOwotCQlhWzExXSA9ICJub3QgbnVsbCI7Ci0JCVN0cmluZ1tdIGIgPSB0aGlzLmJhZy50b0FycmF5KGEpOwotCQlhc3NlcnRFcXVhbHMoYSwgYik7Ci0JCWFzc2VydEVxdWFscygxMiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJvbmUiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0d28iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgImZvdXIiKSk7Ci0JCWFzc2VydFRydWUoYVsxMV0gPT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlTdHJpbmcgcyA9IHRoaXMuYmFnLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocy5zdGFydHNXaXRoKCJbIikpOwotCQlhc3NlcnRUcnVlKHMuZW5kc1dpdGgoIl0iKSk7Ci0JCWludCBjb21tYUNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChzLmNoYXJBdChpKSA9PSAnLCcpIHsKLQkJCQljb21tYUNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEwLCBjb21tYUNvdW50KTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoIm9uZSIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoInR3byIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoInRocmVlIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigiZm91ciIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoIm51bGwiKSAhPSAtMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0lkZW50aXR5SGFzaEJhZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0lkZW50aXR5SGFzaEJhZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTliMjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JZGVudGl0eUhhc2hCYWdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5JZGVudGl0eUhhc2hCYWc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBJZGVudGl0eUhhc2hCYWdUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIElkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJhZzsKLQlwcml2YXRlIFN0cmluZyBvbmUgPSAib25lIjsKLQlwcml2YXRlIFN0cmluZyB0d28gPSAidHdvIjsKLQlwcml2YXRlIFN0cmluZyB0aHJlZSA9ICJ0aHJlZSI7Ci0JcHJpdmF0ZSBTdHJpbmcgZm91ciA9ICJmb3VyIjsKLQlwcml2YXRlIFN0cmluZyBmb28gPSAiZm9vIjsKLQlwcml2YXRlIFN0cmluZyBiYXIgPSAiYmFyIjsKLQotCXB1YmxpYyBJZGVudGl0eUhhc2hCYWdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmJhZyA9IHRoaXMuYnVpbGRCYWcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJ1aWxkQmFnKCkgewotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiByZXN1bHQgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZChudWxsKTsKLQkJcmVzdWx0LmFkZCh0aGlzLm9uZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy50d28pOwotCQlyZXN1bHQuYWRkKHRoaXMudHdvKTsKLQkJcmVzdWx0LmFkZCh0aGlzLnRocmVlKTsKLQkJcmVzdWx0LmFkZCh0aGlzLnRocmVlKTsKLQkJcmVzdWx0LmFkZCh0aGlzLnRocmVlKTsKLQkJcmVzdWx0LmFkZCh0aGlzLmZvdXIpOwotCQlyZXN1bHQuYWRkKHRoaXMuZm91cik7Ci0JCXJlc3VsdC5hZGQodGhpcy5mb3VyKTsKLQkJcmVzdWx0LmFkZCh0aGlzLmZvdXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuZm9vKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJcmV0dXJuIGM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDdG9yQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBsb2NhbEJhZyA9IG5ldyBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPihjKTsKLQkJZm9yIChTdHJpbmcgcyA6IGMpIHsKLQkJCWFzc2VydFRydWUobG9jYWxCYWcuY29udGFpbnMocykpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDdG9ySW50RmxvYXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQ7Ci0JCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJhZyA9IG5ldyBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPigtMjAsIDAuNjZmKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJhZyA9IG5ldyBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPigyMCwgLTAuNjZmKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCS8vIHRoZSBvdGhlciBhZGRzIHRvb2sgcGxhY2UgaW4gc2V0VXAKLQkJU3RyaW5nIGZpdmUgPSAiZml2ZSI7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuYWRkKGZpdmUpKTsKLQkKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMuZm91cikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKGZpdmUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZENvdW50KCkgewotCQlTdHJpbmcgbWludXMzID0gIm1pbnVzMyI7Ci0JCVN0cmluZyB6ZXJvID0gInplcm8iOwotCQlTdHJpbmcgZml2ZSA9ICJmaXZlIjsKLQkJLy8gdGhlIG90aGVyIGFkZHMgdG9vayBwbGFjZSBpbiBzZXRVcAotCQl0aGlzLmJhZy5hZGQobWludXMzLCAtMyk7Ci0JCXRoaXMuYmFnLmFkZCh6ZXJvLCAwKTsKLQkJdGhpcy5iYWcuYWRkKGZpdmUsIDUpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKG1pbnVzMykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh6ZXJvKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmJhZy5jb3VudCh0aGlzLm9uZSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5iYWcuY291bnQodGhpcy50d28pKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYmFnLmNvdW50KHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuYmFnLmNvdW50KHRoaXMuZm91cikpOwotCQlhc3NlcnRFcXVhbHMoNSwgdGhpcy5iYWcuY291bnQoZml2ZSkpOwotCi0JCXRoaXMuYmFnLmFkZCh0aGlzLnRocmVlLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHRoaXMuYmFnLmNvdW50KHRoaXMudGhyZWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuYWRkQWxsKGMpKTsKLQkJZm9yIChTdHJpbmcgcyA6IGMpIHsKLQkJCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMocykpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMuZm91cikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCB0aGlzLmJhZy5zaXplKCkpOwotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMuZm91cikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCUlkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJhZy5jbG9uZSgpOwotCQlhc3NlcnRUcnVlKCJiYWQgY2xvbmUiLCB0aGlzLmJhZyAhPSBiYWcyKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYWQgY2xvbmUiLCB0aGlzLmJhZywgYmFnMik7Ci0JCWFzc2VydFRydWUoImJhZCBjbG9uZSIsIHRoaXMuYmFnLmhhc2hDb2RlKCkgPT0gYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMuZm91cikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKG5ldyBTdHJpbmcoImZvdXIiKSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiZml2ZSIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChudWxsKTsKLQkJYy5hZGQodGhpcy5vbmUpOwotCQljLmFkZCh0aGlzLnR3byk7Ci0JCWMuYWRkKHRoaXMudGhyZWUpOwotCQljLmFkZCh0aGlzLmZvdXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpKTsKLQkJYy5hZGQobmV3IFN0cmluZyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnNBbGwoYykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q291bnQoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5jb3VudCgiemVybyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuYmFnLmNvdW50KCJvbmUiKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmJhZy5jb3VudCgidHdvIikpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5iYWcuY291bnQoInRocmVlIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5iYWcuY291bnQoImZvdXIiKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5jb3VudCgiZml2ZSIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gYmFnMiA9IHRoaXMuYnVpbGRCYWcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFnLCBiYWcyKTsKLQkJYmFnMi5hZGQoImZpdmUiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuZXF1YWxzKGJhZzIpKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odGhpcy5iYWcpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5lcXVhbHMoYykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCUlkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZy5oYXNoQ29kZSgpLCBiYWcyLmhhc2hDb2RlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCQl0aGlzLmJhZy5hZGQoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJdGVyYXRvcigpIHsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYmFnLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGVsZW1lbnQsIGV4Q2F1Z2h0KTsKLQkKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMTEsIGkpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JCi0JCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHRoaXMuYmFnLnNpemUoKSk7Ci0JCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCi0JCS8vIHN0YXJ0IG92ZXIKLQkJaXRlcmF0b3IgPSB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNSwgaSk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbChlbGVtZW50LnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSAmJiAhdGhpcy5mb3VyLmVxdWFscyhuZXh0KSkgewotCQkJbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJU3RyaW5nIGZpdmUgPSAiZml2ZSI7Ci0JCXRoaXMuYmFnLmFkZChmaXZlKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCS8vIENvbW1lbnRpbmcgb3V0IHRoaXMgdGVzdCBhcyBpdCBpcyBhbHNvIGZhaWxpbmcgaW4gdGhlIEVjbGlwc2UgYnVpbGQKLQkvLyBhcHBhcmVubHkgdGhlcmUgYXJlIHNvbWUgaGFzaGluZyBpc3N1ZXMgdGhhdCBuZWVkIHRvIGJlIGxvb2tlZCBpbnRvLgotLy8JcHVibGljIHZvaWQgdGVzdEhhc2hpbmdEaXN0cmlidXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiaWdCYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKLS8vCQkJYmlnQmFnLmFkZCgib2JqZWN0IiArIGkpOwotLy8JCX0KLS8vCQotLy8JCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkID0gYmlnQmFnLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgidGFibGUiKTsKLS8vCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotLy8JCU9iamVjdFtdIHRhYmxlID0gKE9iamVjdFtdKSBmaWVsZC5nZXQoYmlnQmFnKTsKLS8vCQlpbnQgYnVja2V0Q291bnQgPSB0YWJsZS5sZW5ndGg7Ci0vLwkJaW50IGZpbGxlZEJ1Y2tldENvdW50ID0gMDsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1Y2tldENvdW50OyBpKyspIHsKLS8vCQkJaWYgKHRhYmxlW2ldICE9IG51bGwpIHsKLS8vCQkJCWZpbGxlZEJ1Y2tldENvdW50Kys7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJZmxvYXQgbG9hZEZhY3RvciA9ICgoZmxvYXQpIGZpbGxlZEJ1Y2tldENvdW50KS8oKGZsb2F0KSBidWNrZXRDb3VudCk7Ci0vLwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJsb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3IgKyAiICgiICsgZmlsbGVkQnVja2V0Q291bnQgKyAiLyIgKyBidWNrZXRDb3VudCArICIpIik7Ci0vLwkJYXNzZXJ0VHJ1ZSgiV0FSTklORyAtIHBvb3IgbG9hZCBmYWN0b3I6ICIgKyBsb2FkRmFjdG9yLCBsb2FkRmFjdG9yID4gMC4yMCk7Ci0vLwkJYXNzZXJ0VHJ1ZSgiV0FSTklORyAtIHBvb3IgbG9hZCBmYWN0b3I6ICIgKyBsb2FkRmFjdG9yLCBsb2FkRmFjdG9yIDwgMC43NSk7Ci0vLwl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMub25lKSk7Ci0JCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bykpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZShuZXcgU3RyaW5nKHRoaXMudGhyZWUpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb3VudCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMub25lLCAwKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLm9uZSwgMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5vbmUpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28sIC0zKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvLCAxKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bywgMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnRocmVlLCAzKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudGhyZWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCh0aGlzLm9uZSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcodGhpcy50d28pKTsKLQkJYy5hZGQodGhpcy50aHJlZSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlQWxsKGMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLm9uZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50aHJlZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmVBbGwoYykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCh0aGlzLm9uZSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcodGhpcy50d28pKTsKLQkJYy5hZGQodGhpcy50aHJlZSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmV0YWluQWxsKGMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLm9uZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy5mb3VyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5mb3VyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJldGFpbkFsbChjKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnNpemUoKSA9PSAxMSk7Ci0JCVN0cmluZyBmaXZlID0gImZpdmUiOwotCQl0aGlzLmJhZy5hZGQoZml2ZSk7Ci0JCXRoaXMuYmFnLmFkZChmaXZlKTsKLQkJdGhpcy5iYWcuYWRkKGZpdmUpOwotCQl0aGlzLmJhZy5hZGQoZml2ZSk7Ci0JCXRoaXMuYmFnLmFkZChuZXcgU3RyaW5nKGZpdmUpKTsKLQkJYXNzZXJ0RXF1YWxzKDE2LCB0aGlzLmJhZy5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWcyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZSh0aGlzLmJhZyk7Ci0JCi0JCWFzc2VydFRydWUoInNhbWUgb2JqZWN0PyIsIHRoaXMuYmFnICE9IGJhZzIpOwotCQlhc3NlcnRFcXVhbHMoMTEsIGJhZzIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5iYWcuaXRlcmF0b3IoKSksIENvbGxlY3Rpb25Ub29scy5iYWcoYmFnMi5pdGVyYXRvcigpKSk7Ci0JCS8vIGxvb2sgZm9yIHNpbWlsYXIgZWxlbWVudHMKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5iYWcoYmFnMi5pdGVyYXRvcigpKS5jb250YWlucygib25lIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5iYWcoYmFnMi5pdGVyYXRvcigpKS5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5iYWcoYmFnMi5pdGVyYXRvcigpKS5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmJhZyhiYWcyLml0ZXJhdG9yKCkpLmNvbnRhaW5zKCJmb3VyIikpOwotCQotCQlpbnQgbnVsbENvdW50ID0gMCwgb25lQ291bnQgPSAwLCB0d29Db3VudCA9IDAsIHRocmVlQ291bnQgPSAwLCBmb3VyQ291bnQgPSAwOwotCQlmb3IgKFN0cmluZyBuZXh0IDogYmFnMikgewotCQkJaWYgKG5leHQgPT0gbnVsbCkKLQkJCQludWxsQ291bnQrKzsKLQkJCWVsc2UgaWYgKG5leHQuZXF1YWxzKCJvbmUiKSkKLQkJCQlvbmVDb3VudCsrOwotCQkJZWxzZSBpZiAobmV4dC5lcXVhbHMoInR3byIpKQotCQkJCXR3b0NvdW50Kys7Ci0JCQllbHNlIGlmIChuZXh0LmVxdWFscygidGhyZWUiKSkKLQkJCQl0aHJlZUNvdW50Kys7Ci0JCQllbHNlIGlmIChuZXh0LmVxdWFscygiZm91ciIpKQotCQkJCWZvdXJDb3VudCsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygxLCBudWxsQ291bnQpOwotCQlhc3NlcnRFcXVhbHMoMSwgb25lQ291bnQpOwotCQlhc3NlcnRFcXVhbHMoMiwgdHdvQ291bnQpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhyZWVDb3VudCk7Ci0JCWFzc2VydEVxdWFscyg0LCBmb3VyQ291bnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheSgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYmFnLnRvQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgdGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgdGhpcy50d28pKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgdGhpcy50aHJlZSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCB0aGlzLmZvdXIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMTJdOwotCQlhWzExXSA9ICJub3QgbnVsbCI7Ci0JCVN0cmluZ1tdIGIgPSB0aGlzLmJhZy50b0FycmF5KGEpOwotCQlhc3NlcnRFcXVhbHMoYSwgYik7Ci0JCWFzc2VydEVxdWFscygxMiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIHRoaXMub25lKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgdGhpcy5mb3VyKSk7Ci0JCWFzc2VydFRydWUoYVsxMV0gPT0gbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJU3RyaW5nIHMgPSB0aGlzLmJhZy50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHMuc3RhcnRzV2l0aCgiWyIpKTsKLQkJYXNzZXJ0VHJ1ZShzLmVuZHNXaXRoKCJdIikpOwotCQlpbnQgY29tbWFDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAocy5jaGFyQXQoaSkgPT0gJywnKSB7Ci0JCQkJY29tbWFDb3VudCsrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBudW1iZXIgb2YgY29tbWFzIiwgMTAsIGNvbW1hQ291bnQpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigib25lIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigidHdvIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigidGhyZWUiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJmb3VyIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHMuaW5kZXhPZigibnVsbCIpICE9IC0xKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSW5kZW50aW5nUHJpbnRXcml0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JbmRlbnRpbmdQcmludFdyaXRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NzE4OTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JbmRlbnRpbmdQcmludFdyaXRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5JbmRlbnRpbmdQcmludFdyaXRlcjsKLQotcHVibGljIGNsYXNzIEluZGVudGluZ1ByaW50V3JpdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JU3RyaW5nV3JpdGVyIHN3MTsKLQlTdHJpbmdXcml0ZXIgc3cyOwotCUluZGVudGluZ1ByaW50V3JpdGVyIGlwdzE7Ci0JSW5kZW50aW5nUHJpbnRXcml0ZXIgaXB3MjsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KLQlwdWJsaWMgSW5kZW50aW5nUHJpbnRXcml0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN3MSA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJdGhpcy5pcHcxID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKHRoaXMuc3cxKTsKLQkJdGhpcy5zdzIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCXRoaXMuaXB3MiA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcih0aGlzLnN3MiwgIiAgICAiKTsgLy8gaW5kZW50IHdpdGggNCBzcGFjZXMgaW5zdGVhZCBvZiBhIHRhYgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZW50KCkgewotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDAsIHRoaXMuaXB3MS5pbmRlbnRMZXZlbCgpKTsKLQkJdGhpcy5pcHcxLmluZGVudCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDEsIHRoaXMuaXB3MS5pbmRlbnRMZXZlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5kZW50KCkgewotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDAsIHRoaXMuaXB3MS5pbmRlbnRMZXZlbCgpKTsKLQkJdGhpcy5pcHcxLmluZGVudCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDEsIHRoaXMuaXB3MS5pbmRlbnRMZXZlbCgpKTsKLQkJdGhpcy5pcHcxLnVuZGVudCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDAsIHRoaXMuaXB3MS5pbmRlbnRMZXZlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5jcmVtZW50SW5kZW50TGV2ZWwoKSB7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuaW5jcmVtZW50SW5kZW50TGV2ZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAxLCB0aGlzLmlwdzEuaW5kZW50TGV2ZWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlY3JlbWVudEluZGVudExldmVsKCkgewotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDAsIHRoaXMuaXB3MS5pbmRlbnRMZXZlbCgpKTsKLQkJdGhpcy5pcHcxLmluY3JlbWVudEluZGVudExldmVsKCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMSwgdGhpcy5pcHcxLmluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuZGVjcmVtZW50SW5kZW50TGV2ZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAwLCB0aGlzLmlwdzEuaW5kZW50TGV2ZWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW50VGFiKCkgewotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiZm9vMCIgKyBDUiArICJcdGZvbzEiICsgQ1IgKyAiXHRmb28xIiArIENSICsgIlx0XHRmb28yIiArIENSICsgIlx0Zm9vMSIgKyBDUiArICJcdGZvbzEiICsgQ1IgKyAiZm9vMCIgKyBDUjsKLQotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMCIpOwotCQl0aGlzLmlwdzEuaW5kZW50KCk7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3MS5pbmRlbnQoKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzIiKTsKLQkJdGhpcy5pcHcxLnVuZGVudCgpOwotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzEudW5kZW50KCk7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28wIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBvdXRwdXQiLCBleHBlY3RlZCwgdGhpcy5zdzEudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW50U3BhY2VzKCkgewotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiZm9vMCIgKyBDUiArICIgICAgZm9vMSIgKyBDUiArICIgICAgZm9vMSIgKyBDUiArICIgICAgICAgIGZvbzIiICsgQ1IgKyAiICAgIGZvbzEiICsgQ1IgKyAiICAgIGZvbzEiICsgQ1IgKyAiZm9vMCIgKyBDUjsKLQotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMCIpOwotCQl0aGlzLmlwdzIuaW5kZW50KCk7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3Mi5pbmRlbnQoKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzIiKTsKLQkJdGhpcy5pcHcyLnVuZGVudCgpOwotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzIudW5kZW50KCk7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28wIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBvdXRwdXQiLCBleHBlY3RlZCwgdGhpcy5zdzIudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0pEQkNUeXBlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSkRCQ1R5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2RhZDE5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSkRCQ1R5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuc3FsLlR5cGVzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5KREJDVHlwZTsKLQotcHVibGljIGNsYXNzIEpEQkNUeXBlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSkRCQ1R5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZXNTaXplKCkgewotCQlhc3NlcnRFcXVhbHMoVHlwZXMuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGgsIEpEQkNUeXBlLnR5cGVzKCkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZSgpIHsKLQkJSkRCQ1R5cGUgamRiY1R5cGU7Ci0JCWpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShUeXBlcy5WQVJDSEFSKTsKLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSIiwgamRiY1R5cGUubmFtZSgpKTsKLQotCQlqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuSU5URUdFUik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGpkYmNUeXBlLm5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvZGUoKSB7Ci0JCUpEQkNUeXBlIGpkYmNUeXBlOwotCQlqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuVkFSQ0hBUik7Ci0JCWFzc2VydEVxdWFscyhUeXBlcy5WQVJDSEFSLCBqZGJjVHlwZS5jb2RlKCkpOwotCi0JCWpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShUeXBlcy5JTlRFR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKFR5cGVzLklOVEVHRVIsIGpkYmNUeXBlLmNvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUeXBlQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKREJDVHlwZSBqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoNTUpOwotCQkJZmFpbCgiaW52YWxpZCBKREJDVHlwZTogIiArIGpkYmNUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUeXBlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKREJDVHlwZSBqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoIlZBUkNIQVIyIik7Ci0JCQlmYWlsKCJpbnZhbGlkIEpEQkNUeXBlOiAiICsgamRiY1R5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSmF2YVR5cGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KYXZhVHlwZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNjMzNmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KYXZhVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZUphdmFUeXBlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBKYXZhVHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRWxlbWVudFR5cGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKG51bGwsIDApOwotCQkJZmFpbCgiaW52YWxpZCBKYXZhVHlwZTogIiArIGphdmFUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRFbGVtZW50VHlwZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKCIiLCAwKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRWxlbWVudFR5cGVBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MuZ2V0TmFtZSgpLCAwKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQXJyYXlEZXB0aE5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpLCAtMik7Ci0JCQlmYWlsKCJpbnZhbGlkIEphdmFUeXBlOiAiICsgamF2YVR5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFZvaWRBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzLmdldE5hbWUoKSwgMik7Ci0JCQlmYWlsKCJpbnZhbGlkIEphdmFUeXBlOiAiICsgamF2YVR5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcCRFbnRyeSIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcCRFbnRyeSIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlEZXB0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUodm9pZC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoMCwgamF2YVR5cGUuZ2V0QXJyYXlEZXB0aCgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygyLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQlhc3NlcnRUcnVlKGphdmFUeXBlLmlzQXJyYXkoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNBcnJheSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhpbnQuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhpbnRbXS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKHZvaWQuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlKYXZhQ2xhc3MoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlKYXZhQ2xhc3MoQ2xhc3M8Pz4gamF2YUNsYXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YUNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFDbGFzcywgamF2YVR5cGUuZ2V0SmF2YUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQ2xhc3NOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoIltMamF2YS5sYW5nLk9iamVjdDsiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiW0kiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAkRW50cnkiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0xqYXZhLnV0aWwuTWFwJEVudHJ5OyIsIGphdmFUeXBlLmdldEphdmFDbGFzc05hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlc2NyaWJlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyhqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoaW50LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoaW50W10uY2xhc3MpOwotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyh2b2lkLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5RGVzY3JpYmVzKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVzY3JpYmVzKENsYXNzPD8+IGphdmFDbGFzcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuZGVzY3JpYmVzKGphdmFDbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWNsYXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdFtdIiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50W10iLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcC5FbnRyeSIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwLkVudHJ5W11bXSIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ByaW1pdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50W10uY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSnB0VXRpbGl0eVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0pwdFV0aWxpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTg0NGVkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSnB0VXRpbGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzLkpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5KcHRVdGlsaXR5TW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5ub2RlLkpwdFV0aWxpdHlOb2RlVGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlOb2RlVGVzdHMuc3VpdGUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJpdFRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NwYXRoVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbGxlY3Rpb25Ub29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvdW50ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbXB0eUl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsZVRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSGFzaEJhZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKElkZW50aXR5SGFzaEJhZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEluZGVudGluZ1ByaW50V3JpdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVR5cGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKREJDVHlwZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1ldGhvZFNpZ25hdHVyZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5hbWVUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJldmVyc2VDb21wYXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVTdGFja1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0cmluZ1Rvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVkQm9vbGVhblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplZE9iamVjdFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplZFN0YWNrVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWE1MU3RyaW5nRW5jb2RlclRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVdGlsaXR5VGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9NZXRob2RTaWduYXR1cmVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9NZXRob2RTaWduYXR1cmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ2ZjViLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTWV0aG9kU2lnbmF0dXJlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5KYXZhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlTWV0aG9kU2lnbmF0dXJlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2lnbmF0dXJlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTWV0aG9kU2lnbmF0dXJlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgoU3RyaW5nKSBudWxsKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoIiIpOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVzTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiZm9vIiwgKEphdmFUeXBlW10pIG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVzTnVsbEl0ZW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoImZvbyIsIG5ldyBKYXZhVHlwZVsxXSk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVyVHlwZXNWb2lkSXRlbSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqdCA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCBuZXcgSmF2YVR5cGVbXSB7anR9KTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJUeXBlTmFtZXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCAoU3RyaW5nW10pIG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVOYW1lc051bGxJdGVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCBuZXcgU3RyaW5nWzFdKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJKYXZhQ2xhc3Nlc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoImZvbyIsIChDbGFzczw/PltdKSBudWxsKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJKYXZhQ2xhc3Nlc051bGxJdGVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCBuZXcgQ2xhc3NbMV0pOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMCgpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QwIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDAoKSIsIG1zLmdldFNpZ25hdHVyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QxIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDEoaW50KSIsIG1zLmdldFNpZ25hdHVyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QyIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDIoaW50LCBqYXZhLmxhbmcuU3RyaW5nKSIsIG1zLmdldFNpZ25hdHVyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMygpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDMoaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W11bXSkiLCBtcy5nZXRTaWduYXR1cmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QyIiwgbXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGFyYW1ldGVyVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJSmF2YVR5cGVbXSBleHBlY3RlZCA9IG5ldyBKYXZhVHlwZVszXTsKLQkJZXhwZWN0ZWRbMF0gPSBuZXcgU2ltcGxlSmF2YVR5cGUoImludCIpOwotCQlleHBlY3RlZFsxXSA9IG5ldyBTaW1wbGVKYXZhVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOwotCQlleHBlY3RlZFsyXSA9IG5ldyBTaW1wbGVKYXZhVHlwZSgiamF2YS5sYW5nLk9iamVjdCIsIDIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIG1zLmdldFBhcmFtZXRlclR5cGVzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtczEgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlPYmplY3QgbXMyID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJYXNzZXJ0Tm90U2FtZShtczEsIG1zMik7Ci0JCWFzc2VydEVxdWFscyhtczEsIG1zMSk7Ci0JCWFzc2VydEVxdWFscyhtczEsIG1zMik7Ci0JCWFzc2VydEVxdWFscyhtczEuaGFzaENvZGUoKSwgbXMyLmhhc2hDb2RlKCkpOwotCi0JCU9iamVjdCBtczMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QyIikpOwotCQlhc3NlcnROb3RTYW1lKG1zMSwgbXMzKTsKLQkJYXNzZXJ0RmFsc2UobXMxLmVxdWFscyhtczMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMxID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zMiA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtczEuY29tcGFyZVRvKG1zMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wYXJlVG8yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZFNpZ25hdHVyZSBtczEgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlNZXRob2RTaWduYXR1cmUgbXMyID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMiIpKTsKLQkJYXNzZXJ0VHJ1ZShtczEuY29tcGFyZVRvKG1zMikgPiAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvMygpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXNBMSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZEEiLCBuZXcgQ2xhc3NbXSB7aW50LmNsYXNzLCBTdHJpbmcuY2xhc3N9KSk7Ci0JCU1ldGhvZFNpZ25hdHVyZSBtc0EyID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kQSIsIG5ldyBDbGFzc1tdIHtpbnQuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfSkpOwotCQlhc3NlcnRUcnVlKG1zQTEuY29tcGFyZVRvKG1zQTIpIDwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBhcmVUbzQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zQjEgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2RCIiwgbmV3IENsYXNzW10ge2ludC5jbGFzcywgT2JqZWN0LmNsYXNzfSkpOwotCQlNZXRob2RTaWduYXR1cmUgbXNCMiA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZEIiLCBuZXcgQ2xhc3NbXSB7aW50LmNsYXNzLCBTdHJpbmcuY2xhc3N9KSk7Ci0JCWFzc2VydFRydWUobXNCMS5jb21wYXJlVG8obXNCMikgPCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTWV0aG9kU2lnbmF0dXJlIG1zMSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCVNpbXBsZU1ldGhvZFNpZ25hdHVyZSBtczIgPSAoU2ltcGxlTWV0aG9kU2lnbmF0dXJlKSBtczEuY2xvbmUoKTsKLQkJYXNzZXJ0Tm90U2FtZShtczEsIG1zMik7Ci0JCWFzc2VydEVxdWFscyhtczEsIG1zMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTWV0aG9kU2lnbmF0dXJlIG1zMSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCVNpbXBsZU1ldGhvZFNpZ25hdHVyZSBtczIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKG1zMSk7Ci0JCWFzc2VydE5vdFNhbWUobXMxLCBtczIpOwotCQlhc3NlcnRFcXVhbHMobXMxLCBtczIpOwotCX0KLQotCXByaXZhdGUgTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlmb3IgKE1ldGhvZCBtZXRob2QgOiB0aGlzLmdldENsYXNzKCkuZ2V0TWV0aG9kcygpKSB7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpIHsKLQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1ldGhvZCBub3QgZm91bmQ6ICIgKyBtZXRob2ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIE1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+Li4uIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1ldGhvZDAoKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCXB1YmxpYyB2b2lkIG1ldGhvZDEoaW50IGZvbykgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQlwdWJsaWMgdm9pZCBtZXRob2QyKGludCBmb28sIFN0cmluZyBiYXIpIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0JcHVibGljIHZvaWQgbWV0aG9kMyhpbnQgZm9vLCBTdHJpbmcgYmFyLCBPYmplY3RbXVtdIGJheikgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQotCXB1YmxpYyB2b2lkIG1ldGhvZEEoaW50IGZvbywgU3RyaW5nIGJhcikgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQlwdWJsaWMgdm9pZCBtZXRob2RBKGludCBmb28sIFN0cmluZyBiYXIsIFN0cmluZyBiYXopIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0KLQlwdWJsaWMgdm9pZCBtZXRob2RCKGludCBmb28sIE9iamVjdCBiYXIpIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0JcHVibGljIHZvaWQgbWV0aG9kQihpbnQgZm9vLCBTdHJpbmcgYmFyKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05hbWVUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05hbWVUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTc4ZjIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9OYW1lVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotCi1wdWJsaWMgY2xhc3MgTmFtZVRvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTmFtZVRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0Fic2VudElnbm9yZUNhc2UoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb2xvckNvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sb3JDb2xsZWN0aW9uKCk7Ci0JCVN0cmluZyByZXR1cm5lZCA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiVGF1cGUiLCBjb2xvckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoIlRhdXBlIiwgcmV0dXJuZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQcmVzZW50Q2FzZURpZmZlcnMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb2xvckNvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sb3JDb2xsZWN0aW9uKCk7Ci0JCVN0cmluZyByZXR1cm5lZCA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJncmVlbiIsIGNvbG9yQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZ3JlZW4iLCByZXR1cm5lZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1ByZXNlbnRJZ25vcmVDYXNlKCkgewotCQlMaXN0PFN0cmluZz4gY29sb3JDb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbG9yQ29sbGVjdGlvbigpOwotCQlTdHJpbmcgcmV0dXJuZWQgPSBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoImdyZWVuIiwgY29sb3JDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJncmVlbjIiLCByZXR1cm5lZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1ByZXNlbnRXaXRoQXBwZW5kaWNlcygpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbG9yQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xvckNvbGxlY3Rpb24oKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiUmVkMSIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJyZWQyIik7Ci0JCVN0cmluZyByZXR1cm5lZCA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgicmVkIiwgY29sb3JDb2xsZWN0aW9uKTsKLQkJY29sb3JDb2xsZWN0aW9uLnJlbW92ZSgiUmVkMSIpOwotCQljb2xvckNvbGxlY3Rpb24ucmVtb3ZlKCJyZWQyIik7Ci0JCWFzc2VydEVxdWFscygicmVkMyIsIHJldHVybmVkKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZENvbG9yQ29sbGVjdGlvbigpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbG9yQ29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJSZWQiKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiT3JhbmdlIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIlllbGxvdyIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJHcmVlbiIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJCbHVlIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIkluZGlnbyIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJWaW9sZXQiKTsKLQkJcmV0dXJuIGNvbG9yQ29sbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckNvbGxlY3Rpb24xKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUgQ29ycG9yYXRpb24iKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIm9yYWNsZTEiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIk9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIlRlc3QiLCBzdHJpbmdzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJPcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygib3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgib3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIlRlc3QiLCBzdHJpbmdzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JDb2xsZWN0aW9uMigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgib3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUxIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIk9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIlRlc3QiLCBzdHJpbmdzKSk7Ci0KLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSBDb3Jwb3JhdGlvbiIpOwotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIk9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJvcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiVGVzdCIsIHN0cmluZ3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckNvbGxlY3Rpb24zKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTEiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9ySXRlcmF0b3IxKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUgQ29ycG9yYXRpb24iKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIm9yYWNsZTEiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIk9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiVGVzdCIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiT3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygib3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgib3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiVGVzdCIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9ySXRlcmF0b3IyKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJvcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTEiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJUZXN0Iiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0KLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSBDb3Jwb3JhdGlvbiIpOwotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIk9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIm9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIm9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIlRlc3QiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckl0ZXJhdG9yMygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUxIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIk9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVKYXZhTmFtZUZvckNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMSIpOwotCi0JCWFzc2VydEVxdWFscygicHJpdmF0ZTIiLCBOYW1lVG9vbHMudW5pcXVlSmF2YU5hbWVGb3IoInByaXZhdGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzczIiLCBOYW1lVG9vbHMudW5pcXVlSmF2YU5hbWVGb3IoImNsYXNzIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoImNhdGFsb2cuc2NoZW1hLm5hbWUiLCBOYW1lVG9vbHMuYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUoImNhdGFsb2ciLCAic2NoZW1hIiwgIm5hbWUiKSk7Ci0JCWFzc2VydEVxdWFscygiY2F0YWxvZy4ubmFtZSIsIE5hbWVUb29scy5idWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZSgiY2F0YWxvZyIsIG51bGwsICJuYW1lIikpOwotCQlhc3NlcnRFcXVhbHMoInNjaGVtYS5uYW1lIiwgTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKG51bGwsICJzY2hlbWEiLCAibmFtZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKG51bGwsIG51bGwsICJuYW1lIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUmVzZXJ2ZWRXb3JkcygpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoTmFtZVRvb2xzLmphdmFSZXNlcnZlZFdvcmRzKCksICJjbGFzcyIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKE5hbWVUb29scy5qYXZhUmVzZXJ2ZWRXb3JkcygpLCAiQ2xhc3MiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKE5hbWVUb29scy5qYXZhUmVzZXJ2ZWRXb3JkcygpLCAicHJpdmF0ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Y29udmVydFRvSmF2YUlkZW50aWZpZXJTdHJpbmcoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMSIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vMSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcml2YXRlXyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigicHJpdmF0ZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJvd18iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoInRocm93IikpOwotCQlhc3NlcnRFcXVhbHMoIl9mb28iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoIjFmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vXyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vJSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fX2Jhcl9fIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28gIGJhciAgIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3Rjb252ZXJ0VG9KYXZhSWRlbnRpZmllclN0cmluZ0NoYXIoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28iLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28xIiwgJyQnKSk7Ci0JCWFzc2VydEVxdWFscygicHJpdmF0ZSQiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoInByaXZhdGUiLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJvd3NzIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJ0aHJvdyIsICdzJykpOwotCQlhc3NlcnRFcXVhbHMoIiRmb28iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoIjFmb28iLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28kIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28lIiwgJyQnKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vJCRiYXIkJCIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vICBiYXIgICIsICckJykpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCIxZm9vIiwgJzcnKTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiBcIiIgKyBzICsgIlwiIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCc3JykgIT0gLTEpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28lIiwgJ14nKTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiBcIiIgKyBzICsgIlwiIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCdeJykgIT0gLTEpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJwcml2YXRlIiwgJ14nKTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiBcIiIgKyBzICsgIlwiIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCdeJykgIT0gLTEpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmFuZ2VUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SYW5nZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjJjY2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SYW5nZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJhbmdlOwotCi1wdWJsaWMgY2xhc3MgUmFuZ2VUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBSYW5nZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmNsdWRlcygpIHsKLQkJUmFuZ2UgcmFuZ2UgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcygtNTUpKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UuaW5jbHVkZXMoMCkpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcyg0KSk7Ci0JCWFzc2VydFRydWUocmFuZ2UuaW5jbHVkZXMoNSkpOwotCQlhc3NlcnRUcnVlKHJhbmdlLmluY2x1ZGVzKDYpKTsKLQkJYXNzZXJ0VHJ1ZShyYW5nZS5pbmNsdWRlcygxNikpOwotCQlhc3NlcnRUcnVlKHJhbmdlLmluY2x1ZGVzKDE3KSk7Ci0JCWFzc2VydEZhbHNlKHJhbmdlLmluY2x1ZGVzKDE4KSk7Ci0JCWFzc2VydEZhbHNlKHJhbmdlLmluY2x1ZGVzKDIwMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCVJhbmdlIHJhbmdlMSA9IG5ldyBSYW5nZSg1LCAxNyk7Ci0JCVJhbmdlIHJhbmdlMiA9IG5ldyBSYW5nZSg1LCAxNyk7Ci0JCWFzc2VydE5vdFNhbWUocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UyLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQotCQlyYW5nZTIgPSBuZXcgUmFuZ2UoMTcsIDUpOwotCQlhc3NlcnRGYWxzZShyYW5nZTEuZXF1YWxzKHJhbmdlMikpOwotCQlhc3NlcnRGYWxzZShyYW5nZTIuZXF1YWxzKHJhbmdlMSkpOwotCQkvLyBhbHRob3VnaCB0aGV5IGFyZSB1bmVxdWFsLCB0aGV5IGNhbiBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZQotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQotCQlyYW5nZTIgPSBuZXcgUmFuZ2UoNSwgMTUpOwotCQlhc3NlcnRGYWxzZShyYW5nZTEuZXF1YWxzKHJhbmdlMikpOwotCQlhc3NlcnRGYWxzZShyYW5nZTIuZXF1YWxzKHJhbmdlMSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJUmFuZ2UgcmFuZ2UxID0gbmV3IFJhbmdlKDUsIDE3KTsKLQkJUmFuZ2UgcmFuZ2UyID0gcmFuZ2UxLmNsb25lKCk7Ci0JCWFzc2VydE5vdFNhbWUocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UyLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlSYW5nZSByYW5nZTEgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlSYW5nZSByYW5nZTIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKHJhbmdlMSk7Ci0JCWFzc2VydE5vdFNhbWUocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UyLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZTAwZmQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SZXZlcnNlQ29tcGFyYXRvcjsKLQotcHVibGljIGNsYXNzIFJldmVyc2VDb21wYXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gbmF0dXJhbFJldmVyc2VDb21wYXJhdG9yOwotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGN1c3RvbUNvbXBhcmF0b3I7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gY3VzdG9tUmV2ZXJzZUNvbXBhcmF0b3I7Ci0KLQlwdWJsaWMgUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm5hdHVyYWxSZXZlcnNlQ29tcGFyYXRvciA9IG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCk7Ci0JCXRoaXMuY3VzdG9tQ29tcGFyYXRvciA9IHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCk7Ci0JCXRoaXMuY3VzdG9tUmV2ZXJzZUNvbXBhcmF0b3IgPSBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPih0aGlzLmN1c3RvbUNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJCQlTdHJpbmcgbG93ZXIxID0gczEudG9Mb3dlckNhc2UoKTsKLQkJCQlTdHJpbmcgbG93ZXIyID0gczIudG9Mb3dlckNhc2UoKTsKLQkJCQlpbnQgcmVzdWx0ID0gbG93ZXIxLmNvbXBhcmVUbyhsb3dlcjIpOwotCQkJCWlmIChyZXN1bHQgPT0gMCkgewotCQkJCQlyZXR1cm4gczEuY29tcGFyZVRvKHMyKTsgLy8gdXNlIGNhc2UgdG8gZGlmZmVyZW50aWF0ZSAiZXF1YWwiIHN0cmluZ3MKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFVuc29ydGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJUIik7Ci0JCXJlc3VsdC5hZGQoIloiKTsKLQkJcmVzdWx0LmFkZCgiWSIpOwotCQlyZXN1bHQuYWRkKCJNIik7Ci0JCXJlc3VsdC5hZGQoIm0iKTsKLQkJcmVzdWx0LmFkZCgiYSIpOwotCQlyZXN1bHQuYWRkKCJCIik7Ci0JCXJlc3VsdC5hZGQoImIiKTsKLQkJcmVzdWx0LmFkZCgiQSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTmF0dXJhbGx5U29ydGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCkpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRDdXN0b21Tb3J0ZWRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRoaXMuYnVpbGRVbnNvcnRlZExpc3QoKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCB0aGlzLmN1c3RvbUNvbXBhcmF0b3IpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmF0dXJhbCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgdGhpcy5uYXR1cmFsUmV2ZXJzZUNvbXBhcmF0b3IpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5idWlsZE5hdHVyYWxseVNvcnRlZExpc3QoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgdGhpcy5jdXN0b21SZXZlcnNlQ29tcGFyYXRvcik7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkTGlzdCgpLCBsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdChMaXN0PFN0cmluZz4gbm9ybWFsLCBMaXN0PFN0cmluZz4gcmV2ZXJzZSkgewotCQlpbnQgc2l6ZSA9IG5vcm1hbC5zaXplKCk7Ci0JCWludCBtYXggPSBzaXplIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhub3JtYWwuZ2V0KGkpLCByZXZlcnNlLmdldChtYXggLSBpKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjMyMDBiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkFzc29jaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlNpbXBsZUFzc29jaWF0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBc3NvY2lhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGFzc29jOwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShTaW1wbGVBc3NvY2lhdGlvblRlc3RzLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIFNpbXBsZUFzc29jaWF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5hc3NvYyA9IG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4oImZvbyIsICJiYXIiKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEtleSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFzc29jLmtleSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5hc3NvYy52YWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5hc3NvYy52YWx1ZSgpKTsKLQkJdGhpcy5hc3NvYy5zZXRWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5hc3NvYy52YWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5hc3NvYywgdGhpcy5jb3B5KHRoaXMuYXNzb2MpKTsKLQotCQlTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYXNzb2MyID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPigiZm9vIiwgImJheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFzc29jLmVxdWFscyhhc3NvYzIpKTsKLQotCQlhc3NvYzIgPSBuZXcgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+KCJmb3AiLCAiYmFyIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYXNzb2MuZXF1YWxzKGFzc29jMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYXNzb2MuaGFzaENvZGUoKSwgdGhpcy5jb3B5KHRoaXMuYXNzb2MpLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJdGhpcy52ZXJpZnlDbG9uZSh0aGlzLmFzc29jLCB0aGlzLmFzc29jLmNsb25lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDbG9uZShBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gZXhwZWN0ZWQsIEFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBhY3R1YWwpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCQlhc3NlcnROb3RTYW1lKGV4cGVjdGVkLCBhY3R1YWwpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQua2V5KCksIGFjdHVhbC5rZXkoKSk7Ci0JCWFzc2VydFNhbWUoZXhwZWN0ZWQua2V5KCksIGFjdHVhbC5rZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC52YWx1ZSgpLCBhY3R1YWwudmFsdWUoKSk7Ci0JCWFzc2VydFNhbWUoZXhwZWN0ZWQudmFsdWUoKSwgYWN0dWFsLnZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJjYXN0IikKLQkJQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGFzc29jMiA9IChBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4pIFRlc3RUb29scy5zZXJpYWxpemUodGhpcy5hc3NvYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYXNzb2MsIGFzc29jMik7Ci0JCWFzc2VydE5vdFNhbWUodGhpcy5hc3NvYywgYXNzb2MyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYXNzb2Mua2V5KCksIGFzc29jMi5rZXkoKSk7Ci0JCWFzc2VydE5vdFNhbWUodGhpcy5hc3NvYy5rZXkoKSwgYXNzb2MyLmtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYXNzb2MudmFsdWUoKSwgYXNzb2MyLnZhbHVlKCkpOwotCQlhc3NlcnROb3RTYW1lKHRoaXMuYXNzb2MudmFsdWUoKSwgYXNzb2MyLnZhbHVlKCkpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGNvcHkoU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IHNhKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+KHNhLmtleSgpLCBzYS52YWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlU3RhY2tUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVTdGFja1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMjk3OTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVTdGFja1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RhY2s7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVTdGFja1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFNpbXBsZVN0YWNrVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSBuZXcgU2ltcGxlU3RhY2s8U3RyaW5nPigpOwotCQlhc3NlcnRUcnVlKHN0YWNrLmlzRW1wdHkoKSk7Ci0JCXN0YWNrLnB1c2goImZpcnN0Iik7Ci0JCWFzc2VydEZhbHNlKHN0YWNrLmlzRW1wdHkoKSk7Ci0JCXN0YWNrLnB1c2goInNlY29uZCIpOwotCQlhc3NlcnRGYWxzZShzdGFjay5pc0VtcHR5KCkpOwotCQlzdGFjay5wb3AoKTsKLQkJYXNzZXJ0RmFsc2Uoc3RhY2suaXNFbXB0eSgpKTsKLQkJc3RhY2sucG9wKCk7Ci0JCWFzc2VydFRydWUoc3RhY2suaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHVzaEFuZFBvcCgpIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IG5ldyBTaW1wbGVTdGFjazxTdHJpbmc+KCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlzdGFjay5wdXNoKGZpcnN0KTsKLQkJc3RhY2sucHVzaChzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wb3AoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucG9wKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQdXNoQW5kUGVlaygpIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IG5ldyBTaW1wbGVTdGFjazxTdHJpbmc+KCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlzdGFjay5wdXNoKGZpcnN0KTsKLQkJc3RhY2sucHVzaChzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wb3AoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBvcCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdGFja0V4Y2VwdGlvblBlZWsoKSB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSBuZXcgU2ltcGxlU3RhY2s8U3RyaW5nPigpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJc3RhY2sucHVzaChmaXJzdCk7Ci0JCXN0YWNrLnB1c2goc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucG9wKCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0YWNrLnBlZWsoKTsKLQkJfSBjYXRjaCAoRW1wdHlTdGFja0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0YWNrRXhjZXB0aW9uUG9wKCkgewotCQlTdGFjazxTdHJpbmc+IHN0YWNrID0gbmV3IFNpbXBsZVN0YWNrPFN0cmluZz4oKTsKLQkJU3RyaW5nIGZpcnN0ID0gImZpcnN0IjsKLQkJU3RyaW5nIHNlY29uZCA9ICJzZWNvbmQiOwotCi0JCXN0YWNrLnB1c2goZmlyc3QpOwotCQlzdGFjay5wdXNoKHNlY29uZCk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBvcCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBvcCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdGFjay5wb3AoKTsKLQkJfSBjYXRjaCAoRW1wdHlTdGFja0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJU2ltcGxlU3RhY2s8U3RyaW5nPiBzdGFjayA9IG5ldyBTaW1wbGVTdGFjazxTdHJpbmc+KCk7Ci0JCXN0YWNrLnB1c2goImZpcnN0Iik7Ci0JCXN0YWNrLnB1c2goInNlY29uZCIpOwotCQlzdGFjay5wdXNoKCJ0aGlyZCIpOwotCi0JCXRoaXMudmVyaWZ5Q2xvbmUoc3RhY2ssIHN0YWNrLmNsb25lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVN0YWNrPFN0cmluZz4gc3RhY2sgPSBuZXcgU2ltcGxlU3RhY2s8U3RyaW5nPigpOwotCQlzdGFjay5wdXNoKCJmaXJzdCIpOwotCQlzdGFjay5wdXNoKCJzZWNvbmQiKTsKLQkJc3RhY2sucHVzaCgidGhpcmQiKTsKLQotCQl0aGlzLnZlcmlmeUNsb25lKHN0YWNrLCBUZXN0VG9vbHMuc2VyaWFsaXplKHN0YWNrKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNsb25lKFN0YWNrPFN0cmluZz4gb3JpZ2luYWwsIFN0YWNrPFN0cmluZz4gY2xvbmUpIHsKLQkJYXNzZXJ0Tm90U2FtZShvcmlnaW5hbCwgY2xvbmUpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucGVlaygpLCBjbG9uZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucG9wKCksIGNsb25lLnBvcCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBlZWsoKSwgY2xvbmUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBvcCgpLCBjbG9uZS5wb3AoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5pc0VtcHR5KCksIGNsb25lLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wZWVrKCksIGNsb25lLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wb3AoKSwgY2xvbmUucG9wKCkpOwotCQlhc3NlcnRUcnVlKG9yaWdpbmFsLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5pc0VtcHR5KCksIGNsb25lLmlzRW1wdHkoKSk7Ci0KLQkJb3JpZ2luYWwucHVzaCgiZm91cnRoIik7Ci0JCWFzc2VydEZhbHNlKG9yaWdpbmFsLmlzRW1wdHkoKSk7Ci0JCS8vIGNsb25lIHNob3VsZCBzdGlsbCBiZSBlbXB0eQotCQlhc3NlcnRUcnVlKGNsb25lLmlzRW1wdHkoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N0cmluZ1Rvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3RyaW5nVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmY2OTM2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3RyaW5nVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1wdWJsaWMgY2xhc3MgU3RyaW5nVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTdHJpbmdUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8vICoqKioqKioqKiogcGFkZGluZy90cnVuY2F0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RQYWQoKSB7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIFN0cmluZ1Rvb2xzLnBhZCgiZnJlZCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCBTdHJpbmdUb29scy5wYWQoImZyZWQiLCA2KSk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiZnIiLCBTdHJpbmdUb29scy5wYWQoImZyZWQiLCAyKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIG5ldyBTdHJpbmcoU3RyaW5nVG9vbHMucGFkKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgNCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCBuZXcgU3RyaW5nKFN0cmluZ1Rvb2xzLnBhZChuZXcgY2hhcltdIHsgJ2YnLCAncicsICdlJywgJ2QnIH0sIDYpKSk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiZnIiLCBuZXcgU3RyaW5nKFN0cmluZ1Rvb2xzLnBhZChuZXcgY2hhcltdIHsgJ2YnLCAncicsICdlJywgJ2QnIH0sIDIpKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPbldyaXRlcigpIHsKLQkJV3JpdGVyIHdyaXRlcjsKLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDQsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNiwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDIsIHdyaXRlcik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPblN0cmluZ0J1ZmZlcigpIHsKLQkJU3RyaW5nQnVmZmVyIHNiOwotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA0LCBzYik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDYsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCAyLCBzYik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2I7Ci0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA0LCBzYik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA2LCBzYik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDIsIHNiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZE9yVHJ1bmNhdGUoKSB7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUoImZyZWQiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZSgiZnJlZCIsIDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmciIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUoImZyZWQiLCAyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZE9yVHJ1bmNhdGVDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIG5ldyBTdHJpbmcoU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZShuZXcgY2hhcltdIHsgJ2YnLCAncicsICdlJywgJ2QnIH0sIDQpKSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgbmV3IFN0cmluZyhTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgNikpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmciIsIG5ldyBTdHJpbmcoU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZShuZXcgY2hhcltdIHsgJ2YnLCAncicsICdlJywgJ2QnIH0sIDIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZE9yVHJ1bmNhdGVPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25Xcml0ZXIoImZyZWQiLCAiZnJlZCIsIDQpOwotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPbldyaXRlcigiZnJlZCAgIiwgImZyZWQiLCA2KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25Xcml0ZXIoImZyIiwgImZyZWQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UGFkT3JUcnVuY2F0ZU9uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCJmcmVkIiwgImZyZWQiLCA0KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoImZyZWQgICIsICJmcmVkIiwgNik7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCJmciIsICJmcmVkIiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5wYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCJmcmVkIiwgImZyZWQiLCA0KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCJmcmVkICAiLCAiZnJlZCIsIDYpOwotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoImZyIiwgImZyZWQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkKCkgewotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkKCIxMjM0IiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoIjAwMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWQoIjEyMzQiLCA2KSk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiMTIiLCBTdHJpbmdUb29scy56ZXJvUGFkKCIxMjM0IiwgMikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZENoYXJBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0IiwgbmV3IFN0cmluZyhTdHJpbmdUb29scy56ZXJvUGFkKG5ldyBjaGFyW10geyAnMScsICcyJywgJzMnLCAnNCcgfSwgNCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBuZXcgU3RyaW5nKFN0cmluZ1Rvb2xzLnplcm9QYWQobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA2KSkpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjEyIiwgbmV3IFN0cmluZyhTdHJpbmdUb29scy56ZXJvUGFkKG5ldyBjaGFyW10geyAnMScsICcyJywgJzMnLCAnNCcgfSwgMikpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPbldyaXRlcigpIHsKLQkJV3JpdGVyIHdyaXRlcjsKLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA0LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA2LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoIjAwMTIzNCIsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDIsIHdyaXRlcik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT25TdHJpbmdCdWZmZXIoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYjsKLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDQsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0Iiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDYsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgMiwgc2IpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9uU3RyaW5nQnVpbGRlcigpIHsKLQkJU3RyaW5nQnVpbGRlciBzYjsKLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA0LCBzYik7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNiwgc2IpOwotCQlhc3NlcnRFcXVhbHMoIjAwMTIzNCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgMiwgc2IpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9yVHJ1bmNhdGUoKSB7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlKCIxMjM0IiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoIjAwMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlKCIxMjM0IiwgNikpOwotCQlhc3NlcnRFcXVhbHMoIjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUoIjEyMzQiLCAyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPclRydW5jYXRlQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBuZXcgU3RyaW5nKFN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnMScsICcyJywgJzMnLCAnNCcgfSwgNCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBuZXcgU3RyaW5nKFN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnMScsICcyJywgJzMnLCAnNCcgfSwgNikpKTsKLQkJYXNzZXJ0RXF1YWxzKCIzNCIsIG5ldyBTdHJpbmcoU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCAyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25Xcml0ZXIoIjEyMzQiLCAiMTIzNCIsIDQpOwotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25Xcml0ZXIoIjAwMTIzNCIsICIxMjM0IiwgNik7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPbldyaXRlcigiMzQiLCAiMTIzNCIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCIxMjM0IiwgIjEyMzQiLCA0KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCIwMDEyMzQiLCAiMTIzNCIsIDYpOwotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoIjM0IiwgIjEyMzQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCIxMjM0IiwgIjEyMzQiLCA0KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiMDAxMjM0IiwgIjEyMzQiLCA2KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiMzQiLCAiMTIzNCIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHdyYXBwaW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwKCkgewotCQl0aGlzLnZlcmlmeVdyYXAoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeVdyYXAoIjEyMyIsICIxMjMiLCAiMTIzMTIzMTIzIik7Ci0JCXRoaXMudmVyaWZ5V3JhcCgiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V3JhcChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgd3JhcCwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMud3JhcChzdHJpbmcsIHdyYXApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcE9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVdyYXBPbldyaXRlcigiRW1wbG95ZWUiLCAiMTIzIiwgIjEyM0VtcGxveWVlMTIzIik7Ci0JCXRoaXMudmVyaWZ5V3JhcE9uV3JpdGVyKCIxMjMiLCAiMTIzIiwgIjEyMzEyMzEyMyIpOwotCQl0aGlzLnZlcmlmeVdyYXBPbldyaXRlcigiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V3JhcE9uV3JpdGVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyB3cmFwLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMud3JhcE9uKHN0cmluZywgd3JhcCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlXcmFwT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeVdyYXBPblN0cmluZ0J1ZmZlcigiMTIzIiwgIjEyMyIsICIxMjMxMjMxMjMiKTsKLQkJdGhpcy52ZXJpZnlXcmFwT25TdHJpbmdCdWZmZXIoIiIsICIxMjMiLCAiMTIzMTIzIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdyYXBPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgd3JhcCwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMud3JhcE9uKHN0cmluZywgd3JhcCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVdyYXBPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeVdyYXBPblN0cmluZ0J1aWxkZXIoIjEyMyIsICIxMjMiLCAiMTIzMTIzMTIzIik7Ci0JCXRoaXMudmVyaWZ5V3JhcE9uU3RyaW5nQnVpbGRlcigiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V3JhcE9uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgd3JhcCwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy53cmFwT24oc3RyaW5nLCB3cmFwLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFF1b3RlKCkgewotCQl0aGlzLnZlcmlmeVF1b3RlKCJFbXBsb3llZSIsICJcIkVtcGxveWVlXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZSgiMTIzIiwgIlwiMTIzXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZSgiIiwgIlwiXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UXVvdGUoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMucXVvdGUoc3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFF1b3RlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPbldyaXRlcigiRW1wbG95ZWUiLCAiXCJFbXBsb3llZVwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPbldyaXRlcigiMTIzIiwgIlwiMTIzXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uV3JpdGVyKCIiLCAiXCJcIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlRdW90ZU9uV3JpdGVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5xdW90ZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFF1b3RlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUiLCAiXCJFbXBsb3llZVwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1ZmZlcigiMTIzIiwgIlwiMTIzXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVmZmVyKCIiLCAiXCJcIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlRdW90ZU9uU3RyaW5nQnVmZmVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnF1b3RlT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFF1b3RlT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSIsICJcIkVtcGxveWVlXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVpbGRlcigiMTIzIiwgIlwiMTIzXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVpbGRlcigiIiwgIlwiXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UXVvdGVPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5xdW90ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogcmVtb3ZpbmcgY2hhcmFjdGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZSgiRW1wbG8meWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxveWVlJiIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZShzdHJpbmcsIGNoYXJUb1JlbW92ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlQ2hhckFycmF5KCJFbXBsbyZ5ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG8meWVlJiIsICcmJywgIkVtcGxveWVlJiIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG95ZWUmIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoIiZFbXBsb3llZSIsICcmJywgIkVtcGxveWVlIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheShTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgbmV3IFN0cmluZyhTdHJpbmdUb29scy5yZW1vdmVGaXJzdE9jY3VycmVuY2Uoc3RyaW5nLnRvQ2hhckFycmF5KCksIGNoYXJUb1JlbW92ZSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcigiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKHN0cmluZywgY2hhclRvUmVtb3ZlLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVpbGRlcigiRW1wbG8meWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlJiIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXMoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoIkVtcGxveWVlIEZyZWQiLCAnICcsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlcygiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlcygiIEVtcCBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhzdHJpbmcsIGNoYXJUb1JlbW92ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KCIgRW1wbG95ZWUgIiwgJyAnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXkoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIG5ldyBTdHJpbmcoU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoc3RyaW5nLnRvQ2hhckFycmF5KCksIGNoYXJUb1JlbW92ZSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKCJFbXBsb3llZSBGcmVkIiwgJyAnLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25Xcml0ZXIoIiBFbXAgbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoIiBFbXBsb3llZSAiLCAnICcsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVmZmVyKCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWlsZGVyKCIgRW1wbG95ZWUgIiwgJyAnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWlsZGVyKCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2UoIkVtcGxveWVlIEZyZWRcdCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2UoIlx0RW1wbG95ZWVcbiIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZSgiRW1wbG95ZWUgXHQgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlKCIgRW1wXHRsb3llZSBcbiBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VDaGFyQXJyYXkoIkVtcGxveWVlIEZyZWRcdCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VDaGFyQXJyYXkoIlx0RW1wbG95ZWVcbiIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZUNoYXJBcnJheSgiRW1wbG95ZWUgXHQgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCIgRW1wXHRsb3llZSBcbiBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBuZXcgU3RyaW5nKFN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2Uoc3RyaW5nLnRvQ2hhckFycmF5KCkpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbFdoaXRlc3BhY2VPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoIkVtcGxveWVlIEZyZWRcdCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPbldyaXRlcigiXHRFbXBsb3llZVxuIiwgJyAnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoIkVtcGxveWVlIFx0IEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uV3JpdGVyKCIgRW1wXHRsb3llZSBcbiBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgRnJlZFx0IiwgJyAnLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCJcdEVtcGxveWVlXG4iLCAnICcsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgXHQgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIiBFbXBcdGxveWVlIFxuIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIEZyZWRcdCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoIlx0RW1wbG95ZWVcbiIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgXHQgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCIgRW1wXHRsb3llZSBcbiBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2VPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbW1vbiBwcmVmaXggKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbW1vblByZWZpeExlbmd0aCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vWlpaIiwgImZvb0JCQiIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vIiwgImZvb0JCQiIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vWlpaIiwgImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tbW9uUHJlZml4TGVuZ3RoTWF4KCkgewotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb29aWloiLCAiZm9vQkJCIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb28iLCAiZm9vQkJCIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb29aWloiLCAiZm9vIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb28iLCAiZm9vIiwgMikpOwotCX0KLQotCS8vICoqKioqKioqKiogY2FwaXRhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIkEiLCBuZXcgY2hhcltdIHsgJ2EnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIlx1MDBDOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBFOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheShTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBuZXcgU3RyaW5nKFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUoc3RyaW5nKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplU3RyaW5nKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIk9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCJPcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiQSIsICJhIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiXHUwMEM5Y29sZSIsICJcdTAwRTljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZyhTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy5jYXBpdGFsaXplKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIkEiLCBuZXcgY2hhcltdIHsgJ2EnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiXHUwMEM5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEU5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJBIiwgbmV3IGNoYXJbXSB7ICdhJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJcdTAwQzljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwRTknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiXHUwMEM5Y29sZSIsICJcdTAwRTljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJPcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiT3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiIiwgIiIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIlx1MDBDOWNvbGUiLCAiXHUwMEU5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiQSIsIG5ldyBjaGFyW10geyAnYScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJcdTAwQzljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwRTknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPblN0cmluZ1dyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIk9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIk9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiXHUwMEM5Y29sZSIsICJcdTAwRTljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5hcGl0YWxpemVDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoImEiLCBuZXcgY2hhcltdIHsgJ0EnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgiXHUwMEU5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEM5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgbmV3IFN0cmluZyhTdHJpbmdUb29scy51bmNhcGl0YWxpemUoc3RyaW5nKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVTdHJpbmcoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJvcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJhIiwgIkEiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZyhTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmNhcGl0YWxpemUoc3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJhIiwgbmV3IGNoYXJbXSB7ICdBJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiXHUwMEU5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEM5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJhIiwgbmV3IGNoYXJbXSB7ICdBJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIlx1MDBFOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBDOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIm9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiYSIsICJBIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJvcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJhIiwgIkEiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiYSIsIG5ldyBjaGFyW10geyAnQScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIlx1MDBFOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBDOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIm9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiYSIsICJBIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNFbXB0eVN0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KChTdHJpbmcpIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KCIiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgiICAgICAgIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIiAgICAgIFx0XHQgICAiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgiICAgICAgXHRcdCAgICIgKyBTdHJpbmdUb29scy5DUikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoKGNoYXJbXSkgbnVsbCkpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRW1wdHlDaGFyQXJyYXkoIiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRW1wdHlDaGFyQXJyYXkoIiAgICAgIFx0XHQgICAiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCIgICAgICAiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCIgICAgICBcdFx0ICAgIiArIFN0cmluZ1Rvb2xzLkNSKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNFbXB0eUNoYXJBcnJheShTdHJpbmcgc3RyaW5nKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShzdHJpbmcudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoKFN0cmluZykgbnVsbCwgKFN0cmluZykgbnVsbCkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKG51bGwsICJhc2RmIikpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIiwgbnVsbCkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLCAiYXNkZiIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIiwgIkFTREYiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2VDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgoY2hhcltdKSBudWxsLCAoY2hhcltdKSBudWxsKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoKGNoYXJbXSkgbnVsbCwgImFzZGYiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgKGNoYXJbXSkgbnVsbCkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgIkFTREYiLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2VTdHJpbmdTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiYXMiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiYVMiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgIkEiKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiYnNkZiIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiZyIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiYXNkZyIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiYXNkZmciKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGZnZ2dnZ2ciKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYXMiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFTIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICIiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgIkEiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgIkFTREYiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGYiLnRvQ2hhckFycmF5KCkpKTsKLQotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImJzZGYiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJnIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYXNkZyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGZnIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYXNkZmdnZ2dnZyIudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ2EnLCAnYScpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdhJywgJ0EnKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgnQScsICdhJykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ0EnLCAnQScpKTsKLQkJCi0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ2EnLCAnYicpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgnQScsICdiJykpOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoKSB7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3QiKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRFU1QiKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRlc3QiKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VEVTVFRlc3QiKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3QiKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUX1RFU1RfVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RURVNUVGVzdFQiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1QiLCAidGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVCIsICJURVNUIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1QiLCAidGVzdFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVF9URVNUX1RFU1QiLCAidGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1RfVEVTVCIsICJUZXN0VEVTVFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUX1QiLCAiVGVzdFRFU1RUZXN0VCIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUIiwgInRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1QiLCAiVEVTVCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUIiwgInRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUIiwgInRlc3RURVNUVGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUX1RFU1QiLCAiVGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1RfVEVTVF9UIiwgIlRlc3RURVNUVGVzdFQiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCJURVNUIiwgInRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCJURVNUIiwgIlRFU1QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCJURVNUX1RFU1QiLCAidGVzdFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCJURVNUX1RFU1RfVEVTVCIsICJ0ZXN0VEVTVFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCJURVNUX1RFU1RfVEVTVCIsICJUZXN0VEVTVFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCJURVNUX1RFU1RfVEVTVF9UIiwgIlRlc3RURVNUVGVzdFQiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdCIsIDQ0KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3QiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdCIsIDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVEVTVCIsIDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURSIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRFU1QiLCAyKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA5KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVMiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIsIDgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIsIDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUXyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IiwgNSkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VGVzdCIsIDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VGVzdCIsIDExMDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1RfIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRFU1RUZXN0IiwgMTApKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RURVNUVGVzdCIsIDE0KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUX1RFU1RfVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RURVNUVGVzdFQiLCAxNikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUXyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RURVNUVGVzdFQiLCAxNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUIiwgInRlc3QiLCA0NCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUIiwgInRlc3QiLCA0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFUyIsICJ0ZXN0IiwgMyk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUIiwgIlRFU1QiLCA1KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFIiwgIlRFU1QiLCAyKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVCIsICJ0ZXN0VGVzdCIsIDkpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVMiLCAidGVzdFRlc3QiLCA4KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVCIsICJ0ZXN0VGVzdCIsIDYpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF8iLCAidGVzdFRlc3QiLCA1KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1QiLCAidGVzdFRlc3QiLCA0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIsIDkpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0IiwgMTEwMCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfIiwgInRlc3RURVNUVGVzdCIsIDEwKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUIiwgIlRlc3RURVNUVGVzdCIsIDE0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUX1QiLCAiVGVzdFRFU1RUZXN0VCIsIDE2KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUXyIsICJUZXN0VEVTVFRlc3RUIiwgMTUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbWF4KSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihzdHJpbmcsIG1heCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1QiLCAidGVzdCIsIDQ0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1QiLCAidGVzdCIsIDQpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTIiwgInRlc3QiLCAzKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1QiLCAiVEVTVCIsIDUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEUiLCAiVEVTVCIsIDIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUIiwgInRlc3RUZXN0IiwgOSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUX1RFUyIsICJ0ZXN0VGVzdCIsIDgpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9UIiwgInRlc3RUZXN0IiwgNik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUXyIsICJ0ZXN0VGVzdCIsIDUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVCIsICJ0ZXN0VGVzdCIsIDQpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0IiwgOSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiLCAxMTAwKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF8iLCAidGVzdFRFU1RUZXN0IiwgMTApOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUX1RFU1QiLCAiVGVzdFRFU1RUZXN0IiwgMTQpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUX1RFU1RfVCIsICJUZXN0VEVTVFRlc3RUIiwgMTYpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUX1RFU1RfIiwgIlRlc3RURVNUVGVzdFQiLCAxNSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBtYXgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCBtYXgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoKSB7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfX19fIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJUZVNUIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX1RFU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfX19URVNUIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX1RFU1QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVF9URVNUIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9URVNUX1RFU1QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9URVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9fVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlTG93ZXJjYXNlKCkgewotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0XyIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X19fXyIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0IiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF90ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X19fdGVzdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF90ZXN0IiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3RfdGVzdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfdGVzdF90ZXN0IiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfdGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfX3Rlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl90ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX190ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAiVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgIlRFU1RfIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAiVEVTVF9fX18iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdCIsICJURVNUIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJUZVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0IiwgIlRFU1RfVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdCIsICJURVNUX19fVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdCIsICJURVNUX1RFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3QiLCAiVEVTVF9URVNUX1RFU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0IiwgIlRFU1RfVEVTVF9URVNUIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0VCIsICJURVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAiX1RFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0VCIsICJfX1RFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0VCIsICJURVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0VCIsICJfVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAiX19URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXJMb3dlcmNhc2UoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJ0ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAidGVzdF8iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJ0ZXN0X19fXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0IiwgInRlc3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgInRlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3QiLCAidGVzdF90ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0IiwgInRlc3RfX190ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0IiwgInRlc3RfdGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdCIsICJ0ZXN0X3Rlc3RfdGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3QiLCAidGVzdF90ZXN0X3Rlc3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgInRlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0VCIsICJfdGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgInRlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIl90ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0VCIsICJfX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oc3RyaW5nLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAiVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgIlRFU1RfIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAiVEVTVF9fX18iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdCIsICJURVNUIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJUZVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0IiwgIlRFU1RfVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdCIsICJURVNUX19fVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdCIsICJURVNUX1RFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3QiLCAiVEVTVF9URVNUX1RFU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0IiwgIlRFU1RfVEVTVF9URVNUIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0VCIsICJURVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdFQiLCAiX1RFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0VCIsICJfX1RFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0VCIsICJURVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0VCIsICJfVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdFQiLCAiX19URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXJMb3dlcmNhc2UoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJ0ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAidGVzdF8iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJ0ZXN0X19fXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0IiwgInRlc3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgInRlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3QiLCAidGVzdF90ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0IiwgInRlc3RfX190ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0IiwgInRlc3RfdGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdCIsICJ0ZXN0X3Rlc3RfdGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3QiLCAidGVzdF90ZXN0X3Rlc3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgInRlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0VCIsICJfdGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgInRlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIl90ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0VCIsICJfX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihzdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNDI4MzkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEJvb2xlYW5UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIHZvbGF0aWxlIFN5bmNocm9uaXplZEJvb2xlYW4gc2I7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGV4Q2F1Z2h0OwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiB0aW1lb3V0T2NjdXJyZWQ7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBsb25nIHN0YXJ0VGltZTsKLQlwcml2YXRlIHZvbGF0aWxlIGxvbmcgZW5kVGltZTsKLQotCi0JcHVibGljIFN5bmNocm9uaXplZEJvb2xlYW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNiID0gbmV3IFN5bmNocm9uaXplZEJvb2xlYW4oKTsKLQkJdGhpcy5leENhdWdodCA9IGZhbHNlOwotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IGZhbHNlOwotCQl0aGlzLnN0YXJ0VGltZSA9IDA7Ci0JCXRoaXMuZW5kVGltZSA9IDA7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IudmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQotCQl0aGlzLnNiLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IudmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc1RydWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQotCQl0aGlzLnNiLnNldEZhbHNlKCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IudmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQotCQl0aGlzLnNiLnNldFRydWUoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLnZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmlzRmFsc2UoKSk7Ci0KLQkJYXNzZXJ0U2FtZSh0aGlzLnNiLCB0aGlzLnNiLm11dGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRWYWx1ZShmYWxzZSk7Ci0JCVN5bmNocm9uaXplZEJvb2xlYW4gc2IyID0gbmV3IFN5bmNocm9uaXplZEJvb2xlYW4oZmFsc2UpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zYiwgc2IyKTsKLQotCQl0aGlzLnNiLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmVxdWFscyhzYjIpKTsKLQotCQlzYjIuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnNiLCBzYjIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKLQkJdGhpcy5zYi5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNiLmhhc2hDb2RlKCkpOwotCi0JCXRoaXMuc2Iuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLnNiLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsVHJ1ZSgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBieSB0MgotCQlhc3NlcnRUcnVlKHRoaXMuc2IudmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVsYXBzZWRUaW1lKCkgPiAxNTApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxUcnVlVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRVbnRpbFRydWUoMjApOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSB3aWxsIGV2ZW50dWFsbHkgYmUgc2V0IHRvIHRydWUgYnkgdDEKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLnZhbHVlKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5lbGFwc2VkVGltZSgpIDwgMTUwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFVudGlsVHJ1ZShsb25nIHRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldEZhbHNlKCk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRTZXRUcnVlQ29tbWFuZCgpLCB0aGlzLnNiLCAyMDApOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkV2FpdFVudGlsVHJ1ZUNvbW1hbmQodGltZW91dCksIHRoaXMuc2IsIDApOwotCQlUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gbmV3IFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7Ci0JCQlUaHJlYWQuc2xlZXAoNTApOwotCQl9Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9TZXRGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1NldEZhbHNlKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBmYWxzZSBieSB0MgotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLnZhbHVlKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5lbGFwc2VkVGltZSgpID4gMTUwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvU2V0RmFsc2VUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0RmFsc2UoMjApOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSB3aWxsIGV2ZW50dWFsbHkgYmUgc2V0IHRvIHRydWUgYnkgdDEKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLnZhbHVlKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5lbGFwc2VkVGltZSgpIDwgMTUwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFRvU2V0RmFsc2UobG9uZyB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRGYWxzZSgpOwotCQlSdW5uYWJsZSByMSA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkU2V0VHJ1ZUNvbW1hbmQoKSwgdGhpcy5zYiwgMjAwKTsKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZFdhaXRUb1NldEZhbHNlQ29tbWFuZCh0aW1lb3V0KSwgdGhpcy5zYiwgMCk7Ci0JCVRocmVhZCB0MSA9IG5ldyBUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLQkJCVRocmVhZC5zbGVlcCg1MCk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2UodGhpcy5leENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkU2V0VHJ1ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkQm9vbGVhbiBzeW5jQm9vbCkgewotCQkJCXN5bmNCb29sLnNldFRydWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VW50aWxUcnVlQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRCb29sZWFuIHN5bmNCb29sKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMudGhpcy5zZXRTdGFydFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnNldFRpbWVvdXRPY2N1cnJlZCggISBzeW5jQm9vbC53YWl0VW50aWxUcnVlKHRpbWVvdXQpKTsKLQkJCQlTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMudGhpcy5zZXRFbmRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9TZXRGYWxzZUNvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkQm9vbGVhbiBzeW5jQm9vbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkQm9vbGVhblRlc3RzLnRoaXMuc2V0U3RhcnRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCQlTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMudGhpcy5zZXRUaW1lb3V0T2NjdXJyZWQoICEgc3luY0Jvb2wud2FpdFRvU2V0RmFsc2UodGltZW91dCkpOwotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnNldEVuZFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wsIGZpbmFsIGxvbmcgc2xlZXApIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoc2xlZXAgIT0gMCkgewotCQkJCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCQkJfQotCQkJCQljb21tYW5kLmV4ZWN1dGUoc3luY0Jvb2wpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMudGhpcy5zZXRFeENhdWdodCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCBzZXRFeENhdWdodChib29sZWFuIGV4Q2F1Z2h0KSB7Ci0JCXRoaXMuZXhDYXVnaHQgPSBleENhdWdodDsKLQl9Ci0KLQl2b2lkIHNldFRpbWVvdXRPY2N1cnJlZChib29sZWFuIHRpbWVvdXRPY2N1cnJlZCkgewotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IHRpbWVvdXRPY2N1cnJlZDsKLQl9Ci0KLQl2b2lkIHNldFN0YXJ0VGltZShsb25nIHN0YXJ0VGltZSkgewotCQl0aGlzLnN0YXJ0VGltZSA9IHN0YXJ0VGltZTsKLQl9Ci0KLQl2b2lkIHNldEVuZFRpbWUobG9uZyBlbmRUaW1lKSB7Ci0JCXRoaXMuZW5kVGltZSA9IGVuZFRpbWU7Ci0JfQotCi0JbG9uZyBlbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wpIHRocm93cyBFeGNlcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NzNhYTIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRPYmplY3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRPYmplY3RUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIHZvbGF0aWxlIFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNvOwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBleENhdWdodDsKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gdGltZW91dE9jY3VycmVkOwotCXZvbGF0aWxlIE9iamVjdCB2YWx1ZSA9IG5ldyBPYmplY3QoKTsKLQlwcml2YXRlIHZvbGF0aWxlIGxvbmcgc3RhcnRUaW1lOwotCXByaXZhdGUgdm9sYXRpbGUgbG9uZyBlbmRUaW1lOwotCXByaXZhdGUgdm9sYXRpbGUgT2JqZWN0IHNvVmFsdWU7Ci0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRPYmplY3RUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNvID0gbmV3IFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+KCk7Ci0JCXRoaXMuZXhDYXVnaHQgPSBmYWxzZTsKLQkJdGhpcy50aW1lb3V0T2NjdXJyZWQgPSBmYWxzZTsKLQkJdGhpcy5zdGFydFRpbWUgPSAwOwotCQl0aGlzLmVuZFRpbWUgPSAwOwotCQl0aGlzLnNvVmFsdWUgPSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzb3JzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc28uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5zby52YWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zby5pc05vdE51bGwoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zby5pc051bGwoKSk7Ci0KLQkJdGhpcy5zby5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUsIHRoaXMuc28udmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zby5pc05vdE51bGwoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc28uaXNOdWxsKCkpOwotCi0JCXRoaXMuc28uc2V0TnVsbCgpOwotCQlhc3NlcnROdWxsKHRoaXMuc28udmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc28uaXNOb3ROdWxsKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOdWxsKCkpOwotCi0JCWFzc2VydFNhbWUodGhpcy5zbywgdGhpcy5zby5tdXRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc28uc2V0VmFsdWUobnVsbCk7Ci0JCVN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNvMiA9IG5ldyBTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PihudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc28sIHNvMik7Ci0KLQkJdGhpcy5zby5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zby5lcXVhbHMoc28yKSk7Ci0KLQkJc28yLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zbywgc28yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCXRoaXMuc28uc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLmhhc2hDb2RlKCksIHRoaXMuc28uaGFzaENvZGUoKSk7Ci0KLQkJdGhpcy5zby5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc28uaGFzaENvZGUoKSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCB0MSBzZXRzIHRoZSB2YWx1ZSB0byBudWxsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VW50aWxOdWxsKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBudWxsIGJ5IHQyCi0JCWFzc2VydE51bGwodGhpcy5zby52YWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGVhcmx5IChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPiAxNTApOiAiICsgdGltZSwgdGltZSA+IDE1MCk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB0aW1lIG91dCB3YWl0aW5nIGZvciB0MSB0byBzZXQgdGhlIHZhbHVlIHRvIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFVudGlsTnVsbFRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VW50aWxOdWxsKDIwKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgd2lsbCBldmVudHVhbGx5IGJlIHNldCB0byBudWxsIGJ5IHQxCi0JCWFzc2VydE51bGwodGhpcy5zby52YWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGxhdGUgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA8IDE1MCk6ICIgKyB0aW1lLCB0aW1lIDwgMTUwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFVudGlsTnVsbChsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldE51bGxDb21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VW50aWxOdWxsQ29tbWFuZCh0MlRpbWVvdXQpKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIHQxIHNldHMgdGhlIHZhbHVlIHRvIG51bGw7Ci0JICogdGhlbiB0MiB3aWxsIHNldCB0aGUgdmFsdWUgdG8gYW4gb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0VmFsdWUoMCk7Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIGFuIG9iamVjdCBieSB0MgotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOb3ROdWxsKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuZWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgZWFybHkgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA+IDE1MCk6ICIgKyB0aW1lLCB0aW1lID4gMTUwKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHRpbWUgb3V0IHdhaXRpbmcgZm9yIHQxIHRvIHNldCB0aGUgdmFsdWUgdG8gbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9TZXRWYWx1ZVRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9TZXRWYWx1ZSgyMCk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gbnVsbCBieSB0MQotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOdWxsKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuZWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgbGF0ZSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlIDwgMTUwKTogIiArIHRpbWUsIHRpbWUgPCAxNTApOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9TZXRWYWx1ZShsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldE51bGxDb21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VG9TZXRWYWx1ZUNvbW1hbmQodDJUaW1lb3V0KSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IHVudGlsIHQxIGlzIGZpbmlzaGVkICJpbml0aWFsaXppbmciIHRoZSB2YWx1ZTsKLQkgKiB0aGVuIHQyIHdpbGwgZ2V0IHRoZSBuZXdseS1pbml0aWFsaXplZCB2YWx1ZSAoImZvbyIpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zby5zZXRWYWx1ZShudWxsKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZEluaXRpYWxpemVWYWx1ZUNvbW1hbmQoKSwgdGhpcy5zbywgMCk7Ci0JCS8vIGdpdmUgdDEgYSBoZWFkIHN0YXJ0IG9mIDEwMCBtcwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkR2V0VmFsdWVDb21tYW5kKCksIHRoaXMuc28sIDEwMCk7Ci0JCVRocmVhZCB0MSA9IG5ldyBUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLQkJCVRocmVhZC5zbGVlcCg1MCk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2UodGhpcy5leENhdWdodCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zby52YWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnNvVmFsdWUpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuZWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgZWFybHkgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA+IDEwMCk6ICIgKyB0aW1lLCB0aW1lID4gMzAwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZVRocmVhZHMoQ29tbWFuZCB0MUNvbW1hbmQsIENvbW1hbmQgdDJDb21tYW5kKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zby5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodDFDb21tYW5kLCB0aGlzLnNvLCAyMDApOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0MkNvbW1hbmQsIHRoaXMuc28sIDApOwotCQlUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gbmV3IFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7Ci0JCQlUaHJlYWQuc2xlZXAoNTApOwotCQl9Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFNldE51bGxDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHsKLQkJCQlzT2JqZWN0LnNldE51bGwoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VW50aWxOdWxsQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzT2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNldFN0YXJ0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zZXRUaW1lb3V0T2NjdXJyZWQoICEgc09iamVjdC53YWl0VW50aWxOdWxsKHRpbWVvdXQpKTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNldEVuZFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFdhaXRUb1NldFZhbHVlQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzT2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNldFN0YXJ0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zZXRUaW1lb3V0T2NjdXJyZWQoICEgc09iamVjdC53YWl0VG9TZXRWYWx1ZShTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnZhbHVlLCB0aW1lb3V0KSk7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zZXRFbmRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRJbml0aWFsaXplVmFsdWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHRocm93cyBFeGNlcHRpb24gewotCQkJCXNPYmplY3QuZXhlY3V0ZSgKLQkJCQkJbmV3IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkNvbW1hbmQoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJCQkJCS8vIHByZXRlbmQgdG8gcGVyZm9ybSBzb21lIGxvbmcgaW5pdGlhbGl6YXRpb24gcHJvY2VzcwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCVRocmVhZC5zbGVlcCg1MDApOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNldEV4Q2F1Z2h0KHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQlzT2JqZWN0LnNldFZhbHVlKCJmb28iKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkR2V0VmFsdWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHRocm93cyBFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuc2V0U3RhcnRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNldFNPVmFsdWUoc09iamVjdC52YWx1ZSgpKTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNldEVuZFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QsIGZpbmFsIGxvbmcgc2xlZXApIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoc2xlZXAgIT0gMCkgewotCQkJCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCQkJfQotCQkJCQljb21tYW5kLmV4ZWN1dGUoc09iamVjdCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuc2V0RXhDYXVnaHQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgc2V0RXhDYXVnaHQoYm9vbGVhbiBleENhdWdodCkgewotCQl0aGlzLmV4Q2F1Z2h0ID0gZXhDYXVnaHQ7Ci0JfQotCi0Jdm9pZCBzZXRUaW1lb3V0T2NjdXJyZWQoYm9vbGVhbiB0aW1lb3V0T2NjdXJyZWQpIHsKLQkJdGhpcy50aW1lb3V0T2NjdXJyZWQgPSB0aW1lb3V0T2NjdXJyZWQ7Ci0JfQotCi0Jdm9pZCBzZXRTdGFydFRpbWUobG9uZyBzdGFydFRpbWUpIHsKLQkJdGhpcy5zdGFydFRpbWUgPSBzdGFydFRpbWU7Ci0JfQotCi0Jdm9pZCBzZXRFbmRUaW1lKGxvbmcgZW5kVGltZSkgewotCQl0aGlzLmVuZFRpbWUgPSBlbmRUaW1lOwotCX0KLQotCXByaXZhdGUgbG9uZyBlbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCXZvaWQgc2V0U09WYWx1ZShPYmplY3Qgc29WYWx1ZSkgewotCQl0aGlzLnNvVmFsdWUgPSBzb1ZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNvKSB0aHJvd3MgRXhjZXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFja1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZFN0YWNrVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRiODNkOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZFN0YWNrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRTdGFjazsKLQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFN0YWNrVGVzdHMgZXh0ZW5kcyBTaW1wbGVTdGFja1Rlc3RzIHsKLQlwcml2YXRlIHZvbGF0aWxlIFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3M7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGV4Q2F1Z2h0OwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiB0aW1lb3V0T2NjdXJyZWQ7Ci0JcHJpdmF0ZSB2b2xhdGlsZSBsb25nIHN0YXJ0VGltZTsKLQlwcml2YXRlIHZvbGF0aWxlIGxvbmcgZW5kVGltZTsKLQlwcml2YXRlIHZvbGF0aWxlIE9iamVjdCBwb3BwZWRPYmplY3Q7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIElURU1fMSA9IG5ldyBTdHJpbmcoKTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElURU1fMiA9IG5ldyBTdHJpbmcoKTsKLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGFja1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3MgPSBuZXcgU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPigpOwotCQl0aGlzLmV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRoaXMudGltZW91dE9jY3VycmVkID0gZmFsc2U7Ci0JCXRoaXMuc3RhcnRUaW1lID0gMDsKLQkJdGhpcy5lbmRUaW1lID0gMDsKLQkJdGhpcy5wb3BwZWRPYmplY3QgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHRlc3QgZmlyc3Qgd2l0aCBhbiB1bnN5bmNocm9uaXplZCBzdGFjaywKLQkgKiB0aGVuIHdpdGggYSBzeW5jaHJvbml6ZWQgc3RhY2sKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVudEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUNvbmN1cnJlbnRBY2Nlc3MobmV3IFNsb3dTaW1wbGVTdGFjazxTdHJpbmc+KCksICJzZWNvbmQiKTsKLQkJdGhpcy52ZXJpZnlDb25jdXJyZW50QWNjZXNzKG5ldyBTbG93U3luY2hyb25pemVkU3RhY2s8U3RyaW5nPigpLCAiZmlyc3QiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29uY3VycmVudEFjY2VzcyhTbG93U3RhY2s8U3RyaW5nPiBzbG93U3RhY2ssIFN0cmluZyBleHBlY3RlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNsb3dTdGFjay5wdXNoKCJmaXJzdCIpOwotCQlzbG93U3RhY2sucHVzaCgic2Vjb25kIik7Ci0KLQkJbmV3IFRocmVhZCh0aGlzLmJ1aWxkUnVubmFibGUoc2xvd1N0YWNrKSkuc3RhcnQoKTsKLQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzbG93U3RhY2sucG9wKCkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBTbG93U3RhY2s8U3RyaW5nPiBzbG93U3RhY2spIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzbG93U3RhY2suc2xvd1BvcCgpOwotCQkJfQotCQl9OwotCX0KLQotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgU2xvd1N0YWNrPEU+IGV4dGVuZHMgU3RhY2s8RT4gewotCQlPYmplY3Qgc2xvd1BvcCgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgU2xvd1NpbXBsZVN0YWNrPEU+IGV4dGVuZHMgU2ltcGxlU3RhY2s8RT4gaW1wbGVtZW50cyBTbG93U3RhY2s8RT4gewotCQlTbG93U2ltcGxlU3RhY2soKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBPYmplY3Qgc2xvd1BvcCgpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLnBvcCgpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNsb3dTeW5jaHJvbml6ZWRTdGFjazxFPiBleHRlbmRzIFN5bmNocm9uaXplZFN0YWNrPEU+IGltcGxlbWVudHMgU2xvd1N0YWNrPEU+IHsKLQkJU2xvd1N5bmNocm9uaXplZFN0YWNrKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBzbG93UG9wKCkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQkJcmV0dXJuIHRoaXMucG9wKCk7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiB3YWl0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvUG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvUG9wKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCBhbiBpdGVtIHNob3VsZCBoYXZlIGJlZW4gcG9wcGVkIGJ5IHQyLi4uCi0JCWFzc2VydFNhbWUoSVRFTV8xLCB0aGlzLnBvcHBlZE9iamVjdCk7Ci0JCS8vIC4uLmFuZCB0aGUgc3RhY2sgc2hvdWxkIGJlIGVtcHR5Ci0JCWFzc2VydFRydWUodGhpcy5zcy5pc0VtcHR5KCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5lbGFwc2VkVGltZSgpID4gMTUwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvUG9wVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1BvcCgyMCk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHN0YWNrIHdhcyBuZXZlciBwb3BwZWQuLi4KLQkJYXNzZXJ0TnVsbCh0aGlzLnBvcHBlZE9iamVjdCk7Ci0JCS8vIC4uLmFuZCBpdCBzdGlsbCBob2xkcyB0aGUgaXRlbQotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5zcy5wZWVrKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5lbGFwc2VkVGltZSgpIDwgMTUwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFRvUG9wKGxvbmcgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRQdXNoQ29tbWFuZCgpLCB0aGlzLnNzLCAyMDApOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkV2FpdFRvUG9wQ29tbWFuZCh0aW1lb3V0KSwgdGhpcy5zcywgMCk7Ci0JCVRocmVhZCB0MSA9IG5ldyBUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLQkJCVRocmVhZC5zbGVlcCg1MCk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2UodGhpcy5leENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1B1c2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9QdXNoKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgc3RhY2sgZ2V0cyBwb3BwZWQgYnkgdDEuLi4KLQkJYXNzZXJ0U2FtZShJVEVNXzEsIHRoaXMucG9wcGVkT2JqZWN0KTsKLQkJLy8gLi4uYW5kIGFuIGl0ZW0gaXMgcHVzaGVkIG9uIHRvIHRoZSBzdGFjayBieSB0MgotCQlhc3NlcnRGYWxzZSh0aGlzLnNzLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFNhbWUoSVRFTV8yLCB0aGlzLnNzLnBlZWsoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVsYXBzZWRUaW1lKCkgPiAxNTApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9QdXNoVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1B1c2goMjApOwotCQkvLyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRUcnVlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSBzdGFjayBpcyBldmVudHVhbGx5IHBvcHBlZCBieSB0MS4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5wb3BwZWRPYmplY3QpOwotCQkvLyAuLi5idXQgbm90aGluZyBpcyBwdXNoZWQgb24gdG8gdGhlIHN0YWNrIGJ5IHQyCi0JCWFzc2VydFRydWUodGhpcy5zcy5pc0VtcHR5KCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5lbGFwc2VkVGltZSgpIDwgMTUwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFRvUHVzaChsb25nIHRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNzLnB1c2goSVRFTV8xKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZFBvcENvbW1hbmQoKSwgdGhpcy5zcywgMjAwKTsKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZFdhaXRUb1B1c2hDb21tYW5kKHRpbWVvdXQpLCB0aGlzLnNzLCAwKTsKLQkJVGhyZWFkIHQxID0gbmV3IFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IG5ldyBUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl3aGlsZSAodDEuaXNBbGl2ZSgpIHx8IHQyLmlzQWxpdmUoKSkgewotCQkJVGhyZWFkLnNsZWVwKDUwKTsKLQkJfQotCQlhc3NlcnRGYWxzZSh0aGlzLmV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRQdXNoQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHN5bmNocm9uaXplZFN0YWNrKSB7Ci0JCQkJc3luY2hyb25pemVkU3RhY2sucHVzaChJVEVNXzEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFdhaXRUb1BvcENvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzeW5jaHJvbml6ZWRTdGFjaykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnNldFN0YXJ0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnNldFBvcHBlZE9iamVjdChzeW5jaHJvbml6ZWRTdGFjay53YWl0VG9Qb3AodGltZW91dCkpOwotCQkJCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZXgpIHsKLQkJCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnNldFRpbWVvdXRPY2N1cnJlZCh0cnVlKTsKLQkJCQl9Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnNldEVuZFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFBvcENvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzeW5jaHJvbml6ZWRTdGFjaykgewotCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5zZXRQb3BwZWRPYmplY3Qoc3luY2hyb25pemVkU3RhY2sucG9wKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFdhaXRUb1B1c2hDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHRocm93cyBFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5zZXRTdGFydFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5zZXRUaW1lb3V0T2NjdXJyZWQoICEgc3luY2hyb25pemVkU3RhY2sud2FpdFRvUHVzaChJVEVNXzIsIHRpbWVvdXQpKTsKLQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMuc2V0RW5kVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIENvbW1hbmQgY29tbWFuZCwgZmluYWwgU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzeW5jaHJvbml6ZWRTdGFjaywgZmluYWwgbG9uZyBzbGVlcCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChzbGVlcCAhPSAwKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoc2xlZXApOwotCQkJCQl9Ci0JCQkJCWNvbW1hbmQuZXhlY3V0ZShzeW5jaHJvbml6ZWRTdGFjayk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5zZXRFeENhdWdodCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCBzZXRFeENhdWdodChib29sZWFuIGV4Q2F1Z2h0KSB7Ci0JCXRoaXMuZXhDYXVnaHQgPSBleENhdWdodDsKLQl9Ci0KLQl2b2lkIHNldFRpbWVvdXRPY2N1cnJlZChib29sZWFuIHRpbWVvdXRPY2N1cnJlZCkgewotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IHRpbWVvdXRPY2N1cnJlZDsKLQl9Ci0KLQl2b2lkIHNldFN0YXJ0VGltZShsb25nIHN0YXJ0VGltZSkgewotCQl0aGlzLnN0YXJ0VGltZSA9IHN0YXJ0VGltZTsKLQl9Ci0KLQl2b2lkIHNldEVuZFRpbWUobG9uZyBlbmRUaW1lKSB7Ci0JCXRoaXMuZW5kVGltZSA9IGVuZFRpbWU7Ci0JfQotCi0Jdm9pZCBzZXRQb3BwZWRPYmplY3QoT2JqZWN0IHBvcHBlZE9iamVjdCkgewotCQl0aGlzLnBvcHBlZE9iamVjdCA9IHBvcHBlZE9iamVjdDsKLQl9Ci0KLQlsb25nIGVsYXBzZWRUaW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbmRUaW1lIC0gdGhpcy5zdGFydFRpbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbW1hbmQgaW50ZXJmYWNlICoqKioqKioqKioKLQotCXByaXZhdGUgaW50ZXJmYWNlIENvbW1hbmQgewotCQl2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzeW5jaHJvbml6ZWRTdGFjaykgdGhyb3dzIEV4Y2VwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVGVzdFRvb2xzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1Rlc3RUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2ZlMTk4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVGVzdFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdEZhaWx1cmU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7Ci0KLS8qKgotICogdmFyaW91cyB0b29scyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRlc3QgY2FzZXMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RUb29scyB7Ci0KLQkvKioKLQkgKiB0ZXN0IGFuIG9iamVjdCdzIGltcGxlbWVudGF0aW9uIG9mIFNlcmlhbGl6YWJsZSBieSBzZXJpYWxpemluZyB0aGUKLQkgKiBzcGVjaWZpZWQgb2JqZWN0IHRvIGEgYnl0ZSBhcnJheTsgdGhlbiBkZS1zZXJpYWxpemluZyB0aGUgYnl0ZSBhcnJheSBhbmQKLQkgKiByZXR1cm5pbmcgdGhlIHJlc3VsdGFudCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIHNlcmlhbGl6ZShUIG8pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYU91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMjAwMCk7Ci0JCU9iamVjdE91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhT3V0U3RyZWFtKTsKLQkJb3V0U3RyZWFtLndyaXRlT2JqZWN0KG8pOwotCQlvdXRTdHJlYW0uY2xvc2UoKTsKLQotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYUluU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhT3V0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQlPYmplY3RJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiYUluU3RyZWFtKTsKLQkJVCBvMiA9IHJlYWRPYmplY3QoaW5TdHJlYW0pOwotCQlpblN0cmVhbS5jbG9zZSgpOwotCi0JCXJldHVybiBvMjsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyA8VD4gVCByZWFkT2JqZWN0KE9iamVjdElucHV0IG9iamVjdElucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gKFQpIG9iamVjdElucHV0LnJlYWRPYmplY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiByZWRpcmVjdCBzdGQgb3V0IGFuZCBzdGQgZXJyIHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZGlyZWN0U3lzdGVtU3RyZWFtc1RvKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsKLQkJcmVkaXJlY3RTeXN0ZW1TdHJlYW1zVG8obmV3IFByaW50U3RyZWFtKG91dHB1dFN0cmVhbSkpOwotCX0KLQotCS8qKgotCSAqIHJlZGlyZWN0IHN0ZCBvdXQgYW5kIHN0ZCBlcnIgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVkaXJlY3RTeXN0ZW1TdHJlYW1zVG8oUHJpbnRTdHJlYW0gcHJpbnRTdHJlYW0pIHsKLQkJU3lzdGVtLnNldE91dChwcmludFN0cmVhbSk7Ci0JCVN5c3RlbS5zZXRFcnIocHJpbnRTdHJlYW0pOwotCX0KLQotCS8qKgotCSAqIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCB0ZXN0IGFuZCBkdW1wIHRoZSByZXN1bHRzIHRvIHRoZSBjb25zb2xlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhlY3V0ZShUZXN0Q2FzZSB0ZXN0Q2FzZSkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCVRlc3RSZXN1bHQgcmVzdWx0ID0gdGVzdENhc2UucnVuKCk7Ci0JCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcik7Ci0JCXdyaXRlci5wcmludCh0ZXN0Q2FzZS5nZXROYW1lKCkpOwotCQl3cml0ZXIucHJpbnQoIjogIik7Ci0JCWlmIChyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpKSB7Ci0JCQl3cml0ZXIucHJpbnRsbigiT0siKTsKLQkJfSBlbHNlIHsKLQkJCVRlc3RGYWlsdXJlIGZhaWx1cmUgPSBudWxsOwotCQkJaWYgKHJlc3VsdC5mYWlsdXJlcygpLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJZmFpbHVyZSA9IChUZXN0RmFpbHVyZSkgcmVzdWx0LmZhaWx1cmVzKCkubmV4dEVsZW1lbnQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmFpbHVyZSA9IChUZXN0RmFpbHVyZSkgcmVzdWx0LmVycm9ycygpLm5leHRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlmYWlsdXJlLnRocm93bkV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOwotCQl9Ci0JCXdyaXRlci5wcmludCgiZWxhcHNlZCB0aW1lOiAiKTsKLQkJbG9uZyBlbGFwc2VkID0gZW5kIC0gc3RhcnQ7Ci0JCXdyaXRlci5wcmludChlbGFwc2VkIC8gMTAwMEwpOwotCQl3cml0ZXIucHJpbnRsbigiIHNlYy4iKTsKLQkJcmV0dXJuIHN0cmluZ1dyaXRlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPFRlc3RDYXNlPiBUZXN0Q2FzZV9jbGFzcyA9IFRlc3RDYXNlLmNsYXNzOwotCi0JLyoqCi0JICogQ2xlYXIgb3V0IGFsbCB0aGUgaW5zdGFuY2UgdmFyaWFibGUgb2YgdGhlIHNwZWNpZmllZCB0ZXN0IGNhc2UsIGFsbG93aW5nCi0JICogdGhlIHZhcmlvdXMgdGVzdCBmaXh0dXJlcyB0byBiZSBnYXJiYWdlLWNvbGxlY3RlZC4gVHlwaWNhbGx5IHRoaXMgaXMKLQkgKiBjYWxsZWQgaW4gdGhlICN0ZWFyRG93bigpIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXIoVGVzdENhc2UgdGVzdENhc2UpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLQkJZm9yIChDbGFzczw/PiB0ZW1wQ2xhc3MgPSB0ZXN0Q2FzZS5nZXRDbGFzcygpOyB0ZW1wQ2xhc3MgIT0gVGVzdENhc2VfY2xhc3M7IHRlbXBDbGFzcyA9IHRlbXBDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCUZpZWxkW10gZmllbGRzID0gdGVtcENsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCQlmb3IgKGludCBpID0gZmllbGRzLmxlbmd0aDsgaS0tID4gMDspIHsKLQkJCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJCQkvLyBsZWF2ZSBwcmltaXRpdmVzIGFsb25lIC0gdGhleSBkb24ndCBnZXQgZ2FyYmFnZS1jb2xsZWN0ZWQsIGFuZCB3ZSBjYW4ndCBzZXQgdGhlbSB0byBudWxsLi4uCi0JCQkJaWYgKGZpZWxkLmdldFR5cGUoKS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkvLyBsZWF2ZSBzdGF0aWMgZmllbGRzIGFsb25lICg/KQotCQkJCWlmIChNb2RpZmllci5pc1N0YXRpYyhmaWVsZC5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCQkJZmllbGQuc2V0KHRlc3RDYXNlLCBudWxsKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFdvcmthcm91bmQgZm9yIGEgSlVuaXQgYnVnOiBKVW5pdCBkb2VzIG5vdCBjb25maWd1cmUgdGhlIHRlc3RpbmcgVGhyZWFkCi0JICogd2l0aCBhIGNvbnRleHQgY2xhc3MgbG9hZGVyLiBUaGlzIHNob3VsZCBwcm9iYWJseSBoYXBwZW4gaW4KLQkgKiBUZXN0UnVubmVyLmRvUnVuVGVzdChUZXN0KSwganVzdCBiZWZvcmUgc3RhcnRpbmcgdGhlIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBKVW5pdFRocmVhZENvbnRleHRDbGFzc0xvYWRlcigpIHsKLQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoVGVzdFRvb2xzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotCX0KLQotCXByaXZhdGUgVGVzdFRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvWE1MU3RyaW5nRW5jb2RlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjEwNGI5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvWE1MU3RyaW5nRW5jb2RlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5GaWxlVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuWE1MU3RyaW5nRW5jb2RlcjsKLQotcHVibGljIGNsYXNzIFhNTFN0cmluZ0VuY29kZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBYTUxTdHJpbmdFbmNvZGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVuY29kZU5vQ2hhcmFjdGVyU2VxdWVuY2VzKCkgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQotCQlTdHJpbmcgcyA9ICJmb28iOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5lbmNvZGUocykpOwotCi0JCXMgPSAiMTIzZm9vMTIzIjsKLQkJYXNzZXJ0RXF1YWxzKHMsIGVuY29kZXIuZW5jb2RlKHMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlQ2hhcmFjdGVyU2VxdWVuY2VzKCkgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQotCQlTdHJpbmcgcyA9ICI/Zm9vPyI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICImI3gzZjtmb28mI3gzZjsiOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGVuY29kZXIuZW5jb2RlKHMpKTsKLQotCQlzID0gIj9mb28mMTIzIjsKLQkJZXhwZWN0ZWQgPSAiJiN4M2Y7Zm9vJiN4MjY7MTIzIjsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBlbmNvZGVyLmVuY29kZShzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlbm9ybWFsaXplVmFsaWRGaWxlTmFtZSgpIHsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0KLQkJU3RyaW5nIHMgPSAiZm9vIjsKLQkJYXNzZXJ0RXF1YWxzKHMsIGVuY29kZXIuZGVjb2RlKHMpKTsKLQotCQlzID0gIjEyM2ZvbzEyMyI7Ci0JCWFzc2VydEVxdWFscyhzLCBlbmNvZGVyLmRlY29kZShzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlbm9ybWFsaXplSW52YWxpZEZpbGVOYW1lKCkgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQotCQlTdHJpbmcgcyA9ICImI3gzZjtmb28mI3gzZjsiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiP2Zvbz8iOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGVuY29kZXIuZGVjb2RlKHMpKTsKLQotCQlzID0gIiYjeDNmO2ZvbyYjeDI2OzEyMyI7Ci0JCWV4cGVjdGVkID0gIj9mb28mMTIzIjsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBlbmNvZGVyLmRlY29kZShzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdW5kVHJpcE5vQ2hhcmFjdGVyU2VxdWVuY2VzKCkgewotCQl0aGlzLnZlcmlmeVJvdW5kVHJpcCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5Um91bmRUcmlwKCIxMjNmb280NTYiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um91bmRUcmlwQ2hhcmFjdGVyU2VxdWVuY2VzKCkgewotCQl0aGlzLnZlcmlmeVJvdW5kVHJpcCgiP2Zvbz8iKTsKLQkJdGhpcy52ZXJpZnlSb3VuZFRyaXAoIj9mb28mMTIzJiYmJiYmPj4+PiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSb3VuZFRyaXAoU3RyaW5nIHMpIHsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0JCVN0cmluZyBhY3R1YWwgPSBlbmNvZGVyLmVuY29kZShzKTsKLQkJYXNzZXJ0RXF1YWxzKHMsIGVuY29kZXIuZGVjb2RlKGFjdHVhbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2UxKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZm9vJiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2UyKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZm9vJiMiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlMygpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyYjeCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2U0KCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZm9vJiN4MyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2U1KCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZm9vJiN4OyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2U2KCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZm9vJkEiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlNygpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyYjQSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXMgPSBlbmNvZGVyLmRlY29kZShzKTsKLQkJCWZhaWwocyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2U4KCkgewotCQlTdHJpbmcgcyA9ICJmb28mI3haWlpaOyI7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzID0gZW5jb2Rlci5kZWNvZGUocyk7Ci0JCQlmYWlsKHMpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMzA5YzMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXJyYXlJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEFycmF5SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkQXJyYXkoKS5sZW5ndGgsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsICsraSwgSW50ZWdlci5wYXJzZUludChzdHJlYW0ubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigtMSwgMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbig4LCAxKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIC0xKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIDkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmljcygpIHsKLQkJSW50ZWdlcltdIGludGVnZXJzID0gbmV3IEludGVnZXJbM107Ci0JCWludGVnZXJzWzBdID0gbmV3IEludGVnZXIoMCk7Ci0JCWludGVnZXJzWzFdID0gbmV3IEludGVnZXIoMSk7Ci0JCWludGVnZXJzWzJdID0gbmV3IEludGVnZXIoMik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxOdW1iZXI+IHN0cmVhbSA9IG5ldyBBcnJheUl0ZXJhdG9yPE51bWJlcj4oaW50ZWdlcnMpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoaW50ZWdlcnMubGVuZ3RoLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFyYXJncygpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE51bWJlcj4gc3RyZWFtID0gbmV3IEFycmF5SXRlcmF0b3I8TnVtYmVyPihuZXcgSW50ZWdlcigwKSwgbmV3IEludGVnZXIoMSksIG5ldyBJbnRlZ2VyKDIpKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDMsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKHN0YXJ0LCBsZW5ndGgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmVhbSwgZXhDYXVnaHQpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYXRvcih0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGFycmF5KTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmF0b3IodGhpcy5idWlsZEFycmF5KCksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihTdHJpbmdbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlTdHJpbmdbXSBidWlsZEFycmF5KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIgfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjYWI4Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBcnJheUxpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgQXJyYXlJdGVyYXRvclRlc3RzIHsKLQotCXB1YmxpYyBBcnJheUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRBcnJheSgpLmxlbmd0aCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWludCBpID0gdGhpcy5idWlsZEFycmF5KCkubGVuZ3RoOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIGktLSwgSW50ZWdlci5wYXJzZUludChzdHJlYW0ucHJldmlvdXMoKSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleCgpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzSW5kZXgoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25BZGQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoIjMiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5hZGQoIjMuNSIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25TZXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoIjMiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5zZXQoInRocmVlIik7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmljcygpIHsKLQkJSW50ZWdlcltdIGludGVnZXJzID0gbmV3IEludGVnZXJbM107Ci0JCWludGVnZXJzWzBdID0gbmV3IEludGVnZXIoMCk7Ci0JCWludGVnZXJzWzFdID0gbmV3IEludGVnZXIoMSk7Ci0JCWludGVnZXJzWzJdID0gbmV3IEludGVnZXIoMik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxOdW1iZXI+IHN0cmVhbSA9IG5ldyBBcnJheUxpc3RJdGVyYXRvcjxOdW1iZXI+KGludGVnZXJzKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGludGVnZXJzLmxlbmd0aCwgaSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFZhcmFyZ3MoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxOdW1iZXI+IHN0cmVhbSA9IG5ldyBBcnJheUxpc3RJdGVyYXRvcjxOdW1iZXI+KG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoMikpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMywgaSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZExpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IodGhpcy5idWlsZEFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRMaXN0SXRlcmF0b3IoU3RyaW5nW10gYXJyYXkpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxTdHJpbmc+KGFycmF5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoU3RyaW5nW10gYXJyYXkpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxTdHJpbmc+KGFycmF5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoU3RyaW5nW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPFN0cmluZz4oYXJyYXksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DaGFpbkl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiM2RiMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DaGFpbkl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNoYWluSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDaGFpbkl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ2xhc3M8Pz5bXSBWRUNUT1JfSElFUkFSQ0hZID0geyBWZWN0b3IuY2xhc3MsIEFic3RyYWN0TGlzdC5jbGFzcywgQWJzdHJhY3RDb2xsZWN0aW9uLmNsYXNzLCBPYmplY3QuY2xhc3MgfTsKLQotCXB1YmxpYyBDaGFpbkl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxDbGFzczw/Pj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhWRUNUT1JfSElFUkFSQ0hZLmxlbmd0aCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoVkVDVE9SX0hJRVJBUkNIWS5sZW5ndGgsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgbGluayIsIFZFQ1RPUl9ISUVSQVJDSFlbaV0sIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgbGluayIsIFZFQ1RPUl9ISUVSQVJDSFlbaV0sIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlDbGFzczw/PiBqYXZhQ2xhc3MgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJamF2YUNsYXNzID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJamF2YUNsYXNzID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGphdmFDbGFzcywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpID09IEFic3RyYWN0Q29sbGVjdGlvbi5jbGFzcykgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxDbGFzczw/Pj4gYnVpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDaGFpbkl0ZXJhdG9yKFZlY3Rvci5jbGFzcywgdGhpcy5idWlsZExpbmtlcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJDaGFpbkl0ZXJhdG9yKFZlY3Rvci5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxDbGFzczw/Pj4gYnVpbGRDaGFpbkl0ZXJhdG9yKENsYXNzPD8+IHN0YXJ0TGluaywgQ2hhaW5JdGVyYXRvci5MaW5rZXI8Q2xhc3M8Pz4+IGxpbmtlcikgewotCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3I8Q2xhc3M8Pz4+KHN0YXJ0TGluaywgbGlua2VyKTsKLQl9Ci0KLQlwcml2YXRlIENoYWluSXRlcmF0b3IuTGlua2VyPENsYXNzPD8+PiBidWlsZExpbmtlcigpIHsKLQkJLy8gY2hhaW4gdXAgdGhlIGNsYXNzJ3MgaGllcmFyY2h5Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvci5MaW5rZXI8Q2xhc3M8Pz4+KCkgewotCQkJcHVibGljIENsYXNzPD8+IG5leHRMaW5rKENsYXNzPD8+IGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIGN1cnJlbnRMaW5rLmdldFN1cGVyY2xhc3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBidWlsZElubmVyQ2hhaW5JdGVyYXRvcihDbGFzczw/PiBzdGFydExpbmspIHsKLQkJLy8gY2hhaW4gdXAgdGhlIGNsYXNzJ3MgaGllcmFyY2h5Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxDbGFzczw/Pj4oc3RhcnRMaW5rKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDbGFzczw/PiBuZXh0TGluayhDbGFzczw/PiBjdXJyZW50TGluaykgewotCQkJCXJldHVybiBjdXJyZW50TGluay5nZXRTdXBlcmNsYXNzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFpbkl0ZXJhdG9yKCkgewotCQkvLyBtaXNzaW5nIG1ldGhvZCBvdmVycmlkZQotCQlJdGVyYXRvcjxDbGFzczw/Pj4gaXRlcmF0b3IgPSBuZXcgQ2hhaW5JdGVyYXRvcjxDbGFzczw/Pj4oVmVjdG9yLmNsYXNzKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ2xhc3M8Pz4gYyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoImludmFsaWQgY2xhc3M6ICIgKyBjLmdldE5hbWUoKSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhZmRiNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQ2xvbmVJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCUNvbGxlY3Rpb248U3RyaW5nPiBvcmlnaW5hbENvbGxlY3Rpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29uY3VycmVudFByb2JsZW07Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gY29uY3VycmVudENvbGxlY3Rpb247Ci0KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBvcmlnaW5hbFNpemUgPSB0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5zaXplKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJLy8gc2hvdWxkIGFsbG93IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0JCQl0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydFRydWUob3JpZ2luYWxTaXplICE9IHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbFNpemUsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRGVmYXVsdCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsaW1pbmF0b3IoKSB7Ci0JCUNsb25lSXRlcmF0b3IuTXV0YXRvcjxTdHJpbmc+IGVsaW1pbmF0b3IgPSBuZXcgQ2xvbmVJdGVyYXRvci5NdXRhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGN1cnJlbnQpIHsKLQkJCQlDbG9uZUl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbENvbGxlY3Rpb24ucmVtb3ZlKGN1cnJlbnQpOwotCQkJfQotCQl9OwotCQl0aGlzLnZlcmlmeVJlbW92ZShuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLCBlbGltaW5hdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVN1YmNsYXNzKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZShuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShTdHJpbmcgY3VycmVudCkgewotCQkJCUNsb25lSXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5yZW1vdmUoY3VycmVudCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFRlc3QgY29uY3VycmVudCBhY2Nlc3M6IEZpcnN0IGJ1aWxkIGEgY2xvbmUgaXRlcmF0b3IgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKLQkgKiB0aGF0IGhhbmdzIG1vbWVudGFyaWx5IGR1cmluZyBpdHMgY29uc3RydWN0aW9uOyB0aGVuIG1vZGlmeSB0aGUgc2hhcmVkCi0JICogY29sbGVjdGlvbiBpbiB0aGlzIHRocmVhZC4gVGhpcyB3b3VsZCBjYXVzZSBhCi0JICogQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpbiB0aGUgb3RoZXIgdGhyZWFkIGlmIHRoZSBjbG9uZSBpdGVyYXRvcgotCSAqIHdlcmUgbm90IHN5bmNocm9uaXplZCBvbiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVudEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTbG93Q29sbGVjdGlvbjxTdHJpbmc+IHNsb3cgPSBuZXcgU2xvd0NvbGxlY3Rpb248U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihzbG93KTsKLQkJLy8gdXNpbmcgdGhlIHVuc3luY2hyb25pemVkIGNvbGxlY3Rpb24gd2lsbCBjYXVzZSB0aGUgdGVzdCB0byBmYWlsCi0JCS8vCQl0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbiA9IHNsb3c7Ci0JCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkQ29sbGVjdGlvbihzbG93KTsKLQotCQl0aGlzLmNvbmN1cnJlbnRQcm9ibGVtID0gZmFsc2U7Ci0JCXRoaXMuY29uY3VycmVudENvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQodGhpcy5idWlsZFJ1bm5hYmxlKCkpOwotCQl0aHJlYWQuc3RhcnQoKTsKLQkJd2hpbGUgKCFzbG93Lmhhc1N0YXJ0ZWRDbG9uZSgpKSB7Ci0JCQkvLyB3YWl0IGZvciB0aGUgb3RoZXIgdGhyZWFkIHRvIHN0YXJ0IHRoZSBjbG9uZS4uLgotCQkJVGhyZWFkLnlpZWxkKCk7Ci0JCX0KLQkJLy8gLi4udGhlbiBzbmVhayBpbiBhbiBleHRyYSBlbGVtZW50Ci0JCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLmFkZCgic2V2ZW50ZWVuIik7Ci0JCXdoaWxlICh0aHJlYWQuaXNBbGl2ZSgpKSB7Ci0JCQkvLyB3YWl0IGZvciB0aGUgb3RoZXIgdGhyZWFkIHRvIGZpbmlzaAotCQkJVGhyZWFkLnlpZWxkKCk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2UodGhpcy5jb25jdXJyZW50UHJvYmxlbSk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgdGhpcy5jb25jdXJyZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNsb25lSXRlcmF0b3JUZXN0cy50aGlzLmxvb3BXaXRoQ2xvbmVJdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHVzZSBhIGNsb25lIGl0ZXJhdG9yIHRvIGxvb3Agb3ZlciB0aGUgInNsb3ciIGNvbGxlY3Rpb24gYW5kIGNvcHkgaXRzCi0JICogY29udGVudHMgdG8gdGhlIGNvbmN1cnJlbnQgY29sbGVjdGlvbgotCSAqLwotCXZvaWQgbG9vcFdpdGhDbG9uZUl0ZXJhdG9yKCkgewotCQl0cnkgewotCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQkJdGhpcy5jb25jdXJyZW50Q29sbGVjdGlvbi5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl0aGlzLmNvbmN1cnJlbnRQcm9ibGVtID0gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmUoSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlPYmplY3QgcmVtb3ZlZCA9ICJ0aHJlZSI7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uY29udGFpbnMocmVtb3ZlZCkpOwotCQkvLyB0cnkgdG8gcmVtb3ZlIGJlZm9yZSBjYWxsaW5nICNuZXh0KCkKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscyhyZW1vdmVkKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCS8vIHRyeSB0byByZW1vdmUgdHdpY2UKLQkJCQlleENhdWdodCA9IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQkJfQotCQl9Ci0JCWFzc2VydEZhbHNlKHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLmNvbnRhaW5zKHJlbW92ZWQpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDbG9uZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENsb25lSXRlcmF0b3IodGhpcy5vcmlnaW5hbENvbGxlY3Rpb24pOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZENsb25lSXRlcmF0b3IoQ29sbGVjdGlvbjxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPFN0cmluZz4oYyk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRFbXB0eUNvbGxlY3Rpb24oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oYyk7Ci0JCXJldHVybiBjOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRFbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248U3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJvbmUiKTsKLQkJYy5hZGQoInR3byIpOwotCQljLmFkZCgidGhyZWUiKTsKLQkJYy5hZGQoImZvdXIiKTsKLQkJYy5hZGQoImZpdmUiKTsKLQkJYy5hZGQoInNpeCIpOwotCQljLmFkZCgic2V2ZW4iKTsKLQkJYy5hZGQoImVpZ2h0Iik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjdXN0b20gY29sbGVjdGlvbiAqKioqKioqKioqCi0Jc3RhdGljIGNsYXNzIFNsb3dDb2xsZWN0aW9uPEU+IGV4dGVuZHMgQXJyYXlMaXN0PEU+IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgYm9vbGVhbiBoYXNTdGFydGVkQ2xvbmUgPSBmYWxzZTsKLQotCQlwdWJsaWMgU2xvd0NvbGxlY3Rpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQkJdGhpcy5zZXRIYXNTdGFydGVkQ2xvbmUodHJ1ZSk7Ci0JCQkvLyB0YWtlIGEgbGl0dGxlIHNub296ZSBiZWZvcmUgcmV0dXJuaW5nIHRoZSBhcnJheQotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLnRvQXJyYXkoKTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCB2b2lkIHNldEhhc1N0YXJ0ZWRDbG9uZShib29sZWFuIGhhc1N0YXJ0ZWRDbG9uZSkgewotCQkJdGhpcy5oYXNTdGFydGVkQ2xvbmUgPSBoYXNTdGFydGVkQ2xvbmU7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNTdGFydGVkQ2xvbmUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5oYXNTdGFydGVkQ2xvbmU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNDVhOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlMaXN0PFN0cmluZz4gb3JpZ2luYWxMaXN0OwotCi0JcHJpdmF0ZSBib29sZWFuIGNvbmN1cnJlbnRQcm9ibGVtOwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGNvbmN1cnJlbnRMaXN0OwotCi0JcHVibGljIENsb25lTGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vcmlnaW5hbExpc3QgPSB0aGlzLmJ1aWxkTGlzdCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IG9yaWdpbmFsU2l6ZSA9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCS8vIHNob3VsZCBhbGxvdyBjb25jdXJyZW50IG1vZGlmaWNhdGlvbgotCQkJdGhpcy5vcmlnaW5hbExpc3QuYWRkKCJmb28iKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRUcnVlKG9yaWdpbmFsU2l6ZSAhPSB0aGlzLm9yaWdpbmFsTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWxTaXplLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXgoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGNsb25lTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA3OyBpKyspIHsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQljbG9uZUxpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSwgY2xvbmVMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCWNsb25lTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSwgY2xvbmVMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCi0JCXdoaWxlIChuZXN0ZWRMaXN0SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJY2xvbmVMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgY2xvbmVMaXN0SXRlcmF0b3IubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJldmlvdXMoKSB7Ci0JCWludCBvcmlnaW5hbFNpemUgPSB0aGlzLm9yaWdpbmFsTGlzdC5zaXplKCk7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJdGhpcy5vcmlnaW5hbExpc3QuYWRkKCJmb28iKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRUcnVlKG9yaWdpbmFsU2l6ZSAhPSB0aGlzLm9yaWdpbmFsTGlzdC5zaXplKCkpOwotCQlvcmlnaW5hbFNpemUgPSB0aGlzLm9yaWdpbmFsTGlzdC5zaXplKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQkvLyBzaG91bGQgYWxsb3cgY29uY3VycmVudCBtb2RpZmljYXRpb24KLQkJCXRoaXMub3JpZ2luYWxMaXN0LmFkZCgiYmFyIik7Ci0JCQlpLS07Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbFNpemUgIT0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCksIHN0cmVhbS5wcmV2aW91cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlEZWZhdWx0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uYWRkKCJ0aHJlZSBhbmQgYSBoYWxmIik7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uc2V0KCJhbm90aGVyIHRocmVlIik7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNdXRhdG9yTmV4dCgpIHsKLQkJdGhpcy52ZXJpZnlNb2RpZnlOZXh0KG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxMaXN0LCB0aGlzLmJ1aWxkTXV0YXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU11dGF0b3JQcmV2aW91cygpIHsKLQkJdGhpcy52ZXJpZnlNb2RpZnlQcmV2aW91cyhuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLm9yaWdpbmFsTGlzdCwgdGhpcy5idWlsZE11dGF0b3IoKSkpOwotCX0KLQotCXByaXZhdGUgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxTdHJpbmc+IGJ1aWxkTXV0YXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBTdHJpbmcgbykgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbExpc3QuYWRkKGluZGV4LCBvKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbExpc3QucmVtb3ZlKGluZGV4KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0KGludCBpbmRleCwgU3RyaW5nIG8pIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LnNldChpbmRleCwgbyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVN1YmNsYXNzTmV4dCgpIHsKLQkJdGhpcy52ZXJpZnlNb2RpZnlOZXh0KHRoaXMuYnVpbGRTdWJjbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3ViY2xhc3NQcmV2aW91cygpIHsKLQkJdGhpcy52ZXJpZnlNb2RpZnlQcmV2aW91cyh0aGlzLmJ1aWxkU3ViY2xhc3MoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFN1YmNsYXNzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5vcmlnaW5hbExpc3QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkKGludCBjdXJyZW50SW5kZXgsIFN0cmluZyBvKSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5hZGQoY3VycmVudEluZGV4LCBvKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoaW50IGN1cnJlbnRJbmRleCkgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbExpc3QucmVtb3ZlKGN1cnJlbnRJbmRleCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0KGludCBjdXJyZW50SW5kZXgsIFN0cmluZyBvKSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5zZXQoY3VycmVudEluZGV4LCBvKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TW9kaWZ5TmV4dChMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlTdHJpbmcgcmVtb3ZlZCA9ICJ0aHJlZSI7Ci0JCVN0cmluZyBhZGRlZEFmdGVyID0gImZpdmUiOwotCQlTdHJpbmcgYWRkZWQgPSAiZml2ZSBhbmQgYSBoYWxmIjsKLQkJU3RyaW5nIHJlcGxhY2VkID0gInNldmVuIjsKLQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gImFub3RoZXIgc2V2ZW4iOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlbW92ZWQpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhhZGRlZEFmdGVyKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZWQpKTsKLQkJLy8gdHJ5IHRvIHJlbW92ZSBiZWZvcmUgY2FsbGluZyAjbmV4dCgpCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dC5lcXVhbHMoYWRkZWRBZnRlcikpIHsKLQkJCQlpdGVyYXRvci5hZGQoYWRkZWQpOwotCQkJfQotCQkJaWYgKG5leHQuZXF1YWxzKHJlbW92ZWQpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJLy8gdHJ5IHRvIHJlbW92ZSB0d2ljZQotCQkJCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCQl9Ci0JCQlpZiAobmV4dC5lcXVhbHMocmVwbGFjZWQpKSB7Ci0JCQkJaXRlcmF0b3Iuc2V0KHJlcGxhY2VtZW50KTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKGFkZGVkKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlbW92ZWQpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZWQpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZXBsYWNlbWVudCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlNb2RpZnlQcmV2aW91cyhMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlTdHJpbmcgcmVtb3ZlZCA9ICJ0aHJlZSI7Ci0JCVN0cmluZyBhZGRlZEJlZm9yZSA9ICJmaXZlIjsKLQkJU3RyaW5nIGFkZGVkID0gImZvdXIgYW5kIGEgaGFsZiI7Ci0JCVN0cmluZyByZXBsYWNlZCA9ICJzZXZlbiI7Ci0JCVN0cmluZyByZXBsYWNlbWVudCA9ICJhbm90aGVyIHNldmVuIjsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZW1vdmVkKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMoYWRkZWRCZWZvcmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZXBsYWNlZCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBwcmV2aW91cyA9IGl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKGFkZGVkQmVmb3JlKSkgewotCQkJCWl0ZXJhdG9yLmFkZChhZGRlZCk7Ci0JCQl9Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKHJlbW92ZWQpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJLy8gdHJ5IHRvIHJlbW92ZSB0d2ljZQotCQkJCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQkJCX0KLQkJCWlmIChwcmV2aW91cy5lcXVhbHMocmVwbGFjZWQpKSB7Ci0JCQkJaXRlcmF0b3Iuc2V0KHJlcGxhY2VtZW50KTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKGFkZGVkKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlbW92ZWQpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZWQpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZXBsYWNlbWVudCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcih0aGlzLm9yaWdpbmFsTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZENsb25lTGlzdEl0ZXJhdG9yKExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPihsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5vcmlnaW5hbExpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRFbXB0eUxpc3QoKTsKLQkJdGhpcy5wb3B1bGF0ZUxpc3QobGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUxpc3QoTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJbGlzdC5hZGQoIm9uZSIpOwotCQlsaXN0LmFkZCgidHdvIik7Ci0JCWxpc3QuYWRkKCJ0aHJlZSIpOwotCQlsaXN0LmFkZCgiZm91ciIpOwotCQlsaXN0LmFkZCgiZml2ZSIpOwotCQlsaXN0LmFkZCgic2l4Iik7Ci0JCWxpc3QuYWRkKCJzZXZlbiIpOwotCQlsaXN0LmFkZCgiZWlnaHQiKTsKLQkJbGlzdC5hZGQoIm5pbmUiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGJ1aWxkRW1wdHlMaXN0KCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBjb25jdXJyZW50IGFjY2VzczogRmlyc3QgYnVpbGQgYSBjbG9uZSBpdGVyYXRvciBpbiBhIHNlcGFyYXRlIHRocmVhZAotCSAqIHRoYXQgaGFuZ3MgbW9tZW50YXJpbHkgZHVyaW5nIGl0cyBjb25zdHJ1Y3Rpb247IHRoZW4gbW9kaWZ5IHRoZSBzaGFyZWQKLQkgKiBjb2xsZWN0aW9uIGluIHRoaXMgdGhyZWFkLiBUaGlzIHdvdWxkIGNhdXNlIGEKLQkgKiBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGluIHRoZSBvdGhlciB0aHJlYWQgaWYgdGhlIGNsb25lIGl0ZXJhdG9yCi0JICogd2VyZSBub3Qgc3luY2hyb25pemVkIG9uIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW50QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNsb25lSXRlcmF0b3JUZXN0cy5TbG93Q29sbGVjdGlvbjxTdHJpbmc+IHNsb3cgPSBuZXcgQ2xvbmVJdGVyYXRvclRlc3RzLlNsb3dDb2xsZWN0aW9uPFN0cmluZz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUxpc3Qoc2xvdyk7Ci0JCS8vIHVzaW5nIHRoZSB1bnN5bmNocm9uaXplZCBsaXN0IHdpbGwgY2F1c2UgdGhlIHRlc3QgdG8gZmFpbAotCQkvLyB0aGlzLm9yaWdpbmFsTGlzdCA9IHNsb3c7Ci0JCXRoaXMub3JpZ2luYWxMaXN0ID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChzbG93KTsKLQotCQl0aGlzLmNvbmN1cnJlbnRQcm9ibGVtID0gZmFsc2U7Ci0JCXRoaXMuY29uY3VycmVudExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQodGhpcy5idWlsZFJ1bm5hYmxlKCkpOwotCQl0aHJlYWQuc3RhcnQoKTsKLQkJd2hpbGUgKCFzbG93Lmhhc1N0YXJ0ZWRDbG9uZSgpKSB7Ci0JCQkvLyB3YWl0IGZvciB0aGUgb3RoZXIgdGhyZWFkIHRvIHN0YXJ0IHRoZSBjbG9uZS4uLgotCQkJVGhyZWFkLnlpZWxkKCk7Ci0JCX0KLQkJLy8gLi4udGhlbiBzbmVhayBpbiBhbiBleHRyYSBlbGVtZW50Ci0JCXRoaXMub3JpZ2luYWxMaXN0LmFkZCgic2V2ZW50ZWVuIik7Ci0JCXdoaWxlICh0aHJlYWQuaXNBbGl2ZSgpKSB7Ci0JCQkvLyB3YWl0IGZvciB0aGUgb3RoZXIgdGhyZWFkIHRvIGZpbmlzaAotCQkJVGhyZWFkLnlpZWxkKCk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2UodGhpcy5jb25jdXJyZW50UHJvYmxlbSk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlTGlzdChleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgdGhpcy5jb25jdXJyZW50TGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5sb29wV2l0aENsb25lTGlzdEl0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogdXNlIGEgY2xvbmUgaXRlcmF0b3IgdG8gbG9vcCBvdmVyIHRoZSAic2xvdyIgY29sbGVjdGlvbiBhbmQgY29weSBpdHMKLQkgKiBjb250ZW50cyB0byB0aGUgY29uY3VycmVudCBjb2xsZWN0aW9uCi0JICovCi0Jdm9pZCBsb29wV2l0aENsb25lTGlzdEl0ZXJhdG9yKCkgewotCQl0cnkgewotCQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQl0aGlzLmNvbmN1cnJlbnRMaXN0LmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCXRoaXMuY29uY3VycmVudFByb2JsZW0gPSB0cnVlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YzM5NzYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW5vdGhlcigpIHsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW5vdGhlcjIoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzQW5vdGhlcih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbm90aGVyMygpIHsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcjMoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlIYXNBbm90aGVyKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXRoaXMudmVyaWZ5SGFzQW5vdGhlcig4LCBzdHJlYW0pOwotCX0KLQotCXZvaWQgdmVyaWZ5SGFzQW5vdGhlcihpbnQgZXhwZWN0ZWQsIEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5vdGhlcigpIHsKLQkJdGhpcy52ZXJpZnlBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5vdGhlcjIoKSB7Ci0JCXRoaXMudmVyaWZ5QW5vdGhlcih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm90aGVyMygpIHsKLQkJdGhpcy52ZXJpZnlBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcjMoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlBbm90aGVyKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXRoaXMudmVyaWZ5QW5vdGhlcigxLCBzdHJlYW0pOwotCX0KLQotCXZvaWQgdmVyaWZ5QW5vdGhlcihpbnQgc3RhcnQsIEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWludCBpbmRleCA9IHN0YXJ0OwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgU3RyaW5nLnZhbHVlT2YoaW5kZXgrKyksIHN0cmVhbS5uZXh0KCkuc3Vic3RyaW5nKDAsIDEpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UmVtb3ZlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkTGlzdDEoKTsKLQkJT2JqZWN0IGxhc3RFbGVtZW50MSA9IGxpc3QxLmdldChsaXN0MS5zaXplKCkgLSAxKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZExpc3QyKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MyA9IHRoaXMuYnVpbGRMaXN0MygpOwotCi0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQobGlzdDEubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0Mi5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QzLmxpc3RJdGVyYXRvcigpKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChuZXh0LmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKG5leHQuZXF1YWxzKGxhc3RFbGVtZW50MSkpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzTmV4dCgpOwotCQkJCS8vIG5vdyB0cnkgdG8gcmVtb3ZlIGZyb20gdGhlIHByZXZpb3VzIGl0ZXJhdG9yCi0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXN0cmVhbS5yZW1vdmUoKTsKLQotCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmcgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMSIsIHRoaXMuYnVpbGRMaXN0MSgpLnNpemUoKSAtIDIsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydEZhbHNlKCJsYXN0IGVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMobGFzdEVsZW1lbnQxKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIyMiIpKTsKLQotCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmcgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMyIsIHRoaXMuYnVpbGRMaXN0MygpLnNpemUoKSAtIDEsIGxpc3QzLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24gMyIsIGxpc3QzLmNvbnRhaW5zKCI4ODg4ODg4OCIpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAzIiwgbGlzdDMuY29udGFpbnMoIjY2NjY2NiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRWxlbWVudCgpIHsKLQkJU3RyaW5nIGl0ZW0gPSAiMCI7Ci0JCXRoaXMudmVyaWZ5SGFzQW5vdGhlcig5LCB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoaXRlbSwgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpKTsKLQkJdGhpcy52ZXJpZnlBbm90aGVyKDAsIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihpdGVtLCB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXZvaWQgdmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJdGhpcy52ZXJpZnlVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbih0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlQ29tcG9zaXRlSXRlcmF0b3IoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJpbmcuZXF1YWxzKCIzMzMiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24odGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXZvaWQgdmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SGFzQW5vdGhlcjEoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlIYXNBbm90aGVyKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUVtcHR5SGFzQW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uMSgpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCkgewotCQl0aGlzLnZlcmlmeUVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMSgpOwotCX0KLQotCXZvaWQgdmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbih0aGlzLmJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SGFzQW5vdGhlcjIoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlIYXNBbm90aGVyKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uMigpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24yKCkgewotCQl0aGlzLnZlcmlmeUVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMigpOwotCX0KLQotCXZvaWQgdmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24yKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbih0aGlzLmJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKHRoaXMuYnVpbGRJdGVyYXRvcnMoKSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IxKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKHRoaXMuYnVpbGRFbXB0eUl0ZXJhdG9yczEoKSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKHRoaXMuYnVpbGRFbXB0eUl0ZXJhdG9yczIoKSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUNvbXBvc2l0ZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcnMoKSk7Ci0JfQotCi0JLy8gbGVhdmUgdW5jaGVja2VkIHNvIHdlIGNhbiBvdmVycmlkZSBpbiBzdWJjbGFzcwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvciBpdGVyYXRvcnMpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KGl0ZXJhdG9ycyk7Ci0JfQotCi0JLy8gdXNlIHZhcmFyZyBjb25zdHJ1Y3RvcgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPih0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpKTsKLQl9Ci0KLQkvLyB1c2UgdmFyYXJnIGNvbnN0cnVjdG9yCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KG5ldyBJdGVyYXRvcltdIHsgdGhpcy5idWlsZEl0ZXJhdG9yMSgpLCB0aGlzLmJ1aWxkSXRlcmF0b3IyKCksIHRoaXMuYnVpbGRJdGVyYXRvcjMoKSB9KTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoU3RyaW5nIHN0cmluZywgSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4oc3RyaW5nLCBpdGVyYXRvcik7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGJ1aWxkSXRlcmF0b3JzKCkgewotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRJdGVyYXRvcjEoKSk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRJdGVyYXRvcjIoKSk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRJdGVyYXRvcjMoKSk7Ci0JCXJldHVybiBsaXN0Lmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxJdGVyYXRvcjxTdHJpbmc+PiBidWlsZEVtcHR5SXRlcmF0b3JzMSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRFbXB0eUl0ZXJhdG9ySXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gYnVpbGRFbXB0eUl0ZXJhdG9yczIoKSB7Ci0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEVtcHR5U3RyaW5nSXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRFbXB0eVN0cmluZ0l0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZCh0aGlzLmJ1aWxkRW1wdHlTdHJpbmdJdGVyYXRvcigpKTsKLQkJcmV0dXJuIGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3JzKCkgewotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcjEoKSk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcjIoKSk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcjMoKSk7Ci0JCXJldHVybiBsaXN0Lmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IxKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QxKCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdDIoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yMygpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0MygpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IxKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFVubW9kaWZpYWJsZUxpc3QxKCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTGlzdDIoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMygpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRVbm1vZGlmaWFibGVMaXN0MygpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxJdGVyYXRvcjxTdHJpbmc+PiBidWlsZEVtcHR5SXRlcmF0b3JJdGVyYXRvcigpIHsKLQkJcmV0dXJuIChuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCkpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRW1wdHlTdHJpbmdJdGVyYXRvcigpIHsKLQkJcmV0dXJuIChuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdDEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIxIik7Ci0JCWxpc3QuYWRkKCIyMiIpOwotCQlsaXN0LmFkZCgiMzMzIik7Ci0JCWxpc3QuYWRkKCI0NDQ0Iik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCUxpc3Q8U3RyaW5nPiBidWlsZExpc3QyKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdDMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCI1NTU1NSIpOwotCQlsaXN0LmFkZCgiNjY2NjY2Iik7Ci0JCWxpc3QuYWRkKCI3Nzc3Nzc3Iik7Ci0JCWxpc3QuYWRkKCI4ODg4ODg4OCIpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVMaXN0MSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5idWlsZExpc3QxKCkpOwotCX0KLQotCUxpc3Q8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUxpc3QyKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0aGlzLmJ1aWxkTGlzdDIoKSk7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTGlzdDMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHRoaXMuYnVpbGRMaXN0MygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDJiZGJlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cyB7Ci0KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJc3VwZXIudGVzdFJlbW92ZSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZExpc3QyKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MyA9IHRoaXMuYnVpbGRMaXN0MygpOwotCQlPYmplY3QgZmlyc3RFbGVtZW50MyA9IGxpc3QzLmdldCgwKTsKLQotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGxpc3QxLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDIubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0My5saXN0SXRlcmF0b3IoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JCS8vIHBvc2l0aW9uIHRvIGVuZCBvZiBzdHJlYW0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoZmlyc3RFbGVtZW50MykpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzUHJldmlvdXMoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBwcmV2aW91cyBpdGVyYXRvcgotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlzdHJlYW0ucmVtb3ZlKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJub3RoaW5nIHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDEiLCB0aGlzLmJ1aWxkTGlzdDEoKS5zaXplKCkgLSAyLCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBzdGlsbCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucygiMSIpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjMzMyIpKTsKLQotCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmcgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMyIsIHRoaXMuYnVpbGRMaXN0MygpLnNpemUoKSAtIDEsIGxpc3QzLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJmaXJzdCBlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24gMyIsIGxpc3QzLmNvbnRhaW5zKGZpcnN0RWxlbWVudDMpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAzIiwgbGlzdDMuY29udGFpbnMoIjY2NjY2NiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkTGlzdDEoKTsKLQkJT2JqZWN0IGxhc3RFbGVtZW50MSA9IGxpc3QxLmdldChsaXN0MS5zaXplKCkgLSAxKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZExpc3QyKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MyA9IHRoaXMuYnVpbGRMaXN0MygpOwotCQlPYmplY3QgZmlyc3RFbGVtZW50MyA9IGxpc3QzLmdldCgwKTsKLQotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGxpc3QxLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDIubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0My5saXN0SXRlcmF0b3IoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobmV4dC5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJc3RyZWFtLmFkZCgiMy41Iik7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKG5leHQuZXF1YWxzKGxhc3RFbGVtZW50MSkpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzTmV4dCgpOwotCQkJCS8vIG5vdyB0cnkgdG8gYWRkIHRvIHRoZSBpdGVyYXRvcgotCQkJCXN0cmVhbS5hZGQoInNvbWV0aGluZyBpbiAzIik7Ci0JCQl9Ci0JCX0KLQkJc3RyZWFtLmFkZCgiZmluYWxlIik7Ci0JCWJvb2xlYW4gY2hlY2tGb3JGaW5hbGUgPSB0cnVlOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBwcmV2aW91cyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQkJaWYgKGNoZWNrRm9yRmluYWxlKSB7Ci0JCQkJY2hlY2tGb3JGaW5hbGUgPSBmYWxzZTsKLQkJCQlhc3NlcnRFcXVhbHMoImFkZGVkIGVsZW1lbnQgZHJvcHBlZCIsICJmaW5hbGUiLCBwcmV2aW91cyk7Ci0JCQl9Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5hZGQoIjIuNSIpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoZmlyc3RFbGVtZW50MykpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzUHJldmlvdXMoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBwcmV2aW91cyBpdGVyYXRvcgotCQkJCXN0cmVhbS5hZGQoIm9sZCBzdGFydCBvZiAzIik7Ci0JCQl9Ci0JCX0KLQkJc3RyZWFtLmFkZCgicHJlbHVkZSIpOwotCQlhc3NlcnRFcXVhbHMoImFkZGVkIGVsZW1lbnQgZHJvcHBlZCIsICJwcmVsdWRlIiwgc3RyZWFtLnByZXZpb3VzKCkpOwotCi0JCWFzc2VydEVxdWFscygiZWxlbWVudHMgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsIHRoaXMuYnVpbGRMaXN0MSgpLnNpemUoKSArIDMsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAxIiwgInByZWx1ZGUiLCBsaXN0MS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsICIyLjUiLCBsaXN0MS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsICIzLjUiLCBsaXN0MS5nZXQoNSkpOwotCi0JCWFzc2VydEVxdWFscygiZWxlbWVudHMgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMyIsIHRoaXMuYnVpbGRMaXN0MygpLnNpemUoKSArIDMsIGxpc3QzLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAzIiwgInNvbWV0aGluZyBpbiAzIiwgbGlzdDMuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDMiLCAib2xkIHN0YXJ0IG9mIDMiLCBsaXN0My5nZXQoMSkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMyIsICJmaW5hbGUiLCBsaXN0My5nZXQobGlzdDMuc2l6ZSgpIC0gMSkpOwotCi0JCS8vIGFkZCB0byB0aGUgZnJvbnQKLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRGYWxzZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0RmFsc2UoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ubmV4dCgpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQotCQkvLyBhZGQgdG8gdGhlIG1pZGRsZQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQlzdHJlYW0ubmV4dCgpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydEZhbHNlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLm5leHQoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJc3RyZWFtLm5leHQoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRUcnVlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLnByZXZpb3VzKCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXN0cmVhbS5wcmV2aW91cygpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydEZhbHNlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLm5leHQoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQotCQkvLyBhZGQgdG8gdGhlIGVuZAotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydEZhbHNlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLmhhc05leHQoKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRUcnVlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLnByZXZpb3VzKCkuZXF1YWxzKCJibGFoIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRMaXN0MSgpOwotCQlPYmplY3QgbGFzdEVsZW1lbnQxID0gbGlzdDEuZ2V0KGxpc3QxLnNpemUoKSAtIDEpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkTGlzdDIoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZExpc3QzKCk7Ci0JCU9iamVjdCBmaXJzdEVsZW1lbnQzID0gbGlzdDMuZ2V0KDApOwotCi0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQobGlzdDEubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0Mi5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QzLmxpc3RJdGVyYXRvcigpKTsKLQotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQkJLy8gcG9zaXRpb24gdG8gZW5kIG9mIHN0cmVhbQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5leHQuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5zZXQoIjMzM2EiKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAobmV4dC5lcXVhbHMobGFzdEVsZW1lbnQxKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNOZXh0KCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0uc2V0KCJlbmQgb2YgMSIpOwotCQkJfQotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHByZXZpb3VzID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCIyMiIpKSB7Ci0JCQkJc3RyZWFtLnNldCgiMjJhIik7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhmaXJzdEVsZW1lbnQzKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNQcmV2aW91cygpOwotCQkJCS8vIG5vdyB0cnkgdG8gcmVtb3ZlIGZyb20gdGhlIHByZXZpb3VzIGl0ZXJhdG9yCi0JCQkJc3RyZWFtLnNldCgic3RhcnQgb2YgMyIpOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50KHMpIGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsIHRoaXMuYnVpbGRMaXN0MSgpLnNpemUoKSwgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgIjIyYSIsIGxpc3QxLmdldCgxKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjIyIikpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDEiLCAiMzMzYSIsIGxpc3QxLmdldCgyKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjMzMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgImVuZCBvZiAxIiwgbGlzdDEuZ2V0KGxpc3QxLnNpemUoKSAtIDEpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucyhsYXN0RWxlbWVudDEpKTsKLQotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQocykgYWRkZWQgdG8gY29sbGVjdGlvbiAzIiwgdGhpcy5idWlsZExpc3QzKCkuc2l6ZSgpLCBsaXN0My5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDMiLCAic3RhcnQgb2YgMyIsIGxpc3QzLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAzIiwgbGlzdDMuY29udGFpbnMoZmlyc3RFbGVtZW50MykpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQkJaWYgKG5leHQuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQlpLS07Ci0JCQl9Ci0JCQlpZiAobmV4dC5lcXVhbHMoIjc3Nzc3NzciKSkgewotCQkJCXN0cmVhbS5hZGQoIjcuNSIpOwotCQkJCWkrKzsKLQkJCX0KLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImluZGV4IGlzIGNvcnJ1cHQiLCA4LCBpKTsKLQotCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoIjY2NjY2NiIpKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCS8vIHJlbW92aW5nIGEgcHJldmlvdXMgZWxlbWVudCwgZG9lcyBub3QgY2hhbmdlIHRoZSBjdXJzb3IKLQkJCX0KLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoIjIyIikpIHsKLQkJCQlzdHJlYW0uYWRkKCIxLjUiKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJpbmRleCBpcyBjb3JydXB0IiwgMCwgaSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCkgewotCQl0aGlzLnZlcmlmeUVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24yKCk7Ci0JfQotCi0JLy8gdW5jaGVja2VkIHNvIHdlIGNhbiBvdmVycmlkZSB0aGUgdW5jaGVja2VkIG1ldGhvZCBpbiBzdXBlcmNsYXNzCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9ycykgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KChMaXN0SXRlcmF0b3I8TGlzdEl0ZXJhdG9yPFN0cmluZz4+KSBpdGVyYXRvcnMpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5idWlsZEl0ZXJhdG9yMSgpLCB0aGlzLmJ1aWxkSXRlcmF0b3IyKCksIHRoaXMuYnVpbGRJdGVyYXRvcjMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPihuZXcgTGlzdEl0ZXJhdG9yW10geyB0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpIH0pOwotCX0KLQotCUBPdmVycmlkZQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKFN0cmluZyBzdHJpbmcsIExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4oc3RyaW5nLCBpdGVyYXRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUVudW1lcmF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5RW51bWVyYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODY5Nzg5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5RW51bWVyYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUVudW1lcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRW1wdHlFbnVtZXJhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVtcHR5RW51bWVyYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTW9yZUVsZW1lbnRzKCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRW51bWVyYXRpb248T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUVudW1lcmF0aW9uLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCXN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEVsZW1lbnQoKSB7Ci0JCWZvciAoRW51bWVyYXRpb248T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUVudW1lcmF0aW9uLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzdHJlYW0ubmV4dEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlFbnVtZXJhdGlvbjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5RW51bWVyYXRpb24uaW5zdGFuY2UoKTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGVsZW1lbnQsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ODVhZDQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFbXB0eUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW1wdHlJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPE51bWJlcj4gc3RyZWFtID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjOGVmYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFbXB0eUxpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVtcHR5TGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXgoKSB7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlpID0gMDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzSW5kZXgoKSB7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCWFzc2VydEVxdWFscygtMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIChuZXh0KTogIiArIGVsZW1lbnQsIGV4Q2F1Z2h0KTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biAocHJldmlvdXMpOiAiICsgZWxlbWVudCwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKS5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIChyZW1vdmUpIiwgZXhDYXVnaHQpOwotCQl0cnkgewotCQkJRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKS5zZXQobmV3IE9iamVjdCgpKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIChzZXQpIiwgZXhDYXVnaHQpOwotCQl0cnkgewotCQkJRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKS5hZGQobmV3IE9iamVjdCgpKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIChhZGQpIiwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4ZjEwMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVudW1lcmF0aW9uSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFbnVtZXJhdGlvbkl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW51bWVyYXRpb25JdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0VXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlFbnVtZXJhdGlvbjxTdHJpbmc+IGVudW1lcmF0aW9uID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRVcGNhc3QoKSB7Ci0JCUVudW1lcmF0aW9uPFN0cmluZz4gZW51bWVyYXRpb24gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb24oKTsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYXRvcih0aGlzLmJ1aWxkRW51bWVyYXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoRW51bWVyYXRpb248U3RyaW5nPiBlbnVtZXJhdGlvbikgewotCQlyZXR1cm4gbmV3IEVudW1lcmF0aW9uSXRlcmF0b3I8U3RyaW5nPihlbnVtZXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGlvbjxTdHJpbmc+IGJ1aWxkRW51bWVyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVmVjdG9yKCkuZWxlbWVudHMoKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkVmVjdG9yKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXYuYWRkRWxlbWVudCgib25lIik7Ci0JCXYuYWRkRWxlbWVudCgidHdvIik7Ci0JCXYuYWRkRWxlbWVudCgidGhyZWUiKTsKLQkJdi5hZGRFbGVtZW50KCJmb3VyIik7Ci0JCXYuYWRkRWxlbWVudCgiZml2ZSIpOwotCQl2LmFkZEVsZW1lbnQoInNpeCIpOwotCQl2LmFkZEVsZW1lbnQoInNldmVuIik7Ci0JCXYuYWRkRWxlbWVudCgiZWlnaHQiKTsKLQkJcmV0dXJuIHY7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkSXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZEVudW1lcmF0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBidWlsZEl0ZXJhdG9yVXBjYXN0KEVudW1lcmF0aW9uPFN0cmluZz4gZW51bWVyYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGlvbkl0ZXJhdG9yPE9iamVjdD4oZW51bWVyYXRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTQ5OGFhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0ZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gInByZWZpeCI7Ci0KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRBY2NlcHRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoc3RyaW5nLmVxdWFscyhQUkVGSVggKyAiMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRBY2NlcHRJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEFjY2VwdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0TmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRBY2NlcHRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgYWNjZXB0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lck5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgYWNjZXB0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlamVjdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWplY3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlamVjdE5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVqZWN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEZhbHNlKCJib2d1cyByZWplY3QiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm90aEhhc05leHQoKSB7Ci0JCS8vIGlmIGJvdGggYWNjZXB0KCkgYW5kIHJlamVjdCgpIGFyZSBvdmVycmlkZGVuLCBhY2NlcHQoKSBpcyB1c2VkCi0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRCb3RoSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMb2FkTmV4dCgpIHsKLQkJLy8gbG9hZE5leHQoKSB1c2VkIHRvIGNhdXNlIGEgTlBFIHdoZW4gZXhlY3V0aW5nIGR1cmluZyB0aGUKLQkJLy8gY29uc3RydWN0b3IgYmVjYXVzZSB0aGUgIm91dGVyIiBjbGFzcyBpcyBub3QgYm91bmQgdW50aWwgY29tcGxldGlvbgotCQkvLyBvZiB0aGUgY29uc3RydWN0b3IKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yMigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgYWNjZXB0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JLy8gdGVzdCBhIGZpbHRlcmVkIGl0ZXJhdG9yIHdpdGggYSBuZXN0ZWQgaXRlcmF0b3Igb2YgYSBzdWItdHlwZSAoTnVtYmVyIHZzLiBJbnRlZ2VyKQotCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmljczEoKSB7Ci0JCUxpc3Q8SW50ZWdlcj4gaW50ZWdlcnMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0JCWludGVnZXJzLmFkZChuZXcgSW50ZWdlcigwKSk7Ci0JCWludGVnZXJzLmFkZChuZXcgSW50ZWdlcigxKSk7Ci0JCWludGVnZXJzLmFkZChuZXcgSW50ZWdlcigyKSk7Ci0JCWludGVnZXJzLmFkZChuZXcgSW50ZWdlcigzKSk7Ci0JCUl0ZXJhdG9yPE51bWJlcj4gc3RyZWFtID0gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEludGVnZXIsIE51bWJlcj4oaW50ZWdlcnMuaXRlcmF0b3IoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSW50ZWdlciBvKSB7Ci0JCQkJcmV0dXJuIG8uaW50VmFsdWUoKSA+IDE7Ci0JCQl9Ci0JCX07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShzdHJlYW0pKTsKLQl9Ci0KLQkvLyB0ZXN0IGEgZmlsdGVyZWQgaXRlcmF0b3Igd2l0aCBhIG5lc3RlZCBpdGVyYXRvciBvZiBhIHN1cGVyLXR5cGUgKEludGVnZXIgdnMuIE51bWJlcikKLQkvLyBpLmUuIHRydXN0IHRoYXQgRmlsdGVyIHdpbGwgb25seSByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHN1Yi10eXBlIG9iamVjdHMKLQlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY3MyKCkgewotCQlMaXN0PE51bWJlcj4gbnVtYmVycyA9IG5ldyBBcnJheUxpc3Q8TnVtYmVyPigpOwotCQludW1iZXJzLmFkZChuZXcgSW50ZWdlcigwKSk7Ci0JCW51bWJlcnMuYWRkKG5ldyBMb25nKDEpKTsKLQkJbnVtYmVycy5hZGQobmV3IEludGVnZXIoMikpOwotCQludW1iZXJzLmFkZChuZXcgRmxvYXQoMykpOwotCQlJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8TnVtYmVyLCBJbnRlZ2VyPihudW1iZXJzLml0ZXJhdG9yKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE51bWJlciBvKSB7Ci0JCQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBJbnRlZ2VyOwotCQkJfQotCQl9OwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoc3RyZWFtKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlckhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRGaWx0ZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlck5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkRmlsdGVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydFRydWUoImJvZ3VzIGFjY2VwdCIsIHN0cmVhbS5uZXh0KCkuc3RhcnRzV2l0aChQUkVGSVgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEZpbHRlcmVkSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciwgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KG5lc3RlZEl0ZXJhdG9yLCBmaWx0ZXIpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZElubmVyRmlsdGVyZWRJdGVyYXRvcihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgoUFJFRklYKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gUFJFRklYOwotCX0KLQotCS8vIHRoaXMgaW5uZXIgaXRlcmF0b3Igd2lsbCBjYWxsIHRoZSAib3V0ZXIiIG9iamVjdAotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZElubmVyRmlsdGVyZWRJdGVyYXRvcjIoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKEZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMudGhpcy5nZXRQcmVmaXgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKFBSRUZJWCArICIxIik7Ci0JCWMuYWRkKFBSRUZJWCArICIyIik7Ci0JCWMuYWRkKFBSRUZJWCArICIzIik7Ci0JCWMuYWRkKCI0Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI1Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI2Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI3Iik7Ci0JCWMuYWRkKCI4Iik7Ci0JCXJldHVybiBjLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQWNjZXB0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZEFjY2VwdEZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJbm5lckl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZElubmVyRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JLy8gdGhpcyBpbm5lciBpdGVyYXRvciB3aWxsIGNhbGwgdGhlICJvdXRlciIgb2JqZWN0Ci0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSW5uZXJJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJGaWx0ZXJlZEl0ZXJhdG9yMih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRmlsdGVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZEZpbHRlckZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkQWNjZXB0RmlsdGVyKFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVGaWx0ZXI8U3RyaW5nLCBTdHJpbmc+KHByZWZpeCkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aCh0aGlzLmNyaXRlcmlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVqZWN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFJlamVjdEZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkUmVqZWN0RmlsdGVyKFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVGaWx0ZXI8U3RyaW5nLCBTdHJpbmc+KHByZWZpeCkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gcmVqZWN0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aCh0aGlzLmNyaXRlcmlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gdXNlIGFub255bW91cyBpbm5lciBGaWx0ZXIKLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkRmlsdGVyRmlsdGVyKGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgocHJlZml4KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRCb3RoSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZEJvdGhGaWx0ZXIoUFJFRklYKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXI8U3RyaW5nPiBidWlsZEJvdGhGaWx0ZXIoU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUZpbHRlcjxTdHJpbmcsIFN0cmluZz4ocHJlZml4KSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiByZWplY3QoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHRoaXMuY3JpdGVyaW9uKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHRoaXMuY3JpdGVyaW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEZpbHRlcmluZ0l0ZXJhdG9yKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQkvLyBtaXNzaW5nIG1ldGhvZCBvdmVycmlkZQotCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4odGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCQkJU3RyaW5nIHMgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIHN0cmluZzogIiArIHMpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0dyYXBoSXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvR3JhcGhJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDhhMmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvR3JhcGhJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5HcmFwaEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIEdyYXBoSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKiogdGhpcyB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGFsbCB0aGUgbm9kZXMgY3JlYXRlZCBmb3IgdGhlIHRlc3QgKi8KLQlDb2xsZWN0aW9uPEdyYXBoTm9kZT4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PEdyYXBoTm9kZT4oKTsKLQotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0MSgpIHsKLQkJdGhpcy52ZXJpZnlIYXNOZXh0KHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dDIoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzTmV4dCh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05leHQoSXRlcmF0b3I8R3JhcGhOb2RlPiBpdGVyYXRvcikgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5ub2Rlcy5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0MSgpIHsKLQkJdGhpcy52ZXJpZnlOZXh0KHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dDIoKSB7Ci0JCXRoaXMudmVyaWZ5TmV4dCh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU5leHQoSXRlcmF0b3I8R3JhcGhOb2RlPiBpdGVyYXRvcikgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBlbGVtZW50IiwgdGhpcy5ub2Rlcy5jb250YWlucyhpdGVyYXRvci5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uMSgpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24oSXRlcmF0b3I8R3JhcGhOb2RlPiBpdGVyYXRvcikgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplMSgpIHsKLQkJdGhpcy52ZXJpZnlTaXplKHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZTIoKSB7Ci0JCXRoaXMudmVyaWZ5U2l6ZSh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNpemUoSXRlcmF0b3I8R3JhcGhOb2RlPiBpdGVyYXRvcikgewotCQlpbnQgaXRlcmF0b3JTaXplID0gQ29sbGVjdGlvblRvb2xzLnNpemUoaXRlcmF0b3IpOwotCQlpbnQgYWN0dWFsU2l6ZSA9IHRoaXMubm9kZXMuc2l6ZSgpOwotCQlhc3NlcnRUcnVlKCJUb28gZmV3IGl0ZW1zIGluIGl0ZXJhdG9yLiIsIGl0ZXJhdG9yU2l6ZSA+PSBhY3R1YWxTaXplKTsKLQkJYXNzZXJ0VHJ1ZSgiVG9vIG1hbnkgaXRlbXMgaW4gaXRlcmF0b3IuIiwgaXRlcmF0b3JTaXplIDw9IGFjdHVhbFNpemUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkR3JhcGhJdGVyYXRvcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJLy8gbWlzc2luZyBtZXRob2Qgb3ZlcnJpZGUKLQkJCUl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IgPSBuZXcgR3JhcGhJdGVyYXRvcjxHcmFwaE5vZGU+KHRoaXMuYnVpbGRHcmFwaFJvb3QoKSk7Ci0JCQlHcmFwaE5vZGUgZ24gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGdyYXBoIG5vZGU6ICIgKyBnbik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgZ3JhcGggaXRlcmF0b3Igd2l0aCBhbiBleHBsaWNpdCBtaXN0ZXJSb2dlcnMKLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yPEdyYXBoTm9kZT4gYnVpbGRHcmFwaEl0ZXJhdG9yMSgpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhdG9yPEdyYXBoTm9kZT4odGhpcy5idWlsZEdyYXBoUm9vdCgpLCB0aGlzLmJ1aWxkTWlzdGVyUm9nZXJzKCkpOwotCX0KLQotCXByaXZhdGUgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnM8R3JhcGhOb2RlPiBidWlsZE1pc3RlclJvZ2VycygpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxHcmFwaE5vZGU+KCkgewotCQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKEdyYXBoTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQubmVpZ2hib3JzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSBncmFwaCBpdGVyYXRvciB3aXRoIGFuIG92ZXJyaWRlCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxHcmFwaE5vZGU+IGJ1aWxkR3JhcGhJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYXRvcjxHcmFwaE5vZGU+KHRoaXMuYnVpbGRHcmFwaFJvb3QoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8R3JhcGhOb2RlPiBuZWlnaGJvcnMoR3JhcGhOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5uZWlnaGJvcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoTm9kZSBidWlsZEdyYXBoUm9vdCgpIHsKLQkJR3JhcGhOb2RlIG5jTm9kZSA9IG5ldyBHcmFwaE5vZGUoIk5vcnRoIENhcm9saW5hIik7Ci0JCUdyYXBoTm9kZSB2YU5vZGUgPSBuZXcgR3JhcGhOb2RlKCJWaXJnaW5pYSIpOwotCQlHcmFwaE5vZGUgc2NOb2RlID0gbmV3IEdyYXBoTm9kZSgiU291dGggQ2Fyb2xpbmEiKTsKLQkJR3JhcGhOb2RlIGdhTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkdlb3JnaWEiKTsKLQkJR3JhcGhOb2RlIGZsTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkZsb3JpZGEiKTsKLQkJR3JhcGhOb2RlIGFsTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkFsYWJhbWEiKTsKLQkJR3JhcGhOb2RlIG1zTm9kZSA9IG5ldyBHcmFwaE5vZGUoIk1pc3Npc3NpcHBpIik7Ci0JCUdyYXBoTm9kZSB0bk5vZGUgPSBuZXcgR3JhcGhOb2RlKCJUZW5uZXNzZWUiKTsKLQotCQluY05vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IHZhTm9kZSwgc2NOb2RlLCBnYU5vZGUsIHRuTm9kZSB9KTsKLQkJdmFOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIHRuTm9kZSB9KTsKLQkJc2NOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIGdhTm9kZSB9KTsKLQkJZ2FOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIHNjTm9kZSwgZmxOb2RlLCBhbE5vZGUsIHRuTm9kZSB9KTsKLQkJZmxOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBnYU5vZGUgfSk7Ci0JCWFsTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgZ2FOb2RlLCBtc05vZGUsIHRuTm9kZSB9KTsKLQkJbXNOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBhbE5vZGUsIHRuTm9kZSB9KTsKLQkJdG5Ob2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyB2YU5vZGUsIG5jTm9kZSwgZ2FOb2RlLCBhbE5vZGUsIG1zTm9kZSB9KTsKLQotCQlyZXR1cm4gbmNOb2RlOwotCX0KLQotCXByaXZhdGUgY2xhc3MgR3JhcGhOb2RlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCQlwcml2YXRlIENvbGxlY3Rpb248R3JhcGhOb2RlPiBuZWlnaGJvcnMgPSBuZXcgQXJyYXlMaXN0PEdyYXBoTm9kZT4oKTsKLQotCQlwdWJsaWMgR3JhcGhOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJR3JhcGhJdGVyYXRvclRlc3RzLnRoaXMubm9kZXMuYWRkKHRoaXMpOyAvLyBsb2cgbm9kZQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQotCQl2b2lkIHNldE5laWdoYm9ycyhHcmFwaE5vZGVbXSBuZWlnaGJvcnMpIHsKLQkJCXRoaXMubmVpZ2hib3JzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QobmVpZ2hib3JzKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxHcmFwaE5vZGU+IG5laWdoYm9ycygpIHsKLQkJCXJldHVybiB0aGlzLm5laWdoYm9ycy5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZWlnaGJvcnNTaXplKCkgewotCQkJcmV0dXJuIHRoaXMubmVpZ2hib3JzLnNpemUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJHcmFwaE5vZGUoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0l0ZXJhdG9yRW51bWVyYXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvSXRlcmF0b3JFbnVtZXJhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZDhlYjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvSXRlcmF0b3JFbnVtZXJhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkl0ZXJhdG9yRW51bWVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBJdGVyYXRvckVudW1lcmF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSXRlcmF0b3JFbnVtZXJhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNNb3JlRWxlbWVudHMoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChFbnVtZXJhdGlvbjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc01vcmVFbGVtZW50c1VwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEVudW1lcmF0aW9uPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZEVudW1lcmF0aW9uVXBjYXN0KCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCXN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEVsZW1lbnQoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQkJZm9yIChFbnVtZXJhdGlvbjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBpdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0RWxlbWVudCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUVudW1lcmF0aW9uPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0aW9uPFN0cmluZz4gYnVpbGRFbnVtZXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRFbnVtZXJhdGlvbih0aGlzLmJ1aWxkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGlvbjxPYmplY3Q+IGJ1aWxkRW51bWVyYXRpb25VcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRW51bWVyYXRpb25VcGNhc3QodGhpcy5idWlsZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRpb248U3RyaW5nPiBidWlsZEVudW1lcmF0aW9uKEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBJdGVyYXRvckVudW1lcmF0aW9uPFN0cmluZz4oaXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRpb248T2JqZWN0PiBidWlsZEVudW1lcmF0aW9uVXBjYXN0KEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBJdGVyYXRvckVudW1lcmF0aW9uPE9iamVjdD4oaXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZlY3RvcigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiBidWlsZFZlY3RvcigpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl2LmFkZEVsZW1lbnQoIm9uZSIpOwotCQl2LmFkZEVsZW1lbnQoInR3byIpOwotCQl2LmFkZEVsZW1lbnQoInRocmVlIik7Ci0JCXYuYWRkRWxlbWVudCgiZm91ciIpOwotCQl2LmFkZEVsZW1lbnQoImZpdmUiKTsKLQkJdi5hZGRFbGVtZW50KCJzaXgiKTsKLQkJdi5hZGRFbGVtZW50KCJzZXZlbiIpOwotCQl2LmFkZEVsZW1lbnQoImVpZ2h0Iik7Ci0JCXJldHVybiB2OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9KcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5ZDNmNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9KcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXJyYXlJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFycmF5TGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2hhaW5JdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENsb25lSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDbG9uZUxpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW1wdHlFbnVtZXJhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtcHR5SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbXB0eUxpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVudW1lcmF0aW9uSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShGaWx0ZXJpbmdJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdyYXBoSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJdGVyYXRvckVudW1lcmF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGVla2FibGVJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyZWVJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUGVla2FibGVJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzYjQ3Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUGVla2FibGVJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFBlZWthYmxlSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBQZWVrYWJsZUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoc3RyaW5nLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0VXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygidGhyZWUiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb3VyIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZml2ZSIsIHN0cmVhbS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0VXBjYXN0KCkgewotCQlJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KCk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInRocmVlIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm91ciIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZpdmUiLCBzdHJlYW0ubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVlaygpIHsKLQkJT2JqZWN0IG5leHQgPSBudWxsOwotCQlmb3IgKFBlZWthYmxlSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHBlZWsgPSBzdHJlYW0ucGVlaygpOwotCQkJYXNzZXJ0VHJ1ZSgicGVlayBhbmQgbmV4dCBhcmUgcHJlbWF0dXJlbHkgaWRlbnRpY2FsIiwgcGVlayAhPSBuZXh0KTsKLQkJCW5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJYXNzZXJ0VHJ1ZSgicGVlayBhbmQgbmV4dCBhcmUgbm90IGlkZW50aWNhbCIsIHBlZWsgPT0gbmV4dCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVla1VwY2FzdCgpIHsKLQkJT2JqZWN0IG5leHQgPSBudWxsOwotCQlmb3IgKFBlZWthYmxlSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHBlZWsgPSBzdHJlYW0ucGVlaygpOwotCQkJYXNzZXJ0VHJ1ZSgicGVlayBhbmQgbmV4dCBhcmUgcHJlbWF0dXJlbHkgaWRlbnRpY2FsIiwgcGVlayAhPSBuZXh0KTsKLQkJCW5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJYXNzZXJ0VHJ1ZSgicGVlayBhbmQgbmV4dCBhcmUgbm90IGlkZW50aWNhbCIsIHBlZWsgPT0gbmV4dCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFBlZWthYmxlSXRlcmF0b3I8U3RyaW5nPiBidWlsZFBlZWthYmxlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBQZWVrYWJsZUl0ZXJhdG9yPE9iamVjdD4gYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgUGVla2FibGVJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUGVla2FibGVJdGVyYXRvcihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUGVla2FibGVJdGVyYXRvcjxTdHJpbmc+KG5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIFBlZWthYmxlSXRlcmF0b3I8T2JqZWN0PiBidWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFBlZWthYmxlSXRlcmF0b3I8T2JqZWN0PihuZXN0ZWRJdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCJ6ZXJvIik7Ci0JCWMuYWRkKCJvbmUiKTsKLQkJYy5hZGQoInR3byIpOwotCQljLmFkZCgidGhyZWUiKTsKLQkJYy5hZGQoImZvdXIiKTsKLQkJYy5hZGQoImZpdmUiKTsKLQkJcmV0dXJuIGMuaXRlcmF0b3IoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5MmMwMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIENvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMgewotCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB2ZXJpZnlIYXNBbm90aGVyKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXN1cGVyLnZlcmlmeUhhc0Fub3RoZXIoc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbTIucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB2ZXJpZnlBbm90aGVyKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXN1cGVyLnZlcmlmeUFub3RoZXIoc3RyZWFtKTsKLQkJaW50IGkgPSA4OwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBzdHJlYW07Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIFN0cmluZy52YWx1ZU9mKGktLSksIHN0cmVhbTIucHJldmlvdXMoKS5zdWJzdHJpbmcoMCwgMSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleFByZXZpb3VzSW5kZXgoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaW5kZXggaXMgY29ycnVwdCIsIDgsIGkpOwotCi0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaW5kZXggaXMgY29ycnVwdCIsIDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91c0luZGV4KCkgewotCQkvLyBUT0RPCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJLy8gI3JlbW92ZSgpIGlzIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQkvLyAjcmVtb3ZlKCkgaXMgbm90IHN1cHBvcnRlZAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKSB7Ci0JCS8vICNyZW1vdmUoKSBpcyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMigpIHsKLQkJLy8gI3JlbW92ZSgpIGlzIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24oSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJc3VwZXIudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbihzdHJlYW0pOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBzdHJlYW07Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbTIucHJldmlvdXMoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtMi5wcmV2aW91cygpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB2ZXJpZnlVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihzdHJlYW0pOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHN0cmVhbTsKLQkJd2hpbGUgKHN0cmVhbTIuaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHN0cmluZyA9IHN0cmVhbTIucHJldmlvdXMoKTsKLQkJCWlmIChzdHJpbmcuZXF1YWxzKCIzMzMiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbTIucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXN1cGVyLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbihzdHJlYW0pOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBzdHJlYW07Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0cmVhbTIuc2V0KCJqdW5rIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5RW1wdHlIYXNBbm90aGVyKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXN1cGVyLnZlcmlmeUVtcHR5SGFzQW5vdGhlcihzdHJlYW0pOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBzdHJlYW07Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbTIuaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtMi5wcmV2aW91cygpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQkvLyB1bmNoZWNrZWQgc28gd2UgY2FuIG92ZXJyaWRlIHRoZSB1bmNoZWNrZWQgbWV0aG9kIGluIHN1cGVyY2xhc3MKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3IgaXRlcmF0b3JzKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPigoTGlzdEl0ZXJhdG9yPExpc3RJdGVyYXRvcjxTdHJpbmc+PikgaXRlcmF0b3JzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5idWlsZEl0ZXJhdG9yMSgpLCB0aGlzLmJ1aWxkSXRlcmF0b3IyKCksIHRoaXMuYnVpbGRJdGVyYXRvcjMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KG5ldyBMaXN0SXRlcmF0b3JbXSB7IHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkgfSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKFN0cmluZyBzdHJpbmcsIExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKHN0cmluZywgaXRlcmF0b3IpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKFN0cmluZyBzdHJpbmcsIExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPihzdHJpbmcsIGl0ZXJhdG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFyaWVkTmVzdGVkSXRlcmF0b3JzKCkgewotCQlMaXN0PEludGVnZXI+IGludGVnZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwotCQlpbnRlZ2VyTGlzdC5hZGQobmV3IEludGVnZXIoNDIpKTsKLQkJaW50ZWdlckxpc3QuYWRkKG5ldyBJbnRlZ2VyKDQyKSk7Ci0JCWludGVnZXJMaXN0LmFkZChuZXcgSW50ZWdlcigxMTEpKTsKLQkJaW50ZWdlckxpc3QuYWRkKG5ldyBJbnRlZ2VyKDc3KSk7Ci0KLQkJTGlzdDxGbG9hdD4gZmxvYXRMaXN0ID0gbmV3IEFycmF5TGlzdDxGbG9hdD4oKTsKLQkJZmxvYXRMaXN0LmFkZChuZXcgRmxvYXQoNDIuNDJmKSk7Ci0JCWZsb2F0TGlzdC5hZGQobmV3IEZsb2F0KDIyLjIyZikpOwotCQlmbG9hdExpc3QuYWRkKG5ldyBGbG9hdCgxMTEuMTExZikpOwotCQlmbG9hdExpc3QuYWRkKG5ldyBGbG9hdCg3Ny43N2YpKTsKLQotCQlMaXN0PExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTnVtYmVyPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBOdW1iZXI+PigpOwotCQlsaXN0LmFkZChpbnRlZ2VyTGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGZsb2F0TGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JCUxpc3RJdGVyYXRvcjxOdW1iZXI+IGxpID0gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPE51bWJlcj4obGlzdCk7Ci0JCXdoaWxlIChsaS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydFRydWUobGkubmV4dCgpLmludFZhbHVlKCkgPiAwKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlZmEyZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFJlYWRPbmx5SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBSZWFkT25seUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dFVwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkSXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0VXBjYXN0KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCk7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkSXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRSZWFkT25seUl0ZXJhdG9yVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZFJlYWRPbmx5SXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUmVhZE9ubHlJdGVyYXRvclVwY2FzdChJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxPYmplY3Q+KG5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRWZWN0b3IoKS5pdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWZWN0b3IoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdi5hZGRFbGVtZW50KCJvbmUiKTsKLQkJdi5hZGRFbGVtZW50KCJ0d28iKTsKLQkJdi5hZGRFbGVtZW50KCJ0aHJlZSIpOwotCQl2LmFkZEVsZW1lbnQoImZvdXIiKTsKLQkJdi5hZGRFbGVtZW50KCJmaXZlIik7Ci0JCXYuYWRkRWxlbWVudCgic2l4Iik7Ci0JCXYuYWRkRWxlbWVudCgic2V2ZW4iKTsKLQkJdi5hZGRFbGVtZW50KCJlaWdodCIpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiNzJmNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFJlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dEFuZEhhc1ByZXZpb3VzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKS5zaXplKCksIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0QW5kSGFzUHJldmlvdXNVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yVXBjYXN0KCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRBbmRQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCksIHN0cmVhbS5wcmV2aW91cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0QW5kUHJldmlvdXNVcGNhc3QoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yVXBjYXN0KCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4QW5kUHJldmlvdXNJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAtMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleEFuZFByZXZpb3VzSW5kZXhVcGNhc3QoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yVXBjYXN0KCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCksIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgLTEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5zZXQoImJvZ3VzIik7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5hZGQoImJvZ3VzIik7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdCh0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxTdHJpbmc+KG5lc3RlZExpc3RJdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8T2JqZWN0PiBidWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yVXBjYXN0KExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPE9iamVjdD4obmVzdGVkTGlzdEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWwuYWRkKCJvbmUiKTsKLQkJbC5hZGQoInR3byIpOwotCQlsLmFkZCgidGhyZWUiKTsKLQkJbC5hZGQoImZvdXIiKTsKLQkJbC5hZGQoImZpdmUiKTsKLQkJbC5hZGQoInNpeCIpOwotCQlsLmFkZCgic2V2ZW4iKTsKLQkJbC5hZGQoImVpZ2h0Iik7Ci0JCXJldHVybiBsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDY1N2MuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgdGhpcy5zaW5nbGVFbGVtZW50KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscyh0aGlzLnNpbmdsZUVsZW1lbnQoKSkpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc2luZ2xlRWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNpbmdsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiAic2luZ2xlIGVsZW1lbnQiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZTQxOTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFNpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzIHsKLQotCXB1YmxpYyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAwLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgMSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDIsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgdGhpcy5zaW5nbGVFbGVtZW50KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCB0aGlzLnNpbmdsZUVsZW1lbnQoKSwgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzSW5kZXgoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAwLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIDAsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgLTEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQotCQl0cnkgewotCQkJc3RyZWFtLmFkZCgiZm9vIik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKHRoaXMuc2luZ2xlRWxlbWVudCgpKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5zZXQoImZvbyIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBidWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5zaW5nbGVFbGVtZW50KCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjI1NTIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyB0cmFuc2Zvcm1hdGlvbiIsICsraSwgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0VXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgdHJhbnNmb3JtYXRpb24iLCArK2ksICgoSW50ZWdlcikgc3RyZWFtLm5leHQoKSkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgdHJhbnNmb3JtYXRpb24iLCArK2ksIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVyVHJhbnNmb3JtYXRpb25JdGVyYXRvcihjLml0ZXJhdG9yKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZENvbGxlY3Rpb24oKS5zaXplKCkgLSAxLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24iLCBjLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGMuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lclJlbW92ZSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKGMuaXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZENvbGxlY3Rpb24oKS5zaXplKCkgLSAxLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24iLCBjLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGMuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlJbnRlZ2VyIGludGVnZXIgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJaW50ZWdlciA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWludGVnZXIgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgaW50ZWdlciwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaW50IGkgPSBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCk7Ci0JCQlpZiAoaSA9PSAzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJ1aWxkSXRlcmF0b3IoKS5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXJVcGNhc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25JdGVyYXRvcih0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgSW50ZWdlcj4obmVzdGVkSXRlcmF0b3IsIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVXBjYXN0KEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE9iamVjdCwgT2JqZWN0PihuZXN0ZWRJdGVyYXRvciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihuZXh0Lmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4oKSB7Ci0JCQlwdWJsaWMgSW50ZWdlciB0cmFuc2Zvcm0oT2JqZWN0IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoKChTdHJpbmcpIG5leHQpLmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiMSIpOwotCQljLmFkZCgiMjIiKTsKLQkJYy5hZGQoIjMzMyIpOwotCQljLmFkZCgiNDQ0NCIpOwotCQljLmFkZCgiNTU1NTUiKTsKLQkJYy5hZGQoIjY2NjY2NiIpOwotCQljLmFkZCgiNzc3Nzc3NyIpOwotCQljLmFkZCgiODg4ODg4ODgiKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoKSB7Ci0JCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCUl0ZXJhdG9yPEludGVnZXI+IGl0ZXJhdG9yID0gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLml0ZXJhdG9yKCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJbnRlZ2VyIGludGVnZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGludGVnZXI6ICIgKyBpbnRlZ2VyKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOGEyZTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dEFuZEhhc1ByZXZpb3VzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRBbmRIYXNQcmV2aW91c1VwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dEFuZEhhc1ByZXZpb3VzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEFuZFByZXZpb3VzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCsraSwgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCi0JCSsraTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygtLWksIHN0cmVhbS5wcmV2aW91cygpLmludFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyTmV4dEFuZFByZXZpb3VzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoKytpLCBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkpOwotCQl9Ci0KLQkJKytpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgc3RyZWFtLnByZXZpb3VzKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4QW5kUHJldmlvdXNJbmRleCgpIHsKLQkJaW50IGkgPSAtMTsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoKytpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCi0JCSsraTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygtLWksIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0SW5kZXhBbmRQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IC0xOwotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCsraSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQotCQkrK2k7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoLS1pLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSB0aGlzLmJ1aWxkTGlzdCgpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihsLmxpc3RJdGVyYXRvcigpKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkgPT0gMykgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmcgcmVtb3ZlZCIsIHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpIC0gMSwgbC5zaXplKCkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBzdGlsbCBpbiBsaXN0IiwgbC5jb250YWlucygiMzMzIikpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBlbGVtZW50IHJlbW92ZWQiLCBsLmNvbnRhaW5zKCIyMiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJSZW1vdmUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gdGhpcy5idWlsZExpc3QoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKGwubGlzdEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkgPT0gMykgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmcgcmVtb3ZlZCIsIHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpIC0gMSwgbC5zaXplKCkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBzdGlsbCBpbiBsaXN0IiwgbC5jb250YWlucygiMzMzIikpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBlbGVtZW50IHJlbW92ZWQiLCBsLmNvbnRhaW5zKCIyMiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25PbkFkZCgpIHsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uYWRkKG5ldyBJbnRlZ2VyKDApKTsKLQkJCWZhaWwoImV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25PblNldCgpIHsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uc2V0KG5ldyBJbnRlZ2VyKDApKTsKLQkJCWZhaWwoImV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCUludGVnZXIgaW50ZWdlciA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlpbnRlZ2VyID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJaW50ZWdlciA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBpbnRlZ2VyLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpbnQgaSA9IHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKTsKLQkJCWlmIChpID09IDMpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuYnVpbGRJdGVyYXRvcigpLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8T2JqZWN0PiBidWlsZEl0ZXJhdG9yVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXJVcGNhc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRJbm5lckl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZElubmVyVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IodGhpcy5idWlsZFVubW9kaWZpYWJsZU5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yLCBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+IHRyYW5zZm9ybWVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclVwY2FzdChMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciwgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPiB0cmFuc2Zvcm1lcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPE9iamVjdCwgT2JqZWN0PihuZXN0ZWRJdGVyYXRvciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihuZXh0Lmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4oKSB7Ci0JCQlwdWJsaWMgSW50ZWdlciB0cmFuc2Zvcm0oT2JqZWN0IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoKChTdHJpbmcpIG5leHQpLmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZElubmVyVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPFN0cmluZywgSW50ZWdlcj4obmVzdGVkSXRlcmF0b3IpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0KCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZU5lc3RlZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFVubW9kaWZpYWJsZUxpc3QoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWwuYWRkKCIxIik7Ci0JCWwuYWRkKCIyMiIpOwotCQlsLmFkZCgiMzMzIik7Ci0JCWwuYWRkKCI0NDQ0Iik7Ci0JCWwuYWRkKCI1NTU1NSIpOwotCQlsLmFkZCgiNjY2NjY2Iik7Ci0JCWwuYWRkKCI3Nzc3Nzc3Iik7Ci0JCWwuYWRkKCI4ODg4ODg4OCIpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUxpc3QoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoKSB7Ci0JCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCUl0ZXJhdG9yPEludGVnZXI+IGl0ZXJhdG9yID0gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPFN0cmluZywgSW50ZWdlcj4odGhpcy5idWlsZExpc3QoKS5saXN0SXRlcmF0b3IoKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUludGVnZXIgaW50ZWdlciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoImludmFsaWQgaW50ZWdlcjogIiArIGludGVnZXIpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTVmMWE4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBUcmVlSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKiogdGhpcyB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGFsbCB0aGUgbm9kZXMgY3JlYXRlZCBmb3IgdGhlIHRlc3QgKi8KLQlDb2xsZWN0aW9uPFRyZWVOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGU+KCk7Ci0KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0MSgpIHsKLQkJdGhpcy52ZXJpZnlIYXNOZXh0KHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0MigpIHsKLQkJdGhpcy52ZXJpZnlIYXNOZXh0KHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOZXh0KEl0ZXJhdG9yPFRyZWVOb2RlPiBpdGVyYXRvcikgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5ub2Rlcy5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0MSgpIHsKLQkJdGhpcy52ZXJpZnlOZXh0KHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0MigpIHsKLQkJdGhpcy52ZXJpZnlOZXh0KHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOZXh0KEl0ZXJhdG9yPFRyZWVOb2RlPiBpdGVyYXRvcikgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBlbGVtZW50IiwgdGhpcy5ub2Rlcy5jb250YWlucyhpdGVyYXRvci5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uMSgpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uMigpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPFRyZWVOb2RlPiBpdGVyYXRvcikgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUxKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZSh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlMigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmUodGhpcy5idWlsZFRyZWVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZShJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJU3RyaW5nIHBhcmVudE5hbWUgPSAiY2hpbGQgMiI7Ci0JCVN0cmluZyBjaGlsZE5hbWUgPSAiZ3JhbmRjaGlsZCAyQSI7Ci0JCWludCBzdGFydFNpemUgPSB0aGlzLmNoaWxkcmVuU2l6ZShwYXJlbnROYW1lKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVHJlZU5vZGUgbm9kZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMoY2hpbGROYW1lKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWludCBlbmRTaXplID0gdGhpcy5jaGlsZHJlblNpemUocGFyZW50TmFtZSk7Ci0JCWFzc2VydEVxdWFscyhzdGFydFNpemUgLSAxLCBlbmRTaXplKTsKLQl9Ci0KLQlwcml2YXRlIGludCBjaGlsZHJlblNpemUoU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8VHJlZU5vZGU+IHN0cmVhbSA9IHRoaXMubm9kZXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCVRyZWVOb2RlIG5vZGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscyhub2RlTmFtZSkpIHsKLQkJCQlyZXR1cm4gbm9kZS5jaGlsZHJlblNpemUoKTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5vZGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCBhIHRyZWUgaXRlcmF0b3Igd2l0aCBhbiBleHBsaWNpdCBtaWR3aWZlCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxUcmVlTm9kZT4gYnVpbGRUcmVlSXRlcmF0b3IxKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvcjxUcmVlTm9kZT4odGhpcy5idWlsZFRyZWUoKSwgdGhpcy5idWlsZE1pZHdpZmUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlSXRlcmF0b3IuTWlkd2lmZTxUcmVlTm9kZT4gYnVpbGRNaWR3aWZlKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvci5NaWR3aWZlPFRyZWVOb2RlPigpIHsKLQkJCXB1YmxpYyBJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oVHJlZU5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSB0cmVlIGl0ZXJhdG9yIHdpdGggYW4gb3ZlcnJpZGUKLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yPFRyZWVOb2RlPiBidWlsZFRyZWVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPFRyZWVOb2RlPih0aGlzLmJ1aWxkVHJlZSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oVHJlZU5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUcmVlSXRlcmF0b3IoKSB7Ci0JCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCUl0ZXJhdG9yPFRyZWVOb2RlPiBpdGVyYXRvciA9IG5ldyBUcmVlSXRlcmF0b3I8VHJlZU5vZGU+KHRoaXMuYnVpbGRUcmVlKCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlUcmVlTm9kZSB0biA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoImludmFsaWQgdHJlZSBub2RlOiAiICsgdG4pOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVOb2RlIGJ1aWxkVHJlZSgpIHsKLQkJVHJlZU5vZGUgcm9vdCA9IG5ldyBUcmVlTm9kZSgicm9vdCIpOwotCQlUcmVlTm9kZSBjaGlsZDEgPSBuZXcgVHJlZU5vZGUocm9vdCwgImNoaWxkIDEiKTsKLQkJbmV3IFRyZWVOb2RlKGNoaWxkMSwgImdyYW5kY2hpbGQgMUEiKTsKLQkJVHJlZU5vZGUgY2hpbGQyID0gbmV3IFRyZWVOb2RlKHJvb3QsICJjaGlsZCAyIik7Ci0JCW5ldyBUcmVlTm9kZShjaGlsZDIsICJncmFuZGNoaWxkIDJBIik7Ci0JCVRyZWVOb2RlIGdyYW5kY2hpbGQyQiA9IG5ldyBUcmVlTm9kZShjaGlsZDIsICJncmFuZGNoaWxkIDJCIik7Ci0JCW5ldyBUcmVlTm9kZShncmFuZGNoaWxkMkIsICJncmVhdC1ncmFuZGNoaWxkIDJCMSIpOwotCQluZXcgVHJlZU5vZGUoZ3JhbmRjaGlsZDJCLCAiZ3JlYXQtZ3JhbmRjaGlsZCAyQjIiKTsKLQkJVHJlZU5vZGUgZ3JhbmRjaGlsZDJDID0gbmV3IFRyZWVOb2RlKGNoaWxkMiwgImdyYW5kY2hpbGQgMkMiKTsKLQkJbmV3IFRyZWVOb2RlKGdyYW5kY2hpbGQyQywgImdyZWF0LWdyYW5kY2hpbGQgMkMxIik7Ci0JCW5ldyBUcmVlTm9kZShyb290LCAiY2hpbGQgMyIpOwotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRyZWVOb2RlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFRyZWVOb2RlPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGU+KCk7Ci0KLQkJcHVibGljIFRyZWVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJVHJlZUl0ZXJhdG9yVGVzdHMudGhpcy5ub2Rlcy5hZGQodGhpcyk7IC8vIGxvZyBub2RlCi0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFRyZWVOb2RlKFRyZWVOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMobmFtZSk7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZENoaWxkKFRyZWVOb2RlIGNoaWxkKSB7Ci0JCQl0aGlzLmNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW4uc2l6ZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRyZWVOb2RlKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL0Fic3RyYWN0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjM5NGE5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0TW9kZWxUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLQlpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciwgTGlzdENoYW5nZUxpc3RlbmVyLCBUcmVlQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIFRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVE9fU1RSSU5HID0gInRoaXMgaXMgYSB0ZXN0IjsKLQotCXByaXZhdGUgU3RhdGVDaGFuZ2VFdmVudCBzdGF0ZUNoYW5nZUV2ZW50OwotCXByaXZhdGUgYm9vbGVhbiBzdGF0ZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBwcm9wZXJ0eUNoYW5nZUV2ZW50OwotCXByaXZhdGUgYm9vbGVhbiBwcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gInByb3BlcnR5TmFtZSI7Ci0Jc3RhdGljIGZpbmFsIE9iamVjdCBPTERfT0JKRUNUX1ZBTFVFID0gbmV3IE9iamVjdCgpOwotCXN0YXRpYyBmaW5hbCBPYmplY3QgTkVXX09CSkVDVF9WQUxVRSA9IG5ldyBPYmplY3QoKTsKLQlzdGF0aWMgZmluYWwgSW50ZWdlciBPTERfSU5UX1ZBTFVFID0gbmV3IEludGVnZXIoMjcpOwotCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIE5FV19JTlRfVkFMVUUgPSBuZXcgSW50ZWdlcig0Mik7Ci0Jc3RhdGljIGZpbmFsIEJvb2xlYW4gT0xEX0JPT0xFQU5fVkFMVUUgPSBCb29sZWFuLlRSVUU7Ci0Jc3RhdGljIGZpbmFsIEJvb2xlYW4gTkVXX0JPT0xFQU5fVkFMVUUgPSBCb29sZWFuLkZBTFNFOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgY29sbGVjdGlvbkNoYW5nZUV2ZW50OwotCXByaXZhdGUgYm9vbGVhbiBpdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBpdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTExFQ1RJT05fTkFNRSA9ICJjb2xsZWN0aW9uTmFtZSI7Ci0Jc3RhdGljIGZpbmFsIE9iamVjdCBBRERFRF9PQkpFQ1RfVkFMVUUgPSBuZXcgT2JqZWN0KCk7Ci0Jc3RhdGljIGZpbmFsIE9iamVjdCBSRU1PVkVEX09CSkVDVF9WQUxVRSA9IG5ldyBPYmplY3QoKTsKLQlzdGF0aWMgZmluYWwgaW50IFRBUkdFVF9JTkRFWCA9IDc7Ci0Jc3RhdGljIGZpbmFsIGludCBTT1VSQ0VfSU5ERVggPSAyMjsKLQotCXByaXZhdGUgTGlzdENoYW5nZUV2ZW50IGxpc3RDaGFuZ2VFdmVudDsKLQlwcml2YXRlIGJvb2xlYW4gaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBpdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBpdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBsaXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBsaXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX05BTUUgPSAibGlzdE5hbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfSU5ERVggPSAzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRU1PVkVfSU5ERVggPSA1OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX0lOREVYID0gMjsKLQotCXByaXZhdGUgVHJlZUNoYW5nZUV2ZW50IHRyZWVDaGFuZ2VFdmVudDsKLQlwcml2YXRlIGJvb2xlYW4gbm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIG5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHRyZWVDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVfTkFNRSA9ICJ0cmVlTmFtZSI7Ci0Jc3RhdGljIGZpbmFsIE9iamVjdFtdIE9CSkVDVF9BUlJBWV9QQVRIID0ge25ldyBPYmplY3QoKSwgbmV3IE9iamVjdCgpLCBuZXcgU3RyaW5nKCl9OwotCXN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9QQVRIID0ge307Ci0KLQlwdWJsaWMgQWJzdHJhY3RNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVTdGF0ZUNoYW5nZSgpIHsKLQkJdGhpcy5zdGF0ZUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zdGF0ZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVTdGF0ZUNoYW5nZSgpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuc3RhdGVDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5zdGF0ZUNoYW5nZUV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN0YXRlQ2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZU9iamVjdE9iamVjdCgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlT2JqZWN0T2JqZWN0KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPTERfT0JKRUNUX1ZBTFVFLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VPYmplY3RPYmplY3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VPYmplY3RPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZU9iamVjdE9iamVjdCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VPYmplY3QoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZU9iamVjdCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQobnVsbCwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlT2JqZWN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlT2JqZWN0KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChudWxsLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VPYmplY3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlSW50SW50KCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VJbnRJbnQoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9JTlRfVkFMVUUsIE5FV19JTlRfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZUludEludCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZUludEludCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX0lOVF9WQUxVRSwgTkVXX0lOVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlSW50SW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZUJvb2xlYW5Cb29sZWFuKCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VCb29sZWFuQm9vbGVhbigpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX0JPT0xFQU5fVkFMVUUsIE5FV19CT09MRUFOX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VCb29sZWFuQm9vbGVhbigpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZUJvb2xlYW5Cb29sZWFuKCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPTERfQk9PTEVBTl9WQUxVRSwgTkVXX0JPT0xFQU5fVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZUJvb2xlYW5Cb29sZWFuKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtQWRkZWRDb2xsZWN0aW9uKCkgewotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZUV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlbW92ZWRDb2xsZWN0aW9uKCkgewotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZUV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZUV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCkgewotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZUV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZUV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtQWRkZWRMaXN0KCkgewotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdENoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtQWRkZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1SZW1vdmVkTGlzdCgpIHsKLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2VFdmVudChSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZUV2ZW50KFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpIHsKLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVwbGFjZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZUV2ZW50KFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdENoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZXBsYWNlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoUkVQTEFDRV9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZXBsYWNlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbU1vdmVkTGlzdCgpIHsKLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtTW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZUV2ZW50KFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1Nb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtTW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZUV2ZW50KFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbU1vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdENoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2xlYXJlZCgpIHsKLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2VFdmVudCgtMSwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdENoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkKCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZUV2ZW50KC0xLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTGlzdENoYW5nZWQoKSB7Ci0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoLTEsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2hhbmdlZCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2VFdmVudCgtMSwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVBZGRlZE9iamVjdEFycmF5UGF0aCgpIHsKLQkJdGhpcy50cmVlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZUFkZGVkT2JqZWN0QXJyYXlQYXRoKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUNoYW5nZUV2ZW50KE9CSkVDVF9BUlJBWV9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZUFkZGVkT2JqZWN0QXJyYXlQYXRoKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlQ2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRPYmplY3RBcnJheVBhdGgoKTsKLQkJdGhpcy52ZXJpZnlUcmVlQ2hhbmdlRXZlbnQoT0JKRUNUX0FSUkFZX1BBVEgpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZE9iamVjdEFycmF5UGF0aCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlQWRkZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTm9kZVJlbW92ZWRPYmplY3RBcnJheVBhdGgoKSB7Ci0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlUmVtb3ZlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRPYmplY3RBcnJheVBhdGgoKTsKLQkJdGhpcy52ZXJpZnlUcmVlQ2hhbmdlRXZlbnQoT0JKRUNUX0FSUkFZX1BBVEgpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZVJlbW92ZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlUmVtb3ZlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRPYmplY3RBcnJheVBhdGgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZVJlbW92ZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlUmVtb3ZlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlUmVtb3ZlZE9iamVjdEFycmF5UGF0aCgpOwotCQl0aGlzLnZlcmlmeVRyZWVDaGFuZ2VFdmVudChPQkpFQ1RfQVJSQVlfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkT2JqZWN0QXJyYXlQYXRoKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlQ2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVRyZWVDbGVhcmVkKCkgewotCQl0aGlzLnRyZWVDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDbGVhcmVkKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUNoYW5nZUV2ZW50KEVNUFRZX1BBVEgpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeVRyZWVDaGFuZ2VFdmVudChFTVBUWV9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNoYW5nZWRPYmplY3RBcnJheVBhdGgoKSB7Ci0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWRPYmplY3RBcnJheVBhdGgoKTsKLQkJdGhpcy52ZXJpZnlUcmVlQ2hhbmdlRXZlbnQoT0JKRUNUX0FSUkFZX1BBVEgpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWRPYmplY3RBcnJheVBhdGgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2hhbmdlZE9iamVjdEFycmF5UGF0aCgpOwotCQl0aGlzLnZlcmlmeVRyZWVDaGFuZ2VFdmVudChPQkpFQ1RfQVJSQVlfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkT2JqZWN0QXJyYXlQYXRoKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlQ2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55Q2hhbmdlTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcyk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ09MTEVDVElPTl9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENPTExFQ1RJT05fTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENPTExFQ1RJT05fTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVFJFRV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRSRUVfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcyk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCgpIHsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQotCQkvLyB2ZXJpZnkgdGhhdCB0aGUgY2xvbmUgZG9lcyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzCi0JCVRlc3RNb2RlbCBjbG9uZSA9IHRoaXMudGVzdE1vZGVsLmNsb25lKCk7Ci0JCWFzc2VydEZhbHNlKGNsb25lLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJY2xvbmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJYXNzZXJ0VHJ1ZShjbG9uZS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCS8vIGNoZWNrIG9yaWdpbmFsCi0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCi0JCS8vIG5vdyB0ZXN0IGV2ZW50cyBmaXJlZCBieSBvcmlnaW5hbAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VPYmplY3RPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCS8vIG5vdyB0ZXN0IGV2ZW50cyBmaXJlZCBieSBjbG9uZQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCWNsb25lLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VPYmplY3RPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KGNsb25lLCBPTERfT0JKRUNUX1ZBTFVFLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbFN0YXRlTGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobnVsbCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIobnVsbCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxMaXN0TGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbFRyZWVMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsUHJvcGVydHlMaXN0ZW5lck5hbWUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsQ29sbGVjdGlvbkxpc3RlbmVyTmFtZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJmb28iLCBudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbExpc3RMaXN0ZW5lck5hbWUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxUcmVlTGlzdGVuZXJOYW1lKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c1N0YXRlTGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihuZXcgQWJzdHJhY3RNb2RlbFRlc3RzKCJkdW1teSIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUJvZ3VzUHJvcGVydHlMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IEFic3RyYWN0TW9kZWxUZXN0cygiZHVtbXkiKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c0NvbGxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIobmV3IEFic3RyYWN0TW9kZWxUZXN0cygiZHVtbXkiKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c0xpc3RMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobmV3IEFic3RyYWN0TW9kZWxUZXN0cygiZHVtbXkiKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c1RyZWVMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIobmV3IEFic3RyYWN0TW9kZWxUZXN0cygiZHVtbXkiKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c1Byb3BlcnR5TGlzdGVuZXJOYW1lKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBBYnN0cmFjdE1vZGVsVGVzdHMoImR1bW15IikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQm9ndXNDb2xsZWN0aW9uTGlzdGVuZXJOYW1lKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcyk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBBYnN0cmFjdE1vZGVsVGVzdHMoImR1bW15IikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQm9ndXNMaXN0TGlzdGVuZXJOYW1lKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcyk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBBYnN0cmFjdE1vZGVsVGVzdHMoImR1bW15IikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQm9ndXNUcmVlTGlzdGVuZXJOYW1lKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcyk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBBYnN0cmFjdE1vZGVsVGVzdHMoImR1bW15IikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudG9TdHJpbmcoKS5pbmRleE9mKFRFU1RfVE9fU1RSSU5HKSAhPSAtMSk7Ci0JfQotCi0vLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMudGVzdE1vZGVsLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFBST1BFUlRZX05BTUUsIHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvbkNoYW5nZUV2ZW50KE9iamVjdCBpdGVtKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlRXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNoYW5nZUV2ZW50Lml0ZW1zKCkuaGFzTmV4dCgpKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudC5pdGVtcygpLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdENoYW5nZUV2ZW50KGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoaW5kZXgsIGl0ZW0sIG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5saXN0Q2hhbmdlRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTElTVF9OQU1FLCB0aGlzLmxpc3RDaGFuZ2VFdmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRhcmdldEluZGV4LCB0aGlzLmxpc3RDaGFuZ2VFdmVudC5nZXRUYXJnZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZUluZGV4LCB0aGlzLmxpc3RDaGFuZ2VFdmVudC5nZXRTb3VyY2VJbmRleCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdENoYW5nZUV2ZW50KGludCBpbmRleCwgT2JqZWN0IGl0ZW0sIE9iamVjdCByZXBsYWNlZEl0ZW0pIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5saXN0Q2hhbmdlRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTElTVF9OQU1FLCB0aGlzLmxpc3RDaGFuZ2VFdmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGluZGV4LCB0aGlzLmxpc3RDaGFuZ2VFdmVudC5nZXRJbmRleCgpKTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2hhbmdlRXZlbnQuaXRlbXMoKS5oYXNOZXh0KCkpOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKGl0ZW0sIHRoaXMubGlzdENoYW5nZUV2ZW50Lml0ZW1zKCkubmV4dCgpKTsKLQkJfQotCQlpZiAocmVwbGFjZWRJdGVtID09IG51bGwpIHsKLQkJCWFzc2VydEZhbHNlKHRoaXMubGlzdENoYW5nZUV2ZW50LnJlcGxhY2VkSXRlbXMoKS5oYXNOZXh0KCkpOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKHJlcGxhY2VkSXRlbSwgdGhpcy5saXN0Q2hhbmdlRXZlbnQucmVwbGFjZWRJdGVtcygpLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VHJlZUNoYW5nZUV2ZW50KE9iamVjdFtdIHBhdGgpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnRyZWVDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy50cmVlQ2hhbmdlRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoVFJFRV9OQU1FLCB0aGlzLnRyZWVDaGFuZ2VFdmVudC5nZXRUcmVlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHBhdGgsIHRoaXMudHJlZUNoYW5nZUV2ZW50LmdldFBhdGgoKSkpOwotCX0KLQotLy8gKioqKioqKioqKiBsaXN0ZW5lciBpbXBsZW1lbnRhdGlvbnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLnN0YXRlQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0JCXRoaXMuc3RhdGVDaGFuZ2VFdmVudCA9IGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gdHJ1ZTsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSB0cnVlOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCA9IGU7Ci0JfQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSB0cnVlOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCA9IGU7Ci0JfQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSB0cnVlOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCA9IGU7Ci0JfQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSB0cnVlOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VFdmVudCA9IGU7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBlOwotCX0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJdGhpcy5saXN0Q2hhbmdlRXZlbnQgPSBlOwotCX0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSB0cnVlOwotCQl0aGlzLmxpc3RDaGFuZ2VFdmVudCA9IGU7Ci0JfQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IHRydWU7Ci0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gZTsKLQl9Ci0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IHRydWU7Ci0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gZTsKLQl9Ci0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0Q2hhbmdlZENhbGxlZCA9IHRydWU7Ci0JCXRoaXMubGlzdENoYW5nZUV2ZW50ID0gZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5ub2RlQWRkZWRDYWxsZWQgPSB0cnVlOwotCQl0aGlzLnRyZWVDaGFuZ2VFdmVudCA9IGU7Ci0JfQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSB0cnVlOwotCQl0aGlzLnRyZWVDaGFuZ2VFdmVudCA9IGU7Ci0JfQotCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSB0cnVlOwotCQl0aGlzLnRyZWVDaGFuZ2VFdmVudCA9IGU7Ci0JfQotCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotCQl0aGlzLnRyZWVDaGFuZ2VFdmVudCA9IGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0JCVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVTdGF0ZUNoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VPYmplY3RPYmplY3QoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPUEVSVFlfTkFNRSwgT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZU9iamVjdCgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlSW50SW50KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1BFUlRZX05BTUUsIE9MRF9JTlRfVkFMVUUuaW50VmFsdWUoKSwgTkVXX0lOVF9WQUxVRS5pbnRWYWx1ZSgpKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlQm9vbGVhbkJvb2xlYW4oKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPUEVSVFlfTkFNRSwgT0xEX0JPT0xFQU5fVkFMVUUuYm9vbGVhblZhbHVlKCksIE5FV19CT09MRUFOX1ZBTFVFLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoQ09MTEVDVElPTl9OQU1FLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlbW92ZWRDb2xsZWN0aW9uKCkgewotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoQ09MTEVDVElPTl9OQU1FLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVDb2xsZWN0aW9uQ2xlYXJlZCgpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtQWRkZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbUFkZGVkKExJU1RfTkFNRSwgQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoTElTVF9OQU1FLCBSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1SZXBsYWNlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWQoTElTVF9OQU1FLCBSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1Nb3ZlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtTW92ZWQoTElTVF9OQU1FLCBUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2xlYXJlZCgpIHsKLQkJCXRoaXMuZmlyZUxpc3RDbGVhcmVkKExJU1RfTkFNRSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2hhbmdlZCgpIHsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfTkFNRSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlQWRkZWRPYmplY3RBcnJheVBhdGgoKSB7Ci0JCQl0aGlzLmZpcmVOb2RlQWRkZWQoVFJFRV9OQU1FLCBPQkpFQ1RfQVJSQVlfUEFUSCk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlUmVtb3ZlZE9iamVjdEFycmF5UGF0aCgpIHsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKFRSRUVfTkFNRSwgT0JKRUNUX0FSUkFZX1BBVEgpOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNsZWFyZWQoKSB7Ci0JCQl0aGlzLmZpcmVUcmVlQ2xlYXJlZChUUkVFX05BTUUpOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNoYW5nZWRPYmplY3RBcnJheVBhdGgoKSB7Ci0JCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZChUUkVFX05BTUUsIE9CSkVDVF9BUlJBWV9QQVRIKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKCkgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChudWxsLCBuZXcgT2JqZWN0KCkpKTsKLQkJCWFzc2VydFRydWUodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQobmV3IE9iamVjdCgpLCBudWxsKSk7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKG5ldyBPYmplY3QoKSwgbmV3IE9iamVjdCgpKSk7Ci0JCi0JCQlPYmplY3Qgc2FtZSA9IG5ldyBPYmplY3QoKTsKLQkJCWFzc2VydEZhbHNlKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHNhbWUsIHNhbWUpKTsKLQkJCWFzc2VydEZhbHNlKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKG51bGwsIG51bGwpKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFRlc3RNb2RlbCBjbG9uZSgpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIChUZXN0TW9kZWwpIHN1cGVyLmNsb25lKCk7Ci0JCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCQl9Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZChURVNUX1RPX1NUUklORyk7Ci0JCX0KLQkKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VyaWFsaXphdGlvbiB0ZXN0ICoqKioqKioqKioJCi0KLS8vVE9ETyAtIFRoaXMgdGVzdCBkb2Vzbid0IHBhc3MgaW4gdGhlIEVjbGlwc2UgYnVpbGQgZW52aXJvbm1lbnQgKExpbnV4KSBmb3Igc29tZSByZWFzb24KLS8vCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLS8vCQlMb2NhbE1vZGVsIG1vZGVsMSA9IG5ldyBMb2NhbE1vZGVsKCk7Ci0vLwkJRm9vIGZvbzEgPSBuZXcgRm9vKCk7Ci0vLwkJQmFyIGJhcjEgPSBuZXcgQmFyKCk7Ci0vLwkJSm9vIGpvbzEgPSBuZXcgSm9vKCk7Ci0vLwkJSmFyIGphcjEgPSBuZXcgSmFyKCk7Ci0vLwkJbW9kZWwxLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoZm9vMSk7Ci0vLwkJbW9kZWwxLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoYmFyMSk7Ci0vLwkJbW9kZWwxLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihqb28xKTsKLS8vCQltb2RlbDEuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGphcjEpOwotLy8KLS8vCQlDaGFuZ2VMaXN0ZW5lcltdIGxpc3RlbmVyczEgPSB0aGlzLmxpc3RlbmVycyhtb2RlbDEsIFN0YXRlQ2hhbmdlTGlzdGVuZXIuY2xhc3MpOwotLy8JCWFzc2VydEVxdWFscygyLCBsaXN0ZW5lcnMxLmxlbmd0aCk7Ci0vLwkJLy8gdGhlIG9yZGVyIG9mIHRoZXNlIGNvdWxkIGNoYW5nZS4uLgotLy8JCWFzc2VydEVxdWFscyhGb28uY2xhc3MsIGxpc3RlbmVyczFbMF0uZ2V0Q2xhc3MoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJhci5jbGFzcywgbGlzdGVuZXJzMVsxXS5nZXRDbGFzcygpKTsKLS8vCi0vLwkJbGlzdGVuZXJzMSA9IHRoaXMubGlzdGVuZXJzKG1vZGVsMSwgTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzKTsKLS8vCQlhc3NlcnRFcXVhbHMoMiwgbGlzdGVuZXJzMS5sZW5ndGgpOwotLy8JCS8vIHRoZSBvcmRlciBvZiB0aGVzZSBjb3VsZCBjaGFuZ2UuLi4KLS8vCQlhc3NlcnRFcXVhbHMoSm9vLmNsYXNzLCBsaXN0ZW5lcnMxWzBdLmdldENsYXNzKCkpOwotLy8JCWFzc2VydEVxdWFscyhKYXIuY2xhc3MsIGxpc3RlbmVyczFbMV0uZ2V0Q2xhc3MoKSk7Ci0vLwotLy8JCUxvY2FsTW9kZWwgbW9kZWwyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShtb2RlbDEpOwotLy8KLS8vCQlDaGFuZ2VMaXN0ZW5lcltdIGxpc3RlbmVyczIgPSB0aGlzLmxpc3RlbmVycyhtb2RlbDIsIFN0YXRlQ2hhbmdlTGlzdGVuZXIuY2xhc3MpOwotLy8JCWFzc2VydEVxdWFscygxLCBsaXN0ZW5lcnMyLmxlbmd0aCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEZvby5jbGFzcywgbGlzdGVuZXJzMlswXS5nZXRDbGFzcygpKTsKLS8vCi0vLwkJbGlzdGVuZXJzMiA9IHRoaXMubGlzdGVuZXJzKG1vZGVsMiwgTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzKTsKLS8vCQlhc3NlcnRFcXVhbHMoMSwgbGlzdGVuZXJzMi5sZW5ndGgpOwotLy8JCWFzc2VydEVxdWFscyhKb28uY2xhc3MsIGxpc3RlbmVyczJbMF0uZ2V0Q2xhc3MoKSk7Ci0vLwl9Ci0KLS8vID4+Pj4+Pj4+Pj4+Pj4+Pj4+IHRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSAjdGVzdFNlcmlhbGl6YXRpb24oKSwgY29tbWVudGVkIG91dCBhYm92ZS4uLgotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXJbXSBsaXN0ZW5lcnMoTG9jYWxNb2RlbCBtb2RlbCwgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckNsYXNzKSB7Ci0JCUNoYW5nZVN1cHBvcnQgY2hhbmdlU3VwcG9ydCA9IChDaGFuZ2VTdXBwb3J0KSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUobW9kZWwsICJjaGFuZ2VTdXBwb3J0Iik7Ci0JCXJldHVybiAoQ2hhbmdlTGlzdGVuZXJbXSkgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKGNoYW5nZVN1cHBvcnQsICJsaXN0ZW5lcnMiLCBDbGFzcy5jbGFzcywgbGlzdGVuZXJDbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQlMb2NhbE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZvbyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgU3RhdGVDaGFuZ2VMaXN0ZW5lciB7Ci0JCUZvbygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEJhciBpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIgewotCQlCYXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBKb28gZXh0ZW5kcyBMaXN0Q2hhbmdlQWRhcHRlciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0vLwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0U3RyZWFtRmllbGRbXSBzZXJpYWxQZXJzaXN0ZW50RmllbGRzID0ge25ldyBPYmplY3RTdHJlYW1GaWVsZCgiY2hhbmdlU3VwcG9ydCIsIENoYW5nZVN1cHBvcnQuY2xhc3MpfTsKLQkJSm9vKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEphciBleHRlbmRzIExpc3RDaGFuZ2VBZGFwdGVyIHsKLQkJSmFyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBidWcoPykgdGVzdCAqKioqKioqKioqCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElTRV9NRVNTQUdFID0gInRoaXMgb2JqZWN0IGlzIG5vIGxvbmdlciBsaXN0ZW5pbmcgdG8gbG9jYWxBIjsKLQotCS8qKgotCSAqIFRlc3QgdGhlIGZvbGxvd2luZyBzaXR1YXRpb246Ci0JICogCS0gYm90aCBCIGFuZCBDIGFyZSBsaXN0ZW5pbmcgdG8gQQotCSAqIAktIEMgaXMgYWxzbyBsaXN0ZW5pbmcgdG8gQgotCSAqIAktIHdoZW4gQiByZWNlaXZlcyBhbiBldmVudCBmcm9tIEEsIGl0IHdpbGwgZmlyZSBhbiBldmVudCB0byBDCi0JICogCS0gd2hlbiBDIHJlY2VpdmVzIGFuIGV2ZW50IGZyb20gQiwgaXQgd2lsbCBTVE9QIGxpc3RlbmluZyB0byBBCi0JICogCS0gdGhlIGV2ZW50IGZyb20gQiB0byBDIG1heSBiZSBwcmVjZWRlZCBvciBmb2xsb3dlZCAoZGVwZW5kaW5nIG9uCi0JICogCQl0aGUgaGFzaCBwb3NpdGlvbnMgb2YgbGlzdGVuZXJzKSBieSBhbiBldmVudCBmcm9tIEEgdG8gQzoKLQkgKiAJCS0gaWYgdGhlIEEgdG8gQyBldmVudCBjb21lcyBmaXJzdCwgbm8gcHJvYmxlbQotCSAqIAkJLSBidXQgaWYgdGhlIEEgdG8gQiBldmVudCBjb21lcyBmaXJzdCwgdGhlIEEgdG8gQyBldmVudCBzaG91bGQgTk9UIGhhcHBlbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFJlbW92ZVN0YXRlTGlzdGVuZXIoKSB7Ci0JCXRoaXMudmVyaWZ5SW5kaXJlY3RSZW1vdmVMaXN0ZW5lcigKLQkJCW5ldyBOb3RpZnlDb21tYW5kKCkgewotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhMb2NhbEEgbG9jYWxBKSB7Ci0JCQkJCWxvY2FsQS5ub3RpZnlTdGF0ZUxpc3RlbmVycygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RSZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQl0aGlzLnZlcmlmeUluZGlyZWN0UmVtb3ZlTGlzdGVuZXIoCi0JCQluZXcgTm90aWZ5Q29tbWFuZCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoTG9jYWxBIGxvY2FsQSkgewotCQkJCQlsb2NhbEEubm90aWZ5UHJvcGVydHlMaXN0ZW5lcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGlyZWN0UmVtb3ZlQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQl0aGlzLnZlcmlmeUluZGlyZWN0UmVtb3ZlTGlzdGVuZXIoCi0JCQluZXcgTm90aWZ5Q29tbWFuZCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoTG9jYWxBIGxvY2FsQSkgewotCQkJCQlsb2NhbEEubm90aWZ5Q29sbGVjdGlvbkxpc3RlbmVycygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RSZW1vdmVMaXN0TGlzdGVuZXIoKSB7Ci0JCXRoaXMudmVyaWZ5SW5kaXJlY3RSZW1vdmVMaXN0ZW5lcigKLQkJCW5ldyBOb3RpZnlDb21tYW5kKCkgewotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhMb2NhbEEgbG9jYWxBKSB7Ci0JCQkJCWxvY2FsQS5ub3RpZnlMaXN0TGlzdGVuZXJzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFJlbW92ZVRyZWVMaXN0ZW5lcigpIHsKLQkJdGhpcy52ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKAotCQkJbmV3IE5vdGlmeUNvbW1hbmQoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKExvY2FsQSBsb2NhbEEpIHsKLQkJCQkJbG9jYWxBLm5vdGlmeVRyZWVMaXN0ZW5lcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmVyaWZ5SW5kaXJlY3RSZW1vdmVMaXN0ZW5lcihOb3RpZnlDb21tYW5kIGNvbW1hbmQpIHsKLQkJTG9jYWxBIGxvY2FsQSA9IG5ldyBMb2NhbEEoKTsKLQkJTG9jYWxCIGxvY2FsQiA9IG5ldyBMb2NhbEIobG9jYWxBKTsKLQotCQkvLyBidWlsZCBhIGJ1bmNoIG9mIExvY2FsQ3Mgc28gYXQgbGVhc3Qgb25lIG9mIHRoZW0gaXMgbm90aWZpZWQgQUZURVIgdGhlIExvY2FsQjsKLQkJLy8gdXNpbmcgMTAwMCBzZWVtZWQgdG8gZmFpbCB2ZXJ5IGNvbnNpc3RlbnRseSBiZWZvcmUgQ2hhbmdlU3VwcG9ydCB3YXMgZml4ZWQKLQkJTG9jYWxDW10gbG9jYWxDcyA9IG5ldyBMb2NhbENbMTAwMF07Ci0JCWZvciAoaW50IGkgPSBsb2NhbENzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlsb2NhbENzW2ldID0gbmV3IExvY2FsQyhsb2NhbEEsIGxvY2FsQik7Ci0JCX0KLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQljb21tYW5kLm5vdGlmeUxpc3RlbmVycyhsb2NhbEEpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkgPT0gSVNFX01FU1NBR0UpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IGV4OwotCQkJfQotCQl9Ci0JCWFzc2VydEZhbHNlKGV4Q2F1Z2h0KTsKLQotCQlmb3IgKGludCBpID0gbG9jYWxDcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJYXNzZXJ0RmFsc2UobG9jYWxDc1tpXS5pc0xpc3RlbmluZ1RvTG9jYWxBKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgTm90aWZ5Q29tbWFuZCB7Ci0JCXZvaWQgbm90aWZ5TGlzdGVuZXJzKExvY2FsQSBsb2NhbEEpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgb2JqZWN0IHNpbXBseSBmaXJlcyBhIHN0YXRlIGNoYW5nZSBldmVudC4gQm90aCBMb2NhbEIgYW5kIExvY2FsQwotCSAqIHdpbGwgYmUgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExvY2FsQSBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlMb2NhbEEoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXZvaWQgbm90aWZ5U3RhdGVMaXN0ZW5lcnMoKSB7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQl2b2lkIG5vdGlmeVByb3BlcnR5TGlzdGVuZXJzKCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKCJmb28iLCAxLCAyKTsKLQkJfQotCQl2b2lkIG5vdGlmeUNvbGxlY3Rpb25MaXN0ZW5lcnMoKSB7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgiZm9vIik7Ci0JCX0KLQkJdm9pZCBub3RpZnlMaXN0TGlzdGVuZXJzKCkgewotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoImZvbyIpOwotCQl9Ci0JCXZvaWQgbm90aWZ5VHJlZUxpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKCJmb28iKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgb2JqZWN0IHdpbGwgZmlyZSBzdGF0ZSBjaGFuZ2UgZXZlbnRzIHdoZW5ldmVyIGl0IHJlY2VpdmVzCi0JICogYSBzdGF0ZSBjaGFuZ2UgZXZlbnQgZnJvbSBsb2NhbEEuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxCCi0JCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCQlpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciwgTGlzdENoYW5nZUxpc3RlbmVyLCBUcmVlQ2hhbmdlTGlzdGVuZXIKLQl7Ci0JCUxvY2FsQihMb2NhbEEgbG9jYWxBKSB7Ci0JCQlzdXBlcigpOwotCQkJbG9jYWxBLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQlsb2NhbEEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCWxvY2FsQS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQlsb2NhbEEuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJbG9jYWxBLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoImJhciIsIDEsIDIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCJiYXIiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCi0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZCgiYmFyIik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCi0JCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZCgiYmFyIik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG9iamVjdCB3aWxsIGxpc3RlbiB0byB0d28gb3RoZXIgb2JqZWN0cywgbG9jYWxBIGFuZCBsb2NhbEIuCi0JICogSWYgdGhpcyBvYmplY3QgcmVjZWl2ZXMgbm90aWZpY2F0aW9uIGZyb20gbG9jYWxCLCBpdCB3aWxsIHN0b3AgbGlzdGVuaW5nIHRvCi0JICogbG9jYWxBLiBJZiB0aGlzIG9iamVjdCByZWNlaXZlcyBub3RpZmljYXRpb24gZnJvbSBsb2NhbEEsIGl0IHdpbGwgY2hlY2sgdG8KLQkgKiBzZWUgd2hldGhlciBpdCBzdGlsbCBsaXN0ZW5pbmcgdG8gbG9jYWxBLiBJZiB0aGlzIG9iamVjdCBpcyBubyBsb25nZXIKLQkgKiBsaXN0ZW5pbmcgdG8gbG9jYWxBLCBpdCB3aWxsIGNvbXBsYWluIGFib3V0IHJlY2VpdmluZyB0aGUgZXZlbnQgYW5kCi0JICogdGhyb3cgYW4gZXhjZXB0aW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExvY2FsQwotCQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQkJaW1wbGVtZW50cyBTdGF0ZUNoYW5nZUxpc3RlbmVyLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIsIExpc3RDaGFuZ2VMaXN0ZW5lciwgVHJlZUNoYW5nZUxpc3RlbmVyCi0JewotCQlwcml2YXRlIExvY2FsQSBsb2NhbEE7Ci0JCXByaXZhdGUgTG9jYWxCIGxvY2FsQjsKLQkJcHJpdmF0ZSBib29sZWFuIGxpc3RlbmluZ1RvTG9jYWxBOwotCi0JCUxvY2FsQyhMb2NhbEEgbG9jYWxBLCBMb2NhbEIgbG9jYWxCKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5sb2NhbEEgPSBsb2NhbEE7Ci0JCQl0aGlzLmxvY2FsQiA9IGxvY2FsQjsKLQotCQkJbG9jYWxBLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQlsb2NhbEEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCWxvY2FsQS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQlsb2NhbEEuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJbG9jYWxBLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSB0cnVlOwotCi0JCQlsb2NhbEIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCWxvY2FsQi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJbG9jYWxCLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCWxvY2FsQi5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQlsb2NhbEIuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWJvb2xlYW4gaXNMaXN0ZW5pbmdUb0xvY2FsQSgpIHsKLQkJCXJldHVybiB0aGlzLmxpc3RlbmluZ1RvTG9jYWxBOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYm9ndXMgZXZlbnQgc291cmNlOiAiICsgc291cmNlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQSkgewotCQkJCWlmICggISB0aGlzLmxpc3RlbmluZ1RvTG9jYWxBKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSVNFX01FU1NBR0UpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc291cmNlID09IHRoaXMubG9jYWxCKSB7Ci0JCQkJdGhpcy5sb2NhbEEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQl0aGlzLmxpc3RlbmluZ1RvTG9jYWxBID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJvZ3VzIGV2ZW50IHNvdXJjZTogIiArIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJib2d1cyBldmVudCBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0KLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQSkgewotCQkJCWlmICggISB0aGlzLmxpc3RlbmluZ1RvTG9jYWxBKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSVNFX01FU1NBR0UpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc291cmNlID09IHRoaXMubG9jYWxCKSB7Ci0JCQkJdGhpcy5sb2NhbEEucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYm9ndXMgZXZlbnQgc291cmNlOiAiICsgc291cmNlKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0KLQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQSkgewotCQkJCWlmICggISB0aGlzLmxpc3RlbmluZ1RvTG9jYWxBKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSVNFX01FU1NBR0UpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc291cmNlID09IHRoaXMubG9jYWxCKSB7Ci0JCQkJdGhpcy5sb2NhbEEucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYm9ndXMgZXZlbnQgc291cmNlOiAiICsgc291cmNlKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQ2hhbmdlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcHRVdGlsaXR5TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcHRVdGlsaXR5TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzdiYTdlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnB0VXRpbGl0eU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5KcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLkpwdFV0aWxpdHlNb2RlbFZhbHVlVGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU1vZGVsVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlNb2RlbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLnN1aXRlKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBYnN0cmFjdE1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTmV3RXZlbnRUZXN0cy5jbGFzcyk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VXRpbGl0eU1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9OZXdFdmVudFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL05ld0V2ZW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUwZTEzZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL05ld0V2ZW50VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogdGVzdCB3aGF0IGl0IHRha2VzIHRvIGFkZCBhIG5ldyB0eXBlIG9mIGV2ZW50IHRvCi0gKiBtb2RlbCBhbmQgY2hhbmdlIHN1cHBvcnQKLSAqLwotcHVibGljIGNsYXNzIE5ld0V2ZW50VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBGb28gZm9vOwotCi0JcHVibGljIE5ld0V2ZW50VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZm9vID0gbmV3IEZvbygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTm9Gb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzTm9Gb29DaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCUxvY2FsTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQl0aGlzLmZvby5hZGRGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc05vRm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLmZvby5yZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzTm9Gb29DaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlMb2NhbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJdGhpcy5mb28uYWRkRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy5mb28ucmVtb3ZlRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVGb29DaGFuZ2VFdmVudCgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RlbmVyLnJlY2VpdmVkRm9vRXZlbnQpOwotCQl0aGlzLmZvby5hZGRGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuZm9vLmZvbygpOwotCQlhc3NlcnRUcnVlKGxpc3RlbmVyLnJlY2VpdmVkRm9vRXZlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoYXJuZXNzIGNsYXNzZXMgKioqKioqKioqKgotCi0JY2xhc3MgRm9vIGV4dGVuZHMgQWJzdHJhY3RGb29Nb2RlbCB7Ci0JCUZvbygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJdm9pZCBmb28oKSB7Ci0JCQl0aGlzLmZpcmVGb29DaGFuZ2VFdmVudCgpOwotCQl9Ci0JfQotCi0JY2xhc3MgTG9jYWxMaXN0ZW5lciBpbXBsZW1lbnRzIEZvb0NoYW5nZUxpc3RlbmVyIHsKLQkJYm9vbGVhbiByZWNlaXZlZEZvb0V2ZW50ID0gZmFsc2U7Ci0JCUxvY2FsTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGZvb0NoYW5nZWQoRm9vQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMucmVjZWl2ZWRGb29FdmVudCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlpbnRlcmZhY2UgRm9vTW9kZWwgZXh0ZW5kcyBNb2RlbCB7Ci0JCXZvaWQgYWRkRm9vQ2hhbmdlTGlzdGVuZXIoRm9vQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCQl2b2lkIHJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQl9Ci0KLQlpbnRlcmZhY2UgRm9vQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCXZvaWQgZm9vQ2hhbmdlZChGb29DaGFuZ2VFdmVudCBldmVudCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEZvb0NoYW5nZUV2ZW50IGV4dGVuZHMgQ2hhbmdlRXZlbnQgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHVibGljIEZvb0NoYW5nZUV2ZW50KEZvb01vZGVsIHNvdXJjZSkgewotCQkJc3VwZXIoc291cmNlKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRBc3BlY3ROYW1lKCkgewotCQkJcmV0dXJuIG51bGw7ICAvLyB0aGUgcG9pbnQgb2YgdGhlIGV2ZW50IGlzIHRoYXQgdGhlIG5hbWUgaXMgdW5rbm93bi4uLgotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgRm9vQ2hhbmdlRXZlbnQgY2xvbmVXaXRoU291cmNlKE1vZGVsIG5ld1NvdXJjZSkgewotCQkJcmV0dXJuIG5ldyBGb29DaGFuZ2VFdmVudCgoRm9vTW9kZWwpIG5ld1NvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgQWJzdHJhY3RGb29Nb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBGb29Nb2RlbCB7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEZvb0NoYW5nZVN1cHBvcnQgZ2V0Q2hhbmdlU3VwcG9ydCgpIHsKLQkJCXJldHVybiAoRm9vQ2hhbmdlU3VwcG9ydCkgc3VwZXIuZ2V0Q2hhbmdlU3VwcG9ydCgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCQlyZXR1cm4gbmV3IEZvb0NoYW5nZVN1cHBvcnQodGhpcyk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRm9vQ2hhbmdlTGlzdGVuZXIoRm9vQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JCXByb3RlY3RlZCB2b2lkIGZpcmVGb29DaGFuZ2VFdmVudCgpIHsKLQkJCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVGb29DaGFuZ2VkKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGhhc05vRm9vQ2hhbmdlTGlzdGVuZXJzKCkgewotCQkJcmV0dXJuICEgdGhpcy5oYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBGb29DaGFuZ2VTdXBwb3J0IGV4dGVuZHMgQ2hhbmdlU3VwcG9ydCB7Ci0JCUZvb0NoYW5nZVN1cHBvcnQoRm9vTW9kZWwgc291cmNlKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQl9Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Rm9vQ2hhbmdlTGlzdGVuZXI+IEZPT19DSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBGb29DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQkJdm9pZCBhZGRGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5hZGRMaXN0ZW5lcihGT09fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JCX0KLQkJdm9pZCByZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5yZW1vdmVMaXN0ZW5lcihGT09fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKEZPT19DSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCQl9Ci0JCXByaXZhdGUgRm9vQ2hhbmdlTGlzdGVuZXJbXSBmb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gKEZvb0NoYW5nZUxpc3RlbmVyW10pIHRoaXMubGlzdGVuZXJzKEZPT19DSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGZpcmVGb29DaGFuZ2VkKCkgewotCQkJRm9vQ2hhbmdlTGlzdGVuZXJbXSB0YXJnZXRzID0gbnVsbDsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCUZvb0NoYW5nZUxpc3RlbmVyW10gZm9vQ2hhbmdlTGlzdGVuZXJzID0gdGhpcy5mb29DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJCQlpZiAoZm9vQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJdGFyZ2V0cyA9IGZvb0NoYW5nZUxpc3RlbmVycy5jbG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh0YXJnZXRzICE9IG51bGwpIHsKLQkJCQlGb29DaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCQkJZm9yIChGb29DaGFuZ2VMaXN0ZW5lciB0YXJnZXQgOiB0YXJnZXRzKSB7Ci0JCQkJCWJvb2xlYW4gc3RpbGxMaXN0ZW5pbmc7Ci0JCQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCQkJc3RpbGxMaXN0ZW5pbmcgPSBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5mb29DaGFuZ2VMaXN0ZW5lcnMoKSwgdGFyZ2V0KTsKLQkJCQkJfQotCQkJCQlpZiAoc3RpbGxMaXN0ZW5pbmcpIHsKLQkJCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJCWV2ZW50ID0gbmV3IEZvb0NoYW5nZUV2ZW50KChGb29Nb2RlbCkgdGhpcy5zb3VyY2UpOwotCQkJCQkJfQotCQkJCQkJdGFyZ2V0LmZvb0NoYW5nZWQoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdGhpcy5zb3VyY2VDaGFuZ2VkKG51bGwpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL0pwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODRhOWI4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGl2ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWZsZWN0aXZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZmxlY3RpdmVTdGF0ZUNoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGl2ZVRyZWVDaGFuZ2VMaXN0ZW5lclRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGQwYmFiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGl2ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcihPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAiaXRlbUFkZGVkWmVyb0FyZ3VtZW50IiwgIml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50IiwgImNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50IiwgImNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50Iik7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJpdGVtQWRkZWRTaW5nbGVBcmd1bWVudCIsICJpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50IiwgImNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnQiLCAiY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWRaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZFplcm9Bcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbUFkZGVkU2luZ2xlQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbUFkZGVkU2luZ2xlQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRaZXJvQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZVN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclN0cmluZ3MoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclN0cmluZ3MoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJTdHJpbmdzKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyU3RyaW5ncygpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VTdHJpbmdzKG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXoifSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZVN0cmluZ3MobmV3IFN0cmluZ1tdIHsiYmFyIiwgImJheiJ9KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZVN0cmluZ3MobmV3IFN0cmluZ1tdIHsiYmFyIiwgImJheiJ9KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZVN0cmluZ3MobmV3IFN0cmluZ1tdIHsiYmFyIiwgImJheiJ9KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJjb2xsZWN0aW9uQ2hhbmdlZERvdWJsZUFyZ3VtZW50Iik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSA9PSBOb1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQlNZXRob2QgbWV0aG9kID0gQ2xhc3NUb29scy5tZXRob2QodGFyZ2V0LCAiY29sbGVjdGlvbkNoYW5nZWREb3VibGVBcmd1bWVudCIsIG5ldyBDbGFzc1tdIHtDb2xsZWN0aW9uQ2hhbmdlRXZlbnQuY2xhc3MsIE9iamVjdC5jbGFzc30pOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1ldGhvZC50b1N0cmluZygpKSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNaXNtYXRjaCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCS8vIGJ1aWxkIGEgQ09MTEVDVElPTiBjaGFuZ2UgbGlzdGVuZXIgYW5kIGhhY2sgaXQgc28gd2UKLQkJLy8gY2FuIGFkZCBpdCBhcyBhIExJU1QgY2hhbmdlIGxpc3RlbmVyCi0JCU9iamVjdCBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJpdGVtQWRkZWRTaW5nbGVBcmd1bWVudCIpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKChMaXN0Q2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXN0TW9kZWwuY2hhbmdlTGlzdCgpOwotCQkJZmFpbCgibGlzdGVuZXIgbWlzbWF0Y2g6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HU19DT0xMRUNUSU9OID0gInN0cmluZ3MiOwotCQlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc3RyaW5ncykgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShTdHJpbmcgcykgewotCQkJCQlUZXN0TW9kZWwudGhpcy5yZW1vdmVTdHJpbmcocyk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQl2b2lkIGFkZFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oc3RyaW5nLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJdm9pZCByZW1vdmVTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oc3RyaW5nLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJdm9pZCBjbGVhclN0cmluZ3MoKSB7Ci0JCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLnN0cmluZ3MsIFNUUklOR1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJdm9pZCByZXBsYWNlU3RyaW5ncyhTdHJpbmdbXSBuZXdTdHJpbmdzKSB7Ci0JCQl0aGlzLnN0cmluZ3MuY2xlYXIoKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5zdHJpbmdzLCBuZXdTdHJpbmdzKTsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFNUUklOR1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJdm9pZCBjaGFuZ2VMaXN0KCkgewotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoImJvZ3VzIGxpc3QiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFyZ2V0IHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJU3RyaW5nIGNvbGxlY3Rpb25OYW1lOwotCQlTdHJpbmcgc3RyaW5nOwotCQlib29sZWFuIGl0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgU3RyaW5nIHN0cmluZykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGVzdE1vZGVsID0gdGVzdE1vZGVsOwotCQkJdGhpcy5jb2xsZWN0aW9uTmFtZSA9IGNvbGxlY3Rpb25OYW1lOwotCQkJdGhpcy5zdHJpbmcgPSBzdHJpbmc7Ci0JCX0KLQkJdm9pZCBpdGVtQWRkZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgaXRlbUFkZGVkU2luZ2xlQXJndW1lbnQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuY29sbGVjdGlvbk5hbWUsIGUuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zdHJpbmcsIGUuaXRlbXMoKS5uZXh0KCkpOwotCQl9Ci0JCXZvaWQgaXRlbVJlbW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuY29sbGVjdGlvbk5hbWUsIGUuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zdHJpbmcsIGUuaXRlbXMoKS5uZXh0KCkpOwotCQl9Ci0JCXZvaWQgY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuY29sbGVjdGlvbk5hbWUsIGUuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCQlhc3NlcnRGYWxzZShlLml0ZW1zKCkuaGFzTmV4dCgpKTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmNvbGxlY3Rpb25OYW1lLCBlLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQkJYXNzZXJ0RmFsc2UoZS5pdGVtcygpLmhhc05leHQoKSk7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZERvdWJsZUFyZ3VtZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlLCBPYmplY3QgbykgewotCQkJZmFpbCgiYm9ndXMgZXZlbnQ6ICIgKyBlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlTGlzdENoYW5nZUxpc3RlbmVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MzZhYTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlTGlzdENoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFJlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgUmVmbGVjdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgIml0ZW1BZGRlZFplcm9Bcmd1bWVudCIsICJpdGVtUmVtb3ZlZFplcm9Bcmd1bWVudCIsICJpdGVtUmVwbGFjZWRaZXJvQXJndW1lbnQiLCAiaXRlbU1vdmVkWmVyb0FyZ3VtZW50IiwgImxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50IiwgImxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50Iik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJpdGVtQWRkZWRTaW5nbGVBcmd1bWVudCIsICJpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50IiwgIml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50IiwgIml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50IiwgImxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnQiLCAibGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWRaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbUFkZGVkU2luZ2xlQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbUFkZGVkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRaZXJvQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZVN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVwbGFjZWRaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBvbGRTdHJpbmcgPSAiZm9vIjsKLQkJU3RyaW5nIG5ld1N0cmluZyA9ICJiYXIiOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKG9sZFN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbmV3U3RyaW5nLCAwLCBvbGRTdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VTdHJpbmcob2xkU3RyaW5nLCBuZXdTdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIG9sZFN0cmluZyA9ICJmb28iOwotCQlTdHJpbmcgbmV3U3RyaW5nID0gImJhciI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcob2xkU3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBuZXdTdHJpbmcsIDAsIG9sZFN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZVN0cmluZyhvbGRTdHJpbmcsIG5ld1N0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBvbGRTdHJpbmcgPSAiZm9vIjsKLQkJU3RyaW5nIG5ld1N0cmluZyA9ICJiYXIiOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKG9sZFN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbmV3U3RyaW5nLCAwLCBvbGRTdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZVN0cmluZyhvbGRTdHJpbmcsIG5ld1N0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBvbGRTdHJpbmcgPSAiZm9vIjsKLQkJU3RyaW5nIG5ld1N0cmluZyA9ICJiYXIiOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKG9sZFN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbmV3U3RyaW5nLCAwLCBvbGRTdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZVN0cmluZyhvbGRTdHJpbmcsIG5ld1N0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbU1vdmVkWmVyb0FyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ6ZXJvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoIm9uZSIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ0d28iKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidGhyZWUiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCAwLCAyKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5tb3ZlU3RyaW5nKDAsIDIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1Nb3ZlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygiemVybyIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJvbmUiKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidHdvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoInRocmVlIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgMCwgMik7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwubW92ZVN0cmluZygwLCAyKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtTW92ZWRTaW5nbGVBcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygiemVybyIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJvbmUiKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidHdvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoInRocmVlIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgMCwgMik7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5tb3ZlU3RyaW5nKDAsIDIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ6ZXJvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoIm9uZSIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ0d28iKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidGhyZWUiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCAwLCAyKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLm1vdmVTdHJpbmcoMCwgMik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENsZWFyZWRaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG51bGwsIC0xKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclN0cmluZ3MoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2xlYXJlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbnVsbCwgLTEpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyU3RyaW5ncygpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG51bGwsIC0xKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyU3RyaW5ncygpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG51bGwsIC0xKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyU3RyaW5ncygpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBudWxsLCAtMSk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZUFsbFN0cmluZ3MobmV3IFN0cmluZ1tdIHsiYmFyIiwgImJheiJ9KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbnVsbCwgLTEpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VBbGxTdHJpbmdzKG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXoifSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbnVsbCwgLTEpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZUFsbFN0cmluZ3MobmV3IFN0cmluZ1tdIHsiYmFyIiwgImJheiJ9KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBudWxsLCAtMSk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlQWxsU3RyaW5ncyhuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0pOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQxKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgImxpc3RDaGFuZ2VkRG91YmxlQXJndW1lbnQiKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpID09IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbi5jbGFzcykgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCU1ldGhvZCBtZXRob2QgPSBDbGFzc1Rvb2xzLm1ldGhvZCh0YXJnZXQsICJsaXN0Q2hhbmdlZERvdWJsZUFyZ3VtZW50IiwgbmV3IENsYXNzW10ge0xpc3RDaGFuZ2VFdmVudC5jbGFzcywgT2JqZWN0LmNsYXNzfSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5lcXVhbHMobWV0aG9kLnRvU3RyaW5nKCkpKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lck1pc21hdGNoKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJLy8gYnVpbGQgYSBMSVNUIGNoYW5nZSBsaXN0ZW5lciBhbmQgaGFjayBpdCBzbyB3ZQotCQkvLyBjYW4gYWRkIGl0IGFzIGEgQ09MTEVDVElPTiBjaGFuZ2UgbGlzdGVuZXIKLQkJT2JqZWN0IGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgIml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRlc3RNb2RlbC5jaGFuZ2VDb2xsZWN0aW9uKCk7Ci0JCQlmYWlsKCJsaXN0ZW5lciBtaXNtYXRjaDogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdTX0xJU1QgPSAic3RyaW5ncyI7Ci0JCVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLnN0cmluZ3MpOwotCQl9Ci0JCXZvaWQgYWRkU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdChzdHJpbmcsIHRoaXMuc3RyaW5ncywgU1RSSU5HU19MSVNUKTsKLQkJfQotCQl2b2lkIHJlbW92ZVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdCh0aGlzLnN0cmluZ3MuaW5kZXhPZihzdHJpbmcpLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfTElTVCk7Ci0JCX0KLQkJdm9pZCByZXBsYWNlU3RyaW5nKFN0cmluZyBvbGRTdHJpbmcsIFN0cmluZyBuZXdTdHJpbmcpIHsKLQkJCXRoaXMuc2V0SXRlbUluTGlzdCh0aGlzLnN0cmluZ3MuaW5kZXhPZihvbGRTdHJpbmcpLCBuZXdTdHJpbmcsIHRoaXMuc3RyaW5ncywgU1RSSU5HU19MSVNUKTsKLQkJfQotCQl2b2lkIG1vdmVTdHJpbmcoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCXRoaXMubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfTElTVCk7Ci0JCX0KLQkJdm9pZCBjbGVhclN0cmluZ3MoKSB7Ci0JCQl0aGlzLmNsZWFyTGlzdCh0aGlzLnN0cmluZ3MsIFNUUklOR1NfTElTVCk7Ci0JCX0KLQkJdm9pZCByZXBsYWNlQWxsU3RyaW5ncyhTdHJpbmdbXSBuZXdTdHJpbmdzKSB7Ci0JCQl0aGlzLnN0cmluZ3MuY2xlYXIoKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5zdHJpbmdzLCBuZXdTdHJpbmdzKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFNUUklOR1NfTElTVCk7Ci0JCX0KLQkJdm9pZCBjaGFuZ2VDb2xsZWN0aW9uKCkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoImJvZ3VzIGNvbGxlY3Rpb24iKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFyZ2V0IHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJU3RyaW5nIGxpc3ROYW1lOwotCQlTdHJpbmcgc3RyaW5nOwotCQlpbnQgaW5kZXg7Ci0JCVN0cmluZyByZXBsYWNlZFN0cmluZzsKLQkJaW50IHNvdXJjZUluZGV4OwotCQlib29sZWFuIGl0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBsaXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBsaXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCwgU3RyaW5nIGxpc3ROYW1lLCBTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMubGlzdE5hbWUgPSBsaXN0TmFtZTsKLQkJCXRoaXMuc3RyaW5nID0gc3RyaW5nOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl9Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgbGlzdE5hbWUsIFN0cmluZyBzdHJpbmcsIGludCBpbmRleCwgU3RyaW5nIHJlcGxhY2VkU3RyaW5nKSB7Ci0JCQl0aGlzKHRlc3RNb2RlbCwgbGlzdE5hbWUsIHN0cmluZywgaW5kZXgpOwotCQkJdGhpcy5yZXBsYWNlZFN0cmluZyA9IHJlcGxhY2VkU3RyaW5nOwotCQl9Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50ZXN0TW9kZWwgPSB0ZXN0TW9kZWw7Ci0JCQl0aGlzLmxpc3ROYW1lID0gbGlzdE5hbWU7Ci0JCQl0aGlzLmluZGV4ID0gdGFyZ2V0SW5kZXg7Ci0JCQl0aGlzLnNvdXJjZUluZGV4ID0gc291cmNlSW5kZXg7Ci0JCX0KLQkJdm9pZCBpdGVtQWRkZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgaXRlbUFkZGVkU2luZ2xlQXJndW1lbnQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdE5hbWUsIGUuZ2V0TGlzdE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zdHJpbmcsIGUuaXRlbXMoKS5uZXh0KCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuaW5kZXgsIGUuZ2V0SW5kZXgoKSk7Ci0JCX0KLQkJdm9pZCBpdGVtUmVtb3ZlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnN0cmluZywgZS5pdGVtcygpLm5leHQoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5pbmRleCwgZS5nZXRJbmRleCgpKTsKLQkJfQotCQl2b2lkIGl0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBpdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnN0cmluZywgZS5pdGVtcygpLm5leHQoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5yZXBsYWNlZFN0cmluZywgZS5yZXBsYWNlZEl0ZW1zKCkubmV4dCgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmluZGV4LCBlLmdldEluZGV4KCkpOwotCQl9Ci0JCXZvaWQgaXRlbU1vdmVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGl0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50KExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuaW5kZXgsIGUuZ2V0VGFyZ2V0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2VJbmRleCwgZS5nZXRTb3VyY2VJbmRleCgpKTsKLQkJfQotCQl2b2lkIGxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgbGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQkJYXNzZXJ0RmFsc2UoZS5pdGVtcygpLmhhc05leHQoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5pbmRleCwgZS5nZXRJbmRleCgpKTsKLQkJfQotCQl2b2lkIGxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgbGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQkJYXNzZXJ0RmFsc2UoZS5pdGVtcygpLmhhc05leHQoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5pbmRleCwgZS5nZXRJbmRleCgpKTsKLQkJfQotCQl2b2lkIGxpc3RDaGFuZ2VkRG91YmxlQXJndW1lbnQoTGlzdENoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjg2MjI1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb0FyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJdGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWRaZXJvQXJndW1lbnQiKSk7Ci0JCXRlc3RNb2RlbC5zZXRWYWx1ZSg5OSk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb0FyZ3VtZW50TmFtZWRQcm9wZXJ0eSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWRaZXJvQXJndW1lbnQiKSk7Ci0JCXRlc3RNb2RlbC5zZXRWYWx1ZSg5OSk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQl0ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFNpbmdsZUFyZ3VtZW50IikpOwotCQl0ZXN0TW9kZWwuc2V0VmFsdWUoOTkpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBtZXRob2QgdGhhdCBoYXMgbW9yZSBnZW5lcmFsIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVBcmd1bWVudDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCU1ldGhvZCBtZXRob2QgPSBDbGFzc1Rvb2xzLm1ldGhvZCh0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudDIiLCBuZXcgQ2xhc3NbXSB7T2JqZWN0LmNsYXNzfSk7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpKTsKLQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVBcmd1bWVudE5hbWVkUHJvcGVydHkoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQl0ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAicHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQiKSk7Ci0JCXRlc3RNb2RlbC5zZXRWYWx1ZSg5OSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IG1ldGhvZCB0aGF0IGhhcyBtb3JlIGdlbmVyYWwgbWV0aG9kIHBhcmFtZXRlciB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUFyZ3VtZW50TmFtZWRQcm9wZXJ0eTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCU1ldGhvZCBtZXRob2QgPSBDbGFzc1Rvb2xzLm1ldGhvZCh0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudDIiLCBuZXcgQ2xhc3NbXSB7T2JqZWN0LmNsYXNzfSk7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCkpOwotCQl0ZXN0TW9kZWwuc2V0VmFsdWUoOTkpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVyTWlzbWF0Y2goKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQkvLyBidWlsZCBhIFBST1BFUlRZIGNoYW5nZSBsaXN0ZW5lciBhbmQgaGFjayBpdCBzbyB3ZQotCQkvLyBjYW4gYWRkIGl0IGFzIGEgU1RBVEUgY2hhbmdlIGxpc3RlbmVyCi0JCU9iamVjdCBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAicHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQiKTsKLQkJdGVzdE1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKFN0YXRlQ2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXN0TW9kZWwuc2V0VmFsdWUoOTkpOwotCQkJZmFpbCgibGlzdGVuZXIgbWlzbWF0Y2g6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInN0YXRlQ2hhbmdlZERvdWJsZUFyZ3VtZW50Iik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSA9PSBOb1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQlNZXRob2QgbWV0aG9kID0gQ2xhc3NUb29scy5tZXRob2QodGFyZ2V0LCAicHJvcGVydHlDaGFuZ2VkRG91YmxlQXJndW1lbnQiLCBuZXcgQ2xhc3NbXSB7UHJvcGVydHlDaGFuZ2VFdmVudC5jbGFzcywgT2JqZWN0LmNsYXNzfSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmVxdWFscyhtZXRob2QudG9TdHJpbmcoKSkpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGludCB2YWx1ZSA9IDA7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7Ci0JCVRlc3RNb2RlbChpbnQgdmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCX0KLQkJdm9pZCBzZXRWYWx1ZShpbnQgdmFsdWUpIHsKLQkJCWludCBvbGQgPSB0aGlzLnZhbHVlOwotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQkJCWlmIChvbGQgIT0gdmFsdWUpIHsKLQkJCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFyZ2V0IHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZTsKLQkJT2JqZWN0IG9sZFZhbHVlOwotCQlPYmplY3QgbmV3VmFsdWU7Ci0JCWJvb2xlYW4gemVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG5ldyBJbnRlZ2VyKG9sZFZhbHVlKTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXcgSW50ZWdlcihuZXdWYWx1ZSk7Ci0JCX0KLQkJdm9pZCBwcm9wZXJ0eUNoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLnplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgcHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLnNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnByb3BlcnR5TmFtZSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5vbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCQl9Ci0JCXZvaWQgcHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQyKE9iamVjdCBvKSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGUgPSAoUHJvcGVydHlDaGFuZ2VFdmVudCkgbzsKLQkJCXRoaXMuc2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJvcGVydHlOYW1lLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQkJdm9pZCBwcm9wZXJ0eUNoYW5nZWREb3VibGVBcmd1bWVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVTdGF0ZUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjMwYjFjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb0FyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQl0ZXN0TW9kZWwuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInN0YXRlQ2hhbmdlZFplcm9Bcmd1bWVudCIpKTsKLQkJdGVzdE1vZGVsLmNoYW5nZVN0YXRlKCk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCk7Ci0JCXRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAic3RhdGVDaGFuZ2VkU2luZ2xlQXJndW1lbnQiKSk7Ci0JCXRlc3RNb2RlbC5jaGFuZ2VTdGF0ZSgpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBtZXRob2QgdGhhdCBoYXMgbW9yZSBnZW5lcmFsIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVBcmd1bWVudDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsKTsKLQkJTWV0aG9kIG1ldGhvZCA9IENsYXNzVG9vbHMubWV0aG9kKHRhcmdldCwgInN0YXRlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50MiIsIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3N9KTsKLQkJdGVzdE1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCkpOwotCQl0ZXN0TW9kZWwuY2hhbmdlU3RhdGUoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lck1pc21hdGNoKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQkvLyBidWlsZCBhIFNUQVRFIGNoYW5nZSBsaXN0ZW5lciBhbmQgaGFjayBpdCBzbyB3ZQotCQkvLyBjYW4gYWRkIGl0IGFzIGEgUFJPUEVSVFkgY2hhbmdlIGxpc3RlbmVyCi0JCU9iamVjdCBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAic3RhdGVDaGFuZ2VkU2luZ2xlQXJndW1lbnQiKTsKLQkJdGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXN0TW9kZWwuY2hhbmdlUHJvcGVydHkoKTsKLQkJCWZhaWwoImxpc3RlbmVyIG1pc21hdGNoOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDEoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInN0YXRlQ2hhbmdlZERvdWJsZUFyZ3VtZW50Iik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSA9PSBOb1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCk7Ci0JCU1ldGhvZCBtZXRob2QgPSBDbGFzc1Rvb2xzLm1ldGhvZCh0YXJnZXQsICJzdGF0ZUNoYW5nZWREb3VibGVBcmd1bWVudCIsIG5ldyBDbGFzc1tdIHtTdGF0ZUNoYW5nZUV2ZW50LmNsYXNzLCBPYmplY3QuY2xhc3N9KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1ldGhvZC50b1N0cmluZygpKSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJdm9pZCBjaGFuZ2VTdGF0ZSgpIHsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCXZvaWQgY2hhbmdlUHJvcGVydHkoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoInZhbHVlIiwgNTUsIDQyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFyZ2V0IHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJYm9vbGVhbiB6ZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gc2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50ZXN0TW9kZWwgPSB0ZXN0TW9kZWw7Ci0JCX0KLQkJdm9pZCBzdGF0ZUNoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLnplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgc3RhdGVDaGFuZ2VkU2luZ2xlQXJndW1lbnQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLnNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJfQotCQl2b2lkIHN0YXRlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50MihPYmplY3QgZSkgewotCQkJdGhpcy5zaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgKChTdGF0ZUNoYW5nZUV2ZW50KSBlKS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJdm9pZCBzdGF0ZUNoYW5nZWREb3VibGVBcmd1bWVudChTdGF0ZUNoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVUcmVlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3Yzc4NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVUcmVlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBSZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFJlZmxlY3RpdmVUcmVlQ2hhbmdlTGlzdGVuZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJub2RlQWRkZWRaZXJvQXJndW1lbnQiLCAibm9kZVJlbW92ZWRaZXJvQXJndW1lbnQiLCAidHJlZUNsZWFyZWRaZXJvQXJndW1lbnQiLCAidHJlZUNoYW5nZWRaZXJvQXJndW1lbnQiKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgIm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50IiwgIm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnQiLCAidHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudCIsICJ0cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vZGVBZGRlZFplcm9Bcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vZGVBZGRlZFplcm9Bcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbXXsicm9vdCIsICJjaGlsZCJ9KTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlQWRkZWRTaW5nbGVBcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZVJlbW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZU5vZGUoImNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZVJlbW92ZWRaZXJvQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZU5vZGUoImNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVOb2RlKCJjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlTm9kZSgiY2hpbGQiKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlQ2xlYXJlZFplcm9Bcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoImNoaWxkIiwgImdyYW5kY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nWzBdKTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclRyZWUoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlQ2xlYXJlZFplcm9Bcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoImNoaWxkIiwgImdyYW5kY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nWzBdKTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclRyZWUoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgiY2hpbGQiLCAiZ3JhbmRjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbMF0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJUcmVlKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoImNoaWxkIiwgImdyYW5kY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nWzBdKTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyVHJlZSgpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbXXsicm9vdCIsICJhbm90aGVyIGNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VOb2RlKCJjaGlsZCIsICJhbm90aGVyIGNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZUNoYW5nZWRaZXJvQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImFub3RoZXIgY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZU5vZGUoImNoaWxkIiwgImFub3RoZXIgY2hpbGQiKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbXXsicm9vdCIsICJhbm90aGVyIGNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZU5vZGUoImNoaWxkIiwgImFub3RoZXIgY2hpbGQiKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50TmFtZWRUcmVlKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbXXsicm9vdCIsICJhbm90aGVyIGNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZU5vZGUoImNoaWxkIiwgImFub3RoZXIgY2hpbGQiKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJjb2xsZWN0aW9uQ2hhbmdlZERvdWJsZUFyZ3VtZW50Iik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSA9PSBOb1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQlNZXRob2QgbWV0aG9kID0gQ2xhc3NUb29scy5tZXRob2QodGFyZ2V0LCAiY29sbGVjdGlvbkNoYW5nZWREb3VibGVBcmd1bWVudCIsIG5ldyBDbGFzc1tdIHtUcmVlQ2hhbmdlRXZlbnQuY2xhc3MsIE9iamVjdC5jbGFzc30pOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1ldGhvZC50b1N0cmluZygpKSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNaXNtYXRjaCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCS8vIGJ1aWxkIGEgVFJFRSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGhhY2sgaXQgc28gd2UKLQkJLy8gY2FuIGFkZCBpdCBhcyBhIENPTExFQ1RJT04gY2hhbmdlIGxpc3RlbmVyCi0JCU9iamVjdCBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJub2RlQWRkZWRTaW5nbGVBcmd1bWVudCIpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXN0TW9kZWwuY2hhbmdlQ29sbGVjdGlvbigpOwotCQkJZmFpbCgibGlzdGVuZXIgbWlzbWF0Y2g6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcm9vdDsKLQkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IGNoaWxkcmVuTGlzdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4oKTsKLQkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR1NfVFJFRSA9ICJzdHJpbmdzIjsKLQkJVGVzdE1vZGVsKFN0cmluZyByb290KSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKHJvb3QgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5yb290ID0gcm9vdDsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5wdXQocm9vdCwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQkJdGhpcy5wYXJlbnRzLnB1dChyb290LCBudWxsKTsKLQkJfQotCQlTdHJpbmcgZ2V0Um9vdCgpIHsKLQkJCXJldHVybiB0aGlzLnJvb3Q7Ci0JCX0KLQkJcHJpdmF0ZSBTdHJpbmdbXSBwYXRoKFN0cmluZyBub2RlKSB7Ci0JCQlTdHJpbmcgdGVtcCA9IG5vZGU7Ci0JCQlMaXN0PFN0cmluZz4gcmV2ZXJzZVBhdGggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWRvIHsKLQkJCQlyZXZlcnNlUGF0aC5hZGQodGVtcCk7Ci0JCQkJdGVtcCA9IHRoaXMucGFyZW50cy5nZXQodGVtcCk7Ci0JCQl9IHdoaWxlICh0ZW1wICE9IG51bGwpOwotCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5yZXZlcnNlKHJldmVyc2VQYXRoKS50b0FycmF5KG5ldyBTdHJpbmdbcmV2ZXJzZVBhdGguc2l6ZSgpXSk7Ci0JCX0KLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPFN0cmluZz4odGhpcy5jaGlsZHJlbkxpc3RzLmtleVNldCgpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFN0cmluZyBzKSB7Ci0JCQkJCVRlc3RNb2RlbC50aGlzLnJlbW92ZU5vZGUocyk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQl2b2lkIGFkZE5vZGUoU3RyaW5nIHBhcmVudCwgU3RyaW5nIGNoaWxkKSB7Ci0JCQlpZiAoKHBhcmVudCA9PSBudWxsKSB8fCAoY2hpbGQgPT0gbnVsbCkpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbkxpc3RzLmdldChwYXJlbnQpOwotCQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3QgYWRkIGEgY2hpbGQgdG8gYSBub24tZXhpc3RlbnQgcGFyZW50Iik7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KGNoaWxkKSAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IGFkZCBhIGNoaWxkIHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUgdHJlZSIpOwotCQkJfQotCQkJCi0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnB1dChjaGlsZCwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQkJdGhpcy5wYXJlbnRzLnB1dChjaGlsZCwgcGFyZW50KTsKLQkJCXRoaXMuZmlyZU5vZGVBZGRlZChTVFJJTkdTX1RSRUUsIHRoaXMucGF0aChjaGlsZCkpOwotCQl9Ci0JCXZvaWQgcmVtb3ZlTm9kZShTdHJpbmcgbm9kZSkgewotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCi0JCQlDb2xsZWN0aW9uPFN0cmluZz4gY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KG5vZGUpOwotCQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub2RlIGlzIG5vdCBpbiB0cmVlIik7Ci0JCQl9Ci0JCQlPYmplY3RbXSBwYXRoID0gdGhpcy5wYXRoKG5vZGUpOwotCQkJZm9yIChTdHJpbmcgcyA6IGNoaWxkcmVuKSB7Ci0JCQkJdGhpcy5yZW1vdmVOb2RlKHMpOwotCQkJfQotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnJlbW92ZShub2RlKTsKLQkJCXRoaXMucGFyZW50cy5yZW1vdmUobm9kZSk7Ci0JCQl0aGlzLmZpcmVOb2RlUmVtb3ZlZChTVFJJTkdTX1RSRUUsIHBhdGgpOwotCQl9Ci0JCXZvaWQgcmVwbGFjZU5vZGUoU3RyaW5nIG9sZE5vZGUsIFN0cmluZyBuZXdOb2RlKSB7Ci0JCQlpZiAoKG9sZE5vZGUgPT0gbnVsbCkgfHwgKG5ld05vZGUgPT0gbnVsbCkpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbkxpc3RzLnJlbW92ZShvbGROb2RlKTsKLQkJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigib2xkIG5vZGUgaXMgbm90IGluIHRyZWUiKTsKLQkJCX0KLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5wdXQobmV3Tm9kZSwgY2hpbGRyZW4pOwotCQkJZm9yIChTdHJpbmcgY2hpbGQgOiBjaGlsZHJlbikgewotCQkJCXRoaXMucGFyZW50cy5wdXQoY2hpbGQsIG5ld05vZGUpOwotCQkJfQotCi0JCQlTdHJpbmcgcGFyZW50ID0gdGhpcy5wYXJlbnRzLnJlbW92ZShvbGROb2RlKTsKLQkJCXRoaXMucGFyZW50cy5wdXQobmV3Tm9kZSwgcGFyZW50KTsKLQotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoU1RSSU5HU19UUkVFLCB0aGlzLnBhdGgobmV3Tm9kZSkpOwotCQl9Ci0JCXZvaWQgY2xlYXJUcmVlKCkgewotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLmNsZWFyKCk7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucHV0KHJvb3QsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCXRoaXMucGFyZW50cy5jbGVhcigpOwotCQkJdGhpcy5wYXJlbnRzLnB1dChyb290LCBudWxsKTsKLQkJCXRoaXMuZmlyZVRyZWVDbGVhcmVkKFNUUklOR1NfVFJFRSk7Ci0JCX0KLQkJdm9pZCBjaGFuZ2VDb2xsZWN0aW9uKCkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoImJvZ3VzIGNvbGxlY3Rpb24iKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFyZ2V0IHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJU3RyaW5nIHRyZWVOYW1lOwotCQlTdHJpbmdbXSBwYXRoOwotCQlib29sZWFuIG5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gdHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gdHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwsIFN0cmluZyB0cmVlTmFtZSwgU3RyaW5nW10gcGF0aCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGVzdE1vZGVsID0gdGVzdE1vZGVsOwotCQkJdGhpcy50cmVlTmFtZSA9IHRyZWVOYW1lOwotCQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJfQotCQl2b2lkIG5vZGVBZGRlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBub2RlQWRkZWRTaW5nbGVBcmd1bWVudChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTmFtZSwgZS5nZXRUcmVlTmFtZSgpKTsKLQkJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyh0aGlzLnBhdGgsIGUuZ2V0UGF0aCgpKSk7Ci0JCX0KLQkJdm9pZCBub2RlUmVtb3ZlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIG5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTmFtZSwgZS5nZXRUcmVlTmFtZSgpKTsKLQkJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyh0aGlzLnBhdGgsIGUuZ2V0UGF0aCgpKSk7Ci0JCX0KLQkJdm9pZCB0cmVlQ2xlYXJlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIHRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTmFtZSwgZS5nZXRUcmVlTmFtZSgpKTsKLQkJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyh0aGlzLnBhdGgsIGUuZ2V0UGF0aCgpKSk7Ci0JCX0KLQkJdm9pZCB0cmVlQ2hhbmdlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIHRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTmFtZSwgZS5nZXRUcmVlTmFtZSgpKTsKLQkJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyh0aGlzLnBhdGgsIGUuZ2V0UGF0aCgpKSk7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZERvdWJsZUFyZ3VtZW50KFRyZWVDaGFuZ2VFdmVudCBlLCBPYmplY3QgbykgewotCQkJZmFpbCgiYm9ndXMgZXZlbnQ6ICIgKyBlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzY2Y5NGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEVtcGxveWVlIGVtcGxveWVlOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IGVtcGxveWVlSG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZW1wbG95ZWVFdmVudDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gaWRBZGFwdGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPERhdGU+IGhpcmVEYXRlQWRhcHRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGFkYXB0ZXJFdmVudDsKLQotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5UcmlnZ2VyIHRyaWdnZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWZmZXJlZElESG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWZmZXJlZE5hbWVIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxEYXRlPiBidWZmZXJlZEhpcmVEYXRlSG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgYnVmZmVyZWRFdmVudDsKLQotCXB1YmxpYyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQotCQl0aGlzLmVtcGxveWVlID0gbmV3IEVtcGxveWVlKDE3LCAiRnJlZGR5IiwgbmV3IERhdGUoKSk7Ci0JCXRoaXMuZW1wbG95ZWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPih0aGlzLmVtcGxveWVlKTsKLQotCQl0aGlzLnRyaWdnZXIgPSBuZXcgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5UcmlnZ2VyKCk7Ci0KLQkJdGhpcy5pZEFkYXB0ZXIgPSB0aGlzLmJ1aWxkSURBZGFwdGVyKHRoaXMuZW1wbG95ZWVIb2xkZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIgPSBuZXcgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPih0aGlzLmlkQWRhcHRlciwgdGhpcy50cmlnZ2VyKTsKLQotCQl0aGlzLm5hbWVBZGFwdGVyID0gdGhpcy5idWlsZE5hbWVBZGFwdGVyKHRoaXMuZW1wbG95ZWVIb2xkZXIpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlciA9IG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5uYW1lQWRhcHRlciwgdGhpcy50cmlnZ2VyKTsKLQotCQl0aGlzLmhpcmVEYXRlQWRhcHRlciA9IHRoaXMuYnVpbGRIaXJlRGF0ZUFkYXB0ZXIodGhpcy5lbXBsb3llZUhvbGRlcik7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlciA9IG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPERhdGU+KHRoaXMuaGlyZURhdGVBZGFwdGVyLCB0aGlzLnRyaWdnZXIpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRJREFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtcGxveWVlLCBJbnRlZ2VyPihlSG9sZGVyLCBFbXBsb3llZS5JRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIodGhpcy5zdWJqZWN0LmdldElEKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRJRCh2YWx1ZS5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIFN0cmluZz4oZUhvbGRlciwgRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGF0ZT4gYnVpbGRIaXJlRGF0ZUFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtcGxveWVlLCBEYXRlPihlSG9sZGVyLCBFbXBsb3llZS5ISVJFX0RBVEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERhdGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRIaXJlRGF0ZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oRGF0ZSB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRIaXJlRGF0ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuaWRBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlEYXRlIHRlbXAgPSB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDMyMykpOwotCQlhc3NlcnRFcXVhbHMoMTcsIHRoaXMuZW1wbG95ZWUuZ2V0SUQoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuaWRBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMzIzKSwgdGhpcy5idWZmZXJlZElESG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2VwdCgpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcigzMjMpKTsKLQkJYXNzZXJ0RXF1YWxzKDE3LCB0aGlzLmVtcGxveWVlLmdldElEKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyMyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJRGF0ZSB0ZW1wID0gdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmlnZ2VyLmFjY2VwdCgpOwotCi0JCWFzc2VydEVxdWFscygzMjMsIHRoaXMuZW1wbG95ZWUuZ2V0SUQoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzMjMpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyMyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlc2V0KCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDMyMykpOwotCQlhc3NlcnRFcXVhbHMoMTcsIHRoaXMuZW1wbG95ZWUuZ2V0SUQoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuaWRBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMzIzKSwgdGhpcy5idWZmZXJlZElESG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlEYXRlIHRlbXAgPSB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCk7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnRyaWdnZXIucmVzZXQoKTsKLQotCQlhc3NlcnRFcXVhbHMoMTcsIHRoaXMuZW1wbG95ZWUuZ2V0SUQoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuaWRBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuaGlyZURhdGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZElESG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuaWRBZGFwdGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5uYW1lQWRhcHRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuaGlyZURhdGVBZGFwdGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLklEX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuSElSRV9EQVRFX1BST1BFUlRZKSk7Ci0KLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5pZEFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5uYW1lQWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmhpcmVEYXRlQWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLklEX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5ISVJFX0RBVEVfUFJPUEVSVFkpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRJREhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmlkQWRhcHRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubmFtZUFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmhpcmVEYXRlQWRhcHRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5JRF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLkhJUkVfREFURV9QUk9QRVJUWSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGFkYXB0ZXJMaXN0ZW5lciA9IHRoaXMuYnVpbGRBZGFwdGVyTGlzdGVuZXIoKTsKLQkJdGhpcy5uYW1lQWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYWRhcHRlckxpc3RlbmVyKTsKLQotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGVtcGxveWVlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRW1wbG95ZWVMaXN0ZW5lcigpOwotCQl0aGlzLmVtcGxveWVlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSwgZW1wbG95ZWVMaXN0ZW5lcik7Ci0KLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYWRhcHRlckxpc3RlbmVyID0gdGhpcy5idWlsZEFkYXB0ZXJMaXN0ZW5lcigpOwotCQl0aGlzLm5hbWVBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoYWRhcHRlckxpc3RlbmVyKTsKLQotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGVtcGxveWVlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRW1wbG95ZWVMaXN0ZW5lcigpOwotCQl0aGlzLmVtcGxveWVlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZW1wbG95ZWVMaXN0ZW5lcik7Ci0KLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCkgewotCQl0aGlzLmJ1ZmZlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmFkYXB0ZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMuZW1wbG95ZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmJ1ZmZlcmVkRXZlbnQsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsICJGcmVkZHkiLCAiUmlwbGV5Iik7Ci0JCWFzc2VydE51bGwodGhpcy5hZGFwdGVyRXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuZW1wbG95ZWVFdmVudCk7Ci0KLQkJdGhpcy5idWZmZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5hZGFwdGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLmVtcGxveWVlRXZlbnQgPSBudWxsOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiQ2hhcmxpZSIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYnVmZmVyZWRFdmVudCwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgIlJpcGxleSIsICJDaGFybGllIik7Ci0JCWFzc2VydE51bGwodGhpcy5hZGFwdGVyRXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuZW1wbG95ZWVFdmVudCk7Ci0KLQkJdGhpcy5idWZmZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5hZGFwdGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLmVtcGxveWVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyaWdnZXIuYWNjZXB0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5idWZmZXJlZEV2ZW50KTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkYXB0ZXJFdmVudCwgdGhpcy5uYW1lQWRhcHRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAiRnJlZGR5IiwgIkNoYXJsaWUiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmVtcGxveWVlRXZlbnQsIHRoaXMuZW1wbG95ZWUsIEVtcGxveWVlLk5BTUVfUFJPUEVSVFksICJGcmVkZHkiLCAiQ2hhcmxpZSIpOwotCi0JCXRoaXMuYnVmZmVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuYWRhcHRlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5lbXBsb3llZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIkphc29uIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5idWZmZXJlZEV2ZW50LCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAiQ2hhcmxpZSIsICJKYXNvbiIpOwotCQlhc3NlcnROdWxsKHRoaXMuYWRhcHRlckV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmVtcGxveWVlRXZlbnQpOwotCi0JCXRoaXMuYnVmZmVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuYWRhcHRlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5lbXBsb3llZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmlnZ2VyLnJlc2V0KCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5idWZmZXJlZEV2ZW50LCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAiSmFzb24iLCAiQ2hhcmxpZSIpOwotCQlhc3NlcnROdWxsKHRoaXMuYWRhcHRlckV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmVtcGxveWVlRXZlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5idWZmZXJlZEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRBZGFwdGVyTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5hZGFwdGVyRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEVtcGxveWVlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5lbXBsb3llZUV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCwgT2JqZWN0IHNvdXJjZSwgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMocHJvcGVydHlOYW1lLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgRW1wbG95ZWUgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBpbnQgaWQ7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9QUk9QRVJUWSA9ICJpZCI7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlwcml2YXRlIERhdGUgaGlyZURhdGU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBISVJFX0RBVEVfUFJPUEVSVFkgPSAiaGlyZURhdGUiOwotCi0JCUVtcGxveWVlKGludCBpZCwgU3RyaW5nIG5hbWUsIERhdGUgaGlyZURhdGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5oaXJlRGF0ZSA9IGhpcmVEYXRlOwotCQl9Ci0JCWludCBnZXRJRCgpIHsKLQkJCXJldHVybiB0aGlzLmlkOwotCQl9Ci0JCXZvaWQgc2V0SUQoaW50IGlkKSB7Ci0JCQlpbnQgb2xkID0gdGhpcy5pZDsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJRF9QUk9QRVJUWSwgb2xkLCBpZCk7Ci0JCX0KLQkJU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlEYXRlIGdldEhpcmVEYXRlKCkgewotCQkJcmV0dXJuIHRoaXMuaGlyZURhdGU7Ci0JCX0KLQkJdm9pZCBzZXRIaXJlRGF0ZShEYXRlIGhpcmVEYXRlKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5oaXJlRGF0ZTsKLQkJCXRoaXMuaGlyZURhdGUgPSBoaXJlRGF0ZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChISVJFX0RBVEVfUFJPUEVSVFksIG9sZCwgaGlyZURhdGUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMGQ3MWMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcjE7Ci0JcHJpdmF0ZSBMb2NhbENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyIGFhMTsKLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudDE7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIxOwotCXByaXZhdGUgU3RyaW5nIGV2ZW50MVR5cGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREID0gImFkZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRSA9ICJyZW1vdmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0UgPSAiY2hhbmdlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVIgPSAiY2xlYXIiOwotCi0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MjsKLQotCXB1YmxpYyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdDEgPSBuZXcgVGVzdFN1YmplY3QoKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lcyh0aGlzLnN1YmplY3QxTmFtZXMoKSk7Ci0JCXRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb25zKHRoaXMuc3ViamVjdDFEZXNjcmlwdGlvbnMoKSk7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0Pih0aGlzLnN1YmplY3QxKTsKLQkJdGhpcy5hYTEgPSB0aGlzLmJ1aWxkQXNwZWN0QWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIxKTsKLQkJdGhpcy5saXN0ZW5lcjEgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuZXZlbnQxVHlwZSA9IG51bGw7Ci0KLQkJdGhpcy5zdWJqZWN0MiA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQl0aGlzLnN1YmplY3QyLmFkZE5hbWVzKHRoaXMuc3ViamVjdDJOYW1lcygpKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbnModGhpcy5zdWJqZWN0MkRlc2NyaXB0aW9ucygpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdWJqZWN0MU5hbWVzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3ViamVjdDFEZXNjcmlwdGlvbnMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDEgZGVzY3JpcHRpb24xIik7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDEgZGVzY3JpcHRpb24yIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3ViamVjdDJOYW1lcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJlc3VsdC5hZGQoImJhbSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN1YmplY3QyRGVzY3JpcHRpb25zKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QyIGRlc2NyaXB0aW9uMSIpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QyIGRlc2NyaXB0aW9uMiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTG9jYWxDb2xsZWN0aW9uQXNwZWN0QWRhcHRlciBidWlsZEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihzdWJqZWN0SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlLCBBREQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSwgUkVNT1ZFKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSwgQ0xFQVIpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlLCBDSEFOR0UpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgdmFsdWUxQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSwgU3RyaW5nIGV2ZW50VHlwZSkgewotCQl0aGlzLmV2ZW50MSA9IGU7Ci0JCXRoaXMuZXZlbnQxVHlwZSA9IGV2ZW50VHlwZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0Mik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBDSEFOR0UpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXZlbnQxLml0ZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDJOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5ldmVudDFUeXBlID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIENIQU5HRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ldmVudDEuaXRlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRGYWxzZSgodGhpcy5hYTEuaXRlcmF0b3IoKSkuaGFzTmV4dCgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5ldmVudDFUeXBlID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QxKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIENIQU5HRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ldmVudDEuaXRlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZSgiamFtIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBBREQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamFtIiwgdGhpcy5ldmVudDEuaXRlbXMoKS5uZXh0KCkpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXNQbHVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzUGx1cy5hZGQoImphbSIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuZXZlbnQxVHlwZSA9IG51bGw7Ci0JCXRoaXMuYWExLmFkZEFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b24oImpheiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXoiLCB0aGlzLmV2ZW50MS5pdGVtcygpLm5leHQoKSk7Ci0JCW5hbWVzUGx1cy5hZGQoImpheiIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3QxLnJlbW92ZU5hbWUoImZvbyIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXZlbnQxVHlwZSwgUkVNT1ZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQxLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuZXZlbnQxLml0ZW1zKCkubmV4dCgpKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzTWludXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNNaW51cy5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNNaW51cywgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBudWxsOwotCQl0aGlzLmFhMS5yZW1vdmVBbGwoQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJiYXIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBSRU1PVkUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5ldmVudDEuaXRlbXMoKS5uZXh0KCkpOwotCQluYW1lc01pbnVzLnJlbW92ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc01pbnVzLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5hZGRUd29OYW1lcygiamFtIiwgImpheiIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXZlbnQxVHlwZSwgQ0hBTkdFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQxLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV2ZW50MS5pdGVtcygpLmhhc05leHQoKSk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBuYW1lc1BsdXMyID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzUGx1czIuYWRkKCJqYW0iKTsKLQkJbmFtZXNQbHVzMi5hZGQoImpheiIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzMiwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5zdWJqZWN0MS5uYW1lcygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuc3ViamVjdDEubmFtZXMoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSk7Ci0JCXRoaXMuYWExLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuYWExLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pKTsKLQkJdGhpcy5hYTEucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQkKLQlwcml2YXRlIGNsYXNzIFRlc3RTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU19DT0xMRUNUSU9OID0gIm5hbWVzIjsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gZGVzY3JpcHRpb25zOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTlNfQ09MTEVDVElPTiA9ICJkZXNjcmlwdGlvbnMiOwotCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoKSB7Ci0JCQl0aGlzLm5hbWVzID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQkJdGhpcy5kZXNjcmlwdGlvbnMgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gbmFtZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8U3RyaW5nPih0aGlzLm5hbWVzKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlpZiAodGhpcy5uYW1lcy5hZGQobmFtZSkpIHsKLQkJCQl0aGlzLmZpcmVJdGVtQWRkZWQoTkFNRVNfQ09MTEVDVElPTiwgbmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoSXRlcmF0b3I8U3RyaW5nPiBuZXdOYW1lcykgewotCQkJd2hpbGUgKG5ld05hbWVzLmhhc05leHQoKSkgewotCQkJCXRoaXMuYWRkTmFtZShuZXdOYW1lcy5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBuZXdOYW1lcykgewotCQkJdGhpcy5hZGROYW1lcyhuZXdOYW1lcy5pdGVyYXRvcigpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRUd29OYW1lcyhTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQkJaWYgKHRoaXMubmFtZXMuYWRkKG5hbWUxKSB8IHRoaXMubmFtZXMuYWRkKG5hbWUyKSkgewotCQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKE5BTUVTX0NPTExFQ1RJT04pOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCWlmICh0aGlzLm5hbWVzLnJlbW92ZShuYW1lKSkgewotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKE5BTUVTX0NPTExFQ1RJT04sIG5hbWUpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGRlc2NyaXB0aW9ucygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxTdHJpbmc+KHRoaXMuZGVzY3JpcHRpb25zKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCWlmICh0aGlzLmRlc2NyaXB0aW9ucy5hZGQoZGVzY3JpcHRpb24pKSB7Ci0JCQkJdGhpcy5maXJlSXRlbUFkZGVkKERFU0NSSVBUSU9OU19DT0xMRUNUSU9OLCBkZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb25zKEl0ZXJhdG9yPFN0cmluZz4gbmV3RGVzY3JpcHRpb25zKSB7Ci0JCQl3aGlsZSAobmV3RGVzY3JpcHRpb25zLmhhc05leHQoKSkgewotCQkJCXRoaXMuYWRkRGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb25zLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb25zKENvbGxlY3Rpb248U3RyaW5nPiBuZXdEZXNjcmlwdGlvbnMpIHsKLQkJCXRoaXMuYWRkRGVzY3JpcHRpb25zKG5ld0Rlc2NyaXB0aW9ucy5pdGVyYXRvcigpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVEZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCWlmICh0aGlzLmRlc2NyaXB0aW9ucy5yZW1vdmUoZGVzY3JpcHRpb24pKSB7Ci0JCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoREVTQ1JJUFRJT05TX0NPTExFQ1RJT04sIGRlc2NyaXB0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIHRoaXMgaXMgbm90IGEgdHlwaWNhbCBhc3BlY3QgYWRhcHRlciAtIHRoZSB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhc3BlY3QgbmFtZQotCXByaXZhdGUgY2xhc3MgTG9jYWxDb2xsZWN0aW9uQXNwZWN0QWRhcHRlciBleHRlbmRzIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+IHsKLQotCQlMb2NhbENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQkJc3VwZXIoc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3JfKCkgewotCQkJaWYgKHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWVzKCk7Ci0JCQl9Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0NPTExFQ1RJT04pIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmRlc2NyaXB0aW9ucygpOwotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgaXRlbSkgewotCQkJaWYgKHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pIHsKLQkJCQl0aGlzLnN1YmplY3QuYWRkTmFtZShpdGVtKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0NPTExFQ1RJT04pIHsKLQkJCQl0aGlzLnN1YmplY3QuYWRkRGVzY3JpcHRpb24oaXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gaXRlbXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IGl0ZW0pIHsKLQkJCWlmICh0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnJlbW92ZU5hbWUoKFN0cmluZykgaXRlbSk7Ci0JCQl9IGVsc2UgaWYgKHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19DT0xMRUNUSU9OKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnJlbW92ZURlc2NyaXB0aW9uKChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMucmVtb3ZlKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGM0ZTIzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGFkYXB0ZXI7Ci0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uSG9sZGVyOwotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uOwotCi0JcHVibGljIENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbik7Ci0JCXRoaXMuYWRhcHRlciA9IG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IHRoaXMuYWRhcHRlckNvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWUoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX07Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBIYXNoQmFnPFN0cmluZz4oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgdGhpcy53cmFwcGVkQ29sbGVjdGlvbi5zaXplKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IHRoaXMuYWRhcHRlckNvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHN5bmNoTGlzdC5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBzeW5jaENvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiamF6Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaCgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiamF6Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoc3luY2hMaXN0KTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkVG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5zZXRDb2xsZWN0aW9uKG5ldyBIYXNoQmFnPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZEZyb21FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCUhhc2hCYWc8U3RyaW5nPiBiYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCWJhZy5hZGQoImZvbyIpOwotCQliYWcuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5zZXRDb2xsZWN0aW9uKGJhZyk7Ci0JCWFzc2VydEVxdWFscygyLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZEZyb21FbXB0eVRvRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQlIYXNoQmFnPFN0cmluZz4gYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnNldENvbGxlY3Rpb24oYmFnKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQotCWNsYXNzIFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZjQ2MjYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYWRhcHRlcjsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb25Ib2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCXB1YmxpYyBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmFkYXB0ZXIgPSBuZXcgTG9jYWxBZGFwdGVyKHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIsICI2NjYiKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBib29sZWFuVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0VmFsdWUoKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCIxMTEiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjIyMiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCWFzc2VydFRydWUodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoIjY2NiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjY2NiIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuY2xlYXIoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXZlbnRGaXJpbmcoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjExMSIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCIyMjIiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoZmFsc2UsIHRydWUpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCI2NjYiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0cnVlLCBmYWxzZSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjY2NiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGZhbHNlLCB0cnVlKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmNsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodHJ1ZSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFkYXB0ZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi52YWx1ZU9mKG9sZFZhbHVlKSwgdGhpcy5ldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSksIHRoaXMuZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX07Ci0JCXRoaXMuYWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCWFzc2VydFRydWUodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMuYWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzICoqKioqKioqKioKLQotCS8qKgotCSAqIHRoZSB2YWx1ZSBpcyB0cnVlIGlmIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gY29udGFpbnMgdGhlIHNwZWNpZmllZCBpdGVtLAotCSAqIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgZmFsc2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbEFkYXB0ZXIKLQkJZXh0ZW5kcyBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgotCQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Ci0JewotCQlwcml2YXRlIFN0cmluZyBpdGVtOwotCi0JCUxvY2FsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXIsIFN0cmluZyBpdGVtKSB7Ci0JCQlzdXBlcihjb2xsZWN0aW9uSG9sZGVyKTsKLQkJCXRoaXMuaXRlbSA9IGl0ZW07Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkJLyoqCi0JCSAqIGFsd2F5cyByZXR1cm4gYSBCb29sZWFuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0JCQlCb29sZWFuIHJlc3VsdCA9IHN1cGVyLmdldFZhbHVlKCk7Ci0JCQlyZXR1cm4gKHJlc3VsdCA9PSBudWxsKSA/IEJvb2xlYW4uRkFMU0UgOiByZXN1bHQ7Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJCWlmICh0aGlzLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaWYgKCAhIHRoaXMuYm9vbGVhblZhbHVlT2YodmFsdWUpKSB7Ci0JCQkJCS8vIHRoZSB2YWx1ZSBpcyBjaGFuZ2luZyBmcm9tIHRydWUgdG8gZmFsc2UKLQkJCQkJKChTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLnJlbW92ZSh0aGlzLml0ZW0pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRoaXMuYm9vbGVhblZhbHVlT2YodmFsdWUpKSB7Ci0JCQkJCS8vIHRoZSB2YWx1ZSBpcyBjaGFuZ2luZyBmcm9tIGZhbHNlIHRvIHRydWUKLQkJCQkJKChTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmFkZCh0aGlzLml0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLCB0aGlzLml0ZW0pKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0JCXByaXZhdGUgYm9vbGVhbiBib29sZWFuVmFsdWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ib29sZWFuVmFsdWVPZih0aGlzLnZhbHVlKTsKLQkJfQotCQlwcml2YXRlIGJvb2xlYW4gYm9vbGVhblZhbHVlT2YoT2JqZWN0IGIpIHsKLQkJCXJldHVybiAoYiA9PSBudWxsKSA/IGZhbHNlIDogKChCb29sZWFuKSBiKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGY0YjZmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTmVpZ2hib3Job29kIG5laWdoYm9yaG9vZDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE5laWdoYm9yaG9vZD4gbmVpZ2hib3Job29kSG9sZGVyOwotCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5uZWlnaGJvcmhvb2QgPSBuZXcgTmVpZ2hib3Job29kKCJIYW5uYS1CYXJiZXJhIik7Ci0JCXRoaXMubmVpZ2hib3Job29kSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOZWlnaGJvcmhvb2Q+KHRoaXMubmVpZ2hib3Job29kKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNoMSgpIHsKLQkJdGhpcy52ZXJpZnlTeW5jaCh0aGlzLmJ1aWxkQWxsTWVtYmVyc0NvbXBvc2l0ZSh0aGlzLm5laWdoYm9yaG9vZEhvbGRlcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaDIoKSB7Ci0JCXRoaXMudmVyaWZ5U3luY2godGhpcy5idWlsZEFsbE1lbWJlcnNDb21wb3NpdGUyKHRoaXMubmVpZ2hib3Job29kSG9sZGVyKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN5bmNoKENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4gY29tcG9zaXRlQ1ZNKSB7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCQlCYWc8RmFtaWx5PiBmYW1pbGllc1N5bmNoID0gbmV3IENvb3JkaW5hdGVkQmFnPEZhbWlseT4odGhpcy5idWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcih0aGlzLm5laWdoYm9yaG9vZEhvbGRlcikpOwotCQlCYWc8TWVtYmVyPiBtZW1iZXJzU3luY2ggPSBuZXcgQ29vcmRpbmF0ZWRCYWc8TWVtYmVyPihjb21wb3NpdGVDVk0pOwotCQl0aGlzLnBvcHVsYXRlTmVpZ2hib3Job29kKHRoaXMubmVpZ2hib3Job29kKTsKLQotCQlGYW1pbHkgamV0c29ucyA9IHRoaXMubmVpZ2hib3Job29kLmZhbWlseU5hbWVkKCJKZXRzb24iKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJamV0c29ucy5yZW1vdmVNZW1iZXIoamV0c29ucy5tZW1iZXJOYW1lZCgiQXN0cm8iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBmYW1pbGllc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQlqZXRzb25zLnJlbW92ZU1lbWJlcihqZXRzb25zLm1lbWJlck5hbWVkKCJKdWR5IikpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJamV0c29ucy5hZGRNZW1iZXIoIkZpZG8iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCXRoaXMubmVpZ2hib3Job29kLnJlbW92ZUZhbWlseShqZXRzb25zKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoNywgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQlGYW1pbHkgYmVhcnMgPSB0aGlzLm5laWdoYm9yaG9vZC5hZGRGYW1pbHkoIkJlYXIiKTsKLQkJCWJlYXJzLmFkZE1lbWJlcigiWW9naSIpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoOCwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscyg4LCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCWJlYXJzLmFkZE1lbWJlcigiQm9vLUJvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoOSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscyg5LCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCU5laWdoYm9yaG9vZCBuMiA9IG5ldyBOZWlnaGJvcmhvb2QoIkhhbm5hLUJhcmJlcmEgMiIpOwotCQl0aGlzLm5laWdoYm9yaG9vZEhvbGRlci5zZXRWYWx1ZShuMik7Ci0JCXRoaXMucG9wdWxhdGVOZWlnaGJvcmhvb2QobjIpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIENvbGxlY3Rpb25Ub29scy5zaXplKG4yLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyhuMi5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vVHJhbnNmb3JtZXIoKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc3ViQ1ZNMSA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc3ViQ1ZNMiA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCUNvbGxlY3Rpb248Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPj4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJY29sbGVjdGlvbi5hZGQoc3ViQ1ZNMSk7Ci0JCWNvbGxlY3Rpb24uYWRkKHN1YkNWTTIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaEJhZyA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KGNvbGxlY3Rpb24pKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgc3luY2hCYWcuc2l6ZSgpKTsKLQotCQlzdWJDVk0xLmFkZCgiZm9vIik7Ci0JCXN1YkNWTTEuYWRkKCJiYXIiKTsKLQkJc3ViQ1ZNMS5hZGQoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoMywgc3luY2hCYWcuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzeW5jaEJhZy5jb250YWlucygiZm9vIikpOwotCi0JCXN1YkNWTTIuYWRkKCJqb28iKTsKLQkJc3ViQ1ZNMi5hZGQoImphciIpOwotCQlzdWJDVk0yLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaEJhZy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHN5bmNoQmFnLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydFRydWUoc3luY2hCYWcuY29udGFpbnMoImpheiIpKTsKLQotCQlzdWJDVk0xLnJlbW92ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscyg1LCBzeW5jaEJhZy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShzeW5jaEJhZy5jb250YWlucygiYmF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVJdGVtKCkgewotCQlCYWc8TWVtYmVyPiBzeW5jaEJhZyA9IG5ldyBDb29yZGluYXRlZEJhZzxNZW1iZXI+KHRoaXMuYnVpbGRBbGxNZW1iZXJzQ29tcG9zaXRlKHRoaXMubmVpZ2hib3Job29kSG9sZGVyKSk7Ci0JCXRoaXMucG9wdWxhdGVOZWlnaGJvcmhvb2QodGhpcy5uZWlnaGJvcmhvb2QpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLm5laWdoYm9yaG9vZC5hZGRGYW1pbHkodGhpcy5uZWlnaGJvcmhvb2QuZmFtaWx5TmFtZWQoIkpldHNvbiIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmluZGV4T2YoImR1cGxpY2F0ZSBjb21wb25lbnQiKSAhPSAtMSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBzeW5jaEJhZy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCUNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEZhbWlseSwgTWVtYmVyPiBjb21wb3NpdGVDVk0gPSB0aGlzLmJ1aWxkQWxsTWVtYmVyc0NvbXBvc2l0ZSh0aGlzLm5laWdoYm9yaG9vZEhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkQmFnPE1lbWJlcj4gc3luY2hCYWcgPSBuZXcgQ29vcmRpbmF0ZWRCYWc8TWVtYmVyPihjb21wb3NpdGVDVk0pOwotCQl0aGlzLnBvcHVsYXRlTmVpZ2hib3Job29kKHRoaXMubmVpZ2hib3Job29kKTsKLQkJRmFtaWx5IGpldHNvbnMgPSB0aGlzLm5laWdoYm9yaG9vZC5mYW1pbHlOYW1lZCgiSmV0c29uIik7Ci0KLQkJYXNzZXJ0VHJ1ZShjb21wb3NpdGVDVk0uaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShqZXRzb25zLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoRmFtaWx5Lk1FTUJFUlNfQ09MTEVDVElPTikpOwotCi0JCWNvbXBvc2l0ZUNWTS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBzeW5jaEJhZyk7Ci0JCWFzc2VydEZhbHNlKGNvbXBvc2l0ZUNWTS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRGYWxzZShqZXRzb25zLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoRmFtaWx5Lk1FTUJFUlNfQ09MTEVDVElPTikpOwotCi0JCWNvbXBvc2l0ZUNWTS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBzeW5jaEJhZyk7Ci0JCWFzc2VydFRydWUoY29tcG9zaXRlQ1ZNLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUoamV0c29ucy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEZhbWlseS5NRU1CRVJTX0NPTExFQ1RJT04pKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVOZWlnaGJvcmhvb2QoTmVpZ2hib3Job29kIG4pIHsKLQkJRmFtaWx5IGZhbWlseTEgPSBuLmFkZEZhbWlseSgiRmxpbnRzdG9uZSIpOwotCQkJZmFtaWx5MS5hZGRNZW1iZXIoIkZyZWQiKTsKLQkJCWZhbWlseTEuYWRkTWVtYmVyKCJXaWxtYSIpOwotCQkJZmFtaWx5MS5hZGRNZW1iZXIoIlBlYmJsZXMiKTsKLQkJCWZhbWlseTEuYWRkTWVtYmVyKCJEaW5vIik7Ci0JCUZhbWlseSBmYW1pbHkyID0gbi5hZGRGYW1pbHkoIlJ1YmJsZSIpOwotCQkJZmFtaWx5Mi5hZGRNZW1iZXIoIkJhcm5leSIpOwotCQkJZmFtaWx5Mi5hZGRNZW1iZXIoIkJldHR5Iik7Ci0JCQlmYW1pbHkyLmFkZE1lbWJlcigiQmFtbS1CYW1tIik7Ci0JCUZhbWlseSBmYW1pbHkzID0gbi5hZGRGYW1pbHkoIkpldHNvbiIpOwotCQkJZmFtaWx5My5hZGRNZW1iZXIoIkdlb3JnZSIpOwotCQkJZmFtaWx5My5hZGRNZW1iZXIoIkphbmUiKTsKLQkJCWZhbWlseTMuYWRkTWVtYmVyKCJKdWR5Iik7Ci0JCQlmYW1pbHkzLmFkZE1lbWJlcigiRWxyb3kiKTsKLQkJCWZhbWlseTMuYWRkTWVtYmVyKCJBc3RybyIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8RmFtaWx5PiBidWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8TmVpZ2hib3Job29kPiBjb21tdW5lSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8TmVpZ2hib3Job29kLCBGYW1pbHk+KGNvbW11bmVIb2xkZXIsIE5laWdoYm9yaG9vZC5GQU1JTElFU19DT0xMRUNUSU9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxGYW1pbHk+IGl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmZhbWlsaWVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiBidWlsZE1lbWJlcnNBZGFwdGVyKEZhbWlseSBmYW1pbHkpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxGYW1pbHksIE1lbWJlcj4oRmFtaWx5Lk1FTUJFUlNfQ09MTEVDVElPTiwgZmFtaWx5KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxNZW1iZXI+IGl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm1lbWJlcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEZhbWlseSwgTWVtYmVyPiBidWlsZEFsbE1lbWJlcnNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPE5laWdoYm9yaG9vZD4gY29tbXVuZUhvbGRlcikgewotCQkvLyBvdmVycmlkZSAjdHJhbnNmb3JtKE9iamVjdCkKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxGYW1pbHksIE1lbWJlcj4odGhpcy5idWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcihjb21tdW5lSG9sZGVyKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiB0cmFuc2Zvcm0oRmFtaWx5IGZhbWlseSkgewotCQkJCXJldHVybiBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYnVpbGRNZW1iZXJzQWRhcHRlcihmYW1pbHkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiBidWlsZEFsbE1lbWJlcnNDb21wb3NpdGUyKFByb3BlcnR5VmFsdWVNb2RlbDxOZWlnaGJvcmhvb2Q+IGNvbW11bmVIb2xkZXIpIHsKLQkJLy8gYnVpbGQgYSBjdXN0b20gVHJhbnNmb3JtZXIKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxGYW1pbHksIE1lbWJlcj4odGhpcy5idWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcihjb21tdW5lSG9sZGVyKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8RmFtaWx5LCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxNZW1iZXI+PiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPEZhbWlseSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPj4oKSB7Ci0JCQlwdWJsaWMgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiB0cmFuc2Zvcm0oRmFtaWx5IGZhbWlseSkgewotCQkJCXJldHVybiBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYnVpbGRNZW1iZXJzQWRhcHRlcihmYW1pbHkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiTG9jYWwgVHJhbnNmb3JtZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0vLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogaW5uZXIgY2xhc3MKLQkgKi8KLQlwcml2YXRlIGNsYXNzIE5laWdoYm9yaG9vZCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPEZhbWlseT4gZmFtaWxpZXMgPSBuZXcgQXJyYXlMaXN0PEZhbWlseT4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTUlMSUVTX0NPTExFQ1RJT04gPSAiZmFtaWxpZXMiOwotCQotCQlwdWJsaWMgTmVpZ2hib3Job29kKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCi0JCXB1YmxpYyBJdGVyYXRvcjxGYW1pbHk+IGZhbWlsaWVzKCkgewotCQkJcmV0dXJuIHRoaXMuZmFtaWxpZXMuaXRlcmF0b3IoKTsKLQkJfQotCQotCQlwdWJsaWMgRmFtaWx5IGFkZEZhbWlseShTdHJpbmcgZmFtaWx5TmFtZSkgewotCQkJcmV0dXJuIHRoaXMuYWRkRmFtaWx5KG5ldyBGYW1pbHkoZmFtaWx5TmFtZSkpOwotCQl9Ci0KLQkJLy8gYmFja2Rvb3IgdG8gYWxsb3cgZHVwbGljYXRlcwotCQlwdWJsaWMgRmFtaWx5IGFkZEZhbWlseShGYW1pbHkgZmFtaWx5KSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oZmFtaWx5LCB0aGlzLmZhbWlsaWVzLCBGQU1JTElFU19DT0xMRUNUSU9OKTsKLQkJCXJldHVybiBmYW1pbHk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVGYW1pbHkoRmFtaWx5IGZhbWlseSkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oZmFtaWx5LCB0aGlzLmZhbWlsaWVzLCBGQU1JTElFU19DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlwdWJsaWMgRmFtaWx5IGZhbWlseU5hbWVkKFN0cmluZyBmYW1pbHlOYW1lKSB7Ci0JCQlmb3IgKEZhbWlseSBmYW1pbHkgOiB0aGlzLmZhbWlsaWVzKSB7Ci0JCQkJaWYgKGZhbWlseS5nZXROYW1lKCkuZXF1YWxzKGZhbWlseU5hbWUpKSB7Ci0JCQkJCXJldHVybiBmYW1pbHk7Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmYW1pbHlOYW1lKTsKLQkJfQotCQotCQlwdWJsaWMgSXRlcmF0b3I8TWVtYmVyPiBhbGxNZW1iZXJzKCkgewotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxNZW1iZXI+KHRoaXMubWVtYmVyc0l0ZXJhdG9ycygpKTsKLQkJfQotCQotCQlwcml2YXRlIEl0ZXJhdG9yPEl0ZXJhdG9yPE1lbWJlcj4+IG1lbWJlcnNJdGVyYXRvcnMoKSB7Ci0JCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RmFtaWx5LCBJdGVyYXRvcjxNZW1iZXI+Pih0aGlzLmZhbWlsaWVzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8TWVtYmVyPiB0cmFuc2Zvcm0oRmFtaWx5IGZhbWlseSkgewotCQkJCQlyZXR1cm4gZmFtaWx5Lm1lbWJlcnMoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXB1YmxpYyBNZW1iZXIgbWVtYmVyTmFtZWQoU3RyaW5nIGZhbWlseU5hbWUsIFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5mYW1pbHlOYW1lZChmYW1pbHlOYW1lKS5tZW1iZXJOYW1lZChtZW1iZXJOYW1lKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogaW5uZXIgY2xhc3MKLQkgKi8KLQlwcml2YXRlIGNsYXNzIEZhbWlseSBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPE1lbWJlcj4gbWVtYmVycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNQkVSU19DT0xMRUNUSU9OID0gIm1lbWJlcnMiOwotCQotCQlwdWJsaWMgRmFtaWx5KFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCi0JCXB1YmxpYyBJdGVyYXRvcjxNZW1iZXI+IG1lbWJlcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZW1iZXJzLml0ZXJhdG9yKCk7Ci0JCX0KLQkKLQkJcHVibGljIE1lbWJlciBhZGRNZW1iZXIoU3RyaW5nIG1lbWJlck5hbWUpIHsKLQkJCU1lbWJlciBtZW1iZXIgPSBuZXcgTWVtYmVyKG1lbWJlck5hbWUpOwotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKG1lbWJlciwgdGhpcy5tZW1iZXJzLCBNRU1CRVJTX0NPTExFQ1RJT04pOwotCQkJcmV0dXJuIG1lbWJlcjsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlTWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKG1lbWJlciwgdGhpcy5tZW1iZXJzLCBNRU1CRVJTX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCXB1YmxpYyBNZW1iZXIgbWVtYmVyTmFtZWQoU3RyaW5nIG1lbWJlck5hbWUpIHsKLQkJCWZvciAoTWVtYmVyIG1lbWJlciA6IHRoaXMubWVtYmVycykgewotCQkJCWlmIChtZW1iZXIuZ2V0TmFtZSgpLmVxdWFscyhtZW1iZXJOYW1lKSkgewotCQkJCQlyZXR1cm4gbWVtYmVyOwotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obWVtYmVyTmFtZSk7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQl9Ci0JCi0JfQotCi0KLQkvKioKLQkgKiBpbm5lciBjbGFzcwotCSAqLwotCXByaXZhdGUgY2xhc3MgTWVtYmVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCi0JCXB1YmxpYyBNZW1iZXIoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZjA3ZGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0wOwotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0xOwotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0yOwotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0zOwotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gdWJlckxWTTsKLQlwcml2YXRlIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4gY29tcG9zaXRlTFZNOwotCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQotCQl0aGlzLmx2bTAgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmx2bTAuYWRkKCJhYWEiKTsKLQkJdGhpcy5sdm0wLmFkZCgiYmJiIik7Ci0JCXRoaXMubHZtMC5hZGQoImNjYyIpOwotCi0JCXRoaXMubHZtMSA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMubHZtMS5hZGQoImRkZCIpOwotCQl0aGlzLmx2bTEuYWRkKCJlZWUiKTsKLQotCQl0aGlzLmx2bTIgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmx2bTIuYWRkKCJmZmYiKTsKLQotCQl0aGlzLmx2bTMgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmx2bTMuYWRkKCJnZ2ciKTsKLQkJdGhpcy5sdm0zLmFkZCgiaGhoIik7Ci0JCXRoaXMubHZtMy5hZGQoImlpaSIpOwotCQl0aGlzLmx2bTMuYWRkKCJqamoiKTsKLQkJdGhpcy5sdm0zLmFkZCgia2trIik7Ci0KLQkJdGhpcy51YmVyTFZNID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCXRoaXMudWJlckxWTS5hZGQodGhpcy5sdm0wKTsKLQkJdGhpcy51YmVyTFZNLmFkZCh0aGlzLmx2bTEpOwotCQl0aGlzLnViZXJMVk0uYWRkKHRoaXMubHZtMik7Ci0JCXRoaXMudWJlckxWTS5hZGQodGhpcy5sdm0zKTsKLQotCQl0aGlzLmNvbXBvc2l0ZUxWTSA9IG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KChMaXN0VmFsdWVNb2RlbDxTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PikgdGhpcy51YmVyTFZNKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEludCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYWEiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIGNvb3JkTGlzdC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImJiYiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscygiYmJiIiwgY29vcmRMaXN0LmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscygiY2NjIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjY2MiLCBjb29yZExpc3QuZ2V0KDIpKTsKLQotCQlhc3NlcnRFcXVhbHMoImRkZCIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZGRkIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZWVlIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlZWUiLCBjb29yZExpc3QuZ2V0KDQpKTsKLQotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYWEiLCB0aGlzLmNvbXBvc2l0ZUxWTS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgY29vcmRMaXN0Lml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0xID0gY29vcmRMaXN0Lml0ZXJhdG9yKCk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gdGhpcy5jb21wb3NpdGVMVk0uaXRlcmF0b3IoKTsgc3RyZWFtMi5oYXNOZXh0KCk7ICkgewotCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbTEubmV4dCgpLCBzdHJlYW0yLm5leHQoKSk7Ci0JCX0KLQkJYXNzZXJ0RmFsc2Uoc3RyZWFtMS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCQlhc3NlcnRFcXVhbHMoMTEsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgY29vcmRMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkoKSB7Ci0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbXBvc2l0ZUxWTS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5sdm0wLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLmNvbXBvc2l0ZUxWTS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGNvb3JkTGlzdCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29tcG9zaXRlTFZNLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5sdm0wLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGNvb3JkTGlzdCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb21wb3NpdGVMVk0uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMubHZtMC5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNvdXJjZV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bS5hZGQoInh4eCIpOwotCQlsdm0uYWRkKCJ5eXkiKTsKLQkJbHZtLmFkZCgienp6Iik7Ci0JCXRoaXMudWJlckxWTS5hZGQoMCwgbHZtKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIsICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU291cmNlX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bS5hZGQoInh4eCIpOwotCQlsdm0uYWRkKCJ5eXkiKTsKLQkJbHZtLmFkZCgienp6Iik7Ci0JCXRoaXMudWJlckxWTS5hZGQoMiwgbHZtKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgInh4eCIsICJ5eXkiLCAienp6IiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU291cmNlX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bS5hZGQoInh4eCIpOwotCQlsdm0uYWRkKCJ5eXkiKTsKLQkJbHZtLmFkZCgienp6Iik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgInh4eCIsICJ5eXkiLCAienp6IiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU291cmNlcygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bUEgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm1BLmFkZCgieHh4Iik7Ci0JCWx2bUEuYWRkKCJ5eXkiKTsKLQkJbHZtQS5hZGQoInp6eiIpOwotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bUIgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm1CLmFkZCgicHBwIik7Ci0JCWx2bUIuYWRkKCJxcXEiKTsKLQkJbHZtQi5hZGQoInJyciIpOwotCQlDb2xsZWN0aW9uPFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGMgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCWMuYWRkKGx2bUEpOwotCQljLmFkZChsdm1CKTsKLQkJdGhpcy51YmVyTFZNLmFkZEFsbCgyLCBjKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgInh4eCIsICJ5eXkiLCAienp6IiwgInBwcCIsICJxcXEiLCAicnJyIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDEyKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgxMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTb3VyY2VfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLnJlbW92ZSgwKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU291cmNlX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ucmVtb3ZlKDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNvdXJjZV9FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLnJlbW92ZSgzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNvdXJjZXMoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLnJlbW92ZSgyLCAyKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZWVlIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlZWUiLCBjb29yZExpc3QuZ2V0KDQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVNvdXJjZXMoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm1BID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtQS5hZGQoInh4eCIpOwotCQlsdm1BLmFkZCgieXl5Iik7Ci0JCWx2bUEuYWRkKCJ6enoiKTsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm1CID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtQi5hZGQoInBwcCIpOwotCQlsdm1CLmFkZCgicXFxIik7Ci0JCWx2bUIuYWRkKCJycnIiKTsKLQkJTGlzdDxTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChsdm1BKTsKLQkJbGlzdC5hZGQobHZtQik7Ci0JCXRoaXMudWJlckxWTS5zZXQoMiwgbGlzdCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJ4eHgiLCAieXl5IiwgInp6eiIsICJwcHAiLCAicXFxIiwgInJyciIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoInFxcSIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygicXFxIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTb3VyY2VzX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5tb3ZlKDAsIDIsIDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoMSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU291cmNlc19NaWRkbGUoKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNCA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTQuYWRkKCJsbGwiKTsKLQkJbHZtNC5hZGQoIm1tbSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTQpOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNSA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTUuYWRkKCJubm4iKTsKLQkJbHZtNS5hZGQoIm9vbyIpOwotCQlsdm01LmFkZCgicHBwIik7Ci0JCWx2bTUuYWRkKCJxcXEiKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm01KTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5tb3ZlKDEsIDMsIDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAibGxsIiwgIm1tbSIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJubm4iLCAib29vIiwgInBwcCIsICJxcXEiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU291cmNlc19FbmQoKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNCA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTQuYWRkKCJsbGwiKTsKLQkJbHZtNC5hZGQoIm1tbSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTQpOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNSA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTUuYWRkKCJubm4iKTsKLQkJbHZtNS5hZGQoIm9vbyIpOwotCQlsdm01LmFkZCgicHBwIik7Ci0JCWx2bTUuYWRkKCJxcXEiKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm01KTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5tb3ZlKDMsIDAsIDMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAibGxsIiwgIm1tbSIsICJubm4iLCAib29vIiwgInBwcCIsICJxcXEiLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU291cmNlKCkgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTQgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm00LmFkZCgibGxsIik7Ci0JCWx2bTQuYWRkKCJtbW0iKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm00KTsKLQotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTUgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm01LmFkZCgibm5uIik7Ci0JCWx2bTUuYWRkKCJvb28iKTsKLQkJbHZtNS5hZGQoInBwcCIpOwotCQlsdm01LmFkZCgicXFxIik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtNSk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ubW92ZSgzLCAxKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJkZGQiLCAiZWVlIiwgImxsbCIsICJtbW0iLCAibm5uIiwgIm9vbyIsICJwcHAiLCAicXFxIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygib29vIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDE0KSk7Ci0JCWFzc2VydEVxdWFscygib29vIiwgY29vcmRMaXN0LmdldCgxNCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhclNvdXJjZXMoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLmNsZWFyKCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0WzBdOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVNvdXJjZXMoKSB7Ci0JCUxpc3Q8U2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm00ID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCW5ld0xpc3QuYWRkKGx2bTQpOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNSA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTUuYWRkKCJubm4iKTsKLQkJbHZtNS5hZGQoIm9vbyIpOwotCQlsdm01LmFkZCgicHBwIik7Ci0JCWx2bTUuYWRkKCJxcXEiKTsKLQkJbmV3TGlzdC5hZGQobHZtNSk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0uc2V0TGlzdChuZXdMaXN0KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJsbGwiLCAibW1tIiwgIm5ubiIsICJvb28iLCAicHBwIiwgInFxcSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoIm9vbyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygib29vIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1fQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLmFkZCgwLCAieHh4Iik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTIuYWRkKDEsICJ4eHgiKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJ4eHgiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1fRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5hZGQoNSwgInh4eCIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAieHh4IiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLmFkZEFsbCgwLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJ5eXkiLCAienp6IiwgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoOSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoOSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc19NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0yLmFkZEFsbCgxLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgInh4eCIsICJ5eXkiLCAienp6IiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoOSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoOSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc19FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmFkZEFsbCg1LCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAieHh4IiwgInl5eSIsICJ6enoiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5yZW1vdmUoMCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbV9NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0yLnJlbW92ZSgwKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMucmVtb3ZlKDQpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5yZW1vdmUoMCwgMyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMucmVtb3ZlKDEsIDMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJra2siLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNykpOwotCQlhc3NlcnRFcXVhbHMoImtrayIsIGNvb3JkTGlzdC5nZXQoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtc19FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLnJlbW92ZSgzLCAyKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5zZXQoMCwgInh4eCIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbV9NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0yLnNldCgwLCAieHh4Iik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJ4eHgiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuc2V0KDQsICJ4eHgiKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAieHh4IiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1zX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5zZXQoMCwgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIsICJ6enoiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuc2V0KDEsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgInh4eCIsICJ5eXkiLCAienp6IiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImtrayIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgxMCkpOwotCQlhc3NlcnRFcXVhbHMoImtrayIsIGNvb3JkTGlzdC5nZXQoMTApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuc2V0KDMsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJ4eHgiLCAieXl5IiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1fQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLm1vdmUoMiwgMCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYmJiIiwgImNjYyIsICJhYWEiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEubW92ZSgwLCAxKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJlZWUiLCAiZGRkIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1fRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5tb3ZlKDAsIDQpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImtrayIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLm1vdmUoMSwgMCwgMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiY2NjIiwgImFhYSIsICJiYmIiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtc19NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLmFkZCgiZWVlLjEiKTsKLQkJdGhpcy5sdm0xLmFkZCgiZWVlLjIiKTsKLQkJdGhpcy5sdm0xLmFkZCgiZWVlLjMiKTsKLQkJdGhpcy5sdm0xLm1vdmUoMSwgMiwgMyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZS4xIiwgImVlZS4yIiwgImVlZS4zIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtc19FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLm1vdmUoMCwgMiwgMyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiaWlpIiwgImpqaiIsICJra2siLCAiZ2dnIiwgImhoaCIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFySXRlbXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLmNsZWFyKCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFySXRlbXNfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMS5jbGVhcigpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJJdGVtc19FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmNsZWFyKCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuc2V0TGlzdChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJ5eXkiLCAienp6IiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLnNldExpc3QoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIsICJ6enoiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJ4eHgiLCAieXl5IiwgInp6eiIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuc2V0TGlzdChBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgInh4eCIsICJ5eXkiLCAienp6IiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRCYWcuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1ZWM4NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBrZWVwcyBhbiBpbnRlcm5hbCBjb2xsZWN0aW9uIGluIHN5bmNoIHdpdGggdGhlCi0gKiBjb2xsZWN0aW9uIGhlbGQgYnkgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotICovCi1jbGFzcyBDb29yZGluYXRlZEJhZzxFPiBpbXBsZW1lbnRzIEJhZzxFPiwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgQmFnPEU+IGJhZyA9IG5ldyBIYXNoQmFnPEU+KCk7Ci0KLQlDb29yZGluYXRlZEJhZyhDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjdm0pIHsKLQkJY3ZtLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmFkZChvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gdGhpcy5iYWcuYWRkQWxsKGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQl0aGlzLmJhZy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5jb250YWlucyhvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnJlbW92ZShvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5yZW1vdmVBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5iYWcucmV0YWluQWxsKGMpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0JCXJldHVybiB0aGlzLmJhZy50b0FycmF5KGEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCYWcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBjb3VudChPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5iYWcuY291bnQobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbywgaW50IGNvdW50KSB7Ci0JCXJldHVybiB0aGlzLmJhZy5hZGQobywgY291bnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbywgaW50IGNvdW50KSB7Ci0JCXJldHVybiB0aGlzLmJhZy5yZW1vdmUobywgY291bnQpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiB1bmlxdWVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQlmb3IgKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBJdGVyYXRvcjxFPiBzdHJlYW0gPSAoSXRlcmF0b3I8RT4pIGUuaXRlbXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmJhZy5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJZm9yIChAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgSXRlcmF0b3I8RT4gc3RyZWFtID0gKEl0ZXJhdG9yPEU+KSBlLml0ZW1zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5iYWcucmVtb3ZlKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuYmFnLCAoKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+KSBlLmdldFNvdXJjZSgpKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmVxdWFscyhvKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5iYWcuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5iYWcudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRMaXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY3Yjg4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0RGF0YUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQga2VlcHMgYW4gaW50ZXJuYWwgbGlzdCBpbiBzeW5jaCB3aXRoIHRoZQotICogbGlzdCBoZWxkIGJ5IGEgbGlzdCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIENvb3JkaW5hdGVkTGlzdDxFPiBpbXBsZW1lbnRzIExpc3Q8RT4sIExpc3RDaGFuZ2VMaXN0ZW5lciwgTGlzdERhdGFMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBMaXN0PEU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEU+KCk7Ci0KLQlwdWJsaWMgQ29vcmRpbmF0ZWRMaXN0KExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RWYWx1ZU1vZGVsKSB7Ci0JCWxpc3RWYWx1ZU1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcyk7Ci0JCWZvciAoSXRlcmF0b3I8RT4gc3RyZWFtID0gbGlzdFZhbHVlTW9kZWwuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb29yZGluYXRlZExpc3QoTGlzdE1vZGVsIGxpc3RNb2RlbCkgewotCQlsaXN0TW9kZWwuYWRkTGlzdERhdGFMaXN0ZW5lcih0aGlzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0TW9kZWwuZ2V0U2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuYWRkKGksIHRoaXMuZ2V0RWxlbWVudEF0KGxpc3RNb2RlbCwgaSkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgRSBlbGVtZW50KSB7Ci0JCXRoaXMubGlzdC5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5hZGQobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5hZGRBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gdGhpcy5saXN0LmFkZEFsbChpbmRleCwgYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMubGlzdC5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuY29udGFpbnMobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuY29udGFpbnNBbGwoYyk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaW5kZXhPZihvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QubGFzdEluZGV4T2Yobyk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3QubGlzdEl0ZXJhdG9yKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgRSByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3QucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5yZW1vdmUobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5saXN0LnJlbW92ZUFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QucmV0YWluQWxsKGMpOwotCX0KLQotCXB1YmxpYyBFIHNldChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNldChpbmRleCwgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxFPiBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3Quc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QudG9BcnJheShhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJaW50IGkgPSBlLmdldEluZGV4KCk7Ci0JCWZvciAoSXRlcmF0b3I8RT4gc3RyZWFtID0gdGhpcy5pdGVtcyhlKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmxpc3QuYWRkKGkrKywgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJaW50IGkgPSBlLmdldEluZGV4KCk7Ci0JCWZvciAoSXRlcmF0b3I8RT4gc3RyZWFtID0gdGhpcy5pdGVtcyhlKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJdGhpcy5saXN0LnJlbW92ZShpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJaW50IGkgPSBlLmdldEluZGV4KCk7Ci0JCWZvciAoSXRlcmF0b3I8RT4gc3RyZWFtID0gdGhpcy5pdGVtcyhlKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmxpc3Quc2V0KGkrKywgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMubGlzdCwgZS5nZXRUYXJnZXRJbmRleCgpLCBlLmdldFNvdXJjZUluZGV4KCksIGUuZ2V0TW92ZUxlbmd0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmxpc3QsIHRoaXMuZ2V0U291cmNlKGUpLml0ZXJhdG9yKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0RGF0YUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGNvbnRlbnRzQ2hhbmdlZChMaXN0RGF0YUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JCUxpc3RNb2RlbCBsbSA9IChMaXN0TW9kZWwpIGUuZ2V0U291cmNlKCk7Ci0JCWludCBzaXplID0gbG0uZ2V0U2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdGhpcy5saXN0LmFkZChpLCB0aGlzLmdldEVsZW1lbnRBdChsbSwgaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW50ZXJ2YWxBZGRlZChMaXN0RGF0YUV2ZW50IGUpIHsKLQkJTGlzdE1vZGVsIGxtID0gKExpc3RNb2RlbCkgZS5nZXRTb3VyY2UoKTsKLQkJaW50IHN0YXJ0ID0gTWF0aC5taW4oZS5nZXRJbmRleDAoKSwgZS5nZXRJbmRleDEoKSk7Ci0JCWludCBlbmQgPSBNYXRoLm1heChlLmdldEluZGV4MCgpLCBlLmdldEluZGV4MSgpKTsKLQkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7Ci0JCQl0aGlzLmxpc3QuYWRkKGksIHRoaXMuZ2V0RWxlbWVudEF0KGxtLCBpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnRlcnZhbFJlbW92ZWQoTGlzdERhdGFFdmVudCBlKSB7Ci0JCWludCBzdGFydCA9IE1hdGgubWluKGUuZ2V0SW5kZXgwKCksIGUuZ2V0SW5kZXgxKCkpOwotCQlpbnQgZW5kID0gTWF0aC5tYXgoZS5nZXRJbmRleDAoKSwgZS5nZXRJbmRleDEoKSk7Ci0JCWludCBsZW5ndGggPSBlbmQgLSBzdGFydCArIDE7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbmd0aDsgaSsrKSB7Ci0JCQl0aGlzLmxpc3QucmVtb3ZlKHN0YXJ0KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmVxdWFscyhvKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lmhhc2hDb2RlKCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIG1pbmltaXplIHRoZSBzY29wZSBvZiB0aGUgc3VwcHJlc3NlZCB3YXJuaW5ncy49Ci0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBFIGdldEVsZW1lbnRBdChMaXN0TW9kZWwgbGlzdE1vZGVsLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChFKSBsaXN0TW9kZWwuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MuPQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSXRlcmF0b3I8RT4gaXRlbXMoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmF0b3I8RT4pIGV2ZW50Lml0ZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogbWluaW1pemUgdGhlIHNjb3BlIG9mIHRoZSBzdXBwcmVzc2VkIHdhcm5pbmdzLj0KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEU+IGdldFNvdXJjZShMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChMaXN0VmFsdWVNb2RlbDxFPikgZXZlbnQuZ2V0U291cmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0V4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWNiYTg5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gZXh0ZW5kZWRMaXN0SG9sZGVyOwotCUxpc3RDaGFuZ2VFdmVudCBldmVudDsKLQlTdHJpbmcgZXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERCA9ICJhZGQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRSA9ICJyZXBsYWNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRSA9ICJtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVIgPSAiY2xlYXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0UgPSAiY2hhbmdlIjsKLQotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpOwotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlciA9IHRoaXMuYnVpbGRFeHRlbmRlZExpc3RIb2xkZXIodGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiQSIpOwotCQlyZXN1bHQuYWRkKCJCIik7Ci0JCXJlc3VsdC5hZGQoIkMiKTsKLQkJcmVzdWx0LmFkZCgiRCIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkRXh0ZW5kZWRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gZXh0ZW5kZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWV4dGVuZGVkTGlzdC5hZGRBbGwodGhpcy5idWlsZFByZWZpeCgpKTsKLQkJZXh0ZW5kZWRMaXN0LmFkZEFsbCh0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJZXh0ZW5kZWRMaXN0LmFkZEFsbCh0aGlzLmJ1aWxkU3VmZml4KCkpOwotCQlyZXR1cm4gZXh0ZW5kZWRMaXN0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkUHJlZml4KCkgewotCQlMaXN0PFN0cmluZz4gcHJlZml4ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXByZWZpeC5hZGQoIngiKTsKLQkJcHJlZml4LmFkZCgieSIpOwotCQlwcmVmaXguYWRkKCJ6Iik7Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRTdWZmaXgoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzdWZmaXggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3VmZml4LmFkZCgiaSIpOwotCQlzdWZmaXguYWRkKCJqIik7Ci0JCXJldHVybiBzdWZmaXg7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRXh0ZW5kZWRMaXN0SG9sZGVyKExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtKSB7Ci0JCXJldHVybiBuZXcgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPih0aGlzLmJ1aWxkUHJlZml4KCksIGx2bSwgdGhpcy5idWlsZFN1ZmZpeCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRFeHRlbmRlZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5leHRlbmRlZExpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRFeHRlbmRlZExpc3QoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRFeHRlbmRlZExpc3QoKS5zaXplKCksIHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkTGlzdENvbnRhaW5zKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5leHRlbmRlZExpc3RIb2xkZXIuaXRlcmF0b3IoKSwgaXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkTGlzdENvbnRhaW5zQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5kZWRMaXN0Q29udGFpbnNBbnkoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCUxpc3Q8U3RyaW5nPiBleHRlbmRlZExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGV4dGVuZGVkTGlzdC5jb250YWlucyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGlzdENvbnRhaW5zKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsaXN0Q29udGFpbnNBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLS8vCXByaXZhdGUgYm9vbGVhbiBsaXN0Q29udGFpbnNBbnkoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0vLwkJTGlzdDxTdHJpbmc+IGV4dGVuZGVkTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLS8vCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gaXRlbXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0vLwkJCWlmIChleHRlbmRlZExpc3QuY29udGFpbnMoc3RyZWFtLm5leHQoKSkpIHsKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBmYWxzZTsKLS8vCX0KLS8vCi0JcHVibGljIHZvaWQgdGVzdEFkZDEoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnMoIkUiKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoNCwgIkUiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKCJFIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKCJFIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQyKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCg0LCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRBZGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gYWRkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhZGRMaXN0LmFkZCgiRSIpOwotCQlhZGRMaXN0LmFkZCgiRiIpOwotCQlyZXR1cm4gYWRkTGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsMSgpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5leHRlbmRlZExpc3RDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoNCwgdGhpcy5idWlsZEFkZExpc3QoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5leHRlbmRlZExpc3RDb250YWluc0FsbCh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnNBbGwodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUxKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnMoIkIiKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUodGhpcy5idWlsZExpc3QoKS5pbmRleE9mKCJCIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKCJCIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiQiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZUdlbmVyaWMoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlTmFtZWQoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdENoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCg0LCAiRSIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgNywgIkUiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDUsIG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgOCwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSg1KTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDgsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVNT1ZFLCA3LCAiRSIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoMCwgdGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQUREKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuZXZlbnQuaXRlbXMoKSkpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5zZXQoMCwgIkFBIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVQTEFDRSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmV2ZW50Lml0ZW1zKCksICJBIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmV2ZW50Lml0ZW1zKCksICJBQSIpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQUREOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFUExBQ0U7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gTU9WRTsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENIQU5HRTsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChTdHJpbmcgdHlwZSkgewotCQlhc3NlcnRFcXVhbHModHlwZSwgdGhpcy5ldmVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5leHRlbmRlZExpc3RIb2xkZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyB0eXBlLCBpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodHlwZSk7Ci0JCWFzc2VydEVxdWFscyhpbmRleCwgdGhpcy5ldmVudC5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW0sIHRoaXMuZXZlbnQuaXRlbXMoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCS8qCi0JCSAqIGFkZGluZyBsaXN0ZW5lcnMgdG8gdGhlIGV4dGVuZGVkIGxpc3Qgd2lsbCBjYXVzZSBsaXN0ZW5lcnMKLQkJICogdG8gYmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdDsKLQkJICogbGlrZXdpc2UsIHJlbW92aW5nIGxpc3RlbmVycyBmcm9tIHRoZSBleHRlbmRlZCBsaXN0IHdpbGwKLQkJICogY2F1c2UgbGlzdGVuZXJzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0Ci0JCSAqLwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCi0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWY2ZTc5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyOwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBhZGRFdmVudDsKLQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgcmVtb3ZlRXZlbnQ7Ci0JQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGNvbGxlY3Rpb25DbGVhcmVkRXZlbnQ7Ci0JQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyOwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBmaWx0ZXJlZEFkZEV2ZW50OwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBmaWx0ZXJlZFJlbW92ZUV2ZW50OwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBmaWx0ZXJlZENvbGxlY3Rpb25DbGVhcmVkRXZlbnQ7Ci0JQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGZpbHRlcmVkQ29sbGVjdGlvbkNoYW5nZWRFdmVudDsKLQotCXB1YmxpYyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlciA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KGJ1aWxkQ29sbGVjdGlvbigpKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsIHRoaXMuYnVpbGRGaWx0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKCJiIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJLy8gYWRkIGEgbGlzdGVuZXIgdG8gImFjdGl2YXRlIiB0aGUgd3JhcHBlcgotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyVmFsdWUgPSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2xsZWN0aW9uSG9sZGVyVmFsdWUubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb2xsZWN0aW9uSG9sZGVyVmFsdWUubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5ld0NvbGxlY3Rpb24gPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImZveCIpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF6Iik7Ci0JCQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2V0Q29sbGVjdGlvbihuZXdDb2xsZWN0aW9uKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGNvbGxlY3Rpb25WYWx1ZXMgPSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb3giLCBjb2xsZWN0aW9uVmFsdWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgY29sbGVjdGlvblZhbHVlcy5uZXh0KCkpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGZpbHRlcmVkQ29sbGVjdGlvblZhbHVlcyA9IHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgZmlsdGVyZWRDb2xsZWN0aW9uVmFsdWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGZpbHRlcmVkQ29sbGVjdGlvblZhbHVlcy5oYXNOZXh0KCkpOwotCX0JCQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UxKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UyKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckV2ZW50cygpIHsKLQkJdGhpcy5hZGRFdmVudCA9IG51bGw7Ci0JCXRoaXMucmVtb3ZlRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkQWRkRXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkUmVtb3ZlRXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvbkNoYW5nZXMoKSB7Ci0JCWNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gdGVtcENvbGxlY3Rpb24gPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdGVtcENvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsIHRlbXBDb2xsZWN0aW9uKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkQWRkRXZlbnQsIHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCQotCQljbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJdGVtcENvbGxlY3Rpb24ucmVtb3ZlKCJiYXIiKTsKLQkJdGVtcENvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnJlbW92ZUV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsIHRlbXBDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkUmVtb3ZlRXZlbnQpOwotCi0KLQkJY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiYmFyIik7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCXRlbXBDb2xsZWN0aW9uLnJlbW92ZSgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5yZW1vdmVFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZFJlbW92ZUV2ZW50LCB0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlciwgdGVtcENvbGxlY3Rpb24pOwotCi0KLQkJY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRlbXBDb2xsZWN0aW9uLnJlbW92ZSgiYmFyIik7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5hZGRFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZEFkZEV2ZW50KTsKLQotCi0JCWNsZWFyRXZlbnRzKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBuZXdDb2xsZWN0aW9uID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJmb3giKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImJheiIpOwotCQkKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNldENvbGxlY3Rpb24obmV3Q29sbGVjdGlvbik7Ci0KLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgbmV3IFZlY3RvcjxTdHJpbmc+KCkpOwotCQkKLQkJdGVtcENvbGxlY3Rpb24ucmVtb3ZlKCJmb28iKTsKLQkJdGVtcENvbGxlY3Rpb24uYWRkKCJiYXoiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNoYW5nZWRFdmVudCwgdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIsIG5ldyBWZWN0b3I8U3RyaW5nPigpKTsKLQkJCi0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmFkZEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5yZW1vdmVFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkQWRkRXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkUmVtb3ZlRXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0IGl0ZW1zKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtcywgQ29sbGVjdGlvblRvb2xzLnZlY3RvcihldmVudC5pdGVtcygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZpbHRlcmVkSXRlbSgpIHsKLQkJLy8gYnVpbGQgY29sbGVjdGlvbiB3aXRoIFRlc3RJdGVtcwotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxUZXN0SXRlbT4gdGlIb2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8VGVzdEl0ZW0+KHRoaXMuYnVpbGRDb2xsZWN0aW9uMigpKTsKLQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8VGVzdEl0ZW0+IGZpbHRlcmVkVElIb2xkZXIgPSBuZXcgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8VGVzdEl0ZW0+KHRpSG9sZGVyLCB0aGlzLmJ1aWxkRmlsdGVyMigpKTsKLQkJLy8gYWRkIGEgbGlzdGVuZXIgdG8gImFjdGl2YXRlIiB0aGUgd3JhcHBlcgotCQlmaWx0ZXJlZFRJSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydEVxdWFscygwLCBmaWx0ZXJlZFRJSG9sZGVyLnNpemUoKSk7Ci0KLQkJdGlIb2xkZXIuYWRkKG5ldyBUZXN0SXRlbSgiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgZmlsdGVyZWRUSUhvbGRlci5zaXplKCkpOwotCi0JCVRlc3RJdGVtIGJheiA9IG5ldyBUZXN0SXRlbSgiYmF6Iik7Ci0JCXRpSG9sZGVyLmFkZChiYXopOwotCQlhc3NlcnRFcXVhbHMoMiwgZmlsdGVyZWRUSUhvbGRlci5zaXplKCkpOwotCQkvLyBiZWZvcmUgcmVtb3ZpbmcgaXQsIGNoYW5nZSB0aGUgaXRlbSBzbyB0aGF0IGl0IGlzIGZpbHRlcmVkCi0JCWJhei5uYW1lID0gImpheiI7Ci0JCXRpSG9sZGVyLnJlbW92ZShiYXopOwotCQkvLyB0aGlzIHdvdWxkIGZhaWwgYmVjYXVzZSB0aGUgaXRlbSB3YXMgbm90IHJlbW92ZWQgZnJvbQotCQkvLyB0aGUgZmlsdGVyZWQgY29sbGVjdGlvbiBjYWNoZS4uLiBidXQgd2UndmUgZml4ZWQgaXQgbm93Ci0JCWFzc2VydEVxdWFscygxLCBmaWx0ZXJlZFRJSG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFRlc3RJdGVtPiBidWlsZENvbGxlY3Rpb24yKCkgewotCQlDb2xsZWN0aW9uPFRlc3RJdGVtPiBjb2xsZWN0aW9uID0gbmV3IFZlY3RvcjxUZXN0SXRlbT4oKTsKLQkJY29sbGVjdGlvbi5hZGQobmV3IFRlc3RJdGVtKCJmb28iKSk7Ci0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFRlc3RJdGVtPiBidWlsZEZpbHRlcjIoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyPFRlc3RJdGVtPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChUZXN0SXRlbSB0aSkgewotCQkJCXJldHVybiB0aS5uYW1lLnN0YXJ0c1dpdGgoImIiKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGVzdEl0ZW0gaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0SXRlbSB7Ci0JCVN0cmluZyBuYW1lOwotCQlUZXN0SXRlbShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE5MTJmZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJpZGlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5GaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gb2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZmlsdGVyZWRPYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBmaWx0ZXJlZEV2ZW50OwotCi0JcHVibGljIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCJmb28iKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlciA9IG5ldyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMub2JqZWN0SG9sZGVyLCB0aGlzLmJ1aWxkRmlsdGVyKCkpOwotCX0KLQotCXByaXZhdGUgQmlkaUZpbHRlcjxTdHJpbmc+IGJ1aWxkRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEJpZGlGaWx0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiAocyAhPSBudWxsKSAmJiBzLnN0YXJ0c1dpdGgoImIiKTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIHJldmVyc2VBY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gKHMgIT0gbnVsbCkgJiYgcy5zdGFydHNXaXRoKCJiIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJmb28iLCAiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZEV2ZW50LCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLCBudWxsLCAiYmFyIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImJhciIsICJiYXoiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkRXZlbnQsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIsICJiYXIiLCAiYmF6Iik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImJheiIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkRXZlbnQsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIsICJiYXoiLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImZvcCIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiZm9vIiwgImZvcCIpOwotCQlhc3NlcnROdWxsKHRoaXMuZmlsdGVyZWRFdmVudCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiZm9wIiwgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZEV2ZW50KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBudWxsLCAiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZEV2ZW50LCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLCBudWxsLCAiYmFyIik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlLCBPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ3YmJlZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBmb287Ci0JcHJpdmF0ZSBKdW5rIGJhcjsKLQlwcml2YXRlIEp1bmsgYmF6OwotCXByaXZhdGUgSnVuayBqb287Ci0JcHJpdmF0ZSBKdW5rIGphcjsKLQlwcml2YXRlIEp1bmsgamF6OwotCi0JcHJpdmF0ZSBKdW5rIHRvbTsKLQlwcml2YXRlIEp1bmsgZGljazsKLQlwcml2YXRlIEp1bmsgaGFycnk7Ci0KLQlwdWJsaWMgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBKdW5rKCJmb28iKTsKLQkJdGhpcy5iYXIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCXRoaXMuYmF6ID0gbmV3IEp1bmsoImJheiIpOwotCQl0aGlzLmpvbyA9IG5ldyBKdW5rKCJqb28iKTsKLQkJdGhpcy5qYXIgPSBuZXcgSnVuaygiamFyIik7Ci0JCXRoaXMuamF6ID0gbmV3IEp1bmsoImpheiIpOwotCi0JCXRoaXMudG9tID0gbmV3IEp1bmsoInRvbSIpOwotCQl0aGlzLmRpY2sgPSBuZXcgSnVuaygiZGljayIpOwotCQl0aGlzLmhhcnJ5ID0gbmV3IEp1bmsoImhhcnJ5Iik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLnRvbSk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuZGljayk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmZvbyk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuamFyKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLmFkZCg2LCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDcsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDgsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCwgTGlzdDxKdW5rPiBsaXN0KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLmdldChpKSwgbGlzdC5nZXQoaSkpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0NPTExFQ1RJT04pOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCi0JCWxpc3RWYWx1ZU1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0NPTExFQ1RJT04pOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RWYWx1ZU1vZGVsLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoMCkpOwotCQl0aGlzLmJhci5yZW1vdmVTdHVmZigiYmFyIik7Ci0JCXRoaXMuYmFyLmFkZFN0dWZmKCJ6enoiKTsKLQkJdGhpcy5iYXIuYWRkU3R1ZmYoImJhciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIGxpc3RWYWx1ZU1vZGVsLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgc3luY2hMaXN0LmdldCg1KSk7Ci0JCXRoaXMuYmFyLnJlbW92ZVN0dWZmKCJ6enoiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SnVuaz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlCYWc8SnVuaz4gYmFnID0gbmV3IEhhc2hCYWc8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oYmFnKTsKLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8SnVuaz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PEp1bms+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248SnVuaz4gYykgewotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXopOwotCQljLmFkZCh0aGlzLmpvbyk7Ci0JCWMuYWRkKHRoaXMuamFyKTsKLQkJYy5hZGQodGhpcy5qYXopOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKdW5rIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBEaXNwbGF5YWJsZSB7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN0dWZmOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVRkZfQ09MTEVDVElPTiA9ICJzdHVmZiI7Ci0JCQkKLQkKLQkJcHVibGljIEp1bmsoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5zdHVmZiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJdGhpcy5zdHVmZi5hZGQoc3R1ZmZJdGVtKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBhZGRTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oc3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9DT0xMRUNUSU9OKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oc3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdG9TdHJpbmcoKTsKLQkJfQotCQotCQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKERpc3BsYXlhYmxlIG8pIHsKLQkJCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLCBvKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5zdHVmZiArICIpIjsKLQkJfQotCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjODE2OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBmb287Ci0JcHJpdmF0ZSBKdW5rIGJhcjsKLQlwcml2YXRlIEp1bmsgYmF6OwotCXByaXZhdGUgSnVuayBqb287Ci0JcHJpdmF0ZSBKdW5rIGphcjsKLQlwcml2YXRlIEp1bmsgamF6OwotCi0JcHJpdmF0ZSBKdW5rIHRvbTsKLQlwcml2YXRlIEp1bmsgZGljazsKLQlwcml2YXRlIEp1bmsgaGFycnk7Ci0KLQlwdWJsaWMgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBKdW5rKCJmb28iKTsKLQkJdGhpcy5iYXIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCXRoaXMuYmF6ID0gbmV3IEp1bmsoImJheiIpOwotCQl0aGlzLmpvbyA9IG5ldyBKdW5rKCJqb28iKTsKLQkJdGhpcy5qYXIgPSBuZXcgSnVuaygiamFyIik7Ci0JCXRoaXMuamF6ID0gbmV3IEp1bmsoImpheiIpOwotCi0JCXRoaXMudG9tID0gbmV3IEp1bmsoInRvbSIpOwotCQl0aGlzLmRpY2sgPSBuZXcgSnVuaygiZGljayIpOwotCQl0aGlzLmhhcnJ5ID0gbmV3IEp1bmsoImhhcnJ5Iik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlciwgSnVuay5TVFVGRl9MSVNUKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLnRvbSk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuZGljayk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmZvbyk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuamFyKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9MSVNUKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLmFkZCg2LCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDcsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDgsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCwgTGlzdDxKdW5rPiBsaXN0KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLmdldChpKSwgbGlzdC5nZXQoaSkpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0xJU1QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCi0JCWxpc3RWYWx1ZU1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0xJU1QpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RWYWx1ZU1vZGVsLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfTElTVCkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoMCkpOwotCQl0aGlzLmJhci5yZW1vdmVTdHVmZigiYmFyIik7Ci0JCXRoaXMuYmFyLmFkZFN0dWZmKCJ6enoiKTsKLQkJdGhpcy5iYXIuYWRkU3R1ZmYoImJhciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIGxpc3RWYWx1ZU1vZGVsLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgc3luY2hMaXN0LmdldCg1KSk7Ci0JCXRoaXMuYmFyLnJlbW92ZVN0dWZmKCJ6enoiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SnVuaz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlCYWc8SnVuaz4gYmFnID0gbmV3IEhhc2hCYWc8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oYmFnKTsKLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8SnVuaz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PEp1bms+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248SnVuaz4gYykgewotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXopOwotCQljLmFkZCh0aGlzLmpvbyk7Ci0JCWMuYWRkKHRoaXMuamFyKTsKLQkJYy5hZGQodGhpcy5qYXopOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKdW5rIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBEaXNwbGF5YWJsZSB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN0dWZmOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVRkZfTElTVCA9ICJzdHVmZiI7Ci0JCQkKLQkKLQkJcHVibGljIEp1bmsoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5zdHVmZiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJdGhpcy5zdHVmZi5hZGQoc3R1ZmZJdGVtKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLnN0dWZmLmFkZChzdHVmZkl0ZW0pOwotCQkJZmlyZUl0ZW1BZGRlZChTVFVGRl9MSVNULCB0aGlzLnN0dWZmLmluZGV4T2Yoc3R1ZmZJdGVtKSwgc3R1ZmZJdGVtKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJaW50IGluZGV4ID0gdGhpcy5zdHVmZi5pbmRleE9mKHN0dWZmSXRlbSk7Ci0JCQl0aGlzLnN0dWZmLnJlbW92ZShzdHVmZkl0ZW0pOwotCQkJZmlyZUl0ZW1SZW1vdmVkKFNUVUZGX0xJU1QsIGluZGV4LCBzdHVmZkl0ZW0pOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0b1N0cmluZygpOwotCQl9Ci0JCi0JCXB1YmxpYyBJY29uIGljb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlVG8oRGlzcGxheWFibGUgbykgewotCQkJcmV0dXJuIERFRkFVTFRfQ09NUEFSQVRPUi5jb21wYXJlKHRoaXMsIG8pOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLnN0dWZmICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjA3MDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsgZm9vOwotCXByaXZhdGUgSnVuayBiYXI7Ci0JcHJpdmF0ZSBKdW5rIGJhejsKLQlwcml2YXRlIEp1bmsgam9vOwotCXByaXZhdGUgSnVuayBqYXI7Ci0JcHJpdmF0ZSBKdW5rIGphejsKLQotCXByaXZhdGUgSnVuayB0b207Ci0JcHJpdmF0ZSBKdW5rIGRpY2s7Ci0JcHJpdmF0ZSBKdW5rIGhhcnJ5OwotCi0JcHVibGljIEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZm9vID0gbmV3IEp1bmsoInRoaXMuZm9vIik7Ci0JCXRoaXMuYmFyID0gbmV3IEp1bmsoInRoaXMuYmFyIik7Ci0JCXRoaXMuYmF6ID0gbmV3IEp1bmsoInRoaXMuYmF6Iik7Ci0JCXRoaXMuam9vID0gbmV3IEp1bmsoInRoaXMuam9vIik7Ci0JCXRoaXMuamFyID0gbmV3IEp1bmsoInRoaXMuamFyIik7Ci0JCXRoaXMuamF6ID0gbmV3IEp1bmsoInRoaXMuamF6Iik7Ci0KLQkJdGhpcy50b20gPSBuZXcgSnVuaygidGhpcy50b20iKTsKLQkJdGhpcy5kaWNrID0gbmV3IEp1bmsoInRoaXMuZGljayIpOwotCQl0aGlzLmhhcnJ5ID0gbmV3IEp1bmsoInRoaXMuaGFycnkiKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25TeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlciwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMudG9tKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5kaWNrKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5zZXRDb2xsZWN0aW9uKHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCg3LCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCg4LCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJLy8gdGVzdCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBleGNlcHRpb24KLQkJbGlzdEhvbGRlci5zZXRMaXN0KHRoaXMuYnVpbGRMaXN0KCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCwgTGlzdDxKdW5rPiBsaXN0KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLmdldChpKSwgbGlzdC5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQ29sbGVjdGlvblNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvblNvcnQodGhpcy5idWlsZEN1c3RvbUNvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUxpc3RTb3J0KCkgewotCQl0aGlzLnZlcmlmeUxpc3RTb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxKdW5rPiBidWlsZEN1c3RvbUNvbXBhcmF0b3IoKSB7Ci0JCS8vIHNvcnQgd2l0aCByZXZlcnNlIG9yZGVyCi0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxKdW5rPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShKdW5rIG8xLCBKdW5rIG8yKSB7Ci0JCQkJcmV0dXJuIG8yLmNvbXBhcmVUbyhvMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25Tb3J0KENvbXBhcmF0b3I8SnVuaz4gY29tcGFyYXRvcikgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlciwgY29tcGFyYXRvciksIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuc2V0Q29sbGVjdGlvbih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0U29ydChDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIGNvbXBhcmF0b3IpLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMudG9tKTsKLQkJbGlzdEhvbGRlci5hZGQoMCwgdGhpcy5kaWNrKTsKLQkJbGlzdEhvbGRlci5hZGQoMCwgdGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg1KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIuc2V0TGlzdCh0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wYXJlU29ydChMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCwgTGlzdDxKdW5rPiBsaXN0LCBDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU29ydGVkU2V0PEp1bms+IHNzID0gbmV3IFRyZWVTZXQ8SnVuaz4oY29tcGFyYXRvcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCXNzLmFkZChsaXN0VmFsdWVNb2RlbC5nZXQoaSkpOwotCQl9Ci0JCWFzc2VydEVxdWFscyhzcy5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvcjxKdW5rPiBzdHJlYW0xID0gc3MuaXRlcmF0b3IoKSwgc3RyZWFtMiA9IGxpc3QuaXRlcmF0b3IoKTsgc3RyZWFtMS5oYXNOZXh0KCk7ICkgewotCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbTEubmV4dCgpLCBzdHJlYW0yLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciksIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlsaXN0VmFsdWVNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIpLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIGxpc3RWYWx1ZU1vZGVsLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgc3luY2hMaXN0LmdldCgwKSk7Ci0JCXRoaXMuYmFyLnNldE5hbWUoInp6eiIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIGxpc3RWYWx1ZU1vZGVsLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgc3luY2hMaXN0LmdldCg1KSk7Ci0JCXRoaXMuYmFyLnNldE5hbWUoInRoaXMuYmFyIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBidWlsZENvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEp1bms+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQmFnPEp1bms+IGJhZyA9IG5ldyBIYXNoQmFnPEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGJhZyk7Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PEp1bms+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxKdW5rPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPEp1bms+IGMpIHsKLQkJYy5hZGQodGhpcy5mb28pOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCWMuYWRkKHRoaXMuYmF6KTsKLQkJYy5hZGQodGhpcy5qb28pOwotCQljLmFkZCh0aGlzLmphcik7Ci0JCWMuYWRkKHRoaXMuamF6KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnVuayBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwdWJsaWMgSnVuayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyBJY29uIGljb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhEaXNwbGF5YWJsZSBvKSB7Ci0JCQlyZXR1cm4gREVGQVVMVF9DT01QQVJBVE9SLmNvbXBhcmUodGhpcywgbyk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjE0NmRlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsgZm9vOwotCXByaXZhdGUgSnVuayBiYXI7Ci0JcHJpdmF0ZSBKdW5rIGJhejsKLQlwcml2YXRlIEp1bmsgam9vOwotCXByaXZhdGUgSnVuayBqYXI7Ci0JcHJpdmF0ZSBKdW5rIGphejsKLQotCXByaXZhdGUgSnVuayB0b207Ci0JcHJpdmF0ZSBKdW5rIGRpY2s7Ci0JcHJpdmF0ZSBKdW5rIGhhcnJ5OwotCi0JcHVibGljIEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZm9vID0gbmV3IEp1bmsoInRoaXMuZm9vIik7Ci0JCXRoaXMuYmFyID0gbmV3IEp1bmsoInRoaXMuYmFyIik7Ci0JCXRoaXMuYmF6ID0gbmV3IEp1bmsoInRoaXMuYmF6Iik7Ci0JCXRoaXMuam9vID0gbmV3IEp1bmsoInRoaXMuam9vIik7Ci0JCXRoaXMuamFyID0gbmV3IEp1bmsoInRoaXMuamFyIik7Ci0JCXRoaXMuamF6ID0gbmV3IEp1bmsoInRoaXMuamF6Iik7Ci0KLQkJdGhpcy50b20gPSBuZXcgSnVuaygidGhpcy50b20iKTsKLQkJdGhpcy5kaWNrID0gbmV3IEp1bmsoInRoaXMuZGljayIpOwotCQl0aGlzLmhhcnJ5ID0gbmV3IEp1bmsoInRoaXMuaGFycnkiKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25TeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLmFkZCg2LCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDcsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDgsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCwgTGlzdDxKdW5rPiBsaXN0KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLmdldChpKSwgbGlzdC5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQ29sbGVjdGlvblNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvblNvcnQodGhpcy5idWlsZEN1c3RvbUNvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUxpc3RTb3J0KCkgewotCQl0aGlzLnZlcmlmeUxpc3RTb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxKdW5rPiBidWlsZEN1c3RvbUNvbXBhcmF0b3IoKSB7Ci0JCS8vIHNvcnQgd2l0aCByZXZlcnNlIG9yZGVyCi0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxKdW5rPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShKdW5rIG8xLCBKdW5rIG8yKSB7Ci0JCQkJcmV0dXJuIG8yLmNvbXBhcmVUbyhvMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25Tb3J0KENvbXBhcmF0b3I8SnVuaz4gY29tcGFyYXRvcikgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlciwgY29tcGFyYXRvcikpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLnRvbSk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuZGljayk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RTb3J0KENvbXBhcmF0b3I8SnVuaz4gY29tcGFyYXRvcikgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgY29tcGFyYXRvcikpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNSk7Ci0JCWFzc2VydEVxdWFscyg1LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZVNvcnQoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCwgQ29tcGFyYXRvcjxKdW5rPiBjb21wYXJhdG9yKSB7Ci0JCVNvcnRlZFNldDxKdW5rPiBzcyA9IG5ldyBUcmVlU2V0PEp1bms+KGNvbXBhcmF0b3IpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWYWx1ZU1vZGVsLnNpemUoKTsgaSsrKSB7Ci0JCQlzcy5hZGQobGlzdFZhbHVlTW9kZWwuZ2V0KGkpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoc3Muc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3I8SnVuaz4gc3RyZWFtMSA9IHNzLml0ZXJhdG9yKCksIHN0cmVhbTIgPSBsaXN0Lml0ZXJhdG9yKCk7IHN0cmVhbTEuaGFzTmV4dCgpOyApIHsKLQkJCWFzc2VydEVxdWFscyhzdHJlYW0xLm5leHQoKSwgc3RyZWFtMi5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIpKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlsaXN0VmFsdWVNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0VmFsdWVNb2RlbC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlcikpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoMCkpOwotCQl0aGlzLmJhci5zZXROYW1lKCJ6enoiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoNSkpOwotCQl0aGlzLmJhci5zZXROYW1lKCJ0aGlzLmJhciIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxKdW5rPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUJhZzxKdW5rPiBiYWcgPSBuZXcgSGFzaEJhZzxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihiYWcpOwotCQlyZXR1cm4gYmFnOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxKdW5rPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8SnVuaz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24obGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxKdW5rPiBjKSB7Ci0JCWMuYWRkKHRoaXMuZm9vKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJheik7Ci0JCWMuYWRkKHRoaXMuam9vKTsKLQkJYy5hZGQodGhpcy5qYXIpOwotCQljLmFkZCh0aGlzLmpheik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKdW5rIGNsYXNzICoqKioqKioqKioKLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgQ29tcGFyYWJsZTxKdW5rPiB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXB1YmxpYyBKdW5rKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhKdW5rIGopIHsKLQkJCXJldHVybiB0aGlzLm5hbWUuY29tcGFyZVRvKGoubmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9KcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0pwdFV0aWxpdHlNb2RlbFZhbHVlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzMDcwYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0pwdFV0aWxpdHlNb2RlbFZhbHVlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmcy5KcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlNb2RlbFZhbHVlVGVzdHMgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cy5zdWl0ZSgpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXN0QXNwZWN0QWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXN0Q3VyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE51bGxMaXN0VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE51bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdGF0aWNMaXN0VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdGF0aWNWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLlRyYW5zZm9ybWVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmVlQXNwZWN0QWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWYWx1ZUxpc3RBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWYWx1ZVN0YXRlQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlNb2RlbFZhbHVlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODI1YmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QxOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIxOwotCXByaXZhdGUgTG9jYWxMaXN0QXNwZWN0QWRhcHRlciBhYTE7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQxOwotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMTsKLQotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDI7Ci0KLQlwdWJsaWMgTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN1YmplY3QxID0gbmV3IFRlc3RTdWJqZWN0KCk7Ci0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZXModGhpcy5zdWJqZWN0MU5hbWVzKCkpOwotCQl0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9ucyh0aGlzLnN1YmplY3QxRGVzY3JpcHRpb25zKCkpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4odGhpcy5zdWJqZWN0MSk7Ci0JCXRoaXMuYWExID0gdGhpcy5idWlsZEFzcGVjdEFkYXB0ZXIodGhpcy5zdWJqZWN0SG9sZGVyMSk7Ci0JCXRoaXMubGlzdGVuZXIxID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuYWExLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0KLQkJdGhpcy5zdWJqZWN0MiA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQl0aGlzLnN1YmplY3QyLmFkZE5hbWVzKHRoaXMuc3ViamVjdDJOYW1lcygpKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbnModGhpcy5zdWJqZWN0MkRlc2NyaXB0aW9ucygpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0MU5hbWVzKCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJlc3VsdC5hZGQoImJhbSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QxRGVzY3JpcHRpb25zKCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDEgZGVzY3JpcHRpb24xIik7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDEgZGVzY3JpcHRpb24yIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3ViamVjdDJOYW1lcygpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJqb28iKTsKLQkJcmVzdWx0LmFkZCgiamFyIik7Ci0JCXJlc3VsdC5hZGQoImpheiIpOwotCQlyZXN1bHQuYWRkKCJqYW0iKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0MkRlc2NyaXB0aW9ucygpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QyIGRlc2NyaXB0aW9uMSIpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QyIGRlc2NyaXB0aW9uMiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTG9jYWxMaXN0QXNwZWN0QWRhcHRlciBidWlsZEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxMaXN0QXNwZWN0QWRhcHRlcihzdWJqZWN0SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB2YWx1ZTFDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuZXZlbnQxID0gZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV2ZW50MS5pdGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QyTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV2ZW50MS5pdGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QxKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV2ZW50MS5pdGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZSgiamFtIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgdGhpcy5ldmVudDEuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygiamFtIiwgdGhpcy5ldmVudDEuaXRlbXMoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNQbHVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzUGx1cy5hZGQoImphbSIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5hYTEuYWRkKDIsICJqYXoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5ldmVudDEuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygiamF6IiwgdGhpcy5ldmVudDEuaXRlbXMoKS5uZXh0KCkpOwotCQluYW1lc1BsdXMuYWRkKDIsICJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEFkZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQlMaXN0PFN0cmluZz4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaXRlbXMuYWRkKCJqb28iKTsKLQkJaXRlbXMuYWRkKCJqYXIiKTsKLQkJaXRlbXMuYWRkKCJqYXoiKTsKLQkJaXRlbXMuYWRkKCJqYW0iKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuYWExLmFkZEFsbCgyLCBpdGVtcyk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwkJLy8gb25seSB0aGUgbGFzdCAiYWRkIiBldmVudCB3aWxsIHN0aWxsIGJlIHRoZXJlCi0JCWFzc2VydEVxdWFscygiamFtIiwgdGhpcy5ldmVudDEuaXRlbXMoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNQbHVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzUGx1cy5hZGRBbGwoMiwgaXRlbXMpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJU3RyaW5nIHJlbW92ZWROYW1lID0gdGhpcy5zdWJqZWN0MS5yZW1vdmVOYW1lKDApOwkvLyBzaG91bGQgYmUgImZvbyIKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5ldmVudDEuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhyZW1vdmVkTmFtZSwgdGhpcy5ldmVudDEuaXRlbXMoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNNaW51cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc01pbnVzLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzTWludXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQlPYmplY3QgcmVtb3ZlZEl0ZW0gPSB0aGlzLmFhMS5yZW1vdmUoMCk7CQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmV2ZW50MS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJlbW92ZWRJdGVtLCB0aGlzLmV2ZW50MS5pdGVtcygpLm5leHQoKSk7Ci0JCW5hbWVzTWludXMucmVtb3ZlKDApOwotCQlhc3NlcnRFcXVhbHMobmFtZXNNaW51cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdExlbmd0aCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQlMaXN0PFN0cmluZz4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaXRlbXMuYWRkKCJiYXIiKTsKLQkJaXRlbXMuYWRkKCJiYXoiKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuYWExLnJlbW92ZSgxLCAyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5ldmVudDEuZ2V0SW5kZXgoKSk7CQkvLyBvbmx5IHRoZSBsYXN0ICJyZW1vdmUiIGV2ZW50IHdpbGwgc3RpbGwgYmUgdGhlcmUKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmV2ZW50MS5pdGVtcygpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lc1BsdXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNQbHVzLnJlbW92ZSgxKTsKLQkJbmFtZXNQbHVzLnJlbW92ZSgxKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQlTdHJpbmcgcmVwbGFjZWROYW1lID0gdGhpcy5zdWJqZWN0MS5zZXROYW1lKDAsICJqZWxseSIpOwkvLyBzaG91bGQgYmUgImZvbyIKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5ldmVudDEuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygiamVsbHkiLCB0aGlzLmV2ZW50MS5pdGVtcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhyZXBsYWNlZE5hbWUsIHRoaXMuZXZlbnQxLnJlcGxhY2VkSXRlbXMoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNDaGFuZ2VkID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzQ2hhbmdlZC5zZXQoMCwgImplbGx5Iik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc0NoYW5nZWQsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQlyZXBsYWNlZE5hbWUgPSB0aGlzLnN1YmplY3QxLnNldE5hbWUoMSwgInJvbGwiKTsJLy8gc2hvdWxkIGJlICJiYXIiCi0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoInJvbGwiLCB0aGlzLmV2ZW50MS5pdGVtcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhyZXBsYWNlZE5hbWUsIHRoaXMuZXZlbnQxLnJlcGxhY2VkSXRlbXMoKS5uZXh0KCkpOwotCQluYW1lc0NoYW5nZWQgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNDaGFuZ2VkLnNldCgwLCAiamVsbHkiKTsKLQkJbmFtZXNDaGFuZ2VkLnNldCgxLCAicm9sbCIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNDaGFuZ2VkLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkVHdvTmFtZXMoImphbSIsICJqYXoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV2ZW50MS5pdGVtcygpLmhhc05leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lc1BsdXMyID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzUGx1czIuYWRkKDAsICJqYXoiKTsKLQkJbmFtZXNQbHVzMi5hZGQoMCwgImphbSIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzMiwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5zdWJqZWN0MS5uYW1lcygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuZ2V0KDApLCB0aGlzLnN1YmplY3QxLmdldE5hbWUoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuZ2V0KDApLCB0aGlzLmFhMS5nZXQoMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnN1YmplY3QxLm5hbWVzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfTElTVCkpOwotCQl0aGlzLmFhMS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19MSVNUKSk7Ci0JCXRoaXMuYWExLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgVGVzdFN1YmplY3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gbmFtZXM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTX0xJU1QgPSAibmFtZXMiOwotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBkZXNjcmlwdGlvbnM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OU19MSVNUID0gImRlc2NyaXB0aW9ucyI7Ci0JCi0JCXB1YmxpYyBUZXN0U3ViamVjdCgpIHsKLQkJCXRoaXMubmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXRoaXMuZGVzY3JpcHRpb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMubmFtZXMpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWVzLmdldChpbmRleCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZShpbnQgaW5kZXgsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWVzLmFkZChpbmRleCwgbmFtZSk7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoTkFNRVNfTElTVCwgaW5kZXgsIG5hbWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMuYWRkTmFtZSh0aGlzLm5hbWVzLnNpemUoKSwgbmFtZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmV3TmFtZXMpIHsKLQkJCXdoaWxlIChuZXdOYW1lcy5oYXNOZXh0KCkpIHsKLQkJCQl0aGlzLmFkZE5hbWUobmV3TmFtZXMubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lcyhMaXN0PFN0cmluZz4gbmV3TmFtZXMpIHsKLQkJCXRoaXMuYWRkTmFtZXMobmV3TmFtZXMubGlzdEl0ZXJhdG9yKCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZFR3b05hbWVzKFN0cmluZyBuYW1lMSwgU3RyaW5nIG5hbWUyKSB7Ci0JCQl0aGlzLm5hbWVzLmFkZCgwLCBuYW1lMik7Ci0JCQl0aGlzLm5hbWVzLmFkZCgwLCBuYW1lMSk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChOQU1FU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZU5hbWUoaW50IGluZGV4KSB7Ci0JCQlTdHJpbmcgcmVtb3ZlZE5hbWUgPSB0aGlzLm5hbWVzLnJlbW92ZShpbmRleCk7Ci0JCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChOQU1FU19MSVNULCBpbmRleCwgcmVtb3ZlZE5hbWUpOwotCQkJcmV0dXJuIHJlbW92ZWROYW1lOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgc2V0TmFtZShpbnQgaW5kZXgsIFN0cmluZyBuYW1lKSB7Ci0JCQlTdHJpbmcgcmVwbGFjZWROYW1lID0gdGhpcy5uYW1lcy5zZXQoaW5kZXgsIG5hbWUpOwotCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKE5BTUVTX0xJU1QsIGluZGV4LCBuYW1lLCByZXBsYWNlZE5hbWUpOwotCQkJcmV0dXJuIHJlcGxhY2VkTmFtZTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gZGVzY3JpcHRpb25zKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuZGVzY3JpcHRpb25zKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMuZGVzY3JpcHRpb25zLmdldChpbmRleCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb24oaW50IGluZGV4LCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMuZGVzY3JpcHRpb25zLmFkZChpbmRleCwgZGVzY3JpcHRpb24pOwotCQkJdGhpcy5maXJlSXRlbUFkZGVkKERFU0NSSVBUSU9OU19MSVNULCBpbmRleCwgZGVzY3JpcHRpb24pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJdGhpcy5hZGREZXNjcmlwdGlvbih0aGlzLmRlc2NyaXB0aW9ucy5zaXplKCksIGRlc2NyaXB0aW9uKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdGlvbnMoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmV3RGVzY3JpcHRpb25zKSB7Ci0JCQl3aGlsZSAobmV3RGVzY3JpcHRpb25zLmhhc05leHQoKSkgewotCQkJCXRoaXMuYWRkRGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb25zLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb25zKExpc3Q8U3RyaW5nPiBuZXdEZXNjcmlwdGlvbnMpIHsKLQkJCXRoaXMuYWRkRGVzY3JpcHRpb25zKG5ld0Rlc2NyaXB0aW9ucy5saXN0SXRlcmF0b3IoKSk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyByZW1vdmVEZXNjcmlwdGlvbihpbnQgaW5kZXgpIHsKLQkJCVN0cmluZyByZW1vdmVkRGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9ucy5yZW1vdmUoaW5kZXgpOwotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoREVTQ1JJUFRJT05TX0xJU1QsIGluZGV4LCByZW1vdmVkRGVzY3JpcHRpb24pOwotCQkJcmV0dXJuIHJlbW92ZWREZXNjcmlwdGlvbjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHNldERlc2NyaXB0aW9uKGludCBpbmRleCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlTdHJpbmcgcmVwbGFjZWREZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb25zLnNldChpbmRleCwgZGVzY3JpcHRpb24pOwotCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKERFU0NSSVBUSU9OU19MSVNULCBpbmRleCwgZGVzY3JpcHRpb24sIHJlcGxhY2VkRGVzY3JpcHRpb24pOwotCQkJcmV0dXJuIHJlcGxhY2VkRGVzY3JpcHRpb247Ci0JCX0KLQl9Ci0KLQotCS8vIHRoaXMgaXMgbm90IGEgdHlwaWNhbCBhc3BlY3QgYWRhcHRlciAtIHRoZSB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhc3BlY3QgbmFtZQotCXByaXZhdGUgY2xhc3MgTG9jYWxMaXN0QXNwZWN0QWRhcHRlciBleHRlbmRzIExpc3RBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+IHsKLQotCQlMb2NhbExpc3RBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQkJc3VwZXIoc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRVNfTElTVCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQlpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfTElTVCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZXMoKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmRlc2NyaXB0aW9ucygpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5saXN0TmFtZXNbMF0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJCWlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19MSVNUKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LmFkZE5hbWUoaW5kZXgsIChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIGlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfTElTVCkgewotCQkJCXRoaXMuc3ViamVjdC5hZGREZXNjcmlwdGlvbihpbmRleCwgKFN0cmluZykgaXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmxpc3ROYW1lc1swXSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRBbGwoaW50IGluZGV4LCBMaXN0PFN0cmluZz4gaXRlbXMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQl0aGlzLmFkZChpbmRleCArIGksIGl0ZW1zLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCWlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19MSVNUKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5yZW1vdmVOYW1lKGluZGV4KTsKLQkJCX0gZWxzZSBpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnJlbW92ZURlc2NyaXB0aW9uKGluZGV4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMubGlzdE5hbWVzWzBdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBMaXN0PFN0cmluZz4gcmVtb3ZlKGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQkJTGlzdDxTdHJpbmc+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihsZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCXJlbW92ZWRJdGVtcy5hZGQodGhpcy5yZW1vdmUoaW5kZXgpKTsKLQkJCX0KLQkJCXJldHVybiByZW1vdmVkSXRlbXM7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IHJlcGxhY2UoaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQkJaWYgKHRoaXMubGlzdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNldE5hbWUoaW5kZXgsIChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIGlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfTElTVCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc2V0RGVzY3JpcHRpb24oaW5kZXgsIChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5saXN0TmFtZXNbMF0pOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjNGM1ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBhZGFwdGVyOwotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkTGlzdEhvbGRlcjsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiB3cmFwcGVkTGlzdDsKLQotCXB1YmxpYyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy53cmFwcGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy53cmFwcGVkTGlzdCk7Ci0JCXRoaXMuYWRhcHRlciA9IG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy53cmFwcGVkTGlzdEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLndyYXBwZWRMaXN0Lml0ZXJhdG9yKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJLy8gb3ZlcnJpZGUgZmFpbHVyZQotCQkJfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlcygpIHsKLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9OwotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgwLCAiZm9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEhhc2hCYWc8U3RyaW5nPigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLndyYXBwZWRMaXN0SG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZExpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDMsICJqb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNCwgImphciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCg1LCAiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLndyYXBwZWRMaXN0LnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHN5bmNoTGlzdC5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLndyYXBwZWRMaXN0SG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMywgImpvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCg0LCAiamFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDUsICJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXoiLCB0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnJlbW92ZSg1KSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZExpc3QuY29udGFpbnMoImpheiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnJlbW92ZSgwKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZExpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZExpc3Quc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNoKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCS8vIG92ZXJyaWRlIGZhaWx1cmUKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJLy8gb3ZlcnJpZGUgZmFpbHVyZQotCQkJfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMywgImpvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCg0LCAiamFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDUsICJqYXoiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5yZW1vdmUoNSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZExpc3QuY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZExpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZExpc3Quc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQkvLyBvdmVycmlkZSBmYWlsdXJlCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCS8vIG92ZXJyaWRlIGZhaWx1cmUKLQkJCX0KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImZvbyIsIGUuaXRlbXMoKS5uZXh0KCkpOwotCQkJCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5hZGFwdGVyLml0ZXJhdG9yKCksICJqb28iKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDIsIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmFkYXB0ZXIuc2l6ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCWFzc2VydEVxdWFscygiam9vIiwgZS5pdGVtcygpLm5leHQoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmFkYXB0ZXIuc2l6ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuc2V0KDAsICJqb28iKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCUNvb3JkaW5hdGVkQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHN5bmNoQ29sbGVjdGlvbik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHN5bmNoQ29sbGVjdGlvbik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoc3luY2hDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZFRvRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuc2V0TGlzdChuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZEZyb21FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoImZvbyIpOwotCQlsaXN0LmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuc2V0TGlzdChsaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5VG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5zZXRMaXN0KGxpc3QpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQljbGFzcyBUZXN0TGlzdGVuZXIgaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEN1cmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTJiYmNmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEN1cmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDdXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0Q3VyYXRvclRlc3RzIAotCWV4dGVuZHMgVGVzdENhc2UgCi17Ci0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyMTsKLQkKLQlwcml2YXRlIExpc3RDdXJhdG9yPFRlc3RTdWJqZWN0LCBTdHJpbmc+IGN1cmF0b3I7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIxOwotCXByaXZhdGUgTGlzdENoYW5nZUV2ZW50IGV2ZW50MTsKLQkKLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QyOwotCi0JcHVibGljIExpc3RDdXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0MSA9IG5ldyBUZXN0U3ViamVjdCh0aGlzLnN1YmplY3QxTmFtZXMoKSk7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0Pih0aGlzLnN1YmplY3QxKTsKLQkJdGhpcy5jdXJhdG9yID0gdGhpcy5idWlsZExpc3RDdXJhdG9yKHRoaXMuc3ViamVjdEhvbGRlcjEpOwotCQl0aGlzLmxpc3RlbmVyMSA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuY3VyYXRvci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdGVuZXIxKTsKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQkKLQkJdGhpcy5zdWJqZWN0MiA9IG5ldyBUZXN0U3ViamVjdCh0aGlzLnN1YmplY3QyTmFtZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QxTmFtZXMoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoImFscGhhIik7Ci0JCWxpc3QuYWRkKCJicmF2byIpOwotCQlsaXN0LmFkZCgiY2hhcmxpZSIpOwotCQlsaXN0LmFkZCgiZGVsdGEiKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QyTmFtZXMoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoImVjaG8iKTsKLQkJbGlzdC5hZGQoImZveHRyb3QiKTsKLQkJbGlzdC5hZGQoImdsb3ZlIik7Ci0JCWxpc3QuYWRkKCJob3RlbCIpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0Q3VyYXRvcjxUZXN0U3ViamVjdCwgU3RyaW5nPiBidWlsZExpc3RDdXJhdG9yKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IExpc3RDdXJhdG9yPFRlc3RTdWJqZWN0LCBTdHJpbmc+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3JGb3JSZWNvcmQoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zdHJpbmdzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIxKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB2YWx1ZTFDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuZXZlbnQxID0gZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0Mik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgdGhpcy5ldmVudDEuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXZlbnQxLml0ZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDJOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB0aGlzLmV2ZW50MS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ldmVudDEuaXRlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmN1cmF0b3IuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDEpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV2ZW50MS5pdGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5hZGRTdHJpbmcoImVjaG8iKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgdGhpcy5ldmVudDEuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygiZWNobyIsIHRoaXMuZXZlbnQxLml0ZW1zKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IHN0cmluZ3NQbHVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCXN0cmluZ3NQbHVzLmFkZCgiZWNobyIpOwotCQlhc3NlcnRFcXVhbHMoc3RyaW5nc1BsdXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0MS5hZGRTdHJpbmcoMCwgInp1bHUiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuZXZlbnQxLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoInp1bHUiLCB0aGlzLmV2ZW50MS5pdGVtcygpLm5leHQoKSk7Ci0JCXN0cmluZ3NQbHVzLmFkZCgwLCAienVsdSIpOwotCQlhc3NlcnRFcXVhbHMoc3RyaW5nc1BsdXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQlTdHJpbmcgcmVtb3ZlZFN0cmluZyA9IHRoaXMuc3ViamVjdDEucmVtb3ZlU3RyaW5nKDApOwkvLyBzaG91bGQgYmUgImFscGhhIgotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5ldmVudDEuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhyZW1vdmVkU3RyaW5nLCB0aGlzLmV2ZW50MS5pdGVtcygpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBzdHJpbmdzTWludXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJc3RyaW5nc01pbnVzLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKHN0cmluZ3NNaW51cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCQotCQlyZW1vdmVkU3RyaW5nID0gdGhpcy5zdWJqZWN0MS5yZW1vdmVTdHJpbmcoMik7CS8vIHNob3VsZCBiZSAiZGVsdGEiCi0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmV2ZW50MS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJlbW92ZWRTdHJpbmcsIHRoaXMuZXZlbnQxLml0ZW1zKCkubmV4dCgpKTsKLQkJc3RyaW5nc01pbnVzLnJlbW92ZSgyKTsKLQkJYXNzZXJ0RXF1YWxzKHN0cmluZ3NNaW51cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0ZUxpc3RDaGFuZ2UoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCQkKLQkJdGhpcy5zdWJqZWN0MS5zZXRTdHJpbmdzKHRoaXMuc3ViamVjdDJOYW1lcygpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJTGlzdDxTdHJpbmc+IG5ld1N0cmluZ3MgPSB0aGlzLnN1YmplY3QyTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1N0cmluZ3MsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGFydGlhbExpc3RDaGFuZ2UoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzdGFydGluZ0xpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIHN0YXJ0aW5nTGlzdCk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCQkKLQkJU3RyaW5nIGlkZW50aWNhbFN0cmluZyA9IHN0YXJ0aW5nTGlzdC5nZXQoMSk7ICAvLyBzaG91bGQgYmUgImJyYXZvIgotCQlTdHJpbmcgbm9uaWRlbnRpY2FsU3RyaW5nID0gc3RhcnRpbmdMaXN0LmdldCgwKTsgLy8gc2hvdWxkIGJlICJhbHBoYSIKLQkJTGlzdDxTdHJpbmc+IG5ld1N0cmluZ3MgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChuZXcgU3RyaW5nW10ge25ldyBTdHJpbmcoImJyYXZvIiksIG5ldyBTdHJpbmcoImFscGhhIiksICJlY2hvIiwgImRlbHRhIiwgImZveHRyb3QifSk7Ci0JCXRoaXMuc3ViamVjdDEuc2V0U3RyaW5ncyhuZXdTdHJpbmdzKTsKLQkJCi0JCUxpc3Q8U3RyaW5nPiBmaW5hbExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3U3RyaW5ncywgZmluYWxMaXN0KTsKLQkJYXNzZXJ0VHJ1ZShpZGVudGljYWxTdHJpbmcgPT0gZmluYWxMaXN0LmdldCgwKSk7Ci0JCWFzc2VydFRydWUobm9uaWRlbnRpY2FsU3RyaW5nICE9IGZpbmFsTGlzdC5nZXQoMSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5zdWJqZWN0MS5zdHJpbmdzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLmdldCgwKSwgdGhpcy5zdWJqZWN0MS5nZXRTdHJpbmcoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuZ2V0KDApLCB0aGlzLmN1cmF0b3IuZ2V0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuc3ViamVjdDEuc3RyaW5ncygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCB0aGlzLmN1cmF0b3Iuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmN1cmF0b3IuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMuY3VyYXRvci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jdXJhdG9yLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5jdXJhdG9yLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMuY3VyYXRvci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy5jdXJhdG9yLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmN1cmF0b3IuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElubmVyIENsYXNzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQljbGFzcyBUZXN0U3ViamVjdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdHJpbmdzOwotCQkKLQkJcHVibGljIFRlc3RTdWJqZWN0KCkgewotCQkJdGhpcy5zdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBUZXN0U3ViamVjdChMaXN0PFN0cmluZz4gc3RyaW5ncykgewotCQkJdGhpcygpOwotCQkJdGhpcy5zZXRTdHJpbmdzKHN0cmluZ3MpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLnN0cmluZ3MuZ2V0KGluZGV4KTsKLQkJfQotCQkKLQkJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MoKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5zdHJpbmdzKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkU3RyaW5nKGludCBpbmRleCwgU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5zdHJpbmdzLmFkZChpbmRleCwgc3RyaW5nKTsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5hZGRTdHJpbmcodGhpcy5zdHJpbmdzLnNpemUoKSwgc3RyaW5nKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyByZW1vdmVTdHJpbmcoaW50IGluZGV4KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gdGhpcy5zdHJpbmdzLmdldChpbmRleCk7Ci0JCQl0aGlzLnJlbW92ZVN0cmluZyhzdHJpbmcpOwotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMuc3RyaW5ncy5yZW1vdmUoc3RyaW5nKTsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdzKExpc3Q8U3RyaW5nPiBzdHJpbmdzKSB7Ci0JCQl0aGlzLnN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc3RyaW5ncyk7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0U3RyaW5ncyhTdHJpbmdbXSBzdHJpbmdzKSB7Ci0JCQl0aGlzLnN0cmluZ3MgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChzdHJpbmdzKTsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmVmZWI5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxPYmplY3Q+IGNvbGxlY3Rpb25Ib2xkZXI7Ci0KLQlwdWJsaWMgTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gbmV3IE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGZlZDM1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5OdWxsTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxPYmplY3Q+IGxpc3RIb2xkZXI7Ci0KLQlwdWJsaWMgTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gbmV3IE51bGxMaXN0VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMubGlzdEhvbGRlci5nZXQoMCk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM3NWRjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbFByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgTnVsbFByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0KLQlwdWJsaWMgTnVsbFByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSBuZXcgTnVsbFByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDEyYTA2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyMTsKLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPiBhYTE7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50MTsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIxOwotCi0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MjsKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBtdWx0aXBsZVZhbHVlRXZlbnQ7Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgY3VzdG9tVmFsdWVFdmVudDsKLQotCi0JcHVibGljIFByb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdDEgPSBuZXcgVGVzdFN1YmplY3QoImZvbyIsICJ0ZXN0IHN1YmplY3QgMSIpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gKHRoaXMuc3ViamVjdDEpOwotCQl0aGlzLmFhMSA9IHRoaXMuYnVpbGRBc3BlY3RBZGFwdGVyKHRoaXMuc3ViamVjdEhvbGRlcjEpOwotCQl0aGlzLmxpc3RlbmVyMSA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmFhMS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0KLQkJdGhpcy5zdWJqZWN0MiA9IG5ldyBUZXN0U3ViamVjdCgiYmFyIiwgInRlc3Qgc3ViamVjdCAyIik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4gYnVpbGRBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPihzdWJqZWN0SG9sZGVyLCBUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQkvLyB0aGlzIGlzIG5vdCBhIGFzcGVjdCBhZGFwdGVyIC0gdGhlIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIGFzcGVjdCBuYW1lCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMucHJvcGVydHlOYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSBpZiAodGhpcy5wcm9wZXJ0eU5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OX1BST1BFUlRZKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5wcm9wZXJ0eU5hbWVzWzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodGhpcy5wcm9wZXJ0eU5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJCX0gZWxzZSBpZiAodGhpcy5wcm9wZXJ0eU5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OX1BST1BFUlRZKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXREZXNjcmlwdGlvbih2YWx1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMucHJvcGVydHlOYW1lc1swXSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgdmFsdWUxQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5ldmVudDEgPSBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50MS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5ldmVudDEuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5ldmVudDEuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxLmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDEpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQxLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuZXZlbnQxLmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5zZXROYW1lKCJiYXoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50MS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5ldmVudDEuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5ldmVudDEuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdDEuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50MS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5ldmVudDEuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3QxLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQxLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuZXZlbnQxLmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnN1YmplY3QxLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zdWJqZWN0MS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYWExLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmFhMS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYWExLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0Mik7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmFhMS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJdGhpcy5hYTEuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuc3ViamVjdDEuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkpOwotCQl0aGlzLmFhMS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkpOwotCQl0aGlzLmFhMS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVBc3BlY3RBZGFwdGVyKCkgewotCQlUZXN0U3ViamVjdCB0ZXN0U3ViamVjdCA9IG5ldyBUZXN0U3ViamVjdCgiZnJlZCIsICJodXNiYW5kIik7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiB0ZXN0U3ViamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+KHRlc3RTdWJqZWN0KTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXN0QUEgPSB0aGlzLmJ1aWxkTXVsdGlwbGVBc3BlY3RBZGFwdGVyKHRlc3RTdWJqZWN0SG9sZGVyKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0ZXN0TGlzdGVuZXIgPSB0aGlzLmJ1aWxkTXVsdGlwbGVWYWx1ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRlc3RBQS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGVzdExpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkOmh1c2JhbmQiLCB0ZXN0QUEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQgPSBudWxsOwotCQl0ZXN0U3ViamVjdC5zZXROYW1lKCJ3aWxtYSIpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hOmh1c2JhbmQiLCB0ZXN0QUEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZDpodXNiYW5kIiwgdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygid2lsbWE6aHVzYmFuZCIsIHRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCi0JCXRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50ID0gbnVsbDsKLQkJdGVzdFN1YmplY3Quc2V0RGVzY3JpcHRpb24oIndpZmUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYTp3aWZlIiwgdGVzdEFBLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hOmh1c2JhbmQiLCB0aGlzLm11bHRpcGxlVmFsdWVFdmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYTp3aWZlIiwgdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTXVsdGlwbGVBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPihzdWJqZWN0SG9sZGVyLCBUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZLCBUZXN0U3ViamVjdC5ERVNDUklQVElPTl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpICsgIjoiICsgdGhpcy5zdWJqZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTXVsdGlwbGVWYWx1ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy5tdWx0aXBsZVZhbHVlQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIG11bHRpcGxlVmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLm11bHRpcGxlVmFsdWVFdmVudCA9IGU7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBhIGJ1ZyB3aGVyZSB3ZSB3b3VsZCBjYWxsICNidWlsZFZhbHVlKCkgaW4KLQkgKiAjZW5nYWdlTm9uTnVsbFN1YmplY3QoKSwgd2hlbiB3ZSBuZWVkZWQgdG8gY2FsbAotCSAqIGl0IGluICNlbmdhZ2VTdWJqZWN0KCksIHNvIHRoZSBjYWNoZWQgdmFsdWUgd291bGQKLQkgKiBiZSByZWJ1aWx0IHdoZW4gdGhlIHRoaXMuc3ViamVjdCB3YXMgc2V0IHRvIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQnVpbGRWYWx1ZVdpdGhOdWxsU3ViamVjdCgpIHsKLQkJVGVzdFN1YmplY3QgY3VzdG9tU3ViamVjdCA9IG5ldyBUZXN0U3ViamVjdCgiZnJlZCIsICJsYWJvcmVyIik7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBjdXN0b21TdWJqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4oY3VzdG9tU3ViamVjdCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gY3VzdG9tQUEgPSB0aGlzLmJ1aWxkQ3VzdG9tQXNwZWN0QWRhcHRlcihjdXN0b21TdWJqZWN0SG9sZGVyKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjdXN0b21MaXN0ZW5lciA9IHRoaXMuYnVpbGRDdXN0b21WYWx1ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCWN1c3RvbUFBLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBjdXN0b21MaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIGN1c3RvbUFBLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuY3VzdG9tVmFsdWVFdmVudCA9IG51bGw7Ci0JCWN1c3RvbVN1YmplY3Quc2V0TmFtZSgid2lsbWEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYSIsIGN1c3RvbUFBLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCB0aGlzLmN1c3RvbVZhbHVlRXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygid2lsbWEiLCB0aGlzLmN1c3RvbVZhbHVlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0KLQkJdGhpcy5jdXN0b21WYWx1ZUV2ZW50ID0gbnVsbDsKLQkJY3VzdG9tU3ViamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGhpcyB3b3VsZCBmYWlsIC0gdGhlIHZhbHVlIHdvdWxkIGJlIG51bGwuLi4KLQkJYXNzZXJ0RXF1YWxzKCI8dW5uYW1lZD4iLCBjdXN0b21BQS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYSIsIHRoaXMuY3VzdG9tVmFsdWVFdmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCI8dW5uYW1lZD4iLCB0aGlzLmN1c3RvbVZhbHVlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ3VzdG9tQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4oc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWUoKSB7Ci0JCQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyAiPHVubmFtZWQ+IiA6IHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ3VzdG9tVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVByb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMuY3VzdG9tVmFsdWVDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgY3VzdG9tVmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmN1c3RvbVZhbHVlRXZlbnQgPSBlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBjbGFzcyBUZXN0U3ViamVjdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fUFJPUEVSVFkgPSAiZGVzY3JpcHRpb24iOwotCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMuZGVzY3JpcHRpb247Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVTQ1JJUFRJT05fUFJPUEVSVFksIG9sZCwgZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGJmODdjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYWRhcHRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZFZhbHVlSG9sZGVyOwotCi0JcHVibGljIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy53cmFwcGVkVmFsdWVIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxTdHJpbmc+KHRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlKCkgewotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX07Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFkYXB0ZXJDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSGFzaEJhZzxTdHJpbmc+KCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGFwdGVyQ29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCUNvb3JkaW5hdGVkQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHN5bmNoQ29sbGVjdGlvbik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHN5bmNoQ29sbGVjdGlvbik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoc3luY2hDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkVG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRGcm9tRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5VG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzcyAqKioqKioqKioqCi0JCi0Jc3RhdGljIGNsYXNzIFRlc3RMaXN0ZW5lciBpbXBsZW1lbnRzIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjhiZDNiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWRhcHRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZFZhbHVlSG9sZGVyOwotCi0JcHVibGljIFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy53cmFwcGVkVmFsdWVIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRMaXN0KCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3QobmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxTdHJpbmc+KHRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlMaXN0PFN0cmluZz4gYWRhcHRlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkTGlzdCgpLCBhZGFwdGVyTGlzdCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckxpc3QuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnQoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hZGFwdGVyLmdldCgwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkxKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlPYmplY3RbXSBhcnJheSA9IHRoaXMuYWRhcHRlci50b0FycmF5KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXJyYXlbMF0pOwotCQlhc3NlcnRFcXVhbHMoMSwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheTIoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSk7Ci0JCU9iamVjdFtdIGFycmF5ID0gdGhpcy5hZGFwdGVyLnRvQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWUoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX07Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlMaXN0PFN0cmluZz4gYWRhcHRlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkTGlzdCgpLCBhZGFwdGVyTGlzdCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckxpc3QuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIGFkYXB0ZXJMaXN0KTsKLQotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWRhcHRlckxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZExpc3QoKSwgYWRhcHRlckxpc3QpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFkYXB0ZXJMaXN0Lml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKHN5bmNoTGlzdCk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZFRvRW1wdHkoKSB7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZEZyb21FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZW1DaGFuZ2VkKCkgewotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqTGlzdC5nZXRNb2RlbCgpLmdldEVsZW1lbnRBdCgwKSk7Ci0JCQotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygxLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgakxpc3QuZ2V0TW9kZWwoKS5nZXRFbGVtZW50QXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRGcm9tRW1wdHlUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkpOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgotCQotCXN0YXRpYyBjbGFzcyBUZXN0TGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMmVkNDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBiYWdIb2xkZXI7Ci0JQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGJhZ0V2ZW50OwotCVN0cmluZyBiYWdFdmVudFR5cGU7Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc2V0SG9sZGVyOwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBzZXRFdmVudDsKLQlTdHJpbmcgc2V0RXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERCA9ICJhZGQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFID0gImNoYW5nZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSID0gImNsZWFyIjsKLQotCQotCXB1YmxpYyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuYmFnSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZEJhZygpKTsKLQkJdGhpcy5zZXRIb2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkU2V0KCkpOwotCX0KLQotCXByaXZhdGUgQmFnPFN0cmluZz4gYnVpbGRCYWcoKSB7Ci0JCUJhZzxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJdGhpcy5hZGRJdGVtc1RvKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTZXQ8U3RyaW5nPiBidWlsZFNldCgpIHsKLQkJU2V0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQl0aGlzLmFkZEl0ZW1zVG8ocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSXRlbXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQljLmFkZCgiZm9vIik7Ci0JCWMuYWRkKCJiYXIiKTsKLQkJYy5hZGQoImJheiIpOwotCX0KLQotCXByaXZhdGUgQmFnPFN0cmluZz4gYnVpbGRBZGRJdGVtcygpIHsKLQkJQmFnPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJqb28iKTsKLQkJcmVzdWx0LmFkZCgiamFyIik7Ci0JCXJlc3VsdC5hZGQoImpheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQmFnPFN0cmluZz4gYnVpbGRSZW1vdmVJdGVtcygpIHsKLQkJQmFnPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRCYWcoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJhZ0hvbGRlci5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU2V0KCksIENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5zZXRIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZEJhZygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5iYWdIb2xkZXIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNldCgpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5zZXRIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBiYWdIb2xkZXJDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuYmFnSG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZXRIb2xkZXJDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBiYWdIb2xkZXJDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJhZ0hvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNldEhvbGRlckNvbnRhaW5zQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYmFnSG9sZGVyQ29udGFpbnNBbnkoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZyA9IENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5iYWdIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IGl0ZW1zKSB7Ci0JCQlpZiAoYmFnLmNvbnRhaW5zKHN0cmluZykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNldEhvbGRlckNvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlTZXQ8U3RyaW5nPiBzZXQgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCkpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBpdGVtcykgewotCQkJaWYgKHNldC5jb250YWlucyhzdHJpbmcpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImpvbyIpKTsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKCJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJqb28iKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucyhudWxsKSk7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqb28iKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiam9vIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLnNldEhvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkSXRlbXMoKSkpOwotCQl0aGlzLmJhZ0hvbGRlci5hZGRBbGwodGhpcy5idWlsZEFkZEl0ZW1zKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnNBbGwodGhpcy5idWlsZEFkZEl0ZW1zKCkpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zQW55KHRoaXMuYnVpbGRBZGRJdGVtcygpKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZEFsbCh0aGlzLmJ1aWxkQWRkSXRlbXMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWluc0FsbCh0aGlzLmJ1aWxkQWRkSXRlbXMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucygiYmFyIikpOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0KLQkJdGhpcy5iYWdIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMobnVsbCkpOwotCi0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiYmFyIikpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0KLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGwoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWluc0FsbCh0aGlzLmJ1aWxkUmVtb3ZlSXRlbXMoKSkpOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmVBbGwodGhpcy5idWlsZFJlbW92ZUl0ZW1zKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zQW55KHRoaXMuYnVpbGRSZW1vdmVJdGVtcygpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zQWxsKHRoaXMuYnVpbGRSZW1vdmVJdGVtcygpKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZUFsbCh0aGlzLmJ1aWxkUmVtb3ZlSXRlbXMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnNBbnkodGhpcy5idWlsZFJlbW92ZUl0ZW1zKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29sbGVjdGlvbigpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImphciIpKTsKLQkJdGhpcy5iYWdIb2xkZXIuc2V0Q29sbGVjdGlvbih0aGlzLmJ1aWxkQWRkSXRlbXMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJqYXIiKSk7Ci0KLQkJdGhpcy5iYWdIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMobnVsbCkpOwotCi0JCXRoaXMuYmFnSG9sZGVyLnNldENvbGxlY3Rpb24obmV3IEhhc2hCYWc8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucygiamFyIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiYmFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqYXIiKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLnNldENvbGxlY3Rpb24odGhpcy5idWlsZEFkZEl0ZW1zKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiamFyIikpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQotCQl0aGlzLnNldEhvbGRlci5zZXRDb2xsZWN0aW9uKG5ldyBIYXNoQmFnPFN0cmluZz4oKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMoImphciIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZTEoKSB7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkQmFnTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5QmFnQ2hhbmdlKCk7Ci0KLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTZXRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlTZXRDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZTIoKSB7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRCYWdMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlCYWdDaGFuZ2UoKTsKLQotCQl0aGlzLnNldEhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkU2V0TGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5U2V0Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUJhZ0NoYW5nZSgpIHsKLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChBREQsICJmb28iKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCwgImZvbyIpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQURELCAiam9vIik7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKG51bGwpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCwgbnVsbCk7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKG51bGwpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCwgbnVsbCk7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlKCJqb28iKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChSRU1PVkUsICJqb28iKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoUkVNT1ZFLCBudWxsKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5zZXRDb2xsZWN0aW9uKHRoaXMuYnVpbGRCYWcoKSk7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQ0hBTkdFKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5hZGRBbGwodGhpcy5idWlsZEJhZygpKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChBREQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZEJhZygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYmFnRXZlbnQuaXRlbXMoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXRDaGFuZ2UoKSB7Ci0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiZm9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudFR5cGUpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMudmVyaWZ5U2V0RXZlbnQoQURELCAiam9vIik7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKCJqb28iKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50VHlwZSk7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQl0aGlzLnZlcmlmeVNldEV2ZW50KEFERCwgbnVsbCk7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnRUeXBlKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUoImpvbyIpOwotCQl0aGlzLnZlcmlmeVNldEV2ZW50KFJFTU9WRSwgImpvbyIpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZSgiam9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudFR5cGUpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlTZXRFdmVudChSRU1PVkUsIG51bGwpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLnNldENvbGxlY3Rpb24odGhpcy5idWlsZFNldCgpKTsKLQkJdGhpcy52ZXJpZnlTZXRFdmVudChDSEFOR0UpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZEFsbCh0aGlzLmJ1aWxkU2V0KCkpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnRUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZEJhZ0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnRUeXBlID0gQUREOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5iYWdFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5iYWdFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5iYWdFdmVudFR5cGUgPSBDTEVBUjsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnRUeXBlID0gQ0hBTkdFOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5iYWdFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRTZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50VHlwZSA9IEFERDsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50VHlwZSA9IENIQU5HRTsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlCYWdFdmVudChTdHJpbmcgZXZlbnRUeXBlKSB7Ci0JCWFzc2VydEVxdWFscyhldmVudFR5cGUsIHRoaXMuYmFnRXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFnSG9sZGVyLCB0aGlzLmJhZ0V2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5iYWdFdmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5QmFnRXZlbnQoU3RyaW5nIGV2ZW50VHlwZSwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChldmVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHMoaXRlbSwgdGhpcy5iYWdFdmVudC5pdGVtcygpLm5leHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNldEV2ZW50KFN0cmluZyBldmVudFR5cGUpIHsKLQkJYXNzZXJ0RXF1YWxzKGV2ZW50VHlwZSwgdGhpcy5zZXRFdmVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zZXRIb2xkZXIsIHRoaXMuc2V0RXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLnNldEV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXRFdmVudChTdHJpbmcgZXZlbnRUeXBlLCBPYmplY3QgaXRlbSkgewotCQl0aGlzLnZlcmlmeVNldEV2ZW50KGV2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtLCB0aGlzLnNldEV2ZW50Lml0ZW1zKCkubmV4dCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZjU0YzEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyOwotCUxpc3RDaGFuZ2VFdmVudCBldmVudDsKLQlTdHJpbmcgZXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERCA9ICJhZGQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRSA9ICJyZXBsYWNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRSA9ICJtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVIgPSAiY2xlYXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0UgPSAiY2hhbmdlIjsKLQotCQotCXB1YmxpYyBTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJlc3VsdC5hZGQoImJheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQWRkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJqb28iKTsKLQkJcmVzdWx0LmFkZCgiamFyIik7Ci0JCXJlc3VsdC5hZGQoImpheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotLy8JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRSZW1vdmVMaXN0KCkgewotLy8JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLS8vCQlyZXN1bHQuYWRkKCJmb28iKTsKLS8vCQlyZXN1bHQuYWRkKCJiYXIiKTsKLS8vCQlyZXR1cm4gcmVzdWx0OwotLy8JfQotLy8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvckludCgpIHsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYnVpbGRMaXN0KCkubGlzdEl0ZXJhdG9yKDEpKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigxKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKS5zaXplKCksIHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsaXN0Q29udGFpbnMoT2JqZWN0IGl0ZW0pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsaXN0Q29udGFpbnNBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDb250YWluc0FueShDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJU2V0PFN0cmluZz4gc2V0ID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBpdGVtcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChzZXQuY29udGFpbnMoc3RyZWFtLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoImpvbyIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMoImpvbyIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRPYmplY3QoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKCJqb28iKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMiwgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKCJqb28iKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDAsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnNBbnkodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKHRoaXMuYnVpbGRBZGRMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zQWxsKHRoaXMuYnVpbGRBZGRMaXN0KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50Q29sbGVjdGlvbigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnNBbnkodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDIsIHRoaXMuYnVpbGRBZGRMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zQWxsKHRoaXMuYnVpbGRBZGRMaXN0KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5pc0VtcHR5KCkpOwotCQl0aGlzLmxpc3RIb2xkZXIuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RIb2xkZXIuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNPYmplY3QoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0SG9sZGVyLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5jb250YWlucygiam9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCJmb28iKTsKLQkJYy5hZGQoImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdEhvbGRlci5jb250YWluc0FsbChjKSk7Ci0KLQkJYy5hZGQoImpvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuY29udGFpbnNBbGwoYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCWFzc2VydEVxdWFscyhuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdCgpKSwgdGhpcy5saXN0SG9sZGVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmVxdWFscyhuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkQWRkTGlzdCgpKSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuZXF1YWxzKHRoaXMuYnVpbGRMaXN0KCkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmVxdWFscyhuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEludCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmxpc3RIb2xkZXIuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmxpc3RIb2xkZXIuZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmxpc3RIb2xkZXIuZ2V0KDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCWFzc2VydEVxdWFscyhuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdCgpKS5oYXNoQ29kZSgpLCB0aGlzLmxpc3RIb2xkZXIuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZPYmplY3QoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmxpc3RIb2xkZXIuaW5kZXhPZigiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5saXN0SG9sZGVyLmluZGV4T2YoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMubGlzdEhvbGRlci5pbmRleE9mKCJiYXoiKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgdGhpcy5saXN0SG9sZGVyLmluZGV4T2YoImpvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZPYmplY3QoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmxpc3RIb2xkZXIubGFzdEluZGV4T2YoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMubGlzdEhvbGRlci5sYXN0SW5kZXhPZigiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5saXN0SG9sZGVyLmxhc3RJbmRleE9mKCJiYXoiKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgdGhpcy5saXN0SG9sZGVyLmxhc3RJbmRleE9mKCJqb28iKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmxpc3RIb2xkZXIubGFzdEluZGV4T2YoImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmlzRW1wdHkoKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5jbGVhcigpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdEhvbGRlci5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMoImJhciIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSh0aGlzLmJ1aWxkTGlzdCgpLmluZGV4T2YoImJhciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoImJhciIpKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCW5ld0xpc3QuYWRkKCJqb28iKTsKLQkJbmV3TGlzdC5hZGQoImphciIpOwotCQluZXdMaXN0LmFkZCgiamF6Iik7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiYmFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiamFyIikpOwotCQl0aGlzLmxpc3RIb2xkZXIuc2V0TGlzdChuZXdMaXN0KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiamFyIikpOwotCi0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLnNldExpc3QobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiamFyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlMSgpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlMigpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdENoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgxLCAiam9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQURELCAxLCAiam9vIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgxLCBudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQsIDEsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoMSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVNT1ZFLCAxLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFTU9WRSwgMSwgImpvbyIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5zZXRMaXN0KHRoaXMuYnVpbGRMaXN0KCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KENIQU5HRSk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZEFsbCgwLCB0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5ldmVudC5pdGVtcygpKSk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnNldCgwLCAiam9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVQTEFDRSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmV2ZW50Lml0ZW1zKCksICJmb28iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZXZlbnQuaXRlbXMoKSwgImpvbyIpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQUREOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFUExBQ0U7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gTU9WRTsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENIQU5HRTsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChTdHJpbmcgZSkgewotCQlhc3NlcnRFcXVhbHMoZSwgdGhpcy5ldmVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5saXN0SG9sZGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50LmdldExpc3ROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChTdHJpbmcgZSwgaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQl0aGlzLnZlcmlmeUV2ZW50KGUpOwotCQlhc3NlcnRFcXVhbHMoaW5kZXgsIHRoaXMuZXZlbnQuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtLCB0aGlzLmV2ZW50Lml0ZW1zKCkubmV4dCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZiZWEyMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG9iamVjdEhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCi0JCi0JcHVibGljIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCJmb28iKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KCJmb28iLCAiYmFyIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KCJiYXIiLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KG51bGwsICJiYXoiKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHModGhpcy5vYmplY3RIb2xkZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCB0aGlzLmV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIHRoaXMuZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NjdkMjIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJldmVyc2VDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPiBhZGFwdGVyOwotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbkhvbGRlcjsKLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbjsKLQotCQotCXB1YmxpYyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbik7Ci0JCXRoaXMuYWRhcHRlciA9IG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3QoQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGVjdGVkLCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGFjdHVhbCkgewotCQl0aGlzLnZlcmlmeUxpc3QoZXhwZWN0ZWQsIGFjdHVhbCwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3QoQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGVjdGVkLCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGFjdHVhbCwgQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXBhcmF0b3IpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHNvcnRlZFNldCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oY29tcGFyYXRvcik7Ci0JCXNvcnRlZFNldC5hZGRBbGwoZXhwZWN0ZWQpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHNvcnRlZFNldCk7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWxMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoYWN0dWFsLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRMaXN0LCBhY3R1YWxMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5hZGFwdGVyLnNpemUoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtKCkgewotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiZm9vIikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgdGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHN5bmNoTGlzdC5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBzeW5jaENvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtKCkgewotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiamF6Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNoKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImpheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy53cmFwcGVkQ29sbGVjdGlvbi5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb21wYXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiZm9vIikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgdGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHN5bmNoTGlzdC5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBzeW5jaENvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5zZXRDb21wYXJhdG9yKG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgdGhpcy5hZGFwdGVyLCBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHN5bmNoTGlzdC5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBzeW5jaENvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoc3luY2hMaXN0KTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JY2xhc3MgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4MzllMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gQ09MTEVDVElPTiA9IGJ1aWxkQ29sbGVjdGlvbigpOwotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlcjsKLQotCi0JcHVibGljIFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oQ09MTEVDVElPTik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKGJ1aWxkQ29sbGVjdGlvbigpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscyhidWlsZENvbGxlY3Rpb24oKS5zaXplKCksIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkZDllZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0xpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFN0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gTElTVCA9IGJ1aWxkTGlzdCgpOwotCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiZm9vIik7Ci0JCXJlc3VsdC5hZGQoImJhciIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyOwotCi0KLQlwdWJsaWMgU3RhdGljTGlzdFZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSBuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8U3RyaW5nPihMSVNUKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gYnVpbGRMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5saXN0SG9sZGVyLnNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0KGkpLCB0aGlzLmxpc3RIb2xkZXIuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKGJ1aWxkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKGJ1aWxkTGlzdCgpLnNpemUoKSwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1ZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5NGU3MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1ZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgU3RhdGljVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gb2JqZWN0SG9sZGVyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IE9CSkVDVF9IT0xERVIgPSBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oImZvbyIpOwotCi0JCi0JcHVibGljIFN0YXRpY1ZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IE9CSkVDVF9IT0xERVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5vYmplY3RIb2xkZXIudG9TdHJpbmcoKS5pbmRleE9mKCJmb28iKSA+PSAwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNDc4NTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gdHJhbnNmb3JtZWRMaXN0SG9sZGVyOwotCUxpc3RDaGFuZ2VFdmVudCBldmVudDsKLQlTdHJpbmcgZXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERCA9ICJhZGQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRSA9ICJyZXBsYWNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRSA9ICJtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVIgPSAiY2xlYXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0UgPSAiY2hhbmdlIjsKLQotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWVkTGlzdEhvbGRlcih0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJlc3VsdC5hZGQoImJheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZWRMaXN0KCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gdHJhbnNmb3JtKExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4obGlzdC5zaXplKCkpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBsaXN0KSB7Ci0JCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCQlyZXN1bHQuYWRkKG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQuYWRkKHN0cmluZy50b1VwcGVyQ2FzZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQWRkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJqb28iKTsKLQkJcmVzdWx0LmFkZCgiamFyIik7Ci0JCXJlc3VsdC5hZGQoImpheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZWRBZGRMaXN0KCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5idWlsZEFkZExpc3QoKSk7Ci0JfQotCi0vLwlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFJlbW92ZUxpc3QoKSB7Ci0vLwkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotLy8JCXJlc3VsdC5hZGQoImZvbyIpOwotLy8JCXJlc3VsdC5hZGQoImJhciIpOwotLy8JCXJldHVybiByZXN1bHQ7Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lZFJlbW92ZUxpc3QoKSB7Ci0vLwkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMuYnVpbGRSZW1vdmVMaXN0KCkpOwotLy8JfQotLy8KLQlMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZWRMaXN0SG9sZGVyKExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nLCBTdHJpbmc+KGx2bSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybUl0ZW0oU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gKHMgPT0gbnVsbCkgPyBudWxsIDogcy50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFRyYW5zZm9ybWVkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWVzKCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRMaXN0KCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSwgaXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHRyYW5zZm9ybWVkTGlzdENvbnRhaW5zQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHJhbnNmb3JtZWRMaXN0Q29udGFpbnNBbnkoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCUxpc3Q8U3RyaW5nPiB0cmFuc2Zvcm1lZExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHRyYW5zZm9ybWVkTGlzdC5jb250YWlucyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKCJKT08iKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMiwgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMoIkpPTyIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgwLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zQW55KHRoaXMuYnVpbGRUcmFuc2Zvcm1lZEFkZExpc3QoKSkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDIsIHRoaXMuYnVpbGRBZGRMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnNBbGwodGhpcy5idWlsZFRyYW5zZm9ybWVkQWRkTGlzdCgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKCJCQVIiKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUodGhpcy5idWlsZExpc3QoKS5pbmRleE9mKCJiYXIiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMoIkJBUiIpKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZUdlbmVyaWMoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlTmFtZWQoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdENoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgxLCAiam9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQURELCAxLCAiSk9PIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgxLCBudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQsIDEsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoMSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVNT1ZFLCAxLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFTU9WRSwgMSwgIkpPTyIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoMCwgdGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQUREKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRUcmFuc2Zvcm1lZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5ldmVudC5pdGVtcygpKSk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnNldCgwLCAiam9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVQTEFDRSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmV2ZW50Lml0ZW1zKCksICJGT08iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZXZlbnQuaXRlbXMoKSwgIkpPTyIpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQUREOwotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFUExBQ0U7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gTU9WRTsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENIQU5HRTsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChTdHJpbmcgdHlwZSkgewotCQlhc3NlcnRFcXVhbHModHlwZSwgdGhpcy5ldmVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHModGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyB0eXBlLCBpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodHlwZSk7Ci0JCWFzc2VydEVxdWFscyhpbmRleCwgdGhpcy5ldmVudC5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW0sIHRoaXMuZXZlbnQuaXRlbXMoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCS8qCi0JCSAqIGFkZGluZyBsaXN0ZW5lcnMgdG8gdGhlIHRyYW5zZm9ybWVkIGxpc3Qgd2lsbCBjYXVzZSBsaXN0ZW5lcnMKLQkJICogdG8gYmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdDsKLQkJICogbGlrZXdpc2UsIHJlbW92aW5nIGxpc3RlbmVycyBmcm9tIHRoZSB0cmFuc2Zvcm1lZCBsaXN0IHdpbGwKLQkJICogY2F1c2UgbGlzdGVuZXJzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0Ci0JCSAqLwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBleGVjdXRlIHRoZSBzYW1lIHNldCBvZiB0ZXN0cyBhZ2FpbiwgYnV0IGJ5IHBhc3NpbmcgYSBUcmFuc2Zvcm1lciB0byB0aGUgYWRhcHRlcgotCSAqIChhcyBvcHBvc2VkIHRvIG92ZXJyaWRpbmcgI3RyYW5zZm9ybUl0ZW0oT2JqZWN0KSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRyYW5zZm9ybWVyVGVzdHMgZXh0ZW5kcyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzIHsKLQkJcHVibGljIFRyYW5zZm9ybWVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZWRMaXN0SG9sZGVyKExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtKSB7Ci0JCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZywgU3RyaW5nPihsdm0sIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQkJfQotCQlwcml2YXRlIFRyYW5zZm9ybWVyPFN0cmluZywgU3RyaW5nPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4oKSB7Ci0JCQkJcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHMpIHsKLQkJCQkJcmV0dXJuIChzID09IG51bGwpID8gbnVsbCA6IHMudG9VcHBlckNhc2UoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJkODdlOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmlkaVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBvYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IHRyYW5zZm9ybWF0aW9uRXZlbnQ7Ci0KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigiZm9vIik7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIgPSBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmcsIFN0cmluZz4odGhpcy5vYmplY3RIb2xkZXIsIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIEJpZGlUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBCaWRpVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+KCkgewotCQkJcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gKHMgPT0gbnVsbCkgPyBudWxsIDogcy50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQkJcHVibGljIFN0cmluZyByZXZlcnNlVHJhbnNmb3JtKFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIChzID09IG51bGwpID8gbnVsbCA6IHMudG9Mb3dlckNhc2UoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiZm9vIiwgImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkZPTyIsICJCQVIiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiYmFyIiwgImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkJBUiIsICJCQVoiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiYmF6IiwgIkZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkJBWiIsICJGT08iKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZPTyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiRm9vIiwgIkZPTyIpOwotCQlhc3NlcnROdWxsKHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiRk9PIiwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCAiRk9PIiwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgbnVsbCwgImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgbnVsbCwgIkJBUiIpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUsIE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVBc3BlY3RBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjU5NzUxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2hhaW5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyZWVBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRyZWVBc3BlY3RBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyMTsKLQlwcml2YXRlIFRyZWVBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBUZXN0Tm9kZVtdPiBhYTE7Ci0JcHJpdmF0ZSBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQxOwotCXByaXZhdGUgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMTsKLQotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDI7Ci0KLQkKLQlwdWJsaWMgVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN1YmplY3QxID0gbmV3IFRlc3RTdWJqZWN0KCk7Ci0JCVRlc3ROb2RlIHJvb3QsIG5vZGU7Ci0KLQkJcm9vdCA9IHRoaXMuc3ViamVjdDEuZ2V0Um9vdE5hbWVOb2RlKCk7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QxLmFkZE5hbWUocm9vdCwgIm5hbWUgMS4xIik7Ci0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZShub2RlLCAibmFtZSAxLjEuMSIpOwotCQl0aGlzLnN1YmplY3QxLmFkZE5hbWUobm9kZSwgIm5hbWUgMS4xLjIiKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDEuYWRkTmFtZShyb290LCAibmFtZSAxLjIiKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lKG5vZGUsICJuYW1lIDEuMi4xIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QxLmFkZE5hbWUocm9vdCwgIm5hbWUgMS4zIik7Ci0KLQkJcm9vdCA9IHRoaXMuc3ViamVjdDEuZ2V0Um9vdERlc2NyaXB0aW9uTm9kZSgpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbihyb290LCAiZGVzY3JpcHRpb24gMS4xIik7Ci0JCXRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb24obm9kZSwgImRlc2NyaXB0aW9uIDEuMS4xIik7Ci0JCXRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb24obm9kZSwgImRlc2NyaXB0aW9uIDEuMS4yIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9uKHJvb3QsICJkZXNjcmlwdGlvbiAxLjIiKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbihub2RlLCAiZGVzY3JpcHRpb24gMS4yLjEiKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb24ocm9vdCwgImRlc2NyaXB0aW9uIDEuMyIpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlcjEgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0Pih0aGlzLnN1YmplY3QxKTsKLQkJdGhpcy5hYTEgPSB0aGlzLmJ1aWxkQXNwZWN0QWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIxKTsKLQkJdGhpcy5saXN0ZW5lcjEgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQotCQl0aGlzLnN1YmplY3QyID0gbmV3IFRlc3RTdWJqZWN0KCk7Ci0KLQkJcm9vdCA9IHRoaXMuc3ViamVjdDIuZ2V0Um9vdE5hbWVOb2RlKCk7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QyLmFkZE5hbWUocm9vdCwgIm5hbWUgMi4xIik7Ci0JCXRoaXMuc3ViamVjdDIuYWRkTmFtZShub2RlLCAibmFtZSAyLjEuMSIpOwotCQl0aGlzLnN1YmplY3QyLmFkZE5hbWUobm9kZSwgIm5hbWUgMi4xLjIiKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDIuYWRkTmFtZShyb290LCAibmFtZSAyLjIiKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGROYW1lKG5vZGUsICJuYW1lIDIuMi4xIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QyLmFkZE5hbWUocm9vdCwgIm5hbWUgMi4zIik7Ci0KLQkJcm9vdCA9IHRoaXMuc3ViamVjdDIuZ2V0Um9vdERlc2NyaXB0aW9uTm9kZSgpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbihyb290LCAiZGVzY3JpcHRpb24gMi4xIik7Ci0JCXRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb24obm9kZSwgImRlc2NyaXB0aW9uIDIuMS4xIik7Ci0JCXRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb24obm9kZSwgImRlc2NyaXB0aW9uIDIuMS4yIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9uKHJvb3QsICJkZXNjcmlwdGlvbiAyLjIiKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbihub2RlLCAiZGVzY3JpcHRpb24gMi4yLjEiKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb24ocm9vdCwgImRlc2NyaXB0aW9uIDIuMyIpOwotCX0KLQotCXByaXZhdGUgVHJlZUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFRlc3ROb2RlW10+IGJ1aWxkQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmVlQXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgVGVzdE5vZGVbXT4oc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRVNfVFJFRSkgewotCQkJLy8gdGhpcyBpcyBub3QgYSB0eXBpY2FsIGFzcGVjdCBhZGFwdGVyIC0gdGhlIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIGFzcGVjdCBuYW1lCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxUZXN0Tm9kZVtdPiBub2Rlc18oKSB7Ci0JCQkJaWYgKHRoaXMudHJlZU5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX1RSRUUpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lUGF0aHMoKTsKLQkJCQl9Ci0JCQkJaWYgKHRoaXMudHJlZU5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19UUkVFKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZGVzY3JpcHRpb25QYXRocygpOwotCQkJCX0KLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy50cmVlTmFtZXNbMF0pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJCVRyZWVBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB2YWx1ZTFDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuZXZlbnQxID0gZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0Mik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLmV2ZW50MS5nZXRUcmVlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuZXZlbnQxLmdldFBhdGgoKS5sZW5ndGgpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy5ldmVudDEuZ2V0VHJlZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmV2ZW50MS5nZXRQYXRoKCkubGVuZ3RoKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QxKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoVHJlZVZhbHVlTW9kZWwuTk9ERVMsIHRoaXMuZXZlbnQxLmdldFRyZWVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5ldmVudDEuZ2V0UGF0aCgpLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVTdHJ1Y3R1cmVDaGFuZ2UoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkVHdvTmFtZXModGhpcy5zdWJqZWN0MS5nZXRSb290TmFtZU5vZGUoKSwgImphbSIsICJqYXoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoVHJlZVZhbHVlTW9kZWwuTk9ERVMsIHRoaXMuZXZlbnQxLmdldFRyZWVOYW1lKCkpOwotCQlPYmplY3RbXSBwYXRoID0gdGhpcy5ldmVudDEuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MS5nZXRSb290TmFtZU5vZGUoKSwgcGF0aFtwYXRoLmxlbmd0aCAtIDFdKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmNvbnRhaW5zTmFtZU5vZGUoImphbSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmNvbnRhaW5zTmFtZU5vZGUoImpheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZXMoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmNvbnZlcnRUb05hbWVzKHRoaXMuc3ViamVjdDEubmFtZVBhdGhzKCkpLCB0aGlzLmNvbnZlcnRUb05hbWVzKHRoaXMuYWExLm5vZGVzKCkpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBjb252ZXJ0VG9OYW1lcyhJdGVyYXRvcjxUZXN0Tm9kZVtdPiBuYW1lUGF0aHMpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJd2hpbGUgKG5hbWVQYXRocy5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdFtdIHBhdGggPSBuYW1lUGF0aHMubmV4dCgpOwotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc2IuYXBwZW5kKCdbJyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCQlzYi5hcHBlbmQoKChUZXN0Tm9kZSkgcGF0aFtpXSkuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoaSA8IHBhdGgubGVuZ3RoIC0gMSkgewotCQkJCQlzYi5hcHBlbmQoJzonKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoJ10nKTsKLQkJCXJlc3VsdC5hZGQoc2IudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVHJlZVZhbHVlTW9kZWwuTk9ERVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfVFJFRSkpOwotCQl0aGlzLmFhMS5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVHJlZVZhbHVlTW9kZWwuTk9ERVMsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX1RSRUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUcmVlVmFsdWVNb2RlbC5OT0RFUykpOwotCi0JCVRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUcmVlVmFsdWVNb2RlbC5OT0RFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19UUkVFKSk7Ci0JCXRoaXMuYWExLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfVFJFRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRyZWVWYWx1ZU1vZGVsLk5PREVTKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQkKLQlwcml2YXRlIGNsYXNzIFRlc3RTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgVGVzdE5vZGUgcm9vdE5hbWVOb2RlOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU19UUkVFID0gIm5hbWVzIjsKLQkJcHJpdmF0ZSBUZXN0Tm9kZSByb290RGVzY3JpcHRpb25Ob2RlOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTlNfVFJFRSA9ICJkZXNjcmlwdGlvbnMiOwotCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoKSB7Ci0JCQl0aGlzLnJvb3ROYW1lTm9kZSA9IG5ldyBUZXN0Tm9kZSgicm9vdCBuYW1lIik7Ci0JCQl0aGlzLnJvb3REZXNjcmlwdGlvbk5vZGUgPSBuZXcgVGVzdE5vZGUoInJvb3QgZGVzY3JpcHRpb24iKTsKLQkJfQotCQlwdWJsaWMgVGVzdE5vZGUgZ2V0Um9vdE5hbWVOb2RlKCkgewotCQkJcmV0dXJuIHRoaXMucm9vdE5hbWVOb2RlOwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0Tm9kZT4gbmFtZU5vZGVzKCkgewotCQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3I8VGVzdE5vZGU+KHRoaXMucm9vdE5hbWVOb2RlKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIEl0ZXJhdG9yPFRlc3ROb2RlPiBjaGlsZHJlbihUZXN0Tm9kZSBuZXh0KSB7Ci0JCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8VGVzdE5vZGVbXT4gbmFtZVBhdGhzKCkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFRlc3ROb2RlLCBUZXN0Tm9kZVtdPih0aGlzLm5hbWVOb2RlcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFRlc3ROb2RlW10gdHJhbnNmb3JtKFRlc3ROb2RlIG5leHQpIHsKLQkJCQkJcmV0dXJuIG5leHQucGF0aCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcHVibGljIFRlc3ROb2RlIGFkZE5hbWUoVGVzdE5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJVGVzdE5vZGUgY2hpbGQgPSBuZXcgVGVzdE5vZGUobmFtZSk7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQoY2hpbGQpOwotCQkJdGhpcy5maXJlTm9kZUFkZGVkKE5BTUVTX1RSRUUsIGNoaWxkLnBhdGgoKSk7Ci0JCQlyZXR1cm4gY2hpbGQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkVHdvTmFtZXMoVGVzdE5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQkJcGFyZW50LmFkZENoaWxkKG5ldyBUZXN0Tm9kZShuYW1lMSkpOwotCQkJcGFyZW50LmFkZENoaWxkKG5ldyBUZXN0Tm9kZShuYW1lMikpOwotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoTkFNRVNfVFJFRSwgcGFyZW50LnBhdGgoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTmFtZU5vZGUoVGVzdE5vZGUgbmFtZU5vZGUpIHsKLQkJCW5hbWVOb2RlLmdldFBhcmVudCgpLnJlbW92ZUNoaWxkKG5hbWVOb2RlKTsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKE5BTUVTX1RSRUUsIG5hbWVOb2RlLnBhdGgoKSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnNOYW1lTm9kZShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIHRoaXMubmFtZU5vZGUobmFtZSkgIT0gbnVsbDsKLQkJfQotCQlwdWJsaWMgVGVzdE5vZGUgbmFtZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCWZvciAoSXRlcmF0b3I8VGVzdE5vZGU+IHN0cmVhbSA9IHRoaXMubmFtZU5vZGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVRlc3ROb2RlIG5vZGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChub2RlLmdldFRleHQoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIFRlc3ROb2RlIGdldFJvb3REZXNjcmlwdGlvbk5vZGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5yb290RGVzY3JpcHRpb25Ob2RlOwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0Tm9kZT4gZGVzY3JpcHRpb25Ob2RlcygpIHsKLQkJCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPFRlc3ROb2RlPih0aGlzLnJvb3REZXNjcmlwdGlvbk5vZGUpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgSXRlcmF0b3I8VGVzdE5vZGU+IGNoaWxkcmVuKFRlc3ROb2RlIG5leHQpIHsKLQkJCQkJcmV0dXJuIG5leHQuY2hpbGRyZW4oKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0Tm9kZVtdPiBkZXNjcmlwdGlvblBhdGhzKCkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFRlc3ROb2RlLCBUZXN0Tm9kZVtdPih0aGlzLmRlc2NyaXB0aW9uTm9kZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBUZXN0Tm9kZVtdIHRyYW5zZm9ybShUZXN0Tm9kZSBuZXh0KSB7Ci0JCQkJCXJldHVybiBuZXh0LnBhdGgoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXB1YmxpYyBUZXN0Tm9kZSBhZGREZXNjcmlwdGlvbihUZXN0Tm9kZSBwYXJlbnQsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJVGVzdE5vZGUgY2hpbGQgPSBuZXcgVGVzdE5vZGUoZGVzY3JpcHRpb24pOwotCQkJcGFyZW50LmFkZENoaWxkKGNoaWxkKTsKLQkJCXRoaXMuZmlyZU5vZGVBZGRlZChERVNDUklQVElPTlNfVFJFRSwgY2hpbGQucGF0aCgpKTsKLQkJCXJldHVybiBjaGlsZDsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVEZXNjcmlwdGlvbk5vZGUoVGVzdE5vZGUgZGVzY3JpcHRpb25Ob2RlKSB7Ci0JCQlkZXNjcmlwdGlvbk5vZGUuZ2V0UGFyZW50KCkucmVtb3ZlQ2hpbGQoZGVzY3JpcHRpb25Ob2RlKTsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKERFU0NSSVBUSU9OU19UUkVFLCBkZXNjcmlwdGlvbk5vZGUucGF0aCgpKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0Rlc2NyaXB0aW9uTm9kZShTdHJpbmcgbmFtZSkgewotCQkJZm9yIChJdGVyYXRvcjxUZXN0Tm9kZT4gc3RyZWFtID0gdGhpcy5kZXNjcmlwdGlvbk5vZGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVRlc3ROb2RlIG5vZGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChub2RlLmdldFRleHQoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgVGVzdE5vZGUgewotCQlwcml2YXRlIGZpbmFsIFN0cmluZyB0ZXh0OwotCQlwcml2YXRlIFRlc3ROb2RlIHBhcmVudDsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFRlc3ROb2RlPiBjaGlsZHJlbjsKLQkKLQkJcHVibGljIFRlc3ROb2RlKFN0cmluZyB0ZXh0KSB7Ci0JCQl0aGlzLnRleHQgPSB0ZXh0OwotCQkJdGhpcy5jaGlsZHJlbiA9IG5ldyBIYXNoQmFnPFRlc3ROb2RlPigpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJCXJldHVybiB0aGlzLnRleHQ7Ci0JCX0KLQkJcHVibGljIFRlc3ROb2RlIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiB0aGlzLnBhcmVudDsKLQkJfQotCQlwcml2YXRlIHZvaWQgc2V0UGFyZW50KFRlc3ROb2RlIHBhcmVudCkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPFRlc3ROb2RlPiBjaGlsZHJlbigpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxUZXN0Tm9kZT4odGhpcy5jaGlsZHJlbik7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkQ2hpbGQoVGVzdE5vZGUgY2hpbGQpIHsKLQkJCXRoaXMuY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChUZXN0Tm9kZSBjaGlsZCkgewotCQkJdGhpcy5jaGlsZHJlbi5yZW1vdmUoY2hpbGQpOwotCQl9Ci0JCXB1YmxpYyBUZXN0Tm9kZVtdIHBhdGgoKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KHRoaXMuYnVpbGRBbnRpUGF0aCgpKS50b0FycmF5KG5ldyBUZXN0Tm9kZVswXSk7Ci0JCX0KLQkJcHJpdmF0ZSBJdGVyYXRvcjxUZXN0Tm9kZT4gYnVpbGRBbnRpUGF0aCgpIHsKLQkJCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxUZXN0Tm9kZT4odGhpcykgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBUZXN0Tm9kZSBuZXh0TGluayhUZXN0Tm9kZSBjdXJyZW50TGluaykgewotCQkJCQlyZXR1cm4gY3VycmVudExpbmsuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE5vZGUoIiArIHRoaXMudGV4dCArICIpIjsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjdiYWI2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5WYWx1ZUNvbGxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsganVuazsKLQlwcml2YXRlIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKdW5rPiBqdW5rSG9sZGVyOwotCXByaXZhdGUgVmFsdWVDb2xsZWN0aW9uQWRhcHRlcjxKdW5rPiBqdW5rSG9sZGVyMjsKLQotCi0JcHVibGljIFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmp1bmsgPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuanVua0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4odGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMiA9IG5ldyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyPEp1bms+KHRoaXMuanVua0hvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBwZWRQVk0oKSB7Ci0JCUp1bmsganVuazIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIHRoaXMuanVuaywganVuazIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVua0hvbGRlci5zZXRWYWx1ZShqdW5rMik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQWRkKCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsuYWRkU3R1ZmYoImJhciIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblJlbW92ZSgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMik7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rLnJlbW92ZVN0dWZmKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIExvY2FsTGlzdGVuZXIgaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLCBTdGF0ZUNoYW5nZUxpc3RlbmVyIHsKLQkJcHJpdmF0ZSBib29sZWFuIGV2ZW50UmVjZWl2ZWQgPSBmYWxzZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgc291cmNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBvbGRWYWx1ZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgbmV3VmFsdWU7Ci0JCUxvY2FsTGlzdGVuZXIoT2JqZWN0IHNvdXJjZSkgewotCQkJdGhpcyhzb3VyY2UsIG51bGwsIG51bGwpOwotCQl9Ci0JCUxvY2FsTGlzdGVuZXIoT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydE51bGwoZS5nZXRBc3BlY3ROYW1lKCkpOwotCQl9Ci0JCWJvb2xlYW4gZXZlbnRSZWNlaXZlZCgpIHsKLQkJCXJldHVybiB0aGlzLmV2ZW50UmVjZWl2ZWQ7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdHVmZjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUZGX0NPTExFQ1RJT04gPSAic3R1ZmYiOwotCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuc3R1ZmYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXRoaXMuc3R1ZmYuYWRkKHN0dWZmSXRlbSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgYWRkU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfQ09MTEVDVElPTik7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMuc3R1ZmYgKyAiKSI7Ci0JCX0KLQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlTGlzdEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTA1MGQ4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5WYWx1ZUxpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFZhbHVlTGlzdEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsganVuazsKLQlwcml2YXRlIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKdW5rPiBqdW5rSG9sZGVyOwotCXByaXZhdGUgVmFsdWVMaXN0QWRhcHRlcjxKdW5rPiBqdW5rSG9sZGVyMjsKLQotCi0JCi0JcHVibGljIFZhbHVlTGlzdEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmp1bmsgPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuanVua0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4odGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMiA9IG5ldyBWYWx1ZUxpc3RBZGFwdGVyPEp1bms+KHRoaXMuanVua0hvbGRlciwgSnVuay5TVFVGRl9MSVNUKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBwZWRQVk0oKSB7Ci0JCUp1bmsganVuazIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIHRoaXMuanVuaywganVuazIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVua0hvbGRlci5zZXRWYWx1ZShqdW5rMik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0QWRkKCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5hZGRTdHVmZigiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0UmVtb3ZlKCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5yZW1vdmVTdHVmZigiZm9vIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0UmVwbGFjZSgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsucmVwbGFjZVN0dWZmKCJmb28iLCAiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbExpc3RlbmVyIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgU3RhdGVDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBldmVudFJlY2VpdmVkID0gZmFsc2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IHNvdXJjZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG5ld1ZhbHVlOwotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UpIHsKLQkJCXRoaXMoc291cmNlLCBudWxsLCBudWxsKTsKLQkJfQotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5vbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnROdWxsKGUuZ2V0QXNwZWN0TmFtZSgpKTsKLQkJfQotCQlib29sZWFuIGV2ZW50UmVjZWl2ZWQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmVudFJlY2VpdmVkOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN0dWZmOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVRkZfTElTVCA9ICJzdHVmZiI7Ci0KLQkJcHVibGljIEp1bmsoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5zdHVmZiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJdGhpcy5zdHVmZi5hZGQoc3R1ZmZJdGVtKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBhZGRTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3Qoc3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9MSVNUKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3Qoc3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9MSVNUKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCByZXBsYWNlU3R1ZmYoU3RyaW5nIG9sZFN0dWZmSXRlbSwgU3RyaW5nIG5ld1N0dWZmSXRlbSkgewotCQkJdGhpcy5yZXBsYWNlSXRlbUluTGlzdChvbGRTdHVmZkl0ZW0sIG5ld1N0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfTElTVCk7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMuc3R1ZmYgKyAiKSI7Ci0JCX0KLQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVByb3BlcnR5QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyODMyYzhhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5WYWx1ZVByb3BlcnR5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBWYWx1ZVByb3BlcnR5QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBqdW5rOwotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+IGp1bmtIb2xkZXI7Ci0JcHJpdmF0ZSBWYWx1ZVByb3BlcnR5QWRhcHRlcjxKdW5rPiBqdW5rSG9sZGVyMjsKLQotCi0JcHVibGljIFZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qdW5rID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmp1bmtIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+KHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIgPSBuZXcgVmFsdWVQcm9wZXJ0eUFkYXB0ZXI8SnVuaz4odGhpcy5qdW5rSG9sZGVyLCBKdW5rLk5BTUVfUFJPUEVSVFkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlZFBWTSgpIHsKLQkJSnVuayBqdW5rMiA9IG5ldyBKdW5rKCJiYXIiKTsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgdGhpcy5qdW5rLCBqdW5rMik7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rSG9sZGVyLnNldFZhbHVlKGp1bmsyKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhKdW5rLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEp1bmsuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoSnVuay5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVByb3BlcnR5KCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIExvY2FsTGlzdGVuZXIgaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLCBTdGF0ZUNoYW5nZUxpc3RlbmVyIHsKLQkJcHJpdmF0ZSBib29sZWFuIGV2ZW50UmVjZWl2ZWQgPSBmYWxzZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgc291cmNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBvbGRWYWx1ZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgbmV3VmFsdWU7Ci0JCUxvY2FsTGlzdGVuZXIoT2JqZWN0IHNvdXJjZSkgewotCQkJdGhpcyhzb3VyY2UsIG51bGwsIG51bGwpOwotCQl9Ci0JCUxvY2FsTGlzdGVuZXIoT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydE51bGwoZS5nZXRBc3BlY3ROYW1lKCkpOwotCQl9Ci0JCWJvb2xlYW4gZXZlbnRSZWNlaXZlZCgpIHsKLQkJCXJldHVybiB0aGlzLmV2ZW50UmVjZWl2ZWQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkJcHVibGljIEp1bmsoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVN0YXRlQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkZmVlOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVTdGF0ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsganVuazsKLQlwcml2YXRlIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKdW5rPiBqdW5rSG9sZGVyOwotCXByaXZhdGUgVmFsdWVTdGF0ZUFkYXB0ZXI8SnVuaz4ganVua0hvbGRlcjI7Ci0KLQotCXB1YmxpYyBWYWx1ZVN0YXRlQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuanVuayA9IG5ldyBKdW5rKCJmb28iKTsKLQkJdGhpcy5qdW5rSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKdW5rPih0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyID0gbmV3IFZhbHVlU3RhdGVBZGFwdGVyPEp1bms+KHRoaXMuanVua0hvbGRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwcGVkUFZNKCkgewotCQlKdW5rIGp1bmsyID0gbmV3IEp1bmsoImJhciIpOwotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCB0aGlzLmp1bmssIGp1bmsyKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmtIb2xkZXIuc2V0VmFsdWUoanVuazIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmsuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlU3RhdGUoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbExpc3RlbmVyIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgU3RhdGVDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBldmVudFJlY2VpdmVkID0gZmFsc2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IHNvdXJjZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG5ld1ZhbHVlOwotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UpIHsKLQkJCXRoaXMoc291cmNlLCBudWxsLCBudWxsKTsKLQkJfQotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5vbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnROdWxsKGUuZ2V0QXNwZWN0TmFtZSgpKTsKLQkJfQotCQlib29sZWFuIGV2ZW50UmVjZWl2ZWQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmVudFJlY2VpdmVkOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9KcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0M2RhMDcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9KcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZjljYWUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotCi1pbXBvcnQgamF2YS51dGlsLnByZWZzLk5vZGVDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmcy5QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBQcmVmZXJlbmNlc1Rlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFByZWZlcmVuY2VzPiBub2RlSG9sZGVyOwotCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBwcmVmZXJlbmNlQWRhcHRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0JYm9vbGVhbiBsaXN0ZW5lclJlbW92ZWQgPSBmYWxzZTsKLQlQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgcHJlZmVyZW5jZUV2ZW50OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRSA9ICJmb28iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfVkFMVUUgPSAib3JpZ2luYWwgc3RyaW5nIHZhbHVlIjsKLQotCXB1YmxpYyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUUsIFNUUklOR19WQUxVRSk7Ci0KLQkJdGhpcy5ub2RlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4odGhpcy50ZXN0Tm9kZSk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIgPSBuZXcgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMubm9kZUhvbGRlciwgS0VZX05BTUUpOwotCQl0aGlzLmxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCWlmIChQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCAhPSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgdGhpcy5ldmVudDogIiArIGUpOwotCQkJCX0KLQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUUgPSAic29tZSBvdGhlciB2YWx1ZSI7Ci0JCVByZWZlcmVuY2VzIGFub3RoZXJOb2RlID0gdGhpcy5jbGFzc05vZGUubm9kZSgiYW5vdGhlciB0ZXN0IG5vZGUiKTsKLQkJYW5vdGhlck5vZGUucHV0KEtFWV9OQU1FLCBBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJdGhpcy5ub2RlSG9sZGVyLnNldFZhbHVlKGFub3RoZXJOb2RlKTsKLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKEFOT1RIRVJfU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBTk9USEVSX1NUUklOR19WQUxVRSwgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0Tm9kZSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQobnVsbCwgU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJlZmVyZW5jZUNoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUgKyBTVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSwgU1RSSU5HX1ZBTFVFICsgU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSArIFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFICsgU1RSSU5HX1ZBTFVFLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KG51bGwsIFNUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCAiPG1pc3NpbmcgcHJlZmVyZW5jZT4iKSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRSA9ICJzb21lIG90aGVyIHZhbHVlIjsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5zZXRWYWx1ZShBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhBTk9USEVSX1NUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFOT1RIRVJfU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgIjxtaXNzaW5nIHByZWZlcmVuY2U+IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFuZFJlQWRkUHJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCS8vIHJlbW92ZSB0aGUgcHJlZmVyZW5jZSBlbnRpcmVseS4uLgotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCWFzc2VydE51bGwodGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJLy8gLi4udGhlbiByZS1hZGQgaXQgd2l0aCB0aGUgc2FtZSBrZXkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgbnVsbCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KG51bGwsIFNUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyByZWJ1aWxkIHRoZSBhZGFwdGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlCi0JCVN0cmluZyBERUZBVUxUX1ZBTFVFID0gImRlZmF1bHQgdmFsdWUiOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlciA9IG5ldyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5ub2RlSG9sZGVyLCBLRVlfTkFNRSwgREVGQVVMVF9WQUxVRSk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCi0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCBudWxsKSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBwcmVmZXJlbmNlIGVudGlyZWx5Li4uCi0JCXRoaXMudGVzdE5vZGUucmVtb3ZlKEtFWV9OQU1FKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgbnVsbCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSwgREVGQVVMVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhERUZBVUxUX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCS8vIC4uLnRoZW4gcmUtYWRkIGl0IHdpdGggdGhlIHNhbWUga2V5Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChERUZBVUxUX1ZBTFVFLCBTVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSB0aGlzLmxpc3RlbmVyIHNvIHRoZSBhZGFwdGVyIG5vIGxvbmdlciBsaXN0ZW5zIHRvIHRoZSBwcmVmZXJlbmNlCi0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCi0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUgKyBTVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQkvLyBubyB0aGlzLmV2ZW50IHNob3VsZCBoYXZlIGJlZW4gZmlyZWQuLi4KLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJLy8gLi4uYW5kIHRoZSBhZGFwdGVyJ3MgdmFsdWUgc2hvdWxkIGJlIG51bGwKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCS8vIGFkZCB0aGUgdGhpcy5saXN0ZW5lciBzbyB0aGUgYWRhcHRlciBzeW5jaHMKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJQcmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBub2RlIGFuZCBjb252ZXJ0IGl0IHRvIGFuIGludGVnZXIKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0KLQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIgPSBuZXcgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPih0aGlzLm5vZGVIb2xkZXIsIEtFWV9OQU1FKTsKLQkJdGhpcy50ZXN0Tm9kZS5wdXRJbnQoS0VZX05BTUUsIDEyMyk7Ci0JCWludGVnZXJQcmVmZXJlbmNlQWRhcHRlciA9IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwuZm9ySW50ZWdlcih0aGlzLnRlc3ROb2RlLCBLRVlfTkFNRSwgMCk7Ci0JCWludGVnZXJQcmVmZXJlbmNlQWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMjMpLCBpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy50ZXN0Tm9kZS5wdXRJbnQoS0VZX05BTUUsIDI0Nik7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLCBuZXcgSW50ZWdlcigxMjMpLCBuZXcgSW50ZWdlcigyNDYpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDI0NiksIGludGVnZXJQcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLCBuZXcgSW50ZWdlcigyNDYpLCBuZXcgSW50ZWdlcigwKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudGVzdE5vZGUucHV0SW50KEtFWV9OQU1FLCAxMjMpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGludGVnZXJQcmVmZXJlbmNlQWRhcHRlciwgbmV3IEludGVnZXIoMCksIG5ldyBJbnRlZ2VyKDEyMykpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIzKSwgaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgYSBzaXR1YXRpb24gd2hlcmUKLQkgKiAtIHdlIGFyZSBsaXN0ZW5pbmcgdG8gdGhlIG5vZGUgd2hlbiBpdCBnZXRzIHJlbW92ZWQgZnJvbSB0aGUgcHJlZmVyZW5jZXMgInJlcG9zaXRvcnkiCi0JICogLSB3ZSBnZXQgbm90aWZpY2F0aW9uIHRoYXQgaXQgaGFzIGJlZW4gcmVtb3ZlZAotCSAqIC0gd2UgdHJ5IHRvIHJlbW92ZSBvdXIgdGhpcy5saXN0ZW5lcgotCSAqIC0gdGhlIG5vZGUgd2lsbCB0aHJvdyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gLSB0aGUgYWRhcHRlciBzaG91bGQgaGFuZGxlIGl0IE9LLi4uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCVByZWZlcmVuY2VzIHBhcmVudCA9IHRoaXMudGVzdE5vZGUucGFyZW50KCk7Ci0JCXBhcmVudC5hZGROb2RlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFBhcmVudE5vZGVDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmVOb2RlKCk7Ci0JCXRoaXMudGVzdE5vZGUuZmx1c2goKTsJCS8vIHRoaXMgc2VlbXMgdG8gYmUgcmVxdWlyZWQgZm9yIHRoZSB0aGlzLmV2ZW50IHRvIHRyaWdnZXIuLi4KLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMubGlzdGVuZXJSZW1vdmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHJpdmF0ZSBOb2RlQ2hhbmdlTGlzdGVuZXIgYnVpbGRQYXJlbnROb2RlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTm9kZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hpbGRBZGRlZChOb2RlQ2hhbmdlRXZlbnQgZSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgdGhpcy5ldmVudDogIiArIGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hpbGRSZW1vdmVkKE5vZGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUuZ2V0Q2hpbGQoKSA9PSBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy50ZXN0Tm9kZSkgewotCQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMubGlzdGVuZXIpOwotCQkJCQkvLyB0aGlzIGxpbmUgb2YgY29kZSB3aWxsIG5vdCBleGVjdXRlIGlmIHRoZSBsaW5lIGFib3ZlIHRyaWdnZXJzIGFuIGV4Y2VwdGlvbgotCQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5saXN0ZW5lclJlbW92ZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2FtZVZhbHVlKCkgewotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUV2ZW50KTsKLQkJdGhpcy50ZXN0Tm9kZS5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpKTsKLQotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUUgPSAic29tZSBvdGhlciB2YWx1ZSI7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuc2V0VmFsdWUoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFLCBBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5UHJlZmVyZW5jZUV2ZW50KEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQkvLyBub3cgc2V0IHRvICpzYW1lKiB2YWx1ZSAtIG5vdGhpbmcgc2hvdWxkIGhhcHBlbi4uLgotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcmVmZXJlbmNlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnNldFZhbHVlKEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2FtZVZhbHVlRm9yY2VQYXNzVGhyb3VnaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUV2ZW50KTsKLQotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlciA9IG5ldyBBbHdheXNVcGRhdGVQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5ub2RlSG9sZGVyLCBLRVlfTkFNRSk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCi0JCXRoaXMudGVzdE5vZGUuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0KLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFID0gInNvbWUgb3RoZXIgdmFsdWUiOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnNldFZhbHVlKEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeVByZWZlcmVuY2VFdmVudChBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJLy8gbm93IHNldCB0byAqc2FtZSogdmFsdWUgLSBvbmx5IG9uZSB0aGlzLmV2ZW50IHNob3VsZCBmaXJlCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnByZWZlcmVuY2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuc2V0VmFsdWUoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5UHJlZmVyZW5jZUV2ZW50KEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBidWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKFByZWZlcmVuY2VDaGFuZ2VFdmVudCBldnQpIHsKLQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5wcmVmZXJlbmNlRXZlbnQgPSBldnQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KE1vZGVsIHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIHRoaXMuZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy5ldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcmVmZXJlbmNlRXZlbnQoT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5wcmVmZXJlbmNlRXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0Tm9kZSwgdGhpcy5wcmVmZXJlbmNlRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoS0VZX05BTUUsIHRoaXMucHJlZmVyZW5jZUV2ZW50LmdldEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCB0aGlzLnByZWZlcmVuY2VFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgIjxtaXNzaW5nIHByZWZlcmVuY2U+IikpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBub2RlSGFzQW55UHJlZkxpc3RlbmVycyhQcmVmZXJlbmNlcyBub2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyW10gcHJlZkxpc3RlbmVycyA9IChQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXJbXSkgQ2xhc3NUb29scy5maWVsZFZhbHVlKG5vZGUsICJwcmVmTGlzdGVuZXJzIik7Ci0JCXJldHVybiBwcmVmTGlzdGVuZXJzLmxlbmd0aCA+IDA7Ci0JfQotCi0KLQkvKioKLQkgKiBVc2UgdGhpcyBhZGFwdGVyIHRvIHRlc3Qgb3V0IGFsd2F5cyBwYXNzaW5nIHRocm91Z2ggdGhlIG5ldyB2YWx1ZQotCSAqIHRvIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXByaXZhdGUgY2xhc3MgQWx3YXlzVXBkYXRlUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBleHRlbmRzIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gewotCi0JCUFsd2F5c1VwZGF0ZVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPFByZWZlcmVuY2VzPiBwcmVmZXJlbmNlc0hvbGRlciwgU3RyaW5nIGtleSkgewotCQkJc3VwZXIocHJlZmVyZW5jZXNIb2xkZXIsIGtleSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2V0UHJlZmVyZW5jZShPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZTRhNTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLk5vZGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzLlByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnMuUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBQcmVmZXJlbmNlc1Rlc3RDYXNlIHsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZXhwZWN0ZWRWYWx1ZXM7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4gbm9kZUhvbGRlcjsKLQlQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gcHJlZmVyZW5jZXNBZGFwdGVyOwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudDsKLQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGl0ZW1MaXN0ZW5lcjsKLQlib29sZWFuIGxpc3RlbmVyUmVtb3ZlZCA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRV8xID0gImZvbyAxIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUVfMiA9ICJmb28gMiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FXzMgPSAiZm9vIDMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfVkFMVUVfMSA9ICJvcmlnaW5hbCBzdHJpbmcgdmFsdWUgMSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19WQUxVRV8yID0gIm9yaWdpbmFsIHN0cmluZyB2YWx1ZSAyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1ZBTFVFXzMgPSAib3JpZ2luYWwgc3RyaW5nIHZhbHVlIDMiOwotCi0JcHVibGljIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FXzEsIFNUUklOR19WQUxVRV8xKTsJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMSwgU1RSSU5HX1ZBTFVFXzEpOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRV8yLCBTVFJJTkdfVkFMVUVfMik7CXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzIsIFNUUklOR19WQUxVRV8yKTsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUVfMywgU1RSSU5HX1ZBTFVFXzMpOwl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8zLCBTVFJJTkdfVkFMVUVfMyk7Ci0KLQkJdGhpcy5ub2RlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4odGhpcy50ZXN0Tm9kZSk7Ci0JCXRoaXMucHJlZmVyZW5jZXNBZGFwdGVyID0gbmV3IFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm5vZGVIb2xkZXIpOwotCQl0aGlzLmxpc3RlbmVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLml0ZW1MaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtTGlzdGVuZXIoKTsKLQkJdGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5saXN0ZW5lcik7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCXByaXZhdGUgdm9pZCBsb2dFdmVudChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCWlmIChQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCAhPSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgdGhpcy5ldmVudDogIiArIGUpOwotCQkJCX0KLQkJCQlQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCB0aGlzLmV2ZW50OiAiICsgZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQlTdHJpbmcgQU5PVEhFUl9LRVlfTkFNRV8xID0gImFub3RoZXIga2V5IDEiOwotCQlTdHJpbmcgQU5PVEhFUl9LRVlfTkFNRV8yID0gImFub3RoZXIga2V5IDIiOwotCQlTdHJpbmcgQU5PVEhFUl9LRVlfTkFNRV8zID0gImFub3RoZXIga2V5IDMiOwotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMSA9ICJhbm90aGVyIHN0cmluZyB2YWx1ZSAxIjsKLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzIgPSAiYW5vdGhlciBzdHJpbmcgdmFsdWUgMiI7Ci0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRV8zID0gImFub3RoZXIgc3RyaW5nIHZhbHVlIDMiOwotCQlQcmVmZXJlbmNlcyBhbm90aGVyTm9kZSA9IHRoaXMuY2xhc3NOb2RlLm5vZGUoImFub3RoZXIgdGVzdCBub2RlIik7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMuY2xlYXIoKTsKLQkJYW5vdGhlck5vZGUucHV0KEFOT1RIRVJfS0VZX05BTUVfMSwgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMSk7CXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEFOT1RIRVJfS0VZX05BTUVfMSwgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMSk7Ci0JCWFub3RoZXJOb2RlLnB1dChBTk9USEVSX0tFWV9OQU1FXzIsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzIpOwl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChBTk9USEVSX0tFWV9OQU1FXzIsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzIpOwotCQlhbm90aGVyTm9kZS5wdXQoQU5PVEhFUl9LRVlfTkFNRV8zLCBBTk9USEVSX1NUUklOR19WQUxVRV8zKTsJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoQU5PVEhFUl9LRVlfTkFNRV8zLCBBTk9USEVSX1NUUklOR19WQUxVRV8zKTsKLQotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUoYW5vdGhlck5vZGUpOwotCQkvLyBjb2xsZWN0aW9uQ2hhbmdlZCBkb2VzIG5vdCBwYXNzIGFueSBpdGVtcyBpbiB0aGUgdGhpcy5ldmVudAotCQl0aGlzLnZlcmlmeUV2ZW50KENvbGxlY3Rpb25zLjxTdHJpbmcsIFN0cmluZz5lbXB0eU1hcCgpKTsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLmNsZWFyKCk7Ci0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV4cGVjdGVkVmFsdWVzKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3ROb2RlKTsKLQkJdGhpcy52ZXJpZnlFdmVudChDb2xsZWN0aW9ucy48U3RyaW5nLCBTdHJpbmc+ZW1wdHlNYXAoKSk7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMuY2xlYXIoKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMSwgU1RSSU5HX1ZBTFVFXzEpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8yLCBTVFJJTkdfVkFMVUVfMik7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzMsIFNUUklOR19WQUxVRV8zKTsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCVN0cmluZyBBTk9USEVSX0tFWV9OQU1FID0gImFub3RoZXIga2V5IjsKLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFID0gImFub3RoZXIgc3RyaW5nIHZhbHVlIjsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoQU5PVEhFUl9LRVlfTkFNRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkSXRlbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJZXhwZWN0ZWRJdGVtcy5wdXQoQU5PVEhFUl9LRVlfTkFNRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGV4cGVjdGVkSXRlbXMpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChBTk9USEVSX0tFWV9OQU1FLCBBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVByZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRV8yKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5ldmVudC5pdGVtc1NpemUoKSk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlTdHJpbmcga2V5ID0gKChQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4pIHRoaXMuZXZlbnQuaXRlbXMoKS5uZXh0KCkpLmdldEtleSgpOwotCQlhc3NlcnRFcXVhbHMoS0VZX05BTUVfMiwga2V5KTsKLQotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnJlbW92ZShLRVlfTkFNRV8yKTsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlUHJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCVN0cmluZyBESUZGRVJFTlQgPSAic29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IjsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUVfMiwgRElGRkVSRU5UKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzIsIERJRkZFUkVOVCk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU5vZGUodGhpcy50ZXN0Tm9kZSk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBhIHNpdHVhdGlvbiB3aGVyZQotCSAqIC0gd2UgYXJlIGxpc3RlbmluZyB0byB0aGUgbm9kZSB3aGVuIGl0IGdldHMgcmVtb3ZlZCBmcm9tIHRoZSBwcmVmZXJlbmNlcyAicmVwb3NpdG9yeSIKLQkgKiAtIHdlIGdldCBub3RpZmljYXRpb24gdGhhdCBpdCBoYXMgYmVlbiByZW1vdmVkCi0JICogLSB3ZSB0cnkgdG8gcmVtb3ZlIG91ciB0aGlzLmxpc3RlbmVyCi0JICogLSB0aGUgbm9kZSB3aWxsIHRocm93IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAtIHRoZSBhZGFwdGVyIHNob3VsZCBoYW5kbGUgaXQgT0suLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTm9kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJUHJlZmVyZW5jZXMgcGFyZW50ID0gdGhpcy50ZXN0Tm9kZS5wYXJlbnQoKTsKLQkJcGFyZW50LmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkUGFyZW50Tm9kZUNoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZU5vZGUoKTsKLQkJdGhpcy50ZXN0Tm9kZS5mbHVzaCgpOwkJLy8gdGhpcyBzZWVtcyB0byBiZSByZXF1aXJlZCBmb3IgdGhlIHRoaXMuZXZlbnQgdG8gdHJpZ2dlci4uLgotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCi0JCWFzc2VydFRydWUodGhpcy5saXN0ZW5lclJlbW92ZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgTm9kZUNoYW5nZUxpc3RlbmVyIGJ1aWxkUGFyZW50Tm9kZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoaWxkQWRkZWQoTm9kZUNoYW5nZUV2ZW50IGUpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoaWxkUmVtb3ZlZChOb2RlQ2hhbmdlRXZlbnQgZSkgewotCQkJCWlmIChlLmdldENoaWxkKCkgPT0gUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMudGVzdE5vZGUpIHsKLQkJCQkJUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmxpc3RlbmVyKTsKLQkJCQkJLy8gdGhpcyBsaW5lIG9mIGNvZGUgd2lsbCBub3QgZXhlY3V0ZSBpZiB0aGUgbGluZSBhYm92ZSB0cmlnZ2VycyBhbiBleGNlcHRpb24KLQkJCQkJUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMubGlzdGVuZXJSZW1vdmVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCXRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMubGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQl0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KE1hcDxTdHJpbmcsIFN0cmluZz4gaXRlbXMpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW1zLnNpemUoKSwgdGhpcy5ldmVudC5pdGVtc1NpemUoKSk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYXRvcjxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4+IGV2ZW50SXRlbXMgPSAoSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+PikgdGhpcy5ldmVudC5pdGVtcygpOwotCQl0aGlzLnZlcmlmeUl0ZW1zKGl0ZW1zLCBldmVudEl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Tm9kZShQcmVmZXJlbmNlcyBub2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10ga2V5cyA9IG5vZGUua2V5cygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5leHBlY3RlZFZhbHVlcy5zaXplKCksIGtleXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5leHBlY3RlZFZhbHVlcy5nZXQoa2V5c1tpXSksIG5vZGUuZ2V0KGtleXNbaV0sICI8bWlzc2luZyBwcmVmZXJlbmNlPiIpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlBZGFwdGVyKFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjdm0pIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXhwZWN0ZWRWYWx1ZXMuc2l6ZSgpLCBjdm0uc2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlJdGVtcyh0aGlzLmV4cGVjdGVkVmFsdWVzLCBjdm0uaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUl0ZW1zKE1hcDxTdHJpbmcsIFN0cmluZz4gZXhwZWN0ZWQsIEl0ZXJhdG9yPFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPj4gc3RyZWFtKSB7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbW9kZWwgPSBzdHJlYW0ubmV4dCgpOwotCQkJbW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuaXRlbUxpc3RlbmVyKTsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZC5nZXQobW9kZWwuZ2V0S2V5KCkpLCBtb2RlbC5nZXRWYWx1ZSgpKTsKLQkJCW1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLml0ZW1MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbm9kZUhhc0FueVByZWZMaXN0ZW5lcnMoUHJlZmVyZW5jZXMgbm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcltdIHByZWZMaXN0ZW5lcnMgPSAoUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyW10pIENsYXNzVG9vbHMuZmllbGRWYWx1ZShub2RlLCAicHJlZkxpc3RlbmVycyIpOwotCQlyZXR1cm4gcHJlZkxpc3RlbmVycy5sZW5ndGggPiAwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc1Rlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhMjg0YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogc2V0IHVwIGFuZCB0ZWFyIGRvd24gYSB0ZXN0IG5vZGUgZm9yIGFueSBzdWJjbGFzcyB0aGF0Ci0gKiBuZWVkcyB0byB0ZXN0IHByZWZlcmVuY2VzLXJlbGF0ZWQgc3R1ZmYKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByZWZlcmVuY2VzVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGNsYXNzTm9kZTsKLQlwdWJsaWMgUHJlZmVyZW5jZXMgdGVzdE5vZGU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9OT0RFX05BTUUgPSAidGVzdCBub2RlIjsKLQotCXB1YmxpYyBQcmVmZXJlbmNlc1Rlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVByZWZlcmVuY2VzIHBhY2thZ2VOb2RlID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKHRoaXMuZ2V0Q2xhc3MoKSk7Ci0JCXRoaXMuY2xhc3NOb2RlID0gcGFja2FnZU5vZGUubm9kZShDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJLy8gY2xlYW4gb3V0IGFueSBsZWZ0b3ZlciBjcmFwLi4uCi0JCWlmICgodGhpcy5jbGFzc05vZGUua2V5cygpLmxlbmd0aCA+IDApIHx8ICh0aGlzLmNsYXNzTm9kZS5jaGlsZHJlbk5hbWVzKCkubGVuZ3RoID4gMCkpIHsKLQkJCXRoaXMuY2xhc3NOb2RlLnJlbW92ZU5vZGUoKTsKLQkJCS8vIC4uLmFuZCByZS1jcmVhdGUgdGhlIG5vZGUKLQkJCXRoaXMuY2xhc3NOb2RlID0gcGFja2FnZU5vZGUubm9kZShDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJfQotCQl0aGlzLnRlc3ROb2RlID0gdGhpcy5jbGFzc05vZGUubm9kZShURVNUX05PREVfTkFNRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gd2FpdCBmb3IgYWxsIHRoZSBldmVudHMgdG8gYmUgZGVsaXZlcmVkIGJlZm9yZSB0ZWFyaW5nIGRvd24KLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IHRoaXMuY2xhc3NOb2RlLnBhcmVudCgpOwotCQl0aGlzLmNsYXNzTm9kZS5yZW1vdmVOb2RlKCk7Ci0JCXdoaWxlICh0aGlzLm5vZGVJc1Zlc3RpZ2lhbChub2RlKSkgewotCQkJUHJlZmVyZW5jZXMgcGFyZW50ID0gbm9kZS5wYXJlbnQoKTsKLQkJCW5vZGUucmVtb3ZlTm9kZSgpOwotCQkJbm9kZSA9IHBhcmVudDsKLQkJfQotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG5vZGVJc1Zlc3RpZ2lhbChQcmVmZXJlbmNlcyBub2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChub2RlICE9IG51bGwpCi0JCQkmJiAobm9kZS5rZXlzKCkubGVuZ3RoID09IDApCi0JCQkmJiAobm9kZS5jaGlsZHJlbk5hbWVzKCkubGVuZ3RoID09IDApCi0JCQkmJiAobm9kZSAhPSBQcmVmZXJlbmNlcy51c2VyUm9vdCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKSB7Ci0JCXRyeSB7Ci0JCQl3aGlsZSAoICEgdGhpcy5wcmVmZXJlbmNlc0V2ZW50UXVldWUoKS5pc0VtcHR5KCkpIHsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCX0KLQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0PEV2ZW50T2JqZWN0PiBwcmVmZXJlbmNlc0V2ZW50UXVldWUoKSB7Ci0JCXJldHVybiAoTGlzdDxFdmVudE9iamVjdD4pIENsYXNzVG9vbHMuc3RhdGljRmllbGRWYWx1ZShBYnN0cmFjdFByZWZlcmVuY2VzLmNsYXNzLCAiZXZlbnRRdWV1ZSIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxOWZjZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQnV0dG9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRXZlbnRMaXN0ZW5lckxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5DaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBDaGVja0JveE1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcjsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1dHRvbk1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSk7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyID0gbmV3IENoZWNrQm94TW9kZWxBZGFwdGVyKHRoaXMuYm9vbGVhbkhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNlbGVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdGhpcy5ib29sZWFuSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRUcnVlKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGxvY2FsQm9vbGVhbkhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4pIHRoaXMuYm9vbGVhbkhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxCb29sZWFuSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsQm9vbGVhbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIpOwotCi0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxCb29sZWFuSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoT2JqZWN0IG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gKEV2ZW50TGlzdGVuZXJMaXN0KSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUobW9kZWwsICJsaXN0ZW5lckxpc3QiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gKEV2ZW50TGlzdGVuZXJMaXN0KSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUobW9kZWwsICJsaXN0ZW5lckxpc3QiKTsKLQkJYXNzZXJ0RmFsc2UobGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzICoqKioqKioqKioKLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MTg0MmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuSXRlbUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNoZWNrQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNoZWNrQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGNoZWNrIGJveGVzLgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMUhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcySG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbm90RmxhZzJIb2xkZXI7Ci0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBmbGFnMUJ1dHRvbk1vZGVsOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgZmxhZzJCdXR0b25Nb2RlbDsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIG5vdEZsYWcyQnV0dG9uTW9kZWw7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IENoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYyhhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIENoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwodHJ1ZSwgdHJ1ZSk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5mbGFnMUhvbGRlciA9IHRoaXMuYnVpbGRGbGFnMUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuZmxhZzFCdXR0b25Nb2RlbCA9IHRoaXMuYnVpbGRDaGVja0JveE1vZGVsQWRhcHRlcih0aGlzLmZsYWcxSG9sZGVyKTsKLQkJdGhpcy5mbGFnMkhvbGRlciA9IHRoaXMuYnVpbGRGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuZmxhZzJCdXR0b25Nb2RlbCA9IHRoaXMuYnVpbGRDaGVja0JveE1vZGVsQWRhcHRlcih0aGlzLmZsYWcySG9sZGVyKTsKLQkJdGhpcy5ub3RGbGFnMkhvbGRlciA9IHRoaXMuYnVpbGROb3RGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMubm90RmxhZzJCdXR0b25Nb2RlbCA9IHRoaXMuYnVpbGRDaGVja0JveE1vZGVsQWRhcHRlcih0aGlzLm5vdEZsYWcySG9sZGVyKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcxSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4odm0sIFRlc3RNb2RlbC5GTEFHMV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0ZsYWcxKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRGbGFnMSh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4odm0sIFRlc3RNb2RlbC5GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0ZsYWcyKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRGbGFnMih2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vdEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4odm0sIFRlc3RNb2RlbC5OT1RfRkxBRzJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNOb3RGbGFnMigpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Tm90RmxhZzIodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgYnVpbGRDaGVja0JveE1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgQ2hlY2tCb3hNb2RlbEFkYXB0ZXIoYm9vbGVhbkhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coKSB7Ci0JCUpGcmFtZSB3aW5kb3cgPSBuZXcgSkZyYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQl3aW5kb3cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLQkJd2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJd2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl3aW5kb3cuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCXdpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDaGVja0JveFBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ2hlY2tCb3hQYW5lbCgpIHsKLQkJSlBhbmVsIHRhc2tMaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEZsYWcxQ2hlY2tCb3goKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRGbGFnMkNoZWNrQm94KCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkTm90RmxhZzJDaGVja0JveCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFVuYXR0YWNoZWRDaGVja0JveCgpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKQ2hlY2tCb3ggYnVpbGRGbGFnMUNoZWNrQm94KCkgewotCQlKQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94KCk7Ci0JCWNoZWNrQm94LnNldFRleHQoImZsYWcgMSIpOwotCQljaGVja0JveC5zZXRNb2RlbCh0aGlzLmZsYWcxQnV0dG9uTW9kZWwpOwotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JcHJpdmF0ZSBKQ2hlY2tCb3ggYnVpbGRGbGFnMkNoZWNrQm94KCkgewotCQlKQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94KCk7Ci0JCWNoZWNrQm94LnNldFRleHQoImZsYWcgMiIpOwotCQljaGVja0JveC5zZXRNb2RlbCh0aGlzLmZsYWcyQnV0dG9uTW9kZWwpOwotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JcHJpdmF0ZSBKQ2hlY2tCb3ggYnVpbGROb3RGbGFnMkNoZWNrQm94KCkgewotCQlKQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94KCk7Ci0JCWNoZWNrQm94LnNldFRleHQoIm5vdCBmbGFnIDIiKTsKLQkJY2hlY2tCb3guc2V0TW9kZWwodGhpcy5ub3RGbGFnMkJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkVW5hdHRhY2hlZENoZWNrQm94KCkgewotCQlKQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94KCJ1bmF0dGFjaGVkIik7Ci0JCWNoZWNrQm94LmdldE1vZGVsKCkuYWRkSXRlbUxpc3RlbmVyKHRoaXMuYnVpbGRVbmF0dGFjaGVkSXRlbUxpc3RlbmVyKCkpOwotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JcHJpdmF0ZSBJdGVtTGlzdGVuZXIgYnVpbGRVbmF0dGFjaGVkSXRlbUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1TdGF0ZUNoYW5nZWQoSXRlbUV2ZW50IGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYXR0YWNoZWQgc3RhdGUgY2hhbmdlZDogIiArIGUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZEZsaXBGbGFnMUJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKCkpOwotCQlyZXR1cm4gY29udHJvbFBhbmVsOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZEZsaXBGbGFnMUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRGbGlwRmxhZzFBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRGbGlwRmxhZzFBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImZsaXAgZmxhZyAxIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5mbGlwRmxhZzEoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBmbGlwRmxhZzEoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldEZsYWcxKCAhIHRoaXMudGVzdE1vZGVsLmlzRmxhZzEoKSk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiY2xlYXIgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXN0b3JlIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAxOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc05vdEZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiIpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZsYWcxOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzFfUFJPUEVSVFkgPSAiZmxhZzEiOwotCQlwcml2YXRlIGJvb2xlYW4gZmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHMl9QUk9QRVJUWSA9ICJmbGFnMiI7Ci0JCXByaXZhdGUgYm9vbGVhbiBub3RGbGFnMjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9GTEFHMl9QUk9QRVJUWSA9ICJub3RGbGFnMiI7Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoYm9vbGVhbiBmbGFnMSwgYm9vbGVhbiBmbGFnMikgewotCQkJdGhpcy5mbGFnMSA9IGZsYWcxOwotCQkJdGhpcy5mbGFnMiA9IGZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9ICEgZmxhZzI7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNGbGFnMSgpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcxOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcxKGJvb2xlYW4gZmxhZzEpIHsKLQkJCWJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMTsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMV9QUk9QRVJUWSwgb2xkLCBmbGFnMSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNGbGFnMigpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcyOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcyKGJvb2xlYW4gZmxhZzIpIHsKLQkJCWJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMjsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMl9QUk9QRVJUWSwgb2xkLCBmbGFnMik7Ci0JCi0JCQlvbGQgPSB0aGlzLm5vdEZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9ICEgZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9UX0ZMQUcyX1BST1BFUlRZLCBvbGQsIHRoaXMubm90RmxhZzIpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzTm90RmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub3RGbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROb3RGbGFnMihib29sZWFuIG5vdEZsYWcyKSB7Ci0JCQl0aGlzLnNldEZsYWcyKCAhIG5vdEZsYWcyKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmlzRmxhZzEoKSArICIgLSAiICsgdGhpcy5pc0ZsYWcyKCkgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTFkYzYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNvbWJvQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZURpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29vcmRpbmF0ZWRMaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDb21ib0JveE1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCS8vIG5vdGhpbmcgeWV0Li4uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gbm90aGluZyB5ZXQuLi4KLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPERpc3BsYXlhYmxlPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGlvbkhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PihsaXN0SG9sZGVyLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2VsZWN0aW9uSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUNvbWJvQm94TW9kZWwgY29tYm9Cb3hNb2RlbCA9IG5ldyBDb21ib0JveE1vZGVsQWRhcHRlcihsaXN0SG9sZGVyLCBzZWxlY3Rpb25Ib2xkZXIpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2Uoc2VsZWN0aW9uSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGNvbWJvQm94TW9kZWwpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxEaXNwbGF5YWJsZT4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxEaXNwbGF5YWJsZT4oY29tYm9Cb3hNb2RlbCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJc2VsZWN0aW9uSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUoc2VsZWN0aW9uSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhjb21ib0JveE1vZGVsKTsKLQotCQljb21ib0JveE1vZGVsLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIoc3luY2hMaXN0KTsKLQkJc2VsZWN0aW9uSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZShzZWxlY3Rpb25Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMoY29tYm9Cb3hNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkgewotCQkJCS8vIGRvIG5vdGhpbmcuLi4KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdE1vZGVsIGxpc3RNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMgPSAoKEJvb2xlYW4pIENsYXNzVG9vbHMuZXhlY3V0ZU1ldGhvZChsaXN0TW9kZWwsICJoYXNOb0xpc3REYXRhTGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCQlhc3NlcnRUcnVlKGhhc05vTGlzdGVuZXJzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RNb2RlbCBsaXN0TW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGhhc0xpc3RlbmVycyA9ICgoQm9vbGVhbikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKGxpc3RNb2RlbCwgImhhc0xpc3REYXRhTGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCQlhc3NlcnRUcnVlKGhhc0xpc3RlbmVycyk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxEaXNwbGF5YWJsZT4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPERpc3BsYXlhYmxlPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8RGlzcGxheWFibGU+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxEaXNwbGF5YWJsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RGlzcGxheWFibGU+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248RGlzcGxheWFibGU+IGMpIHsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJmb28iKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiYmFyIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImJheiIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqb28iKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiamFyIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImpheiIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkNzcxMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Db21ib0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5GaWx0ZXJpbmdMaXN0QnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5MaXN0Q2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TaW1wbGVMaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgY29tYm8tYm94ZXMuCi0gKiAKLSAqIERlZmF1bHRMb25nTGlzdEJyb3dzZXJEaWFsb2dVSVRlc3Qgc3ViY2xhc3NlcyB0aGlzIGNsYXNzOyBzbyBiZQotICogY2FyZWZ1bCB3aGVuIG1ha2luZyBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJvdGVjdGVkIEpGcmFtZSB3aW5kb3c7Ci0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGNvbG9ySG9sZGVyOwotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBjb2xvckxpc3RIb2xkZXI7Ci0JcHJvdGVjdGVkIENvbWJvQm94TW9kZWwgY29sb3JDb21ib0JveE1vZGVsOwotCXByaXZhdGUgaW50IG5leHRDb2xvck51bWJlciA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYyhhcmdzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlYyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKFVJTWFuYWdlci5nZXRTeXN0ZW1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKTsKLS8vCQlVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoVUlNYW5hZ2VyLmdldENyb3NzUGxhdGZvcm1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKTsJLy8gTWV0YWwgTEFGCi0vLwkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKGNvbS5zdW4uamF2YS5zd2luZy5wbGFmLndpbmRvd3MuV2luZG93c0xvb2tBbmRGZWVsLmNsYXNzLmdldE5hbWUoKSk7Ci0vLwkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKGNvbS5zdW4uamF2YS5zd2luZy5wbGFmLm1vdGlmLk1vdGlmTG9va0FuZEZlZWwuY2xhc3MuZ2V0TmFtZSgpKTsKLS8vCQlVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwob3JhY2xlLmJhbGkuZXd0Lm9sYWYuT3JhY2xlTG9va0FuZEZlZWwuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSB0aGlzLmJ1aWxkVGVzdE1vZGVsKCk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5jb2xvckhvbGRlciA9IHRoaXMuYnVpbGRDb2xvckhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuY29sb3JMaXN0SG9sZGVyID0gdGhpcy5idWlsZENvbG9yTGlzdEhvbGRlcigpOwotCQl0aGlzLmNvbG9yQ29tYm9Cb3hNb2RlbCA9IHRoaXMuYnVpbGRDb21ib0JveE1vZGVsQWRhcHRlcih0aGlzLmNvbG9yTGlzdEhvbGRlciwgdGhpcy5jb2xvckhvbGRlcik7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZENvbG9ySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgT2JqZWN0Pih2bSwgVGVzdE1vZGVsLkNPTE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb2xvcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldENvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVzdE1vZGVsIGJ1aWxkVGVzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRlc3RNb2RlbCgpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbG9yTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KFRlc3RNb2RlbC52YWxpZENvbG9ycygpKTsKLS8vCQlyZXR1cm4gbmV3IEFic3RyYWN0UmVhZE9ubHlMaXN0VmFsdWVNb2RlbCgpIHsKLS8vCQkJcHVibGljIE9iamVjdCB2YWx1ZSgpIHsKLS8vCQkJCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3IoVGVzdE1vZGVsLlZBTElEX0NPTE9SUyk7Ci0vLwkJCX0KLS8vCQkJcHVibGljIGludCBzaXplKCkgewotLy8JCQkJcmV0dXJuIFRlc3RNb2RlbC5WQUxJRF9DT0xPUlMubGVuZ3RoOwotLy8JCQl9Ci0vLwkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiB1aUNvbG9yTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMuY29sb3JMaXN0SG9sZGVyOwotCX0KLQotCXByaXZhdGUgQ29tYm9Cb3hNb2RlbCBidWlsZENvbWJvQm94TW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlciwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBzZWxlY3Rpb25Ib2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBDb21ib0JveE1vZGVsQWRhcHRlcihsaXN0SG9sZGVyLCBzZWxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQl0aGlzLndpbmRvdyA9IG5ldyBKRnJhbWUoQ2xhc3NUb29scy5zaG9ydE5hbWVGb3IodGhpcy5nZXRDbGFzcygpKSk7Ci0JCXRoaXMud2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXRoaXMud2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJdGhpcy53aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXRoaXMud2luZG93LnNldExvY2F0aW9uKDMwMCwgMzAwKTsKLQkJdGhpcy53aW5kb3cuc2V0U2l6ZSg0MDAsIDE1MCk7Ci0JCXRoaXMud2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbWJvQm94UGFuZWwoKSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJvdGVjdGVkIEpQYW5lbCBidWlsZENvbWJvQm94UGFuZWwoKSB7Ci0JCUpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQlwYW5lbC5hZGQodGhpcy5idWlsZENvbWJvQm94KCkpOwotCQlwYW5lbC5hZGQodGhpcy5idWlsZENvbWJvQm94KCkpOwotCQlwYW5lbC5hZGQodGhpcy5idWlsZExpc3RDaG9vc2VyMSgpKTsKLQkJcGFuZWwuYWRkKHRoaXMuYnVpbGRMaXN0Q2hvb3NlcjIoKSk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpDb21ib0JveCBidWlsZENvbWJvQm94KCkgewotCQlKQ29tYm9Cb3ggY29tYm9Cb3ggPSBuZXcgSkNvbWJvQm94KHRoaXMuY29sb3JDb21ib0JveE1vZGVsKTsKLQkJY29tYm9Cb3guc2V0UmVuZGVyZXIodGhpcy5idWlsZENvbWJvQm94UmVuZGVyZXIoKSk7Ci0JCXJldHVybiBjb21ib0JveDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENlbGxSZW5kZXJlciBidWlsZENvbWJvQm94UmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdENlbGxSZW5kZXJlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmJ1aWxkVGV4dCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hvb3NlciBidWlsZExpc3RDaG9vc2VyMSgpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbExpc3RDaG9vc2VyMSh0aGlzLmNvbG9yQ29tYm9Cb3hNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hvb3NlciBidWlsZExpc3RDaG9vc2VyMigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbExpc3RDaG9vc2VyMih0aGlzLmNvbG9yQ29tYm9Cb3hNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDb250cm9sUGFuZWwoKSB7Ci0JCUpQYW5lbCBjb250cm9sUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDIsIDApKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXRDb2xvckJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRUZW5CdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlbW92ZVRlbkJ1dHRvbigpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlc2V0IGNvbG9yIGJ1dHRvbiAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXRDb2xvckJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldENvbG9yQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXRDb2xvckFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQgY29sb3IiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc2V0Q29sb3IoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXNldENvbG9yKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXRDb2xvcihUZXN0TW9kZWwuREVGQVVMVF9DT0xPUik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjbGVhciBtb2RlbCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiByZXN0b3JlIG1vZGVsIGJ1dHRvbiAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcmludCBtb2RlbCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFByaW50TW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFByaW50TW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInByaW50IG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGFkZCAyMCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZEFkZFRlbkJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRBZGRUZW5BY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRBZGRUZW5BY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImFkZCAyMCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuYWRkVGVuKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgYWRkVGVuKCkgewotCQlmb3IgKGludCBpID0gdGhpcy5uZXh0Q29sb3JOdW1iZXI7IGkgPCB0aGlzLm5leHRDb2xvck51bWJlciArIDIwOyBpKyspIHsKLQkJCXRoaXMuY29sb3JMaXN0SG9sZGVyLmFkZCh0aGlzLmNvbG9yTGlzdEhvbGRlci5zaXplKCksICJjb2xvciIgKyBpKTsKLQkJfQotCQl0aGlzLm5leHRDb2xvck51bWJlciArPSAyMDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlbW92ZSAyMCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbW92ZVRlbkJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW1vdmVUZW5BY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW1vdmVUZW5BY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbW92ZSAyMCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVtb3ZlVGVuKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVtb3ZlVGVuKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKLQkJCWlmICh0aGlzLmNvbG9yTGlzdEhvbGRlci5zaXplKCkgPiAwKSB7Ci0JCQkJdGhpcy5jb2xvckxpc3RIb2xkZXIucmVtb3ZlKHRoaXMuY29sb3JMaXN0SG9sZGVyLnNpemUoKSAtIDEpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBjb2xvcjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX1BST1BFUlRZID0gImNvbG9yIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRCA9ICJyZWQiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JBTkdFID0gIm9yYW5nZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZRUxMT1cgPSAieWVsbG93IjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUVOID0gImdyZWVuIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUUgPSAiYmx1ZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRJR08gPSAiaW5kaWdvIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJT0xFVCA9ICJ2aW9sZXQiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT0xPUiA9IFJFRDsKLQkJCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHZhbGlkQ29sb3JzOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1ZBTElEX0NPTE9SUyA9IHsKLQkJCQlSRUQsCi0JCQkJT1JBTkdFLAotCQkJCVlFTExPVywKLQkJCQlHUkVFTiwKLQkJCQlCTFVFLAotCQkJCUlORElHTywKLQkJCQlWSU9MRVQKLQkJCX07Ci0JCi0JCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHZhbGlkQ29sb3JzKCkgewotCQkJaWYgKHZhbGlkQ29sb3JzID09IG51bGwpIHsKLQkJCQl2YWxpZENvbG9ycyA9IGJ1aWxkRGVmYXVsdFZhbGlkQ29sb3JzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsaWRDb2xvcnM7Ci0JCX0KLQkJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gYnVpbGREZWZhdWx0VmFsaWRDb2xvcnMoKSB7Ci0JCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHJlc3VsdCwgREVGQVVMVF9WQUxJRF9DT0xPUlMpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQotCQlwdWJsaWMgVGVzdE1vZGVsKCkgewotCQkJdGhpcyhERUZBVUxUX0NPTE9SKTsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsKFN0cmluZyBjb2xvcikgewotCQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2xvcjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihTdHJpbmcgY29sb3IpIHsKLQkJCXRoaXMuY2hlY2tDb2xvcihjb2xvcik7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5jb2xvcjsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xPUl9QUk9QRVJUWSwgb2xkLCBjb2xvcik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2hlY2tDb2xvcihTdHJpbmcgYykgewotCQkJaWYgKCAhIHZhbGlkQ29sb3JzKCkuY29udGFpbnMoYykpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGMpOwotCQkJfQotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoIiArIHRoaXMuY29sb3IgKyAiKSI7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgTG9jYWxMaXN0Q2hvb3NlcjEgZXh0ZW5kcyBMaXN0Q2hvb3NlciB7Ci0JCXB1YmxpYyBMb2NhbExpc3RDaG9vc2VyMShDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0JCQlzdXBlcihtb2RlbCk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgTG9jYWxMaXN0Q2hvb3NlcjIgZXh0ZW5kcyBMaXN0Q2hvb3NlciB7Ci0JCXB1YmxpYyBMb2NhbExpc3RDaG9vc2VyMihDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0JCQlzdXBlcihtb2RlbCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0QnJvd3NlciBidWlsZEJyb3dzZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0xpc3RCcm93c2VyPFN0cmluZz4oKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclVJVGVzdDIuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDFjMDQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclVJVGVzdDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuU2ltcGxlTGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0MiBleHRlbmRzIENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyKCkuZXhlYyhhcmdzKTsKLQl9Ci0KLQlwdWJsaWMgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIHVzZSBhIGRpZmZlcmVudCBtb2RlbCB0aGF0IGFsbG93cyB0aGUgY29sb3IgdG8gYmUgc2V0IHRvIG51bGwKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdE1vZGVsIGJ1aWxkVGVzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRlc3RNb2RlbDIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSBudWxsIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IHVpQ29sb3JMaXN0SG9sZGVyKCkgewotCQkvLyB0aGUgZGVmYXVsdCBpcyB0byBwcmVwZW5kIHRoZSB3cmFwcGVkIGxpc3Qgd2l0aCBhIG51bGwgaXRlbQotCQlyZXR1cm4gbmV3IEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4oc3VwZXIudWlDb2xvckxpc3RIb2xkZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmVydCBudWxsIHRvIHNvbWUgdGV4dAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0Q2VsbFJlbmRlcmVyIGJ1aWxkQ29tYm9Cb3hSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0Q2VsbFJlbmRlcmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVGV4dChPYmplY3QgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gIjxub25lIHNlbGVjdGVkPiIgOiBzdXBlci5idWlsZFRleHQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwyIGV4dGVuZHMgVGVzdE1vZGVsIHsKLQkJLyoqCi0JCSAqIG51bGwgaXMgT0sgaGVyZQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGNoZWNrQ29sb3IoU3RyaW5nIGNvbG9yKSB7Ci0JCQlpZiAoY29sb3IgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXN1cGVyLmNoZWNrQ29sb3IoY29sb3IpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjlmNWVmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5EYXRlU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcjsKLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBzcGlubmVyTW9kZWxBZGFwdGVyOwotCWJvb2xlYW4gZXZlbnRGaXJlZDsKLQotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4obmV3IERhdGUoKSk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciA9IG5ldyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLnZhbHVlSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkRGF0ZUNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTcGlubmVyTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCURhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCURhdGUgbmV3RGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCW5ld0RhdGUuc2V0VGltZSg3Nzc3NzcpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuc2V0VmFsdWUobmV3RGF0ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKDc3Nzc3NywgKChEYXRlKSB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpLmdldFRpbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlVmFsdWVIb2xkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCURhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCURhdGUgbmV3RGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCW5ld0RhdGUuc2V0VGltZSg3Nzc3NzcpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG5ld0RhdGUpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyg3Nzc3NzcsICgoRGF0ZSkgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpLmdldFRpbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlEYXRlIG5ld0RhdGUgPSBuZXcgRGF0ZSgpOwotCQluZXdEYXRlLnNldFRpbWUoNzc3Nzc3KTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXdEYXRlKTsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCURhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyg3Nzc3NzcsICgoRGF0ZSkgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpLmdldFRpbWUoKSk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UoKChEYXRlKSB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSkuZ2V0VGltZSgpID09IDc3Nzc3Nyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBsb2NhbFZhbHVlSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KSB0aGlzLnZhbHVlSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKFNwaW5uZXJNb2RlbCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIpIGFkYXB0ZXIpLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhPYmplY3QgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKCgoRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIpIGFkYXB0ZXIpLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEluaXRpYWxWYWx1ZSgpIHsKLQkJRGF0ZSB0b2RheSA9IG5ldyBEYXRlKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4oKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyID0gbmV3IERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMudmFsdWVIb2xkZXIsIHRvZGF5KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkRGF0ZUNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCi0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHModG9kYXksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQlEYXRlIG5ld0RhdGUgPSBuZXcgRGF0ZSgpOwotCQluZXdEYXRlLnNldFRpbWUoNzc3Nzc3KTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXdEYXRlKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyg3Nzc3NzcsICgoRGF0ZSkgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpLmdldFRpbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZmUzYWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRFdmVudC5FdmVudFR5cGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5Eb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nSG9sZGVyOwotCURvY3VtZW50IGRvY3VtZW50QWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgRG9jdW1lbnRBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdHJpbmdIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oIjAxMjM0NTY3ODkiKTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIgPSBuZXcgRG9jdW1lbnRBZGFwdGVyKHRoaXMuc3RyaW5nSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RyaW5nTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRTdHJpbmdMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIuYWRkRG9jdW1lbnRMaXN0ZW5lcihuZXcgVGVzdERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJCWFzc2VydEVxdWFscyhFdmVudFR5cGUuUkVNT1ZFLCBlLmdldFR5cGUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKERvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZG9jdW1lbnRBZGFwdGVyLCBlLmdldERvY3VtZW50KCkpOwotCQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgcmVtb3ZhbCBvZiAiMjM0NTYiCi0JCQkJYXNzZXJ0RXF1YWxzKDIsIGUuZ2V0T2Zmc2V0KCkpOwotCQkJCWFzc2VydEVxdWFscyg1LCBlLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLnJlbW92ZSgyLCA1KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoIjAxNzg5IiwgdGhpcy5zdHJpbmdIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIuYWRkRG9jdW1lbnRMaXN0ZW5lcihuZXcgVGVzdERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJCWFzc2VydEVxdWFscyhFdmVudFR5cGUuSU5TRVJULCBlLmdldFR5cGUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKERvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZG9jdW1lbnRBZGFwdGVyLCBlLmdldERvY3VtZW50KCkpOwotCQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgaW5zZXJ0IG9mICJ4eHh4eHgiCi0JCQkJYXNzZXJ0RXF1YWxzKDIsIGUuZ2V0T2Zmc2V0KCkpOwotCQkJCWFzc2VydEVxdWFscyg1LCBlLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLmluc2VydFN0cmluZygyLCAieHh4eHgiLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoIjAxeHh4eHgyMzQ1Njc4OSIsIHRoaXMuc3RyaW5nSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIuYWRkRG9jdW1lbnRMaXN0ZW5lcihuZXcgVGVzdERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJCWFzc2VydEVxdWFscyhFdmVudFR5cGUuSU5TRVJULCBlLmdldFR5cGUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKERvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZG9jdW1lbnRBZGFwdGVyLCBlLmdldERvY3VtZW50KCkpOwotCQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgaW5zZXJ0IG9mICJmb28iCi0JCQkJYXNzZXJ0RXF1YWxzKDAsIGUuZ2V0T2Zmc2V0KCkpOwotCQkJCWFzc2VydEVxdWFscygzLCBlLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQkJCWFzc2VydEVxdWFscyhFdmVudFR5cGUuUkVNT1ZFLCBlLmdldFR5cGUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKERvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZG9jdW1lbnRBZGFwdGVyLCBlLmdldERvY3VtZW50KCkpOwotCQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgcmVtb3ZhbCBvZiAiMDEyMzQ1Njc4OSIKLQkJCQlhc3NlcnRFcXVhbHMoMCwgZS5nZXRPZmZzZXQoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDEwLCBlLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OSIsIHRoaXMuZG9jdW1lbnRBZGFwdGVyLmdldFRleHQoMCwgdGhpcy5kb2N1bWVudEFkYXB0ZXIuZ2V0TGVuZ3RoKCkpKTsKLQkJdGhpcy5zdHJpbmdIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5kb2N1bWVudEFkYXB0ZXIuZ2V0VGV4dCgwLCB0aGlzLmRvY3VtZW50QWRhcHRlci5nZXRMZW5ndGgoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbG9jYWxTdHJpbmdIb2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4pIHRoaXMuc3RyaW5nSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbFN0cmluZ0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmRvY3VtZW50QWRhcHRlcik7Ci0KLQkJRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0RG9jdW1lbnRMaXN0ZW5lcigpOwotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5hZGREb2N1bWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbFN0cmluZ0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5kb2N1bWVudEFkYXB0ZXIpOwotCi0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLnJlbW92ZURvY3VtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbFN0cmluZ0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmRvY3VtZW50QWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKE9iamVjdCBkb2N1bWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBkZWxlZ2F0ZSA9IENsYXNzVG9vbHMuZmllbGRWYWx1ZShkb2N1bWVudCwgImRlbGVnYXRlIik7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IChPYmplY3RbXSkgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKGRlbGVnYXRlLCAiZ2V0RG9jdW1lbnRMaXN0ZW5lcnMiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3RlbmVycy5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGRvY3VtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGRlbGVnYXRlID0gQ2xhc3NUb29scy5maWVsZFZhbHVlKGRvY3VtZW50LCAiZGVsZWdhdGUiKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gKE9iamVjdFtdKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QoZGVsZWdhdGUsICJnZXREb2N1bWVudExpc3RlbmVycyIpOwotCQlhc3NlcnRGYWxzZShsaXN0ZW5lcnMubGVuZ3RoID09IDApOwotCX0KLQotCi1wcml2YXRlIGNsYXNzIFRlc3REb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgRG9jdW1lbnRMaXN0ZW5lciB7Ci0JVGVzdERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCXB1YmxpYyB2b2lkIGNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQl9Ci0JcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOGI0ZWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuQWJzdHJhY3REb2N1bWVudDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkF0dHJpYnV0ZVNldDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5QbGFpbkRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiBlbnRyeSBmaWVsZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEFkYXB0ZXJVSVRlc3QgewotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9OQU1FID0gIlNjb29ieSBEb28iOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG5hbWVIb2xkZXI7Ci0JcHJpdmF0ZSBEb2N1bWVudCBuYW1lRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBEb2N1bWVudCB1cHBlckNhc2VOYW1lRG9jdW1lbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IERvY3VtZW50QWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWMoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbChERUZBVUxUX05BTUUpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMubmFtZUhvbGRlciA9IHRoaXMuYnVpbGROYW1lSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5uYW1lRG9jdW1lbnQgPSB0aGlzLmJ1aWxkTmFtZURvY3VtZW50KHRoaXMubmFtZUhvbGRlcik7Ci0JCXRoaXMudXBwZXJDYXNlTmFtZURvY3VtZW50ID0gdGhpcy5idWlsZFVwcGVyQ2FzZU5hbWVEb2N1bWVudCh0aGlzLm5hbWVIb2xkZXIpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPih2bSwgVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IGJ1aWxkTmFtZURvY3VtZW50KFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgRG9jdW1lbnRBZGFwdGVyKHN0cmluZ0hvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudCBidWlsZFVwcGVyQ2FzZU5hbWVEb2N1bWVudChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcikgewotCQlyZXR1cm4gbmV3IERvY3VtZW50QWRhcHRlcihzdHJpbmdIb2xkZXIsIHRoaXMuYnVpbGRVcHBlckNhc2VOYW1lRG9jdW1lbnREZWxlZ2F0ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0RG9jdW1lbnQgYnVpbGRVcHBlckNhc2VOYW1lRG9jdW1lbnREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIG5ldyBQbGFpbkRvY3VtZW50KCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpbnNlcnRTdHJpbmcoaW50IG9mZnNldCwgU3RyaW5nIHN0cmluZywgQXR0cmlidXRlU2V0IGEpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJY2hhcltdIHVwcGVyID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cHBlci5sZW5ndGg7IGkrKykgewotCQkJCQl1cHBlcltpXSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSh1cHBlcltpXSk7Ci0JCQkJfQotCQkJCXN1cGVyLmluc2VydFN0cmluZyhvZmZzZXQsIG5ldyBTdHJpbmcodXBwZXIpLCBhKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRTaXplKDQwMCwgMTAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFRleHRGaWVsZFBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkVGV4dEZpZWxkUGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVhZE9ubHlOYW1lVGV4dEZpZWxkKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkVXBwZXJDYXNlTmFtZVRleHRGaWVsZCgpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKVGV4dEZpZWxkIGJ1aWxkTmFtZVRleHRGaWVsZCgpIHsKLQkJcmV0dXJuIG5ldyBKVGV4dEZpZWxkKHRoaXMubmFtZURvY3VtZW50LCBudWxsLCAwKTsKLQl9Ci0KLQlwcml2YXRlIEpUZXh0RmllbGQgYnVpbGRSZWFkT25seU5hbWVUZXh0RmllbGQoKSB7Ci0JCUpUZXh0RmllbGQgbmFtZVRleHRGaWVsZCA9IHRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKCk7Ci0JCW5hbWVUZXh0RmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlyZXR1cm4gbmFtZVRleHRGaWVsZDsKLQl9Ci0KLQlwcml2YXRlIEpUZXh0RmllbGQgYnVpbGRVcHBlckNhc2VOYW1lVGV4dEZpZWxkKCkgewotCQlyZXR1cm4gbmV3IEpUZXh0RmllbGQodGhpcy51cHBlckNhc2VOYW1lRG9jdW1lbnQsIG51bGwsIDApOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0TmFtZUJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKCkpOwotCQlyZXR1cm4gY29udHJvbFBhbmVsOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc2V0TmFtZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldE5hbWVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXNldE5hbWVBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc2V0IG5hbWUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXNldE5hbWUoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldE5hbWUoREVGQVVMVF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCURvY3VtZW50QWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXN0b3JlIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicHJpbnQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJuYW1lOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmdldE5hbWUoKSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9KcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MzFiZDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9KcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbWJvQm94TW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEb2N1bWVudEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXN0TW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRhYmxlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJlZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ODhlNWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLkNvb3JkaW5hdGVkTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIExpc3RNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBMaXN0TW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy8gbm90aGluZyB5ZXQuLi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBub3RoaW5nIHlldC4uLgotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsQWRhcHRlciBidWlsZExpc3RNb2RlbChMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKGxpc3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZExpc3RNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwoY29sbGVjdGlvbkhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQoInRvbSIpOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCgiZGljayIpOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCgiaGFycnkiKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscygxMCwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiamFyIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJoYXJyeSIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChsaXN0SG9sZGVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLmFkZCg2LCAidG9tIik7Ci0JCWxpc3RIb2xkZXIuYWRkKDcsICJkaWNrIik7Ci0JCWxpc3RIb2xkZXIuYWRkKDgsICJoYXJyeSIpOwotCQlsaXN0SG9sZGVyLmFkZCg5LCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg5KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNb2RlbCgpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyMSA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RNb2RlbEFkYXB0ZXIgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChsaXN0SG9sZGVyMSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIxLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcjIoKTsKLQkJbGlzdE1vZGVsLnNldE1vZGVsKGxpc3RIb2xkZXIyKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIxLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlsaXN0TW9kZWwuc2V0TW9kZWwobmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyMS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyMi5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0TW9kZWwgbGlzdE1vZGVsLCBMaXN0PFN0cmluZz4gbGlzdCkgewotCQlhc3NlcnRFcXVhbHMobGlzdE1vZGVsLmdldFNpemUoKSwgbGlzdC5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RNb2RlbC5nZXRTaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGxpc3RNb2RlbC5nZXRFbGVtZW50QXQoaSksIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU29ydCgpIHsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uU29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdFNvcnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUNvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21MaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydCh0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZEN1c3RvbUNvbXBhcmF0b3IoKSB7Ci0JCS8vIHNvcnQgd2l0aCByZXZlcnNlIG9yZGVyCi0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCQkJcmV0dXJuIHMyLmNvbXBhcmVUbyhzMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25Tb3J0KENvbXBhcmF0b3I8U3RyaW5nPiBjb21wYXJhdG9yKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPihjb2xsZWN0aW9uSG9sZGVyLCBjb21wYXJhdG9yKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdE1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJ0b20iKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQoImRpY2siKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQoImhhcnJ5Iik7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0TW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiamFyIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJoYXJyeSIpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdE1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0U29ydChDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvcikgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4obGlzdEhvbGRlciwgY29tcGFyYXRvcikpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLmFkZCgwLCAidG9tIik7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsICJkaWNrIik7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsICJoYXJyeSIpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdE1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDUpOwotCQlhc3NlcnRFcXVhbHMoNSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdE1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wYXJlU29ydChMaXN0TW9kZWwgbGlzdE1vZGVsLCBMaXN0PFN0cmluZz4gbGlzdCwgQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXBhcmF0b3IpIHsKLQkJU29ydGVkU2V0PFN0cmluZz4gc3MgPSBuZXcgVHJlZVNldDxTdHJpbmc+KGNvbXBhcmF0b3IpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RNb2RlbC5nZXRTaXplKCk7IGkrKykgewotCQkJc3MuYWRkKChTdHJpbmcpIGxpc3RNb2RlbC5nZXRFbGVtZW50QXQoaSkpOwotCQl9Ci0JCWFzc2VydEVxdWFscyhzcy5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTEgPSBzcy5pdGVyYXRvcigpLCBzdHJlYW0yID0gbGlzdC5pdGVyYXRvcigpOyBzdHJlYW0xLmhhc05leHQoKTsgKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyZWFtMS5uZXh0KCksIHN0cmVhbTIubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobGlzdEhvbGRlcik7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0KLQkJbGlzdE1vZGVsLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIoc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChsaXN0SG9sZGVyKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdE1vZGVsLmdldFNpemUoKSk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0TW9kZWwuZ2V0U2l6ZSgpKTsKLQotCQlsaXN0TW9kZWwucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihzeW5jaExpc3QpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0TW9kZWwuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudEF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPihsaXN0SG9sZGVyKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGxpc3RNb2RlbC5nZXRFbGVtZW50QXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHN5bmNoTGlzdC5nZXQoMCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0TW9kZWwgbGlzdE1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNOb0xpc3RlbmVycyA9ICgoQm9vbGVhbikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKGxpc3RNb2RlbCwgImhhc05vTGlzdERhdGFMaXN0ZW5lcnMiKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoaGFzTm9MaXN0ZW5lcnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoTGlzdE1vZGVsIGxpc3RNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gaGFzTGlzdGVuZXJzID0gKChCb29sZWFuKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QobGlzdE1vZGVsLCAiaGFzTGlzdERhdGFMaXN0ZW5lcnMiKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoaGFzTGlzdGVuZXJzKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlCYWc8U3RyaW5nPiBiYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGJhZyk7Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24obGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxTdHJpbmc+IGMpIHsKLQkJYy5hZGQoImZvbyIpOwotCQljLmFkZCgiYmFyIik7Ci0JCWMuYWRkKCJiYXoiKTsKLQkJYy5hZGQoImpvbyIpOwotCQljLmFkZCgiamFyIik7Ci0JCWMuYWRkKCJqYXoiKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMaXN0SG9sZGVyMigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0MigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QyKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbjIobGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24yKENvbGxlY3Rpb248U3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJ0b20iKTsKLQkJYy5hZGQoImRpY2siKTsKLQkJYy5hZGQoImhhcnJ5Iik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2ViYzFmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuVGV4dEZpZWxkOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogYW4gZXhhbXBsZSBVSSBmb3IgdGVzdGluZyB2YXJpb3VzIHBlcm11dGF0aW9ucyBvZiB0aGUgTGlzdE1vZGVsQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgTGlzdE1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0PiB0YXNrTGlzdEhvbGRlcjsKLQlwcml2YXRlIFRleHRGaWVsZCB0YXNrVGV4dEZpZWxkOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBMaXN0TW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYyhhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWMoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0PihuZXcgVGFza0xpc3QoKSk7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoODAwLCA0MDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkVGFza0xpc3RQYW5lbCgpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRUYXNrTGlzdFBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMCwgMSkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZERpc3BsYXlhYmxlVGFza0xpc3RQYW5lbCgpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRQcmltaXRpdmVUYXNrTGlzdFBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbCgpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0UGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRVbnNvcnRlZERpc3BsYXlhYmxlTGlzdFBhbmVsKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWREaXNwbGF5YWJsZUxpc3RQYW5lbCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEN1c3RvbVNvcnRlZERpc3BsYXlhYmxlTGlzdFBhbmVsKCkpOwotCQlyZXR1cm4gdGFza0xpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RQYW5lbCgicHJpbWl0aXZlIHVuc29ydGVkIiwgdGhpcy5idWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJwcmltaXRpdmUgc29ydGVkIiwgdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RQYW5lbCgicHJpbWl0aXZlIHJldmVyc2Ugc29ydGVkIiwgdGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFVuc29ydGVkRGlzcGxheWFibGVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJkaXNwbGF5YWJsZSB1bnNvcnRlZCIsIHRoaXMuYnVpbGRVbnNvcnRlZERpc3BsYXlhYmxlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkU3RhbmRhcmRTb3J0ZWREaXNwbGF5YWJsZUxpc3RQYW5lbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0UGFuZWwoImRpc3BsYXlhYmxlIHNvcnRlZCIsIHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZERpc3BsYXlhYmxlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ3VzdG9tU29ydGVkRGlzcGxheWFibGVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJkaXNwbGF5YWJsZSByZXZlcnNlIHNvcnRlZCIsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSkpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSkpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkVW5zb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZFN0YW5kYXJkU29ydGVkRGlzcGxheWFibGVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFRhc2s+KHRoaXMuYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0QWRhcHRlcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRDdXN0b21Tb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8VGFzaz4odGhpcy5idWlsZERpc3BsYXlhYmxlVGFza0xpc3RBZGFwdGVyKCksIHRoaXMuYnVpbGRDdXN0b21UYXNrT2JqZWN0Q29tcGFyYXRvcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRMaXN0UGFuZWwoU3RyaW5nIGxhYmVsLCBMaXN0TW9kZWwgbGlzdE1vZGVsKSB7Ci0JCUpQYW5lbCBsaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCUpMYWJlbCBsaXN0TGFiZWwgPSBuZXcgSkxhYmVsKCIgICIgKyBsYWJlbCk7Ci0JCWxpc3RQYW5lbC5hZGQobGlzdExhYmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCi0JCUpMaXN0IGxpc3RCb3ggPSBuZXcgSkxpc3QoKTsKLQkJbGlzdEJveC5zZXRNb2RlbChsaXN0TW9kZWwpOwotCQlsaXN0Qm94LnNldERvdWJsZUJ1ZmZlcmVkKHRydWUpOwotCQlsaXN0TGFiZWwuc2V0TGFiZWxGb3IobGlzdEJveCk7Ci0JCWxpc3RQYW5lbC5hZGQobmV3IEpTY3JvbGxQYW5lKGxpc3RCb3gpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJcmV0dXJuIGxpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCQkJcmV0dXJuIHMyLmNvbXBhcmVUbyhzMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFRhc2s+IGJ1aWxkQ3VzdG9tVGFza09iamVjdENvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxUYXNrPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShUYXNrIHRvMSwgVGFzayB0bzIpIHsKLQkJCQlyZXR1cm4gdG8yLmNvbXBhcmVUbyh0bzEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgU3RyaW5nPihUYXNrTGlzdC5UQVNLX05BTUVTX0xJU1QsIHRoaXMudGFza0xpc3QoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhc2tOYW1lcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgVGFzaz4oVGFza0xpc3QuVEFTS1NfTElTVCwgdGhpcy50YXNrTGlzdCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8VGFzaz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDb250cm9sUGFuZWwoKSB7Ci0JCUpQYW5lbCBjb250cm9sUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZEFkZFJlbW92ZVRhc2tQYW5lbCgpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2xlYXJCdXR0b24oKSwgQm9yZGVyTGF5b3V0LkVBU1QpOwotCQlyZXR1cm4gY29udHJvbFBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQWRkUmVtb3ZlVGFza1BhbmVsKCkgewotCQlKUGFuZWwgYWRkUmVtb3ZlVGFza1BhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQlhZGRSZW1vdmVUYXNrUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRCdXR0b24oKSwgQm9yZGVyTGF5b3V0LldFU1QpOwotCQlhZGRSZW1vdmVUYXNrUGFuZWwuYWRkKHRoaXMuYnVpbGRUYXNrVGV4dEZpZWxkKCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQlhZGRSZW1vdmVUYXNrUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW1vdmVCdXR0b24oKSwgQm9yZGVyTGF5b3V0LkVBU1QpOwotCQlyZXR1cm4gYWRkUmVtb3ZlVGFza1BhbmVsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFRhc2soKSB7Ci0JCXJldHVybiB0aGlzLnRhc2tUZXh0RmllbGQuZ2V0VGV4dCgpOwotCX0KLQotCXByaXZhdGUgVGFza0xpc3QgdGFza0xpc3QoKSB7Ci0JCXJldHVybiB0aGlzLnRhc2tMaXN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0Jdm9pZCBhZGRUYXNrKCkgewotCQlTdHJpbmcgdGFzayA9IHRoaXMuZ2V0VGFzaygpOwotCQlpZiAodGFzay5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnRhc2tMaXN0KCkuYWRkVGFzayh0YXNrKTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVGFzaygpIHsKLQkJU3RyaW5nIHRhc2sgPSB0aGlzLmdldFRhc2soKTsKLQkJaWYgKHRhc2subGVuZ3RoKCkgIT0gMCkgewotCQkJdGhpcy50YXNrTGlzdCgpLnJlbW92ZVRhc2sodGFzayk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNsZWFyVGFza3MoKSB7Ci0JCXRoaXMudGFza0xpc3QoKS5jbGVhclRhc2tzKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0RmllbGQgYnVpbGRUYXNrVGV4dEZpZWxkKCkgewotCQl0aGlzLnRhc2tUZXh0RmllbGQgPSBuZXcgVGV4dEZpZWxkKCk7Ci0JCXJldHVybiB0aGlzLnRhc2tUZXh0RmllbGQ7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQWRkQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZEFkZEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZEFkZEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiYWRkIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZFRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVtb3ZlQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlbW92ZUFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlbW92ZUFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVtb3ZlIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlbW92ZVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQ2xlYXJCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhckFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiY2xlYXIiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJUYXNrcygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhc2tMaXN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHRhc2tOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlwcml2YXRlIExpc3Q8VGFzaz4gdGFza09iamVjdHMgPSBuZXcgQXJyYXlMaXN0PFRhc2s+KCk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTkFNRVNfTElTVCA9ICJ0YXNrTmFtZXMiOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU19MSVNUID0gInRhc2tzIjsKLQkJVGFza0xpc3QoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YXNrTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrTmFtZXMubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxUYXNrPiB0YXNrcygpIHsKLQkJCXJldHVybiB0aGlzLnRhc2tPYmplY3RzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZFRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLnRhc2tOYW1lcy5zaXplKCk7Ci0JCQl0aGlzLnRhc2tOYW1lcy5hZGQoaW5kZXgsIHRhc2tOYW1lKTsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChUQVNLX05BTUVTX0xJU1QsIGluZGV4LCB0YXNrTmFtZSk7Ci0JCi0JCQlUYXNrIHRhc2tPYmplY3QgPSBuZXcgVGFzayh0YXNrTmFtZSk7Ci0JCQl0aGlzLnRhc2tPYmplY3RzLmFkZChpbmRleCwgdGFza09iamVjdCk7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoVEFTS1NfTElTVCwgaW5kZXgsIHRhc2tPYmplY3QpOwotCQl9CQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlVGFzayhTdHJpbmcgdGFza05hbWUpIHsKLQkJCWludCBpbmRleCA9IHRoaXMudGFza05hbWVzLmluZGV4T2YodGFza05hbWUpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJT2JqZWN0IHJlbW92ZWRUYXNrID0gdGhpcy50YXNrTmFtZXMucmVtb3ZlKGluZGV4KTsKLQkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChUQVNLX05BTUVTX0xJU1QsIGluZGV4LCByZW1vdmVkVGFzayk7Ci0JCQkJLy8gYXNzdW1lIHRoZSBpbmRleGVzIG1hdGNoLi4uCi0JCQkJT2JqZWN0IHJlbW92ZWRUYXNrT2JqZWN0ID0gdGhpcy50YXNrT2JqZWN0cy5yZW1vdmUoaW5kZXgpOwotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFRBU0tTX0xJU1QsIGluZGV4LCByZW1vdmVkVGFza09iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJUYXNrcygpIHsKLQkJCXRoaXMudGFza05hbWVzLmNsZWFyKCk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChUQVNLX05BTUVTX0xJU1QpOwotCQkJdGhpcy50YXNrT2JqZWN0cy5jbGVhcigpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVEFTS1NfTElTVCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhc2sgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIERhdGUgY3JlYXRpb25UaW1lU3RhbXA7Ci0JCXB1YmxpYyBUYXNrKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5jcmVhdGlvblRpbWVTdGFtcCA9IG5ldyBEYXRlKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZSArICI6ICIgKyB0aGlzLmNyZWF0aW9uVGltZVN0YW1wLmdldFRpbWUoKTsKLQkJfQotCQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIGludCBjb21wYXJlVG8oRGlzcGxheWFibGUgbykgewotCQkJcmV0dXJuIERFRkFVTFRfQ09NUEFSQVRPUi5jb21wYXJlKHRoaXMsIG8pOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZTgyNTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0U3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcjsKLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBzcGlubmVyTW9kZWxBZGFwdGVyOwotCWJvb2xlYW4gZXZlbnRGaXJlZDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxVRV9MSVNUID0geyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJ9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZBTFVFID0gVkFMVUVfTElTVFswXTsKLQotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4oREVGQVVMVF9WQUxVRSk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciA9IG5ldyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLnZhbHVlSG9sZGVyLCBWQUxVRV9MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVNwaW5uZXJNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKERFRkFVTFRfVkFMVUUsIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5zZXRWYWx1ZShWQUxVRV9MSVNUWzJdKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoVkFMVUVfTElTVFsyXSwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVWYWx1ZUhvbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKERFRkFVTFRfVkFMVUUsIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShWQUxVRV9MSVNUWzJdKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoVkFMVUVfTElTVFsyXSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhERUZBVUxUX1ZBTFVFLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShWQUxVRV9MSVNUWzJdKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoVkFMVUVfTElTVFsyXSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhWQUxVRV9MSVNUWzBdLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBsb2NhbFZhbHVlSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KSB0aGlzLnZhbHVlSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKFNwaW5uZXJNb2RlbCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIpIGFkYXB0ZXIpLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhPYmplY3QgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKCgoTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIpIGFkYXB0ZXIpLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODVkMjgxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gdmFsdWVIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgc3Bpbm5lck1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4obmV3IEludGVnZXIoMCkpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLnZhbHVlSG9sZGVyLCAtMzMsIDMzLCAxKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3Bpbm5lck1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig1KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUpLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVZhbHVlSG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDcpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNyksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigtMzMpLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBsb2NhbFZhbHVlSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+KSB0aGlzLnZhbHVlSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKFNwaW5uZXJNb2RlbCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcikgYWRhcHRlcikuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoKChOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxJbml0aWFsVmFsdWUoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4oKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyID0gbmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlciwgbmV3IEludGVnZXIoLTMzKSwgbmV3IEludGVnZXIoMzMpLCBuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoMCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZE51bWJlckNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCi0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDcpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNyksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCXByaXZhdGUgY2xhc3MgVGVzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzNTA2OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL09iamVjdExpc3RTZWxlY3Rpb25Nb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkRlZmF1bHRMaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25FdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgRGVmYXVsdExpc3RNb2RlbCBsaXN0TW9kZWw7Ci0JcHJpdmF0ZSBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgc2VsZWN0aW9uTW9kZWw7Ci0KLQlwdWJsaWMgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKCk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwgPSB0aGlzLmJ1aWxkU2VsZWN0aW9uTW9kZWwodGhpcy5saXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgRGVmYXVsdExpc3RNb2RlbCBidWlsZExpc3RNb2RlbCgpIHsKLQkJRGVmYXVsdExpc3RNb2RlbCBsbSA9IG5ldyBEZWZhdWx0TGlzdE1vZGVsKCk7Ci0JCWxtLmFkZEVsZW1lbnQoImZvbyIpOwotCQlsbS5hZGRFbGVtZW50KCJiYXIiKTsKLQkJbG0uYWRkRWxlbWVudCgiYmF6Iik7Ci0JCXJldHVybiBsbTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBidWlsZFNlbGVjdGlvbk1vZGVsKExpc3RNb2RlbCBsbSkgewotCQlyZXR1cm4gbmV3IE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbChsbSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0RGF0YUxpc3RlbmVyKCkgewotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGlvbkludGVydmFsKDAsIDApOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpKTsKLQkJdGhpcy5saXN0TW9kZWwuc2V0KDAsICJqYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXIiLCB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uSW50ZXJ2YWwoMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTZWxlY3RlZFZhbHVlcygpIHsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3Rpb25JbnRlcnZhbCgwLCAwKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3Rpb25JbnRlcnZhbCgyLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCksICJmb28iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSwgImJheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VsZWN0ZWRWYWx1ZSgpIHsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1heFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZWxlY3RlZFZhbHVlcygpIHsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJmb28iLCAiYmF6In0pOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRWYWx1ZSgiamF6Iik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgwKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgzKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDQpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNlbGVjdGVkVmFsdWVzKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpheiIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoImZvbyIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGVkVmFsdWVzKG5ldyBPYmplY3RbXSB7ImJhciIsICJqYXIifSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgwKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg0KSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXoiKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJmb28iLCAiYmF6IiwgImphciJ9KTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5yZW1vdmVTZWxlY3RlZFZhbHVlKCJqYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1heFNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDApKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg0KSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiZm9vIiwgImJheiIsICJqb28iLCAiamFyIn0pOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnJlbW92ZVNlbGVjdGVkVmFsdWVzKG5ldyBPYmplY3RbXSB7ImZvbyIsICJqb28ifSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgxKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgzKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFuY2hvclNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgoMSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRBbmNob3JTZWxlY3RlZFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMZWFkU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldExlYWRTZWxlY3RlZFZhbHVlKCkpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWVzKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXoifSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRMZWFkU2VsZWN0ZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWluTWF4U2VsZWN0ZWRWYWx1ZSgpIHsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXoiKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKCJmb28iKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJiYXIiLCAiamFyIn0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWluU2VsZWN0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXIiLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1heFNlbGVjdGVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlSXNTZWxlY3RlZCgpIHsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXoiKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKCJmb28iKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJiYXIiLCAiamFyIn0pOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwudmFsdWVJc1NlbGVjdGVkKCJmb28iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC52YWx1ZUlzU2VsZWN0ZWQoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLnZhbHVlSXNTZWxlY3RlZCgiamFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLnZhbHVlSXNTZWxlY3RlZCgiYmF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5saXN0TW9kZWwuZ2V0TGlzdERhdGFMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmxpc3RNb2RlbC5nZXRMaXN0RGF0YUxpc3RlbmVycygpLmxlbmd0aCk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwucmVtb3ZlTGlzdFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdE1vZGVsLmdldExpc3REYXRhTGlzdGVuZXJzKCkubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RTZWxlY3Rpb25MaXN0ZW5lciBidWlsZExpc3RTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoTGlzdFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nIGZvciBub3cuLi4KLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1ByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjllMjAwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0TXV0YWJsZVRyZWVOb2RlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuUHJpbWl0aXZlTGlzdFRyZWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCVRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JcHJpdmF0ZSBUcmVlTW9kZWwgdHJlZU1vZGVsOwotCi0JcHVibGljIFByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnRlc3RNb2RlbCA9IHRoaXMuYnVpbGRUZXN0TW9kZWwoKTsKLQkJdGhpcy50cmVlTW9kZWwgPSB0aGlzLmJ1aWxkVHJlZU1vZGVsKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgYnVpbGRUZXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgVGVzdE1vZGVsKCk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTW9kZWwgYnVpbGRUcmVlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJpbWl0aXZlTGlzdFRyZWVNb2RlbCh0aGlzLmJ1aWxkTGlzdFZhbHVlTW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcmltaXRpdmVDaGFuZ2VkKGludCBpbmRleCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQkJaWYgKCAhIG5ld1ZhbHVlLmVxdWFscygiIikpIHsKLQkJCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLnRoaXMudGVzdE1vZGVsLnJlcGxhY2VOYW1lKGluZGV4LCAoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Pz4gYnVpbGRMaXN0VmFsdWVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIFN0cmluZz4oVGVzdE1vZGVsLk5BTUVTX0xJU1QsIHRoaXMudGVzdE1vZGVsKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZXMoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXQoaW50IGluZGV4KSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKGluZGV4KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBzaXplKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcmltaXRpdmUoKSB7Ci0JCXRoaXMudHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0luc2VydGVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMudGhpcy52ZXJpZnlUcmVlTW9kZWxFdmVudChlLCBuZXcgaW50W10gezB9LCBuZXcgU3RyaW5nW10geyJmb28ifSk7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJmb28iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJpbWl0aXZlKCkgewotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJmb28iKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiYmFyIik7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImJheiIpOwotCQl0aGlzLnRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNSZW1vdmVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMudGhpcy52ZXJpZnlUcmVlTW9kZWxFdmVudChlLCBuZXcgaW50W10gezF9LCBuZXcgU3RyaW5nW10geyJiYXIifSk7Ci0JCQl9Ci0JCX0pOwotCQlTdHJpbmcgbmFtZSA9IHRoaXMudGVzdE1vZGVsLnJlbW92ZU5hbWUoMSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgbmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VQcmltaXRpdmUoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImZvbyIpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJiYXIiKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiYmF6Iik7Ci0JCXRoaXMudHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0NoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy50aGlzLnZlcmlmeVRyZWVNb2RlbEV2ZW50KGUsIG5ldyBpbnRbXSB7MX0sIG5ldyBTdHJpbmdbXSB7ImphciJ9KTsKLQkJCX0KLQkJfSk7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy50ZXN0TW9kZWwucmVwbGFjZU5hbWUoMSwgImphciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG5hbWUpOwotCX0KLQotCXZvaWQgdmVyaWZ5VHJlZU1vZGVsRXZlbnQoVHJlZU1vZGVsRXZlbnQgZSwgaW50W10gZXhwZWN0ZWRDaGlsZEluZGljZXMsIFN0cmluZ1tdIGV4cGVjdGVkTmFtZXMpIHsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkQ2hpbGRJbmRpY2VzLCBlLmdldENoaWxkSW5kaWNlcygpKSk7Ci0JCU9iamVjdFtdIGFjdHVhbENoaWxkcmVuID0gZS5nZXRDaGlsZHJlbigpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWROYW1lcy5sZW5ndGgsIGFjdHVhbENoaWxkcmVuLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWROYW1lcy5sZW5ndGg7IGkrKykgewotCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBub2RlID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpIGFjdHVhbENoaWxkcmVuW2ldOwotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTmFtZXNbaV0sIG5vZGUuZ2V0VXNlck9iamVjdCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMSwgZS5nZXRQYXRoKCkubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJlZU1vZGVsLmdldFJvb3QoKSwgZS5nZXRQYXRoKClbMF0pOwotCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCX0KLQotCi0vLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbmFtZXM7Ci0JCQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTX0xJU1QgPSAibmFtZXMiOwotCQotCQlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl9Ci0JCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBuYW1lcygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLm5hbWVzKTsKLQkJfQotCQlwdWJsaWMgaW50IG5hbWVzU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWVzLnNpemUoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lcy5nZXQoaW5kZXgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWUoaW50IGluZGV4LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBuYW1lLCB0aGlzLm5hbWVzLCBOQU1FU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmFkZE5hbWUodGhpcy5uYW1lc1NpemUoKSwgbmFtZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoaW50IGluZGV4LCBMaXN0PFN0cmluZz4gbGlzdCkgewotCQkJdGhpcy5hZGRJdGVtc1RvTGlzdChpbmRleCwgdGhpcy5uYW1lcywgbGlzdCwgTkFNRVNfTElTVCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJCXRoaXMuYWRkTmFtZXModGhpcy5uYW1lc1NpemUoKSwgbGlzdCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyByZW1vdmVOYW1lKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLm5hbWVzLCBOQU1FU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgTGlzdDxTdHJpbmc+IHJlbW92ZU5hbWVzKGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChpbmRleCwgbGVuZ3RoLCB0aGlzLm5hbWVzLCBOQU1FU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHJlcGxhY2VOYW1lKGludCBpbmRleCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJCXJldHVybiB0aGlzLnNldEl0ZW1Jbkxpc3QoaW5kZXgsIG5ld05hbWUsIHRoaXMubmFtZXMsIE5BTUVTX0xJU1QpOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyBjbGFzcyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBUcmVlTW9kZWxMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0NoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0luc2VydGVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNSZW1vdmVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlU3RydWN0dXJlQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MTdjNDUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIHJlZEJ1dHRvbk1vZGVsQWRhcHRlcjsKLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIHJlZExpc3RlbmVyOwotCWJvb2xlYW4gcmVkRXZlbnRGaXJlZDsKLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXI7Ci0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBncmVlbkxpc3RlbmVyOwotCWJvb2xlYW4gZ3JlZW5FdmVudEZpcmVkOwotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBibHVlQnV0dG9uTW9kZWxBZGFwdGVyOwotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYmx1ZUxpc3RlbmVyOwotCWJvb2xlYW4gYmx1ZUV2ZW50RmlyZWQ7Ci0KLS8vCXByaXZhdGUgQnV0dG9uR3JvdXAgYnV0dG9uR3JvdXA7CS8vIERPIE5PVCB1c2UgYSBCdXR0b25Hcm91cAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRCA9ICJyZWQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVFTiA9ICJncmVlbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUUgPSAiYmx1ZSI7Ci0KLQlwdWJsaWMgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KG51bGwpOwotLy8JCWJ1dHRvbkdyb3VwID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0KLQkJdGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIgPSB0aGlzLmJ1aWxkQnV0dG9uTW9kZWwodGhpcy52YWx1ZUhvbGRlciwgUkVEKTsKLS8vCQl0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5zZXRHcm91cChidXR0b25Hcm91cCk7Ci0JCXRoaXMucmVkTGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCVJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5yZWRFdmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfTsKLQotCQl0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyID0gdGhpcy5idWlsZEJ1dHRvbk1vZGVsKHRoaXMudmFsdWVIb2xkZXIsIEdSRUVOKTsKLS8vCQl0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLnNldEdyb3VwKGJ1dHRvbkdyb3VwKTsKLQkJdGhpcy5ncmVlbkxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZ3JlZW5FdmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfTsKLQotCQl0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIgPSB0aGlzLmJ1aWxkQnV0dG9uTW9kZWwodGhpcy52YWx1ZUhvbGRlciwgQkxVRSk7Ci0vLwkJdGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLnNldEdyb3VwKGJ1dHRvbkdyb3VwKTsKLQkJdGhpcy5ibHVlTGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCVJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ibHVlRXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0JCQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1aWxkQnV0dG9uTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBwdm0sIE9iamVjdCBidXR0b25WYWx1ZSkgewotCQlyZXR1cm4gbmV3IFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKHB2bSwgYnV0dG9uVmFsdWUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxpc3RlblRvTW9kZWxBZGFwdGVycygpIHsKLQkJdGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5yZWRMaXN0ZW5lcik7Ci0JCXRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5ncmVlbkxpc3RlbmVyKTsKLQkJdGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYmx1ZUxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJGbGFncygpIHsKLQkJdGhpcy5yZWRFdmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuZ3JlZW5FdmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuYmx1ZUV2ZW50RmlyZWQgPSBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNlbGVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMubGlzdGVuVG9Nb2RlbEFkYXB0ZXJzKCk7Ci0KLQkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoR1JFRU4sIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JCXRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhCTFVFLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCQl0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhSRUQsIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMubGlzdGVuVG9Nb2RlbEFkYXB0ZXJzKCk7Ci0KLQkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5zZXRTZWxlY3RlZCh0cnVlKTsKLQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShCTFVFKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShSRUQpOwotCQlhc3NlcnRUcnVlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZ3JlZW5FdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJsdWVFdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5saXN0ZW5Ub01vZGVsQWRhcHRlcnMoKTsKLQotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKEdSRUVOKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuZ3JlZW5FdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ibHVlRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0KLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoQkxVRSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZ3JlZW5FdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJsdWVFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCi0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoT2JqZWN0IG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gKEV2ZW50TGlzdGVuZXJMaXN0KSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUobW9kZWwsICJsaXN0ZW5lckxpc3QiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gKEV2ZW50TGlzdGVuZXJMaXN0KSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUobW9kZWwsICJsaXN0ZW5lckxpc3QiKTsKLQkJYXNzZXJ0RmFsc2UobGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1NzI1Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KUmFkaW9CdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5SYWRpb0J1dHRvbk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIHJhZGlvIGJ1dHRvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHRlc3RNb2RlbEhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gY29sb3JIb2xkZXI7Ci0JcHJpdmF0ZSBCdXR0b25Nb2RlbCByZWRCdXR0b25Nb2RlbDsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGdyZWVuQnV0dG9uTW9kZWw7Ci0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBibHVlQnV0dG9uTW9kZWw7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYyhhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCQl0aGlzLmNvbG9ySG9sZGVyID0gdGhpcy5idWlsZENvbG9ySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5yZWRCdXR0b25Nb2RlbCA9IHRoaXMuYnVpbGRSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcih0aGlzLmNvbG9ySG9sZGVyLCBUZXN0TW9kZWwuUkVEKTsKLQkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsID0gdGhpcy5idWlsZFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKHRoaXMuY29sb3JIb2xkZXIsIFRlc3RNb2RlbC5HUkVFTik7Ci0JCXRoaXMuYmx1ZUJ1dHRvbk1vZGVsID0gdGhpcy5idWlsZFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKHRoaXMuY29sb3JIb2xkZXIsIFRlc3RNb2RlbC5CTFVFKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkQ29sb3JIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE9iamVjdD4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLkNPTE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPYmplY3QgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb2xvcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldENvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1aWxkUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBjb2xvclBWTSwgU3RyaW5nIGNvbG9yKSB7Ci0JCXJldHVybiBuZXcgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIoY29sb3JQVk0sIGNvbG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRTaXplKDQwMCwgMTAwKTsKLQkJd2luZG93LnNldExvY2F0aW9uKDIwMCwgMjAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFJhZGlvQnV0dG9uUGFuZWwoKSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRSYWRpb0J1dHRvblBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVkUmFkaW9CdXR0b24oKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRHcmVlblJhZGlvQnV0dG9uKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkQmx1ZVJhZGlvQnV0dG9uKCkpOwotCQlyZXR1cm4gdGFza0xpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpSYWRpb0J1dHRvbiBidWlsZFJlZFJhZGlvQnV0dG9uKCkgewotCQlKUmFkaW9CdXR0b24gcmFkaW9CdXR0b24gPSBuZXcgSlJhZGlvQnV0dG9uKCk7Ci0JCXJhZGlvQnV0dG9uLnNldFRleHQoInJlZCIpOwotCQlyYWRpb0J1dHRvbi5zZXRNb2RlbCh0aGlzLnJlZEJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIHJhZGlvQnV0dG9uOwotCX0KLQotCXByaXZhdGUgSlJhZGlvQnV0dG9uIGJ1aWxkR3JlZW5SYWRpb0J1dHRvbigpIHsKLQkJSlJhZGlvQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigpOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0KCJncmVlbiIpOwotCQlyYWRpb0J1dHRvbi5zZXRNb2RlbCh0aGlzLmdyZWVuQnV0dG9uTW9kZWwpOwotCQlyZXR1cm4gcmFkaW9CdXR0b247Ci0JfQotCi0JcHJpdmF0ZSBKUmFkaW9CdXR0b24gYnVpbGRCbHVlUmFkaW9CdXR0b24oKSB7Ci0JCUpSYWRpb0J1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oKTsKLQkJcmFkaW9CdXR0b24uc2V0VGV4dCgiYmx1ZSIpOwotCQlyYWRpb0J1dHRvbi5zZXRNb2RlbCh0aGlzLmJsdWVCdXR0b25Nb2RlbCk7Ci0JCXJldHVybiByYWRpb0J1dHRvbjsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXNldENvbG9yQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24oKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXRDb2xvckJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldENvbG9yQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXRDb2xvckFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQgY29sb3IiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc2V0Q29sb3IoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXNldENvbG9yKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXRDb2xvcihUZXN0TW9kZWwuREVGQVVMVF9DT0xPUik7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiY2xlYXIgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXN0b3JlIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgY29sb3I7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9QUk9QRVJUWSA9ICJjb2xvciI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUQgPSAicmVkIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUVOID0gImdyZWVuIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUUgPSAiYmx1ZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTE9SID0gUkVEOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxJRF9DT0xPUlMgPSB7Ci0JCQkJUkVELAotCQkJCUdSRUVOLAotCQkJCUJMVUUKLQkJCX07Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoKSB7Ci0JCQl0aGlzKERFRkFVTFRfQ09MT1IpOwotCQl9Ci0JCXB1YmxpYyBUZXN0TW9kZWwoU3RyaW5nIGNvbG9yKSB7Ci0JCQl0aGlzLmNvbG9yID0gY29sb3I7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRDb2xvcigpIHsKLQkJCXJldHVybiB0aGlzLmNvbG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKFN0cmluZyBjb2xvcikgewotCQkJaWYgKCAhIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhWQUxJRF9DT0xPUlMsIGNvbG9yKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29sb3IpOwotCQkJfQotCQkJT2JqZWN0IG9sZCA9IHRoaXMuY29sb3I7Ci0JCQl0aGlzLmNvbG9yID0gY29sb3I7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MT1JfUFJPUEVSVFksIG9sZCwgY29sb3IpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoIiArIHRoaXMuY29sb3IgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SZWFkT25seVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZmI2NmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SZWFkT25seVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UYWJsZU1vZGVsQWRhcHRlclRlc3RzLlBlcnNvbkNvbHVtbkFkYXB0ZXI7Ci0KLS8qKgotICogTWFrZSBpdCBlYXN5IHRvIHRlc3QgdGhlIHRhYmxlIG1vZGVsIGFkYXB0ZXIgYW5kCi0gKiByZW5kZXJlcnMgd2l0aG91dCBhbnkgZWRpdGluZyBhbGxvd2VkLgotICovCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCBleHRlbmRzIFRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlYWRPbmx5VGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbHVtbkFkYXB0ZXIgYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBlcnNvbkNvbHVtbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGNvbHVtbklzRWRpdGFibGUoaW50IGluZGV4KSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNGIwZWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCVNwaW5uZXJNb2RlbCBzcGlubmVyTW9kZWxBZGFwdGVyOwotCWJvb2xlYW4gZXZlbnRGaXJlZDsKLQotCXB1YmxpYyBTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PihuZXcgSW50ZWdlcigwKSk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciA9IG5ldyBTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMudmFsdWVIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkVmFsdWVMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3Bpbm5lck1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCQlhc3NlcnRFcXVhbHMoU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciwgZS5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuc2V0VmFsdWUobmV3IEludGVnZXIoNSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1KSwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVWYWx1ZUhvbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQkJYXNzZXJ0RXF1YWxzKFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIsIGUuZ2V0U291cmNlKCkpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDApLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobmV3IEludGVnZXIoNykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig3KSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhPYmplY3QgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBkZWxlZ2F0ZSA9IENsYXNzVG9vbHMuZmllbGRWYWx1ZShhZGFwdGVyLCAiZGVsZWdhdGUiKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gKE9iamVjdFtdKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QoZGVsZWdhdGUsICJnZXRDaGFuZ2VMaXN0ZW5lcnMiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3RlbmVycy5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgZGVsZWdhdGUgPSBDbGFzc1Rvb2xzLmZpZWxkVmFsdWUoYWRhcHRlciwgImRlbGVnYXRlIik7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IChPYmplY3RbXSkgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKGRlbGVnYXRlLCAiZ2V0Q2hhbmdlTGlzdGVuZXJzIik7Ci0JCWFzc2VydEZhbHNlKGxpc3RlbmVycy5sZW5ndGggPT0gMCk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzZlYzQ0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTcGlubmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRhdGVTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2Ygc3Bpbm5lcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXByaXZhdGUgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJpcnRoRGF0ZUhvbGRlcjsKLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBiaXJ0aERhdGVTcGlubmVyTW9kZWw7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gYWdlSG9sZGVyOwotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGFnZVNwaW5uZXJNb2RlbDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBleWVDb2xvckhvbGRlcjsKLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBleWVDb2xvclNwaW5uZXJNb2RlbDsKLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBTcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYyhhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWMoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0KLQkJdGhpcy5iaXJ0aERhdGVIb2xkZXIgPSB0aGlzLmJ1aWxkQmlydGhEYXRlSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5iaXJ0aERhdGVTcGlubmVyTW9kZWwgPSB0aGlzLmJ1aWxkQmlydGhEYXRlU3Bpbm5lck1vZGVsKHRoaXMuYmlydGhEYXRlSG9sZGVyKTsKLQotCQl0aGlzLmFnZUhvbGRlciA9IHRoaXMuYnVpbGRBZ2VIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmFnZVNwaW5uZXJNb2RlbCA9IHRoaXMuYnVpbGRBZ2VTcGlubmVyTW9kZWwodGhpcy5hZ2VIb2xkZXIpOwotCi0JCXRoaXMuZXllQ29sb3JIb2xkZXIgPSB0aGlzLmJ1aWxkRXllQ29sb3JIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmV5ZUNvbG9yU3Bpbm5lck1vZGVsID0gdGhpcy5idWlsZEV5ZUNvbG9yU3Bpbm5lck1vZGVsKHRoaXMuZXllQ29sb3JIb2xkZXIpOwotCi0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEJpcnRoRGF0ZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE9iamVjdD4odm0sIFRlc3RNb2RlbC5CSVJUSF9EQVRFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPYmplY3QgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRCaXJ0aERhdGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRCaXJ0aERhdGUoKERhdGUpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZEJpcnRoRGF0ZVNwaW5uZXJNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodmFsdWVIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBidWlsZEFnZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE51bWJlcj4odm0sIFRlc3RNb2RlbC5BR0VfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE51bWJlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIodGhpcy5zdWJqZWN0LmdldEFnZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE51bWJlciB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRBZ2UodmFsdWUuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRBZ2VTcGlubmVyTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiB2YWx1ZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIodmFsdWVIb2xkZXIsIHZhbHVlSG9sZGVyLmdldFZhbHVlKCkuaW50VmFsdWUoKSwgVGVzdE1vZGVsLk1JTl9BR0UsIFRlc3RNb2RlbC5NQVhfQUdFLCAxKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRFeWVDb2xvckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE9iamVjdD4odm0sIFRlc3RNb2RlbC5FWUVfQ09MT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9iamVjdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV5ZUNvbG9yKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RXllQ29sb3IoKFN0cmluZykgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkRXllQ29sb3JTcGlubmVyTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKHZhbHVlSG9sZGVyLCBUZXN0TW9kZWwuVkFMSURfRVlFX0NPTE9SUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coKSB7Ci0JCUpGcmFtZSB3aW5kb3cgPSBuZXcgSkZyYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQl3aW5kb3cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLQkJd2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJd2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl3aW5kb3cuc2V0U2l6ZSg2MDAsIDEwMCk7Ci0JCXdpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRTcGlubmVyUGFuZWwoKSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRTcGlubmVyUGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRCaXJ0aERhdGVTcGlubmVyKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkQWdlU3Bpbm5lcigpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEV5ZUNvbG9yU3Bpbm5lcigpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZEJpcnRoRGF0ZVNwaW5uZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNwaW5uZXIodGhpcy5iaXJ0aERhdGVTcGlubmVyTW9kZWwpOwotCX0KLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRBZ2VTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYWdlU3Bpbm5lck1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpTcGlubmVyIGJ1aWxkRXllQ29sb3JTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuZXllQ29sb3JTcGlubmVyTW9kZWwpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0TW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXNldE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc2V0TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXNldE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXNldCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzZXRNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0QmlydGhEYXRlKFRlc3RNb2RlbC5ERUZBVUxUX0JJUlRIX0RBVEUpOwotCQl0aGlzLnRlc3RNb2RlbC5zZXRFeWVDb2xvcihUZXN0TW9kZWwuREVGQVVMVF9FWUVfQ09MT1IpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXN0b3JlIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFByaW50TW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFByaW50TW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInByaW50IG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJpcnRoIGRhdGU6ICIgKyB0aGlzLnRlc3RNb2RlbC5nZXRCaXJ0aERhdGUoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYWdlOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0QWdlKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImV5ZXM6ICIgKyB0aGlzLnRlc3RNb2RlbC5nZXRFeWVDb2xvcigpKTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIENhbGVuZGFyIGJpcnRoQ2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJCS8vICJ2aXJ0dWFsIiBwcm9wZXJ0aWVzCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSVJUSF9EQVRFX1BST1BFUlRZID0gImJpcnRoRGF0ZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBR0VfUFJPUEVSVFkgPSAiYWdlIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgRGF0ZSBERUZBVUxUX0JJUlRIX0RBVEUgPSBuZXcgRGF0ZSgpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9BR0UgPSAwOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0FHRSA9IDA7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQUdFID0gMTUwOwotCQlwcml2YXRlIFN0cmluZyBleWVDb2xvcjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVZRV9DT0xPUl9QUk9QRVJUWSA9ICJleWVDb2xvciI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZBTElEX0VZRV9DT0xPUlMgPSB7ImJsdWUiLCAiYnJvd24iLCAiZ3JlZW4iLCAiaGF6ZWwiLCAicGluayJ9OwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWUVfQ09MT1IgPSBWQUxJRF9FWUVfQ09MT1JTWzNdOwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKCkgewotCQkJdGhpcyhERUZBVUxUX0JJUlRIX0RBVEUsIERFRkFVTFRfRVlFX0NPTE9SKTsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsKERhdGUgYmlydGhEYXRlLCBTdHJpbmcgZXllQ29sb3IpIHsKLQkJCXRoaXMuc2V0QmlydGhEYXRlKGJpcnRoRGF0ZSk7Ci0JCQl0aGlzLnNldEV5ZUNvbG9yKGV5ZUNvbG9yKTsKLQkJfQotCQlwdWJsaWMgRGF0ZSBnZXRCaXJ0aERhdGUoKSB7Ci0JCQlyZXR1cm4gKERhdGUpIHRoaXMuYmlydGhDYWwuZ2V0VGltZSgpLmNsb25lKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0QmlydGhEYXRlKERhdGUgYmlydGhEYXRlKSB7Ci0JCQlEYXRlIG9sZEJpcnRoRGF0ZSA9IHRoaXMuZ2V0QmlydGhEYXRlKCk7Ci0JCQlpbnQgb2xkQWdlID0gdGhpcy5nZXRBZ2UoKTsKLQkJCXRoaXMuYmlydGhDYWwuc2V0VGltZUluTWlsbGlzKGJpcnRoRGF0ZS5nZXRUaW1lKCkpOwotCQkJaW50IG5ld0FnZSA9IHRoaXMuZ2V0QWdlKCk7Ci0JCQlpZiAobmV3QWdlIDwgTUlOX0FHRSB8fCBuZXdBZ2UgPiBNQVhfQUdFKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihiaXJ0aERhdGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQklSVEhfREFURV9QUk9QRVJUWSwgb2xkQmlydGhEYXRlLCB0aGlzLmdldEJpcnRoRGF0ZSgpKTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBR0VfUFJPUEVSVFksIG9sZEFnZSwgbmV3QWdlKTsKLQkJfQotCQlwdWJsaWMgaW50IGdldEFnZSgpIHsKLQkJCUNhbGVuZGFyIGN1cnJlbnRDYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCQkJaW50IGFnZSA9IGN1cnJlbnRDYWwuZ2V0KENhbGVuZGFyLllFQVIpIC0gdGhpcy5iaXJ0aENhbC5nZXQoQ2FsZW5kYXIuWUVBUik7Ci0JCQlpZiAoY3VycmVudENhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpIDwgdGhpcy5iaXJ0aENhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpKSB7Ci0JCQkJYWdlLS07Ci0JCQl9IGVsc2UgaWYgKGN1cnJlbnRDYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSA9PSB0aGlzLmJpcnRoQ2FsLmdldChDYWxlbmRhci5NT05USCkpIHsKLQkJCQlpZiAoY3VycmVudENhbC5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSA8IHRoaXMuYmlydGhDYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkpIHsKLQkJCQkJYWdlLS07Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGFnZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRBZ2UoaW50IG5ld0FnZSkgewotCQkJaWYgKG5ld0FnZSA8IE1JTl9BR0UgfHwgbmV3QWdlID4gTUFYX0FHRSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YobmV3QWdlKSk7Ci0JCQl9Ci0JCi0JCQlpbnQgb2xkQWdlID0gdGhpcy5nZXRBZ2UoKTsKLQkJCWludCBkZWx0YSA9IG5ld0FnZSAtIG9sZEFnZTsKLQkKLQkJCUNhbGVuZGFyIG5ld0JpcnRoQ2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJCW5ld0JpcnRoQ2FsLnNldFRpbWVJbk1pbGxpcyh0aGlzLmJpcnRoQ2FsLmdldFRpbWUoKS5nZXRUaW1lKCkpOwotCQkJLy8gaWYgdGhlIGFnZSBpbmNyZWFzZWQsIHRoZSBiaXJ0aCBkYXRlIG11c3QgYmUgImRlY3JlYXNlZCI7IGFuZCB2aWNlIHZlcnNhCi0JCQluZXdCaXJ0aENhbC5zZXQoQ2FsZW5kYXIuWUVBUiwgbmV3QmlydGhDYWwuZ2V0KENhbGVuZGFyLllFQVIpIC0gZGVsdGEpOwotCQkJdGhpcy5zZXRCaXJ0aERhdGUobmV3QmlydGhDYWwuZ2V0VGltZSgpKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldEV5ZUNvbG9yKCkgewotCQkJcmV0dXJuIHRoaXMuZXllQ29sb3I7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RXllQ29sb3IoU3RyaW5nIGV5ZUNvbG9yKSB7Ci0JCQlpZiAoICEgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKFZBTElEX0VZRV9DT0xPUlMsIGV5ZUNvbG9yKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXllQ29sb3IpOwotCQkJfQotCQkJT2JqZWN0IG9sZCA9IHRoaXMuZXllQ29sb3I7Ci0JCQl0aGlzLmV5ZUNvbG9yID0gZXllQ29sb3I7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVlFX0NPTE9SX1BST1BFUlRZLCBvbGQsIGV5ZUNvbG9yKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKGJpcnRoOiAiICsgdGhpcy5nZXRCaXJ0aERhdGUoKSArICIgLSBleWVzOiAiICsgdGhpcy5leWVDb2xvciArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1M2M3Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVGFibGVNb2RlbEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRhYmxlTW9kZWxMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UYWJsZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgQ3Jvd2QgY3Jvd2Q7Ci0JVGFibGVNb2RlbEV2ZW50IGV2ZW50OwotCi0JcHVibGljIFRhYmxlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jcm93ZCA9IHRoaXMuYnVpbGRDcm93ZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Um93Q291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlTW9kZWxBZGFwdGVyLmdldFJvd0NvdW50KCkpOwotCQkvLyB3ZSBuZWVkIHRvIGFkZCBhIGxpc3RlbmVyIHRvIHdha2UgdXAgdGhlIGFkYXB0ZXIKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKHRoaXMuYnVpbGRUYWJsZU1vZGVsTGlzdGVuZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmNyb3dkLnBlb3BsZVNpemUoKSwgdGFibGVNb2RlbEFkYXB0ZXIuZ2V0Um93Q291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkNvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEVxdWFscyhQZXJzb25Db2x1bW5BZGFwdGVyLkNPTFVNTl9DT1VOVCwgdGFibGVNb2RlbEFkYXB0ZXIuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlQXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKHRoaXMuYnVpbGRUYWJsZU1vZGVsTGlzdGVuZXIoKSk7Ci0KLQkJTGlzdDxTdHJpbmc+IHNvcnRlZE5hbWVzID0gdGhpcy5zb3J0ZWROYW1lcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuY3Jvd2QucGVvcGxlU2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhzb3J0ZWROYW1lcy5nZXQoaSksIHRhYmxlTW9kZWxBZGFwdGVyLmdldFZhbHVlQXQoaSwgUGVyc29uQ29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlQXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRhYmxlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKFRhYmxlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfSk7Ci0KLQkJUGVyc29uIHBlcnNvbiA9IHRoaXMuY3Jvd2QucGVyc29uTmFtZWQoIkdvbGx1bSIpOwotCQlhc3NlcnRFcXVhbHMoUGVyc29uLkVZRV9DT0xPUl9CTFVFLCBwZXJzb24uZ2V0RXllQ29sb3IoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNvbi5pc0V2aWwoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwZXJzb24uZ2V0UmFuaygpKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlTW9kZWxBZGFwdGVyLmdldFJvd0NvdW50KCk7IGkrKykgewotCQkJaWYgKHRhYmxlTW9kZWxBZGFwdGVyLmdldFZhbHVlQXQoaSwgUGVyc29uQ29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTikuZXF1YWxzKCJHb2xsdW0iKSkgewotCQkJCXRhYmxlTW9kZWxBZGFwdGVyLnNldFZhbHVlQXQoUGVyc29uLkVZRV9DT0xPUl9IQVpFTCwgaSwgUGVyc29uQ29sdW1uQWRhcHRlci5FWUVfQ09MT1JfQ09MVU1OKTsKLQkJCQl0YWJsZU1vZGVsQWRhcHRlci5zZXRWYWx1ZUF0KEJvb2xlYW4uVFJVRSwgaSwgUGVyc29uQ29sdW1uQWRhcHRlci5FVklMX0NPTFVNTik7Ci0JCQkJdGFibGVNb2RlbEFkYXB0ZXIuc2V0VmFsdWVBdChuZXcgSW50ZWdlcigtMSksIGksIFBlcnNvbkNvbHVtbkFkYXB0ZXIuUkFOS19DT0xVTU4pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyhQZXJzb24uRVlFX0NPTE9SX0hBWkVMLCBwZXJzb24uZ2V0RXllQ29sb3IoKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmlzRXZpbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBwZXJzb24uZ2V0UmFuaygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUm93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUV2ZW50TGlzdGVuZXIoKSk7Ci0JCS8vIGFkZCBhIHBlcnNvbiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IHNvIHdlIG9ubHkgdHJpZ2dlciBvbmUgZXZlbnQKLQkJdGhpcy5jcm93ZC5hZGRQZXJzb24oIlp6enp6Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyhUYWJsZU1vZGVsRXZlbnQuSU5TRVJULCB0aGlzLmV2ZW50LmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUYWJsZU1vZGVsRXZlbnQuQUxMX0NPTFVNTlMsIHRoaXMuZXZlbnQuZ2V0Q29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVSb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcih0aGlzLmJ1aWxkU2luZ2xlRXZlbnRMaXN0ZW5lcigpKTsKLQkJLy8gcmVtb3ZpbmcgYSBwZXJzb24gc2hvdWxkIG9ubHkgdHJpZ2dlciBvbmUgZXZlbnQsIHNpbmNlIGEgcmUtc29ydCBpcyBub3QgbmVlZGVkCi0JCXRoaXMuY3Jvd2QucmVtb3ZlUGVyc29uKHRoaXMuY3Jvd2QucGVyc29uTmFtZWQoIkdvbGx1bSIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKFRhYmxlTW9kZWxFdmVudC5ERUxFVEUsIHRoaXMuZXZlbnQuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRhYmxlTW9kZWxFdmVudC5BTExfQ09MVU1OUywgdGhpcy5ldmVudC5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUNlbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcih0aGlzLmJ1aWxkU2luZ2xlRXZlbnRMaXN0ZW5lcigpKTsKLQkJLy8gYWRkIGEgcGVyc29uIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgc28gd2Ugb25seSB0cmlnZ2VyIG9uZSBldmVudAotCQlQZXJzb24gcGVyc29uID0gdGhpcy5jcm93ZC5wZXJzb25OYW1lZCgiR29sbHVtIik7Ci0JCXBlcnNvbi5zZXRFdmlsKHRydWUpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHMoVGFibGVNb2RlbEV2ZW50LlVQREFURSwgdGhpcy5ldmVudC5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoUGVyc29uQ29sdW1uQWRhcHRlci5FVklMX0NPTFVNTiwgdGhpcy5ldmVudC5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0TGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJVGFibGVNb2RlbExpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRhYmxlTW9kZWxMaXN0ZW5lcigpOwotCQlhc3NlcnRUcnVlKHRoaXMuY3Jvd2QuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENyb3dkLlBFT1BMRV9DT0xMRUNUSU9OKSk7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jcm93ZC5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENyb3dkLlBFT1BMRV9DT0xMRUNUSU9OKSk7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLnJlbW92ZVRhYmxlTW9kZWxMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jcm93ZC5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ3Jvd2QuUEVPUExFX0NPTExFQ1RJT04pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUNlbGxMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQlUYWJsZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGFibGVNb2RlbExpc3RlbmVyKCk7Ci0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLmNyb3dkLnBlcnNvbk5hbWVkKCJHb2xsdW0iKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5CSVJUSF9EQVRFX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkVZRV9DT0xPUl9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5FVklMX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLlJBTktfUFJPUEVSVFkpKTsKLQotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uQklSVEhfREFURV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVlFX0NPTE9SX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5FVklMX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5SQU5LX1BST1BFUlRZKSk7Ci0KLQkJdGFibGVNb2RlbEFkYXB0ZXIucmVtb3ZlVGFibGVNb2RlbExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5CSVJUSF9EQVRFX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkVZRV9DT0xPUl9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5FVklMX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLlJBTktfUFJPUEVSVFkpKTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+KHRoaXMuYnVpbGRTb3J0ZWRQZW9wbGVBZGFwdGVyKCksIHRoaXMuYnVpbGRDb2x1bW5BZGFwdGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDZWxsTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRDZWxsTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkU29ydGVkUGVvcGxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UGVyc29uPih0aGlzLmJ1aWxkUGVvcGxlQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFBlcnNvbj4gYnVpbGRQZW9wbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPENyb3dkLCBQZXJzb24+KENyb3dkLlBFT1BMRV9DT0xMRUNUSU9OLCB0aGlzLmNyb3dkKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxQZXJzb24+IGl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnBlb3BsZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucGVvcGxlU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ3Jvd2QgYnVpbGRDcm93ZCgpIHsKLQkJQ3Jvd2QgcmVzdWx0ID0gbmV3IENyb3dkKCk7Ci0JCXJlc3VsdC5hZGRQZXJzb24oIkJpbGJvIik7Ci0JCXJlc3VsdC5hZGRQZXJzb24oIkdvbGx1bSIpOwotCQlyZXN1bHQuYWRkUGVyc29uKCJGcm9kbyIpOwotCQlyZXN1bHQuYWRkUGVyc29uKCJTYW13aXNlIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5BZGFwdGVyIGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQZXJzb25Db2x1bW5BZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZU1vZGVsTGlzdGVuZXIgYnVpbGRUYWJsZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFRhYmxlTW9kZWxMaXN0ZW5lcigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHNvcnRlZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxTdHJpbmc+KENvbGxlY3Rpb25Ub29scy5zb3J0ZWRTZXQodGhpcy5jcm93ZC5wZW9wbGVOYW1lcygpKSk7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZU1vZGVsTGlzdGVuZXIgYnVpbGRTaW5nbGVFdmVudExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRlc3RUYWJsZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChUYWJsZU1vZGVsRXZlbnQgZSkgewotCQkJCS8vIHdlIGV4cGVjdCBvbmx5IGEgc2luZ2xlIGV2ZW50Ci0JCQkJaWYgKFRhYmxlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9PSBudWxsKSB7Ci0JCQkJCVRhYmxlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xhc3NlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbkNvbHVtbkFkYXB0ZXIgaW1wbGVtZW50cyBDb2x1bW5BZGFwdGVyIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gNzsKLQkKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DT0xVTU4gPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSVJUSF9EQVRFX0NPTFVNTiA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdPTkVfV0VTVF9EQVRFX0NPTFVNTiA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVZRV9DT0xPUl9DT0xVTU4gPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVklMX0NPTFVNTiA9IDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBTktfQ09MVU1OID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURWRU5UVVJFX0NPVU5UX0NPTFVNTiA9IDY7Ci0JCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTFVNTl9OQU1FUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkiTmFtZSIsCi0JCQkiQmlydGgiLAotCQkJIkdvbmUgV2VzdCIsCi0JCQkiRXllcyIsCi0JCQkiRXZpbCIsCi0JCQkiUmFuayIsCi0JCQkiQWR2ZW50dXJlcyIKLQkJfTsKLQkKLQkKLQkJcHVibGljIGludCBjb2x1bW5Db3VudCgpIHsKLQkJCXJldHVybiBDT0xVTU5fQ09VTlQ7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBjb2x1bW5OYW1lKGludCBpbmRleCkgewotCQkJcmV0dXJuIENPTFVNTl9OQU1FU1tpbmRleF07Ci0JCX0KLQkKLQkJcHVibGljIENsYXNzPD8+IGNvbHVtbkNsYXNzKGludCBpbmRleCkgewotCQkJc3dpdGNoIChpbmRleCkgewotCQkJCWNhc2UgTkFNRV9DT0xVTU46CQkJCQlyZXR1cm4gT2JqZWN0LmNsYXNzOwotCQkJCWNhc2UgQklSVEhfREFURV9DT0xVTU46CQkJcmV0dXJuIERhdGUuY2xhc3M7Ci0JCQkJY2FzZSBHT05FX1dFU1RfREFURV9DT0xVTU46CXJldHVybiBEYXRlLmNsYXNzOwotCQkJCWNhc2UgRVlFX0NPTE9SX0NPTFVNTjoJCQlyZXR1cm4gT2JqZWN0LmNsYXNzOwotCQkJCWNhc2UgRVZJTF9DT0xVTU46CQkJCQlyZXR1cm4gQm9vbGVhbi5jbGFzczsKLQkJCQljYXNlIFJBTktfQ09MVU1OOgkJCQkJcmV0dXJuIEludGVnZXIuY2xhc3M7Ci0JCQkJY2FzZSBBRFZFTlRVUkVfQ09VTlRfQ09MVU1OOnJldHVybiBJbnRlZ2VyLmNsYXNzOwotCQkJCWRlZmF1bHQ6IAkJCQkJCQkJCXJldHVybiBPYmplY3QuY2xhc3M7Ci0JCQl9Ci0JCX0KLQkKLQkJcHVibGljIGJvb2xlYW4gY29sdW1uSXNFZGl0YWJsZShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBpbmRleCAhPSBOQU1FX0NPTFVNTjsKLQkJfQotCQotCQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIGNlbGxNb2RlbHMoT2JqZWN0IHN1YmplY3QpIHsKLQkJCVBlcnNvbiBwZXJzb24gPSAoUGVyc29uKSBzdWJqZWN0OwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcmVzdWx0ID0gbmV3IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsW0NPTFVNTl9DT1VOVF07Ci0JCi0JCQlyZXN1bHRbTkFNRV9DT0xVTU5dID0gdGhpcy5idWlsZE5hbWVBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbQklSVEhfREFURV9DT0xVTU5dID0gdGhpcy5idWlsZEJpcnRoRGF0ZUFkYXB0ZXIocGVyc29uKTsKLQkJCXJlc3VsdFtHT05FX1dFU1RfREFURV9DT0xVTU5dID0gdGhpcy5idWlsZEdvbmVXZXN0RGF0ZUFkYXB0ZXIocGVyc29uKTsKLQkJCXJlc3VsdFtFWUVfQ09MT1JfQ09MVU1OXSA9IHRoaXMuYnVpbGRFeWVDb2xvckFkYXB0ZXIocGVyc29uKTsKLQkJCXJlc3VsdFtFVklMX0NPTFVNTl0gPSB0aGlzLmJ1aWxkRXZpbEFkYXB0ZXIocGVyc29uKTsKLQkJCXJlc3VsdFtSQU5LX0NPTFVNTl0gPSB0aGlzLmJ1aWxkUmFua0FkYXB0ZXIocGVyc29uKTsKLQkJCXJlc3VsdFtBRFZFTlRVUkVfQ09VTlRfQ09MVU1OXSA9IHRoaXMuYnVpbGRBZHZlbnR1cmVDb3VudEFkYXB0ZXIocGVyc29uKTsKLQkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkTmFtZUFkYXB0ZXIoUGVyc29uIHBlcnNvbikgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KFBlcnNvbi5OQU1FX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRCaXJ0aERhdGVBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uQklSVEhfREFURV9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIERhdGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QmlydGhEYXRlKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEJpcnRoRGF0ZSgoRGF0ZSkgdmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkR29uZVdlc3REYXRlQWRhcHRlcihQZXJzb24gcGVyc29uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4oUGVyc29uLkdPTkVfV0VTVF9EQVRFX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgRGF0ZSBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRHb25lV2VzdERhdGUoKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0R29uZVdlc3REYXRlKChEYXRlKSB2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRFeWVDb2xvckFkYXB0ZXIoUGVyc29uIHBlcnNvbikgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KFBlcnNvbi5FWUVfQ09MT1JfUFJPUEVSVFksIHBlcnNvbikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXllQ29sb3IoKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0RXllQ29sb3IoKFN0cmluZykgdmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkRXZpbEFkYXB0ZXIoUGVyc29uIHBlcnNvbikgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KFBlcnNvbi5FVklMX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNFdmlsKCkpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRFdmlsKCgoQm9vbGVhbil2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkUmFua0FkYXB0ZXIoUGVyc29uIHBlcnNvbikgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KFBlcnNvbi5SQU5LX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRSYW5rKCkpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRSYW5rKCgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkQWR2ZW50dXJlQ291bnRBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uQURWRU5UVVJFX0NPVU5UX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRBZHZlbnR1cmVDb3VudCgpKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0QWR2ZW50dXJlQ291bnQoKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCX0KLQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDcm93ZCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248UGVyc29uPiBwZW9wbGU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRU9QTEVfQ09MTEVDVElPTiA9ICJwZW9wbGUiOwotCQotCQlwdWJsaWMgQ3Jvd2QoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wZW9wbGUgPSBuZXcgQXJyYXlMaXN0PFBlcnNvbj4oKTsKLQkJfQotCQotCQotCQlwdWJsaWMgSXRlcmF0b3I8UGVyc29uPiBwZW9wbGUoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8UGVyc29uPih0aGlzLnBlb3BsZSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShQZXJzb24gcGVyc29uKSB7Ci0JCQkJCUNyb3dkLnRoaXMucmVtb3ZlUGVyc29uKHBlcnNvbik7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwdWJsaWMgaW50IHBlb3BsZVNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wZW9wbGUuc2l6ZSgpOwotCQl9Ci0JCi0JCXB1YmxpYyBQZXJzb24gYWRkUGVyc29uKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmNoZWNrUGVyc29uTmFtZShuYW1lKTsKLQkJCXJldHVybiB0aGlzLmFkZFBlcnNvbihuZXcgUGVyc29uKHRoaXMsIG5hbWUpKTsKLQkJfQotCQotCQlwcml2YXRlIFBlcnNvbiBhZGRQZXJzb24oUGVyc29uIHBlcnNvbikgewotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHBlcnNvbiwgdGhpcy5wZW9wbGUsIFBFT1BMRV9DT0xMRUNUSU9OKTsKLQkJCXJldHVybiBwZXJzb247Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlUGVyc29uKFBlcnNvbiBwZXJzb24pIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHBlcnNvbiwgdGhpcy5wZW9wbGUsIFBFT1BMRV9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCByZW1vdmVQZW9wbGUoQ29sbGVjdGlvbjxQZXJzb24+IHBlcnNvbnMpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihwZXJzb25zLCB0aGlzLnBlb3BsZSwgUEVPUExFX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVBlb3BsZShJdGVyYXRvcjxQZXJzb24+IHBlcnNvbnMpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihwZXJzb25zLCB0aGlzLnBlb3BsZSwgUEVPUExFX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCXZvaWQgY2hlY2tQZXJzb25OYW1lKFN0cmluZyBwZXJzb25OYW1lKSB7Ci0JCQlpZiAocGVyc29uTmFtZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMucGVvcGxlTmFtZXMoKSwgcGVyc29uTmFtZSkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHBlcnNvbk5hbWUpOwotCQkJfQotCQl9Ci0JCi0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IHBlb3BsZU5hbWVzKCkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBlcnNvbiwgU3RyaW5nPih0aGlzLnBlb3BsZS5pdGVyYXRvcigpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oUGVyc29uIHBlcnNvbikgewotCQkJCQlyZXR1cm4gcGVyc29uLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXB1YmxpYyBQZXJzb24gcGVyc29uTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJCWZvciAoSXRlcmF0b3I8UGVyc29uPiBzdHJlYW0gPSB0aGlzLnBlb3BsZS5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlQZXJzb24gcGVyc29uID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAocGVyc29uLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJcmV0dXJuIHBlcnNvbjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIFN0cmluZy52YWx1ZU9mKHRoaXMucGVvcGxlLnNpemUoKSkgKyAiIHBlb3BsZSIpOwotCQl9Ci0JCi0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyc29uIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIENvbXBhcmFibGU8UGVyc29uPiB7Ci0JCXByaXZhdGUgQ3Jvd2QgY3Jvd2Q7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZPSAibmFtZSI7Ci0JCXByaXZhdGUgRGF0ZSBiaXJ0aERhdGU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSVJUSF9EQVRFX1BST1BFUlRZPSAiYmlydGhEYXRlIjsKLQkJcHJpdmF0ZSBEYXRlIGdvbmVXZXN0RGF0ZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdPTkVfV0VTVF9EQVRFX1BST1BFUlRZPSAiZ29uZVdlc3REYXRlIjsKLQkJcHJpdmF0ZSBTdHJpbmcgZXllQ29sb3I7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfUFJPUEVSVFk9ICJleWVDb2xvciI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfQkxVRSA9ICJibHVlIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVZRV9DT0xPUl9HUkVFTiA9ICJncmVlbiI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfQlJPV04gPSAiYnJvd24iOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX0hBWkVMID0gImhhemVsIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVZRV9DT0xPUl9QSU5LID0gInBpbmsiOwotCQkJcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbGlkRXllQ29sb3JzOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWUVfQ09MT1IgPSBFWUVfQ09MT1JfQkxVRTsKLQkJcHJpdmF0ZSBib29sZWFuIGV2aWw7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVklMX1BST1BFUlRZPSAiZXZpbCI7Ci0JCXByaXZhdGUgaW50IHJhbms7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5LX1BST1BFUlRZPSAicmFuayI7Ci0JCXByaXZhdGUgaW50IGFkdmVudHVyZUNvdW50OwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURWRU5UVVJFX0NPVU5UX1BST1BFUlRZPSAiYWR2ZW50dXJlQ291bnQiOwotCQotCQlQZXJzb24oQ3Jvd2QgY3Jvd2QsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jcm93ZCA9IGNyb3dkOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuYmlydGhEYXRlID0gbmV3IERhdGUoKTsKLQkJCUNhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCQkJYy5hZGQoQ2FsZW5kYXIuWUVBUiwgMjUwKTsKLQkJCXRoaXMuZ29uZVdlc3REYXRlID0gbmV3IERhdGUoYy5nZXRUaW1lSW5NaWxsaXMoKSk7Ci0JCQl0aGlzLmV5ZUNvbG9yID0gREVGQVVMVF9FWUVfQ09MT1I7Ci0JCQl0aGlzLmV2aWwgPSBmYWxzZTsKLQkJCXRoaXMucmFuayA9IDA7Ci0JCQl0aGlzLmFkdmVudHVyZUNvdW50ID0gMDsKLQkJfQotCQotCQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRWYWxpZEV5ZUNvbG9ycygpIHsKLQkJCWlmICh2YWxpZEV5ZUNvbG9ycyA9PSBudWxsKSB7Ci0JCQkJdmFsaWRFeWVDb2xvcnMgPSBidWlsZFZhbGlkRXllQ29sb3JzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsaWRFeWVDb2xvcnM7Ci0JCX0KLQkKLQkJcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkVmFsaWRFeWVDb2xvcnMoKSB7Ci0JCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9CTFVFKTsKLQkJCXJlc3VsdC5hZGQoRVlFX0NPTE9SX0dSRUVOKTsKLQkJCXJlc3VsdC5hZGQoRVlFX0NPTE9SX0JST1dOKTsKLQkJCXJlc3VsdC5hZGQoRVlFX0NPTE9SX0hBWkVMKTsKLQkJCXJlc3VsdC5hZGQoRVlFX0NPTE9SX1BJTkspOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQotCQlwdWJsaWMgQ3Jvd2QgZ2V0Q3Jvd2QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jcm93ZDsKLQkJfQotCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMuY3Jvd2QuY2hlY2tQZXJzb25OYW1lKG5hbWUpOwotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQotCQlwdWJsaWMgRGF0ZSBnZXRCaXJ0aERhdGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5iaXJ0aERhdGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0QmlydGhEYXRlKERhdGUgYmlydGhEYXRlKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5iaXJ0aERhdGU7Ci0JCQl0aGlzLmJpcnRoRGF0ZSA9IGJpcnRoRGF0ZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChCSVJUSF9EQVRFX1BST1BFUlRZLCBvbGQsIGJpcnRoRGF0ZSk7Ci0JCX0KLQkKLQkJcHVibGljIERhdGUgZ2V0R29uZVdlc3REYXRlKCkgewotCQkJcmV0dXJuIHRoaXMuZ29uZVdlc3REYXRlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEdvbmVXZXN0RGF0ZShEYXRlIGdvbmVXZXN0RGF0ZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMuZ29uZVdlc3REYXRlOwotCQkJdGhpcy5nb25lV2VzdERhdGUgPSBnb25lV2VzdERhdGU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoR09ORV9XRVNUX0RBVEVfUFJPUEVSVFksIG9sZCwgZ29uZVdlc3REYXRlKTsKLQkJfQotCQotCQlwdWJsaWMgU3RyaW5nIGdldEV5ZUNvbG9yKCkgewotCQkJcmV0dXJuIHRoaXMuZXllQ29sb3I7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RXllQ29sb3IoU3RyaW5nIGV5ZUNvbG9yKSB7Ci0JCQlpZiAoISBnZXRWYWxpZEV5ZUNvbG9ycygpLmNvbnRhaW5zKGV5ZUNvbG9yKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXllQ29sb3IpOwotCQkJfQotCQkJT2JqZWN0IG9sZCA9IHRoaXMuZXllQ29sb3I7Ci0JCQl0aGlzLmV5ZUNvbG9yID0gZXllQ29sb3I7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVlFX0NPTE9SX1BST1BFUlRZLCBvbGQsIGV5ZUNvbG9yKTsKLQkJfQotCQotCQlwdWJsaWMgYm9vbGVhbiBpc0V2aWwoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmlsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEV2aWwoYm9vbGVhbiBldmlsKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZXZpbDsKLQkJCXRoaXMuZXZpbCA9IGV2aWw7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVZJTF9QUk9QRVJUWSwgb2xkLCBldmlsKTsKLQkJfQotCQotCQlwdWJsaWMgaW50IGdldFJhbmsoKSB7Ci0JCQlyZXR1cm4gdGhpcy5yYW5rOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFJhbmsoaW50IHJhbmspIHsKLQkJCWludCBvbGQgPSB0aGlzLnJhbms7Ci0JCQl0aGlzLnJhbmsgPSByYW5rOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJBTktfUFJPUEVSVFksIG9sZCwgcmFuayk7Ci0JCX0KLQkKLQkJcHVibGljIGludCBnZXRBZHZlbnR1cmVDb3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmFkdmVudHVyZUNvdW50OwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEFkdmVudHVyZUNvdW50KGludCBhZHZlbnR1cmVDb3VudCkgewotCQkJaW50IG9sZCA9IHRoaXMuYWR2ZW50dXJlQ291bnQ7Ci0JCQl0aGlzLmFkdmVudHVyZUNvdW50ID0gYWR2ZW50dXJlQ291bnQ7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQURWRU5UVVJFX0NPVU5UX1BST1BFUlRZLCBvbGQsIGFkdmVudHVyZUNvdW50KTsKLQkJfQotCQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhQZXJzb24gcCkgewotCQkJcmV0dXJuIHRoaXMubmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKHAubmFtZSk7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lICsgCi0JCQkJCQkiXHRib3JuOiAiICsgRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKS5mb3JtYXQodGhpcy5iaXJ0aERhdGUpICsgCi0JCQkJCQkiXHRnb25lIHdlc3Q6ICIgKyBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpLmZvcm1hdCh0aGlzLmdvbmVXZXN0RGF0ZSkgKyAKLQkJCQkJCSJcdGV5ZXM6ICIgKyB0aGlzLmV5ZUNvbG9yICsgCi0JCQkJCQkiXHRldmlsOiAiICsgdGhpcy5ldmlsICsgCi0JCQkJCQkiXHRyYW5rOiAiICsgdGhpcy5yYW5rICsKLQkJCQkJCSJcdGFkdmVudHVyZXM6ICIgKyB0aGlzLmFkdmVudHVyZUNvdW50Ci0JCQk7Ci0JCX0KLQkKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdFRhYmxlTW9kZWxMaXN0ZW5lciBpbXBsZW1lbnRzIFRhYmxlTW9kZWxMaXN0ZW5lciB7Ci0JCVRlc3RUYWJsZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChUYWJsZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjA4NDUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5CdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkRlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNoZWNrQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTcGlubmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25FdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuVGFibGVDb2x1bW47Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuVGFibGVNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNoZWNrQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29tYm9Cb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuRG9jdW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5Db21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLnN3aW5nLlNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5zd2luZy5UYWJsZUNlbGxFZGl0b3JBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRhYmxlTW9kZWxBZGFwdGVyVGVzdHMuQ3Jvd2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5QZXJzb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5QZXJzb25Db2x1bW5BZGFwdGVyOwotCi0vKioKLSAqIGFuIGV4YW1wbGUgVUkgZm9yIHRlc3RpbmcgdGhlIFRhYmxlTW9kZWxBZGFwdGVyCi0gKiAJIm5hbWUiIGNvbHVtbiBpcyByZWFkLW9ubHkgdGV4dCBmaWVsZAotICogCSJiaXJ0aCBkYXRlIiBjb2x1bW4gaXMgZGF0ZSB0ZXh0IGZpZWxkCi0gKiAJImdvbmUgd2VzdCBkYXRlIiBjb2x1bW4gaXMgZGF0ZSBzcGlubmVyCi0gKiAJImV5ZSBjb2xvciIgY29sdW1uIGlzIGNvbWJvLWJveAotICogCSJldmlsIiBjb2x1bW4gaXMgY2hlY2sgYm94Ci0gKiAJInJhbmsiIGNvbHVtbiBpcyBudW1iZXIgdGV4dCBmaWVsZAotICogCSJhZHZlbnR1cmUgY291bnQiIGNvbHVtbiBpcyBudW1iZXIgc3Bpbm5lcgotICogCi0gKiBOb3RlIHRoYXQgdGhlIHRhYmxlIG1vZGVsIGFuZCByb3cgc2VsZWN0aW9uIG1vZGVsIHNoYXJlIHRoZSBzYW1lCi0gKiBsaXN0IHZhbHVlIG1vZGVsICh0aGUgc29ydGVkIHBlb3BsZSBhZGFwdGVyKQotICovCi1wdWJsaWMgY2xhc3MgVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QgewotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8T2JqZWN0PiBleWVDb2xvcnNIb2xkZXI7ICAvLyBPYmplY3QgYmVjYXVzZSBpdCBhZGFwdHMgdG8gYSBjb21iby1ib3gKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENyb3dkPiBjcm93ZEhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gc2VsZWN0ZWRQZXJzb25Ib2xkZXI7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQZXJzb24+IHNvcnRlZFBlb3BsZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBUYWJsZU1vZGVsIHRhYmxlTW9kZWw7Ci0JcHJpdmF0ZSBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgcm93U2VsZWN0aW9uTW9kZWw7Ci0JcHJpdmF0ZSBBY3Rpb24gcmVtb3ZlQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIHJlbmFtZUFjdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKGFyZ3MpOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoVUlNYW5hZ2VyLmdldFN5c3RlbUxvb2tBbmRGZWVsQ2xhc3NOYW1lKCkpOwotCQl0aGlzLmV5ZUNvbG9yc0hvbGRlciA9IHRoaXMuIGJ1aWxkRXllQ29sb3JDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCXRoaXMuY3Jvd2RIb2xkZXIgPSB0aGlzLmJ1aWxkQ3Jvd2RIb2xkZXIoKTsKLQkJdGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciA9IHRoaXMuYnVpbGRTZWxlY3RlZFBlcnNvbkhvbGRlcigpOwotCQl0aGlzLnNvcnRlZFBlb3BsZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkU29ydGVkUGVvcGxlQWRhcHRlcigpOwotCQl0aGlzLnRhYmxlTW9kZWwgPSB0aGlzLmJ1aWxkVGFibGVNb2RlbCgpOwotCQl0aGlzLnJvd1NlbGVjdGlvbk1vZGVsID0gdGhpcy5idWlsZFJvd1NlbGVjdGlvbk1vZGVsKCk7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEV5ZUNvbG9yQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxPYmplY3Q+KG5ldyBBcnJheUxpc3Q8T2JqZWN0PihQZXJzb24uZ2V0VmFsaWRFeWVDb2xvcnMoKSkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q3Jvd2Q+IGJ1aWxkQ3Jvd2RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPENyb3dkPih0aGlzLmJ1aWxkQ3Jvd2QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDcm93ZCBidWlsZENyb3dkKCkgewotCQlDcm93ZCBjcm93ZCA9IG5ldyBDcm93ZCgpOwotCi0JCVBlcnNvbiBwID0gY3Jvd2QuYWRkUGVyc29uKCJCaWxibyIpOwotCQlwLnNldEV5ZUNvbG9yKFBlcnNvbi5FWUVfQ09MT1JfQlJPV04pOwotCQlwLnNldFJhbmsoMjIpOwotCQlwLnNldEFkdmVudHVyZUNvdW50KDEpOwotCi0JCXAgPSBjcm93ZC5hZGRQZXJzb24oIkdvbGx1bSIpOwotCQlwLnNldEV5ZUNvbG9yKFBlcnNvbi5FWUVfQ09MT1JfUElOSyk7Ci0JCXAuc2V0RXZpbCh0cnVlKTsKLQkJcC5zZXRSYW5rKDIpOwotCQlwLnNldEFkdmVudHVyZUNvdW50KDUwKTsKLQotCQlwID0gY3Jvd2QuYWRkUGVyc29uKCJGcm9kbyIpOwotCQlwLnNldEV5ZUNvbG9yKFBlcnNvbi5FWUVfQ09MT1JfQkxVRSk7Ci0JCXAuc2V0UmFuaygzNCk7Ci0JCXAuc2V0QWR2ZW50dXJlQ291bnQoMSk7Ci0KLQkJcCA9IGNyb3dkLmFkZFBlcnNvbigiU2Ftd2lzZSIpOwotCQlwLnNldEV5ZUNvbG9yKFBlcnNvbi5FWUVfQ09MT1JfR1JFRU4pOwotCQlwLnNldFJhbmsoMTkpOwotCQlwLnNldEFkdmVudHVyZUNvdW50KDEpOwotCi0JCXJldHVybiBjcm93ZDsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gYnVpbGRTZWxlY3RlZFBlcnNvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uPigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UGVyc29uPiBidWlsZFNvcnRlZFBlb3BsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFBlcnNvbj4odGhpcy5idWlsZFBlb3BsZU5hbWVBZGFwdGVyKCkpOwotCX0KLQotCS8vIHRoZSBsaXN0IHdpbGwgbmVlZCB0byBiZSByZS1zb3J0ZWQgaWYgYSBuYW1lIGNoYW5nZXMKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNvbj4gYnVpbGRQZW9wbGVOYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UGVyc29uPih0aGlzLmJ1aWxkUGVvcGxlQWRhcHRlcigpLCBQZXJzb24uTkFNRV9QUk9QRVJUWSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkUGVvcGxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxDcm93ZCwgUGVyc29uPih0aGlzLmNyb3dkSG9sZGVyLCBDcm93ZC5QRU9QTEVfQ09MTEVDVElPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc29uPiBpdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wZW9wbGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnBlb3BsZVNpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlTW9kZWwgYnVpbGRUYWJsZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4odGhpcy5zb3J0ZWRQZW9wbGVBZGFwdGVyLCB0aGlzLmJ1aWxkQ29sdW1uQWRhcHRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sdW1uQWRhcHRlciBidWlsZENvbHVtbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUGVyc29uQ29sdW1uQWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGJ1aWxkUm93U2VsZWN0aW9uTW9kZWwoKSB7Ci0JCU9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCByc20gPSBuZXcgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsKG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuc29ydGVkUGVvcGxlQWRhcHRlcikpOwotCQlyc20uYWRkTGlzdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRSb3dTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJcnNtLnNldFNlbGVjdGlvbk1vZGUoTGlzdFNlbGVjdGlvbk1vZGVsLlNJTkdMRV9TRUxFQ1RJT04pOwotCQlyZXR1cm4gcnNtOwotCX0KLQotCXByaXZhdGUgTGlzdFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkUm93U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKExpc3RTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGUuZ2V0VmFsdWVJc0FkanVzdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yb3dTZWxlY3Rpb25DaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgcm93U2VsZWN0aW9uQ2hhbmdlZChMaXN0U2VsZWN0aW9uRXZlbnQgZSkgewotCQlQZXJzb24gc2VsZWN0aW9uID0gKFBlcnNvbikgdGhpcy5yb3dTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7Ci0JCXRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIuc2V0VmFsdWUoc2VsZWN0aW9uKTsKLQkJYm9vbGVhbiBwZXJzb25TZWxlY3RlZCA9IChzZWxlY3Rpb24gIT0gbnVsbCk7Ci0JCXRoaXMucmVtb3ZlQWN0aW9uLnNldEVuYWJsZWQocGVyc29uU2VsZWN0ZWQpOwotCQl0aGlzLnJlbmFtZUFjdGlvbi5zZXRFbmFibGVkKHBlcnNvblNlbGVjdGVkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRMb2NhdGlvbigyMDAsIDIwMCk7Ci0JCXdpbmRvdy5zZXRTaXplKDYwMCwgNDAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFRhYmxlUGFuZSgpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRUYWJsZVBhbmUoKSB7Ci0JCXJldHVybiBuZXcgSlNjcm9sbFBhbmUodGhpcy5idWlsZFRhYmxlKCkpOwotCX0KLQotCXByaXZhdGUgSlRhYmxlIGJ1aWxkVGFibGUoKSB7Ci0JCUpUYWJsZSB0YWJsZSA9IG5ldyBKVGFibGUodGhpcy50YWJsZU1vZGVsKTsKLQkJdGFibGUucHV0Q2xpZW50UHJvcGVydHkoInRlcm1pbmF0ZUVkaXRPbkZvY3VzTG9zdCIsIEJvb2xlYW4uVFJVRSk7CS8vIHNlZSBKYXZhIGJ1ZyA1MDA3NjUyCi0JCXRhYmxlLnNldFNlbGVjdGlvbk1vZGVsKHRoaXMucm93U2VsZWN0aW9uTW9kZWwpOwotCQl0YWJsZS5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJdGFibGUuc2V0QXV0b1Jlc2l6ZU1vZGUoSlRhYmxlLkFVVE9fUkVTSVpFX05FWFRfQ09MVU1OKTsKLQkJaW50IHJvd0hlaWdodCA9IDIwOwkvLyBzdGFydCB3aXRoIG1pbmltdW0gb2YgMjAKLQotCQkvLyBnb25lIHdlc3QgY29sdW1uIChzcGlubmVyKQotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbihQZXJzb25Db2x1bW5BZGFwdGVyLkdPTkVfV0VTVF9EQVRFX0NPTFVNTik7Ci0JCVNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlciBzcGlubmVyUmVuZGVyZXIgPSB0aGlzLmJ1aWxkRGF0ZVNwaW5uZXJSZW5kZXJlcigpOwotCQljb2x1bW4uc2V0Q2VsbFJlbmRlcmVyKHNwaW5uZXJSZW5kZXJlcik7Ci0JCWNvbHVtbi5zZXRDZWxsRWRpdG9yKG5ldyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKHRoaXMuYnVpbGREYXRlU3Bpbm5lclJlbmRlcmVyKCkpKTsKLQkJcm93SGVpZ2h0ID0gTWF0aC5tYXgocm93SGVpZ2h0LCBzcGlubmVyUmVuZGVyZXIucHJlZmVycmVkSGVpZ2h0KCkpOwotCi0JCS8vIGV5ZSBjb2xvciBjb2x1bW4gKGNvbWJvLWJveCkKLQkJLy8gdGhlIGpkayBjb21iby1ib3ggcmVuZGVyZXIgbG9va3MgbGlrZSBhIHRleHQgZmllbGQKLQkJLy8gdW50aWwgdGhlIHVzZXIgc3RhcnRzIGFuIGVkaXQgLSB1c2UgYSBjdXN0b20gb25lCi0JCWNvbHVtbiA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKFBlcnNvbkNvbHVtbkFkYXB0ZXIuRVlFX0NPTE9SX0NPTFVNTik7Ci0JCUNvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIgZXllQ29sb3JSZW5kZXJlciA9IHRoaXMuYnVpbGRFeWVDb2xvckNvbWJvQm94UmVuZGVyZXIoKTsKLQkJY29sdW1uLnNldENlbGxSZW5kZXJlcihleWVDb2xvclJlbmRlcmVyKTsKLQkJY29sdW1uLnNldENlbGxFZGl0b3IobmV3IFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIodGhpcy5idWlsZEV5ZUNvbG9yQ29tYm9Cb3hSZW5kZXJlcigpKSk7Ci0JCXJvd0hlaWdodCA9IE1hdGgubWF4KHJvd0hlaWdodCwgZXllQ29sb3JSZW5kZXJlci5wcmVmZXJyZWRIZWlnaHQoKSk7Ci0KLQkJLy8gZXZpbCAoY2hlY2sgYm94KQotCQkvLyB0aGUgamRrIGNoZWNrIGJveCByZW5kZXJlciBhbmQgZWRpdG9yIHN1Y2sgLSB1c2UgYSBjdXN0b20gb25lcwotCQljb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbihQZXJzb25Db2x1bW5BZGFwdGVyLkVWSUxfQ09MVU1OKTsKLQkJQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlciBldmlsUmVuZGVyZXIgPSBuZXcgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcigpOwotCQljb2x1bW4uc2V0Q2VsbFJlbmRlcmVyKGV2aWxSZW5kZXJlcik7Ci0JCWNvbHVtbi5zZXRDZWxsRWRpdG9yKG5ldyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKG5ldyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKCkpKTsKLQkJcm93SGVpZ2h0ID0gTWF0aC5tYXgocm93SGVpZ2h0LCBldmlsUmVuZGVyZXIucHJlZmVycmVkSGVpZ2h0KCkpOwotCi0JCS8vIGFkdmVudHVyZSBjb3VudCBjb2x1bW4gKHNwaW5uZXIpCi0JCWNvbHVtbiA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKFBlcnNvbkNvbHVtbkFkYXB0ZXIuQURWRU5UVVJFX0NPVU5UX0NPTFVNTik7Ci0JCXNwaW5uZXJSZW5kZXJlciA9IHRoaXMuYnVpbGROdW1iZXJTcGlubmVyUmVuZGVyZXIoKTsKLQkJY29sdW1uLnNldENlbGxSZW5kZXJlcihzcGlubmVyUmVuZGVyZXIpOwotCQljb2x1bW4uc2V0Q2VsbEVkaXRvcihuZXcgVGFibGVDZWxsRWRpdG9yQWRhcHRlcih0aGlzLmJ1aWxkTnVtYmVyU3Bpbm5lclJlbmRlcmVyKCkpKTsKLQkJcm93SGVpZ2h0ID0gTWF0aC5tYXgocm93SGVpZ2h0LCBzcGlubmVyUmVuZGVyZXIucHJlZmVycmVkSGVpZ2h0KCkpOwotCi0JCXRhYmxlLnNldFJvd0hlaWdodChyb3dIZWlnaHQpOwotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIgYnVpbGREYXRlU3Bpbm5lclJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlcihuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIobmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCkpKTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlciBidWlsZE51bWJlclNwaW5uZXJSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIobmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIobmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+KCkpKTsKLQl9Ci0KLQlwcml2YXRlIENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIgYnVpbGRFeWVDb2xvckNvbWJvQm94UmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcih0aGlzLmJ1aWxkUmVhZE9ubHlFeWVDb2xvckNvbWJvQm94TW9kZWwoKSwgdGhpcy5idWlsZEV5ZUNvbG9yUmVuZGVyZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21ib0JveE1vZGVsIGJ1aWxkUmVhZE9ubHlFeWVDb2xvckNvbWJvQm94TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIodGhpcy5leWVDb2xvcnNIb2xkZXIsIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDZWxsUmVuZGVyZXIgYnVpbGRFeWVDb2xvclJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IEV5ZUNvbG9yUmVuZGVyZXIoKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMCwgMSkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRCdXR0b25QYW5lbCgpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUGVyc29uUGFuZWwoKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRCdXR0b25QYW5lbCgpIHsKLQkJSlBhbmVsIGJ1dHRvblBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkQnV0dG9uKCkpOwotCQlidXR0b25QYW5lbC5hZGQodGhpcy5idWlsZFJlbW92ZUJ1dHRvbigpKTsKLQkJYnV0dG9uUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW5hbWVCdXR0b24oKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkRXllQ29sb3JCdXR0b24oKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRCdXR0b24oKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXRCdXR0b24oKSk7Ci0JCXJldHVybiBidXR0b25QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFBlcnNvblBhbmVsKCkgewotCQlKUGFuZWwgcGVyc29uUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZEJpcnRoRGF0ZVNwaW5uZXIoKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkR29uZVdlc3REYXRlU3Bpbm5lcigpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRFeWVDb2xvckNvbWJvQm94KCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZEV2aWxDaGVja0JveCgpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRSYW5rU3Bpbm5lcigpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRBZHZlbnR1cmVDb3VudFNwaW5uZXIoKSk7Ci0JCXJldHVybiBwZXJzb25QYW5lbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkIGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRBZGRCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQWRkQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQWRkQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJhZGQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZFBlcnNvbigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGFkZFBlcnNvbigpIHsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWVGcm9tVXNlcigpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldFNlbGVjdGVkUGVyc29uKHRoaXMuY3Jvd2QoKS5hZGRQZXJzb24obmFtZSkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBidXR0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVtb3ZlQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlbW92ZUFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlbW92ZUFjdGlvbigpIHsKLQkJdGhpcy5yZW1vdmVBY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbW92ZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVtb3ZlUGVyc29uKCk7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMucmVtb3ZlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXR1cm4gdGhpcy5yZW1vdmVBY3Rpb247Ci0JfQotCi0Jdm9pZCByZW1vdmVQZXJzb24oKSB7Ci0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLnNlbGVjdGVkUGVyc29uKCk7Ci0JCWlmIChwZXJzb24gIT0gbnVsbCkgewotCQkJdGhpcy5jcm93ZCgpLnJlbW92ZVBlcnNvbihwZXJzb24pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbmFtZSBidXR0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVuYW1lQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlbmFtZUFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlbmFtZUFjdGlvbigpIHsKLQkJdGhpcy5yZW5hbWVBY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbmFtZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVuYW1lUGVyc29uKCk7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMucmVuYW1lQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXR1cm4gdGhpcy5yZW5hbWVBY3Rpb247Ci0JfQotCi0Jdm9pZCByZW5hbWVQZXJzb24oKSB7Ci0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLnNlbGVjdGVkUGVyc29uKCk7Ci0JCWlmIChwZXJzb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSB0aGlzLnByb21wdFVzZXJGb3JOYW1lKHBlcnNvbi5nZXROYW1lKCkpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCXBlcnNvbi5zZXROYW1lKG5hbWUpOwotCQkJCXRoaXMuc2V0U2VsZWN0ZWRQZXJzb24ocGVyc29uKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgZXllIGNvbG9yIGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRBZGRFeWVDb2xvckJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRBZGRFeWVDb2xvckFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZEFkZEV5ZUNvbG9yQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJhZGQgZXllIGNvbG9yIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5hZGRFeWVDb2xvcigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGFkZEV5ZUNvbG9yKCkgewotCQlTdHJpbmcgY29sb3IgPSB0aGlzLnByb21wdFVzZXJGb3JFeWVDb2xvcigpOwotCQlpZiAoY29sb3IgIT0gbnVsbCkgewotCQkJdGhpcy5leWVDb2xvcnNIb2xkZXIuYWRkKGNvbG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHByb21wdFVzZXJGb3JFeWVDb2xvcigpIHsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCVN0cmluZyBleWVDb2xvciA9IEpPcHRpb25QYW5lLnNob3dJbnB1dERpYWxvZygiRXllIENvbG9yIik7Ci0JCQlpZiAoZXllQ29sb3IgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwkJLy8gdXNlciBwcmVzc2VkIDxDYW5jZWw+Ci0JCQl9Ci0JCQlpZiAoKGV5ZUNvbG9yLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwgIlRoZSBleWUgY29sb3IgaXMgcmVxdWlyZWQuIiwgIkludmFsaWQgRXllIENvbG9yIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0JCQl9IGVsc2UgaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmV5ZUNvbG9yc0hvbGRlci5pdGVyYXRvcigpLCBleWVDb2xvcikpIHsKLQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCAiVGhlIGV5ZSBjb2xvciBhbHJlYWR5IGV4aXN0cy4iLCAiSW52YWxpZCBFeWUgQ29sb3IiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGV5ZUNvbG9yOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50IGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFByaW50QWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRDcm93ZCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHByaW50Q3Jvd2QoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmNyb3dkKCkpOwotCQlmb3IgKEl0ZXJhdG9yPFBlcnNvbj4gc3RyZWFtID0gdGhpcy5jcm93ZCgpLnBlb3BsZSgpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzZXQgYnV0dG9uICoqKioqKioqKioKLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc2V0QnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc2V0QWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXRBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc2V0IikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc2V0KCkgewotCQl0aGlzLmNyb3dkSG9sZGVyLnNldFZhbHVlKHRoaXMuYnVpbGRDcm93ZCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbmV3IG5hbWUgZGlhbG9nICoqKioqKioqKioKLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWVGcm9tVXNlcigpIHsKLQkJcmV0dXJuIHRoaXMucHJvbXB0VXNlckZvck5hbWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcHJvbXB0VXNlckZvck5hbWUoU3RyaW5nIG9yaWdpbmFsTmFtZSkgewotCQl3aGlsZSAodHJ1ZSkgewotCQkJU3RyaW5nIG5hbWUgPSBKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2coIlBlcnNvbiBOYW1lIik7Ci0JCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7CQkvLyB1c2VyIHByZXNzZWQgPENhbmNlbD4KLQkJCX0KLQkJCWlmICgobmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG51bGwsICJUaGUgbmFtZSBpcyByZXF1aXJlZC4iLCAiSW52YWxpZCBOYW1lIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0JCQl9IGVsc2UgaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNyb3dkKCkucGVvcGxlTmFtZXMoKSwgbmFtZSkpIHsKLQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCAiVGhlIG5hbWUgYWxyZWFkeSBleGlzdHMuIiwgIkludmFsaWQgTmFtZSIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lIHRleHQgZmllbGQgKioqKioqKioqKgotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGROYW1lVGV4dEZpZWxkKCkgewotCQlKVGV4dEZpZWxkIHRleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKHRoaXMuYnVpbGROYW1lRG9jdW1lbnQoKSwgbnVsbCwgMCk7Ci0JCXRleHRGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXJldHVybiB0ZXh0RmllbGQ7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudCBidWlsZE5hbWVEb2N1bWVudCgpIHsKLQkJcmV0dXJuIG5ldyBEb2N1bWVudEFkYXB0ZXIodGhpcy5idWlsZE5hbWVBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIFN0cmluZz4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmlydGggZGF0ZSBzcGlubmVyICoqKioqKioqKioKLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRCaXJ0aERhdGVTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYnVpbGRCaXJ0aERhdGVTcGlubmVyTW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRCaXJ0aERhdGVTcGlubmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy5idWlsZEJpcnRoRGF0ZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkQmlydGhEYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5CSVJUSF9EQVRFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEYXRlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QmlydGhEYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0QmlydGhEYXRlKChEYXRlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdvbmUgd2VzdCBkYXRlIHNwaW5uZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZEdvbmVXZXN0RGF0ZVNwaW5uZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNwaW5uZXIodGhpcy5idWlsZEdvbmVXZXN0RGF0ZVNwaW5uZXJNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZEdvbmVXZXN0RGF0ZVNwaW5uZXJNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkR29uZVdlc3REYXRlQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRHb25lV2VzdERhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLkdPTkVfV0VTVF9EQVRFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEYXRlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0R29uZVdlc3REYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0R29uZVdlc3REYXRlKChEYXRlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV5ZSBjb2xvciBjb21iby1ib3ggKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQ29tYm9Cb3ggYnVpbGRFeWVDb2xvckNvbWJvQm94KCkgewotCQlyZXR1cm4gbmV3IEpDb21ib0JveCh0aGlzLmJ1aWxkRXllQ29sb3JDb21ib0JveE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tYm9Cb3hNb2RlbCBidWlsZEV5ZUNvbG9yQ29tYm9Cb3hNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDb21ib0JveE1vZGVsQWRhcHRlcih0aGlzLmV5ZUNvbG9yc0hvbGRlciwgdGhpcy5idWlsZEV5ZUNvbG9yQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRFeWVDb2xvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0Pih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uRVlFX0NPTE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPYmplY3QgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFeWVDb2xvcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEV5ZUNvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXZpbCBjaGVjayBib3ggKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQ2hlY2tCb3ggYnVpbGRFdmlsQ2hlY2tCb3goKSB7Ci0JCUpDaGVja0JveCBjaGVja0JveCA9IG5ldyBKQ2hlY2tCb3goKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgiZXZpbCIpOwotCQljaGVja0JveC5zZXRNb2RlbCh0aGlzLmJ1aWxkRXZpbENoZWNrQm94TW9kZWwoKSk7Ci0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1aWxkRXZpbENoZWNrQm94TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5idWlsZEV2aWxBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFdmlsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBCb29sZWFuPih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uRVZJTF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0V2aWwoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEV2aWwodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByYW5rIHNwaW5uZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZFJhbmtTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYnVpbGRSYW5rU3Bpbm5lck1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkUmFua1NwaW5uZXJNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMuYnVpbGRSYW5rQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gYnVpbGRSYW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBOdW1iZXI+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5SQU5LX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBOdW1iZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRSYW5rKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oTnVtYmVyIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFJhbmsodmFsdWUuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkdmVudHVyZSBjb3VudCBzcGlubmVyICoqKioqKioqKioKLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRBZHZlbnR1cmVDb3VudFNwaW5uZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNwaW5uZXIodGhpcy5idWlsZEFkdmVudHVyZUNvdW50U3Bpbm5lck1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkQWR2ZW50dXJlQ291bnRTcGlubmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkQWR2ZW50dXJlQ291bnRBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBidWlsZEFkdmVudHVyZUNvdW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBOdW1iZXI+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5BRFZFTlRVUkVfQ09VTlRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE51bWJlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIodGhpcy5zdWJqZWN0LmdldEFkdmVudHVyZUNvdW50KCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oTnVtYmVyIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEFkdmVudHVyZUNvdW50KHZhbHVlLmludFZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXByaXZhdGUgQ3Jvd2QgY3Jvd2QoKSB7Ci0JCXJldHVybiB0aGlzLmNyb3dkSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBQZXJzb24gc2VsZWN0ZWRQZXJzb24oKSB7Ci0JCWlmICh0aGlzLnJvd1NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0aW9uRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChQZXJzb24pIHRoaXMucm93U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFBlcnNvbihQZXJzb24gcGVyc29uKSB7Ci0JCXRoaXMucm93U2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShwZXJzb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjdXN0b20gcmVuZGVyZXIgKioqKioqKioqKgotCQotCS8qKgotCSAqIFRoaXMgaXMgc2ltcGx5IGFuIGV4YW1wbGUgb2YgYSByZW5kZXJlciBmb3IgdGhlIGVtYmVkZGVkIGNvbWJvLWJveC4KLQkgKiBJdCBkb2VzIG5vdGhpbmcgc3BlY2lhbCB1bmxlc3MgeW91IHVuY29tbWVudCB0aGUgY29kZSBiZWxvdy4uLi4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEV5ZUNvbG9yUmVuZGVyZXIgZXh0ZW5kcyBEZWZhdWx0TGlzdENlbGxSZW5kZXJlciB7Ci0JCUV5ZUNvbG9yUmVuZGVyZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgQ29tcG9uZW50IGdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJCS8vIGp1c3QgZG8gc29tZXRoaW5nIHRvIHNob3cgdGhlIHJlbmRlcmVyIGlzIHdvcmtpbmcuLi4KLQkvLwkJdmFsdWUgPSAiPiIgKyB2YWx1ZTsKLQkJCXJldHVybiBzdXBlci5nZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYWE1ODIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUcmVlOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5JbmRlbnRpbmdQcmludFdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5OdWxsTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlTm9kZVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCi0JcHVibGljIFRyZWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Um9vdCgpIHsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRTb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCQlUZXN0TW9kZWwgcm9vdCA9IHJvb3ROb2RlLmdldFRlc3RNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoInJvb3QiLCByb290LmdldE5hbWUoKSk7Ci0vLwkJcm9vdC5kdW1wKCk7Ci0vLwkJcm9vdE5vZGUuZHVtcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDaGlsZCgpIHsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRTb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCi0JCVRlc3ROb2RlIGV4cGVjdGVkID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCVRlc3ROb2RlIGFjdHVhbCA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldENoaWxkKHJvb3ROb2RlLCAxKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCi0JCWV4cGVjdGVkID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAyIik7Ci0JCWFjdHVhbCA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldENoaWxkKHJvb3ROb2RlLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDaGlsZENvdW50KCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNvcnRlZFRyZWVNb2RlbCgpOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDUsIHRyZWVNb2RlbC5nZXRDaGlsZENvdW50KHJvb3ROb2RlKSk7Ci0KLQkJVGVzdE5vZGUgbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQlhc3NlcnRFcXVhbHMoMSwgdHJlZU1vZGVsLmdldENoaWxkQ291bnQobm9kZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbmRleE9mQ2hpbGQoKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQotCQlUZXN0Tm9kZSBjaGlsZCA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMCIpOwotCQlhc3NlcnRFcXVhbHMoMCwgdHJlZU1vZGVsLmdldEluZGV4T2ZDaGlsZChyb290Tm9kZSwgY2hpbGQpKTsKLQotCQljaGlsZCA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQlhc3NlcnRFcXVhbHMoMSwgdHJlZU1vZGVsLmdldEluZGV4T2ZDaGlsZChyb290Tm9kZSwgY2hpbGQpKTsKLQotCQljaGlsZCA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgdHJlZU1vZGVsLmdldEluZGV4T2ZDaGlsZChyb290Tm9kZSwgY2hpbGQpKTsKLQkJVGVzdE5vZGUgZ3JhbmRjaGlsZCA9IGNoaWxkLmNoaWxkTmFtZWQoIm5vZGUgMi4yIik7Ci0JCWFzc2VydEVxdWFscygyLCB0cmVlTW9kZWwuZ2V0SW5kZXhPZkNoaWxkKGNoaWxkLCBncmFuZGNoaWxkKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTGVhZigpIHsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRTb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCQlhc3NlcnRGYWxzZSh0cmVlTW9kZWwuaXNMZWFmKHJvb3ROb2RlKSk7Ci0JCVRlc3ROb2RlIG5vZGUgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJYXNzZXJ0RmFsc2UodHJlZU1vZGVsLmlzTGVhZihub2RlKSk7Ci0JCW5vZGUgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDMiKTsKLQkJYXNzZXJ0VHJ1ZSh0cmVlTW9kZWwuaXNMZWFmKG5vZGUpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlTm9kZXNDaGFuZ2VkKCkgewotCQkvLyB0aGUgb25seSB3YXkgdG8gdHJpZ2dlciBhICJub2RlIGNoYW5nZWQiIGV2ZW50IGlzIHRvIHVzZSBhbiB1bnNvcnRlZCB0cmVlOwotCQkvLyBhIHNvcnRlZCB0cmVlIHdpbGwgd2lsbCB0cmlnZ2VyIG9ubHkgIm5vZGUgcmVtb3ZlZCIgYW5kICJub2RlIGluc2VydGVkIiBldmVudHMKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRVbnNvcnRlZFRyZWVNb2RlbCgpOwotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0NoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCVRlc3ROb2RlIG5vZGUgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJVGVzdE1vZGVsIHRtID0gbm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJdG0uc2V0TmFtZSgibm9kZSAxKysiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCi0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQlub2RlID0gbm9kZS5jaGlsZE5hbWVkKCJub2RlIDEuMSIpOwotCQl0bSA9IG5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCXRtLnNldE5hbWUoIm5vZGUgMS4xKysiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlTm9kZXNJbnNlcnRlZCgpIHsKLQkJLy8gdXNlIGFuIHVuc29ydGVkIHRyZWUgc28gdGhlIG5vZGVzIGFyZSBub3QgcmUtc2h1ZmZsZWQuLi4KLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRVbnNvcnRlZFRyZWVNb2RlbCgpOwotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0luc2VydGVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCQlUZXN0Tm9kZSBub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCVRlc3RNb2RlbCB0bSA9IG5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCXRtLmFkZENoaWxkKCJuZXcgY2hpbGQuLi4iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCi0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQlub2RlID0gbm9kZS5jaGlsZE5hbWVkKCJub2RlIDEuMSIpOwotCQl0bSA9IG5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCXRtLmFkZENoaWxkKCJhbm90aGVyIG5ldyBjaGlsZC4uLiIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVOb2Rlc1JlbW92ZWQoKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNSZW1vdmVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCQlUZXN0TW9kZWwgcm9vdCA9IHJvb3ROb2RlLmdldFRlc3RNb2RlbCgpOwotCQlyb290LnJlbW92ZUNoaWxkKHJvb3QuY2hpbGROYW1lZCgibm9kZSAzIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0KLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCVRlc3ROb2RlIG5vZGUgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDIiKTsKLQkJVGVzdE1vZGVsIHRtID0gbm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJdG0ucmVtb3ZlQ2hpbGQodG0uY2hpbGROYW1lZCgibm9kZSAyLjIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZVN0cnVjdHVyZUNoYW5nZWQoKSB7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBub2RlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4odGhpcy5idWlsZFNvcnRlZFJvb3ROb2RlKCkpOwotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFRyZWVNb2RlbChub2RlSG9sZGVyKTsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNJbnNlcnRlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNSZW1vdmVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCW5vZGVIb2xkZXIuc2V0VmFsdWUodGhpcy5idWlsZFVuc29ydGVkUm9vdE5vZGUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IGEgcHJvYmxlbSB3ZSBoYWQgd2hlcmUgcmVtb3ZpbmcgYSBjaGlsZCBmcm9tIGEgdHJlZSB3b3VsZCBjYXVzZQotCSAqIHRoZSBKVHJlZSB0byBjYWxsICNlcXVhbHMoT2JqZWN0KSBvbiBlYWNoIG5vZGUgcmVtb3ZlZCAoYWN0dWFsbHksIGl0IHdhcwotCSAqIFRyZWVQYXRoLCBidXQgdGhhdCB3YXMgYmVjYXVzZSBpdHMgb3duICNlcXVhbHMoT2JqZWN0KSB3YXMgY2FsbGVkIGJ5Ci0JICogSlRyZWUpOyBhbmQgc2luY2Ugd2UgaGFkIGFscmVhZHkgcmVtb3ZlZCB0aGUgbGFzdCBsaXN0ZW5lciBmcm9tIHRoZQotCSAqIGFzcGVjdCBhZGFwdGVyLCB0aGUgYXNwZWN0IGFkYXB0ZXIgd291bGQgc2F5IGl0cyB2YWx1ZSB3YXMgbnVsbDsgdGhpcwotCSAqIHdvdWxkIGNhdXNlIGEgTlBFIHVudGlsIHdlIHR3ZWFrZWQgVHJlZU1vZGVsQWRhcHRlciB0byByZW1vdmUgaXRzCi0JICogbGlzdGVuZXJzIGZyb20gYSBub2RlIG9ubHkgKmFmdGVyKiB0aGUgbm9kZSBoYWQgYmVlbiBjb21wbGV0ZWx5Ci0JICogcmVtb3ZlZCBmcm9tIHRoZSBKVHJlZQotCSAqIEBzZWUgVHJlZU1vZGVsQWRhcHRlciNyZW1vdmVOb2RlKE9iamVjdFtdLCBpbnQsIFRyZWVOb2RlVmFsdWVNb2RlbCkKLQkgKiBAc2VlIFRyZWVNb2RlbEFkYXB0ZXIjYWRkTm9kZShPYmplY3RbXSwgaW50LCBUcmVlTm9kZVZhbHVlTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdExhenlJbml0aWFsaXphdGlvbigpIHsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRTcGVjaWFsVHJlZU1vZGVsKCk7Ci0JCUpUcmVlIGpUcmVlID0gbmV3IEpUcmVlKHRyZWVNb2RlbCk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCQlUZXN0TW9kZWwgcm9vdCA9IHJvb3ROb2RlLmdldFRlc3RNb2RlbCgpOwotCQkvLyB0aGlzIHdvdWxkIGNhdXNlIGEgTlBFOgotCQlyb290LnJlbW92ZUNoaWxkKHJvb3QuY2hpbGROYW1lZCgibm9kZSAzIikpOwotCQlhc3NlcnRFcXVhbHModHJlZU1vZGVsLCBqVHJlZS5nZXRNb2RlbCgpKTsKLQl9Ci0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkU29ydGVkVHJlZU1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyZWVNb2RlbCh0aGlzLmJ1aWxkU29ydGVkUm9vdE5vZGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSBidWlsZFNvcnRlZFJvb3ROb2RlKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZFRlc3ROb2RlKHRoaXMuYnVpbGRSb290KCkpOwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkVW5zb3J0ZWRUcmVlTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJlZU1vZGVsKHRoaXMuYnVpbGRVbnNvcnRlZFJvb3ROb2RlKCkpOwotCX0KLQotCXByaXZhdGUgVGVzdE5vZGUgYnVpbGRVbnNvcnRlZFJvb3ROb2RlKCkgewotCQlyZXR1cm4gbmV3IFVuc29ydGVkVGVzdE5vZGUodGhpcy5idWlsZFJvb3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTW9kZWwgYnVpbGRTcGVjaWFsVHJlZU1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyZWVNb2RlbCh0aGlzLmJ1aWxkU3BlY2lhbFJvb3ROb2RlKCkpOwotCX0KLQotCXByaXZhdGUgVGVzdE5vZGUgYnVpbGRTcGVjaWFsUm9vdE5vZGUoKSB7Ci0JCXJldHVybiBuZXcgU3BlY2lhbFRlc3ROb2RlKHRoaXMuYnVpbGRSb290KCkpOwotCX0KLQotCXByaXZhdGUgVGVzdE1vZGVsIGJ1aWxkUm9vdCgpIHsKLQkJVGVzdE1vZGVsIHJvb3QgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCS8qTm9kZSBub2RlXzAgPSAqL3Jvb3QuYWRkQ2hpbGQoIm5vZGUgMCIpOwotCQlUZXN0TW9kZWwgbm9kZV8xID0gcm9vdC5hZGRDaGlsZCgibm9kZSAxIik7Ci0JCVRlc3RNb2RlbCBub2RlXzFfMSA9IG5vZGVfMS5hZGRDaGlsZCgibm9kZSAxLjEiKTsKLQkJLypOb2RlIG5vZGVfMV8xXzEgPSAqL25vZGVfMV8xLmFkZENoaWxkKCJub2RlIDEuMS4xIik7Ci0JCVRlc3RNb2RlbCBub2RlXzIgPSByb290LmFkZENoaWxkKCJub2RlIDIiKTsKLQkJLypOb2RlIG5vZGVfMl8wID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4wIik7Ci0JCS8qTm9kZSBub2RlXzJfMSA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMSIpOwotCQkvKk5vZGUgbm9kZV8yXzIgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjIiKTsKLQkJLypOb2RlIG5vZGVfMl8zID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4zIik7Ci0JCS8qTm9kZSBub2RlXzJfNCA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuNCIpOwotCQkvKk5vZGUgbm9kZV8yXzUgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjUiKTsKLQkJLypOb2RlIG5vZGVfMyA9ICovcm9vdC5hZGRDaGlsZCgibm9kZSAzIik7Ci0JCS8qTm9kZSBub2RlXzQgPSAqL3Jvb3QuYWRkQ2hpbGQoIm5vZGUgNCIpOwotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBpcyBhIHR5cGljYWwgbW9kZWwgY2xhc3Mgd2l0aCB0aGUgdHlwaWNhbCBjaGFuZ2Ugbm90aWZpY2F0aW9ucwotCSAqIGZvciAjbmFtZSBhbmQgI2NoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQkJLy8gdGhlICBwYXJlbnQgaXMgaW1tdXRhYmxlOyB0aGUgcm9vdCdzIHBhcmVudCBpcyBudWxsCi0JCXByaXZhdGUgZmluYWwgVGVzdE1vZGVsIHBhcmVudDsKLQotCQkvLyB0aGUgbmFtZSBpcyBtdXRhYmxlOyBzbyBJIGd1ZXNzIGl0IGlzbid0IHRoZSAicHJpbWFyeSBrZXkiIDotKQotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248VGVzdE1vZGVsPiBjaGlsZHJlbjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENISUxEUkVOX0NPTExFQ1RJT04gPSAiY2hpbGRyZW4iOwotCi0KLQkJcHVibGljIFRlc3RNb2RlbChTdHJpbmcgbmFtZSkgewkvLyByb290IGN0b3IKLQkJCXRoaXMobnVsbCwgbmFtZSk7Ci0JCX0KLQkJcHJpdmF0ZSBUZXN0TW9kZWwoVGVzdE1vZGVsIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmNoaWxkcmVuID0gbmV3IEhhc2hCYWc8VGVzdE1vZGVsPigpOwotCQl9Ci0KLQkJcHVibGljIFRlc3RNb2RlbCBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8VGVzdE1vZGVsPiBjaGlsZHJlbigpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxUZXN0TW9kZWw+KHRoaXMuY2hpbGRyZW4pOwotCQl9Ci0JCXB1YmxpYyBpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW4uc2l6ZSgpOwotCQl9Ci0JCXB1YmxpYyBUZXN0TW9kZWwgYWRkQ2hpbGQoU3RyaW5nIGNoaWxkTmFtZSkgewotCQkJVGVzdE1vZGVsIGNoaWxkID0gbmV3IFRlc3RNb2RlbCh0aGlzLCBjaGlsZE5hbWUpOwotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKGNoaWxkLCB0aGlzLmNoaWxkcmVuLCBDSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJCXJldHVybiBjaGlsZDsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsW10gYWRkQ2hpbGRyZW4oU3RyaW5nW10gY2hpbGROYW1lcykgewotCQkJVGVzdE1vZGVsW10gbmV3Q2hpbGRyZW4gPSBuZXcgVGVzdE1vZGVsW2NoaWxkTmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCW5ld0NoaWxkcmVuW2ldID0gbmV3IFRlc3RNb2RlbCh0aGlzLCBjaGlsZE5hbWVzW2ldKTsKLQkJCX0KLQkJCXRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24obmV3Q2hpbGRyZW4sIHRoaXMuY2hpbGRyZW4sIENISUxEUkVOX0NPTExFQ1RJT04pOwotCQkJcmV0dXJuIG5ld0NoaWxkcmVuOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKFRlc3RNb2RlbCBjaGlsZCkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oY2hpbGQsIHRoaXMuY2hpbGRyZW4sIENISUxEUkVOX0NPTExFQ1RJT04pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkcmVuKFRlc3RNb2RlbFtdIHRlc3RNb2RlbHMpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbih0ZXN0TW9kZWxzLCB0aGlzLmNoaWxkcmVuLCBDSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjbGVhckNoaWxkcmVuKCkgewotCQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5jaGlsZHJlbiwgQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbCBjaGlsZE5hbWVkKFN0cmluZyBjaGlsZE5hbWUpIHsKLQkJCWZvciAoVGVzdE1vZGVsIGNoaWxkIDogdGhpcy5jaGlsZHJlbikgewotCQkJCWlmIChjaGlsZC5nZXROYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpIHsKLQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjaGlsZCBub3QgZm91bmQ6ICIgKyBjaGlsZE5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBkdW1wU3RyaW5nKCkgewotCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgaXB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKHN3KTsKLQkJCXRoaXMuZHVtcE9uKGlwdyk7Ci0JCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkdW1wT24oSW5kZW50aW5nUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCQl3cml0ZXIucHJpbnRsbih0aGlzKTsKLQkJCXdyaXRlci5pbmRlbnQoKTsKLQkJCWZvciAoVGVzdE1vZGVsIGNoaWxkIDogdGhpcy5jaGlsZHJlbikgewotCQkJCWNoaWxkLmR1bXBPbih3cml0ZXIpOwotCQkJfQotCQkJd3JpdGVyLnVuZGVudCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGR1bXBPbihPdXRwdXRTdHJlYW0gc3RyZWFtKSB7Ci0JCQlJbmRlbnRpbmdQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihzdHJlYW0pKTsKLQkJCXRoaXMuZHVtcE9uKHdyaXRlcik7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkdW1wKCkgewotCQkJdGhpcy5kdW1wT24oU3lzdGVtLm91dCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubmFtZSk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogVGhpcyBOb2RlIHdyYXBzIGEgVGVzdE1vZGVsIGFuZCBjb252ZXJ0cyBpbnRvIHNvbWV0aGluZyB0aGF0IGNhbgotCSAqIGJlIHVzZWQgYnkgVHJlZU1vZGVsQWRhcHRlci4gSXQgY29udmVydHMgY2hhbmdlcyB0byB0aGUgVGVzdE1vZGVsJ3MKLQkgKiBuYW1lIGludG8gInN0YXRlIGNoYW5nZXMiIHRvIHRoZSBOb2RlOyBhbmQgY29udmVydHMgdGhlCi0JICogVGVzdE1vZGVsJ3MgY2hpbGRyZW4gaW50byBhIExpc3RWYWx1ZU1vZGVsIG9mIE5vZGVzIHdob3NlIG9yZGVyIGlzCi0JICogZGV0ZXJtaW5lZCBieSBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBUZXN0Tm9kZSBleHRlbmRzIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4gaW1wbGVtZW50cyBEaXNwbGF5YWJsZSB7Ci0JCS8qKiB0aGUgbW9kZWwgb2JqZWN0IHdyYXBwZWQgYnkgdGhpcyBub2RlICovCi0JCXByaXZhdGUgZmluYWwgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJLyoqIHRoaXMgbm9kZSdzIHBhcmVudCBub2RlOyBudWxsIGZvciB0aGUgcm9vdCBub2RlICovCi0JCXByaXZhdGUgZmluYWwgVGVzdE5vZGUgcGFyZW50OwotCQkvKiogdGhpcyBub2RlJ3MgY2hpbGQgbm9kZXMgKi8KLQkJcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gY2hpbGRyZW5Nb2RlbDsKLQkJLyoqIGEgbGlzdGVuZXIgdGhhdCBub3RpZmllcyB1cyB3aGVuIHRoZSBtb2RlbCBvYmplY3QncyAiaW50ZXJuYWwgc3RhdGUiIGNoYW5nZXMgKi8KLQkJcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRlc3RNb2RlbExpc3RlbmVyOwotCi0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JCS8qKgotCQkgKiByb290IG5vZGUgY29uc3RydWN0b3IKLQkJICovCi0JCXB1YmxpYyBUZXN0Tm9kZShUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQl0aGlzKG51bGwsIHRlc3RNb2RlbCk7Ci0JCX0KLQotCQkvKioKLQkJICogYnJhbmNoIG9yIGxlYWYgbm9kZSBjb25zdHJ1Y3RvcgotCQkgKi8KLQkJcHVibGljIFRlc3ROb2RlKFRlc3ROb2RlIHBhcmVudCwgVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy50ZXN0TW9kZWwgPSB0ZXN0TW9kZWw7Ci0JCQl0aGlzLmNoaWxkcmVuTW9kZWwgPSB0aGlzLmJ1aWxkQ2hpbGRyZW5Nb2RlbCh0ZXN0TW9kZWwpOwotCQkJdGhpcy50ZXN0TW9kZWxMaXN0ZW5lciA9IHRoaXMuYnVpbGRUZXN0TW9kZWxMaXN0ZW5lcigpOwotCQl9Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVGVzdE1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCQlUZXN0Tm9kZS50aGlzLnRlc3RNb2RlbENoYW5nZWQoZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBzdWJjbGFzc2VzIGRlY2lkZSB0aGUgb3JkZXIgb2YgdGhlIGNoaWxkIG5vZGVzCi0JCSAqLwotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkQ2hpbGRyZW5Nb2RlbChUZXN0TW9kZWwgbW9kZWwpOwotCi0JCS8qKgotCQkgKiB1c2VkIGJ5IHN1YmNsYXNzZXM7Ci0JCSAqIHRyYW5zZm9ybSB0aGUgdGVzdCBtb2RlbCBjaGlsZHJlbiBpbnRvIG5vZGVzCi0JCSAqLwotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkTm9kZUFkYXB0ZXIoVGVzdE1vZGVsIG1vZGVsKSB7Ci0JCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFRlc3RNb2RlbCwgVHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHRoaXMuYnVpbGRDaGlsZHJlbkFkYXB0ZXIobW9kZWwpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFRlc3ROb2RlIHRyYW5zZm9ybUl0ZW0oVGVzdE1vZGVsIGl0ZW0pIHsKLQkJCQkJcmV0dXJuIFRlc3ROb2RlLnRoaXMuYnVpbGRDaGlsZE5vZGUoaXRlbSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBzdWJjbGFzc2VzIG11c3QgYnVpbGQgYSBjb25jcmV0ZSBub2RlIGZvciB0aGUgc3BlY2lmaWVkIHRlc3QgbW9kZWwKLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBUZXN0Tm9kZSBidWlsZENoaWxkTm9kZShUZXN0TW9kZWwgY2hpbGRUZXN0TW9kZWwpOwotCi0JCS8qKgotCQkgKiByZXR1cm4gYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIG9uIHRoZSBzcGVjaWZpZWQgbW9kZWwncyBjaGlsZHJlbgotCQkgKi8KLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFRlc3RNb2RlbD4gYnVpbGRDaGlsZHJlbkFkYXB0ZXIoVGVzdE1vZGVsIG1vZGVsKSB7Ci0JCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgVGVzdE1vZGVsPihUZXN0TW9kZWwuQ0hJTERSRU5fQ09MTEVDVElPTiwgbW9kZWwpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8VGVzdE1vZGVsPiBpdGVyYXRvcl8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuY2hpbGRyZW4oKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5jaGlsZHJlblNpemUoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIFRyZWVOb2RlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIFRlc3RNb2RlbCBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiB0aGlzLnRlc3RNb2RlbDsKLQkJfQotCi0JCXB1YmxpYyBUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0PiBwYXJlbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGNoaWxkcmVuTW9kZWwoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWUoKSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5OQU1FX1BST1BFUlRZLCB0aGlzLnRlc3RNb2RlbExpc3RlbmVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZSgpIHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFksIHRoaXMudGVzdE1vZGVsTGlzdGVuZXIpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIERpc3BsYXlhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy50ZXN0TW9kZWwuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIEljb24gaWNvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIGRlYnVnZ2luZyBzdXBwb3J0ICoqKioqKioqKioKLQotCQlwdWJsaWMgU3RyaW5nIGR1bXBTdHJpbmcoKSB7Ci0JCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQlJbmRlbnRpbmdQcmludFdyaXRlciBpcHcgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIoc3cpOwotCQkJdGhpcy5kdW1wT24oaXB3KTsKLQkJCXJldHVybiBzdy50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHVtcE9uKEluZGVudGluZ1ByaW50V3JpdGVyIHdyaXRlcikgewotCQkJd3JpdGVyLnByaW50bG4odGhpcyk7Ci0JCQl3cml0ZXIuaW5kZW50KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuTW9kZWwuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJLy8gY2FzdCB0byBhIFRlc3ROb2RlIChpLmUuIHRoaXMgd29uJ3Qgd29yayB3aXRoIGEgTmFtZVRlc3ROb2RlIGluIHRoZSB0cmVlKQotCQkJCSgoVGVzdE5vZGUpIHN0cmVhbS5uZXh0KCkpLmR1bXBPbih3cml0ZXIpOwotCQkJfQotCQkJd3JpdGVyLnVuZGVudCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHVtcE9uKE91dHB1dFN0cmVhbSBzdHJlYW0pIHsKLQkJCUluZGVudGluZ1ByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHN0cmVhbSkpOwotCQkJdGhpcy5kdW1wT24od3JpdGVyKTsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHVtcCgpIHsKLQkJCXRoaXMuZHVtcE9uKFN5c3RlbS5vdXQpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCQkvKioKLQkJICogdGhlIG1vZGVsJ3MgbmFtZSBoYXMgY2hhbmdlZCwgZm9yd2FyZCB0aGUgZXZlbnQgdG8gb3VyIGxpc3RlbmVycwotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgdGVzdE1vZGVsQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCS8vIHdlIG5lZWQgdG8gbm90aWZ5IGxpc3RlbmVycyB0aGF0IG91ciAiaW50ZXJuYWwgc3RhdGUiIGhhcyBjaGFuZ2VkCi0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJCS8vIG91ciBkaXNwbGF5IHN0cmluZyBzdGF5cyBpbiBzeW5jaCB3aXRoIHRoZSBtb2RlbCdzIG5hbWUKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgZS5nZXRPbGRWYWx1ZSgpLCBlLmdldE5ld1ZhbHVlKCkpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JCXB1YmxpYyBUZXN0TW9kZWwgZ2V0VGVzdE1vZGVsKCkgewotCQkJcmV0dXJuIHRoaXMudGVzdE1vZGVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHRlc3RpbmcgY29udmVuaWVuY2UgbWV0aG9kCi0JCSAqLwotCQlwdWJsaWMgVGVzdE5vZGUgY2hpbGROYW1lZChTdHJpbmcgbmFtZSkgewotCQkJZm9yIChJdGVyYXRvcjxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbk1vZGVsLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+IGNoaWxkTm9kZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJaWYgKGNoaWxkTm9kZSBpbnN0YW5jZW9mIFRlc3ROb2RlKSB7Ci0JCQkJCWlmICgoKFRlc3ROb2RlKSBjaGlsZE5vZGUpLmdldFRlc3RNb2RlbCgpLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCXJldHVybiAoVGVzdE5vZGUpIGNoaWxkTm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNoaWxkIG5vdCBmb3VuZDogIiArIG5hbWUpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JCS8qKgotCQkgKiB1c2UgdGhlIHN0YW5kYXJkIERpc3BsYXlhYmxlIGNvbXBhcmF0b3IKLQkJICovCi0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKERpc3BsYXlhYmxlIGQpIHsKLQkJCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLCBkKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJOb2RlKCIgKyB0aGlzLnRlc3RNb2RlbCArICIpIjsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gdGhhdCBrZWVwcyBpdHMgY2hpbGRyZW4gc29ydGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTb3J0ZWRUZXN0Tm9kZSBleHRlbmRzIFRlc3ROb2RlIHsKLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCXB1YmxpYyBTb3J0ZWRUZXN0Tm9kZShUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcih0ZXN0TW9kZWwpOwotCQl9Ci0JCXB1YmxpYyBTb3J0ZWRUZXN0Tm9kZShUZXN0Tm9kZSBwYXJlbnQsIFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKHBhcmVudCwgdGVzdE1vZGVsKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQkvKiogdGhlIGxpc3Qgc2hvdWxkIGJlIHNvcnRlZCAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZENoaWxkcmVuTW9kZWwoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHRoaXMuYnVpbGREaXNwbGF5U3RyaW5nQWRhcHRlcih0ZXN0TW9kZWwpKTsKLQkJfQotCQkvKiogdGhlIGRpc3BsYXkgc3RyaW5nIChuYW1lKSBvZiBlYWNoIG5vZGUgY2FuIGNoYW5nZSAqLwotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkRGlzcGxheVN0cmluZ0FkYXB0ZXIoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHRoaXMuYnVpbGROb2RlQWRhcHRlcih0ZXN0TW9kZWwpLCBESVNQTEFZX1NUUklOR19QUk9QRVJUWSk7Ci0JCX0KLQkJLyoqIGNoaWxkcmVuIGFyZSBhbHNvIHNvcnRlZCBub2RlcyAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFRlc3ROb2RlIGJ1aWxkQ2hpbGROb2RlKFRlc3RNb2RlbCBjaGlsZE5vZGUpIHsKLQkJCXJldHVybiBuZXcgU29ydGVkVGVzdE5vZGUodGhpcywgY2hpbGROb2RlKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGxlYXZlcyBpdHMgY2hpbGRyZW4gdW5zb3J0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFVuc29ydGVkVGVzdE5vZGUgZXh0ZW5kcyBUZXN0Tm9kZSB7Ci0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQlwdWJsaWMgVW5zb3J0ZWRUZXN0Tm9kZShUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcih0ZXN0TW9kZWwpOwotCQl9Ci0JCXB1YmxpYyBVbnNvcnRlZFRlc3ROb2RlKFRlc3ROb2RlIHBhcmVudCwgVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIocGFyZW50LCB0ZXN0TW9kZWwpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCS8qKiB0aGUgbGlzdCBzaG91bGQgTk9UIGJlIHNvcnRlZCAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZENoaWxkcmVuTW9kZWwoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGROb2RlQWRhcHRlcih0ZXN0TW9kZWwpOwotCQl9Ci0JCS8qKiBjaGlsZHJlbiBhcmUgYWxzbyB1bnNvcnRlZCBub2RlcyAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFRlc3ROb2RlIGJ1aWxkQ2hpbGROb2RlKFRlc3RNb2RlbCBjaGlsZE5vZGUpIHsKLQkJCXJldHVybiBuZXcgVW5zb3J0ZWRUZXN0Tm9kZSh0aGlzLCBjaGlsZE5vZGUpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIHRoYXQgbGVhdmVzIGl0cyBjaGlsZHJlbiB1bnNvcnRlZAotCSAqIGFuZCBoYXMgYSBzcGVjaWFsIHNldCBvZiBjaGlsZHJlbiBmb3IgIm5vZGUgMyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNwZWNpYWxUZXN0Tm9kZSBleHRlbmRzIFVuc29ydGVkVGVzdE5vZGUgewotCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkJcHVibGljIFNwZWNpYWxUZXN0Tm9kZShUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcih0ZXN0TW9kZWwpOwotCQl9Ci0JCXB1YmxpYyBTcGVjaWFsVGVzdE5vZGUoVGVzdE5vZGUgcGFyZW50LCBUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlc3RNb2RlbCk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkJLyoqIHJldHVybiBhIGRpZmZlcmVudCBsaXN0IG9mIGNoaWxkcmVuIGZvciAibm9kZSAzIiAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZENoaWxkcmVuTW9kZWwoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJaWYgKHRlc3RNb2RlbC5nZXROYW1lKCkuZXF1YWxzKCJub2RlIDMiKSkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkU3BlY2lhbENoaWxkcmVuTW9kZWwodGVzdE1vZGVsKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5idWlsZENoaWxkcmVuTW9kZWwodGVzdE1vZGVsKTsKLQkJfQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkU3BlY2lhbENoaWxkcmVuTW9kZWwoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD5bXSBjaGlsZHJlbiA9IG5ldyBOYW1lVGVzdE5vZGVbMV07Ci0JCQljaGlsZHJlblswXSA9IG5ldyBOYW1lVGVzdE5vZGUodGhpcyk7Ci0JCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PihBcnJheXMuYXNMaXN0KGNoaWxkcmVuKSk7Ci0JCX0KLQkJLyoqIGNoaWxkcmVuIGFyZSBhbHNvIHNwZWNpYWwgbm9kZXMgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBUZXN0Tm9kZSBidWlsZENoaWxkTm9kZShUZXN0TW9kZWwgY2hpbGROb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IFNwZWNpYWxUZXN0Tm9kZSh0aGlzLCBjaGlsZE5vZGUpOwotCQl9Ci0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmFtZVRlc3ROb2RlIGV4dGVuZHMgQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0PiB7Ci0JCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQkJcHJpdmF0ZSBmaW5hbCBTcGVjaWFsVGVzdE5vZGUgc3BlY2lhbE5vZGU7CQkvLyBwYXJlbnQgbm9kZQotCQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbmFtZUxpc3RlbmVyOwotCQlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBjaGlsZHJlbk1vZGVsOwotCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCQlwdWJsaWMgTmFtZVRlc3ROb2RlKFNwZWNpYWxUZXN0Tm9kZSBzcGVjaWFsTm9kZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubmFtZUxpc3RlbmVyID0gdGhpcy5idWlsZE5hbWVMaXN0ZW5lcigpOwotCQkJdGhpcy5zcGVjaWFsTm9kZSA9IHNwZWNpYWxOb2RlOwotCQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGROYW1lQWRhcHRlcigpOwotCQkJdGhpcy5jaGlsZHJlbk1vZGVsID0gbmV3IE51bGxMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4oKTsKLQkJfQotCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE5hbWVMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJCU5hbWVUZXN0Tm9kZS50aGlzLm5hbWVDaGFuZ2VkKGUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPihUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSwgdGhpcy5nZXRUZXN0TW9kZWwoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHVibGljIFRlc3RNb2RlbCBnZXRUZXN0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zcGVjaWFsTm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogVHJlZU5vZGVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKChTdHJpbmcpIHZhbHVlKTsKLQkJfQotCQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4gcGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMuc3BlY2lhbE5vZGU7Ci0JCX0KLQkJcHVibGljIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBjaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbDsKLQkJfQotCi0JCS8vICoqKioqKioqKiogQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZSgpIHsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubmFtZUxpc3RlbmVyKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWUoKSB7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm5hbWVMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCQlwcm90ZWN0ZWQgdm9pZCBuYW1lQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCS8vIHdlIG5lZWQgdG8gbm90aWZ5IGxpc3RlbmVycyB0aGF0IG91ciAidmFsdWUiIGhhcyBjaGFuZ2VkCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIGUuZ2V0T2xkVmFsdWUoKSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkVHJlZU1vZGVsKFRlc3ROb2RlIHJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmVlTW9kZWwobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4ocm9vdCkpOwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkVHJlZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gcm9vdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyZWVNb2RlbEFkYXB0ZXI8T2JqZWN0Pihyb290SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRDaGlsZHJlbkxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcl8oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGROb2RlU3RhdGVMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZE5vZGVTdGF0ZUxpc3RlbmVyXygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVWYWx1ZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTm9kZVZhbHVlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUm9vdExpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkUm9vdExpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCi0KLQkvKioKLQkgKiBsaXN0ZW5lciB0aGF0IHdpbGwgYmxvdyB1cCB3aXRoIGFueSBldmVudDsKLQkgKiBvdmVycmlkZSBhbmQgaW1wbGVtZW50IGV4cGVjdGVkIGV2ZW50IG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgY2xhc3MgVGVzdFRyZWVNb2RlbExpc3RlbmVyIGltcGxlbWVudHMgVHJlZU1vZGVsTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNJbnNlcnRlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZVN0cnVjdHVyZUNoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTJjNWIyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuVGV4dEZpZWxkOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRyZWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVTZWxlY3Rpb25FdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0VHJlZVNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZVBhdGg7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlU2VsZWN0aW9uTW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVudW1lcmF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZU5vZGVWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXJUZXN0cy5Tb3J0ZWRUZXN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyVGVzdHMuVGVzdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXJUZXN0cy5UZXN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyVGVzdHMuVW5zb3J0ZWRUZXN0Tm9kZTsKLQotLyoqCi0gKiBhbiBleGFtcGxlIFVJIGZvciB0ZXN0aW5nIHRoZSBUcmVlTW9kZWxBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlTW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCS8vIGhvbGQgdGhlIHRyZWUgc28gd2UgY2FuIHJlc3RvcmUgaXRzIGV4cGFuc2lvbiBzdGF0ZQotCXByaXZhdGUgSlRyZWUgdHJlZTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiByb290Tm9kZUhvbGRlcjsKLQlwcml2YXRlIGJvb2xlYW4gc29ydGVkOwotCXByaXZhdGUgVHJlZU1vZGVsIHRyZWVNb2RlbDsKLQlwcml2YXRlIFRyZWVTZWxlY3Rpb25Nb2RlbCB0cmVlU2VsZWN0aW9uTW9kZWw7Ci0JcHJpdmF0ZSBUZXh0RmllbGQgbmFtZVRleHRGaWVsZDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgVHJlZU1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnJvb3ROb2RlSG9sZGVyID0gdGhpcy5idWlsZFJvb3ROb2RlSG9sZGVyKCk7Ci0JCXRoaXMuc29ydGVkID0gdGhpcy5yb290Tm9kZUhvbGRlci5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU29ydGVkVGVzdE5vZGU7Ci0JCXRoaXMudHJlZU1vZGVsID0gdGhpcy5idWlsZFRyZWVNb2RlbCgpOwotCQl0aGlzLnRyZWVTZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYnVpbGRUcmVlU2VsZWN0aW9uTW9kZWwoKTsKLQkJdGhpcy5uYW1lVGV4dEZpZWxkID0gbmV3IFRleHRGaWVsZCgpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZFJvb3ROb2RlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4odGhpcy5idWlsZFNvcnRlZFJvb3ROb2RlKCkpOwotCX0KLQotCXByaXZhdGUgVGVzdE5vZGUgYnVpbGRTb3J0ZWRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRUZXN0Tm9kZSh0aGlzLmJ1aWxkUm9vdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIGJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIG5ldyBVbnNvcnRlZFRlc3ROb2RlKHRoaXMuYnVpbGRSb290KCkpOwotCX0KLQotCXByaXZhdGUgVGVzdE1vZGVsIGJ1aWxkUm9vdCgpIHsKLQkJVGVzdE1vZGVsIHJvb3QgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0KLQkJVGVzdE1vZGVsIG5vZGVfMSA9IHJvb3QuYWRkQ2hpbGQoIm5vZGUgMSIpOwotCQkvKk5vZGUgbm9kZV8xXzEgPSAqL25vZGVfMS5hZGRDaGlsZCgibm9kZSAxLjEiKTsKLQotCQlUZXN0TW9kZWwgbm9kZV8yID0gcm9vdC5hZGRDaGlsZCgibm9kZSAyIik7Ci0JCS8qTm9kZSBub2RlXzJfMSA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMSIpOwotCQlUZXN0TW9kZWwgbm9kZV8yXzIgPSBub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4yIik7Ci0JCS8qTm9kZSBub2RlXzJfMl8xID0gKi9ub2RlXzJfMi5hZGRDaGlsZCgibm9kZSAyLjIuMSIpOwotCQkvKk5vZGUgbm9kZV8yXzJfMiA9ICovbm9kZV8yXzIuYWRkQ2hpbGQoIm5vZGUgMi4yLjIiKTsKLQkJLypOb2RlIG5vZGVfMl8zID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4zIik7Ci0JCS8qTm9kZSBub2RlXzJfNCA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuNCIpOwotCQkvKk5vZGUgbm9kZV8yXzUgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjUiKTsKLQotCQlUZXN0TW9kZWwgbm9kZV8zID0gcm9vdC5hZGRDaGlsZCgibm9kZSAzIik7Ci0JCVRlc3RNb2RlbCBub2RlXzNfMSA9IG5vZGVfMy5hZGRDaGlsZCgibm9kZSAzLjEiKTsKLQkJVGVzdE1vZGVsIG5vZGVfM18xXzEgPSBub2RlXzNfMS5hZGRDaGlsZCgibm9kZSAzLjEuMSIpOwotCQkvKk5vZGUgbm9kZV8zXzFfMV8xID0gKi9ub2RlXzNfMV8xLmFkZENoaWxkKCJub2RlIDMuMS4xLjEiKTsKLQotCQkvKk5vZGUgbm9kZV80ID0gKi9yb290LmFkZENoaWxkKCJub2RlIDQiKTsKLQotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUcmVlTW9kZWxBZGFwdGVyPE9iamVjdD4odGhpcy5yb290Tm9kZUhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlU2VsZWN0aW9uTW9kZWwgYnVpbGRUcmVlU2VsZWN0aW9uTW9kZWwoKSB7Ci0JCVRyZWVTZWxlY3Rpb25Nb2RlbCB0c20gPSBuZXcgRGVmYXVsdFRyZWVTZWxlY3Rpb25Nb2RlbCgpOwotCQl0c20uYWRkVHJlZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRUcmVlU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXRzbS5zZXRTZWxlY3Rpb25Nb2RlKFRyZWVTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfVFJFRV9TRUxFQ1RJT04pOwotCQlyZXR1cm4gdHNtOwotCX0KLQotCXByaXZhdGUgVHJlZVNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVHJlZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyZWVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChUcmVlU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy50cmVlU2VsZWN0aW9uQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHRyZWVTZWxlY3Rpb25DaGFuZ2VkKFRyZWVTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJaWYgKHNlbGVjdGVkVGVzdE1vZGVsICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZVRleHRGaWVsZC5zZXRUZXh0KHNlbGVjdGVkVGVzdE1vZGVsLmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRMb2NhdGlvbigzMDAsIDMwMCk7Ci0JCXdpbmRvdy5zZXRTaXplKDQwMCwgNDAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFRyZWVQYW5lKCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFRyZWVQYW5lKCkgewotCQlyZXR1cm4gbmV3IEpTY3JvbGxQYW5lKHRoaXMuYnVpbGRUcmVlKCkpOwotCX0KLQotCXByaXZhdGUgSlRyZWUgYnVpbGRUcmVlKCkgewotCQl0aGlzLnRyZWUgPSBuZXcgSlRyZWUodGhpcy50cmVlTW9kZWwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1RleHQoT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGV4cGFuZGVkLCBib29sZWFuIGxlYWYsIGludCByb3csIGJvb2xlYW4gaGFzRm9jdXMpIHsKLQkJCQlyZXR1cm4gKChEaXNwbGF5YWJsZSkgdmFsdWUpLmRpc3BsYXlTdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy50cmVlLnNldFNlbGVjdGlvbk1vZGVsKHRoaXMudHJlZVNlbGVjdGlvbk1vZGVsKTsKLQkJdGhpcy50cmVlLnNldFJvb3RWaXNpYmxlKHRydWUpOwotCQl0aGlzLnRyZWUuc2V0U2hvd3NSb290SGFuZGxlcyh0cnVlKTsKLQkJdGhpcy50cmVlLnNldFJvd0hlaWdodCgyMCk7Ci0JCXRoaXMudHJlZS5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJcmV0dXJuIHRoaXMudHJlZTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMCwgMSkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRSZW5hbWVOb2RlUGFuZWwoKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZE1pc2NQYW5lbCgpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZEFkZFJlbmFtZU5vZGVQYW5lbCgpIHsKLQkJSlBhbmVsIGFkZFJlbmFtZU5vZGVQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJYWRkUmVuYW1lTm9kZVBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkQnV0dG9uKCksIEJvcmRlckxheW91dC5XRVNUKTsKLQkJYWRkUmVuYW1lTm9kZVBhbmVsLmFkZCh0aGlzLm5hbWVUZXh0RmllbGQsIEJvcmRlckxheW91dC5DRU5URVIpOwotCQlhZGRSZW5hbWVOb2RlUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW5hbWVCdXR0b24oKSwgQm9yZGVyTGF5b3V0LkVBU1QpOwotCQlyZXR1cm4gYWRkUmVuYW1lTm9kZVBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWlzY1BhbmVsKCkgewotCQlKUGFuZWwgbWlzY1BhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCW1pc2NQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyQ2hpbGRyZW5CdXR0b24oKSk7Ci0JCW1pc2NQYW5lbC5hZGQodGhpcy5idWlsZFJlbW92ZUJ1dHRvbigpKTsKLQkJbWlzY1BhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXRCdXR0b24oKSk7Ci0JCXJldHVybiBtaXNjUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZVRleHRGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQlwcml2YXRlIFRlc3ROb2RlIHNlbGVjdGVkTm9kZSgpIHsKLQkJaWYgKHRoaXMudHJlZVNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0aW9uRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChUZXN0Tm9kZSkgdGhpcy50cmVlU2VsZWN0aW9uTW9kZWwuZ2V0U2VsZWN0aW9uUGF0aCgpLmdldExhc3RQYXRoQ29tcG9uZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgc2VsZWN0ZWRUZXN0TW9kZWwoKSB7Ci0JCWlmICh0aGlzLnRyZWVTZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGlvbkVtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkTm9kZSgpLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSByb290Tm9kZSgpIHsKLQkJcmV0dXJuIChUZXN0Tm9kZSkgdGhpcy50cmVlTW9kZWwuZ2V0Um9vdCgpOwotCX0KLQotCXByaXZhdGUgVGVzdE1vZGVsIHJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3ROb2RlKCkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248VHJlZVBhdGg+IGV4cGFuZGVkUGF0aHMoKSB7Ci0JCUVudW1lcmF0aW9uPFRyZWVQYXRoPiBzdHJlYW0gPSB0aGlzLnRyZWUuZ2V0RXhwYW5kZWREZXNjZW5kYW50cyhuZXcgVHJlZVBhdGgodGhpcy5yb290Tm9kZSgpKSk7Ci0JCWlmIChzdHJlYW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdChuZXcgRW51bWVyYXRpb25JdGVyYXRvcjxUcmVlUGF0aD4oc3RyZWFtKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkTm9kZShUZXN0Tm9kZSBzZWxlY3RlZE5vZGUpIHsKLQkJdGhpcy50cmVlU2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uUGF0aChuZXcgVHJlZVBhdGgoc2VsZWN0ZWROb2RlLnBhdGgoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRQYXRocyhDb2xsZWN0aW9uPFRyZWVQYXRoPiBwYXRocykgewotCQlmb3IgKFRyZWVQYXRoIHBhdGggOiBwYXRocykgewotCQkJdGhpcy50cmVlLmV4cGFuZFBhdGgocGF0aCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGFkZCAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQWRkQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZEFkZEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZEFkZEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiYWRkIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZE5vZGUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JLyoqCi0JICogYWRkaW5nIGNhdXNlcyB0aGUgdHJlZSB0byBiZSBzb3J0ZWQgYW5kIG5vZGVzIHRvIGJlCi0JICogcmVtb3ZlZCBhbmQgcmUtYWRkZWQ7IHNvIHdlIGhhdmUgdG8gZmlkZGxlIHdpdGggdGhlIGV4cGFuc2lvbiBzdGF0ZQotCSAqLwotCXZvaWQgYWRkTm9kZSgpIHsKLQkJVGVzdE1vZGVsIHNlbGVjdGVkVGVzdE1vZGVsID0gdGhpcy5zZWxlY3RlZFRlc3RNb2RlbCgpOwotCQlpZiAoc2VsZWN0ZWRUZXN0TW9kZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWUoKTsKLQkJCS8vIHNhdmUgdGhlIGV4cGFuc2lvbiBzdGF0ZSBhbmQgcmVzdG9yZSBpdCBhZnRlciB0aGUgYWRkCi0JCQlDb2xsZWN0aW9uPFRyZWVQYXRoPiBwYXRocyA9IHRoaXMuZXhwYW5kZWRQYXRocygpOwotCi0JCQlzZWxlY3RlZFRlc3RNb2RlbC5hZGRDaGlsZChuYW1lKTsKLQotCQkJdGhpcy5leHBhbmRQYXRocyhwYXRocyk7Ci0JCQl0aGlzLnNldFNlbGVjdGVkTm9kZSh0aGlzLnNlbGVjdGVkTm9kZSgpLmNoaWxkTmFtZWQobmFtZSkpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbW92ZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW1vdmVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW1vdmVBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbW92ZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW1vdmVOb2RlKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIHdlIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBub2RlIHRvIHNlbGVjdCBhZnRlcgotCSAqIHRoZSBzZWxlY3RlZCBub2RlIGlzIGRlbGV0ZWQKLQkgKi8KLQl2b2lkIHJlbW92ZU5vZGUoKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJLy8gZG8gbm90IGFsbG93IHRoZSByb290IHRvIGJlIHJlbW92ZWQKLQkJaWYgKChzZWxlY3RlZFRlc3RNb2RlbCAhPSBudWxsKSAmJiAoc2VsZWN0ZWRUZXN0TW9kZWwgIT0gdGhpcy5yb290KCkpKSB7Ci0JCQkvLyBzYXZlIHRoZSBwYXJlbnQgYW5kIGluZGV4LCBzbyB3ZSBjYW4gc2VsZWN0IGFub3RoZXIsIG5lYXJieSwgbm9kZQotCQkJLy8gb25jZSB0aGUgc2VsZWN0ZWQgbm9kZSBpcyByZW1vdmVkCi0JCQlUZXN0Tm9kZSBwYXJlbnROb2RlID0gKFRlc3ROb2RlKSB0aGlzLnNlbGVjdGVkTm9kZSgpLnBhcmVudCgpOwotCQkJaW50IGNoaWxkSW5kZXggPSBwYXJlbnROb2RlLmluZGV4T2ZDaGlsZCh0aGlzLnNlbGVjdGVkTm9kZSgpKTsKLQotCQkJc2VsZWN0ZWRUZXN0TW9kZWwuZ2V0UGFyZW50KCkucmVtb3ZlQ2hpbGQoc2VsZWN0ZWRUZXN0TW9kZWwpOwotCi0JCQlpbnQgY2hpbGRyZW5TaXplID0gcGFyZW50Tm9kZS5jaGlsZHJlblNpemUoKTsKLQkJCWlmIChjaGlsZEluZGV4IDwgY2hpbGRyZW5TaXplKSB7Ci0JCQkJLy8gc2VsZWN0IHRoZSBjaGlsZCB0aGF0IG1vdmVkIHVwIGFuZCByZXBsYWNlZCB0aGUganVzdC1kZWxldGVkIGNoaWxkCi0JCQkJdGhpcy5zZXRTZWxlY3RlZE5vZGUoKFRlc3ROb2RlKSBwYXJlbnROb2RlLmNoaWxkKGNoaWxkSW5kZXgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNoaWxkcmVuU2l6ZSA9PSAwKSB7Ci0JCQkJCS8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGNoaWxkcmVuLCBzZWxlY3QgdGhlIHBhcmVudAotCQkJCQl0aGlzLnNldFNlbGVjdGVkTm9kZShwYXJlbnROb2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBpZiB0aGUgY2hpbGQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdCB3YXMgZGVsZXRlZCwgc2VsZWN0IHRoZSBuZXh0IGNoaWxkIHVwCi0JCQkJCXRoaXMuc2V0U2VsZWN0ZWROb2RlKChUZXN0Tm9kZSkgcGFyZW50Tm9kZS5jaGlsZChjaGlsZEluZGV4IC0gMSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogcmVuYW1lICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW5hbWVCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVuYW1lQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVuYW1lQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW5hbWUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVuYW1lTm9kZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiByZW5hbWluZyBjYXVzZXMgdGhlIHRyZWUgdG8gYmUgc29ydGVkIGFuZCBub2RlcyB0byBiZQotCSAqIHJlbW92ZWQgYW5kIHJlLWFkZGVkOyBzbyB3ZSBoYXZlIHRvIGZpZGRsZSB3aXRoIHRoZSBleHBhbnNpb24gc3RhdGUKLQkgKi8KLQl2b2lkIHJlbmFtZU5vZGUoKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJaWYgKHNlbGVjdGVkVGVzdE1vZGVsICE9IG51bGwpIHsKLQkJCS8vIHNhdmUgdGhlIG5vZGUgYW5kIHJlLXNlbGVjdCBpdCBhZnRlciB0aGUgcmVuYW1lCi0JCQlUZXN0Tm9kZSBzZWxlY3RlZE5vZGUgPSB0aGlzLnNlbGVjdGVkTm9kZSgpOwotCQkJLy8gc2F2ZSB0aGUgZXhwYW5zaW9uIHN0YXRlIGFuZCByZXN0b3JlIGl0IGFmdGVyIHRoZSByZW5hbWUKLQkJCUNvbGxlY3Rpb248VHJlZVBhdGg+IHBhdGhzID0gdGhpcy5leHBhbmRlZFBhdGhzKCk7Ci0KLQkJCXNlbGVjdGVkVGVzdE1vZGVsLnNldE5hbWUodGhpcy5nZXROYW1lKCkpOwotCi0JCQl0aGlzLmV4cGFuZFBhdGhzKHBhdGhzKTsKLQkJCXRoaXMuc2V0U2VsZWN0ZWROb2RlKHNlbGVjdGVkTm9kZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGNsZWFyIGNoaWxkcmVuICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhckNoaWxkcmVuQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyQ2hpbGRyZW5BY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhckNoaWxkcmVuQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBjaGlsZHJlbiIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhckNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIG5vdGhpbmcgc3BlY2lhbCwgd2UganVzdCB3YW50IHRvIHRlc3QgI2ZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTdHJpbmcpCi0JICovCi0Jdm9pZCBjbGVhckNoaWxkcmVuKCkgewotCQlUZXN0TW9kZWwgc2VsZWN0ZWRUZXN0TW9kZWwgPSB0aGlzLnNlbGVjdGVkVGVzdE1vZGVsKCk7Ci0JCWlmIChzZWxlY3RlZFRlc3RNb2RlbCAhPSBudWxsKSB7Ci0JCQlzZWxlY3RlZFRlc3RNb2RlbC5jbGVhckNoaWxkcmVuKCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlc2V0ICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXNldEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc2V0QWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXNldCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IHRoZSBhZGFwdGVyJ3Mgcm9vdCBub2RlIGhvbGRlcjsKLQkgKiB0b2dnbGUgYmV0d2VlbiBzb3J0ZWQgYW5kIHVuc29ydGVkIGxpc3RzCi0JICovCi0Jdm9pZCByZXNldCgpIHsKLQkJdGhpcy5zb3J0ZWQgPSAhIHRoaXMuc29ydGVkOwotCQlpZiAodGhpcy5zb3J0ZWQpIHsKLQkJCXRoaXMucm9vdE5vZGVIb2xkZXIuc2V0VmFsdWUodGhpcy5idWlsZFNvcnRlZFJvb3ROb2RlKCkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5yb290Tm9kZUhvbGRlci5zZXRWYWx1ZSh0aGlzLmJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpKTsKLQkJfQotCQl0aGlzLnRyZWUuZXhwYW5kUGF0aChuZXcgVHJlZVBhdGgodGhpcy5yb290Tm9kZSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL25vZGUvQWJzdHJhY3ROb2RlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTQxZDY4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5BYnN0cmFjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLm5vZGUuUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdE5vZGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFRlc3RXb3JrYmVuY2hNb2RlbCByb290OwotCi0JcHVibGljIEFic3RyYWN0Tm9kZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMucm9vdCA9IHRoaXMuYnVpbGRSb290KCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0V29ya2JlbmNoTW9kZWwgYnVpbGRSb290KCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgciA9IG5ldyBSb290VGVzdFdvcmtiZW5jaE1vZGVsKCJyb290Iik7Ci0JCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZTEgPSByLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZTFfMSA9IG5vZGUxLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEuMSIpOwotCQkJCQlub2RlMV8xLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEuMS4xIik7Ci0JCQkJCW5vZGUxXzEuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMS4xLjIiKTsKLQkJCQkJbm9kZTFfMS5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAxLjEuMyIpOwotCQkJCW5vZGUxLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEuMiIpOwotCQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUyID0gci5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAyIik7Ci0JCQkJbm9kZTIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMi4xIik7Ci0JCQkJbm9kZTIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMi4yIik7Ci0JCQlyLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDMiKTsKLQkJCXIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgNCIpOwotCi0JCS8vIG1hcmsgdGhlIGVudGlyZSB0cmVlIGNsZWFuCi0JCXIubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCXJldHVybiByOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGVzdFdvcmtiZW5jaE1vZGVsKCkgewotCQkvLyBtYWtlIHN1cmUgb3VyIHRlc3QgY2xhc3Mgd29ya3MgT0suLi4KLQkJYXNzZXJ0TnVsbCh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMSIpLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDEiKS5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAyIikuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMiIpLmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydE51bGwodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDIuMSIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMSIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAyIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDIuMSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAyLjEiKS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDIuMSIpLmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIikuaXNDbGVhbkJyYW5jaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyZW50QW5kQ2hpbGRyZW4oKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJYXNzZXJ0RXF1YWxzKCJub2RlIDEuMS4zIiwgbm9kZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5jaGlsZHJlbigpKSk7Ci0KLQkJbm9kZSA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydEVxdWFscygibm9kZSAxLjEiLCBub2RlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShub2RlLmNoaWxkcmVuKCkpKTsKLQotCQlub2RlID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJub2RlIDEiLCBub2RlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShub2RlLmNoaWxkcmVuKCkpKTsKLQotCQlub2RlID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJyb290Iiwgbm9kZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5jaGlsZHJlbigpKSk7Ci0KLQkJbm9kZSA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydE51bGwobm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5KCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0U2l6ZSg0Mik7Ci0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5KCkpOwotCi0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eVVuY2hhbmdlZEF0dHJpYnV0ZSgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldFNpemUoNDIpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eSgpKTsKLQotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbigpKTsKLQotCQl0aGlzLnJvb3QubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCS8vIHNldCBzaXplIHRvIHNhbWUgbnVtYmVyIC0gc2hvdWxkIHN0YXkgY2xlYW4KLQkJbm9kZS5zZXRTaXplKDQyKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5QnJhbmNoKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0U2l6ZSg0Mik7Ci0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5QnJhbmNoKCkpOwotCi0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0RpcnR5QnJhbmNoKCkpOwotCi0JCXBhcmVudC5zZXRTaXplKDc3KTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQotCQlub2RlLm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eUJyYW5jaENsZWFuQ2hpbGREaXJ0eVBhcmVudCgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldFNpemUoNDIpOwotCi0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlwYXJlbnQuc2V0U2l6ZSg3Nyk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJLy8gbm93LCBjbGVhbiB0aGUgY2hpbGQsIGJ1dCBsZWF2ZSB0aGUgcGFyZW50IGRpcnR5Ci0JCW5vZGUubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5QnJhbmNoQ2xlYW5DaGlsZERpcnR5Q2hpbGQoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlMSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4xIik7Ci0JCW5vZGUxLnNldFNpemUoNDEpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZTIgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMiIpOwotCQlub2RlMi5zZXRTaXplKDQyKTsKLQotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZTEuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJLy8gbm93LCBjbGVhbiB0aGUgZmlyc3QgY2hpbGQsIGJ1dCBsZWF2ZSB0aGUgc2Vjb25kIGNoaWxkIGRpcnR5Ci0JCW5vZGUxLm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eUJyYW5jaEZvcmNlZCgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQotCQlhc3NlcnRUcnVlKG5vZGUuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW5CcmFuY2goKSk7Ci0KLQkJdGhpcy5yb290Lm1hcmtFbnRpcmVCcmFuY2hEaXJ0eSgpOwotCi0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eUJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNEaXJ0eUJyYW5jaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHlUcmFuc2llbnRBdHRyaWJ1dGUoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXROYW1lKCJCT0dVUyIpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eSgpKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJdGhpcy5yb290Lm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydFRydWUodGhpcy5yb290LnByb2JsZW1zU2l6ZSgpID09IDApOwotCQlhc3NlcnRUcnVlKG5vZGUuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5wcm9ibGVtc1NpemUoKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKG5vZGUucHJvYmxlbXNTaXplKCkgPiAwKTsKLQotCQkvLyBzaW5jZSBwcm9ibGVtcyBhcmUgdHJhbnNpZW50LCBldmVyeXRoaW5nIHNob3VsZCBzdGlsbCBiZSBjbGVhbgotCQlhc3NlcnRUcnVlKG5vZGUuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW5CcmFuY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb2JsZW1zKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0TmFtZSgiQk9HVVMiKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydFRydWUobm9kZS5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJUHJvYmxlbSBwcm9ibGVtMSA9IG5vZGUucHJvYmxlbXMoKS5uZXh0KCk7Ci0KLQkJLy8gbm93IGNyZWF0ZSBhbm90aGVyIHByb2JsZW0gdGhhdCBzaG91bGQgcmVtb3ZlIHRoZSBvbGQgcHJvYmxlbQotCQlub2RlLnNldE5hbWUoIlNUSUxMIEJPR1VTIik7Ci0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygwLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKG5vZGUuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCVByb2JsZW0gcHJvYmxlbTIgPSBub2RlLnByb2JsZW1zKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShwcm9ibGVtMSA9PSBwcm9ibGVtMik7Ci0JCXByb2JsZW0xID0gcHJvYmxlbTI7Ci0KLQkJLy8gbm93IGNyZWF0ZSBhbm90aGVyIHByb2JsZW0gdGhhdCBzaG91bGQgcmVwbGFjZSB0aGUgb2xkIHByb2JsZW0KLQkJbm9kZS5zZXROYW1lKCJTVElMTCBCT0dVUyIpOwotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlwcm9ibGVtMiA9IG5vZGUucHJvYmxlbXMoKS5uZXh0KCk7Ci0JCS8vIHRoZSBzYW1lIHByb2JsZW0gc2hvdWxkIGJlIHRoZXJlCi0JCWFzc2VydFRydWUocHJvYmxlbTEuZXF1YWxzKHByb2JsZW0yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJyYW5jaFByb2JsZW1zKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0TmFtZSgiQk9HVVMiKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCXBhcmVudC5zZXROYW1lKCJCT0dVUyBUT08iKTsKLQkJdGhpcy5yb290LnNldE5hbWUoIkJPR1VTIFRPTyBUT08iKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMucm9vdC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0KLQkJbm9kZS5zZXROYW1lKCJva2llLWRva2llIik7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5vZGUuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckFsbEJyYW5jaFByb2JsZW1zKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0TmFtZSgiQk9HVVMiKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCXBhcmVudC5zZXROYW1lKCJCT0dVUyBUT08iKTsKLQkJdGhpcy5yb290LnNldE5hbWUoIkJPR1VTIFRPTyBUT08iKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMucm9vdC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0KLQkJcGFyZW50LmNsZWFyQWxsQnJhbmNoUHJvYmxlbXMoKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5icmFuY2hQcm9ibGVtcygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZWRCcmFuY2hQcm9ibGVtcygpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldE5hbWUoIkJPR1VTIik7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlwYXJlbnQuc2V0TmFtZSgiQk9HVVMgVE9PIik7Ci0JCXRoaXMucm9vdC5zZXROYW1lKCJCT0dVUyBUT08gVE9PIik7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKG5vZGUuYnJhbmNoUHJvYmxlbXMoKSkpOwotCi0JCS8vIGNvbXBsZXRlbHkgcmVtb3ZlIGEgbm9kZSB0aGF0IGhhcyBwcm9ibGVtcyAtCi0JCS8vIHRoZSBlbnRpcmUgdHJlZSBzaG91bGQgcmVjYWxjdWxhdGUgaXRzICJicmFuY2giIHByb2JsZW1zCi0JCXBhcmVudC5yZW1vdmVUZXN0Q2hpbGQobm9kZSk7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnQoKSB7Ci0JCUxpc3Q8VGVzdFdvcmtiZW5jaE1vZGVsPiBub2RlcyA9IHRoaXMuYnVpbGRTb3J0ZWROb2RlcygpOwotCQlhc3NlcnRUcnVlKG5ldyBSYW5nZSgwLCAxKS5pbmNsdWRlcyh0aGlzLmluZGV4T2Yobm9kZXMsICJhYWEiKSkpOwotCQlhc3NlcnRUcnVlKG5ldyBSYW5nZSgwLCAxKS5pbmNsdWRlcyh0aGlzLmluZGV4T2Yobm9kZXMsICJBQUEiKSkpOwotCQlhc3NlcnRUcnVlKG5ldyBSYW5nZSgyLCAzKS5pbmNsdWRlcyh0aGlzLmluZGV4T2Yobm9kZXMsICJiYmIiKSkpOwotCQlhc3NlcnRUcnVlKG5ldyBSYW5nZSgyLCAzKS5pbmNsdWRlcyh0aGlzLmluZGV4T2Yobm9kZXMsICJCQkIiKSkpOwotCQlhc3NlcnRUcnVlKG5ldyBSYW5nZSg0LCA2KS5pbmNsdWRlcyh0aGlzLmluZGV4T2Yobm9kZXMsICJjY2MiKSkpOwotCQlhc3NlcnRUcnVlKG5ldyBSYW5nZSg0LCA2KS5pbmNsdWRlcyh0aGlzLmluZGV4T2Yobm9kZXMsICJDQ0MiKSkpOwotCQlhc3NlcnRUcnVlKG5ldyBSYW5nZSg0LCA2KS5pbmNsdWRlcyh0aGlzLmluZGV4T2Yobm9kZXMsICLvv73vv73vv70iKSkpOwotCX0KLQotCXByaXZhdGUgaW50IGluZGV4T2YoTGlzdDxUZXN0V29ya2JlbmNoTW9kZWw+IG5vZGVzLCBTdHJpbmcgbm9kZU5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IG5vZGVzLnNpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQlpZiAobm9kZXMuZ2V0KGkpLmdldE5hbWUoKS5lcXVhbHMobm9kZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxUZXN0V29ya2JlbmNoTW9kZWw+IGJ1aWxkU29ydGVkTm9kZXMoKSB7Ci0JCUxpc3Q8VGVzdFdvcmtiZW5jaE1vZGVsPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFRlc3RXb3JrYmVuY2hNb2RlbD4oKTsKLQkJcmVzdWx0LmFkZChuZXcgUm9vdFRlc3RXb3JrYmVuY2hNb2RlbCgiQUFBIikpOwotCQlyZXN1bHQuYWRkKG5ldyBSb290VGVzdFdvcmtiZW5jaE1vZGVsKCJCQkIiKSk7Ci0JCXJlc3VsdC5hZGQobmV3IFJvb3RUZXN0V29ya2JlbmNoTW9kZWwoIkNDQyIpKTsKLQkJcmVzdWx0LmFkZChuZXcgUm9vdFRlc3RXb3JrYmVuY2hNb2RlbCgi77+977+977+9IikpOwotCQlyZXN1bHQuYWRkKG5ldyBSb290VGVzdFdvcmtiZW5jaE1vZGVsKCJjY2MiKSk7Ci0JCXJlc3VsdC5hZGQobmV3IFJvb3RUZXN0V29ya2JlbmNoTW9kZWwoImJiYiIpKTsKLQkJcmVzdWx0LmFkZChuZXcgUm9vdFRlc3RXb3JrYmVuY2hNb2RlbCgiYWFhIikpOwotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNvcnQocmVzdWx0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RXb3JrYmVuY2hNb2RlbCBleHRlbmRzIEFic3RyYWN0Tm9kZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlwcml2YXRlIGludCBzaXplOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0laRV9QUk9QRVJUWSA9ICJzaXplIjsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFRlc3RXb3JrYmVuY2hNb2RlbD4gdGVzdENoaWxkcmVuOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DSElMRFJFTl9DT0xMRUNUSU9OID0gImNoaWxkcmVuIjsKLQkKLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQlwdWJsaWMgVGVzdFdvcmtiZW5jaE1vZGVsKFRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihwYXJlbnQpOwotCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJCXRoaXMuc2l6ZSA9IDA7Ci0JCQl0aGlzLnRlc3RDaGlsZHJlbiA9IG5ldyBIYXNoQmFnPFRlc3RXb3JrYmVuY2hNb2RlbD4oKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyZW50KE5vZGUgcGFyZW50KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkKLQkJLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkKLQkJcHVibGljIGludCBnZXRTaXplKCkgewotCQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRTaXplKGludCBzaXplKSB7Ci0JCQlpbnQgb2xkID0gdGhpcy5zaXplOwotCQkJdGhpcy5zaXplID0gc2l6ZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSVpFX1BST1BFUlRZLCBvbGQsIHNpemUpOwotCQl9Ci0JCi0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0V29ya2JlbmNoTW9kZWw+IHRlc3RDaGlsZHJlbigpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxUZXN0V29ya2JlbmNoTW9kZWw+KHRoaXMudGVzdENoaWxkcmVuKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFRlc3RXb3JrYmVuY2hNb2RlbCBjdXJyZW50KSB7Ci0JCQkJCVRlc3RXb3JrYmVuY2hNb2RlbC50aGlzLnJlbW92ZVRlc3RDaGlsZChjdXJyZW50KTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXB1YmxpYyBpbnQgdGVzdENoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLnRlc3RDaGlsZHJlbi5zaXplKCk7Ci0JCX0KLQkJcHJpdmF0ZSBUZXN0V29ya2JlbmNoTW9kZWwgYWRkVGVzdENoaWxkKFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0Q2hpbGQpIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbih0ZXN0Q2hpbGQsIHRoaXMudGVzdENoaWxkcmVuLCBURVNUX0NISUxEUkVOX0NPTExFQ1RJT04pOwotCQkJcmV0dXJuIHRlc3RDaGlsZDsKLQkJfQotCQlwdWJsaWMgVGVzdFdvcmtiZW5jaE1vZGVsIGFkZFRlc3RDaGlsZE5hbWVkKFN0cmluZyBjaGlsZE5hbWUpIHsKLQkJCWlmICh0aGlzLnRlc3RDaGlsZE5hbWVkKGNoaWxkTmFtZSkgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY2hpbGROYW1lKTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLmFkZFRlc3RDaGlsZChuZXcgVGVzdFdvcmtiZW5jaE1vZGVsKHRoaXMsIGNoaWxkTmFtZSkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZVRlc3RDaGlsZChUZXN0V29ya2JlbmNoTW9kZWwgdGVzdENoaWxkKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbih0ZXN0Q2hpbGQsIHRoaXMudGVzdENoaWxkcmVuLCBURVNUX0NISUxEUkVOX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0Q2hpbGROYW1lZChTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCQlmb3IgKFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0Q2hpbGQgOiB0aGlzLnRlc3RDaGlsZHJlbikgewotCQkJCWlmICh0ZXN0Q2hpbGQuZ2V0TmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKSB7Ci0JCQkJCXJldHVybiB0ZXN0Q2hpbGQ7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0RGVzY2VuZGFudE5hbWVkKFN0cmluZyBkZXNjZW5kYW50TmFtZSkgewotCQkJZm9yIChUZXN0V29ya2JlbmNoTW9kZWwgdGVzdERlc2NlbmRhbnQgOiB0aGlzLnRlc3RDaGlsZHJlbikgewotCQkJCWlmICh0ZXN0RGVzY2VuZGFudC5nZXROYW1lKCkuZXF1YWxzKGRlc2NlbmRhbnROYW1lKSkgewotCQkJCQlyZXR1cm4gdGVzdERlc2NlbmRhbnQ7Ci0JCQkJfQotCQkJCS8vIHJlY3Vyc2UuLi4KLQkJCQl0ZXN0RGVzY2VuZGFudCA9IHRlc3REZXNjZW5kYW50LnRlc3REZXNjZW5kYW50TmFtZWQoZGVzY2VuZGFudE5hbWUpOwotCQkJCWlmICh0ZXN0RGVzY2VuZGFudCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB0ZXN0RGVzY2VuZGFudDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQotCQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuVG8oTGlzdDxOb2RlPiBjaGlsZHJlbikgewotCQkJc3VwZXIuYWRkQ2hpbGRyZW5UbyhjaGlsZHJlbik7Ci0JCQljaGlsZHJlbi5hZGRBbGwodGhpcy50ZXN0Q2hpbGRyZW4pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCQlzdXBlci5hZGRQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JCQkvLyBuYW1lcyBtdXN0IGJlIGFsbCBsb3dlcmNhc2UuLi4KLQkJCWZvciAoaW50IGkgPSB0aGlzLm5hbWUubGVuZ3RoKCk7IGktLSA+IDA7ICkgewotCQkJCWNoYXIgYyA9IHRoaXMubmFtZS5jaGFyQXQoaSk7Ci0JCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcihjKSAmJiAhIENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjKSkgewotCQkJCQljdXJyZW50UHJvYmxlbXMuYWRkKHRoaXMuYnVpbGRQcm9ibGVtKCJOQU1FX01VU1RfQkVfTE9XRVJDQVNFIiwgdGhpcy5uYW1lKSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFJvb3RUZXN0V29ya2JlbmNoTW9kZWwgZXh0ZW5kcyBUZXN0V29ya2JlbmNoTW9kZWwgewotCQlwdWJsaWMgUm9vdFRlc3RXb3JrYmVuY2hNb2RlbChTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobnVsbCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQkJcmV0dXJuIE5vZGUuTlVMTF9WQUxJREFUT1I7Ci0JCX0KLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9ub2RlL0pwdFV0aWxpdHlOb2RlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9KcHRVdGlsaXR5Tm9kZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZjY4MmQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9ub2RlL0pwdFV0aWxpdHlOb2RlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5Tm9kZVRlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU5vZGVUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFic3RyYWN0Tm9kZVRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlOb2RlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3Rlc3QueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjNhYjdlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotCTwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0JPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLQk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0JPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0JPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzIi8+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0JPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLQk8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8dHN0YW1wLz4KLQkJPGRlbGV0ZT4KLQkJCTxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLQkJPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotCTx0YXJnZXQgbmFtZT0ic3VpdGUiPgotCQk8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuSnB0VXRpbGl0eVRlc3RzIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiIvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLQk8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLQk8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsIHN1aXRlLCBjbGVhbnVwIj4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==